From a0a28c8eb0e03f4c0147b9c4e5f392747856a7df Mon Sep 17 00:00:00 2001 From: Taeksu Shin Date: Tue, 21 Aug 2012 18:29:23 +0900 Subject: [PATCH] Code sync --- CHANGES-1.0.txt | 217 + CHANGES-1.1.txt | 3462 + CHANGES-1.2.txt | 1261 + CHANGES-1.3.txt | 856 + CHANGES-1.4.txt | 843 + CHANGES.txt | 282 + CREDITS.txt | 49 + INSTALL.txt | 207 + IPPTOOL.txt | 117 + LICENSE.txt | 971 + Makedefs.in | 308 + Makefile | 330 + README.txt | 164 + backend/Dependencies | 107 + backend/Makefile | 296 + backend/backend-private.h | 324 + backend/dnssd.c | 1394 + backend/ieee1284.c | 491 + backend/ipp.c | 3225 + backend/ipp14.c | 1953 + backend/lpd.c | 1306 + backend/network.c | 300 + backend/parallel.c | 676 + backend/pseudo | 30 + backend/runloop.c | 539 + backend/serial.c | 1327 + backend/snmp-supplies.c | 1010 + backend/snmp.c | 1395 + backend/snmp.txt | 172 + backend/socket.c | 527 + backend/test1284.c | 84 + backend/testbackend.c | 651 + backend/testsupplies.c | 83 + backend/usb-darwin.c | 2269 + backend/usb-libusb.c | 1868 + backend/usb-unix.c | 623 + backend/usb.c | 264 + berkeley/Dependencies | 34 + berkeley/Makefile | 167 + berkeley/lpc.c | 450 + berkeley/lpq.c | 678 + berkeley/lpr.c | 417 + berkeley/lprm.c | 217 + cgi-bin/Dependencies | 84 + cgi-bin/Makefile | 382 + cgi-bin/admin.c | 4341 + cgi-bin/api-cgi.header | 34 + cgi-bin/api-cgi.shtml | 17 + cgi-bin/cgi-private.h | 35 + cgi-bin/cgi.h | 119 + cgi-bin/classes.c | 558 + cgi-bin/help-index.c | 1331 + cgi-bin/help-index.h | 87 + cgi-bin/help.c | 397 + cgi-bin/html.c | 239 + cgi-bin/ipp-var.c | 1592 + cgi-bin/jobs.c | 214 + cgi-bin/libcupscgi.exp | 42 + cgi-bin/makedocset.c | 486 + cgi-bin/multipart.dat | Bin 0 -> 50411 bytes cgi-bin/printers.c | 578 + cgi-bin/search.c | 381 + cgi-bin/template.c | 733 + cgi-bin/testcgi.c | 75 + cgi-bin/testhi.c | 113 + cgi-bin/testhi.html | 31 + cgi-bin/testtemplate.c | 103 + cgi-bin/var.c | 1311 + cgi-bin/websearch.c | 116 + conf/Makefile | 145 + conf/cupsd.conf.in | 152 + conf/mime.convs.in | 101 + conf/mime.types | 174 + conf/pam.opendirectory | 5 + conf/pam.securityserver | 7 + conf/pam.std.in | 2 + conf/snmp.conf.in | 13 + config-scripts/cups-3264.m4 | 140 + config-scripts/cups-common.m4 | 438 + config-scripts/cups-compiler.m4 | 563 + config-scripts/cups-defaults.m4 | 510 + config-scripts/cups-directories.m4 | 440 + config-scripts/cups-dnssd.m4 | 79 + config-scripts/cups-gssapi.m4 | 170 + config-scripts/cups-image.m4 | 117 + config-scripts/cups-largefile.m4 | 52 + config-scripts/cups-launchd.m4 | 43 + config-scripts/cups-ldap.m4 | 52 + config-scripts/cups-libtool.m4 | 39 + config-scripts/cups-manpages.m4 | 96 + config-scripts/cups-network.m4 | 74 + config-scripts/cups-opsys.m4 | 35 + config-scripts/cups-pam.m4 | 102 + config-scripts/cups-pdf.m4 | 113 + config-scripts/cups-poll.m4 | 22 + config-scripts/cups-scripting.m4 | 100 + config-scripts/cups-sharedlibs.m4 | 270 + config-scripts/cups-slp.m4 | 38 + config-scripts/cups-ssl.m4 | 181 + config-scripts/cups-threads.m4 | 54 + config.h.in | 762 + configure | 13098 ++ configure.in | 98 + cups-config.in | 160 + cups.manifest | 67 + cups/Dependencies | 813 + cups/Makefile | 680 + cups/adminutil.c | 2458 + cups/adminutil.h | 78 + cups/api-array.header | 34 + cups/api-array.shtml | 196 + cups/api-cups.header | 40 + cups/api-cups.shtml | 443 + cups/api-filedir.header | 36 + cups/api-filedir.shtml | 31 + cups/api-filter.header | 41 + cups/api-filter.shtml | 765 + cups/api-httpipp.header | 37 + cups/api-httpipp.shtml | 323 + cups/api-overview.header | 53 + cups/api-overview.shtml | 94 + cups/api-ppd.header | 36 + cups/api-ppd.shtml | 217 + cups/array-private.h | 51 + cups/array.c | 1326 + cups/array.h | 92 + cups/attr.c | 335 + cups/auth.c | 880 + cups/backchannel.c | 199 + cups/backend.c | 143 + cups/backend.h | 78 + cups/conflicts.c | 1214 + cups/cups-private.h | 213 + cups/cups.h | 345 + cups/custom.c | 122 + cups/debug-private.h | 117 + cups/debug.c | 658 + cups/dest.c | 2169 + cups/dir.c | 472 + cups/dir.h | 69 + cups/emit.c | 1217 + cups/encode.c | 636 + cups/file-private.h | 137 + cups/file.c | 2726 + cups/file.h | 112 + cups/getdevices.c | 283 + cups/getifaddrs.c | 266 + cups/getputfile.c | 502 + cups/globals.c | 360 + cups/http-addr.c | 705 + cups/http-addrlist.c | 677 + cups/http-private.h | 408 + cups/http-support.c | 2111 + cups/http.c | 4710 + cups/http.h | 479 + cups/ipp-private.h | 87 + cups/ipp-support.c | 831 + cups/ipp.c | 3337 + cups/ipp.h | 522 + cups/langprintf.c | 352 + cups/language-private.h | 91 + cups/language.c | 1549 + cups/language.h | 115 + cups/libcups2.def | 339 + cups/libcups2.rc | 75 + cups/libcups_s.exp | 83 + cups/localize.c | 779 + cups/mark.c | 1101 + cups/md5-private.h | 79 + cups/md5.c | 346 + cups/md5passwd.c | 142 + cups/notify.c | 202 + cups/options.c | 711 + cups/page.c | 396 + cups/ppd-cache.c | 2606 + cups/ppd-private.h | 202 + cups/ppd.c | 3296 + cups/ppd.h | 450 + cups/pwg-media.c | 851 + cups/pwg-private.h | 102 + cups/raster.h | 405 + cups/request.c | 1149 + cups/sidechannel.c | 575 + cups/sidechannel.h | 147 + cups/snmp-private.h | 145 + cups/snmp.c | 1737 + cups/snprintf.c | 362 + cups/sspi-private.h | 82 + cups/sspi.c | 1485 + cups/string-private.h | 203 + cups/string.c | 759 + cups/tempfile.c | 233 + cups/test.ppd | 262 + cups/test2.ppd | 252 + cups/testadmin.c | 120 + cups/testarray.c | 480 + cups/testconflicts.c | 138 + cups/testcups.c | 416 + cups/testfile.c | 821 + cups/testhttp.c | 600 + cups/testi18n.c | 619 + cups/testipp.c | 1005 + cups/testlang.c | 114 + cups/testoptions.c | 116 + cups/testppd.c | 1082 + cups/testpwg.c | 497 + cups/testsnmp.c | 304 + cups/thread-private.h | 98 + cups/thread.c | 336 + cups/transcode.c | 720 + cups/transcode.h | 81 + cups/usersys.c | 810 + cups/utf8demo.txt | 213 + cups/util.c | 1813 + cups/versioning.h | 85 + data/Makefile | 166 + data/classified | 6 + data/confidential | 6 + data/cups.irix | 3 + data/cups.pam | 2 + data/cups.suse | 2 + data/epson.h | 27 + data/escp.h | 34 + data/font.defs | 55 + data/hp.h | 24 + data/label.h | 28 + data/media.defs | 208 + data/pcl.h | 38 + data/psglyphs | 1051 + data/raster.defs | 94 + data/secret | 6 + data/smiley.ps | 28 + data/standard | 6 + data/testprint.in | 7 + data/topsecret | 6 + data/unclassified | 6 + data/utf-8 | 40 + debian/HOWTO_BUGREPORT.txt | 28 + debian/README.Debian | 244 + debian/README.source | 20 + debian/changelog | 5569 + debian/client.conf | 66 + debian/compat | 1 + debian/control | 386 + debian/copyright | 77 + debian/cups-bsd.config | 9 + debian/cups-bsd.install | 14 + debian/cups-bsd.postinst | 62 + debian/cups-bsd.postrm | 41 + debian/cups-bsd.preinst | 40 + debian/cups-bsd.prerm | 45 + debian/cups-bsd.templates | 12 + debian/cups-client.install | 58 + debian/cups-client.postinst | 52 + debian/cups-client.preinst | 40 + debian/cups-common.install | 5 + debian/cups-ppdc.install | 4 + debian/cups.config | 29 + debian/cups.default | 4 + debian/cups.dirs | 4 + debian/cups.doc-base | 10 + debian/cups.docs | 3 + debian/cups.examples | 2 + debian/cups.init.d | 115 + debian/cups.install | 52 + debian/cups.lintian-overrides | 10 + debian/cups.logrotate | 15 + debian/cups.pam | 3 + debian/cups.postinst | 272 + debian/cups.postrm | 55 + debian/cups.preinst | 8 + debian/cups.prerm | 41 + debian/cups.templates | 31 + debian/cups.triggers | 4 + debian/libcups2-dev.examples | 1 + debian/libcups2-dev.install | 19 + debian/libcups2-dev.preinst | 40 + debian/libcups2.examples | 1 + debian/libcups2.install | 1 + debian/libcups2.symbols | 310 + debian/libcupscgi1-dev.install | 4 + debian/libcupscgi1.install | 1 + debian/libcupscgi1.symbols | 43 + debian/libcupsdriver1-dev.install | 3 + debian/libcupsdriver1.install | 1 + debian/libcupsdriver1.symbols | 33 + debian/libcupsimage2-dev.install | 4 + debian/libcupsimage2-dev.preinst | 40 + debian/libcupsimage2.install | 1 + debian/libcupsimage2.preinst | 40 + debian/libcupsimage2.symbols | 47 + debian/libcupsmime1-dev.install | 3 + debian/libcupsmime1.install | 1 + debian/libcupsmime1.symbols | 24 + debian/libcupsppdc1-dev.install | 3 + debian/libcupsppdc1.install | 1 + debian/libcupsppdc1.symbols | 232 + debian/local/apparmor-profile | 173 + debian/local/apport-hook.py | 11 + debian/local/cups.ufw.profile | 5 + debian/local/cups.upstart | 58 + debian/patches/add-ipp-backend-of-cups-1.4.patch | 1991 + debian/patches/airprint-support.patch | 27 + debian/patches/colord-support.patch | 900 + debian/patches/confdirperms.patch | 16 + .../configure-default-browse-protocols.patch | 22 + debian/patches/cups-avahi.patch | 3193 + ...ups-deviced-allow-device-ids-with-newline.patch | 39 + .../cups-snmp-oids-device-id-hp-ricoh.patch | 28 + debian/patches/default_log_settings.patch | 17 + debian/patches/dnssd-reg-array-linear-search.patch | 12 + .../patches/do-not-broadcast-with-hostnames.patch | 24 + debian/patches/drop_unnecessary_dependencies.patch | 83 + debian/patches/install-sh-remove-bashism.patch | 15 + debian/patches/ipp-backend-cups-1.5.4-fixes.patch | 187 + .../log-debug-history-nearly-unlimited.patch | 24 + debian/patches/logfiles_adm_readable.patch | 52 + debian/patches/manpage-translations.patch | 19253 +++ debian/patches/no-conffile-timestamp.patch | 60 + debian/patches/pidfile.patch | 110 + debian/patches/ppd-poll-with-client-conf.patch | 23 + debian/patches/ppdc-dynamic-linking.patch | 68 + debian/patches/printer-filtering.patch | 144 + ...flow-only-for-printing-ps-on-a-ps-printer.patch | 13 + debian/patches/reactivate_recommended_driver.patch | 29 + ...-incoming-postscript-and-add-to-ipp-attrs.patch | 102 + debian/patches/removecvstag.patch | 15 + debian/patches/rootbackends-worldreadable.patch | 38 + debian/patches/series | 44 + debian/patches/show-compile-command-lines.patch | 12 + debian/patches/test-i18n-nonlinux.patch | 16 + debian/patches/tests-ignore-usb-crash.patch | 16 + debian/patches/tests-ignore-warnings.patch | 16 + debian/patches/tests-slow-lpstat.patch | 15 + .../ubuntu-default-error-policy-retry-job.patch | 16 + .../patches/ubuntu/ubuntu-disable-browsing.patch | 20 + debian/patches/usb-backend-busy-loop-fix.patch | 33 + ...backend-detach-usblp-earlier-crash-guards.patch | 163 + .../patches/usb-backend-further-enhancements.patch | 591 + ...b-backend-initialize-usblp-attached-state.patch | 11 + debian/po/POTFILES.in | 2 + debian/po/ca.po | 165 + debian/po/cs.po | 242 + debian/po/da.po | 244 + debian/po/de.po | 176 + debian/po/es.po | 194 + debian/po/eu.po | 164 + debian/po/fi.po | 168 + debian/po/fr.po | 168 + debian/po/gl.po | 241 + debian/po/it.po | 165 + debian/po/ja.po | 172 + debian/po/ml.po | 168 + debian/po/nb.po | 165 + debian/po/nl.po | 256 + debian/po/pl.po | 165 + debian/po/pt.po | 179 + debian/po/pt_BR.po | 253 + debian/po/ro.po | 184 + debian/po/ru.po | 251 + debian/po/sk.po | 165 + debian/po/sr.po | 163 + debian/po/sr@latin.po | 163 + debian/po/sv.po | 279 + debian/po/templates.pot | 143 + debian/po/tr.po | 185 + debian/po/vi.po | 245 + debian/presubj | 3 + debian/printer.schema | 47 + debian/rules | 190 + debian/source/format | 1 + debian/source/options | 1 + debian/watch | 3 + desktop/Makefile | 135 + desktop/cups-128.png | Bin 0 -> 4888 bytes desktop/cups-16.png | Bin 0 -> 503 bytes desktop/cups-256.png | Bin 0 -> 10147 bytes desktop/cups-32.png | Bin 0 -> 1042 bytes desktop/cups-512.png | Bin 0 -> 21029 bytes desktop/cups-64.png | Bin 0 -> 2234 bytes desktop/cups.conf | 13 + desktop/cups.desktop.in | 41 + desktop/cups.icns | Bin 0 -> 107501 bytes desktop/cups.svg | 533 + doc/Makefile | 266 + doc/cups-printable.css | 329 + doc/cups.css | 462 + doc/de/index.html.in | 107 + doc/es/index.html.in | 107 + doc/eu/index.html.in | 106 + doc/fr/index.html.in | 107 + doc/help/accounting.html | 62 + doc/help/api-array.html | 1062 + doc/help/api-cgi.html | 1126 + doc/help/api-cups.html | 2521 + doc/help/api-driver.html | 1156 + doc/help/api-filedir.html | 995 + doc/help/api-filter.html | 1625 + doc/help/api-httpipp.html | 4377 + doc/help/api-mime.html | 833 + doc/help/api-overview.html | 501 + doc/help/api-ppd.html | 2189 + doc/help/api-ppdc.html | 2197 + doc/help/api-raster.html | 1416 + doc/help/cgi.html | 86 + doc/help/glossary.html | 219 + doc/help/kerberos.html | 89 + doc/help/license.html | 1076 + doc/help/network.html | 684 + doc/help/options.html | 778 + doc/help/overview.html | 70 + doc/help/policies.html | 601 + doc/help/postscript-driver.html | 663 + doc/help/ppd-compiler.html | 1279 + doc/help/raster-driver.html | 579 + doc/help/ref-access_log.html | 140 + doc/help/ref-classes-conf.html | 566 + doc/help/ref-client-conf.html | 56 + doc/help/ref-cupsd-conf.html.in | 3202 + doc/help/ref-error_log.html | 55 + doc/help/ref-mailto-conf.html | 108 + doc/help/ref-page_log.html | 77 + doc/help/ref-ppdcfile.html | 2449 + doc/help/ref-printers-conf.html | 720 + doc/help/ref-snmp-conf.html | 146 + doc/help/ref-subscriptions-conf.html | 354 + doc/help/security.html | 172 + doc/help/sharing.html | 184 + doc/help/spec-banner.html | 156 + doc/help/spec-browsing.html | 118 + doc/help/spec-cmp.html | 1218 + doc/help/spec-command.html | 218 + doc/help/spec-design.html | 184 + doc/help/spec-ipp.html | 2879 + doc/help/spec-pdf.html | 24 + doc/help/spec-postscript.html | 148 + doc/help/spec-ppd.html | 2340 + doc/help/spec-raster.html | 720 + doc/help/spec-stp.html | 133 + doc/help/standard.html.in | 181 + doc/help/translation.html | 852 + doc/help/whatsnew.html | 61 + doc/hu/index.html.in | 113 + doc/id/index.html.in | 107 + doc/images/color-wheel.png | Bin 0 -> 13148 bytes doc/images/cups-block-diagram.png | Bin 0 -> 76386 bytes doc/images/cups-block-diagram.svg | 841 + doc/images/cups-command-chain.png | Bin 0 -> 14902 bytes doc/images/cups-command-chain.svg | 439 + doc/images/cups-icon.png | Bin 0 -> 4888 bytes doc/images/cups-postscript-chain.png | Bin 0 -> 17498 bytes doc/images/cups-postscript-chain.svg | 531 + doc/images/cups-raster-chain.png | Bin 0 -> 16916 bytes doc/images/cups-raster-chain.svg | 534 + doc/images/cups.png | Bin 0 -> 4888 bytes doc/images/cups.svg | 533 + doc/images/generic.png | Bin 0 -> 16913 bytes doc/images/left.gif | Bin 0 -> 1492 bytes doc/images/left.xcf.gz | Bin 0 -> 1194 bytes doc/images/raster-organization.png | Bin 0 -> 20974 bytes doc/images/raster-organization.svg | 189 + doc/images/raster.png | Bin 0 -> 37656 bytes doc/images/raster.svg | 386 + doc/images/right.gif | Bin 0 -> 341 bytes doc/images/sample-image.png | Bin 0 -> 3541 bytes doc/images/sel.gif | Bin 0 -> 362 bytes doc/images/smiley.jpg | Bin 0 -> 14120 bytes doc/images/unsel.gif | Bin 0 -> 127 bytes doc/images/wait.gif | Bin 0 -> 1810 bytes doc/images/webinterface.png | Bin 0 -> 150003 bytes doc/index.html.in | 107 + doc/it/index.html.in | 107 + doc/ja/index.html.in | 107 + doc/pl/index.html.in | 107 + doc/robots.txt | 31 + doc/ru/index.html.in | 103 + driver/Dependencies | 75 + driver/Makefile | 382 + driver/api-driver.header | 34 + driver/api-driver.shtml | 18 + driver/attr.c | 109 + driver/check.c | 111 + driver/cmyk.c | 1955 + driver/commandtoescpx.c | 245 + driver/commandtopclx.c | 172 + driver/dither.c | 306 + driver/driver.h | 249 + driver/image.pgm | Bin 0 -> 152380 bytes driver/image.ppm | Bin 0 -> 457020 bytes driver/libcupsdriver.exp | 30 + driver/lut.c | 202 + driver/pack.c | 307 + driver/pcl-common.c | 272 + driver/pcl-common.h | 71 + driver/rastertoescpx.c | 1931 + driver/rastertopclx.c | 1956 + driver/rgb.c | 558 + driver/srgb.c | 79 + driver/testcmyk.c | 437 + driver/testdither.c | 191 + driver/testdriver.c | 176 + driver/testrgb.c | 347 + examples/Makefile | 128 + examples/color.drv | 44 + examples/constraint.drv | 48 + examples/custom.drv | 41 + examples/grouping.drv | 36 + examples/laserjet-basic.drv | 88 + examples/laserjet-pjl.drv | 101 + examples/minimum.drv | 26 + examples/postscript.drv | 46 + examples/r300-basic.drv | 75 + examples/r300-colorman.drv | 85 + examples/r300-remote.drv | 85 + filter/Dependencies | 531 + filter/Makefile | 527 + filter/api-raster.header | 37 + filter/api-raster.shtml | 160 + filter/bannertops.c | 1094 + filter/commandtops.c | 538 + filter/common.c | 535 + filter/common.h | 78 + filter/error.c | 287 + filter/gziptoany.c | 112 + filter/image-bmp.c | 545 + filter/image-colorspace.c | 1567 + filter/image-gif.c | 696 + filter/image-jpeg.c | 322 + filter/image-photocd.c | 333 + filter/image-pix.c | 240 + filter/image-png.c | 315 + filter/image-pnm.c | 320 + filter/image-private.h | 220 + filter/image-sgi.c | 295 + filter/image-sgi.h | 86 + filter/image-sgilib.c | 890 + filter/image-sun.c | 407 + filter/image-tiff.c | 1715 + filter/image-zoom.c | 361 + filter/image.c | 813 + filter/image.h | 130 + filter/imagetops.c | 1078 + filter/imagetoraster.c | 4368 + filter/interpret.c | 1688 + filter/libcupsimage2.def | 14 + filter/libcupsimage_s.exp | 16 + filter/pdftops.c | 621 + filter/postscript-driver.header | 32 + filter/postscript-driver.shtml | 276 + filter/ppd-compiler.header | 34 + filter/ppd-compiler.shtml | 883 + filter/pstext.c | 511 + filter/pstext.h | 74 + filter/pstops.c | 3490 + filter/raster-driver.header | 32 + filter/raster-driver.shtml | 194 + filter/raster.c | 1472 + filter/rasterbench.c | 355 + filter/rastertoepson.c | 1160 + filter/rastertohp.c | 889 + filter/rastertolabel.c | 1315 + filter/rastertopwg.c | 461 + filter/spec-ppd.header | 32 + filter/spec-ppd.shtml | 1898 + filter/testimage.c | 99 + filter/testraster.c | 1084 + filter/textcommon.c | 1214 + filter/textcommon.h | 114 + filter/texttops.c | 1165 + fonts/Makefile | 118 + fonts/Monospace | 2744 + fonts/Monospace-Bold | 2354 + fonts/Monospace-BoldOblique | 2445 + fonts/Monospace-Oblique | 2706 + install-sh | 234 + locale/Dependencies | 28 + locale/Makefile | 219 + locale/checkpo.c | 413 + locale/cups.footer | 5 + locale/cups.header | 27 + locale/cups.pot | 7085 + locale/cups.strings | 1572 + locale/cups_da.po | 8692 ++ locale/cups_de.po | 8739 ++ locale/cups_es.po | 5774 + locale/cups_eu.po | 8895 ++ locale/cups_fi.po | 8710 ++ locale/cups_fr.po | 8821 ++ locale/cups_hu.po | 5835 + locale/cups_id.po | 8556 ++ locale/cups_it.po | 8926 ++ locale/cups_ja.po | 8864 ++ locale/cups_ko.po | 8650 ++ locale/cups_nl.po | 8758 ++ locale/cups_no.po | 8659 ++ locale/cups_pl.po | 8717 ++ locale/cups_pt.po | 8733 ++ locale/cups_pt_BR.po | 8742 ++ locale/cups_ru.po | 8709 ++ locale/cups_sv.po | 8673 ++ locale/cups_zh.po | 8592 ++ locale/cups_zh_TW.po | 8590 ++ locale/locale.txt | 32 + locale/po2strings.c | 294 + locale/strings2po.c | 175 + locale/translate.c | 439 + man/Makefile | 249 + man/Makefile.l10n | 209 + man/backend.man | 196 + man/cancel.man | 75 + man/classes.conf.man | 110 + man/client.conf.man.in | 55 + man/cups-config.man | 117 + man/cups-deviced.man.in | 44 + man/cups-driverd.man.in | 122 + man/cups-lpd.man.in | 124 + man/cups-polld.man | 38 + man/cups-snmp.conf.man | 73 + man/cupsaccept.man | 79 + man/cupsaddsmb.man.in | 214 + man/cupsctl.man | 107 + man/cupsd.conf.man.in | 762 + man/cupsd.man.in | 72 + man/cupsenable.man | 93 + man/cupsfilter.man | 91 + man/cupstestdsc.man | 50 + man/cupstestppd.man | 165 + man/de/Makefile | 13 + man/filter.man | 256 + man/fr/Makefile | 13 + man/ipptool.man | 130 + man/ipptoolfile.man | 523 + man/lp.man | 258 + man/lpadmin.man | 228 + man/lpc.man | 71 + man/lpinfo.man | 115 + man/lpmove.man | 66 + man/lpoptions.man.in | 135 + man/lppasswd.man | 68 + man/lpq.man | 72 + man/lpr.man | 122 + man/lprm.man | 65 + man/lpstat.man | 143 + man/mailto.conf.man | 60 + man/mantohtml.c | 720 + man/mime.convs.man | 46 + man/mime.types.man | 115 + man/notifier.man | 157 + man/po4a/cups.cfg | 40 + man/po4a/po/de.po | 10478 ++ man/po4a/po/fr.po | 8414 ++ man/ppdc.man | 80 + man/ppdcfile.man | 171 + man/ppdhtml.man | 46 + man/ppdi.man | 46 + man/ppdmerge.man | 47 + man/ppdpo.man | 52 + man/printers.conf.man | 124 + man/subscriptions.conf.man | 89 + monitor/Dependencies | 18 + monitor/Makefile | 146 + monitor/bcp.c | 292 + monitor/tbcp.c | 285 + notifier/Dependencies | 25 + notifier/Makefile | 162 + notifier/dbus.c | 595 + notifier/mailto.c | 646 + notifier/rss.c | 740 + notifier/testnotify.c | 127 + packaging/InstallationCheck | 11 + packaging/LICENSE.rtf | 434 + packaging/WELCOME.rtf | 24 + packaging/cups-desc.plist.in | 14 + packaging/cups-info.plist.in | 26 + packaging/cups.list.in | 800 + packaging/cups.spec | 658 + packaging/cups.spec.in | 389 + packaging/installer.gif | Bin 0 -> 3392 bytes packaging/installer.tif | Bin 0 -> 5538 bytes ppdc/Dependencies | 253 + ppdc/Makefile | 404 + ppdc/api-ppdc.header | 34 + ppdc/api-ppdc.shtml | 18 + ppdc/foo-fr.po | 11 + ppdc/foo.drv | 547 + ppdc/genstrings.cxx | 215 + ppdc/ppdc-array.cxx | 168 + ppdc/ppdc-attr.cxx | 66 + ppdc/ppdc-catalog.cxx | 897 + ppdc/ppdc-choice.cxx | 61 + ppdc/ppdc-constraint.cxx | 64 + ppdc/ppdc-driver.cxx | 1339 + ppdc/ppdc-file.cxx | 110 + ppdc/ppdc-filter.cxx | 60 + ppdc/ppdc-font.cxx | 66 + ppdc/ppdc-group.cxx | 103 + ppdc/ppdc-import.cxx | 343 + ppdc/ppdc-mediasize.cxx | 85 + ppdc/ppdc-message.cxx | 58 + ppdc/ppdc-option.cxx | 129 + ppdc/ppdc-private.h | 40 + ppdc/ppdc-profile.cxx | 65 + ppdc/ppdc-shared.cxx | 88 + ppdc/ppdc-source.cxx | 3911 + ppdc/ppdc-string.cxx | 62 + ppdc/ppdc-variable.cxx | 71 + ppdc/ppdc.cxx | 469 + ppdc/ppdc.h | 533 + ppdc/ppdhtml.cxx | 186 + ppdc/ppdi.cxx | 142 + ppdc/ppdmerge.cxx | 379 + ppdc/ppdpo.cxx | 268 + ppdc/sample.drv | 1254 + ppdc/testcatalog.cxx | 63 + scheduler/Dependencies | 361 + scheduler/Makefile | 582 + scheduler/api-mime.header | 34 + scheduler/api-mime.shtml | 17 + scheduler/auth.c | 2586 + scheduler/auth.h | 152 + scheduler/avahi.c | 445 + scheduler/avahi.h | 49 + scheduler/banners.c | 224 + scheduler/banners.h | 45 + scheduler/cert.c | 458 + scheduler/cert.h | 56 + scheduler/classes.c | 868 + scheduler/classes.h | 36 + scheduler/client.c | 5204 + scheduler/client.h | 137 + scheduler/colord.c | 692 + scheduler/colord.h | 22 + scheduler/conf.c | 4228 + scheduler/conf.h | 301 + scheduler/cups-deviced.c | 825 + scheduler/cups-driverd.cxx | 2576 + scheduler/cups-exec.c | 108 + scheduler/cups-lpd.c | 1627 + scheduler/cups-lpd.xinetd.in | 12 + scheduler/cups-polld.c | 470 + scheduler/cups.sh.in | 237 + scheduler/cups.xml.in | 214 + scheduler/cupsd.h | 276 + scheduler/cupsfilter.c | 1494 + scheduler/dirsvc.c | 6147 + scheduler/dirsvc.h | 232 + scheduler/env.c | 271 + scheduler/file.c | 450 + scheduler/filter.c | 504 + scheduler/ipp.c | 12399 ++ scheduler/job.c | 4776 + scheduler/job.h | 164 + scheduler/libcupsmime.exp | 22 + scheduler/listen.c | 431 + scheduler/log.c | 1081 + scheduler/main.c | 2169 + scheduler/mime-private.h | 48 + scheduler/mime.c | 960 + scheduler/mime.h | 162 + scheduler/network.c | 300 + scheduler/network.h | 52 + scheduler/org.cups.cups-lpd.plist.in | 33 + scheduler/org.cups.cupsd.plist | 62 + scheduler/policy.c | 517 + scheduler/policy.h | 63 + scheduler/printers.c | 5638 + scheduler/printers.h | 191 + scheduler/process.c | 656 + scheduler/quotas.c | 244 + scheduler/select.c | 951 + scheduler/server.c | 184 + scheduler/statbuf.c | 330 + scheduler/statbuf.h | 49 + scheduler/subscriptions.c | 1642 + scheduler/subscriptions.h | 166 + scheduler/sysman.c | 1037 + scheduler/sysman.h | 64 + scheduler/testdirsvc.c | 324 + scheduler/testlpd.c | 550 + scheduler/testmime.c | 531 + scheduler/testspeed.c | 365 + scheduler/testsub.c | 522 + scheduler/timeout.c | 215 + scheduler/type.c | 1216 + scheduler/util.c | 471 + scheduler/util.h | 71 + scripting/perl/CUPS.pm | 144 + scripting/perl/CUPS.xs | 270 + scripting/perl/Makefile.PL | 17 + scripting/perl/README | 35 + scripting/perl/test.pl | 17 + scripting/php/Dependencies | 7 + scripting/php/Makefile | 153 + scripting/php/README | 157 + scripting/php/phpcups.c | 487 + scripting/php/phpcups.h | 67 + scripting/php/phpcups.php | 60 + systemv/Dependencies | 113 + systemv/Makefile | 293 + systemv/cancel.c | 376 + systemv/cupsaccept.c | 239 + systemv/cupsaddsmb.c | 303 + systemv/cupsctl.c | 235 + systemv/cupstestdsc.c | 442 + systemv/cupstestppd.c | 3958 + systemv/lp.c | 723 + systemv/lpadmin.c | 1521 + systemv/lpinfo.c | 498 + systemv/lpmove.c | 213 + systemv/lpoptions.c | 565 + systemv/lppasswd.c | 489 + systemv/lpstat.c | 2054 + templates/Makefile | 204 + templates/add-class.tmpl | 40 + templates/add-printer.tmpl | 47 + templates/add-rss-subscription.tmpl | 44 + templates/admin.tmpl | 110 + templates/choose-device.tmpl | 53 + templates/choose-make.tmpl | 64 + templates/choose-model.tmpl | 60 + templates/choose-serial.tmpl | 52 + templates/choose-uri.tmpl | 44 + templates/class-added.tmpl | 8 + templates/class-confirm.tmpl | 10 + templates/class-deleted.tmpl | 7 + templates/class-jobs-header.tmpl | 3 + templates/class-modified.tmpl | 8 + templates/class.tmpl | 44 + templates/classes-header.tmpl | 1 + templates/classes.tmpl | 11 + templates/command.tmpl | 12 + templates/de/add-class.tmpl | 40 + templates/de/add-printer.tmpl | 47 + templates/de/add-rss-subscription.tmpl | 44 + templates/de/admin.tmpl | 110 + templates/de/choose-device.tmpl | 54 + templates/de/choose-make.tmpl | 64 + templates/de/choose-model.tmpl | 60 + templates/de/choose-serial.tmpl | 52 + templates/de/choose-uri.tmpl | 44 + templates/de/class-added.tmpl | 8 + templates/de/class-confirm.tmpl | 10 + templates/de/class-deleted.tmpl | 7 + templates/de/class-jobs-header.tmpl | 3 + templates/de/class-modified.tmpl | 8 + templates/de/class.tmpl | 44 + templates/de/classes-header.tmpl | 1 + templates/de/classes.tmpl | 11 + templates/de/command.tmpl | 12 + templates/de/edit-config.tmpl | 24 + templates/de/error-op.tmpl | 9 + templates/de/error.tmpl | 9 + templates/de/header.tmpl.in | 29 + templates/de/help-header.tmpl | 51 + templates/de/help-printable.tmpl | 9 + templates/de/help-trailer.tmpl | 1 + templates/de/job-cancel.tmpl | 7 + templates/de/job-hold.tmpl | 7 + templates/de/job-move.tmpl | 27 + templates/de/job-moved.tmpl | 8 + templates/de/job-release.tmpl | 7 + templates/de/job-restart.tmpl | 7 + templates/de/jobs-header.tmpl | 5 + templates/de/jobs.tmpl | 37 + templates/de/list-available-printers.tmpl | 11 + templates/de/modify-class.tmpl | 34 + templates/de/modify-printer.tmpl | 42 + templates/de/norestart.tmpl | 8 + templates/de/option-boolean.tmpl | 6 + templates/de/option-conflict.tmpl | 7 + templates/de/option-header.tmpl | 5 + templates/de/option-pickmany.tmpl | 6 + templates/de/option-pickone.tmpl | 18 + templates/de/option-trailer.tmpl | 5 + templates/de/pager.tmpl | 6 + templates/de/printer-accept.tmpl | 9 + templates/de/printer-added.tmpl | 8 + templates/de/printer-configured.tmpl | 8 + templates/de/printer-confirm.tmpl | 10 + templates/de/printer-default.tmpl | 13 + templates/de/printer-deleted.tmpl | 7 + templates/de/printer-jobs-header.tmpl | 3 + templates/de/printer-modified.tmpl | 8 + templates/de/printer-purge.tmpl | 9 + templates/de/printer-reject.tmpl | 9 + templates/de/printer-start.tmpl | 9 + templates/de/printer-stop.tmpl | 9 + templates/de/printer.tmpl | 47 + templates/de/printers-header.tmpl | 1 + templates/de/printers.tmpl | 11 + templates/de/restart.tmpl | 8 + templates/de/samba-export.tmpl | 55 + templates/de/samba-exported.tmpl | 1 + templates/de/search.tmpl | 10 + templates/de/set-printer-options-header.tmpl | 26 + templates/de/set-printer-options-trailer.tmpl | 16 + templates/de/subscription-added.tmpl | 5 + templates/de/subscription-canceled.tmpl | 5 + templates/de/test-page.tmpl | 8 + templates/de/trailer.tmpl | 8 + templates/de/users.tmpl | 30 + templates/edit-config.tmpl | 24 + templates/error-op.tmpl | 9 + templates/error.tmpl | 9 + templates/es/add-class.tmpl | 40 + templates/es/add-printer.tmpl | 47 + templates/es/add-rss-subscription.tmpl | 44 + templates/es/admin.tmpl | 110 + templates/es/choose-device.tmpl | 54 + templates/es/choose-make.tmpl | 64 + templates/es/choose-model.tmpl | 60 + templates/es/choose-serial.tmpl | 52 + templates/es/choose-uri.tmpl | 44 + templates/es/class-added.tmpl | 7 + templates/es/class-confirm.tmpl | 10 + templates/es/class-deleted.tmpl | 7 + templates/es/class-jobs-header.tmpl | 3 + templates/es/class-modified.tmpl | 6 + templates/es/class.tmpl | 44 + templates/es/classes-header.tmpl | 1 + templates/es/classes.tmpl | 11 + templates/es/command.tmpl | 12 + templates/es/edit-config.tmpl | 24 + templates/es/error-op.tmpl | 9 + templates/es/error.tmpl | 9 + templates/es/header.tmpl.in | 29 + templates/es/help-header.tmpl | 51 + templates/es/help-printable.tmpl | 9 + templates/es/help-trailer.tmpl | 1 + templates/es/job-cancel.tmpl | 7 + templates/es/job-hold.tmpl | 7 + templates/es/job-move.tmpl | 27 + templates/es/job-moved.tmpl | 8 + templates/es/job-release.tmpl | 7 + templates/es/job-restart.tmpl | 7 + templates/es/jobs-header.tmpl | 5 + templates/es/jobs.tmpl | 37 + templates/es/list-available-printers.tmpl | 11 + templates/es/modify-class.tmpl | 34 + templates/es/modify-printer.tmpl | 42 + templates/es/norestart.tmpl | 8 + templates/es/option-boolean.tmpl | 6 + templates/es/option-conflict.tmpl | 7 + templates/es/option-header.tmpl | 5 + templates/es/option-pickmany.tmpl | 6 + templates/es/option-pickone.tmpl | 18 + templates/es/option-trailer.tmpl | 5 + templates/es/pager.tmpl | 6 + templates/es/printer-accept.tmpl | 9 + templates/es/printer-added.tmpl | 7 + templates/es/printer-configured.tmpl | 8 + templates/es/printer-confirm.tmpl | 10 + templates/es/printer-default.tmpl | 13 + templates/es/printer-deleted.tmpl | 7 + templates/es/printer-jobs-header.tmpl | 3 + templates/es/printer-modified.tmpl | 7 + templates/es/printer-purge.tmpl | 8 + templates/es/printer-reject.tmpl | 9 + templates/es/printer-start.tmpl | 9 + templates/es/printer-stop.tmpl | 9 + templates/es/printer.tmpl | 47 + templates/es/printers-header.tmpl | 1 + templates/es/printers.tmpl | 11 + templates/es/restart.tmpl | 8 + templates/es/samba-export.tmpl | 55 + templates/es/samba-exported.tmpl | 1 + templates/es/search.tmpl | 10 + templates/es/set-printer-options-header.tmpl | 26 + templates/es/set-printer-options-trailer.tmpl | 16 + templates/es/subscription-added.tmpl | 5 + templates/es/subscription-canceled.tmpl | 5 + templates/es/test-page.tmpl | 8 + templates/es/trailer.tmpl | 8 + templates/es/users.tmpl | 30 + templates/eu/add-class.tmpl | 40 + templates/eu/add-printer.tmpl | 47 + templates/eu/add-rss-subscription.tmpl | 44 + templates/eu/admin.tmpl | 110 + templates/eu/choose-device.tmpl | 54 + templates/eu/choose-make.tmpl | 64 + templates/eu/choose-model.tmpl | 60 + templates/eu/choose-serial.tmpl | 52 + templates/eu/choose-uri.tmpl | 43 + templates/eu/class-added.tmpl | 7 + templates/eu/class-confirm.tmpl | 9 + templates/eu/class-deleted.tmpl | 7 + templates/eu/class-jobs-header.tmpl | 3 + templates/eu/class-modified.tmpl | 7 + templates/eu/class.tmpl | 44 + templates/eu/classes-header.tmpl | 1 + templates/eu/classes.tmpl | 11 + templates/eu/command.tmpl | 12 + templates/eu/edit-config.tmpl | 24 + templates/eu/error-op.tmpl | 9 + templates/eu/error.tmpl | 9 + templates/eu/header.tmpl.in | 29 + templates/eu/help-header.tmpl | 49 + templates/eu/help-printable.tmpl | 9 + templates/eu/help-trailer.tmpl | 1 + templates/eu/job-cancel.tmpl | 7 + templates/eu/job-hold.tmpl | 7 + templates/eu/job-move.tmpl | 27 + templates/eu/job-moved.tmpl | 8 + templates/eu/job-release.tmpl | 7 + templates/eu/job-restart.tmpl | 7 + templates/eu/jobs-header.tmpl | 5 + templates/eu/jobs.tmpl | 37 + templates/eu/list-available-printers.tmpl | 11 + templates/eu/modify-class.tmpl | 34 + templates/eu/modify-printer.tmpl | 42 + templates/eu/norestart.tmpl | 7 + templates/eu/option-boolean.tmpl | 6 + templates/eu/option-conflict.tmpl | 7 + templates/eu/option-header.tmpl | 5 + templates/eu/option-pickmany.tmpl | 6 + templates/eu/option-pickone.tmpl | 18 + templates/eu/option-trailer.tmpl | 5 + templates/eu/pager.tmpl | 6 + templates/eu/printer-accept.tmpl | 8 + templates/eu/printer-added.tmpl | 7 + templates/eu/printer-configured.tmpl | 8 + templates/eu/printer-confirm.tmpl | 9 + templates/eu/printer-default.tmpl | 11 + templates/eu/printer-deleted.tmpl | 7 + templates/eu/printer-jobs-header.tmpl | 3 + templates/eu/printer-modified.tmpl | 8 + templates/eu/printer-purge.tmpl | 8 + templates/eu/printer-reject.tmpl | 8 + templates/eu/printer-start.tmpl | 8 + templates/eu/printer-stop.tmpl | 8 + templates/eu/printer.tmpl | 47 + templates/eu/printers-header.tmpl | 1 + templates/eu/printers.tmpl | 11 + templates/eu/restart.tmpl | 8 + templates/eu/samba-export.tmpl | 54 + templates/eu/samba-exported.tmpl | 1 + templates/eu/search.tmpl | 10 + templates/eu/set-printer-options-header.tmpl | 26 + templates/eu/set-printer-options-trailer.tmpl | 16 + templates/eu/subscription-added.tmpl | 5 + templates/eu/subscription-canceled.tmpl | 5 + templates/eu/test-page.tmpl | 7 + templates/eu/trailer.tmpl | 8 + templates/eu/users.tmpl | 30 + templates/fr/add-class.tmpl | 40 + templates/fr/add-printer.tmpl | 47 + templates/fr/add-rss-subscription.tmpl | 44 + templates/fr/admin.tmpl | 110 + templates/fr/choose-device.tmpl | 53 + templates/fr/choose-make.tmpl | 64 + templates/fr/choose-model.tmpl | 60 + templates/fr/choose-serial.tmpl | 52 + templates/fr/choose-uri.tmpl | 43 + templates/fr/class-added.tmpl | 7 + templates/fr/class-confirm.tmpl | 10 + templates/fr/class-deleted.tmpl | 7 + templates/fr/class-jobs-header.tmpl | 3 + templates/fr/class-modified.tmpl | 7 + templates/fr/class.tmpl | 44 + templates/fr/classes-header.tmpl | 1 + templates/fr/classes.tmpl | 11 + templates/fr/command.tmpl | 12 + templates/fr/edit-config.tmpl | 24 + templates/fr/error-op.tmpl | 9 + templates/fr/error.tmpl | 9 + templates/fr/header.tmpl.in | 29 + templates/fr/help-header.tmpl | 51 + templates/fr/help-printable.tmpl | 9 + templates/fr/help-trailer.tmpl | 1 + templates/fr/job-cancel.tmpl | 7 + templates/fr/job-hold.tmpl | 7 + templates/fr/job-move.tmpl | 27 + templates/fr/job-moved.tmpl | 8 + templates/fr/job-release.tmpl | 7 + templates/fr/job-restart.tmpl | 7 + templates/fr/jobs-header.tmpl | 5 + templates/fr/jobs.tmpl | 37 + templates/fr/list-available-printers.tmpl | 11 + templates/fr/modify-class.tmpl | 34 + templates/fr/modify-printer.tmpl | 42 + templates/fr/norestart.tmpl | 8 + templates/fr/option-boolean.tmpl | 6 + templates/fr/option-conflict.tmpl | 7 + templates/fr/option-header.tmpl | 5 + templates/fr/option-pickmany.tmpl | 6 + templates/fr/option-pickone.tmpl | 18 + templates/fr/option-trailer.tmpl | 5 + templates/fr/pager.tmpl | 6 + templates/fr/printer-accept.tmpl | 9 + templates/fr/printer-added.tmpl | 7 + templates/fr/printer-configured.tmpl | 8 + templates/fr/printer-confirm.tmpl | 10 + templates/fr/printer-default.tmpl | 11 + templates/fr/printer-deleted.tmpl | 7 + templates/fr/printer-jobs-header.tmpl | 3 + templates/fr/printer-modified.tmpl | 8 + templates/fr/printer-purge.tmpl | 9 + templates/fr/printer-reject.tmpl | 9 + templates/fr/printer-start.tmpl | 9 + templates/fr/printer-stop.tmpl | 9 + templates/fr/printer.tmpl | 47 + templates/fr/printers-header.tmpl | 1 + templates/fr/printers.tmpl | 11 + templates/fr/restart.tmpl | 8 + templates/fr/samba-export.tmpl | 53 + templates/fr/samba-exported.tmpl | 1 + templates/fr/search.tmpl | 10 + templates/fr/set-printer-options-header.tmpl | 26 + templates/fr/set-printer-options-trailer.tmpl | 16 + templates/fr/subscription-added.tmpl | 5 + templates/fr/subscription-canceled.tmpl | 5 + templates/fr/test-page.tmpl | 8 + templates/fr/trailer.tmpl | 8 + templates/fr/users.tmpl | 30 + templates/header.tmpl.in | 29 + templates/help-header.tmpl | 51 + templates/help-printable.tmpl | 9 + templates/help-trailer.tmpl | 1 + templates/hu/add-class.tmpl | 41 + templates/hu/add-printer.tmpl | 47 + templates/hu/add-rss-subscription.tmpl | 58 + templates/hu/admin.tmpl | 134 + templates/hu/choose-device.tmpl | 54 + templates/hu/choose-make.tmpl | 65 + templates/hu/choose-model.tmpl | 61 + templates/hu/choose-serial.tmpl | 53 + templates/hu/choose-uri.tmpl | 44 + templates/hu/class-added.tmpl | 7 + templates/hu/class-confirm.tmpl | 10 + templates/hu/class-deleted.tmpl | 6 + templates/hu/class-jobs-header.tmpl | 3 + templates/hu/class-modified.tmpl | 7 + templates/hu/class.tmpl | 48 + templates/hu/classes-header.tmpl | 1 + templates/hu/classes.tmpl | 15 + templates/hu/command.tmpl | 12 + templates/hu/edit-config.tmpl | 24 + templates/hu/error-op.tmpl | 9 + templates/hu/error.tmpl | 9 + templates/hu/header.tmpl.in | 34 + templates/hu/help-header.tmpl | 52 + templates/hu/help-printable.tmpl | 9 + templates/hu/help-trailer.tmpl | 1 + templates/hu/job-cancel.tmpl | 6 + templates/hu/job-hold.tmpl | 7 + templates/hu/job-move.tmpl | 27 + templates/hu/job-moved.tmpl | 10 + templates/hu/job-release.tmpl | 7 + templates/hu/job-restart.tmpl | 6 + templates/hu/jobs-header.tmpl | 7 + templates/hu/jobs.tmpl | 40 + templates/hu/list-available-printers.tmpl | 12 + templates/hu/modify-class.tmpl | 34 + templates/hu/modify-printer.tmpl | 42 + templates/hu/norestart.tmpl | 8 + templates/hu/option-boolean.tmpl | 6 + templates/hu/option-conflict.tmpl | 7 + templates/hu/option-header.tmpl | 5 + templates/hu/option-pickmany.tmpl | 6 + templates/hu/option-pickone.tmpl | 18 + templates/hu/option-trailer.tmpl | 5 + templates/hu/pager.tmpl | 6 + templates/hu/printer-accept.tmpl | 10 + templates/hu/printer-added.tmpl | 7 + templates/hu/printer-configured.tmpl | 8 + templates/hu/printer-confirm.tmpl | 9 + templates/hu/printer-default.tmpl | 13 + templates/hu/printer-deleted.tmpl | 6 + templates/hu/printer-jobs-header.tmpl | 3 + templates/hu/printer-modified.tmpl | 8 + templates/hu/printer-purge.tmpl | 9 + templates/hu/printer-reject.tmpl | 9 + templates/hu/printer-start.tmpl | 9 + templates/hu/printer-stop.tmpl | 9 + templates/hu/printer.tmpl | 52 + templates/hu/printers-header.tmpl | 1 + templates/hu/printers.tmpl | 16 + templates/hu/restart.tmpl | 8 + templates/hu/samba-export.tmpl | 55 + templates/hu/samba-exported.tmpl | 1 + templates/hu/search.tmpl | 11 + templates/hu/set-printer-options-header.tmpl | 26 + templates/hu/set-printer-options-trailer.tmpl | 16 + templates/hu/subscription-added.tmpl | 5 + templates/hu/subscription-canceled.tmpl | 5 + templates/hu/test-page.tmpl | 8 + templates/hu/trailer.tmpl | 8 + templates/hu/users.tmpl | 34 + templates/id/add-class.tmpl | 40 + templates/id/add-printer.tmpl | 43 + templates/id/add-rss-subscription.tmpl | 44 + templates/id/admin.tmpl | 110 + templates/id/choose-device.tmpl | 54 + templates/id/choose-make.tmpl | 64 + templates/id/choose-model.tmpl | 60 + templates/id/choose-serial.tmpl | 52 + templates/id/choose-uri.tmpl | 43 + templates/id/class-added.tmpl | 7 + templates/id/class-confirm.tmpl | 10 + templates/id/class-deleted.tmpl | 7 + templates/id/class-jobs-header.tmpl | 3 + templates/id/class-modified.tmpl | 7 + templates/id/class.tmpl | 44 + templates/id/classes-header.tmpl | 1 + templates/id/classes.tmpl | 11 + templates/id/command.tmpl | 12 + templates/id/edit-config.tmpl | 24 + templates/id/error-op.tmpl | 9 + templates/id/error.tmpl | 9 + templates/id/header.tmpl.in | 29 + templates/id/help-header.tmpl | 47 + templates/id/help-printable.tmpl | 9 + templates/id/help-trailer.tmpl | 1 + templates/id/job-cancel.tmpl | 7 + templates/id/job-hold.tmpl | 7 + templates/id/job-move.tmpl | 27 + templates/id/job-moved.tmpl | 8 + templates/id/job-release.tmpl | 7 + templates/id/job-restart.tmpl | 7 + templates/id/jobs-header.tmpl | 5 + templates/id/jobs.tmpl | 36 + templates/id/list-available-printers.tmpl | 11 + templates/id/modify-class.tmpl | 34 + templates/id/modify-printer.tmpl | 38 + templates/id/norestart.tmpl | 7 + templates/id/option-boolean.tmpl | 6 + templates/id/option-conflict.tmpl | 7 + templates/id/option-header.tmpl | 5 + templates/id/option-pickmany.tmpl | 6 + templates/id/option-pickone.tmpl | 18 + templates/id/option-trailer.tmpl | 5 + templates/id/pager.tmpl | 6 + templates/id/printer-accept.tmpl | 9 + templates/id/printer-added.tmpl | 7 + templates/id/printer-configured.tmpl | 8 + templates/id/printer-confirm.tmpl | 10 + templates/id/printer-default.tmpl | 11 + templates/id/printer-deleted.tmpl | 7 + templates/id/printer-jobs-header.tmpl | 3 + templates/id/printer-modified.tmpl | 7 + templates/id/printer-purge.tmpl | 9 + templates/id/printer-reject.tmpl | 9 + templates/id/printer-start.tmpl | 9 + templates/id/printer-stop.tmpl | 9 + templates/id/printer.tmpl | 47 + templates/id/printers-header.tmpl | 1 + templates/id/printers.tmpl | 11 + templates/id/restart.tmpl | 8 + templates/id/samba-export.tmpl | 55 + templates/id/samba-exported.tmpl | 1 + templates/id/search.tmpl | 10 + templates/id/set-printer-options-header.tmpl | 26 + templates/id/set-printer-options-trailer.tmpl | 16 + templates/id/subscription-added.tmpl | 5 + templates/id/subscription-canceled.tmpl | 5 + templates/id/test-page.tmpl | 8 + templates/id/trailer.tmpl | 8 + templates/id/users.tmpl | 30 + templates/it/add-class.tmpl | 40 + templates/it/add-printer.tmpl | 43 + templates/it/add-rss-subscription.tmpl | 44 + templates/it/admin.tmpl | 110 + templates/it/choose-device.tmpl | 54 + templates/it/choose-make.tmpl | 64 + templates/it/choose-model.tmpl | 60 + templates/it/choose-serial.tmpl | 52 + templates/it/choose-uri.tmpl | 44 + templates/it/class-added.tmpl | 8 + templates/it/class-confirm.tmpl | 10 + templates/it/class-deleted.tmpl | 7 + templates/it/class-jobs-header.tmpl | 3 + templates/it/class-modified.tmpl | 8 + templates/it/class.tmpl | 44 + templates/it/classes-header.tmpl | 1 + templates/it/classes.tmpl | 11 + templates/it/command.tmpl | 12 + templates/it/edit-config.tmpl | 24 + templates/it/error-op.tmpl | 9 + templates/it/error.tmpl | 9 + templates/it/help-header.tmpl | 50 + templates/it/help-printable.tmpl | 9 + templates/it/help-trailer.tmpl | 1 + templates/it/job-cancel.tmpl | 7 + templates/it/job-hold.tmpl | 7 + templates/it/job-move.tmpl | 27 + templates/it/job-moved.tmpl | 8 + templates/it/job-release.tmpl | 7 + templates/it/job-restart.tmpl | 7 + templates/it/jobs-header.tmpl | 5 + templates/it/jobs.tmpl | 37 + templates/it/list-available-printers.tmpl | 11 + templates/it/modify-class.tmpl | 34 + templates/it/modify-printer.tmpl | 38 + templates/it/norestart.tmpl | 7 + templates/it/option-boolean.tmpl | 6 + templates/it/option-conflict.tmpl | 7 + templates/it/option-header.tmpl | 5 + templates/it/option-pickmany.tmpl | 6 + templates/it/option-pickone.tmpl | 18 + templates/it/option-trailer.tmpl | 5 + templates/it/pager.tmpl | 6 + templates/it/printer-accept.tmpl | 9 + templates/it/printer-added.tmpl | 7 + templates/it/printer-configured.tmpl | 8 + templates/it/printer-confirm.tmpl | 10 + templates/it/printer-default.tmpl | 12 + templates/it/printer-deleted.tmpl | 7 + templates/it/printer-jobs-header.tmpl | 3 + templates/it/printer-modified.tmpl | 8 + templates/it/printer-purge.tmpl | 9 + templates/it/printer-reject.tmpl | 9 + templates/it/printer-start.tmpl | 9 + templates/it/printer-stop.tmpl | 9 + templates/it/printer.tmpl | 47 + templates/it/printers-header.tmpl | 1 + templates/it/printers.tmpl | 11 + templates/it/restart.tmpl | 8 + templates/it/samba-export.tmpl | 54 + templates/it/samba-exported.tmpl | 1 + templates/it/search.tmpl | 10 + templates/it/set-printer-options-header.tmpl | 26 + templates/it/set-printer-options-trailer.tmpl | 16 + templates/it/subscription-added.tmpl | 5 + templates/it/subscription-canceled.tmpl | 5 + templates/it/test-page.tmpl | 8 + templates/it/trailer.tmpl | 8 + templates/it/users.tmpl | 30 + templates/ja/add-class.tmpl | 40 + templates/ja/add-printer.tmpl | 47 + templates/ja/add-rss-subscription.tmpl | 44 + templates/ja/admin.tmpl | 110 + templates/ja/choose-device.tmpl | 54 + templates/ja/choose-make.tmpl | 64 + templates/ja/choose-model.tmpl | 60 + templates/ja/choose-serial.tmpl | 52 + templates/ja/choose-uri.tmpl | 43 + templates/ja/class-added.tmpl | 7 + templates/ja/class-confirm.tmpl | 10 + templates/ja/class-deleted.tmpl | 7 + templates/ja/class-jobs-header.tmpl | 3 + templates/ja/class-modified.tmpl | 7 + templates/ja/class.tmpl | 44 + templates/ja/classes-header.tmpl | 1 + templates/ja/classes.tmpl | 11 + templates/ja/command.tmpl | 12 + templates/ja/edit-config.tmpl | 24 + templates/ja/error-op.tmpl | 9 + templates/ja/error.tmpl | 9 + templates/ja/header.tmpl.in | 29 + templates/ja/help-header.tmpl | 51 + templates/ja/help-printable.tmpl | 9 + templates/ja/help-trailer.tmpl | 1 + templates/ja/job-cancel.tmpl | 7 + templates/ja/job-hold.tmpl | 6 + templates/ja/job-move.tmpl | 27 + templates/ja/job-moved.tmpl | 8 + templates/ja/job-release.tmpl | 7 + templates/ja/job-restart.tmpl | 7 + templates/ja/jobs-header.tmpl | 5 + templates/ja/jobs.tmpl | 37 + templates/ja/list-available-printers.tmpl | 11 + templates/ja/modify-class.tmpl | 34 + templates/ja/modify-printer.tmpl | 42 + templates/ja/norestart.tmpl | 7 + templates/ja/option-boolean.tmpl | 6 + templates/ja/option-conflict.tmpl | 7 + templates/ja/option-header.tmpl | 5 + templates/ja/option-pickmany.tmpl | 6 + templates/ja/option-pickone.tmpl | 18 + templates/ja/option-trailer.tmpl | 5 + templates/ja/pager.tmpl | 6 + templates/ja/printer-accept.tmpl | 9 + templates/ja/printer-added.tmpl | 6 + templates/ja/printer-configured.tmpl | 7 + templates/ja/printer-confirm.tmpl | 9 + templates/ja/printer-default.tmpl | 12 + templates/ja/printer-deleted.tmpl | 6 + templates/ja/printer-jobs-header.tmpl | 3 + templates/ja/printer-modified.tmpl | 7 + templates/ja/printer-purge.tmpl | 9 + templates/ja/printer-reject.tmpl | 9 + templates/ja/printer-start.tmpl | 9 + templates/ja/printer-stop.tmpl | 8 + templates/ja/printer.tmpl | 47 + templates/ja/printers-header.tmpl | 1 + templates/ja/printers.tmpl | 11 + templates/ja/restart.tmpl | 8 + templates/ja/samba-export.tmpl | 56 + templates/ja/samba-exported.tmpl | 1 + templates/ja/search.tmpl | 10 + templates/ja/set-printer-options-header.tmpl | 26 + templates/ja/set-printer-options-trailer.tmpl | 16 + templates/ja/subscription-added.tmpl | 5 + templates/ja/subscription-canceled.tmpl | 5 + templates/ja/test-page.tmpl | 8 + templates/ja/trailer.tmpl | 8 + templates/ja/users.tmpl | 30 + templates/job-cancel.tmpl | 7 + templates/job-hold.tmpl | 7 + templates/job-move.tmpl | 27 + templates/job-moved.tmpl | 8 + templates/job-release.tmpl | 7 + templates/job-restart.tmpl | 7 + templates/jobs-header.tmpl | 5 + templates/jobs.tmpl | 36 + templates/list-available-printers.tmpl | 11 + templates/modify-class.tmpl | 34 + templates/modify-printer.tmpl | 42 + templates/norestart.tmpl | 8 + templates/option-boolean.tmpl | 6 + templates/option-conflict.tmpl | 7 + templates/option-header.tmpl | 5 + templates/option-pickmany.tmpl | 6 + templates/option-pickone.tmpl | 18 + templates/option-trailer.tmpl | 5 + templates/pager.tmpl | 6 + templates/pl/add-class.tmpl | 40 + templates/pl/add-printer.tmpl | 47 + templates/pl/add-rss-subscription.tmpl | 44 + templates/pl/admin.tmpl | 110 + templates/pl/choose-device.tmpl | 54 + templates/pl/choose-make.tmpl | 64 + templates/pl/choose-model.tmpl | 60 + templates/pl/choose-serial.tmpl | 52 + templates/pl/choose-uri.tmpl | 44 + templates/pl/class-added.tmpl | 8 + templates/pl/class-confirm.tmpl | 10 + templates/pl/class-deleted.tmpl | 7 + templates/pl/class-jobs-header.tmpl | 3 + templates/pl/class-modified.tmpl | 8 + templates/pl/class.tmpl | 44 + templates/pl/classes-header.tmpl | 1 + templates/pl/classes.tmpl | 11 + templates/pl/command.tmpl | 12 + templates/pl/edit-config.tmpl | 24 + templates/pl/error-op.tmpl | 9 + templates/pl/error.tmpl | 9 + templates/pl/header.tmpl.in | 29 + templates/pl/help-header.tmpl | 51 + templates/pl/help-printable.tmpl | 9 + templates/pl/help-trailer.tmpl | 1 + templates/pl/job-cancel.tmpl | 7 + templates/pl/job-hold.tmpl | 7 + templates/pl/job-move.tmpl | 27 + templates/pl/job-moved.tmpl | 8 + templates/pl/job-release.tmpl | 7 + templates/pl/job-restart.tmpl | 7 + templates/pl/jobs-header.tmpl | 5 + templates/pl/jobs.tmpl | 37 + templates/pl/list-available-printers.tmpl | 11 + templates/pl/modify-class.tmpl | 34 + templates/pl/modify-printer.tmpl | 42 + templates/pl/norestart.tmpl | 8 + templates/pl/option-boolean.tmpl | 6 + templates/pl/option-conflict.tmpl | 7 + templates/pl/option-header.tmpl | 5 + templates/pl/option-pickmany.tmpl | 6 + templates/pl/option-pickone.tmpl | 18 + templates/pl/option-trailer.tmpl | 5 + templates/pl/pager.tmpl | 6 + templates/pl/printer-accept.tmpl | 9 + templates/pl/printer-added.tmpl | 8 + templates/pl/printer-configured.tmpl | 8 + templates/pl/printer-confirm.tmpl | 10 + templates/pl/printer-default.tmpl | 13 + templates/pl/printer-deleted.tmpl | 7 + templates/pl/printer-jobs-header.tmpl | 3 + templates/pl/printer-modified.tmpl | 8 + templates/pl/printer-purge.tmpl | 9 + templates/pl/printer-reject.tmpl | 9 + templates/pl/printer-start.tmpl | 9 + templates/pl/printer-stop.tmpl | 9 + templates/pl/printer.tmpl | 47 + templates/pl/printers-header.tmpl | 1 + templates/pl/printers.tmpl | 11 + templates/pl/restart.tmpl | 8 + templates/pl/samba-export.tmpl | 55 + templates/pl/samba-exported.tmpl | 1 + templates/pl/search.tmpl | 10 + templates/pl/set-printer-options-header.tmpl | 26 + templates/pl/set-printer-options-trailer.tmpl | 16 + templates/pl/subscription-added.tmpl | 5 + templates/pl/subscription-canceled.tmpl | 5 + templates/pl/test-page.tmpl | 8 + templates/pl/trailer.tmpl | 8 + templates/pl/users.tmpl | 30 + templates/printer-accept.tmpl | 9 + templates/printer-added.tmpl | 8 + templates/printer-configured.tmpl | 8 + templates/printer-confirm.tmpl | 10 + templates/printer-default.tmpl | 13 + templates/printer-deleted.tmpl | 7 + templates/printer-jobs-header.tmpl | 3 + templates/printer-modified.tmpl | 8 + templates/printer-purge.tmpl | 9 + templates/printer-reject.tmpl | 9 + templates/printer-start.tmpl | 9 + templates/printer-stop.tmpl | 9 + templates/printer.tmpl | 47 + templates/printers-header.tmpl | 1 + templates/printers.tmpl | 11 + templates/restart.tmpl | 8 + templates/ru/Makefile | 201 + templates/ru/add-class.tmpl | 40 + templates/ru/add-printer.tmpl | 47 + templates/ru/add-rss-subscription.tmpl | 44 + templates/ru/admin.tmpl | 110 + templates/ru/choose-device.tmpl | 54 + templates/ru/choose-make.tmpl | 64 + templates/ru/choose-model.tmpl | 59 + templates/ru/choose-serial.tmpl | 52 + templates/ru/choose-uri.tmpl | 43 + templates/ru/class-added.tmpl | 7 + templates/ru/class-confirm.tmpl | 10 + templates/ru/class-deleted.tmpl | 7 + templates/ru/class-jobs-header.tmpl | 3 + templates/ru/class-modified.tmpl | 7 + templates/ru/class.tmpl | 44 + templates/ru/classes-header.tmpl | 1 + templates/ru/classes.tmpl | 11 + templates/ru/command.tmpl | 12 + templates/ru/edit-config.tmpl | 24 + templates/ru/error-op.tmpl | 9 + templates/ru/error.tmpl | 9 + templates/ru/header.tmpl.in | 29 + templates/ru/help-header.tmpl | 46 + templates/ru/help-printable.tmpl | 9 + templates/ru/help-trailer.tmpl | 1 + templates/ru/job-cancel.tmpl | 7 + templates/ru/job-hold.tmpl | 7 + templates/ru/job-move.tmpl | 27 + templates/ru/job-moved.tmpl | 7 + templates/ru/job-release.tmpl | 7 + templates/ru/job-restart.tmpl | 7 + templates/ru/jobs-header.tmpl | 6 + templates/ru/jobs.tmpl | 37 + templates/ru/list-available-printers.tmpl | 11 + templates/ru/modify-class.tmpl | 34 + templates/ru/modify-printer.tmpl | 42 + templates/ru/norestart.tmpl | 7 + templates/ru/option-boolean.tmpl | 6 + templates/ru/option-conflict.tmpl | 7 + templates/ru/option-header.tmpl | 5 + templates/ru/option-pickmany.tmpl | 6 + templates/ru/option-pickone.tmpl | 18 + templates/ru/option-trailer.tmpl | 5 + templates/ru/pager.tmpl | 6 + templates/ru/printer-accept.tmpl | 9 + templates/ru/printer-added.tmpl | 8 + templates/ru/printer-configured.tmpl | 8 + templates/ru/printer-confirm.tmpl | 10 + templates/ru/printer-default.tmpl | 12 + templates/ru/printer-deleted.tmpl | 7 + templates/ru/printer-jobs-header.tmpl | 3 + templates/ru/printer-modified.tmpl | 8 + templates/ru/printer-purge.tmpl | 9 + templates/ru/printer-reject.tmpl | 9 + templates/ru/printer-start.tmpl | 9 + templates/ru/printer-stop.tmpl | 9 + templates/ru/printer.tmpl | 47 + templates/ru/printers-header.tmpl | 1 + templates/ru/printers.tmpl | 11 + templates/ru/restart.tmpl | 8 + templates/ru/samba-export.tmpl | 54 + templates/ru/samba-exported.tmpl | 1 + templates/ru/search.tmpl | 10 + templates/ru/set-printer-options-header.tmpl | 26 + templates/ru/set-printer-options-trailer.tmpl | 16 + templates/ru/subscription-added.tmpl | 5 + templates/ru/subscription-canceled.tmpl | 5 + templates/ru/test-page.tmpl | 8 + templates/ru/trailer.tmpl | 6 + templates/ru/users.tmpl | 30 + templates/samba-export.tmpl | 55 + templates/samba-exported.tmpl | 1 + templates/search.tmpl | 10 + templates/set-printer-options-header.tmpl | 26 + templates/set-printer-options-trailer.tmpl | 16 + templates/subscription-added.tmpl | 5 + templates/subscription-canceled.tmpl | 5 + templates/test-page.tmpl | 8 + templates/trailer.tmpl | 8 + templates/users.tmpl | 30 + test/4.1-requests.test | 159 + test/4.2-cups-printer-ops.test | 327 + test/4.3-job-ops.test | 330 + test/4.4-subscription-ops.test | 153 + test/5.1-lpadmin.sh | 55 + test/5.2-lpc.sh | 31 + test/5.3-lpq.sh | 31 + test/5.4-lpstat.sh | 44 + test/5.5-lp.sh | 84 + test/5.6-lpr.sh | 84 + test/5.7-lprm.sh | 47 + test/5.8-cancel.sh | 45 + test/5.9-lpinfo.sh | 55 + test/Dependencies | 20 + test/Makefile | 205 + test/color.jpg | Bin 0 -> 90720 bytes test/create-job-format.test | 56 + test/create-job-sheets.test | 55 + test/create-job-timeout.test | 54 + test/create-job.test | 52 + test/create-printer-subscription.test | 49 + test/document-a4.pdf | Bin 0 -> 1062429 bytes test/document-a4.ps | 135164 +++++++++++++++++ test/document-a4.sla | 277 + test/document-letter.pdf | Bin 0 -> 1430525 bytes test/document-letter.ps | 136971 ++++++++++++++++++ test/document-letter.sla | 279 + test/get-completed-jobs.test | 51 + test/get-devices.test | 21 + test/get-job-attributes.test | 27 + test/get-job-attributes2.test | 28 + test/get-jobs.test | 54 + test/get-ppd-printer.test | 20 + test/get-ppd.test | 20 + test/get-ppds-drv-only.test | 24 + test/get-ppds-language.test | 21 + test/get-ppds-make-and-model.test | 21 + test/get-ppds-make.test | 21 + test/get-ppds-product.test | 21 + test/get-ppds-psversion.test | 21 + test/get-ppds.test | 21 + test/get-printer-attributes-2.0.test | 48 + test/get-printer-attributes.test | 38 + test/get-printers.test | 19 + test/get-subscriptions.test | 21 + test/gray.jpg | Bin 0 -> 134055 bytes test/ipp-1.1.test | 2319 + test/ipp-2.0.test | 115 + test/ipp-2.1.test | 96 + test/ipp-2.2.test | 86 + test/ipp-backend.test | 22 + test/ippserver.c | 5437 + test/ipptool.c | 5416 + test/onepage-a4.pdf | Bin 0 -> 50961 bytes test/onepage-a4.ps | 34422 +++++ test/onepage-a4.sla | 156 + test/onepage-letter.pdf | Bin 0 -> 49476 bytes test/onepage-letter.ps | 31301 ++++ test/onepage-letter.sla | 160 + test/print-job-hold.test | 41 + test/print-job-media-col.test | 46 + test/print-job.test | 29 + test/print-uri.test | 27 + test/printer.opacity | Bin 0 -> 18493 bytes test/printer.png | Bin 0 -> 5133 bytes test/run-stp-tests.sh | 875 + test/set-attrs-hold.test | 180 + test/str-header.html | 30 + test/str-trailer.html | 2 + test/testfile.jpg | Bin 0 -> 204156 bytes test/testfile.pdf | Bin 0 -> 279746 bytes test/testfile.ps | 598 + test/testfile.txt | 60 + test/testhp.ppd | 187 + test/testps.ppd | 183 + test/waitjobs.sh | 60 + vc2005/cups.sln | 78 + vc2005/cupstestppd.vcproj | 356 + vc2005/ipptool.vcproj | 199 + vc2005/libcups2.vcproj | 1611 + vc2005/libcupsimage2.vcproj | 395 + vc2005/testfile.vcproj | 202 + vc2005/testhttp.vcproj | 202 + vcnet/config.h | 788 + vcnet/cups.sln | 91 + vcnet/cupstestppd.vcproj | 353 + vcnet/ipptool.vcproj | 385 + vcnet/libcups2.vcproj | 1608 + vcnet/libcupsimage2.vcproj | 388 + vcnet/regex/COPYRIGHT | 20 + vcnet/regex/Makefile | 130 + vcnet/regex/README | 32 + vcnet/regex/WHATSNEW | 108 + vcnet/regex/cclass.h | 31 + vcnet/regex/cname.h | 102 + vcnet/regex/debug.c | 242 + vcnet/regex/debug.ih | 14 + vcnet/regex/engine.c | 1019 + vcnet/regex/engine.ih | 35 + vcnet/regex/main.c | 510 + vcnet/regex/main.ih | 19 + vcnet/regex/mkh | 76 + vcnet/regex/regcomp.c | 1603 + vcnet/regex/regcomp.ih | 51 + vcnet/regex/regerror.c | 126 + vcnet/regex/regerror.ih | 12 + vcnet/regex/regex.3 | 509 + vcnet/regex/regex.7 | 235 + vcnet/regex/regex.h | 74 + vcnet/regex/regex2.h | 134 + vcnet/regex/regexec.c | 138 + vcnet/regex/regfree.c | 37 + vcnet/regex/split.c | 316 + vcnet/regex/tests | 477 + vcnet/regex/utils.h | 22 + vcnet/testfile.vcproj | 201 + vcnet/testhttp.vcproj | 201 + xcode/CUPS.xcodeproj/project.pbxproj | 4614 + xcode/config.h | 736 + 1702 files changed, 980928 insertions(+) create mode 100644 CHANGES-1.0.txt create mode 100644 CHANGES-1.1.txt create mode 100644 CHANGES-1.2.txt create mode 100644 CHANGES-1.3.txt create mode 100644 CHANGES-1.4.txt create mode 100644 CHANGES.txt create mode 100644 CREDITS.txt create mode 100644 INSTALL.txt create mode 100644 IPPTOOL.txt create mode 100644 LICENSE.txt create mode 100644 Makedefs.in create mode 100644 Makefile create mode 100644 README.txt create mode 100644 backend/Dependencies create mode 100644 backend/Makefile create mode 100644 backend/backend-private.h create mode 100644 backend/dnssd.c create mode 100644 backend/ieee1284.c create mode 100644 backend/ipp.c create mode 100644 backend/ipp14.c create mode 100644 backend/lpd.c create mode 100644 backend/network.c create mode 100644 backend/parallel.c create mode 100755 backend/pseudo create mode 100644 backend/runloop.c create mode 100644 backend/serial.c create mode 100644 backend/snmp-supplies.c create mode 100644 backend/snmp.c create mode 100644 backend/snmp.txt create mode 100644 backend/socket.c create mode 100644 backend/test1284.c create mode 100644 backend/testbackend.c create mode 100644 backend/testsupplies.c create mode 100644 backend/usb-darwin.c create mode 100644 backend/usb-libusb.c create mode 100644 backend/usb-unix.c create mode 100644 backend/usb.c create mode 100644 berkeley/Dependencies create mode 100644 berkeley/Makefile create mode 100644 berkeley/lpc.c create mode 100644 berkeley/lpq.c create mode 100644 berkeley/lpr.c create mode 100644 berkeley/lprm.c create mode 100644 cgi-bin/Dependencies create mode 100644 cgi-bin/Makefile create mode 100644 cgi-bin/admin.c create mode 100644 cgi-bin/api-cgi.header create mode 100644 cgi-bin/api-cgi.shtml create mode 100644 cgi-bin/cgi-private.h create mode 100644 cgi-bin/cgi.h create mode 100644 cgi-bin/classes.c create mode 100644 cgi-bin/help-index.c create mode 100644 cgi-bin/help-index.h create mode 100644 cgi-bin/help.c create mode 100644 cgi-bin/html.c create mode 100644 cgi-bin/ipp-var.c create mode 100644 cgi-bin/jobs.c create mode 100644 cgi-bin/libcupscgi.exp create mode 100644 cgi-bin/makedocset.c create mode 100644 cgi-bin/multipart.dat create mode 100644 cgi-bin/printers.c create mode 100644 cgi-bin/search.c create mode 100644 cgi-bin/template.c create mode 100644 cgi-bin/testcgi.c create mode 100644 cgi-bin/testhi.c create mode 100644 cgi-bin/testhi.html create mode 100644 cgi-bin/testtemplate.c create mode 100644 cgi-bin/var.c create mode 100644 cgi-bin/websearch.c create mode 100644 conf/Makefile create mode 100644 conf/cupsd.conf.in create mode 100644 conf/mime.convs.in create mode 100644 conf/mime.types create mode 100644 conf/pam.opendirectory create mode 100644 conf/pam.securityserver create mode 100644 conf/pam.std.in create mode 100644 conf/snmp.conf.in create mode 100644 config-scripts/cups-3264.m4 create mode 100644 config-scripts/cups-common.m4 create mode 100644 config-scripts/cups-compiler.m4 create mode 100644 config-scripts/cups-defaults.m4 create mode 100644 config-scripts/cups-directories.m4 create mode 100644 config-scripts/cups-dnssd.m4 create mode 100644 config-scripts/cups-gssapi.m4 create mode 100644 config-scripts/cups-image.m4 create mode 100644 config-scripts/cups-largefile.m4 create mode 100644 config-scripts/cups-launchd.m4 create mode 100644 config-scripts/cups-ldap.m4 create mode 100644 config-scripts/cups-libtool.m4 create mode 100644 config-scripts/cups-manpages.m4 create mode 100644 config-scripts/cups-network.m4 create mode 100644 config-scripts/cups-opsys.m4 create mode 100644 config-scripts/cups-pam.m4 create mode 100644 config-scripts/cups-pdf.m4 create mode 100644 config-scripts/cups-poll.m4 create mode 100644 config-scripts/cups-scripting.m4 create mode 100644 config-scripts/cups-sharedlibs.m4 create mode 100644 config-scripts/cups-slp.m4 create mode 100644 config-scripts/cups-ssl.m4 create mode 100644 config-scripts/cups-threads.m4 create mode 100644 config.h.in create mode 100755 configure create mode 100644 configure.in create mode 100755 cups-config.in create mode 100644 cups.manifest create mode 100644 cups/Dependencies create mode 100644 cups/Makefile create mode 100644 cups/adminutil.c create mode 100644 cups/adminutil.h create mode 100644 cups/api-array.header create mode 100644 cups/api-array.shtml create mode 100644 cups/api-cups.header create mode 100644 cups/api-cups.shtml create mode 100644 cups/api-filedir.header create mode 100644 cups/api-filedir.shtml create mode 100644 cups/api-filter.header create mode 100644 cups/api-filter.shtml create mode 100644 cups/api-httpipp.header create mode 100644 cups/api-httpipp.shtml create mode 100644 cups/api-overview.header create mode 100644 cups/api-overview.shtml create mode 100644 cups/api-ppd.header create mode 100644 cups/api-ppd.shtml create mode 100644 cups/array-private.h create mode 100644 cups/array.c create mode 100644 cups/array.h create mode 100644 cups/attr.c create mode 100644 cups/auth.c create mode 100644 cups/backchannel.c create mode 100644 cups/backend.c create mode 100644 cups/backend.h create mode 100644 cups/conflicts.c create mode 100644 cups/cups-private.h create mode 100644 cups/cups.h create mode 100644 cups/custom.c create mode 100644 cups/debug-private.h create mode 100644 cups/debug.c create mode 100644 cups/dest.c create mode 100644 cups/dir.c create mode 100644 cups/dir.h create mode 100644 cups/emit.c create mode 100644 cups/encode.c create mode 100644 cups/file-private.h create mode 100644 cups/file.c create mode 100644 cups/file.h create mode 100644 cups/getdevices.c create mode 100644 cups/getifaddrs.c create mode 100644 cups/getputfile.c create mode 100644 cups/globals.c create mode 100644 cups/http-addr.c create mode 100644 cups/http-addrlist.c create mode 100644 cups/http-private.h create mode 100644 cups/http-support.c create mode 100644 cups/http.c create mode 100644 cups/http.h create mode 100644 cups/ipp-private.h create mode 100644 cups/ipp-support.c create mode 100644 cups/ipp.c create mode 100644 cups/ipp.h create mode 100644 cups/langprintf.c create mode 100644 cups/language-private.h create mode 100644 cups/language.c create mode 100644 cups/language.h create mode 100644 cups/libcups2.def create mode 100644 cups/libcups2.rc create mode 100644 cups/libcups_s.exp create mode 100644 cups/localize.c create mode 100644 cups/mark.c create mode 100644 cups/md5-private.h create mode 100644 cups/md5.c create mode 100644 cups/md5passwd.c create mode 100644 cups/notify.c create mode 100644 cups/options.c create mode 100644 cups/page.c create mode 100644 cups/ppd-cache.c create mode 100644 cups/ppd-private.h create mode 100644 cups/ppd.c create mode 100644 cups/ppd.h create mode 100644 cups/pwg-media.c create mode 100644 cups/pwg-private.h create mode 100644 cups/raster.h create mode 100644 cups/request.c create mode 100644 cups/sidechannel.c create mode 100644 cups/sidechannel.h create mode 100644 cups/snmp-private.h create mode 100644 cups/snmp.c create mode 100644 cups/snprintf.c create mode 100644 cups/sspi-private.h create mode 100644 cups/sspi.c create mode 100644 cups/string-private.h create mode 100644 cups/string.c create mode 100644 cups/tempfile.c create mode 100644 cups/test.ppd create mode 100644 cups/test2.ppd create mode 100644 cups/testadmin.c create mode 100644 cups/testarray.c create mode 100644 cups/testconflicts.c create mode 100644 cups/testcups.c create mode 100644 cups/testfile.c create mode 100644 cups/testhttp.c create mode 100644 cups/testi18n.c create mode 100644 cups/testipp.c create mode 100644 cups/testlang.c create mode 100644 cups/testoptions.c create mode 100644 cups/testppd.c create mode 100644 cups/testpwg.c create mode 100644 cups/testsnmp.c create mode 100644 cups/thread-private.h create mode 100644 cups/thread.c create mode 100644 cups/transcode.c create mode 100644 cups/transcode.h create mode 100644 cups/usersys.c create mode 100644 cups/utf8demo.txt create mode 100644 cups/util.c create mode 100644 cups/versioning.h create mode 100644 data/Makefile create mode 100644 data/classified create mode 100644 data/confidential create mode 100644 data/cups.irix create mode 100644 data/cups.pam create mode 100644 data/cups.suse create mode 100644 data/epson.h create mode 100644 data/escp.h create mode 100644 data/font.defs create mode 100644 data/hp.h create mode 100644 data/label.h create mode 100644 data/media.defs create mode 100644 data/pcl.h create mode 100644 data/psglyphs create mode 100644 data/raster.defs create mode 100644 data/secret create mode 100644 data/smiley.ps create mode 100644 data/standard create mode 100644 data/testprint.in create mode 100644 data/topsecret create mode 100644 data/unclassified create mode 100644 data/utf-8 create mode 100644 debian/HOWTO_BUGREPORT.txt create mode 100644 debian/README.Debian create mode 100644 debian/README.source create mode 100644 debian/changelog create mode 100644 debian/client.conf create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100644 debian/cups-bsd.config create mode 100644 debian/cups-bsd.install create mode 100644 debian/cups-bsd.postinst create mode 100644 debian/cups-bsd.postrm create mode 100644 debian/cups-bsd.preinst create mode 100644 debian/cups-bsd.prerm create mode 100644 debian/cups-bsd.templates create mode 100644 debian/cups-client.install create mode 100644 debian/cups-client.postinst create mode 100644 debian/cups-client.preinst create mode 100644 debian/cups-common.install create mode 100644 debian/cups-ppdc.install create mode 100644 debian/cups.config create mode 100644 debian/cups.default create mode 100644 debian/cups.dirs create mode 100644 debian/cups.doc-base create mode 100644 debian/cups.docs create mode 100644 debian/cups.examples create mode 100644 debian/cups.init.d create mode 100644 debian/cups.install create mode 100644 debian/cups.lintian-overrides create mode 100644 debian/cups.logrotate create mode 100644 debian/cups.pam create mode 100644 debian/cups.postinst create mode 100644 debian/cups.postrm create mode 100644 debian/cups.preinst create mode 100644 debian/cups.prerm create mode 100644 debian/cups.templates create mode 100644 debian/cups.triggers create mode 100644 debian/libcups2-dev.examples create mode 100644 debian/libcups2-dev.install create mode 100644 debian/libcups2-dev.preinst create mode 100644 debian/libcups2.examples create mode 100644 debian/libcups2.install create mode 100644 debian/libcups2.symbols create mode 100644 debian/libcupscgi1-dev.install create mode 100644 debian/libcupscgi1.install create mode 100644 debian/libcupscgi1.symbols create mode 100644 debian/libcupsdriver1-dev.install create mode 100644 debian/libcupsdriver1.install create mode 100644 debian/libcupsdriver1.symbols create mode 100644 debian/libcupsimage2-dev.install create mode 100644 debian/libcupsimage2-dev.preinst create mode 100644 debian/libcupsimage2.install create mode 100644 debian/libcupsimage2.preinst create mode 100644 debian/libcupsimage2.symbols create mode 100644 debian/libcupsmime1-dev.install create mode 100644 debian/libcupsmime1.install create mode 100644 debian/libcupsmime1.symbols create mode 100644 debian/libcupsppdc1-dev.install create mode 100644 debian/libcupsppdc1.install create mode 100644 debian/libcupsppdc1.symbols create mode 100644 debian/local/apparmor-profile create mode 100644 debian/local/apport-hook.py create mode 100644 debian/local/cups.ufw.profile create mode 100755 debian/local/cups.upstart create mode 100644 debian/patches/add-ipp-backend-of-cups-1.4.patch create mode 100644 debian/patches/airprint-support.patch create mode 100644 debian/patches/colord-support.patch create mode 100644 debian/patches/confdirperms.patch create mode 100644 debian/patches/configure-default-browse-protocols.patch create mode 100644 debian/patches/cups-avahi.patch create mode 100644 debian/patches/cups-deviced-allow-device-ids-with-newline.patch create mode 100644 debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch create mode 100644 debian/patches/default_log_settings.patch create mode 100644 debian/patches/dnssd-reg-array-linear-search.patch create mode 100644 debian/patches/do-not-broadcast-with-hostnames.patch create mode 100644 debian/patches/drop_unnecessary_dependencies.patch create mode 100644 debian/patches/install-sh-remove-bashism.patch create mode 100644 debian/patches/ipp-backend-cups-1.5.4-fixes.patch create mode 100644 debian/patches/log-debug-history-nearly-unlimited.patch create mode 100644 debian/patches/logfiles_adm_readable.patch create mode 100644 debian/patches/manpage-translations.patch create mode 100644 debian/patches/no-conffile-timestamp.patch create mode 100644 debian/patches/pidfile.patch create mode 100644 debian/patches/ppd-poll-with-client-conf.patch create mode 100644 debian/patches/ppdc-dynamic-linking.patch create mode 100644 debian/patches/printer-filtering.patch create mode 100644 debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch create mode 100644 debian/patches/reactivate_recommended_driver.patch create mode 100644 debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch create mode 100644 debian/patches/removecvstag.patch create mode 100644 debian/patches/rootbackends-worldreadable.patch create mode 100644 debian/patches/series create mode 100644 debian/patches/show-compile-command-lines.patch create mode 100644 debian/patches/test-i18n-nonlinux.patch create mode 100644 debian/patches/tests-ignore-usb-crash.patch create mode 100644 debian/patches/tests-ignore-warnings.patch create mode 100644 debian/patches/tests-slow-lpstat.patch create mode 100644 debian/patches/ubuntu/ubuntu-default-error-policy-retry-job.patch create mode 100644 debian/patches/ubuntu/ubuntu-disable-browsing.patch create mode 100644 debian/patches/usb-backend-busy-loop-fix.patch create mode 100644 debian/patches/usb-backend-detach-usblp-earlier-crash-guards.patch create mode 100644 debian/patches/usb-backend-further-enhancements.patch create mode 100644 debian/patches/usb-backend-initialize-usblp-attached-state.patch create mode 100644 debian/po/POTFILES.in create mode 100644 debian/po/ca.po create mode 100644 debian/po/cs.po create mode 100644 debian/po/da.po create mode 100644 debian/po/de.po create mode 100644 debian/po/es.po create mode 100644 debian/po/eu.po create mode 100644 debian/po/fi.po create mode 100644 debian/po/fr.po create mode 100644 debian/po/gl.po create mode 100644 debian/po/it.po create mode 100644 debian/po/ja.po create mode 100644 debian/po/ml.po create mode 100644 debian/po/nb.po create mode 100644 debian/po/nl.po create mode 100644 debian/po/pl.po create mode 100644 debian/po/pt.po create mode 100644 debian/po/pt_BR.po create mode 100644 debian/po/ro.po create mode 100644 debian/po/ru.po create mode 100644 debian/po/sk.po create mode 100644 debian/po/sr.po create mode 100644 debian/po/sr@latin.po create mode 100644 debian/po/sv.po create mode 100644 debian/po/templates.pot create mode 100644 debian/po/tr.po create mode 100644 debian/po/vi.po create mode 100644 debian/presubj create mode 100644 debian/printer.schema create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 debian/source/options create mode 100644 debian/watch create mode 100644 desktop/Makefile create mode 100644 desktop/cups-128.png create mode 100644 desktop/cups-16.png create mode 100644 desktop/cups-256.png create mode 100644 desktop/cups-32.png create mode 100644 desktop/cups-512.png create mode 100644 desktop/cups-64.png create mode 100644 desktop/cups.conf create mode 100644 desktop/cups.desktop.in create mode 100644 desktop/cups.icns create mode 100644 desktop/cups.svg create mode 100644 doc/Makefile create mode 100644 doc/cups-printable.css create mode 100644 doc/cups.css create mode 100644 doc/de/index.html.in create mode 100644 doc/es/index.html.in create mode 100644 doc/eu/index.html.in create mode 100644 doc/fr/index.html.in create mode 100644 doc/help/accounting.html create mode 100644 doc/help/api-array.html create mode 100644 doc/help/api-cgi.html create mode 100644 doc/help/api-cups.html create mode 100644 doc/help/api-driver.html create mode 100644 doc/help/api-filedir.html create mode 100644 doc/help/api-filter.html create mode 100644 doc/help/api-httpipp.html create mode 100644 doc/help/api-mime.html create mode 100644 doc/help/api-overview.html create mode 100644 doc/help/api-ppd.html create mode 100644 doc/help/api-ppdc.html create mode 100644 doc/help/api-raster.html create mode 100644 doc/help/cgi.html create mode 100644 doc/help/glossary.html create mode 100644 doc/help/kerberos.html create mode 100644 doc/help/license.html create mode 100644 doc/help/network.html create mode 100644 doc/help/options.html create mode 100644 doc/help/overview.html create mode 100644 doc/help/policies.html create mode 100644 doc/help/postscript-driver.html create mode 100644 doc/help/ppd-compiler.html create mode 100644 doc/help/raster-driver.html create mode 100644 doc/help/ref-access_log.html create mode 100644 doc/help/ref-classes-conf.html create mode 100644 doc/help/ref-client-conf.html create mode 100644 doc/help/ref-cupsd-conf.html.in create mode 100644 doc/help/ref-error_log.html create mode 100644 doc/help/ref-mailto-conf.html create mode 100644 doc/help/ref-page_log.html create mode 100644 doc/help/ref-ppdcfile.html create mode 100644 doc/help/ref-printers-conf.html create mode 100644 doc/help/ref-snmp-conf.html create mode 100644 doc/help/ref-subscriptions-conf.html create mode 100644 doc/help/security.html create mode 100644 doc/help/sharing.html create mode 100644 doc/help/spec-banner.html create mode 100644 doc/help/spec-browsing.html create mode 100644 doc/help/spec-cmp.html create mode 100644 doc/help/spec-command.html create mode 100644 doc/help/spec-design.html create mode 100644 doc/help/spec-ipp.html create mode 100644 doc/help/spec-pdf.html create mode 100644 doc/help/spec-postscript.html create mode 100644 doc/help/spec-ppd.html create mode 100644 doc/help/spec-raster.html create mode 100644 doc/help/spec-stp.html create mode 100644 doc/help/standard.html.in create mode 100644 doc/help/translation.html create mode 100644 doc/help/whatsnew.html create mode 100755 doc/hu/index.html.in create mode 100644 doc/id/index.html.in create mode 100644 doc/images/color-wheel.png create mode 100644 doc/images/cups-block-diagram.png create mode 100644 doc/images/cups-block-diagram.svg create mode 100644 doc/images/cups-command-chain.png create mode 100644 doc/images/cups-command-chain.svg create mode 100644 doc/images/cups-icon.png create mode 100644 doc/images/cups-postscript-chain.png create mode 100644 doc/images/cups-postscript-chain.svg create mode 100644 doc/images/cups-raster-chain.png create mode 100644 doc/images/cups-raster-chain.svg create mode 100644 doc/images/cups.png create mode 100644 doc/images/cups.svg create mode 100644 doc/images/generic.png create mode 100644 doc/images/left.gif create mode 100644 doc/images/left.xcf.gz create mode 100644 doc/images/raster-organization.png create mode 100644 doc/images/raster-organization.svg create mode 100644 doc/images/raster.png create mode 100644 doc/images/raster.svg create mode 100644 doc/images/right.gif create mode 100644 doc/images/sample-image.png create mode 100644 doc/images/sel.gif create mode 100644 doc/images/smiley.jpg create mode 100644 doc/images/unsel.gif create mode 100644 doc/images/wait.gif create mode 100644 doc/images/webinterface.png create mode 100644 doc/index.html.in create mode 100644 doc/it/index.html.in create mode 100644 doc/ja/index.html.in create mode 100644 doc/pl/index.html.in create mode 100644 doc/robots.txt create mode 100644 doc/ru/index.html.in create mode 100644 driver/Dependencies create mode 100644 driver/Makefile create mode 100644 driver/api-driver.header create mode 100644 driver/api-driver.shtml create mode 100644 driver/attr.c create mode 100644 driver/check.c create mode 100644 driver/cmyk.c create mode 100644 driver/commandtoescpx.c create mode 100644 driver/commandtopclx.c create mode 100644 driver/dither.c create mode 100644 driver/driver.h create mode 100644 driver/image.pgm create mode 100644 driver/image.ppm create mode 100644 driver/libcupsdriver.exp create mode 100644 driver/lut.c create mode 100644 driver/pack.c create mode 100644 driver/pcl-common.c create mode 100644 driver/pcl-common.h create mode 100644 driver/rastertoescpx.c create mode 100644 driver/rastertopclx.c create mode 100644 driver/rgb.c create mode 100644 driver/srgb.c create mode 100644 driver/testcmyk.c create mode 100644 driver/testdither.c create mode 100644 driver/testdriver.c create mode 100644 driver/testrgb.c create mode 100644 examples/Makefile create mode 100644 examples/color.drv create mode 100644 examples/constraint.drv create mode 100644 examples/custom.drv create mode 100644 examples/grouping.drv create mode 100644 examples/laserjet-basic.drv create mode 100644 examples/laserjet-pjl.drv create mode 100644 examples/minimum.drv create mode 100644 examples/postscript.drv create mode 100644 examples/r300-basic.drv create mode 100644 examples/r300-colorman.drv create mode 100644 examples/r300-remote.drv create mode 100644 filter/Dependencies create mode 100644 filter/Makefile create mode 100644 filter/api-raster.header create mode 100644 filter/api-raster.shtml create mode 100644 filter/bannertops.c create mode 100644 filter/commandtops.c create mode 100644 filter/common.c create mode 100644 filter/common.h create mode 100644 filter/error.c create mode 100644 filter/gziptoany.c create mode 100644 filter/image-bmp.c create mode 100644 filter/image-colorspace.c create mode 100644 filter/image-gif.c create mode 100644 filter/image-jpeg.c create mode 100644 filter/image-photocd.c create mode 100644 filter/image-pix.c create mode 100644 filter/image-png.c create mode 100644 filter/image-pnm.c create mode 100644 filter/image-private.h create mode 100644 filter/image-sgi.c create mode 100644 filter/image-sgi.h create mode 100644 filter/image-sgilib.c create mode 100644 filter/image-sun.c create mode 100644 filter/image-tiff.c create mode 100644 filter/image-zoom.c create mode 100644 filter/image.c create mode 100644 filter/image.h create mode 100644 filter/imagetops.c create mode 100644 filter/imagetoraster.c create mode 100644 filter/interpret.c create mode 100644 filter/libcupsimage2.def create mode 100644 filter/libcupsimage_s.exp create mode 100644 filter/pdftops.c create mode 100644 filter/postscript-driver.header create mode 100644 filter/postscript-driver.shtml create mode 100644 filter/ppd-compiler.header create mode 100644 filter/ppd-compiler.shtml create mode 100644 filter/pstext.c create mode 100644 filter/pstext.h create mode 100644 filter/pstops.c create mode 100644 filter/raster-driver.header create mode 100644 filter/raster-driver.shtml create mode 100644 filter/raster.c create mode 100644 filter/rasterbench.c create mode 100644 filter/rastertoepson.c create mode 100644 filter/rastertohp.c create mode 100644 filter/rastertolabel.c create mode 100644 filter/rastertopwg.c create mode 100644 filter/spec-ppd.header create mode 100644 filter/spec-ppd.shtml create mode 100644 filter/testimage.c create mode 100644 filter/testraster.c create mode 100644 filter/textcommon.c create mode 100644 filter/textcommon.h create mode 100644 filter/texttops.c create mode 100644 fonts/Makefile create mode 100644 fonts/Monospace create mode 100644 fonts/Monospace-Bold create mode 100644 fonts/Monospace-BoldOblique create mode 100644 fonts/Monospace-Oblique create mode 100755 install-sh create mode 100644 locale/Dependencies create mode 100644 locale/Makefile create mode 100644 locale/checkpo.c create mode 100644 locale/cups.footer create mode 100644 locale/cups.header create mode 100644 locale/cups.pot create mode 100644 locale/cups.strings create mode 100644 locale/cups_da.po create mode 100644 locale/cups_de.po create mode 100644 locale/cups_es.po create mode 100644 locale/cups_eu.po create mode 100644 locale/cups_fi.po create mode 100644 locale/cups_fr.po create mode 100644 locale/cups_hu.po create mode 100644 locale/cups_id.po create mode 100644 locale/cups_it.po create mode 100644 locale/cups_ja.po create mode 100644 locale/cups_ko.po create mode 100644 locale/cups_nl.po create mode 100644 locale/cups_no.po create mode 100644 locale/cups_pl.po create mode 100644 locale/cups_pt.po create mode 100644 locale/cups_pt_BR.po create mode 100644 locale/cups_ru.po create mode 100644 locale/cups_sv.po create mode 100644 locale/cups_zh.po create mode 100644 locale/cups_zh_TW.po create mode 100644 locale/locale.txt create mode 100644 locale/po2strings.c create mode 100644 locale/strings2po.c create mode 100644 locale/translate.c create mode 100644 man/Makefile create mode 100644 man/Makefile.l10n create mode 100644 man/backend.man create mode 100644 man/cancel.man create mode 100644 man/classes.conf.man create mode 100644 man/client.conf.man.in create mode 100644 man/cups-config.man create mode 100644 man/cups-deviced.man.in create mode 100644 man/cups-driverd.man.in create mode 100644 man/cups-lpd.man.in create mode 100644 man/cups-polld.man create mode 100644 man/cups-snmp.conf.man create mode 100644 man/cupsaccept.man create mode 100644 man/cupsaddsmb.man.in create mode 100644 man/cupsctl.man create mode 100644 man/cupsd.conf.man.in create mode 100644 man/cupsd.man.in create mode 100644 man/cupsenable.man create mode 100644 man/cupsfilter.man create mode 100644 man/cupstestdsc.man create mode 100644 man/cupstestppd.man create mode 100644 man/de/Makefile create mode 100644 man/filter.man create mode 100644 man/fr/Makefile create mode 100644 man/ipptool.man create mode 100644 man/ipptoolfile.man create mode 100644 man/lp.man create mode 100644 man/lpadmin.man create mode 100644 man/lpc.man create mode 100644 man/lpinfo.man create mode 100644 man/lpmove.man create mode 100644 man/lpoptions.man.in create mode 100644 man/lppasswd.man create mode 100644 man/lpq.man create mode 100644 man/lpr.man create mode 100644 man/lprm.man create mode 100644 man/lpstat.man create mode 100644 man/mailto.conf.man create mode 100644 man/mantohtml.c create mode 100644 man/mime.convs.man create mode 100644 man/mime.types.man create mode 100644 man/notifier.man create mode 100644 man/po4a/cups.cfg create mode 100644 man/po4a/po/de.po create mode 100644 man/po4a/po/fr.po create mode 100644 man/ppdc.man create mode 100644 man/ppdcfile.man create mode 100644 man/ppdhtml.man create mode 100644 man/ppdi.man create mode 100644 man/ppdmerge.man create mode 100644 man/ppdpo.man create mode 100644 man/printers.conf.man create mode 100644 man/subscriptions.conf.man create mode 100644 monitor/Dependencies create mode 100644 monitor/Makefile create mode 100644 monitor/bcp.c create mode 100644 monitor/tbcp.c create mode 100644 notifier/Dependencies create mode 100644 notifier/Makefile create mode 100644 notifier/dbus.c create mode 100644 notifier/mailto.c create mode 100644 notifier/rss.c create mode 100644 notifier/testnotify.c create mode 100755 packaging/InstallationCheck create mode 100644 packaging/LICENSE.rtf create mode 100644 packaging/WELCOME.rtf create mode 100644 packaging/cups-desc.plist.in create mode 100644 packaging/cups-info.plist.in create mode 100644 packaging/cups.list.in create mode 100644 packaging/cups.spec create mode 100644 packaging/cups.spec.in create mode 100644 packaging/installer.gif create mode 100644 packaging/installer.tif create mode 100644 ppdc/Dependencies create mode 100644 ppdc/Makefile create mode 100644 ppdc/api-ppdc.header create mode 100644 ppdc/api-ppdc.shtml create mode 100644 ppdc/foo-fr.po create mode 100644 ppdc/foo.drv create mode 100644 ppdc/genstrings.cxx create mode 100644 ppdc/ppdc-array.cxx create mode 100644 ppdc/ppdc-attr.cxx create mode 100644 ppdc/ppdc-catalog.cxx create mode 100644 ppdc/ppdc-choice.cxx create mode 100644 ppdc/ppdc-constraint.cxx create mode 100644 ppdc/ppdc-driver.cxx create mode 100644 ppdc/ppdc-file.cxx create mode 100644 ppdc/ppdc-filter.cxx create mode 100644 ppdc/ppdc-font.cxx create mode 100644 ppdc/ppdc-group.cxx create mode 100644 ppdc/ppdc-import.cxx create mode 100644 ppdc/ppdc-mediasize.cxx create mode 100644 ppdc/ppdc-message.cxx create mode 100644 ppdc/ppdc-option.cxx create mode 100644 ppdc/ppdc-private.h create mode 100644 ppdc/ppdc-profile.cxx create mode 100644 ppdc/ppdc-shared.cxx create mode 100644 ppdc/ppdc-source.cxx create mode 100644 ppdc/ppdc-string.cxx create mode 100644 ppdc/ppdc-variable.cxx create mode 100644 ppdc/ppdc.cxx create mode 100644 ppdc/ppdc.h create mode 100644 ppdc/ppdhtml.cxx create mode 100644 ppdc/ppdi.cxx create mode 100644 ppdc/ppdmerge.cxx create mode 100644 ppdc/ppdpo.cxx create mode 100644 ppdc/sample.drv create mode 100644 ppdc/testcatalog.cxx create mode 100644 scheduler/Dependencies create mode 100644 scheduler/Makefile create mode 100644 scheduler/api-mime.header create mode 100644 scheduler/api-mime.shtml create mode 100644 scheduler/auth.c create mode 100644 scheduler/auth.h create mode 100644 scheduler/avahi.c create mode 100644 scheduler/avahi.h create mode 100644 scheduler/banners.c create mode 100644 scheduler/banners.h create mode 100644 scheduler/cert.c create mode 100644 scheduler/cert.h create mode 100644 scheduler/classes.c create mode 100644 scheduler/classes.h create mode 100644 scheduler/client.c create mode 100644 scheduler/client.h create mode 100644 scheduler/colord.c create mode 100644 scheduler/colord.h create mode 100644 scheduler/conf.c create mode 100644 scheduler/conf.h create mode 100644 scheduler/cups-deviced.c create mode 100644 scheduler/cups-driverd.cxx create mode 100644 scheduler/cups-exec.c create mode 100644 scheduler/cups-lpd.c create mode 100644 scheduler/cups-lpd.xinetd.in create mode 100644 scheduler/cups-polld.c create mode 100644 scheduler/cups.sh.in create mode 100644 scheduler/cups.xml.in create mode 100644 scheduler/cupsd.h create mode 100644 scheduler/cupsfilter.c create mode 100644 scheduler/dirsvc.c create mode 100644 scheduler/dirsvc.h create mode 100644 scheduler/env.c create mode 100644 scheduler/file.c create mode 100644 scheduler/filter.c create mode 100644 scheduler/ipp.c create mode 100644 scheduler/job.c create mode 100644 scheduler/job.h create mode 100644 scheduler/libcupsmime.exp create mode 100644 scheduler/listen.c create mode 100644 scheduler/log.c create mode 100644 scheduler/main.c create mode 100644 scheduler/mime-private.h create mode 100644 scheduler/mime.c create mode 100644 scheduler/mime.h create mode 100644 scheduler/network.c create mode 100644 scheduler/network.h create mode 100644 scheduler/org.cups.cups-lpd.plist.in create mode 100644 scheduler/org.cups.cupsd.plist create mode 100644 scheduler/policy.c create mode 100644 scheduler/policy.h create mode 100644 scheduler/printers.c create mode 100644 scheduler/printers.h create mode 100644 scheduler/process.c create mode 100644 scheduler/quotas.c create mode 100644 scheduler/select.c create mode 100644 scheduler/server.c create mode 100644 scheduler/statbuf.c create mode 100644 scheduler/statbuf.h create mode 100644 scheduler/subscriptions.c create mode 100644 scheduler/subscriptions.h create mode 100644 scheduler/sysman.c create mode 100644 scheduler/sysman.h create mode 100644 scheduler/testdirsvc.c create mode 100644 scheduler/testlpd.c create mode 100644 scheduler/testmime.c create mode 100644 scheduler/testspeed.c create mode 100644 scheduler/testsub.c create mode 100644 scheduler/timeout.c create mode 100644 scheduler/type.c create mode 100644 scheduler/util.c create mode 100644 scheduler/util.h create mode 100644 scripting/perl/CUPS.pm create mode 100644 scripting/perl/CUPS.xs create mode 100644 scripting/perl/Makefile.PL create mode 100644 scripting/perl/README create mode 100644 scripting/perl/test.pl create mode 100644 scripting/php/Dependencies create mode 100644 scripting/php/Makefile create mode 100644 scripting/php/README create mode 100644 scripting/php/phpcups.c create mode 100644 scripting/php/phpcups.h create mode 100755 scripting/php/phpcups.php create mode 100644 systemv/Dependencies create mode 100644 systemv/Makefile create mode 100644 systemv/cancel.c create mode 100644 systemv/cupsaccept.c create mode 100644 systemv/cupsaddsmb.c create mode 100644 systemv/cupsctl.c create mode 100644 systemv/cupstestdsc.c create mode 100644 systemv/cupstestppd.c create mode 100644 systemv/lp.c create mode 100644 systemv/lpadmin.c create mode 100644 systemv/lpinfo.c create mode 100644 systemv/lpmove.c create mode 100644 systemv/lpoptions.c create mode 100644 systemv/lppasswd.c create mode 100644 systemv/lpstat.c create mode 100644 templates/Makefile create mode 100644 templates/add-class.tmpl create mode 100644 templates/add-printer.tmpl create mode 100644 templates/add-rss-subscription.tmpl create mode 100644 templates/admin.tmpl create mode 100644 templates/choose-device.tmpl create mode 100644 templates/choose-make.tmpl create mode 100644 templates/choose-model.tmpl create mode 100644 templates/choose-serial.tmpl create mode 100644 templates/choose-uri.tmpl create mode 100644 templates/class-added.tmpl create mode 100644 templates/class-confirm.tmpl create mode 100644 templates/class-deleted.tmpl create mode 100644 templates/class-jobs-header.tmpl create mode 100644 templates/class-modified.tmpl create mode 100644 templates/class.tmpl create mode 100644 templates/classes-header.tmpl create mode 100644 templates/classes.tmpl create mode 100644 templates/command.tmpl create mode 100644 templates/de/add-class.tmpl create mode 100644 templates/de/add-printer.tmpl create mode 100644 templates/de/add-rss-subscription.tmpl create mode 100644 templates/de/admin.tmpl create mode 100644 templates/de/choose-device.tmpl create mode 100644 templates/de/choose-make.tmpl create mode 100644 templates/de/choose-model.tmpl create mode 100644 templates/de/choose-serial.tmpl create mode 100644 templates/de/choose-uri.tmpl create mode 100644 templates/de/class-added.tmpl create mode 100644 templates/de/class-confirm.tmpl create mode 100644 templates/de/class-deleted.tmpl create mode 100644 templates/de/class-jobs-header.tmpl create mode 100644 templates/de/class-modified.tmpl create mode 100644 templates/de/class.tmpl create mode 100644 templates/de/classes-header.tmpl create mode 100644 templates/de/classes.tmpl create mode 100644 templates/de/command.tmpl create mode 100644 templates/de/edit-config.tmpl create mode 100644 templates/de/error-op.tmpl create mode 100644 templates/de/error.tmpl create mode 100644 templates/de/header.tmpl.in create mode 100644 templates/de/help-header.tmpl create mode 100644 templates/de/help-printable.tmpl create mode 100644 templates/de/help-trailer.tmpl create mode 100644 templates/de/job-cancel.tmpl create mode 100644 templates/de/job-hold.tmpl create mode 100644 templates/de/job-move.tmpl create mode 100644 templates/de/job-moved.tmpl create mode 100644 templates/de/job-release.tmpl create mode 100644 templates/de/job-restart.tmpl create mode 100644 templates/de/jobs-header.tmpl create mode 100644 templates/de/jobs.tmpl create mode 100644 templates/de/list-available-printers.tmpl create mode 100644 templates/de/modify-class.tmpl create mode 100644 templates/de/modify-printer.tmpl create mode 100644 templates/de/norestart.tmpl create mode 100644 templates/de/option-boolean.tmpl create mode 100644 templates/de/option-conflict.tmpl create mode 100644 templates/de/option-header.tmpl create mode 100644 templates/de/option-pickmany.tmpl create mode 100644 templates/de/option-pickone.tmpl create mode 100644 templates/de/option-trailer.tmpl create mode 100644 templates/de/pager.tmpl create mode 100644 templates/de/printer-accept.tmpl create mode 100644 templates/de/printer-added.tmpl create mode 100644 templates/de/printer-configured.tmpl create mode 100644 templates/de/printer-confirm.tmpl create mode 100644 templates/de/printer-default.tmpl create mode 100644 templates/de/printer-deleted.tmpl create mode 100644 templates/de/printer-jobs-header.tmpl create mode 100644 templates/de/printer-modified.tmpl create mode 100644 templates/de/printer-purge.tmpl create mode 100644 templates/de/printer-reject.tmpl create mode 100644 templates/de/printer-start.tmpl create mode 100644 templates/de/printer-stop.tmpl create mode 100644 templates/de/printer.tmpl create mode 100644 templates/de/printers-header.tmpl create mode 100644 templates/de/printers.tmpl create mode 100644 templates/de/restart.tmpl create mode 100644 templates/de/samba-export.tmpl create mode 100644 templates/de/samba-exported.tmpl create mode 100644 templates/de/search.tmpl create mode 100644 templates/de/set-printer-options-header.tmpl create mode 100644 templates/de/set-printer-options-trailer.tmpl create mode 100644 templates/de/subscription-added.tmpl create mode 100644 templates/de/subscription-canceled.tmpl create mode 100644 templates/de/test-page.tmpl create mode 100644 templates/de/trailer.tmpl create mode 100644 templates/de/users.tmpl create mode 100644 templates/edit-config.tmpl create mode 100644 templates/error-op.tmpl create mode 100644 templates/error.tmpl create mode 100644 templates/es/add-class.tmpl create mode 100644 templates/es/add-printer.tmpl create mode 100644 templates/es/add-rss-subscription.tmpl create mode 100644 templates/es/admin.tmpl create mode 100644 templates/es/choose-device.tmpl create mode 100644 templates/es/choose-make.tmpl create mode 100644 templates/es/choose-model.tmpl create mode 100644 templates/es/choose-serial.tmpl create mode 100644 templates/es/choose-uri.tmpl create mode 100644 templates/es/class-added.tmpl create mode 100644 templates/es/class-confirm.tmpl create mode 100644 templates/es/class-deleted.tmpl create mode 100644 templates/es/class-jobs-header.tmpl create mode 100644 templates/es/class-modified.tmpl create mode 100644 templates/es/class.tmpl create mode 100644 templates/es/classes-header.tmpl create mode 100644 templates/es/classes.tmpl create mode 100644 templates/es/command.tmpl create mode 100644 templates/es/edit-config.tmpl create mode 100644 templates/es/error-op.tmpl create mode 100644 templates/es/error.tmpl create mode 100644 templates/es/header.tmpl.in create mode 100644 templates/es/help-header.tmpl create mode 100644 templates/es/help-printable.tmpl create mode 100644 templates/es/help-trailer.tmpl create mode 100644 templates/es/job-cancel.tmpl create mode 100644 templates/es/job-hold.tmpl create mode 100644 templates/es/job-move.tmpl create mode 100644 templates/es/job-moved.tmpl create mode 100644 templates/es/job-release.tmpl create mode 100644 templates/es/job-restart.tmpl create mode 100644 templates/es/jobs-header.tmpl create mode 100644 templates/es/jobs.tmpl create mode 100644 templates/es/list-available-printers.tmpl create mode 100644 templates/es/modify-class.tmpl create mode 100644 templates/es/modify-printer.tmpl create mode 100644 templates/es/norestart.tmpl create mode 100644 templates/es/option-boolean.tmpl create mode 100644 templates/es/option-conflict.tmpl create mode 100644 templates/es/option-header.tmpl create mode 100644 templates/es/option-pickmany.tmpl create mode 100644 templates/es/option-pickone.tmpl create mode 100644 templates/es/option-trailer.tmpl create mode 100644 templates/es/pager.tmpl create mode 100644 templates/es/printer-accept.tmpl create mode 100644 templates/es/printer-added.tmpl create mode 100644 templates/es/printer-configured.tmpl create mode 100644 templates/es/printer-confirm.tmpl create mode 100644 templates/es/printer-default.tmpl create mode 100644 templates/es/printer-deleted.tmpl create mode 100644 templates/es/printer-jobs-header.tmpl create mode 100644 templates/es/printer-modified.tmpl create mode 100644 templates/es/printer-purge.tmpl create mode 100644 templates/es/printer-reject.tmpl create mode 100644 templates/es/printer-start.tmpl create mode 100644 templates/es/printer-stop.tmpl create mode 100644 templates/es/printer.tmpl create mode 100644 templates/es/printers-header.tmpl create mode 100644 templates/es/printers.tmpl create mode 100644 templates/es/restart.tmpl create mode 100644 templates/es/samba-export.tmpl create mode 100644 templates/es/samba-exported.tmpl create mode 100644 templates/es/search.tmpl create mode 100644 templates/es/set-printer-options-header.tmpl create mode 100644 templates/es/set-printer-options-trailer.tmpl create mode 100644 templates/es/subscription-added.tmpl create mode 100644 templates/es/subscription-canceled.tmpl create mode 100644 templates/es/test-page.tmpl create mode 100644 templates/es/trailer.tmpl create mode 100644 templates/es/users.tmpl create mode 100644 templates/eu/add-class.tmpl create mode 100644 templates/eu/add-printer.tmpl create mode 100644 templates/eu/add-rss-subscription.tmpl create mode 100644 templates/eu/admin.tmpl create mode 100644 templates/eu/choose-device.tmpl create mode 100644 templates/eu/choose-make.tmpl create mode 100644 templates/eu/choose-model.tmpl create mode 100644 templates/eu/choose-serial.tmpl create mode 100644 templates/eu/choose-uri.tmpl create mode 100644 templates/eu/class-added.tmpl create mode 100644 templates/eu/class-confirm.tmpl create mode 100644 templates/eu/class-deleted.tmpl create mode 100644 templates/eu/class-jobs-header.tmpl create mode 100644 templates/eu/class-modified.tmpl create mode 100644 templates/eu/class.tmpl create mode 100644 templates/eu/classes-header.tmpl create mode 100644 templates/eu/classes.tmpl create mode 100644 templates/eu/command.tmpl create mode 100644 templates/eu/edit-config.tmpl create mode 100644 templates/eu/error-op.tmpl create mode 100644 templates/eu/error.tmpl create mode 100644 templates/eu/header.tmpl.in create mode 100644 templates/eu/help-header.tmpl create mode 100644 templates/eu/help-printable.tmpl create mode 100644 templates/eu/help-trailer.tmpl create mode 100644 templates/eu/job-cancel.tmpl create mode 100644 templates/eu/job-hold.tmpl create mode 100644 templates/eu/job-move.tmpl create mode 100644 templates/eu/job-moved.tmpl create mode 100644 templates/eu/job-release.tmpl create mode 100644 templates/eu/job-restart.tmpl create mode 100644 templates/eu/jobs-header.tmpl create mode 100644 templates/eu/jobs.tmpl create mode 100644 templates/eu/list-available-printers.tmpl create mode 100644 templates/eu/modify-class.tmpl create mode 100644 templates/eu/modify-printer.tmpl create mode 100644 templates/eu/norestart.tmpl create mode 100644 templates/eu/option-boolean.tmpl create mode 100644 templates/eu/option-conflict.tmpl create mode 100644 templates/eu/option-header.tmpl create mode 100644 templates/eu/option-pickmany.tmpl create mode 100644 templates/eu/option-pickone.tmpl create mode 100644 templates/eu/option-trailer.tmpl create mode 100644 templates/eu/pager.tmpl create mode 100644 templates/eu/printer-accept.tmpl create mode 100644 templates/eu/printer-added.tmpl create mode 100644 templates/eu/printer-configured.tmpl create mode 100644 templates/eu/printer-confirm.tmpl create mode 100644 templates/eu/printer-default.tmpl create mode 100644 templates/eu/printer-deleted.tmpl create mode 100644 templates/eu/printer-jobs-header.tmpl create mode 100644 templates/eu/printer-modified.tmpl create mode 100644 templates/eu/printer-purge.tmpl create mode 100644 templates/eu/printer-reject.tmpl create mode 100644 templates/eu/printer-start.tmpl create mode 100644 templates/eu/printer-stop.tmpl create mode 100644 templates/eu/printer.tmpl create mode 100644 templates/eu/printers-header.tmpl create mode 100644 templates/eu/printers.tmpl create mode 100644 templates/eu/restart.tmpl create mode 100644 templates/eu/samba-export.tmpl create mode 100644 templates/eu/samba-exported.tmpl create mode 100644 templates/eu/search.tmpl create mode 100644 templates/eu/set-printer-options-header.tmpl create mode 100644 templates/eu/set-printer-options-trailer.tmpl create mode 100644 templates/eu/subscription-added.tmpl create mode 100644 templates/eu/subscription-canceled.tmpl create mode 100644 templates/eu/test-page.tmpl create mode 100644 templates/eu/trailer.tmpl create mode 100644 templates/eu/users.tmpl create mode 100644 templates/fr/add-class.tmpl create mode 100644 templates/fr/add-printer.tmpl create mode 100644 templates/fr/add-rss-subscription.tmpl create mode 100644 templates/fr/admin.tmpl create mode 100644 templates/fr/choose-device.tmpl create mode 100644 templates/fr/choose-make.tmpl create mode 100644 templates/fr/choose-model.tmpl create mode 100644 templates/fr/choose-serial.tmpl create mode 100644 templates/fr/choose-uri.tmpl create mode 100644 templates/fr/class-added.tmpl create mode 100644 templates/fr/class-confirm.tmpl create mode 100644 templates/fr/class-deleted.tmpl create mode 100644 templates/fr/class-jobs-header.tmpl create mode 100644 templates/fr/class-modified.tmpl create mode 100644 templates/fr/class.tmpl create mode 100644 templates/fr/classes-header.tmpl create mode 100644 templates/fr/classes.tmpl create mode 100644 templates/fr/command.tmpl create mode 100644 templates/fr/edit-config.tmpl create mode 100644 templates/fr/error-op.tmpl create mode 100644 templates/fr/error.tmpl create mode 100644 templates/fr/header.tmpl.in create mode 100644 templates/fr/help-header.tmpl create mode 100644 templates/fr/help-printable.tmpl create mode 100644 templates/fr/help-trailer.tmpl create mode 100644 templates/fr/job-cancel.tmpl create mode 100644 templates/fr/job-hold.tmpl create mode 100644 templates/fr/job-move.tmpl create mode 100644 templates/fr/job-moved.tmpl create mode 100644 templates/fr/job-release.tmpl create mode 100644 templates/fr/job-restart.tmpl create mode 100644 templates/fr/jobs-header.tmpl create mode 100644 templates/fr/jobs.tmpl create mode 100644 templates/fr/list-available-printers.tmpl create mode 100644 templates/fr/modify-class.tmpl create mode 100644 templates/fr/modify-printer.tmpl create mode 100644 templates/fr/norestart.tmpl create mode 100644 templates/fr/option-boolean.tmpl create mode 100644 templates/fr/option-conflict.tmpl create mode 100644 templates/fr/option-header.tmpl create mode 100644 templates/fr/option-pickmany.tmpl create mode 100644 templates/fr/option-pickone.tmpl create mode 100644 templates/fr/option-trailer.tmpl create mode 100644 templates/fr/pager.tmpl create mode 100644 templates/fr/printer-accept.tmpl create mode 100644 templates/fr/printer-added.tmpl create mode 100644 templates/fr/printer-configured.tmpl create mode 100644 templates/fr/printer-confirm.tmpl create mode 100644 templates/fr/printer-default.tmpl create mode 100644 templates/fr/printer-deleted.tmpl create mode 100644 templates/fr/printer-jobs-header.tmpl create mode 100644 templates/fr/printer-modified.tmpl create mode 100644 templates/fr/printer-purge.tmpl create mode 100644 templates/fr/printer-reject.tmpl create mode 100644 templates/fr/printer-start.tmpl create mode 100644 templates/fr/printer-stop.tmpl create mode 100644 templates/fr/printer.tmpl create mode 100644 templates/fr/printers-header.tmpl create mode 100644 templates/fr/printers.tmpl create mode 100644 templates/fr/restart.tmpl create mode 100644 templates/fr/samba-export.tmpl create mode 100644 templates/fr/samba-exported.tmpl create mode 100644 templates/fr/search.tmpl create mode 100644 templates/fr/set-printer-options-header.tmpl create mode 100644 templates/fr/set-printer-options-trailer.tmpl create mode 100644 templates/fr/subscription-added.tmpl create mode 100644 templates/fr/subscription-canceled.tmpl create mode 100644 templates/fr/test-page.tmpl create mode 100644 templates/fr/trailer.tmpl create mode 100644 templates/fr/users.tmpl create mode 100644 templates/header.tmpl.in create mode 100644 templates/help-header.tmpl create mode 100644 templates/help-printable.tmpl create mode 100644 templates/help-trailer.tmpl create mode 100644 templates/hu/add-class.tmpl create mode 100644 templates/hu/add-printer.tmpl create mode 100644 templates/hu/add-rss-subscription.tmpl create mode 100644 templates/hu/admin.tmpl create mode 100644 templates/hu/choose-device.tmpl create mode 100644 templates/hu/choose-make.tmpl create mode 100644 templates/hu/choose-model.tmpl create mode 100644 templates/hu/choose-serial.tmpl create mode 100644 templates/hu/choose-uri.tmpl create mode 100644 templates/hu/class-added.tmpl create mode 100644 templates/hu/class-confirm.tmpl create mode 100644 templates/hu/class-deleted.tmpl create mode 100644 templates/hu/class-jobs-header.tmpl create mode 100644 templates/hu/class-modified.tmpl create mode 100644 templates/hu/class.tmpl create mode 100644 templates/hu/classes-header.tmpl create mode 100644 templates/hu/classes.tmpl create mode 100644 templates/hu/command.tmpl create mode 100644 templates/hu/edit-config.tmpl create mode 100644 templates/hu/error-op.tmpl create mode 100644 templates/hu/error.tmpl create mode 100644 templates/hu/header.tmpl.in create mode 100755 templates/hu/help-header.tmpl create mode 100644 templates/hu/help-printable.tmpl create mode 100644 templates/hu/help-trailer.tmpl create mode 100644 templates/hu/job-cancel.tmpl create mode 100644 templates/hu/job-hold.tmpl create mode 100644 templates/hu/job-move.tmpl create mode 100644 templates/hu/job-moved.tmpl create mode 100644 templates/hu/job-release.tmpl create mode 100644 templates/hu/job-restart.tmpl create mode 100644 templates/hu/jobs-header.tmpl create mode 100644 templates/hu/jobs.tmpl create mode 100644 templates/hu/list-available-printers.tmpl create mode 100644 templates/hu/modify-class.tmpl create mode 100644 templates/hu/modify-printer.tmpl create mode 100644 templates/hu/norestart.tmpl create mode 100644 templates/hu/option-boolean.tmpl create mode 100644 templates/hu/option-conflict.tmpl create mode 100644 templates/hu/option-header.tmpl create mode 100644 templates/hu/option-pickmany.tmpl create mode 100644 templates/hu/option-pickone.tmpl create mode 100644 templates/hu/option-trailer.tmpl create mode 100644 templates/hu/pager.tmpl create mode 100644 templates/hu/printer-accept.tmpl create mode 100644 templates/hu/printer-added.tmpl create mode 100644 templates/hu/printer-configured.tmpl create mode 100644 templates/hu/printer-confirm.tmpl create mode 100644 templates/hu/printer-default.tmpl create mode 100644 templates/hu/printer-deleted.tmpl create mode 100644 templates/hu/printer-jobs-header.tmpl create mode 100644 templates/hu/printer-modified.tmpl create mode 100644 templates/hu/printer-purge.tmpl create mode 100644 templates/hu/printer-reject.tmpl create mode 100644 templates/hu/printer-start.tmpl create mode 100644 templates/hu/printer-stop.tmpl create mode 100644 templates/hu/printer.tmpl create mode 100644 templates/hu/printers-header.tmpl create mode 100644 templates/hu/printers.tmpl create mode 100644 templates/hu/restart.tmpl create mode 100644 templates/hu/samba-export.tmpl create mode 100644 templates/hu/samba-exported.tmpl create mode 100644 templates/hu/search.tmpl create mode 100644 templates/hu/set-printer-options-header.tmpl create mode 100644 templates/hu/set-printer-options-trailer.tmpl create mode 100644 templates/hu/subscription-added.tmpl create mode 100644 templates/hu/subscription-canceled.tmpl create mode 100644 templates/hu/test-page.tmpl create mode 100644 templates/hu/trailer.tmpl create mode 100644 templates/hu/users.tmpl create mode 100644 templates/id/add-class.tmpl create mode 100644 templates/id/add-printer.tmpl create mode 100644 templates/id/add-rss-subscription.tmpl create mode 100644 templates/id/admin.tmpl create mode 100644 templates/id/choose-device.tmpl create mode 100644 templates/id/choose-make.tmpl create mode 100644 templates/id/choose-model.tmpl create mode 100644 templates/id/choose-serial.tmpl create mode 100644 templates/id/choose-uri.tmpl create mode 100644 templates/id/class-added.tmpl create mode 100644 templates/id/class-confirm.tmpl create mode 100644 templates/id/class-deleted.tmpl create mode 100644 templates/id/class-jobs-header.tmpl create mode 100644 templates/id/class-modified.tmpl create mode 100644 templates/id/class.tmpl create mode 100644 templates/id/classes-header.tmpl create mode 100644 templates/id/classes.tmpl create mode 100644 templates/id/command.tmpl create mode 100644 templates/id/edit-config.tmpl create mode 100644 templates/id/error-op.tmpl create mode 100644 templates/id/error.tmpl create mode 100644 templates/id/header.tmpl.in create mode 100644 templates/id/help-header.tmpl create mode 100644 templates/id/help-printable.tmpl create mode 100644 templates/id/help-trailer.tmpl create mode 100644 templates/id/job-cancel.tmpl create mode 100644 templates/id/job-hold.tmpl create mode 100644 templates/id/job-move.tmpl create mode 100644 templates/id/job-moved.tmpl create mode 100644 templates/id/job-release.tmpl create mode 100644 templates/id/job-restart.tmpl create mode 100644 templates/id/jobs-header.tmpl create mode 100644 templates/id/jobs.tmpl create mode 100644 templates/id/list-available-printers.tmpl create mode 100644 templates/id/modify-class.tmpl create mode 100644 templates/id/modify-printer.tmpl create mode 100644 templates/id/norestart.tmpl create mode 100644 templates/id/option-boolean.tmpl create mode 100644 templates/id/option-conflict.tmpl create mode 100644 templates/id/option-header.tmpl create mode 100644 templates/id/option-pickmany.tmpl create mode 100644 templates/id/option-pickone.tmpl create mode 100644 templates/id/option-trailer.tmpl create mode 100644 templates/id/pager.tmpl create mode 100644 templates/id/printer-accept.tmpl create mode 100644 templates/id/printer-added.tmpl create mode 100644 templates/id/printer-configured.tmpl create mode 100644 templates/id/printer-confirm.tmpl create mode 100644 templates/id/printer-default.tmpl create mode 100644 templates/id/printer-deleted.tmpl create mode 100644 templates/id/printer-jobs-header.tmpl create mode 100644 templates/id/printer-modified.tmpl create mode 100644 templates/id/printer-purge.tmpl create mode 100644 templates/id/printer-reject.tmpl create mode 100644 templates/id/printer-start.tmpl create mode 100644 templates/id/printer-stop.tmpl create mode 100644 templates/id/printer.tmpl create mode 100644 templates/id/printers-header.tmpl create mode 100644 templates/id/printers.tmpl create mode 100644 templates/id/restart.tmpl create mode 100644 templates/id/samba-export.tmpl create mode 100644 templates/id/samba-exported.tmpl create mode 100644 templates/id/search.tmpl create mode 100644 templates/id/set-printer-options-header.tmpl create mode 100644 templates/id/set-printer-options-trailer.tmpl create mode 100644 templates/id/subscription-added.tmpl create mode 100644 templates/id/subscription-canceled.tmpl create mode 100644 templates/id/test-page.tmpl create mode 100644 templates/id/trailer.tmpl create mode 100644 templates/id/users.tmpl create mode 100644 templates/it/add-class.tmpl create mode 100644 templates/it/add-printer.tmpl create mode 100644 templates/it/add-rss-subscription.tmpl create mode 100644 templates/it/admin.tmpl create mode 100644 templates/it/choose-device.tmpl create mode 100644 templates/it/choose-make.tmpl create mode 100644 templates/it/choose-model.tmpl create mode 100644 templates/it/choose-serial.tmpl create mode 100644 templates/it/choose-uri.tmpl create mode 100644 templates/it/class-added.tmpl create mode 100644 templates/it/class-confirm.tmpl create mode 100644 templates/it/class-deleted.tmpl create mode 100644 templates/it/class-jobs-header.tmpl create mode 100644 templates/it/class-modified.tmpl create mode 100644 templates/it/class.tmpl create mode 100644 templates/it/classes-header.tmpl create mode 100644 templates/it/classes.tmpl create mode 100644 templates/it/command.tmpl create mode 100644 templates/it/edit-config.tmpl create mode 100644 templates/it/error-op.tmpl create mode 100644 templates/it/error.tmpl create mode 100644 templates/it/help-header.tmpl create mode 100644 templates/it/help-printable.tmpl create mode 100644 templates/it/help-trailer.tmpl create mode 100644 templates/it/job-cancel.tmpl create mode 100644 templates/it/job-hold.tmpl create mode 100644 templates/it/job-move.tmpl create mode 100644 templates/it/job-moved.tmpl create mode 100644 templates/it/job-release.tmpl create mode 100644 templates/it/job-restart.tmpl create mode 100644 templates/it/jobs-header.tmpl create mode 100644 templates/it/jobs.tmpl create mode 100644 templates/it/list-available-printers.tmpl create mode 100644 templates/it/modify-class.tmpl create mode 100644 templates/it/modify-printer.tmpl create mode 100644 templates/it/norestart.tmpl create mode 100644 templates/it/option-boolean.tmpl create mode 100644 templates/it/option-conflict.tmpl create mode 100644 templates/it/option-header.tmpl create mode 100644 templates/it/option-pickmany.tmpl create mode 100644 templates/it/option-pickone.tmpl create mode 100644 templates/it/option-trailer.tmpl create mode 100644 templates/it/pager.tmpl create mode 100644 templates/it/printer-accept.tmpl create mode 100644 templates/it/printer-added.tmpl create mode 100644 templates/it/printer-configured.tmpl create mode 100644 templates/it/printer-confirm.tmpl create mode 100644 templates/it/printer-default.tmpl create mode 100644 templates/it/printer-deleted.tmpl create mode 100644 templates/it/printer-jobs-header.tmpl create mode 100644 templates/it/printer-modified.tmpl create mode 100644 templates/it/printer-purge.tmpl create mode 100644 templates/it/printer-reject.tmpl create mode 100644 templates/it/printer-start.tmpl create mode 100644 templates/it/printer-stop.tmpl create mode 100644 templates/it/printer.tmpl create mode 100644 templates/it/printers-header.tmpl create mode 100644 templates/it/printers.tmpl create mode 100644 templates/it/restart.tmpl create mode 100644 templates/it/samba-export.tmpl create mode 100644 templates/it/samba-exported.tmpl create mode 100644 templates/it/search.tmpl create mode 100644 templates/it/set-printer-options-header.tmpl create mode 100644 templates/it/set-printer-options-trailer.tmpl create mode 100644 templates/it/subscription-added.tmpl create mode 100644 templates/it/subscription-canceled.tmpl create mode 100644 templates/it/test-page.tmpl create mode 100644 templates/it/trailer.tmpl create mode 100644 templates/it/users.tmpl create mode 100644 templates/ja/add-class.tmpl create mode 100644 templates/ja/add-printer.tmpl create mode 100644 templates/ja/add-rss-subscription.tmpl create mode 100644 templates/ja/admin.tmpl create mode 100644 templates/ja/choose-device.tmpl create mode 100644 templates/ja/choose-make.tmpl create mode 100644 templates/ja/choose-model.tmpl create mode 100644 templates/ja/choose-serial.tmpl create mode 100644 templates/ja/choose-uri.tmpl create mode 100644 templates/ja/class-added.tmpl create mode 100644 templates/ja/class-confirm.tmpl create mode 100644 templates/ja/class-deleted.tmpl create mode 100644 templates/ja/class-jobs-header.tmpl create mode 100644 templates/ja/class-modified.tmpl create mode 100644 templates/ja/class.tmpl create mode 100644 templates/ja/classes-header.tmpl create mode 100644 templates/ja/classes.tmpl create mode 100644 templates/ja/command.tmpl create mode 100644 templates/ja/edit-config.tmpl create mode 100644 templates/ja/error-op.tmpl create mode 100644 templates/ja/error.tmpl create mode 100644 templates/ja/header.tmpl.in create mode 100644 templates/ja/help-header.tmpl create mode 100644 templates/ja/help-printable.tmpl create mode 100644 templates/ja/help-trailer.tmpl create mode 100644 templates/ja/job-cancel.tmpl create mode 100644 templates/ja/job-hold.tmpl create mode 100644 templates/ja/job-move.tmpl create mode 100644 templates/ja/job-moved.tmpl create mode 100644 templates/ja/job-release.tmpl create mode 100644 templates/ja/job-restart.tmpl create mode 100644 templates/ja/jobs-header.tmpl create mode 100644 templates/ja/jobs.tmpl create mode 100644 templates/ja/list-available-printers.tmpl create mode 100644 templates/ja/modify-class.tmpl create mode 100644 templates/ja/modify-printer.tmpl create mode 100644 templates/ja/norestart.tmpl create mode 100644 templates/ja/option-boolean.tmpl create mode 100644 templates/ja/option-conflict.tmpl create mode 100644 templates/ja/option-header.tmpl create mode 100644 templates/ja/option-pickmany.tmpl create mode 100644 templates/ja/option-pickone.tmpl create mode 100644 templates/ja/option-trailer.tmpl create mode 100644 templates/ja/pager.tmpl create mode 100644 templates/ja/printer-accept.tmpl create mode 100644 templates/ja/printer-added.tmpl create mode 100644 templates/ja/printer-configured.tmpl create mode 100644 templates/ja/printer-confirm.tmpl create mode 100644 templates/ja/printer-default.tmpl create mode 100644 templates/ja/printer-deleted.tmpl create mode 100644 templates/ja/printer-jobs-header.tmpl create mode 100644 templates/ja/printer-modified.tmpl create mode 100644 templates/ja/printer-purge.tmpl create mode 100644 templates/ja/printer-reject.tmpl create mode 100644 templates/ja/printer-start.tmpl create mode 100644 templates/ja/printer-stop.tmpl create mode 100644 templates/ja/printer.tmpl create mode 100644 templates/ja/printers-header.tmpl create mode 100644 templates/ja/printers.tmpl create mode 100644 templates/ja/restart.tmpl create mode 100644 templates/ja/samba-export.tmpl create mode 100644 templates/ja/samba-exported.tmpl create mode 100644 templates/ja/search.tmpl create mode 100644 templates/ja/set-printer-options-header.tmpl create mode 100644 templates/ja/set-printer-options-trailer.tmpl create mode 100644 templates/ja/subscription-added.tmpl create mode 100644 templates/ja/subscription-canceled.tmpl create mode 100644 templates/ja/test-page.tmpl create mode 100644 templates/ja/trailer.tmpl create mode 100644 templates/ja/users.tmpl create mode 100644 templates/job-cancel.tmpl create mode 100644 templates/job-hold.tmpl create mode 100644 templates/job-move.tmpl create mode 100644 templates/job-moved.tmpl create mode 100644 templates/job-release.tmpl create mode 100644 templates/job-restart.tmpl create mode 100644 templates/jobs-header.tmpl create mode 100644 templates/jobs.tmpl create mode 100644 templates/list-available-printers.tmpl create mode 100644 templates/modify-class.tmpl create mode 100644 templates/modify-printer.tmpl create mode 100644 templates/norestart.tmpl create mode 100644 templates/option-boolean.tmpl create mode 100644 templates/option-conflict.tmpl create mode 100644 templates/option-header.tmpl create mode 100644 templates/option-pickmany.tmpl create mode 100644 templates/option-pickone.tmpl create mode 100644 templates/option-trailer.tmpl create mode 100644 templates/pager.tmpl create mode 100644 templates/pl/add-class.tmpl create mode 100644 templates/pl/add-printer.tmpl create mode 100644 templates/pl/add-rss-subscription.tmpl create mode 100644 templates/pl/admin.tmpl create mode 100644 templates/pl/choose-device.tmpl create mode 100644 templates/pl/choose-make.tmpl create mode 100644 templates/pl/choose-model.tmpl create mode 100644 templates/pl/choose-serial.tmpl create mode 100644 templates/pl/choose-uri.tmpl create mode 100644 templates/pl/class-added.tmpl create mode 100644 templates/pl/class-confirm.tmpl create mode 100644 templates/pl/class-deleted.tmpl create mode 100644 templates/pl/class-jobs-header.tmpl create mode 100644 templates/pl/class-modified.tmpl create mode 100644 templates/pl/class.tmpl create mode 100644 templates/pl/classes-header.tmpl create mode 100644 templates/pl/classes.tmpl create mode 100644 templates/pl/command.tmpl create mode 100644 templates/pl/edit-config.tmpl create mode 100644 templates/pl/error-op.tmpl create mode 100644 templates/pl/error.tmpl create mode 100644 templates/pl/header.tmpl.in create mode 100644 templates/pl/help-header.tmpl create mode 100644 templates/pl/help-printable.tmpl create mode 100644 templates/pl/help-trailer.tmpl create mode 100644 templates/pl/job-cancel.tmpl create mode 100644 templates/pl/job-hold.tmpl create mode 100644 templates/pl/job-move.tmpl create mode 100644 templates/pl/job-moved.tmpl create mode 100644 templates/pl/job-release.tmpl create mode 100644 templates/pl/job-restart.tmpl create mode 100644 templates/pl/jobs-header.tmpl create mode 100644 templates/pl/jobs.tmpl create mode 100644 templates/pl/list-available-printers.tmpl create mode 100644 templates/pl/modify-class.tmpl create mode 100644 templates/pl/modify-printer.tmpl create mode 100644 templates/pl/norestart.tmpl create mode 100644 templates/pl/option-boolean.tmpl create mode 100644 templates/pl/option-conflict.tmpl create mode 100644 templates/pl/option-header.tmpl create mode 100644 templates/pl/option-pickmany.tmpl create mode 100644 templates/pl/option-pickone.tmpl create mode 100644 templates/pl/option-trailer.tmpl create mode 100644 templates/pl/pager.tmpl create mode 100644 templates/pl/printer-accept.tmpl create mode 100644 templates/pl/printer-added.tmpl create mode 100644 templates/pl/printer-configured.tmpl create mode 100644 templates/pl/printer-confirm.tmpl create mode 100644 templates/pl/printer-default.tmpl create mode 100644 templates/pl/printer-deleted.tmpl create mode 100644 templates/pl/printer-jobs-header.tmpl create mode 100644 templates/pl/printer-modified.tmpl create mode 100644 templates/pl/printer-purge.tmpl create mode 100644 templates/pl/printer-reject.tmpl create mode 100644 templates/pl/printer-start.tmpl create mode 100644 templates/pl/printer-stop.tmpl create mode 100644 templates/pl/printer.tmpl create mode 100644 templates/pl/printers-header.tmpl create mode 100644 templates/pl/printers.tmpl create mode 100644 templates/pl/restart.tmpl create mode 100644 templates/pl/samba-export.tmpl create mode 100644 templates/pl/samba-exported.tmpl create mode 100644 templates/pl/search.tmpl create mode 100644 templates/pl/set-printer-options-header.tmpl create mode 100644 templates/pl/set-printer-options-trailer.tmpl create mode 100644 templates/pl/subscription-added.tmpl create mode 100644 templates/pl/subscription-canceled.tmpl create mode 100644 templates/pl/test-page.tmpl create mode 100644 templates/pl/trailer.tmpl create mode 100644 templates/pl/users.tmpl create mode 100644 templates/printer-accept.tmpl create mode 100644 templates/printer-added.tmpl create mode 100644 templates/printer-configured.tmpl create mode 100644 templates/printer-confirm.tmpl create mode 100644 templates/printer-default.tmpl create mode 100644 templates/printer-deleted.tmpl create mode 100644 templates/printer-jobs-header.tmpl create mode 100644 templates/printer-modified.tmpl create mode 100644 templates/printer-purge.tmpl create mode 100644 templates/printer-reject.tmpl create mode 100644 templates/printer-start.tmpl create mode 100644 templates/printer-stop.tmpl create mode 100644 templates/printer.tmpl create mode 100644 templates/printers-header.tmpl create mode 100644 templates/printers.tmpl create mode 100644 templates/restart.tmpl create mode 100644 templates/ru/Makefile create mode 100644 templates/ru/add-class.tmpl create mode 100644 templates/ru/add-printer.tmpl create mode 100644 templates/ru/add-rss-subscription.tmpl create mode 100644 templates/ru/admin.tmpl create mode 100644 templates/ru/choose-device.tmpl create mode 100644 templates/ru/choose-make.tmpl create mode 100644 templates/ru/choose-model.tmpl create mode 100644 templates/ru/choose-serial.tmpl create mode 100644 templates/ru/choose-uri.tmpl create mode 100644 templates/ru/class-added.tmpl create mode 100644 templates/ru/class-confirm.tmpl create mode 100644 templates/ru/class-deleted.tmpl create mode 100644 templates/ru/class-jobs-header.tmpl create mode 100644 templates/ru/class-modified.tmpl create mode 100644 templates/ru/class.tmpl create mode 100644 templates/ru/classes-header.tmpl create mode 100644 templates/ru/classes.tmpl create mode 100644 templates/ru/command.tmpl create mode 100644 templates/ru/edit-config.tmpl create mode 100644 templates/ru/error-op.tmpl create mode 100644 templates/ru/error.tmpl create mode 100644 templates/ru/header.tmpl.in create mode 100644 templates/ru/help-header.tmpl create mode 100644 templates/ru/help-printable.tmpl create mode 100644 templates/ru/help-trailer.tmpl create mode 100644 templates/ru/job-cancel.tmpl create mode 100644 templates/ru/job-hold.tmpl create mode 100644 templates/ru/job-move.tmpl create mode 100644 templates/ru/job-moved.tmpl create mode 100644 templates/ru/job-release.tmpl create mode 100644 templates/ru/job-restart.tmpl create mode 100644 templates/ru/jobs-header.tmpl create mode 100644 templates/ru/jobs.tmpl create mode 100644 templates/ru/list-available-printers.tmpl create mode 100644 templates/ru/modify-class.tmpl create mode 100644 templates/ru/modify-printer.tmpl create mode 100644 templates/ru/norestart.tmpl create mode 100644 templates/ru/option-boolean.tmpl create mode 100644 templates/ru/option-conflict.tmpl create mode 100644 templates/ru/option-header.tmpl create mode 100644 templates/ru/option-pickmany.tmpl create mode 100644 templates/ru/option-pickone.tmpl create mode 100644 templates/ru/option-trailer.tmpl create mode 100644 templates/ru/pager.tmpl create mode 100644 templates/ru/printer-accept.tmpl create mode 100644 templates/ru/printer-added.tmpl create mode 100644 templates/ru/printer-configured.tmpl create mode 100644 templates/ru/printer-confirm.tmpl create mode 100644 templates/ru/printer-default.tmpl create mode 100644 templates/ru/printer-deleted.tmpl create mode 100644 templates/ru/printer-jobs-header.tmpl create mode 100644 templates/ru/printer-modified.tmpl create mode 100644 templates/ru/printer-purge.tmpl create mode 100644 templates/ru/printer-reject.tmpl create mode 100644 templates/ru/printer-start.tmpl create mode 100644 templates/ru/printer-stop.tmpl create mode 100644 templates/ru/printer.tmpl create mode 100644 templates/ru/printers-header.tmpl create mode 100644 templates/ru/printers.tmpl create mode 100644 templates/ru/restart.tmpl create mode 100644 templates/ru/samba-export.tmpl create mode 100644 templates/ru/samba-exported.tmpl create mode 100644 templates/ru/search.tmpl create mode 100644 templates/ru/set-printer-options-header.tmpl create mode 100644 templates/ru/set-printer-options-trailer.tmpl create mode 100644 templates/ru/subscription-added.tmpl create mode 100644 templates/ru/subscription-canceled.tmpl create mode 100644 templates/ru/test-page.tmpl create mode 100644 templates/ru/trailer.tmpl create mode 100644 templates/ru/users.tmpl create mode 100644 templates/samba-export.tmpl create mode 100644 templates/samba-exported.tmpl create mode 100644 templates/search.tmpl create mode 100644 templates/set-printer-options-header.tmpl create mode 100644 templates/set-printer-options-trailer.tmpl create mode 100644 templates/subscription-added.tmpl create mode 100644 templates/subscription-canceled.tmpl create mode 100644 templates/test-page.tmpl create mode 100644 templates/trailer.tmpl create mode 100644 templates/users.tmpl create mode 100644 test/4.1-requests.test create mode 100644 test/4.2-cups-printer-ops.test create mode 100644 test/4.3-job-ops.test create mode 100644 test/4.4-subscription-ops.test create mode 100644 test/5.1-lpadmin.sh create mode 100644 test/5.2-lpc.sh create mode 100644 test/5.3-lpq.sh create mode 100644 test/5.4-lpstat.sh create mode 100644 test/5.5-lp.sh create mode 100644 test/5.6-lpr.sh create mode 100644 test/5.7-lprm.sh create mode 100644 test/5.8-cancel.sh create mode 100644 test/5.9-lpinfo.sh create mode 100644 test/Dependencies create mode 100644 test/Makefile create mode 100644 test/color.jpg create mode 100644 test/create-job-format.test create mode 100644 test/create-job-sheets.test create mode 100644 test/create-job-timeout.test create mode 100644 test/create-job.test create mode 100644 test/create-printer-subscription.test create mode 100644 test/document-a4.pdf create mode 100644 test/document-a4.ps create mode 100644 test/document-a4.sla create mode 100644 test/document-letter.pdf create mode 100644 test/document-letter.ps create mode 100644 test/document-letter.sla create mode 100644 test/get-completed-jobs.test create mode 100644 test/get-devices.test create mode 100644 test/get-job-attributes.test create mode 100644 test/get-job-attributes2.test create mode 100644 test/get-jobs.test create mode 100644 test/get-ppd-printer.test create mode 100644 test/get-ppd.test create mode 100644 test/get-ppds-drv-only.test create mode 100644 test/get-ppds-language.test create mode 100644 test/get-ppds-make-and-model.test create mode 100644 test/get-ppds-make.test create mode 100644 test/get-ppds-product.test create mode 100644 test/get-ppds-psversion.test create mode 100644 test/get-ppds.test create mode 100644 test/get-printer-attributes-2.0.test create mode 100644 test/get-printer-attributes.test create mode 100644 test/get-printers.test create mode 100644 test/get-subscriptions.test create mode 100644 test/gray.jpg create mode 100644 test/ipp-1.1.test create mode 100644 test/ipp-2.0.test create mode 100644 test/ipp-2.1.test create mode 100644 test/ipp-2.2.test create mode 100644 test/ipp-backend.test create mode 100644 test/ippserver.c create mode 100644 test/ipptool.c create mode 100644 test/onepage-a4.pdf create mode 100644 test/onepage-a4.ps create mode 100644 test/onepage-a4.sla create mode 100644 test/onepage-letter.pdf create mode 100644 test/onepage-letter.ps create mode 100644 test/onepage-letter.sla create mode 100644 test/print-job-hold.test create mode 100644 test/print-job-media-col.test create mode 100644 test/print-job.test create mode 100644 test/print-uri.test create mode 100644 test/printer.opacity create mode 100644 test/printer.png create mode 100755 test/run-stp-tests.sh create mode 100644 test/set-attrs-hold.test create mode 100644 test/str-header.html create mode 100644 test/str-trailer.html create mode 100644 test/testfile.jpg create mode 100644 test/testfile.pdf create mode 100644 test/testfile.ps create mode 100644 test/testfile.txt create mode 100644 test/testhp.ppd create mode 100644 test/testps.ppd create mode 100755 test/waitjobs.sh create mode 100644 vc2005/cups.sln create mode 100644 vc2005/cupstestppd.vcproj create mode 100644 vc2005/ipptool.vcproj create mode 100644 vc2005/libcups2.vcproj create mode 100644 vc2005/libcupsimage2.vcproj create mode 100644 vc2005/testfile.vcproj create mode 100644 vc2005/testhttp.vcproj create mode 100644 vcnet/config.h create mode 100644 vcnet/cups.sln create mode 100644 vcnet/cupstestppd.vcproj create mode 100644 vcnet/ipptool.vcproj create mode 100644 vcnet/libcups2.vcproj create mode 100644 vcnet/libcupsimage2.vcproj create mode 100644 vcnet/regex/COPYRIGHT create mode 100644 vcnet/regex/Makefile create mode 100644 vcnet/regex/README create mode 100644 vcnet/regex/WHATSNEW create mode 100644 vcnet/regex/cclass.h create mode 100644 vcnet/regex/cname.h create mode 100644 vcnet/regex/debug.c create mode 100644 vcnet/regex/debug.ih create mode 100644 vcnet/regex/engine.c create mode 100644 vcnet/regex/engine.ih create mode 100644 vcnet/regex/main.c create mode 100644 vcnet/regex/main.ih create mode 100644 vcnet/regex/mkh create mode 100644 vcnet/regex/regcomp.c create mode 100644 vcnet/regex/regcomp.ih create mode 100644 vcnet/regex/regerror.c create mode 100644 vcnet/regex/regerror.ih create mode 100644 vcnet/regex/regex.3 create mode 100644 vcnet/regex/regex.7 create mode 100644 vcnet/regex/regex.h create mode 100644 vcnet/regex/regex2.h create mode 100644 vcnet/regex/regexec.c create mode 100644 vcnet/regex/regfree.c create mode 100644 vcnet/regex/split.c create mode 100644 vcnet/regex/tests create mode 100644 vcnet/regex/utils.h create mode 100644 vcnet/testfile.vcproj create mode 100755 vcnet/testhttp.vcproj create mode 100644 xcode/CUPS.xcodeproj/project.pbxproj create mode 100644 xcode/config.h diff --git a/CHANGES-1.0.txt b/CHANGES-1.0.txt new file mode 100644 index 0000000..296d89f --- /dev/null +++ b/CHANGES-1.0.txt @@ -0,0 +1,217 @@ +CHANGES-1.0.txt +--------------- + +CHANGES IN CUPS v1.0.5 + + - The HP-GL/2 filter did not correctly set the pen color + for pens other than #1. + - The scheduler would only accept 26 simultaneous jobs + under some OS releases (mkstemp() limitation.) It now + handles up to 2^32 simultaneous jobs. + - The PostScript filter loaded the printer's PPD file + twice. + - The PAM authentication code now uses pam_strerror() to + provide a textual error message in the error_log file. + - The scheduler now copies PPD and interface script + files instead of moving them; this fixes installations + with a separate requests directory. + - The PostScript RIP did not generate correct 6-color + output. + - Several filters were marking PPD options twice when + they didn't need to. + - The scheduler did not save the printer or class state + after an accept-jobs or reject-jobs operation. + - The cupsGetDefault() function now ignores the PRINTER + environment variable if it is set to "lp". + - New ippErrorString() function to get textual error + messages. + - Better error reporting in the System V commands. + - The lpadmin and lpstat commands always tried to + connect to the default server. + - The text filter didn't load the charset files from the + correct location. + - Wasn't sending a WWW-Authenticate: field to HTTP + clients when authentication was required. + - httpSeparate() didn't always set the default port + number for known methods. + - The HP-GL/2 filter now looks for "PSwidth,length" + instead of (the correct) "PSlength,width" as + documented by HP. It appears that many major CAD + applications are broken and this change allows the + auto-rotation to work with them. + - The IPP "printer-resolution" option was not being + translated. + - The charset files did not include the Microsoft + "standard" characters from 128 to 159 (unused by the + ISO-8859-x charsets) + - The scheduler was chunking the Content-Type field from + CGI programs; this problem was most noticeable with + Microsoft Internet Explorer 5. + - By popular demand, the printers, jobs, and classes + CGIs no longer force a reload of the page every 10/30 + seconds. + - The scheduler incorrectly required that the IPP client + provide a document-format attribute for the + validate-job operation. + - Clients that sent bad IPP requests without the + required attributes-natural-language and + attributes-charset attributes would crash the + scheduler. + + +CHANGES IN CUPS v1.0.4 + + - Documentation updates. + - Jobs would get stuck in the queue and wouldn't print + until you enabled the queue. + - The lp and lpr commands now catch SIGHUP and SIGINTR. + - The lp and lpr commands now use sigaction or sigset + when available. + - CUPS library updates for WIN32/OS-2 + + +CHANGES IN CUPS v1.0.3 + + - Documentation updates. + - The lpq man page was missing. + - The configure script was not properly detecting the + image libraries. + - The top-level makefile was calling "make" instead of + "$(MAKE)". + - PostScript filter fixes for number-up, OutputOrder, + and %Trailer. + - The imagetops filter didn't end the base-85 encoding + properly if the image data was not a multiple of 4 + bytes in length. + - The imagetoraster filter didn't generate good banded + RGB or CMY data (was dividing the line width by 4 + instead of 3...) + - The imagetoraster filter now records the bounding + box of the image on the page. + - The CUPS image library cache code wasn't working as + designed; images larger than the maximum RIP cache + would eventually thrash using the same cache tile. + - The CUPS image library TIFF loading code didn't + handle unknown resolution units properly; the fixed + code uses a default resolution of 128 PPI. + - cupsGetClasses() and cupsGetPrinters() did not free + existing strings if they ran out of memory. + - The scheduler logs incorrectly contained 3 digits for + the timezone offset instead of 4. + - The scheduler now does a lookup for the default user + and group ID; the previous hardcoded values caused + problems with the LPD backend. + - The cancel-job operation now allows any user in the + system group to cancel any job. + - The cancel-job operation stopped the print queue if + the job was being printed. + - Now only stop printers if the backend fails. If the + filter fails then the failure is noted in the + error_log and printing continues with the next file in + the queue. + - Now log whether a filter fails because of a signal + or because it returned a non-zero exit status. + - The root user now always passes the system group test. + - Printers with an interface script and remote printers + and classes didn't have a printer-make-and-model + attribute. + - Added logging of lost/timed-out remote printers. + - The HP-GL/2 filter was scaling the pen width twice. + - Updated the HP-GL/2 filter to use a single SP (Set + Pen) procedure. This makes the output smaller and is + more appropriate since the filter keeps track of the + pen states already. + - The scheduler didn't handle passwords with spaces. + - The IPP backend now does multiple copies and retries + if the destination server requires it (e.g. HP + JetDirect.) + - The disable command didn't implement the "-c" option + (cancel all jobs.) + - Changed the CMYK generation function for the image file + and PostScript RIPs. + - The lp command didn't support the "-h" option as + documented. + - The AppSocket, IPP, and LPD backends now retry on all + network errors. This should prevent stopped queues + caused by a printer being disconnected from the + network or powered off. + - The scheduler now restarts a job if the corresponding + printer is modified. + - The image RIPs now rotate the image if needed to fit + on the page. + + +CHANGES IN CUPS v1.0.2 + + - The HP-GL/2 filter didn't always scale the output + correctly. + - The HP-GL/2 filter now supports changing the page size + automatically when the "fitplot" option is not used. + - The cancel-job operation was expecting a resource name + of the form "/job/#" instead of "/jobs/#"; this + prevented the cancel and lprm commands from working. + - The backends didn't log pages when files were printed + using the "-oraw" option. + - The authorization code did not work with the Slackware + long shadow password package because its crypt() can + return NULL. + - The chunking code didn't work for reading the response + of a POST request. + - cupsGetPPD() now does authentication as needed. + - The N-up code in the PostScript filter didn't work + with some printers (grestoreall would restore the + default blank page and device settings). + - The N-up code in the PostScript filter didn't scale + the pages to fit within the imageable area of the + page. + - Wasn't doing an fchown() on the request files. This + caused problems when the default root account group + and CUPS group were not the same. + + +CHANGES IN CUPS v1.0.1 + + - Documentation updates. + - Fixed a bunch of possible buffer-overflow conditions. + - The scheduler now supports authentication using PAM. + - Updated the Italian message file. + - httpEncode64() didn't add an extra "=" if there was + only one byte in the last three-byte group. + - Now drop any trailing character set from the locale + string (e.g. "en_US.ISO_8859-1" becomes "en_US") + - Fixed "timezone" vs "tm_gmtoff" usage for BSD-based + operating systems. + - Updated IPP security so that "get" operations can be + done from any resource name; this allows the CGIs to + work with printer authentication enabled so long as + authentication isn't turned on for the whole "site". + - The IPP code didn't properly handle the "unsupported" + group; this caused problems with the HP JetDirect since + it doesn't seem to support the "copies" attribute. + - The HTTP chunking code was missing a CR LF pair at the + end of a 0-length chunk. + - The httpSeparate() function didn't handle embedded + usernames and passwords in the URI properly. + - Doing "lpadmin -p printer -E" didn't restart printing + if there were pending jobs. + - The cancel-job operation now requires either a + requesting-user-name attribute or an authenticated + username. + - The add-printer code did not report errors if the + interface script or PPD file could not be renamed. + - Request files are now created without world read + permissions. + - Added a cupsLastError() function to the CUPS API to + retrieve the IPP error code from the last request. + - Options are now case-insensitive. + - The lpq command now provides 10 characters for the + username instead of the original (Berkeley standard) + 7. + - The cancel command needed a local CUPS server to work + (or the appropriate ServerName in cupsd.conf) + - The cancel and lprm commands didn't report the IPP + error if the job could not be cancelled. + - The lp and lpr commands didn't intercept SIGTERM to + remove temporary files when printing from stdin. + - The lp and lpr commands didn't report the IPP error if + the job could not be printed. diff --git a/CHANGES-1.1.txt b/CHANGES-1.1.txt new file mode 100644 index 0000000..c641e79 --- /dev/null +++ b/CHANGES-1.1.txt @@ -0,0 +1,3462 @@ +CHANGES-1.1.txt +--------------- + +CHANGES IN CUPS V1.1.23 + + - Updated the Spanish man pages (STR #1041) + - The lpstat man page contained a typo (STR #1040) + - The scheduler's is_path_absolute() code could cause a + DoS (STR #1042) + - The scheduler's device loading code used the wrong + size limits for the make/model and info parameters + (STR #1035) + - The PNG loading code did not use a "long unsigned + integer" format specifier for the width and height + (STR #1032) + - The web interface only showed the first 4 or 8 + characters of "{variable-name}" for undefined template + variables (STR #1031) + - The hpgltops filter did not handle a common PCL + command to enter HP-GL/2 mode (STR #1037) + + +CHANGES IN CUPS V1.1.23rc1 + + - The lpr man page did not document the "-U" option (STR + #998) + - The scheduler no longer sends the page-set option when + printing banner pages (STR #995) + - Fixed a debug message in the imagetops filter (STR + #1012) + - The lprm man page listed the "-" option in the wrong + order (STR #911) + - The hpgltops filter contained two buffer overflows + that could potentially allow remote access to the "lp" + account (STR #1024) + - The lppasswd command did not protect against file + descriptor or ulimit attacks (STR #1023) + - The "lpc status" command used the wrong resource path + when querying the list of printers and jobs, causing + unnecessary authentication requests (STR #1018) + - The httpWait() function did not handle signal + interruptions (STR #1020) + - The USB backend used the wrong size status variable + when checking the printer status (STR #1017) + - The scheduler did not delete classes from other + classes or implicit classes, which could cause a crash + (STR #1015) + - The IPP backend now logs the remote print job ID at + log level NOTICE instead of INFO (so it shows up in + the error_log file...) + + +CHANGES IN CUPS V1.1.22 + + - The lpstat man page incorrectly listed the "-s" option + as using the equivalent of the "-p" option to list the + printers; it uses the "-v" option to list the printers + (STR #986) + - Now allow 0-length reads in the CUPS file API (STR + #985) + - cupsDoFileRequest() now sets cupsLastError() to + IPP_ERROR on network errors (STR #953) + - The pdftops filter didn't scale small pages up to the + output page size when the fitplot option was used (STR + #984) + - Fixed the ipptest program usage message (STR #959) + - Added Spanish man pages (STR #963) + - Fixed the order of comparisons in the client.conf + reading code (STR #971) + - cupsLangGet() incorrectly set the current locale (STR + #970) + + +CHANGES IN CUPS V1.1.22rc2 + + - The pdftops filter didn't check the range of all + integer attributes (STR #972) + - Documentation corrections (STR #944, STR #946) + - Also sanitize device URI in argv[0] (STR #933) + - cupsRasterReadHeader() didn't swap bytes for the + numeric fields properly (STR #930) + + +CHANGES IN CUPS V1.1.22rc1 + + - Now sanitize the device URI that is reported in the + error_log file (STR #920) + - Fixed some memory and file descriptor leaks in the job + dispatch code (STR #921) + - Deleting a printer could cause a crash with browsing + enabled (STR #865, STR #881, STR #928) + - Browsing would turn off if the scheduler got an EAGAIN + error (STR #924) + - The mime.types file didn't recognize PostScript as a + PJL language name (STR #925) + + +CHANGES IN CUPS V1.1.21 + + - The scheduler did not separate Digest authentication + parameters with commas (STR #882) + - Fixed some problems with image printing to custom page + sizes (STR #891) + - Removed the remaining scheduler code that did not use + the "close-on-exec" file descriptor flag to speed up + program invocations (STR #890) + - The "lpr -r" command removed the print file even if it + was not printed. It now only removes the file if the + job is successfully created (STR #886) + - Revamped the custom page size orientation fix (STR + #127) + - The lp, lpq, lpr, and lpstat commands now report when + an environment variable is pointing to a non-existent + printer instead of just saying "no default + destination" (STR #879) + - Queue names with 2 periods (e.g. "printer..2") were + not supported (STR #866) + + +CHANGES IN CUPS V1.1.21rc2 + + - Fixed a denial-of-service bug in the CUPS browse + protocol support (STR #863) + - The scheduler used a select() timeout of INT_MAX + seconds when there was nothing to do, which doesn't + work on IRIX (STR #864) + - Updated the cupsaddsmb program to use the new Windows + 2000 PostScript drivers instead of the Windows NT + printer drivers (STR #390) + - The gziptoany filter did not produce copies for raw + print jobs (STR #808) + - The cupsLangGet() function now uses nl_langinfo(), + when available, to get the current encoding (STR #856) + - Added a ReloadTimeout directive to control how long + the scheduler waits for jobs to complete before + restarting the scheduler (STR #861) + - Added a note to the default cupsd.conf file which + mentions that you must allow connections from + localhost for the command-line and web interfaces to + work (STR #850) + - The IPP backend incorrectly used the local port when + communicating with a remote server; this caused + problems with some custom configurations (STR #852) + - The cups-lpd mini-daemon wasn't using the right + default banner option (STR #851) + - Updated the new httpDecode64_2() and httpEncode64_2() + functions to handle arbitrary binary data, not just + text (STR #860) + - String options with quotes in their values were not + quoted properly by the scheduler (STR #839) + - Configure script changes for GNU/Hurd (STR #838) + - The lppasswd program was not installed properly by GNU + install when the installer was not root (STR #836) + - Updated the cups-lpd man page (STR #843) + - Fixed a typo in the cupsd man page (STR #833) + - The USB backend now defaults to using the newer + /dev/usb/lpN filenames; this helps on systems which + use the devfs filesystem type on Linux (STR #818) + - The config.h file did not define the HAVE_USERSEC_H + constant when the configure script detected the + usersec.h header file. This caused authentication + errors on AIX (STR #832) + - The lp and lpr commands now report the temporary + filename and error if they are unable to create a + temporary file (STR #812) + - Added ServerTokens directive to control the Server + header in HTTP responses (STR #792) + - Added new httpDecode64_2(), httpEncode64_2(), and + httpSeparate2() functions which offer buffer size + arguments (STR #797) + - The cupsGetFile() and cupsPutFile() code did not + support CDSA or GNUTLS (STR #794) + - The httpSeparate() function did not decode all + character escapes (STR #795) + - The cupstestppd program now checks for invalid Duplex + option choices and fails PPD files that use + non-standard values (STR #791) + - Updated the printer name error message to indicate + that spaces are not allowed (STR #675) + - The scheduler didn't handle HTTP GET form data + properly (STR #744) + - The pstops filter now makes sure that the prolog code + is sent before the setup code (STR #776) + - The pstops filter now handles print files that + incorrectly start @PJL commands without a language + escape (STR #734) + - Miscellaneous build fixes for NetBSD (STR #788) + - Added support for quoted system group names (STR #784) + - Added "version" option to IPP backend to workaround + serious bug in Linksys's IPP implementation (STR #767) + - Added Spanish translation of web interface (STR #772, + STR #802) + - The LPD backend now uses geteuid() instead of getuid() + when it is available (STR #752) + - The IPP backend did not report the printer state if + the wait option was set to "no" (STR #761) + - The printer state was not updated for "STATE: foo,bar" + messages (STR #745) + - Added new CUPS API convenience functions which accept + a HTTP connection to eliminate extra username/password + prompts. This resolves a previous authentication + caching issue (STR #729, STR #743) + - The scheduler did not correctly throttle the browse + broadcasts, resulting in missing printers on client + machines (STR #754) + - The scheduler did not pass the correct CUPS_ENCRYPTION + setting to CGI programs which caused problems on + systems which used non-standard encryption settings + (STR #773) + - The lpq command showed 11st, 12nd, and 13rd instead of + 11th, 12th, and 13th for the rank (STR #769) + - "make install" didn't work on some platforms due to an + error in the man page makefiles (STR #775) + - Changed some calls to snprintf() in the scheduler to + SetStringf() (STR #740) + + +CHANGES IN CUPS V1.1.21rc1 + + - Fixed some "type-punned" warnings produced by GCC when + -fstrict-aliasing is specified (STR #679) + - The PDF filter incorrectly calculated the bounding box + of a page (STR #682) + - The IPP backend did not use SSL when printing over a + port other than 443 (STR #730) + - The scheduler could crash when processing a Limit or + LimitExcept directive (STR #728) + - The lpq, lpr, and lp commands did not differentiate + between the server being unresponsive and the lack of + a default printer (STR #728) + - The PAM checks in the configure script did not stop + after the first match (STR #728) + - The cups-config man page was incorrectly placed in + section 3 (STR #728) + - The cupstestppd utility did not show a warning message + when a PPD file indicated BCP protocol support with + PJL (STR #720) + - The scheduler did not return the correct exit code + when startup failed (STR #718) + - The cupsRasterReadPixels() function checked for + EAGAIN, which caused problems on FreeBSD (STR #723) + - The cupsGetDests() function did not use the current + encryption setting (STR #653) + - The scheduler did not properly parse name-based + BrowseRelay directives in the cupsd.conf file (STR + #711) + - The IPP backend now supports the following options in + the device URI: encryption, waitjob, and waitprinter + (STR #699) + - The parallel, serial, socket, and USB backends did not + return a non-zero exit status when a job failed to + print in the middle of sending it (STR #715) + - Location directives in the cupsd.conf file were + case-sensitive for printer and class names, so + queue-specific access control was not reliable (STR + #700) + - cupsDoFileRequest() did not handle HTTP continue + status messages in all cases, causing sporatic + problems with IPP printers from some vendors (STR + #716) + - The rastertodymo driver now supports the Zebra ZPL + language (STR #713) + - The test suite no longer generates a printcap file, + which caused problems when testing as the root user + (STR #693) + - The scheduler now updates the accepting state of an + implicit class based upon the accepting state of its + member printers (STR #697) + - The pstops filter didn't properly skip leading PJL + commands (STR #664) + - The reinterpret_cast keyword was not highlighted when + printing C/C++ source files in prettyprint mode (STR + #694) + - Fixed a segfault problem with some of the client + programs (STR #668) + - When using RunAsUser, the scheduler did not correctly + set the ownership of the log files, preventing log + file rotation (STR #686) + - The image filters did not correctly load 1-bit PNG + files (STR #687) + - The pdftops filter did not show all annotation objects + in a PDF file (STR #674) + - The pdftops filter did not print the contents of + textual form elements, making it impossible to print a + filled-in form (STR #663) + - Integrated the MacOS X/Darwin USB backend into the + CUPS baseline (STR #661) + - The USB backend incorrectly reported "media tray + empty" (STR #660) + - The scheduler did not use a case-insensitive + comparison when checking for group membership, which + caused problems with Win9x clients printing via SAMBA + (STR #647) + - The scheduler did not report the addresses associated + with certain network errors, making troubleshooting + difficult (STR #648, #649) + - The cupstestppd program did not allow a default choice + of "Unknown" as required by the PPD spec (STR #651) + - The select() buffers are now allocated to be at least + as large as sizeof(fd_set) (STR #639) + - The LPD backend now supports overriding the print job + username via the device URI (STR #631) + - The scheduler did not handle an unknown MIME type when + checking for a CGI script (STR #603) + - Added a timeout optimization to the scheduler's main + loop to allow CUPS to sleep more of the time (STR + #629) + - The USB backend now retries printing to devices of the + form "usb://make/model" if any USB port shows up as + "busy" (STR #617) + - The httpGetHostByName() function did not range check + IP address values (STR #608) + - The httpUpdate() function could return HTTP_ERROR + instead of the HTTP status if the server closed the + connection before the client received the whole + response (STR #611) + - The LPD mini-daemon did not allow the administrator to + force banner pages on (STR #605) + - Added PAM support for Darwin/MacOS X (STR #550) + - The web interface now provides a "Set As Default" + button to set the default printer or class on a server + (STR #577) + - The HTTP authentication cache was broken (STR #517) + - The cupstestppd utility now fails PPD files that have + a DefaultOption keyword for a non-existance option + name (STR #476) + - Optimized the scanning of new PPD files on scheduler + startup (STR #424) + - The EPM list file did not include the bin, lib, or + sbin directories (STR #598) + - The web interface did not redirect administration + tasks to the primary server for a class or printer + (STR #491, #652) + - The cups-lpd mini-daemon did not reject print jobs to + queues that were rejecting new print jobs (STR #515) + - Some calls to the ctype functions did not account for + platforms that use a signed char type by default (STR + #518) + - The scheduler could use excess amounts of CPU if a CGI + program was sending data faster than the client could + take it (STR #595) + - Updated the Ghostscript 8.x integration stuff (STR + #484) + - The lpd backend used a source port of 732 by default, + which is outside of the range defined by RFC 1179; + also added a new (default) "reserve=any" option for + any priviledged port from 1 to 1023 (STR #474) + - The scheduler did not check for a valid Listen/Port + configuration (STR #499) + - The cupsPrintFiles() function did not always set the + last IPP error message (STR #538) + - The pstops filter did not write the PostScript header + line if the file began with a PJL escape sequence (STR + #574) + - The printer-is-accepting-jobs status of remote + printers was not sent to clients via browsing or + polling (STR #571) + - Browse packets did not indicate whether a printer + was accepting or rejecting jobs. + - The web interface did not show the printer state + history information (STR #592) + - The rastertoepson filter would crash under certain + cirsumstances (STR #583) + - The USB backend did not handle serial numbers using + the (incorrect) SN keyword and did not terminate the + make and model name strings properly (STR #471, STR + #588) + - The USB backend did not build on Solaris x86 (STR + #585) + - The cupsDoAuthentication() function did not use the + method name for Digest authentication (STR #584) + - The scheduler could crash if a print job could not be + printed and the PreserveJobHistory option was turned + off (STR #535) + - cups-lpd now logs the temporary filenames that could + not be opened in order to make troubleshooting easier + (STR #565) + - cupsGetJobs() now returns -1 on error (STR #569) + - Added localization for Belarusian (STR #575) + - The LPD backend used the full length of the hostname + when creating the data and control filenames, which + causes problems with older systems that can't handle + long filenames (STR #560) + - The scheduler did not refresh the common printer data + after a fast reload; this prevented banner and other + information from being updated (STR #562) + - The scheduler did not send common or history data to + the client when processing a CUPS-Get-Default request + (STR #559) + - The httpFlush() function did not always flush the + remaining response data in requests (STR #558) + - The scheduler could complete a job before it collected + the exit status from all filters and the backend (STR + #448) + - The PPD conformance tests did not catch group + translation strings that exceeded the maximum allowed + size (STR #454) + - Updated the client code in the scheduler to close the + client connection on errors rather than shutting down + the receive end of the socket; this caused resource + problems on some systems (STR #434) + - cups-polld didn't compile on Tru64 5.1B (STR #436) + - "lpc stat" crashed if the device URI was empty (STR + #548) + - The scheduler did not compile without zlib (STR #433) + - std:floor() cast needed on IRIX 6.5 with SGI C++ + compiler (STR #497) + - cupsRasterReadPixels() and cupsRasterWritePixels() did + not handle EAGAIN and EINTR properly (STR #473) + - RequiresPageRegion should not be consulted for Manual + Feed (STR #514) + - International characters were not substituted in + banner files properly (STR #468) + - Updated pdftops to Xpdf 2.03 code to fix printing bugs + (STR #470) + - The Digest authentication code did not include the + (required) "uri" attribute in the Authorization + response, preventing interoperation with Apache + (STR #408) + - The web interface could lockup when displaying certain + URLs (STR #459) + - The PostScript filters now convert underscores ("_") + to spaces for custom classification names (STR #555) + + +CHANGES IN CUPS V1.1.20 + + - The pstops filter didn't properly handle collated, + duplexed copies of documents with an odd number of + pages on printers that did not do their own collated + copies (STR #389) + - Tru64 doesn't define a prototype for hstrerror() (STR + #430) + - Updated the pdftops filter to use the annotation flags + instead of the subtype to determine whether to print + an annotation (STR #425) + - The French web interface localization did not use + absolute paths for the navigation bar (STR #428) + - The CUPS test suite did not undefine the PRINTER and + LPDEST environment variables. This could lead to bogus + test results (STR #380) + - The cupsLangDefault() function now works if you don't + have the base OS localization installed (STR #418) + - The pdftops filter no longer needs to create temporary + files with tmpnam (STR #406) + - The HTTP code did not use a case-insensitive + comparison when checking for the Basic authentication + method (STR #407) + - The httpEncode() function always added a trailing "=" + character, which is not required by the Base64 + encoding specification (STR #407) + - The signal handlers did not need to call sigset(); + this caused a recursion problem on some versions of + IRIX (STR #422) + - Moved the scheduler termination code into the mainline + to be consistent with the way other signals are + handled (STR #423) + - The cupsaddsmb program didn't export the new CUPS + driver for Windows properly (STR #390) + - The ppdOpen() functions did not issue an error when a + translation string exceeded the maximum allowed by the + Adobe PPD specification (STR #399) + - The default landscape orientation was not the same as + that defined in the PPD file (STR #397) + - Updated the pstoraster patch files and CUPS driver to + work with Ghostscript 8 (STR #402) + - The hpgltops filter did not skip PJL commands (STR + #379) + + +CHANGES IN CUPS V1.1.20rc6 + + - "lp -i jobid -H restart" would often return an error + even though the job restarted successfully (STR #362) + - The scheduler did not check for invalid allow/deny + addresses such as "11.22.33.44/24". It now masks off + the extra address bits and logs a warning message in + the error_log file (STR #337) + - The cupstestppd utility now checks for missing + ImageableArea and PaperDimension attributes for each + defined PageSize (STR #365) + - The IPP code did not wait for a reply indefinitely on + HTTP connections in "blocking" mode (STR #377) + - The web interfaces did not rewrite the default printer + URI properly (STR #299 and #369) + - The LPD backend passed the C and L commands in the + wrong order (STR #378) + - The Dymo label printer driver did not set the label + length properly (STR #373) + - The scheduler did not support job IDs higher than + 99999 (STR #371) + - The Visual C++ project files did not work (STR #366) + - The scheduler's cupsLangSeek() function did not reset + the "EOF" flag, preventing compressed files from being + typed properly in some cases (STR #368) + - The cupsLangGet() cache was only used if the locale + name provided an explicit character set name (STR + #354) + - The CUPS API convenience functions did not call + cupsLangFree() when they were done with the + localization data (STR #354) + - The scheduler did not return the + job-hold-until-supported or job-hold-until-default + attributes (STR #356) + - The cupsaddsmb program did not support the new CUPS + driver for Windows (STR #357) + + +CHANGES IN CUPS V1.1.20rc5 + + - The scheduler did not initialize the browse socket + file descriptor properly when only SLP browsing was + enabled (STR #259) + - The scheduler accessed the job attributes before they + were set (STR #347, fix to STR #335) + - The cupsCancelJob() function did not return 0 when the + job could not be canceled (STR #340) + + +CHANGES IN CUPS V1.1.20rc4 + + - The scheduler did not move the incoming job attributes + in the operation group to the job group (STR #335) + - The cupsDoFileRequest() function did not check for an + early HTTP response while sending the file (STR #314) + - The web interfaces did not quote #, ?, or . in printer + names, which caused some problems with the generated + URLs (STR #320) + - CUPS couldn't be completely compiled with the -dDEBUG + option (STR #331) + + +CHANGES IN CUPS V1.1.20rc3 + + - More SLP changes (STR #259) + - Revamped the child signal handling code to completely + avoid deadlock issues on Solaris (STR #325) + - The lpadmin command displayed an incorrect error + message when the "-u" option was provided with no + arguments (STR #313) + - The web admin interface did not display an error + message if the PPD file could not be loaded (STR #308) + - The ppdEmit() functions did not use the correct + orientation value position for custom page sizes (STR + #292) + + +CHANGES IN CUPS V1.1.20rc2 + + - The serial backend set the IXANY option on the port + for XON/XOFF flow control; this caused problems with + printers that returned status info but were not ready + for more print data (STR #287) + - The scheduler didn't support scripted index files + (index.php, index.pl, etc. - STR #290) + - The scheduler did not correctly localize script files + with "GET" variables (STR #268) + - Changes in job classification are now logged (STR + #289) + - Fixed a few more SLP-related bugs (STR #259) + - Updated the user/group configure checks for MacOS X + 10.3 (STR #270) + - Fixed an offset bug in the PDF filter (STR #284) + - The cupsDoRequest() and cupsDoFileRequest() functions + did not map several HTTP status codes to their IPP + counterparts. This made detecting certain conditions + very difficult (STR #277) + - Config, spool, and status files are now owned by the + scheduler user (usually root) with read permission for + the filter group (STR #283) + - The HP-GL/2 filter did not support the SI command, + some values for the AD and SD commands, and did not + rotate labels properly via the DI command (STR #282) + - The fax support did not update/set the job-hold-until + attribute when a fax job fails (STR #269) + - The cupsLangGet() function didn't support locales of + the form "ll.charset" (STR #271) + - The scheduler did not use the charset when getting the + language localization for a request; this caused extra + disk IO for every request (STR #271) + - The scheduler did not support requests with more than + one language specified (STR #267) + + +CHANGES IN CUPS V1.1.20rc1 + + - The scheduler now waits up to 60 seconds before + restarting to allow active jobs to complete printing + and pending requests to be processed (STR #226) + - The web interface did not work on systems where time_t + is 64 bits (STR #262) + - Added backend tweeks and content-length check from Red + Hat (STR #253) + - The USB backend now uses the 8255 constants instead of + the standard constants when reporting printer status + bits on Linux (STR #254) + - Added new cupsDoAuthentication(), cupsGetFd(), + cupsGetFile(), cupsPutFd(), and cupsPutFile() functions + to the CUPS API (STR #112) + - The PDF filter always scaled and offset pages; this + caused problems under MacOS X, so now the "fitplot" + option controls whether PDF files are scaled to fit + within the printable area of the page (STR #250) + - The LPD backend did not support the port number in a + URI (STR #247) + - Some filters didn't properly support boolean options + (STR #249) + - Landscape PDF files were not always offset by the + correct amount when rotating (STR #243) + - The scheduler could hang in a call to localtime() when + logging messages from the signal handler (STR #242) + - The PDF filter no longer prints form widgets; this + duplicates the behavior of Acrobat Reader (STR #241) + - cupsGetPPD() didn't handle a late termination of a + HTTP connection with the server (STR #220) + - ppdOpen() did not correctly check for "*PPD-Adobe-4." + on the first line of a PPD file. This caused incorrect + PASS results for some PPD files (STR #233) + - cupsEncodeOptions() did not allow boolean options to + use "yes" and "on" for true values (STR #227) + - The pstops filter only sent the TBCP exit sequence if + it was defined in the JCLEnd attribute in the PPD file + (STR #224) + - Support for more than 1024 files was broken on Solaris + 9 (STR #217) + - The setgroups() calls now pass in 1 group (the + configured group) instead of 0 for compatibility with + BSD and Darwin (STR #213) + - The scheduler's built-in broadcast throttling was + ineffective since incoming packets would cause the + next group of outgoing packets to be sent immediately + rather than waiting for the next time slot (STR #211) + - Added a new ppdSetConformance() function to set the + conformance requirements for PPD files. Currently only + two levels are defined, PPD_CONFORM_RELAXED and + PPD_CONFORM_STRICT, and the default is the relaxed + level (STR #212) + - The IPP backend did not correctly execute the + pictwpstops filter on OSX (STR #210) + - The LPD backend did not set the banner class when the + "banner=yes" option was specified in the device URI + (STR #209) + - The imagetoraster filter did not support all of the + page device attributes (STR #208) + - The pdftops filter incorrectly auto-rotated pages when + the user already had specified the proper orientation + (STR #207) + - Fixed AIX shared library support (STR #201) + - Added support for live testing with Valgrind (STR + #193) + - The CGI programs now collect the list of needed + attributes for the class, job, and printer template + files (STR #192) + - The scheduler now passes the first port that is bound + to the local loopback or "any" addresses to the CGI + programs rather than the port that the browser + connected to (STR #103) + - The cupstestppd program now checks for bad + JobPatchFile attributes and incorrect versions of the + Manufacturer attribute for HP printers (STR #155) + - The filter makefile incorrectly installed + libcupsimage.a in the filter directory (STR #180) + - The scheduler did not verify that the job history + files define the job-priority and + job-originating-user-name attributes (STR #178) + - The pstops filter didn't handle poorly-formed binary + PostScript files that had CTRL-D's in them (STR #156) + - The ppdOpen*() and cupsLangGet() functions did not + make a copy of the old locale strings when using the + POSIX locale when reading files, which apparently + caused problems with some implementations of the + standard C library. (STR #159) + - The pdftops filter did not work properly with some + embedded Type1C fonts (STR #177) + - Updated the pdftops filter to be based upon Xpdf + 2.02pl1 (STR #191) + - The scheduler did not reset the group list when + running CGI and filter processes (STR #185) + - The scheduler no longer calls malloc and free from the + signal handlers (STR #190) + - The USB backend now uses the manufacturer and model + strings if the description string is not available + (STR #174) + - The ppdOpen functions still supported the + VariablePaperSize attribute, which was removed in v4.0 + of the PPD spec. This caused problems with PPD files + that relocated the PageSize option to a non-standard + group (STR #158) + - The cups.list file referenced MAN1EXT, MAN3EXT, and + MAN5EXT, but none of those were actually defined (STR + #147) + - Chunked requests could cause a Denial of Service if + the connection is terminated before the first byte of + chunk data is sent/received (STR #143) + - Printers with special characters in their names were + not accessible from the web interface (STR #120) + - The lpstat command now shows the correct interface + script or PPD file, if any, for a print queue (STR #89) + - The lpstat command now shows the printer-state-message + and printer-state-reasons attributes whenever they are + not blank (STR #152) + - The French and German option-conflict.tmpl template + files did not get installed (STR #148) + - The cups.list.in file did not work when compiling + without shared libraries (STR #149) + - The DSOFLAGS included the LDFLAGS, which causes + problems on at least HP-UX (STR #150) + - The fax printer support did not keep track of the fax + capability bit (STR #144) + - The appleLangDefault() function could leak a small + amount of memory (STR #145) + - The ppdOpen() functions now mirror all normal + attributes to the attribute list; previously only + certain unassigned attributes would be added (STR + #139) + - The ppdEmitJCL() function wrote JCL commands to stdout + instead of the passed file pointer (STR #142) + - The httpGets() function could, in certain states, + block waiting for data (STR #132) + - The cupsEmitJCL() function not outputs an empty @PJL + command after the PJL language escape to work around + bugs in certain PJL implementations (STR #131) + - The cupsEmit*() functions didn't set the orientation + value properly (STR #127) + - The cups.spec file didn't list the rc2.d init + directory or the cupstestppd file (STR #134) + + +CHANGES IN CUPS V1.1.19 + + - The GNU TLS code incorrectly used + gnutls_check_pending() instead of + gnutls_record_check_pending() (STR #128) + - The ppdEmit() functions output "PageSize Custom" + instead of "CustomPageSize True" in the DSC comments. + Also, the custom page size code did not use the + ParamCustomPageSize attributes (STR #127) + - The cupstestppd command did not list the conflicting + options (STR #123) + - The lpq command did not ensure that there was + whitespace between the fields in the job listing (STR + #117) + - The German web templates had errors (STR #119) + - The configure script didn't specify the static + libraries properly when configuring with the + --disable-shared option (STR #104) + - The cups.list file used file dependencies for package + formats other than portable, RPM, and Debian (STR #98) + - cupsLangGet() didn't use its language cache (STR #97) + - "lpq -P" would segfault instead of showing a usage + message (STR #94) + - Fixed compiler warnings in pdftops filter (STR #96) + + +CHANGES IN CUPS V1.1.19rc5 + + - Jobs with banner pages that were printed to implicit + classes would get double banner pages for each + file/banner in the job (STR #68) + - The mime.convs file was missing the filter definition + for Windows BMP (image/x-bitmap) files (STR #85) + - The scheduler allowed some READ-ONLY job attributes to + be set, which could cause the scheduler to fail on the + next restart (STR #82) + - The lp and lpr commands did not report when the + scheduler was not responding; instead, the user would + incorrectly see a "no default destination" error (STR + #70) + - cupsLangGet() could fail on OSX due to a corrupt + language preference (STR #78) + - Added more checks for HTTP request timeouts. + - The scheduler dropped the first non-alpha character + after an open brace when doing attribute substitutions + in banner pages (STR #77) + - The scheduler child might send SIGUSR1 to the parent + before the signal handler was installed; this didn't + prevent the scheduler from starting but produced an + annoying error message (STR #45) + + +CHANGES IN CUPS V1.1.19rc4 + + - The lp command did not accept "-" for printing from + the standard input as required by POSIX 1003.1 (STR + #59) + - Added the job-originating-host-name information for + the page_log file documentation in the SAM (STR #31) + - The German web interface templates did not use the + right paths for job operations (STR #54) + - The scheduler would consume all available CPU if + started with a pending job in the queue (STR #35) + - The polling daemon allocated an extra localization + buffer but did not free it, causing cups-polld to + eventually use all available memory (STR #40) + + +CHANGES IN CUPS V1.1.19rc3 + + - The scheduler could get in an infinite loop cancelling + jobs using "cancel -u user dest" (STR #48) + - The "cancel -u user" command did nothing (it should + cancel all jobs on all printers owned by the named + user - STR #48) + - The scheduler would write 0-length job control files + (STR #46) + - Updated the French man pages (translation provided by + Gilles QUERRET) + - The scheduler would delete all printers from + printers.conf if a job was active when a HUP signal + was handled (STR #47) + - The cups-polld program would leak memory if it was + unable to send browse packets to the loopback + interface (STR #40) + - The scheduler did not put the + job-originating-host-name attribute in the job + attributes group. + - The text filter did not default to wrapping text as + defined by the IPP implementation document. + - Scan backends first, PPDs second (STR #37) + - Updated the Netatalk documentation in the SAM (STR #38 + and #39) + - The test suite sent text files to a non-PS print queue, + which requires ESP Ghostscript (provided separately). + Now send the JPEG test file (STR #33) + - The test suite did not show the estimated disk space + requirements (STR #33) + - The test suite did not set the MaxLogSize directive to + 0 to prevent log file rotation (STR #33) + - The test suite still setup the old CUPS Ghostscript + symlinks (STR #33) + - The pstops filter did not report the correct number of + copies for the page_log file when printing collated + copies to a printer that doesn't support them in + hardware (STR #32) + - cupsLangGet() needs to set the CTYPE locale to "C" + (POSIX) to avoid erroneous tolower/toupper values (fix + suggested by Bjoern Jacke) + - Fixed a typo in the cups.list.in file. + - Updated all of the Western European locales to default + to ISO-8859-15 (for Euro support, suggested by Bjoern + Jacke) + - Updated the German message catalog (update provided by + Bjoern Jacke) + + +CHANGES IN CUPS V1.1.19rc2 + + - cupsLangGet() now sets the encoding field based on the + trailing charset in the locale name, and doesn't look + for a message catalog in a specific locale.charset + directory. This fixes STR #26 and is more in line + with the CUPS 1.2 implementation. + - The configure script now aborts if the "ar" command or + compilers cannot be found. + - The static cupsimage library was not built by default. + - The path for the "ln" command was hardcoded in + Makedefs.in instead of being checked at configure time + (STR #28). + - Banner pages containing unescaped { characters would + not work. + - The printer-state-time collection attribute was + encoded as an enumeration instead of an integer. + - The printer-is-accepting-jobs collection attribute was + was not added to the collection value. + - The printer-state-sequence-number collection attribute + was not added to the collection value. + - Fixed typo and const mismatch in IPP backend. + - Updated the man pages for the new configuration + directives. + - Updated the SAM for MacOS 10.2, the CUPS drivers for + windows, the available LPD backend options, and the + new configuration directives. + - The imagetops filter didn't position images properly + on the page (STR #18) + - The configure script didn't add CPPFLAGS to the + compiler options or LDFLAGS to the DSO options (STR + #13) + - The scheduler would try to write a debug log message + when starting a job that contained a NULL string. + Since not all versions of snprintf() support NULL + string pointers this caused some problems (STR #20) + - The testipp program now supports reading of IPP + message files such as those used for the job history + in /var/spool/cups. + + +CHANGES IN CUPS V1.1.19rc1 + + - Added CUPS support files for Java, Perl, and PHP + (located in the "scripting" subdirectory...) + - The scheduler now supports fast-reloads of the + cupsd.conf file when it is updated via HTTP. + - The scheduler always changed the ownership of log + files; it now only does so if they are not in the /dev + directory (i.e. don't want to change the ownership and + permissions of /dev/null...) + - Added libpaper support (patch from Jeff Licquia) + - Added a new istring() rule for MIME types files that + does a case-insensitive comparison of strings. + - The cups-lpd mini-daemon now sends jobs to the default + queue when an empty queue name (or "lp" and there is + no "lp" queue) is sent. + - The scheduler now supports fax queues identified by a + "*cupsFax: True" attribute in the PPD file. When a job + can't be sent, it is held for 5 minutes by default + while other jobs are attempted. The FaxRetryLimit and + FaxRetryInterval directives control the number of + retries and the time between retries. + - The scheduler now preserves the default options of PPD + files when modifying/upgrading an existing PPD file. + When installing a new printer, the scheduler sets the + default media size to Letter or A4 as appropriate for + your locale. + - The scheduler no longer limits the number of + BrowseAddress, BrowsePoll, BrowseRelay, Listen, Port, + SSLListen, and SSLPort directives to 10. + - The scheduler now supports print files that have been + compressed using gzip. + - The scheduler used the stdio functions to read any job + ticket information in a PostScript print job. Since + some platforms limit the number of stdio files to 256, + job ticket information was ignored when the server had + a large number of clients connected to the system. + - Filters and backends may now report the total number + of pages ("PAGE: total NNN") to the scheduler. + - The LPD backend now supports timeout and + sanitize_title options (default to 300 and yes, + respectively) and has some additional changes to + reduce the chances of multiple copies being printed + when only one copy was requested. + - Fixed a polygon drawing bug in the HP-GL/2 filter. + - Added a robots.txt file to the standard install to + prevent search engines from indexing the CUPS server. + - Added support for STATE: messages + (printer-state-reasons), printer-state-history, and + printer-state-time to the scheduler. + - When using RunAsUser, the scheduler would initially + start any previously queued (pending) jobs with + RunAsUser disabled - all backends would be running as + root. + - If a backend failed for a printer, CUPS would + incorrectly requeue the job for printing again. + - Added support for IPP collections and files. + - Added experimental support for generic CGI scripts and + programs, Java, Perl, PHP, and Python to the + scheduler. See the file "CGI.txt" for more + information. + - The CUPS API now supports HTTP cookies and the Expect: + field. + - The cancel command now correctly supports the "-u + user" option to cancel all jobs for the named user. + - The Purge-Jobs operation now supports the my-jobs + boolean attribute and a new purge-jobs boolean + attribute to control whether job history data is + purged from the scheduler; the default is false for + my-jobs and true for purge-jobs to match the original + implementation. + - The scheduler would not timeout printers when only + using SLP browsing. + - If the scheduler was unable to execute a filter, it + would try to restart the job indefinitely until the + filter could be executed. + - When writing BSD printcap files, the scheduler now + includes the rm and rp attributes, allowing the file + to be exported to LPD clients. [Patch from Dominic + Kubla] + - The scheduler optimization to reference IPP attribute + data instead of performing a full copy caused problems + when the referenced data was deleted before it was + sent. It now only references attributes that change + only when the scheduler is restarted. The change also + reduced the memory footprint of a printer object to + 2k. + - The scheduler now holds signals while logging messages + to avoid potential deadlock issues when handling + signals on Solaris 8. + - The lpadmin command now allows printer access control + by group name as well as user name. + - "lpoptions -l" got in an infinite loop if no default + printer was available. + - The scheduler now logs the job-originating-host-name + attribute in the page_log file, and uses "-" for any + empty fields (patch from Dominik Kubla). + - The pdftops filter now scales PDF pages within the + printable area of the page. + - The pstops filter didn't include the page-label and + classification boxes when printing EPS or non- + conformant PS files. + - The imagetops filter didn't always correctly position + the image on the page when printing in landscape + orientation. + - The ppdEmit() functions now support the + RequiresPageRegion attribute when sending InputSlot + and ManualFeed commands. + - The PPD loading code now supports standard options + outside of OpenUI/CloseUI as required by the PPD spec. + - The cupstestppd program has been upgraded to provide a + concise PASS/FAIL report, additional detailed + conformance testing, and support for gzip'd PPD files. + - The PPD loading code is now much more strict when + loading a PPD file, and tracks more format errors. + - The scheduler ignored child signals when gathering the + list of available devices, when it should have been + using the default signal handler. + - The cupsEncodeOptions() function could encode an + option with a NULL last string. + - The socket backend could report the wrong number of + backchannel bytes if an error occurred on the link. + - The cups-polld program now only sleeps after getting + all printers and classes. This allows for longer + intervals without excessive delays before classes show + up... + - Added a new httpWait() function to support waiting for + data for a specific number of milliseconds. + - httpGets() now times out after 1 second on + non-blocking HTTP connections. + - The scheduler no longer accepts rangeOfInteger values + that are out of order (e.g. 5-1) + - The sides attribute was incorrectly sent as a name + value; it is a keyword value. + - The IPP backend now detects if the destination queue + has gone away and reports an error. + - The scheduler and HTTP API now allocate their select() + sets to support larger numbers of clients on systems + that support it. + - The scheduler now sets the CFProcessPath environment + variable under MacOS X. + - The cupsLangDefault() function now uses the + CoreFoundation localization API under MacOS X. + - The httpSeparate() function didn't handle file URIs of + the form "file:///path" properly. + - The lpadmin command now supports a "protocol" option + for specifying the binary communications protocol to + use when printing binary PostScript data. + - The scheduler did not properly parse the SystemGroup + directive, so only the first group would be used. + - Revamped how strings are stored in the scheduler, + providing a substantial improvement in memory usage + for systems with large numbers of printers. + - The PostScript filter now supports binary PostScript + files and files beginning with the PJL language escape + sequence. + - The PPD API now provides additional information from + the PPD file. + - The USB backend didn't compile on Solaris Intel. + - The cupstestppd utility now supports the "-q" option + (quiet) for use in scripts, etc. + - Merged several weight-reducing changes into the CUPS + baseline donated by Apple. + - Added preliminary support for CDSA; patch provided by + Apple. + - Implicit classes are now created from identical + printer classes on the network. + - The lp command now supports a "-H restart" option to + restart previously printed jobs. This functionality + only works if you have enabled the PreserveJobFiles + option. + - The scheduler now supports URIs in HTTP request lines + to conform to the HTTP/1.1 specification. + - The time-at-xyz attributes were not recognized in + banner files if prefixed by a question mark, e.g. + "{?time-at-creation}". + - Added support for pre-filtering application/pictwps + files on MacOS clients before sending them to a server + via IPP. + - The scheduler now allows file:/dev/null device URIs + even if FileDevices is set to No. + - CUPS uses strerror() for hostname resolution errors, + when it should have used hstrerror(). + - The USB backend no longer tries to guess the serial + number of a device from the USB devices file; this + means that printers that don't report their serial + numbers in the device ID string will not be + individually selectable. + - The pstops filter didn't handle page ranges properly + when a page contained an embedded document. + - Added a translation of the web interface to German. + - When printing using the OutputOrder=Reverse option + with duplexing, the output order is now truly + reversed; the order of sub-pages when printing N-up is + the same. + - The pstops filter did not always output the extra + blank page when printing a document with an odd number + of pages with duplexing enabled. + - The ippAddXYZ functions no longer allow the + application to add less than 1 value. + - Fixed a URL rewrite bug in the web interface - local + access was sometimes redirected away from localhost... + - The ppdOpen() functions could get in an infinite loop + if the PPD file contained a keyword or text that was + too large for the buffer. + - Added preliminary support for GNU TLS; patch provided + by Jeff Licquia. + - Now timeout IPP attribute reads after 1 second inside + an attribute definition. + - Now timeout connections that have been shutdown (due + to errors) after 30 seconds instead of the Timeout + setting (300 seconds by default). This provides + faster recovery from DoS attacks. + - A denial-of-service attack warning message was being + written to the log files by the scheduler for every + detection. This caused a DoS of its own in some + situations. The warning message is now written no more + than once per minute. + - Fixed the CIE colorspace support code in the image and + PS RIPs. + - The job-quota-period, job-page-limit, and job-k-limit + attributes were not flagged as integers, so setting + quotas would not work. + - Added an additional response check in the scheduler to + more quickly recover from denial-of-service attacks. + - The cupstestppd file was incorrectly installed in the + /usr/sbin directory instead of /usr/bin. + - The EPM list file did not include the cupstestppd + program or man page files. + + +CHANGES IN CUPS V1.1.18 + + - Fixed a bug in the Set-Job-Attributes code in the + scheduler that would cause it to crash or continuously + write a job control file. + - SECURITY FIX: The scheduler now provides a FileDevice + directive to control whether new printers can be added + using device URIs of the form "file:/filename". The + default is to not allow printers with these device + URIs. + - The scheduler did not compute the cost of filters + properly, nor did it choose a multi-filter solution + with a lower cost than a single filter solution. + - Now install CUPS PPD file test utility (cupstestppd) + to support basic conformance testing of PPD files. + - The scheduler now logs an error message when it sees a + non-conforming PPD file. + - Upgraded pdftops filter to Xpdf 2.01 with fixes for + TrueType fonts. + - Added a MaxClientsPerHost configuration directive to + provide limited protection against Denial of Service + attacks. + - SECURITY FIX: Potential underflow/overflow bug in web + interface. + - SECURITY FIX: Race condition in certificate creation. + - SECURITY FIX: Bad URIs in browse packets could be used + to exploint the web interface underflow/overflow bug. + - SECURITY FIX: Some types of Denial of Service attacks + were not handled properly, so once the attack was over + the scheduler did not close the connections + immediately on all platforms. + - SECURITY FIXES: Added integer overflow/underflow + checks for all image formats. + - The pstops filter didn't reset the showpage operator + back to its original at the end of a job; this + prevented the concatenation of documents (used + primarily for CUPS 1.2...) + - The cupsGetPPD() function didn't always set the + cupsLastError() value when an error occurred. + - The IPP media, output-bin, and sides attributes took + precedence over the corresponding PPD options, which + caused inconsistent behavior under MacOS X with some + PPD files. + - The cupsaddsmb utility specified the wrong number of + arguments to the adddriver command when adding the + Win9x PostScript drivers. + - The web interface did not always report the correct + error message. + - The scheduler did not clear the POSIX signal action + structure when waiting for the child to send it a + SIGUSR1 signal; this could cause the signal handler + not to be called properly, preventing the parent + process from returning. + + +CHANGES IN CUPS V1.1.17 + + - The "manual_copies" option did not work when the LPD + backend had to retry a print job. + - The image filters did not convert GIF images properly. + - The RunAsUser option was incompatible with the new + daemon-mode code in 1.1.16. + - Fixed a problem with the Set-Job-Attributes and + PostScript job ticket code in the scheduler - the + "last" attribute pointer was never updated, which + could cause the scheduler to crash when applying job + ticket data. + - Fixed a problem in the scheduler that caused it to + continue processing HTTP requests on a connection + after it was shutdown. + - The scheduler now allows accounts authenticated via + PAM to not have a corresponding UNIX account, but + group membership still requires the account name to be + listed in the UNIX group file(s)... + - The scheduler used a fixed-size (16k) buffer for + encoding job options for filters; it now dynamically + allocates and expands the buffer as needed depending + on the options that are sent in a job. + - The pdftops filter didn't support all of the MacOS + characters for MacRoman encoded fonts. + - The cupsEncodeOptions() and cupsParseOptions() + functions now conform to the grammer defined by the + current draft of the PAPI specification. The main + difference is that option=yes and option=no are no + longer treated as boolean options. + - The IPP backend didn't honor the encryption settings + in /etc/cups/client.conf. + - Fixed a potential bug in the HTTP code which was + caused by servers sending the status line and + newline(s) in separate packets. + - User-defined classification strings are now printed + verbatim - previously the classification box would be + empty. + - Re-added Spanish to the list of PPD languages that + CUPS supports. + - CUPS API library user and temp file updates for + Windows. + - The image filters did not properly handle grayscale + printing of Sun Raster images. + - The scheduler never reset the NumJobs variable before + loading the job list (previously this only happened on + a full start, so the problem was never apparent...) + - The HTTP and IPP read/write code didn't handle EINTR + (interrupted system call) errors. + - When under high load, the scheduler could abort due to + the wrong errno value after a select() call. This was + caused by the child signal handler. + - Added new load tests to the test target to verify that + cupsd can handle hundreds of simultaneous jobs without + error. + - The Solaris USB backend now supports the new device + URI syntax. + - The ppdOpen*() functions now reset the numeric locale + settings while loading a PPD file. + - Fixed the libtool build rules. + - The manpage make rules didn't use $(MAKE) and + $(MFLAGS) for the language subdirectories. + - Now set the LC_TIME locale category to get the + properly localized time string. + - Fixed a problem in the scheduler that would cause the + web interface problems when adding, modifying, or + configuring a printer or class. + - The backends now ignore SIGPIPE so that failed job + filters will not stop a print queue. + - The lpstat command did not allow for destination lists + ("lpstat -v printer1,printer2") + - Fixed parsing of long filter status messages in the + scheduler. + - Added some startup performance enhancements to the + scheduler so that the printer object information is + regenerated fewer times and the MIME type database is + not filled with lots of empty filters for raw/direct + queues. + - The LPD backend now sends the job title as the print + filename. + - Added support for variable sizes in the EPSON dot + matrix printer drivers. This allows for pages as + short as 1/2" (1 row of labels) and does not do an + automatic form feed. + - French translation updates. + - The filters did not quote the page label string when + embedding it in PostScript output. + - The serial backend now enumerates serial ports under + MacOS X. + - The pdftops filter contained font rasterizer code that + wasn't being used and that depended on X11. This code + has been removed. + + +CHANGES IN CUPS V1.1.16 + + - The cancel and lprm commands now both display an error + message and return a non-zero exit status if an + attempt is made to cancel a job on a non-existent + printer. + - The lpoptions command incorrectly complained if a + request to delete a non-existent printer was made. + - If the client.conf file defines an alternate server + name, the "configure printer" action in the web + interface might not work. + - The lpstat command now supports a "-W" option so that + you can display completed jobs as well as + not-completed (pending) jobs. + - The lp and lpr commands did not return an error when + one or more files in a set of files for printing could + not be printed. + - The lp, lpadmin, and lpstat commands now consistently + return with a non-zero exit status when an error + occurs. + - The scheduler would not accept print jobs sent to a + stopped remote printer. + - The texttops filter incorrectly converted the page + numbers in the prettyprint header to double-byte + characters when printing a non-Unicode text file. This + caused an extra space to appear between each digit in + the page number. + - The scheduler did not use a case-insensitive + comparison when adding filters for a printer. + - Upgraded the pdftops filter to Xpdf 1.01. + - The scheduler no longer passes the page-border and + number-up-layout attributes to filters when printing + banner pages. + - The LPD backend now uses a 30-second timeout when + sending commands and control files, and a 30-second + timeout when retrieving responses from an LPD server. + If a timeout occurs, it retries indefinitely. This + helps to make LPD printing over VPNs work more + reliably. + - The USB backend now supports device URIs based on the + printer serial number and/or model number under Linux. + This avoids the "wrong device filename" problem when + using more than one USB printer. + - Now just shutdown the receiving end of a client + connection when sending an error that requires the + server to disconnect from the client afterwards. This + fixes a problem when doing remote administration with + encryption enabled. + - The scheduler did not send a printer-state-message + attribute if the string was empty; it now always sends + this attribute. This caused the printer message to be + displayed for other printers in the web interface. + - The LPD backend now supports a "manual_copies" option, + e.g.: "lpd://server/queue?manual_copies=no", in order + to handle copies for raw jobs to printers that don't + implement the LPD protocol properly... + - The "mirror" option was not being handled by the + PostScript or image filters. + - Updated the cupsaddsmb command to support the new CUPS + driver for Windows NT/2k/XP. + - Filter status lines longer than 1023 characters could + cause the scheduler to get into an infinite loop. + - The scheduler didn't reset the job state to pending + when modifying an active printer. + - Now limit the maximum number of recursion steps when + searching for a filter for a job, in case a user + defines a circular filter rule. + - The PostScript filter would embed an invalid + requirements comment in some cases. + - Added support for embedded job tickets in PostScript + files. + - The PostScript filter now detects EPS files and should + better handle printing EPS files. + - The cancel command now ignores a trailing destination + name when cancelling a specific job ID (Solaris + compatibility). + - The scheduler now rejects jobs with copies outside the + range of 1 to MaxCopies, inclusive. + - Added new MaxCopies directive to set the maximum + number of copies that a user can request. + - The scheduler didn't block signals while it processed + others and when it forked processes. + - The scheduler checked for new jobs to print when + stopping a job. This caused jobs to restart before a + shutdown. + - Updated the CUPS startup script to better support + different timezones and to support the RedHat/Mandrake + init script functions, if available. + - The scheduler did not properly handle backslashes in + banner files; it incorrectly assumed that "\c" should + always be replaced by "c", instead of only looking for + "\{" and replacing it by "{". + - The texttops filter didn't handle prettyprint=no. + - The text and HP-GL/2 filters didn't check for other + common duplex option names like cupsMarkOptions() did. + - "lpoptions -x printer" no longer clears the "default + printer" status of the printer. + - cupsTempFd() now stops trying to create a temporary + file after 1000 tries, and aborts on any error other + than EEXIST. This should prevent lp/lpr hangs due to + a bad or missing temporary directory. + - The lpadmin command did not send the right URI to the + scheduler when setting options on classes. This + caused a client-error-bad-request error. + - The CUPS API convenience functions would attempt to + connect to the remote server name in a + "printer@server" printer name instead of dealing with + the default (usually local) server. Aside from + causing user confusion, the remote server name might + not be resolved properly, causing further problems. + - "lp -q" would cause the "lp" command to segfault, as + the program would try to print the option letter that + caused the error using the wrong index into the + command-line; bugfix from Debian. + - Fixed a minor inconsistancy in the encoding of boolean + attributes from printer options in + cupsEncodeOptions(). + - Added a FilterNice directive which sets the priority + of job filter processes that are run by the scheduler. + - Added Solaris x86 USB printer support. + - The USB backend now reports both the ulpt and unlpt + devices under *BSD. + - The "lpstat -o" command would truncate the + "printer-jobid" string if it was longer than 21 + characters. + - The PJL-based MIME type rules now look in the first + 1024 bytes instead of just the first 512 bytes to find + the language mode. + - The image file types are now listed explicitly in the + mime.convs file so that additional image file formats + do not use the standard CUPS image filters by default. + - Updated the Software Programmers Manual to include + all of the CUPS API functions. + - ppdOpen*() no longer sorts choices for an option. + - The web interface now enforces constraints in PPD + files when configuring a printer. + - When stopping a printer, the scheduler didn't set the + printer state before stopping the current job. + - The cupsaddsmb utility now lists all data files for + Win9x and WinMe clients when installing that Windows + driver. + - Jobs submitted to a class now bounce immediately to + the next available printer rather than waiting until + that printer is available. + - Filters and backends now also get the CLASS + environment variable set when a job is printed to a + printer class instead of a normal printer. + - Added French translations of the web interface, CUPS + Overview, Software Administrators Manual, and Software + Users Manual contributed by Marian REYT-LLABRES. + - Added several "hint" messages for common configuration + problems that are stored in the error_log file. + - httpSeparate() now unquotes %xx characters in the + username:password field of a URI. + - When starting the scheduler in daemon mode, the parent + process now waits for the child to signal it is ready + to accept connections. + - Added -F option to cupsd to run cupsd in the + foreground but detach from the controlling terminal + and current directory. + - The scheduler did not reload jobs when receiving a HUP + signal; this would cause problems since the pointers + into the file type database would no longer be valid + for existing jobs. + - The scheduler did not save the network interface list + update time, thus no caching of the network data was + actually provided. + - Updated the SuSE PAM configuration file. + - The LPD backend now supports a "reserve" option and no + longer reserves a priviledged port by default. + - The cupsaddsmb command now continues past printers + that do not have a PPD file to export. + - The lpstat command didn't treat printer names as + case-insensitive. + - The lpstat command now reports the printer location + attribute with "lpstat -l -p". + - Fixed a bug in the vsnprintf() emulation function, + which was used on old versions of HP-UX, IRIX, and + Solaris. + - The number-up option was incorrectly being used when + printing banner pages. + - Added support for Greek and Slovak PPD files. + - CUPS now supports printer names containing any + printable character, e.g. "123-abc", "foo-bar", etc. + - The null filter was not supported in mime.convs due to + a bug in the filter validation code. + - Changes in the default printer and printer attributes + were not always reflected in the generated printcap + file. + - Implicit classes did not inherit the location or + description from member printers. + - The httpGetHostByName() function did not handle + hostnames that started with a number. + - Updated the filters to use the %cupsRotation comment + instead of %%Orientation to auto-rotate pages, since + the use of %%Orientation is inconsistent. + - Added the RootCertDuration directive to control how + often the root authentication certificate is updated. + - Increased the size of the IPP write buffer to 32k to + allow for larger attribute values and to provide more + efficient output of large numbers of attributes. + - The polling daemon now retries the initial connection + to the remote server; this fixes a problem when the + remote server is unavailable when the scheduler starts + up... + - The scheduler didn't validate Digest users against the + system group(s), so Digest and BasicDigest + authentication didn't work for administration + operations. + - The scheduler now passes the SHLIB_PATH environment + variable to child processes (HP-UX shared libraries) + - The scheduler now maps accesses from the loopback + interface to "localhost". + - The cups-lpd mini-daemon sent a status code byte in + response to queue state commands, but those commands + only return textual data. + + +CHANGES IN CUPS V1.1.15-1 + + - The lpc and lprm sources didn't include the CUPS + string function header, which is required on systems + that don't have their own snprintf() function. + - The French manpage Makefile tried to install the + language subdirectories when it (obviously) didn't + have to. + + +CHANGES IN CUPS V1.1.15 + + - Updated the CUPS license agreement for the new MacOS + license exception. + - The printer-info attribute now defaults to the printer + name if no value has been set. + - ppdOpen() and friends now add an "Auto" InputSlot + option if none is provided to automatically select the + correct tray. + - Updated the ppdEmit() and ppdEmitFd() functions to + (re)mark the correct PageSize or PageRegion option + depending on the selected ManualFeed or InputSlot + options. + - ppdEmitFd() didn't handle custom page sizes. + - Darwin uses instead of + . + - The jobs.cgi web interface now handles all job + operations, allowing the administrator to allow "job + administrators" or operators to manage jobs (but not + queues) on the server. + - The cupsDoFileRequest() function now checks if the + filename passed into the function is a directory, and + returns the IPP_NOT_POSSIBLE error if so. + - New SCSI printer backend. + - Cleaned up handling of locales with trailing character + set definitions. + - Fixed handling of invalid PPD attributes inside + OpenUI/CloseUI. + - Fixed a problem with SSL and the job, printer, and + admin CGIs on ports other than 443. + - The scheduler didn't handle AuthClass properly. + - Added French translation of man pages. + - Updated the text filter to support the const_cast, + dynamic_cast, and static_cast keywords in ISO C++. + - Now use strlcat() and strlcpy() (or emulation + functions) for easier string/buffer protection. + - The auto-generated printcap/printers.conf files now + have a small comment header explaining where the file + comes from... + - The PostScript filter now supports 6, 9, and 16-up + output, as well as new page-border and + number-up-layout options. + - The lpoptions command didn't set options properly when + using the default printer. + - Added ConfigFilePerm and LogFilePerm directives. + - Increased maximum size of MIME types to IPP_MAX_NAME + to allow for longer printer names. + - No longer create remote printers when loading job + history data. + - The printer-make-and-model attribute wasn't set when + the PPD file didn't contain a NickName attribute. + - Now handle PPD files with translation strings longer + than 80 bytes - they are truncated if they go over... + - The scheduler didn't handle signals until after it + loaded the configuration files the first time; this + caused problems on some installations that would + restart the scheduler as the system booted into run + level 3. + - Now throttle broadcasts like we do for polling. + - Fixed a bug in the reading of PPD files using CR's + instead of CR LF's or LF's. + - The scheduler would crash if cupsd.conf contained a + BrowseProtocols line with no protocols listed. + - The HTML job operation templates now link back to the + destination printer or class. + - The serial backend now detects USB serial devices. + - The LPD mini-daemon (cups-lpd) now passes the + job-originating-host-name attribute to the scheduler + (cupsd). + - Updated the IPP backend to reconnect after downgrading + from IPP/1.1 to 1.0, and when sending requests to HP + JetDirect interfaces that don't support HTTP + Keep-Alive like they should. + - Now pass NLSPATH and DYLD_LIBRARY_PATH environment + variables, if defined, to CGI and job processes. + - Removed the pstoraster filter (based on GNU + Ghostscript 5.50) and now provide the raster "driver" + and patch file necessary to use the current GNU + Ghostscript 7.05 release. + - Removed unnecessary fonts and updated the Courier and + Symbol fonts to the latest versions to better support + non-ISOLatin1 text. + - The text filter now always embeds the Courier and + Symbol fonts to ensure that they contain the full set + of glyphs. + - The lp and lpr commands now only override the SIGINT + handler if it is not being ignored (patch from Robert + Ambrose for some interactive software that catches + SIGINT and will gracefully cancel the print...) + - The PostScript image filter (imagetops) now supports + printing CMYK images using the CMYK colorspace. + - The image filters now support CMYK JPEG files, and + correctly handles the inverted files from Photoshop + (which seems to save RGBW data, not CMYK...) + - Added a "check" target to the top-level makefile to + conform with GNU standards (same as "test"). + - The IPP code didn't always map the POSIX locale "C" to + the proper IPP language code. + - The cupsaddsmb program was updated to use the + setdriver command instead of addprinter. + - Banner pages were not handled properly for implicit + classes. + - When tunneling to a remote system using SSH, the + printer URIs for local printers on the remote system + did not reflect the correct port number. + - The Allow, Deny, BrowseAllow, BrowseDeny, and + BrowseAddress directives now support the network + interface names "@LOCAL" and "@IF(name)" for access + control and browsing based on the current interface + addresses instead of fixed names or IP addresses. + - The texttops filter did not properly recognize the + "nowrap" (wrap=false) option. + - The InstallableOptions group name in a PPD file is now + translated separately (CUPS_MSG_OPTIONS_INSTALLED) so + that UIs can accurately detect the presence of this + group. + - The scheduler no longer keeps job history data for + remote printers on the client (just on the server.) + - The parallel and USB backends now retry if the backend + detects that the printer is not connected to the + system (rather than stopping the queue...) + - The network backends now retry if the backend detects + that the printer is not connected to the network or is + unreachable (rather than stopping the queue...) + - The cupsGetDests() function no longer lists options + and instances for printers that no longer exist. + - The scheduler now converts the document language to + the correct LANG string. + - The cupsaddsmb program now supports alternative CUPS + and SAMBA server names. + - The PostScript filter now supports the Orientation + comment and rotates the page as needed automatically. + - Revamped the makefiles slightly to use automatically + generated dependencies. + - Build fixes for OS X. + - The TIFF reading code depended on the newest version + of libtiff; now conditionally compile that portion of + the loader. + - The PPD code now decodes all JCL options in the + JCLSetup group, not just those options that start with + the prefix "JCL". + - The backends now read print data using the read() + system call to ensure that the current page is printed + while the next page is being processed. + - The pdftops filter did not support shading type 3 + (radial fill) for the "sh" operator. + - The cups-polld program now throttles the local + broadcasts of polled printers and classes so that the + local system is not overwhelmed with hundreds of + printers and classes all at once. + - Updated the serial backend to support 230,400 baud for + the Linux PPC port. + - The cupsGetJobs() function wouldn't report completed + jobs that did not have a document-format attribute + value. + - The cupsEncodeOptions() function now maintains a table + of known boolean and numeric options, and encodes all + other options as strings. + - Now add a newline before the end-of-page code in the + PostScript filter; this fixes a problem with files + that don't end with a newline. + - The image filters looked for the "orientation" option + instead of the correctly named "orientation-requested" + option. + - The cupsEncodeOptions() function now handles mixed + integers and ranges. + - New translation guide for developers to provide native + language support for CUPS. + + +CHANGES IN CUPS V1.1.14 + + - The ippRead() function did not verify that the + attribute name length or string with language value + was not larger than the read buffer. + - The scheduler set the signal handlers before loading + the configuration files the first time; this prevented + the RunAsUser directive from blocking server reloads. + - Added Swedish message catalog. + - The parallel backend now recognizes the /dev/printers + device directory under Linux 2.4.x. + - MacOS X fixes. + - The cupsaddsmb utility sent the server name after the + user information when executing the rpcclient program. + This caused problems with some versions of SAMBA + 2.2.x. + - The IPP backend did not pass the requesting user name + when checking on the print job status. This prevented + it from waiting for the job to complete when + communicating with some IPP implementations that + require it. + + +CHANGES IN CUPS V1.1.13 + + - The lpstat command did not report jobs submitted to + regular printer classes. + - The texttops filter didn't use sufficient precision + when positioning text with some values of cpi and lpi. + This could cause the alignment of text to stray. + - cupsGetDests() didn't merge the options from the + /etc/cups/lpoptions file with ~/.lpoptions - options + in ~/.lpoptions overrode them completely. + - Added support for KOI8-R and KOI8-U character sets, + and added several Russian message catalogs. + - The scheduler put the wrong timezone offset in the log + files (e.g. +0500 instead of -0500 for EST...) + - The scheduler did not ignore trailing whitespace in + *.convs files. + - The scheduler now forces all processes to exit (kill + -9) when it is stopped. This prevents parallel and + USB devices from running in the background after cupsd + goes away. + - The cupsParseOptions() function didn't skip trailing + whitespace after quoted values. + - More changes to support CUPS on OS/2. + - Added Simplified Chinese message catalog. + - Added PAM support for IRIX. + - The cupsGetPPD() function didn't remove the @server + portion of the printer name, and since it would + connect immediately to the remote server instead of + the local server, the printer would not be found. + - Classification and page labels were not rotated to + match the page orientation. + - Now set the TCP "no delay" option on network + connections to improve performance/response time. + - Improved the IRIX printing tools support with patches + from Andrea Suatoni. + - Added a new PrintcapGUI directive to specify the GUI + option panel program to use for the IRIX printing + tools support. + - The cupsGetDests() function did not check to see if a + user-defined default printer (set via lpoptions) still + existed. + - The pstops filter no longer assumes that the default + dictionary is writable when doing N-up processing. + - The pstops filter now supports printing N-up with the + page-set option. + - The imagetoraster filter now supports direct printing + of CMYK image data without conversion/correction. + - The IPP backend now reports printer state/error + conditions when possible (toner low, media empty, + etc.) + - The lpstat command now supports the (undocumented) + IRIX -l option ("-lprintername") for a compact job + listing for a printer. + - The lpstat command now includes printer date/time + information in the output (always Jan 01 00:00) to + make third-party tools happy. + - The text filter now supports non-integer cpi and lpi + values. + - The Margins field in the CUPS raster header was not + initialized by the pstoraster filter. + - Added --with-optim="flags" option to configure script. + - Updated the Italian message translations. + - Updated the cups.list file to install the correct + files. + - The pstoraster filter accessed the third element of a + 2 element array. + - The scheduler did not setup a status pipe for polling + processes, so error messages went to whatever file + descriptor 2 was pointing to when they were started. + - The httpMD5Final() function didn't put a colon between + the password and nonce strings. + - The pstops filter did not default to Binary data for + "%%BeginData:". + - The pstops filter did not stop processing when a line + containing a CTRL-D is seen. + - The scheduler no longer replaces the JobSheets values + from the printers.conf and classes.conf files with the + classification level, if set. This way the original + banner settings are preserved when classification + levels are changed or turned off. + - The serial backend didn't drain the output queue, nor + did it restore the original settings. + - Updated the default system group under MacOS X. + - If no SystemGroup was defined in cupsd.conf, the + system default group was not used. + - The cups-lpd mini-daemon now supports LPD clients that + send multiple control files. + - httpConnectEncrypt() now always uses encryption for + connections on port 443, since port 443 is reserved + for the "https" scheme. + - Group authentication via certificates did not work + from the web interface for accounts other than + "root". + - The serial port backend did not clear the OPOST + option, which could cause problems with some printers. + - The cups-lpd mini-daemon didn't lookup the client IP + address properly. + - The parallel backend now identifies the polled and + interrupt-driven devices under *BSD. + - The scheduler allowed the "always" encryption mode + inside a Location, which is not valid. + - The CUPS startup script now checks for the timezone + information under Linux. + - Now also map the sides attribute to the JCLDuplex + option (if present) in PPD files. + - Updated pdftops to Xpdf 0.93a. + - Added support for MD5 passwords under Slackware. + - Added new AuthType BasicDigest that does Basic + authentication using the MD5 password file managed by + the lppasswd command. + - The banner page attribute substitution code now + retains {name} sequences in banner files when the + named attribute is undefined. Use {?name} to + conditionally substitute an IPP attribute. + - The scheduler now ensures that the ServerRoot + directory and configuration files are owned by and + writable by the User and Group in cupsd.conf. + - The USB backend now lists all USB printer devices + regardless of whether a printer is connected or not. + This allows new USB printers to be connected without + restarting cupsd. + - Added some more minor performance tweeks to the IPP + protocol code to reduce copying and array indexing. + - The cupsaddsmb utility now uses the -c option with + smbclient and rpcclient to avoid the read length limit + for commands on the standard input. + - Added an include file to the CRD handling code in + pstoraster so that it would compile properly on 64-bit + pointer platforms... + + +CHANGES IN CUPS V1.1.12 + + - Added "Polish" to the list of known languages for PPD + files. + - Added missing directory definition to cups-config. + - The CUPS-Move-Job operation did not set the + destination type for the new destination. + - The CUPS-Add-Printer operation did not support the + allow=all or deny=none values to clear the per-user + printer ACLs. + - The SetPrinterAttrs() function did not handle invalid + PPD files that were missing the required NickName + attribute. It now looks for NickName, ModelName, and + then substitutes the string "Bad PPD File" for the + printer-make-and-model attribute. + + +CHANGES IN CUPS V1.1.11 + + - Added support for embedded TrueType fonts in PDF + files. + - Added support for PostScript functions in PDF + files. + - Added new "cupsaddsmb" utility for exporting + CUPS printer drivers to SAMBA/Windows clients. + - Added preliminary support for Darwin/MacOS X. + - The CUPS-Add-Printer operation no longer allows + arbitrary scheme names in device URIs to be used - it + now restricts the available schemes to those found in + the device list (lpinfo -m). + - The ippRead() and ipp_read_file() functions could not + handle more than IPP_MAX_VALUES (100) values in a + 1setOf attribute. These functions have been updated + to dynamically allocate more memory as needed, and the + IPP_MAX_VALUES constant now represents the allocation + increment. [this caused some versions of the + GIMP-print drivers to fail since the number of media + options exceeded 100...] + - The scheduler could crash when BrowseShortNames + was set to "No". + - The scheduler did not prevent MaxClients from being + set to 0, which could cause the scheduler to go in an + infinite loop when accepting a request. + - Made some performance optimizations in the ippRead() + functions to make IPP request/response processing + faster. + - The accept/reject/enable/disable command did not + support properly support the "-h" or default + server name. + - The scheduler did not save the quota configuration + when the job-quota-period attribute was set to 0. + - The LPDEST and PRINTER environment variables did not + support printer instances. + - The text filter now handles more types of boldface and + underline formatting. + - The cupsTempFd() function did not fail if the + temporary directory did not exist; this would cause it + to loop indefinitely instead of returning an error + (-1). + - Stopping (disabling) a printer class did not stop jobs + from printing to printers in that class. + - The cupsGetDests() function was sending the + requested-attributes attribute as a name instead of a + keyword; this caused a serious performance problem on + slower systems since more information had to be + transferred from server to client. + - The web interfaces did not always quote < and & in + things like the job title. This had the potential for + browser-based security violations (on the browser's + machine); bug report from SuSE. + - The scheduler now treats unauthenticated usernames as + case-insensitive when doing quota and allow/deny + processing. + - The lp command sent the "request ID is ..." message + to stderr instead of stdout... + - The PostScript filter (pstops) now handles EPS files, + adding a showpage command to the files as needed. + - The configure script checked for the header + file before the JPEG libraries; since the JPEG headers + can define HAVE_STDLIB_H, the configure check would + cause the JPEG check to fail on some systems. + - The scheduler now supports localized banner files, + using the subdirectory approach, e.g. the "es" + subdirectory under /usr/share/cups/banners is used for + the Spanish banner files. + - Updated the scheduler so it knows the correct + language abbreviation to use for all supported + PPD LanguageVersion values. The new code also + supports country codes as well, so "English-GB" + maps to the "en_GB" locale. + - The cups-lpd mini-daemon did not support + anonymous printing (no username specified). + While the username is REQUIRED by RFC-1179, + MacOS clients do not send the REQUIRED username + information when printing via LPD. + - Added many warning and informational messages + to cups-lpd where they were missing. + - Added Czech message file contributed by SuSE. + - The cups-lpd mini-daemon now returns a non-zero + status if an invalid destination or job ID is + provided. + - The scheduler did not honor the KeepAlive setting in + cupsd.conf. + - Increased the size of the file read/write buffers to + 32k. + - *BSD static library creation fixes. + - Use mkstemps() instead of tmpnam() in pdftops whenever + possible. + - Added httpGetHostByName() function as a wrapper around + gethostbyname() - some implementations of this + function do not support IP addresses (e.g. MacOS X.) + - Added casts to all printf's of file lengths, since + there is currently no standard way of formatting long + long values. + - The client filename field was not cleared in all + instances, resulting in old form data being submitted + to CGIs. + - The httpConnect*() functions now try all available + addresses for a host when connecting for the first + time. + - The pstoraster filter would "lose" all drawing + commands when the PageSize was set but the printer + bitmap was not reallocated. This was most noticeable + with the output from StarOffice 6 beta and would + result in a blank page being output... + - The IPP backend was sending a PAGE comment even when + printing the output from a filter (it should only send + page comments when printing files directly...) + - The pdftops filter didn't properly map glyph names of + embedded Asian TrueType fonts. + - Changed the CUPS startup script to look for a program + named "cupsd", not just any program with "cupsd" in + the name (this caused the apcupsd UPS monitoring + daemon to be stopped/restarted...) + - The CUPS-Move-Job operation did not change the + internal destination name for held jobs, so moved (but + held) jobs would still show up as queued on the + original destination. + - The cups-polld program didn't send the + requested-attributes attribute in the + CUPS-Get-Printers and CUPS-Get-Classes requests, which + made it use more CPU and bandwidth than required. + - The scheduler and CUPS API incorrectly added a + job-sheets-default attribute for remote printers. This + caused banner pages to be omitted from client system + prints. + + +CHANGES IN CUPS V1.1.10-1 + + - Minor fixes to the filter, systemv, and template + makefiles to install files properly. + + +CHANGES IN CUPS V1.1.10 + + - Added a driver for DYMO label printers. + - Added new ClassifyOverride directive to allow users + to override the classification of individual jobs. + - Added new BrowseProtocols directive to control which + browse protocols are used (currently CUPS and SLP). + - Added SLPv2 support (thanks to Matt Peterson for + contributing the initial implementation for CUPS.) + - Adding a raw printer on a remote CUPS server now + correctly redirects PPD file requests to the remote + server. + - The serial backend now limits writes to 1/10th + second worth of data to avoid buffer overflows + with some types of flow control. + - The scheduler did not properly process PUT requests, + so configuration files could not be uploaded to the + server. + - The scheduler did not strip trailing whitespace on + lines in the configuration files. + - The httpWrite() function did not transition the PUT + request to the HTTP_STATUS state to get the status + from the server. + - The scheduler did not properly handle trailing null + ("-") filters when testing a driver that sent data + to the file: pseudo-backend. + - The IPP backend now only sends a document-format of + "application/vnd.cups-raw" when printing to another + CUPS server using a local printer driver or interface + script. Previously the job's document format was + used, which was incorrect. + - The lpadmin command didn't use the ppd-name attribute + with the -m option; this prevented the use of the + "raw" model from the command-line. + - The pstoraster filter output draft (1-bit) 6-color + output in the wrong order; this resulted in yellow + being printed instead of black on Stylus Photo + printers. + - The pdftops filter did not have the Japanese and + Chinese text support compiled into it. + - The IPP and AppSocket backends did not clear the + "waiting for print job to complete" status message, + which caused some confusion... :) + - The serial backend now opens the port in "no delay" + mode to avoid DCD detection problems with some OS's. + + +CHANGES IN CUPS V1.1.9-1 + + - The configure script did not substitute the + correct user and group names. + - The configure script did not use the full path + to the install-sh script when it was used. + - The pstoraster filter did not correctly support + DuplexTumble mode for printers that used flip + duplexing. + - The cups.list.in file was missing from the + distribution. + - The New DeskJet series driver did not use the + correct OrderDependency for the Duplex option. + - Use read() instead of fread() to read piped + print files in lpr/lp. This avoids a bug in the + HP-UX 10.20 fread() function. + - Updated the pstoraster filter to use the MIPS_FIXADE + system call under IRIX to fix bus error problems on + R12000 processors (Ghostscript is not 64-bit clean...) + - Some Xerox PPD files (most notably the Phaser 790) + have illegal whitespace in the option keyword in the + OpenUI line. This caused the PageRegion option to not + be recognized properly for the Phaser 790. + + +CHANGES IN CUPS V1.1.9 + + - Revamped the configure script to use a modular + approach for the various tests. + - Added --with-openssl-* options to properly reference + the OpenSSL libraries in DSOs. + - Added --with-cups-user and --with-cups-group + options to specify the default user and group for + CUPS. + - Added AIX shared library support. + - Added AIX device discovery for the serial and + parallel ports. + - Now use install program or script to install + directories, files, and symlinks. + - Updated pstops filter to use strict handling of EPS + files embedded in a PostScript document. The %%EOF + handling in 1.1.8 caused some dvips files not to + print. + - Fixed yet another memory allocation bug in pstoraster + that would cause it to crash. This fix also ensures + that all memory allocations are done on (at least) a + 64-bit boundary. + - Fixed Digest authentication - httpGetSubField() didn't + skip the Digest keyword. + - The scheduler did not properly handle Digest + authentication with the new multiple-group support. + - The scheduler did not allow usernames that were + not in the UNIX password file to be used for Digest + authentication from passwd.md5. + - The scheduler could not scan PPD files that only used + a carriage return (i.e. MacOS PPD files); the new code + is also about 40% faster, so servers with thousands of + PPD files should start much faster now. + - The scheduler now stores the PPD file size and + modification times in the ppds.dat file, so it can now + incrementally update the PPD database from the model + directory, resulting in significantly faster startup + times. + - The lpinfo command did not return a non-zero status + code if an error occurred. + - Fixed a bug in the scheduler's UpdateJob() function. + Basically, all jobs shared the same status buffer, and + the "buffer start" pointer could point to 1 byte + before the beginning of the buffer. The new + implementation uses a separate buffer for each job and + eliminates the buffer start bug. + - The IPP backend would send N copies of a document if + the receiving device didn't support the copies + attribute, even if the upstream driver already added + the necessary commands to generate the copies. This + was most noticeable with HP printers where N * N + copies would come out instead of N. + - The PostScript filter (pstops) did not properly handle + duplex printing on inkjet printers that provide this + option. Copies would be put on the front and back + sides of the duplexed page, and the filter did not + output an even number of pages. + - The backends always caught SIGTERM after they + connected to the printer. This prevented raw jobs + from being cancelled early. + - The cupsSetDests() function now removes any printers, + instances, and options that are not defined by the + user or server. This should prevent old system-wide + options from being used in individual user accounts. + - Updated the EPSON printer driver and added PPDs for + the newer EPSON Stylus printers that only support the + "ESC i" graphics command. + - The lpadmin command didn't allow you to add remote + printers to a local class. + - The lpadmin command didn't allow you to set the + options (quotas, etc.) for a class. + - The scheduler did not load or save the + job-sheets-default attribute for classes. + - The scheduler did not automatically recreate remote + printers that were part of a class. + - It was possible for a printer class to list the same + printer more than once. + - The scheduler now makes a backup copy of classes.conf + and printers.conf before writing the new file. + - The lppasswd program incorrectly asked for a new + password when deleting an existing MD5 password + account. + - The scheduler did not match "/printers/name.ppd" + against a location of "/printers/name". + - The client code did not always handle HTTP encryption + upgrades properly. + - The client code now caches the last Digest password so + it can retry using a new resource path or nonce value, + which are included in the MD5 sum sent to the server. + This should eliminate unnecessary password prompts + when using Digest authentication. + - The lppasswd command didn't have a man page. + - Updated the PJL detection rules to allow the universal + escape to occur anywhere in the first 128 bytes of the + file. + - The cups-polld program would poll servers continuously + with no delay if there was an error contacting the + server. + - The IPP backend would send an empty job-name or + requesting-user-name attribute if the corresponding + job attribute was an empty string. While this is + allowed by the IPP specification, some HP JetDirect + implementations return a client-error-bad-request + error if an empty name attribute value is received. + The new code only sends these attributes if they are + not the empty string. + - At least some versions of the HP JetDirect firmware + do not correctly implement IPP. Added additional + checks to the IPP backend to eliminate extra, + unsupported attributes which should normally be + ignored by a compliant IPP device. + - The scheduler did not copy the complete list of + supported file types into the + document-format-supported attribute. This caused + clients to not send the local file type (such as + application/vnd.cups-raw for raw print files) and the + corresponding bad output in some cases. + - The scheduler did not fully copy attributes from a + set-job-attributes request - string attributes were + only referenced, which could cause cupsd to crash + or behave irratically. + - The lp command didn't send the right value for the + job-hold-until attribute when "-H resume" was + specified. + - The IPP backend now returns as soon as a job is + completed or reported as "pending-held". + - Added new ImplicitAnyClasses and HideImplicitMembers + directives to the cupsd.conf file to make implicit + classes more usable/transparent to the user. + - Clients can now (with the appropriate authentication) + retrieve and update the server configuration files + using HTTP GET and PUT requests. + - The web interface didn't allow you to modify the + location or description of the printer. + - The pdftops filter now uses its own temporary file + function to work with PDF files using LZW compression + (which use the uncompress program or gunzip) + - The SystemGroup directive now supports specification of + multiple groups. + - Added new Include directive to cupsd.conf, a la + Apache. + - Added new pseudo-driver/PPD called "raw" that can be + used to create/convert a raw queue. This also allows + raw queues to be created in the web interface. + - The pdftops filter didn't handle image objects that + used JPEG and Flate compression together. + - The pstops filter counted pages wrong when using the + N-up and even/odd printing options. This prevented + the page-ranges option from working properly. + - Added another fix to pstoraster for a bus error + condition caused by a lack of parenthesis in the + Ghostscript code. + - Added new "natural-scaling" option which scales the + natural size of the image (percent of natural image + size instead of percent of page size.) + - The lppasswd program is now setuid to the CUPS user + instead of root. + - The PPD functions did not allow for PPD files that + defined the page sizes and margins before the page + size options. + - The mime.types file now checks for the PJL "LANGUAGE = + Postscript" command for PostScript files. + - The scheduler did not truncate file: output files. + - The PPD file reading code did not handle options with + raw quotes (") in the human-readable names. + - The pdftops filter now remaps the space character when + (bad) PDF files contain a .notdef glyph for the space + character. + + +CHANGES IN CUPS V1.1.8 + + - Updated spec file to generate separate cups-pstoraster + package for pstoraster. + - The spec file wasn't setting LOGDIR in the install. + - The scheduler might restart a stopped printer after + stopping a print job. Thanks to Florent + Guiliani for finding this bug! + - The init script showed run level 0 for the Red Hat + chkconfig program. This is incorrect because Red Hat + doesn't use run level 0 for shutdown scripts. + - The IPP backend did not handle the + client-error-not-found error when checking the status + of the job that was sent. This caused remote queues + to stop on client machines when the server had job + history disabled. + - Added httpConnectEncrypt() function to avoid + performance penalty for setting up encrypted + connections initially. + - Use httpConnectEncrypt() in all client apps and in the + CUPS API to ensure consistent usage of encryption + throughout. + - Jobs weren't queued to remote classes (fix from + Richard Begg.) + - AIX changes from Richard Begg. + - Fixed the pstops fix for GNOME output - no longer use + the page numbers in the %%Page: comment since GNOME + puts a filename instead (!?@!#?!). There is still an + issue with N-up printing since GNOME defines its fonts + in the first page instead of the document setup section + (pages must be independent according to the DSC spec) + People with GNOME printing problems should consult bug + #54489... + - The imagetops filter produced PAGE: messages when + generating PostScript for a non-PostScript printer + (only affects page-label and Classification + options.) + - The updated pdftops filter was looking for an options + file called xpdf.conf instead of pdftops.conf. + + +CHANGES IN CUPS V1.1.7 + + - Configuration script changes, including new + "--with-docdir=/dir" option to relocate CUPS + documentation and web content according to your + favorite version of the FHS. + - Documentation updates for encryption, SLP, etc. + - New Software Test Plan and automated test script to + test CUPS prior to installation. + - All scheduler configuration files are now case + insensitive to match Apache. + - Added support for Apache ListenBackLog, Require, + Satisfy, , , and LimitRequestSize + directives. + - Added support for all Apache log levels... + - Added support for "double" HostNameLookups. + - Added new "RunAsUser" directive to support non-root + configurations on the standard (priviledged) ports. + - Added support for non-root invocation of the lpd + backend (does no reserve a priviledged port, which + might not work with some LPD servers...) + - Added new PrintcapFormat directive to control the + output format of the printcap file (BSD or Solaris + formats are supported at present.) + - The CUPS directory service routines now handle + ECONNREFUSED errors gracefully rather than shutting + all browsing off. + - ippErrorString() now returns the recommended error + messages from the IPP/1.1 Model and Semantics + document. + - Fixed a minor IPP compliance issue with responses + to requests without the attributes-charset or + attributes-natural-language attributes. + - Sun fix: need httpFlush() call for chunked IPP + requests in cupsDoFileRequest(). + - httpConnect() now looks up "localhost" by name and + by address (127.0.0.1) for users the go to the + trouble of removing the required localhost entry + in /etc/hosts or on their DNS server... + - Added support for Linux 2.4.x devfs parallel port + filenames (/dev/parallel/N). + - cupsDo[File]Request() and cupsGetPPD() no longer + block trying to reconnect to a crashed or inaccessable + server. + - Added new ppdEmitJCL() function to better handle + PJL commands from PPD files. + - A bug in UpdateJob() would cause the scheduler to + consume 100% CPU until another request was submitted. + - The cancel command did not support the "-" option to + cancel all jobs on all printers. + - The cancel and lprm commands did not support cancelling + the next/current job in the queue. + - The pdftops and pstoraster filters were using unsafe + temporary file functions; while this is not a problem + in normal configurations (the CUPS temporary directory + is restricted), they now use the cupsTempFd() function. + - The mime.types file was missing the recognition rule + for Sun Raster images. + - The admin CGI was passing a printer make string to + ippSetCGIVars() that was being replaced in that + function. + - "lpoptions -l" would resave the options... + - The EPSON drivers now send the "end packet mode" + command when printing to USB devices. + - The scheduler initialized certificates before loading + the cupsd.conf file. + - The scheduler used /dev/random to collect random data, + which could block if insufficient entropy information + had been collected by the kernel. Now use + /dev/urandom. + - Fixed a bug in the whitespace skipping code in + httpGetSubField(). + - The LPD backend now supports a new "order" option: + "lpd://server/queue?order=control,data" (default) and + "lpd://server/queue?order=data,control". + - The scheduler enforced a 30 second timeout on all + clients regardless of the Timeout directive and if a + CGI was currently running. + - cupsParseOptions() now sets boolean options to + option=true or option=false. + - The "percent complete" calculations in the LPD backend + could overflow on large files, causing the percentage + to wrap to 0 every 40MB or so. + - Fixed a memory reallocation bug in pstoraster that + could cause it to crash. + - The LPD backend now sanitizes the job title to avoid + potential problems on remote LPD servers. + - The lp command did not send the requesting-user-name + attribute when altering a job. + - The pstops filter did not handle PostScript files with + lines longer than 8191 bytes. + - The scheduler no longer uses inet_addr() to convert IP + addresses in dot format (mmm.nnn.ooo.ppp) to the + 32-bit format, since it will not work for IPv6 + addresses. + - New "Classification" directive to force labeling of + the current classification on each page. + - New "page-label" attribute to add per-page labels + ("For Official Use Only", "Draft", etc.) + - The scheduler now sets the HTTPS environment variable + for CGI programs when a client connects using + encryption. + - Fixed a recursion bug in the scheduler that could + cause cupsd to crash when a printer was removed. + - The LPDEST and PRINTER environment variables didn't + support instances. + - Dropped the "file" backend from the device list that + is reported, since it is only available for *testing* + and should never be used in a production environment. + The file: device can still be used, but it won't show + up in the list of devices from lpinfo or the web + interface. + - Added support for /dev/lpa# parallel ports under *BSD. + - Added META variables to the CGI header template to + prevent caching of the results. + - Fixed an unaligned memory buffer for the pstoraster + clist states; this caused bus errors for some + combinations of printers, drivers, and options. + - Re-added black reduction for colorful colors; this + helps to prevent dark colors from getting desaturated. + (only used when converting RGB to CMYK) + - Added two new directives - MaxJobsPerPrinter and + MaxJobsPerUser - to allow an administrator to set + the maximum number of pending jobs in a queue or + submitted by a user. + - The scheduler no longer stops a printer if it can't + create the status pipe or run the filters or backend. + This will allow heavily loaded servers to service + clients or start print jobs as the load allows. + - Fixed a bug in the Set-Job-Attributes code that could + crash the scheduler (patch from Martin Zielinski) + - cupsSetDests() did not quote option values with + embedded spaces. + - Added support for the Enable-Printer and + Disable-Printer extension operations (same as + CUPS-Accept-Jobs and CUPS-Reject-Jobs.) + - The AppSocket and IPP backends now wait for the print + job to be finished before exiting; this should prevent + the loss of print jobs with older JetDirect firmware + and make consecutive print jobs print faster. + - The BMP loading code did not handle resolution values + of 0. This is a problem with BMP image files produced + by the GIMP. + - The HTTP Upgrade code (upgrade to TLS encryption) + bypassed the authentication checks. + - The HTTP Upgrade code did not send a 426 status code + to the client and end the current request. This caused + a race condition between the client and server for the + upgrade to TLS. + - Fixed a bug in the EOF and Trailer detection code in + the pstops filter. + - The imagetoraster filter did not add the margins to + the custom page size in the raster header. + - The imagetops filter did not adjust the custom page + size to the size of the printed image. + - The imagetops filter did not include DSC comments + which are required by some printers. + - The imagetops filter did not insert newlines in + Base85 encoded output, causing files to contain + lines longer than 255 characters (violation of the + DSC). + - Added support for the DeskJet 900 series duplexer + and CRET color modes in the HP driver. + - Added support for PPD-defined margins in the HP + driver. + - Fixed the debugging output from pstoraster - the + font list was not terminated by a newline. + - Some versions of the HP-UX pam_unix authentication + module apparently do not pass the appdata_ptr argument + to the conversation function, preventing the scheduler + from authenticating users using PAM under HP-UX. A + workaround using a static variable has been added to + address this problem. + - Fixed a bug in the scheduler SortPrinters() function + that could cause printers to disappear or the + scheduler to crash when adding a printer. + - Changed the pstops filter to not do per-page filtering + if the file does not conform to at least version 3.0 + of the document structuring conventions. This seems + to "fix" printing with broken apps. + - The image filters did not handle older TIFF files that + lacked the samples-per-pixel and bits-per-pixel tags. + - Added new cupsGetJobs() and cupsFreeJobs() functions + to manage print jobs. + - cupsEncodeOptions() would encode names of 0 length and + cupsAddOption() and cupsParseOptions() would add names + of 0 length. + - The scheduler might block waiting for status messages + after starting a new print job. Thanks to Florent + Guiliani for finding this bug! + + +CHANGES IN CUPS V1.1.6-3 + + - The configure script put the JPEG library before the + TIFF library; this caused problems in some + configurations since the TIFF library also supports + JPEG compression of TIFF images. + - Updated the configure script and makefiles to handle + admin man pages with the "1m" extension (HP-UX, IRIX, + Solaris, Tru64) and in odd directories (IRIX) + - The updated cupsTempFile() function did not return + the filename when called with a filename buffer of + NULL (previously it used a static buffer.) + - FreeBSD uses /dev/unlptN, but NetBSD and OpenBSD use + /dev/ulptN. + - DeletePrinter() didn't remove the printer from any + classes it was a member of. + - DeletePrinterFromClass() didn't preserve the + implicit status of a class. + - DeletePrinterFromClasses() didn't remove printers + from implicit classes. + - StartJob() didn't send the job-sheets, job-priority, + and job-hold-until attributes to remote printers. + - LoadAllJobs() was looking for job-sheets-completed + instead of job-media-sheets-completed. This would + prevent accumulation of page data after a restart + of the scheduler. + - The pstops and imagetops filters now generate copies + using the appropriate method for a Level 1, 2, or 3 + printer since some Level 2/3 printers don't support + the /#copies variable anymore. + - The man page for cups-lpd did not mention the "-o" + option. + - The IPP backend didn't handle version-not-supported + errors and revert to IPP/1.0 (previously it only checked + for a bad-request error) + - Caldera fix: lpc now reports unimplemented commands as + unimplemented, not invalid. + - Caldera fix: lpq didn't recognize BSD lpq "-a" option. + - Caldera fix: lpr didn't recognize BSD lpr "-1", "-2", + "-3", "-4", "-q", or "-U" options. + - RedHat fixes: patches to GNU Ghostscript + - SuSE fix: temp file creation patch to GNU Ghostscript + (pstoraster). + - SuSE fix: remove cgi-bin/abort.c and cgi-bin/email.c, + which are not used. + - SuSE fix: missing NULL check in cgi_initialize_post(). + - SuSE fix: potential buffer overflows in + cgi_initialize_string(). + - SuSE fix: potential buffer overflows in + ippSetCGIVars() + - SuSE fix: more NULL checks in ppdOpen(); also make + sure that all memory is freed on error to avoid memory + leaks. + - SuSE fix: Exit from child if setgid() or setuid() + fails. + - SuSE fix: Added setgroups() calls after setgid() and + setuid() calls. + - SuSE fix: potential buffer overflows in httpEncode64() + calls. + - SuSE fix: potential buffer overflows in httpSeparate() + - SuSE fix: potential buffer overflows in ippWrite() for + bad input. + - SuSE fix: potential nul skip in ppd_decode() for + missing hex digits. + + +CHANGES IN CUPS V1.1.6-2 + + - Added changes to support NetBSD startup scripts. + - Added separate compiler options for pstoraster + (Ghostscript) to avoid compiler-induced errors + from Ghostscript's twisted code. + - The mime.types file contained syntax errors. + - Updated the *BSD USB device filenames to use + the /dev/unlptN files so that the USB device + is not reset prior to printing (causes print + corruption on many printers) + - Added new cupsTempFd() function to avoid serious + security bug in glibc fopen() function. The glibc + fopen() function unlinks a file before creating it, + which opens up possible symlink attacks. + - Now reject 0-length names in add-printer and add-class + requests. + - Fix for pstoraster when ZLIB is not available. + - cupsGetPPD() didn't reconnect when a HTTP connection + was lost. + - SuSE fix: httpConnect() didn't check that the + value from gethostbyname() was a valid IPv4 address. + - SuSE fix: httpConnect() didn't allow file descriptor 0 + to be used for a socket. + - SuSE fix: ippRead() didn't confirm that all values in + a set were numeric or string types. + - SuSE fix: lppasswd race condition fixes. + - SuSE fix: directive names could overflow buffer when + reading *.conf files. + - SuSE fix: HEAD requests for PPD files did not use the + same logic as GET requests. + - SuSE fix: possible buffer overflow when adding + /index.html to requested directory name. + - SuSE fix: possible buffer overflow when converting + IPP attributes to string options for filters. + - SuSE fix: creating file: device output with mode 0666 + instead of mode 0600. + - SuSE fix: creating job info files with mode 0640 + instead of 0600. + - SuSE fix: don't rely on snprintf() for including + system name in log filenames. + - SuSE fix: add bounds checking when copying quoted + and hex strings. + + +CHANGES IN CUPS V1.1.6-1 + + - Added configure check for getting the correct + strftime() format string; %c is not Y2k safe, + and %KC and NULL are not universally supported. + + +CHANGES IN CUPS V1.1.6 + + - Fixed another possible DoS attack in httpGets() + - Added check for "LANGUAGE = PCL" and "LANGUAGE = + POSTSCRIPT" in mime.types. + - Resolution options were not being passed into the + filter programs properly. + - The default compiler options for GCC no longer include + "-g3", which apparently is deprecated in newer + versions of GCC. + - CheckJobs() could cause cupsd to crash if a job is + cancelled in StartJob(). + - The printers.conf and classes.conf files are now + written with restricted permissions. + - The round-robin algorithm used by FindAvailablePrinter() + had problems; fixes contributed by Joel Fredrikson. + - If LoadAllJobs() is unable to determine the file type + of a print job, assume "application/vnd.cups-raw". + - The web interface now provides a job_printer_name + value for any corresponding job_printer_uri value. + - The cups-lpd mini-daemon now logs the client address + and hostname as well as all commands and errors in the + syslog file. + - The IPP backend now detects the supported file formats + and only specifies the document format if it is + supported. This makes IPP printing to network print + servers and cards more reliable without affecting the + capabilities of CUPS servers. + - The time_at_xyz attributes are now converted to human- + readable dates and times for the web interfaces. + - The HP and EPSON sample drivers now correctly catch + signals and eject the current page when a job is + cancelled. + - Fixed bug in CGI code - did not ignore control + characters (e.g. newlines) in form data. This caused + sporatic web interface problems. + - The file type logging code in the scheduler referenced + the optional document-format attribute; the new code + uses the resolved MIME type instead. + - The client.conf parsing code now removes trailing + whitespace. + - The MaxJobs directive was being treated as a boolean + instead of an integer. + - The scheduler would not timeout remote printers if + BrowseInterval was set to 0. + - The lpadmin command now supports setting of options + and user-level access control. + - Added "-E" option to all printing commands to force + encryption. + - The client code did not consume the response to the + OPTIONS request when switching to secure mode. + - The scheduler did not output a Content-Length field + when responding to an OPTIONS request. + - Added documentation on using cups-lpd with xinetd + to the man page. + - The socket backend now starts retries at 5 seconds and + increases the interval to 30 seconds. This should + provide faster printing when multiple jobs/files are + queued for a printer. + - The filters and backends no longer buffer output to + stderr. This should provide much more accurate status + reporting. + + +CHANGES IN CUPS V1.1.5-2 + + - Fixed configure check for OpenSSL to work with RSA + code. + - Added configure check for , and use this + check in backend/serial.c. + - Updated configure script handling of data, + configuration, and state directories to use datadir, + sysconfdir, and localstatedir variables. + - NetBSD uses different serial port filenames than + FreeBSD and OpenBSD. + - The pdftops filter didn't need some X-specific files. + - The scheduler makefile doesn't do a chown anymore when + installing (cupsd did this automatically on startup + anyways) + + +CHANGES IN CUPS V1.1.5-1 + + - There was a typo in the top-level Makefile + - The top-level Makefile did not install an init script + for run level 5. + - The configure script did not add the "crypto" library + when checking for the OpenSSL library. + - The OKIDATA PPD files were missing. + - The config.h.in file defined the wrong version number. + - The serial backend did not define "funky_hex" under *BSD. + - Updated the Visual C++ project files and some of the + CUPS API sources to compile under Windows again. + + +CHANGES IN CUPS V1.1.5 + + - Security updates - new default configuration does + not broadcast printer information and only allows + access from the local system. + - EXPERIMENTAL encryption support - CUPS now optionally + supports TLS/SSL encryption via the OpenSSL library. + - Documentation updates. + - Makefile/configure script updates. + - The RPM spec file didn't work out-of-the-box under + RedHat or Mandrake. + - Minor code cleanup to remove extraneous compiler + warnings. + - cupsTempFile() was using %p for the temporary + filename; this should have been %08x (just 8 digit + hex) + - Deleting a printer with active print jobs would still + crash the server. + - ippWrite() and ipp_write_file() didn't send the + correct value length for name-with-language and + text-with-language attributes. + - Updated IPP code to support copied strings (that + should not be freed); this provides slightly more + efficient IPP server performance. + - Updated PDF filter to Xpdf 0.91. + - httpGets() could go into an infinite loop if a line + longer than the input buffer size was sent by a + client. This could be used in a Denial-of-Service + attack. + - The lpstat and CUPS API functions now request only the + data required when getting the list of printer or + class information. This should improve performance + with large numbers of printers on slower machines. + - The scheduler was always enforcing the FilterLimit, + even if FilterLimit was set to 0. + - Updated the Linux USB backend to support Mandrake's + /dev/usb/usblp# filenames. + - The PRINTER and LPDEST environment variables did not + override the lpoptions default printer. + - The PPD read functions incorrectly included trailing + characters (usually whitespace) after quoted string + attributes. + - The multiple-document-handling attribute handling code + did not check for the correct value for collated + copies (separate-documents-uncollated-copies). + - The EPSON driver did not work with OKIDATA printers in + EPSON emulation mode (needed change-emulation command) + - The HP-GL/2 filter did not scale the plot properly in + scale mode 2. + - Added PPD files for 9-pin and 24-pin OKIDATA printers. + - The httpSeparate() function didn't handle passwords + that started with a number. + - ippDelete() could free the character set string + multiple times in name-with-language and + text-with-language attributes. + - The scheduler would access freed memory right after + freeing it (for debug messages); these parts of the + code have been reordered to avoid this situation + which was causing sporatic errors and crashes. + - The ppdClose() function didn't free all of the strings + in the ppd_file_t structure. + - The LoadAllJobs() function in the scheduler did not + close the spool directory. + - Changed all sprintf's that use string formats to + snprintf's, even if the destination buffer is + larger than the source string(s); this protects + against buffer overflows caused outside of CUPS... + - Changed all strcpy's to strncpy's between local and + global variables, even if the destination buffer is + larger than the source string; this protects + against buffer overflows caused outside of CUPS... + - The CUPS certificate functions didn't use the + CUPS_SERVERROOT environment variable when set. + - The directory services code was copying instead of + comparing the remote printer info, resulting in + unnecessary updates of the printer attributes for + remote printers. + - Added new mime.types rules to allow automatic raw + printing of PCL and ESC/P files; PJL headers are + parsed to differentiate between PostScript and + PCL job files. This should eliminate a lot of + the reports of SAMBA printing problems due to + the missing "-oraw" or "-l" options. + - The mimeLoadType() function didn't handle the + 3-argument contains() function. + - The LoadPPDs() function in the scheduler didn't + properly set the alloc_ppds variable or handle a PPD + database containing 0 printers. + - The scheduler FindAvailablePrinter() function didn't + use the same queuing logic as the CheckJobs() + function. This caused classes to stall if a remote + printer was always busy. + - Jobs are now assigned to printers in a class + round-robin style. This should prevent the first + server in the class from bearing the brunt of the + jobs. + - The scheduler's LoadAllJobs() function didn't always + restore remote printers for queued jobs on startup. + - The serial backend didn't support the higher baud + rates with the old termios interface. It now supports + 57600 and 115200 baud. + - The serial backend now supports different types of + flow control; previously it ignored the flow=XYZ + option in the device URI. + - The serial backend now supports DTR/DSR flow control, + which is popular on dot-matrix printers (access with + "flow=dtrdsr" in the device URI) + - Added new job-originating-host-name attribute for + jobs. The new attribute provides the hostname or + IP address of the machine that submitted the job. + - The set-job-attributes code no longer allows read-only + job attributes to be changed. + - Expanded the click area for the navigation bar in the + web interface. + - Updated the lp and cancel commands to support all of + the Solaris print options (some are simply ignored + since they do not map) + - Updated the scheduler to limit the number of file + descriptors to the maximum select() set size. This + was causing problems on Solaris systems where the + max FD count was increased beyond 1024. + - The scheduler's LoadDevices() function was getting + interrupted by the SIGCHLD signal handler; now ignore + child signals while loading devices. + - Added quota and allow/deny user support for printers + and classes. + - Removed black/CMY adjustment code from the PS and + image file RIPs; it was interfering with some CUPS + driver dithering code. + - The lpc program stopped listing the queue statuses + after the first active printer. + - The cups-lpd program used an output format that the + Solaris printing system did not understand. + - Updated the lpq program to use the Solaris format + except under Tru64 UNIX. + - Some DEC PPD files incorrectly use "Off" for the null + value in UI constraints. Added "Off" to the list of + accepted null values. + - Changed the *BSD define constants to __*BSD__ in all + of the backends. + - Added support for "lpstat printername", which is an + undocumented feature in Solaris. + - The HP-GL/2 filter now only sets the plot size if it + is set in the plot file. + - The lpmove command wasn't sending the requesting + user name, causing it to always fail. + - Updated the cupsTempFile() code to use GetTempPath() + under Windows. + - The cups-lpd mini-daemon didn't limit the number of + data files accepted, didn't use cupsTempFile(), + didn't handle control file job information in any + order, and didn't free job options after printing + a file. + - The scheduler copy_banner() function did not + explicitly set the owner and permissions of the banner + files, which could prevent the banner pages from + printing on some systems. + - The lpstat program wasn't listing remote classes. + - The scheduler did not verify that the printer-uri + attribute was specified in all requests that required + it. + + +CHANGES IN CUPS v1.1.4 + + - Makefile and configure script fixes. + - **** Changed the default Printcap setting **** to + /etc/printcap. There are just too many people asking + why application XYZ doesn't see their printers! + - The web admin interface now displays an error if it + can't get the list of printer drivers from cupsd. + - The IPP backend was putting the copies option before + the other job options were set. This caused the IPP + request to contain attribute groups in the wrong + order, which prevented remote printing. + - Added checks in scheduler to free memory used for + IPP requests and language information when closing + a client connection. + - Fixed the duplex option in the HP LaserJet driver. It + should now work with all LaserJet printers (and + compatibles) + - The add-printer web interface didn't initialize the + "old info" data pointer, which caused random crashes + on many OS's. + - Fixed many page sizes defined in the Level 1 + compatibility file "gs_statd.ps" to match reality. + - Fixed another bug in the setpagedevice "code" in + Ghostscript. It should now accept all standard + Adobe attributes on all platforms. + - Fixed pstoraster so that it reallocates memory for + color depth changes as well as size/resolution + changes. This removes an ordering constraint on + the color, page size, and resolution options in + PPD files. + - The IPP backend didn't use the job's character set + when the destination printer supported it. This + caused problems when printing text files to other + CUPS servers. + - Updated the logic used to determine when to rebuild + the PPD file database. The scheduler now checks the + dates and the number of PPD files (was just checking + the dates.) + - Updated the ippSetCGIVars() function (used by the + web interfaces) to only filter valid string values. + - The PostScript filter was scaling 2-up pages + incorrectly. This caused the edges of some pages to + be clipped. + + +CHANGES IN CUPS v1.1.3 + + - Makefile fixes. + - RPM spec file changes. + - Documentation updates. + - Enabled pstoraster debug messages for everything + (only logged when LogLevel set to "debug"...) + - Changed the Input/OutputAttributes fix in + pstoraster so that it works on all platforms. + - The HP-GL/2 filter didn't set the right green + color value in encoded polylines or text. + - Updated the "fitplot" code to handle plot sizes + specified as "PSwidth,length" and "PSlength,width". + - Updated the Linux parallel and USB backends to open + the device files prior to looking in /proc for + autoprobe info. This makes sure that loadable device + driver modules are in fact loaded... + - Added new FilterLimit directive to limit the number + of processing jobs/filters on a system. + - set-job-attributes didn't change the job-state to + held/pending when the job-hold-until attribute was + specified. + - set-job-attributes didn't save the new job attributes. + - Now change the "requesting-user-name" attribute in + requests from remote systems to "remroot" when an + unauthenticated "root" user is sent. This can be + changed using the new RemoteRoot directive in + cupsd.conf. + - The cancel-job, hold-job, release-job, and restart-job + operations didn't log the authenticated username. + - The cups-lpd mini-daemon now checks for a + document-format option before forcing raw mode with + filter mode 'l'. + - The cups-lpd mini-daemon now supports "-o" options + on the command-line (passed by inetd) to set global + defaults for all print queues. + - The pstops filter assumed that a file with a Trailer + comment would also have an EOF comment. + - Added new cupsSetPasswordCB(), cupsSetServer(), + cupsSetUser(), and ippSetPort() functions to better + support client applications (especially GUIs...) + - The CUPS-add-class and CUPS-add-printer operations + didn't reset the printer-name attribute on remote + print queues that had to be renamed when a local + printer was defined with the same name. + - The lpoptions command now supports a "-r" option to + remove options for a printer or instance. + - The lpadmin and admin.cgi programs no longer allow + class and printer names to begin with a number; this + caused the command-line utilities to become confused. + - The Linux USB backend now looks for both the parallel + and usblp driver names in the device list. + - Added a new FontPath directive to cupsd.conf, and also + a "--with-fontpath" option for the configure script to + specify alternate font paths for pstoraster. + - The CUPS-move-job operation didn't update the + job-printer-uri attribute. + - The scheduler only looked up printers and classes by + name in IPP requests, instead of using the full URI. + This caused problems with KUPS and friends with + remote printers. + - The scheduler now handles better localization of + hostnames (e.g. server is host.foo.com, remote is + host.subfoo.foo.com, localized is not host.subfoo...) + - The scheduler logging functions now use a common + log file checking/rotation function (courtesy of + Crutcher Dunnavant at Red Hat) + - The scheduler could accept more client connections + than it allocated for if more than one Port or Listen + line was present in cupsd.conf. + - Other minor scheduler performance tweeks. + - The lpq and lprm commands didn't support the default + printer set using lpoptions. + - The lpoptions command now supports a "-l" option to + list the printer-specific options and their current + settings. + - The web printer and class lists now show a link to the + default printer or class at the top of the page. + - The text filter now supports pretty printing of shell + and perl scripts as well as C/C++ source files. + - The top and bottom margins were reversed for landscape + text printing. + - The lpq and lprm commands didn't understand printer + instances. + - The scheduler only selected on the first 100 file + descriptors instead of the maximum file descriptor + limit. + - The scheduler client, listener, and mainline functions + now share code to disable and enable monitoring for + new client connections. + - The imagetoraster filter didn't support all of the + required pagedevice parameters. + - The serial backend now checks for 100 serial ports + under Linux. + - The scheduler used sscanf() to pull out the remote + printer location, description, and make/model strings, + but if any of these options was empty then sscanf() + would stop processing. + - Added "debug2" log level to provide a little less + verbose debugging information at the "debug" level. + - The scheduler would crash if you stopped a printer + that was currently printing a job. + - The scheduler incorrectly allowed jobs in the cancelled, + aborted, or completed state to be cancelled. + - The image filters did not load TIFF images properly + for bottom-to-top and right-to-left orientations. + - Added new cupsEncodeOptions() function to encode + CUPS options as IPP job attributes. + - The IPP backend, LPD mini-daemon, client commands, + and CUPS API did not properly encode multiple + option values separated by commas. + - Added new scheduler malloc logging in debug mode + (provides summary of total arena size, allocated, + and free bytes once a minute) + - The EPM-based distributions didn't install the + correct symlinks for a few man pages. + - Fixed a memory leak in the scheduler - wasn't + freeing old filters when deleting or renaming + printers. + - The scheduler now queries the primary IP address + for the name of the server and maps any incoming + requests from that address to the server name. + This fixes web admin mapping problems from + server.domain.com to localhost. + - The web printer modify interface now remembers + the previous device and driver settings (except + for serial ports.) + - The job-k-octets attribute is now stored as part of + the job attributes; this preserves the information + after a job is completed when job file history is + turned off. + - Dropped option sub-group parsing code for the moment, + since many Xerox PPD files abuse this feature in PPD + files and don't follow the hierarchy rules. + - Added new wrapper code around options so that duplex + options for some HP printers don't prevent prints. + - Added support for Digital UNIX/Tru64 UNIX/OSF/1 format + for "lpstat -v" output. + - Now show the URI for remote printers instead of + /dev/null in "lpstat -v" output. + - Creating classes and adding printers to a class with + the lpadmin command didn't work. + - The banner pages and test page should now format + correctly in both portrait and landscape orientations. + - Updated banner page substitution so that { can appear + by itself without quoting. + + +CHANGES IN CUPS v1.1.2 + + - Makefile/configure fixes + - RPM spec file and EPM list file fixes + - The cupsTempFile() function now uses a different + algorithm for generating temp files and "reserves" + them to avoid possible security exploitation. + - Now use /dev/random (if available) to seed the random + number generator for certificates. + - The /var/spool/cups and /var/spool/cups/tmp directories + were incorrectly owned by root; they are now owned by + the filter user, typically "lp". + - The scheduler now resets the permissions on the spool + and temp directories as needed to match the filter + user. + - Now expose ppdCollect() as an externally callable + function. + - The image filters now support filtering from the + standard input. + - The imagetoraster filter now collects all printer + options and job patch files and applies them to the + page header as needed. + - Added format and banner options to LPD backend. + - The send-document operation didn't start a job + immediately when last-document was true. + - The set-job-attributes operation didn't correctly + replace the current job-hold-until value. + - Removed the option wrapper code from ppdEmit() and + friends since it caused problems with Ghostscript + and many PS printers. + - Was setting TZ environment variable twice for job + filters. + - Added syslog logging in cups-lpd to aide in + debugging problems. + - The HP-UX parallel port backend did not list the + available parallel ports on some systems (printf + calling problem...) + - The lp and lpr commands overrode user options if + -d/-P were specified after -o. + - The scheduler would crash with a */* filter. + - Added support for a "default" filter for unknown file + types. The example provided in the mime.types and + mime.convs file prints unknown files as if "-oraw" was + specified for the job. This functionality is disabled + by default. + - The "compatibility" mode fix for older backends did not + work for smbspool. Added a workaround for it. + - The HP-GL/2 filter didn't perform the right pen scaling + with some files and the "fitplot" option. + - New Software Performance Specification document that + describes the memory, disk, and CPU usage of all the + CUPS software. + + +CHANGES IN CUPS v1.1.1 + + - The pstoraster Makefile still referenced one of the + old PDF filter files. + - The filter Makefile used INSTALL_DATA instead of + INSTALL_LIB to install the CUPS image library. + - The administration CGI didn't work properly with + network devices. + - The BrowseACL variable was not updated after the + cupsd.conf file was loaded. + - The lpd mini-daemon didn't support printer instances. + - Now use a default umask of 077 for child processes. + - Now put temp files in /var/spool/cups/tmp for child + processes and the root user, unless TMPDIR or TempDir + is defined otherwise. + - cupsGetPPD() no longer uses easy-to-guess filenames. + - The CUPS-Delete-Class and CUPS-Delete-Printer + operations now save classes.conf file as needed. + - The lppasswd command wouldn't add a user. + - The ppdOpen() function could cause a segfault if a + 0-length PPD file was read. + - The image filters were not handling images with + different X and Y resolutions properly. + - The imagetoraster filter defaulted to RGB output + instead of black output like pstoraster. + - The pstops filter didn't handle binary data properly. + - The pstops filter didn't handle copies properly for + PS files lacking DSC comments. + - The pstops filter now appends %%EOF to the end of + documents if they don't have it. + - The cupsGetPPD() function didn't work with remote + printers lacking the @server in the name. + - The configure script didn't work right when only + --prefix was specified. + - The ppdEmit() code now wraps all printer commands so + that buggy PostScript printers will still print a file + after receiving an option that isn't available. + - Fixed the DeskJet margin bug, and disabled 600dpi + color mode until it can be fixed. + - The cupsAddDest() function didn't sort instances + correctly in all cases. + - The time-at-xyz attributes now expand to the date and + time in banner files. + + +CHANGES IN CUPS v1.1 + + - Documentation updates. + - Configuration script updates. + - Didn't map charset and language value strings to lowercase + and _ to - as required by SLP and IPP. + - ppdLoadXYZ() didn't add the list of available fonts to the + ppd_file_t structure. + - The text filter common code was freeing the PPD file data + before it was used. + - The text filter now embeds missing fonts. + - The CGI interface now maps local access to the server to + the localhost address. + - The HP-GL/2 filter didn't use the specified (or default) + color ranges, resulting in strange colors. + - The HP-GL/2 filter didn't default to no input window, which + caused unnecessary clipping of plots. + - Integrated Xpdf's pdftops filter into CUPS, which is a + lightweight and reliable replacement for Ghostscript's + PDF support. + - Removed all PDF support from Ghostscript. + - Updated HP driver to set top margin; this seems to fix + the offset problem seen on HP DeskJet printers. + - Fixed dependencies on the ZLIB and JPEG libraries in + pstoraster. + - The lpr command wasn't using the lpoptions defined by + the user. + - The lpr command would segfault if the CUPS server was + not running. + - The top-level makefile was not installing the CUPS + initialization script. It now does so if it sees there + is an init.d directory in /sbin, /etc/rc.d, or /etc. + - "lpstat -v all" didn't work. + - pstoraster would crash on some platforms doing the + setpagedevice operator. + - The web administration interface now allows you to set + the default banner pages. + - Images can now be positioned on the page using the new + "position" option. + - The AccessLog, ErrorLog, and PageLog directives now + support "%s" to insert the server name. + - Added a new BrowseShortNames directive to allow for + short remote printer names ("printer" instead of + "printer@server") when possible. + - The scheduler could crash if given an invalid PPD file + with no PageSize attributes. + - Updated the serial, parallel, and usb backends to do + multiple writes and ignore ioctl() errors as needed; + this should fix problems with serial printing on old + serial drivers and with the UltraSPARC parallel port + driver under Solaris 2.7. + - Now propagate LD_LIBRARY_PATH to child processes from + cupsd. + - New DataDir directive for installing in alternate + locations. + - New CUPS_SERVERROOT and CUPS_DATADIR environment + variables to specify installation directories as + needed. + - Queued remote jobs recreate remote printers as needed + when the scheduler is started. + - Deleting a printer also purges all jobs on that + printer. + - Old job and control files that don't belong to a + printer are automatically deleted. + - Wasn't updating time-at-processing and + time-at-completed attributes in job. + - Didn't send required multiple-operation-time-out + attribute in response to a get-printer-attributes + request. + - cups-lpd now supports options set with lpoptions. + - The job-hold-until attribute is now provided with all + jobs. For jobs that are not currently held the value + is "no-hold". + - The scheduler was not sending "unknown" values in IPP + responses. + - The lpoptions command now accumulates options from + previous runs rather than replacing all options for a + printer. + - The IPP backend now switches to IPP/1.0 if a 1.1 + request fails. + - The lpadmin and admin.cgi programs now validate new + printer and class names. + - The access_log file now includes the number of IPP bytes + received in a POST request. + + +CHANGES IN CUPS v1.1b5 + + - Documentation updates. + - The pstoraster filter didn't compile without the JPEG library. + - The cupsd server didn't support the HTTP OPTIONS request + method. + - Dropped the "CLOSE" method supported by the cupsd server. + (not defined in HTTP specification) + - Makefile/configure script fixes. + - Missing the job-restart template. + - Added IPP test suite for testing. + - Missing IPP documentation from binary distributions. + - Fixed multiple-document handling code when last-document + not specified. + - Added more checks to IPP requests to prevent bad requests + from getting through. + - Not all of the Ghostscript error output was being sent to + stderr. + - The PostScript filter now added PJL commands to set the + job name and display string, if supported. + - The scheduler would crash if the browse socket could not + be bound. Now disables browsing if port 631 (reserved for + IPP) is being used by a misbehaving daemon. + - The USB backend now looks for the older Linux 2.2.x USB + printer device filenames as well as the newer ones. + - The IPP backend now uses the UTF-8 charset exclusively, + since apparently only CUPS handles more than US-ASCII and + UTF-8... + - Wasn't quoting ( in PostScript banners... + - Send-document requests with no document-format attribute + could cause cupsd to crash. + - Old jobs in the spool directory might cause cupsd to + crash. + - CUPS now supports all of the recommended job-hold-until + keywords as well as name values of the form "HH:MM" and + "HH:MM:SS". + - Added placeholder pointer for TLS encryption to the HTTP + connection structure. + - Fixed the "fast poll" bug reported by DISA - the + status pipe wasn't being closed for multi-file jobs. + - Revamped put_params code in pstoraster to fix bitmap + allocation bug with FrameMaker output. + - Ripped out filename, etc. code from pstoraster as it + is a potential security hole. + - Added support for RIP_CACHE environment variable in the + new pstoraster. + - Fixed USB device filenames for Linux; now support new + pre-2.4 devices (/dev/usb/lp#) and 2.2 devices + (/dev/usblp#) + - Fixed accept-jobs crash with classes. + - Didn't include dot-matrix EPSON drivers in previous + release. + + +CHANGES IN CUPS v1.1b4 + + - Documentation updates. + - Many makefile and configuration script fixes (should + now compile better under *BSD.) + - The MediaPosition attribute was being mishandled by + GhostScript, causing the RIP to fail whenever a paper + tray was selected. + - The scheduler now logs the final line of log information + from a filter, even if it doesn't end with a newline; this + primarily affects GhostScript error output. + - The scheduler was saving implicit classes, so after a few + restarts you'll end up with AnyPrinter, AnyAnyPrinter, etc. + - The JPEG autodetection didn't work with some JPEG files that + came from digital cameras (JPEG but not JFIF); the new + magic types should work with all images that the JPEG library + can handle. + - Fixed a bug in the new contains() MIME type rule that could + cause cupsd to crash. + - Switched to using strtol() in the MIME type code so that you + can use hex, octal, or decimal constants as desired in the + mime.types file. + - Banner files are now treated as templates, allowing any type + of file to be used as a banner. + - Added a 30-second timeout to backend device reports so that a + hung backend will not prevent the scheduler from starting. + - Backends are once again terminated when jobs are stopped; the + CUPS-supplied backends will stay alive until the downstream + filters have had a chance to clear out old page data. + - The charset lookup in the CUPS localization support was wrong + (iso8859-x instead of iso-8859-x) + - Changed the "cpNNNN" code page files to "windows-NNNN" to match + the IANA registrations. + - New PostScript banner pages. + - Added Windows BMP and Alias PIX image file support to the image + filter. + - The PNG reading coded didn't free all of its buffers. + - Added Digest authentication support to the client and server + code. + - Added Solaris options to System V commands. + - Now support the output-bin job template attribute. + - Now log the job-billing attribute in the page_log file, and + keep track of the total number of pages in the + job-media-sheets-completed attribute. + - The penwidth option is now in micrometers to support more + accurate width specification. + - The image filters now support interlaced and transparent PNG + files. + - Didn't handle Keep-Alive for HTTP/1.0 clients. + - The BrowsePoll support didn't handle when BrowseInterval + was set to 0 (now uses 30 seconds if BrowseInterval is 0) + - The DeskJet driver now supports 600 DPI color for printers + that support it. + - New lpinfo and lpmove commands. + - The lpq command now supports the Digital UNIX output format. + - The LPD mini-daemon now supports all required LPD operations. + - Implemented timeouts for multi-file documents. + - New cupsPrintFiles() function in the CUPS API library to + print multiple files using create-job and send-document + requests (1 job ID for multiple files) + - The lp command now sends multiple files as a single job, + matching the behavior of the System V command. + - The "cancel -a" command now purges job history files. + + +CHANGES IN CUPS v1.1b3 + + - Documentation updates. + - The startup script redirected stderr before stdout, + which caused problems with some versions of Bourne + shell and Bash. + - Fixed a bug in the scheduler's PPD language reading + code. + - Fixed a bug in the scheduler's check for the + manufacturer in the PPD. + - The pstoraster filter didn't allow some input and + output attributes to be set. + - Added banner page support. + - Added missing PAM configuration file. + - Configuration script fixes for Linux and *BSD. + - The log file code was using the wrong sign for the + timezone offset. + - The default printcap file is now empty (no printcap + file is generated). + - The scheduler did not start jobs destined for remote + printers when they became available. + - The scheduler now sends jobs to remote printers + immediately. (when sending jobs to a class, the remote + printer is only used when it becomes available) + - The scheduler now supports printing of banner pages + via the job-sheets attribute (banner files go in + /usr/share/cups/banners) + - The cupsd process now forks itself into the background + (override with -f) + - Added several *BSD enhancements. + - Added UNSUPPORTED libtool option to configuration + script to allow the use of libtool. Note that this is + UNSUPPORTED by us, but added by request of the *BSD + folks. + - The parallel, serial, and usb backends now retry the + opening of their ports. This allows multiple print + queues to be associated with a single physical port, + and will allow CUPS to support several types of + parallel port auto-switches in the near future. + - Set-Job-Attributes now supports adding, changing, and + deleting job template attributes, and no longer allows + job-printer-uri to be set (see CUPS-Move-Job) + - Added CUPS-Move-Job operation to support moving of jobs. + - The CGI template functionality now supports multiple + languages (still only have templates for English) + - The CUPS-Get-Printers and CUPS-Get-Classes operations + now support filtering as defined in the IDD. + - The Get-Jobs, CUPS-Get-Printers, and CUPS-Get-Classes + operations no longer limit themselves to 1000 jobs, + printers, or classes (believe it or not, this is + needed for some sites) + - The web interfaces now support language-specific + templates. + - The web admin interface now supports class management. + - The web admin interface now shows a list of + manufacturers before selecting the PPD/driver for a + specific printer. + - The web admin interface now supports configuration of + the default printer options in the PPD file. + - The web interface now uses printer/class + authentication for the test page instead of admin + authentication. + - Updated the RPM spec file for the current release. + - Updated language support for Windows code pages. + - 8-bit character set files can now use multiple fonts + (needed for Arabic, Greek, Hebrew, etc.) + - Added basic right-to-left text support in the text + filter. + - The POSIX locale now uses ISO-8859-1 instead of + US-ASCII. + - Fixed PDF printing problems. + - Fixed PostScript RIP page device dictionary elements + that weren't getting passed in cups_get_params(). + - Added a new "contains" rule for the magic file typing. + - The "printable" rule now accepts characters from 128 to 255 + (needed for Microsoft character sets) + - Added support for ~/.cupsrc as well as /etc/cups/client.conf + so that the default server can be configured on a per-user + basis without environment variables. + - Added LPD mini-daemon to support incoming LPD jobs. + + +CHANGES IN CUPS v1.1b2 + + - Documentation updates. + - The lp command didn't always load the user-defined + destinations, preventing it from seeing the default + printer. + - Many configure script and makefile fixes. + - The Microsoft code page files were missing from the + distribution. + - Added a workaround for the HP IPP client (which is sending + an invalid printer-uri in requests) + - Fixed the encoding of text-with-language and name-with-language + to match the IPP spec. + - Added support for unknown value tags in the IPP routines + (previously they would be ignored) + - Integrated GNU GhostScript 5.50 into the pstoraster filter. + - Client hostname resolution was broken on little-endian + machines. + - Now look at client.conf file for client's default server + and printer. + - The cupsServer() function did not close the client.conf file + if it contained a ServerName directive. + - Added BrowseAllow, BrowseDeny, BrowseOrder, BrowsePoll, and + BrowseRelay directives. + - BrowseInterval 0 disables advertising of local printers, but + still receives information on remote printers. + - New browse polling daemon (for polling servers on different + networks) + - New PPD cache file for faster startup times with large numbers + of PPD files. + - The Host: field was incorrectly required for HTTP/1.0 clients. + - New set-job-attributes operation now supported. + - The mime_load_types() and mime_load_convs() functions did not + close their input files. + + +CHANGES IN CUPS v1.1b1 + + - NEW web-based administration interface. + - NEW EPSON printer drivers. + - NEW user-defined printers and options. + - NEW persistent jobs and job history + - NEW IPP/1.1 support + - NEW template-based web interfaces. + - NEW CUPS-get-devices and CUPS-get-ppds operations. + - NEW support for create-job and send-file operations. + - NEW certificate-based authentication for local + administration. + - NEW USB backend. + - The lpr command now produces human-readable error messages. + - The lpq command now produces BSD standard format output + instead of OSF/1 output. This should resolve the SAMBA + print queue problems that have been reported. + - The IPP backend did not always detect when the "raw" option + was being used. + - The "lpstat -p" command would stop after the first active + printer. + - The "lpstat -v" command would stop before the first remote + printer. diff --git a/CHANGES-1.2.txt b/CHANGES-1.2.txt new file mode 100644 index 0000000..7b0b1f2 --- /dev/null +++ b/CHANGES-1.2.txt @@ -0,0 +1,1261 @@ +CHANGES-1.2.txt +--------------- + +CHANGES IN CUPS V1.2.12 + + - The PHP cups_print_file() function crashed if the options + array contained non-string option values (STR #2430) + - The image/tiff file matching rule incorrectly identified + some text files as TIFF files (STR #2431) + - The filter(7) man page incorrectly documented the + "PAGE: total #-pages" message (STR #2427) + - PCL text files were mis-identified as HP-GL/2 and + caused the HP-GL/2 filter to hang (STR #2423) + - When printing to a queue with user ACLs, the scheduler + incorrectly returned a quota error instead of a "not + allowed to print" error (STR #2409) + - cupsaddsmb could get in a loop if no printer drivers + were installed (STR #2407) + - cupsRasterReadHeader() did not byte-swap the header + properly when compiled with certain versions of GCC. + - The IPP backend did not send the document-format + attribute for filtered jobs (STR #2411) + - Some PPD files could cause a crash in ppdOpen2 (STR + #2408) + - The web admin interface incorrectly handled the "share + printers" and "show remote printers" settings (STR + #2393) + - The scheduler's log messages about AuthClass and + AuthGroupName advised using a replacement directive but + had the wrong syntax (STR #2400) + - Updated the PostScript/PJL and HP-GL/2 MIME rules to + look in the first 4k of the file, not just the first 1k + (STR #2386) + - Updated the Italian localization (STR #2382) + + +CHANGES IN CUPS V1.2.11 + + - Fixed the "relaying from" log message (STR #2376) + - Updated the launchd support on Mac OS X to better + support reconfiguration. + - "make distclean" didn't remove all generated files + (STR #2366) + - Fixed a bug in the advertisement of classes (STR + #2373) + - The IPP backend now stays running until the job is + actually printed by the remote server; previously + it would stop monitoring the job if it was held or + temporarily stopped (STR #2352) + - PDF files were not always printed using the correct + orientation (STR #2348) + - The scheduler could crash if you specified a bad file: + URI for a printer (STR #2351) + - The Renew-Subscription operation now returns the + notify-lease-duration value that was used (STR #2346) + - The IPP backend sent job options to IPP printers, + however some printers tried to override the options + embedded in the PS/PCL stream with those job options + (STR #2349) + - ppdLocalize() now also tries a country-specific + localization for when localizing to a generic locale + name. + - The cupstestppd program now allows for partial + localizations to reduce the size of universal PPD + files. + - Chinese PPD files were incorrectly tagged with the + "cn" locale (should have been "zh") + - The backends now manage the printer-state-reasons + attribute more accurately (STR #2345) + - Java, PHP, Perl, and Python scripts did not work + properly (STR #2342) + - The scheduler would take forever to start if the + maximum number of file descriptors was set to + "unlimited" (STR #2329) + - The page-ranges option was incorrectly applied to the + banner pages (STR #2336) + - Fixed some GCC compile warnings (STR #2340) + - The DBUS notification code was broken for older + versions of DBUS (STR #2327) + - The IPv6 code did not compile on HP-UX 11.23 (STR + #2331) + - PPD constraints did not work properly with custom + options. + - Regular PPD options with the name "CustomFoo" did + not work. + - The USB backend did not work on NetBSD (STR #2324) + - The printer-state-reasons attribute was incorrectly + cleared after a job completed (STR #2323) + - The scheduler did not set the printer operation policy + on startup, only on soft reload (STR #2319) + - The AP_FIRSTPAGE_InputSlot option did not clear any + ManualFeed setting that was made, which caused problems + with some PPD files (STR #2318) + - cupsDoFileRequest() and cupsDoRequest() did not abort + when getting an error in the response (STR #2315) + - The scheduler did not schedule jobs properly to remote + or nested classes (STR #2317) + - Updated the mime.types and mime.convs headers to warn + that the files are overwritten when CUPS is installed. + Local changes should go in local.types or local.convs, + respectively (STR #2310) + - The scheduler could get in an infinite loop if a + printer in an implicit class disappeared (STR #2311) + - The pstops filter did not handle %%EndFeature comments + properly (STR #2306) + - Fixed a problem with the Polish web page printer icons + (STR #2305) + - ppdLocalize() now also localizes the cupsICCProfile + attributes. + - The scheduler still had a reference to the incorrect + "notify-recipient" attribute (STR #2307) + - The "make check" and "make test" subscription tests did + not set the locale (STR #2307) + - The "make check" and "make test" subscription tests + incorrectly used the notify-recipient attribute instead + of notify-recipient-uri (STR #2307) + - cupsRasterInterpretPPD() incorrectly limited the + cupsBorderlessScalingFactor when specified in the + job options. + + +CHANGES IN CUPS V1.2.10 + + - ppdLocalize() now supports localizing for Japanese + using the "jp" locale name used by the ppdmerge + program from the CUPS DDK 1.1.0 (STR #2301) + - _cupsAdminSetServerSettings() did not support changing + of top-level directives as designed. + - The init script path check was broken. + - CUPS incorrectly used the attribute "notify-recipient" + instead of "notify-recicpient-uri" in several places + (STR #2297) + - Fixed a configure script bug on MirBSD (STR #2294) + - The pdftops filter did not limit the amount of recursion + of page sets (STR #2293) + - Custom page sizes with fractional point sizes did not + work (STR #2296) + - The lpoptions command would crash when adding or removing + options on a system with no printers (STR #2295) + + +CHANGES IN CUPS V1.2.9 + + - The scheduler did not use the default job-sheets + (banners) for implicit classes (STR #2284) + - The scheduler could crash when listing complete jobs + that had been unloaded from memory (STR #2288) + - The French localization was doubled up (STR #2287) + - Build system fixes for several platforms (STR #2260, + STR #2275) + - The scheduler's openssl certificate generation code was + broken on some platforms (STR #2282) + - The scheduler's log rotation check for devices was + broken (STR #2278) + - The LPD mini-daemon did not handle the document-format + option correctly (STR #2266) + - The pdftops filter ignored the "match" size option in the + pdftops.conf file (STR #2285) + - cupstestppd now validates UTF-8 text strings in + globalized PPD files (STR #2283) + - The outputorder=reverse option did not work with all + printers (STR #2279) + - Classes containing other classes did not always work + (STR #2255) + - Printer location and description information was lost + if the corresponding string contained the "#" character + (STR #2254) + - cupsRemoveOption() did not work properly (STR #2264) + - The USB backend did not work with some USB to parallel + cables on Mac OS X. + - The test page did not print the rulers properly on + large media sizes (STR #2252) + - The text filter could crash when pretty printing certain + types of files (STR #2158) + + +CHANGES IN CUPS V1.2.8 + + - Documentation fixes (STR #2141, STR #2157) + - The HTTP upgrade redirection used by the scheduler did + not work with Internet Explorer (STR #2235) + - Members of a class with Unicode names did not appear + correctly in the web interface (STR #2154) + - Changing the "Save debugging information" setting in + the web interface no longer affects the other server + settings (STR #1993) + - The scheduler did not choose SSL certificates correctly + on Mac OS X (STR #2225) + - The scheduler could get in an infinite loop when + printing to a remote class (STR #2228) + - The jobs web page did not have separating space after + the number of pages column (STR #2230) + - Added French localization (STR #2221) + - Updated Spanish localization (STR #2223) + - Updated Japanese localization (STR #2216) + - cupsBorderlessScalingFacter was limited to a range of + 0.9 to 1.1, but some printers need larger values (STR + #2222) + - Landscape printing of PDF files did not always work + (STR #2149) + - Fixed slow USB printing on Minolta printers (STR #2104, + STR #2219) + - The ZPL label printer driver could produce stretched + output (PR #6448) + - The IPP backend now clears the printer-state-message + when there are no outstanding errors or warnings (STR + #2126) + - The CUPS Java scripting support did not work with + recent versions of Java due to the use of Sun's private + Base64 class (STR #2152) + - The scheduler did not pass HTTP GET form variables to + custom CGI programs (STR #2173) + - The lpoptions command now displays the reason why a PPD + file cannot be found (STR #2184) + - The scheduler did not accept "none" as a browse + protocol name (STR #2200) + - The scheduler still loaded the remote printer cache, + even when browsing was disabled (STR #2198) + - The SNMP backend now shows OfficeJet printers with the + "HP" manufacturer prefix (STR #2151) + - Web interface HTML cleanup (STR #2153) + - The parallel backend consumed 100% CPU on FreeBSD due + to an apparently common parallel port driver bug (STR + #2161) + - ippReadIO() incorrectly returned IPP_IDLE when the + initial IPP message header could not be read (STR + #2179) + - cupsRasterInterpretPPD() did not support custom options + (STR #1960) + - Collated output produced by the PostScript filter could + lose some options (STR #2137) + - job-hold-until with time values for the next day would + be held for 60 days (STR #2144) + - Some types of Sun raster files did not print correctly + (STR #2107) + - Raw PBM files did not print correctly (STR #2106) + - The SNMP backend no longer uses IPP with HP printers, + as some recent firmware versions appear to not work + (STR #2055) + - cupsMarkOptions() did not handle the + multiple-document-handling option (STR #2135) + - lpstat did not show the local job ID of active printers + (STR #2125) + - The backends incorrectly used STATUS: + media-tray-empty-error messages for out-of-paper + conditions (STR #2123, STR #2124) + - cupsGetPPD2() returned the wrong error when the PPD + file did not exist (STR #2122) + - cupsDoAuthentication() did not translate the password + prompt (STR #2121) + - httpGetLength2() did not handle error messages without + content correctly (STR #2133) + - Added support for 32/64-bit libraries on HP-UX Itanium + systems (STR #2115) + - Fixed a configure script problem with the 32/64-bit + library support (STR #2114) + - The PostScript filter did not properly output document + setup commands for reversed output (STR #2111) + - The scheduler did not parse IPv6 netmasks properly (STR + #2117) + + +CHANGES IN CUPS V1.2.7 + + - Documentation updates (STR #2089) + - Added an Italian translation (STR #2105) + - The PostScript filter now rotates the bounding box + values as needed (STR #2079) + - The scheduler no longer loads the remote printer cache + when browsing is disabled (STR #2084) + - The scheduler no longer writes a new launchd + configuration file if it doesn't have to (STR #2083) + - Updated the USB and PAP backends for Mac OS X (STR + #2086) + - The scheduler now picks up on changes to IPv6 and DNS + configuration on Mac OS X (STR #2085) + - The lpstat program could still hang (STR #2098) + - Fixed an inefficiency in the SNMP IPP detection code + (STR #2100) + - The SSL negotiation code did not implement short + timeouts (STR #2091) + + +CHANGES IN CUPS V1.2.6 + + - The web interface was not localized on Mac OS X (STR + #2075) + - "lpc status" did not show the number of queued jobs for + disabled queues (STR #2069) + - The lpstat program could hang (STR #2073) + - The serial backend did not support the new USB serial + filenames on Linux (STR #2061) + - The parallel backend did not support bidirectional I/O + properly (STR #2056) + - The network backends now log the numeric address that + is being used (STR #2046) + - Fixed a compile error when using libpaper. + - Fixed a compile error when compiling on Solaris with + threading enabled (STR #2049, STR #2050) + - Missing printer-state-changed event for + printer-state-message updates (STR #2047) + + +CHANGES IN CUPS V1.2.5 + + - Documentation updates (STR #2038) + - The SNMP backend no longer uses IPP for Epson printers + (STR #2028) + - Updated the configure script for Tru64 UNIX 5.1 (STR + #2033) + - Tru64 5.1B's getaddrinfo() and getnameinfo() functions + leak file descriptors (STR #2034) + - cupsAddDest() didn't add the parent destination's + options and attributes. + - ppdConflicts() did not handle custom option + constraints. + - Raw printing of gzip'd files did not work (STR #2009) + - The scheduler no longer preserves default option + choices when the new PPD no longer provides the old + default choice (STR #1929) + - The Linux SCSI backend is now only built if the SCSI + development headers are installed. + - USB printing to Minolta printers did not work (STR + #2019) + - Windows clients could not monitor the queue status (STR + #2006) + - The scheduler didn't log the operation name in the + access_log file for Create-Job and Print-Job requests. + - The PostScript filter now separates collated copies + with any required JCL commands so that JCL-based + finishing options act on the individual copies and not + all of the copies as a single document. + - The PostScript filter now disables duplex printing when + printing a 1-page document. + - cups-lpd didn't pass the correct + job-originating-host-name value (STR #2023) + - Fixed some speling errors in the German message catalog + (STR #2012) + - cupstestppd did not catch PPD files with bad + UIConstraints values (STR #2016) + - The USB backend did not work with the current udev- + created printers if the first printer was disconnected + (STR #2017) + - Mirrored and rotated printing did not work with some + documents (STR #2004) + - 2-sided printing with banners did not work properly on + some printers (STR #2018) + - Updated the raw type rule to handle PJL within the + first 4k of a print job (STR #1969) + - Added an Estonian translation (STR #1957) + - Clarified the documentation for the cupsd.conf @LOCAL + and @IF(name) allow/deny functionality (STR #1992) + - The PostScript filters did not escape the Title and For + comments in the print job header (STR #1988) + - The scheduler would use 100% CPU if browsing was + disabled and the cupsd.conf file contained BrowsePoll + lines (STR #1994) + - The cupsDirRead() function did not work properly on + non-POSIX-compliant systems (STR #2001) + - The cupsFile functions didn't handle read/write errors + properly (STR #1996) + - The DBUS support now works with older versions of the + DBUS library. + + +CHANGES IN CUPS V1.2.4 + + - The --with-printcap configure option did not work (STR + #1984) + - The character set reported by cupsLangGet() did not + always reflect the default character set of a given + locale (STR #1983) + - Older Lexmark and Tektronix printers did not work with + IPP (STR #1980) + - Failsafe printing did not work (PR #6328) + - Some web interface redirects did not work (STR #1978) + - The web interface change settings button could + introduce a "Port 0" line in cupsd.conf if there was no + loopback connection available (STR #1979) + - The web interface change settings and edit + configuration file buttons would truncate the + cupsd.conf file (STR #1976) + - The German web interface used the wrong printer icon + images (STR #1973) + - The "All Documents" link in the on-line help was + missing a trailing slash (STR #1971) + - The Polish web interface translation used the wrong + URLs for the job history (STR #1963) + - The "reprint job" button did not work (STR #1956) + - The scheduler did not always report printer or job + events properly (STR #1955) + - The scheduler always stopped the queue on error, + regardless of the exit code, if the error policy was + set to "stop-printer" (STR #1959) + - ppdEmitJCL() included UTF-8 characters in the JCL job + name, which caused problems on some printers (STR + #1959) + - Fixed a buffering problem that cause high CPU usage + (STR #1968) + - The command-line applications did not convert + command-line strings to UTF-8 as needed (STR #1958) + - cupsDirRead() incorrectly aborted when reading a + symbolic link that pointed to a file/directory that did + not exist (STR #1953) + - The cupsInterpretRasterPPD() function did not handle + custom page sizes properly. + + +CHANGES IN CUPS V1.2.3 + + - The scheduler did not send job-state or + job-config-changed events when a job was held, + released, or changed (STR #1947) + - The scheduler now aborts if the configuration file and + directory checks fail (STR #1941) + - Fixed a problem with ippPort() not using the port + number that was set via the client.conf file or + CUPS_SERVER environment variable (STR #1945) + - HTTP headers were not buffered (STR #1899) + - Some IPP printers (HP) did not like UTF-8 job names + (STR #1837) + - The CUPS desktop icon is now localized for Polish (STR + #1920) + - Printer options were not always honored when printing + from Windows clients (STR #1839) + - The openssl command would lock up the scheduler when + generating an encryption certificate on some platforms + due to a lack of entropy for the random number + generator (STR #1876) + - The web admin page did not recognize that "Listen 631" + enabled remote access (STR #1908) + - The web admin page did not check whether changes were + made to the Basic Server Settings check boxes (STR + #1908) + - The IPP backend could generate N*N copies in certain + edge cases. + - The scheduler did not restore remote printers properly + when BrowseShortNames was enabled (STR #1893) + - Polling did not handle changes to the network + environment on Mac OS X (STR #1896) + - The "make test" subscription tests used invalid + notify-recipient-uri values (STR #1910) + - Printers could be left in an undefined state on system + sleep (STR #1905) + - The Berkeley and System V commands did not always use + the expected character set (STR #1915) + - Remote printing fixes (STR #1881) + - The cupstestppd utility did not validate translation + strings for custom options properly. + - Multi-language PPD files were not properly localized in + the web interface (STR #1913) + - The admin page's simple settings options did not check + for local domain socket or IPv6 addresses and did not + use "localhost" as the listen address. + - An empty BrowseProtocols, BrowseLocalProtocols, or + BrowseRemoteProtocols line would crash the scheduler + instead of disabling the corresponding browsing options. + - The scheduler now logs IPP operation status as debug + messages instead of info or error. + - cupsFileRewind() didn't clear the end-of-file state. + - cupstestppd didn't report the actual misspelling of the + 1284DeviceID attribute (STR #1849) + - BrowseRelay didn't work on Debian (STR #1887) + - configure --without-languages didn't work (STR #1879) + - Manually added remote printers did not work (STR #1881) + - The header was not installed. + - Updated the build files for Autoconf 2.60 (STR #1853) + - The scheduler incorrectly terminated the polling + processes after receiving a partial log line. + - The cups-lpd mini-daemon reported "No printer-state + attribute found" errors when reporting the queue status + (PR #6250, STR #1821) + - SNMP backend improvements (STR #1737, STR #1742, STR + #1790, STR #1835, STR #1880) + - The scheduler erroneously reported an error with the + CGI pipe (STR #1860) + - Fixed HP-UX compile problems (STR #1858, STR #1859) + - cupstestppd crashed with some PPD files (STR #1864) + - The and header files did not + work with C++. + + +CHANGES IN CUPS V1.2.2 + + - Documentation updates (STR #1765, STR #1780) + - CUPS didn't know about alternate character set names + for Asian text (STR #1819) + - The lpoptions -o and -r options did not work unless you + specified a printer. + - The lpoptions command incorrectly allowed users to set + printer attributes like printer-type (STR #1791) + - httpWait() did not flush the write buffer, causing "bad + request" errors when communicating with CUPS 1.1.x + servers (STR #1717) + - Polling did not sanitize the printer description, + location, or make and model strings like broadcasts + did. + - Polled printers did not show the server's default + job-sheets option value. + - The Samba password prompt was not properly localized + (STR #1814) + - Added a German translation (STR #1842) + - The scheduler now creates self-signed SSL certficates + automatically when using OpenSSL and CDSA for + encryption, just as for GNU TLS. + - The SNMP backend sporatically reported some printers as + "unknown" (STR #1774) + - The scheduler now forces BrowseTimeout to be at least + twice the BrowseInterval value and non-zero to avoid + common configuration errors. + - The scheduler incorrectly returned printer URIs of the + form "ipp://server/printers/classname" for classes (STR + #1813) + - Updated Japanese localization (STR #1805) + - The scheduler's SSL certificate/key directory was not + created on installation (STR #1788) + - Added a mailto.conf man page and help page (STR #1754) + - The parallel and USB backends no longer wait for the + printer to go on-line - this caused problems with + certain printers that don't follow with the IEEE-1284 + standard (STR #1738) + - The scheduler could crash on a reload when implicit + classes were present (STR #1828) + - The IPP backend incorrectly used the CUPS_ENCRYPTION + environment variable to determine the default + encryption mode when printing (STR #1820) + - USB printing did not work on Solaris (STR #1756) + - The scheduler sorted job priorities in the wrong order + (STR #1811) + - The scheduler did not automatically restart notifiers + that exited or crashed (STR #1793) + - IPv6 support did not work on NetBSD (STR #1834) + - The EPM packaging file did not work (STR #1804) + - The scheduler used up the CPU if BrowseRemoteProtocols + was empty (STR #1792) + - Custom page sizes did not work (STR #1787) + - The SNMP backend could crash on some systems when SNMP + logging was enabled (STR #1789) + - Browsing could produce some funny printer names when + ServerName was set to an IP address (STR #1799) + - Fixed the log message for BrowseRelay (STR #1798) + - Fixes to allow CUPS to compile on MirBSD (STR #1796) + - The scheduler incorrectly set the FINAL_CONTENT_TYPE + environment variable (STR #1795) + - The pdftops filter incorrectly embedded a "produced by" + comment, causing PDF printing not to work on some + operating systems (STR #1801) + - Sending raw jobs from a client system could cause the + client's scheduler to eventually crash (STR #1786) + - The scheduler now checks that the notifier exists prior + to accepting a new subscription request. + - The scheduler now reports the supported + notify-recipient schemes based on the contents of the + ServerBin/notifier directory. + - Event notifications did not include the + notify-sequence-number or other required attributes + (STR #1747) + - Allow/Deny addresses of the form "11.22.33.*" did not + work on Linux (STR #1769) + - cupsGetPPD() did not work if the scheduler was only + listening on a domain socket (STR #1766) + - The scheduler could crash advertising a class (STR + #1768) + - The scheduler could crash if the default printer was + deleted (STR #1776) + - Added a new default CUPS raster format (v3) which does + not compress the raster stream in order to provide the + same cupsRasterReadPixels() and cupsRasterWritePixels() + performance as CUPS 1.1.x. + - The cupsaddsmb man page listed the wrong files for the + CUPS driver. + - Some configure --with options did not work (STR #1746) + - "Allow @IF(name)" didn't work if "name" wasn't the + first network interface (STR #1758) + - The lpstat command did not use the correct character + set when reporting the date and time (STR #1751) + - The cupsaddsmb command and web interface did not update + the Windows PPD files properly, resulting in corrupt + PPD files for the Windows client to use (STR #1750) + - The cupsd.conf man page didn't describe the Listen + domain socket syntax (STR #1753) + - The scheduler no longer tries to support more than + FD_SETSIZE file descriptors. + - CDSA (encryption) support fixes for MacOS X. + - The lppasswd program needs to be setuid to root to + create and update the /etc/cups/passwd.md5 file (STR + #1735) + - 32/64-bit library installation was broken (STR #1741) + - The USB backend now reports a "no such device" error + when using the old filename-based USB URIs instead of + the "success" error. + - Increased the HTTP and IPP read timeouts to 10 seconds, + as 1 second was too short on congested networks (STR + #1719) + - The SNMP backend now uses the device description over + the printer-make-and-model attribute when the attribute + contains a generic name (STR #1728) + - Fixed another file descriptor leak when printing raw + files (STR #1736) + - Raw queues were not shared via LDAP (STR #1739) + - The pstops filter didn't always embed PageSetup + commands from the PPD file (STR #1740) + - "make install" didn't work if you disabled all of the + localizations. + - The scheduler didn't always choose the least costly + filter. + - Fixed parsing of IPv6 addresses in Allow, Deny, + BrowseAllow, BrowseDeny, and BrowseRelay directives + (STR #1713) + - Printers that were shared via LDAP did not get added to + the LDAP server properly (STR #1733) + - LDAP browsing would crash the scheduler if a required + value was missing (STR #1731) + - Special cases for the "localhost" hostname did not + work, causing printing to not work when the /etc/hosts + file did not contain a localhost entry (STR #1723) + - Updated the Spanish translation (STR #1720, STR #1770) + - Reverse-order page output was broken when N-up or + landscape orientations were used (STR #1725) + - The parallel, serial, socket, and USB backends needed + print data before they would report back-channel data, + causing problems with several new drivers (STR #1724) + + +CHANGES IN CUPS V1.2.1 + + - "lprm -h hostname" did not work (STR #1800) + - The web interface did not handle reloads properly for + MSIE (STR #1716) + - The configure script no longer adds linker rpath + options when they are unnecessary. + - The scheduler could crash printing a debug message on + Solaris (STR #1714) + - The --enable-32bit and --enable-64bit configure options + did not always work. + - The password prompt showed the domain socket address + instead of "localhost" for local authentication (STR + #1706) + - The web interface filtered the list of printers even if + the user wasn't logged in (STR #1700) + - The IPP backend did not work reliably with some Xerox + printers (STR #1704) + - Trailing banners were not added when printing a single + file (STR #1698) + - The web interface support programs crashed on Solaris + (STR #1699) + - cupstestppd incorrectly reported problems with + *1284DeviceID attributes (STR #1710) + - Browsing could get disabled after a restart (STR #1670) + - Custom page sizes were not parsed properly (STR #1709) + - The -U option wasn't supported by lpadmin (STR #1702) + - The -u option didn't work with lpadmin (STR #1703) + - The scheduler did not create non-blocking back-channel + pipes, which caused problems when the printer driver + did not read the back-channel data (STR #1705) + - The scheduler no longer uses chunking in responses to + clients - this caused problems with older versions of + CUPS like 1.1.17 (PR #6143) + - Automatic raw printing was broken (STR #1667) + - 6-up printing was broken (STR #1697) + - The pstops filter did not disable CTRL-D processing on + the printer/RIP. + - ppdOpen*() did not load custom options properly (STR + #1680) + - "Set Printer Options" in the web interface did not + update the DefaultImageableArea or + DefaultPaperDimension attributes in the PPD file (STR + #1689) + - Fixed compile errors (STR #1682, STR #1684, STR #1685, + STR #1690) + - The lpstat command displayed the wrong error message + for a missing destination (STR #1683) + - Revised and completed the Polish translation (STR + #1669) + - Stopped jobs did not show up in the list of active jobs + (STR #1676) + - The configure script did not use the GNU TLS + "libgnutls-config" script to find the proper compiler + and linker options. + - The imagetoraster filter did not correctly generate + several 1, 2, and 4-bit color modes. + - cupsRasterWritePixels() could lose track of the current + output row. + - cupsRasterReadPixels() did not automatically swap + 12/16-bit chunked pixel data. + - Moved the private _cups_raster_s structure out of the + public header. + - Updated the CUPS raster format specification to include + encoding rules and colorspace definitions. + - The Zebra PPD files had the wrong PostScript code for + the "default" option choices. + - The imagetoraster filter did not generate correct CIE + XYZ or Lab color data. + - The cups-config script did not work when invoked from a + source directory (STR #1673) + - The SNMP backend did not compile on systems that used + the getifaddrs emulation functions (STR #1668) + + +CHANGES IN CUPS V1.2.0 + + - Documentation updates (STR #1618, STR #1620, STR #1622, + STR #1637) + - Static file copy buffers reduced from 64k to 32k to + work around bogus MallocDebug library assumptions (STR + #1660) + - The scheduler did not decode the backend exit code + properly (STR #1648) + - The MacOS X USB backend did not report the 1284 device ID, + nor did it fix device IDs returned by HP printers. + - The scheduler started more slowly than 1.1.x with large + numbers of printers (STR #1653) + - cupsRasterInterpretPPD() didn't support the + cupsPreferredBitsPerColor attribute, and imagetoraster + didn't use the new API. + - The "make test" script did not create all of the necessary + subdirectories for testing (STR #1638) + - The scheduler did not prevent rotation of logs + redirected to /dev/null (STR #1651) + - "make test" did not include the SNMP backend in the + test environment (STR #1625) + - The EPM packaging files did not work (STR #1621) + - "Use Default Configuration" inserted a broken + configuration file (STR #1624) + - Redirects in the web interface did not always preserve + the encrypted status of a connection (STR #1603) + - Added the Apple "pap" backend. + - Added CUPS library to CUPS Image shared library + linkage to support Linux --as-needed linker option + (STR #1606) + - Fixed support for --enable-pie (STR #1609) + - The pdftops filter did not validate the length of the + encryption key (STR #1608) + - Updated the Polish localization. + - "Encryption Required" in the cupsd.conf file now only + requires encryption when the connection is not over the + loopback interface or domain socket. + - Printer names containing "+" were not quoted properly in + the web interface (STR #1600) + - The SNMP backend now reports the make and model in the + information string so that the auto-generated printer + name is more useful than just an IP address. + + +CHANGES IN CUPS V1.2rc3 + + - The cups-lpd program always did reverse lookups on the + client address, which could be a performance problem. + Added a "-n" option to disable lookups. + - When configured with SSL support, require encryption by + default when displaying the /admin location (STR #1592) + - The next job ID was not computed correctly if the job + cache file got out of sync with the spool directory + (STR #1582) + - The PNG image handling code used deprecated functions + from libpng (STR #1587) + - Added a Polish translation (STR #1584, STR #1586) + - More changes to the scheduler to improve battery life + on portable devices (STR #1583) + - Changed the default log level for status messages back + to "DEBUG" to be consistent with CUPS 1.1.x (STR #1579) + - The error string was not set properly when + cupsDoFileRequest() was given the name of a directory + (STR #1578) + - Fixed handling of job-hold-until (STR #1581) + - Added explicit notes to the cupsaddsmb man page + explaining that the driver filenames are case-sensitive + under UNIX and that they must be all lowercase (Windows + 2000) or all UPPERCASE (Windows 95/98/Me) to work (STR + #1568) + - The USB backend incorrectly split the manufacturer name + if it contained spaces (STR #1566) + - The scheduler would hang when listing PPD files for a + manufacturer whose name contained spaces (STR #1567) + - Added the SNMP backend for network printer discovery + (STR #1555) + - cupstestppd now fails PPD files with 1284DeviceId + instead of 1284DeviceID, and cups-driverd uses a + case-insensitive comparison when looking for it (STR + #1573) + - cupsDoFileRequest() and cupsDoRequest() now work + properly with non-blocking HTTP connections. + - Added Swedish translation (STR #1569) + - "make install" now installs the MIME files with world + read permissions (STR #1565) + - More CDSA encryption support fixes (STR #1563) + - Updated the default mime.types file to support printing + of files that do not have a locally-recognized MIME + media type to raw or System V queues. + - Updated the serial port detection code on Linux (STR + #1562) + - Added some more error checking to httpGetHostname() + (STR #1561) + - The title of some administration pages was not + localized (STR #1548) + - The edit-config.tmpl file was not generated or + installed for the Spanish or Japanese localizations + (STR #1547) + - The mimeDelete() function freed the types before the + filters, but the filters needed the type data (STR #1558) + - The scheduler didn't keep track of the status pipes + properly, leading to a bad select() for multi-file jobs + (STR #1559) + - The cupstestdsc program didn't validate the ordinal + page number value for %%Page: comments. + + +CHANGES IN CUPS V1.2rc2 + + - The scheduler was not always using the string pool, + causing random crashes. + - The lpmove and the web interface's Move Job button did + not work with stopped jobs (STR #1534) + - The PostScript filter did not handle the page-set + option properly with number-up printing (STR #1543) + - The scheduler now only warns about unsupported ACLs + once (STR #1532) + - The "fitplot" option did not work with output from + Mozilla (STR #1542) + - The imagetops filter did not work with Level 2 or 3 + printers (STR #1533) + - The scheduler now recognizes PostScript files with PJL + commands that do not include an ENTER LANGUAGE command. + - Added --with-printcap configure option. + - 64-bit SSL fixes for MacOS X. + - The scheduler didn't send some printer state change + events. + - The scheduler didn't send jobs to busy remote printers. + - Fixed some problems with the launchd support. + - Added new USB printer backend for MacOS X. + - The PostScript filter now handles files that start with + an incomplete PJL header (PR #6076) + - The web interface language selection code did not try + the generic language localization (STR #1531) + - The language cache, string pool, and transcoding caches + are now process global instead of per-thread to avoid + problems with GNOME and to allow for data sharing + between threads (STR #1530) + - Fixed a CUPS 1.1.x compatibility bug (STR #1528) + - The web interface redirection after certain printer + administration tasks was broken (STR #1516) + - Web interface authorization could get stuck (STR #1512) + - Localization updates (STR #1513, STR #1518, STR #1520) + - The pstops filter didn't work with some files (STR + #1523) + - "./configure --enable-static" didn't work (STR #1522) + - The scheduler was not using the configured default + Group (STR #1521) + - The web interface still did not show the localized time + and date for some locales and systems (STR #1509) + - httpAddrGetList() would crash on systems without + getaddrinfo(). + - Socket URIs without a trailing slash would cause the + port number to not be accepted (STR #1519) + - Local raw and System V printers were not advertised as + such for printer browsing (STR #1502) + - The RPM spec file incorrectly put duplicate copies of + the Japanese and Spanish web interface templates in the + main cups package (STR #1517) + - cupsSetDests() did not explicitly set the permissions + of the /etc/cups/lpoptions file (STR #1508) + - The lpq command crashed with the -h option (STR #1515) + + +CHANGES IN CUPS V1.2rc1 + + - Documentation updates (STR #1497, STR #1498) + - The scheduler now redirects browsers to https: URLs + when encryption is required. + - The scheduler would crash when printing with a banner + (STR #1500) + - cups-driverd did not use the LanguageEncoding attribute + in PPD files to convert the NickName to UTF-8 (STR + #1503) + - The lpadmin command could not set the + printer-error-policy attribute (STR #1504) + - The web interface did not show the time and date in the + correct format for the locale (STR #1505) + - CUPS no longer accepts print jobs if a printer does not + support the file format (STR #1501) + - Cleaned up the PostScript filter (pstops) so that it + properly supports %%IncludeFeature and page scaling + (STR #1453) + - Fixed the cupsFileRewind() and cupsFileSeek() functions + to work properly with uncompressed files. + - Added cupsFileGetLine(), cupsFileStderr(), + cupsFileStdin(), and cupsFileStdout() functions to the + CUPS library. + - Added a new cupstestdsc program to test the DSC + conformance of PostScript files. + - Added KDE/GNOME icons and a Manage Printers menu item. + - Added --enable-image and --enable-pdftops configure + options to control whether the image and PDF filters + are built and installed (default = yes for all + platforms but MacOS X) + - Fixed a minor memory leak in the PPD API. + - Fixed transcoding issues (STR #1493) + - The scheduler now enforces a minimum job cost of 100 + when doing FilterLimit checks. + - The scheduler would leak file descriptors when printing + to raw queues (STR #1491) + - The IPv6 support did not compile on Tru64 UNIX (STR + #1488) + - ppdOpen2() now converts the NickName and all UI text to + UTF-8 (STR #1475) + - The Set Allowed Users web page did not work (STR #1486) + - When the default policy was not set or set to a non- + existing policy, the scheduler did not set the default + policy name to "default" (STR #1484) + - The Zebra CPCL driver did not use the correct righthand + margin for the 4" wide label sizes. + - Fixed a problem with the parsing of fractional real + numbers in PPD files. + - Added Spanish localization files (STR #1480) + - Fixed localization of a few scheduler messages (STR + #1478) + - Fixed support for HEAD requests in the scheduler (STR + #1481) + + +CHANGES IN CUPS V1.2b2 + + - Updated the CUPS design description. + - Added --enable-32bit and --enable-64bit configure + options to allow building of separate 32/64-bit + libraries on systems that support both environments + (STR #1472) + - Various compiler warning fixes. + - Fixes for Solaris 10 builds against old GNU TLS and + LDAP libraries. + - Added a cupsArrayUserData() function to retrieve the + user data pointer for an array (useful for typing + arrays) + - The ppdEmitString() function did not compute the + required buffer size properly, leading to dropped + characters on the end of the printer commands in pstops + and imagetops (STR #1470) + + +CHANGES IN CUPS V1.2b1 + + - The serial backend now supports Equinox 8-port serial + hubs (STR #526) + - The IPP backend now supports a compression option to + compress print files as they are sent to the remote + server (STR #956) + - The CUPS browse protocol now supports passing of + default options and browse timeout values from the + server to the clients (STR #800) + - Implicit classes that timed out could cause the + scheduler to crash (STR #1439) + - Added DragonFly support in local device backends (STR + #1362) + - Added LDAP printer browsing support (STR #338) + - Added official support for printer maintenance commands + via the CUPS Command file format and hooks in the + printer-type and web interfaces (STR #932) + - The HP-GL/2 filter could get in an infinite loop trying + to convert HP-PCL files (STR #1415) + - CUPS now implements the HTTP/1.1 Expect header (STR + #1407) + - Options in PPD files are no longer automatically put in + an "Extra" group; rather, all options that are not + inside an Open/CloseGroup will be placed in the + "General" group (STR #1385) + - The scheduler now creates a job-uuid attribute that + uniquely identifies a job on a network (STR #1410) + - The init script now unsets the TMPDIR environment + variable to prevent user temporary directories from + being used by cupsd accidentally (STR #1424) + - Added support for launchd on MacOS X. + - Added support for notify_post on MacOS X. + - Added support for DBUS on Linux. + - All of the Berkeley (except for lpc) and System V + commands now support specification of user, host, and + port (STR #1028, STR #1029, STR #1087) + - The lpmove command now allows you to move all jobs for + a given queue (STR #56) + - The web interface now supports moving of a job or jobs + to another queue (STR #56) + - The web interface now provides searching, paging, and + changing of the sort/display order of classes, jobs, + and printers. + - cupsaddsmb now accepts a password on the command-line + and supports passwords with special characters (STR + #822, STR #1236) + - ppdLoad*() no longer tries to "fix" bad characters in + UI text (STR #1101) + - Printer names can now (reliably) contain Unicode + characters (STR #896) + - The lpstat command now shows the time and date of the + last printer state change instead of the hardcoded "Jan + 01 00:00" (STR #659) + - The scheduler now adds a job-actual-printer-uri + attribute to job objects when printing to a class (STR + #116) + - The scheduler now logs log file open errors to the + system log (STR #1289) + - The scheduler now sets the job-originating-user-name to + the authenticated username, if available (STR #1318) + - The scheduler now only updates the permissions of SSL + keys and certificates when they are under the + ServerRoot directory (STR #1324) + - The rastertodymo driver has been renamed to + rastertolabel (a symlink is installed so that existing + queues continue to work) and now also supports Zebra's + CPCL language. + - The lpstat command could show the wrong active job for + a printer (STR #1301) + - Fixed a potential crash problem in the scheduler when + aborting a CGI program (STR #1290) + - Added a "cancel all jobs" button to the class and + printer web interfaces (STR #1140) + - The add-printer web page now shows the + set-printer-options page after the printer has been + added (STR #690) + - The classes web page now provides links to each of the + member printers (STR #307) + - CUPS now handles HTTP request/response lines up to 32k + in length; this is mainly for better cookie support + (STR #1274) + - Added support for the Apache PassEnv and SetEnv + directives to cupsd.conf (STR #853) + - Added large file (64-bit) support (STR #541) + - Fixed a performance issue with the ippReadIO() + implementation (STR #1284) + - Fixed a performance issue with the scheduler's implicit + class implementation (STR #1283) + - The pdftops filter now adds the Title and Creator + fields from the PDF file to the PostScript document + comments section (STR #539, STR #830) + - Added a new cups_array_t and cupsArray*() functions to + the CUPS API to support sorted lists of data. + - Made the CUPS API library thread-safe (STR #1276) + - Added "media" option support for EFI EFMediaType option + (STR #902) + - Added write buffering to the HTTP code to improve + performance (STR #547) + - The scheduler now uses the attributes-natural-language + attribute to localize banner pages (STR #386) + - The scheduler now returns the address that was used to + connect to it (STR #1076) + - Fixed a problem with N-up printing and OpenOffice (STR + #576) + - Added support for the GCC position independent + executable options (STR #1209) + - Added new BrowseLocalProtocols and + BrowseRemoteProtocols directives to cupsd.conf, + allowing for different browse protocols for local and + remote printers (STR #877) + - PPD files can now contain strings up to 256k in length + (STR #1215) + - The pstops filter now supports the IncludeFeature DSC + comment (STR #1212) + - The pstops filter now disables the setpagedevice + procedure when doing N-up printing (STR #1161) + - The serial backend now supports "stop=1", "stop=2", + "parity=space", and "parity=mark" options (STR #1155) + - "make install" no longer overwrites an existing PAM + configuration file (STR #1064) + - The scheduler now closes all files on startup when run + in daemon mode (STR #1009) + - Added a new RGBW colorspace to the CUPS raster format + (STR #1071) + - The pdftops filter now sets the page size based on the + media box when not scaling the output (STR #912) + - The pdftops filter now supports masked images (STR + #281) + - The pdftops filter produced large output when rendering + PDF files containing lot of repeated images (STR #327) + - The pdftops filter now minimizes print processing of + PDF files when using the page-ranges option (STR #273) + - Updated pdftops filter to Xpdf 3.01. + - Added new cupsBackchannelRead() and + cupsBackchannelWrite() functions, as well as + backchannel support to the parallel, serial, socket, + and USB backends (STR #1252) + - The parallel and USB backends now treat a "no space + available" error as an out-of-paper condition (STR + #1225) + - The "lpc" command now supports the "status all" command + (STR #1004) + - ippReadIO() did not read collections properly (STR + #1249) + - The "make test" script now creates the test files in + "/tmp/cups-$USER" instead of "/tmp/$USER" (STR #981) + - All backends now abort on error when printing a job to + a class - this allows the next printer in the class to + print the job (STR #1084) + - The scheduler now verifies that a printer supports + Letter or A4 media sizes before setting them as the + initial default (STR #1250) + - The cupstestppd program now flags bad Resolution + options (STR #1269) + - The USB backend now retries printing when the printer + is disconnected or turned off (STR #1267) + - Added new httpGetHostname() function to CUPS API, and + use it instead of gethostname() so that the web + interface will work correctly on systems whose hostname + is not the FQDN (STR #1266) + - The scheduler now stops printers if the backend for the + queue is missing on startup (STR #1265) + - The configure script now supports "--disable-library" + to disable particular image file format support + libraries, even if they are available on the build + system (STR #1248) + - The IPP backend did not always report on the total + number of pages that were printed (STR #1251) + - The lpstat program could display garbage date and time + values for locales whose date format exceeded 31 + characters (STR #1263) + - The cupstestppd program would segfault when testing + certain broken PPD files (STR #1268) + - Dramatically reduced the overhead of implicit classes. + - Added new cupsDir*() functions to CUPS API. + - Printers can now be published individually for sharing. + - Fixed a bug in the scheduler's startup signalling code + which caused cupsd to send the SIGUSR1 signal to the + init process instead of the original parent process + (STR #1258) + - Added new on-line help CGI to web interface to provide + searchable help. + - Devices are now tracked dynamically, with each query + doing a new device scan. This eliminates a previous + startup delay caused by slow backends and allows new + printers to be seen without restarting the server, + however it limits the amount of device URI checking + that can be done (basically now the scheduler only + requires a URI with a method that is a listed backend) + - Added new printer auto-detection, server configuration, + and log file viewing to the administration web page. + - Added new "set allowed users" web interface to set the + list of allowed users for a printer or class. + - The scheduler, command-line, and web interfaces now + limit the list of printers and classes to those + accessible by a user. + - cupsMarkOptions() now handles more non-standard + duplexing options and choices (STR #915) + - cups-lpd now honors remote banner requests with the + "standard" banner whenever a printer does not have one + defined (STR #1220) + - The scheduler's denial-of-service checks did not work + properly with IPv6 addresses (STR #1134) + - The lp and lpr commands did not error out properly when + they were unable to write to a temporary file (STR + #1129) + - The pstops filter did not handle Adobe-specific + comments in Windows NT driver output (STR #1085) + - "lpstat -l -p" incorrectly reported the printer + interface (STR #936) + - The web interface now operates exclusively with the + UTF-8 encoding, and sends the appropriate character set + and header information to the web browser (STR #919, + STR #1007) + - Added a "set allowed users" interface to the web + interface so that you can set the list of allowed or + denied users/groups for a printer or class. + - Disallow the "#" character in printer names, since it + has special meaning in the shell, config files, and in + URIs (STR #917, STR #1202) + - Added a new application/x-csource MIME type, and + support for it to the texttops filter so that you can + pretty print plain text files without the C/C++ + keywords being highlighted. + - The pdftops filter did not compile with GCC 4.0 (STR + #1226) + - The texttops filter did not highlight preprocessor + directives followed by a tab properly. + - HP PJL output now uses both JOB DISPLAY and RDYMSG + commands to show the current job on the printer's + display (STR #1218) + - Local authentication certificates are now stored in + /var/run/cups/certs by default instead of + /etc/cups/certs (STR #1211) + - Backends now use "&" to separate options in device + URIs; "+" is still recognized but is deprecated (STR + #842) + - The USB backend no longer supports the usb:/dev/foo + format on systems that support device ID queries. + - Forced classification markings did not work when the + job-sheets parameters were "none,none". + - "lpstat -l -p" incorrectly showed all users as allowed, + even if the queue was restricted to certain users (STR + #801) + - The scheduler now automatically detects SSL/TLS clients + without using the SSLPort/SSLListen directives. + - The CUPS API and scheduler no longer support SSLv2- + encrypted connections. + - Updated the cupsaddsmb utility to correctly export the + CUPS driver for Windows. + - Fixed a signal-handling bug in httpRead() which + ultimately caused the server to print multiple copies + when it was busy (STR #1184) + - The cupsFile API now uses the O_APPEND option when + opening files in append mode (STR #990) + - The md5.h header and md5_* functions are now officially + private and have been renamed to avoid conflicts with + other implementations with the same name. + - The pdftops filter incorrectly embedded some Type1 + fonts (STR #1093) + - The scheduler didn't detect a closed connection in the + middle of an IPP request (STR #1153) + - The scheduler could block trying to read the job status + if there was input pending and the job was cancelled in + the same input cycle (STR #1157) + - The scheduler could crash when deleting a class due to + infinite recursion. + - Updated the Zebra ZPL label printer driver to use the + run-length encoding and support more options. + - Updated serial backend to scan for /dev/ttyC* as well + as /dev/ttyc* for Cyclades serial ports (STR #1049) + - The scheduler could hang reading the job status under + certain circumstances (STR #1068) + - The USB backend termination signal code was inverted + (STR #1046) + - Moved enable and disable commands to sbindir to be + consistent. + - Added new cupsRasterInterpretPPD() function for RIP + filters to setup the raster page header from + PostScript commands in a PPD file. + - The CUPS browsing protocol now offers a "delete" bit + to remove printers as soon as they are deleted on the + server or as soon as the server shuts down gracefully + (STR #793) + - The CUPS_SERVER and ServerName directives (client.conf + and ~/.cupsrc) may now contain names of the form + "server:port" and "/path/to/domain/socket". + - The "cancel -u user" command now works for ordinary + users (STR #751) + - Added test run support to "make test" target (STR #64) + - Added domain socket support (STR #656) + - Added BrowseLocalOptions directive to allow the + administrator to add printer URI options to the browse + URI, e.g. "encryption=required" (STR #732) + - Added BrowseRemoteOptions directive to allow the + administrator to add standard URI options to the + remote printer URI, e.g. "encryption=required" (STR + #732) + - Now put "-I.." compiler option in front of all others + to ensure that local CUPS headers are used before + installed headers (STR #437) + - New cupsLangPrintf() and cupsLangPuts() for localized + interfaces. + - Now support custom attributes and extended options in + PPD files. + - Now provide functions to save PPD files. + - New policy mechanism allows per-operation and + per-printer control over what users and groups are + allowed to do various IPP operations. + - New error policy mechanism to control how aborted + backend errors are handled by the scheduler + (abort-job, retry-job, requeue-job, stop-printer) + - Updated the printer test page with a better color + wheel and a separate grayscale ramp. + - A single backend process is now run to send all print + data for a job. + - Backends and filters can now send and receive + backchannel data over file descriptor 3. + - Updated the raster stream format to support more + user-defined attributes and to do compression of the + page data. diff --git a/CHANGES-1.3.txt b/CHANGES-1.3.txt new file mode 100644 index 0000000..9af534f --- /dev/null +++ b/CHANGES-1.3.txt @@ -0,0 +1,856 @@ +CHANGES-1.3.txt +--------------- + +CHANGES IN CUPS V1.3.11 + + - The scheduler did not prevent nested classes (STR #3211) + - The scheduler did not reprint processing jobs that were moved to + another destination (STR #3222) + - The scheduler did not reset the current job file when stopping a + printer (STR #3226) + - The scheduler did not handle POSTs to custom CGIs properly (STR #3221) + - The pdftops filter did not print landscape PDF pages properly + (STR #2881) + - The scheduler did not handle partial header lines properly from CGI + programs (STR #3194) + - The web interface could hang on OpenBSD (STR #3176, STR #3196) + - The scheduler and cupsfilter utility did not handle rules starting + with a negation operator properly (STR #3160) + - The scheduler and cupsfilter utility would crash with certain MIME + .types rules (STR #3159) + - httpSetField wasn't bracketing IPv6 numeric addresses for the Host: + field (STR #3164) + - The ServerName, if specified, was not treated as a valid alias for the + local system (STR #3167) + - "make epm" did not work (STR #3166) + - "lpstat -h server" showed non-shared printers (STR #3147) + - "make check" did not work on Linux (STR #3161) + + +CHANGES IN CUPS V1.3.10 + + - Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056, + STR #3057) + - SECURITY: The scheduler now protects against DNS rebinding attacks + (STR #3118) + - SECURITY: Fixed TIFF integer overflow in image filters (STR #3031) + - The scheduler did not support the job-hold-until attribute with the + Restart-Job operation (STR #3130) + - SECURITY: The PNG image reading code did not validate the + image size properly, leading to a potential buffer overflow + (STR #2974) + - The rastertohp driver did not set the 1-sided printing mode when + needed (STR #3131) + - Now use a wrapper program instead of our fork of the Xpdf code to + support printing of PDF files. The new wrapper supports using Xpdf, + poppler, or Ghostscript to convert PDF files to PostScript (STR #3129) + - Long job names caused problems with some PJL printers (STR #3125) + - The lpq command did not work when showing all destinations (STR #3117) + - The scheduler used a codeset name of UTF8 which is not supported on + Solaris (STR #3113) + - cupsGetJobs() did not work with a NULL destination (STR #3107) + - Fixed a localization problem for option choices (incorrectly) named + "Custom" (STR #3106) + - The fallback OpenSSL random number seeding would not work (STR #3079) + - The scheduler might miss a child signal, causing high CPU usage. + - The scheduler did not enforce quotas after the job history was + unloaded (STR #3078) + - The job-k-limit, job-page-limit, and job-quota-period attributes + could not be set using the lpadmin command (STR #3077) + - httpSeparateURI() did not error out on URIs with a missing port + number after a colon. + - Fixed a Valgrind-detected initialization error when creating a + missing directory on startup. + - The scheduler did not always read all of the HTTP headers from a + CGI script/program. + - The scheduler did not always set the "air" property in Bonjour/DNS-SD + registrations. + - The scheduler incorrectly compared Mac OS X UUIDs for access + control, preventing access in certain configurations. + - The IPP backend incorrectly reset the required authentication + to Kerberos when authentication failed. + - The scheduler no longer looks up the local hostname by default; + turn on hostname lookups to restore the previous behavior. + - The scheduler did not always load MIME type rules correctly + (STR #3059) + - The test page did not format correctly on A4 paper (STR #3060) + - The web interface sometimes incorrectly redirected users to + 127.0.0.1 (STR #3022) + - cupsPrintFile*() did not send the document filename for single + file submissions (STR #3055) + - The scheduler did not update the member-names attribute when + removing the last printer from a class. + - The scheduler did not report PPD Products with parenthesis + in them properly (STR #3046) + - The wrong italic fonts were listed in the UTF-8 charset file + for the text filter. + - The backends did not return an OK status for the + CUPS_SC_CMD_GET_BIDI side-channel command (STR #3029) + - The scheduler did not purge jobs that were missing a + time-at-creation attribute, indicating a bad job control file + (STR #3030) + - The "-o job-hold-until=week-end" option did not work properly + (STR #3025) + - The Solaris USB printer device does not support select or poll + (STR #3028) + - The scheduler would crash if you exceeded the MaxSubscriptions + limit. + - The lp "-H immediate" option did not specify that the job + should not be held (STR #3013) + - The scheduler did not support the "Connection: close" + HTTP header (STR #3010) + - The mailto notifier didn't terminate messages properly + (STR #3011) + - Backends could spin trying to read back-channel data + (STR #3001) + - The HP-GL/2 filter was using the wrong default colors + (STR #2966) + - The scheduler incorrectly allowed Get-Jobs operations without a + printer-uri (STR #2996) + - The compression option was not being encoded properly + (STR #2997) + - Added a missing character map for JIS-X0213/ShiftJIS. + - The scheduler now rejects ATTR: messages with empty values. + - The scheduler could consume all CPU handling closed connections + (STR #2988) + - Fixed some configure script bugs with rc/xinetd directories + (STR #2970) + - The Epson sample driver PPDs contained errors (STR #2979) + + +CHANGES IN CUPS V1.3.9 + + - SECURITY: The HP-GL/2 filter did not range check pen numbers + (STR #2911) + - SECURITY: The SGI image file reader did not range check + 16-bit run lengths (STR #2918) + - SECURITY: The text filter did not range check cpi, lpi, or + column values (STR #2919) + - Documentation updates (STR #2904, STR #2944) + - The French web admin page was never updated (STR #2963) + - The IPP backend did not retry print jobs when the printer + reported itself as busy or unavailable (STR #2951) + - The "Set Allowed Users" web interface did not handle trailing + whitespace correctly (STR #2956) + - The PostScript filter did not work with Adobe applications + using custom page sizes (STR #2968) + - The Mac OS X USB backend did not work with some printers + that reported a bad 1284 device ID. + - The scheduler incorrectly resolved the client connection + address when HostNameLookups was set to Off (STR #2946) + - The IPP backend incorrectly stopped the local queue if + the remote server reported the "paused" state. + - The cupsGetDests() function did not catch all types of + request errors. + - The scheduler did not always log "job queued" messages + (STR #2943) + - The scheduler did not support destination filtering using + the printer-location attribute properly (STR #2945) + - The scheduler did not send the server-started, + server-restarted, or server-stopped events (STR #2927) + - The scheduler no longer enforces configuration file + permissions on symlinked files (STR #2937) + - CUPS now reinitializes the DNS resolver on failures + (STR #2920) + - The CUPS desktop menu item was broken (STR #2924) + - The PPD parser was too strict about missing keyword + values in "relaxed" mode. + - The PostScript filter incorrectly mirrored landscape + documents. + - The scheduler did not correctly update the + auth-info-required value(s) if the AuthType was Default. + - The scheduler required Kerberos authentication for + all operations on remote Kerberized printers instead + of just for the operations that needed it. + - The socket backend could wait indefinitely for back- + channel data with some devices. + - PJL panel messages were not reset correctly on older + printers (STR #2909) + - cupsfilter used the wrong default path (STR #2908) + - Fixed address matching for "BrowseAddress @IF(name)" + (STR #2910) + - Fixed compiles on AIX. + - Firefox 3 did not work with the CUPS web interface in SSL + mode (STR #2892) + - Custom options with multiple parameters were not emitted + correctly. + - Refined the cupstestppd utility. + - ppdEmit*() did not support custom JCL options (STR #2889) + - The cupstestppd utility incorrectly reported missing + "en" base translations (STR #2887) + + +CHANGES IN CUPS V1.3.8 + + - Documentation updates (STR #2785, STR #2861, STR #2862) + - The scheduler did not add the ending job sheet when the + job was released. + - The IPP backend did not relay marker-* attributes. + - The CUPS GNOME/KDE menu item was not localized for + Chinese (STR #2880) + - The CUPS GNOME/KDE menu item was not localized for + Japanese (STR #2876) + - The cupstestppd utility reported mixed line endings for + Mac OS and Windows PPD files (STR #2874) + - The pdftops filter did not print landscape orientation PDF + pages correctly on all printers (STR #2850) + - The scheduler did not handle expiring of implicit classes + or their members properly, leading to a configuration where + one of the members would have a short name (STR #2766) + - The scheduler and cupstestppd utilities did not support + cupsFilter and cupsPreFilter programs with spaces in their + names (STR #2866) + - Removed unused variables and assignments found by the + LLVM "clang" tool. + - Added NULL checks recommended by the LLVM "clang" tool. + - The scheduler would crash if you started a printer that + pointed to a backend that did not exist (STR #2865) + - The ppdLocalize functions incorrectly mapped all generic + locales to country-specific locales. + - The cups-driverd program did not support Simplified Chinese + or Traditional Chinese language version strings (STR #2851) + - Added an Indonesian translation (STR #2792) + - Fixed a timing issue in the backends that could cause data + corruption with the CUPS_SC_CMD_DRAIN_OUTPUT side-channel + command (STR #2858) + - The scheduler did not support "HostNameLookups" with all of + the boolean names (STR #2861) + - Fixed a compile problem with glibc 2.8 (STR #2860) + - The scheduler incorrectly filtered out queues with ACLs and + authentication. + - The PostScript filter did not support %%IncludeFeature lines + in the page setup section of each page (STR #2831) + - The scheduler did not generate printer-state events when the + default printer was changed (STR #2764) + - cupstestppd incorrectly reported a warning about the PPD format + version in some locales (STR #2854) + - cupsGetPPD() and friends incorrectly returned a PPD file for + a class with no printers. + - The member-uris values for local printers in a class returned + by the scheduler did not reflect the connected hostname or + port. + - The CUPS PHP extension was not thread-safe (STR #2828) + - The scheduler incorrectly added the document-format-default + attribute to the list of "common" printer attributes, which + over time would slow down the printing system (STR #2755, + STR #2836) + - The cups-deviced and cups-driverd helper programs did not set + the CFProcessPath environment variable on Mac OS X (STR #2837) + - "lpstat -p" could report the wrong job as printing (STR #2845) + - The scheduler would crash when some cupsd.conf directives + were missing values (STR #2849) + - The web interface "move jobs" operation redirected users to + the wrong URL (STR #2815) + - The Polish web interface translation contained errors + (STR #2815) + - The scheduler did not report PostScript printer PPDs with + filters as PostScript devices. + - The scheduler did not set the job document-format attribute + for jobs submitted using Create-Job and Send-Document. + - cupsFileTell() did not work for log files opened in append + mode (STR #2810) + - The scheduler did not set QUERY_STRING all of the time + for CGI scripts (STR #2781, STR #2816) + - The scheduler now returns an error for bad job-sheets + values (STR #2775) + - Authenticated remote printing did not work over domain + sockets (STR #2750) + - The scheduler incorrectly logged errors for print filters + when a job was canceled (STR #2806, #2808) + - The scheduler no longer allows multiple RSS subscriptions + with the same URI (STR #2789) + - The scheduler now supports Kerberized printing with + multiple server names (STR #2783) + - "Satisfy any" did not work in IPP policies (STR #2782) + - The CUPS imaging library would crash with very large + images - more than 16Mx16M pixels (STR #2805) + - The PNG image loading code would crash with large images + (STR #2790) + - The scheduler did not limit the total number of filters. + - The scheduler now ensures that the RSS directory has + the correct permissions. + - The RSS notifier did not quote the feed URL in the RSS + file it created (STR #2801) + - The web interface allowed the creation and cancellation + of RSS subscriptions without a username (STR #2774) + - Increased the default MaxCopies value on Mac OS X to + 9999 to match the limit imposed by the print dialog. + - The scheduler did not reject requests with an empty + Content-Length field (STR #2787) + - The scheduler did not log the current date and time and + did not escape special characters in request URIs when + logging bad requests to the access_log file (STR #2788) + + +CHANGES IN CUPS V1.3.7 + + - CVE-2008-0047: cgiCompileSearch buffer overflow (STR #2729) + - CVE-2008-1373: CUPS GIF image filter overflow (STR #2765) + - Updated the "make check" tests to do a more thorough + automated test. + - cups-driverd complained about missing directories (STR + #2777) + - cupsaddsmb would leave the Samba username and password on + disk if no Windows drivers were installed (STR #2779) + - The Linux USB backend used 100% CPU when a printer was + disconnected (STR #2769) + - The sample raster drivers did not properly handle SIGTERM + (STR #2770) + - The scheduler sent notify_post() messages too often on + Mac OS X. + - Kerberos access to the web interface did not work + (STR #2748) + - The scheduler did not support "AuthType Default" in IPP + policies (STR #2749) + - The scheduler did not support the "HideImplicitMembers" + directive as documented (STR #2760) + - "make check" didn't return a non-zero exit code on + error (STR #2758) + - The scheduler incorrectly logged AUTH_foo environment + variables in debug mode (STR #2751) + - The image filters inverted PBM files (STR #2746) + - cupsctl would crash if the scheduler was not running + (STR #2741) + - The scheduler could crash when printing using a port + monitor (STR #2742) + - The scheduler would crash if PAM was broken (STR #2734) + - The image filters did not work with some CMYK JPEG files + produced by Adobe applications (STR #2727) + - The Mac OS X USB backend did not work with printers that + did not report a make or model. + - The job-sheets option was not encoded properly (STR #2715) + - The scheduler incorrectly complained about missing LSB + PPD directories. + + +CHANGES IN CUPS V1.3.6 + + - Documentation updates (STR #2646, STR #2647, STR #2649) + - Fixed a problem with the web interface "Use Kerberos + Authentication" check box (STR #2703) + - The scheduler unconditionally overwrote the printer-state- + message with "process-name failed" when a filter or backend + failed, preventing a useful error message from being shown + to the user. + - Policies on CUPS-Move-Job didn't work as expected (STR + #2699) + - The configure script only supported D-BUS on Linux + (STR #2702) + - The scheduler did not support (STR #2701) + - The scheduler did not reset the job-hold-until attribute + after a job's hold time was reached. + - The scheduler did not support printer supply attributes + (STR #1307) + - The Kerberos credentials provided by some Windows KDCs + were still too large - now use a dynamic buffer to + support credentials up to 64k in size (STR #2695) + - Printing a test page from the web interface incorrectly + defaulted to the "guest" user (STR #2688) + - The cupsEncodeOptions2() function did not parse multiple- + value attribute values properly (STR #2690) + - The scheduler incorrectly sent printer-stopped events for + status updates from the print filters (STR #2680) + - The IPP backend could crash when handling printer errors + (STR #2667) + - Multi-file jobs did not print to remote CUPS servers + (STR #2673) + - The scheduler did not provide the Apple language ID to + job filters. + - Kerberos authentication did not work with the web + interface (STR #2606, STR #2669) + - The requesing-user-name-allowed and -denied functionality + did not work for Kerberos-authenticated usernames (STR + #2670) + - CUPS didn't compile on HP-UX 11i (STR #2679) + - cupsEncodeOptions2() did not handle option values like + "What's up, doc?" properly. + - Added lots of memory allocation checks (Fortify) + - The scheduler would crash if it was unable to add a job + file (Fortify) + - ppdOpen*() did not check all memory allocations (Coverity) + - ippReadIO() did not check all memory allocations (Coverity) + - The PostScript filter did not detect read errors (Coverity) + - The scheduler did not check for a missing job-sheets-completed + attribute when sending an event notification (Coverity) + - "Set Printer Options" might not work with raw queues (Coverity) + - cupsRasterInterpretPPD() could crash on certain PostScript + errors (Coverity) + - The USB backend did not check for back-channel support + properly on all systems (Coverity) + - Fixed memory leaks in the GIF and PNM image loading code + (Coverity) + - Removed some dead code in the CUPS API and scheduler (Coverity) + - Fixed two overflow bugs in the HP-GL/2 filter (Coverity) + - Fixed another ASN1 string parsing bug (STR #2665) + - The RSS notifier directory was not installed with the + correct permissions. + - The standard CUPS backends could use 100% CPU while waiting + for print data (STR #2664) + - Filename-based MIME rules did not work (STR #2659) + - The cups-polld program did not exit if the scheduler crashed + (STR #2640) + - The scheduler would crash if you tried to set the port-monitor + on a raw queue (STR #2639) + - The scheduler could crash if a polled remote printer was + converted to a class (STR #2656) + - The web interface and cupsctl did not correctly reflect + the "allow printing from the Internet" state (STR #2650) + - The scheduler incorrectly treated MIME types as case- + sensitive (STR #2657) + - The Java support classes did not send UTF-8 strings to + the scheduler (STR #2651) + - The CGI code did not handle interrupted POST requests + properly (STR #2652) + - The PostScript filter incorrectly handled number-up when + the number of pages was evenly divisible by the number-up + value. + - The PDF filter incorrectly filtered pages when page-ranges + and number-up were both specified (STR #2643) + - The IPP backend did not handle printing of pictwps files + to a non-Mac CUPS server properly. + - The scheduler did not detect network interface changes + on operating systems other than Mac OS X (STR #2631) + - The scheduler now logs the UNIX error message when it + is unable to create a request file such as a print job. + - Added support for --enable-pie on Mac OS X. + + +CHANGES IN CUPS V1.3.5 + + - The SNMP backend did not check for negative string + lengths (STR #2589) + - The scheduler incorrectly removed auth-info attributes, + potentially leading to a loss of all options for a job. + - The scheduler stopped sending CUPS browse packets on a + restart when using fixed addresses (STR #2618) + - Fixed PDF filter security issues (CVE-2007-4352 + CVE-2007-5392 CVE-2007-5393) + - Changing settings would always change the DefaultAuthType + and Allow lines (STR #2580) + - The scheduler would crash when submitting an undefined + format file from Samba with LogLevel debug2 (STR #2600) + - The scheduler did not use poll() when epoll() was not + supported by the running kernel (STR #2582) + - Fixed a compile problem with Heimdal Kerberos (STR #2592) + - The USB backend now retries connections to a printer + indefinitely rather than stopping the queue. + - Printers with untranslated JCL options were not exported + to Samba correctly (STR #2570) + - The USB backend did not work with some Minolta USB + printers (STR #2604) + - The strcasecmp() emulation code did not compile (STR + #2612) + - The scheduler would crash if a job was sent to an empty + class (STR #2605) + - The lpc command did not work in non-UTF-8 locales (STR + #2595) + - Subscriptions for printer-stopped events also received + other state changes (STR #2572) + - cupstestppd incorrectly reported translation errors for + the "en" locale. + - ppdOpen() did not handle custom options properly when the + Custom attribute appeared before the OpenUI for that + option. + - The scheduler could crash when deleting a printer or + listing old jobs. + - The Mac OS X USB backend did not allow for requeuing of + jobs submitted to a class. + - lpmove didn't accept a job ID by itself. + - The scheduler incorrectly removed job history information + for remote print jobs. + - The scheduler incorrectly sent the + "com.apple.printerListChanged" message for printer state + changes. + - The PostScript filter drew the page borders (when enabled) + outside the imageable area. + - The LPD and IPP backends did not default to the correct + port numbers when using alternate scheme names. + - The scheduler incorrectly deleted hardwired remote + printers on system sleep. + - The scheduler would abort if a bad browse protocol name + was listed in the cupsd.conf file. + - The online cupsd.conf help file incorrectly showed + "dns-sd" instead of "dnssd" for Bonjour sharing. + - The scheduler could crash changing the port-monitor value. + - The scheduler generated CoreFoundation errors when run as + a background process. + - When printing with number-up > 1, it was possible to get + an extra blank page. + + +CHANGES IN CUPS V1.3.4 + + - Documentation updates (STR #2560, STR #2563, STR #2569) + - CUPS now maps the "nb" locale to "no" on all platforms + (STR #2575) + - CUPS did not work with a Windows 2003 R2 KDC (STR #2568) + - ippReadIO() could read past the end of a buffer (STR + #2561) + - The scheduler would crash on shutdown if it was unable + to create a Kerberos context. + - Multiple AuthTypes in cupsd.conf did not work (STR + #2545) + - The snmp.conf file referenced the wrong man page (STR + #2564) + - The cupsaddsmb program didn't handle domain sockets + properly (STR #2556) + - The scheduler now validates device URIs when adding + printers. + - Updated httpSeparateURI() to support hostnames with + the backslash character. + - Updated the Japanese localization (STR #2546) + - The parallel backend now gets the current IEEE-1284 + device ID string on Linux (STR #2553) + - The IPP backend now checks the job status at + variable intervals (from 1 to 10 seconds) instead + of every 10 seconds for faster remote printing + (STR #2548) + - "lpr -p" and "lpr -l" did not work (STR #2544) + - Compilation failed when a previous version of CUPS + was installed and was included in the SSL include + path (STR #2538) + - The scheduler did not reject requests with charsets + other than US-ASCII or UTF-8, and the CUPS API + incorrectly passed the locale charset to the scheduler + instead of UTF-8 (STR #2537) + - cups-deviced did not filter out duplicate devices. + - The AppleTalk backend incorrectly added a scheme + listing when AppleTalk was disabled or no printers + were found. + - The PostScript filter generated N^2 copies when the + printer supported collated copies and user requested + reverse-order output. + - The scheduler did not reprint all of the files in a + job that was held. + - The scheduler did not update the printcap file after + removing stale remote queues. + - The cupsd.conf man page incorrectly referenced + "AuthType Kerberos" instead of "AuthType Negotiate". + + +CHANGES IN CUPS V1.3.3 + + - The scheduler did not use the attributes-natural-language + attribute when passing the LANG environment variable to + cups-deviced or cups-driverd. + - The scheduler did not use the printer-op-policy when + modifying classes or printers (STR #2525) + - The auth-info-required attribute was not always updated + for remote queues that required authentication. + - The German web interface localization contained errors + (STR #2523) + - The Swedish localization contained errors (STR #2522) + + +CHANGES IN CUPS V1.3.2 + + - The 1.3.1 release was incorrectly created from the + 1.4.x source tree (STR #2519) + - Added support for 32/64-bit libraries on HP-UX + (STR #2520) + - The scheduler incorrectly used portrait as the default + orientation (STR #2513) + - The scheduler no longer writes the printcap file for + every remote printer update (STR #2512) + - Remote raw printing with multiple copies did not work + (STR #2518) + - Updated the configure script to require at least autoconf + 2.60 (STR #2515) + - Some gzip'd PPD files were not read in their entirety + (STR #2510) + + +CHANGES IN CUPS V1.3.1 + + - Documentation updates. + - The USB backend on Mac OS X could hang if the driver and + printer did not match. + - Delegated Kerberos credentials were not working. + - "make distclean" incorrectly removed the edit-config.tmpl + files (STR #2508) + - Fix compile problem on HP-UX (STR #2501) + - The cupstestppd utility now tests for resolutions greater + than 99999 DPI to detect a missing "x" between the X and Y + resolutions. + - Fixed many problems in the various translations and added + a new "checkpo" utility to validate them. + - The cupstestppd utility now tests the custom page size code + for CUPS raster drivers. + - cupsLangDefault() did not attempt to return a language that + was supported by the calling application. + - If a remote printer stopped while a job was being sent, the + local queue would also get stopped and the job re-queued, + resulting in duplicate prints in some cases. + - A few Apple-specific job options needed to be omitted when + printing a banner page. + - The new peer credential support did not compile on FreeBSD + (STR #2495) + - Direct links to help files did not set the current section + so the table-of-contents was not shown. + - The configure script did not support --localedir=foo (STR #2488) + - The backends were not displaying their localized messages. + - CUPS-Authenticate-Job did not require Kerberos authentication + on queues protected by Kerberos. + - The Zebra ZPL driver did not work with Brady label printers + (STR #2487) + - Norwegian wasn't localized on Mac OS X. + - getnameinfo() returns an error on some systems when DNS is + not available, leading to numerous problems (STR #2486) + - The cupsfilter command did not work properly on Mac OS X. + - The scheduler makefile contained a typo (STR #2483) + - The TBCP and BCP port monitors did not handle the trailing + CTRL-D in some PostScript output properly. + - Fixed the localization instructions and German template for + the "Find New Printers" button (STR #2478) + - The web interface did not work with the Chinese localization + (STR #2477) + - The web interface home page did not work for languages that + were only partially localized (STR #2472) + - Updated the Spanish web interface localization (STR #2473) + - ppdLocalize() did not work for country-specific localizations. + + +CHANGES IN CUPS V1.3.0 + + - The scheduler did not handle out-of-file conditions + gracefully when accepting new connections, leading to + heavy CPU usage. + - The scheduler did not detect ServerBin misconfigurations + (STR #2470) + - "AuthType Default" did not work as expected when the + "DefaultAuthType foo" line appeared after it in the + cupsd.conf file. + - The on-line help did not describe many common printing + options (STR #1846) + - The IPP backend did not return the "auth required" status + when printing to a Kerberos-protected queue. + - The scheduler was not looking in the correct directories + for LSB PPD files (STR #2464) + - Changed references to ESP Ghostscript to GPL Ghostscript + (STR #2463) + - The PostScript filter did not cleanly terminate when + the job was canceled or stopped. + - Fixed generation of Kerberos credentials for remote + printing. Note that this requires a recent version of + MIT Kerberos with a working krb5_cc_new_unique() + function or Heimdal Kerberos. + - Added Portuguese and updated Italian message catalogs. + + +CHANGES IN CUPS V1.3rc2 + + - Added more range checking to the pdftops filter. + - The scheduler would crash if a remote IPP queue was stopped + (STR #2460) + - The scheduler did not allow "DefaultAuthType None". + + +CHANGES IN CUPS V1.3rc1 + + - Updated the German localization (STR #2443) + - cupsAdminGetServerSettings() did not handle properly. + - When lprm and cancel are run with no job ID, they now will + cancel the first stopped job if no pending or processing + jobs are left in the queue. + - The scheduler now logs successful print jobs, filter + failures, and the job file types at the default log + level (STR #2458) + - The scheduler now logs the usernames it is using for + authorization at LogLevel debug instead of debug2 (STR #2448) + - Added Intellitech Intellibar and Zebra CPCL PPDs to the list + of installed PPDs. + - Added 6" and 8" wide label sizes for the Zebra ZPL Label + Printer driver (STR #2442) + - The cupsaddsmb program and web interface now support + exporting of 64-bit Windows drivers, when available + (STR #2439) + - Moving a job that was printing did not stop the job on the + original printer (STR #2262) + - The cups-lpd mini-daemon did not work on Mac OS X server. + - Added httpGetAuthString() and httpSetAuthString() APIs to get + and set the current (cached) authorization string to use for + HTTP requests. + - Updated the default cupsd.conf policy to list the + "administrative" operations separately from the "printer + control" operations so that it is easier to define a + group of users that are "printer operators". + - The web interface now pulls the default cupsd.conf file + from cupsd.conf.default in the CUPS config directory. + - Added a help file for using Kerberos with CUPS. + - The scheduler now strips the "@KDC" portion of Kerberos + usernames since those usernames typically do not appear in + the group membership lists used by CUPS. + - cupsMarkOptions() could (incorrectly) leave multiple option + choices marked. + - Backends could (incorrectly) run as root during discovery + (STR #2454) + - Avahi is now supported for DNS-SD (Bonjour) printer sharing + (STR #2455) + - The default cupsd.conf file had typos and old operation names + (STR #2450) + - The scheduler now erases authentication cache files using the + 7-pass US DoD algorithm. + - Delegated Kerberos credentials (proxy authentication) did not + work. + - The filter makefile did not optimize the libcupsimage.2.dylib + with a sectorder file. + - The IPP backend incorrectly wrote an empty printer message + when processing the "none" state reason. + - The USB backend could deadlock on Mac OS X while performing + a side-channel command. + - The scheduler did not prevent remote queues from being + shared/published. + - The scheduler did not remove the temporary request file on + authentication errors. + - ppdLocalizeIPPReason() did not handle "scheme:" schemes or + "file" URLs. + - ppdLocalizeIPPReason() was not exported on Mac OS X. + + +CHANGES IN CUPS V1.3b1 + + - Copyright updates - CUPS is now owned by Apple Inc. + - Documentation updates (STR #1775, STR #2027, STR #2130, + STR #2131, STR #2263, STR #2356, STR #2397) + - Added new cupsfilter utility (STR #1734) + - Added new job-printer-state-message and + job-printer-state-reasons attributes to jobs (STR #2418) + - Added LDAP+SSL support (STR #1967) + - CUPS now supports authentication via peer credentials + over domain sockets (STR #2242, STR #2277) + - The CUPS sample driver PPDs are now generated by the PPD + compiler and include all of the localized languages by + default (STR #2164) + - You can now specify "AuthType Default" in the cupsd.conf + file to use the default authentication defined by the + DefaultAuthType directive. + - The SNMP backend no longer adds a default Address line + when none is specified in the snmp.conf file; this allows + the backend to be easily disabled as needed (STR #2434) + - Added a new cupsctl command for doing basic changes to + the cupsd.conf file (STR #1777) + - Added a new ppdLocalizeIPPReason() function to get the + localized text/URI for a given IPP reason keyword for a + driver. + - Removed the deskjet2.ppd driver, as it only worked with + a very small subset of HP DeskJet printers and was + confusing to users. The rastertohp driver still + supports the deskjet2.ppd options for existing queues. + - The scheduler did not add a trailing banner page if a + client did not specify the last document in a job (STR + #1711) + - The scheduler did not report Bonjour shared printers as + remote printers (STR #2384) + - Added new -R and -W options to the cupstestppd program + for greater control over the testing of PPDs. + - Added a new cupsGetServerPPD() function for getting + an available PPD from the server (STR #2334) + - Added a new cupsDoIORequest() function for reading + and writing files via IPP requests (STR #2334) + - Added a new CUPS_GET_PPD operation for getting an + available PPD file on the server (STR #2334) + - CUPS_GET_PPDS now reports multiple ppd-product values + based on the PPD ModelName and Product strings (STR + #2334, STR #2383) + - CUPS_GET_PPDS now reports the PSVersion attributes + from a PPD file in the ppd-psversion attribute + (STR #2334) + - CUPS_GET_PPDS now reports the cupsModelNumber attribute + from a PPD file in the ppd-model-number attribute (STR + #2383) + - CUPS_GET_PPDS now reports a driver type string in the + ppd-type attribute based on the cupsFax and cupsFilter + attributes in a PPD file (STR #2383) + - Added a new printer attribute called "cups-version" + which reports the version of CUPS that is running + (STR #2240) + - backendRunLoop() now aborts immediately on SIGTERM + if no data has been written yet (STR #2103) + - Due to poor IPP support from the vendors, the SNMP + backend no longer tries IPP connections; instead, + it now uses a lookup file with fallback to port 9100 + (socket://address) and 515 (lpd://address) printing + (STR #2035, STR #2354) + - The scheduler now recreates the CUPS log directory as + needed (STR #2353) + - cupsLangDefault() now maps new-style Apple locale names + to the traditional ll_CC form (STR #2357) + - Add new cupsArrayNew2() API to support hashed lookups + of array elements (STR #2358) + - ppdConflicts() optimizations (STR #2358) + - The cupstestppd program now tests for existing filters, + icons, profiles, and dialog extensions (STR #2326) + - The web interface no longer lists new printers on the + main administration page. Instead, a new "List Available + Printers" button is provided that shows a separate page + with the list of printers. + - The web interface now supports setting the banner and + policy options on raw printers and classes (STR #2238) + - The socket backend now reads any pending back-channel + data before shutting down the socket (STR #2325) + - Added a new ErrorPolicy directive in the cupsd.conf + file (STR #1871) + - Printers that use JCL options are now exported to Samba + correctly (STR #1985) + - The IPP backend now relays printer-state-message values + from the server to the client (STR #2109) + - Added support for the PWG printer-alert and + printer-alert-description attributes (STR #2088) + - Added support for LPD "stream" mode (STR #2036) + - The scheduler now reports the PostScript product string + from PPD files in CUPS-Get-PPDs responses (STR #1900) + - Raw printing with queues pointing to the file pseudo- + device and multiple files and/or banners now works (STR + #1933) + - Added new public cupsAdminGetServerSettings() and + cupsAdminSetServerSettings() APIs. + - Added new "makebuttons" script in the "tools" directory + for creating web interface buttons (STR #2231) + - Added support for DNS-SD (aka "Bonjour") printer sharing + (STR #1171) + - Job operations (cancel, hold, release, etc.) from the + web interface now return back to the original page (STR + #2239) + - The classes or printers list is now shown after a + successful deletion from the web interface (STR #1999) + - The default configuration now allows browse packets from + any address (STR #2008) + - The web interface now provides an "allow printing from the + Internet" check box (STR #1897) + - The notify-events-default and + notify-lease-duration-default attributes can now be set + (STR #1671) + - Server-side default options are now sent to clients when + the "printer-defaults" attribute group is requested (STR + #1923) + - Added support for Linux "relro" linker option (STR #1614) + - CUPS now validates the number-up option value (STR #1329) + - The on-line help now provides better search capabilities + (STR #1701) + - The web interface "Add This Printer" button now allows you + to change the printer name, description, and location + (STR #1646) + - Added support for Mac OS X authorization services + (STR #2206) + - Added support for driver-specific pre-filters (STR #2108) + - Added a new side-channel API for drivers and backends + for basic device control and information queries (STR + #1898) + - The scheduler now uses poll(), epoll(), or /dev/kqueue + instead of select() when possible (STR #1261) + - Added new cupsArrayGetIndex() and cupsArrayGetInsert() + functions to get the current index and insertion + positions of an array. + - Added a new --with-max-copies configure option (STR + #2090) + - Added new cupsRemoveDest() and cupsSetDefaultDest() + functions. + - Added support for cupsPJLCharset attribute in PPD files + which specifies the character set that is used in PJL + strings (STR #1969) + - Moved the definition of the (private) _http_s structure + to http-private.h; code that directly accesses the + http_t members will no longer compile! + - Added support for setting the document-format-default + attribute on a per-printer basis. + - Added support for IntelliBar label printers. diff --git a/CHANGES-1.4.txt b/CHANGES-1.4.txt new file mode 100644 index 0000000..09326b2 --- /dev/null +++ b/CHANGES-1.4.txt @@ -0,0 +1,843 @@ +CHANGES-1.4.txt +--------------- + +CHANGES IN CUPS V1.4.8 + + - The scheduler would delete job data files when restarted (STR #3880) + - The network backends could crash if a printer returned a value of 0 + for the maximum capacity for a supply (STR #3875) + + +CHANGES IN CUPS V1.4.7 + + - Documentation changes (STR #3710, STR #3720, STR #3745, STR #3750, + STR #3757, STR #3758, STR #3782, STR #3826, STR #3829, STR #3837) + - Web interface fixes (STR #3412, STR #3345, STR #3455, STR #3707, + STR #3755, STR #3769, STR #3783) + - Configure script fixes (STR #3659, STR #3691) + - Compilation fixes (STR #3718, STR #3771, STR #3774) + - The imageto* filters could crash with bad GIF files (STR #3867) + - The scheduler might leave old job data files in the spool directory + (STR #3795) + - CUPS did not work with locales using the ASCII character set + (STR #3832) + - httpAddrString() did not return a URI-style IPv6 numeric address + (STR #3814) + - Fixed an issue when reading compressed CUPS raster streams (STR #3812) + - Fixed an issue with PostScript printer auto-configuration (STR #3443) + - Fixed some compatibility issues with the libusb-based USB backend + (STR #3799) + - The network backends no longer try to collect SNMP supply and status + information for raw queues (STR #3809) + - The DBUS notifier did not report job state changes (STR #3805) + - The scheduler did not always report that the "normal" print-quality + value was supported (STR #3803) + - The gziptoany filter did not report the correct error if it was unable + to write the uncompressed document to the next filter or backend in + the chain (STR #3797) + - The Epson and Oki 9-pin drivers had a bad resolution option + (STR #3798) + - The scheduler did not always register the correct default ICC profile + on Mac OS X. + - The scheduler did not use the job owner when authorizing access for + the CUPS-Get-Document operation, preventing non-admins from accessing + their own jobs. + - CUPS did not work with some printers that incorrectly implemented the + HTTP/1.1 standard (STR #3778, STR #3791) + - The scheduler did not retry fax jobs properly. + - The scheduler now recognizes an empty cupsCommands PPD keyword as + meaning that CUPS commands are not supported for a printer (STR #3773) + - Fixed a crash bug in the scheduler when the application/octet-stream + MIME type was not defined (STR #3690) + - Polled printers were advertised more slowly than necessary (STR #3574) + - cupsResolveConflicts() did not handle resolving multiple UIConstraints + issues (STR #3705) + - The SetEnv and PassEnv directives had no effect (STR #3664) + - The libusb-based USB backend printed slowly to the LaserJet 1300 and + other printers (STR #3405) + - "lp" and "lpr" failed to print with Kerberos enabled (STR #3768) + - The cupsctl program now displays an error if you try to directly set + the Port or Listen directives (STR #3749) + - PPD files with "*JobPatchFile: bla" no longer fail to load in relaxed + conformance mode (STR #3747) + - The scheduler generated a bad notify-text string for printer state + change notifications (STR #3739) + - The scheduler incorrectly updated printers.conf when it really needed + to update classes.conf or remote.cache (STR #3726) + - Hardwired remote printers with options did not work (STR #3717) + - Accessing the CUPS web interface using a CNAME-based hostname would + sometimes fail due to redirection to the actual hostname (STR #3701) + - Subscription events had a misspelled attribute (STR #3693) + - "make check" failed if LC_MESSAGES was set (STR #3765) + - Fixed the configure script to always look for the pkg-config script + (STR #3761) + - The scheduler now only looks up interface hostnames if HostNameLookups + are enabled (STR #3737) + - Fixed a compilation problem on DragonFly BSD (STR #3738) + - The default PageLogFormat value had the username and job ID swapped + from CUPS 1.3.x (STR #3727) + - The scheduler could crash if a browsed printer times out while a job + is printing (STR #3754) + - The scheduler incorrectly mapped custom page sizes to standard sizes + (STR #3764) + - cupsfilter and pstops did not map IPP attributes to PPD options due to + a change in cupsMarkOptions (STR #3756) + - The scheduler did not always show the most recent status message from + the print filters (STR #3731) + - The PostScript filter did not apply the mirror and number-up options + properly, leading to offset and clipped output (STR #3732) + - The network backends always reported "low toner" or "out of toner" + states, even for inkjet printers (STR #3733) + + +CHANGES IN CUPS V1.4.6 + + - Fixed a "make check" issue on Solaris (STR #3729) + - Regression: The pstops filter did not support landscape printing of + PostScript files (STR #3722) + - The scheduler killed retried (fax) jobs after restarting them + (STR #3697) + - The cupsAdminSetServerSettings() function disabled sharing when + debug logging was enabled (STR #3712) + + +CHANGES IN CUPS V1.4.5 + + - Documentation fixes (STR #3542, STR #3650) + - Localization fixes (STR #3635, STR #3636, STR #3647, STR #3666) + - Security: Fixed a memory corruption bug reported in CVE-2010-2941 + (STR #3648) + - The CUPS API incorrectly mapped the HTTP_UNAUTHORIZED status to the + IPP_NOT_AUTHORIZED status code, when IPP_NOT_AUTHENTICATED would be + the correct mapping (STR #3684) + - The scheduler would restart jobs while shutting down (STR #3679) + - Fixed a PPD loader bug that could cause a crash in cupsd (STR #3680) + - Improved the mapping of non-standard PPD and PWG names (STR #3671) + - The scheduler did not initialize Kerberos in all cases (STR #3662) + - cupsAdminSetServerSettings duplicated Listen and Order lines + (STR #3645) + - Added DeviceN colorspace support to the CUPS Raster format (STR #3419) + - ppdMarkDefaults() did not clear the marked field of the previous + choices (STR #3642) + - The serial backend would not allow a raw job to be canceled + (STR #3649) + - The socket backend could go into an infinite loop with certain + printers (STR #3622) + - Setting the PRINTER or LPDEST environment variables to "name/instance" + did not work (STR #3485) + - The scheduler did not handle the JobRetryLimit setting properly + (STR #3466) + - The lpstat command always showed a remote job ID of 0 for shared + printers (STR #3627) + - Increased the write timeout for the libusb-based USB backend to 5 + minutes (STR #3595) + - The libusb-base USB backend did not check whether the printer has a + serial number (STR #3590) + - The lpadmin command did not support setting of custom option values + (STR #3631) + - The lpadmin command did not support setting of the location or + description of a class (STR #3613) + - The cupsaddsmb command did not give up after too many failed attempts + (STR #3615) + - The CUPS library no longer uses certain problematic ctype macros that + change based on the locale's character set. + - PJL value substitution of more than 9 values was broken (STR #3621) + - Custom options with missing string values caused ppdEmit* to segfault + (STR #3620) + - Fixed an issue with the Italian version of the web interface + (STR #3624) + - Fixed the Solaris SMF configuration file for cups-lpd (STR #3611) + - The scheduler did not set the notify-subscribed-event attribute when + delivering printer-added or printer-modified events (STR #3608) + - The mailto notifier could get into an infinite loop (STR #3609) + - Date/time information was not shown in banner pages. + - Relational operators were broken in #if/#elif/#else/#endif expressions + for the PPD compiler. + - Moving a job via the web interface failed without asking for + authentication (STR #3559) + - The scheduler now clears the printer-state-reasons when the driver is + changed (STR #3570) + - The web interface did not allow a user to change the driver + (STR #3537, STR #3601) + - The scheduler was not setting the PATH_INFO environment variable when + needed (STR #3600) + - The scheduler incorrectly set the CUPSD_AUTH_TYPE environment + variable instead of AUTH_TYPE (STR #3599) + - Fixed a buffer overrun in the PPD compiler (STR #3594) + - Fixed some additional IPP job template attribute mapping issues in the + scheduler. + + +CHANGES IN CUPS V1.4.4 + + - Documentation updates (STR #3453, STR #3527, STR #3528, STR #3529) + - Security: The fix for CVE-2009-3553 was incomplete (STR #3490) + - Security: The texttops filter did not check the results of allocations + (STR #3516) + - Security: The web admin interface could disclose the contents of + memory (STR #3577) + - Security: CUPS could overwrite files as root in directories owned or + writable by non-root users (STR #3510) + - The cups-config utility did not return the correct linker options on + AIX (STR #3587) + - Fixed some IPP conformance issues with the scheduler's + ippget-event-life, operations-supported, output-bin, and sides + attributes (STR #3554) + - The OpenSSL interfaces have been made thread-safe and the GNU TLS + interface is explicitly forbidden when threading is enabled + (STR #3461) + - Fixed an IPP conformance issue with the scheduler's Send-Document + implementation (STR #3514) + - Added additional validation checks for the 1284 device ID (STR #3534) + - Fixed a problem with the RPM spec file (STR #3544) + - The lpstat command did not limit the job list to the specified + printers (STR #3541) + - The cupsfilter command did not set the RIP_MAX_CACHE environment + variable (STR #3531) + - Fixed support for media-col and page size variants (STR #3394) + - The PostScript filter did not support all media selection options for + the first page (STR #3525) + - The scheduler did not always remove job control files (STR #3425) + - The scheduler could crash on restart if classes were defined + (STR #3524) + - The scheduler no longer looks up network interface hostnames by + default on Mac OS X (STR #3523) + - ippWriteIO did not write collection (member) attributes properly in + all cases (STR #3521) + - The "cupsctl --remote-any" and corresponding web interface check box + (allow printing from the Internet) did not work reliably (STR #3520) + - The lpq and lpr commands would sometimes choose different default + printers (STR #3503) + - cupsDo*Request did not flush error text, leading to multiple issues + (STR #3325, STR #3519) + - cupsDoAuthentication did not cancel password authentication after 3 + failures (STR #3518) + - Fixed several LDAP browsing bugs (STR #3392) + - The Dymo driver did not support copies (STR #3457) + - The scheduler did not update the classes.conf file when deleting a + printer belonging to a class (STR #3505) + - The lppasswd command did not use localized password prompts + (STR #3492) + - The socket backend no longer waits for back-channel data on platforms + other than Mac OS X (STR #3495) + - The scheduler didn't send events when a printer started accepting or + rejecting jobs (STR #3480) + - The web interface now includes additional CSRF protection (STR #3498) + + +CHANGES IN CUPS V1.4.3 + + - SECURITY: The scheduler could try responding on a closed client + connection, leading to a crash (STR #3200) + - SECURITY: The lppasswd program allowed the localization files to be + overridden when running in setuid mode (STR #3482) + - Localization updates (STR #3352, STR #3409, STR #3422, STR #3452, + STR #3473, STR #3502) + - Documentation updates (STR #3451, STR #3504) + - The IPP backend now sets the printer-state-message to "Ready to + print." at the end of a successful job (STR #3460) + - The PPD compiler did not correctly add the manufacturer to the output + filename when using the "-m" option (STR #3469) + - The IPP backend did not handle authentication properly for the Get- + Printer-Attributes operation (STR 3458) + - Getting SNMP values larger than 127 bytes did not work. + - IPP conformance: Get-Jobs has a default value for requested-attributes + (STR #3383) + - cupsPrintFiles() did not report all errors (STR #3449) + - cupsAddDest() could read freed memory (STR #3448) + - The DBUS notifier did not build (STR #3447) + - The scheduler would crash when an active printer was deleted. + - The snmp backend did not work with some printers (STR #3413) + - The web interface did not show the conflicting values when setting + options (STR #3440) + - Setting options in the web interface did not always work (STR #3439) + - The scheduler did not use the Get-Job-Attributes policy for a printer + (STR #3431) + - The scheduler added two job-name attributes to each job object + (STR #3428) + - CSS files would not print (STR #3442) + - The scheduler did not clean out completed jobs when PreserveJobHistory + was turned off (STR #3425) + - The web interface did not show completed jobs for a printer + (STR #3436) + - Authenticated printing did not always work when printing directly to + a remote server (STR #3435) + - The USB backend did not work on Solaris (STR #3423) + - cupstestppd didn't catch problems with JobPatchFile definitions + (STR #3421) + - The socket backend could crash if a SNMP string had a negative length. + - Fixed some termination issues with the USB backend on Mac OS X. + - The side-channel APIs did not handle interrupts properly. + - The network backends incorrectly cleared the media-empty-warning + state. + - The web interface did not allow users to successfully add serial + printers (STR #3391) + - cupsTempFd() did not work in some situations (STR #3382) + - Some C API headers were missing C++ wrapper logic. + - The PPD compiler did not localize single-language PPD options properly + (STR #3386) + - Modifying a printer from the web interface sometimes caused the wrong + driver to be selected (STR #3418) + - The scheduler did not handle out-of-memory conditions properly when + loading a job (STR #3407) + - When adding printers from the web interface, the dynamic updates of + the device list made it hard to pick a device (STR #3406) + - Fixed a typo in the web interface admin page template (STR 3403) + - The web interface did not preserve the "printer is shared" state when + modifying a printer (STR #3390) + - The PPD compiler incorrectly inserted translations of empty strings + (STR #3411) + - The scheduler did not reset the SIGPIPE handler of child processes + (STR #3399) + - cupsGetNamedDest() incorrectly returned the default printer if the + named printer did not exist (STR #3397) + - Fixed a GNU TLS error handling bug (STR #3381) + + +CHANGES IN CUPS V1.4.2 + + - SECURITY: The CUPS web interface was vulnerable to several XSS and + HTTP header/body attacks via attribute injection (STR #3367, + STR #3401) + - Fixed localization errors (STR #3359, STR #3372, STR #3380, STR #3387) + - The documentation for classes.conf and printers.conf did not provide + the correct instructions for manual changes (STR #3351) + - The scheduler did not always rebuild printer cache files when the + driver was changed (STR #3356) + - The documentation makefile failed to install localizations when using + newer versions of Bash (STR #3360) + - The configure script did not use the --with-xinetd value for the + default LPD configuration path (STR #3347) + - The configure script incorrectly required glib for DBUS support + (STR #3346) + - The cupstestppd program incorrectly reported filters with bad + permisssions as missing (STR #3363) + - The cups.desktop file used the wrong locale names (STR #3358) + - cupsSideChannelRead() did not return an error for short reads. + - The installed PAM configuration file did not use the correct options + with the pam_unix2 module (STR #3313) + - The scheduler did not preserve default options that contained special + characters (STR #3340) + - The scheduler did not remove old pre-filters when updating a printer + driver (STR #3342) + - The HP/GL-2 filter did not check for early end-of-file (STR #3319) + - The USB backend did not compile on some platforms (STR #3332) + - cupsSideChannelSNMPWalk() could go into an infinite loop with broken + SNMP implementations. + + +CHANGES IN CUPS V1.4.1 + + - Documention fixes (STR #3296) + - SNMP supply levels and states were wrong for some printers. + - The IPP backend did not update the auth-info-required value. + - The libusb-based USB backend would hang at the end of the job + (STR #3315, STR #3318) + - DNS-SD registrations for raw queues had an empty "ty" key (STR #3299) + - The JPEG and BMP MIME type rules were broken (STR #3284) + - cupsGetNamedDest returned the default printer when the named + destination did not exist (STR #3285) + - The JobKillDelay was not triggered for canceled jobs (STR #3292) + - The PPD compiler could get in an infinite loop (STR #3293) + - The configure check for dns-sd.h was broken (STR #3297) + - The "Query Printer for Default Options" page did not go away if the + query job was held (STR #3302) + - Boolean options did not show up as selected in the web interface + (STR #3303) + - The scheduler did not cache or report driver information files + correctly, leading to a variety of issues (STR #3283, STR #3297, + STR #3305) + - cupsDoIORequest() did not abort on permanent errors (STR #3311) + - Modifying a class in the web interface did not work (STR #3312) + - BrowseLocalProtocols could be cleared when changing the sharing + setting (STR #3287) + - The scheduler could return an empty supported document format + (STR #3308) + - The PPD compiler generated invalid PPD files when the locale used + something other than "." for the decimal point (STR #3300) + - The IPP backend did not handle some non-comforming IPP printer + implementations (STR #3262) + - The scheduler leaked three file descriptors to each job filter + (STR #3263) + - The scheduler now uses a default CUPS-Get-Devices timeout of 15 + seconds (STR #3307) + + +CHANGES IN CUPS V1.4.0 + + - Localization updates (STR #3223, STR #3246, STR #3248, STR #3250) + - Documentation updates (STR #3225, STR #3230, STR #3242, STR #3260) + - The --with-pdftops configure option did not accept a full path to the + filter (STR #3278) + - The banner filter did not position the back side image correctly + (STR #3277) + - The dnssd backend could crash (STR #3272) + - The 1284 device ID sometimes contained trailing garbage (STR #3266) + - The USB backend returned different URIs for some printers than in + CUPS 1.3 (STR #3259) + - The scheduler did not do local job-hold-until processing for remote + queues (STR #3258) + - The scheduler did not try all possible SSL certificates on Mac OS X. + - The scheduler did not always remove a file descriptor when using the + kqueue interface (STR #3256) + - The scheduler did not protect against bad job control files in all + cases (STR #3253) + - The scheduler did not encode "+" in model names (STR #3254) + - The web interface didn't show the default options (STR #3244) + - The IPP and LPD backends needed print data before they would do an + SNMP query. + - Fixed a GNU TLS compatibility issue (STR #3231) + - Fixed a HTML error in the add and modify printer web interface + templates (STR #3229) + - The scheduler did not minimize the number of printer state events that + were generated by filter STATE: messages, which could lead to poor + performance. + - The USB backend on Mac OS X did not cleanly cancel a job. + - The network backends now set the connecting-to-device printer-state- + reasons value when looking up the address and copying the print data + for consistency. + - The scheduler now supports the com.apple.print.recoverable-warning + reason on all platforms. + + +CHANGES IN CUPS V1.4rc1 + + - The PPD compiler documentation was missing information on localization + (STR #3212) + - The IPP backend now reconnects after every request when talking to + printers that claim IPP support but only use HTTP/1.0. + - The PPD compiler crashed when both "Resolution" and "Group foo Option + Resolution" were specified in the .drv file. + - The PPD compiler's #if/#elif/#else/#endif did not work for undefined + variables (STR #3210) + - Static libraries could not be installed by a non-root user on systems + needing a ranlib program (STR #3209) + - The scheduler incorrectly always tried to copy Kerberos credentials + for print jobs. + - Updated the Spanish localization (STR #3204) + - The scheduler crashed when getting the default paper size from + libpaper (STR #3205, STR #3206) + - The PPD compiler now defines six variables: CUPS_VERSION, + CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH, + PLATFORM_NAME, and PLATFORM_ARCH (STR #3203) + - Fixed a whitespace skipping bug in cupsRasterInterpretPPD. + - The scheduler did not return HTTP 403 (Forbidden) for authenticated + users that were not authorized to do IPP operations (STR #3193) + - The scheduler did not report more than 8 Product strings from a PPD + file. Some PPD files have as many as 24. + - ppdOpen*() could crash if a keyword had no value string (something + that cupstestppd looks for...) + - cupsLangDefault() did not return the correct language on Mac OS X. + - The Mac OS X USB backend did not handle aborted or stalled pipe + conditions properly, which prevented drivers from ejecting partial + pages when a job was canceled or held. + + +CHANGES IN CUPS V1.4b3 + + - Documentation fixes (STR #3044, STR #3057, STR #3153, STR #3158, + STR #3173) + - Added complete localizations for German, Japanese, Polish, and + Russian and partial localizations for Chinese, Danish, Finnish, + French, Italian, Korean, Norwegian, Portuguese, and Swedish + (STR #3096, STR #3098, STR #3109, STR #3111, STR #3141) + - Updated the configure check for -fstack-protector (STR #3198) + - The network backends now correctly convert SNMP supply descriptions to + UTF-8 encoding as needed. + - The scheduler could crash when deleting an attribute (STR #3197) + - The cups-driverd program did not detect symlink loops (STR #3185) + - The EPSON 24-pin series driver should now feed the correct amount + (STR #2624) + - The scheduler now automatically logs the last N debug messages for + failed print jobs. + - You can now modify a raw print queue (STR #3133) + - Fixed a number of ppdi issues and added a unit test to validate that + ppdc + ppdi can generate and import the same data (STR #3152) + - Moving jobs in the web interface now shows an error if you only have + one printer or class added (STR #3094) + - Since classes have never truly supported the printer-error-policy + stuff added in CUPS 1.2, update the code to reflect the current + reality and support only the retry-current-job policy for now + (STR #3171) + - Revised the password callback support (STR #2953) + - ppdEmit*() did not choose between PageSize and PageRegion properly. + - Make some fairly substantial changes to the Kerberos support code so + that CUPS can work in multi-realm environments and does not require + delegatable credentials. Shared printing still requires delegation, + however "delegation by policy" can be enabled in the KDC to make this + all work. + - "AccessLogLevel actions" did not hide client-error-not-found errors. + - AP_FIRST_InputSlot did not work with number-up. + - cupsBackChannelRead() and cupsBackChannelWrite() could fail due to a + lack of kernel buffers. + - The IPP and LPD backends did not respond to side-channel requests + while copying print data to a temporary file. + - cupsWriteRequestData() flushed the output buffer unnecessarily, + causing reduced performance in some situations. + - If a CGI process died before sending its MIME headers, the request + would hang on the client. + - The printer/class/job search feature on the web interface did not + work (STR #3132) + - The scheduler did not write the printers out for classes. + - CUPS-Get-PPDs did not work properly when filtering by language, + product, or psversion (STR #3136) + - The scheduler now kills job filters when it takes more than 30 seconds + (configurable) to cancel or hold the job. + - The cupstestppd program did not validate the capitalization of + filenames in the PPD file. + - The cupstestppd program did not validate the PageSize and PageRegion + values. + - The cups-deviced helper program could miss reporting some backend + devices (STR #3108) + - The cupsSideChannelSNMP* functions did not work. + - The scheduler could consume 100% CPU when jobs were canceled. + - Clicking on "Select Another Make/Manufacturer" in the web interface + incorrectly added the printer (STR #3095) + - The scheduler no longer uses programs with insecure file + permissions. + - httpAssembleURI*() did not escape backslashes in hostnames. + - The dnssd backend did not unquote "full names" before creating the + device URI. + - The scheduler now supports JobRetryInterval values less than 10 + seconds. + - Updated the Spanish localization (STR #3090) + - The scheduler did not redo Bonjour/DNS-SD registrations when updating + them failed. + - The "authenticated" policy incorrectly required authentication for + status operations. + - ppdOpen*() incorrectly loaded PPDs with multiple JobPatchFile + keywords. + - The network backends no longer report the SNMP "offline" or + maintenance status bits since they are inconsistently implemented and + often unreliable. + - The scheduler no longer logs child processes killed via SIGKILL as + "crashed". + - The printer link shown on the "job moved" template was bad (STR #3085) + - Updated the HTML templates to use the final HTML 4 DOCTYPE (STR #3086) + - The scheduler did not track the "paused" reason properly if a + printer had other reasons associated with it. + - cupsSendRequest() did not clear old local certificate auth data. + - The PPD compiler did not search for localization files properly + (STR #3084) + - cupsGetNamedDest() did not use the fallback default like + cupsGetDests*() (STR #3082) + - The scheduler now provides a LogTimeFormat directive to enable + microseconds in the date and time that are logged. + - The scheduler now provides a MultipleOperationTimeout directive to + control the timeout for multi-file print jobs. + - The configure script incorrectly allowed Avahi to be used for DNS-SD + printer discovery (STR #3065) + - The web interface and scheduler did not support URIs up to 1024 bytes + in length (STR #3072) + - Fixed pdftops issues with page sizes (STR #3063) + - Fixed pdftops issues with Ghostscript (STR #3062) + - The scheduler incorrectly registered default profiles for PostScript + printers with no specified colorspace. + - The scheduler incorrectly created an empty org.cups.printers.plist + file on Mac OS X. + - cupsGetPPD3() did not look for local PPDs in the right directory. + - SNMP lookups via side-channel did not work for NULL-VALUE and + and OCTET-STRING OIDs containing nul characters. + - The libusb-based USB backend did not work. + - The scheduler did not set the printer-commands attribute correctly + for some PPDs. + - The ppdi utility did not work. + - The web interface no longer uses multi-part output with old or broken + web browsers (STR #3049) + - CUPS now conforms to the draft IPP/2.0 and IPP/2.1 specification. + - Added a new cupsGetConflicts() API to get a list of conflicting + options. + - The PPD compiler didn't localize options or choices that did not + have associated translation text (STR #3045) + - Updated the Spanish localization (STR #3043) + - Fixed build problems (STR #3040, STR #3047) + - cupsResolveConflicts() did not resolve using the default option + choice in some cases due to the mirror UIConstraints that are + present in most PPD files. + - The scheduler did not honor MIME type priorities. + - The commandtops filter incorrectly used the JCLBegin code to end + its jobs. + - The default BrowseLocalProtocols value was not set properly. + - Since the commandtops filter does not actually support ReportLevels + all on its own, don't list that printer command by default for PS + printers. + - The scheduler did not give filters a chance to log errors or update + printer attributes when a job was canceled. + - The scheduler did not clear the "connecting-to-device" reason keyword + when a job finished. + + +CHANGES IN CUPS V1.4b2 + + - Documentation updates (STR #2983, STR #2998, STR #3021) + - The cupstestppd utility now validates the FileVersion and + FormatVersion values in PPD files. + - The default cupsd.conf file did not reflect the + --with-local-protocols value set at compile-time (STR #3037) + - The cupsGetPPD* APIs now create symlinks to local PPD files + rather than copying them whenever possible. + - Various performance optimizations in the string pool, dests, and + options implementations. + - The cupsGetDests* APIs now return the marker and printer-commands + attributes. + - Side-channel SNMP lookups would not work when cupsSNMPSupplies + was set to False in the PPD file. + - Localized the device descriptions for the SCSI, serial, + and network backends (STR #3014) + - Added a Spanish localization (STR #3015) + - Added support for marker-low-levels and marker-high-levels + attributes. + - The scheduler could hang writing a long log line. + - The cupsGetDevices() function now has an "include_schemes" + parameter. + - The lpinfo command now supports --include-schemes and + --exclude-schemes options. + - The CUPS-Get-PPDs operation now supports the include-schemes + and exclude-schemes attributes. + - The CUPS-Get-Devices operation now supports the include-schemes + attribute. + - The print filters now support a replacement for the fitplot + option called "fit-to-page". + - The LPD backend no longer tries to collect page accounting + information since the LPD protocol does not allow us to + prevent race conditions. + - The scheduler did not save the last marker-change-time value. + - Fixed a problem with printing to some IPP printers, including + CUPS 1.1.x. + - Fixed a redirection problem with the printer web page (STR #3012) + - Fixed a PPD compiler problem with the loading of message + catalogs (STR #2990) + - Fixed a PPD compiler problem with the loading of .strings files + (STR #2989) + - The cupsfilter utility did not set the CONTENT_TYPE environment + variable when running filters. + - The scheduler now waits to allow system sleep until the jobs + have all stopped. + - The IPP, LPD, and socket backends used different "connecting" + progress messages. + + +CHANGES IN CUPS V1.4b1 + + - Documentation updates (STR #2567) + - The PPD compiler now allows local message catalogs to + override the standard CUPS translations (STR #2642) + - The ppdmerge command did not merge custom option strings + (STR #2863) + - The scheduler now supports the Hold-New-Jobs and + Release-Held-New-Jobs operations; these are exposed via the + cupsdisable and cupsenable commands (STR #2332) + - The lpstat command is now much faster when displaying the + status of a single printer (STR #2843) + - The scheduler now caches information from PPD files to provide + significantly faster startup time with large numbers of PPDs + (STR #1293) + - CUPS-Get-Driver now provides much better driver matching based + on the IEEE-1284 device ID and make/model strings (STR #2707) + - Now support the cupsSNMPSupplies keyword to control whether + the network backends query the SNMP Printer MIB for supply + levels. + - Now support and use a new banner file format for better text + support and easier customization (STR #2490) + - The scheduler now sets the PRINTER_INFO and PRINTER_LOCATION + environment variables from the corresponding IPP attributes. + - The ippRead*() and ippWrite*() functions no longer use a + stack-based buffer (STR #2388) + - The CUPS-Add-Modify-Printer operation now allows you to set + the printer-state-reasons attribute. + - The "set printer options" page now supports auto-configuration + of printer options (STR #1440) + - The web interface now provides an advanced server settings + form. + - The web interface's "modify printer" pages now make it + easier to change just one setting (STR #1919) + - The scheduler now supports a plist PrintcapFormat. + - The scheduler now supports multiple addresses in Allow and + Deny lines, just like Apache (STR #2947) + - Added CUPS_JOBTYPE environment variable for job filters so + they know whether they are printing a banner or document + file (STR #2799) + - Added support for printer filtering by the cupsfilter + command (STR #2562) + - Added a SSLOptions directive to allow Windows clients to + talk to CUPS in FIPS mode (STR #2827) + - Renamed the accept and reject commands to cupsaccept and + cupsreject; the old names are still available (STR #2936) + - The locale/translate utility needed an update to work with + Google (STR #2882) + - The lpstat command now supports a -H option to display the + default server (STR #2833) + - The scheduler now supports a FatalErrors directive to control + which errors should cause the scheduler to exit (STR #2536) + - The scheduler now uses the php-cgi program if it is available + (STR #2923) + - The scheduler now supports a DefaultPaperSize directive + (STR #2848) + - The scheduler now passes the job-originating-host-name + value to filters in the options argument (STR #2558) + - CUPS now supports job tickets in PDF files (STR #2903) + - Added a DBUS notifier (STR #2529) + - The LPD mini-daemon now passes the document name when queuing + print jobs (STR #2482) + - The IPP backend did not relay com.apple.print.recoverable-message + values. + - The scheduler now supports a job-media-progress attribute to + track the progress of individual pages. + - The sample HP driver now supports A5 (STR #2798) + - The CUPS web interface menu item now uses the xdg-open + command, when available (STR #2724) + - The cups-lpd program now supports the -h option (STR #2794) + - The scheduler now sets the PAM_TTY parameter and the + PAM_ESTABLISH_CRED credential flag (STR #2745) + - The scheduler now logs unsuccessful requests to the error_log + file as errors (STR #2616) + - Added support for a "retry-current-job" error policy that + retries the current job immediately when the backend encounters + an error (STR #2555) + - The scheduler now returns a "forbidden" error when a user + correctly authenticates but does not have permission to + continue further (STR #2101) + - The scheduler now loads both the server and CA certificates + (if present) from the ServerCertificate file (STR #2146) + - New RSS subscriptions now create their feed files immediately + (STR #2853) + - Added support for a device-location attribute which provides + the physical location of a printer device. + - Added a cupsBackendReport() API which handles quoting of the + device data by a backend. + - Added support for custom options in the web interface + (STR #1729) + - Added support for Mozilla LDAP, reconnection to LDAP servers, + and improved LDAP performance (STR #1962) + - Added Solaris SMF support (STR #1477) + - Added optional support for using TCP wrappers to limit access + to CUPS (STR #263) + - Added ppdPageSizeLimits API. + - Added support for new cupsMediaQualifier2, cupsMediaQualifier3, + cupsMinSize, and cupsMaxSize attributes. + - Added cupsResolveConflicts and ppdInstallableConflict APIs. + - Added support for new cupsUIConstraints and cupsUIResolver + attributes for better option conflict detection and + resolution. + - Increased the maximum size of 1284 device ID strings to + 256 bytes (STR #2877) + - Added an AccessLogLevel directive to cupsd.conf to control + what is logged to the access_log file. + - The default LogLevel is now "warn" instead of "info" to reduce + the amount of logging that is done to disk by default. + - The PPD compiler did not include OID query keywords in PPD + files (STR #2871) + - The cups-driverd helper program now directly supports driver + information files. + - The USB backend now uses libusb when available (STR #1575) + - Added ppdLocalizeAttr function to get the localized version + of an attribute. + - MIME types now support a priority() attribute (STR #2719) + - The standard MIME types are now installed in + DataDir/mime (STR #2719) + - The lpoptions command now describes custom options and + the necessary parameters (STR #2660) + - The ppdmerge program did not support Simplified Chinese + or Traditional Chinese language version strings (STR #2851) + - The PPD compiler now supports localizable attributes + (STR #2738) + - The ppdpo utility now includes cupsIPPReasons values in + the message catalogs it generates (STR #2754) + - The PPD compiler now supports conditional directives + (STR #2636) + - The ppdc utility now supports a "-t" option to test PPD + files (STR #2739) + - The ppdc utility now supports a "-m" option to use the + ModelName value as the output filename. + - The ppdc utility now supports a FileName directive to + set an alternate output filename (STR #2740) + - The side-channel API now supports SNMP queries for the + standard network backends. + - Added a PageLogFormat directive to the cupsd.conf file to + control the format of lines in the page_log file. + - Filters can now send PPD: messages to stderr to set PPD + keywords like DefaultPageSize while a job is printing. + - Added a mdns backend for discovery and printing to printers + that advertise themselves via DNS-SD (Bonjour) + - The ipp, lpd, and socket backends now support DNS-SD service + name resolution. + - The scheduler now uses a single shared file descriptor for + all DNS-SD registrations (STR #2674) + - The ipp, lpd, and socket backends now support SNMP-based + page accounting and supply level monitoring (STR #1655) + - Added support for cupsPJLDisplay attribute to control what + PJL commands are used to display the job information. + - Driver information files can now be installed in + /Library/Printers/PPDs.drv on Mac OS X. + - The CUPS image library now supports reading images larger + than 2GB. + - The scheduler now delays writing config and state files to + reduce disk activity (STR #2684) + - The CUPS-Get-Devices operation now supports the + exclude-schemes and timeout attributes to control which + backends are polled and for how long. + - The cups-deviced helper application now runs backends in + parallel to get the list of devices faster. + - Added --enable-pap configure option. + - The default cupsd.conf file now includes an "authenticated" + policy which requires authentication for remote print jobs. + - Added support for Czech and Hungarian in PPD files + (STR #2735, STR #2736) + - The PPD compiler tools now support Mac OS X .strings files + for localization (STR #2737) + - ppdOpen*() now default the colorspace member to PPD_CS_N + when no DefaultColorSpace attribute is present in the PPD + file. + - The build system has been updated to support separate + installation of data, program, header, and library files. + - All support libraries are now built as shared libraries + by default. + - The scheduler now manages ICC color profiles on Mac OS X. + - The network backends (ipp, lpd, socket) now support + SNMP-based supply and page count monitoring (STR #1655) + - The lppasswd program is no longer installed setuid to + root to make the default installation more secure. + - Added a new ppdLocalizeMarkerName() function to get + the localized version of a marker-names value. + - The scheduler now provides the printer-dns-sd-name + attribute for printers shared via DNS-SD/Bonjour. + - The pdftops filter now executes the Xpdf or poppler + pdftops utility to convert PDF files (STR #1471) + - Bonjour printer registrations now advertise as local or + global based on the current access policies for the + printer. + - cupsGetDests*() and cupsSetDests*() now track the last + used printer preference on Mac OS X. + - Added a new streaming request API (STR #2261) + - Added a new cupsGetNamedDest() function to the CUPS + library for faster printing with lp and lpr (STR #2638) + - The scheduler now sets the PAM RHOST value on systems + that support it (STR #2637) + - The scheduler now sandboxes child processes when + possible. + - The Cancel-Job operation now supports a purge-job + attriibute to purge a specified job. + - ppdEmit* and ppdCollect* now use the NonUIOrderDependency + attributes for custom option selections. + - The web interface now enables/disables the printer + sharing (formerly publishing) controls based on the + server-is-sharing-printers state (STR #2233) + - The scheduler now tracks printer sharing via the + server-is-sharing-printers attribute, and manages LPD + and SMB sharing as well (STR #2233) + - The web interface now allows you to go back to the make/ + manufacturer page if there is no matching printer driver + on the model page (STR #2436) + - The printer list now shows the default media, banner, and + duplex options as well as the color and duplex capabilities + of printers (STR #1175) + - The web interface look-n-feel has been updated (STR #2492) + - The scheduler now supports a CUPS-Get-Document operation + that returns the specified print job document (STR #118) + - The cupsfilter utility now supports a "-J jobid" option + to filter the document from the specified job. + - The scheduler (cupsd) now supports a new option (-t) to + do a syntax check of the cupsd.conf file (STR #2003) + - Added new cupsGetPPD3() API to allow applications to + cache PPDs safely (STR #1473) + - Added generic PostScript and PCL printer driver PPDs. diff --git a/CHANGES.txt b/CHANGES.txt new file mode 100644 index 0000000..633ac77 --- /dev/null +++ b/CHANGES.txt @@ -0,0 +1,282 @@ +CHANGES.txt - 2012-05-15 +------------------------ + +CHANGES IN CUPS V1.5.3 + + - httpReconnect() did not reset the read/write buffers (STR #4065) + - Compiling without threading support failed (STR #4060) + - Fixed compile problem with old versions of OpenSSL (STR #4036) + - The network backends did not check SNMP supply levels regularly + (STR #4040) + - The online help always included the "help on help" text (STR #4042) + - Fixed a SSL handshake issue on OS X (STR #4045) + - The scheduler could crash if a PPD file contained an invalid paper + size (STR #4049) + - The CUPS polling daemon did not reinitialize its connection to the + remote server on errors in all cases (STR #4031) + - PostScript auto-configuration was slow and unreliable with some + printers (STR #4028) + - Missing localizations caused empty output (STR #4033) + - The cups-driverd program could temporarily "forget" a PPD file if it + was updated in place. + - The dnssd backend now prefers IPPS over IPP. + - The USB backend now uses and requires LIBUSB 1.0 or later (STR #3477) + - The LIBUSB-based USB backend now supports the back-channel (STR #2890) + - Changed how timeouts are implemented in the LPD backend (STR #4013) + - Added more supported color names for SNMP supplies (STR #3981) + - The default InputSlot setting was never used (STR #3957) + - POSIX ACLs are now set properly on certificate files (STR #3970) + - Supplies with commas in their names were not reported correctly + (STR #4020) + - The cupsGetPPD3() function created a temporary file when one was not + needed (STR #4018) + - The scheduler now ensures that job notifications contain a value for + the notify-printer-uri attribute (STR #4014) + - The lp and lpr commands did not cancel jobs queued from stdin on an + error (STR #4015) + - Fixed the IPP backend's handling of HTTP/1.0 compatibility (STR #3988) + - The IPP backend did not always setup username/password authentication + for printers (STR #3985) + - The IPP backend no longer re-queues print jobs that are too large for + the printer/server (STR #3977) + - The RPM spec file did not work (STR #4021, STR #4057) + - Encryption did not work when the server name ended with "." + (STR #4011) + - The multi-purpose tray is now mapped to the IPP "by-pass-tray" + (STR #4009) + - The correct media size was not always passed to IPP printers + (STR #4001) + - Finishing options were not passed to IPP printers (STR #3995) + - Fixed iCloud-based Back to My Mac printing (STR #3996) + + +CHANGES IN CUPS V1.5.2 + + - Reposted what should have been CUPS 1.5.1. + + +CHANGES IN CUPS V1.5.1 + + - Documentation updates (STR #3885, STR #3886, STR #3946, STR #3969) + - Localization updates (STR #3840, STR #3989, STR #3997) + - Build fixes (STR #3956, STR #3999) + - The SNMP backend did not validate the device URIs reported by printers + (STR #4004) + - cupsBackendReport() did not handle newlines in 1284 Device IDs + (STR #4005) + - USB backend fixes for libusb (STR #3965, STR #3978) + - The DBUS notifier did not validate string parameters (STR #3984) + - Group quota ACLs did not work with Kerberos (STR #3972) + - The IPP backend did not retry when a printer responded with + client-error-not-possible (STR #3963) + - PostScript PPDs with filters used the wrong command filter (STR #3973) + - The scheduler incorrectly used free() on a POSIX ACL value, which + could cause a crash (STR #3970) + - PPD files using the MacStandard encoding did not work. + - The web interface did not work on some platforms (STR #3902) + - The lpstat command would crash when then "-u" option was used by a + non-administrator (STR #3953) + - Japanese supply level reporting did not always work. + - The DBUS notifier could crash (STR #3947) + - Relaxed some of the page size checks in cupstestppd. + - The ipptool program now reports attributes that are repeated within + the same attribute group. + - Updated the PWG raster support to match the current draft + specification. + - Fixed some IPP conformance issues in the scheduler. + - Added ipptool support for repeating requests. + - Added IPP/2.2 conformance tests and greatly improved the IPP/1.1, + IPP/2.0, and IPP/2.1 conformance testing. + - IPP messages containing mixed integer/rangeOfInteger values did not + work (STR #3942) + - The ipptool program now provides additional diagnostics for badly- + formatted responses (STR #3857) + - When possible, the IPP backend now stops sending job data early on a + cancel. + - cupsSendRequest and cupsWriteRequestData did not properly read all + HTTP headers, preventing authentication and encryption upgrades from + working in all cases. + - The client.conf Server directive is no longer supported on Mac OS X + 10.7 and later. + - The IPP backend sent the wrong margins in media-col. + - The scheduler did not save or restore large Kerberos credentials for + jobs. + - The dnssd backend did not properly browse for secure IPP printers. + - httpAssembleURI* did not properly escape all special characters in the + username/password field. + - The scheduler now logs config file errors to stderr (STR #3936) + - The configure script incorrectly used bundle-based localizations on + Linux (STR #3938) + - The cups-driverd helper program did not cache .drv files properly, + sometimes leading to a crash (STR #3921) + - CUPS did not build on stock Mac OS X installations. + - Encryption was broken with OpenSSL. + - ipptool's XML output used date/time values with timezone offsets, + which are not supported by Mac OS X's NSDate class. + - Several programs did not support the cupsFilter2 keyword in PPD files. + - The IPP backend incorrectly reported spool-area-full states. + - cupsMarkOptions() did not protect against a bad PPD that was missing + one or more standard Duplex options. + - The PostScript filter did not mirror N-up output properly. + - The ipptool program did not validate UTF-8 strings in XML output. + - Fixed supply level reporting for some printers. + - The scheduler no longer automatically logs debug messages for jobs + that were held or canceled. + - The cupsSendRequest function did not flush remaining response data + from a previous request, leading to apparent chunking issues. + - The scheduler did not report the correct version in the Server: header + (STR #3903) + - The scheduler did not support 1284 device IDs reported by driver + interface programs longer than 127 characters (STR #3871) + - The image filters did not support loading images larger than the + RIPCache setting (STR #3901) + - "PAGE: total NNN" messages did not get logged properly (STR #3887) + - Updated the PWG Raster support to conform to the current draft of the + PWG Raster Format specification. + - The PWG Raster filter did not always write the correct number of + padding lines on the bottom of the page (STR #3904) + - When reporting a denial-of-service attack from the domain socket, the + address reported does not always contain the correct path (STR #3888) + - Badly formed GIF files could cause the image filters to crash + (STR #3914) + - Jobs canceled at the printer were retried by the IPP backend. + - "cupsfilter -u" deleted the input file instead of the PPD file. + - The scheduler did not compute the cost of PPD filters defined using + the cupsFilter2 keyword properly. + - The scheduler did not correctly support the maxsize() attribute for + PPD filters. + + +CHANGES IN CUPS V1.5.0 + + - Documentation updates. + - Localization update (STR #3865) + - Needed to limit TLS to v1.0 on some versions of Mac OS X. + - The snmp backend did not work with some printers. + + +CHANGES IN CUPS V1.5rc1 + + - Compile fixes (STR #3849, STR #3850) + - The scheduler didn't check for empty values for several configuration + directives (STR #3861) + - ipptool didn't generate valid XML when a test was skipped. + - Added additional error checking to the 1284 device ID code (STR #3858) + - Fixed some compatibility issues migrating from the old usblp backend + to the libusb backend (STR #3860) + - Fixed the wake-from-sleep printing behavior on Mac OS X. + - The scheduler incorrectly allowed jobs to be held from a terminating + state. + - The cups-driverd program could crash when a PPD was renamed. + - The dnssd backend took too long to discover printers on large or busy + networks with the new default timeout used by lpinfo and the web + interface. This resulted in "lost" printers. + + +CHANGES IN CUPS V1.5b2 + + - Documentation updates. + - Localization updates (STR #3845) + - Compiler warning cleanup. + - Fixed PIE support for Linux (STR #3846) + - Made httpSetTimeout API public and use it in the IPP backend to avoid + timeout errors. + - The scheduler incorrectly set the "authenticated" printer-type bit for + remote queues using authentication. + + +CHANGES IN CUPS V1.5b1 + + - The CUPS library now supports per-connection HTTP timeouts and + callbacks. + - The CUPS library now supports (limited) SSL/TLS X.509 certificate + validation and revocation (STR #1616) + - Updated the PostScript filter to support IncludeFeature in more + circumstances (STR #3417) + - The schedule did not correctly parse some IPv6 addresses and masks in + the cupsd.conf file (STR #3533) + - Fixed a case-insensitive string comparison issue for locales that do + not treat "I" and "i" as equivalent (STR #3800) + - The scheduler reported an incorrect job-printer-uri value when sharing + was not enabled (STR #3639) + - The scheduler now allows the ServerAlias directive to contain multiple + hostnames separated by spaces or commas (STR #3813) + - The scheduler now sets the process group for child processes and + manages the group (STR #2829) + - Fixed some minor issues discovered by a Coverity scan (STR #3838) + - The scheduler now more carefully creates and removes configuration, + cache, and state files (STR #3715) + - The lpadmin command now allows default option values to be deleted + (STR #2959) + - The lpadmin command now allows the cupsIPPSupplies and + cupsSNMPSupplies keywords to be set in a PPD file (STR #3825) + - Moving a held job no longer releases it (STR #3839) + - Restored support for GNU TLS and OpenSSL with threading enabled + (STR #3605) + - Fixed a confusing error message from cups-polld (STR #3806) + - Increased the default RIPCache value to 128MB (STR #3535) + - MIME errors are now routed to the error_log file (STR #2410) + - Updated PDF filter to support new Ghostscript ps2write device + (STR #3766) + - Updated PDF filter to support new Poppler option to preserve page + sizes in PDF files when the user has not selected a particular media + size (STR #3689) + - Added new PWG Raster filter for IPP Everywhere printer support. + - Added job-uuid, printer-uuid, and subscription-uuid attributes. + - Added support for the cupsSingleFile PPD keyword. + - Dropped support for the printer-state-history attribute (STR #3654) + - Added support for a new cupsIPPSupplies keyword in PPD files to allow + drivers to disable IPP supply level reporting. + - Added support for a new cupsFilter2 keyword in PPD files to allow for + the propagation of the actual MIME media type produced by a filter. + - The scheduler did not always get the correct Kerberos username when + authenticating (STR #3670) + - Added new cupsRasterOpenIO function and CUPS_RASTER_WRITE_PWG to the + CUPS imaging library to support printing to IPP Everywhere raster + printers. + - The scheduler now provides default values for the pages-per-minute and + pages-per-minute-color attributes for PPD files that lack a + Throughput keyword. + - Email notifications did not work on Mac OS X. + - The cupstestppd program now shows an error for files missing a + CloseGroup keyword (STR #3668) + - Name resolution errors no longer cause queues to stop (STR #3719, + STR #3753) + - Added a new cups-exec helper program that applies security profiles + to filters, port monitors, backends, CGI programs, and mini-daemons. + - The web interface can now be disabled using the WebInterface directive + in cupsd.conf (STR #2625) + - The scheduler now provides privacy controls for jobs and subscriptions + (STR #2969) + - Added new cupsArrayNew3 API which offers memory management of array + elements. + - Added several new color spaces to the CUPS raster format (STR #3419) + - The Validate-Job operation now uses the same policy as Print-Job by + default. + - CUPS now uses iconv to implement all of its character encoding + support (STR #3097) + - The scheduler now implements the Cancel-Jobs, Cancel-My-Jobs, and + Close-Job operations along with the job-ids operation attribute from + PWG 5100.11. + - The main CUPS header () no longer includes the PPD header + (). + - The scheduler and CUPS API now support the print-quality job template + attribute. + - The scheduler no longer supports the old Mac OS X Server quota + plugin. + - The scheduler now allows writing to /Users/Shared from print filters + on Mac OS X. + - CUPS no longer supports the old ~/.cupsrc or ~/.lpoptions files from + CUPS 1.1.x. The ~/.cups/client.conf and ~/.cups/lpoptions files that + were introduced in CUPS 1.2 must now be used. + - The ipptest tool is now a first-class user program and has several + improvements along with new documentation (STR #3484) + - The cupstestppd tool now warns about non-unique filenames and + provides a way to ignore all filename warnings. + - Dropped support for the recoverable: and recovered: message prefixes. + - The scheduler now requires that filters and backends have group write + permissions disabled. + - The PPD compiler now checks for overlapping filenames when writing + PPD files. + - The HP-GL/2 filter is no longer included with CUPS (STR #3322) + - The SCSI backend is no longer included with CUPS (STR #3500) diff --git a/CREDITS.txt b/CREDITS.txt new file mode 100644 index 0000000..a241eef --- /dev/null +++ b/CREDITS.txt @@ -0,0 +1,49 @@ +CREDITS.txt - 2010-03-13 +------------------------ + +Few projects are completed by one person, and CUPS is no exception. We'd +like to thank the following individuals for their contributions: + + Nathaniel Barbour - Lots of testing and feedback. + N. Becker - setsid(). + Philippe Combes - French localization and buttons script. + Jean-Eric Cuendet - GhostScript filters for CUPS. + Van Dang - HTTP and IPP policeman. + L. Peter Deutsch - MD5 code. + Dr. ZP Han - setgid()/setuid(). + Guy Harris - *BSD shared libraries and lots of other + fixes. + Bjoern Jacke - I18N stuff. + Wang Jian - CUPS RPM corrections. + Roderick Johnstone - Beta tester of the millenium. + Till Kamppeter - Bug fixes, beta testing, evangelism. + I–aki Larra–aga - Basque localization. + Kenshi Muto - Japanese localization, patches, and + testing. + Tomohiro Kato - Japanese localization. + Kiko - Bug fixes. + Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester. + Marek Laane - Estonian translation. + Mark Lawrence - Microsoft interoperability testing. + Jeff Licquia - Bug fixes, beta testing, evangelism. + Jason McMullan - Original CUPS RPM distributions. + Wes Morgan - *BSD fixes. + Daniel Nylander - Swedish localization. + Niklas 'Nille' kerstršm - Swedish localization. + Giulio Orsero - Bug fixes and testing. + Michal Osowiecki - Polish localization. + Citra Paska - Indonesian localization. + Kurt Pfeifle - Bug fixes, beta testing, evangelism. + Vincenzo Reale - Italian localization. + Petter Reinholdtsen - HP-UX compiler stuff. + Juan Pablo Gonz‡lez Riopedre - Spanish localization. + Opher Shachar - Hebrew localization. + Stuart Stevens - HP JetDirect IPP information. + Andrea Suatoni - IRIX desktop integration and testing. + Teppo Turliainen - Finnish localization. + Tim Waugh - Lots of patches, testing, and Linux + integration. + Yugami - LDAP browsing support. + +If I've missed someone, please let me know by sending an email to +"msweet@apple.com". diff --git a/INSTALL.txt b/INSTALL.txt new file mode 100644 index 0000000..b0e19c9 --- /dev/null +++ b/INSTALL.txt @@ -0,0 +1,207 @@ +INSTALL - CUPS v1.5.3 - 2012-05-15 +---------------------------------- + +This file describes how to compile and install CUPS from source code. For more +information on CUPS see the file called "README.txt". A complete change log can +be found in "CHANGES.txt". + +**** IF YOU HAVE A NON-POSTSCRIPT PRINTER AND ARE NOT **** +**** RUNNING MAC OS X, YOU WILL ALSO NEED TO INSTALL GPL **** +**** GHOSTSCRIPT WITH THE "cups" DRIVER AFTER YOU INSTALL **** +**** CUPS. **** + + +BEFORE YOU BEGIN + + You'll need ANSI-compliant C and C++ compilers, plus a make program and + POSIX-compliant shell (/bin/sh). The GNU compiler tools and Bash work well + and we have tested the current CUPS code against several versions of GCC + with excellent results. + + The makefiles used by the project should work with most versions of make. + We've tested them with GNU make as well as the make programs shipped by + Compaq, HP, SGI, and Sun. BSD users should use GNU make (gmake) since BSD + make does not support "include". + + Besides these tools you'll want the JPEG, PNG, TIFF, and ZLIB libraries for + image support, the CDSA, GNU TLS, or OpenSSL libraries for encryption + support, the OpenLDAP and OpenSLP libraries for directory services support, + and either MIT (1.6.3 or higher) or Heimdal Kerberos for Kerberos support. + CUPS will compile and run without these, however you'll miss out on many of + the features provided by CUPS. + + Also, please note that CUPS does not include the Ghostscript-based + PostScript filter needed by non-PostScript printers. You *must* download + GPL Ghostscript separately from the CUPS web site if you want to print + PostScript files to non-PostScript printers on operating systems other than + Mac OS X. + + +COMPILING THE SUBVERSION REPOSITORY CODE + + The CUPS Subversion repository doesn't hold a copy of the pre-built + configure script. You'll need to run the GNU autoconf software (2.60 or + higher) to create it: + + autoconf + + +CONFIGURATION + + CUPS uses GNU autoconf, so you should find the usual "configure" script in + the main CUPS source directory. To configure CUPS for your system, type: + + ./configure + + The default installation will put the CUPS software in the "/etc", "/usr", + and "/var" directories on your system, which will overwrite any existing + printing commands on your system. Use the "--prefix" option to install the + CUPS software in another location: + + ./configure --prefix=/some/directory + + To see a complete list of configuration options, use the --help option: + + ./configure --help + + If any of the dependent libraries are not installed in a system default + location (typically "/usr/include" and "/usr/lib") you'll need to set the + CFLAGS, CPPFLAGS, CXXFLAGS, DSOFLAGS, and LDFLAGS environment variables + prior to running configure: + + setenv CFLAGS "-I/some/directory" + setenv CPPFLAGS "-I/some/directory" + setenv CXXFLAGS "-I/some/directory" + setenv DSOFLAGS "-L/some/directory" + setenv LDFLAGS "-L/some/directory" + ./configure ... + + or: + + CFLAGS="-I/some/directory" \ + CPPFLAGS="-I/some/directory" \ + CXXFLAGS="-I/some/directory" \ + DSOFLAGS="-L/some/directory" \ + LDFLAGS="-L/some/directory" \ + ./configure ... + + The "--enable-debug" option compiles CUPS with debugging information + enabled. Additional debug logging support can be enabled using the + "--enable-debug-printfs" option - these debug messages are enabled using the + CUPS_DEBUG_LOG environment variable at run-time. + + CUPS also includes an extensive set of unit tests that can be used to find + and diagnose a variety of common problems - use the "--enable-unit-tests" + configure option to run them at build time. + + Once you have configured things, just type: + + make ENTER + + or if you have FreeBSD, NetBSD, or OpenBSD type: + + gmake ENTER + + to build the software. + + +TESTING THE SOFTWARE + + Aside from the built-in unit tests, CUPS includes an automated test + framework for testing the entire printing system. To run the tests, just + type: + + make check ENTER + + or if you have FreeBSD, NetBSD, or OpenBSD type: + + gmake check ENTER + + The test framework runs a copy of the CUPS scheduler (cupsd) on port 8631 + in /tmp/cups-$USER and produces a nice HTML report of the results. + + +INSTALLING THE SOFTWARE + + Once you have built the software you need to install it. The "install" + target provides a quick way to install the software on your local system: + + make install ENTER + + or for FreeBSD, NetBSD, or OpenBSD: + + gmake install ENTER + + You can also build binary packages that can be installed on other machines + using the RPM spec file ("packaging/cups.spec") or EPM list file + ("packaging/cups.list"). The latter also supports building of binary RPMs, + so it may be more convenient to use. + + You can find the RPM software at: + + http://www.rpm.org/ + + The EPM software is available at: + + http://www.epmhome.org/ + + +CREATING BINARY DISTRIBUTIONS WITH EPM + + The top level makefile supports generation of many types of binary + distributions using EPM. To build a binary distribution type: + + make ENTER + + or + + gmake ENTER + + for FreeBSD, NetBSD, and OpenBSD. The target is one of the + following: + + epm - Builds a script + tarfile package + aix - Builds an AIX package + bsd - Builds a *BSD package + deb - Builds a Debian package + depot - Builds a HP-UX package (also swinstall) + inst - Builds an IRIX package (also tardist) + pkg - Builds a Solaris package + rpm - Builds a RPM package + setld - Build a Tru64 UNIX package + slackware - Build a Slackware package + swinstall - Build a HP-UX package (also depot) + tardist - Builds an IRIX package (also inst) + + +GETTING DEBUG LOGGING FROM CUPS + + When configured with the "--enable-debug-printfs" option, CUPS compiles in + additional debug logging support in the scheduler, CUPS API, and CUPS + Imaging API. The following environment variables are used to enable and + control debug logging: + + CUPS_DEBUG_FILTER Specifies a POSIX regular expression to control + which messages are logged. + CUPS_DEBUG_LEVEL Specifies a number from 0 to 9 to control the + verbosity of the logging. The default level is 1. + CUPS_DEBUG_LOG Specifies a log file to use. Specify the name "-" + to send the messages to stderr. Prefix a filename + with "+" to append to an existing file. + + +REPORTING PROBLEMS + + If you have problems, READ THE DOCUMENTATION FIRST! If the documentation + does not solve your problems, please post a message on the "cups.general" + forum at: + + http://www.cups.org/newsgroups.php + + Include your operating system and version, compiler and version, and any + errors or problems you've run into. The "config.log" file and the output + from the configure script and make should also be sent, as it often helps to + determine the cause of your problem. + + If you are running a version of Linux, be sure to provide the Linux + distribution you have, too. diff --git a/IPPTOOL.txt b/IPPTOOL.txt new file mode 100644 index 0000000..db47e27 --- /dev/null +++ b/IPPTOOL.txt @@ -0,0 +1,117 @@ +IPPTOOL.txt - 2011-09-20 +------------------------ + + +INTRODUCTION + + Starting with CUPS 1.5, CUPS now installs a user program called ipptool that + can be used to send arbitrary IPP requests to a CUPS server or IPP printer. + This tool started life as part of the CUPS automated test suite and has + grown to support complex conformance tests and a simple way to query + printer, job, and subscription attributes. + + +BASIC USAGE + + The ipptool command requires a printer URI and one or more "test" files that + describe the operations, attributes to display, and expected status and + attribute values. Several standard files are included with CUPS, for example + to show a list of pending print jobs on a CUPS printer called "myprinter" + you'd run: + + ipptool ipp://localhost/printers/myprinter get-jobs.test + + which would produce something like this: + + job-id job-state job-name job-originating-user-name + ------ ------------ ------------ ------------------------- + 72 pending testfile.pdf msweet + 73 pending testfile.ps msweet + 74 pending-held testfile.jpg msweet + 75 pending-held testfile.txt msweet + + To get output suitable for import into a spreadsheet, use the "-c" (CSV) + option: + + ipptool -c ipp://localhost/printers/myprinter get-jobs.test + + which will produce something like this: + + job-id,job-state,job-name,job-originating-user-name + 72,pending,testfile.pdf,msweet + 73,pending,testfile.ps,msweet + 74,pending-held,testfile.jpg,msweet + 75,pending-held,testfile.txt,msweet + + +CONFORMANCE TESTS + + We provide basic IPP conformance tests for IPP/1.1, IPP/2.0, IPP/2.1, and + IPP/2.2. For a given printer URI, the following commands perform tests at + each level: + + ipptool -tf filename [options] -I printer-uri ipp-1.1.test + ipptool -tf filename [options] -I -V 2.0 printer-uri ipp-2.0.test + ipptool -tf filename [options] -I -V 2.1 printer-uri ipp-2.1.test + ipptool -tf filename [options] -I -V 2.2 printer-uri ipp-2.2.test + + The filename must use a format supported by the printer; ipptool will guess + the MIME media type using the extension, otherwise application/octet stream + will be used. The following standard test files are included: + + color.jpg + document-a4.pdf + document-a4.ps + document-letter.pdf + document-letter.ps + gray.jpg + onepage-a4.pdf + onepage-a4.ps + onepage-letter.pdf + onepage-letter.ps + + Print-by-reference (URL) printing can be tested by defining the document-uri + variable to a URL, for example: + + ipptool -tf filename -d document-uri=url -I printer-uri ipp-1.1.test + + The standard test files are available on cups.org under the "test" + directory, for example: + + http://www.cups.org/test/document-a4.pdf + + The "document" test files contain 4 pages each. Doing the IPP conformance + tests will will produce up to 90 pages on various media, depending on the + printer. + + +READING THE DOCUMENTATION + + The command usage is described in the ipptest(1) man page, while the file + format is described in the ipptestfile(5) man page. + + +GETTING SUPPORT AND OTHER RESOURCES + + If you have problems, READ THE DOCUMENTATION FIRST! We also provide many + discussion forums which are available at: + + http://www.cups.org/newsgroups.php + + See the CUPS web site at "http://www.cups.org/" for other resources. + + +LEGAL STUFF + + CUPS is Copyright 2007-2011 by Apple Inc. CUPS and the CUPS logo are + trademarks of Apple Inc. + + The MD5 Digest code is Copyright 1999 Aladdin Enterprises. + + This software is based in part on the work of the Independent JPEG Group. + + CUPS is provided under the terms of version 2 of the GNU General Public + License and GNU Library General Public License. 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 "doc/help/license.html" or "LICENSE.txt" files for more information. diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..7d80518 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,971 @@ + CUPS License Agreement + + Copyright 2007-2011 by Apple Inc. + 1 Infinite Loop + Cupertino, CA 95014 USA + + WWW: http://www.cups.org/ + + +INTRODUCTION + +CUPS(tm) is provided under the GNU General Public License ("GPL") +and GNU Library General Public License ("LGPL"), Version 2, with +exceptions for Apple operating systems and the OpenSSL toolkit. A +copy of the exceptions and licenses follow this introduction. + +The GNU LGPL applies to the CUPS and CUPS Imaging libraries +located in the "cups" and "filter" subdirectories of the CUPS +source distribution and the files in the "test" subdirectory. The +GNU GPL applies to the remainder of the CUPS distribution. + +For those not familiar with the GNU GPL, the license basically +allows you to: + + - Use the CUPS software at no charge. + - Distribute verbatim copies of the software in source or + binary form. + - Sell verbatim copies of the software for a media fee, or + sell support for the software. + +What this license *does not* allow you to do is make changes or +add features to CUPS and then sell a binary distribution without +source code. You must provide source for any changes or additions +to the software, and all code must be provided under the GPL or +LGPL as appropriate. The only exceptions to this are the portions +of the CUPS software covered by the Apple operating system +license exceptions outlined later in this license agreement. + +The GNU LGPL relaxes the "link-to" restriction, allowing you to +develop applications that use the CUPS and CUPS Imaging libraries +under other licenses and/or conditions as appropriate for your +application, driver, or filter. + + +LICENSE EXCEPTIONS + +In addition, as the copyright holder of CUPS, Apple Inc. grants +the following special exceptions: + + 1. Apple Operating System Development License Exception; + + a. Software that is developed by any person or entity + for an Apple Operating System ("Apple OS-Developed + Software"), including but not limited to Apple and + third party printer drivers, filters, and backends + for an Apple Operating System, that is linked to the + CUPS imaging library or based on any sample filters + or backends provided with CUPS shall not be + considered to be a derivative work or collective work + based on the CUPS program and is exempt from the + mandatory source code release clauses of the GNU GPL. + You may therefore distribute linked combinations of + the CUPS imaging library with Apple OS-Developed + Software without releasing the source code of the + Apple OS-Developed Software. You may also use sample + filters and backends provided with CUPS to develop + Apple OS-Developed Software without releasing the + source code of the Apple OS-Developed Software. + + b. An Apple Operating System means any operating system + software developed and/or marketed by Apple Computer, + Inc., including but not limited to all existing + releases and versions of Apple's Darwin, Mac OS X, + and Mac OS X Server products and all follow-on + releases and future versions thereof. + + c. This exception is only available for Apple + OS-Developed Software and does not apply to software + that is distributed for use on other operating + systems. + + d. All CUPS software that falls under this license + exception have the following text at the top of each + source file: + + This file is subject to the Apple OS-Developed + Software exception. + + 2. OpenSSL Toolkit License Exception; + + a. Apple Inc. explicitly allows the compilation and + distribution of the CUPS software with the OpenSSL + Toolkit. + +No developer is required to provide these exceptions in a +derived work. + + +KERBEROS SUPPORT CODE + +The Kerberos support code ("KSC") is copyright 2006 by Jelmer +Vernooij and is provided 'as-is', without any express or implied +warranty. In no event will the author or Apple Inc. be held +liable for any damages arising from the use of the KSC. + +Sources files containing KSC have the following text at the top +of each source file: + + This file contains Kerberos support code, copyright 2006 by + Jelmer Vernooij. + +The KSC copyright and license apply only to Kerberos-related +feature code in CUPS. Such code is typically conditionally +compiled based on the present of the HAVE_GSSAPI preprocessor +definition. + +Permission is granted to anyone to use the KSC for any purpose, +including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + + 1. The origin of the KSC must not be misrepresented; you + must not claim that you wrote the original software. If + you use the KSC 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. + + +TRADEMARKS + +CUPS and the CUPS logo (the "CUPS Marks") are trademarks of Apple +Inc. Apple grants you a non-exclusive and non-transferable right +to use the CUPS Marks in any direct port or binary distribution +incorporating CUPS software and in any promotional material +therefor. You agree that your products will meet the highest +levels of quality and integrity for similar goods, not be unlawful, +and be developed, manufactured, and distributed in compliance with +this license. You will not interfere with Apple's rights in the +CUPS Marks, and all use of the CUPS Marks shall inure to the +benefit of Apple. This license does not apply to use of the CUPS +Marks in a derivative products, which requires prior written +permission from Apple Inc. + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/Makedefs.in b/Makedefs.in new file mode 100644 index 0000000..bfae9e8 --- /dev/null +++ b/Makedefs.in @@ -0,0 +1,308 @@ +# +# "$Id: Makedefs.in 10317 2012-03-01 00:05:55Z mike $" +# +# Common makefile definitions for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Programs... +# + +AR = @AR@ +AWK = @AWK@ +CC = @LIBTOOL@ @CC@ +CHMOD = @CHMOD@ +CXX = @LIBTOOL@ @CXX@ +DSO = @DSO@ +DSOXX = @DSOXX@ +HTMLDOC = @HTMLDOC@ +INSTALL = @INSTALL@ +LD = @LD@ +LIBTOOL = @LIBTOOL@ +LN = @LN@ -sf +MV = @MV@ +PHPCONFIG = @PHPCONFIG@ +RANLIB = @RANLIB@ +RM = @RM@ -f +RMDIR = @RMDIR@ +SED = @SED@ +SHELL = /bin/sh + +# +# Installation programs... +# + +INSTALL_BIN = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@ +INSTALL_CONFIG = $(INSTALL) -c -m @CUPS_CONFIG_FILE_PERM@ +INSTALL_COMPDATA = $(INSTALL) -c -m 444 @INSTALL_GZIP@ +INSTALL_DATA = $(INSTALL) -c -m 444 +INSTALL_DIR = $(INSTALL) -d +INSTALL_LIB = $(LIBTOOL) $(INSTALL) -c -m 555 @INSTALL_STRIP@ +INSTALL_MAN = $(INSTALL) -c -m 444 +INSTALL_SCRIPT = $(INSTALL) -c -m 555 + +# +# Default user, group, and system groups for the scheduler... +# + +CUPS_USER = @CUPS_USER@ +CUPS_GROUP = @CUPS_GROUP@ +CUPS_SYSTEM_GROUPS = @CUPS_SYSTEM_GROUPS@ +CUPS_PRIMARY_SYSTEM_GROUP = @CUPS_PRIMARY_SYSTEM_GROUP@ + +# +# Default permissions... +# + +CUPS_CONFIG_FILE_PERM = @CUPS_CONFIG_FILE_PERM@ +CUPS_LOG_FILE_PERM = @CUPS_LOG_FILE_PERM@ + +# +# Languages to install... +# + +LANGUAGES = @LANGUAGES@ +INSTALL_LANGUAGES = @INSTALL_LANGUAGES@ +UNINSTALL_LANGUAGES = @UNINSTALL_LANGUAGES@ + +# +# Libraries... +# + +LIBCUPS = @LIBCUPS@ +LIBCUPSCGI = @LIBCUPSCGI@ +LIBCUPSDRIVER = @LIBCUPSDRIVER@ +LIBCUPSIMAGE = @LIBCUPSIMAGE@ +LIBCUPSMIME = @LIBCUPSMIME@ +LIBCUPSPPDC = @LIBCUPSPPDC@ +LIBCUPSSTATIC = @LIBCUPSSTATIC@ +LIBJPEG = @LIBJPEG@ +LIBLDAP = @LIBLDAP@ +LIBMALLOC = @LIBMALLOC@ +LIBPAPER = @LIBPAPER@ +LIBPNG = @LIBPNG@ +LIBSLP = @LIBSLP@ +LIBGSSAPI = @LIBGSSAPI@ +LIBTIFF = @LIBTIFF@ +LIBUSB = @LIBUSB@ +LIBWRAP = @LIBWRAP@ +LIBZ = @LIBZ@ + +# +# Install static libraries? +# + +INSTALLSTATIC = @INSTALLSTATIC@ + +# +# IPP backend aliases... +# + +IPPALIASES = @IPPALIASES@ + +# +# Install XPC backends? +# + +INSTALLXPC = @INSTALLXPC@ + +# +# Program options... +# +# ARCHFLAGS Defines the default architecture build options. +# ARCH32FLAGS Defines the 32-bit architecture build options, used +# when compiling separate 32/64-bit libraries. +# ARCH64FLAGS Defines the 64-bit architecture build options, used +# when compiling separate 32/64-bit libraries. +# OPTIM Defines the common compiler optimization/debugging options +# for all architectures. +# OPTIONS Defines other compile-time options (currently only -DDEBUG +# for extra debug info) +# + +ALL_CFLAGS = -I.. -D_CUPS_SOURCE $(CFLAGS) $(SSLFLAGS) \ + @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS) +ALL_CXXFLAGS = -I.. -D_CUPS_SOURCE $(CXXFLAGS) $(SSLFLAGS) \ + @LARGEFILE@ @PTHREAD_FLAGS@ $(OPTIONS) +ARCHFLAGS = @ARCHFLAGS@ +ARFLAGS = @ARFLAGS@ +BACKLIBS = @BACKLIBS@ +BANNERTOPS = @BANNERTOPS@ +BUILDDIRS = @BUILDDIRS@ +CFLAGS = @CPPFLAGS@ @CFLAGS@ +COMMONLIBS = @LIBS@ +CXXFLAGS = @CPPFLAGS@ @CXXFLAGS@ +CXXLIBS = @CXXLIBS@ +DBUS_NOTIFIER = @DBUS_NOTIFIER@ +DBUS_NOTIFIERLIBS = @DBUS_NOTIFIERLIBS@ +DNSSD_BACKEND = @DNSSD_BACKEND@ +DSOFLAGS = -L../cups @DSOFLAGS@ +DSOLIBS = @DSOLIBS@ +DNSSDLIBS = @DNSSDLIBS@ +FONTS = @FONTS@ +IMGLIBS = @IMGLIBS@ +IMGFILTERS = @IMGFILTERS@ +LAUNCHDLIBS = @LAUNCHDLIBS@ +LDFLAGS = -L../cgi-bin -L../cups -L../filter -L../ppdc \ + -L../scheduler @LDARCHFLAGS@ \ + @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) +LEGACY_BACKENDS = @LEGACY_BACKENDS@ +LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(LIBZ) +LINKCUPSIMAGE = @LINKCUPSIMAGE@ +LIBS = $(LINKCUPS) $(SSLLIBS) $(COMMONLIBS) +OPTIM = @OPTIM@ +OPTIONS = +PAMLIBS = @PAMLIBS@ +PAP = @PAP@ +PDFTOPS = @PDFTOPS@ +PHPDIR = @PHPDIR@ +PHPOPTIONS = @PHPOPTIONS@ -I../.. `$(PHPCONFIG) --includes` +SERVERLIBS = @SERVERLIBS@ +SSLFLAGS = @SSLFLAGS@ +SSLLIBS = @SSLLIBS@ +TEXTTOPS = @TEXTTOPS@ +UNITTESTS = @UNITTESTS@ + + +# +# Separate 32/64-bit library support... +# + +ARCH32FLAGS = @ARCH32FLAGS@ +DSO32FLAGS = @DSO32FLAGS@ +INSTALL32 = @INSTALL32@ +LIB32CUPS = @LIB32CUPS@ +LIB32CUPSIMAGE = @LIB32CUPSIMAGE@ +LIB32DIR = $(BUILDROOT)@LIB32DIR@ +UNINSTALL32 = @UNINSTALL32@ + +ARCH64FLAGS = @ARCH64FLAGS@ +DSO64FLAGS = @DSO64FLAGS@ +INSTALL64 = @INSTALL64@ +LIB64CUPS = @LIB64CUPS@ +LIB64CUPSIMAGE = @LIB64CUPSIMAGE@ +LIB64DIR = $(BUILDROOT)@LIB64DIR@ +UNINSTALL64 = @UNINSTALL64@ + +# +# Directories... +# +# The first section uses the GNU names (which are *extremely* +# difficult to find in a makefile because they are lowercase...) +# We have to define these first because autoconf uses ${prefix} +# and ${exec_prefix} for most of the other directories... +# +# The "datarootdir" variable may not get defined if you are using +# a version of autoconf prior to 2.60. +# +# This is immediately followed by definition in ALL CAPS for the +# needed directories... +# + +bindir = @bindir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +exec_prefix = @exec_prefix@ +includedir = @includedir@ +infodir = @infodir@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +privateinclude = @privateinclude@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +top_srcdir = @top_srcdir@ + +BUILDROOT = $(DSTROOT) + +AMANDIR = $(BUILDROOT)@AMANDIR@ +BINDIR = $(BUILDROOT)@bindir@ +BUNDLEDIR = @CUPS_BUNDLEDIR@ +CACHEDIR = $(BUILDROOT)@CUPS_CACHEDIR@ +DATADIR = $(BUILDROOT)@CUPS_DATADIR@ +DOCDIR = $(BUILDROOT)@CUPS_DOCROOT@ +ICONDIR = @ICONDIR@ +INCLUDEDIR = $(BUILDROOT)$(includedir) +INITDIR = @INITDIR@ +INITDDIR = @INITDDIR@ +LIBDIR = $(BUILDROOT)$(libdir) +LOCALEDIR = $(BUILDROOT)@CUPS_LOCALEDIR@ +LOGDIR = $(BUILDROOT)@CUPS_LOGDIR@ +MANDIR = $(BUILDROOT)@mandir@ +MENUDIR = @MENUDIR@ +PMANDIR = $(BUILDROOT)@PMANDIR@ +PRIVATEINCLUDE = $(BUILDROOT)@PRIVATEINCLUDE@ +RCLEVELS = @RCLEVELS@ +RCSTART = @RCSTART@ +RCSTOP = @RCSTOP@ +REQUESTS = $(BUILDROOT)@CUPS_REQUESTS@ +SBINDIR = $(BUILDROOT)@sbindir@ +SERVERBIN = $(BUILDROOT)@CUPS_SERVERBIN@ +SERVERROOT = $(BUILDROOT)@CUPS_SERVERROOT@ +SMFMANIFESTDIR = @SMFMANIFESTDIR@ +STATEDIR = $(BUILDROOT)@CUPS_STATEDIR@ +XINETD = @XINETD@ + +MAN1EXT = @MAN1EXT@ +MAN5EXT = @MAN5EXT@ +MAN7EXT = @MAN7EXT@ +MAN8EXT = @MAN8EXT@ +MAN8DIR = @MAN8DIR@ + +PAMDIR = @PAMDIR@ +PAMFILE = @PAMFILE@ + +DEFAULT_LAUNCHD_CONF = @DEFAULT_LAUNCHD_CONF@ +DBUSDIR = @DBUSDIR@ + + +# +# Rules... +# + +.SUFFIXES: .1 .1.gz .1m .1m.gz .3 .3.gz .5 .5.gz .7 .7.gz .8 .8.gz .a .c .cxx .h .man .o .32.o .64.o .gz + +.c.o: + echo Compiling $<... + $(CC) $(ARCHFLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< + +.c.32.o: + echo Compiling 32-bit $<... + $(CC) $(ARCH32FLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< + +.c.64.o: + echo Compiling 64-bit $<... + $(CC) $(ARCH64FLAGS) $(OPTIM) $(ALL_CFLAGS) -c -o $@ $< + +.cxx.o: + echo Compiling $<... + $(CXX) $(ARCHFLAGS) $(OPTIM) $(ALL_CXXFLAGS) -c -o $@ $< + +.man.1 .man.1m .man.3 .man.5 .man.7 .man.8: + echo Linking $<... + $(RM) $@ + $(LN) $< $@ + +.man.1.gz .man.1m.gz .man.3.gz .man.5.gz .man.7.gz .man.8.gz .man.gz: + echo -n Compressing $<... + $(RM) $@ + gzip -v9 <$< >$@ + + +# +# End of "$Id: Makedefs.in 10317 2012-03-01 00:05:55Z mike $" +# diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..42c989b --- /dev/null +++ b/Makefile @@ -0,0 +1,330 @@ +# +# "$Id: Makefile 9933 2011-08-29 21:19:27Z mike $" +# +# Top-level Makefile for CUPS. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include Makedefs + + +# +# Directories to make... +# + +DIRS = cups test $(BUILDDIRS) $(PHPDIR) $(FONTS) + + +# +# Make all targets... +# + +all: + chmod +x cups-config + echo Using ARCHFLAGS="$(ARCHFLAGS)" + echo Using ALL_CFLAGS="$(ALL_CFLAGS)" + echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" + echo Using CC="$(CC)" + echo Using CXX="$(CC)" + echo Using DSOFLAGS="$(DSOFLAGS)" + echo Using LDFLAGS="$(LDFLAGS)" + echo Using LIBS="$(LIBS)" + for dir in $(DIRS); do\ + echo Making all in $$dir... ;\ + (cd $$dir ; $(MAKE) $(MFLAGS) all $(UNITTESTS)) || exit 1;\ + done + + +# +# Make library targets... +# + +libs: + echo Using ARCHFLAGS="$(ARCHFLAGS)" + echo Using ALL_CFLAGS="$(ALL_CFLAGS)" + echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" + echo Using CC="$(CC)" + echo Using CXX="$(CC)" + echo Using DSOFLAGS="$(DSOFLAGS)" + echo Using LDFLAGS="$(LDFLAGS)" + echo Using LIBS="$(LIBS)" + for dir in $(DIRS); do\ + echo Making libraries in $$dir... ;\ + (cd $$dir ; $(MAKE) $(MFLAGS) libs) || exit 1;\ + done + + +# +# Make unit test targets... +# + +unittests: + echo Using ARCHFLAGS="$(ARCHFLAGS)" + echo Using ALL_CFLAGS="$(ALL_CFLAGS)" + echo Using ALL_CXXFLAGS="$(ALL_CXXFLAGS)" + echo Using CC="$(CC)" + echo Using CXX="$(CC)" + echo Using DSOFLAGS="$(DSOFLAGS)" + echo Using LDFLAGS="$(LDFLAGS)" + echo Using LIBS="$(LIBS)" + for dir in $(DIRS); do\ + echo Making all in $$dir... ;\ + (cd $$dir ; $(MAKE) $(MFLAGS) unittests) || exit 1;\ + done + + +# +# Remove object and target files... +# + +clean: + for dir in $(DIRS); do\ + echo Cleaning in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\ + done + + +# +# Remove all non-distribution files... +# + +distclean: clean + $(RM) Makedefs config.h config.log config.status + $(RM) cups-config + $(RM) conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf + $(RM) doc/help/ref-cupsd-conf.html doc/help/standard.html doc/index.html + $(RM) man/client.conf.man + $(RM) man/cups-deviced.man man/cups-driverd.man + $(RM) man/cups-lpd.man man/cupsaddsmb.man man/cupsd.man + $(RM) man/cupsd.conf.man man/drv.man man/lpoptions.man + $(RM) packaging/cups.list + $(RM) packaging/cups-desc.plist packaging/cups-info.plist + $(RM) templates/header.tmpl + $(RM) desktop/cups.desktop + $(RM) scheduler/cups.sh scheduler/cups-lpd.xinetd + $(RM) scheduler/org.cups.cups-lpd.plist scheduler/cups.xml + -$(RM) doc/*/index.html + -$(RM) templates/*/header.tmpl + -$(RM) -r autom4te*.cache clang cups/charmaps cups/locale driver/test + + +# +# Make dependencies +# + +depend: + for dir in $(DIRS); do\ + echo Making dependencies in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\ + done + + +# +# Run the clang.llvm.org static code analysis tool on the C sources. +# (at least checker-231 is required for scan-build to work this way) +# + +.PHONY: clang clang-changes +clang: + $(RM) -r clang + scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) clean all +clang-changes: + scan-build -V -k -o `pwd`/clang $(MAKE) $(MFLAGS) all + + +# +# Generate a ctags file... +# + +ctags: + ctags -R . + + +# +# Install everything... +# + +install: install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + echo Making all in cups... + (cd cups; $(MAKE) $(MFLAGS) all) + for dir in $(DIRS); do\ + echo Installing data files in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) install-data) || exit 1;\ + done + echo Installing cups-config script... + $(INSTALL_DIR) -m 755 $(BINDIR) + $(INSTALL_SCRIPT) cups-config $(BINDIR)/cups-config + + +# +# Install header files... +# + +install-headers: + for dir in $(DIRS); do\ + echo Installing header files in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) install-headers) || exit 1;\ + done + if test "x$(privateinclude)" != x; then \ + echo Installing config.h into $(PRIVATEINCLUDE)...; \ + $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ + $(INSTALL_DATA) config.h $(PRIVATEINCLUDE)/config.h; \ + fi + + +# +# Install programs... +# + +install-exec: all + for dir in $(DIRS); do\ + echo Installing programs in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) install-exec) || exit 1;\ + done + + +# +# Install libraries... +# + +install-libs: libs + for dir in $(DIRS); do\ + echo Installing libraries in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) install-libs) || exit 1;\ + done + + +# +# Uninstall object and target files... +# + +uninstall: + for dir in $(DIRS); do\ + echo Uninstalling in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) uninstall) || exit 1;\ + done + echo Uninstalling cups-config script... + $(RM) $(BINDIR)/cups-config + -$(RMDIR) $(BINDIR) + + +# +# Run the test suite... +# + +test: all unittests + echo Running CUPS test suite... + cd test; ./run-stp-tests.sh + + +check: all unittests + echo Running CUPS test suite with defaults... + cd test; ./run-stp-tests.sh 1 0 n + + +# +# Create HTML documentation... +# + +apihelp: + for dir in cgi-bin cups filter driver ppdc scheduler; do\ + echo Generating API help in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) apihelp) || exit 1;\ + done + +framedhelp: + for dir in cgi-bin cups filter driver ppdc scheduler; do\ + echo Generating framed API help in $$dir... ;\ + (cd $$dir; $(MAKE) $(MFLAGS) framedhelp) || exit 1;\ + done + + +# +# Create an Xcode docset... +# + +docset: apihelp + echo Generating docset directory tree... + $(RM) -r org.cups.docset + mkdir -p org.cups.docset/Contents/Resources/Documentation/help + mkdir -p org.cups.docset/Contents/Resources/Documentation/images + cd man; $(MAKE) $(MFLAGS) html + cd doc; $(MAKE) $(MFLAGS) docset + cd cgi-bin; $(MAKE) $(MFLAGS) makedocset + cgi-bin/makedocset org.cups.docset \ + `svnversion . | sed -e '1,$$s/[a-zA-Z]//g'` \ + doc/help/api-*.tokens + $(RM) doc/help/api-*.tokens + echo Indexing docset... + /Developer/usr/bin/docsetutil index org.cups.docset + echo Generating docset archive and feed... + $(RM) org.cups.docset.atom + /Developer/usr/bin/docsetutil package --output org.cups.docset.xar \ + --atom org.cups.docset.atom \ + --download-url http://www.cups.org/org.cups.docset.xar \ + org.cups.docset + + +# +# Lines of code computation... +# + +sloc: + for dir in cups scheduler; do \ + (cd $$dir; $(MAKE) $(MFLAGS) sloc) || exit 1;\ + done + + +# +# Make software distributions using EPM (http://www.epmhome.org/)... +# + +EPMFLAGS = -v --output-dir dist $(EPMARCH) + +aix bsd deb depot inst pkg setld slackware swinstall tardist: + epm $(EPMFLAGS) -f $@ cups packaging/cups.list + +epm: + epm $(EPMFLAGS) -s packaging/installer.gif cups packaging/cups.list + +rpm: + epm $(EPMFLAGS) -f rpm -s packaging/installer.gif cups packaging/cups.list + +.PHONEY: dist +dist: all + $(RM) -r dist + $(MAKE) $(MFLAGS) epm + case `uname` in \ + *BSD*) $(MAKE) $(MFLAGS) bsd;; \ + Darwin*) $(MAKE) $(MFLAGS) osx;; \ + IRIX*) $(MAKE) $(MFLAGS) tardist;; \ + Linux*) test ! -x /usr/bin/rpm || $(MAKE) $(MFLAGS) rpm;; \ + SunOS*) $(MAKE) $(MFLAGS) pkg;; \ + esac + + +# +# Don't run top-level build targets in parallel... +# + +.NOTPARALLEL: + + +# +# End of "$Id: Makefile 9933 2011-08-29 21:19:27Z mike $". +# diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..3a2b2cd --- /dev/null +++ b/README.txt @@ -0,0 +1,164 @@ +README - CUPS v1.5.3 - 2012-05-15 +--------------------------------- + +Looking for compile instructions? Read the file "INSTALL.txt" +instead... + + +INTRODUCTION + + CUPS is a standards-based, open source printing system developed by Apple + Inc. for Mac OS® X and other UNIX®-like operating systems. CUPS uses the + Internet Printing Protocol ("IPP") and provides System V and Berkeley + command-line interfaces, a web interface, and a C API to manage printers and + print jobs. It supports printing to both local (parallel, serial, USB) and + networked printers, and printers can be shared from one computer to another, + even over the Internet! + + Internally, CUPS uses PostScript Printer Description ("PPD") files to + describe printer capabilities and features and a wide variety of generic + and device-specific programs to convert and print many types of files. + Sample drivers are included with CUPS to support many Dymo, EPSON, HP, + Intellitech, OKIDATA, and Zebra printers. Many more drivers are available + online and (in some cases) on the driver CD-ROM that came with your printer. + + CUPS is licensed under the GNU General Public License and GNU Library + General Public License versions 2. See the file "LICENSE.txt" for more + information. + + +READING THE DOCUMENTATION + + Once you have installed the software you can access the documentation (and + a bunch of other stuff) online at: + + http://localhost:631/ + + If you're having trouble getting that far, the documentation is located + under the "doc/help" directory. + + Please read the documentation before asking questions. + + +GETTING SUPPORT AND OTHER RESOURCES + + If you have problems, READ THE DOCUMENTATION FIRST! We also provide many + discussion forums which are available at: + + http://www.cups.org/newsgroups.php + + See the CUPS web site at "http://www.cups.org/" for other resources. + + +SETTING UP PRINTER QUEUES USING YOUR WEB BROWSER + + CUPS includes a web-based administration tool that allows you to manage + printers, classes, and jobs on your server. Open the following URL in your + browser to access the printer administration tools: + + http://localhost:631/admin/ + + DO NOT use the hostname for your machine - it will not work with the default + CUPS configuration. To enable administration access on other addresses, + check the "Allow Remote Administration" box and click on the "Change + Settings" button. + + You will be asked for the administration password (root or any other user in + the sys/system/root/admin/lpadmin group on your system) when performing any + administrative function. + + +SETTING UP PRINTER QUEUES FROM THE COMMAND-LINE + + CUPS works best with PPD (PostScript Printer Description) files. In a pinch + you can also use System V style printer interface scripts. + + CUPS includes several sample PPD files you can use: + + Driver PPD Name + ----------------------------- ------------------------------ + Dymo Label Printers drv:///sample.drv/dymo.ppd + Intellitech Intellibar drv:///sample.drv/intelbar.ppd + EPSON Stylus Color Series drv:///sample.drv/stcolor.ppd + EPSON Stylus Photo Series drv:///sample.drv/stphoto.ppd + EPSON Stylus New Color Series drv:///sample.drv/stcolor2.ppd + EPSON Stylus New Photo Series drv:///sample.drv/stphoto2.ppd + EPSON 9-pin Series drv:///sample.drv/epson9.ppd + EPSON 24-pin Series drv:///sample.drv/epson24.ppd + Generic PCL Laser Printer drv:///sample.drv/generpcl.ppd + Generic PostScript Printer drv:///sample.drv/generic.ppd + HP DeskJet Series drv:///sample.drv/deskjet.ppd + HP LaserJet Series drv:///sample.drv/laserjet.ppd + OKIDATA 9-Pin Series drv:///sample.drv/okidata9.ppd + OKIDATA 24-Pin Series drv:///sample.drv/okidat24.ppd + Zebra CPCL Label Printer drv:///sample.drv/zebracpl.ppd + Zebra EPL1 Label Printer drv:///sample.drv/zebraep1.ppd + Zebra EPL2 Label Printer drv:///sample.drv/zebraep2.ppd + Zebra ZPL Label Printer drv:///sample.drv/zebra.ppd + + Run the "lpinfo -m" command to list the available drivers: + + lpinfo -m + + Run the "lpinfo -v" command to list the available printers: + + lpinfo -v + + Then use the correct URI to add the printer using the "lpadmin" command: + + lpadmin -p printername -E -v device-uri -m ppd-name + + Network printers typically use "socket" or "lpd" URIs: + + lpadmin -p printername -E -v socket://11.22.33.44 -m ppd-name + lpadmin -p printername -E -v lpd://11.22.33.44/ -m ppd-name + + The sample drivers provide basic printing capabilities, but generally do not + exercise the full potential of the printers or CUPS. The CUPS web site + provides links and drivers: + + http://www.cups.org/ppd.php PPD files + http://www.cups.org/links.php Links to other drivers + + +PRINTING FILES + + CUPS provides both the System V "lp" and Berkeley "lpr" commands for + printing: + + lp filename + lpr filename + + Both the "lp" and "lpr" commands support printing options for the driver: + + lp -o media=A4 -o resolution=600dpi filename + lpr -o media=A4 -o resolution=600dpi filename + + CUPS recognizes many types of images files as well as PDF, PostScript, + HP-GL/2, and text files, so you can print those files directly rather than + through an application. + + If you have an application that generates output specifically for your + printer then you need to use the "-oraw" or "-l" options: + + lp -o raw filename + lpr -l filename + + This will prevent the filters from misinterpreting your print + file. + + +LEGAL STUFF + + CUPS is Copyright 2007-2012 by Apple Inc. CUPS and the CUPS logo are + trademarks of Apple Inc. + + The MD5 Digest code is Copyright 1999 Aladdin Enterprises. + + This software is based in part on the work of the Independent JPEG Group. + + CUPS is provided under the terms of version 2 of the GNU General Public + License and GNU Library General Public License. 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 "doc/help/license.html" or "LICENSE.txt" files for more information. diff --git a/backend/Dependencies b/backend/Dependencies new file mode 100644 index 0000000..afc21fa --- /dev/null +++ b/backend/Dependencies @@ -0,0 +1,107 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +ipp.o: backend-private.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +ipp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +ipp.o: ../cups/language.h ../cups/string-private.h ../config.h +ipp.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +ipp.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +ipp.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +ipp.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +ipp.o: ../cups/transcode.h ../cups/thread-private.h ../cups/snmp-private.h +ipp.o: ../cups/backend.h ../cups/sidechannel.h ../cups/array-private.h +ipp.o: ../cups/array.h +lpd.o: ../cups/http-private.h ../config.h ../cups/http.h +lpd.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +lpd.o: backend-private.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpd.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpd.o: ../cups/language.h ../cups/string-private.h ../cups/debug-private.h +lpd.o: ../cups/versioning.h ../cups/ppd-private.h ../cups/ppd.h +lpd.o: ../cups/cups.h ../cups/pwg-private.h ../cups/http-private.h +lpd.o: ../cups/language-private.h ../cups/transcode.h +lpd.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +lpd.o: ../cups/sidechannel.h +dnssd.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +dnssd.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +dnssd.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +dnssd.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +dnssd.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +dnssd.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +dnssd.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +dnssd.o: ../cups/language-private.h ../cups/transcode.h +dnssd.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +dnssd.o: ../cups/sidechannel.h ../cups/array.h +parallel.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +parallel.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +parallel.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +parallel.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +parallel.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +parallel.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +parallel.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +parallel.o: ../cups/language-private.h ../cups/transcode.h +parallel.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +parallel.o: ../cups/sidechannel.h +serial.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +serial.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +serial.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +serial.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +serial.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +serial.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +serial.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +serial.o: ../cups/language-private.h ../cups/transcode.h +serial.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +serial.o: ../cups/sidechannel.h +snmp.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +snmp.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +snmp.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +snmp.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +snmp.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +snmp.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +snmp.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +snmp.o: ../cups/language-private.h ../cups/transcode.h +snmp.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +snmp.o: ../cups/sidechannel.h ../cups/array.h ../cups/file.h +snmp.o: ../cups/http-private.h +socket.o: ../cups/http-private.h ../config.h ../cups/http.h +socket.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +socket.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +socket.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +socket.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +socket.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +socket.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +socket.o: ../cups/http-private.h ../cups/language-private.h +socket.o: ../cups/transcode.h ../cups/thread-private.h ../cups/snmp-private.h +socket.o: ../cups/backend.h ../cups/sidechannel.h +test1284.o: ../cups/string-private.h ../config.h ieee1284.c backend-private.h +test1284.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +test1284.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +test1284.o: ../cups/language.h ../cups/string-private.h +test1284.o: ../cups/debug-private.h ../cups/versioning.h +test1284.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +test1284.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +test1284.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +test1284.o: ../cups/language-private.h ../cups/transcode.h +test1284.o: ../cups/thread-private.h ../cups/snmp-private.h ../cups/backend.h +test1284.o: ../cups/sidechannel.h +testbackend.o: ../cups/string-private.h ../config.h ../cups/cups.h +testbackend.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testbackend.o: ../cups/http.h ../cups/array.h ../cups/language.h +testbackend.o: ../cups/sidechannel.h +testsupplies.o: backend-private.h ../cups/cups-private.h ../cups/cups.h +testsupplies.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testsupplies.o: ../cups/http.h ../cups/array.h ../cups/language.h +testsupplies.o: ../cups/string-private.h ../config.h ../cups/debug-private.h +testsupplies.o: ../cups/versioning.h ../cups/ppd-private.h ../cups/ppd.h +testsupplies.o: ../cups/cups.h ../cups/pwg-private.h ../cups/http-private.h +testsupplies.o: ../cups/http.h ../cups/md5-private.h ../cups/ipp-private.h +testsupplies.o: ../cups/ipp.h ../cups/language-private.h ../cups/transcode.h +testsupplies.o: ../cups/thread-private.h ../cups/snmp-private.h +testsupplies.o: ../cups/backend.h ../cups/sidechannel.h +usb.o: backend-private.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +usb.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +usb.o: ../cups/language.h ../cups/string-private.h ../config.h +usb.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +usb.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +usb.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +usb.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +usb.o: ../cups/transcode.h ../cups/thread-private.h ../cups/snmp-private.h +usb.o: ../cups/backend.h ../cups/sidechannel.h diff --git a/backend/Makefile b/backend/Makefile new file mode 100644 index 0000000..d9762ef --- /dev/null +++ b/backend/Makefile @@ -0,0 +1,296 @@ +# +# "$Id: Makefile 10425 2012-04-23 17:42:12Z mike $" +# +# Backend makefile for CUPS. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# This file is subject to the Apple OS-Developed Software exception. +# + +include ../Makedefs + +# +# Object files... +# + +RBACKENDS = ipp ipp14 lpd $(DNSSD_BACKEND) +UBACKENDS = $(LEGACY_BACKENDS) serial snmp socket usb +UNITTESTS = test1284 testbackend testsupplies +TARGETS = libbackend.a $(RBACKENDS) $(UBACKENDS) +LIBOBJS = ieee1284.o network.o runloop.o snmp-supplies.o +OBJS = ipp.o ipp14.o lpd.o dnssd.o parallel.o serial.o snmp.o \ + socket.o test1284.o testbackend.o testsupplies.o usb.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: $(UNITTESTS) + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) $(UNITTESTS) $(LIBOBJS) http mdns + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: $(INSTALLXPC) + echo Installing backends in $(SERVERBIN)/backend + $(INSTALL_DIR) -m 755 $(SERVERBIN)/backend + for file in $(RBACKENDS); do \ + $(LIBTOOL) $(INSTALL_BIN) -m 744 $$file $(SERVERBIN)/backend; \ + done + for file in $(UBACKENDS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/backend; \ + done + for file in $(IPPALIASES); do \ + $(RM) $(SERVERBIN)/backend/$$file; \ + $(LN) ipp $(SERVERBIN)/backend/$$file; \ + done + if test "x$(DNSSD_BACKEND)" != x -a `uname` = Darwin; then \ + $(RM) $(SERVERBIN)/backend/mdns; \ + $(LN) $(DNSSD_BACKEND) $(SERVERBIN)/backend/mdns; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + +install-xpc: ipp + echo Installing XPC backends in $(SERVERBIN)/apple + $(INSTALL_DIR) -m 755 $(SERVERBIN)/apple + $(LIBTOOL) $(INSTALL_BIN) ipp $(SERVERBIN)/apple + for file in $(IPPALIASES); do \ + $(RM) $(SERVERBIN)/apple/$$file; \ + $(LN) ipp $(SERVERBIN)/apple/$$file; \ + done + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all targets... +# + +uninstall: + $(RM) $(SERVERBIN)/apple/ipp + for file in $(IPPALIASES); do \ + $(RM) $(SERVERBIN)/apple/$$file; \ + done + -$(RMDIR) $(SERVERBIN)/apple + for file in $(RBACKENDS) $(UBACKENDS); do \ + $(RM) $(SERVERBIN)/backend/$$file; \ + done + for file in $(IPPALIASES); do \ + $(RM) $(SERVERBIN)/backend/$$file; \ + done + -$(RMDIR) $(SERVERBIN)/backend + -$(RMDIR) $(SERVERBIN) + + +# +# test1284 +# + +test1284: test1284.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o test1284 test1284.o ../cups/$(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# testbackend +# + +testbackend: testbackend.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o testbackend testbackend.o ../cups/$(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# testsupplies +# + +testsupplies: testsupplies.o libbackend.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o testsupplies testsupplies.o libbackend.a \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + + +# +# libbackend.a +# + +libbackend.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# dnssd +# + +dnssd: dnssd.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o dnssd dnssd.o libbackend.a $(LIBS) + $(RM) mdns + $(LN) dnssd mdns + + +# +# ipp +# + +ipp: ipp.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o ipp ipp.o libbackend.a $(LIBS) + $(RM) http + $(LN) ipp http + + +# +# ipp14 +# + +ipp14: ipp14.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o ipp14 ipp14.o libbackend.a $(LIBS) + #$(RM) http + #$(LN) ipp14 http + + +# +# lpd +# + +lpd: lpd.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o lpd lpd.o libbackend.a $(LIBS) + + +# +# parallel +# + +parallel: parallel.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o parallel parallel.o libbackend.a $(LIBS) + + +# +# serial +# + +serial: serial.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o serial serial.o libbackend.a $(BACKLIBS) $(LIBS) + + +# +# snmp +# + +snmp: snmp.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o snmp snmp.o libbackend.a $(LIBS) + + +# +# socket +# + +socket: socket.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(LDFLAGS) -o socket socket.o libbackend.a $(LIBS) + + +# +# usb +# + +usb: usb.o ../cups/$(LIBCUPS) libbackend.a + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o usb usb.o libbackend.a $(LIBUSB) \ + $(BACKLIBS) $(LIBS) +usb.o: usb.c usb-darwin.c usb-libusb.c usb-unix.c + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 10425 2012-04-23 17:42:12Z mike $". +# diff --git a/backend/backend-private.h b/backend/backend-private.h new file mode 100644 index 0000000..d3f8f51 --- /dev/null +++ b/backend/backend-private.h @@ -0,0 +1,324 @@ +/* + * "$Id: backend-private.h 10064 2011-10-07 21:41:07Z mike $" + * + * Backend support definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_BACKEND_PRIVATE_H_ +# define _CUPS_BACKEND_PRIVATE_H_ + + +/* + * Include necessary headers. + */ + +# include +# include +# include +# include +# include + +# ifdef __linux +# include +# include +# define IOCNR_GET_DEVICE_ID 1 +# define LPIOC_GET_DEVICE_ID(len) _IOC(_IOC_READ, 'P', IOCNR_GET_DEVICE_ID, len) +# include +# include +# include +# include +# endif /* __linux */ + +# ifdef __sun +# ifdef __sparc +# include +# else +# include +# include +# endif /* __sparc */ +# endif /* __sun */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * OID constants... + */ + +/* Host MIB */ +#define CUPS_OID_mib2 1,3,6,1,2,1 + +#define CUPS_OID_system CUPS_OID_mib2,1 +#define CUPS_OID_sysLocation CUPS_OID_system,6 + +#define CUPS_OID_host CUPS_OID_mib2,25 + +#define CUPS_OID_hrSystem CUPS_OID_host,1 + +#define CUPS_OID_hrStorage CUPS_OID_host,2 + +#define CUPS_OID_hrDevice CUPS_OID_host,3 +#define CUPS_OID_hrDeviceTable CUPS_OID_hrDevice,2 +#define CUPS_OID_hrDeviceEntry CUPS_OID_hrDeviceTable,1 +#define CUPS_OID_hrDeviceIndex CUPS_OID_hrDeviceEntry,1 +#define CUPS_OID_hrDeviceType CUPS_OID_hrDeviceEntry,2 +#define CUPS_OID_hrDeviceDescr CUPS_OID_hrDeviceEntry,3 + +#define CUPS_OID_hrPrinterTable CUPS_OID_hrDevice,5 +#define CUPS_OID_hrPrinterEntry CUPS_OID_hrPrinterTable,1 +#define CUPS_OID_hrPrinterStatus CUPS_OID_hrPrinterEntry,1 +#define CUPS_OID_hrPrinterDetectedErrorState CUPS_OID_hrPrinterEntry,2 + +/* Printer MIB */ +#define CUPS_OID_printmib CUPS_OID_mib2,43 + +#define CUPS_OID_prtGeneral CUPS_OID_printmib,5 +#define CUPS_OID_prtGeneralTable CUPS_OID_prtGeneral,1 +#define CUPS_OID_prtGeneralEntry CUPS_OID_prtGeneralTable,1 +#define CUPS_OID_prtGeneralCurrentLocalization CUPS_OID_prtGeneralEntry,2 +#define CUPS_OID_prtGeneralPrinterName CUPS_OID_prtGeneralEntry,16 +#define CUPS_OID_prtGeneralSerialNumber CUPS_OID_prtGeneralEntry,17 + +#define CUPS_OID_prtCover CUPS_OID_printmib,6 +#define CUPS_OID_prtCoverTable CUPS_OID_prtCover,1 +#define CUPS_OID_prtCoverEntry CUPS_OID_prtCoverTable,1 +#define CUPS_OID_prtCoverDescription CUPS_OID_prtCoverEntry,2 +#define CUPS_OID_prtCoverStatus CUPS_OID_prtCoverEntry,3 + +#define CUPS_OID_prtLocalization CUPS_OID_printmib,7 +#define CUPS_OID_prtLocalizationTable CUPS_OID_prtLocalization,1 +#define CUPS_OID_prtLocalizationEntry CUPS_OID_prtLocalizationTable,1 +#define CUPS_OID_prtLocalizationCharacterSet CUPS_OID_prtLocalizationEntry,4 + +#define CUPS_OID_prtMarker CUPS_OID_printmib,10 +#define CUPS_OID_prtMarkerTable CUPS_OID_prtMarker,2 +#define CUPS_OID_prtMarkerEntry CUPS_OID_prtMarkerTable,1 +#define CUPS_OID_prtMarkerLifeCount CUPS_OID_prtMarkerEntry,4 + +#define CUPS_OID_prtMarkerSupplies CUPS_OID_printmib,11 +#define CUPS_OID_prtMarkerSuppliesTable CUPS_OID_prtMarkerSupplies,1 +#define CUPS_OID_prtMarkerSuppliesEntry CUPS_OID_prtMarkerSuppliesTable,1 +#define CUPS_OID_prtMarkerSuppliesIndex CUPS_OID_prtMarkerSuppliesEntry,1 +#define CUPS_OID_prtMarkerSuppliesMarkerIndex CUPS_OID_prtMarkerSuppliesEntry,2 +#define CUPS_OID_prtMarkerSuppliesColorantIndex CUPS_OID_prtMarkerSuppliesEntry,3 +#define CUPS_OID_prtMarkerSuppliesClass CUPS_OID_prtMarkerSuppliesEntry,4 +#define CUPS_OID_prtMarkerSuppliesType CUPS_OID_prtMarkerSuppliesEntry,5 +#define CUPS_OID_prtMarkerSuppliesDescription CUPS_OID_prtMarkerSuppliesEntry,6 +#define CUPS_OID_prtMarkerSuppliesSupplyUnit CUPS_OID_prtMarkerSuppliesEntry,7 +#define CUPS_OID_prtMarkerSuppliesMaxCapacity CUPS_OID_prtMarkerSuppliesEntry,8 +#define CUPS_OID_prtMarkerSuppliesLevel CUPS_OID_prtMarkerSuppliesEntry,9 + +#define CUPS_OID_prtMarkerColorant CUPS_OID_printmib,12 +#define CUPS_OID_prtMarkerColorantTable CUPS_OID_prtMarkerColorant,1 +#define CUPS_OID_prtMarkerColorantEntry CUPS_OID_prtMarkerColorantTable,1 +#define CUPS_OID_prtMarkerColorantIndex CUPS_OID_prtMarkerColorantEntry,1 +#define CUPS_OID_prtMarkerColorantMarkerIndex CUPS_OID_prtMarkerColorantEntry,2 +#define CUPS_OID_prtMarkerColorantRole CUPS_OID_prtMarkerColorantEntry,3 +#define CUPS_OID_prtMarkerColorantValue CUPS_OID_prtMarkerColorantEntry,4 +#define CUPS_OID_prtMarkerColorantTonality CUPS_OID_prtMarkerColorantEntry,5 + +#define CUPS_OID_prtInterpreter CUPS_OID_printmib,15 +#define CUPS_OID_prtInterpreterTable CUPS_OID_prtInterpreter,1 +#define CUPS_OID_prtInterpreterEntry CUPS_OID_prtInterpreterTable,1 +#define CUPS_OID_prtInterpreterLangFamily CUPS_OID_prtInterpreterEntry,2 +#define CUPS_OID_prtInterpreterLangLevel CUPS_OID_prtInterpreterEntry,3 + +/* Printer Port Monitor MIB */ +#define CUPS_OID_enterprises 1,3,6,1,4,1 +#define CUPS_OID_pwg CUPS_OID_enterprises,2699,1 +#define CUPS_OID_ppmMIB CUPS_OID_pwg,2 +#define CUPS_OID_ppmMIBObjects CUPS_OID_ppmMIB,1 + +#define CUPS_OID_ppmGeneral CUPS_OID_ppmMIBObjects,1 + +#define CUPS_OID_ppmPrinter CUPS_OID_ppmMIBObjects,2 +#define CUPS_OID_ppmPrinterTable CUPS_OID_ppmPrinter,1 +#define CUPS_OID_ppmPrinterEntry CUPS_OID_ppmPrinterTable,1 +#define CUPS_OID_ppmPrinterIndex CUPS_OID_ppmPrinterEntry,1 +#define CUPS_OID_ppmPrinterName CUPS_OID_ppmPrinterEntry,2 +#define CUPS_OID_ppmPrinterIEEE1284DeviceId CUPS_OID_ppmPrinterEntry,3 +#define CUPS_OID_ppmPrinterNumberOfPorts CUPS_OID_ppmPrinterEntry,4 +#define CUPS_OID_ppmPrinterPreferredPortIndex CUPS_OID_ppmPrinterEntry,5 +#define CUPS_OID_ppmPrinterHrDeviceIndex CUPS_OID_ppmPrinterEntry,6 +#define CUPS_OID_ppmPrinterSnmpCommunityName CUPS_OID_ppmPrinterEntry,7 +#define CUPS_OID_ppmPrinterSnmpQueryEnabled CUPS_OID_ppmPrinterEntry,8 + +#define CUPS_OID_ppmPort CUPS_OID_ppmMIBObjects,3 +#define CUPS_OID_ppmPortTable CUPS_OID_ppmPort,1 +#define CUPS_OID_ppmPortEntry CUPS_OID_ppmPortTable,1 +#define CUPS_OID_ppmPortIndex CUPS_OID_ppmPortEntry,1 +#define CUPS_OID_ppmPortEnabled CUPS_OID_ppmPortEntry,2 +#define CUPS_OID_ppmPortName CUPS_OID_ppmPortEntry,3 +#define CUPS_OID_ppmPortServiceNameOrURI CUPS_OID_ppmPortEntry,4 +#define CUPS_OID_ppmPortProtocolType CUPS_OID_ppmPortEntry,5 +#define CUPS_OID_ppmPortProtocolTargetPort CUPS_OID_ppmPortEntry,6 +#define CUPS_OID_ppmPortProtocolAltSourceEnabled CUPS_OID_ppmPortEntry,7 +#define CUPS_OID_ppmPortPrtChannelIndex CUPS_OID_ppmPortEntry,8 +#define CUPS_OID_ppmPortLprByteCountEnabled CUPS_OID_ppmPortEntry,9 + + +/* + * State constants... + */ + +#define CUPS_TC_other 1 +#define CUPS_TC_unknown 2 + +#define CUPS_TC_idle 3 +#define CUPS_TC_printing 4 +#define CUPS_TC_warmup 5 + +/* These come from the hrPrinterDetectedErrorState OCTET-STRING */ +#define CUPS_TC_lowPaper 0x8000 +#define CUPS_TC_noPaper 0x4000 +#define CUPS_TC_lowToner 0x2000 +#define CUPS_TC_noToner 0x1000 +#define CUPS_TC_doorOpen 0x0800 +#define CUPS_TC_jammed 0x0400 +#define CUPS_TC_offline 0x0200 +#define CUPS_TC_serviceRequested 0x0100 +#define CUPS_TC_inputTrayMissing 0x0080 +#define CUPS_TC_outputTrayMissing 0x0040 +#define CUPS_TC_markerSupplyMissing 0x0020 +#define CUPS_TC_outputNearFull 0x0010 +#define CUPS_TC_outputFull 0x0008 +#define CUPS_TC_inputTrayEmpty 0x0004 +#define CUPS_TC_overduePreventMaint 0x0002 + +#define CUPS_TC_prtCoverStatus_coverOpen 3 +#define CUPS_TC_prtCoverStatus_coverClosed 4 +#define CUPS_TC_prtCoverStatus_interlockOpen 5 +#define CUPS_TC_prtCoverStatus_interlockClosed 6 + +#define CUPS_TC_langPCL 3 +#define CUPS_TC_langHPGL 4 +#define CUPS_TC_langPJL 5 +#define CUPS_TC_langPS 6 +#define CUPS_TC_langEscapeP 9 +#define CUPS_TC_langCCITT 26 +#define CUPS_TC_langLIPS 39 +#define CUPS_TC_langTIFF 40 +#define CUPS_TC_langPCLXL 47 +#define CUPS_TC_langPDF 54 +#define CUPS_TC_langJPEG 61 + +#define CUPS_TC_supplyThatIsConsumed 3 +#define CUPS_TC_receptacleThatIsFilled 4 + +#define CUPS_TC_process 3 +#define CUPS_TC_spot 4 + +#define CUPS_TC_toner 3 +#define CUPS_TC_wasteToner 4 +#define CUPS_TC_ink 5 +#define CUPS_TC_inkCartridge 6 +#define CUPS_TC_inkRibbon 7 +#define CUPS_TC_wasteInk 8 +#define CUPS_TC_opc 9 +#define CUPS_TC_developer 10 +#define CUPS_TC_fuserOil 11 +#define CUPS_TC_solidWax 12 +#define CUPS_TC_ribbonWax 13 +#define CUPS_TC_wasteWax 14 +#define CUPS_TC_fuser 15 +#define CUPS_TC_coronaWire 16 +#define CUPS_TC_fuserOilWick 17 +#define CUPS_TC_cleanerUnit 18 +#define CUPS_TC_fuserCleaningPad 19 +#define CUPS_TC_transferUnit 20 +#define CUPS_TC_tonerCartridge 21 +#define CUPS_TC_fuserOiler 22 +#define CUPS_TC_water 23 +#define CUPS_TC_wasteWater 24 +#define CUPS_TC_glueWaterAdditive 25 +#define CUPS_TC_wastePaper 26 +#define CUPS_TC_bindingSupply 27 +#define CUPS_TC_bandingSupply 28 +#define CUPS_TC_stitchingWire 29 +#define CUPS_TC_shrinkWrap 30 +#define CUPS_TC_paperWrap 31 +#define CUPS_TC_staples 32 +#define CUPS_TC_inserts 33 +#define CUPS_TC_covers 34 + +/* These come from RFC 3808 to define character sets we support */ +/* Also see http://www.iana.org/assignments/character-sets */ +#define CUPS_TC_csASCII 3 +#define CUPS_TC_csISOLatin1 4 +#define CUPS_TC_csShiftJIS 17 +#define CUPS_TC_csUTF8 106 +#define CUPS_TC_csUnicode 1000 /* UCS2 BE */ +#define CUPS_TC_csUCS4 1001 /* UCS4 BE */ +#define CUPS_TC_csUnicodeASCII 1002 +#define CUPS_TC_csUnicodeLatin1 1003 +#define CUPS_TC_csUTF16BE 1013 +#define CUPS_TC_csUTF16LE 1014 +#define CUPS_TC_csUTF32 1017 +#define CUPS_TC_csUTF32BE 1018 +#define CUPS_TC_csUTF32LE 1019 +#define CUPS_TC_csWindows31J 2024 + + +/* + * Types... + */ + +typedef int (*_cups_sccb_t)(int print_fd, int device_fd, int snmp_fd, + http_addr_t *addr, int use_bc); + + +/* + * Prototypes... + */ + +extern void backendCheckSideChannel(int snmp_fd, http_addr_t *addr); +extern int backendDrainOutput(int print_fd, int device_fd); +extern int backendGetDeviceID(int fd, char *device_id, + int device_id_size, + char *make_model, + int make_model_size, + const char *scheme, char *uri, + int uri_size); +extern int backendGetMakeModel(const char *device_id, + char *make_model, + int make_model_size); +extern int backendNetworkSideCB(int print_fd, int device_fd, + int snmp_fd, http_addr_t *addr, + int use_bc); +extern ssize_t backendRunLoop(int print_fd, int device_fd, int snmp_fd, + http_addr_t *addr, int use_bc, + int update_state, _cups_sccb_t side_cb); +extern int backendSNMPSupplies(int snmp_fd, http_addr_t *addr, + int *page_count, + int *printer_state); +extern int backendWaitLoop(int snmp_fd, http_addr_t *addr, + int use_bc, _cups_sccb_t side_cb); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_BACKEND_PRIVATE_H_ */ + + +/* + * End of "$Id: backend-private.h 10064 2011-10-07 21:41:07Z mike $". + */ diff --git a/backend/dnssd.c b/backend/dnssd.c new file mode 100644 index 0000000..3598601 --- /dev/null +++ b/backend/dnssd.c @@ -0,0 +1,1394 @@ +/* + * "$Id: dnssd.c 10379 2012-03-23 22:16:22Z mike $" + * + * DNS-SD discovery backend for CUPS. + * + * Copyright 2008-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * next_txt_record() - Get next TXT record from a cups_txt_records_t. + * parse_txt_record_pair() - Read key/value pair in cups_txt_records_t. + * main() - Browse for printers. + * browse_callback() - Browse devices. + * browse_local_callback() - Browse local devices. + * compare_devices() - Compare two devices. + * exec_backend() - Execute the backend that corresponds to the + * resolved service name. + * device_type() - Get DNS-SD type enumeration from string. + * get_device() - Create or update a device. + * query_callback() - Process query data. + * avahi_client_callback() - Avahi client callback function. + * avahi_query_callback() - Avahi query callback function. + * avahi_browse_callback() - Avahi browse callback function. + * find_device() - Find a device from its name and domain. + * sigterm_handler() - Handle termination signals... + * unquote() - Unquote a name string. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include +#ifdef HAVE_DNSSD +# include +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +# include +# include +# include +# include +# include +# include +#define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX +#endif /* HAVE_AVAHI */ + + +/* + * Device structure... + */ + +typedef enum +{ + CUPS_DEVICE_PRINTER = 0, /* lpd://... */ + CUPS_DEVICE_IPPS, /* ipps://... */ + CUPS_DEVICE_IPP, /* ipp://... */ + CUPS_DEVICE_FAX_IPP, /* ipp://... */ + CUPS_DEVICE_PDL_DATASTREAM, /* socket://... */ + CUPS_DEVICE_RIOUSBPRINT /* riousbprint://... */ +} cups_devtype_t; + + +typedef struct +{ +#ifdef HAVE_DNSSD + DNSServiceRef ref; /* Service reference for resolve */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + int resolved; /* Did we resolve the device? */ +#endif /* HAVE_AVAHI */ + char *name, /* Service name */ + *domain, /* Domain name */ + *fullName, /* Full name */ + *make_and_model, /* Make and model from TXT record */ + *device_id; /* 1284 device ID from TXT record */ + cups_devtype_t type; /* Device registration type */ + int priority, /* Priority associated with type */ + cups_shared, /* CUPS shared printer? */ + sent; /* Did we list the device? */ +} cups_device_t; + +typedef struct +{ + char key[256]; + char value[256]; + +#ifdef HAVE_DNSSD + const uint8_t *data; + const uint8_t *datanext; + const uint8_t *dataend; +#else /* HAVE_AVAHI */ + AvahiStringList *txt; +#endif /* HAVE_DNSSD */ +} cups_txt_records_t; + + +/* + * Local globals... + */ + +static int job_canceled = 0; + /* Set to 1 on SIGTERM */ + + +/* + * Local functions... + */ + +#ifdef HAVE_DNSSD +static void browse_callback(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char *serviceName, + const char *regtype, + const char *replyDomain, void *context) + __attribute__((nonnull(1,5,6,7,8))); +static void browse_local_callback(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char *serviceName, + const char *regtype, + const char *replyDomain, + void *context) + __attribute__((nonnull(1,5,6,7,8))); +static void query_callback(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char *fullName, uint16_t rrtype, + uint16_t rrclass, uint16_t rdlen, + const void *rdata, uint32_t ttl, + void *context) + __attribute__((nonnull(1,5,9,11))); +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +static void avahi_client_callback (AvahiClient *client, + AvahiClientState state, + void *context); +static void avahi_browse_callback (AvahiServiceBrowser *browser, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiBrowserEvent event, + const char *serviceName, + const char *regtype, + const char *replyDomain, + AvahiLookupResultFlags flags, + void *context); +#endif /* HAVE_AVAHI */ + +static cups_device_t * find_device (cups_array_t *devices, + cups_txt_records_t *txt, + cups_device_t *dkey); +static int compare_devices(cups_device_t *a, cups_device_t *b); +static void exec_backend(char **argv); +static cups_device_t *get_device(cups_array_t *devices, + const char *serviceName, + const char *regtype, + const char *replyDomain); +static void sigterm_handler(int sig); +static void unquote(char *dst, const char *src, size_t dstsize) + __attribute__((nonnull(1,2))); + +#ifdef HAVE_AVAHI +static AvahiSimplePoll *simple_poll = NULL; +static int avahi_got_callback; +#endif /* HAVE_AVAHI */ + + +/* + * 'next_txt_record()' - Get next TXT record from a cups_txt_records_t. + */ + +static cups_txt_records_t * +next_txt_record (cups_txt_records_t *txt) +{ +#ifdef HAVE_DNSSD + txt->data = txt->datanext; +#else /* HAVE_AVAHI */ + txt->txt = avahi_string_list_get_next (txt->txt); + if (txt->txt == NULL) + return NULL; +#endif /* HAVE_DNSSD */ + + return txt; +} + + +/* + * 'parse_txt_record_pair()' - Read key/value pair in cups_txt_records_t. + */ + +static int +parse_txt_record_pair (cups_txt_records_t *txt) +{ +#ifdef HAVE_DNSSD + uint8_t datalen; + uint8_t *data = txt->data; + char *ptr; + + /* + * Read a key/value pair starting with an 8-bit length. Since the + * length is 8 bits and the size of the key/value buffers is 256, we + * don't need to check for overflow... + */ + + datalen = *data++; + if (!datalen || (data + datalen) > txt->dataend) + return NULL; + txt->datanext = data + datalen; + + for (ptr = txt->key; data < txt->datanext && *data != '='; data ++) + *ptr++ = *data; + *ptr = '\0'; + + if (data < txt->datanext && *data == '=') + { + data++; + + if (data < datanext) + memcpy (txt->value, data, txt->datanext - data); + value[txt->datanext - data] = '\0'; + } + else + return 1; +#else /* HAVE_AVAHI */ + char *key, *value; + size_t len; + avahi_string_list_get_pair (txt->txt, &key, &value, &len); + if (len > sizeof (txt->value) - 1) + len = sizeof (txt->value) - 1; + + memcpy (txt->value, value, len); + txt->value[len] = '\0'; + len = strlen (key); + if (len > sizeof (txt->key) - 1) + len = sizeof (txt->key) - 1; + + memcpy (txt->key, key, len); + txt->key[len] = '\0'; + avahi_free (key); + avahi_free (value); +#endif /* HAVE_AVAHI */ + + return 0; +} + + +/* + * 'main()' - Browse for printers. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + const char *name; /* Backend name */ + cups_array_t *devices; /* Device array */ + cups_device_t *device; /* Current device */ + char uriName[1024]; /* Unquoted fullName for URI */ +#ifdef HAVE_DNSSD + int fd; /* Main file descriptor */ + fd_set input; /* Input set for select() */ + struct timeval timeout; /* Timeout for select() */ + DNSServiceRef main_ref, /* Main service reference */ + fax_ipp_ref, /* IPP fax service reference */ + ipp_ref, /* IPP service reference */ + ipp_tls_ref, /* IPP w/TLS service reference */ + ipps_ref, /* IPP service reference */ + local_fax_ipp_ref, /* Local IPP fax service reference */ + local_ipp_ref, /* Local IPP service reference */ + local_ipp_tls_ref, /* Local IPP w/TLS service reference */ + local_ipps_ref, /* Local IPP service reference */ + local_printer_ref, /* Local LPD service reference */ + pdl_datastream_ref, /* AppSocket service reference */ + printer_ref, /* LPD service reference */ + riousbprint_ref; /* Remote IO service reference */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + AvahiClient *client; + int error; +#endif /* HAVE_AVAHI */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Don't buffer stderr, and catch SIGTERM... + */ + + setbuf(stderr, NULL); + +#if 0 +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ +#else +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ +#endif + + + + + + /* + * Check command-line... + */ + + if (argc >= 6) + exec_backend(argv); + else if (argc != 1) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (1); + } + + /* + * Only do discovery when run as "dnssd"... + */ + + if ((name = strrchr(argv[0], '/')) != NULL) + name ++; + else + name = argv[0]; + + if (strcmp(name, "dnssd")) + return (0); + + /* + * Create an array to track devices... + */ + + devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL); + + /* + * Browse for different kinds of printers... + */ + +#ifdef HAVE_AVAHI + if ((simple_poll = avahi_simple_poll_new ()) == NULL) + { + perror ("ERROR: Unable to create avahi simple poll object"); + return (1); + } + + client = avahi_client_new (avahi_simple_poll_get (simple_poll), + 0, avahi_client_callback, NULL, &error); + if (!client) + { + perror ("DEBUG: Unable to create avahi client"); + return (0); + } + + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_fax-ipp._tcp", NULL, 0, + avahi_browse_callback, devices); + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_ipp._tcp", NULL, 0, + avahi_browse_callback, devices); + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_ipp-tls._tcp", NULL, 0, + avahi_browse_callback, devices); + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_pdl-datastream._tcp", + NULL, 0, + avahi_browse_callback, + devices); + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_printer._tcp", NULL, 0, + avahi_browse_callback, devices); + avahi_service_browser_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + "_riousbprint._tcp", NULL, 0, + avahi_browse_callback, devices); +#endif /* HAVE_AVAHI */ +#ifdef HAVE_DNSSD + if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError) + { + perror("ERROR: Unable to create service connection"); + return (1); + } + + fd = DNSServiceRefSockFD(main_ref); + + fax_ipp_ref = main_ref; + DNSServiceBrowse(&fax_ipp_ref, kDNSServiceFlagsShareConnection, 0, + "_fax-ipp._tcp", NULL, browse_callback, devices); + + ipp_ref = main_ref; + DNSServiceBrowse(&ipp_ref, kDNSServiceFlagsShareConnection, 0, + "_ipp._tcp", NULL, browse_callback, devices); + + ipp_tls_ref = main_ref; + DNSServiceBrowse(&ipp_tls_ref, kDNSServiceFlagsShareConnection, 0, + "_ipp-tls._tcp", NULL, browse_callback, devices); + + ipps_ref = main_ref; + DNSServiceBrowse(&ipps_ref, kDNSServiceFlagsShareConnection, 0, + "_ipps._tcp", NULL, browse_callback, devices); + + local_fax_ipp_ref = main_ref; + DNSServiceBrowse(&local_fax_ipp_ref, kDNSServiceFlagsShareConnection, + kDNSServiceInterfaceIndexLocalOnly, + "_fax-ipp._tcp", NULL, browse_local_callback, devices); + + local_ipp_ref = main_ref; + DNSServiceBrowse(&local_ipp_ref, kDNSServiceFlagsShareConnection, + kDNSServiceInterfaceIndexLocalOnly, + "_ipp._tcp", NULL, browse_local_callback, devices); + + local_ipp_tls_ref = main_ref; + DNSServiceBrowse(&local_ipp_tls_ref, kDNSServiceFlagsShareConnection, + kDNSServiceInterfaceIndexLocalOnly, + "_ipp-tls._tcp", NULL, browse_local_callback, devices); + + local_ipps_ref = main_ref; + DNSServiceBrowse(&local_ipps_ref, kDNSServiceFlagsShareConnection, + kDNSServiceInterfaceIndexLocalOnly, + "_ipps._tcp", NULL, browse_local_callback, devices); + + local_printer_ref = main_ref; + DNSServiceBrowse(&local_printer_ref, kDNSServiceFlagsShareConnection, + kDNSServiceInterfaceIndexLocalOnly, + "_printer._tcp", NULL, browse_local_callback, devices); + + pdl_datastream_ref = main_ref; + DNSServiceBrowse(&pdl_datastream_ref, kDNSServiceFlagsShareConnection, 0, + "_pdl-datastream._tcp", NULL, browse_callback, devices); + + printer_ref = main_ref; + DNSServiceBrowse(&printer_ref, kDNSServiceFlagsShareConnection, 0, + "_printer._tcp", NULL, browse_callback, devices); + + riousbprint_ref = main_ref; + DNSServiceBrowse(&riousbprint_ref, kDNSServiceFlagsShareConnection, 0, + "_riousbprint._tcp", NULL, browse_callback, devices); +#endif /* HAVE_DNSSD */ + + /* + * Loop until we are killed... + */ + + while (!job_canceled) + { + int announce = 0; + +#ifdef HAVE_DNSSD + FD_ZERO(&input); + FD_SET(fd, &input); + + timeout.tv_sec = 0; + timeout.tv_usec = 250000; + + if (select(fd + 1, &input, NULL, NULL, &timeout) < 0) + continue; + + if (FD_ISSET(fd, &input)) + { + /* + * Process results of our browsing... + */ + + DNSServiceProcessResult(main_ref); + } + else + { + announce = 1; + } +#else /* HAVE_AVAHI */ + int r; + avahi_got_callback = 0; + r = avahi_simple_poll_iterate (simple_poll, 1); + if (r != 0 && r != EINTR) + { + /* + * We've been told to exit the loop. Perhaps the connection to + * avahi failed. + */ + + break; + } + + if (avahi_got_callback) + announce = 1; +#endif /* HAVE_DNSSD */ + + if (announce) + { + /* + * Announce any devices we've found... + */ + +#ifdef HAVE_DNSSD + DNSServiceErrorType status; /* DNS query status */ +#endif /* HAVE_DNSSD */ + cups_device_t *best; /* Best matching device */ + char device_uri[1024]; /* Device URI */ + int count; /* Number of queries */ + int sent; /* Number of sent */ + + for (device = (cups_device_t *)cupsArrayFirst(devices), + best = NULL, count = 0, sent = 0; + device; + device = (cups_device_t *)cupsArrayNext(devices)) + { + if (device->sent) + sent ++; + +#ifdef HAVE_DNSSD + if (device->ref) + count ++; + + if (!device->ref && !device->sent) + { + /* + * Found the device, now get the TXT record(s) for it... + */ + + if (count < 20) + { + device->ref = main_ref; + + fprintf(stderr, "DEBUG: Querying \"%s\"...\n", device->fullName); + + status = DNSServiceQueryRecord(&(device->ref), + kDNSServiceFlagsShareConnection, + 0, device->fullName, + kDNSServiceType_TXT, + kDNSServiceClass_IN, query_callback, + devices); + if (status != kDNSServiceErr_NoError) + { + fputs("ERROR: Unable to query for TXT records!\n", stderr); + fprintf(stderr, "DEBUG: DNSServiceQueryRecord returned %d\n", + status); + } + else + count ++; + } + } + else +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + if (!device->resolved) + continue; + else +#endif /* HAVE_AVAHI */ + if (!device->sent) + { +#ifdef HAVE_DNSSD + /* + * Got the TXT records, now report the device... + */ + + DNSServiceRefDeallocate(device->ref); + device->ref = 0; +#endif /* HAVE_DNSSD */ + + if (!best) + best = device; + else if (_cups_strcasecmp(best->name, device->name) || + _cups_strcasecmp(best->domain, device->domain)) + { + unquote(uriName, best->fullName, sizeof(uriName)); + + httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri), + "dnssd", NULL, uriName, 0, + best->cups_shared ? "/cups" : "/"); + + cupsBackendReport("network", device_uri, best->make_and_model, + best->name, best->device_id, NULL); + best->sent = 1; + best = device; + + sent ++; + } + else if (best->priority > device->priority || + (best->priority == device->priority && + best->type < device->type)) + { + best->sent = 1; + best = device; + + sent ++; + } + else + { + device->sent = 1; + + sent ++; + } + } + } + + if (best) + { + unquote(uriName, best->fullName, sizeof(uriName)); + + httpAssembleURI(HTTP_URI_CODING_ALL, device_uri, sizeof(device_uri), + "dnssd", NULL, uriName, 0, + best->cups_shared ? "/cups" : "/"); + + cupsBackendReport("network", device_uri, best->make_and_model, + best->name, best->device_id, NULL); + best->sent = 1; + sent ++; + } + + if (sent == cupsArrayCount(devices)) + break; + } + } + + return (CUPS_BACKEND_OK); +} + + +#ifdef HAVE_DNSSD +/* + * 'browse_callback()' - Browse devices. + */ + +static void +browse_callback( + DNSServiceRef sdRef, /* I - Service reference */ + DNSServiceFlags flags, /* I - Option flags */ + uint32_t interfaceIndex, /* I - Interface number */ + DNSServiceErrorType errorCode, /* I - Error, if any */ + const char *serviceName, /* I - Name of service/device */ + const char *regtype, /* I - Type of service */ + const char *replyDomain, /* I - Service domain */ + void *context) /* I - Devices array */ +{ + fprintf(stderr, "DEBUG2: browse_callback(sdRef=%p, flags=%x, " + "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", " + "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n", + sdRef, flags, interfaceIndex, errorCode, + serviceName ? serviceName : "(null)", + regtype ? regtype : "(null)", + replyDomain ? replyDomain : "(null)", + context); + + /* + * Only process "add" data... + */ + + if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) + return; + + /* + * Get the device... + */ + + get_device((cups_array_t *)context, serviceName, regtype, replyDomain); +} + + +/* + * 'browse_local_callback()' - Browse local devices. + */ + +static void +browse_local_callback( + DNSServiceRef sdRef, /* I - Service reference */ + DNSServiceFlags flags, /* I - Option flags */ + uint32_t interfaceIndex, /* I - Interface number */ + DNSServiceErrorType errorCode, /* I - Error, if any */ + const char *serviceName, /* I - Name of service/device */ + const char *regtype, /* I - Type of service */ + const char *replyDomain, /* I - Service domain */ + void *context) /* I - Devices array */ +{ + cups_device_t *device; /* Device */ + + + fprintf(stderr, "DEBUG2: browse_local_callback(sdRef=%p, flags=%x, " + "interfaceIndex=%d, errorCode=%d, serviceName=\"%s\", " + "regtype=\"%s\", replyDomain=\"%s\", context=%p)\n", + sdRef, flags, interfaceIndex, errorCode, + serviceName ? serviceName : "(null)", + regtype ? regtype : "(null)", + replyDomain ? replyDomain : "(null)", + context); + + /* + * Only process "add" data... + */ + + if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) + return; + + /* + * Get the device... + */ + + device = get_device((cups_array_t *)context, serviceName, regtype, + replyDomain); + + /* + * Hide locally-registered devices... + */ + + fprintf(stderr, "DEBUG: Hiding local printer \"%s\"...\n", + device->fullName); + device->sent = 1; +} +#endif /* HAVE_DNSSD */ + + +/* + * 'compare_devices()' - Compare two devices. + */ + +static int /* O - Result of comparison */ +compare_devices(cups_device_t *a, /* I - First device */ + cups_device_t *b) /* I - Second device */ +{ + return (strcmp(a->name, b->name)); +} + + +/* + * 'exec_backend()' - Execute the backend that corresponds to the + * resolved service name. + */ + +static void +exec_backend(char **argv) /* I - Command-line arguments */ +{ + const char *resolved_uri, /* Resolved device URI */ + *cups_serverbin; /* Location of programs */ + char scheme[1024], /* Scheme from URI */ + *ptr, /* Pointer into scheme */ + filename[1024]; /* Backend filename */ + + + /* + * Resolve the device URI... + */ + + job_canceled = -1; + + while ((resolved_uri = cupsBackendDeviceURI(argv)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", _("Unable to locate printer.")); + sleep(10); + + if (getenv("CLASS") != NULL) + exit(CUPS_BACKEND_FAILED); + } + + /* + * Extract the scheme from the URI... + */ + + strlcpy(scheme, resolved_uri, sizeof(scheme)); + if ((ptr = strchr(scheme, ':')) != NULL) + *ptr = '\0'; + + /* + * Get the filename of the backend... + */ + + if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) + cups_serverbin = CUPS_SERVERBIN; + + snprintf(filename, sizeof(filename), "%s/backend/%s", cups_serverbin, scheme); + + /* + * Overwrite the device URI and run the new backend... + */ + + setenv("DEVICE_URI", resolved_uri, 1); + + argv[0] = (char *)resolved_uri; + + fprintf(stderr, "DEBUG: Executing backend \"%s\"...\n", filename); + + execv(filename, argv); + + fprintf(stderr, "ERROR: Unable to execute backend \"%s\": %s\n", filename, + strerror(errno)); + exit(CUPS_BACKEND_STOP); +} + + +/* + * 'device_type()' - Get DNS-SD type enumeration from string. + */ + +static int +device_type (const char *regtype) +{ +#ifdef HAVE_AVAHI + if (!strcmp(regtype, "_ipp._tcp")) + return (CUPS_DEVICE_IPP); + else if (!strcmp(regtype, "_ipps._tcp") || + !strcmp(regtype, "_ipp-tls._tcp")) + return (CUPS_DEVICE_IPPS); + else if (!strcmp(regtype, "_fax-ipp._tcp")) + return (CUPS_DEVICE_FAX_IPP); + else if (!strcmp(regtype, "_printer._tcp")) + return (CUPS_DEVICE_PDL_DATASTREAM); +#else + if (!strcmp(regtype, "_ipp._tcp.")) + return (CUPS_DEVICE_IPP); + else if (!strcmp(regtype, "_ipps._tcp.") || + !strcmp(regtype, "_ipp-tls._tcp.")) + return (CUPS_DEVICE_IPPS); + else if (!strcmp(regtype, "_fax-ipp._tcp.")) + return (CUPS_DEVICE_FAX_IPP); + else if (!strcmp(regtype, "_printer._tcp.")) + return (CUPS_DEVICE_PRINTER); + else if (!strcmp(regtype, "_pdl-datastream._tcp.")) + return (CUPS_DEVICE_PDL_DATASTREAM); +#endif /* HAVE_AVAHI */ + + return (CUPS_DEVICE_RIOUSBPRINT); +} + + +/* + * 'get_device()' - Create or update a device. + */ + +static cups_device_t * /* O - Device */ +get_device(cups_array_t *devices, /* I - Device array */ + const char *serviceName, /* I - Name of service/device */ + const char *regtype, /* I - Type of service */ + const char *replyDomain) /* I - Service domain */ +{ + cups_device_t key, /* Search key */ + *device; /* Device */ + char fullName[kDNSServiceMaxDomainName]; + /* Full name for query */ + + + /* + * See if this is a new device... + */ + + key.name = (char *)serviceName; + key.type = device_type (regtype); + + for (device = cupsArrayFind(devices, &key); + device; + device = cupsArrayNext(devices)) + if (_cups_strcasecmp(device->name, key.name)) + break; + else if (device->type == key.type) + { + if (!_cups_strcasecmp(device->domain, "local.") && + _cups_strcasecmp(device->domain, replyDomain)) + { + /* + * Update the .local listing to use the "global" domain name instead. + * The backend will try local lookups first, then the global domain name. + */ + + free(device->domain); + device->domain = strdup(replyDomain); + +#ifdef HAVE_DNSSD + DNSServiceConstructFullName(fullName, device->name, regtype, + replyDomain); +#else /* HAVE_AVAHI */ + avahi_service_name_join (fullName, kDNSServiceMaxDomainName, + serviceName, regtype, replyDomain); +#endif /* HAVE_DNSSD */ + + free(device->fullName); + device->fullName = strdup(fullName); + } + + return (device); + } + + /* + * Yes, add the device... + */ + + fprintf(stderr, "DEBUG: Found \"%s.%s%s\"...\n", serviceName, regtype, + replyDomain); + + device = calloc(sizeof(cups_device_t), 1); + device->name = strdup(serviceName); + device->domain = strdup(replyDomain); + device->type = key.type; + device->priority = 50; +#ifdef HAVE_AVAHI + device->resolved = 0; +#endif /* HAVE_AVAHI */ + + cupsArrayAdd(devices, device); + + /* + * Set the "full name" of this service, which is used for queries... + */ + +#ifdef HAVE_DNSSD + DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); +#else /* HAVE_AVAHI */ + avahi_service_name_join (fullName, kDNSServiceMaxDomainName, + serviceName, regtype, replyDomain); +#endif /* HAVE_DNSSD */ + + device->fullName = strdup(fullName); + + return (device); +} + + +#ifdef HAVE_DNSSD +/* + * 'query_callback()' - Process query data. + */ + +static void +query_callback( + DNSServiceRef sdRef, /* I - Service reference */ + DNSServiceFlags flags, /* I - Data flags */ + uint32_t interfaceIndex, /* I - Interface */ + DNSServiceErrorType errorCode, /* I - Error, if any */ + const char *fullName, /* I - Full service name */ + uint16_t rrtype, /* I - Record type */ + uint16_t rrclass, /* I - Record class */ + uint16_t rdlen, /* I - Length of record data */ + const void *rdata, /* I - Record data */ + uint32_t ttl, /* I - Time-to-live */ + void *context) /* I - Devices array */ +{ + cups_array_t *devices; /* Device array */ + char name[1024], /* Service name */ + *ptr; /* Pointer into string */ + cups_device_t dkey, /* Search key */ + *device; /* Device */ + cups_txt_records_t txt; + + fprintf(stderr, "DEBUG2: query_callback(sdRef=%p, flags=%x, " + "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", " + "rrtype=%u, rrclass=%u, rdlen=%u, rdata=%p, ttl=%u, " + "context=%p)\n", + sdRef, flags, interfaceIndex, errorCode, + fullName ? fullName : "(null)", rrtype, rrclass, rdlen, rdata, ttl, + context); + + /* + * Only process "add" data... + */ + + if (errorCode != kDNSServiceErr_NoError || !(flags & kDNSServiceFlagsAdd)) + return; + + /* + * Lookup the service in the devices array. + */ + + devices = (cups_array_t *)context; + dkey.name = name; + + unquote(name, fullName, sizeof(name)); + + if ((dkey.domain = strstr(name, "._tcp.")) != NULL) + dkey.domain += 6; + else + dkey.domain = (char *)"local."; + + if ((ptr = strstr(name, "._")) != NULL) + *ptr = '\0'; + + dkey.type = device_type (fullName); + + txt.data = rdata; + txt.dataend = rdata + rdlen; + device = find_device ((cups_array_t *) context, &txt, &dkey); + if (!device) + fprintf(stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", fullName); +} +#endif /* HAVE_DNSSD */ + + +#ifdef HAVE_AVAHI +/* + * 'avahi_client_callback()' - Avahi client callback function. + */ + +static void +avahi_client_callback(AvahiClient *client, + AvahiClientState state, + void *context) +{ + /* + * If the connection drops, quit. + */ + + if (state == AVAHI_CLIENT_FAILURE) + { + fprintf (stderr, "ERROR: Avahi connection failed\n"); + avahi_simple_poll_quit (simple_poll); + } +} + + +/* + * 'avahi_query_callback()' - Avahi query callback function. + */ + +static void +avahi_query_callback(AvahiServiceResolver *resolver, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + const char *name, + const char *type, + const char *domain, + const char *host_name, + const AvahiAddress *address, + uint16_t port, + AvahiStringList *txt, + AvahiLookupResultFlags flags, + void *context) +{ + AvahiClient *client; + cups_device_t key, + *device; + char uqname[1024], + *ptr; + cups_txt_records_t txtr; + + client = avahi_service_resolver_get_client (resolver); + if (event != AVAHI_RESOLVER_FOUND) + { + if (event == AVAHI_RESOLVER_FAILURE) + { + fprintf (stderr, "ERROR: %s\n", + avahi_strerror (avahi_client_errno (client))); + } + + avahi_service_resolver_free (resolver); + return; + } + + /* + * Set search key for device. + */ + + key.name = uqname; + unquote (uqname, name, sizeof (uqname)); + if ((ptr = strstr(name, "._")) != NULL) + *ptr = '\0'; + + key.domain = (char *) domain; + key.type = device_type (type); + + /* + * Find the device and the the TXT information. + */ + + txtr.txt = txt; + device = find_device ((cups_array_t *) context, &txtr, &key); + if (device) + { + /* + * Let the main loop know to announce the device. + */ + + device->resolved = 1; + avahi_got_callback = 1; + } + else + fprintf (stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", name); + + avahi_service_resolver_free (resolver); +} + + +/* + * 'avahi_browse_callback()' - Avahi browse callback function. + */ + +static void +avahi_browse_callback(AvahiServiceBrowser *browser, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiBrowserEvent event, + const char *name, + const char *type, + const char *domain, + AvahiLookupResultFlags flags, + void *context) +{ + AvahiClient *client = avahi_service_browser_get_client (browser); + + switch (event) + { + case AVAHI_BROWSER_FAILURE: + fprintf (stderr, "ERROR: %s\n", + avahi_strerror (avahi_client_errno (client))); + avahi_simple_poll_quit (simple_poll); + return; + + case AVAHI_BROWSER_NEW: + /* + * This object is new on the network. + */ + + if (flags & AVAHI_LOOKUP_RESULT_LOCAL) + { + /* + * This comes from the local machine so ignore it. + */ + + fprintf (stderr, "DEBUG: ignoring local service %s\n", name); + } + else + { + /* + * Create a device entry for it if it doesn't yet exist. + */ + + get_device ((cups_array_t *)context, name, type, domain); + + /* + * Now look for a TXT entry. + */ + + if (avahi_service_resolver_new (client, interface, protocol, + name, type, domain, + AVAHI_PROTO_UNSPEC, 0, + avahi_query_callback, context) == NULL) + { + fprintf (stderr, "ERROR: failed to resolve service %s: %s\n", + name, avahi_strerror (avahi_client_errno (client))); + } + } + + break; + + case AVAHI_BROWSER_REMOVE: + case AVAHI_BROWSER_ALL_FOR_NOW: + case AVAHI_BROWSER_CACHE_EXHAUSTED: + break; + } +} +#endif /* HAVE_AVAHI */ + + +/* + * 'find_device()' - Find a device from its name and domain. + */ + +static cups_device_t * +find_device (cups_array_t *devices, + cups_txt_records_t *txt, + cups_device_t *dkey) +{ + cups_device_t *device; + char *ptr; + + for (device = cupsArrayFind(devices, dkey); + device; + device = cupsArrayNext(devices)) + { + if (_cups_strcasecmp(device->name, dkey->name) || + _cups_strcasecmp(device->domain, dkey->domain)) + { + device = NULL; + break; + } + else if (device->type == dkey->type) + { + /* + * Found it, pull out the priority and make and model from the TXT + * record and save it... + */ + + char make_and_model[512], + /* Manufacturer and model */ + model[256], /* Model */ + device_id[2048]; /* 1284 device ID */ + + device_id[0] = '\0'; + make_and_model[0] = '\0'; + + strcpy(model, "Unknown"); + + for (;;) + { + char *key; + char *value; + + if (parse_txt_record_pair (txt)) + goto next; + + key = txt->key; + value = txt->value; + if (!strncasecmp(key, "usb_", 4)) + { + /* + * Add USB device ID information... + */ + + ptr = device_id + strlen(device_id); + snprintf(ptr, sizeof(device_id) - (ptr - device_id), "%s:%s;", + key + 4, value); + } + + if (!_cups_strcasecmp(key, "usb_MFG") || !_cups_strcasecmp(key, "usb_MANU") || + !_cups_strcasecmp(key, "usb_MANUFACTURER")) + strcpy(make_and_model, value); + else if (!_cups_strcasecmp(key, "usb_MDL") || !_cups_strcasecmp(key, "usb_MODEL")) + strcpy(model, value); + else if (!_cups_strcasecmp(key, "product") && !strstr(value, "Ghostscript")) + { + if (value[0] == '(') + { + /* + * Strip parenthesis... + */ + + if ((ptr = value + strlen(value) - 1) > value && *ptr == ')') + *ptr = '\0'; + + strcpy(model, value + 1); + } + else + strcpy(model, value); + } + else if (!_cups_strcasecmp(key, "ty")) + { + strcpy(model, value); + + if ((ptr = strchr(model, ',')) != NULL) + *ptr = '\0'; + } + else if (!_cups_strcasecmp(key, "priority")) + device->priority = atoi(value); + else if ((device->type == CUPS_DEVICE_IPP || + device->type == CUPS_DEVICE_IPPS || + device->type == CUPS_DEVICE_PRINTER) && + !_cups_strcasecmp(key, "printer-type")) + { + /* + * This is a CUPS printer! + */ + + device->cups_shared = 1; + + if (device->type == CUPS_DEVICE_PRINTER) + device->sent = 1; + } + + next: + if (next_txt_record (txt) == NULL) + break; + } + + if (device->device_id) + free(device->device_id); + + if (!device_id[0] && strcmp(model, "Unknown")) + { + if (make_and_model[0]) + snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s;", + make_and_model, model); + else if (!_cups_strncasecmp(model, "designjet ", 10)) + snprintf(device_id, sizeof(device_id), "MFG:HP;MDL:%s", model + 10); + else if (!_cups_strncasecmp(model, "stylus ", 7)) + snprintf(device_id, sizeof(device_id), "MFG:EPSON;MDL:%s", model + 7); + else if ((ptr = strchr(model, ' ')) != NULL) + { + /* + * Assume the first word is the make... + */ + + memcpy(make_and_model, model, ptr - model); + make_and_model[ptr - model] = '\0'; + + snprintf(device_id, sizeof(device_id), "MFG:%s;MDL:%s", + make_and_model, ptr + 1); + } + } + + if (device_id[0]) + device->device_id = strdup(device_id); + else + device->device_id = NULL; + + if (device->make_and_model) + free(device->make_and_model); + + if (make_and_model[0]) + { + strlcat(make_and_model, " ", sizeof(make_and_model)); + strlcat(make_and_model, model, sizeof(make_and_model)); + + device->make_and_model = strdup(make_and_model); + } + else + device->make_and_model = strdup(model); + break; + } + } + + return device; +} + +/* + * 'sigterm_handler()' - Handle termination signals... + */ + +static void +sigterm_handler(int sig) /* I - Signal number (unused) */ +{ + (void)sig; + + if (job_canceled) + exit(CUPS_BACKEND_OK); + else + job_canceled = 1; +} + + +/* + * 'unquote()' - Unquote a name string. + */ + +static void +unquote(char *dst, /* I - Destination buffer */ + const char *src, /* I - Source string */ + size_t dstsize) /* I - Size of destination buffer */ +{ + char *dstend = dst + dstsize - 1; /* End of destination buffer */ + + + while (*src && dst < dstend) + { + if (*src == '\\') + { + src ++; + if (isdigit(src[0] & 255) && isdigit(src[1] & 255) && + isdigit(src[2] & 255)) + { + *dst++ = ((((src[0] - '0') * 10) + src[1] - '0') * 10) + src[2] - '0'; + src += 3; + } + else + *dst++ = *src++; + } + else + *dst++ = *src ++; + } + + *dst = '\0'; +} + + +/* + * End of "$Id: dnssd.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/backend/ieee1284.c b/backend/ieee1284.c new file mode 100644 index 0000000..c95fbc7 --- /dev/null +++ b/backend/ieee1284.c @@ -0,0 +1,491 @@ +/* + * "$Id: ieee1284.c 9828 2011-06-14 06:38:24Z mike $" + * + * IEEE-1284 support functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * backendGetDeviceID() - Get the IEEE-1284 device ID string and + * corresponding URI. + * backendGetMakeModel() - Get the make and model string from the device ID. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include + + +/* + * 'backendGetDeviceID()' - Get the IEEE-1284 device ID string and + * corresponding URI. + */ + +int /* O - 0 on success, -1 on failure */ +backendGetDeviceID( + int fd, /* I - File descriptor */ + char *device_id, /* O - 1284 device ID */ + int device_id_size, /* I - Size of buffer */ + char *make_model, /* O - Make/model */ + int make_model_size, /* I - Size of buffer */ + const char *scheme, /* I - URI scheme */ + char *uri, /* O - Device URI */ + int uri_size) /* I - Size of buffer */ +{ +#ifdef __APPLE__ /* This function is a no-op */ + (void)fd; + (void)device_id; + (void)device_id_size; + (void)make_model; + (void)make_model_size; + (void)scheme; + (void)uri; + (void)uri_size; + + return (-1); + +#else /* Get the device ID from the specified file descriptor... */ +# ifdef __linux + int length; /* Length of device ID info */ + int got_id = 0; +# endif /* __linux */ +# if defined(__sun) && defined(ECPPIOC_GETDEVID) + struct ecpp_device_id did; /* Device ID buffer */ +# endif /* __sun && ECPPIOC_GETDEVID */ + char *ptr; /* Pointer into device ID */ + + + DEBUG_printf(("backendGetDeviceID(fd=%d, device_id=%p, device_id_size=%d, " + "make_model=%p, make_model_size=%d, scheme=\"%s\", " + "uri=%p, uri_size=%d)\n", fd, device_id, device_id_size, + make_model, make_model_size, scheme ? scheme : "(null)", + uri, uri_size)); + + /* + * Range check input... + */ + + if (!device_id || device_id_size < 32) + { + DEBUG_puts("backendGetDeviceID: Bad args!"); + return (-1); + } + + if (make_model) + *make_model = '\0'; + + if (fd >= 0) + { + /* + * Get the device ID string... + */ + + *device_id = '\0'; + +# ifdef __linux + if (ioctl(fd, LPIOC_GET_DEVICE_ID(device_id_size), device_id)) + { + /* + * Linux has to implement things differently for every device it seems. + * Since the standard parallel port driver does not provide a simple + * ioctl() to get the 1284 device ID, we have to open the "raw" parallel + * device corresponding to this port and do some negotiation trickery + * to get the current device ID. + */ + + if (uri && !strncmp(uri, "parallel:/dev/", 14)) + { + char devparport[16]; /* /dev/parportN */ + int devparportfd, /* File descriptor for raw device */ + mode; /* Port mode */ + + + /* + * Since the Linux parallel backend only supports 4 parallel port + * devices, just grab the trailing digit and use it to construct a + * /dev/parportN filename... + */ + + snprintf(devparport, sizeof(devparport), "/dev/parport%s", + uri + strlen(uri) - 1); + + if ((devparportfd = open(devparport, O_RDWR | O_NOCTTY)) != -1) + { + /* + * Claim the device... + */ + + if (!ioctl(devparportfd, PPCLAIM)) + { + fcntl(devparportfd, F_SETFL, fcntl(devparportfd, F_GETFL) | O_NONBLOCK); + + mode = IEEE1284_MODE_COMPAT; + + if (!ioctl(devparportfd, PPNEGOT, &mode)) + { + /* + * Put the device into Device ID mode... + */ + + mode = IEEE1284_MODE_NIBBLE | IEEE1284_DEVICEID; + + if (!ioctl(devparportfd, PPNEGOT, &mode)) + { + /* + * Read the 1284 device ID... + */ + + if ((length = read(devparportfd, device_id, + device_id_size - 1)) >= 2) + { + device_id[length] = '\0'; + got_id = 1; + } + } + } + + /* + * Release the device... + */ + + ioctl(devparportfd, PPRELEASE); + } + + close(devparportfd); + } + } + } + else + got_id = 1; + + if (got_id) + { + /* + * Extract the length of the device ID string from the first two + * bytes. The 1284 spec says the length is stored MSB first... + */ + + length = (((unsigned)device_id[0] & 255) << 8) + + ((unsigned)device_id[1] & 255); + + /* + * Check to see if the length is larger than our buffer; first + * assume that the vendor incorrectly implemented the 1284 spec, + * and then limit the length to the size of our buffer... + */ + + if (length > device_id_size || length < 14) + length = (((unsigned)device_id[1] & 255) << 8) + + ((unsigned)device_id[0] & 255); + + if (length > device_id_size) + length = device_id_size; + + /* + * The length field counts the number of bytes in the string + * including the length field itself (2 bytes). The minimum + * length for a valid/usable device ID is 14 bytes: + * + * MFG: ;MDL: ; + * 2 + 4 + 1 + 5 + 1 + 1 + */ + + if (length < 14) + { + /* + * Can't use this device ID, so don't try to copy it... + */ + + device_id[0] = '\0'; + got_id = 0; + } + else + { + /* + * Copy the device ID text to the beginning of the buffer and + * nul-terminate. + */ + + length -= 2; + + memmove(device_id, device_id + 2, length); + device_id[length] = '\0'; + } + } + else + { + DEBUG_printf(("backendGetDeviceID: ioctl failed - %s\n", + strerror(errno))); + *device_id = '\0'; + } +# endif /* __linux */ + +# if defined(__sun) && defined(ECPPIOC_GETDEVID) + did.mode = ECPP_CENTRONICS; + did.len = device_id_size - 1; + did.rlen = 0; + did.addr = device_id; + + if (!ioctl(fd, ECPPIOC_GETDEVID, &did)) + { + /* + * Nul-terminate the device ID text. + */ + + if (did.rlen < (device_id_size - 1)) + device_id[did.rlen] = '\0'; + else + device_id[device_id_size - 1] = '\0'; + } +# ifdef DEBUG + else + DEBUG_printf(("backendGetDeviceID: ioctl failed - %s\n", + strerror(errno))); +# endif /* DEBUG */ +# endif /* __sun && ECPPIOC_GETDEVID */ + } + + /* + * Check whether device ID is valid. Turn line breaks and tabs to spaces and + * reject device IDs with non-printable characters. + */ + + for (ptr = device_id; *ptr; ptr ++) + if (_cups_isspace(*ptr)) + *ptr = ' '; + else if ((*ptr & 255) < ' ' || *ptr == 127) + { + DEBUG_printf(("backendGetDeviceID: Bad device_id character %d.", + *ptr & 255)); + *device_id = '\0'; + break; + } + + DEBUG_printf(("backendGetDeviceID: device_id=\"%s\"\n", device_id)); + + if (scheme && uri) + *uri = '\0'; + + if (!*device_id) + return (-1); + + /* + * Get the make and model... + */ + + if (make_model) + backendGetMakeModel(device_id, make_model, make_model_size); + + /* + * Then generate a device URI... + */ + + if (scheme && uri && uri_size > 32) + { + int num_values; /* Number of keys and values */ + cups_option_t *values; /* Keys and values in device ID */ + const char *mfg, /* Manufacturer */ + *mdl, /* Model */ + *sern; /* Serial number */ + char temp[256], /* Temporary manufacturer string */ + *tempptr; /* Pointer into temp string */ + + + /* + * Get the make, model, and serial numbers... + */ + + num_values = _cupsGet1284Values(device_id, &values); + + if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) + if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) + sern = cupsGetOption("SN", num_values, values); + + if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) + mfg = cupsGetOption("MFG", num_values, values); + + if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) + mdl = cupsGetOption("MDL", num_values, values); + + if (mfg) + { + if (!_cups_strcasecmp(mfg, "Hewlett-Packard")) + mfg = "HP"; + else if (!_cups_strcasecmp(mfg, "Lexmark International")) + mfg = "Lexmark"; + } + else + { + strlcpy(temp, make_model, sizeof(temp)); + + if ((tempptr = strchr(temp, ' ')) != NULL) + *tempptr = '\0'; + + mfg = temp; + } + + if (!mdl) + mdl = ""; + + if (!_cups_strncasecmp(mdl, mfg, strlen(mfg))) + { + mdl += strlen(mfg); + + while (isspace(*mdl & 255)) + mdl ++; + } + + /* + * Generate the device URI from the manufacturer, make_model, and + * serial number strings. + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, uri_size, scheme, NULL, mfg, 0, + "/%s%s%s", mdl, sern ? "?serial=" : "", sern ? sern : ""); + + cupsFreeOptions(num_values, values); + } + + return (0); +#endif /* __APPLE__ */ +} + + +/* + * 'backendGetMakeModel()' - Get the make and model string from the device ID. + */ + +int /* O - 0 on success, -1 on failure */ +backendGetMakeModel( + const char *device_id, /* O - 1284 device ID */ + char *make_model, /* O - Make/model */ + int make_model_size) /* I - Size of buffer */ +{ + int num_values; /* Number of keys and values */ + cups_option_t *values; /* Keys and values */ + const char *mfg, /* Manufacturer string */ + *mdl, /* Model string */ + *des; /* Description string */ + + + DEBUG_printf(("backendGetMakeModel(device_id=\"%s\", " + "make_model=%p, make_model_size=%d)\n", device_id, + make_model, make_model_size)); + + /* + * Range check input... + */ + + if (!device_id || !*device_id || !make_model || make_model_size < 32) + { + DEBUG_puts("backendGetMakeModel: Bad args!"); + return (-1); + } + + *make_model = '\0'; + + /* + * Look for the description field... + */ + + num_values = _cupsGet1284Values(device_id, &values); + + if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) + mdl = cupsGetOption("MDL", num_values, values); + + if (mdl) + { + /* + * Build a make-model string from the manufacturer and model attributes... + */ + + if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) + mfg = cupsGetOption("MFG", num_values, values); + + if (!mfg || !_cups_strncasecmp(mdl, mfg, strlen(mfg))) + { + /* + * Just copy the model string, since it has the manufacturer... + */ + + _ppdNormalizeMakeAndModel(mdl, make_model, make_model_size); + } + else + { + /* + * Concatenate the make and model... + */ + + char temp[1024]; /* Temporary make and model */ + + snprintf(temp, sizeof(temp), "%s %s", mfg, mdl); + + _ppdNormalizeMakeAndModel(temp, make_model, make_model_size); + } + } + else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL || + (des = cupsGetOption("DES", num_values, values)) != NULL) + { + /* + * Make sure the description contains something useful, since some + * printer manufacturers (HP) apparently don't follow the standards + * they helped to define... + * + * Here we require the description to be 8 or more characters in length, + * containing at least one space and one letter. + */ + + if (strlen(des) >= 8) + { + const char *ptr; /* Pointer into description */ + int letters, /* Number of letters seen */ + spaces; /* Number of spaces seen */ + + + for (ptr = des, letters = 0, spaces = 0; *ptr; ptr ++) + { + if (isspace(*ptr & 255)) + spaces ++; + else if (isalpha(*ptr & 255)) + letters ++; + + if (spaces && letters) + break; + } + + if (spaces && letters) + _ppdNormalizeMakeAndModel(des, make_model, make_model_size); + } + } + + if (!make_model[0]) + { + /* + * Use "Unknown" as the printer make and model... + */ + + strlcpy(make_model, "Unknown", make_model_size); + } + + cupsFreeOptions(num_values, values); + + return (0); +} + + +/* + * End of "$Id: ieee1284.c 9828 2011-06-14 06:38:24Z mike $". + */ diff --git a/backend/ipp.c b/backend/ipp.c new file mode 100644 index 0000000..6e76ddd --- /dev/null +++ b/backend/ipp.c @@ -0,0 +1,3225 @@ +/* + * "$Id: ipp.c 10452 2012-05-04 23:00:01Z mike $" + * + * IPP backend for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the printer or server. + * cancel_job() - Cancel a print job. + * check_printer_state() - Check the printer state. + * compress_files() - Compress print files. + * monitor_printer() - Monitor the printer state. + * new_request() - Create a new print creation or validation request. + * password_cb() - Disable the password prompt for + * cupsDoFileRequest(). + * report_attr() - Report an IPP attribute value. + * report_printer_state() - Report the printer state. + * run_as_user() - Run the IPP backend as the printing user. + * timeout_cb() - Handle HTTP timeouts. + * sigterm_handler() - Handle 'terminate' signals that stop the backend. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include +#include +#include +#include +#if defined(HAVE_GSSAPI) && defined(HAVE_XPC) +# include +# define kPMPrintUIToolAgent "com.apple.printuitool.agent" +# define kPMStartJob 100 +# define kPMWaitForJob 101 +extern void xpc_connection_set_target_uid(xpc_connection_t connection, + uid_t uid); +#endif /* HAVE_GSSAPI && HAVE_XPC */ + + +/* + * Types... + */ + +typedef struct _cups_monitor_s /**** Monitoring data ****/ +{ + const char *uri, /* Printer URI */ + *hostname, /* Hostname */ + *user, /* Username */ + *resource; /* Resource path */ + int port, /* Port number */ + version, /* IPP version */ + job_id, /* Job ID for submitted job */ + get_job_attrs; /* Support Get-Job-Attributes? */ + const char *job_name; /* Job name for submitted job */ + http_encryption_t encryption; /* Use encryption? */ + ipp_jstate_t job_state; /* Current job state */ + ipp_pstate_t printer_state; /* Current printer state */ +} _cups_monitor_t; + + +/* + * Globals... + */ + +static const char *auth_info_required; + /* New auth-info-required value */ +#if defined(HAVE_GSSAPI) && defined(HAVE_XPC) +static int child_pid = 0; /* Child process ID */ +#endif /* HAVE_GSSAPI && HAVE_XPC */ +static const char * const jattrs[] = /* Job attributes we want */ +{ + "job-impressions-completed", + "job-media-sheets-completed", + "job-name", + "job-originating-user-name", + "job-state", + "job-state-reasons" +}; +static int job_canceled = 0; + /* Job cancelled? */ +static char username[256] = "", + /* Username for device URI */ + *password = NULL; + /* Password for device URI */ +static int password_tries = 0; + /* Password tries */ +static const char * const pattrs[] = /* Printer attributes we want */ +{ + "copies-supported", + "cups-version", + "document-format-supported", + "marker-colors", + "marker-high-levels", + "marker-levels", + "marker-low-levels", + "marker-message", + "marker-names", + "marker-types", + "media-col-supported", + "multiple-document-handling-supported", + "operations-supported", + "printer-alert", + "printer-alert-description", + "printer-is-accepting-jobs", + "printer-state", + "printer-state-message", + "printer-state-reasons" +}; +static const char * const remote_job_states[] = +{ /* Remote job state keywords */ + "+cups-remote-pending", + "+cups-remote-pending-held", + "+cups-remote-processing", + "+cups-remote-stopped", + "+cups-remote-canceled", + "+cups-remote-aborted", + "+cups-remote-completed" +}; +static _cups_mutex_t report_mutex = _CUPS_MUTEX_INITIALIZER; + /* Mutex to control access */ +static int num_attr_cache = 0; + /* Number of cached attributes */ +static cups_option_t *attr_cache = NULL; + /* Cached attributes */ +static cups_array_t *state_reasons; /* Array of printe-state-reasons keywords */ +static char tmpfilename[1024] = ""; + /* Temporary spool file name */ + + +/* + * Local functions... + */ + +static void cancel_job(http_t *http, const char *uri, int id, + const char *resource, const char *user, + int version); +static ipp_pstate_t check_printer_state(http_t *http, const char *uri, + const char *resource, + const char *user, int version); +#ifdef HAVE_LIBZ +static void compress_files(int num_files, char **files); +#endif /* HAVE_LIBZ */ +static void *monitor_printer(_cups_monitor_t *monitor); +static ipp_t *new_request(ipp_op_t op, int version, const char *uri, + const char *user, const char *title, + int num_options, cups_option_t *options, + const char *compression, int copies, + const char *format, _ppd_cache_t *pc, + ipp_attribute_t *media_col_sup, + ipp_attribute_t *doc_handling_sup); +static const char *password_cb(const char *); +static void report_attr(ipp_attribute_t *attr); +static void report_printer_state(ipp_t *ipp); +#if defined(HAVE_GSSAPI) && defined(HAVE_XPC) +static int run_as_user(int argc, char *argv[], uid_t uid, + const char *device_uri, int fd); +#endif /* HAVE_GSSAPI && HAVE_XPC */ +static void sigterm_handler(int sig); +static int timeout_cb(http_t *http, void *user_data); +static void update_reasons(ipp_attribute_t *attr, const char *s); + + +/* + * 'main()' - Send a file to the printer or server. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int send_options; /* Send job options? */ + int num_options; /* Number of printer options */ + cups_option_t *options; /* Printer options */ + const char *device_uri; /* Device URI */ + char scheme[255], /* Scheme in URI */ + hostname[1024], /* Hostname */ + resource[1024], /* Resource info (printer name) */ + addrname[256], /* Address name */ + *optptr, /* Pointer to URI options */ + *name, /* Name of option */ + *value, /* Value of option */ + sep; /* Separator character */ + http_addrlist_t *addrlist; /* Address of printer */ + int snmp_fd, /* SNMP socket */ + start_count, /* Page count via SNMP at start */ + page_count, /* Page count via SNMP */ + have_supplies; /* Printer supports supply levels? */ + int num_files; /* Number of files to print */ + char **files, /* Files to print */ + *compatfile = NULL; /* Compatibility filename */ + off_t compatsize = 0; /* Size of compatibility file */ + int port; /* Port number (not used) */ + char portname[255]; /* Port name */ + char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */ + char print_job_name[1024]; /* Update job-name for Print-Job */ + http_status_t http_status; /* Status of HTTP request */ + ipp_status_t ipp_status; /* Status of IPP request */ + http_t *http; /* HTTP connection */ + ipp_t *request, /* IPP request */ + *response, /* IPP response */ + *supported; /* get-printer-attributes response */ + time_t start_time; /* Time of first connect */ + int contimeout; /* Connection timeout */ + int delay, /* Delay for retries */ + prev_delay; /* Previous delay */ + const char *compression; /* Compression mode */ + int waitjob, /* Wait for job complete? */ + waitprinter; /* Wait for printer ready? */ + _cups_monitor_t monitor; /* Monitoring data */ + ipp_attribute_t *job_id_attr; /* job-id attribute */ + int job_id; /* job-id value */ + ipp_attribute_t *job_sheets; /* job-media-sheets-completed */ + ipp_attribute_t *job_state; /* job-state */ + ipp_attribute_t *copies_sup; /* copies-supported */ + ipp_attribute_t *cups_version; /* cups-version */ + ipp_attribute_t *format_sup; /* document-format-supported */ + ipp_attribute_t *media_col_sup; /* media-col-supported */ + ipp_attribute_t *operations_sup; /* operations-supported */ + ipp_attribute_t *doc_handling_sup; /* multiple-document-handling-supported */ + ipp_attribute_t *printer_state; /* printer-state attribute */ + ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */ + int create_job = 0, /* Does printer support Create-Job? */ + get_job_attrs = 0, /* Does printer support Get-Job-Attributes? */ + send_document = 0, /* Does printer support Send-Document? */ + validate_job = 0; /* Does printer support Validate-Job? */ + int copies, /* Number of copies for job */ + copies_remaining; /* Number of copies remaining */ + const char *content_type, /* CONTENT_TYPE environment variable */ + *final_content_type, /* FINAL_CONTENT_TYPE environment var */ + *document_format; /* document-format value */ + int fd; /* File descriptor */ + off_t bytes = 0; /* Bytes copied */ + char buffer[16384]; /* Copy buffer */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + int version; /* IPP version */ + ppd_file_t *ppd; /* PPD file */ + _ppd_cache_t *pc; /* PPD cache and mapping data */ + fd_set input; /* Input set for select() */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE and catch SIGTERM signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGTERM); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + char *s; + + if ((s = strrchr(argv[0], '/')) != NULL) + s ++; + else + s = argv[0]; + + printf("network %s \"Unknown\" \"%s (%s)\"\n", + s, _cupsLangString(cupsLangDefault(), + _("Internet Printing Protocol")), s); + return (CUPS_BACKEND_OK); + } + else if (argc < 6) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_STOP); + } + + /* + * Get the device URI... + */ + + while ((device_uri = cupsBackendDeviceURI(argv)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", _("Unable to locate printer.")); + sleep(10); + + if (getenv("CLASS") != NULL) + return (CUPS_BACKEND_FAILED); + } + + if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) == NULL) + auth_info_required = "none"; + + state_reasons = _cupsArrayNewStrings(getenv("PRINTER_STATE_REASONS")); + +#ifdef HAVE_GSSAPI + /* + * For Kerberos, become the printing user (if we can) to get the credentials + * that way. + */ + + if (!getuid() && (value = getenv("AUTH_UID")) != NULL) + { + uid_t uid = (uid_t)atoi(value); + /* User ID */ + +# ifdef HAVE_XPC + if (uid > 0) + { + if (argc == 6) + return (run_as_user(argc, argv, uid, device_uri, 0)); + else + { + int status = 0; /* Exit status */ + + for (i = 6; i < argc && !status && !job_canceled; i ++) + { + if ((fd = open(argv[i], O_RDONLY)) >= 0) + { + status = run_as_user(argc, argv, uid, device_uri, fd); + close(fd); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + status = CUPS_BACKEND_FAILED; + } + } + + return (status); + } + } + +# else /* No XPC, just try to run as the user ID */ + if (uid > 0) + seteuid(uid); +# endif /* HAVE_XPC */ + } +#endif /* HAVE_GSSAPI */ + + /* + * Get the (final) content type... + */ + + if ((content_type = getenv("CONTENT_TYPE")) == NULL) + content_type = "application/octet-stream"; + + if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) + { + final_content_type = content_type; + + if (!strncmp(final_content_type, "printer/", 8)) + final_content_type = "application/vnd.cups-raw"; + } + + /* + * Extract the hostname and printer name from the URI... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if (!port) + port = IPP_PORT; /* Default to port 631 */ + + if (!strcmp(scheme, "https")) + cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); + else + cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); + + /* + * See if there are any options... + */ + + compression = NULL; + version = 20; + waitjob = 1; + waitprinter = 1; + contimeout = 7 * 24 * 60 * 60; + + if ((optptr = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the optptr... + */ + + *optptr++ = '\0'; + + /* + * Then parse the optptr... + */ + + while (*optptr) + { + /* + * Get the name... + */ + + name = optptr; + + while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&') + optptr ++; + + if ((sep = *optptr) != '\0') + *optptr++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = optptr; + + while (*optptr && *optptr != '+' && *optptr != '&') + optptr ++; + + if (*optptr) + *optptr++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!_cups_strcasecmp(name, "waitjob")) + { + /* + * Wait for job completion? + */ + + waitjob = !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "waitprinter")) + { + /* + * Wait for printer idle? + */ + + waitprinter = !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "encryption")) + { + /* + * Enable/disable encryption? + */ + + if (!_cups_strcasecmp(value, "always")) + cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); + else if (!_cups_strcasecmp(value, "required")) + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + else if (!_cups_strcasecmp(value, "never")) + cupsSetEncryption(HTTP_ENCRYPT_NEVER); + else if (!_cups_strcasecmp(value, "ifrequested")) + cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown encryption option value: \"%s\"."), + value); + } + } + else if (!_cups_strcasecmp(name, "version")) + { + if (!strcmp(value, "1.0")) + version = 10; + else if (!strcmp(value, "1.1")) + version = 11; + else if (!strcmp(value, "2.0")) + version = 20; + else if (!strcmp(value, "2.1")) + version = 21; + else if (!strcmp(value, "2.2")) + version = 22; + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown version option value: \"%s\"."), + value); + } + } +#ifdef HAVE_LIBZ + else if (!_cups_strcasecmp(name, "compression")) + { + if (!_cups_strcasecmp(value, "true") || !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "gzip")) + compression = "gzip"; + } +#endif /* HAVE_LIBZ */ + else if (!_cups_strcasecmp(name, "contimeout")) + { + /* + * Set the connection timeout... + */ + + if (atoi(value) > 0) + contimeout = atoi(value); + } + else + { + /* + * Unknown option... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown option \"%s\" with value \"%s\"."), + name, value); + } + } + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, copy stdin to a temporary file and print the temporary + * file. + */ + + if (argc == 6) + { + num_files = 0; + files = NULL; + send_options = !_cups_strcasecmp(final_content_type, "application/pdf") || + !_cups_strcasecmp(final_content_type, "application/vnd.cups-pdf") || + !_cups_strncasecmp(final_content_type, "image/", 6); + + fputs("DEBUG: Sending stdin for job...\n", stderr); + } + else + { + /* + * Point to the files on the command-line... + */ + + num_files = argc - 6; + files = argv + 6; + send_options = 1; + +#ifdef HAVE_LIBZ + if (compression) + compress_files(num_files, files); +#endif /* HAVE_LIBZ */ + + fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files); + } + + /* + * Set the authentication info, if any... + */ + + cupsSetPasswordCB(password_cb); + + if (username[0]) + { + /* + * Use authenticaion information in the device URI... + */ + + if ((password = strchr(username, ':')) != NULL) + *password++ = '\0'; + + cupsSetUser(username); + } + else + { + /* + * Try loading authentication information from the environment. + */ + + const char *ptr = getenv("AUTH_USERNAME"); + + if (ptr) + { + strlcpy(username, ptr, sizeof(username)); + cupsSetUser(ptr); + } + + password = getenv("AUTH_PASSWORD"); + } + + /* + * Try finding the remote server... + */ + + start_time = time(NULL); + + sprintf(portname, "%d", port); + + update_reasons(NULL, "+connecting-to-device"); + fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); + + while ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to locate printer \"%s\"."), hostname); + sleep(10); + + if (getenv("CLASS") != NULL) + { + update_reasons(NULL, "-connecting-to-device"); + return (CUPS_BACKEND_STOP); + } + } + + http = _httpCreate(hostname, port, addrlist, cupsEncryption(), AF_UNSPEC); + httpSetTimeout(http, 30.0, timeout_cb, NULL); + + /* + * See if the printer supports SNMP... + */ + + if ((snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family)) >= 0) + { + have_supplies = !backendSNMPSupplies(snmp_fd, &(addrlist->addr), + &start_count, NULL); + } + else + have_supplies = start_count = 0; + + /* + * Wait for data from the filter... + */ + + if (num_files == 0) + { + if (!backendWaitLoop(snmp_fd, &(addrlist->addr), 0, backendNetworkSideCB)) + return (CUPS_BACKEND_OK); + else if ((bytes = read(0, buffer, sizeof(buffer))) <= 0) + return (CUPS_BACKEND_OK); + } + + /* + * Try connecting to the remote server... + */ + + delay = _cupsNextDelay(0, &prev_delay); + + do + { + fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port); + _cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer.")); + + if (httpReconnect(http)) + { + int error = errno; /* Connection error */ + + if (http->status == HTTP_PKI_ERROR) + update_reasons(NULL, "+cups-certificate-error"); + + if (job_canceled) + break; + + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + update_reasons(NULL, "-connecting-to-device"); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno)); + + if (errno == ECONNREFUSED || errno == EHOSTDOWN || + errno == EHOSTUNREACH) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + update_reasons(NULL, "-connecting-to-device"); + return (CUPS_BACKEND_FAILED); + } + + switch (error) + { + case EHOSTDOWN : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer may not exist or " + "is unavailable at this time.")); + break; + + case EHOSTUNREACH : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is unreachable at this " + "time.")); + break; + + case ECONNREFUSED : + default : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is busy.")); + break; + } + + sleep(delay); + + delay = _cupsNextDelay(delay, &prev_delay); + } + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + sleep(30); + } + + if (job_canceled) + break; + } + else + update_reasons(NULL, "-cups-certificate-error"); + } + while (http->fd < 0); + + if (job_canceled || !http) + return (CUPS_BACKEND_FAILED); + + update_reasons(NULL, "-connecting-to-device"); + _cupsLangPrintFilter(stderr, "INFO", _("Connected to printer.")); + + fprintf(stderr, "DEBUG: Connected to %s:%d...\n", + httpAddrString(http->hostaddr, addrname, sizeof(addrname)), + _httpAddrPort(http->hostaddr)); + + /* + * Build a URI for the printer and fill the standard IPP attributes for + * an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it + * might contain username:password information... + */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname, + port, resource); + + /* + * First validate the destination and see if the device supports multiple + * copies... + */ + + copies_sup = NULL; + cups_version = NULL; + format_sup = NULL; + media_col_sup = NULL; + supported = NULL; + operations_sup = NULL; + doc_handling_sup = NULL; + + do + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build the IPP request... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + /* + * Do the request... + */ + + fputs("DEBUG: Getting supported attributes...\n", stderr); + + if (http->version < HTTP_1_1) + { + fprintf(stderr, "DEBUG: Printer responded with HTTP version %d.%d.\n", + http->version / 100, http->version % 100); + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-wrong-http-version"); + } + + supported = cupsDoRequest(http, request, resource); + ipp_status = cupsLastError(); + + fprintf(stderr, "DEBUG: Get-Printer-Attributes: %s (%s)\n", + ippErrorString(ipp_status), cupsLastErrorString()); + + if (ipp_status <= IPP_OK_CONFLICT) + password_tries = 0; + else + { + fprintf(stderr, "DEBUG: Get-Printer-Attributes returned %s.\n", + ippErrorString(ipp_status)); + + if (ipp_status == IPP_PRINTER_BUSY || + ipp_status == IPP_SERVICE_UNAVAILABLE) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + return (CUPS_BACKEND_FAILED); + } + + _cupsLangPrintFilter(stderr, "INFO", _("The printer is busy.")); + + report_printer_state(supported); + + sleep(delay); + + delay = _cupsNextDelay(delay, &prev_delay); + } + else if ((ipp_status == IPP_BAD_REQUEST || + ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) + { + /* + * Switch to IPP/1.1 or IPP/1.0... + */ + + if (version >= 20) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer does not support IPP/%d.%d, trying " + "IPP/%s."), version / 10, version % 10, "1.1"); + version = 11; + } + else + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer does not support IPP/%d.%d, trying " + "IPP/%s."), version / 10, version % 10, "1.0"); + version = 10; + } + + httpReconnect(http); + } + else if (ipp_status == IPP_NOT_FOUND) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer URI is incorrect or no longer " + "exists.")); + + ippDelete(supported); + + return (CUPS_BACKEND_STOP); + } + else if (ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED) + { + const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE); + /* WWW-Authenticate field value */ + + if (!strncmp(www_auth, "Negotiate", 9)) + auth_info_required = "negotiate"; + else if (www_auth[0]) + auth_info_required = "username,password"; + + fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); + return (CUPS_BACKEND_AUTH_REQUIRED); + } + else if (ipp_status != IPP_NOT_AUTHORIZED) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to get printer status.")); + sleep(10); + } + + ippDelete(supported); + supported = NULL; + continue; + } + + if (!getenv("CLASS")) + { + /* + * Check printer-is-accepting-jobs = false and printer-state-reasons for the + * "spool-area-full" keyword... + */ + + int busy = 0; + + if ((printer_accepting = ippFindAttribute(supported, + "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN)) != NULL && + !printer_accepting->values[0].boolean) + busy = 1; + else if (!printer_accepting) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-printer-is-accepting-jobs"); + + if ((printer_state = ippFindAttribute(supported, + "printer-state-reasons", + IPP_TAG_KEYWORD)) != NULL && !busy) + { + for (i = 0; i < printer_state->num_values; i ++) + if (!strcmp(printer_state->values[0].string.text, + "spool-area-full") || + !strncmp(printer_state->values[0].string.text, "spool-area-full-", + 16)) + { + busy = 1; + break; + } + } + else + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-printer-state-reasons"); + + if (busy) + { + _cupsLangPrintFilter(stderr, "INFO", _("The printer is busy.")); + + report_printer_state(supported); + + sleep(delay); + + delay = _cupsNextDelay(delay, &prev_delay); + + ippDelete(supported); + supported = NULL; + continue; + } + } + + /* + * Check for supported attributes... + */ + + if ((copies_sup = ippFindAttribute(supported, "copies-supported", + IPP_TAG_RANGE)) != NULL) + { + /* + * Has the "copies-supported" attribute - does it have an upper + * bound > 1? + */ + + fprintf(stderr, "DEBUG: copies-supported=%d-%d\n", + copies_sup->values[0].range.lower, + copies_sup->values[0].range.upper); + + if (copies_sup->values[0].range.upper <= 1) + copies_sup = NULL; /* No */ + } + + cups_version = ippFindAttribute(supported, "cups-version", IPP_TAG_TEXT); + + if ((format_sup = ippFindAttribute(supported, "document-format-supported", + IPP_TAG_MIMETYPE)) != NULL) + { + fprintf(stderr, "DEBUG: document-format-supported (%d values)\n", + format_sup->num_values); + for (i = 0; i < format_sup->num_values; i ++) + fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i, + format_sup->values[i].string.text); + } + + if ((media_col_sup = ippFindAttribute(supported, "media-col-supported", + IPP_TAG_KEYWORD)) != NULL) + { + fprintf(stderr, "DEBUG: media-col-supported (%d values)\n", + media_col_sup->num_values); + for (i = 0; i < media_col_sup->num_values; i ++) + fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i, + media_col_sup->values[i].string.text); + } + + if ((operations_sup = ippFindAttribute(supported, "operations-supported", + IPP_TAG_ENUM)) != NULL) + { + for (i = 0; i < operations_sup->num_values; i ++) + if (operations_sup->values[i].integer == IPP_PRINT_JOB) + break; + + if (i >= operations_sup->num_values) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-print-job"); + + for (i = 0; i < operations_sup->num_values; i ++) + if (operations_sup->values[i].integer == IPP_CANCEL_JOB) + break; + + if (i >= operations_sup->num_values) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-cancel-job"); + + for (i = 0; i < operations_sup->num_values; i ++) + if (operations_sup->values[i].integer == IPP_GET_JOB_ATTRIBUTES) + break; + + if (i >= operations_sup->num_values) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-get-job-attributes"); + + for (i = 0; i < operations_sup->num_values; i ++) + if (operations_sup->values[i].integer == IPP_GET_PRINTER_ATTRIBUTES) + break; + + if (i >= operations_sup->num_values) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-get-printer-attributes"); + + for (i = 0; i < operations_sup->num_values; i ++) + { + if (operations_sup->values[i].integer == IPP_VALIDATE_JOB) + validate_job = 1; + else if (operations_sup->values[i].integer == IPP_CREATE_JOB) + create_job = 1; + else if (operations_sup->values[i].integer == IPP_SEND_DOCUMENT) + send_document = 1; + else if (operations_sup->values[i].integer == IPP_GET_JOB_ATTRIBUTES) + get_job_attrs = 1; + } + + if (create_job && !send_document) + { + fputs("DEBUG: Printer supports Create-Job but not Send-Document.\n", + stderr); + create_job = 0; + + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-send-document"); + } + + if (!validate_job) + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-validate-job"); + } + else + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-operations-supported"); + + doc_handling_sup = ippFindAttribute(supported, + "multiple-document-handling-supported", + IPP_TAG_KEYWORD); + + report_printer_state(supported); + } + while (ipp_status > IPP_OK_CONFLICT); + + /* + * See if the printer is accepting jobs and is not stopped; if either + * condition is true and we are printing to a class, requeue the job... + */ + + if (getenv("CLASS") != NULL) + { + printer_state = ippFindAttribute(supported, "printer-state", + IPP_TAG_ENUM); + printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN); + + if (printer_state == NULL || + (printer_state->values[0].integer > IPP_PRINTER_PROCESSING && + waitprinter) || + printer_accepting == NULL || + !printer_accepting->values[0].boolean) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + ippDelete(supported); + httpClose(http); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + } + + /* + * See if the printer supports multiple copies... + */ + + copies = atoi(argv[4]); + + if (copies_sup || argc < 7) + { + copies_remaining = 1; + + if (argc < 7 && !_cups_strncasecmp(final_content_type, "image/", 6)) + copies = 1; + } + else + copies_remaining = copies; + + /* + * Prepare remaining printing options... + */ + + options = NULL; + pc = NULL; + + if (send_options) + { + num_options = cupsParseOptions(argv[5], 0, &options); + + if (!cups_version && media_col_sup) + { + /* + * Load the PPD file and generate PWG attribute mapping information... + */ + + ppd = ppdOpenFile(getenv("PPD")); + pc = _ppdCacheCreateWithPPD(ppd); + + ppdClose(ppd); + } + } + else + num_options = 0; + + document_format = NULL; + + if (format_sup != NULL) + { + for (i = 0; i < format_sup->num_values; i ++) + if (!_cups_strcasecmp(final_content_type, + format_sup->values[i].string.text)) + { + document_format = final_content_type; + break; + } + + if (!document_format) + { + for (i = 0; i < format_sup->num_values; i ++) + if (!_cups_strcasecmp("application/octet-stream", + format_sup->values[i].string.text)) + { + document_format = "application/octet-stream"; + break; + } + } + } + + fprintf(stderr, "DEBUG: final_content_type=\"%s\", document_format=\"%s\"\n", + final_content_type, document_format ? document_format : "(null)"); + + /* + * If the printer does not support HTTP/1.1 (which IPP requires), copy stdin + * to a temporary file so that we can do a HTTP/1.0 submission... + * + * (I hate compatibility hacks!) + */ + + if (http->version < HTTP_1_1 && num_files == 0) + { + if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0) + { + perror("DEBUG: Unable to create temporary file"); + return (CUPS_BACKEND_FAILED); + } + + _cupsLangPrintFilter(stderr, "INFO", _("Copying print data.")); + + if ((compatsize = write(fd, buffer, bytes)) < 0) + { + perror("DEBUG: Unable to write temporary file"); + return (CUPS_BACKEND_FAILED); + } + + if ((bytes = backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, + backendNetworkSideCB)) < 0) + return (CUPS_BACKEND_FAILED); + + compatsize += bytes; + + close(fd); + + compatfile = tmpfilename; + files = &compatfile; + num_files = 1; + } + else if (http->version < HTTP_1_1 && num_files == 1) + { + struct stat fileinfo; /* File information */ + + if (!stat(files[0], &fileinfo)) + compatsize = fileinfo.st_size; + } + + /* + * Start monitoring the printer in the background... + */ + + monitor.uri = uri; + monitor.hostname = hostname; + monitor.user = argv[2]; + monitor.resource = resource; + monitor.port = port; + monitor.version = version; + monitor.job_id = 0; + monitor.get_job_attrs = get_job_attrs; + monitor.encryption = cupsEncryption(); + monitor.job_state = IPP_JOB_PENDING; + monitor.printer_state = IPP_PRINTER_IDLE; + + if (create_job) + { + monitor.job_name = argv[3]; + } + else + { + snprintf(print_job_name, sizeof(print_job_name), "%s - %s", argv[1], + argv[3]); + monitor.job_name = print_job_name; + } + + _cupsThreadCreate((_cups_thread_func_t)monitor_printer, &monitor); + + /* + * Validate access to the printer... + */ + + while (!job_canceled && validate_job) + { + request = new_request(IPP_VALIDATE_JOB, version, uri, argv[2], + monitor.job_name, num_options, options, compression, + copies_sup ? copies : 1, document_format, pc, + media_col_sup, doc_handling_sup); + + ippDelete(cupsDoRequest(http, request, resource)); + + ipp_status = cupsLastError(); + + fprintf(stderr, "DEBUG: Validate-Job: %s (%s)\n", + ippErrorString(ipp_status), cupsLastErrorString()); + + if (job_canceled) + break; + + if (ipp_status == IPP_SERVICE_UNAVAILABLE || ipp_status == IPP_PRINTER_BUSY) + { + _cupsLangPrintFilter(stderr, "INFO", _("The printer is busy.")); + sleep(10); + } + else if (ipp_status == IPP_DOCUMENT_FORMAT) + goto cleanup; + else if (ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED) + { + const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE); + /* WWW-Authenticate field value */ + + if (!strncmp(www_auth, "Negotiate", 9)) + auth_info_required = "negotiate"; + else if (www_auth[0]) + auth_info_required = "username,password"; + + goto cleanup; + } + else if (ipp_status == IPP_OPERATION_NOT_SUPPORTED) + { + /* + * This is all too common... + */ + + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-validate-job"); + break; + } + else if (ipp_status < IPP_REDIRECTION_OTHER_SITE || + ipp_status == IPP_BAD_REQUEST) + break; + } + + /* + * Then issue the print-job request... + */ + + job_id = 0; + + while (!job_canceled && copies_remaining > 0) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build the IPP job creation request... + */ + + if (job_canceled) + break; + + request = new_request((num_files > 1 || create_job) ? IPP_CREATE_JOB : + IPP_PRINT_JOB, + version, uri, argv[2], monitor.job_name, num_options, + options, compression, copies_sup ? copies : 1, + document_format, pc, media_col_sup, doc_handling_sup); + + /* + * Do the request... + */ + + if (num_files > 1 || create_job) + response = cupsDoRequest(http, request, resource); + else + { + size_t length = 0; /* Length of request */ + + if (compatsize > 0) + { + fputs("DEBUG: Sending file using HTTP/1.0 Content-Length...\n", stderr); + length = ippLength(request) + (size_t)compatsize; + } + else + fputs("DEBUG: Sending file using HTTP/1.1 chunking...\n", stderr); + + http_status = cupsSendRequest(http, request, resource, length); + if (http_status == HTTP_CONTINUE && request->state == IPP_DATA) + { + if (num_files == 1) + { + if ((fd = open(files[0], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + } + else + { + fd = 0; + http_status = cupsWriteRequestData(http, buffer, bytes); + } + + while (http_status == HTTP_CONTINUE && + (!job_canceled || compatsize > 0)) + { + /* + * Check for side-channel requests and more print data... + */ + + FD_ZERO(&input); + FD_SET(fd, &input); + FD_SET(snmp_fd, &input); + + while (select(fd > snmp_fd ? fd + 1 : snmp_fd + 1, &input, NULL, NULL, + NULL) <= 0 && !job_canceled); + + if (FD_ISSET(snmp_fd, &input)) + backendCheckSideChannel(snmp_fd, http->hostaddr); + + if (FD_ISSET(fd, &input)) + { + if ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + { + fprintf(stderr, "DEBUG: Read %d bytes...\n", (int)bytes); + + if (cupsWriteRequestData(http, buffer, bytes) != HTTP_CONTINUE) + break; + } + else if (bytes == 0 || (errno != EINTR && errno != EAGAIN)) + break; + } + } + + if (num_files == 1) + close(fd); + } + + response = cupsGetResponse(http, resource); + ippDelete(request); + } + + ipp_status = cupsLastError(); + + fprintf(stderr, "DEBUG: %s: %s (%s)\n", + (num_files > 1 || create_job) ? "Create-Job" : "Print-Job", + ippErrorString(ipp_status), cupsLastErrorString()); + + if (ipp_status > IPP_OK_CONFLICT) + { + job_id = 0; + + if (job_canceled) + break; + + if (ipp_status == IPP_SERVICE_UNAVAILABLE || + ipp_status == IPP_NOT_POSSIBLE || + ipp_status == IPP_PRINTER_BUSY) + { + _cupsLangPrintFilter(stderr, "INFO", _("The printer is busy.")); + sleep(10); + + if (num_files == 0) + { + /* + * We can't re-submit when we have no files to print, so exit + * immediately with the right status code... + */ + + goto cleanup; + } + } + else if (ipp_status == IPP_ERROR_JOB_CANCELED) + goto cleanup; + else if (ipp_status == IPP_NOT_AUTHORIZED) + continue; + else + { + /* + * Update auth-info-required as needed... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Print file was not accepted.")); + + if (ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED) + { + const char *www_auth = httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE); + /* WWW-Authenticate field value */ + + if (!strncmp(www_auth, "Negotiate", 9)) + auth_info_required = "negotiate"; + else if (www_auth[0]) + auth_info_required = "username,password"; + } + else if (ipp_status == IPP_REQUEST_VALUE) + { + /* + * Print file is too large, abort this job... + */ + + goto cleanup; + } + else + sleep(10); + + if (num_files == 0) + { + /* + * We can't re-submit when we have no files to print, so exit + * immediately with the right status code... + */ + + goto cleanup; + } + } + } + else if ((job_id_attr = ippFindAttribute(response, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Print file accepted - job ID unknown.")); + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-job-id"); + job_id = 0; + } + else + { + password_tries = 0; + monitor.job_id = job_id = job_id_attr->values[0].integer; + _cupsLangPrintFilter(stderr, "INFO", + _("Print file accepted - job ID %d."), job_id); + } + + fprintf(stderr, "DEBUG: job-id=%d\n", job_id); + ippDelete(response); + + if (job_canceled) + break; + + if (job_id && (num_files > 1 || create_job)) + { + for (i = 0; num_files == 0 || i < num_files; i ++) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Send the next file in the job... + */ + + request = ippNewRequest(IPP_SEND_DOCUMENT); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + + if (argv[2][0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, argv[2]); + + if ((i + 1) >= num_files) + ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); + + if (document_format) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, document_format); + + fprintf(stderr, "DEBUG: Sending file %d using chunking...\n", i + 1); + http_status = cupsSendRequest(http, request, resource, 0); + if (http_status == HTTP_CONTINUE && request->state == IPP_DATA) + { + if (num_files == 0) + { + fd = 0; + http_status = cupsWriteRequestData(http, buffer, bytes); + } + else + { + if ((fd = open(files[i], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + } + } + else + fd = -1; + + if (fd >= 0) + { + while (!job_canceled && http_status == HTTP_CONTINUE && + (bytes = read(fd, buffer, sizeof(buffer))) > 0) + { + if ((http_status = cupsWriteRequestData(http, buffer, bytes)) + != HTTP_CONTINUE) + break; + else + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + } + } + + if (fd > 0) + close(fd); + } + + ippDelete(cupsGetResponse(http, resource)); + ippDelete(request); + + fprintf(stderr, "DEBUG: Send-Document: %s (%s)\n", + ippErrorString(cupsLastError()), cupsLastErrorString()); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + ipp_status = cupsLastError(); + + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to add document to print job.")); + break; + } + else + { + password_tries = 0; + + if (num_files == 0 || fd < 0) + break; + } + } + } + + if (ipp_status <= IPP_OK_CONFLICT && argc > 6) + { + fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1); + copies_remaining --; + } + else if (ipp_status == IPP_SERVICE_UNAVAILABLE || + ipp_status == IPP_NOT_POSSIBLE || + ipp_status == IPP_PRINTER_BUSY) + continue; + else if (ipp_status == IPP_REQUEST_VALUE) + { + /* + * Print file is too large, abort this job... + */ + + goto cleanup; + } + else + copies_remaining --; + + /* + * Wait for the job to complete... + */ + + if (!job_id || !waitjob || !get_job_attrs) + continue; + + _cupsLangPrintFilter(stderr, "INFO", _("Waiting for job to complete.")); + + for (delay = _cupsNextDelay(0, &prev_delay); !job_canceled;) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build an IPP_GET_JOB_ATTRIBUTES request... + */ + + request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + + if (argv[2][0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, argv[2]); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]), + NULL, jattrs); + + /* + * Do the request... + */ + + httpReconnect(http); + response = cupsDoRequest(http, request, resource); + ipp_status = cupsLastError(); + + if (ipp_status == IPP_NOT_FOUND || ipp_status == IPP_NOT_POSSIBLE) + { + /* + * Job has gone away and/or the server has no job history... + */ + + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-job-history"); + ippDelete(response); + + ipp_status = IPP_OK; + break; + } + + fprintf(stderr, "DEBUG: Get-Job-Attributes: %s (%s)\n", + ippErrorString(ipp_status), cupsLastErrorString()); + + if (ipp_status <= IPP_OK_CONFLICT) + password_tries = 0; + else + { + if (ipp_status != IPP_SERVICE_UNAVAILABLE && + ipp_status != IPP_PRINTER_BUSY) + { + ippDelete(response); + ipp_status = IPP_OK; + break; + } + } + + if (response) + { + if ((job_state = ippFindAttribute(response, "job-state", + IPP_TAG_ENUM)) != NULL) + { + /* + * Reflect the remote job state in the local queue... + */ + + if (cups_version && + job_state->values[0].integer >= IPP_JOB_PENDING && + job_state->values[0].integer <= IPP_JOB_COMPLETED) + update_reasons(NULL, + remote_job_states[job_state->values[0].integer - + IPP_JOB_PENDING]); + + if ((job_sheets = ippFindAttribute(response, + "job-media-sheets-completed", + IPP_TAG_INTEGER)) == NULL) + job_sheets = ippFindAttribute(response, + "job-impressions-completed", + IPP_TAG_INTEGER); + + if (job_sheets) + fprintf(stderr, "PAGE: total %d\n", + job_sheets->values[0].integer); + + /* + * Stop polling if the job is finished or pending-held... + */ + + if (job_state->values[0].integer > IPP_JOB_STOPPED) + { + ippDelete(response); + break; + } + } + else if (ipp_status != IPP_SERVICE_UNAVAILABLE && + ipp_status != IPP_NOT_POSSIBLE && + ipp_status != IPP_PRINTER_BUSY) + { + /* + * If the printer does not return a job-state attribute, it does not + * conform to the IPP specification - break out immediately and fail + * the job... + */ + + update_reasons(NULL, "+cups-ipp-conformance-failure-report," + "cups-ipp-missing-job-state"); + ipp_status = IPP_INTERNAL_ERROR; + break; + } + } + + ippDelete(response); + + /* + * Wait before polling again... + */ + + sleep(delay); + + delay = _cupsNextDelay(delay, &prev_delay); + } + } + + /* + * Cancel the job as needed... + */ + + if (job_canceled && job_id) + cancel_job(http, uri, job_id, resource, argv[2], version); + + /* + * Check the printer state and report it if necessary... + */ + + check_printer_state(http, uri, resource, argv[2], version); + + /* + * Collect the final page count as needed... + */ + + if (have_supplies && + !backendSNMPSupplies(snmp_fd, http->hostaddr, &page_count, NULL) && + page_count > start_count) + fprintf(stderr, "PAGE: total %d\n", page_count - start_count); + +#ifdef HAVE_GSSAPI + /* + * See if we used Kerberos at all... + */ + + if (http->gssctx) + auth_info_required = "negotiate"; +#endif /* HAVE_GSSAPI */ + + /* + * Free memory... + */ + + cleanup: + + cupsFreeOptions(num_options, options); + _ppdCacheDestroy(pc); + + httpClose(http); + + ippDelete(supported); + + /* + * Remove the temporary file(s) if necessary... + */ + + if (tmpfilename[0]) + unlink(tmpfilename); + +#ifdef HAVE_LIBZ + if (compression) + { + for (i = 0; i < num_files; i ++) + unlink(files[i]); + } +#endif /* HAVE_LIBZ */ + + /* + * Return the queue status... + */ + + if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED || + ipp_status <= IPP_OK_CONFLICT) + fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); + + if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED) + return (CUPS_BACKEND_AUTH_REQUIRED); + else if (ipp_status == IPP_INTERNAL_ERROR) + return (CUPS_BACKEND_STOP); + else if (ipp_status == IPP_CONFLICT) + return (CUPS_BACKEND_FAILED); + else if (ipp_status == IPP_REQUEST_VALUE || + ipp_status == IPP_DOCUMENT_FORMAT || job_canceled < 0) + { + if (ipp_status == IPP_REQUEST_VALUE) + _cupsLangPrintFilter(stderr, "ERROR", _("Print job too large.")); + else if (ipp_status == IPP_DOCUMENT_FORMAT) + _cupsLangPrintFilter(stderr, "ERROR", + _("Printer cannot print supplied content.")); + else + _cupsLangPrintFilter(stderr, "ERROR", _("Print job canceled at printer.")); + return (CUPS_BACKEND_CANCEL); + } + else if (ipp_status > IPP_OK_CONFLICT && ipp_status != IPP_ERROR_JOB_CANCELED) + return (CUPS_BACKEND_RETRY_CURRENT); + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (CUPS_BACKEND_OK); + } +} + + +/* + * 'cancel_job()' - Cancel a print job. + */ + +static void +cancel_job(http_t *http, /* I - HTTP connection */ + const char *uri, /* I - printer-uri */ + int id, /* I - job-id */ + const char *resource, /* I - Resource path */ + const char *user, /* I - requesting-user-name */ + int version) /* I - IPP version */ +{ + ipp_t *request; /* Cancel-Job request */ + + + _cupsLangPrintFilter(stderr, "INFO", _("Canceling print job.")); + + request = ippNewRequest(IPP_CANCEL_JOB); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", id); + + if (user && user[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + /* + * Do the request... + */ + + ippDelete(cupsDoRequest(http, request, resource)); + + if (cupsLastError() > IPP_OK_CONFLICT) + _cupsLangPrintFilter(stderr, "ERROR", _("Unable to cancel print job.")); +} + + +/* + * 'check_printer_state()' - Check the printer state. + */ + +static ipp_pstate_t /* O - Current printer-state */ +check_printer_state( + http_t *http, /* I - HTTP connection */ + const char *uri, /* I - Printer URI */ + const char *resource, /* I - Resource path */ + const char *user, /* I - Username, if any */ + int version) /* I - IPP version */ + { + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* Attribute in response */ + ipp_pstate_t printer_state = IPP_PRINTER_STOPPED; + /* Current printer-state */ + + + /* + * Send a Get-Printer-Attributes request and log the results... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + if (user && user[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(pattrs) / sizeof(pattrs[0])), NULL, pattrs); + + if ((response = cupsDoRequest(http, request, resource)) != NULL) + { + report_printer_state(response); + + if ((attr = ippFindAttribute(response, "printer-state", + IPP_TAG_ENUM)) != NULL) + printer_state = (ipp_pstate_t)attr->values[0].integer; + + ippDelete(response); + } + + fprintf(stderr, "DEBUG: Get-Printer-Attributes: %s (%s)\n", + ippErrorString(cupsLastError()), cupsLastErrorString()); + + if (cupsLastError() <= IPP_OK_CONFLICT) + password_tries = 0; + + /* + * Return the printer-state value... + */ + + return (printer_state); +} + + +#ifdef HAVE_LIBZ +/* + * 'compress_files()' - Compress print files. + */ + +static void +compress_files(int num_files, /* I - Number of files */ + char **files) /* I - Files */ +{ + int i, /* Looping var */ + fd; /* Temporary file descriptor */ + ssize_t bytes; /* Bytes read/written */ + size_t total; /* Total bytes read */ + cups_file_t *in, /* Input file */ + *out; /* Output file */ + struct stat outinfo; /* Output file information */ + char filename[1024], /* Temporary filename */ + buffer[32768]; /* Copy buffer */ + + + fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files); + for (i = 0; i < num_files; i ++) + { + if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to create compressed print file")); + exit(CUPS_BACKEND_FAILED); + } + + if ((out = cupsFileOpenFd(fd, "w9")) == NULL) + { + _cupsLangPrintError("ERROR", _("Unable to open compressed print file")); + exit(CUPS_BACKEND_FAILED); + } + + if ((in = cupsFileOpen(files[i], "r")) == NULL) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + cupsFileClose(out); + exit(CUPS_BACKEND_FAILED); + } + + total = 0; + while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0) + if (cupsFileWrite(out, buffer, bytes) < bytes) + { + _cupsLangPrintError("ERROR", + _("Unable to generate compressed print file")); + cupsFileClose(in); + cupsFileClose(out); + exit(CUPS_BACKEND_FAILED); + } + else + total += bytes; + + cupsFileClose(out); + cupsFileClose(in); + + files[i] = strdup(filename); + + if (!stat(filename, &outinfo)) + fprintf(stderr, + "DEBUG: File %d compressed to %.1f%% of original size, " + CUPS_LLFMT " bytes...\n", + i + 1, 100.0 * outinfo.st_size / total, + CUPS_LLCAST outinfo.st_size); + } +} +#endif /* HAVE_LIBZ */ + + +/* + * 'monitor_printer()' - Monitor the printer state. + */ + +static void * /* O - Thread exit code */ +monitor_printer( + _cups_monitor_t *monitor) /* I - Monitoring data */ +{ + http_t *http; /* Connection to printer */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* Attribute in response */ + int delay, /* Current delay */ + prev_delay; /* Previous delay */ + ipp_op_t job_op; /* Operation to use */ + int job_id; /* Job ID */ + const char *job_name; /* Job name */ + ipp_jstate_t job_state; /* Job state */ + const char *job_user; /* Job originating user name */ + + + /* + * Make a copy of the printer connection... + */ + + http = _httpCreate(monitor->hostname, monitor->port, NULL, monitor->encryption, + AF_UNSPEC); + httpSetTimeout(http, 30.0, timeout_cb, NULL); + if (username[0]) + cupsSetUser(username); + cupsSetPasswordCB(password_cb); + + /* + * Loop until the job is canceled, aborted, or completed. + */ + + delay = _cupsNextDelay(0, &prev_delay); + + while (monitor->job_state < IPP_JOB_CANCELED && !job_canceled) + { + /* + * Reconnect to the printer... + */ + + if (!httpReconnect(http)) + { + /* + * Connected, so check on the printer state... + */ + + monitor->printer_state = check_printer_state(http, monitor->uri, + monitor->resource, + monitor->user, + monitor->version); + + /* + * Check the status of the job itself... + */ + + job_op = (monitor->job_id > 0 && monitor->get_job_attrs) ? + IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS; + request = ippNewRequest(job_op); + request->request.op.version[0] = monitor->version / 10; + request->request.op.version[1] = monitor->version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, monitor->uri); + if (job_op == IPP_GET_JOB_ATTRIBUTES) + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + monitor->job_id); + + if (monitor->user && monitor->user[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, monitor->user); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(jattrs) / sizeof(jattrs[0])), NULL, jattrs); + + /* + * Do the request... + */ + + response = cupsDoRequest(http, request, monitor->resource); + + fprintf(stderr, "DEBUG: %s: %s (%s)\n", ippOpString(job_op), + ippErrorString(cupsLastError()), cupsLastErrorString()); + + if (cupsLastError() <= IPP_OK_CONFLICT) + password_tries = 0; + + if (job_op == IPP_GET_JOB_ATTRIBUTES) + { + if ((attr = ippFindAttribute(response, "job-state", + IPP_TAG_ENUM)) != NULL) + monitor->job_state = (ipp_jstate_t)attr->values[0].integer; + else + monitor->job_state = IPP_JOB_COMPLETED; + } + else if (response) + { + for (attr = response->attrs; attr; attr = attr->next) + { + job_id = 0; + job_name = NULL; + job_state = IPP_JOB_PENDING; + job_user = NULL; + + while (attr && attr->group_tag != IPP_TAG_JOB) + attr = attr->next; + + if (!attr) + break; + + while (attr && attr->group_tag == IPP_TAG_JOB) + { + if (!strcmp(attr->name, "job-id") && + attr->value_tag == IPP_TAG_INTEGER) + job_id = attr->values[0].integer; + else if (!strcmp(attr->name, "job-name") && + (attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_NAMELANG)) + job_name = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-state") && + attr->value_tag == IPP_TAG_ENUM) + job_state = attr->values[0].integer; + else if (!strcmp(attr->name, "job-originating-user-name") && + (attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_NAMELANG)) + job_user = attr->values[0].string.text; + + attr = attr->next; + } + + if (job_id > 0 && job_name && !strcmp(job_name, monitor->job_name) && + job_user && monitor->user && !strcmp(job_user, monitor->user)) + { + monitor->job_id = job_id; + monitor->job_state = job_state; + break; + } + + if (!attr) + break; + } + } + + ippDelete(response); + + /* + * Disconnect from the printer - we'll reconnect on the next poll... + */ + + _httpDisconnect(http); + } + + /* + * Sleep for N seconds... + */ + + sleep(delay); + + delay = _cupsNextDelay(delay, &prev_delay); + } + + /* + * Cancel the job if necessary... + */ + + if (job_canceled && monitor->job_id > 0) + if (!httpReconnect(http)) + cancel_job(http, monitor->uri, monitor->job_id, monitor->resource, + monitor->user, monitor->version); + + /* + * Cleanup and return... + */ + + httpClose(http); + + return (NULL); +} + + +/* + * 'new_request()' - Create a new print creation or validation request. + */ + +static ipp_t * /* O - Request data */ +new_request( + ipp_op_t op, /* I - IPP operation code */ + int version, /* I - IPP version number */ + const char *uri, /* I - printer-uri value */ + const char *user, /* I - requesting-user-name value */ + const char *title, /* I - job-name value */ + int num_options, /* I - Number of options to send */ + cups_option_t *options, /* I - Options to send */ + const char *compression, /* I - compression value or NULL */ + int copies, /* I - copies value or 0 */ + const char *format, /* I - document-format value or NULL */ + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + ipp_attribute_t *media_col_sup, /* I - media-col-supported values */ + ipp_attribute_t *doc_handling_sup) /* I - multiple-document-handling-supported values */ +{ + int i; /* Looping var */ + ipp_t *request; /* Request data */ + const char *keyword; /* PWG keyword */ + _pwg_size_t *size; /* PWG media size */ + ipp_t *media_col, /* media-col value */ + *media_size; /* media-size value */ + const char *media_source, /* media-source value */ + *media_type, /* media-type value */ + *collate_str; /* multiple-document-handling value */ + + + /* + * Create the IPP request... + */ + + request = ippNewRequest(op); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + fprintf(stderr, "DEBUG: %s IPP/%d.%d\n", + ippOpString(request->request.op.operation_id), + request->request.op.version[0], + request->request.op.version[1]); + + /* + * Add standard attributes... + */ + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + fprintf(stderr, "DEBUG: printer-uri=\"%s\"\n", uri); + + if (user && *user) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + fprintf(stderr, "DEBUG: requesting-user-name=\"%s\"\n", user); + } + + if (title && *title) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, + title); + fprintf(stderr, "DEBUG: job-name=\"%s\"\n", title); + } + + if (format && op != IPP_CREATE_JOB) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, format); + fprintf(stderr, "DEBUG: document-format=\"%s\"\n", format); + } + +#ifdef HAVE_LIBZ + if (compression && op != IPP_CREATE_JOB) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "compression", NULL, compression); + fprintf(stderr, "DEBUG: compression=\"%s\"\n", compression); + } +#endif /* HAVE_LIBZ */ + + /* + * Handle options on the command-line... + */ + + if (num_options > 0) + { + if (pc) + { + int num_finishings = 0, /* Number of finishing values */ + finishings[10]; /* Finishing enum values */ + + /* + * Send standard IPP attributes... + */ + + if ((keyword = cupsGetOption("PageSize", num_options, options)) == NULL) + keyword = cupsGetOption("media", num_options, options); + + if ((size = _ppdCacheGetSize(pc, keyword)) != NULL) + { + /* + * Add a media-col value... + */ + + media_size = ippNew(); + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "x-dimension", size->width); + ippAddInteger(media_size, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "y-dimension", size->length); + + media_col = ippNew(); + ippAddCollection(media_col, IPP_TAG_ZERO, "media-size", media_size); + + media_source = _ppdCacheGetSource(pc, cupsGetOption("InputSlot", + num_options, + options)); + media_type = _ppdCacheGetType(pc, cupsGetOption("MediaType", + num_options, + options)); + + for (i = 0; i < media_col_sup->num_values; i ++) + { + if (!strcmp(media_col_sup->values[i].string.text, + "media-left-margin")) + ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-left-margin", size->left); + else if (!strcmp(media_col_sup->values[i].string.text, + "media-bottom-margin")) + ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-bottom-margin", size->bottom); + else if (!strcmp(media_col_sup->values[i].string.text, + "media-right-margin")) + ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-right-margin", size->right); + else if (!strcmp(media_col_sup->values[i].string.text, + "media-top-margin")) + ippAddInteger(media_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-top-margin", size->top); + else if (!strcmp(media_col_sup->values[i].string.text, + "media-source") && media_source) + ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, + "media-source", NULL, media_source); + else if (!strcmp(media_col_sup->values[i].string.text, + "media-type") && media_type) + ippAddString(media_col, IPP_TAG_ZERO, IPP_TAG_KEYWORD, + "media-type", NULL, media_type); + } + + ippAddCollection(request, IPP_TAG_JOB, "media-col", media_col); + } + + if ((keyword = cupsGetOption("output-bin", num_options, + options)) == NULL) + keyword = _ppdCacheGetBin(pc, cupsGetOption("OutputBin", num_options, + options)); + + if (keyword) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-bin", + NULL, keyword); + + if ((keyword = cupsGetOption("output-mode", num_options, + options)) != NULL) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode", + NULL, keyword); + else if ((keyword = cupsGetOption("ColorModel", num_options, + options)) != NULL) + { + if (!_cups_strcasecmp(keyword, "Gray")) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode", + NULL, "monochrome"); + else + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "output-mode", + NULL, "color"); + } + + if ((keyword = cupsGetOption("print-quality", num_options, + options)) != NULL) + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", + atoi(keyword)); + else if ((keyword = cupsGetOption("cupsPrintQuality", num_options, + options)) != NULL) + { + if (!_cups_strcasecmp(keyword, "draft")) + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", + IPP_QUALITY_DRAFT); + else if (!_cups_strcasecmp(keyword, "normal")) + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", + IPP_QUALITY_NORMAL); + else if (!_cups_strcasecmp(keyword, "high")) + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_ENUM, "print-quality", + IPP_QUALITY_HIGH); + } + + if ((keyword = cupsGetOption("sides", num_options, options)) != NULL) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", + NULL, keyword); + else if (pc->sides_option && + (keyword = cupsGetOption(pc->sides_option, num_options, + options)) != NULL) + { + if (!_cups_strcasecmp(keyword, pc->sides_1sided)) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", + NULL, "one-sided"); + else if (!_cups_strcasecmp(keyword, pc->sides_2sided_long)) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", + NULL, "two-sided-long-edge"); + if (!_cups_strcasecmp(keyword, pc->sides_2sided_short)) + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, "sides", + NULL, "two-sided-short-edge"); + } + + if (doc_handling_sup && + (!format || _cups_strncasecmp(format, "image/", 6)) && + (keyword = cupsGetOption("collate", num_options, options)) != NULL) + { + if (!_cups_strcasecmp(keyword, "true")) + collate_str = "separate-documents-collated-copies"; + else + collate_str = "separate-documents-uncollated-copies"; + + for (i = 0; i < doc_handling_sup->num_values; i ++) + if (!strcmp(doc_handling_sup->values[i].string.text, collate_str)) + { + ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "multiple-document-handling", NULL, collate_str); + break; + } + } + + /* + * Map finishing options... + */ + + num_finishings = _ppdCacheGetFinishingValues(pc, num_options, options, + (int)(sizeof(finishings) / + sizeof(finishings[0])), + finishings); + if (num_finishings > 0) + ippAddIntegers(request, IPP_TAG_JOB, IPP_TAG_ENUM, "finishings", + num_finishings, finishings); + + /* + * Map FaxOut options... + */ + + if ((keyword = cupsGetOption("phone", num_options, options)) != NULL) + { + ipp_t *destination; /* destination collection */ + char tel_uri[1024]; /* tel: URI */ + + destination = ippNew(); + + httpAssembleURI(HTTP_URI_CODING_ALL, tel_uri, sizeof(tel_uri), "tel", + NULL, NULL, 0, keyword); + ippAddString(destination, IPP_TAG_JOB, IPP_TAG_URI, "destination-uri", + NULL, tel_uri); + + if ((keyword = cupsGetOption("faxPrefix", num_options, + options)) != NULL && *keyword) + ippAddString(destination, IPP_TAG_JOB, IPP_TAG_TEXT, + "pre-dial-string", NULL, keyword); + + ippAddCollection(request, IPP_TAG_JOB, "destination-uris", destination); + ippDelete(destination); + } + } + else + { + /* + * When talking to another CUPS server, send all options... + */ + + cupsEncodeOptions(request, num_options, options); + } + + if (copies > 1) + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", copies); + } + + return (request); +} + + +/* + * 'password_cb()' - Disable the password prompt for cupsDoFileRequest(). + */ + +static const char * /* O - Password */ +password_cb(const char *prompt) /* I - Prompt (not used) */ +{ + fprintf(stderr, "DEBUG: password_cb(prompt=\"%s\"), password=%p, " + "password_tries=%d\n", prompt, password, password_tries); + + (void)prompt; + + /* + * Remember that we need to authenticate... + */ + + auth_info_required = "username,password"; + + if (password && *password && password_tries < 3) + { + password_tries ++; + + return (password); + } + else + { + /* + * Give up after 3 tries or if we don't have a password to begin with... + */ + + return (NULL); + } +} + + +/* + * 'report_attr()' - Report an IPP attribute value. + */ + +static void +report_attr(ipp_attribute_t *attr) /* I - Attribute */ +{ + int i; /* Looping var */ + char value[1024], /* Value string */ + *valptr, /* Pointer into value string */ + *attrptr; /* Pointer into attribute value */ + const char *cached; /* Cached attribute */ + + + /* + * Convert the attribute values into quoted strings... + */ + + for (i = 0, valptr = value; + i < attr->num_values && valptr < (value + sizeof(value) - 10); + i ++) + { + if (i > 0) + *valptr++ = ','; + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(valptr, sizeof(value) - (valptr - value), "%d", + attr->values[i].integer); + valptr += strlen(valptr); + break; + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + *valptr++ = '\''; + *valptr++ = '\"'; + for (attrptr = attr->values[i].string.text; + *attrptr && valptr < (value + sizeof(value) - 10); + attrptr ++) + { + if (*attrptr == '\\' || *attrptr == '\"' || *attrptr == '\'') + { + *valptr++ = '\\'; + *valptr++ = '\\'; + *valptr++ = '\\'; + } + + *valptr++ = *attrptr; + } + *valptr++ = '\"'; + *valptr++ = '\''; + break; + + default : + /* + * Unsupported value type... + */ + + return; + } + } + + *valptr = '\0'; + + _cupsMutexLock(&report_mutex); + + if ((cached = cupsGetOption(attr->name, num_attr_cache, + attr_cache)) == NULL || strcmp(cached, value)) + { + /* + * Tell the scheduler about the new values... + */ + + num_attr_cache = cupsAddOption(attr->name, value, num_attr_cache, + &attr_cache); + fprintf(stderr, "ATTR: %s=%s\n", attr->name, value); + } + + _cupsMutexUnlock(&report_mutex); +} + + +/* + * 'report_printer_state()' - Report the printer state. + */ + +static void +report_printer_state(ipp_t *ipp) /* I - IPP response */ +{ + ipp_attribute_t *pa, /* printer-alert */ + *pam, /* printer-alert-message */ + *psm, /* printer-state-message */ + *reasons, /* printer-state-reasons */ + *marker; /* marker-* attributes */ + char value[1024], /* State/message string */ + *valptr; /* Pointer into string */ + static int ipp_supplies = -1; + /* Report supply levels? */ + + + /* + * Report alerts and messages... + */ + + if ((pa = ippFindAttribute(ipp, "printer-alert", IPP_TAG_TEXT)) != NULL) + report_attr(pa); + + if ((pam = ippFindAttribute(ipp, "printer-alert-message", + IPP_TAG_TEXT)) != NULL) + report_attr(pam); + + if ((psm = ippFindAttribute(ipp, "printer-state-message", + IPP_TAG_TEXT)) != NULL) + { + char *ptr; /* Pointer into message */ + + + strlcpy(value, "INFO: ", sizeof(value)); + for (ptr = psm->values[0].string.text, valptr = value + 6; + *ptr && valptr < (value + sizeof(value) - 6); + ptr ++) + { + if (*ptr < ' ' && *ptr > 0 && *ptr != '\t') + { + /* + * Substitute "" for the control character; sprintf is safe because + * we always leave 6 chars free at the end... + */ + + sprintf(valptr, "<%02X>", *ptr); + valptr += 4; + } + else + *valptr++ = *ptr; + } + + *valptr++ = '\n'; + *valptr = '\0'; + + fputs(value, stderr); + } + + /* + * Now report printer-state-reasons, filtering out some of the reasons we never + * want to set... + */ + + if ((reasons = ippFindAttribute(ipp, "printer-state-reasons", + IPP_TAG_KEYWORD)) == NULL) + return; + + update_reasons(reasons, NULL); + + /* + * Relay the current marker-* attribute values... + */ + + if (ipp_supplies < 0) + { + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *ppdattr; /* Attribute in PPD file */ + + if ((ppd = ppdOpenFile(getenv("PPD"))) != NULL && + (ppdattr = ppdFindAttr(ppd, "cupsIPPSupplies", NULL)) != NULL && + ppdattr->value && _cups_strcasecmp(ppdattr->value, "true")) + ipp_supplies = 0; + else + ipp_supplies = 1; + + ppdClose(ppd); + } + + if (ipp_supplies > 0) + { + if ((marker = ippFindAttribute(ipp, "marker-colors", IPP_TAG_NAME)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-high-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-low-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-message", + IPP_TAG_TEXT)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-names", IPP_TAG_NAME)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-types", + IPP_TAG_KEYWORD)) != NULL) + report_attr(marker); + } +} + + +#if defined(HAVE_GSSAPI) && defined(HAVE_XPC) +/* + * 'run_as_user()' - Run the IPP backend as the printing user. + * + * This function uses an XPC-based user agent to run the backend as the printing + * user. We need to do this in order to have access to the user's Kerberos + * credentials. + */ + +static int /* O - Exit status */ +run_as_user(int argc, /* I - Number of command-line args */ + char *argv[], /* I - Command-line arguments */ + uid_t uid, /* I - User ID */ + const char *device_uri, /* I - Device URI */ + int fd) /* I - File to print */ +{ + const char *auth_negotiate;/* AUTH_NEGOTIATE env var */ + xpc_connection_t conn; /* Connection to XPC service */ + xpc_object_t request; /* Request message dictionary */ + __block xpc_object_t response; /* Response message dictionary */ + dispatch_semaphore_t sem; /* Semaphore for waiting for response */ + int status = CUPS_BACKEND_FAILED; + /* Status of request */ + + + fprintf(stderr, "DEBUG: Running IPP backend as UID %d.\n", (int)uid); + + /* + * Connect to the user agent for the specified UID... + */ + + conn = xpc_connection_create_mach_service(kPMPrintUIToolAgent, + dispatch_get_global_queue(0, 0), 0); + if (!conn) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to start backend process.")); + fputs("DEBUG: Unable to create connection to agent.\n", stderr); + goto cleanup; + } + + xpc_connection_set_event_handler(conn, + ^(xpc_object_t event) + { + xpc_type_t messageType = xpc_get_type(event); + + if (messageType == XPC_TYPE_ERROR) + { + if (event == XPC_ERROR_CONNECTION_INTERRUPTED) + fprintf(stderr, "DEBUG: Interrupted connection to service %s.\n", + xpc_connection_get_name(conn)); + else if (event == XPC_ERROR_CONNECTION_INVALID) + fprintf(stderr, "DEBUG: Connection invalid for service %s.\n", + xpc_connection_get_name(conn)); + else + fprintf(stderr, "DEBUG: Unxpected error for service %s: %s\n", + xpc_connection_get_name(conn), + xpc_dictionary_get_string(event, XPC_ERROR_KEY_DESCRIPTION)); + } + }); + xpc_connection_set_target_uid(conn, uid); + xpc_connection_resume(conn); + + /* + * Try starting the backend... + */ + + request = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_int64(request, "command", kPMStartJob); + xpc_dictionary_set_string(request, "device-uri", device_uri); + xpc_dictionary_set_string(request, "job-id", argv[1]); + xpc_dictionary_set_string(request, "user", argv[2]); + xpc_dictionary_set_string(request, "title", argv[3]); + xpc_dictionary_set_string(request, "copies", argv[4]); + xpc_dictionary_set_string(request, "options", argv[5]); + xpc_dictionary_set_string(request, "auth-info-required", + getenv("AUTH_INFO_REQUIRED")); + if ((auth_negotiate = getenv("AUTH_NEGOTIATE")) != NULL) + xpc_dictionary_set_string(request, "auth-negotiate", auth_negotiate); + xpc_dictionary_set_fd(request, "stdin", fd); + xpc_dictionary_set_fd(request, "stderr", 2); + xpc_dictionary_set_fd(request, "side-channel", CUPS_SC_FD); + + sem = dispatch_semaphore_create(0); + response = NULL; + + xpc_connection_send_message_with_reply(conn, request, + dispatch_get_global_queue(0,0), + ^(xpc_object_t reply) + { + /* Save the response and wake up */ + if (xpc_get_type(reply) + == XPC_TYPE_DICTIONARY) + response = xpc_retain(reply); + + dispatch_semaphore_signal(sem); + }); + + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); + xpc_release(request); + dispatch_release(sem); + + if (response) + { + child_pid = xpc_dictionary_get_int64(response, "child-pid"); + + xpc_release(response); + + if (child_pid) + fprintf(stderr, "DEBUG: Child PID=%d.\n", child_pid); + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to start backend process.")); + fputs("DEBUG: No child PID.\n", stderr); + goto cleanup; + } + } + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to start backend process.")); + fputs("DEBUG: No reply from agent.\n", stderr); + goto cleanup; + } + + /* + * Then wait for the backend to finish... + */ + + request = xpc_dictionary_create(NULL, NULL, 0); + xpc_dictionary_set_int64(request, "command", kPMWaitForJob); + xpc_dictionary_set_fd(request, "stderr", 2); + + sem = dispatch_semaphore_create(0); + response = NULL; + + xpc_connection_send_message_with_reply(conn, request, + dispatch_get_global_queue(0,0), + ^(xpc_object_t reply) + { + /* Save the response and wake up */ + if (xpc_get_type(reply) + == XPC_TYPE_DICTIONARY) + response = xpc_retain(reply); + + dispatch_semaphore_signal(sem); + }); + + dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); + xpc_release(request); + dispatch_release(sem); + + if (response) + { + status = xpc_dictionary_get_int64(response, "status"); + + if (status == SIGTERM || status == SIGKILL || status == SIGPIPE) + { + fprintf(stderr, "DEBUG: Child terminated on signal %d.\n", status); + status = CUPS_BACKEND_FAILED; + } + else if (WIFSIGNALED(status)) + { + fprintf(stderr, "DEBUG: Child crashed on signal %d.\n", status); + status = CUPS_BACKEND_STOP; + } + else if (WIFEXITED(status)) + { + status = WEXITSTATUS(status); + fprintf(stderr, "DEBUG: Child exited with status %d.\n", status); + } + + xpc_release(response); + } + else + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to get backend exit status.")); + + cleanup: + + if (conn) + { + xpc_connection_suspend(conn); + xpc_connection_cancel(conn); + xpc_release(conn); + } + + return (status); +} +#endif /* HAVE_GSSAPI && HAVE_XPC */ + + +/* + * 'sigterm_handler()' - Handle 'terminate' signals that stop the backend. + */ + +static void +sigterm_handler(int sig) /* I - Signal */ +{ + (void)sig; /* remove compiler warnings... */ + +#if defined(HAVE_GSSAPI) && defined(HAVE_XPC) + if (child_pid) + { + kill(child_pid, sig); + child_pid = 0; + } +#endif /* HAVE_GSSAPI && HAVE_XPC */ + + if (!job_canceled) + { + /* + * Flag that the job should be canceled... + */ + + job_canceled = 1; + return; + } + + /* + * The scheduler already tried to cancel us once, now just terminate + * after removing our temp file! + */ + + if (tmpfilename[0]) + unlink(tmpfilename); + + exit(1); +} + + +/* + * 'timeout_cb()' - Handle HTTP timeouts. + */ + +static int /* O - 1 to continue, 0 to cancel */ +timeout_cb(http_t *http, /* I - Connection to server (unused) */ + void *user_data) /* I - User data (unused) */ +{ + (void)http; + (void)user_data; + + return (!job_canceled); +} + + +/* + * 'update_reasons()' - Update the printer-state-reasons values. + */ + +static void +update_reasons(ipp_attribute_t *attr, /* I - printer-state-reasons or NULL */ + const char *s) /* I - STATE: string or NULL */ +{ + char op; /* Add (+), remove (-), replace (\0) */ + cups_array_t *new_reasons; /* New reasons array */ + char *reason, /* Current reason */ + add[2048], /* Reasons added string */ + *addptr, /* Pointer into add string */ + rem[2048], /* Reasons removed string */ + *remptr; /* Pointer into remove string */ + const char *addprefix, /* Current add string prefix */ + *remprefix; /* Current remove string prefix */ + + + fprintf(stderr, "DEBUG: update_reasons(attr=%d(%s%s), s=\"%s\")\n", + attr ? attr->num_values : 0, attr ? attr->values[0].string.text : "", + attr && attr->num_values > 1 ? ",..." : "", s ? s : "(null)"); + + /* + * Create an array of new reason keyword strings... + */ + + if (attr) + { + int i; /* Looping var */ + + new_reasons = cupsArrayNew((cups_array_func_t)strcmp, NULL); + op = '\0'; + + for (i = 0; i < attr->num_values; i ++) + { + reason = attr->values[i].string.text; + + if (strcmp(reason, "none") && + strcmp(reason, "none-report") && + strcmp(reason, "paused") && + strncmp(reason, "spool-area-full", 15) && + strcmp(reason, "com.apple.print.recoverable-warning") && + strncmp(reason, "cups-", 5)) + cupsArrayAdd(new_reasons, reason); + } + } + else if (s) + { + if (*s == '+' || *s == '-') + op = *s++; + else + op = '\0'; + + new_reasons = _cupsArrayNewStrings(s); + } + else + return; + + /* + * Compute the changes... + */ + + add[0] = '\0'; + addprefix = "STATE: +"; + addptr = add; + rem[0] = '\0'; + remprefix = "STATE: -"; + remptr = rem; + + fprintf(stderr, "DEBUG2: op='%c', new_reasons=%d, state_reasons=%d\n", + op ? op : ' ', cupsArrayCount(new_reasons), + cupsArrayCount(state_reasons)); + + _cupsMutexLock(&report_mutex); + + if (op == '+') + { + /* + * Add reasons... + */ + + for (reason = (char *)cupsArrayFirst(new_reasons); + reason; + reason = (char *)cupsArrayNext(new_reasons)) + { + if (!cupsArrayFind(state_reasons, reason)) + { + if (!strncmp(reason, "cups-remote-", 12)) + { + /* + * If we are setting cups-remote-xxx, remove all other cups-remote-xxx + * keywords... + */ + + char *temp; /* Current reason in state_reasons */ + + cupsArraySave(state_reasons); + + for (temp = (char *)cupsArrayFirst(state_reasons); + temp; + temp = (char *)cupsArrayNext(state_reasons)) + if (!strncmp(temp, "cups-remote-", 12)) + { + snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix, + temp); + remptr += strlen(remptr); + remprefix = ","; + + cupsArrayRemove(state_reasons, temp); + break; + } + + cupsArrayRestore(state_reasons); + } + + cupsArrayAdd(state_reasons, reason); + + snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix, + reason); + addptr += strlen(addptr); + addprefix = ","; + } + } + } + else if (op == '-') + { + /* + * Remove reasons... + */ + + for (reason = (char *)cupsArrayFirst(new_reasons); + reason; + reason = (char *)cupsArrayNext(new_reasons)) + { + if (cupsArrayFind(state_reasons, reason)) + { + snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix, + reason); + remptr += strlen(remptr); + remprefix = ","; + + cupsArrayRemove(state_reasons, reason); + } + } + } + else + { + /* + * Replace reasons... + */ + + for (reason = (char *)cupsArrayFirst(state_reasons); + reason; + reason = (char *)cupsArrayNext(state_reasons)) + { + if (strncmp(reason, "cups-", 5) && !cupsArrayFind(new_reasons, reason)) + { + snprintf(remptr, sizeof(rem) - (remptr - rem), "%s%s", remprefix, + reason); + remptr += strlen(remptr); + remprefix = ","; + + cupsArrayRemove(state_reasons, reason); + } + } + + for (reason = (char *)cupsArrayFirst(new_reasons); + reason; + reason = (char *)cupsArrayNext(new_reasons)) + { + if (!cupsArrayFind(state_reasons, reason)) + { + cupsArrayAdd(state_reasons, reason); + + snprintf(addptr, sizeof(add) - (addptr - add), "%s%s", addprefix, + reason); + addptr += strlen(addptr); + addprefix = ","; + } + } + } + + _cupsMutexUnlock(&report_mutex); + + /* + * Report changes and return... + */ + + if (add[0] && rem[0]) + fprintf(stderr, "%s\n%s\n", add, rem); + else if (add[0]) + fprintf(stderr, "%s\n", add); + else if (rem[0]) + fprintf(stderr, "%s\n", rem); +} + +/* + * End of "$Id: ipp.c 10452 2012-05-04 23:00:01Z mike $". + */ diff --git a/backend/ipp14.c b/backend/ipp14.c new file mode 100644 index 0000000..dae5d13 --- /dev/null +++ b/backend/ipp14.c @@ -0,0 +1,1953 @@ +/* + * "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $" + * + * IPP backend for the Common UNIX Printing System (CUPS). + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the printer or server. + * cancel_job() - Cancel a print job. + * check_printer_state() - Check the printer state... + * compress_files() - Compress print files... + * password_cb() - Disable the password prompt for + * cupsDoFileRequest(). + * report_attr() - Report an IPP attribute value. + * report_printer_state() - Report the printer state. + * run_pictwps_filter() - Convert PICT files to PostScript when printing + * remotely. + * sigterm_handler() - Handle 'terminate' signals that stop the backend. + */ + +/* + * Include necessary headers. + */ + +#include +#include "backend-private.h" +#include +#include +#include + +/* + * Globals... + */ + +static char *password = NULL; /* Password for device URI */ +static int password_tries = 0; /* Password tries */ +static const char *auth_info_required = "none"; + /* New auth-info-required value */ +#ifdef __APPLE__ +static char pstmpname[1024] = ""; /* Temporary PostScript file name */ +#endif /* __APPLE__ */ +static char tmpfilename[1024] = ""; /* Temporary spool file name */ +static int job_cancelled = 0; /* Job cancelled? */ + + +/* + * Local functions... + */ + +static void cancel_job(http_t *http, const char *uri, int id, + const char *resource, const char *user, int version); +static void check_printer_state(http_t *http, const char *uri, + const char *resource, const char *user, + int version, int job_id); +#ifdef HAVE_LIBZ +static void compress_files(int num_files, char **files); +#endif /* HAVE_LIBZ */ +static const char *password_cb(const char *); +static void report_attr(ipp_attribute_t *attr); +static int report_printer_state(ipp_t *ipp, int job_id); + +#ifdef __APPLE__ +static int run_pictwps_filter(char **argv, const char *filename); +#endif /* __APPLE__ */ +static void sigterm_handler(int sig); + + +/* + * 'main()' - Send a file to the printer or server. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int send_options; /* Send job options? */ + int num_options; /* Number of printer options */ + cups_option_t *options; /* Printer options */ + const char *device_uri; /* Device URI */ + char scheme[255], /* Scheme in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info */ + resource[1024], /* Resource info (printer name) */ + addrname[256], /* Address name */ + *optptr, /* Pointer to URI options */ + *name, /* Name of option */ + *value, /* Value of option */ + sep; /* Separator character */ + int snmp_fd, /* SNMP socket */ + start_count, /* Page count via SNMP at start */ + page_count, /* Page count via SNMP */ + have_supplies; /* Printer supports supply levels? */ + int num_files; /* Number of files to print */ + char **files, /* Files to print */ + *filename; /* Pointer to single filename */ + int port; /* Port number (not used) */ + char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */ + ipp_status_t ipp_status; /* Status of IPP request */ + http_t *http; /* HTTP connection */ + ipp_t *request, /* IPP request */ + *response, /* IPP response */ + *supported; /* get-printer-attributes response */ + time_t start_time; /* Time of first connect */ + int recoverable; /* Recoverable error shown? */ + int contimeout; /* Connection timeout */ + int delay; /* Delay for retries... */ + int compression, /* Do compression of the job data? */ + waitjob, /* Wait for job complete? */ + waitprinter; /* Wait for printer ready? */ + ipp_attribute_t *job_id_attr; /* job-id attribute */ + int job_id; /* job-id value */ + ipp_attribute_t *job_sheets; /* job-media-sheets-completed */ + ipp_attribute_t *job_state; /* job-state */ + ipp_attribute_t *copies_sup; /* copies-supported */ + ipp_attribute_t *format_sup; /* document-format-supported */ + ipp_attribute_t *printer_state; /* printer-state attribute */ + ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */ + int copies, /* Number of copies for job */ + copies_remaining; /* Number of copies remaining */ + const char *content_type, /* CONTENT_TYPE environment variable */ + *final_content_type; /* FINAL_CONTENT_TYPE environment var */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + int version; /* IPP version */ + static const char * const pattrs[] = + { /* Printer attributes we want */ + "com.apple.print.recoverable-message", + "copies-supported", + "document-format-supported", + "marker-colors", + "marker-high-levels", + "marker-levels", + "marker-low-levels", + "marker-message", + "marker-names", + "marker-types", + "printer-is-accepting-jobs", + "printer-state", + "printer-state-message", + "printer-state-reasons", + }; + static const char * const jattrs[] = + { /* Job attributes we want */ + "job-media-sheets-completed", + "job-state" + }; + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE and catch SIGTERM signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGTERM); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + char *s; + + if ((s = strrchr(argv[0], '/')) != NULL) + s ++; + else + s = argv[0]; + + printf("network %s \"Unknown\" \"%s (%s)\"\n", + s, _cupsLangString(cupsLangDefault(), + _("Internet Printing Protocol")), s); + return (CUPS_BACKEND_OK); + } + else if (argc < 6) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]\n"), + argv[0]); + return (CUPS_BACKEND_STOP); + } + + /* + * Get the (final) content type... + */ + + if ((content_type = getenv("CONTENT_TYPE")) == NULL) + content_type = "application/octet-stream"; + + if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) + { + final_content_type = content_type; + + if (!strncmp(final_content_type, "printer/", 8)) + final_content_type = "application/vnd.cups-raw"; + } + + /* + * Extract the hostname and printer name from the URI... + */ + + if ((device_uri = cupsBackendDeviceURI(argv)) == NULL) + return (CUPS_BACKEND_FAILED); + + httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if (!port) + port = IPP_PORT; /* Default to port 631 */ + + if (!strcmp(scheme, "https")) + cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); + else + cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); + + /* + * See if there are any options... + */ + + compression = 0; + version = 11; + waitjob = 1; + waitprinter = 1; + contimeout = 7 * 24 * 60 * 60; + + if ((optptr = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the optptr... + */ + + *optptr++ = '\0'; + + /* + * Then parse the optptr... + */ + + while (*optptr) + { + /* + * Get the name... + */ + + name = optptr; + + while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&') + optptr ++; + + if ((sep = *optptr) != '\0') + *optptr++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = optptr; + + while (*optptr && *optptr != '+' && *optptr != '&') + optptr ++; + + if (*optptr) + *optptr++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!strcasecmp(name, "waitjob")) + { + /* + * Wait for job completion? + */ + + waitjob = !strcasecmp(value, "on") || + !strcasecmp(value, "yes") || + !strcasecmp(value, "true"); + } + else if (!strcasecmp(name, "waitprinter")) + { + /* + * Wait for printer idle? + */ + + waitprinter = !strcasecmp(value, "on") || + !strcasecmp(value, "yes") || + !strcasecmp(value, "true"); + } + else if (!strcasecmp(name, "encryption")) + { + /* + * Enable/disable encryption? + */ + + if (!strcasecmp(value, "always")) + cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); + else if (!strcasecmp(value, "required")) + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + else if (!strcasecmp(value, "never")) + cupsSetEncryption(HTTP_ENCRYPT_NEVER); + else if (!strcasecmp(value, "ifrequested")) + cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); + else + { + _cupsLangPrintf(stderr, + _("ERROR: Unknown encryption option value \"%s\"!\n"), + value); + } + } + else if (!strcasecmp(name, "version")) + { + if (!strcmp(value, "1.0")) + version = 10; + else if (!strcmp(value, "1.1")) + version = 11; + else if (!strcmp(value, "2.0")) + version = 20; + else if (!strcmp(value, "2.1")) + version = 21; + else + { + _cupsLangPrintf(stderr, + _("ERROR: Unknown version option value \"%s\"!\n"), + value); + } + } +#ifdef HAVE_LIBZ + else if (!strcasecmp(name, "compression")) + { + compression = !strcasecmp(value, "true") || + !strcasecmp(value, "yes") || + !strcasecmp(value, "on") || + !strcasecmp(value, "gzip"); + } +#endif /* HAVE_LIBZ */ + else if (!strcasecmp(name, "contimeout")) + { + /* + * Set the connection timeout... + */ + + if (atoi(value) > 0) + contimeout = atoi(value); + } + else + { + /* + * Unknown option... + */ + + _cupsLangPrintf(stderr, + _("ERROR: Unknown option \"%s\" with value \"%s\"!\n"), + name, value); + } + } + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, copy stdin to a temporary file and print the temporary + * file. + */ + + if (argc == 6) + { + /* + * Copy stdin to a temporary file... + */ + + int fd; /* File descriptor */ + http_addrlist_t *addrlist; /* Address list */ + off_t tbytes; /* Total bytes copied */ + + + fputs("STATE: +connecting-to-device\n", stderr); + fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); + + if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL) + { + _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), + hostname); + return (CUPS_BACKEND_STOP); + } + + snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family); + + if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to create temporary file")); + return (CUPS_BACKEND_FAILED); + } + + _cupsLangPuts(stderr, _("INFO: Copying print data...\n")); + + tbytes = backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, + backendNetworkSideCB); + + if (snmp_fd >= 0) + _cupsSNMPClose(snmp_fd); + + httpAddrFreeList(addrlist); + + close(fd); + + /* + * Don't try printing files less than 2 bytes... + */ + + if (tbytes <= 1) + { + _cupsLangPuts(stderr, _("ERROR: Empty print file!\n")); + unlink(tmpfilename); + return (CUPS_BACKEND_FAILED); + } + + /* + * Point to the single file from stdin... + */ + + filename = tmpfilename; + num_files = 1; + files = &filename; + send_options = 0; + } + else + { + /* + * Point to the files on the command-line... + */ + + num_files = argc - 6; + files = argv + 6; + send_options = 1; + +#ifdef HAVE_LIBZ + if (compression) + compress_files(num_files, files); +#endif /* HAVE_LIBZ */ + } + + fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files); + + /* + * Set the authentication info, if any... + */ + + cupsSetPasswordCB(password_cb); + + if (username[0]) + { + /* + * Use authenticaion information in the device URI... + */ + + if ((password = strchr(username, ':')) != NULL) + *password++ = '\0'; + + cupsSetUser(username); + } + else if (!getuid()) + { + /* + * Try loading authentication information from the environment. + */ + + const char *ptr = getenv("AUTH_USERNAME"); + + if (ptr) + cupsSetUser(ptr); + + password = getenv("AUTH_PASSWORD"); + } + + /* + * Try connecting to the remote server... + */ + + delay = 5; + recoverable = 0; + start_time = time(NULL); + + fputs("STATE: +connecting-to-device\n", stderr); + + do + { + fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port); + _cupsLangPuts(stderr, _("INFO: Connecting to printer...\n")); + + if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL) + { + if (job_cancelled) + break; + + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPuts(stderr, + _("INFO: Unable to contact printer, queuing on next " + "printer in class...\n")); + + if (tmpfilename[0]) + unlink(tmpfilename); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + if (errno == ECONNREFUSED || errno == EHOSTDOWN || + errno == EHOSTUNREACH) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); + return (CUPS_BACKEND_FAILED); + } + + recoverable = 1; + + _cupsLangPrintf(stderr, + _("WARNING: recoverable: Network host \'%s\' is busy; " + "will retry in %d seconds...\n"), + hostname, delay); + + sleep(delay); + + if (delay < 30) + delay += 5; + } + else if (h_errno) + { + _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), + hostname); + return (CUPS_BACKEND_STOP); + } + else + { + recoverable = 1; + + fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno)); + _cupsLangPuts(stderr, + _("ERROR: recoverable: Unable to connect to printer; will " + "retry in 30 seconds...\n")); + sleep(30); + } + + if (job_cancelled) + break; + } + } + while (http == NULL); + + if (job_cancelled || !http) + { + if (tmpfilename[0]) + unlink(tmpfilename); + + return (CUPS_BACKEND_FAILED); + } + + fputs("STATE: -connecting-to-device\n", stderr); + _cupsLangPuts(stderr, _("INFO: Connected to printer...\n")); + +#ifdef AF_INET6 + if (http->hostaddr->addr.sa_family == AF_INET6) + fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6)...\n", + httpAddrString(http->hostaddr, addrname, sizeof(addrname)), + ntohs(http->hostaddr->ipv6.sin6_port)); + else +#endif /* AF_INET6 */ + if (http->hostaddr->addr.sa_family == AF_INET) + fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4)...\n", + httpAddrString(http->hostaddr, addrname, sizeof(addrname)), + ntohs(http->hostaddr->ipv4.sin_port)); + + /* + * See if the printer supports SNMP... + */ + + if ((snmp_fd = _cupsSNMPOpen(http->hostaddr->addr.sa_family)) >= 0) + have_supplies = !backendSNMPSupplies(snmp_fd, http->hostaddr, &start_count, + NULL); + else + have_supplies = start_count = 0; + + /* + * Build a URI for the printer and fill the standard IPP attributes for + * an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it + * might contain username:password information... + */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname, + port, resource); + + /* + * First validate the destination and see if the device supports multiple + * copies. We have to do this because some IPP servers (e.g. HP JetDirect) + * don't support the copies attribute... + */ + + copies_sup = NULL; + format_sup = NULL; + supported = NULL; + + do + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build the IPP request... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + /* + * Do the request... + */ + + fputs("DEBUG: Getting supported attributes...\n", stderr); + + if (http->version < HTTP_1_1) + httpReconnect(http); + + if ((supported = cupsDoRequest(http, request, resource)) == NULL) + ipp_status = cupsLastError(); + else + ipp_status = supported->request.status.status_code; + + if (ipp_status > IPP_OK_CONFLICT) + { + if (ipp_status == IPP_PRINTER_BUSY || + ipp_status == IPP_SERVICE_UNAVAILABLE) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); + return (CUPS_BACKEND_FAILED); + } + + recoverable = 1; + + _cupsLangPrintf(stderr, + _("WARNING: recoverable: Network host \'%s\' is busy; " + "will retry in %d seconds...\n"), + hostname, delay); + + report_printer_state(supported, 0); + + sleep(delay); + + if (delay < 30) + delay += 5; + } + else if ((ipp_status == IPP_BAD_REQUEST || + ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) + { + /* + * Switch to IPP/1.0... + */ + + _cupsLangPrintf(stderr, + _("INFO: Printer does not support IPP/%d.%d, trying " + "IPP/1.0...\n"), version / 10, version % 10); + version = 10; + httpReconnect(http); + } + else if (ipp_status == IPP_NOT_FOUND) + { + _cupsLangPuts(stderr, _("ERROR: Destination printer does not exist!\n")); + + if (supported) + ippDelete(supported); + + return (CUPS_BACKEND_STOP); + } + else if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) + { + if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), + "Negotiate", 9)) + auth_info_required = "negotiate"; + + fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); + return (CUPS_BACKEND_AUTH_REQUIRED); + } + else + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to get printer status (%s)!\n"), + cupsLastErrorString()); + sleep(10); + } + + if (supported) + ippDelete(supported); + + continue; + } + else if ((copies_sup = ippFindAttribute(supported, "copies-supported", + IPP_TAG_RANGE)) != NULL) + { + /* + * Has the "copies-supported" attribute - does it have an upper + * bound > 1? + */ + + if (copies_sup->values[0].range.upper <= 1) + copies_sup = NULL; /* No */ + } + + format_sup = ippFindAttribute(supported, "document-format-supported", + IPP_TAG_MIMETYPE); + + if (format_sup) + { + fprintf(stderr, "DEBUG: document-format-supported (%d values)\n", + format_sup->num_values); + for (i = 0; i < format_sup->num_values; i ++) + fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i, + format_sup->values[i].string.text); + } + + report_printer_state(supported, 0); + } + while (ipp_status > IPP_OK_CONFLICT); + + /* + * See if the printer is accepting jobs and is not stopped; if either + * condition is true and we are printing to a class, requeue the job... + */ + + if (getenv("CLASS") != NULL) + { + printer_state = ippFindAttribute(supported, "printer-state", + IPP_TAG_ENUM); + printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN); + + if (printer_state == NULL || + (printer_state->values[0].integer > IPP_PRINTER_PROCESSING && + waitprinter) || + printer_accepting == NULL || + !printer_accepting->values[0].boolean) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPuts(stderr, + _("INFO: Unable to contact printer, queuing on next " + "printer in class...\n")); + + ippDelete(supported); + httpClose(http); + + if (tmpfilename[0]) + unlink(tmpfilename); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + } + + if (recoverable) + { + /* + * If we've shown a recoverable error make sure the printer proxies + * have a chance to see the recovered message. Not pretty but + * necessary for now... + */ + + fputs("INFO: recovered: \n", stderr); + sleep(5); + } + + /* + * See if the printer supports multiple copies... + */ + + copies = atoi(argv[4]); + + if (copies_sup || argc < 7) + { + copies_remaining = 1; + + if (argc < 7) + copies = 1; + } + else + copies_remaining = copies; + + /* + * Then issue the print-job request... + */ + + job_id = 0; + + while (copies_remaining > 0) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build the IPP request... + */ + + if (job_cancelled) + break; + + if (num_files > 1) + request = ippNewRequest(IPP_CREATE_JOB); + else + request = ippNewRequest(IPP_PRINT_JOB); + + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + fprintf(stderr, "DEBUG: printer-uri = \"%s\"\n", uri); + + if (argv[2][0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, argv[2]); + + fprintf(stderr, "DEBUG: requesting-user-name = \"%s\"\n", argv[2]); + + /* + * Only add a "job-name" attribute if the remote server supports + * copy generation - some IPP implementations like HP's don't seem + * to like UTF-8 job names (STR #1837)... + */ + + if (argv[3][0] && copies_sup) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, + argv[3]); + + fprintf(stderr, "DEBUG: job-name = \"%s\"\n", argv[3]); + +#ifdef HAVE_LIBZ + if (compression) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "compression", NULL, "gzip"); +#endif /* HAVE_LIBZ */ + + /* + * Handle options on the command-line... + */ + + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + +#ifdef __APPLE__ + if (!strcasecmp(final_content_type, "application/pictwps") && + num_files == 1) + { + if (format_sup != NULL) + { + for (i = 0; i < format_sup->num_values; i ++) + if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) + break; + } + + if (format_sup == NULL || i >= format_sup->num_values) + { + /* + * Remote doesn't support "application/pictwps" (i.e. it's not MacOS X) + * so convert the document to PostScript... + */ + + if (run_pictwps_filter(argv, files[0])) + { + if (pstmpname[0]) + unlink(pstmpname); + + if (tmpfilename[0]) + unlink(tmpfilename); + + return (CUPS_BACKEND_FAILED); + } + + files[0] = pstmpname; + + /* + * Change the MIME type to application/postscript and change the + * number of copies to 1... + */ + + final_content_type = "application/postscript"; + copies = 1; + copies_remaining = 1; + send_options = 0; + } + } +#endif /* __APPLE__ */ + + if (format_sup != NULL) + { + for (i = 0; i < format_sup->num_values; i ++) + if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) + break; + + if (i < format_sup->num_values) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, final_content_type); + } + + if (copies_sup && version > 10 && send_options) + { + /* + * Only send options if the destination printer supports the copies + * attribute and IPP/1.1. This is a hack for the HP and Lexmark + * implementations of IPP, which do not accept extension attributes + * and incorrectly report a client-error-bad-request error instead of + * the successful-ok-unsupported-attributes status. In short, at least + * some HP and Lexmark implementations of IPP are non-compliant. + */ + + cupsEncodeOptions(request, num_options, options); + + ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", + copies); + } + + cupsFreeOptions(num_options, options); + + /* + * If copies aren't supported, then we are likely dealing with an HP + * JetDirect. The HP IPP implementation seems to close the connection + * after every request - that is, it does *not* implement HTTP Keep- + * Alive, which is REQUIRED by HTTP/1.1... + */ + + if (!copies_sup) + httpReconnect(http); + + /* + * Do the request... + */ + + if (http->version < HTTP_1_1) + httpReconnect(http); + + if (num_files > 1) + response = cupsDoRequest(http, request, resource); + else + response = cupsDoFileRequest(http, request, resource, files[0]); + + ipp_status = cupsLastError(); + + if (ipp_status > IPP_OK_CONFLICT) + { + job_id = 0; + + if (job_cancelled) + break; + + if (ipp_status == IPP_SERVICE_UNAVAILABLE || + ipp_status == IPP_PRINTER_BUSY) + { + _cupsLangPuts(stderr, + _("INFO: Printer busy; will retry in 10 seconds...\n")); + sleep(10); + } + else if ((ipp_status == IPP_BAD_REQUEST || + ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) + { + /* + * Switch to IPP/1.0... + */ + + _cupsLangPrintf(stderr, + _("INFO: Printer does not support IPP/%d.%d, trying " + "IPP/1.0...\n"), version / 10, version % 10); + version = 10; + httpReconnect(http); + } + else + { + /* + * Update auth-info-required as needed... + */ + + _cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"), + cupsLastErrorString()); + + if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) + { + fprintf(stderr, "DEBUG: WWW-Authenticate=\"%s\"\n", + httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE)); + + /* + * Normal authentication goes through the password callback, which sets + * auth_info_required to "username,password". Kerberos goes directly + * through GSSAPI, so look for Negotiate in the WWW-Authenticate header + * here and set auth_info_required as needed... + */ + + if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), + "Negotiate", 9)) + auth_info_required = "negotiate"; + } + } + } + else if ((job_id_attr = ippFindAttribute(response, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + _cupsLangPuts(stderr, + _("NOTICE: Print file accepted - job ID unknown.\n")); + job_id = 0; + } + else + { + job_id = job_id_attr->values[0].integer; + _cupsLangPrintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"), + job_id); + } + + ippDelete(response); + + if (job_cancelled) + break; + + if (job_id && num_files > 1) + { + for (i = 0; i < num_files; i ++) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Send the next file in the job... + */ + + request = ippNewRequest(IPP_SEND_DOCUMENT); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + + if (argv[2][0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, argv[2]); + + if ((i + 1) == num_files) + ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, content_type); + + if (http->version < HTTP_1_1) + httpReconnect(http); + + ippDelete(cupsDoFileRequest(http, request, resource, files[i])); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + ipp_status = cupsLastError(); + + _cupsLangPrintf(stderr, + _("ERROR: Unable to add file %d to job: %s\n"), + job_id, cupsLastErrorString()); + break; + } + } + } + + if (ipp_status <= IPP_OK_CONFLICT && argc > 6) + { + fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1); + copies_remaining --; + } + else if (ipp_status == IPP_SERVICE_UNAVAILABLE || + ipp_status == IPP_PRINTER_BUSY) + continue; + else + copies_remaining --; + + /* + * Wait for the job to complete... + */ + + if (!job_id || !waitjob) + continue; + + _cupsLangPuts(stderr, _("INFO: Waiting for job to complete...\n")); + + for (delay = 1; !job_cancelled;) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, http->hostaddr); + + /* + * Build an IPP_GET_JOB_ATTRIBUTES request... + */ + + request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + + if (argv[2][0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, argv[2]); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]), + NULL, jattrs); + + /* + * Do the request... + */ + + if (!copies_sup || http->version < HTTP_1_1) + httpReconnect(http); + + response = cupsDoRequest(http, request, resource); + ipp_status = cupsLastError(); + + if (ipp_status == IPP_NOT_FOUND) + { + /* + * Job has gone away and/or the server has no job history... + */ + + ippDelete(response); + + ipp_status = IPP_OK; + break; + } + + if (ipp_status > IPP_OK_CONFLICT) + { + if (ipp_status != IPP_SERVICE_UNAVAILABLE && + ipp_status != IPP_PRINTER_BUSY) + { + ippDelete(response); + + _cupsLangPrintf(stderr, + _("ERROR: Unable to get job %d attributes (%s)!\n"), + job_id, cupsLastErrorString()); + break; + } + } + + if (response) + { + if ((job_state = ippFindAttribute(response, "job-state", + IPP_TAG_ENUM)) != NULL) + { + /* + * Stop polling if the job is finished or pending-held... + */ + + if (job_state->values[0].integer > IPP_JOB_STOPPED) + { + if ((job_sheets = ippFindAttribute(response, + "job-media-sheets-completed", + IPP_TAG_INTEGER)) != NULL) + fprintf(stderr, "PAGE: total %d\n", + job_sheets->values[0].integer); + + ippDelete(response); + break; + } + } + else + { + /* + * If the printer does not return a job-state attribute, it does not + * conform to the IPP specification - break out immediately and fail + * the job... + */ + + fputs("DEBUG: No job-state available from printer - stopping queue.\n", + stderr); + ipp_status = IPP_INTERNAL_ERROR; + break; + } + } + + ippDelete(response); + + /* + * Check the printer state and report it if necessary... + */ + + check_printer_state(http, uri, resource, argv[2], version, job_id); + + /* + * Wait 1-10 seconds before polling again... + */ + + sleep(delay); + + delay ++; + if (delay > 10) + delay = 1; + } + } + + /* + * Cancel the job as needed... + */ + + if (job_cancelled && job_id) + cancel_job(http, uri, job_id, resource, argv[2], version); + + /* + * Check the printer state and report it if necessary... + */ + + check_printer_state(http, uri, resource, argv[2], version, job_id); + + /* + * Collect the final page count as needed... + */ + + if (have_supplies && + !backendSNMPSupplies(snmp_fd, http->hostaddr, &page_count, NULL) && + page_count > start_count) + fprintf(stderr, "PAGE: total %d\n", page_count - start_count); + +#ifdef HAVE_GSSAPI + /* + * See if we used Kerberos at all... + */ + + if (http->gssctx) + auth_info_required = "negotiate"; +#endif /* HAVE_GSSAPI */ + + /* + * Free memory... + */ + + httpClose(http); + + ippDelete(supported); + + /* + * Remove the temporary file(s) if necessary... + */ + + if (tmpfilename[0]) + unlink(tmpfilename); + +#ifdef HAVE_LIBZ + if (compression) + { + for (i = 0; i < num_files; i ++) + unlink(files[i]); + } +#endif /* HAVE_LIBZ */ + +#ifdef __APPLE__ + if (pstmpname[0]) + unlink(pstmpname); +#endif /* __APPLE__ */ + + /* + * Return the queue status... + */ + + fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); + + if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) + return (CUPS_BACKEND_AUTH_REQUIRED); + else if (ipp_status == IPP_INTERNAL_ERROR) + return (CUPS_BACKEND_STOP); + else if (ipp_status > IPP_OK_CONFLICT) + return (CUPS_BACKEND_FAILED); + else + { + _cupsLangPuts(stderr, _("INFO: Ready to print.\n")); + return (CUPS_BACKEND_OK); + } +} + + +/* + * 'cancel_job()' - Cancel a print job. + */ + +static void +cancel_job(http_t *http, /* I - HTTP connection */ + const char *uri, /* I - printer-uri */ + int id, /* I - job-id */ + const char *resource, /* I - Resource path */ + const char *user, /* I - requesting-user-name */ + int version) /* I - IPP version */ +{ + ipp_t *request; /* Cancel-Job request */ + + + _cupsLangPuts(stderr, _("INFO: Canceling print job...\n")); + + request = ippNewRequest(IPP_CANCEL_JOB); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", id); + + if (user && user[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + /* + * Do the request... + */ + + if (http->version < HTTP_1_1) + httpReconnect(http); + + ippDelete(cupsDoRequest(http, request, resource)); + + if (cupsLastError() > IPP_OK_CONFLICT) + _cupsLangPrintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id, + cupsLastErrorString()); +} + + +/* + * 'check_printer_state()' - Check the printer state... + */ + +static void +check_printer_state( + http_t *http, /* I - HTTP connection */ + const char *uri, /* I - Printer URI */ + const char *resource, /* I - Resource path */ + const char *user, /* I - Username, if any */ + int version, /* I - IPP version */ + int job_id) /* I - Current job ID */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + static const char * const attrs[] = /* Attributes we want */ + { + "com.apple.print.recoverable-message", + "marker-colors", + "marker-levels", + "marker-message", + "marker-names", + "marker-types", + "printer-state-message", + "printer-state-reasons" + }; + + + /* + * Check on the printer state... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + request->request.op.version[0] = version / 10; + request->request.op.version[1] = version % 10; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + if (user && user[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(attrs) / sizeof(attrs[0])), NULL, attrs); + + /* + * Do the request... + */ + + if (http->version < HTTP_1_1) + httpReconnect(http); + + if ((response = cupsDoRequest(http, request, resource)) != NULL) + { + report_printer_state(response, job_id); + ippDelete(response); + } +} + + +#ifdef HAVE_LIBZ +/* + * 'compress_files()' - Compress print files... + */ + +static void +compress_files(int num_files, /* I - Number of files */ + char **files) /* I - Files */ +{ + int i, /* Looping var */ + fd; /* Temporary file descriptor */ + ssize_t bytes; /* Bytes read/written */ + size_t total; /* Total bytes read */ + cups_file_t *in, /* Input file */ + *out; /* Output file */ + struct stat outinfo; /* Output file information */ + char filename[1024], /* Temporary filename */ + buffer[32768]; /* Copy buffer */ + + + fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files); + for (i = 0; i < num_files; i ++) + { + if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to create temporary compressed print " + "file: %s\n"), strerror(errno)); + exit(CUPS_BACKEND_FAILED); + } + + if ((out = cupsFileOpenFd(fd, "w9")) == NULL) + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to open temporary compressed print " + "file: %s\n"), strerror(errno)); + exit(CUPS_BACKEND_FAILED); + } + + if ((in = cupsFileOpen(files[i], "r")) == NULL) + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to open print file \"%s\": %s\n"), + files[i], strerror(errno)); + cupsFileClose(out); + exit(CUPS_BACKEND_FAILED); + } + + total = 0; + while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0) + if (cupsFileWrite(out, buffer, bytes) < bytes) + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to write %d bytes to \"%s\": %s\n"), + (int)bytes, filename, strerror(errno)); + cupsFileClose(in); + cupsFileClose(out); + exit(CUPS_BACKEND_FAILED); + } + else + total += bytes; + + cupsFileClose(out); + cupsFileClose(in); + + files[i] = strdup(filename); + + if (!stat(filename, &outinfo)) + fprintf(stderr, + "DEBUG: File %d compressed to %.1f%% of original size, " + CUPS_LLFMT " bytes...\n", + i + 1, 100.0 * outinfo.st_size / total, + CUPS_LLCAST outinfo.st_size); + } +} +#endif /* HAVE_LIBZ */ + + +/* + * 'password_cb()' - Disable the password prompt for cupsDoFileRequest(). + */ + +static const char * /* O - Password */ +password_cb(const char *prompt) /* I - Prompt (not used) */ +{ + (void)prompt; + + /* + * Remember that we need to authenticate... + */ + + auth_info_required = "username,password"; + + if (password && *password && password_tries < 3) + { + password_tries ++; + + return (password); + } + else + { + /* + * Give up after 3 tries or if we don't have a password to begin with... + */ + + return (NULL); + } +} + + +/* + * 'report_attr()' - Report an IPP attribute value. + */ + +static void +report_attr(ipp_attribute_t *attr) /* I - Attribute */ +{ + int i; /* Looping var */ + char value[1024], /* Value string */ + *valptr, /* Pointer into value string */ + *attrptr; /* Pointer into attribute value */ + + + /* + * Convert the attribute values into quoted strings... + */ + + for (i = 0, valptr = value; + i < attr->num_values && valptr < (value + sizeof(value) - 10); + i ++) + { + if (i > 0) + *valptr++ = ','; + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(valptr, sizeof(value) - (valptr - value), "%d", + attr->values[i].integer); + valptr += strlen(valptr); + break; + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + *valptr++ = '\"'; + for (attrptr = attr->values[i].string.text; + *attrptr && valptr < (value + sizeof(value) - 10); + attrptr ++) + { + if (*attrptr == '\\' || *attrptr == '\"') + *valptr++ = '\\'; + + *valptr++ = *attrptr; + } + *valptr++ = '\"'; + break; + + default : + /* + * Unsupported value type... + */ + + return; + } + } + + *valptr = '\0'; + + /* + * Tell the scheduler about the new values... + */ + + fprintf(stderr, "ATTR: %s=%s\n", attr->name, value); +} + + +/* + * 'report_printer_state()' - Report the printer state. + */ + +static int /* O - Number of reasons shown */ +report_printer_state(ipp_t *ipp, /* I - IPP response */ + int job_id) /* I - Current job ID */ +{ + int i; /* Looping var */ + int count; /* Count of reasons shown... */ + ipp_attribute_t *caprm, /* com.apple.print.recoverable-message */ + *psm, /* printer-state-message */ + *reasons, /* printer-state-reasons */ + *marker; /* marker-* attributes */ + const char *reason; /* Current reason */ + const char *prefix; /* Prefix for STATE: line */ + char state[1024]; /* State string */ + int saw_caprw; /* Saw com.apple.print.recoverable-warning state */ + + + if ((psm = ippFindAttribute(ipp, "printer-state-message", + IPP_TAG_TEXT)) != NULL) + fprintf(stderr, "INFO: %s\n", psm->values[0].string.text); + + if ((reasons = ippFindAttribute(ipp, "printer-state-reasons", + IPP_TAG_KEYWORD)) == NULL) + return (0); + + saw_caprw = 0; + state[0] = '\0'; + prefix = "STATE: "; + + for (i = 0, count = 0; i < reasons->num_values; i ++) + { + reason = reasons->values[i].string.text; + + if (!strcmp(reason, "com.apple.print.recoverable-warning")) + saw_caprw = 1; + else if (strcmp(reason, "paused")) + { + strlcat(state, prefix, sizeof(state)); + strlcat(state, reason, sizeof(state)); + + prefix = ","; + } + } + + if (state[0]) + fprintf(stderr, "%s\n", state); + + /* + * Relay com.apple.print.recoverable-message... + */ + + if ((caprm = ippFindAttribute(ipp, "com.apple.print.recoverable-message", + IPP_TAG_TEXT)) != NULL) + fprintf(stderr, "WARNING: %s: %s\n", + saw_caprw ? "recoverable" : "recovered", + caprm->values[0].string.text); + + /* + * Relay the current marker-* attribute values... + */ + + if ((marker = ippFindAttribute(ipp, "marker-colors", IPP_TAG_NAME)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-high-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-low-levels", + IPP_TAG_INTEGER)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-message", IPP_TAG_TEXT)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-names", IPP_TAG_NAME)) != NULL) + report_attr(marker); + if ((marker = ippFindAttribute(ipp, "marker-types", IPP_TAG_KEYWORD)) != NULL) + report_attr(marker); + + return (count); +} + + +#ifdef __APPLE__ +/* + * 'run_pictwps_filter()' - Convert PICT files to PostScript when printing + * remotely. + * + * This step is required because the PICT format is not documented and + * subject to change, so developing a filter for other OS's is infeasible. + * Also, fonts required by the PICT file need to be embedded on the + * client side (which has the fonts), so we run the filter to get a + * PostScript file for printing... + */ + +static int /* O - Exit status of filter */ +run_pictwps_filter(char **argv, /* I - Command-line arguments */ + const char *filename)/* I - Filename */ +{ + struct stat fileinfo; /* Print file information */ + const char *ppdfile; /* PPD file for destination printer */ + int pid; /* Child process ID */ + int fd; /* Temporary file descriptor */ + int status; /* Exit status of filter */ + const char *printer; /* PRINTER env var */ + static char ppdenv[1024]; /* PPD environment variable */ + + + /* + * First get the PPD file for the printer... + */ + + printer = getenv("PRINTER"); + if (!printer) + { + _cupsLangPuts(stderr, + _("ERROR: PRINTER environment variable not defined!\n")); + return (-1); + } + + if ((ppdfile = cupsGetPPD(printer)) == NULL) + { + _cupsLangPrintf(stderr, + _("ERROR: Unable to get PPD file for printer \"%s\" - " + "%s.\n"), printer, cupsLastErrorString()); + } + else + { + snprintf(ppdenv, sizeof(ppdenv), "PPD=%s", ppdfile); + putenv(ppdenv); + } + + /* + * Then create a temporary file for printing... + */ + + if ((fd = cupsTempFd(pstmpname, sizeof(pstmpname))) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to create temporary file")); + if (ppdfile) + unlink(ppdfile); + return (-1); + } + + /* + * Get the owner of the spool file - it is owned by the user we want to run + * as... + */ + + if (argv[6]) + stat(argv[6], &fileinfo); + else + { + /* + * Use the OSX defaults, as an up-stream filter created the PICT + * file... + */ + + fileinfo.st_uid = 1; + fileinfo.st_gid = 80; + } + + if (ppdfile) + chown(ppdfile, fileinfo.st_uid, fileinfo.st_gid); + + fchown(fd, fileinfo.st_uid, fileinfo.st_gid); + + /* + * Finally, run the filter to convert the file... + */ + + if ((pid = fork()) == 0) + { + /* + * Child process for pictwpstops... Redirect output of pictwpstops to a + * file... + */ + + dup2(fd, 1); + close(fd); + + if (!getuid()) + { + /* + * Change to an unpriviledged user... + */ + + if (setgid(fileinfo.st_gid)) + return (errno); + + if (setuid(fileinfo.st_uid)) + return (errno); + } + + execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5], + filename, NULL); + _cupsLangPrintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"), + strerror(errno)); + return (errno); + } + + close(fd); + + if (pid < 0) + { + /* + * Error! + */ + + _cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"), + strerror(errno)); + if (ppdfile) + unlink(ppdfile); + return (-1); + } + + /* + * Now wait for the filter to complete... + */ + + if (wait(&status) < 0) + { + _cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"), + strerror(errno)); + close(fd); + if (ppdfile) + unlink(ppdfile); + return (-1); + } + + if (ppdfile) + unlink(ppdfile); + + close(fd); + + if (status) + { + if (status >= 256) + _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"), + status / 256); + else + _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"), + status); + + return (status); + } + + /* + * Return with no errors.. + */ + + return (0); +} +#endif /* __APPLE__ */ + + +/* + * 'sigterm_handler()' - Handle 'terminate' signals that stop the backend. + */ + +static void +sigterm_handler(int sig) /* I - Signal */ +{ + (void)sig; /* remove compiler warnings... */ + + if (!job_cancelled) + { + /* + * Flag that the job should be cancelled... + */ + + job_cancelled = 1; + return; + } + + /* + * The scheduler already tried to cancel us once, now just terminate + * after removing our temp files! + */ + + if (tmpfilename[0]) + unlink(tmpfilename); + +#ifdef __APPLE__ + if (pstmpname[0]) + unlink(pstmpname); +#endif /* __APPLE__ */ + + exit(1); +} + + +/* + * End of "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $". + */ diff --git a/backend/lpd.c b/backend/lpd.c new file mode 100644 index 0000000..7837b34 --- /dev/null +++ b/backend/lpd.c @@ -0,0 +1,1306 @@ +/* + * "$Id: lpd.c 10265 2012-02-12 07:20:10Z mike $" + * + * Line Printer Daemon backend for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the printer or server. + * lpd_command() - Send an LPR command sequence and wait for a reply. + * lpd_queue() - Queue a file using the Line Printer Daemon protocol. + * lpd_write() - Write a buffer of data to an LPD server. + * rresvport_af() - A simple implementation of rresvport_af(). + * sigterm_handler() - Handle 'terminate' signals that stop the backend. + */ + +/* + * Include necessary headers. + */ + +#include +#include "backend-private.h" +#include +#include +#include +#include + +#ifdef WIN32 +# include +#else +# include +# include +# include +# include +#endif /* WIN32 */ +#ifdef __APPLE__ +# include +# include +#endif /* __APPLE__ */ + + +/* + * Globals... + */ + +static char tmpfilename[1024] = ""; /* Temporary spool file name */ +static int abort_job = 0; /* Non-zero if we get SIGTERM */ + + +/* + * Print mode... + */ + +#define MODE_STANDARD 0 /* Queue a copy */ +#define MODE_STREAM 1 /* Stream a copy */ + + +/* + * The order for control and data files in LPD requests... + */ + +#define ORDER_CONTROL_DATA 0 /* Control file first, then data */ +#define ORDER_DATA_CONTROL 1 /* Data file first, then control */ + + +/* + * What to reserve... + */ + +#define RESERVE_NONE 0 /* Don't reserve a priviledged port */ +#define RESERVE_RFC1179 1 /* Reserve port 721-731 */ +#define RESERVE_ANY 2 /* Reserve port 1-1023 */ + + +/* + * Local functions... + */ + +static int lpd_command(int lpd_fd, char *format, ...); +static int lpd_queue(const char *hostname, http_addrlist_t *addrlist, + const char *printer, int print_fd, int snmp_fd, + int mode, const char *user, const char *title, + int copies, int banner, int format, int order, + int reserve, int manual_copies, int timeout, + int contimeout); +static int lpd_write(int lpd_fd, char *buffer, int length); +#ifndef HAVE_RRESVPORT_AF +static int rresvport_af(int *port, int family); +#endif /* !HAVE_RRESVPORT_AF */ +static void sigterm_handler(int sig); + + +/* + * 'main()' - Send a file to the printer or server. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + const char *device_uri; /* Device URI */ + char scheme[255], /* Scheme in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info */ + resource[1024], /* Resource info (printer name) */ + *options, /* Pointer to options */ + *name, /* Name of option */ + *value, /* Value of option */ + sep, /* Separator character */ + *filename, /* File to print */ + title[256]; /* Title string */ + int port; /* Port number */ + char portname[256]; /* Port name (string) */ + http_addrlist_t *addrlist; /* List of addresses for printer */ + int snmp_fd; /* SNMP socket */ + int fd; /* Print file */ + int status; /* Status of LPD job */ + int mode; /* Print mode */ + int banner; /* Print banner page? */ + int format; /* Print format */ + int order; /* Order of control/data files */ + int reserve; /* Reserve priviledged port? */ + int sanitize_title; /* Sanitize title string? */ + int manual_copies, /* Do manual copies? */ + timeout, /* Timeout */ + contimeout, /* Connection timeout */ + copies; /* Number of copies */ + ssize_t bytes = 0; /* Initial bytes read */ + char buffer[16384]; /* Initial print buffer */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE and catch SIGTERM signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGTERM); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + printf("network lpd \"Unknown\" \"%s\"\n", + _cupsLangString(cupsLangDefault(), _("LPD/LPR Host or Printer"))); + return (CUPS_BACKEND_OK); + } + else if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_FAILED); + } + + /* + * Extract the hostname and printer name from the URI... + */ + + while ((device_uri = cupsBackendDeviceURI(argv)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", _("Unable to locate printer.")); + sleep(10); + + if (getenv("CLASS") != NULL) + return (CUPS_BACKEND_FAILED); + } + + httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if (!port) + port = 515; /* Default to port 515 */ + + if (!username[0]) + { + /* + * If no username is in the device URI, then use the print job user... + */ + + strlcpy(username, argv[2], sizeof(username)); + } + + /* + * See if there are any options... + */ + + mode = MODE_STANDARD; + banner = 0; + format = 'l'; + order = ORDER_CONTROL_DATA; + reserve = RESERVE_ANY; + manual_copies = 1; + timeout = 300; + contimeout = 7 * 24 * 60 * 60; + +#ifdef __APPLE__ + /* + * We want to pass UTF-8 characters by default, not re-map them (3071945) + */ + + sanitize_title = 0; +#else + /* + * Otherwise we want to re-map UTF-8 to "safe" characters by default... + */ + + sanitize_title = 1; +#endif /* __APPLE__ */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + + /* + * Parse options... + */ + + while (*options) + { + /* + * Get the name... + */ + + name = options; + + while (*options && *options != '=' && *options != '+' && *options != '&') + options ++; + + if ((sep = *options) != '\0') + *options++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = options; + + while (*options && *options != '+' && *options != '&') + options ++; + + if (*options) + *options++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!_cups_strcasecmp(name, "banner")) + { + /* + * Set the banner... + */ + + banner = !value[0] || !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "format") && value[0]) + { + /* + * Set output format... + */ + + if (strchr("cdfglnoprtv", value[0])) + format = value[0]; + else + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown format character: \"%c\"."), + value[0]); + } + else if (!_cups_strcasecmp(name, "mode") && value[0]) + { + /* + * Set control/data order... + */ + + if (!_cups_strcasecmp(value, "standard")) + mode = MODE_STANDARD; + else if (!_cups_strcasecmp(value, "stream")) + mode = MODE_STREAM; + else + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown print mode: \"%s\"."), value); + } + else if (!_cups_strcasecmp(name, "order") && value[0]) + { + /* + * Set control/data order... + */ + + if (!_cups_strcasecmp(value, "control,data")) + order = ORDER_CONTROL_DATA; + else if (!_cups_strcasecmp(value, "data,control")) + order = ORDER_DATA_CONTROL; + else + _cupsLangPrintFilter(stderr, "ERROR", + _("Unknown file order: \"%s\"."), value); + } + else if (!_cups_strcasecmp(name, "reserve")) + { + /* + * Set port reservation mode... + */ + + if (!value[0] || !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "true") || + !_cups_strcasecmp(value, "rfc1179")) + reserve = RESERVE_RFC1179; + else if (!_cups_strcasecmp(value, "any")) + reserve = RESERVE_ANY; + else + reserve = RESERVE_NONE; + } + else if (!_cups_strcasecmp(name, "manual_copies")) + { + /* + * Set manual copies... + */ + + manual_copies = !value[0] || !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "sanitize_title")) + { + /* + * Set sanitize title... + */ + + sanitize_title = !value[0] || !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "timeout")) + { + /* + * Set the timeout... + */ + + if (atoi(value) > 0) + timeout = atoi(value); + } + else if (!_cups_strcasecmp(name, "contimeout")) + { + /* + * Set the connection timeout... + */ + + if (atoi(value) > 0) + contimeout = atoi(value); + } + } + } + + if (mode == MODE_STREAM) + order = ORDER_CONTROL_DATA; + + /* + * Find the printer... + */ + + snprintf(portname, sizeof(portname), "%d", port); + + fputs("STATE: +connecting-to-device\n", stderr); + fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); + + while ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to locate printer \"%s\"."), hostname); + sleep(10); + + if (getenv("CLASS") != NULL) + { + fputs("STATE: -connecting-to-device\n", stderr); + exit(CUPS_BACKEND_FAILED); + } + } + + snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family); + + /* + * Wait for data from the filter... + */ + + if (argc == 6) + { + if (!backendWaitLoop(snmp_fd, &(addrlist->addr), 0, backendNetworkSideCB)) + return (CUPS_BACKEND_OK); + else if (mode == MODE_STANDARD && + (bytes = read(0, buffer, sizeof(buffer))) <= 0) + return (CUPS_BACKEND_OK); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, copy stdin to a temporary file and print the temporary + * file. + */ + + if (argc == 6 && mode == MODE_STANDARD) + { + /* + * Copy stdin to a temporary file... + */ + + if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0) + { + perror("DEBUG: Unable to create temporary file"); + return (CUPS_BACKEND_FAILED); + } + + _cupsLangPrintFilter(stderr, "INFO", _("Copying print data.")); + + if (bytes > 0) + write(fd, buffer, bytes); + + backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, + backendNetworkSideCB); + } + else if (argc == 6) + { + /* + * Stream from stdin... + */ + + filename = NULL; + fd = 0; + } + else + { + filename = argv[6]; + fd = open(filename, O_RDONLY); + + if (fd == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + } + + /* + * Sanitize the document title... + */ + + strlcpy(title, argv[3], sizeof(title)); + + if (sanitize_title) + { + /* + * Sanitize the title string so that we don't cause problems on + * the remote end... + */ + + char *ptr; + + for (ptr = title; *ptr; ptr ++) + if (!isalnum(*ptr & 255) && !isspace(*ptr & 255)) + *ptr = '_'; + } + + /* + * Queue the job... + */ + + if (argc > 6) + { + if (manual_copies) + { + manual_copies = atoi(argv[4]); + copies = 1; + } + else + { + manual_copies = 1; + copies = atoi(argv[4]); + } + + status = lpd_queue(hostname, addrlist, resource + 1, fd, snmp_fd, mode, + username, title, copies, banner, format, order, reserve, + manual_copies, timeout, contimeout); + + if (!status) + fprintf(stderr, "PAGE: 1 %d\n", atoi(argv[4])); + } + else + status = lpd_queue(hostname, addrlist, resource + 1, fd, snmp_fd, mode, + username, title, 1, banner, format, order, reserve, 1, + timeout, contimeout); + + /* + * Remove the temporary file if necessary... + */ + + if (tmpfilename[0]) + unlink(tmpfilename); + + if (fd) + close(fd); + + if (snmp_fd >= 0) + _cupsSNMPClose(snmp_fd); + + /* + * Return the queue status... + */ + + return (status); +} + + +/* + * 'lpd_command()' - Send an LPR command sequence and wait for a reply. + */ + +static int /* O - Status of command */ +lpd_command(int fd, /* I - Socket connection to LPD host */ + char *format, /* I - printf()-style format string */ + ...) /* I - Additional args as necessary */ +{ + va_list ap; /* Argument pointer */ + char buf[1024]; /* Output buffer */ + int bytes; /* Number of bytes to output */ + char status; /* Status from command */ + + + /* + * Don't try to send commands if the job has been canceled... + */ + + if (abort_job) + return (-1); + + /* + * Format the string... + */ + + va_start(ap, format); + bytes = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + fprintf(stderr, "DEBUG: lpd_command %2.2x %s", buf[0], buf + 1); + + /* + * Send the command... + */ + + fprintf(stderr, "DEBUG: Sending command string (%d bytes)...\n", bytes); + + if (lpd_write(fd, buf, bytes) < bytes) + { + perror("DEBUG: Unable to send LPD command"); + return (-1); + } + + /* + * Read back the status from the command and return it... + */ + + fputs("DEBUG: Reading command status...\n", stderr); + + if (recv(fd, &status, 1, 0) < 1) + { + _cupsLangPrintFilter(stderr, "WARNING", _("Printer did not respond.")); + status = errno; + } + + fprintf(stderr, "DEBUG: lpd_command returning %d\n", status); + + return (status); +} + + +/* + * 'lpd_queue()' - Queue a file using the Line Printer Daemon protocol. + */ + +static int /* O - Zero on success, non-zero on failure */ +lpd_queue(const char *hostname, /* I - Host to connect to */ + http_addrlist_t *addrlist, /* I - List of host addresses */ + const char *printer, /* I - Printer/queue name */ + int print_fd, /* I - File to print */ + int snmp_fd, /* I - SNMP socket */ + int mode, /* I - Print mode */ + const char *user, /* I - Requesting user */ + const char *title, /* I - Job title */ + int copies, /* I - Number of copies */ + int banner, /* I - Print LPD banner? */ + int format, /* I - Format specifier */ + int order, /* I - Order of data/control files */ + int reserve, /* I - Reserve ports? */ + int manual_copies,/* I - Do copies by hand... */ + int timeout, /* I - Timeout... */ + int contimeout) /* I - Connection timeout */ +{ + char localhost[255]; /* Local host name */ + int error; /* Error number */ + struct stat filestats; /* File statistics */ + int lport; /* LPD connection local port */ + int fd; /* LPD socket */ + char control[10240], /* LPD control 'file' */ + *cptr; /* Pointer into control file string */ + char status; /* Status byte from command */ + int delay; /* Delay for retries... */ + char addrname[256]; /* Address name */ + http_addrlist_t *addr; /* Socket address */ + int have_supplies; /* Printer supports supply levels? */ + int copy; /* Copies written */ + time_t start_time; /* Time of first connect */ + size_t nbytes; /* Number of bytes written */ + off_t tbytes; /* Total bytes written */ + char buffer[32768]; /* Output buffer */ +#ifdef WIN32 + DWORD tv; /* Timeout in milliseconds */ +#else + struct timeval tv; /* Timeout in secs and usecs */ +#endif /* WIN32 */ + + + /* + * Remember when we started trying to connect to the printer... + */ + + start_time = time(NULL); + + /* + * Loop forever trying to print the file... + */ + + while (!abort_job) + { + /* + * First try to reserve a port for this connection... + */ + + fprintf(stderr, "DEBUG: Connecting to %s:%d for printer %s\n", hostname, + _httpAddrPort(&(addrlist->addr)), printer); + _cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer.")); + + for (lport = reserve == RESERVE_RFC1179 ? 732 : 1024, addr = addrlist, + delay = 5;; + addr = addr->next) + { + /* + * Stop if this job has been canceled... + */ + + if (abort_job) + return (CUPS_BACKEND_FAILED); + + /* + * Choose the next priviledged port... + */ + + if (!addr) + addr = addrlist; + + lport --; + + if (lport < 721 && reserve == RESERVE_RFC1179) + lport = 731; + else if (lport < 1) + lport = 1023; + +#ifdef HAVE_GETEUID + if (geteuid() || !reserve) +#else + if (getuid() || !reserve) +#endif /* HAVE_GETEUID */ + { + /* + * Just create a regular socket... + */ + + if ((fd = socket(addr->addr.addr.sa_family, SOCK_STREAM, 0)) < 0) + { + perror("DEBUG: Unable to create socket"); + sleep(1); + + continue; + } + + lport = 0; + } + else + { + /* + * We're running as root and want to comply with RFC 1179. Reserve a + * priviledged lport between 721 and 731... + */ + + if ((fd = rresvport_af(&lport, addr->addr.addr.sa_family)) < 0) + { + perror("DEBUG: Unable to reserve port"); + sleep(1); + + continue; + } + } + + /* + * Connect to the printer or server... + */ + + if (abort_job) + { + close(fd); + + return (CUPS_BACKEND_FAILED); + } + + if (!connect(fd, &(addr->addr.addr), httpAddrLength(&(addr->addr)))) + break; + + error = errno; + close(fd); + + if (addr->next) + continue; + + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(error)); + + if (error == ECONNREFUSED || error == EHOSTDOWN || + error == EHOSTUNREACH) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + return (CUPS_BACKEND_FAILED); + } + + switch (error) + { + case EHOSTDOWN : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer may not exist or " + "is unavailable at this time.")); + break; + + case EHOSTUNREACH : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is unreachable at " + "this time.")); + break; + + case ECONNREFUSED : + default : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is busy.")); + break; + } + + sleep(delay); + + if (delay < 30) + delay += 5; + } + else if (error == EADDRINUSE) + { + /* + * Try on another port... + */ + + sleep(1); + } + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + sleep(30); + } + } + + /* + * Set the timeout... + */ + +#ifdef WIN32 + tv = (DWORD)(timeout * 1000); + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); +#else + tv.tv_sec = timeout; + tv.tv_usec = 0; + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); +#endif /* WIN32 */ + + fputs("STATE: -connecting-to-device\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", _("Connected to printer.")); + + fprintf(stderr, "DEBUG: Connected to %s:%d (local port %d)...\n", + httpAddrString(&(addr->addr), addrname, sizeof(addrname)), + _httpAddrPort(&(addr->addr)), lport); + + /* + * See if the printer supports SNMP... + */ + + if (snmp_fd >= 0) + have_supplies = !backendSNMPSupplies(snmp_fd, &(addrlist->addr), NULL, + NULL); + else + have_supplies = 0; + + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, &(addrlist->addr)); + + /* + * Next, open the print file and figure out its size... + */ + + if (print_fd) + { + /* + * Use the size from the print file... + */ + + if (fstat(print_fd, &filestats)) + { + close(fd); + + perror("DEBUG: unable to stat print file"); + return (CUPS_BACKEND_FAILED); + } + + filestats.st_size *= manual_copies; + } + else + { + /* + * Use a "very large value" for the size so that the printer will + * keep printing until we close the connection... + */ + +#ifdef _LARGEFILE_SOURCE + filestats.st_size = (size_t)(999999999999.0); +#else + filestats.st_size = 2147483647; +#endif /* _LARGEFILE_SOURCE */ + } + + /* + * Send a job header to the printer, specifying no banner page and + * literal output... + */ + + if (lpd_command(fd, "\002%s\n", + printer)) /* Receive print job(s) */ + { + close(fd); + return (CUPS_BACKEND_FAILED); + } + + httpGetHostname(NULL, localhost, sizeof(localhost)); + + snprintf(control, sizeof(control), + "H%.31s\n" /* RFC 1179, Section 7.2 - host name <= 31 chars */ + "P%.31s\n" /* RFC 1179, Section 7.2 - user name <= 31 chars */ + "J%.99s\n", /* RFC 1179, Section 7.2 - job name <= 99 chars */ + localhost, user, title); + cptr = control + strlen(control); + + if (banner) + { + snprintf(cptr, sizeof(control) - (cptr - control), + "C%.31s\n" /* RFC 1179, Section 7.2 - class name <= 31 chars */ + "L%s\n", + localhost, user); + cptr += strlen(cptr); + } + + while (copies > 0) + { + snprintf(cptr, sizeof(control) - (cptr - control), "%cdfA%03d%.15s\n", + format, (int)getpid() % 1000, localhost); + cptr += strlen(cptr); + copies --; + } + + snprintf(cptr, sizeof(control) - (cptr - control), + "UdfA%03d%.15s\n" + "N%.131s\n", /* RFC 1179, Section 7.2 - sourcefile name <= 131 chars */ + (int)getpid() % 1000, localhost, title); + + fprintf(stderr, "DEBUG: Control file is:\n%s", control); + + if (order == ORDER_CONTROL_DATA) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, &(addr->addr)); + + /* + * Send the control file... + */ + + if (lpd_command(fd, "\002%d cfA%03.3d%.15s\n", strlen(control), + (int)getpid() % 1000, localhost)) + { + close(fd); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Sending control file (%u bytes)\n", + (unsigned)strlen(control)); + + if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1)) + { + status = errno; + perror("DEBUG: Unable to write control file"); + + } + else + { + if (read(fd, &status, 1) < 1) + { + _cupsLangPrintFilter(stderr, "WARNING", + _("Printer did not respond.")); + status = errno; + } + } + + if (status != 0) + _cupsLangPrintFilter(stderr, "ERROR", + _("Remote host did not accept control file (%d)."), + status); + else + _cupsLangPrintFilter(stderr, "INFO", + _("Control file sent successfully.")); + } + else + status = 0; + + if (status == 0) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, &(addr->addr)); + + /* + * Send the print file... + */ + + if (lpd_command(fd, "\003" CUPS_LLFMT " dfA%03.3d%.15s\n", + CUPS_LLCAST filestats.st_size, (int)getpid() % 1000, + localhost)) + { + close(fd); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Sending data file (" CUPS_LLFMT " bytes)\n", + CUPS_LLCAST filestats.st_size); + + tbytes = 0; + for (copy = 0; copy < manual_copies; copy ++) + { + lseek(print_fd, 0, SEEK_SET); + + while ((nbytes = read(print_fd, buffer, sizeof(buffer))) > 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Spooling job, %.0f%% complete."), + 100.0 * tbytes / filestats.st_size); + + if (lpd_write(fd, buffer, nbytes) < nbytes) + { + perror("DEBUG: Unable to send print file to printer"); + break; + } + else + tbytes += nbytes; + } + } + + if (mode == MODE_STANDARD) + { + if (tbytes < filestats.st_size) + status = errno; + else if (lpd_write(fd, "", 1) < 1) + { + perror("DEBUG: Unable to send trailing nul to printer"); + status = errno; + } + else + { + /* + * Read the status byte from the printer; if we can't read the byte + * back now, we should set status to "errno", however at this point + * we know the printer got the whole file and we don't necessarily + * want to requeue it over and over... + */ + + if (recv(fd, &status, 1, 0) < 1) + { + _cupsLangPrintFilter(stderr, "WARNING", + _("Printer did not respond.")); + status = 0; + } + } + } + else + status = 0; + + if (status != 0) + _cupsLangPrintFilter(stderr, "ERROR", + _("Remote host did not accept data file (%d)."), + status); + else + _cupsLangPrintFilter(stderr, "INFO", + _("Data file sent successfully.")); + } + + if (status == 0 && order == ORDER_DATA_CONTROL) + { + /* + * Check for side-channel requests... + */ + + backendCheckSideChannel(snmp_fd, &(addr->addr)); + + /* + * Send control file... + */ + + if (lpd_command(fd, "\002%d cfA%03.3d%.15s\n", strlen(control), + (int)getpid() % 1000, localhost)) + { + close(fd); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Sending control file (%lu bytes)\n", + (unsigned long)strlen(control)); + + if (lpd_write(fd, control, strlen(control) + 1) < (strlen(control) + 1)) + { + status = errno; + perror("DEBUG: Unable to write control file"); + } + else + { + if (read(fd, &status, 1) < 1) + { + _cupsLangPrintFilter(stderr, "WARNING", + _("Printer did not respond.")); + status = errno; + } + } + + if (status != 0) + _cupsLangPrintFilter(stderr, "ERROR", + _("Remote host did not accept control file (%d)."), + status); + else + _cupsLangPrintFilter(stderr, "INFO", + _("Control file sent successfully.")); + } + + /* + * Collect the final supply levels as needed... + */ + + if (have_supplies) + backendSNMPSupplies(snmp_fd, &(addr->addr), NULL, NULL); + + /* + * Close the socket connection and input file... + */ + + close(fd); + + if (status == 0) + return (CUPS_BACKEND_OK); + + /* + * Waiting for a retry... + */ + + sleep(30); + } + + /* + * If we get here, then the job has been canceled... + */ + + return (CUPS_BACKEND_FAILED); +} + + +/* + * 'lpd_write()' - Write a buffer of data to an LPD server. + */ + +static int /* O - Number of bytes written or -1 on error */ +lpd_write(int lpd_fd, /* I - LPD socket */ + char *buffer, /* I - Buffer to write */ + int length) /* I - Number of bytes to write */ +{ + int bytes, /* Number of bytes written */ + total; /* Total number of bytes written */ + + + if (abort_job) + return (-1); + + total = 0; + while ((bytes = send(lpd_fd, buffer, length - total, 0)) >= 0) + { + total += bytes; + buffer += bytes; + + if (total == length) + break; + } + + if (bytes < 0) + return (-1); + else + return (length); +} + + +#ifndef HAVE_RRESVPORT_AF +/* + * 'rresvport_af()' - A simple implementation of rresvport_af(). + */ + +static int /* O - Socket or -1 on error */ +rresvport_af(int *port, /* IO - Port number to bind to */ + int family) /* I - Address family */ +{ + http_addr_t addr; /* Socket address */ + int fd; /* Socket file descriptor */ + + + /* + * Try to create an IPv4 socket... + */ + + if ((fd = socket(family, SOCK_STREAM, 0)) < 0) + return (-1); + + /* + * Initialize the address buffer... + */ + + memset(&addr, 0, sizeof(addr)); + addr.addr.sa_family = family; + + /* + * Try to bind the socket to a reserved port... + */ + + while (*port > 511) + { + /* + * Set the port number... + */ + + _httpAddrSetPort(&addr, *port); + + /* + * Try binding the port to the socket; return if all is OK... + */ + + if (!bind(fd, (struct sockaddr *)&addr, sizeof(addr))) + return (fd); + + /* + * Stop if we have any error other than "address already in use"... + */ + + if (errno != EADDRINUSE) + { +# ifdef WIN32 + closesocket(fd); +# else + close(fd); +# endif /* WIN32 */ + + return (-1); + } + + /* + * Try the next port... + */ + + (*port)--; + } + + /* + * Wasn't able to bind to a reserved port, so close the socket and return + * -1... + */ + +# ifdef WIN32 + closesocket(fd); +# else + close(fd); +# endif /* WIN32 */ + + return (-1); +} +#endif /* !HAVE_RRESVPORT_AF */ + + +/* + * 'sigterm_handler()' - Handle 'terminate' signals that stop the backend. + */ + +static void +sigterm_handler(int sig) /* I - Signal */ +{ + (void)sig; /* remove compiler warnings... */ + + abort_job = 1; +} + + +/* + * End of "$Id: lpd.c 10265 2012-02-12 07:20:10Z mike $". + */ diff --git a/backend/network.c b/backend/network.c new file mode 100644 index 0000000..d5827c4 --- /dev/null +++ b/backend/network.c @@ -0,0 +1,300 @@ +/* + * "$Id: network.c 9578 2011-03-04 18:44:47Z mike $" + * + * Common backend network APIs for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * backendCheckSideChannel() - Check the side-channel for pending requests. + * backendNetworkSideCB() - Handle common network side-channel commands. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include +#ifdef __hpux +# include +#else +# include +#endif /* __hpux */ + + +/* + * 'backendCheckSideChannel()' - Check the side-channel for pending requests. + */ + + +void +backendCheckSideChannel( + int snmp_fd, /* I - SNMP socket */ + http_addr_t *addr) /* I - Address of device */ +{ + fd_set input; /* Select input set */ + struct timeval timeout; /* Select timeout */ + + + FD_ZERO(&input); + FD_SET(CUPS_SC_FD, &input); + + timeout.tv_sec = timeout.tv_usec = 0; + + if (select(CUPS_SC_FD + 1, &input, NULL, NULL, &timeout) > 0) + backendNetworkSideCB(-1, -1, snmp_fd, addr, 0); +} + + +/* + * 'backendNetworkSideCB()' - Handle common network side-channel commands. + */ + +int /* O - -1 on error, 0 on success */ +backendNetworkSideCB( + int print_fd, /* I - Print file or -1 */ + int device_fd, /* I - Device file or -1 */ + int snmp_fd, /* I - SNMP socket */ + http_addr_t *addr, /* I - Address of device */ + int use_bc) /* I - Use back-channel data? */ +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + const char *device_id; /* 1284DEVICEID env var */ + + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + return (-1); + + switch (command) + { + case CUPS_SC_CMD_DRAIN_OUTPUT : + /* + * Our sockets disable the Nagle algorithm and data is sent immediately. + */ + + if (device_fd < 0) + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + else if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + + datalen = 0; + break; + + case CUPS_SC_CMD_GET_BIDI : + status = CUPS_SC_STATUS_OK; + data[0] = use_bc; + datalen = 1; + break; + + case CUPS_SC_CMD_SNMP_GET : + case CUPS_SC_CMD_SNMP_GET_NEXT : + fprintf(stderr, "DEBUG: CUPS_SC_CMD_SNMP_%s: %d (%s)\n", + command == CUPS_SC_CMD_SNMP_GET ? "GET" : "GET_NEXT", datalen, + data); + + if (datalen < 2) + { + status = CUPS_SC_STATUS_BAD_MESSAGE; + datalen = 0; + break; + } + + if (snmp_fd >= 0) + { + cups_snmp_t packet; /* Packet from printer */ + + + if (!_cupsSNMPStringToOID(data, packet.object_name, CUPS_SNMP_MAX_OID)) + { + status = CUPS_SC_STATUS_BAD_MESSAGE; + datalen = 0; + break; + } + + status = CUPS_SC_STATUS_IO_ERROR; + datalen = 0; + + if (_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), + command == CUPS_SC_CMD_SNMP_GET ? + CUPS_ASN1_GET_REQUEST : + CUPS_ASN1_GET_NEXT_REQUEST, 1, + packet.object_name)) + { + if (_cupsSNMPRead(snmp_fd, &packet, 1.0)) + { + char *dataptr; /* Pointer into data */ + int i; /* Looping var */ + + + if (!_cupsSNMPOIDToString(packet.object_name, data, sizeof(data))) + { + fputs("DEBUG: Bad OID returned!\n", stderr); + break; + } + + datalen = (int)strlen(data) + 1; + dataptr = data + datalen; + + switch (packet.object_type) + { + case CUPS_ASN1_BOOLEAN : + snprintf(dataptr, sizeof(data) - (dataptr - data), "%d", + packet.object_value.boolean); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_INTEGER : + snprintf(dataptr, sizeof(data) - (dataptr - data), "%d", + packet.object_value.integer); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_BIT_STRING : + case CUPS_ASN1_OCTET_STRING : + if (packet.object_value.string.num_bytes < 0) + i = 0; + else if (packet.object_value.string.num_bytes < + (sizeof(data) - (dataptr - data))) + i = packet.object_value.string.num_bytes; + else + i = (int)(sizeof(data) - (dataptr - data)); + + memcpy(dataptr, packet.object_value.string.bytes, i); + + datalen += i; + break; + + case CUPS_ASN1_OID : + _cupsSNMPOIDToString(packet.object_value.oid, dataptr, + sizeof(data) - (dataptr - data)); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_HEX_STRING : + for (i = 0; + i < packet.object_value.string.num_bytes && + dataptr < (data + sizeof(data) - 3); + i ++, dataptr += 2) + sprintf(dataptr, "%02X", + packet.object_value.string.bytes[i]); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_COUNTER : + snprintf(dataptr, sizeof(data) - (dataptr - data), "%d", + packet.object_value.counter); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_GAUGE : + snprintf(dataptr, sizeof(data) - (dataptr - data), "%u", + packet.object_value.gauge); + datalen += (int)strlen(dataptr); + break; + + case CUPS_ASN1_TIMETICKS : + snprintf(dataptr, sizeof(data) - (dataptr - data), "%u", + packet.object_value.timeticks); + datalen += (int)strlen(dataptr); + break; + + default : + fprintf(stderr, "DEBUG: Unknown OID value type %02X!\n", + packet.object_type); + + case CUPS_ASN1_NULL_VALUE : + dataptr[0] = '\0'; + break; + } + + fprintf(stderr, "DEBUG: Returning %s %s\n", data, data + datalen); + + status = CUPS_SC_STATUS_OK; + } + else + fputs("DEBUG: SNMP read error...\n", stderr); + } + else + fputs("DEBUG: SNMP write error...\n", stderr); + break; + } + + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + + case CUPS_SC_CMD_GET_DEVICE_ID : + if (snmp_fd >= 0) + { + cups_snmp_t packet; /* Packet from printer */ + static const int ppmPrinterIEEE1284DeviceId[] = + { CUPS_OID_ppmPrinterIEEE1284DeviceId,1,-1 }; + + + status = CUPS_SC_STATUS_IO_ERROR; + datalen = 0; + + if (_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), + CUPS_ASN1_GET_REQUEST, 1, + ppmPrinterIEEE1284DeviceId)) + { + if (_cupsSNMPRead(snmp_fd, &packet, 1.0) && + packet.object_type == CUPS_ASN1_OCTET_STRING) + { + strlcpy(data, (char *)packet.object_value.string.bytes, + sizeof(data)); + datalen = (int)strlen(data); + status = CUPS_SC_STATUS_OK; + } + } + + break; + } + + if ((device_id = getenv("1284DEVICEID")) != NULL) + { + strlcpy(data, device_id, sizeof(data)); + datalen = (int)strlen(data); + status = CUPS_SC_STATUS_OK; + break; + } + + case CUPS_SC_CMD_GET_CONNECTED : + status = CUPS_SC_STATUS_OK; + data[0] = device_fd != -1; + datalen = 1; + break; + + default : + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + } + + return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); +} + + +/* + * End of "$Id: network.c 9578 2011-03-04 18:44:47Z mike $". + */ diff --git a/backend/parallel.c b/backend/parallel.c new file mode 100644 index 0000000..a475f0e --- /dev/null +++ b/backend/parallel.c @@ -0,0 +1,676 @@ +/* + * "$Id: parallel.c 9774 2011-05-12 06:15:14Z mike $" + * + * Parallel port backend for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the specified parallel port. + * list_devices() - List all parallel devices. + * side_cb() - Handle side-channel requests... + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" + +#ifdef __hpux +# include +#else +# include +#endif /* __hpux */ + +#ifdef WIN32 +# include +#else +# include +# include +# include +# include +#endif /* WIN32 */ + +#ifdef __sgi +# include +# ifndef INV_EPP_ECP_PLP +# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ +# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ +# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ +# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ +# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ +# endif /* !INV_EPP_ECP_PLP */ +#endif /* __sgi */ + + +/* + * Local functions... + */ + +static void list_devices(void); +static int side_cb(int print_fd, int device_fd, int snmp_fd, + http_addr_t *addr, int use_bc); + + +/* + * 'main()' - Send a file to the specified parallel port. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + char method[255], /* Method in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info (not used) */ + resource[1024], /* Resource info (device and options) */ + *options; /* Pointer to options */ + int port; /* Port number (not used) */ + int print_fd, /* Print file */ + device_fd, /* Parallel device */ + use_bc; /* Read back-channel data? */ + int copies; /* Number of copies to print */ + ssize_t tbytes; /* Total number of bytes written */ + struct termios opts; /* Parallel port options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + list_devices(); + return (CUPS_BACKEND_OK); + } + else if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_FAILED); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + print_fd = 0; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((print_fd = open(argv[6], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + + copies = atoi(argv[4]); + } + + /* + * Extract the device name and options from the URI... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, cupsBackendDeviceURI(argv), + method, sizeof(method), username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + /* + * See if there are any options... + */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + } + + /* + * Open the parallel port device... + */ + + fputs("STATE: +connecting-to-device\n", stderr); + + do + { +#if defined(__linux) || defined(__FreeBSD__) + /* + * The Linux and FreeBSD parallel port drivers currently are broken WRT + * select() and bidirection I/O... + */ + + device_fd = open(resource, O_WRONLY | O_EXCL); + use_bc = 0; + +#else + if ((device_fd = open(resource, O_RDWR | O_EXCL)) < 0) + { + device_fd = open(resource, O_WRONLY | O_EXCL); + use_bc = 0; + } + else + use_bc = 1; +#endif /* __linux || __FreeBSD__ */ + + if (device_fd == -1) + { + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + if (errno == EBUSY) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer busy; will retry in 30 seconds.")); + sleep(30); + } + else if (errno == ENXIO || errno == EIO || errno == ENOENT) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer not connected; will retry in 30 " + "seconds.")); + sleep(30); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open device file")); + return (CUPS_BACKEND_FAILED); + } + } + } + while (device_fd < 0); + + fputs("STATE: -connecting-to-device\n", stderr); + + /* + * Set any options provided... + */ + + tcgetattr(device_fd, &opts); + + opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ + + /**** No options supported yet ****/ + + tcsetattr(device_fd, TCSANOW, &opts); + + /* + * Finally, send the print file... + */ + + tbytes = 0; + + while (copies > 0 && tbytes >= 0) + { + copies --; + + if (print_fd != 0) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + + tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb); + + if (print_fd != 0 && tbytes >= 0) + _cupsLangPrintFilter(stderr, "INFO", _("Print file sent.")); + } + + /* + * Close the socket connection and input file and return... + */ + + close(device_fd); + + if (print_fd != 0) + close(print_fd); + + return (CUPS_BACKEND_OK); +} + + +/* + * 'list_devices()' - List all parallel devices. + */ + +static void +list_devices(void) +{ +#if defined(__hpux) || defined(__sgi) || defined(__sun) + static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz"; + /* Funky hex numbering used for some devices */ +#endif /* __hpux || __sgi || __sun */ + +#ifdef __linux + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255], /* Device filename */ + basedevice[255], /* Base device filename for ports */ + device_id[1024], /* Device ID string */ + make_model[1024], /* Make and model */ + info[1024], /* Info string */ + uri[1024]; /* Device URI */ + + + if (!access("/dev/parallel/", 0)) + strcpy(basedevice, "/dev/parallel/"); + else if (!access("/dev/printers/", 0)) + strcpy(basedevice, "/dev/printers/"); + else + strcpy(basedevice, "/dev/lp"); + + for (i = 0; i < 4; i ++) + { + /* + * Open the port, if available... + */ + + sprintf(device, "%s%d", basedevice, i); + if ((fd = open(device, O_RDWR | O_EXCL)) < 0) + fd = open(device, O_WRONLY); + + if (fd >= 0) + { + /* + * Now grab the IEEE 1284 device ID string... + */ + + snprintf(uri, sizeof(uri), "parallel:%s", device); + + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + NULL, uri, sizeof(uri))) + { + snprintf(info, sizeof(info), "%s LPT #%d", make_model, i + 1); + cupsBackendReport("direct", uri, make_model, info, device_id, NULL); + } + else + { + snprintf(info, sizeof(info), "LPT #%d", i + 1); + cupsBackendReport("direct", uri, NULL, info, NULL, NULL); + } + + close(fd); + } + } +#elif defined(__sgi) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + inventory_t *inv; /* Hardware inventory info */ + + + /* + * IRIX maintains a hardware inventory of most devices... + */ + + setinvent(); + + while ((inv = getinvent()) != NULL) + { + if (inv->inv_class == INV_PARALLEL && + (inv->inv_type == INV_ONBOARD_PLP || + inv->inv_type == INV_EPP_ECP_PLP)) + { + /* + * Standard parallel port... + */ + + puts("direct parallel:/dev/plp \"Unknown\" \"Onboard Parallel Port\""); + } + else if (inv->inv_class == INV_PARALLEL && + inv->inv_type == INV_EPC_PLP) + { + /* + * EPC parallel port... + */ + + printf("direct parallel:/dev/plp%d \"Unknown\" \"Integral EPC parallel port, Ebus slot %d\"\n", + inv->inv_controller, inv->inv_controller); + } + } + + endinvent(); + + /* + * Central Data makes serial and parallel "servers" that can be + * connected in a number of ways. Look for ports... + */ + + for (i = 0; i < 10; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/lpn%d%c", j, funky_hex[n]); + else if (i == 9) /* PCI */ + sprintf(device, "/dev/lpp%d%c", j, funky_hex[n]); + else /* SCSI */ + sprintf(device, "/dev/lp%d%d%c", i, j, funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", + device, j, n); + else if (i == 9) + printf("direct parallel:%s \"Unknown\" \"Central Data PCI Parallel Port, ID %d, port %d\"\n", + device, j, n); + else + printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__sun) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + + + /* + * Standard parallel ports... + */ + + for (i = 0; i < 10; i ++) + { + sprintf(device, "/dev/ecpp%d", i); + if (access(device, 0) == 0) + printf("direct parallel:%s \"Unknown\" \"Sun IEEE-1284 Parallel Port #%d\"\n", + device, i + 1); + } + + for (i = 0; i < 10; i ++) + { + sprintf(device, "/dev/bpp%d", i); + if (access(device, 0) == 0) + printf("direct parallel:%s \"Unknown\" \"Sun Standard Parallel Port #%d\"\n", + device, i + 1); + } + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lp%d", i); + + if (access(device, 0) == 0) + printf("direct parallel:%s \"Unknown\" \"PC Parallel Port #%d\"\n", + device, i + 1); + } + + /* + * MAGMA parallel ports... + */ + + for (i = 0; i < 40; i ++) + { + sprintf(device, "/dev/pm%02d", i); + if (access(device, 0) == 0) + printf("direct parallel:%s \"Unknown\" \"MAGMA Parallel Board #%d Port #%d\"\n", + device, (i / 10) + 1, (i % 10) + 1); + } + + /* + * Central Data parallel ports... + */ + + for (i = 0; i < 9; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/sts/lpN%d%c", j, funky_hex[n]); + else + sprintf(device, "/dev/sts/lp%c%d%c", i + 'C', j, + funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", + device, j, n); + else + printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__hpux) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + + + /* + * Standard parallel ports... + */ + + if (access("/dev/rlp", 0) == 0) + puts("direct parallel:/dev/rlp \"Unknown\" \"Standard Parallel Port (/dev/rlp)\""); + + for (i = 0; i < 7; i ++) + for (j = 0; j < 7; j ++) + { + sprintf(device, "/dev/c%dt%dd0_lp", i, j); + if (access(device, 0) == 0) + printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d,%d\"\n", + device, i, j); + } + + /* + * Central Data parallel ports... + */ + + for (i = 0; i < 9; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/lpN%d%c", j, funky_hex[n]); + else + sprintf(device, "/dev/lp%c%d%c", i + 'C', j, + funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("direct parallel:%s \"Unknown\" \"Central Data EtherLite Parallel Port, ID %d, port %d\"\n", + device, j, n); + else + printf("direct parallel:%s \"Unknown\" \"Central Data SCSI Parallel Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__osf__) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lp%d", i); + if ((fd = open(device, O_WRONLY)) >= 0) + { + close(fd); + printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1); + } + } +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + + + for (i = 0; i < 3; i ++) + { + sprintf(device, "/dev/lpt%d", i); + if ((fd = open(device, O_WRONLY)) >= 0) + { + close(fd); + printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (interrupt-driven)\"\n", device, i + 1); + } + + sprintf(device, "/dev/lpa%d", i); + if ((fd = open(device, O_WRONLY)) >= 0) + { + close(fd); + printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d (polled)\"\n", device, i + 1); + } + } +#elif defined(_AIX) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + + + for (i = 0; i < 8; i ++) + { + sprintf(device, "/dev/lp%d", i); + if ((fd = open(device, O_WRONLY)) >= 0) + { + close(fd); + printf("direct parallel:%s \"Unknown\" \"Parallel Port #%d\"\n", device, i + 1); + } + } +#endif +} + + +/* + * 'side_cb()' - Handle side-channel requests... + */ + +static int /* O - 0 on success, -1 on error */ +side_cb(int print_fd, /* I - Print file */ + int device_fd, /* I - Device file */ + int snmp_fd, /* I - SNMP socket (unused) */ + http_addr_t *addr, /* I - Device address (unused) */ + int use_bc) /* I - Using back-channel? */ +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + (void)snmp_fd; + (void)addr; + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + return (-1); + + switch (command) + { + case CUPS_SC_CMD_DRAIN_OUTPUT : + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + + datalen = 0; + break; + + case CUPS_SC_CMD_GET_BIDI : + status = CUPS_SC_STATUS_OK; + data[0] = use_bc; + datalen = 1; + break; + + case CUPS_SC_CMD_GET_DEVICE_ID : + memset(data, 0, sizeof(data)); + + if (backendGetDeviceID(device_fd, data, sizeof(data) - 1, + NULL, 0, NULL, NULL, 0)) + { + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + } + else + { + status = CUPS_SC_STATUS_OK; + datalen = strlen(data); + } + break; + + default : + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + } + + return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); +} + + +/* + * End of "$Id: parallel.c 9774 2011-05-12 06:15:14Z mike $". + */ diff --git a/backend/pseudo b/backend/pseudo new file mode 100755 index 0000000..3a82a52 --- /dev/null +++ b/backend/pseudo @@ -0,0 +1,30 @@ +#!/bin/sh +# +# "$Id$" +# +# Psuedo-backend for CUPS testing purposes. +# +# Copyright 2011 by Apple Inc. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# This file is subject to the Apple OS-Developed Software exception. +# + +if test $# = 0; then + echo 'direct pseudo:///deskjet "HP DeskJet" "HP DeskJet (pseudo)" "MFG:HP;MDL:DeskJet;CMD:PCL;" "Nowhere"' + echo 'direct pseudo:///laserjet "HP LaserJet" "HP LaserJet (pseudo)" "MFG:HP;MDL:LaserJet;CMD:PCL;" "Nowhere"' + exit 0 +fi + +cat $6 >/dev/null +sleep 5 +exit 0 + +# +# End of "$Id$". +# diff --git a/backend/runloop.c b/backend/runloop.c new file mode 100644 index 0000000..6cb4178 --- /dev/null +++ b/backend/runloop.c @@ -0,0 +1,539 @@ +/* + * "$Id: runloop.c 10369 2012-03-21 04:31:19Z mike $" + * + * Common run loop APIs for CUPS backends. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * backendDrainOutput() - Drain pending print data to the device. + * backendRunLoop() - Read and write print and back-channel data. + * backendWaitLoop() - Wait for input from stdin while handling + * side-channel queries. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include +#ifdef __hpux +# include +#else +# include +#endif /* __hpux */ + + +/* + * 'backendDrainOutput()' - Drain pending print data to the device. + */ + +int /* O - 0 on success, -1 on error */ +backendDrainOutput(int print_fd, /* I - Print file descriptor */ + int device_fd) /* I - Device file descriptor */ +{ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input; /* Input set for reading */ + ssize_t print_bytes, /* Print bytes read */ + bytes; /* Bytes written */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ + struct timeval timeout; /* Timeout for read... */ + + + fprintf(stderr, "DEBUG: backendDrainOutput(print_fd=%d, device_fd=%d)\n", + print_fd, device_fd); + + /* + * Figure out the maximum file descriptor value to use with select()... + */ + + nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; + + /* + * Now loop until we are out of data from print_fd... + */ + + for (;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + FD_SET(print_fd, &input); + + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + if (select(nfds, &input, NULL, NULL, &timeout) < 0) + return (-1); + + if (!FD_ISSET(print_fd, &input)) + return (0); + + if ((print_bytes = read(print_fd, print_buffer, + sizeof(print_buffer))) < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN || errno != EINTR) + { + _cupsLangPrintError("ERROR", _("Unable to read print data")); + return (-1); + } + + print_bytes = 0; + } + else if (print_bytes == 0) + { + /* + * End of file, return... + */ + + return (0); + } + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)print_bytes); + + for (print_ptr = print_buffer; print_bytes > 0;) + { + if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + if (errno != ENOSPC && errno != ENXIO && errno != EAGAIN && + errno != EINTR && errno != ENOTTY) + { + _cupsLangPrintError("ERROR", _("Unable to write print data")); + return (-1); + } + } + else + { + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes); + + print_bytes -= bytes; + print_ptr += bytes; + } + } + } +} + + +/* + * 'backendRunLoop()' - Read and write print and back-channel data. + */ + +ssize_t /* O - Total bytes on success, -1 on error */ +backendRunLoop( + int print_fd, /* I - Print file descriptor */ + int device_fd, /* I - Device file descriptor */ + int snmp_fd, /* I - SNMP socket or -1 if none */ + http_addr_t *addr, /* I - Address of device */ + int use_bc, /* I - Use back-channel? */ + int update_state, /* I - Update printer-state-reasons? */ + _cups_sccb_t side_cb) /* I - Side-channel callback */ +{ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input, /* Input set for reading */ + output; /* Output set for writing */ + ssize_t print_bytes, /* Print bytes read */ + bc_bytes, /* Backchannel bytes read */ + total_bytes, /* Total bytes written */ + bytes; /* Bytes written */ + int paperout; /* "Paper out" status */ + int offline; /* "Off-line" status */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr, /* Pointer into print data buffer */ + bc_buffer[1024]; /* Back-channel data buffer */ + struct timeval timeout; /* Timeout for select() */ + time_t curtime, /* Current time */ + snmp_update = 0; +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + fprintf(stderr, + "DEBUG: backendRunLoop(print_fd=%d, device_fd=%d, snmp_fd=%d, " + "addr=%p, use_bc=%d, side_cb=%p)\n", + print_fd, device_fd, snmp_fd, addr, use_bc, side_cb); + + /* + * If we are printing data from a print driver on stdin, ignore SIGTERM + * so that the driver can finish out any page data, e.g. to eject the + * current page. We only do this for stdin printing as otherwise there + * is no way to cancel a raw print job... + */ + + if (!print_fd) + { +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, SIG_IGN); +#endif /* HAVE_SIGSET */ + } + else if (print_fd < 0) + { + /* + * Copy print data from stdin, but don't mess with the signal handlers... + */ + + print_fd = 0; + } + + /* + * Figure out the maximum file descriptor value to use with select()... + */ + + nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; + + /* + * Now loop until we are out of data from print_fd... + */ + + for (print_bytes = 0, print_ptr = print_buffer, offline = -1, + paperout = -1, total_bytes = 0;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + if (!print_bytes) + FD_SET(print_fd, &input); + if (use_bc) + FD_SET(device_fd, &input); + if (!print_bytes && side_cb) + FD_SET(CUPS_SC_FD, &input); + + FD_ZERO(&output); + if (print_bytes || (!use_bc && !side_cb)) + FD_SET(device_fd, &output); + + if (use_bc || side_cb) + { + timeout.tv_sec = 5; + timeout.tv_usec = 0; + + if (select(nfds, &input, &output, NULL, &timeout) < 0) + { + /* + * Pause printing to clear any pending errors... + */ + + if (errno == ENXIO && offline != 1 && update_state) + { + fputs("STATE: +offline-report\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", + _("Printer is not currently connected.")); + offline = 1; + } + else if (errno == EINTR && total_bytes == 0) + { + fputs("DEBUG: Received an interrupt before any bytes were " + "written, aborting.\n", stderr); + return (0); + } + + sleep(1); + continue; + } + } + + /* + * Check if we have a side-channel request ready... + */ + + if (side_cb && FD_ISSET(CUPS_SC_FD, &input)) + { + /* + * Do the side-channel request, then start back over in the select + * loop since it may have read from print_fd... + */ + + if ((*side_cb)(print_fd, device_fd, snmp_fd, addr, use_bc)) + side_cb = NULL; + continue; + } + + /* + * Check if we have back-channel data ready... + */ + + if (FD_ISSET(device_fd, &input)) + { + if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0) + { + fprintf(stderr, + "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data\n", + CUPS_LLCAST bc_bytes); + cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); + } + else if (bc_bytes < 0 && errno != EAGAIN && errno != EINTR) + { + fprintf(stderr, "DEBUG: Error reading back-channel data: %s\n", + strerror(errno)); + use_bc = 0; + } + else if (bc_bytes == 0) + use_bc = 0; + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input)) + { + if ((print_bytes = read(print_fd, print_buffer, + sizeof(print_buffer))) < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN || errno != EINTR) + { + _cupsLangPrintError("ERROR", _("Unable to read print data")); + return (-1); + } + + print_bytes = 0; + } + else if (print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ + + break; + } + + print_ptr = print_buffer; + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)print_bytes); + } + + /* + * Check if the device is ready to receive data and we have data to + * send... + */ + + if (print_bytes && FD_ISSET(device_fd, &output)) + { + if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + if (errno == ENOSPC) + { + if (paperout != 1 && update_state) + { + fputs("STATE: +media-empty-warning\n", stderr); + fputs("DEBUG: Out of paper\n", stderr); + paperout = 1; + } + } + else if (errno == ENXIO) + { + if (offline != 1 && update_state) + { + fputs("STATE: +offline-report\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", + _("Printer is not currently connected.")); + offline = 1; + } + } + else if (errno != EAGAIN && errno != EINTR && errno != ENOTTY) + { + _cupsLangPrintError("ERROR", _("Unable to write print data")); + return (-1); + } + } + else + { + if (paperout && update_state) + { + fputs("STATE: -media-empty-warning\n", stderr); + paperout = 0; + } + + if (offline && update_state) + { + fputs("STATE: -offline-report\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", _("Printer is now connected.")); + offline = 0; + } + + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes); + + print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } + + /* + * Do SNMP updates periodically... + */ + + if (snmp_fd >= 0 && time(&curtime) >= snmp_update) + { + if (backendSNMPSupplies(snmp_fd, addr, NULL, NULL)) + snmp_update = INT_MAX; + else + snmp_update = curtime + 5; + } + } + + /* + * Return with success... + */ + + return (total_bytes); +} + + +/* + * 'backendWaitLoop()' - Wait for input from stdin while handling side-channel + * queries. + */ + +int /* O - 1 if data is ready, 0 if not */ +backendWaitLoop( + int snmp_fd, /* I - SNMP socket or -1 if none */ + http_addr_t *addr, /* I - Address of device */ + int use_bc, /* I - Use back-channel? */ + _cups_sccb_t side_cb) /* I - Side-channel callback */ +{ + int nfds; /* Number of file descriptors */ + fd_set input; /* Input set for reading */ + time_t curtime, /* Current time */ + snmp_update = 0;/* Last SNMP status update */ + struct timeval timeout; /* Timeout for select() */ + + + fprintf(stderr, "DEBUG: backendWaitLoop(snmp_fd=%d, addr=%p, side_cb=%p)\n", + snmp_fd, addr, side_cb); + + /* + * Now loop until we receive data from stdin... + */ + + if (snmp_fd >= 0) + snmp_update = time(NULL) + 5; + + for (;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + FD_SET(0, &input); + if (side_cb) + FD_SET(CUPS_SC_FD, &input); + + if (snmp_fd >= 0) + { + curtime = time(NULL); + timeout.tv_sec = curtime >= snmp_update ? 0 : snmp_update - curtime; + timeout.tv_usec = 0; + + nfds = select(CUPS_SC_FD + 1, &input, NULL, NULL, &timeout); + } + else + nfds = select(CUPS_SC_FD + 1, &input, NULL, NULL, NULL); + + if (nfds < 0) + { + /* + * Pause printing to clear any pending errors... + */ + + if (errno == EINTR) + { + fputs("DEBUG: Received an interrupt before any bytes were " + "written, aborting.\n", stderr); + return (0); + } + + sleep(1); + continue; + } + + /* + * Check for input on stdin... + */ + + if (FD_ISSET(0, &input)) + break; + + /* + * Check if we have a side-channel request ready... + */ + + if (side_cb && FD_ISSET(CUPS_SC_FD, &input)) + { + /* + * Do the side-channel request, then start back over in the select + * loop since it may have read from print_fd... + */ + + if ((*side_cb)(0, -1, snmp_fd, addr, use_bc)) + side_cb = NULL; + continue; + } + + /* + * Do SNMP updates periodically... + */ + + if (snmp_fd >= 0 && curtime >= snmp_update) + { + if (backendSNMPSupplies(snmp_fd, addr, NULL, NULL)) + snmp_fd = -1; + else + snmp_update = curtime + 5; + } + } + + /* + * Return with success... + */ + + return (1); +} + + +/* + * End of "$Id: runloop.c 10369 2012-03-21 04:31:19Z mike $". + */ diff --git a/backend/serial.c b/backend/serial.c new file mode 100644 index 0000000..4f350a1 --- /dev/null +++ b/backend/serial.c @@ -0,0 +1,1327 @@ +/* + * "$Id: serial.c 9793 2011-05-20 03:49:49Z mike $" + * + * Serial port backend for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the printer or server. + * list_devices() - List all serial devices. + * side_cb() - Handle side-channel requests... + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include + +#ifdef __hpux +# include +#endif /* __hpux */ + +#ifdef WIN32 +# include +#else +# include +# include +# include +# ifdef __hpux +# include +# else +# include +# endif /* __hpux */ +# ifdef HAVE_SYS_IOCTL_H +# include +# endif /* HAVE_SYS_IOCTL_H */ +#endif /* WIN32 */ + +#ifdef __sgi +# include +# ifndef INV_EPP_ECP_PLP +# define INV_EPP_ECP_PLP 6 /* From 6.3/6.4/6.5 sys/invent.h */ +# define INV_ASO_SERIAL 14 /* serial portion of SGI ASO board */ +# define INV_IOC3_DMA 16 /* DMA mode IOC3 serial */ +# define INV_IOC3_PIO 17 /* PIO mode IOC3 serial */ +# define INV_ISA_DMA 19 /* DMA mode ISA serial -- O2 */ +# endif /* !INV_EPP_ECP_PLP */ +#endif /* __sgi */ + +#ifndef CRTSCTS +# ifdef CNEW_RTSCTS +# define CRTSCTS CNEW_RTSCTS +# else +# define CRTSCTS 0 +# endif /* CNEW_RTSCTS */ +#endif /* !CRTSCTS */ + +#if defined(__APPLE__) +# include +# include +# include +# include +#endif /* __APPLE__ */ + +#if defined(__linux) && defined(TIOCGSERIAL) +# include +# include +#endif /* __linux && TIOCGSERIAL */ + + +/* + * Local functions... + */ + +static void list_devices(void); +static int side_cb(int print_fd, int device_fd, int use_bc); + + +/* + * 'main()' - Send a file to the printer or server. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + char method[255], /* Method in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info (not used) */ + resource[1024], /* Resource info (device and options) */ + *options, /* Pointer to options */ + *name, /* Name of option */ + *value, /* Value of option */ + sep; /* Option separator */ + int port; /* Port number (not used) */ + int copies; /* Number of copies to print */ + int side_eof = 0, /* Saw EOF on side-channel? */ + print_fd, /* Print file */ + device_fd; /* Serial device */ + int nfds; /* Maximum file descriptor value + 1 */ + fd_set input, /* Input set for reading */ + output; /* Output set for writing */ + ssize_t print_bytes, /* Print bytes read */ + bc_bytes, /* Backchannel bytes read */ + total_bytes, /* Total bytes written */ + bytes; /* Bytes written */ + int dtrdsr; /* Do dtr/dsr flow control? */ + int print_size; /* Size of output buffer for writes */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr, /* Pointer into print data buffer */ + bc_buffer[1024]; /* Back-channel data buffer */ + struct termios opts; /* Serial port options */ + struct termios origopts; /* Original port options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + list_devices(); + return (CUPS_BACKEND_OK); + } + else if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_FAILED); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + print_fd = 0; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((print_fd = open(argv[6], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + + copies = atoi(argv[4]); + } + + /* + * Extract the device name and options from the URI... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, cupsBackendDeviceURI(argv), + method, sizeof(method), username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + /* + * See if there are any options... + */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + } + + /* + * Open the serial port device... + */ + + fputs("STATE: +connecting-to-device\n", stderr); + + do + { + if ((device_fd = open(resource, O_RDWR | O_NOCTTY | O_EXCL | + O_NDELAY)) == -1) + { + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + if (errno == EBUSY) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer busy; will retry in 30 seconds.")); + sleep(30); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open device file")); + return (CUPS_BACKEND_FAILED); + } + } + } + while (device_fd < 0); + + fputs("STATE: -connecting-to-device\n", stderr); + + /* + * Set any options provided... + */ + + tcgetattr(device_fd, &origopts); + tcgetattr(device_fd, &opts); + + opts.c_lflag &= ~(ICANON | ECHO | ISIG); + /* Raw mode */ + opts.c_oflag &= ~OPOST; /* Don't post-process */ + + print_size = 96; /* 9600 baud / 10 bits/char / 10Hz */ + dtrdsr = 0; /* No dtr/dsr flow control */ + + if (options) + { + while (*options) + { + /* + * Get the name... + */ + + name = options; + + while (*options && *options != '=' && *options != '+' && *options != '&') + options ++; + + if ((sep = *options) != '\0') + *options++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = options; + + while (*options && *options != '+' && *options != '&') + options ++; + + if (*options) + *options++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!_cups_strcasecmp(name, "baud")) + { + /* + * Set the baud rate... + */ + + print_size = atoi(value) / 100; + +#if B19200 == 19200 + cfsetispeed(&opts, atoi(value)); + cfsetospeed(&opts, atoi(value)); +#else + switch (atoi(value)) + { + case 1200 : + cfsetispeed(&opts, B1200); + cfsetospeed(&opts, B1200); + break; + case 2400 : + cfsetispeed(&opts, B2400); + cfsetospeed(&opts, B2400); + break; + case 4800 : + cfsetispeed(&opts, B4800); + cfsetospeed(&opts, B4800); + break; + case 9600 : + cfsetispeed(&opts, B9600); + cfsetospeed(&opts, B9600); + break; + case 19200 : + cfsetispeed(&opts, B19200); + cfsetospeed(&opts, B19200); + break; + case 38400 : + cfsetispeed(&opts, B38400); + cfsetospeed(&opts, B38400); + break; +# ifdef B57600 + case 57600 : + cfsetispeed(&opts, B57600); + cfsetospeed(&opts, B57600); + break; +# endif /* B57600 */ +# ifdef B115200 + case 115200 : + cfsetispeed(&opts, B115200); + cfsetospeed(&opts, B115200); + break; +# endif /* B115200 */ +# ifdef B230400 + case 230400 : + cfsetispeed(&opts, B230400); + cfsetospeed(&opts, B230400); + break; +# endif /* B230400 */ + default : + _cupsLangPrintFilter(stderr, "WARNING", + _("Unsupported baud rate: %s"), value); + break; + } +#endif /* B19200 == 19200 */ + } + else if (!_cups_strcasecmp(name, "bits")) + { + /* + * Set number of data bits... + */ + + switch (atoi(value)) + { + case 7 : + opts.c_cflag &= ~CSIZE; + opts.c_cflag |= CS7; + opts.c_cflag |= PARENB; + opts.c_cflag &= ~PARODD; + break; + case 8 : + opts.c_cflag &= ~CSIZE; + opts.c_cflag |= CS8; + opts.c_cflag &= ~PARENB; + break; + } + } + else if (!_cups_strcasecmp(name, "parity")) + { + /* + * Set parity checking... + */ + + if (!_cups_strcasecmp(value, "even")) + { + opts.c_cflag |= PARENB; + opts.c_cflag &= ~PARODD; + } + else if (!_cups_strcasecmp(value, "odd")) + { + opts.c_cflag |= PARENB; + opts.c_cflag |= PARODD; + } + else if (!_cups_strcasecmp(value, "none")) + opts.c_cflag &= ~PARENB; + else if (!_cups_strcasecmp(value, "space")) + { + /* + * Note: we only support space parity with 7 bits per character... + */ + + opts.c_cflag &= ~CSIZE; + opts.c_cflag |= CS8; + opts.c_cflag &= ~PARENB; + } + else if (!_cups_strcasecmp(value, "mark")) + { + /* + * Note: we only support mark parity with 7 bits per character + * and 1 stop bit... + */ + + opts.c_cflag &= ~CSIZE; + opts.c_cflag |= CS7; + opts.c_cflag &= ~PARENB; + opts.c_cflag |= CSTOPB; + } + } + else if (!_cups_strcasecmp(name, "flow")) + { + /* + * Set flow control... + */ + + if (!_cups_strcasecmp(value, "none")) + { + opts.c_iflag &= ~(IXON | IXOFF); + opts.c_cflag &= ~CRTSCTS; + } + else if (!_cups_strcasecmp(value, "soft")) + { + opts.c_iflag |= IXON | IXOFF; + opts.c_cflag &= ~CRTSCTS; + } + else if (!_cups_strcasecmp(value, "hard") || + !_cups_strcasecmp(value, "rtscts")) + { + opts.c_iflag &= ~(IXON | IXOFF); + opts.c_cflag |= CRTSCTS; + } + else if (!_cups_strcasecmp(value, "dtrdsr")) + { + opts.c_iflag &= ~(IXON | IXOFF); + opts.c_cflag &= ~CRTSCTS; + + dtrdsr = 1; + } + } + else if (!_cups_strcasecmp(name, "stop")) + { + switch (atoi(value)) + { + case 1 : + opts.c_cflag &= ~CSTOPB; + break; + + case 2 : + opts.c_cflag |= CSTOPB; + break; + } + } + } + } + + tcsetattr(device_fd, TCSANOW, &opts); + fcntl(device_fd, F_SETFL, 0); + + /* + * Now that we are "connected" to the port, ignore SIGTERM so that we + * can finish out any page data the driver sends (e.g. to eject the + * current page... Only ignore SIGTERM if we are printing data from + * stdin (otherwise you can't cancel raw jobs...) + */ + + if (!print_fd) + { +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, SIG_IGN); +#endif /* HAVE_SIGSET */ + } + + /* + * Figure out the maximum file descriptor value to use with select()... + */ + + nfds = (print_fd > device_fd ? print_fd : device_fd) + 1; + + /* + * Finally, send the print file. Ordinarily we would just use the + * backendRunLoop() function, however since we need to use smaller + * writes and may need to do DSR/DTR flow control, we duplicate much + * of the code here instead... + */ + + if (print_size > sizeof(print_buffer)) + print_size = sizeof(print_buffer); + + total_bytes = 0; + + while (copies > 0) + { + copies --; + + if (print_fd != 0) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + + /* + * Now loop until we are out of data from print_fd... + */ + + for (print_bytes = 0, print_ptr = print_buffer;;) + { + /* + * Use select() to determine whether we have data to copy around... + */ + + FD_ZERO(&input); + if (!print_bytes) + FD_SET(print_fd, &input); + FD_SET(device_fd, &input); + if (!print_bytes && !side_eof) + FD_SET(CUPS_SC_FD, &input); + + FD_ZERO(&output); + if (print_bytes) + FD_SET(device_fd, &output); + + if (select(nfds, &input, &output, NULL, NULL) < 0) + continue; /* Ignore errors here */ + + /* + * Check if we have a side-channel request ready... + */ + + if (FD_ISSET(CUPS_SC_FD, &input)) + { + /* + * Do the side-channel request, then start back over in the select + * loop since it may have read from print_fd... + */ + + if (side_cb(print_fd, device_fd, 1)) + side_eof = 1; + continue; + } + + /* + * Check if we have back-channel data ready... + */ + + if (FD_ISSET(device_fd, &input)) + { + if ((bc_bytes = read(device_fd, bc_buffer, sizeof(bc_buffer))) > 0) + { + fprintf(stderr, + "DEBUG: Received " CUPS_LLFMT " bytes of back-channel data\n", + CUPS_LLCAST bc_bytes); + cupsBackChannelWrite(bc_buffer, bc_bytes, 1.0); + } + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input)) + { + if ((print_bytes = read(print_fd, print_buffer, print_size)) < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN || errno != EINTR) + { + perror("DEBUG: Unable to read print data"); + + tcsetattr(device_fd, TCSADRAIN, &origopts); + + close(device_fd); + + if (print_fd != 0) + close(print_fd); + + return (CUPS_BACKEND_FAILED); + } + + print_bytes = 0; + } + else if (print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ + + break; + } + + print_ptr = print_buffer; + } + + /* + * Check if the device is ready to receive data and we have data to + * send... + */ + + if (print_bytes && FD_ISSET(device_fd, &output)) + { + if (dtrdsr) + { + /* + * Check the port and sleep until DSR is set... + */ + + int status; + + + if (!ioctl(device_fd, TIOCMGET, &status)) + if (!(status & TIOCM_DSR)) + { + /* + * Wait for DSR to go high... + */ + + fputs("DEBUG: DSR is low; waiting for device...\n", stderr); + + do + { + /* + * Poll every 100ms... + */ + + usleep(100000); + + if (ioctl(device_fd, TIOCMGET, &status)) + break; + } + while (!(status & TIOCM_DSR)); + + fputs("DEBUG: DSR is high; writing to device...\n", stderr); + } + } + + if ((bytes = write(device_fd, print_ptr, print_bytes)) < 0) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + if (errno != EAGAIN && errno != EINTR && errno != ENOTTY) + { + perror("DEBUG: Unable to write print data"); + + tcsetattr(device_fd, TCSADRAIN, &origopts); + + close(device_fd); + + if (print_fd != 0) + close(print_fd); + + return (CUPS_BACKEND_FAILED); + } + } + else + { + fprintf(stderr, "DEBUG: Wrote %d bytes...\n", (int)bytes); + + print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } + } + } + + /* + * Close the serial port and input file and return... + */ + + tcsetattr(device_fd, TCSADRAIN, &origopts); + + close(device_fd); + + if (print_fd != 0) + close(print_fd); + + return (CUPS_BACKEND_OK); +} + + +/* + * 'list_devices()' - List all serial devices. + */ + +static void +list_devices(void) +{ +#if defined(__hpux) || defined(__sgi) || defined(__sun) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) + static char *funky_hex = "0123456789abcdefghijklmnopqrstuvwxyz"; + /* Funky hex numbering used for some * + * devices */ +#endif /* __hpux || __sgi || __sun || __FreeBSD__ || __OpenBSD__ || __FreeBSD_kernel__ */ + + +#ifdef __linux + int i, j; /* Looping vars */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + char info[255]; /* Device info/description */ +# ifdef TIOCGSERIAL + struct serial_struct serinfo; /* serial port info */ +# endif /* TIOCGSERIAL */ + + + for (i = 0; i < 100; i ++) + { + sprintf(device, "/dev/ttyS%d", i); + + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { +# ifdef TIOCGSERIAL + /* + * See if this port exists... + */ + + serinfo.reserved_char[0] = 0; + + if (!ioctl(fd, TIOCGSERIAL, &serinfo)) + { + if (serinfo.type == PORT_UNKNOWN) + { + /* + * Nope... + */ + + close(fd); + continue; + } + } +# endif /* TIOCGSERIAL */ + + close(fd); + + snprintf(info, sizeof(info), + _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); + +# if defined(_ARCH_PPC) || defined(powerpc) || defined(__powerpc) + printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); +# else + printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); +# endif /* _ARCH_PPC || powerpc || __powerpc */ + } + } + + for (i = 0; i < 16; i ++) + { + snprintf(info, sizeof(info), + _cupsLangString(cupsLangDefault(), _("USB Serial Port #%d")), + i + 1); + + sprintf(device, "/dev/usb/ttyUSB%d", i); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); + } + + sprintf(device, "/dev/ttyUSB%d", i); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=230400 \"Unknown\" \"%s\"\n", device, info); + } + } + + for (i = 0; i < 64; i ++) + { + for (j = 0; j < 8; j ++) + { + sprintf(device, "/dev/ttyQ%02de%d", i, j); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + + printf("serial serial:%s?baud=115200 \"Unknown\" " + "\"Equinox ESP %d Port #%d\"\n", device, i, j + 1); + } + } + } +#elif defined(__sgi) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + inventory_t *inv; /* Hardware inventory info */ + + + /* + * IRIX maintains a hardware inventory of most devices... + */ + + setinvent(); + + while ((inv = getinvent()) != NULL) + { + if (inv->inv_class == INV_SERIAL) + { + /* + * Some sort of serial port... + */ + + if (inv->inv_type == INV_CDSIO || inv->inv_type == INV_CDSIO_E) + { + /* + * CDSIO port... + */ + + for (n = 0; n < 6; n ++) + printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"CDSIO Board %d Serial Port #%d\"\n", + n + 5 + 8 * inv->inv_controller, inv->inv_controller, n + 1); + } + else if (inv->inv_type == INV_EPC_SERIAL) + { + /* + * Everest serial port... + */ + + if (inv->inv_unit == 0) + i = 1; + else + i = 41 + 4 * (int)inv->inv_controller; + + for (n = 0; n < (int)inv->inv_state; n ++) + printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"EPC Serial Port %d, Ebus slot %d\"\n", + n + i, n + 1, (int)inv->inv_controller); + } + else if (inv->inv_state > 1) + { + /* + * Standard serial port under IRIX 6.4 and earlier... + */ + + for (n = 0; n < (int)inv->inv_state; n ++) + printf("serial serial:/dev/ttyd%d?baud=38400 \"Unknown\" \"Onboard Serial Port %d\"\n", + n + (int)inv->inv_unit + 1, n + (int)inv->inv_unit + 1); + } + else + { + /* + * Standard serial port under IRIX 6.5 and beyond... + */ + + printf("serial serial:/dev/ttyd%d?baud=115200 \"Unknown\" \"Onboard Serial Port %d\"\n", + (int)inv->inv_controller, (int)inv->inv_controller); + } + } + } + + endinvent(); + + /* + * Central Data makes serial and parallel "servers" that can be + * connected in a number of ways. Look for ports... + */ + + for (i = 0; i < 10; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/ttydn%d%c", j, funky_hex[n]); + else if (i == 9) /* PCI */ + sprintf(device, "/dev/ttydp%d%c", j, funky_hex[n]); + else /* SCSI */ + sprintf(device, "/dev/ttyd%d%d%c", i, j, funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", + device, j, n); + else if (i == 9) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data PCI Serial Port, ID %d, port %d\"\n", + device, j, n); + else + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__sun) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + char info[255]; /* Device info/description */ + + + /* + * Standard serial ports... + */ + + for (i = 0; i < 26; i ++) + { + sprintf(device, "/dev/cua/%c", 'a' + i); + if (!access(device, 0)) + { + snprintf(info, sizeof(info), + _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); + +# ifdef B115200 + printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); +# else + printf("serial serial:%s?baud=38400 \"Unknown\" \"%s\"\n", device, info); +# endif /* B115200 */ + } + } + + /* + * MAGMA serial ports... + */ + + for (i = 0; i < 40; i ++) + { + sprintf(device, "/dev/term/%02d", i); + if (access(device, 0) == 0) + printf("serial serial:%s?baud=38400 \"Unknown\" \"MAGMA Serial Board #%d Port #%d\"\n", + device, (i / 10) + 1, (i % 10) + 1); + } + + /* + * Central Data serial ports... + */ + + for (i = 0; i < 9; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/sts/ttyN%d%c", j, funky_hex[n]); + else + sprintf(device, "/dev/sts/tty%c%d%c", i + 'C', j, + funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", + device, j, n); + else + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__hpux) + int i, j, n; /* Looping vars */ + char device[255]; /* Device filename */ + + + /* + * Standard serial ports... + */ + + for (i = 0; i < 10; i ++) + { + sprintf(device, "/dev/tty%dp0", i); + if (access(device, 0) == 0) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n", + device, i + 1); + } + + /* + * Central Data serial ports... + */ + + for (i = 0; i < 9; i ++) + for (j = 0; j < 8; j ++) + for (n = 0; n < 32; n ++) + { + if (i == 8) /* EtherLite */ + sprintf(device, "/dev/ttyN%d%c", j, funky_hex[n]); + else + sprintf(device, "/dev/tty%c%d%c", i + 'C', j, + funky_hex[n]); + + if (access(device, 0) == 0) + { + if (i == 8) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data EtherLite Serial Port, ID %d, port %d\"\n", + device, j, n); + else + printf("serial serial:%s?baud=38400 \"Unknown\" \"Central Data SCSI Serial Port, logical bus %d, ID %d, port %d\"\n", + device, i, j, n); + } + } +#elif defined(__osf__) + int i; /* Looping var */ + char device[255]; /* Device filename */ + + + /* + * Standard serial ports... + */ + + for (i = 0; i < 100; i ++) + { + sprintf(device, "/dev/tty%02d", i); + if (access(device, 0) == 0) + printf("serial serial:%s?baud=38400 \"Unknown\" \"Serial Port #%d\"\n", + device, i + 1); + } +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) + int i, j; /* Looping vars */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + char info[255]; /* Device info/description */ + + + /* + * SIO ports... + */ + + for (i = 0; i < 32; i ++) + { + sprintf(device, "/dev/ttyd%c", funky_hex[i]); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + + snprintf(info, sizeof(info), + _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); + + printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); + } + } + + /* + * Cyclades ports... + */ + + for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ + for (j = 0; j < 32; j ++) + { + sprintf(device, "/dev/ttyc%d%c", i, funky_hex[j]); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n", + device, i, j + 1); + } + + sprintf(device, "/dev/ttyC%d%c", i, funky_hex[j]); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Port #%d\"\n", + device, i, j + 1); + } + } + + /* + * Digiboard ports... + */ + + for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ + for (j = 0; j < 32; j ++) + { + sprintf(device, "/dev/ttyD%d%c", i, funky_hex[j]); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"Digiboard #%d Serial Port #%d\"\n", + device, i, j + 1); + } + } + + /* + * Stallion ports... + */ + + for (i = 0; i < 32; i ++) + { + sprintf(device, "/dev/ttyE%c", funky_hex[i]); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"Stallion Serial Port #%d\"\n", + device, i + 1); + } + } + + /* + * SX ports... + */ + + for (i = 0; i < 128; i ++) + { + sprintf(device, "/dev/ttyA%d", i + 1); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"SX Serial Port #%d\"\n", + device, i + 1); + } + } +#elif defined(__NetBSD__) + int i, j; /* Looping vars */ + int fd; /* File descriptor */ + char device[255]; /* Device filename */ + char info[255]; /* Device info/description */ + + + /* + * Standard serial ports... + */ + + for (i = 0; i < 4; i ++) + { + sprintf(device, "/dev/tty%02d", i); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + + snprintf(info, sizeof(info), + _cupsLangString(cupsLangDefault(), _("Serial Port #%d")), i + 1); + + printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); + } + } + + /* + * Cyclades-Z ports... + */ + + for (i = 0; i < 16; i ++) /* Should be up to 65536 boards... */ + for (j = 0; j < 64; j ++) + { + sprintf(device, "/dev/ttyCZ%02d%02d", i, j); + if ((fd = open(device, O_WRONLY | O_NOCTTY | O_NDELAY)) >= 0) + { + close(fd); + printf("serial serial:%s?baud=115200 \"Unknown\" \"Cyclades #%d Serial Prt #%d\"\n", + device, i, j + 1); + } + } +#elif defined(__APPLE__) + /* + * Standard serial ports on MacOS X... + */ + + kern_return_t kernResult; + mach_port_t masterPort; + io_iterator_t serialPortIterator; + CFMutableDictionaryRef classesToMatch; + io_object_t serialService; + + + kernResult = IOMasterPort(MACH_PORT_NULL, &masterPort); + if (KERN_SUCCESS != kernResult) + return; + + /* + * Serial devices are instances of class IOSerialBSDClient. + */ + + classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue); + if (classesToMatch != NULL) + { + CFDictionarySetValue(classesToMatch, CFSTR(kIOSerialBSDTypeKey), + CFSTR(kIOSerialBSDRS232Type)); + + kernResult = IOServiceGetMatchingServices(masterPort, classesToMatch, + &serialPortIterator); + if (kernResult == KERN_SUCCESS) + { + while ((serialService = IOIteratorNext(serialPortIterator))) + { + CFTypeRef serialNameAsCFString; + CFTypeRef bsdPathAsCFString; + CFTypeRef hiddenVal; + char serialName[128]; + char bsdPath[1024]; + Boolean result; + + + /* Check if hidden... */ + hiddenVal = IORegistryEntrySearchCFProperty(serialService, + kIOServicePlane, + CFSTR("HiddenPort"), + kCFAllocatorDefault, + kIORegistryIterateRecursively | + kIORegistryIterateParents); + if (hiddenVal) + CFRelease(hiddenVal); /* This interface should not be used */ + else + { + serialNameAsCFString = + IORegistryEntryCreateCFProperty(serialService, + CFSTR(kIOTTYDeviceKey), + kCFAllocatorDefault, 0); + if (serialNameAsCFString) + { + result = CFStringGetCString(serialNameAsCFString, serialName, + sizeof(serialName), + kCFStringEncodingASCII); + CFRelease(serialNameAsCFString); + + if (result) + { + bsdPathAsCFString = + IORegistryEntryCreateCFProperty(serialService, + CFSTR(kIOCalloutDeviceKey), + kCFAllocatorDefault, 0); + if (bsdPathAsCFString) + { + result = CFStringGetCString(bsdPathAsCFString, bsdPath, + sizeof(bsdPath), + kCFStringEncodingASCII); + CFRelease(bsdPathAsCFString); + + if (result) + printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", + bsdPath, serialName); + } + } + } + } + + IOObjectRelease(serialService); + } + + /* + * Release the iterator. + */ + + IOObjectRelease(serialPortIterator); + } + } +#endif +} + + +/* + * 'side_cb()' - Handle side-channel requests... + */ + +static int /* O - 0 on success, -1 on error */ +side_cb(int print_fd, /* I - Print file */ + int device_fd, /* I - Device file */ + int use_bc) /* I - Using back-channel? */ +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + return (-1); + + switch (command) + { + case CUPS_SC_CMD_DRAIN_OUTPUT : + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + + datalen = 0; + break; + + case CUPS_SC_CMD_GET_BIDI : + status = CUPS_SC_STATUS_OK; + data[0] = use_bc; + datalen = 1; + break; + + default : + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + } + + return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); +} + + +/* + * End of "$Id: serial.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/backend/snmp-supplies.c b/backend/snmp-supplies.c new file mode 100644 index 0000000..dc2b3f1 --- /dev/null +++ b/backend/snmp-supplies.c @@ -0,0 +1,1010 @@ +/* + * "$Id: snmp-supplies.c 10262 2012-02-12 05:48:09Z mike $" + * + * SNMP supplies functions for CUPS. + * + * Copyright 2008-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * backendSNMPSupplies() - Get the current supplies for a device. + * backend_init_supplies() - Initialize the supplies list. + * backend_walk_cb() - Interpret the supply value responses. + * utf16_to_utf8() - Convert UTF-16 text to UTF-8. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include + + +/* + * Local constants... + */ + +#define CUPS_MAX_SUPPLIES 32 /* Maximum number of supplies for a printer */ +#define CUPS_SUPPLY_TIMEOUT 2.0 /* Timeout for SNMP lookups */ + +#define CUPS_DEVELOPER_LOW 1 +#define CUPS_DEVELOPER_EMPTY 2 +#define CUPS_MARKER_SUPPLY_LOW 4 +#define CUPS_MARKER_SUPPLY_EMPTY 8 +#define CUPS_OPC_NEAR_EOL 16 +#define CUPS_OPC_LIFE_OVER 32 +#define CUPS_TONER_LOW 64 +#define CUPS_TONER_EMPTY 128 + + +/* + * Local structures... + */ + +typedef struct /**** Printer supply data ****/ +{ + char name[CUPS_SNMP_MAX_STRING], /* Name of supply */ + color[8]; /* Color: "#RRGGBB" or "none" */ + int colorant, /* Colorant index */ + type, /* Supply type */ + max_capacity, /* Maximum capacity */ + level; /* Current level value */ +} backend_supplies_t; + +typedef struct /**** Printer state table ****/ +{ + int bit; /* State bit */ + const char *keyword; /* IPP printer-state-reasons keyword */ +} backend_state_t; + + +/* + * Local globals... + */ + +static http_addr_t current_addr; /* Current address */ +static int current_state = -1; + /* Current device state bits */ +static int charset = -1; /* Character set for supply names */ +static int num_supplies = 0; + /* Number of supplies found */ +static backend_supplies_t supplies[CUPS_MAX_SUPPLIES]; + /* Supply information */ +static int supply_state = -1; + /* Supply state info */ + +static const int hrDeviceDescr[] = + { CUPS_OID_hrDeviceDescr, 1, -1 }; + /* Device description OID */ +static const int hrPrinterStatus[] = + { CUPS_OID_hrPrinterStatus, 1, -1 }; + /* Current state OID */ +static const int hrPrinterDetectedErrorState[] = + { CUPS_OID_hrPrinterDetectedErrorState, 1, -1 }; + /* Current printer state bits OID */ +static const int prtGeneralCurrentLocalization[] = + { CUPS_OID_prtGeneralCurrentLocalization, 1, -1 }; +static const int prtLocalizationCharacterSet[] = + { CUPS_OID_prtLocalizationCharacterSet, 1, 1, -1 }, + prtLocalizationCharacterSetOffset = + (sizeof(prtLocalizationCharacterSet) / + sizeof(prtLocalizationCharacterSet[0])); +static const int prtMarkerColorantValue[] = + { CUPS_OID_prtMarkerColorantValue, -1 }, + /* Colorant OID */ + prtMarkerColorantValueOffset = + (sizeof(prtMarkerColorantValue) / + sizeof(prtMarkerColorantValue[0])); + /* Offset to colorant index */ +static const int prtMarkerLifeCount[] = + { CUPS_OID_prtMarkerLifeCount, 1, 1, -1 }; + /* Page counter OID */ +static const int prtMarkerSuppliesEntry[] = + { CUPS_OID_prtMarkerSuppliesEntry, -1 }; + /* Supplies OID */ +static const int prtMarkerSuppliesColorantIndex[] = + { CUPS_OID_prtMarkerSuppliesColorantIndex, -1 }, + /* Colorant index OID */ + prtMarkerSuppliesColorantIndexOffset = + (sizeof(prtMarkerSuppliesColorantIndex) / + sizeof(prtMarkerSuppliesColorantIndex[0])); + /* Offset to supply index */ +static const int prtMarkerSuppliesDescription[] = + { CUPS_OID_prtMarkerSuppliesDescription, -1 }, + /* Description OID */ + prtMarkerSuppliesDescriptionOffset = + (sizeof(prtMarkerSuppliesDescription) / + sizeof(prtMarkerSuppliesDescription[0])); + /* Offset to supply index */ +static const int prtMarkerSuppliesLevel[] = + { CUPS_OID_prtMarkerSuppliesLevel, -1 }, + /* Level OID */ + prtMarkerSuppliesLevelOffset = + (sizeof(prtMarkerSuppliesLevel) / + sizeof(prtMarkerSuppliesLevel[0])); + /* Offset to supply index */ +static const int prtMarkerSuppliesMaxCapacity[] = + { CUPS_OID_prtMarkerSuppliesMaxCapacity, -1 }, + /* Max capacity OID */ + prtMarkerSuppliesMaxCapacityOffset = + (sizeof(prtMarkerSuppliesMaxCapacity) / + sizeof(prtMarkerSuppliesMaxCapacity[0])); + /* Offset to supply index */ +static const int prtMarkerSuppliesType[] = + { CUPS_OID_prtMarkerSuppliesType, -1 }, + /* Type OID */ + prtMarkerSuppliesTypeOffset = + (sizeof(prtMarkerSuppliesType) / + sizeof(prtMarkerSuppliesType[0])); + /* Offset to supply index */ + +static const backend_state_t const printer_states[] = + { + { CUPS_TC_lowPaper, "media-low-report" }, + { CUPS_TC_noPaper | CUPS_TC_inputTrayEmpty, "media-empty-warning" }, + /* { CUPS_TC_lowToner, "toner-low-report" }, */ /* now use prtMarkerSupplies */ + /* { CUPS_TC_noToner, "toner-empty-warning" }, */ /* now use prtMarkerSupplies */ + { CUPS_TC_doorOpen, "door-open-report" }, + { CUPS_TC_jammed, "media-jam-warning" }, + /* { CUPS_TC_offline, "offline-report" }, */ /* unreliable */ + /* { CUPS_TC_serviceRequested | CUPS_TC_overduePreventMaint, "service-needed-warning" }, */ /* unreliable */ + { CUPS_TC_inputTrayMissing, "input-tray-missing-warning" }, + { CUPS_TC_outputTrayMissing, "output-tray-missing-warning" }, + { CUPS_TC_markerSupplyMissing, "marker-supply-missing-warning" }, + { CUPS_TC_outputNearFull, "output-area-almost-full-report" }, + { CUPS_TC_outputFull, "output-area-full-warning" } + }; + +static const backend_state_t const supply_states[] = + { + { CUPS_DEVELOPER_LOW, "developer-low-report" }, + { CUPS_DEVELOPER_EMPTY, "developer-empty-warning" }, + { CUPS_MARKER_SUPPLY_LOW, "marker-supply-low-report" }, + { CUPS_MARKER_SUPPLY_EMPTY, "marker-supply-empty-warning" }, + { CUPS_OPC_NEAR_EOL, "opc-near-eol-report" }, + { CUPS_OPC_LIFE_OVER, "opc-life-over-warning" }, + { CUPS_TONER_LOW, "toner-low-report" }, + { CUPS_TONER_EMPTY, "toner-empty-warning" } + }; + + +/* + * Local functions... + */ + +static void backend_init_supplies(int snmp_fd, http_addr_t *addr); +static void backend_walk_cb(cups_snmp_t *packet, void *data); +static void utf16_to_utf8(cups_utf8_t *dst, const unsigned char *src, + size_t srcsize, size_t dstsize, int le); + + +/* + * 'backendSNMPSupplies()' - Get the current supplies for a device. + */ + +int /* O - 0 on success, -1 on error */ +backendSNMPSupplies( + int snmp_fd, /* I - SNMP socket */ + http_addr_t *addr, /* I - Printer address */ + int *page_count, /* O - Page count */ + int *printer_state) /* O - Printer state */ +{ + if (!httpAddrEqual(addr, ¤t_addr)) + backend_init_supplies(snmp_fd, addr); + else if (num_supplies > 0) + _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), prtMarkerSuppliesLevel, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); + + if (page_count) + *page_count = -1; + + if (printer_state) + *printer_state = -1; + + if (num_supplies > 0) + { + int i, /* Looping var */ + percent, /* Percent full */ + new_state, /* New state value */ + change_state, /* State change */ + new_supply_state = 0; /* Supply state */ + char value[CUPS_MAX_SUPPLIES * 4], + /* marker-levels value string */ + *ptr; /* Pointer into value string */ + cups_snmp_t packet; /* SNMP response packet */ + + /* + * Generate the marker-levels value string... + */ + + for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr)) + { + if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) + percent = 100 * supplies[i].level / supplies[i].max_capacity; + else + percent = 50; + + if (percent <= 5) + { + switch (supplies[i].type) + { + case CUPS_TC_toner : + case CUPS_TC_tonerCartridge : + if (percent <= 1) + new_supply_state |= CUPS_TONER_EMPTY; + else + new_supply_state |= CUPS_TONER_LOW; + break; + case CUPS_TC_wasteToner : + case CUPS_TC_wasteInk : + break; + case CUPS_TC_ink : + case CUPS_TC_inkCartridge : + case CUPS_TC_inkRibbon : + case CUPS_TC_solidWax : + case CUPS_TC_ribbonWax : + if (percent <= 1) + new_supply_state |= CUPS_MARKER_SUPPLY_EMPTY; + else + new_supply_state |= CUPS_MARKER_SUPPLY_LOW; + break; + case CUPS_TC_developer : + if (percent <= 1) + new_supply_state |= CUPS_DEVELOPER_EMPTY; + else + new_supply_state |= CUPS_DEVELOPER_LOW; + break; + case CUPS_TC_coronaWire : + case CUPS_TC_fuser : + case CUPS_TC_opc : + case CUPS_TC_transferUnit : + if (percent <= 1) + new_supply_state |= CUPS_OPC_LIFE_OVER; + else + new_supply_state |= CUPS_OPC_NEAR_EOL; + break; + } + } + + if (i) + *ptr++ = ','; + + if (supplies[i].max_capacity > 0 && supplies[i].level >= 0) + sprintf(ptr, "%d", percent); + else + strcpy(ptr, "-1"); + } + + fprintf(stderr, "ATTR: marker-levels=%s\n", value); + + if (supply_state < 0) + change_state = 0xffff; + else + change_state = supply_state ^ new_supply_state; + + fprintf(stderr, "DEBUG: new_supply_state=%x, change_state=%x\n", + new_supply_state, change_state); + + for (i = 0; + i < (int)(sizeof(supply_states) / sizeof(supply_states[0])); + i ++) + if (change_state & supply_states[i].bit) + { + fprintf(stderr, "STATE: %c%s\n", + (new_supply_state & supply_states[i].bit) ? '+' : '-', + supply_states[i].keyword); + } + + supply_state = new_supply_state; + + /* + * Get the current printer status bits... + */ + + if (!_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + hrPrinterDetectedErrorState)) + return (-1); + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_OCTET_STRING) + return (-1); + + if (packet.object_value.string.num_bytes == 2) + new_state = (packet.object_value.string.bytes[0] << 8) | + packet.object_value.string.bytes[1]; + else if (packet.object_value.string.num_bytes == 1) + new_state = (packet.object_value.string.bytes[0] << 8); + else + new_state = 0; + + if (current_state < 0) + change_state = 0xffff; + else + change_state = current_state ^ new_state; + + fprintf(stderr, "DEBUG: new_state=%x, change_state=%x\n", new_state, + change_state); + + for (i = 0; + i < (int)(sizeof(printer_states) / sizeof(printer_states[0])); + i ++) + if (change_state & printer_states[i].bit) + { + fprintf(stderr, "STATE: %c%s\n", + (new_state & printer_states[i].bit) ? '+' : '-', + printer_states[i].keyword); + } + + current_state = new_state; + + /* + * Get the current printer state... + */ + + if (printer_state) + { + if (!_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + hrPrinterStatus)) + return (-1); + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_INTEGER) + return (-1); + + *printer_state = packet.object_value.integer; + } + + /* + * Get the current page count... + */ + + if (page_count) + { + if (!_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + prtMarkerLifeCount)) + return (-1); + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_COUNTER) + return (-1); + + *page_count = packet.object_value.counter; + } + + return (0); + } + else + return (-1); +} + + +/* + * 'backend_init_supplies()' - Initialize the supplies list. + */ + +static void +backend_init_supplies( + int snmp_fd, /* I - SNMP socket */ + http_addr_t *addr) /* I - Printer address */ +{ + int i, /* Looping var */ + type; /* Current marker type */ + cups_file_t *cachefile; /* Cache file */ + const char *cachedir; /* CUPS_CACHEDIR value */ + char addrstr[1024], /* Address string */ + cachefilename[1024], /* Cache filename */ + description[CUPS_SNMP_MAX_STRING], + /* Device description string */ + value[CUPS_MAX_SUPPLIES * (CUPS_SNMP_MAX_STRING * 4 + 3)], + /* Value string */ + *ptr, /* Pointer into value string */ + *name_ptr; /* Pointer into name string */ + cups_snmp_t packet; /* SNMP response packet */ + ppd_file_t *ppd; /* PPD file for this queue */ + ppd_attr_t *ppdattr; /* cupsSNMPSupplies attribute */ + static const char * const types[] = /* Supply types */ + { + "other", + "unknown", + "toner", + "wasteToner", + "ink", + "inkCartridge", + "inkRibbon", + "wasteInk", + "opc", + "developer", + "fuserOil", + "solidWax", + "ribbonWax", + "wasteWax", + "fuser", + "coronaWire", + "fuserOilWick", + "cleanerUnit", + "fuserCleaningPad", + "transferUnit", + "tonerCartridge", + "fuserOiler", + "water", + "wasteWater", + "glueWaterAdditive", + "wastePaper", + "bindingSupply", + "bandingSupply", + "stitchingWire", + "shrinkWrap", + "paperWrap", + "staples", + "inserts", + "covers" + }; + + + /* + * Reset state information... + */ + + current_addr = *addr; + current_state = -1; + num_supplies = -1; + charset = -1; + + memset(supplies, 0, sizeof(supplies)); + + /* + * See if we should be getting supply levels via SNMP... + */ + + if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL || + ((ppdattr = ppdFindAttr(ppd, "cupsSNMPSupplies", NULL)) != NULL && + ppdattr->value && _cups_strcasecmp(ppdattr->value, "true"))) + { + ppdClose(ppd); + return; + } + + ppdClose(ppd); + + /* + * Get the device description... + */ + + if (!_cupsSNMPWrite(snmp_fd, addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + hrDeviceDescr)) + return; + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_OCTET_STRING) + { + strlcpy(description, "Unknown", sizeof(description)); + num_supplies = 0; + } + else + strlcpy(description, (char *)packet.object_value.string.bytes, + sizeof(description)); + + fprintf(stderr, "DEBUG2: hrDeviceDesc=\"%s\"\n", description); + + /* + * See if we have already queried this device... + */ + + httpAddrString(addr, addrstr, sizeof(addrstr)); + + if ((cachedir = getenv("CUPS_CACHEDIR")) == NULL) + cachedir = CUPS_CACHEDIR; + + snprintf(cachefilename, sizeof(cachefilename), "%s/%s.snmp", cachedir, + addrstr); + + if ((cachefile = cupsFileOpen(cachefilename, "r")) != NULL) + { + /* + * Yes, read the cache file: + * + * 2 num_supplies charset + * device description + * supply structures... + */ + + if (cupsFileGets(cachefile, value, sizeof(value))) + { + if (sscanf(value, "2 %d%d", &num_supplies, &charset) == 2 && + num_supplies <= CUPS_MAX_SUPPLIES && + cupsFileGets(cachefile, value, sizeof(value))) + { + if (!strcmp(description, value)) + cupsFileRead(cachefile, (char *)supplies, + num_supplies * sizeof(backend_supplies_t)); + else + { + num_supplies = -1; + charset = -1; + } + } + else + { + num_supplies = -1; + charset = -1; + } + } + + cupsFileClose(cachefile); + } + + /* + * If the cache information isn't correct, scan for supplies... + */ + + if (charset < 0) + { + /* + * Get the configured character set... + */ + + int oid[CUPS_SNMP_MAX_OID]; /* OID for character set */ + + + if (!_cupsSNMPWrite(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + prtGeneralCurrentLocalization)) + return; + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_INTEGER) + { + fprintf(stderr, + "DEBUG: prtGeneralCurrentLocalization type is %x, expected %x!\n", + packet.object_type, CUPS_ASN1_INTEGER); + return; + } + + fprintf(stderr, "DEBUG2: prtGeneralCurrentLocalization=%d\n", + packet.object_value.integer); + + _cupsSNMPCopyOID(oid, prtLocalizationCharacterSet, CUPS_SNMP_MAX_OID); + oid[prtLocalizationCharacterSetOffset - 2] = packet.object_value.integer; + + + if (!_cupsSNMPWrite(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + oid)) + return; + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_INTEGER) + { + fprintf(stderr, + "DEBUG: prtLocalizationCharacterSet type is %x, expected %x!\n", + packet.object_type, CUPS_ASN1_INTEGER); + return; + } + + fprintf(stderr, "DEBUG2: prtLocalizationCharacterSet=%d\n", + packet.object_value.integer); + charset = packet.object_value.integer; + } + + if (num_supplies < 0) + { + /* + * Walk the printer configuration information... + */ + + _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), prtMarkerSuppliesEntry, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); + } + + /* + * Save the cached information... + */ + + if (num_supplies < 0) + num_supplies = 0; + + if ((cachefile = cupsFileOpen(cachefilename, "w")) != NULL) + { + cupsFilePrintf(cachefile, "2 %d %d\n", num_supplies, charset); + cupsFilePrintf(cachefile, "%s\n", description); + + if (num_supplies > 0) + cupsFileWrite(cachefile, (char *)supplies, + num_supplies * sizeof(backend_supplies_t)); + + cupsFileClose(cachefile); + } + + if (num_supplies <= 0) + return; + + /* + * Get the colors... + */ + + for (i = 0; i < num_supplies; i ++) + strcpy(supplies[i].color, "none"); + + _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), prtMarkerColorantValue, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); + + /* + * Output the marker-colors attribute... + */ + + for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr)) + { + if (i) + *ptr++ = ','; + + strcpy(ptr, supplies[i].color); + } + + fprintf(stderr, "ATTR: marker-colors=%s\n", value); + + /* + * Output the marker-names attribute (the double quoting is necessary to deal + * with embedded quotes and commas in the marker names...) + */ + + for (i = 0, ptr = value; i < num_supplies; i ++) + { + if (i) + *ptr++ = ','; + + *ptr++ = '\''; + *ptr++ = '\"'; + for (name_ptr = supplies[i].name; *name_ptr;) + { + if (*name_ptr == '\\' || *name_ptr == '\"' || *name_ptr == '\'') + { + *ptr++ = '\\'; + *ptr++ = '\\'; + *ptr++ = '\\'; + } + + *ptr++ = *name_ptr++; + } + *ptr++ = '\"'; + *ptr++ = '\''; + } + + *ptr = '\0'; + + fprintf(stderr, "ATTR: marker-names=%s\n", value); + + /* + * Output the marker-types attribute... + */ + + for (i = 0, ptr = value; i < num_supplies; i ++, ptr += strlen(ptr)) + { + if (i) + *ptr++ = ','; + + type = supplies[i].type; + + if (type < CUPS_TC_other || type > CUPS_TC_covers) + strcpy(ptr, "unknown"); + else + strcpy(ptr, types[type - CUPS_TC_other]); + } + + fprintf(stderr, "ATTR: marker-types=%s\n", value); +} + + +/* + * 'backend_walk_cb()' - Interpret the supply value responses. + */ + +static void +backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ + void *data) /* I - User data (unused) */ +{ + int i, j, k; /* Looping vars */ + static const char * const colors[][2] = + { /* Standard color names */ + { "black", "#000000" }, + { "blue", "#0000FF" }, + { "brown", "#A52A2A" }, + { "cyan", "#00FFFF" }, + { "dark-gray", "#404040" }, + { "dark gray", "#404040" }, + { "dark-yellow", "#FFCC00" }, + { "dark yellow", "#FFCC00" }, + { "gold", "#FFD700" }, + { "gray", "#808080" }, + { "green", "#00FF00" }, + { "light-black", "#606060" }, + { "light black", "#606060" }, + { "light-cyan", "#E0FFFF" }, + { "light cyan", "#E0FFFF" }, + { "light-gray", "#D3D3D3" }, + { "light gray", "#D3D3D3" }, + { "light-magenta", "#FF77FF" }, + { "light magenta", "#FF77FF" }, + { "magenta", "#FF00FF" }, + { "orange", "#FFA500" }, + { "red", "#FF0000" }, + { "silver", "#C0C0C0" }, + { "white", "#FFFFFF" }, + { "yellow", "#FFFF00" } + }; + + + (void)data; + + if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerColorantValue) && + packet->object_type == CUPS_ASN1_OCTET_STRING) + { + /* + * Get colorant... + */ + + i = packet->object_name[prtMarkerColorantValueOffset]; + + fprintf(stderr, "DEBUG2: prtMarkerColorantValue.1.%d = \"%s\"\n", i, + (char *)packet->object_value.string.bytes); + + for (j = 0; j < num_supplies; j ++) + if (supplies[j].colorant == i) + { + for (k = 0; k < (int)(sizeof(colors) / sizeof(colors[0])); k ++) + if (!_cups_strcasecmp(colors[k][0], + (char *)packet->object_value.string.bytes)) + { + strcpy(supplies[j].color, colors[k][1]); + break; + } + } + } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesColorantIndex)) + { + /* + * Get colorant index... + */ + + i = packet->object_name[prtMarkerSuppliesColorantIndexOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_INTEGER) + return; + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesColorantIndex.1.%d = %d\n", i, + packet->object_value.integer); + + if (i > num_supplies) + num_supplies = i; + + supplies[i - 1].colorant = packet->object_value.integer; + } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesDescription)) + { + /* + * Get supply name/description... + */ + + i = packet->object_name[prtMarkerSuppliesDescriptionOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_OCTET_STRING) + return; + + if (i > num_supplies) + num_supplies = i; + + switch (charset) + { + case CUPS_TC_csASCII : + case CUPS_TC_csUTF8 : + case CUPS_TC_csUnicodeASCII : + strlcpy(supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name)); + break; + + case CUPS_TC_csISOLatin1 : + case CUPS_TC_csUnicodeLatin1 : + cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name), CUPS_ISO8859_1); + break; + + case CUPS_TC_csShiftJIS : + case CUPS_TC_csWindows31J : /* Close enough for our purposes */ + cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name), CUPS_JIS_X0213); + break; + + case CUPS_TC_csUCS4 : + case CUPS_TC_csUTF32 : + case CUPS_TC_csUTF32BE : + case CUPS_TC_csUTF32LE : + cupsUTF32ToUTF8((cups_utf8_t *)supplies[i - 1].name, + (cups_utf32_t *)packet->object_value.string.bytes, + sizeof(supplies[0].name)); + break; + + case CUPS_TC_csUnicode : + case CUPS_TC_csUTF16BE : + case CUPS_TC_csUTF16LE : + utf16_to_utf8((cups_utf8_t *)supplies[i - 1].name, + packet->object_value.string.bytes, + packet->object_value.string.num_bytes, + sizeof(supplies[0].name), charset == CUPS_TC_csUTF16LE); + break; + + default : + /* + * If we get here, the printer is using an unknown character set and + * we just want to copy characters that look like ASCII... + */ + + { + char *src, *dst; /* Pointers into strings */ + + /* + * Loop safe because both the object_value and supplies char arrays + * are CUPS_SNMP_MAX_STRING elements long. + */ + + for (src = (char *)packet->object_value.string.bytes, + dst = supplies[i - 1].name; + *src; + src ++) + { + if ((*src & 0x80) || *src < ' ' || *src == 0x7f) + *dst++ = '?'; + else + *dst++ = *src; + } + + *dst = '\0'; + } + break; + } + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesDescription.1.%d = \"%s\"\n", i, + supplies[i - 1].name); + + } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesLevel)) + { + /* + * Get level... + */ + + i = packet->object_name[prtMarkerSuppliesLevelOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_INTEGER) + return; + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesLevel.1.%d = %d\n", i, + packet->object_value.integer); + + if (i > num_supplies) + num_supplies = i; + + supplies[i - 1].level = packet->object_value.integer; + } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesMaxCapacity)) + { + /* + * Get max capacity... + */ + + i = packet->object_name[prtMarkerSuppliesMaxCapacityOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_INTEGER) + return; + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesMaxCapacity.1.%d = %d\n", i, + packet->object_value.integer); + + if (i > num_supplies) + num_supplies = i; + + supplies[i - 1].max_capacity = packet->object_value.integer; + } + else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesType)) + { + /* + * Get marker type... + */ + + i = packet->object_name[prtMarkerSuppliesTypeOffset]; + if (i < 1 || i > CUPS_MAX_SUPPLIES || + packet->object_type != CUPS_ASN1_INTEGER) + return; + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesType.1.%d = %d\n", i, + packet->object_value.integer); + + if (i > num_supplies) + num_supplies = i; + + supplies[i - 1].type = packet->object_value.integer; + } +} + + +/* + * 'utf16_to_utf8()' - Convert UTF-16 text to UTF-8. + */ + +static void +utf16_to_utf8( + cups_utf8_t *dst, /* I - Destination buffer */ + const unsigned char *src, /* I - Source string */ + size_t srcsize, /* I - Size of source string */ + size_t dstsize, /* I - Size of destination buffer */ + int le) /* I - Source is little-endian? */ +{ + cups_utf32_t ch, /* Current character */ + temp[CUPS_SNMP_MAX_STRING], + /* UTF-32 string */ + *ptr; /* Pointer into UTF-32 string */ + + + for (ptr = temp; srcsize >= 2;) + { + if (le) + ch = src[0] | (src[1] << 8); + else + ch = (src[0] << 8) | src[1]; + + src += 2; + srcsize -= 2; + + if (ch >= 0xd800 && ch <= 0xdbff && srcsize >= 2) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; /* Lower word */ + + + if (le) + lch = src[0] | (src[1] << 8); + else + lch = (src[0] << 8) | src[1]; + + if (lch >= 0xdc00 && lch <= 0xdfff) + { + src += 2; + srcsize -= 2; + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + } + + if (ptr < (temp + CUPS_SNMP_MAX_STRING - 1)) + *ptr++ = ch; + } + + *ptr = '\0'; + + cupsUTF32ToUTF8(dst, temp, dstsize); +} + + +/* + * End of "$Id: snmp-supplies.c 10262 2012-02-12 05:48:09Z mike $". + */ diff --git a/backend/snmp.c b/backend/snmp.c new file mode 100644 index 0000000..13ce9c8 --- /dev/null +++ b/backend/snmp.c @@ -0,0 +1,1395 @@ +/* + * "$Id: snmp.c 10209 2012-01-30 22:19:03Z mike $" + * + * SNMP discovery backend for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Discover printers via SNMP. + * add_array() - Add a string to an array. + * add_cache() - Add a cached device... + * add_device_uri() - Add a device URI to the cache. + * alarm_handler() - Handle alarm signals... + * compare_cache() - Compare two cache entries. + * debug_printf() - Display some debugging information. + * fix_make_model() - Fix common problems in the make-and-model + * string. + * free_array() - Free an array of strings. + * free_cache() - Free the array of cached devices. + * get_interface_addresses() - Get the broadcast address(es) associated with + * an interface. + * list_device() - List a device we found... + * password_cb() - Handle authentication requests. + * probe_device() - Probe a device to discover whether it is a + * printer. + * read_snmp_conf() - Read the snmp.conf file. + * read_snmp_response() - Read and parse a SNMP response... + * run_time() - Return the total running time... + * scan_devices() - Scan for devices using SNMP. + * try_connect() - Try connecting on a port... + * update_cache() - Update a cached device... + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" +#include +#include +#include +#include + + +/* + * This backend implements SNMP printer discovery. It uses a broadcast- + * based approach to get SNMP response packets from potential printers, + * requesting OIDs from the Host and Port Monitor MIBs, does a URI + * lookup based on the device description string, and finally a probe of + * port 9100 (AppSocket) and 515 (LPD). + * + * The current focus is on printers with internal network cards, although + * the code also works with many external print servers as well. + * + * The backend reads the snmp.conf file from the CUPS_SERVERROOT directory + * which can contain comments, blank lines, or any number of the following + * directives: + * + * Address ip-address + * Address @LOCAL + * Address @IF(name) + * Community name + * DebugLevel N + * DeviceURI "regex pattern" uri + * HostNameLookups on + * HostNameLookups off + * MaxRunTime N + * + * The default is to use: + * + * Address @LOCAL + * Community public + * DebugLevel 0 + * HostNameLookups off + * MaxRunTime 120 + * + * This backend is known to work with the following network printers and + * print servers: + * + * Axis OfficeBasic, 5400, 5600 + * Brother + * EPSON + * Genicom + * HP JetDirect + * Lexmark + * Sharp + * Tektronix + * Xerox + * + * It does not currently work with: + * + * DLink + * Linksys + * Netgear + * Okidata + * + * (for all of these, they do not support the Host MIB) + */ + +/* + * Types... + */ + +enum /**** Request IDs for each field ****/ +{ + DEVICE_TYPE = 1, + DEVICE_DESCRIPTION, + DEVICE_LOCATION, + DEVICE_ID, + DEVICE_URI, + DEVICE_PRODUCT +}; + +typedef struct device_uri_s /**** DeviceURI values ****/ +{ + regex_t re; /* Regular expression to match */ + cups_array_t *uris; /* URIs */ +} device_uri_t; + +typedef struct snmp_cache_s /**** SNMP scan cache ****/ +{ + http_addr_t address; /* Address of device */ + char *addrname, /* Name of device */ + *uri, /* device-uri */ + *id, /* device-id */ + *info, /* device-info */ + *location, /* device-location */ + *make_and_model; /* device-make-and-model */ + int sent; /* Has this device been listed? */ +} snmp_cache_t; + + +/* + * Local functions... + */ + +static char *add_array(cups_array_t *a, const char *s); +static void add_cache(http_addr_t *addr, const char *addrname, + const char *uri, const char *id, + const char *make_and_model); +static device_uri_t *add_device_uri(char *value); +static void alarm_handler(int sig); +static int compare_cache(snmp_cache_t *a, snmp_cache_t *b); +static void debug_printf(const char *format, ...); +static void fix_make_model(char *make_model, + const char *old_make_model, + int make_model_size); +static void free_array(cups_array_t *a); +static void free_cache(void); +static http_addrlist_t *get_interface_addresses(const char *ifname); +static void list_device(snmp_cache_t *cache); +static const char *password_cb(const char *prompt); +static void probe_device(snmp_cache_t *device); +static void read_snmp_conf(const char *address); +static void read_snmp_response(int fd); +static double run_time(void); +static void scan_devices(int ipv4, int ipv6); +static int try_connect(http_addr_t *addr, const char *addrname, + int port); +static void update_cache(snmp_cache_t *device, const char *uri, + const char *id, const char *make_model); + + +/* + * Local globals... + */ + +static cups_array_t *Addresses = NULL; +static cups_array_t *Communities = NULL; +static cups_array_t *Devices = NULL; +static int DebugLevel = 0; +static const int DescriptionOID[] = { CUPS_OID_hrDeviceDescr, 1, -1 }; +static const int LocationOID[] = { CUPS_OID_sysLocation, 0, -1 }; +static const int DeviceTypeOID[] = { CUPS_OID_hrDeviceType, 1, -1 }; +static const int DeviceIdOID[] = { CUPS_OID_ppmPrinterIEEE1284DeviceId, 1, -1 }; +static const int UriOID[] = { CUPS_OID_ppmPortServiceNameOrURI, 1, 1, -1 }; +static const int LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 }; +static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 }; +static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 }; +static const int HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 }; +static const int RicohDeviceIdOID[] = { 1,3,6,1,4,1,367,3,2,1,1,1,11,0,-1 }; +static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 }; +static cups_array_t *DeviceURIs = NULL; +static int HostNameLookups = 0; +static int MaxRunTime = 120; +static struct timeval StartTime; + + +/* + * 'main()' - Discover printers via SNMP. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + int ipv4, /* SNMP IPv4 socket */ + ipv6; /* SNMP IPv6 socket */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Check command-line options... + */ + + if (argc > 2) + { + _cupsLangPuts(stderr, _("Usage: snmp [host-or-ip-address]")); + return (1); + } + + /* + * Set the password callback for IPP operations... + */ + + cupsSetPasswordCB(password_cb); + + /* + * Catch SIGALRM signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGALRM, alarm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGALRM); + action.sa_handler = alarm_handler; + sigaction(SIGALRM, &action, NULL); +#else + signal(SIGALRM, alarm_handler); +#endif /* HAVE_SIGSET */ + + /* + * Open the SNMP socket... + */ + + if ((ipv4 = _cupsSNMPOpen(AF_INET)) < 0) + return (1); + +#ifdef AF_INET6 + if ((ipv6 = _cupsSNMPOpen(AF_INET6)) < 0) + return (1); +#else + ipv6 = -1; +#endif /* AF_INET6 */ + + /* + * Read the configuration file and any cache data... + */ + + read_snmp_conf(argv[1]); + + _cupsSNMPSetDebug(DebugLevel); + + Devices = cupsArrayNew((cups_array_func_t)compare_cache, NULL); + + /* + * Scan for devices... + */ + + scan_devices(ipv4, ipv6); + + /* + * Close, free, and return with no errors... + */ + + _cupsSNMPClose(ipv4); + if (ipv6 >= 0) + _cupsSNMPClose(ipv6); + + free_array(Addresses); + free_array(Communities); + free_cache(); + + return (0); +} + + +/* + * 'add_array()' - Add a string to an array. + */ + +static char * /* O - New string */ +add_array(cups_array_t *a, /* I - Array */ + const char *s) /* I - String to add */ +{ + char *dups; /* New string */ + + + dups = strdup(s); + + cupsArrayAdd(a, dups); + + return (dups); +} + + +/* + * 'add_cache()' - Add a cached device... + */ + +static void +add_cache(http_addr_t *addr, /* I - Device IP address */ + const char *addrname, /* I - IP address or name string */ + const char *uri, /* I - Device URI */ + const char *id, /* I - 1284 device ID */ + const char *make_and_model) /* I - Make and model */ +{ + snmp_cache_t *temp; /* New device entry */ + + + debug_printf("DEBUG: add_cache(addr=%p, addrname=\"%s\", uri=\"%s\", " + "id=\"%s\", make_and_model=\"%s\")\n", + addr, addrname, uri ? uri : "(null)", id ? id : "(null)", + make_and_model ? make_and_model : "(null)"); + + temp = calloc(1, sizeof(snmp_cache_t)); + memcpy(&(temp->address), addr, sizeof(temp->address)); + + temp->addrname = strdup(addrname); + + if (uri) + temp->uri = strdup(uri); + + if (id) + temp->id = strdup(id); + + if (make_and_model) + temp->make_and_model = strdup(make_and_model); + + cupsArrayAdd(Devices, temp); + + if (uri) + list_device(temp); +} + + +/* + * 'add_device_uri()' - Add a device URI to the cache. + * + * The value string is modified (chopped up) as needed. + */ + +static device_uri_t * /* O - Device URI */ +add_device_uri(char *value) /* I - Value from snmp.conf */ +{ + device_uri_t *device_uri; /* Device URI */ + char *start; /* Start of value */ + + + /* + * Allocate memory as needed... + */ + + if (!DeviceURIs) + DeviceURIs = cupsArrayNew(NULL, NULL); + + if (!DeviceURIs) + return (NULL); + + if ((device_uri = calloc(1, sizeof(device_uri_t))) == NULL) + return (NULL); + + if ((device_uri->uris = cupsArrayNew(NULL, NULL)) == NULL) + { + free(device_uri); + return (NULL); + } + + /* + * Scan the value string for the regular expression and URI(s)... + */ + + value ++; /* Skip leading " */ + + for (start = value; *value && *value != '\"'; value ++) + if (*value == '\\' && value[1]) + _cups_strcpy(value, value + 1); + + if (!*value) + { + fputs("ERROR: Missing end quote for DeviceURI!\n", stderr); + + cupsArrayDelete(device_uri->uris); + free(device_uri); + + return (NULL); + } + + *value++ = '\0'; + + if (regcomp(&(device_uri->re), start, REG_EXTENDED | REG_ICASE)) + { + fputs("ERROR: Bad regular expression for DeviceURI!\n", stderr); + + cupsArrayDelete(device_uri->uris); + free(device_uri); + + return (NULL); + } + + while (*value) + { + while (isspace(*value & 255)) + value ++; + + if (!*value) + break; + + for (start = value; *value && !isspace(*value & 255); value ++); + + if (*value) + *value++ = '\0'; + + cupsArrayAdd(device_uri->uris, strdup(start)); + } + + /* + * Add the device URI to the list and return it... + */ + + cupsArrayAdd(DeviceURIs, device_uri); + + return (device_uri); +} + + +/* + * 'alarm_handler()' - Handle alarm signals... + */ + +static void +alarm_handler(int sig) /* I - Signal number */ +{ + /* + * Do nothing... + */ + + (void)sig; + +#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION) + signal(SIGALRM, alarm_handler); +#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ + + if (DebugLevel) + write(2, "DEBUG: ALARM!\n", 14); +} + + +/* + * 'compare_cache()' - Compare two cache entries. + */ + +static int /* O - Result of comparison */ +compare_cache(snmp_cache_t *a, /* I - First cache entry */ + snmp_cache_t *b) /* I - Second cache entry */ +{ + return (_cups_strcasecmp(a->addrname, b->addrname)); +} + + +/* + * 'debug_printf()' - Display some debugging information. + */ + +static void +debug_printf(const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to arguments */ + + + if (!DebugLevel) + return; + + va_start(ap, format); + vfprintf(stderr, format, ap); + va_end(ap); +} + + +/* + * 'fix_make_model()' - Fix common problems in the make-and-model string. + */ + +static void +fix_make_model( + char *make_model, /* I - New make-and-model string */ + const char *old_make_model, /* I - Old make-and-model string */ + int make_model_size) /* I - Size of new string buffer */ +{ + char *mmptr; /* Pointer into make-and-model string */ + + + /* + * Fix some common problems with the make-and-model string so + * that printer driver detection works better... + */ + + if (!_cups_strncasecmp(old_make_model, "Hewlett-Packard", 15)) + { + /* + * Strip leading Hewlett-Packard and hp prefixes and replace + * with a single HP manufacturer prefix... + */ + + mmptr = (char *)old_make_model + 15; + + while (isspace(*mmptr & 255)) + mmptr ++; + + if (!_cups_strncasecmp(mmptr, "hp", 2)) + { + mmptr += 2; + + while (isspace(*mmptr & 255)) + mmptr ++; + } + + make_model[0] = 'H'; + make_model[1] = 'P'; + make_model[2] = ' '; + strlcpy(make_model + 3, mmptr, make_model_size - 3); + } + else if (!_cups_strncasecmp(old_make_model, "deskjet", 7)) + snprintf(make_model, make_model_size, "HP DeskJet%s", old_make_model + 7); + else if (!_cups_strncasecmp(old_make_model, "officejet", 9)) + snprintf(make_model, make_model_size, "HP OfficeJet%s", old_make_model + 9); + else if (!_cups_strncasecmp(old_make_model, "stylus_pro_", 11)) + snprintf(make_model, make_model_size, "EPSON Stylus Pro %s", + old_make_model + 11); + else + strlcpy(make_model, old_make_model, make_model_size); + + if ((mmptr = strstr(make_model, ", Inc.,")) != NULL) + { + /* + * Strip inc. from name, e.g. "Tektronix, Inc., Phaser 560" + * becomes "Tektronix Phaser 560"... + */ + + _cups_strcpy(mmptr, mmptr + 7); + } + + if ((mmptr = strstr(make_model, " Network")) != NULL) + { + /* + * Drop unnecessary informational text, e.g. "Xerox DocuPrint N2025 + * Network LaserJet - 2.12" becomes "Xerox DocuPrint N2025"... + */ + + *mmptr = '\0'; + } + + if ((mmptr = strchr(make_model, ',')) != NULL) + { + /* + * Drop anything after a trailing comma... + */ + + *mmptr = '\0'; + } +} + + +/* + * 'free_array()' - Free an array of strings. + */ + +static void +free_array(cups_array_t *a) /* I - Array */ +{ + char *s; /* Current string */ + + + for (s = (char *)cupsArrayFirst(a); s; s = (char *)cupsArrayNext(a)) + free(s); + + cupsArrayDelete(a); +} + + +/* + * 'free_cache()' - Free the array of cached devices. + */ + +static void +free_cache(void) +{ + snmp_cache_t *cache; /* Cached device */ + + + for (cache = (snmp_cache_t *)cupsArrayFirst(Devices); + cache; + cache = (snmp_cache_t *)cupsArrayNext(Devices)) + { + free(cache->addrname); + + if (cache->uri) + free(cache->uri); + + if (cache->id) + free(cache->id); + + if (cache->make_and_model) + free(cache->make_and_model); + + free(cache); + } + + cupsArrayDelete(Devices); + Devices = NULL; +} + + +/* + * 'get_interface_addresses()' - Get the broadcast address(es) associated + * with an interface. + */ + +static http_addrlist_t * /* O - List of addresses */ +get_interface_addresses( + const char *ifname) /* I - Interface name */ +{ + struct ifaddrs *addrs, /* Interface address list */ + *addr; /* Current interface address */ + http_addrlist_t *first, /* First address in list */ + *last, /* Last address in list */ + *current; /* Current address */ + + + if (getifaddrs(&addrs) < 0) + return (NULL); + + for (addr = addrs, first = NULL, last = NULL; addr; addr = addr->ifa_next) + if ((addr->ifa_flags & IFF_BROADCAST) && addr->ifa_broadaddr && + addr->ifa_broadaddr->sa_family == AF_INET && + (!ifname || !strcmp(ifname, addr->ifa_name))) + { + current = calloc(1, sizeof(http_addrlist_t)); + + memcpy(&(current->addr), addr->ifa_broadaddr, + sizeof(struct sockaddr_in)); + + if (!last) + first = current; + else + last->next = current; + + last = current; + } + + freeifaddrs(addrs); + + return (first); +} + + +/* + * 'list_device()' - List a device we found... + */ + +static void +list_device(snmp_cache_t *cache) /* I - Cached device */ +{ + if (cache->uri) + cupsBackendReport("network", cache->uri, cache->make_and_model, + cache->info, cache->id, cache->location); +} + + +/* + * 'password_cb()' - Handle authentication requests. + * + * All we do right now is return NULL, indicating that no authentication + * is possible. + */ + +static const char * /* O - Password (NULL) */ +password_cb(const char *prompt) /* I - Prompt message */ +{ + (void)prompt; /* Anti-compiler-warning-code */ + + return (NULL); +} + + +/* + * 'probe_device()' - Probe a device to discover whether it is a printer. + * + * TODO: Try using the Port Monitor MIB to discover the correct protocol + * to use - first need a commercially-available printer that supports + * it, though... + */ + +static void +probe_device(snmp_cache_t *device) /* I - Device */ +{ + char uri[1024], /* Full device URI */ + *uriptr, /* Pointer into URI */ + *format; /* Format string for device */ + device_uri_t *device_uri; /* Current DeviceURI match */ + + + debug_printf("DEBUG: %.3f Probing %s...\n", run_time(), device->addrname); + +#ifdef __APPLE__ + /* + * If the printer supports Bonjour/mDNS, don't report it from the SNMP backend. + */ + + if (!try_connect(&(device->address), device->addrname, 5353)) + { + debug_printf("DEBUG: %s supports mDNS, not reporting!\n", device->addrname); + return; + } +#endif /* __APPLE__ */ + + /* + * Lookup the device in the match table... + */ + + for (device_uri = (device_uri_t *)cupsArrayFirst(DeviceURIs); + device_uri; + device_uri = (device_uri_t *)cupsArrayNext(DeviceURIs)) + if (device->make_and_model && + !regexec(&(device_uri->re), device->make_and_model, 0, NULL, 0)) + { + /* + * Found a match, add the URIs... + */ + + for (format = (char *)cupsArrayFirst(device_uri->uris); + format; + format = (char *)cupsArrayNext(device_uri->uris)) + { + for (uriptr = uri; *format && uriptr < (uri + sizeof(uri) - 1);) + if (*format == '%' && format[1] == 's') + { + /* + * Insert hostname/address... + */ + + strlcpy(uriptr, device->addrname, sizeof(uri) - (uriptr - uri)); + uriptr += strlen(uriptr); + format += 2; + } + else + *uriptr++ = *format++; + + *uriptr = '\0'; + + update_cache(device, uri, NULL, NULL); + } + + return; + } + + /* + * Then try the standard ports... + */ + + if (!try_connect(&(device->address), device->addrname, 9100)) + { + debug_printf("DEBUG: %s supports AppSocket!\n", device->addrname); + + snprintf(uri, sizeof(uri), "socket://%s", device->addrname); + update_cache(device, uri, NULL, NULL); + } + else if (!try_connect(&(device->address), device->addrname, 515)) + { + debug_printf("DEBUG: %s supports LPD!\n", device->addrname); + + snprintf(uri, sizeof(uri), "lpd://%s/", device->addrname); + update_cache(device, uri, NULL, NULL); + } +} + + +/* + * 'read_snmp_conf()' - Read the snmp.conf file. + */ + +static void +read_snmp_conf(const char *address) /* I - Single address to probe */ +{ + cups_file_t *fp; /* File pointer */ + char filename[1024], /* Filename */ + line[1024], /* Line from file */ + *value; /* Value on line */ + int linenum; /* Line number */ + const char *cups_serverroot; /* CUPS_SERVERROOT env var */ + const char *debug; /* CUPS_DEBUG_LEVEL env var */ + const char *runtime; /* CUPS_MAX_RUN_TIME env var */ + + + /* + * Initialize the global address and community lists... + */ + + Addresses = cupsArrayNew(NULL, NULL); + Communities = cupsArrayNew(NULL, NULL); + + if (address) + add_array(Addresses, address); + + if ((debug = getenv("CUPS_DEBUG_LEVEL")) != NULL) + DebugLevel = atoi(debug); + + if ((runtime = getenv("CUPS_MAX_RUN_TIME")) != NULL) + MaxRunTime = atoi(runtime); + + /* + * Find the snmp.conf file... + */ + + if ((cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) + cups_serverroot = CUPS_SERVERROOT; + + snprintf(filename, sizeof(filename), "%s/snmp.conf", cups_serverroot); + + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + /* + * Read the snmp.conf file... + */ + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!value) + fprintf(stderr, "ERROR: Missing value on line %d of %s!\n", linenum, + filename); + else if (!_cups_strcasecmp(line, "Address")) + { + if (!address) + add_array(Addresses, value); + } + else if (!_cups_strcasecmp(line, "Community")) + add_array(Communities, value); + else if (!_cups_strcasecmp(line, "DebugLevel")) + DebugLevel = atoi(value); + else if (!_cups_strcasecmp(line, "DeviceURI")) + { + if (*value != '\"') + fprintf(stderr, + "ERROR: Missing double quote for regular expression on " + "line %d of %s!\n", linenum, filename); + else + add_device_uri(value); + } + else if (!_cups_strcasecmp(line, "HostNameLookups")) + HostNameLookups = !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "true") || + !_cups_strcasecmp(value, "double"); + else if (!_cups_strcasecmp(line, "MaxRunTime")) + MaxRunTime = atoi(value); + else + fprintf(stderr, "ERROR: Unknown directive %s on line %d of %s!\n", + line, linenum, filename); + } + + cupsFileClose(fp); + } + + /* + * Use defaults if parameters are undefined... + */ + + if (cupsArrayCount(Addresses) == 0) + { + /* + * If we have no addresses, exit immediately... + */ + + fprintf(stderr, + "DEBUG: No address specified and no Address line in %s...\n", + filename); + exit(0); + } + + if (cupsArrayCount(Communities) == 0) + { + fputs("INFO: Using default SNMP Community public\n", stderr); + add_array(Communities, "public"); + } +} + + +/* + * 'read_snmp_response()' - Read and parse a SNMP response... + */ + +static void +read_snmp_response(int fd) /* I - SNMP socket file descriptor */ +{ + char addrname[256]; /* Source address name */ + cups_snmp_t packet; /* Decoded packet */ + snmp_cache_t key, /* Search key */ + *device; /* Matching device */ + + + /* + * Read the response data... + */ + + if (!_cupsSNMPRead(fd, &packet, -1.0)) + { + fprintf(stderr, "ERROR: Unable to read data from socket: %s\n", + strerror(errno)); + return; + } + + if (HostNameLookups) + httpAddrLookup(&(packet.address), addrname, sizeof(addrname)); + else + httpAddrString(&(packet.address), addrname, sizeof(addrname)); + + debug_printf("DEBUG: %.3f Received data from %s...\n", run_time(), addrname); + + /* + * Look for the response status code in the SNMP message header... + */ + + if (packet.error) + { + fprintf(stderr, "ERROR: Bad SNMP packet from %s: %s\n", addrname, + packet.error); + + return; + } + + debug_printf("DEBUG: community=\"%s\"\n", packet.community); + debug_printf("DEBUG: request-id=%d\n", packet.request_id); + debug_printf("DEBUG: error-status=%d\n", packet.error_status); + + if (packet.error_status && packet.request_id != DEVICE_TYPE) + return; + + /* + * Find a matching device in the cache... + */ + + key.addrname = addrname; + device = (snmp_cache_t *)cupsArrayFind(Devices, &key); + + /* + * Process the message... + */ + + switch (packet.request_id) + { + case DEVICE_TYPE : + /* + * Got the device type response... + */ + + if (device) + { + debug_printf("DEBUG: Discarding duplicate device type for \"%s\"...\n", + addrname); + return; + } + + /* + * Add the device and request the device data... + */ + + add_cache(&(packet.address), addrname, NULL, NULL, NULL); + + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_DESCRIPTION, DescriptionOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, DeviceIdOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_URI, UriOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_LOCATION, LocationOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_PRODUCT, LexmarkProductOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_PRODUCT, LexmarkProductOID2); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, LexmarkDeviceIdOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, RicohDeviceIdOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_PRODUCT, XeroxProductOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, HPDeviceIdOID); + break; + + case DEVICE_DESCRIPTION : + if (device && packet.object_type == CUPS_ASN1_OCTET_STRING) + { + /* + * Update an existing cache entry... + */ + + char make_model[256]; /* Make and model */ + + + if (strchr((char *)packet.object_value.string.bytes, ':') && + strchr((char *)packet.object_value.string.bytes, ';')) + { + /* + * Description is the IEEE-1284 device ID... + */ + + if (!device->id) + device->id = strdup((char *)packet.object_value.string.bytes); + + backendGetMakeModel((char *)packet.object_value.string.bytes, + make_model, sizeof(make_model)); + + if (device->info) + free(device->info); + + device->info = strdup(make_model); + } + else + { + /* + * Description is plain text... + */ + + fix_make_model(make_model, (char *)packet.object_value.string.bytes, + sizeof(make_model)); + + if (device->info) + free(device->info); + + device->info = strdup((char *)packet.object_value.string.bytes); + } + + if (!device->make_and_model) + device->make_and_model = strdup(make_model); + } + break; + + case DEVICE_ID : + if (device && packet.object_type == CUPS_ASN1_OCTET_STRING && + (!device->id || + strlen(device->id) < packet.object_value.string.num_bytes)) + { + /* + * Update an existing cache entry... + */ + + char make_model[256]; /* Make and model */ + + + if (device->id) + free(device->id); + + device->id = strdup((char *)packet.object_value.string.bytes); + + /* + * Convert the ID to a make and model string... + */ + + backendGetMakeModel((char *)packet.object_value.string.bytes, + make_model, sizeof(make_model)); + if (device->make_and_model) + free(device->make_and_model); + + device->make_and_model = strdup(make_model); + } + break; + + case DEVICE_LOCATION : + if (device && packet.object_type == CUPS_ASN1_OCTET_STRING && + !device->location) + device->location = strdup((char *)packet.object_value.string.bytes); + break; + + case DEVICE_PRODUCT : + if (device && packet.object_type == CUPS_ASN1_OCTET_STRING && + !device->id) + { + /* + * Update an existing cache entry... + */ + + if (!device->info) + device->info = strdup((char *)packet.object_value.string.bytes); + + if (device->make_and_model) + free(device->make_and_model); + + device->make_and_model = strdup((char *)packet.object_value.string.bytes); + } + break; + + case DEVICE_URI : + if (device && packet.object_type == CUPS_ASN1_OCTET_STRING && + !device->uri && packet.object_value.string.num_bytes > 3) + { + /* + * Update an existing cache entry... + */ + + char scheme[32], /* URI scheme */ + userpass[256], /* Username:password in URI */ + hostname[256], /* Hostname in URI */ + resource[1024]; /* Resource path in URI */ + int port; /* Port number in URI */ + + if (!strncmp((char *)packet.object_value.string.bytes, "lpr:", 4)) + { + /* + * We want "lpd://..." for the URI... + */ + + packet.object_value.string.bytes[2] = 'd'; + } + + if (httpSeparateURI(HTTP_URI_CODING_ALL, + (char *)packet.object_value.string.bytes, + scheme, sizeof(scheme), + userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)) >= HTTP_URI_OK) + device->uri = strdup((char *)packet.object_value.string.bytes); + } + break; + } +} + + +/* + * 'run_time()' - Return the total running time... + */ + +static double /* O - Number of seconds */ +run_time(void) +{ + struct timeval curtime; /* Current time */ + + + gettimeofday(&curtime, NULL); + + return (curtime.tv_sec - StartTime.tv_sec + + 0.000001 * (curtime.tv_usec - StartTime.tv_usec)); +} + + +/* + * 'scan_devices()' - Scan for devices using SNMP. + */ + +static void +scan_devices(int ipv4, /* I - SNMP IPv4 socket */ + int ipv6) /* I - SNMP IPv6 socket */ +{ + int fd, /* File descriptor for this address */ + busy; /* Are we busy processing something? */ + char *address, /* Current address */ + *community; /* Current community */ + fd_set input; /* Input set for select() */ + struct timeval timeout; /* Timeout for select() */ + time_t endtime; /* End time for scan */ + http_addrlist_t *addrs, /* List of addresses */ + *addr; /* Current address */ + snmp_cache_t *device; /* Current device */ + char temp[1024]; /* Temporary address string */ + + + gettimeofday(&StartTime, NULL); + + /* + * First send all of the broadcast queries... + */ + + for (address = (char *)cupsArrayFirst(Addresses); + address; + address = (char *)cupsArrayNext(Addresses)) + { + if (!strcmp(address, "@LOCAL")) + addrs = get_interface_addresses(NULL); + else if (!strncmp(address, "@IF(", 4)) + { + char ifname[255]; /* Interface name */ + + strlcpy(ifname, address + 4, sizeof(ifname)); + if (ifname[0]) + ifname[strlen(ifname) - 1] = '\0'; + + addrs = get_interface_addresses(ifname); + } + else + addrs = httpAddrGetList(address, AF_UNSPEC, NULL); + + if (!addrs) + { + fprintf(stderr, "ERROR: Unable to scan \"%s\"!\n", address); + continue; + } + + for (community = (char *)cupsArrayFirst(Communities); + community; + community = (char *)cupsArrayNext(Communities)) + { + debug_printf("DEBUG: Scanning for devices in \"%s\" via \"%s\"...\n", + community, address); + + for (addr = addrs; addr; addr = addr->next) + { +#ifdef AF_INET6 + if (_httpAddrFamily(&(addr->addr)) == AF_INET6) + fd = ipv6; + else +#endif /* AF_INET6 */ + fd = ipv4; + + debug_printf("DEBUG: Sending get request to %s...\n", + httpAddrString(&(addr->addr), temp, sizeof(temp))); + + _cupsSNMPWrite(fd, &(addr->addr), CUPS_SNMP_VERSION_1, community, + CUPS_ASN1_GET_REQUEST, DEVICE_TYPE, DeviceTypeOID); + } + } + + httpAddrFreeList(addrs); + } + + /* + * Then read any responses that come in over the next 3 seconds... + */ + + endtime = time(NULL) + MaxRunTime; + + FD_ZERO(&input); + + while (time(NULL) < endtime) + { + timeout.tv_sec = 2; + timeout.tv_usec = 0; + + FD_SET(ipv4, &input); + if (ipv6 >= 0) + FD_SET(ipv6, &input); + + fd = ipv4 > ipv6 ? ipv4 : ipv6; + if (select(fd + 1, &input, NULL, NULL, &timeout) < 0) + { + fprintf(stderr, "ERROR: %.3f select() for %d/%d failed: %s\n", run_time(), + ipv4, ipv6, strerror(errno)); + break; + } + + busy = 0; + + if (FD_ISSET(ipv4, &input)) + { + read_snmp_response(ipv4); + busy = 1; + } + + if (ipv6 >= 0 && FD_ISSET(ipv6, &input)) + { + read_snmp_response(ipv6); + busy = 1; + } + + if (!busy) + { + /* + * List devices with complete information... + */ + + int sent_something = 0; + + for (device = (snmp_cache_t *)cupsArrayFirst(Devices); + device; + device = (snmp_cache_t *)cupsArrayNext(Devices)) + if (!device->sent && device->info && device->make_and_model) + { + if (device->uri) + list_device(device); + else + probe_device(device); + + device->sent = sent_something = 1; + } + + if (!sent_something) + break; + } + } + + debug_printf("DEBUG: %.3f Scan complete!\n", run_time()); +} + + +/* + * 'try_connect()' - Try connecting on a port... + */ + +static int /* O - 0 on success or -1 on error */ +try_connect(http_addr_t *addr, /* I - Socket address */ + const char *addrname, /* I - Hostname or IP address */ + int port) /* I - Port number */ +{ + int fd; /* Socket */ + int status; /* Connection status */ + + + debug_printf("DEBUG: %.3f Trying %s://%s:%d...\n", run_time(), + port == 515 ? "lpd" : "socket", addrname, port); + + if ((fd = socket(_httpAddrFamily(addr), SOCK_STREAM, 0)) < 0) + { + fprintf(stderr, "ERROR: Unable to create socket: %s\n", + strerror(errno)); + return (-1); + } + + _httpAddrSetPort(addr, port); + + alarm(1); + + status = connect(fd, (void *)addr, httpAddrLength(addr)); + + close(fd); + alarm(0); + + return (status); +} + + +/* + * 'update_cache()' - Update a cached device... + */ + +static void +update_cache(snmp_cache_t *device, /* I - Device */ + const char *uri, /* I - Device URI */ + const char *id, /* I - Device ID */ + const char *make_model) /* I - Device make and model */ +{ + if (device->uri) + free(device->uri); + + device->uri = strdup(uri); + + if (id) + { + if (device->id) + free(device->id); + + device->id = strdup(id); + } + + if (make_model) + { + if (device->make_and_model) + free(device->make_and_model); + + device->make_and_model = strdup(make_model); + } + + list_device(device); +} + + +/* + * End of "$Id: snmp.c 10209 2012-01-30 22:19:03Z mike $". + */ diff --git a/backend/snmp.txt b/backend/snmp.txt new file mode 100644 index 0000000..77a38c4 --- /dev/null +++ b/backend/snmp.txt @@ -0,0 +1,172 @@ +snmp.txt - 2006-04-19 +--------------------- + +This file lists the "interesting" bits from the command: + + snmpwalk -v 1 -c public HOST .1 + +for many network print servers and internal cards. It is mainly here +for SNMP documentation and development purposes. + + +AXIS 5600 + +SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM J.sp.00,JETDIRECT EX,JD28,EEPROM 6.16.5 +SNMPv2-MIB::sysName.0 = STRING: +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Hewlett-Packard hp LaserJet 3380 +HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Axis AXIS 5600 +HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Axis AXIS 5600 +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero +SNMPv2-SMI::enterprises.11.2.4.3.10.8.0 = STRING: "AXIS433AE8" +SNMPv2-SMI::enterprises.368.2.3.2.601.0 = INTEGER: 9100 +SNMPv2-SMI::enterprises.368.2.3.2.602.0 = INTEGER: 9101 +SNMPv2-SMI::enterprises.368.2.3.2.603.0 = INTEGER: 9102 +SNMPv2-SMI::enterprises.368.2.3.10.901.0 = STRING: "AXIS433AE8" + + +AXIS OfficeBasic + +SNMPv2-MIB::sysDescr.0 = STRING: AXIS OfficeBasic Parallel Network Print Server V6.43 Sep 4 2003 +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Photo 870 +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero + + +DLink DP-301P+ + +SNMPv2-MIB::sysDescr.0 = STRING: D-Link DP-301P+ Print Server + + +Genicom ML280 + +SNMPv2-MIB::sysDescr.0 = STRING: GENICOM microLaser 280 +SNMPv2-MIB::sysName.0 = STRING: PRQ_004F75 +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: MANUFACTURER:GENICOM;MODEL:microLaser 280; +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.3369.1.1.2.4 + + +EPSON Type-B Network Card + +SNMPv2-MIB::sysDescr.0 = STRING: EPSON Type-B 10Base-T/100Base-TX Print Server +SNMPv2-MIB::sysName.0 = STRING: StylusPro7600-BB87A8 +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: EPSON Stylus Pro 7600 +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.1248.1.2.1.22.69.109.117.108.97.116.101.83.116.121.108.117.115.32.80.114.111.32.55.54.48.48 +SNMPv2-SMI::enterprises.11.2.3.9.1.1.7.0 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;" +SNMPv2-SMI::enterprises.1248.1.2.2.1.1.1.1.1 = STRING: "MFG:EPSON;CMD:ESCPL2,BDC;MDL:Stylus Pro 7600;CLS:PRINTER;DES:EPSON Stylus Pro 7600;" + + +EPSON Wireless 802.11b Print Server + +SNMPv2-MIB::sysDescr.0 = STRING: EPSON Wireless LAN Print Interface compatible with an HP JETDIRECT EX +SNMPv2-MIB::sysName.0 = STRING: EAI_0F550B +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero + + +HP JetDirect EX3plus + +SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM D.04.03,JETDIRECT EX,JD26,EEPROM D.05.22 +SNMPv2-MIB::sysName.0 = STRING: NPID1EC0F + + +HP LJ4000 + +SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM G.05.34,JETDIRECT,JD30,EEPROM G.08.32 +SNMPv2-MIB::sysName.0 = STRING: +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP LaserJet 4000 Series +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.5 + + +HP CLJ4550 + +SNMPv2-MIB::sysDescr.0 = STRING: HP ETHERNET MULTI-ENVIRONMENT,ROM L.20.07,JETDIRECT,JD84,EEPROM L.21.22,CIDATE 07/06/2001 +SNMPv2-MIB::sysName.0 = STRING: NPI02FDE7 +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP Color LaserJet 4550 +HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Hewlett-Packard Dynamic RAM Disk +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.11.2.3.9.1.2.14 + + +Lexmark C522 + +SNMPv2-MIB::sysDescr.0 = STRING: Lexmark C522 version NS.NP.N212 kernel 2.6.6 All-N-1 +SNMPv2-MIB::sysName.0 = STRING: ET0004000D0CCA +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory +HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor +HOST-RESOURCES-MIB::hrDeviceType.4 = OID: HOST-RESOURCES-TYPES::hrDeviceSerialPort +HOST-RESOURCES-MIB::hrDeviceType.5 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Lexmark C522 9421TTV LS.FA.P129 +HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: Nonvolatile RAM +HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: IBM 750 Rev CXr +HOST-RESOURCES-MIB::hrDeviceDescr.4 = STRING: USB Interface +HOST-RESOURCES-MIB::hrDeviceDescr.5 = STRING: Network Interface +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.3 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.4 = OID: SNMPv2-SMI::zeroDotZero +HOST-RESOURCES-MIB::hrDeviceID.5 = OID: SNMPv2-SMI::enterprises.641.1 +SNMPv2-SMI::enterprises.641.2.1.2.1.2.1 = STRING: "Lexmark C522" +SNMPv2-SMI::enterprises.641.2.1.2.1.3.1 = STRING: "MANUFACTURER:Lexmark International;COMMAND SET:;MODEL:Lexmark C522" + + +Linksys EPSX3 + +SNMPv2-MIB::sysDescr.0 = STRING: ETHERNET MULTI-ENVIRONMENT.ROM, JETDIRECT EX, EEPROM 6016 + + +NetGear PS113 + +SNMPv2-MIB::sysDescr.0 = STRING: A SNMP proxy agent. + + +Okidata C7200 + +SNMPv2-MIB::sysDescr.0 = STRING: OkiLAN 6200e +SNMPv2-MIB::sysName.0 = STRING: OKI7009715 +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolat +ileMemory +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: C7200 +HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: FLASH0 +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.2001.1.1.1.1 +HOST-RESOURCES-MIB::hrDeviceID.2 = OID: SNMPv2-SMI::zeroDotZero +SNMPv2-SMI::mib-2.43.14.1.1.3.1.1 = STRING: "IEEE 1284" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.2 = STRING: "EtherTalk Phase 2" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.3 = STRING: "LPD" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.4 = STRING: "Netware Rprinter" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.5 = STRING: "Netware Bindery or NDS Pserver" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.6 = STRING: "Raw TCP Port 9100" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.7 = STRING: "FTP" +SNMPv2-SMI::mib-2.43.14.1.1.3.1.8 = STRING: "DLC/LLC" +SNMPv2-SMI::enterprises.2001.1.1.1.1.1.3530.0 = STRING: "C7200" + + +Xerox N2025 + +SNMPv2-MIB::sysDescr.0 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02 +SNMPv2-MIB::sysName.0 = STRING: +HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter +HOST-RESOURCES-MIB::hrDeviceType.2 = OID: HOST-RESOURCES-TYPES::hrDeviceParallelPort +HOST-RESOURCES-MIB::hrDeviceType.3 = OID: HOST-RESOURCES-TYPES::hrDeviceNetwork +HOST-RESOURCES-MIB::hrDeviceType.6 = OID: HOST-RESOURCES-TYPES::hrDeviceProcessor +HOST-RESOURCES-MIB::hrDeviceType.7 = OID: HOST-RESOURCES-TYPES::hrDeviceOther +HOST-RESOURCES-MIB::hrDeviceType.9 = OID: HOST-RESOURCES-TYPES::hrDeviceVolatileMemory +HOST-RESOURCES-MIB::hrDeviceType.10 = OID: HOST-RESOURCES-TYPES::hrDeviceNonVolatileMemory +HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: Xerox DocuPrint N2025 Network Laser Printer - 2.12-02 +HOST-RESOURCES-MIB::hrDeviceDescr.2 = STRING: IEEE 1284 port +HOST-RESOURCES-MIB::hrDeviceDescr.3 = STRING: Ethernet port +HOST-RESOURCES-MIB::hrDeviceDescr.6 = STRING: Motorola Power PC +HOST-RESOURCES-MIB::hrDeviceDescr.7 = STRING: USB Port +HOST-RESOURCES-MIB::hrDeviceDescr.9 = STRING: RAM Memory +HOST-RESOURCES-MIB::hrDeviceDescr.10 = STRING: ROM Memory +HOST-RESOURCES-MIB::hrDeviceID.1 = OID: SNMPv2-SMI::enterprises.253.8.62.1.3.2.17.1 + diff --git a/backend/socket.c b/backend/socket.c new file mode 100644 index 0000000..5e28fc8 --- /dev/null +++ b/backend/socket.c @@ -0,0 +1,527 @@ +/* + * "$Id: socket.c 9793 2011-05-20 03:49:49Z mike $" + * + * AppSocket backend for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Send a file to the printer or server. + * wait_bc() - Wait for back-channel data... + */ + +/* + * Include necessary headers. + */ + +#include +#include "backend-private.h" +#include +#include +#include + +#ifdef WIN32 +# include +#else +# include +# include +# include +# include +# include +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +static int wait_bc(int device_fd, int secs); + + +/* + * 'main()' - Send a file to the printer or server. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + const char *device_uri; /* Device URI */ + char scheme[255], /* Scheme in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info (not used) */ + resource[1024], /* Resource info (not used) */ + *options, /* Pointer to options */ + *name, /* Name of option */ + *value, /* Value of option */ + sep; /* Option separator */ + int print_fd; /* Print file */ + int copies; /* Number of copies to print */ + time_t start_time; /* Time of first connect */ +#ifdef __APPLE__ + time_t current_time, /* Current time */ + wait_time; /* Time to wait before shutting down socket */ +#endif /* __APPLE__ */ + int contimeout; /* Connection timeout */ + int waiteof; /* Wait for end-of-file? */ + int port; /* Port number */ + char portname[255]; /* Port name */ + int delay; /* Delay for retries... */ + int device_fd; /* AppSocket */ + int error; /* Error code (if any) */ + http_addrlist_t *addrlist, /* Address list */ + *addr; /* Connected address */ + char addrname[256]; /* Address name */ + int snmp_fd, /* SNMP socket */ + start_count, /* Page count via SNMP at start */ + page_count, /* Page count via SNMP */ + have_supplies; /* Printer supports supply levels? */ + ssize_t bytes = 0, /* Initial bytes read */ + tbytes; /* Total number of bytes written */ + char buffer[1024]; /* Initial print buffer */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + printf("network socket \"Unknown\" \"%s\"\n", + _cupsLangString(cupsLangDefault(), _("AppSocket/HP JetDirect"))); + return (CUPS_BACKEND_OK); + } + else if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_FAILED); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + print_fd = 0; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((print_fd = open(argv[6], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + + copies = atoi(argv[4]); + } + + /* + * Extract the hostname and port number from the URI... + */ + + while ((device_uri = cupsBackendDeviceURI(argv)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", _("Unable to locate printer.")); + sleep(10); + + if (getenv("CLASS") != NULL) + return (CUPS_BACKEND_FAILED); + } + + httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if (port == 0) + port = 9100; /* Default to HP JetDirect/Tektronix PhaserShare */ + + /* + * Get options, if any... + */ + + waiteof = 1; + contimeout = 7 * 24 * 60 * 60; + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + + /* + * Parse options... + */ + + while (*options) + { + /* + * Get the name... + */ + + name = options; + + while (*options && *options != '=' && *options != '+' && *options != '&') + options ++; + + if ((sep = *options) != '\0') + *options++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = options; + + while (*options && *options != '+' && *options != '&') + options ++; + + if (*options) + *options++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!_cups_strcasecmp(name, "waiteof")) + { + /* + * Set the wait-for-eof value... + */ + + waiteof = !value[0] || !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(name, "contimeout")) + { + /* + * Set the connection timeout... + */ + + if (atoi(value) > 0) + contimeout = atoi(value); + } + } + } + + /* + * Then try finding the remote host... + */ + + start_time = time(NULL); + + sprintf(portname, "%d", port); + + fputs("STATE: +connecting-to-device\n", stderr); + fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); + + while ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to locate printer \"%s\"."), hostname); + sleep(10); + + if (getenv("CLASS") != NULL) + { + fputs("STATE: -connecting-to-device\n", stderr); + return (CUPS_BACKEND_STOP); + } + } + + /* + * See if the printer supports SNMP... + */ + + if ((snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family)) >= 0) + { + have_supplies = !backendSNMPSupplies(snmp_fd, &(addrlist->addr), + &start_count, NULL); + } + else + have_supplies = start_count = 0; + + /* + * Wait for data from the filter... + */ + + if (print_fd == 0) + { + if (!backendWaitLoop(snmp_fd, &(addrlist->addr), 1, backendNetworkSideCB)) + return (CUPS_BACKEND_OK); + else if ((bytes = read(0, buffer, sizeof(buffer))) <= 0) + return (CUPS_BACKEND_OK); + } + + /* + * Connect to the printer... + */ + + fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port); + _cupsLangPrintFilter(stderr, "INFO", _("Connecting to printer.")); + + for (delay = 5;;) + { + if ((addr = httpAddrConnect(addrlist, &device_fd)) == NULL) + { + error = errno; + device_fd = -1; + + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(error)); + + if (error == ECONNREFUSED || error == EHOSTDOWN || + error == EHOSTUNREACH) + { + if (contimeout && (time(NULL) - start_time) > contimeout) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + return (CUPS_BACKEND_FAILED); + } + + switch (error) + { + case EHOSTDOWN : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer may not exist or " + "is unavailable at this time.")); + break; + + case EHOSTUNREACH : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is unreachable at this " + "time.")); + break; + + case ECONNREFUSED : + default : + _cupsLangPrintFilter(stderr, "WARNING", + _("The printer is busy.")); + break; + } + + sleep(delay); + + if (delay < 30) + delay += 5; + } + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The printer is not responding.")); + sleep(30); + } + } + else + break; + } + + fputs("STATE: -connecting-to-device\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", _("Connected to printer.")); + + fprintf(stderr, "DEBUG: Connected to %s:%d...\n", + httpAddrString(&(addr->addr), addrname, sizeof(addrname)), + _httpAddrPort(&(addr->addr))); + + /* + * Print everything... + */ + + tbytes = 0; + + if (bytes > 0) + tbytes += write(device_fd, buffer, bytes); + + while (copies > 0 && tbytes >= 0) + { + copies --; + + if (print_fd != 0) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + + tbytes = backendRunLoop(print_fd, device_fd, snmp_fd, &(addrlist->addr), 1, + 0, backendNetworkSideCB); + + if (print_fd != 0 && tbytes >= 0) + _cupsLangPrintFilter(stderr, "INFO", _("Print file sent.")); + } + +#ifdef __APPLE__ + /* + * Wait up to 5 seconds to get any pending back-channel data... + */ + + wait_time = time(NULL) + 5; + while (wait_time >= time(¤t_time)) + if (wait_bc(device_fd, wait_time - current_time) <= 0) + break; +#endif /* __APPLE__ */ + + if (waiteof) + { + /* + * Shutdown the socket and wait for the other end to finish... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Waiting for printer to finish.")); + + shutdown(device_fd, 1); + + while (wait_bc(device_fd, 90) > 0); + } + + /* + * Collect the final page count as needed... + */ + + if (have_supplies && + !backendSNMPSupplies(snmp_fd, &(addrlist->addr), &page_count, NULL) && + page_count > start_count) + fprintf(stderr, "PAGE: total %d\n", page_count - start_count); + + /* + * Close the socket connection... + */ + + close(device_fd); + + httpAddrFreeList(addrlist); + + /* + * Close the input file and return... + */ + + if (print_fd != 0) + close(print_fd); + + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + + return (CUPS_BACKEND_OK); +} + + +/* + * 'wait_bc()' - Wait for back-channel data... + */ + +static int /* O - # bytes read or -1 on error */ +wait_bc(int device_fd, /* I - Socket */ + int secs) /* I - Seconds to wait */ +{ + struct timeval timeout; /* Timeout for select() */ + fd_set input; /* Input set for select() */ + ssize_t bytes; /* Number of back-channel bytes read */ + char buffer[1024]; /* Back-channel buffer */ + + + /* + * Wait up to "secs" seconds for backchannel data... + */ + + timeout.tv_sec = secs; + timeout.tv_usec = 0; + + FD_ZERO(&input); + FD_SET(device_fd, &input); + + if (select(device_fd + 1, &input, NULL, NULL, &timeout) > 0) + { + /* + * Grab the data coming back and spit it out to stderr... + */ + + if ((bytes = read(device_fd, buffer, sizeof(buffer))) > 0) + { + fprintf(stderr, "DEBUG: Received %d bytes of back-channel data\n", + (int)bytes); + cupsBackChannelWrite(buffer, bytes, 1.0); + } + + return (bytes); + } + else + return (-1); +} + + +/* + * End of "$Id: socket.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/backend/test1284.c b/backend/test1284.c new file mode 100644 index 0000000..1080c19 --- /dev/null +++ b/backend/test1284.c @@ -0,0 +1,84 @@ +/* + * "$Id: test1284.c 9042 2010-03-24 00:45:34Z mike $" + * + * IEEE-1284 support functions test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Test the device-ID functions. + */ + +/* + * Include necessary headers. + */ + +#include +#ifdef WIN32 +# include +#else +# include +# include +#endif /* WIN32 */ + +#include "ieee1284.c" + + +/* + * 'main()' - Test the device-ID functions. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, /* Looping var */ + fd; /* File descriptor */ + char device_id[1024], /* 1284 device ID string */ + make_model[1024], /* make-and-model string */ + uri[1024]; /* URI string */ + + + if (argc < 2) + { + puts("Usage: test1284 device-file [... device-file-N]"); + exit(1); + } + + for (i = 1; i < argc; i ++) + { + if ((fd = open(argv[i], O_RDWR)) < 0) + { + perror(argv[i]); + return (errno); + } + + printf("%s:\n", argv[i]); + + backendGetDeviceID(fd, device_id, sizeof(device_id), make_model, + sizeof(make_model), "test", uri, sizeof(uri)); + + printf(" device_id=\"%s\"\n", device_id); + printf(" make_model=\"%s\"\n", make_model); + printf(" uri=\"%s\"\n", uri); + + close(fd); + } + + return (0); +} + + +/* + * End of "$Id: test1284.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/backend/testbackend.c b/backend/testbackend.c new file mode 100644 index 0000000..682b8aa --- /dev/null +++ b/backend/testbackend.c @@ -0,0 +1,651 @@ +/* + * "$Id: testbackend.c 9042 2010-03-24 00:45:34Z mike $" + * + * Backend test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Run the named backend. + * sigterm_handler() - Flag when we get SIGTERM. + * usage() - Show usage information. + * walk_cb() - Show results of cupsSideChannelSNMPWalk... + */ + +/* + * Include necessary headers. + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Local globals... + */ + +static int job_canceled = 0; + + +/* + * Local functions... + */ + +static void sigterm_handler(int sig); +static void usage(void); +static void walk_cb(const char *oid, const char *data, int datalen, + void *context); + + +/* + * 'main()' - Run the named backend. + * + * Usage: + * + * betest [-s] [-t] device-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int first_arg, /* First argument for backend */ + do_cancel = 0, /* Simulate a cancel-job via SIGTERM */ + do_ps = 0, /* Do PostScript query+test? */ + do_pcl = 0, /* Do PCL query+test? */ + do_side_tests = 0, /* Test side-channel ops? */ + do_trickle = 0, /* Trickle data to backend */ + do_walk = 0, /* Do OID lookup (0) or walking (1) */ + show_log = 0; /* Show log messages from backends? */ + const char *oid = ".1.3.6.1.2.1.43.10.2.1.4.1.1"; + /* OID to lookup or walk */ + char scheme[255], /* Scheme in URI == backend */ + backend[1024]; /* Backend path */ + const char *serverbin; /* CUPS_SERVERBIN environment variable */ + int fd, /* Temporary file descriptor */ + back_fds[2], /* Back-channel pipe */ + side_fds[2], /* Side-channel socket */ + data_fds[2], /* Data pipe */ + back_pid = -1, /* Backend process ID */ + data_pid = -1, /* Trickle process ID */ + pid, /* Process ID */ + status; /* Exit status */ + + + /* + * See if we have side-channel tests to do... + */ + + for (first_arg = 1; + argv[first_arg] && argv[first_arg][0] == '-'; + first_arg ++) + if (!strcmp(argv[first_arg], "-d")) + show_log = 1; + else if (!strcmp(argv[first_arg], "-cancel")) + do_cancel = 1; + else if (!strcmp(argv[first_arg], "-pcl")) + do_pcl = 1; + else if (!strcmp(argv[first_arg], "-ps")) + do_ps = 1; + else if (!strcmp(argv[first_arg], "-s")) + do_side_tests = 1; + else if (!strcmp(argv[first_arg], "-t")) + do_trickle = 1; + else if (!strcmp(argv[first_arg], "-get") && (first_arg + 1) < argc) + { + first_arg ++; + + do_side_tests = 1; + oid = argv[first_arg]; + } + else if (!strcmp(argv[first_arg], "-walk") && (first_arg + 1) < argc) + { + first_arg ++; + + do_side_tests = 1; + do_walk = 1; + oid = argv[first_arg]; + } + else + usage(); + + argc -= first_arg; + if (argc < 6 || argc > 7 || (argc == 7 && do_trickle)) + usage(); + + /* + * Extract the scheme from the device-uri - that's the program we want to + * execute. + */ + + if (sscanf(argv[first_arg], "%254[^:]", scheme) != 1) + { + fputs("testbackend: Bad device-uri - no colon!\n", stderr); + return (1); + } + + if (!access(scheme, X_OK)) + strlcpy(backend, scheme, sizeof(backend)); + else + { + if ((serverbin = getenv("CUPS_SERVERBIN")) == NULL) + serverbin = CUPS_SERVERBIN; + + snprintf(backend, sizeof(backend), "%s/backend/%s", serverbin, scheme); + if (access(backend, X_OK)) + { + fprintf(stderr, "testbackend: Unknown device scheme \"%s\"!\n", scheme); + return (1); + } + } + + /* + * Create the back-channel pipe and side-channel socket... + */ + + open("/dev/null", O_WRONLY); /* Make sure fd 3 and 4 are used */ + open("/dev/null", O_WRONLY); + + pipe(back_fds); + fcntl(back_fds[0], F_SETFL, fcntl(back_fds[0], F_GETFL) | O_NONBLOCK); + fcntl(back_fds[1], F_SETFL, fcntl(back_fds[1], F_GETFL) | O_NONBLOCK); + + socketpair(AF_LOCAL, SOCK_STREAM, 0, side_fds); + fcntl(side_fds[0], F_SETFL, fcntl(side_fds[0], F_GETFL) | O_NONBLOCK); + fcntl(side_fds[1], F_SETFL, fcntl(side_fds[1], F_GETFL) | O_NONBLOCK); + + /* + * Execute the trickle process as needed... + */ + + if (do_trickle || do_pcl || do_ps || do_cancel) + { + pipe(data_fds); + + signal(SIGTERM, sigterm_handler); + + if ((data_pid = fork()) == 0) + { + /* + * Trickle/query child comes here. Rearrange file descriptors so that + * FD 1, 3, and 4 point to the backend... + */ + + if ((fd = open("/dev/null", O_RDONLY)) != 0) + { + dup2(fd, 0); + close(fd); + } + + if (data_fds[1] != 1) + { + dup2(data_fds[1], 1); + close(data_fds[1]); + } + close(data_fds[0]); + + if (back_fds[0] != 3) + { + dup2(back_fds[0], 3); + close(back_fds[0]); + } + close(back_fds[1]); + + if (side_fds[0] != 4) + { + dup2(side_fds[0], 4); + close(side_fds[0]); + } + close(side_fds[1]); + + if (do_trickle) + { + /* + * Write 10 spaces, 1 per second... + */ + + int i; /* Looping var */ + + for (i = 0; i < 10; i ++) + { + write(1, " ", 1); + sleep(1); + } + } + else if (do_cancel) + { + /* + * Write PS or PCL lines until we see SIGTERM... + */ + + int line = 0, page = 0; /* Current line and page */ + ssize_t bytes; /* Number of bytes of response data */ + char buffer[1024]; /* Output buffer */ + + + if (do_pcl) + write(1, "\033E", 2); + else + write(1, "%!\n/Courier findfont 12 scalefont setfont 0 setgray\n", 52); + + while (!job_canceled) + { + if (line == 0) + { + page ++; + + if (do_pcl) + snprintf(buffer, sizeof(buffer), "PCL Page %d\r\n\r\n", page); + else + snprintf(buffer, sizeof(buffer), + "18 732 moveto (PS Page %d) show\n", page); + + write(1, buffer, strlen(buffer)); + } + + line ++; + + if (do_pcl) + snprintf(buffer, sizeof(buffer), "Line %d\r\n", line); + else + snprintf(buffer, sizeof(buffer), "18 %d moveto (Line %d) show\n", + 720 - line * 12, line); + + write(1, buffer, strlen(buffer)); + + if (line >= 55) + { + /* + * Eject after 55 lines... + */ + + line = 0; + if (do_pcl) + write(1, "\014", 1); + else + write(1, "showpage\n", 9); + } + + /* + * Check for back-channel data... + */ + + if ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0)) > 0) + write(2, buffer, bytes); + + /* + * Throttle output to ~100hz... + */ + + usleep(10000); + } + + /* + * Eject current page with info... + */ + + if (do_pcl) + snprintf(buffer, sizeof(buffer), + "Canceled on line %d of page %d\r\n\014\033E", line, page); + else + snprintf(buffer, sizeof(buffer), + "\n18 %d moveto (Canceled on line %d of page %d)\nshowpage\n", + 720 - line * 12, line, page); + + write(1, buffer, strlen(buffer)); + + /* + * See if we get any back-channel data... + */ + + while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0) + write(2, buffer, bytes); + + exit(0); + } + else + { + /* + * Do PS or PCL query + test pages. + */ + + char buffer[1024]; /* Buffer for response data */ + ssize_t bytes; /* Number of bytes of response data */ + double timeout; /* Timeout */ + const char *data; /* Data to send */ + static const char *pcl_data = /* PCL data */ + "\033%-12345X@PJL\r\n" + "@PJL JOB NAME = \"Hello, World!\"\r\n" + "@PJL INFO USTATUS\r\n" + "@PJL ENTER LANGUAGE = PCL\r\n" + "\033E" + "Hello, World!\n" + "\014" + "\033%-12345X@PJL\r\n" + "@PJL EOJ NAME=\"Hello, World!\"\r\n" + "\033%-12345X"; + static const char *ps_data = /* PostScript data */ + "%!\n" + "save\n" + "product = flush\n" + "currentpagedevice /PageSize get aload pop\n" + "2 copy gt {exch} if\n" + "(Unknown)\n" + "19 dict\n" + "dup [612 792] (Letter) put\n" + "dup [612 1008] (Legal) put\n" + "dup [612 935] (w612h935) put\n" + "dup [522 756] (Executive) put\n" + "dup [595 842] (A4) put\n" + "dup [420 595] (A5) put\n" + "dup [499 709] (ISOB5) put\n" + "dup [516 728] (B5) put\n" + "dup [612 936] (w612h936) put\n" + "dup [284 419] (Postcard) put\n" + "dup [419.5 567] (DoublePostcard) put\n" + "dup [558 774] (w558h774) put\n" + "dup [553 765] (w553h765) put\n" + "dup [522 737] (w522h737) put\n" + "dup [499 709] (EnvISOB5) put\n" + "dup [297 684] (Env10) put\n" + "dup [459 649] (EnvC5) put\n" + "dup [312 624] (EnvDL) put\n" + "dup [279 540] (EnvMonarch) put\n" + "{ exch aload pop 4 index sub abs 5 le exch\n" + " 5 index sub abs 5 le and\n" + " {exch pop exit} {pop} ifelse\n" + "} bind forall\n" + "= flush pop pop\n" + "/Courier findfont 12 scalefont setfont\n" + "0 setgray 36 720 moveto (Hello, ) show product show (!) show\n" + "showpage\n" + "restore\n" + "\004"; + + + if (do_pcl) + data = pcl_data; + else + data = ps_data; + + write(1, data, strlen(data)); + write(2, "DEBUG: START\n", 13); + timeout = 60.0; + while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), + timeout)) > 0) + { + write(2, buffer, bytes); + timeout = 5.0; + } + write(2, "\nDEBUG: END\n", 12); + } + + exit(0); + } + else if (data_pid < 0) + { + perror("testbackend: Unable to fork"); + return (1); + } + } + else + data_fds[0] = data_fds[1] = -1; + + /* + * Execute the backend... + */ + + if ((back_pid = fork()) == 0) + { + /* + * Child comes here... + */ + + if (do_trickle || do_ps || do_pcl || do_cancel) + { + if (data_fds[0] != 0) + { + dup2(data_fds[0], 0); + close(data_fds[0]); + } + close(data_fds[1]); + } + + if (!show_log) + { + if ((fd = open("/dev/null", O_WRONLY)) != 2) + { + dup2(fd, 2); + close(fd); + } + } + + if (back_fds[1] != 3) + { + dup2(back_fds[1], 3); + close(back_fds[0]); + } + close(back_fds[1]); + + if (side_fds[1] != 4) + { + dup2(side_fds[1], 4); + close(side_fds[0]); + } + close(side_fds[1]); + + execv(backend, argv + first_arg); + fprintf(stderr, "testbackend: Unable to execute \"%s\": %s\n", backend, + strerror(errno)); + return (errno); + } + else if (back_pid < 0) + { + perror("testbackend: Unable to fork"); + return (1); + } + + /* + * Parent comes here, setup back and side channel file descriptors... + */ + + if (do_trickle || do_ps || do_pcl || do_cancel) + { + close(data_fds[0]); + close(data_fds[1]); + } + + if (back_fds[0] != 3) + { + dup2(back_fds[0], 3); + close(back_fds[0]); + } + close(back_fds[1]); + + if (side_fds[0] != 4) + { + dup2(side_fds[0], 4); + close(side_fds[0]); + } + close(side_fds[1]); + + /* + * Do side-channel tests as needed, then wait for the backend... + */ + + if (do_side_tests) + { + int length; /* Length of buffer */ + char buffer[2049]; /* Buffer for reponse */ + cups_sc_status_t scstatus; /* Status of side-channel command */ + static const char * const statuses[] = + { + "CUPS_SC_STATUS_NONE", /* No status */ + "CUPS_SC_STATUS_OK", /* Operation succeeded */ + "CUPS_SC_STATUS_IO_ERROR", /* An I/O error occurred */ + "CUPS_SC_STATUS_TIMEOUT", /* The backend did not respond */ + "CUPS_SC_STATUS_NO_RESPONSE", /* The device did not respond */ + "CUPS_SC_STATUS_BAD_MESSAGE", /* The command/response message was invalid */ + "CUPS_SC_STATUS_TOO_BIG", /* Response too big */ + "CUPS_SC_STATUS_NOT_IMPLEMENTED" /* Command not implemented */ + }; + + + sleep(2); + + length = 0; + scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, buffer, + &length, 60.0); + printf("CUPS_SC_CMD_DRAIN_OUTPUT returned %s\n", statuses[scstatus]); + + length = 1; + scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_BIDI, buffer, + &length, 5.0); + printf("CUPS_SC_CMD_GET_BIDI returned %s, %d\n", statuses[scstatus], buffer[0]); + + length = sizeof(buffer) - 1; + scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_DEVICE_ID, buffer, + &length, 5.0); + buffer[length] = '\0'; + printf("CUPS_SC_CMD_GET_DEVICE_ID returned %s, \"%s\"\n", + statuses[scstatus], buffer); + + length = 1; + scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_STATE, buffer, + &length, 5.0); + printf("CUPS_SC_CMD_GET_STATE returned %s, %02X\n", statuses[scstatus], + buffer[0] & 255); + + if (do_walk) + { + /* + * Walk the OID tree... + */ + + scstatus = cupsSideChannelSNMPWalk(oid, 5.0, walk_cb, NULL); + printf("CUPS_SC_CMD_SNMP_WALK returned %s\n", statuses[scstatus]); + } + else + { + /* + * Lookup the same OID twice... + */ + + length = sizeof(buffer); + scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0); + printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid, + statuses[scstatus], buffer); + + length = sizeof(buffer); + scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0); + printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid, + statuses[scstatus], buffer); + } + + length = 0; + scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_SOFT_RESET, buffer, + &length, 5.0); + printf("CUPS_SC_CMD_SOFT_RESET returned %s\n", statuses[scstatus]); + } + + if (do_cancel) + { + sleep(1); + kill(data_pid, SIGTERM); + kill(back_pid, SIGTERM); + } + + while ((pid = wait(&status)) > 0) + { + if (status) + { + if (WIFEXITED(status)) + printf("%s exited with status %d!\n", + pid == back_pid ? backend : "test", + WEXITSTATUS(status)); + else + printf("%s crashed with signal %d!\n", + pid == back_pid ? backend : "test", + WTERMSIG(status)); + } + } + + /* + * Exit accordingly... + */ + + return (status != 0); +} + + +/* + * 'sigterm_handler()' - Flag when we get SIGTERM. + */ + +static void +sigterm_handler(int sig) /* I - Signal */ +{ + (void)sig; + + job_canceled = 1; +} + + +/* + * 'usage()' - Show usage information. + */ + +static void +usage(void) +{ + puts("Usage: testbackend [-cancel] [-d] [-ps | -pcl] [-s [-oid OID] " + "[-walk OID]] [-t] device-uri job-id user title copies options [file]"); + puts(""); + puts("Options:"); + puts(" -cancel Simulate a canceled print job after 2 seconds."); + puts(" -d Show log messages from backend."); + puts(" -oid OID Lookup the specified SNMP OID."); + puts(" (.1.3.6.1.2.1.43.10.2.1.4.1.1 is a good one for printers)"); + puts(" -pcl Send PCL+PJL query and test page to backend."); + puts(" -ps Send PostScript query and test page to backend."); + puts(" -s Do side-channel + SNMP tests."); + puts(" -t Send spaces slowly to backend ('trickle')."); + puts(" -walk OID Walk the specified SNMP OID."); + puts(" (.1.3.6.1.2.1.43 is a good one for printers)"); + + exit(1); +} + + +/* + * 'walk_cb()' - Show results of cupsSideChannelSNMPWalk... + */ + +static void +walk_cb(const char *oid, /* I - OID */ + const char *data, /* I - Data */ + int datalen, /* I - Length of data */ + void *context) /* I - Context (unused) */ +{ + printf("CUPS_SC_CMD_SNMP_WALK %s=%s (%d bytes)\n", oid, data, datalen); +} + + +/* + * End of "$Id: testbackend.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/backend/testsupplies.c b/backend/testsupplies.c new file mode 100644 index 0000000..827cdf6 --- /dev/null +++ b/backend/testsupplies.c @@ -0,0 +1,83 @@ +/* + * "$Id: testsupplies.c 9771 2011-05-12 05:21:56Z mike $" + * + * SNMP supplies test program for CUPS. + * + * Copyright 2008-2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Show the supplies state of a printer. + */ + +/* + * Include necessary headers. + */ + +#include "backend-private.h" + + +/* + * 'main()' - Show the supplies state of a printer. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + http_addrlist_t *host; /* Host addresses */ + int snmp_fd; /* SNMP socket */ + int page_count, /* Current page count */ + printer_state; /* Current printer state */ + + + if (argc != 2) + { + puts("Usage: testsupplies ip-or-hostname"); + return (1); + } + + if ((host = httpAddrGetList(argv[1], AF_UNSPEC, "9100")) == NULL) + { + perror(argv[1]); + return (1); + } + + if ((snmp_fd = _cupsSNMPOpen(host->addr.addr.sa_family)) < 0) + { + perror(argv[1]); + return (1); + } + + for (;;) + { + fputs("backendSNMPSupplies: ", stdout); + + if (backendSNMPSupplies(snmp_fd, &(host->addr), &page_count, + &printer_state)) + { + puts("FAIL"); + return (1); + } + + printf("backendSNMPSupplies: %s (page_count=%d, printer_state=%d)\n", + page_count < 0 || printer_state < CUPS_TC_other || + printer_state > CUPS_TC_warmup ? "FAIL" : "PASS", + page_count, printer_state); + + sleep(5); + } +} + + +/* + * End of "$Id: testsupplies.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/backend/usb-darwin.c b/backend/usb-darwin.c new file mode 100644 index 0000000..8b249a9 --- /dev/null +++ b/backend/usb-darwin.c @@ -0,0 +1,2269 @@ +/* +* "$Id: usb-darwin.c 9887 2011-08-11 22:04:59Z mike $" +* +* Copyright 2005-2011 Apple Inc. All rights reserved. +* +* IMPORTANT: This Apple software is supplied to you by Apple Computer, +* Inc. ("Apple") in consideration of your agreement to the following +* terms, and your use, installation, modification or redistribution of +* this Apple software constitutes acceptance of these terms. If you do +* not agree with these terms, please do not use, install, modify or +* redistribute this Apple software. +* +* In consideration of your agreement to abide by the following terms, and +* subject to these terms, Apple grants you a personal, non-exclusive +* license, under Apple's copyrights in this original Apple software (the +* "Apple Software"), to use, reproduce, modify and redistribute the Apple +* Software, with or without modifications, in source and/or binary forms; +* provided that if you redistribute the Apple Software in its entirety and +* without modifications, you must retain this notice and the following +* text and disclaimers in all such redistributions of the Apple Software. +* Neither the name, trademarks, service marks or logos of Apple Computer, +* Inc. may be used to endorse or promote products derived from the Apple +* Software without specific prior written permission from Apple. Except +* as expressly stated in this notice, no other rights or licenses, express +* or implied, are granted by Apple herein, including but not limited to +* any patent rights that may be infringed by your derivative works or by +* other works in which the Apple Software may be incorporated. +* +* The Apple Software is provided by Apple on an "AS IS" basis. APPLE +* MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION +* THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS +* FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND +* OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. +* +* IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL +* OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, +* MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED +* AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), +* STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* Contents: +* + * list_devices() - List all USB devices. + * print_device() - Print a file to a USB device. + * read_thread() - Thread to read the backchannel data on. + * sidechannel_thread() - Handle side-channel requests. + * iterate_printers() - Iterate over all the printers. + * device_added() - Device added notifier. + * list_device_cb() - list_device iterator callback. + * find_device_cb() - print_device iterator callback. + * status_timer_cb() - Status timer callback. + * copy_deviceinfo() - Copy strings from the 1284 device ID. + * release_deviceinfo() - Release deviceinfo strings. + * load_classdriver() - Load a classdriver. + * unload_classdriver() - Unload a classdriver. + * load_printerdriver() - Load vendor's classdriver. + * registry_open() - Open a connection to the printer. + * registry_close() - Close the connection to the printer. + * copy_deviceid() - Copy the 1284 device id string. + * copy_devicestring() - Copy the 1284 device id string. + * copy_value_for_key() - Copy value string associated with a key. + * cfstr_create_trim() - Create CFString and trim whitespace characters. + * parse_options() - Parse URI options. + * sigterm_handler() - SIGTERM handler. + * next_line() - Find the next line in a buffer. + * parse_pserror() - Scan the backchannel data for postscript errors. + * soft_reset() - Send a soft reset to the device. + * get_device_id() - Return IEEE-1284 device ID. +*/ + +/* + * Include necessary headers. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "backend-private.h" +#include +#include +#include + +#include +#include + +extern char **environ; + + +/* + * DEBUG_WRITES, if defined, causes the backend to write data to the printer in + * 512 byte increments, up to 8192 bytes, to make debugging with a USB bus + * analyzer easier. + */ + +#define DEBUG_WRITES 0 + +/* + * WAIT_EOF_DELAY is number of seconds we'll wait for responses from + * the printer after we've finished sending all the data + */ +#define WAIT_EOF_DELAY 7 +#define WAIT_SIDE_DELAY 3 +#define DEFAULT_TIMEOUT 5000L + +#define USB_INTERFACE_KIND CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID190) +#define kUSBLanguageEnglish 0x409 + +#define PRINTER_POLLING_INTERVAL 5 /* seconds */ +#define INITIAL_LOG_INTERVAL PRINTER_POLLING_INTERVAL +#define SUBSEQUENT_LOG_INTERVAL 3 * INITIAL_LOG_INTERVAL + +#define kUSBPrinterClassTypeID CFUUIDGetConstantUUIDWithBytes(NULL, 0x06, 0x04, 0x7D, 0x16, 0x53, 0xA2, 0x11, 0xD6, 0x92, 0x06, 0x00, 0x30, 0x65, 0x52, 0x45, 0x92) +#define kUSBPrinterClassInterfaceID CFUUIDGetConstantUUIDWithBytes(NULL, 0x03, 0x34, 0x6D, 0x74, 0x53, 0xA3, 0x11, 0xD6, 0x9E, 0xA1, 0x76, 0x30, 0x65, 0x52, 0x45, 0x92) + +#define kUSBClassDriverProperty CFSTR("USB Printing Class") + +#define kUSBGenericTOPrinterClassDriver CFSTR("/System/Library/Printers/Libraries/USBGenericPrintingClass.plugin") +#define kUSBPrinterClassDeviceNotOpen -9664 /*kPMInvalidIOMContext*/ + + +/* + * Section 5.3 USB Printing Class spec + */ +#define kUSBPrintingSubclass 1 +#define kUSBPrintingProtocolNoOpen 0 +#define kUSBPrintingProtocolUnidirectional 1 +#define kUSBPrintingProtocolBidirectional 2 + +typedef IOUSBInterfaceInterface190 **printer_interface_t; + +typedef struct iodevice_request_s /**** Device request ****/ +{ + UInt8 requestType; + UInt8 request; + UInt16 value; + UInt16 index; + UInt16 length; + void *buffer; +} iodevice_request_t; + +typedef union /**** Centronics status byte ****/ +{ + char b; + struct + { + unsigned reserved0:2; + unsigned paperError:1; + unsigned select:1; + unsigned notError:1; + unsigned reserved1:3; + } status; +} centronics_status_t; + +typedef struct classdriver_s /**** g.classdriver context ****/ +{ + IUNKNOWN_C_GUTS; + CFPlugInRef plugin; /* release plugin */ + IUnknownVTbl **factory; /* Factory */ + void *vendorReference; /* vendor class specific usage */ + UInt32 location; /* unique location in bus topology */ + UInt8 interfaceNumber; /* Interface number */ + UInt16 vendorID; /* Vendor id */ + UInt16 productID; /* Product id */ + printer_interface_t interface; /* identify the device to IOKit */ + UInt8 outpipe; /* mandatory bulkOut pipe */ + UInt8 inpipe; /* optional bulkIn pipe */ + + /* general class requests */ + kern_return_t (*DeviceRequest)(struct classdriver_s **printer, iodevice_request_t *iorequest, UInt16 timeout); + kern_return_t (*GetString)(struct classdriver_s **printer, UInt8 whichString, UInt16 language, UInt16 timeout, CFStringRef *result); + + /* standard printer class requests */ + kern_return_t (*SoftReset)(struct classdriver_s **printer, UInt16 timeout); + kern_return_t (*GetCentronicsStatus)(struct classdriver_s **printer, centronics_status_t *result, UInt16 timeout); + kern_return_t (*GetDeviceID)(struct classdriver_s **printer, CFStringRef *devid, UInt16 timeout); + + /* standard bulk device requests */ + kern_return_t (*ReadPipe)(struct classdriver_s **printer, UInt8 *buffer, UInt32 *count); + kern_return_t (*WritePipe)(struct classdriver_s **printer, UInt8 *buffer, UInt32 *count, Boolean eoj); + + /* interface requests */ + kern_return_t (*Open)(struct classdriver_s **printer, UInt32 location, UInt8 protocol); + kern_return_t (*Abort)(struct classdriver_s **printer); + kern_return_t (*Close)(struct classdriver_s **printer); + + /* initialize and terminate */ + kern_return_t (*Initialize)(struct classdriver_s **printer, struct classdriver_s **baseclass); + kern_return_t (*Terminate)(struct classdriver_s **printer); + +} classdriver_t; + +typedef Boolean (*iterator_callback_t)(void *refcon, io_service_t obj); + +typedef struct iterator_reference_s /**** Iterator reference data */ +{ + iterator_callback_t callback; + void *userdata; + Boolean keepRunning; +} iterator_reference_t; + +typedef struct globals_s +{ + io_service_t printer_obj; + classdriver_t **classdriver; + + pthread_mutex_t read_thread_mutex; + pthread_cond_t read_thread_cond; + int read_thread_stop; + int read_thread_done; + + pthread_mutex_t readwrite_lock_mutex; + pthread_cond_t readwrite_lock_cond; + int readwrite_lock; + + CFStringRef make; + CFStringRef model; + CFStringRef serial; + UInt32 location; + UInt8 interfaceNum; + + CFRunLoopTimerRef status_timer; + + int print_fd; /* File descriptor to print */ + ssize_t print_bytes; /* Print bytes read */ +#if DEBUG_WRITES + ssize_t debug_bytes; /* Current bytes to read */ +#endif /* DEBUG_WRITES */ + + Boolean wait_eof; + int drain_output; /* Drain all pending output */ + int bidi_flag; /* 0=unidirectional, 1=bidirectional */ + + pthread_mutex_t sidechannel_thread_mutex; + pthread_cond_t sidechannel_thread_cond; + int sidechannel_thread_stop; + int sidechannel_thread_done; +} globals_t; + + +/* + * Globals... + */ + +globals_t g = { 0 }; /* Globals */ + + +/* + * Local functions... + */ + +static Boolean find_device_cb(void *refcon, io_service_t obj); +static Boolean list_device_cb(void *refcon, io_service_t obj); +static CFStringRef cfstr_create_trim(const char *cstr); +static CFStringRef copy_value_for_key(CFStringRef deviceID, CFStringRef *keys); +static kern_return_t load_classdriver(CFStringRef driverPath, printer_interface_t interface, classdriver_t ***printerDriver); +static kern_return_t load_printerdriver(CFStringRef *driverBundlePath); +static kern_return_t registry_close(void); +static kern_return_t registry_open(CFStringRef *driverBundlePath); +static kern_return_t unload_classdriver(classdriver_t ***classdriver); +static OSStatus copy_deviceid(classdriver_t **printer, CFStringRef *deviceID); +static void *read_thread(void *reference); +static void *sidechannel_thread(void *reference); +static void copy_deviceinfo(CFStringRef deviceIDString, CFStringRef *make, CFStringRef *model, CFStringRef *serial); +static void copy_devicestring(io_service_t usbInterface, CFStringRef *deviceID, UInt32 *deviceLocation, UInt8 *interfaceNum); +static void device_added(void *userdata, io_iterator_t iterator); +static void get_device_id(cups_sc_status_t *status, char *data, int *datalen); +static void iterate_printers(iterator_callback_t callBack, void *userdata); +static void parse_options(char *options, char *serial, int serial_size, UInt32 *location, Boolean *wait_eof); +static void release_deviceinfo(CFStringRef *make, CFStringRef *model, CFStringRef *serial); +static void setup_cfLanguage(void); +static void soft_reset(void); +static void status_timer_cb(CFRunLoopTimerRef timer, void *info); + +#if defined(__i386__) || defined(__x86_64__) +static pid_t child_pid; /* Child PID */ +static void run_legacy_backend(int argc, char *argv[], int fd); /* Starts child backend process running as a ppc executable */ +#endif /* __i386__ || __x86_64__ */ +static void sigterm_handler(int sig); /* SIGTERM handler */ + +#ifdef PARSE_PS_ERRORS +static const char *next_line (const char *buffer); +static void parse_pserror (char *sockBuffer, int len); +#endif /* PARSE_PS_ERRORS */ + +#pragma mark - + +/* + * 'list_devices()' - List all USB devices. + */ + +void list_devices() +{ + iterate_printers(list_device_cb, NULL); +} + + +/* + * 'print_device()' - Print a file to a USB device. + */ + +int /* O - Exit status */ +print_device(const char *uri, /* I - Device URI */ + const char *hostname, /* I - Hostname/manufacturer */ + const char *resource, /* I - Resource/modelname */ + char *options, /* I - Device options/serial number */ + int print_fd, /* I - File descriptor to print */ + int copies, /* I - Copies to print */ + int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + char serial[1024]; /* Serial number buffer */ + OSStatus status; /* Function results */ + IOReturn iostatus; /* Current IO status */ + pthread_t read_thread_id, /* Read thread */ + sidechannel_thread_id;/* Side-channel thread */ + int have_sidechannel = 0; /* Was the side-channel thread started? */ + struct stat sidechannel_info; /* Side-channel file descriptor info */ + char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ + UInt32 location; /* Unique location in bus topology */ + fd_set input_set; /* Input set for select() */ + CFStringRef driverBundlePath; /* Class driver path */ + int countdown, /* Logging interval */ + nfds; /* Number of file descriptors */ + ssize_t total_bytes; /* Total bytes written */ + UInt32 bytes; /* Bytes written */ + struct timeval *timeout, /* Timeout pointer */ + tv; /* Time value */ + struct timespec cond_timeout; /* pthread condition timeout */ + + + (void)uri; + + /* + * See if the side-channel descriptor is valid... + */ + + have_sidechannel = !fstat(CUPS_SC_FD, &sidechannel_info) && + S_ISSOCK(sidechannel_info.st_mode); + + /* + * Localize using CoreFoundation... + */ + + setup_cfLanguage(); + + parse_options(options, serial, sizeof(serial), &location, &g.wait_eof); + + if (resource[0] == '/') + resource++; + + g.print_fd = print_fd; + g.make = cfstr_create_trim(hostname); + g.model = cfstr_create_trim(resource); + g.serial = cfstr_create_trim(serial); + g.location = location; + + if (!g.make || !g.model) + { + fprintf(stderr, "DEBUG: Fatal USB error.\n"); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + + if (!g.make) + fputs("DEBUG: USB make string is NULL\n", stderr); + if (!g.model) + fputs("DEBUG: USB model string is NULL\n", stderr); + + return (CUPS_BACKEND_STOP); + } + + fputs("STATE: +connecting-to-device\n", stderr); + + countdown = INITIAL_LOG_INTERVAL; + + do + { + if (g.printer_obj) + { + IOObjectRelease(g.printer_obj); + unload_classdriver(&g.classdriver); + g.printer_obj = 0x0; + g.classdriver = 0x0; + } + + fprintf(stderr, "DEBUG: Looking for '%s %s'\n", hostname, resource); + + iterate_printers(find_device_cb, NULL); + + fputs("DEBUG: Opening connection\n", stderr); + + driverBundlePath = NULL; + + status = registry_open(&driverBundlePath); + +#if defined(__i386__) || defined(__x86_64__) + /* + * If we were unable to load the class drivers for this printer it's + * probably because they're ppc or i386. In this case try to run this + * backend as i386 or ppc executables so we can use them... + */ + if (status == -2) + { + run_legacy_backend(argc, argv, print_fd); + /* Never returns here */ + } +#endif /* __i386__ || __x86_64__ */ + + if (status == -2) + { + /* + * If we still were unable to load the class drivers for this printer log + * the error and stop the queue... + */ + + if (driverBundlePath == NULL || !CFStringGetCString(driverBundlePath, print_buffer, sizeof(print_buffer), kCFStringEncodingUTF8)) + strlcpy(print_buffer, "USB class driver", sizeof(print_buffer)); + + fputs("STATE: +apple-missing-usbclassdriver-error\n", stderr); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + fprintf(stderr, "DEBUG: Could not load %s\n", print_buffer); + + if (driverBundlePath) + CFRelease(driverBundlePath); + + return (CUPS_BACKEND_STOP); + } + + if (driverBundlePath) + CFRelease(driverBundlePath); + + if (status != noErr) + { + sleep(PRINTER_POLLING_INTERVAL); + countdown -= PRINTER_POLLING_INTERVAL; + if (countdown <= 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Waiting for printer to become available.")); + fprintf(stderr, "DEBUG: USB printer status: 0x%08x\n", (int)status); + countdown = SUBSEQUENT_LOG_INTERVAL; /* subsequent log entries, every 15 seconds */ + } + } + } while (status != noErr); + + fputs("STATE: -connecting-to-device\n", stderr); + + /* + * Now that we are "connected" to the port, ignore SIGTERM so that we + * can finish out any page data the driver sends (e.g. to eject the + * current page... Only ignore SIGTERM if we are printing data from + * stdin (otherwise you can't cancel raw jobs...) + */ + + if (!print_fd) + { + struct sigaction action; /* POSIX signal action */ + + + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); + } + + /* + * Start the side channel thread if the descriptor is valid... + */ + + pthread_mutex_init(&g.readwrite_lock_mutex, NULL); + pthread_cond_init(&g.readwrite_lock_cond, NULL); + g.readwrite_lock = 1; + + if (have_sidechannel) + { + g.sidechannel_thread_stop = 0; + g.sidechannel_thread_done = 0; + + pthread_cond_init(&g.sidechannel_thread_cond, NULL); + pthread_mutex_init(&g.sidechannel_thread_mutex, NULL); + + if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL)) + { + fprintf(stderr, "DEBUG: Fatal USB error.\n"); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + fputs("DEBUG: Couldn't create side-channel thread\n", stderr); + registry_close(); + return (CUPS_BACKEND_STOP); + } + } + + /* + * Get the read thread going... + */ + + g.read_thread_stop = 0; + g.read_thread_done = 0; + + pthread_cond_init(&g.read_thread_cond, NULL); + pthread_mutex_init(&g.read_thread_mutex, NULL); + + if (pthread_create(&read_thread_id, NULL, read_thread, NULL)) + { + fprintf(stderr, "DEBUG: Fatal USB error.\n"); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + fputs("DEBUG: Couldn't create read thread\n", stderr); + registry_close(); + return (CUPS_BACKEND_STOP); + } + + /* + * The main thread sends the print file... + */ + + g.drain_output = 0; + g.print_bytes = 0; + total_bytes = 0; + print_ptr = print_buffer; + + while (status == noErr && copies-- > 0) + { + _cupsLangPrintFilter(stderr, "INFO", _("Sending data to printer.")); + + if (print_fd != STDIN_FILENO) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + + while (status == noErr) + { + FD_ZERO(&input_set); + + if (!g.print_bytes) + FD_SET(print_fd, &input_set); + + /* + * Calculate select timeout... + * If we have data waiting to send timeout is 100ms. + * else if we're draining print_fd timeout is 0. + * else we're waiting forever... + */ + + if (g.print_bytes) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; /* 100ms */ + timeout = &tv; + } + else if (g.drain_output) + { + tv.tv_sec = 0; + tv.tv_usec = 0; + timeout = &tv; + } + else + timeout = NULL; + + /* + * I/O is unlocked around select... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + nfds = select(print_fd + 1, &input_set, NULL, NULL, timeout); + + /* + * Reacquire the lock... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + pthread_cond_wait(&g.readwrite_lock_cond, &g.readwrite_lock_mutex); + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + if (nfds < 0) + { + if (errno == EINTR && total_bytes == 0) + { + fputs("DEBUG: Received an interrupt before any bytes were " + "written, aborting\n", stderr); + registry_close(); + return (CUPS_BACKEND_OK); + } + else if (errno != EAGAIN && errno != EINTR) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to read print data.")); + perror("DEBUG: select"); + registry_close(); + return (CUPS_BACKEND_FAILED); + } + } + + /* + * If drain output has finished send a response... + */ + + if (g.drain_output && !nfds && !g.print_bytes) + { + /* Send a response... */ + cupsSideChannelWrite(CUPS_SC_CMD_DRAIN_OUTPUT, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + g.drain_output = 0; + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input_set)) + { +#if DEBUG_WRITES + g.debug_bytes += 512; + if (g.debug_bytes > sizeof(print_buffer)) + g.debug_bytes = 512; + + g.print_bytes = read(print_fd, print_buffer, g.debug_bytes); + +#else + g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer)); +#endif /* DEBUG_WRITES */ + + if (g.print_bytes < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN && errno != EINTR) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to read print data.")); + perror("DEBUG: read"); + registry_close(); + return (CUPS_BACKEND_FAILED); + } + + g.print_bytes = 0; + } + else if (g.print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ + + break; + } + + print_ptr = print_buffer; + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)g.print_bytes); + } + + if (g.print_bytes) + { + bytes = g.print_bytes; + iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0); + + /* + * Ignore timeout errors, but retain the number of bytes written to + * avoid sending duplicate data ()... + */ + + if (iostatus == kIOUSBTransactionTimeout) + { + fputs("DEBUG: Got USB transaction timeout during write\n", stderr); + iostatus = 0; + } + + /* + * If we've stalled, retry the write... + */ + + else if (iostatus == kIOUSBPipeStalled) + { + fputs("DEBUG: Got USB pipe stalled during write\n", stderr); + + bytes = g.print_bytes; + iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0); + } + + /* + * Retry a write after an aborted write since we probably just got + * SIGTERM ()... + */ + + else if (iostatus == kIOReturnAborted) + { + fputs("DEBUG: Got USB return aborted during write\n", stderr); + + IOReturn err = (*g.classdriver)->Abort(g.classdriver); + fprintf(stderr, "DEBUG: USB class driver Abort returned %x\n", err); + +#if DEBUG_WRITES + sleep(5); +#endif /* DEBUG_WRITES */ + + bytes = g.print_bytes; + iostatus = (*g.classdriver)->WritePipe(g.classdriver, (UInt8*)print_ptr, &bytes, 0); + } + + if (iostatus) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to send data to printer.")); + fprintf(stderr, "DEBUG: USB class driver WritePipe returned %x\n", + iostatus); + + IOReturn err = (*g.classdriver)->Abort(g.classdriver); + fprintf(stderr, "DEBUG: USB class driver Abort returned %x\n", + err); + + status = CUPS_BACKEND_FAILED; + break; + } + else if (bytes > 0) + { + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", (int)bytes); + + g.print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } + + if (print_fd != 0 && status == noErr) + fprintf(stderr, "DEBUG: Sending print file, %lld bytes...\n", + (off_t)total_bytes); + } + } + + fprintf(stderr, "DEBUG: Sent %lld bytes...\n", (off_t)total_bytes); + + /* + * Signal the side channel thread to exit... + */ + + if (have_sidechannel) + { + close(CUPS_SC_FD); + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + g.sidechannel_thread_stop = 1; + pthread_mutex_lock(&g.sidechannel_thread_mutex); + + if (!g.sidechannel_thread_done) + { + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + WAIT_SIDE_DELAY; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.sidechannel_thread_done) + { + if (pthread_cond_timedwait(&g.sidechannel_thread_cond, + &g.sidechannel_thread_mutex, + &cond_timeout) != 0) + break; + } + } + + pthread_mutex_unlock(&g.sidechannel_thread_mutex); + } + + /* + * Signal the read thread to exit then wait 7 seconds for it to complete... + */ + + g.read_thread_stop = 1; + + pthread_mutex_lock(&g.read_thread_mutex); + + if (!g.read_thread_done) + { + fputs("DEBUG: Waiting for read thread to exit...\n", stderr); + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } + + /* + * If it didn't exit abort the pending read and wait an additional second... + */ + + if (!g.read_thread_done) + { + fputs("DEBUG: Read thread still active, aborting the pending read...\n", + stderr); + + g.wait_eof = 0; + + (*g.classdriver)->Abort(g.classdriver); + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + 1; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } + } + } + + pthread_mutex_unlock(&g.read_thread_mutex); + + /* + * Close the connection and input file and general clean up... + */ + + registry_close(); + + if (print_fd != STDIN_FILENO) + close(print_fd); + + if (g.make != NULL) + CFRelease(g.make); + + if (g.model != NULL) + CFRelease(g.model); + + if (g.serial != NULL) + CFRelease(g.serial); + + if (g.printer_obj != 0x0) + IOObjectRelease(g.printer_obj); + + return status; +} + + +/* + * 'read_thread()' - Thread to read the backchannel data on. + */ + +static void *read_thread(void *reference) +{ + UInt8 readbuffer[512]; + UInt32 rbytes; + kern_return_t readstatus; + struct mach_timebase_info timeBaseInfo; + uint64_t start, + delay; + + + (void)reference; + + /* Calculate what 250 milliSeconds are in mach absolute time... + */ + mach_timebase_info(&timeBaseInfo); + delay = ((uint64_t)250000000 * (uint64_t)timeBaseInfo.denom) / (uint64_t)timeBaseInfo.numer; + + do + { + /* + * Remember when we started so we can throttle the loop after the read call... + */ + + start = mach_absolute_time(); + + rbytes = sizeof(readbuffer); + readstatus = (*g.classdriver)->ReadPipe(g.classdriver, readbuffer, &rbytes); + if (readstatus == kIOReturnSuccess && rbytes > 0) + { + fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n", + (int)rbytes); + cupsBackChannelWrite((char*)readbuffer, rbytes, 1.0); + + /* cntrl-d is echoed by the printer. + * NOTES: + * Xerox Phaser 6250D doesn't echo the cntrl-d. + * Xerox Phaser 6250D doesn't always send the product query. + */ + if (g.wait_eof && readbuffer[rbytes-1] == 0x4) + break; + +#ifdef PARSE_PS_ERRORS + parse_pserror(readbuffer, rbytes); +#endif + } + else if (readstatus == kIOUSBTransactionTimeout) + fputs("DEBUG: Got USB transaction timeout during read\n", stderr); + else if (readstatus == kIOUSBPipeStalled) + fputs("DEBUG: Got USB pipe stalled during read\n", stderr); + else if (readstatus == kIOReturnAborted) + fputs("DEBUG: Got USB return aborted during read\n", stderr); + + /* + * Make sure this loop executes no more than once every 250 miliseconds... + */ + + if ((readstatus != kIOReturnSuccess || rbytes == 0) && (g.wait_eof || !g.read_thread_stop)) + mach_wait_until(start + delay); + + } while (g.wait_eof || !g.read_thread_stop); /* Abort from main thread tests error here */ + + /* + * Let the main thread know that we have completed the read thread... + */ + + pthread_mutex_lock(&g.read_thread_mutex); + g.read_thread_done = 1; + pthread_cond_signal(&g.read_thread_cond); + pthread_mutex_unlock(&g.read_thread_mutex); + + return NULL; +} + + +/* + * 'sidechannel_thread()' - Handle side-channel requests. + */ + +static void* +sidechannel_thread(void *reference) +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + (void)reference; + + do + { + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + { + if (status == CUPS_SC_STATUS_TIMEOUT) + continue; + else + break; + } + + switch (command) + { + case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */ + fputs("DEBUG: CUPS_SC_CMD_SOFT_RESET received from driver...\n", + stderr); + + if ((*g.classdriver)->SoftReset != NULL) + { + soft_reset(); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + fputs("DEBUG: Returning status CUPS_STATUS_OK with no bytes...\n", + stderr); + } + else + { + cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED, + NULL, 0, 1.0); + fputs("DEBUG: Returning status CUPS_STATUS_NOT_IMPLEMENTED with " + "no bytes...\n", stderr); + } + break; + + case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */ + fputs("DEBUG: CUPS_SC_CMD_DRAIN_OUTPUT received from driver...\n", + stderr); + + g.drain_output = 1; + break; + + case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */ + fputs("DEBUG: CUPS_SC_CMD_GET_BIDI received from driver...\n", + stderr); + + data[0] = g.bidi_flag; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + + fprintf(stderr, + "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n", + data[0]); + break; + + case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */ + fputs("DEBUG: CUPS_SC_CMD_GET_DEVICE_ID received from driver...\n", + stderr); + + datalen = sizeof(data); + get_device_id(&status, data, &datalen); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0); + + if (datalen < sizeof(data)) + data[datalen] = '\0'; + else + data[sizeof(data) - 1] = '\0'; + + fprintf(stderr, + "DEBUG: Returning CUPS_SC_STATUS_OK with %d bytes (%s)...\n", + datalen, data); + break; + + case CUPS_SC_CMD_GET_STATE: /* Return device state */ + fputs("DEBUG: CUPS_SC_CMD_GET_STATE received from driver...\n", + stderr); + + data[0] = CUPS_SC_STATE_ONLINE; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + + fprintf(stderr, + "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n", + data[0]); + break; + + default: + fprintf(stderr, "DEBUG: Unknown side-channel command (%d) received " + "from driver...\n", command); + + cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED, + NULL, 0, 1.0); + + fputs("DEBUG: Returned CUPS_SC_STATUS_NOT_IMPLEMENTED with no bytes...\n", + stderr); + break; + } + } + while (!g.sidechannel_thread_stop); + + pthread_mutex_lock(&g.sidechannel_thread_mutex); + g.sidechannel_thread_done = 1; + pthread_cond_signal(&g.sidechannel_thread_cond); + pthread_mutex_unlock(&g.sidechannel_thread_mutex); + + return NULL; +} + + +#pragma mark - +/* + * 'iterate_printers()' - Iterate over all the printers. + */ + +static void iterate_printers(iterator_callback_t callBack, + void *userdata) +{ + mach_port_t masterPort = 0x0; + kern_return_t kr = IOMasterPort (bootstrap_port, &masterPort); + + if (kr == kIOReturnSuccess && masterPort != 0x0) + { + io_iterator_t addIterator = 0x0; + + iterator_reference_t reference = { callBack, userdata, true }; + IONotificationPortRef addNotification = IONotificationPortCreate(masterPort); + + int klass = kUSBPrintingClass; + int subklass = kUSBPrintingSubclass; + + CFNumberRef usb_klass = CFNumberCreate(NULL, kCFNumberIntType, &klass); + CFNumberRef usb_subklass = CFNumberCreate(NULL, kCFNumberIntType, &subklass); + CFMutableDictionaryRef usbPrinterMatchDictionary = IOServiceMatching(kIOUSBInterfaceClassName); + + CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceClass"), usb_klass); + CFDictionaryAddValue(usbPrinterMatchDictionary, CFSTR("bInterfaceSubClass"), usb_subklass); + + CFRelease(usb_klass); + CFRelease(usb_subklass); + + kr = IOServiceAddMatchingNotification(addNotification, kIOMatchedNotification, usbPrinterMatchDictionary, &device_added, &reference, &addIterator); + if (addIterator != 0x0) + { + device_added (&reference, addIterator); + + if (reference.keepRunning) + { + CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(addNotification), kCFRunLoopDefaultMode); + CFRunLoopRun(); + } + IOObjectRelease(addIterator); + } + mach_port_deallocate(mach_task_self(), masterPort); + } +} + + +/* + * 'device_added()' - Device added notifier. + */ + +static void device_added(void *userdata, + io_iterator_t iterator) +{ + iterator_reference_t *reference = userdata; + + io_service_t obj; + while (reference->keepRunning && (obj = IOIteratorNext(iterator)) != 0x0) + { + if (reference->callback != NULL) + reference->keepRunning = reference->callback(reference->userdata, obj); + + IOObjectRelease(obj); + } + + /* One last call to the call back now that we are not longer have printers left to iterate... + */ + if (reference->keepRunning) + reference->keepRunning = reference->callback(reference->userdata, 0x0); + + if (!reference->keepRunning) + CFRunLoopStop(CFRunLoopGetCurrent()); +} + + +/* + * 'list_device_cb()' - list_device iterator callback. + */ + +static Boolean list_device_cb(void *refcon, + io_service_t obj) +{ + Boolean keepRunning = (obj != 0x0); + + + (void)refcon; + + if (keepRunning) + { + CFStringRef deviceIDString = NULL; + UInt32 deviceLocation = 0; + UInt8 interfaceNum = 0; + + copy_devicestring(obj, &deviceIDString, &deviceLocation, &interfaceNum); + if (deviceIDString != NULL) + { + CFStringRef make = NULL, model = NULL, serial = NULL; + char uristr[1024], makestr[1024], modelstr[1024], serialstr[1024]; + char optionsstr[1024], idstr[1024], make_modelstr[1024]; + + copy_deviceinfo(deviceIDString, &make, &model, &serial); + CFStringGetCString(deviceIDString, idstr, sizeof(idstr), + kCFStringEncodingUTF8); + backendGetMakeModel(idstr, make_modelstr, sizeof(make_modelstr)); + + modelstr[0] = '/'; + + if (!make || + !CFStringGetCString(make, makestr, sizeof(makestr), + kCFStringEncodingUTF8)) + strcpy(makestr, "Unknown"); + + if (!model || + !CFStringGetCString(model, &modelstr[1], sizeof(modelstr)-1, + kCFStringEncodingUTF8)) + strcpy(modelstr + 1, "Printer"); + + optionsstr[0] = '\0'; + if (serial != NULL) + { + CFStringGetCString(serial, serialstr, sizeof(serialstr), kCFStringEncodingUTF8); + snprintf(optionsstr, sizeof(optionsstr), "?serial=%s", serialstr); + } + else if (deviceLocation != 0) + snprintf(optionsstr, sizeof(optionsstr), "?location=%x", (unsigned)deviceLocation); + + httpAssembleURI(HTTP_URI_CODING_ALL, uristr, sizeof(uristr), "usb", NULL, makestr, 0, modelstr); + strlcat(uristr, optionsstr, sizeof(uristr)); + + cupsBackendReport("direct", uristr, make_modelstr, make_modelstr, idstr, + NULL); + + release_deviceinfo(&make, &model, &serial); + CFRelease(deviceIDString); + } + } + + return keepRunning; +} + + +/* + * 'find_device_cb()' - print_device iterator callback. + */ + +static Boolean find_device_cb(void *refcon, + io_service_t obj) +{ + Boolean keepLooking = true; + + if (obj != 0x0) + { + CFStringRef idString = NULL; + UInt32 location = -1; + UInt8 interfaceNum = 0; + + copy_devicestring(obj, &idString, &location, &interfaceNum); + if (idString != NULL) + { + CFStringRef make = NULL, model = NULL, serial = NULL; + + copy_deviceinfo(idString, &make, &model, &serial); + if (make && CFStringCompare(make, g.make, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { + if (model && CFStringCompare(model, g.model, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { + if (g.serial != NULL && CFStringGetLength(g.serial) > 0) + { + if (serial != NULL && CFStringCompare(serial, g.serial, kCFCompareCaseInsensitive) == kCFCompareEqualTo) + { + IOObjectRetain(obj); + g.printer_obj = obj; + keepLooking = false; + } + } + else + { + if (g.printer_obj != 0) + IOObjectRelease(g.printer_obj); + + g.printer_obj = obj; + IOObjectRetain(obj); + + if (g.location == 0 || g.location == location) + keepLooking = false; + } + if ( !keepLooking ) + g.interfaceNum = interfaceNum; + } + } + + release_deviceinfo(&make, &model, &serial); + CFRelease(idString); + } + } + else + { + keepLooking = (g.printer_obj == 0); + if (obj == 0x0 && keepLooking) + { + CFRunLoopTimerContext context = { 0, refcon, NULL, NULL, NULL }; + CFRunLoopTimerRef timer = CFRunLoopTimerCreate(NULL, CFAbsoluteTimeGetCurrent() + 1.0, 10, 0x0, 0x0, status_timer_cb, &context); + if (timer != NULL) + { + CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopDefaultMode); + g.status_timer = timer; + } + } + } + + if (!keepLooking && g.status_timer != NULL) + { + fputs("STATE: -offline-report\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", _("Printer is now online.")); + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), g.status_timer, kCFRunLoopDefaultMode); + CFRelease(g.status_timer); + g.status_timer = NULL; + } + + return keepLooking; +} + + +/* + * 'status_timer_cb()' - Status timer callback. + */ + +static void status_timer_cb(CFRunLoopTimerRef timer, + void *info) +{ + (void)timer; + (void)info; + + fputs("STATE: +offline-report\n", stderr); + _cupsLangPrintFilter(stderr, "INFO", _("Printer is offline.")); + + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + * + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + exit(CUPS_BACKEND_FAILED); + } +} + + +#pragma mark - +/* + * 'copy_deviceinfo()' - Copy strings from the 1284 device ID. + */ + +static void copy_deviceinfo(CFStringRef deviceIDString, + CFStringRef *make, + CFStringRef *model, + CFStringRef *serial) +{ + CFStringRef modelKeys[] = { CFSTR("MDL:"), CFSTR("MODEL:"), NULL }; + CFStringRef makeKeys[] = { CFSTR("MFG:"), CFSTR("MANUFACTURER:"), NULL }; + CFStringRef serialKeys[] = { CFSTR("SN:"), CFSTR("SERN:"), NULL }; + + if (make != NULL) + *make = copy_value_for_key(deviceIDString, makeKeys); + + if (model != NULL) + *model = copy_value_for_key(deviceIDString, modelKeys); + + if (serial != NULL) + *serial = copy_value_for_key(deviceIDString, serialKeys); +} + + +/* + * 'release_deviceinfo()' - Release deviceinfo strings. + */ + +static void release_deviceinfo(CFStringRef *make, + CFStringRef *model, + CFStringRef *serial) +{ + if (make != NULL && *make != NULL) + { + CFRelease(*make); + *make = NULL; + } + + if (model != NULL && *model != NULL) + { + CFRelease(*model); + *model = NULL; + } + + if (serial != NULL && *serial != NULL) + { + CFRelease(*serial); + *serial = NULL; + } +} + + +#pragma mark - +/* + * 'load_classdriver()' - Load a classdriver. + */ + +static kern_return_t load_classdriver(CFStringRef driverPath, + printer_interface_t interface, + classdriver_t ***printerDriver) +{ + kern_return_t kr = kUSBPrinterClassDeviceNotOpen; + classdriver_t **driver = NULL; + CFStringRef bundle = driverPath ? driverPath : kUSBGenericTOPrinterClassDriver; + char bundlestr[1024]; /* Bundle path */ + CFURLRef url; /* URL for driver */ + CFPlugInRef plugin = NULL; /* Plug-in address */ + + + CFStringGetCString(bundle, bundlestr, sizeof(bundlestr), kCFStringEncodingUTF8); + + /* + * Validate permissions for the class driver... + */ + + _cups_fc_result_t result = _cupsFileCheck(bundlestr, + _CUPS_FILE_CHECK_DIRECTORY, 1, + _cupsFileCheckFilter, NULL); + + if (result && driverPath) + return (load_classdriver(NULL, interface, printerDriver)); + else if (result) + return (kr); + + /* + * Try loading the class driver... + */ + + url = CFURLCreateWithFileSystemPath(NULL, bundle, kCFURLPOSIXPathStyle, true); + + if (url) + { + plugin = CFPlugInCreate(NULL, url); + CFRelease(url); + } + else + plugin = NULL; + + if (plugin) + { + CFArrayRef factories = CFPlugInFindFactoriesForPlugInTypeInPlugIn(kUSBPrinterClassTypeID, plugin); + if (factories != NULL && CFArrayGetCount(factories) > 0) + { + CFUUIDRef factoryID = CFArrayGetValueAtIndex(factories, 0); + IUnknownVTbl **iunknown = CFPlugInInstanceCreate(NULL, factoryID, kUSBPrinterClassTypeID); + if (iunknown != NULL) + { + kr = (*iunknown)->QueryInterface(iunknown, CFUUIDGetUUIDBytes(kUSBPrinterClassInterfaceID), (LPVOID *)&driver); + if (kr == kIOReturnSuccess && driver != NULL) + { + classdriver_t **genericDriver = NULL; + if (driverPath != NULL && CFStringCompare(driverPath, kUSBGenericTOPrinterClassDriver, 0) != kCFCompareEqualTo) + kr = load_classdriver(NULL, interface, &genericDriver); + + if (kr == kIOReturnSuccess) + { + (*driver)->interface = interface; + (*driver)->Initialize(driver, genericDriver); + + (*driver)->plugin = plugin; + (*driver)->interface = interface; + *printerDriver = driver; + } + } + (*iunknown)->Release(iunknown); + } + CFRelease(factories); + } + } + + fprintf(stderr, "DEBUG: load_classdriver(%s) (kr:0x%08x)\n", bundlestr, (int)kr); + + return (kr); +} + + +/* + * 'unload_classdriver()' - Unload a classdriver. + */ + +static kern_return_t unload_classdriver(classdriver_t ***classdriver) +{ + if (*classdriver != NULL) + { + (**classdriver)->Release(*classdriver); + *classdriver = NULL; + } + + return kIOReturnSuccess; +} + + +/* + * 'load_printerdriver()' - Load vendor's classdriver. + * + * If driverBundlePath is not NULL on return it is the callers responsbility to release it! + */ + +static kern_return_t load_printerdriver(CFStringRef *driverBundlePath) +{ + IOCFPlugInInterface **iodev = NULL; + SInt32 score; + kern_return_t kr; + printer_interface_t interface; + HRESULT res; + + kr = IOCreatePlugInInterfaceForService(g.printer_obj, kIOUSBInterfaceUserClientTypeID, kIOCFPlugInInterfaceID, &iodev, &score); + if (kr == kIOReturnSuccess) + { + if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) &interface)) == noErr) + { + *driverBundlePath = IORegistryEntryCreateCFProperty(g.printer_obj, kUSBClassDriverProperty, NULL, kNilOptions); + + kr = load_classdriver(*driverBundlePath, interface, &g.classdriver); + + if (kr != kIOReturnSuccess) + (*interface)->Release(interface); + } + IODestroyPlugInInterface(iodev); + } + return kr; +} + + +/* + * 'registry_open()' - Open a connection to the printer. + */ + +static kern_return_t registry_open(CFStringRef *driverBundlePath) +{ + g.bidi_flag = 0; /* 0=unidirectional */ + + kern_return_t kr = load_printerdriver(driverBundlePath); + if (kr != kIOReturnSuccess) + kr = -2; + + if (g.classdriver != NULL) + { + (*g.classdriver)->interfaceNumber = g.interfaceNum; + kr = (*g.classdriver)->Open(g.classdriver, g.location, kUSBPrintingProtocolBidirectional); + if (kr != kIOReturnSuccess || (*g.classdriver)->interface == NULL) + { + kr = (*g.classdriver)->Open(g.classdriver, g.location, kUSBPrintingProtocolUnidirectional); + if (kr == kIOReturnSuccess) + { + if ((*g.classdriver)->interface == NULL) + { + (*g.classdriver)->Close(g.classdriver); + kr = -1; + } + } + } + else + g.bidi_flag = 1; /* 1=bidirectional */ + } + + if (kr != kIOReturnSuccess) + unload_classdriver(&g.classdriver); + + return kr; +} + + +/* + * 'registry_close()' - Close the connection to the printer. + */ + +static kern_return_t registry_close(void) +{ + if (g.classdriver != NULL) + (*g.classdriver)->Close(g.classdriver); + + unload_classdriver(&g.classdriver); + return kIOReturnSuccess; +} + + +/* + * 'copy_deviceid()' - Copy the 1284 device id string. + */ + +static OSStatus copy_deviceid(classdriver_t **classdriver, + CFStringRef *deviceID) +{ + CFStringRef devID = NULL, + + deviceMake = NULL, + deviceModel = NULL, + deviceSerial = NULL; + + OSStatus err = (*classdriver)->GetDeviceID(classdriver, &devID, DEFAULT_TIMEOUT); + + copy_deviceinfo(devID, &deviceMake, &deviceModel, &deviceSerial); + + if (deviceMake == NULL || deviceModel == NULL || deviceSerial == NULL) + { + IOUSBDeviceDescriptor desc; + iodevice_request_t request; + + request.requestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); + request.request = kUSBRqGetDescriptor; + request.value = (kUSBDeviceDesc << 8) | 0; + request.index = 0; + request.length = sizeof(desc); + request.buffer = &desc; + err = (*classdriver)->DeviceRequest(classdriver, &request, DEFAULT_TIMEOUT); + if (err == kIOReturnSuccess) + { + CFMutableStringRef newDevID = CFStringCreateMutable(NULL, 0); + + if (deviceMake == NULL) + { + CFStringRef data = NULL; + err = (*classdriver)->GetString(classdriver, desc.iManufacturer, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { + CFStringAppendFormat(newDevID, NULL, CFSTR("MFG:%@;"), data); + CFRelease(data); + } + } + + if (deviceModel == NULL) + { + CFStringRef data = NULL; + err = (*classdriver)->GetString(classdriver, desc.iProduct, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { + CFStringAppendFormat(newDevID, NULL, CFSTR("MDL:%@;"), data); + CFRelease(data); + } + } + + if (deviceSerial == NULL && desc.iSerialNumber != 0) + { + CFStringRef data = NULL; + err = (*classdriver)->GetString(classdriver, desc.iSerialNumber, kUSBLanguageEnglish, DEFAULT_TIMEOUT, &data); + if (data != NULL) + { + CFStringAppendFormat(newDevID, NULL, CFSTR("SERN:%@;"), data); + CFRelease(data); + } + } + + if (devID != NULL) + { + CFStringAppend(newDevID, devID); + CFRelease(devID); + } + + *deviceID = newDevID; + } + } + else + { + *deviceID = devID; + } + release_deviceinfo(&deviceMake, &deviceModel, &deviceSerial); + + return err; +} + + +/* + * 'copy_devicestring()' - Copy the 1284 device id string. + */ + +static void copy_devicestring(io_service_t usbInterface, + CFStringRef *deviceID, + UInt32 *deviceLocation, + UInt8 *interfaceNumber ) +{ + IOCFPlugInInterface **iodev = NULL; + SInt32 score; + kern_return_t kr; + printer_interface_t interface; + HRESULT res; + classdriver_t **klassDriver = NULL; + CFStringRef driverBundlePath; + + if ((kr = IOCreatePlugInInterfaceForService(usbInterface, + kIOUSBInterfaceUserClientTypeID, + kIOCFPlugInInterfaceID, + &iodev, &score)) == kIOReturnSuccess) + { + if ((res = (*iodev)->QueryInterface(iodev, USB_INTERFACE_KIND, (LPVOID *) + &interface)) == noErr) + { + (*interface)->GetLocationID(interface, deviceLocation); + (*interface)->GetInterfaceNumber(interface, interfaceNumber); + + driverBundlePath = IORegistryEntryCreateCFProperty(usbInterface, + kUSBClassDriverProperty, + NULL, kNilOptions); + + kr = load_classdriver(driverBundlePath, interface, &klassDriver); + + if (kr != kIOReturnSuccess && driverBundlePath != NULL) + kr = load_classdriver(NULL, interface, &klassDriver); + + if (kr == kIOReturnSuccess && klassDriver != NULL) + kr = copy_deviceid(klassDriver, deviceID); + + unload_classdriver(&klassDriver); + + if (driverBundlePath != NULL) + CFRelease(driverBundlePath); + + /* (*interface)->Release(interface); */ + } + IODestroyPlugInInterface(iodev); + } +} + + +#pragma mark - +/* + * 'copy_value_for_key()' - Copy value string associated with a key. + */ + +static CFStringRef copy_value_for_key(CFStringRef deviceID, + CFStringRef *keys) +{ + CFStringRef value = NULL; + CFArrayRef kvPairs = deviceID != NULL ? CFStringCreateArrayBySeparatingStrings(NULL, deviceID, CFSTR(";")) : NULL; + CFIndex max = kvPairs != NULL ? CFArrayGetCount(kvPairs) : 0; + CFIndex idx = 0; + + while (idx < max && value == NULL) + { + CFStringRef kvpair = CFArrayGetValueAtIndex(kvPairs, idx); + CFIndex idxx = 0; + while (keys[idxx] != NULL && value == NULL) + { + CFRange range = CFStringFind(kvpair, keys[idxx], kCFCompareCaseInsensitive); + if (range.length != -1) + { + if (range.location != 0) + { + CFMutableStringRef theString = CFStringCreateMutableCopy(NULL, 0, kvpair); + CFStringTrimWhitespace(theString); + range = CFStringFind(theString, keys[idxx], kCFCompareCaseInsensitive); + if (range.location == 0) + value = CFStringCreateWithSubstring(NULL, theString, CFRangeMake(range.length, CFStringGetLength(theString) - range.length)); + + CFRelease(theString); + } + else + { + CFStringRef theString = CFStringCreateWithSubstring(NULL, kvpair, CFRangeMake(range.length, CFStringGetLength(kvpair) - range.length)); + CFMutableStringRef theString2 = CFStringCreateMutableCopy(NULL, 0, theString); + CFRelease(theString); + + CFStringTrimWhitespace(theString2); + value = theString2; + } + } + idxx++; + } + idx++; + } + + if (kvPairs != NULL) + CFRelease(kvPairs); + return value; +} + + +/* + * 'cfstr_create_trim()' - Create CFString and trim whitespace characters. + */ + +CFStringRef cfstr_create_trim(const char *cstr) +{ + CFStringRef cfstr; + CFMutableStringRef cfmutablestr = NULL; + + if ((cfstr = CFStringCreateWithCString(NULL, cstr, kCFStringEncodingUTF8)) != NULL) + { + if ((cfmutablestr = CFStringCreateMutableCopy(NULL, 1024, cfstr)) != NULL) + CFStringTrimWhitespace(cfmutablestr); + + CFRelease(cfstr); + } + return (CFStringRef) cfmutablestr; +} + + +#pragma mark - +/* + * 'parse_options()' - Parse URI options. + */ + +static void parse_options(char *options, + char *serial, + int serial_size, + UInt32 *location, + Boolean *wait_eof) +{ + char sep, /* Separator character */ + *name, /* Name of option */ + *value; /* Value of option */ + + + if (serial) + *serial = '\0'; + if (location) + *location = 0; + + if (!options) + return; + + while (*options) + { + /* + * Get the name... + */ + + name = options; + + while (*options && *options != '=' && *options != '+' && *options != '&') + options ++; + + if ((sep = *options) != '\0') + *options++ = '\0'; + + if (sep == '=') + { + /* + * Get the value... + */ + + value = options; + + while (*options && *options != '+' && *options != '&') + options ++; + + if (*options) + *options++ = '\0'; + } + else + value = (char *)""; + + /* + * Process the option... + */ + + if (!_cups_strcasecmp(name, "waiteof")) + { + if (!_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "true")) + *wait_eof = true; + else if (!_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "false")) + *wait_eof = false; + else + _cupsLangPrintFilter(stderr, "WARNING", + _("Boolean expected for waiteof option \"%s\"."), + value); + } + else if (!_cups_strcasecmp(name, "serial")) + strlcpy(serial, value, serial_size); + else if (!_cups_strcasecmp(name, "location") && location) + *location = strtol(value, NULL, 16); + } +} + + +/*! + * @function setup_cfLanguage + * @abstract Convert the contents of the CUPS 'APPLE_LANGUAGE' environment + * variable into a one element CF array of languages. + * + * @discussion Each submitted job comes with a natural language. CUPS passes + * that language in an environment variable. We take that language + * and jam it into the AppleLanguages array so that CF will use + * it when reading localized resources. We need to do this before + * any CF code reads and caches the languages array, so this function + * should be called early in main() + */ +static void setup_cfLanguage(void) +{ + CFStringRef lang[1] = {NULL}; + CFArrayRef langArray = NULL; + const char *requestedLang = NULL; + + if ((requestedLang = getenv("APPLE_LANGUAGE")) == NULL) + requestedLang = getenv("LANG"); + + if (requestedLang != NULL) + { + lang[0] = CFStringCreateWithCString(kCFAllocatorDefault, requestedLang, kCFStringEncodingUTF8); + langArray = CFArrayCreate(kCFAllocatorDefault, (const void **)lang, sizeof(lang) / sizeof(lang[0]), &kCFTypeArrayCallBacks); + + CFPreferencesSetValue(CFSTR("AppleLanguages"), langArray, kCFPreferencesCurrentApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost); + fprintf(stderr, "DEBUG: usb: AppleLanguages=\"%s\"\n", requestedLang); + + CFRelease(lang[0]); + CFRelease(langArray); + } + else + fputs("DEBUG: usb: LANG and APPLE_LANGUAGE environment variables missing.\n", stderr); +} + +#pragma mark - +#if defined(__i386__) || defined(__x86_64__) +/*! + * @function run_legacy_backend + * + * @abstract Starts child backend process running as a ppc or i386 executable. + * + * @result Never returns; always calls exit(). + * + * @discussion + */ +static void run_legacy_backend(int argc, + char *argv[], + int fd) +{ + int i; + int exitstatus = 0; + int childstatus; + pid_t waitpid_status; + char *my_argv[32]; + char *usb_legacy_status; + + /* + * If we're running as x86_64 or i386 and couldn't load the class driver + * (because it's ppc or i386), then try to re-exec ourselves in ppc or i386 + * mode to try again. If we don't have a ppc or i386 architecture we may be + * running with the same architecture again so guard against this by setting + * and testing an environment variable... + */ + +# ifdef __x86_64__ + usb_legacy_status = getenv("USB_I386_STATUS"); +# else + usb_legacy_status = getenv("USB_PPC_STATUS"); +# endif /* __x86_64__ */ + + if (!usb_legacy_status) + { + /* + * Setup a SIGTERM handler then block it before forking... + */ + + int err; /* posix_spawn result */ + struct sigaction action; /* POSIX signal action */ + sigset_t newmask, /* New signal mask */ + oldmask; /* Old signal mask */ + char usbpath[1024]; /* Path to USB backend */ + const char *cups_serverbin;/* Path to CUPS binaries */ + + + memset(&action, 0, sizeof(action)); + sigaddset(&action.sa_mask, SIGTERM); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); + + sigemptyset(&newmask); + sigaddset(&newmask, SIGTERM); + sigprocmask(SIG_BLOCK, &newmask, &oldmask); + + /* + * Set the environment variable... + */ + +# ifdef __x86_64__ + setenv("USB_I386_STATUS", "1", false); +# else + setenv("USB_PPC_STATUS", "1", false); +# endif /* __x86_64__ */ + + /* + * Tell the kernel to use the specified CPU architecture... + */ + +# ifdef __x86_64__ + cpu_type_t cpu = CPU_TYPE_I386; +# else + cpu_type_t cpu = CPU_TYPE_POWERPC; +# endif /* __x86_64__ */ + size_t ocount = 1; + posix_spawnattr_t attrs; + + if (!posix_spawnattr_init(&attrs)) + { + posix_spawnattr_setsigdefault(&attrs, &oldmask); + if (posix_spawnattr_setbinpref_np(&attrs, 1, &cpu, &ocount) || ocount != 1) + { +# ifdef __x86_64__ + perror("DEBUG: Unable to set binary preference to i386"); +# else + perror("DEBUG: Unable to set binary preference to ppc"); +# endif /* __x86_64__ */ + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to use legacy USB class driver.")); + exit(CUPS_BACKEND_STOP); + } + } + + /* + * Set up the arguments and call posix_spawn... + */ + + if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) + cups_serverbin = CUPS_SERVERBIN; + snprintf(usbpath, sizeof(usbpath), "%s/backend/usb", cups_serverbin); + + for (i = 0; i < argc && i < (sizeof(my_argv) / sizeof(my_argv[0])) - 1; i ++) + my_argv[i] = argv[i]; + + my_argv[i] = NULL; + + if ((err = posix_spawn(&child_pid, usbpath, NULL, &attrs, my_argv, + environ)) != 0) + { + fprintf(stderr, "DEBUG: Unable to exec %s: %s\n", usbpath, + strerror(err)); + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to use legacy USB class driver.")); + exit(CUPS_BACKEND_STOP); + } + + /* + * Unblock signals... + */ + + sigprocmask(SIG_SETMASK, &oldmask, NULL); + + /* + * Close the fds we won't be using then wait for the child backend to exit. + */ + + close(fd); + close(1); + + fprintf(stderr, "DEBUG: Started usb(legacy) backend (PID %d)\n", + (int)child_pid); + + while ((waitpid_status = waitpid(child_pid, &childstatus, 0)) == (pid_t)-1 && errno == EINTR) + usleep(1000); + + if (WIFSIGNALED(childstatus)) + { + exitstatus = CUPS_BACKEND_STOP; + fprintf(stderr, "DEBUG: usb(legacy) backend %d crashed on signal %d\n", + child_pid, WTERMSIG(childstatus)); + } + else + { + if ((exitstatus = WEXITSTATUS(childstatus)) != 0) + fprintf(stderr, + "DEBUG: usb(legacy) backend %d stopped with status %d\n", + child_pid, exitstatus); + else + fprintf(stderr, "DEBUG: usb(legacy) backend %d exited with no errors\n", + child_pid); + } + } + else + { + fputs("DEBUG: usb(legacy) backend running native again\n", stderr); + exitstatus = CUPS_BACKEND_STOP; + } + + exit(exitstatus); +} +#endif /* __i386__ || __x86_64__ */ + + +/* + * 'sigterm_handler()' - SIGTERM handler. + */ + +static void +sigterm_handler(int sig) /* I - Signal */ +{ +#if defined(__i386__) || defined(__x86_64__) + /* + * If we started a child process pass the signal on to it... + */ + + if (child_pid) + { + /* + * If we started a child process pass the signal on to it... + */ + + int status; + + kill(child_pid, sig); + while (waitpid(child_pid, &status, 0) < 0 && errno == EINTR); + + if (WIFEXITED(status)) + exit(WEXITSTATUS(status)); + else if (status == SIGTERM || status == SIGKILL) + exit(0); + else + { + fprintf(stderr, "DEBUG: Child crashed on signal %d\n", status); + exit(CUPS_BACKEND_STOP); + } + } +#endif /* __i386__ || __x86_64__ */ +} + + +#ifdef PARSE_PS_ERRORS +/* + * 'next_line()' - Find the next line in a buffer. + */ + +static const char *next_line (const char *buffer) +{ + const char *cptr, *lptr = NULL; + + for (cptr = buffer; *cptr && lptr == NULL; cptr++) + if (*cptr == '\n' || *cptr == '\r') + lptr = cptr; + return lptr; +} + + +/* + * 'parse_pserror()' - Scan the backchannel data for postscript errors. + */ + +static void parse_pserror(char *sockBuffer, + int len) +{ + static char gErrorBuffer[1024] = ""; + static char *gErrorBufferPtr = gErrorBuffer; + static char *gErrorBufferEndPtr = gErrorBuffer + sizeof(gErrorBuffer); + + char *pCommentBegin, *pCommentEnd, *pLineEnd; + char *logLevel; + char logstr[1024]; + int logstrlen; + + if (gErrorBufferPtr + len > gErrorBufferEndPtr - 1) + gErrorBufferPtr = gErrorBuffer; + if (len > sizeof(gErrorBuffer) - 1) + len = sizeof(gErrorBuffer) - 1; + + memcpy(gErrorBufferPtr, (const void *)sockBuffer, len); + gErrorBufferPtr += len; + *(gErrorBufferPtr + 1) = '\0'; + + pLineEnd = (char *)next_line((const char *)gErrorBuffer); + while (pLineEnd != NULL) + { + *pLineEnd++ = '\0'; + + pCommentBegin = strstr(gErrorBuffer,"%%["); + pCommentEnd = strstr(gErrorBuffer, "]%%"); + if (pCommentBegin != gErrorBuffer && pCommentEnd != NULL) + { + pCommentEnd += 3; /* Skip past "]%%" */ + *pCommentEnd = '\0'; /* There's always room for the nul */ + + if (_cups_strncasecmp(pCommentBegin, "%%[ Error:", 10) == 0) + logLevel = "DEBUG"; + else if (_cups_strncasecmp(pCommentBegin, "%%[ Flushing", 12) == 0) + logLevel = "DEBUG"; + else + logLevel = "INFO"; + + if ((logstrlen = snprintf(logstr, sizeof(logstr), "%s: %s\n", logLevel, pCommentBegin)) >= sizeof(logstr)) + { + /* If the string was trucnated make sure it has a linefeed before the nul */ + logstrlen = sizeof(logstr) - 1; + logstr[logstrlen - 1] = '\n'; + } + write(STDERR_FILENO, logstr, logstrlen); + } + + /* move everything over... */ + strcpy(gErrorBuffer, pLineEnd); + gErrorBufferPtr = gErrorBuffer; + pLineEnd = (char *)next_line((const char *)gErrorBuffer); + } +} +#endif /* PARSE_PS_ERRORS */ + + +/* + * 'soft_reset()' - Send a soft reset to the device. + */ + +static void soft_reset(void) +{ + fd_set input_set; /* Input set for select() */ + struct timeval tv; /* Time value */ + char buffer[2048]; /* Buffer */ + struct timespec cond_timeout; /* pthread condition timeout */ + + /* + * Send an abort once a second until the I/O lock is released by the main thread... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + { + (*g.classdriver)->Abort(g.classdriver); + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + 1; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (g.readwrite_lock) + { + if (pthread_cond_timedwait(&g.readwrite_lock_cond, + &g.readwrite_lock_mutex, + &cond_timeout) != 0) + break; + } + } + + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + /* + * Flush bytes waiting on print_fd... + */ + + g.print_bytes = 0; + + FD_ZERO(&input_set); + FD_SET(g.print_fd, &input_set); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + while (select(g.print_fd+1, &input_set, NULL, NULL, &tv) > 0) + if (read(g.print_fd, buffer, sizeof(buffer)) <= 0) + break; + + /* + * Send the reset... + */ + + (*g.classdriver)->SoftReset(g.classdriver, DEFAULT_TIMEOUT); + + /* + * Release the I/O lock... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); +} + + +/* + * 'get_device_id()' - Return IEEE-1284 device ID. + */ + +static void get_device_id(cups_sc_status_t *status, + char *data, + int *datalen) +{ + CFStringRef deviceIDString = NULL; + + /* GetDeviceID */ + copy_deviceid(g.classdriver, &deviceIDString); + + if (deviceIDString) + { + CFStringGetCString(deviceIDString, data, *datalen, kCFStringEncodingUTF8); + *datalen = strlen(data); + CFRelease(deviceIDString); + } + *status = CUPS_SC_STATUS_OK; +} + + +/* + * End of "$Id: usb-darwin.c 9887 2011-08-11 22:04:59Z mike $". + */ diff --git a/backend/usb-libusb.c b/backend/usb-libusb.c new file mode 100644 index 0000000..c7a9c21 --- /dev/null +++ b/backend/usb-libusb.c @@ -0,0 +1,1868 @@ +/* + * "$Id: usb-libusb.c 10267 2012-02-12 08:35:28Z mike $" + * + * LIBUSB interface code for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * list_devices() - List the available printers. + * print_device() - Print a file to a USB device. + * close_device() - Close the connection to the USB printer. + * find_device() - Find or enumerate USB printers. + * get_device_id() - Get the IEEE-1284 device ID for the printer. + * list_cb() - List USB printers for discovery. + * make_device_uri() - Create a device URI for a USB printer. + * open_device() - Open a connection to the USB printer. + * print_cb() - Find a USB printer for printing. + * printer_class_soft_reset()' - Do the soft reset request specific to + * printers + * quirks() - Get the known quirks of a given printer model + * read_thread() - Thread to read the backchannel data on. + * sidechannel_thread() - Handle side-channel requests. + * soft_reset() - Send a soft reset to the device. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * WAIT_EOF_DELAY is number of seconds we'll wait for responses from + * the printer after we've finished sending all the data + */ + +#define WAIT_EOF 0 +#define WAIT_EOF_DELAY 7 +#define WAIT_SIDE_DELAY 3 +#define DEFAULT_TIMEOUT 5000L + + +/* + * Local types... + */ + +typedef struct usb_printer_s /**** USB Printer Data ****/ +{ + struct libusb_device *device; /* Device info */ + int conf, /* Configuration */ + origconf, /* Original configuration */ + iface, /* Interface */ + altset, /* Alternate setting */ + write_endp, /* Write endpoint */ + read_endp, /* Read endpoint */ + protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */ + usblp_attached; /* "usblp" kernel module attached? */ + unsigned int quirks; /* Quirks flags */ + struct libusb_device_handle *handle; /* Open handle to device */ +} usb_printer_t; + +typedef int (*usb_cb_t)(usb_printer_t *, const char *, const char *, + const void *); + +typedef struct usb_globals_s +{ + usb_printer_t *printer; /* Printer */ + + pthread_mutex_t read_thread_mutex; + pthread_cond_t read_thread_cond; + int read_thread_stop; + int read_thread_done; + + pthread_mutex_t readwrite_lock_mutex; + pthread_cond_t readwrite_lock_cond; + int readwrite_lock; + + int print_fd; /* File descriptor to print */ + ssize_t print_bytes; /* Print bytes read */ + + int wait_eof; + int drain_output; /* Drain all pending output */ + int bidi_flag; /* 0=unidirectional, 1=bidirectional */ + + pthread_mutex_t sidechannel_thread_mutex; + pthread_cond_t sidechannel_thread_cond; + int sidechannel_thread_stop; + int sidechannel_thread_done; +} usb_globals_t; + +/* + * Quirks: various printer quirks are handled by this table & its flags. + * + * This is copied from the usblp kernel module. So we can easily copy and paste + * new quirks from the module. + */ + +struct quirk_printer_struct { + int vendorId; + int productId; + unsigned int quirks; +}; + +#define USBLP_QUIRK_BIDIR 0x1 /* reports bidir but requires + unidirectional mode (no INs/reads) */ +#define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ +#define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific + Class or SubClass */ +#define USBLP_QUIRK_NO_REATTACH 0x8000 /* After printing we cannot re-attach + the usblp kernel module */ + +static const struct quirk_printer_struct quirk_printers[] = { + { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */ + { 0x03f0, 0x0104, USBLP_QUIRK_BIDIR }, /* HP DeskJet 880C */ + { 0x03f0, 0x0204, USBLP_QUIRK_BIDIR }, /* HP DeskJet 815C */ + { 0x03f0, 0x0304, USBLP_QUIRK_BIDIR }, /* HP DeskJet 810C/812C */ + { 0x03f0, 0x0404, USBLP_QUIRK_BIDIR }, /* HP DeskJet 830C */ + { 0x03f0, 0x0504, USBLP_QUIRK_BIDIR }, /* HP DeskJet 885C */ + { 0x03f0, 0x0604, USBLP_QUIRK_BIDIR }, /* HP DeskJet 840C */ + { 0x03f0, 0x0804, USBLP_QUIRK_BIDIR }, /* HP DeskJet 816C */ + { 0x03f0, 0x1104, USBLP_QUIRK_BIDIR }, /* HP Deskjet 959C */ + { 0x0409, 0xefbe, USBLP_QUIRK_BIDIR }, /* NEC Picty900 (HP OEM) */ + { 0x0409, 0xbef4, USBLP_QUIRK_BIDIR }, /* NEC Picty760 (HP OEM) */ + { 0x0409, 0xf0be, USBLP_QUIRK_BIDIR }, /* NEC Picty920 (HP OEM) */ + { 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */ + { 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820, + by zut */ + { 0x04f9, 0x000d, USBLP_QUIRK_BIDIR | + USBLP_QUIRK_NO_REATTACH }, /* Brother Industries, Ltd + HL-1440 Laser Printer */ + { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt + Printer M129C */ + { 0x067b, 0x2305, USBLP_QUIRK_BIDIR | + USBLP_QUIRK_NO_REATTACH }, + /* Prolific Technology, Inc. PL2305 Parallel Port + (USB -> Parallel adapter) */ + { 0, 0 } +}; + + +/* + * Globals... + */ + +usb_globals_t g = { 0 }; /* Globals */ +libusb_device **list; /* List of connected USB devices */ + + +/* + * Local functions... + */ + +static int close_device(usb_printer_t *printer); +static usb_printer_t *find_device(usb_cb_t cb, const void *data); +static int get_device_id(usb_printer_t *printer, char *buffer, + size_t bufsize); +static int list_cb(usb_printer_t *printer, const char *device_uri, + const char *device_id, const void *data); +static char *make_device_uri(usb_printer_t *printer, + const char *device_id, + char *uri, size_t uri_size); +static int open_device(usb_printer_t *printer, int verbose); +static int print_cb(usb_printer_t *printer, const char *device_uri, + const char *device_id, const void *data); +static int printer_class_soft_reset(usb_printer_t *printer); +static unsigned int quirks(int vendor, int product); +static void *read_thread(void *reference); +static void *sidechannel_thread(void *reference); +static void soft_reset(void); + + +/* + * 'list_devices()' - List the available printers. + */ + +void +list_devices(void) +{ + fputs("DEBUG: list_devices\n", stderr); + find_device(list_cb, NULL); +} + + +/* + * 'print_device()' - Print a file to a USB device. + */ + +int /* O - Exit status */ +print_device(const char *uri, /* I - Device URI */ + const char *hostname, /* I - Hostname/manufacturer */ + const char *resource, /* I - Resource/modelname */ + char *options, /* I - Device options/serial number */ + int print_fd, /* I - File descriptor to print */ + int copies, /* I - Copies to print */ + int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + int bytes; /* Bytes written */ + ssize_t total_bytes; /* Total bytes written */ + struct sigaction action; /* Actions for POSIX signals */ + int status = CUPS_BACKEND_OK, + /* Function results */ + iostatus; /* Current IO status */ + pthread_t read_thread_id, /* Read thread */ + sidechannel_thread_id; /* Side-channel thread */ + int have_sidechannel = 0, /* Was the side-channel thread started? */ + have_backchannel = 0; /* Do we have a back channel? */ + struct stat sidechannel_info; /* Side-channel file descriptor info */ + unsigned char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ + fd_set input_set; /* Input set for select() */ + int nfds; /* Number of file descriptors */ + struct timeval *timeout, /* Timeout pointer */ + tv; /* Time value */ + struct timespec cond_timeout; /* pthread condition timeout */ + int num_opts; /* Number of options */ + cups_option_t *opts; /* Options */ + const char *val; /* Option value */ + + + /* + * See if the side-channel descriptor is valid... + */ + + have_sidechannel = !fstat(CUPS_SC_FD, &sidechannel_info) && + S_ISSOCK(sidechannel_info.st_mode); + + g.wait_eof = WAIT_EOF; + + /* + * Connect to the printer... + */ + + fprintf(stderr, "DEBUG: Printing on printer with URI: %s\n", uri); + while ((g.printer = find_device(print_cb, uri)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Waiting for printer to become available.")); + sleep(5); + } + + g.print_fd = print_fd; + + /* + * If we are printing data from a print driver on stdin, ignore SIGTERM + * so that the driver can finish out any page data, e.g. to eject the + * current page. We only do this for stdin printing as otherwise there + * is no way to cancel a raw print job... + */ + + if (!print_fd) + { + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGTERM, &action, NULL); + } + + /* + * Start the side channel thread if the descriptor is valid... + */ + + pthread_mutex_init(&g.readwrite_lock_mutex, NULL); + pthread_cond_init(&g.readwrite_lock_cond, NULL); + g.readwrite_lock = 1; + + if (have_sidechannel) + { + g.sidechannel_thread_stop = 0; + g.sidechannel_thread_done = 0; + + pthread_cond_init(&g.sidechannel_thread_cond, NULL); + pthread_mutex_init(&g.sidechannel_thread_mutex, NULL); + + if (pthread_create(&sidechannel_thread_id, NULL, sidechannel_thread, NULL)) + { + fprintf(stderr, "DEBUG: Fatal USB error.\n"); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + fputs("DEBUG: Couldn't create side-channel thread.\n", stderr); + close_device(g.printer); + return (CUPS_BACKEND_STOP); + } + } + + /* + * Debug mode: If option "usb-unidir" is given, always deactivate + * backchannel + */ + + num_opts = cupsParseOptions(argv[5], 0, &opts); + val = cupsGetOption("usb-unidir", num_opts, opts); + if (val && strcasecmp(val, "no") && strcasecmp(val, "off") && + strcasecmp(val, "false")) + { + g.printer->read_endp = -1; + fprintf(stderr, "DEBUG: Forced uni-directional communication " + "via \"usb-unidir\" option.\n"); + } + + /* + * Debug mode: If option "usb-no-reattach" is given, do not re-attach + * the usblp kernel module after the job has completed. + */ + + val = cupsGetOption("usb-no-reattach", num_opts, opts); + if (val && strcasecmp(val, "no") && strcasecmp(val, "off") && + strcasecmp(val, "false")) + { + g.printer->usblp_attached = 0; + fprintf(stderr, "DEBUG: Forced not re-attaching the usblp kernel module " + "after the job via \"usb-no-reattach\" option.\n"); + } + + /* + * Get the read thread going... + */ + + if (g.printer->read_endp != -1) + { + have_backchannel = 1; + + g.read_thread_stop = 0; + g.read_thread_done = 0; + + pthread_cond_init(&g.read_thread_cond, NULL); + pthread_mutex_init(&g.read_thread_mutex, NULL); + + if (pthread_create(&read_thread_id, NULL, read_thread, NULL)) + { + fprintf(stderr, "DEBUG: Fatal USB error.\n"); + _cupsLangPrintFilter(stderr, "ERROR", + _("There was an unrecoverable USB error.")); + fputs("DEBUG: Couldn't create read thread.\n", stderr); + close_device(g.printer); + return (CUPS_BACKEND_STOP); + } + } + else + fprintf(stderr, "DEBUG: Uni-directional device/mode, back channel " + "deactivated.\n"); + + /* + * The main thread sends the print file... + */ + + g.drain_output = 0; + g.print_bytes = 0; + total_bytes = 0; + print_ptr = print_buffer; + + while (status == CUPS_BACKEND_OK && copies-- > 0) + { + _cupsLangPrintFilter(stderr, "INFO", _("Sending data to printer.")); + + if (print_fd != STDIN_FILENO) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + + while (status == CUPS_BACKEND_OK) + { + FD_ZERO(&input_set); + + if (!g.print_bytes) + FD_SET(print_fd, &input_set); + + /* + * Calculate select timeout... + * If we have data waiting to send timeout is 100ms. + * else if we're draining print_fd timeout is 0. + * else we're waiting forever... + */ + + if (g.print_bytes) + { + tv.tv_sec = 0; + tv.tv_usec = 100000; /* 100ms */ + timeout = &tv; + } + else if (g.drain_output) + { + tv.tv_sec = 0; + tv.tv_usec = 0; + timeout = &tv; + } + else + timeout = NULL; + + /* + * I/O is unlocked around select... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + nfds = select(print_fd + 1, &input_set, NULL, NULL, timeout); + + /* + * Reacquire the lock... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + pthread_cond_wait(&g.readwrite_lock_cond, &g.readwrite_lock_mutex); + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + if (nfds < 0) + { + if (errno == EINTR && total_bytes == 0) + { + fputs("DEBUG: Received an interrupt before any bytes were " + "written, aborting.\n", stderr); + close_device(g.printer); + return (CUPS_BACKEND_OK); + } + else if (errno != EAGAIN && errno != EINTR) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to read print data.")); + perror("DEBUG: select"); + close_device(g.printer); + return (CUPS_BACKEND_FAILED); + } + } + + /* + * If drain output has finished send a response... + */ + + if (g.drain_output && !nfds && !g.print_bytes) + { + /* Send a response... */ + cupsSideChannelWrite(CUPS_SC_CMD_DRAIN_OUTPUT, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + g.drain_output = 0; + } + + /* + * Check if we have print data ready... + */ + + if (FD_ISSET(print_fd, &input_set)) + { + g.print_bytes = read(print_fd, print_buffer, sizeof(print_buffer)); + + if (g.print_bytes < 0) + { + /* + * Read error - bail if we don't see EAGAIN or EINTR... + */ + + if (errno != EAGAIN && errno != EINTR) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to read print data.")); + perror("DEBUG: read"); + close_device(g.printer); + return (CUPS_BACKEND_FAILED); + } + + g.print_bytes = 0; + } + else if (g.print_bytes == 0) + { + /* + * End of file, break out of the loop... + */ + + break; + } + + print_ptr = print_buffer; + + fprintf(stderr, "DEBUG: Read %d bytes of print data...\n", + (int)g.print_bytes); + } + + if (g.print_bytes) + { + iostatus = libusb_bulk_transfer(g.printer->handle, + g.printer->write_endp, + print_buffer, g.print_bytes, + &bytes, 60000); + /* + * Ignore timeout errors, but retain the number of bytes written to + * avoid sending duplicate data... + */ + + if (iostatus == LIBUSB_ERROR_TIMEOUT) + { + fputs("DEBUG: Got USB transaction timeout during write.\n", stderr); + iostatus = 0; + } + + /* + * If we've stalled, retry the write... + */ + + else if (iostatus == LIBUSB_ERROR_PIPE) + { + fputs("DEBUG: Got USB pipe stalled during write.\n", stderr); + + iostatus = libusb_bulk_transfer(g.printer->handle, + g.printer->write_endp, + print_buffer, g.print_bytes, + &bytes, 60000); + } + + /* + * Retry a write after an aborted write since we probably just got + * SIGTERM... + */ + + else if (iostatus == LIBUSB_ERROR_INTERRUPTED) + { + fputs("DEBUG: Got USB return aborted during write.\n", stderr); + + iostatus = libusb_bulk_transfer(g.printer->handle, + g.printer->write_endp, + print_buffer, g.print_bytes, + &bytes, 60000); + } + + if (iostatus) + { + /* + * Write error - bail if we don't see an error we can retry... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to send data to printer.")); + fprintf(stderr, "DEBUG: libusb write operation returned %x.\n", + iostatus); + + status = CUPS_BACKEND_FAILED; + break; + } + else if (bytes > 0) + { + fprintf(stderr, "DEBUG: Wrote %d bytes of print data...\n", + (int)bytes); + + g.print_bytes -= bytes; + print_ptr += bytes; + total_bytes += bytes; + } + } + + if (print_fd != 0 && status == CUPS_BACKEND_OK) + fprintf(stderr, "DEBUG: Sending print file, " CUPS_LLFMT " bytes...\n", + CUPS_LLCAST total_bytes); + } + } + + fprintf(stderr, "DEBUG: Sent " CUPS_LLFMT " bytes...\n", + CUPS_LLCAST total_bytes); + + /* + * Signal the side channel thread to exit... + */ + + if (have_sidechannel) + { + close(CUPS_SC_FD); + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + g.sidechannel_thread_stop = 1; + pthread_mutex_lock(&g.sidechannel_thread_mutex); + + if (!g.sidechannel_thread_done) + { + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + WAIT_SIDE_DELAY; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.sidechannel_thread_done) + { + if (pthread_cond_timedwait(&g.sidechannel_thread_cond, + &g.sidechannel_thread_mutex, + &cond_timeout) != 0) + break; + } + } + + pthread_mutex_unlock(&g.sidechannel_thread_mutex); + } + + /* + * Signal the read thread to exit then wait 7 seconds for it to complete... + */ + + if (have_backchannel) + { + g.read_thread_stop = 1; + + pthread_mutex_lock(&g.read_thread_mutex); + + if (!g.read_thread_done) + { + fputs("DEBUG: Waiting for read thread to exit...\n", stderr); + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } + + /* + * If it didn't exit abort the pending read and wait an additional + * second... + */ + + if (!g.read_thread_done) + { + fputs("DEBUG: Read thread still active, aborting the pending read...\n", + stderr); + + g.wait_eof = 0; + + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + 1; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } + } + } + + pthread_mutex_unlock(&g.read_thread_mutex); + } + + if (print_fd) + close(print_fd); + + /* + * Close the connection and input file and general clean up... + */ + + close_device(g.printer); + + /* + * Clean up .... + */ + + libusb_free_device_list(list, 1); + libusb_exit(NULL); + + return (status); +} + + +/* + * 'close_device()' - Close the connection to the USB printer. + */ + +static int /* I - 0 on success, -1 on failure */ +close_device(usb_printer_t *printer) /* I - Printer */ +{ + struct libusb_device_descriptor devdesc; + /* Current device descriptor */ + struct libusb_config_descriptor *confptr; + /* Pointer to current configuration */ + + + if (printer->handle) + { + /* + * Release interfaces before closing so that we know all data is written + * to the device... + */ + + int errcode; /* Return value of libusb function */ + int number1, /* Interface number */ + number2; /* Configuration number */ + + errcode = + libusb_get_config_descriptor(printer->device, printer->conf, &confptr); + if (errcode >= 0) + { + number1 = confptr->interface[printer->iface]. + altsetting[printer->altset].bInterfaceNumber; + libusb_release_interface(printer->handle, number1); + + number2 = confptr->bConfigurationValue; + + libusb_free_config_descriptor(confptr); + + /* + * If we have changed the configuration from one valid configuration + * to another, restore the old one + */ + if (printer->origconf > 0 && printer->origconf != number2) + { + fprintf(stderr, "DEBUG: Restoring USB device configuration: %d -> %d\n", + number2, printer->origconf); + if ((errcode = libusb_set_configuration(printer->handle, + printer->origconf)) < 0) + { + if (errcode != LIBUSB_ERROR_BUSY) + { + errcode = + libusb_get_device_descriptor (printer->device, &devdesc); + if (errcode < 0) + fprintf(stderr, + "DEBUG: Failed to set configuration %d\n", + printer->origconf); + else + fprintf(stderr, + "DEBUG: Failed to set configuration %d for %04x:%04x\n", + printer->origconf, devdesc.idVendor, devdesc.idProduct); + } + } + } + + /* + * Re-attach "usblp" kernel module if it was attached before using this + * device + */ + if (printer->usblp_attached == 1) + if (libusb_attach_kernel_driver(printer->handle, number1) < 0) + { + errcode = libusb_get_device_descriptor (printer->device, &devdesc); + if (errcode < 0) + fprintf(stderr, + "DEBUG: Failed to re-attach \"usblp\" kernel module\n"); + else + fprintf(stderr, + "DEBUG: Failed to re-attach \"usblp\" kernel module to " + "%04x:%04x\n", devdesc.idVendor, devdesc.idProduct); + } + } + else + fprintf(stderr, + "DEBUG: Failed to get configuration descriptor %d\n", + printer->conf); + + /* + * Close the interface and return... + */ + + libusb_close(printer->handle); + printer->handle = NULL; + } + + return (0); +} + + +/* + * 'find_device()' - Find or enumerate USB printers. + */ + +static usb_printer_t * /* O - Found printer */ +find_device(usb_cb_t cb, /* I - Callback function */ + const void *data) /* I - User data for callback */ +{ + libusb_device **list; /* List of connected USB devices */ + libusb_device *device = NULL; /* Current device */ + struct libusb_device_descriptor devdesc; + /* Current device descriptor */ + struct libusb_config_descriptor *confptr = NULL; + /* Pointer to current configuration */ + const struct libusb_interface *ifaceptr = NULL; + /* Pointer to current interface */ + const struct libusb_interface_descriptor *altptr = NULL; + /* Pointer to current alternate setting */ + const struct libusb_endpoint_descriptor *endpptr = NULL; + /* Pointer to current endpoint */ + ssize_t numdevs, /* number of connected devices */ + i = 0; + uint8_t conf, /* Current configuration */ + iface, /* Current interface */ + altset, /* Current alternate setting */ + protocol, /* Current protocol */ + endp, /* Current endpoint */ + read_endp, /* Current read endpoint */ + write_endp; /* Current write endpoint */ + char device_id[1024],/* IEEE-1284 device ID */ + device_uri[1024]; + /* Device URI */ + static usb_printer_t printer; /* Current printer */ + + + /* + * Initialize libusb... + */ + + libusb_init(NULL); + numdevs = libusb_get_device_list(NULL, &list); + fprintf(stderr, "DEBUG: libusb_get_device_list=%d\n", (int)numdevs); + + /* + * Then loop through the devices it found... + */ + + if (numdevs > 0) + for (i = 0; i < numdevs; i++) + { + device = list[i]; + + /* + * Ignore devices with no configuration data and anything that is not + * a printer... + */ + + if (libusb_get_device_descriptor(device, &devdesc) < 0) + continue; + + if (!devdesc.bNumConfigurations || !devdesc.idVendor || + !devdesc.idProduct) + continue; + + printer.quirks = quirks(devdesc.idVendor, devdesc.idProduct); + + for (conf = 0; conf < devdesc.bNumConfigurations; conf ++) + { + if (libusb_get_config_descriptor(device, conf, &confptr) < 0) + continue; + for (iface = 0, ifaceptr = confptr->interface; + iface < confptr->bNumInterfaces; + iface ++, ifaceptr ++) + { + /* + * Some printers offer multiple interfaces... + */ + + protocol = 0; + + for (altset = 0, altptr = ifaceptr->altsetting; + altset < ifaceptr->num_altsetting; + altset ++, altptr ++) + { + /* + * Currently we only support unidirectional and bidirectional + * printers. Future versions of this code will support the + * 1284.4 (packet mode) protocol as well. + */ + + if (((altptr->bInterfaceClass != LIBUSB_CLASS_PRINTER || + altptr->bInterfaceSubClass != 1) && + ((printer.quirks & USBLP_QUIRK_BAD_CLASS) == 0)) || + (altptr->bInterfaceProtocol != 1 && /* Unidirectional */ + altptr->bInterfaceProtocol != 2) || /* Bidirectional */ + altptr->bInterfaceProtocol < protocol) + continue; + + if (printer.quirks & USBLP_QUIRK_BAD_CLASS) + fprintf(stderr, "DEBUG: Printer does not report class 7 and/or " + "subclass 1 but works as a printer anyway\n"); + + read_endp = -1; + write_endp = -1; + + for (endp = 0, endpptr = altptr->endpoint; + endp < altptr->bNumEndpoints; + endp ++, endpptr ++) + if ((endpptr->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) == + LIBUSB_TRANSFER_TYPE_BULK) + { + if (endpptr->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) + read_endp = endp; + else + write_endp = endp; + } + + if (write_endp >= 0) + { + /* + * Save the best match so far... + */ + + protocol = altptr->bInterfaceProtocol; + printer.altset = altset; + printer.write_endp = write_endp; + if (protocol > 1) + printer.read_endp = read_endp; + else + printer.read_endp = -1; + } + } + + if (protocol > 0) + { + printer.device = device; + printer.conf = conf; + printer.iface = iface; + printer.protocol = protocol; + printer.handle = NULL; + + if (!open_device(&printer, data != NULL)) + { + get_device_id(&printer, device_id, sizeof(device_id)); + make_device_uri(&printer, device_id, device_uri, + sizeof(device_uri)); + + fprintf(stderr, "DEBUG2: Printer found with device ID: %s " + "Device URI: %s\n", + device_id, device_uri); + + if ((*cb)(&printer, device_uri, device_id, data)) + { + fprintf(stderr, "DEBUG: Device protocol: %d\n", + printer.protocol); + if (printer.quirks & USBLP_QUIRK_BIDIR) + { + printer.read_endp = -1; + fprintf(stderr, "DEBUG: Printer reports bi-di support " + "but in reality works only uni-directionally\n"); + } + if (printer.read_endp != -1) + { + printer.read_endp = confptr->interface[printer.iface]. + altsetting[printer.altset]. + endpoint[printer.read_endp]. + bEndpointAddress; + } + else + fprintf(stderr, "DEBUG: Uni-directional USB communication " + "only!\n"); + printer.write_endp = confptr->interface[printer.iface]. + altsetting[printer.altset]. + endpoint[printer.write_endp]. + bEndpointAddress; + if (printer.quirks & USBLP_QUIRK_NO_REATTACH) + { + printer.usblp_attached = 0; + fprintf(stderr, "DEBUG: Printer does not like usblp " + "kernel module to be re-attached after job\n"); + } + libusb_free_config_descriptor(confptr); + return (&printer); + } + + close_device(&printer); + } + } + } + libusb_free_config_descriptor(confptr); + } + } + + /* + * If we get this far without returning, then we haven't found a printer + * to print to... + */ + + /* + * Clean up .... + */ + + libusb_free_device_list(list, 1); + libusb_exit(NULL); + + return (NULL); +} + + +/* + * 'get_device_id()' - Get the IEEE-1284 device ID for the printer. + */ + +static int /* O - 0 on success, -1 on error */ +get_device_id(usb_printer_t *printer, /* I - Printer */ + char *buffer, /* I - String buffer */ + size_t bufsize) /* I - Number of bytes in buffer */ +{ + int length; /* Length of device ID */ + + + if (libusb_control_transfer(printer->handle, + LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_ENDPOINT_IN | + LIBUSB_RECIPIENT_INTERFACE, + 0, printer->conf, + (printer->iface << 8) | printer->altset, + (unsigned char *)buffer, bufsize, 5000) < 0) + { + *buffer = '\0'; + return (-1); + } + + /* + * Extract the length of the device ID string from the first two + * bytes. The 1284 spec says the length is stored MSB first... + */ + + length = (((unsigned)buffer[0] & 255) << 8) | + ((unsigned)buffer[1] & 255); + + /* + * Check to see if the length is larger than our buffer or less than 14 bytes + * (the minimum valid device ID is "MFG:x;MDL:y;" with 2 bytes for the length). + * + * If the length is out-of-range, assume that the vendor incorrectly + * implemented the 1284 spec and re-read the length as LSB first,.. + */ + + if (length > bufsize || length < 14) + length = (((unsigned)buffer[1] & 255) << 8) | + ((unsigned)buffer[0] & 255); + + if (length > bufsize) + length = bufsize; + + if (length < 14) + { + /* + * Invalid device ID, clear it! + */ + + *buffer = '\0'; + return (-1); + } + + length -= 2; + + /* + * Copy the device ID text to the beginning of the buffer and + * nul-terminate. + */ + + memmove(buffer, buffer + 2, length); + buffer[length] = '\0'; + + return (0); +} + + +/* + * 'list_cb()' - List USB printers for discovery. + */ + +static int /* O - 0 to continue, 1 to stop */ +list_cb(usb_printer_t *printer, /* I - Printer */ + const char *device_uri, /* I - Device URI */ + const char *device_id, /* I - IEEE-1284 device ID */ + const void *data) /* I - User data (not used) */ +{ + char make_model[1024]; /* Make and model */ + + + /* + * Get the device URI and make/model strings... + */ + + if (backendGetMakeModel(device_id, make_model, sizeof(make_model))) + strlcpy(make_model, "Unknown", sizeof(make_model)); + + /* + * Report the printer... + */ + + cupsBackendReport("direct", device_uri, make_model, make_model, device_id, + NULL); + + /* + * Keep going... + */ + + return (0); +} + + +/* + * 'make_device_uri()' - Create a device URI for a USB printer. + */ + +static char * /* O - Device URI */ +make_device_uri( + usb_printer_t *printer, /* I - Printer */ + const char *device_id, /* I - IEEE-1284 device ID */ + char *uri, /* I - Device URI buffer */ + size_t uri_size) /* I - Size of device URI buffer */ +{ + struct libusb_device_descriptor devdesc; + /* Current device descriptor */ + char options[1024]; /* Device URI options */ + int num_values; /* Number of 1284 parameters */ + cups_option_t *values; /* 1284 parameters */ + const char *mfg, /* Manufacturer */ + *mdl, /* Model */ + *des = NULL, /* Description */ + *sern; /* Serial number */ + size_t mfglen; /* Length of manufacturer string */ + char tempmfg[256], /* Temporary manufacturer string */ + tempsern[256], /* Temporary serial number string */ + *tempptr; /* Pointer into temp string */ + + + /* + * Get the make, model, and serial numbers... + */ + + num_values = _cupsGet1284Values(device_id, &values); + + if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) + if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) + if ((sern = cupsGetOption("SN", num_values, values)) == NULL && + ((libusb_get_device_descriptor(printer->device, &devdesc) >= 0) && + devdesc.iSerialNumber)) + { + /* + * Try getting the serial number from the device itself... + */ + + int length = + libusb_get_string_descriptor_ascii(printer->handle, + devdesc.iSerialNumber, + (unsigned char *)tempsern, + sizeof(tempsern) - 1); + if (length > 0) + { + tempsern[length] = '\0'; + sern = tempsern; + } + } + + if ((mfg = cupsGetOption("MANUFACTURER", num_values, values)) == NULL) + mfg = cupsGetOption("MFG", num_values, values); + + if ((mdl = cupsGetOption("MODEL", num_values, values)) == NULL) + mdl = cupsGetOption("MDL", num_values, values); + + /* + * To maintain compatibility with the original character device backend on + * Linux and *BSD, map manufacturer names... + */ + + if (mfg) + { + if (!_cups_strcasecmp(mfg, "Hewlett-Packard")) + mfg = "HP"; + else if (!_cups_strcasecmp(mfg, "Lexmark International")) + mfg = "Lexmark"; + } + else + { + /* + * No manufacturer? Use the model string or description... + */ + + if (mdl) + _ppdNormalizeMakeAndModel(mdl, tempmfg, sizeof(tempmfg)); + else if ((des = cupsGetOption("DESCRIPTION", num_values, values)) != NULL || + (des = cupsGetOption("DES", num_values, values)) != NULL) + _ppdNormalizeMakeAndModel(des, tempmfg, sizeof(tempmfg)); + else + strlcpy(tempmfg, "Unknown", sizeof(tempmfg)); + + if ((tempptr = strchr(tempmfg, ' ')) != NULL) + *tempptr = '\0'; + + mfg = tempmfg; + } + + if (!mdl) + { + /* + * No model? Use description... + */ + if (des) + mdl = des; /* We remove the manufacturer name below */ + else if (!strncasecmp(mfg, "Unknown", 7)) + mdl = "Printer"; + else + mdl = "Unknown Model"; + } + + mfglen = strlen(mfg); + + if (!strncasecmp(mdl, mfg, mfglen) && _cups_isspace(mdl[mfglen])) + { + mdl += mfglen + 1; + + while (_cups_isspace(*mdl)) + mdl ++; + } + + /* + * Generate the device URI from the manufacturer, model, serial number, + * and interface number... + */ + + if (sern) + { + if (printer->iface > 0) + snprintf(options, sizeof(options), "?serial=%s&interface=%d", sern, + printer->iface); + else + snprintf(options, sizeof(options), "?serial=%s", sern); + } + else if (printer->iface > 0) + snprintf(options, sizeof(options), "?interface=%d", printer->iface); + else + options[0] = '\0'; + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, uri_size, "usb", NULL, mfg, 0, + "/%s%s", mdl, options); + + cupsFreeOptions(num_values, values); + + return (uri); +} + + +/* + * 'open_device()' - Open a connection to the USB printer. + */ + +static int /* O - 0 on success, -1 on error */ +open_device(usb_printer_t *printer, /* I - Printer */ + int verbose) /* I - Update connecting-to-device state? */ +{ + struct libusb_device_descriptor devdesc; + /* Current device descriptor */ + struct libusb_config_descriptor *confptr = NULL; + /* Pointer to current configuration */ + int number1 = -1, /* Configuration/interface/altset */ + number2 = -1, /* numbers */ + errcode = 0; + char current; /* Current configuration */ + + + /* + * Return immediately if we are already connected... + */ + + if (printer->handle) + return (0); + + /* + * Try opening the printer... + */ + + if ((errcode = libusb_open(printer->device, &printer->handle)) < 0) + { + fprintf(stderr, "DEBUG: Failed to open device, code: %d\n", + errcode); + return (-1); + } + + printer->usblp_attached = 0; + + if (verbose) + fputs("STATE: +connecting-to-device\n", stderr); + + if ((errcode = libusb_get_device_descriptor(printer->device, &devdesc)) < 0) + { + fprintf(stderr, "DEBUG: Failed to get device descriptor, code: %d\n", + errcode); + goto error; + } + + /* + * Get the "usblp" kernel module out of the way. This backend only + * works without the module attached. + */ + + errcode = libusb_kernel_driver_active(printer->handle, printer->iface); + if (errcode == 0) + printer->usblp_attached = 0; + else if (errcode == 1) + { + printer->usblp_attached = 1; + if ((errcode = + libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0) + { + fprintf(stderr, "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n", + devdesc.idVendor, devdesc.idProduct); + goto error; + } + } + else + { + printer->usblp_attached = 0; + fprintf(stderr, "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" kernel module attached\n", + devdesc.idVendor, devdesc.idProduct); + goto error; + } + + /* + * Set the desired configuration, but only if it needs changing. Some + * printers (e.g., Samsung) don't like libusb_set_configuration. It will + * succeed, but the following print job is sometimes silently lost by the + * printer. + */ + + if (libusb_control_transfer(printer->handle, + LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_ENDPOINT_IN | + LIBUSB_RECIPIENT_DEVICE, + 8, /* GET_CONFIGURATION */ + 0, 0, (unsigned char *)¤t, 1, 5000) < 0) + current = 0; /* Assume not configured */ + + printer->origconf = current; + + if ((errcode = + libusb_get_config_descriptor (printer->device, printer->conf, &confptr)) + < 0) + { + fprintf(stderr, "DEBUG: Failed to get config descriptor for %04x:%04x\n", + devdesc.idVendor, devdesc.idProduct); + goto error; + } + number1 = confptr->bConfigurationValue; + + if (number1 != current) + { + fprintf(stderr, "DEBUG: Switching USB device configuration: %d -> %d\n", + current, number1); + if ((errcode = libusb_set_configuration(printer->handle, number1)) < 0) + { + /* + * If the set fails, chances are that the printer only supports a + * single configuration. Technically these printers don't conform to + * the USB printer specification, but otherwise they'll work... + */ + + if (errcode != LIBUSB_ERROR_BUSY) + fprintf(stderr, "DEBUG: Failed to set configuration %d for %04x:%04x\n", + number1, devdesc.idVendor, devdesc.idProduct); + } + } + + /* + * Claim interfaces as needed... + */ + + number1 = confptr->interface[printer->iface]. + altsetting[printer->altset].bInterfaceNumber; + + while ((errcode = libusb_claim_interface(printer->handle, number1)) < 0) + { + if (errcode != LIBUSB_ERROR_BUSY) + { + fprintf(stderr, + "DEBUG: Failed to claim interface %d for %04x:%04x: %s\n", + number1, devdesc.idVendor, devdesc.idProduct, strerror(errno)); + + goto error; + } + } + + /* + * Set alternate setting, but only if there is more than one option. Some + * printers (e.g., Samsung) don't like usb_set_altinterface. + */ + + if (confptr->interface[printer->iface].num_altsetting > 1) + { + number1 = confptr->interface[printer->iface]. + altsetting[printer->altset].bInterfaceNumber; + number2 = confptr->interface[printer->iface]. + altsetting[printer->altset].bAlternateSetting; + + while ((errcode = + libusb_set_interface_alt_setting(printer->handle, number1, number2)) + < 0) + { + if (errcode != LIBUSB_ERROR_BUSY) + { + fprintf(stderr, + "DEBUG: Failed to set alternate interface %d for %04x:%04x: " + "%s\n", + number2, devdesc.idVendor, devdesc.idProduct, strerror(errno)); + + goto error; + } + } + } + + libusb_free_config_descriptor(confptr); + + if (verbose) + fputs("STATE: -connecting-to-device\n", stderr); + + return (0); + + /* + * If we get here, there was a hard error... + */ + + error: + + if (verbose) + fputs("STATE: -connecting-to-device\n", stderr); + + libusb_close(printer->handle); + printer->handle = NULL; + + return (-1); +} + + +/* + * 'print_cb()' - Find a USB printer for printing. + */ + +static int /* O - 0 to continue, 1 to stop (found) */ +print_cb(usb_printer_t *printer, /* I - Printer */ + const char *device_uri, /* I - Device URI */ + const char *device_id, /* I - IEEE-1284 device ID */ + const void *data) /* I - User data (make, model, S/N) */ +{ + char requested_uri[1024], /* Requested URI */ + *requested_ptr, /* Pointer into requested URI */ + detected_uri[1024], /* Detected URI */ + *detected_ptr; /* Pointer into detected URI */ + + + /* + * If we have an exact match, stop now... + */ + + if (!strcmp((char *)data, device_uri)) + return (1); + + /* + * Work on copies of the URIs... + */ + + strlcpy(requested_uri, (char *)data, sizeof(requested_uri)); + strlcpy(detected_uri, device_uri, sizeof(detected_uri)); + + /* + * libusb-discovered URIs can have an "interface" specification and this + * never happens for usblp-discovered URIs, so remove the "interface" + * specification from the URI which we are checking currently. This way a + * queue for a usblp-discovered printer can now be accessed via libusb. + * + * Similarly, strip "?serial=NNN...NNN" as needed. + */ + + if ((requested_ptr = strstr(requested_uri, "?interface=")) == NULL) + requested_ptr = strstr(requested_uri, "&interface="); + if ((detected_ptr = strstr(detected_uri, "?interface=")) == NULL) + detected_ptr = strstr(detected_uri, "&interface="); + + if (!requested_ptr && detected_ptr) + { + /* + * Strip "[?&]interface=nnn" from the detected printer. + */ + + *detected_ptr = '\0'; + } + else if (requested_ptr && !detected_ptr) + { + /* + * Strip "[?&]interface=nnn" from the requested printer. + */ + + *requested_ptr = '\0'; + } + + if ((requested_ptr = strstr(requested_uri, "?serial=?")) != NULL) + { + /* + * Strip "?serial=?" from the requested printer. This is a special + * case, as "?serial=?" means no serial number and not the serial + * number '?'. This is not covered by the checks below... + */ + + *requested_ptr = '\0'; + } + + if ((requested_ptr = strstr(requested_uri, "?serial=")) == NULL && + (detected_ptr = strstr(detected_uri, "?serial=")) != NULL) + { + /* + * Strip "?serial=nnn" from the detected printer. + */ + + *detected_ptr = '\0'; + } + else if (requested_ptr && !detected_ptr) + { + /* + * Strip "?serial=nnn" from the requested printer. + */ + + *requested_ptr = '\0'; + } + + return (!strcmp(requested_uri, detected_uri)); +} + + +/* + * 'printer_class_soft_reset()' - Do the soft reset request specific to printers + * + * This soft reset is specific to the printer device class and is much less + * invasive than the general USB reset libusb_reset_device(). Especially it + * does never happen that the USB addressing and configuration changes. What + * is actually done is that all buffers get flushed and the bulk IN and OUT + * pipes get reset to their default states. This clears all stall conditions. + * See http://cholla.mmto.org/computers/linux/usb/usbprint11.pdf + */ + +static int /* O - 0 on success, < 0 on error */ +printer_class_soft_reset(usb_printer_t *printer) /* I - Printer */ +{ + struct libusb_config_descriptor *confptr = NULL; + /* Pointer to current configuration */ + int interface, + errcode; + + if (libusb_get_config_descriptor(printer->device, printer->conf, &confptr) + < 0) + interface = printer->iface; + else + interface = confptr->interface[printer->iface]. + altsetting[printer->altset].bInterfaceNumber; + libusb_free_config_descriptor(confptr); + if ((errcode = libusb_control_transfer(printer->handle, + LIBUSB_REQUEST_TYPE_CLASS | + LIBUSB_ENDPOINT_OUT | + LIBUSB_RECIPIENT_OTHER, + 2, 0, interface, NULL, 0, 5000)) < 0) + errcode = libusb_control_transfer(printer->handle, + LIBUSB_REQUEST_TYPE_CLASS | + LIBUSB_ENDPOINT_OUT | + LIBUSB_RECIPIENT_INTERFACE, + 2, 0, interface, NULL, 0, 5000); + return errcode; +} + + +/* + * 'quirks()' - Get the known quirks of a given printer model + */ + +static unsigned int quirks(int vendor, int product) +{ + int i; + + for (i = 0; quirk_printers[i].vendorId; i++) + { + if (vendor == quirk_printers[i].vendorId && + product == quirk_printers[i].productId) + return quirk_printers[i].quirks; + } + return 0; +} + + +/* + * 'read_thread()' - Thread to read the backchannel data on. + */ + +static void *read_thread(void *reference) +{ + unsigned char readbuffer[512]; + int rbytes; + int readstatus; + struct timeval now, + delay, + end, + timeleft; + + + (void)reference; + + /* + * Read frequency: once every 250 milliseconds. + */ + + delay.tv_sec = 0; + delay.tv_usec = 250000; + + do + { + /* + * Remember when we started so we can throttle the loop after the read + * call... + */ + + gettimeofday(&now, NULL); + + /* + * Calculate what 250 milliSeconds are in absolute time... + */ + + timeradd(&now, &delay, &end); + + rbytes = sizeof(readbuffer); + readstatus = libusb_bulk_transfer(g.printer->handle, + g.printer->read_endp, + readbuffer, rbytes, + &rbytes, 60000); + if (readstatus == LIBUSB_SUCCESS && rbytes > 0) + { + fprintf(stderr, "DEBUG: Read %d bytes of back-channel data...\n", + (int)rbytes); + cupsBackChannelWrite((const char *)readbuffer, rbytes, 1.0); + } + else if (readstatus == LIBUSB_ERROR_TIMEOUT) + fputs("DEBUG: Got USB transaction timeout during read.\n", stderr); + else if (readstatus == LIBUSB_ERROR_PIPE) + fputs("DEBUG: Got USB pipe stalled during read.\n", stderr); + else if (readstatus == LIBUSB_ERROR_INTERRUPTED) + fputs("DEBUG: Got USB return aborted during read.\n", stderr); + + /* + * Make sure this loop executes no more than once every 250 miliseconds... + */ + + if ((readstatus != LIBUSB_SUCCESS || rbytes == 0) && + (g.wait_eof || !g.read_thread_stop)) + { + gettimeofday(&now, NULL); + if (timercmp(&now, &end, <)) + { + timersub(&end, &now, &timeleft); + usleep(1000000 * timeleft.tv_sec + timeleft.tv_usec); + } + } + } while (g.wait_eof || !g.read_thread_stop); + + /* + * Let the main thread know that we have completed the read thread... + */ + + pthread_mutex_lock(&g.read_thread_mutex); + g.read_thread_done = 1; + pthread_cond_signal(&g.read_thread_cond); + pthread_mutex_unlock(&g.read_thread_mutex); + + return (NULL); +} + + +/* + * 'sidechannel_thread()' - Handle side-channel requests. + */ + +static void* +sidechannel_thread(void *reference) +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + (void)reference; + + do + { + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + { + if (status == CUPS_SC_STATUS_TIMEOUT) + continue; + else + break; + } + + switch (command) + { + case CUPS_SC_CMD_SOFT_RESET: /* Do a soft reset */ + fputs("DEBUG: CUPS_SC_CMD_SOFT_RESET received from driver...\n", + stderr); + + soft_reset(); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, NULL, 0, 1.0); + fputs("DEBUG: Returning status CUPS_STATUS_OK with no bytes...\n", + stderr); + break; + + case CUPS_SC_CMD_DRAIN_OUTPUT: /* Drain all pending output */ + fputs("DEBUG: CUPS_SC_CMD_DRAIN_OUTPUT received from driver...\n", + stderr); + + g.drain_output = 1; + break; + + case CUPS_SC_CMD_GET_BIDI: /* Is the connection bidirectional? */ + fputs("DEBUG: CUPS_SC_CMD_GET_BIDI received from driver...\n", + stderr); + + data[0] = (g.printer->protocol >= 2 ? 1 : 0); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + + fprintf(stderr, + "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n", + data[0]); + break; + + case CUPS_SC_CMD_GET_DEVICE_ID: /* Return IEEE-1284 device ID */ + fputs("DEBUG: CUPS_SC_CMD_GET_DEVICE_ID received from driver...\n", + stderr); + + datalen = sizeof(data); + if (get_device_id(g.printer, data, sizeof(data))) + { + status = CUPS_SC_STATUS_IO_ERROR; + datalen = 0; + } + else + { + status = CUPS_SC_STATUS_OK; + datalen = strlen(data); + } + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, datalen, 1.0); + + if (datalen < sizeof(data)) + data[datalen] = '\0'; + else + data[sizeof(data) - 1] = '\0'; + + fprintf(stderr, + "DEBUG: Returning CUPS_SC_STATUS_OK with %d bytes (%s)...\n", + datalen, data); + break; + + case CUPS_SC_CMD_GET_STATE: /* Return device state */ + fputs("DEBUG: CUPS_SC_CMD_GET_STATE received from driver...\n", + stderr); + + data[0] = CUPS_SC_STATE_ONLINE; + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + + fprintf(stderr, + "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n", + data[0]); + break; + + case CUPS_SC_CMD_GET_CONNECTED: /* Return whether device is + connected */ + fputs("DEBUG: CUPS_SC_CMD_GET_CONNECTED received from driver...\n", + stderr); + + data[0] = (g.printer->handle ? 1 : 0); + cupsSideChannelWrite(command, CUPS_SC_STATUS_OK, data, 1, 1.0); + + fprintf(stderr, + "DEBUG: Returned CUPS_SC_STATUS_OK with 1 byte (%02X)...\n", + data[0]); + break; + + default: + fprintf(stderr, "DEBUG: Unknown side-channel command (%d) received " + "from driver...\n", command); + + cupsSideChannelWrite(command, CUPS_SC_STATUS_NOT_IMPLEMENTED, + NULL, 0, 1.0); + + fputs("DEBUG: Returned CUPS_SC_STATUS_NOT_IMPLEMENTED with no bytes...\n", + stderr); + break; + } + } + while (!g.sidechannel_thread_stop); + + pthread_mutex_lock(&g.sidechannel_thread_mutex); + g.sidechannel_thread_done = 1; + pthread_cond_signal(&g.sidechannel_thread_cond); + pthread_mutex_unlock(&g.sidechannel_thread_mutex); + + return (NULL); +} + + +/* + * 'soft_reset()' - Send a soft reset to the device. + */ + +static void soft_reset(void) +{ + fd_set input_set; /* Input set for select() */ + struct timeval tv; /* Time value */ + char buffer[2048]; /* Buffer */ + struct timespec cond_timeout; /* pthread condition timeout */ + + /* + * Send an abort once a second until the I/O lock is released by the main + * thread... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + while (g.readwrite_lock) + { + gettimeofday(&tv, NULL); + cond_timeout.tv_sec = tv.tv_sec + 1; + cond_timeout.tv_nsec = tv.tv_usec * 1000; + + while (g.readwrite_lock) + { + if (pthread_cond_timedwait(&g.readwrite_lock_cond, + &g.readwrite_lock_mutex, + &cond_timeout) != 0) + break; + } + } + + g.readwrite_lock = 1; + pthread_mutex_unlock(&g.readwrite_lock_mutex); + + /* + * Flush bytes waiting on print_fd... + */ + + g.print_bytes = 0; + + FD_ZERO(&input_set); + FD_SET(g.print_fd, &input_set); + + tv.tv_sec = 0; + tv.tv_usec = 0; + + while (select(g.print_fd+1, &input_set, NULL, NULL, &tv) > 0) + if (read(g.print_fd, buffer, sizeof(buffer)) <= 0) + break; + + /* + * Send the reset... + */ + + printer_class_soft_reset(g.printer); + + /* + * Release the I/O lock... + */ + + pthread_mutex_lock(&g.readwrite_lock_mutex); + g.readwrite_lock = 0; + pthread_cond_signal(&g.readwrite_lock_cond); + pthread_mutex_unlock(&g.readwrite_lock_mutex); +} + + +/* + * End of "$Id: usb-libusb.c 10267 2012-02-12 08:35:28Z mike $". + */ + diff --git a/backend/usb-unix.c b/backend/usb-unix.c new file mode 100644 index 0000000..1c28033 --- /dev/null +++ b/backend/usb-unix.c @@ -0,0 +1,623 @@ +/* + * "$Id: usb-unix.c 9793 2011-05-20 03:49:49Z mike $" + * + * USB port backend for CUPS. + * + * This file is included from "usb.c" when compiled on UNIX/Linux. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * print_device() - Print a file to a USB device. + * list_devices() - List all USB devices. + * open_device() - Open a USB device... + * side_cb() - Handle side-channel requests... + */ + +/* + * Include necessary headers. + */ + +#include + + +/* + * Local functions... + */ + +static int open_device(const char *uri, int *use_bc); +static int side_cb(int print_fd, int device_fd, int snmp_fd, + http_addr_t *addr, int use_bc); + + +/* + * 'print_device()' - Print a file to a USB device. + */ + +int /* O - Exit status */ +print_device(const char *uri, /* I - Device URI */ + const char *hostname, /* I - Hostname/manufacturer */ + const char *resource, /* I - Resource/modelname */ + char *options, /* I - Device options/serial number */ + int print_fd, /* I - File descriptor to print */ + int copies, /* I - Copies to print */ + int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + int use_bc; /* Use backchannel path? */ + int device_fd; /* USB device */ + ssize_t tbytes; /* Total number of bytes written */ + struct termios opts; /* Parallel port options */ + + + (void)argc; + (void)argv; + + /* + * Open the USB port device... + */ + + fputs("STATE: +connecting-to-device\n", stderr); + + do + { +#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) + /* + * *BSD's ulpt driver currently does not support the + * back-channel, incorrectly returns data ready on a select(), + * and locks up on read()... + */ + + use_bc = 0; + +#elif defined(__sun) + /* + * CUPS STR #3028: Solaris' usbprn driver apparently does not support + * select() or poll(), so we can't support backchannel... + */ + + use_bc = 0; + +#else + /* + * Disable backchannel data when printing to Brother, Canon, or + * Minolta USB printers - apparently these printers will return + * the IEEE-1284 device ID over and over and over when they get + * a read request... + */ + + use_bc = _cups_strcasecmp(hostname, "Brother") && + _cups_strcasecmp(hostname, "Canon") && + _cups_strncasecmp(hostname, "Konica", 6) && + _cups_strncasecmp(hostname, "Minolta", 7); +#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __DragonFly__ */ + + if ((device_fd = open_device(uri, &use_bc)) == -1) + { + if (getenv("CLASS") != NULL) + { + /* + * If the CLASS environment variable is set, the job was submitted + * to a class and not to a specific queue. In this case, we want + * to abort immediately so that the job can be requeued on the next + * available printer in the class. + */ + + _cupsLangPrintFilter(stderr, "INFO", + _("Unable to contact printer, queuing on next " + "printer in class.")); + + /* + * Sleep 5 seconds to keep the job from requeuing too rapidly... + */ + + sleep(5); + + return (CUPS_BACKEND_FAILED); + } + + if (errno == EBUSY) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer busy, will retry in 10 seconds.")); + sleep(10); + } + else if (errno == ENXIO || errno == EIO || errno == ENOENT || + errno == ENODEV) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer not connected, will retry in 30 " + "seconds.")); + sleep(30); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open device file")); + return (CUPS_BACKEND_FAILED); + } + } + } + while (device_fd < 0); + + fputs("STATE: -connecting-to-device\n", stderr); + + /* + * Set any options provided... + */ + + tcgetattr(device_fd, &opts); + + opts.c_lflag &= ~(ICANON | ECHO | ISIG); /* Raw mode */ + + /**** No options supported yet ****/ + + tcsetattr(device_fd, TCSANOW, &opts); + + /* + * Finally, send the print file... + */ + + tbytes = 0; + + while (copies > 0 && tbytes >= 0) + { + copies --; + + if (print_fd != 0) + { + fputs("PAGE: 1 1\n", stderr); + lseek(print_fd, 0, SEEK_SET); + } + +#ifdef __sun + /* + * CUPS STR #3028: Solaris' usbprn driver apparently does not support + * select() or poll(), so we can't support the sidechannel either... + */ + + tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, NULL); + +#else + tbytes = backendRunLoop(print_fd, device_fd, -1, NULL, use_bc, 1, side_cb); +#endif /* __sun */ + + if (print_fd != 0 && tbytes >= 0) + _cupsLangPrintFilter(stderr, "INFO", _("Print file sent.")); + } + + /* + * Close the USB port and return... + */ + + close(device_fd); + + return (CUPS_BACKEND_OK); +} + + +/* + * 'list_devices()' - List all USB devices. + */ + +void +list_devices(void) +{ +#ifdef __linux + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255], /* Device filename */ + device_id[1024], /* Device ID string */ + device_uri[1024], /* Device URI string */ + make_model[1024]; /* Make and model */ + + + /* + * Try to open each USB device... + */ + + for (i = 0; i < 16; i ++) + { + /* + * Linux has a long history of changing the standard filenames used + * for USB printer devices. We get the honor of trying them all... + */ + + sprintf(device, "/dev/usblp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0) + { + if (errno != ENOENT) + continue; + + sprintf(device, "/dev/usb/lp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0) + { + if (errno != ENOENT) + continue; + + sprintf(device, "/dev/usb/usblp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0) + continue; + } + } + + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri))) + cupsBackendReport("direct", device_uri, make_model, make_model, + device_id, NULL); + + close(fd); + } +#elif defined(__sgi) +#elif defined(__sun) && defined(ECPPIOC_GETDEVID) + int i; /* Looping var */ + int fd; /* File descriptor */ + char device[255], /* Device filename */ + device_id[1024], /* Device ID string */ + device_uri[1024], /* Device URI string */ + make_model[1024]; /* Make and model */ + + + /* + * Open each USB device... + */ + + for (i = 0; i < 8; i ++) + { + sprintf(device, "/dev/usb/printer%d", i); + + if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0) + { + if (!backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri))) + cupsBackendReport("direct", device_uri, make_model, make_model, + device_id, NULL); + + close(fd); + } + } +#elif defined(__hpux) +#elif defined(__osf) +#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) + int i; /* Looping var */ + char device[255]; /* Device filename */ + + + for (i = 0; i < 8; i ++) + { + sprintf(device, "/dev/ulpt%d", i); + if (!access(device, 0)) + printf("direct usb:%s \"Unknown\" \"USB Printer #%d\"\n", device, i + 1); + + sprintf(device, "/dev/unlpt%d", i); + if (!access(device, 0)) + printf("direct usb:%s \"Unknown\" \"USB Printer #%d (no reset)\"\n", device, i + 1); + } +#endif +} + + +/* + * 'open_device()' - Open a USB device... + */ + +static int /* O - File descriptor or -1 on error */ +open_device(const char *uri, /* I - Device URI */ + int *use_bc) /* O - Set to 0 for unidirectional */ +{ + int fd; /* File descriptor */ + + + /* + * The generic implementation just treats the URI as a device filename... + * Specific operating systems may also support using the device serial + * number and/or make/model. + */ + + if (!strncmp(uri, "usb:/dev/", 9)) +#ifdef __linux + { + /* + * Do not allow direct devices anymore... + */ + + errno = ENODEV; + return (-1); + } + else if (!strncmp(uri, "usb://", 6)) + { + /* + * For Linux, try looking up the device serial number or model... + */ + + int i; /* Looping var */ + int busy; /* Are any ports busy? */ + char device[255], /* Device filename */ + device_id[1024], /* Device ID string */ + make_model[1024], /* Make and model */ + device_uri[1024]; /* Device URI string */ + + + /* + * Find the correct USB device... + */ + + for (;;) + { + for (busy = 0, i = 0; i < 16; i ++) + { + /* + * Linux has a long history of changing the standard filenames used + * for USB printer devices. We get the honor of trying them all... + */ + + sprintf(device, "/dev/usblp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) + { + sprintf(device, "/dev/usb/lp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) + { + sprintf(device, "/dev/usb/usblp%d", i); + + if ((fd = open(device, O_RDWR | O_EXCL)) < 0 && errno == ENOENT) + continue; + } + } + + if (fd >= 0) + { + backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri)); + } + else + { + /* + * If the open failed because it was busy, flag it so we retry + * as needed... + */ + + if (errno == EBUSY) + busy = 1; + + device_uri[0] = '\0'; + } + + if (!strcmp(uri, device_uri)) + { + /* + * Yes, return this file descriptor... + */ + + fprintf(stderr, "DEBUG: Printer using device file \"%s\"...\n", + device); + + return (fd); + } + + /* + * This wasn't the one... + */ + + if (fd >= 0) + close(fd); + } + + /* + * If we get here and at least one of the printer ports showed up + * as "busy", then sleep for a bit and retry... + */ + + if (busy) + _cupsLangPrintFilter(stderr, "INFO", + _("Printer is busy, will retry in 5 seconds.")); + + sleep(5); + } + } +#elif defined(__sun) && defined(ECPPIOC_GETDEVID) + { + /* + * Do not allow direct devices anymore... + */ + + errno = ENODEV; + return (-1); + } + else if (!strncmp(uri, "usb://", 6)) + { + /* + * For Solaris, try looking up the device serial number or model... + */ + + int i; /* Looping var */ + int busy; /* Are any ports busy? */ + char device[255], /* Device filename */ + device_id[1024], /* Device ID string */ + make_model[1024], /* Make and model */ + device_uri[1024]; /* Device URI string */ + + + /* + * Find the correct USB device... + */ + + do + { + for (i = 0, busy = 0; i < 8; i ++) + { + sprintf(device, "/dev/usb/printer%d", i); + + if ((fd = open(device, O_WRONLY | O_EXCL)) >= 0) + backendGetDeviceID(fd, device_id, sizeof(device_id), + make_model, sizeof(make_model), + "usb", device_uri, sizeof(device_uri)); + else + { + /* + * If the open failed because it was busy, flag it so we retry + * as needed... + */ + + if (errno == EBUSY) + busy = 1; + + device_uri[0] = '\0'; + } + + if (!strcmp(uri, device_uri)) + { + /* + * Yes, return this file descriptor... + */ + + fputs("DEBUG: Setting use_bc to 0!\n", stderr); + + *use_bc = 0; + + return (fd); + } + + /* + * This wasn't the one... + */ + + if (fd >= 0) + close(fd); + } + + /* + * If we get here and at least one of the printer ports showed up + * as "busy", then sleep for a bit and retry... + */ + + if (busy) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printer is busy, will retry in 5 seconds.")); + sleep(5); + } + } + while (busy); + + /* + * Couldn't find the printer, return "no such device or address"... + */ + + errno = ENODEV; + + return (-1); + } +#else + { + if (*use_bc) + fd = open(uri + 4, O_RDWR | O_EXCL); + else + fd = -1; + + if (fd < 0) + { + fd = open(uri + 4, O_WRONLY | O_EXCL); + *use_bc = 0; + } + + return (fd); + } +#endif /* __linux */ + else + { + errno = ENODEV; + return (-1); + } +} + + +/* + * 'side_cb()' - Handle side-channel requests... + */ + +static int /* O - 0 on success, -1 on error */ +side_cb(int print_fd, /* I - Print file */ + int device_fd, /* I - Device file */ + int snmp_fd, /* I - SNMP socket (unused) */ + http_addr_t *addr, /* I - Device address (unused) */ + int use_bc) /* I - Using back-channel? */ +{ + cups_sc_command_t command; /* Request command */ + cups_sc_status_t status; /* Request/response status */ + char data[2048]; /* Request/response data */ + int datalen; /* Request/response data size */ + + + (void)snmp_fd; + (void)addr; + + datalen = sizeof(data); + + if (cupsSideChannelRead(&command, &status, data, &datalen, 1.0)) + return (-1); + + switch (command) + { + case CUPS_SC_CMD_DRAIN_OUTPUT : + if (backendDrainOutput(print_fd, device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else if (tcdrain(device_fd)) + status = CUPS_SC_STATUS_IO_ERROR; + else + status = CUPS_SC_STATUS_OK; + + datalen = 0; + break; + + case CUPS_SC_CMD_GET_BIDI : + status = CUPS_SC_STATUS_OK; + data[0] = use_bc; + datalen = 1; + break; + + case CUPS_SC_CMD_GET_DEVICE_ID : + memset(data, 0, sizeof(data)); + + if (backendGetDeviceID(device_fd, data, sizeof(data) - 1, + NULL, 0, NULL, NULL, 0)) + { + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + } + else + { + status = CUPS_SC_STATUS_OK; + datalen = strlen(data); + } + break; + + default : + status = CUPS_SC_STATUS_NOT_IMPLEMENTED; + datalen = 0; + break; + } + + return (cupsSideChannelWrite(command, status, data, datalen, 1.0)); +} + + +/* + * End of "$Id: usb-unix.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/backend/usb.c b/backend/usb.c new file mode 100644 index 0000000..2cacb74 --- /dev/null +++ b/backend/usb.c @@ -0,0 +1,264 @@ +/* + * "$Id: usb.c 10265 2012-02-12 07:20:10Z mike $" + * + * USB port backend for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * list_devices() - List all available USB devices to stdout. + * print_device() - Print a file to a USB device. + * main() - Send a file to the specified USB port. + */ + +/* + * Include necessary headers. + */ + +#ifdef __APPLE__ + /* A header order dependency requires this be first */ +# include +#endif /* __APPLE__ */ + +#include "backend-private.h" + +#ifdef WIN32 +# include +#else +# include +# include +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +void list_devices(void); +int print_device(const char *uri, const char *hostname, + const char *resource, char *options, + int print_fd, int copies, int argc, char *argv[]); + + +/* + * Include the vendor-specific USB implementation... + */ + +#ifdef HAVE_LIBUSB +# include "usb-libusb.c" +#elif defined(__APPLE__) +# include "usb-darwin.c" +#elif defined(__linux) || defined(__sun) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__FreeBSD_kernel__) +# include "usb-unix.c" +#else +/* + * Use dummy functions that do nothing on unsupported platforms... + * These can be used as templates for implementing USB printing on new + * platforms... + */ + +/* + * 'list_devices()' - List all available USB devices to stdout. + */ + +void +list_devices(void) +{ + /* + * Don't have any devices to list... Use output of the form: + * + * direct usb:/make/model?serial=foo "Make Model" "USB Printer" + * + * Note that "Hewlett Packard" or any other variation MUST be mapped to + * "HP" for compatibility with the PPD and ICC specs. + */ +} + + +/* + * 'print_device()' - Print a file to a USB device. + */ + +int /* O - Exit status */ +print_device(const char *uri, /* I - Device URI */ + const char *hostname, /* I - Hostname/manufacturer */ + const char *resource, /* I - Resource/modelname */ + char *options, /* I - Device options/serial number */ + int print_fd, /* I - File descriptor to print */ + int copies, /* I - Copies to print */ + int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + /* + * Can't print, so just reference the arguments to eliminate compiler + * warnings and return and exit status of 1. Normally you would use the + * arguments to send a file to the printer and return 0 if everything + * worked OK and non-zero if there was an error. + */ + + (void)uri; + (void)hostname; + (void)resource; + (void)options; + (void)print_fd; + (void)copies; + (void)argc; + (void)argv; + + return (CUPS_BACKEND_FAILED); +} +#endif /* HAVE_LIBUSB */ + + +/* + * 'main()' - Send a file to the specified USB port. + * + * Usage: + * + * printer-uri job-id user title copies options [file] + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments (6 or 7) */ + char *argv[]) /* I - Command-line arguments */ +{ + int print_fd; /* Print file */ + int copies; /* Number of copies to print */ + int status; /* Exit status */ + int port; /* Port number (not used) */ + const char *uri; /* Device URI */ + char method[255], /* Method in URI */ + hostname[1024], /* Hostname */ + username[255], /* Username info (not used) */ + resource[1024], /* Resource info (device and options) */ + *options; /* Pointer to options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Check command-line... + */ + + if (argc == 1) + { + list_devices(); + return (CUPS_BACKEND_OK); + } + else if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (CUPS_BACKEND_FAILED); + } + + /* + * Extract the device name and options from the URI... + */ + + uri = cupsBackendDeviceURI(argv); + + if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, + method, sizeof(method), username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)) < HTTP_URI_OK) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("No device URI found in argv[0] or in DEVICE_URI " + "environment variable.")); + return (1); + } + + /* + * See if there are any options... + */ + + if ((options = strchr(resource, '?')) != NULL) + { + /* + * Yup, terminate the device name string and move to the first + * character of the options... + */ + + *options++ = '\0'; + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + { + print_fd = 0; + copies = 1; + } + else + { + /* + * Try to open the print file... + */ + + if ((print_fd = open(argv[6], O_RDONLY)) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (CUPS_BACKEND_FAILED); + } + + copies = atoi(argv[4]); + } + + /* + * Finally, send the print file... + */ + + status = print_device(uri, hostname, resource, options, print_fd, copies, + argc, argv); + + /* + * Close the input file and return... + */ + + if (print_fd != 0) + close(print_fd); + + return (status); +} + + +/* + * End of "$Id: usb.c 10265 2012-02-12 07:20:10Z mike $". + */ diff --git a/berkeley/Dependencies b/berkeley/Dependencies new file mode 100644 index 0000000..9d43cca --- /dev/null +++ b/berkeley/Dependencies @@ -0,0 +1,34 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +lpc.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpc.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpc.o: ../cups/language.h ../cups/string-private.h ../config.h +lpc.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpc.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpc.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpc.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpc.o: ../cups/transcode.h ../cups/thread-private.h +lpq.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpq.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpq.o: ../cups/language.h ../cups/string-private.h ../config.h +lpq.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpq.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpq.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpq.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpq.o: ../cups/transcode.h ../cups/thread-private.h +lpr.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpr.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpr.o: ../cups/language.h ../cups/string-private.h ../config.h +lpr.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpr.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpr.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpr.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpr.o: ../cups/transcode.h ../cups/thread-private.h +lprm.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lprm.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lprm.o: ../cups/language.h ../cups/string-private.h ../config.h +lprm.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lprm.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lprm.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lprm.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lprm.o: ../cups/transcode.h ../cups/thread-private.h diff --git a/berkeley/Makefile b/berkeley/Makefile new file mode 100644 index 0000000..64aa82d --- /dev/null +++ b/berkeley/Makefile @@ -0,0 +1,167 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Berkeley commands makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +TARGETS = lpc lpq lpr lprm +OBJS = lpc.o lpq.o lpr.o lprm.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + echo Installing Berkeley user printing commands in $(BINDIR)... + $(INSTALL_DIR) -m 755 $(BINDIR) + $(INSTALL_BIN) lpq $(BINDIR) + $(INSTALL_BIN) lpr $(BINDIR) + $(INSTALL_BIN) lprm $(BINDIR) + echo Installing Berkeley admin printing commands in $(BINDIR)... + $(INSTALL_DIR) -m 755 $(SBINDIR) + $(INSTALL_BIN) lpc $(SBINDIR) + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all targets... +# + +uninstall: + $(RM) $(BINDIR)/lpq + $(RM) $(BINDIR)/lpr + $(RM) $(BINDIR)/lprm + $(RM) $(SBINDIR)/lpc + -$(RMDIR) $(SBINDIR) + -$(RMDIR) $(BINDIR) + + +# +# lpc +# + +lpc: lpc.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpc lpc.o $(LIBS) + + +# +# lpq +# + +lpq: lpq.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpq lpq.o $(LIBS) + + +# +# lpr +# + +lpr: lpr.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpr lpr.o $(LIBS) + + +# +# lprm +# + +lprm: lprm.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lprm lprm.o $(LIBS) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/berkeley/lpc.c b/berkeley/lpc.c new file mode 100644 index 0000000..0460a8f --- /dev/null +++ b/berkeley/lpc.c @@ -0,0 +1,450 @@ +/* + * "$Id: lpc.c 10379 2012-03-23 22:16:22Z mike $" + * + * "lpc" command for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and commands. + * compare_strings() - Compare two command-line strings. + * do_command() - Do an lpc command... + * show_help() - Show help messages. + * show_status() - Show printers. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static int compare_strings(const char *, const char *, int); +static void do_command(http_t *, const char *, const char *); +static void show_help(const char *); +static void show_status(http_t *, const char *); + + +/* + * 'main()' - Parse options and commands. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + http_t *http; /* Connection to server */ + char line[1024], /* Input line from user */ + *params; /* Pointer to parameters */ + + + _cupsSetLocale(argv); + + /* + * Connect to the scheduler... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (argc > 1) + { + /* + * Process a single command on the command-line... + */ + + do_command(http, argv[1], argv[2]); + } + else + { + /* + * Do the command prompt thing... + */ + + _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no-newline version */ + while (fgets(line, sizeof(line), stdin) != NULL) + { + /* + * Strip trailing whitespace... + */ + + for (params = line + strlen(line) - 1; params >= line;) + if (!isspace(*params & 255)) + break; + else + *params-- = '\0'; + + /* + * Strip leading whitespace... + */ + + for (params = line; isspace(*params & 255); params ++); + + if (params > line) + _cups_strcpy(line, params); + + if (!line[0]) + { + /* + * Nothing left, just show a prompt... + */ + + _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ + continue; + } + + /* + * Find any options in the string... + */ + + for (params = line; *params != '\0'; params ++) + if (isspace(*params & 255)) + break; + + /* + * Remove whitespace between the command and parameters... + */ + + while (isspace(*params & 255)) + *params++ = '\0'; + + /* + * The "quit" and "exit" commands exit; otherwise, process as needed... + */ + + if (!compare_strings(line, "quit", 1) || + !compare_strings(line, "exit", 2)) + break; + + if (*params == '\0') + do_command(http, line, NULL); + else + do_command(http, line, params); + + /* + * Put another prompt out to the user... + */ + + _cupsLangPuts(stdout, _("lpc> ")); /* TODO: Need no newline version */ + } + } + + /* + * Close the connection to the server and return... + */ + + httpClose(http); + + return (0); +} + + +/* + * 'compare_strings()' - Compare two command-line strings. + */ + +static int /* O - -1 or 1 = no match, 0 = match */ +compare_strings(const char *s, /* I - Command-line string */ + const char *t, /* I - Option string */ + int tmin) /* I - Minimum number of unique chars in option */ +{ + int slen; /* Length of command-line string */ + + + slen = strlen(s); + if (slen < tmin) + return (-1); + else + return (strncmp(s, t, slen)); +} + + +/* + * 'do_command()' - Do an lpc command... + */ + +static void +do_command(http_t *http, /* I - HTTP connection to server */ + const char *command, /* I - Command string */ + const char *params) /* I - Parameters for command */ +{ + if (!compare_strings(command, "status", 4)) + show_status(http, params); + else if (!compare_strings(command, "help", 1) || !strcmp(command, "?")) + show_help(params); + else + _cupsLangPrintf(stdout, + _("%s is not implemented by the CUPS version of lpc."), + command); +} + + +/* + * 'show_help()' - Show help messages. + */ + +static void +show_help(const char *command) /* I - Command to describe or NULL */ +{ + if (!command) + { + _cupsLangPrintf(stdout, + _("Commands may be abbreviated. Commands are:\n" + "\n" + "exit help quit status ?")); + } + else if (!compare_strings(command, "help", 1) || !strcmp(command, "?")) + _cupsLangPrintf(stdout, _("help\t\tGet help on commands.")); + else if (!compare_strings(command, "status", 4)) + _cupsLangPrintf(stdout, _("status\t\tShow status of daemon and queue.")); + else + _cupsLangPrintf(stdout, _("?Invalid help command unknown.")); +} + + +/* + * 'show_status()' - Show printers. + */ + +static void +show_status(http_t *http, /* I - HTTP connection to server */ + const char *dests) /* I - Destinations */ +{ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + char *printer, /* Printer name */ + *device, /* Device URI */ + *delimiter; /* Char search result */ + ipp_pstate_t pstate; /* Printer state */ + int accepting; /* Is printer accepting jobs? */ + int jobcount; /* Count of current jobs */ + const char *dptr, /* Pointer into destination list */ + *ptr; /* Pointer into printer name */ + int match; /* Non-zero if this job matches */ + static const char *requested[] = /* Requested attributes */ + { + "device-uri", + "printer-is-accepting-jobs", + "printer-name", + "printer-state", + "queued-job-count" + }; + + + DEBUG_printf(("show_status(http=%p, dests=\"%s\")\n", http, dests)); + + if (http == NULL) + return; + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(requested) / sizeof(requested[0]), + NULL, requested); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + DEBUG_puts("show_status: request succeeded..."); + + /* + * Loop through the printers returned in the list and display + * their status... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + printer = NULL; + device = "file:/dev/null"; + pstate = IPP_PRINTER_IDLE; + jobcount = 0; + accepting = 1; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "device-uri") && + attr->value_tag == IPP_TAG_URI) + device = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-is-accepting-jobs") && + attr->value_tag == IPP_TAG_BOOLEAN) + accepting = attr->values[0].boolean; + else if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-state") && + attr->value_tag == IPP_TAG_ENUM) + pstate = (ipp_pstate_t)attr->values[0].integer; + else if (!strcmp(attr->name, "queued-job-count") && + attr->value_tag == IPP_TAG_INTEGER) + jobcount = attr->values[0].integer; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (printer == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * A single 'all' printer name is special, meaning all printers. + */ + + if (dests != NULL && !strcmp(dests, "all")) + dests = NULL; + + /* + * See if this is a printer we're interested in... + */ + + match = dests == NULL; + + if (dests != NULL) + { + for (dptr = dests; *dptr != '\0';) + { + /* + * Skip leading whitespace and commas... + */ + + while (isspace(*dptr & 255) || *dptr == ',') + dptr ++; + + if (*dptr == '\0') + break; + + /* + * Compare names... + */ + + for (ptr = printer; + *ptr != '\0' && *dptr != '\0' && *ptr == *dptr; + ptr ++, dptr ++) + /* do nothing */; + + if (*ptr == '\0' && (*dptr == '\0' || *dptr == ',' || + isspace(*dptr & 255))) + { + match = 1; + break; + } + + /* + * Skip trailing junk... + */ + + while (!isspace(*dptr & 255) && *dptr != '\0') + dptr ++; + while (isspace(*dptr & 255) || *dptr == ',') + dptr ++; + + if (*dptr == '\0') + break; + } + } + + /* + * Display the printer entry if needed... + */ + + if (match) + { + /* + * Display it... + */ + + printf("%s:\n", printer); + if (!strncmp(device, "file:", 5)) + _cupsLangPrintf(stdout, + _("\tprinter is on device \'%s\' speed -1"), + device + 5); + else + { + /* + * Just show the scheme... + */ + + if ((delimiter = strchr(device, ':')) != NULL ) + { + *delimiter = '\0'; + _cupsLangPrintf(stdout, + _("\tprinter is on device \'%s\' speed -1"), + device); + } + } + + if (accepting) + _cupsLangPuts(stdout, _("\tqueuing is enabled")); + else + _cupsLangPuts(stdout, _("\tqueuing is disabled")); + + if (pstate != IPP_PRINTER_STOPPED) + _cupsLangPuts(stdout, _("\tprinting is enabled")); + else + _cupsLangPuts(stdout, _("\tprinting is disabled")); + + if (jobcount == 0) + _cupsLangPuts(stdout, _("\tno entries")); + else + _cupsLangPrintf(stdout, _("\t%d entries"), jobcount); + + _cupsLangPuts(stdout, _("\tdaemon present")); + } + + if (attr == NULL) + break; + } + + ippDelete(response); + } +} + + +/* + * End of "$Id: lpc.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/berkeley/lpq.c b/berkeley/lpq.c new file mode 100644 index 0000000..1c67395 --- /dev/null +++ b/berkeley/lpq.c @@ -0,0 +1,678 @@ +/* + * "$Id: lpq.c 9744 2011-05-05 23:42:30Z mike $" + * + * "lpq" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and commands. + * show_jobs() - Show jobs. + * show_printer() - Show printer status. + * usage() - Show program usage. + */ + +/* + * Include necessary headers... + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static http_t *connect_server(const char *, http_t *); +static int show_jobs(const char *, http_t *, const char *, + const char *, const int, const int); +static void show_printer(const char *, http_t *, const char *); +static void usage(void); + + +/* + * 'main()' - Parse options and commands. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + http_t *http; /* Connection to server */ + const char *dest, /* Desired printer */ + *user, /* Desired user */ + *val; /* Environment variable name */ + char *instance; /* Printer instance */ + int id, /* Desired job ID */ + all, /* All printers */ + interval, /* Reporting interval */ + longstatus; /* Show file details */ + int num_dests; /* Number of destinations */ + cups_dest_t *dests; /* Destinations */ + + + _cupsSetLocale(argv); + + /* + * Check for command-line options... + */ + + http = NULL; + dest = NULL; + user = NULL; + id = 0; + interval = 0; + longstatus = 0; + all = 0; + num_dests = 0; + dests = NULL; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '+') + interval = atoi(argv[i] + 1); + else if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + + if (http) + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'P' : /* Printer */ + if (argv[i][2]) + dest = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + httpClose(http); + cupsFreeDests(num_dests, dests); + + usage(); + } + + dest = argv[i]; + } + + if ((instance = strchr(dest, '/')) != NULL) + *instance++ = '\0'; + + http = connect_server(argv[0], http); + + if (num_dests == 0) + num_dests = cupsGetDests2(http, &dests); + + if (cupsGetDest(dest, instance, num_dests, dests) == NULL) + { + if (instance) + _cupsLangPrintf(stderr, + _("%s: Error - unknown destination \"%s/%s\"."), + argv[0], dest, instance); + else + _cupsLangPrintf(stderr, _("%s: Unknown destination \"%s\"."), + argv[0], dest); + + return (1); + } + break; + + case 'a' : /* All printers */ + all = 1; + break; + + case 'h' : /* Connect to host */ + if (http) + { + httpClose(http); + http = NULL; + } + + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), argv[0]); + return (1); + } + else + cupsSetServer(argv[i]); + } + break; + + case 'l' : /* Long status */ + longstatus = 1; + break; + + default : + httpClose(http); + cupsFreeDests(num_dests, dests); + + usage(); + break; + } + } + else if (isdigit(argv[i][0] & 255)) + id = atoi(argv[i]); + else + user = argv[i]; + + http = connect_server(argv[0], http); + + if (dest == NULL && !all) + { + if (num_dests == 0) + num_dests = cupsGetDests2(http, &dests); + + for (i = 0; i < num_dests; i ++) + if (dests[i].is_default) + dest = dests[i].name; + + if (dest == NULL) + { + val = NULL; + + if ((dest = getenv("LPDEST")) == NULL) + { + if ((dest = getenv("PRINTER")) != NULL) + { + if (!strcmp(dest, "lp")) + dest = NULL; + else + val = "PRINTER"; + } + } + else + val = "LPDEST"; + + if (dest && !cupsGetDest(dest, NULL, num_dests, dests)) + _cupsLangPrintf(stderr, + _("%s: Error - %s environment variable names " + "non-existent destination \"%s\"."), argv[0], val, + dest); + else + _cupsLangPrintf(stderr, + _("%s: Error - no default destination available."), + argv[0]); + httpClose(http); + cupsFreeDests(num_dests, dests); + return (1); + } + } + + /* + * Show the status in a loop... + */ + + for (;;) + { + if (dest) + show_printer(argv[0], http, dest); + + i = show_jobs(argv[0], http, dest, user, id, longstatus); + + if (i && interval) + { + fflush(stdout); + sleep(interval); + } + else + break; + } + + /* + * Close the connection to the server and return... + */ + + cupsFreeDests(num_dests, dests); + httpClose(http); + + return (0); +} + + +/* + * 'connect_server()' - Connect to the server as necessary... + */ + +static http_t * /* O - New HTTP connection */ +connect_server(const char *command, /* I - Command name */ + http_t *http) /* I - Current HTTP connection */ +{ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), command); + exit(1); + } + } + + return (http); +} + + +/* + * 'show_jobs()' - Show jobs. + */ + +static int /* O - Number of jobs in queue */ +show_jobs(const char *command, /* I - Command name */ + http_t *http, /* I - HTTP connection to server */ + const char *dest, /* I - Destination */ + const char *user, /* I - User */ + const int id, /* I - Job ID */ + const int longstatus) /* I - 1 if long report desired */ +{ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *jobdest, /* Pointer into job-printer-uri */ + *jobuser, /* Pointer to job-originating-user-name */ + *jobname; /* Pointer to job-name */ + ipp_jstate_t jobstate; /* job-state */ + int jobid, /* job-id */ + jobsize, /* job-k-octets */ +#ifdef __osf__ + jobpriority, /* job-priority */ +#endif /* __osf__ */ + jobcount, /* Number of jobs */ + jobcopies, /* Number of copies */ + rank; /* Rank of job */ + char resource[1024]; /* Resource string */ + char rankstr[255]; /* Rank string */ + char namestr[1024]; /* Job name string */ + static const char * const jobattrs[] =/* Job attributes we want to see */ + { + "copies", + "job-id", + "job-k-octets", + "job-name", + "job-originating-user-name", + "job-printer-uri", + "job-priority", + "job-state" + }; + static const char * const ranks[10] = /* Ranking strings */ + { + "th", + "st", + "nd", + "rd", + "th", + "th", + "th", + "th", + "th", + "th" + }; + + + DEBUG_printf(("show_jobs(http=%p, dest=%p, user=%p, id=%d, longstatus%d)\n", + http, dest, user, id, longstatus)); + + if (http == NULL) + return (0); + + /* + * Build an IPP_GET_JOBS or IPP_GET_JOB_ATTRIBUTES request, which requires + * the following attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri or printer-uri + * requested-attributes + */ + + request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS); + + if (id) + { + snprintf(resource, sizeof(resource), "ipp://localhost/jobs/%d", id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", + NULL, resource); + } + else if (dest) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, resource, sizeof(resource), "ipp", + NULL, "localhost", 0, "/printers/%s", dest); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, resource); + } + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/"); + + if (user) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); + } + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(jobattrs) / sizeof(jobattrs[0])), NULL, jobattrs); + + /* + * Do the request and get back a response... + */ + + jobcount = 0; + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + ippDelete(response); + return (0); + } + + rank = 1; + + /* + * Loop through the job list and display them... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_JOB) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + jobid = 0; + jobsize = 0; +#ifdef __osf__ + jobpriority = 50; +#endif /* __osf__ */ + jobstate = IPP_JOB_PENDING; + jobname = "untitled"; + jobuser = NULL; + jobdest = NULL; + jobcopies = 1; + + while (attr != NULL && attr->group_tag == IPP_TAG_JOB) + { + if (!strcmp(attr->name, "job-id") && + attr->value_tag == IPP_TAG_INTEGER) + jobid = attr->values[0].integer; + + if (!strcmp(attr->name, "job-k-octets") && + attr->value_tag == IPP_TAG_INTEGER) + jobsize = attr->values[0].integer; + +#ifdef __osf__ + if (!strcmp(attr->name, "job-priority") && + attr->value_tag == IPP_TAG_INTEGER) + jobpriority = attr->values[0].integer; +#endif /* __osf__ */ + + if (!strcmp(attr->name, "job-state") && + attr->value_tag == IPP_TAG_ENUM) + jobstate = (ipp_jstate_t)attr->values[0].integer; + + if (!strcmp(attr->name, "job-printer-uri") && + attr->value_tag == IPP_TAG_URI) + if ((jobdest = strrchr(attr->values[0].string.text, '/')) != NULL) + jobdest ++; + + if (!strcmp(attr->name, "job-originating-user-name") && + attr->value_tag == IPP_TAG_NAME) + jobuser = attr->values[0].string.text; + + if (!strcmp(attr->name, "job-name") && + attr->value_tag == IPP_TAG_NAME) + jobname = attr->values[0].string.text; + + if (!strcmp(attr->name, "copies") && + attr->value_tag == IPP_TAG_INTEGER) + jobcopies = attr->values[0].integer; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (jobdest == NULL || jobid == 0) + { + if (attr == NULL) + break; + else + continue; + } + + if (!longstatus && jobcount == 0) +#ifdef __osf__ + _cupsLangPuts(stdout, + /* TRANSLATORS: Pri is job priority. */ + _("Rank Owner Pri Job Files" + " Total Size")); +#else + _cupsLangPuts(stdout, + _("Rank Owner Job File(s)" + " Total Size")); +#endif /* __osf__ */ + + jobcount ++; + + /* + * Display the job... + */ + + if (jobstate == IPP_JOB_PROCESSING) + strcpy(rankstr, "active"); + else + { + /* + * Make the rank show the "correct" suffix for each number + * (11-13 are the only special cases, for English anyways...) + */ + + if ((rank % 100) >= 11 && (rank % 100) <= 13) + snprintf(rankstr, sizeof(rankstr), "%dth", rank); + else + snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]); + + rank ++; + } + + if (longstatus) + { + _cupsLangPuts(stdout, "\n"); + + if (jobcopies > 1) + snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies, + jobname); + else + strlcpy(namestr, jobname, sizeof(namestr)); + + _cupsLangPrintf(stdout, _("%s: %-33.33s [job %d localhost]"), + jobuser, rankstr, jobid); + _cupsLangPrintf(stdout, _(" %-39.39s %.0f bytes"), + namestr, 1024.0 * jobsize); + } + else +#ifdef __osf__ + _cupsLangPrintf(stdout, + _("%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"), + rankstr, jobuser, jobpriority, jobid, jobname, + 1024.0 * jobsize); +#else + _cupsLangPrintf(stdout, + _("%-7s %-7.7s %-7d %-31.31s %.0f bytes"), + rankstr, jobuser, jobid, jobname, 1024.0 * jobsize); +#endif /* __osf */ + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + return (0); + } + + if (jobcount == 0) + _cupsLangPuts(stdout, _("no entries")); + + return (jobcount); +} + + +/* + * 'show_printer()' - Show printer status. + */ + +static void +show_printer(const char *command, /* I - Command name */ + http_t *http, /* I - HTTP connection to server */ + const char *dest) /* I - Destination */ +{ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_pstate_t state; /* Printer state */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + + + if (http == NULL) + return; + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + ippDelete(response); + return; + } + + if ((attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM)) != NULL) + state = (ipp_pstate_t)attr->values[0].integer; + else + state = IPP_PRINTER_STOPPED; + + switch (state) + { + case IPP_PRINTER_IDLE : + _cupsLangPrintf(stdout, _("%s is ready"), dest); + break; + case IPP_PRINTER_PROCESSING : + _cupsLangPrintf(stdout, _("%s is ready and printing"), + dest); + break; + case IPP_PRINTER_STOPPED : + _cupsLangPrintf(stdout, _("%s is not ready"), dest); + break; + } + + ippDelete(response); + } + else + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); +} + + +/* + * 'usage()' - Show program usage. + */ + +static void +usage(void) +{ + _cupsLangPuts(stderr, + _("Usage: lpq [-P dest] [-U username] [-h hostname[:port]] " + "[-l] [+interval]")); + exit(1); +} + + +/* + * End of "$Id: lpq.c 9744 2011-05-05 23:42:30Z mike $". + */ diff --git a/berkeley/lpr.c b/berkeley/lpr.c new file mode 100644 index 0000000..34bb329 --- /dev/null +++ b/berkeley/lpr.c @@ -0,0 +1,417 @@ +/* + * "$Id: lpr.c 9636 2011-03-21 22:02:00Z mike $" + * + * "lpr" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and send files for printing. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * 'main()' - Parse options and send files for printing. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j; /* Looping var */ + int job_id; /* Job ID */ + char ch; /* Option character */ + char *printer, /* Destination printer or class */ + *instance; /* Instance */ + const char *title, /* Job title */ + *val; /* Environment variable name */ + int num_copies; /* Number of copies per file */ + int num_files; /* Number of files to print */ + const char *files[1000]; /* Files to print */ + cups_dest_t *dest; /* Selected destination */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + int deletefile; /* Delete file after print? */ + char buffer[8192]; /* Copy buffer */ + + + _cupsSetLocale(argv); + + deletefile = 0; + printer = NULL; + dest = NULL; + num_options = 0; + options = NULL; + num_files = 0; + title = NULL; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + switch (ch = argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'H' : /* Connect to host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-H\" option."), argv[0]); + return (1); + } + else + cupsSetServer(argv[i]); + } + break; + + case '1' : /* TROFF font set 1 */ + case '2' : /* TROFF font set 2 */ + case '3' : /* TROFF font set 3 */ + case '4' : /* TROFF font set 4 */ + case 'i' : /* indent */ + case 'w' : /* width */ + if (argv[i][2] == '\0') + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected value after \"-%c\" " + "option."), argv[0], ch); + return (1); + } + } + + case 'c' : /* CIFPLOT */ + case 'd' : /* DVI */ + case 'f' : /* FORTRAN */ + case 'g' : /* plot */ + case 'n' : /* Ditroff */ + case 't' : /* Troff */ + case 'v' : /* Raster image */ + _cupsLangPrintf(stderr, + _("%s: Warning - \"%c\" format modifier not " + "supported - output may not be correct."), + argv[0], ch); + break; + + case 'o' : /* Option */ + if (argv[i][2] != '\0') + num_options = cupsParseOptions(argv[i] + 2, num_options, &options); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected option=value after " + "\"-o\" option."), argv[0]); + return (1); + } + + num_options = cupsParseOptions(argv[i], num_options, &options); + } + break; + + case 'l' : /* Literal/raw */ + num_options = cupsAddOption("raw", "true", num_options, &options); + break; + + case 'p' : /* Prettyprint */ + num_options = cupsAddOption("prettyprint", "true", num_options, + &options); + break; + + case 'h' : /* Suppress burst page */ + num_options = cupsAddOption("job-sheets", "none", num_options, + &options); + break; + + case 's' : /* Don't use symlinks */ + break; + + case 'm' : /* Mail on completion */ + { + char email[1024]; /* EMail address */ + + + snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(), + httpGetHostname(NULL, buffer, sizeof(buffer))); + num_options = cupsAddOption("notify-recipient-uri", email, + num_options, &options); + } + break; + + case 'q' : /* Queue file but don't print */ + num_options = cupsAddOption("job-hold-until", "indefinite", + num_options, &options); + break; + + case 'r' : /* Remove file after printing */ + deletefile = 1; + break; + + case 'P' : /* Destination printer or class */ + if (argv[i][2] != '\0') + printer = argv[i] + 2; + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected destination after " + "\"-P\" option."), argv[0]); + return (1); + } + + printer = argv[i]; + } + + if ((instance = strrchr(printer, '/')) != NULL) + *instance++ = '\0'; + + if ((dest = cupsGetNamedDest(NULL, printer, instance)) != NULL) + { + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, + options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + break; + + case '#' : /* Number of copies */ + if (argv[i][2] != '\0') + num_copies = atoi(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected copies after " + "\"-#\" option."), argv[0]); + return (1); + } + + num_copies = atoi(argv[i]); + } + + sprintf(buffer, "%d", num_copies); + num_options = cupsAddOption("copies", buffer, num_options, &options); + break; + + case 'C' : /* Class */ + case 'J' : /* Job name */ + case 'T' : /* Title */ + if (argv[i][2] != '\0') + title = argv[i] + 2; + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected name after \"-%c\" " + "option."), argv[0], ch); + return (1); + } + + title = argv[i]; + } + break; + + default : + _cupsLangPrintf(stderr, + _("%s: Error - unknown option \"%c\"."), argv[0], + argv[i][1]); + return (1); + } + else if (num_files < 1000) + { + /* + * Print a file... + */ + + if (access(argv[i], R_OK) != 0) + { + _cupsLangPrintf(stderr, + _("%s: Error - unable to access \"%s\" - %s"), + argv[0], argv[i], strerror(errno)); + return (1); + } + + files[num_files] = argv[i]; + num_files ++; + + if (title == NULL) + { + if ((title = strrchr(argv[i], '/')) != NULL) + title ++; + else + title = argv[i]; + } + } + else + _cupsLangPrintf(stderr, + _("%s: Error - too many files - \"%s\"."), argv[0], + argv[i]); + /* + * See if we have any files to print; if not, print from stdin... + */ + + if (printer == NULL) + { + if ((dest = cupsGetNamedDest(NULL, NULL, NULL)) != NULL) + { + printer = dest->name; + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + } + + if (printer == NULL) + { + val = NULL; + + if ((printer = getenv("LPDEST")) == NULL) + { + if ((printer = getenv("PRINTER")) != NULL) + { + if (!strcmp(printer, "lp")) + printer = NULL; + else + val = "PRINTER"; + } + } + else + val = "LPDEST"; + + if (printer && !cupsGetNamedDest(NULL, printer, NULL)) + _cupsLangPrintf(stderr, + _("%s: Error - %s environment variable names " + "non-existent destination \"%s\"."), argv[0], val, + printer); + else if (cupsLastError() == IPP_NOT_FOUND) + _cupsLangPrintf(stderr, + _("%s: Error - no default destination available."), + argv[0]); + else + _cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."), + argv[0]); + + return (1); + } + + if (num_files > 0) + { + job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options); + + if (deletefile && job_id > 0) + { + /* + * Delete print files after printing... + */ + + for (i = 0; i < num_files; i ++) + unlink(files[i]); + } + } + else if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer, + title ? title : "(stdin)", + num_options, options)) > 0) + { + http_status_t status; /* Write status */ + const char *format; /* Document format */ + ssize_t bytes; /* Bytes read */ + + + if (cupsGetOption("raw", num_options, options)) + format = CUPS_FORMAT_RAW; + else if ((format = cupsGetOption("document-format", num_options, + options)) == NULL) + format = CUPS_FORMAT_AUTO; + + status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id, NULL, + format, 1); + + while (status == HTTP_CONTINUE && + (bytes = read(0, buffer, sizeof(buffer))) > 0) + status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes); + + if (status != HTTP_CONTINUE) + { + _cupsLangPrintf(stderr, _("%s: Error - unable to queue from stdin - %s."), + argv[0], httpStatus(status)); + return (1); + } + + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) + job_id = 0; + } + + if (job_id < 1) + { + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * End of "$Id: lpr.c 9636 2011-03-21 22:02:00Z mike $". + */ diff --git a/berkeley/lprm.c b/berkeley/lprm.c new file mode 100644 index 0000000..6d69a46 --- /dev/null +++ b/berkeley/lprm.c @@ -0,0 +1,217 @@ +/* + * "$Id: lprm.c 9384 2010-11-22 07:06:39Z mike $" + * + * "lprm" command for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and cancel jobs. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * 'main()' - Parse options and cancel jobs. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int job_id; /* Job ID */ + const char *name; /* Destination printer */ + char *instance; /* Pointer to instance name */ + cups_dest_t *dest, /* Destination */ + *defdest; /* Default destination */ + int did_cancel; /* Did we cancel something? */ + + + _cupsSetLocale(argv); + + /* + * Setup to cancel individual print jobs... + */ + + did_cancel = 0; + defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); + name = defdest ? defdest->name : NULL; + + /* + * Process command-line arguments... + */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-' && argv[i][1] != '\0') + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'P' : /* Cancel jobs on a printer */ + if (argv[i][2]) + name = argv[i] + 2; + else + { + i ++; + name = argv[i]; + } + + if ((instance = strchr(name, '/')) != NULL) + *instance = '\0'; + + if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, name, + NULL)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Error - unknown destination \"%s\"."), + argv[0], name); + goto error; + } + + cupsFreeDests(1, dest); + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), argv[0]); + goto error; + } + + cupsSetUser(argv[i]); + } + break; + + case 'h' : /* Connect to host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), argv[0]); + goto error; + } + else + cupsSetServer(argv[i]); + } + + if (defdest) + cupsFreeDests(1, defdest); + + defdest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); + name = defdest ? defdest->name : NULL; + break; + + default : + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), + argv[0], argv[i][1]); + goto error; + } + else + { + /* + * Cancel a job or printer... + */ + + if ((dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, argv[i], NULL)) != NULL) + cupsFreeDests(1, dest); + + if (dest) + { + name = argv[i]; + job_id = 0; + } + else if (isdigit(argv[i][0] & 255)) + { + name = NULL; + job_id = atoi(argv[i]); + } + else if (!strcmp(argv[i], "-")) + { + /* + * Cancel all jobs + */ + + job_id = -1; + } + else + { + _cupsLangPrintf(stderr, _("%s: Error - unknown destination \"%s\"."), + argv[0], argv[i]); + goto error; + } + + if (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) != IPP_OK) + { + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); + goto error; + } + + did_cancel = 1; + } + + /* + * If nothing has been canceled yet, cancel the current job on the specified + * (or default) printer... + */ + + if (!did_cancel && cupsCancelJob2(CUPS_HTTP_DEFAULT, name, 0, 0) != IPP_OK) + { + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); + goto error; + } + + if (defdest) + cupsFreeDests(1, defdest); + + return (0); + + /* + * If we get here there was an error, so clean up... + */ + + error: + + if (defdest) + cupsFreeDests(1, defdest); + + return (1); +} + + +/* + * End of "$Id: lprm.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/cgi-bin/Dependencies b/cgi-bin/Dependencies new file mode 100644 index 0000000..9b7f87e --- /dev/null +++ b/cgi-bin/Dependencies @@ -0,0 +1,84 @@ +# DO NOT DELETE + +help-index.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +help-index.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +help-index.o: ../cups/array.h ../cups/language.h ../cups/array.h help-index.h +help-index.o: ../cups/debug-private.h ../cups/versioning.h +help-index.o: ../cups/language-private.h ../cups/transcode.h +help-index.o: ../cups/string-private.h ../config.h ../cups/dir.h +html.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +html.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +html.o: ../cups/language.h ../cups/array.h help-index.h +html.o: ../cups/debug-private.h ../cups/versioning.h +html.o: ../cups/language-private.h ../cups/transcode.h +html.o: ../cups/string-private.h ../config.h +ipp-var.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +ipp-var.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +ipp-var.o: ../cups/language.h ../cups/array.h help-index.h +ipp-var.o: ../cups/debug-private.h ../cups/versioning.h +ipp-var.o: ../cups/language-private.h ../cups/transcode.h +ipp-var.o: ../cups/string-private.h ../config.h +search.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +search.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +search.o: ../cups/language.h ../cups/array.h help-index.h +search.o: ../cups/debug-private.h ../cups/versioning.h +search.o: ../cups/language-private.h ../cups/transcode.h +search.o: ../cups/string-private.h ../config.h +template.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +template.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +template.o: ../cups/language.h ../cups/array.h help-index.h +template.o: ../cups/debug-private.h ../cups/versioning.h +template.o: ../cups/language-private.h ../cups/transcode.h +template.o: ../cups/string-private.h ../config.h +var.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +var.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +var.o: ../cups/array.h help-index.h ../cups/debug-private.h +var.o: ../cups/versioning.h ../cups/language-private.h ../cups/transcode.h +var.o: ../cups/string-private.h ../config.h ../cups/http.h +var.o: ../cups/md5-private.h +admin.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +admin.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +admin.o: ../cups/language.h ../cups/array.h help-index.h +admin.o: ../cups/debug-private.h ../cups/versioning.h +admin.o: ../cups/language-private.h ../cups/transcode.h +admin.o: ../cups/string-private.h ../config.h ../cups/adminutil.h +admin.o: ../cups/cups.h ../cups/ppd.h +classes.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +classes.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +classes.o: ../cups/language.h ../cups/array.h help-index.h +classes.o: ../cups/debug-private.h ../cups/versioning.h +classes.o: ../cups/language-private.h ../cups/transcode.h +classes.o: ../cups/string-private.h ../config.h +help.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +help.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +help.o: ../cups/language.h ../cups/array.h help-index.h +help.o: ../cups/debug-private.h ../cups/versioning.h +help.o: ../cups/language-private.h ../cups/transcode.h +help.o: ../cups/string-private.h ../config.h +jobs.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +jobs.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +jobs.o: ../cups/language.h ../cups/array.h help-index.h +jobs.o: ../cups/debug-private.h ../cups/versioning.h +jobs.o: ../cups/language-private.h ../cups/transcode.h +jobs.o: ../cups/string-private.h ../config.h +makedocset.o: cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +makedocset.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +makedocset.o: ../cups/array.h help-index.h +printers.o: cgi-private.h cgi.h ../cups/cups.h ../cups/file.h +printers.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +printers.o: ../cups/language.h ../cups/array.h help-index.h +printers.o: ../cups/debug-private.h ../cups/versioning.h +printers.o: ../cups/language-private.h ../cups/transcode.h +printers.o: ../cups/string-private.h ../config.h +testcgi.o: cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +testcgi.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +testcgi.o: ../cups/array.h help-index.h +testhi.o: cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +testhi.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +testhi.o: ../cups/array.h help-index.h +testtemplate.o: cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +testtemplate.o: ../cups/ipp.h ../cups/http.h ../cups/array.h +testtemplate.o: ../cups/language.h ../cups/array.h help-index.h +websearch.o: cgi.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +websearch.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +websearch.o: ../cups/array.h help-index.h diff --git a/cgi-bin/Makefile b/cgi-bin/Makefile new file mode 100644 index 0000000..9f20ff6 --- /dev/null +++ b/cgi-bin/Makefile @@ -0,0 +1,382 @@ +# +# "$Id: Makefile 8983 2010-02-13 02:20:23Z mike $" +# +# CGI makefile for CUPS. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +LIBOBJS = \ + help-index.o \ + html.o \ + ipp-var.o \ + search.o \ + template.o \ + var.o +OBJS = \ + $(LIBOBJS) \ + admin.o \ + classes.o \ + help.o \ + jobs.o \ + makedocset.o \ + printers.o \ + testcgi.o \ + testhi.o \ + testtemplate.o \ + websearch.o +CGIS = \ + admin.cgi \ + classes.cgi \ + help.cgi \ + jobs.cgi \ + printers.cgi +LIBTARGETS = \ + libcupscgi.a \ + $(LIBCUPSCGI) \ + websearch + +UNITTARGETS = \ + testcgi \ + testhi \ + testtemplate + +TARGETS = \ + $(LIBTARGETS) \ + $(CGIS) + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: $(LIBTARGETS) $(UNITTESTS) + + +# +# Make unit tests... +# + +unittests: $(UNITTARGETS) + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) makedocset + $(RM) libcupscgi.so libcupscgi.sl libcupscgi.dylib + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + $(INSTALL_DIR) -m 755 $(SERVERBIN)/cgi-bin + for file in $(CGIS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/cgi-bin; \ + done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(CGIS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + echo Installing header files in $(INCLUDEDIR)/cups... + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + $(INSTALL_DATA) cgi.h $(INCLUDEDIR)/cups + $(INSTALL_DATA) help-index.h $(INCLUDEDIR)/cups + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) + echo Installing libraries in $(LIBDIR)... + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPSCGI) $(LIBDIR) + if test $(LIBCUPSCGI) = "libcupscgi.so.1" -o $(LIBCUPSCGI) = "libcupscgi.sl.1"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \ + $(LN) $(LIBCUPSCGI) $(LIBDIR)/`basename $(LIBCUPSCGI) .1`; \ + fi + if test $(LIBCUPSCGI) = "libcupscgi.1.dylib"; then \ + $(RM) $(LIBDIR)/libcupscgi.dylib; \ + $(LN) $(LIBCUPSCGI) $(LIBDIR)/libcupscgi.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPSCGI) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 libcupscgi.a $(LIBDIR) + $(RANLIB) $(LIBDIR)/libcupscgi.a + $(CHMOD) 555 $(LIBDIR)/libcupscgi.a + + +# +# Uninstall all targets... +# + +uninstall: + for file in $(CGIS); do \ + $(RM) $(SERVERBIN)/cgi-bin/$$file; \ + done + -$(RMDIR) $(SERVERBIN)/cgi-bin + $(RM) $(LIBDIR)/libcupscgi.1.dylib + $(RM) $(LIBDIR)/libcupscgi.a + $(RM) $(LIBDIR)/libcupscgi.dylib + $(RM) $(LIBDIR)/libcupscgi_s.a + $(RM) $(LIBDIR)/libcupscgi.sl + $(RM) $(LIBDIR)/libcupscgi.sl.1 + $(RM) $(LIBDIR)/libcupscgi.so + $(RM) $(LIBDIR)/libcupscgi.so.1 + -$(RMDIR) $(LIBDIR) + $(RM) $(INCLUDEDIR)/cups/cgi.h + $(RM) $(INCLUDEDIR)/cups/help-index.h + -$(RMDIR) $(INCLUDEDIR)/cups + + +# +# Automatic API help files... +# + +apihelp: + mxmldoc --section "Programming" \ + --title "CGI API" \ + --css ../doc/cups-printable.css \ + --header api-cgi.header --intro api-cgi.shtml \ + cgi.h help-index.h $(LIBOBJS:.o=.c) >../doc/help/api-cgi.html + mxmldoc --tokens help/api-cgi.html api-cgi.xml >../doc/help/api-cgi.tokens + $(RM) api-cgi.xml + +framedhelp: + mxmldoc --framed api-cgi \ + --section "Programming" \ + --title "CGI API" \ + --css ../doc/cups-printable.css \ + --header api-cgi.header --intro api-cgi.shtml \ + cgi.h help-index.h $(LIBOBJS:.o=.c) + + +# +# libcupscgi.so.1, libcupscgi.sl.1 +# + +libcupscgi.so.1 libcupscgi.sl.1: $(LIBOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) + $(RM) `basename $@ .1` + $(LN) $@ `basename $@ .1` + + +# +# libcupscgi.1.dylib +# + +libcupscgi.1.dylib: $(LIBOBJS) libcupscgi.exp + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.0.0 \ + -compatibility_version 1.0.0 \ + -exported_symbols_list libcupscgi.exp \ + $(LIBOBJS) $(LIBS) + $(RM) libcupscgi.dylib + $(LN) $@ libcupscgi.dylib + + +# +# libcupscgi_s.a +# + +libcupscgi_s.a: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o libcupscgi_s.o $(LIBOBJS) $(LIBS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcupscgi_s.o + + +# +# libcupscgi.la +# + +libcupscgi.la: $(LIBOBJS) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \ + -version-info 1:0 $(LIBS) + + +# +# libcupscgi.a +# + +libcupscgi.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# admin.cgi +# + +admin.cgi: admin.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ admin.o -lcupscgi $(LIBS) + + +# +# classes.cgi +# + +classes.cgi: classes.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ classes.o -lcupscgi $(LIBS) + + +# +# help.cgi +# + +help.cgi: help.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ help.o -lcupscgi $(LIBS) + + +# +# jobs.cgi +# + +jobs.cgi: jobs.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ jobs.o -lcupscgi $(LIBS) + + +# +# makedocset +# + +makedocset: makedocset.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ makedocset.o libcupscgi.a \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \ + $(LIBZ) $(LIBGSSAPI) + + +# +# printers.cgi +# + +printers.cgi: printers.o ../Makedefs ../cups/$(LIBCUPS) $(LIBCUPSCGI) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ printers.o -L. -lcupscgi $(LIBS) + + +# +# testcgi +# + +testcgi: testcgi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcgi.o libcupscgi.a \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \ + $(LIBZ) $(LIBGSSAPI) + echo Testing CGI API... + ./testcgi + + +# +# testhi +# + +testhi: testhi.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhi.o libcupscgi.a \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \ + $(LIBZ) $(LIBGSSAPI) + echo Testing help index API... + ./testhi + + +# +# testtemplate +# + +testtemplate: testtemplate.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testtemplate.o libcupscgi.a ../cups/$(LIBCUPSSTATIC) \ + $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ) $(LIBGSSAPI) + + +# +# websearch +# + +websearch: websearch.o ../Makedefs libcupscgi.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ websearch.o libcupscgi.a \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(SSLLIBS) $(DNSSDLIBS) \ + $(LIBZ) $(LIBGSSAPI) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 8983 2010-02-13 02:20:23Z mike $". +# diff --git a/cgi-bin/admin.c b/cgi-bin/admin.c new file mode 100644 index 0000000..11de6b1 --- /dev/null +++ b/cgi-bin/admin.c @@ -0,0 +1,4341 @@ +/* + * "$Id: admin.c 9901 2011-08-17 21:01:53Z mike $" + * + * Administration CGI for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for CGI. + * choose_device_cb() - Add a device to the device selection page. + * do_add_rss_subscription() - Add a RSS subscription. + * do_am_class() - Add or modify a class. + * do_am_printer() - Add or modify a printer. + * do_cancel_subscription() - Cancel a subscription. + * do_config_server() - Configure server settings. + * do_delete_class() - Delete a class. + * do_delete_printer() - Delete a printer. + * do_export() - Export printers to Samba. + * do_list_printers() - List available printers. + * do_menu() - Show the main menu. + * do_set_allowed_users() - Set the allowed/denied users for a queue. + * do_set_default() - Set the server default printer/class. + * do_set_options() - Configure the default options for a queue. + * do_set_sharing() - Set printer-is-shared value. + * get_option_value() - Return the value of an option. + * get_points() - Get a value in points. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" +#include +#include +#include +#include +#include +#include +#include + + +/* + * Local globals... + */ + +static int current_device = 0; /* Current device shown */ + + +/* + * Local functions... + */ + +static void choose_device_cb(const char *device_class, + const char *device_id, const char *device_info, + const char *device_make_and_model, + const char *device_uri, + const char *device_location, + const char *title); +static void do_add_rss_subscription(http_t *http); +static void do_am_class(http_t *http, int modify); +static void do_am_printer(http_t *http, int modify); +static void do_cancel_subscription(http_t *http); +static void do_config_server(http_t *http); +static void do_delete_class(http_t *http); +static void do_delete_printer(http_t *http); +static void do_export(http_t *http); +static void do_list_printers(http_t *http); +static void do_menu(http_t *http); +static void do_set_allowed_users(http_t *http); +static void do_set_default(http_t *http); +static void do_set_options(http_t *http, int is_class); +static void do_set_sharing(http_t *http); +static char *get_option_value(ppd_file_t *ppd, const char *name, + char *buffer, size_t bufsize); +static double get_points(double number, const char *uval); + + +/* + * 'main()' - Main entry for CGI. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + http_t *http; /* Connection to the server */ + const char *op; /* Operation name */ + + + /* + * Connect to the HTTP server... + */ + + fputs("DEBUG: admin.cgi started...\n", stderr); + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (!http) + { + perror("ERROR: Unable to connect to cupsd"); + fprintf(stderr, "DEBUG: cupsServer()=\"%s\"\n", + cupsServer() ? cupsServer() : "(null)"); + fprintf(stderr, "DEBUG: ippPort()=%d\n", ippPort()); + fprintf(stderr, "DEBUG: cupsEncryption()=%d\n", cupsEncryption()); + exit(1); + } + + fprintf(stderr, "DEBUG: http=%p\n", http); + + /* + * Set the web interface section... + */ + + cgiSetVariable("SECTION", "admin"); + cgiSetVariable("REFRESH_PAGE", ""); + + /* + * See if we have form data... + */ + + if (!cgiInitialize() || !cgiGetVariable("OP")) + { + /* + * Nope, send the administration menu... + */ + + fputs("DEBUG: No form data, showing main menu...\n", stderr); + + do_menu(http); + } + else if ((op = cgiGetVariable("OP")) != NULL && cgiIsPOST()) + { + /* + * Do the operation... + */ + + fprintf(stderr, "DEBUG: op=\"%s\"...\n", op); + + if (!*op) + { + const char *printer = getenv("PRINTER_NAME"), + /* Printer or class name */ + *server_port = getenv("SERVER_PORT"); + /* Port number string */ + int port = atoi(server_port ? server_port : "0"); + /* Port number */ + char uri[1024]; /* URL */ + + if (printer) + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), + getenv("HTTPS") ? "https" : "http", NULL, + getenv("SERVER_NAME"), port, "/%s/%s", + cgiGetVariable("IS_CLASS") ? "classes" : "printers", + printer); + else + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), + getenv("HTTPS") ? "https" : "http", NULL, + getenv("SERVER_NAME"), port, "/admin"); + + printf("Location: %s\n\n", uri); + } + else if (!strcmp(op, "set-allowed-users")) + do_set_allowed_users(http); + else if (!strcmp(op, "set-as-default")) + do_set_default(http); + else if (!strcmp(op, "set-sharing")) + do_set_sharing(http); + else if (!strcmp(op, "find-new-printers") || + !strcmp(op, "list-available-printers")) + do_list_printers(http); + else if (!strcmp(op, "add-class")) + do_am_class(http, 0); + else if (!strcmp(op, "add-printer")) + do_am_printer(http, 0); + else if (!strcmp(op, "modify-class")) + do_am_class(http, 1); + else if (!strcmp(op, "modify-printer")) + do_am_printer(http, 1); + else if (!strcmp(op, "delete-class")) + do_delete_class(http); + else if (!strcmp(op, "delete-printer")) + do_delete_printer(http); + else if (!strcmp(op, "set-class-options")) + do_set_options(http, 1); + else if (!strcmp(op, "set-printer-options")) + do_set_options(http, 0); + else if (!strcmp(op, "config-server")) + do_config_server(http); + else if (!strcmp(op, "export-samba")) + do_export(http); + else if (!strcmp(op, "add-rss-subscription")) + do_add_rss_subscription(http); + else if (!strcmp(op, "cancel-subscription")) + do_cancel_subscription(http); + else + { + /* + * Bad operation code - display an error... + */ + + cgiStartHTML(cgiText(_("Administration"))); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + } + else if (op && !strcmp(op, "redirect")) + { + const char *url; /* Redirection URL... */ + char prefix[1024]; /* URL prefix */ + + + if (getenv("HTTPS")) + snprintf(prefix, sizeof(prefix), "https://%s:%s", + getenv("SERVER_NAME"), getenv("SERVER_PORT")); + else + snprintf(prefix, sizeof(prefix), "http://%s:%s", + getenv("SERVER_NAME"), getenv("SERVER_PORT")); + + fprintf(stderr, "DEBUG: redirecting with prefix %s!\n", prefix); + + if ((url = cgiGetVariable("URL")) != NULL) + { + char encoded[1024], /* Encoded URL string */ + *ptr; /* Pointer into encoded string */ + + + ptr = encoded; + if (*url != '/') + *ptr++ = '/'; + + for (; *url && ptr < (encoded + sizeof(encoded) - 4); url ++) + { + if (strchr("%@&+ <>#=", *url) || *url < ' ' || *url & 128) + { + /* + * Percent-encode this character; safe because we have at least 4 + * bytes left in the array... + */ + + sprintf(ptr, "%%%02X", *url & 255); + ptr += 3; + } + else + *ptr++ = *url; + } + + *ptr = '\0'; + + if (*url) + { + /* + * URL was too long, just redirect to the admin page... + */ + + printf("Location: %s/admin\n\n", prefix); + } + else + { + /* + * URL is OK, redirect there... + */ + + printf("Location: %s%s\n\n", prefix, encoded); + } + } + else + printf("Location: %s/admin\n\n", prefix); + } + else + { + /* + * Form data but no operation code - display an error... + */ + + cgiStartHTML(cgiText(_("Administration"))); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + + /* + * Close the HTTP server connection... + */ + + httpClose(http); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'choose_device_cb()' - Add a device to the device selection page. + */ + +static void +choose_device_cb( + const char *device_class, /* I - Class */ + const char *device_id, /* I - 1284 device ID */ + const char *device_info, /* I - Description */ + const char *device_make_and_model, /* I - Make and model */ + const char *device_uri, /* I - Device URI */ + const char *device_location, /* I - Location */ + const char *title) /* I - Page title */ +{ + /* + * For modern browsers, start a multi-part page so we can show that something + * is happening. Non-modern browsers just get everything at the end... + */ + + if (current_device == 0 && cgiSupportsMultipart()) + { + cgiStartMultipart(); + cgiStartHTML(title); + cgiCopyTemplateLang("choose-device.tmpl"); + cgiEndHTML(); + fflush(stdout); + } + + + /* + * Add the device to the array... + */ + + cgiSetArray("device_class", current_device, device_class); + cgiSetArray("device_id", current_device, device_id); + cgiSetArray("device_info", current_device, device_info); + cgiSetArray("device_make_and_model", current_device, device_make_and_model); + cgiSetArray("device_uri", current_device, device_uri); + cgiSetArray("device_location", current_device, device_location); + + current_device ++; +} + + +/* + * 'do_add_rss_subscription()' - Add a RSS subscription. + */ + +static void +do_add_rss_subscription(http_t *http) /* I - HTTP connection */ +{ + ipp_t *request, /* IPP request data */ + *response; /* IPP response data */ + char rss_uri[1024]; /* RSS notify-recipient URI */ + int num_events; /* Number of events */ + const char *events[12], /* Subscribed events */ + *subscription_name, /* Subscription name */ + *printer_uri, /* Printer URI */ + *ptr, /* Pointer into name */ + *user; /* Username */ + int max_events; /* Maximum number of events */ + + + /* + * See if we have all of the required information... + */ + + subscription_name = cgiGetVariable("SUBSCRIPTION_NAME"); + printer_uri = cgiGetVariable("PRINTER_URI"); + num_events = 0; + + if (cgiGetVariable("EVENT_JOB_CREATED")) + events[num_events ++] = "job-created"; + if (cgiGetVariable("EVENT_JOB_COMPLETED")) + events[num_events ++] = "job-completed"; + if (cgiGetVariable("EVENT_JOB_STOPPED")) + events[num_events ++] = "job-stopped"; + if (cgiGetVariable("EVENT_JOB_CONFIG_CHANGED")) + events[num_events ++] = "job-config-changed"; + if (cgiGetVariable("EVENT_PRINTER_STOPPED")) + events[num_events ++] = "printer-stopped"; + if (cgiGetVariable("EVENT_PRINTER_ADDED")) + events[num_events ++] = "printer-added"; + if (cgiGetVariable("EVENT_PRINTER_MODIFIED")) + events[num_events ++] = "printer-modified"; + if (cgiGetVariable("EVENT_PRINTER_DELETED")) + events[num_events ++] = "printer-deleted"; + if (cgiGetVariable("EVENT_SERVER_STARTED")) + events[num_events ++] = "server-started"; + if (cgiGetVariable("EVENT_SERVER_STOPPED")) + events[num_events ++] = "server-stopped"; + if (cgiGetVariable("EVENT_SERVER_RESTARTED")) + events[num_events ++] = "server-restarted"; + if (cgiGetVariable("EVENT_SERVER_AUDIT")) + events[num_events ++] = "server-audit"; + + if ((ptr = cgiGetVariable("MAX_EVENTS")) != NULL) + max_events = atoi(ptr); + else + max_events = 0; + + if (!subscription_name || !printer_uri || !num_events || + max_events <= 0 || max_events > 9999) + { + /* + * Don't have everything we need, so get the available printers + * and classes and (re)show the add page... + */ + + if (cgiGetVariable("EVENT_JOB_CREATED")) + cgiSetVariable("EVENT_JOB_CREATED", "CHECKED"); + if (cgiGetVariable("EVENT_JOB_COMPLETED")) + cgiSetVariable("EVENT_JOB_COMPLETED", "CHECKED"); + if (cgiGetVariable("EVENT_JOB_STOPPED")) + cgiSetVariable("EVENT_JOB_STOPPED", "CHECKED"); + if (cgiGetVariable("EVENT_JOB_CONFIG_CHANGED")) + cgiSetVariable("EVENT_JOB_CONFIG_CHANGED", "CHECKED"); + if (cgiGetVariable("EVENT_PRINTER_STOPPED")) + cgiSetVariable("EVENT_PRINTER_STOPPED", "CHECKED"); + if (cgiGetVariable("EVENT_PRINTER_ADDED")) + cgiSetVariable("EVENT_PRINTER_ADDED", "CHECKED"); + if (cgiGetVariable("EVENT_PRINTER_MODIFIED")) + cgiSetVariable("EVENT_PRINTER_MODIFIED", "CHECKED"); + if (cgiGetVariable("EVENT_PRINTER_DELETED")) + cgiSetVariable("EVENT_PRINTER_DELETED", "CHECKED"); + if (cgiGetVariable("EVENT_SERVER_STARTED")) + cgiSetVariable("EVENT_SERVER_STARTED", "CHECKED"); + if (cgiGetVariable("EVENT_SERVER_STOPPED")) + cgiSetVariable("EVENT_SERVER_STOPPED", "CHECKED"); + if (cgiGetVariable("EVENT_SERVER_RESTARTED")) + cgiSetVariable("EVENT_SERVER_RESTARTED", "CHECKED"); + if (cgiGetVariable("EVENT_SERVER_AUDIT")) + cgiSetVariable("EVENT_SERVER_AUDIT", "CHECKED"); + + request = ippNewRequest(CUPS_GET_PRINTERS); + response = cupsDoRequest(http, request, "/"); + + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + ippDelete(response); + + cgiStartHTML(cgiText(_("Add RSS Subscription"))); + + cgiCopyTemplateLang("add-rss-subscription.tmpl"); + + cgiEndHTML(); + return; + } + + /* + * Make sure we have a username... + */ + + if ((user = getenv("REMOTE_USER")) == NULL) + { + puts("Status: 401\n"); + exit(0); + } + + /* + * Validate the subscription name... + */ + + for (ptr = subscription_name; *ptr; ptr ++) + if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || + *ptr == '?' || *ptr == '#') + break; + + if (*ptr) + { + cgiSetVariable("ERROR", + cgiText(_("The subscription name may not " + "contain spaces, slashes (/), question marks (?), " + "or the pound sign (#)."))); + cgiStartHTML(_("Add RSS Subscription")); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Add the subscription... + */ + + ptr = subscription_name + strlen(subscription_name) - 4; + if (ptr < subscription_name || strcmp(ptr, ".rss")) + httpAssembleURIf(HTTP_URI_CODING_ALL, rss_uri, sizeof(rss_uri), "rss", + NULL, NULL, 0, "/%s.rss?max_events=%d", subscription_name, + max_events); + else + httpAssembleURIf(HTTP_URI_CODING_ALL, rss_uri, sizeof(rss_uri), "rss", + NULL, NULL, 0, "/%s?max_events=%d", subscription_name, + max_events); + + request = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION); + + if (!_cups_strcasecmp(printer_uri, "#ALL#")) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/"); + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, printer_uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, user); + + ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, + "notify-recipient-uri", NULL, rss_uri); + ippAddStrings(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, "notify-events", + num_events, NULL, events); + ippAddInteger(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-lease-duration", 0); + + ippDelete(cupsDoRequest(http, request, "/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(_("Add RSS Subscription")); + cgiShowIPPError(_("Unable to add RSS subscription:")); + } + else + { + /* + * Redirect successful updates back to the admin page... + */ + + cgiSetVariable("refresh_page", "5;URL=/admin"); + cgiStartHTML(_("Add RSS Subscription")); + cgiCopyTemplateLang("subscription-added.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'do_am_class()' - Add or modify a class. + */ + +static void +do_am_class(http_t *http, /* I - HTTP connection */ + int modify) /* I - Modify the printer? */ +{ + int i, j; /* Looping vars */ + int element; /* Element number */ + int num_printers; /* Number of printers */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* member-uris attribute */ + char uri[HTTP_MAX_URI]; /* Device or printer URI */ + const char *name, /* Pointer to class name */ + *op, /* Operation name */ + *ptr; /* Pointer to CGI variable */ + const char *title; /* Title of page */ + static const char * const pattrs[] = /* Requested printer attributes */ + { + "member-names", + "printer-info", + "printer-location" + }; + + + title = cgiText(modify ? _("Modify Class") : _("Add Class")); + op = cgiGetVariable("OP"); + name = cgiGetVariable("PRINTER_NAME"); + + if (cgiGetVariable("PRINTER_LOCATION") == NULL) + { + /* + * Build a CUPS_GET_PRINTERS request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", + CUPS_PRINTER_LOCAL); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", + CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | + CUPS_PRINTER_IMPLICIT); + + /* + * Do the request and get back a response... + */ + + cgiClearVariables(); + if (op) + cgiSetVariable("OP", op); + if (name) + cgiSetVariable("PRINTER_NAME", name); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Create MEMBER_URIS and MEMBER_NAMES arrays... + */ + + for (element = 0, attr = response->attrs; + attr != NULL; + attr = attr->next) + if (attr->name && !strcmp(attr->name, "printer-uri-supported")) + { + if ((ptr = strrchr(attr->values[0].string.text, '/')) != NULL && + (!name || _cups_strcasecmp(name, ptr + 1))) + { + /* + * Don't show the current class... + */ + + cgiSetArray("MEMBER_URIS", element, attr->values[0].string.text); + element ++; + } + } + + for (element = 0, attr = response->attrs; + attr != NULL; + attr = attr->next) + if (attr->name && !strcmp(attr->name, "printer-name")) + { + if (!name || _cups_strcasecmp(name, attr->values[0].string.text)) + { + /* + * Don't show the current class... + */ + + cgiSetArray("MEMBER_NAMES", element, attr->values[0].string.text); + element ++; + } + } + + num_printers = cgiGetSize("MEMBER_URIS"); + + ippDelete(response); + } + else + num_printers = 0; + + if (modify) + { + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", name); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(pattrs) / sizeof(pattrs[0])), + NULL, pattrs); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "member-names", + IPP_TAG_NAME)) != NULL) + { + /* + * Mark any current members in the class... + */ + + for (j = 0; j < num_printers; j ++) + cgiSetArray("MEMBER_SELECTED", j, ""); + + for (i = 0; i < attr->num_values; i ++) + { + for (j = 0; j < num_printers; j ++) + { + if (!_cups_strcasecmp(attr->values[i].string.text, + cgiGetArray("MEMBER_NAMES", j))) + { + cgiSetArray("MEMBER_SELECTED", j, "SELECTED"); + break; + } + } + } + } + + if ((attr = ippFindAttribute(response, "printer-info", + IPP_TAG_TEXT)) != NULL) + cgiSetVariable("PRINTER_INFO", attr->values[0].string.text); + + if ((attr = ippFindAttribute(response, "printer-location", + IPP_TAG_TEXT)) != NULL) + cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text); + + ippDelete(response); + } + + /* + * Update the location and description of an existing printer... + */ + + cgiStartHTML(title); + cgiCopyTemplateLang("modify-class.tmpl"); + } + else + { + /* + * Get the name, location, and description for a new printer... + */ + + cgiStartHTML(title); + cgiCopyTemplateLang("add-class.tmpl"); + } + + cgiEndHTML(); + + return; + } + + if (!name) + { + cgiStartHTML(title); + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + for (ptr = name; *ptr; ptr ++) + if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '#') + break; + + if (*ptr || ptr == name || strlen(name) > 127) + { + cgiSetVariable("ERROR", + cgiText(_("The class name may only contain up to " + "127 printable characters and may not " + "contain spaces, slashes (/), or the " + "pound sign (#)."))); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Build a CUPS_ADD_CLASS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * printer-location + * printer-info + * printer-is-accepting-jobs + * printer-state + * member-uris + */ + + request = ippNewRequest(CUPS_ADD_CLASS); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", name); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", + NULL, cgiGetVariable("PRINTER_LOCATION")); + + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", + NULL, cgiGetVariable("PRINTER_INFO")); + + ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); + + ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", + IPP_PRINTER_IDLE); + + if ((num_printers = cgiGetSize("MEMBER_URIS")) > 0) + { + attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", + num_printers, NULL, NULL); + for (i = 0; i < num_printers; i ++) + attr->values[i].string.text = _cupsStrAlloc(cgiGetArray("MEMBER_URIS", i)); + } + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(modify ? _("Unable to modify class:") : + _("Unable to add class:")); + } + else + { + /* + * Redirect successful updates back to the class page... + */ + + char refresh[1024]; /* Refresh URL */ + + cgiFormEncode(uri, name, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=/classes/%s", + uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + + if (modify) + cgiCopyTemplateLang("class-modified.tmpl"); + else + cgiCopyTemplateLang("class-added.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'do_am_printer()' - Add or modify a printer. + */ + +static void +do_am_printer(http_t *http, /* I - HTTP connection */ + int modify) /* I - Modify the printer? */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_t *request, /* IPP request */ + *response, /* IPP response */ + *oldinfo; /* Old printer information */ + const cgi_file_t *file; /* Uploaded file, if any */ + const char *var; /* CGI variable */ + char uri[HTTP_MAX_URI], /* Device or printer URI */ + *uriptr; /* Pointer into URI */ + int maxrate; /* Maximum baud rate */ + char baudrate[255]; /* Baud rate string */ + const char *name, /* Pointer to class name */ + *ptr; /* Pointer to CGI variable */ + const char *title; /* Title of page */ + static int baudrates[] = /* Baud rates */ + { + 1200, + 2400, + 4800, + 9600, + 19200, + 38400, + 57600, + 115200, + 230400, + 460800 + }; + + + ptr = cgiGetVariable("DEVICE_URI"); + fprintf(stderr, "DEBUG: do_am_printer: DEVICE_URI=\"%s\"\n", + ptr ? ptr : "(null)"); + + title = cgiText(modify ? _("Modify Printer") : _("Add Printer")); + + if (modify) + { + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", + cgiGetVariable("PRINTER_NAME")); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + oldinfo = cupsDoRequest(http, request, "/"); + } + else + oldinfo = NULL; + + file = cgiGetFile(); + + if (file) + { + fprintf(stderr, "DEBUG: file->tempfile=%s\n", file->tempfile); + fprintf(stderr, "DEBUG: file->name=%s\n", file->name); + fprintf(stderr, "DEBUG: file->filename=%s\n", file->filename); + fprintf(stderr, "DEBUG: file->mimetype=%s\n", file->mimetype); + } + + if ((name = cgiGetVariable("PRINTER_NAME")) != NULL) + { + for (ptr = name; *ptr; ptr ++) + if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '#') + break; + + if (*ptr || ptr == name || strlen(name) > 127) + { + cgiSetVariable("ERROR", + cgiText(_("The printer name may only contain up to " + "127 printable characters and may not " + "contain spaces, slashes (/), or the " + "pound sign (#)."))); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + } + + if ((var = cgiGetVariable("DEVICE_URI")) != NULL) + { + if ((uriptr = strrchr(var, '|')) != NULL) + { + /* + * Extract make and make/model from device URI string... + */ + + char make[1024], /* Make string */ + *makeptr; /* Pointer into make */ + + + *uriptr++ = '\0'; + + strlcpy(make, uriptr, sizeof(make)); + + if ((makeptr = strchr(make, ' ')) != NULL) + *makeptr = '\0'; + else if ((makeptr = strchr(make, '-')) != NULL) + *makeptr = '\0'; + else if (!_cups_strncasecmp(make, "laserjet", 8) || + !_cups_strncasecmp(make, "deskjet", 7) || + !_cups_strncasecmp(make, "designjet", 9)) + strcpy(make, "HP"); + else if (!_cups_strncasecmp(make, "phaser", 6)) + strcpy(make, "Xerox"); + else if (!_cups_strncasecmp(make, "stylus", 6)) + strcpy(make, "Epson"); + else + strcpy(make, "Generic"); + + if (!cgiGetVariable("CURRENT_MAKE")) + cgiSetVariable("CURRENT_MAKE", make); + + if (!cgiGetVariable("CURRENT_MAKE_AND_MODEL")) + cgiSetVariable("CURRENT_MAKE_AND_MODEL", uriptr); + + if (!modify) + { + char template[128], /* Template name */ + *tptr; /* Pointer into template name */ + + cgiSetVariable("PRINTER_INFO", uriptr); + + for (tptr = template; + tptr < (template + sizeof(template) - 1) && *uriptr; + uriptr ++) + if (isalnum(*uriptr & 255) || *uriptr == '_' || *uriptr == '-' || + *uriptr == '.') + *tptr++ = *uriptr; + else if ((*uriptr == ' ' || *uriptr == '/') && tptr > template && + tptr[-1] != '_') + *tptr++ = '_'; + else if (*uriptr == '?' || *uriptr == '(') + break; + + *tptr = '\0'; + + cgiSetVariable("TEMPLATE_NAME", template); + } + } + } + + if (!var) + { + /* + * Look for devices so the user can pick something... + */ + + if ((attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL) + { + strlcpy(uri, attr->values[0].string.text, sizeof(uri)); + if ((uriptr = strchr(uri, ':')) != NULL && strncmp(uriptr, "://", 3) == 0) + *uriptr = '\0'; + + cgiSetVariable("CURRENT_DEVICE_URI", attr->values[0].string.text); + cgiSetVariable("CURRENT_DEVICE_SCHEME", uri); + } + + /* + * Scan for devices for up to 30 seconds... + */ + + fputs("DEBUG: Getting list of devices...\n", stderr); + + current_device = 0; + if (cupsGetDevices(http, 5, CUPS_INCLUDE_ALL, CUPS_EXCLUDE_NONE, + (cups_device_cb_t)choose_device_cb, + (void *)title) == IPP_OK) + { + fputs("DEBUG: Got device list!\n", stderr); + + if (cgiSupportsMultipart()) + cgiStartMultipart(); + + cgiSetVariable("CUPS_GET_DEVICES_DONE", "1"); + cgiStartHTML(title); + cgiCopyTemplateLang("choose-device.tmpl"); + cgiEndHTML(); + + if (cgiSupportsMultipart()) + cgiEndMultipart(); + } + else + { + fprintf(stderr, + "ERROR: CUPS-Get-Devices request failed with status %x: %s\n", + cupsLastError(), cupsLastErrorString()); + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else + { + cgiStartHTML(title); + cgiShowIPPError(modify ? _("Unable to modify printer:") : + _("Unable to add printer:")); + cgiEndHTML(); + return; + } + } + } + else if (!strchr(var, '/') || + (!strncmp(var, "lpd://", 6) && !strchr(var + 6, '/'))) + { + if ((attr = ippFindAttribute(oldinfo, "device-uri", IPP_TAG_URI)) != NULL) + { + /* + * Set the current device URI for the form to the old one... + */ + + if (strncmp(attr->values[0].string.text, var, strlen(var)) == 0) + cgiSetVariable("CURRENT_DEVICE_URI", attr->values[0].string.text); + } + + /* + * User needs to set the full URI... + */ + + cgiStartHTML(title); + cgiCopyTemplateLang("choose-uri.tmpl"); + cgiEndHTML(); + } + else if (!strncmp(var, "serial:", 7) && !cgiGetVariable("BAUDRATE")) + { + /* + * Need baud rate, parity, etc. + */ + + if ((var = strchr(var, '?')) != NULL && + strncmp(var, "?baud=", 6) == 0) + maxrate = atoi(var + 6); + else + maxrate = 19200; + + for (i = 0; i < 10; i ++) + if (baudrates[i] > maxrate) + break; + else + { + sprintf(baudrate, "%d", baudrates[i]); + cgiSetArray("BAUDRATES", i, baudrate); + } + + cgiStartHTML(title); + cgiCopyTemplateLang("choose-serial.tmpl"); + cgiEndHTML(); + } + else if (!name || !cgiGetVariable("PRINTER_LOCATION")) + { + cgiStartHTML(title); + + if (modify) + { + /* + * Update the location and description of an existing printer... + */ + + if (oldinfo) + { + if ((attr = ippFindAttribute(oldinfo, "printer-info", + IPP_TAG_TEXT)) != NULL) + cgiSetVariable("PRINTER_INFO", attr->values[0].string.text); + + if ((attr = ippFindAttribute(oldinfo, "printer-location", + IPP_TAG_TEXT)) != NULL) + cgiSetVariable("PRINTER_LOCATION", attr->values[0].string.text); + + if ((attr = ippFindAttribute(oldinfo, "printer-is-shared", + IPP_TAG_BOOLEAN)) != NULL) + cgiSetVariable("PRINTER_IS_SHARED", + attr->values[0].boolean ? "1" : "0"); + } + + cgiCopyTemplateLang("modify-printer.tmpl"); + } + else + { + /* + * Get the name, location, and description for a new printer... + */ + +#ifdef __APPLE__ + if (!strncmp(var, "usb:", 4)) + cgiSetVariable("printer_is_shared", "1"); + else +#endif /* __APPLE__ */ + cgiSetVariable("printer_is_shared", "0"); + + cgiCopyTemplateLang("add-printer.tmpl"); + } + + cgiEndHTML(); + + if (oldinfo) + ippDelete(oldinfo); + + return; + } + else if (!file && + (!cgiGetVariable("PPD_NAME") || cgiGetVariable("SELECT_MAKE"))) + { + if (modify && !cgiGetVariable("SELECT_MAKE")) + { + /* + * Get the PPD file... + */ + + int fd; /* PPD file */ + char filename[1024]; /* PPD filename */ + ppd_file_t *ppd; /* PPD information */ + char buffer[1024]; /* Buffer */ + int bytes; /* Number of bytes */ + http_status_t get_status; /* Status of GET */ + + + /* TODO: Use cupsGetFile() API... */ + snprintf(uri, sizeof(uri), "/printers/%s.ppd", name); + + if (httpGet(http, uri)) + httpGet(http, uri); + + while ((get_status = httpUpdate(http)) == HTTP_CONTINUE); + + if (get_status != HTTP_OK) + { + httpFlush(http); + + fprintf(stderr, "ERROR: Unable to get PPD file %s: %d - %s\n", + uri, get_status, httpStatus(get_status)); + } + else if ((fd = cupsTempFd(filename, sizeof(filename))) >= 0) + { + while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) + write(fd, buffer, bytes); + + close(fd); + + if ((ppd = ppdOpenFile(filename)) != NULL) + { + if (ppd->manufacturer) + cgiSetVariable("CURRENT_MAKE", ppd->manufacturer); + + if (ppd->nickname) + cgiSetVariable("CURRENT_MAKE_AND_MODEL", ppd->nickname); + + ppdClose(ppd); + unlink(filename); + } + else + { + fprintf(stderr, "ERROR: Unable to open PPD file %s: %s\n", + filename, ppdErrorString(ppdLastError(&bytes))); + } + } + else + { + httpFlush(http); + + fprintf(stderr, + "ERROR: Unable to create temporary file for PPD file: %s\n", + strerror(errno)); + } + } + + /* + * Build a CUPS_GET_PPDS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(CUPS_GET_PPDS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/printers/"); + + if ((var = cgiGetVariable("PPD_MAKE")) == NULL) + var = cgiGetVariable("CURRENT_MAKE"); + if (var && !cgiGetVariable("SELECT_MAKE")) + { + const char *make_model; /* Make and model */ + + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, + "ppd-make", NULL, var); + + if ((make_model = cgiGetVariable("CURRENT_MAKE_AND_MODEL")) != NULL) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, + "ppd-make-and-model", NULL, make_model); + } + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "ppd-make"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Got the list of PPDs, see if the user has selected a make... + */ + + if (cgiSetIPPVars(response, NULL, NULL, NULL, 0) == 0 && !modify) + { + /* + * No PPD files with this make, try again with all makes... + */ + + ippDelete(response); + + request = ippNewRequest(CUPS_GET_PPDS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/printers/"); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "ppd-make"); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + cgiStartHTML(title); + cgiCopyTemplateLang("choose-make.tmpl"); + cgiEndHTML(); + } + else if (!var || cgiGetVariable("SELECT_MAKE")) + { + cgiStartHTML(title); + cgiCopyTemplateLang("choose-make.tmpl"); + cgiEndHTML(); + } + else + { + /* + * Let the user choose a model... + */ + + cgiStartHTML(title); + if (!cgiGetVariable("PPD_MAKE")) + cgiSetVariable("PPD_MAKE", cgiGetVariable("CURRENT_MAKE")); + if (!modify) + cgiSetVariable("CURRENT_MAKE_AND_MODEL", + cgiGetArray("PPD_MAKE_AND_MODEL", 0)); + cgiCopyTemplateLang("choose-model.tmpl"); + cgiEndHTML(); + } + + ippDelete(response); + } + else + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to get list of printer drivers:")); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + } + } + else + { + /* + * Build a CUPS_ADD_PRINTER request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * printer-location + * printer-info + * ppd-name + * device-uri + * printer-is-accepting-jobs + * printer-is-shared + * printer-state + */ + + request = ippNewRequest(CUPS_ADD_PRINTER); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", + cgiGetVariable("PRINTER_NAME")); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", + NULL, cgiGetVariable("PRINTER_LOCATION")); + + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", + NULL, cgiGetVariable("PRINTER_INFO")); + + if (!file) + { + var = cgiGetVariable("PPD_NAME"); + if (strcmp(var, "__no_change__")) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "ppd-name", + NULL, var); + } + + strlcpy(uri, cgiGetVariable("DEVICE_URI"), sizeof(uri)); + + /* + * Strip make and model from URI... + */ + + if ((uriptr = strrchr(uri, '|')) != NULL) + *uriptr = '\0'; + + if (!strncmp(uri, "serial:", 7)) + { + /* + * Update serial port URI to include baud rate, etc. + */ + + if ((uriptr = strchr(uri, '?')) == NULL) + uriptr = uri + strlen(uri); + + snprintf(uriptr, sizeof(uri) - (uriptr - uri), + "?baud=%s+bits=%s+parity=%s+flow=%s", + cgiGetVariable("BAUDRATE"), cgiGetVariable("BITS"), + cgiGetVariable("PARITY"), cgiGetVariable("FLOW")); + } + + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", + NULL, uri); + + ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); + + var = cgiGetVariable("printer_is_shared"); + ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-shared", + var && (!strcmp(var, "1") || !strcmp(var, "on"))); + + ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", + IPP_PRINTER_IDLE); + + /* + * Do the request and get back a response... + */ + + if (file) + ippDelete(cupsDoFileRequest(http, request, "/admin/", file->tempfile)); + else + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(modify ? _("Unable to modify printer:") : + _("Unable to add printer:")); + } + else if (modify) + { + /* + * Redirect successful updates back to the printer page... + */ + + char refresh[1024]; /* Refresh URL */ + + + cgiFormEncode(uri, name, sizeof(uri)); + + snprintf(refresh, sizeof(refresh), + "5;/admin/?OP=redirect&URL=/printers/%s", uri); + + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + + cgiCopyTemplateLang("printer-modified.tmpl"); + } + else + { + /* + * Set the printer options... + */ + + cgiSetVariable("OP", "set-printer-options"); + do_set_options(http, 0); + return; + } + + cgiEndHTML(); + } + + if (oldinfo) + ippDelete(oldinfo); +} + + +/* + * 'do_cancel_subscription()' - Cancel a subscription. + */ + +static void +do_cancel_subscription(http_t *http)/* I - HTTP connection */ +{ + ipp_t *request; /* IPP request data */ + const char *var, /* Form variable */ + *user; /* Username */ + int id; /* Subscription ID */ + + + /* + * See if we have all of the required information... + */ + + if ((var = cgiGetVariable("NOTIFY_SUBSCRIPTION_ID")) != NULL) + id = atoi(var); + else + id = 0; + + if (id <= 0) + { + cgiSetVariable("ERROR", cgiText(_("Bad subscription ID"))); + cgiStartHTML(_("Cancel RSS Subscription")); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Require a username... + */ + + if ((user = getenv("REMOTE_USER")) == NULL) + { + puts("Status: 401\n"); + exit(0); + } + + /* + * Cancel the subscription... + */ + + request = ippNewRequest(IPP_CANCEL_SUBSCRIPTION); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/"); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "notify-subscription-id", id); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, user); + + ippDelete(cupsDoRequest(http, request, "/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(_("Cancel RSS Subscription")); + cgiShowIPPError(_("Unable to cancel RSS subscription:")); + } + else + { + /* + * Redirect successful updates back to the admin page... + */ + + cgiSetVariable("refresh_page", "5;URL=/admin"); + cgiStartHTML(_("Cancel RSS Subscription")); + cgiCopyTemplateLang("subscription-canceled.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'do_config_server()' - Configure server settings. + */ + +static void +do_config_server(http_t *http) /* I - HTTP connection */ +{ + if (cgiGetVariable("CHANGESETTINGS")) + { + /* + * Save basic setting changes... + */ + + int num_settings; /* Number of server settings */ + cups_option_t *settings; /* Server settings */ + int advanced, /* Advanced settings shown? */ + changed; /* Have settings changed? */ + const char *debug_logging, /* DEBUG_LOGGING value */ + *remote_admin, /* REMOTE_ADMIN value */ + *remote_any, /* REMOTE_ANY value */ + *remote_printers, + /* REMOTE_PRINTERS value */ + *share_printers,/* SHARE_PRINTERS value */ + *user_cancel_any, + /* USER_CANCEL_ANY value */ + *browse_web_if = NULL, + /* BrowseWebIF value */ + *preserve_job_history = NULL, + /* PreserveJobHistory value */ + *preserve_job_files = NULL, + /* PreserveJobFiles value */ + *max_clients = NULL, + /* MaxClients value */ + *max_jobs = NULL, + /* MaxJobs value */ + *max_log_size = NULL; + /* MaxLogSize value */ + char local_protocols[255], + /* BrowseLocalProtocols */ + remote_protocols[255]; + /* BrowseRemoteProtocols */ + const char *current_browse_web_if, + /* BrowseWebIF value */ + *current_preserve_job_history, + /* PreserveJobHistory value */ + *current_preserve_job_files, + /* PreserveJobFiles value */ + *current_max_clients, + /* MaxClients value */ + *current_max_jobs, + /* MaxJobs value */ + *current_max_log_size, + /* MaxLogSize value */ + *current_local_protocols, + /* BrowseLocalProtocols */ + *current_remote_protocols; + /* BrowseRemoteProtocols */ +#ifdef HAVE_GSSAPI + char default_auth_type[255]; + /* DefaultAuthType value */ + const char *val; /* Setting value */ +#endif /* HAVE_GSSAPI */ + + + /* + * Get the checkbox values from the form... + */ + + debug_logging = cgiGetVariable("DEBUG_LOGGING") ? "1" : "0"; + remote_admin = cgiGetVariable("REMOTE_ADMIN") ? "1" : "0"; + remote_any = cgiGetVariable("REMOTE_ANY") ? "1" : "0"; + remote_printers = cgiGetVariable("REMOTE_PRINTERS") ? "1" : "0"; + share_printers = cgiGetVariable("SHARE_PRINTERS") ? "1" : "0"; + user_cancel_any = cgiGetVariable("USER_CANCEL_ANY") ? "1" : "0"; + + advanced = cgiGetVariable("ADVANCEDSETTINGS") != NULL; + if (advanced) + { + /* + * Get advanced settings... + */ + + browse_web_if = cgiGetVariable("BROWSE_WEB_IF") ? "Yes" : "No"; + preserve_job_history = cgiGetVariable("PRESERVE_JOB_HISTORY") ? "Yes" : "No"; + preserve_job_files = cgiGetVariable("PRESERVE_JOB_FILES") ? "Yes" : "No"; + max_clients = cgiGetVariable("MAX_CLIENTS"); + max_jobs = cgiGetVariable("MAX_JOBS"); + max_log_size = cgiGetVariable("MAX_LOG_SIZE"); + + if (!max_clients || atoi(max_clients) <= 0) + max_clients = "100"; + + if (!max_jobs || atoi(max_jobs) <= 0) + max_jobs = "500"; + + if (!max_log_size || atof(max_log_size) <= 0.0) + max_log_size = "1m"; + + if (cgiGetVariable("BROWSE_LOCAL_CUPS")) + strcpy(local_protocols, "cups"); + else + local_protocols[0] = '\0'; + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (cgiGetVariable("BROWSE_LOCAL_DNSSD")) + { + if (local_protocols[0]) + strcat(local_protocols, " dnssd"); + else + strcat(local_protocols, "dnssd"); + } +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_LDAP + if (cgiGetVariable("BROWSE_LOCAL_LDAP")) + { + if (local_protocols[0]) + strcat(local_protocols, " ldap"); + else + strcat(local_protocols, "ldap"); + } +#endif /* HAVE_LDAP */ + +#ifdef HAVE_LIBSLP + if (cgiGetVariable("BROWSE_LOCAL_SLP")) + { + if (local_protocols[0]) + strcat(local_protocols, " slp"); + else + strcat(local_protocols, "slp"); + } +#endif /* HAVE_SLP */ + + if (cgiGetVariable("BROWSE_REMOTE_CUPS")) + strcpy(remote_protocols, "cups"); + else + remote_protocols[0] = '\0'; + +#ifdef HAVE_LDAP + if (cgiGetVariable("BROWSE_REMOTE_LDAP")) + { + if (remote_protocols[0]) + strcat(remote_protocols, " ldap"); + else + strcat(remote_protocols, "ldap"); + } +#endif /* HAVE_LDAP */ + +#ifdef HAVE_LIBSLP + if (cgiGetVariable("BROWSE_REMOTE_SLP")) + { + if (remote_protocols[0]) + strcat(remote_protocols, " slp"); + else + strcat(remote_protocols, "slp"); + } +#endif /* HAVE_SLP */ + } + + /* + * Get the current server settings... + */ + + if (!cupsAdminGetServerSettings(http, &num_settings, &settings)) + { + cgiStartHTML(cgiText(_("Change Settings"))); + cgiSetVariable("MESSAGE", + cgiText(_("Unable to change server settings:"))); + cgiSetVariable("ERROR", cupsLastErrorString()); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + +#ifdef HAVE_GSSAPI + /* + * Get authentication settings... + */ + + if (cgiGetVariable("KERBEROS")) + strlcpy(default_auth_type, "Negotiate", sizeof(default_auth_type)); + else + { + val = cupsGetOption("DefaultAuthType", num_settings, settings); + + if (!val || !_cups_strcasecmp(val, "Negotiate")) + strlcpy(default_auth_type, "Basic", sizeof(default_auth_type)); + else + strlcpy(default_auth_type, val, sizeof(default_auth_type)); + } + + fprintf(stderr, "DEBUG: DefaultAuthType %s\n", default_auth_type); +#endif /* HAVE_GSSAPI */ + + if ((current_browse_web_if = cupsGetOption("BrowseWebIF", num_settings, + settings)) == NULL) + current_browse_web_if = "No"; + + if ((current_preserve_job_history = cupsGetOption("PreserveJobHistory", + num_settings, + settings)) == NULL) + current_preserve_job_history = "Yes"; + + if ((current_preserve_job_files = cupsGetOption("PreserveJobFiles", + num_settings, + settings)) == NULL) + current_preserve_job_files = "No"; + + if ((current_max_clients = cupsGetOption("MaxClients", num_settings, + settings)) == NULL) + current_max_clients = "100"; + + if ((current_max_jobs = cupsGetOption("MaxJobs", num_settings, + settings)) == NULL) + current_max_jobs = "500"; + + if ((current_max_log_size = cupsGetOption("MaxLogSize", num_settings, + settings)) == NULL) + current_max_log_size = "1m"; + + if ((current_local_protocols = cupsGetOption("BrowseLocalProtocols", + num_settings, + settings)) == NULL) + current_local_protocols = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS; + + if ((current_remote_protocols = cupsGetOption("BrowseRemoteProtocols", + num_settings, + settings)) == NULL) + current_remote_protocols = CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS; + + /* + * See if the settings have changed... + */ + + changed = strcmp(debug_logging, cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, + num_settings, settings)) || + strcmp(remote_admin, cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, + num_settings, settings)) || + strcmp(remote_any, cupsGetOption(CUPS_SERVER_REMOTE_ANY, + num_settings, settings)) || + strcmp(remote_printers, cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, + num_settings, settings)) || + strcmp(share_printers, cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, + num_settings, settings)) || +#ifdef HAVE_GSSAPI + !cupsGetOption("DefaultAuthType", num_settings, settings) || + strcmp(default_auth_type, cupsGetOption("DefaultAuthType", + num_settings, settings)) || +#endif /* HAVE_GSSAPI */ + strcmp(user_cancel_any, cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, + num_settings, settings)); + + if (advanced && !changed) + changed = _cups_strcasecmp(local_protocols, current_local_protocols) || + _cups_strcasecmp(remote_protocols, current_remote_protocols) || + _cups_strcasecmp(browse_web_if, current_browse_web_if) || + _cups_strcasecmp(preserve_job_history, current_preserve_job_history) || + _cups_strcasecmp(preserve_job_files, current_preserve_job_files) || + _cups_strcasecmp(max_clients, current_max_clients) || + _cups_strcasecmp(max_jobs, current_max_jobs) || + _cups_strcasecmp(max_log_size, current_max_log_size); + + if (changed) + { + /* + * Settings *have* changed, so save the changes... + */ + + cupsFreeOptions(num_settings, settings); + + num_settings = 0; + num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + debug_logging, num_settings, &settings); + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + remote_admin, num_settings, &settings); + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, + remote_any, num_settings, &settings); + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, + remote_printers, num_settings, &settings); + num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + share_printers, num_settings, &settings); + num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + user_cancel_any, num_settings, &settings); +#ifdef HAVE_GSSAPI + num_settings = cupsAddOption("DefaultAuthType", default_auth_type, + num_settings, &settings); +#endif /* HAVE_GSSAPI */ + + if (advanced) + { + /* + * Add advanced settings... + */ + + if (_cups_strcasecmp(local_protocols, current_local_protocols)) + num_settings = cupsAddOption("BrowseLocalProtocols", local_protocols, + num_settings, &settings); + if (_cups_strcasecmp(remote_protocols, current_remote_protocols)) + num_settings = cupsAddOption("BrowseRemoteProtocols", remote_protocols, + num_settings, &settings); + if (_cups_strcasecmp(browse_web_if, current_browse_web_if)) + num_settings = cupsAddOption("BrowseWebIF", browse_web_if, + num_settings, &settings); + if (_cups_strcasecmp(preserve_job_history, current_preserve_job_history)) + num_settings = cupsAddOption("PreserveJobHistory", + preserve_job_history, num_settings, + &settings); + if (_cups_strcasecmp(preserve_job_files, current_preserve_job_files)) + num_settings = cupsAddOption("PreserveJobFiles", preserve_job_files, + num_settings, &settings); + if (_cups_strcasecmp(max_clients, current_max_clients)) + num_settings = cupsAddOption("MaxClients", max_clients, num_settings, + &settings); + if (_cups_strcasecmp(max_jobs, current_max_jobs)) + num_settings = cupsAddOption("MaxJobs", max_jobs, num_settings, + &settings); + if (_cups_strcasecmp(max_log_size, current_max_log_size)) + num_settings = cupsAddOption("MaxLogSize", max_log_size, num_settings, + &settings); + } + + if (!cupsAdminSetServerSettings(http, num_settings, settings)) + { + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + + cgiStartHTML(cgiText(_("Change Settings"))); + cgiSetVariable("MESSAGE", + cgiText(_("Unable to change server settings:"))); + cgiSetVariable("ERROR", cupsLastErrorString()); + cgiCopyTemplateLang("error.tmpl"); + } + else + { + if (advanced) + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&URL=/admin/?ADVANCEDSETTINGS=YES"); + else + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); + cgiStartHTML(cgiText(_("Change Settings"))); + cgiCopyTemplateLang("restart.tmpl"); + } + } + else + { + /* + * No changes... + */ + + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); + cgiStartHTML(cgiText(_("Change Settings"))); + cgiCopyTemplateLang("norestart.tmpl"); + } + + cupsFreeOptions(num_settings, settings); + + cgiEndHTML(); + } + else if (cgiGetVariable("SAVECHANGES") && cgiGetVariable("CUPSDCONF")) + { + /* + * Save hand-edited config file... + */ + + http_status_t status; /* PUT status */ + char tempfile[1024]; /* Temporary new cupsd.conf */ + int tempfd; /* Temporary file descriptor */ + cups_file_t *temp; /* Temporary file */ + const char *start, /* Start of line */ + *end; /* End of line */ + + + /* + * Create a temporary file for the new cupsd.conf file... + */ + + if ((tempfd = cupsTempFd(tempfile, sizeof(tempfile))) < 0) + { + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiSetVariable("MESSAGE", cgiText(_("Unable to create temporary file:"))); + cgiSetVariable("ERROR", strerror(errno)); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + perror(tempfile); + return; + } + + if ((temp = cupsFileOpenFd(tempfd, "w")) == NULL) + { + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiSetVariable("MESSAGE", cgiText(_("Unable to create temporary file:"))); + cgiSetVariable("ERROR", strerror(errno)); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + perror(tempfile); + close(tempfd); + unlink(tempfile); + return; + } + + /* + * Copy the cupsd.conf text from the form variable... + */ + + start = cgiGetVariable("CUPSDCONF"); + while (start) + { + if ((end = strstr(start, "\r\n")) == NULL) + if ((end = strstr(start, "\n")) == NULL) + end = start + strlen(start); + + cupsFileWrite(temp, start, end - start); + cupsFilePutChar(temp, '\n'); + + if (*end == '\r') + start = end + 2; + else if (*end == '\n') + start = end + 1; + else + start = NULL; + } + + cupsFileClose(temp); + + /* + * Upload the configuration file to the server... + */ + + status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile); + + if (status == HTTP_UNAUTHORIZED) + { + puts("Status: 401\n"); + unlink(tempfile); + exit(0); + } + else if (status != HTTP_CREATED) + { + cgiSetVariable("MESSAGE", + cgiText(_("Unable to upload cupsd.conf file:"))); + cgiSetVariable("ERROR", httpStatus(status)); + + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiCopyTemplateLang("error.tmpl"); + } + else + { + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect"); + + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiCopyTemplateLang("restart.tmpl"); + } + + cgiEndHTML(); + + unlink(tempfile); + } + else + { + struct stat info; /* cupsd.conf information */ + cups_file_t *cupsd; /* cupsd.conf file */ + char *buffer, /* Buffer for entire file */ + *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + int ch; /* Character from file */ + char filename[1024]; /* Filename */ + const char *server_root; /* Location of config files */ + + + /* + * Locate the cupsd.conf file... + */ + + if ((server_root = getenv("CUPS_SERVERROOT")) == NULL) + server_root = CUPS_SERVERROOT; + + snprintf(filename, sizeof(filename), "%s/cupsd.conf", server_root); + + /* + * Figure out the size... + */ + + if (stat(filename, &info)) + { + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiSetVariable("MESSAGE", + cgiText(_("Unable to access cupsd.conf file:"))); + cgiSetVariable("ERROR", strerror(errno)); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + perror(filename); + return; + } + + if (info.st_size > (1024 * 1024)) + { + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiSetVariable("MESSAGE", + cgiText(_("Unable to access cupsd.conf file:"))); + cgiSetVariable("ERROR", + cgiText(_("Unable to edit cupsd.conf files larger than " + "1MB"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + fprintf(stderr, "ERROR: \"%s\" too large (%ld) to edit!\n", filename, + (long)info.st_size); + return; + } + + /* + * Open the cupsd.conf file... + */ + + if ((cupsd = cupsFileOpen(filename, "r")) == NULL) + { + /* + * Unable to open - log an error... + */ + + cgiStartHTML(cgiText(_("Edit Configuration File"))); + cgiSetVariable("MESSAGE", + cgiText(_("Unable to access cupsd.conf file:"))); + cgiSetVariable("ERROR", strerror(errno)); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + perror(filename); + return; + } + + /* + * Allocate memory and load the file into a string buffer... + */ + + if ((buffer = calloc(1, info.st_size + 1)) != NULL) + { + cupsFileRead(cupsd, buffer, info.st_size); + cgiSetVariable("CUPSDCONF", buffer); + free(buffer); + } + + cupsFileClose(cupsd); + + /* + * Then get the default cupsd.conf file and put that into a string as + * well... + */ + + strlcat(filename, ".default", sizeof(filename)); + + if (!stat(filename, &info) && info.st_size < (1024 * 1024) && + (cupsd = cupsFileOpen(filename, "r")) != NULL) + { + if ((buffer = calloc(1, 2 * info.st_size + 1)) != NULL) + { + bufend = buffer + 2 * info.st_size - 1; + + for (bufptr = buffer; + bufptr < bufend && (ch = cupsFileGetChar(cupsd)) != EOF;) + { + if (ch == '\\' || ch == '\"') + { + *bufptr++ = '\\'; + *bufptr++ = ch; + } + else if (ch == '\n') + { + *bufptr++ = '\\'; + *bufptr++ = 'n'; + } + else if (ch == '\t') + { + *bufptr++ = '\\'; + *bufptr++ = 't'; + } + else if (ch >= ' ') + *bufptr++ = ch; + } + + *bufptr = '\0'; + + cgiSetVariable("CUPSDCONF_DEFAULT", buffer); + free(buffer); + } + + cupsFileClose(cupsd); + } + + /* + * Show the current config file... + */ + + cgiStartHTML(cgiText(_("Edit Configuration File"))); + + cgiCopyTemplateLang("edit-config.tmpl"); + + cgiEndHTML(); + } +} + + +/* + * 'do_delete_class()' - Delete a class. + */ + +static void +do_delete_class(http_t *http) /* I - HTTP connection */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* Job URI */ + const char *pclass; /* Printer class name */ + + + /* + * Get form variables... + */ + + if (cgiGetVariable("CONFIRM") == NULL) + { + cgiStartHTML(cgiText(_("Delete Class"))); + cgiCopyTemplateLang("class-confirm.tmpl"); + cgiEndHTML(); + return; + } + + if ((pclass = cgiGetVariable("PRINTER_NAME")) != NULL) + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", pclass); + else + { + cgiStartHTML(cgiText(_("Delete Class"))); + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Build a CUPS_DELETE_CLASS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(CUPS_DELETE_CLASS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + /* + * Show the results... + */ + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() <= IPP_OK_CONFLICT) + { + /* + * Redirect successful updates back to the classes page... + */ + + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&URL=/classes"); + } + + cgiStartHTML(cgiText(_("Delete Class"))); + + if (cupsLastError() > IPP_OK_CONFLICT) + cgiShowIPPError(_("Unable to delete class:")); + else + cgiCopyTemplateLang("class-deleted.tmpl"); + + cgiEndHTML(); +} + + +/* + * 'do_delete_printer()' - Delete a printer. + */ + +static void +do_delete_printer(http_t *http) /* I - HTTP connection */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* Job URI */ + const char *printer; /* Printer printer name */ + + + /* + * Get form variables... + */ + + if (cgiGetVariable("CONFIRM") == NULL) + { + cgiStartHTML(cgiText(_("Delete Printer"))); + cgiCopyTemplateLang("printer-confirm.tmpl"); + cgiEndHTML(); + return; + } + + if ((printer = cgiGetVariable("PRINTER_NAME")) != NULL) + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + else + { + cgiStartHTML(cgiText(_("Delete Printer"))); + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Build a CUPS_DELETE_PRINTER request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(CUPS_DELETE_PRINTER); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + /* + * Show the results... + */ + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() <= IPP_OK_CONFLICT) + { + /* + * Redirect successful updates back to the printers page... + */ + + cgiSetVariable("refresh_page", "5;URL=/admin/?OP=redirect&URL=/printers"); + } + + cgiStartHTML(cgiText(_("Delete Printer"))); + + if (cupsLastError() > IPP_OK_CONFLICT) + cgiShowIPPError(_("Unable to delete printer:")); + else + cgiCopyTemplateLang("printer-deleted.tmpl"); + + cgiEndHTML(); +} + + +/* + * 'do_export()' - Export printers to Samba. + */ + +static void +do_export(http_t *http) /* I - HTTP connection */ +{ + int i, j; /* Looping vars */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + const char *username, /* Samba username */ + *password, /* Samba password */ + *export_all; /* Export all printers? */ + int export_count, /* Number of printers to export */ + printer_count; /* Number of available printers */ + const char *name, /* What name to pull */ + *dest; /* Current destination */ + char ppd[1024]; /* PPD file */ + + + /* + * Get form data... + */ + + username = cgiGetVariable("USERNAME"); + password = cgiGetVariable("PASSWORD"); + export_all = cgiGetVariable("EXPORT_ALL"); + export_count = cgiGetSize("EXPORT_NAME"); + + /* + * Get list of available printers... + */ + + cgiSetSize("PRINTER_NAME", 0); + cgiSetSize("PRINTER_EXPORT", 0); + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type", 0); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type-mask", CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | + CUPS_PRINTER_IMPLICIT); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "printer-name"); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + ippDelete(response); + + if (!export_all) + { + printer_count = cgiGetSize("PRINTER_NAME"); + + for (i = 0; i < printer_count; i ++) + { + dest = cgiGetArray("PRINTER_NAME", i); + + for (j = 0; j < export_count; j ++) + if (!_cups_strcasecmp(dest, cgiGetArray("EXPORT_NAME", j))) + break; + + cgiSetArray("PRINTER_EXPORT", i, j < export_count ? "Y" : ""); + } + } + } + + /* + * Export or get the printers to export... + */ + + if (username && *username && password && *password && + (export_all || export_count > 0)) + { + /* + * Do export... + */ + + fputs("DEBUG: Export printers...\n", stderr); + + if (export_all) + { + name = "PRINTER_NAME"; + export_count = cgiGetSize("PRINTER_NAME"); + } + else + name = "EXPORT_NAME"; + + for (i = 0; i < export_count; i ++) + { + dest = cgiGetArray(name, i); + + if (!cupsAdminCreateWindowsPPD(http, dest, ppd, sizeof(ppd))) + break; + + j = cupsAdminExportSamba(dest, ppd, "localhost", username, password, + stderr); + + unlink(ppd); + + if (!j) + break; + } + + if (i < export_count) + cgiSetVariable("ERROR", cupsLastErrorString()); + else + { + cgiStartHTML(cgiText(_("Export Printers to Samba"))); + cgiCopyTemplateLang("samba-exported.tmpl"); + cgiEndHTML(); + return; + } + } + else if (username && !*username) + cgiSetVariable("ERROR", + cgiText(_("A Samba username is required to export " + "printer drivers"))); + else if (username && (!password || !*password)) + cgiSetVariable("ERROR", + cgiText(_("A Samba password is required to export " + "printer drivers"))); + + /* + * Show form... + */ + + cgiStartHTML(cgiText(_("Export Printers to Samba"))); + cgiCopyTemplateLang("samba-export.tmpl"); + cgiEndHTML(); +} + + +/* + * 'do_list_printers()' - List available printers. + */ + +static void +do_list_printers(http_t *http) /* I - HTTP connection */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + + + cgiStartHTML(cgiText(_("List Available Printers"))); + fflush(stdout); + + /* + * Get the list of printers and their devices... + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "device-uri"); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", + CUPS_PRINTER_LOCAL); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", + CUPS_PRINTER_LOCAL); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Got the printer list, now load the devices... + */ + + int i; /* Looping var */ + cups_array_t *printer_devices; /* Printer devices for local printers */ + char *printer_device; /* Current printer device */ + + + /* + * Allocate an array and copy the device strings... + */ + + printer_devices = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + for (attr = ippFindAttribute(response, "device-uri", IPP_TAG_URI); + attr; + attr = ippFindNextAttribute(response, "device-uri", IPP_TAG_URI)) + { + cupsArrayAdd(printer_devices, _cupsStrAlloc(attr->values[0].string.text)); + } + + /* + * Free the printer list and get the device list... + */ + + ippDelete(response); + + request = ippNewRequest(CUPS_GET_DEVICES); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Got the device list, let's parse it... + */ + + const char *device_uri, /* device-uri attribute value */ + *device_make_and_model, /* device-make-and-model value */ + *device_info; /* device-info value */ + + + for (i = 0, attr = response->attrs; attr; attr = attr->next) + { + /* + * Skip leading attributes until we hit a device... + */ + + while (attr && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (!attr) + break; + + /* + * Pull the needed attributes from this device... + */ + + device_info = NULL; + device_make_and_model = NULL; + device_uri = NULL; + + while (attr && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "device-info") && + attr->value_tag == IPP_TAG_TEXT) + device_info = attr->values[0].string.text; + + if (!strcmp(attr->name, "device-make-and-model") && + attr->value_tag == IPP_TAG_TEXT) + device_make_and_model = attr->values[0].string.text; + + if (!strcmp(attr->name, "device-uri") && + attr->value_tag == IPP_TAG_URI) + device_uri = attr->values[0].string.text; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (device_info && device_make_and_model && device_uri && + _cups_strcasecmp(device_make_and_model, "unknown") && + strchr(device_uri, ':')) + { + /* + * Yes, now see if there is already a printer for this + * device... + */ + + if (!cupsArrayFind(printer_devices, (void *)device_uri)) + { + /* + * Not found, so it must be a new printer... + */ + + char option[1024], /* Form variables for this device */ + *option_ptr; /* Pointer into string */ + const char *ptr; /* Pointer into device string */ + + + /* + * Format the printer name variable for this device... + * + * We use the device-info string first, then device-uri, + * and finally device-make-and-model to come up with a + * suitable name. + */ + + if (_cups_strncasecmp(device_info, "unknown", 7)) + ptr = device_info; + else if ((ptr = strstr(device_uri, "://")) != NULL) + ptr += 3; + else + ptr = device_make_and_model; + + for (option_ptr = option; + option_ptr < (option + sizeof(option) - 1) && *ptr; + ptr ++) + if (isalnum(*ptr & 255) || *ptr == '_' || *ptr == '-' || + *ptr == '.') + *option_ptr++ = *ptr; + else if ((*ptr == ' ' || *ptr == '/') && option_ptr > option && + option_ptr[-1] != '_') + *option_ptr++ = '_'; + else if (*ptr == '?' || *ptr == '(') + break; + + *option_ptr = '\0'; + + cgiSetArray("TEMPLATE_NAME", i, option); + + /* + * Finally, set the form variables for this printer... + */ + + cgiSetArray("device_info", i, device_info); + cgiSetArray("device_make_and_model", i, device_make_and_model); + cgiSetArray("device_uri", i, device_uri); + i ++; + } + } + + if (!attr) + break; + } + + ippDelete(response); + + /* + * Free the device list... + */ + + for (printer_device = (char *)cupsArrayFirst(printer_devices); + printer_device; + printer_device = (char *)cupsArrayNext(printer_devices)) + _cupsStrFree(printer_device); + + cupsArrayDelete(printer_devices); + } + } + + /* + * Finally, show the printer list... + */ + + cgiCopyTemplateLang("list-available-printers.tmpl"); + + cgiEndHTML(); +} + + +/* + * 'do_menu()' - Show the main menu. + */ + +static void +do_menu(http_t *http) /* I - HTTP connection */ +{ + int num_settings; /* Number of server settings */ + cups_option_t *settings; /* Server settings */ + const char *val; /* Setting value */ + char filename[1024]; /* Temporary filename */ + const char *datadir; /* Location of data files */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + + + /* + * Get the current server settings... + */ + + if (!cupsAdminGetServerSettings(http, &num_settings, &settings)) + { + cgiSetVariable("SETTINGS_MESSAGE", + cgiText(_("Unable to open cupsd.conf file:"))); + cgiSetVariable("SETTINGS_ERROR", cupsLastErrorString()); + } + + if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("DEBUG_LOGGING", "CHECKED"); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("REMOTE_ADMIN", "CHECKED"); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("REMOTE_ANY", "CHECKED"); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("REMOTE_PRINTERS", "CHECKED"); + + if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("SHARE_PRINTERS", "CHECKED"); + + if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, + settings)) != NULL && atoi(val)) + cgiSetVariable("USER_CANCEL_ANY", "CHECKED"); + +#ifdef HAVE_GSSAPI + cgiSetVariable("HAVE_GSSAPI", "1"); + + if ((val = cupsGetOption("DefaultAuthType", num_settings, + settings)) != NULL && !_cups_strcasecmp(val, "Negotiate")) + cgiSetVariable("KERBEROS", "CHECKED"); + else +#endif /* HAVE_GSSAPI */ + cgiSetVariable("KERBEROS", ""); + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cgiSetVariable("HAVE_DNSSD", "1"); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_LDAP + cgiSetVariable("HAVE_LDAP", "1"); +#endif /* HAVE_LDAP */ + +#ifdef HAVE_LIBSLP + cgiSetVariable("HAVE_LIBSLP", "1"); +#endif /* HAVE_LIBSLP */ + + if ((val = cupsGetOption("BrowseRemoteProtocols", num_settings, + settings)) == NULL) + if ((val = cupsGetOption("BrowseProtocols", num_settings, + settings)) == NULL) + val = CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS; + + if (strstr(val, "cups") || strstr(val, "CUPS")) + cgiSetVariable("BROWSE_REMOTE_CUPS", "CHECKED"); + + if (strstr(val, "ldap") || strstr(val, "LDAP")) + cgiSetVariable("BROWSE_REMOTE_LDAP", "CHECKED"); + + if (strstr(val, "slp") || strstr(val, "SLP")) + cgiSetVariable("BROWSE_REMOTE_SLP", "CHECKED"); + + if ((val = cupsGetOption("BrowseLocalProtocols", num_settings, + settings)) == NULL) + if ((val = cupsGetOption("BrowseProtocols", num_settings, + settings)) == NULL) + val = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS; + + if (strstr(val, "cups") || strstr(val, "CUPS")) + cgiSetVariable("BROWSE_LOCAL_CUPS", "CHECKED"); + + if (strstr(val, "dnssd") || strstr(val, "DNSSD") || + strstr(val, "dns-sd") || strstr(val, "DNS-SD") || + strstr(val, "bonjour") || strstr(val, "BONJOUR")) + cgiSetVariable("BROWSE_LOCAL_DNSSD", "CHECKED"); + + if (strstr(val, "ldap") || strstr(val, "LDAP")) + cgiSetVariable("BROWSE_LOCAL_LDAP", "CHECKED"); + + if (strstr(val, "slp") || strstr(val, "SLP")) + cgiSetVariable("BROWSE_LOCAL_SLP", "CHECKED"); + + if ((val = cupsGetOption("BrowseWebIF", num_settings, + settings)) == NULL) + val = "No"; + + if (!_cups_strcasecmp(val, "yes") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "true")) + cgiSetVariable("BROWSE_WEB_IF", "CHECKED"); + + if ((val = cupsGetOption("PreserveJobHistory", num_settings, + settings)) == NULL) + val = "Yes"; + + if (!_cups_strcasecmp(val, "yes") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "true")) + { + cgiSetVariable("PRESERVE_JOB_HISTORY", "CHECKED"); + + if ((val = cupsGetOption("PreserveJobFiles", num_settings, + settings)) == NULL) + val = "No"; + + if (!_cups_strcasecmp(val, "yes") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "true")) + cgiSetVariable("PRESERVE_JOB_FILES", "CHECKED"); + } + + if ((val = cupsGetOption("MaxClients", num_settings, settings)) == NULL) + val = "100"; + + cgiSetVariable("MAX_CLIENTS", val); + + if ((val = cupsGetOption("MaxJobs", num_settings, settings)) == NULL) + val = "500"; + + cgiSetVariable("MAX_JOBS", val); + + if ((val = cupsGetOption("MaxLogSize", num_settings, settings)) == NULL) + val = "1m"; + + cgiSetVariable("MAX_LOG_SIZE", val); + + cupsFreeOptions(num_settings, settings); + + /* + * See if Samba and the Windows drivers are installed... + */ + + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + snprintf(filename, sizeof(filename), "%s/drivers/pscript5.dll", datadir); + if (!access(filename, R_OK)) + { + /* + * Found Windows 2000 driver file, see if we have smbclient and + * rpcclient... + */ + + if (cupsFileFind("smbclient", getenv("PATH"), 1, filename, + sizeof(filename)) && + cupsFileFind("rpcclient", getenv("PATH"), 1, filename, + sizeof(filename))) + cgiSetVariable("HAVE_SAMBA", "Y"); + else + { + if (!cupsFileFind("smbclient", getenv("PATH"), 1, filename, + sizeof(filename))) + fputs("ERROR: smbclient not found!\n", stderr); + + if (!cupsFileFind("rpcclient", getenv("PATH"), 1, filename, + sizeof(filename))) + fputs("ERROR: rpcclient not found!\n", stderr); + } + } + else + perror(filename); + + /* + * Subscriptions... + */ + + request = ippNewRequest(IPP_GET_SUBSCRIPTIONS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/"); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + ippDelete(response); + } + + /* + * Finally, show the main menu template... + */ + + cgiStartHTML(cgiText(_("Administration"))); + + cgiCopyTemplateLang("admin.tmpl"); + + cgiEndHTML(); +} + + +/* + * 'do_set_allowed_users()' - Set the allowed/denied users for a queue. + */ + +static void +do_set_allowed_users(http_t *http) /* I - HTTP connection */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + const char *printer, /* Printer name (purge-jobs) */ + *is_class, /* Is a class? */ + *users, /* List of users or groups */ + *type; /* Allow/deny type */ + int num_users; /* Number of users */ + char *ptr, /* Pointer into users string */ + *end, /* Pointer to end of users string */ + quote; /* Quote character */ + ipp_attribute_t *attr; /* Attribute */ + static const char * const attrs[] = /* Requested attributes */ + { + "requesting-user-name-allowed", + "requesting-user-name-denied" + }; + + + is_class = cgiGetVariable("IS_CLASS"); + printer = cgiGetVariable("PRINTER_NAME"); + + if (!printer) + { + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiStartHTML(cgiText(_("Set Allowed Users"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + users = cgiGetVariable("users"); + type = cgiGetVariable("type"); + + if (!users || !type || + (strcmp(type, "requesting-user-name-allowed") && + strcmp(type, "requesting-user-name-denied"))) + { + /* + * Build a Get-Printer-Attributes request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requested-attributes + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", + printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(attrs) / sizeof(attrs[0])), NULL, attrs); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + ippDelete(response); + } + + cgiStartHTML(cgiText(_("Set Allowed Users"))); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + cgiShowIPPError(_("Unable to get printer attributes:")); + else + cgiCopyTemplateLang("users.tmpl"); + + cgiEndHTML(); + } + else + { + /* + * Save the changes... + */ + + for (num_users = 0, ptr = (char *)users; *ptr; num_users ++) + { + /* + * Skip whitespace and commas... + */ + + while (*ptr == ',' || isspace(*ptr & 255)) + ptr ++; + + if (!*ptr) + break; + + if (*ptr == '\'' || *ptr == '\"') + { + /* + * Scan quoted name... + */ + + quote = *ptr++; + + for (end = ptr; *end; end ++) + if (*end == quote) + break; + } + else + { + /* + * Scan space or comma-delimited name... + */ + + for (end = ptr; *end; end ++) + if (isspace(*end & 255) || *end == ',') + break; + } + + /* + * Advance to the next name... + */ + + ptr = end; + } + + /* + * Build a CUPS-Add-Printer/Class request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name-{allowed,denied} + */ + + request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", + printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + if (num_users == 0) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + "requesting-user-name-allowed", NULL, "all"); + else + { + attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + type, num_users, NULL, NULL); + + for (i = 0, ptr = (char *)users; *ptr; i ++) + { + /* + * Skip whitespace and commas... + */ + + while (*ptr == ',' || isspace(*ptr & 255)) + ptr ++; + + if (!*ptr) + break; + + if (*ptr == '\'' || *ptr == '\"') + { + /* + * Scan quoted name... + */ + + quote = *ptr++; + + for (end = ptr; *end; end ++) + if (*end == quote) + break; + } + else + { + /* + * Scan space or comma-delimited name... + */ + + for (end = ptr; *end; end ++) + if (isspace(*end & 255) || *end == ',') + break; + } + + /* + * Terminate the name... + */ + + if (*end) + *end++ = '\0'; + + /* + * Add the name... + */ + + attr->values[i].string.text = _cupsStrAlloc(ptr); + + /* + * Advance to the next name... + */ + + ptr = end; + } + } + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(cgiText(_("Set Allowed Users"))); + cgiShowIPPError(_("Unable to change printer:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ + + + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", + uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(cgiText(_("Set Allowed Users"))); + + cgiCopyTemplateLang(is_class ? "class-modified.tmpl" : + "printer-modified.tmpl"); + } + + cgiEndHTML(); + } +} + + +/* + * 'do_set_default()' - Set the server default printer/class. + */ + +static void +do_set_default(http_t *http) /* I - HTTP connection */ +{ + const char *title; /* Page title */ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + const char *printer, /* Printer name (purge-jobs) */ + *is_class; /* Is a class? */ + + + is_class = cgiGetVariable("IS_CLASS"); + printer = cgiGetVariable("PRINTER_NAME"); + title = cgiText(_("Set As Server Default")); + + if (!printer) + { + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Build a printer request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(CUPS_SET_DEFAULT); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", + printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to set server default:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ + + + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + cgiCopyTemplateLang("printer-default.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'do_set_options()' - Configure the default options for a queue. + */ + +static void +do_set_options(http_t *http, /* I - HTTP connection */ + int is_class) /* I - Set options for class? */ +{ + int i, j, k, m; /* Looping vars */ + int have_options; /* Have options? */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + char uri[HTTP_MAX_URI]; /* Job URI */ + const char *var; /* Variable value */ + const char *printer; /* Printer printer name */ + const char *filename; /* PPD filename */ + char tempfile[1024]; /* Temporary filename */ + cups_file_t *in, /* Input file */ + *out; /* Output file */ + char line[1024], /* Line from PPD file */ + value[1024], /* Option value */ + keyword[1024], /* Keyword from Default line */ + *keyptr; /* Pointer into keyword... */ + ppd_file_t *ppd; /* PPD file */ + ppd_group_t *group; /* Option group */ + ppd_option_t *option; /* Option */ + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + ppd_attr_t *ppdattr; /* PPD attribute */ + const char *title; /* Page title */ + + + title = cgiText(is_class ? _("Set Class Options") : _("Set Printer Options")); + + fprintf(stderr, "DEBUG: do_set_options(http=%p, is_class=%d)\n", http, + is_class); + + /* + * Get the printer name... + */ + + if ((printer = cgiGetVariable("PRINTER_NAME")) != NULL) + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", + printer); + else + { + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + fprintf(stderr, "DEBUG: printer=\"%s\", uri=\"%s\"...\n", printer, uri); + + /* + * If the user clicks on the Auto-Configure button, send an AutoConfigure + * command file to the printer... + */ + + if (cgiGetVariable("AUTOCONFIGURE")) + { + cgiPrintCommand(http, printer, "AutoConfigure", "Set Default Options"); + return; + } + + /* + * Get the PPD file... + */ + + if (is_class) + filename = NULL; + else + filename = cupsGetPPD2(http, printer); + + if (filename) + { + fprintf(stderr, "DEBUG: Got PPD file: \"%s\"\n", filename); + + if ((ppd = ppdOpenFile(filename)) == NULL) + { + cgiSetVariable("ERROR", ppdErrorString(ppdLastError(&i))); + cgiSetVariable("MESSAGE", cgiText(_("Unable to open PPD file:"))); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + } + else + { + fputs("DEBUG: No PPD file\n", stderr); + ppd = NULL; + } + + if (cgiGetVariable("job_sheets_start") != NULL || + cgiGetVariable("job_sheets_end") != NULL) + have_options = 1; + else + have_options = 0; + + if (ppd) + { + ppdMarkDefaults(ppd); + + for (option = ppdFirstOption(ppd); + option; + option = ppdNextOption(ppd)) + { + if ((var = cgiGetVariable(option->keyword)) != NULL) + { + have_options = 1; + ppdMarkOption(ppd, option->keyword, var); + fprintf(stderr, "DEBUG: Set %s to %s...\n", option->keyword, var); + } + else + fprintf(stderr, "DEBUG: Didn't find %s...\n", option->keyword); + } + } + + if (!have_options || ppdConflicts(ppd)) + { + /* + * Show the options to the user... + */ + + fputs("DEBUG: Showing options...\n", stderr); + + /* + * Show auto-configure button if supported... + */ + + if (ppd) + { + if (ppd->num_filters == 0 || + ((ppdattr = ppdFindAttr(ppd, "cupsCommands", NULL)) != NULL && + ppdattr->value && strstr(ppdattr->value, "AutoConfigure"))) + cgiSetVariable("HAVE_AUTOCONFIGURE", "YES"); + else + { + for (i = 0; i < ppd->num_filters; i ++) + if (!strncmp(ppd->filters[i], "application/vnd.cups-postscript", 31)) + { + cgiSetVariable("HAVE_AUTOCONFIGURE", "YES"); + break; + } + } + } + + /* + * Get the printer attributes... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + response = cupsDoRequest(http, request, "/"); + + /* + * List the groups used as "tabs"... + */ + + i = 0; + + if (ppd) + { + for (group = ppd->groups; + i < ppd->num_groups; + i ++, group ++) + { + cgiSetArray("GROUP_ID", i, group->name); + + if (!strcmp(group->name, "InstallableOptions")) + cgiSetArray("GROUP", i, cgiText(_("Options Installed"))); + else + cgiSetArray("GROUP", i, group->text); + } + } + + if (ippFindAttribute(response, "job-sheets-supported", IPP_TAG_ZERO)) + { + cgiSetArray("GROUP_ID", i, "CUPS_BANNERS"); + cgiSetArray("GROUP", i ++, cgiText(_("Banners"))); + } + + if (ippFindAttribute(response, "printer-error-policy-supported", + IPP_TAG_ZERO) || + ippFindAttribute(response, "printer-op-policy-supported", + IPP_TAG_ZERO)) + { + cgiSetArray("GROUP_ID", i, "CUPS_POLICIES"); + cgiSetArray("GROUP", i ++, cgiText(_("Policies"))); + } + + if ((attr = ippFindAttribute(response, "port-monitor-supported", + IPP_TAG_NAME)) != NULL && attr->num_values > 1) + { + cgiSetArray("GROUP_ID", i, "CUPS_PORT_MONITOR"); + cgiSetArray("GROUP", i, cgiText(_("Port Monitor"))); + } + + cgiStartHTML(cgiText(_("Set Printer Options"))); + cgiCopyTemplateLang("set-printer-options-header.tmpl"); + + if (ppd) + { + ppdLocalize(ppd); + + if (ppdConflicts(ppd)) + { + for (i = ppd->num_groups, k = 0, group = ppd->groups; + i > 0; + i --, group ++) + for (j = group->num_options, option = group->options; + j > 0; + j --, option ++) + if (option->conflicted) + { + cgiSetArray("ckeyword", k, option->keyword); + cgiSetArray("ckeytext", k, option->text); + + for (m = 0; m < option->num_choices; m ++) + { + if (option->choices[m].marked) + { + cgiSetArray("cchoice", k, option->choices[m].text); + break; + } + } + + k ++; + } + + cgiCopyTemplateLang("option-conflict.tmpl"); + } + + for (i = ppd->num_groups, group = ppd->groups; + i > 0; + i --, group ++) + { + for (j = group->num_options, option = group->options; + j > 0; + j --, option ++) + { + if (!strcmp(option->keyword, "PageRegion")) + continue; + + if (option->num_choices > 1) + break; + } + + if (j == 0) + continue; + + cgiSetVariable("GROUP_ID", group->name); + + if (!strcmp(group->name, "InstallableOptions")) + cgiSetVariable("GROUP", cgiText(_("Options Installed"))); + else + cgiSetVariable("GROUP", group->text); + + cgiCopyTemplateLang("option-header.tmpl"); + + for (j = group->num_options, option = group->options; + j > 0; + j --, option ++) + { + if (!strcmp(option->keyword, "PageRegion") || option->num_choices < 2) + continue; + + cgiSetVariable("KEYWORD", option->keyword); + cgiSetVariable("KEYTEXT", option->text); + + if (option->conflicted) + cgiSetVariable("CONFLICTED", "1"); + else + cgiSetVariable("CONFLICTED", "0"); + + cgiSetSize("CHOICES", 0); + cgiSetSize("TEXT", 0); + for (k = 0, m = 0; k < option->num_choices; k ++) + { + cgiSetArray("CHOICES", m, option->choices[k].choice); + cgiSetArray("TEXT", m, option->choices[k].text); + + m ++; + + if (option->choices[k].marked) + cgiSetVariable("DEFCHOICE", option->choices[k].choice); + } + + cgiSetSize("PARAMS", 0); + cgiSetSize("PARAMTEXT", 0); + cgiSetSize("PARAMVALUE", 0); + cgiSetSize("INPUTTYPE", 0); + + if ((coption = ppdFindCustomOption(ppd, option->keyword))) + { + const char *units = NULL; /* Units value, if any */ + + cgiSetVariable("ISCUSTOM", "1"); + + for (cparam = ppdFirstCustomParam(coption), m = 0; + cparam; + cparam = ppdNextCustomParam(coption), m ++) + { + if (!_cups_strcasecmp(option->keyword, "PageSize") && + _cups_strcasecmp(cparam->name, "Width") && + _cups_strcasecmp(cparam->name, "Height")) + { + m --; + continue; + } + + cgiSetArray("PARAMS", m, cparam->name); + cgiSetArray("PARAMTEXT", m, cparam->text); + cgiSetArray("INPUTTYPE", m, "text"); + + switch (cparam->type) + { + case PPD_CUSTOM_POINTS : + if (!_cups_strncasecmp(option->defchoice, "Custom.", 7)) + { + units = option->defchoice + strlen(option->defchoice) - 2; + + if (strcmp(units, "mm") && strcmp(units, "cm") && + strcmp(units, "in") && strcmp(units, "ft")) + { + if (units[1] == 'm') + units ++; + else + units = "pt"; + } + } + else + units = "pt"; + + if (!strcmp(units, "mm")) + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points / 72.0 * 25.4); + else if (!strcmp(units, "cm")) + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points / 72.0 * 2.54); + else if (!strcmp(units, "in")) + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points / 72.0); + else if (!strcmp(units, "ft")) + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points / 72.0 / 12.0); + else if (!strcmp(units, "m")) + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points / 72.0 * 0.0254); + else + snprintf(value, sizeof(value), "%g", + cparam->current.custom_points); + cgiSetArray("PARAMVALUE", m, value); + break; + + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_REAL : + snprintf(value, sizeof(value), "%g", + cparam->current.custom_real); + cgiSetArray("PARAMVALUE", m, value); + break; + + case PPD_CUSTOM_INT: + snprintf(value, sizeof(value), "%d", + cparam->current.custom_int); + cgiSetArray("PARAMVALUE", m, value); + break; + + case PPD_CUSTOM_PASSCODE: + case PPD_CUSTOM_PASSWORD: + if (cparam->current.custom_password) + cgiSetArray("PARAMVALUE", m, + cparam->current.custom_password); + else + cgiSetArray("PARAMVALUE", m, ""); + cgiSetArray("INPUTTYPE", m, "password"); + break; + + case PPD_CUSTOM_STRING: + if (cparam->current.custom_string) + cgiSetArray("PARAMVALUE", m, + cparam->current.custom_string); + else + cgiSetArray("PARAMVALUE", m, ""); + break; + } + } + + if (units) + { + cgiSetArray("PARAMS", m, "Units"); + cgiSetArray("PARAMTEXT", m, cgiText(_("Units"))); + cgiSetArray("PARAMVALUE", m, units); + } + } + else + cgiSetVariable("ISCUSTOM", "0"); + + switch (option->ui) + { + case PPD_UI_BOOLEAN : + cgiCopyTemplateLang("option-boolean.tmpl"); + break; + case PPD_UI_PICKONE : + cgiCopyTemplateLang("option-pickone.tmpl"); + break; + case PPD_UI_PICKMANY : + cgiCopyTemplateLang("option-pickmany.tmpl"); + break; + } + } + + cgiCopyTemplateLang("option-trailer.tmpl"); + } + } + + if ((attr = ippFindAttribute(response, "job-sheets-supported", + IPP_TAG_ZERO)) != NULL) + { + /* + * Add the job sheets options... + */ + + cgiSetVariable("GROUP_ID", "CUPS_BANNERS"); + cgiSetVariable("GROUP", cgiText(_("Banners"))); + cgiCopyTemplateLang("option-header.tmpl"); + + cgiSetSize("CHOICES", attr->num_values); + cgiSetSize("TEXT", attr->num_values); + for (k = 0; k < attr->num_values; k ++) + { + cgiSetArray("CHOICES", k, attr->values[k].string.text); + cgiSetArray("TEXT", k, attr->values[k].string.text); + } + + attr = ippFindAttribute(response, "job-sheets-default", IPP_TAG_ZERO); + + cgiSetVariable("KEYWORD", "job_sheets_start"); + cgiSetVariable("KEYTEXT", + /* TRANSLATORS: Banner/cover sheet before the print job. */ + cgiText(_("Starting Banner"))); + cgiSetVariable("DEFCHOICE", attr != NULL ? + attr->values[0].string.text : ""); + + cgiCopyTemplateLang("option-pickone.tmpl"); + + cgiSetVariable("KEYWORD", "job_sheets_end"); + cgiSetVariable("KEYTEXT", + /* TRANSLATORS: Banner/cover sheet after the print job. */ + cgiText(_("Ending Banner"))); + cgiSetVariable("DEFCHOICE", attr != NULL && attr->num_values > 1 ? + attr->values[1].string.text : ""); + + cgiCopyTemplateLang("option-pickone.tmpl"); + + cgiCopyTemplateLang("option-trailer.tmpl"); + } + + if (ippFindAttribute(response, "printer-error-policy-supported", + IPP_TAG_ZERO) || + ippFindAttribute(response, "printer-op-policy-supported", + IPP_TAG_ZERO)) + { + /* + * Add the error and operation policy options... + */ + + cgiSetVariable("GROUP_ID", "CUPS_POLICIES"); + cgiSetVariable("GROUP", cgiText(_("Policies"))); + cgiCopyTemplateLang("option-header.tmpl"); + + /* + * Error policy... + */ + + attr = ippFindAttribute(response, "printer-error-policy-supported", + IPP_TAG_ZERO); + + if (attr) + { + cgiSetSize("CHOICES", attr->num_values); + cgiSetSize("TEXT", attr->num_values); + for (k = 0; k < attr->num_values; k ++) + { + cgiSetArray("CHOICES", k, attr->values[k].string.text); + cgiSetArray("TEXT", k, attr->values[k].string.text); + } + + attr = ippFindAttribute(response, "printer-error-policy", + IPP_TAG_ZERO); + + cgiSetVariable("KEYWORD", "printer_error_policy"); + cgiSetVariable("KEYTEXT", cgiText(_("Error Policy"))); + cgiSetVariable("DEFCHOICE", attr == NULL ? + "" : attr->values[0].string.text); + } + + cgiCopyTemplateLang("option-pickone.tmpl"); + + /* + * Operation policy... + */ + + attr = ippFindAttribute(response, "printer-op-policy-supported", + IPP_TAG_ZERO); + + if (attr) + { + cgiSetSize("CHOICES", attr->num_values); + cgiSetSize("TEXT", attr->num_values); + for (k = 0; k < attr->num_values; k ++) + { + cgiSetArray("CHOICES", k, attr->values[k].string.text); + cgiSetArray("TEXT", k, attr->values[k].string.text); + } + + attr = ippFindAttribute(response, "printer-op-policy", IPP_TAG_ZERO); + + cgiSetVariable("KEYWORD", "printer_op_policy"); + cgiSetVariable("KEYTEXT", cgiText(_("Operation Policy"))); + cgiSetVariable("DEFCHOICE", attr == NULL ? + "" : attr->values[0].string.text); + + cgiCopyTemplateLang("option-pickone.tmpl"); + } + + cgiCopyTemplateLang("option-trailer.tmpl"); + } + + /* + * Binary protocol support... + */ + + if ((attr = ippFindAttribute(response, "port-monitor-supported", + IPP_TAG_NAME)) != NULL && attr->num_values > 1) + { + cgiSetVariable("GROUP_ID", "CUPS_PORT_MONITOR"); + cgiSetVariable("GROUP", cgiText(_("Port Monitor"))); + + cgiSetSize("CHOICES", attr->num_values); + cgiSetSize("TEXT", attr->num_values); + + for (i = 0; i < attr->num_values; i ++) + { + cgiSetArray("CHOICES", i, attr->values[i].string.text); + cgiSetArray("TEXT", i, attr->values[i].string.text); + } + + attr = ippFindAttribute(response, "port-monitor", IPP_TAG_NAME); + cgiSetVariable("KEYWORD", "port_monitor"); + cgiSetVariable("KEYTEXT", cgiText(_("Port Monitor"))); + cgiSetVariable("DEFCHOICE", attr ? attr->values[0].string.text : "none"); + + cgiCopyTemplateLang("option-header.tmpl"); + cgiCopyTemplateLang("option-pickone.tmpl"); + cgiCopyTemplateLang("option-trailer.tmpl"); + } + + cgiCopyTemplateLang("set-printer-options-trailer.tmpl"); + cgiEndHTML(); + + ippDelete(response); + } + else + { + /* + * Set default options... + */ + + fputs("DEBUG: Setting options...\n", stderr); + + if (filename) + { + out = cupsTempFile2(tempfile, sizeof(tempfile)); + in = cupsFileOpen(filename, "r"); + + if (!in || !out) + { + cgiSetVariable("ERROR", strerror(errno)); + cgiStartHTML(cgiText(_("Set Printer Options"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + if (in) + cupsFileClose(in); + + if (out) + { + cupsFileClose(out); + unlink(tempfile); + } + + unlink(filename); + return; + } + + while (cupsFileGets(in, line, sizeof(line))) + { + if (!strncmp(line, "*cupsProtocol:", 14)) + continue; + else if (strncmp(line, "*Default", 8)) + cupsFilePrintf(out, "%s\n", line); + else + { + /* + * Get default option name... + */ + + strlcpy(keyword, line + 8, sizeof(keyword)); + + for (keyptr = keyword; *keyptr; keyptr ++) + if (*keyptr == ':' || isspace(*keyptr & 255)) + break; + + *keyptr = '\0'; + + if (!strcmp(keyword, "PageRegion") || + !strcmp(keyword, "PaperDimension") || + !strcmp(keyword, "ImageableArea")) + var = get_option_value(ppd, "PageSize", value, sizeof(value)); + else + var = get_option_value(ppd, keyword, value, sizeof(value)); + + if (!var) + cupsFilePrintf(out, "%s\n", line); + else + cupsFilePrintf(out, "*Default%s: %s\n", keyword, var); + } + } + + cupsFileClose(in); + cupsFileClose(out); + } + else + { + /* + * Make sure temporary filename is cleared when there is no PPD... + */ + + tempfile[0] = '\0'; + } + + /* + * Build a CUPS_ADD_MODIFY_CLASS/PRINTER request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * job-sheets-default + * printer-error-policy + * printer-op-policy + * [ppd file] + */ + + request = ippNewRequest(is_class ? CUPS_ADD_MODIFY_CLASS : + CUPS_ADD_MODIFY_PRINTER); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + "job-sheets-default", 2, NULL, NULL); + attr->values[0].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_start")); + attr->values[1].string.text = _cupsStrAlloc(cgiGetVariable("job_sheets_end")); + + if ((var = cgiGetVariable("printer_error_policy")) != NULL) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + "printer-error-policy", NULL, var); + + if ((var = cgiGetVariable("printer_op_policy")) != NULL) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + "printer-op-policy", NULL, var); + + if ((var = cgiGetVariable("port_monitor")) != NULL) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, + "port-monitor", NULL, var); + + /* + * Do the request and get back a response... + */ + + if (filename) + ippDelete(cupsDoFileRequest(http, request, "/admin/", tempfile)); + else + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to set options:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char refresh[1024]; /* Refresh URL */ + + + cgiFormEncode(uri, printer, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=/%s/%s", + is_class ? "classes" : "printers", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + + cgiCopyTemplateLang("printer-configured.tmpl"); + } + + cgiEndHTML(); + + if (filename) + unlink(tempfile); + } + + if (filename) + unlink(filename); +} + + +/* + * 'do_set_sharing()' - Set printer-is-shared value. + */ + +static void +do_set_sharing(http_t *http) /* I - HTTP connection */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + const char *printer, /* Printer name */ + *is_class, /* Is a class? */ + *shared; /* Sharing value */ + + + is_class = cgiGetVariable("IS_CLASS"); + printer = cgiGetVariable("PRINTER_NAME"); + shared = cgiGetVariable("SHARED"); + + if (!printer || !shared) + { + cgiSetVariable("ERROR", cgiText(_("Missing form variable"))); + cgiStartHTML(cgiText(_("Set Publishing"))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + return; + } + + /* + * Build a CUPS-Add-Printer/CUPS-Add-Class request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * printer-is-shared + */ + + request = ippNewRequest(is_class ? CUPS_ADD_CLASS : CUPS_ADD_PRINTER); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, is_class ? "/classes/%s" : "/printers/%s", + printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddBoolean(request, IPP_TAG_OPERATION, "printer-is-shared", atoi(shared)); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/admin/")) != NULL) + { + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + ippDelete(response); + } + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(cgiText(_("Set Publishing"))); + cgiShowIPPError(_("Unable to change printer-is-shared attribute:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ + + + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=/admin/?OP=redirect&URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(cgiText(_("Set Publishing"))); + cgiCopyTemplateLang(is_class ? "class-modified.tmpl" : + "printer-modified.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'get_option_value()' - Return the value of an option. + * + * This function also handles generation of custom option values. + */ + +static char * /* O - Value string or NULL on error */ +get_option_value( + ppd_file_t *ppd, /* I - PPD file */ + const char *name, /* I - Option name */ + char *buffer, /* I - String buffer */ + size_t bufsize) /* I - Size of buffer */ +{ + char *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Current custom parameter */ + char keyword[256]; /* Parameter name */ + const char *val, /* Parameter value */ + *uval; /* Units value */ + long integer; /* Integer value */ + double number, /* Number value */ + number_points; /* Number in points */ + + + /* + * See if we have a custom option choice... + */ + + if ((val = cgiGetVariable(name)) == NULL) + { + /* + * Option not found! + */ + + return (NULL); + } + else if (_cups_strcasecmp(val, "Custom") || + (coption = ppdFindCustomOption(ppd, name)) == NULL) + { + /* + * Not a custom choice... + */ + + strlcpy(buffer, val, bufsize); + return (buffer); + } + + /* + * OK, we have a custom option choice, format it... + */ + + *buffer = '\0'; + + if (!strcmp(coption->keyword, "PageSize")) + { + const char *lval; /* Length string value */ + double width, /* Width value */ + width_points, /* Width in points */ + length, /* Length value */ + length_points; /* Length in points */ + + + val = cgiGetVariable("PageSize.Width"); + lval = cgiGetVariable("PageSize.Height"); + uval = cgiGetVariable("PageSize.Units"); + + if (!val || !lval || !uval || + (width = strtod(val, NULL)) == 0.0 || + (length = strtod(lval, NULL)) == 0.0 || + (strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") && + strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) + return (NULL); + + width_points = get_points(width, uval); + length_points = get_points(length, uval); + + if (width_points < ppd->custom_min[0] || + width_points > ppd->custom_max[0] || + length_points < ppd->custom_min[1] || + length_points > ppd->custom_max[1]) + return (NULL); + + snprintf(buffer, bufsize, "Custom.%gx%g%s", width, length, uval); + } + else if (cupsArrayCount(coption->params) == 1) + { + cparam = ppdFirstCustomParam(coption); + snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, cparam->name); + + if ((val = cgiGetVariable(keyword)) == NULL) + return (NULL); + + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_REAL : + if ((number = strtod(val, NULL)) == 0.0 || + number < cparam->minimum.custom_real || + number > cparam->maximum.custom_real) + return (NULL); + + snprintf(buffer, bufsize, "Custom.%g", number); + break; + + case PPD_CUSTOM_INT : + if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN || + integer == LONG_MAX || + integer < cparam->minimum.custom_int || + integer > cparam->maximum.custom_int) + return (NULL); + + snprintf(buffer, bufsize, "Custom.%ld", integer); + break; + + case PPD_CUSTOM_POINTS : + snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword); + + if ((number = strtod(val, NULL)) == 0.0 || + (uval = cgiGetVariable(keyword)) == NULL || + (strcmp(uval, "pt") && strcmp(uval, "in") && strcmp(uval, "ft") && + strcmp(uval, "cm") && strcmp(uval, "mm") && strcmp(uval, "m"))) + return (NULL); + + number_points = get_points(number, uval); + if (number_points < cparam->minimum.custom_points || + number_points > cparam->maximum.custom_points) + return (NULL); + + snprintf(buffer, bufsize, "Custom.%g%s", number, uval); + break; + + case PPD_CUSTOM_PASSCODE : + for (uval = val; *uval; uval ++) + if (!isdigit(*uval & 255)) + return (NULL); + + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + integer = (long)strlen(val); + if (integer < cparam->minimum.custom_string || + integer > cparam->maximum.custom_string) + return (NULL); + + snprintf(buffer, bufsize, "Custom.%s", val); + break; + } + } + else + { + const char *prefix = "{"; /* Prefix string */ + + + bufptr = buffer; + bufend = buffer + bufsize; + + for (cparam = ppdFirstCustomParam(coption); + cparam; + cparam = ppdNextCustomParam(coption)) + { + snprintf(keyword, sizeof(keyword), "%s.%s", coption->keyword, + cparam->name); + + if ((val = cgiGetVariable(keyword)) == NULL) + return (NULL); + + snprintf(bufptr, bufend - bufptr, "%s%s=", prefix, cparam->name); + bufptr += strlen(bufptr); + prefix = " "; + + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_REAL : + if ((number = strtod(val, NULL)) == 0.0 || + number < cparam->minimum.custom_real || + number > cparam->maximum.custom_real) + return (NULL); + + snprintf(bufptr, bufend - bufptr, "%g", number); + break; + + case PPD_CUSTOM_INT : + if (!*val || (integer = strtol(val, NULL, 10)) == LONG_MIN || + integer == LONG_MAX || + integer < cparam->minimum.custom_int || + integer > cparam->maximum.custom_int) + return (NULL); + + snprintf(bufptr, bufend - bufptr, "%ld", integer); + break; + + case PPD_CUSTOM_POINTS : + snprintf(keyword, sizeof(keyword), "%s.Units", coption->keyword); + + if ((number = strtod(val, NULL)) == 0.0 || + (uval = cgiGetVariable(keyword)) == NULL || + (strcmp(uval, "pt") && strcmp(uval, "in") && + strcmp(uval, "ft") && strcmp(uval, "cm") && + strcmp(uval, "mm") && strcmp(uval, "m"))) + return (NULL); + + number_points = get_points(number, uval); + if (number_points < cparam->minimum.custom_points || + number_points > cparam->maximum.custom_points) + return (NULL); + + snprintf(bufptr, bufend - bufptr, "%g%s", number, uval); + break; + + case PPD_CUSTOM_PASSCODE : + for (uval = val; *uval; uval ++) + if (!isdigit(*uval & 255)) + return (NULL); + + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + integer = (long)strlen(val); + if (integer < cparam->minimum.custom_string || + integer > cparam->maximum.custom_string) + return (NULL); + + if ((bufptr + 2) > bufend) + return (NULL); + + bufend --; + *bufptr++ = '\"'; + + while (*val && bufptr < bufend) + { + if (*val == '\\' || *val == '\"') + { + if ((bufptr + 1) >= bufend) + return (NULL); + + *bufptr++ = '\\'; + } + + *bufptr++ = *val++; + } + + if (bufptr >= bufend) + return (NULL); + + *bufptr++ = '\"'; + *bufptr = '\0'; + bufend ++; + break; + } + + bufptr += strlen(bufptr); + } + + if (bufptr == buffer || (bufend - bufptr) < 2) + return (NULL); + + strcpy(bufptr, "}"); + } + + return (buffer); +} + + +/* + * 'get_points()' - Get a value in points. + */ + +static double /* O - Number in points */ +get_points(double number, /* I - Original number */ + const char *uval) /* I - Units */ +{ + if (!strcmp(uval, "mm")) /* Millimeters */ + return (number * 72.0 / 25.4); + else if (!strcmp(uval, "cm")) /* Centimeters */ + return (number * 72.0 / 2.54); + else if (!strcmp(uval, "in")) /* Inches */ + return (number * 72.0); + else if (!strcmp(uval, "ft")) /* Feet */ + return (number * 72.0 * 12.0); + else if (!strcmp(uval, "m")) /* Meters */ + return (number * 72.0 / 0.0254); + else /* Points */ + return (number); +} + + +/* + * End of "$Id: admin.c 9901 2011-08-17 21:01:53Z mike $". + */ diff --git a/cgi-bin/api-cgi.header b/cgi-bin/api-cgi.header new file mode 100644 index 0000000..e3355a6 --- /dev/null +++ b/cgi-bin/api-cgi.header @@ -0,0 +1,34 @@ + + +

CGI API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cgi.h
Library-lcupscgi
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/cgi-bin/api-cgi.shtml b/cgi-bin/api-cgi.shtml new file mode 100644 index 0000000..cf0413a --- /dev/null +++ b/cgi-bin/api-cgi.shtml @@ -0,0 +1,17 @@ + + +

Overview

+ +

The CGI API provides Common Gateway Interface functions for CUPS.

diff --git a/cgi-bin/cgi-private.h b/cgi-bin/cgi-private.h new file mode 100644 index 0000000..73d80c0 --- /dev/null +++ b/cgi-bin/cgi-private.h @@ -0,0 +1,35 @@ +/* + * "$Id: cgi-private.h 9042 2010-03-24 00:45:34Z mike $" + * + * Private CGI definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" +#include +#include +#include + + +/* + * Limits... + */ + +#define CUPS_PAGE_MAX 100 /* Maximum items per page */ + + +/* + * End of "$Id: cgi-private.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cgi-bin/cgi.h b/cgi-bin/cgi.h new file mode 100644 index 0000000..c6562ab --- /dev/null +++ b/cgi-bin/cgi.h @@ -0,0 +1,119 @@ +/* + * "$Id: cgi.h 8976 2010-02-02 07:12:05Z mike $" + * + * CGI support library definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_CGI_H_ +# define _CUPS_CGI_H_ + +# include +# include +# include +# include + +# ifdef WIN32 +# include +# include +# else +# include +# endif /* WIN32 */ + +# include +# include +# include "help-index.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Types... + */ + +typedef struct cgi_file_s /**** Uploaded file data ****/ +{ + char tempfile[1024], /* Temporary file containing data */ + *name, /* Variable name */ + *filename, /* Original filename */ + *mimetype; /* MIME media type */ + size_t filesize; /* Size of uploaded file */ +} cgi_file_t; + + +/* + * Prototypes... + */ + +extern void cgiAbort(const char *title, const char *stylesheet, + const char *format, ...); +extern int cgiCheckVariables(const char *names); +extern void cgiClearVariables(void); +extern void *cgiCompileSearch(const char *query); +extern void cgiCopyTemplateFile(FILE *out, const char *tmpl); +extern void cgiCopyTemplateLang(const char *tmpl); +extern int cgiDoSearch(void *search, const char *text); +extern void cgiEndHTML(void); +extern void cgiEndMultipart(void); +extern char *cgiFormEncode(char *dst, const char *src, + size_t dstsize); +extern void cgiFreeSearch(void *search); +extern const char *cgiGetArray(const char *name, int element); +extern void cgiGetAttributes(ipp_t *request, const char *tmpl); +extern const char *cgiGetCookie(const char *name); +extern const cgi_file_t *cgiGetFile(void); +extern cups_array_t *cgiGetIPPObjects(ipp_t *response, void *search); +extern int cgiGetSize(const char *name); +extern char *cgiGetTemplateDir(void); +extern const char *cgiGetVariable(const char *name); +extern int cgiInitialize(void); +extern int cgiIsPOST(void); +extern void cgiMoveJobs(http_t *http, const char *dest, int job_id); +extern void cgiPrintCommand(http_t *http, const char *dest, + const char *command, const char *title); +extern void cgiPrintTestPage(http_t *http, const char *dest); +extern char *cgiRewriteURL(const char *uri, char *url, int urlsize, + const char *newresource); +extern void cgiSetArray(const char *name, int element, + const char *value); +extern void cgiSetCookie(const char *name, const char *value, + const char *path, const char *domain, + time_t expires, int secure); +extern ipp_attribute_t *cgiSetIPPObjectVars(ipp_attribute_t *obj, + const char *prefix, int element); +extern int cgiSetIPPVars(ipp_t *response, const char *filter_name, + const char *filter_value, + const char *prefix, int parent_el); +extern void cgiSetServerVersion(void); +extern void cgiSetSize(const char *name, int size); +extern void cgiSetVariable(const char *name, const char *value); +extern void cgiShowIPPError(const char *message); +extern void cgiShowJobs(http_t *http, const char *dest); +extern void cgiStartHTML(const char *title); +extern void cgiStartMultipart(void); +extern int cgiSupportsMultipart(void); +extern const char *cgiText(const char *message); + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_CGI_H_ */ + +/* + * End of "$Id: cgi.h 8976 2010-02-02 07:12:05Z mike $". + */ diff --git a/cgi-bin/classes.c b/cgi-bin/classes.c new file mode 100644 index 0000000..b8f5e7c --- /dev/null +++ b/cgi-bin/classes.c @@ -0,0 +1,558 @@ +/* + * "$Id: classes.c 9793 2011-05-20 03:49:49Z mike $" + * + * Class status CGI for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for CGI. + * do_class_op() - Do a class operation. + * show_all_classes() - Show all classes... + * show_class() - Show a single class. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" + + +/* + * Local functions... + */ + +static void do_class_op(http_t *http, const char *printer, ipp_op_t op, + const char *title); +static void show_all_classes(http_t *http, const char *username); +static void show_class(http_t *http, const char *printer); + + +/* + * 'main()' - Main entry for CGI. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + const char *pclass; /* Class name */ + const char *user; /* Username */ + http_t *http; /* Connection to the server */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + const char *op; /* Operation to perform, if any */ + static const char *def_attrs[] = /* Attributes for default printer */ + { + "printer-name", + "printer-uri-supported" + }; + + + /* + * Get any form variables... + */ + + cgiInitialize(); + + op = cgiGetVariable("OP"); + + /* + * Set the web interface section... + */ + + cgiSetVariable("SECTION", "classes"); + cgiSetVariable("REFRESH_PAGE", ""); + + /* + * See if we are displaying a printer or all classes... + */ + + if ((pclass = getenv("PATH_INFO")) != NULL) + { + pclass ++; + + if (!*pclass) + pclass = NULL; + + if (pclass) + cgiSetVariable("PRINTER_NAME", pclass); + } + + /* + * See who is logged in... + */ + + user = getenv("REMOTE_USER"); + + /* + * Connect to the HTTP server... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + /* + * Get the default printer... + */ + + if (!op || !cgiIsPOST()) + { + /* + * Get the default destination... + */ + + request = ippNewRequest(CUPS_GET_DEFAULT); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL) + cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text); + + if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) + { + char url[HTTP_MAX_URI]; /* New URL */ + + + cgiSetVariable("DEFAULT_URI", + cgiRewriteURL(attr->values[0].string.text, + url, sizeof(url), NULL)); + } + + ippDelete(response); + } + + /* + * See if we need to show a list of classes or the status of a + * single printer... + */ + + if (!pclass) + show_all_classes(http, user); + else + show_class(http, pclass); + } + else if (pclass) + { + if (!*op) + { + const char *server_port = getenv("SERVER_PORT"); + /* Port number string */ + int port = atoi(server_port ? server_port : "0"); + /* Port number */ + char uri[1024]; /* URL */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), + getenv("HTTPS") ? "https" : "http", NULL, + getenv("SERVER_NAME"), port, "/classes/%s", pclass); + + printf("Location: %s\n\n", uri); + } + else if (!strcmp(op, "start-class")) + do_class_op(http, pclass, IPP_RESUME_PRINTER, cgiText(_("Resume Class"))); + else if (!strcmp(op, "stop-class")) + do_class_op(http, pclass, IPP_PAUSE_PRINTER, cgiText(_("Pause Class"))); + else if (!strcmp(op, "accept-jobs")) + do_class_op(http, pclass, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); + else if (!strcmp(op, "reject-jobs")) + do_class_op(http, pclass, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); + else if (!strcmp(op, "purge-jobs")) + do_class_op(http, pclass, IPP_PURGE_JOBS, cgiText(_("Purge Jobs"))); + else if (!_cups_strcasecmp(op, "print-test-page")) + cgiPrintTestPage(http, pclass); + else if (!_cups_strcasecmp(op, "move-jobs")) + cgiMoveJobs(http, pclass, 0); + else + { + /* + * Unknown/bad operation... + */ + + cgiStartHTML(pclass); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + } + else + { + /* + * Unknown/bad operation... + */ + + cgiStartHTML(cgiText(_("Classes"))); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + + /* + * Close the HTTP server connection... + */ + + httpClose(http); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'do_class_op()' - Do a class operation. + */ + +static void +do_class_op(http_t *http, /* I - HTTP connection */ + const char *printer, /* I - Printer name */ + ipp_op_t op, /* I - Operation to perform */ + const char *title) /* I - Title of page */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI], /* Printer URI */ + resource[HTTP_MAX_URI]; /* Path for request */ + + + /* + * Build a printer request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(op); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + snprintf(resource, sizeof(resource), "/classes/%s", printer); + ippDelete(cupsDoRequest(http, request, resource)); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to do maintenance command:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ + + + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + + cgiSetVariable("IS_CLASS", "YES"); + + if (op == IPP_PAUSE_PRINTER) + cgiCopyTemplateLang("printer-stop.tmpl"); + else if (op == IPP_RESUME_PRINTER) + cgiCopyTemplateLang("printer-start.tmpl"); + else if (op == CUPS_ACCEPT_JOBS) + cgiCopyTemplateLang("printer-accept.tmpl"); + else if (op == CUPS_REJECT_JOBS) + cgiCopyTemplateLang("printer-reject.tmpl"); + else if (op == IPP_PURGE_JOBS) + cgiCopyTemplateLang("printer-purge.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'show_all_classes()' - Show all classes... + */ + +static void +show_all_classes(http_t *http, /* I - Connection to server */ + const char *user) /* I - Username */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + cups_array_t *classes; /* Array of class objects */ + ipp_attribute_t *pclass; /* Class object */ + int ascending, /* Order of classes (0 = descending) */ + first, /* First class to show */ + count; /* Number of classes */ + const char *var; /* Form variable */ + void *search; /* Search data */ + char val[1024]; /* Form variable */ + + + /* + * Show the standard header... + */ + + cgiStartHTML(cgiText(_("Classes"))); + + /* + * Build a CUPS_GET_CLASSES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_CLASSES); + + if (user) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + cgiGetAttributes(request, "classes.tmpl"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Get a list of matching job objects. + */ + + if ((var = cgiGetVariable("QUERY")) != NULL && + !cgiGetVariable("CLEAR")) + search = cgiCompileSearch(var); + else + search = NULL; + + classes = cgiGetIPPObjects(response, search); + count = cupsArrayCount(classes); + + if (search) + cgiFreeSearch(search); + + /* + * Figure out which classes to display... + */ + + if ((var = cgiGetVariable("FIRST")) != NULL) + first = atoi(var); + else + first = 0; + + if (first >= count) + first = count - CUPS_PAGE_MAX; + + first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX; + + if (first < 0) + first = 0; + + sprintf(val, "%d", count); + cgiSetVariable("TOTAL", val); + + if ((var = cgiGetVariable("ORDER")) != NULL) + ascending = !_cups_strcasecmp(var, "asc"); + else + ascending = 1; + + if (ascending) + { + for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, first); + i < CUPS_PAGE_MAX && pclass; + i ++, pclass = (ipp_attribute_t *)cupsArrayNext(classes)) + cgiSetIPPObjectVars(pclass, NULL, i); + } + else + { + for (i = 0, pclass = (ipp_attribute_t *)cupsArrayIndex(classes, count - first - 1); + i < CUPS_PAGE_MAX && pclass; + i ++, pclass = (ipp_attribute_t *)cupsArrayPrev(classes)) + cgiSetIPPObjectVars(pclass, NULL, i); + } + + /* + * Save navigation URLs... + */ + + cgiSetVariable("THISURL", "/classes/"); + + if (first > 0) + { + sprintf(val, "%d", first - CUPS_PAGE_MAX); + cgiSetVariable("PREV", val); + } + + if ((first + CUPS_PAGE_MAX) < count) + { + sprintf(val, "%d", first + CUPS_PAGE_MAX); + cgiSetVariable("NEXT", val); + } + + /* + * Then show everything... + */ + + cgiCopyTemplateLang("search.tmpl"); + + cgiCopyTemplateLang("classes-header.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + cgiCopyTemplateLang("classes.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + /* + * Delete the response... + */ + + cupsArrayDelete(classes); + ippDelete(response); + } + else + { + /* + * Show the error... + */ + + cgiShowIPPError(_("Unable to get class list:")); + } + + cgiEndHTML(); +} + + +/* + * 'show_class()' - Show a single class. + */ + +static void +show_class(http_t *http, /* I - Connection to server */ + const char *pclass) /* I - Name of class */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + char refresh[1024]; /* Refresh URL */ + + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", pclass); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + + cgiGetAttributes(request, "class.tmpl"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Got the result; set the CGI variables and check the status of a + * single-queue request... + */ + + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + if (pclass && (attr = ippFindAttribute(response, "printer-state", + IPP_TAG_ENUM)) != NULL && + attr->values[0].integer == IPP_PRINTER_PROCESSING) + { + /* + * Class is processing - automatically refresh the page until we + * are done printing... + */ + + cgiFormEncode(uri, pclass, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "10;URL=/classes/%s", uri); + cgiSetVariable("refresh_page", refresh); + } + + /* + * Delete the response... + */ + + ippDelete(response); + + /* + * Show the standard header... + */ + + cgiStartHTML(pclass); + + /* + * Show the class status... + */ + + cgiCopyTemplateLang("class.tmpl"); + + /* + * Show jobs for the specified class... + */ + + cgiCopyTemplateLang("class-jobs-header.tmpl"); + cgiShowJobs(http, pclass); + } + else + { + /* + * Show the IPP error... + */ + + cgiStartHTML(pclass); + cgiShowIPPError(_("Unable to get class status:")); + } + + cgiEndHTML(); +} + + +/* + * End of "$Id: classes.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/help-index.c b/cgi-bin/help-index.c new file mode 100644 index 0000000..ce97be3 --- /dev/null +++ b/cgi-bin/help-index.c @@ -0,0 +1,1331 @@ +/* + * "$Id: help-index.c 9793 2011-05-20 03:49:49Z mike $" + * + * Online help index routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * helpDeleteIndex() - Delete an index, freeing all memory used. + * helpFindNode() - Find a node in an index. + * helpLoadIndex() - Load a help index from disk. + * helpSaveIndex() - Save a help index to disk. + * helpSearchIndex() - Search an index. + * help_add_word() - Add a word to a node. + * help_compile_search() - Convert a search string into a regular expression. + * help_delete_node() - Free all memory used by a node. + * help_delete_word() - Free all memory used by a word. + * help_load_directory() - Load a directory of files into an index. + * help_load_file() - Load a HTML files into an index. + * help_new_node() - Create a new node and add it to an index. + * help_sort_nodes_by_name() - Sort nodes by section, filename, and anchor. + * help_sort_nodes_by_score() - Sort nodes by score and text. + * help_sort_words() - Sort words alphabetically. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" +#include + + +/* + * List of common English words that should not be indexed... + */ + +static char help_common_words[][6] = + { + "about", + "all", + "an", + "and", + "are", + "as", + "at", + "be", + "been", + "but", + "by", + "call", + "can", + "come", + "could", + "day", + "did", + "do", + "down", + "each", + "find", + "first", + "for", + "from", + "go", + "had", + "has", + "have", + "he", + "her", + "him", + "his", + "hot", + "how", + "if", + "in", + "is", + "it", + "know", + "like", + "long", + "look", + "make", + "many", + "may", + "more", + "most", + "my", + "no", + "now", + "of", + "on", + "one", + "or", + "other", + "out", + "over", + "said", + "see", + "she", + "side", + "so", + "some", + "sound", + "than", + "that", + "the", + "their", + "them", + "then", + "there", + "these", + "they", + "thing", + "this", + "time", + "to", + "two", + "up", + "use", + "was", + "water", + "way", + "we", + "were", + "what", + "when", + "which", + "who", + "will", + "with", + "word", + "would", + "write", + "you", + "your" + }; + + +/* + * Local functions... + */ + +static help_word_t *help_add_word(help_node_t *n, const char *text); +static void help_delete_node(help_node_t *n); +static void help_delete_word(help_word_t *w); +static int help_load_directory(help_index_t *hi, + const char *directory, + const char *relative); +static int help_load_file(help_index_t *hi, + const char *filename, + const char *relative, + time_t mtime); +static help_node_t *help_new_node(const char *filename, const char *anchor, + const char *section, const char *text, + time_t mtime, off_t offset, + size_t length); +static int help_sort_by_name(help_node_t *p1, help_node_t *p2); +static int help_sort_by_score(help_node_t *p1, help_node_t *p2); +static int help_sort_words(help_word_t *w1, help_word_t *w2); + + +/* + * 'helpDeleteIndex()' - Delete an index, freeing all memory used. + */ + +void +helpDeleteIndex(help_index_t *hi) /* I - Help index */ +{ + help_node_t *node; /* Current node */ + + + DEBUG_printf(("helpDeleteIndex(hi=%p)\n", hi)); + + if (!hi) + return; + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + { + if (!hi->search) + help_delete_node(node); + } + + cupsArrayDelete(hi->nodes); + cupsArrayDelete(hi->sorted); + + free(hi); +} + + +/* + * 'helpFindNode()' - Find a node in an index. + */ + +help_node_t * /* O - Node pointer or NULL */ +helpFindNode(help_index_t *hi, /* I - Index */ + const char *filename, /* I - Filename */ + const char *anchor) /* I - Anchor */ +{ + help_node_t key; /* Search key */ + + + DEBUG_printf(("helpFindNode(hi=%p, filename=\"%s\", anchor=\"%s\")\n", + hi, filename ? filename : "(nil)", anchor ? anchor : "(nil)")); + + /* + * Range check input... + */ + + if (!hi || !filename) + return (NULL); + + /* + * Initialize the search key... + */ + + key.filename = (char *)filename; + key.anchor = (char *)anchor; + + /* + * Return any match... + */ + + return ((help_node_t *)cupsArrayFind(hi->nodes, &key)); +} + + +/* + * 'helpLoadIndex()' - Load a help index from disk. + */ + +help_index_t * /* O - Index pointer or NULL */ +helpLoadIndex(const char *hifile, /* I - Index filename */ + const char *directory) /* I - Directory that is indexed */ +{ + help_index_t *hi; /* Help index */ + cups_file_t *fp; /* Current file */ + char line[2048], /* Line from file */ + *ptr, /* Pointer into line */ + *filename, /* Filename in line */ + *anchor, /* Anchor in line */ + *sectptr, /* Section pointer in line */ + section[1024], /* Section name */ + *text; /* Text in line */ + time_t mtime; /* Modification time */ + off_t offset; /* Offset into file */ + size_t length; /* Length in bytes */ + int update; /* Update? */ + help_node_t *node; /* Current node */ + help_word_t *word; /* Current word */ + + + DEBUG_printf(("helpLoadIndex(hifile=\"%s\", directory=\"%s\")\n", + hifile, directory)); + + /* + * Create a new, empty index. + */ + + if ((hi = (help_index_t *)calloc(1, sizeof(help_index_t))) == NULL) + return (NULL); + + hi->nodes = cupsArrayNew((cups_array_func_t)help_sort_by_name, NULL); + hi->sorted = cupsArrayNew((cups_array_func_t)help_sort_by_score, NULL); + + if (!hi->nodes || !hi->sorted) + { + cupsArrayDelete(hi->nodes); + cupsArrayDelete(hi->sorted); + free(hi); + return (NULL); + } + + /* + * Try loading the existing index file... + */ + + if ((fp = cupsFileOpen(hifile, "r")) != NULL) + { + /* + * Lock the file and then read the first line... + */ + + cupsFileLock(fp, 1); + + if (cupsFileGets(fp, line, sizeof(line)) && !strcmp(line, "HELPV2")) + { + /* + * Got a valid header line, now read the data lines... + */ + + node = NULL; + + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Each line looks like one of the following: + * + * filename mtime offset length "section" "text" + * filename#anchor offset length "text" + * SP count word + */ + + if (line[0] == ' ') + { + /* + * Read a word in the current node... + */ + + if (!node || (ptr = strrchr(line, ' ')) == NULL) + continue; + + if ((word = help_add_word(node, ptr + 1)) != NULL) + word->count = atoi(line + 1); + } + else + { + /* + * Add a node... + */ + + filename = line; + + if ((ptr = strchr(line, ' ')) == NULL) + break; + + while (isspace(*ptr & 255)) + *ptr++ = '\0'; + + if ((anchor = strrchr(filename, '#')) != NULL) + { + *anchor++ = '\0'; + mtime = 0; + } + else + mtime = strtol(ptr, &ptr, 10); + + offset = strtoll(ptr, &ptr, 10); + length = strtoll(ptr, &ptr, 10); + + while (isspace(*ptr & 255)) + ptr ++; + + if (!anchor) + { + /* + * Get section... + */ + + if (*ptr != '\"') + break; + + ptr ++; + sectptr = ptr; + + while (*ptr && *ptr != '\"') + ptr ++; + + if (*ptr != '\"') + break; + + *ptr++ = '\0'; + + strlcpy(section, sectptr, sizeof(section)); + + while (isspace(*ptr & 255)) + ptr ++; + } + + if (*ptr != '\"') + break; + + ptr ++; + text = ptr; + + while (*ptr && *ptr != '\"') + ptr ++; + + if (*ptr != '\"') + break; + + *ptr++ = '\0'; + + if ((node = help_new_node(filename, anchor, section, text, + mtime, offset, length)) == NULL) + break; + + node->score = -1; + + cupsArrayAdd(hi->nodes, node); + } + } + } + + cupsFileClose(fp); + } + + /* + * Scan for new/updated files... + */ + + update = help_load_directory(hi, directory, NULL); + + /* + * Remove any files that are no longer installed... + */ + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + if (node->score < 0) + { + /* + * Delete this node... + */ + + cupsArrayRemove(hi->nodes, node); + help_delete_node(node); + } + + /* + * Add nodes to the sorted array... + */ + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + cupsArrayAdd(hi->sorted, node); + + /* + * Save the index if we updated it... + */ + + if (update) + helpSaveIndex(hi, hifile); + + /* + * Return the index... + */ + + return (hi); +} + + +/* + * 'helpSaveIndex()' - Save a help index to disk. + */ + +int /* O - 0 on success, -1 on error */ +helpSaveIndex(help_index_t *hi, /* I - Index */ + const char *hifile) /* I - Index filename */ +{ + cups_file_t *fp; /* Index file */ + help_node_t *node; /* Current node */ + help_word_t *word; /* Current word */ + + + DEBUG_printf(("helpSaveIndex(hi=%p, hifile=\"%s\")\n", hi, hifile)); + + /* + * Try creating a new index file... + */ + + if ((fp = cupsFileOpen(hifile, "w9")) == NULL) + return (-1); + + /* + * Lock the file while we write it... + */ + + cupsFileLock(fp, 1); + + cupsFilePuts(fp, "HELPV2\n"); + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + { + /* + * Write the current node with/without the anchor... + */ + + if (node->anchor) + { + if (cupsFilePrintf(fp, "%s#%s " CUPS_LLFMT " " CUPS_LLFMT " \"%s\"\n", + node->filename, node->anchor, + CUPS_LLCAST node->offset, CUPS_LLCAST node->length, + node->text) < 0) + break; + } + else + { + if (cupsFilePrintf(fp, "%s %d " CUPS_LLFMT " " CUPS_LLFMT " \"%s\" \"%s\"\n", + node->filename, (int)node->mtime, + CUPS_LLCAST node->offset, CUPS_LLCAST node->length, + node->section ? node->section : "", node->text) < 0) + break; + } + + /* + * Then write the words associated with the node... + */ + + for (word = (help_word_t *)cupsArrayFirst(node->words); + word; + word = (help_word_t *)cupsArrayNext(node->words)) + if (cupsFilePrintf(fp, " %d %s\n", word->count, word->text) < 0) + break; + } + + cupsFileFlush(fp); + + if (cupsFileClose(fp) < 0) + return (-1); + else if (node) + return (-1); + else + return (0); +} + + +/* + * 'helpSearchIndex()' - Search an index. + */ + +help_index_t * /* O - Search index */ +helpSearchIndex(help_index_t *hi, /* I - Index */ + const char *query, /* I - Query string */ + const char *section, /* I - Limit search to this section */ + const char *filename) /* I - Limit search to this file */ +{ + help_index_t *search; /* Search index */ + help_node_t *node; /* Current node */ + help_word_t *word; /* Current word */ + void *sc; /* Search context */ + int matches; /* Number of matches */ + + + DEBUG_printf(("helpSearchIndex(hi=%p, query=\"%s\", filename=\"%s\")\n", + hi, query ? query : "(nil)", + filename ? filename : "(nil)")); + + /* + * Range check... + */ + + if (!hi || !query) + return (NULL); + + /* + * Reset the scores of all nodes to 0... + */ + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + node->score = 0; + + /* + * Find the first node to search in... + */ + + if (filename) + { + node = helpFindNode(hi, filename, NULL); + if (!node) + return (NULL); + } + else + node = (help_node_t *)cupsArrayFirst(hi->nodes); + + /* + * Convert the query into a regular expression... + */ + + sc = cgiCompileSearch(query); + if (!sc) + return (NULL); + + /* + * Allocate a search index... + */ + + search = calloc(1, sizeof(help_index_t)); + if (!search) + { + cgiFreeSearch(sc); + return (NULL); + } + + search->nodes = cupsArrayNew((cups_array_func_t)help_sort_by_name, NULL); + search->sorted = cupsArrayNew((cups_array_func_t)help_sort_by_score, NULL); + + if (!search->nodes || !search->sorted) + { + cupsArrayDelete(search->nodes); + cupsArrayDelete(search->sorted); + free(search); + cgiFreeSearch(sc); + return (NULL); + } + + search->search = 1; + + /* + * Check each node in the index, adding matching nodes to the + * search index... + */ + + for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes)) + if (section && strcmp(node->section, section)) + continue; + else if (filename && strcmp(node->filename, filename)) + continue; + else + { + matches = cgiDoSearch(sc, node->text); + + for (word = (help_word_t *)cupsArrayFirst(node->words); + word; + word = (help_word_t *)cupsArrayNext(node->words)) + if (cgiDoSearch(sc, word->text) > 0) + matches += word->count; + + if (matches > 0) + { + /* + * Found a match, add the node to the search index... + */ + + node->score = matches; + + cupsArrayAdd(search->nodes, node); + cupsArrayAdd(search->sorted, node); + } + } + + /* + * Free the search context... + */ + + cgiFreeSearch(sc); + + /* + * Return the results... + */ + + return (search); +} + + +/* + * 'help_add_word()' - Add a word to a node. + */ + +static help_word_t * /* O - New word */ +help_add_word(help_node_t *n, /* I - Node */ + const char *text) /* I - Word text */ +{ + help_word_t *w, /* New word */ + key; /* Search key */ + + + DEBUG_printf(("help_add_word(n=%p, text=\"%s\")\n", n, text)); + + /* + * Create the words array as needed... + */ + + if (!n->words) + n->words = cupsArrayNew((cups_array_func_t)help_sort_words, NULL); + + /* + * See if the word is already added... + */ + + key.text = (char *)text; + + if ((w = (help_word_t *)cupsArrayFind(n->words, &key)) == NULL) + { + /* + * Create a new word... + */ + + if ((w = calloc(1, sizeof(help_word_t))) == NULL) + return (NULL); + + if ((w->text = strdup(text)) == NULL) + { + free(w); + return (NULL); + } + + cupsArrayAdd(n->words, w); + } + + /* + * Bump the counter for this word and return it... + */ + + w->count ++; + + return (w); +} + + +/* + * 'help_delete_node()' - Free all memory used by a node. + */ + +static void +help_delete_node(help_node_t *n) /* I - Node */ +{ + help_word_t *w; /* Current word */ + + + DEBUG_printf(("help_delete_node(n=%p)\n", n)); + + if (!n) + return; + + if (n->filename) + free(n->filename); + + if (n->anchor) + free(n->anchor); + + if (n->section) + free(n->section); + + if (n->text) + free(n->text); + + for (w = (help_word_t *)cupsArrayFirst(n->words); + w; + w = (help_word_t *)cupsArrayNext(n->words)) + help_delete_word(w); + + cupsArrayDelete(n->words); + + free(n); +} + + +/* + * 'help_delete_word()' - Free all memory used by a word. + */ + +static void +help_delete_word(help_word_t *w) /* I - Word */ +{ + DEBUG_printf(("help_delete_word(w=%p)\n", w)); + + if (!w) + return; + + if (w->text) + free(w->text); + + free(w); +} + + +/* + * 'help_load_directory()' - Load a directory of files into an index. + */ + +static int /* O - 0 = success, -1 = error, 1 = updated */ +help_load_directory( + help_index_t *hi, /* I - Index */ + const char *directory, /* I - Directory */ + const char *relative) /* I - Relative path */ +{ + cups_dir_t *dir; /* Directory file */ + cups_dentry_t *dent; /* Directory entry */ + char *ext, /* Pointer to extension */ + filename[1024], /* Full filename */ + relname[1024]; /* Relative filename */ + int update; /* Updated? */ + help_node_t *node; /* Current node */ + + + DEBUG_printf(("help_load_directory(hi=%p, directory=\"%s\", relative=\"%s\")\n", + hi, directory ? directory : "(nil)", relative ? relative : "(nil)")); + + /* + * Open the directory and scan it... + */ + + if ((dir = cupsDirOpen(directory)) == NULL) + return (0); + + update = 0; + + while ((dent = cupsDirRead(dir)) != NULL) + { + /* + * Skip "." files... + */ + + if (dent->filename[0] == '.') + continue; + + /* + * Get absolute and relative filenames... + */ + + snprintf(filename, sizeof(filename), "%s/%s", directory, dent->filename); + if (relative) + snprintf(relname, sizeof(relname), "%s/%s", relative, dent->filename); + else + strlcpy(relname, dent->filename, sizeof(relname)); + + /* + * Check if we have a HTML file... + */ + + if ((ext = strstr(dent->filename, ".html")) != NULL && + (!ext[5] || !strcmp(ext + 5, ".gz"))) + { + /* + * HTML file, see if we have already indexed the file... + */ + + if ((node = helpFindNode(hi, relname, NULL)) != NULL) + { + /* + * File already indexed - check dates to confirm that the + * index is up-to-date... + */ + + if (node->mtime == dent->fileinfo.st_mtime) + { + /* + * Same modification time, so mark all of the nodes + * for this file as up-to-date... + */ + + for (; node; node = (help_node_t *)cupsArrayNext(hi->nodes)) + if (!strcmp(node->filename, relname)) + node->score = 0; + else + break; + + continue; + } + } + + update = 1; + + help_load_file(hi, filename, relname, dent->fileinfo.st_mtime); + } + else if (S_ISDIR(dent->fileinfo.st_mode)) + { + /* + * Process sub-directory... + */ + + if (help_load_directory(hi, filename, relname) == 1) + update = 1; + } + } + + cupsDirClose(dir); + + return (update); +} + + +/* + * 'help_load_file()' - Load a HTML files into an index. + */ + +static int /* O - 0 = success, -1 = error */ +help_load_file( + help_index_t *hi, /* I - Index */ + const char *filename, /* I - Filename */ + const char *relative, /* I - Relative path */ + time_t mtime) /* I - Modification time */ +{ + cups_file_t *fp; /* HTML file */ + help_node_t *node; /* Current node */ + char line[1024], /* Line from file */ + temp[1024], /* Temporary word */ + section[1024], /* Section */ + *ptr, /* Pointer into line */ + *anchor, /* Anchor name */ + *text; /* Text for anchor */ + off_t offset; /* File offset */ + char quote; /* Quote character */ + help_word_t *word; /* Current word */ + int wordlen; /* Length of word */ + + + DEBUG_printf(("help_load_file(hi=%p, filename=\"%s\", relative=\"%s\", mtime=%ld)\n", + hi, filename ? filename : "(nil)", + relative ? relative : "(nil)", mtime)); + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + return (-1); + + node = NULL; + offset = 0; + + strcpy(section, "Other"); + + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Look for "", "<A NAME", or "<!-- SECTION:" prefix... + */ + + if (!_cups_strncasecmp(line, "<!-- SECTION:", 13)) + { + /* + * Got section line, copy it! + */ + + for (ptr = line + 13; isspace(*ptr & 255); ptr ++); + + strlcpy(section, ptr, sizeof(section)); + if ((ptr = strstr(section, "-->")) != NULL) + { + /* + * Strip comment stuff from end of line... + */ + + for (*ptr-- = '\0'; ptr > line && isspace(*ptr & 255); *ptr-- = '\0'); + + if (isspace(*ptr & 255)) + *ptr = '\0'; + } + continue; + } + + for (ptr = line; (ptr = strchr(ptr, '<')) != NULL;) + { + ptr ++; + + if (!_cups_strncasecmp(ptr, "TITLE>", 6)) + { + /* + * Found the title... + */ + + anchor = NULL; + ptr += 6; + } + else if (!_cups_strncasecmp(ptr, "A NAME=", 7)) + { + /* + * Found an anchor... + */ + + ptr += 7; + + if (*ptr == '\"' || *ptr == '\'') + { + /* + * Get quoted anchor... + */ + + quote = *ptr; + anchor = ptr + 1; + if ((ptr = strchr(anchor, quote)) != NULL) + *ptr++ = '\0'; + else + break; + } + else + { + /* + * Get unquoted anchor... + */ + + anchor = ptr + 1; + + for (ptr = anchor; *ptr && *ptr != '>' && !isspace(*ptr & 255); ptr ++); + + if (*ptr) + *ptr++ = '\0'; + else + break; + } + + /* + * Got the anchor, now lets find the end... + */ + + while (*ptr && *ptr != '>') + ptr ++; + + if (*ptr != '>') + break; + + ptr ++; + } + else + continue; + + /* + * Now collect text for the link... + */ + + text = ptr; + while ((ptr = strchr(text, '<')) == NULL) + { + ptr = text + strlen(text); + if (ptr >= (line + sizeof(line) - 2)) + break; + + *ptr++ = ' '; + + if (!cupsFileGets(fp, ptr, sizeof(line) - (ptr - line) - 1)) + break; + } + + *ptr = '\0'; + + if (node) + node->length = offset - node->offset; + + if (!*text) + { + node = NULL; + break; + } + + if ((node = helpFindNode(hi, relative, anchor)) != NULL) + { + /* + * Node already in the index, so replace the text and other + * data... + */ + + cupsArrayRemove(hi->nodes, node); + + if (node->section) + free(node->section); + + if (node->text) + free(node->text); + + if (node->words) + { + for (word = (help_word_t *)cupsArrayFirst(node->words); + word; + word = (help_word_t *)cupsArrayNext(node->words)) + help_delete_word(word); + + cupsArrayDelete(node->words); + node->words = NULL; + } + + node->section = section[0] ? strdup(section) : NULL; + node->text = strdup(text); + node->mtime = mtime; + node->offset = offset; + node->score = 0; + } + else + { + /* + * New node... + */ + + node = help_new_node(relative, anchor, section, text, mtime, offset, 0); + } + + /* + * Go through the text value and replace tabs and newlines with + * whitespace and eliminate extra whitespace... + */ + + for (ptr = node->text, text = node->text; *ptr;) + if (isspace(*ptr & 255)) + { + while (isspace(*ptr & 255)) + ptr ++; + + *text++ = ' '; + } + else if (text != ptr) + *text++ = *ptr++; + else + { + text ++; + ptr ++; + } + + *text = '\0'; + + /* + * (Re)add the node to the array... + */ + + cupsArrayAdd(hi->nodes, node); + + if (!anchor) + node = NULL; + break; + } + + if (node) + { + /* + * Scan this line for words... + */ + + for (ptr = line; *ptr; ptr ++) + { + /* + * Skip HTML stuff... + */ + + if (*ptr == '<') + { + if (!strncmp(ptr, "<!--", 4)) + { + /* + * Skip HTML comment... + */ + + if ((text = strstr(ptr + 4, "-->")) == NULL) + ptr += strlen(ptr) - 1; + else + ptr = text + 2; + } + else + { + /* + * Skip HTML element... + */ + + for (ptr ++; *ptr && *ptr != '>'; ptr ++) + { + if (*ptr == '\"' || *ptr == '\'') + { + for (quote = *ptr++; *ptr && *ptr != quote; ptr ++); + + if (!*ptr) + ptr --; + } + } + + if (!*ptr) + ptr --; + } + + continue; + } + else if (*ptr == '&') + { + /* + * Skip HTML entity... + */ + + for (ptr ++; *ptr && *ptr != ';'; ptr ++); + + if (!*ptr) + ptr --; + + continue; + } + else if (!isalnum(*ptr & 255)) + continue; + + /* + * Found the start of a word, search until we find the end... + */ + + for (text = ptr, ptr ++; *ptr && isalnum(*ptr & 255); ptr ++); + + wordlen = ptr - text; + + memcpy(temp, text, wordlen); + temp[wordlen] = '\0'; + + ptr --; + + if (wordlen > 1 && !bsearch(temp, help_common_words, + (sizeof(help_common_words) / + sizeof(help_common_words[0])), + sizeof(help_common_words[0]), + (int (*)(const void *, const void *)) + _cups_strcasecmp)) + help_add_word(node, temp); + } + } + + /* + * Get the offset of the next line... + */ + + offset = cupsFileTell(fp); + } + + cupsFileClose(fp); + + if (node) + node->length = offset - node->offset; + + return (0); +} + + +/* + * 'help_new_node()' - Create a new node and add it to an index. + */ + +static help_node_t * /* O - Node pointer or NULL on error */ +help_new_node(const char *filename, /* I - Filename */ + const char *anchor, /* I - Anchor */ + const char *section, /* I - Section */ + const char *text, /* I - Text */ + time_t mtime, /* I - Modification time */ + off_t offset, /* I - Offset in file */ + size_t length) /* I - Length in bytes */ +{ + help_node_t *n; /* Node */ + + + DEBUG_printf(("help_new_node(filename=\"%s\", anchor=\"%s\", text=\"%s\", " + "mtime=%ld, offset=%ld, length=%ld)\n", + filename ? filename : "(nil)", anchor ? anchor : "(nil)", + text ? text : "(nil)", (long)mtime, (long)offset, + (long)length)); + + n = (help_node_t *)calloc(1, sizeof(help_node_t)); + if (!n) + return (NULL); + + n->filename = strdup(filename); + n->anchor = anchor ? strdup(anchor) : NULL; + n->section = (section && *section) ? strdup(section) : NULL; + n->text = strdup(text); + n->mtime = mtime; + n->offset = offset; + n->length = length; + + return (n); +} + + +/* + * 'help_sort_nodes_by_name()' - Sort nodes by section, filename, and anchor. + */ + +static int /* O - Difference */ +help_sort_by_name(help_node_t *n1, /* I - First node */ + help_node_t *n2) /* I - Second node */ +{ + int diff; /* Difference */ + + + DEBUG_printf(("help_sort_by_name(n1=%p(%s#%s), n2=%p(%s#%s)\n", + n1, n1->filename, n1->anchor ? n1->anchor : "", + n2, n2->filename, n2->anchor ? n2->anchor : "")); + + if ((diff = strcmp(n1->filename, n2->filename)) != 0) + return (diff); + + if (!n1->anchor && !n2->anchor) + return (0); + else if (!n1->anchor) + return (-1); + else if (!n2->anchor) + return (1); + else + return (strcmp(n1->anchor, n2->anchor)); +} + + +/* + * 'help_sort_nodes_by_score()' - Sort nodes by score and text. + */ + +static int /* O - Difference */ +help_sort_by_score(help_node_t *n1, /* I - First node */ + help_node_t *n2) /* I - Second node */ +{ + int diff; /* Difference */ + + + DEBUG_printf(("help_sort_by_score(n1=%p(%d \"%s\" \"%s\"), " + "n2=%p(%d \"%s\" \"%s\")\n", + n1, n1->score, n1->section ? n1->section : "", n1->text, + n2, n2->score, n2->section ? n2->section : "", n2->text)); + + if (n1->score != n2->score) + return (n2->score - n1->score); + + if (n1->section && !n2->section) + return (1); + else if (!n1->section && n2->section) + return (-1); + else if (n1->section && n2->section && + (diff = strcmp(n1->section, n2->section)) != 0) + return (diff); + + return (_cups_strcasecmp(n1->text, n2->text)); +} + + +/* + * 'help_sort_words()' - Sort words alphabetically. + */ + +static int /* O - Difference */ +help_sort_words(help_word_t *w1, /* I - Second word */ + help_word_t *w2) /* I - Second word */ +{ + DEBUG_printf(("help_sort_words(w1=%p(\"%s\"), w2=%p(\"%s\"))\n", + w1, w1->text, w2, w2->text)); + + return (_cups_strcasecmp(w1->text, w2->text)); +} + + +/* + * End of "$Id: help-index.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/help-index.h b/cgi-bin/help-index.h new file mode 100644 index 0000000..253b587 --- /dev/null +++ b/cgi-bin/help-index.h @@ -0,0 +1,87 @@ +/* + * "$Id: help-index.h 9771 2011-05-12 05:21:56Z mike $" + * + * Online help index definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_HELP_INDEX_H_ +# define _CUPS_HELP_INDEX_H_ + +/* + * Include necessary headers... + */ + +# include <cups/array.h> + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Data structures... + */ + +typedef struct help_word_s /**** Help word structure... ****/ +{ + int count; /* Number of occurrences */ + char *text; /* Word text */ +} help_word_t; + +typedef struct help_node_s /**** Help node structure... ****/ +{ + char *filename; /* Filename, relative to help dir */ + char *section; /* Section name (NULL if none) */ + char *anchor; /* Anchor name (NULL if none) */ + char *text; /* Text in anchor */ + cups_array_t *words; /* Words after this node */ + time_t mtime; /* Last modification time */ + off_t offset; /* Offset in file */ + size_t length; /* Length in bytes */ + int score; /* Search score */ +} help_node_t; + +typedef struct help_index_s /**** Help index structure ****/ +{ + int search; /* 1 = search index, 0 = normal */ + cups_array_t *nodes; /* Nodes sorted by filename */ + cups_array_t *sorted; /* Nodes sorted by score + text */ +} help_index_t; + + +/* + * Functions... + */ + +extern void helpDeleteIndex(help_index_t *hi); +extern help_node_t *helpFindNode(help_index_t *hi, const char *filename, + const char *anchor); +extern help_index_t *helpLoadIndex(const char *hifile, const char *directory); +extern int helpSaveIndex(help_index_t *hi, const char *hifile); +extern help_index_t *helpSearchIndex(help_index_t *hi, const char *query, + const char *section, + const char *filename); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_HELP_INDEX_H_ */ + +/* + * End of "$Id: help-index.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cgi-bin/help.c b/cgi-bin/help.c new file mode 100644 index 0000000..215c98b --- /dev/null +++ b/cgi-bin/help.c @@ -0,0 +1,397 @@ +/* + * "$Id$" + * + * Online help CGI for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for CGI. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" + + +/* + * 'main()' - Main entry for CGI. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + help_index_t *hi, /* Help index */ + *si; /* Search index */ + help_node_t *n; /* Current help node */ + int i; /* Looping var */ + const char *query; /* Search query */ + const char *cache_dir; /* CUPS_CACHEDIR environment variable */ + const char *docroot; /* CUPS_DOCROOT environment variable */ + const char *helpfile, /* Current help file */ + *helptitle = NULL; /* Current help title */ + const char *topic; /* Current topic */ + char topic_data[1024]; /* Topic form data */ + const char *section; /* Current section */ + char filename[1024], /* Filename */ + directory[1024]; /* Directory */ + cups_file_t *fp; /* Help file */ + char line[1024]; /* Line from file */ + int printable; /* Show printable version? */ + + + /* + * Get any form variables... + */ + + cgiInitialize(); + + printable = cgiGetVariable("PRINTABLE") != NULL; + + /* + * Set the web interface section... + */ + + cgiSetVariable("SECTION", "help"); + cgiSetVariable("REFRESH_PAGE", ""); + + /* + * Load the help index... + */ + + if ((cache_dir = getenv("CUPS_CACHEDIR")) == NULL) + cache_dir = CUPS_CACHEDIR; + + snprintf(filename, sizeof(filename), "%s/help.index", cache_dir); + + if ((docroot = getenv("CUPS_DOCROOT")) == NULL) + docroot = CUPS_DOCROOT; + + snprintf(directory, sizeof(directory), "%s/help", docroot); + + fprintf(stderr, "DEBUG: helpLoadIndex(filename=\"%s\", directory=\"%s\")\n", + filename, directory); + + hi = helpLoadIndex(filename, directory); + if (!hi) + { + perror(filename); + + cgiStartHTML(cgiText(_("Online Help"))); + cgiSetVariable("ERROR", cgiText(_("Unable to load help index."))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + return (1); + } + + fprintf(stderr, "DEBUG: %d nodes in help index...\n", + cupsArrayCount(hi->nodes)); + + /* + * See if we are viewing a file... + */ + + for (i = 0; i < argc; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + + if ((helpfile = getenv("PATH_INFO")) != NULL) + { + helpfile ++; + + if (!*helpfile) + helpfile = NULL; + } + + if (helpfile) + { + /* + * Verify that the help file exists and is part of the index... + */ + + snprintf(filename, sizeof(filename), "%s/help/%s", docroot, helpfile); + + fprintf(stderr, "DEBUG: helpfile=\"%s\", filename=\"%s\"\n", + helpfile, filename); + + if (access(filename, R_OK)) + { + perror(filename); + + cgiStartHTML(cgiText(_("Online Help"))); + cgiSetVariable("ERROR", cgiText(_("Unable to access help file."))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + return (1); + } + + if ((n = helpFindNode(hi, helpfile, NULL)) == NULL) + { + cgiStartHTML(cgiText(_("Online Help"))); + cgiSetVariable("ERROR", cgiText(_("Help file not in index."))); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + return (1); + } + + /* + * Save the page title and help file... + */ + + helptitle = n->text; + topic = n->section; + + /* + * Send a standard page header... + */ + + if (printable) + puts("Content-Type: text/html;charset=utf-8\n"); + else + cgiStartHTML(n->text); + } + else + { + /* + * Send a standard page header... + */ + + cgiStartHTML(cgiText(_("Online Help"))); + + topic = cgiGetVariable("TOPIC"); + } + + /* + * Do a search as needed... + */ + + if (cgiGetVariable("CLEAR")) + cgiSetVariable("QUERY", ""); + + query = cgiGetVariable("QUERY"); + si = helpSearchIndex(hi, query, topic, helpfile); + + cgiClearVariables(); + if (query) + cgiSetVariable("QUERY", query); + if (topic) + cgiSetVariable("TOPIC", topic); + if (helpfile) + cgiSetVariable("HELPFILE", helpfile); + if (helptitle) + cgiSetVariable("HELPTITLE", helptitle); + + fprintf(stderr, "DEBUG: query=\"%s\", topic=\"%s\"\n", + query ? query : "(null)", topic ? topic : "(null)"); + + if (si) + { + help_node_t *nn; /* Parent node */ + + + fprintf(stderr, + "DEBUG: si=%p, si->sorted=%p, cupsArrayCount(si->sorted)=%d\n", si, + si->sorted, cupsArrayCount(si->sorted)); + + for (i = 0, n = (help_node_t *)cupsArrayFirst(si->sorted); + n; + i ++, n = (help_node_t *)cupsArrayNext(si->sorted)) + { + if (helpfile && n->anchor) + snprintf(line, sizeof(line), "#%s", n->anchor); + else if (n->anchor) + snprintf(line, sizeof(line), "/help/%s?QUERY=%s#%s", n->filename, + query ? query : "", n->anchor); + else + snprintf(line, sizeof(line), "/help/%s?QUERY=%s", n->filename, + query ? query : ""); + + cgiSetArray("QTEXT", i, n->text); + cgiSetArray("QLINK", i, line); + + if (!helpfile && n->anchor) + { + nn = helpFindNode(hi, n->filename, NULL); + + snprintf(line, sizeof(line), "/help/%s?QUERY=%s", nn->filename, + query ? query : ""); + + cgiSetArray("QPTEXT", i, nn->text); + cgiSetArray("QPLINK", i, line); + } + else + { + cgiSetArray("QPTEXT", i, ""); + cgiSetArray("QPLINK", i, ""); + } + + fprintf(stderr, "DEBUG: [%d] = \"%s\" @ \"%s\"\n", i, n->text, line); + } + + helpDeleteIndex(si); + } + + /* + * OK, now list the bookmarks within the index... + */ + + for (i = 0, section = NULL, n = (help_node_t *)cupsArrayFirst(hi->sorted); + n; + n = (help_node_t *)cupsArrayNext(hi->sorted)) + { + if (n->anchor) + continue; + + /* + * Add a section link as needed... + */ + + if (n->section && + (!section || strcmp(n->section, section))) + { + /* + * Add a link for this node... + */ + + snprintf(line, sizeof(line), "/help/?TOPIC=%s&QUERY=%s", + cgiFormEncode(topic_data, n->section, sizeof(topic_data)), + query ? query : ""); + cgiSetArray("BMLINK", i, line); + cgiSetArray("BMTEXT", i, n->section); + cgiSetArray("BMINDENT", i, "0"); + + i ++; + section = n->section; + } + + if (!topic || strcmp(n->section, topic)) + continue; + + /* + * Add a link for this node... + */ + + snprintf(line, sizeof(line), "/help/%s?TOPIC=%s&QUERY=%s", n->filename, + cgiFormEncode(topic_data, n->section, sizeof(topic_data)), + query ? query : ""); + cgiSetArray("BMLINK", i, line); + cgiSetArray("BMTEXT", i, n->text); + cgiSetArray("BMINDENT", i, "1"); + + i ++; + + if (helpfile && !strcmp(helpfile, n->filename)) + { + help_node_t *nn; /* Pointer to sub-node */ + + + cupsArraySave(hi->sorted); + + for (nn = (help_node_t *)cupsArrayFirst(hi->sorted); + nn; + nn = (help_node_t *)cupsArrayNext(hi->sorted)) + if (nn->anchor && !strcmp(helpfile, nn->filename)) + { + /* + * Add a link for this node... + */ + + snprintf(line, sizeof(line), "#%s", nn->anchor); + cgiSetArray("BMLINK", i, line); + cgiSetArray("BMTEXT", i, nn->text); + cgiSetArray("BMINDENT", i, "2"); + + i ++; + } + + cupsArrayRestore(hi->sorted); + } + } + + /* + * Show the search and bookmark content... + */ + + if (!helpfile || !printable) + cgiCopyTemplateLang("help-header.tmpl"); + else + cgiCopyTemplateLang("help-printable.tmpl"); + + /* + * If we are viewing a file, copy it in now... + */ + + if (helpfile) + { + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + int inbody; /* Are we inside the body? */ + + + inbody = 0; + + while (cupsFileGets(fp, line, sizeof(line))) + { + if (inbody) + { + if (!_cups_strncasecmp(line, "</BODY>", 7)) + break; + + printf("%s\n", line); + } + else if (!_cups_strncasecmp(line, "<BODY", 5)) + inbody = 1; + } + + cupsFileClose(fp); + } + else + { + perror(filename); + cgiSetVariable("ERROR", cgiText(_("Unable to open help file."))); + cgiCopyTemplateLang("error.tmpl"); + } + } + + /* + * Send a standard trailer... + */ + + if (!printable) + { + cgiCopyTemplateLang("help-trailer.tmpl"); + cgiEndHTML(); + } + else + puts("</BODY>\n</HTML>"); + + /* + * Delete the index... + */ + + helpDeleteIndex(hi); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * End of "$Id$". + */ diff --git a/cgi-bin/html.c b/cgi-bin/html.c new file mode 100644 index 0000000..9893298 --- /dev/null +++ b/cgi-bin/html.c @@ -0,0 +1,239 @@ +/* + * "$Id: html.c 9449 2011-01-08 00:56:50Z mike $" + * + * HTML support functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cgiEndHTML() - End a HTML page. + * cgiEndMultipart() - End the delivery of a multipart web page. + * cgiFormEncode() - Encode a string as a form variable. + * cgiStartHTML() - Start a HTML page. + * cgiStartMultipart() - Start a multipart delivery of a web page. + * cgiSupportsMultipart() - Does the browser support multi-part documents? + * cgi_null_passwd() - Return a NULL password for authentication. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" + + +/* + * Local globals... + */ + +static const char *cgi_multipart = NULL; + /* Multipart separator, if any */ + + +/* + * Local functions... + */ + +static const char *cgi_null_passwd(const char *prompt); + + +/* + * 'cgiEndHTML()' - End a HTML page. + */ + +void +cgiEndHTML(void) +{ + /* + * Send the standard trailer... + */ + + cgiCopyTemplateLang("trailer.tmpl"); +} + + +/* + * 'cgiEndMultipart()' - End the delivery of a multipart web page. + */ + +void +cgiEndMultipart(void) +{ + if (cgi_multipart) + { + printf("\n%s--\n", cgi_multipart); + fflush(stdout); + } +} + + +/* + * 'cgiFormEncode()' - Encode a string as a form variable. + */ + +char * /* O - Destination string */ +cgiFormEncode(char *dst, /* I - Destination string */ + const char *src, /* I - Source string */ + size_t dstsize) /* I - Size of destination string */ +{ + char *dstptr, /* Pointer into destination */ + *dstend; /* End of destination */ + static const char *hex = /* Hexadecimal characters */ + "0123456789ABCDEF"; + + + /* + * Mark the end of the string... + */ + + dstend = dst + dstsize - 1; + + /* + * Loop through the source string and copy... + */ + + for (dstptr = dst; *src && dstptr < dstend;) + { + switch (*src) + { + case ' ' : + /* + * Encode spaces with a "+"... + */ + + *dstptr++ = '+'; + src ++; + break; + + case '&' : + case '%' : + case '+' : + /* + * Encode special characters with %XX escape... + */ + + if (dstptr < (dstend - 2)) + { + *dstptr++ = '%'; + *dstptr++ = hex[(*src & 255) >> 4]; + *dstptr++ = hex[*src & 15]; + src ++; + } + break; + + default : + /* + * Copy other characters literally... + */ + + *dstptr++ = *src++; + break; + } + } + + /* + * Nul-terminate the destination string... + */ + + *dstptr = '\0'; + + /* + * Return the encoded string... + */ + + return (dst); +} + + +/* + * 'cgiStartHTML()' - Start a HTML page. + */ + +void +cgiStartHTML(const char *title) /* I - Title of page */ +{ + /* + * Disable any further authentication attempts... + */ + + cupsSetPasswordCB(cgi_null_passwd); + + /* + * Tell the client to expect UTF-8 encoded HTML... + */ + + if (cgi_multipart) + puts(cgi_multipart); + + puts("Content-Type: text/html;charset=utf-8\n"); + + /* + * Send a standard header... + */ + + cgiSetVariable("TITLE", title); + cgiSetServerVersion(); + + cgiCopyTemplateLang("header.tmpl"); +} + + +/* + * 'cgiStartMultipart()' - Start a multipart delivery of a web page. + */ + +void +cgiStartMultipart(void) +{ + puts("MIME-Version: 1.0\n" + "Content-Type: multipart/x-mixed-replace; boundary=\"CUPS-MULTIPART\"\n"); + fflush(stdout); + + cgi_multipart = "--CUPS-MULTIPART"; +} + + +/* + * 'cgiSupportsMultipart()' - Does the browser support multi-part documents? + */ + +int /* O - 1 if multi-part supported, 0 otherwise */ +cgiSupportsMultipart(void) +{ + /* + * Too many bug reports for browsers that don't support it, and too much pain + * to whitelist known-good browsers, so for now we just punt on multi-part + * support... :( + */ + + return (0); +} + + +/* + * 'cgi_null_passwd()' - Return a NULL password for authentication. + */ + +static const char * /* O - NULL */ +cgi_null_passwd(const char *prompt) /* I - Prompt string (unused) */ +{ + (void)prompt; + + fprintf(stderr, "DEBUG: cgi_null_passwd(prompt=\"%s\") called!\n", + prompt ? prompt : "(null)"); + + return (NULL); +} + + +/* + * End of "$Id: html.c 9449 2011-01-08 00:56:50Z mike $". + */ diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c new file mode 100644 index 0000000..8f13c27 --- /dev/null +++ b/cgi-bin/ipp-var.c @@ -0,0 +1,1592 @@ +/* + * "$Id: ipp-var.c 9793 2011-05-20 03:49:49Z mike $" + * + * CGI <-> IPP variable routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cgiGetAttributes() - Get the list of attributes that are needed by the + * template file. + * cgiGetIPPObjects() - Get the objects in an IPP response. + * cgiMoveJobs() - Move one or more jobs. + * cgiPrintCommand() - Print a CUPS command job. + * cgiPrintTestPage() - Print a test page. + * cgiRewriteURL() - Rewrite a printer URI into a web browser URL... + * cgiSetIPPObjectVars() - Set CGI variables from an IPP object. + * cgiSetIPPVars() - Set CGI variables from an IPP response. + * cgiShowIPPError() - Show the last IPP error message. + * cgiShowJobs() - Show print jobs. + * cgiText() - Return localized text. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" + + +/* + * 'cgiGetAttributes()' - Get the list of attributes that are needed + * by the template file. + */ + +void +cgiGetAttributes(ipp_t *request, /* I - IPP request */ + const char *tmpl) /* I - Base filename */ +{ + int num_attrs; /* Number of attributes */ + char *attrs[1000]; /* Attributes */ + int i; /* Looping var */ + char filename[1024], /* Filename */ + locale[16]; /* Locale name */ + const char *directory, /* Directory */ + *lang; /* Language */ + FILE *in; /* Input file */ + int ch; /* Character from file */ + char name[255], /* Name of variable */ + *nameptr; /* Pointer into name */ + + + /* + * Convert the language to a locale name... + */ + + if ((lang = getenv("LANG")) != NULL) + { + for (i = 0; lang[i] && i < 15; i ++) + if (isalnum(lang[i] & 255)) + locale[i] = tolower(lang[i]); + else + locale[i] = '_'; + + locale[i] = '\0'; + } + else + locale[0] = '\0'; + + /* + * See if we have a template file for this language... + */ + + directory = cgiGetTemplateDir(); + + snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl); + if (access(filename, 0)) + { + locale[2] = '\0'; + + snprintf(filename, sizeof(filename), "%s/%s/%s", directory, locale, tmpl); + if (access(filename, 0)) + snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl); + } + + /* + * Open the template file... + */ + + if ((in = fopen(filename, "r")) == NULL) + return; + + /* + * Loop through the file adding attribute names as needed... + */ + + num_attrs = 0; + attrs[0] = NULL; /* Eliminate compiler warning */ + + while ((ch = getc(in)) != EOF) + if (ch == '\\') + getc(in); + else if (ch == '{' && num_attrs < (sizeof(attrs) / sizeof(attrs[0]))) + { + /* + * Grab the name... + */ + + for (nameptr = name; (ch = getc(in)) != EOF;) + if (strchr("}]<>=!~ \t\n", ch)) + break; + else if (nameptr > name && ch == '?') + break; + else if (nameptr < (name + sizeof(name) - 1)) + { + if (ch == '_') + *nameptr++ = '-'; + else + *nameptr++ = ch; + } + + *nameptr = '\0'; + + if (!strncmp(name, "printer_state_history", 21)) + strcpy(name, "printer_state_history"); + + /* + * Possibly add it to the list of attributes... + */ + + for (i = 0; i < num_attrs; i ++) + if (!strcmp(attrs[i], name)) + break; + + if (i >= num_attrs) + { + attrs[num_attrs] = strdup(name); + num_attrs ++; + } + } + + /* + * If we have attributes, add a requested-attributes attribute to the + * request... + */ + + if (num_attrs > 0) + { + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", num_attrs, NULL, (const char **)attrs); + + for (i = 0; i < num_attrs; i ++) + free(attrs[i]); + } + + fclose(in); +} + + +/* + * 'cgiGetIPPObjects()' - Get the objects in an IPP response. + */ + +cups_array_t * /* O - Array of objects */ +cgiGetIPPObjects(ipp_t *response, /* I - IPP response */ + void *search) /* I - Search filter */ +{ + int i; /* Looping var */ + cups_array_t *objs; /* Array of objects */ + ipp_attribute_t *attr, /* Current attribute */ + *first; /* First attribute for object */ + ipp_tag_t group; /* Current group tag */ + int add; /* Add this object to the array? */ + + + if (!response) + return (0); + + for (add = 0, first = NULL, objs = cupsArrayNew(NULL, NULL), + group = IPP_TAG_ZERO, attr = response->attrs; + attr; + attr = attr->next) + { + if (attr->group_tag != group) + { + group = attr->group_tag; + + if (group != IPP_TAG_ZERO && group != IPP_TAG_OPERATION) + { + first = attr; + add = 0; + } + else if (add && first) + { + cupsArrayAdd(objs, first); + + add = 0; + first = NULL; + } + } + + if (attr->name && attr->group_tag != IPP_TAG_OPERATION && !add) + { + if (!search) + { + /* + * Add all objects if there is no search... + */ + + add = 1; + } + else + { + /* + * Check the search string against the string and integer values. + */ + + switch (attr->value_tag) + { + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_MIMETYPE : + for (i = 0; !add && i < attr->num_values; i ++) + if (cgiDoSearch(search, attr->values[i].string.text)) + add = 1; + break; + + case IPP_TAG_INTEGER : + for (i = 0; !add && i < attr->num_values; i ++) + { + char buf[255]; /* Number buffer */ + + + sprintf(buf, "%d", attr->values[i].integer); + + if (cgiDoSearch(search, buf)) + add = 1; + } + break; + + default : + break; + } + } + } + } + + if (add && first) + cupsArrayAdd(objs, first); + + return (objs); +} + + +/* + * 'cgiMoveJobs()' - Move one or more jobs. + * + * At least one of dest or job_id must be non-zero/NULL. + */ + +void +cgiMoveJobs(http_t *http, /* I - Connection to server */ + const char *dest, /* I - Destination or NULL */ + int job_id) /* I - Job ID or 0 for all */ +{ + int i; /* Looping var */ + const char *user; /* Username */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *name; /* Destination name */ + const char *job_printer_uri; /* JOB_PRINTER_URI form variable */ + char current_dest[1024]; /* Current destination */ + + + /* + * Make sure we have a username... + */ + + if ((user = getenv("REMOTE_USER")) == NULL) + { + puts("Status: 401\n"); + exit(0); + } + + /* + * See if the user has already selected a new destination... + */ + + if ((job_printer_uri = cgiGetVariable("JOB_PRINTER_URI")) == NULL) + { + /* + * Make sure necessary form variables are set... + */ + + if (job_id) + { + char temp[255]; /* Temporary string */ + + + sprintf(temp, "%d", job_id); + cgiSetVariable("JOB_ID", temp); + } + + if (dest) + cgiSetVariable("PRINTER_NAME", dest); + + /* + * No new destination specified, show the user what the available + * printers/classes are... + */ + + if (!dest) + { + /* + * Get the current destination for job N... + */ + + char job_uri[1024]; /* Job URI */ + + + request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + + snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", job_id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", + NULL, job_uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "job-printer-uri"); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "job-printer-uri", + IPP_TAG_URI)) != NULL) + { + /* + * Pull the name from the URI... + */ + + strlcpy(current_dest, strrchr(attr->values[0].string.text, '/') + 1, + sizeof(current_dest)); + dest = current_dest; + } + + ippDelete(response); + } + + if (!dest) + { + /* + * Couldn't get the current destination... + */ + + cgiStartHTML(cgiText(_("Move Job"))); + cgiShowIPPError(_("Unable to find destination for job")); + cgiEndHTML(); + return; + } + } + + /* + * Get the list of available destinations... + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "printer-uri-supported"); + + if (user) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type", + CUPS_PRINTER_LOCAL); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, "printer-type-mask", + CUPS_PRINTER_SCANNER); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + for (i = 0, attr = ippFindAttribute(response, "printer-uri-supported", + IPP_TAG_URI); + attr; + attr = ippFindNextAttribute(response, "printer-uri-supported", + IPP_TAG_URI)) + { + /* + * Pull the name from the URI... + */ + + name = strrchr(attr->values[0].string.text, '/') + 1; + + /* + * If the name is not the same as the current destination, add it! + */ + + if (_cups_strcasecmp(name, dest)) + { + cgiSetArray("JOB_PRINTER_URI", i, attr->values[0].string.text); + cgiSetArray("JOB_PRINTER_NAME", i, name); + i ++; + } + } + + ippDelete(response); + } + + /* + * Show the form... + */ + + if (job_id) + cgiStartHTML(cgiText(_("Move Job"))); + else + cgiStartHTML(cgiText(_("Move All Jobs"))); + + if (cgiGetSize("JOB_PRINTER_NAME") > 0) + cgiCopyTemplateLang("job-move.tmpl"); + else + { + if (job_id) + cgiSetVariable("MESSAGE", cgiText(_("Unable to move job"))); + else + cgiSetVariable("MESSAGE", cgiText(_("Unable to move jobs"))); + + cgiSetVariable("ERROR", cgiText(_("No destinations added."))); + cgiCopyTemplateLang("error.tmpl"); + } + } + else + { + /* + * Try moving the job or jobs... + */ + + char uri[1024], /* Job/printer URI */ + resource[1024], /* Post resource */ + refresh[1024]; /* Refresh URL */ + const char *job_printer_name; /* New printer name */ + + + request = ippNewRequest(CUPS_MOVE_JOB); + + if (job_id) + { + /* + * Move 1 job... + */ + + snprintf(resource, sizeof(resource), "/jobs/%d", job_id); + + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", + NULL, uri); + } + else + { + /* + * Move all active jobs on a destination... + */ + + snprintf(resource, sizeof(resource), "/%s/%s", + cgiGetVariable("SECTION"), dest); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/%s/%s", + cgiGetVariable("SECTION"), dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + } + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-printer-uri", + NULL, job_printer_uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + ippDelete(cupsDoRequest(http, request, resource)); + + /* + * Show the results... + */ + + job_printer_name = strrchr(job_printer_uri, '/') + 1; + + if (cupsLastError() <= IPP_OK_CONFLICT) + { + const char *path = strstr(job_printer_uri, "/printers/"); + if (!path) + { + path = strstr(job_printer_uri, "/classes/"); + cgiSetVariable("IS_CLASS", "YES"); + } + + if (path) + { + cgiFormEncode(uri, path, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + } + } + + if (job_id) + cgiStartHTML(cgiText(_("Move Job"))); + else + cgiStartHTML(cgiText(_("Move All Jobs"))); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + if (job_id) + cgiShowIPPError(_("Unable to move job")); + else + cgiShowIPPError(_("Unable to move jobs")); + } + else + { + cgiSetVariable("JOB_PRINTER_NAME", job_printer_name); + cgiCopyTemplateLang("job-moved.tmpl"); + } + } + + cgiEndHTML(); +} + + +/* + * 'cgiPrintCommand()' - Print a CUPS command job. + */ + +void +cgiPrintCommand(http_t *http, /* I - Connection to server */ + const char *dest, /* I - Destination printer */ + const char *command, /* I - Command to send */ + const char *title) /* I - Page/job title */ +{ + int job_id; /* Command file job */ + char uri[HTTP_MAX_URI], /* Job URI */ + resource[1024], /* Printer resource path */ + refresh[1024], /* Refresh URL */ + command_file[1024]; /* Command "file" */ + http_status_t status; /* Document status */ + cups_option_t hold_option; /* job-hold-until option */ + const char *user; /* User name */ + ipp_t *request, /* Get-Job-Attributes request */ + *response; /* Get-Job-Attributes response */ + ipp_attribute_t *attr; /* Current job attribute */ + static const char const *job_attrs[] =/* Job attributes we want */ + { + "job-state", + "job-printer-state-message" + }; + + + /* + * Create the CUPS command file... + */ + + snprintf(command_file, sizeof(command_file), "#CUPS-COMMAND\n%s\n", command); + + /* + * Show status... + */ + + if (cgiSupportsMultipart()) + { + cgiStartMultipart(); + cgiStartHTML(title); + cgiCopyTemplateLang("command.tmpl"); + cgiEndHTML(); + fflush(stdout); + } + + /* + * Send the command file job... + */ + + hold_option.name = "job-hold-until"; + hold_option.value = "no-hold"; + + if ((user = getenv("REMOTE_USER")) != NULL) + cupsSetUser(user); + else + cupsSetUser("anonymous"); + + if ((job_id = cupsCreateJob(http, dest, title, + 1, &hold_option)) < 1) + { + cgiSetVariable("MESSAGE", cgiText(_("Unable to send command to printer driver"))); + cgiSetVariable("ERROR", cupsLastErrorString()); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + if (cgiSupportsMultipart()) + cgiEndMultipart(); + return; + } + + status = cupsStartDocument(http, dest, job_id, NULL, CUPS_FORMAT_COMMAND, 1); + if (status == HTTP_CONTINUE) + status = cupsWriteRequestData(http, command_file, + strlen(command_file)); + if (status == HTTP_CONTINUE) + cupsFinishDocument(http, dest); + + if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE) + { + cgiSetVariable("MESSAGE", cgiText(_("Unable to send command to printer driver"))); + cgiSetVariable("ERROR", cupsLastErrorString()); + cgiStartHTML(title); + cgiCopyTemplateLang("error.tmpl"); + cgiEndHTML(); + + if (cgiSupportsMultipart()) + cgiEndMultipart(); + + cupsCancelJob(dest, job_id); + return; + } + + /* + * Wait for the job to complete... + */ + + if (cgiSupportsMultipart()) + { + for (;;) + { + /* + * Get the current job state... + */ + + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); + request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", + NULL, uri); + if (user) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", 2, NULL, job_attrs); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + attr = ippFindAttribute(response, "job-state", IPP_TAG_ENUM); + if (!attr || attr->values[0].integer >= IPP_JOB_STOPPED || + attr->values[0].integer == IPP_JOB_HELD) + { + ippDelete(response); + break; + } + + /* + * Job not complete, so update the status... + */ + + ippDelete(response); + + cgiStartHTML(title); + cgiCopyTemplateLang("command.tmpl"); + cgiEndHTML(); + fflush(stdout); + + sleep(5); + } + } + + /* + * Send the final page that reloads the printer's page... + */ + + snprintf(resource, sizeof(resource), "/printers/%s", dest); + + cgiFormEncode(uri, resource, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + cgiCopyTemplateLang("command.tmpl"); + cgiEndHTML(); + + if (cgiSupportsMultipart()) + cgiEndMultipart(); +} + + +/* + * 'cgiPrintTestPage()' - Print a test page. + */ + +void +cgiPrintTestPage(http_t *http, /* I - Connection to server */ + const char *dest) /* I - Destination printer/class */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + char uri[HTTP_MAX_URI], /* Printer URI */ + resource[1024], /* POST resource path */ + refresh[1024], /* Refresh URL */ + filename[1024]; /* Test page filename */ + const char *datadir; /* CUPS_DATADIR env var */ + const char *user; /* Username */ + + + /* + * See who is logged in... + */ + + user = getenv("REMOTE_USER"); + + /* + * Locate the test page file... + */ + + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + snprintf(filename, sizeof(filename), "%s/data/testprint", datadir); + + /* + * Point to the printer/class... + */ + + snprintf(resource, sizeof(resource), "/%s/%s", cgiGetVariable("SECTION"), + dest); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/%s/%s", cgiGetVariable("SECTION"), + dest); + + /* + * Build an IPP_PRINT_JOB request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + request = ippNewRequest(IPP_PRINT_JOB); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + if (user) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", + NULL, "Test Page"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoFileRequest(http, request, resource, + filename)) != NULL) + { + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + ippDelete(response); + } + + if (cupsLastError() <= IPP_OK_CONFLICT) + { + /* + * Automatically reload the printer status page... + */ + + cgiFormEncode(uri, resource, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "2;URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + } + else if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + + cgiStartHTML(cgiText(_("Print Test Page"))); + + if (cupsLastError() > IPP_OK_CONFLICT) + cgiShowIPPError(_("Unable to print test page:")); + else + { + cgiSetVariable("PRINTER_NAME", dest); + + cgiCopyTemplateLang("test-page.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'cgiRewriteURL()' - Rewrite a printer URI into a web browser URL... + */ + +char * /* O - New URL */ +cgiRewriteURL(const char *uri, /* I - Current URI */ + char *url, /* O - New URL */ + int urlsize, /* I - Size of URL buffer */ + const char *newresource) /* I - Replacement resource */ +{ + char scheme[HTTP_MAX_URI], + userpass[HTTP_MAX_URI], + hostname[HTTP_MAX_URI], + rawresource[HTTP_MAX_URI], + resource[HTTP_MAX_URI], + /* URI components... */ + *rawptr, /* Pointer into rawresource */ + *resptr; /* Pointer into resource */ + int port; /* Port number */ + static int ishttps = -1; /* Using encryption? */ + static const char *server; /* Name of server */ + static char servername[1024]; + /* Local server name */ + static const char hexchars[] = "0123456789ABCDEF"; + /* Hexadecimal conversion characters */ + + + /* + * Check if we have been called before... + */ + + if (ishttps < 0) + { + /* + * No, initialize static vars for the conversion... + * + * First get the server name associated with the client interface as + * well as the locally configured hostname. We'll check *both* of + * these to see if the printer URL is local... + */ + + if ((server = getenv("SERVER_NAME")) == NULL) + server = ""; + + httpGetHostname(NULL, servername, sizeof(servername)); + + /* + * Then flag whether we are using SSL on this connection... + */ + + ishttps = getenv("HTTPS") != NULL; + } + + /* + * Convert the URI to a URL... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), userpass, + sizeof(userpass), hostname, sizeof(hostname), &port, + rawresource, sizeof(rawresource)); + + if (!strcmp(scheme, "ipp") || + !strcmp(scheme, "http") || + !strcmp(scheme, "https")) + { + if (newresource) + { + /* + * Force the specified resource name instead of the one in the URL... + */ + + strlcpy(resource, newresource, sizeof(resource)); + } + else + { + /* + * Rewrite the resource string so it doesn't contain any + * illegal chars... + */ + + for (rawptr = rawresource, resptr = resource; *rawptr; rawptr ++) + if ((*rawptr & 128) || *rawptr == '%' || *rawptr == ' ' || + *rawptr == '#' || *rawptr == '?' || + *rawptr == '.') /* For MSIE */ + { + if (resptr < (resource + sizeof(resource) - 3)) + { + *resptr++ = '%'; + *resptr++ = hexchars[(*rawptr >> 4) & 15]; + *resptr++ = hexchars[*rawptr & 15]; + } + } + else if (resptr < (resource + sizeof(resource) - 1)) + *resptr++ = *rawptr; + + *resptr = '\0'; + } + + /* + * Map local access to a local URI... + */ + + if (!_cups_strcasecmp(hostname, "127.0.0.1") || + !_cups_strcasecmp(hostname, "[::1]") || + !_cups_strcasecmp(hostname, "localhost") || + !_cups_strncasecmp(hostname, "localhost.", 10) || + !_cups_strcasecmp(hostname, server) || + !_cups_strcasecmp(hostname, servername)) + { + /* + * Make URI relative to the current server... + */ + + strlcpy(url, resource, urlsize); + } + else + { + /* + * Rewrite URI with HTTP/HTTPS scheme... + */ + + if (userpass[0]) + snprintf(url, urlsize, "%s://%s@%s:%d%s", + ishttps ? "https" : "http", + userpass, hostname, port, resource); + else + snprintf(url, urlsize, "%s://%s:%d%s", + ishttps ? "https" : "http", + hostname, port, resource); + } + } + else + strlcpy(url, uri, urlsize); + + return (url); +} + + +/* + * 'cgiSetIPPObjectVars()' - Set CGI variables from an IPP object. + */ + +ipp_attribute_t * /* O - Next object */ +cgiSetIPPObjectVars( + ipp_attribute_t *obj, /* I - Response data to be copied... */ + const char *prefix, /* I - Prefix for name or NULL */ + int element) /* I - Parent element number */ +{ + ipp_attribute_t *attr; /* Attribute in response... */ + int i; /* Looping var */ + char name[1024], /* Name of attribute */ + *nameptr, /* Pointer into name */ + value[16384], /* Value(s) */ + *valptr; /* Pointer into value */ + struct tm *date; /* Date information */ + + + fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", " + "element=%d)\n", + obj, prefix ? prefix : "(null)", element); + + /* + * Set common CGI template variables... + */ + + if (!prefix) + cgiSetServerVersion(); + + /* + * Loop through the attributes and set them for the template... + */ + + for (attr = obj; attr && attr->group_tag != IPP_TAG_ZERO; attr = attr->next) + { + /* + * Copy the attribute name, substituting "_" for "-"... + */ + + if (!attr->name) + continue; + + if (prefix) + { + snprintf(name, sizeof(name), "%s.", prefix); + nameptr = name + strlen(name); + } + else + nameptr = name; + + for (i = 0; attr->name[i] && nameptr < (name + sizeof(name) - 1); i ++) + if (attr->name[i] == '-') + *nameptr++ = '_'; + else + *nameptr++ = attr->name[i]; + + *nameptr = '\0'; + + /* + * Add "job_printer_name" variable if we have a "job_printer_uri" + * attribute... + */ + + if (!strcmp(name, "job_printer_uri")) + { + if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL) + valptr = "unknown"; + else + valptr ++; + + cgiSetArray("job_printer_name", element, valptr); + } + + /* + * Localize event names in "notify_events" variable... + */ + + if (!strcmp(name, "notify_events")) + { + size_t remaining; /* Remaining bytes in buffer */ + + + value[0] = '\0'; + valptr = value; + + for (i = 0; i < attr->num_values; i ++) + { + if (valptr >= (value + sizeof(value) - 3)) + break; + + if (i) + { + *valptr++ = ','; + *valptr++ = ' '; + } + + remaining = sizeof(value) - (valptr - value); + + if (!strcmp(attr->values[i].string.text, "printer-stopped")) + strlcpy(valptr, _("Printer Paused"), remaining); + else if (!strcmp(attr->values[i].string.text, "printer-added")) + strlcpy(valptr, _("Printer Added"), remaining); + else if (!strcmp(attr->values[i].string.text, "printer-modified")) + strlcpy(valptr, _("Printer Modified"), remaining); + else if (!strcmp(attr->values[i].string.text, "printer-deleted")) + strlcpy(valptr, _("Printer Deleted"), remaining); + else if (!strcmp(attr->values[i].string.text, "job-created")) + strlcpy(valptr, _("Job Created"), remaining); + else if (!strcmp(attr->values[i].string.text, "job-completed")) + strlcpy(valptr, _("Job Completed"), remaining); + else if (!strcmp(attr->values[i].string.text, "job-stopped")) + strlcpy(valptr, _("Job Stopped"), remaining); + else if (!strcmp(attr->values[i].string.text, "job-config-changed")) + strlcpy(valptr, _("Job Options Changed"), remaining); + else if (!strcmp(attr->values[i].string.text, "server-restarted")) + strlcpy(valptr, _("Server Restarted"), remaining); + else if (!strcmp(attr->values[i].string.text, "server-started")) + strlcpy(valptr, _("Server Started"), remaining); + else if (!strcmp(attr->values[i].string.text, "server-stopped")) + strlcpy(valptr, _("Server Stopped"), remaining); + else if (!strcmp(attr->values[i].string.text, "server-audit")) + strlcpy(valptr, _("Server Security Auditing"), remaining); + else + strlcpy(valptr, attr->values[i].string.text, remaining); + + valptr += strlen(valptr); + } + + cgiSetArray("notify_events", element, value); + continue; + } + + /* + * Add "notify_printer_name" variable if we have a "notify_printer_uri" + * attribute... + */ + + if (!strcmp(name, "notify_printer_uri")) + { + if ((valptr = strrchr(attr->values[0].string.text, '/')) == NULL) + valptr = "unknown"; + else + valptr ++; + + cgiSetArray("notify_printer_name", element, valptr); + } + + /* + * Add "notify_recipient_name" variable if we have a "notify_recipient_uri" + * attribute, and rewrite recipient URI... + */ + + if (!strcmp(name, "notify_recipient_uri")) + { + char uri[1024], /* New URI */ + scheme[32], /* Scheme portion of URI */ + userpass[256], /* Username/password portion of URI */ + host[1024], /* Hostname portion of URI */ + resource[1024], /* Resource portion of URI */ + *options; /* Options in URI */ + int port; /* Port number */ + + + httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[0].string.text, + scheme, sizeof(scheme), userpass, sizeof(userpass), + host, sizeof(host), &port, resource, sizeof(resource)); + + if (!strcmp(scheme, "rss")) + { + /* + * RSS notification... + */ + + if ((options = strchr(resource, '?')) != NULL) + *options = '\0'; + + if (host[0]) + { + /* + * Link to remote feed... + */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), "http", + userpass, host, port, resource); + strlcpy(name, uri, sizeof(name)); + } + else + { + /* + * Link to local feed... + */ + + snprintf(uri, sizeof(uri), "/rss%s", resource); + strlcpy(name, resource + 1, sizeof(name)); + } + } + else + { + /* + * Other... + */ + + strlcpy(uri, attr->values[0].string.text, sizeof(uri)); + strlcpy(name, resource, sizeof(name)); + } + + cgiSetArray("notify_recipient_uri", element, uri); + cgiSetArray("notify_recipient_name", element, name); + continue; + } + + /* + * Add "admin_uri" variable if we have a "printer_uri_supported" + * attribute... + */ + + if (!strcmp(name, "printer_uri_supported")) + { + cgiRewriteURL(attr->values[0].string.text, value, sizeof(value), + "/admin/"); + + cgiSetArray("admin_uri", element, value); + } + + /* + * Copy values... + */ + + value[0] = '\0'; /* Initially an empty string */ + valptr = value; /* Start at the beginning */ + + for (i = 0; i < attr->num_values; i ++) + { + if (i) + strlcat(valptr, ", ", sizeof(value) - (valptr - value)); + + valptr += strlen(valptr); + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + if (strncmp(name, "time_at_", 8) == 0) + { + time_t t; /* Temporary time value */ + + t = (time_t)attr->values[i].integer; + date = localtime(&t); + + strftime(valptr, sizeof(value) - (valptr - value), "%c", date); + } + else + snprintf(valptr, sizeof(value) - (valptr - value), + "%d", attr->values[i].integer); + break; + + case IPP_TAG_BOOLEAN : + snprintf(valptr, sizeof(value) - (valptr - value), + "%d", attr->values[i].boolean); + break; + + case IPP_TAG_NOVALUE : + strlcat(valptr, "novalue", sizeof(value) - (valptr - value)); + break; + + case IPP_TAG_RANGE : + snprintf(valptr, sizeof(value) - (valptr - value), + "%d-%d", attr->values[i].range.lower, + attr->values[i].range.upper); + break; + + case IPP_TAG_RESOLUTION : + snprintf(valptr, sizeof(value) - (valptr - value), + "%dx%d%s", attr->values[i].resolution.xres, + attr->values[i].resolution.yres, + attr->values[i].resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + break; + + case IPP_TAG_URI : + if (strchr(attr->values[i].string.text, ':') && + strcmp(name, "device_uri")) + { + /* + * Rewrite URIs... + */ + + if (!strcmp(name, "member_uris")) + { + char url[1024]; /* URL for class member... */ + + + cgiRewriteURL(attr->values[i].string.text, url, + sizeof(url), NULL); + + snprintf(valptr, sizeof(value) - (valptr - value), + "<A HREF=\"%s\">%s</A>", url, + strrchr(attr->values[i].string.text, '/') + 1); + } + else + cgiRewriteURL(attr->values[i].string.text, valptr, + sizeof(value) - (valptr - value), NULL); + break; + } + + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + strlcat(valptr, attr->values[i].string.text, + sizeof(value) - (valptr - value)); + break; + + case IPP_TAG_BEGIN_COLLECTION : + snprintf(value, sizeof(value), "%s%d", name, i + 1); + cgiSetIPPVars(attr->values[i].collection, NULL, NULL, value, + element); + break; + + default : + break; /* anti-compiler-warning-code */ + } + } + + /* + * Add the element... + */ + + if (attr->value_tag != IPP_TAG_BEGIN_COLLECTION) + { + cgiSetArray(name, element, value); + + fprintf(stderr, "DEBUG2: %s[%d]=\"%s\"\n", name, element, value); + } + } + + return (attr ? attr->next : NULL); +} + + +/* + * 'cgiSetIPPVars()' - Set CGI variables from an IPP response. + */ + +int /* O - Maximum number of elements */ +cgiSetIPPVars(ipp_t *response, /* I - Response data to be copied... */ + const char *filter_name, /* I - Filter name */ + const char *filter_value, /* I - Filter value */ + const char *prefix, /* I - Prefix for name or NULL */ + int parent_el) /* I - Parent element number */ +{ + int element; /* Element in CGI array */ + ipp_attribute_t *attr, /* Attribute in response... */ + *filter; /* Filtering attribute */ + + + fprintf(stderr, "DEBUG2: cgiSetIPPVars(response=%p, filter_name=\"%s\", " + "filter_value=\"%s\", prefix=\"%s\", parent_el=%d)\n", + response, filter_name ? filter_name : "(null)", + filter_value ? filter_value : "(null)", + prefix ? prefix : "(null)", parent_el); + + /* + * Set common CGI template variables... + */ + + if (!prefix) + cgiSetServerVersion(); + + /* + * Loop through the attributes and set them for the template... + */ + + attr = response->attrs; + + if (!prefix) + while (attr && attr->group_tag == IPP_TAG_OPERATION) + attr = attr->next; + + for (element = parent_el; attr; element ++) + { + /* + * Copy attributes to a separator... + */ + + while (attr && attr->group_tag == IPP_TAG_ZERO) + attr= attr->next; + + if (!attr) + break; + + if (filter_name) + { + for (filter = attr; + filter != NULL && filter->group_tag != IPP_TAG_ZERO; + filter = filter->next) + if (filter->name && !strcmp(filter->name, filter_name) && + (filter->value_tag == IPP_TAG_STRING || + (filter->value_tag >= IPP_TAG_TEXTLANG && + filter->value_tag <= IPP_TAG_MIMETYPE)) && + filter->values[0].string.text != NULL && + !_cups_strcasecmp(filter->values[0].string.text, filter_value)) + break; + + if (!filter) + return (element + 1); + + if (filter->group_tag == IPP_TAG_ZERO) + { + attr = filter; + element --; + continue; + } + } + + attr = cgiSetIPPObjectVars(attr, prefix, element); + } + + fprintf(stderr, "DEBUG2: Returing %d from cgiSetIPPVars()...\n", element); + + return (element); +} + + +/* + * 'cgiShowIPPError()' - Show the last IPP error message. + * + * The caller must still call cgiStartHTML() and cgiEndHTML(). + */ + +void +cgiShowIPPError(const char *message) /* I - Contextual message */ +{ + cgiSetVariable("MESSAGE", cgiText(message)); + cgiSetVariable("ERROR", cupsLastErrorString()); + cgiCopyTemplateLang("error.tmpl"); +} + + +/* + * 'cgiShowJobs()' - Show print jobs. + */ + +void +cgiShowJobs(http_t *http, /* I - Connection to server */ + const char *dest) /* I - Destination name or NULL */ +{ + int i; /* Looping var */ + const char *which_jobs; /* Which jobs to show */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + cups_array_t *jobs; /* Array of job objects */ + ipp_attribute_t *job; /* Job object */ + int ascending, /* Order of jobs (0 = descending) */ + first, /* First job to show */ + count; /* Number of jobs */ + const char *var, /* Form variable */ + *query, /* Query string */ + *section; /* Section in web interface */ + void *search; /* Search data */ + char url[1024], /* Printer URI */ + val[1024]; /* Form variable */ + + + /* + * Build an IPP_GET_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_JOBS); + + if (dest) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, url, sizeof(url), "ipp", NULL, + "localhost", ippPort(), "/printers/%s", dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, url); + } + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + "ipp://localhost/"); + + if ((which_jobs = cgiGetVariable("which_jobs")) != NULL) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", + NULL, which_jobs); + + cgiGetAttributes(request, "jobs.tmpl"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Get a list of matching job objects. + */ + + if ((query = cgiGetVariable("QUERY")) != NULL && + !cgiGetVariable("CLEAR")) + search = cgiCompileSearch(query); + else + { + query = NULL; + search = NULL; + } + + jobs = cgiGetIPPObjects(response, search); + count = cupsArrayCount(jobs); + + if (search) + cgiFreeSearch(search); + + /* + * Figure out which jobs to display... + */ + + if ((var = cgiGetVariable("FIRST")) != NULL) + first = atoi(var); + else + first = 0; + + if (first >= count) + first = count - CUPS_PAGE_MAX; + + first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX; + + if (first < 0) + first = 0; + + if ((var = cgiGetVariable("ORDER")) != NULL) + ascending = !_cups_strcasecmp(var, "asc"); + else + ascending = !which_jobs || !_cups_strcasecmp(which_jobs, "not-completed"); + + section = cgiGetVariable("SECTION"); + + cgiClearVariables(); + + if (query) + cgiSetVariable("QUERY", query); + + cgiSetVariable("ORDER", ascending ? "asc" : "dec"); + + cgiSetVariable("SECTION", section); + + sprintf(val, "%d", count); + cgiSetVariable("TOTAL", val); + + if (which_jobs) + cgiSetVariable("WHICH_JOBS", which_jobs); + + if (ascending) + { + for (i = 0, job = (ipp_attribute_t *)cupsArrayIndex(jobs, first); + i < CUPS_PAGE_MAX && job; + i ++, job = (ipp_attribute_t *)cupsArrayNext(jobs)) + cgiSetIPPObjectVars(job, NULL, i); + } + else + { + for (i = 0, job = (ipp_attribute_t *)cupsArrayIndex(jobs, count - first - 1); + i < CUPS_PAGE_MAX && job; + i ++, job = (ipp_attribute_t *)cupsArrayPrev(jobs)) + cgiSetIPPObjectVars(job, NULL, i); + } + + /* + * Save navigation URLs... + */ + + if (dest) + { + snprintf(val, sizeof(val), "/%s/%s", section, dest); + cgiSetVariable("PRINTER_NAME", dest); + cgiSetVariable("PRINTER_URI_SUPPORTED", val); + } + else + strlcpy(val, "/jobs/", sizeof(val)); + + cgiSetVariable("THISURL", val); + + if (first > 0) + { + sprintf(val, "%d", first - CUPS_PAGE_MAX); + cgiSetVariable("PREV", val); + } + + if ((first + CUPS_PAGE_MAX) < count) + { + sprintf(val, "%d", first + CUPS_PAGE_MAX); + cgiSetVariable("NEXT", val); + } + + /* + * Then show everything... + */ + + if (dest) + cgiSetVariable("SEARCH_DEST", dest); + + cgiCopyTemplateLang("search.tmpl"); + + cgiCopyTemplateLang("jobs-header.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + cgiCopyTemplateLang("jobs.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + cupsArrayDelete(jobs); + ippDelete(response); + } +} + + +/* + * 'cgiText()' - Return localized text. + */ + +const char * /* O - Localized message */ +cgiText(const char *message) /* I - Message */ +{ + static cups_lang_t *language = NULL; + /* Language */ + + + if (!language) + language = cupsLangDefault(); + + return (_cupsLangString(language, message)); +} + + +/* + * End of "$Id: ipp-var.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/jobs.c b/cgi-bin/jobs.c new file mode 100644 index 0000000..6863505 --- /dev/null +++ b/cgi-bin/jobs.c @@ -0,0 +1,214 @@ +/* + * "$Id: jobs.c 9771 2011-05-12 05:21:56Z mike $" + * + * Job status CGI for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for CGI. + * do_job_op() - Do a job operation. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" + + +/* + * Local functions... + */ + +static void do_job_op(http_t *http, int job_id, ipp_op_t op); + + +/* + * 'main()' - Main entry for CGI. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + http_t *http; /* Connection to the server */ + const char *op; /* Operation name */ + const char *job_id_var; /* Job ID form variable */ + int job_id; /* Job ID */ + + + /* + * Get any form variables... + */ + + cgiInitialize(); + + /* + * Set the web interface section... + */ + + cgiSetVariable("SECTION", "jobs"); + cgiSetVariable("REFRESH_PAGE", ""); + + /* + * Connect to the HTTP server... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + /* + * Get the job ID, if any... + */ + + if ((job_id_var = cgiGetVariable("JOB_ID")) != NULL) + job_id = atoi(job_id_var); + else + job_id = 0; + + /* + * Do the operation... + */ + + if ((op = cgiGetVariable("OP")) != NULL && job_id > 0 && cgiIsPOST()) + { + /* + * Do the operation... + */ + + if (!strcmp(op, "cancel-job")) + do_job_op(http, job_id, IPP_CANCEL_JOB); + else if (!strcmp(op, "hold-job")) + do_job_op(http, job_id, IPP_HOLD_JOB); + else if (!strcmp(op, "move-job")) + cgiMoveJobs(http, NULL, job_id); + else if (!strcmp(op, "release-job")) + do_job_op(http, job_id, IPP_RELEASE_JOB); + else if (!strcmp(op, "restart-job")) + do_job_op(http, job_id, IPP_RESTART_JOB); + else + { + /* + * Bad operation code... Display an error... + */ + + cgiStartHTML(cgiText(_("Jobs"))); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + } + else + { + /* + * Show a list of jobs... + */ + + cgiStartHTML(cgiText(_("Jobs"))); + cgiShowJobs(http, NULL); + cgiEndHTML(); + } + + /* + * Close the HTTP server connection... + */ + + httpClose(http); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'do_job_op()' - Do a job operation. + */ + +static void +do_job_op(http_t *http, /* I - HTTP connection */ + int job_id, /* I - Job ID */ + ipp_op_t op) /* I - Operation to perform */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* Job URI */ + const char *user; /* Username */ + + + /* + * Build a job request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri or printer-uri (purge-jobs) + * requesting-user-name + */ + + request = ippNewRequest(op); + + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", + NULL, uri); + + if ((user = getenv("REMOTE_USER")) == NULL) + user = "guest"; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/jobs")); + + if (cupsLastError() <= IPP_OK_CONFLICT && getenv("HTTP_REFERER")) + { + /* + * Redirect successful updates back to the parent page... + */ + + char url[1024]; /* Encoded URL */ + + + strcpy(url, "5;URL="); + cgiFormEncode(url + 6, getenv("HTTP_REFERER"), sizeof(url) - 6); + cgiSetVariable("refresh_page", url); + } + else if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + + cgiStartHTML(cgiText(_("Jobs"))); + + if (cupsLastError() > IPP_OK_CONFLICT) + cgiShowIPPError(_("Job operation failed:")); + else if (op == IPP_CANCEL_JOB) + cgiCopyTemplateLang("job-cancel.tmpl"); + else if (op == IPP_HOLD_JOB) + cgiCopyTemplateLang("job-hold.tmpl"); + else if (op == IPP_RELEASE_JOB) + cgiCopyTemplateLang("job-release.tmpl"); + else if (op == IPP_RESTART_JOB) + cgiCopyTemplateLang("job-restart.tmpl"); + + cgiEndHTML(); +} + + +/* + * End of "$Id: jobs.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cgi-bin/libcupscgi.exp b/cgi-bin/libcupscgi.exp new file mode 100644 index 0000000..3a26229 --- /dev/null +++ b/cgi-bin/libcupscgi.exp @@ -0,0 +1,42 @@ +_cgiCheckVariables +_cgiClearVariables +_cgiCompileSearch +_cgiCopyTemplateFile +_cgiCopyTemplateLang +_cgiDoSearch +_cgiEndHTML +_cgiEndMultipart +_cgiFormEncode +_cgiFreeSearch +_cgiGetArray +_cgiGetAttributes +_cgiGetCookie +_cgiGetFile +_cgiGetIPPObjects +_cgiGetSize +_cgiGetTemplateDir +_cgiGetVariable +_cgiInitialize +_cgiIsPOST +_cgiMoveJobs +_cgiPrintCommand +_cgiPrintTestPage +_cgiRewriteURL +_cgiSetArray +_cgiSetIPPObjectVars +_cgiSetIPPVars +_cgiSetCookie +_cgiSetServerVersion +_cgiSetSize +_cgiSetVariable +_cgiShowIPPError +_cgiShowJobs +_cgiStartHTML +_cgiStartMultipart +_cgiSupportsMultipart +_cgiText +_helpDeleteIndex +_helpFindNode +_helpLoadIndex +_helpSaveIndex +_helpSearchIndex diff --git a/cgi-bin/makedocset.c b/cgi-bin/makedocset.c new file mode 100644 index 0000000..a87f9ce --- /dev/null +++ b/cgi-bin/makedocset.c @@ -0,0 +1,486 @@ +/* + * "$Id: makedocset.c 9793 2011-05-20 03:49:49Z mike $" + * + * Xcode documentation set generator. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Usage: + * + * makedocset directory *.tokens + * + * Contents: + * + * main() - Test the help index code. + * compare_html() - Compare the titles of two HTML files. + * compare_sections() - Compare the names of two help sections. + * compare_sections_files() - Compare the number of files and section names. + * write_index() - Write an index file for the CUPS help. + * write_info() - Write the Info.plist file. + * write_nodes() - Write the Nodes.xml file. + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" +#include <errno.h> + + +/* + * Local structures... + */ + +typedef struct _cups_html_s /**** Help file ****/ +{ + char *path; /* Path to help file */ + char *title; /* Title of help file */ +} _cups_html_t; + +typedef struct _cups_section_s /**** Help section ****/ +{ + char *name; /* Section name */ + cups_array_t *files; /* Files in this section */ +} _cups_section_t; + + +/* + * Local functions... + */ + +static int compare_html(_cups_html_t *a, _cups_html_t *b); +static int compare_sections(_cups_section_t *a, _cups_section_t *b); +static int compare_sections_files(_cups_section_t *a, _cups_section_t *b); +static void write_index(const char *path, help_index_t *hi); +static void write_info(const char *path, const char *revision); +static void write_nodes(const char *path, help_index_t *hi); + + +/* + * 'main()' - Test the help index code. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char path[1024], /* Path to documentation */ + line[1024]; /* Line from file */ + help_index_t *hi; /* Help index */ + cups_file_t *tokens, /* Tokens.xml file */ + *fp; /* Current file */ + + + if (argc < 4) + { + puts("Usage: makedocset directory revision *.tokens"); + return (1); + } + + /* + * Index the help documents... + */ + + snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation", argv[1]); + if ((hi = helpLoadIndex(NULL, path)) == NULL) + { + fputs("makedocset: Unable to index help files!\n", stderr); + return (1); + } + + snprintf(path, sizeof(path), "%s/Contents/Resources/Documentation/index.html", + argv[1]); + write_index(path, hi); + + snprintf(path, sizeof(path), "%s/Contents/Resources/Nodes.xml", argv[1]); + write_nodes(path, hi); + + /* + * Write the Info.plist file... + */ + + snprintf(path, sizeof(path), "%s/Contents/Info.plist", argv[1]); + write_info(path, argv[2]); + + /* + * Merge the Tokens.xml files... + */ + + snprintf(path, sizeof(path), "%s/Contents/Resources/Tokens.xml", argv[1]); + if ((tokens = cupsFileOpen(path, "w")) == NULL) + { + fprintf(stderr, "makedocset: Unable to create \"%s\": %s\n", path, + strerror(errno)); + return (1); + } + + cupsFilePuts(tokens, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + cupsFilePuts(tokens, "<Tokens version=\"1.0\">\n"); + + for (i = 3; i < argc; i ++) + { + if ((fp = cupsFileOpen(argv[i], "r")) == NULL) + { + fprintf(stderr, "makedocset: Unable to open \"%s\": %s\n", argv[i], + strerror(errno)); + return (1); + } + + if (!cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "<?xml ", 6) || + !cupsFileGets(fp, line, sizeof(line)) || strncmp(line, "<Tokens ", 8)) + { + fprintf(stderr, "makedocset: Bad Tokens.xml file \"%s\"!\n", argv[i]); + return (1); + } + + while (cupsFileGets(fp, line, sizeof(line))) + { + if (strcmp(line, "</Tokens>")) + cupsFilePrintf(tokens, "%s\n", line); + } + + cupsFileClose(fp); + } + + cupsFilePuts(tokens, "</Tokens>\n"); + + cupsFileClose(tokens); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'compare_html()' - Compare the titles of two HTML files. + */ + +static int /* O - Result of comparison */ +compare_html(_cups_html_t *a, /* I - First file */ + _cups_html_t *b) /* I - Second file */ +{ + return (_cups_strcasecmp(a->title, b->title)); +} + + +/* + * 'compare_sections()' - Compare the names of two help sections. + */ + +static int /* O - Result of comparison */ +compare_sections(_cups_section_t *a, /* I - First section */ + _cups_section_t *b) /* I - Second section */ +{ + return (_cups_strcasecmp(a->name, b->name)); +} + + +/* + * 'compare_sections_files()' - Compare the number of files and section names. + */ + +static int /* O - Result of comparison */ +compare_sections_files( + _cups_section_t *a, /* I - First section */ + _cups_section_t *b) /* I - Second section */ +{ + int ret = cupsArrayCount(b->files) - cupsArrayCount(a->files); + + if (ret) + return (ret); + else + return (_cups_strcasecmp(a->name, b->name)); +} + + +/* + * 'write_index()' - Write an index file for the CUPS help. + */ + +static void +write_index(const char *path, /* I - File to write */ + help_index_t *hi) /* I - Index of files */ +{ + cups_file_t *fp; /* Output file */ + help_node_t *node; /* Current help node */ + _cups_section_t *section, /* Current section */ + key; /* Section search key */ + _cups_html_t *html; /* Current HTML file */ + cups_array_t *sections, /* Sections in index */ + *sections_files,/* Sections sorted by size */ + *columns[3]; /* Columns in final HTML file */ + int column, /* Current column */ + lines[3], /* Number of lines in each column */ + min_column, /* Smallest column */ + min_lines; /* Smallest number of lines */ + + + /* + * Build an array of sections and their files. + */ + + sections = cupsArrayNew((cups_array_func_t)compare_sections, NULL); + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes); + node; + node = (help_node_t *)cupsArrayNext(hi->nodes)) + { + if (node->anchor) + continue; + + key.name = node->section ? node->section : "Miscellaneous"; + if ((section = (_cups_section_t *)cupsArrayFind(sections, &key)) == NULL) + { + section = (_cups_section_t *)calloc(1, sizeof(_cups_section_t)); + section->name = key.name; + section->files = cupsArrayNew((cups_array_func_t)compare_html, NULL); + + cupsArrayAdd(sections, section); + } + + html = (_cups_html_t *)calloc(1, sizeof(_cups_html_t)); + html->path = node->filename; + html->title = node->text; + + cupsArrayAdd(section->files, html); + } + + /* + * Build a sorted list of sections based on the number of files in each section + * and the section name... + */ + + sections_files = cupsArrayNew((cups_array_func_t)compare_sections_files, + NULL); + for (section = (_cups_section_t *)cupsArrayFirst(sections); + section; + section = (_cups_section_t *)cupsArrayNext(sections)) + cupsArrayAdd(sections_files, section); + + /* + * Then build three columns to hold everything, trying to balance the number of + * lines in each column... + */ + + for (column = 0; column < 3; column ++) + { + columns[column] = cupsArrayNew((cups_array_func_t)compare_sections, NULL); + lines[column] = 0; + } + + for (section = (_cups_section_t *)cupsArrayFirst(sections_files); + section; + section = (_cups_section_t *)cupsArrayNext(sections_files)) + { + for (min_column = 0, min_lines = lines[0], column = 1; + column < 3; + column ++) + { + if (lines[column] < min_lines) + { + min_column = column; + min_lines = lines[column]; + } + } + + cupsArrayAdd(columns[min_column], section); + lines[min_column] += cupsArrayCount(section->files) + 2; + } + + /* + * Write the HTML file... + */ + + if ((fp = cupsFileOpen(path, "w")) == NULL) + { + fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, + strerror(errno)); + exit(1); + } + + cupsFilePuts(fp, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 " + "Transitional//EN\" " + "\"http://www.w3.org/TR/html4/loose.dtd\">\n" + "<html>\n" + "<head>\n" + "<title>CUPS Documentation\n" + "\n" + "\n" + "\n" + "

CUPS Documentation

\n" + "\n" + "\n"); + + for (column = 0; column < 3; column ++) + { + if (column) + cupsFilePuts(fp, "\n"); + + cupsFilePuts(fp, "\n"); + } + cupsFilePuts(fp, "\n" + "
     "); + for (section = (_cups_section_t *)cupsArrayFirst(columns[column]); + section; + section = (_cups_section_t *)cupsArrayNext(columns[column])) + { + cupsFilePrintf(fp, "

%s

\n", section->name); + for (html = (_cups_html_t *)cupsArrayFirst(section->files); + html; + html = (_cups_html_t *)cupsArrayNext(section->files)) + cupsFilePrintf(fp, "

%s

\n", + html->path, html->title); + } + cupsFilePuts(fp, "
\n" + "\n" + "\n"); + cupsFileClose(fp); +} + + +/* + * 'write_info()' - Write the Info.plist file. + */ + +static void +write_info(const char *path, /* I - File to write */ + const char *revision) /* I - Subversion revision number */ +{ + cups_file_t *fp; /* File */ + + + if ((fp = cupsFileOpen(path, "w")) == NULL) + { + fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, + strerror(errno)); + exit(1); + } + + cupsFilePrintf(fp, "\n" + "\n" + "\n" + "\n" + "\tCFBundleIdentifier\n" + "\torg.cups.docset\n" + "\tCFBundleName\n" + "\tCUPS Documentation\n" + "\tCFBundleVersion\n" + "\t%d.%d.%s\n" + "\tCFBundleShortVersionString\n" + "\t%d.%d.%d\n" + "\tDocSetFeedName\n" + "\tcups.org\n" + "\tDocSetFeedURL\n" + "\thttp://www.cups.org/org.cups.docset.atom" + "\n" + "\tDocSetPublisherIdentifier\n" + "\torg.cups\n" + "\tDocSetPublisherName\n" + "\tCUPS\n" + "\n" + "\n", + CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, revision, + CUPS_VERSION_MAJOR, CUPS_VERSION_MINOR, CUPS_VERSION_PATCH); + + cupsFileClose(fp); +} + + +/* + * 'write_nodes()' - Write the Nodes.xml file. + */ + +static void +write_nodes(const char *path, /* I - File to write */ + help_index_t *hi) /* I - Index of files */ +{ + cups_file_t *fp; /* Output file */ + int id; /* Current node ID */ + help_node_t *node; /* Current help node */ + int subnodes; /* Currently in Subnodes for file? */ + int needclose; /* Need to close the current node? */ + + + if ((fp = cupsFileOpen(path, "w")) == NULL) + { + fprintf(stderr, "makedocset: Unable to create %s: %s\n", path, + strerror(errno)); + exit(1); + } + + cupsFilePuts(fp, "\n" + "\n" + "\n" + "\n" + "CUPS Documentation\n" + "Documentation/index.html\n" + "\n"); + + for (node = (help_node_t *)cupsArrayFirst(hi->nodes), id = 1, subnodes = 0, + needclose = 0; + node; + node = (help_node_t *)cupsArrayNext(hi->nodes), id ++) + { + if (node->anchor) + { + if (!subnodes) + { + cupsFilePuts(fp, "\n"); + subnodes = 1; + } + + cupsFilePrintf(fp, "\n" + "Documentation/%s\n" + "%s\n" + "%s\n" + "\n", id, node->filename, node->anchor, + node->text); + } + else + { + if (subnodes) + { + cupsFilePuts(fp, "\n"); + subnodes = 0; + } + + if (needclose) + cupsFilePuts(fp, "\n"); + + cupsFilePrintf(fp, "\n" + "Documentation/%s\n" + "%s\n", id, node->filename, node->text); + needclose = 1; + } + } + + if (subnodes) + cupsFilePuts(fp, "\n"); + + if (needclose) + cupsFilePuts(fp, "\n"); + + cupsFilePuts(fp, "\n" + "\n"); + + cupsFileClose(fp); +} + + +/* + * End of "$Id: makedocset.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/multipart.dat b/cgi-bin/multipart.dat new file mode 100644 index 0000000000000000000000000000000000000000..91c5bb5b4c0e039c6692bc116be57983b836be68 GIT binary patch literal 50411 zcmb@u2|Sc-7eAg9rDzq|C9-6OVJs=KldY_Sv5Ya+88c>#tYS!YaRUqZ>2 zJ+hP~*|&s5Me)C9w0NGk=Xu}%@AsQNxo7VCT-W(t=X}q(uKS)jm!#ysyrdQ797J9gswkx(FRP#^DT z1UwKJ)Ttu|sxUh(U42bE6J0CKBdjc}EYec43Q&1DDOQ$$Q7tL?|3bNwD;hD1AovNGV4b{t5O|cpMoTZkaRF5{TELhlOAs(d5ddH)N01m;9gm_z&_H;h zL^V#(dXQ3(mX(r{QIJxUkOJO_flXb#&?r$=4*{be;}O6*33$1n0QDFQ)7w2@gsPlFk)a;qL&L6FKXb5bU~od0wz8vl$V&YGRngd7!wQR*Vt&*0Bd?6 zv5r7%u!gIX6AF*=K%xlN0x}RV0f#`Mz$jlN8i4_O60u$=M+Y?6gNSiJ;R&wJ9$-f- z8jZk%aVR_z;0YLk0p1Z19*!Hr1fWke3XB6x;ekdud2PI-n+%KqaN=DF?qD36NB|>& zu^_-0R}bJl(1k135llcM2rgiM6dnu4dZ55wK3K4q3m%06J7I}Ad3QTbI1rt!- zC=W1-W?Ha^D0P#D*ZcW4xW07iKd5ooY8&D|D?1)l-yf%U-#U_-DG_$>Gw*cfaAHU*o3&A}F67}yeQ1$MwAknSkJEx?c* zfVUe^f1Ld}Jfy2D(iM*+V!%WXN5CpbEFJ|QKmfQAU<9+N0(J(wfL+0EV0SPY zi~)Oqv0xn76O0EFz+PY?*cX5ClLI8VhjbmlNsdP-wI(j^IiFJ0hH&0lRD*XfEDB?u179(%b=1iAeXV2@-(^ zjO$EvMbmvt$77@^AT0~s=$U?kPLvIBKRNUJJka~bB?lrJjq(BmjHLM)g`pql;{bc% z5soMf0`Cqc{7vCTQ!Fr4s3O?X(G?&o4gY4II%0i1z;rg!7>1_N8cD>{NbLvq1E}JF z$GW3D901l5P)IrpeszQV8PH%X-q8tQ5S>u8(V|fp?1sP5SZ5$_pgpi&U>84}3(z4R znRA5J;MR98mz%0Nw-4-k>xA|m2bsUl4qCt>0Bk~Z@S;r>wE03BtOjHh`e}6_7Xw55 zHG>GyW)|aLJ<0y>J(;>J9q;w>Moc1Te|}Q+IOzdv`i0v^UBNi2Hx) zOaA|$FG)2l+VP({RQTUJH1WeYV9~#9uK3rMFe3*yAkY1Bpe_dCi~_4;f$6}6HoIGc zb%E*07f4auEbP+1Kb zSs6K~rYf+;lZVJd)HLNG>Tk+K}|suDg}k8N~uCs<<)2}4d5EExYSV7l+w`J zcq!WedVw5;!=iyHS-=ZVM1i$j(X_0kMLVN`0+u8wu!XCmmy3X+tTb4MKE(^j0B_Y? zy$EMfcwqg512UY4mw+r-ALZc;2twth6b0xnWo3dFFxz8Te0ygHj9j=albPr5qs{u; zBlf>}yEDECeN^UF>WEZDMMirbn^U~H+g(mDgY-^9!#OFrvfWC$`rN$EcLNo*IP93V zU4*^XQ*XoU;VmP!YYM!0u4c!?Gs*Wnx~}(gz+A-&@_Wdm>}cDV%IzUbZF$+s{&U|0 zo~|r1F&=+o{nqevUehjgb~ANtsi{t7{iQJ0GhpF!c-zy^b@fiMil!y6+{(3v4mIWeODJ1EQ`fmZ33dXy64u_m!6c)uBMug zu2n=&N3Ac-yoRZ`rW5_5_IH0)F$?#?cKCQ{L;LIk7`jcV;++lYs&9Pls}e+K#`sI- zlDy$VZ@*}B*cT=)aZ9IC{`Z>_zNx~80v?Nw3f*liQ9b!lt&mYH=8vlxnst@w=IN{QbYcl#yF!2`3Jr~$zh zhj=ph(c~fz>|*z^gVlU@AU4(_63C?euv6XGRG+GB?zK0MR6Y%cFWls2oPmD5l=kKu zG?MCdrqyQQnUUD%uE$K;?=2I32a|{&zRx{96T1}MJ@O{CT<<{i zz2cqul}CF6>Z)h*O%}YjE@r(XVxjk=&whiwV1lW%oKljw*m=Q_Up}thU&yi>E0&Ht z(0JQ_=#gcqrpHbG;;;NZH7zFX#))Z0wxgZYncNSd&UR$^`;X=0UaVYmv>Y5AKC$JI z7czw0lC-~l)=4)k6Fet36@T!8U~1|>-^mY5mU@u##;FB`RPqyd&)m0`_iM_cd>3%q zUKOMD6>7JN2eo-t%NWcHZIB@$6XDm_qh(3leG3Sbb1C`Aao#p7D{1r4$e7srvMgvd zng46N+YM;t?r!t$Cf^S3m|^(w@R$$c1{U8g_*?G^@Nap1IxBZ6%yPgv-uWUwzq?-u zIqlMI%ZTbITmv^ld|qi{i%PusMPeY?J#;QVB!9lu`?Ojlt(bdcpHma5hA#roKe&PL6Rore^-k?HI``>2tvtd^@=) z@8iwtnhRVM+#RrMz)6uzM6R~a^c4GIiVcA zQ%Pj^>8E>VdSTs)D%)TjHEu@`RHqQLJxOU$;7F{$BUJLn_OP{L)^>LmONmFJ!2w5k z9Mf{6q+qj771e2LL=`M6wXyz;y@8NKT#Td9agx5f1B&p#O5bi84dC#878~4f$9< zU!cR?rMp~2F)N=>GueI+a`-e8OxyNDAD?;MZGVLMkdrSlRoUTE2Y9P{&B*lwPG)ns zZ!Wvtk%Jog%paIwCe_om8r4a-TZa9Q$1N%jm@hm$3Asyl#)LWMoKTDA~d;g{o!m=l*{7 zAI;NuX|`Wti#Yo#CgxakOumM>q4lG;dnLB7O|Yb*OYNa# zJQi-qD^uo-c$*-<@0@L93g66?x%zX|Z+pl=X0jdUYw9U6-S3e(`N=N%*`cCqGGvbj zjiv)Hc|W@4XPe00HRF9&qkZIU?yW*q__T_YJQtt4jgx$~H1{wg)gSP?PL1v>4ES~- zMccs81ZC<7i!^|Y_`Kkryl!ypLU3`bRlG>^Vp-?F*sQD0!i1{ZD)F4Yg zrWcajmYy%0;AHo;d*+H%ry#SWg|dA4@yi_4^ynB#J!_;<=N9)fi`~Td;zrW-JMBB2 zg9}G3;=7+Eq$NnrhO0#EBr8mA|6|Y*-;hhj5h9i*7Xmwo)ClY8l6mwY%iA{OZ>IL) zCFL1l^IJ>!4#9`{c>$OqrVH9ntyQ}jFtxQ->AQBxzZ(>>@j3Z~>=8zm^L~z<8W+#& z?iqHdxSb!hl&^bR#W8LP0|IqNhxZvd8gY|etbiz0h5GCELL|Lb@jSNvC103N&hG2X z8U@j0?69t<_hdqntHhhTB_eGr$qt8Y^ghXOTMq8*9?UsHa-mpzhLO#g^p9YKxexSg zr`ndaKN;eccyhwfx}mOy$UwdZOtsa*E4eY*G?CRPO=>8yP1CHxBSU=dQy=V{dG5zj zm+YC?Y_?J8K$01%qCW{|aAQvdNx0GObz|ddSH%S#pd$T&{i08Twc|9x<~Hk(Lm;a07Slc zMoz3SWu3$RV&M++cKffr+7(HO)6aNFZe8y#9k#E4?IvCMewhp@dv|={H~j zxEAoPJmcG1z{uibCNZnEbd^$|QA-+?>0$9rRq?oDUF=hrkeO=X{B+`1eXNS!fgTI{ z@LNSzi6yp|p=!Nu7+{$|O5>I~Gn~Ne{-~gT20`zSmw|AIJ9OyX-6H3o97oqf2aY(iqbL|m^oyKm_Z%Qe4kU|m&K zPQ#F2w<7YUfSuf=SK)CL>P{XMPAs}g^b47hpgM&wK{hVIneAJ6+@bA&oSq*1@ipjq zGIl?$i-MXZ5m_%Y4!b|;Vqy^A*A_7HULQAk#H8sU z*q*nzGpRZd1cGrqx0(TaO&MRfDD}V0guql;*sc(jue&pwm8s8Vo?V*9Z{o_@&hAgS z$u6~05|~NnkM;(_B#8vKn24?9k6O^j>+K9MlNbKaJ=CO{{g2x=x9z}D(<2L8E6@X_ z&&BuXjP+Q^KTA;S7B8+F(H?f%leH; zF&IASUc2ACr6ZPnN9Tpt1%-sdc3k~Yh0YHd#3@*G`>*|%H+0{VG@$w5_pgDvey&!^qulZofD_4{|-lp|%|7*=8QgXA`D>n^c854pOZ zaTZCteCB&i+8QH4=%w-)V?9z`gj)APe9r5hcN@Ep;}gkGs~(d3-3Q(Wkfy!5kU9SG zY_QvBa4gEC7hWqi+LI9CQ|@rH563S#a`FdinfRzFZY6u>mtCy28V!2#=$h>_E}vuM z#skgbb=}o+0Bw3z;+Bq4ovwC00mr@-RP4^{z&+ptxxbp+bEdV~j_Ztydtcw_ilTlN z@BEH1vJKlai^#5=uYx9?D^M#Yi9H7j-@t6zP1`bfEg{vt%OB0-`)@q4sdwwHw7wTo z*fjV4ka?JyMZBBHei8B32CG5NJr)Bu!V6`%-Gfz?THSJsz9rz!v1$-{u5-MYw#com zNPds7VY{iLQoEpfv(~Jg{Q2(vtOh&$lxJJaAac(9X-2@n6kbDwKXs~Dv;NKc{BZj6 zgE(FCG3Ev0^TL1!p^{JI9|{+hJU?RlAbGl>*yI7l54ouKF_`SL-DBaglK4@H%=6<( z>4@+-&d`F~I!=gUinw>ii*U075}~#0lgT%jQfFeL^NmZomkTw|FJl|x79Z=mS59<% zTJogUMZG)t*fbY~oK?&|eA}-v<|4uOmRG4lc0ksHN``Us!E@lFZ}#DuU#CsYj7U5? zb8M8y)K8^_u~2A&LD9{w%=gTP7$xtieVWbI*Ua8uMc*BGh=3Zg>ub#A7sU^bdLArE zTX7-YG`*$ys;Az<9zE81|Iz)E7w$xK?y1f8e!cLabVm~PJ%MqoH6rwymy*chooLqF z=oRcy_qq977tCYIjcoXfkM1|T0|obg{5W~T-&VGn)laT9*QsTfvT|`YSD+bFiJ*CW zG+SQaD_O|XXA!)oLR4eenumg?#gxxVLP&PC zA8?%{C3r*jV1173yI3)8eNO8omu$-?({DSM7P=hR&utZJ-aDgZYTo|sxf$9bSX2iPLfROB7P)onk_=jY>l58TrT9MI5b%uW}V0xRyElkyOesUN6_@` ziO{a77~yL1K{DNLpEnEU(=)g`v-R}fD+8g-ynU0 z66Vk3X5Z57{z76f_gniYE&1+2TrIC=z7<(JoEd^hW4v8Ft;ae#(Pr%o^Ec!t>xSi& zpFavi85?P4L0a;1cG(+THS^_bSi~8YCs6rJg*vZi*uk@}K>4~Clw9PLr79e^l5fsj zvxr`*QvLGs#)$SVmiT80N8O>|gNzo2w=iOp*~^t$Y0ndg1gLX$2hzwUvz%_fbQdI*_9t;J2eQA`JR3EoKZs`S46v3Zk^9=&4)?U;%K+44plvPwZ2DEeg5_Akf=r2 zH6jcCQP-=~#GM7gxT@WPcqa_+j@63L1YV{2GwX-iQYDX#QW_pdmK@7)_s&SrQsN~~ z7!F$NmU&yo1ez10UOwkz>Wzqy8x73wpcCB1``A_lt78meUjWo;>*2eU1!W z5aDyLcm151xvnJ#LmBjwA2l2H@x;R4(3+#ib{Gql>WwFVvCnQC-JM^yW?klg38|Nc z6{>eqGt!*%AUaTsqZf3tP2b?}uov3`_xv%1>Q&`BT?%Ff zz6VLLl!O(QMJ2BW#rtI<_gKtJkN69t#w@xpC6-LZZ;#LLI$s@OHtIgUoDXu1k18}{ zbZ4@ZRJzAX_N01`h+e+jrQFR0%YVJ|^PhvAc9ybt22lh?DXO^pgHe8>Fqwd%H(xDZ zm7~`9Sw0Tv0AE)Ac&z;6i*#wJ|NE!yz{7U>ONRcEqrVjCFLnCs|KNc+@bitI56q#` z|N6jO5eog!2j)q3=Tna#2=2N|=yN7`ylV0De%w;}BxfRZ`186rb}?h8=!@npp%i4Esr5C=nt+lQ8me%yGW$Ad0O?_Rum;@jG ze3MW2YTvr$;kYjt=ln- zLheT;r{vPNjWreDEVS#oDvsKoS>a;unX9pGFl@(#Ko%@*g@*9myPm3#hv=0beXF-Z z@T5?5)b6Yw8efUqCT>}AwCC|rn6A-HPrq(eBm2Gb-P&JEcf^TCAJvk&VZ5X3Bhs5< zNrl-{w;pHXBs1J(U^=JAWOve@7p9B98zNCMh$p;6Q{r=#pG_;4L^Qk?PP{UM%{%>O z+l1R~&Bn-QaGTuS9I6Ke0|K30naQdwhkF?$+ILSMOeGK-9*!LhCBb5MDc0I=XNw=H zwdYN~d3;#|lzY-Vn(3Xm(7QAEIXGs&rlQ~YeoY>DyfX#4U-ymQnA>faGqX_=ha@x< zrMFtdXqXzlEh)Q8C3i5)9AGu=WRN(>s^7^#3YDF=iX3xusLtEXNj4fe$H*kn=^I9< z^95wctKZu`6TbRXe%b5&%szJL%>7Fd$G(2$)1We3 zo3D;BJo^1+ahwz*Q%dm6n=;dtiOb%&cPD}li~DshzpeJ)p#Z=B30c*`s+?Q;I)zEn z=ALfR5Z+Ur)!*Nv-U`yG4;shic4R54$I6t#uAG$Tj+S;5izMw#o#hLD|7=)%Jg@4B zyhORqsV{?FINkFTN4f8D!pG1iH}Ct!yeci*PJLl7mUQ#@$E^Dj(P{a3eS+k5&24>W zOB1$--9m;!qeyU;n>&h9J&Cp_k8+T4c*HyG&{FDWE30Gb+ptmP&c{1uNxXrig}to` zF{#zT*N%1RxUa*n^L6@yhWH+p#ztUoIDueZc$+4>BEhS1>}R@}#f5wJRs}aR#ls64 zsMUBgJw?Z4QD+$F>S2$S%W0#BkCY@L6eJ$G3^UXd!=AJ3Jk{U{-{&G|aKiYY#S^Nw zlj!T6)qxh(<$G*#`-^IE?4CE6G-qVCSv2iwj^(EIwwl!*;kv`1^tv=uM>e_het%hgeVLr-9VSzGV*sGnttfnPyiY`L=h<)dafA~A4m#Ad#9w4lSlXO zW8?5>!Yial zwOqI1+(JFGNXMjV1-2{q1)jy*Dn>|16Rte6&hFUlC$7CZH`b@uhrLf}$k8PcqC}INxXZi(GL*Gbyu@ zZ+AdY&>67>X3GrVg;NL=*h9Gk?A)3)vsDdm9x zgu>#dUFVwjN}t2?TBypZOY~H|Abuy$E?In$R3cF^vhb^JLFSbHW@7o)m=PJ%jM*a7 z>MrA!myIzAr4;^ULpWc7j_S5N3ra3L@jOPdr%NF@Q>p&Nj(wT7iZi+JzG0K(0(i8} zIrA*x*5u3L+)5`cmcDX+g0s5ExUudl7NSI;gI>XNuF4GWC$~g1Ww@Wd6Hcxtgc#+& zBn%jY7Fc!+`R}MH#2daV^ExR{fRaxs-FwM+PLAy$sN`bU6+P&Cw5U%rZe+4dn8YpLY%3d0Vsn9%BX*%J}r{aLMqQ^iLv`P#Igv#sdrna%{4c z#E!%gmez0kGoAPJGpZi!F_>b7OU~_1eWoLK>tT4<3!;fXqeX4s`{GmU;f=zaubLW( zX26*$rF&UYd-!$oJRjg~Vr<*Gq>ZGx!jMcIZ?%lZ%ET*@cQre`JEWThXGi+KDFvN* zJRu$*ue5dK?v?$TV_uY-M2m6aSTf><+!ZA;I9VM9E$YD8_}fjFP`tsMg4!XIB4;0F zTCGpIy*X_hGt(X-XyMm28trjITjLo6`S{kD83C09K@QFmW#&*^!qtJGH;wQcrxL@f zj(X=kbYi5mKI`iDJy9kox8v}Zt2`fei{u_&m+D{VA@Hj3Z(S+aKkLd)i5B8+Y^UD3 z5LIL5T3S=Vteq#wa@~eO@PurF28e+t2%Zy5Dz)&K%mu44Z{g>4avHo8kk$gWl+g}w zdqFIB4|_0S&F)Ky7>VKMk5bN>Pbg6vi(Yfkjku_H{_>75lepjo;XY}L)S+mTbK-e| ze6t6b=JCGIT})1mPs_sd-WH5%a=t5#IR1w7O-(vKVE}D5BtE)R&-QxA=cyx}F~E7l z=GEC#EoHEAW0{8$3=pm>$>MUNmxz3Z`H_MIvrvRQgYo(n$>6%$!I26PmGhEuoSy8! z!$k&TCTw4P%_j=7b#BSzsZ7PqUpEovj!M#fKkOs&o=ZG0@UC{GzCH4KH{%!fYR z3R)O*Tx;wKP>ip~=ctX3X$rjS$A4=tFA1=2SkxWPehmTl_$f~XB%Z7g?+b_=c-u}? z#uQ-O9bY>#+_P2|DB)X`t8TD#FZJf3Bqi%5>#BT!3-?`|T42qVnH&zPE^NmWR~E;v z&Q^Zf!X(4zB|U@_wxSqc`tWS9puLYICQp1>%NRWKV92dboLRK^9->q(XnyR$NTVXW zG>F8hqSXesxCR|-Wi7kwS&}E+li~8nsCM83!&odqwnw!sX1XM(=j&N`s?ud2MU~at z#luc=3Y6KSJ!9){8#Sh?%!$VfBiu8HnrY3I2lGvVAJ*ZL2 zC*b2*J;VidV`s*#DxAhR@b85iTZNveiR@2Ca2#Ok$&B)!^lBPmFy$mZ$DQi9A#3^3 z8pE-Nhk{5oW^D$`Dt@}&l>Z9;{FzyNDW0u|+HRi?Z-y|Ma&{q0_*7i-)|cR7!R{|z zd>2gLm3HifC(K;%1{tJ!PuhRxA7hsqLX5XUyIEU^%1UulZ1xmu@UeiB>sMwnd;EZN z+j>gQr4gx@ccy-PtGVaq`PQ7?+J%kNSwsy{iexCMYxQyWUTs&(qF_l~co;nA808E% zw*1udTdExOJzw|2N3;UF_obA0bAqD64*KDf9+tKS1LK9@q2Hv=OjplJaP65Srj4KA z4|4C+p{#w;IM|cr1HUv|V8dfGQH=}dI$V00Uu$XQiuC*Jh%(;;7_J^_6r)Atcq8$t zfx9|KFwFtgT3VDwp&nh8(89`_)iW1FDF`8BiVdfT@Q&3KS)1}3axr=sFCHz8u5gK+Ol$-+=&Y=@?swmx2V{T}5mNC3k!ybevsZ9aQ0h}siY&f(t)_tO; z%Lva9tmk@^DaG%=c8mHUV{Z28Z4y}ca(}h@Y0%gS{#ZSXscZCtN=YxORGclYBh&Am zxQd(~$Ap_A{EU#`=e&w~Zcx*iJ@Bj5X>#KH6L#zSw_5N<>s7V}j{~Yx7aKWCxY*)) zUH0yb3Ct$y$Vk>~vFkSv{iOt~p#>qDS@O14PO7aSh#zDG0*gFh^#hwmD^h2mZj?D(>Sp z?nl_&(~y#)3JA0s$6l5Sxiz7h@~C0=45S3#WqcJ!yw7Z8gtz(HRT%loA7jI0k$%C8 zlQJG~Ry07DUtIT{&=WQ5xVEmK(d z<s@};%_}^Y`oBEu98eDH|SVAsJv}NTz^WTSZ2)ds+fqe&pf=oZ%}D{ z%tVUfe$*FI6CMu<4MZ z#`7VGo`-UBf%8wk`+7G;z)dEoG0S|xc?y&qq8R*0>C?Rzm0HHUDvyW7r;Uk{YT@yk}l@p=Z~IQJn~*N z?o1r|ge3>?%&U1et&%$qIyYmNk_b&(PMMq;{{FF+wR>Vc{Sb)%D;f(P(KJB9MklBD zmn7WWZrhLdrD$X2ubrK~o~`$;?8Nv@>*Q-QCI=xSkK%ux@E(0$X})EW)S8scJ9*jY2y-QeW@9~)eO}V)6Xp3Erv9> z!H$n+yQELxyGp*R@9HrH&iFk_99?@@W)F{du%0>^mjw#kMTtY0aK|-OBpQF6z#C6w z09_@_v?Meq%}7;z>us316&~fD4H)yH!je5a{A6-{RsHT0N@j7-yH1%i-iCud?|qDU zr4p&0a}AKA0K|G*B;0AD%1lXG;#v0G;c9!_uqzFxI~T}WZ)QO53W6U1d@LN%G-c~8 ze~$P9dM>WY>~`!{9MLK8uqUzqyJ*bT4@Riyrm64T)3(i# z0ntqW|4{xaBs)-6{^N?kCRkie*V~ILvT?7pmfvt!9IU&xKd#KMcA?@_vD#Pv3ct$G zwuMuA?T6|=J6t5Rw4p8yd^}N_y>3nMkAW|xE+c&7 zD@zN_X=3jG%%sJk0}Uv7xa$$x*g`1)JYk%s=E+XlrGQS^wtOCo+@)|P@uJ|<427bk zqUY(%FXmz*B;Vw_;yg8ede&)H?Jc*dFcZd*hzhM-Yzdb_yKt_eVx zyI(8q%4FUf&q#V-w_WsFIC{Hxf%e7Ap+Z6g`!t);EywP8?mYGI@nwS7xt$k-sglpa z(WYvHM+&y!SPsOzWIUq74DZUkUa98AeoLME_RF{(ueOewhKW4{zyC0ETaTC3xIkL<5uNyWWH1}as_;e)4 z$_4hks4V!7ls0og?$XA<*JZjEg4}%!7Nu-MqB!v_Uzqo4)(GC(!#^Ly9f&K?0q?qg zNP35M;CrD@+f>8sW%{zWCJJ(>?G>7Dem%=FDR#9a{E|Pf7QBl^gmVQXx_4Rq$d0LY zpPZCqJL@|R?EW6XG^zVMcYa&G%1U?;DJzVImdQ0++dCCAI;p6 z#P~1*RNA2W#*KNn27Y!*sqrYounsu$(<5Hj2XZ!sQ+j85E@wZwIa{NCD;zeL0c!w1@(Oa-jci%eV2#)^EGjTF#+ie z60kPTFPGes8IVCcpWV+|+zqSRHFJ4($HZZ3(3JiauxkD`-WOu+BP9_qsya_~p(?&G zYWH2y5>CR|*w>1>9G_Z)ICT!_9ph(dy)AdkN6R`TzS{l~U^k;dP*fB0!W`oN zR`1^>#L3#kv*&W$_w5Zy_r_}=dhB09J3iQ}I2%8osiFNb5bkDix!utdKv@DUIpRdj^9|Hw5D7EEVBq~-)XB}^1R*Gx7Y}5X><s*wyD_o=X(C&2YxaQ*)nJ@6Yj%VV+(R<5}-*jc=;I><2FT zroB7v#x3`WD@_LbISzw(EG{s5&p&4$xcsKL5(js{R0ob8x!2o#ZZEgL4yE!&$joRY z$)*RFQVLVzy&_w=+|Z?2T{v?QubH}3GQxT?PPF^sf-LC6q1LSrRYyYAPEaQ*4uW#I zBp!Kc+J{W0s_*X^j=j-#;(;eoB3Dhk=lKG7XiMUY!c1Xfyj><-&)>Om;XsUg)wAR~ zvfATT=+O2K+e!E?18E0`!`Iy7#k5ZLp>UFr+DuC(9?%*8cl#5n#uIFmCbRG-De;BZ zq8MI`?njjyPdpI_bzB=9}X!i4(u8QH~IYAY9*&gD%R(YOfu+hZF^1-K-Pnp+W zSe6_Tomb(@iEI7OuL*t^6Pkd{jCE=Mfoei8+zBw)$HxbR0;&cHJ|Lh9?stuzG_90k zqX6+|@rAythdbC9_%*+^3`7Q`AOKa60m%yh5BouK0#HRckh~384JZvl;jL+3OGw#( zRRyGJntvB$NdKRFg97h2r|-AAn4yUY5)a( z*7CF>3S%(L(h4|ALjaw>Yh0v%S8V)~4h30|jDWNp6wpM|C-X-g3N%aq)BzMm{6)v_ zB94F3AukQsPg+g^upb1_C;i`bK;;2mY#PV!a*uz~0hI@OmxjuMAOaA1z*GNShb$Ce z&2Jr$-(Pb5lMY!~fQUdjFKrxvzW*R1-5-Ckl?)W{@+KXdBIHM@(QmeI_#B`);By&8 zz~?|+%0Kx0FFGI!fR{Jv__v7K&>^ir^SKn1#xX$O|KM|oG~j_vIyME^Ka2zD9q_r7 z6z~@U==&dhE-mxdar|3I(#IjKC{6P@gw9xft^RAAZ$zK8oD|>>X+Ynf<6L304jF~Nj^n?^xil04_#6U} z2eKDU-#_^LFFK_E%H97O=QJw;-Ud7Yj04d34?f?l0|FG7Z?@HsIJc&$7639PZCt>C zp5j<&90Wem0~I*Xb3O}%-W>~so_bjz^c2fN_bVW>(F;FAh$k2xI zV;=lF9NOH8bMXTaJzOOn5Pohz?dNO?2I_R(2>{Z~fc`DOHUL3oAs|@+h#YOMgF8D%px*?Cu#G&!XFUPne`jdrr7v} z2!jAB{jeu!=8<&uaKfJcX{b$L{%u~{03$5}rGb%>rv;TPK&wB1p%eQT7}+1pwx$!+ zn1xOX;6QT)aM%b28G0=J3UW()5;C!<4jvGfn9Mpuq&;Q5=7f1;`caYH?j9W z<^vfy0J=P|l#>zwR&ojgKzZe#0)md=cRwqLs~~fg)cwpn@H!mB*oR ze+RgU#Qy*gSY!gLUz+=YCD)%EFH3jnZ^v(<_8$O(Tv1+5bT{IikYM1yw6we;$jf)r zjv2C>c>E8bXemPg2oMDUIUtApA$!Qu3HBS*CW`+rpn&N^?ysPrn=DSsKu^&>!bIF**7aE(&aI z1Jp+Ym*~S61yYWf9DO*VXq=;%938qS_UEoQ^gJZD0S4H50@x-4*vbcq5|i5iLZbefkAi<& z*3$j@Q;>E?_-h>x%psfCjdXAS6#UCV`EQGHIt~6PDD&6VE}bNQ6#UzgRsMG>q3<$u z7T9=z00wr904nws!1Qq2K+Yn+5zq1)@w{={&ay!xmJQ4-3L7E{8zR3cO7CF<%`YY3 zv$PF|yaea~i~)`GO{@sO^h&pr0kA6vLJjLne@FsVgbK(jLTrG?DjUmM!p4SANE4Ko zH5k|t3T%q<^#ap(O;Fo7sBau}ZNRiGFaU8aDS?fiwPXe8Fu_{D96;Blr6}+t>4Sf4 z!~n?a0>2ui|8Nw@L(0lvRS#e@83J%$Kx^?U^U%R=4D1j4BK+9zKw3rtSi;j@oAx^h zPqHQm7w4u8E=h=glNveD{%|@V-tVJk9y@}6MrU?GgJ<=Mfd}!G({0%XbEEZDRgufh zH576nZ@uS3%>el6vBs@uMGwx;JuXXUUGIVF4ello78gjD6lZ$o*@5{SMMkBLCGzHo{w3@rt?b`8EPNsVtxhsSdxVQ16Sf^*#`Y)+SmhZ$5UJWuzu?&0k=YM%@^ ztdLz@?lDlBppY5*~WmQ)(iK+93l`YQW z@tWw+A+9H`lR><(NIqHf{fAc-$DKn81s%dL1E)b@)jRRphSsloArHkf-F*O2HF2Yb+gev%-^asTrOmyqYPb9uBMt@1_X0h< z!Bm#bSN@UioF=x!Sl2MvQ#MocOb7X5rLZIQuS;+xSLa4v&r)&4+Q<8;yvURpk@>qNZ7p;%lQq(%zt!^XDmJgF3-McaixX7mU%Q#> z$MvGol`A74I8X_Na33f3XOdk%)Dh!!c=oLfsg27N1;Kj}g6&7TBPA`3ir)9yVm`(0 z1!Z>>ELVS^%soMbv3`Nyav3j^i#YFZk{uixL5wpu!f zNQsJgofiS0)QBsreme=Q!s!JyP(C;#&LOklLvcxhWG-m%Y82ZYNsgx>`@zL`SA9-E>O{ zAH5Rqur^)4sAP++F$4GkFEu>yTHI ztT=7*dQXS=dF||Q5EU6PNdbQDDOUj3ojsAmwa0-)-(Q+k$9TLhy(lv7*7?_Jl7%Xv zOMT@zN>HwE(uV>R`L}B%h}AwaI^L;fcd)BFeAPoL}|1M{=TD=wwP_G;CZXYBD~o38U5>+WK`A)6BF32dE_${mvXa%Exm zI5Gs#RuHONY@6A>B_fwNRN2QmSB}m-6Z+Nd`yp)n{Oi5^_2u&)b)3be4(ok!8@lp9 zg+)iF(L0evKZqyLO3COPCM?y#PSWR4XrRRF@Oh;V$%hj&zU&sgMpBbp5({lm$T*w& z_D1gfqZ2%V^8JR@5DrfB#J(uT$sixs;MjVdt5ff?&!+ZOhVV*6vJcD~b0{|-dL<1@ z(aKS~FwNh+0K?p5l&tEnzr;lfKZoJ_l2Q$IAJWf*8DPT8x!(q^?zuT7m3MZRyevub z)2)l-Lu_JMX|3;HbGerC zwws@`whplOX|eM4GPY0V8atP**rLZ9UpTKoe&%?`HdAthGZ*)`x!&zn31+*)|c0Wp0**dPqneUgU5y;W*aVEoRvM#SL-!K3ED-$<>0W$)tFGnk2Pfe)vq>t*=X}5BmF?GyYzXYlqj;J&zuHz$ zJWv=`N<07!=s!i_Hek7P*Sc8IzjKjLo6E(@thbwF;HlM97?5&B$IjmG?E}+Y7z5MP z%2}9X%aWM+xzz5Vt%YG<-BS2(7@e@WSE6t>RqGKjV0CW(^QUGwDDW#|A$Qcm>mCsN z^*M`obwb9w4Z32Bk|Mi`TxWMRKjtQmgaz`gNi}4xy9aNrb~_kZebfS4b)nERF_p_; z8&41B{c6gy^3Rr982E_BJ-cFDG3)kmQXsc*cA$0clhcw&_CjI^<9<8I0$KGdU)^S( zr79&*Jt7}_rD|txZ93q?>~;}d)n6d%c6F#MQ2LucIo64db-WA1a;-K~u3pvNz(9(8 zNUP|3ZtuZhEha+O)LT5HoB`jUQaAMrx>a+0!9s<5BNlk{2t~|p zi&Fe=TeX13MQl@IZDy&5-|Pn(>)t%ZS@Bx2cC2nX{ zd0Bh;*_v^Wdl55-RtB=3^_OM!avclbGcDqFc(H3-+E#7y=J2afyJ9JpL>BVH?uoAl ziaj32=7#oCYvXk-!kr(p9DjO7wCg$YqG@8soz(Mb*|E}3JsuX-s5<3%942LAW_D2S zjKA8|{M48Wv7pD|@A#OsbG*l(GYDlB(IuL&-8`$Wz$@4$@m$kgk{lZOzNSa&!-t3& zt+oju4En|cDgcwhFf+sM2U-b7le*}p=88&mja&kldH=~%tnzP9`cy^ z3d7tT5sI|`Dr}P_NAc95Vx~}Om(m`_N@vOy4D3CIM+_WXd~DhoR3i88G$s`6bCA@D zneM5kv}B^1EoNRl6tUXVZgaLc%&fD>!#c97J0)q?Zc_Vd#nhKG`3d%wR+F+TC7k4$ z75{;40DZaR)S_0I+f!V_K(jiXY1@EgIVg3{0j$k)4-#?6NXZyGaYYu*Zq^ z?9j3x8cXX9I_vykkzFp7+-Ks%#0*RsV3*3?y*-k<5uK1F4qA)w**kVS{N4KMZu^Fg zjU57*23N8&X@aGBjJ)0hNHklx_dv7L-i#+$)rq^!NbxB5x7QdwJ$RSDn5^Y4QCF4# zs7uIH;(Eyit$G&|bj9@Ei=51z<5>$$JL|?hm@G~hp1kPRx4HmBvU*zHSkKIST~Kq_ia#~YBJBTT?LDBH=)QhoQ9)^fAYDZiP(dKnC{=0F z0!Z&IfDj;n^sZECqS6xqX@O7#M0%4JL)6GU-WD8PnxYQW<;ZmdK#w zyWPA*lMa2JQQC|y7z{_dK*l>tH$pO8>T+9^fo)g#H6@5Ok=<%TOVUc4l6&}4b|P>a zVZYYAxT1qo6=mt#Cu#Giu}eZGPq9nu?)1f_vw338oE1@XMZ3|bVp3&CY@{}HhNmgG zHTD!T>lfce*=KHC@RsCHV7(aKY3;a9eW^+QPN^h}XA$Fkp#Ub_6pk+FM8MjA75Z%3 zynLhzCEwm1w6OnZVxcPI=%kAct%~b9HL><#$B(34Fy9J z*P>W2lvv!YS1Qg;t`n@Ey{s>{I|GUCCXG)t)EAZ8wdxUD;Rx zf?PmLcm`|0Ri72!iY${H@&u?+Gjq4cTGs}^^darmVXxWEnh(}c0`z5waHax#Z_?Ho zT~TJUW*6^F1i7=!I~?f@B;}Z|GMw0<>!S2TX}qwzzZt4{zXC)+IIl#21J*fH>YH3- z-isL^4rE+7pzkP`#305Mn!BD1Ot5a*FxGM*Jweq$lk$N=E)y`6QA^miU#)}GmaBVN z`g^NS$i1{`K~<0=BacqwH4H$lnTfg6{HB_voYuDcb4s!^=1z`ncb0Mlv^-pFh|dy! z{|7zm5r_l|P??nfU@d^v6PgX$V+`{(p-C2_cS2c+@+i@0LrL%>Ffa6+Z86`r9T~xd zwj9K5+bp{~{<*9GWoxO{twn_(6%-|k)&U?v$BB>{w4jVFF^06-MCr0Af|ORUe=}t% z$26MrgLo|)4Sh72L+$}^Um^r4E#Ie+@(-qj4aOKMVN=3DhPl}Wf%e}T^Mwo$?_}04 zF~B6#>NZ`TC9R79+wn%h#N}ttI@|5lf*rh2SQU*tD*!?jtU=28MdX zKm{(K)z)~FiF%{}!)QN8pELs6{zd(nw~hrl<|*+8p?T7AtHsl8gQPK$lu-|uuA%tP z&)2;)yTwLTnN+GdD?6=@E2H!Y%_#eP-dwPkl%-ZqboR8CF#q{*)B7n!zPd%nUp$+}8x;wKaHOoBh8XD&#ZW3?tFJM8l2~HGVsuTOrqn*A5am}JufNi? zu2#23&aK*^$~4gE8CBzU!G}hq$kv2b^e2&FC<~L2o+}9ejc2gBw2g*`cQs9zJ0s(A z^-IAKQXeU5fOS^5DJ@mqQ_!p|hKK*Yn(6&8Rwh~FfV&IVka85<>}`qseYWDH^P-~f z>#peu^IQLhO5_amFo}zo$hpxJkGgE}R0evlLbnX@D+#GH54#js}p-w!C+D zIt&QF!1%4Zy*QdmB48&bu%Wn(F|$7YJZ$+jGD>H{iO z2UAaqK)A@Jk6LA8iB6qZ7G;`xY&BFGDcZ#Vard8lEDV?pHyYLE7!&>G&77(*7qYLO+xm7c0` zAAn1YBw{eOScg!yPZ%p=gHsS;6uRYlV};dlJ&6V!+-fB)5gQDHF}4lfX@6@N z^`QJ3%9cDF+mez(N-1hf-Rj?bJwImGIcn%m^MnNN6-}+?!8hnOd8s_DJOZmnrm0)Wew4YHHQgv+AVDWAfdcZ#bd?d_s0n{GC!`ZbbZL?)#H(3aZCKz0duB1X3 zt439z0sq>cF#r(5K;;*;Xe+7UA)GF&1_))<5Y}72WCeANU#VX!2tzB|pOhP1-A)ayI-2t#rS5O12?V~}%ABO(lR zG9K!H&A7mNfND5IiN{4TySDwimR$3JzISXPrgdf(dM*A;)&b`+KRzbCi((OrC(*~x`{u)D0 zG8IeVN$$L^)*`Xa@~&eBvMPPn?WQVMeH4&9^E_F*Rev2son_*g(WMI47i2bTx9}FU zZ5elNb=8hHFQ?$H>#IA5=g}h^aX(yHE;agq1iQ*6#ZE@@GB6Ivojj# z%%0B`Gq_}O*Z)CkTSR9Tnz}Y{4-J4_dUe)KAJ>`L8&&hAi}E!^_m%lM8`Ww}`l%S* z6W()lF5VY`6nsWAu7!7;gnXW#WoV6J9+ex)WcA*GmS3lpm-%GY5L`1I*=u>JTvw3Z zY|Q%bZarSowRvLU&b=yDC`!}F(9OV3n$EN|1Y5M1RNS0$J3+lvVxrbiP<*2BMSso1 zB~s=qAfNiWWQ*DJVrklrSDR68QJsbnwAssf5tOCUSKJJnF@YxhALnj2c7tVo zBx)!@V{A*OW2AW+Pi4=wJY>#bmNZlotB}yl_DYR_x$lhIm8m#%(ohX4Xa?`%AiMS> z7E=pJk{bF}aPtg3=Wnt$u+vODk8iPcBiXtiR)3S78?2|`b`mH;);qL%%#!FER{1x| zJzJNJI88w94f(=r7Ka}fSv6So`L@5^EY+;I%2+VWOI92aRt7w*`i?&4%fjA~@9VW&ot@hHR$(YT2 zxc?nb^n5Yn)DCCmX@c1j+tQgKGmC(h6Oj*L7~fD9K&G&>k&(qpi&(`~23S!jntYua%3)8UGl%CdV35{dX{W#9x0aazn{Gh%<~#7%x+3+OnRc`d*Y)v$E!_1 zWl3fKgFJBHqlskL)GYJ8K-9eTbE77Aj!=&!VZAalK|3iOZQ^j;3J65r0&P18lo4G9 zs#X-?5l--sc*)W8>Y>G1HbNlO= zwW;#KDcp2CgPe42BCoEYA~^wK!uz2iwd?)9wUl(XEmzbvxnBv*-_+XcQ4)0K>E`^+ zLf!r4M=f39$k0Kx>l~u-O0+nD@8^4723Sry9h^K}w<@Q!cKOHp26wgVe9OMgZ22)) z{F|;tCI}jJ)m?t9gyCVi&fG&Ano9L7#rAvwvXl0?efV2hNcep<;j>l^-$`>uw3=F6)z)DM*eFr{5LW3Y|r#Qayli%UwgU1XCmu#!3;LwD~9^ z>z6SzRA0uN>b?RKm)2GUh_#dIHtOZe`AR4wk|bF0_Dj0BAn^k91L% z(}LKOUeuPN{8tQt}Ztz=fupA@ZA~Yd~E^0PVID=S{5*r5?~-L;mEUs5Kf)^%ebe2r5}hw zICE_2ZbLz@=EXMHHh0aM*Loz$VO+!tDR9 zAXQ!##{KFg; z;UE8ayez-nbq}Y5TXnCMSX$2&>4TIx+b85HW)pJ@P$#ks^0|pI2I7u9yM!XDlaqJ` z!}$u7q>pE&x~U~&>f#?~Q9%qyqI9B)LW$8^_eUoEQ% zIG)2jX_J)Yb*T|CbmT#AIFzu~=Ua&3A`_-3M0AdS8mfiA1)TFDRq+=wX1LsZwU4Zg z_nWfM`HF&f3m#FufV~BLQwLxPxcEs-{&6y5qX!=GG~zB3YT?(qtv`vkl_&9>$UGnZ zw@e_2U&id-1S_8ic@T#9JG6-`gEKV(LELpk-2oD6n_daQKs*Sha6~mzJ%b@QO5s4n z*RbyaQCMpaM53r1h@0i~66)kH3$~K?7VmdIJ6t%2eQY_HO4(qp{h7te(RTz#R`_r{ zR5bo13gxLE|1Uttg}F|Ahg!y@QnBp&G+vXV^IUr&l=Df;!o|Tio6P+3{XeZ={^@$Y z=HFo!yvU7IVix@n|Fqd9T$5+0gM+1Y=`z*4qdZg+YtT-d@iU0_YQtXdohFFs2&QM% zviz0ywI9i`g;;cZ*Ltp76h-Bc7y9rpZ;3z|G=%3@y0g=xSWgcA%n^tw{9{KO*03Pc zHf&rt-8&5Xnb|A~#T-~Ha56zpDggEawc0k`gP>m7>rY4f0DN zsyjdft`xtYuZY(HyikU6z_Sd2S-~9u4@^sNb%Fw_2f_!ll*h~ngiwX+edhtHJRrxD zOAOsVoLPWI)~W{W_1d5qL)8N(Y*FZyH}ThPZK(K5^^2^MELI)`0RICQCI4=*;>s=&QfV9uq5eh~V8XoMLZUc6 zZT7VP=uS-7gT1S&yC6c<*$x=XY_cMg#h~^u<(#S%MoR$H+tugP5k^tjUh$bh^z-`} z+O80Be!?heJBmNOZwB4(lJ4i(eDFc1BG-Wi%UYWm*To?;KP^;HS>fiDpA?sQvAZE{ zZq2KG0u2(MdU9JZ51ne)_9cMXGc1 zg3Pq-7WdD#YADhQli;i7)})uK`jp}r2^xa9r`FvW>eJzOrwdd3E+m|l2f54g>t%-^ zhl@Y*kg!x`%3M$q_fi7|iR6<2+2UI8%+vGXJzf|X_qFr!PTxeXCG=f`6IkO`GyAut z;j?cRlR(G2IbVq)=}7y=#FJ1M<8NZd8-t1cQTj<3X%I zo&8%bXSlKCE-MrKWw>UFuQ*mU-lT43W`wM}=1eL^*P`1B>p zc?iyaLI)eo#$Kjp1%lJ!s+I5axGp7or@vyaa_7mnI2teWXZ9k+t=UoqiI5Dbc`Hyy z=!3xZ__nj!x71W4k?d0Lr=q!&mcbtfJt0;|`5;WNxj<7qTByLiGVW&NA)vmOL{M1HO7% z+!_V3O#2%-=rZxDa=v=ksU$RcMd8Bgfcmw1^1?7CD*!^@FShpj_A>7Jtog8H?gx2v z0L#jaj+CEa`L1r|z&3vJxM7^{gDq~Lmxq!iT=RUv1He^gxYrL9`eXenlbZLVOq|++ zg1*3mEp;&S1?LyWT=h%LG%RRq=az$Ndv6ZZ3#C&U>(B#hR>ID{l%@m1XSBS&QH0=IB8+ zqQ*}!&fNB@{znb};^#P*nX>;%ed?9g>^%5FCnDE)zp~*U%89j}Niki(e~1O^KQ-}t z@VoT^;}BIT;*~rTl+LVuV(kKNQ_e>it64s3CJgpI`<2zow;=M8wqm-e#%PJ--tp2H z;3EHTTTu#96N?0oCaozY+9wp!eF~Lh0gv>+L%lmZYu>tk`a?M%4vu-8_op1M02KU* zrGt)QIwUWGH&p#!8Bsd7z-Gcy!u3G{@PmQ;0>JYC z&AdW%PQ~ngL2kVqtoErRL9W4#C%o(Frb35W0C>dp2f(kccZV_!Vcnfr+?rha0jHYz zd8Jl#W$cRLlW|v~ZUr!$^-+LBSHX);EctsWfbj6by?Q#pvp+n$1+}D=87c=u{}_mE z%5@C$cZbAR7`m@)&o5sVg$K@Fn@Rg7Y|7_HuSY4+CQ=_fLo_K6BW60_fLn~+lj#br z$l3V_Ft(Df^?e&QiT4Y#)ab{4D2IHWG(Tzm z(E&NF6=~dOC-B_31?C!(g5iUjHCcS)hTVndYtmQ6)T}c7B8y?AU0sr;ud#>q%o- z&fMR`Qttlcqrm8+OC8R{$g}i{Dt!0`OLy0lr*Y3WJ@Qr16V{QIKdQv0)M-bB>kqmB zan4ON0pI}O4lIrHp8WL>*ILKSY5({Ku{y>edf7}T|Bjvrvk_%fS)w%gt=aiN@7x*c z-nxT&+S)ae&_8jB6x@D#in=6!1{f4P*rBi+{T_u`Kqe zbw(i!0gP(HGf>C5yprnx-Td0Gt)k7J#6>CQcwkIgfpVX$I2q*oUk#>A?1jZ3*v$6q zFM_vcA=In1O(9E3qRSI25r2;jUO%gW5FkP(7vLETWwPY1Kan3d$$0d7_iy>YPzqGi z1bB3$DO$rmcepdpw(3w;g#1igL%n*;=SMhI0aWsU^)5nX^B{5DjiyM912YiV&XE&C z+HGQDZQfLm@knnmc#XS=@r1OMI3^N{guKjqzO2x$O3z#)uKN0|SD>qc>;>fWg}JM8 zOo2DOio}Xt&-0{|BsC&Tb~*{4_H42@@uc&7T_UhcuV!l_jWGTd8#dqQjxK_;)`#pm z@_~C39O^J>T6USo?jHo7TTKbkeYpxV+~G5wo6}}XD7;or+R{7!_4IYlueNZK?6pG`fOGCHdMxHR?3K!D(*jIKX(t$AJao6V(xjMkg_J~tt-TNYu z8XR!Ph;jC5!V)*kfqmQb3&sQK1^bW+2X3MmZ@I#?taP#JF~HM#kRfG6-fKcYXxPh@ ziD|4jFi)&lb)3OK!O3yfR$yF=+E3JX_mM>-YeS=zBYZX;)M&&MSEb$UP;Gb9!R(v5 zgfm9U(nPejYz(*q#ffdjB)G{=jp5W04(J=U}b%ig(=W*$TtR-1Edj&%HnGhD5wz zFJz|N9`!F0b60&2!Uq!Q#DAFNFQC2=7at(X8p2OH&*jr0u>%r|ow&Mn zIH(RNsfY(8z~{4l8?N)vh_V&dRr;o|zn`|t#KP?QdT-X4m#GN9#*Vu_xApwqiQ%p{o~GRx zoaM~p9WA6@-_q$8R&9KUDp|TGd`wsOMgZgq!&?T;p)I!Q zgs0nMgQL{wQ3SC`d41ed8iIR-L<0IXS}y->&K$uT3&w zJ+(FraYYV`E(@4ibbjXht}(VDT5*OnsUy&M#7Rz4G$d-$61@#f;Z!h$2elRBP_*$x zt$o@+YQQ>~KRbyWhaU%%Yda0+t6^~UY^QLZH4TT|zwjyT2zlH&bCDkvsX0z6%st#^c^e^?Vgt19|f0StLtl?GF?Sz;GUZ}FESJP#; zm{}Q#7{d6wny+jk_7Y-yso>pAB3z1*xVG{qJL=zKUwSc9bJd_{uEdhhDmY5SOjtRZ z?Noi>aTS-8x6d}cP;)NFed&ezY!>#FVN%4>e=4hsH?UGN07_Qok58J^lQm1dcSF%5!SMoC` z$T1w=z>0NV4vLsoA0KiI8W+$v6^7@mm67+KZ;CxuXgXXTFKOI`JIEeRA6*WOu=vy$ zN&>OVMpjjsG*tTd5tgPUMS^zcHV(Qb@ot12H^Sb`2D|g|?$C%S*u1|c#eDlv*KT2I z>S)g^j$KAtS|sSOclFqr&`OwWU7BnKU@`Hc zhV_Ed`~K2Q3#6{#SQZ`3y14<)m!fGOOi%h(ONT}8 z`-?X;+BY@??hYJm>=2d~mKL=02WFS^kR!=Ec^r!6yIs>#(g8k=e#aaMw21l=^m8!Q zd1V#Jj*k$)#^oi`2IH0)jy;rcyuJ^9d4LCAadEC~wN9!Mc3UTx@c2Fa#>7Or89aS; zD$VSc1@(DIql-|)JAd-zt1IF7f-Bi;8C`wulMGJlgo;zx>7c{H>BG&4jGoZ&mn@bq zJ!*PNj*i%!5li#<_1(?A$wPEaV6~I_@#^Nr+7qUu_!0@p!~ylMtd)8Gd;q{}Cuiy4BR=Qc- z(kww$PFZ0uZidXEWpsXi9VfTr^a%l=-mc16g=^^JSNHEt;N5RbOieX}Be`|vRyYP{ zW5r0ccpi3bPD&Xw2P%Ep1`oiF7~2p{X;Y#zr-L?UHaGD>0R-$qZ$=4RTB^ZB zO1kNINcRJ$2zfKL5LbeDsBwJs;qoT7X(}SxubMA58^Jf2c##u*xVy61YWmrW!nXQe z%jVRiNyO8RPgBy;Zx9*+{_8X5gQfm~jy=Edxw{B~uT^;qL1`-*<_MWdsW&~}I&H## z93Jh-R~b~Z9Bs6&%JGAb4`;oamTGPGAJPX%i8lG{%S^qOk3YV}=r&Y;NV~EcfX~qA zU1$&6-&;96bCbb=fBD#dM(3qWAT=05*c+YDexOnIHu-q+;E8WFSC@>*@e`HXZUKI5 zp@HP+he2K%w~u6BdGBt>dvSE8Cmu0J`NPecB-5C?7Z>jRn#JRf_U1R%H`Z8rw-?RX zN4P9{SLLLR_BCVSbIV z1224e0+FGv@pU_NKU`Un&Vd*C7CkEXYG2lES@fq=g?@{A`m>f>9A9n zr)i)xHz?F+6SjXW>K$Tmvd|WNyu0J#MHukkUz6rk0R4pQ#3KvK zgXID-Tibo1T#}R9VH-m$A#@V%OrUSP<@>^tf6jdz! z#A(J?6oC%hGWZm`bfco8OTf8@f(Bb+|6S(IN|2x+Wu}bArz)`|zjMDTa#nt=&xEm_qT7d7 z>t;-AMXzn`?#+ZbJM5P8$MobUE-t{29_~b!t4K@99LYLW+Fxk#{xv&W*bt9CQ**Du zM3m!b+Fjp?kecQ0=H}~Lk-V`b@nT9Y-zvY)wDxw8TTD1Bppl2H%V?F_ z_}rYs8#gl2&%87rQj>bM=aeJD z!%;4qaV!8`o;|#&Zd1G0#|`Fqk}xqAnDO{F%_-@IQ2Fj=-&}rC+l$kWHMa9c`Zfam z>#5Nbmt&{CUHidp-BqXEjW=$L^7nbHPoN!Jn4oXqh`-G-og)E4iPOZcYM_Pe^SFJ!-2Vp>t$i8?-7@)}8aFr$w@y0FYQIYVAwJn_<5wzYHn^Sci9pme{%uL{+L z-%M}C>NA&xncX-@T9S=beaC)NiMdfS!z}AFHgDnUEOKMxBML+1y^TLqjRD>)b#a5Mb6B+VoWb9 z$(OUD;Y(AXYjZSZEo92g>#=Xax5Xp;8@W>lr_SF$_Ma;dKdLTR#vj*p=pPr2RZef< zO4zDc3Y(n~1#Vars%ZpS3pbhN-8*+EaFks*`SR%E@ujiK+MhS( z6;_x!->L$d1+Y;O$@o4%oQcgGkQlbl#TK;)uV$9Pv$!F}5oX}9z-R&Xo7{={H&>e9 zT*CT^)CCCV@P17=DQ@WC>u+vm+C(zlVz0oTrAE!}6+IHaLDcdy51!Q?A``biIbG=y z{)9K>-7wgc=ViZ#N8P(5!MBVPv{Wz_+zYAkZ7EEE#65}c_n9ImDS z5q0`DTiJnPIfGJwfSpX8^KrkW`RTJQiag&p(Siy2cFRgVoxPu@$s;pRz)bAYh|LK6P^}a2^lCLl}yDn>PwF z(0G&x^WR`;-u>wfIM|;_yJJN#+%1~`UUv?UuZ={?>Zs`EsOxK zedqD#E_c7J+ zVVc&jUsa8X#z8+E8)@Ck*Ac`rgDML8;~vBc<_!C_<|kMv@$HOh*0Y>}xlalu7-L={ zoT<;q2Xj=E3C0|pCmXag5?SG)2p<$5Vf)MnRdULw4gm#|RNQaEz*yv9Wk{=ARWTf* zGGuZ!HdN@?Y|FQDz(_W!?)vaPC`S>8qlU$BRAhoTqYiP3}uj76rbHKA1bxhwp7UCdh1H?elWA-cZ-`xXNn>PHL% zpPH(3(L+Mvg9mRR5zI^IRE9fZj8*T%wxCYLVU+N01SMx(0gSI3P~cdft(HXNMt@nB zVj7L)71<73*r1$fzC94L&Qv%KAeI;rMz_JeRXf44jc~o8aE!-=LSW1$Z1%Ad2VqR@ z3NX6WvkCaZY%MFFf-tcG9~EAF)t;+c2kz7rk4+jpdj=)~as;;ZXlCE8S%Sfp znAU>(zpB)|V_d9XGt>o8jA_!~B~=Jas3&f*t9nB~gY_I1U~E4F+c@oETAUufLOFk$ z>1!5iLz8_e!lDZXcf1)xc5}Ei6%mdd+zVV}ArYlUq94h4>N>>)EjN8kqR7e5O+Tea z@2FgSb#hbLd(u=DTbc#cu;_l6N#$dohv7=e`Y$zrB)Vn2t z*j^nsoLG)3ygBJzk}xiY54k5knSh5cYVozPIgGqRP@s?$m5xRl^z#Ar&3VY=Xqw41 zbFhtLyL*aQ(XG*eE1;=-f7W*!4K%YK6a}X0_B?=eWRFRL)baC;Y#uUuA6jJSTVNrx zP&}xEG2^l=ip5xLj_@2NZTiCwAPaKMq{80`9x{m5<@Jd8Ln3Rg-NX7Jx9r!=jlt>M>;06IjK zYU}vL{l`F^FuNVUn~}U;MA$>LC95aBW7$JPHOfl6&rLbG5cEx8F_S4>u8o*nN3+n* zc?(nCUsM)eL~pl*bub75Y$yQISxJ25%f&$&Y^iTfFdikW23|HT%Tm!9 zz&l(}gSl^@(Klj+fo!jB1W8t7V;>`G9c>YfI%sUn+f>p{t87?3(JUnj`Rfem?f{U= z0b=0Ih%oVCr`neDm7{a1sT3&0Kn|wVb}Xi1+uR~rTQmyD1h*j{1&KNWrU&bJ!hgPP zD1Nc{%q(O>l`>E$agz6KsZs}?#uFzQ!1*gn7AH9XNDi!-z8Z?kQ7D*MP71KB{nWNHjwkF^d9GvSdV5 zWh#K%Ub6QO?(kYMA}afQ2e~xV?V8cwxD!whSpLAWEK2*MLP)vKN$v-z$G02)!t$c% z&o}BRklM`?U84F2?7g`4y$b(WrV(<+0rF+TqyM+{a-}tdmJubGwa3J{9RSU@sQC}& z`sbnI)X%(h%^Uih;$p(NE+=!za0Xo2yF^QICRyL5n<@1#OnUS{qR1%h`~G=~aL1TT z$6)*y5yvF#Ih(!`Ybccsy;?8IvfOd@ho77nMpLYL!;w|*Jt;UQd@D)tWw8ZJi~(tr zt-SuPrhH~O)XRL(TSyCEG3t0ncQM}Cqtg=&7sl`Kzfp*FDVD#a{;Q=yXOdV} z`xhay_Y7)SlvTN-=_JdT@gKlqUBenHxBlV^;B6?Q`lq3yv$JH+zdA!+{IAY9T~6Rw zdL1j600BuM!xJ6tJ;eV-yL4b-=gjgq_E=7q_k!W?$x)ASrLSWfJ-hp+gep@YisWZ; z56Nv|zG6m`*2Jz8drv$vvHa(#vhNmjhYP?+gqe^2G7zfzh7Wqp7<0ce3-y?w?sG$v z$Q$?|u?VhtksBV76V9#aA&sq+W1hw_l#;ke?=1{*3HqAf+G z*kU2ffAc}arpFOY^|ut96;}dwK@{RkG&R8L;^V&o!YaSkKJCyUJ#(UCfRU3U^zR>i zD>IkVh-NzhZ~tXL-Lbj>Py^sRV%oU!3J8wvZ=vb2!_)sjNas7cdty?eK<)C})%`Z2 z02?Z6UO+=*Z*8202JZaD82=^w)iev9*s+to8CxZx(6tpFPFzGa#XNIV0J?kOphv0q zA0;Cqo&N>1k05bFiVbR?2rI9|2nTpQGd4Cb8U$ua{@{jW5?D-e{`z9mOHUP3<0%Pk zXm=cBf9QxqOBATR*Hp^h!@h8J>yFzH^>c_W!Vwh8D?ioh1Yj5o&4wfMs){DZ#Me_< zp}esA+SK_-4d=79t~;=jNML8QO-22YRF0I_u-;PdAhYo!w}7z);pKAC09`mPpn}m4 zg&B=vT}^%I8M-{YrIvygtjxlUOZS1D)ozTdj!R#v0C2^6Af7P}>{a2T)A!*GVb;K$ z$GP!=aAlpX6Cw7u*Z>tJLJ#hUBNIOCz(K@8s-onkI8u2(72sHu)rDVlUL>ua; z5DT_ZnP$TkIei8eyaBG;i7MtnweL#?gY@$Bor5TbXciV%OB$Q}Hn%$7MO|FET2Q;# zky%@(;cYs(+!%0ICS%21e>KB-2yc?Ml~EY6fLrmrn^D=(y1cze*fMfjUESUuS~j_I zHG_XaV}EhW)!fv1d^;la4f}w=(N3I~jD8*AFpv;YXKp?;ghWld_b-iaoU5`gXsz&V zYEVQI(0lmFx+?fAP`gOqC>fgF;?&}jt&j>1xQawW6rL4a2ZOozv#%KvmI_V((oWD^MZ)O zt*y%p+8hmsf;v6U7&L6^gP;LV8T-~qYlQY@mBxNoUh5GdG)deaM}@3pk31mER0V8$ zH%?hqx8gnT2IRkM>bUMx|Emlm)T9Ahr>#m(@H1YvvNyAuLG|j4Om-X|5?)EO#ko9u zh`exkBV@5atQ?#(F>L!K(_SFCkKzbrO=YkyP;JQNo} zQ|8U9Zz_{6W3KHG<+M^-*po~%j++VMt{d&ich}--D|eI|IR>xeo#{2uKdxPOM#&yX z+wK?d&6MU!YPsI-kvlM9w8KC&*pGd9`VQxoqL#qWf*A?%5Fy3H55-4^D{yhHZyfDW zC6yW)9jz~-AH#O?_MvwaPrHrBE${CeH0adgd$qaL+uyumYTw3}=9ZWE5?5V9eWcQG zukHNm(+ihZl0JK~X?&Vprv^`su5GWneKMdNI`r9ATX-C`hj7>q!_V%zSEoTsX-akz z1Y+m>eSO-i_r+BmRmW)tKNmm`n03Ey;kH~RF!Vy~YZWS76(vUpljiZAU1TPY;`w5^ z#L`n16g2nz@9cKn3$$Wmn`xa%$x&WC^xPho7QnZ(@BkT+A5?g-4jz8*>f0Q@%ZHEP>avwgraCD{W zviRtvt6#1|hg?w}-Lg6DahFEWuC~Yip}kCJhKAr#VyHk_(y`5^*E;JCVdaT;t?urv zZ@MCf!IFWyTS%|fz@7PInFE=ad^oge^;nbCT~b#|qBe!C(e_B7~VGw&F|lW_X*O**&I3PjIGxNS-|!R|+u z>EystJN~<&H+&a2S=iLHXZ}l96!D+MY2uU8{!fe3Cl6EmzbQ`tcMod=o?1_Q^xA*_ z)HY%j`ky*95y$^jhXx+>EchRF=vaM-HrqYg1_E#G-B&!4WzU}0@NwL)Pqc1`{xT-V z|6Z|@l+`|q#^h)lpCmH7KB{SKg2_%l@;=JpNewqAEjwaWg7|6Ng<>uDOBIhpm zFI9WKUW8m{+xC)cZ@jE&2-G`?PdnYm>LVB$^;?3$niK+#Toun1DbZ^jH}8cu|ERy) zDyu%soB3>0PNTRDaU?5mEQ$^LggC zt@!uYOKbIB3k$>^*;O+IeywLHS`0A!Zq&;kO^0RUT zHutsJH*!=f=-G3cd3TC2Z|@5~0;1sT>xE-gd9TPvgML=^8y{o2R(1H!;|>h_mCy1C z24B7G@ zdL8GWn)T#m}0;5(p1%|Ji9rX{$?NP>sM|wmsyNw)Jk_K&A38J%D;#JrCp&%l~zW> z&pyRsob)NY2UHq4Jq@fF-v>XD$ptrja!OPR9z*CWpQWzl{L~W*;M@MVi&7CdK zq2lXnQi{_bB@53LfY+a1ka)iaXOgDezn(DKrgAl&^?d`NqT2taFeSrg1>q{-UW58Ss)7ey`X6(`f|VWwFb;qF1gmhwg_< z?&H}OLIv5vPSqtEW?Sr3lnIQhZW6xVl{uaXRmfsLK5(%+FUHbaZ1|AJ(l3m={SJ+C z7h^MBL{ZK`RzVd@rb?fJwooUNU>u)>e-ACsCH+?PGJ zYZEl}cVrxkGQyAbe`<*XiA@}l^%Js(!#3}5-Np|)BxnllUKfp1rI`bD!bj1&Ae>mZC*r8 zu#84r^n>OztV!JxaHy!e|K)9Dh-mp;|FEoIplP8s#gHIUdj)M<^}VmpgKp@bhW9Ah z;R~#92O4Bns19dDX~_MIU?5c!3H+o2({wTH^>n0(m+r-$XL(P&q|EF?!9IxpDe8h^W(-g{L=FgRd(yxoUqdWHJpi8+^kN zJgvs{O{LDoHkpf1lzhL|F;eU3u<&YTiq50`qmI3oe6DO6#~T(w z*w%yPe>n4xcO^N?e^ZO-JXZTvD~rU#p{CBJY>zS7UcbCP4x@6yBy4~9#rp!=I{B9oDt310YF7S*cc-8Jd zv)w<>k^Y~bS9-Dl`u{rH{dbQhC8oH)o<}P5XZiK7rB~wN|D5u`zaK~X@8^+*=|kMc z#b_J$^&LH4Kjzd+ur^$TR3g=dAX$39a?Y7wqxA2BsSkZiv5BYsVyd5{lH*(m!%x3$U@a|(EnKc9qF)# zJTs=_v&CJbkK4_Cl*N|C(H-lr-t)>y5Nt$^R>jP^C7-O@ot6w9rMs0lkUwXK(?RkUEb> zoxdB6x?=j!`YS3ndDz~c?UUd_yxH1!JB5{XEK#1Hu+xFJ)5CB^5v0cljvsc5megp! z%;KEkb|^}x@aN}=d7s&c3NK`#xy-3;^8C_Hkb3#g_Ibqg^H$)<#KL-gHM0wJ_>+;m>Z7$T2CFKR4a@GkM@oFDlj{X07JMX9{nl29` z5(ESUNg^Twl9Vuk34r7v83aV4!oZNzNDh((2@;1O83B=uULG#uCD5Sy3&re26q7^UM7nf3IREVS?_PW)Ye+3fQPFH z;8_A{N$l~96vRMzQ?V-D`JsL;%)IOQcH;zrhn9_>%!@7Sw(0zzfO4d~5i)rUx28`Z z=0~5T$4P>$vpHV&cV4`C*R$+hX6va#v%|e!bNsPVnQRS~y@Q20F)FXXD0K5VjRlo& zWACN$2%=d>&beut%4dypwyMQ_%;z|?Gomuv=-N6K#G4 zwVm)8olKoyw6g3j9=LhPF$9B-f6WZg>A#YYY~ifd*>qHPH!~_$6GtY)83WiIRR$l~m(Sssz;r zb~$f%n&}G^0HQ?qqJru5dr0MTdwZl!@Er>E$i$Af>jnHRU* zZQ3w8%Fyzm;TyFr7R6CzoEMZ7dx&$*x%;Oyc0^8BZa94so_|}B4qx>+?>@mjf8pt@ zVoD8XK(2yDdSgIWsMZZHMy0&bXZb5b1rk||3IU*z%67hmeU-u#8N_5!#w!nAD3Ok&DiJT}7?LsKT44Ax$=jG+b_aD& zpa$Jlsrn0OG9@)d4?RSew3u@GYhnMy%Q{PTw$ei5A^J-J%V@3Ivej(lJ~v!tExgjM zIsmA|%&)qh#AV_#Pmz!!O~GCBaPr}s;vI<)>R9`U{Dl-#57@vYC!vN$i-z;&Jjsnc z<9rki|AgHt<;L{WOA{U*4BLn+*XM#CJRSaI&uLGtt4pGWFj(7fkCWq=dmKZ&`_aQo z=NwNjOZ#r8IjSpo!@$40g2=LZBLbAvXr(^NGgG_#gmY*6*>X3bMvNvQO1RhBd8R~b zyzM2T>T8GSfy>9O(!)bQy)fTwHB9WN%i5yNj$~CgrPDt7`bdWM%Td3#V2EewL{PRT zO}1btf8rg#ycXgd*xk3^Y|+IYVzjRe+vDp!WAt=~pqgGro+he^u-?WT@qIUV*r9H zdwIg^-sv4ZNt}8&M#;Ne|G=Von6( zjGa>a*BwhqH#bxR%+1Y3Vh+H2-xZW-I3PK|bv0bJyi@hD)qQsZVHxxw2iI5mVlHbM z`HIgqth{Iv_w2`1<$_t=?`z*2uE|>m^0mHEGh+{vzPR8ZGFjY!DjzhG@*`b4Kk_-W zEk1^dyrcNdV;|TWAGAgU?wdsMCGf_pkOqjAWG0_}$&UHzbLXp6wTk%DbwCr3$qg?x z)1fSpG!yz{lrL0v4OUHU7{ygDqwJ=x_*_~sN{olbk9GOUlM`tL8}{#~Pwu=84}8*> z^E0l$zKCZ<(nTcon-;t(&_3Og6d2+c_pyA!@BXvayUQ!t+7GRA3aM{Ql@GJ-#JkvW z5gKnj{W@sf4Cn>b(zWCDD-~#wu^G4yyvR>&e`B|9_Lz}PNjpzWyiqBGCjg&Vz9C!J z3X$N=7tdXK%jd*6-r$>KBaKJVv#A$e#XIPym0kP*r6fl($;@?qkG_oO&ceaIJ9u8|MdCteZ2Y#hV5Pzj+_cId~t&68c(HN1-T z%ygsErfrcTy!$DK&zHAIm%!5mwRsNAoSCeR9 zu-?&mbG%-gCN4zOarKtyM3SUf9y9ls=9T*RgRsU3Io(G92;K!3Xz-*C=N)oK%Qs9a zPUmNtNku4F&0lLX&=+WyG>lvMhE~kn9$NP9!&jwUwOM=8SE0Jcn=gsRTk^)M-ixC9 zj`m|CJ(}BdB2LP@Rv|$|)iqDLF4lOOFT8c_2eN!Py~GhcVf#pUWS*oOEDwxeOjHf! zA&Tw&EM{}f`Qu%BYxY;)A5Ek#zHcMhzwE`!u4%;erfzM}#vOL8eEp$N9b(!)h`#(D z>pQ)uqkAHGIav%;(#A-m63^zjfae$EcNL!ko5PIYcO@}58&I_3sG7ed-Jo?NRpMlOz&@b{eI|*9J6(w zrauv7`?KJX4elKaN3 zd+k`PCA!L4E>fgk>T0#A4f*9c>xN1Dpmn4C!o_A5hf!Ax9_dNVcR_?ItH~4+i9eyw zZdc5p2!bO{3`6m+LrZI>c{kPLzHO4<_4zT?i&P!tmUwKLoeVT@a@=E}kDqR~h?~=n zt5(uB4r)m07V{#28wDHM3%!2XJxBk!BBXce+dI$(5?puKM+BcUy90cYpd9y!Ue>|G z$k)FWX&`w0VnRE5*Kpgo$|?8Tj?^2E(qhAG6jKRPzDWd(Dwv313yT&%L$Vi2f$wMOM#1UAEfqTI)q% zWt&Ln`S261b<1_nQ=Q;7`hGJTb|lE)6cAckOiGUEElG0SKFF!I@b?f&Mbg`~gA>Ev zEXU62UpXpY@TL6NjjU^`^d+0~OR6yGnG2gXZ-I1fqIMP!pbKrWgZe&v%=X9gYqRsc zG2Z9)14*vph7v3xeLZPXVjTp^{`EEF=oS523j_0nta#L%9WX#?)9E^2kzj^ znS&Ry4g_!ays+?VLvsKIFiODsms+Es(b;qglh1pv>HSft#m77-TY)Bi$ zT6BeHR>aVY^4IY}TF=_Y?zy6O$L2%yIm&?_%mi*Uq)Wm?C_B;kiCb#A>;>8PSwA1E zSwwY3Tj4*-crQx4lp7D>5LYRnPaSGjZ}H-hf>M^j!(;k;r?!AjAg*deC3q1-xDqp-)Ul}*WSRT9o zPAd5Fq)CQ)6Fd_?aKA#~D*s$>dJ817P*=0ScOAcbOdBe=!xiK`47N^EjG^3!jcdsI z(e+M@?JckF;(5NYqC_=1iDa%9b}T8;KcB}mUpMfK8F?dFqG_=J-C1BT?boKU_g2(O zZjGtyr&uo{GPnkG_~+aDJ5T8W*a(l-x}*;@m~F!4S45mM2M)IQ=xk35~2Io9D9O3f<@{aNySuAp`X>@+I$ zTu@c#Y*fh8=BsQT2&~?A|I9iaUit9z5-fwVOs}>-#AZ*-V0nUwNh_SrspQh~aVlx$ zfK02Ah{2mn@w^G4bWKP_(@z5QZwOcX;pvhpX-K9h_l(g+xWuGDw%9-H^Q?FWi%k+UD=zG#$n|#$*@~mOS z;le{+<9fZ28j{sg0&P~6;O3=5@(j^_^S5i0TLyPa+!o$7y}phTuN&)O5h^g{I?0<7 zNNPE4y&cOAW;Nz%nV~F%bzP3m&wOVgwU8DKOTYTtibh4yFSFw%swsu5w#L9Gvnu*7w+l3^ecZl;@55hbzd`hy|J3Q zWiQH{O!Pa+5JqIU^3HCwbVgdaz`bkB9+Q zE>j$h3ybkbTZE2XVI-~Yt`lC8vZu7&gLlSvjhMX8FP7K4P7#OB<>}h?wOKMH^X8Zi zt=uXl;4&?%TfEQeagkG&AsaSkaBuO>-Q(<^%?%f#=Mb+evJQ9CHi{gSX-qE}TG24Q zwlOS`f4XcE8>MEhkN)00ncMtHGQse@MsjD&rGPX(b)76nsoE}PDdz|0_0#VGW7cFc z(AP9Os@ORA1RAV$DD#2^i)kqe%F*A;W!ywkIlgKmUg)QC#;CWB_HiaO#rS1Z@ICe) zktzv_*iU;|1$5tf(LVFkAa-V9DMU)?U=40A_BO$%6B7jA@<0D6bVRRM=FEv3(6F4L ze;UyK*Kc(EyMXqO7tQ|bdEzhl;=lMtSWN5R$2kB7Pj`08lzm_M@hoP_gjqscjQvD} zKp>P<6oDpC!H28j$j6;B!>s1UiiYwOGgBKeALY_>fWj4M9%DAA{3(wK)#JfuT&)kK zTSVKq7qmDpN_v)^9vsPWs`y6^JfShsRFA#c^ytU^fdT`ji!ak7+I~)NI%AgABxYIV z&P!L?{b*x<=Ko3NY5z}~w+w+955s1ges=R3b_+Ko1!M*?*T~8p z!3vTvOUIt5l_=uqF^Fx4&X*3~S=e5m`oF?KPN=@xVD9nunWa_V z<;&YsKdn31b-(s0U%Bt@IV9u-)R~s1-b_Yk&+uFAK1Xz~a$AMvMeg7%3vPuHOTOH` z*%7hfb{^gb&*W^k(`j9rYO+FTBi*Ki^iuA`MM#RmZRqh1JNZ?>BCW^xt>YF14({0> z$Xj=ls%-;IOlxXbauqCjEr3atelr?T>WX!;9<_#Go9_E-JEOk)qrm-mpWG39f8y#%tISkzdotN#asIB|t_aSq>11mR)p!_u zt0)c6`+Q>_G;6uN4lb zZL3USe>fNo3YFGNruAqJM5uO4PhS9B*dL16ODeonM^aqO+1n6KEN zemqTw-ZkW2vlUC$aJ$sgBN9^EK(GxVOE_J&k0?aP+ib4gn4v(~8bXRGWGvZH`K-ju}?fpCpY-)k;q zTkCs!w@>K^0Z+tRTVM>?My}T1`%iW-Krql~oZ&Z6L)mUr96S6jCfqHZ6KqeI zjE)80&2Vaw{dOb1@D2fV#lXeI_xpyh6(Tw}U6V7pV9%rZvO zse`>O^c%il#pSA}CX7fqspdQ~Wu%cphJ&`E z(T@5yxq>PguA?ZYjG@g8E796|WnaLw)n=QDZ@kS3)#j`<;A>SAYj5u%|9i#fZl7%5 zwHqnDHX~c;<8q8lQm9e5GwAPJ+xI;>u)w3ZgL1ObHBBt{YlK5FP5S5stw(O>4mvV; zPGZz+N1M;YlWxEX=!Etfpu)$ky}Z~ z58s-{#+^ST#agoJ*mCuI2N&I_(L`EgM)v19yIbNTM`O|7jh#xFhjA^94ikQr8Uqb1@ zt~R4%(@9$EGlws4>cQUJI!|Qd@5n5CZ^dqnqcEaE~ z(*2WNa>tb!KjxbWvLMPRH#=&x8JLQN^XWzB9=Rzw?{m6zPlIuL+?fSbDI-TCYdbRx z^ASUr{4eAq_K%X0o1K#*zlMdanYAfa_+_GOhrxquJvLRbvo-x|&h3gaMUr9|%y1S` zfxiw6T38T6hDQEN!x9>?2aD}r8W78l{#^sWFmrPp4g2Qm89O+(Oa86_1+cX9Ga80= zjjLhGde#nz&Zy;J9g_*wy1RdBFal z!ErS~fj?+~KWM-|XrMo6;6G@Bf6yR*(Ed;l!9UbP@DKHX{GlEY00e)kIm0LSqu z1c-Y*ARsKN`Ak|cmiBs9`@{JJ|8PDC_Ky5aS}5>rI|V?X*wu|Qb}%fd_KXGx;Iu0U z95*dg0JmL10k~}v3dAx}f6oI7gq`gR04NB{c|BtX#=_jsXup8BXEiKP_KXI>qHxb> zP@H}az_ye-m>1#=4QPiZ|70T3Jl1w!CP2spq5X#|4`fB+yc!bAXI3@|o< zKt=!F0)uZRee7t2a{Lu|F>MV9B)xf4Mpc%SoRs(99RN5K3I;;JaG)S&h{U)+00sra O;9w8{0N~{%C;bm|NV}K- literal 0 HcmV?d00001 diff --git a/cgi-bin/printers.c b/cgi-bin/printers.c new file mode 100644 index 0000000..89f2a1b --- /dev/null +++ b/cgi-bin/printers.c @@ -0,0 +1,578 @@ +/* + * "$Id: printers.c 9793 2011-05-20 03:49:49Z mike $" + * + * Printer status CGI for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for CGI. + * do_printer_op() - Do a printer operation. + * show_all_printers() - Show all printers... + * show_printer() - Show a single printer. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" +#include + + +/* + * Local functions... + */ + +static void do_printer_op(http_t *http, const char *printer, ipp_op_t op, + const char *title); +static void show_all_printers(http_t *http, const char *username); +static void show_printer(http_t *http, const char *printer); + + +/* + * 'main()' - Main entry for CGI. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + const char *printer; /* Printer name */ + const char *user; /* Username */ + http_t *http; /* Connection to the server */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + const char *op; /* Operation to perform, if any */ + static const char *def_attrs[] = /* Attributes for default printer */ + { + "printer-name", + "printer-uri-supported" + }; + + + /* + * Get any form variables... + */ + + cgiInitialize(); + + op = cgiGetVariable("OP"); + + /* + * Set the web interface section... + */ + + cgiSetVariable("SECTION", "printers"); + cgiSetVariable("REFRESH_PAGE", ""); + + /* + * See if we are displaying a printer or all printers... + */ + + if ((printer = getenv("PATH_INFO")) != NULL) + { + printer ++; + + if (!*printer) + printer = NULL; + + if (printer) + cgiSetVariable("PRINTER_NAME", printer); + } + + /* + * See who is logged in... + */ + + user = getenv("REMOTE_USER"); + + /* + * Connect to the HTTP server... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + /* + * Get the default printer... + */ + + if (!op || !cgiIsPOST()) + { + /* + * Get the default destination... + */ + + request = ippNewRequest(CUPS_GET_DEFAULT); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + sizeof(def_attrs) / sizeof(def_attrs[0]), NULL, def_attrs); + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL) + cgiSetVariable("DEFAULT_NAME", attr->values[0].string.text); + + if ((attr = ippFindAttribute(response, "printer-uri-supported", IPP_TAG_URI)) != NULL) + { + char url[HTTP_MAX_URI]; /* New URL */ + + + cgiSetVariable("DEFAULT_URI", + cgiRewriteURL(attr->values[0].string.text, + url, sizeof(url), NULL)); + } + + ippDelete(response); + } + + /* + * See if we need to show a list of printers or the status of a + * single printer... + */ + + if (!printer) + show_all_printers(http, user); + else + show_printer(http, printer); + } + else if (printer) + { + if (!*op) + { + const char *server_port = getenv("SERVER_PORT"); + /* Port number string */ + int port = atoi(server_port ? server_port : "0"); + /* Port number */ + char uri[1024]; /* URL */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), + getenv("HTTPS") ? "https" : "http", NULL, + getenv("SERVER_NAME"), port, "/printers/%s", printer); + + printf("Location: %s\n\n", uri); + } + else if (!strcmp(op, "start-printer")) + do_printer_op(http, printer, IPP_RESUME_PRINTER, + cgiText(_("Resume Printer"))); + else if (!strcmp(op, "stop-printer")) + do_printer_op(http, printer, IPP_PAUSE_PRINTER, + cgiText(_("Pause Printer"))); + else if (!strcmp(op, "accept-jobs")) + do_printer_op(http, printer, CUPS_ACCEPT_JOBS, cgiText(_("Accept Jobs"))); + else if (!strcmp(op, "reject-jobs")) + do_printer_op(http, printer, CUPS_REJECT_JOBS, cgiText(_("Reject Jobs"))); + else if (!strcmp(op, "purge-jobs")) + do_printer_op(http, printer, IPP_PURGE_JOBS, cgiText(_("Purge Jobs"))); + else if (!_cups_strcasecmp(op, "print-self-test-page")) + cgiPrintCommand(http, printer, "PrintSelfTestPage", + cgiText(_("Print Self-Test Page"))); + else if (!_cups_strcasecmp(op, "clean-print-heads")) + cgiPrintCommand(http, printer, "Clean all", + cgiText(_("Clean Print Heads"))); + else if (!_cups_strcasecmp(op, "print-test-page")) + cgiPrintTestPage(http, printer); + else if (!_cups_strcasecmp(op, "move-jobs")) + cgiMoveJobs(http, printer, 0); + else + { + /* + * Unknown/bad operation... + */ + + cgiStartHTML(printer); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + } + else + { + /* + * Unknown/bad operation... + */ + + cgiStartHTML(cgiText(_("Printers"))); + cgiCopyTemplateLang("error-op.tmpl"); + cgiEndHTML(); + } + + /* + * Close the HTTP server connection... + */ + + httpClose(http); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'do_printer_op()' - Do a printer operation. + */ + +static void +do_printer_op(http_t *http, /* I - HTTP connection */ + const char *printer, /* I - Printer name */ + ipp_op_t op, /* I - Operation to perform */ + const char *title) /* I - Title of page */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI], /* Printer URI */ + resource[HTTP_MAX_URI]; /* Path for request */ + + + /* + * Build a printer request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(op); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + /* + * Do the request and get back a response... + */ + + snprintf(resource, sizeof(resource), "/printers/%s", printer); + ippDelete(cupsDoRequest(http, request, resource)); + + if (cupsLastError() == IPP_NOT_AUTHORIZED) + { + puts("Status: 401\n"); + exit(0); + } + else if (cupsLastError() > IPP_OK_CONFLICT) + { + cgiStartHTML(title); + cgiShowIPPError(_("Unable to do maintenance command:")); + } + else + { + /* + * Redirect successful updates back to the printer page... + */ + + char url[1024], /* Printer/class URL */ + refresh[1024]; /* Refresh URL */ + + + cgiRewriteURL(uri, url, sizeof(url), NULL); + cgiFormEncode(uri, url, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "5;URL=%s", uri); + cgiSetVariable("refresh_page", refresh); + + cgiStartHTML(title); + + if (op == IPP_PAUSE_PRINTER) + cgiCopyTemplateLang("printer-stop.tmpl"); + else if (op == IPP_RESUME_PRINTER) + cgiCopyTemplateLang("printer-start.tmpl"); + else if (op == CUPS_ACCEPT_JOBS) + cgiCopyTemplateLang("printer-accept.tmpl"); + else if (op == CUPS_REJECT_JOBS) + cgiCopyTemplateLang("printer-reject.tmpl"); + else if (op == IPP_PURGE_JOBS) + cgiCopyTemplateLang("printer-purge.tmpl"); + } + + cgiEndHTML(); +} + + +/* + * 'show_all_printers()' - Show all printers... + */ + +static void +show_all_printers(http_t *http, /* I - Connection to server */ + const char *user) /* I - Username */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + cups_array_t *printers; /* Array of printer objects */ + ipp_attribute_t *printer; /* Printer object */ + int ascending, /* Order of printers (0 = descending) */ + first, /* First printer to show */ + count; /* Number of printers */ + const char *var; /* Form variable */ + void *search; /* Search data */ + char val[1024]; /* Form variable */ + + + fprintf(stderr, "DEBUG: show_all_printers(http=%p, user=\"%s\")\n", + http, user ? user : "(null)"); + + /* + * Show the standard header... + */ + + cgiStartHTML(cgiText(_("Printers"))); + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-type + * printer-type-mask + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type", 0); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type-mask", CUPS_PRINTER_CLASS); + + if (user) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + cgiGetAttributes(request, "printers.tmpl"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Get a list of matching job objects. + */ + + if ((var = cgiGetVariable("QUERY")) != NULL && + !cgiGetVariable("CLEAR")) + search = cgiCompileSearch(var); + else + search = NULL; + + printers = cgiGetIPPObjects(response, search); + count = cupsArrayCount(printers); + + if (search) + cgiFreeSearch(search); + + /* + * Figure out which printers to display... + */ + + if ((var = cgiGetVariable("FIRST")) != NULL) + first = atoi(var); + else + first = 0; + + if (first >= count) + first = count - CUPS_PAGE_MAX; + + first = (first / CUPS_PAGE_MAX) * CUPS_PAGE_MAX; + + if (first < 0) + first = 0; + + sprintf(val, "%d", count); + cgiSetVariable("TOTAL", val); + + if ((var = cgiGetVariable("ORDER")) != NULL) + ascending = !_cups_strcasecmp(var, "asc"); + else + ascending = 1; + + if (ascending) + { + for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, first); + i < CUPS_PAGE_MAX && printer; + i ++, printer = (ipp_attribute_t *)cupsArrayNext(printers)) + cgiSetIPPObjectVars(printer, NULL, i); + } + else + { + for (i = 0, printer = (ipp_attribute_t *)cupsArrayIndex(printers, count - first - 1); + i < CUPS_PAGE_MAX && printer; + i ++, printer = (ipp_attribute_t *)cupsArrayPrev(printers)) + cgiSetIPPObjectVars(printer, NULL, i); + } + + /* + * Save navigation URLs... + */ + + cgiSetVariable("THISURL", "/printers/"); + + if (first > 0) + { + sprintf(val, "%d", first - CUPS_PAGE_MAX); + cgiSetVariable("PREV", val); + } + + if ((first + CUPS_PAGE_MAX) < count) + { + sprintf(val, "%d", first + CUPS_PAGE_MAX); + cgiSetVariable("NEXT", val); + } + + /* + * Then show everything... + */ + + cgiCopyTemplateLang("search.tmpl"); + + cgiCopyTemplateLang("printers-header.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + cgiCopyTemplateLang("printers.tmpl"); + + if (count > CUPS_PAGE_MAX) + cgiCopyTemplateLang("pager.tmpl"); + + /* + * Delete the response... + */ + + cupsArrayDelete(printers); + ippDelete(response); + } + else + { + /* + * Show the error... + */ + + cgiShowIPPError(_("Unable to get printer list:")); + } + + cgiEndHTML(); +} + + +/* + * 'show_printer()' - Show a single printer. + */ + +static void +show_printer(http_t *http, /* I - Connection to server */ + const char *printer) /* I - Name of printer */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + char refresh[1024]; /* Refresh URL */ + + + fprintf(stderr, "DEBUG: show_printer(http=%p, printer=\"%s\")\n", + http, printer ? printer : "(null)"); + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + + cgiGetAttributes(request, "printer.tmpl"); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + /* + * Got the result; set the CGI variables and check the status of a + * single-queue request... + */ + + cgiSetIPPVars(response, NULL, NULL, NULL, 0); + + if (printer && (attr = ippFindAttribute(response, "printer-state", + IPP_TAG_ENUM)) != NULL && + attr->values[0].integer == IPP_PRINTER_PROCESSING) + { + /* + * Printer is processing - automatically refresh the page until we + * are done printing... + */ + + cgiFormEncode(uri, printer, sizeof(uri)); + snprintf(refresh, sizeof(refresh), "10;URL=/printers/%s", uri); + cgiSetVariable("refresh_page", refresh); + } + + /* + * Delete the response... + */ + + ippDelete(response); + + /* + * Show the standard header... + */ + + cgiStartHTML(printer); + + /* + * Show the printer status... + */ + + cgiCopyTemplateLang("printer.tmpl"); + + /* + * Show jobs for the specified printer... + */ + + cgiCopyTemplateLang("printer-jobs-header.tmpl"); + cgiShowJobs(http, printer); + } + else + { + /* + * Show the IPP error... + */ + + cgiStartHTML(printer); + cgiShowIPPError(_("Unable to get printer status:")); + } + + cgiEndHTML(); +} + + +/* + * End of "$Id: printers.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/search.c b/cgi-bin/search.c new file mode 100644 index 0000000..75c47bd --- /dev/null +++ b/cgi-bin/search.c @@ -0,0 +1,381 @@ +/* + * "$Id: search.c 9793 2011-05-20 03:49:49Z mike $" + * + * Search routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cgiCompileSearch() - Compile a search string. + * cgiDoSearch() - Do a search of some text. + * cgiFreeSearch() - Free a compiled search context. + */ + +/* + * Include necessary headers... + */ + +#include "cgi-private.h" +#include + + +/* + * 'cgiCompileSearch()' - Compile a search string. + */ + +void * /* O - Search context */ +cgiCompileSearch(const char *query) /* I - Query string */ +{ + regex_t *re; /* Regular expression */ + char *s, /* Regular expression string */ + *sptr, /* Pointer into RE string */ + *sword; /* Pointer to start of word */ + int slen; /* Allocated size of RE string */ + const char *qptr, /* Pointer into query string */ + *qend; /* End of current word */ + const char *prefix; /* Prefix to add to next word */ + int quoted; /* Word is quoted */ + int wlen; /* Word length */ + char *lword; /* Last word in query */ + + + DEBUG_printf(("cgiCompileSearch(query=\"%s\")\n", query)); + + /* + * Range check input... + */ + + if (!query) + return (NULL); + + /* + * Allocate a regular expression storage structure... + */ + + if ((re = (regex_t *)calloc(1, sizeof(regex_t))) == NULL) + return (NULL); + + /* + * Allocate a buffer to hold the regular expression string, starting + * at 1024 bytes or 3 times the length of the query string, whichever + * is greater. We'll expand the string as needed... + */ + + slen = strlen(query) * 3; + if (slen < 1024) + slen = 1024; + + if ((s = (char *)malloc(slen)) == NULL) + { + free(re); + return (NULL); + } + + /* + * Copy the query string to the regular expression, handling basic + * AND and OR logic... + */ + + prefix = ".*"; + qptr = query; + sptr = s; + lword = NULL; + + while (*qptr) + { + /* + * Skip leading whitespace... + */ + + while (isspace(*qptr & 255)) + qptr ++; + + if (!*qptr) + break; + + /* + * Find the end of the current word... + */ + + if (*qptr == '\"' || *qptr == '\'') + { + /* + * Scan quoted string... + */ + + quoted = *qptr ++; + for (qend = qptr; *qend && *qend != quoted; qend ++); + + if (!*qend) + { + /* + * No closing quote, error out! + */ + + free(s); + free(re); + + if (lword) + free(lword); + + return (NULL); + } + } + else + { + /* + * Scan whitespace-delimited string... + */ + + quoted = 0; + for (qend = qptr + 1; *qend && !isspace(*qend); qend ++); + } + + wlen = qend - qptr; + + /* + * Look for logic words: AND, OR + */ + + if (wlen == 3 && !_cups_strncasecmp(qptr, "AND", 3)) + { + /* + * Logical AND with the following text... + */ + + if (sptr > s) + prefix = ".*"; + + qptr = qend; + } + else if (wlen == 2 && !_cups_strncasecmp(qptr, "OR", 2)) + { + /* + * Logical OR with the following text... + */ + + if (sptr > s) + prefix = ".*|.*"; + + qptr = qend; + } + else + { + /* + * Add a search word, making sure we have enough room for the + * string + RE overhead... + */ + + wlen = (sptr - s) + 2 * 4 * wlen + 2 * strlen(prefix) + 11; + if (lword) + wlen += strlen(lword); + + if (wlen > slen) + { + /* + * Expand the RE string buffer... + */ + + char *temp; /* Temporary string pointer */ + + + slen = wlen + 128; + temp = (char *)realloc(s, slen); + if (!temp) + { + free(s); + free(re); + + if (lword) + free(lword); + + return (NULL); + } + + sptr = temp + (sptr - s); + s = temp; + } + + /* + * Add the prefix string... + */ + + strcpy(sptr, prefix); + sptr += strlen(sptr); + + /* + * Then quote the remaining word characters as needed for the + * RE... + */ + + sword = sptr; + + while (qptr < qend) + { + /* + * Quote: ^ . [ $ ( ) | * + ? { \ + */ + + if (strchr("^.[$()|*+?{\\", *qptr)) + *sptr++ = '\\'; + + *sptr++ = *qptr++; + } + + *sptr = '\0'; + + /* + * For "word1 AND word2", add reciprocal "word2 AND word1"... + */ + + if (!strcmp(prefix, ".*") && lword) + { + char *lword2; /* New "last word" */ + + + if ((lword2 = strdup(sword)) == NULL) + { + free(lword); + free(s); + free(re); + return (NULL); + } + + strcpy(sptr, ".*|.*"); + sptr += 5; + + strcpy(sptr, lword2); + sptr += strlen(sptr); + + strcpy(sptr, ".*"); + sptr += 2; + + strcpy(sptr, lword); + sptr += strlen(sptr); + + free(lword); + lword = lword2; + } + else + { + if (lword) + free(lword); + + lword = strdup(sword); + } + + prefix = ".*|.*"; + } + + /* + * Advance to the next string... + */ + + if (quoted) + qptr ++; + } + + if (lword) + free(lword); + + if (sptr > s) + strcpy(sptr, ".*"); + else + { + /* + * No query data, return NULL... + */ + + free(s); + free(re); + + return (NULL); + } + + /* + * Compile the regular expression... + */ + + DEBUG_printf((" s=\"%s\"\n", s)); + + if (regcomp(re, s, REG_EXTENDED | REG_ICASE)) + { + free(re); + free(s); + + return (NULL); + } + + /* + * Free the RE string and return the new regular expression we compiled... + */ + + free(s); + + return ((void *)re); +} + + +/* + * 'cgiDoSearch()' - Do a search of some text. + */ + +int /* O - Number of matches */ +cgiDoSearch(void *search, /* I - Search context */ + const char *text) /* I - Text to search */ +{ + int i; /* Looping var */ + regmatch_t matches[100]; /* RE matches */ + + + /* + * Range check... + */ + + if (!search || !text) + return (0); + + /* + * Do a lookup... + */ + + if (!regexec((regex_t *)search, text, sizeof(matches) / sizeof(matches[0]), + matches, 0)) + { + /* + * Figure out the number of matches in the string... + */ + + for (i = 0; i < (int)(sizeof(matches) / sizeof(matches[0])); i ++) + if (matches[i].rm_so < 0) + break; + + return (i); + } + else + return (0); +} + + +/* + * 'cgiFreeSearch()' - Free a compiled search context. + */ + +void +cgiFreeSearch(void *search) /* I - Search context */ +{ + regfree((regex_t *)search); +} + + +/* + * End of "$Id: search.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/template.c b/cgi-bin/template.c new file mode 100644 index 0000000..8fb8b3f --- /dev/null +++ b/cgi-bin/template.c @@ -0,0 +1,733 @@ +/* + * "$Id: template.c 9793 2011-05-20 03:49:49Z mike $" + * + * CGI template function. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cgiCopyTemplateFile() - Copy a template file and replace all the + * '{variable}' strings with the variable value. + * cgiCopyTemplateLang() - Copy a template file using a language... + * cgiGetTemplateDir() - Get the templates directory... + * cgiSetServerVersion() - Set the server name and CUPS version... + * cgi_copy() - Copy the template file, substituting as needed... + * cgi_puts() - Put a string to the output file, quoting as + * needed... + */ + +#include "cgi-private.h" +#include +#include + + +/* + * Local functions... + */ + +static void cgi_copy(FILE *out, FILE *in, int element, char term, + int indent); +static void cgi_puts(const char *s, FILE *out); +static void cgi_puturi(const char *s, FILE *out); + + +/* + * 'cgiCopyTemplateFile()' - Copy a template file and replace all the + * '{variable}' strings with the variable value. + */ + +void +cgiCopyTemplateFile(FILE *out, /* I - Output file */ + const char *tmpl) /* I - Template file to read */ +{ + FILE *in; /* Input file */ + + + fprintf(stderr, "DEBUG2: cgiCopyTemplateFile(out=%p, tmpl=\"%s\")\n", out, + tmpl ? tmpl : "(null)"); + + /* + * Range check input... + */ + + if (!tmpl || !out) + return; + + /* + * Open the template file... + */ + + if ((in = fopen(tmpl, "r")) == NULL) + { + fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n", + tmpl ? tmpl : "(null)", strerror(errno)); + return; + } + + /* + * Parse the file to the end... + */ + + cgi_copy(out, in, 0, 0, 0); + + /* + * Close the template file and return... + */ + + fclose(in); +} + + +/* + * 'cgiCopyTemplateLang()' - Copy a template file using a language... + */ + +void +cgiCopyTemplateLang(const char *tmpl) /* I - Base filename */ +{ + char filename[1024], /* Filename */ + locale[16], /* Locale name */ + *locptr; /* Pointer into locale name */ + const char *directory, /* Directory for templates */ + *lang; /* Language */ + FILE *in; /* Input file */ + + + fprintf(stderr, "DEBUG2: cgiCopyTemplateLang(tmpl=\"%s\")\n", + tmpl ? tmpl : "(null)"); + + /* + * Convert the language to a locale name... + */ + + locale[0] = '\0'; + + if ((lang = getenv("LANG")) != NULL) + { + locale[0] = '/'; + strlcpy(locale + 1, lang, sizeof(locale) - 1); + + if ((locptr = strchr(locale, '.')) != NULL) + *locptr = '\0'; /* Strip charset */ + } + + fprintf(stderr, "DEBUG2: lang=\"%s\", locale=\"%s\"...\n", + lang ? lang : "(null)", locale); + + /* + * See if we have a template file for this language... + */ + + directory = cgiGetTemplateDir(); + + snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl); + if ((in = fopen(filename, "r")) == NULL) + { + locale[3] = '\0'; + + snprintf(filename, sizeof(filename), "%s%s/%s", directory, locale, tmpl); + if ((in = fopen(filename, "r")) == NULL) + { + snprintf(filename, sizeof(filename), "%s/%s", directory, tmpl); + in = fopen(filename, "r"); + } + } + + fprintf(stderr, "DEBUG2: Template file is \"%s\"...\n", filename); + + /* + * Open the template file... + */ + + if (!in) + { + fprintf(stderr, "ERROR: Unable to open template file \"%s\" - %s\n", + filename, strerror(errno)); + return; + } + + /* + * Parse the file to the end... + */ + + cgi_copy(stdout, in, 0, 0, 0); + + /* + * Close the template file and return... + */ + + fclose(in); +} + + +/* + * 'cgiGetTemplateDir()' - Get the templates directory... + */ + +char * /* O - Template directory */ +cgiGetTemplateDir(void) +{ + const char *datadir; /* CUPS_DATADIR env var */ + static char templates[1024] = ""; /* Template directory */ + + + if (!templates[0]) + { + /* + * Build the template directory pathname... + */ + + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + snprintf(templates, sizeof(templates), "%s/templates", datadir); + } + + return (templates); +} + + +/* + * 'cgiSetServerVersion()' - Set the server name and CUPS version... + */ + +void +cgiSetServerVersion(void) +{ + cgiSetVariable("SERVER_NAME", getenv("SERVER_NAME")); + cgiSetVariable("REMOTE_USER", getenv("REMOTE_USER")); + cgiSetVariable("CUPS_VERSION", CUPS_SVERSION); + +#ifdef LC_TIME + setlocale(LC_TIME, ""); +#endif /* LC_TIME */ +} + + +/* + * 'cgi_copy()' - Copy the template file, substituting as needed... + */ + +static void +cgi_copy(FILE *out, /* I - Output file */ + FILE *in, /* I - Input file */ + int element, /* I - Element number (0 to N) */ + char term, /* I - Terminating character */ + int indent) /* I - Debug info indentation */ +{ + int ch; /* Character from file */ + char op; /* Operation */ + char name[255], /* Name of variable */ + *nameptr, /* Pointer into name */ + innername[255], /* Inner comparison name */ + *innerptr, /* Pointer into inner name */ + *s; /* String pointer */ + const char *value; /* Value of variable */ + const char *innerval; /* Inner value */ + const char *outptr; /* Output string pointer */ + char outval[1024], /* Formatted output string */ + compare[1024]; /* Comparison string */ + int result; /* Result of comparison */ + int uriencode; /* Encode as URI */ + regex_t re; /* Regular expression to match */ + + + fprintf(stderr, "DEBUG2: %*sStarting at file position %ld...\n", indent, "", + ftell(in)); + + /* + * Parse the file to the end... + */ + + while ((ch = getc(in)) != EOF) + if (ch == term) + break; + else if (ch == '{') + { + /* + * Get a variable name... + */ + + uriencode = 0; + + for (s = name; (ch = getc(in)) != EOF;) + if (strchr("}]<>=!~ \t\n", ch)) + break; + else if (s == name && ch == '%') + uriencode = 1; + else if (s > name && ch == '?') + break; + else if (s < (name + sizeof(name) - 1)) + *s++ = ch; + + *s = '\0'; + + if (s == name && isspace(ch & 255)) + { + fprintf(stderr, "DEBUG2: %*sLone { at %ld...\n", indent, "", ftell(in)); + + if (out) + { + putc('{', out); + putc(ch, out); + } + + continue; + } + + if (ch == '}') + fprintf(stderr, "DEBUG2: %*s\"{%s}\" at %ld...\n", indent, "", name, + ftell(in)); + + /* + * See if it has a value... + */ + + if (name[0] == '?') + { + /* + * Insert value only if it exists... + */ + + if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1] & 255)) + { + *nameptr++ = '\0'; + + if ((value = cgiGetArray(name + 1, atoi(nameptr) - 1)) != NULL) + outptr = value; + else + { + outval[0] = '\0'; + outptr = outval; + } + } + else if ((value = cgiGetArray(name + 1, element)) != NULL) + outptr = value; + else + { + outval[0] = '\0'; + outptr = outval; + } + } + else if (name[0] == '#') + { + /* + * Insert count... + */ + + if (name[1]) + sprintf(outval, "%d", cgiGetSize(name + 1)); + else + sprintf(outval, "%d", element + 1); + + outptr = outval; + } + else if (name[0] == '[') + { + /* + * Loop for # of elements... + */ + + int i; /* Looping var */ + long pos; /* File position */ + int count; /* Number of elements */ + + + if (isdigit(name[1] & 255)) + count = atoi(name + 1); + else + count = cgiGetSize(name + 1); + + pos = ftell(in); + + fprintf(stderr, "DEBUG2: %*sLooping on \"%s\" at %ld, count=%d...\n", + indent, "", name + 1, pos, count); + + if (count > 0) + { + for (i = 0; i < count; i ++) + { + if (i) + fseek(in, pos, SEEK_SET); + + cgi_copy(out, in, i, '}', indent + 2); + } + } + else + cgi_copy(NULL, in, 0, '}', indent + 2); + + fprintf(stderr, "DEBUG2: %*sFinished looping on \"%s\"...\n", indent, + "", name + 1); + + continue; + } + else if (name[0] == '$') + { + /* + * Insert cookie value or nothing if not defined. + */ + + if ((value = cgiGetCookie(name + 1)) != NULL) + outptr = value; + else + { + outval[0] = '\0'; + outptr = outval; + } + } + else + { + /* + * Insert variable or variable name (if element is NULL)... + */ + + if ((nameptr = strrchr(name, '-')) != NULL && isdigit(nameptr[1] & 255)) + { + *nameptr++ = '\0'; + if ((value = cgiGetArray(name, atoi(nameptr) - 1)) == NULL) + { + snprintf(outval, sizeof(outval), "{%s}", name); + outptr = outval; + } + else + outptr = value; + } + else if ((value = cgiGetArray(name, element)) == NULL) + { + snprintf(outval, sizeof(outval), "{%s}", name); + outptr = outval; + } + else + outptr = value; + } + + /* + * See if the terminating character requires another test... + */ + + if (ch == '}') + { + /* + * End of substitution... + */ + + if (out) + { + if (uriencode) + cgi_puturi(outptr, out); + else if (!_cups_strcasecmp(name, "?cupsdconf_default")) + fputs(outptr, stdout); + else + cgi_puts(outptr, out); + } + + continue; + } + + /* + * OK, process one of the following checks: + * + * {name?exist:not-exist} Exists? + * {name=value?true:false} Equal + * {namevalue?true:false} Greater than + * {name!value?true:false} Not equal + * {name~refex?true:false} Regex match + */ + + op = ch; + + if (ch == '?') + { + /* + * Test for existance... + */ + + if (name[0] == '?') + result = cgiGetArray(name + 1, element) != NULL; + else if (name[0] == '#') + result = cgiGetVariable(name + 1) != NULL; + else + result = cgiGetArray(name, element) != NULL; + + result = result && outptr[0]; + compare[0] = '\0'; + } + else + { + /* + * Compare to a string... + */ + + for (s = compare; (ch = getc(in)) != EOF;) + if (ch == '?') + break; + else if (s >= (compare + sizeof(compare) - 1)) + continue; + else if (ch == '#') + { + sprintf(s, "%d", element + 1); + s += strlen(s); + } + else if (ch == '{') + { + /* + * Grab the value of a variable... + */ + + innerptr = innername; + while ((ch = getc(in)) != EOF && ch != '}') + if (innerptr < (innername + sizeof(innername) - 1)) + *innerptr++ = ch; + *innerptr = '\0'; + + if (innername[0] == '#') + sprintf(s, "%d", cgiGetSize(innername + 1)); + else if ((innerptr = strrchr(innername, '-')) != NULL && + isdigit(innerptr[1] & 255)) + { + *innerptr++ = '\0'; + if ((innerval = cgiGetArray(innername, atoi(innerptr) - 1)) == NULL) + *s = '\0'; + else + strlcpy(s, innerval, sizeof(compare) - (s - compare)); + } + else if (innername[0] == '?') + { + if ((innerval = cgiGetArray(innername + 1, element)) == NULL) + *s = '\0'; + else + strlcpy(s, innerval, sizeof(compare) - (s - compare)); + } + else if ((innerval = cgiGetArray(innername, element)) == NULL) + snprintf(s, sizeof(compare) - (s - compare), "{%s}", innername); + else + strlcpy(s, innerval, sizeof(compare) - (s - compare)); + + s += strlen(s); + } + else if (ch == '\\') + *s++ = getc(in); + else + *s++ = ch; + + *s = '\0'; + + if (ch != '?') + { + fprintf(stderr, + "DEBUG2: %*sBad terminator '%c' at file position %ld...\n", + indent, "", ch, ftell(in)); + return; + } + + /* + * Do the comparison... + */ + + switch (op) + { + case '<' : + result = _cups_strcasecmp(outptr, compare) < 0; + break; + case '>' : + result = _cups_strcasecmp(outptr, compare) > 0; + break; + case '=' : + result = _cups_strcasecmp(outptr, compare) == 0; + break; + case '!' : + result = _cups_strcasecmp(outptr, compare) != 0; + break; + case '~' : + fprintf(stderr, "DEBUG: Regular expression \"%s\"\n", compare); + + if (regcomp(&re, compare, REG_EXTENDED | REG_ICASE)) + { + fprintf(stderr, + "ERROR: Unable to compile regular expresion \"%s\"!\n", + compare); + result = 0; + } + else + { + regmatch_t matches[10]; + + result = 0; + + if (!regexec(&re, outptr, 10, matches, 0)) + { + int i; + for (i = 0; i < 10; i ++) + { + fprintf(stderr, "DEBUG: matches[%d].rm_so=%d\n", i, + (int)matches[i].rm_so); + if (matches[i].rm_so < 0) + break; + + result ++; + } + } + + regfree(&re); + } + break; + default : + result = 1; + break; + } + } + + fprintf(stderr, + "DEBUG2: %*sStarting \"{%s%c%s\" at %ld, result=%d...\n", + indent, "", name, op, compare, ftell(in), result); + + if (result) + { + /* + * Comparison true; output first part and ignore second... + */ + + fprintf(stderr, "DEBUG2: %*sOutput first part...\n", indent, ""); + cgi_copy(out, in, element, ':', indent + 2); + + fprintf(stderr, "DEBUG2: %*sSkip second part...\n", indent, ""); + cgi_copy(NULL, in, element, '}', indent + 2); + } + else + { + /* + * Comparison false; ignore first part and output second... + */ + + fprintf(stderr, "DEBUG2: %*sSkip first part...\n", indent, ""); + cgi_copy(NULL, in, element, ':', indent + 2); + + fprintf(stderr, "DEBUG2: %*sOutput second part...\n", indent, ""); + cgi_copy(out, in, element, '}', indent + 2); + } + + fprintf(stderr, "DEBUG2: %*sFinished \"{%s%c%s\", out=%p...\n", indent, "", + name, op, compare, out); + } + else if (ch == '\\') /* Quoted char */ + { + if (out) + putc(getc(in), out); + else + getc(in); + } + else if (out) + putc(ch, out); + + if (ch == EOF) + fprintf(stderr, "DEBUG2: %*sReturning at file position %ld on EOF...\n", + indent, "", ftell(in)); + else + fprintf(stderr, + "DEBUG2: %*sReturning at file position %ld on character '%c'...\n", + indent, "", ftell(in), ch); + + if (ch == EOF && term) + fprintf(stderr, "ERROR: %*sSaw EOF, expected '%c'!\n", indent, "", term); + + /* + * Flush any pending output... + */ + + if (out) + fflush(out); +} + + +/* + * 'cgi_puts()' - Put a string to the output file, quoting as needed... + */ + +static void +cgi_puts(const char *s, /* I - String to output */ + FILE *out) /* I - Output file */ +{ + while (*s) + { + if (*s == '<') + { + /* + * Pass and , otherwise quote it... + */ + + if (!_cups_strncasecmp(s, "", out); + } + else if (!_cups_strncasecmp(s, "", 4)) + { + fputs("", out); + s += 3; + } + else + fputs("<", out); + } + else if (*s == '>') + fputs(">", out); + else if (*s == '\"') + fputs(""", out); + else if (*s == '\'') + fputs("'", out); + else if (*s == '&') + fputs("&", out); + else + putc(*s, out); + + s ++; + } +} + + +/* + * 'cgi_puturi()' - Put a URI string to the output file, quoting as needed... + */ + +static void +cgi_puturi(const char *s, /* I - String to output */ + FILE *out) /* I - Output file */ +{ + while (*s) + { + if (strchr("%@&+ <>#=", *s) || *s < ' ' || *s & 128) + fprintf(out, "%%%02X", *s & 255); + else + putc(*s, out); + + s ++; + } +} + + +/* + * End of "$Id: template.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cgi-bin/testcgi.c b/cgi-bin/testcgi.c new file mode 100644 index 0000000..0ed1269 --- /dev/null +++ b/cgi-bin/testcgi.c @@ -0,0 +1,75 @@ +/* + * "$Id: testcgi.c 9771 2011-05-12 05:21:56Z mike $" + * + * CGI test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Test the help index code. + * list_nodes() - List nodes in an array... + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" + + +/* + * 'main()' - Test the CGI code. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + /* + * Test file upload/multi-part submissions... + */ + + freopen("multipart.dat", "rb", stdin); + + putenv("CONTENT_TYPE=multipart/form-data; " + "boundary=---------------------------1977426492562745908748943111"); + putenv("REQUEST_METHOD=POST"); + + printf("cgiInitialize: "); + if (cgiInitialize()) + { + const cgi_file_t *file; /* Upload file */ + + if ((file = cgiGetFile()) != NULL) + { + puts("PASS"); + printf(" tempfile=\"%s\"\n", file->tempfile); + printf(" name=\"%s\"\n", file->name); + printf(" filename=\"%s\"\n", file->filename); + printf(" mimetype=\"%s\"\n", file->mimetype); + } + else + puts("FAIL (no file!)"); + } + else + puts("FAIL (init)"); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * End of "$Id: testcgi.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cgi-bin/testhi.c b/cgi-bin/testhi.c new file mode 100644 index 0000000..93f1f63 --- /dev/null +++ b/cgi-bin/testhi.c @@ -0,0 +1,113 @@ +/* + * "$Id: testhi.c 9771 2011-05-12 05:21:56Z mike $" + * + * Help index test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Test the help index code. + * list_nodes() - List nodes in an array... + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" + + +/* + * Local functions... + */ + +static void list_nodes(const char *title, cups_array_t *nodes); + + +/* + * 'main()' - Test the help index code. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + help_index_t *hi, /* Help index */ + *search; /* Search index */ + + + /* + * Load the help index... + */ + + hi = helpLoadIndex("testhi.index", "."); + + list_nodes("nodes", hi->nodes); + list_nodes("sorted", hi->sorted); + + /* + * Do any searches... + */ + + if (argc > 1) + { + search = helpSearchIndex(hi, argv[1], NULL, argv[2]); + + if (search) + { + list_nodes(argv[1], search->sorted); + helpDeleteIndex(search); + } + else + printf("%s (0 nodes)\n", argv[1]); + } + + helpDeleteIndex(hi); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'list_nodes()' - List nodes in an array... + */ + +static void +list_nodes(const char *title, /* I - Title string */ + cups_array_t *nodes) /* I - Nodes */ +{ + int i; /* Looping var */ + help_node_t *node; /* Current node */ + + + printf("%s (%d nodes):\n", title, cupsArrayCount(nodes)); + for (i = 1, node = (help_node_t *)cupsArrayFirst(nodes); + node; + i ++, node = (help_node_t *)cupsArrayNext(nodes)) + { + if (node->anchor) + printf(" %d: %s#%s \"%s\"", i, node->filename, node->anchor, + node->text); + else + printf(" %d: %s \"%s\"", i, node->filename, node->text); + + printf(" (%d words)\n", cupsArrayCount(node->words)); + } +} + + +/* + * End of "$Id: testhi.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cgi-bin/testhi.html b/cgi-bin/testhi.html new file mode 100644 index 0000000..0000e9e --- /dev/null +++ b/cgi-bin/testhi.html @@ -0,0 +1,31 @@ + + + Test File for Help Index Code + + + +

This is a test file for the help index code. The help index +code reads plain HTML and indexes the title and any anchored +text, ignoring all other markup. Anchor tags must be on a single +line, although the text they wrap may cross multiple lines and be +up to 1024 bytes in length.

+ +

This is the First Anchor

+ +

This is some text for the first anchor.

+ + +

This is the Second Anchor

+ +

This is some text for the first anchor.

+ +

John asked Mary to the dance.

+ + +

This is the Third Anchor

+ +

This is some text for the third anchor. This +is an in-line anchor that crosses a line.

+ + + diff --git a/cgi-bin/testtemplate.c b/cgi-bin/testtemplate.c new file mode 100644 index 0000000..6ced30c --- /dev/null +++ b/cgi-bin/testtemplate.c @@ -0,0 +1,103 @@ +/* + * "$Id: testtemplate.c 9771 2011-05-12 05:21:56Z mike $" + * + * CGI template test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Test the template code. + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" + + +/* + * 'main()' - Test the template code. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char *value; /* Value in name=value */ + FILE *out; /* Where to send output */ + + + /* + * Don't buffer stdout or stderr so that the mixed output is sane... + */ + + setbuf(stdout, NULL); + setbuf(stderr, NULL); + + /* + * Loop through the command-line, assigning variables for any args with + * "name=value"... + */ + + out = stdout; + + for (i = 1; i < argc; i ++) + { + if (!strcmp(argv[i], "-o")) + { + i ++; + if (i < argc) + { + out = fopen(argv[i], "w"); + if (!out) + { + perror(argv[i]); + return (1); + } + } + } + else if (!strcmp(argv[i], "-e")) + { + i ++; + + if (i < argc) + { + if (!freopen(argv[i], "w", stderr)) + { + perror(argv[i]); + return (1); + } + } + } + else if (!strcmp(argv[i], "-q")) + freopen("/dev/null", "w", stderr); + else if ((value = strchr(argv[i], '=')) != NULL) + { + *value++ = '\0'; + cgiSetVariable(argv[i], value); + } + else + cgiCopyTemplateFile(out, argv[i]); + } + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * End of "$Id: testtemplate.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cgi-bin/var.c b/cgi-bin/var.c new file mode 100644 index 0000000..90fbc83 --- /dev/null +++ b/cgi-bin/var.c @@ -0,0 +1,1311 @@ +/* + * "$Id: var.c 10367 2012-03-21 04:09:04Z mike $" + * + * CGI form variable and array functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cgiCheckVariables() - Check for the presence of "required" + * variables. + * cgiClearVariables() - Clear all form variables. + * cgiGetArray() - Get an element from a form array. + * cgiGetCookie() - Get a cookie value. + * cgiGetFile() - Get the file (if any) that was submitted in + * the form. + * cgiGetSize() - Get the size of a form array value. + * cgiGetVariable() - Get a CGI variable from the database. + * cgiInitialize() - Initialize the CGI variable "database". + * cgiIsPOST() - Determine whether this page was POSTed. + * cgiSetArray() - Set array element N to the specified string. + * cgiSetCookie() - Set a cookie value. + * cgiSetSize() - Set the array size. + * cgiSetVariable() - Set a CGI variable in the database. + * cgi_add_variable() - Add a form variable. + * cgi_compare_variables() - Compare two variables. + * cgi_find_variable() - Find a variable. + * cgi_initialize_cookies() - Initialize cookies. + * cgi_initialize_get() - Initialize form variables using the GET + * method. + * cgi_initialize_multipart() - Initialize variables and file using the POST + * method. + * cgi_initialize_post() - Initialize variables using the POST method. + * cgi_initialize_string() - Initialize form variables from a string. + * cgi_passwd() - Catch authentication requests and notify the + * server. + * cgi_set_sid() - Set the CUPS session ID. + * cgi_sort_variables() - Sort all form variables for faster lookup. + * cgi_unlink_file() - Remove the uploaded form. + */ + +/*#define DEBUG*/ +#include "cgi-private.h" +#include +#include + + +/* + * Session ID name + */ + +#define CUPS_SID "org.cups.sid" + + +/* + * Data structure to hold all the CGI form variables and arrays... + */ + +typedef struct /**** Form variable structure ****/ +{ + const char *name; /* Name of variable */ + int nvalues, /* Number of values */ + avalues; /* Number of values allocated */ + const char **values; /* Value(s) of variable */ +} _cgi_var_t; + + +/* + * Local globals... + */ + +static int num_cookies = 0;/* Number of cookies */ +static cups_option_t *cookies = NULL;/* Cookies */ +static int form_count = 0, /* Form variable count */ + form_alloc = 0; /* Number of variables allocated */ +static _cgi_var_t *form_vars = NULL; + /* Form variables */ +static cgi_file_t *form_file = NULL; + /* Uploaded file */ + + +/* + * Local functions... + */ + +static void cgi_add_variable(const char *name, int element, + const char *value); +static int cgi_compare_variables(const _cgi_var_t *v1, + const _cgi_var_t *v2); +static _cgi_var_t *cgi_find_variable(const char *name); +static void cgi_initialize_cookies(void); +static int cgi_initialize_get(void); +static int cgi_initialize_multipart(const char *boundary); +static int cgi_initialize_post(void); +static int cgi_initialize_string(const char *data); +static const char *cgi_passwd(const char *prompt); +static const char *cgi_set_sid(void); +static void cgi_sort_variables(void); +static void cgi_unlink_file(void); + + +/* + * 'cgiCheckVariables()' - Check for the presence of "required" variables. + * + * Names may be separated by spaces and/or commas. + */ + +int /* O - 1 if all variables present, 0 otherwise */ +cgiCheckVariables(const char *names) /* I - Variables to look for */ +{ + char name[255], /* Current variable name */ + *s; /* Pointer in string */ + const char *val; /* Value of variable */ + int element; /* Array element number */ + + + if (names == NULL) + return (1); + + while (*names != '\0') + { + while (*names == ' ' || *names == ',') + names ++; + + for (s = name; *names != '\0' && *names != ' ' && *names != ','; s ++, names ++) + *s = *names; + + *s = 0; + if (name[0] == '\0') + break; + + if ((s = strrchr(name, '-')) != NULL) + { + *s = '\0'; + element = atoi(s + 1) - 1; + val = cgiGetArray(name, element); + } + else + val = cgiGetVariable(name); + + if (val == NULL) + return (0); + + if (*val == '\0') + return (0); /* Can't be blank, either! */ + } + + return (1); +} + + +/* + * 'cgiClearVariables()' - Clear all form variables. + */ + +void +cgiClearVariables(void) +{ + int i, j; /* Looping vars */ + _cgi_var_t *v; /* Current variable */ + + + fputs("DEBUG: cgiClearVariables called.\n", stderr); + + for (v = form_vars, i = form_count; i > 0; v ++, i --) + { + _cupsStrFree(v->name); + for (j = 0; j < v->nvalues; j ++) + if (v->values[j]) + _cupsStrFree(v->values[j]); + } + + form_count = 0; + + cgi_unlink_file(); +} + + +/* + * 'cgiGetArray()' - Get an element from a form array. + */ + +const char * /* O - Element value or NULL */ +cgiGetArray(const char *name, /* I - Name of array variable */ + int element) /* I - Element number (0 to N) */ +{ + _cgi_var_t *var; /* Pointer to variable */ + + + if ((var = cgi_find_variable(name)) == NULL) + return (NULL); + + if (element < 0 || element >= var->nvalues) + return (NULL); + + return (_cupsStrRetain(var->values[element])); +} + + +/* + * 'cgiGetCookie()' - Get a cookie value. + */ + +const char * /* O - Value or NULL */ +cgiGetCookie(const char *name) /* I - Name of cookie */ +{ + return (cupsGetOption(name, num_cookies, cookies)); +} + + +/* + * 'cgiGetFile()' - Get the file (if any) that was submitted in the form. + */ + +const cgi_file_t * /* O - Attached file or NULL */ +cgiGetFile(void) +{ + return (form_file); +} + + +/* + * 'cgiGetSize()' - Get the size of a form array value. + */ + +int /* O - Number of elements */ +cgiGetSize(const char *name) /* I - Name of variable */ +{ + _cgi_var_t *var; /* Pointer to variable */ + + + if ((var = cgi_find_variable(name)) == NULL) + return (0); + + return (var->nvalues); +} + + +/* + * 'cgiGetVariable()' - Get a CGI variable from the database. + * + * Returns NULL if the variable doesn't exist. If the variable is an + * array of values, returns the last element. + */ + +const char * /* O - Value of variable */ +cgiGetVariable(const char *name) /* I - Name of variable */ +{ + const _cgi_var_t *var; /* Returned variable */ + + + var = cgi_find_variable(name); + +#ifdef DEBUG + if (var == NULL) + DEBUG_printf(("cgiGetVariable(\"%s\") is returning NULL...\n", name)); + else + DEBUG_printf(("cgiGetVariable(\"%s\") is returning \"%s\"...\n", name, + var->values[var->nvalues - 1])); +#endif /* DEBUG */ + + return ((var == NULL) ? NULL : _cupsStrRetain(var->values[var->nvalues - 1])); +} + + +/* + * 'cgiInitialize()' - Initialize the CGI variable "database". + */ + +int /* O - Non-zero if there was form data */ +cgiInitialize(void) +{ + const char *method, /* Form posting method */ + *content_type, /* Content-Type of post data */ + *cups_sid_cookie, /* SID cookie */ + *cups_sid_form; /* SID form variable */ + + + /* + * Setup a password callback for authentication... + */ + + cupsSetPasswordCB(cgi_passwd); + + /* + * Set the locale so that times, etc. are formatted properly... + */ + + setlocale(LC_ALL, ""); + +#ifdef DEBUG + /* + * Disable output buffering to find bugs... + */ + + setbuf(stdout, NULL); +#endif /* DEBUG */ + + /* + * Get cookies... + */ + + cgi_initialize_cookies(); + + if ((cups_sid_cookie = cgiGetCookie(CUPS_SID)) == NULL) + { + fputs("DEBUG: " CUPS_SID " cookie not found, initializing!\n", stderr); + cups_sid_cookie = cgi_set_sid(); + } + + fprintf(stderr, "DEBUG: " CUPS_SID " cookie is \"%s\"\n", cups_sid_cookie); + + /* + * Get the request method (GET or POST)... + */ + + method = getenv("REQUEST_METHOD"); + content_type = getenv("CONTENT_TYPE"); + if (!method) + return (0); + + /* + * Grab form data from the corresponding location... + */ + + if (!_cups_strcasecmp(method, "GET")) + return (cgi_initialize_get()); + else if (!_cups_strcasecmp(method, "POST") && content_type) + { + const char *boundary = strstr(content_type, "boundary="); + + if (boundary) + boundary += 9; + + if (content_type && !strncmp(content_type, "multipart/form-data; ", 21)) + { + if (!cgi_initialize_multipart(boundary)) + return (0); + } + else if (!cgi_initialize_post()) + return (0); + + if ((cups_sid_form = cgiGetVariable(CUPS_SID)) == NULL || + strcmp(cups_sid_cookie, cups_sid_form)) + { + if (cups_sid_form) + fprintf(stderr, "DEBUG: " CUPS_SID " form variable is \"%s\"\n", + cups_sid_form); + else + fputs("DEBUG: " CUPS_SID " form variable is not present.\n", stderr); + + cgiClearVariables(); + return (0); + } + else + return (1); + } + else + return (0); +} + + +/* + * 'cgiIsPOST()' - Determine whether this page was POSTed. + */ + +int /* O - 1 if POST, 0 if GET */ +cgiIsPOST(void) +{ + const char *method; /* REQUEST_METHOD environment variable */ + + + if ((method = getenv("REQUEST_METHOD")) == NULL) + return (0); + else + return (!strcmp(method, "POST")); +} + + +/* + * 'cgiSetArray()' - Set array element N to the specified string. + * + * If the variable array is smaller than (element + 1), the intervening + * elements are set to NULL. + */ + +void +cgiSetArray(const char *name, /* I - Name of variable */ + int element, /* I - Element number (0 to N) */ + const char *value) /* I - Value of variable */ +{ + int i; /* Looping var */ + _cgi_var_t *var; /* Returned variable */ + + + if (name == NULL || value == NULL || element < 0 || element > 100000) + return; + + fprintf(stderr, "DEBUG: cgiSetArray: %s[%d]=\"%s\"\n", name, element, value); + + if ((var = cgi_find_variable(name)) == NULL) + { + cgi_add_variable(name, element, value); + cgi_sort_variables(); + } + else + { + if (element >= var->avalues) + { + const char **temp; /* Temporary pointer */ + + temp = (const char **)realloc((void *)(var->values), + sizeof(char *) * (element + 16)); + if (!temp) + return; + + var->avalues = element + 16; + var->values = temp; + } + + if (element >= var->nvalues) + { + for (i = var->nvalues; i < element; i ++) + var->values[i] = NULL; + + var->nvalues = element + 1; + } + else if (var->values[element]) + _cupsStrFree((char *)var->values[element]); + + var->values[element] = _cupsStrAlloc(value); + } +} + + +/* + * 'cgiSetCookie()' - Set a cookie value. + */ + +void +cgiSetCookie(const char *name, /* I - Name */ + const char *value, /* I - Value */ + const char *path, /* I - Path (typically "/") */ + const char *domain, /* I - Domain name */ + time_t expires, /* I - Expiration date (0 for session) */ + int secure) /* I - Require SSL */ +{ + num_cookies = cupsAddOption(name, value, num_cookies, &cookies); + + printf("Set-Cookie: %s=%s;", name, value); + if (path) + printf(" path=%s;", path); + if (domain) + printf(" domain=%s;", domain); + if (expires) + { + char date[256]; /* Date string */ + + printf(" expires=%s;", httpGetDateString2(expires, date, sizeof(date))); + } + if (secure) + puts(" secure;"); + else + putchar('\n'); +} + + +/* + * 'cgiSetSize()' - Set the array size. + */ + +void +cgiSetSize(const char *name, /* I - Name of variable */ + int size) /* I - Number of elements (0 to N) */ +{ + int i; /* Looping var */ + _cgi_var_t *var; /* Returned variable */ + + + if (name == NULL || size < 0 || size > 100000) + return; + + if ((var = cgi_find_variable(name)) == NULL) + return; + + if (size >= var->avalues) + { + const char **temp; /* Temporary pointer */ + + temp = (const char **)realloc((void *)(var->values), + sizeof(char *) * (size + 16)); + if (!temp) + return; + + var->avalues = size + 16; + var->values = temp; + } + + if (size > var->nvalues) + { + for (i = var->nvalues; i < size; i ++) + var->values[i] = NULL; + } + else if (size < var->nvalues) + { + for (i = size; i < var->nvalues; i ++) + if (var->values[i]) + _cupsStrFree((void *)(var->values[i])); + } + + var->nvalues = size; +} + + +/* + * 'cgiSetVariable()' - Set a CGI variable in the database. + * + * If the variable is an array, this truncates the array to a single element. + */ + +void +cgiSetVariable(const char *name, /* I - Name of variable */ + const char *value) /* I - Value of variable */ +{ + int i; /* Looping var */ + _cgi_var_t *var; /* Returned variable */ + + + if (name == NULL || value == NULL) + return; + + fprintf(stderr, "cgiSetVariable: %s=\"%s\"\n", name, value); + + if ((var = cgi_find_variable(name)) == NULL) + { + cgi_add_variable(name, 0, value); + cgi_sort_variables(); + } + else + { + for (i = 0; i < var->nvalues; i ++) + if (var->values[i]) + _cupsStrFree((char *)var->values[i]); + + var->values[0] = _cupsStrAlloc(value); + var->nvalues = 1; + } +} + + +/* + * 'cgi_add_variable()' - Add a form variable. + */ + +static void +cgi_add_variable(const char *name, /* I - Variable name */ + int element, /* I - Array element number */ + const char *value) /* I - Variable value */ +{ + _cgi_var_t *var; /* New variable */ + + + if (name == NULL || value == NULL || element < 0 || element > 100000) + return; + + DEBUG_printf(("cgi_add_variable: Adding variable \'%s\' with value " + "\'%s\'...\n", name, value)); + + if (form_count >= form_alloc) + { + _cgi_var_t *temp_vars; /* Temporary form pointer */ + + + if (form_alloc == 0) + temp_vars = malloc(sizeof(_cgi_var_t) * 16); + else + temp_vars = realloc(form_vars, (form_alloc + 16) * sizeof(_cgi_var_t)); + + if (!temp_vars) + return; + + form_vars = temp_vars; + form_alloc += 16; + } + + var = form_vars + form_count; + + if ((var->values = calloc(element + 1, sizeof(char *))) == NULL) + return; + + var->name = _cupsStrAlloc(name); + var->nvalues = element + 1; + var->avalues = element + 1; + var->values[element] = _cupsStrAlloc(value); + + form_count ++; +} + + +/* + * 'cgi_compare_variables()' - Compare two variables. + */ + +static int /* O - Result of comparison */ +cgi_compare_variables( + const _cgi_var_t *v1, /* I - First variable */ + const _cgi_var_t *v2) /* I - Second variable */ +{ + return (_cups_strcasecmp(v1->name, v2->name)); +} + + +/* + * 'cgi_find_variable()' - Find a variable. + */ + +static _cgi_var_t * /* O - Variable pointer or NULL */ +cgi_find_variable(const char *name) /* I - Name of variable */ +{ + _cgi_var_t key; /* Search key */ + + + if (form_count < 1 || name == NULL) + return (NULL); + + key.name = name; + + return ((_cgi_var_t *)bsearch(&key, form_vars, form_count, sizeof(_cgi_var_t), + (int (*)(const void *, const void *))cgi_compare_variables)); +} + + +/* + * 'cgi_initialize_cookies()' - Initialize cookies. + */ + +static void +cgi_initialize_cookies(void) +{ + const char *cookie; /* HTTP_COOKIE environment variable */ + char name[128], /* Name string */ + value[512], /* Value string */ + *ptr; /* Pointer into name/value */ + + + if ((cookie = getenv("HTTP_COOKIE")) == NULL) + return; + + while (*cookie) + { + /* + * Skip leading whitespace... + */ + + while (isspace(*cookie & 255)) + cookie ++; + if (!*cookie) + break; + + /* + * Copy the name... + */ + + for (ptr = name; *cookie && *cookie != '=';) + if (ptr < (name + sizeof(name) - 1)) + *ptr++ = *cookie++; + else + break; + + if (*cookie != '=') + break; + + *ptr = '\0'; + cookie ++; + + /* + * Then the value... + */ + + if (*cookie == '\"') + { + for (cookie ++, ptr = value; *cookie && *cookie != '\"';) + if (ptr < (value + sizeof(value) - 1)) + *ptr++ = *cookie++; + else + break; + + if (*cookie == '\"') + cookie ++; + } + else + { + for (ptr = value; *cookie && *cookie != ';';) + if (ptr < (value + sizeof(value) - 1)) + *ptr++ = *cookie++; + else + break; + } + + if (*cookie == ';') + cookie ++; + else if (*cookie) + break; + + *ptr = '\0'; + + /* + * Then add the cookie to an array as long as the name doesn't start with + * "$"... + */ + + if (name[0] != '$') + num_cookies = cupsAddOption(name, value, num_cookies, &cookies); + } +} + + +/* + * 'cgi_initialize_get()' - Initialize form variables using the GET method. + */ + +static int /* O - 1 if form data read */ +cgi_initialize_get(void) +{ + char *data; /* Pointer to form data string */ + + + DEBUG_puts("cgi_initialize_get: Initializing variables using GET method..."); + + /* + * Check to see if there is anything for us to read... + */ + + data = getenv("QUERY_STRING"); + if (data == NULL || strlen(data) == 0) + return (0); + + /* + * Parse it out and return... + */ + + return (cgi_initialize_string(data)); +} + + +/* + * 'cgi_initialize_multipart()' - Initialize variables and file using the POST + * method. + * + * TODO: Update to support files > 2GB. + */ + +static int /* O - 1 if form data was read */ +cgi_initialize_multipart( + const char *boundary) /* I - Boundary string */ +{ + char line[10240], /* MIME header line */ + name[1024], /* Form variable name */ + filename[1024], /* Form filename */ + mimetype[1024], /* MIME media type */ + bstring[256], /* Boundary string to look for */ + *ptr, /* Pointer into name/filename */ + *end; /* End of buffer */ + int ch, /* Character from file */ + fd, /* Temporary file descriptor */ + blen; /* Length of boundary string */ + + + DEBUG_printf(("cgi_initialize_multipart(boundary=\"%s\")\n", boundary)); + + /* + * Read multipart form data until we run out... + */ + + name[0] = '\0'; + filename[0] = '\0'; + mimetype[0] = '\0'; + + snprintf(bstring, sizeof(bstring), "\r\n--%s", boundary); + blen = strlen(bstring); + + while (fgets(line, sizeof(line), stdin)) + { + if (!strcmp(line, "\r\n")) + { + /* + * End of headers, grab value... + */ + + if (filename[0]) + { + /* + * Read an embedded file... + */ + + if (form_file) + { + /* + * Remove previous file... + */ + + cgi_unlink_file(); + } + + /* + * Allocate memory for the new file... + */ + + if ((form_file = calloc(1, sizeof(cgi_file_t))) == NULL) + return (0); + + form_file->name = strdup(name); + form_file->filename = strdup(filename); + form_file->mimetype = strdup(mimetype); + + fd = cupsTempFd(form_file->tempfile, sizeof(form_file->tempfile)); + + if (fd < 0) + return (0); + + atexit(cgi_unlink_file); + + /* + * Copy file data to the temp file... + */ + + ptr = line; + + while ((ch = getchar()) != EOF) + { + *ptr++ = ch; + + if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen)) + { + ptr -= blen; + break; + } + + if ((ptr - line - blen) >= 8192) + { + /* + * Write out the first 8k of the buffer... + */ + + write(fd, line, 8192); + memmove(line, line + 8192, ptr - line - 8192); + ptr -= 8192; + } + } + + /* + * Write the rest of the data and close the temp file... + */ + + if (ptr > line) + write(fd, line, ptr - line); + + close(fd); + } + else + { + /* + * Just get a form variable; the current code only handles + * form values up to 10k in size... + */ + + ptr = line; + end = line + sizeof(line) - 1; + + while ((ch = getchar()) != EOF) + { + if (ptr < end) + *ptr++ = ch; + + if ((ptr - line) >= blen && !memcmp(ptr - blen, bstring, blen)) + { + ptr -= blen; + break; + } + } + + *ptr = '\0'; + + /* + * Set the form variable... + */ + + if ((ptr = strrchr(name, '-')) != NULL && isdigit(ptr[1] & 255)) + { + /* + * Set a specific index in the array... + */ + + *ptr++ = '\0'; + if (line[0]) + cgiSetArray(name, atoi(ptr) - 1, line); + } + else if (cgiGetVariable(name)) + { + /* + * Add another element in the array... + */ + + cgiSetArray(name, cgiGetSize(name), line); + } + else + { + /* + * Just set the line... + */ + + cgiSetVariable(name, line); + } + } + + /* + * Read the rest of the current line... + */ + + fgets(line, sizeof(line), stdin); + + /* + * Clear the state vars... + */ + + name[0] = '\0'; + filename[0] = '\0'; + mimetype[0] = '\0'; + } + else if (!_cups_strncasecmp(line, "Content-Disposition:", 20)) + { + if ((ptr = strstr(line + 20, " name=\"")) != NULL) + { + strlcpy(name, ptr + 7, sizeof(name)); + + if ((ptr = strchr(name, '\"')) != NULL) + *ptr = '\0'; + } + + if ((ptr = strstr(line + 20, " filename=\"")) != NULL) + { + strlcpy(filename, ptr + 11, sizeof(filename)); + + if ((ptr = strchr(filename, '\"')) != NULL) + *ptr = '\0'; + } + } + else if (!_cups_strncasecmp(line, "Content-Type:", 13)) + { + for (ptr = line + 13; isspace(*ptr & 255); ptr ++); + + strlcpy(mimetype, ptr, sizeof(mimetype)); + + for (ptr = mimetype + strlen(mimetype) - 1; + ptr > mimetype && isspace(*ptr & 255); + *ptr-- = '\0'); + } + } + + /* + * Return 1 for "form data found"... + */ + + return (1); +} + + +/* + * 'cgi_initialize_post()' - Initialize variables using the POST method. + */ + +static int /* O - 1 if form data was read */ +cgi_initialize_post(void) +{ + char *content_length, /* Length of input data (string) */ + *data; /* Pointer to form data string */ + int length, /* Length of input data */ + nbytes, /* Number of bytes read this read() */ + tbytes, /* Total number of bytes read */ + status; /* Return status */ + + + DEBUG_puts("cgi_initialize_post: Initializing variables using POST method..."); + + /* + * Check to see if there is anything for us to read... + */ + + content_length = getenv("CONTENT_LENGTH"); + if (content_length == NULL || atoi(content_length) <= 0) + return (0); + + /* + * Get the length of the input stream and allocate a buffer for it... + */ + + length = atoi(content_length); + data = malloc(length + 1); + + if (data == NULL) + return (0); + + /* + * Read the data into the buffer... + */ + + for (tbytes = 0; tbytes < length; tbytes += nbytes) + if ((nbytes = read(0, data + tbytes, length - tbytes)) < 0) + { + if (errno != EAGAIN) + { + free(data); + return (0); + } + else + nbytes = 0; + } + else if (nbytes == 0) + { + /* + * CUPS STR #3176: OpenBSD: Early end-of-file on POST data causes 100% CPU + * + * This should never happen, but does on OpenBSD. If we see early end-of- + * file, treat this as an error and process no data. + */ + + free(data); + return (0); + } + + data[length] = '\0'; + + /* + * Parse it out... + */ + + status = cgi_initialize_string(data); + + /* + * Free the data and return... + */ + + free(data); + + return (status); +} + + +/* + * 'cgi_initialize_string()' - Initialize form variables from a string. + */ + +static int /* O - 1 if form data was processed */ +cgi_initialize_string(const char *data) /* I - Form data string */ +{ + int done; /* True if we're done reading a form variable */ + char *s, /* Pointer to current form string */ + ch, /* Temporary character */ + name[255], /* Name of form variable */ + value[65536]; /* Variable value */ + + + /* + * Check input... + */ + + if (data == NULL) + return (0); + + /* + * Loop until we've read all the form data... + */ + + while (*data != '\0') + { + /* + * Get the variable name... + */ + + for (s = name; *data != '\0'; data ++) + if (*data == '=') + break; + else if (*data >= ' ' && s < (name + sizeof(name) - 1)) + *s++ = *data; + + *s = '\0'; + if (*data == '=') + data ++; + else + return (0); + + /* + * Read the variable value... + */ + + for (s = value, done = 0; !done && *data != '\0'; data ++) + switch (*data) + { + case '&' : /* End of data... */ + done = 1; + break; + + case '+' : /* Escaped space character */ + if (s < (value + sizeof(value) - 1)) + *s++ = ' '; + break; + + case '%' : /* Escaped control character */ + /* + * Read the hex code... + */ + + if (!isxdigit(data[1] & 255) || !isxdigit(data[2] & 255)) + return (0); + + if (s < (value + sizeof(value) - 1)) + { + data ++; + ch = *data - '0'; + if (ch > 9) + ch -= 7; + *s = ch << 4; + + data ++; + ch = *data - '0'; + if (ch > 9) + ch -= 7; + *s++ |= ch; + } + else + data += 2; + break; + + default : /* Other characters come straight through */ + if (*data >= ' ' && s < (value + sizeof(value) - 1)) + *s++ = *data; + break; + } + + *s = '\0'; /* nul terminate the string */ + + /* + * Remove trailing whitespace... + */ + + if (s > value) + s --; + + while (s >= value && isspace(*s & 255)) + *s-- = '\0'; + + /* + * Add the string to the variable "database"... + */ + + if ((s = strrchr(name, '-')) != NULL && isdigit(s[1] & 255)) + { + *s++ = '\0'; + if (value[0]) + cgiSetArray(name, atoi(s) - 1, value); + } + else if (cgiGetVariable(name) != NULL) + cgiSetArray(name, cgiGetSize(name), value); + else + cgiSetVariable(name, value); + } + + return (1); +} + + +/* + * 'cgi_passwd()' - Catch authentication requests and notify the server. + * + * This function sends a Status header and exits, forcing authentication + * for this request. + */ + +static const char * /* O - NULL (no return) */ +cgi_passwd(const char *prompt) /* I - Prompt (not used) */ +{ + (void)prompt; + + fprintf(stderr, "DEBUG: cgi_passwd(prompt=\"%s\") called!\n", + prompt ? prompt : "(null)"); + + /* + * Send a 401 (unauthorized) status to the server, so it can notify + * the client that authentication is required. + */ + + puts("Status: 401\n"); + exit(0); + + /* + * This code is never executed, but is present to satisfy the compiler. + */ + + return (NULL); +} + + +/* + * 'cgi_set_sid()' - Set the CUPS session ID. + */ + +static const char * /* O - New session ID */ +cgi_set_sid(void) +{ + char buffer[512], /* SID data */ + sid[33]; /* SID string */ + _cups_md5_state_t md5; /* MD5 state */ + unsigned char sum[16]; /* MD5 sum */ + const char *remote_addr, /* REMOTE_ADDR */ + *server_name, /* SERVER_NAME */ + *server_port; /* SERVER_PORT */ + + + if ((remote_addr = getenv("REMOTE_ADDR")) == NULL) + remote_addr = "REMOTE_ADDR"; + if ((server_name = getenv("SERVER_NAME")) == NULL) + server_name = "SERVER_NAME"; + if ((server_port = getenv("SERVER_PORT")) == NULL) + server_port = "SERVER_PORT"; + + CUPS_SRAND(time(NULL)); + snprintf(buffer, sizeof(buffer), "%s:%s:%s:%02X%02X%02X%02X%02X%02X%02X%02X", + remote_addr, server_name, server_port, + (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, + (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, + (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255, + (unsigned)CUPS_RAND() & 255, (unsigned)CUPS_RAND() & 255); + _cupsMD5Init(&md5); + _cupsMD5Append(&md5, (unsigned char *)buffer, (int)strlen(buffer)); + _cupsMD5Finish(&md5, sum); + + cgiSetCookie(CUPS_SID, httpMD5String(sum, sid), "/", NULL, 0, 0); + + return (cupsGetOption(CUPS_SID, num_cookies, cookies)); +} + + +/* + * 'cgi_sort_variables()' - Sort all form variables for faster lookup. + */ + +static void +cgi_sort_variables(void) +{ +#ifdef DEBUG + int i; + + + DEBUG_puts("cgi_sort_variables: Sorting variables..."); +#endif /* DEBUG */ + + if (form_count < 2) + return; + + qsort(form_vars, form_count, sizeof(_cgi_var_t), + (int (*)(const void *, const void *))cgi_compare_variables); + +#ifdef DEBUG + DEBUG_puts("cgi_sort_variables: Sorted variable list is:"); + for (i = 0; i < form_count; i ++) + DEBUG_printf(("cgi_sort_variables: %d: %s (%d) = \"%s\" ...\n", i, + form_vars[i].name, form_vars[i].nvalues, + form_vars[i].values[0])); +#endif /* DEBUG */ +} + + +/* + * 'cgi_unlink_file()' - Remove the uploaded form. + */ + +static void +cgi_unlink_file(void) +{ + if (form_file) + { + /* + * Remove the temporary file... + */ + + unlink(form_file->tempfile); + + /* + * Free memory used... + */ + + free(form_file->name); + free(form_file->filename); + free(form_file->mimetype); + free(form_file); + + form_file = NULL; + } +} + + +/* + * End of "$Id: var.c 10367 2012-03-21 04:09:04Z mike $". + */ diff --git a/cgi-bin/websearch.c b/cgi-bin/websearch.c new file mode 100644 index 0000000..f096ba2 --- /dev/null +++ b/cgi-bin/websearch.c @@ -0,0 +1,116 @@ +/* + * "$Id: websearch.c 8668 2009-05-21 00:21:27Z mike $" + * + * Web search program for www.cups.org. + * + * Copyright 2007-2009 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Usage: + * + * websearch directory "search string" + * + * Contents: + * + * main() - Search a directory of help files. + * list_nodes() - List matching nodes. + */ + +/* + * Include necessary headers... + */ + +#include "cgi.h" + + +/* + * Local functions... + */ + +static void list_nodes(help_index_t *hi, const char *title, + cups_array_t *nodes); + + +/* + * 'main()' - Test the help index code. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + help_index_t *hi, /* Help index */ + *search; /* Search index */ + char indexname[1024]; /* Name of index file */ + + + if (argc != 3) + { + puts("Usage: websearch directory \"search terms\""); + return (1); + } + + /* + * Load the help index... + */ + + snprintf(indexname, sizeof(indexname), "%s/.index", argv[1]); + hi = helpLoadIndex(indexname, argv[1]); + + /* + * Do any searches... + */ + + search = helpSearchIndex(hi, argv[2], NULL, NULL); + + if (search) + list_nodes(hi, argv[1], search->sorted); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'list_nodes()' - List nodes in an array... + */ + +static void +list_nodes(help_index_t *hi, /* I - Help index */ + const char *title, /* I - Title string */ + cups_array_t *nodes) /* I - Nodes */ +{ + help_node_t *node, /* Current node */ + *file; /* File node */ + + + printf("%d\n", cupsArrayCount(nodes)); + for (node = (help_node_t *)cupsArrayFirst(nodes); + node; + node = (help_node_t *)cupsArrayNext(nodes)) + { + if (node->anchor) + { + file = helpFindNode(hi, node->filename, NULL); + printf("%d|%s#%s|%s|%s\n", node->score, node->filename, node->anchor, + node->text, file ? file->text : node->filename); + } + else + printf("%d|%s|%s|%s\n", node->score, node->filename, node->text, + node->text); + } +} + + +/* + * End of "$Id: websearch.c 8668 2009-05-21 00:21:27Z mike $". + */ diff --git a/conf/Makefile b/conf/Makefile new file mode 100644 index 0000000..6732259 --- /dev/null +++ b/conf/Makefile @@ -0,0 +1,145 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Configuration file makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Config files... +# + +KEEP = cupsd.conf snmp.conf +REPLACE = mime.convs mime.types + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + for file in $(KEEP); do \ + if test -r $(SERVERROOT)/$$file ; then \ + $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.N ; \ + else \ + $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \ + grep -v "\$$Id:" $(SERVERROOT)/$$file > $(SERVERROOT)/$$file.n ; \ + mv $(SERVERROOT)/$$file.n $(SERVERROOT)/$$file ; \ + fi ; \ + done + $(INSTALL_CONFIG) -g $(CUPS_GROUP) cupsd.conf $(SERVERROOT)/cupsd.conf.default + $(INSTALL_DIR) -m 755 $(DATADIR)/mime + for file in $(REPLACE); do \ + if test -r $(DATADIR)/mime/$$file ; then \ + $(MV) $(DATADIR)/mime/$$file $(DATADIR)/mime/$$file.O ; \ + fi ; \ + if test -r $(SERVERROOT)/$$file ; then \ + $(MV) $(SERVERROOT)/$$file $(DATADIR)/mime/$$file.O ; \ + fi ; \ + $(INSTALL_DATA) $$file $(DATADIR)/mime ; \ + done + -if test x$(PAMDIR) != x; then \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(PAMDIR); \ + if test -r $(BUILDROOT)$(PAMDIR)/cups ; then \ + $(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups.N ; \ + else \ + $(INSTALL_DATA) $(PAMFILE) $(BUILDROOT)$(PAMDIR)/cups ; \ + fi ; \ + fi + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + for file in $(KEEP) $(REPLACE) cupsd.conf.default; do \ + $(RM) $(SERVERROOT)/$$file; \ + done + -$(RMDIR) $(SERVERROOT) + for file in $(REPLACE); do \ + $(RM) $(DATADIR)/mime/$$file; \ + done + -$(RMDIR) $(DATADIR)/mime + -if test x$(PAMDIR) != x; then \ + $(RM) $(BUILDROOT)$(PAMDIR)/cups; \ + $(RMDIR) $(BUILDROOT)$(PAMDIR); \ + fi + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in new file mode 100644 index 0000000..f6e302b --- /dev/null +++ b/conf/cupsd.conf.in @@ -0,0 +1,152 @@ +# +# "$Id: cupsd.conf.in 9407 2010-12-09 21:24:51Z mike $" +# +# Sample configuration file for the CUPS scheduler. See "man cupsd.conf" for a +# complete description of this file. +# + +# Log general information in error_log - change "@CUPS_LOG_LEVEL@" to "debug" +# for troubleshooting... +LogLevel @CUPS_LOG_LEVEL@ + +# Deactivate CUPS' internal logrotating, as we provide a better one, especially +# LogLevel debug2 gets usable now +MaxLogSize 0 + +# Administrator user group... +SystemGroup @CUPS_SYSTEM_GROUPS@ +@CUPS_SYSTEM_AUTHKEY@ + +# Only listen for connections from the local machine. +Listen localhost:@DEFAULT_IPP_PORT@ +@CUPS_LISTEN_DOMAINSOCKET@ + +# Show shared printers on the local network. +Browsing On +BrowseOrder allow,deny +BrowseAllow all +BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ + +# Default authentication type, when authentication is required... +DefaultAuthType Basic + +# Web interface setting... +WebInterface @CUPS_WEBIF@ + +# Restrict access to the server... + + Order allow,deny + + +# Restrict access to the admin pages... + + Order allow,deny + + +# Restrict access to configuration files... + + AuthType None +# AuthType Default +# Require user @SYSTEM + Order allow,deny + + +# Set the default printer/job policies... + + # Job/subscription privacy... + JobPrivateAccess default + JobPrivateValues default + SubscriptionPrivateAccess default + SubscriptionPrivateValues default + + # Job-related operations must be done by the owner or an administrator... + + Order deny,allow + + + +# Require user @OWNER @SYSTEM + Order deny,allow + + + # All administration operations require an administrator to authenticate... + + AuthType None +# AuthType Default +# Require user @SYSTEM + Order deny,allow + + + # All printer operations require a printer operator to authenticate... + + AuthType None +# AuthType Default +# Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ + Order deny,allow + + + # Only the owner or an administrator can cancel or authenticate a job... + +# Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ + Order deny,allow + + + + Order deny,allow + + + +# Set the authenticated printer/job policies... + + # Job/subscription privacy... + JobPrivateAccess default + JobPrivateValues default + SubscriptionPrivateAccess default + SubscriptionPrivateValues default + + # Job-related operations must be done by the owner or an administrator... + + AuthType None +# AuthType Default + Order deny,allow + + + + AuthType None +# AuthType Default +# Require user @OWNER @SYSTEM + Order deny,allow + + + # All administration operations require an administrator to authenticate... + + AuthType None +# AuthType Default +# Require user @SYSTEM + Order deny,allow + + + # All printer operations require a printer operator to authenticate... + + AuthType None +# AuthType Default +# Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ + Order deny,allow + + + # Only the owner or an administrator can cancel or authenticate a job... + + AuthType None +# AuthType Default +# Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ + Order deny,allow + + + + Order deny,allow + + + +# +# End of "$Id: cupsd.conf.in 9407 2010-12-09 21:24:51Z mike $". +# diff --git a/conf/mime.convs.in b/conf/mime.convs.in new file mode 100644 index 0000000..cbd2d92 --- /dev/null +++ b/conf/mime.convs.in @@ -0,0 +1,101 @@ +# +# "$Id: mime.convs.in 9750 2011-05-06 22:53:53Z mike $" +# +# DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW +# VERSIONS OF CUPS. Instead, create a "local.convs" file that +# reflects your local configuration changes. +# +# Base MIME conversions file for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +######################################################################## +# +# Format of Lines: +# +# source/type destination/type cost filter +# +# General Notes: +# +# The "cost" field is used to find the least costly filters to run +# when converting a job file to a printable format. +# +# All filters *must* accept the standard command-line arguments +# (job-id, user, title, copies, options, [filename or stdin]) to +# work with CUPS. +# + +######################################################################## +# +# PostScript filters +# + +@DEFAULT_PDFTOPS@application/pdf application/vnd.cups-postscript 66 pdftops +application/postscript application/vnd.cups-postscript 65 pstops +@DEFAULT_TEXTTOPS@application/x-cshell application/postscript 33 texttops +@DEFAULT_TEXTTOPS@application/x-csource application/postscript 33 texttops +@DEFAULT_TEXTTOPS@application/x-perl application/postscript 33 texttops +@DEFAULT_TEXTTOPS@application/x-shell application/postscript 33 texttops +@DEFAULT_TEXTTOPS@text/plain application/postscript 33 texttops +@DEFAULT_TEXTTOPS@text/css application/postscript 33 texttops +@DEFAULT_TEXTTOPS@text/html application/postscript 33 texttops +@DEFAULT_IMAGEFILTERS@image/gif application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/png application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/jpeg application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/tiff application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-bitmap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-photocd application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-portable-anymap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-portable-bitmap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-portable-graymap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-portable-pixmap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-sgi-rgb application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-xbitmap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-xpixmap application/vnd.cups-postscript 66 imagetops +@DEFAULT_IMAGEFILTERS@image/x-sun-raster application/vnd.cups-postscript 66 imagetops +@DEFAULT_BANNERTOPS@application/vnd.cups-banner application/postscript 33 bannertops + +######################################################################## +# +# Raster filters... +# + +@DEFAULT_IMAGEFILTERS@image/gif application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/png application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/jpeg application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/tiff application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-bitmap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-photocd application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-portable-anymap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-portable-bitmap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-portable-graymap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-portable-pixmap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-sgi-rgb application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-xbitmap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-xpixmap application/vnd.cups-raster 100 imagetoraster +@DEFAULT_IMAGEFILTERS@image/x-sun-raster application/vnd.cups-raster 100 imagetoraster + +# PWG Raster filter for IPP Everywhere... +application/vnd.cups-raster image/pwg-raster 100 rastertopwg + +######################################################################## +# +# Raw filter... +# +# Uncomment the following filter to allow printing of arbitrary files +# without the -oraw option. +# + +@DEFAULT_RAW_PRINTING@application/octet-stream application/vnd.cups-raw 0 - + +# +# End of "$Id: mime.convs.in 9750 2011-05-06 22:53:53Z mike $". +# diff --git a/conf/mime.types b/conf/mime.types new file mode 100644 index 0000000..21ec3bd --- /dev/null +++ b/conf/mime.types @@ -0,0 +1,174 @@ +# +# "$Id: mime.types 9871 2011-08-06 06:34:46Z mike $" +# +# Base MIME types file for CUPS. +# +# DO NOT EDIT THIS FILE, AS IT IS OVERWRITTEN WHEN YOU INSTALL NEW +# VERSIONS OF CUPS. Instead, create a "local.types" file that +# reflects your local configuration changes. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +######################################################################## +# +# Format of Lines: +# +# super/type rules +# +# "rules" can be any combination of: +# +# ( expr ) Parenthesis for expression grouping +# + Logical AND +# , or whitespace Logical OR +# ! Logical NOT +# match("pattern") Pattern match on filename +# extension Pattern match on "*.extension" +# ascii(offset,length) True if bytes are valid printable ASCII +# (CR, NL, TAB, BS, 32-126) +# priority(number) Sets priority of type (0=lowest, +# 100=default, 200=highest) +# printable(offset,length) True if bytes are printable 8-bit chars +# (CR, NL, TAB, BS, 32-126, 128-254) +# string(offset,"string") True if bytes are identical to string +# istring(offset,"string") True if bytes are identical to +# case-insensitive string +# char(offset,value) True if byte is identical +# short(offset,value) True if 16-bit integer is identical +# int(offset,value) True if 32-bit integer is identical +# locale("string") True if current locale matches string +# contains(offset,range,"string") True if the range contains the string +# +# General Notes: +# +# MIME type names are case-insensitive. Internally they are converted +# to lowercase. Multiple occurrences of a type will cause the provided +# rules to be appended to the existing definition. If two types use the same +# rules to resolve a type and have the same priority, e.g. "doc" extension for +# "text/bar" and "text/foo", the returned type will be the first type as +# sorted in alphanumerically ascending order without regard to case. Thus, +# the "text/bar" type will match the "doc" extension first unless the +# "text/foo" type has specified a higher priority. +# +# The "printable" rule differs from the "ascii" rule in that it also +# accepts 8-bit characters in the range 128-255. +# +# String constants must be surrounded by "" if they contain whitespace. +# To insert binary data into a string, use the notation. +# + +######################################################################## +# +# Application-generated files... +# + +#application/msword doc string(0,) +application/pdf pdf string(0,%PDF) +application/postscript ai eps ps string(0,%!) string(0,<04>%!) \ + contains(0,128,<1B>%-12345X) + \ + (contains(0,4096,"LANGUAGE=POSTSCRIPT") \ + contains(0,4096,"LANGUAGE = Postscript") \ + contains(0,4096,"LANGUAGE = PostScript") \ + contains(0,4096,"LANGUAGE = POSTSCRIPT") \ + (contains(0,4096,<0a>%!) + \ + !contains(0,4096,"ENTER LANGUAGE"))) + +######################################################################## +# +# Image files... +# + +image/gif gif string(0,GIF87a) string(0,GIF89a) +image/png png string(0,<89>PNG) +image/jpeg jpeg jpg jpe string(0,) +\ + (char(3,0xe0) char(3,0xe1) char(3,0xe2) char(3,0xe3)\ + char(3,0xe4) char(3,0xe5) char(3,0xe6) char(3,0xe7)\ + char(3,0xe8) char(3,0xe9) char(3,0xea) char(3,0xeb)\ + char(3,0xec) char(3,0xed) char(3,0xee) char(3,0xef)) +image/pwg-raster string(0,"RaS2") + string(4,PwgRaster<00>) priority(100) +image/tiff tiff tif string(0,MM<002A>) string(0,II<2A00>) +image/x-photocd pcd string(2048,PCD_IPI) +image/x-portable-anymap pnm +image/x-portable-bitmap pbm string(0,P1) string(0,P4) +image/x-portable-graymap pgm string(0,P2) string(0,P5) +image/x-portable-pixmap ppm string(0,P3) string(0,P6) +image/x-sgi-rgb rgb sgi bw icon short(0,474) +image/x-xbitmap xbm +image/x-xpixmap xpm ascii(0,1024) + string(3,"XPM") +#image/x-xwindowdump xwd string(4,<00000007>) +image/x-sun-raster ras string(0,<59a66a95>) + +#image/fpx fpx +image/x-alias pix short(8,8) short(8,24) +image/x-bitmap bmp string(0,BM) + !printable(2,14) +image/x-icon ico + +######################################################################## +# +# Text files... +# + +application/x-cshell csh printable(0,1024) + string(0,#!) +\ + (contains(2,80,/csh) contains(2,80,/tcsh)) +application/x-perl pl printable(0,1024) + string(0,#!) +\ + contains(2,80,/perl) +application/x-shell sh printable(0,1024) + string(0,#!) +\ + (contains(2,80,/bash) contains(2,80,/ksh)\ + contains(2,80,/sh) contains(2,80,/zsh)) +application/x-csource c cxx cpp cc C h hpp \ + printable(0,1024) + \ + (string(0,/*) string(0,//) + string(0,#include) contains(0,1024,<0a>#include) \ + string(0,#define) contains(0,1024,<0a>#define)) +text/html html htm printable(0,1024) +\ + (istring(0,"") istring(0,"E) + !string(2,<1B>%0B)) \ + string(0,<1B>@) \ + (contains(0,128,<1B>%-12345X) + \ + (contains(0,4096,"LANGUAGE=PCL") \ + contains(0,4096,"LANGUAGE = PCL"))) + +######################################################################## +# +# Raw print file support... +# +# Comment the following type to prevent raw file printing. +# + +application/octet-stream + +# +# End of "$Id: mime.types 9871 2011-08-06 06:34:46Z mike $". +# diff --git a/conf/pam.opendirectory b/conf/pam.opendirectory new file mode 100644 index 0000000..b336306 --- /dev/null +++ b/conf/pam.opendirectory @@ -0,0 +1,5 @@ +# cups: auth account password session +auth required pam_opendirectory.so +account required pam_permit.so +password required pam_deny.so +session required pam_permit.so diff --git a/conf/pam.securityserver b/conf/pam.securityserver new file mode 100644 index 0000000..ff724da --- /dev/null +++ b/conf/pam.securityserver @@ -0,0 +1,7 @@ +# cups: auth account password session +auth sufficient pam_securityserver.so +auth sufficient pam_unix.so +auth required pam_deny.so +account required pam_permit.so +password required pam_deny.so +session required pam_permit.so diff --git a/conf/pam.std.in b/conf/pam.std.in new file mode 100644 index 0000000..68fb50a --- /dev/null +++ b/conf/pam.std.in @@ -0,0 +1,2 @@ +auth required @PAMMODAUTH@ +account required @PAMMOD@ diff --git a/conf/snmp.conf.in b/conf/snmp.conf.in new file mode 100644 index 0000000..1e8dfbc --- /dev/null +++ b/conf/snmp.conf.in @@ -0,0 +1,13 @@ +# +# "$Id: snmp.conf.in 9045 2010-03-24 07:48:42Z mike $" +# +# Sample SNMP configuration file for CUPS. See "man cups-snmp.conf" for a +# complete description of this file. +# + +@CUPS_SNMP_ADDRESS@ +@CUPS_SNMP_COMMUNITY@ + +# +# End of "$Id: snmp.conf.in 9045 2010-03-24 07:48:42Z mike $". +# diff --git a/config-scripts/cups-3264.m4 b/config-scripts/cups-3264.m4 new file mode 100644 index 0000000..107289a --- /dev/null +++ b/config-scripts/cups-3264.m4 @@ -0,0 +1,140 @@ +dnl +dnl "$Id: cups-3264.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl 32/64-bit library support stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Setup support for separate 32/64-bit library generation... +AC_ARG_ENABLE(32bit, [ --enable-32bit generate 32-bit libraries on 32/64-bit systems]) + +INSTALL32="" +LIB32CUPS="" +LIB32CUPSIMAGE="" +LIB32DIR="" +UNINSTALL32="" + +AC_SUBST(INSTALL32) +AC_SUBST(LIB32CUPS) +AC_SUBST(LIB32CUPSIMAGE) +AC_SUBST(LIB32DIR) +AC_SUBST(UNINSTALL32) + +AC_ARG_ENABLE(64bit, [ --enable-64bit generate 64-bit libraries on 32/64-bit systems]) + +INSTALL64="" +LIB64CUPS="" +LIB64CUPSIMAGE="" +LIB64DIR="" +UNINSTALL64="" + +AC_SUBST(INSTALL64) +AC_SUBST(LIB64CUPS) +AC_SUBST(LIB64CUPSIMAGE) +AC_SUBST(LIB64DIR) +AC_SUBST(UNINSTALL64) + +case "$uname" in + HP-UX*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib" + if test -d /usr/lib/hpux32; then + LIB32DIR="${LIB32DIR}/hpux32" + fi + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib" + if test -d /usr/lib/hpux64; then + LIB64DIR="${LIB64DIR}/hpux64" + fi + UNINSTALL64="uninstall64bit" + fi + ;; + + IRIX) + if test "x$enable_32bit" = xyes; then + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$prefix/lib32" + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$prefix/lib64" + UNINSTALL64="uninstall64bit" + fi + ;; + + Linux*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib" + if test -d /usr/lib32; then + LIB32DIR="${LIB32DIR}32" + fi + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib" + if test -d /usr/lib64; then + LIB64DIR="${LIB64DIR}64" + fi + UNINSTALL64="uninstall64bit" + fi + ;; + + SunOS*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib/32" + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib/64" + UNINSTALL64="uninstall64bit" + fi + ;; +esac + +dnl +dnl End of "$Id: cups-3264.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4 new file mode 100644 index 0000000..a5de94f --- /dev/null +++ b/config-scripts/cups-common.m4 @@ -0,0 +1,438 @@ +dnl +dnl "$Id: cups-common.m4 10317 2012-03-01 00:05:55Z mike $" +dnl +dnl Common configuration stuff for CUPS. +dnl +dnl Copyright 2007-2012 by Apple Inc. +dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl We need at least autoconf 2.60... +AC_PREREQ(2.60) + +dnl Set the name of the config header file... +AC_CONFIG_HEADER(config.h) + +dnl Version number information... +CUPS_VERSION=1.5.3 +CUPS_REVISION= +#if test -z "$CUPS_REVISION" -a -d .svn; then +# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" +#fi +CUPS_BUILD="cups-$CUPS_VERSION" + +AC_ARG_WITH(cups_build, [ --with-cups-build set "cups-config --build" string ], + CUPS_BUILD="$withval") + +AC_SUBST(CUPS_VERSION) +AC_SUBST(CUPS_REVISION) +AC_SUBST(CUPS_BUILD) +AC_DEFINE_UNQUOTED(CUPS_SVERSION, "CUPS v$CUPS_VERSION$CUPS_REVISION") +AC_DEFINE_UNQUOTED(CUPS_MINIMAL, "CUPS/$CUPS_VERSION$CUPS_REVISION") + +dnl Default compiler flags... +CFLAGS="${CFLAGS:=}" +CPPFLAGS="${CPPFLAGS:=}" +CXXFLAGS="${CXXFLAGS:=}" +LDFLAGS="${LDFLAGS:=}" + +dnl Checks for programs... +AC_PROG_AWK +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXX +AC_PROG_RANLIB +AC_PATH_PROG(AR,ar) +AC_PATH_PROG(CHMOD,chmod) +AC_PATH_PROG(GZIP,gzip) +AC_PATH_PROG(HTMLDOC,htmldoc) +AC_PATH_PROG(LD,ld) +AC_PATH_PROG(LN,ln) +AC_PATH_PROG(MV,mv) +AC_PATH_PROG(RM,rm) +AC_PATH_PROG(RMDIR,rmdir) +AC_PATH_PROG(SED,sed) +AC_PATH_PROG(XDGOPEN,xdg-open) +if test "x$XDGOPEN" = x; then + CUPS_HTMLVIEW="htmlview" +else + CUPS_HTMLVIEW="$XDGOPEN" +fi +AC_SUBST(CUPS_HTMLVIEW) + +AC_MSG_CHECKING(for install-sh script) +INSTALL="`pwd`/install-sh" +AC_SUBST(INSTALL) +AC_MSG_RESULT(using $INSTALL) + +if test "x$AR" = x; then + AC_MSG_ERROR([Unable to find required library archive command.]) +fi +if test "x$CC" = x; then + AC_MSG_ERROR([Unable to find required C compiler command.]) +fi + +dnl Static library option... +INSTALLSTATIC="" +AC_ARG_ENABLE(static, [ --enable-static install static libraries]) + +if test x$enable_static = xyes; then + echo Installing static libraries... + INSTALLSTATIC="installstatic" +fi + +AC_SUBST(INSTALLSTATIC) + +dnl Check for pkg-config, which is used for some other tests later on... +AC_PATH_PROG(PKGCONFIG, pkg-config) + +dnl Check for libraries... +AC_SEARCH_LIBS(fmod, m) +AC_SEARCH_LIBS(crypt, crypt) +AC_SEARCH_LIBS(getspent, sec gen) + +LIBMALLOC="" +AC_ARG_ENABLE(mallinfo, [ --enable-mallinfo build with malloc debug logging]) + +if test x$enable_mallinfo = xyes; then + SAVELIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS(mallinfo, malloc, AC_DEFINE(HAVE_MALLINFO)) + LIBMALLOC="$LIBS" + LIBS="$SAVELIBS" +fi + +AC_SUBST(LIBMALLOC) + +dnl Check for libpaper support... +AC_ARG_ENABLE(libpaper, [ --enable-libpaper build with libpaper support]) + +if test x$enable_libpaper = xyes; then + AC_CHECK_LIB(paper,systempapername, + AC_DEFINE(HAVE_LIBPAPER) + LIBPAPER="-lpaper", + LIBPAPER="") +else + LIBPAPER="" +fi +AC_SUBST(LIBPAPER) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADER(crypt.h,AC_DEFINE(HAVE_CRYPT_H)) +AC_CHECK_HEADER(langinfo.h,AC_DEFINE(HAVE_LANGINFO_H)) +AC_CHECK_HEADER(malloc.h,AC_DEFINE(HAVE_MALLOC_H)) +AC_CHECK_HEADER(shadow.h,AC_DEFINE(HAVE_SHADOW_H)) +AC_CHECK_HEADER(string.h,AC_DEFINE(HAVE_STRING_H)) +AC_CHECK_HEADER(strings.h,AC_DEFINE(HAVE_STRINGS_H)) +AC_CHECK_HEADER(bstring.h,AC_DEFINE(HAVE_BSTRING_H)) +AC_CHECK_HEADER(usersec.h,AC_DEFINE(HAVE_USERSEC_H)) +AC_CHECK_HEADER(sys/ioctl.h,AC_DEFINE(HAVE_SYS_IOCTL_H)) +AC_CHECK_HEADER(sys/param.h,AC_DEFINE(HAVE_SYS_PARAM_H)) +AC_CHECK_HEADER(sys/ucred.h,AC_DEFINE(HAVE_SYS_UCRED_H)) +AC_CHECK_HEADER(scsi/sg.h,AC_DEFINE(HAVE_SCSI_SG_H)) + +dnl Checks for iconv.h and iconv_open +AC_CHECK_HEADER(iconv.h, + SAVELIBS="$LIBS" + LIBS="" + AC_SEARCH_LIBS(iconv_open,iconv, + AC_DEFINE(HAVE_ICONV_H) + SAVELIBS="$SAVELIBS $LIBS") + LIBS="$SAVELIBS") + +dnl Checks for statfs and its many headers... +AC_CHECK_HEADER(sys/mount.h,AC_DEFINE(HAVE_SYS_MOUNT_H)) +AC_CHECK_HEADER(sys/statfs.h,AC_DEFINE(HAVE_SYS_STATFS_H)) +AC_CHECK_HEADER(sys/statvfs.h,AC_DEFINE(HAVE_SYS_STATVFS_H)) +AC_CHECK_HEADER(sys/vfs.h,AC_DEFINE(HAVE_SYS_VFS_H)) +AC_CHECK_FUNCS(statfs statvfs) + +dnl Checks for string functions. +AC_CHECK_FUNCS(strdup strlcat strlcpy) +if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then + echo Forcing snprintf emulation for HP-UX. +else + AC_CHECK_FUNCS(snprintf vsnprintf) +fi + +dnl Check for random number functions... +AC_CHECK_FUNCS(random lrand48 arc4random) + +dnl Check for geteuid function. +AC_CHECK_FUNCS(geteuid) + +dnl Check for setpgid function. +AC_CHECK_FUNCS(setpgid) + +dnl Check for vsyslog function. +AC_CHECK_FUNCS(vsyslog) + +dnl Checks for signal functions. +case "$uname" in + Linux | GNU) + # Do not use sigset on Linux or GNU HURD + ;; + *) + # Use sigset on other platforms, if available + AC_CHECK_FUNCS(sigset) + ;; +esac + +AC_CHECK_FUNCS(sigaction) + +dnl Checks for wait functions. +AC_CHECK_FUNCS(waitpid wait3) + +dnl See if the tm structure has the tm_gmtoff member... +AC_MSG_CHECKING(for tm_gmtoff member in tm structure) +AC_TRY_COMPILE([#include ],[struct tm t; + int o = t.tm_gmtoff;], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_TM_GMTOFF), + AC_MSG_RESULT(no)) + +dnl See if the stat structure has the st_gen member... +AC_MSG_CHECKING(for st_gen member in stat structure) +AC_TRY_COMPILE([#include ],[struct stat t; + int o = t.st_gen;], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ST_GEN), + AC_MSG_RESULT(no)) + +dnl See if we have the removefile(3) function for securely removing files +AC_CHECK_FUNCS(removefile) + +dnl See if we have libusb... +AC_ARG_ENABLE(libusb, [ --enable-libusb use libusb for USB printing]) + +LIBUSB="" +AC_SUBST(LIBUSB) + +if test "x$PKGCONFIG" != x; then + if test x$enable_libusb = xyes -o $uname != Darwin; then + AC_MSG_CHECKING(for libusb-1.0) + if $PKGCONFIG --exists libusb-1.0; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LIBUSB) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags libusb-1.0`" + LIBUSB="`$PKGCONFIG --libs libusb-1.0`" + else + AC_MSG_RESULT(no) + fi + fi +elif test x$enable_libusb = xyes; then + AC_MSG_ERROR(Need pkg-config to enable libusb support.) +fi + +dnl See if we have libwrap for TCP wrappers support... +AC_ARG_ENABLE(tcp_wrappers, [ --enable-tcp-wrappers use libwrap for TCP wrappers support]) + +LIBWRAP="" +AC_SUBST(LIBWRAP) + +if test x$enable_tcp_wrappers = xyes; then + AC_CHECK_LIB(wrap, hosts_access,[ + AC_CHECK_HEADER(tcpd.h, + AC_DEFINE(HAVE_TCPD_H) + LIBWRAP="-lwrap")]) +fi + +dnl Flags for "ar" command... +case $uname in + Darwin* | *BSD*) + ARFLAGS="-rcv" + ;; + *) + ARFLAGS="crvs" + ;; +esac + +AC_SUBST(ARFLAGS) + +dnl Prep libraries specifically for cupsd and backends... +BACKLIBS="" +SERVERLIBS="" +AC_SUBST(BACKLIBS) +AC_SUBST(SERVERLIBS) + +dnl See if we have POSIX ACL support... +SAVELIBS="$LIBS" +LIBS="" +AC_ARG_ENABLE(acl, [ --enable-acl build with POSIX ACL support]) +if test "x$enable_acl" != xno; then + AC_SEARCH_LIBS(acl_init, acl, AC_DEFINE(HAVE_ACL_INIT)) + SERVERLIBS="$SERVERLIBS $LIBS" +fi +LIBS="$SAVELIBS" + +dnl Check for DBUS support +if test -d /etc/dbus-1; then + DBUSDIR="/etc/dbus-1" +else + DBUSDIR="" +fi + +AC_ARG_ENABLE(dbus, [ --enable-dbus build with DBUS support]) +AC_ARG_WITH(dbusdir, [ --with-dbusdir set DBUS configuration directory ], + DBUSDIR="$withval") + +DBUS_NOTIFIER="" +DBUS_NOTIFIERLIBS="" + +if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then + AC_MSG_CHECKING(for DBUS) + if $PKGCONFIG --exists dbus-1; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DBUS) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE" + SERVERLIBS="$SERVERLIBS `$PKGCONFIG --libs dbus-1`" + DBUS_NOTIFIER="dbus" + DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`" + SAVELIBS="$LIBS" + LIBS="$LIBS $DBUS_NOTIFIERLIBS" + AC_CHECK_FUNC(dbus_message_iter_init_append, + AC_DEFINE(HAVE_DBUS_MESSAGE_ITER_INIT_APPEND)) + LIBS="$SAVELIBS" + else + AC_MSG_RESULT(no) + fi +fi + +AC_SUBST(DBUSDIR) +AC_SUBST(DBUS_NOTIFIER) +AC_SUBST(DBUS_NOTIFIERLIBS) + +dnl Extra platform-specific libraries... +CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" +CUPS_SYSTEM_AUTHKEY="" +INSTALLXPC="" +LEGACY_BACKENDS="parallel" + +case $uname in + Darwin*) + LEGACY_BACKENDS="" + BACKLIBS="$BACKLIBS -framework IOKit" + SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" + LIBS="-framework SystemConfiguration -framework CoreFoundation -framework Security $LIBS" + + dnl Check for framework headers... + AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h,AC_DEFINE(HAVE_APPLICATIONSERVICES_H)) + AC_CHECK_HEADER(CoreFoundation/CoreFoundation.h,AC_DEFINE(HAVE_COREFOUNDATION_H)) + AC_CHECK_HEADER(CoreFoundation/CFPriv.h,AC_DEFINE(HAVE_CFPRIV_H)) + AC_CHECK_HEADER(CoreFoundation/CFBundlePriv.h,AC_DEFINE(HAVE_CFBUNDLEPRIV_H)) + AC_CHECK_HEADER(IOKit/pwr_mgt/IOPMLibPrivate.h,AC_DEFINE(HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H)) + + dnl Check for dynamic store function... + AC_CHECK_FUNCS(SCDynamicStoreCopyComputerName) + + dnl Check for new ColorSync APIs... + SAVELIBS="$LIBS" + LIBS="$LIBS -framework ApplicationServices" + AC_CHECK_FUNCS(ColorSyncRegisterDevice) + LIBS="$SAVELIBS" + + dnl Check for the new membership functions in MacOSX 10.4... + AC_CHECK_HEADER(membership.h,AC_DEFINE(HAVE_MEMBERSHIP_H)) + AC_CHECK_HEADER(membershipPriv.h,AC_DEFINE(HAVE_MEMBERSHIPPRIV_H)) + AC_CHECK_FUNCS(mbr_uid_to_uuid) + + dnl Check for the vproc_transaction_begin/end stuff... + AC_CHECK_FUNCS(vproc_transaction_begin) + + dnl Need header... + AC_CHECK_HEADER(dlfcn.h,AC_DEFINE(HAVE_DLFCN_H)) + + dnl Check for notify_post support + AC_CHECK_HEADER(notify.h,AC_DEFINE(HAVE_NOTIFY_H)) + AC_CHECK_FUNCS(notify_post) + + dnl Check for Authorization Services support + AC_ARG_WITH(adminkey, [ --with-adminkey set the default SystemAuthKey value], + default_adminkey="$withval", + default_adminkey="default") + AC_ARG_WITH(operkey, [ --with-operkey set the default operator @AUTHKEY value], + default_operkey="$withval", + default_operkey="default") + + AC_CHECK_HEADER(Security/Authorization.h, [ + AC_DEFINE(HAVE_AUTHORIZATION_H) + + if test "x$default_adminkey" != xdefault; then + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" + elif grep -q system.print.operator /etc/authorization; then + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" + else + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.preferences" + fi + + if test "x$default_operkey" != xdefault; then + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" + elif grep -q system.print.operator /etc/authorization; then + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" + else + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin" + fi]) + AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H)) + + dnl Check for sandbox/Seatbelt support + if test $uversion -ge 100; then + AC_CHECK_HEADER(sandbox.h,AC_DEFINE(HAVE_SANDBOX_H)) + fi + if test $uversion -ge 110; then + # Broken public headers in 10.7... + AC_MSG_CHECKING(for sandbox/private.h presence) + if test -f /usr/local/include/sandbox/private.h; then + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + AC_MSG_ERROR(Run 'sudo mkdir -p /usr/local/include/sandbox' and 'sudo touch /usr/local/include/sandbox/private.h' to build CUPS.) + fi + fi + + dnl Check for XPC support + AC_CHECK_HEADER(xpc/xpc.h, + AC_DEFINE(HAVE_XPC) + INSTALLXPC="install-xpc") + ;; +esac + +AC_SUBST(CUPS_DEFAULT_PRINTOPERATOR_AUTH) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTOPERATOR_AUTH, "$CUPS_DEFAULT_PRINTOPERATOR_AUTH") +AC_SUBST(CUPS_SYSTEM_AUTHKEY) +AC_SUBST(INSTALLXPC) +AC_SUBST(LEGACY_BACKENDS) + +dnl Check for build components +COMPONENTS="all" + +AC_ARG_WITH(components, [ --with-components set components to build: + - "all" (default) builds everything + - "core" builds libcups and ipptool], + COMPONENTS="$withval") + +case "$COMPONENTS" in + all) + BUILDDIRS="filter backend berkeley cgi-bin driver monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" + ;; + + core) + BUILDDIRS="data locale" + ;; + + *) + AC_MSG_ERROR([Bad build component "$COMPONENT" specified!]) + ;; +esac + +AC_SUBST(BUILDDIRS) + +dnl +dnl End of "$Id: cups-common.m4 10317 2012-03-01 00:05:55Z mike $". +dnl diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4 new file mode 100644 index 0000000..3714c00 --- /dev/null +++ b/config-scripts/cups-compiler.m4 @@ -0,0 +1,563 @@ +dnl +dnl "$Id: cups-compiler.m4 9981 2011-09-09 17:28:58Z mike $" +dnl +dnl Compiler stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Clear the debugging and non-shared library options unless the user asks +dnl for them... +INSTALL_STRIP="" +OPTIM="" +AC_SUBST(INSTALL_STRIP) +AC_SUBST(OPTIM) + +AC_ARG_WITH(optim, [ --with-optim set optimization flags ]) +AC_ARG_ENABLE(debug, [ --enable-debug build with debugging symbols]) +AC_ARG_ENABLE(debug_guards, [ --enable-debug-guards build with memory allocation guards]) +AC_ARG_ENABLE(debug_printfs, [ --enable-debug-printfs build with CUPS_DEBUG_LOG support]) +AC_ARG_ENABLE(unit_tests, [ --enable-unit-tests build and run unit tests]) + +dnl For debugging, keep symbols, otherwise strip them... +if test x$enable_debug = xyes; then + OPTIM="-g" +else + INSTALL_STRIP="-s" +fi + +dnl Debug printfs can slow things down, so provide a separate option for that +if test x$enable_debug_printfs = xyes; then + CFLAGS="$CFLAGS -DDEBUG" + CXXFLAGS="$CXXFLAGS -DDEBUG" +fi + +dnl Debug guards use an extra 4 bytes for some structures like strings in the +dnl string pool, so provide a separate option for that +if test x$enable_debug_guards = xyes; then + CFLAGS="$CFLAGS -DDEBUG_GUARDS" + CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" +fi + +dnl Unit tests take up time during a compile... +if test x$enable_unit_tests = xyes; then + UNITTESTS="unittests" +else + UNITTESTS="" +fi +AC_SUBST(UNITTESTS) + +dnl Setup general architecture flags... +AC_ARG_WITH(archflags, [ --with-archflags set default architecture flags ]) +AC_ARG_WITH(ldarchflags, [ --with-ldarchflags set program architecture flags ]) + +if test -z "$with_archflags"; then + ARCHFLAGS="" +else + ARCHFLAGS="$with_archflags" +fi + +if test -z "$with_ldarchflags"; then + if test "$uname" = Darwin; then + # Only create 32-bit programs by default + LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch x86_64//' -e '1,$s/-arch ppc64//'`" + else + LDARCHFLAGS="$ARCHFLAGS" + fi +else + LDARCHFLAGS="$with_ldarchflags" +fi + +AC_SUBST(ARCHFLAGS) +AC_SUBST(LDARCHFLAGS) + +dnl Setup support for separate 32/64-bit library generation... +AC_ARG_WITH(arch32flags, [ --with-arch32flags set 32-bit architecture flags]) +ARCH32FLAGS="" +AC_SUBST(ARCH32FLAGS) + +AC_ARG_WITH(arch64flags, [ --with-arch64flags set 64-bit architecture flags]) +ARCH64FLAGS="" +AC_SUBST(ARCH64FLAGS) + +dnl Read-only data/program support on Linux... +AC_ARG_ENABLE(relro, [ --enable-relro build with the GCC relro option]) + +dnl Update compiler options... +CXXLIBS="${CXXLIBS:=}" +AC_SUBST(CXXLIBS) + +PIEFLAGS="" +AC_SUBST(PIEFLAGS) + +RELROFLAGS="" +AC_SUBST(RELROFLAGS) + +PHPOPTIONS="" +AC_SUBST(PHPOPTIONS) + +if test -n "$GCC"; then + # Add GCC-specific compiler options... + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + # Default to optimize-for-size and debug + OPTIM="-Os -g" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + # Generate position-independent code as needed... + if test $PICFLAG = 1 -a $uname != AIX; then + OPTIM="-fPIC $OPTIM" + fi + + # The -fstack-protector option is available with some versions of + # GCC and adds "stack canaries" which detect when the return address + # has been overwritten, preventing many types of exploit attacks. + AC_MSG_CHECKING(if GCC supports -fstack-protector) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector" + AC_TRY_LINK(,, + OPTIM="$OPTIM -fstack-protector" + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + + # The -fPIE option is available with some versions of GCC and adds + # randomization of addresses, which avoids another class of exploits + # that depend on a fixed address for common functions. + AC_MSG_CHECKING(if GCC supports -fPIE) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fPIE" + AC_TRY_COMPILE(,, + [case "$CC" in + *clang) + PIEFLAGS="-fPIE -Wl,-pie" + ;; + *) + PIEFLAGS="-fPIE -pie" + ;; + esac + AC_MSG_RESULT(yes)], + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + + if test "x$with_optim" = x; then + # Add useful warning options for tracking down problems... + OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM" + + # Additional warning options for development testing... + if test -d .svn; then + OPTIM="-Wshadow -Werror $OPTIM" + PHPOPTIONS="-Wno-shadow" + else + AC_MSG_CHECKING(if GCC supports -Wno-tautological-compare) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wno-tautological-compare" + AC_TRY_COMPILE(,, + [OPTIM="$OPTIM -Wno-tautological-compare" + AC_MSG_RESULT(yes)], + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + fi + fi + + case "$uname" in + Darwin*) + # -D_FORTIFY_SOURCE=2 adds additional object size + # checking, basically wrapping all string functions + # with buffer-limited ones. Not strictly needed for + # CUPS since we already use buffer-limited calls, but + # this will catch any additions that are broken. + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + ;; + + HP-UX*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-milp32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-mlp64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-mlp64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-milp32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + IRIX) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-n32 -mips3" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-64 -mips4" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-64 -mips4" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-n32 -mips3" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + Linux*) + # The -z relro option is provided by the Linux linker command to + # make relocatable data read-only. + if test x$enable_relro = xyes; then + RELROFLAGS="-Wl,-z,relro" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-m32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-m64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-m64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-m32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + SunOS*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-m32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-m64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-m64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-m32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + esac +else + # Add vendor-specific compiler options... + case $uname in + AIX*) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O2 -qmaxmem=6000" + else + OPTIM="$with_optim $OPTIM" + fi + fi + ;; + HP-UX*) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="+O2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + CFLAGS="-Ae $CFLAGS" + + if test $PICFLAG = 1; then + OPTIM="+z $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="+DD32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="+DD64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="+DD64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="+DD32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + IRIX) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test "x$with_optim" = x; then + OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-n32 -mips3" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-64 -mips4" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-64 -mips4" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-n32 -mips3" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + OSF*) + # Tru64 UNIX aka Digital UNIX aka OSF/1 + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O" + else + OPTIM="$with_optim" + fi + fi + ;; + SunOS*) + # Solaris + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-xO2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Compiling on a Solaris system, build 64-bit + # binaries with separate 32-bit libraries... + ARCH32FLAGS="-xarch=generic" + + if test "x$with_optim" = x; then + # Suppress all of Sun's questionable + # warning messages, and default to + # 64-bit compiles of everything else... + OPTIM="-w $OPTIM" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-xarch=generic64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + else + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries... + ARCH64FLAGS="-xarch=generic64" + fi + + if test "x$with_optim" = x; then + # Suppress all of Sun's questionable + # warning messages, and default to + # 32-bit compiles of everything else... + OPTIM="-w $OPTIM" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-xarch=generic" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + UNIX_SVR*) + # UnixWare + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + ;; + *) + # Running some other operating system; inform the user they + # should contribute the necessary options to + # cups-support@cups.org... + echo "Building CUPS with default compiler optimizations; contact" + echo "cups-bugs@cups.org with uname and compiler options needed" + echo "for your platform, or set the CFLAGS and LDFLAGS environment" + echo "variables before running configure." + ;; + esac +fi + +# Add general compiler options per platform... +case $uname in + HP-UX*) + # HP-UX 10.20 (at least) needs this definition to get the + # h_errno global... + OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED" + + # HP-UX 11.00 (at least) needs this definition to get the + # u_short type used by the IP headers... + OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE" + + # HP-UX 11.23 (at least) needs this definition to get the + # IPv6 header to work... + OPTIM="$OPTIM -D_HPUX_SOURCE" + ;; + + Linux*) + # glibc 2.8 and higher breaks peer credentials unless you + # define _GNU_SOURCE... + OPTIM="$OPTIM -D_GNU_SOURCE" + ;; + + OSF*) + # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told + # to be POSIX-compliant... + OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE" + ;; +esac + +dnl +dnl End of "$Id: cups-compiler.m4 9981 2011-09-09 17:28:58Z mike $". +dnl diff --git a/config-scripts/cups-defaults.m4 b/config-scripts/cups-defaults.m4 new file mode 100644 index 0000000..892be75 --- /dev/null +++ b/config-scripts/cups-defaults.m4 @@ -0,0 +1,510 @@ +dnl +dnl "$Id: cups-defaults.m4 9750 2011-05-06 22:53:53Z mike $" +dnl +dnl Default cupsd configuration settings for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 2006-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Default languages... +LANGUAGES="`ls -1 locale/cups_*.po | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' '`" + +AC_ARG_WITH(languages, [ --with-languages set installed languages, default=all ],[ + case "$withval" in + none | no) LANGUAGES="" ;; + all) ;; + *) LANGUAGES="$withval" ;; + esac]) +AC_SUBST(LANGUAGES) + +dnl Mac OS X bundle-based localization support +AC_ARG_WITH(bundledir, [ --with-bundledir set Mac OS X localization bundle directory ], + CUPS_BUNDLEDIR="$withval", + if test "x$uname" = xDarwin -a $uversion -ge 100; then + CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" + LANGUAGES="" + else + CUPS_BUNDLEDIR="" + fi) + +AC_SUBST(CUPS_BUNDLEDIR) +if test "x$CUPS_BUNDLEDIR" != x; then + AC_DEFINE_UNQUOTED(CUPS_BUNDLEDIR, "$CUPS_BUNDLEDIR") +fi + +dnl Default ConfigFilePerm +AC_ARG_WITH(config_file_perm, [ --with-config-file-perm set default ConfigFilePerm value, default=0640], + CUPS_CONFIG_FILE_PERM="$withval", + if test "x$uname" = xDarwin; then + CUPS_CONFIG_FILE_PERM="644" + else + CUPS_CONFIG_FILE_PERM="640" + fi) +AC_SUBST(CUPS_CONFIG_FILE_PERM) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_CONFIG_FILE_PERM, 0$CUPS_CONFIG_FILE_PERM) + +dnl Default LogFilePerm +AC_ARG_WITH(log_file_perm, [ --with-log-file-perm set default LogFilePerm value, default=0644], + CUPS_LOG_FILE_PERM="$withval", + CUPS_LOG_FILE_PERM="644") +AC_SUBST(CUPS_LOG_FILE_PERM) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_FILE_PERM, 0$CUPS_LOG_FILE_PERM) + +dnl Default FatalErrors +AC_ARG_WITH(fatal_errors, [ --with-fatal-errors set default FatalErrors value, default=config], + CUPS_FATAL_ERRORS="$withval", + CUPS_FATAL_ERRORS="config") +AC_SUBST(CUPS_FATAL_ERRORS) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_FATAL_ERRORS, "$CUPS_FATAL_ERRORS") + + +dnl Default LogLevel +AC_ARG_WITH(log_level, [ --with-log-level set default LogLevel value, default=warn], + CUPS_LOG_LEVEL="$withval", + CUPS_LOG_LEVEL="warn") +AC_SUBST(CUPS_LOG_LEVEL) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LOG_LEVEL, "$CUPS_LOG_LEVEL") + +dnl Default AccessLogLevel +AC_ARG_WITH(access_log_level, [ --with-access-log-level set default AccessLogLevel value, default=actions], + CUPS_ACCESS_LOG_LEVEL="$withval", + CUPS_ACCESS_LOG_LEVEL="actions") +AC_SUBST(CUPS_ACCESS_LOG_LEVEL) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_ACCESS_LOG_LEVEL, "$CUPS_ACCESS_LOG_LEVEL") + +dnl Default Browsing +AC_ARG_ENABLE(browsing, [ --disable-browsing disable Browsing by default]) +if test "x$enable_browsing" = xno; then + CUPS_BROWSING="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSING, 0) +else + CUPS_BROWSING="Yes" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSING, 1) +fi +AC_SUBST(CUPS_BROWSING) + +dnl Default BrowseLocalProtocols +AC_ARG_WITH(local_protocols, [ --with-local-protocols set default BrowseLocalProtocols, default="CUPS"], + default_local_protocols="$withval", + default_local_protocols="default") + +if test "x$with_local_protocols" != "xno"; then + if test "x$default_local_protocols" = "xdefault"; then + if test "x$DNSSDLIBS" != "x"; then + CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS dnssd" + else + CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS" + fi + else + CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" + fi +else + CUPS_BROWSE_LOCAL_PROTOCOLS="" +fi + +AC_SUBST(CUPS_BROWSE_LOCAL_PROTOCOLS) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS, + "$CUPS_BROWSE_LOCAL_PROTOCOLS") + +dnl Default BrowseRemoteProtocols +AC_ARG_WITH(remote_protocols, [ --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS"], + default_remote_protocols="$withval", + default_remote_protocols="default") + +if test "x$with_remote_protocols" != "xno"; then + if test "x$default_remote_protocols" = "xdefault"; then + if test "$uname" = "Darwin" -a $uversion -ge 90; then + CUPS_BROWSE_REMOTE_PROTOCOLS="" + else + CUPS_BROWSE_REMOTE_PROTOCOLS="CUPS" + fi + else + CUPS_BROWSE_REMOTE_PROTOCOLS="$default_remote_protocols" + fi +else + CUPS_BROWSE_REMOTE_PROTOCOLS="" +fi + +AC_SUBST(CUPS_BROWSE_REMOTE_PROTOCOLS) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS, + "$CUPS_BROWSE_REMOTE_PROTOCOLS") + +dnl Default BrowseShortNames +AC_ARG_ENABLE(browse_short, [ --disable-browse-short-names + disable BrowseShortNames by default]) +if test "x$enable_browse_short" = xno; then + CUPS_BROWSE_SHORT_NAMES="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSE_SHORT_NAMES, 0) +else + CUPS_BROWSE_SHORT_NAMES="Yes" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_BROWSE_SHORT_NAMES, 1) +fi +AC_SUBST(CUPS_BROWSE_SHORT_NAMES) + +dnl Default DefaultShared +AC_ARG_ENABLE(default_shared, [ --disable-default-shared + disable DefaultShared by default]) +if test "x$enable_default_shared" = xno; then + CUPS_DEFAULT_SHARED="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DEFAULT_SHARED, 0) +else + CUPS_DEFAULT_SHARED="Yes" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DEFAULT_SHARED, 1) +fi +AC_SUBST(CUPS_DEFAULT_SHARED) + +dnl Default ImplicitClasses +AC_ARG_ENABLE(implicit, [ --disable-implicit-classes + disable ImplicitClasses by default]) +if test "x$enable_implicit" = xno; then + CUPS_IMPLICIT_CLASSES="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IMPLICIT_CLASSES, 0) +else + CUPS_IMPLICIT_CLASSES="Yes" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IMPLICIT_CLASSES, 1) +fi +AC_SUBST(CUPS_IMPLICIT_CLASSES) + +dnl Default UseNetworkDefault +AC_ARG_ENABLE(use_network_default, [ --enable-use-network-default + set UseNetworkDefault to Yes by default]) +if test "x$enable_use_network_default" != xno; then + AC_MSG_CHECKING(whether to use network default printers) + if test "x$enable_use_network_default" = xyes -o $uname != Darwin; then + CUPS_USE_NETWORK_DEFAULT="Yes" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USE_NETWORK_DEFAULT, 1) + AC_MSG_RESULT(yes) + else + CUPS_USE_NETWORK_DEFAULT="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USE_NETWORK_DEFAULT, 0) + AC_MSG_RESULT(no) + fi +else + CUPS_USE_NETWORK_DEFAULT="No" + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USE_NETWORK_DEFAULT, 0) +fi +AC_SUBST(CUPS_USE_NETWORK_DEFAULT) + +dnl Determine the correct username and group for this OS... +AC_ARG_WITH(cups_user, [ --with-cups-user set default user for CUPS], + CUPS_USER="$withval", + AC_MSG_CHECKING(for default print user) + if test x$uname = xDarwin; then + if test x`id -u _lp 2>/dev/null` = x; then + CUPS_USER="lp"; + else + CUPS_USER="_lp"; + fi + AC_MSG_RESULT($CUPS_USER) + elif test -f /etc/passwd; then + CUPS_USER="" + for user in lp lpd guest daemon nobody; do + if test "`grep \^${user}: /etc/passwd`" != ""; then + CUPS_USER="$user" + AC_MSG_RESULT($user) + break; + fi + done + + if test x$CUPS_USER = x; then + CUPS_USER="nobody" + AC_MSG_RESULT(not found, using "$CUPS_USER") + fi + else + CUPS_USER="nobody" + AC_MSG_RESULT(no password file, using "$CUPS_USER") + fi) + +if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then + AC_MSG_ERROR([The default user for CUPS cannot be root!]) +fi + +AC_ARG_WITH(cups_group, [ --with-cups-group set default group for CUPS], + CUPS_GROUP="$withval", + AC_MSG_CHECKING(for default print group) + if test x$uname = xDarwin; then + if test x`id -g _lp 2>/dev/null` = x; then + CUPS_GROUP="lp"; + else + CUPS_GROUP="_lp"; + fi + AC_MSG_RESULT($CUPS_GROUP) + elif test -f /etc/group; then + GROUP_LIST="_lp lp nobody" + CUPS_GROUP="" + for group in $GROUP_LIST; do + if test "`grep \^${group}: /etc/group`" != ""; then + CUPS_GROUP="$group" + AC_MSG_RESULT($group) + break; + fi + done + + if test x$CUPS_GROUP = x; then + CUPS_GROUP="nobody" + AC_MSG_RESULT(not found, using "$CUPS_GROUP") + fi + else + CUPS_GROUP="nobody" + AC_MSG_RESULT(no group file, using "$CUPS_GROUP") + fi) + +if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then + AC_MSG_ERROR([The default group for CUPS cannot be root!]) +fi + +AC_ARG_WITH(system_groups, [ --with-system-groups set default system groups for CUPS], + CUPS_SYSTEM_GROUPS="$withval", + if test x$uname = xDarwin; then + CUPS_SYSTEM_GROUPS="admin" + else + AC_MSG_CHECKING(for default system groups) + if test -f /etc/group; then + CUPS_SYSTEM_GROUPS="" + GROUP_LIST="lpadmin sys system root" + for group in $GROUP_LIST; do + if test "`grep \^${group}: /etc/group`" != ""; then + if test "x$CUPS_SYSTEM_GROUPS" = x; then + CUPS_SYSTEM_GROUPS="$group" + else + CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" + fi + fi + done + + if test "x$CUPS_SYSTEM_GROUPS" = x; then + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + AC_MSG_RESULT(no groups found, using "$CUPS_SYSTEM_GROUPS") + else + AC_MSG_RESULT("$CUPS_SYSTEM_GROUPS") + fi + else + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + AC_MSG_RESULT(no group file, using "$CUPS_SYSTEM_GROUPS") + fi + fi) + +CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`" + +for group in $CUPS_SYSTEM_GROUPS; do + if test "x$CUPS_GROUP" = "x$group"; then + AC_MSG_ERROR([The default system groups cannot contain the default CUPS group!]) + fi +done + +AC_SUBST(CUPS_USER) +AC_SUBST(CUPS_GROUP) +AC_SUBST(CUPS_SYSTEM_GROUPS) +AC_SUBST(CUPS_PRIMARY_SYSTEM_GROUP) + +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_USER, "$CUPS_USER") +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GROUP, "$CUPS_GROUP") +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SYSTEM_GROUPS, "$CUPS_SYSTEM_GROUPS") + +dnl Default printcap file... +AC_ARG_WITH(printcap, [ --with-printcap set default printcap file], + default_printcap="$withval", + default_printcap="default") + +if test x$default_printcap != xno; then + if test "x$default_printcap" = "xdefault"; then + case $uname in + Darwin*) + if test $uversion -ge 90; then + CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" + else + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + fi + ;; + SunOS*) + CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" + ;; + *) + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + ;; + esac + else + CUPS_DEFAULT_PRINTCAP="$default_printcap" + fi +else + CUPS_DEFAULT_PRINTCAP="" +fi + +AC_SUBST(CUPS_DEFAULT_PRINTCAP) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTCAP, "$CUPS_DEFAULT_PRINTCAP") + +dnl Default LPD config file... +AC_ARG_WITH(lpdconfigfile, [ --with-lpdconfigfile set default LPDConfigFile URI], + default_lpdconfigfile="$withval", + default_lpdconfigfile="default") + +if test x$default_lpdconfigfile != xno; then + if test "x$default_lpdconfigfile" = "xdefault"; then + case $uname in + Darwin*) + CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" + ;; + *) + if test "x$XINETD" != x; then + CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd" + else + CUPS_DEFAULT_LPD_CONFIG_FILE="" + fi + ;; + esac + else + CUPS_DEFAULT_LPD_CONFIG_FILE="$default_lpdconfigfile" + fi +else + CUPS_DEFAULT_LPD_CONFIG_FILE="" +fi + +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG_FILE, "$CUPS_DEFAULT_LPD_CONFIG_FILE") + +dnl Default SMB config file... +AC_ARG_WITH(smbconfigfile, [ --with-smbconfigfile set default SMBConfigFile URI], + default_smbconfigfile="$withval", + default_smbconfigfile="default") + +if test x$default_smbconfigfile != xno; then + if test "x$default_smbconfigfile" = "xdefault"; then + if test -f /etc/smb.conf; then + CUPS_DEFAULT_SMB_CONFIG_FILE="samba:///etc/smb.conf" + else + CUPS_DEFAULT_SMB_CONFIG_FILE="" + fi + else + CUPS_DEFAULT_SMB_CONFIG_FILE="$default_smbconfigfile" + fi +else + CUPS_DEFAULT_SMB_CONFIG_FILE="" +fi + +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG_FILE, "$CUPS_DEFAULT_SMB_CONFIG_FILE") + +dnl Default MaxCopies value... +AC_ARG_WITH(max-copies, [ --with-max-copies set default max copies value, default=9999 ], + CUPS_MAX_COPIES="$withval", + CUPS_MAX_COPIES="9999") + +AC_SUBST(CUPS_MAX_COPIES) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_MAX_COPIES, $CUPS_MAX_COPIES) + +dnl Default raw printing state +AC_ARG_ENABLE(raw_printing, [ --disable-raw-printing do not allow raw printing by default]) +if test "x$enable_raw_printing" != xno; then + DEFAULT_RAW_PRINTING="" +else + DEFAULT_RAW_PRINTING="#" +fi +AC_SUBST(DEFAULT_RAW_PRINTING) + +dnl Default SNMP options... +AC_ARG_WITH(snmp-address, [ --with-snmp-address set SNMP query address, default=auto ], + if test "x$withval" = x; then + CUPS_SNMP_ADDRESS="" + else + CUPS_SNMP_ADDRESS="Address $withval" + fi, + if test "x$uname" = xDarwin; then + CUPS_SNMP_ADDRESS="" + else + CUPS_SNMP_ADDRESS="Address @LOCAL" + fi) + +AC_ARG_WITH(snmp-community, [ --with-snmp-community set SNMP community, default=public ], + CUPS_SNMP_COMMUNITY="Community $withval", + CUPS_SNMP_COMMUNITY="Community public") + +AC_SUBST(CUPS_SNMP_ADDRESS) +AC_SUBST(CUPS_SNMP_COMMUNITY) + +dnl New default port definition for IPP... +AC_ARG_WITH(ipp-port, [ --with-ipp-port set port number for IPP, default=631 ], + DEFAULT_IPP_PORT="$withval", + DEFAULT_IPP_PORT="631") + +AC_SUBST(DEFAULT_IPP_PORT) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_IPP_PORT,$DEFAULT_IPP_PORT) + +dnl Filters +AC_ARG_ENABLE(bannertops, [ --enable-bannertops always build the banner filter ]) +AC_ARG_ENABLE(texttops, [ --enable-texttops always build the text filter ]) + +if test "x$enable_bannertops" = xno; then + BANNERTOPS="" + DEFAULT_BANNERTOPS="#" +elif test "x$enable_bannertops" = xyes; then + BANNERTOPS="bannertops" + DEFAULT_BANNERTOPS="" +elif test $uname = Darwin; then + BANNERTOPS="" + DEFAULT_BANNERTOPS="#" +else + BANNERTOPS="bannertops" + DEFAULT_BANNERTOPS="" +fi + +if test "x$enable_texttops" = xno; then + TEXTTOPS="" + DEFAULT_TEXTTOPS="#" +elif test "x$enable_texttops" = xyes; then + TEXTTOPS="texttops" + DEFAULT_TEXTTOPS="" +elif test $uname = Darwin; then + TEXTTOPS="" + DEFAULT_TEXTTOPS="#" +else + TEXTTOPS="texttops" + DEFAULT_TEXTTOPS="" +fi + +AC_SUBST(BANNERTOPS) +AC_SUBST(DEFAULT_BANNERTOPS) +AC_SUBST(DEFAULT_TEXTTOPS) +AC_SUBST(TEXTTOPS) + +dnl Fonts +if test "x$BANNERTOPS" = x -a "x$TEXTTOPS" = x; then + FONTS="" +else + FONTS="fonts" +fi + +AC_SUBST(FONTS) + +dnl Web interface... +AC_ARG_ENABLE(webif, [ --enable-webif enable the web interface by default, default=no for Mac OS X]) +case "x$enable_webif" in + xno) + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + ;; + xyes) + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + ;; + *) + if test $uname = Darwin; then + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + else + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + fi + ;; +esac + +AC_SUBST(CUPS_WEBIF) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_WEBIF, $CUPS_DEFAULT_WEBIF) + +dnl +dnl End of "$Id: cups-defaults.m4 9750 2011-05-06 22:53:53Z mike $". +dnl diff --git a/config-scripts/cups-directories.m4 b/config-scripts/cups-directories.m4 new file mode 100644 index 0000000..4159f4c --- /dev/null +++ b/config-scripts/cups-directories.m4 @@ -0,0 +1,440 @@ +dnl +dnl "$Id: cups-directories.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Directory stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_PREFIX_DEFAULT(/) + +dnl Fix "prefix" variable if it hasn't been specified... +if test "$prefix" = "NONE"; then + prefix="/" +fi + +dnl Fix "exec_prefix" variable if it hasn't been specified... +if test "$exec_prefix" = "NONE"; then + if test "$prefix" = "/"; then + exec_prefix="/usr" + else + exec_prefix="$prefix" + fi +fi + +dnl Fix "bindir" variable... +if test "$bindir" = "\${exec_prefix}/bin"; then + bindir="$exec_prefix/bin" +fi + +AC_DEFINE_UNQUOTED(CUPS_BINDIR, "$bindir") + +dnl Fix "sbindir" variable... +if test "$sbindir" = "\${exec_prefix}/sbin"; then + sbindir="$exec_prefix/sbin" +fi + +AC_DEFINE_UNQUOTED(CUPS_SBINDIR, "$sbindir") + +dnl Fix "sharedstatedir" variable if it hasn't been specified... +if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then + sharedstatedir="/usr/com" +fi + +dnl Fix "datarootdir" variable if it hasn't been specified... +if test "$datarootdir" = "\${prefix}/share"; then + if test "$prefix" = "/"; then + datarootdir="/usr/share" + else + datarootdir="$prefix/share" + fi +fi + +dnl Fix "datadir" variable if it hasn't been specified... +if test "$datadir" = "\${prefix}/share"; then + if test "$prefix" = "/"; then + datadir="/usr/share" + else + datadir="$prefix/share" + fi +elif test "$datadir" = "\${datarootdir}"; then + datadir="$datarootdir" +fi + +dnl Fix "includedir" variable if it hasn't been specified... +if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then + includedir="/usr/include" +fi + +dnl Fix "localstatedir" variable if it hasn't been specified... +if test "$localstatedir" = "\${prefix}/var"; then + if test "$prefix" = "/"; then + if test "$uname" = Darwin; then + localstatedir="/private/var" + else + localstatedir="/var" + fi + else + localstatedir="$prefix/var" + fi +fi + +dnl Fix "sysconfdir" variable if it hasn't been specified... +if test "$sysconfdir" = "\${prefix}/etc"; then + if test "$prefix" = "/"; then + if test "$uname" = Darwin; then + sysconfdir="/private/etc" + else + sysconfdir="/etc" + fi + else + sysconfdir="$prefix/etc" + fi +fi + +dnl Fix "libdir" variable... +if test "$libdir" = "\${exec_prefix}/lib"; then + case "$uname" in + IRIX*) + libdir="$exec_prefix/lib32" + ;; + Linux*) + if test -d /usr/lib64; then + libdir="$exec_prefix/lib64" + fi + ;; + HP-UX*) + if test -d /usr/lib/hpux32; then + libdir="$exec_prefix/lib/hpux32" + fi + ;; + esac +fi + +dnl Setup private include directory... +AC_ARG_WITH(privateinclude, [ --with-privateinclude set path for private include files, default=none],privateinclude="$withval",privateinclude="") +if test "x$privateinclude" != x -a "x$privateinclude" != xnone; then + PRIVATEINCLUDE="$privateinclude/cups" +else + privateinclude="" + PRIVATEINCLUDE="" +fi +AC_SUBST(privateinclude) +AC_SUBST(PRIVATEINCLUDE) + +dnl Setup init.d locations... +AC_ARG_WITH(rcdir, [ --with-rcdir set path for rc scripts],rcdir="$withval",rcdir="") +AC_ARG_WITH(rclevels, [ --with-rclevels set run levels for rc scripts],rclevels="$withval",rclevels="2 3 5") +AC_ARG_WITH(rcstart, [ --with-rcstart set start number for rc scripts],rcstart="$withval",rcstart="99") +AC_ARG_WITH(rcstop, [ --with-rcstop set stop number for rc scripts],rcstop="$withval",rcstop="00") +AC_ARG_WITH(smfmanifestdir, [ --with-smfmanifestdir set path for Solaris SMF manifest],smfmanifestdir="$withval",smfmanifestdir="") + +INITDIR="" +INITDDIR="" +RCLEVELS="$rclevels" +RCSTART="$rcstart" +RCSTOP="$rcstop" +SMFMANIFESTDIR="" + +if test x$rcdir = x; then + case "$uname" in + AIX*) + INITDIR="/etc/rc.d" + ;; + + Darwin*) + # Darwin and MacOS X... + if test -x /sbin/launchd; then + INITDDIR="/System/Library/LaunchDaemons" + else + INITDDIR="/System/Library/StartupItems/PrintingServices" + fi + ;; + + FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*) + # FreeBSD and OpenBSD + ;; + + HP-UX*) + INITDIR="/sbin" + RCLEVELS="2" + RCSTART="380" + RCSTOP="620" + ;; + + IRIX*) + # IRIX + INITDIR="/etc" + RCSTART="60" + RCSTOP="25" + ;; + + Linux | GNU | GNU/k*BSD*) + # Linux/HURD seems to choose an init.d directory at random... + if test -d /sbin/init.d; then + # SuSE + INITDIR="/sbin/init.d" + else + if test -d /etc/init.d; then + # Others + INITDIR="/etc" + else + # RedHat + INITDIR="/etc/rc.d" + fi + fi + RCSTART="81" + RCSTOP="36" + ;; + + NetBSD*) + # NetBSD + INITDDIR="/etc/rc.d" + ;; + + OSF1*) + INITDIR="/sbin" + ;; + + SunOS*) + # Solaris + if test "x$smfmanifestdir" != x; then + SMFMANIFESTDIR=$smfmanifestdir + else + INITDIR="/etc" + RCSTART="81" + fi + ;; + + *) + INITDIR="/etc" + ;; + + esac +elif test "x$rcdir" != xno; then + if test "x$rclevels" = x; then + INITDDIR="$rcdir" + else + INITDIR="$rcdir" + fi +fi + +AC_SUBST(INITDIR) +AC_SUBST(INITDDIR) +AC_SUBST(RCLEVELS) +AC_SUBST(RCSTART) +AC_SUBST(RCSTOP) +AC_SUBST(SMFMANIFESTDIR) + +dnl Xinetd support... +AC_ARG_WITH(xinetd, [ --with-xinetd set path for xinetd config files],XINETD="$withval",XINETD="") + +if test "x$XINETD" = x -a ! -x /sbin/launchd; then + for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do + if test -d $dir; then + XINETD="$dir" + break + fi + done +elif test "x$XINETD" = xno; then + XINETD="" +fi + +AC_SUBST(XINETD) + +dnl LPD sharing support... +AC_ARG_WITH(lpdconfig, [ --with-lpdconfig set URI for LPD config file], + LPDCONFIG="$withval", LPDCONFIG="") + +if test "x$LPDCONFIG" = x; then + if test -f /System/Library/LaunchDaemons/org.cups.cups-lpd.plist; then + LPDCONFIG="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" + elif test "x$XINETD" != x; then + LPDCONFIG="xinetd://$XINETD/cups-lpd" + fi +fi + +if test "x$LPDCONFIG" = xoff; then + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG, "") +else + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_LPD_CONFIG, "$LPDCONFIG") +fi + +dnl SMB sharing support... +AC_ARG_WITH(smbconfig, [ --with-smbconfig set URI for Samba config file], + SMBCONFIG="$withval", SMBCONFIG="") + +if test "x$SMBCONFIG" = x; then + if test -f /System/Library/LaunchDaemons/smbd.plist; then + SMBCONFIG="launchd:///System/Library/LaunchDaemons/smbd.plist" + else + for dir in /etc /etc/samba /usr/local/etc; do + if test -f $dir/smb.conf; then + SMBCONFIG="samba://$dir/smb.conf" + break + fi + done + fi +fi + +if test "x$SMBCONFIG" = xoff; then + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG, "") +else + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_SMB_CONFIG, "$SMBCONFIG") +fi + +dnl Setup default locations... +# Cache data... +AC_ARG_WITH(cachedir, [ --with-cachedir set path for cache files],cachedir="$withval",cachedir="") + +if test x$cachedir = x; then + if test "x$uname" = xDarwin; then + CUPS_CACHEDIR="$localstatedir/spool/cups/cache" + else + CUPS_CACHEDIR="$localstatedir/cache/cups" + fi +else + CUPS_CACHEDIR="$cachedir" +fi +AC_DEFINE_UNQUOTED(CUPS_CACHEDIR, "$CUPS_CACHEDIR") +AC_SUBST(CUPS_CACHEDIR) + +# Data files +CUPS_DATADIR="$datadir/cups" +AC_DEFINE_UNQUOTED(CUPS_DATADIR, "$datadir/cups") +AC_SUBST(CUPS_DATADIR) + +# Icon directory +AC_ARG_WITH(icondir, [ --with-icondir set path for application icons],icondir="$withval",icondir="") + +if test "x$icondir" = x -a -d /usr/share/icons; then + ICONDIR="/usr/share/icons" +else + ICONDIR="$icondir" +fi + +AC_SUBST(ICONDIR) + +# Menu directory +AC_ARG_WITH(menudir, [ --with-menudir set path for application menus],menudir="$withval",menudir="") + +if test "x$menudir" = x -a -d /usr/share/applications; then + MENUDIR="/usr/share/applications" +else + MENUDIR="$menudir" +fi + +AC_SUBST(MENUDIR) + +# Documentation files +AC_ARG_WITH(docdir, [ --with-docdir set path for documentation],docdir="$withval",docdir="") + +if test x$docdir = x; then + CUPS_DOCROOT="$datadir/doc/cups" + docdir="$datadir/doc/cups" +else + CUPS_DOCROOT="$docdir" +fi + +AC_DEFINE_UNQUOTED(CUPS_DOCROOT, "$docdir") +AC_SUBST(CUPS_DOCROOT) + +# Fonts +AC_ARG_WITH(fontpath, [ --with-fontpath set font path for pstoraster],fontpath="$withval",fontpath="") + +if test "x$fontpath" = "x"; then + CUPS_FONTPATH="$datadir/cups/fonts" +else + CUPS_FONTPATH="$fontpath" +fi + +AC_SUBST(CUPS_FONTPATH) +AC_DEFINE_UNQUOTED(CUPS_FONTPATH, "$CUPS_FONTPATH") + +# Locale data +if test "$localedir" = "\${datarootdir}/locale"; then + case "$uname" in + Linux | GNU | *BSD* | Darwin*) + CUPS_LOCALEDIR="$datarootdir/locale" + ;; + + OSF1* | AIX*) + CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg" + ;; + + *) + # This is the standard System V location... + CUPS_LOCALEDIR="$exec_prefix/lib/locale" + ;; + esac +else + CUPS_LOCALEDIR="$localedir" +fi + +AC_DEFINE_UNQUOTED(CUPS_LOCALEDIR, "$CUPS_LOCALEDIR") +AC_SUBST(CUPS_LOCALEDIR) + +# Log files... +AC_ARG_WITH(logdir, [ --with-logdir set path for log files],logdir="$withval",logdir="") + +if test x$logdir = x; then + CUPS_LOGDIR="$localstatedir/log/cups" + AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$localstatedir/log/cups") +else + CUPS_LOGDIR="$logdir" +fi +AC_DEFINE_UNQUOTED(CUPS_LOGDIR, "$CUPS_LOGDIR") +AC_SUBST(CUPS_LOGDIR) + +# Longer-term spool data +CUPS_REQUESTS="$localstatedir/spool/cups" +AC_DEFINE_UNQUOTED(CUPS_REQUESTS, "$localstatedir/spool/cups") +AC_SUBST(CUPS_REQUESTS) + +# Server executables... +case "$uname" in + *BSD* | Darwin*) + # *BSD and Darwin (MacOS X) + INSTALL_SYSV="" + CUPS_SERVERBIN="$exec_prefix/libexec/cups" + ;; + *) + # All others + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" + ;; +esac + +AC_DEFINE_UNQUOTED(CUPS_SERVERBIN, "$CUPS_SERVERBIN") +AC_SUBST(CUPS_SERVERBIN) +AC_SUBST(INSTALL_SYSV) + +# Configuration files +CUPS_SERVERROOT="$sysconfdir/cups" +AC_DEFINE_UNQUOTED(CUPS_SERVERROOT, "$sysconfdir/cups") +AC_SUBST(CUPS_SERVERROOT) + +# Transient run-time state +case "$uname" in + Darwin*) + # Darwin (Mac OS X) + CUPS_STATEDIR="$CUPS_SERVERROOT" + ;; + *) + # All others + CUPS_STATEDIR="$localstatedir/run/cups" + ;; +esac +AC_DEFINE_UNQUOTED(CUPS_STATEDIR, "$CUPS_STATEDIR") +AC_SUBST(CUPS_STATEDIR) + +dnl +dnl End of "$Id: cups-directories.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-dnssd.m4 b/config-scripts/cups-dnssd.m4 new file mode 100644 index 0000000..a79e2ba --- /dev/null +++ b/config-scripts/cups-dnssd.m4 @@ -0,0 +1,79 @@ +dnl +dnl "$Id: cups-dnssd.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl DNS Service Discovery (aka Bonjour) stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(dnssd, [ --disable-dnssd disable DNS Service Discovery support]) +AC_ARG_WITH(dnssd-libs, [ --with-dnssd-libs set directory for DNS Service Discovery library], + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS",) +AC_ARG_WITH(dnssd-includes, [ --with-dnssd-includes set directory for DNS Service Discovery includes], + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS",) + +DNSSDLIBS="" +DNSSD_BACKEND="" + +AC_ARG_ENABLE(avahi, [ --enable-avahi turn on DNS Service Discovery support, default=no], + [if test x$enable_avahi = xyes; then + AC_MSG_CHECKING(for Avahi) + if $PKGCONFIG --exists avahi-client; then + AC_MSG_RESULT(yes) + CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" + DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" + DNSSD_BACKEND="dnssd" + AC_DEFINE(HAVE_AVAHI) + enable_dnssd=no + else + AC_MSG_RESULT(no) + fi + fi]) + +if test x$enable_dnssd != xno; then + AC_CHECK_HEADER(dns_sd.h, [ + case "$uname" in + Darwin*) + # Darwin and MacOS X... + AC_DEFINE(HAVE_DNSSD) + AC_DEFINE(HAVE_COREFOUNDATION) + AC_DEFINE(HAVE_SYSTEMCONFIGURATION) + DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration" + DNSSD_BACKEND="dnssd" + ;; + *) + # All others... + AC_MSG_CHECKING(for current version of dns_sd library) + SAVELIBS="$LIBS" + LIBS="$LIBS -ldns_sd" + AC_TRY_COMPILE([#include ], + [int constant = kDNSServiceFlagsShareConnection; + unsigned char txtRecord[100]; + uint8_t valueLen; + TXTRecordGetValuePtr(sizeof(txtRecord), + txtRecord, "value", &valueLen);], + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DNSSD) + DNSSDLIBS="-ldns_sd" + DNSSD_BACKEND="dnssd", + AC_MSG_RESULT(no)) + LIBS="$SAVELIBS" + ;; + esac + ]) +fi + +AC_SUBST(DNSSDLIBS) +AC_SUBST(DNSSD_BACKEND) + +dnl +dnl End of "$Id: cups-dnssd.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-gssapi.m4 b/config-scripts/cups-gssapi.m4 new file mode 100644 index 0000000..a9b93af --- /dev/null +++ b/config-scripts/cups-gssapi.m4 @@ -0,0 +1,170 @@ +dnl +dnl "$Id: cups-gssapi.m4 10083 2011-10-19 20:21:16Z mike $" +dnl +dnl GSSAPI/Kerberos library detection for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 2006-2007 by Easy Software Products. +dnl +dnl This file contains Kerberos support code, copyright 2006 by +dnl Jelmer Vernooij. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(gssapi, [ --disable-gssapi disable GSSAPI support]) + +LIBGSSAPI="" +AC_SUBST(LIBGSSAPI) + +if test x$enable_gssapi != xno; then + AC_PATH_PROG(KRB5CONFIG, krb5-config) + if test "x$KRB5CONFIG" != x; then + case "$uname" in + Darwin) + # Mac OS X weak-links to the Kerberos framework... + LIBGSSAPI="-weak_framework Kerberos" + AC_MSG_CHECKING(for GSS framework) + if test -d /System/Library/Frameworks/GSS.framework; then + AC_MSG_RESULT(yes) + LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" + else + AC_MSG_RESULT(no) + fi + ;; + SunOS*) + # Solaris has a non-standard krb5-config, don't use it! + AC_CHECK_LIB(gss, gss_display_status, + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS" + CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS" + LIBGSSAPI="-lgss `$KRB5CONFIG --libs`") + ;; + *) + # Other platforms just ask for GSSAPI + CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS" + CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS" + LIBGSSAPI="`$KRB5CONFIG --libs gssapi`" + ;; + esac + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + else + # Check for vendor-specific implementations... + case "$uname" in + HP-UX*) + AC_CHECK_LIB(gss, gss_display_status, + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + LIBGSSAPI="-lgss -lgssapi_krb5") + ;; + SunOS*) + AC_CHECK_LIB(gss, gss_display_status, + AC_DEFINE(HAVE_GSSAPI, 1, [Whether GSSAPI is available]) + LIBGSSAPI="-lgss") + ;; + esac + fi + + if test "x$LIBGSSAPI" != x; then + AC_CHECK_HEADER(krb5.h, AC_DEFINE(HAVE_KRB5_H)) + if test -d /System/Library/Frameworks/GSS.framework; then + gssdir="/System/Library/Frameworks/GSS.framework" + AC_MSG_CHECKING(for GSS/gssapi.h presence) + if test -f $gssdir/Headers/gssapi.h; then + AC_DEFINE(HAVE_GSS_GSSAPI_H) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + AC_MSG_CHECKING(for GSS/gssapi_generic.h presence) + if test -f $gssdir/Headers/gssapi_generic.h; then + AC_DEFINE(HAVE_GSSAPI_GENERIC_H) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + AC_MSG_CHECKING(for GSS/gssapi_krb5.h presence) + if test -f $gssdir/Headers/gssapi_krb5.h; then + AC_DEFINE(HAVE_GSSAPI_KRB5_H) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + AC_MSG_CHECKING(for GSS/gssapi_spi.h presence) + if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then + AC_MSG_RESULT(yes) + AC_MSG_CHECKING(for GSS/gssapi_spi.h usability) + if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_GSS_GSSAPI_SPI_H) + else + AC_MSG_RESULT(no) + fi + else + AC_MSG_RESULT(no) + if test $uversion -ge 110; then + # Broken public headers in 10.7... + AC_MSG_ERROR(Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS.) + fi + fi + else + AC_CHECK_HEADER(gssapi.h, AC_DEFINE(HAVE_GSSAPI_H)) + AC_CHECK_HEADER(gssapi/gssapi.h, AC_DEFINE(HAVE_GSSAPI_GSSAPI_H)) + AC_CHECK_HEADER(gssapi/gssapi_generic.h, AC_DEFINE(HAVE_GSSAPI_GENERIC_H)) + AC_CHECK_HEADER(gssapi/gssapi_krb5.h, AC_DEFINE(HAVE_GSSAPI_KRB5_H)) + fi + + SAVELIBS="$LIBS" + LIBS="$LIBS $LIBGSSAPI" + + AC_CHECK_FUNC(__ApplePrivate_gss_acquire_cred_ex_f, + AC_DEFINE(HAVE_GSS_ACQUIRE_CRED_EX_F)) + + AC_MSG_CHECKING(for GSS_C_NT_HOSTBASED_SERVICE) + if test x$ac_cv_header_gssapi_gssapi_h = xyes; then + AC_TRY_COMPILE([ #include ], + [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], + AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + elif test x$ac_cv_header_gss_gssapi_h = xyes; then + AC_TRY_COMPILE([ #include ], + [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], + AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + else + AC_TRY_COMPILE([ #include ], + [ gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; ], + AC_DEFINE(HAVE_GSS_C_NT_HOSTBASED_SERVICE) + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + fi + + LIBS="$SAVELIBS" + fi +fi + +dnl Default GSS service name... +AC_ARG_WITH(gssservicename, [ --with-gssservicename set default gss service name], + default_gssservicename="$withval", + default_gssservicename="default") + +if test x$default_gssservicename != xno; then + if test "x$default_gssservicename" = "xdefault"; then + CUPS_DEFAULT_GSSSERVICENAME="host" + else + CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" + fi +else + CUPS_DEFAULT_GSSSERVICENAME="" +fi + +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_GSSSERVICENAME, "$CUPS_DEFAULT_GSSSERVICENAME") + +dnl +dnl End of "$Id: cups-gssapi.m4 10083 2011-10-19 20:21:16Z mike $". +dnl diff --git a/config-scripts/cups-image.m4 b/config-scripts/cups-image.m4 new file mode 100644 index 0000000..4a77775 --- /dev/null +++ b/config-scripts/cups-image.m4 @@ -0,0 +1,117 @@ +dnl +dnl "$Id: cups-image.m4 10317 2012-03-01 00:05:55Z mike $" +dnl +dnl Image library/filter stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl See if we want the image filters included at all... +AC_ARG_ENABLE(image, [ --enable-image always build the image filters]) + +DEFAULT_IMAGEFILTERS="#" +IMGFILTERS="" +if test "x$enable_image" != xno; then + AC_MSG_CHECKING(whether to build image filters) + if test "x$enable_image" = xyes -o $uname != Darwin; then + IMGFILTERS="imagetops imagetoraster" + DEFAULT_IMAGEFILTERS="" + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi +fi + +AC_SUBST(DEFAULT_IMAGEFILTERS) +AC_SUBST(IMGFILTERS) + +dnl Check for image libraries... +AC_ARG_ENABLE(jpeg, [ --disable-jpeg disable JPEG support]) +AC_ARG_ENABLE(png, [ --disable-png disable PNG support]) +AC_ARG_ENABLE(tiff, [ --disable-tiff disable TIFF support]) + +LIBJPEG="" +LIBPNG="" +LIBTIFF="" +LIBZ="" + +AC_SUBST(LIBJPEG) +AC_SUBST(LIBPNG) +AC_SUBST(LIBTIFF) +AC_SUBST(LIBZ) + +dnl Image libraries use math library functions... +AC_SEARCH_LIBS(pow, m) + +dnl Save the current libraries since we don't want the image libraries +dnl included with every program... +SAVELIBS="$LIBS" + +dnl JPEG library... +if test x$enable_jpeg != xno; then + AC_CHECK_HEADER(jpeglib.h, + AC_CHECK_LIB(jpeg, jpeg_destroy_decompress, + AC_DEFINE(HAVE_LIBJPEG) + LIBJPEG="-ljpeg" + LIBS="$LIBS -ljpeg")) +else + AC_MSG_NOTICE([JPEG support disabled with --disable-jpeg.]) +fi + +dnl ZLIB library... +INSTALL_GZIP="" +AC_CHECK_HEADER(zlib.h, + AC_CHECK_LIB(z, gzgets, + AC_DEFINE(HAVE_LIBZ) + LIBZ="-lz" + LIBS="$LIBS -lz" + if test "x$GZIP" != x; then + INSTALL_GZIP="-z" + fi)) +AC_SUBST(INSTALL_GZIP) + +dnl PNG library... +if test x$enable_png != xno; then + AC_CHECK_HEADER(png.h, + AC_CHECK_LIB(png, png_create_read_struct, + AC_DEFINE(HAVE_LIBPNG) + LIBPNG="-lpng")) +else + AC_MSG_NOTICE([PNG support disabled with --disable-png.]) +fi + +dnl TIFF library... +if test x$enable_tiff != xno; then + AC_CHECK_HEADER(tiff.h, + AC_CHECK_LIB(tiff, TIFFReadScanline, + AC_DEFINE(HAVE_LIBTIFF) + LIBTIFF="-ltiff")) +else + AC_MSG_NOTICE([TIFF support disabled with --disable-tiff.]) +fi + +dnl Restore original LIBS settings... +LIBS="$SAVELIBS" + +EXPORT_LIBJPEG="$LIBJPEG" +EXPORT_LIBPNG="$LIBPNG" +EXPORT_LIBTIFF="$LIBTIFF" +EXPORT_LIBZ="$LIBZ" + +AC_SUBST(EXPORT_LIBJPEG) +AC_SUBST(EXPORT_LIBPNG) +AC_SUBST(EXPORT_LIBTIFF) +AC_SUBST(EXPORT_LIBZ) + +AC_CHECK_HEADER(stdlib.h,AC_DEFINE(HAVE_STDLIB_H)) + +dnl +dnl End of "$Id: cups-image.m4 10317 2012-03-01 00:05:55Z mike $". +dnl diff --git a/config-scripts/cups-largefile.m4 b/config-scripts/cups-largefile.m4 new file mode 100644 index 0000000..c4eab9a --- /dev/null +++ b/config-scripts/cups-largefile.m4 @@ -0,0 +1,52 @@ +dnl +dnl "$Id: cups-largefile.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Large file support stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Check for largefile support... +AC_SYS_LARGEFILE + +dnl Define largefile options as needed... +LARGEFILE="" +if test x$enable_largefile != xno; then + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1; then + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + fi + + if test x$ac_cv_sys_file_offset_bits = x64; then + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + fi +fi +AC_SUBST(LARGEFILE) + +dnl Check for "long long" support... +AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, + [if test "$GCC" = yes; then + ac_cv_c_long_long=yes + else + AC_TRY_COMPILE(,[long long int i;], + ac_cv_c_long_long=yes, + ac_cv_c_long_long=no) + fi]) + +if test $ac_cv_c_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG) +fi + +AC_CHECK_FUNC(strtoll, AC_DEFINE(HAVE_STRTOLL)) + +dnl +dnl End of "$Id: cups-largefile.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-launchd.m4 b/config-scripts/cups-launchd.m4 new file mode 100644 index 0000000..5da5e07 --- /dev/null +++ b/config-scripts/cups-launchd.m4 @@ -0,0 +1,43 @@ +dnl +dnl "$Id: cups-launchd.m4 8983 2010-02-13 02:20:23Z mike $" +dnl +dnl launchd stuff for CUPS. +dnl +dnl Copyright 2007-2010 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + + +AC_ARG_ENABLE(launchd, [ --disable-launchd disable launchd support]) + +DEFAULT_LAUNCHD_CONF="" +LAUNCHDLIBS="" + +if test x$enable_launchd != xno; then + AC_CHECK_FUNC(launch_msg, AC_DEFINE(HAVE_LAUNCHD)) + AC_CHECK_HEADER(launch.h, AC_DEFINE(HAVE_LAUNCH_H)) + + case "$uname" in + Darwin*) + # Darwin, MacOS X + DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist" + # liblaunch is already part of libSystem + ;; + *) + # All others; this test will need to be updated + ;; + esac +fi + +AC_SUBST(DEFAULT_LAUNCHD_CONF) +AC_SUBST(LAUNCHDLIBS) + +dnl +dnl End of "$Id: cups-launchd.m4 8983 2010-02-13 02:20:23Z mike $". +dnl diff --git a/config-scripts/cups-ldap.m4 b/config-scripts/cups-ldap.m4 new file mode 100644 index 0000000..7d68323 --- /dev/null +++ b/config-scripts/cups-ldap.m4 @@ -0,0 +1,52 @@ +dnl +dnl "$Id: cups-ldap.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl LDAP configuration stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 2003-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(ldap, [ --disable-ldap disable LDAP support]) +AC_ARG_WITH(ldap-libs, [ --with-ldap-libs set directory for LDAP library], + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS",) +AC_ARG_WITH(ldap-includes, [ --with-ldap-includes set directory for LDAP includes], + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS",) + +LIBLDAP="" + +if test x$enable_ldap != xno; then + AC_CHECK_HEADER(ldap.h, [ + AC_CHECK_LIB(ldap, ldap_initialize, + AC_DEFINE(HAVE_LDAP) + AC_DEFINE(HAVE_OPENLDAP) + LIBLDAP="-lldap" + AC_CHECK_LIB(ldap, ldap_start_tls, + AC_DEFINE(HAVE_LDAP_SSL)), + + AC_CHECK_LIB(ldap, ldap_init, + AC_DEFINE(HAVE_LDAP) + AC_DEFINE(HAVE_MOZILLA_LDAP) + LIBLDAP="-lldap" + AC_CHECK_HEADER(ldap_ssl.h, AC_DEFINE(HAVE_LDAP_SSL_H),,[#include ]) + AC_CHECK_LIB(ldap, ldapssl_init, + AC_DEFINE(HAVE_LDAP_SSL))) + ) + AC_CHECK_LIB(ldap, ldap_set_rebind_proc, AC_DEFINE(HAVE_LDAP_REBIND_PROC)) + ]) +fi + +AC_SUBST(LIBLDAP) + + +dnl +dnl End of "$Id: cups-ldap.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-libtool.m4 b/config-scripts/cups-libtool.m4 new file mode 100644 index 0000000..5b95b39 --- /dev/null +++ b/config-scripts/cups-libtool.m4 @@ -0,0 +1,39 @@ +dnl +dnl "$Id: cups-libtool.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Libtool stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(libtool_unsupported, [ --enable-libtool-unsupported + build with libtool (UNSUPPORTED!)], + [if test x$enable_libtool_unsupported != xno; then + LIBTOOL="$enable_libtool_unsupported" + enable_shared=no + echo "WARNING: libtool is not supported or endorsed by Apple Inc." + echo " WE DO NOT PROVIDE SUPPORT FOR LIBTOOL PROBLEMS." + else + LIBTOOL="" + fi]) + +AC_SUBST(LIBTOOL) + +if test x$LIBTOOL != x; then + LIBCUPS="libcups.la" + LIBCUPSIMAGE="libcupsimage.la" + LINKCUPS="../cups/\$(LIBCUPS)" + LINKCUPSIMAGE="../filter/\$(LIBCUPSIMAGE)" + DSO="\$(CC)" +fi + +dnl +dnl End of "$Id: cups-libtool.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-manpages.m4 b/config-scripts/cups-manpages.m4 new file mode 100644 index 0000000..3a7afd7 --- /dev/null +++ b/config-scripts/cups-manpages.m4 @@ -0,0 +1,96 @@ +dnl +dnl "$Id: cups-manpages.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Manpage stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Fix "mandir" variable... +if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then + # New GNU "standards" break previous ones, so make sure we use + # the right default location for the operating system... + mandir="\${prefix}/man" +fi + +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then + case "$uname" in + Darwin* | Linux | GNU | *BSD* | AIX*) + # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX + mandir="/usr/share/man" + AMANDIR="/usr/share/man" + PMANDIR="/usr/share/man" + ;; + IRIX) + # SGI IRIX + mandir="/usr/share/catman/u_man" + AMANDIR="/usr/share/catman/a_man" + PMANDIR="/usr/share/catman/p_man" + ;; + *) + # All others + mandir="/usr/man" + AMANDIR="/usr/man" + PMANDIR="/usr/man" + ;; + esac +else + AMANDIR="$mandir" + PMANDIR="$mandir" +fi + +AC_SUBST(AMANDIR) +AC_SUBST(PMANDIR) + +dnl Setup manpage extensions... +case "$uname" in + IRIX*) + # SGI IRIX + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=1m + MAN8DIR=1 + ;; + SunOS* | HP-UX*) + # Solaris and HP-UX + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=1m + MAN8DIR=1m + ;; + Linux* | GNU* | Darwin*) + # Linux, GNU Hurd, and Mac OS X + MAN1EXT=1.gz + MAN5EXT=5.gz + MAN7EXT=7.gz + MAN8EXT=8.gz + MAN8DIR=8 + ;; + *) + # All others + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=8 + MAN8DIR=8 + ;; +esac + +AC_SUBST(MAN1EXT) +AC_SUBST(MAN5EXT) +AC_SUBST(MAN7EXT) +AC_SUBST(MAN8EXT) +AC_SUBST(MAN8DIR) + +dnl +dnl End of "$Id: cups-manpages.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-network.m4 b/config-scripts/cups-network.m4 new file mode 100644 index 0000000..9b591ed --- /dev/null +++ b/config-scripts/cups-network.m4 @@ -0,0 +1,74 @@ +dnl +dnl "$Id: cups-network.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Networking stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_CHECK_HEADER(resolv.h,AC_DEFINE(HAVE_RESOLV_H)) +AC_SEARCH_LIBS(socket, socket) +AC_SEARCH_LIBS(gethostbyaddr, nsl) +AC_SEARCH_LIBS(getifaddrs, nsl, AC_DEFINE(HAVE_GETIFADDRS)) +AC_SEARCH_LIBS(hstrerror, nsl socket resolv, AC_DEFINE(HAVE_HSTRERROR)) +AC_SEARCH_LIBS(rresvport_af, nsl, AC_DEFINE(HAVE_RRESVPORT_AF)) +AC_SEARCH_LIBS(__res_init, resolv bind, AC_DEFINE(HAVE_RES_INIT), + AC_SEARCH_LIBS(res_9_init, resolv bind, AC_DEFINE(HAVE_RES_INIT), + AC_SEARCH_LIBS(res_init, resolv bind, AC_DEFINE(HAVE_RES_INIT)))) + +# Tru64 5.1b leaks file descriptors with these functions; disable until +# we can come up with a test for this... +if test "$uname" != "OSF1"; then + AC_SEARCH_LIBS(getaddrinfo, nsl, AC_DEFINE(HAVE_GETADDRINFO)) + AC_SEARCH_LIBS(getnameinfo, nsl, AC_DEFINE(HAVE_GETNAMEINFO)) +fi + +AC_CHECK_MEMBER(struct sockaddr.sa_len,,, [#include ]) +AC_CHECK_HEADER(sys/sockio.h, AC_DEFINE(HAVE_SYS_SOCKIO_H)) + +CUPS_DEFAULT_DOMAINSOCKET="" + +dnl Domain socket support... +AC_ARG_WITH(domainsocket, [ --with-domainsocket set unix domain socket name], + default_domainsocket="$withval", + default_domainsocket="") + +if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then + if test "x$default_domainsocket" = x; then + case "$uname" in + Darwin*) + # Darwin and MaxOS X do their own thing... + CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" + ;; + *) + # All others use FHS standard... + CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" + ;; + esac + else + CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" + fi + + CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" + + AC_DEFINE_UNQUOTED(CUPS_DEFAULT_DOMAINSOCKET, "$CUPS_DEFAULT_DOMAINSOCKET") +else + CUPS_LISTEN_DOMAINSOCKET="" +fi + +AC_SUBST(CUPS_DEFAULT_DOMAINSOCKET) +AC_SUBST(CUPS_LISTEN_DOMAINSOCKET) + +AC_CHECK_HEADERS(AppleTalk/at_proto.h,AC_DEFINE(HAVE_APPLETALK_AT_PROTO_H),, + [#include ]) + +dnl +dnl End of "$Id: cups-network.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-opsys.m4 b/config-scripts/cups-opsys.m4 new file mode 100644 index 0000000..0effd62 --- /dev/null +++ b/config-scripts/cups-opsys.m4 @@ -0,0 +1,35 @@ +dnl +dnl "$Id: cups-opsys.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Operating system stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Get the operating system, version number, and architecture... +uname=`uname` +uversion=`uname -r | sed -e '1,$s/^[[^0-9]]*\([[0-9]]*\)\.\([[0-9]]*\).*/\1\2/'` +uarch=`uname -m` + +case "$uname" in + GNU* | GNU/*) + uname="GNU" + ;; + IRIX*) + uname="IRIX" + ;; + Linux*) + uname="Linux" + ;; +esac + +dnl +dnl "$Id: cups-opsys.m4 9771 2011-05-12 05:21:56Z mike $" +dnl diff --git a/config-scripts/cups-pam.m4 b/config-scripts/cups-pam.m4 new file mode 100644 index 0000000..9a770bf --- /dev/null +++ b/config-scripts/cups-pam.m4 @@ -0,0 +1,102 @@ +dnl +dnl "$Id: cups-pam.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl PAM stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(pam, [ --disable-pam disable PAM support]) +AC_ARG_WITH(pam_module, [ --with-pam-module specify the PAM module to use]) + +dnl Don't use PAM with AIX... +if test $uname = AIX; then + enable_pam=no +fi + +PAMDIR="" +PAMFILE="pam.std" +PAMLIBS="" +PAMMOD="pam_unknown.so" +PAMMODAUTH="pam_unknown.so" + +if test x$enable_pam != xno; then + SAVELIBS="$LIBS" + + AC_CHECK_LIB(dl,dlopen) + AC_CHECK_LIB(pam,pam_start) + AC_CHECK_LIB(pam,pam_set_item,AC_DEFINE(HAVE_PAM_SET_ITEM)) + AC_CHECK_LIB(pam,pam_setcred,AC_DEFINE(HAVE_PAM_SETCRED)) + AC_CHECK_HEADER(security/pam_appl.h) + if test x$ac_cv_header_security_pam_appl_h != xyes; then + AC_CHECK_HEADER(pam/pam_appl.h, + AC_DEFINE(HAVE_PAM_PAM_APPL_H)) + fi + + if test x$ac_cv_lib_pam_pam_start != xno; then + # Set the necessary libraries for PAM... + if test x$ac_cv_lib_dl_dlopen != xno; then + PAMLIBS="-lpam -ldl" + else + PAMLIBS="-lpam" + fi + + # Find the PAM configuration directory, if any... + for dir in /private/etc/pam.d /etc/pam.d; do + if test -d $dir; then + PAMDIR=$dir + break; + fi + done + fi + + LIBS="$SAVELIBS" + + case "$uname" in + Darwin*) + # Darwin/Mac OS X + if test "x$with_pam_module" != x; then + PAMFILE="pam.$with_pam_module" + elif test -f /usr/lib/pam/pam_opendirectory.so.2; then + PAMFILE="pam.opendirectory" + else + PAMFILE="pam.securityserver" + fi + ;; + + *) + # All others; this test might need to be updated + # as Linux distributors move things around... + if test "x$with_pam_module" != x; then + PAMMOD="pam_${with_pam_module}.so" + elif test -f /lib/security/pam_unix2.so; then + PAMMOD="pam_unix2.so" + elif test -f /lib/security/pam_unix.so; then + PAMMOD="pam_unix.so" + fi + + if test "x$PAMMOD" = xpam_unix.so; then + PAMMODAUTH="$PAMMOD shadow nodelay" + else + PAMMODAUTH="$PAMMOD nodelay" + fi + ;; + esac +fi + +AC_SUBST(PAMDIR) +AC_SUBST(PAMFILE) +AC_SUBST(PAMLIBS) +AC_SUBST(PAMMOD) +AC_SUBST(PAMMODAUTH) + +dnl +dnl End of "$Id: cups-pam.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-pdf.m4 b/config-scripts/cups-pdf.m4 new file mode 100644 index 0000000..5743f79 --- /dev/null +++ b/config-scripts/cups-pdf.m4 @@ -0,0 +1,113 @@ +dnl +dnl "$Id: cups-pdf.m4 9750 2011-05-06 22:53:53Z mike $" +dnl +dnl PDF filter configuration stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_WITH(pdftops, [ --with-pdftops set pdftops filter (gs,/path/to/gs,pdftops,/path/to/pdftops,none), default=pdftops ]) + +PDFTOPS="" +CUPS_PDFTOPS="" +CUPS_GHOSTSCRIPT="" + +case "x$with_pdftops" in + x) # Default/auto + if test $uname != Darwin; then + AC_PATH_PROG(CUPS_PDFTOPS, pdftops) + if test "x$CUPS_PDFTOPS" != x; then + AC_DEFINE(HAVE_PDFTOPS) + PDFTOPS="pdftops" + else + AC_PATH_PROG(CUPS_GHOSTSCRIPT, gs) + if test "x$CUPS_GHOSTSCRIPT" != x; then + AC_DEFINE(HAVE_GHOSTSCRIPT) + PDFTOPS="pdftops" + fi + fi + fi + ;; + + xgs) + AC_PATH_PROG(CUPS_GHOSTSCRIPT, gs) + if test "x$CUPS_GHOSTSCRIPT" != x; then + AC_DEFINE(HAVE_GHOSTSCRIPT) + PDFTOPS="pdftops" + else + AC_MSG_ERROR(Unable to find gs program!) + exit 1 + fi + ;; + + x/*/gs) # Use /path/to/gs without any check: + CUPS_GHOSTSCRIPT="$with_pdftops" + AC_DEFINE(HAVE_GHOSTSCRIPT) + PDFTOPS="pdftops" + ;; + + xpdftops) + AC_PATH_PROG(CUPS_PDFTOPS, pdftops) + if test "x$CUPS_PDFTOPS" != x; then + AC_DEFINE(HAVE_PDFTOPS) + PDFTOPS="pdftops" + else + AC_MSG_ERROR(Unable to find pdftops program!) + exit 1 + fi + ;; + + x/*/pdftops) # Use /path/to/pdftops without any check: + CUPS_PDFTOPS="$with_pdftops" + AC_DEFINE(HAVE_PDFTOPS) + PDFTOPS="pdftops" + ;; + + xnone) # Make no pdftops filter if with_pdftops=none: + ;; + + *) # Invalid with_pdftops value: + AC_MSG_ERROR(Invalid with_pdftops value!) + exit 1 + ;; +esac + +if test "x$CUPS_PDFTOPS" != x; then + AC_MSG_CHECKING(whether pdftops supports -origpagesizes) + if ($CUPS_PDFTOPS -h 2>&1 | grep -q -- -origpagesizes); then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PDFTOPS_WITH_ORIGPAGESIZES) + else + AC_MSG_RESULT(no) + fi + + DEFAULT_PDFTOPS="" +elif test "x$CUPS_GHOSTSCRIPT" != x; then + AC_MSG_CHECKING(whether gs supports the ps2write device) + if ($CUPS_GHOSTSCRIPT -h 2>&1 | grep -q ps2write); then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_GHOSTSCRIPT_PS2WRITE) + else + AC_MSG_RESULT(no) + fi + + DEFAULT_PDFTOPS="" +else + DEFAULT_PDFTOPS="#" +fi + +AC_DEFINE_UNQUOTED(CUPS_PDFTOPS, "$CUPS_PDFTOPS") +AC_DEFINE_UNQUOTED(CUPS_GHOSTSCRIPT, "$CUPS_GHOSTSCRIPT") +AC_SUBST(DEFAULT_PDFTOPS) +AC_SUBST(PDFTOPS) + +dnl +dnl End of "$Id: cups-pdf.m4 9750 2011-05-06 22:53:53Z mike $". +dnl diff --git a/config-scripts/cups-poll.m4 b/config-scripts/cups-poll.m4 new file mode 100644 index 0000000..46d1af5 --- /dev/null +++ b/config-scripts/cups-poll.m4 @@ -0,0 +1,22 @@ +dnl +dnl "$Id: cups-poll.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Select/poll stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_CHECK_FUNC(poll, AC_DEFINE(HAVE_POLL)) +AC_CHECK_FUNC(epoll_create, AC_DEFINE(HAVE_EPOLL)) +AC_CHECK_FUNC(kqueue, AC_DEFINE(HAVE_KQUEUE)) + +dnl +dnl End of "$Id: cups-poll.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-scripting.m4 b/config-scripts/cups-scripting.m4 new file mode 100644 index 0000000..cfbde74 --- /dev/null +++ b/config-scripts/cups-scripting.m4 @@ -0,0 +1,100 @@ +dnl +dnl "$Id: cups-scripting.m4 9099 2010-04-11 07:16:05Z mike $" +dnl +dnl Scripting configuration stuff for CUPS. +dnl +dnl Copyright 2007-2010 by Apple Inc. +dnl Copyright 1997-2006 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +dnl Do we have Java? +AC_ARG_WITH(java, [ --with-java set Java interpreter for web interfaces ], + CUPS_JAVA="$withval", + CUPS_JAVA="") + +if test "x$CUPS_JAVA" = x; then + AC_PATH_PROG(JAVA,java) + CUPS_JAVA="$JAVA" +fi + +AC_DEFINE_UNQUOTED(CUPS_JAVA, "$CUPS_JAVA") + +if test "x$CUPS_JAVA" != x; then + AC_DEFINE(HAVE_JAVA) +fi + +dnl Do we have Perl? +AC_ARG_WITH(perl, [ --with-perl set Perl interpreter for web interfaces ], + CUPS_PERL="$withval", + CUPS_PERL="") + +if test "x$CUPS_PERL" = x; then + AC_PATH_PROG(PERL,perl) + CUPS_PERL="$PERL" +fi + +AC_DEFINE_UNQUOTED(CUPS_PERL, "$CUPS_PERL") + +if test "x$CUPS_PERL" != x; then + AC_DEFINE(HAVE_PERL) +fi + +dnl Do we have PHP? +AC_ARG_WITH(php, [ --with-php set PHP interpreter for web interfaces ], + CUPS_PHP="$withval", + CUPS_PHP="") + +if test "x$CUPS_PHP" = x; then + AC_PATH_PROG(PHPCGI,php-cgi) + if test "x$PHPCGI" = x; then + AC_PATH_PROG(PHP,php) + CUPS_PHP="$PHP" + else + CUPS_PHP="$PHPCGI" + fi +fi + +AC_DEFINE_UNQUOTED(CUPS_PHP, "$CUPS_PHP") + +if test "x$CUPS_PHP" = x; then + CUPS_PHP="no" +else + AC_DEFINE(HAVE_PHP) +fi + +PHPDIR="" +if test "x$CUPS_PHP" != xno; then + AC_PATH_PROG(PHPCONFIG, php-config) + + if test "x$PHPCONFIG" != x; then + PHPDIR="scripting/php" + fi +fi + +AC_SUBST(PHPDIR) + +dnl Do we have Python? +AC_ARG_WITH(python, [ --with-python set Python interpreter for web interfaces ], + CUPS_PYTHON="$withval", + CUPS_PYTHON="") + +if test "x$CUPS_PYTHON" = x; then + AC_PATH_PROG(PYTHON,python) + CUPS_PYTHON="$PYTHON" +fi + +AC_DEFINE_UNQUOTED(CUPS_PYTHON, "$CUPS_PYTHON") + +if test "x$CUPS_PYTHON" != x; then + AC_DEFINE(HAVE_PYTHON) +fi + +dnl +dnl End of "$Id: cups-scripting.m4 9099 2010-04-11 07:16:05Z mike $". +dnl diff --git a/config-scripts/cups-sharedlibs.m4 b/config-scripts/cups-sharedlibs.m4 new file mode 100644 index 0000000..75b3e8d --- /dev/null +++ b/config-scripts/cups-sharedlibs.m4 @@ -0,0 +1,270 @@ +dnl +dnl "$Id: cups-sharedlibs.m4 9153 2010-06-16 00:48:25Z mike $" +dnl +dnl Shared library support for CUPS. +dnl +dnl Copyright 2007-2010 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +PICFLAG=1 +DSOFLAGS="${DSOFLAGS:=}" + +AC_ARG_ENABLE(shared, [ --disable-shared do not create shared libraries]) + +cupsbase="cups" +LIBCUPSBASE="lib$cupsbase" +LIBCUPSSTATIC="lib$cupsbase.a" + +if test x$enable_shared != xno; then + case "$uname" in + SunOS*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)" + ;; + UNIX_S*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)" + ;; + HP-UX*) + case "$uarch" in + ia64) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`" + ;; + *) + LIBCUPS="lib$cupsbase.sl.2" + LIBCUPSCGI="libcupscgi.sl.1" + LIBCUPSDRIVER="libcupsdriver.sl.1" + LIBCUPSIMAGE="libcupsimage.sl.2" + LIBCUPSMIME="libcupsmime.sl.1" + LIBCUPSPPDC="libcupsppdc.sl.1" + DSO="\$(LD)" + DSOXX="\$(LD)" + DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`" + ;; + esac + ;; + IRIX) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + OSF1* | Linux | GNU | *BSD*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + Darwin*) + LIBCUPS="lib$cupsbase.2.dylib" + LIBCUPSCGI="libcupscgi.1.dylib" + LIBCUPSDRIVER="libcupsdriver.1.dylib" + LIBCUPSIMAGE="libcupsimage.2.dylib" + LIBCUPSMIME="libcupsmime.1.dylib" + LIBCUPSPPDC="libcupsppdc.1.dylib" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc" + ;; + AIX*) + LIBCUPS="lib${cupsbase}_s.a" + LIBCUPSBASE="${cupsbase}_s" + LIBCUPSCGI="libcupscgi_s.a" + LIBCUPSDRIVER="libcupsdriver_s.a" + LIBCUPSIMAGE="libcupsimage_s.a" + LIBCUPSMIME="libcupsmime_s.a" + LIBCUPSPPDC="libcupsppdc_s.a" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)" + ;; + *) + echo "Warning: shared libraries may not be supported. Trying -shared" + echo " option with compiler." + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + esac +else + PICFLAG=0 + LIBCUPS="lib$cupsbase.a" + LIBCUPSCGI="libcupscgi.a" + LIBCUPSDRIVER="libcupsdriver.a" + LIBCUPSIMAGE="libcupsimage.a" + LIBCUPSMIME="libcupsmime.a" + LIBCUPSPPDC="libcupsppdc.a" + DSO=":" + DSOXX=":" +fi + +# 32-bit and 64-bit libraries need variations of the standard +# DSOFLAGS... +DSO32FLAGS="$DSOFLAGS" +DSO64FLAGS="$DSOFLAGS" + +AC_SUBST(DSO) +AC_SUBST(DSOXX) +AC_SUBST(DSOFLAGS) +AC_SUBST(DSO32FLAGS) +AC_SUBST(DSO64FLAGS) +AC_SUBST(LIBCUPS) +AC_SUBST(LIBCUPSBASE) +AC_SUBST(LIBCUPSCGI) +AC_SUBST(LIBCUPSDRIVER) +AC_SUBST(LIBCUPSIMAGE) +AC_SUBST(LIBCUPSMIME) +AC_SUBST(LIBCUPSPPDC) +AC_SUBST(LIBCUPSSTATIC) + +if test x$enable_shared = xno; then + LINKCUPS="../cups/lib$cupsbase.a" + LINKCUPSIMAGE="../filter/libcupsimage.a" + + EXTLINKCUPS="-lcups" + EXTLINKCUPSDRIVER="-lcupsdriver" + EXTLINKCUPSIMAGE="-lcupsimage" +else + if test $uname = AIX; then + LINKCUPS="-l${cupsbase}_s" + LINKCUPSIMAGE="-lcupsimage_s" + + EXTLINKCUPS="-lcups_s" + EXTLINKCUPSDRIVER="-lcupsdriver_s" + EXTLINKCUPSIMAGE="-lcupsimage_s" + else + LINKCUPS="-l${cupsbase}" + LINKCUPSIMAGE="-lcupsimage" + + EXTLINKCUPS="-lcups" + EXTLINKCUPSDRIVER="-lcupsdriver" + EXTLINKCUPSIMAGE="-lcupsimage" + fi +fi + +AC_SUBST(EXTLINKCUPS) +AC_SUBST(EXTLINKCUPSDRIVER) +AC_SUBST(EXTLINKCUPSIMAGE) +AC_SUBST(LINKCUPS) +AC_SUBST(LINKCUPSIMAGE) + +dnl Update libraries for DSOs... +EXPORT_LDFLAGS="" + +if test "$DSO" != ":"; then + # When using DSOs the image libraries are linked to libcupsimage.so + # rather than to the executables. This makes things smaller if you + # are using any static libraries, and it also allows us to distribute + # a single DSO rather than a bunch... + DSOLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" + IMGLIBS="" + + # Tell the run-time linkers where to find a DSO. Some platforms + # need this option, even when the library is installed in a + # standard location... + case $uname in + HP-UX*) + # HP-UX needs the path, even for /usr/lib... + case "$uarch" in + ia64) + DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,+s,+b,$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,+s,+b,$LIB64DIR $DSO64FLAGS" + ;; + *) + DSOFLAGS="+s +b $libdir $DSOFLAGS" + DSO32FLAGS="+s +b $LIB32DIR $DSO32FLAGS" + DSO64FLAGS="+s +b $LIB64DIR $DSO64FLAGS" + ;; + esac + LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir" + EXPORT_LDFLAGS="-Wl,+s,+b,$libdir" + ;; + SunOS*) + # Solaris... + if test $exec_prefix != /usr; then + DSOFLAGS="-R$libdir $DSOFLAGS" + DSO32FLAGS="-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -R$libdir" + EXPORT_LDFLAGS="-R$libdir" + fi + ;; + *BSD*) + # *BSD... + if test $exec_prefix != /usr; then + DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-R$libdir" + EXPORT_LDFLAGS="-Wl,-R$libdir" + fi + ;; + IRIX | Linux | GNU) + # IRIX, Linux, and HURD... + if test $exec_prefix != /usr; then + DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-rpath,$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-rpath,$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" + EXPORT_LDFLAGS="-Wl,-rpath,$libdir" + fi + ;; + esac +else + DSOLIBS="" + IMGLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" +fi + +AC_SUBST(DSOLIBS) +AC_SUBST(IMGLIBS) +AC_SUBST(EXPORT_LDFLAGS) + +dnl +dnl End of "$Id: cups-sharedlibs.m4 9153 2010-06-16 00:48:25Z mike $". +dnl diff --git a/config-scripts/cups-slp.m4 b/config-scripts/cups-slp.m4 new file mode 100644 index 0000000..c681624 --- /dev/null +++ b/config-scripts/cups-slp.m4 @@ -0,0 +1,38 @@ +dnl +dnl "$Id: cups-slp.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl OpenSLP configuration stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(slp, [ --disable-slp disable SLP support]) +AC_ARG_WITH(openslp-libs, [ --with-openslp-libs set directory for OpenSLP library], + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS",) +AC_ARG_WITH(openslp-includes, [ --with-openslp-includes set directory for OpenSLP includes], + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS",) + +LIBSLP="" + +if test x$enable_slp != xno; then + AC_CHECK_HEADER(slp.h, + AC_CHECK_LIB(slp, SLPOpen, + AC_DEFINE(HAVE_LIBSLP) + LIBSLP="-lslp")) +fi + +AC_SUBST(LIBSLP) + + +dnl +dnl End of "$Id: cups-slp.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config-scripts/cups-ssl.m4 b/config-scripts/cups-ssl.m4 new file mode 100644 index 0000000..b5943d5 --- /dev/null +++ b/config-scripts/cups-ssl.m4 @@ -0,0 +1,181 @@ +dnl +dnl "$Id: cups-ssl.m4 10371 2012-03-21 04:45:48Z mike $" +dnl +dnl OpenSSL/GNUTLS stuff for CUPS. +dnl +dnl Copyright 2007-2012 by Apple Inc. +dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(ssl, [ --disable-ssl disable SSL/TLS support]) +AC_ARG_ENABLE(cdsassl, [ --enable-cdsassl use CDSA for SSL/TLS support, default=first]) +AC_ARG_ENABLE(gnutls, [ --enable-gnutls use GNU TLS for SSL/TLS support, default=second]) +AC_ARG_ENABLE(openssl, [ --enable-openssl use OpenSSL for SSL/TLS support, default=third]) +AC_ARG_WITH(openssl-libs, [ --with-openssl-libs set directory for OpenSSL library], + LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS",) +AC_ARG_WITH(openssl-includes, [ --with-openssl-includes set directory for OpenSSL includes], + CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS",) + +SSLFLAGS="" +SSLLIBS="" +have_ssl=0 + +if test x$enable_ssl != xno; then + dnl Look for CDSA... + if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then + if test $uname = Darwin; then + AC_CHECK_HEADER(Security/SecureTransport.h, [ + have_ssl=1 + AC_DEFINE(HAVE_SSL) + AC_DEFINE(HAVE_CDSASSL) + + dnl Check for the various security headers... + AC_CHECK_HEADER(Security/SecureTransportPriv.h, + AC_DEFINE(HAVE_SECURETRANSPORTPRIV_H)) + AC_CHECK_HEADER(Security/SecCertificate.h, + AC_DEFINE(HAVE_SECCERTIFICATE_H)) + AC_CHECK_HEADER(Security/SecItem.h, + AC_DEFINE(HAVE_SECITEM_H)) + AC_CHECK_HEADER(Security/SecItemPriv.h, + AC_DEFINE(HAVE_SECITEMPRIV_H),, + [#include ]) + AC_CHECK_HEADER(Security/SecPolicy.h, + AC_DEFINE(HAVE_SECPOLICY_H)) + AC_CHECK_HEADER(Security/SecPolicyPriv.h, + AC_DEFINE(HAVE_SECPOLICYPRIV_H)) + AC_CHECK_HEADER(Security/SecBasePriv.h, + AC_DEFINE(HAVE_SECBASEPRIV_H)) + AC_CHECK_HEADER(Security/SecIdentitySearchPriv.h, + AC_DEFINE(HAVE_SECIDENTITYSEARCHPRIV_H)) + + dnl Check for SSLSetProtocolVersionMax... + SAVELIBS="$LIBS" + LIBS="$LIBS -framework Security" + AC_CHECK_FUNC(SSLSetProtocolVersionMax) + LIBS="$SAVELIBS" + + dnl Check for SecCertificateCopyData.. + AC_MSG_CHECKING(for SecCertificateCopyData) + if test $uversion -ge 100; then + AC_DEFINE(HAVE_SECCERTIFICATECOPYDATA) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + + dnl Check for SecIdentitySearchCreateWithPolicy... + AC_MSG_CHECKING(for SecIdentitySearchCreateWithPolicy) + if test $uversion -ge 80; then + AC_DEFINE(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi + + dnl Check for SecPolicyCreateSSL... + AC_MSG_CHECKING(for SecPolicyCreateSSL) + if test $uversion -ge 110; then + AC_DEFINE(HAVE_SECPOLICYCREATESSL) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi]) + + AC_DEFINE(HAVE_CSSMERRORSTRING) + fi + fi + + dnl Then look for GNU TLS... + if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then + AC_PATH_PROG(LIBGNUTLSCONFIG,libgnutls-config) + AC_PATH_PROG(LIBGCRYPTCONFIG,libgcrypt-config) + if $PKGCONFIG --exists gnutls; then + have_ssl=1 + SSLLIBS=`$PKGCONFIG --libs gnutls` + SSLFLAGS=`$PKGCONFIG --cflags gnutls` + AC_DEFINE(HAVE_SSL) + AC_DEFINE(HAVE_GNUTLS) + elif test "x$LIBGNUTLSCONFIG" != x; then + have_ssl=1 + SSLLIBS=`$LIBGNUTLSCONFIG --libs` + SSLFLAGS=`$LIBGNUTLSCONFIG --cflags` + AC_DEFINE(HAVE_SSL) + AC_DEFINE(HAVE_GNUTLS) + fi + + if test $have_ssl = 1; then + if $PKGCONFIG --exists gcrypt; then + SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`" + SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`" + elif test "x$LIBGCRYPTCONFIG" != x; then + SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`" + SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`" + fi + fi + fi + + dnl Check for the OpenSSL library last... + if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then + AC_CHECK_HEADER(openssl/ssl.h, + dnl Save the current libraries so the crypto stuff isn't always + dnl included... + SAVELIBS="$LIBS" + + dnl Some ELF systems can't resolve all the symbols in libcrypto + dnl if libcrypto was linked against RSAREF, and fail to link the + dnl test program correctly, even though a correct installation + dnl of OpenSSL exists. So we test the linking three times in + dnl case the RSAREF libraries are needed. + + for libcrypto in \ + "-lcrypto" \ + "-lcrypto -lrsaref" \ + "-lcrypto -lRSAglue -lrsaref" + do + AC_CHECK_LIB(ssl,SSL_new, + [have_ssl=1 + SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT" + SSLLIBS="-lssl $libcrypto" + AC_DEFINE(HAVE_SSL) + AC_DEFINE(HAVE_LIBSSL)],, + $libcrypto) + + if test "x${SSLLIBS}" != "x"; then + LIBS="$SAVELIBS $SSLLIBS" + AC_CHECK_FUNC(SSL_set_tlsext_host_name, + AC_DEFINE(HAVE_SSL_SET_TLSEXT_HOST_NAME)) + break + fi + done + + LIBS="$SAVELIBS") + fi +fi + +IPPALIASES="http" +if test $have_ssl = 1; then + AC_MSG_RESULT([ Using SSLLIBS="$SSLLIBS"]) + AC_MSG_RESULT([ Using SSLFLAGS="$SSLFLAGS"]) + IPPALIASES="http https ipps" +elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then + AC_MSG_ERROR([Unable to enable SSL support.]) +fi + +AC_SUBST(IPPALIASES) +AC_SUBST(SSLFLAGS) +AC_SUBST(SSLLIBS) + +EXPORT_SSLLIBS="$SSLLIBS" +AC_SUBST(EXPORT_SSLLIBS) + +dnl +dnl End of "$Id: cups-ssl.m4 10371 2012-03-21 04:45:48Z mike $". +dnl diff --git a/config-scripts/cups-threads.m4 b/config-scripts/cups-threads.m4 new file mode 100644 index 0000000..0743e34 --- /dev/null +++ b/config-scripts/cups-threads.m4 @@ -0,0 +1,54 @@ +dnl +dnl "$Id: cups-threads.m4 9771 2011-05-12 05:21:56Z mike $" +dnl +dnl Threading stuff for CUPS. +dnl +dnl Copyright 2007-2011 by Apple Inc. +dnl Copyright 1997-2005 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_ARG_ENABLE(threads, [ --disable-threads disable multi-threading support]) + +have_pthread=no +PTHREAD_FLAGS="" + +if test "x$enable_threads" != xno; then + AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H)) + + if test x$ac_cv_header_pthread_h = xyes; then + dnl Check various threading options for the platforms we support + for flag in -lpthreads -lpthread -pthread; do + AC_MSG_CHECKING([for pthread_create using $flag]) + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + AC_TRY_LINK([#include ], + [pthread_create(0, 0, 0, 0);], + have_pthread=yes, + LIBS="$SAVELIBS") + AC_MSG_RESULT([$have_pthread]) + + if test $have_pthread = yes; then + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to + # be POSIX-compliant... :( + if test $uname = SunOS; then + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + fi + break + fi + done + fi +fi + +AC_SUBST(PTHREAD_FLAGS) + +dnl +dnl End of "$Id: cups-threads.m4 9771 2011-05-12 05:21:56Z mike $". +dnl diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..cc9880d --- /dev/null +++ b/config.h.in @@ -0,0 +1,762 @@ +/* + * "$Id: config.h.in 10371 2012-03-21 04:45:48Z mike $" + * + * Configuration file for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_CONFIG_H_ +#define _CUPS_CONFIG_H_ + +/* + * Version of software... + */ + +#define CUPS_SVERSION "" +#define CUPS_MINIMAL "" + + +/* + * Default user and groups... + */ + +#define CUPS_DEFAULT_USER "lp" +#define CUPS_DEFAULT_GROUP "sys" +#define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system" +#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@SYSTEM" + + +/* + * Default file permissions... + */ + +#define CUPS_DEFAULT_CONFIG_FILE_PERM 0640 +#define CUPS_DEFAULT_LOG_FILE_PERM 0644 + + +/* + * Default logging settings... + */ + +#define CUPS_DEFAULT_LOG_LEVEL "warn" +#define CUPS_DEFAULT_ACCESS_LOG_LEVEL "actions" + + +/* + * Default fatal error settings... + */ + +#define CUPS_DEFAULT_FATAL_ERRORS "config" + + +/* + * Default browsing settings... + */ + +#define CUPS_DEFAULT_BROWSING 1 +#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "CUPS" +#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS "CUPS" +#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1 +#define CUPS_DEFAULT_DEFAULT_SHARED 1 +#define CUPS_DEFAULT_IMPLICIT_CLASSES 1 +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 1 + + +/* + * Default IPP port... + */ + +#define CUPS_DEFAULT_IPP_PORT 631 + + +/* + * Default printcap file... + */ + +#define CUPS_DEFAULT_PRINTCAP "/etc/printcap" + + +/* + * Default Samba and LPD config files... + */ + +#define CUPS_DEFAULT_SMB_CONFIG_FILE "" +#define CUPS_DEFAULT_LPD_CONFIG_FILE "" + + +/* + * Default MaxCopies value... + */ + +#define CUPS_DEFAULT_MAX_COPIES 100 + + +/* + * Do we have domain socket support, and if so what is the default one? + */ + +#undef CUPS_DEFAULT_DOMAINSOCKET + + +/* + * Default WebInterface value... + */ + +#undef CUPS_DEFAULT_WEBIF + + +/* + * Where are files stored? + * + * Note: These are defaults, which can be overridden by environment + * variables at run-time... + */ + +#define CUPS_BINDIR "/usr/bin" +#define CUPS_CACHEDIR "/var/cache/cups" +#define CUPS_DATADIR "/usr/share/cups" +#define CUPS_DOCROOT "/usr/share/doc/cups" +#define CUPS_FONTPATH "/usr/share/cups/fonts" +#define CUPS_LOCALEDIR "/usr/share/locale" +#define CUPS_LOGDIR "/var/logs/cups" +#define CUPS_REQUESTS "/var/spool/cups" +#define CUPS_SBINDIR "/usr/sbin" +#define CUPS_SERVERBIN "/usr/lib/cups" +#define CUPS_SERVERROOT "/etc/cups" +#define CUPS_STATEDIR "/var/run/cups" + + +/* + * Do we have various image libraries? + */ + +#undef HAVE_LIBPNG +#undef HAVE_LIBZ +#undef HAVE_LIBJPEG +#undef HAVE_LIBTIFF + + +/* + * Do we have PAM stuff? + */ + +#ifndef HAVE_LIBPAM +#define HAVE_LIBPAM 0 +#endif /* !HAVE_LIBPAM */ + +#undef HAVE_PAM_PAM_APPL_H +#undef HAVE_PAM_SET_ITEM +#undef HAVE_PAM_SETCRED + + +/* + * Do we have ? + */ + +#undef HAVE_SHADOW_H + + +/* + * Do we have ? + */ + +#undef HAVE_CRYPT_H + + +/* + * Do we have ? + */ + +#undef HAVE_SCSI_SG_H + + +/* + * Use , , and/or ? + */ + +#undef HAVE_STRING_H +#undef HAVE_STRINGS_H +#undef HAVE_BSTRING_H + + +/* + * Do we have the long long type? + */ + +#undef HAVE_LONG_LONG + +#ifdef HAVE_LONG_LONG +# define CUPS_LLFMT "%lld" +# define CUPS_LLCAST (long long) +#else +# define CUPS_LLFMT "%ld" +# define CUPS_LLCAST (long) +#endif /* HAVE_LONG_LONG */ + + +/* + * Do we have the strtoll() function? + */ + +#undef HAVE_STRTOLL + +#ifndef HAVE_STRTOLL +# define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) +#endif /* !HAVE_STRTOLL */ + + +/* + * Do we have the strXXX() functions? + */ + +#undef HAVE_STRDUP +#undef HAVE_STRLCAT +#undef HAVE_STRLCPY + + +/* + * Do we have the geteuid() function? + */ + +#undef HAVE_GETEUID + + +/* + * Do we have the setpgid() function? + */ + +#undef HAVE_SETPGID + + +/* + * Do we have the vsyslog() function? + */ + +#undef HAVE_VSYSLOG + + +/* + * Do we have the (v)snprintf() functions? + */ + +#undef HAVE_SNPRINTF +#undef HAVE_VSNPRINTF + + +/* + * What signal functions to use? + */ + +#undef HAVE_SIGSET +#undef HAVE_SIGACTION + + +/* + * What wait functions to use? + */ + +#undef HAVE_WAITPID +#undef HAVE_WAIT3 + + +/* + * Do we have the mallinfo function and malloc.h? + */ + +#undef HAVE_MALLINFO +#undef HAVE_MALLOC_H + + +/* + * Do we have the POSIX ACL functions? + */ + +#undef HAVE_ACL_INIT + + +/* + * Do we have the langinfo.h header file? + */ + +#undef HAVE_LANGINFO_H + + +/* + * Which encryption libraries do we have? + */ + +#undef HAVE_CDSASSL +#undef HAVE_GNUTLS +#undef HAVE_LIBSSL +#undef HAVE_SSL + + +/* + * Do we have the SSL_set_tlsext_host_name function? + */ + +#undef HAVE_SSL_SET_TLSEXT_HOST_NAME + + +/* + * What Security framework headers do we have? + */ + +#undef HAVE_AUTHORIZATION_H +#undef HAVE_SECBASEPRIV_H +#undef HAVE_SECCERTIFICATE_H +#undef HAVE_SECIDENTITYSEARCHPRIV_H +#undef HAVE_SECITEM_H +#undef HAVE_SECITEMPRIV_H +#undef HAVE_SECPOLICY_H +#undef HAVE_SECPOLICYPRIV_H +#undef HAVE_SECURETRANSPORTPRIV_H + + +/* + * Do we have the SecCertificateCopyData function? + */ + +#undef HAVE_SECCERTIFICATECOPYDATA + + +/* + * Do we have the SecIdentitySearchCreateWithPolicy function? + */ + +#undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +#undef HAVE_SECPOLICYCREATESSL + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +#undef HAVE_SECPOLICYCREATESSL + + +/* + * Do we have the SSLSetProtocolVersionMax function? + */ + +#undef HAVE_SSLSETPROTOCOLVERSIONMAX + + +/* + * Do we have the cssmErrorString function? + */ + +#undef HAVE_CSSMERRORSTRING + + +/* + * Do we have the SLP library? + */ + +#undef HAVE_LIBSLP + + +/* + * Do we have an LDAP library? + */ + +#undef HAVE_LDAP +#undef HAVE_OPENLDAP +#undef HAVE_MOZILLA_LDAP +#undef HAVE_LDAP_SSL_H +#undef HAVE_LDAP_SSL +#undef HAVE_LDAP_REBIND_PROC + + +/* + * Do we have libpaper? + */ + +#undef HAVE_LIBPAPER + + +/* + * Do we have DNS Service Discovery (aka Bonjour)? + */ + +#undef HAVE_DNSSD + + +/* + * Do we have Avahi for DNS Service Discovery? + */ + +#undef HAVE_AVAHI + + +/* + * Do we have ? + */ + +#undef HAVE_SYS_IOCTL_H + + +/* + * Does the "stat" structure contain the "st_gen" member? + */ + +#undef HAVE_ST_GEN + + +/* + * Does the "tm" structure contain the "tm_gmtoff" member? + */ + +#undef HAVE_TM_GMTOFF + + +/* + * Do we have rresvport_af()? + */ + +#undef HAVE_RRESVPORT_AF + + +/* + * Do we have getaddrinfo()? + */ + +#undef HAVE_GETADDRINFO + + +/* + * Do we have getnameinfo()? + */ + +#undef HAVE_GETNAMEINFO + + +/* + * Do we have getifaddrs()? + */ + +#undef HAVE_GETIFADDRS + + +/* + * Do we have hstrerror()? + */ + +#undef HAVE_HSTRERROR + + +/* + * Do we have res_init()? + */ + +#undef HAVE_RES_INIT + + +/* + * Do we have + */ + +#undef HAVE_RESOLV_H + + +/* + * Do we have the header file? + */ + +#undef HAVE_SYS_SOCKIO_H + + +/* + * Does the sockaddr structure contain an sa_len parameter? + */ + +#undef HAVE_STRUCT_SOCKADDR_SA_LEN + + +/* + * Do we have the AIX usersec.h header file? + */ + +#undef HAVE_USERSEC_H + + +/* + * Do we have pthread support? + */ + +#undef HAVE_PTHREAD_H + + +/* + * Do we have launchd support? + */ + +#undef HAVE_LAUNCH_H +#undef HAVE_LAUNCHD + + +/* + * Various scripting languages... + */ + +#undef HAVE_JAVA +#define CUPS_JAVA "/usr/bin/java" +#undef HAVE_PERL +#define CUPS_PERL "/usr/bin/perl" +#undef HAVE_PHP +#define CUPS_PHP "/usr/bin/php" +#undef HAVE_PYTHON +#define CUPS_PYTHON "/usr/bin/python" + + +/* + * Location of the poppler/Xpdf pdftops program... + */ + +#undef HAVE_PDFTOPS +#undef HAVE_PDFTOPS_WITH_ORIGPAGESIZES +#define CUPS_PDFTOPS "/usr/bin/pdftops" + + +/* + * Location of the Ghostscript gs program... + */ + +#undef HAVE_GHOSTSCRIPT +#undef HAVE_GHOSTSCRIPT_PS2WRITE +#define CUPS_GHOSTSCRIPT "/usr/bin/gs" + + +/* + * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks? + */ + +#undef HAVE_COREFOUNDATION +#undef HAVE_SYSTEMCONFIGURATION + + +/* + * Do we have CoreFoundation public and private headers? + */ + +#undef HAVE_COREFOUNDATION_H +#undef HAVE_CFPRIV_H +#undef HAVE_CFBUNDLEPRIV_H + + +/* + * Do we have ApplicationServices public headers? + */ + +#undef HAVE_APPLICATIONSERVICES_H + + +/* + * Do we have the SCDynamicStoreCopyComputerName function? + */ + +#undef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME + + +/* + * Do we have Mac OS X 10.4's mbr_XXX functions? + */ + +#undef HAVE_MEMBERSHIP_H +#undef HAVE_MEMBERSHIPPRIV_H +#undef HAVE_MBR_UID_TO_UUID + + +/* + * Do we have Darwin's notify_post header and function? + */ + +#undef HAVE_NOTIFY_H +#undef HAVE_NOTIFY_POST + + +/* + * Do we have Darwin's IOKit private headers? + */ + +#undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H + + +/* + * Do we have DBUS? + */ + +#undef HAVE_DBUS +#undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND + + +/* + * Do we have the GSSAPI support library (for Kerberos support)? + */ + +#undef HAVE_GSS_ACQUIRE_CRED_EX_F +#undef HAVE_GSS_C_NT_HOSTBASED_SERVICE +#undef HAVE_GSS_GSSAPI_H +#undef HAVE_GSS_GSSAPI_SPI_H +#undef HAVE_GSSAPI +#undef HAVE_GSSAPI_GENERIC_H +#undef HAVE_GSSAPI_GSSAPI_H +#undef HAVE_GSSAPI_H +#undef HAVE_GSSAPI_KRB5_H +#undef HAVE_KRB5_H + + +/* + * Default GSS service name... + */ + +#define CUPS_DEFAULT_GSSSERVICENAME "" + + +/* + * Select/poll interfaces... + */ + +#undef HAVE_POLL +#undef HAVE_EPOLL +#undef HAVE_KQUEUE + + +/* + * Do we have the header? + */ + +#undef HAVE_DLFCN_H + + +/* + * Do we have ? + */ + +#undef HAVE_SYS_PARAM_H + + +/* + * Do we have ? + */ + +#undef HAVE_SYS_UCRED_H + + +/* + * Do we have removefile()? + */ + +#undef HAVE_REMOVEFILE + + +/* + * Do we have ? + */ + +#undef HAVE_SANDBOX_H + + +/* + * Which random number generator function to use... + */ + +#undef HAVE_ARC4RANDOM +#undef HAVE_RANDOM +#undef HAVE_LRAND48 + +#ifdef HAVE_ARC4RANDOM +# define CUPS_RAND() arc4random() +# define CUPS_SRAND(v) arc4random_stir() +#elif defined(HAVE_RANDOM) +# define CUPS_RAND() random() +# define CUPS_SRAND(v) srandom(v) +#elif defined(HAVE_LRAND48) +# define CUPS_RAND() lrand48() +# define CUPS_SRAND(v) srand48(v) +#else +# define CUPS_RAND() rand() +# define CUPS_SRAND(v) srand(v) +#endif /* HAVE_ARC4RANDOM */ + + +/* + * Do we have vproc_transaction_begin/end? + */ + +#undef HAVE_VPROC_TRANSACTION_BEGIN + + +/* + * Do we have libusb? + */ + +#undef HAVE_LIBUSB + + +/* + * Do we have libwrap and tcpd.h? + */ + +#undef HAVE_TCPD_H + + +/* + * Do we have ? + */ + +#undef HAVE_ICONV_H + + +/* + * Do we have statfs or statvfs and one of the corresponding headers? + */ + +#undef HAVE_STATFS +#undef HAVE_STATVFS +#undef HAVE_SYS_MOUNT_H +#undef HAVE_SYS_STATFS_H +#undef HAVE_SYS_STATVFS_H +#undef HAVE_SYS_VFS_H + + +/* + * Location of Mac OS X localization bundle, if any. + */ + +#undef CUPS_BUNDLEDIR + + +/* + * Do we have the ColorSyncRegisterDevice function? + */ + +#undef HAVE_COLORSYNCREGISTERDEVICE + + +/* + * Do we have XPC? + */ + +#undef HAVE_XPC + + +#endif /* !_CUPS_CONFIG_H_ */ + +/* + * End of "$Id: config.h.in 10371 2012-03-21 04:45:48Z mike $". + */ diff --git a/configure b/configure new file mode 100755 index 0000000..d6784a4 --- /dev/null +++ b/configure @@ -0,0 +1,13098 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.67. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software +# Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="cups/cups.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_default_prefix=/ +ac_subst_vars='LTLIBOBJS +LIBOBJS +UNINSTALL_LANGUAGES +INSTALL_LANGUAGES +PYTHON +PHPDIR +PHPCONFIG +PHP +PHPCGI +PERL +JAVA +PDFTOPS +DEFAULT_PDFTOPS +CUPS_GHOSTSCRIPT +CUPS_PDFTOPS +CUPS_WEBIF +FONTS +TEXTTOPS +DEFAULT_TEXTTOPS +DEFAULT_BANNERTOPS +BANNERTOPS +DEFAULT_IPP_PORT +CUPS_SNMP_COMMUNITY +CUPS_SNMP_ADDRESS +DEFAULT_RAW_PRINTING +CUPS_MAX_COPIES +CUPS_DEFAULT_PRINTCAP +CUPS_PRIMARY_SYSTEM_GROUP +CUPS_SYSTEM_GROUPS +CUPS_GROUP +CUPS_USER +CUPS_USE_NETWORK_DEFAULT +CUPS_IMPLICIT_CLASSES +CUPS_DEFAULT_SHARED +CUPS_BROWSE_SHORT_NAMES +CUPS_BROWSE_REMOTE_PROTOCOLS +CUPS_BROWSE_LOCAL_PROTOCOLS +CUPS_BROWSING +CUPS_ACCESS_LOG_LEVEL +CUPS_LOG_LEVEL +CUPS_FATAL_ERRORS +CUPS_LOG_FILE_PERM +CUPS_CONFIG_FILE_PERM +CUPS_BUNDLEDIR +LANGUAGES +LAUNCHDLIBS +DEFAULT_LAUNCHD_CONF +DNSSD_BACKEND +DNSSDLIBS +LARGEFILE +PAMMODAUTH +PAMMOD +PAMLIBS +PAMFILE +PAMDIR +EXPORT_SSLLIBS +SSLLIBS +SSLFLAGS +IPPALIASES +LIBGCRYPTCONFIG +LIBGNUTLSCONFIG +PTHREAD_FLAGS +LIBLDAP +KRB5CONFIG +LIBGSSAPI +LIBSLP +CUPS_LISTEN_DOMAINSOCKET +CUPS_DEFAULT_DOMAINSOCKET +EXPORT_LIBZ +EXPORT_LIBTIFF +EXPORT_LIBPNG +EXPORT_LIBJPEG +INSTALL_GZIP +LIBZ +LIBTIFF +LIBPNG +LIBJPEG +IMGFILTERS +DEFAULT_IMAGEFILTERS +PHPOPTIONS +RELROFLAGS +PIEFLAGS +CXXLIBS +ARCH64FLAGS +ARCH32FLAGS +LDARCHFLAGS +ARCHFLAGS +UNITTESTS +OPTIM +INSTALL_STRIP +LIBTOOL +EXPORT_LDFLAGS +IMGLIBS +DSOLIBS +LINKCUPSIMAGE +LINKCUPS +EXTLINKCUPSIMAGE +EXTLINKCUPSDRIVER +EXTLINKCUPS +LIBCUPSSTATIC +LIBCUPSPPDC +LIBCUPSMIME +LIBCUPSIMAGE +LIBCUPSDRIVER +LIBCUPSCGI +LIBCUPSBASE +LIBCUPS +DSO64FLAGS +DSO32FLAGS +DSOFLAGS +DSOXX +DSO +UNINSTALL64 +LIB64DIR +LIB64CUPSIMAGE +LIB64CUPS +INSTALL64 +UNINSTALL32 +LIB32DIR +LIB32CUPSIMAGE +LIB32CUPS +INSTALL32 +MAN8DIR +MAN8EXT +MAN7EXT +MAN5EXT +MAN1EXT +PMANDIR +AMANDIR +CUPS_STATEDIR +CUPS_SERVERROOT +INSTALL_SYSV +CUPS_SERVERBIN +CUPS_REQUESTS +CUPS_LOGDIR +CUPS_LOCALEDIR +CUPS_FONTPATH +CUPS_DOCROOT +MENUDIR +ICONDIR +CUPS_DATADIR +CUPS_CACHEDIR +XINETD +SMFMANIFESTDIR +RCSTOP +RCSTART +RCLEVELS +INITDDIR +INITDIR +PRIVATEINCLUDE +privateinclude +BUILDDIRS +LEGACY_BACKENDS +INSTALLXPC +CUPS_SYSTEM_AUTHKEY +CUPS_DEFAULT_PRINTOPERATOR_AUTH +DBUS_NOTIFIERLIBS +DBUS_NOTIFIER +DBUSDIR +SERVERLIBS +BACKLIBS +ARFLAGS +LIBWRAP +LIBUSB +EGREP +GREP +LIBPAPER +LIBMALLOC +PKGCONFIG +INSTALLSTATIC +INSTALL +CUPS_HTMLVIEW +XDGOPEN +SED +RMDIR +RM +MV +LN +LD +HTMLDOC +GZIP +CHMOD +AR +RANLIB +ac_ct_CXX +CXXFLAGS +CXX +CPP +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AWK +CUPS_BUILD +CUPS_REVISION +CUPS_VERSION +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_cups_build +enable_static +enable_mallinfo +enable_libpaper +enable_libusb +enable_tcp_wrappers +enable_acl +enable_dbus +with_dbusdir +with_adminkey +with_operkey +with_components +with_privateinclude +with_rcdir +with_rclevels +with_rcstart +with_rcstop +with_smfmanifestdir +with_xinetd +with_lpdconfig +with_smbconfig +with_cachedir +with_icondir +with_menudir +with_docdir +with_fontpath +with_logdir +enable_32bit +enable_64bit +enable_shared +enable_libtool_unsupported +with_optim +enable_debug +enable_debug_guards +enable_debug_printfs +enable_unit_tests +with_archflags +with_ldarchflags +with_arch32flags +with_arch64flags +enable_relro +enable_image +enable_jpeg +enable_png +enable_tiff +with_domainsocket +enable_slp +with_openslp_libs +with_openslp_includes +enable_gssapi +with_gssservicename +enable_ldap +with_ldap_libs +with_ldap_includes +enable_threads +enable_ssl +enable_cdsassl +enable_gnutls +enable_openssl +with_openssl_libs +with_openssl_includes +enable_pam +with_pam_module +enable_largefile +enable_dnssd +with_dnssd_libs +with_dnssd_includes +enable_avahi +enable_launchd +with_languages +with_bundledir +with_config_file_perm +with_log_file_perm +with_fatal_errors +with_log_level +with_access_log_level +enable_browsing +with_local_protocols +with_remote_protocols +enable_browse_short +enable_default_shared +enable_implicit +enable_use_network_default +with_cups_user +with_cups_group +with_system_groups +with_printcap +with_lpdconfigfile +with_smbconfigfile +with_max_copies +enable_raw_printing +with_snmp_address +with_snmp_community +with_ipp_port +enable_bannertops +enable_texttops +enable_webif +with_pdftops +with_java +with_perl +with_php +with_python +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used" >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-static install static libraries + --enable-mallinfo build with malloc debug logging + --enable-libpaper build with libpaper support + --enable-libusb use libusb for USB printing + --enable-tcp-wrappers use libwrap for TCP wrappers support + --enable-acl build with POSIX ACL support + --enable-dbus build with DBUS support + --enable-32bit generate 32-bit libraries on 32/64-bit systems + --enable-64bit generate 64-bit libraries on 32/64-bit systems + --disable-shared do not create shared libraries + --enable-libtool-unsupported + build with libtool (UNSUPPORTED!) + --enable-debug build with debugging symbols + --enable-debug-guards build with memory allocation guards + --enable-debug-printfs build with CUPS_DEBUG_LOG support + --enable-unit-tests build and run unit tests + --enable-relro build with the GCC relro option + --enable-image always build the image filters + --disable-jpeg disable JPEG support + --disable-png disable PNG support + --disable-tiff disable TIFF support + --disable-slp disable SLP support + --disable-gssapi disable GSSAPI support + --disable-ldap disable LDAP support + --disable-threads disable multi-threading support + --disable-ssl disable SSL/TLS support + --enable-cdsassl use CDSA for SSL/TLS support, default=first + --enable-gnutls use GNU TLS for SSL/TLS support, default=second + --enable-openssl use OpenSSL for SSL/TLS support, default=third + --disable-pam disable PAM support + --disable-largefile omit support for large files + --disable-dnssd disable DNS Service Discovery support + --enable-avahi turn on DNS Service Discovery support, default=no + --disable-launchd disable launchd support + --disable-browsing disable Browsing by default + --disable-browse-short-names + disable BrowseShortNames by default + --disable-default-shared + disable DefaultShared by default + --disable-implicit-classes + disable ImplicitClasses by default + --enable-use-network-default + set UseNetworkDefault to Yes by default + --disable-raw-printing do not allow raw printing by default + --enable-bannertops always build the banner filter + --enable-texttops always build the text filter + --enable-webif enable the web interface by default, default=no for Mac OS X + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-cups-build set "cups-config --build" string + --with-dbusdir set DBUS configuration directory + --with-adminkey set the default SystemAuthKey value + --with-operkey set the default operator @AUTHKEY value + --with-components set components to build: + - "all" (default) builds everything + - "core" builds libcups and ipptool + --with-privateinclude set path for private include files, default=none + --with-rcdir set path for rc scripts + --with-rclevels set run levels for rc scripts + --with-rcstart set start number for rc scripts + --with-rcstop set stop number for rc scripts + --with-smfmanifestdir set path for Solaris SMF manifest + --with-xinetd set path for xinetd config files + --with-lpdconfig set URI for LPD config file + --with-smbconfig set URI for Samba config file + --with-cachedir set path for cache files + --with-icondir set path for application icons + --with-menudir set path for application menus + --with-docdir set path for documentation + --with-fontpath set font path for pstoraster + --with-logdir set path for log files + --with-optim set optimization flags + --with-archflags set default architecture flags + --with-ldarchflags set program architecture flags + --with-arch32flags set 32-bit architecture flags + --with-arch64flags set 64-bit architecture flags + --with-domainsocket set unix domain socket name + --with-openslp-libs set directory for OpenSLP library + --with-openslp-includes set directory for OpenSLP includes + --with-gssservicename set default gss service name + --with-ldap-libs set directory for LDAP library + --with-ldap-includes set directory for LDAP includes + --with-openssl-libs set directory for OpenSSL library + --with-openssl-includes set directory for OpenSSL includes + --with-pam-module specify the PAM module to use + --with-dnssd-libs set directory for DNS Service Discovery library + --with-dnssd-includes set directory for DNS Service Discovery includes + --with-languages set installed languages, default=all + --with-bundledir set Mac OS X localization bundle directory + --with-config-file-perm set default ConfigFilePerm value, default=0640 + --with-log-file-perm set default LogFilePerm value, default=0644 + --with-fatal-errors set default FatalErrors value, default=config + --with-log-level set default LogLevel value, default=warn + --with-access-log-level set default AccessLogLevel value, default=actions + --with-local-protocols set default BrowseLocalProtocols, default="CUPS" + --with-remote-protocols set default BrowseRemoteProtocols, default="CUPS" + --with-cups-user set default user for CUPS + --with-cups-group set default group for CUPS + --with-system-groups set default system groups for CUPS + --with-printcap set default printcap file + --with-lpdconfigfile set default LPDConfigFile URI + --with-smbconfigfile set default SMBConfigFile URI + --with-max-copies set default max copies value, default=9999 + --with-snmp-address set SNMP query address, default=auto + --with-snmp-community set SNMP community, default=public + --with-ipp-port set port number for IPP, default=631 + --with-pdftops set pdftops filter (gs,/path/to/gs,pdftops,/path/to/pdftops,none), default=pdftops + --with-java set Java interpreter for web interfaces + --with-perl set Perl interpreter for web interfaces + --with-php set PHP interpreter for web interfaces + --with-python set Python interpreter for web interfaces + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.67 + +Copyright (C) 2010 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval "test \"\${$3+set}\"" = set; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval "test \"\${$3+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func + +# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES +# ---------------------------------------------------- +# Tries to find if the field MEMBER exists in type AGGR, after including +# INCLUDES, setting cache variable VAR accordingly. +ac_fn_c_check_member () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 +$as_echo_n "checking for $2.$3... " >&6; } +if eval "test \"\${$4+set}\"" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$5 +int +main () +{ +static $2 ac_aggr; +if (sizeof ac_aggr.$3) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$4=yes" +else + eval "$4=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$4 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_member +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.67. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5 ; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + +uname=`uname` +uversion=`uname -r | sed -e '1,$s/^[^0-9]*\([0-9]*\)\.\([0-9]*\).*/\1\2/'` +uarch=`uname -m` + +case "$uname" in + GNU* | GNU/*) + uname="GNU" + ;; + IRIX*) + uname="IRIX" + ;; + Linux*) + uname="Linux" + ;; +esac + + + + + +ac_config_headers="$ac_config_headers config.h" + + +CUPS_VERSION=1.5.3 +CUPS_REVISION= +#if test -z "$CUPS_REVISION" -a -d .svn; then +# CUPS_REVISION="-r`svnversion . | awk -F: '{print $NF}' | sed -e '1,$s/[[a-zA-Z]]*//g'`" +#fi +CUPS_BUILD="cups-$CUPS_VERSION" + + +# Check whether --with-cups_build was given. +if test "${with_cups_build+set}" = set; then : + withval=$with_cups_build; CUPS_BUILD="$withval" +fi + + + + + +cat >>confdefs.h <<_ACEOF +#define CUPS_SVERSION "CUPS v$CUPS_VERSION$CUPS_REVISION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define CUPS_MINIMAL "CUPS/$CUPS_VERSION$CUPS_REVISION" +_ACEOF + + +CFLAGS="${CFLAGS:=}" +CPPFLAGS="${CPPFLAGS:=}" +CXXFLAGS="${CXXFLAGS:=}" +LDFLAGS="${LDFLAGS:=}" + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5 ; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5 ; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5 ; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5 ; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5 ; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +AR=$ac_cv_path_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "chmod", so it can be a program name with args. +set dummy chmod; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHMOD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHMOD in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHMOD="$CHMOD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHMOD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHMOD=$ac_cv_path_CHMOD +if test -n "$CHMOD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHMOD" >&5 +$as_echo "$CHMOD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "gzip", so it can be a program name with args. +set dummy gzip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GZIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_GZIP="$GZIP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GZIP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GZIP=$ac_cv_path_GZIP +if test -n "$GZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GZIP" >&5 +$as_echo "$GZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "htmldoc", so it can be a program name with args. +set dummy htmldoc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_HTMLDOC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $HTMLDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_HTMLDOC="$HTMLDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_HTMLDOC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +HTMLDOC=$ac_cv_path_HTMLDOC +if test -n "$HTMLDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HTMLDOC" >&5 +$as_echo "$HTMLDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "ld", so it can be a program name with args. +set dummy ld; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LD in + [\\/]* | ?:[\\/]*) + ac_cv_path_LD="$LD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LD=$ac_cv_path_LD +if test -n "$LD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "ln", so it can be a program name with args. +set dummy ln; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LN in + [\\/]* | ?:[\\/]*) + ac_cv_path_LN="$LN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LN=$ac_cv_path_LN +if test -n "$LN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LN" >&5 +$as_echo "$LN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "mv", so it can be a program name with args. +set dummy mv; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MV+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $MV in + [\\/]* | ?:[\\/]*) + ac_cv_path_MV="$MV" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_MV="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MV=$ac_cv_path_MV +if test -n "$MV"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MV" >&5 +$as_echo "$MV" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_RM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $RM in + [\\/]* | ?:[\\/]*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +RM=$ac_cv_path_RM +if test -n "$RM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 +$as_echo "$RM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "rmdir", so it can be a program name with args. +set dummy rmdir; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_RMDIR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $RMDIR in + [\\/]* | ?:[\\/]*) + ac_cv_path_RMDIR="$RMDIR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RMDIR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +RMDIR=$ac_cv_path_RMDIR +if test -n "$RMDIR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RMDIR" >&5 +$as_echo "$RMDIR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "sed", so it can be a program name with args. +set dummy sed; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_SED+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $SED in + [\\/]* | ?:[\\/]*) + ac_cv_path_SED="$SED" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_SED="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SED=$ac_cv_path_SED +if test -n "$SED"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SED" >&5 +$as_echo "$SED" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "xdg-open", so it can be a program name with args. +set dummy xdg-open; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XDGOPEN+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $XDGOPEN in + [\\/]* | ?:[\\/]*) + ac_cv_path_XDGOPEN="$XDGOPEN" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_XDGOPEN="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XDGOPEN=$ac_cv_path_XDGOPEN +if test -n "$XDGOPEN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XDGOPEN" >&5 +$as_echo "$XDGOPEN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$XDGOPEN" = x; then + CUPS_HTMLVIEW="htmlview" +else + CUPS_HTMLVIEW="$XDGOPEN" +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for install-sh script" >&5 +$as_echo_n "checking for install-sh script... " >&6; } +INSTALL="`pwd`/install-sh" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: using $INSTALL" >&5 +$as_echo "using $INSTALL" >&6; } + +if test "x$AR" = x; then + as_fn_error $? "Unable to find required library archive command." "$LINENO" 5 +fi +if test "x$CC" = x; then + as_fn_error $? "Unable to find required C compiler command." "$LINENO" 5 +fi + +INSTALLSTATIC="" +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; +fi + + +if test x$enable_static = xyes; then + echo Installing static libraries... + INSTALLSTATIC="installstatic" +fi + + + +# Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PKGCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PKGCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKGCONFIG="$PKGCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKGCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKGCONFIG=$ac_cv_path_PKGCONFIG +if test -n "$PKGCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGCONFIG" >&5 +$as_echo "$PKGCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing fmod" >&5 +$as_echo_n "checking for library containing fmod... " >&6; } +if test "${ac_cv_search_fmod+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char fmod (); +int +main () +{ +return fmod (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_fmod=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_fmod+set}" = set; then : + break +fi +done +if test "${ac_cv_search_fmod+set}" = set; then : + +else + ac_cv_search_fmod=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_fmod" >&5 +$as_echo "$ac_cv_search_fmod" >&6; } +ac_res=$ac_cv_search_fmod +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 +$as_echo_n "checking for library containing crypt... " >&6; } +if test "${ac_cv_search_crypt+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char crypt (); +int +main () +{ +return crypt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' crypt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_crypt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_crypt+set}" = set; then : + break +fi +done +if test "${ac_cv_search_crypt+set}" = set; then : + +else + ac_cv_search_crypt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 +$as_echo "$ac_cv_search_crypt" >&6; } +ac_res=$ac_cv_search_crypt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getspent" >&5 +$as_echo_n "checking for library containing getspent... " >&6; } +if test "${ac_cv_search_getspent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getspent (); +int +main () +{ +return getspent (); + ; + return 0; +} +_ACEOF +for ac_lib in '' sec gen; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getspent=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_getspent+set}" = set; then : + break +fi +done +if test "${ac_cv_search_getspent+set}" = set; then : + +else + ac_cv_search_getspent=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getspent" >&5 +$as_echo "$ac_cv_search_getspent" >&6; } +ac_res=$ac_cv_search_getspent +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +LIBMALLOC="" +# Check whether --enable-mallinfo was given. +if test "${enable_mallinfo+set}" = set; then : + enableval=$enable_mallinfo; +fi + + +if test x$enable_mallinfo = xyes; then + SAVELIBS="$LIBS" + LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing mallinfo" >&5 +$as_echo_n "checking for library containing mallinfo... " >&6; } +if test "${ac_cv_search_mallinfo+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char mallinfo (); +int +main () +{ +return mallinfo (); + ; + return 0; +} +_ACEOF +for ac_lib in '' malloc; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_mallinfo=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_mallinfo+set}" = set; then : + break +fi +done +if test "${ac_cv_search_mallinfo+set}" = set; then : + +else + ac_cv_search_mallinfo=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_mallinfo" >&5 +$as_echo "$ac_cv_search_mallinfo" >&6; } +ac_res=$ac_cv_search_mallinfo +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_MALLINFO 1" >>confdefs.h + +fi + + LIBMALLOC="$LIBS" + LIBS="$SAVELIBS" +fi + + + +# Check whether --enable-libpaper was given. +if test "${enable_libpaper+set}" = set; then : + enableval=$enable_libpaper; +fi + + +if test x$enable_libpaper = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for systempapername in -lpaper" >&5 +$as_echo_n "checking for systempapername in -lpaper... " >&6; } +if test "${ac_cv_lib_paper_systempapername+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpaper $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char systempapername (); +int +main () +{ +return systempapername (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_paper_systempapername=yes +else + ac_cv_lib_paper_systempapername=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_paper_systempapername" >&5 +$as_echo "$ac_cv_lib_paper_systempapername" >&6; } +if test "x$ac_cv_lib_paper_systempapername" = x""yes; then : + $as_echo "#define HAVE_LIBPAPER 1" >>confdefs.h + + LIBPAPER="-lpaper" +else + LIBPAPER="" +fi + +else + LIBPAPER="" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +ac_fn_c_check_header_mongrel "$LINENO" "crypt.h" "ac_cv_header_crypt_h" "$ac_includes_default" +if test "x$ac_cv_header_crypt_h" = x""yes; then : + $as_echo "#define HAVE_CRYPT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "langinfo.h" "ac_cv_header_langinfo_h" "$ac_includes_default" +if test "x$ac_cv_header_langinfo_h" = x""yes; then : + $as_echo "#define HAVE_LANGINFO_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default" +if test "x$ac_cv_header_malloc_h" = x""yes; then : + $as_echo "#define HAVE_MALLOC_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "shadow.h" "ac_cv_header_shadow_h" "$ac_includes_default" +if test "x$ac_cv_header_shadow_h" = x""yes; then : + $as_echo "#define HAVE_SHADOW_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" +if test "x$ac_cv_header_string_h" = x""yes; then : + $as_echo "#define HAVE_STRING_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = x""yes; then : + $as_echo "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "bstring.h" "ac_cv_header_bstring_h" "$ac_includes_default" +if test "x$ac_cv_header_bstring_h" = x""yes; then : + $as_echo "#define HAVE_BSTRING_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "usersec.h" "ac_cv_header_usersec_h" "$ac_includes_default" +if test "x$ac_cv_header_usersec_h" = x""yes; then : + $as_echo "#define HAVE_USERSEC_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/ioctl.h" "ac_cv_header_sys_ioctl_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ioctl_h" = x""yes; then : + $as_echo "#define HAVE_SYS_IOCTL_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_param_h" = x""yes; then : + $as_echo "#define HAVE_SYS_PARAM_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/ucred.h" "ac_cv_header_sys_ucred_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_ucred_h" = x""yes; then : + $as_echo "#define HAVE_SYS_UCRED_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "scsi/sg.h" "ac_cv_header_scsi_sg_h" "$ac_includes_default" +if test "x$ac_cv_header_scsi_sg_h" = x""yes; then : + $as_echo "#define HAVE_SCSI_SG_H 1" >>confdefs.h + +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "iconv.h" "ac_cv_header_iconv_h" "$ac_includes_default" +if test "x$ac_cv_header_iconv_h" = x""yes; then : + SAVELIBS="$LIBS" + LIBS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing iconv_open" >&5 +$as_echo_n "checking for library containing iconv_open... " >&6; } +if test "${ac_cv_search_iconv_open+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char iconv_open (); +int +main () +{ +return iconv_open (); + ; + return 0; +} +_ACEOF +for ac_lib in '' iconv; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_iconv_open=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_iconv_open+set}" = set; then : + break +fi +done +if test "${ac_cv_search_iconv_open+set}" = set; then : + +else + ac_cv_search_iconv_open=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_iconv_open" >&5 +$as_echo "$ac_cv_search_iconv_open" >&6; } +ac_res=$ac_cv_search_iconv_open +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_ICONV_H 1" >>confdefs.h + + SAVELIBS="$SAVELIBS $LIBS" +fi + + LIBS="$SAVELIBS" +fi + + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/mount.h" "ac_cv_header_sys_mount_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_mount_h" = x""yes; then : + $as_echo "#define HAVE_SYS_MOUNT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/statfs.h" "ac_cv_header_sys_statfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_statfs_h" = x""yes; then : + $as_echo "#define HAVE_SYS_STATFS_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/statvfs.h" "ac_cv_header_sys_statvfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_statvfs_h" = x""yes; then : + $as_echo "#define HAVE_SYS_STATVFS_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/vfs.h" "ac_cv_header_sys_vfs_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_vfs_h" = x""yes; then : + $as_echo "#define HAVE_SYS_VFS_H 1" >>confdefs.h + +fi + + +for ac_func in statfs statvfs +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in strdup strlcat strlcpy +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "$uname" = "HP-UX" -a "$uversion" = "1020"; then + echo Forcing snprintf emulation for HP-UX. +else + for ac_func in snprintf vsnprintf +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +fi + +for ac_func in random lrand48 arc4random +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in geteuid +do : + ac_fn_c_check_func "$LINENO" "geteuid" "ac_cv_func_geteuid" +if test "x$ac_cv_func_geteuid" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETEUID 1 +_ACEOF + +fi +done + + +for ac_func in setpgid +do : + ac_fn_c_check_func "$LINENO" "setpgid" "ac_cv_func_setpgid" +if test "x$ac_cv_func_setpgid" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETPGID 1 +_ACEOF + +fi +done + + +for ac_func in vsyslog +do : + ac_fn_c_check_func "$LINENO" "vsyslog" "ac_cv_func_vsyslog" +if test "x$ac_cv_func_vsyslog" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VSYSLOG 1 +_ACEOF + +fi +done + + +case "$uname" in + Linux | GNU) + # Do not use sigset on Linux or GNU HURD + ;; + *) + # Use sigset on other platforms, if available + for ac_func in sigset +do : + ac_fn_c_check_func "$LINENO" "sigset" "ac_cv_func_sigset" +if test "x$ac_cv_func_sigset" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SIGSET 1 +_ACEOF + +fi +done + + ;; +esac + +for ac_func in sigaction +do : + ac_fn_c_check_func "$LINENO" "sigaction" "ac_cv_func_sigaction" +if test "x$ac_cv_func_sigaction" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SIGACTION 1 +_ACEOF + +fi +done + + +for ac_func in waitpid wait3 +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for tm_gmtoff member in tm structure" >&5 +$as_echo_n "checking for tm_gmtoff member in tm structure... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +struct tm t; + int o = t.tm_gmtoff; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_TM_GMTOFF 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for st_gen member in stat structure" >&5 +$as_echo_n "checking for st_gen member in stat structure... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +struct stat t; + int o = t.st_gen; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_ST_GEN 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +for ac_func in removefile +do : + ac_fn_c_check_func "$LINENO" "removefile" "ac_cv_func_removefile" +if test "x$ac_cv_func_removefile" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_REMOVEFILE 1 +_ACEOF + +fi +done + + +# Check whether --enable-libusb was given. +if test "${enable_libusb+set}" = set; then : + enableval=$enable_libusb; +fi + + +LIBUSB="" + + +if test "x$PKGCONFIG" != x; then + if test x$enable_libusb = xyes -o $uname != Darwin; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libusb-1.0" >&5 +$as_echo_n "checking for libusb-1.0... " >&6; } + if $PKGCONFIG --exists libusb-1.0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_LIBUSB 1" >>confdefs.h + + CFLAGS="$CFLAGS `$PKGCONFIG --cflags libusb-1.0`" + LIBUSB="`$PKGCONFIG --libs libusb-1.0`" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + fi +elif test x$enable_libusb = xyes; then + as_fn_error $? "Need pkg-config to enable libusb support." "$LINENO" 5 +fi + +# Check whether --enable-tcp_wrappers was given. +if test "${enable_tcp_wrappers+set}" = set; then : + enableval=$enable_tcp_wrappers; +fi + + +LIBWRAP="" + + +if test x$enable_tcp_wrappers = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for hosts_access in -lwrap" >&5 +$as_echo_n "checking for hosts_access in -lwrap... " >&6; } +if test "${ac_cv_lib_wrap_hosts_access+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lwrap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char hosts_access (); +int +main () +{ +return hosts_access (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_wrap_hosts_access=yes +else + ac_cv_lib_wrap_hosts_access=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_wrap_hosts_access" >&5 +$as_echo "$ac_cv_lib_wrap_hosts_access" >&6; } +if test "x$ac_cv_lib_wrap_hosts_access" = x""yes; then : + + ac_fn_c_check_header_mongrel "$LINENO" "tcpd.h" "ac_cv_header_tcpd_h" "$ac_includes_default" +if test "x$ac_cv_header_tcpd_h" = x""yes; then : + $as_echo "#define HAVE_TCPD_H 1" >>confdefs.h + + LIBWRAP="-lwrap" +fi + + +fi + +fi + +case $uname in + Darwin* | *BSD*) + ARFLAGS="-rcv" + ;; + *) + ARFLAGS="crvs" + ;; +esac + + + +BACKLIBS="" +SERVERLIBS="" + + + +SAVELIBS="$LIBS" +LIBS="" +# Check whether --enable-acl was given. +if test "${enable_acl+set}" = set; then : + enableval=$enable_acl; +fi + +if test "x$enable_acl" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing acl_init" >&5 +$as_echo_n "checking for library containing acl_init... " >&6; } +if test "${ac_cv_search_acl_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char acl_init (); +int +main () +{ +return acl_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' acl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_acl_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_acl_init+set}" = set; then : + break +fi +done +if test "${ac_cv_search_acl_init+set}" = set; then : + +else + ac_cv_search_acl_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_acl_init" >&5 +$as_echo "$ac_cv_search_acl_init" >&6; } +ac_res=$ac_cv_search_acl_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_ACL_INIT 1" >>confdefs.h + +fi + + SERVERLIBS="$SERVERLIBS $LIBS" +fi +LIBS="$SAVELIBS" + +if test -d /etc/dbus-1; then + DBUSDIR="/etc/dbus-1" +else + DBUSDIR="" +fi + +# Check whether --enable-dbus was given. +if test "${enable_dbus+set}" = set; then : + enableval=$enable_dbus; +fi + + +# Check whether --with-dbusdir was given. +if test "${with_dbusdir+set}" = set; then : + withval=$with_dbusdir; DBUSDIR="$withval" +fi + + +DBUS_NOTIFIER="" +DBUS_NOTIFIERLIBS="" + +if test "x$enable_dbus" != xno -a "x$PKGCONFIG" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 +$as_echo_n "checking for DBUS... " >&6; } + if $PKGCONFIG --exists dbus-1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_DBUS 1" >>confdefs.h + + CFLAGS="$CFLAGS `$PKGCONFIG --cflags dbus-1` -DDBUS_API_SUBJECT_TO_CHANGE" + SERVERLIBS="$SERVERLIBS `$PKGCONFIG --libs dbus-1`" + DBUS_NOTIFIER="dbus" + DBUS_NOTIFIERLIBS="`$PKGCONFIG --libs dbus-1`" + SAVELIBS="$LIBS" + LIBS="$LIBS $DBUS_NOTIFIERLIBS" + ac_fn_c_check_func "$LINENO" "dbus_message_iter_init_append" "ac_cv_func_dbus_message_iter_init_append" +if test "x$ac_cv_func_dbus_message_iter_init_append" = x""yes; then : + $as_echo "#define HAVE_DBUS_MESSAGE_ITER_INIT_APPEND 1" >>confdefs.h + +fi + + LIBS="$SAVELIBS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + + + + + +CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" +CUPS_SYSTEM_AUTHKEY="" +INSTALLXPC="" +LEGACY_BACKENDS="parallel" + +case $uname in + Darwin*) + LEGACY_BACKENDS="" + BACKLIBS="$BACKLIBS -framework IOKit" + SERVERLIBS="$SERVERLIBS -framework IOKit -weak_framework ApplicationServices" + LIBS="-framework SystemConfiguration -framework CoreFoundation -framework Security $LIBS" + + ac_fn_c_check_header_mongrel "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" +if test "x$ac_cv_header_ApplicationServices_ApplicationServices_h" = x""yes; then : + $as_echo "#define HAVE_APPLICATIONSERVICES_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "CoreFoundation/CoreFoundation.h" "ac_cv_header_CoreFoundation_CoreFoundation_h" "$ac_includes_default" +if test "x$ac_cv_header_CoreFoundation_CoreFoundation_h" = x""yes; then : + $as_echo "#define HAVE_COREFOUNDATION_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "CoreFoundation/CFPriv.h" "ac_cv_header_CoreFoundation_CFPriv_h" "$ac_includes_default" +if test "x$ac_cv_header_CoreFoundation_CFPriv_h" = x""yes; then : + $as_echo "#define HAVE_CFPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "CoreFoundation/CFBundlePriv.h" "ac_cv_header_CoreFoundation_CFBundlePriv_h" "$ac_includes_default" +if test "x$ac_cv_header_CoreFoundation_CFBundlePriv_h" = x""yes; then : + $as_echo "#define HAVE_CFBUNDLEPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "IOKit/pwr_mgt/IOPMLibPrivate.h" "ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" "$ac_includes_default" +if test "x$ac_cv_header_IOKit_pwr_mgt_IOPMLibPrivate_h" = x""yes; then : + $as_echo "#define HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H 1" >>confdefs.h + +fi + + + + for ac_func in SCDynamicStoreCopyComputerName +do : + ac_fn_c_check_func "$LINENO" "SCDynamicStoreCopyComputerName" "ac_cv_func_SCDynamicStoreCopyComputerName" +if test "x$ac_cv_func_SCDynamicStoreCopyComputerName" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1 +_ACEOF + +fi +done + + + SAVELIBS="$LIBS" + LIBS="$LIBS -framework ApplicationServices" + for ac_func in ColorSyncRegisterDevice +do : + ac_fn_c_check_func "$LINENO" "ColorSyncRegisterDevice" "ac_cv_func_ColorSyncRegisterDevice" +if test "x$ac_cv_func_ColorSyncRegisterDevice" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_COLORSYNCREGISTERDEVICE 1 +_ACEOF + +fi +done + + LIBS="$SAVELIBS" + + ac_fn_c_check_header_mongrel "$LINENO" "membership.h" "ac_cv_header_membership_h" "$ac_includes_default" +if test "x$ac_cv_header_membership_h" = x""yes; then : + $as_echo "#define HAVE_MEMBERSHIP_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "membershipPriv.h" "ac_cv_header_membershipPriv_h" "$ac_includes_default" +if test "x$ac_cv_header_membershipPriv_h" = x""yes; then : + $as_echo "#define HAVE_MEMBERSHIPPRIV_H 1" >>confdefs.h + +fi + + + for ac_func in mbr_uid_to_uuid +do : + ac_fn_c_check_func "$LINENO" "mbr_uid_to_uuid" "ac_cv_func_mbr_uid_to_uuid" +if test "x$ac_cv_func_mbr_uid_to_uuid" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_MBR_UID_TO_UUID 1 +_ACEOF + +fi +done + + + for ac_func in vproc_transaction_begin +do : + ac_fn_c_check_func "$LINENO" "vproc_transaction_begin" "ac_cv_func_vproc_transaction_begin" +if test "x$ac_cv_func_vproc_transaction_begin" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_VPROC_TRANSACTION_BEGIN 1 +_ACEOF + +fi +done + + + ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : + $as_echo "#define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + + ac_fn_c_check_header_mongrel "$LINENO" "notify.h" "ac_cv_header_notify_h" "$ac_includes_default" +if test "x$ac_cv_header_notify_h" = x""yes; then : + $as_echo "#define HAVE_NOTIFY_H 1" >>confdefs.h + +fi + + + for ac_func in notify_post +do : + ac_fn_c_check_func "$LINENO" "notify_post" "ac_cv_func_notify_post" +if test "x$ac_cv_func_notify_post" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_NOTIFY_POST 1 +_ACEOF + +fi +done + + + +# Check whether --with-adminkey was given. +if test "${with_adminkey+set}" = set; then : + withval=$with_adminkey; default_adminkey="$withval" +else + default_adminkey="default" +fi + + +# Check whether --with-operkey was given. +if test "${with_operkey+set}" = set; then : + withval=$with_operkey; default_operkey="$withval" +else + default_operkey="default" +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/Authorization.h" "ac_cv_header_Security_Authorization_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_Authorization_h" = x""yes; then : + + $as_echo "#define HAVE_AUTHORIZATION_H 1" >>confdefs.h + + + if test "x$default_adminkey" != xdefault; then + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey $default_adminkey" + elif grep -q system.print.operator /etc/authorization; then + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.print.admin" + else + CUPS_SYSTEM_AUTHKEY="SystemGroupAuthKey system.preferences" + fi + + if test "x$default_operkey" != xdefault; then + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" + elif grep -q system.print.operator /etc/authorization; then + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" + else + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin" + fi +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecBasePriv.h" "ac_cv_header_Security_SecBasePriv_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecBasePriv_h" = x""yes; then : + $as_echo "#define HAVE_SECBASEPRIV_H 1" >>confdefs.h + +fi + + + + if test $uversion -ge 100; then + ac_fn_c_check_header_mongrel "$LINENO" "sandbox.h" "ac_cv_header_sandbox_h" "$ac_includes_default" +if test "x$ac_cv_header_sandbox_h" = x""yes; then : + $as_echo "#define HAVE_SANDBOX_H 1" >>confdefs.h + +fi + + + fi + if test $uversion -ge 110; then + # Broken public headers in 10.7... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sandbox/private.h presence" >&5 +$as_echo_n "checking for sandbox/private.h presence... " >&6; } + if test -f /usr/local/include/sandbox/private.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "Run 'sudo mkdir -p /usr/local/include/sandbox' and 'sudo touch /usr/local/include/sandbox/private.h' to build CUPS." "$LINENO" 5 + fi + fi + + ac_fn_c_check_header_mongrel "$LINENO" "xpc/xpc.h" "ac_cv_header_xpc_xpc_h" "$ac_includes_default" +if test "x$ac_cv_header_xpc_xpc_h" = x""yes; then : + $as_echo "#define HAVE_XPC 1" >>confdefs.h + + INSTALLXPC="install-xpc" +fi + + + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "$CUPS_DEFAULT_PRINTOPERATOR_AUTH" +_ACEOF + + + + + +COMPONENTS="all" + + +# Check whether --with-components was given. +if test "${with_components+set}" = set; then : + withval=$with_components; COMPONENTS="$withval" +fi + + +case "$COMPONENTS" in + all) + BUILDDIRS="filter backend berkeley cgi-bin driver monitor notifier ppdc scheduler systemv conf data desktop locale man doc examples templates" + ;; + + core) + BUILDDIRS="data locale" + ;; + + *) + as_fn_error $? "Bad build component \"$COMPONENT\" specified!" "$LINENO" 5 + ;; +esac + + + + + + + +if test "$prefix" = "NONE"; then + prefix="/" +fi + +if test "$exec_prefix" = "NONE"; then + if test "$prefix" = "/"; then + exec_prefix="/usr" + else + exec_prefix="$prefix" + fi +fi + +if test "$bindir" = "\${exec_prefix}/bin"; then + bindir="$exec_prefix/bin" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_BINDIR "$bindir" +_ACEOF + + +if test "$sbindir" = "\${exec_prefix}/sbin"; then + sbindir="$exec_prefix/sbin" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_SBINDIR "$sbindir" +_ACEOF + + +if test "$sharedstatedir" = "\${prefix}/com" -a "$prefix" = "/"; then + sharedstatedir="/usr/com" +fi + +if test "$datarootdir" = "\${prefix}/share"; then + if test "$prefix" = "/"; then + datarootdir="/usr/share" + else + datarootdir="$prefix/share" + fi +fi + +if test "$datadir" = "\${prefix}/share"; then + if test "$prefix" = "/"; then + datadir="/usr/share" + else + datadir="$prefix/share" + fi +elif test "$datadir" = "\${datarootdir}"; then + datadir="$datarootdir" +fi + +if test "$includedir" = "\${prefix}/include" -a "$prefix" = "/"; then + includedir="/usr/include" +fi + +if test "$localstatedir" = "\${prefix}/var"; then + if test "$prefix" = "/"; then + if test "$uname" = Darwin; then + localstatedir="/private/var" + else + localstatedir="/var" + fi + else + localstatedir="$prefix/var" + fi +fi + +if test "$sysconfdir" = "\${prefix}/etc"; then + if test "$prefix" = "/"; then + if test "$uname" = Darwin; then + sysconfdir="/private/etc" + else + sysconfdir="/etc" + fi + else + sysconfdir="$prefix/etc" + fi +fi + +if test "$libdir" = "\${exec_prefix}/lib"; then + case "$uname" in + IRIX*) + libdir="$exec_prefix/lib32" + ;; + Linux*) + if test -d /usr/lib64; then + libdir="$exec_prefix/lib64" + fi + ;; + HP-UX*) + if test -d /usr/lib/hpux32; then + libdir="$exec_prefix/lib/hpux32" + fi + ;; + esac +fi + + +# Check whether --with-privateinclude was given. +if test "${with_privateinclude+set}" = set; then : + withval=$with_privateinclude; privateinclude="$withval" +else + privateinclude="" +fi + +if test "x$privateinclude" != x -a "x$privateinclude" != xnone; then + PRIVATEINCLUDE="$privateinclude/cups" +else + privateinclude="" + PRIVATEINCLUDE="" +fi + + + + +# Check whether --with-rcdir was given. +if test "${with_rcdir+set}" = set; then : + withval=$with_rcdir; rcdir="$withval" +else + rcdir="" +fi + + +# Check whether --with-rclevels was given. +if test "${with_rclevels+set}" = set; then : + withval=$with_rclevels; rclevels="$withval" +else + rclevels="2 3 5" +fi + + +# Check whether --with-rcstart was given. +if test "${with_rcstart+set}" = set; then : + withval=$with_rcstart; rcstart="$withval" +else + rcstart="99" +fi + + +# Check whether --with-rcstop was given. +if test "${with_rcstop+set}" = set; then : + withval=$with_rcstop; rcstop="$withval" +else + rcstop="00" +fi + + +# Check whether --with-smfmanifestdir was given. +if test "${with_smfmanifestdir+set}" = set; then : + withval=$with_smfmanifestdir; smfmanifestdir="$withval" +else + smfmanifestdir="" +fi + + +INITDIR="" +INITDDIR="" +RCLEVELS="$rclevels" +RCSTART="$rcstart" +RCSTOP="$rcstop" +SMFMANIFESTDIR="" + +if test x$rcdir = x; then + case "$uname" in + AIX*) + INITDIR="/etc/rc.d" + ;; + + Darwin*) + # Darwin and MacOS X... + if test -x /sbin/launchd; then + INITDDIR="/System/Library/LaunchDaemons" + else + INITDDIR="/System/Library/StartupItems/PrintingServices" + fi + ;; + + FreeBSD* | OpenBSD* | MirBSD* | ekkoBSD*) + # FreeBSD and OpenBSD + ;; + + HP-UX*) + INITDIR="/sbin" + RCLEVELS="2" + RCSTART="380" + RCSTOP="620" + ;; + + IRIX*) + # IRIX + INITDIR="/etc" + RCSTART="60" + RCSTOP="25" + ;; + + Linux | GNU | GNU/k*BSD*) + # Linux/HURD seems to choose an init.d directory at random... + if test -d /sbin/init.d; then + # SuSE + INITDIR="/sbin/init.d" + else + if test -d /etc/init.d; then + # Others + INITDIR="/etc" + else + # RedHat + INITDIR="/etc/rc.d" + fi + fi + RCSTART="81" + RCSTOP="36" + ;; + + NetBSD*) + # NetBSD + INITDDIR="/etc/rc.d" + ;; + + OSF1*) + INITDIR="/sbin" + ;; + + SunOS*) + # Solaris + if test "x$smfmanifestdir" != x; then + SMFMANIFESTDIR=$smfmanifestdir + else + INITDIR="/etc" + RCSTART="81" + fi + ;; + + *) + INITDIR="/etc" + ;; + + esac +elif test "x$rcdir" != xno; then + if test "x$rclevels" = x; then + INITDDIR="$rcdir" + else + INITDIR="$rcdir" + fi +fi + + + + + + + + + +# Check whether --with-xinetd was given. +if test "${with_xinetd+set}" = set; then : + withval=$with_xinetd; XINETD="$withval" +else + XINETD="" +fi + + +if test "x$XINETD" = x -a ! -x /sbin/launchd; then + for dir in /private/etc/xinetd.d /etc/xinetd.d /usr/local/etc/xinetd.d; do + if test -d $dir; then + XINETD="$dir" + break + fi + done +elif test "x$XINETD" = xno; then + XINETD="" +fi + + + + +# Check whether --with-lpdconfig was given. +if test "${with_lpdconfig+set}" = set; then : + withval=$with_lpdconfig; LPDCONFIG="$withval" +else + LPDCONFIG="" +fi + + +if test "x$LPDCONFIG" = x; then + if test -f /System/Library/LaunchDaemons/org.cups.cups-lpd.plist; then + LPDCONFIG="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" + elif test "x$XINETD" != x; then + LPDCONFIG="xinetd://$XINETD/cups-lpd" + fi +fi + +if test "x$LPDCONFIG" = xoff; then + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_LPD_CONFIG "" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_LPD_CONFIG "$LPDCONFIG" +_ACEOF + +fi + + +# Check whether --with-smbconfig was given. +if test "${with_smbconfig+set}" = set; then : + withval=$with_smbconfig; SMBCONFIG="$withval" +else + SMBCONFIG="" +fi + + +if test "x$SMBCONFIG" = x; then + if test -f /System/Library/LaunchDaemons/smbd.plist; then + SMBCONFIG="launchd:///System/Library/LaunchDaemons/smbd.plist" + else + for dir in /etc /etc/samba /usr/local/etc; do + if test -f $dir/smb.conf; then + SMBCONFIG="samba://$dir/smb.conf" + break + fi + done + fi +fi + +if test "x$SMBCONFIG" = xoff; then + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_SMB_CONFIG "" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_SMB_CONFIG "$SMBCONFIG" +_ACEOF + +fi + +# Cache data... + +# Check whether --with-cachedir was given. +if test "${with_cachedir+set}" = set; then : + withval=$with_cachedir; cachedir="$withval" +else + cachedir="" +fi + + +if test x$cachedir = x; then + if test "x$uname" = xDarwin; then + CUPS_CACHEDIR="$localstatedir/spool/cups/cache" + else + CUPS_CACHEDIR="$localstatedir/cache/cups" + fi +else + CUPS_CACHEDIR="$cachedir" +fi +cat >>confdefs.h <<_ACEOF +#define CUPS_CACHEDIR "$CUPS_CACHEDIR" +_ACEOF + + + +# Data files +CUPS_DATADIR="$datadir/cups" +cat >>confdefs.h <<_ACEOF +#define CUPS_DATADIR "$datadir/cups" +_ACEOF + + + +# Icon directory + +# Check whether --with-icondir was given. +if test "${with_icondir+set}" = set; then : + withval=$with_icondir; icondir="$withval" +else + icondir="" +fi + + +if test "x$icondir" = x -a -d /usr/share/icons; then + ICONDIR="/usr/share/icons" +else + ICONDIR="$icondir" +fi + + + +# Menu directory + +# Check whether --with-menudir was given. +if test "${with_menudir+set}" = set; then : + withval=$with_menudir; menudir="$withval" +else + menudir="" +fi + + +if test "x$menudir" = x -a -d /usr/share/applications; then + MENUDIR="/usr/share/applications" +else + MENUDIR="$menudir" +fi + + + +# Documentation files + +# Check whether --with-docdir was given. +if test "${with_docdir+set}" = set; then : + withval=$with_docdir; docdir="$withval" +else + docdir="" +fi + + +if test x$docdir = x; then + CUPS_DOCROOT="$datadir/doc/cups" + docdir="$datadir/doc/cups" +else + CUPS_DOCROOT="$docdir" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_DOCROOT "$docdir" +_ACEOF + + + +# Fonts + +# Check whether --with-fontpath was given. +if test "${with_fontpath+set}" = set; then : + withval=$with_fontpath; fontpath="$withval" +else + fontpath="" +fi + + +if test "x$fontpath" = "x"; then + CUPS_FONTPATH="$datadir/cups/fonts" +else + CUPS_FONTPATH="$fontpath" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_FONTPATH "$CUPS_FONTPATH" +_ACEOF + + +# Locale data +if test "$localedir" = "\${datarootdir}/locale"; then + case "$uname" in + Linux | GNU | *BSD* | Darwin*) + CUPS_LOCALEDIR="$datarootdir/locale" + ;; + + OSF1* | AIX*) + CUPS_LOCALEDIR="$exec_prefix/lib/nls/msg" + ;; + + *) + # This is the standard System V location... + CUPS_LOCALEDIR="$exec_prefix/lib/locale" + ;; + esac +else + CUPS_LOCALEDIR="$localedir" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_LOCALEDIR "$CUPS_LOCALEDIR" +_ACEOF + + + +# Log files... + +# Check whether --with-logdir was given. +if test "${with_logdir+set}" = set; then : + withval=$with_logdir; logdir="$withval" +else + logdir="" +fi + + +if test x$logdir = x; then + CUPS_LOGDIR="$localstatedir/log/cups" + cat >>confdefs.h <<_ACEOF +#define CUPS_LOGDIR "$localstatedir/log/cups" +_ACEOF + +else + CUPS_LOGDIR="$logdir" +fi +cat >>confdefs.h <<_ACEOF +#define CUPS_LOGDIR "$CUPS_LOGDIR" +_ACEOF + + + +# Longer-term spool data +CUPS_REQUESTS="$localstatedir/spool/cups" +cat >>confdefs.h <<_ACEOF +#define CUPS_REQUESTS "$localstatedir/spool/cups" +_ACEOF + + + +# Server executables... +case "$uname" in + *BSD* | Darwin*) + # *BSD and Darwin (MacOS X) + INSTALL_SYSV="" + CUPS_SERVERBIN="$exec_prefix/libexec/cups" + ;; + *) + # All others + INSTALL_SYSV="install-sysv" + CUPS_SERVERBIN="$exec_prefix/lib/cups" + ;; +esac + +cat >>confdefs.h <<_ACEOF +#define CUPS_SERVERBIN "$CUPS_SERVERBIN" +_ACEOF + + + + +# Configuration files +CUPS_SERVERROOT="$sysconfdir/cups" +cat >>confdefs.h <<_ACEOF +#define CUPS_SERVERROOT "$sysconfdir/cups" +_ACEOF + + + +# Transient run-time state +case "$uname" in + Darwin*) + # Darwin (Mac OS X) + CUPS_STATEDIR="$CUPS_SERVERROOT" + ;; + *) + # All others + CUPS_STATEDIR="$localstatedir/run/cups" + ;; +esac +cat >>confdefs.h <<_ACEOF +#define CUPS_STATEDIR "$CUPS_STATEDIR" +_ACEOF + + + + + +if test "$mandir" = "\${datarootdir}/man" -a "$prefix" = "/"; then + # New GNU "standards" break previous ones, so make sure we use + # the right default location for the operating system... + mandir="\${prefix}/man" +fi + +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/"; then + case "$uname" in + Darwin* | Linux | GNU | *BSD* | AIX*) + # Darwin, MacOS X, Linux, GNU HURD, *BSD, and AIX + mandir="/usr/share/man" + AMANDIR="/usr/share/man" + PMANDIR="/usr/share/man" + ;; + IRIX) + # SGI IRIX + mandir="/usr/share/catman/u_man" + AMANDIR="/usr/share/catman/a_man" + PMANDIR="/usr/share/catman/p_man" + ;; + *) + # All others + mandir="/usr/man" + AMANDIR="/usr/man" + PMANDIR="/usr/man" + ;; + esac +else + AMANDIR="$mandir" + PMANDIR="$mandir" +fi + + + + +case "$uname" in + IRIX*) + # SGI IRIX + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=1m + MAN8DIR=1 + ;; + SunOS* | HP-UX*) + # Solaris and HP-UX + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=1m + MAN8DIR=1m + ;; + Linux* | GNU* | Darwin*) + # Linux, GNU Hurd, and Mac OS X + MAN1EXT=1.gz + MAN5EXT=5.gz + MAN7EXT=7.gz + MAN8EXT=8.gz + MAN8DIR=8 + ;; + *) + # All others + MAN1EXT=1 + MAN5EXT=5 + MAN7EXT=7 + MAN8EXT=8 + MAN8DIR=8 + ;; +esac + + + + + + + + + + +# Check whether --enable-32bit was given. +if test "${enable_32bit+set}" = set; then : + enableval=$enable_32bit; +fi + + +INSTALL32="" +LIB32CUPS="" +LIB32CUPSIMAGE="" +LIB32DIR="" +UNINSTALL32="" + + + + + + + +# Check whether --enable-64bit was given. +if test "${enable_64bit+set}" = set; then : + enableval=$enable_64bit; +fi + + +INSTALL64="" +LIB64CUPS="" +LIB64CUPSIMAGE="" +LIB64DIR="" +UNINSTALL64="" + + + + + + + +case "$uname" in + HP-UX*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib" + if test -d /usr/lib/hpux32; then + LIB32DIR="${LIB32DIR}/hpux32" + fi + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib" + if test -d /usr/lib/hpux64; then + LIB64DIR="${LIB64DIR}/hpux64" + fi + UNINSTALL64="uninstall64bit" + fi + ;; + + IRIX) + if test "x$enable_32bit" = xyes; then + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$prefix/lib32" + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$prefix/lib64" + UNINSTALL64="uninstall64bit" + fi + ;; + + Linux*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib" + if test -d /usr/lib32; then + LIB32DIR="${LIB32DIR}32" + fi + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib" + if test -d /usr/lib64; then + LIB64DIR="${LIB64DIR}64" + fi + UNINSTALL64="uninstall64bit" + fi + ;; + + SunOS*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + INSTALL32="install32bit" + LIB32CUPS="32bit/libcups.so.2" + LIB32CUPSIMAGE="32bit/libcupsimage.so.2" + LIB32DIR="$exec_prefix/lib/32" + UNINSTALL32="uninstall32bit" + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + INSTALL64="install64bit" + LIB64CUPS="64bit/libcups.so.2" + LIB64CUPSIMAGE="64bit/libcupsimage.so.2" + LIB64DIR="$exec_prefix/lib/64" + UNINSTALL64="uninstall64bit" + fi + ;; +esac + + + +PICFLAG=1 +DSOFLAGS="${DSOFLAGS:=}" + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; +fi + + +cupsbase="cups" +LIBCUPSBASE="lib$cupsbase" +LIBCUPSSTATIC="lib$cupsbase.a" + +if test x$enable_shared != xno; then + case "$uname" in + SunOS*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h\`basename \$@\` -G \$(OPTIM)" + ;; + UNIX_S*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-h,\`basename \$@\` -G \$(OPTIM)" + ;; + HP-UX*) + case "$uarch" in + ia64) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-b,-z,+h,\`basename \$@\`" + ;; + *) + LIBCUPS="lib$cupsbase.sl.2" + LIBCUPSCGI="libcupscgi.sl.1" + LIBCUPSDRIVER="libcupsdriver.sl.1" + LIBCUPSIMAGE="libcupsimage.sl.2" + LIBCUPSMIME="libcupsmime.sl.1" + LIBCUPSPPDC="libcupsppdc.sl.1" + DSO="\$(LD)" + DSOXX="\$(LD)" + DSOFLAGS="$DSOFLAGS -b -z +h \`basename \$@\`" + ;; + esac + ;; + IRIX) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -set_version,sgi2.6,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + OSF1* | Linux | GNU | *BSD*) + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + Darwin*) + LIBCUPS="lib$cupsbase.2.dylib" + LIBCUPSCGI="libcupscgi.1.dylib" + LIBCUPSDRIVER="libcupsdriver.1.dylib" + LIBCUPSIMAGE="libcupsimage.2.dylib" + LIBCUPSMIME="libcupsmime.1.dylib" + LIBCUPSPPDC="libcupsppdc.1.dylib" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -dynamiclib -single_module -lc" + ;; + AIX*) + LIBCUPS="lib${cupsbase}_s.a" + LIBCUPSBASE="${cupsbase}_s" + LIBCUPSCGI="libcupscgi_s.a" + LIBCUPSDRIVER="libcupsdriver_s.a" + LIBCUPSIMAGE="libcupsimage_s.a" + LIBCUPSMIME="libcupsmime_s.a" + LIBCUPSPPDC="libcupsppdc_s.a" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-bexpall,-bM:SRE,-bnoentry,-blibpath:\$(libdir)" + ;; + *) + echo "Warning: shared libraries may not be supported. Trying -shared" + echo " option with compiler." + LIBCUPS="lib$cupsbase.so.2" + LIBCUPSCGI="libcupscgi.so.1" + LIBCUPSDRIVER="libcupsdriver.so.1" + LIBCUPSIMAGE="libcupsimage.so.2" + LIBCUPSMIME="libcupsmime.so.1" + LIBCUPSPPDC="libcupsppdc.so.1" + DSO="\$(CC)" + DSOXX="\$(CXX)" + DSOFLAGS="$DSOFLAGS -Wl,-soname,\`basename \$@\` -shared \$(OPTIM)" + ;; + esac +else + PICFLAG=0 + LIBCUPS="lib$cupsbase.a" + LIBCUPSCGI="libcupscgi.a" + LIBCUPSDRIVER="libcupsdriver.a" + LIBCUPSIMAGE="libcupsimage.a" + LIBCUPSMIME="libcupsmime.a" + LIBCUPSPPDC="libcupsppdc.a" + DSO=":" + DSOXX=":" +fi + +# 32-bit and 64-bit libraries need variations of the standard +# DSOFLAGS... +DSO32FLAGS="$DSOFLAGS" +DSO64FLAGS="$DSOFLAGS" + + + + + + + + + + + + + + + +if test x$enable_shared = xno; then + LINKCUPS="../cups/lib$cupsbase.a" + LINKCUPSIMAGE="../filter/libcupsimage.a" + + EXTLINKCUPS="-lcups" + EXTLINKCUPSDRIVER="-lcupsdriver" + EXTLINKCUPSIMAGE="-lcupsimage" +else + if test $uname = AIX; then + LINKCUPS="-l${cupsbase}_s" + LINKCUPSIMAGE="-lcupsimage_s" + + EXTLINKCUPS="-lcups_s" + EXTLINKCUPSDRIVER="-lcupsdriver_s" + EXTLINKCUPSIMAGE="-lcupsimage_s" + else + LINKCUPS="-l${cupsbase}" + LINKCUPSIMAGE="-lcupsimage" + + EXTLINKCUPS="-lcups" + EXTLINKCUPSDRIVER="-lcupsdriver" + EXTLINKCUPSIMAGE="-lcupsimage" + fi +fi + + + + + + + +EXPORT_LDFLAGS="" + +if test "$DSO" != ":"; then + # When using DSOs the image libraries are linked to libcupsimage.so + # rather than to the executables. This makes things smaller if you + # are using any static libraries, and it also allows us to distribute + # a single DSO rather than a bunch... + DSOLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" + IMGLIBS="" + + # Tell the run-time linkers where to find a DSO. Some platforms + # need this option, even when the library is installed in a + # standard location... + case $uname in + HP-UX*) + # HP-UX needs the path, even for /usr/lib... + case "$uarch" in + ia64) + DSOFLAGS="-Wl,+s,+b,$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,+s,+b,$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,+s,+b,$LIB64DIR $DSO64FLAGS" + ;; + *) + DSOFLAGS="+s +b $libdir $DSOFLAGS" + DSO32FLAGS="+s +b $LIB32DIR $DSO32FLAGS" + DSO64FLAGS="+s +b $LIB64DIR $DSO64FLAGS" + ;; + esac + LDFLAGS="$LDFLAGS -Wl,+s,+b,$libdir" + EXPORT_LDFLAGS="-Wl,+s,+b,$libdir" + ;; + SunOS*) + # Solaris... + if test $exec_prefix != /usr; then + DSOFLAGS="-R$libdir $DSOFLAGS" + DSO32FLAGS="-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -R$libdir" + EXPORT_LDFLAGS="-R$libdir" + fi + ;; + *BSD*) + # *BSD... + if test $exec_prefix != /usr; then + DSOFLAGS="-Wl,-R$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-R$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-R$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-R$libdir" + EXPORT_LDFLAGS="-Wl,-R$libdir" + fi + ;; + IRIX | Linux | GNU) + # IRIX, Linux, and HURD... + if test $exec_prefix != /usr; then + DSOFLAGS="-Wl,-rpath,$libdir $DSOFLAGS" + DSO32FLAGS="-Wl,-rpath,$LIB32DIR $DSO32FLAGS" + DSO64FLAGS="-Wl,-rpath,$LIB64DIR $DSO64FLAGS" + LDFLAGS="$LDFLAGS -Wl,-rpath,$libdir" + EXPORT_LDFLAGS="-Wl,-rpath,$libdir" + fi + ;; + esac +else + DSOLIBS="" + IMGLIBS="\$(LIBTIFF) \$(LIBPNG) \$(LIBJPEG) \$(LIBZ)" +fi + + + + + + + +# Check whether --enable-libtool_unsupported was given. +if test "${enable_libtool_unsupported+set}" = set; then : + enableval=$enable_libtool_unsupported; if test x$enable_libtool_unsupported != xno; then + LIBTOOL="$enable_libtool_unsupported" + enable_shared=no + echo "WARNING: libtool is not supported or endorsed by Apple Inc." + echo " WE DO NOT PROVIDE SUPPORT FOR LIBTOOL PROBLEMS." + else + LIBTOOL="" + fi +fi + + + + +if test x$LIBTOOL != x; then + LIBCUPS="libcups.la" + LIBCUPSIMAGE="libcupsimage.la" + LINKCUPS="../cups/\$(LIBCUPS)" + LINKCUPSIMAGE="../filter/\$(LIBCUPSIMAGE)" + DSO="\$(CC)" +fi + + + +INSTALL_STRIP="" +OPTIM="" + + + + +# Check whether --with-optim was given. +if test "${with_optim+set}" = set; then : + withval=$with_optim; +fi + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + +# Check whether --enable-debug_guards was given. +if test "${enable_debug_guards+set}" = set; then : + enableval=$enable_debug_guards; +fi + +# Check whether --enable-debug_printfs was given. +if test "${enable_debug_printfs+set}" = set; then : + enableval=$enable_debug_printfs; +fi + +# Check whether --enable-unit_tests was given. +if test "${enable_unit_tests+set}" = set; then : + enableval=$enable_unit_tests; +fi + + +if test x$enable_debug = xyes; then + OPTIM="-g" +else + INSTALL_STRIP="-s" +fi + +if test x$enable_debug_printfs = xyes; then + CFLAGS="$CFLAGS -DDEBUG" + CXXFLAGS="$CXXFLAGS -DDEBUG" +fi + +if test x$enable_debug_guards = xyes; then + CFLAGS="$CFLAGS -DDEBUG_GUARDS" + CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" +fi + +if test x$enable_unit_tests = xyes; then + UNITTESTS="unittests" +else + UNITTESTS="" +fi + + + +# Check whether --with-archflags was given. +if test "${with_archflags+set}" = set; then : + withval=$with_archflags; +fi + + +# Check whether --with-ldarchflags was given. +if test "${with_ldarchflags+set}" = set; then : + withval=$with_ldarchflags; +fi + + +if test -z "$with_archflags"; then + ARCHFLAGS="" +else + ARCHFLAGS="$with_archflags" +fi + +if test -z "$with_ldarchflags"; then + if test "$uname" = Darwin; then + # Only create 32-bit programs by default + LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch x86_64//' -e '1,$s/-arch ppc64//'`" + else + LDARCHFLAGS="$ARCHFLAGS" + fi +else + LDARCHFLAGS="$with_ldarchflags" +fi + + + + + +# Check whether --with-arch32flags was given. +if test "${with_arch32flags+set}" = set; then : + withval=$with_arch32flags; +fi + +ARCH32FLAGS="" + + + +# Check whether --with-arch64flags was given. +if test "${with_arch64flags+set}" = set; then : + withval=$with_arch64flags; +fi + +ARCH64FLAGS="" + + +# Check whether --enable-relro was given. +if test "${enable_relro+set}" = set; then : + enableval=$enable_relro; +fi + + +CXXLIBS="${CXXLIBS:=}" + + +PIEFLAGS="" + + +RELROFLAGS="" + + +PHPOPTIONS="" + + +if test -n "$GCC"; then + # Add GCC-specific compiler options... + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + # Default to optimize-for-size and debug + OPTIM="-Os -g" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + # Generate position-independent code as needed... + if test $PICFLAG = 1 -a $uname != AIX; then + OPTIM="-fPIC $OPTIM" + fi + + # The -fstack-protector option is available with some versions of + # GCC and adds "stack canaries" which detect when the return address + # has been overwritten, preventing many types of exploit attacks. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fstack-protector" >&5 +$as_echo_n "checking if GCC supports -fstack-protector... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fstack-protector" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + OPTIM="$OPTIM -fstack-protector" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + # The -fPIE option is available with some versions of GCC and adds + # randomization of addresses, which avoids another class of exploits + # that depend on a fixed address for common functions. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fPIE" >&5 +$as_echo_n "checking if GCC supports -fPIE... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fPIE" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + case "$CC" in + *clang) + PIEFLAGS="-fPIE -Wl,-pie" + ;; + *) + PIEFLAGS="-fPIE -pie" + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + if test "x$with_optim" = x; then + # Add useful warning options for tracking down problems... + OPTIM="-Wall -Wno-format-y2k -Wunused $OPTIM" + + # Additional warning options for development testing... + if test -d .svn; then + OPTIM="-Wshadow -Werror $OPTIM" + PHPOPTIONS="-Wno-shadow" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -Wno-tautological-compare" >&5 +$as_echo_n "checking if GCC supports -Wno-tautological-compare... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wno-tautological-compare" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -Wno-tautological-compare" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + fi + fi + + case "$uname" in + Darwin*) + # -D_FORTIFY_SOURCE=2 adds additional object size + # checking, basically wrapping all string functions + # with buffer-limited ones. Not strictly needed for + # CUPS since we already use buffer-limited calls, but + # this will catch any additions that are broken. + CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" + ;; + + HP-UX*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-milp32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-mlp64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-mlp64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-milp32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + IRIX) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-n32 -mips3" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-64 -mips4" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-64 -mips4" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-n32 -mips3" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + Linux*) + # The -z relro option is provided by the Linux linker command to + # make relocatable data read-only. + if test x$enable_relro = xyes; then + RELROFLAGS="-Wl,-z,relro" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-m32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-m64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-m64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-m32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + + SunOS*) + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-m32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-m64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-m64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-m32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + esac +else + # Add vendor-specific compiler options... + case $uname in + AIX*) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O2 -qmaxmem=6000" + else + OPTIM="$with_optim $OPTIM" + fi + fi + ;; + HP-UX*) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="+O2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + CFLAGS="-Ae $CFLAGS" + + if test $PICFLAG = 1; then + OPTIM="+z $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="+DD32" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="+DD64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="+DD64" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="+DD32" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + IRIX) + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test "x$with_optim" = x; then + OPTIM="-fullwarn -woff 1183,1209,1349,1506,3201 $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Build 32-bit libraries, 64-bit base... + if test -z "$with_arch32flags"; then + ARCH32FLAGS="-n32 -mips3" + else + ARCH32FLAGS="$with_arch32flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-64 -mips4" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + fi + + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries, 32-bit base... + if test -z "$with_arch64flags"; then + ARCH64FLAGS="-64 -mips4" + else + ARCH64FLAGS="$with_arch64flags" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-n32 -mips3" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + OSF*) + # Tru64 UNIX aka Digital UNIX aka OSF/1 + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O" + else + OPTIM="$with_optim" + fi + fi + ;; + SunOS*) + # Solaris + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-xO2" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + + if test "x$enable_32bit" = xyes; then + # Compiling on a Solaris system, build 64-bit + # binaries with separate 32-bit libraries... + ARCH32FLAGS="-xarch=generic" + + if test "x$with_optim" = x; then + # Suppress all of Sun's questionable + # warning messages, and default to + # 64-bit compiles of everything else... + OPTIM="-w $OPTIM" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch64flags"; then + ARCHFLAGS="-xarch=generic64" + else + ARCHFLAGS="$with_arch64flags" + fi + fi + else + if test "x$enable_64bit" = xyes; then + # Build 64-bit libraries... + ARCH64FLAGS="-xarch=generic64" + fi + + if test "x$with_optim" = x; then + # Suppress all of Sun's questionable + # warning messages, and default to + # 32-bit compiles of everything else... + OPTIM="-w $OPTIM" + fi + + if test -z "$with_archflags"; then + if test -z "$with_arch32flags"; then + ARCHFLAGS="-xarch=generic" + else + ARCHFLAGS="$with_arch32flags" + fi + fi + fi + ;; + UNIX_SVR*) + # UnixWare + if test -z "$OPTIM"; then + if test "x$with_optim" = x; then + OPTIM="-O" + else + OPTIM="$with_optim $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + ;; + *) + # Running some other operating system; inform the user they + # should contribute the necessary options to + # cups-support@cups.org... + echo "Building CUPS with default compiler optimizations; contact" + echo "cups-bugs@cups.org with uname and compiler options needed" + echo "for your platform, or set the CFLAGS and LDFLAGS environment" + echo "variables before running configure." + ;; + esac +fi + +# Add general compiler options per platform... +case $uname in + HP-UX*) + # HP-UX 10.20 (at least) needs this definition to get the + # h_errno global... + OPTIM="$OPTIM -D_XOPEN_SOURCE_EXTENDED" + + # HP-UX 11.00 (at least) needs this definition to get the + # u_short type used by the IP headers... + OPTIM="$OPTIM -D_INCLUDE_HPUX_SOURCE" + + # HP-UX 11.23 (at least) needs this definition to get the + # IPv6 header to work... + OPTIM="$OPTIM -D_HPUX_SOURCE" + ;; + + Linux*) + # glibc 2.8 and higher breaks peer credentials unless you + # define _GNU_SOURCE... + OPTIM="$OPTIM -D_GNU_SOURCE" + ;; + + OSF*) + # Tru64 UNIX aka Digital UNIX aka OSF/1 need to be told + # to be POSIX-compliant... + OPTIM="$OPTIM -D_XOPEN_SOURCE=500 -D_XOPEN_SOURCE_EXTENDED -D_OSF_SOURCE" + ;; +esac + + + + +# Check whether --enable-image was given. +if test "${enable_image+set}" = set; then : + enableval=$enable_image; +fi + + +DEFAULT_IMAGEFILTERS="#" +IMGFILTERS="" +if test "x$enable_image" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build image filters" >&5 +$as_echo_n "checking whether to build image filters... " >&6; } + if test "x$enable_image" = xyes -o $uname != Darwin; then + IMGFILTERS="imagetops imagetoraster" + DEFAULT_IMAGEFILTERS="" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + + + + +# Check whether --enable-jpeg was given. +if test "${enable_jpeg+set}" = set; then : + enableval=$enable_jpeg; +fi + +# Check whether --enable-png was given. +if test "${enable_png+set}" = set; then : + enableval=$enable_png; +fi + +# Check whether --enable-tiff was given. +if test "${enable_tiff+set}" = set; then : + enableval=$enable_tiff; +fi + + +LIBJPEG="" +LIBPNG="" +LIBTIFF="" +LIBZ="" + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5 +$as_echo_n "checking for library containing pow... " >&6; } +if test "${ac_cv_search_pow+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_pow=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_pow+set}" = set; then : + break +fi +done +if test "${ac_cv_search_pow+set}" = set; then : + +else + ac_cv_search_pow=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5 +$as_echo "$ac_cv_search_pow" >&6; } +ac_res=$ac_cv_search_pow +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +SAVELIBS="$LIBS" + +if test x$enable_jpeg != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_destroy_decompress in -ljpeg" >&5 +$as_echo_n "checking for jpeg_destroy_decompress in -ljpeg... " >&6; } +if test "${ac_cv_lib_jpeg_jpeg_destroy_decompress+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_destroy_decompress (); +int +main () +{ +return jpeg_destroy_decompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_destroy_decompress=yes +else + ac_cv_lib_jpeg_jpeg_destroy_decompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_destroy_decompress" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_destroy_decompress" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_destroy_decompress" = x""yes; then : + $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h + + LIBJPEG="-ljpeg" + LIBS="$LIBS -ljpeg" +fi + +fi + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: JPEG support disabled with --disable-jpeg." >&5 +$as_echo "$as_me: JPEG support disabled with --disable-jpeg." >&6;} +fi + +INSTALL_GZIP="" +ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 +$as_echo_n "checking for gzgets in -lz... " >&6; } +if test "${ac_cv_lib_z_gzgets+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzgets (); +int +main () +{ +return gzgets (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzgets=yes +else + ac_cv_lib_z_gzgets=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5 +$as_echo "$ac_cv_lib_z_gzgets" >&6; } +if test "x$ac_cv_lib_z_gzgets" = x""yes; then : + $as_echo "#define HAVE_LIBZ 1" >>confdefs.h + + LIBZ="-lz" + LIBS="$LIBS -lz" + if test "x$GZIP" != x; then + INSTALL_GZIP="-z" + fi +fi + +fi + + + + +if test x$enable_png != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" +if test "x$ac_cv_header_png_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_create_read_struct in -lpng" >&5 +$as_echo_n "checking for png_create_read_struct in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_create_read_struct+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_create_read_struct (); +int +main () +{ +return png_create_read_struct (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_create_read_struct=yes +else + ac_cv_lib_png_png_create_read_struct=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_create_read_struct" >&5 +$as_echo "$ac_cv_lib_png_png_create_read_struct" >&6; } +if test "x$ac_cv_lib_png_png_create_read_struct" = x""yes; then : + $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h + + LIBPNG="-lpng" +fi + +fi + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: PNG support disabled with --disable-png." >&5 +$as_echo "$as_me: PNG support disabled with --disable-png." >&6;} +fi + +if test x$enable_tiff != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "tiff.h" "ac_cv_header_tiff_h" "$ac_includes_default" +if test "x$ac_cv_header_tiff_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFReadScanline in -ltiff" >&5 +$as_echo_n "checking for TIFFReadScanline in -ltiff... " >&6; } +if test "${ac_cv_lib_tiff_TIFFReadScanline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltiff $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char TIFFReadScanline (); +int +main () +{ +return TIFFReadScanline (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_tiff_TIFFReadScanline=yes +else + ac_cv_lib_tiff_TIFFReadScanline=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFReadScanline" >&5 +$as_echo "$ac_cv_lib_tiff_TIFFReadScanline" >&6; } +if test "x$ac_cv_lib_tiff_TIFFReadScanline" = x""yes; then : + $as_echo "#define HAVE_LIBTIFF 1" >>confdefs.h + + LIBTIFF="-ltiff" +fi + +fi + + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: TIFF support disabled with --disable-tiff." >&5 +$as_echo "$as_me: TIFF support disabled with --disable-tiff." >&6;} +fi + +LIBS="$SAVELIBS" + +EXPORT_LIBJPEG="$LIBJPEG" +EXPORT_LIBPNG="$LIBPNG" +EXPORT_LIBTIFF="$LIBTIFF" +EXPORT_LIBZ="$LIBZ" + + + + + + +ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" +if test "x$ac_cv_header_stdlib_h" = x""yes; then : + $as_echo "#define HAVE_STDLIB_H 1" >>confdefs.h + +fi + + + + + +ac_fn_c_check_header_mongrel "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "$ac_includes_default" +if test "x$ac_cv_header_resolv_h" = x""yes; then : + $as_echo "#define HAVE_RESOLV_H 1" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if test "${ac_cv_search_socket+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_socket+set}" = set; then : + break +fi +done +if test "${ac_cv_search_socket+set}" = set; then : + +else + ac_cv_search_socket=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyaddr" >&5 +$as_echo_n "checking for library containing gethostbyaddr... " >&6; } +if test "${ac_cv_search_gethostbyaddr+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyaddr (); +int +main () +{ +return gethostbyaddr (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_gethostbyaddr=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_gethostbyaddr+set}" = set; then : + break +fi +done +if test "${ac_cv_search_gethostbyaddr+set}" = set; then : + +else + ac_cv_search_gethostbyaddr=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyaddr" >&5 +$as_echo "$ac_cv_search_gethostbyaddr" >&6; } +ac_res=$ac_cv_search_gethostbyaddr +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getifaddrs" >&5 +$as_echo_n "checking for library containing getifaddrs... " >&6; } +if test "${ac_cv_search_getifaddrs+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getifaddrs (); +int +main () +{ +return getifaddrs (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getifaddrs=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_getifaddrs+set}" = set; then : + break +fi +done +if test "${ac_cv_search_getifaddrs+set}" = set; then : + +else + ac_cv_search_getifaddrs=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getifaddrs" >&5 +$as_echo "$ac_cv_search_getifaddrs" >&6; } +ac_res=$ac_cv_search_getifaddrs +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_GETIFADDRS 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing hstrerror" >&5 +$as_echo_n "checking for library containing hstrerror... " >&6; } +if test "${ac_cv_search_hstrerror+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char hstrerror (); +int +main () +{ +return hstrerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl socket resolv; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_hstrerror=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_hstrerror+set}" = set; then : + break +fi +done +if test "${ac_cv_search_hstrerror+set}" = set; then : + +else + ac_cv_search_hstrerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_hstrerror" >&5 +$as_echo "$ac_cv_search_hstrerror" >&6; } +ac_res=$ac_cv_search_hstrerror +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_HSTRERROR 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing rresvport_af" >&5 +$as_echo_n "checking for library containing rresvport_af... " >&6; } +if test "${ac_cv_search_rresvport_af+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char rresvport_af (); +int +main () +{ +return rresvport_af (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_rresvport_af=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_rresvport_af+set}" = set; then : + break +fi +done +if test "${ac_cv_search_rresvport_af+set}" = set; then : + +else + ac_cv_search_rresvport_af=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_rresvport_af" >&5 +$as_echo "$ac_cv_search_rresvport_af" >&6; } +ac_res=$ac_cv_search_rresvport_af +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_RRESVPORT_AF 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing __res_init" >&5 +$as_echo_n "checking for library containing __res_init... " >&6; } +if test "${ac_cv_search___res_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char __res_init (); +int +main () +{ +return __res_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv bind; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search___res_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search___res_init+set}" = set; then : + break +fi +done +if test "${ac_cv_search___res_init+set}" = set; then : + +else + ac_cv_search___res_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search___res_init" >&5 +$as_echo "$ac_cv_search___res_init" >&6; } +ac_res=$ac_cv_search___res_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_9_init" >&5 +$as_echo_n "checking for library containing res_9_init... " >&6; } +if test "${ac_cv_search_res_9_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_9_init (); +int +main () +{ +return res_9_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv bind; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_res_9_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_res_9_init+set}" = set; then : + break +fi +done +if test "${ac_cv_search_res_9_init+set}" = set; then : + +else + ac_cv_search_res_9_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_9_init" >&5 +$as_echo "$ac_cv_search_res_9_init" >&6; } +ac_res=$ac_cv_search_res_9_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing res_init" >&5 +$as_echo_n "checking for library containing res_init... " >&6; } +if test "${ac_cv_search_res_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_init (); +int +main () +{ +return res_init (); + ; + return 0; +} +_ACEOF +for ac_lib in '' resolv bind; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_res_init=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_res_init+set}" = set; then : + break +fi +done +if test "${ac_cv_search_res_init+set}" = set; then : + +else + ac_cv_search_res_init=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_res_init" >&5 +$as_echo "$ac_cv_search_res_init" >&6; } +ac_res=$ac_cv_search_res_init +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_RES_INIT 1" >>confdefs.h + +fi + +fi + +fi + + +# Tru64 5.1b leaks file descriptors with these functions; disable until +# we can come up with a test for this... +if test "$uname" != "OSF1"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getaddrinfo" >&5 +$as_echo_n "checking for library containing getaddrinfo... " >&6; } +if test "${ac_cv_search_getaddrinfo+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getaddrinfo (); +int +main () +{ +return getaddrinfo (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getaddrinfo=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_getaddrinfo+set}" = set; then : + break +fi +done +if test "${ac_cv_search_getaddrinfo+set}" = set; then : + +else + ac_cv_search_getaddrinfo=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getaddrinfo" >&5 +$as_echo "$ac_cv_search_getaddrinfo" >&6; } +ac_res=$ac_cv_search_getaddrinfo +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_GETADDRINFO 1" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing getnameinfo" >&5 +$as_echo_n "checking for library containing getnameinfo... " >&6; } +if test "${ac_cv_search_getnameinfo+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char getnameinfo (); +int +main () +{ +return getnameinfo (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_getnameinfo=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_getnameinfo+set}" = set; then : + break +fi +done +if test "${ac_cv_search_getnameinfo+set}" = set; then : + +else + ac_cv_search_getnameinfo=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getnameinfo" >&5 +$as_echo "$ac_cv_search_getnameinfo" >&6; } +ac_res=$ac_cv_search_getnameinfo +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_GETNAMEINFO 1" >>confdefs.h + +fi + +fi + +ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include +" +if test "x$ac_cv_member_struct_sockaddr_sa_len" = x""yes; then : + +fi + +ac_fn_c_check_header_mongrel "$LINENO" "sys/sockio.h" "ac_cv_header_sys_sockio_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_sockio_h" = x""yes; then : + $as_echo "#define HAVE_SYS_SOCKIO_H 1" >>confdefs.h + +fi + + + +CUPS_DEFAULT_DOMAINSOCKET="" + + +# Check whether --with-domainsocket was given. +if test "${with_domainsocket+set}" = set; then : + withval=$with_domainsocket; default_domainsocket="$withval" +else + default_domainsocket="" +fi + + +if test x$enable_domainsocket != xno -a x$default_domainsocket != xno; then + if test "x$default_domainsocket" = x; then + case "$uname" in + Darwin*) + # Darwin and MaxOS X do their own thing... + CUPS_DEFAULT_DOMAINSOCKET="$localstatedir/run/cupsd" + ;; + *) + # All others use FHS standard... + CUPS_DEFAULT_DOMAINSOCKET="$CUPS_STATEDIR/cups.sock" + ;; + esac + else + CUPS_DEFAULT_DOMAINSOCKET="$default_domainsocket" + fi + + CUPS_LISTEN_DOMAINSOCKET="Listen $CUPS_DEFAULT_DOMAINSOCKET" + + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_DOMAINSOCKET "$CUPS_DEFAULT_DOMAINSOCKET" +_ACEOF + +else + CUPS_LISTEN_DOMAINSOCKET="" +fi + + + + +for ac_header in AppleTalk/at_proto.h +do : + ac_fn_c_check_header_compile "$LINENO" "AppleTalk/at_proto.h" "ac_cv_header_AppleTalk_at_proto_h" "#include +" +if test "x$ac_cv_header_AppleTalk_at_proto_h" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_APPLETALK_AT_PROTO_H 1 +_ACEOF + $as_echo "#define HAVE_APPLETALK_AT_PROTO_H 1" >>confdefs.h + +fi + +done + + + + +ac_fn_c_check_func "$LINENO" "poll" "ac_cv_func_poll" +if test "x$ac_cv_func_poll" = x""yes; then : + $as_echo "#define HAVE_POLL 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "epoll_create" "ac_cv_func_epoll_create" +if test "x$ac_cv_func_epoll_create" = x""yes; then : + $as_echo "#define HAVE_EPOLL 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "kqueue" "ac_cv_func_kqueue" +if test "x$ac_cv_func_kqueue" = x""yes; then : + $as_echo "#define HAVE_KQUEUE 1" >>confdefs.h + +fi + + + + +# Check whether --enable-slp was given. +if test "${enable_slp+set}" = set; then : + enableval=$enable_slp; +fi + + +# Check whether --with-openslp-libs was given. +if test "${with_openslp_libs+set}" = set; then : + withval=$with_openslp_libs; LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" +fi + + +# Check whether --with-openslp-includes was given. +if test "${with_openslp_includes+set}" = set; then : + withval=$with_openslp_includes; CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" +fi + + +LIBSLP="" + +if test x$enable_slp != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "slp.h" "ac_cv_header_slp_h" "$ac_includes_default" +if test "x$ac_cv_header_slp_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SLPOpen in -lslp" >&5 +$as_echo_n "checking for SLPOpen in -lslp... " >&6; } +if test "${ac_cv_lib_slp_SLPOpen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lslp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char SLPOpen (); +int +main () +{ +return SLPOpen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_slp_SLPOpen=yes +else + ac_cv_lib_slp_SLPOpen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_slp_SLPOpen" >&5 +$as_echo "$ac_cv_lib_slp_SLPOpen" >&6; } +if test "x$ac_cv_lib_slp_SLPOpen" = x""yes; then : + $as_echo "#define HAVE_LIBSLP 1" >>confdefs.h + + LIBSLP="-lslp" +fi + +fi + + +fi + + + + + + +# Check whether --enable-gssapi was given. +if test "${enable_gssapi+set}" = set; then : + enableval=$enable_gssapi; +fi + + +LIBGSSAPI="" + + +if test x$enable_gssapi != xno; then + # Extract the first word of "krb5-config", so it can be a program name with args. +set dummy krb5-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_KRB5CONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $KRB5CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_KRB5CONFIG="$KRB5CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_KRB5CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +KRB5CONFIG=$ac_cv_path_KRB5CONFIG +if test -n "$KRB5CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $KRB5CONFIG" >&5 +$as_echo "$KRB5CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$KRB5CONFIG" != x; then + case "$uname" in + Darwin) + # Mac OS X weak-links to the Kerberos framework... + LIBGSSAPI="-weak_framework Kerberos" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS framework" >&5 +$as_echo_n "checking for GSS framework... " >&6; } + if test -d /System/Library/Frameworks/GSS.framework; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + LIBGSSAPI="$LIBGSSAPI -weak_framework GSS" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + SunOS*) + # Solaris has a non-standard krb5-config, don't use it! + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 +$as_echo_n "checking for gss_display_status in -lgss... " >&6; } +if test "${ac_cv_lib_gss_gss_display_status+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgss $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gss_display_status (); +int +main () +{ +return gss_display_status (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gss_gss_display_status=yes +else + ac_cv_lib_gss_gss_display_status=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 +$as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } +if test "x$ac_cv_lib_gss_gss_display_status" = x""yes; then : + +$as_echo "#define HAVE_GSSAPI 1" >>confdefs.h + + CFLAGS="`$KRB5CONFIG --cflags` $CFLAGS" + CPPFLAGS="`$KRB5CONFIG --cflags` $CPPFLAGS" + LIBGSSAPI="-lgss `$KRB5CONFIG --libs`" +fi + + ;; + *) + # Other platforms just ask for GSSAPI + CFLAGS="`$KRB5CONFIG --cflags gssapi` $CFLAGS" + CPPFLAGS="`$KRB5CONFIG --cflags gssapi` $CPPFLAGS" + LIBGSSAPI="`$KRB5CONFIG --libs gssapi`" + ;; + esac + +$as_echo "#define HAVE_GSSAPI 1" >>confdefs.h + + else + # Check for vendor-specific implementations... + case "$uname" in + HP-UX*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 +$as_echo_n "checking for gss_display_status in -lgss... " >&6; } +if test "${ac_cv_lib_gss_gss_display_status+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgss $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gss_display_status (); +int +main () +{ +return gss_display_status (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gss_gss_display_status=yes +else + ac_cv_lib_gss_gss_display_status=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 +$as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } +if test "x$ac_cv_lib_gss_gss_display_status" = x""yes; then : + +$as_echo "#define HAVE_GSSAPI 1" >>confdefs.h + + LIBGSSAPI="-lgss -lgssapi_krb5" +fi + + ;; + SunOS*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gss_display_status in -lgss" >&5 +$as_echo_n "checking for gss_display_status in -lgss... " >&6; } +if test "${ac_cv_lib_gss_gss_display_status+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgss $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gss_display_status (); +int +main () +{ +return gss_display_status (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gss_gss_display_status=yes +else + ac_cv_lib_gss_gss_display_status=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gss_gss_display_status" >&5 +$as_echo "$ac_cv_lib_gss_gss_display_status" >&6; } +if test "x$ac_cv_lib_gss_gss_display_status" = x""yes; then : + +$as_echo "#define HAVE_GSSAPI 1" >>confdefs.h + + LIBGSSAPI="-lgss" +fi + + ;; + esac + fi + + if test "x$LIBGSSAPI" != x; then + ac_fn_c_check_header_mongrel "$LINENO" "krb5.h" "ac_cv_header_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_krb5_h" = x""yes; then : + $as_echo "#define HAVE_KRB5_H 1" >>confdefs.h + +fi + + + if test -d /System/Library/Frameworks/GSS.framework; then + gssdir="/System/Library/Frameworks/GSS.framework" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi.h presence" >&5 +$as_echo_n "checking for GSS/gssapi.h presence... " >&6; } + if test -f $gssdir/Headers/gssapi.h; then + $as_echo "#define HAVE_GSS_GSSAPI_H 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_generic.h presence" >&5 +$as_echo_n "checking for GSS/gssapi_generic.h presence... " >&6; } + if test -f $gssdir/Headers/gssapi_generic.h; then + $as_echo "#define HAVE_GSSAPI_GENERIC_H 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_krb5.h presence" >&5 +$as_echo_n "checking for GSS/gssapi_krb5.h presence... " >&6; } + if test -f $gssdir/Headers/gssapi_krb5.h; then + $as_echo "#define HAVE_GSSAPI_KRB5_H 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h presence" >&5 +$as_echo_n "checking for GSS/gssapi_spi.h presence... " >&6; } + if test -f $gssdir/PrivateHeaders/gssapi_spi.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS/gssapi_spi.h usability" >&5 +$as_echo_n "checking for GSS/gssapi_spi.h usability... " >&6; } + if test -s $gssdir/PrivateHeaders/gssapi_spi.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_GSS_GSSAPI_SPI_H 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + if test $uversion -ge 110; then + # Broken public headers in 10.7... + as_fn_error $? "Run 'sudo mkdir -p $gssdir/PrivateHeaders' and 'sudo touch $gssdir/PrivateHeaders/gssapi_spi.h' to build CUPS." "$LINENO" 5 + fi + fi + else + ac_fn_c_check_header_mongrel "$LINENO" "gssapi.h" "ac_cv_header_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_h" = x""yes; then : + $as_echo "#define HAVE_GSSAPI_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "gssapi/gssapi.h" "ac_cv_header_gssapi_gssapi_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_h" = x""yes; then : + $as_echo "#define HAVE_GSSAPI_GSSAPI_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "gssapi/gssapi_generic.h" "ac_cv_header_gssapi_gssapi_generic_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_generic_h" = x""yes; then : + $as_echo "#define HAVE_GSSAPI_GENERIC_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "gssapi/gssapi_krb5.h" "ac_cv_header_gssapi_gssapi_krb5_h" "$ac_includes_default" +if test "x$ac_cv_header_gssapi_gssapi_krb5_h" = x""yes; then : + $as_echo "#define HAVE_GSSAPI_KRB5_H 1" >>confdefs.h + +fi + + + fi + + SAVELIBS="$LIBS" + LIBS="$LIBS $LIBGSSAPI" + + ac_fn_c_check_func "$LINENO" "__ApplePrivate_gss_acquire_cred_ex_f" "ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" +if test "x$ac_cv_func___ApplePrivate_gss_acquire_cred_ex_f" = x""yes; then : + $as_echo "#define HAVE_GSS_ACQUIRE_CRED_EX_F 1" >>confdefs.h + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSS_C_NT_HOSTBASED_SERVICE" >&5 +$as_echo_n "checking for GSS_C_NT_HOSTBASED_SERVICE... " >&6; } + if test x$ac_cv_header_gssapi_gssapi_h = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main () +{ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + elif test x$ac_cv_header_gss_gssapi_h = xyes; then + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main () +{ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + #include +int +main () +{ + gss_OID foo = GSS_C_NT_HOSTBASED_SERVICE; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + $as_echo "#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + + LIBS="$SAVELIBS" + fi +fi + + +# Check whether --with-gssservicename was given. +if test "${with_gssservicename+set}" = set; then : + withval=$with_gssservicename; default_gssservicename="$withval" +else + default_gssservicename="default" +fi + + +if test x$default_gssservicename != xno; then + if test "x$default_gssservicename" = "xdefault"; then + CUPS_DEFAULT_GSSSERVICENAME="host" + else + CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" + fi +else + CUPS_DEFAULT_GSSSERVICENAME="" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_GSSSERVICENAME "$CUPS_DEFAULT_GSSSERVICENAME" +_ACEOF + + + + +# Check whether --enable-ldap was given. +if test "${enable_ldap+set}" = set; then : + enableval=$enable_ldap; +fi + + +# Check whether --with-ldap-libs was given. +if test "${with_ldap_libs+set}" = set; then : + withval=$with_ldap_libs; LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" +fi + + +# Check whether --with-ldap-includes was given. +if test "${with_ldap_includes+set}" = set; then : + withval=$with_ldap_includes; CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" +fi + + +LIBLDAP="" + +if test x$enable_ldap != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "ldap.h" "ac_cv_header_ldap_h" "$ac_includes_default" +if test "x$ac_cv_header_ldap_h" = x""yes; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_initialize in -lldap" >&5 +$as_echo_n "checking for ldap_initialize in -lldap... " >&6; } +if test "${ac_cv_lib_ldap_ldap_initialize+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lldap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldap_initialize (); +int +main () +{ +return ldap_initialize (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ldap_ldap_initialize=yes +else + ac_cv_lib_ldap_ldap_initialize=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldap_initialize" >&5 +$as_echo "$ac_cv_lib_ldap_ldap_initialize" >&6; } +if test "x$ac_cv_lib_ldap_ldap_initialize" = x""yes; then : + $as_echo "#define HAVE_LDAP 1" >>confdefs.h + + $as_echo "#define HAVE_OPENLDAP 1" >>confdefs.h + + LIBLDAP="-lldap" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_start_tls in -lldap" >&5 +$as_echo_n "checking for ldap_start_tls in -lldap... " >&6; } +if test "${ac_cv_lib_ldap_ldap_start_tls+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lldap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldap_start_tls (); +int +main () +{ +return ldap_start_tls (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ldap_ldap_start_tls=yes +else + ac_cv_lib_ldap_ldap_start_tls=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldap_start_tls" >&5 +$as_echo "$ac_cv_lib_ldap_ldap_start_tls" >&6; } +if test "x$ac_cv_lib_ldap_ldap_start_tls" = x""yes; then : + $as_echo "#define HAVE_LDAP_SSL 1" >>confdefs.h + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_init in -lldap" >&5 +$as_echo_n "checking for ldap_init in -lldap... " >&6; } +if test "${ac_cv_lib_ldap_ldap_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lldap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldap_init (); +int +main () +{ +return ldap_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ldap_ldap_init=yes +else + ac_cv_lib_ldap_ldap_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldap_init" >&5 +$as_echo "$ac_cv_lib_ldap_ldap_init" >&6; } +if test "x$ac_cv_lib_ldap_ldap_init" = x""yes; then : + $as_echo "#define HAVE_LDAP 1" >>confdefs.h + + $as_echo "#define HAVE_MOZILLA_LDAP 1" >>confdefs.h + + LIBLDAP="-lldap" + ac_fn_c_check_header_compile "$LINENO" "ldap_ssl.h" "ac_cv_header_ldap_ssl_h" "#include +" +if test "x$ac_cv_header_ldap_ssl_h" = x""yes; then : + $as_echo "#define HAVE_LDAP_SSL_H 1" >>confdefs.h + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldapssl_init in -lldap" >&5 +$as_echo_n "checking for ldapssl_init in -lldap... " >&6; } +if test "${ac_cv_lib_ldap_ldapssl_init+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lldap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldapssl_init (); +int +main () +{ +return ldapssl_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ldap_ldapssl_init=yes +else + ac_cv_lib_ldap_ldapssl_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldapssl_init" >&5 +$as_echo "$ac_cv_lib_ldap_ldapssl_init" >&6; } +if test "x$ac_cv_lib_ldap_ldapssl_init" = x""yes; then : + $as_echo "#define HAVE_LDAP_SSL 1" >>confdefs.h + +fi + +fi + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_set_rebind_proc in -lldap" >&5 +$as_echo_n "checking for ldap_set_rebind_proc in -lldap... " >&6; } +if test "${ac_cv_lib_ldap_ldap_set_rebind_proc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lldap $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char ldap_set_rebind_proc (); +int +main () +{ +return ldap_set_rebind_proc (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ldap_ldap_set_rebind_proc=yes +else + ac_cv_lib_ldap_ldap_set_rebind_proc=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ldap_ldap_set_rebind_proc" >&5 +$as_echo "$ac_cv_lib_ldap_ldap_set_rebind_proc" >&6; } +if test "x$ac_cv_lib_ldap_ldap_set_rebind_proc" = x""yes; then : + $as_echo "#define HAVE_LDAP_REBIND_PROC 1" >>confdefs.h + +fi + + +fi + + +fi + + + + + + +# Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then : + enableval=$enable_threads; +fi + + +have_pthread=no +PTHREAD_FLAGS="" + +if test "x$enable_threads" != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = x""yes; then : + $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h + +fi + + + + if test x$ac_cv_header_pthread_h = xyes; then + for flag in -lpthreads -lpthread -pthread; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 +$as_echo_n "checking for pthread_create using $flag... " >&6; } + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_create(0, 0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + have_pthread=yes +else + LIBS="$SAVELIBS" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 +$as_echo "$have_pthread" >&6; } + + if test $have_pthread = yes; then + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to + # be POSIX-compliant... :( + if test $uname = SunOS; then + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + fi + break + fi + done + fi +fi + + + + + +# Check whether --enable-ssl was given. +if test "${enable_ssl+set}" = set; then : + enableval=$enable_ssl; +fi + +# Check whether --enable-cdsassl was given. +if test "${enable_cdsassl+set}" = set; then : + enableval=$enable_cdsassl; +fi + +# Check whether --enable-gnutls was given. +if test "${enable_gnutls+set}" = set; then : + enableval=$enable_gnutls; +fi + +# Check whether --enable-openssl was given. +if test "${enable_openssl+set}" = set; then : + enableval=$enable_openssl; +fi + + +# Check whether --with-openssl-libs was given. +if test "${with_openssl_libs+set}" = set; then : + withval=$with_openssl_libs; LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" +fi + + +# Check whether --with-openssl-includes was given. +if test "${with_openssl_includes+set}" = set; then : + withval=$with_openssl_includes; CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" +fi + + +SSLFLAGS="" +SSLLIBS="" +have_ssl=0 + +if test x$enable_ssl != xno; then + if test $have_ssl = 0 -a "x$enable_cdsassl" != "xno"; then + if test $uname = Darwin; then + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecureTransport.h" "ac_cv_header_Security_SecureTransport_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecureTransport_h" = x""yes; then : + + have_ssl=1 + $as_echo "#define HAVE_SSL 1" >>confdefs.h + + $as_echo "#define HAVE_CDSASSL 1" >>confdefs.h + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecureTransportPriv.h" "ac_cv_header_Security_SecureTransportPriv_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecureTransportPriv_h" = x""yes; then : + $as_echo "#define HAVE_SECURETRANSPORTPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecCertificate.h" "ac_cv_header_Security_SecCertificate_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecCertificate_h" = x""yes; then : + $as_echo "#define HAVE_SECCERTIFICATE_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecItem.h" "ac_cv_header_Security_SecItem_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecItem_h" = x""yes; then : + $as_echo "#define HAVE_SECITEM_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_compile "$LINENO" "Security/SecItemPriv.h" "ac_cv_header_Security_SecItemPriv_h" "#include +" +if test "x$ac_cv_header_Security_SecItemPriv_h" = x""yes; then : + $as_echo "#define HAVE_SECITEMPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecPolicy.h" "ac_cv_header_Security_SecPolicy_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecPolicy_h" = x""yes; then : + $as_echo "#define HAVE_SECPOLICY_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecPolicyPriv.h" "ac_cv_header_Security_SecPolicyPriv_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecPolicyPriv_h" = x""yes; then : + $as_echo "#define HAVE_SECPOLICYPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecBasePriv.h" "ac_cv_header_Security_SecBasePriv_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecBasePriv_h" = x""yes; then : + $as_echo "#define HAVE_SECBASEPRIV_H 1" >>confdefs.h + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "Security/SecIdentitySearchPriv.h" "ac_cv_header_Security_SecIdentitySearchPriv_h" "$ac_includes_default" +if test "x$ac_cv_header_Security_SecIdentitySearchPriv_h" = x""yes; then : + $as_echo "#define HAVE_SECIDENTITYSEARCHPRIV_H 1" >>confdefs.h + +fi + + + + SAVELIBS="$LIBS" + LIBS="$LIBS -framework Security" + ac_fn_c_check_func "$LINENO" "SSLSetProtocolVersionMax" "ac_cv_func_SSLSetProtocolVersionMax" +if test "x$ac_cv_func_SSLSetProtocolVersionMax" = x""yes; then : + +fi + + LIBS="$SAVELIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecCertificateCopyData" >&5 +$as_echo_n "checking for SecCertificateCopyData... " >&6; } + if test $uversion -ge 100; then + $as_echo "#define HAVE_SECCERTIFICATECOPYDATA 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecIdentitySearchCreateWithPolicy" >&5 +$as_echo_n "checking for SecIdentitySearchCreateWithPolicy... " >&6; } + if test $uversion -ge 80; then + $as_echo "#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SecPolicyCreateSSL" >&5 +$as_echo_n "checking for SecPolicyCreateSSL... " >&6; } + if test $uversion -ge 110; then + $as_echo "#define HAVE_SECPOLICYCREATESSL 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +fi + + + + $as_echo "#define HAVE_CSSMERRORSTRING 1" >>confdefs.h + + fi + fi + + if test $have_ssl = 0 -a "x$enable_gnutls" != "xno" -a "x$PKGCONFIG" != x; then + # Extract the first word of "libgnutls-config", so it can be a program name with args. +set dummy libgnutls-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LIBGNUTLSCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LIBGNUTLSCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LIBGNUTLSCONFIG="$LIBGNUTLSCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LIBGNUTLSCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LIBGNUTLSCONFIG=$ac_cv_path_LIBGNUTLSCONFIG +if test -n "$LIBGNUTLSCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGNUTLSCONFIG" >&5 +$as_echo "$LIBGNUTLSCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "libgcrypt-config", so it can be a program name with args. +set dummy libgcrypt-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LIBGCRYPTCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LIBGCRYPTCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_LIBGCRYPTCONFIG="$LIBGCRYPTCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LIBGCRYPTCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LIBGCRYPTCONFIG=$ac_cv_path_LIBGCRYPTCONFIG +if test -n "$LIBGCRYPTCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPTCONFIG" >&5 +$as_echo "$LIBGCRYPTCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if $PKGCONFIG --exists gnutls; then + have_ssl=1 + SSLLIBS=`$PKGCONFIG --libs gnutls` + SSLFLAGS=`$PKGCONFIG --cflags gnutls` + $as_echo "#define HAVE_SSL 1" >>confdefs.h + + $as_echo "#define HAVE_GNUTLS 1" >>confdefs.h + + elif test "x$LIBGNUTLSCONFIG" != x; then + have_ssl=1 + SSLLIBS=`$LIBGNUTLSCONFIG --libs` + SSLFLAGS=`$LIBGNUTLSCONFIG --cflags` + $as_echo "#define HAVE_SSL 1" >>confdefs.h + + $as_echo "#define HAVE_GNUTLS 1" >>confdefs.h + + fi + + if test $have_ssl = 1; then + if $PKGCONFIG --exists gcrypt; then + SSLLIBS="$SSLLIBS `$PKGCONFIG --libs gcrypt`" + SSLFLAGS="$SSLFLAGS `$PKGCONFIG --cflags gcrypt`" + elif test "x$LIBGCRYPTCONFIG" != x; then + SSLLIBS="$SSLLIBS `$LIBGCRYPTCONFIG --libs`" + SSLFLAGS="$SSLFLAGS `$LIBGCRYPTCONFIG --cflags`" + fi + fi + fi + + if test $have_ssl = 0 -a "x$enable_openssl" != "xno"; then + ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_ssl_h" = x""yes; then : + SAVELIBS="$LIBS" + + + for libcrypto in \ + "-lcrypto" \ + "-lcrypto -lrsaref" \ + "-lcrypto -lRSAglue -lrsaref" + do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_new in -lssl" >&5 +$as_echo_n "checking for SSL_new in -lssl... " >&6; } +if test "${ac_cv_lib_ssl_SSL_new+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lssl $libcrypto $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char SSL_new (); +int +main () +{ +return SSL_new (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ssl_SSL_new=yes +else + ac_cv_lib_ssl_SSL_new=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_new" >&5 +$as_echo "$ac_cv_lib_ssl_SSL_new" >&6; } +if test "x$ac_cv_lib_ssl_SSL_new" = x""yes; then : + have_ssl=1 + SSLFLAGS="-DOPENSSL_DISABLE_OLD_DES_SUPPORT" + SSLLIBS="-lssl $libcrypto" + $as_echo "#define HAVE_SSL 1" >>confdefs.h + + $as_echo "#define HAVE_LIBSSL 1" >>confdefs.h + +fi + + + if test "x${SSLLIBS}" != "x"; then + LIBS="$SAVELIBS $SSLLIBS" + ac_fn_c_check_func "$LINENO" "SSL_set_tlsext_host_name" "ac_cv_func_SSL_set_tlsext_host_name" +if test "x$ac_cv_func_SSL_set_tlsext_host_name" = x""yes; then : + $as_echo "#define HAVE_SSL_SET_TLSEXT_HOST_NAME 1" >>confdefs.h + +fi + + break + fi + done + + LIBS="$SAVELIBS" +fi + + + fi +fi + +IPPALIASES="http" +if test $have_ssl = 1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSLLIBS=\"$SSLLIBS\"" >&5 +$as_echo " Using SSLLIBS=\"$SSLLIBS\"" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using SSLFLAGS=\"$SSLFLAGS\"" >&5 +$as_echo " Using SSLFLAGS=\"$SSLFLAGS\"" >&6; } + IPPALIASES="http https ipps" +elif test x$enable_cdsa = xyes -o x$enable_gnutls = xyes -o x$enable_openssl = xyes; then + as_fn_error $? "Unable to enable SSL support." "$LINENO" 5 +fi + + + + + +EXPORT_SSLLIBS="$SSLLIBS" + + + + +# Check whether --enable-pam was given. +if test "${enable_pam+set}" = set; then : + enableval=$enable_pam; +fi + + +# Check whether --with-pam_module was given. +if test "${with_pam_module+set}" = set; then : + withval=$with_pam_module; +fi + + +if test $uname = AIX; then + enable_pam=no +fi + +PAMDIR="" +PAMFILE="pam.std" +PAMLIBS="" +PAMMOD="pam_unknown.so" +PAMMODAUTH="pam_unknown.so" + +if test x$enable_pam != xno; then + SAVELIBS="$LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBDL 1 +_ACEOF + + LIBS="-ldl $LIBS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_start in -lpam" >&5 +$as_echo_n "checking for pam_start in -lpam... " >&6; } +if test "${ac_cv_lib_pam_pam_start+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pam_start (); +int +main () +{ +return pam_start (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pam_pam_start=yes +else + ac_cv_lib_pam_pam_start=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_start" >&5 +$as_echo "$ac_cv_lib_pam_pam_start" >&6; } +if test "x$ac_cv_lib_pam_pam_start" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBPAM 1 +_ACEOF + + LIBS="-lpam $LIBS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_set_item in -lpam" >&5 +$as_echo_n "checking for pam_set_item in -lpam... " >&6; } +if test "${ac_cv_lib_pam_pam_set_item+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pam_set_item (); +int +main () +{ +return pam_set_item (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pam_pam_set_item=yes +else + ac_cv_lib_pam_pam_set_item=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_set_item" >&5 +$as_echo "$ac_cv_lib_pam_pam_set_item" >&6; } +if test "x$ac_cv_lib_pam_pam_set_item" = x""yes; then : + $as_echo "#define HAVE_PAM_SET_ITEM 1" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pam_setcred in -lpam" >&5 +$as_echo_n "checking for pam_setcred in -lpam... " >&6; } +if test "${ac_cv_lib_pam_pam_setcred+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpam $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pam_setcred (); +int +main () +{ +return pam_setcred (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_pam_pam_setcred=yes +else + ac_cv_lib_pam_pam_setcred=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pam_pam_setcred" >&5 +$as_echo "$ac_cv_lib_pam_pam_setcred" >&6; } +if test "x$ac_cv_lib_pam_pam_setcred" = x""yes; then : + $as_echo "#define HAVE_PAM_SETCRED 1" >>confdefs.h + +fi + + ac_fn_c_check_header_mongrel "$LINENO" "security/pam_appl.h" "ac_cv_header_security_pam_appl_h" "$ac_includes_default" +if test "x$ac_cv_header_security_pam_appl_h" = x""yes; then : + +fi + + + if test x$ac_cv_header_security_pam_appl_h != xyes; then + ac_fn_c_check_header_mongrel "$LINENO" "pam/pam_appl.h" "ac_cv_header_pam_pam_appl_h" "$ac_includes_default" +if test "x$ac_cv_header_pam_pam_appl_h" = x""yes; then : + $as_echo "#define HAVE_PAM_PAM_APPL_H 1" >>confdefs.h + +fi + + + fi + + if test x$ac_cv_lib_pam_pam_start != xno; then + # Set the necessary libraries for PAM... + if test x$ac_cv_lib_dl_dlopen != xno; then + PAMLIBS="-lpam -ldl" + else + PAMLIBS="-lpam" + fi + + # Find the PAM configuration directory, if any... + for dir in /private/etc/pam.d /etc/pam.d; do + if test -d $dir; then + PAMDIR=$dir + break; + fi + done + fi + + LIBS="$SAVELIBS" + + case "$uname" in + Darwin*) + # Darwin/Mac OS X + if test "x$with_pam_module" != x; then + PAMFILE="pam.$with_pam_module" + elif test -f /usr/lib/pam/pam_opendirectory.so.2; then + PAMFILE="pam.opendirectory" + else + PAMFILE="pam.securityserver" + fi + ;; + + *) + # All others; this test might need to be updated + # as Linux distributors move things around... + if test "x$with_pam_module" != x; then + PAMMOD="pam_${with_pam_module}.so" + elif test -f /lib/security/pam_unix2.so; then + PAMMOD="pam_unix2.so" + elif test -f /lib/security/pam_unix.so; then + PAMMOD="pam_unix.so" + fi + + if test "x$PAMMOD" = xpam_unix.so; then + PAMMODAUTH="$PAMMOD shadow nodelay" + else + PAMMODAUTH="$PAMMOD nodelay" + fi + ;; + esac +fi + + + + + + + + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if test "${ac_cv_sys_largefile_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test "${ac_cv_sys_file_offset_bits+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if test "${ac_cv_sys_large_files+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + +LARGEFILE="" +if test x$enable_largefile != xno; then + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1; then + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + fi + + if test x$ac_cv_sys_file_offset_bits = x64; then + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +$as_echo_n "checking for long long int... " >&6; } +if test "${ac_cv_c_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$GCC" = yes; then + ac_cv_c_long_long=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +long long int i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_long_long=yes +else + ac_cv_c_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_long_long" >&5 +$as_echo "$ac_cv_c_long_long" >&6; } + +if test $ac_cv_c_long_long = yes; then + $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = x""yes; then : + $as_echo "#define HAVE_STRTOLL 1" >>confdefs.h + +fi + + + + +# Check whether --enable-dnssd was given. +if test "${enable_dnssd+set}" = set; then : + enableval=$enable_dnssd; +fi + + +# Check whether --with-dnssd-libs was given. +if test "${with_dnssd_libs+set}" = set; then : + withval=$with_dnssd_libs; LDFLAGS="-L$withval $LDFLAGS" + DSOFLAGS="-L$withval $DSOFLAGS" +fi + + +# Check whether --with-dnssd-includes was given. +if test "${with_dnssd_includes+set}" = set; then : + withval=$with_dnssd_includes; CFLAGS="-I$withval $CFLAGS" + CPPFLAGS="-I$withval $CPPFLAGS" +fi + + +DNSSDLIBS="" +DNSSD_BACKEND="" + +# Check whether --enable-avahi was given. +if test "${enable_avahi+set}" = set; then : + enableval=$enable_avahi; if test x$enable_avahi = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Avahi" >&5 +$as_echo_n "checking for Avahi... " >&6; } + if $PKGCONFIG --exists avahi-client; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" + DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" + DNSSD_BACKEND="dnssd" + $as_echo "#define HAVE_AVAHI 1" >>confdefs.h + + enable_dnssd=no + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + fi +fi + + +if test x$enable_dnssd != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" +if test "x$ac_cv_header_dns_sd_h" = x""yes; then : + + case "$uname" in + Darwin*) + # Darwin and MacOS X... + $as_echo "#define HAVE_DNSSD 1" >>confdefs.h + + $as_echo "#define HAVE_COREFOUNDATION 1" >>confdefs.h + + $as_echo "#define HAVE_SYSTEMCONFIGURATION 1" >>confdefs.h + + DNSSDLIBS="-framework CoreFoundation -framework SystemConfiguration" + DNSSD_BACKEND="dnssd" + ;; + *) + # All others... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for current version of dns_sd library" >&5 +$as_echo_n "checking for current version of dns_sd library... " >&6; } + SAVELIBS="$LIBS" + LIBS="$LIBS -ldns_sd" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int constant = kDNSServiceFlagsShareConnection; + unsigned char txtRecord[100]; + uint8_t valueLen; + TXTRecordGetValuePtr(sizeof(txtRecord), + txtRecord, "value", &valueLen); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_DNSSD 1" >>confdefs.h + + DNSSDLIBS="-ldns_sd" + DNSSD_BACKEND="dnssd" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + LIBS="$SAVELIBS" + ;; + esac + +fi + + +fi + + + + + + + +# Check whether --enable-launchd was given. +if test "${enable_launchd+set}" = set; then : + enableval=$enable_launchd; +fi + + +DEFAULT_LAUNCHD_CONF="" +LAUNCHDLIBS="" + +if test x$enable_launchd != xno; then + ac_fn_c_check_func "$LINENO" "launch_msg" "ac_cv_func_launch_msg" +if test "x$ac_cv_func_launch_msg" = x""yes; then : + $as_echo "#define HAVE_LAUNCHD 1" >>confdefs.h + +fi + + ac_fn_c_check_header_mongrel "$LINENO" "launch.h" "ac_cv_header_launch_h" "$ac_includes_default" +if test "x$ac_cv_header_launch_h" = x""yes; then : + $as_echo "#define HAVE_LAUNCH_H 1" >>confdefs.h + +fi + + + + case "$uname" in + Darwin*) + # Darwin, MacOS X + DEFAULT_LAUNCHD_CONF="/System/Library/LaunchDaemons/org.cups.cupsd.plist" + # liblaunch is already part of libSystem + ;; + *) + # All others; this test will need to be updated + ;; + esac +fi + + + + + + +LANGUAGES="`ls -1 locale/cups_*.po | sed -e '1,$s/locale\/cups_//' -e '1,$s/\.po//' | tr '\n' ' '`" + + +# Check whether --with-languages was given. +if test "${with_languages+set}" = set; then : + withval=$with_languages; + case "$withval" in + none | no) LANGUAGES="" ;; + all) ;; + *) LANGUAGES="$withval" ;; + esac +fi + + + + +# Check whether --with-bundledir was given. +if test "${with_bundledir+set}" = set; then : + withval=$with_bundledir; CUPS_BUNDLEDIR="$withval" +else + if test "x$uname" = xDarwin -a $uversion -ge 100; then + CUPS_BUNDLEDIR="/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" + LANGUAGES="" + else + CUPS_BUNDLEDIR="" + fi +fi + + + +if test "x$CUPS_BUNDLEDIR" != x; then + cat >>confdefs.h <<_ACEOF +#define CUPS_BUNDLEDIR "$CUPS_BUNDLEDIR" +_ACEOF + +fi + + +# Check whether --with-config_file_perm was given. +if test "${with_config_file_perm+set}" = set; then : + withval=$with_config_file_perm; CUPS_CONFIG_FILE_PERM="$withval" +else + if test "x$uname" = xDarwin; then + CUPS_CONFIG_FILE_PERM="644" + else + CUPS_CONFIG_FILE_PERM="640" + fi +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_CONFIG_FILE_PERM 0$CUPS_CONFIG_FILE_PERM +_ACEOF + + + +# Check whether --with-log_file_perm was given. +if test "${with_log_file_perm+set}" = set; then : + withval=$with_log_file_perm; CUPS_LOG_FILE_PERM="$withval" +else + CUPS_LOG_FILE_PERM="644" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_LOG_FILE_PERM 0$CUPS_LOG_FILE_PERM +_ACEOF + + + +# Check whether --with-fatal_errors was given. +if test "${with_fatal_errors+set}" = set; then : + withval=$with_fatal_errors; CUPS_FATAL_ERRORS="$withval" +else + CUPS_FATAL_ERRORS="config" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_FATAL_ERRORS "$CUPS_FATAL_ERRORS" +_ACEOF + + + + +# Check whether --with-log_level was given. +if test "${with_log_level+set}" = set; then : + withval=$with_log_level; CUPS_LOG_LEVEL="$withval" +else + CUPS_LOG_LEVEL="warn" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_LOG_LEVEL "$CUPS_LOG_LEVEL" +_ACEOF + + + +# Check whether --with-access_log_level was given. +if test "${with_access_log_level+set}" = set; then : + withval=$with_access_log_level; CUPS_ACCESS_LOG_LEVEL="$withval" +else + CUPS_ACCESS_LOG_LEVEL="actions" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_ACCESS_LOG_LEVEL "$CUPS_ACCESS_LOG_LEVEL" +_ACEOF + + +# Check whether --enable-browsing was given. +if test "${enable_browsing+set}" = set; then : + enableval=$enable_browsing; +fi + +if test "x$enable_browsing" = xno; then + CUPS_BROWSING="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSING 0 +_ACEOF + +else + CUPS_BROWSING="Yes" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSING 1 +_ACEOF + +fi + + + +# Check whether --with-local_protocols was given. +if test "${with_local_protocols+set}" = set; then : + withval=$with_local_protocols; default_local_protocols="$withval" +else + default_local_protocols="default" +fi + + +if test "x$with_local_protocols" != "xno"; then + if test "x$default_local_protocols" = "xdefault"; then + if test "x$DNSSDLIBS" != "x"; then + CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS dnssd" + else + CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS" + fi + else + CUPS_BROWSE_LOCAL_PROTOCOLS="$default_local_protocols" + fi +else + CUPS_BROWSE_LOCAL_PROTOCOLS="" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "$CUPS_BROWSE_LOCAL_PROTOCOLS" +_ACEOF + + + +# Check whether --with-remote_protocols was given. +if test "${with_remote_protocols+set}" = set; then : + withval=$with_remote_protocols; default_remote_protocols="$withval" +else + default_remote_protocols="default" +fi + + +if test "x$with_remote_protocols" != "xno"; then + if test "x$default_remote_protocols" = "xdefault"; then + if test "$uname" = "Darwin" -a $uversion -ge 90; then + CUPS_BROWSE_REMOTE_PROTOCOLS="" + else + CUPS_BROWSE_REMOTE_PROTOCOLS="CUPS" + fi + else + CUPS_BROWSE_REMOTE_PROTOCOLS="$default_remote_protocols" + fi +else + CUPS_BROWSE_REMOTE_PROTOCOLS="" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS "$CUPS_BROWSE_REMOTE_PROTOCOLS" +_ACEOF + + +# Check whether --enable-browse_short was given. +if test "${enable_browse_short+set}" = set; then : + enableval=$enable_browse_short; +fi + +if test "x$enable_browse_short" = xno; then + CUPS_BROWSE_SHORT_NAMES="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 0 +_ACEOF + +else + CUPS_BROWSE_SHORT_NAMES="Yes" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1 +_ACEOF + +fi + + +# Check whether --enable-default_shared was given. +if test "${enable_default_shared+set}" = set; then : + enableval=$enable_default_shared; +fi + +if test "x$enable_default_shared" = xno; then + CUPS_DEFAULT_SHARED="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_DEFAULT_SHARED 0 +_ACEOF + +else + CUPS_DEFAULT_SHARED="Yes" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_DEFAULT_SHARED 1 +_ACEOF + +fi + + +# Check whether --enable-implicit was given. +if test "${enable_implicit+set}" = set; then : + enableval=$enable_implicit; +fi + +if test "x$enable_implicit" = xno; then + CUPS_IMPLICIT_CLASSES="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_IMPLICIT_CLASSES 0 +_ACEOF + +else + CUPS_IMPLICIT_CLASSES="Yes" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_IMPLICIT_CLASSES 1 +_ACEOF + +fi + + +# Check whether --enable-use_network_default was given. +if test "${enable_use_network_default+set}" = set; then : + enableval=$enable_use_network_default; +fi + +if test "x$enable_use_network_default" != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use network default printers" >&5 +$as_echo_n "checking whether to use network default printers... " >&6; } + if test "x$enable_use_network_default" = xyes -o $uname != Darwin; then + CUPS_USE_NETWORK_DEFAULT="Yes" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + CUPS_USE_NETWORK_DEFAULT="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi +else + CUPS_USE_NETWORK_DEFAULT="No" + cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0 +_ACEOF + +fi + + + +# Check whether --with-cups_user was given. +if test "${with_cups_user+set}" = set; then : + withval=$with_cups_user; CUPS_USER="$withval" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default print user" >&5 +$as_echo_n "checking for default print user... " >&6; } + if test x$uname = xDarwin; then + if test x`id -u _lp 2>/dev/null` = x; then + CUPS_USER="lp"; + else + CUPS_USER="_lp"; + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_USER" >&5 +$as_echo "$CUPS_USER" >&6; } + elif test -f /etc/passwd; then + CUPS_USER="" + for user in lp lpd guest daemon nobody; do + if test "`grep \^${user}: /etc/passwd`" != ""; then + CUPS_USER="$user" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $user" >&5 +$as_echo "$user" >&6; } + break; + fi + done + + if test x$CUPS_USER = x; then + CUPS_USER="nobody" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + fi + else + CUPS_USER="nobody" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no password file" >&5 +$as_echo "no password file" >&6; } + fi +fi + + +if test "x$CUPS_USER" = "xroot" -o "x$CUPS_USER" = "x0"; then + as_fn_error $? "The default user for CUPS cannot be root!" "$LINENO" 5 +fi + + +# Check whether --with-cups_group was given. +if test "${with_cups_group+set}" = set; then : + withval=$with_cups_group; CUPS_GROUP="$withval" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default print group" >&5 +$as_echo_n "checking for default print group... " >&6; } + if test x$uname = xDarwin; then + if test x`id -g _lp 2>/dev/null` = x; then + CUPS_GROUP="lp"; + else + CUPS_GROUP="_lp"; + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_GROUP" >&5 +$as_echo "$CUPS_GROUP" >&6; } + elif test -f /etc/group; then + GROUP_LIST="_lp lp nobody" + CUPS_GROUP="" + for group in $GROUP_LIST; do + if test "`grep \^${group}: /etc/group`" != ""; then + CUPS_GROUP="$group" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $group" >&5 +$as_echo "$group" >&6; } + break; + fi + done + + if test x$CUPS_GROUP = x; then + CUPS_GROUP="nobody" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + fi + else + CUPS_GROUP="nobody" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 +$as_echo "no group file" >&6; } + fi +fi + + +if test "x$CUPS_GROUP" = "xroot" -o "x$CUPS_GROUP" = "xwheel" -o "x$CUPS_GROUP" = "x0"; then + as_fn_error $? "The default group for CUPS cannot be root!" "$LINENO" 5 +fi + + +# Check whether --with-system_groups was given. +if test "${with_system_groups+set}" = set; then : + withval=$with_system_groups; CUPS_SYSTEM_GROUPS="$withval" +else + if test x$uname = xDarwin; then + CUPS_SYSTEM_GROUPS="admin" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for default system groups" >&5 +$as_echo_n "checking for default system groups... " >&6; } + if test -f /etc/group; then + CUPS_SYSTEM_GROUPS="" + GROUP_LIST="lpadmin sys system root" + for group in $GROUP_LIST; do + if test "`grep \^${group}: /etc/group`" != ""; then + if test "x$CUPS_SYSTEM_GROUPS" = x; then + CUPS_SYSTEM_GROUPS="$group" + else + CUPS_SYSTEM_GROUPS="$CUPS_SYSTEM_GROUPS $group" + fi + fi + done + + if test "x$CUPS_SYSTEM_GROUPS" = x; then + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no groups found" >&5 +$as_echo "no groups found" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: \"$CUPS_SYSTEM_GROUPS\"" >&5 +$as_echo "\"$CUPS_SYSTEM_GROUPS\"" >&6; } + fi + else + CUPS_SYSTEM_GROUPS="$GROUP_LIST" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no group file" >&5 +$as_echo "no group file" >&6; } + fi + fi +fi + + +CUPS_PRIMARY_SYSTEM_GROUP="`echo $CUPS_SYSTEM_GROUPS | awk '{print $1}'`" + +for group in $CUPS_SYSTEM_GROUPS; do + if test "x$CUPS_GROUP" = "x$group"; then + as_fn_error $? "The default system groups cannot contain the default CUPS group!" "$LINENO" 5 + fi +done + + + + + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_USER "$CUPS_USER" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_GROUP "$CUPS_GROUP" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_SYSTEM_GROUPS "$CUPS_SYSTEM_GROUPS" +_ACEOF + + + +# Check whether --with-printcap was given. +if test "${with_printcap+set}" = set; then : + withval=$with_printcap; default_printcap="$withval" +else + default_printcap="default" +fi + + +if test x$default_printcap != xno; then + if test "x$default_printcap" = "xdefault"; then + case $uname in + Darwin*) + if test $uversion -ge 90; then + CUPS_DEFAULT_PRINTCAP="/Library/Preferences/org.cups.printers.plist" + else + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + fi + ;; + SunOS*) + CUPS_DEFAULT_PRINTCAP="/etc/printers.conf" + ;; + *) + CUPS_DEFAULT_PRINTCAP="/etc/printcap" + ;; + esac + else + CUPS_DEFAULT_PRINTCAP="$default_printcap" + fi +else + CUPS_DEFAULT_PRINTCAP="" +fi + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_PRINTCAP "$CUPS_DEFAULT_PRINTCAP" +_ACEOF + + + +# Check whether --with-lpdconfigfile was given. +if test "${with_lpdconfigfile+set}" = set; then : + withval=$with_lpdconfigfile; default_lpdconfigfile="$withval" +else + default_lpdconfigfile="default" +fi + + +if test x$default_lpdconfigfile != xno; then + if test "x$default_lpdconfigfile" = "xdefault"; then + case $uname in + Darwin*) + CUPS_DEFAULT_LPD_CONFIG_FILE="launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" + ;; + *) + if test "x$XINETD" != x; then + CUPS_DEFAULT_LPD_CONFIG_FILE="xinetd://$XINETD/cups-lpd" + else + CUPS_DEFAULT_LPD_CONFIG_FILE="" + fi + ;; + esac + else + CUPS_DEFAULT_LPD_CONFIG_FILE="$default_lpdconfigfile" + fi +else + CUPS_DEFAULT_LPD_CONFIG_FILE="" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_LPD_CONFIG_FILE "$CUPS_DEFAULT_LPD_CONFIG_FILE" +_ACEOF + + + +# Check whether --with-smbconfigfile was given. +if test "${with_smbconfigfile+set}" = set; then : + withval=$with_smbconfigfile; default_smbconfigfile="$withval" +else + default_smbconfigfile="default" +fi + + +if test x$default_smbconfigfile != xno; then + if test "x$default_smbconfigfile" = "xdefault"; then + if test -f /etc/smb.conf; then + CUPS_DEFAULT_SMB_CONFIG_FILE="samba:///etc/smb.conf" + else + CUPS_DEFAULT_SMB_CONFIG_FILE="" + fi + else + CUPS_DEFAULT_SMB_CONFIG_FILE="$default_smbconfigfile" + fi +else + CUPS_DEFAULT_SMB_CONFIG_FILE="" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_SMB_CONFIG_FILE "$CUPS_DEFAULT_SMB_CONFIG_FILE" +_ACEOF + + + +# Check whether --with-max-copies was given. +if test "${with_max_copies+set}" = set; then : + withval=$with_max_copies; CUPS_MAX_COPIES="$withval" +else + CUPS_MAX_COPIES="9999" +fi + + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_MAX_COPIES $CUPS_MAX_COPIES +_ACEOF + + +# Check whether --enable-raw_printing was given. +if test "${enable_raw_printing+set}" = set; then : + enableval=$enable_raw_printing; +fi + +if test "x$enable_raw_printing" != xno; then + DEFAULT_RAW_PRINTING="" +else + DEFAULT_RAW_PRINTING="#" +fi + + + +# Check whether --with-snmp-address was given. +if test "${with_snmp_address+set}" = set; then : + withval=$with_snmp_address; if test "x$withval" = x; then + CUPS_SNMP_ADDRESS="" + else + CUPS_SNMP_ADDRESS="Address $withval" + fi +else + if test "x$uname" = xDarwin; then + CUPS_SNMP_ADDRESS="" + else + CUPS_SNMP_ADDRESS="Address @LOCAL" + fi +fi + + + +# Check whether --with-snmp-community was given. +if test "${with_snmp_community+set}" = set; then : + withval=$with_snmp_community; CUPS_SNMP_COMMUNITY="Community $withval" +else + CUPS_SNMP_COMMUNITY="Community public" +fi + + + + + + +# Check whether --with-ipp-port was given. +if test "${with_ipp_port+set}" = set; then : + withval=$with_ipp_port; DEFAULT_IPP_PORT="$withval" +else + DEFAULT_IPP_PORT="631" +fi + + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_IPP_PORT $DEFAULT_IPP_PORT +_ACEOF + + +# Check whether --enable-bannertops was given. +if test "${enable_bannertops+set}" = set; then : + enableval=$enable_bannertops; +fi + +# Check whether --enable-texttops was given. +if test "${enable_texttops+set}" = set; then : + enableval=$enable_texttops; +fi + + +if test "x$enable_bannertops" = xno; then + BANNERTOPS="" + DEFAULT_BANNERTOPS="#" +elif test "x$enable_bannertops" = xyes; then + BANNERTOPS="bannertops" + DEFAULT_BANNERTOPS="" +elif test $uname = Darwin; then + BANNERTOPS="" + DEFAULT_BANNERTOPS="#" +else + BANNERTOPS="bannertops" + DEFAULT_BANNERTOPS="" +fi + +if test "x$enable_texttops" = xno; then + TEXTTOPS="" + DEFAULT_TEXTTOPS="#" +elif test "x$enable_texttops" = xyes; then + TEXTTOPS="texttops" + DEFAULT_TEXTTOPS="" +elif test $uname = Darwin; then + TEXTTOPS="" + DEFAULT_TEXTTOPS="#" +else + TEXTTOPS="texttops" + DEFAULT_TEXTTOPS="" +fi + + + + + + +if test "x$BANNERTOPS" = x -a "x$TEXTTOPS" = x; then + FONTS="" +else + FONTS="fonts" +fi + + + +# Check whether --enable-webif was given. +if test "${enable_webif+set}" = set; then : + enableval=$enable_webif; +fi + +case "x$enable_webif" in + xno) + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + ;; + xyes) + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + ;; + *) + if test $uname = Darwin; then + CUPS_WEBIF=No + CUPS_DEFAULT_WEBIF=0 + else + CUPS_WEBIF=Yes + CUPS_DEFAULT_WEBIF=1 + fi + ;; +esac + + +cat >>confdefs.h <<_ACEOF +#define CUPS_DEFAULT_WEBIF $CUPS_DEFAULT_WEBIF +_ACEOF + + + + + +# Check whether --with-pdftops was given. +if test "${with_pdftops+set}" = set; then : + withval=$with_pdftops; +fi + + +PDFTOPS="" +CUPS_PDFTOPS="" +CUPS_GHOSTSCRIPT="" + +case "x$with_pdftops" in + x) # Default/auto + if test $uname != Darwin; then + # Extract the first word of "pdftops", so it can be a program name with args. +set dummy pdftops; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CUPS_PDFTOPS+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CUPS_PDFTOPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_CUPS_PDFTOPS="$CUPS_PDFTOPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CUPS_PDFTOPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CUPS_PDFTOPS=$ac_cv_path_CUPS_PDFTOPS +if test -n "$CUPS_PDFTOPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_PDFTOPS" >&5 +$as_echo "$CUPS_PDFTOPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$CUPS_PDFTOPS" != x; then + $as_echo "#define HAVE_PDFTOPS 1" >>confdefs.h + + PDFTOPS="pdftops" + else + # Extract the first word of "gs", so it can be a program name with args. +set dummy gs; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CUPS_GHOSTSCRIPT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CUPS_GHOSTSCRIPT in + [\\/]* | ?:[\\/]*) + ac_cv_path_CUPS_GHOSTSCRIPT="$CUPS_GHOSTSCRIPT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CUPS_GHOSTSCRIPT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CUPS_GHOSTSCRIPT=$ac_cv_path_CUPS_GHOSTSCRIPT +if test -n "$CUPS_GHOSTSCRIPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_GHOSTSCRIPT" >&5 +$as_echo "$CUPS_GHOSTSCRIPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$CUPS_GHOSTSCRIPT" != x; then + $as_echo "#define HAVE_GHOSTSCRIPT 1" >>confdefs.h + + PDFTOPS="pdftops" + fi + fi + fi + ;; + + xgs) + # Extract the first word of "gs", so it can be a program name with args. +set dummy gs; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CUPS_GHOSTSCRIPT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CUPS_GHOSTSCRIPT in + [\\/]* | ?:[\\/]*) + ac_cv_path_CUPS_GHOSTSCRIPT="$CUPS_GHOSTSCRIPT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CUPS_GHOSTSCRIPT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CUPS_GHOSTSCRIPT=$ac_cv_path_CUPS_GHOSTSCRIPT +if test -n "$CUPS_GHOSTSCRIPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_GHOSTSCRIPT" >&5 +$as_echo "$CUPS_GHOSTSCRIPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$CUPS_GHOSTSCRIPT" != x; then + $as_echo "#define HAVE_GHOSTSCRIPT 1" >>confdefs.h + + PDFTOPS="pdftops" + else + as_fn_error $? "Unable to find gs program!" "$LINENO" 5 + exit 1 + fi + ;; + + x/*/gs) # Use /path/to/gs without any check: + CUPS_GHOSTSCRIPT="$with_pdftops" + $as_echo "#define HAVE_GHOSTSCRIPT 1" >>confdefs.h + + PDFTOPS="pdftops" + ;; + + xpdftops) + # Extract the first word of "pdftops", so it can be a program name with args. +set dummy pdftops; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CUPS_PDFTOPS+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CUPS_PDFTOPS in + [\\/]* | ?:[\\/]*) + ac_cv_path_CUPS_PDFTOPS="$CUPS_PDFTOPS" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CUPS_PDFTOPS="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CUPS_PDFTOPS=$ac_cv_path_CUPS_PDFTOPS +if test -n "$CUPS_PDFTOPS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_PDFTOPS" >&5 +$as_echo "$CUPS_PDFTOPS" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$CUPS_PDFTOPS" != x; then + $as_echo "#define HAVE_PDFTOPS 1" >>confdefs.h + + PDFTOPS="pdftops" + else + as_fn_error $? "Unable to find pdftops program!" "$LINENO" 5 + exit 1 + fi + ;; + + x/*/pdftops) # Use /path/to/pdftops without any check: + CUPS_PDFTOPS="$with_pdftops" + $as_echo "#define HAVE_PDFTOPS 1" >>confdefs.h + + PDFTOPS="pdftops" + ;; + + xnone) # Make no pdftops filter if with_pdftops=none: + ;; + + *) # Invalid with_pdftops value: + as_fn_error $? "Invalid with_pdftops value!" "$LINENO" 5 + exit 1 + ;; +esac + +if test "x$CUPS_PDFTOPS" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pdftops supports -origpagesizes" >&5 +$as_echo_n "checking whether pdftops supports -origpagesizes... " >&6; } + if ($CUPS_PDFTOPS -h 2>&1 | grep -q -- -origpagesizes); then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_PDFTOPS_WITH_ORIGPAGESIZES 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + DEFAULT_PDFTOPS="" +elif test "x$CUPS_GHOSTSCRIPT" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gs supports the ps2write device" >&5 +$as_echo_n "checking whether gs supports the ps2write device... " >&6; } + if ($CUPS_GHOSTSCRIPT -h 2>&1 | grep -q ps2write); then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_GHOSTSCRIPT_PS2WRITE 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + + DEFAULT_PDFTOPS="" +else + DEFAULT_PDFTOPS="#" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_PDFTOPS "$CUPS_PDFTOPS" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define CUPS_GHOSTSCRIPT "$CUPS_GHOSTSCRIPT" +_ACEOF + + + + + + + +# Check whether --with-java was given. +if test "${with_java+set}" = set; then : + withval=$with_java; CUPS_JAVA="$withval" +else + CUPS_JAVA="" +fi + + +if test "x$CUPS_JAVA" = x; then + # Extract the first word of "java", so it can be a program name with args. +set dummy java; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_JAVA+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $JAVA in + [\\/]* | ?:[\\/]*) + ac_cv_path_JAVA="$JAVA" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_JAVA="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +JAVA=$ac_cv_path_JAVA +if test -n "$JAVA"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 +$as_echo "$JAVA" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + CUPS_JAVA="$JAVA" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_JAVA "$CUPS_JAVA" +_ACEOF + + +if test "x$CUPS_JAVA" != x; then + $as_echo "#define HAVE_JAVA 1" >>confdefs.h + +fi + + +# Check whether --with-perl was given. +if test "${with_perl+set}" = set; then : + withval=$with_perl; CUPS_PERL="$withval" +else + CUPS_PERL="" +fi + + +if test "x$CUPS_PERL" = x; then + # Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PERL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PERL=$ac_cv_path_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + CUPS_PERL="$PERL" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_PERL "$CUPS_PERL" +_ACEOF + + +if test "x$CUPS_PERL" != x; then + $as_echo "#define HAVE_PERL 1" >>confdefs.h + +fi + + +# Check whether --with-php was given. +if test "${with_php+set}" = set; then : + withval=$with_php; CUPS_PHP="$withval" +else + CUPS_PHP="" +fi + + +if test "x$CUPS_PHP" = x; then + # Extract the first word of "php-cgi", so it can be a program name with args. +set dummy php-cgi; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PHPCGI+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PHPCGI in + [\\/]* | ?:[\\/]*) + ac_cv_path_PHPCGI="$PHPCGI" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PHPCGI="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PHPCGI=$ac_cv_path_PHPCGI +if test -n "$PHPCGI"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHPCGI" >&5 +$as_echo "$PHPCGI" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$PHPCGI" = x; then + # Extract the first word of "php", so it can be a program name with args. +set dummy php; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PHP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PHP in + [\\/]* | ?:[\\/]*) + ac_cv_path_PHP="$PHP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PHP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PHP=$ac_cv_path_PHP +if test -n "$PHP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP" >&5 +$as_echo "$PHP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + CUPS_PHP="$PHP" + else + CUPS_PHP="$PHPCGI" + fi +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_PHP "$CUPS_PHP" +_ACEOF + + +if test "x$CUPS_PHP" = x; then + CUPS_PHP="no" +else + $as_echo "#define HAVE_PHP 1" >>confdefs.h + +fi + +PHPDIR="" +if test "x$CUPS_PHP" != xno; then + # Extract the first word of "php-config", so it can be a program name with args. +set dummy php-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PHPCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PHPCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PHPCONFIG="$PHPCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PHPCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PHPCONFIG=$ac_cv_path_PHPCONFIG +if test -n "$PHPCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHPCONFIG" >&5 +$as_echo "$PHPCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test "x$PHPCONFIG" != x; then + PHPDIR="scripting/php" + fi +fi + + + + +# Check whether --with-python was given. +if test "${with_python+set}" = set; then : + withval=$with_python; CUPS_PYTHON="$withval" +else + CUPS_PYTHON="" +fi + + +if test "x$CUPS_PYTHON" = x; then + # Extract the first word of "python", so it can be a program name with args. +set dummy python; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PYTHON+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PYTHON in + [\\/]* | ?:[\\/]*) + ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PYTHON=$ac_cv_path_PYTHON +if test -n "$PYTHON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 +$as_echo "$PYTHON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + CUPS_PYTHON="$PYTHON" +fi + +cat >>confdefs.h <<_ACEOF +#define CUPS_PYTHON "$CUPS_PYTHON" +_ACEOF + + +if test "x$CUPS_PYTHON" != x; then + $as_echo "#define HAVE_PYTHON 1" >>confdefs.h + +fi + + + +INSTALL_LANGUAGES="" +UNINSTALL_LANGUAGES="" +LANGFILES="" +if test "x$LANGUAGES" != x; then + INSTALL_LANGUAGES="install-languages" + UNINSTALL_LANGUAGES="uninstall-languages" + for lang in $LANGUAGES; do + if test -f doc/$lang/index.html.in; then + LANGFILES="$LANGFILES doc/$lang/index.html" + fi + + if test -f templates/$lang/header.tmpl.in; then + LANGFILES="$LANGFILES templates/$lang/header.tmpl" + fi + done +elif test "x$CUPS_BUNDLEDIR" != x; then + INSTALL_LANGUAGES="install-langbundle" + UNINSTALL_LANGUAGES="uninstall-langbundle" +fi + + + + +ac_config_files="$ac_config_files Makedefs conf/cupsd.conf conf/mime.convs conf/pam.std conf/snmp.conf cups-config data/testprint desktop/cups.desktop doc/help/ref-cupsd-conf.html doc/help/standard.html doc/index.html man/client.conf.man man/cups-deviced.man man/cups-driverd.man man/cups-lpd.man man/cupsaddsmb.man man/cupsd.conf.man man/cupsd.man man/lpoptions.man scheduler/cups-lpd.xinetd scheduler/cups.sh scheduler/cups.xml scheduler/org.cups.cups-lpd.plist templates/header.tmpl packaging/cups.list $LANGFILES" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.67. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.67, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2010 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makedefs") CONFIG_FILES="$CONFIG_FILES Makedefs" ;; + "conf/cupsd.conf") CONFIG_FILES="$CONFIG_FILES conf/cupsd.conf" ;; + "conf/mime.convs") CONFIG_FILES="$CONFIG_FILES conf/mime.convs" ;; + "conf/pam.std") CONFIG_FILES="$CONFIG_FILES conf/pam.std" ;; + "conf/snmp.conf") CONFIG_FILES="$CONFIG_FILES conf/snmp.conf" ;; + "cups-config") CONFIG_FILES="$CONFIG_FILES cups-config" ;; + "data/testprint") CONFIG_FILES="$CONFIG_FILES data/testprint" ;; + "desktop/cups.desktop") CONFIG_FILES="$CONFIG_FILES desktop/cups.desktop" ;; + "doc/help/ref-cupsd-conf.html") CONFIG_FILES="$CONFIG_FILES doc/help/ref-cupsd-conf.html" ;; + "doc/help/standard.html") CONFIG_FILES="$CONFIG_FILES doc/help/standard.html" ;; + "doc/index.html") CONFIG_FILES="$CONFIG_FILES doc/index.html" ;; + "man/client.conf.man") CONFIG_FILES="$CONFIG_FILES man/client.conf.man" ;; + "man/cups-deviced.man") CONFIG_FILES="$CONFIG_FILES man/cups-deviced.man" ;; + "man/cups-driverd.man") CONFIG_FILES="$CONFIG_FILES man/cups-driverd.man" ;; + "man/cups-lpd.man") CONFIG_FILES="$CONFIG_FILES man/cups-lpd.man" ;; + "man/cupsaddsmb.man") CONFIG_FILES="$CONFIG_FILES man/cupsaddsmb.man" ;; + "man/cupsd.conf.man") CONFIG_FILES="$CONFIG_FILES man/cupsd.conf.man" ;; + "man/cupsd.man") CONFIG_FILES="$CONFIG_FILES man/cupsd.man" ;; + "man/lpoptions.man") CONFIG_FILES="$CONFIG_FILES man/lpoptions.man" ;; + "scheduler/cups-lpd.xinetd") CONFIG_FILES="$CONFIG_FILES scheduler/cups-lpd.xinetd" ;; + "scheduler/cups.sh") CONFIG_FILES="$CONFIG_FILES scheduler/cups.sh" ;; + "scheduler/cups.xml") CONFIG_FILES="$CONFIG_FILES scheduler/cups.xml" ;; + "scheduler/org.cups.cups-lpd.plist") CONFIG_FILES="$CONFIG_FILES scheduler/org.cups.cups-lpd.plist" ;; + "templates/header.tmpl") CONFIG_FILES="$CONFIG_FILES templates/header.tmpl" ;; + "packaging/cups.list") CONFIG_FILES="$CONFIG_FILES packaging/cups.list" ;; + "$LANGFILES") CONFIG_FILES="$CONFIG_FILES $LANGFILES" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +chmod +x cups-config + diff --git a/configure.in b/configure.in new file mode 100644 index 0000000..3ce4064 --- /dev/null +++ b/configure.in @@ -0,0 +1,98 @@ +dnl +dnl "$Id: configure.in 9939 2011-08-31 01:36:33Z mike $" +dnl +dnl Configuration script for CUPS. +dnl +dnl Copyright 2007-2010 by Apple Inc. +dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. +dnl +dnl These coded instructions, statements, and computer programs are the +dnl property of Apple Inc. and are protected by Federal copyright +dnl law. Distribution and use rights are outlined in the file "LICENSE.txt" +dnl which should have been included with this file. If this file is +dnl file is missing or damaged, see the license at "http://www.cups.org/". +dnl + +AC_INIT(cups/cups.h) + +sinclude(config-scripts/cups-opsys.m4) +sinclude(config-scripts/cups-common.m4) +sinclude(config-scripts/cups-directories.m4) +sinclude(config-scripts/cups-manpages.m4) + +sinclude(config-scripts/cups-3264.m4) +sinclude(config-scripts/cups-sharedlibs.m4) +sinclude(config-scripts/cups-libtool.m4) +sinclude(config-scripts/cups-compiler.m4) + +sinclude(config-scripts/cups-image.m4) +sinclude(config-scripts/cups-network.m4) +sinclude(config-scripts/cups-poll.m4) +sinclude(config-scripts/cups-slp.m4) +sinclude(config-scripts/cups-gssapi.m4) +sinclude(config-scripts/cups-ldap.m4) +sinclude(config-scripts/cups-threads.m4) +sinclude(config-scripts/cups-ssl.m4) +sinclude(config-scripts/cups-pam.m4) +sinclude(config-scripts/cups-largefile.m4) +sinclude(config-scripts/cups-dnssd.m4) +sinclude(config-scripts/cups-launchd.m4) +sinclude(config-scripts/cups-defaults.m4) +sinclude(config-scripts/cups-pdf.m4) +sinclude(config-scripts/cups-scripting.m4) + +INSTALL_LANGUAGES="" +UNINSTALL_LANGUAGES="" +LANGFILES="" +if test "x$LANGUAGES" != x; then + INSTALL_LANGUAGES="install-languages" + UNINSTALL_LANGUAGES="uninstall-languages" + for lang in $LANGUAGES; do + if test -f doc/$lang/index.html.in; then + LANGFILES="$LANGFILES doc/$lang/index.html" + fi + + if test -f templates/$lang/header.tmpl.in; then + LANGFILES="$LANGFILES templates/$lang/header.tmpl" + fi + done +elif test "x$CUPS_BUNDLEDIR" != x; then + INSTALL_LANGUAGES="install-langbundle" + UNINSTALL_LANGUAGES="uninstall-langbundle" +fi + +AC_SUBST(INSTALL_LANGUAGES) +AC_SUBST(UNINSTALL_LANGUAGES) + +AC_OUTPUT(Makedefs + conf/cupsd.conf + conf/mime.convs + conf/pam.std + conf/snmp.conf + cups-config + data/testprint + desktop/cups.desktop + doc/help/ref-cupsd-conf.html + doc/help/standard.html + doc/index.html + man/client.conf.man + man/cups-deviced.man + man/cups-driverd.man + man/cups-lpd.man + man/cupsaddsmb.man + man/cupsd.conf.man + man/cupsd.man + man/lpoptions.man + scheduler/cups-lpd.xinetd + scheduler/cups.sh + scheduler/cups.xml + scheduler/org.cups.cups-lpd.plist + templates/header.tmpl + packaging/cups.list + $LANGFILES) + +chmod +x cups-config + +dnl +dnl End of "$Id: configure.in 9939 2011-08-31 01:36:33Z mike $". +dnl diff --git a/cups-config.in b/cups-config.in new file mode 100755 index 0000000..2cdeca8 --- /dev/null +++ b/cups-config.in @@ -0,0 +1,160 @@ +#! /bin/sh +# +# "$Id: cups-config.in 9153 2010-06-16 00:48:25Z mike $" +# +# CUPS configuration utility. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 2001-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +VERSION="@CUPS_VERSION@" +APIVERSION="1.5" +BUILD="@CUPS_BUILD@" + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +includedir=@includedir@ +libdir=@libdir@ +imagelibdir=@libdir@ +datarootdir=@datadir@ +datadir=@datadir@ +sysconfdir=@sysconfdir@ +cups_datadir=@CUPS_DATADIR@ +cups_serverbin=@CUPS_SERVERBIN@ +cups_serverroot=@CUPS_SERVERROOT@ +INSTALLSTATIC=@INSTALLSTATIC@ + +# flags for C++ compiler: +CFLAGS="" +LDFLAGS="@EXPORT_LDFLAGS@" +LIBS="@LIBGSSAPI@ @EXPORT_SSLLIBS@ @EXPORT_LIBZ@ @LIBS@" +IMGLIBS="@EXPORT_LIBTIFF@ @EXPORT_LIBJPEG@ @EXPORT_LIBPNG@" + +# Check for local invocation... +selfdir=`dirname $0` + +if test -f "$selfdir/cups/cups.h"; then + CFLAGS="-I$selfdir" + LDFLAGS="-L$selfdir/cups -L$selfdir/filter $LDFLAGS" + libdir="$selfdir/cups" + imagelibdir="$selfdir/filter" + if test ! -f "$selfdir/cups/raster.h"; then + ln -s ../filter/raster.h "$selfdir/cups" + fi +else + if test $includedir != /usr/include; then + CFLAGS="$CFLAGS -I$includedir" + fi + + if test $libdir != /usr/lib -a $libdir != /usr/lib32 -a $libdir != /usr/lib64; then + LDFLAGS="$LDFLAGS -L$libdir" + fi +fi + + +usage () +{ + echo "Usage: cups-config --api-version" + echo " cups-config --build" + echo " cups-config --cflags" + echo " cups-config --datadir" + echo " cups-config --help" + echo " cups-config --ldflags" + echo " cups-config [--driver] [--image] [--static] --libs" + echo " cups-config --serverbin" + echo " cups-config --serverroot" + echo " cups-config --version" + + exit $1 +} + +if test $# -eq 0; then + usage 1 +fi + +# Parse command line options +static=no +image=no +driver=no + +while test $# -gt 0; do + case $1 in + --api-version) + echo $APIVERSION + ;; + --build) + echo $BUILD + ;; + --cflags) + echo $CFLAGS + ;; + --datadir) + echo $cups_datadir + ;; + --driver) + driver=yes + ;; + --help) + usage 0 + ;; + --image) + image=yes + ;; + --ldflags) + echo $LDFLAGS + ;; + --libs) + if test $static = no; then + libs="@EXTLINKCUPS@ $LIBS"; + if test $image = yes; then + libs="@EXTLINKCUPSIMAGE@ $libs" + fi + if test $driver = yes; then + libs="@EXTLINKCUPSDRIVER@ $libs" + fi + else + libs="$libdir/libcups.a $LIBS"; + if test $image = yes; then + libs="$libdir/libcupsimage.a $IMGLIBS $libs" + fi + if test $driver = yes; then + libs="$libdir/libcupsdriver.a $libs" + fi + fi + echo $libs + ;; + --serverbin) + echo $cups_serverbin + ;; + --serverroot) + echo $cups_serverroot + ;; + --static) + if test -z "$INSTALLSTATIC"; then + echo "WARNING: Static libraries not installed!" >&2 + else + static=yes + fi + ;; + --version) + echo $VERSION + ;; + *) + usage 1 + ;; + esac + + shift +done + +# +# End of "$Id: cups-config.in 9153 2010-06-16 00:48:25Z mike $". +# diff --git a/cups.manifest b/cups.manifest new file mode 100644 index 0000000..0f46132 --- /dev/null +++ b/cups.manifest @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cups/Dependencies b/cups/Dependencies new file mode 100644 index 0000000..e2d4516 --- /dev/null +++ b/cups/Dependencies @@ -0,0 +1,813 @@ +# DO NOT DELETE + +adminutil.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +adminutil.o: array.h language.h string-private.h ../config.h debug-private.h +adminutil.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +adminutil.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +adminutil.o: ipp-private.h ../cups/ipp.h language-private.h +adminutil.o: ../cups/transcode.h thread-private.h adminutil.h +array.o: string-private.h ../config.h debug-private.h ../cups/versioning.h +array.o: array-private.h ../cups/array.h versioning.h +attr.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +attr.o: array.h language.h string-private.h ../config.h debug-private.h +attr.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +attr.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +attr.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +auth.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +auth.o: array.h language.h string-private.h ../config.h debug-private.h +auth.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +auth.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +auth.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +backchannel.o: cups.h +backend.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +backend.o: array.h language.h string-private.h ../config.h debug-private.h +backend.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +backend.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +backend.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +backend.o: thread-private.h backend.h +conflicts.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +conflicts.o: array.h language.h string-private.h ../config.h debug-private.h +conflicts.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +conflicts.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +conflicts.o: ipp-private.h ../cups/ipp.h language-private.h +conflicts.o: ../cups/transcode.h thread-private.h +custom.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +custom.o: array.h language.h string-private.h ../config.h debug-private.h +custom.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +custom.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +custom.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +custom.o: thread-private.h +debug.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +debug.o: array.h language.h string-private.h ../config.h debug-private.h +debug.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +debug.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +debug.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +debug.o: thread-private.h +dest.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +dest.o: array.h language.h string-private.h ../config.h debug-private.h +dest.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +dest.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +dest.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +dir.o: string-private.h ../config.h debug-private.h ../cups/versioning.h +dir.o: dir.h versioning.h +emit.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +emit.o: array.h language.h string-private.h ../config.h debug-private.h +emit.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +emit.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +emit.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +encode.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +encode.o: array.h language.h string-private.h ../config.h debug-private.h +encode.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +encode.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +encode.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +encode.o: thread-private.h +file.o: file-private.h cups-private.h ../cups/cups.h file.h versioning.h +file.o: ipp.h http.h array.h language.h string-private.h ../config.h +file.o: debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h +file.o: cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h +file.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +file.o: thread-private.h +getdevices.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getdevices.o: array.h language.h string-private.h ../config.h debug-private.h +getdevices.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getdevices.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +getdevices.o: ipp-private.h ../cups/ipp.h language-private.h +getdevices.o: ../cups/transcode.h thread-private.h +getifaddrs.o: http-private.h ../config.h ../cups/http.h md5-private.h +getifaddrs.o: ipp-private.h ../cups/ipp.h +getputfile.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getputfile.o: array.h language.h string-private.h ../config.h debug-private.h +getputfile.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getputfile.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +getputfile.o: ipp-private.h ../cups/ipp.h language-private.h +getputfile.o: ../cups/transcode.h thread-private.h +globals.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +globals.o: array.h language.h string-private.h ../config.h debug-private.h +globals.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +globals.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +globals.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +globals.o: thread-private.h +http.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http.o: array.h language.h string-private.h ../config.h debug-private.h +http.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +http.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +http.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +http-addr.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http-addr.o: array.h language.h string-private.h ../config.h debug-private.h +http-addr.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +http-addr.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +http-addr.o: ipp-private.h ../cups/ipp.h language-private.h +http-addr.o: ../cups/transcode.h thread-private.h +http-addrlist.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-addrlist.o: http.h array.h language.h string-private.h ../config.h +http-addrlist.o: debug-private.h ../cups/versioning.h ppd-private.h +http-addrlist.o: ../cups/ppd.h cups.h pwg-private.h http-private.h +http-addrlist.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-addrlist.o: language-private.h ../cups/transcode.h thread-private.h +http-support.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-support.o: http.h array.h language.h string-private.h ../config.h +http-support.o: debug-private.h ../cups/versioning.h ppd-private.h +http-support.o: ../cups/ppd.h cups.h pwg-private.h http-private.h +http-support.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-support.o: language-private.h ../cups/transcode.h thread-private.h +ipp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ipp.o: language.h string-private.h ../config.h debug-private.h +ipp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ipp.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +ipp.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ipp-support.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ipp-support.o: array.h language.h string-private.h ../config.h +ipp-support.o: debug-private.h ../cups/versioning.h ppd-private.h +ipp-support.o: ../cups/ppd.h cups.h pwg-private.h http-private.h +ipp-support.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +ipp-support.o: language-private.h ../cups/transcode.h thread-private.h +langprintf.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +langprintf.o: array.h language.h string-private.h ../config.h debug-private.h +langprintf.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +langprintf.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +langprintf.o: ipp-private.h ../cups/ipp.h language-private.h +langprintf.o: ../cups/transcode.h thread-private.h +language.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +language.o: array.h language.h string-private.h ../config.h debug-private.h +language.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +language.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +language.o: ipp-private.h ../cups/ipp.h language-private.h +language.o: ../cups/transcode.h thread-private.h +localize.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +localize.o: array.h language.h string-private.h ../config.h debug-private.h +localize.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +localize.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +localize.o: ipp-private.h ../cups/ipp.h language-private.h +localize.o: ../cups/transcode.h thread-private.h +mark.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +mark.o: array.h language.h string-private.h ../config.h debug-private.h +mark.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +mark.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +mark.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +md5.o: md5-private.h string-private.h ../config.h +md5passwd.o: http-private.h ../config.h ../cups/http.h md5-private.h +md5passwd.o: ipp-private.h ../cups/ipp.h string-private.h +notify.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +notify.o: array.h language.h string-private.h ../config.h debug-private.h +notify.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +notify.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +notify.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +notify.o: thread-private.h +options.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +options.o: array.h language.h string-private.h ../config.h debug-private.h +options.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +options.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +options.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +options.o: thread-private.h +page.o: string-private.h ../config.h debug-private.h ../cups/versioning.h +page.o: ppd.h cups.h array.h versioning.h file.h +ppd.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ppd.o: language.h string-private.h ../config.h debug-private.h +ppd.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ppd.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +ppd.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ppd-cache.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ppd-cache.o: array.h language.h string-private.h ../config.h debug-private.h +ppd-cache.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +ppd-cache.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +ppd-cache.o: ipp-private.h ../cups/ipp.h language-private.h +ppd-cache.o: ../cups/transcode.h thread-private.h +pwg-media.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +pwg-media.o: array.h language.h string-private.h ../config.h debug-private.h +pwg-media.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +pwg-media.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +pwg-media.o: ipp-private.h ../cups/ipp.h language-private.h +pwg-media.o: ../cups/transcode.h thread-private.h +request.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +request.o: array.h language.h string-private.h ../config.h debug-private.h +request.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +request.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +request.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +request.o: thread-private.h +sidechannel.o: sidechannel.h versioning.h string-private.h ../config.h +sidechannel.o: debug-private.h ../cups/versioning.h +snmp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +snmp.o: array.h language.h string-private.h ../config.h debug-private.h +snmp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +snmp.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +snmp.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +snmp.o: snmp-private.h +snprintf.o: string-private.h ../config.h +string.o: string-private.h ../config.h debug-private.h ../cups/versioning.h +string.o: thread-private.h array.h versioning.h +tempfile.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +tempfile.o: array.h language.h string-private.h ../config.h debug-private.h +tempfile.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +tempfile.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +tempfile.o: ipp-private.h ../cups/ipp.h language-private.h +tempfile.o: ../cups/transcode.h thread-private.h +thread.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +thread.o: array.h language.h string-private.h ../config.h debug-private.h +thread.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +thread.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +thread.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +thread.o: thread-private.h +transcode.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +transcode.o: array.h language.h string-private.h ../config.h debug-private.h +transcode.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +transcode.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +transcode.o: ipp-private.h ../cups/ipp.h language-private.h +transcode.o: ../cups/transcode.h thread-private.h +usersys.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +usersys.o: array.h language.h string-private.h ../config.h debug-private.h +usersys.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +usersys.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +usersys.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +usersys.o: thread-private.h +util.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +util.o: array.h language.h string-private.h ../config.h debug-private.h +util.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +util.o: http-private.h ../cups/http.h md5-private.h ipp-private.h +util.o: ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +testadmin.o: adminutil.h cups.h string-private.h ../config.h +testarray.o: string-private.h ../config.h debug-private.h +testarray.o: ../cups/versioning.h array.h versioning.h dir.h +testconflicts.o: cups.h ppd.h array.h versioning.h file.h string-private.h +testconflicts.o: ../config.h +testcups.o: string-private.h ../config.h cups.h ppd.h array.h versioning.h +testcups.o: file.h +testfile.o: string-private.h ../config.h debug-private.h ../cups/versioning.h +testfile.o: file.h versioning.h +testhttp.o: string-private.h ../config.h http-private.h ../cups/http.h +testhttp.o: md5-private.h ipp-private.h ../cups/ipp.h +testi18n.o: string-private.h ../config.h language-private.h +testi18n.o: ../cups/transcode.h language.h array.h versioning.h +testipp.o: file.h versioning.h string-private.h ../config.h ipp-private.h +testipp.o: ../cups/ipp.h +testoptions.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testoptions.o: array.h language.h string-private.h ../config.h +testoptions.o: debug-private.h ../cups/versioning.h ppd-private.h +testoptions.o: ../cups/ppd.h cups.h pwg-private.h http-private.h +testoptions.o: ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +testoptions.o: language-private.h ../cups/transcode.h thread-private.h +testlang.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testlang.o: array.h language.h string-private.h ../config.h debug-private.h +testlang.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testlang.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +testlang.o: ipp-private.h ../cups/ipp.h language-private.h +testlang.o: ../cups/transcode.h thread-private.h +testppd.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testppd.o: array.h language.h string-private.h ../config.h debug-private.h +testppd.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testppd.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +testppd.o: ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +testppd.o: thread-private.h +testpwg.o: ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testpwg.o: array.h language.h ../cups/ppd.h cups.h pwg-private.h +testpwg.o: file-private.h cups-private.h string-private.h ../config.h +testpwg.o: debug-private.h ../cups/versioning.h http-private.h ../cups/http.h +testpwg.o: md5-private.h ipp-private.h ../cups/ipp.h language-private.h +testpwg.o: ../cups/transcode.h thread-private.h +testsnmp.o: cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testsnmp.o: array.h language.h string-private.h ../config.h debug-private.h +testsnmp.o: ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testsnmp.o: pwg-private.h http-private.h ../cups/http.h md5-private.h +testsnmp.o: ipp-private.h ../cups/ipp.h language-private.h +testsnmp.o: ../cups/transcode.h thread-private.h snmp-private.h +# DO NOT DELETE + +adminutil.32.o: adminutil.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +adminutil.32.o: adminutil.c array.h language.h string-private.h ../config.h debug-private.h +adminutil.32.o: adminutil.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +adminutil.32.o: adminutil.c pwg-private.h http-private.h ../cups/http.h md5-private.h +adminutil.32.o: adminutil.c ipp-private.h ../cups/ipp.h language-private.h +adminutil.32.o: adminutil.c ../cups/transcode.h thread-private.h adminutil.h +array.32.o: array.c string-private.h ../config.h debug-private.h ../cups/versioning.h +array.32.o: array.c array-private.h ../cups/array.h versioning.h +attr.32.o: attr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +attr.32.o: attr.c array.h language.h string-private.h ../config.h debug-private.h +attr.32.o: attr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +attr.32.o: attr.c http-private.h ../cups/http.h md5-private.h ipp-private.h +attr.32.o: attr.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +auth.32.o: auth.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +auth.32.o: auth.c array.h language.h string-private.h ../config.h debug-private.h +auth.32.o: auth.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +auth.32.o: auth.c http-private.h ../cups/http.h md5-private.h ipp-private.h +auth.32.o: auth.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +backchannel.32.o: backchannel.c cups.h +backend.32.o: backend.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +backend.32.o: backend.c array.h language.h string-private.h ../config.h debug-private.h +backend.32.o: backend.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +backend.32.o: backend.c pwg-private.h http-private.h ../cups/http.h md5-private.h +backend.32.o: backend.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +backend.32.o: backend.c thread-private.h backend.h +conflicts.32.o: conflicts.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +conflicts.32.o: conflicts.c array.h language.h string-private.h ../config.h debug-private.h +conflicts.32.o: conflicts.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +conflicts.32.o: conflicts.c pwg-private.h http-private.h ../cups/http.h md5-private.h +conflicts.32.o: conflicts.c ipp-private.h ../cups/ipp.h language-private.h +conflicts.32.o: conflicts.c ../cups/transcode.h thread-private.h +custom.32.o: custom.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +custom.32.o: custom.c array.h language.h string-private.h ../config.h debug-private.h +custom.32.o: custom.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +custom.32.o: custom.c pwg-private.h http-private.h ../cups/http.h md5-private.h +custom.32.o: custom.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +custom.32.o: custom.c thread-private.h +debug.32.o: debug.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +debug.32.o: debug.c array.h language.h string-private.h ../config.h debug-private.h +debug.32.o: debug.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +debug.32.o: debug.c pwg-private.h http-private.h ../cups/http.h md5-private.h +debug.32.o: debug.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +debug.32.o: debug.c thread-private.h +dest.32.o: dest.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +dest.32.o: dest.c array.h language.h string-private.h ../config.h debug-private.h +dest.32.o: dest.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +dest.32.o: dest.c http-private.h ../cups/http.h md5-private.h ipp-private.h +dest.32.o: dest.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +dir.32.o: dir.c string-private.h ../config.h debug-private.h ../cups/versioning.h +dir.32.o: dir.c dir.h versioning.h +emit.32.o: emit.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +emit.32.o: emit.c array.h language.h string-private.h ../config.h debug-private.h +emit.32.o: emit.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +emit.32.o: emit.c http-private.h ../cups/http.h md5-private.h ipp-private.h +emit.32.o: emit.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +encode.32.o: encode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +encode.32.o: encode.c array.h language.h string-private.h ../config.h debug-private.h +encode.32.o: encode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +encode.32.o: encode.c pwg-private.h http-private.h ../cups/http.h md5-private.h +encode.32.o: encode.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +encode.32.o: encode.c thread-private.h +file.32.o: file.c file-private.h cups-private.h ../cups/cups.h file.h versioning.h +file.32.o: file.c ipp.h http.h array.h language.h string-private.h ../config.h +file.32.o: file.c debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h +file.32.o: file.c cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h +file.32.o: file.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +file.32.o: file.c thread-private.h +getdevices.32.o: getdevices.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getdevices.32.o: getdevices.c array.h language.h string-private.h ../config.h debug-private.h +getdevices.32.o: getdevices.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getdevices.32.o: getdevices.c pwg-private.h http-private.h ../cups/http.h md5-private.h +getdevices.32.o: getdevices.c ipp-private.h ../cups/ipp.h language-private.h +getdevices.32.o: getdevices.c ../cups/transcode.h thread-private.h +getifaddrs.32.o: getifaddrs.c http-private.h ../config.h ../cups/http.h md5-private.h +getifaddrs.32.o: getifaddrs.c ipp-private.h ../cups/ipp.h +getputfile.32.o: getputfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getputfile.32.o: getputfile.c array.h language.h string-private.h ../config.h debug-private.h +getputfile.32.o: getputfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getputfile.32.o: getputfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h +getputfile.32.o: getputfile.c ipp-private.h ../cups/ipp.h language-private.h +getputfile.32.o: getputfile.c ../cups/transcode.h thread-private.h +globals.32.o: globals.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +globals.32.o: globals.c array.h language.h string-private.h ../config.h debug-private.h +globals.32.o: globals.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +globals.32.o: globals.c pwg-private.h http-private.h ../cups/http.h md5-private.h +globals.32.o: globals.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +globals.32.o: globals.c thread-private.h +http.32.o: http.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http.32.o: http.c array.h language.h string-private.h ../config.h debug-private.h +http.32.o: http.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +http.32.o: http.c http-private.h ../cups/http.h md5-private.h ipp-private.h +http.32.o: http.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +http-addr.32.o: http-addr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http-addr.32.o: http-addr.c array.h language.h string-private.h ../config.h debug-private.h +http-addr.32.o: http-addr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +http-addr.32.o: http-addr.c pwg-private.h http-private.h ../cups/http.h md5-private.h +http-addr.32.o: http-addr.c ipp-private.h ../cups/ipp.h language-private.h +http-addr.32.o: http-addr.c ../cups/transcode.h thread-private.h +http-addrlist.32.o: http-addrlist.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-addrlist.32.o: http-addrlist.c http.h array.h language.h string-private.h ../config.h +http-addrlist.32.o: http-addrlist.c debug-private.h ../cups/versioning.h ppd-private.h +http-addrlist.32.o: http-addrlist.c ../cups/ppd.h cups.h pwg-private.h http-private.h +http-addrlist.32.o: http-addrlist.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-addrlist.32.o: http-addrlist.c language-private.h ../cups/transcode.h thread-private.h +http-support.32.o: http-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-support.32.o: http-support.c http.h array.h language.h string-private.h ../config.h +http-support.32.o: http-support.c debug-private.h ../cups/versioning.h ppd-private.h +http-support.32.o: http-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h +http-support.32.o: http-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-support.32.o: http-support.c language-private.h ../cups/transcode.h thread-private.h +ipp.32.o: ipp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ipp.32.o: ipp.c language.h string-private.h ../config.h debug-private.h +ipp.32.o: ipp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ipp.32.o: ipp.c http-private.h ../cups/http.h md5-private.h ipp-private.h +ipp.32.o: ipp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ipp-support.32.o: ipp-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ipp-support.32.o: ipp-support.c array.h language.h string-private.h ../config.h +ipp-support.32.o: ipp-support.c debug-private.h ../cups/versioning.h ppd-private.h +ipp-support.32.o: ipp-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h +ipp-support.32.o: ipp-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +ipp-support.32.o: ipp-support.c language-private.h ../cups/transcode.h thread-private.h +langprintf.32.o: langprintf.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +langprintf.32.o: langprintf.c array.h language.h string-private.h ../config.h debug-private.h +langprintf.32.o: langprintf.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +langprintf.32.o: langprintf.c pwg-private.h http-private.h ../cups/http.h md5-private.h +langprintf.32.o: langprintf.c ipp-private.h ../cups/ipp.h language-private.h +langprintf.32.o: langprintf.c ../cups/transcode.h thread-private.h +language.32.o: language.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +language.32.o: language.c array.h language.h string-private.h ../config.h debug-private.h +language.32.o: language.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +language.32.o: language.c pwg-private.h http-private.h ../cups/http.h md5-private.h +language.32.o: language.c ipp-private.h ../cups/ipp.h language-private.h +language.32.o: language.c ../cups/transcode.h thread-private.h +localize.32.o: localize.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +localize.32.o: localize.c array.h language.h string-private.h ../config.h debug-private.h +localize.32.o: localize.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +localize.32.o: localize.c pwg-private.h http-private.h ../cups/http.h md5-private.h +localize.32.o: localize.c ipp-private.h ../cups/ipp.h language-private.h +localize.32.o: localize.c ../cups/transcode.h thread-private.h +mark.32.o: mark.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +mark.32.o: mark.c array.h language.h string-private.h ../config.h debug-private.h +mark.32.o: mark.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +mark.32.o: mark.c http-private.h ../cups/http.h md5-private.h ipp-private.h +mark.32.o: mark.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +md5.32.o: md5.c md5-private.h string-private.h ../config.h +md5passwd.32.o: md5passwd.c http-private.h ../config.h ../cups/http.h md5-private.h +md5passwd.32.o: md5passwd.c ipp-private.h ../cups/ipp.h string-private.h +notify.32.o: notify.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +notify.32.o: notify.c array.h language.h string-private.h ../config.h debug-private.h +notify.32.o: notify.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +notify.32.o: notify.c pwg-private.h http-private.h ../cups/http.h md5-private.h +notify.32.o: notify.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +notify.32.o: notify.c thread-private.h +options.32.o: options.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +options.32.o: options.c array.h language.h string-private.h ../config.h debug-private.h +options.32.o: options.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +options.32.o: options.c pwg-private.h http-private.h ../cups/http.h md5-private.h +options.32.o: options.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +options.32.o: options.c thread-private.h +page.32.o: page.c string-private.h ../config.h debug-private.h ../cups/versioning.h +page.32.o: page.c ppd.h cups.h array.h versioning.h file.h +ppd.32.o: ppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ppd.32.o: ppd.c language.h string-private.h ../config.h debug-private.h +ppd.32.o: ppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ppd.32.o: ppd.c http-private.h ../cups/http.h md5-private.h ipp-private.h +ppd.32.o: ppd.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ppd-cache.32.o: ppd-cache.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ppd-cache.32.o: ppd-cache.c array.h language.h string-private.h ../config.h debug-private.h +ppd-cache.32.o: ppd-cache.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +ppd-cache.32.o: ppd-cache.c pwg-private.h http-private.h ../cups/http.h md5-private.h +ppd-cache.32.o: ppd-cache.c ipp-private.h ../cups/ipp.h language-private.h +ppd-cache.32.o: ppd-cache.c ../cups/transcode.h thread-private.h +pwg-media.32.o: pwg-media.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +pwg-media.32.o: pwg-media.c array.h language.h string-private.h ../config.h debug-private.h +pwg-media.32.o: pwg-media.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +pwg-media.32.o: pwg-media.c pwg-private.h http-private.h ../cups/http.h md5-private.h +pwg-media.32.o: pwg-media.c ipp-private.h ../cups/ipp.h language-private.h +pwg-media.32.o: pwg-media.c ../cups/transcode.h thread-private.h +request.32.o: request.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +request.32.o: request.c array.h language.h string-private.h ../config.h debug-private.h +request.32.o: request.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +request.32.o: request.c pwg-private.h http-private.h ../cups/http.h md5-private.h +request.32.o: request.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +request.32.o: request.c thread-private.h +sidechannel.32.o: sidechannel.c sidechannel.h versioning.h string-private.h ../config.h +sidechannel.32.o: sidechannel.c debug-private.h ../cups/versioning.h +snmp.32.o: snmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +snmp.32.o: snmp.c array.h language.h string-private.h ../config.h debug-private.h +snmp.32.o: snmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +snmp.32.o: snmp.c http-private.h ../cups/http.h md5-private.h ipp-private.h +snmp.32.o: snmp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +snmp.32.o: snmp.c snmp-private.h +snprintf.32.o: snprintf.c string-private.h ../config.h +string.32.o: string.c string-private.h ../config.h debug-private.h ../cups/versioning.h +string.32.o: string.c thread-private.h array.h versioning.h +tempfile.32.o: tempfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +tempfile.32.o: tempfile.c array.h language.h string-private.h ../config.h debug-private.h +tempfile.32.o: tempfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +tempfile.32.o: tempfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h +tempfile.32.o: tempfile.c ipp-private.h ../cups/ipp.h language-private.h +tempfile.32.o: tempfile.c ../cups/transcode.h thread-private.h +thread.32.o: thread.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +thread.32.o: thread.c array.h language.h string-private.h ../config.h debug-private.h +thread.32.o: thread.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +thread.32.o: thread.c pwg-private.h http-private.h ../cups/http.h md5-private.h +thread.32.o: thread.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +thread.32.o: thread.c thread-private.h +transcode.32.o: transcode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +transcode.32.o: transcode.c array.h language.h string-private.h ../config.h debug-private.h +transcode.32.o: transcode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +transcode.32.o: transcode.c pwg-private.h http-private.h ../cups/http.h md5-private.h +transcode.32.o: transcode.c ipp-private.h ../cups/ipp.h language-private.h +transcode.32.o: transcode.c ../cups/transcode.h thread-private.h +usersys.32.o: usersys.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +usersys.32.o: usersys.c array.h language.h string-private.h ../config.h debug-private.h +usersys.32.o: usersys.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +usersys.32.o: usersys.c pwg-private.h http-private.h ../cups/http.h md5-private.h +usersys.32.o: usersys.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +usersys.32.o: usersys.c thread-private.h +util.32.o: util.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +util.32.o: util.c array.h language.h string-private.h ../config.h debug-private.h +util.32.o: util.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +util.32.o: util.c http-private.h ../cups/http.h md5-private.h ipp-private.h +util.32.o: util.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +testadmin.32.o: testadmin.c adminutil.h cups.h string-private.h ../config.h +testarray.32.o: testarray.c string-private.h ../config.h debug-private.h +testarray.32.o: testarray.c ../cups/versioning.h array.h versioning.h dir.h +testconflicts.32.o: testconflicts.c cups.h ppd.h array.h versioning.h file.h string-private.h +testconflicts.32.o: testconflicts.c ../config.h +testcups.32.o: testcups.c string-private.h ../config.h cups.h ppd.h array.h versioning.h +testcups.32.o: testcups.c file.h +testfile.32.o: testfile.c string-private.h ../config.h debug-private.h ../cups/versioning.h +testfile.32.o: testfile.c file.h versioning.h +testhttp.32.o: testhttp.c string-private.h ../config.h http-private.h ../cups/http.h +testhttp.32.o: testhttp.c md5-private.h ipp-private.h ../cups/ipp.h +testi18n.32.o: testi18n.c string-private.h ../config.h language-private.h +testi18n.32.o: testi18n.c ../cups/transcode.h language.h array.h versioning.h +testipp.32.o: testipp.c file.h versioning.h string-private.h ../config.h ipp-private.h +testipp.32.o: testipp.c ../cups/ipp.h +testoptions.32.o: testoptions.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testoptions.32.o: testoptions.c array.h language.h string-private.h ../config.h +testoptions.32.o: testoptions.c debug-private.h ../cups/versioning.h ppd-private.h +testoptions.32.o: testoptions.c ../cups/ppd.h cups.h pwg-private.h http-private.h +testoptions.32.o: testoptions.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +testoptions.32.o: testoptions.c language-private.h ../cups/transcode.h thread-private.h +testlang.32.o: testlang.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testlang.32.o: testlang.c array.h language.h string-private.h ../config.h debug-private.h +testlang.32.o: testlang.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testlang.32.o: testlang.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testlang.32.o: testlang.c ipp-private.h ../cups/ipp.h language-private.h +testlang.32.o: testlang.c ../cups/transcode.h thread-private.h +testppd.32.o: testppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testppd.32.o: testppd.c array.h language.h string-private.h ../config.h debug-private.h +testppd.32.o: testppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testppd.32.o: testppd.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testppd.32.o: testppd.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +testppd.32.o: testppd.c thread-private.h +testpwg.32.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testpwg.32.o: testpwg.c array.h language.h ../cups/ppd.h cups.h pwg-private.h +testpwg.32.o: testpwg.c file-private.h cups-private.h string-private.h ../config.h +testpwg.32.o: testpwg.c debug-private.h ../cups/versioning.h http-private.h ../cups/http.h +testpwg.32.o: testpwg.c md5-private.h ipp-private.h ../cups/ipp.h language-private.h +testpwg.32.o: testpwg.c ../cups/transcode.h thread-private.h +testsnmp.32.o: testsnmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testsnmp.32.o: testsnmp.c array.h language.h string-private.h ../config.h debug-private.h +testsnmp.32.o: testsnmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testsnmp.32.o: testsnmp.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testsnmp.32.o: testsnmp.c ipp-private.h ../cups/ipp.h language-private.h +testsnmp.32.o: testsnmp.c ../cups/transcode.h thread-private.h snmp-private.h +# DO NOT DELETE + +adminutil.64.o: adminutil.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +adminutil.64.o: adminutil.c array.h language.h string-private.h ../config.h debug-private.h +adminutil.64.o: adminutil.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +adminutil.64.o: adminutil.c pwg-private.h http-private.h ../cups/http.h md5-private.h +adminutil.64.o: adminutil.c ipp-private.h ../cups/ipp.h language-private.h +adminutil.64.o: adminutil.c ../cups/transcode.h thread-private.h adminutil.h +array.64.o: array.c string-private.h ../config.h debug-private.h ../cups/versioning.h +array.64.o: array.c array-private.h ../cups/array.h versioning.h +attr.64.o: attr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +attr.64.o: attr.c array.h language.h string-private.h ../config.h debug-private.h +attr.64.o: attr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +attr.64.o: attr.c http-private.h ../cups/http.h md5-private.h ipp-private.h +attr.64.o: attr.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +auth.64.o: auth.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +auth.64.o: auth.c array.h language.h string-private.h ../config.h debug-private.h +auth.64.o: auth.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +auth.64.o: auth.c http-private.h ../cups/http.h md5-private.h ipp-private.h +auth.64.o: auth.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +backchannel.64.o: backchannel.c cups.h +backend.64.o: backend.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +backend.64.o: backend.c array.h language.h string-private.h ../config.h debug-private.h +backend.64.o: backend.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +backend.64.o: backend.c pwg-private.h http-private.h ../cups/http.h md5-private.h +backend.64.o: backend.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +backend.64.o: backend.c thread-private.h backend.h +conflicts.64.o: conflicts.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +conflicts.64.o: conflicts.c array.h language.h string-private.h ../config.h debug-private.h +conflicts.64.o: conflicts.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +conflicts.64.o: conflicts.c pwg-private.h http-private.h ../cups/http.h md5-private.h +conflicts.64.o: conflicts.c ipp-private.h ../cups/ipp.h language-private.h +conflicts.64.o: conflicts.c ../cups/transcode.h thread-private.h +custom.64.o: custom.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +custom.64.o: custom.c array.h language.h string-private.h ../config.h debug-private.h +custom.64.o: custom.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +custom.64.o: custom.c pwg-private.h http-private.h ../cups/http.h md5-private.h +custom.64.o: custom.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +custom.64.o: custom.c thread-private.h +debug.64.o: debug.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +debug.64.o: debug.c array.h language.h string-private.h ../config.h debug-private.h +debug.64.o: debug.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +debug.64.o: debug.c pwg-private.h http-private.h ../cups/http.h md5-private.h +debug.64.o: debug.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +debug.64.o: debug.c thread-private.h +dest.64.o: dest.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +dest.64.o: dest.c array.h language.h string-private.h ../config.h debug-private.h +dest.64.o: dest.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +dest.64.o: dest.c http-private.h ../cups/http.h md5-private.h ipp-private.h +dest.64.o: dest.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +dir.64.o: dir.c string-private.h ../config.h debug-private.h ../cups/versioning.h +dir.64.o: dir.c dir.h versioning.h +emit.64.o: emit.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +emit.64.o: emit.c array.h language.h string-private.h ../config.h debug-private.h +emit.64.o: emit.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +emit.64.o: emit.c http-private.h ../cups/http.h md5-private.h ipp-private.h +emit.64.o: emit.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +encode.64.o: encode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +encode.64.o: encode.c array.h language.h string-private.h ../config.h debug-private.h +encode.64.o: encode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +encode.64.o: encode.c pwg-private.h http-private.h ../cups/http.h md5-private.h +encode.64.o: encode.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +encode.64.o: encode.c thread-private.h +file.64.o: file.c file-private.h cups-private.h ../cups/cups.h file.h versioning.h +file.64.o: file.c ipp.h http.h array.h language.h string-private.h ../config.h +file.64.o: file.c debug-private.h ../cups/versioning.h ppd-private.h ../cups/ppd.h +file.64.o: file.c cups.h pwg-private.h http-private.h ../cups/http.h md5-private.h +file.64.o: file.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +file.64.o: file.c thread-private.h +getdevices.64.o: getdevices.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getdevices.64.o: getdevices.c array.h language.h string-private.h ../config.h debug-private.h +getdevices.64.o: getdevices.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getdevices.64.o: getdevices.c pwg-private.h http-private.h ../cups/http.h md5-private.h +getdevices.64.o: getdevices.c ipp-private.h ../cups/ipp.h language-private.h +getdevices.64.o: getdevices.c ../cups/transcode.h thread-private.h +getifaddrs.64.o: getifaddrs.c http-private.h ../config.h ../cups/http.h md5-private.h +getifaddrs.64.o: getifaddrs.c ipp-private.h ../cups/ipp.h +getputfile.64.o: getputfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +getputfile.64.o: getputfile.c array.h language.h string-private.h ../config.h debug-private.h +getputfile.64.o: getputfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +getputfile.64.o: getputfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h +getputfile.64.o: getputfile.c ipp-private.h ../cups/ipp.h language-private.h +getputfile.64.o: getputfile.c ../cups/transcode.h thread-private.h +globals.64.o: globals.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +globals.64.o: globals.c array.h language.h string-private.h ../config.h debug-private.h +globals.64.o: globals.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +globals.64.o: globals.c pwg-private.h http-private.h ../cups/http.h md5-private.h +globals.64.o: globals.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +globals.64.o: globals.c thread-private.h +http.64.o: http.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http.64.o: http.c array.h language.h string-private.h ../config.h debug-private.h +http.64.o: http.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +http.64.o: http.c http-private.h ../cups/http.h md5-private.h ipp-private.h +http.64.o: http.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +http-addr.64.o: http-addr.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +http-addr.64.o: http-addr.c array.h language.h string-private.h ../config.h debug-private.h +http-addr.64.o: http-addr.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +http-addr.64.o: http-addr.c pwg-private.h http-private.h ../cups/http.h md5-private.h +http-addr.64.o: http-addr.c ipp-private.h ../cups/ipp.h language-private.h +http-addr.64.o: http-addr.c ../cups/transcode.h thread-private.h +http-addrlist.64.o: http-addrlist.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-addrlist.64.o: http-addrlist.c http.h array.h language.h string-private.h ../config.h +http-addrlist.64.o: http-addrlist.c debug-private.h ../cups/versioning.h ppd-private.h +http-addrlist.64.o: http-addrlist.c ../cups/ppd.h cups.h pwg-private.h http-private.h +http-addrlist.64.o: http-addrlist.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-addrlist.64.o: http-addrlist.c language-private.h ../cups/transcode.h thread-private.h +http-support.64.o: http-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h +http-support.64.o: http-support.c http.h array.h language.h string-private.h ../config.h +http-support.64.o: http-support.c debug-private.h ../cups/versioning.h ppd-private.h +http-support.64.o: http-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h +http-support.64.o: http-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +http-support.64.o: http-support.c language-private.h ../cups/transcode.h thread-private.h +ipp.64.o: ipp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ipp.64.o: ipp.c language.h string-private.h ../config.h debug-private.h +ipp.64.o: ipp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ipp.64.o: ipp.c http-private.h ../cups/http.h md5-private.h ipp-private.h +ipp.64.o: ipp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ipp-support.64.o: ipp-support.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ipp-support.64.o: ipp-support.c array.h language.h string-private.h ../config.h +ipp-support.64.o: ipp-support.c debug-private.h ../cups/versioning.h ppd-private.h +ipp-support.64.o: ipp-support.c ../cups/ppd.h cups.h pwg-private.h http-private.h +ipp-support.64.o: ipp-support.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +ipp-support.64.o: ipp-support.c language-private.h ../cups/transcode.h thread-private.h +langprintf.64.o: langprintf.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +langprintf.64.o: langprintf.c array.h language.h string-private.h ../config.h debug-private.h +langprintf.64.o: langprintf.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +langprintf.64.o: langprintf.c pwg-private.h http-private.h ../cups/http.h md5-private.h +langprintf.64.o: langprintf.c ipp-private.h ../cups/ipp.h language-private.h +langprintf.64.o: langprintf.c ../cups/transcode.h thread-private.h +language.64.o: language.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +language.64.o: language.c array.h language.h string-private.h ../config.h debug-private.h +language.64.o: language.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +language.64.o: language.c pwg-private.h http-private.h ../cups/http.h md5-private.h +language.64.o: language.c ipp-private.h ../cups/ipp.h language-private.h +language.64.o: language.c ../cups/transcode.h thread-private.h +localize.64.o: localize.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +localize.64.o: localize.c array.h language.h string-private.h ../config.h debug-private.h +localize.64.o: localize.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +localize.64.o: localize.c pwg-private.h http-private.h ../cups/http.h md5-private.h +localize.64.o: localize.c ipp-private.h ../cups/ipp.h language-private.h +localize.64.o: localize.c ../cups/transcode.h thread-private.h +mark.64.o: mark.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +mark.64.o: mark.c array.h language.h string-private.h ../config.h debug-private.h +mark.64.o: mark.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +mark.64.o: mark.c http-private.h ../cups/http.h md5-private.h ipp-private.h +mark.64.o: mark.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +md5.64.o: md5.c md5-private.h string-private.h ../config.h +md5passwd.64.o: md5passwd.c http-private.h ../config.h ../cups/http.h md5-private.h +md5passwd.64.o: md5passwd.c ipp-private.h ../cups/ipp.h string-private.h +notify.64.o: notify.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +notify.64.o: notify.c array.h language.h string-private.h ../config.h debug-private.h +notify.64.o: notify.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +notify.64.o: notify.c pwg-private.h http-private.h ../cups/http.h md5-private.h +notify.64.o: notify.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +notify.64.o: notify.c thread-private.h +options.64.o: options.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +options.64.o: options.c array.h language.h string-private.h ../config.h debug-private.h +options.64.o: options.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +options.64.o: options.c pwg-private.h http-private.h ../cups/http.h md5-private.h +options.64.o: options.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +options.64.o: options.c thread-private.h +page.64.o: page.c string-private.h ../config.h debug-private.h ../cups/versioning.h +page.64.o: page.c ppd.h cups.h array.h versioning.h file.h +ppd.64.o: ppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h array.h +ppd.64.o: ppd.c language.h string-private.h ../config.h debug-private.h +ppd.64.o: ppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +ppd.64.o: ppd.c http-private.h ../cups/http.h md5-private.h ipp-private.h +ppd.64.o: ppd.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +ppd-cache.64.o: ppd-cache.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +ppd-cache.64.o: ppd-cache.c array.h language.h string-private.h ../config.h debug-private.h +ppd-cache.64.o: ppd-cache.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +ppd-cache.64.o: ppd-cache.c pwg-private.h http-private.h ../cups/http.h md5-private.h +ppd-cache.64.o: ppd-cache.c ipp-private.h ../cups/ipp.h language-private.h +ppd-cache.64.o: ppd-cache.c ../cups/transcode.h thread-private.h +pwg-media.64.o: pwg-media.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +pwg-media.64.o: pwg-media.c array.h language.h string-private.h ../config.h debug-private.h +pwg-media.64.o: pwg-media.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +pwg-media.64.o: pwg-media.c pwg-private.h http-private.h ../cups/http.h md5-private.h +pwg-media.64.o: pwg-media.c ipp-private.h ../cups/ipp.h language-private.h +pwg-media.64.o: pwg-media.c ../cups/transcode.h thread-private.h +request.64.o: request.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +request.64.o: request.c array.h language.h string-private.h ../config.h debug-private.h +request.64.o: request.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +request.64.o: request.c pwg-private.h http-private.h ../cups/http.h md5-private.h +request.64.o: request.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +request.64.o: request.c thread-private.h +sidechannel.64.o: sidechannel.c sidechannel.h versioning.h string-private.h ../config.h +sidechannel.64.o: sidechannel.c debug-private.h ../cups/versioning.h +snmp.64.o: snmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +snmp.64.o: snmp.c array.h language.h string-private.h ../config.h debug-private.h +snmp.64.o: snmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +snmp.64.o: snmp.c http-private.h ../cups/http.h md5-private.h ipp-private.h +snmp.64.o: snmp.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +snmp.64.o: snmp.c snmp-private.h +snprintf.64.o: snprintf.c string-private.h ../config.h +string.64.o: string.c string-private.h ../config.h debug-private.h ../cups/versioning.h +string.64.o: string.c thread-private.h array.h versioning.h +tempfile.64.o: tempfile.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +tempfile.64.o: tempfile.c array.h language.h string-private.h ../config.h debug-private.h +tempfile.64.o: tempfile.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +tempfile.64.o: tempfile.c pwg-private.h http-private.h ../cups/http.h md5-private.h +tempfile.64.o: tempfile.c ipp-private.h ../cups/ipp.h language-private.h +tempfile.64.o: tempfile.c ../cups/transcode.h thread-private.h +thread.64.o: thread.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +thread.64.o: thread.c array.h language.h string-private.h ../config.h debug-private.h +thread.64.o: thread.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +thread.64.o: thread.c pwg-private.h http-private.h ../cups/http.h md5-private.h +thread.64.o: thread.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +thread.64.o: thread.c thread-private.h +transcode.64.o: transcode.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +transcode.64.o: transcode.c array.h language.h string-private.h ../config.h debug-private.h +transcode.64.o: transcode.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +transcode.64.o: transcode.c pwg-private.h http-private.h ../cups/http.h md5-private.h +transcode.64.o: transcode.c ipp-private.h ../cups/ipp.h language-private.h +transcode.64.o: transcode.c ../cups/transcode.h thread-private.h +usersys.64.o: usersys.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +usersys.64.o: usersys.c array.h language.h string-private.h ../config.h debug-private.h +usersys.64.o: usersys.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +usersys.64.o: usersys.c pwg-private.h http-private.h ../cups/http.h md5-private.h +usersys.64.o: usersys.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +usersys.64.o: usersys.c thread-private.h +util.64.o: util.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +util.64.o: util.c array.h language.h string-private.h ../config.h debug-private.h +util.64.o: util.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h pwg-private.h +util.64.o: util.c http-private.h ../cups/http.h md5-private.h ipp-private.h +util.64.o: util.c ../cups/ipp.h language-private.h ../cups/transcode.h thread-private.h +testadmin.64.o: testadmin.c adminutil.h cups.h string-private.h ../config.h +testarray.64.o: testarray.c string-private.h ../config.h debug-private.h +testarray.64.o: testarray.c ../cups/versioning.h array.h versioning.h dir.h +testconflicts.64.o: testconflicts.c cups.h ppd.h array.h versioning.h file.h string-private.h +testconflicts.64.o: testconflicts.c ../config.h +testcups.64.o: testcups.c string-private.h ../config.h cups.h ppd.h array.h versioning.h +testcups.64.o: testcups.c file.h +testfile.64.o: testfile.c string-private.h ../config.h debug-private.h ../cups/versioning.h +testfile.64.o: testfile.c file.h versioning.h +testhttp.64.o: testhttp.c string-private.h ../config.h http-private.h ../cups/http.h +testhttp.64.o: testhttp.c md5-private.h ipp-private.h ../cups/ipp.h +testi18n.64.o: testi18n.c string-private.h ../config.h language-private.h +testi18n.64.o: testi18n.c ../cups/transcode.h language.h array.h versioning.h +testipp.64.o: testipp.c file.h versioning.h string-private.h ../config.h ipp-private.h +testipp.64.o: testipp.c ../cups/ipp.h +testoptions.64.o: testoptions.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testoptions.64.o: testoptions.c array.h language.h string-private.h ../config.h +testoptions.64.o: testoptions.c debug-private.h ../cups/versioning.h ppd-private.h +testoptions.64.o: testoptions.c ../cups/ppd.h cups.h pwg-private.h http-private.h +testoptions.64.o: testoptions.c ../cups/http.h md5-private.h ipp-private.h ../cups/ipp.h +testoptions.64.o: testoptions.c language-private.h ../cups/transcode.h thread-private.h +testlang.64.o: testlang.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testlang.64.o: testlang.c array.h language.h string-private.h ../config.h debug-private.h +testlang.64.o: testlang.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testlang.64.o: testlang.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testlang.64.o: testlang.c ipp-private.h ../cups/ipp.h language-private.h +testlang.64.o: testlang.c ../cups/transcode.h thread-private.h +testppd.64.o: testppd.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testppd.64.o: testppd.c array.h language.h string-private.h ../config.h debug-private.h +testppd.64.o: testppd.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testppd.64.o: testppd.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testppd.64.o: testppd.c ipp-private.h ../cups/ipp.h language-private.h ../cups/transcode.h +testppd.64.o: testppd.c thread-private.h +testpwg.64.o: testpwg.c ppd-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testpwg.64.o: testpwg.c array.h language.h ../cups/ppd.h cups.h pwg-private.h +testpwg.64.o: testpwg.c file-private.h cups-private.h string-private.h ../config.h +testpwg.64.o: testpwg.c debug-private.h ../cups/versioning.h http-private.h ../cups/http.h +testpwg.64.o: testpwg.c md5-private.h ipp-private.h ../cups/ipp.h language-private.h +testpwg.64.o: testpwg.c ../cups/transcode.h thread-private.h +testsnmp.64.o: testsnmp.c cups-private.h ../cups/cups.h file.h versioning.h ipp.h http.h +testsnmp.64.o: testsnmp.c array.h language.h string-private.h ../config.h debug-private.h +testsnmp.64.o: testsnmp.c ../cups/versioning.h ppd-private.h ../cups/ppd.h cups.h +testsnmp.64.o: testsnmp.c pwg-private.h http-private.h ../cups/http.h md5-private.h +testsnmp.64.o: testsnmp.c ipp-private.h ../cups/ipp.h language-private.h +testsnmp.64.o: testsnmp.c ../cups/transcode.h thread-private.h snmp-private.h diff --git a/cups/Makefile b/cups/Makefile new file mode 100644 index 0000000..4cbe5fb --- /dev/null +++ b/cups/Makefile @@ -0,0 +1,680 @@ +# +# "$Id: Makefile 9979 2011-09-09 16:34:29Z mike $" +# +# API library Makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# This file is subject to the Apple OS-Developed Software exception. +# + +include ../Makedefs + +# +# Object files... +# + +LIBOBJS = \ + adminutil.o \ + array.o \ + attr.o \ + auth.o \ + backchannel.o \ + backend.o \ + conflicts.o \ + custom.o \ + debug.o \ + dest.o \ + dir.o \ + emit.o \ + encode.o \ + file.o \ + getdevices.o \ + getifaddrs.o \ + getputfile.o \ + globals.o \ + http.o \ + http-addr.o \ + http-addrlist.o \ + http-support.o \ + ipp.o \ + ipp-support.o \ + langprintf.o \ + language.o \ + localize.o \ + mark.o \ + md5.o \ + md5passwd.o \ + notify.o \ + options.o \ + page.o \ + ppd.o \ + ppd-cache.o \ + pwg-media.o \ + request.o \ + sidechannel.o \ + snmp.o \ + snprintf.o \ + string.o \ + tempfile.o \ + thread.o \ + transcode.o \ + usersys.o \ + util.o +LIB32OBJS = $(LIBOBJS:.o=.32.o) +LIB64OBJS = $(LIBOBJS:.o=.64.o) +OBJS = \ + $(LIBOBJS) \ + $(LIB32OBJS) \ + $(LIB64OBJS) \ + testadmin.o \ + testarray.o \ + testconflicts.o \ + testcups.o \ + testfile.o \ + testhttp.o \ + testi18n.o \ + testipp.o \ + testoptions.o \ + testlang.o \ + testppd.o \ + testpwg.o \ + testsnmp.o + + +# +# Header files to install... +# + +HEADERS = \ + adminutil.h \ + array.h \ + backend.h \ + cups.h \ + dir.h \ + file.h \ + http.h \ + ipp.h \ + language.h \ + ppd.h \ + raster.h \ + sidechannel.h \ + transcode.h \ + versioning.h + +HEADERSPRIV = \ + array-private.h \ + cups-private.h \ + debug-private.h \ + file-private.h \ + http-private.h \ + ipp-private.h \ + language-private.h \ + md5-private.h \ + ppd-private.h \ + pwg-private.h \ + snmp-private.h \ + string-private.h \ + thread-private.h + + +# +# Targets in this directory... +# + +LIBTARGETS = \ + $(LIBCUPSSTATIC) \ + $(LIBCUPS) \ + $(LIB32CUPS) \ + $(LIB64CUPS) + +UNITTARGETS = \ + testadmin \ + testarray \ + testconflicts \ + testcups \ + testfile \ + testhttp \ + testi18n \ + testipp \ + testlang \ + testoptions \ + testppd \ + testpwg \ + testsnmp + +TARGETS = \ + $(LIBTARGETS) + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: $(LIBTARGETS) + + +# +# Make unit tests... +# + +unittests: $(UNITTARGETS) + + +# +# Remove object and target files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) + $(RM) libcups.so libcups.sl libcups.dylib + $(RM) -r 32bit 64bit + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + touch Dependencies.tmp + makedepend -Y -I.. -fDependencies.tmp $(OBJS:.o=.c) >/dev/null 2>&1 + $(RM) Dependencies + cp Dependencies.tmp Dependencies + sed -E -e '1,$$s/^([^.]+)\.o:/\1\.32.o: \1\.c /' Dependencies.tmp >>Dependencies + sed -E -e '1,$$s/^([^.]+)\.o:/\1\.64.o: \1\.c /' Dependencies.tmp >>Dependencies + $(RM) Dependencies.tmp + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + echo Installing header files into $(INCLUDEDIR)/cups... + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + for file in $(HEADERS); do \ + $(INSTALL_DATA) $$file $(INCLUDEDIR)/cups; \ + done + if test "x$(privateinclude)" != x; then \ + echo Installing private header files into $(PRIVATEINCLUDE)...; \ + $(INSTALL_DIR) -m 755 $(PRIVATEINCLUDE); \ + for file in $(HEADERSPRIV); do \ + $(INSTALL_DATA) $$file $(PRIVATEINCLUDE)/$$file; \ + done; \ + fi + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64) + echo Installing libraries in $(LIBDIR)... + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPS) $(LIBDIR) + if test $(LIBCUPS) = "libcups.so.2" -o $(LIBCUPS) = "libcups.sl.2"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ + $(LN) $(LIBCUPS) $(LIBDIR)/`basename $(LIBCUPS) .2`; \ + fi + if test $(LIBCUPS) = "libcups.2.dylib"; then \ + $(RM) $(LIBDIR)/libcups.dylib; \ + $(LN) $(LIBCUPS) $(LIBDIR)/libcups.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPS) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 $(LIBCUPSSTATIC) $(LIBDIR) + $(RANLIB) $(LIBDIR)/$(LIBCUPSSTATIC) + $(CHMOD) 555 $(LIBDIR)/$(LIBCUPSSTATIC) + +install32bit: + echo Installing libraries in $(LIB32DIR)... + $(INSTALL_DIR) -m 755 $(LIB32DIR) + $(INSTALL_LIB) 32bit/libcups.so.2 $(LIB32DIR)/libcups.so.2 + $(LN) libcups.so.2 $(LIB32DIR)/libcups.so + +install64bit: + echo Installing libraries in $(LIB64DIR)... + $(INSTALL_DIR) -m 755 $(LIB64DIR) + $(INSTALL_LIB) 64bit/libcups.so.2 $(LIB64DIR)/libcups.so.2 + $(LN) libcups.so.2 $(LIB64DIR)/libcups.so + + +# +# Uninstall object and target files... +# + +uninstall: $(UNINSTALL32) $(UNINSTALL64) + $(RM) $(LIBDIR)/libcups.2.dylib + $(RM) $(LIBDIR)/$(LIBCUPSSTATIC) + $(RM) $(LIBDIR)/libcups.dylib + $(RM) $(LIBDIR)/libcups_s.a + $(RM) $(LIBDIR)/libcups.sl + $(RM) $(LIBDIR)/libcups.sl.2 + $(RM) $(LIBDIR)/libcups.so + $(RM) $(LIBDIR)/libcups.so.2 + -$(RMDIR) $(LIBDIR) + for file in $(HEADERS); do \ + $(RM) $(INCLUDEDIR)/cups/$$file; \ + done + -$(RMDIR) $(INCLUDEDIR)/cups + +uninstall32bit: + $(RM) $(LIB32DIR)/libcups.so + $(RM) $(LIB32DIR)/libcups.so.2 + -$(RMDIR) $(LIB32DIR) + +uninstall64bit: + $(RM) $(LIB64DIR)/libcups.so + $(RM) $(LIB64DIR)/libcups.so.2 + -$(RMDIR) $(LIB64DIR) + + +# +# libcups.so.2, libcups.sl.2 +# + +libcups.so.2 libcups.sl.2: $(LIBOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBGSSAPI) \ + $(SSLLIBS) $(DNSSDLIBS) -lpthread $(LIBZ) -lm + $(RM) `basename $@ .2` + $(LN) $@ `basename $@ .2` + + +# +# 32bit/libcups.so.2 +# + +32bit/libcups.so.2: $(LIB32OBJS) + echo Linking 32-bit $@... + -mkdir 32bit + $(DSO) $(ARCH32FLAGS) $(DSO32FLAGS) -o $@ $(LIB32OBJS) $(LIBGSSAPI) \ + $(DNSSDLIBS) $(SSLLIBS) -lpthread $(LIBZ) -lm + $(RM) 32bit/libcups.so + $(LN) libcups.so.2 32bit/libcups.so + + +# +# 64bit/libcups.so.2 +# + +64bit/libcups.so.2: $(LIB64OBJS) + echo Linking 64-bit $@... + -mkdir 64bit + $(DSO) $(ARCH64FLAGS) $(DSO64FLAGS) -o $@ $(LIB64OBJS) $(LIBGSSAPI) \ + $(DNSSDLIBS) $(SSLLIBS) -lpthread $(LIBZ) -lm + $(RM) 64bit/libcups.so + $(LN) libcups.so.2 64bit/libcups.so + + +# +# libcups.2.dylib +# + +libcups.2.dylib: $(LIBOBJS) $(LIBCUPSORDER) + echo Creating export list for $@... + nm $(LIBOBJS) 2>/dev/null | grep "T _" | awk '{print $$3}' | \ + grep -v -e '^(_cupsConnect|_cupsCharset|_cupsEncodingName|_cupsSetDefaults|_cupsSetHTTPError|_cupsUserDefault|_httpWait)$$' | \ + sort >t.exp + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 2.9.0 \ + -compatibility_version 2.0.0 \ + -exported_symbols_list t.exp \ + $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + -lpthread $(LIBZ) -lm + $(RM) libcups.dylib t.exp + $(LN) $@ libcups.dylib + + +# +# libcups_s.a +# + +libcups_s.a: $(LIBOBJS) libcups_s.exp + echo Creating $@... + $(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o \ + $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + -lpthread $(LIBZ) -lm + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcups_s.o + + +# +# libcups.la +# + +libcups.la: $(LIBOBJS) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \ + -rpath $(LIBDIR) -version-info 2:9 $(LIBGSSAPI) $(SSLLIBS) \ + $(DNSSDLIBS) -lpthread $(LIBZ) -lm + + +# +# libcups.a +# + +libcups.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# testadmin (dependency on static CUPS library is intentional) +# + +testadmin: testadmin.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testadmin.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# testarray (dependency on static CUPS library is intentional) +# + +testarray: testarray.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testarray.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running array API tests... + ./testarray + + +# +# testconflicts (dependency on static CUPS library is intentional) +# + +testconflicts: testconflicts.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testconflicts.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# testcups (dependency on static CUPS library is intentional) +# + +testcups: testcups.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testcups.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# testfile (dependency on static CUPS library is intentional) +# + +testfile: testfile.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testfile.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running file API tests... + ./testfile + + +# +# testhttp (dependency on static CUPS library is intentional) +# + +testhttp: testhttp.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testhttp.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running HTTP API tests... + #./testhttp + + +# +# testipp (dependency on static CUPS library is intentional) +# + +testipp: testipp.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testipp.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running IPP API tests... + ./testipp + + +# +# testi18n (dependency on static CUPS library is intentional) +# + +testi18n: testi18n.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testi18n.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running internationalization API tests... + ./testi18n + + +# +# testlang (dependency on static CUPS library is intentional) +# + +testlang: testlang.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testlang.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running language API tests... + ./testlang + + +# +# testoptions (dependency on static CUPS library is intentional) +# + +testoptions: testoptions.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testoptions.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running option API tests... + ./testoptions + + +# +# testppd (dependency on static CUPS library is intentional) +# + +testppd: testppd.o $(LIBCUPSSTATIC) test.ppd test2.ppd + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testppd.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running PPD API tests... + ./testppd + + +# +# testpwg (dependency on static CUPS library is intentional) +# + +testpwg: testpwg.o $(LIBCUPSSTATIC) test.ppd + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testpwg.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Running PWG API tests... + ./testpwg test.ppd + + +# +# testsnmp (dependency on static CUPS library is intentional) +# + +testsnmp: testsnmp.o $(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testsnmp.o $(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# Automatic API help files... +# + +apihelp: + echo Generating CUPS API help files... + mxmldoc --section "Programming" \ + --title "Introduction to CUPS Programming" \ + --css ../doc/cups-printable.css \ + --header api-overview.header --intro api-overview.shtml \ + >../doc/help/api-overview.html + mxmldoc --section "Programming" --title "Array API" \ + --css ../doc/cups-printable.css \ + --header api-array.header --intro api-array.shtml \ + api-array.xml \ + array.h array.c >../doc/help/api-array.html + mxmldoc --tokens help/api-array.html api-array.xml >../doc/help/api-array.tokens + $(RM) api-array.xml + mxmldoc --section "Programming" --title "CUPS API" \ + --css ../doc/cups-printable.css \ + --header api-cups.header --intro api-cups.shtml \ + api-cups.xml \ + cups.h adminutil.c dest.c language.c notify.c \ + options.c tempfile.c usersys.c \ + util.c >../doc/help/api-cups.html + mxmldoc --tokens help/api-cups.html api-cups.xml >../doc/help/api-cups.tokens + $(RM) api-cups.xml + mxmldoc --section "Programming" --title "File and Directory APIs" \ + --css ../doc/cups-printable.css \ + --header api-filedir.header --intro api-filedir.shtml \ + api-filedir.xml \ + file.h file.c dir.h dir.c >../doc/help/api-filedir.html + mxmldoc --tokens api-filedir.xml >../doc/help/api-filedir.tokens + $(RM) api-filedir.xml + mxmldoc --section "Programming" --title "PPD API" \ + --css ../doc/cups-printable.css \ + --header api-ppd.header --intro api-ppd.shtml \ + api-ppd.xml \ + ppd.h attr.c conflicts.c custom.c emit.c localize.c mark.c page.c \ + ppd.c >../doc/help/api-ppd.html + mxmldoc --tokens help/api-ppd.html api-ppd.xml >../doc/help/api-ppd.tokens + $(RM) api-ppd.xml + mxmldoc --section "Programming" --title "HTTP and IPP APIs" \ + --css ../doc/cups-printable.css \ + --header api-httpipp.header --intro api-httpipp.shtml \ + api-httpipp.xml \ + http.h ipp.h auth.c getdevices.c getputfile.c encode.c \ + http.c http-addr.c http-support.c ipp.c ipp-support.c \ + md5passwd.c request.c >../doc/help/api-httpipp.html + mxmldoc --tokens help/api-httpipp.html api-httpipp.xml >../doc/help/api-httpipp.tokens + $(RM) api-httpipp.xml + mxmldoc --section "Programming" \ + --title "Filter and Backend Programming" \ + --css ../doc/cups-printable.css \ + --header api-filter.header --intro api-filter.shtml \ + api-filter.xml \ + backchannel.c backend.h backend.c sidechannel.c sidechannel.h \ + >../doc/help/api-filter.html + mxmldoc --tokens help/api-filter.html api-filter.xml >../doc/help/api-filter.tokens + $(RM) api-filter.xml + +framedhelp: + echo Generating CUPS API help files... + mxmldoc --framed api-overview \ + --section "Programming" \ + --title "Introduction to CUPS Programming" \ + --css ../doc/cups-printable.css \ + --header api-overview.header --intro api-overview.shtml + mxmldoc --framed api-array \ + --section "Programming" --title "Array API" \ + --css ../doc/cups-printable.css \ + --header api-array.header --intro api-array.shtml \ + array.h array.c + mxmldoc --framed api-cups \ + --section "Programming" --title "CUPS API" \ + --css ../doc/cups-printable.css \ + --header api-cups.header --intro api-cups.shtml \ + cups.h adminutil.c dest.c language.c notify.c \ + options.c tempfile.c usersys.c \ + util.c + mxmldoc --framed api-filedir \ + --section "Programming" --title "File and Directory APIs" \ + --css ../doc/cups-printable.css \ + --header api-filedir.header --intro api-filedir.shtml \ + file.h file.c dir.h dir.c + mxmldoc --framed api-ppd \ + --section "Programming" --title "PPD API" \ + --css ../doc/cups-printable.css \ + --header api-ppd.header --intro api-ppd.shtml \ + ppd.h attr.c conflicts.c custom.c emit.c localize.c mark.c \ + page.c ppd.c + mxmldoc --framed api-httpipp \ + --section "Programming" --title "HTTP and IPP APIs" \ + --css ../doc/cups-printable.css \ + --header api-httpipp.header --intro api-httpipp.shtml \ + http.h ipp.h auth.c getdevices.c getputfile.c encode.c \ + http.c http-addr.c http-support.c ipp.c ipp-support.c \ + md5passwd.c request.c + mxmldoc --framed api-filter \ + --section "Programming" \ + --title "Filter and Backend Programming" \ + --css ../doc/cups-printable.css \ + --header api-filter.header --intro api-filter.shtml \ + backchannel.c backend.h backend.c sidechannel.c sidechannel.h + + +# +# Lines of code computation... +# + +sloc: + echo "libcupslite: \c" + sloccount $(LITEOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}' + echo "libcups: \c" + sloccount $(LIBOBJS:.o=.c) 2>/dev/null | grep "Total Physical" | awk '{print $$9}' + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9979 2011-09-09 16:34:29Z mike $". +# diff --git a/cups/adminutil.c b/cups/adminutil.c new file mode 100644 index 0000000..995704e --- /dev/null +++ b/cups/adminutil.c @@ -0,0 +1,2458 @@ +/* + * "$Id: adminutil.c 9793 2011-05-20 03:49:49Z mike $" + * + * Administration utility API definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2001-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsAdminCreateWindowsPPD() - Create the Windows PPD file for a printer. + * cupsAdminExportSamba() - Export a printer to Samba. + * cupsAdminGetServerSettings() - Get settings from the server. + * cupsAdminSetServerSettings() - Set settings on the server. + * do_samba_command() - Do a SAMBA command. + * get_cupsd_conf() - Get the current cupsd.conf file. + * invalidate_cupsd_cache() - Invalidate the cached cupsd.conf settings. + * write_option() - Write a CUPS option to a PPD file. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "adminutil.h" +#include +#include +#ifdef WIN32 +#else +# include +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +static int do_samba_command(const char *command, + const char *address, + const char *subcommand, + const char *authfile, + FILE *logfile); +static http_status_t get_cupsd_conf(http_t *http, _cups_globals_t *cg, + time_t last_update, char *name, + int namelen, int *remote); +static void invalidate_cupsd_cache(_cups_globals_t *cg); +static void write_option(cups_file_t *dstfp, int order, + const char *name, const char *text, + const char *attrname, + ipp_attribute_t *suppattr, + ipp_attribute_t *defattr, int defval, + int valcount); + + +/* + * 'cupsAdminCreateWindowsPPD()' - Create the Windows PPD file for a printer. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - PPD file or NULL */ +cupsAdminCreateWindowsPPD( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *dest, /* I - Printer or class */ + char *buffer, /* I - Filename buffer */ + int bufsize) /* I - Size of filename buffer */ +{ + const char *src; /* Source PPD filename */ + cups_file_t *srcfp, /* Source PPD file */ + *dstfp; /* Destination PPD file */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *suppattr, /* IPP -supported attribute */ + *defattr; /* IPP -default attribute */ + cups_lang_t *language; /* Current language */ + char line[256], /* Line from PPD file */ + junk[256], /* Extra junk to throw away */ + *ptr, /* Pointer into line */ + uri[1024], /* Printer URI */ + option[41], /* Option */ + choice[41]; /* Choice */ + int jcloption, /* In a JCL option? */ + jclorder, /* Next JCL order dependency */ + linenum; /* Current line number */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + static const char * const pattrs[] = /* Printer attributes we want */ + { + "job-hold-until-supported", + "job-hold-until-default", + "job-sheets-supported", + "job-sheets-default", + "job-priority-supported", + "job-priority-default" + }; + + + /* + * Range check the input... + */ + + if (buffer) + *buffer = '\0'; + + if (!http) + http = _cupsConnect(); + + if (!http || !dest || !buffer || bufsize < 2) + return (NULL); + + /* + * Get the PPD file... + */ + + if ((src = cupsGetPPD2(http, dest)) == NULL) + return (NULL); + + /* + * Get the supported banner pages, etc. for the printer... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + /* + * Do the request and get back a response... + */ + + response = cupsDoRequest(http, request, "/"); + if (!response || cupsLastError() > IPP_OK_CONFLICT) + { + unlink(src); + return (NULL); + } + + /* + * Open the original PPD file... + */ + + if ((srcfp = cupsFileOpen(src, "rb")) == NULL) + return (NULL); + + /* + * Create a temporary output file using the destination buffer... + */ + + if ((dstfp = cupsTempFile2(buffer, bufsize)) == NULL) + { + cupsFileClose(srcfp); + + unlink(src); + + return (NULL); + } + + /* + * Write a new header explaining that this isn't the original PPD... + */ + + cupsFilePuts(dstfp, "*PPD-Adobe: \"4.3\"\n"); + + curtime = time(NULL); + curdate = gmtime(&curtime); + + cupsFilePrintf(dstfp, "*%% Modified on %04d%02d%02d%02d%02d%02d+0000 " + "for CUPS Windows Driver\n", + curdate->tm_year + 1900, curdate->tm_mon + 1, curdate->tm_mday, + curdate->tm_hour, curdate->tm_min, curdate->tm_sec); + + /* + * Read the existing PPD file, converting all PJL commands to CUPS + * job ticket comments... + */ + + jcloption = 0; + jclorder = 0; + linenum = 0; + language = cupsLangDefault(); + + while (cupsFileGets(srcfp, line, sizeof(line))) + { + linenum ++; + + if (!strncmp(line, "*PPD-Adobe:", 11)) + { + /* + * Already wrote the PPD header... + */ + + continue; + } + else if (!strncmp(line, "*JCLBegin:", 10) || + !strncmp(line, "*JCLToPSInterpreter:", 20) || + !strncmp(line, "*JCLEnd:", 8) || + !strncmp(line, "*Protocols:", 11)) + { + /* + * Don't use existing JCL keywords; we'll create our own, below... + */ + + cupsFilePrintf(dstfp, "*%% Commented out for CUPS Windows Driver...\n" + "*%%%s\n", line + 1); + continue; + } + else if (!strncmp(line, "*JCLOpenUI", 10)) + { + jcloption = 1; + cupsFilePrintf(dstfp, "%s\n", line); + } + else if (!strncmp(line, "*JCLCloseUI", 11)) + { + jcloption = 0; + cupsFilePrintf(dstfp, "%s\n", line); + } + else if (jcloption && !strncmp(line, "*OrderDependency:", 17)) + { + for (ptr = line + 17; _cups_isspace(*ptr); ptr ++); + + ptr = strchr(ptr, ' '); + + if (ptr) + { + cupsFilePrintf(dstfp, "*OrderDependency: %d%s\n", jclorder, ptr); + jclorder ++; + } + else + cupsFilePrintf(dstfp, "%s\n", line); + } + else if (jcloption && + strncmp(line, "*End", 4) && + strncmp(line, "*Default", 8)) + { + if ((ptr = strchr(line, ':')) == NULL) + { + snprintf(line, sizeof(line), + _cupsLangString(language, _("Missing value on line %d.")), + linenum); + _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0); + + cupsFileClose(srcfp); + cupsFileClose(dstfp); + + unlink(src); + unlink(buffer); + + *buffer = '\0'; + + return (NULL); + } + + if ((ptr = strchr(ptr, '\"')) == NULL) + { + snprintf(line, sizeof(line), + _cupsLangString(language, + _("Missing double quote on line %d.")), + linenum); + _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0); + + cupsFileClose(srcfp); + cupsFileClose(dstfp); + + unlink(src); + unlink(buffer); + + *buffer = '\0'; + + return (NULL); + } + + if (sscanf(line, "*%40s%*[ \t]%40[^:/]", option, choice) != 2) + { + snprintf(line, sizeof(line), + _cupsLangString(language, + _("Bad option + choice on line %d.")), + linenum); + _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, line, 0); + + cupsFileClose(srcfp); + cupsFileClose(dstfp); + + unlink(src); + unlink(buffer); + + *buffer = '\0'; + + return (NULL); + } + + if (strchr(ptr + 1, '\"') == NULL) + { + /* + * Skip remaining... + */ + + while (cupsFileGets(srcfp, junk, sizeof(junk)) != NULL) + { + linenum ++; + + if (!strncmp(junk, "*End", 4)) + break; + } + } + + snprintf(ptr + 1, sizeof(line) - (ptr - line + 1), + "%%cupsJobTicket: %s=%s\n\"\n*End", option, choice); + + cupsFilePrintf(dstfp, "*%% Changed for CUPS Windows Driver...\n%s\n", + line); + } + else + cupsFilePrintf(dstfp, "%s\n", line); + } + + cupsFileClose(srcfp); + unlink(src); + + if (linenum == 0) + { + _cupsSetError(IPP_DOCUMENT_FORMAT_ERROR, _("Empty PPD file."), 1); + + cupsFileClose(dstfp); + unlink(buffer); + + *buffer = '\0'; + + return (NULL); + } + + /* + * Now add the CUPS-specific attributes and options... + */ + + cupsFilePuts(dstfp, "\n*% CUPS Job Ticket support and options...\n"); + cupsFilePuts(dstfp, "*Protocols: PJL\n"); + cupsFilePuts(dstfp, "*JCLBegin: \"%!PS-Adobe-3.0<0A>\"\n"); + cupsFilePuts(dstfp, "*JCLToPSInterpreter: \"\"\n"); + cupsFilePuts(dstfp, "*JCLEnd: \"\"\n"); + + cupsFilePuts(dstfp, "\n*OpenGroup: CUPS/CUPS Options\n\n"); + + if ((defattr = ippFindAttribute(response, "job-hold-until-default", + IPP_TAG_ZERO)) != NULL && + (suppattr = ippFindAttribute(response, "job-hold-until-supported", + IPP_TAG_ZERO)) != NULL) + write_option(dstfp, jclorder ++, "cupsJobHoldUntil", "Hold Until", + "job-hold-until", suppattr, defattr, 0, 1); + + if ((defattr = ippFindAttribute(response, "job-priority-default", + IPP_TAG_INTEGER)) != NULL && + (suppattr = ippFindAttribute(response, "job-priority-supported", + IPP_TAG_RANGE)) != NULL) + write_option(dstfp, jclorder ++, "cupsJobPriority", "Priority", + "job-priority", suppattr, defattr, 0, 1); + + if ((defattr = ippFindAttribute(response, "job-sheets-default", + IPP_TAG_ZERO)) != NULL && + (suppattr = ippFindAttribute(response, "job-sheets-supported", + IPP_TAG_ZERO)) != NULL) + { + write_option(dstfp, jclorder ++, "cupsJobSheetsStart", "Start Banner", + "job-sheets", suppattr, defattr, 0, 2); + write_option(dstfp, jclorder, "cupsJobSheetsEnd", "End Banner", + "job-sheets", suppattr, defattr, 1, 2); + } + + cupsFilePuts(dstfp, "*CloseGroup: CUPS\n"); + cupsFileClose(dstfp); + + ippDelete(response); + + return (buffer); +} + + +/* + * 'cupsAdminExportSamba()' - Export a printer to Samba. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsAdminExportSamba( + const char *dest, /* I - Destination to export */ + const char *ppd, /* I - PPD file */ + const char *samba_server, /* I - Samba server */ + const char *samba_user, /* I - Samba username */ + const char *samba_password, /* I - Samba password */ + FILE *logfile) /* I - Log file, if any */ +{ + int status; /* Status of Samba commands */ + int have_drivers; /* Have drivers? */ + char file[1024], /* File to test for */ + authfile[1024], /* Temporary authentication file */ + address[1024], /* Address for command */ + subcmd[1024], /* Sub-command */ + message[1024]; /* Error message */ + cups_file_t *fp; /* Authentication file */ + cups_lang_t *language; /* Current language */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + /* + * Range check input... + */ + + if (!dest || !ppd || !samba_server || !samba_user || !samba_password) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + return (0); + } + + /* + * Create a temporary authentication file for Samba... + */ + + if ((fp = cupsTempFile2(authfile, sizeof(authfile))) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + return (0); + } + + cupsFilePrintf(fp, "username = %s\n", samba_user); + cupsFilePrintf(fp, "password = %s\n", samba_password); + cupsFileClose(fp); + + /* + * See which drivers are available; the new CUPS v6 and Adobe drivers + * depend on the Windows 2k PS driver, so copy that driver first: + * + * Files: + * + * ps5ui.dll + * pscript.hlp + * pscript.ntf + * pscript5.dll + */ + + have_drivers = 0; + language = cupsLangDefault(); + + snprintf(file, sizeof(file), "%s/drivers/pscript5.dll", cg->cups_datadir); + if (!access(file, 0)) + { + have_drivers |= 1; + + /* + * Windows 2k driver is installed; do the smbclient commands needed + * to copy the Win2k drivers over... + */ + + snprintf(address, sizeof(address), "//%s/print$", samba_server); + + snprintf(subcmd, sizeof(subcmd), + "mkdir W32X86;" + "put %s W32X86/%s.ppd;" + "put %s/drivers/ps5ui.dll W32X86/ps5ui.dll;" + "put %s/drivers/pscript.hlp W32X86/pscript.hlp;" + "put %s/drivers/pscript.ntf W32X86/pscript.ntf;" + "put %s/drivers/pscript5.dll W32X86/pscript5.dll", + ppd, dest, cg->cups_datadir, cg->cups_datadir, + cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy Windows 2000 printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * See if we also have the CUPS driver files; if so, use them! + */ + + snprintf(file, sizeof(file), "%s/drivers/cupsps6.dll", cg->cups_datadir); + if (!access(file, 0)) + { + /* + * Copy the CUPS driver files over... + */ + + snprintf(subcmd, sizeof(subcmd), + "put %s/drivers/cups6.ini W32X86/cups6.ini;" + "put %s/drivers/cupsps6.dll W32X86/cupsps6.dll;" + "put %s/drivers/cupsui6.dll W32X86/cupsui6.dll", + cg->cups_datadir, cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy CUPS printer driver " + "files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * Do the rpcclient command needed for the CUPS drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows NT x86\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf," + "cups6.ini,cupsps6.dll,cupsui6.dll\"", + dest, dest, dest); + } + else + { + /* + * Don't have the CUPS drivers, so just use the standard Windows + * drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows NT x86\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf\"", + dest, dest, dest); + } + + if ((status = do_samba_command("rpcclient", samba_server, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to install Windows 2000 printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + } + + /* + * See if we have the Win9x PS driver... + */ + + snprintf(file, sizeof(file), "%s/drivers/ADOBEPS4.DRV", cg->cups_datadir); + if (!access(file, 0)) + { + have_drivers |= 2; + + /* + * Do the smbclient commands needed for the Adobe Win9x drivers... + */ + + snprintf(address, sizeof(address), "//%s/print$", samba_server); + + snprintf(subcmd, sizeof(subcmd), + "mkdir WIN40;" + "put %s WIN40/%s.PPD;" + "put %s/drivers/ADFONTS.MFM WIN40/ADFONTS.MFM;" + "put %s/drivers/ADOBEPS4.DRV WIN40/ADOBEPS4.DRV;" + "put %s/drivers/ADOBEPS4.HLP WIN40/ADOBEPS4.HLP;" + "put %s/drivers/ICONLIB.DLL WIN40/ICONLIB.DLL;" + "put %s/drivers/PSMON.DLL WIN40/PSMON.DLL;", + ppd, dest, cg->cups_datadir, cg->cups_datadir, + cg->cups_datadir, cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy Windows 9x printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * Do the rpcclient commands needed for the Adobe Win9x drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows 4.0\" \"%s:ADOBEPS4.DRV:%s.PPD:NULL:" + "ADOBEPS4.HLP:PSMON.DLL:RAW:" + "ADOBEPS4.DRV,%s.PPD,ADOBEPS4.HLP,PSMON.DLL,ADFONTS.MFM," + "ICONLIB.DLL\"", + dest, dest, dest); + + if ((status = do_samba_command("rpcclient", samba_server, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to install Windows 9x printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + } + + /* + * See if we have the 64-bit Windows PS driver... + * + * Files: + * + * x64/ps5ui.dll + * x64/pscript.hlp + * x64/pscript.ntf + * x64/pscript5.dll + */ + + snprintf(file, sizeof(file), "%s/drivers/x64/pscript5.dll", cg->cups_datadir); + if (!access(file, 0)) + { + have_drivers |= 4; + + /* + * 64-bit Windows driver is installed; do the smbclient commands needed + * to copy the Win64 drivers over... + */ + + snprintf(address, sizeof(address), "//%s/print$", samba_server); + + snprintf(subcmd, sizeof(subcmd), + "mkdir x64;" + "put %s x64/%s.ppd;" + "put %s/drivers/x64/ps5ui.dll x64/ps5ui.dll;" + "put %s/drivers/x64/pscript.hlp x64/pscript.hlp;" + "put %s/drivers/x64/pscript.ntf x64/pscript.ntf;" + "put %s/drivers/x64/pscript5.dll x64/pscript5.dll", + ppd, dest, cg->cups_datadir, cg->cups_datadir, + cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy 64-bit Windows printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * See if we also have the CUPS driver files; if so, use them! + */ + + snprintf(file, sizeof(file), "%s/drivers/x64/cupsps6.dll", cg->cups_datadir); + if (!access(file, 0)) + { + /* + * Copy the CUPS driver files over... + */ + + snprintf(subcmd, sizeof(subcmd), + "put %s/drivers/x64/cups6.ini x64/cups6.ini;" + "put %s/drivers/x64/cupsps6.dll x64/cupsps6.dll;" + "put %s/drivers/x64/cupsui6.dll x64/cupsui6.dll", + cg->cups_datadir, cg->cups_datadir, cg->cups_datadir); + + if ((status = do_samba_command("smbclient", address, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to copy 64-bit CUPS printer driver " + "files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + /* + * Do the rpcclient command needed for the CUPS drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows x64\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf," + "cups6.ini,cupsps6.dll,cupsui6.dll\"", + dest, dest, dest); + } + else + { + /* + * Don't have the CUPS drivers, so just use the standard Windows + * drivers... + */ + + snprintf(subcmd, sizeof(subcmd), + "adddriver \"Windows x64\" \"%s:" + "pscript5.dll:%s.ppd:ps5ui.dll:pscript.hlp:NULL:RAW:" + "pscript5.dll,%s.ppd,ps5ui.dll,pscript.hlp,pscript.ntf\"", + dest, dest, dest); + } + + if ((status = do_samba_command("rpcclient", samba_server, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to install Windows 2000 printer " + "driver files (%d).")), status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + } + + if (logfile && !(have_drivers & 1)) + { + if (!have_drivers) + strlcpy(message, + _cupsLangString(language, + _("No Windows printer drivers are installed.")), + sizeof(message)); + else + strlcpy(message, + _cupsLangString(language, + _("Warning, no Windows 2000 printer drivers " + "are installed.")), + sizeof(message)); + + _cupsSetError(IPP_NOT_FOUND, message, 0); + _cupsLangPuts(logfile, message); + } + + if (have_drivers == 0) + { + _cupsSetError(IPP_NOT_FOUND, message, 0); + + unlink(authfile); + + return (0); + } + + /* + * Finally, associate the drivers we just added with the queue... + */ + + snprintf(subcmd, sizeof(subcmd), "setdriver %s %s", dest, dest); + + if ((status = do_samba_command("rpcclient", samba_server, subcmd, + authfile, logfile)) != 0) + { + snprintf(message, sizeof(message), + _cupsLangString(language, + _("Unable to set Windows printer driver (%d).")), + status); + + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + if (logfile) + _cupsLangPuts(logfile, message); + + unlink(authfile); + + return (0); + } + + unlink(authfile); + + return (1); +} + + +/* + * 'cupsAdminGetServerSettings()' - Get settings from the server. + * + * The returned settings should be freed with cupsFreeOptions() when + * you are done with them. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsAdminGetServerSettings( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + int *num_settings, /* O - Number of settings */ + cups_option_t **settings) /* O - Settings */ +{ + int i; /* Looping var */ + cups_file_t *cupsd; /* cupsd.conf file */ + char cupsdconf[1024]; /* cupsd.conf filename */ + int remote; /* Remote cupsd.conf file? */ + http_status_t status; /* Status of getting cupsd.conf */ + char line[1024], /* Line from cupsd.conf file */ + *value; /* Value on line */ + cups_option_t *setting; /* Current setting */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (!http) + { + /* + * See if we are connected to the same server... + */ + + if (cg->http) + { + /* + * Compare the connection hostname, port, and encryption settings to + * the cached defaults; these were initialized the first time we + * connected... + */ + + if (strcmp(cg->http->hostname, cg->server) || + cg->ipp_port != _httpAddrPort(cg->http->hostaddr) || + (cg->http->encryption != cg->encryption && + cg->http->encryption == HTTP_ENCRYPT_NEVER)) + { + /* + * Need to close the current connection because something has changed... + */ + + httpClose(cg->http); + cg->http = NULL; + } + } + + /* + * (Re)connect as needed... + */ + + if (!cg->http) + { + if ((cg->http = _httpCreate(cupsServer(), ippPort(), NULL, + cupsEncryption(), AF_UNSPEC)) == NULL) + { + if (errno) + _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0); + else + _cupsSetError(IPP_SERVICE_UNAVAILABLE, + _("Unable to connect to host."), 1); + + if (num_settings) + *num_settings = 0; + + if (settings) + *settings = NULL; + + return (0); + } + } + + http = cg->http; + } + + if (!http || !num_settings || !settings) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + if (num_settings) + *num_settings = 0; + + if (settings) + *settings = NULL; + + return (0); + } + + *num_settings = 0; + *settings = NULL; + + /* + * Get the cupsd.conf file... + */ + + if ((status = get_cupsd_conf(http, cg, cg->cupsd_update, cupsdconf, + sizeof(cupsdconf), &remote)) == HTTP_OK) + { + if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) + { + char message[1024]; /* Message string */ + + + snprintf(message, sizeof(message), + _cupsLangString(cupsLangDefault(), _("Open of %s failed: %s")), + cupsdconf, strerror(errno)); + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + } + } + else + cupsd = NULL; + + if (cupsd) + { + /* + * Read the file, keeping track of what settings are enabled... + */ + + int remote_access = 0, /* Remote access allowed? */ + remote_admin = 0, /* Remote administration allowed? */ + remote_any = 0, /* Remote access from anywhere allowed? */ + browsing = 1, /* Browsing enabled? */ + browse_allow = 1, /* Browse address set? */ + browse_address = 0, /* Browse address set? */ + cancel_policy = 1, /* Cancel-job policy set? */ + debug_logging = 0; /* LogLevel debug set? */ + int linenum = 0, /* Line number in file */ + in_location = 0, /* In a location section? */ + in_policy = 0, /* In a policy section? */ + in_cancel_job = 0, /* In a cancel-job section? */ + in_admin_location = 0; /* In the /admin location? */ + + + invalidate_cupsd_cache(cg); + + cg->cupsd_update = time(NULL); + httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname)); + + while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) + { + if (!value && strncmp(line, "")) + { + in_policy = 0; + } + else if (!_cups_strcasecmp(line, "")) + { + in_cancel_job = 0; + } + else if (!_cups_strcasecmp(line, "Require") && in_cancel_job) + { + cancel_policy = 0; + } + else if (!_cups_strcasecmp(line, "")) + { + in_admin_location = 0; + in_location = 0; + } + else if (!_cups_strcasecmp(line, "Allow") && value && + _cups_strcasecmp(value, "localhost") && _cups_strcasecmp(value, "127.0.0.1") +#ifdef AF_LOCAL + && *value != '/' +#endif /* AF_LOCAL */ +#ifdef AF_INET6 + && strcmp(value, "::1") +#endif /* AF_INET6 */ + ) + { + if (in_admin_location) + remote_admin = 1; + else if (!_cups_strcasecmp(value, "all")) + remote_any = 1; + } + else if (line[0] != '<' && !in_location && !in_policy && + _cups_strcasecmp(line, "Allow") && + _cups_strcasecmp(line, "AuthType") && + _cups_strcasecmp(line, "Deny") && + _cups_strcasecmp(line, "Order") && + _cups_strcasecmp(line, "Require") && + _cups_strcasecmp(line, "Satisfy")) + cg->cupsd_num_settings = cupsAddOption(line, value, + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + } + + cupsFileClose(cupsd); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + debug_logging ? "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + (remote_access && remote_admin) ? + "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, + remote_any ? "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, + (browsing && browse_allow) ? + "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + (remote_access && browsing && + browse_address) ? "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + + cg->cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + cancel_policy ? "1" : "0", + cg->cupsd_num_settings, + &(cg->cupsd_settings)); + } + else if (status != HTTP_NOT_MODIFIED) + invalidate_cupsd_cache(cg); + + /* + * Remove any temporary files and copy the settings array... + */ + + if (remote) + unlink(cupsdconf); + + for (i = cg->cupsd_num_settings, setting = cg->cupsd_settings; + i > 0; + i --, setting ++) + *num_settings = cupsAddOption(setting->name, setting->value, + *num_settings, settings); + + return (cg->cupsd_num_settings > 0); +} + + +/* + * 'cupsAdminSetServerSettings()' - Set settings on the server. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsAdminSetServerSettings( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + int num_settings, /* I - Number of settings */ + cups_option_t *settings) /* I - Settings */ +{ + int i; /* Looping var */ + http_status_t status; /* GET/PUT status */ + const char *server_port_env; /* SERVER_PORT env var */ + int server_port; /* IPP port for server */ + cups_file_t *cupsd; /* cupsd.conf file */ + char cupsdconf[1024]; /* cupsd.conf filename */ + int remote; /* Remote cupsd.conf file? */ + char tempfile[1024]; /* Temporary new cupsd.conf */ + cups_file_t *temp; /* Temporary file */ + char line[1024], /* Line from cupsd.conf file */ + *value; /* Value on line */ + int linenum, /* Line number in file */ + in_location, /* In a location section? */ + in_policy, /* In a policy section? */ + in_default_policy, /* In the default policy section? */ + in_cancel_job, /* In a cancel-job section? */ + in_admin_location, /* In the /admin location? */ + in_conf_location, /* In the /admin/conf location? */ + in_root_location; /* In the / location? */ + const char *val; /* Setting value */ + int remote_printers, /* Show remote printers */ + share_printers, /* Share local printers */ + remote_admin, /* Remote administration allowed? */ + remote_any, /* Remote access from anywhere? */ + user_cancel_any, /* Cancel-job policy set? */ + debug_logging; /* LogLevel debug set? */ + int wrote_port_listen, /* Wrote the port/listen lines? */ + wrote_browsing, /* Wrote the browsing lines? */ + wrote_policy, /* Wrote the policy? */ + wrote_loglevel, /* Wrote the LogLevel line? */ + wrote_admin_location, /* Wrote the /admin location? */ + wrote_conf_location, /* Wrote the /admin/conf location? */ + wrote_root_location; /* Wrote the / location? */ + int indent; /* Indentation */ + int cupsd_num_settings; /* New number of settings */ + int old_remote_printers, /* Show remote printers */ + old_share_printers, /* Share local printers */ + old_remote_admin, /* Remote administration allowed? */ + old_user_cancel_any, /* Cancel-job policy set? */ + old_debug_logging; /* LogLevel debug set? */ + cups_option_t *cupsd_settings, /* New settings */ + *setting; /* Current setting */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (!http) + http = _cupsConnect(); + + if (!http || !num_settings || !settings) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (0); + } + + /* + * Get the cupsd.conf file... + */ + + if (get_cupsd_conf(http, cg, 0, cupsdconf, sizeof(cupsdconf), + &remote) == HTTP_OK) + { + if ((cupsd = cupsFileOpen(cupsdconf, "r")) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + return (0); + } + } + else + return (0); + + /* + * Get current settings... + */ + + if (!cupsAdminGetServerSettings(http, &cupsd_num_settings, + &cupsd_settings)) + return (0); + + if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, cupsd_num_settings, + cupsd_settings)) != NULL) + old_debug_logging = atoi(val); + else + old_debug_logging = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old debug_logging=%d", + old_debug_logging)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, cupsd_num_settings, + cupsd_settings)) != NULL) + old_remote_admin = atoi(val); + else + old_remote_admin = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old remote_admin=%d", + old_remote_admin)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, cupsd_num_settings, + cupsd_settings)) != NULL) + remote_any = atoi(val); + else + remote_any = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old remote_any=%d", + remote_any)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, cupsd_num_settings, + cupsd_settings)) != NULL) + old_remote_printers = atoi(val); + else + old_remote_printers = 1; + + DEBUG_printf(("1cupsAdminSetServerSettings: old remote_printers=%d", + old_remote_printers)); + + if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, cupsd_num_settings, + cupsd_settings)) != NULL) + old_share_printers = atoi(val); + else + old_share_printers = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old share_printers=%d", + old_share_printers)); + + if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, cupsd_num_settings, + cupsd_settings)) != NULL) + old_user_cancel_any = atoi(val); + else + old_user_cancel_any = 0; + + DEBUG_printf(("1cupsAdminSetServerSettings: old user_cancel_any=%d", + old_user_cancel_any)); + + cupsFreeOptions(cupsd_num_settings, cupsd_settings); + + /* + * Get basic settings... + */ + + if ((val = cupsGetOption(CUPS_SERVER_DEBUG_LOGGING, num_settings, + settings)) != NULL) + { + debug_logging = atoi(val); + + if (debug_logging == old_debug_logging) + { + /* + * No change to this setting... + */ + + debug_logging = -1; + } + } + else + debug_logging = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: debug_logging=%d", + debug_logging)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ANY, num_settings, + settings)) != NULL) + remote_any = atoi(val); + + DEBUG_printf(("1cupsAdminSetServerSettings: remote_any=%d", + remote_any)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_ADMIN, num_settings, + settings)) != NULL) + { + remote_admin = atoi(val); + + if (remote_admin == old_remote_admin) + { + /* + * No change to this setting... + */ + + remote_admin = -1; + } + } + else + remote_admin = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: remote_admin=%d", + remote_admin)); + + if ((val = cupsGetOption(CUPS_SERVER_REMOTE_PRINTERS, num_settings, + settings)) != NULL) + { + remote_printers = atoi(val); + + if (remote_printers == old_remote_printers) + { + /* + * No change to this setting... + */ + + remote_printers = -1; + } + } + else + remote_printers = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: remote_printers=%d", + remote_printers)); + + if ((val = cupsGetOption(CUPS_SERVER_SHARE_PRINTERS, num_settings, + settings)) != NULL) + { + share_printers = atoi(val); + + if (share_printers == old_share_printers) + { + /* + * No change to this setting... + */ + + share_printers = -1; + } + } + else + share_printers = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: share_printers=%d", + share_printers)); + + if ((val = cupsGetOption(CUPS_SERVER_USER_CANCEL_ANY, num_settings, + settings)) != NULL) + { + user_cancel_any = atoi(val); + + if (user_cancel_any == old_user_cancel_any) + { + /* + * No change to this setting... + */ + + user_cancel_any = -1; + } + } + else + user_cancel_any = -1; + + DEBUG_printf(("1cupsAdminSetServerSettings: user_cancel_any=%d", + user_cancel_any)); + + /* + * Create a temporary file for the new cupsd.conf file... + */ + + if ((temp = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL) + { + cupsFileClose(cupsd); + + if (remote) + unlink(cupsdconf); + + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + return (0); + } + + /* + * Copy the old file to the new, making changes along the way... + */ + + cupsd_num_settings = 0; + in_admin_location = 0; + in_cancel_job = 0; + in_conf_location = 0; + in_default_policy = 0; + in_location = 0; + in_policy = 0; + in_root_location = 0; + linenum = 0; + wrote_admin_location = 0; + wrote_browsing = 0; + wrote_conf_location = 0; + wrote_loglevel = 0; + wrote_policy = 0; + wrote_port_listen = 0; + wrote_root_location = 0; + indent = 0; + + if ((server_port_env = getenv("SERVER_PORT")) != NULL) + { + if ((server_port = atoi(server_port_env)) <= 0) + server_port = ippPort(); + } + else + server_port = ippPort(); + + if (server_port <= 0) + server_port = IPP_PORT; + + while (cupsFileGetConf(cupsd, line, sizeof(line), &value, &linenum)) + { + if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen")) && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) + { + if (!wrote_port_listen) + { + wrote_port_listen = 1; + + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + { + cupsFilePuts(temp, "# Allow remote access\n"); + cupsFilePrintf(temp, "Port %d\n", server_port); + } + else + { + cupsFilePuts(temp, "# Only listen for connections from the local " + "machine.\n"); + cupsFilePrintf(temp, "Listen localhost:%d\n", server_port); + } + +#ifdef CUPS_DEFAULT_DOMAINSOCKET + if ((!value || strcmp(CUPS_DEFAULT_DOMAINSOCKET, value)) && + !access(CUPS_DEFAULT_DOMAINSOCKET, 0)) + cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n"); +#endif /* CUPS_DEFAULT_DOMAINSOCKET */ + } + else if (value && value[0] == '/' +#ifdef CUPS_DEFAULT_DOMAINSOCKET + && strcmp(CUPS_DEFAULT_DOMAINSOCKET, value) +#endif /* CUPS_DEFAULT_DOMAINSOCKET */ + ) + cupsFilePrintf(temp, "Listen %s\n", value); + } + else if ((!_cups_strcasecmp(line, "Browsing") || + !_cups_strcasecmp(line, "BrowseAddress") || + !_cups_strcasecmp(line, "BrowseAllow") || + !_cups_strcasecmp(line, "BrowseDeny") || + !_cups_strcasecmp(line, "BrowseLocalProtocols") || + !_cups_strcasecmp(line, "BrowseRemoteProtocols") || + !_cups_strcasecmp(line, "BrowseOrder")) && + (remote_printers >= 0 || share_printers >= 0)) + { + if (!wrote_browsing) + { + int new_remote_printers = (remote_printers > 0 || + (remote_printers == -1 && + old_remote_printers > 0)); + int new_share_printers = (share_printers > 0 || + (share_printers == -1 && + old_share_printers > 0)); + + wrote_browsing = 1; + + if (new_remote_printers || new_share_printers) + { + const char *localp = cupsGetOption("BrowseLocalProtocols", + num_settings, settings); + const char *remotep = cupsGetOption("BrowseRemoteProtocols", + num_settings, settings); + + if (!localp || !localp[0]) + localp = cupsGetOption("BrowseLocalProtocols", cupsd_num_settings, + cupsd_settings); + + if (!remotep) + remotep = cupsGetOption("BrowseRemoteProtocols", cupsd_num_settings, + cupsd_settings); + + if (new_remote_printers && new_share_printers) + cupsFilePuts(temp, + "# Enable printer sharing and shared printers.\n"); + else if (new_remote_printers) + cupsFilePuts(temp, + "# Show shared printers on the local network.\n"); + else + cupsFilePuts(temp, + "# Share local printers on the local network.\n"); + + cupsFilePuts(temp, "Browsing On\n"); + cupsFilePuts(temp, "BrowseOrder allow,deny\n"); + + if (new_remote_printers) + { + cupsFilePuts(temp, "BrowseAllow all\n"); + + if (!remotep) + remotep = CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS; + + cupsFilePrintf(temp, "BrowseRemoteProtocols %s\n", remotep); + } + else + cupsFilePuts(temp, "BrowseRemoteProtocols\n"); + + cupsd_num_settings = cupsAddOption("BrowseRemoteProtocols", remotep, + cupsd_num_settings, + &cupsd_settings); + + if (new_share_printers) + { + cupsFilePuts(temp, "BrowseAddress @LOCAL\n"); + + if (!localp) + localp = CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS; + + cupsFilePrintf(temp, "BrowseLocalProtocols %s\n", localp); + } + else + cupsFilePuts(temp, "BrowseLocalProtocols\n"); + + cupsd_num_settings = cupsAddOption("BrowseLocalProtocols", localp, + cupsd_num_settings, + &cupsd_settings); + } + else + { + cupsFilePuts(temp, + "# Disable printer sharing and shared printers.\n"); + cupsFilePuts(temp, "Browsing Off\n"); + } + } + } + else if (!_cups_strcasecmp(line, "LogLevel") && debug_logging >= 0) + { + wrote_loglevel = 1; + + if (debug_logging) + { + cupsFilePuts(temp, + "# Show troubleshooting information in error_log.\n"); + cupsFilePuts(temp, "LogLevel debug\n"); + } + else + { + cupsFilePuts(temp, "# Show general information in error_log.\n"); + cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); + } + } + else if (!_cups_strcasecmp(line, "\n", line, value); + indent += 2; + } + else if (!_cups_strcasecmp(line, "")) + { + indent -= 2; + if (!wrote_policy && in_default_policy) + { + wrote_policy = 1; + + if (!user_cancel_any) + cupsFilePuts(temp, " # Only the owner or an administrator can " + "cancel a job...\n" + " \n" + " Order deny,allow\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" + " \n"); + } + + in_policy = 0; + in_default_policy = 0; + + cupsFilePuts(temp, "\n"); + } + else if (!_cups_strcasecmp(line, "\n", line, value); + } + else if (!_cups_strcasecmp(line, "")) + { + in_location = 0; + indent -= 2; + if (in_admin_location && remote_admin >= 0) + { + wrote_admin_location = 1; + + if (remote_admin) + cupsFilePuts(temp, " # Allow remote administration...\n"); + else if (remote_admin == 0) + cupsFilePuts(temp, " # Restrict access to the admin pages...\n"); + + cupsFilePuts(temp, " Order allow,deny\n"); + + if (remote_admin) + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); + } + else if (in_conf_location && remote_admin >= 0) + { + wrote_conf_location = 1; + + if (remote_admin) + cupsFilePuts(temp, " # Allow remote access to the configuration " + "files...\n"); + else + cupsFilePuts(temp, " # Restrict access to the configuration " + "files...\n"); + + cupsFilePuts(temp, " Order allow,deny\n"); + + if (remote_admin) + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); + } + else if (in_root_location && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) + { + wrote_root_location = 1; + + if (remote_admin > 0 && share_printers > 0) + cupsFilePuts(temp, " # Allow shared printing and remote " + "administration...\n"); + else if (remote_admin > 0) + cupsFilePuts(temp, " # Allow remote administration...\n"); + else if (share_printers > 0) + cupsFilePuts(temp, " # Allow shared printing...\n"); + else if (remote_any > 0) + cupsFilePuts(temp, " # Allow remote access...\n"); + else + cupsFilePuts(temp, " # Restrict access to the server...\n"); + + cupsFilePuts(temp, " Order allow,deny\n"); + + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + cupsFilePrintf(temp, " Allow %s\n", + remote_any > 0 ? "all" : "@LOCAL"); + } + + in_admin_location = 0; + in_conf_location = 0; + in_root_location = 0; + + cupsFilePuts(temp, "\n"); + } + else if (!_cups_strcasecmp(line, "= 0) + { + /* + * Don't write anything for this limit section... + */ + + in_cancel_job = 2; + } + else + { + cupsFilePrintf(temp, "%*s%s", indent, "", line); + + while (*value) + { + for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++); + + if (*valptr) + *valptr++ = '\0'; + + if (!_cups_strcasecmp(value, "cancel-job") && user_cancel_any >= 0) + { + /* + * Write everything except for this definition... + */ + + in_cancel_job = 1; + } + else + cupsFilePrintf(temp, " %s", value); + + for (value = valptr; _cups_isspace(*value); value ++); + } + + cupsFilePuts(temp, ">\n"); + } + } + else + cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value); + + indent += 2; + } + else if (!_cups_strcasecmp(line, "
") && in_cancel_job) + { + indent -= 2; + + if (in_cancel_job == 1) + cupsFilePuts(temp, " \n"); + + wrote_policy = 1; + + if (!user_cancel_any) + cupsFilePuts(temp, " # Only the owner or an administrator can cancel " + "a job...\n" + " \n" + " Order deny,allow\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" + " \n"); + + in_cancel_job = 0; + } + else if ((((in_admin_location || in_conf_location || in_root_location) && + (remote_admin >= 0 || remote_any > 0)) || + (in_root_location && share_printers >= 0)) && + (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny") || + !_cups_strcasecmp(line, "Order"))) + continue; + else if (in_cancel_job == 2) + continue; + else if (line[0] == '<') + { + if (value) + { + cupsFilePrintf(temp, "%*s%s %s>\n", indent, "", line, value); + indent += 2; + } + else + { + if (line[1] == '/') + indent -= 2; + + cupsFilePrintf(temp, "%*s%s\n", indent, "", line); + } + } + else if (!in_policy && !in_location && + (val = cupsGetOption(line, num_settings, settings)) != NULL) + { + /* + * Replace this directive's value with the new one... + */ + + cupsd_num_settings = cupsAddOption(line, val, cupsd_num_settings, + &cupsd_settings); + + /* + * Write the new value in its place, without indentation since we + * only support setting root directives, not in sections... + */ + + cupsFilePrintf(temp, "%s %s\n", line, val); + } + else if (value) + { + if (!in_policy && !in_location) + { + /* + * Record the non-policy, non-location directives that we find + * in the server settings, since we cache this info and record it + * in cupsAdminGetServerSettings()... + */ + + cupsd_num_settings = cupsAddOption(line, value, cupsd_num_settings, + &cupsd_settings); + } + + cupsFilePrintf(temp, "%*s%s %s\n", indent, "", line, value); + } + else + cupsFilePrintf(temp, "%*s%s\n", indent, "", line); + } + + /* + * Write any missing info... + */ + + if (!wrote_browsing && (remote_printers >= 0 || share_printers >= 0)) + { + if (remote_printers > 0 || share_printers > 0) + { + if (remote_printers > 0 && share_printers > 0) + cupsFilePuts(temp, "# Enable printer sharing and shared printers.\n"); + else if (remote_printers > 0) + cupsFilePuts(temp, "# Show shared printers on the local network.\n"); + else + cupsFilePuts(temp, "# Share local printers on the local network.\n"); + + cupsFilePuts(temp, "Browsing On\n"); + cupsFilePuts(temp, "BrowseOrder allow,deny\n"); + + if (remote_printers > 0) + cupsFilePuts(temp, "BrowseAllow all\n"); + + if (share_printers > 0) + cupsFilePuts(temp, "BrowseAddress @LOCAL\n"); + } + else + { + cupsFilePuts(temp, "# Disable printer sharing and shared printers.\n"); + cupsFilePuts(temp, "Browsing Off\n"); + } + } + + if (!wrote_loglevel && debug_logging >= 0) + { + if (debug_logging) + { + cupsFilePuts(temp, "# Show troubleshooting information in error_log.\n"); + cupsFilePuts(temp, "LogLevel debug\n"); + } + else + { + cupsFilePuts(temp, "# Show general information in error_log.\n"); + cupsFilePuts(temp, "LogLevel " CUPS_DEFAULT_LOG_LEVEL "\n"); + } + } + + if (!wrote_port_listen && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) + { + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + { + cupsFilePuts(temp, "# Allow remote access\n"); + cupsFilePrintf(temp, "Port %d\n", ippPort()); + } + else + { + cupsFilePuts(temp, + "# Only listen for connections from the local machine.\n"); + cupsFilePrintf(temp, "Listen localhost:%d\n", ippPort()); + } + +#ifdef CUPS_DEFAULT_DOMAINSOCKET + if (!access(CUPS_DEFAULT_DOMAINSOCKET, 0)) + cupsFilePuts(temp, "Listen " CUPS_DEFAULT_DOMAINSOCKET "\n"); +#endif /* CUPS_DEFAULT_DOMAINSOCKET */ + } + + if (!wrote_root_location && + (remote_admin >= 0 || remote_any > 0 || share_printers >= 0)) + { + if (remote_admin > 0 && share_printers > 0) + cupsFilePuts(temp, + "# Allow shared printing and remote administration...\n"); + else if (remote_admin > 0) + cupsFilePuts(temp, "# Allow remote administration...\n"); + else if (share_printers > 0) + cupsFilePuts(temp, "# Allow shared printing...\n"); + else if (remote_any > 0) + cupsFilePuts(temp, "# Allow remote access...\n"); + else + cupsFilePuts(temp, "# Restrict access to the server...\n"); + + cupsFilePuts(temp, "\n" + " Order allow,deny\n"); + + if (remote_admin > 0 || remote_any > 0 || share_printers > 0) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + + cupsFilePuts(temp, "\n"); + } + + if (!wrote_admin_location && remote_admin >= 0) + { + if (remote_admin) + cupsFilePuts(temp, "# Allow remote administration...\n"); + else + cupsFilePuts(temp, "# Restrict access to the admin pages...\n"); + + cupsFilePuts(temp, "\n" + " Order allow,deny\n"); + + if (remote_admin) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + + cupsFilePuts(temp, "\n"); + } + + if (!wrote_conf_location && remote_admin >= 0) + { + if (remote_admin) + cupsFilePuts(temp, + "# Allow remote access to the configuration files...\n"); + else + cupsFilePuts(temp, "# Restrict access to the configuration files...\n"); + + cupsFilePuts(temp, "\n" + " AuthType Default\n" + " Require user @SYSTEM\n" + " Order allow,deny\n"); + + if (remote_admin) + cupsFilePrintf(temp, " Allow %s\n", remote_any > 0 ? "all" : "@LOCAL"); + + cupsFilePuts(temp, "\n"); + } + + if (!wrote_policy && user_cancel_any >= 0) + { + cupsFilePuts(temp, "\n" + " # Job-related operations must be done by the owner " + "or an administrator...\n" + " \n" + " Require user @OWNER @SYSTEM\n" + " Order deny,allow\n" + " \n" + " # All administration operations require an " + "administrator to authenticate...\n" + " \n" + " AuthType Default\n" + " Require user @SYSTEM\n" + " Order deny,allow\n" + "\n"); + + if (!user_cancel_any) + cupsFilePuts(temp, " # Only the owner or an administrator can cancel " + "a job...\n" + " \n" + " Order deny,allow\n" + " Require user @OWNER " + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" + " \n"); + + cupsFilePuts(temp, " \n" + " Order deny,allow\n" + " \n" + "\n"); + } + + for (i = num_settings, setting = settings; i > 0; i --, setting ++) + if (setting->name[0] != '_' && + _cups_strcasecmp(setting->name, "Listen") && + _cups_strcasecmp(setting->name, "Port") && + !cupsGetOption(setting->name, cupsd_num_settings, cupsd_settings)) + { + /* + * Add this directive to the list of directives we have written... + */ + + cupsd_num_settings = cupsAddOption(setting->name, setting->value, + cupsd_num_settings, &cupsd_settings); + + /* + * Write the new value, without indentation since we only support + * setting root directives, not in sections... + */ + + cupsFilePrintf(temp, "%s %s\n", setting->name, setting->value); + } + + cupsFileClose(cupsd); + cupsFileClose(temp); + + /* + * Upload the configuration file to the server... + */ + + status = cupsPutFile(http, "/admin/conf/cupsd.conf", tempfile); + + if (status == HTTP_CREATED) + { + /* + * Updated OK, add the basic settings... + */ + + if (debug_logging >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + debug_logging ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, + old_debug_logging ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (remote_admin >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + remote_admin ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, + old_remote_admin ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, + remote_any ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (remote_printers >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, + remote_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, + old_remote_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (share_printers >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + share_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, + old_share_printers ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + if (user_cancel_any >= 0) + cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + user_cancel_any ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + else + cupsd_num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, + old_user_cancel_any ? "1" : "0", + cupsd_num_settings, &cupsd_settings); + + /* + * Save the new values... + */ + + invalidate_cupsd_cache(cg); + + cg->cupsd_num_settings = cupsd_num_settings; + cg->cupsd_settings = cupsd_settings; + cg->cupsd_update = time(NULL); + + httpGetHostname(http, cg->cupsd_hostname, sizeof(cg->cupsd_hostname)); + } + else + cupsFreeOptions(cupsd_num_settings, cupsd_settings); + + /* + * Remote our temp files and return... + */ + + if (remote) + unlink(cupsdconf); + + unlink(tempfile); + + return (status == HTTP_CREATED); +} + + +/* + * 'do_samba_command()' - Do a SAMBA command. + */ + +static int /* O - Status of command */ +do_samba_command(const char *command, /* I - Command to run */ + const char *address, /* I - Address for command */ + const char *subcmd, /* I - Sub-command */ + const char *authfile, /* I - Samba authentication file */ + FILE *logfile) /* I - Optional log file */ +{ +#ifdef WIN32 + return (1); /* Always fail on Windows... */ + +#else + int status; /* Status of command */ + int pid; /* Process ID of child */ + + + if (logfile) + _cupsLangPrintf(logfile, + _("Running command: %s %s -N -A %s -c \'%s\'"), + command, address, authfile, subcmd); + + if ((pid = fork()) == 0) + { + /* + * Child goes here, redirect stdin/out/err and execute the command... + */ + + int fd = open("/dev/null", O_RDONLY); + + if (fd > 0) + { + dup2(fd, 0); + close(fd); + } + + if (logfile) + dup2(fileno(logfile), 1); + else if ((fd = open("/dev/null", O_WRONLY)) > 1) + { + dup2(fd, 1); + close(fd); + } + + dup2(1, 2); + + execlp(command, command, address, "-N", "-A", authfile, "-c", subcmd, + (char *)0); + exit(errno); + } + else if (pid < 0) + { + status = -1; + + if (logfile) + _cupsLangPrintf(logfile, _("Unable to run \"%s\": %s"), + command, strerror(errno)); + } + else + { + /* + * Wait for the process to complete... + */ + + while (wait(&status) != pid); + } + + if (logfile) + _cupsLangPuts(logfile, ""); + + DEBUG_printf(("9do_samba_command: status=%d", status)); + + if (WIFEXITED(status)) + return (WEXITSTATUS(status)); + else + return (-WTERMSIG(status)); +#endif /* WIN32 */ +} + + +/* + * 'get_cupsd_conf()' - Get the current cupsd.conf file. + */ + +static http_status_t /* O - Status of request */ +get_cupsd_conf( + http_t *http, /* I - Connection to server */ + _cups_globals_t *cg, /* I - Global data */ + time_t last_update, /* I - Last update time for file */ + char *name, /* I - Filename buffer */ + int namesize, /* I - Size of filename buffer */ + int *remote) /* O - Remote file? */ +{ + int fd; /* Temporary file descriptor */ +#ifndef WIN32 + struct stat info; /* cupsd.conf file information */ +#endif /* WIN32 */ + http_status_t status; /* Status of getting cupsd.conf */ + char host[HTTP_MAX_HOST]; /* Hostname for connection */ + + + /* + * See if we already have the data we need... + */ + + httpGetHostname(http, host, sizeof(host)); + + if (_cups_strcasecmp(cg->cupsd_hostname, host)) + invalidate_cupsd_cache(cg); + + snprintf(name, namesize, "%s/cupsd.conf", cg->cups_serverroot); + *remote = 0; + +#ifndef WIN32 + if (!_cups_strcasecmp(host, "localhost") && !access(name, R_OK)) + { + /* + * Read the local file rather than using HTTP... + */ + + if (stat(name, &info)) + { + char message[1024]; /* Message string */ + + + snprintf(message, sizeof(message), + _cupsLangString(cupsLangDefault(), _("stat of %s failed: %s")), + name, strerror(errno)); + _cupsSetError(IPP_INTERNAL_ERROR, message, 0); + + *name = '\0'; + + return (HTTP_SERVER_ERROR); + } + else if (last_update && info.st_mtime <= last_update) + status = HTTP_NOT_MODIFIED; + else + status = HTTP_OK; + } + else +#endif /* !WIN32 */ + { + /* + * Read cupsd.conf via a HTTP GET request... + */ + + if ((fd = cupsTempFd(name, namesize)) < 0) + { + *name = '\0'; + + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + invalidate_cupsd_cache(cg); + + return (HTTP_SERVER_ERROR); + } + + *remote = 1; + + httpClearFields(http); + + if (last_update) + httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, + httpGetDateString(last_update)); + + status = cupsGetFd(http, "/admin/conf/cupsd.conf", fd); + + close(fd); + + if (status != HTTP_OK) + { + unlink(name); + *name = '\0'; + } + } + + return (status); +} + + +/* + * 'invalidate_cupsd_cache()' - Invalidate the cached cupsd.conf settings. + */ + +static void +invalidate_cupsd_cache( + _cups_globals_t *cg) /* I - Global data */ +{ + cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings); + + cg->cupsd_hostname[0] = '\0'; + cg->cupsd_update = 0; + cg->cupsd_num_settings = 0; + cg->cupsd_settings = NULL; +} + + +/* + * 'write_option()' - Write a CUPS option to a PPD file. + */ + +static void +write_option(cups_file_t *dstfp, /* I - PPD file */ + int order, /* I - Order dependency */ + const char *name, /* I - Option name */ + const char *text, /* I - Option text */ + const char *attrname, /* I - Attribute name */ + ipp_attribute_t *suppattr, /* I - IPP -supported attribute */ + ipp_attribute_t *defattr, /* I - IPP -default attribute */ + int defval, /* I - Default value number */ + int valcount) /* I - Number of values */ +{ + int i; /* Looping var */ + + + cupsFilePrintf(dstfp, "*JCLOpenUI *%s/%s: PickOne\n" + "*OrderDependency: %d JCLSetup *%s\n", + name, text, order, name); + + if (defattr->value_tag == IPP_TAG_INTEGER) + { + /* + * Do numeric options with a range or list... + */ + + cupsFilePrintf(dstfp, "*Default%s: %d\n", name, + defattr->values[defval].integer); + + if (suppattr->value_tag == IPP_TAG_RANGE) + { + /* + * List each number in the range... + */ + + for (i = suppattr->values[0].range.lower; + i <= suppattr->values[0].range.upper; + i ++) + { + cupsFilePrintf(dstfp, "*%s %d: \"", name, i); + + if (valcount == 1) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%d\n\"\n*End\n", + attrname, i); + else if (defval == 0) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%d\"\n", attrname, i); + else if (defval < (valcount - 1)) + cupsFilePrintf(dstfp, ",%d\"\n", i); + else + cupsFilePrintf(dstfp, ",%d\n\"\n*End\n", i); + } + } + else + { + /* + * List explicit numbers... + */ + + for (i = 0; i < suppattr->num_values; i ++) + { + cupsFilePrintf(dstfp, "*%s %d: \"", name, suppattr->values[i].integer); + + if (valcount == 1) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%d\n\"\n*End\n", attrname, + suppattr->values[i].integer); + else if (defval == 0) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%d\"\n", attrname, + suppattr->values[i].integer); + else if (defval < (valcount - 1)) + cupsFilePrintf(dstfp, ",%d\"\n", suppattr->values[i].integer); + else + cupsFilePrintf(dstfp, ",%d\n\"\n*End\n", suppattr->values[i].integer); + } + } + } + else + { + /* + * Do text options with a list... + */ + + cupsFilePrintf(dstfp, "*Default%s: %s\n", name, + defattr->values[defval].string.text); + + for (i = 0; i < suppattr->num_values; i ++) + { + cupsFilePrintf(dstfp, "*%s %s: \"", name, + suppattr->values[i].string.text); + + if (valcount == 1) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%s\n\"\n*End\n", attrname, + suppattr->values[i].string.text); + else if (defval == 0) + cupsFilePrintf(dstfp, "%%cupsJobTicket: %s=%s\"\n", attrname, + suppattr->values[i].string.text); + else if (defval < (valcount - 1)) + cupsFilePrintf(dstfp, ",%s\"\n", suppattr->values[i].string.text); + else + cupsFilePrintf(dstfp, ",%s\n\"\n*End\n", + suppattr->values[i].string.text); + } + } + + cupsFilePrintf(dstfp, "*JCLCloseUI: *%s\n\n", name); +} + + +/* + * End of "$Id: adminutil.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/adminutil.h b/cups/adminutil.h new file mode 100644 index 0000000..ed3e235 --- /dev/null +++ b/cups/adminutil.h @@ -0,0 +1,78 @@ +/* + * "$Id: adminutil.h 9063 2010-04-01 17:01:09Z mike $" + * + * Administration utility API definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2001-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_ADMINUTIL_H_ +# define _CUPS_ADMINUTIL_H_ + +/* + * Include necessary headers... + */ + +# include +# include "cups.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define CUPS_SERVER_DEBUG_LOGGING "_debug_logging" +# define CUPS_SERVER_REMOTE_ADMIN "_remote_admin" +# define CUPS_SERVER_REMOTE_ANY "_remote_any" +# define CUPS_SERVER_REMOTE_PRINTERS "_remote_printers" +# define CUPS_SERVER_SHARE_PRINTERS "_share_printers" +# define CUPS_SERVER_USER_CANCEL_ANY "_user_cancel_any" + + +/* + * Functions... + */ + +extern int cupsAdminExportSamba(const char *dest, const char *ppd, + const char *samba_server, + const char *samba_user, + const char *samba_password, + FILE *logfile) _CUPS_API_1_2; +extern char *cupsAdminCreateWindowsPPD(http_t *http, const char *dest, + char *buffer, int bufsize) _CUPS_API_1_2; + +extern int cupsAdminGetServerSettings(http_t *http, + int *num_settings, + cups_option_t **settings) _CUPS_API_1_3; +extern int cupsAdminSetServerSettings(http_t *http, + int num_settings, + cups_option_t *settings) _CUPS_API_1_3; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_ADMINUTIL_H_ */ + +/* + * End of "$Id: adminutil.h 9063 2010-04-01 17:01:09Z mike $". + */ diff --git a/cups/api-array.header b/cups/api-array.header new file mode 100644 index 0000000..88e5341 --- /dev/null +++ b/cups/api-array.header @@ -0,0 +1,34 @@ + + +

Array API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/array.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/cups/api-array.shtml b/cups/api-array.shtml new file mode 100644 index 0000000..7406a0d --- /dev/null +++ b/cups/api-array.shtml @@ -0,0 +1,196 @@ + + +

Overview

+ +

The CUPS array API provides a high-performance generic array container. +The contents of the array container can be sorted and the container itself is +designed for optimal speed and memory usage under a wide variety of conditions. +Sorted arrays use a binary search algorithm from the last found or inserted +element to quickly find matching elements in the array. Arrays created with the +optional hash function can often find elements with a single lookup. The +cups_array_t type is used when +referring to a CUPS array.

+ +

The CUPS scheduler (cupsd) and many of the CUPS API +functions use the array API to efficiently manage large lists of +data.

+ +

Managing Arrays

+ +

Arrays are created using either the +cupsArrayNew, +cupsArrayNew2, or +cupsArrayNew3 functions. The +first function creates a new array with the specified callback function +and user data pointer:

+ +
+#include <cups/array.h>
+
+static int compare_func(void *first, void *second, void *user_data);
+
+void *user_data;
+cups_array_t *array = cupsArrayNew(compare_func, user_data);
+
+ +

The comparison function (type +cups_arrayfunc_t) is called +whenever an element is added to the array and can be NULL to +create an unsorted array. The function returns -1 if the first element should +come before the second, 0 if the first and second elements should have the same +ordering, and 1 if the first element should come after the second.

+ +

The "user_data" pointer is passed to your comparison function. Pass +NULL if you do not need to associate the elements in your array +with additional information.

+ +

The cupsArrayNew2 function adds +two more arguments to support hashed lookups, which can potentially provide +instantaneous ("O(1)") lookups in your array:

+ +
+#include <cups/array.h>
+
+#define HASH_SIZE 512 /* Size of hash table */
+
+static int compare_func(void *first, void *second, void *user_data);
+static int hash_func(void *element, void *user_data);
+
+void *user_data;
+cups_array_t *hash_array = cupsArrayNew2(compare_func, user_data, hash_func, HASH_SIZE);
+
+ +

The hash function (type +cups_ahash_func_t) should return a +number from 0 to (hash_size-1) that (hopefully) uniquely identifies the +element and is called whenever you look up an element in the array with +cupsArrayFind. The hash size is +only limited by available memory, but generally should not be larger than +16384 to realize any performance improvement.

+ +

The cupsArrayNew3 function adds +copy and free callbacks to support basic memory management of elements:

+ +
+#include <cups/array.h>
+
+#define HASH_SIZE 512 /* Size of hash table */
+
+static int compare_func(void *first, void *second, void *user_data);
+static void *copy_func(void *element, void *user_data);
+static void free_func(void *element, void *user_data);
+static int hash_func(void *element, void *user_data);
+
+void *user_data;
+cups_array_t *array = cupsArrayNew3(compare_func, user_data, NULL, 0, copy_func, free_func);
+
+cups_array_t *hash_array = cupsArrayNew3(compare_func, user_data, hash_func, HASH_SIZE, copy_func, free_func);
+
+ +

Once you have created the array, you add elements using the +cupsArrayAdd +cupsArrayInsert functions. +The first function adds an element to the array, adding the new element +after any elements that have the same order, while the second inserts the +element before others with the same order. For unsorted arrays, +cupsArrayAdd appends the element to +the end of the array while +cupsArrayInsert inserts the +element at the beginning of the array. For example, the following code +creates a sorted array of character strings:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+ +

Elements are removed using the +cupsArrayRemove function, for +example:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+/* Remove "Red Fish" */
+cupsArrayRemove(array, "Red Fish");
+
+ +

Finally, you free the memory used by the array using the +cupsArrayDelete function. All +of the memory for the array and hash table (if any) is freed, however CUPS +does not free the elements unless you provide copy and free functions.

+ +

Finding and Enumerating Elements

+ +

CUPS provides several functions to find and enumerate elements in an +array. Each one sets or updates a "current index" into the array, such that +future lookups will start where the last one left off:

+ +
+
cupsArrayFind
+
Returns the first matching element.
+
cupsArrayFirst
+
Returns the first element in the array.
+
cupsArrayIndex
+
Returns the Nth element in the array, starting at 0.
+
cupsArrayLast
+
Returns the last element in the array.
+
cupsArrayNext
+
Returns the next element in the array.
+
cupsArrayPrev
+
Returns the previous element in the array.
+
+ +

Each of these functions returns NULL when there is no +corresponding element. For example, a simple for loop using the +cupsArrayFirst and +cupsArrayNext functions will +enumerate all of the strings in our previous example:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+/* Show all of the strings in the array */
+char *s;
+for (s = (char *)cupsArrayFirst(array); s != NULL; s = (char *)cupsArrayNext(array))
+  puts(s);
+
diff --git a/cups/api-cups.header b/cups/api-cups.header new file mode 100644 index 0000000..8e6d3c0 --- /dev/null +++ b/cups/api-cups.header @@ -0,0 +1,40 @@ + + +

CUPS API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cups.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: Array API
+ Programming: File and Directory APIs
+ Programming: Filter and Backend Programming
+ Programming: HTTP and IPP APIs
+ Programming: PPD API
+ Programming: Raster API
diff --git a/cups/api-cups.shtml b/cups/api-cups.shtml new file mode 100644 index 0000000..dcc4fe9 --- /dev/null +++ b/cups/api-cups.shtml @@ -0,0 +1,443 @@ + + +

Overview

+ +

The CUPS API provides the convenience functions needed to support +applications, filters, printer drivers, and backends that need to interface +with the CUPS scheduler.

+ +

Clients and Servers

+ +

CUPS is based on the Internet Printing Protocol ("IPP"), which allows +clients (applications) to communicate with a server (the scheduler) to get a +list of printers, send print jobs, and so forth. You identify which server +you want to communicate with using a pointer to the opaque structure +http_t. All of the examples in this document use the +CUPS_HTTP_DEFAULT constant, referring to the default connection +to the scheduler. The HTTP and IPP +APIs document provides more information on server connections.

+ +

Printers and Classes

+ +

Printers and classes (collections of printers) are accessed through +the cups_dest_t structure which +includes the name (name), instance (instance - +a way of selecting certain saved options/settings), and the options and +attributes associated with that destination (num_options and +options). Destinations are created using the +cupsGetDests function and freed +using the cupsFreeDests function. +The cupsGetDest function finds a +specific destination for printing:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dests;
+int num_dests = cupsGetDests(&dests);
+cups_dest_t *dest = cupsGetDest("name", NULL, num_dests, dests);
+
+/* do something with dest */
+
+cupsFreeDests(num_dests, dests);
+
+ +

Passing NULL to +cupsGetDest for the destination name +will return the default destination. Similarly, passing a NULL +instance will return the default instance for that destination.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Printer Attributes
Attribute NameDescription
"auth-info-required"The type of authentication required for printing to this + destination: "none", "username,password", "domain,username,password", + or "negotiate" (Kerberos)
"printer-info"The human-readable description of the destination such as "My + Laser Printer".
"printer-is-accepting-jobs""true" if the destination is accepting new jobs, "false" if + not.
"printer-is-shared""true" if the destination is being shared with other computers, + "false" if not.
"printer-location"The human-readable location of the destination such as "Lab 4".
"printer-make-and-model"The human-readable make and model of the destination such as "HP + LaserJet 4000 Series".
"printer-state""3" if the destination is idle, "4" if the destination is printing + a job, and "5" if the destination is stopped.
"printer-state-change-time"The UNIX time when the destination entered the current state.
"printer-state-reasons"Additional comma-delimited state keywords for the destination + such as "media-tray-empty-error" and "toner-low-warning".
"printer-type"The cups_printer_t + value associated with the destination.
+ +

Options

+ +

Options are stored in arrays of +cups_option_t structures. Each +option has a name (name) and value (value) +associated with it. The cups_dest_t +num_options and options members contain the +default options for a particular destination, along with several informational +attributes about the destination as shown in Table 1. +The cupsGetOption function gets +the value for the named option. For example, the following code lists the +available destinations and their human-readable descriptions:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dests;
+int num_dests = cupsGetDests(&dests);
+cups_dest_t *dest;
+int i;
+const char *value;
+
+for (i = num_dests, dest = dests; i > 0; i --, dest ++)
+  if (dest->instance == NULL)
+  {
+    value = cupsGetOption("printer-info", dest->num_options, dest->options);
+    printf("%s (%s)\n", dest->name, value ? value : "no description");
+  }
+
+cupsFreeDests(num_dests, dests);
+
+ +

You can create your own option arrays using the +cupsAddOption function, which +adds a single named option to an array:

+ +
+#include <cups/cups.h>
+
+int num_options = 0;
+cups_option_t *options = NULL;
+
+/* The returned num_options value is updated as needed */
+num_options = cupsAddOption("first", "value", num_options, &options);
+
+/* This adds a second option value */
+num_options = cupsAddOption("second", "value", num_options, &options);
+
+/* This replaces the first option we added */
+num_options = cupsAddOption("first", "new value", num_options, &options);
+
+ +

Use a for loop to copy the options from a destination:

+ +
+#include <cups/cups.h>
+
+int i;
+int num_options = 0;
+cups_option_t *options = NULL;
+cups_dest_t *dest;
+
+for (i = 0; i < dest->num_options; i ++)
+  num_options = cupsAddOption(dest->options[i].name, dest->options[i].value,
+                              num_options, &options);
+
+ +

Use the cupsFreeOptions +function to free the options array when you are done using it:

+ +
+cupsFreeOptions(num_options, options);
+
+ +

Print Jobs

+ +

Print jobs are identified by a locally-unique job ID number from 1 to +231-1 and have options and one or more files for printing to a +single destination. The cupsPrintFile +function creates a new job with one file. The following code prints the CUPS +test page file:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+
+/* Print a single file */
+job_id = cupsPrintFile(dest->name, "/usr/share/cups/data/testprint.ps",
+                        "Test Print", num_options, options);
+
+ +

The cupsPrintFiles function +creates a job with multiple files. The files are provided in a +char * array:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+char *files[3] = { "file1.pdf", "file2.pdf", "file3.pdf" };
+
+/* Print three files */
+job_id = cupsPrintFiles(dest->name, 3, files, "Test Print", num_options, options);
+
+ +

Finally, the cupsCreateJob +function creates a new job with no files in it. Files are added using the +cupsStartDocument, +cupsWriteRequestData, +and cupsFinishDocument functions. +The following example creates a job with 10 text files for printing:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+int i;
+char buffer[1024];
+
+/* Create the job */
+job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, dest->name, "10 Text Files",
+                       num_options, options);
+
+/* If the job is created, add 10 files */
+if (job_id > 0)
+{
+  for (i = 1; i <= 10; i ++)
+  {
+    snprintf(buffer, sizeof(buffer), "file%d.txt", i);
+
+    cupsStartDocument(CUPS_HTTP_DEFAULT, dest->name, job_id, buffer,
+                      CUPS_FORMAT_TEXT, i == 10);
+
+    snprintf(buffer, sizeof(buffer),
+             "File %d\n"
+             "\n"
+             "One fish,\n"
+             "Two fish,\n
+             "Red fish,\n
+             "Blue fish\n", i);
+
+    /* cupsWriteRequestData can be called as many times as needed */
+    cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, strlen(buffer));
+
+    cupsFinishDocument(CUPS_HTTP_DEFAULT, dest->name);
+  }
+}
+
+ +

Once you have created a job, you can monitor its status using the +cupsGetJobs function, which returns +an array of cups_job_t structures. +Each contains the job ID (id), destination name +(dest), title (title), and other information +associated with the job. The job array is freed using the +cupsFreeJobs function. The following +example monitors a specific job ID, showing the current job state once every +5 seconds until the job is completed:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int job_id;
+int num_jobs;
+cups_job_t *jobs;
+int i;
+ipp_jstate_t job_state = IPP_JOB_PENDING;
+ 
+while (job_state < IPP_JOB_STOPPED)
+{
+  /* Get my jobs (1) with any state (-1) */
+  num_jobs = cupsGetJobs(&jobs, dest->name, 1, -1);
+
+  /* Loop to find my job */
+  job_state = IPP_JOB_COMPLETED;
+
+  for (i = 0; i < num_jobs; i ++)
+    if (jobs[i].id == job_id)
+    {
+      job_state = jobs[i].state;
+      break;
+    }
+
+  /* Free the job array */
+  cupsFreeJobs(num_jobs, jobs);
+
+  /* Show the current state */
+  switch (job_state)
+  {
+    case IPP_JOB_PENDING :
+        printf("Job %d is pending.\n", job_id);
+        break;
+    case IPP_JOB_HELD :
+        printf("Job %d is held.\n", job_id);
+        break;
+    case IPP_JOB_PROCESSING :
+        printf("Job %d is processing.\n", job_id);
+        break;
+    case IPP_JOB_STOPPED :
+        printf("Job %d is stopped.\n", job_id);
+        break;
+    case IPP_JOB_CANCELED :
+        printf("Job %d is canceled.\n", job_id);
+        break;
+    case IPP_JOB_ABORTED :
+        printf("Job %d is aborted.\n", job_id);
+        break;
+    case IPP_JOB_COMPLETED :
+        printf("Job %d is completed.\n", job_id);
+        break;
+  }
+
+  /* Sleep if the job is not finished */
+  if (job_state < IPP_JOB_STOPPED)
+    sleep(5);
+}
+
+ +

To cancel a job, use the +cupsCancelJob function with the +job ID:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int job_id;
+
+cupsCancelJob(dest->name, job_id);
+
+ +

Error Handling

+ +

If any of the CUPS API printing functions returns an error, the reason for +that error can be found by calling the +cupsLastError and +cupsLastErrorString functions. +cupsLastError returns the last IPP +error code +(ipp_status_t) +that was encountered, while +cupsLastErrorString returns +a (localized) human-readable string that can be shown to the user. For example, +if any of the job creation functions returns a job ID of 0, you can use +cupsLastErrorString to show +the reason why the job could not be created:

+ +
+#include <cups/cups.h>
+
+int job_id;
+
+if (job_id == 0)
+  puts(cupsLastErrorString());
+
+ +

Passwords and Authentication

+ +

CUPS supports authentication of any request, including submission of print +jobs. The default mechanism for getting the username and password is to use the +login user and a password from the console.

+ +

To support other types of applications, in particular Graphical User +Interfaces ("GUIs"), the CUPS API provides functions to set the default +username and to register a callback function that returns a password string.

+ +

The cupsSetPasswordCB +function is used to set a password callback in your program. Only one +function can be used at any time.

+ +

The cupsSetUser function sets the +current username for authentication. This function can be called by your +password callback function to change the current username as needed.

+ +

The following example shows a simple password callback that gets a +username and password from the user:

+ +
+#include <cups/cups.h>
+
+const char *
+my_password_cb(const char *prompt)
+{
+  char	user[65];
+
+
+  puts(prompt);
+
+  /* Get a username from the user */
+  printf("Username: ");
+  if (fgets(user, sizeof(user), stdin) == NULL)
+    return (NULL);
+
+  /* Strip the newline from the string and set the user */
+  user[strlen(user) - 1] = '\0';
+
+  cupsSetUser(user);
+
+  /* Use getpass() to ask for the password... */
+  return (getpass("Password: "));
+}
+
+cupsSetPasswordCB(my_password_cb);
+
+ +

Similarly, a GUI could display the prompt string in a window with input +fields for the username and password. The username should default to the +string returned by the cupsUser +function.

diff --git a/cups/api-filedir.header b/cups/api-filedir.header new file mode 100644 index 0000000..63f6296 --- /dev/null +++ b/cups/api-filedir.header @@ -0,0 +1,36 @@ + + +

File and Directory APIs

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/file.h
+ cups/dir.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
diff --git a/cups/api-filedir.shtml b/cups/api-filedir.shtml new file mode 100644 index 0000000..4a4a16f --- /dev/null +++ b/cups/api-filedir.shtml @@ -0,0 +1,31 @@ + + +

Overview

+ +

The CUPS file and directory APIs provide portable interfaces +for manipulating files and listing files and directories. Unlike +stdio FILE streams, the cupsFile functions +allow you to open more than 256 files at any given time. They +also manage the platform-specific details of locking, large file +support, line endings (CR, LF, or CR LF), and reading and writing +files using Flate ("gzip") compression. Finally, you can also +connect, read from, and write to network connections using the +cupsFile functions.

+ +

The cupsDir functions manage the platform-specific +details of directory access/listing and provide a convenient way +to get both a list of files and the information (permissions, +size, timestamp, etc.) for each of those files.

diff --git a/cups/api-filter.header b/cups/api-filter.header new file mode 100644 index 0000000..54e1d89 --- /dev/null +++ b/cups/api-filter.header @@ -0,0 +1,41 @@ + + +

Filter and Backend Programming

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/backend.h
+ cups/sidechannel.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Programming: PPD API
+ Programming: Raster API
+ Programming: Developing PostScript Printer Drivers
+ Programming: Developing Raster Printer Drivers
+ Specifications: CUPS Design Description
diff --git a/cups/api-filter.shtml b/cups/api-filter.shtml new file mode 100644 index 0000000..edc822c --- /dev/null +++ b/cups/api-filter.shtml @@ -0,0 +1,765 @@ + + +

Overview

+ +

Filters (which include printer drivers and port monitors) and backends +are used to convert job files to a printable format and send that data to the +printer itself. All of these programs use a common interface for processing +print jobs and communicating status information to the scheduler. Each is run +with a standard set of command-line arguments:

+ +

+ +
argv[1]
+
The job ID
+ +
argv[2]
+
The user printing the job
+ +
argv[3]
+
The job name/title
+ +
argv[4]
+
The number of copies to print
+ +
argv[5]
+
The options that were provided when the job was submitted
+ +
argv[6]
+
The file to print (first program only)
+
+ +

The scheduler runs one or more of these programs to print any given job. The +first filter reads from the print file and writes to the standard output, while +the remaining filters read from the standard input and write to the standard +output. The backend is the last filter in the chain and writes to the +device.

+ +

Filters are always run as a non-privileged user, typically "lp", with no +connection to the user's desktop. Backends are run either as a non-privileged +user or as root if the file permissions do not allow user or group execution. +The file permissions section talks about this in +more detail.

+ +

Security Considerations

+ +

It is always important to use security programming practices. Filters and +most backends are run as a non-privileged user, so the major security +consideration is resource utilization - filters should not depend on unlimited +amounts of CPU, memory, or disk space, and should protect against conditions +that could lead to excess usage of any resource like infinite loops and +unbounded recursion. In addition, filters must never allow the user to +specify an arbitrary file path to a separator page, template, or other file +used by the filter since that can lead to an unauthorized disclosure of +information. Always treat input as suspect and validate it!

+ +

If you are developing a backend that runs as root, make sure to check for +potential buffer overflows, integer under/overflow conditions, and file +accesses since these can lead to privilege escalations. When writing files, +always validate the file path and never allow a user to determine +where to store a file.

+ +
Note: + +

Never write files to a user's home directory. Aside from the +security implications, CUPS is a network print service and as such the network +user may not be the same as the local user and/or there may not be a local home +directory to write to.

+ +

In addition, some operating systems provide additional security mechanisms +that further limit file system access, even for backends running as root. On +Mac OS X, for example, no backend may write to a user's home directory.

+
+ +

Canceled Jobs and Signal Handling

+ +

The scheduler sends SIGTERM when a printing job is canceled or +held. Filters, backends, and port monitors must catch +SIGTERM and perform any cleanup necessary to produce a valid output +file or return the printer to a known good state. The recommended behavior is to +end the output on the current page, preferably on the current line or object +being printed.

+ +

Filters and backends may also receive SIGPIPE when an upstream or downstream filter/backend exits with a non-zero status. Developers should generally ignore SIGPIPE at the beginning of main() with the following function call:

+ +
+#include <signal.h>>
+
+...
+
+int
+main(int argc, char *argv[])
+{
+  signal(SIGPIPE, SIG_IGN);
+
+  ...
+}
+
+ +

File Permissions

+ +

For security reasons, CUPS will only run filters and backends that are owned +by root and do not have world or group write permissions. The recommended +permissions for filters and backends are 0555 - read and execute but no write. +Backends that must run as root should use permissions of 0500 - read and execute +by root, no access for other users. Write permissions can be enabled for the +root user only.

+ +

To avoid a warning message, the directory containing your filter(s) must also +be owned by root and have world and group write disabled - permissions of 0755 +or 0555 are strongly encouraged.

+ +

Temporary Files

+ +

Temporary files should be created in the directory specified by the +"TMPDIR" environment variable. The +cupsTempFile2 function can be +used to safely create temporary files in this directory.

+ +

Copy Generation

+ +

The argv[4] argument specifies the number of copies to produce +of the input file. In general, you should only generate copies if the +filename argument is supplied. The only exception to this are +filters that produce device-independent PostScript output, since the PostScript +filter pstops is responsible for generating copies of PostScript +files.

+ +

Exit Codes

+ +

Filters must exit with status 0 when they successfully generate print data +or 1 when they encounter an error. Backends can return any of the +cups_backend_t constants.

+ +

Environment Variables

+ +

The following environment variables are defined by the printing system +when running print filters and backends:

+ +
+ +
APPLE_LANGUAGE
+
The Apple language identifier associated with the job + (Mac OS X only).
+ +
CHARSET
+
The job character set, typically "utf-8".
+ +
CLASS
+
When a job is submitted to a printer class, contains the name of + the destination printer class. Otherwise this environment + variable will not be set.
+ +
CONTENT_TYPE
+
The MIME type associated with the file (e.g. + application/postscript).
+ +
CUPS_CACHEDIR
+
The directory where cache files can be stored. Cache files can be + used to retain information between jobs or files in a job.
+ +
CUPS_DATADIR
+
The directory where (read-only) CUPS data files can be found.
+ +
CUPS_FILETYPE
+
The type of file being printed: "job-sheet" for a banner page and + "document" for a regular print file.
+ +
CUPS_SERVERROOT
+
The root directory of the server.
+ +
DEVICE_URI
+
The device-uri associated with the printer.
+ +
FINAL_CONTENT_TYPE
+
The MIME type associated with the printer (e.g. + application/vnd.cups-postscript).
+ +
LANG
+
The language locale associated with the job.
+ +
PPD
+
The full pathname of the PostScript Printer Description (PPD) + file for this printer.
+ +
PRINTER
+
The queue name of the class or printer.
+ +
RIP_CACHE
+
The recommended amount of memory to use for Raster Image + Processors (RIPs).
+ +
TMPDIR
+
The directory where temporary files should be created.
+ +
+ +

Communicating with the Scheduler

+ +

Filters and backends communicate with the scheduler by writing messages +to the standard error file. The scheduler reads messages from all filters in +a job and processes the message based on its prefix. For example, the following +code sets the current printer state message to "Printing page 5":

+ +
+int page = 5;
+
+fprintf(stderr, "INFO: Printing page %d\n", page);
+
+ +

Each message is a single line of text starting with one of the following +prefix strings:

+ +
+ +
ALERT: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "alert" log level.
+ +
ATTR: attribute=value [attribute=value]
+
Sets the named printer or job attribute(s). Typically this is used + to set the marker-colors, marker-high-levels, + marker-levels, marker-low-levels, + marker-message, marker-names, + marker-types, printer-alert, and + printer-alert-description printer attributes. Standard + marker-types values are listed in Table + 1.
+ +
CRIT: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "critical" log + level.
+ +
DEBUG: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "debug" log level.
+ +
DEBUG2: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "debug2" log level.
+ +
EMERG: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "emergency" log + level.
+ +
ERROR: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "error" log level. + Use "ERROR:" messages for non-persistent processing errors.
+ +
INFO: message
+
Sets the printer-state-message attribute. If the current log level + is set to "debug2", also adds the specified message to the current error + log file using the "info" log level.
+ +
NOTICE: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "notice" log level.
+ +
PAGE: page-number #-copies
+
PAGE: total #-pages
+
Adds an entry to the current page log file. The first form adds + #-copies to the job-media-sheets-completed attribute. The second + form sets the job-media-sheets-completed attribute to #-pages.
+ +
PPD: keyword=value [keyword=value ...]
+
Changes or adds keywords to the printer's PPD file. Typically + this is used to update installable options or default media settings + based on the printer configuration.
+ +
STATE: + printer-state-reason [printer-state-reason ...]
+
STATE: - printer-state-reason [printer-state-reason ...]
+
Sets or clears printer-state-reason keywords for the current queue. + Typically this is used to indicate persistent media, ink, toner, and + configuration conditions or errors on a printer. + Table 2 lists the standard state keywords - + use vendor-prefixed ("com.example.foo") keywords for custom states. See + Managing Printer State in a Filter for more + information. + +
WARNING: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "warning" log + level.
+ +
+ +

Messages without one of these prefixes are treated as if they began with +the "DEBUG:" prefix string.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Standard marker-types Values
marker-typeDescription
developerDeveloper unit
fuserFuser unit
fuserCleaningPadFuser cleaning pad
fuserOilFuser oil
inkInk supply
opcPhoto conductor
solidWaxWax supply
staplesStaple supply
tonerToner supply
transferUnitTransfer unit
wasteInkWaste ink tank
wasteTonerWaste toner tank
wasteWaxWaste wax tank
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Standard State Keywords
KeywordDescription
connecting-to-deviceConnecting to printer but not printing yet.
cover-openThe printer's cover is open.
input-tray-missingThe paper tray is missing.
marker-supply-emptyThe printer is out of ink.
marker-supply-lowThe printer is almost out of ink.
marker-waste-almost-fullThe printer's waste bin is almost full.
marker-waste-fullThe printer's waste bin is full.
media-emptyThe paper tray (any paper tray) is empty.
media-jamThere is a paper jam.
media-lowThe paper tray (any paper tray) is almost empty.
media-neededThe paper tray needs to be filled (for a job that is printing).
pausedStop the printer.
timed-outUnable to connect to printer.
toner-emptyThe printer is out of toner.
toner-lowThe printer is low on toner.
+ +

Managing Printer State in a Filter

+ +

Filters are responsible for managing the state keywords they set using +"STATE:" messages. Typically you will update all of the keywords that +are used by the filter at startup, for example:

+ +
+if (foo_condition != 0)
+  fputs("STATE: +com.example.foo\n", stderr);
+else
+  fputs("STATE: -com.example.foo\n", stderr);
+
+if (bar_condition != 0)
+  fputs("STATE: +com.example.bar\n", stderr);
+else
+  fputs("STATE: -com.example.bar\n", stderr);
+
+ +

Then as conditions change, your filter sends "STATE: +keyword" or "STATE: +-keyword" messages as necessary to set or clear the corresponding keyword, +respectively.

+ +

State keywords are often used to notify the user of issues that span across +jobs, for example "media-empty-warning" that indicates one or more paper trays +are empty. These keywords should not be cleared unless the corresponding issue +no longer exists.

+ +

Filters should clear job-related keywords on startup and exit so that they +do not remain set between jobs. For example, "connecting-to-device" is a job +sub-state and not an issue that applies when a job is not printing.

+ +
Note: + +

"STATE:" messages often provide visible alerts to the user. For example, +on Mac OS X setting a printer-state-reason value with an "-error" or +"-warning" suffix will cause the printer's dock item to bounce if the +corresponding reason is localized with a cupsIPPReason keyword in the +printer's PPD file.

+ +

When providing a vendor-prefixed keyword, always provide the +corresponding standard keyword (if any) to allow clients to respond to the +condition correctly. For example, if you provide a vendor-prefixed keyword +for a low cyan ink condition ("com.example.cyan-ink-low") you must also set the +"marker-supply-low-warning" keyword. In such cases you should also refrain +from localizing the vendor-prefixed keyword in the PPD file - otherwise both +the generic and vendor-specific keyword will be shown in the user +interface.

+ +
+ +

Reporting Supply Levels

+ +

CUPS tracks several "marker-*" attributes for ink/toner supply level +reporting. These attributes allow applications to display the current supply +levels for a printer without printer-specific software. Table 3 lists the marker attributes and what they represent.

+ +

Filters set marker attributes by sending "ATTR:" messages to stderr. For +example, a filter supporting an inkjet printer with black and tri-color ink +cartridges would use the following to initialize the supply attributes:

+ +
+fputs("ATTR: marker-colors=#000000,#00FFFF#FF00FF#FFFF00\n", stderr);
+fputs("ATTR: marker-low-levels=5,10\n", stderr);
+fputs("ATTR: marker-names=Black,Tri-Color\n", stderr);
+fputs("ATTR: marker-types=ink,ink\n", stderr);
+
+ +

Then periodically the filter queries the printer for its current supply +levels and updates them with a separate "ATTR:" message:

+ +
+int black_level, tri_level;
+...
+fprintf(stderr, "ATTR: marker-levels=%d,%d\n", black_level, tri_level);
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: Supply Level Attributes
AttributeDescription
marker-colorsA list of comma-separated colors; each color is either "none" or one or + more hex-encoded sRGB colors of the form "#RRGGBB".
marker-high-levelsA list of comma-separated "almost full" level values from 0 to 100; a + value of 100 should be used for supplies that are consumed/emptied like ink + cartridges.
marker-levelsA list of comma-separated level values for each supply. A value of -1 + indicates the level is unavailable, -2 indicates unknown, and -3 indicates + the level is unknown but has not yet reached capacity. Values from 0 to 100 + indicate the corresponding percentage.
marker-low-levelsA list of comma-separated "almost empty" level values from 0 to 100; a + value of 0 should be used for supplies that are filled like waste ink + tanks.
marker-messageA human-readable supply status message for the user like "12 pages of + ink remaining."
marker-namesA list of comma-separated supply names like "Cyan Ink", "Fuser", + etc.
marker-typesA list of comma-separated supply types; the types are listed in + Table 1.
+ +

Communicating with the Backend

+ +

Filters can communicate with the backend via the +cupsBackChannelRead and +cupsSideChannelDoRequest +functions. The +cupsBackChannelRead function +reads data that has been sent back from the device and is typically used to +obtain status and configuration information. For example, the following code +polls the backend for back-channel data:

+ +
+#include <cups/cups.h>
+
+char buffer[8192];
+ssize_t bytes;
+
+/* Use a timeout of 0.0 seconds to poll for back-channel data */
+bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0.0);
+
+ +

Filters can also use select() or poll() on the +back-channel file descriptor (3 or CUPS_BC_FD) to read data only +when it is available.

+ +

The +cupsSideChannelDoRequest +function allows you to get out-of-band status information and do synchronization +with the device. For example, the following code gets the current IEEE-1284 +device ID string from the backend:

+ +
+#include <cups/sidechannel.h>
+
+char data[2049];
+int datalen;
+cups_sc_status_t status;
+
+/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for
+   nul-termination... */
+datalen = sizeof(data) - 1;
+
+/* Get the IEEE-1284 device ID, waiting for up to 1 second */
+status = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_DEVICE_ID, data, &datalen, 1.0);
+
+/* Use the returned value if OK was returned and the length is non-zero */
+if (status == CUPS_SC_STATUS_OK && datalen > 0)
+  data[datalen] = '\0';
+else
+  data[0] = '\0';
+
+ +

Forcing All Output to a Printer

+ +

The +cupsSideChannelDoRequest +function allows you to tell the backend to send all pending data to the printer. +This is most often needed when sending query commands to the printer. For example:

+ +
+#include <cups/cups.h>
+#include <cups/sidechannel.h>
+
+char data[1024];
+int datalen = sizeof(data);
+cups_sc_status_t status;
+
+/* Flush pending output to stdout */
+fflush(stdout);
+
+/* Drain output to backend, waiting for up to 30 seconds */
+status = cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, data, &datalen, 30.0);
+
+/* Read the response if the output was sent */
+if (status == CUPS_SC_STATUS_OK)
+{
+  ssize_t bytes;
+
+  /* Wait up to 10.0 seconds for back-channel data */
+  bytes = cupsBackChannelRead(data, sizeof(data), 10.0);
+  /* do something with the data from the printer */
+}
+
+ +

Communicating with Filters

+ +

Backends communicate with filters using the reciprocal functions +cupsBackChannelWrite, +cupsSideChannelRead, and +cupsSideChannelWrite. We +recommend writing back-channel data using a timeout of 1.0 seconds:

+ +
+#include <cups/cups.h>
+
+char buffer[8192];
+ssize_t bytes;
+
+/* Obtain data from printer/device */
+...
+
+/* Use a timeout of 1.0 seconds to give filters a chance to read */
+cupsBackChannelWrite(buffer, bytes, 1.0);
+
+ +

The cupsSideChannelRead +function reads a side-channel command from a filter, driver, or port monitor. +Backends can either poll for commands using a timeout of 0.0, wait +indefinitely for commands using a timeout of -1.0 (probably in a +separate thread for that purpose), or use select or +poll on the CUPS_SC_FD file descriptor (4) to handle +input and output on several file descriptors at the same time.

+ +

Once a command is processed, the backend uses the +cupsSideChannelWrite function +to send its response. For example, the following code shows how to poll for a +side-channel command and respond to it:

+ +
+#include <cups/sidechannel.h>
+
+cups_sc_command_t command;
+cups_sc_status_t status;
+char data[2048];
+int datalen = sizeof(data);
+
+/* Poll for a command... */
+if (!cupsSideChannelRead(&command, &status, data, &datalen, 0.0))
+{
+  switch (command)
+  {
+    /* handle supported commands, fill data/datalen/status with values as needed */
+
+    default :
+        status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
+	datalen = 0;
+	break;
+  }
+
+  /* Send a response... */
+  cupsSideChannelWrite(command, status, data, datalen, 1.0);
+}
+
+ +

Doing SNMP Queries with Network Printers

+ +

The Simple Network Management Protocol (SNMP) allows you to get the current +status, page counter, and supply levels from most network printers. Every +piece of information is associated with an Object Identifier (OID), and +every printer has a community name associated with it. OIDs can be +queried directly or by "walking" over a range of OIDs with a common prefix.

+ +

The two CUPS SNMP functions provide a simple API for querying network +printers through the side-channel interface. Each accepts a string containing +an OID like ".1.3.6.1.2.1.43.10.2.1.4.1.1" (the standard page counter OID) +along with a timeout for the query.

+ +

The cupsSideChannelSNMPGet +function queries a single OID and returns the value as a string in a buffer +you supply:

+ +
+#include <cups/sidechannel.h>
+
+char data[512];
+int datalen = sizeof(data);
+
+if (cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", data, &datalen, 5.0)
+        == CUPS_SC_STATUS_OK)
+{
+  /* Do something with the value */
+  printf("Page counter is: %s\n", data);
+}
+
+ +

The +cupsSideChannelSNMPWalk +function allows you to query a whole group of OIDs, calling a function of your +choice for each OID that is found:

+ +
+#include <cups/sidechannel.h>
+
+void
+my_callback(const char *oid, const char *data, int datalen, void *context)
+{
+  /* Do something with the value */
+  printf("%s=%s\n", oid, data);
+}
+
+...
+
+void *my_data;
+
+cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
+
diff --git a/cups/api-httpipp.header b/cups/api-httpipp.header new file mode 100644 index 0000000..42dffb1 --- /dev/null +++ b/cups/api-httpipp.header @@ -0,0 +1,37 @@ + + +

HTTP and IPP APIs

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cups.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ References: CUPS Implementation of IPP
diff --git a/cups/api-httpipp.shtml b/cups/api-httpipp.shtml new file mode 100644 index 0000000..484c00d --- /dev/null +++ b/cups/api-httpipp.shtml @@ -0,0 +1,323 @@ + + +

Overview

+ +

The CUPS HTTP and IPP APIs provide low-level access to the HTTP and IPP +protocols and CUPS scheduler. They are typically used by monitoring and +administration programs to perform specific functions not supported by the +high-level CUPS API functions.

+ +

The HTTP APIs use an opaque structure called +http_t to manage connections to +a particular HTTP or IPP server. The +httpConnectEncrypt function is +used to create an instance of this structure for a particular server. +The constant CUPS_HTTP_DEFAULT can be used with all of the +cups functions to refer to the default CUPS server - the functions +create a per-thread http_t as needed.

+ +

The IPP APIs use two structures for requests (messages sent to the CUPS +scheduler) and responses (messages sent back to your application from the +scheduler). The ipp_t structure holds a +complete request or response and is allocated using the +ippNew or +ippNewRequest functions and +freed using the ippDelete function.

+ +

The second structure is called +ipp_attribute_t and holds a +single IPP attribute which consists of a group tag (group_tag), a +value type tag (value_tag), the attribute name (name), +and 1 or more values (values[]). Attributes are added to an +ipp_t structure using one of the +ippAdd functions. For example, use +ippAddString to add a +"requesting-user-name" string attribute to a request:

+ +
+ipp_t *request = ippNewRequest(IPP_GET_JOBS);
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+             NULL, cupsUser());
+
+ +

Once you have created an IPP request, use the cups +functions to send the request to and read the response from the server. +For example, the cupsDoRequest +function can be used for simple query operations that do not involve files:

+ +
+#include <cups/cups.h>
+
+
+ipp_t *get_jobs(void)
+{
+  ipp_t *request = ippNewRequest(IPP_GET_JOBS);
+
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+               NULL, cupsUser());
+
+  return (cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"));
+}
+
+ +

The cupsDoRequest function frees +the request structure and returns an IPP response structure or NULL pointer if +the request could not be sent to the server. Once you have a response from +the server, you can either use the +ippFindAttribute and +ippFindNextAttribute functions +to find specific attributes, for example:

+ +
+ipp_t *response;
+ipp_attribute_t *attr;
+
+attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM);
+
+ +

You can also walk the list of attributes with a simple for loop +like this:

+ +
+ipp_t *response;
+ipp_attribute_t *attr;
+
+for (attr = response->attrs; attr != NULL; attr = attr->next)
+  if (attr->name == NULL)
+    puts("--SEPARATOR--");
+  else
+    puts(attr->name);
+
+ +

The for loop approach is normally used when collecting +attributes for multiple objects (jobs, printers, etc.) in a response. Attributes +with NULL names indicate a separator between the attributes of +each object. For example, the following code will list the jobs returned from +our previous get_jobs example code:

+ +
+ipp_t *response = get_jobs();
+
+if (response != NULL)
+{
+  ipp_attribute_t *attr;
+  int job_id = 0;
+  char *job_name = NULL;
+  char *job_originating_user_name = NULL;
+
+  puts("Job ID  Owner             Title");
+  puts("------  ----------------  ---------------------------------");
+
+  for (attr = response->attrs; attr != NULL; attr = attr->next)
+  {
+   /* Attributes without names are separators between jobs */
+    if (attr->name == NULL)
+    {
+      if (job_id > 0 && job_name != NULL && job_originating_user_name != NULL)
+        printf("%5d  %-16s  %s\n", job_id, job_originating_user_name, job_name);
+
+      job_id = 0;
+      job_name = NULL;
+      job_originating_user_name = NULL;
+      continue;
+    }
+    else if (!strcmp(attr->name, "job-id") && attr->value_tag == IPP_TAG_INTEGER)
+      job_id = attr->values[0].integer;
+    else if (!strcmp(attr->name, "job-name") && attr->value_tag == IPP_TAG_NAME)
+      job_name = attr->values[0].string.text;
+    else if (!strcmp(attr->name, "job-originating-user-name") &&
+             attr->value_tag == IPP_TAG_NAME)
+      job_originating_user_name = attr->values[0].string.text;
+  }
+
+  if (job_id > 0 && job_name != NULL && job_originating_user_name != NULL)
+    printf("%5d  %-16s  %s\n", job_id, job_originating_user_name, job_name);
+}
+
+ +

Creating URI Strings

+ +

To ensure proper encoding, the +httpAssembleURIf function must be +used to format a "printer-uri" string for all printer-based requests:

+ +
+const char *name = "Foo";
+char uri[1024];
+ipp_t *request;
+
+httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
+                 ippPort(), "/printers/%s", name);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+
+ +

Sending Requests with Files

+ +

The cupsDoFileRequest and +cupsDoIORequest functions are +used for requests involving files. The +cupsDoFileRequest function +attaches the named file to a request and is typically used when sending a print +file or changing a printer's PPD file:

+ +
+const char *filename = "/usr/share/cups/data/testprint.ps";
+const char *name = "Foo";
+char uri[1024];
+char resource[1024];
+ipp_t *request = ippNewRequest(IPP_PRINT_JOB);
+ipp_t *response;
+
+/* Use httpAssembleURIf for the printer-uri string */
+httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
+                 ippPort(), "/printers/%s", name);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+             NULL, cupsUser());
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
+             NULL, "testprint.ps");
+
+/* Use snprintf for the resource path */
+snprintf(resource, sizeof(resource), "/printers/%s", name);
+
+response = cupsDoFileRequest(CUPS_HTTP_DEFAULT, request, resource, filename);
+
+ +

The cupsDoIORequest function +optionally attaches a file to the request and optionally saves a file in the +response from the server. It is used when using a pipe for the request +attachment or when using a request that returns a file, currently only +CUPS_GET_DOCUMENT and CUPS_GET_PPD. For example, +the following code will download the PPD file for the sample HP LaserJet +printer driver:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+response = cupsDoIORequest(CUPS_HTTP_DEFAULT, request, "/", -1, tempfd);
+
+ +

The example passes -1 for the input file descriptor to specify +that no file is to be attached to the request. The PPD file attached to the +response is written to the temporary file descriptor we created using the +cupsTempFd function.

+ +

Asynchronous Request Processing

+ +

The cupsSendRequest and +cupsGetResponse support +asynchronous communications with the server. Unlike the other request +functions, the IPP request is not automatically freed, so remember to +free your request with the ippDelete +function.

+ +

File data is attached to the request using the +cupsWriteRequestData +function, while file data returned from the server is read using the +cupsReadResponseData +function. We can rewrite the previous CUPS_GET_PPD example +to use the asynchronous functions quite easily:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+if (cupsSendRequest(CUPS_HTTP_DEFAULT, request, "/") == HTTP_CONTINUE)
+{
+  response = cupsGetResponse(CUPS_HTTP_DEFAULT, "/");
+
+  if (response != NULL)
+  {
+    ssize_t bytes;
+    char buffer[8192];
+
+    while ((bytes = cupsReadResponseData(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
+      write(tempfd, buffer, bytes);
+  }
+}
+
+/* Free the request! */
+ippDelete(request);
+
+ +

The cupsSendRequest function +returns the initial HTTP request status, typically either +HTTP_CONTINUE or HTTP_UNAUTHORIZED. The latter status +is returned when the request requires authentication of some sort. The +cupsDoAuthentication function +must be called when your see HTTP_UNAUTHORIZED and the request +re-sent. We can add authentication support to our example code by using a +do ... while loop:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+http_status_t status;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+/* Loop for authentication */
+do
+{
+  status = cupsSendRequest(CUPS_HTTP_DEFAULT, request, "/");
+
+  if (status == HTTP_UNAUTHORIZED)
+  {
+    /* Try to authenticate, break out of the loop if that fails */
+    if (cupsDoAuthentication(CUPS_HTTP_DEFAULT, "POST", "/"))
+      break;
+  }
+}
+while (status != HTTP_CONTINUE && status != HTTP_UNAUTHORIZED);
+
+if (status == HTTP_CONTINUE)
+{
+  response = cupsGetResponse(CUPS_HTTP_DEFAULT, "/");
+
+  if (response != NULL)
+  {
+    ssize_t bytes;
+    char buffer[8192];
+
+    while ((bytes = cupsReadResponseData(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
+      write(tempfd, buffer, bytes);
+  }
+}
+
+/* Free the request! */
+ippDelete(request);
+
diff --git a/cups/api-overview.header b/cups/api-overview.header new file mode 100644 index 0000000..ecb14b6 --- /dev/null +++ b/cups/api-overview.header @@ -0,0 +1,53 @@ + + +

Introduction to CUPS Programming

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/cups.h
+ cups/array.h
+ cups/backend.h
+ cups/dir.h
+ cups/file.h
+ cups/ppd.h
+ cups/raster.h
+ cups/sidechannel.h
Libraries-lcups
+ -lcupsimage
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Array API
+ Programming: CUPS API
+ Programming: File and Directory APIs
+ Programming: HTTP and IPP APIs
+ Programming: PPD API
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
diff --git a/cups/api-overview.shtml b/cups/api-overview.shtml new file mode 100644 index 0000000..3ece103 --- /dev/null +++ b/cups/api-overview.shtml @@ -0,0 +1,94 @@ + + +

Overview

+ +

CUPS provides two libraries that interface with the different parts of the +printing system. The "cups" library provides all of the common application and +filter functions while the "cupsimage" library provides all of the imaging +functions used in raster printer drivers. The "cups" library functions are +accessed by including the <cups/cups.h> header, while +"cupsimage" functions are found in the <cups/raster.h> +header.

+ +

Compiling Programs

+ +

The CUPS libraries can be used from any C, C++, or Objective C program. +The method of compiling against the libraries varies depending on the +operating system and installation of CUPS. The following sections show how +to compile a simple program (shown below) in two common environments.

+ +

The following simple program lists the available printers on the system:

+ +
+#include <stdio.h>
+#include <cups/cups.h>
+
+int main(void)
+{
+  int i;
+  cups_dest_t *dests, *dest;
+  int num_dests = cupsGetDests(&dests);
+
+  for (i = num_dests, dest = dests; i > 0; i --, dest ++)
+  {
+    if (dest->instance)
+      printf("%s/%s\n", dest->name, dest->instance);
+    else
+      puts(dest->name);
+  }
+
+  return (0);
+}
+
+ +

Compiling with Xcode

+ +

In Xcode, choose New Project... from the File menu, +then select the Standard Tool project type under Command Line +Utility. Click Next and choose a project directory. Click +Next to create the project.

+ +

In the project window, double-click on the Targets group and +control-click on the simple target to show the context menu. Choose +Existing Framework... from the Add submenu. When the file +chooser sheet appears, press the / key and enter "/usr/lib". Scroll +down the file list and select the libcups.dylib file. Click the +Add button in the file chooser and attributes sheets.

+ +

In the project window, double-click on the main.c source file. +Replace the template source code with the listing above and save it. Click the +Build and Go button to build the sample program and run it.

+ +

Compiling with GCC

+ +

From the command-line, create a file called sample.c using your +favorite editor and then run the following command to compile it with GCC and +run it:

+ +
+gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
+./simple
+
+ +

The cups-config command provides the compiler flags +("cups-config --cflags") and libraries ("cups-config --libs") needed for the +local system.

+ +

Where to Go Next

+ +

If you are developing a print filter, driver, or backend, see the +Filter and Backend Programming +guide. Raster printer driver developers should also read the +Raster API reference.

diff --git a/cups/api-ppd.header b/cups/api-ppd.header new file mode 100644 index 0000000..2dfcb56 --- /dev/null +++ b/cups/api-ppd.header @@ -0,0 +1,36 @@ + + +

PPD API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/ppd.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Specifications: CUPS PPD Extensions
diff --git a/cups/api-ppd.shtml b/cups/api-ppd.shtml new file mode 100644 index 0000000..e9beb9b --- /dev/null +++ b/cups/api-ppd.shtml @@ -0,0 +1,217 @@ + + +

Overview

+ +

The CUPS PPD API provides read-only access the data in PostScript Printer +Description ("PPD") files which are used for all printers with a driver. With +it you can obtain the data necessary to display printer options to users, mark +option choices and check for conflicting choices, and output marked choices in +PostScript output. The ppd_file_t +structure contains all of the information in a PPD file.

+ +
Note: + +

The CUPS PPD API uses the terms "option" and "choice" instead of the Adobe +terms "MainKeyword" and "OptionKeyword" to refer to specific printer options and +features. CUPS also treats option ("MainKeyword") and choice ("OptionKeyword") +values as case-insensitive strings, so option "InputSlot" and choice "Upper" +are equivalent to "inputslot" and "upper", respectively.

+
+ +

Loading a PPD File

+ +

The ppdOpenFile function "opens" a +PPD file and loads it into memory. For example, the following code opens the +current printer's PPD file in a CUPS filter:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+
+ +

The return value is a pointer to a new +ppd_file_t structure or NULL +if the PPD file does not exist or cannot be loaded. The +ppdClose function frees the memory used +by the structure:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdClose(ppd);
+
+ +

Once closed, pointers to the ppd_file_t +structure and any data in it will no longer be valid.

+ +

Options and Groups

+ +

PPD files support multiple options, which are stored in arrays of +ppd_option_t and +ppd_choice_t structures.

+ +

Each option in turn is associated with a group stored in a +ppd_group_t structure. Groups can be +specified in the PPD file; if an option is not associated with a group +then it is put in an automatically-generated "General" group. Groups can also +have sub-groups, however CUPS currently ignores sub-groups because of past +abuses of this functionality.

+ +

Option choices are selected by marking them using one of three functions. The +first is ppdMarkDefaults which +selects all of the default options in the PPD file:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdMarkDefaults(ppd);
+
+ +

The second is ppdMarkOption +which selects a single option choice in the PPD file. For example, the following +code selects the upper paper tray:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdMarkOption(ppd, "InputSlot", "Upper");
+
+ +

The last function is +cupsMarkOptions which selects +multiple option choices in the PPD file from an array of CUPS options, mapping +IPP attributes like "media" and "sides" to their corresponding PPD options. You +typically use this function in a print filter with +cupsParseOptions and +ppdMarkDefaults to select all of +the option choices needed for the job, for example:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+cups_option_t *options = NULL;
+int num_options = cupsParseOptions(argv[5], 0, &options);
+
+ppdMarkDefaults(ppd);
+cupsMarkOptions(ppd, num_options, options);
+cupsFreeOptions(num_options, options);
+
+ +

Constraints

+ +

PPD files support specification of conflict conditions, called +constraints, between different options. Constraints are stored in an array of +ppd_const_t structures which specify +the options and choices that conflict with each other. The +ppdConflicts function tells you +how many of the selected options are incompatible. Since constraints are +normally specified in pairs, the returned value is typically an even number.

+ +

Page Sizes

+ +

Page sizes are special options which have physical dimensions and margins +associated with them. The size information is stored in +ppd_size_t structures and is available +by looking up the named size with the +ppdPageSize function. The page size and +margins are returned in units called points; there are 72 points per inch. If +you pass NULL for the size, the currently selected size is +returned:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+ppd_size_t *size = ppdPageSize(ppd, NULL);
+
+ +

Besides the standard page sizes listed in a PPD file, some printers +support variable or custom page sizes. Custom page sizes are supported if the +variables_sizes member of the +ppd_file_t structure is non-zero. +The custom_min, custom_max, and +custom_margins members of the +ppd_file_t structure define the limits +of the printable area. To get the resulting media size, use a page size string +of the form "Custom.widthxlength", where "width" and "length" are +in points. Custom page size names can also be specified in inches +("Custom.widthxheightin"), centimeters +("Custom.widthxheightcm"), or millimeters +("Custom.widthxheightmm"):

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+/* Get an 576x720 point custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.576x720");
+
+/* Get an 8x10 inch custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.8x10in");
+
+/* Get a 100x200 millimeter custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.100x200mm");
+
+/* Get a 12.7x34.5 centimeter custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.12.7x34.5cm");
+
+ +

If the PPD does not support variable page sizes, the +ppdPageSize function will return +NULL.

+ +

Attributes

+ +

Every PPD file is composed of one or more attributes. Most of these +attributes are used to define groups, options, choices, and page sizes, +however several informational attributes may be present which you can access +in your program or filter. Attributes normally look like one of the following +examples in a PPD file:

+ +
+*name: "value"
+*name spec: "value"
+*name spec/text: "value"
+
+ +

The ppdFindAttr and +ppdFindNextAttr functions find the +first and next instances, respectively, of the named attribute with the given +"spec" string and return a ppd_attr_t +structure. If you provide a NULL specifier string, all attributes with the +given name will be returned. For example, the following code lists all of the +Product attributes in a PPD file:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+ppd_attr_t *attr;
+
+for (attr = ppdFindAttr(ppd, "Product", NULL);
+     attr != NULL;
+     attr = ppdFindNextAttr(ppd, "Product", NULL))
+  puts(attr->value);
+
diff --git a/cups/array-private.h b/cups/array-private.h new file mode 100644 index 0000000..b1348e7 --- /dev/null +++ b/cups/array-private.h @@ -0,0 +1,51 @@ +/* + * "$Id: array-private.h 10035 2011-09-30 22:52:42Z mike $" + * + * Private array definitions for CUPS. + * + * Copyright 2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_ARRAY_PRIVATE_H_ +# define _CUPS_ARRAY_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Functions... + */ + +extern int _cupsArrayAddStrings(cups_array_t *a, const char *s) + _CUPS_API_1_5; +extern cups_array_t *_cupsArrayNewStrings(const char *s) _CUPS_API_1_5; + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_ARRAY_PRIVATE_H_ */ + +/* + * End of "$Id: array-private.h 10035 2011-09-30 22:52:42Z mike $". + */ diff --git a/cups/array.c b/cups/array.c new file mode 100644 index 0000000..3ae71e3 --- /dev/null +++ b/cups/array.c @@ -0,0 +1,1326 @@ +/* + * "$Id: array.c 9772 2011-05-12 05:46:30Z mike $" + * + * Sorted array routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsArrayAdd() - Add an element to the array. + * _cupsArrayAddStrings() - Add zero or more comma-delimited strings to an + * array. + * cupsArrayClear() - Clear the array. + * cupsArrayCount() - Get the number of elements in the array. + * cupsArrayCurrent() - Return the current element in the array. + * cupsArrayDelete() - Free all memory used by the array. + * cupsArrayDup() - Duplicate the array. + * cupsArrayFind() - Find an element in the array. + * cupsArrayFirst() - Get the first element in the array. + * cupsArrayGetIndex() - Get the index of the current element. + * cupsArrayGetInsert() - Get the index of the last inserted element. + * cupsArrayIndex() - Get the N-th element in the array. + * cupsArrayInsert() - Insert an element in the array. + * cupsArrayLast() - Get the last element in the array. + * cupsArrayNew() - Create a new array. + * cupsArrayNew2() - Create a new array with hash. + * cupsArrayNew3() - Create a new array with hash and/or free function. + * _cupsArrayNewStrings() - Create a new array of comma-delimited strings. + * cupsArrayNext() - Get the next element in the array. + * cupsArrayPrev() - Get the previous element in the array. + * cupsArrayRemove() - Remove an element from the array. + * cupsArrayRestore() - Reset the current element to the last @link + * cupsArraySave@. + * cupsArraySave() - Mark the current element for a later @link + * cupsArrayRestore@. + * cupsArrayUserData() - Return the user data for an array. + * cups_array_add() - Insert or append an element to the array. + * cups_array_find() - Find an element in the array. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "debug-private.h" +#include "array-private.h" + + +/* + * Limits... + */ + +#define _CUPS_MAXSAVE 32 /**** Maximum number of saves ****/ + + +/* + * Types and structures... + */ + +struct _cups_array_s /**** CUPS array structure ****/ +{ + /* + * The current implementation uses an insertion sort into an array of + * sorted pointers. We leave the array type private/opaque so that we + * can change the underlying implementation without affecting the users + * of this API. + */ + + int num_elements, /* Number of array elements */ + alloc_elements, /* Allocated array elements */ + current, /* Current element */ + insert, /* Last inserted element */ + unique, /* Are all elements unique? */ + num_saved, /* Number of saved elements */ + saved[_CUPS_MAXSAVE]; + /* Saved elements */ + void **elements; /* Array elements */ + cups_array_func_t compare; /* Element comparison function */ + void *data; /* User data passed to compare */ + cups_ahash_func_t hashfunc; /* Hash function */ + int hashsize, /* Size of hash */ + *hash; /* Hash array */ + cups_acopy_func_t copyfunc; /* Copy function */ + cups_afree_func_t freefunc; /* Free function */ +}; + + +/* + * Local functions... + */ + +static int cups_array_add(cups_array_t *a, void *e, int insert); +static int cups_array_find(cups_array_t *a, void *e, int prev, int *rdiff); + + +/* + * 'cupsArrayAdd()' - Add an element to the array. + * + * When adding an element to a sorted array, non-unique elements are + * appended at the end of the run of identical elements. For unsorted arrays, + * the element is appended to the end of the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsArrayAdd(cups_array_t *a, /* I - Array */ + void *e) /* I - Element */ +{ + DEBUG_printf(("2cupsArrayAdd(a=%p, e=%p)", a, e)); + + /* + * Range check input... + */ + + if (!a || !e) + { + DEBUG_puts("3cupsArrayAdd: returning 0"); + return (0); + } + + /* + * Append the element... + */ + + return (cups_array_add(a, e, 0)); +} + + +/* + * '_cupsArrayAddStrings()' - Add zero or more comma-delimited strings to an + * array. + * + * Note: The array MUST be created using the @link _cupsArrayNewStrings@ + * function. Duplicate strings are NOT added. If the string pointer "s" is NULL + * or the empty string, no strings are added to the array. + */ + +int /* O - 1 on success, 0 on failure */ +_cupsArrayAddStrings(cups_array_t *a, /* I - Array */ + const char *s) /* I - Comma-delimited strings or NULL */ +{ + char *buffer, /* Copy of string */ + *start, /* Start of string */ + *end; /* End of string */ + int status = 1; /* Status of add */ + + + if (!a || !s || !*s) + return (0); + + if (!strchr(s, ',')) + { + /* + * String doesn't contain a comma, so add it as a single value... + */ + + if (!cupsArrayFind(a, (void *)s)) + status = cupsArrayAdd(a, (void *)s); + } + else if ((buffer = strdup(s)) == NULL) + status = 0; + else + { + for (start = end = buffer; *end; start = end) + { + /* + * Find the end of the current delimited string and see if we need to add + * it... + */ + + if ((end = strchr(start, ',')) != NULL) + *end++ = '\0'; + else + end = start + strlen(start); + + if (!cupsArrayFind(a, start)) + status &= cupsArrayAdd(a, start); + } + + free(buffer); + } + + return (status); +} + + +/* + * 'cupsArrayClear()' - Clear the array. + * + * This function is equivalent to removing all elements in the array. + * The caller is responsible for freeing the memory used by the + * elements themselves. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsArrayClear(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return; + + /* + * Free the existing elements as needed.. + */ + + if (a->freefunc) + { + int i; /* Looping var */ + void **e; /* Current element */ + + for (i = a->num_elements, e = a->elements; i > 0; i --, e ++) + (a->freefunc)(*e, a->data); + } + + /* + * Set the number of elements to 0; we don't actually free the memory + * here - that is done in cupsArrayDelete()... + */ + + a->num_elements = 0; + a->current = -1; + a->insert = -1; + a->unique = 1; + a->num_saved = 0; +} + + +/* + * 'cupsArrayCount()' - Get the number of elements in the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Number of elements */ +cupsArrayCount(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (0); + + /* + * Return the number of elements... + */ + + return (a->num_elements); +} + + +/* + * 'cupsArrayCurrent()' - Return the current element in the array. + * + * The current element is undefined until you call @link cupsArrayFind@, + * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - Element */ +cupsArrayCurrent(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Return the current element... + */ + + if (a->current >= 0 && a->current < a->num_elements) + return (a->elements[a->current]); + else + return (NULL); +} + + +/* + * 'cupsArrayDelete()' - Free all memory used by the array. + * + * The caller is responsible for freeing the memory used by the + * elements themselves. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsArrayDelete(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return; + + /* + * Free the elements if we have a free function (otherwise the caller is + * responsible for doing the dirty work...) + */ + + if (a->freefunc) + { + int i; /* Looping var */ + void **e; /* Current element */ + + for (i = a->num_elements, e = a->elements; i > 0; i --, e ++) + (a->freefunc)(*e, a->data); + } + + /* + * Free the array of element pointers... + */ + + if (a->alloc_elements) + free(a->elements); + + if (a->hashsize) + free(a->hash); + + free(a); +} + + +/* + * 'cupsArrayDup()' - Duplicate the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_array_t * /* O - Duplicate array */ +cupsArrayDup(cups_array_t *a) /* I - Array */ +{ + cups_array_t *da; /* Duplicate array */ + + + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Allocate memory for the array... + */ + + da = calloc(1, sizeof(cups_array_t)); + if (!da) + return (NULL); + + da->compare = a->compare; + da->data = a->data; + da->current = a->current; + da->insert = a->insert; + da->unique = a->unique; + da->num_saved = a->num_saved; + + memcpy(da->saved, a->saved, sizeof(a->saved)); + + if (a->num_elements) + { + /* + * Allocate memory for the elements... + */ + + da->elements = malloc(a->num_elements * sizeof(void *)); + if (!da->elements) + { + free(da); + return (NULL); + } + + /* + * Copy the element pointers... + */ + + if (a->copyfunc) + { + /* + * Use the copy function to make a copy of each element... + */ + + int i; /* Looping var */ + + for (i = 0; i < a->num_elements; i ++) + da->elements[i] = (a->copyfunc)(a->elements[i], a->data); + } + else + { + /* + * Just copy raw pointers... + */ + + memcpy(da->elements, a->elements, a->num_elements * sizeof(void *)); + } + + da->num_elements = a->num_elements; + da->alloc_elements = a->num_elements; + } + + /* + * Return the new array... + */ + + return (da); +} + + +/* + * 'cupsArrayFind()' - Find an element in the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - Element found or @code NULL@ */ +cupsArrayFind(cups_array_t *a, /* I - Array */ + void *e) /* I - Element */ +{ + int current, /* Current element */ + diff, /* Difference */ + hash; /* Hash index */ + + + /* + * Range check input... + */ + + if (!a || !e) + return (NULL); + + /* + * See if we have any elements... + */ + + if (!a->num_elements) + return (NULL); + + /* + * Yes, look for a match... + */ + + if (a->hash) + { + hash = (*(a->hashfunc))(e, a->data); + + if (hash < 0 || hash >= a->hashsize) + { + current = a->current; + hash = -1; + } + else + { + current = a->hash[hash]; + + if (current < 0 || current >= a->num_elements) + current = a->current; + } + } + else + { + current = a->current; + hash = -1; + } + + current = cups_array_find(a, e, current, &diff); + if (!diff) + { + /* + * Found a match! If the array does not contain unique values, find + * the first element that is the same... + */ + + if (!a->unique && a->compare) + { + /* + * The array is not unique, find the first match... + */ + + while (current > 0 && !(*(a->compare))(e, a->elements[current - 1], + a->data)) + current --; + } + + a->current = current; + + if (hash >= 0) + a->hash[hash] = current; + + return (a->elements[current]); + } + else + { + /* + * No match... + */ + + a->current = -1; + + return (NULL); + } +} + + +/* + * 'cupsArrayFirst()' - Get the first element in the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - First element or @code NULL@ if the array is empty */ +cupsArrayFirst(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Return the first element... + */ + + a->current = 0; + + return (cupsArrayCurrent(a)); +} + + +/* + * 'cupsArrayGetIndex()' - Get the index of the current element. + * + * The current element is undefined until you call @link cupsArrayFind@, + * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - Index of the current element, starting at 0 */ +cupsArrayGetIndex(cups_array_t *a) /* I - Array */ +{ + if (!a) + return (-1); + else + return (a->current); +} + + +/* + * 'cupsArrayGetInsert()' - Get the index of the last inserted element. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - Index of the last inserted element, starting at 0 */ +cupsArrayGetInsert(cups_array_t *a) /* I - Array */ +{ + if (!a) + return (-1); + else + return (a->insert); +} + + +/* + * 'cupsArrayIndex()' - Get the N-th element in the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - N-th element or @code NULL@ */ +cupsArrayIndex(cups_array_t *a, /* I - Array */ + int n) /* I - Index into array, starting at 0 */ +{ + if (!a) + return (NULL); + + a->current = n; + + return (cupsArrayCurrent(a)); +} + + +/* + * 'cupsArrayInsert()' - Insert an element in the array. + * + * When inserting an element in a sorted array, non-unique elements are + * inserted at the beginning of the run of identical elements. For unsorted + * arrays, the element is inserted at the beginning of the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on failure, 1 on success */ +cupsArrayInsert(cups_array_t *a, /* I - Array */ + void *e) /* I - Element */ +{ + DEBUG_printf(("2cupsArrayInsert(a=%p, e=%p)", a, e)); + + /* + * Range check input... + */ + + if (!a || !e) + { + DEBUG_puts("3cupsArrayInsert: returning 0"); + return (0); + } + + /* + * Insert the element... + */ + + return (cups_array_add(a, e, 1)); +} + + +/* + * 'cupsArrayLast()' - Get the last element in the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - Last element or @code NULL@ if the array is empty */ +cupsArrayLast(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Return the last element... + */ + + a->current = a->num_elements - 1; + + return (cupsArrayCurrent(a)); +} + + +/* + * 'cupsArrayNew()' - Create a new array. + * + * The comparison function ("f") is used to create a sorted array. The function + * receives pointers to two elements and the user data pointer ("d") - the user + * data pointer argument can safely be omitted when not required so functions + * like @code strcmp@ can be used for sorted string arrays. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_array_t * /* O - Array */ +cupsArrayNew(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ + void *d) /* I - User data pointer or @code NULL@ */ +{ + return (cupsArrayNew3(f, d, 0, 0, 0, 0)); +} + + +/* + * 'cupsArrayNew2()' - Create a new array with hash. + * + * The comparison function ("f") is used to create a sorted array. The function + * receives pointers to two elements and the user data pointer ("d") - the user + * data pointer argument can safely be omitted when not required so functions + * like @code strcmp@ can be used for sorted string arrays. + * + * The hash function ("h") is used to implement cached lookups with the + * specified hash size ("hsize"). + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +cups_array_t * /* O - Array */ +cupsArrayNew2(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ + void *d, /* I - User data or @code NULL@ */ + cups_ahash_func_t h, /* I - Hash function or @code NULL@ for unhashed lookups */ + int hsize) /* I - Hash size (>= 0) */ +{ + return (cupsArrayNew3(f, d, h, hsize, 0, 0)); +} + + +/* + * 'cupsArrayNew3()' - Create a new array with hash and/or free function. + * + * The comparison function ("f") is used to create a sorted array. The function + * receives pointers to two elements and the user data pointer ("d") - the user + * data pointer argument can safely be omitted when not required so functions + * like @code strcmp@ can be used for sorted string arrays. + * + * The hash function ("h") is used to implement cached lookups with the + * specified hash size ("hsize"). + * + * The copy function ("cf") is used to automatically copy/retain elements when + * added or the array is copied. + * + * The free function ("cf") is used to automatically free/release elements when + * removed or the array is deleted. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +cups_array_t * /* O - Array */ +cupsArrayNew3(cups_array_func_t f, /* I - Comparison function or @code NULL@ for an unsorted array */ + void *d, /* I - User data or @code NULL@ */ + cups_ahash_func_t h, /* I - Hash function or @code NULL@ for unhashed lookups */ + int hsize, /* I - Hash size (>= 0) */ + cups_acopy_func_t cf, /* I - Copy function */ + cups_afree_func_t ff) /* I - Free function */ +{ + cups_array_t *a; /* Array */ + + + /* + * Allocate memory for the array... + */ + + a = calloc(1, sizeof(cups_array_t)); + if (!a) + return (NULL); + + a->compare = f; + a->data = d; + a->current = -1; + a->insert = -1; + a->num_saved = 0; + a->unique = 1; + + if (hsize > 0 && h) + { + a->hashfunc = h; + a->hashsize = hsize; + a->hash = malloc(hsize * sizeof(int)); + + if (!a->hash) + { + free(a); + return (NULL); + } + + memset(a->hash, -1, hsize * sizeof(int)); + } + + a->copyfunc = cf; + a->freefunc = ff; + + return (a); +} + + +/* + * '_cupsArrayNewStrings()' - Create a new array of comma-delimited strings. + * + * Note: The array automatically manages copies of the strings passed. If the + * string pointer "s" is NULL or the empty string, no strings are added to the + * newly created array. + */ + +cups_array_t * /* O - Array */ +_cupsArrayNewStrings(const char *s) /* I - Comma-delimited strings or NULL */ +{ + cups_array_t *a; /* Array */ + + + if ((a = cupsArrayNew3((cups_array_func_t)strcmp, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree)) != NULL) + _cupsArrayAddStrings(a, s); + + return (a); +} + + +/* + * 'cupsArrayNext()' - Get the next element in the array. + * + * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)". + * + * The next element is undefined until you call @link cupsArrayFind@, + * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ + * to set the current element. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - Next element or @code NULL@ */ +cupsArrayNext(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Return the next element... + */ + + if (a->current < a->num_elements) + a->current ++; + + return (cupsArrayCurrent(a)); +} + + +/* + * 'cupsArrayPrev()' - Get the previous element in the array. + * + * This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)". + * + * The previous element is undefined until you call @link cupsArrayFind@, + * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ + * to set the current element. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - Previous element or @code NULL@ */ +cupsArrayPrev(cups_array_t *a) /* I - Array */ +{ + /* + * Range check input... + */ + + if (!a) + return (NULL); + + /* + * Return the previous element... + */ + + if (a->current >= 0) + a->current --; + + return (cupsArrayCurrent(a)); +} + + +/* + * 'cupsArrayRemove()' - Remove an element from the array. + * + * If more than one element matches "e", only the first matching element is + * removed. + * + * The caller is responsible for freeing the memory used by the + * removed element. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsArrayRemove(cups_array_t *a, /* I - Array */ + void *e) /* I - Element */ +{ + int i, /* Looping var */ + current, /* Current element */ + diff; /* Difference */ + + + /* + * Range check input... + */ + + if (!a || !e) + return (0); + + /* + * See if the element is in the array... + */ + + if (!a->num_elements) + return (0); + + current = cups_array_find(a, e, a->current, &diff); + if (diff) + return (0); + + /* + * Yes, now remove it... + */ + + a->num_elements --; + + if (a->freefunc) + (a->freefunc)(a->elements[current], a->data); + + if (current < a->num_elements) + memmove(a->elements + current, a->elements + current + 1, + (a->num_elements - current) * sizeof(void *)); + + if (current <= a->current) + a->current --; + + if (current < a->insert) + a->insert --; + else if (current == a->insert) + a->insert = -1; + + for (i = 0; i < a->num_saved; i ++) + if (current <= a->saved[i]) + a->saved[i] --; + + if (a->num_elements <= 1) + a->unique = 1; + + return (1); +} + + +/* + * 'cupsArrayRestore()' - Reset the current element to the last @link cupsArraySave@. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - New current element */ +cupsArrayRestore(cups_array_t *a) /* I - Array */ +{ + if (!a) + return (NULL); + + if (a->num_saved <= 0) + return (NULL); + + a->num_saved --; + a->current = a->saved[a->num_saved]; + + if (a->current >= 0 && a->current < a->num_elements) + return (a->elements[a->current]); + else + return (NULL); +} + + +/* + * 'cupsArraySave()' - Mark the current element for a later @link cupsArrayRestore@. + * + * The current element is undefined until you call @link cupsArrayFind@, + * @link cupsArrayFirst@, or @link cupsArrayIndex@, or @link cupsArrayLast@ + * to set the current element. + * + * The save/restore stack is guaranteed to be at least 32 elements deep. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsArraySave(cups_array_t *a) /* I - Array */ +{ + if (!a) + return (0); + + if (a->num_saved >= _CUPS_MAXSAVE) + return (0); + + a->saved[a->num_saved] = a->current; + a->num_saved ++; + + return (1); +} + + +/* + * 'cupsArrayUserData()' - Return the user data for an array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void * /* O - User data */ +cupsArrayUserData(cups_array_t *a) /* I - Array */ +{ + if (a) + return (a->data); + else + return (NULL); +} + + +/* + * 'cups_array_add()' - Insert or append an element to the array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +static int /* O - 1 on success, 0 on failure */ +cups_array_add(cups_array_t *a, /* I - Array */ + void *e, /* I - Element to add */ + int insert) /* I - 1 = insert, 0 = append */ +{ + int i, /* Looping var */ + current, /* Current element */ + diff; /* Comparison with current element */ + + + DEBUG_printf(("7cups_array_add(a=%p, e=%p, insert=%d)", a, e, insert)); + + /* + * Verify we have room for the new element... + */ + + if (a->num_elements >= a->alloc_elements) + { + /* + * Allocate additional elements; start with 16 elements, then + * double the size until 1024 elements, then add 1024 elements + * thereafter... + */ + + void **temp; /* New array elements */ + int count; /* New allocation count */ + + + if (a->alloc_elements == 0) + { + count = 16; + temp = malloc(count * sizeof(void *)); + } + else + { + if (a->alloc_elements < 1024) + count = a->alloc_elements * 2; + else + count = a->alloc_elements + 1024; + + temp = realloc(a->elements, count * sizeof(void *)); + } + + DEBUG_printf(("9cups_array_add: count=%d", count)); + + if (!temp) + { + DEBUG_puts("9cups_array_add: allocation failed, returning 0"); + return (0); + } + + a->alloc_elements = count; + a->elements = temp; + } + + /* + * Find the insertion point for the new element; if there is no + * compare function or elements, just add it to the beginning or end... + */ + + if (!a->num_elements || !a->compare) + { + /* + * No elements or comparison function, insert/append as needed... + */ + + if (insert) + current = 0; /* Insert at beginning */ + else + current = a->num_elements; /* Append to the end */ + } + else + { + /* + * Do a binary search for the insertion point... + */ + + current = cups_array_find(a, e, a->insert, &diff); + + if (diff > 0) + { + /* + * Insert after the current element... + */ + + current ++; + } + else if (!diff) + { + /* + * Compared equal, make sure we add to the begining or end of + * the current run of equal elements... + */ + + a->unique = 0; + + if (insert) + { + /* + * Insert at beginning of run... + */ + + while (current > 0 && !(*(a->compare))(e, a->elements[current - 1], + a->data)) + current --; + } + else + { + /* + * Append at end of run... + */ + + do + { + current ++; + } + while (current < a->num_elements && + !(*(a->compare))(e, a->elements[current], a->data)); + } + } + } + + /* + * Insert or append the element... + */ + + if (current < a->num_elements) + { + /* + * Shift other elements to the right... + */ + + memmove(a->elements + current + 1, a->elements + current, + (a->num_elements - current) * sizeof(void *)); + + if (a->current >= current) + a->current ++; + + for (i = 0; i < a->num_saved; i ++) + if (a->saved[i] >= current) + a->saved[i] ++; + + DEBUG_printf(("9cups_array_add: insert element at index %d...", current)); + } +#ifdef DEBUG + else + DEBUG_printf(("9cups_array_add: append element at %d...", current)); +#endif /* DEBUG */ + + if (a->copyfunc) + { + if ((a->elements[current] = (a->copyfunc)(e, a->data)) == NULL) + { + DEBUG_puts("8cups_array_add: Copy function returned NULL, returning 0"); + return (0); + } + } + else + a->elements[current] = e; + + a->num_elements ++; + a->insert = current; + +#ifdef DEBUG + for (current = 0; current < a->num_elements; current ++) + DEBUG_printf(("9cups_array_add: a->elements[%d]=%p", current, + a->elements[current])); +#endif /* DEBUG */ + + DEBUG_puts("9cups_array_add: returning 1"); + + return (1); +} + + +/* + * 'cups_array_find()' - Find an element in the array. + */ + +static int /* O - Index of match */ +cups_array_find(cups_array_t *a, /* I - Array */ + void *e, /* I - Element */ + int prev, /* I - Previous index */ + int *rdiff) /* O - Difference of match */ +{ + int left, /* Left side of search */ + right, /* Right side of search */ + current, /* Current element */ + diff; /* Comparison with current element */ + + + DEBUG_printf(("7cups_array_find(a=%p, e=%p, prev=%d, rdiff=%p)", a, e, prev, + rdiff)); + + if (a->compare) + { + /* + * Do a binary search for the element... + */ + + DEBUG_puts("9cups_array_find: binary search"); + + if (prev >= 0 && prev < a->num_elements) + { + /* + * Start search on either side of previous... + */ + + if ((diff = (*(a->compare))(e, a->elements[prev], a->data)) == 0 || + (diff < 0 && prev == 0) || + (diff > 0 && prev == (a->num_elements - 1))) + { + /* + * Exact or edge match, return it! + */ + + DEBUG_printf(("9cups_array_find: Returning %d, diff=%d", prev, diff)); + + *rdiff = diff; + + return (prev); + } + else if (diff < 0) + { + /* + * Start with previous on right side... + */ + + left = 0; + right = prev; + } + else + { + /* + * Start wih previous on left side... + */ + + left = prev; + right = a->num_elements - 1; + } + } + else + { + /* + * Start search in the middle... + */ + + left = 0; + right = a->num_elements - 1; + } + + do + { + current = (left + right) / 2; + diff = (*(a->compare))(e, a->elements[current], a->data); + + DEBUG_printf(("9cups_array_find: left=%d, right=%d, current=%d, diff=%d", + left, right, current, diff)); + + if (diff == 0) + break; + else if (diff < 0) + right = current; + else + left = current; + } + while ((right - left) > 1); + + if (diff != 0) + { + /* + * Check the last 1 or 2 elements... + */ + + if ((diff = (*(a->compare))(e, a->elements[left], a->data)) <= 0) + current = left; + else + { + diff = (*(a->compare))(e, a->elements[right], a->data); + current = right; + } + } + } + else + { + /* + * Do a linear pointer search... + */ + + DEBUG_puts("9cups_array_find: linear search"); + + diff = 1; + + for (current = 0; current < a->num_elements; current ++) + if (a->elements[current] == e) + { + diff = 0; + break; + } + } + + /* + * Return the closest element and the difference... + */ + + DEBUG_printf(("8cups_array_find: Returning %d, diff=%d", current, diff)); + + *rdiff = diff; + + return (current); +} + + +/* + * End of "$Id: array.c 9772 2011-05-12 05:46:30Z mike $". + */ diff --git a/cups/array.h b/cups/array.h new file mode 100644 index 0000000..30d9f1e --- /dev/null +++ b/cups/array.h @@ -0,0 +1,92 @@ +/* + * "$Id: array.h 9348 2010-11-02 21:37:38Z mike $" + * + * Sorted array definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_ARRAY_H_ +# define _CUPS_ARRAY_H_ + +/* + * Include necessary headers... + */ + +# include "versioning.h" +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Types and structures... + */ + +typedef struct _cups_array_s cups_array_t; + /**** CUPS array type ****/ +typedef int (*cups_array_func_t)(void *first, void *second, void *data); + /**** Array comparison function ****/ +typedef int (*cups_ahash_func_t)(void *element, void *data); + /**** Array hash function ****/ +typedef void *(*cups_acopy_func_t)(void *element, void *data); + /**** Array element copy function ****/ +typedef void (*cups_afree_func_t)(void *element, void *data); + /**** Array element free function ****/ + + +/* + * Functions... + */ + +extern int cupsArrayAdd(cups_array_t *a, void *e) _CUPS_API_1_2; +extern void cupsArrayClear(cups_array_t *a) _CUPS_API_1_2; +extern int cupsArrayCount(cups_array_t *a) _CUPS_API_1_2; +extern void *cupsArrayCurrent(cups_array_t *a) _CUPS_API_1_2; +extern void cupsArrayDelete(cups_array_t *a) _CUPS_API_1_2; +extern cups_array_t *cupsArrayDup(cups_array_t *a) _CUPS_API_1_2; +extern void *cupsArrayFind(cups_array_t *a, void *e) _CUPS_API_1_2; +extern void *cupsArrayFirst(cups_array_t *a) _CUPS_API_1_2; +extern int cupsArrayGetIndex(cups_array_t *a) _CUPS_API_1_3; +extern int cupsArrayGetInsert(cups_array_t *a) _CUPS_API_1_3; +extern void *cupsArrayIndex(cups_array_t *a, int n) _CUPS_API_1_2; +extern int cupsArrayInsert(cups_array_t *a, void *e) _CUPS_API_1_2; +extern void *cupsArrayLast(cups_array_t *a) _CUPS_API_1_2; +extern cups_array_t *cupsArrayNew(cups_array_func_t f, void *d) _CUPS_API_1_2; +extern cups_array_t *cupsArrayNew2(cups_array_func_t f, void *d, + cups_ahash_func_t h, int hsize) _CUPS_API_1_3; +extern cups_array_t *cupsArrayNew3(cups_array_func_t f, void *d, + cups_ahash_func_t h, int hsize, + cups_acopy_func_t cf, + cups_afree_func_t ff) _CUPS_API_1_5; +extern void *cupsArrayNext(cups_array_t *a) _CUPS_API_1_2; +extern void *cupsArrayPrev(cups_array_t *a) _CUPS_API_1_2; +extern int cupsArrayRemove(cups_array_t *a, void *e) _CUPS_API_1_2; +extern void *cupsArrayRestore(cups_array_t *a) _CUPS_API_1_2; +extern int cupsArraySave(cups_array_t *a) _CUPS_API_1_2; +extern void *cupsArrayUserData(cups_array_t *a) _CUPS_API_1_2; + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_ARRAY_H_ */ + +/* + * End of "$Id: array.h 9348 2010-11-02 21:37:38Z mike $". + */ diff --git a/cups/attr.c b/cups/attr.c new file mode 100644 index 0000000..ec00ac4 --- /dev/null +++ b/cups/attr.c @@ -0,0 +1,335 @@ +/* + * "$Id: attr.c 9793 2011-05-20 03:49:49Z mike $" + * + * PPD model-specific attribute routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * ppdFindAttr() - Find the first matching attribute. + * ppdFindNextAttr() - Find the next matching attribute. + * _ppdNormalizeMakeAndModel() - Normalize a product/make-and-model string. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "ppd-private.h" + + +/* + * 'ppdFindAttr()' - Find the first matching attribute. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ppd_attr_t * /* O - Attribute or @code NULL@ if not found */ +ppdFindAttr(ppd_file_t *ppd, /* I - PPD file data */ + const char *name, /* I - Attribute name */ + const char *spec) /* I - Specifier string or @code NULL@ */ +{ + ppd_attr_t key, /* Search key */ + *attr; /* Current attribute */ + + + DEBUG_printf(("2ppdFindAttr(ppd=%p, name=\"%s\", spec=\"%s\")", ppd, name, + spec)); + + /* + * Range check input... + */ + + if (!ppd || !name || ppd->num_attrs == 0) + return (NULL); + + /* + * Search for a matching attribute... + */ + + memset(&key, 0, sizeof(key)); + strlcpy(key.name, name, sizeof(key.name)); + + /* + * Return the first matching attribute, if any... + */ + + if ((attr = (ppd_attr_t *)cupsArrayFind(ppd->sorted_attrs, &key)) != NULL) + { + if (spec) + { + /* + * Loop until we find the first matching attribute for "spec"... + */ + + while (attr && _cups_strcasecmp(spec, attr->spec)) + { + if ((attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) != NULL && + _cups_strcasecmp(attr->name, name)) + attr = NULL; + } + } + } + + return (attr); +} + + +/* + * 'ppdFindNextAttr()' - Find the next matching attribute. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ppd_attr_t * /* O - Attribute or @code NULL@ if not found */ +ppdFindNextAttr(ppd_file_t *ppd, /* I - PPD file data */ + const char *name, /* I - Attribute name */ + const char *spec) /* I - Specifier string or @code NULL@ */ +{ + ppd_attr_t *attr; /* Current attribute */ + + + /* + * Range check input... + */ + + if (!ppd || !name || ppd->num_attrs == 0) + return (NULL); + + /* + * See if there are more attributes to return... + */ + + while ((attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) != NULL) + { + /* + * Check the next attribute to see if it is a match... + */ + + if (_cups_strcasecmp(attr->name, name)) + { + /* + * Nope, reset the current pointer to the end of the array... + */ + + cupsArrayIndex(ppd->sorted_attrs, cupsArrayCount(ppd->sorted_attrs)); + + return (NULL); + } + + if (!spec || !_cups_strcasecmp(attr->spec, spec)) + break; + } + + /* + * Return the next attribute's value... + */ + + return (attr); +} + + +/* + * '_ppdNormalizeMakeAndModel()' - Normalize a product/make-and-model string. + * + * This function tries to undo the mistakes made by many printer manufacturers + * to produce a clean make-and-model string we can use. + */ + +char * /* O - Normalized make-and-model string or NULL on error */ +_ppdNormalizeMakeAndModel( + const char *make_and_model, /* I - Original make-and-model string */ + char *buffer, /* I - String buffer */ + size_t bufsize) /* I - Size of string buffer */ +{ + char *bufptr; /* Pointer into buffer */ + + + if (!make_and_model || !buffer || bufsize < 1) + { + if (buffer) + *buffer = '\0'; + + return (NULL); + } + + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*make_and_model)) + make_and_model ++; + + /* + * Remove parenthesis and add manufacturers as needed... + */ + + if (make_and_model[0] == '(') + { + strlcpy(buffer, make_and_model + 1, bufsize); + + if ((bufptr = strrchr(buffer, ')')) != NULL) + *bufptr = '\0'; + } + else if (!_cups_strncasecmp(make_and_model, "XPrint", 6)) + { + /* + * Xerox XPrint... + */ + + snprintf(buffer, bufsize, "Xerox %s", make_and_model); + } + else if (!_cups_strncasecmp(make_and_model, "Eastman", 7)) + { + /* + * Kodak... + */ + + snprintf(buffer, bufsize, "Kodak %s", make_and_model + 7); + } + else if (!_cups_strncasecmp(make_and_model, "laserwriter", 11)) + { + /* + * Apple LaserWriter... + */ + + snprintf(buffer, bufsize, "Apple LaserWriter%s", make_and_model + 11); + } + else if (!_cups_strncasecmp(make_and_model, "colorpoint", 10)) + { + /* + * Seiko... + */ + + snprintf(buffer, bufsize, "Seiko %s", make_and_model); + } + else if (!_cups_strncasecmp(make_and_model, "fiery", 5)) + { + /* + * EFI... + */ + + snprintf(buffer, bufsize, "EFI %s", make_and_model); + } + else if (!_cups_strncasecmp(make_and_model, "ps ", 3) || + !_cups_strncasecmp(make_and_model, "colorpass", 9)) + { + /* + * Canon... + */ + + snprintf(buffer, bufsize, "Canon %s", make_and_model); + } + else if (!_cups_strncasecmp(make_and_model, "primera", 7)) + { + /* + * Fargo... + */ + + snprintf(buffer, bufsize, "Fargo %s", make_and_model); + } + else if (!_cups_strncasecmp(make_and_model, "designjet", 9) || + !_cups_strncasecmp(make_and_model, "deskjet", 7)) + { + /* + * HP... + */ + + snprintf(buffer, bufsize, "HP %s", make_and_model); + } + else + strlcpy(buffer, make_and_model, bufsize); + + /* + * Clean up the make... + */ + + if (!_cups_strncasecmp(buffer, "agfa", 4)) + { + /* + * Replace with AGFA (all uppercase)... + */ + + buffer[0] = 'A'; + buffer[1] = 'G'; + buffer[2] = 'F'; + buffer[3] = 'A'; + } + else if (!_cups_strncasecmp(buffer, "Hewlett-Packard hp ", 19)) + { + /* + * Just put "HP" on the front... + */ + + buffer[0] = 'H'; + buffer[1] = 'P'; + _cups_strcpy(buffer + 2, buffer + 18); + } + else if (!_cups_strncasecmp(buffer, "Hewlett-Packard ", 16)) + { + /* + * Just put "HP" on the front... + */ + + buffer[0] = 'H'; + buffer[1] = 'P'; + _cups_strcpy(buffer + 2, buffer + 15); + } + else if (!_cups_strncasecmp(buffer, "Lexmark International", 21)) + { + /* + * Strip "International"... + */ + + _cups_strcpy(buffer + 8, buffer + 21); + } + else if (!_cups_strncasecmp(buffer, "herk", 4)) + { + /* + * Replace with LHAG... + */ + + buffer[0] = 'L'; + buffer[1] = 'H'; + buffer[2] = 'A'; + buffer[3] = 'G'; + } + else if (!_cups_strncasecmp(buffer, "linotype", 8)) + { + /* + * Replace with LHAG... + */ + + buffer[0] = 'L'; + buffer[1] = 'H'; + buffer[2] = 'A'; + buffer[3] = 'G'; + _cups_strcpy(buffer + 4, buffer + 8); + } + + /* + * Remove trailing whitespace and return... + */ + + for (bufptr = buffer + strlen(buffer) - 1; + bufptr >= buffer && _cups_isspace(*bufptr); + bufptr --); + + bufptr[1] = '\0'; + + return (buffer[0] ? buffer : NULL); +} + + +/* + * End of "$Id: attr.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/auth.c b/cups/auth.c new file mode 100644 index 0000000..f2fa373 --- /dev/null +++ b/cups/auth.c @@ -0,0 +1,880 @@ +/* + * "$Id: auth.c 10288 2012-02-15 19:21:37Z mike $" + * + * Authentication functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * This file contains Kerberos support code, copyright 2006 by + * Jelmer Vernooij. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsDoAuthentication() - Authenticate a request. + * _cupsSetNegotiateAuthString() - Set the Kerberos authentication string. + * cups_gss_acquire() - Kerberos credentials callback. + * cups_gss_getname() - Get CUPS service credentials for + * authentication. + * cups_gss_printf() - Show debug error messages from GSSAPI. + * cups_local_auth() - Get the local authorization certificate if + * available/applicable. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ + +#if HAVE_AUTHORIZATION_H +# include +# ifdef HAVE_SECBASEPRIV_H +# include +# else +extern const char *cssmErrorString(int error); +# endif /* HAVE_SECBASEPRIV_H */ +#endif /* HAVE_AUTHORIZATION_H */ + +#if defined(SO_PEERCRED) && defined(AF_LOCAL) +# include +#endif /* SO_PEERCRED && AF_LOCAL */ + + +/* + * Local functions... + */ + +#ifdef HAVE_GSSAPI +# ifdef HAVE_GSS_ACQUIRE_CRED_EX_F +# ifdef HAVE_GSS_GSSAPI_SPI_H +# include +# else +# define GSS_AUTH_IDENTITY_TYPE_1 1 +# define gss_acquire_cred_ex_f __ApplePrivate_gss_acquire_cred_ex_f +typedef struct gss_auth_identity +{ + uint32_t type; + uint32_t flags; + char *username; + char *realm; + char *password; + gss_buffer_t *credentialsRef; +} gss_auth_identity_desc; +extern OM_uint32 gss_acquire_cred_ex_f(gss_status_id_t, const gss_name_t, + OM_uint32, OM_uint32, const gss_OID, + gss_cred_usage_t, gss_auth_identity_t, + void *, void (*)(void *, OM_uint32, + gss_status_id_t, + gss_cred_id_t, + gss_OID_set, + OM_uint32)); +# endif /* HAVE_GSS_GSSAPI_SPI_H */ +# include +typedef struct _cups_gss_acquire_s /* Acquire callback data */ +{ + dispatch_semaphore_t sem; /* Synchronization semaphore */ + OM_uint32 major; /* Returned status code */ + gss_cred_id_t creds; /* Returned credentials */ +} _cups_gss_acquire_t; + +static void cups_gss_acquire(void *ctx, OM_uint32 major, + gss_status_id_t status, + gss_cred_id_t creds, gss_OID_set oids, + OM_uint32 time_rec); +# endif /* HAVE_GSS_ACQUIRE_CRED_EX_F */ +static gss_name_t cups_gss_getname(http_t *http, const char *service_name); +# ifdef DEBUG +static void cups_gss_printf(OM_uint32 major_status, OM_uint32 minor_status, + const char *message); +# else +# define cups_gss_printf(major, minor, message) +# endif /* DEBUG */ +#endif /* HAVE_GSSAPI */ +static int cups_local_auth(http_t *http); + + +/* + * 'cupsDoAuthentication()' - Authenticate a request. + * + * This function should be called in response to a @code HTTP_UNAUTHORIZED@ + * status, prior to resubmitting your request. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +int /* O - 0 on success, -1 on error */ +cupsDoAuthentication( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *method, /* I - Request method ("GET", "POST", "PUT") */ + const char *resource) /* I - Resource path */ +{ + const char *password, /* Password string */ + *www_auth; /* WWW-Authenticate header */ + char prompt[1024], /* Prompt for user */ + realm[HTTP_MAX_VALUE], /* realm="xyz" string */ + nonce[HTTP_MAX_VALUE]; /* nonce="xyz" string */ + int localauth; /* Local authentication result */ + _cups_globals_t *cg; /* Global data */ + + + DEBUG_printf(("cupsDoAuthentication(http=%p, method=\"%s\", resource=\"%s\")", + http, method, resource)); + + if (!http) + http = _cupsConnect(); + + if (!http || !method || !resource) + return (-1); + + DEBUG_printf(("2cupsDoAuthentication: digest_tries=%d, userpass=\"%s\"", + http->digest_tries, http->userpass)); + DEBUG_printf(("2cupsDoAuthentication: WWW-Authenticate=\"%s\"", + httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE))); + + /* + * Clear the current authentication string... + */ + + httpSetAuthString(http, NULL, NULL); + + /* + * See if we can do local authentication... + */ + + if (http->digest_tries < 3) + { + if ((localauth = cups_local_auth(http)) == 0) + { + DEBUG_printf(("2cupsDoAuthentication: authstring=\"%s\"", + http->authstring)); + + if (http->status == HTTP_UNAUTHORIZED) + http->digest_tries ++; + + return (0); + } + else if (localauth == -1) + { + http->status = HTTP_AUTHORIZATION_CANCELED; + return (-1); /* Error or canceled */ + } + } + + /* + * Nope, see if we should retry the current username:password... + */ + + www_auth = http->fields[HTTP_FIELD_WWW_AUTHENTICATE]; + + if ((http->digest_tries > 1 || !http->userpass[0]) && + (!_cups_strncasecmp(www_auth, "Basic", 5) || + !_cups_strncasecmp(www_auth, "Digest", 6))) + { + /* + * Nope - get a new password from the user... + */ + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + snprintf(prompt, sizeof(prompt), + _cupsLangString(cg->lang_default, _("Password for %s on %s? ")), + cupsUser(), + http->hostname[0] == '/' ? "localhost" : http->hostname); + + http->digest_tries = _cups_strncasecmp(www_auth, "Digest", 6) != 0; + http->userpass[0] = '\0'; + + if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL) + { + http->status = HTTP_AUTHORIZATION_CANCELED; + return (-1); + } + + snprintf(http->userpass, sizeof(http->userpass), "%s:%s", cupsUser(), + password); + } + else if (http->status == HTTP_UNAUTHORIZED) + http->digest_tries ++; + + if (http->status == HTTP_UNAUTHORIZED && http->digest_tries >= 3) + { + DEBUG_printf(("1cupsDoAuthentication: Too many authentication tries (%d)", + http->digest_tries)); + + http->status = HTTP_AUTHORIZATION_CANCELED; + return (-1); + } + + /* + * Got a password; encode it for the server... + */ + +#ifdef HAVE_GSSAPI + if (!_cups_strncasecmp(www_auth, "Negotiate", 9)) + { + /* + * Kerberos authentication... + */ + + if (_cupsSetNegotiateAuthString(http, method, resource)) + { + http->status = HTTP_AUTHORIZATION_CANCELED; + return (-1); + } + } + else +#endif /* HAVE_GSSAPI */ + if (!_cups_strncasecmp(www_auth, "Basic", 5)) + { + /* + * Basic authentication... + */ + + char encode[256]; /* Base64 buffer */ + + + httpEncode64_2(encode, sizeof(encode), http->userpass, + (int)strlen(http->userpass)); + httpSetAuthString(http, "Basic", encode); + } + else if (!_cups_strncasecmp(www_auth, "Digest", 6)) + { + /* + * Digest authentication... + */ + + char encode[33], /* MD5 buffer */ + digest[1024]; /* Digest auth data */ + + + httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "realm", realm); + httpGetSubField(http, HTTP_FIELD_WWW_AUTHENTICATE, "nonce", nonce); + + httpMD5(cupsUser(), realm, strchr(http->userpass, ':') + 1, encode); + httpMD5Final(nonce, method, resource, encode); + snprintf(digest, sizeof(digest), + "username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", " + "response=\"%s\"", cupsUser(), realm, nonce, resource, encode); + httpSetAuthString(http, "Digest", digest); + } + else + { + DEBUG_printf(("1cupsDoAuthentication: Unknown auth type: \"%s\"", + www_auth)); + http->status = HTTP_AUTHORIZATION_CANCELED; + return (-1); + } + + DEBUG_printf(("1cupsDoAuthentication: authstring=\"%s\"", http->authstring)); + + return (0); +} + + +#ifdef HAVE_GSSAPI +/* + * '_cupsSetNegotiateAuthString()' - Set the Kerberos authentication string. + */ + +int /* O - 0 on success, -1 on error */ +_cupsSetNegotiateAuthString( + http_t *http, /* I - Connection to server */ + const char *method, /* I - Request method ("GET", "POST", "PUT") */ + const char *resource) /* I - Resource path */ +{ + OM_uint32 minor_status, /* Minor status code */ + major_status; /* Major status code */ + gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER; + /* Output token */ + + + (void)method; + (void)resource; + +# ifdef __APPLE__ + /* + * If the weak-linked GSSAPI/Kerberos library is not present, don't try + * to use it... + */ + + if (gss_init_sec_context == NULL) + { + DEBUG_puts("1_cupsSetNegotiateAuthString: Weak-linked GSSAPI/Kerberos " + "framework is not present"); + return (-1); + } +# endif /* __APPLE__ */ + + if (http->gssname == GSS_C_NO_NAME) + { + http->gssname = cups_gss_getname(http, _cupsGSSServiceName()); + } + + if (http->gssctx != GSS_C_NO_CONTEXT) + { + gss_delete_sec_context(&minor_status, &http->gssctx, GSS_C_NO_BUFFER); + http->gssctx = GSS_C_NO_CONTEXT; + } + + major_status = gss_init_sec_context(&minor_status, GSS_C_NO_CREDENTIAL, + &http->gssctx, + http->gssname, http->gssmech, + GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG, + GSS_C_INDEFINITE, + GSS_C_NO_CHANNEL_BINDINGS, + GSS_C_NO_BUFFER, &http->gssmech, + &output_token, NULL, NULL); + +#ifdef HAVE_GSS_ACQUIRE_CRED_EX_F + if (major_status == GSS_S_NO_CRED) + { + /* + * Ask the user for credentials... + */ + + char prompt[1024], /* Prompt for user */ + userbuf[256]; /* Kerberos username */ + const char *username, /* Username string */ + *password; /* Password string */ + _cups_gss_acquire_t data; /* Callback data */ + gss_auth_identity_desc identity; /* Kerberos user identity */ + _cups_globals_t *cg = _cupsGlobals(); + /* Per-thread global data */ + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + snprintf(prompt, sizeof(prompt), + _cupsLangString(cg->lang_default, _("Password for %s on %s? ")), + cupsUser(), http->gsshost); + + if ((password = cupsGetPassword2(prompt, http, method, resource)) == NULL) + return (-1); + + /* + * Try to acquire credentials... + */ + + username = cupsUser(); + if (!strchr(username, '@')) + { + snprintf(userbuf, sizeof(userbuf), "%s@%s", username, http->gsshost); + username = userbuf; + } + + identity.type = GSS_AUTH_IDENTITY_TYPE_1; + identity.flags = 0; + identity.username = (char *)username; + identity.realm = (char *)""; + identity.password = (char *)password; + identity.credentialsRef = NULL; + + data.sem = dispatch_semaphore_create(0); + data.major = 0; + data.creds = NULL; + + if (data.sem) + { + major_status = gss_acquire_cred_ex_f(NULL, GSS_C_NO_NAME, 0, + GSS_C_INDEFINITE, GSS_KRB5_MECHANISM, + GSS_C_INITIATE, &identity, &data, + cups_gss_acquire); + + if (major_status == GSS_S_COMPLETE) + { + dispatch_semaphore_wait(data.sem, DISPATCH_TIME_FOREVER); + major_status = data.major; + } + + dispatch_release(data.sem); + + if (major_status == GSS_S_COMPLETE) + { + OM_uint32 release_minor; /* Minor status from releasing creds */ + + major_status = gss_init_sec_context(&minor_status, data.creds, + &http->gssctx, + http->gssname, http->gssmech, + GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG, + GSS_C_INDEFINITE, + GSS_C_NO_CHANNEL_BINDINGS, + GSS_C_NO_BUFFER, &http->gssmech, + &output_token, NULL, NULL); + gss_release_cred(&release_minor, &data.creds); + } + } + } +#endif /* HAVE_GSS_ACQUIRED_CRED_EX_F */ + + if (GSS_ERROR(major_status)) + { + cups_gss_printf(major_status, minor_status, + "_cupsSetNegotiateAuthString: Unable to initialize " + "security context"); + return (-1); + } + +#ifdef DEBUG + else if (major_status == GSS_S_CONTINUE_NEEDED) + cups_gss_printf(major_status, minor_status, + "_cupsSetNegotiateAuthString: Continuation needed!"); +#endif /* DEBUG */ + + if (output_token.length > 0 && output_token.length <= 65536) + { + /* + * Allocate the authorization string since Windows KDCs can have + * arbitrarily large credentials... + */ + + int authsize = 10 + /* "Negotiate " */ + output_token.length * 4 / 3 + 1 + /* Base64 */ + 1; /* nul */ + + httpSetAuthString(http, NULL, NULL); + + if ((http->authstring = malloc(authsize)) == NULL) + { + http->authstring = http->_authstring; + authsize = sizeof(http->_authstring); + } + + strcpy(http->authstring, "Negotiate "); + httpEncode64_2(http->authstring + 10, authsize - 10, output_token.value, + output_token.length); + + gss_release_buffer(&minor_status, &output_token); + } + else + { + DEBUG_printf(("1_cupsSetNegotiateAuthString: Kerberos credentials too " + "large - %d bytes!", (int)output_token.length)); + gss_release_buffer(&minor_status, &output_token); + + return (-1); + } + + return (0); +} + + +# ifdef HAVE_GSS_ACQUIRE_CRED_EX_F +/* + * 'cups_gss_acquire()' - Kerberos credentials callback. + */ +static void +cups_gss_acquire( + void *ctx, /* I - Caller context */ + OM_uint32 major, /* I - Major error code */ + gss_status_id_t status, /* I - Status (unused) */ + gss_cred_id_t creds, /* I - Credentials (if any) */ + gss_OID_set oids, /* I - Mechanism OIDs (unused) */ + OM_uint32 time_rec) /* I - Timestamp (unused) */ +{ + uint32_t min; /* Minor error code */ + _cups_gss_acquire_t *data; /* Callback data */ + + + (void)status; + (void)time_rec; + + data = (_cups_gss_acquire_t *)ctx; + data->major = major; + data->creds = creds; + + gss_release_oid_set(&min, &oids); + dispatch_semaphore_signal(data->sem); +} +# endif /* HAVE_GSS_ACQUIRE_CRED_EX_F */ + + +/* + * 'cups_gss_getname()' - Get CUPS service credentials for authentication. + */ + +static gss_name_t /* O - Server name */ +cups_gss_getname( + http_t *http, /* I - Connection to server */ + const char *service_name) /* I - Service name */ +{ + gss_buffer_desc token = GSS_C_EMPTY_BUFFER; + /* Service token */ + OM_uint32 major_status, /* Major status code */ + minor_status; /* Minor status code */ + gss_name_t server_name; /* Server name */ + char buf[1024]; /* Name buffer */ + + + DEBUG_printf(("7cups_gss_getname(http=%p, service_name=\"%s\")", http, + service_name)); + + + /* + * Get the hostname... + */ + + if (!http->gsshost[0]) + { + httpGetHostname(http, http->gsshost, sizeof(http->gsshost)); + + if (!strcmp(http->gsshost, "localhost")) + { + if (gethostname(http->gsshost, sizeof(http->gsshost)) < 0) + { + DEBUG_printf(("1cups_gss_getname: gethostname() failed: %s", + strerror(errno))); + http->gsshost[0] = '\0'; + return (NULL); + } + + if (!strchr(http->gsshost, '.')) + { + /* + * The hostname is not a FQDN, so look it up... + */ + + struct hostent *host; /* Host entry to get FQDN */ + + if ((host = gethostbyname(http->gsshost)) != NULL && host->h_name) + { + /* + * Use the resolved hostname... + */ + + strlcpy(http->gsshost, host->h_name, sizeof(http->gsshost)); + } + else + { + DEBUG_printf(("1cups_gss_getname: gethostbyname(\"%s\") failed.", + http->gsshost)); + http->gsshost[0] = '\0'; + return (NULL); + } + } + } + } + + /* + * Get a service name we can use for authentication purposes... + */ + + snprintf(buf, sizeof(buf), "%s@%s", service_name, http->gsshost); + + DEBUG_printf(("8cups_gss_getname: Looking up \"%s\".", buf)); + + token.value = buf; + token.length = strlen(buf); + server_name = GSS_C_NO_NAME; + major_status = gss_import_name(&minor_status, &token, + GSS_C_NT_HOSTBASED_SERVICE, + &server_name); + + if (GSS_ERROR(major_status)) + { + cups_gss_printf(major_status, minor_status, + "cups_gss_getname: gss_import_name() failed"); + return (NULL); + } + + return (server_name); +} + + +# ifdef DEBUG +/* + * 'cups_gss_printf()' - Show debug error messages from GSSAPI. + */ + +static void +cups_gss_printf(OM_uint32 major_status,/* I - Major status code */ + OM_uint32 minor_status,/* I - Minor status code */ + const char *message) /* I - Prefix for error message */ +{ + OM_uint32 err_major_status, /* Major status code for display */ + err_minor_status; /* Minor status code for display */ + OM_uint32 msg_ctx; /* Message context */ + gss_buffer_desc major_status_string = GSS_C_EMPTY_BUFFER, + /* Major status message */ + minor_status_string = GSS_C_EMPTY_BUFFER; + /* Minor status message */ + + + msg_ctx = 0; + err_major_status = gss_display_status(&err_minor_status, + major_status, + GSS_C_GSS_CODE, + GSS_C_NO_OID, + &msg_ctx, + &major_status_string); + + if (!GSS_ERROR(err_major_status)) + gss_display_status(&err_minor_status, minor_status, GSS_C_MECH_CODE, + GSS_C_NULL_OID, &msg_ctx, &minor_status_string); + + DEBUG_printf(("1%s: %s, %s", message, (char *)major_status_string.value, + (char *)minor_status_string.value)); + + gss_release_buffer(&err_minor_status, &major_status_string); + gss_release_buffer(&err_minor_status, &minor_status_string); +} +# endif /* DEBUG */ +#endif /* HAVE_GSSAPI */ + + +/* + * 'cups_local_auth()' - Get the local authorization certificate if + * available/applicable. + */ + +static int /* O - 0 if available */ + /* 1 if not available */ + /* -1 error */ +cups_local_auth(http_t *http) /* I - HTTP connection to server */ +{ +#if defined(WIN32) || defined(__EMX__) + /* + * Currently WIN32 and OS-2 do not support the CUPS server... + */ + + return (1); +#else + int pid; /* Current process ID */ + FILE *fp; /* Certificate file */ + char trc[16], /* Try Root Certificate parameter */ + filename[1024], /* Certificate filename */ + certificate[33];/* Certificate string */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ +# if defined(HAVE_AUTHORIZATION_H) + OSStatus status; /* Status */ + AuthorizationItem auth_right; /* Authorization right */ + AuthorizationRights auth_rights; /* Authorization rights */ + AuthorizationFlags auth_flags; /* Authorization flags */ + AuthorizationExternalForm auth_extrn; /* Authorization ref external */ + char auth_key[1024]; /* Buffer */ + char buffer[1024]; /* Buffer */ +# endif /* HAVE_AUTHORIZATION_H */ + + + DEBUG_printf(("7cups_local_auth(http=%p) hostaddr=%s, hostname=\"%s\"", + http, httpAddrString(http->hostaddr, filename, sizeof(filename)), http->hostname)); + + /* + * See if we are accessing localhost... + */ + + if (!httpAddrLocalhost(http->hostaddr) && + _cups_strcasecmp(http->hostname, "localhost") != 0) + { + DEBUG_puts("8cups_local_auth: Not a local connection!"); + return (1); + } + +# if defined(HAVE_AUTHORIZATION_H) + /* + * Delete any previous authorization reference... + */ + + if (http->auth_ref) + { + AuthorizationFree(http->auth_ref, kAuthorizationFlagDefaults); + http->auth_ref = NULL; + } + + if (!getenv("GATEWAY_INTERFACE") && + httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey", + auth_key, sizeof(auth_key))) + { + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, + kAuthorizationFlagDefaults, &http->auth_ref); + if (status != errAuthorizationSuccess) + { + DEBUG_printf(("8cups_local_auth: AuthorizationCreate() returned %d (%s)", + (int)status, cssmErrorString(status))); + return (-1); + } + + auth_right.name = auth_key; + auth_right.valueLength = 0; + auth_right.value = NULL; + auth_right.flags = 0; + + auth_rights.count = 1; + auth_rights.items = &auth_right; + + auth_flags = kAuthorizationFlagDefaults | + kAuthorizationFlagPreAuthorize | + kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagExtendRights; + + status = AuthorizationCopyRights(http->auth_ref, &auth_rights, + kAuthorizationEmptyEnvironment, + auth_flags, NULL); + if (status == errAuthorizationSuccess) + status = AuthorizationMakeExternalForm(http->auth_ref, &auth_extrn); + + if (status == errAuthorizationSuccess) + { + /* + * Set the authorization string and return... + */ + + httpEncode64_2(buffer, sizeof(buffer), (void *)&auth_extrn, + sizeof(auth_extrn)); + + httpSetAuthString(http, "AuthRef", buffer); + + DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", + http->authstring)); + return (0); + } + else if (status == errAuthorizationCanceled) + return (-1); + + DEBUG_printf(("9cups_local_auth: AuthorizationCopyRights() returned %d (%s)", + (int)status, cssmErrorString(status))); + + /* + * Fall through to try certificates... + */ + } +# endif /* HAVE_AUTHORIZATION_H */ + +# if defined(SO_PEERCRED) && defined(AF_LOCAL) + /* + * See if we can authenticate using the peer credentials provided over a + * domain socket; if so, specify "PeerCred username" as the authentication + * information... + */ + + if ( +# ifdef HAVE_GSSAPI + strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) && +# endif /* HAVE_GSSAPI */ +# ifdef HAVE_AUTHORIZATION_H + !httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey", + auth_key, sizeof(auth_key)) && +# endif /* HAVE_AUTHORIZATION_H */ + http->hostaddr->addr.sa_family == AF_LOCAL && + !getenv("GATEWAY_INTERFACE")) /* Not via CGI programs... */ + { + /* + * Verify that the current cupsUser() matches the current UID... + */ + + struct passwd *pwd; /* Password information */ + const char *username; /* Current username */ + + username = cupsUser(); + + if ((pwd = getpwnam(username)) != NULL && pwd->pw_uid == getuid()) + { + httpSetAuthString(http, "PeerCred", username); + + DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", + http->authstring)); + + return (0); + } + } +# endif /* SO_PEERCRED && AF_LOCAL */ + + /* + * Try opening a certificate file for this PID. If that fails, + * try the root certificate... + */ + + pid = getpid(); + snprintf(filename, sizeof(filename), "%s/certs/%d", cg->cups_statedir, pid); + if ((fp = fopen(filename, "r")) == NULL && pid > 0) + { + /* + * No certificate for this PID; see if we can get the root certificate... + */ + + DEBUG_printf(("9cups_local_auth: Unable to open file %s: %s", + filename, strerror(errno))); + +# ifdef HAVE_GSSAPI + if (!strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9)) + { + /* + * Kerberos required, don't try the root certificate... + */ + + return (1); + } +# endif /* HAVE_GSSAPI */ + +# ifdef HAVE_AUTHORIZATION_H + if (httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "authkey", + auth_key, sizeof(auth_key))) + { + /* + * Don't use the root certificate as a replacement for an authkey... + */ + + return (1); + } +# endif /* HAVE_AUTHORIZATION_H */ + if (!httpGetSubField2(http, HTTP_FIELD_WWW_AUTHENTICATE, "trc", trc, + sizeof(trc))) + { + /* + * Scheduler doesn't want us to use the root certificate... + */ + + return (1); + } + + snprintf(filename, sizeof(filename), "%s/certs/0", cg->cups_statedir); + fp = fopen(filename, "r"); + } + + if (fp) + { + /* + * Read the certificate from the file... + */ + + fgets(certificate, sizeof(certificate), fp); + fclose(fp); + + /* + * Set the authorization string and return... + */ + + httpSetAuthString(http, "Local", certificate); + + DEBUG_printf(("8cups_local_auth: Returning authstring=\"%s\"", + http->authstring)); + + return (0); + } + + return (1); +#endif /* WIN32 || __EMX__ */ +} + + +/* + * End of "$Id: auth.c 10288 2012-02-15 19:21:37Z mike $". + */ diff --git a/cups/backchannel.c b/cups/backchannel.c new file mode 100644 index 0000000..bcc4331 --- /dev/null +++ b/cups/backchannel.c @@ -0,0 +1,199 @@ +/* + * "$Id: backchannel.c 9042 2010-03-24 00:45:34Z mike $" + * + * Backchannel functions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsBackChannelRead() - Read data from the backchannel. + * cupsBackChannelWrite() - Write data to the backchannel. + * cups_setup() - Setup select() + */ + +/* + * Include necessary headers... + */ + +#include "cups.h" +#include +#ifdef WIN32 +# include +# include +#else +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +static void cups_setup(fd_set *set, struct timeval *tval, + double timeout); + + +/* + * 'cupsBackChannelRead()' - Read data from the backchannel. + * + * Reads up to "bytes" bytes from the backchannel/backend. The "timeout" + * parameter controls how many seconds to wait for the data - use 0.0 to + * return immediately if there is no data, -1.0 to wait for data indefinitely. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Bytes read or -1 on error */ +cupsBackChannelRead(char *buffer, /* I - Buffer to read into */ + size_t bytes, /* I - Bytes to read */ + double timeout) /* I - Timeout in seconds, typically 0.0 to poll */ +{ + fd_set input; /* Input set */ + struct timeval tval; /* Timeout value */ + int status; /* Select status */ + + + /* + * Wait for input ready. + */ + + do + { + cups_setup(&input, &tval, timeout); + + if (timeout < 0.0) + status = select(4, &input, NULL, NULL, NULL); + else + status = select(4, &input, NULL, NULL, &tval); + } + while (status < 0 && errno != EINTR && errno != EAGAIN); + + if (status < 0) + return (-1); /* Timeout! */ + + /* + * Read bytes from the pipe... + */ + +#ifdef WIN32 + return ((ssize_t)_read(3, buffer, (unsigned)bytes)); +#else + return (read(3, buffer, bytes)); +#endif /* WIN32 */ +} + + +/* + * 'cupsBackChannelWrite()' - Write data to the backchannel. + * + * Writes "bytes" bytes to the backchannel/filter. The "timeout" parameter + * controls how many seconds to wait for the data to be written - use + * 0.0 to return immediately if the data cannot be written, -1.0 to wait + * indefinitely. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Bytes written or -1 on error */ +cupsBackChannelWrite( + const char *buffer, /* I - Buffer to write */ + size_t bytes, /* I - Bytes to write */ + double timeout) /* I - Timeout in seconds, typically 1.0 */ +{ + fd_set output; /* Output set */ + struct timeval tval; /* Timeout value */ + int status; /* Select status */ + ssize_t count; /* Current bytes */ + size_t total; /* Total bytes */ + + + /* + * Write all bytes... + */ + + total = 0; + + while (total < bytes) + { + /* + * Wait for write-ready... + */ + + do + { + cups_setup(&output, &tval, timeout); + + if (timeout < 0.0) + status = select(4, NULL, &output, NULL, NULL); + else + status = select(4, NULL, &output, NULL, &tval); + } + while (status < 0 && errno != EINTR && errno != EAGAIN); + + if (status <= 0) + return (-1); /* Timeout! */ + + /* + * Write bytes to the pipe... + */ + +#ifdef WIN32 + count = (ssize_t)_write(3, buffer, (unsigned)(bytes - total)); +#else + count = write(3, buffer, bytes - total); +#endif /* WIN32 */ + + if (count < 0) + { + /* + * Write error - abort on fatal errors... + */ + + if (errno != EINTR && errno != EAGAIN) + return (-1); + } + else + { + /* + * Write succeeded, update buffer pointer and total count... + */ + + buffer += count; + total += count; + } + } + + return ((ssize_t)bytes); +} + + +/* + * 'cups_setup()' - Setup select() + */ + +static void +cups_setup(fd_set *set, /* I - Set for select() */ + struct timeval *tval, /* I - Timer value */ + double timeout) /* I - Timeout in seconds */ +{ + tval->tv_sec = (int)timeout; + tval->tv_usec = (int)(1000000.0 * (timeout - tval->tv_sec)); + + FD_ZERO(set); + FD_SET(3, set); +} + + +/* + * End of "$Id: backchannel.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/backend.c b/cups/backend.c new file mode 100644 index 0000000..49c396e --- /dev/null +++ b/cups/backend.c @@ -0,0 +1,143 @@ +/* + * "$Id: backend.c 10207 2012-01-30 21:50:42Z mike $" + * + * Backend functions for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsBackendDeviceURI() - Get the device URI for a backend. + * cupsBackendReport() - Write a device line from a backend. + * quote_string() - Write a quoted string to stdout, escaping \ and ". + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "backend.h" + + +/* + * Local functions... + */ + +static void quote_string(const char *s); + + +/* + * 'cupsBackendDeviceURI()' - Get the device URI for a backend. + * + * The "argv" argument is the argv argument passed to main(). This + * function returns the device URI passed in the DEVICE_URI environment + * variable or the device URI passed in argv[0], whichever is found + * first. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - Device URI or @code NULL@ */ +cupsBackendDeviceURI(char **argv) /* I - Command-line arguments */ +{ + const char *device_uri, /* Device URI */ + *auth_info_required; /* AUTH_INFO_REQUIRED env var */ + _cups_globals_t *cg = _cupsGlobals(); /* Global info */ + int options; /* Resolve options */ + + + if ((device_uri = getenv("DEVICE_URI")) == NULL) + { + if (!argv || !argv[0] || !strchr(argv[0], ':')) + return (NULL); + + device_uri = argv[0]; + } + + options = _HTTP_RESOLVE_STDERR; + if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) != NULL && + !strcmp(auth_info_required, "negotiate")) + options |= _HTTP_RESOLVE_FQDN; + + return (_httpResolveURI(device_uri, cg->resolved_uri, + sizeof(cg->resolved_uri), options, NULL, NULL)); +} + + +/* + * 'cupsBackendReport()' - Write a device line from a backend. + * + * This function writes a single device line to stdout for a backend. + * It handles quoting of special characters in the device-make-and-model, + * device-info, device-id, and device-location strings. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +void +cupsBackendReport( + const char *device_scheme, /* I - device-scheme string */ + const char *device_uri, /* I - device-uri string */ + const char *device_make_and_model, /* I - device-make-and-model string or @code NULL@ */ + const char *device_info, /* I - device-info string or @code NULL@ */ + const char *device_id, /* I - device-id string or @code NULL@ */ + const char *device_location) /* I - device-location string or @code NULL@ */ +{ + if (!device_scheme || !device_uri) + return; + + printf("%s %s", device_scheme, device_uri); + if (device_make_and_model && *device_make_and_model) + quote_string(device_make_and_model); + else + quote_string("unknown"); + quote_string(device_info); + quote_string(device_id); + quote_string(device_location); + putchar('\n'); + fflush(stdout); +} + + +/* + * 'quote_string()' - Write a quoted string to stdout, escaping \ and ". + */ + +static void +quote_string(const char *s) /* I - String to write */ +{ + fputs(" \"", stdout); + + if (s) + { + while (*s) + { + if (*s == '\\' || *s == '\"') + putchar('\\'); + + if (*s == '\n') + putchar(' '); + else + putchar(*s); + + s ++; + } + } + + putchar('\"'); +} + + +/* + * End of "$Id: backend.c 10207 2012-01-30 21:50:42Z mike $". + */ diff --git a/cups/backend.h b/cups/backend.h new file mode 100644 index 0000000..09fca22 --- /dev/null +++ b/cups/backend.h @@ -0,0 +1,78 @@ +/* + * "$Id: backend.h 9771 2011-05-12 05:21:56Z mike $" + * + * Backend definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_BACKEND_H_ +# define _CUPS_BACKEND_H_ + + +/* + * Include necessary headers... + */ + +# include "versioning.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Constants... + */ + +enum cups_backend_e /**** Backend exit codes ****/ +{ + CUPS_BACKEND_OK = 0, /* Job completed successfully */ + CUPS_BACKEND_FAILED = 1, /* Job failed, use error-policy */ + CUPS_BACKEND_AUTH_REQUIRED = 2, /* Job failed, authentication required */ + CUPS_BACKEND_HOLD = 3, /* Job failed, hold job */ + CUPS_BACKEND_STOP = 4, /* Job failed, stop queue */ + CUPS_BACKEND_CANCEL = 5, /* Job failed, cancel job */ + CUPS_BACKEND_RETRY = 6, /* Job failed, retry this job later */ + CUPS_BACKEND_RETRY_CURRENT = 7 /* Job failed, retry this job immediately */ +}; +typedef enum cups_backend_e cups_backend_t; + /**** Backend exit codes ****/ + + +/* + * Prototypes... + */ + +extern const char *cupsBackendDeviceURI(char **argv) _CUPS_API_1_2; +extern void cupsBackendReport(const char *device_scheme, + const char *device_uri, + const char *device_make_and_model, + const char *device_info, + const char *device_id, + const char *device_location) + _CUPS_API_1_4; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_BACKEND_H_ */ + +/* + * End of "$Id: backend.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cups/conflicts.c b/cups/conflicts.c new file mode 100644 index 0000000..bc6bdc0 --- /dev/null +++ b/cups/conflicts.c @@ -0,0 +1,1214 @@ +/* + * "$Id: conflicts.c 9829 2011-06-14 21:01:39Z mike $" + * + * Option marking routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsGetConflicts() - Get a list of conflicting options in a marked + * PPD. + * cupsResolveConflicts() - Resolve conflicts in a marked PPD. + * ppdConflicts() - Check to see if there are any conflicts among + * the marked option choices. + * ppdInstallableConflict() - Test whether an option choice conflicts with an + * installable option. + * ppd_is_installable() - Determine whether an option is in the + * InstallableOptions group. + * ppd_load_constraints() - Load constraints from a PPD file. + * ppd_test_constraints() - See if any constraints are active. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "ppd-private.h" + + +/* + * Local constants... + */ + +enum +{ + _PPD_NORMAL_CONSTRAINTS, + _PPD_OPTION_CONSTRAINTS, + _PPD_INSTALLABLE_CONSTRAINTS, + _PPD_ALL_CONSTRAINTS +}; + + +/* + * Local functions... + */ + +static int ppd_is_installable(ppd_group_t *installable, + const char *option); +static void ppd_load_constraints(ppd_file_t *ppd); +static cups_array_t *ppd_test_constraints(ppd_file_t *ppd, + const char *option, + const char *choice, + int num_options, + cups_option_t *options, + int which); + + +/* + * 'cupsGetConflicts()' - Get a list of conflicting options in a marked PPD. + * + * This function gets a list of options that would conflict if "option" and + * "choice" were marked in the PPD. You would typically call this function + * after marking the currently selected options in the PPD in order to + * determine whether a new option selection would cause a conflict. + * + * The number of conflicting options are returned with "options" pointing to + * the conflicting options. The returned option array must be freed using + * @link cupsFreeOptions@. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +int /* O - Number of conflicting options */ +cupsGetConflicts( + ppd_file_t *ppd, /* I - PPD file */ + const char *option, /* I - Option to test */ + const char *choice, /* I - Choice to test */ + cups_option_t **options) /* O - Conflicting options */ +{ + int i, /* Looping var */ + num_options; /* Number of conflicting options */ + cups_array_t *active; /* Active conflicts */ + _ppd_cups_uiconsts_t *c; /* Current constraints */ + _ppd_cups_uiconst_t *cptr; /* Current constraint */ + ppd_choice_t *marked; /* Marked choice */ + + + /* + * Range check input... + */ + + if (options) + *options = NULL; + + if (!ppd || !option || !choice || !options) + return (0); + + /* + * Test for conflicts... + */ + + active = ppd_test_constraints(ppd, option, choice, 0, NULL, + _PPD_ALL_CONSTRAINTS); + + /* + * Loop through all of the UI constraints and add any options that conflict... + */ + + for (num_options = 0, c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active); + c; + c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) + { + for (i = c->num_constraints, cptr = c->constraints; + i > 0; + i --, cptr ++) + if (_cups_strcasecmp(cptr->option->keyword, option)) + { + if (cptr->choice) + num_options = cupsAddOption(cptr->option->keyword, + cptr->choice->choice, num_options, + options); + else if ((marked = ppdFindMarkedChoice(ppd, + cptr->option->keyword)) != NULL) + num_options = cupsAddOption(cptr->option->keyword, marked->choice, + num_options, options); + } + } + + cupsArrayDelete(active); + + return (num_options); +} + + +/* + * 'cupsResolveConflicts()' - Resolve conflicts in a marked PPD. + * + * This function attempts to resolve any conflicts in a marked PPD, returning + * a list of option changes that are required to resolve them. On input, + * "num_options" and "options" contain any pending option changes that have + * not yet been marked, while "option" and "choice" contain the most recent + * selection which may or may not be in "num_options" or "options". + * + * On successful return, "num_options" and "options" are updated to contain + * "option" and "choice" along with any changes required to resolve conflicts + * specified in the PPD file and 1 is returned. + * + * If option conflicts cannot be resolved, "num_options" and "options" are not + * changed and 0 is returned. + * + * When resolving conflicts, @code cupsResolveConflicts@ does not consider + * changes to the current page size (@code media@, @code PageSize@, and + * @code PageRegion@) or to the most recent option specified in "option". + * Thus, if the only way to resolve a conflict is to change the page size + * or the option the user most recently changed, @code cupsResolveConflicts@ + * will return 0 to indicate it was unable to resolve the conflicts. + * + * The @code cupsResolveConflicts@ function uses one of two sources of option + * constraint information. The preferred constraint information is defined by + * @code cupsUIConstraints@ and @code cupsUIResolver@ attributes - in this + * case, the PPD file provides constraint resolution actions. + * + * The backup constraint information is defined by the + * @code UIConstraints@ and @code NonUIConstraints@ attributes. These + * constraints are resolved algorithmically by first selecting the default + * choice for the conflicting option, then iterating over all possible choices + * until a non-conflicting option choice is found. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +int /* O - 1 on success, 0 on failure */ +cupsResolveConflicts( + ppd_file_t *ppd, /* I - PPD file */ + const char *option, /* I - Newly selected option or @code NULL@ for none */ + const char *choice, /* I - Newly selected choice or @code NULL@ for none */ + int *num_options, /* IO - Number of additional selected options */ + cups_option_t **options) /* IO - Additional selected options */ +{ + int i, /* Looping var */ + tries, /* Number of tries */ + num_newopts; /* Number of new options */ + cups_option_t *newopts; /* New options */ + cups_array_t *active, /* Active constraints */ + *pass, /* Resolvers for this pass */ + *resolvers, /* Resolvers we have used */ + *test; /* Test array for conflicts */ + _ppd_cups_uiconsts_t *consts; /* Current constraints */ + _ppd_cups_uiconst_t *constptr; /* Current constraint */ + ppd_attr_t *resolver; /* Current resolver */ + const char *resval; /* Pointer into resolver value */ + char resoption[PPD_MAX_NAME], + /* Current resolver option */ + reschoice[PPD_MAX_NAME], + /* Current resolver choice */ + *resptr, /* Pointer into option/choice */ + firstpage[255]; /* AP_FIRSTPAGE_Keyword string */ + const char *value; /* Selected option value */ + int changed; /* Did we change anything? */ + ppd_choice_t *marked; /* Marked choice */ + + + /* + * Range check input... + */ + + if (!ppd || !num_options || !options || (option == NULL) != (choice == NULL)) + return (0); + + /* + * Build a shadow option array... + */ + + num_newopts = 0; + newopts = NULL; + + for (i = 0; i < *num_options; i ++) + num_newopts = cupsAddOption((*options)[i].name, (*options)[i].value, + num_newopts, &newopts); + if (option && _cups_strcasecmp(option, "Collate")) + num_newopts = cupsAddOption(option, choice, num_newopts, &newopts); + + /* + * Loop until we have no conflicts... + */ + + cupsArraySave(ppd->sorted_attrs); + + resolvers = NULL; + pass = cupsArrayNew((cups_array_func_t)_cups_strcasecmp, NULL); + tries = 0; + + while (tries < 100 && + (active = ppd_test_constraints(ppd, NULL, NULL, num_newopts, newopts, + _PPD_ALL_CONSTRAINTS)) != NULL) + { + tries ++; + + if (!resolvers) + resolvers = cupsArrayNew((cups_array_func_t)_cups_strcasecmp, NULL); + + for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active), changed = 0; + consts; + consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) + { + if (consts->resolver[0]) + { + /* + * Look up the resolver... + */ + + if (cupsArrayFind(pass, consts->resolver)) + continue; /* Already applied this resolver... */ + + if (cupsArrayFind(resolvers, consts->resolver)) + { + /* + * Resolver loop! + */ + + DEBUG_printf(("1cupsResolveConflicts: Resolver loop with %s!", + consts->resolver)); + goto error; + } + + if ((resolver = ppdFindAttr(ppd, "cupsUIResolver", + consts->resolver)) == NULL) + { + DEBUG_printf(("1cupsResolveConflicts: Resolver %s not found!", + consts->resolver)); + goto error; + } + + if (!resolver->value) + { + DEBUG_printf(("1cupsResolveConflicts: Resolver %s has no value!", + consts->resolver)); + goto error; + } + + /* + * Add the options from the resolver... + */ + + cupsArrayAdd(pass, consts->resolver); + cupsArrayAdd(resolvers, consts->resolver); + + for (resval = resolver->value; *resval && !changed;) + { + while (_cups_isspace(*resval)) + resval ++; + + if (*resval != '*') + break; + + for (resval ++, resptr = resoption; + *resval && !_cups_isspace(*resval); + resval ++) + if (resptr < (resoption + sizeof(resoption) - 1)) + *resptr++ = *resval; + + *resptr = '\0'; + + while (_cups_isspace(*resval)) + resval ++; + + for (resptr = reschoice; + *resval && !_cups_isspace(*resval); + resval ++) + if (resptr < (reschoice + sizeof(reschoice) - 1)) + *resptr++ = *resval; + + *resptr = '\0'; + + if (!resoption[0] || !reschoice[0]) + break; + + /* + * Is this the option we are changing? + */ + + snprintf(firstpage, sizeof(firstpage), "AP_FIRSTPAGE_%s", resoption); + + if (option && + (!_cups_strcasecmp(resoption, option) || + !_cups_strcasecmp(firstpage, option) || + (!_cups_strcasecmp(option, "PageSize") && + !_cups_strcasecmp(resoption, "PageRegion")) || + (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") && + !_cups_strcasecmp(resoption, "PageSize")) || + (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") && + !_cups_strcasecmp(resoption, "PageRegion")) || + (!_cups_strcasecmp(option, "PageRegion") && + !_cups_strcasecmp(resoption, "PageSize")) || + (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion") && + !_cups_strcasecmp(resoption, "PageSize")) || + (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion") && + !_cups_strcasecmp(resoption, "PageRegion")))) + continue; + + /* + * Try this choice... + */ + + if ((test = ppd_test_constraints(ppd, resoption, reschoice, + num_newopts, newopts, + _PPD_ALL_CONSTRAINTS)) == NULL) + { + /* + * That worked... + */ + + changed = 1; + } + else + cupsArrayDelete(test); + + /* + * Add the option/choice from the resolver regardless of whether it + * worked; this makes sure that we can cascade several changes to + * make things resolve... + */ + + num_newopts = cupsAddOption(resoption, reschoice, num_newopts, + &newopts); + } + } + else + { + /* + * Try resolving by choosing the default values for non-installable + * options, then by iterating through the possible choices... + */ + + int j; /* Looping var */ + ppd_choice_t *cptr; /* Current choice */ + ppd_size_t *size; /* Current page size */ + + + for (i = consts->num_constraints, constptr = consts->constraints; + i > 0 && !changed; + i --, constptr ++) + { + /* + * Can't resolve by changing an installable option... + */ + + if (constptr->installable) + continue; + + /* + * Is this the option we are changing? + */ + + if (option && + (!_cups_strcasecmp(constptr->option->keyword, option) || + (!_cups_strcasecmp(option, "PageSize") && + !_cups_strcasecmp(constptr->option->keyword, "PageRegion")) || + (!_cups_strcasecmp(option, "PageRegion") && + !_cups_strcasecmp(constptr->option->keyword, "PageSize")))) + continue; + + /* + * Get the current option choice... + */ + + if ((value = cupsGetOption(constptr->option->keyword, num_newopts, + newopts)) == NULL) + { + if (!_cups_strcasecmp(constptr->option->keyword, "PageSize") || + !_cups_strcasecmp(constptr->option->keyword, "PageRegion")) + { + if ((value = cupsGetOption("PageSize", num_newopts, + newopts)) == NULL) + value = cupsGetOption("PageRegion", num_newopts, newopts); + + if (!value) + { + if ((size = ppdPageSize(ppd, NULL)) != NULL) + value = size->name; + else + value = ""; + } + } + else + { + marked = ppdFindMarkedChoice(ppd, constptr->option->keyword); + value = marked ? marked->choice : ""; + } + } + + if (!_cups_strncasecmp(value, "Custom.", 7)) + value = "Custom"; + + /* + * Try the default choice... + */ + + test = NULL; + + if (_cups_strcasecmp(value, constptr->option->defchoice) && + (test = ppd_test_constraints(ppd, constptr->option->keyword, + constptr->option->defchoice, + num_newopts, newopts, + _PPD_OPTION_CONSTRAINTS)) == NULL) + { + /* + * That worked... + */ + + num_newopts = cupsAddOption(constptr->option->keyword, + constptr->option->defchoice, + num_newopts, &newopts); + changed = 1; + } + else + { + /* + * Try each choice instead... + */ + + for (j = constptr->option->num_choices, + cptr = constptr->option->choices; + j > 0; + j --, cptr ++) + { + cupsArrayDelete(test); + test = NULL; + + if (_cups_strcasecmp(value, cptr->choice) && + _cups_strcasecmp(constptr->option->defchoice, cptr->choice) && + _cups_strcasecmp("Custom", cptr->choice) && + (test = ppd_test_constraints(ppd, constptr->option->keyword, + cptr->choice, num_newopts, + newopts, + _PPD_OPTION_CONSTRAINTS)) == NULL) + { + /* + * This choice works... + */ + + num_newopts = cupsAddOption(constptr->option->keyword, + cptr->choice, num_newopts, + &newopts); + changed = 1; + break; + } + } + + cupsArrayDelete(test); + } + } + } + } + + if (!changed) + { + DEBUG_puts("1cupsResolveConflicts: Unable to automatically resolve " + "constraint!"); + goto error; + } + + cupsArrayClear(pass); + cupsArrayDelete(active); + active = NULL; + } + + if (tries >= 100) + goto error; + + /* + * Free the caller's option array... + */ + + cupsFreeOptions(*num_options, *options); + + /* + * If Collate is the option we are testing, add it here. Otherwise, remove + * any Collate option from the resolve list since the filters automatically + * handle manual collation... + */ + + if (option && !_cups_strcasecmp(option, "Collate")) + num_newopts = cupsAddOption(option, choice, num_newopts, &newopts); + else + num_newopts = cupsRemoveOption("Collate", num_newopts, &newopts); + + /* + * Return the new list of options to the caller... + */ + + *num_options = num_newopts; + *options = newopts; + + cupsArrayDelete(pass); + cupsArrayDelete(resolvers); + + cupsArrayRestore(ppd->sorted_attrs); + + DEBUG_printf(("1cupsResolveConflicts: Returning %d options:", num_newopts)); +#ifdef DEBUG + for (i = 0; i < num_newopts; i ++) + DEBUG_printf(("1cupsResolveConflicts: options[%d]: %s=%s", i, + newopts[i].name, newopts[i].value)); +#endif /* DEBUG */ + + return (1); + + /* + * If we get here, we failed to resolve... + */ + + error: + + cupsFreeOptions(num_newopts, newopts); + + cupsArrayDelete(active); + cupsArrayDelete(pass); + cupsArrayDelete(resolvers); + + cupsArrayRestore(ppd->sorted_attrs); + + DEBUG_puts("1cupsResolveConflicts: Unable to resolve conflicts!"); + + return (0); +} + + +/* + * 'ppdConflicts()' - Check to see if there are any conflicts among the + * marked option choices. + * + * The returned value is the same as returned by @link ppdMarkOption@. + */ + +int /* O - Number of conflicts found */ +ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */ +{ + int i, /* Looping variable */ + conflicts; /* Number of conflicts */ + cups_array_t *active; /* Active conflicts */ + _ppd_cups_uiconsts_t *c; /* Current constraints */ + _ppd_cups_uiconst_t *cptr; /* Current constraint */ + ppd_option_t *o; /* Current option */ + + + if (!ppd) + return (0); + + /* + * Clear all conflicts... + */ + + cupsArraySave(ppd->options); + + for (o = ppdFirstOption(ppd); o; o = ppdNextOption(ppd)) + o->conflicted = 0; + + cupsArrayRestore(ppd->options); + + /* + * Test for conflicts... + */ + + active = ppd_test_constraints(ppd, NULL, NULL, 0, NULL, + _PPD_ALL_CONSTRAINTS); + conflicts = cupsArrayCount(active); + + /* + * Loop through all of the UI constraints and flag any options + * that conflict... + */ + + for (c = (_ppd_cups_uiconsts_t *)cupsArrayFirst(active); + c; + c = (_ppd_cups_uiconsts_t *)cupsArrayNext(active)) + { + for (i = c->num_constraints, cptr = c->constraints; + i > 0; + i --, cptr ++) + cptr->option->conflicted = 1; + } + + cupsArrayDelete(active); + + /* + * Return the number of conflicts found... + */ + + return (conflicts); +} + + +/* + * 'ppdInstallableConflict()' - Test whether an option choice conflicts with + * an installable option. + * + * This function tests whether a particular option choice is available based + * on constraints against options in the "InstallableOptions" group. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +int /* O - 1 if conflicting, 0 if not conflicting */ +ppdInstallableConflict( + ppd_file_t *ppd, /* I - PPD file */ + const char *option, /* I - Option */ + const char *choice) /* I - Choice */ +{ + cups_array_t *active; /* Active conflicts */ + + + DEBUG_printf(("2ppdInstallableConflict(ppd=%p, option=\"%s\", choice=\"%s\")", + ppd, option, choice)); + + /* + * Range check input... + */ + + if (!ppd || !option || !choice) + return (0); + + /* + * Test constraints using the new option... + */ + + active = ppd_test_constraints(ppd, option, choice, 0, NULL, + _PPD_INSTALLABLE_CONSTRAINTS); + + cupsArrayDelete(active); + + return (active != NULL); +} + + +/* + * 'ppd_is_installable()' - Determine whether an option is in the + * InstallableOptions group. + */ + +static int /* O - 1 if installable, 0 if normal */ +ppd_is_installable( + ppd_group_t *installable, /* I - InstallableOptions group */ + const char *name) /* I - Option name */ +{ + if (installable) + { + int i; /* Looping var */ + ppd_option_t *option; /* Current option */ + + + for (i = installable->num_options, option = installable->options; + i > 0; + i --, option ++) + if (!_cups_strcasecmp(option->keyword, name)) + return (1); + } + + return (0); +} + + +/* + * 'ppd_load_constraints()' - Load constraints from a PPD file. + */ + +static void +ppd_load_constraints(ppd_file_t *ppd) /* I - PPD file */ +{ + int i; /* Looping var */ + ppd_const_t *oldconst; /* Current UIConstraints data */ + ppd_attr_t *constattr; /* Current cupsUIConstraints attribute */ + _ppd_cups_uiconsts_t *consts; /* Current cupsUIConstraints data */ + _ppd_cups_uiconst_t *constptr; /* Current constraint */ + ppd_group_t *installable; /* Installable options group */ + const char *vptr; /* Pointer into constraint value */ + char option[PPD_MAX_NAME], /* Option name/MainKeyword */ + choice[PPD_MAX_NAME], /* Choice/OptionKeyword */ + *ptr; /* Pointer into option or choice */ + + + DEBUG_printf(("7ppd_load_constraints(ppd=%p)", ppd)); + + /* + * Create an array to hold the constraint data... + */ + + ppd->cups_uiconstraints = cupsArrayNew(NULL, NULL); + + /* + * Find the installable options group if it exists... + */ + + for (i = ppd->num_groups, installable = ppd->groups; + i > 0; + i --, installable ++) + if (!_cups_strcasecmp(installable->name, "InstallableOptions")) + break; + + if (i <= 0) + installable = NULL; + + /* + * Load old-style [Non]UIConstraints data... + */ + + for (i = ppd->num_consts, oldconst = ppd->consts; i > 0; i --, oldconst ++) + { + /* + * Weed out nearby duplicates, since the PPD spec requires that you + * define both "*Foo foo *Bar bar" and "*Bar bar *Foo foo"... + */ + + if (i > 1 && + !_cups_strcasecmp(oldconst[0].option1, oldconst[1].option2) && + !_cups_strcasecmp(oldconst[0].choice1, oldconst[1].choice2) && + !_cups_strcasecmp(oldconst[0].option2, oldconst[1].option1) && + !_cups_strcasecmp(oldconst[0].choice2, oldconst[1].choice1)) + continue; + + /* + * Allocate memory... + */ + + if ((consts = calloc(1, sizeof(_ppd_cups_uiconsts_t))) == NULL) + { + DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " + "UIConstraints!"); + return; + } + + if ((constptr = calloc(2, sizeof(_ppd_cups_uiconst_t))) == NULL) + { + free(consts); + DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " + "UIConstraints!"); + return; + } + + /* + * Fill in the information... + */ + + consts->num_constraints = 2; + consts->constraints = constptr; + + if (!_cups_strncasecmp(oldconst->option1, "Custom", 6) && + !_cups_strcasecmp(oldconst->choice1, "True")) + { + constptr[0].option = ppdFindOption(ppd, oldconst->option1 + 6); + constptr[0].choice = ppdFindChoice(constptr[0].option, "Custom"); + constptr[0].installable = 0; + } + else + { + constptr[0].option = ppdFindOption(ppd, oldconst->option1); + constptr[0].choice = ppdFindChoice(constptr[0].option, + oldconst->choice1); + constptr[0].installable = ppd_is_installable(installable, + oldconst->option1); + } + + if (!constptr[0].option || (!constptr[0].choice && oldconst->choice1[0])) + { + DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", + oldconst->option1, oldconst->choice1)); + free(consts->constraints); + free(consts); + continue; + } + + if (!_cups_strncasecmp(oldconst->option2, "Custom", 6) && + !_cups_strcasecmp(oldconst->choice2, "True")) + { + constptr[1].option = ppdFindOption(ppd, oldconst->option2 + 6); + constptr[1].choice = ppdFindChoice(constptr[1].option, "Custom"); + constptr[1].installable = 0; + } + else + { + constptr[1].option = ppdFindOption(ppd, oldconst->option2); + constptr[1].choice = ppdFindChoice(constptr[1].option, + oldconst->choice2); + constptr[1].installable = ppd_is_installable(installable, + oldconst->option2); + } + + if (!constptr[1].option || (!constptr[1].choice && oldconst->choice2[0])) + { + DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", + oldconst->option2, oldconst->choice2)); + free(consts->constraints); + free(consts); + continue; + } + + consts->installable = constptr[0].installable || constptr[1].installable; + + /* + * Add it to the constraints array... + */ + + cupsArrayAdd(ppd->cups_uiconstraints, consts); + } + + /* + * Then load new-style constraints... + */ + + for (constattr = ppdFindAttr(ppd, "cupsUIConstraints", NULL); + constattr; + constattr = ppdFindNextAttr(ppd, "cupsUIConstraints", NULL)) + { + if (!constattr->value) + { + DEBUG_puts("8ppd_load_constraints: Bad cupsUIConstraints value!"); + continue; + } + + for (i = 0, vptr = strchr(constattr->value, '*'); + vptr; + i ++, vptr = strchr(vptr + 1, '*')); + + if (i == 0) + { + DEBUG_puts("8ppd_load_constraints: Bad cupsUIConstraints value!"); + continue; + } + + if ((consts = calloc(1, sizeof(_ppd_cups_uiconsts_t))) == NULL) + { + DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " + "cupsUIConstraints!"); + return; + } + + if ((constptr = calloc(i, sizeof(_ppd_cups_uiconst_t))) == NULL) + { + free(consts); + DEBUG_puts("8ppd_load_constraints: Unable to allocate memory for " + "cupsUIConstraints!"); + return; + } + + consts->num_constraints = i; + consts->constraints = constptr; + + strlcpy(consts->resolver, constattr->spec, sizeof(consts->resolver)); + + for (i = 0, vptr = strchr(constattr->value, '*'); + vptr; + i ++, vptr = strchr(vptr, '*'), constptr ++) + { + /* + * Extract "*Option Choice" or just "*Option"... + */ + + for (vptr ++, ptr = option; *vptr && !_cups_isspace(*vptr); vptr ++) + if (ptr < (option + sizeof(option) - 1)) + *ptr++ = *vptr; + + *ptr = '\0'; + + while (_cups_isspace(*vptr)) + vptr ++; + + if (*vptr == '*') + choice[0] = '\0'; + else + { + for (ptr = choice; *vptr && !_cups_isspace(*vptr); vptr ++) + if (ptr < (choice + sizeof(choice) - 1)) + *ptr++ = *vptr; + + *ptr = '\0'; + } + + if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True")) + { + _cups_strcpy(option, option + 6); + strcpy(choice, "Custom"); + } + + constptr->option = ppdFindOption(ppd, option); + constptr->choice = ppdFindChoice(constptr->option, choice); + constptr->installable = ppd_is_installable(installable, option); + consts->installable |= constptr->installable; + + if (!constptr->option || (!constptr->choice && choice[0])) + { + DEBUG_printf(("8ppd_load_constraints: Unknown option *%s %s!", + option, choice)); + break; + } + } + + if (!vptr) + cupsArrayAdd(ppd->cups_uiconstraints, consts); + else + { + free(consts->constraints); + free(consts); + } + } +} + + +/* + * 'ppd_test_constraints()' - See if any constraints are active. + */ + +static cups_array_t * /* O - Array of active constraints */ +ppd_test_constraints( + ppd_file_t *ppd, /* I - PPD file */ + const char *option, /* I - Current option */ + const char *choice, /* I - Current choice */ + int num_options, /* I - Number of additional options */ + cups_option_t *options, /* I - Additional options */ + int which) /* I - Which constraints to test */ +{ + int i; /* Looping var */ + _ppd_cups_uiconsts_t *consts; /* Current constraints */ + _ppd_cups_uiconst_t *constptr; /* Current constraint */ + ppd_choice_t key, /* Search key */ + *marked; /* Marked choice */ + cups_array_t *active = NULL; /* Active constraints */ + const char *value, /* Current value */ + *firstvalue; /* AP_FIRSTPAGE_Keyword value */ + char firstpage[255]; /* AP_FIRSTPAGE_Keyword string */ + + + DEBUG_printf(("7ppd_test_constraints(ppd=%p, option=\"%s\", choice=\"%s\", " + "num_options=%d, options=%p, which=%d)", ppd, option, choice, + num_options, options, which)); + + if (!ppd->cups_uiconstraints) + ppd_load_constraints(ppd); + + DEBUG_printf(("9ppd_test_constraints: %d constraints!", + cupsArrayCount(ppd->cups_uiconstraints))); + + cupsArraySave(ppd->marked); + + for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(ppd->cups_uiconstraints); + consts; + consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(ppd->cups_uiconstraints)) + { + DEBUG_printf(("9ppd_test_constraints: installable=%d, resolver=\"%s\", " + "num_constraints=%d option1=\"%s\", choice1=\"%s\", " + "option2=\"%s\", choice2=\"%s\", ...", + consts->installable, consts->resolver, consts->num_constraints, + consts->constraints[0].option->keyword, + consts->constraints[0].choice ? + consts->constraints[0].choice->choice : "", + consts->constraints[1].option->keyword, + consts->constraints[1].choice ? + consts->constraints[1].choice->choice : "")); + + if (consts->installable && which < _PPD_INSTALLABLE_CONSTRAINTS) + continue; /* Skip installable option constraint */ + + if (!consts->installable && which == _PPD_INSTALLABLE_CONSTRAINTS) + continue; /* Skip non-installable option constraint */ + + if (which == _PPD_OPTION_CONSTRAINTS && option) + { + /* + * Skip constraints that do not involve the current option... + */ + + for (i = consts->num_constraints, constptr = consts->constraints; + i > 0; + i --, constptr ++) + { + if (!_cups_strcasecmp(constptr->option->keyword, option)) + break; + + if (!_cups_strncasecmp(option, "AP_FIRSTPAGE_", 13) && + !_cups_strcasecmp(constptr->option->keyword, option + 13)) + break; + } + + if (!i) + continue; + } + + DEBUG_puts("9ppd_test_constraints: Testing..."); + + for (i = consts->num_constraints, constptr = consts->constraints; + i > 0; + i --, constptr ++) + { + DEBUG_printf(("9ppd_test_constraints: %s=%s?", constptr->option->keyword, + constptr->choice ? constptr->choice->choice : "")); + + if (constptr->choice && + (!_cups_strcasecmp(constptr->option->keyword, "PageSize") || + !_cups_strcasecmp(constptr->option->keyword, "PageRegion"))) + { + /* + * PageSize and PageRegion are used depending on the selected input slot + * and manual feed mode. Validate against the selected page size instead + * of an individual option... + */ + + if (option && choice && + (!_cups_strcasecmp(option, "PageSize") || + !_cups_strcasecmp(option, "PageRegion"))) + { + value = choice; + } + else if ((value = cupsGetOption("PageSize", num_options, + options)) == NULL) + if ((value = cupsGetOption("PageRegion", num_options, + options)) == NULL) + if ((value = cupsGetOption("media", num_options, options)) == NULL) + { + ppd_size_t *size = ppdPageSize(ppd, NULL); + + if (size) + value = size->name; + } + + if (value && !_cups_strncasecmp(value, "Custom.", 7)) + value = "Custom"; + + if (option && choice && + (!_cups_strcasecmp(option, "AP_FIRSTPAGE_PageSize") || + !_cups_strcasecmp(option, "AP_FIRSTPAGE_PageRegion"))) + { + firstvalue = choice; + } + else if ((firstvalue = cupsGetOption("AP_FIRSTPAGE_PageSize", + num_options, options)) == NULL) + firstvalue = cupsGetOption("AP_FIRSTPAGE_PageRegion", num_options, + options); + + if (firstvalue && !_cups_strncasecmp(firstvalue, "Custom.", 7)) + firstvalue = "Custom"; + + if ((!value || _cups_strcasecmp(value, constptr->choice->choice)) && + (!firstvalue || _cups_strcasecmp(firstvalue, constptr->choice->choice))) + { + DEBUG_puts("9ppd_test_constraints: NO"); + break; + } + } + else if (constptr->choice) + { + /* + * Compare against the constrained choice... + */ + + if (option && choice && !_cups_strcasecmp(option, constptr->option->keyword)) + { + if (!_cups_strncasecmp(choice, "Custom.", 7)) + value = "Custom"; + else + value = choice; + } + else if ((value = cupsGetOption(constptr->option->keyword, num_options, + options)) != NULL) + { + if (!_cups_strncasecmp(value, "Custom.", 7)) + value = "Custom"; + } + else if (constptr->choice->marked) + value = constptr->choice->choice; + else + value = NULL; + + /* + * Now check AP_FIRSTPAGE_option... + */ + + snprintf(firstpage, sizeof(firstpage), "AP_FIRSTPAGE_%s", + constptr->option->keyword); + + if (option && choice && !_cups_strcasecmp(option, firstpage)) + { + if (!_cups_strncasecmp(choice, "Custom.", 7)) + firstvalue = "Custom"; + else + firstvalue = choice; + } + else if ((firstvalue = cupsGetOption(firstpage, num_options, + options)) != NULL) + { + if (!_cups_strncasecmp(firstvalue, "Custom.", 7)) + firstvalue = "Custom"; + } + else + firstvalue = NULL; + + DEBUG_printf(("9ppd_test_constraints: value=%s, firstvalue=%s", value, + firstvalue)); + + if ((!value || _cups_strcasecmp(value, constptr->choice->choice)) && + (!firstvalue || _cups_strcasecmp(firstvalue, constptr->choice->choice))) + { + DEBUG_puts("9ppd_test_constraints: NO"); + break; + } + } + else if (option && choice && + !_cups_strcasecmp(option, constptr->option->keyword)) + { + if (!_cups_strcasecmp(choice, "None") || !_cups_strcasecmp(choice, "Off") || + !_cups_strcasecmp(choice, "False")) + { + DEBUG_puts("9ppd_test_constraints: NO"); + break; + } + } + else if ((value = cupsGetOption(constptr->option->keyword, num_options, + options)) != NULL) + { + if (!_cups_strcasecmp(value, "None") || !_cups_strcasecmp(value, "Off") || + !_cups_strcasecmp(value, "False")) + { + DEBUG_puts("9ppd_test_constraints: NO"); + break; + } + } + else + { + key.option = constptr->option; + + if ((marked = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) + == NULL || + (!_cups_strcasecmp(marked->choice, "None") || + !_cups_strcasecmp(marked->choice, "Off") || + !_cups_strcasecmp(marked->choice, "False"))) + { + DEBUG_puts("9ppd_test_constraints: NO"); + break; + } + } + } + + if (i <= 0) + { + if (!active) + active = cupsArrayNew(NULL, NULL); + + cupsArrayAdd(active, consts); + DEBUG_puts("9ppd_test_constraints: Added..."); + } + } + + cupsArrayRestore(ppd->marked); + + DEBUG_printf(("8ppd_test_constraints: Found %d active constraints!", + cupsArrayCount(active))); + + return (active); +} + + +/* + * End of "$Id: conflicts.c 9829 2011-06-14 21:01:39Z mike $". + */ diff --git a/cups/cups-private.h b/cups/cups-private.h new file mode 100644 index 0000000..5696e6b --- /dev/null +++ b/cups/cups-private.h @@ -0,0 +1,213 @@ +/* + * "$Id: cups-private.h 9734 2011-05-02 23:33:49Z mike $" + * + * Private definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_CUPS_PRIVATE_H_ +# define _CUPS_CUPS_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include "string-private.h" +# include "debug-private.h" +# include "ppd-private.h" +# include "http-private.h" +# include "ipp-private.h" +# include "language-private.h" +# include "pwg-private.h" +# include "thread-private.h" +# ifdef __APPLE__ +# include +# include +# endif /* __APPLE__ */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Types... + */ + +typedef struct _cups_globals_s /**** CUPS global state data ****/ +{ + /* Multiple places... */ + const char *cups_datadir, /* CUPS_DATADIR environment var */ + *cups_serverbin,/* CUPS_SERVERBIN environment var */ + *cups_serverroot, + /* CUPS_SERVERROOT environment var */ + *cups_statedir, /* CUPS_STATEDIR environment var */ + *localedir; /* LOCALDIR environment var */ + + /* adminutil.c */ + time_t cupsd_update; /* Last time we got or set cupsd.conf */ + char cupsd_hostname[HTTP_MAX_HOST]; + /* Hostname for connection */ + int cupsd_num_settings; + /* Number of server settings */ + cups_option_t *cupsd_settings;/* Server settings */ + + /* auth.c */ +# ifdef HAVE_GSSAPI + char gss_service_name[32]; + /* Kerberos service name */ +# endif /* HAVE_GSSAPI */ + + /* backend.c */ + char resolved_uri[1024]; + /* Buffer for cupsBackendDeviceURI */ + + /* file.c */ + cups_file_t *stdio_files[3];/* stdin, stdout, stderr */ + + /* http.c */ + char http_date[256]; /* Date+time buffer */ + + /* http-addr.c */ + unsigned ip_addr; /* Packed IPv4 address */ + char *ip_ptrs[2]; /* Pointer to packed address */ + struct hostent hostent; /* Host entry for IP address */ +# ifdef HAVE_GETADDRINFO + char hostname[1024]; /* Hostname */ +# endif /* HAVE_GETADDRINFO */ + int need_res_init; /* Need to reinitialize resolver? */ + + /* ipp.c */ + ipp_uchar_t ipp_date[11]; /* RFC-1903 date/time data */ + _ipp_buffer_t *ipp_buffers; /* Buffer list */ + + /* ipp-support.c */ + int ipp_port; /* IPP port number */ + char ipp_unknown[255]; + /* Unknown error statuses */ + + /* language.c */ + cups_lang_t *lang_default; /* Default language */ +# ifdef __APPLE__ + char language[32]; /* Cached language */ +# endif /* __APPLE__ */ + + /* ppd.c */ + ppd_status_t ppd_status; /* Status of last ppdOpen*() */ + int ppd_line; /* Current line number */ + ppd_conform_t ppd_conform; /* Level of conformance required */ + + /* pwg-media.c */ + cups_array_t *leg_size_lut, /* Lookup table for legacy names */ + *ppd_size_lut, /* Lookup table for PPD names */ + *pwg_size_lut; /* Lookup table for PWG names */ + _pwg_media_t pwg_media; /* PWG media data for custom size */ + char pwg_name[65]; /* PWG media name for custom size */ + + /* request.c */ + http_t *http; /* Current server connection */ + ipp_status_t last_error; /* Last IPP error */ + char *last_status_message; + /* Last IPP status-message */ + + /* snmp.c */ + char snmp_community[255]; + /* Default SNMP community name */ + int snmp_debug; /* Log SNMP IO to stderr? */ + + /* tempfile.c */ + char tempfile[1024]; /* cupsTempFd/File buffer */ + + /* usersys.c */ + http_encryption_t encryption; /* Encryption setting */ + char user[65], /* User name */ + server[256], /* Server address */ + servername[256];/* Server hostname */ + cups_password_cb2_t password_cb; /* Password callback */ + void *password_data; /* Password user data */ + http_tls_credentials_t tls_credentials; + /* Default client credentials */ + cups_client_cert_cb_t client_cert_cb; /* Client certificate callback */ + void *client_cert_data; + /* Client certificate user data */ + cups_server_cert_cb_t server_cert_cb; /* Server certificate callback */ + void *server_cert_data; + /* Server certificate user data */ + int any_root, /* Allow any root */ + expired_certs, /* Allow expired certs */ + expired_root; /* Allow expired root */ + + /* util.c */ + char def_printer[256]; + /* Default printer */ + char ppd_filename[HTTP_MAX_URI]; + /* PPD filename */ +} _cups_globals_t; + + +/* + * Prototypes... + */ + +# ifdef __APPLE__ +extern CFStringRef _cupsAppleCopyDefaultPaperID(void); +extern CFStringRef _cupsAppleCopyDefaultPrinter(void); +extern int _cupsAppleGetUseLastPrinter(void); +extern void _cupsAppleSetDefaultPaperID(CFStringRef name); +extern void _cupsAppleSetDefaultPrinter(CFStringRef name); +extern void _cupsAppleSetUseLastPrinter(int uselast); +# endif /* __APPLE__ */ + +extern http_t *_cupsConnect(void); +extern int _cupsGet1284Values(const char *device_id, + cups_option_t **values); +extern int _cupsGetDests(http_t *http, ipp_op_t op, + const char *name, cups_dest_t **dests); +extern const char *_cupsGetPassword(const char *prompt); +extern void _cupsGlobalLock(void); +extern _cups_globals_t *_cupsGlobals(void); +extern void _cupsGlobalUnlock(void); +# ifdef HAVE_GSSAPI +extern const char *_cupsGSSServiceName(void); +# endif /* HAVE_GSSAPI */ +extern int _cupsNextDelay(int current, int *previous); +extern void _cupsSetDefaults(void); +extern void _cupsSetError(ipp_status_t status, const char *message, + int localize); +extern void _cupsSetHTTPError(http_status_t status); +# ifdef HAVE_GSSAPI +extern int _cupsSetNegotiateAuthString(http_t *http, + const char *method, + const char *resource); +# endif /* HAVE_GSSAPI */ +extern char *_cupsUserDefault(char *name, size_t namesize); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_CUPS_PRIVATE_H_ */ + +/* + * End of "$Id: cups-private.h 9734 2011-05-02 23:33:49Z mike $". + */ diff --git a/cups/cups.h b/cups/cups.h new file mode 100644 index 0000000..d47be7e --- /dev/null +++ b/cups/cups.h @@ -0,0 +1,345 @@ +/* + * "$Id: cups.h 10235 2012-02-06 20:54:37Z mike $" + * + * API definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_CUPS_H_ +# define _CUPS_CUPS_H_ + +/* + * Include necessary headers... + */ + +# include +# if defined(WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) +# define __CUPS_SSIZE_T_DEFINED +# include +/* Windows does not support the ssize_t type, so map it to off_t... */ +typedef off_t ssize_t; /* @private@ */ +# endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */ + +# include "file.h" +# include "ipp.h" +# include "language.h" + + +/* + * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get + * a warning at compile-time. + */ + +# if defined(__GNUC__) && __GNUC__ > 2 +# define _CUPS_DEPRECATED __attribute__ ((__deprecated__)) +# else +# define _CUPS_DEPRECATED +# endif /* __GNUC__ && __GNUC__ > 2 */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define CUPS_VERSION 1.0503 +# define CUPS_VERSION_MAJOR 1 +# define CUPS_VERSION_MINOR 5 +# define CUPS_VERSION_PATCH 3 + +# define CUPS_BC_FD 3 /* Back-channel file descriptor for select/poll */ +# define CUPS_DATE_ANY (time_t)-1 +# define CUPS_EXCLUDE_NONE (const char *)0 +# define CUPS_FORMAT_AUTO "application/octet-stream" +# define CUPS_FORMAT_COMMAND "application/vnd.cups-command" +# define CUPS_FORMAT_PDF "application/pdf" +# define CUPS_FORMAT_POSTSCRIPT "application/postscript" +# define CUPS_FORMAT_RAW "application/vnd.cups-raw" +# define CUPS_FORMAT_TEXT "text/plain" +# define CUPS_HTTP_DEFAULT (http_t *)0 +# define CUPS_INCLUDE_ALL (const char *)0 +# define CUPS_JOBID_ALL -1 +# define CUPS_JOBID_CURRENT 0 +# define CUPS_LENGTH_VARIABLE (ssize_t)0 +# define CUPS_TIMEOUT_DEFAULT 0 +# define CUPS_WHICHJOBS_ALL -1 +# define CUPS_WHICHJOBS_ACTIVE 0 +# define CUPS_WHICHJOBS_COMPLETED 1 + + +/* + * Types and structures... + */ + +typedef unsigned cups_ptype_t; /**** Printer type/capability bits ****/ +enum cups_ptype_e /**** Printer type/capability bit constants ****/ +{ /* Not a typedef'd enum so we can OR */ + CUPS_PRINTER_LOCAL = 0x0000, /* Local printer or class */ + CUPS_PRINTER_CLASS = 0x0001, /* Printer class */ + CUPS_PRINTER_REMOTE = 0x0002, /* Remote printer or class */ + CUPS_PRINTER_BW = 0x0004, /* Can do B&W printing */ + CUPS_PRINTER_COLOR = 0x0008, /* Can do color printing */ + CUPS_PRINTER_DUPLEX = 0x0010, /* Can do duplexing */ + CUPS_PRINTER_STAPLE = 0x0020, /* Can staple output */ + CUPS_PRINTER_COPIES = 0x0040, /* Can do copies */ + CUPS_PRINTER_COLLATE = 0x0080, /* Can collage copies */ + CUPS_PRINTER_PUNCH = 0x0100, /* Can punch output */ + CUPS_PRINTER_COVER = 0x0200, /* Can cover output */ + CUPS_PRINTER_BIND = 0x0400, /* Can bind output */ + CUPS_PRINTER_SORT = 0x0800, /* Can sort output */ + CUPS_PRINTER_SMALL = 0x1000, /* Can do Letter/Legal/A4 */ + CUPS_PRINTER_MEDIUM = 0x2000, /* Can do Tabloid/B/C/A3/A2 */ + CUPS_PRINTER_LARGE = 0x4000, /* Can do D/E/A1/A0 */ + CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */ + CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class */ + CUPS_PRINTER_DEFAULT = 0x20000, /* Default printer on network */ + CUPS_PRINTER_FAX = 0x40000, /* Fax queue */ + CUPS_PRINTER_REJECTING = 0x80000, /* Printer is rejecting jobs */ + CUPS_PRINTER_DELETE = 0x100000, /* Delete printer @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_PRINTER_NOT_SHARED = 0x200000, /* Printer is not shared @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered and added @since CUPS 1.3/Mac OS X 10.5@ */ + CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device @since CUPS 1.4/Mac OS X 10.6@ */ + CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities @since CUPS 1.4/Mac OS X 10.6@ */ + CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT | DEFAULT | FAX | REJECTING | DELETE | NOT_SHARED | AUTHENTICATED | COMMANDS | DISCOVERED) @private@ */ +}; + +typedef const char *(*cups_password_cb_t)(const char *prompt); + /**** Password callback ****/ + +typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http, + const char *method, + const char *resource, + void *user_data); + /**** New password callback @since CUPS 1.4/Mac OS X 10.6@ ****/ + +typedef void (*cups_device_cb_t)(const char *device_class, + const char *device_id, const char *device_info, + const char *device_make_and_model, + const char *device_uri, + const char *device_location, void *user_data); + /**** Device callback @since CUPS 1.4/Mac OS X 10.6@ ****/ + +typedef struct cups_option_s /**** Printer Options ****/ +{ + char *name; /* Name of option */ + char *value; /* Value of option */ +} cups_option_t; + +typedef struct cups_dest_s /**** Destination ****/ +{ + char *name, /* Printer or class name */ + *instance; /* Local instance name or NULL */ + int is_default; /* Is this printer the default? */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ +} cups_dest_t; + +typedef struct cups_job_s /**** Job ****/ +{ + int id; /* The job ID */ + char *dest; /* Printer or class name */ + char *title; /* Title/job name */ + char *user; /* User the submitted the job */ + char *format; /* Document format */ + ipp_jstate_t state; /* Job state */ + int size; /* Size in kilobytes */ + int priority; /* Priority (1-100) */ + time_t completed_time; /* Time the job was completed */ + time_t creation_time; /* Time the job was created */ + time_t processing_time; /* Time the job was processed */ +} cups_job_t; + +typedef int (*cups_client_cert_cb_t)(http_t *http, void *tls, + cups_array_t *distinguished_names, + void *user_data); + /**** Client credentials callback @since CUPS 1.5/Mac OS X 10.7@ ****/ + +typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, + cups_array_t *certs, void *user_data); + /**** Server credentials callback @since CUPS 1.5/Mac OS X 10.7@ ****/ + + +/* + * Functions... + */ + +extern int cupsCancelJob(const char *name, int job_id); +extern ipp_t *cupsDoFileRequest(http_t *http, ipp_t *request, + const char *resource, + const char *filename); +extern ipp_t *cupsDoRequest(http_t *http, ipp_t *request, + const char *resource); +extern http_encryption_t cupsEncryption(void); +extern void cupsFreeJobs(int num_jobs, cups_job_t *jobs); +extern int cupsGetClasses(char ***classes) _CUPS_DEPRECATED; +extern const char *cupsGetDefault(void); +extern int cupsGetJobs(cups_job_t **jobs, const char *name, + int myjobs, int whichjobs); +extern const char *cupsGetPPD(const char *name); +extern int cupsGetPrinters(char ***printers) _CUPS_DEPRECATED; +extern ipp_status_t cupsLastError(void); +extern int cupsPrintFile(const char *name, const char *filename, + const char *title, int num_options, + cups_option_t *options); +extern int cupsPrintFiles(const char *name, int num_files, + const char **files, const char *title, + int num_options, cups_option_t *options); +extern char *cupsTempFile(char *filename, int len) _CUPS_DEPRECATED; +extern int cupsTempFd(char *filename, int len); + +extern int cupsAddDest(const char *name, const char *instance, + int num_dests, cups_dest_t **dests); +extern void cupsFreeDests(int num_dests, cups_dest_t *dests); +extern cups_dest_t *cupsGetDest(const char *name, const char *instance, + int num_dests, cups_dest_t *dests); +extern int cupsGetDests(cups_dest_t **dests); +extern void cupsSetDests(int num_dests, cups_dest_t *dests); + +extern int cupsAddOption(const char *name, const char *value, + int num_options, cups_option_t **options); +extern void cupsEncodeOptions(ipp_t *ipp, int num_options, + cups_option_t *options); +extern void cupsFreeOptions(int num_options, cups_option_t *options); +extern const char *cupsGetOption(const char *name, int num_options, + cups_option_t *options); +extern int cupsParseOptions(const char *arg, int num_options, + cups_option_t **options); + +extern const char *cupsGetPassword(const char *prompt); +extern const char *cupsServer(void); +extern void cupsSetEncryption(http_encryption_t e); +extern void cupsSetPasswordCB(cups_password_cb_t cb); +extern void cupsSetServer(const char *server); +extern void cupsSetUser(const char *user); +extern const char *cupsUser(void); + +/**** New in CUPS 1.1.20 ****/ +extern int cupsDoAuthentication(http_t *http, const char *method, + const char *resource) _CUPS_API_1_1_20; +extern http_status_t cupsGetFile(http_t *http, const char *resource, + const char *filename) _CUPS_API_1_1_20; +extern http_status_t cupsGetFd(http_t *http, const char *resource, int fd); +extern http_status_t cupsPutFile(http_t *http, const char *resource, + const char *filename) _CUPS_API_1_1_20; +extern http_status_t cupsPutFd(http_t *http, const char *resource, int fd) _CUPS_API_1_1_20; + +/**** New in CUPS 1.1.21 ****/ +extern const char *cupsGetDefault2(http_t *http) _CUPS_API_1_1_21; +extern int cupsGetDests2(http_t *http, cups_dest_t **dests) _CUPS_API_1_1_21; +extern int cupsGetJobs2(http_t *http, cups_job_t **jobs, + const char *name, int myjobs, + int whichjobs) _CUPS_API_1_1_21; +extern const char *cupsGetPPD2(http_t *http, const char *name) _CUPS_API_1_1_21; +extern int cupsPrintFile2(http_t *http, const char *name, + const char *filename, + const char *title, int num_options, + cups_option_t *options) _CUPS_API_1_1_21; +extern int cupsPrintFiles2(http_t *http, const char *name, + int num_files, const char **files, + const char *title, int num_options, + cups_option_t *options) _CUPS_API_1_1_21; +extern int cupsSetDests2(http_t *http, int num_dests, + cups_dest_t *dests) _CUPS_API_1_1_21; + +/**** New in CUPS 1.2/Mac OS X 10.5 ****/ +extern ssize_t cupsBackChannelRead(char *buffer, size_t bytes, + double timeout) _CUPS_API_1_2; +extern ssize_t cupsBackChannelWrite(const char *buffer, size_t bytes, + double timeout) _CUPS_API_1_2; +extern void cupsEncodeOptions2(ipp_t *ipp, int num_options, + cups_option_t *options, + ipp_tag_t group_tag) _CUPS_API_1_2; +extern const char *cupsLastErrorString(void) _CUPS_API_1_2; +extern char *cupsNotifySubject(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2; +extern char *cupsNotifyText(cups_lang_t *lang, ipp_t *event) _CUPS_API_1_2; +extern int cupsRemoveOption(const char *name, int num_options, + cups_option_t **options) _CUPS_API_1_2; +extern cups_file_t *cupsTempFile2(char *filename, int len) _CUPS_API_1_2; + +/**** New in CUPS 1.3/Mac OS X 10.5 ****/ +extern ipp_t *cupsDoIORequest(http_t *http, ipp_t *request, + const char *resource, int infile, + int outfile) _CUPS_API_1_3; +extern char *cupsGetServerPPD(http_t *http, const char *name) _CUPS_API_1_3; +extern int cupsRemoveDest(const char *name, + const char *instance, + int num_dests, cups_dest_t **dests) _CUPS_API_1_3; +extern void cupsSetDefaultDest(const char *name, + const char *instance, + int num_dests, + cups_dest_t *dests) _CUPS_API_1_3; + +/**** New in CUPS 1.4/Mac OS X 10.6 ****/ +extern ipp_status_t cupsCancelJob2(http_t *http, const char *name, + int job_id, int purge) _CUPS_API_1_4; +extern int cupsCreateJob(http_t *http, const char *name, + const char *title, int num_options, + cups_option_t *options) _CUPS_API_1_4; +extern ipp_status_t cupsFinishDocument(http_t *http, + const char *name) _CUPS_API_1_4; +extern ipp_status_t cupsGetDevices(http_t *http, int timeout, + const char *include_schemes, + const char *exclude_schemes, + cups_device_cb_t callback, + void *user_data) _CUPS_API_1_4; +extern cups_dest_t *cupsGetNamedDest(http_t *http, const char *name, + const char *instance) _CUPS_API_1_4; +extern const char *cupsGetPassword2(const char *prompt, http_t *http, + const char *method, + const char *resource) _CUPS_API_1_4; +extern http_status_t cupsGetPPD3(http_t *http, const char *name, + time_t *modtime, char *buffer, + size_t bufsize) _CUPS_API_1_4; +extern ipp_t *cupsGetResponse(http_t *http, + const char *resource) _CUPS_API_1_4; +extern ssize_t cupsReadResponseData(http_t *http, char *buffer, + size_t length) _CUPS_API_1_4; +extern http_status_t cupsSendRequest(http_t *http, ipp_t *request, + const char *resource, + size_t length) _CUPS_API_1_4; +extern void cupsSetPasswordCB2(cups_password_cb2_t cb, + void *user_data) _CUPS_API_1_4; +extern http_status_t cupsStartDocument(http_t *http, const char *name, + int job_id, const char *docname, + const char *format, + int last_document) _CUPS_API_1_4; +extern http_status_t cupsWriteRequestData(http_t *http, const char *buffer, + size_t length) _CUPS_API_1_4; + +/**** New in CUPS 1.5 ****/ +extern void cupsSetClientCertCB(cups_client_cert_cb_t cb, + void *user_data) _CUPS_API_1_5; +extern int cupsSetCredentials(cups_array_t *certs) _CUPS_API_1_5; +extern void cupsSetServerCertCB(cups_server_cert_cb_t cb, + void *user_data) _CUPS_API_1_5; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_CUPS_H_ */ + +/* + * End of "$Id: cups.h 10235 2012-02-06 20:54:37Z mike $". + */ diff --git a/cups/custom.c b/cups/custom.c new file mode 100644 index 0000000..ff0960d --- /dev/null +++ b/cups/custom.c @@ -0,0 +1,122 @@ +/* + * "$Id: custom.c 9793 2011-05-20 03:49:49Z mike $" + * + * PPD custom option routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ppdFindCustomOption() - Find a custom option. + * ppdFindCustomParam() - Find a parameter for a custom option. + * ppdFirstCustomParam() - Return the first parameter for a custom option. + * ppdNextCustomParam() - Return the next parameter for a custom option. + */ + +/* + * Include necessary headers. + */ + +#include "cups-private.h" + + +/* + * 'ppdFindCustomOption()' - Find a custom option. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_coption_t * /* O - Custom option or NULL */ +ppdFindCustomOption(ppd_file_t *ppd, /* I - PPD file */ + const char *keyword)/* I - Custom option name */ +{ + ppd_coption_t key; /* Custom option search key */ + + + if (!ppd) + return (NULL); + + strlcpy(key.keyword, keyword, sizeof(key.keyword)); + return ((ppd_coption_t *)cupsArrayFind(ppd->coptions, &key)); +} + + +/* + * 'ppdFindCustomParam()' - Find a parameter for a custom option. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_cparam_t * /* O - Custom parameter or NULL */ +ppdFindCustomParam(ppd_coption_t *opt, /* I - Custom option */ + const char *name) /* I - Parameter name */ +{ + ppd_cparam_t *param; /* Current custom parameter */ + + + if (!opt) + return (NULL); + + for (param = (ppd_cparam_t *)cupsArrayFirst(opt->params); + param; + param = (ppd_cparam_t *)cupsArrayNext(opt->params)) + if (!_cups_strcasecmp(param->name, name)) + break; + + return (param); +} + + +/* + * 'ppdFirstCustomParam()' - Return the first parameter for a custom option. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_cparam_t * /* O - Custom parameter or NULL */ +ppdFirstCustomParam(ppd_coption_t *opt) /* I - Custom option */ +{ + if (!opt) + return (NULL); + + return ((ppd_cparam_t *)cupsArrayFirst(opt->params)); +} + + +/* + * 'ppdNextCustomParam()' - Return the next parameter for a custom option. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_cparam_t * /* O - Custom parameter or NULL */ +ppdNextCustomParam(ppd_coption_t *opt) /* I - Custom option */ +{ + if (!opt) + return (NULL); + + return ((ppd_cparam_t *)cupsArrayNext(opt->params)); +} + + +/* + * End of "$Id: custom.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/debug-private.h b/cups/debug-private.h new file mode 100644 index 0000000..38328a5 --- /dev/null +++ b/cups/debug-private.h @@ -0,0 +1,117 @@ +/* + * "$Id: debug-private.h 10234 2012-02-06 19:35:59Z mike $" + * + * Private debugging macros for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_DEBUG_PRIVATE_H_ +# define _CUPS_DEBUG_PRIVATE_H_ + + +/* + * Include necessary headers... + */ + +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * The debug macros are used if you compile with DEBUG defined. + * + * Usage: + * + * DEBUG_puts("string") + * DEBUG_printf(("format string", arg, arg, ...)); + * + * Note the extra parenthesis around the DEBUG_printf macro... + * + * Newlines are not required on the end of messages, as both add one when + * writing the output. + * + * If the first character is a digit, then it represents the "log level" of the + * message from 0 to 9. The default level is 1. The following defines the + * current levels we use: + * + * 0 = public APIs, other than value accessor functions + * 1 = return values for public APIs + * 2 = public value accessor APIs, progress for public APIs + * 3 = return values for value accessor APIs + * 4 = private APIs, progress for value accessor APIs + * 5 = return values for private APIs + * 6 = progress for private APIs + * 7 = static functions + * 8 = return values for static functions + * 9 = progress for static functions + * + * The DEBUG_set macro allows an application to programmatically enable (or + * disable) debug logging. The arguments correspond to the CUPS_DEBUG_LOG, + * CUPS_DEBUG_LEVEL, and CUPS_DEBUG_FILTER environment variables. + */ + +# ifdef DEBUG +# ifdef WIN32 +# ifdef LIBCUPS2_EXPORTS +# define DLLExport __declspec(dllexport) +# else +# define DLLExport +# endif /* LIBCUPS2_EXPORTS */ +# else +# define DLLExport +# endif /* WIN32 */ +# define DEBUG_puts(x) _cups_debug_puts(x) +# define DEBUG_printf(x) _cups_debug_printf x +# define DEBUG_set(logfile,level,filter) _cups_debug_set(logfile,level,filter,1) +# else +# define DLLExport +# define DEBUG_puts(x) +# define DEBUG_printf(x) +# define DEBUG_set(logfile,level,filter) +# endif /* DEBUG */ + + +/* + * Prototypes... + */ + +extern int _cups_debug_fd; +extern int _cups_debug_level; +extern void DLLExport _cups_debug_printf(const char *format, ...) + __attribute__ ((__format__ (__printf__, 1, 2))); +extern void DLLExport _cups_debug_puts(const char *s); +extern void DLLExport _cups_debug_set(const char *logfile, + const char *level, const char *filter, + int force); +# ifdef WIN32 +extern int _cups_gettimeofday(struct timeval *tv, void *tz); +# define gettimeofday(a,b) _cups_gettimeofday(a, b) +# endif /* WIN32 */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_DEBUG_PRIVATE_H_ */ + +/* + * End of "$Id: debug-private.h 10234 2012-02-06 19:35:59Z mike $". + */ diff --git a/cups/debug.c b/cups/debug.c new file mode 100644 index 0000000..4f09024 --- /dev/null +++ b/cups/debug.c @@ -0,0 +1,658 @@ +/* + * "$Id: debug.c 10234 2012-02-06 19:35:59Z mike $" + * + * Debugging functions for CUPS. + * + * Copyright 2008-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * debug_vsnprintf() - Format a string into a fixed size buffer. + * _cups_debug_printf() - Write a formatted line to the log. + * _cups_debug_puts() - Write a single line to the log. + * _cups_debug_set() - Enable or disable debug logging. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "thread-private.h" +#ifdef WIN32 +# include +# include +# include +# define getpid (int)GetCurrentProcessId +int /* O - 0 on success, -1 on failure */ +_cups_gettimeofday(struct timeval *tv, /* I - Timeval struct */ + void *tz) /* I - Timezone */ +{ + struct _timeb timebuffer; /* Time buffer struct */ + _ftime(&timebuffer); + tv->tv_sec = (long)timebuffer.time; + tv->tv_usec = timebuffer.millitm * 1000; + return 0; +} +#else +# include +# include +#endif /* WIN32 */ +#include +#include + + +/* + * Globals... + */ + +int _cups_debug_fd = -1; + /* Debug log file descriptor */ +int _cups_debug_level = 1; + /* Log level (0 to 9) */ + + +#ifdef DEBUG +/* + * Local globals... + */ + +static regex_t *debug_filter = NULL; + /* Filter expression for messages */ +static int debug_init = 0; /* Did we initialize debugging? */ +static _cups_mutex_t debug_mutex = _CUPS_MUTEX_INITIALIZER; + /* Mutex to control initialization */ + + +/* + * 'debug_vsnprintf()' - Format a string into a fixed size buffer. + */ + +static int /* O - Number of bytes formatted */ +debug_vsnprintf(char *buffer, /* O - Output buffer */ + size_t bufsize, /* O - Size of output buffer */ + const char *format, /* I - printf-style format string */ + va_list ap) /* I - Pointer to additional arguments */ +{ + char *bufptr, /* Pointer to position in buffer */ + *bufend, /* Pointer to end of buffer */ + size, /* Size character (h, l, L) */ + type; /* Format type character */ + int width, /* Width of field */ + prec; /* Number of characters of precision */ + char tformat[100], /* Temporary format string for sprintf() */ + *tptr, /* Pointer into temporary format */ + temp[1024]; /* Buffer for formatted numbers */ + char *s; /* Pointer to string */ + int bytes; /* Total number of bytes needed */ + + + if (!buffer || bufsize < 2 || !format) + return (-1); + + /* + * Loop through the format string, formatting as needed... + */ + + bufptr = buffer; + bufend = buffer + bufsize - 1; + bytes = 0; + + while (*format) + { + if (*format == '%') + { + tptr = tformat; + *tptr++ = *format++; + + if (*format == '%') + { + if (bufptr < bufend) + *bufptr++ = *format; + bytes ++; + format ++; + continue; + } + else if (strchr(" -+#\'", *format)) + *tptr++ = *format++; + + if (*format == '*') + { + /* + * Get width from argument... + */ + + format ++; + width = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); + tptr += strlen(tptr); + } + else + { + width = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + width = width * 10 + *format++ - '0'; + } + } + + if (*format == '.') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + format ++; + + if (*format == '*') + { + /* + * Get precision from argument... + */ + + format ++; + prec = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); + tptr += strlen(tptr); + } + else + { + prec = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + prec = prec * 10 + *format++ - '0'; + } + } + } + + if (*format == 'l' && format[1] == 'l') + { + size = 'L'; + + if (tptr < (tformat + sizeof(tformat) - 2)) + { + *tptr++ = 'l'; + *tptr++ = 'l'; + } + + format += 2; + } + else if (*format == 'h' || *format == 'l' || *format == 'L') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + size = *format++; + } + else + size = 0; + + if (!*format) + break; + + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + type = *format++; + *tptr = '\0'; + + switch (type) + { + case 'E' : /* Floating point formats */ + case 'G' : + case 'e' : + case 'f' : + case 'g' : + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, double)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'B' : /* Integer formats */ + case 'X' : + case 'b' : + case 'd' : + case 'i' : + case 'o' : + case 'u' : + case 'x' : + if ((width + 2) > sizeof(temp)) + break; + +# ifdef HAVE_LONG_LONG + if (size == 'L') + sprintf(temp, tformat, va_arg(ap, long long)); + else +# endif /* HAVE_LONG_LONG */ + if (size == 'l') + sprintf(temp, tformat, va_arg(ap, long)); + else + sprintf(temp, tformat, va_arg(ap, int)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'p' : /* Pointer value */ + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, void *)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'c' : /* Character or character array */ + bytes += width; + + if (bufptr) + { + if (width <= 1) + *bufptr++ = va_arg(ap, int); + else + { + if ((bufptr + width) > bufend) + width = (int)(bufend - bufptr); + + memcpy(bufptr, va_arg(ap, char *), (size_t)width); + bufptr += width; + } + } + break; + + case 's' : /* String */ + if ((s = va_arg(ap, char *)) == NULL) + s = "(null)"; + + /* + * Copy the C string, replacing control chars and \ with + * C character escapes... + */ + + for (bufend --; *s && bufptr < bufend; s ++) + { + if (*s == '\n') + { + *bufptr++ = '\\'; + *bufptr++ = 'n'; + bytes += 2; + } + else if (*s == '\r') + { + *bufptr++ = '\\'; + *bufptr++ = 'r'; + bytes += 2; + } + else if (*s == '\t') + { + *bufptr++ = '\\'; + *bufptr++ = 't'; + bytes += 2; + } + else if (*s == '\\') + { + *bufptr++ = '\\'; + *bufptr++ = '\\'; + bytes += 2; + } + else if (*s == '\'') + { + *bufptr++ = '\\'; + *bufptr++ = '\''; + bytes += 2; + } + else if (*s == '\"') + { + *bufptr++ = '\\'; + *bufptr++ = '\"'; + bytes += 2; + } + else if ((*s & 255) < ' ') + { + if ((bufptr + 2) >= bufend) + break; + + *bufptr++ = '\\'; + *bufptr++ = '0'; + *bufptr++ = '0' + *s / 8; + *bufptr++ = '0' + (*s & 7); + bytes += 4; + } + else + { + *bufptr++ = *s; + bytes ++; + } + } + + bufend ++; + break; + + case 'n' : /* Output number of chars so far */ + *(va_arg(ap, int *)) = bytes; + break; + } + } + else + { + bytes ++; + + if (bufptr < bufend) + *bufptr++ = *format; + + format ++; + } + } + + /* + * Nul-terminate the string and return the number of characters needed. + */ + + *bufptr = '\0'; + + return (bytes); +} + + +/* + * '_cups_debug_printf()' - Write a formatted line to the log. + */ + +void DLLExport +_cups_debug_printf(const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to arguments */ + struct timeval curtime; /* Current time */ + char buffer[2048]; /* Output buffer */ + size_t bytes; /* Number of bytes in buffer */ + int level; /* Log level in message */ + + + /* + * See if we need to do any logging... + */ + + if (!debug_init) + _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"), + getenv("CUPS_DEBUG_FILTER"), 0); + + if (_cups_debug_fd < 0) + return; + + /* + * Filter as needed... + */ + + if (isdigit(format[0])) + level = *format++ - '0'; + else + level = 0; + + if (level > _cups_debug_level) + return; + + if (debug_filter) + { + int result; /* Filter result */ + + _cupsMutexLock(&debug_mutex); + result = regexec(debug_filter, format, 0, NULL, 0); + _cupsMutexUnlock(&debug_mutex); + + if (result) + return; + } + + /* + * Format the message... + */ + + gettimeofday(&curtime, NULL); + snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d ", + (int)((curtime.tv_sec / 3600) % 24), + (int)((curtime.tv_sec / 60) % 60), + (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000)); + + va_start(ap, format); + bytes = debug_vsnprintf(buffer + 13, sizeof(buffer) - 14, format, ap) + 13; + va_end(ap); + + if (bytes >= (sizeof(buffer) - 1)) + { + buffer[sizeof(buffer) - 2] = '\n'; + bytes = sizeof(buffer) - 1; + } + else if (buffer[bytes - 1] != '\n') + { + buffer[bytes++] = '\n'; + buffer[bytes] = '\0'; + } + + /* + * Write it out... + */ + + write(_cups_debug_fd, buffer, bytes); +} + + +/* + * '_cups_debug_puts()' - Write a single line to the log. + */ + +void DLLExport +_cups_debug_puts(const char *s) /* I - String to output */ +{ + struct timeval curtime; /* Current time */ + char buffer[2048]; /* Output buffer */ + size_t bytes; /* Number of bytes in buffer */ + int level; /* Log level in message */ + + + /* + * See if we need to do any logging... + */ + + if (!debug_init) + _cups_debug_set(getenv("CUPS_DEBUG_LOG"), getenv("CUPS_DEBUG_LEVEL"), + getenv("CUPS_DEBUG_FILTER"), 0); + + if (_cups_debug_fd < 0) + return; + + /* + * Filter as needed... + */ + + if (isdigit(s[0])) + level = *s++ - '0'; + else + level = 0; + + if (level > _cups_debug_level) + return; + + if (debug_filter) + { + int result; /* Filter result */ + + _cupsMutexLock(&debug_mutex); + result = regexec(debug_filter, s, 0, NULL, 0); + _cupsMutexUnlock(&debug_mutex); + + if (result) + return; + } + + /* + * Format the message... + */ + + gettimeofday(&curtime, NULL); + bytes = snprintf(buffer, sizeof(buffer), "%02d:%02d:%02d.%03d %s", + (int)((curtime.tv_sec / 3600) % 24), + (int)((curtime.tv_sec / 60) % 60), + (int)(curtime.tv_sec % 60), (int)(curtime.tv_usec / 1000), + s); + + if (bytes >= (sizeof(buffer) - 1)) + { + buffer[sizeof(buffer) - 2] = '\n'; + bytes = sizeof(buffer) - 1; + } + else if (buffer[bytes - 1] != '\n') + { + buffer[bytes++] = '\n'; + buffer[bytes] = '\0'; + } + + /* + * Write it out... + */ + + write(_cups_debug_fd, buffer, bytes); +} + + +/* + * '_cups_debug_set()' - Enable or disable debug logging. + */ + +void DLLExport +_cups_debug_set(const char *logfile, /* I - Log file or NULL */ + const char *level, /* I - Log level or NULL */ + const char *filter, /* I - Filter string or NULL */ + int force) /* I - Force initialization */ +{ + _cupsMutexLock(&debug_mutex); + + if (!debug_init || force) + { + /* + * Restore debug settings to defaults... + */ + + if (_cups_debug_fd != -1) + { + close(_cups_debug_fd); + _cups_debug_fd = -1; + } + + if (debug_filter) + { + regfree((regex_t *)debug_filter); + debug_filter = NULL; + } + + _cups_debug_level = 1; + + /* + * Open logs, set log levels, etc. + */ + + if (!logfile) + _cups_debug_fd = -1; + else if (!strcmp(logfile, "-")) + _cups_debug_fd = 2; + else + { + char buffer[1024]; /* Filename buffer */ + + snprintf(buffer, sizeof(buffer), logfile, getpid()); + + if (buffer[0] == '+') + _cups_debug_fd = open(buffer + 1, O_WRONLY | O_APPEND | O_CREAT, 0644); + else + _cups_debug_fd = open(buffer, O_WRONLY | O_TRUNC | O_CREAT, 0644); + } + + if (level) + _cups_debug_level = atoi(level); + + if (filter) + { + if ((debug_filter = (regex_t *)calloc(1, sizeof(regex_t))) == NULL) + fputs("Unable to allocate memory for CUPS_DEBUG_FILTER - results not " + "filtered!\n", stderr); + else if (regcomp(debug_filter, filter, REG_EXTENDED)) + { + fputs("Bad regular expression in CUPS_DEBUG_FILTER - results not " + "filtered!\n", stderr); + free(debug_filter); + debug_filter = NULL; + } + } + + debug_init = 1; + } + + _cupsMutexUnlock(&debug_mutex); +} +#endif /* DEBUG */ + + +/* + * End of "$Id: debug.c 10234 2012-02-06 19:35:59Z mike $". + */ diff --git a/cups/dest.c b/cups/dest.c new file mode 100644 index 0000000..b068f21 --- /dev/null +++ b/cups/dest.c @@ -0,0 +1,2169 @@ +/* + * "$Id: dest.c 10379 2012-03-23 22:16:22Z mike $" + * + * User-defined destination (and option) support for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsAddDest() - Add a destination to the list of + * destinations. + * _cupsAppleCopyDefaultPaperID() - Get the default paper ID. + * _cupsAppleCopyDefaultPrinter() - Get the default printer at this location. + * _cupsAppleGetUseLastPrinter() - Get whether to use the last used printer. + * _cupsAppleSetDefaultPaperID() - Set the default paper id. + * _cupsAppleSetDefaultPrinter() - Set the default printer for this location. + * _cupsAppleSetUseLastPrinter() - Set whether to use the last used printer. + * cupsFreeDests() - Free the memory used by the list of + * destinations. + * cupsGetDest() - Get the named destination from the list. + * _cupsGetDests() - Get destinations from a server. + * cupsGetDests() - Get the list of destinations from the + * default server. + * cupsGetDests2() - Get the list of destinations from the + * specified server. + * cupsGetNamedDest() - Get options for the named destination. + * cupsRemoveDest() - Remove a destination from the destination + * list. + * cupsSetDefaultDest() - Set the default destination. + * cupsSetDests() - Save the list of destinations for the + * default server. + * cupsSetDests2() - Save the list of destinations for the + * specified server. + * _cupsUserDefault() - Get the user default printer from + * environment variables and location + * information. + * appleCopyLocations() - Copy the location history array. + * appleCopyNetwork() - Get the network ID for the current + * location. + * appleGetPaperSize() - Get the default paper size. + * appleGetPrinter() - Get a printer from the history array. + * cups_add_dest() - Add a destination to the array. + * cups_compare_dests() - Compare two destinations. + * cups_find_dest() - Find a destination using a binary search. + * cups_get_default() - Get the default destination from an + * lpoptions file. + * cups_get_dests() - Get destinations from a file. + * cups_make_string() - Make a comma-separated string of values + * from an IPP attribute. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include + +#ifdef HAVE_NOTIFY_H +# include +#endif /* HAVE_NOTIFY_H */ + +#ifdef __APPLE__ +# include +# define kCUPSPrintingPrefs CFSTR("org.cups.PrintingPrefs") +# define kDefaultPaperIDKey CFSTR("DefaultPaperID") +# define kLastUsedPrintersKey CFSTR("LastUsedPrinters") +# define kLocationNetworkKey CFSTR("Network") +# define kLocationPrinterIDKey CFSTR("PrinterID") +# define kUseLastPrinter CFSTR("UseLastPrinter") +#endif /* __APPLE__ */ + + +/* + * Local functions... + */ + +#ifdef __APPLE__ +static CFArrayRef appleCopyLocations(void); +static CFStringRef appleCopyNetwork(void); +static char *appleGetPaperSize(char *name, int namesize); +static CFStringRef appleGetPrinter(CFArrayRef locations, CFStringRef network, + CFIndex *locindex); +#endif /* __APPLE__ */ +static cups_dest_t *cups_add_dest(const char *name, const char *instance, + int *num_dests, cups_dest_t **dests); +static int cups_compare_dests(cups_dest_t *a, cups_dest_t *b); +static int cups_find_dest(const char *name, const char *instance, + int num_dests, cups_dest_t *dests, int prev, + int *rdiff); +static char *cups_get_default(const char *filename, char *namebuf, + size_t namesize, const char **instance); +static int cups_get_dests(const char *filename, const char *match_name, + const char *match_inst, int user_default_set, + int num_dests, cups_dest_t **dests); +static char *cups_make_string(ipp_attribute_t *attr, char *buffer, + size_t bufsize); + + +/* + * 'cupsAddDest()' - Add a destination to the list of destinations. + * + * This function cannot be used to add a new class or printer queue, + * it only adds a new container of saved options for the named + * destination or instance. + * + * If the named destination already exists, the destination list is + * returned unchanged. Adding a new instance of a destination creates + * a copy of that destination's options. + * + * Use the @link cupsSaveDests@ function to save the updated list of + * destinations to the user's lpoptions file. + */ + +int /* O - New number of destinations */ +cupsAddDest(const char *name, /* I - Destination name */ + const char *instance, /* I - Instance name or @code NULL@ for none/primary */ + int num_dests, /* I - Number of destinations */ + cups_dest_t **dests) /* IO - Destinations */ +{ + int i; /* Looping var */ + cups_dest_t *dest; /* Destination pointer */ + cups_dest_t *parent = NULL; /* Parent destination */ + cups_option_t *doption, /* Current destination option */ + *poption; /* Current parent option */ + + + if (!name || !dests) + return (0); + + if (!cupsGetDest(name, instance, num_dests, *dests)) + { + if (instance && !cupsGetDest(name, NULL, num_dests, *dests)) + return (num_dests); + + dest = cups_add_dest(name, instance, &num_dests, dests); + + /* + * Find the base dest again now the array has been realloc'd. + */ + + parent = cupsGetDest(name, NULL, num_dests, *dests); + + if (instance && parent && parent->num_options > 0) + { + /* + * Copy options from parent... + */ + + dest->options = calloc(sizeof(cups_option_t), parent->num_options); + + if (dest->options) + { + dest->num_options = parent->num_options; + + for (i = dest->num_options, doption = dest->options, + poption = parent->options; + i > 0; + i --, doption ++, poption ++) + { + doption->name = _cupsStrRetain(poption->name); + doption->value = _cupsStrRetain(poption->value); + } + } + } + } + + return (num_dests); +} + + +#ifdef __APPLE__ +/* + * '_cupsAppleCopyDefaultPaperID()' - Get the default paper ID. + */ + +CFStringRef /* O - Default paper ID */ +_cupsAppleCopyDefaultPaperID(void) +{ + return (CFPreferencesCopyAppValue(kDefaultPaperIDKey, + kCUPSPrintingPrefs)); +} + + +/* + * '_cupsAppleCopyDefaultPrinter()' - Get the default printer at this location. + */ + +CFStringRef /* O - Default printer name */ +_cupsAppleCopyDefaultPrinter(void) +{ + CFStringRef network; /* Network location */ + CFArrayRef locations; /* Location array */ + CFStringRef locprinter; /* Current printer */ + + + /* + * Use location-based defaults only if "use last printer" is selected in the + * system preferences... + */ + + if (!_cupsAppleGetUseLastPrinter()) + { + DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Not using last printer as " + "default."); + return (NULL); + } + + /* + * Get the current location... + */ + + if ((network = appleCopyNetwork()) == NULL) + { + DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Unable to get current " + "network."); + return (NULL); + } + +//# ifdef DEBUG +// CFStringGetCString(network, name, namesize, kCFStringEncodingUTF8); +// DEBUG_printf(("2_cupsUserDefault: network=\"%s\"", name)); +//# endif /* DEBUG */ + + /* + * Lookup the network in the preferences... + */ + + if ((locations = appleCopyLocations()) == NULL) + { + /* + * Missing or bad location array, so no location-based default... + */ + + DEBUG_puts("1_cupsAppleCopyDefaultPrinter: Missing or bad last used " + "printer array."); + + CFRelease(network); + + return (NULL); + } + + DEBUG_printf(("1_cupsAppleCopyDefaultPrinter: Got locations, %d entries.", + (int)CFArrayGetCount(locations))); + + if ((locprinter = appleGetPrinter(locations, network, NULL)) != NULL) + CFRetain(locprinter); + + CFRelease(network); + CFRelease(locations); + + return (locprinter); +} + + +/* + * '_cupsAppleGetUseLastPrinter()' - Get whether to use the last used printer. + */ + +int /* O - 1 to use last printer, 0 otherwise */ +_cupsAppleGetUseLastPrinter(void) +{ + Boolean uselast, /* Use last printer preference value */ + uselast_set; /* Valid is set? */ + + + if (getenv("CUPS_DISABLE_APPLE_DEFAULT")) + return (0); + + uselast = CFPreferencesGetAppBooleanValue(kUseLastPrinter, + kCUPSPrintingPrefs, + &uselast_set); + if (!uselast_set) + return (1); + else + return (uselast); +} + + +/* + * '_cupsAppleSetDefaultPaperID()' - Set the default paper id. + */ + +void +_cupsAppleSetDefaultPaperID( + CFStringRef name) /* I - New paper ID */ +{ + CFPreferencesSetAppValue(kDefaultPaperIDKey, name, kCUPSPrintingPrefs); + CFPreferencesAppSynchronize(kCUPSPrintingPrefs); + notify_post("com.apple.printerPrefsChange"); +} + + +/* + * '_cupsAppleSetDefaultPrinter()' - Set the default printer for this location. + */ + +void +_cupsAppleSetDefaultPrinter( + CFStringRef name) /* I - Default printer/class name */ +{ + CFStringRef network; /* Current network */ + CFArrayRef locations; /* Old locations array */ + CFIndex locindex; /* Index in locations array */ + CFStringRef locprinter; /* Current printer */ + CFMutableArrayRef newlocations; /* New locations array */ + CFMutableDictionaryRef newlocation; /* New location */ + + + /* + * Get the current location... + */ + + if ((network = appleCopyNetwork()) == NULL) + { + DEBUG_puts("1_cupsAppleSetDefaultPrinter: Unable to get current network..."); + return; + } + + /* + * Lookup the network in the preferences... + */ + + if ((locations = appleCopyLocations()) != NULL) + locprinter = appleGetPrinter(locations, network, &locindex); + else + { + locprinter = NULL; + locindex = -1; + } + + if (!locprinter || CFStringCompare(locprinter, name, 0) != kCFCompareEqualTo) + { + /* + * Need to change the locations array... + */ + + if (locations) + { + newlocations = CFArrayCreateMutableCopy(kCFAllocatorDefault, 0, + locations); + + if (locprinter) + CFArrayRemoveValueAtIndex(newlocations, locindex); + } + else + newlocations = CFArrayCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeArrayCallBacks); + + newlocation = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (newlocation && newlocations) + { + /* + * Put the new location at the front of the array... + */ + + CFDictionaryAddValue(newlocation, kLocationNetworkKey, network); + CFDictionaryAddValue(newlocation, kLocationPrinterIDKey, name); + CFArrayInsertValueAtIndex(newlocations, 0, newlocation); + + /* + * Limit the number of locations to 10... + */ + + while (CFArrayGetCount(newlocations) > 10) + CFArrayRemoveValueAtIndex(newlocations, 10); + + /* + * Push the changes out... + */ + + CFPreferencesSetAppValue(kLastUsedPrintersKey, newlocations, + kCUPSPrintingPrefs); + CFPreferencesAppSynchronize(kCUPSPrintingPrefs); + notify_post("com.apple.printerPrefsChange"); + } + + if (newlocations) + CFRelease(newlocations); + + if (newlocation) + CFRelease(newlocation); + } + + if (locations) + CFRelease(locations); + + CFRelease(network); +} + + +/* + * '_cupsAppleSetUseLastPrinter()' - Set whether to use the last used printer. + */ + +void +_cupsAppleSetUseLastPrinter( + int uselast) /* O - 1 to use last printer, 0 otherwise */ +{ + CFPreferencesSetAppValue(kUseLastPrinter, + uselast ? kCFBooleanTrue : kCFBooleanFalse, + kCUPSPrintingPrefs); + CFPreferencesAppSynchronize(kCUPSPrintingPrefs); + notify_post("com.apple.printerPrefsChange"); +} +#endif /* __APPLE__ */ + + +/* + * 'cupsFreeDests()' - Free the memory used by the list of destinations. + */ + +void +cupsFreeDests(int num_dests, /* I - Number of destinations */ + cups_dest_t *dests) /* I - Destinations */ +{ + int i; /* Looping var */ + cups_dest_t *dest; /* Current destination */ + + + if (num_dests == 0 || dests == NULL) + return; + + for (i = num_dests, dest = dests; i > 0; i --, dest ++) + { + _cupsStrFree(dest->name); + _cupsStrFree(dest->instance); + + cupsFreeOptions(dest->num_options, dest->options); + } + + free(dests); +} + + +/* + * 'cupsGetDest()' - Get the named destination from the list. + * + * Use the @link cupsGetDests@ or @link cupsGetDests2@ functions to get a + * list of supported destinations for the current user. + */ + +cups_dest_t * /* O - Destination pointer or @code NULL@ */ +cupsGetDest(const char *name, /* I - Destination name or @code NULL@ for the default destination */ + const char *instance, /* I - Instance name or @code NULL@ */ + int num_dests, /* I - Number of destinations */ + cups_dest_t *dests) /* I - Destinations */ +{ + int diff, /* Result of comparison */ + match; /* Matching index */ + + + if (num_dests <= 0 || !dests) + return (NULL); + + if (!name) + { + /* + * NULL name for default printer. + */ + + while (num_dests > 0) + { + if (dests->is_default) + return (dests); + + num_dests --; + dests ++; + } + } + else + { + /* + * Lookup name and optionally the instance... + */ + + match = cups_find_dest(name, instance, num_dests, dests, -1, &diff); + + if (!diff) + return (dests + match); + } + + return (NULL); +} + + +/* + * '_cupsGetDests()' - Get destinations from a server. + * + * "op" is CUPS_GET_PRINTERS to get a full list, CUPS_GET_DEFAULT to get the + * system-wide default printer, or IPP_GET_PRINTER_ATTRIBUTES for a known + * printer. + * + * "name" is the name of an existing printer and is only used when "op" is + * IPP_GET_PRINTER_ATTRIBUTES. + * + * "dest" is initialized to point to the array of destinations. + * + * 0 is returned if there are no printers, no default printer, or the named + * printer does not exist, respectively. + * + * Free the memory used by the destination array using the @link cupsFreeDests@ + * function. + * + * Note: On Mac OS X this function also gets the default paper from the system + * preferences (~/L/P/org.cups.PrintingPrefs.plist) and includes it in the + * options array for each destination that supports it. + */ + +int /* O - Number of destinations */ +_cupsGetDests(http_t *http, /* I - Connection to server or CUPS_HTTP_DEFAULT */ + ipp_op_t op, /* I - IPP operation */ + const char *name, /* I - Name of destination */ + cups_dest_t **dests) /* IO - Destinations */ +{ + int num_dests = 0; /* Number of destinations */ + cups_dest_t *dest; /* Current destination */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *printer_name; /* printer-name attribute */ + char uri[1024]; /* printer-uri value */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ +#ifdef __APPLE__ + char media_default[41]; /* Default paper size */ +#endif /* __APPLE__ */ + char optname[1024], /* Option name */ + value[2048], /* Option value */ + *ptr; /* Pointer into name/value */ + static const char * const pattrs[] = /* Attributes we're interested in */ + { + "auth-info-required", + "device-uri", + "job-sheets-default", + "marker-change-time", + "marker-colors", + "marker-high-levels", + "marker-levels", + "marker-low-levels", + "marker-message", + "marker-names", + "marker-types", +#ifdef __APPLE__ + "media-supported", +#endif /* __APPLE__ */ + "printer-commands", + "printer-defaults", + "printer-info", + "printer-is-accepting-jobs", + "printer-is-shared", + "printer-location", + "printer-make-and-model", + "printer-name", + "printer-state", + "printer-state-change-time", + "printer-state-reasons", + "printer-type", + "printer-uri-supported" + }; + + +#ifdef __APPLE__ + /* + * Get the default paper size... + */ + + appleGetPaperSize(media_default, sizeof(media_default)); +#endif /* __APPLE__ */ + + /* + * Build a CUPS_GET_PRINTERS or IPP_GET_PRINTER_ATTRIBUTES request, which + * require the following attributes: + * + * attributes-charset + * attributes-natural-language + * requesting-user-name + * printer-uri [for IPP_GET_PRINTER_ATTRIBUTES] + */ + + request = ippNewRequest(op); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + if (name && op != CUPS_GET_DEFAULT) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/printers/%s", name); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + } + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a printer... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this printer... + */ + + printer_name = NULL; + num_options = 0; + options = NULL; + + for (; attr && attr->group_tag == IPP_TAG_PRINTER; attr = attr->next) + { + if (attr->value_tag != IPP_TAG_INTEGER && + attr->value_tag != IPP_TAG_ENUM && + attr->value_tag != IPP_TAG_BOOLEAN && + attr->value_tag != IPP_TAG_TEXT && + attr->value_tag != IPP_TAG_TEXTLANG && + attr->value_tag != IPP_TAG_NAME && + attr->value_tag != IPP_TAG_NAMELANG && + attr->value_tag != IPP_TAG_KEYWORD && + attr->value_tag != IPP_TAG_RANGE && + attr->value_tag != IPP_TAG_URI) + continue; + + if (!strcmp(attr->name, "auth-info-required") || + !strcmp(attr->name, "device-uri") || + !strcmp(attr->name, "marker-change-time") || + !strcmp(attr->name, "marker-colors") || + !strcmp(attr->name, "marker-high-levels") || + !strcmp(attr->name, "marker-levels") || + !strcmp(attr->name, "marker-low-levels") || + !strcmp(attr->name, "marker-message") || + !strcmp(attr->name, "marker-names") || + !strcmp(attr->name, "marker-types") || + !strcmp(attr->name, "printer-commands") || + !strcmp(attr->name, "printer-info") || + !strcmp(attr->name, "printer-is-shared") || + !strcmp(attr->name, "printer-make-and-model") || + !strcmp(attr->name, "printer-state") || + !strcmp(attr->name, "printer-state-change-time") || + !strcmp(attr->name, "printer-type") || + !strcmp(attr->name, "printer-is-accepting-jobs") || + !strcmp(attr->name, "printer-location") || + !strcmp(attr->name, "printer-state-reasons") || + !strcmp(attr->name, "printer-uri-supported")) + { + /* + * Add a printer description attribute... + */ + + num_options = cupsAddOption(attr->name, + cups_make_string(attr, value, + sizeof(value)), + num_options, &options); + } +#ifdef __APPLE__ + else if (!strcmp(attr->name, "media-supported")) + { + /* + * See if we can set a default media size... + */ + + int i; /* Looping var */ + + for (i = 0; i < attr->num_values; i ++) + if (!_cups_strcasecmp(media_default, attr->values[i].string.text)) + { + num_options = cupsAddOption("media", media_default, num_options, + &options); + break; + } + } +#endif /* __APPLE__ */ + else if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer_name = attr->values[0].string.text; + else if (strncmp(attr->name, "notify-", 7) && + (attr->value_tag == IPP_TAG_BOOLEAN || + attr->value_tag == IPP_TAG_ENUM || + attr->value_tag == IPP_TAG_INTEGER || + attr->value_tag == IPP_TAG_KEYWORD || + attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_RANGE) && + (ptr = strstr(attr->name, "-default")) != NULL) + { + /* + * Add a default option... + */ + + strlcpy(optname, attr->name, sizeof(optname)); + optname[ptr - attr->name] = '\0'; + + if (_cups_strcasecmp(optname, "media") || + !cupsGetOption("media", num_options, options)) + num_options = cupsAddOption(optname, + cups_make_string(attr, value, + sizeof(value)), + num_options, &options); + } + } + + /* + * See if we have everything needed... + */ + + if (!printer_name) + { + cupsFreeOptions(num_options, options); + + if (attr == NULL) + break; + else + continue; + } + + if ((dest = cups_add_dest(printer_name, NULL, &num_dests, dests)) != NULL) + { + dest->num_options = num_options; + dest->options = options; + } + else + cupsFreeOptions(num_options, options); + + if (attr == NULL) + break; + } + + ippDelete(response); + } + + /* + * Return the count... + */ + + return (num_dests); +} + + +/* + * 'cupsGetDests()' - Get the list of destinations from the default server. + * + * Starting with CUPS 1.2, the returned list of destinations include the + * printer-info, printer-is-accepting-jobs, printer-is-shared, + * printer-make-and-model, printer-state, printer-state-change-time, + * printer-state-reasons, and printer-type attributes as options. CUPS 1.4 + * adds the marker-change-time, marker-colors, marker-high-levels, + * marker-levels, marker-low-levels, marker-message, marker-names, + * marker-types, and printer-commands attributes as well. + * + * Use the @link cupsFreeDests@ function to free the destination list and + * the @link cupsGetDest@ function to find a particular destination. + */ + +int /* O - Number of destinations */ +cupsGetDests(cups_dest_t **dests) /* O - Destinations */ +{ + return (cupsGetDests2(CUPS_HTTP_DEFAULT, dests)); +} + + +/* + * 'cupsGetDests2()' - Get the list of destinations from the specified server. + * + * Starting with CUPS 1.2, the returned list of destinations include the + * printer-info, printer-is-accepting-jobs, printer-is-shared, + * printer-make-and-model, printer-state, printer-state-change-time, + * printer-state-reasons, and printer-type attributes as options. CUPS 1.4 + * adds the marker-change-time, marker-colors, marker-high-levels, + * marker-levels, marker-low-levels, marker-message, marker-names, + * marker-types, and printer-commands attributes as well. + * + * Use the @link cupsFreeDests@ function to free the destination list and + * the @link cupsGetDest@ function to find a particular destination. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +int /* O - Number of destinations */ +cupsGetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + cups_dest_t **dests) /* O - Destinations */ +{ + int i; /* Looping var */ + int num_dests; /* Number of destinations */ + cups_dest_t *dest; /* Destination pointer */ + const char *home; /* HOME environment variable */ + char filename[1024]; /* Local ~/.cups/lpoptions file */ + const char *defprinter; /* Default printer */ + char name[1024], /* Copy of printer name */ + *instance, /* Pointer to instance name */ + *user_default; /* User default printer */ + int num_reals; /* Number of real queues */ + cups_dest_t *reals; /* Real queues */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * Range check the input... + */ + + if (!dests) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad NULL dests pointer"), 1); + return (0); + } + + /* + * Grab the printers and classes... + */ + + *dests = (cups_dest_t *)0; + num_dests = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, dests); + + if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE) + { + cupsFreeDests(num_dests, *dests); + *dests = (cups_dest_t *)0; + return (0); + } + + /* + * Make a copy of the "real" queues for a later sanity check... + */ + + if (num_dests > 0) + { + num_reals = num_dests; + reals = calloc(num_reals, sizeof(cups_dest_t)); + + if (reals) + memcpy(reals, *dests, num_reals * sizeof(cups_dest_t)); + else + num_reals = 0; + } + else + { + num_reals = 0; + reals = NULL; + } + + /* + * Grab the default destination... + */ + + if ((user_default = _cupsUserDefault(name, sizeof(name))) != NULL) + defprinter = name; + else if ((defprinter = cupsGetDefault2(http)) != NULL) + { + strlcpy(name, defprinter, sizeof(name)); + defprinter = name; + } + + if (defprinter) + { + /* + * Separate printer and instance name... + */ + + if ((instance = strchr(name, '/')) != NULL) + *instance++ = '\0'; + + /* + * Lookup the printer and instance and make it the default... + */ + + if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL) + dest->is_default = 1; + } + else + instance = NULL; + + /* + * Load the /etc/cups/lpoptions and ~/.cups/lpoptions files... + */ + + snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); + num_dests = cups_get_dests(filename, NULL, NULL, user_default != NULL, + num_dests, dests); + + if ((home = getenv("HOME")) != NULL) + { + snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home); + + num_dests = cups_get_dests(filename, NULL, NULL, user_default != NULL, + num_dests, dests); + } + + /* + * Validate the current default destination - this prevents old + * Default lines in /etc/cups/lpoptions and ~/.cups/lpoptions from + * pointing to a non-existent printer or class... + */ + + if (num_reals) + { + /* + * See if we have a default printer... + */ + + if ((dest = cupsGetDest(NULL, NULL, num_dests, *dests)) != NULL) + { + /* + * Have a default; see if it is real... + */ + + dest = cupsGetDest(dest->name, NULL, num_reals, reals); + } + + /* + * If dest is NULL, then no default (that exists) is set, so we + * need to set a default if one exists... + */ + + if (dest == NULL && defprinter != NULL) + { + for (i = 0; i < num_dests; i ++) + (*dests)[i].is_default = 0; + + if ((dest = cupsGetDest(name, instance, num_dests, *dests)) != NULL) + dest->is_default = 1; + } + + /* + * Free memory... + */ + + free(reals); + } + + /* + * Return the number of destinations... + */ + + if (num_dests > 0) + _cupsSetError(IPP_OK, NULL, 0); + + return (num_dests); +} + + +/* + * 'cupsGetNamedDest()' - Get options for the named destination. + * + * This function is optimized for retrieving a single destination and should + * be used instead of @link cupsGetDests@ and @link cupsGetDest@ when you either + * know the name of the destination or want to print to the default destination. + * If @code NULL@ is returned, the destination does not exist or there is no + * default destination. + * + * If "http" is @code CUPS_HTTP_DEFAULT@, the connection to the default print + * server will be used. + * + * If "name" is @code NULL@, the default printer for the current user will be + * returned. + * + * The returned destination must be freed using @link cupsFreeDests@ with a + * "num_dests" value of 1. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +cups_dest_t * /* O - Destination or @code NULL@ */ +cupsGetNamedDest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Destination name or @code NULL@ for the default destination */ + const char *instance) /* I - Instance name or @code NULL@ */ +{ + cups_dest_t *dest; /* Destination */ + char filename[1024], /* Path to lpoptions */ + defname[256]; /* Default printer name */ + const char *home = getenv("HOME"); /* Home directory */ + int set_as_default = 0; /* Set returned destination as default */ + ipp_op_t op = IPP_GET_PRINTER_ATTRIBUTES; + /* IPP operation to get server ops */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * If "name" is NULL, find the default destination... + */ + + if (!name) + { + set_as_default = 1; + name = _cupsUserDefault(defname, sizeof(defname)); + + if (name) + { + char *ptr; /* Temporary pointer... */ + + if ((ptr = strchr(defname, '/')) != NULL) + { + *ptr++ = '\0'; + instance = ptr; + } + else + instance = NULL; + } + else if (home) + { + /* + * No default in the environment, try the user's lpoptions files... + */ + + snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home); + + name = cups_get_default(filename, defname, sizeof(defname), &instance); + } + + if (!name) + { + /* + * Still not there? Try the system lpoptions file... + */ + + snprintf(filename, sizeof(filename), "%s/lpoptions", + cg->cups_serverroot); + name = cups_get_default(filename, defname, sizeof(defname), &instance); + } + + if (!name) + { + /* + * No locally-set default destination, ask the server... + */ + + op = CUPS_GET_DEFAULT; + } + } + + /* + * Get the printer's attributes... + */ + + if (!_cupsGetDests(http, op, name, &dest)) + { + if (op == CUPS_GET_DEFAULT || (name && !set_as_default)) + return (NULL); + + /* + * The default printer from environment variables or from a + * configuration file does not exist. Find out the real default. + */ + + if (!_cupsGetDests(http, CUPS_GET_DEFAULT, NULL, &dest)) + return (NULL); + } + + if (instance) + dest->instance = _cupsStrAlloc(instance); + + if (set_as_default) + dest->is_default = 1; + + /* + * Then add local options... + */ + + snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); + cups_get_dests(filename, name, instance, 1, 1, &dest); + + if (home) + { + snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home); + + cups_get_dests(filename, name, instance, 1, 1, &dest); + } + + /* + * Return the result... + */ + + return (dest); +} + + +/* + * 'cupsRemoveDest()' - Remove a destination from the destination list. + * + * Removing a destination/instance does not delete the class or printer + * queue, merely the lpoptions for that destination/instance. Use the + * @link cupsSetDests@ or @link cupsSetDests2@ functions to save the new + * options for the user. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - New number of destinations */ +cupsRemoveDest(const char *name, /* I - Destination name */ + const char *instance, /* I - Instance name or @code NULL@ */ + int num_dests, /* I - Number of destinations */ + cups_dest_t **dests) /* IO - Destinations */ +{ + int i; /* Index into destinations */ + cups_dest_t *dest; /* Pointer to destination */ + + + /* + * Find the destination... + */ + + if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL) + return (num_dests); + + /* + * Free memory... + */ + + _cupsStrFree(dest->name); + _cupsStrFree(dest->instance); + cupsFreeOptions(dest->num_options, dest->options); + + /* + * Remove the destination from the array... + */ + + num_dests --; + + i = dest - *dests; + + if (i < num_dests) + memmove(dest, dest + 1, (num_dests - i) * sizeof(cups_dest_t)); + + return (num_dests); +} + + +/* + * 'cupsSetDefaultDest()' - Set the default destination. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +void +cupsSetDefaultDest( + const char *name, /* I - Destination name */ + const char *instance, /* I - Instance name or @code NULL@ */ + int num_dests, /* I - Number of destinations */ + cups_dest_t *dests) /* I - Destinations */ +{ + int i; /* Looping var */ + cups_dest_t *dest; /* Current destination */ + + + /* + * Range check input... + */ + + if (!name || num_dests <= 0 || !dests) + return; + + /* + * Loop through the array and set the "is_default" flag for the matching + * destination... + */ + + for (i = num_dests, dest = dests; i > 0; i --, dest ++) + dest->is_default = !_cups_strcasecmp(name, dest->name) && + ((!instance && !dest->instance) || + (instance && dest->instance && + !_cups_strcasecmp(instance, dest->instance))); +} + + +/* + * 'cupsSetDests()' - Save the list of destinations for the default server. + * + * This function saves the destinations to /etc/cups/lpoptions when run + * as root and ~/.cups/lpoptions when run as a normal user. + */ + +void +cupsSetDests(int num_dests, /* I - Number of destinations */ + cups_dest_t *dests) /* I - Destinations */ +{ + cupsSetDests2(CUPS_HTTP_DEFAULT, num_dests, dests); +} + + +/* + * 'cupsSetDests2()' - Save the list of destinations for the specified server. + * + * This function saves the destinations to /etc/cups/lpoptions when run + * as root and ~/.cups/lpoptions when run as a normal user. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +int /* O - 0 on success, -1 on error */ +cupsSetDests2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + int num_dests, /* I - Number of destinations */ + cups_dest_t *dests) /* I - Destinations */ +{ + int i, j; /* Looping vars */ + int wrote; /* Wrote definition? */ + cups_dest_t *dest; /* Current destination */ + cups_option_t *option; /* Current option */ + _ipp_option_t *match; /* Matching attribute for option */ + FILE *fp; /* File pointer */ +#ifndef WIN32 + const char *home; /* HOME environment variable */ +#endif /* WIN32 */ + char filename[1024]; /* lpoptions file */ + int num_temps; /* Number of temporary destinations */ + cups_dest_t *temps = NULL, /* Temporary destinations */ + *temp; /* Current temporary dest */ + const char *val; /* Value of temporary option */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * Range check the input... + */ + + if (!num_dests || !dests) + return (-1); + + /* + * Get the server destinations... + */ + + num_temps = _cupsGetDests(http, CUPS_GET_PRINTERS, NULL, &temps); + + if (cupsLastError() >= IPP_REDIRECTION_OTHER_SITE) + { + cupsFreeDests(num_temps, temps); + return (-1); + } + + /* + * Figure out which file to write to... + */ + + snprintf(filename, sizeof(filename), "%s/lpoptions", cg->cups_serverroot); + +#ifndef WIN32 + if (getuid()) + { + /* + * Merge in server defaults... + */ + + num_temps = cups_get_dests(filename, NULL, NULL, 0, num_temps, &temps); + + /* + * Point to user defaults... + */ + + if ((home = getenv("HOME")) != NULL) + { + /* + * Create ~/.cups subdirectory... + */ + + snprintf(filename, sizeof(filename), "%s/.cups", home); + if (access(filename, 0)) + mkdir(filename, 0700); + + snprintf(filename, sizeof(filename), "%s/.cups/lpoptions", home); + } + } +#endif /* !WIN32 */ + + /* + * Try to open the file... + */ + + if ((fp = fopen(filename, "w")) == NULL) + { + cupsFreeDests(num_temps, temps); + return (-1); + } + +#ifndef WIN32 + /* + * Set the permissions to 0644 when saving to the /etc/cups/lpoptions + * file... + */ + + if (!getuid()) + fchmod(fileno(fp), 0644); +#endif /* !WIN32 */ + + /* + * Write each printer; each line looks like: + * + * Dest name[/instance] options + * Default name[/instance] options + */ + + for (i = num_dests, dest = dests; i > 0; i --, dest ++) + if (dest->instance != NULL || dest->num_options != 0 || dest->is_default) + { + if (dest->is_default) + { + fprintf(fp, "Default %s", dest->name); + if (dest->instance) + fprintf(fp, "/%s", dest->instance); + + wrote = 1; + } + else + wrote = 0; + + if ((temp = cupsGetDest(dest->name, dest->instance, num_temps, temps)) == NULL) + temp = cupsGetDest(dest->name, NULL, num_temps, temps); + + for (j = dest->num_options, option = dest->options; j > 0; j --, option ++) + { + /* + * See if this option is a printer attribute; if so, skip it... + */ + + if ((match = _ippFindOption(option->name)) != NULL && + match->group_tag == IPP_TAG_PRINTER) + continue; + + /* + * See if the server/global options match these; if so, don't + * write 'em. + */ + + if (temp && + (val = cupsGetOption(option->name, temp->num_options, + temp->options)) != NULL && + !_cups_strcasecmp(val, option->value)) + continue; + + /* + * Options don't match, write to the file... + */ + + if (!wrote) + { + fprintf(fp, "Dest %s", dest->name); + if (dest->instance) + fprintf(fp, "/%s", dest->instance); + wrote = 1; + } + + if (option->value[0]) + { + if (strchr(option->value, ' ') || + strchr(option->value, '\\') || + strchr(option->value, '\"') || + strchr(option->value, '\'')) + { + /* + * Quote the value... + */ + + fprintf(fp, " %s=\"", option->name); + + for (val = option->value; *val; val ++) + { + if (strchr("\"\'\\", *val)) + putc('\\', fp); + + putc(*val, fp); + } + + putc('\"', fp); + } + else + { + /* + * Store the literal value... + */ + + fprintf(fp, " %s=%s", option->name, option->value); + } + } + else + fprintf(fp, " %s", option->name); + } + + if (wrote) + fputs("\n", fp); + } + + /* + * Free the temporary destinations and close the file... + */ + + cupsFreeDests(num_temps, temps); + + fclose(fp); + +#ifdef __APPLE__ + /* + * Set the default printer for this location - this allows command-line + * and GUI applications to share the same default destination... + */ + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL) + { + CFStringRef name = CFStringCreateWithCString(kCFAllocatorDefault, + dest->name, + kCFStringEncodingUTF8); + /* Default printer name */ + + if (name) + { + _cupsAppleSetDefaultPrinter(name); + CFRelease(name); + } + } +#endif /* __APPLE__ */ + +#ifdef HAVE_NOTIFY_POST + /* + * Send a notification so that MacOS X applications can know about the + * change, too. + */ + + notify_post("com.apple.printerListChange"); +#endif /* HAVE_NOTIFY_POST */ + + return (0); +} + + +/* + * '_cupsUserDefault()' - Get the user default printer from environment + * variables and location information. + */ + +char * /* O - Default printer or NULL */ +_cupsUserDefault(char *name, /* I - Name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + const char *env; /* LPDEST or PRINTER env variable */ +#ifdef __APPLE__ + CFStringRef locprinter; /* Last printer as this location */ +#endif /* __APPLE__ */ + + + if ((env = getenv("LPDEST")) == NULL) + if ((env = getenv("PRINTER")) != NULL && !strcmp(env, "lp")) + env = NULL; + + if (env) + { + strlcpy(name, env, namesize); + return (name); + } + +#ifdef __APPLE__ + /* + * Use location-based defaults if "use last printer" is selected in the + * system preferences... + */ + + if ((locprinter = _cupsAppleCopyDefaultPrinter()) != NULL) + { + CFStringGetCString(locprinter, name, namesize, kCFStringEncodingUTF8); + CFRelease(locprinter); + } + else + name[0] = '\0'; + + DEBUG_printf(("1_cupsUserDefault: Returning \"%s\".", name)); + + return (*name ? name : NULL); + +#else + /* + * No location-based defaults on this platform... + */ + + name[0] = '\0'; + return (NULL); +#endif /* __APPLE__ */ +} + + +#ifdef __APPLE__ +/* + * 'appleCopyLocations()' - Copy the location history array. + */ + +static CFArrayRef /* O - Location array or NULL */ +appleCopyLocations(void) +{ + CFArrayRef locations; /* Location array */ + + + /* + * Look up the location array in the preferences... + */ + + if ((locations = CFPreferencesCopyAppValue(kLastUsedPrintersKey, + kCUPSPrintingPrefs)) == NULL) + return (NULL); + + if (CFGetTypeID(locations) != CFArrayGetTypeID()) + { + CFRelease(locations); + return (NULL); + } + + return (locations); +} + + +/* + * 'appleCopyNetwork()' - Get the network ID for the current location. + */ + +static CFStringRef /* O - Network ID */ +appleCopyNetwork(void) +{ + SCDynamicStoreRef dynamicStore; /* System configuration data */ + CFStringRef key; /* Current network configuration key */ + CFDictionaryRef ip_dict; /* Network configuration data */ + CFStringRef network = NULL; /* Current network ID */ + + + if ((dynamicStore = SCDynamicStoreCreate(NULL, CFSTR("libcups"), NULL, + NULL)) != NULL) + { + /* + * First use the IPv6 router address, if available, since that will generally + * be a globally-unique link-local address. + */ + + if ((key = SCDynamicStoreKeyCreateNetworkGlobalEntity( + NULL, kSCDynamicStoreDomainState, kSCEntNetIPv6)) != NULL) + { + if ((ip_dict = SCDynamicStoreCopyValue(dynamicStore, key)) != NULL) + { + if ((network = CFDictionaryGetValue(ip_dict, + kSCPropNetIPv6Router)) != NULL) + CFRetain(network); + + CFRelease(ip_dict); + } + + CFRelease(key); + } + + /* + * If that doesn't work, try the IPv4 router address. This isn't as unique + * and will likely be a 10.x.y.z or 192.168.y.z address... + */ + + if (!network) + { + if ((key = SCDynamicStoreKeyCreateNetworkGlobalEntity( + NULL, kSCDynamicStoreDomainState, kSCEntNetIPv4)) != NULL) + { + if ((ip_dict = SCDynamicStoreCopyValue(dynamicStore, key)) != NULL) + { + if ((network = CFDictionaryGetValue(ip_dict, + kSCPropNetIPv4Router)) != NULL) + CFRetain(network); + + CFRelease(ip_dict); + } + + CFRelease(key); + } + } + + CFRelease(dynamicStore); + } + + return (network); +} + + +/* + * 'appleGetPaperSize()' - Get the default paper size. + */ + +char * /* O - Default paper size */ +appleGetPaperSize(char *name, /* I - Paper size name buffer */ + int namesize) /* I - Size of buffer */ +{ + CFStringRef defaultPaperID; /* Default paper ID */ + _pwg_media_t *pwgmedia; /* PWG media size */ + + + defaultPaperID = _cupsAppleCopyDefaultPaperID(); + if (!defaultPaperID || + CFGetTypeID(defaultPaperID) != CFStringGetTypeID() || + !CFStringGetCString(defaultPaperID, name, namesize, + kCFStringEncodingUTF8)) + name[0] = '\0'; + else if ((pwgmedia = _pwgMediaForLegacy(name)) != NULL) + strlcpy(name, pwgmedia->pwg, namesize); + + if (defaultPaperID) + CFRelease(defaultPaperID); + + return (name); +} + + +/* + * 'appleGetPrinter()' - Get a printer from the history array. + */ + +static CFStringRef /* O - Printer name or NULL */ +appleGetPrinter(CFArrayRef locations, /* I - Location array */ + CFStringRef network, /* I - Network name */ + CFIndex *locindex) /* O - Index in array */ +{ + CFIndex i, /* Looping var */ + count; /* Number of locations */ + CFDictionaryRef location; /* Current location */ + CFStringRef locnetwork, /* Current network */ + locprinter; /* Current printer */ + + + for (i = 0, count = CFArrayGetCount(locations); i < count; i ++) + if ((location = CFArrayGetValueAtIndex(locations, i)) != NULL && + CFGetTypeID(location) == CFDictionaryGetTypeID()) + { + if ((locnetwork = CFDictionaryGetValue(location, + kLocationNetworkKey)) != NULL && + CFGetTypeID(locnetwork) == CFStringGetTypeID() && + CFStringCompare(network, locnetwork, 0) == kCFCompareEqualTo && + (locprinter = CFDictionaryGetValue(location, + kLocationPrinterIDKey)) != NULL && + CFGetTypeID(locprinter) == CFStringGetTypeID()) + { + if (locindex) + *locindex = i; + + return (locprinter); + } + } + + return (NULL); +} +#endif /* __APPLE__ */ + + +/* + * 'cups_add_dest()' - Add a destination to the array. + * + * Unlike cupsAddDest(), this function does not check for duplicates. + */ + +static cups_dest_t * /* O - New destination */ +cups_add_dest(const char *name, /* I - Name of destination */ + const char *instance, /* I - Instance or NULL */ + int *num_dests, /* IO - Number of destinations */ + cups_dest_t **dests) /* IO - Destinations */ +{ + int insert, /* Insertion point */ + diff; /* Result of comparison */ + cups_dest_t *dest; /* Destination pointer */ + + + /* + * Add new destination... + */ + + if (*num_dests == 0) + dest = malloc(sizeof(cups_dest_t)); + else + dest = realloc(*dests, sizeof(cups_dest_t) * (*num_dests + 1)); + + if (!dest) + return (NULL); + + *dests = dest; + + /* + * Find where to insert the destination... + */ + + if (*num_dests == 0) + insert = 0; + else + { + insert = cups_find_dest(name, instance, *num_dests, *dests, *num_dests - 1, + &diff); + + if (diff > 0) + insert ++; + } + + /* + * Move the array elements as needed... + */ + + if (insert < *num_dests) + memmove(*dests + insert + 1, *dests + insert, + (*num_dests - insert) * sizeof(cups_dest_t)); + + (*num_dests) ++; + + /* + * Initialize the destination... + */ + + dest = *dests + insert; + dest->name = _cupsStrAlloc(name); + dest->instance = _cupsStrAlloc(instance); + dest->is_default = 0; + dest->num_options = 0; + dest->options = (cups_option_t *)0; + + return (dest); +} + + +/* + * 'cups_compare_dests()' - Compare two destinations. + */ + +static int /* O - Result of comparison */ +cups_compare_dests(cups_dest_t *a, /* I - First destination */ + cups_dest_t *b) /* I - Second destination */ +{ + int diff; /* Difference */ + + + if ((diff = _cups_strcasecmp(a->name, b->name)) != 0) + return (diff); + else if (a->instance && b->instance) + return (_cups_strcasecmp(a->instance, b->instance)); + else + return ((a->instance && !b->instance) - (!a->instance && b->instance)); +} + + +/* + * 'cups_find_dest()' - Find a destination using a binary search. + */ + +static int /* O - Index of match */ +cups_find_dest(const char *name, /* I - Destination name */ + const char *instance, /* I - Instance or NULL */ + int num_dests, /* I - Number of destinations */ + cups_dest_t *dests, /* I - Destinations */ + int prev, /* I - Previous index */ + int *rdiff) /* O - Difference of match */ +{ + int left, /* Low mark for binary search */ + right, /* High mark for binary search */ + current, /* Current index */ + diff; /* Result of comparison */ + cups_dest_t key; /* Search key */ + + + key.name = (char *)name; + key.instance = (char *)instance; + + if (prev >= 0) + { + /* + * Start search on either side of previous... + */ + + if ((diff = cups_compare_dests(&key, dests + prev)) == 0 || + (diff < 0 && prev == 0) || + (diff > 0 && prev == (num_dests - 1))) + { + *rdiff = diff; + return (prev); + } + else if (diff < 0) + { + /* + * Start with previous on right side... + */ + + left = 0; + right = prev; + } + else + { + /* + * Start wih previous on left side... + */ + + left = prev; + right = num_dests - 1; + } + } + else + { + /* + * Start search in the middle... + */ + + left = 0; + right = num_dests - 1; + } + + do + { + current = (left + right) / 2; + diff = cups_compare_dests(&key, dests + current); + + if (diff == 0) + break; + else if (diff < 0) + right = current; + else + left = current; + } + while ((right - left) > 1); + + if (diff != 0) + { + /* + * Check the last 1 or 2 elements... + */ + + if ((diff = cups_compare_dests(&key, dests + left)) <= 0) + current = left; + else + { + diff = cups_compare_dests(&key, dests + right); + current = right; + } + } + + /* + * Return the closest destination and the difference... + */ + + *rdiff = diff; + + return (current); +} + + +/* + * 'cups_get_default()' - Get the default destination from an lpoptions file. + */ + +static char * /* O - Default destination or NULL */ +cups_get_default(const char *filename, /* I - File to read */ + char *namebuf, /* I - Name buffer */ + size_t namesize, /* I - Size of name buffer */ + const char **instance) /* I - Instance */ +{ + cups_file_t *fp; /* lpoptions file */ + char line[8192], /* Line from file */ + *value, /* Value for line */ + *nameptr; /* Pointer into name */ + int linenum; /* Current line */ + + + *namebuf = '\0'; + + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!_cups_strcasecmp(line, "default") && value) + { + strlcpy(namebuf, value, namesize); + + if ((nameptr = strchr(namebuf, ' ')) != NULL) + *nameptr = '\0'; + if ((nameptr = strchr(namebuf, '\t')) != NULL) + *nameptr = '\0'; + + if ((nameptr = strchr(namebuf, '/')) != NULL) + *nameptr++ = '\0'; + + *instance = nameptr; + break; + } + } + + cupsFileClose(fp); + } + + return (*namebuf ? namebuf : NULL); +} + + +/* + * 'cups_get_dests()' - Get destinations from a file. + */ + +static int /* O - Number of destinations */ +cups_get_dests( + const char *filename, /* I - File to read from */ + const char *match_name, /* I - Destination name we want */ + const char *match_inst, /* I - Instance name we want */ + int user_default_set, /* I - User default printer set? */ + int num_dests, /* I - Number of destinations */ + cups_dest_t **dests) /* IO - Destinations */ +{ + int i; /* Looping var */ + cups_dest_t *dest; /* Current destination */ + cups_file_t *fp; /* File pointer */ + char line[8192], /* Line from file */ + *lineptr, /* Pointer into line */ + *name, /* Name of destination/option */ + *instance; /* Instance of destination */ + int linenum; /* Current line number */ + + + DEBUG_printf(("7cups_get_dests(filename=\"%s\", match_name=\"%s\", " + "match_inst=\"%s\", user_default_set=%d, num_dests=%d, " + "dests=%p)", filename, match_name, match_inst, + user_default_set, num_dests, dests)); + + /* + * Try to open the file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + return (num_dests); + + /* + * Read each printer; each line looks like: + * + * Dest name[/instance] options + * Default name[/instance] options + */ + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &lineptr, &linenum)) + { + /* + * See what type of line it is... + */ + + DEBUG_printf(("9cups_get_dests: linenum=%d line=\"%s\" lineptr=\"%s\"", + linenum, line, lineptr)); + + if ((_cups_strcasecmp(line, "dest") && _cups_strcasecmp(line, "default")) || !lineptr) + { + DEBUG_puts("9cups_get_dests: Not a dest or default line..."); + continue; + } + + name = lineptr; + + /* + * Search for an instance... + */ + + while (!isspace(*lineptr & 255) && *lineptr && *lineptr != '/') + lineptr ++; + + if (*lineptr == '/') + { + /* + * Found an instance... + */ + + *lineptr++ = '\0'; + instance = lineptr; + + /* + * Search for an instance... + */ + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + } + else + instance = NULL; + + if (*lineptr) + *lineptr++ = '\0'; + + DEBUG_printf(("9cups_get_dests: name=\"%s\", instance=\"%s\"", name, + instance)); + + /* + * See if the primary instance of the destination exists; if not, + * ignore this entry and move on... + */ + + if (match_name) + { + if (_cups_strcasecmp(name, match_name) || + (!instance && match_inst) || + (instance && !match_inst) || + (instance && _cups_strcasecmp(instance, match_inst))) + continue; + + dest = *dests; + } + else if (cupsGetDest(name, NULL, num_dests, *dests) == NULL) + { + DEBUG_puts("9cups_get_dests: Not found!"); + continue; + } + else + { + /* + * Add the destination... + */ + + num_dests = cupsAddDest(name, instance, num_dests, dests); + + if ((dest = cupsGetDest(name, instance, num_dests, *dests)) == NULL) + { + /* + * Out of memory! + */ + + DEBUG_puts("9cups_get_dests: Out of memory!"); + break; + } + } + + /* + * Add options until we hit the end of the line... + */ + + dest->num_options = cupsParseOptions(lineptr, dest->num_options, + &(dest->options)); + + /* + * If we found what we were looking for, stop now... + */ + + if (match_name) + break; + + /* + * Set this as default if needed... + */ + + if (!user_default_set && !_cups_strcasecmp(line, "default")) + { + DEBUG_puts("9cups_get_dests: Setting as default..."); + + for (i = 0; i < num_dests; i ++) + (*dests)[i].is_default = 0; + + dest->is_default = 1; + } + } + + /* + * Close the file and return... + */ + + cupsFileClose(fp); + + return (num_dests); +} + + +/* + * 'cups_make_string()' - Make a comma-separated string of values from an IPP + * attribute. + */ + +static char * /* O - New string */ +cups_make_string( + ipp_attribute_t *attr, /* I - Attribute to convert */ + char *buffer, /* I - Buffer */ + size_t bufsize) /* I - Size of buffer */ +{ + int i; /* Looping var */ + char *ptr, /* Pointer into buffer */ + *end, /* Pointer to end of buffer */ + *valptr; /* Pointer into string attribute */ + + + /* + * Return quickly if we have a single string value... + */ + + if (attr->num_values == 1 && + attr->value_tag != IPP_TAG_INTEGER && + attr->value_tag != IPP_TAG_ENUM && + attr->value_tag != IPP_TAG_BOOLEAN && + attr->value_tag != IPP_TAG_RANGE) + return (attr->values[0].string.text); + + /* + * Copy the values to the string, separating with commas and escaping strings + * as needed... + */ + + end = buffer + bufsize - 1; + + for (i = 0, ptr = buffer; i < attr->num_values && ptr < end; i ++) + { + if (i) + *ptr++ = ','; + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(ptr, end - ptr + 1, "%d", attr->values[i].integer); + break; + + case IPP_TAG_BOOLEAN : + if (attr->values[i].boolean) + strlcpy(ptr, "true", end - ptr + 1); + else + strlcpy(ptr, "false", end - ptr + 1); + break; + + case IPP_TAG_RANGE : + if (attr->values[i].range.lower == attr->values[i].range.upper) + snprintf(ptr, end - ptr + 1, "%d", attr->values[i].range.lower); + else + snprintf(ptr, end - ptr + 1, "%d-%d", attr->values[i].range.lower, + attr->values[i].range.upper); + break; + + default : + for (valptr = attr->values[i].string.text; + *valptr && ptr < end;) + { + if (strchr(" \t\n\\\'\"", *valptr)) + { + if (ptr >= (end - 1)) + break; + + *ptr++ = '\\'; + } + + *ptr++ = *valptr++; + } + + *ptr = '\0'; + break; + } + + ptr += strlen(ptr); + } + + *ptr = '\0'; + + return (buffer); +} + + +/* + * End of "$Id: dest.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/cups/dir.c b/cups/dir.c new file mode 100644 index 0000000..e25bd0b --- /dev/null +++ b/cups/dir.c @@ -0,0 +1,472 @@ +/* + * "$Id: dir.c 9306 2010-09-16 21:43:57Z mike $" + * + * Directory routines for CUPS. + * + * This set of APIs abstracts enumeration of directory entries. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * _cups_dir_time() - Convert a FILETIME value to a UNIX time value. + * cupsDirClose() - Close a directory. + * cupsDirOpen() - Open a directory. + * cupsDirRead() - Read the next directory entry. + * cupsDirRewind() - Rewind to the start of the directory. + * cupsDirClose() - Close a directory. + * cupsDirOpen() - Open a directory. + * cupsDirRead() - Read the next directory entry. + * cupsDirRewind() - Rewind to the start of the directory. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "debug-private.h" +#include "dir.h" + + +/* + * Windows implementation... + */ + +#ifdef WIN32 +# include + +/* + * Types and structures... + */ + +struct _cups_dir_s /**** Directory data structure ****/ +{ + char directory[1024]; /* Directory filename */ + HANDLE dir; /* Directory handle */ + cups_dentry_t entry; /* Directory entry */ +}; + + +/* + * '_cups_dir_time()' - Convert a FILETIME value to a UNIX time value. + */ + +time_t /* O - UNIX time */ +_cups_dir_time(FILETIME ft) /* I - File time */ +{ + ULONGLONG val; /* File time in 0.1 usecs */ + + + /* + * Convert file time (1/10 microseconds since Jan 1, 1601) to UNIX + * time (seconds since Jan 1, 1970). There are 11,644,732,800 seconds + * between them... + */ + + val = ft.dwLowDateTime + ((ULONGLONG)ft.dwHighDateTime << 32); + return ((time_t)(val / 10000000 - 11644732800)); +} + + +/* + * 'cupsDirClose()' - Close a directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */ +{ + /* + * Range check input... + */ + + if (!dp) + return; + + /* + * Close an open directory handle... + */ + + if (dp->dir != INVALID_HANDLE_VALUE) + FindClose(dp->dir); + + /* + * Free memory used... + */ + + free(dp); +} + + +/* + * 'cupsDirOpen()' - Open a directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */ +cupsDirOpen(const char *directory) /* I - Directory name */ +{ + cups_dir_t *dp; /* Directory */ + + + /* + * Range check input... + */ + + if (!directory) + return (NULL); + + /* + * Allocate memory for the directory structure... + */ + + dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t)); + if (!dp) + return (NULL); + + /* + * Copy the directory name for later use... + */ + + dp->dir = INVALID_HANDLE_VALUE; + + strlcpy(dp->directory, directory, sizeof(dp->directory)); + + /* + * Return the new directory structure... + */ + + return (dp); +} + + +/* + * 'cupsDirRead()' - Read the next directory entry. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_dentry_t * /* O - Directory entry or @code NULL@ if there are no more */ +cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */ +{ + WIN32_FIND_DATA entry; /* Directory entry data */ + + + /* + * Range check input... + */ + + if (!dp) + return (NULL); + + /* + * See if we have already started finding files... + */ + + if (dp->dir == INVALID_HANDLE_VALUE) + { + /* + * No, find the first file... + */ + + dp->dir = FindFirstFile(dp->directory, &entry); + if (dp->dir == INVALID_HANDLE_VALUE) + return (NULL); + } + else if (!FindNextFile(dp->dir, &entry)) + return (NULL); + + /* + * Copy the name over and convert the file information... + */ + + strlcpy(dp->entry.filename, entry.cFileName, sizeof(dp->entry.filename)); + + if (entry.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + dp->entry.fileinfo.st_mode = 0755 | S_IFDIR; + else + dp->entry.fileinfo.st_mode = 0644; + + dp->entry.fileinfo.st_atime = _cups_dir_time(entry.ftLastAccessTime); + dp->entry.fileinfo.st_ctime = _cups_dir_time(entry.ftCreationTime); + dp->entry.fileinfo.st_mtime = _cups_dir_time(entry.ftLastWriteTime); + dp->entry.fileinfo.st_size = entry.nFileSizeLow + ((unsigned long long)entry.nFileSizeHigh << 32); + + /* + * Return the entry... + */ + + return (&(dp->entry)); +} + + +/* + * 'cupsDirRewind()' - Rewind to the start of the directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */ +{ + /* + * Range check input... + */ + + if (!dp) + return; + + /* + * Close an open directory handle... + */ + + if (dp->dir != INVALID_HANDLE_VALUE) + { + FindClose(dp->dir); + dp->dir = INVALID_HANDLE_VALUE; + } +} + + +#else + +/* + * POSIX implementation... + */ + +# include +# include + + +/* + * Types and structures... + */ + +struct _cups_dir_s /**** Directory data structure ****/ +{ + char directory[1024]; /* Directory filename */ + DIR *dir; /* Directory file */ + cups_dentry_t entry; /* Directory entry */ +}; + + +/* + * 'cupsDirClose()' - Close a directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsDirClose(cups_dir_t *dp) /* I - Directory pointer */ +{ + DEBUG_printf(("cupsDirClose(dp=%p)", dp)); + + /* + * Range check input... + */ + + if (!dp) + return; + + /* + * Close the directory and free memory... + */ + + closedir(dp->dir); + free(dp); +} + + +/* + * 'cupsDirOpen()' - Open a directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_dir_t * /* O - Directory pointer or @code NULL@ if the directory could not be opened. */ +cupsDirOpen(const char *directory) /* I - Directory name */ +{ + cups_dir_t *dp; /* Directory */ + + + DEBUG_printf(("cupsDirOpen(directory=\"%s\")", directory)); + + /* + * Range check input... + */ + + if (!directory) + return (NULL); + + /* + * Allocate memory for the directory structure... + */ + + dp = (cups_dir_t *)calloc(1, sizeof(cups_dir_t)); + if (!dp) + return (NULL); + + /* + * Open the directory... + */ + + dp->dir = opendir(directory); + if (!dp->dir) + { + free(dp); + return (NULL); + } + + /* + * Copy the directory name for later use... + */ + + strlcpy(dp->directory, directory, sizeof(dp->directory)); + + /* + * Return the new directory structure... + */ + + return (dp); +} + + +/* + * 'cupsDirRead()' - Read the next directory entry. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_dentry_t * /* O - Directory entry or @code NULL@ when there are no more */ +cupsDirRead(cups_dir_t *dp) /* I - Directory pointer */ +{ + struct dirent *entry; /* Pointer to entry */ + char filename[1024]; /* Full filename */ +# ifdef HAVE_PTHREAD_H + char buffer[sizeof(struct dirent) + 1024]; + /* Directory entry buffer */ +# endif /* HAVE_PTHREAD_H */ + + + DEBUG_printf(("2cupsDirRead(dp=%p)", dp)); + + /* + * Range check input... + */ + + if (!dp) + return (NULL); + + /* + * Try reading an entry that is not "." or ".."... + */ + + for (;;) + { +# ifdef HAVE_PTHREAD_H + /* + * Read the next entry using the reentrant version of readdir... + */ + + if (readdir_r(dp->dir, (struct dirent *)buffer, &entry)) + { + DEBUG_printf(("3cupsDirRead: readdir_r() failed - %s\n", strerror(errno))); + return (NULL); + } + + if (!entry) + { + DEBUG_puts("3cupsDirRead: readdir_r() returned a NULL pointer!"); + return (NULL); + } + + DEBUG_printf(("4cupsDirRead: readdir_r() returned \"%s\"...", + entry->d_name)); + +# else + /* + * Read the next entry using the original version of readdir... + */ + + if ((entry = readdir(dp->dir)) == NULL) + { + DEBUG_puts("3cupsDirRead: readdir() returned a NULL pointer!"); + return (NULL); + } + + DEBUG_printf(("4cupsDirRead: readdir() returned \"%s\"...", entry->d_name)); + +# endif /* HAVE_PTHREAD_H */ + + /* + * Skip "." and ".."... + */ + + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + /* + * Copy the name over and get the file information... + */ + + strlcpy(dp->entry.filename, entry->d_name, sizeof(dp->entry.filename)); + + snprintf(filename, sizeof(filename), "%s/%s", dp->directory, entry->d_name); + + if (stat(filename, &(dp->entry.fileinfo))) + { + DEBUG_printf(("3cupsDirRead: stat() failed for \"%s\" - %s...", filename, + strerror(errno))); + continue; + } + + /* + * Return the entry... + */ + + return (&(dp->entry)); + } +} + + +/* + * 'cupsDirRewind()' - Rewind to the start of the directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsDirRewind(cups_dir_t *dp) /* I - Directory pointer */ +{ + DEBUG_printf(("cupsDirRewind(dp=%p)", dp)); + + /* + * Range check input... + */ + + if (!dp) + return; + + /* + * Rewind the directory... + */ + + rewinddir(dp->dir); +} + + +#endif /* WIN32 */ + +/* + * End of "$Id: dir.c 9306 2010-09-16 21:43:57Z mike $". + */ diff --git a/cups/dir.h b/cups/dir.h new file mode 100644 index 0000000..a5f9692 --- /dev/null +++ b/cups/dir.h @@ -0,0 +1,69 @@ +/* + * "$Id: dir.h 9771 2011-05-12 05:21:56Z mike $" + * + * Public directory definitions for CUPS. + * + * This set of APIs abstracts enumeration of directory entries. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_DIR_H_ +# define _CUPS_DIR_H_ + + +/* + * Include necessary headers... + */ + +# include "versioning.h" +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Data types... + */ + +typedef struct _cups_dir_s cups_dir_t; /**** Directory type ****/ + +typedef struct cups_dentry_s /**** Directory entry type ****/ +{ + char filename[260]; /* File name */ + struct stat fileinfo; /* File information */ +} cups_dentry_t; + + +/* + * Prototypes... + */ + +extern void cupsDirClose(cups_dir_t *dp) _CUPS_API_1_2; +extern cups_dir_t *cupsDirOpen(const char *directory) _CUPS_API_1_2; +extern cups_dentry_t *cupsDirRead(cups_dir_t *dp) _CUPS_API_1_2; +extern void cupsDirRewind(cups_dir_t *dp) _CUPS_API_1_2; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_DIR_H_ */ + +/* + * End of "$Id: dir.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cups/emit.c b/cups/emit.c new file mode 100644 index 0000000..539a900 --- /dev/null +++ b/cups/emit.c @@ -0,0 +1,1217 @@ +/* + * "$Id: emit.c 9993 2011-09-09 21:55:11Z mike $" + * + * PPD code emission routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ppdCollect() - Collect all marked options that reside in the + * specified section. + * ppdCollect2() - Collect all marked options that reside in the + * specified section and minimum order. + * ppdEmit() - Emit code for marked options to a file. + * ppdEmitAfterOrder() - Emit a subset of the code for marked options to a + * file. + * ppdEmitFd() - Emit code for marked options to a file. + * ppdEmitJCL() - Emit code for JCL options to a file. + * ppdEmitJCLEnd() - Emit JCLEnd code to a file. + * ppdEmitString() - Get a string containing the code for marked + * options. + * ppd_compare_cparams() - Compare the order of two custom parameters. + * ppd_handle_media() - Handle media selection... + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ + + +/* + * Local functions... + */ + +static int ppd_compare_cparams(ppd_cparam_t *a, ppd_cparam_t *b); +static void ppd_handle_media(ppd_file_t *ppd); + + +/* + * Local globals... + */ + +static const char ppd_custom_code[] = + "pop pop pop\n" + "<>setpagedevice\n"; + + +/* + * 'ppdCollect()' - Collect all marked options that reside in the specified + * section. + * + * The choices array should be freed using @code free@ when you are + * finished with it. + */ + +int /* O - Number of options marked */ +ppdCollect(ppd_file_t *ppd, /* I - PPD file data */ + ppd_section_t section, /* I - Section to collect */ + ppd_choice_t ***choices) /* O - Pointers to choices */ +{ + return (ppdCollect2(ppd, section, 0.0, choices)); +} + + +/* + * 'ppdCollect2()' - Collect all marked options that reside in the + * specified section and minimum order. + * + * The choices array should be freed using @code free@ when you are + * finished with it. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Number of options marked */ +ppdCollect2(ppd_file_t *ppd, /* I - PPD file data */ + ppd_section_t section, /* I - Section to collect */ + float min_order, /* I - Minimum OrderDependency value */ + ppd_choice_t ***choices) /* O - Pointers to choices */ +{ + ppd_choice_t *c; /* Current choice */ + ppd_section_t csection; /* Current section */ + float corder; /* Current OrderDependency value */ + int count; /* Number of choices collected */ + ppd_choice_t **collect; /* Collected choices */ + float *orders; /* Collected order values */ + + + DEBUG_printf(("ppdCollect2(ppd=%p, section=%d, min_order=%f, choices=%p)", + ppd, section, min_order, choices)); + + if (!ppd || !choices) + { + if (choices) + *choices = NULL; + + return (0); + } + + /* + * Allocate memory for up to N selected choices... + */ + + count = 0; + if ((collect = calloc(sizeof(ppd_choice_t *), + cupsArrayCount(ppd->marked))) == NULL) + { + *choices = NULL; + return (0); + } + + if ((orders = calloc(sizeof(float), cupsArrayCount(ppd->marked))) == NULL) + { + *choices = NULL; + free(collect); + return (0); + } + + /* + * Loop through all options and add choices as needed... + */ + + for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); + c; + c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) + { + csection = c->option->section; + corder = c->option->order; + + if (!strcmp(c->choice, "Custom")) + { + ppd_attr_t *attr; /* NonUIOrderDependency value */ + float aorder; /* Order value */ + char asection[17], /* Section name */ + amain[PPD_MAX_NAME + 1], + aoption[PPD_MAX_NAME]; + /* *CustomFoo and True */ + + + for (attr = ppdFindAttr(ppd, "NonUIOrderDependency", NULL); + attr; + attr = ppdFindNextAttr(ppd, "NonUIOrderDependency", NULL)) + if (attr->value && + sscanf(attr->value, "%f%16s%41s%40s", &aorder, asection, amain, + aoption) == 4 && + !strncmp(amain, "*Custom", 7) && + !strcmp(amain + 7, c->option->keyword) && !strcmp(aoption, "True")) + { + /* + * Use this NonUIOrderDependency... + */ + + corder = aorder; + + if (!strcmp(asection, "DocumentSetup")) + csection = PPD_ORDER_DOCUMENT; + else if (!strcmp(asection, "ExitServer")) + csection = PPD_ORDER_EXIT; + else if (!strcmp(asection, "JCLSetup")) + csection = PPD_ORDER_JCL; + else if (!strcmp(asection, "PageSetup")) + csection = PPD_ORDER_PAGE; + else if (!strcmp(asection, "Prolog")) + csection = PPD_ORDER_PROLOG; + else + csection = PPD_ORDER_ANY; + + break; + } + } + + if (csection == section && corder >= min_order) + { + collect[count] = c; + orders[count] = corder; + count ++; + } + } + + /* + * If we have more than 1 marked choice, sort them... + */ + + if (count > 1) + { + int i, j; /* Looping vars */ + + for (i = 0; i < (count - 1); i ++) + for (j = i + 1; j < count; j ++) + if (orders[i] > orders[j]) + { + c = collect[i]; + corder = orders[i]; + collect[i] = collect[j]; + orders[i] = orders[j]; + collect[j] = c; + orders[j] = corder; + } + } + + free(orders); + + DEBUG_printf(("2ppdCollect2: %d marked choices...", count)); + + /* + * Return the array and number of choices; if 0, free the array since + * it isn't needed. + */ + + if (count > 0) + { + *choices = collect; + return (count); + } + else + { + *choices = NULL; + free(collect); + return (0); + } +} + + +/* + * 'ppdEmit()' - Emit code for marked options to a file. + */ + +int /* O - 0 on success, -1 on failure */ +ppdEmit(ppd_file_t *ppd, /* I - PPD file record */ + FILE *fp, /* I - File to write to */ + ppd_section_t section) /* I - Section to write */ +{ + return (ppdEmitAfterOrder(ppd, fp, section, 0, 0.0)); +} + + +/* + * 'ppdEmitAfterOrder()' - Emit a subset of the code for marked options to a file. + * + * When "limit" is non-zero, this function only emits options whose + * OrderDependency value is greater than or equal to "min_order". + * + * When "limit" is zero, this function is identical to ppdEmit(). + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on failure */ +ppdEmitAfterOrder( + ppd_file_t *ppd, /* I - PPD file record */ + FILE *fp, /* I - File to write to */ + ppd_section_t section, /* I - Section to write */ + int limit, /* I - Non-zero to use min_order */ + float min_order) /* I - Lowest OrderDependency */ +{ + char *buffer; /* Option code */ + int status; /* Return status */ + + + /* + * Range check input... + */ + + if (!ppd || !fp) + return (-1); + + /* + * Get the string... + */ + + buffer = ppdEmitString(ppd, section, limit ? min_order : 0.0f); + + /* + * Write it as needed and return... + */ + + if (buffer) + { + status = fputs(buffer, fp) < 0 ? -1 : 0; + + free(buffer); + } + else + status = 0; + + return (status); +} + + +/* + * 'ppdEmitFd()' - Emit code for marked options to a file. + */ + +int /* O - 0 on success, -1 on failure */ +ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */ + int fd, /* I - File to write to */ + ppd_section_t section) /* I - Section to write */ +{ + char *buffer, /* Option code */ + *bufptr; /* Pointer into code */ + size_t buflength; /* Length of option code */ + ssize_t bytes; /* Bytes written */ + int status; /* Return status */ + + + /* + * Range check input... + */ + + if (!ppd || fd < 0) + return (-1); + + /* + * Get the string... + */ + + buffer = ppdEmitString(ppd, section, 0.0); + + /* + * Write it as needed and return... + */ + + if (buffer) + { + buflength = strlen(buffer); + bufptr = buffer; + bytes = 0; + + while (buflength > 0) + { +#ifdef WIN32 + if ((bytes = (ssize_t)write(fd, bufptr, (unsigned)buflength)) < 0) +#else + if ((bytes = write(fd, bufptr, buflength)) < 0) +#endif /* WIN32 */ + { + if (errno == EAGAIN || errno == EINTR) + continue; + + break; + } + + buflength -= bytes; + bufptr += bytes; + } + + status = bytes < 0 ? -1 : 0; + + free(buffer); + } + else + status = 0; + + return (status); +} + + +/* + * 'ppdEmitJCL()' - Emit code for JCL options to a file. + */ + +int /* O - 0 on success, -1 on failure */ +ppdEmitJCL(ppd_file_t *ppd, /* I - PPD file record */ + FILE *fp, /* I - File to write to */ + int job_id, /* I - Job ID */ + const char *user, /* I - Username */ + const char *title) /* I - Title */ +{ + char *ptr; /* Pointer into JCL string */ + char temp[65], /* Local title string */ + displaymsg[33]; /* Local display string */ + + + /* + * Range check the input... + */ + + if (!ppd || !ppd->jcl_begin || !ppd->jcl_ps) + return (0); + + /* + * See if the printer supports HP PJL... + */ + + if (!strncmp(ppd->jcl_begin, "\033%-12345X@", 10)) + { + /* + * This printer uses HP PJL commands for output; filter the output + * so that we only have a single "@PJL JOB" command in the header... + * + * To avoid bugs in the PJL implementation of certain vendors' products + * (Xerox in particular), we add a dummy "@PJL" command at the beginning + * of the PJL commands to initialize PJL processing. + */ + + ppd_attr_t *charset; /* PJL charset */ + ppd_attr_t *display; /* PJL display command */ + + + if ((charset = ppdFindAttr(ppd, "cupsPJLCharset", NULL)) != NULL) + { + if (!charset->value || _cups_strcasecmp(charset->value, "UTF-8")) + charset = NULL; + } + + if ((display = ppdFindAttr(ppd, "cupsPJLDisplay", NULL)) != NULL) + { + if (!display->value) + display = NULL; + } + + fputs("\033%-12345X@PJL\n", fp); + for (ptr = ppd->jcl_begin + 9; *ptr;) + if (!strncmp(ptr, "@PJL JOB", 8)) + { + /* + * Skip job command... + */ + + for (;*ptr; ptr ++) + if (*ptr == '\n') + break; + + if (*ptr) + ptr ++; + } + else + { + /* + * Copy line... + */ + + for (;*ptr; ptr ++) + { + putc(*ptr, fp); + if (*ptr == '\n') + break; + } + + if (*ptr) + ptr ++; + } + + /* + * Clean up the job title... + */ + + if ((ptr = strrchr(title, '/')) != NULL) + { + /* + * Only show basename of file path... + */ + + title = ptr + 1; + } + + if (!strncmp(title, "smbprn.", 7)) + { + /* + * Skip leading smbprn.######## from Samba jobs... + */ + + for (title += 7; *title && isdigit(*title & 255); title ++); + while (_cups_isspace(*title)) + title ++; + + if ((ptr = strstr(title, " - ")) != NULL) + { + /* + * Skip application name in "Some Application - Title of job"... + */ + + title = ptr + 3; + } + } + + /* + * Replace double quotes with single quotes and UTF-8 characters with + * question marks so that the title does not cause a PJL syntax error. + */ + + strlcpy(temp, title, sizeof(temp)); + + for (ptr = temp; *ptr; ptr ++) + if (*ptr == '\"') + *ptr = '\''; + else if (!charset && (*ptr & 128)) + *ptr = '?'; + + /* + * CUPS STR #3125: Long PJL JOB NAME causes problems with some printers + * + * Generate the display message, truncating at 32 characters + nul to avoid + * issues with some printer's PJL implementations... + */ + + snprintf(displaymsg, sizeof(displaymsg), "%d %s %s", job_id, user, temp); + + /* + * Send PJL JOB and PJL RDYMSG commands before we enter PostScript mode... + */ + + if (display && strcmp(display->value, "job")) + { + fprintf(fp, "@PJL JOB NAME = \"%s\"\n", temp); + + if (display && !strcmp(display->value, "rdymsg")) + fprintf(fp, "@PJL RDYMSG DISPLAY = \"%s\"\n", displaymsg); + } + else + fprintf(fp, "@PJL JOB NAME = \"%s\" DISPLAY = \"%s\"\n", temp, + displaymsg); + } + else + fputs(ppd->jcl_begin, fp); + + ppdEmit(ppd, fp, PPD_ORDER_JCL); + fputs(ppd->jcl_ps, fp); + + return (0); +} + + +/* + * 'ppdEmitJCLEnd()' - Emit JCLEnd code to a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on failure */ +ppdEmitJCLEnd(ppd_file_t *ppd, /* I - PPD file record */ + FILE *fp) /* I - File to write to */ +{ + /* + * Range check the input... + */ + + if (!ppd) + return (0); + + if (!ppd->jcl_end) + { + if (ppd->num_filters == 0) + putc(0x04, fp); + + return (0); + } + + /* + * See if the printer supports HP PJL... + */ + + if (!strncmp(ppd->jcl_end, "\033%-12345X@", 10)) + { + /* + * This printer uses HP PJL commands for output; filter the output + * so that we only have a single "@PJL JOB" command in the header... + * + * To avoid bugs in the PJL implementation of certain vendors' products + * (Xerox in particular), we add a dummy "@PJL" command at the beginning + * of the PJL commands to initialize PJL processing. + */ + + fputs("\033%-12345X@PJL\n", fp); + fputs("@PJL RDYMSG DISPLAY = \"\"\n", fp); + fputs(ppd->jcl_end + 9, fp); + } + else + fputs(ppd->jcl_end, fp); + + return (0); +} + + +/* + * 'ppdEmitString()' - Get a string containing the code for marked options. + * + * When "min_order" is greater than zero, this function only includes options + * whose OrderDependency value is greater than or equal to "min_order". + * Otherwise, all options in the specified section are included in the + * returned string. + * + * The return string is allocated on the heap and should be freed using + * @code free@ when you are done with it. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - String containing option code or @code NULL@ if there is no option code */ +ppdEmitString(ppd_file_t *ppd, /* I - PPD file record */ + ppd_section_t section, /* I - Section to write */ + float min_order) /* I - Lowest OrderDependency */ +{ + int i, j, /* Looping vars */ + count; /* Number of choices */ + ppd_choice_t **choices; /* Choices */ + ppd_size_t *size; /* Custom page size */ + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + size_t bufsize; /* Size of string buffer needed */ + char *buffer, /* String buffer */ + *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + struct lconv *loc; /* Locale data */ + + + DEBUG_printf(("ppdEmitString(ppd=%p, section=%d, min_order=%f)", + ppd, section, min_order)); + + /* + * Range check input... + */ + + if (!ppd) + return (NULL); + + /* + * Use PageSize or PageRegion as required... + */ + + ppd_handle_media(ppd); + + /* + * Collect the options we need to emit... + */ + + if ((count = ppdCollect2(ppd, section, min_order, &choices)) == 0) + return (NULL); + + /* + * Count the number of bytes that are required to hold all of the + * option code... + */ + + for (i = 0, bufsize = 1; i < count; i ++) + { + if (section == PPD_ORDER_JCL) + { + if (!_cups_strcasecmp(choices[i]->choice, "Custom") && + (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) + != NULL) + { + /* + * Add space to account for custom parameter substitution... + */ + + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_POINTS : + case PPD_CUSTOM_REAL : + case PPD_CUSTOM_INT : + bufsize += 10; + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + if (cparam->current.custom_string) + bufsize += strlen(cparam->current.custom_string); + break; + } + } + } + } + else if (section != PPD_ORDER_EXIT) + { + bufsize += 3; /* [{\n */ + + if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") || + !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) && + !_cups_strcasecmp(choices[i]->choice, "Custom")) + { + DEBUG_puts("2ppdEmitString: Custom size set!"); + + bufsize += 37; /* %%BeginFeature: *CustomPageSize True\n */ + bufsize += 50; /* Five 9-digit numbers + newline */ + } + else if (!_cups_strcasecmp(choices[i]->choice, "Custom") && + (coption = ppdFindCustomOption(ppd, + choices[i]->option->keyword)) + != NULL) + { + bufsize += 23 + strlen(choices[i]->option->keyword) + 6; + /* %%BeginFeature: *Customkeyword True\n */ + + + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_POINTS : + case PPD_CUSTOM_REAL : + case PPD_CUSTOM_INT : + bufsize += 10; + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + bufsize += 3; + if (cparam->current.custom_string) + bufsize += 4 * strlen(cparam->current.custom_string); + break; + } + } + } + else + bufsize += 17 + strlen(choices[i]->option->keyword) + 1 + + strlen(choices[i]->choice) + 1; + /* %%BeginFeature: *keyword choice\n */ + + bufsize += 13; /* %%EndFeature\n */ + bufsize += 22; /* } stopped cleartomark\n */ + } + + if (choices[i]->code) + bufsize += strlen(choices[i]->code) + 1; + else + bufsize += strlen(ppd_custom_code); + } + + /* + * Allocate memory... + */ + + DEBUG_printf(("2ppdEmitString: Allocating %d bytes for string...", + (int)bufsize)); + + if ((buffer = calloc(1, bufsize)) == NULL) + { + free(choices); + return (NULL); + } + + bufend = buffer + bufsize - 1; + loc = localeconv(); + + /* + * Copy the option code to the buffer... + */ + + for (i = 0, bufptr = buffer; i < count; i ++, bufptr += strlen(bufptr)) + if (section == PPD_ORDER_JCL) + { + if (!_cups_strcasecmp(choices[i]->choice, "Custom") && + choices[i]->code && + (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) + != NULL) + { + /* + * Handle substitutions in custom JCL options... + */ + + char *cptr; /* Pointer into code */ + int pnum; /* Parameter number */ + + + for (cptr = choices[i]->code; *cptr && bufptr < bufend;) + { + if (*cptr == '\\') + { + cptr ++; + + if (isdigit(*cptr & 255)) + { + /* + * Substitute parameter... + */ + + pnum = *cptr++ - '0'; + while (isdigit(*cptr & 255)) + pnum = pnum * 10 + *cptr++ - '0'; + + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + if (cparam->order == pnum) + break; + + if (cparam) + { + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_POINTS : + case PPD_CUSTOM_REAL : + bufptr = _cupsStrFormatd(bufptr, bufend, + cparam->current.custom_real, + loc); + break; + + case PPD_CUSTOM_INT : + snprintf(bufptr, bufend - bufptr, "%d", + cparam->current.custom_int); + bufptr += strlen(bufptr); + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + if (cparam->current.custom_string) + { + strlcpy(bufptr, cparam->current.custom_string, + bufend - bufptr); + bufptr += strlen(bufptr); + } + break; + } + } + } + else if (*cptr) + *bufptr++ = *cptr++; + } + else + *bufptr++ = *cptr++; + } + } + else + { + /* + * Otherwise just copy the option code directly... + */ + + strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1); + bufptr += strlen(bufptr); + } + } + else if (section != PPD_ORDER_EXIT) + { + /* + * Add wrapper commands to prevent printer errors for unsupported + * options... + */ + + strlcpy(bufptr, "[{\n", bufend - bufptr + 1); + bufptr += 3; + + /* + * Send DSC comments with option... + */ + + DEBUG_printf(("2ppdEmitString: Adding code for %s=%s...", + choices[i]->option->keyword, choices[i]->choice)); + + if ((!_cups_strcasecmp(choices[i]->option->keyword, "PageSize") || + !_cups_strcasecmp(choices[i]->option->keyword, "PageRegion")) && + !_cups_strcasecmp(choices[i]->choice, "Custom")) + { + /* + * Variable size; write out standard size options, using the + * parameter positions defined in the PPD file... + */ + + ppd_attr_t *attr; /* PPD attribute */ + int pos, /* Position of custom value */ + orientation; /* Orientation to use */ + float values[5]; /* Values for custom command */ + + + strlcpy(bufptr, "%%BeginFeature: *CustomPageSize True\n", + bufend - bufptr + 1); + bufptr += 37; + + size = ppdPageSize(ppd, "Custom"); + + memset(values, 0, sizeof(values)); + + if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Width")) != NULL) + { + pos = atoi(attr->value) - 1; + + if (pos < 0 || pos > 4) + pos = 0; + } + else + pos = 0; + + values[pos] = size->width; + + if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", "Height")) != NULL) + { + pos = atoi(attr->value) - 1; + + if (pos < 0 || pos > 4) + pos = 1; + } + else + pos = 1; + + values[pos] = size->length; + + /* + * According to the Adobe PPD specification, an orientation of 1 + * will produce a print that comes out upside-down with the X + * axis perpendicular to the direction of feed, which is exactly + * what we want to be consistent with non-PS printers. + * + * We could also use an orientation of 3 to produce output that + * comes out rightside-up (this is the default for many large format + * printer PPDs), however for consistency we will stick with the + * value 1. + * + * If we wanted to get fancy, we could use orientations of 0 or + * 2 and swap the width and length, however we don't want to get + * fancy, we just want it to work consistently. + * + * The orientation value is range limited by the Orientation + * parameter definition, so certain non-PS printer drivers that + * only support an Orientation of 0 will get the value 0 as + * expected. + */ + + orientation = 1; + + if ((attr = ppdFindAttr(ppd, "ParamCustomPageSize", + "Orientation")) != NULL) + { + int min_orient, max_orient; /* Minimum and maximum orientations */ + + + if (sscanf(attr->value, "%d%*s%d%d", &pos, &min_orient, + &max_orient) != 3) + pos = 4; + else + { + pos --; + + if (pos < 0 || pos > 4) + pos = 4; + + if (orientation > max_orient) + orientation = max_orient; + else if (orientation < min_orient) + orientation = min_orient; + } + } + else + pos = 4; + + values[pos] = (float)orientation; + + for (pos = 0; pos < 5; pos ++) + { + bufptr = _cupsStrFormatd(bufptr, bufend, values[pos], loc); + *bufptr++ = '\n'; + } + + if (!choices[i]->code) + { + /* + * This can happen with certain buggy PPD files that don't include + * a CustomPageSize command sequence... We just use a generic + * Level 2 command sequence... + */ + + strlcpy(bufptr, ppd_custom_code, bufend - bufptr + 1); + bufptr += strlen(bufptr); + } + } + else if (!_cups_strcasecmp(choices[i]->choice, "Custom") && + (coption = ppdFindCustomOption(ppd, choices[i]->option->keyword)) + != NULL) + { + /* + * Custom option... + */ + + const char *s; /* Pointer into string value */ + cups_array_t *params; /* Parameters in the correct output order */ + + + params = cupsArrayNew((cups_array_func_t)ppd_compare_cparams, NULL); + + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + cupsArrayAdd(params, cparam); + + snprintf(bufptr, bufend - bufptr + 1, + "%%%%BeginFeature: *Custom%s True\n", coption->keyword); + bufptr += strlen(bufptr); + + for (cparam = (ppd_cparam_t *)cupsArrayFirst(params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(params)) + { + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_POINTS : + case PPD_CUSTOM_REAL : + bufptr = _cupsStrFormatd(bufptr, bufend, + cparam->current.custom_real, loc); + *bufptr++ = '\n'; + break; + + case PPD_CUSTOM_INT : + snprintf(bufptr, bufend - bufptr + 1, "%d\n", + cparam->current.custom_int); + bufptr += strlen(bufptr); + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + *bufptr++ = '('; + + if (cparam->current.custom_string) + { + for (s = cparam->current.custom_string; *s; s ++) + { + if (*s < ' ' || *s == '(' || *s == ')' || *s >= 127) + { + snprintf(bufptr, bufend - bufptr + 1, "\\%03o", *s & 255); + bufptr += strlen(bufptr); + } + else + *bufptr++ = *s; + } + } + + *bufptr++ = ')'; + *bufptr++ = '\n'; + break; + } + } + + cupsArrayDelete(params); + } + else + { + snprintf(bufptr, bufend - bufptr + 1, "%%%%BeginFeature: *%s %s\n", + choices[i]->option->keyword, choices[i]->choice); + bufptr += strlen(bufptr); + } + + if (choices[i]->code && choices[i]->code[0]) + { + j = (int)strlen(choices[i]->code); + memcpy(bufptr, choices[i]->code, j); + bufptr += j; + + if (choices[i]->code[j - 1] != '\n') + *bufptr++ = '\n'; + } + + strlcpy(bufptr, "%%EndFeature\n" + "} stopped cleartomark\n", bufend - bufptr + 1); + bufptr += strlen(bufptr); + + DEBUG_printf(("2ppdEmitString: Offset in string is %d...", + (int)(bufptr - buffer))); + } + else + { + strlcpy(bufptr, choices[i]->code, bufend - bufptr + 1); + bufptr += strlen(bufptr); + } + + /* + * Nul-terminate, free, and return... + */ + + *bufptr = '\0'; + + free(choices); + + return (buffer); +} + + +/* + * 'ppd_compare_cparams()' - Compare the order of two custom parameters. + */ + +static int /* O - Result of comparison */ +ppd_compare_cparams(ppd_cparam_t *a, /* I - First parameter */ + ppd_cparam_t *b) /* I - Second parameter */ +{ + return (a->order - b->order); +} + + +/* + * 'ppd_handle_media()' - Handle media selection... + */ + +static void +ppd_handle_media(ppd_file_t *ppd) /* I - PPD file */ +{ + ppd_choice_t *manual_feed, /* ManualFeed choice, if any */ + *input_slot; /* InputSlot choice, if any */ + ppd_size_t *size; /* Current media size */ + ppd_attr_t *rpr; /* RequiresPageRegion value */ + + + /* + * This function determines what page size code to use, if any, for the + * current media size, InputSlot, and ManualFeed selections. + * + * We use the PageSize code if: + * + * 1. A custom media size is selected. + * 2. ManualFeed and InputSlot are not selected (or do not exist). + * 3. ManualFeed is selected but is False and InputSlot is not selected or + * the selection has no code - the latter check done to support "auto" or + * "printer default" InputSlot options. + * + * We use the PageRegion code if: + * + * 4. RequiresPageRegion does not exist and the PPD contains cupsFilter + * keywords, indicating this is a CUPS-based driver. + * 5. RequiresPageRegion exists for the selected InputSlot (or "All" for any + * InputSlot or ManualFeed selection) and is True. + * + * If none of the 5 conditions are true, no page size code is used and we + * unmark any existing PageSize or PageRegion choices. + */ + + if ((size = ppdPageSize(ppd, NULL)) == NULL) + return; + + manual_feed = ppdFindMarkedChoice(ppd, "ManualFeed"); + input_slot = ppdFindMarkedChoice(ppd, "InputSlot"); + + if (input_slot != NULL) + rpr = ppdFindAttr(ppd, "RequiresPageRegion", input_slot->choice); + else + rpr = NULL; + + if (!rpr) + rpr = ppdFindAttr(ppd, "RequiresPageRegion", "All"); + + if (!_cups_strcasecmp(size->name, "Custom") || + (!manual_feed && !input_slot) || + (manual_feed && !_cups_strcasecmp(manual_feed->choice, "False") && + (!input_slot || (input_slot->code && !input_slot->code[0]))) || + (!rpr && ppd->num_filters > 0)) + { + /* + * Use PageSize code... + */ + + ppdMarkOption(ppd, "PageSize", size->name); + } + else if (rpr && rpr->value && !_cups_strcasecmp(rpr->value, "True")) + { + /* + * Use PageRegion code... + */ + + ppdMarkOption(ppd, "PageRegion", size->name); + } + else + { + /* + * Do not use PageSize or PageRegion code... + */ + + ppd_choice_t *page; /* PageSize/Region choice, if any */ + + if ((page = ppdFindMarkedChoice(ppd, "PageSize")) != NULL) + { + /* + * Unmark PageSize... + */ + + page->marked = 0; + cupsArrayRemove(ppd->marked, page); + } + + if ((page = ppdFindMarkedChoice(ppd, "PageRegion")) != NULL) + { + /* + * Unmark PageRegion... + */ + + page->marked = 0; + cupsArrayRemove(ppd->marked, page); + } + } +} + + +/* + * End of "$Id: emit.c 9993 2011-09-09 21:55:11Z mike $". + */ diff --git a/cups/encode.c b/cups/encode.c new file mode 100644 index 0000000..adb3d9e --- /dev/null +++ b/cups/encode.c @@ -0,0 +1,636 @@ +/* + * "$Id: encode.c 9793 2011-05-20 03:49:49Z mike $" + * + * Option encoding routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsEncodeOptions() - Encode printer options into IPP attributes. + * cupsEncodeOptions2() - Encode printer options into IPP attributes for + * a group. + * _ippFindOption() - Find the attribute information for an option. + * compare_ipp_options() - Compare two IPP options. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * Local list of option names and the value tags they should use... + * + * **** THIS LIST MUST BE SORTED **** + */ + +static const _ipp_option_t ipp_options[] = +{ + { 1, "auth-info", IPP_TAG_TEXT, IPP_TAG_JOB }, + { 1, "auth-info-required", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "blackplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "blackplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "brightness", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "brightness-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "columns", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "columns-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "compression", IPP_TAG_KEYWORD, IPP_TAG_OPERATION }, + { 0, "copies", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "copies-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "device-uri", IPP_TAG_URI, IPP_TAG_PRINTER }, + { 0, "document-format", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION }, + { 0, "document-format-default", IPP_TAG_MIMETYPE, IPP_TAG_PRINTER }, + { 1, "exclude-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION }, + { 1, "finishings", IPP_TAG_ENUM, IPP_TAG_JOB }, + { 1, "finishings-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, + { 0, "fit-to-page", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "fit-to-page-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "fitplot", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "fitplot-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "gamma", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "gamma-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "hue", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "hue-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "include-schemes", IPP_TAG_NAME, IPP_TAG_OPERATION }, + { 0, "job-impressions", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "job-k-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "job-page-limit", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "job-priority", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "job-quota-period", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "job-sheets", IPP_TAG_NAME, IPP_TAG_JOB }, + { 1, "job-sheets-default", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "job-uuid", IPP_TAG_URI, IPP_TAG_JOB }, + { 0, "landscape", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 1, "marker-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "marker-colors", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 1, "marker-high-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "marker-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "marker-low-levels", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "marker-message", IPP_TAG_TEXT, IPP_TAG_PRINTER }, + { 1, "marker-names", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 1, "marker-types", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 1, "media", IPP_TAG_KEYWORD, IPP_TAG_JOB }, + { 0, "media-col", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB }, + { 0, "media-col-default", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_PRINTER }, + { 0, "media-color", IPP_TAG_KEYWORD, IPP_TAG_JOB }, + { 1, "media-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "media-key", IPP_TAG_KEYWORD, IPP_TAG_JOB }, + { 0, "media-size", IPP_TAG_BEGIN_COLLECTION, IPP_TAG_JOB }, + { 0, "media-type", IPP_TAG_KEYWORD, IPP_TAG_JOB }, + { 0, "mirror", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "mirror-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "natural-scaling", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "natural-scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "notify-charset", IPP_TAG_CHARSET, IPP_TAG_SUBSCRIPTION }, + { 1, "notify-events", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION }, + { 1, "notify-events-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "notify-lease-duration", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION }, + { 0, "notify-lease-duration-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "notify-natural-language", IPP_TAG_LANGUAGE, IPP_TAG_SUBSCRIPTION }, + { 0, "notify-pull-method", IPP_TAG_KEYWORD, IPP_TAG_SUBSCRIPTION }, + { 0, "notify-recipient-uri", IPP_TAG_URI, IPP_TAG_SUBSCRIPTION }, + { 0, "notify-time-interval", IPP_TAG_INTEGER, IPP_TAG_SUBSCRIPTION }, + { 0, "notify-user-data", IPP_TAG_STRING, IPP_TAG_SUBSCRIPTION }, + { 0, "number-up", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "number-up-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "orientation-requested", IPP_TAG_ENUM, IPP_TAG_JOB }, + { 0, "orientation-requested-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, + { 0, "page-bottom", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "page-bottom-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "page-left", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "page-left-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "page-ranges", IPP_TAG_RANGE, IPP_TAG_JOB }, + { 1, "page-ranges-default", IPP_TAG_RANGE, IPP_TAG_PRINTER }, + { 0, "page-right", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "page-right-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "page-top", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "page-top-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "penwidth", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "penwidth-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "port-monitor", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "ppd-name", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "ppi", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "ppi-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "prettyprint", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "prettyprint-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "print-quality", IPP_TAG_ENUM, IPP_TAG_JOB }, + { 0, "print-quality-default", IPP_TAG_ENUM, IPP_TAG_PRINTER }, + { 1, "printer-commands", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "printer-error-policy", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "printer-info", IPP_TAG_TEXT, IPP_TAG_PRINTER }, + { 0, "printer-is-accepting-jobs", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "printer-is-shared", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "printer-location", IPP_TAG_TEXT, IPP_TAG_PRINTER }, + { 0, "printer-make-and-model", IPP_TAG_TEXT, IPP_TAG_PRINTER }, + { 0, "printer-more-info", IPP_TAG_URI, IPP_TAG_PRINTER }, + { 0, "printer-op-policy", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "printer-resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB }, + { 0, "printer-state", IPP_TAG_ENUM, IPP_TAG_PRINTER }, + { 0, "printer-state-change-time", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 1, "printer-state-reasons", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "printer-type", IPP_TAG_ENUM, IPP_TAG_PRINTER }, + { 0, "printer-uri", IPP_TAG_URI, IPP_TAG_OPERATION }, + { 1, "printer-uri-supported", IPP_TAG_URI, IPP_TAG_PRINTER }, + { 0, "queued-job-count", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "raw", IPP_TAG_MIMETYPE, IPP_TAG_OPERATION }, + { 1, "requested-attributes", IPP_TAG_NAME, IPP_TAG_OPERATION }, + { 1, "requesting-user-name-allowed", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 1, "requesting-user-name-denied", IPP_TAG_NAME, IPP_TAG_PRINTER }, + { 0, "resolution", IPP_TAG_RESOLUTION, IPP_TAG_JOB }, + { 0, "resolution-default", IPP_TAG_RESOLUTION, IPP_TAG_PRINTER }, + { 0, "saturation", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "saturation-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "scaling", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "scaling-default", IPP_TAG_INTEGER, IPP_TAG_PRINTER }, + { 0, "sides", IPP_TAG_KEYWORD, IPP_TAG_JOB }, + { 0, "sides-default", IPP_TAG_KEYWORD, IPP_TAG_PRINTER }, + { 0, "wrap", IPP_TAG_BOOLEAN, IPP_TAG_JOB }, + { 0, "wrap-default", IPP_TAG_BOOLEAN, IPP_TAG_PRINTER }, + { 0, "x-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB }, + { 0, "y-dimension", IPP_TAG_INTEGER, IPP_TAG_JOB } +}; + + +/* + * Local functions... + */ + +static int compare_ipp_options(_ipp_option_t *a, _ipp_option_t *b); + + +/* + * 'cupsEncodeOptions()' - Encode printer options into IPP attributes. + * + * This function adds operation, job, and then subscription attributes, + * in that order. Use the cupsEncodeOptions2() function to add attributes + * for a single group. + */ + +void +cupsEncodeOptions(ipp_t *ipp, /* I - Request to add to */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + DEBUG_printf(("cupsEncodeOptions(%p, %d, %p)", ipp, num_options, options)); + + /* + * Add the options in the proper groups & order... + */ + + cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_OPERATION); + cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_JOB); + cupsEncodeOptions2(ipp, num_options, options, IPP_TAG_SUBSCRIPTION); +} + + +/* + * 'cupsEncodeOptions2()' - Encode printer options into IPP attributes for a group. + * + * This function only adds attributes for a single group. Call this + * function multiple times for each group, or use cupsEncodeOptions() + * to add the standard groups. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +cupsEncodeOptions2( + ipp_t *ipp, /* I - Request to add to */ + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + ipp_tag_t group_tag) /* I - Group to encode */ +{ + int i, j; /* Looping vars */ + int count; /* Number of values */ + char *s, /* Pointer into option value */ + *val, /* Pointer to option value */ + *copy, /* Copy of option value */ + *sep, /* Option separator */ + quote; /* Quote character */ + ipp_attribute_t *attr; /* IPP attribute */ + ipp_tag_t value_tag; /* IPP value tag */ + cups_option_t *option; /* Current option */ + ipp_t *collection; /* Collection value */ + int num_cols; /* Number of collection values */ + cups_option_t *cols; /* Collection values */ + + + DEBUG_printf(("cupsEncodeOptions2(ipp=%p, num_options=%d, options=%p, " + "group_tag=%x)", ipp, num_options, options, group_tag)); + + /* + * Range check input... + */ + + if (!ipp || num_options < 1 || !options) + return; + + /* + * Do special handling for the document-format/raw options... + */ + + if (group_tag == IPP_TAG_OPERATION) + { + /* + * Handle the document format stuff first... + */ + + if ((val = (char *)cupsGetOption("document-format", num_options, options)) != NULL) + ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", + NULL, val); + else if (cupsGetOption("raw", num_options, options)) + ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", + NULL, "application/vnd.cups-raw"); + else + ippAddString(ipp, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format", + NULL, "application/octet-stream"); + } + + /* + * Then loop through the options... + */ + + for (i = num_options, option = options; i > 0; i --, option ++) + { + _ipp_option_t *match; /* Matching attribute */ + + + /* + * Skip document format options that are handled above... + */ + + if (!_cups_strcasecmp(option->name, "raw") || + !_cups_strcasecmp(option->name, "document-format") || + !option->name[0]) + continue; + + /* + * Figure out the proper value and group tags for this option... + */ + + if ((match = _ippFindOption(option->name)) != NULL) + { + if (match->group_tag != group_tag) + continue; + + value_tag = match->value_tag; + } + else + { + int namelen; /* Length of name */ + + + namelen = (int)strlen(option->name); + + if (namelen < 9 || strcmp(option->name + namelen - 8, "-default")) + { + if (group_tag != IPP_TAG_JOB) + continue; + } + else if (group_tag != IPP_TAG_PRINTER) + continue; + + if (!_cups_strcasecmp(option->value, "true") || + !_cups_strcasecmp(option->value, "false")) + value_tag = IPP_TAG_BOOLEAN; + else + value_tag = IPP_TAG_NAME; + } + + /* + * Count the number of values... + */ + + if (match && match->multivalue) + { + for (count = 1, sep = option->value, quote = 0; *sep; sep ++) + { + if (*sep == quote) + quote = 0; + else if (!quote && (*sep == '\'' || *sep == '\"')) + { + /* + * Skip quoted option value... + */ + + quote = *sep++; + } + else if (*sep == ',' && !quote) + count ++; + else if (*sep == '\\' && sep[1]) + sep ++; + } + } + else + count = 1; + + DEBUG_printf(("2cupsEncodeOptions2: option=\"%s\", count=%d", + option->name, count)); + + /* + * Allocate memory for the attribute values... + */ + + if ((attr = _ippAddAttr(ipp, count)) == NULL) + { + /* + * Ran out of memory! + */ + + DEBUG_puts("1cupsEncodeOptions2: Ran out of memory for attributes!"); + return; + } + + /* + * Now figure out what type of value we have... + */ + + attr->group_tag = group_tag; + attr->value_tag = value_tag; + + /* + * Copy the name over... + */ + + attr->name = _cupsStrAlloc(option->name); + + if (count > 1) + { + /* + * Make a copy of the value we can fiddle with... + */ + + if ((copy = strdup(option->value)) == NULL) + { + /* + * Ran out of memory! + */ + + DEBUG_puts("1cupsEncodeOptions2: Ran out of memory for value copy!"); + ippDeleteAttribute(ipp, attr); + return; + } + + val = copy; + } + else + { + /* + * Since we have a single value, use the value directly... + */ + + val = option->value; + copy = NULL; + } + + /* + * Scan the value string for values... + */ + + for (j = 0, sep = val; j < count; val = sep, j ++) + { + /* + * Find the end of this value and mark it if needed... + */ + + if (count > 1) + { + for (quote = 0; *sep; sep ++) + { + if (*sep == quote) + { + /* + * Finish quoted value... + */ + + quote = 0; + } + else if (!quote && (*sep == '\'' || *sep == '\"')) + { + /* + * Handle quoted option value... + */ + + quote = *sep; + } + else if (*sep == ',' && count > 1) + break; + else if (*sep == '\\' && sep[1]) + { + /* + * Skip quoted character... + */ + + sep ++; + } + } + + if (*sep == ',') + *sep++ = '\0'; + } + + /* + * Copy the option value(s) over as needed by the type... + */ + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + /* + * Integer/enumeration value... + */ + + attr->values[j].integer = strtol(val, &s, 10); + + DEBUG_printf(("2cupsEncodeOptions2: Added integer option value " + "%d...", attr->values[j].integer)); + break; + + case IPP_TAG_BOOLEAN : + if (!_cups_strcasecmp(val, "true") || + !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes")) + { + /* + * Boolean value - true... + */ + + attr->values[j].boolean = 1; + + DEBUG_puts("2cupsEncodeOptions2: Added boolean true value..."); + } + else + { + /* + * Boolean value - false... + */ + + attr->values[j].boolean = 0; + + DEBUG_puts("2cupsEncodeOptions2: Added boolean false value..."); + } + break; + + case IPP_TAG_RANGE : + /* + * Range... + */ + + if (*val == '-') + { + attr->values[j].range.lower = 1; + s = val; + } + else + attr->values[j].range.lower = strtol(val, &s, 10); + + if (*s == '-') + { + if (s[1]) + attr->values[j].range.upper = strtol(s + 1, NULL, 10); + else + attr->values[j].range.upper = 2147483647; + } + else + attr->values[j].range.upper = attr->values[j].range.lower; + + DEBUG_printf(("2cupsEncodeOptions2: Added range option value " + "%d-%d...", attr->values[j].range.lower, + attr->values[j].range.upper)); + break; + + case IPP_TAG_RESOLUTION : + /* + * Resolution... + */ + + attr->values[j].resolution.xres = strtol(val, &s, 10); + + if (*s == 'x') + attr->values[j].resolution.yres = strtol(s + 1, &s, 10); + else + attr->values[j].resolution.yres = attr->values[j].resolution.xres; + + if (!_cups_strcasecmp(s, "dpc")) + attr->values[j].resolution.units = IPP_RES_PER_CM; + else + attr->values[j].resolution.units = IPP_RES_PER_INCH; + + DEBUG_printf(("2cupsEncodeOptions2: Added resolution option value " + "%s...", val)); + break; + + case IPP_TAG_STRING : + /* + * octet-string + */ + + attr->values[j].unknown.length = (int)strlen(val); + attr->values[j].unknown.data = strdup(val); + + DEBUG_printf(("2cupsEncodeOptions2: Added octet-string value " + "\"%s\"...", (char *)attr->values[j].unknown.data)); + break; + + case IPP_TAG_BEGIN_COLLECTION : + /* + * Collection value + */ + + num_cols = cupsParseOptions(val, 0, &cols); + if ((collection = ippNew()) == NULL) + { + cupsFreeOptions(num_cols, cols); + + if (copy) + free(copy); + + ippDeleteAttribute(ipp, attr); + return; + } + + attr->values[j].collection = collection; + cupsEncodeOptions2(collection, num_cols, cols, IPP_TAG_JOB); + cupsFreeOptions(num_cols, cols); + break; + + default : + if ((attr->values[j].string.text = _cupsStrAlloc(val)) == NULL) + { + /* + * Ran out of memory! + */ + + DEBUG_puts("1cupsEncodeOptions2: Ran out of memory for string!"); + + if (copy) + free(copy); + + ippDeleteAttribute(ipp, attr); + return; + } + + DEBUG_printf(("2cupsEncodeOptions2: Added string value \"%s\"...", + val)); + break; + } + } + + if (copy) + free(copy); + } +} + + +/* + * '_ippFindOption()' - Find the attribute information for an option. + */ + +_ipp_option_t * /* O - Attribute information */ +_ippFindOption(const char *name) /* I - Option/attribute name */ +{ + _ipp_option_t key; /* Search key */ + + + /* + * Lookup the proper value and group tags for this option... + */ + + key.name = name; + + return ((_ipp_option_t *)bsearch(&key, ipp_options, + sizeof(ipp_options) / sizeof(ipp_options[0]), + sizeof(ipp_options[0]), + (int (*)(const void *, const void *)) + compare_ipp_options)); +} + + +/* + * 'compare_ipp_options()' - Compare two IPP options. + */ + +static int /* O - Result of comparison */ +compare_ipp_options(_ipp_option_t *a, /* I - First option */ + _ipp_option_t *b) /* I - Second option */ +{ + return (strcmp(a->name, b->name)); +} + + +/* + * End of "$Id: encode.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/file-private.h b/cups/file-private.h new file mode 100644 index 0000000..b69557e --- /dev/null +++ b/cups/file-private.h @@ -0,0 +1,137 @@ +/* + * "$Id: file-private.h 9777 2011-05-13 23:04:16Z mike $" + * + * Private file definitions for CUPS. + * + * Since stdio files max out at 256 files on many systems, we have to + * write similar functions without this limit. At the same time, using + * our own file functions allows us to provide transparent support of + * gzip'd print files, PPD files, etc. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_FILE_PRIVATE_H_ +# define _CUPS_FILE_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include "cups-private.h" +# include +# include +# include +# include + +# ifdef HAVE_LIBZ +# include +# endif /* HAVE_LIBZ */ +# ifdef WIN32 +# include +# include +# endif /* WIN32 */ + + +/* + * Some operating systems support large files via open flag O_LARGEFILE... + */ + +# ifndef O_LARGEFILE +# define O_LARGEFILE 0 +# endif /* !O_LARGEFILE */ + + +/* + * Some operating systems don't define O_BINARY, which is used by Microsoft + * and IBM to flag binary files... + */ + +# ifndef O_BINARY +# define O_BINARY 0 +# endif /* !O_BINARY */ + + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Types and structures... + */ + +typedef enum /**** _cupsFileCheck return values ****/ +{ + _CUPS_FILE_CHECK_OK = 0, /* Everything OK */ + _CUPS_FILE_CHECK_MISSING = 1, /* File is missing */ + _CUPS_FILE_CHECK_PERMISSIONS = 2, /* File (or parent dir) has bad perms */ + _CUPS_FILE_CHECK_WRONG_TYPE = 3, /* File has wrong type */ + _CUPS_FILE_CHECK_RELATIVE_PATH = 4 /* File contains a relative path */ +} _cups_fc_result_t; + +typedef enum /**** _cupsFileCheck file type values ****/ +{ + _CUPS_FILE_CHECK_FILE = 0, /* Check the file and parent directory */ + _CUPS_FILE_CHECK_PROGRAM = 1, /* Check the program and parent directory */ + _CUPS_FILE_CHECK_FILE_ONLY = 2, /* Check the file only */ + _CUPS_FILE_CHECK_DIRECTORY = 3 /* Check the directory */ +} _cups_fc_filetype_t; + +typedef void (*_cups_fc_func_t)(void *context, _cups_fc_result_t result, + const char *message); + +struct _cups_file_s /**** CUPS file structure... ****/ + +{ + int fd; /* File descriptor */ + char mode, /* Mode ('r' or 'w') */ + compressed, /* Compression used? */ + is_stdio, /* stdin/out/err? */ + eof, /* End of file? */ + buf[4096], /* Buffer */ + *ptr, /* Pointer into buffer */ + *end; /* End of buffer data */ + off_t pos, /* Position in file */ + bufpos; /* File position for start of buffer */ + +#ifdef HAVE_LIBZ + z_stream stream; /* (De)compression stream */ + Bytef cbuf[4096]; /* (De)compression buffer */ + uLong crc; /* (De)compression CRC */ +#endif /* HAVE_LIBZ */ + + char *printf_buffer; /* cupsFilePrintf buffer */ + size_t printf_size; /* Size of cupsFilePrintf buffer */ +}; + + +/* + * Prototypes... + */ + +extern _cups_fc_result_t _cupsFileCheck(const char *filename, + _cups_fc_filetype_t filetype, + int dorootchecks, + _cups_fc_func_t cb, + void *context); +extern void _cupsFileCheckFilter(void *context, + _cups_fc_result_t result, + const char *message); + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_FILE_PRIVATE_H_ */ + +/* + * End of "$Id: file-private.h 9777 2011-05-13 23:04:16Z mike $". + */ diff --git a/cups/file.c b/cups/file.c new file mode 100644 index 0000000..86ad132 --- /dev/null +++ b/cups/file.c @@ -0,0 +1,2726 @@ +/* + * "$Id: file.c 9993 2011-09-09 21:55:11Z mike $" + * + * File functions for CUPS. + * + * Since stdio files max out at 256 files on many systems, we have to + * write similar functions without this limit. At the same time, using + * our own file functions allows us to provide transparent support of + * gzip'd print files, PPD files, etc. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * _cupsFileCheck() - Check the permissions of the given filename. + * _cupsFileCheckFilter() - Report file check results as CUPS filter messages. + * cupsFileClose() - Close a CUPS file. + * cupsFileCompression() - Return whether a file is compressed. + * cupsFileEOF() - Return the end-of-file status. + * cupsFileFind() - Find a file using the specified path. + * cupsFileFlush() - Flush pending output. + * cupsFileGetChar() - Get a single character from a file. + * cupsFileGetConf() - Get a line from a configuration file. + * cupsFileGetLine() - Get a CR and/or LF-terminated line that may + * contain binary data. + * cupsFileGets() - Get a CR and/or LF-terminated line. + * cupsFileLock() - Temporarily lock access to a file. + * cupsFileNumber() - Return the file descriptor associated with a CUPS + * file. + * cupsFileOpen() - Open a CUPS file. + * cupsFileOpenFd() - Open a CUPS file using a file descriptor. + * cupsFilePeekChar() - Peek at the next character from a file. + * cupsFilePrintf() - Write a formatted string. + * cupsFilePutChar() - Write a character. + * cupsFilePutConf() - Write a configuration line. + * cupsFilePuts() - Write a string. + * cupsFileRead() - Read from a file. + * cupsFileRewind() - Set the current file position to the beginning of + * the file. + * cupsFileSeek() - Seek in a file. + * cupsFileStderr() - Return a CUPS file associated with stderr. + * cupsFileStdin() - Return a CUPS file associated with stdin. + * cupsFileStdout() - Return a CUPS file associated with stdout. + * cupsFileTell() - Return the current file position. + * cupsFileUnlock() - Unlock access to a file. + * cupsFileWrite() - Write to a file. + * cups_compress() - Compress a buffer of data. + * cups_fill() - Fill the input buffer. + * cups_open() - Safely open a file for writing. + * cups_read() - Read from a file descriptor. + * cups_write() - Write to a file descriptor. + */ + +/* + * Include necessary headers... + */ + +#include "file-private.h" +#include +#include + + +/* + * Local functions... + */ + +#ifdef HAVE_LIBZ +static ssize_t cups_compress(cups_file_t *fp, const char *buf, size_t bytes); +#endif /* HAVE_LIBZ */ +static ssize_t cups_fill(cups_file_t *fp); +static int cups_open(const char *filename, int mode); +static ssize_t cups_read(cups_file_t *fp, char *buf, size_t bytes); +static ssize_t cups_write(cups_file_t *fp, const char *buf, size_t bytes); + + +#ifndef WIN32 +/* + * '_cupsFileCheck()' - Check the permissions of the given filename. + */ + +_cups_fc_result_t /* O - Check result */ +_cupsFileCheck( + const char *filename, /* I - Filename to check */ + _cups_fc_filetype_t filetype, /* I - Type of file checks? */ + int dorootchecks, /* I - Check for root permissions? */ + _cups_fc_func_t cb, /* I - Callback function */ + void *context) /* I - Context pointer for callback */ + +{ + struct stat fileinfo; /* File information */ + char message[1024], /* Message string */ + temp[1024], /* Parent directory filename */ + *ptr; /* Pointer into parent directory */ + _cups_fc_result_t result; /* Check result */ + + + /* + * Does the filename contain a relative path ("../")? + */ + + if (strstr(filename, "../")) + { + /* + * Yes, fail it! + */ + + result = _CUPS_FILE_CHECK_RELATIVE_PATH; + goto finishup; + } + + /* + * Does the program even exist and is it accessible? + */ + + if (stat(filename, &fileinfo)) + { + /* + * Nope... + */ + + result = _CUPS_FILE_CHECK_MISSING; + goto finishup; + } + + /* + * Check the execute bit... + */ + + result = _CUPS_FILE_CHECK_OK; + + switch (filetype) + { + case _CUPS_FILE_CHECK_DIRECTORY : + if (!S_ISDIR(fileinfo.st_mode)) + result = _CUPS_FILE_CHECK_WRONG_TYPE; + break; + + default : + if (!S_ISREG(fileinfo.st_mode)) + result = _CUPS_FILE_CHECK_WRONG_TYPE; + break; + } + + if (result) + goto finishup; + + /* + * Are we doing root checks? + */ + + if (!dorootchecks) + { + /* + * Nope, so anything (else) goes... + */ + + goto finishup; + } + + /* + * Verify permission of the file itself: + * + * 1. Must be owned by root + * 2. Must not be writable by group unless group is root/wheel/admin + * 3. Must not be setuid + * 4. Must not be writable by others + */ + + if (fileinfo.st_uid || /* 1. Must be owned by root */ +#ifdef __APPLE__ + ((fileinfo.st_mode & S_IWGRP) && fileinfo.st_gid && + fileinfo.st_gid != 80) || /* 2. Must not be writable by group */ +#else + ((fileinfo.st_mode & S_IWGRP) && fileinfo.st_gid) || + /* 2. Must not be writable by group */ +#endif /* __APPLE__ */ + (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ + (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ + { + result = _CUPS_FILE_CHECK_PERMISSIONS; + goto finishup; + } + + if (filetype == _CUPS_FILE_CHECK_DIRECTORY || + filetype == _CUPS_FILE_CHECK_FILE_ONLY) + goto finishup; + + /* + * Now check the containing directory... + */ + + strlcpy(temp, filename, sizeof(temp)); + if ((ptr = strrchr(temp, '/')) != NULL) + { + if (ptr == temp) + ptr[1] = '\0'; + else + *ptr = '\0'; + } + + if (stat(temp, &fileinfo)) + { + /* + * Doesn't exist?!? + */ + + result = _CUPS_FILE_CHECK_MISSING; + filetype = _CUPS_FILE_CHECK_DIRECTORY; + filename = temp; + + goto finishup; + } + + if (fileinfo.st_uid || /* 1. Must be owned by root */ +#ifdef __APPLE__ + ((fileinfo.st_mode & S_IWGRP) && fileinfo.st_gid && + fileinfo.st_gid != 80) || /* 2. Must not be writable by group */ +#else + ((fileinfo.st_mode & S_IWGRP) && fileinfo.st_gid) || + /* 2. Must not be writable by group */ +#endif /* __APPLE__ */ + (fileinfo.st_mode & S_ISUID) || /* 3. Must not be setuid */ + (fileinfo.st_mode & S_IWOTH)) /* 4. Must not be writable by others */ + { + result = _CUPS_FILE_CHECK_PERMISSIONS; + filetype = _CUPS_FILE_CHECK_DIRECTORY; + filename = temp; + } + + /* + * Common return point... + */ + + finishup: + + if (cb) + { + cups_lang_t *lang = cupsLangDefault(); + /* Localization information */ + + switch (result) + { + case _CUPS_FILE_CHECK_OK : + if (filetype == _CUPS_FILE_CHECK_DIRECTORY) + snprintf(message, sizeof(message), + _cupsLangString(lang, _("Directory \"%s\" permissions OK " + "(0%o/uid=%d/gid=%d).")), + filename, fileinfo.st_mode, (int)fileinfo.st_uid, + (int)fileinfo.st_gid); + else + snprintf(message, sizeof(message), + _cupsLangString(lang, _("File \"%s\" permissions OK " + "(0%o/uid=%d/gid=%d).")), + filename, fileinfo.st_mode, (int)fileinfo.st_uid, + (int)fileinfo.st_gid); + break; + + case _CUPS_FILE_CHECK_MISSING : + if (filetype == _CUPS_FILE_CHECK_DIRECTORY) + snprintf(message, sizeof(message), + _cupsLangString(lang, _("Directory \"%s\" not available: " + "%s")), + filename, strerror(errno)); + else + snprintf(message, sizeof(message), + _cupsLangString(lang, _("File \"%s\" not available: %s")), + filename, strerror(errno)); + break; + + case _CUPS_FILE_CHECK_PERMISSIONS : + if (filetype == _CUPS_FILE_CHECK_DIRECTORY) + snprintf(message, sizeof(message), + _cupsLangString(lang, _("Directory \"%s\" has insecure " + "permissions " + "(0%o/uid=%d/gid=%d).")), + filename, fileinfo.st_mode, (int)fileinfo.st_uid, + (int)fileinfo.st_gid); + else + snprintf(message, sizeof(message), + _cupsLangString(lang, _("File \"%s\" has insecure " + "permissions " + "(0%o/uid=%d/gid=%d).")), + filename, fileinfo.st_mode, (int)fileinfo.st_uid, + (int)fileinfo.st_gid); + break; + + case _CUPS_FILE_CHECK_WRONG_TYPE : + if (filetype == _CUPS_FILE_CHECK_DIRECTORY) + snprintf(message, sizeof(message), + _cupsLangString(lang, _("Directory \"%s\" is a file.")), + filename); + else + snprintf(message, sizeof(message), + _cupsLangString(lang, _("File \"%s\" is a directory.")), + filename); + break; + + case _CUPS_FILE_CHECK_RELATIVE_PATH : + if (filetype == _CUPS_FILE_CHECK_DIRECTORY) + snprintf(message, sizeof(message), + _cupsLangString(lang, _("Directory \"%s\" contains a " + "relative path.")), filename); + else + snprintf(message, sizeof(message), + _cupsLangString(lang, _("File \"%s\" contains a relative " + "path.")), filename); + break; + } + + (*cb)(context, result, message); + } + + return (result); +} + + +/* + * '_cupsFileCheckFilter()' - Report file check results as CUPS filter messages. + */ + +void +_cupsFileCheckFilter( + void *context, /* I - Context pointer (unused) */ + _cups_fc_result_t result, /* I - Result code */ + const char *message) /* I - Message text */ +{ + const char *prefix; /* Messaging prefix */ + + + (void)context; + + switch (result) + { + default : + case _CUPS_FILE_CHECK_OK : + prefix = "DEBUG2"; + break; + + case _CUPS_FILE_CHECK_MISSING : + case _CUPS_FILE_CHECK_WRONG_TYPE : + prefix = "ERROR"; + fputs("STATE: +cups-missing-filter-warning\n", stderr); + break; + + case _CUPS_FILE_CHECK_PERMISSIONS : + case _CUPS_FILE_CHECK_RELATIVE_PATH : + prefix = "ERROR"; + fputs("STATE: +cups-insecure-filter-warning\n", stderr); + break; + } + + fprintf(stderr, "%s: %s\n", prefix, message); +} +#endif /* !WIN32 */ + + +/* + * 'cupsFileClose()' - Close a CUPS file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsFileClose(cups_file_t *fp) /* I - CUPS file */ +{ + int fd; /* File descriptor */ + char mode; /* Open mode */ + int status; /* Return status */ + int is_stdio; /* Is a stdio file? */ + + + DEBUG_printf(("cupsFileClose(fp=%p)", fp)); + + /* + * Range check... + */ + + if (!fp) + return (-1); + + /* + * Flush pending write data... + */ + + if (fp->mode == 'w') + status = cupsFileFlush(fp); + else + status = 0; + +#ifdef HAVE_LIBZ + if (fp->compressed && status >= 0) + { + if (fp->mode == 'r') + { + /* + * Free decompression data... + */ + + inflateEnd(&fp->stream); + } + else + { + /* + * Flush any remaining compressed data... + */ + + unsigned char trailer[8]; /* Trailer CRC and length */ + int done; /* Done writing... */ + + + fp->stream.avail_in = 0; + + for (done = 0;;) + { + if (fp->stream.next_out > fp->cbuf) + { + if (cups_write(fp, (char *)fp->cbuf, + fp->stream.next_out - fp->cbuf) < 0) + status = -1; + + fp->stream.next_out = fp->cbuf; + fp->stream.avail_out = sizeof(fp->cbuf); + } + + if (done || status < 0) + break; + + done = deflate(&fp->stream, Z_FINISH) == Z_STREAM_END && + fp->stream.next_out == fp->cbuf; + } + + /* + * Write the CRC and length... + */ + + trailer[0] = fp->crc; + trailer[1] = fp->crc >> 8; + trailer[2] = fp->crc >> 16; + trailer[3] = fp->crc >> 24; + trailer[4] = fp->pos; + trailer[5] = fp->pos >> 8; + trailer[6] = fp->pos >> 16; + trailer[7] = fp->pos >> 24; + + if (cups_write(fp, (char *)trailer, 8) < 0) + status = -1; + + /* + * Free all memory used by the compression stream... + */ + + deflateEnd(&(fp->stream)); + } + } +#endif /* HAVE_LIBZ */ + + /* + * Save the file descriptor we used and free memory... + */ + + fd = fp->fd; + mode = fp->mode; + is_stdio = fp->is_stdio; + + if (fp->printf_buffer) + free(fp->printf_buffer); + + free(fp); + + /* + * Close the file, returning the close status... + */ + + if (mode == 's') + { + if (closesocket(fd) < 0) + status = -1; + } + else if (!is_stdio) + { + if (close(fd) < 0) + status = -1; + } + + return (status); +} + + +/* + * 'cupsFileCompression()' - Return whether a file is compressed. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - @code CUPS_FILE_NONE@ or @code CUPS_FILE_GZIP@ */ +cupsFileCompression(cups_file_t *fp) /* I - CUPS file */ +{ + return (fp ? fp->compressed : CUPS_FILE_NONE); +} + + +/* + * 'cupsFileEOF()' - Return the end-of-file status. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 on end of file, 0 otherwise */ +cupsFileEOF(cups_file_t *fp) /* I - CUPS file */ +{ + return (fp ? fp->eof : 1); +} + + +/* + * 'cupsFileFind()' - Find a file using the specified path. + * + * This function allows the paths in the path string to be separated by + * colons (UNIX standard) or semicolons (Windows standard) and stores the + * result in the buffer supplied. If the file cannot be found in any of + * the supplied paths, @code NULL@ is returned. A @code NULL@ path only + * matches the current directory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - Full path to file or @code NULL@ if not found */ +cupsFileFind(const char *filename, /* I - File to find */ + const char *path, /* I - Colon/semicolon-separated path */ + int executable, /* I - 1 = executable files, 0 = any file/dir */ + char *buffer, /* I - Filename buffer */ + int bufsize) /* I - Size of filename buffer */ +{ + char *bufptr, /* Current position in buffer */ + *bufend; /* End of buffer */ + + + /* + * Range check input... + */ + + DEBUG_printf(("cupsFileFind(filename=\"%s\", path=\"%s\", executable=%d, " + "buffer=%p, bufsize=%d)", filename, path, executable, buffer, + bufsize)); + + if (!filename || !buffer || bufsize < 2) + return (NULL); + + if (!path) + { + /* + * No path, so check current directory... + */ + + if (!access(filename, 0)) + { + strlcpy(buffer, filename, bufsize); + return (buffer); + } + else + return (NULL); + } + + /* + * Now check each path and return the first match... + */ + + bufend = buffer + bufsize - 1; + bufptr = buffer; + + while (*path) + { +#ifdef WIN32 + if (*path == ';' || (*path == ':' && ((bufptr - buffer) > 1 || !isalpha(buffer[0] & 255)))) +#else + if (*path == ';' || *path == ':') +#endif /* WIN32 */ + { + if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) + *bufptr++ = '/'; + + strlcpy(bufptr, filename, bufend - bufptr); + +#ifdef WIN32 + if (!access(buffer, 0)) +#else + if (!access(buffer, executable ? X_OK : 0)) +#endif /* WIN32 */ + { + DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); + return (buffer); + } + + bufptr = buffer; + } + else if (bufptr < bufend) + *bufptr++ = *path; + + path ++; + } + + /* + * Check the last path... + */ + + if (bufptr > buffer && bufptr[-1] != '/' && bufptr < bufend) + *bufptr++ = '/'; + + strlcpy(bufptr, filename, bufend - bufptr); + + if (!access(buffer, 0)) + { + DEBUG_printf(("1cupsFileFind: Returning \"%s\"", buffer)); + return (buffer); + } + else + { + DEBUG_puts("1cupsFileFind: Returning NULL"); + return (NULL); + } +} + + +/* + * 'cupsFileFlush()' - Flush pending output. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsFileFlush(cups_file_t *fp) /* I - CUPS file */ +{ + ssize_t bytes; /* Bytes to write */ + + + DEBUG_printf(("cupsFileFlush(fp=%p)", fp)); + + /* + * Range check input... + */ + + if (!fp || fp->mode != 'w') + { + DEBUG_puts("1cupsFileFlush: Attempt to flush a read-only file..."); + return (-1); + } + + bytes = (ssize_t)(fp->ptr - fp->buf); + + DEBUG_printf(("2cupsFileFlush: Flushing " CUPS_LLFMT " bytes...", + CUPS_LLCAST bytes)); + + if (bytes > 0) + { +#ifdef HAVE_LIBZ + if (fp->compressed) + bytes = cups_compress(fp, fp->buf, bytes); + else +#endif /* HAVE_LIBZ */ + bytes = cups_write(fp, fp->buf, bytes); + + if (bytes < 0) + return (-1); + + fp->ptr = fp->buf; + } + + return (0); +} + + +/* + * 'cupsFileGetChar()' - Get a single character from a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Character or -1 on end of file */ +cupsFileGetChar(cups_file_t *fp) /* I - CUPS file */ +{ + /* + * Range check input... + */ + + if (!fp || (fp->mode != 'r' && fp->mode != 's')) + { + DEBUG_puts("5cupsFileGetChar: Bad arguments!"); + return (-1); + } + + /* + * If the input buffer is empty, try to read more data... + */ + + if (fp->ptr >= fp->end) + if (cups_fill(fp) < 0) + { + DEBUG_puts("5cupsFileGetChar: Unable to fill buffer!"); + return (-1); + } + + /* + * Return the next character in the buffer... + */ + + DEBUG_printf(("5cupsFileGetChar: Returning %d...", *(fp->ptr) & 255)); + + fp->pos ++; + + DEBUG_printf(("6cupsFileGetChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (*(fp->ptr)++ & 255); +} + + +/* + * 'cupsFileGetConf()' - Get a line from a configuration file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Line read or @code NULL@ on end of file or error */ +cupsFileGetConf(cups_file_t *fp, /* I - CUPS file */ + char *buf, /* O - String buffer */ + size_t buflen, /* I - Size of string buffer */ + char **value, /* O - Pointer to value */ + int *linenum) /* IO - Current line number */ +{ + char *ptr; /* Pointer into line */ + + + /* + * Range check input... + */ + + DEBUG_printf(("2cupsFileGetConf(fp=%p, buf=%p, buflen=" CUPS_LLFMT + ", value=%p, linenum=%p)", fp, buf, CUPS_LLCAST buflen, + value, linenum)); + + if (!fp || (fp->mode != 'r' && fp->mode != 's') || + !buf || buflen < 2 || !value) + { + if (value) + *value = NULL; + + return (NULL); + } + + /* + * Read the next non-comment line... + */ + + *value = NULL; + + while (cupsFileGets(fp, buf, buflen)) + { + (*linenum) ++; + + /* + * Strip any comments... + */ + + if ((ptr = strchr(buf, '#')) != NULL) + { + if (ptr > buf && ptr[-1] == '\\') + { + // Unquote the #... + _cups_strcpy(ptr - 1, ptr); + } + else + { + // Strip the comment and any trailing whitespace... + while (ptr > buf) + { + if (!_cups_isspace(ptr[-1])) + break; + + ptr --; + } + + *ptr = '\0'; + } + } + + /* + * Strip leading whitespace... + */ + + for (ptr = buf; _cups_isspace(*ptr); ptr ++); + + if (ptr > buf) + _cups_strcpy(buf, ptr); + + /* + * See if there is anything left... + */ + + if (buf[0]) + { + /* + * Yes, grab any value and return... + */ + + for (ptr = buf; *ptr; ptr ++) + if (_cups_isspace(*ptr)) + break; + + if (*ptr) + { + /* + * Have a value, skip any other spaces... + */ + + while (_cups_isspace(*ptr)) + *ptr++ = '\0'; + + if (*ptr) + *value = ptr; + + /* + * Strip trailing whitespace and > for lines that begin with <... + */ + + ptr += strlen(ptr) - 1; + + if (buf[0] == '<' && *ptr == '>') + *ptr-- = '\0'; + else if (buf[0] == '<' && *ptr != '>') + { + /* + * Syntax error... + */ + + *value = NULL; + return (buf); + } + + while (ptr > *value && _cups_isspace(*ptr)) + *ptr-- = '\0'; + } + + /* + * Return the line... + */ + + return (buf); + } + } + + return (NULL); +} + + +/* + * 'cupsFileGetLine()' - Get a CR and/or LF-terminated line that may + * contain binary data. + * + * This function differs from @link cupsFileGets@ in that the trailing CR + * and LF are preserved, as is any binary data on the line. The buffer is + * nul-terminated, however you should use the returned length to determine + * the number of bytes on the line. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +size_t /* O - Number of bytes on line or 0 on end of file */ +cupsFileGetLine(cups_file_t *fp, /* I - File to read from */ + char *buf, /* I - Buffer */ + size_t buflen) /* I - Size of buffer */ +{ + int ch; /* Character from file */ + char *ptr, /* Current position in line buffer */ + *end; /* End of line buffer */ + + + /* + * Range check input... + */ + + DEBUG_printf(("2cupsFileGetLine(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", + fp, buf, CUPS_LLCAST buflen)); + + if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 3) + return (0); + + /* + * Now loop until we have a valid line... + */ + + for (ptr = buf, end = buf + buflen - 2; ptr < end ;) + { + if (fp->ptr >= fp->end) + if (cups_fill(fp) <= 0) + break; + + *ptr++ = ch = *(fp->ptr)++; + fp->pos ++; + + if (ch == '\r') + { + /* + * Check for CR LF... + */ + + if (fp->ptr >= fp->end) + if (cups_fill(fp) <= 0) + break; + + if (*(fp->ptr) == '\n') + { + *ptr++ = *(fp->ptr)++; + fp->pos ++; + } + + break; + } + else if (ch == '\n') + { + /* + * Line feed ends a line... + */ + + break; + } + } + + *ptr = '\0'; + + DEBUG_printf(("4cupsFileGetLine: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (ptr - buf); +} + + +/* + * 'cupsFileGets()' - Get a CR and/or LF-terminated line. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Line read or @code NULL@ on end of file or error */ +cupsFileGets(cups_file_t *fp, /* I - CUPS file */ + char *buf, /* O - String buffer */ + size_t buflen) /* I - Size of string buffer */ +{ + int ch; /* Character from file */ + char *ptr, /* Current position in line buffer */ + *end; /* End of line buffer */ + + + /* + * Range check input... + */ + + DEBUG_printf(("2cupsFileGets(fp=%p, buf=%p, buflen=" CUPS_LLFMT ")", fp, buf, + CUPS_LLCAST buflen)); + + if (!fp || (fp->mode != 'r' && fp->mode != 's') || !buf || buflen < 2) + return (NULL); + + /* + * Now loop until we have a valid line... + */ + + for (ptr = buf, end = buf + buflen - 1; ptr < end ;) + { + if (fp->ptr >= fp->end) + if (cups_fill(fp) <= 0) + { + if (ptr == buf) + return (NULL); + else + break; + } + + ch = *(fp->ptr)++; + fp->pos ++; + + if (ch == '\r') + { + /* + * Check for CR LF... + */ + + if (fp->ptr >= fp->end) + if (cups_fill(fp) <= 0) + break; + + if (*(fp->ptr) == '\n') + { + fp->ptr ++; + fp->pos ++; + } + + break; + } + else if (ch == '\n') + { + /* + * Line feed ends a line... + */ + + break; + } + else + *ptr++ = ch; + } + + *ptr = '\0'; + + DEBUG_printf(("4cupsFileGets: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (buf); +} + + +/* + * 'cupsFileLock()' - Temporarily lock access to a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsFileLock(cups_file_t *fp, /* I - CUPS file */ + int block) /* I - 1 to wait for the lock, 0 to fail right away */ +{ + /* + * Range check... + */ + + if (!fp || fp->mode == 's') + return (-1); + + /* + * Try the lock... + */ + +#ifdef WIN32 + return (_locking(fp->fd, block ? _LK_LOCK : _LK_NBLCK, 0)); +#else + return (lockf(fp->fd, block ? F_LOCK : F_TLOCK, 0)); +#endif /* WIN32 */ +} + + +/* + * 'cupsFileNumber()' - Return the file descriptor associated with a CUPS file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - File descriptor */ +cupsFileNumber(cups_file_t *fp) /* I - CUPS file */ +{ + if (fp) + return (fp->fd); + else + return (-1); +} + + +/* + * 'cupsFileOpen()' - Open a CUPS file. + * + * The "mode" parameter can be "r" to read, "w" to write, overwriting any + * existing file, "a" to append to an existing file or create a new file, + * or "s" to open a socket connection. + * + * When opening for writing ("w"), an optional number from 1 to 9 can be + * supplied which enables Flate compression of the file. Compression is + * not supported for the "a" (append) mode. + * + * When opening a socket connection, the filename is a string of the form + * "address:port" or "hostname:port". The socket will make an IPv4 or IPv6 + * connection as needed, generally preferring IPv6 connections when there is + * a choice. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file or @code NULL@ if the file or socket cannot be opened */ +cupsFileOpen(const char *filename, /* I - Name of file */ + const char *mode) /* I - Open mode */ +{ + cups_file_t *fp; /* New CUPS file */ + int fd; /* File descriptor */ + char hostname[1024], /* Hostname */ + *portname; /* Port "name" (number or service) */ + http_addrlist_t *addrlist; /* Host address list */ + + + DEBUG_printf(("cupsFileOpen(filename=\"%s\", mode=\"%s\")", filename, + mode)); + + /* + * Range check input... + */ + + if (!filename || !mode || + (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || + (*mode == 'a' && isdigit(mode[1] & 255))) + return (NULL); + + /* + * Open the file... + */ + + switch (*mode) + { + case 'a' : /* Append file */ + fd = cups_open(filename, + O_RDWR | O_CREAT | O_APPEND | O_LARGEFILE | O_BINARY); + break; + + case 'r' : /* Read file */ + fd = open(filename, O_RDONLY | O_LARGEFILE | O_BINARY, 0); + break; + + case 'w' : /* Write file */ + fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); + if (fd < 0 && errno == ENOENT) + { + fd = cups_open(filename, + O_WRONLY | O_CREAT | O_EXCL | O_LARGEFILE | O_BINARY); + if (fd < 0 && errno == EEXIST) + fd = cups_open(filename, O_WRONLY | O_LARGEFILE | O_BINARY); + } + + if (fd >= 0) +#ifdef WIN32 + _chsize(fd, 0); +#else + ftruncate(fd, 0); +#endif /* WIN32 */ + break; + + case 's' : /* Read/write socket */ + strlcpy(hostname, filename, sizeof(hostname)); + if ((portname = strrchr(hostname, ':')) != NULL) + *portname++ = '\0'; + else + return (NULL); + + /* + * Lookup the hostname and service... + */ + + if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) + return (NULL); + + /* + * Connect to the server... + */ + + if (!httpAddrConnect(addrlist, &fd)) + { + httpAddrFreeList(addrlist); + return (NULL); + } + + httpAddrFreeList(addrlist); + break; + + default : /* Remove bogus compiler warning... */ + return (NULL); + } + + if (fd < 0) + return (NULL); + + /* + * Create the CUPS file structure... + */ + + if ((fp = cupsFileOpenFd(fd, mode)) == NULL) + { + if (*mode == 's') + closesocket(fd); + else + close(fd); + } + + /* + * Return it... + */ + + return (fp); +} + +/* + * 'cupsFileOpenFd()' - Open a CUPS file using a file descriptor. + * + * The "mode" parameter can be "r" to read, "w" to write, "a" to append, + * or "s" to treat the file descriptor as a bidirectional socket connection. + * + * When opening for writing ("w"), an optional number from 1 to 9 can be + * supplied which enables Flate compression of the file. Compression is + * not supported for the "a" (append) mode. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file or @code NULL@ if the file could not be opened */ +cupsFileOpenFd(int fd, /* I - File descriptor */ + const char *mode) /* I - Open mode */ +{ + cups_file_t *fp; /* New CUPS file */ + + + DEBUG_printf(("cupsFileOpenFd(fd=%d, mode=\"%s\")", fd, mode)); + + /* + * Range check input... + */ + + if (fd < 0 || !mode || + (*mode != 'r' && *mode != 'w' && *mode != 'a' && *mode != 's') || + (*mode == 'a' && isdigit(mode[1] & 255))) + return (NULL); + + /* + * Allocate memory... + */ + + if ((fp = calloc(1, sizeof(cups_file_t))) == NULL) + return (NULL); + + /* + * Open the file... + */ + + fp->fd = fd; + + switch (*mode) + { + case 'a' : + fp->pos = lseek(fd, 0, SEEK_END); + + case 'w' : + fp->mode = 'w'; + fp->ptr = fp->buf; + fp->end = fp->buf + sizeof(fp->buf); + +#ifdef HAVE_LIBZ + if (mode[1] >= '1' && mode[1] <= '9') + { + /* + * Open a compressed stream, so write the standard gzip file + * header... + */ + + unsigned char header[10]; /* gzip file header */ + time_t curtime; /* Current time */ + + + curtime = time(NULL); + header[0] = 0x1f; + header[1] = 0x8b; + header[2] = Z_DEFLATED; + header[3] = 0; + header[4] = curtime; + header[5] = curtime >> 8; + header[6] = curtime >> 16; + header[7] = curtime >> 24; + header[8] = 0; + header[9] = 0x03; + + cups_write(fp, (char *)header, 10); + + /* + * Initialize the compressor... + */ + + deflateInit2(&(fp->stream), mode[1] - '0', Z_DEFLATED, -15, 8, + Z_DEFAULT_STRATEGY); + + fp->stream.next_out = fp->cbuf; + fp->stream.avail_out = sizeof(fp->cbuf); + fp->compressed = 1; + fp->crc = crc32(0L, Z_NULL, 0); + } +#endif /* HAVE_LIBZ */ + break; + + case 'r' : + fp->mode = 'r'; + break; + + case 's' : + fp->mode = 's'; + break; + + default : /* Remove bogus compiler warning... */ + return (NULL); + } + + /* + * Don't pass this file to child processes... + */ + +#ifndef WIN32 + fcntl(fp->fd, F_SETFD, fcntl(fp->fd, F_GETFD) | FD_CLOEXEC); +#endif /* !WIN32 */ + + return (fp); +} + + +/* + * 'cupsFilePeekChar()' - Peek at the next character from a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Character or -1 on end of file */ +cupsFilePeekChar(cups_file_t *fp) /* I - CUPS file */ +{ + /* + * Range check input... + */ + + if (!fp || (fp->mode != 'r' && fp->mode != 's')) + return (-1); + + /* + * If the input buffer is empty, try to read more data... + */ + + if (fp->ptr >= fp->end) + if (cups_fill(fp) < 0) + return (-1); + + /* + * Return the next character in the buffer... + */ + + return (*(fp->ptr) & 255); +} + + +/* + * 'cupsFilePrintf()' - Write a formatted string. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Number of bytes written or -1 on error */ +cupsFilePrintf(cups_file_t *fp, /* I - CUPS file */ + const char *format, /* I - Printf-style format string */ + ...) /* I - Additional args as necessary */ +{ + va_list ap; /* Argument list */ + ssize_t bytes; /* Formatted size */ + + + DEBUG_printf(("2cupsFilePrintf(fp=%p, format=\"%s\", ...)", fp, format)); + + if (!fp || !format || (fp->mode != 'w' && fp->mode != 's')) + return (-1); + + if (!fp->printf_buffer) + { + /* + * Start with an 1k printf buffer... + */ + + if ((fp->printf_buffer = malloc(1024)) == NULL) + return (-1); + + fp->printf_size = 1024; + } + + va_start(ap, format); + bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); + va_end(ap); + + if (bytes >= (ssize_t)fp->printf_size) + { + /* + * Expand the printf buffer... + */ + + char *temp; /* Temporary buffer pointer */ + + + if (bytes > 65535) + return (-1); + + if ((temp = realloc(fp->printf_buffer, bytes + 1)) == NULL) + return (-1); + + fp->printf_buffer = temp; + fp->printf_size = bytes + 1; + + va_start(ap, format); + bytes = vsnprintf(fp->printf_buffer, fp->printf_size, format, ap); + va_end(ap); + } + + if (fp->mode == 's') + { + if (cups_write(fp, fp->printf_buffer, bytes) < 0) + return (-1); + + fp->pos += bytes; + + DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (bytes); + } + + if ((fp->ptr + bytes) > fp->end) + if (cupsFileFlush(fp)) + return (-1); + + fp->pos += bytes; + + DEBUG_printf(("4cupsFilePrintf: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + if (bytes > sizeof(fp->buf)) + { +#ifdef HAVE_LIBZ + if (fp->compressed) + return (cups_compress(fp, fp->printf_buffer, bytes)); + else +#endif /* HAVE_LIBZ */ + return (cups_write(fp, fp->printf_buffer, bytes)); + } + else + { + memcpy(fp->ptr, fp->printf_buffer, bytes); + fp->ptr += bytes; + return (bytes); + } +} + + +/* + * 'cupsFilePutChar()' - Write a character. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsFilePutChar(cups_file_t *fp, /* I - CUPS file */ + int c) /* I - Character to write */ +{ + /* + * Range check input... + */ + + if (!fp || (fp->mode != 'w' && fp->mode != 's')) + return (-1); + + if (fp->mode == 's') + { + /* + * Send character immediately over socket... + */ + + char ch; /* Output character */ + + + ch = c; + + if (send(fp->fd, &ch, 1, 0) < 1) + return (-1); + } + else + { + /* + * Buffer it up... + */ + + if (fp->ptr >= fp->end) + if (cupsFileFlush(fp)) + return (-1); + + *(fp->ptr) ++ = c; + } + + fp->pos ++; + + DEBUG_printf(("4cupsFilePutChar: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (0); +} + + +/* + * 'cupsFilePutConf()' - Write a configuration line. + * + * This function handles any comment escaping of the value. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ssize_t /* O - Number of bytes written or -1 on error */ +cupsFilePutConf(cups_file_t *fp, /* I - CUPS file */ + const char *directive, /* I - Directive */ + const char *value) /* I - Value */ +{ + ssize_t bytes, /* Number of bytes written */ + temp; /* Temporary byte count */ + const char *ptr; /* Pointer into value */ + + + if (!fp || !directive || !*directive) + return (-1); + + if ((bytes = cupsFilePuts(fp, directive)) < 0) + return (-1); + + if (cupsFilePutChar(fp, ' ') < 0) + return (-1); + bytes ++; + + if (value && *value) + { + if ((ptr = strchr(value, '#')) != NULL) + { + /* + * Need to quote the first # in the info string... + */ + + if ((temp = cupsFileWrite(fp, value, ptr - value)) < 0) + return (-1); + bytes += temp; + + if (cupsFilePutChar(fp, '\\') < 0) + return (-1); + bytes ++; + + if ((temp = cupsFilePuts(fp, ptr)) < 0) + return (-1); + bytes += temp; + } + else if ((temp = cupsFilePuts(fp, value)) < 0) + return (-1); + else + bytes += temp; + } + + if (cupsFilePutChar(fp, '\n') < 0) + return (-1); + else + return (bytes + 1); +} + + +/* + * 'cupsFilePuts()' - Write a string. + * + * Like the @code fputs@ function, no newline is appended to the string. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Number of bytes written or -1 on error */ +cupsFilePuts(cups_file_t *fp, /* I - CUPS file */ + const char *s) /* I - String to write */ +{ + ssize_t bytes; /* Bytes to write */ + + + /* + * Range check input... + */ + + if (!fp || !s || (fp->mode != 'w' && fp->mode != 's')) + return (-1); + + /* + * Write the string... + */ + + bytes = (int)strlen(s); + + if (fp->mode == 's') + { + if (cups_write(fp, s, bytes) < 0) + return (-1); + + fp->pos += bytes; + + DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (bytes); + } + + if ((fp->ptr + bytes) > fp->end) + if (cupsFileFlush(fp)) + return (-1); + + fp->pos += bytes; + + DEBUG_printf(("4cupsFilePuts: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + if (bytes > sizeof(fp->buf)) + { +#ifdef HAVE_LIBZ + if (fp->compressed) + return (cups_compress(fp, s, bytes)); + else +#endif /* HAVE_LIBZ */ + return (cups_write(fp, s, bytes)); + } + else + { + memcpy(fp->ptr, s, bytes); + fp->ptr += bytes; + return (bytes); + } +} + + +/* + * 'cupsFileRead()' - Read from a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Number of bytes read or -1 on error */ +cupsFileRead(cups_file_t *fp, /* I - CUPS file */ + char *buf, /* O - Buffer */ + size_t bytes) /* I - Number of bytes to read */ +{ + size_t total; /* Total bytes read */ + ssize_t count; /* Bytes read */ + + + DEBUG_printf(("2cupsFileRead(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", fp, buf, + CUPS_LLCAST bytes)); + + /* + * Range check input... + */ + + if (!fp || !buf || (fp->mode != 'r' && fp->mode != 's')) + return (-1); + + if (bytes == 0) + return (0); + + /* + * Loop until all bytes are read... + */ + + total = 0; + while (bytes > 0) + { + if (fp->ptr >= fp->end) + if (cups_fill(fp) <= 0) + { + DEBUG_printf(("4cupsFileRead: cups_fill() returned -1, total=" + CUPS_LLFMT, CUPS_LLCAST total)); + + if (total > 0) + return ((ssize_t)total); + else + return (-1); + } + + count = (ssize_t)(fp->end - fp->ptr); + if (count > (ssize_t)bytes) + count = (ssize_t)bytes; + + memcpy(buf, fp->ptr, count); + fp->ptr += count; + fp->pos += count; + + DEBUG_printf(("4cupsFileRead: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + /* + * Update the counts for the last read... + */ + + bytes -= count; + total += count; + buf += count; + } + + /* + * Return the total number of bytes read... + */ + + DEBUG_printf(("3cupsFileRead: total=" CUPS_LLFMT, CUPS_LLCAST total)); + + return ((ssize_t)total); +} + + +/* + * 'cupsFileRewind()' - Set the current file position to the beginning of the + * file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +off_t /* O - New file position or -1 on error */ +cupsFileRewind(cups_file_t *fp) /* I - CUPS file */ +{ + /* + * Range check input... + */ + + DEBUG_printf(("cupsFileRewind(fp=%p)", fp)); + DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + if (!fp || fp->mode != 'r') + return (-1); + + /* + * Handle special cases... + */ + + if (fp->bufpos == 0) + { + /* + * No seeking necessary... + */ + + fp->pos = 0; + + if (fp->ptr) + { + fp->ptr = fp->buf; + fp->eof = 0; + } + + DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (0); + } + + /* + * Otherwise, seek in the file and cleanup any compression buffers... + */ + +#ifdef HAVE_LIBZ + if (fp->compressed) + { + inflateEnd(&fp->stream); + fp->compressed = 0; + } +#endif /* HAVE_LIBZ */ + + if (lseek(fp->fd, 0, SEEK_SET)) + { + DEBUG_printf(("1cupsFileRewind: lseek failed: %s", strerror(errno))); + return (-1); + } + + fp->bufpos = 0; + fp->pos = 0; + fp->ptr = NULL; + fp->end = NULL; + fp->eof = 0; + + DEBUG_printf(("2cupsFileRewind: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (0); +} + + +/* + * 'cupsFileSeek()' - Seek in a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +off_t /* O - New file position or -1 on error */ +cupsFileSeek(cups_file_t *fp, /* I - CUPS file */ + off_t pos) /* I - Position in file */ +{ + ssize_t bytes; /* Number bytes in buffer */ + + + DEBUG_printf(("cupsFileSeek(fp=%p, pos=" CUPS_LLFMT ")", fp, + CUPS_LLCAST pos)); + DEBUG_printf(("2cupsFileSeek: fp->pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + DEBUG_printf(("2cupsFileSeek: fp->ptr=%p, fp->end=%p", fp->ptr, fp->end)); + + /* + * Range check input... + */ + + if (!fp || pos < 0 || fp->mode != 'r') + return (-1); + + /* + * Handle special cases... + */ + + if (pos == 0) + return (cupsFileRewind(fp)); + + if (fp->ptr) + { + bytes = (ssize_t)(fp->end - fp->buf); + + DEBUG_printf(("2cupsFileSeek: bytes=" CUPS_LLFMT, CUPS_LLCAST bytes)); + + if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) + { + /* + * No seeking necessary... + */ + + fp->pos = pos; + fp->ptr = fp->buf + pos - fp->bufpos; + fp->eof = 0; + + return (pos); + } + } + +#ifdef HAVE_LIBZ + if (!fp->compressed && !fp->ptr) + { + /* + * Preload a buffer to determine whether the file is compressed... + */ + + if (cups_fill(fp) < 0) + return (-1); + } +#endif /* HAVE_LIBZ */ + + /* + * Seek forwards or backwards... + */ + + fp->eof = 0; + + if (pos < fp->bufpos) + { + /* + * Need to seek backwards... + */ + + DEBUG_puts("2cupsFileSeek: SEEK BACKWARDS"); + +#ifdef HAVE_LIBZ + if (fp->compressed) + { + inflateEnd(&fp->stream); + + lseek(fp->fd, 0, SEEK_SET); + fp->bufpos = 0; + fp->pos = 0; + fp->ptr = NULL; + fp->end = NULL; + + while ((bytes = cups_fill(fp)) > 0) + if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) + break; + + if (bytes <= 0) + return (-1); + + fp->ptr = fp->buf + pos - fp->bufpos; + fp->pos = pos; + } + else +#endif /* HAVE_LIBZ */ + { + fp->bufpos = lseek(fp->fd, pos, SEEK_SET); + fp->pos = fp->bufpos; + fp->ptr = NULL; + fp->end = NULL; + + DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, + CUPS_LLCAST fp->pos)); + } + } + else + { + /* + * Need to seek forwards... + */ + + DEBUG_puts("2cupsFileSeek: SEEK FORWARDS"); + +#ifdef HAVE_LIBZ + if (fp->compressed) + { + while ((bytes = cups_fill(fp)) > 0) + { + if (pos >= fp->bufpos && pos < (fp->bufpos + bytes)) + break; + } + + if (bytes <= 0) + return (-1); + + fp->ptr = fp->buf + pos - fp->bufpos; + fp->pos = pos; + } + else +#endif /* HAVE_LIBZ */ + { + fp->bufpos = lseek(fp->fd, pos, SEEK_SET); + fp->pos = fp->bufpos; + fp->ptr = NULL; + fp->end = NULL; + + DEBUG_printf(("2cupsFileSeek: lseek() returned " CUPS_LLFMT, + CUPS_LLCAST fp->pos)); + } + } + + DEBUG_printf(("2cupsFileSeek: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return (fp->pos); +} + + +/* + * 'cupsFileStderr()' - Return a CUPS file associated with stderr. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file */ +cupsFileStderr(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ + + + /* + * Open file descriptor 2 as needed... + */ + + if (!cg->stdio_files[2]) + { + /* + * Flush any pending output on the stdio file... + */ + + fflush(stderr); + + /* + * Open file descriptor 2... + */ + + if ((cg->stdio_files[2] = cupsFileOpenFd(2, "w")) != NULL) + cg->stdio_files[2]->is_stdio = 1; + } + + return (cg->stdio_files[2]); +} + + +/* + * 'cupsFileStdin()' - Return a CUPS file associated with stdin. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file */ +cupsFileStdin(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ + + + /* + * Open file descriptor 0 as needed... + */ + + if (!cg->stdio_files[0]) + { + /* + * Open file descriptor 0... + */ + + if ((cg->stdio_files[0] = cupsFileOpenFd(0, "r")) != NULL) + cg->stdio_files[0]->is_stdio = 1; + } + + return (cg->stdio_files[0]); +} + + +/* + * 'cupsFileStdout()' - Return a CUPS file associated with stdout. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file */ +cupsFileStdout(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals... */ + + + /* + * Open file descriptor 1 as needed... + */ + + if (!cg->stdio_files[1]) + { + /* + * Flush any pending output on the stdio file... + */ + + fflush(stdout); + + /* + * Open file descriptor 1... + */ + + if ((cg->stdio_files[1] = cupsFileOpenFd(1, "w")) != NULL) + cg->stdio_files[1]->is_stdio = 1; + } + + return (cg->stdio_files[1]); +} + + +/* + * 'cupsFileTell()' - Return the current file position. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +off_t /* O - File position */ +cupsFileTell(cups_file_t *fp) /* I - CUPS file */ +{ + DEBUG_printf(("2cupsFileTell(fp=%p)", fp)); + DEBUG_printf(("3cupsFileTell: pos=" CUPS_LLFMT, + CUPS_LLCAST (fp ? fp->pos : -1))); + + return (fp ? fp->pos : 0); +} + + +/* + * 'cupsFileUnlock()' - Unlock access to a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsFileUnlock(cups_file_t *fp) /* I - CUPS file */ +{ + /* + * Range check... + */ + + DEBUG_printf(("cupsFileUnlock(fp=%p)", fp)); + + if (!fp || fp->mode == 's') + return (-1); + + /* + * Unlock... + */ + +#ifdef WIN32 + return (_locking(fp->fd, _LK_UNLCK, 0)); +#else + return (lockf(fp->fd, F_ULOCK, 0)); +#endif /* WIN32 */ +} + + +/* + * 'cupsFileWrite()' - Write to a file. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Number of bytes written or -1 on error */ +cupsFileWrite(cups_file_t *fp, /* I - CUPS file */ + const char *buf, /* I - Buffer */ + size_t bytes) /* I - Number of bytes to write */ +{ + /* + * Range check input... + */ + + DEBUG_printf(("2cupsFileWrite(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", + fp, buf, CUPS_LLCAST bytes)); + + if (!fp || !buf || (fp->mode != 'w' && fp->mode != 's')) + return (-1); + + if (bytes == 0) + return (0); + + /* + * Write the buffer... + */ + + if (fp->mode == 's') + { + if (cups_write(fp, buf, bytes) < 0) + return (-1); + + fp->pos += (off_t)bytes; + + DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + return ((ssize_t)bytes); + } + + if ((fp->ptr + bytes) > fp->end) + if (cupsFileFlush(fp)) + return (-1); + + fp->pos += (off_t)bytes; + + DEBUG_printf(("4cupsFileWrite: pos=" CUPS_LLFMT, CUPS_LLCAST fp->pos)); + + if (bytes > sizeof(fp->buf)) + { +#ifdef HAVE_LIBZ + if (fp->compressed) + return (cups_compress(fp, buf, bytes)); + else +#endif /* HAVE_LIBZ */ + return (cups_write(fp, buf, bytes)); + } + else + { + memcpy(fp->ptr, buf, bytes); + fp->ptr += bytes; + return ((ssize_t)bytes); + } +} + + +#ifdef HAVE_LIBZ +/* + * 'cups_compress()' - Compress a buffer of data. + */ + +static ssize_t /* O - Number of bytes written or -1 */ +cups_compress(cups_file_t *fp, /* I - CUPS file */ + const char *buf, /* I - Buffer */ + size_t bytes) /* I - Number bytes */ +{ + DEBUG_printf(("7cups_compress(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", fp, buf, + CUPS_LLCAST bytes)); + + /* + * Update the CRC... + */ + + fp->crc = crc32(fp->crc, (const Bytef *)buf, bytes); + + /* + * Deflate the bytes... + */ + + fp->stream.next_in = (Bytef *)buf; + fp->stream.avail_in = bytes; + + while (fp->stream.avail_in > 0) + { + /* + * Flush the current buffer... + */ + + DEBUG_printf(("9cups_compress: avail_in=%d, avail_out=%d", + fp->stream.avail_in, fp->stream.avail_out)); + + if (fp->stream.avail_out < (int)(sizeof(fp->cbuf) / 8)) + { + if (cups_write(fp, (char *)fp->cbuf, fp->stream.next_out - fp->cbuf) < 0) + return (-1); + + fp->stream.next_out = fp->cbuf; + fp->stream.avail_out = sizeof(fp->cbuf); + } + + deflate(&(fp->stream), Z_NO_FLUSH); + } + + return (bytes); +} +#endif /* HAVE_LIBZ */ + + +/* + * 'cups_fill()' - Fill the input buffer. + */ + +static ssize_t /* O - Number of bytes or -1 */ +cups_fill(cups_file_t *fp) /* I - CUPS file */ +{ + ssize_t bytes; /* Number of bytes read */ +#ifdef HAVE_LIBZ + int status; /* Decompression status */ + const unsigned char *ptr, /* Pointer into buffer */ + *end; /* End of buffer */ +#endif /* HAVE_LIBZ */ + + + DEBUG_printf(("7cups_fill(fp=%p)", fp)); + DEBUG_printf(("9cups_fill: fp->ptr=%p, fp->end=%p, fp->buf=%p, " + "fp->bufpos=" CUPS_LLFMT ", fp->eof=%d", + fp->ptr, fp->end, fp->buf, CUPS_LLCAST fp->bufpos, fp->eof)); + + if (fp->ptr && fp->end) + fp->bufpos += fp->end - fp->buf; + +#ifdef HAVE_LIBZ + DEBUG_printf(("9cups_fill: fp->compressed=%d", fp->compressed)); + + while (!fp->ptr || fp->compressed) + { + /* + * Check to see if we have read any data yet; if not, see if we have a + * compressed file... + */ + + if (!fp->ptr) + { + /* + * Reset the file position in case we are seeking... + */ + + fp->compressed = 0; + + /* + * Read the first bytes in the file to determine if we have a gzip'd + * file... + */ + + if ((bytes = cups_read(fp, (char *)fp->buf, sizeof(fp->buf))) < 0) + { + /* + * Can't read from file! + */ + + DEBUG_printf(("9cups_fill: cups_read() returned " CUPS_LLFMT, + CUPS_LLCAST bytes)); + + return (-1); + } + + if (bytes < 10 || fp->buf[0] != 0x1f || + (fp->buf[1] & 255) != 0x8b || + fp->buf[2] != 8 || (fp->buf[3] & 0xe0) != 0) + { + /* + * Not a gzip'd file! + */ + + fp->ptr = fp->buf; + fp->end = fp->buf + bytes; + + DEBUG_printf(("9cups_fill: Returning " CUPS_LLFMT, + CUPS_LLCAST bytes)); + + return (bytes); + } + + /* + * Parse header junk: extra data, original name, and comment... + */ + + ptr = (unsigned char *)fp->buf + 10; + end = (unsigned char *)fp->buf + bytes; + + if (fp->buf[3] & 0x04) + { + /* + * Skip extra data... + */ + + if ((ptr + 2) > end) + { + /* + * Can't read from file! + */ + + return (-1); + } + + bytes = ((unsigned char)ptr[1] << 8) | (unsigned char)ptr[0]; + ptr += 2 + bytes; + + if (ptr > end) + { + /* + * Can't read from file! + */ + + return (-1); + } + } + + if (fp->buf[3] & 0x08) + { + /* + * Skip original name data... + */ + + while (ptr < end && *ptr) + ptr ++; + + if (ptr < end) + ptr ++; + else + { + /* + * Can't read from file! + */ + + return (-1); + } + } + + if (fp->buf[3] & 0x10) + { + /* + * Skip comment data... + */ + + while (ptr < end && *ptr) + ptr ++; + + if (ptr < end) + ptr ++; + else + { + /* + * Can't read from file! + */ + + return (-1); + } + } + + if (fp->buf[3] & 0x02) + { + /* + * Skip header CRC data... + */ + + ptr += 2; + + if (ptr > end) + { + /* + * Can't read from file! + */ + + return (-1); + } + } + + /* + * Copy the flate-compressed data to the compression buffer... + */ + + if ((bytes = end - ptr) > 0) + memcpy(fp->cbuf, ptr, bytes); + + /* + * Setup the decompressor data... + */ + + fp->stream.zalloc = (alloc_func)0; + fp->stream.zfree = (free_func)0; + fp->stream.opaque = (voidpf)0; + fp->stream.next_in = (Bytef *)fp->cbuf; + fp->stream.next_out = NULL; + fp->stream.avail_in = bytes; + fp->stream.avail_out = 0; + fp->crc = crc32(0L, Z_NULL, 0); + + if (inflateInit2(&(fp->stream), -15) != Z_OK) + return (-1); + + fp->compressed = 1; + } + + if (fp->compressed) + { + /* + * If we have reached end-of-file, return immediately... + */ + + if (fp->eof) + return (-1); + + /* + * Fill the decompression buffer as needed... + */ + + if (fp->stream.avail_in == 0) + { + if ((bytes = cups_read(fp, (char *)fp->cbuf, sizeof(fp->cbuf))) <= 0) + return (-1); + + fp->stream.next_in = fp->cbuf; + fp->stream.avail_in = bytes; + } + + /* + * Decompress data from the buffer... + */ + + fp->stream.next_out = (Bytef *)fp->buf; + fp->stream.avail_out = sizeof(fp->buf); + + status = inflate(&(fp->stream), Z_NO_FLUSH); + + if (fp->stream.next_out > (Bytef *)fp->buf) + fp->crc = crc32(fp->crc, (Bytef *)fp->buf, + fp->stream.next_out - (Bytef *)fp->buf); + + if (status == Z_STREAM_END) + { + /* + * Read the CRC and length... + */ + + unsigned char trailer[8]; /* Trailer bytes */ + uLong tcrc; /* Trailer CRC */ + + + if (read(fp->fd, trailer, sizeof(trailer)) < sizeof(trailer)) + { + /* + * Can't get it, so mark end-of-file... + */ + + fp->eof = 1; + } + else + { + tcrc = (((((trailer[3] << 8) | trailer[2]) << 8) | trailer[1]) << 8) | + trailer[0]; + + if (tcrc != fp->crc) + { + /* + * Bad CRC, mark end-of-file... + */ + + DEBUG_printf(("9cups_fill: tcrc=%08x, fp->crc=%08x", + (unsigned int)tcrc, (unsigned int)fp->crc)); + + fp->eof = 1; + + return (-1); + } + + /* + * Otherwise, reset the compressed flag so that we re-read the + * file header... + */ + + fp->compressed = 0; + } + } + + bytes = sizeof(fp->buf) - fp->stream.avail_out; + + /* + * Return the decompressed data... + */ + + fp->ptr = fp->buf; + fp->end = fp->buf + bytes; + + if (bytes) + return (bytes); + } + } +#endif /* HAVE_LIBZ */ + + /* + * Read a buffer's full of data... + */ + + if ((bytes = cups_read(fp, fp->buf, sizeof(fp->buf))) <= 0) + { + /* + * Can't read from file! + */ + + fp->eof = 1; + fp->ptr = fp->buf; + fp->end = fp->buf; + + return (-1); + } + + /* + * Return the bytes we read... + */ + + fp->eof = 0; + fp->ptr = fp->buf; + fp->end = fp->buf + bytes; + + return (bytes); +} + + +/* + * 'cups_open()' - Safely open a file for writing. + * + * We don't allow appending to directories or files that are hard-linked or + * symlinked. + */ + +static int /* O - File descriptor or -1 otherwise */ +cups_open(const char *filename, /* I - Filename */ + int mode) /* I - Open mode */ +{ + int fd; /* File descriptor */ + struct stat fileinfo; /* File information */ +#ifndef WIN32 + struct stat linkinfo; /* Link information */ +#endif /* !WIN32 */ + + + /* + * Open the file... + */ + + if ((fd = open(filename, mode, 0666)) < 0) + return (-1); + + /* + * Then verify that the file descriptor doesn't point to a directory or hard- + * linked file. + */ + + if (fstat(fd, &fileinfo)) + { + close(fd); + return (-1); + } + + if (fileinfo.st_nlink != 1) + { + close(fd); + errno = EPERM; + return (-1); + } + +#ifdef WIN32 + if (fileinfo.st_mode & _S_IFDIR) +#else + if (S_ISDIR(fileinfo.st_mode)) +#endif /* WIN32 */ + { + close(fd); + errno = EISDIR; + return (-1); + } + +#ifndef WIN32 + /* + * Then use lstat to determine whether the filename is a symlink... + */ + + if (lstat(filename, &linkinfo)) + { + close(fd); + return (-1); + } + + if (S_ISLNK(linkinfo.st_mode) || + fileinfo.st_dev != linkinfo.st_dev || + fileinfo.st_ino != linkinfo.st_ino || +#ifdef HAVE_ST_GEN + fileinfo.st_gen != linkinfo.st_gen || +#endif /* HAVE_ST_GEN */ + fileinfo.st_nlink != linkinfo.st_nlink || + fileinfo.st_mode != linkinfo.st_mode) + { + /* + * Yes, don't allow! + */ + + close(fd); + errno = EPERM; + return (-1); + } +#endif /* !WIN32 */ + + return (fd); +} + + +/* + * 'cups_read()' - Read from a file descriptor. + */ + +static ssize_t /* O - Number of bytes read or -1 */ +cups_read(cups_file_t *fp, /* I - CUPS file */ + char *buf, /* I - Buffer */ + size_t bytes) /* I - Number bytes */ +{ + ssize_t total; /* Total bytes read */ + + + DEBUG_printf(("7cups_read(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", fp, buf, + CUPS_LLCAST bytes)); + + /* + * Loop until we read at least 0 bytes... + */ + + for (;;) + { +#ifdef WIN32 + if (fp->mode == 's') + total = (ssize_t)recv(fp->fd, buf, (unsigned)bytes, 0); + else + total = (ssize_t)read(fp->fd, buf, (unsigned)bytes); +#else + if (fp->mode == 's') + total = recv(fp->fd, buf, bytes, 0); + else + total = read(fp->fd, buf, bytes); +#endif /* WIN32 */ + + DEBUG_printf(("9cups_read: total=" CUPS_LLFMT, CUPS_LLCAST total)); + + if (total >= 0) + break; + + /* + * Reads can be interrupted by signals and unavailable resources... + */ + + if (errno == EAGAIN || errno == EINTR) + continue; + else + return (-1); + } + + /* + * Return the total number of bytes read... + */ + + return (total); +} + + +/* + * 'cups_write()' - Write to a file descriptor. + */ + +static ssize_t /* O - Number of bytes written or -1 */ +cups_write(cups_file_t *fp, /* I - CUPS file */ + const char *buf, /* I - Buffer */ + size_t bytes) /* I - Number bytes */ +{ + size_t total; /* Total bytes written */ + ssize_t count; /* Count this time */ + + + DEBUG_printf(("7cups_write(fp=%p, buf=%p, bytes=" CUPS_LLFMT ")", fp, buf, + CUPS_LLCAST bytes)); + + /* + * Loop until all bytes are written... + */ + + total = 0; + while (bytes > 0) + { +#ifdef WIN32 + if (fp->mode == 's') + count = (ssize_t)send(fp->fd, buf, (unsigned)bytes, 0); + else + count = (ssize_t)write(fp->fd, buf, (unsigned)bytes); +#else + if (fp->mode == 's') + count = send(fp->fd, buf, bytes, 0); + else + count = write(fp->fd, buf, bytes); +#endif /* WIN32 */ + + DEBUG_printf(("9cups_write: count=" CUPS_LLFMT, CUPS_LLCAST count)); + + if (count < 0) + { + /* + * Writes can be interrupted by signals and unavailable resources... + */ + + if (errno == EAGAIN || errno == EINTR) + continue; + else + return (-1); + } + + /* + * Update the counts for the last write call... + */ + + bytes -= count; + total += count; + buf += count; + } + + /* + * Return the total number of bytes written... + */ + + return ((ssize_t)total); +} + + +/* + * End of "$Id: file.c 9993 2011-09-09 21:55:11Z mike $". + */ diff --git a/cups/file.h b/cups/file.h new file mode 100644 index 0000000..f85d150 --- /dev/null +++ b/cups/file.h @@ -0,0 +1,112 @@ +/* + * "$Id: file.h 9771 2011-05-12 05:21:56Z mike $" + * + * Public file definitions for CUPS. + * + * Since stdio files max out at 256 files on many systems, we have to + * write similar functions without this limit. At the same time, using + * our own file functions allows us to provide transparent support of + * gzip'd print files, PPD files, etc. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_FILE_H_ +# define _CUPS_FILE_H_ + + +/* + * Include necessary headers... + */ + +# include "versioning.h" +# include +# include +# if defined(WIN32) && !defined(__CUPS_SSIZE_T_DEFINED) +# define __CUPS_SSIZE_T_DEFINED +/* Windows does not support the ssize_t type, so map it to off_t... */ +typedef off_t ssize_t; /* @private@ */ +# endif /* WIN32 && !__CUPS_SSIZE_T_DEFINED */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * CUPS file definitions... + */ + +# define CUPS_FILE_NONE 0 /* No compression */ +# define CUPS_FILE_GZIP 1 /* GZIP compression */ + + +/* + * Types and structures... + */ + +typedef struct _cups_file_s cups_file_t;/**** CUPS file type ****/ + + +/* + * Prototypes... + */ + +extern int cupsFileClose(cups_file_t *fp) _CUPS_API_1_2; +extern int cupsFileCompression(cups_file_t *fp) _CUPS_API_1_2; +extern int cupsFileEOF(cups_file_t *fp) _CUPS_API_1_2; +extern const char *cupsFileFind(const char *filename, const char *path, + int executable, char *buffer, + int bufsize) _CUPS_API_1_2; +extern int cupsFileFlush(cups_file_t *fp) _CUPS_API_1_2; +extern int cupsFileGetChar(cups_file_t *fp) _CUPS_API_1_2; +extern char *cupsFileGetConf(cups_file_t *fp, char *buf, size_t buflen, + char **value, int *linenum) _CUPS_API_1_2; +extern size_t cupsFileGetLine(cups_file_t *fp, char *buf, + size_t buflen) _CUPS_API_1_2; +extern char *cupsFileGets(cups_file_t *fp, char *buf, size_t buflen) _CUPS_API_1_2; +extern int cupsFileLock(cups_file_t *fp, int block) _CUPS_API_1_2; +extern int cupsFileNumber(cups_file_t *fp) _CUPS_API_1_2; +extern cups_file_t *cupsFileOpen(const char *filename, const char *mode) _CUPS_API_1_2; +extern cups_file_t *cupsFileOpenFd(int fd, const char *mode) _CUPS_API_1_2; +extern int cupsFilePeekChar(cups_file_t *fp) _CUPS_API_1_2; +extern int cupsFilePrintf(cups_file_t *fp, const char *format, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +_CUPS_API_1_2; +extern int cupsFilePutChar(cups_file_t *fp, int c) _CUPS_API_1_2; +extern ssize_t cupsFilePutConf(cups_file_t *fp, const char *directive, + const char *value) _CUPS_API_1_4; +extern int cupsFilePuts(cups_file_t *fp, const char *s) _CUPS_API_1_2; +extern ssize_t cupsFileRead(cups_file_t *fp, char *buf, size_t bytes) _CUPS_API_1_2; +extern off_t cupsFileRewind(cups_file_t *fp) _CUPS_API_1_2; +extern off_t cupsFileSeek(cups_file_t *fp, off_t pos) _CUPS_API_1_2; +extern cups_file_t *cupsFileStderr(void) _CUPS_API_1_2; +extern cups_file_t *cupsFileStdin(void) _CUPS_API_1_2; +extern cups_file_t *cupsFileStdout(void) _CUPS_API_1_2; +extern off_t cupsFileTell(cups_file_t *fp) _CUPS_API_1_2; +extern int cupsFileUnlock(cups_file_t *fp) _CUPS_API_1_2; +extern ssize_t cupsFileWrite(cups_file_t *fp, const char *buf, size_t bytes) _CUPS_API_1_2; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_FILE_H_ */ + +/* + * End of "$Id: file.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cups/getdevices.c b/cups/getdevices.c new file mode 100644 index 0000000..164b808 --- /dev/null +++ b/cups/getdevices.c @@ -0,0 +1,283 @@ +/* + * "$Id: getdevices.c 9055 2010-03-25 23:06:26Z mike $" + * + * cupsGetDevices implementation for CUPS. + * + * Copyright 2008-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsGetDevices() - Get available printer devices. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * 'cupsGetDevices()' - Get available printer devices. + * + * This function sends a CUPS-Get-Devices request and streams the discovered + * devices to the specified callback function. The "timeout" parameter controls + * how long the request lasts, while the "include_schemes" and "exclude_schemes" + * parameters provide comma-delimited lists of backends to include or omit from + * the request respectively. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ipp_status_t /* O - Request status - @code IPP_OK@ on success. */ +cupsGetDevices( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + int timeout, /* I - Timeout in seconds or @code CUPS_TIMEOUT_DEFAULT@ */ + const char *include_schemes, /* I - Comma-separated URI schemes to include or @code CUPS_INCLUDE_ALL@ */ + const char *exclude_schemes, /* I - Comma-separated URI schemes to exclude or @code CUPS_EXCLUDE_NONE@ */ + cups_device_cb_t callback, /* I - Callback function */ + void *user_data) /* I - User data pointer */ +{ + ipp_t *request, /* CUPS-Get-Devices request */ + *response; /* CUPS-Get-Devices response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *device_class, /* device-class value */ + *device_id, /* device-id value */ + *device_info, /* device-info value */ + *device_location, /* device-location value */ + *device_make_and_model, /* device-make-and-model value */ + *device_uri; /* device-uri value */ + int blocking; /* Current blocking-IO mode */ + cups_option_t option; /* in/exclude-schemes option */ + http_status_t status; /* HTTP status of request */ + ipp_state_t state; /* IPP response state */ + + + /* + * Range check input... + */ + + DEBUG_printf(("cupsGetDevices(http=%p, timeout=%d, include_schemes=\"%s\", " + "exclude_schemes=\"%s\", callback=%p, user_data=%p)", http, + timeout, include_schemes, exclude_schemes, callback, + user_data)); + + if (!callback) + return (IPP_INTERNAL_ERROR); + + if (!http) + http = _cupsConnect(); + + if (!http) + return (IPP_SERVICE_UNAVAILABLE); + + /* + * Create a CUPS-Get-Devices request... + */ + + request = ippNewRequest(CUPS_GET_DEVICES); + + if (timeout > 0) + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "timeout", + timeout); + + if (include_schemes) + { + option.name = "include-schemes"; + option.value = (char *)include_schemes; + + cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); + } + + if (exclude_schemes) + { + option.name = "exclude-schemes"; + option.value = (char *)exclude_schemes; + + cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); + } + + /* + * Send the request and do any necessary authentication... + */ + + do + { + DEBUG_puts("2cupsGetDevices: Sending request..."); + status = cupsSendRequest(http, request, "/", ippLength(request)); + + DEBUG_puts("2cupsGetDevices: Waiting for response status..."); + while (status == HTTP_CONTINUE) + status = httpUpdate(http); + + if (status != HTTP_OK) + { + httpFlush(http); + + if (status == HTTP_UNAUTHORIZED) + { + /* + * See if we can do authentication... + */ + + DEBUG_puts("2cupsGetDevices: Need authorization..."); + + if (!cupsDoAuthentication(http, "POST", "/")) + httpReconnect(http); + else + { + status = HTTP_AUTHORIZATION_CANCELED; + break; + } + } + +#ifdef HAVE_SSL + else if (status == HTTP_UPGRADE_REQUIRED) + { + /* + * Force a reconnect with encryption... + */ + + DEBUG_puts("2cupsGetDevices: Need encryption..."); + + if (!httpReconnect(http)) + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + } +#endif /* HAVE_SSL */ + } + } + while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED); + + DEBUG_printf(("2cupsGetDevices: status=%d", status)); + + ippDelete(request); + + if (status != HTTP_OK) + { + _cupsSetHTTPError(status); + return (cupsLastError()); + } + + /* + * Read the response in non-blocking mode... + */ + + blocking = httpGetBlocking(http); + httpBlocking(http, 0); + + response = ippNew(); + device_class = NULL; + device_id = NULL; + device_info = NULL; + device_location = ""; + device_make_and_model = NULL; + device_uri = NULL; + attr = NULL; + + DEBUG_puts("2cupsGetDevices: Reading response..."); + + do + { + if ((state = ippRead(http, response)) == IPP_ERROR) + break; + + DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state, + response->last)); + + if (!response->attrs) + continue; + + while (attr != response->last) + { + if (!attr) + attr = response->attrs; + else + attr = attr->next; + + DEBUG_printf(("2cupsGetDevices: attr->name=\"%s\", attr->value_tag=%d", + attr->name, attr->value_tag)); + + if (!attr->name) + { + if (device_class && device_id && device_info && device_make_and_model && + device_uri) + (*callback)(device_class, device_id, device_info, + device_make_and_model, device_uri, device_location, + user_data); + + device_class = NULL; + device_id = NULL; + device_info = NULL; + device_location = ""; + device_make_and_model = NULL; + device_uri = NULL; + } + else if (!strcmp(attr->name, "device-class") && + attr->value_tag == IPP_TAG_KEYWORD) + device_class = attr->values[0].string.text; + else if (!strcmp(attr->name, "device-id") && + attr->value_tag == IPP_TAG_TEXT) + device_id = attr->values[0].string.text; + else if (!strcmp(attr->name, "device-info") && + attr->value_tag == IPP_TAG_TEXT) + device_info = attr->values[0].string.text; + else if (!strcmp(attr->name, "device-location") && + attr->value_tag == IPP_TAG_TEXT) + device_location = attr->values[0].string.text; + else if (!strcmp(attr->name, "device-make-and-model") && + attr->value_tag == IPP_TAG_TEXT) + device_make_and_model = attr->values[0].string.text; + else if (!strcmp(attr->name, "device-uri") && + attr->value_tag == IPP_TAG_URI) + device_uri = attr->values[0].string.text; + } + } + while (state != IPP_DATA); + + DEBUG_printf(("2cupsGetDevices: state=%d, response->last=%p", state, + response->last)); + + if (device_class && device_id && device_info && device_make_and_model && + device_uri) + (*callback)(device_class, device_id, device_info, + device_make_and_model, device_uri, device_location, user_data); + + /* + * Set the IPP status and return... + */ + + httpBlocking(http, blocking); + httpFlush(http); + + if (status == HTTP_ERROR) + _cupsSetError(IPP_ERROR, NULL, 0); + else + { + attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); + + DEBUG_printf(("cupsGetDevices: status-code=%s, status-message=\"%s\"", + ippErrorString(response->request.status.status_code), + attr ? attr->values[0].string.text : "")); + + _cupsSetError(response->request.status.status_code, + attr ? attr->values[0].string.text : + ippErrorString(response->request.status.status_code), 0); + } + + ippDelete(response); + + return (cupsLastError()); +} + + +/* + * End of "$Id: getdevices.c 9055 2010-03-25 23:06:26Z mike $". + */ diff --git a/cups/getifaddrs.c b/cups/getifaddrs.c new file mode 100644 index 0000000..26c912c --- /dev/null +++ b/cups/getifaddrs.c @@ -0,0 +1,266 @@ +/* + * "$Id: getifaddrs.c 9042 2010-03-24 00:45:34Z mike $" + * + * Network interface functions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * _cups_getifaddrs() - Get a list of network interfaces on the system. + * _cups_freeifaddrs() - Free an interface list... + */ + +/* + * Include necessary headers. + */ + +#include "http-private.h" + + +#ifndef HAVE_GETIFADDRS +/* + * '_cups_getifaddrs()' - Get a list of network interfaces on the system. + */ + +int /* O - 0 on success, -1 on error */ +_cups_getifaddrs(struct ifaddrs **addrs)/* O - List of interfaces */ +{ + int sock; /* Socket */ + char buffer[65536], /* Buffer for address info */ + *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + struct ifconf conf; /* Interface configurations */ + struct sockaddr addr; /* Address data */ + struct ifreq *ifp; /* Interface data */ + int ifpsize; /* Size of interface data */ + struct ifaddrs *temp; /* Pointer to current interface */ + struct ifreq request; /* Interface request */ + + + /* + * Start with an empty list... + */ + + if (addrs == NULL) + return (-1); + + *addrs = NULL; + + /* + * Create a UDP socket to get the interface data... + */ + + memset (&addr, 0, sizeof(addr)); + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + return (-1); + + /* + * Try to get the list of interfaces... + */ + + conf.ifc_len = sizeof(buffer); + conf.ifc_buf = buffer; + + if (ioctl(sock, SIOCGIFCONF, &conf) < 0) + { + /* + * Couldn't get the list of interfaces... + */ + + close(sock); + return (-1); + } + + /* + * OK, got the list of interfaces, now lets step through the + * buffer to pull them out... + */ + +# ifdef HAVE_STRUCT_SOCKADDR_SA_LEN +# define sockaddr_len(a) ((a)->sa_len) +# else +# define sockaddr_len(a) (sizeof(struct sockaddr)) +# endif /* HAVE_STRUCT_SOCKADDR_SA_LEN */ + + for (bufptr = buffer, bufend = buffer + conf.ifc_len; + bufptr < bufend; + bufptr += ifpsize) + { + /* + * Get the current interface information... + */ + + ifp = (struct ifreq *)bufptr; + ifpsize = sizeof(ifp->ifr_name) + sockaddr_len(&(ifp->ifr_addr)); + + if (ifpsize < sizeof(struct ifreq)) + ifpsize = sizeof(struct ifreq); + + memset(&request, 0, sizeof(request)); + memcpy(request.ifr_name, ifp->ifr_name, sizeof(ifp->ifr_name)); + + /* + * Check the status of the interface... + */ + + if (ioctl(sock, SIOCGIFFLAGS, &request) < 0) + continue; + + /* + * Allocate memory for a single interface record... + */ + + if ((temp = calloc(1, sizeof(struct ifaddrs))) == NULL) + { + /* + * Unable to allocate memory... + */ + + close(sock); + return (-1); + } + + /* + * Add this record to the front of the list and copy the name, flags, + * and network address... + */ + + temp->ifa_next = *addrs; + *addrs = temp; + temp->ifa_name = strdup(ifp->ifr_name); + temp->ifa_flags = request.ifr_flags; + if ((temp->ifa_addr = calloc(1, sockaddr_len(&(ifp->ifr_addr)))) != NULL) + memcpy(temp->ifa_addr, &(ifp->ifr_addr), sockaddr_len(&(ifp->ifr_addr))); + + /* + * Try to get the netmask for the interface... + */ + + if (!ioctl(sock, SIOCGIFNETMASK, &request)) + { + /* + * Got it, make a copy... + */ + + if ((temp->ifa_netmask = calloc(1, sizeof(request.ifr_netmask))) != NULL) + memcpy(temp->ifa_netmask, &(request.ifr_netmask), + sizeof(request.ifr_netmask)); + } + + /* + * Then get the broadcast or point-to-point (destination) address, + * if applicable... + */ + + if (temp->ifa_flags & IFF_BROADCAST) + { + /* + * Have a broadcast address, so get it! + */ + + if (!ioctl(sock, SIOCGIFBRDADDR, &request)) + { + /* + * Got it, make a copy... + */ + + if ((temp->ifa_broadaddr = + calloc(1, sizeof(request.ifr_broadaddr))) != NULL) + memcpy(temp->ifa_broadaddr, &(request.ifr_broadaddr), + sizeof(request.ifr_broadaddr)); + } + } + else if (temp->ifa_flags & IFF_POINTOPOINT) + { + /* + * Point-to-point interface; grab the remote address... + */ + + if (!ioctl(sock, SIOCGIFDSTADDR, &request)) + { + temp->ifa_dstaddr = malloc(sizeof(request.ifr_dstaddr)); + memcpy(temp->ifa_dstaddr, &(request.ifr_dstaddr), + sizeof(request.ifr_dstaddr)); + } + } + } + + /* + * OK, we're done with the socket, close it and return 0... + */ + + close(sock); + + return (0); +} + + +/* + * '_cups_freeifaddrs()' - Free an interface list... + */ + +void +_cups_freeifaddrs(struct ifaddrs *addrs)/* I - Interface list to free */ +{ + struct ifaddrs *next; /* Next interface in list */ + + + while (addrs != NULL) + { + /* + * Make a copy of the next interface pointer... + */ + + next = addrs->ifa_next; + + /* + * Free data values as needed... + */ + + if (addrs->ifa_name) + { + free(addrs->ifa_name); + addrs->ifa_name = NULL; + } + + if (addrs->ifa_addr) + { + free(addrs->ifa_addr); + addrs->ifa_addr = NULL; + } + + if (addrs->ifa_netmask) + { + free(addrs->ifa_netmask); + addrs->ifa_netmask = NULL; + } + + if (addrs->ifa_dstaddr) + { + free(addrs->ifa_dstaddr); + addrs->ifa_dstaddr = NULL; + } + + /* + * Free this node and continue to the next... + */ + + free(addrs); + + addrs = next; + } +} +#endif /* !HAVE_GETIFADDRS */ + + +/* + * End of "$Id: getifaddrs.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/getputfile.c b/cups/getputfile.c new file mode 100644 index 0000000..ec9a5f3 --- /dev/null +++ b/cups/getputfile.c @@ -0,0 +1,502 @@ +/* + * "$Id: getputfile.c 9042 2010-03-24 00:45:34Z mike $" + * + * Get/put file functions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsGetFd() - Get a file from the server. + * cupsGetFile() - Get a file from the server. + * cupsPutFd() - Put a file on the server. + * cupsPutFile() - Put a file on the server. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ + + +/* + * 'cupsGetFd()' - Get a file from the server. + * + * This function returns @code HTTP_OK@ when the file is successfully retrieved. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +http_status_t /* O - HTTP status */ +cupsGetFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *resource, /* I - Resource name */ + int fd) /* I - File descriptor */ +{ + int bytes; /* Number of bytes read */ + char buffer[8192]; /* Buffer for file */ + http_status_t status; /* HTTP status from server */ + char if_modified_since[HTTP_MAX_VALUE]; + /* If-Modified-Since header */ + + + /* + * Range check input... + */ + + DEBUG_printf(("cupsGetFd(http=%p, resource=\"%s\", fd=%d)", http, + resource, fd)); + + if (!resource || fd < 0) + { + if (http) + http->error = EINVAL; + + return (HTTP_ERROR); + } + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_SERVICE_UNAVAILABLE); + + /* + * Then send GET requests to the HTTP server... + */ + + strlcpy(if_modified_since, httpGetField(http, HTTP_FIELD_IF_MODIFIED_SINCE), + sizeof(if_modified_since)); + + do + { + httpClearFields(http); + httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); + httpSetField(http, HTTP_FIELD_IF_MODIFIED_SINCE, if_modified_since); + + if (httpGet(http, resource)) + { + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + else + { + status = HTTP_UNAUTHORIZED; + continue; + } + } + + while ((status = httpUpdate(http)) == HTTP_CONTINUE); + + if (status == HTTP_UNAUTHORIZED) + { + /* + * Flush any error message... + */ + + httpFlush(http); + + /* + * See if we can do authentication... + */ + + if (cupsDoAuthentication(http, "GET", resource)) + { + status = HTTP_AUTHORIZATION_CANCELED; + break; + } + + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + + continue; + } +#ifdef HAVE_SSL + else if (status == HTTP_UPGRADE_REQUIRED) + { + /* Flush any error message... */ + httpFlush(http); + + /* Reconnect... */ + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + + /* Upgrade with encryption... */ + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + + /* Try again, this time with encryption enabled... */ + continue; + } +#endif /* HAVE_SSL */ + } + while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED); + + /* + * See if we actually got the file or an error... + */ + + if (status == HTTP_OK) + { + /* + * Yes, copy the file... + */ + + while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) + write(fd, buffer, bytes); + } + else + { + _cupsSetHTTPError(status); + httpFlush(http); + } + + /* + * Return the request status... + */ + + DEBUG_printf(("1cupsGetFd: Returning %d...", status)); + + return (status); +} + + +/* + * 'cupsGetFile()' - Get a file from the server. + * + * This function returns @code HTTP_OK@ when the file is successfully retrieved. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +http_status_t /* O - HTTP status */ +cupsGetFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *resource, /* I - Resource name */ + const char *filename) /* I - Filename */ +{ + int fd; /* File descriptor */ + http_status_t status; /* Status */ + + + /* + * Range check input... + */ + + if (!http || !resource || !filename) + { + if (http) + http->error = EINVAL; + + return (HTTP_ERROR); + } + + /* + * Create the file... + */ + + if ((fd = open(filename, O_WRONLY | O_EXCL | O_TRUNC)) < 0) + { + /* + * Couldn't open the file! + */ + + http->error = errno; + + return (HTTP_ERROR); + } + + /* + * Get the file... + */ + + status = cupsGetFd(http, resource, fd); + + /* + * If the file couldn't be gotten, then remove the file... + */ + + close(fd); + + if (status != HTTP_OK) + unlink(filename); + + /* + * Return the HTTP status code... + */ + + return (status); +} + + +/* + * 'cupsPutFd()' - Put a file on the server. + * + * This function returns @code HTTP_CREATED@ when the file is stored + * successfully. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +http_status_t /* O - HTTP status */ +cupsPutFd(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *resource, /* I - Resource name */ + int fd) /* I - File descriptor */ +{ + int bytes, /* Number of bytes read */ + retries; /* Number of retries */ + char buffer[8192]; /* Buffer for file */ + http_status_t status; /* HTTP status from server */ + + + /* + * Range check input... + */ + + DEBUG_printf(("cupsPutFd(http=%p, resource=\"%s\", fd=%d)", http, + resource, fd)); + + if (!resource || fd < 0) + { + if (http) + http->error = EINVAL; + + return (HTTP_ERROR); + } + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_SERVICE_UNAVAILABLE); + + /* + * Then send PUT requests to the HTTP server... + */ + + retries = 0; + + do + { + DEBUG_printf(("2cupsPutFd: starting attempt, authstring=\"%s\"...", + http->authstring)); + + httpClearFields(http); + httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); + httpSetField(http, HTTP_FIELD_TRANSFER_ENCODING, "chunked"); + httpSetExpect(http, HTTP_CONTINUE); + + if (httpPut(http, resource)) + { + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + else + { + status = HTTP_UNAUTHORIZED; + continue; + } + } + + /* + * Wait up to 1 second for a 100-continue response... + */ + + if (httpWait(http, 1000)) + status = httpUpdate(http); + else + status = HTTP_CONTINUE; + + if (status == HTTP_CONTINUE) + { + /* + * Copy the file... + */ + + lseek(fd, 0, SEEK_SET); + + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + if (httpCheck(http)) + { + if ((status = httpUpdate(http)) != HTTP_CONTINUE) + break; + } + else + httpWrite2(http, buffer, bytes); + } + + if (status == HTTP_CONTINUE) + { + httpWrite2(http, buffer, 0); + + while ((status = httpUpdate(http)) == HTTP_CONTINUE); + } + + if (status == HTTP_ERROR && !retries) + { + DEBUG_printf(("2cupsPutFd: retry on status %d", status)); + + retries ++; + + /* Flush any error message... */ + httpFlush(http); + + /* Reconnect... */ + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + + /* Try again... */ + continue; + } + + DEBUG_printf(("2cupsPutFd: status=%d", status)); + + if (status == HTTP_UNAUTHORIZED) + { + /* + * Flush any error message... + */ + + httpFlush(http); + + /* + * See if we can do authentication... + */ + + if (cupsDoAuthentication(http, "PUT", resource)) + { + status = HTTP_AUTHORIZATION_CANCELED; + break; + } + + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + + continue; + } +#ifdef HAVE_SSL + else if (status == HTTP_UPGRADE_REQUIRED) + { + /* Flush any error message... */ + httpFlush(http); + + /* Reconnect... */ + if (httpReconnect(http)) + { + status = HTTP_ERROR; + break; + } + + /* Upgrade with encryption... */ + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + + /* Try again, this time with encryption enabled... */ + continue; + } +#endif /* HAVE_SSL */ + } + while (status == HTTP_UNAUTHORIZED || status == HTTP_UPGRADE_REQUIRED || + (status == HTTP_ERROR && retries < 2)); + + /* + * See if we actually put the file or an error... + */ + + if (status != HTTP_CREATED) + { + _cupsSetHTTPError(status); + httpFlush(http); + } + + DEBUG_printf(("1cupsPutFd: Returning %d...", status)); + + return (status); +} + + +/* + * 'cupsPutFile()' - Put a file on the server. + * + * This function returns @code HTTP_CREATED@ when the file is stored + * successfully. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +http_status_t /* O - HTTP status */ +cupsPutFile(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *resource, /* I - Resource name */ + const char *filename) /* I - Filename */ +{ + int fd; /* File descriptor */ + http_status_t status; /* Status */ + + + /* + * Range check input... + */ + + if (!http || !resource || !filename) + { + if (http) + http->error = EINVAL; + + return (HTTP_ERROR); + } + + /* + * Open the local file... + */ + + if ((fd = open(filename, O_RDONLY)) < 0) + { + /* + * Couldn't open the file! + */ + + http->error = errno; + + return (HTTP_ERROR); + } + + /* + * Put the file... + */ + + status = cupsPutFd(http, resource, fd); + + close(fd); + + return (status); +} + + +/* + * End of "$Id: getputfile.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/globals.c b/cups/globals.c new file mode 100644 index 0000000..0f77a76 --- /dev/null +++ b/cups/globals.c @@ -0,0 +1,360 @@ +/* + * "$Id: globals.c 10436 2012-04-23 21:52:02Z mike $" + * + * Global variable access routines for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsGlobalLock() - Lock the global mutex. + * _cupsGlobals() - Return a pointer to thread local storage + * _cupsGlobalUnlock() - Unlock the global mutex. + * DllMain() - Main entry for library. + * cups_globals_alloc() - Allocate and initialize global data. + * cups_globals_free() - Free global data. + * cups_globals_init() - Initialize environment variables. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * Local globals... + */ + + +static _cups_threadkey_t cups_globals_key = _CUPS_THREADKEY_INITIALIZER; + /* Thread local storage key */ +#ifdef HAVE_PTHREAD_H +static pthread_once_t cups_globals_key_once = PTHREAD_ONCE_INIT; + /* One-time initialization object */ +#endif /* HAVE_PTHREAD_H */ +#if defined(HAVE_PTHREAD_H) || defined(WIN32) +static _cups_mutex_t cups_global_mutex = _CUPS_MUTEX_INITIALIZER; + /* Global critical section */ +#endif /* HAVE_PTHREAD_H || WIN32 */ + + +/* + * Local functions... + */ + +static _cups_globals_t *cups_globals_alloc(void); +#if defined(HAVE_PTHREAD_H) || defined(WIN32) +static void cups_globals_free(_cups_globals_t *g); +#endif /* HAVE_PTHREAD_H || WIN32 */ +#ifdef HAVE_PTHREAD_H +static void cups_globals_init(void); +#endif /* HAVE_PTHREAD_H */ + + +/* + * '_cupsGlobalLock()' - Lock the global mutex. + */ + +void +_cupsGlobalLock(void) +{ +#ifdef HAVE_PTHREAD_H + pthread_mutex_lock(&cups_global_mutex); +#elif defined(WIN32) + EnterCriticalSection(&cups_global_mutex.m_criticalSection); +#endif /* HAVE_PTHREAD_H */ +} + + +/* + * '_cupsGlobals()' - Return a pointer to thread local storage + */ + +_cups_globals_t * /* O - Pointer to global data */ +_cupsGlobals(void) +{ + _cups_globals_t *cg; /* Pointer to global data */ + + +#ifdef HAVE_PTHREAD_H + /* + * Initialize the global data exactly once... + */ + + pthread_once(&cups_globals_key_once, cups_globals_init); +#endif /* HAVE_PTHREAD_H */ + + /* + * See if we have allocated the data yet... + */ + + if ((cg = (_cups_globals_t *)_cupsThreadGetData(cups_globals_key)) == NULL) + { + /* + * No, allocate memory as set the pointer for the key... + */ + + if ((cg = cups_globals_alloc()) != NULL) + _cupsThreadSetData(cups_globals_key, cg); + } + + /* + * Return the pointer to the data... + */ + + return (cg); +} + + +/* + * '_cupsGlobalUnlock()' - Unlock the global mutex. + */ + +void +_cupsGlobalUnlock(void) +{ +#ifdef HAVE_PTHREAD_H + pthread_mutex_unlock(&cups_global_mutex); +#elif defined(WIN32) + LeaveCriticalSection(&cups_global_mutex.m_criticalSection); +#endif /* HAVE_PTHREAD_H */ +} + + +#ifdef WIN32 +/* + * 'DllMain()' - Main entry for library. + */ + +BOOL WINAPI /* O - Success/failure */ +DllMain(HINSTANCE hinst, /* I - DLL module handle */ + DWORD reason, /* I - Reason */ + LPVOID reserved) /* I - Unused */ +{ + _cups_globals_t *cg; /* Global data */ + + + (void)hinst; + (void)reserved; + + switch (reason) + { + case DLL_PROCESS_ATTACH : /* Called on library initialization */ + InitializeCriticalSection(&cups_global_mutex.m_criticalSection); + + if ((cups_globals_key = TlsAlloc()) == TLS_OUT_OF_INDEXES) + return (FALSE); + break; + + case DLL_THREAD_DETACH : /* Called when a thread terminates */ + if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) + cups_globals_free(cg); + break; + + case DLL_PROCESS_DETACH : /* Called when library is unloaded */ + if ((cg = (_cups_globals_t *)TlsGetValue(cups_globals_key)) != NULL) + cups_globals_free(cg); + + TlsFree(cups_globals_key); + DeleteCriticalSection(&cups_global_mutex.m_criticalSection); + break; + + default: + break; + } + + return (TRUE); +} +#endif /* WIN32 */ + + +/* + * 'cups_globals_alloc()' - Allocate and initialize global data. + */ + +static _cups_globals_t * /* O - Pointer to global data */ +cups_globals_alloc(void) +{ + _cups_globals_t *cg = malloc(sizeof(_cups_globals_t)); + /* Pointer to global data */ +#ifdef WIN32 + HKEY key; /* Registry key */ + DWORD size; /* Size of string */ + static char installdir[1024], /* Install directory */ + confdir[1024], /* Server root directory */ + localedir[1024]; /* Locale directory */ +#endif /* WIN32 */ + + + if (!cg) + return (NULL); + + /* + * Clear the global storage and set the default encryption and password + * callback values... + */ + + memset(cg, 0, sizeof(_cups_globals_t)); + cg->encryption = (http_encryption_t)-1; + cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; + cg->any_root = 1; + cg->expired_certs = 1; + cg->expired_root = 1; + + /* + * Then set directories as appropriate... + */ + +#ifdef WIN32 + /* + * Open the registry... + */ + + strcpy(installdir, "C:/Program Files/cups.org"); + + if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\cups.org", 0, KEY_READ, + &key)) + { + /* + * Grab the installation directory... + */ + + size = sizeof(installdir); + RegQueryValueEx(key, "installdir", NULL, NULL, installdir, &size); + RegCloseKey(key); + } + + snprintf(confdir, sizeof(confdir), "%s/conf", installdir); + snprintf(localedir, sizeof(localedir), "%s/locale", installdir); + + if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) + cg->cups_datadir = installdir; + + if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) + cg->cups_serverbin = installdir; + + if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) + cg->cups_serverroot = confdir; + + if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) + cg->cups_statedir = confdir; + + if ((cg->localedir = getenv("LOCALEDIR")) == NULL) + cg->localedir = localedir; + +#else +# ifdef HAVE_GETEUID + if ((geteuid() != getuid() && getuid()) || getegid() != getgid()) +# else + if (!getuid()) +# endif /* HAVE_GETEUID */ + { + /* + * When running setuid/setgid, don't allow environment variables to override + * the directories... + */ + + cg->cups_datadir = CUPS_DATADIR; + cg->cups_serverbin = CUPS_SERVERBIN; + cg->cups_serverroot = CUPS_SERVERROOT; + cg->cups_statedir = CUPS_STATEDIR; + cg->localedir = CUPS_LOCALEDIR; + } + else + { + /* + * Allow directories to be overridden by environment variables. + */ + + if ((cg->cups_datadir = getenv("CUPS_DATADIR")) == NULL) + cg->cups_datadir = CUPS_DATADIR; + + if ((cg->cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) + cg->cups_serverbin = CUPS_SERVERBIN; + + if ((cg->cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) + cg->cups_serverroot = CUPS_SERVERROOT; + + if ((cg->cups_statedir = getenv("CUPS_STATEDIR")) == NULL) + cg->cups_statedir = CUPS_STATEDIR; + + if ((cg->localedir = getenv("LOCALEDIR")) == NULL) + cg->localedir = CUPS_LOCALEDIR; + } +#endif /* WIN32 */ + + return (cg); +} + + +/* + * 'cups_globals_free()' - Free global data. + */ + +#if defined(HAVE_PTHREAD_H) || defined(WIN32) +static void +cups_globals_free(_cups_globals_t *cg) /* I - Pointer to global data */ +{ + _ipp_buffer_t *buffer, /* Current IPP read/write buffer */ + *next; /* Next buffer */ + + + if (cg->last_status_message) + _cupsStrFree(cg->last_status_message); + + for (buffer = cg->ipp_buffers; buffer; buffer = next) + { + next = buffer->next; + free(buffer); + } + + cupsArrayDelete(cg->leg_size_lut); + cupsArrayDelete(cg->ppd_size_lut); + cupsArrayDelete(cg->pwg_size_lut); + + httpClose(cg->http); + + _httpFreeCredentials(cg->tls_credentials); + + cupsFileClose(cg->stdio_files[0]); + cupsFileClose(cg->stdio_files[1]); + cupsFileClose(cg->stdio_files[2]); + + cupsFreeOptions(cg->cupsd_num_settings, cg->cupsd_settings); + + free(cg); +} +#endif /* HAVE_PTHREAD_H || WIN32 */ + + +#ifdef HAVE_PTHREAD_H +/* + * 'cups_globals_init()' - Initialize environment variables. + */ + +static void +cups_globals_init(void) +{ + /* + * Register the global data for this thread... + */ + + pthread_key_create(&cups_globals_key, (void (*)(void *))cups_globals_free); +} +#endif /* HAVE_PTHREAD_H */ + + +/* + * End of "$Id: globals.c 10436 2012-04-23 21:52:02Z mike $". + */ diff --git a/cups/http-addr.c b/cups/http-addr.c new file mode 100644 index 0000000..db9895d --- /dev/null +++ b/cups/http-addr.c @@ -0,0 +1,705 @@ +/* + * "$Id: http-addr.c 9868 2011-08-06 04:53:00Z mike $" + * + * HTTP address routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * httpAddrAny() - Check for the "any" address. + * httpAddrEqual() - Compare two addresses. + * httpAddrLocalhost() - Check for the local loopback address. + * httpAddrLookup() - Lookup the hostname associated with the address. + * _httpAddrPort() - Get the port number associated with an address. + * _httpAddrSetPort() - Set the port number associated with an address. + * httpAddrString() - Convert an IP address to a dotted string. + * httpGetHostByName() - Lookup a hostname or IP address, and return + * address records for the specified name. + * httpGetHostname() - Get the FQDN for the local system. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#ifdef HAVE_RESOLV_H +# include +#endif /* HAVE_RESOLV_H */ +#ifdef HAVE_COREFOUNDATION +# include +#endif /* HAVE_COREFOUNDATION */ +#ifdef HAVE_SYSTEMCONFIGURATION +# include +#endif /* HAVE_SYSTEMCONFIGURATION */ + + +/* + * 'httpAddrAny()' - Check for the "any" address. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 if "any", 0 otherwise */ +httpAddrAny(const http_addr_t *addr) /* I - Address to check */ +{ + if (!addr) + return (0); + +#ifdef AF_INET6 + if (addr->addr.sa_family == AF_INET6 && + IN6_IS_ADDR_UNSPECIFIED(&(addr->ipv6.sin6_addr))) + return (1); +#endif /* AF_INET6 */ + + if (addr->addr.sa_family == AF_INET && + ntohl(addr->ipv4.sin_addr.s_addr) == 0x00000000) + return (1); + + return (0); +} + + +/* + * 'httpAddrEqual()' - Compare two addresses. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 if equal, 0 if not */ +httpAddrEqual(const http_addr_t *addr1, /* I - First address */ + const http_addr_t *addr2) /* I - Second address */ +{ + if (!addr1 && !addr2) + return (1); + + if (!addr1 || !addr2) + return (0); + + if (addr1->addr.sa_family != addr2->addr.sa_family) + return (0); + +#ifdef AF_LOCAL + if (addr1->addr.sa_family == AF_LOCAL) + return (!strcmp(addr1->un.sun_path, addr2->un.sun_path)); +#endif /* AF_LOCAL */ + +#ifdef AF_INET6 + if (addr1->addr.sa_family == AF_INET6) + return (!memcmp(&(addr1->ipv6.sin6_addr), &(addr2->ipv6.sin6_addr), 16)); +#endif /* AF_INET6 */ + + return (addr1->ipv4.sin_addr.s_addr == addr2->ipv4.sin_addr.s_addr); +} + + +/* + * 'httpAddrLength()' - Return the length of the address in bytes. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Length in bytes */ +httpAddrLength(const http_addr_t *addr) /* I - Address */ +{ + if (!addr) + return (0); + +#ifdef AF_INET6 + if (addr->addr.sa_family == AF_INET6) + return (sizeof(addr->ipv6)); + else +#endif /* AF_INET6 */ +#ifdef AF_LOCAL + if (addr->addr.sa_family == AF_LOCAL) + return (offsetof(struct sockaddr_un, sun_path) + + strlen(addr->un.sun_path) + 1); + else +#endif /* AF_LOCAL */ + if (addr->addr.sa_family == AF_INET) + return (sizeof(addr->ipv4)); + else + return (0); + +} + + +/* + * 'httpAddrLocalhost()' - Check for the local loopback address. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 if local host, 0 otherwise */ +httpAddrLocalhost( + const http_addr_t *addr) /* I - Address to check */ +{ + if (!addr) + return (1); + +#ifdef AF_INET6 + if (addr->addr.sa_family == AF_INET6 && + IN6_IS_ADDR_LOOPBACK(&(addr->ipv6.sin6_addr))) + return (1); +#endif /* AF_INET6 */ + +#ifdef AF_LOCAL + if (addr->addr.sa_family == AF_LOCAL) + return (1); +#endif /* AF_LOCAL */ + + if (addr->addr.sa_family == AF_INET && + (ntohl(addr->ipv4.sin_addr.s_addr) & 0xff000000) == 0x7f000000) + return (1); + + return (0); +} + + +#ifdef __sgi +# define ADDR_CAST (struct sockaddr *) +#else +# define ADDR_CAST (char *) +#endif /* __sgi */ + + +/* + * 'httpAddrLookup()' - Lookup the hostname associated with the address. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Host name */ +httpAddrLookup( + const http_addr_t *addr, /* I - Address to lookup */ + char *name, /* I - Host name buffer */ + int namelen) /* I - Size of name buffer */ +{ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + DEBUG_printf(("httpAddrLookup(addr=%p, name=%p, namelen=%d)", addr, name, + namelen)); + + /* + * Range check input... + */ + + if (!addr || !name || namelen <= 2) + { + if (name && namelen >= 1) + *name = '\0'; + + return (NULL); + } + +#ifdef AF_LOCAL + if (addr->addr.sa_family == AF_LOCAL) + { + strlcpy(name, addr->un.sun_path, namelen); + return (name); + } +#endif /* AF_LOCAL */ + + /* + * Optimize lookups for localhost/loopback addresses... + */ + + if (httpAddrLocalhost(addr)) + { + strlcpy(name, "localhost", namelen); + return (name); + } + +#ifdef HAVE_RES_INIT + /* + * STR #2920: Initialize resolver after failure in cups-polld + * + * If the previous lookup failed, re-initialize the resolver to prevent + * temporary network errors from persisting. This *should* be handled by + * the resolver libraries, but apparently the glibc folks do not agree. + * + * We set a flag at the end of this function if we encounter an error that + * requires reinitialization of the resolver functions. We then call + * res_init() if the flag is set on the next call here or in httpAddrLookup(). + */ + + if (cg->need_res_init) + { + res_init(); + + cg->need_res_init = 0; + } +#endif /* HAVE_RES_INIT */ + +#ifdef HAVE_GETNAMEINFO + { + /* + * STR #2486: httpAddrLookup() fails when getnameinfo() returns EAI_AGAIN + * + * FWIW, I think this is really a bug in the implementation of + * getnameinfo(), but falling back on httpAddrString() is easy to + * do... + */ + + int error = getnameinfo(&addr->addr, httpAddrLength(addr), name, namelen, + NULL, 0, 0); + + if (error) + { + if (error == EAI_FAIL) + cg->need_res_init = 1; + + return (httpAddrString(addr, name, namelen)); + } + } +#else + { + struct hostent *host; /* Host from name service */ + + +# ifdef AF_INET6 + if (addr->addr.sa_family == AF_INET6) + host = gethostbyaddr(ADDR_CAST &(addr->ipv6.sin6_addr), + sizeof(struct in_addr), AF_INET6); + else +# endif /* AF_INET6 */ + host = gethostbyaddr(ADDR_CAST &(addr->ipv4.sin_addr), + sizeof(struct in_addr), AF_INET); + + if (host == NULL) + { + /* + * No hostname, so return the raw address... + */ + + if (h_errno == NO_RECOVERY) + cg->need_res_init = 1; + + return (httpAddrString(addr, name, namelen)); + } + + strlcpy(name, host->h_name, namelen); + } +#endif /* HAVE_GETNAMEINFO */ + + DEBUG_printf(("1httpAddrLookup: returning \"%s\"...", name)); + + return (name); +} + + +/* + * '_httpAddrPort()' - Get the port number associated with an address. + */ + +int /* O - Port number */ +_httpAddrPort(http_addr_t *addr) /* I - Address */ +{ + if (!addr) + return (ippPort()); +#ifdef AF_INET6 + else if (addr->addr.sa_family == AF_INET6) + return (ntohs(addr->ipv6.sin6_port)); +#endif /* AF_INET6 */ + else if (addr->addr.sa_family == AF_INET) + return (ntohs(addr->ipv4.sin_port)); + else + return (ippPort()); +} + + +/* + * '_httpAddrSetPort()' - Set the port number associated with an address. + */ + +void +_httpAddrSetPort(http_addr_t *addr, /* I - Address */ + int port) /* I - Port */ +{ + if (!addr || port <= 0) + return; + +#ifdef AF_INET6 + if (addr->addr.sa_family == AF_INET6) + addr->ipv6.sin6_port = htons(port); + else +#endif /* AF_INET6 */ + if (addr->addr.sa_family == AF_INET) + addr->ipv4.sin_port = htons(port); +} + + +/* + * 'httpAddrString()' - Convert an address to a numeric string. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Numeric address string */ +httpAddrString(const http_addr_t *addr, /* I - Address to convert */ + char *s, /* I - String buffer */ + int slen) /* I - Length of string */ +{ + DEBUG_printf(("httpAddrString(addr=%p, s=%p, slen=%d)", addr, s, slen)); + + /* + * Range check input... + */ + + if (!addr || !s || slen <= 2) + { + if (s && slen >= 1) + *s = '\0'; + + return (NULL); + } + +#ifdef AF_LOCAL + if (addr->addr.sa_family == AF_LOCAL) + { + if (addr->un.sun_path[0] == '/') + strlcpy(s, addr->un.sun_path, slen); + else + strlcpy(s, "localhost", slen); + } + else +#endif /* AF_LOCAL */ + if (addr->addr.sa_family == AF_INET) + { + unsigned temp; /* Temporary address */ + + + temp = ntohl(addr->ipv4.sin_addr.s_addr); + + snprintf(s, slen, "%d.%d.%d.%d", (temp >> 24) & 255, + (temp >> 16) & 255, (temp >> 8) & 255, temp & 255); + } +#ifdef AF_INET6 + else if (addr->addr.sa_family == AF_INET6) + { + char *sptr, /* Pointer into string */ + temps[64]; /* Temporary string for address */ + +# ifdef HAVE_GETNAMEINFO + if (getnameinfo(&addr->addr, httpAddrLength(addr), temps, sizeof(temps), + NULL, 0, NI_NUMERICHOST)) + { + /* + * If we get an error back, then the address type is not supported + * and we should zero out the buffer... + */ + + s[0] = '\0'; + + return (NULL); + } + else if ((sptr = strchr(temps, '%')) != NULL) + { + /* + * Convert "%zone" to "+zone" to match URI form... + */ + + *sptr = '+'; + } + +# else + int i; /* Looping var */ + unsigned temp; /* Current value */ + const char *prefix; /* Prefix for address */ + + + prefix = ""; + for (sptr = temps, i = 0; i < 4 && addr->ipv6.sin6_addr.s6_addr32[i]; i ++) + { + temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]); + + snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, + (temp >> 16) & 0xffff); + prefix = ":"; + sptr += strlen(sptr); + + temp &= 0xffff; + + if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1]) + { + snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, temp); + sptr += strlen(sptr); + } + } + + if (i < 4) + { + while (i < 4 && !addr->ipv6.sin6_addr.s6_addr32[i]) + i ++; + + if (i < 4) + { + snprintf(sptr, sizeof(temps) - (sptr - temps), "%s:", prefix); + prefix = ":"; + sptr += strlen(sptr); + + for (; i < 4; i ++) + { + temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]); + + if ((temp & 0xffff0000) || + (i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1])) + { + snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, + (temp >> 16) & 0xffff); + sptr += strlen(sptr); + } + + snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, + temp & 0xffff); + sptr += strlen(sptr); + } + } + else if (sptr == s) + { + /* + * Empty address... + */ + + strlcpy(temps, "::", sizeof(temps)); + } + else + { + /* + * Empty at end... + */ + + strlcpy(sptr, "::", sizeof(temps) - (sptr - temps)); + } + } +# endif /* HAVE_GETNAMEINFO */ + + /* + * Add "[v1." and "]" around IPv6 address to convert to URI form. + */ + + snprintf(s, slen, "[v1.%s]", temps); + } +#endif /* AF_INET6 */ + else + strlcpy(s, "UNKNOWN", slen); + + DEBUG_printf(("1httpAddrString: returning \"%s\"...", s)); + + return (s); +} + + +/* + * 'httpGetHostByName()' - Lookup a hostname or IPv4 address, and return + * address records for the specified name. + * + * @deprecated@ + */ + +struct hostent * /* O - Host entry */ +httpGetHostByName(const char *name) /* I - Hostname or IP address */ +{ + const char *nameptr; /* Pointer into name */ + unsigned ip[4]; /* IP address components */ + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + + + DEBUG_printf(("httpGetHostByName(name=\"%s\")", name)); + + /* + * Avoid lookup delays and configuration problems when connecting + * to the localhost address... + */ + + if (!strcmp(name, "localhost")) + name = "127.0.0.1"; + + /* + * This function is needed because some operating systems have a + * buggy implementation of gethostbyname() that does not support + * IP addresses. If the first character of the name string is a + * number, then sscanf() is used to extract the IP components. + * We then pack the components into an IPv4 address manually, + * since the inet_aton() function is deprecated. We use the + * htonl() macro to get the right byte order for the address. + * + * We also support domain sockets when supported by the underlying + * OS... + */ + +#ifdef AF_LOCAL + if (name[0] == '/') + { + /* + * A domain socket address, so make an AF_LOCAL entry and return it... + */ + + cg->hostent.h_name = (char *)name; + cg->hostent.h_aliases = NULL; + cg->hostent.h_addrtype = AF_LOCAL; + cg->hostent.h_length = strlen(name) + 1; + cg->hostent.h_addr_list = cg->ip_ptrs; + cg->ip_ptrs[0] = (char *)name; + cg->ip_ptrs[1] = NULL; + + DEBUG_puts("1httpGetHostByName: returning domain socket address..."); + + return (&cg->hostent); + } +#endif /* AF_LOCAL */ + + for (nameptr = name; isdigit(*nameptr & 255) || *nameptr == '.'; nameptr ++); + + if (!*nameptr) + { + /* + * We have an IPv4 address; break it up and provide the host entry + * to the caller. + */ + + if (sscanf(name, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) != 4) + return (NULL); /* Must have 4 numbers */ + + if (ip[0] > 255 || ip[1] > 255 || ip[2] > 255 || ip[3] > 255) + return (NULL); /* Invalid byte ranges! */ + + cg->ip_addr = htonl(((((((ip[0] << 8) | ip[1]) << 8) | ip[2]) << 8) | + ip[3])); + + /* + * Fill in the host entry and return it... + */ + + cg->hostent.h_name = (char *)name; + cg->hostent.h_aliases = NULL; + cg->hostent.h_addrtype = AF_INET; + cg->hostent.h_length = 4; + cg->hostent.h_addr_list = cg->ip_ptrs; + cg->ip_ptrs[0] = (char *)&(cg->ip_addr); + cg->ip_ptrs[1] = NULL; + + DEBUG_puts("1httpGetHostByName: returning IPv4 address..."); + + return (&cg->hostent); + } + else + { + /* + * Use the gethostbyname() function to get the IPv4 address for + * the name... + */ + + DEBUG_puts("1httpGetHostByName: returning domain lookup address(es)..."); + + return (gethostbyname(name)); + } +} + + +/* + * 'httpGetHostname()' - Get the FQDN for the connection or local system. + * + * When "http" points to a connected socket, return the hostname or + * address that was used in the call to httpConnect() or httpConnectEncrypt(). + * Otherwise, return the FQDN for the local system using both gethostname() + * and gethostbyname() to get the local hostname with domain. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - FQDN for connection or system */ +httpGetHostname(http_t *http, /* I - HTTP connection or NULL */ + char *s, /* I - String buffer for name */ + int slen) /* I - Size of buffer */ +{ + if (!s || slen <= 1) + return (NULL); + + if (http) + { + if (http->hostname[0] == '/') + strlcpy(s, "localhost", slen); + else + strlcpy(s, http->hostname, slen); + } + else + { + /* + * Get the hostname... + */ + + if (gethostname(s, slen) < 0) + strlcpy(s, "localhost", slen); + + if (!strchr(s, '.')) + { +#ifdef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME + /* + * The hostname is not a FQDN, so use the local hostname from the + * SystemConfiguration framework... + */ + + SCDynamicStoreRef sc = SCDynamicStoreCreate(kCFAllocatorDefault, + CFSTR("libcups"), NULL, NULL); + /* System configuration data */ + CFStringRef local = sc ? SCDynamicStoreCopyLocalHostName(sc) : NULL; + /* Local host name */ + char localStr[1024]; /* Local host name C string */ + + if (local && CFStringGetCString(local, localStr, sizeof(localStr), + kCFStringEncodingUTF8)) + { + /* + * Append ".local." to the hostname we get... + */ + + snprintf(s, slen, "%s.local.", localStr); + } + + if (local) + CFRelease(local); + if (sc) + CFRelease(sc); + +#else + /* + * The hostname is not a FQDN, so look it up... + */ + + struct hostent *host; /* Host entry to get FQDN */ + + if ((host = gethostbyname(s)) != NULL && host->h_name) + { + /* + * Use the resolved hostname... + */ + + strlcpy(s, host->h_name, slen); + } +#endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ + } + } + + /* + * Return the hostname with as much domain info as we have... + */ + + return (s); +} + + +/* + * End of "$Id: http-addr.c 9868 2011-08-06 04:53:00Z mike $". + */ diff --git a/cups/http-addrlist.c b/cups/http-addrlist.c new file mode 100644 index 0000000..a07ffb3 --- /dev/null +++ b/cups/http-addrlist.c @@ -0,0 +1,677 @@ +/* + * "$Id: http-addrlist.c 10006 2011-09-20 18:36:33Z mike $" + * + * HTTP address list routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * httpAddrConnect() - Connect to any of the addresses in the list. + * httpAddrFreeList() - Free an address list. + * httpAddrGetList() - Get a list of addresses for a hostname. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#ifdef HAVE_RESOLV_H +# include +#endif /* HAVE_RESOLV_H */ + + +/* + * 'httpAddrConnect()' - Connect to any of the addresses in the list. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_addrlist_t * /* O - Connected address or NULL on failure */ +httpAddrConnect( + http_addrlist_t *addrlist, /* I - List of potential addresses */ + int *sock) /* O - Socket */ +{ + int val; /* Socket option value */ +#ifdef __APPLE__ + struct timeval timeout; /* Socket timeout value */ +#endif /* __APPLE__ */ +#ifdef DEBUG + char temp[256]; /* Temporary address string */ +#endif /* DEBUG */ + + + DEBUG_printf(("httpAddrConnect(addrlist=%p, sock=%p)", addrlist, sock)); + + if (!sock) + { + errno = EINVAL; + return (NULL); + } + + /* + * Loop through each address until we connect or run out of addresses... + */ + + while (addrlist) + { + /* + * Create the socket... + */ + + DEBUG_printf(("2httpAddrConnect: Trying %s:%d...", + httpAddrString(&(addrlist->addr), temp, sizeof(temp)), + _httpAddrPort(&(addrlist->addr)))); + + if ((*sock = (int)socket(_httpAddrFamily(&(addrlist->addr)), SOCK_STREAM, + 0)) < 0) + { + /* + * Don't abort yet, as this could just be an issue with the local + * system not being configured with IPv4/IPv6/domain socket enabled... + */ + + addrlist = addrlist->next; + continue; + } + + /* + * Set options... + */ + + val = 1; +#ifdef WIN32 + setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, + sizeof(val)); +#else + setsockopt(*sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); +#endif /* WIN32 */ + +#ifdef SO_REUSEPORT + val = 1; + setsockopt(*sock, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val)); +#endif /* SO_REUSEPORT */ + +#ifdef SO_NOSIGPIPE + val = 1; + setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val)); +#endif /* SO_NOSIGPIPE */ + +#ifdef __APPLE__ + /* + * Use a 30-second read timeout when connecting to limit the amount of time + * we block... + */ + + timeout.tv_sec = 30; + timeout.tv_usec = 0; + setsockopt(*sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)); +#endif /* __APPLE__ */ + + /* + * Using TCP_NODELAY improves responsiveness, especially on systems + * with a slow loopback interface... + */ + + val = 1; +#ifdef WIN32 + setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, (const char *)&val, + sizeof(val)); +#else + setsockopt(*sock, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)); +#endif /* WIN32 */ + +#ifdef FD_CLOEXEC + /* + * Close this socket when starting another process... + */ + + fcntl(*sock, F_SETFD, FD_CLOEXEC); +#endif /* FD_CLOEXEC */ + + /* + * Then connect... + */ + + if (!connect(*sock, &(addrlist->addr.addr), + httpAddrLength(&(addrlist->addr)))) + { + DEBUG_printf(("1httpAddrConnect: Connected to %s:%d...", + httpAddrString(&(addrlist->addr), temp, sizeof(temp)), + _httpAddrPort(&(addrlist->addr)))); + break; + } + + DEBUG_printf(("1httpAddrConnect: Unable to connect to %s:%d: %s", + httpAddrString(&(addrlist->addr), temp, sizeof(temp)), + _httpAddrPort(&(addrlist->addr)), strerror(errno))); + + /* + * Close this socket and move to the next address... + */ + +#ifdef WIN32 + closesocket(*sock); +#else + close(*sock); +#endif /* WIN32 */ + + *sock = -1; + addrlist = addrlist->next; + } + + if (!addrlist) + _cupsSetError(IPP_SERVICE_UNAVAILABLE, strerror(errno), 0); + + return (addrlist); +} + + +/* + * 'httpAddrFreeList()' - Free an address list. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +httpAddrFreeList( + http_addrlist_t *addrlist) /* I - Address list to free */ +{ + http_addrlist_t *next; /* Next address in list */ + + + /* + * Free each address in the list... + */ + + while (addrlist) + { + next = addrlist->next; + + free(addrlist); + + addrlist = next; + } +} + + +/* + * 'httpAddrGetList()' - Get a list of addresses for a hostname. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_addrlist_t * /* O - List of addresses or NULL */ +httpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for passive listen address */ + int family, /* I - Address family or AF_UNSPEC */ + const char *service) /* I - Service name or port number */ +{ + http_addrlist_t *first, /* First address in list */ + *addr, /* Current address in list */ + *temp; /* New address */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + +#ifdef DEBUG + _cups_debug_printf("httpAddrGetList(hostname=\"%s\", family=AF_%s, " + "service=\"%s\")\n", + hostname ? hostname : "(nil)", + family == AF_UNSPEC ? "UNSPEC" : +# ifdef AF_LOCAL + family == AF_LOCAL ? "LOCAL" : +# endif /* AF_LOCAL */ +# ifdef AF_INET6 + family == AF_INET6 ? "INET6" : +# endif /* AF_INET6 */ + family == AF_INET ? "INET" : "???", service); +#endif /* DEBUG */ + +#ifdef HAVE_RES_INIT + /* + * STR #2920: Initialize resolver after failure in cups-polld + * + * If the previous lookup failed, re-initialize the resolver to prevent + * temporary network errors from persisting. This *should* be handled by + * the resolver libraries, but apparently the glibc folks do not agree. + * + * We set a flag at the end of this function if we encounter an error that + * requires reinitialization of the resolver functions. We then call + * res_init() if the flag is set on the next call here or in httpAddrLookup(). + */ + + if (cg->need_res_init) + { + res_init(); + + cg->need_res_init = 0; + } +#endif /* HAVE_RES_INIT */ + + + /* + * Lookup the address the best way we can... + */ + + first = addr = NULL; + +#ifdef AF_LOCAL + if (hostname && hostname[0] == '/') + { + /* + * Domain socket address... + */ + + if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL) + { + first->addr.un.sun_family = AF_LOCAL; + strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path)); + } + } + else +#endif /* AF_LOCAL */ + if (!hostname || _cups_strcasecmp(hostname, "localhost")) + { +#ifdef HAVE_GETADDRINFO + struct addrinfo hints, /* Address lookup hints */ + *results, /* Address lookup results */ + *current; /* Current result */ + char ipv6[64], /* IPv6 address */ + *ipv6zone; /* Pointer to zone separator */ + int ipv6len; /* Length of IPv6 address */ + int error; /* getaddrinfo() error */ + + + /* + * Lookup the address as needed... + */ + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_flags = hostname ? 0 : AI_PASSIVE; + hints.ai_socktype = SOCK_STREAM; + + if (hostname && *hostname == '[') + { + /* + * Remove brackets from numeric IPv6 address... + */ + + if (!strncmp(hostname, "[v1.", 4)) + { + /* + * Copy the newer address format which supports link-local addresses... + */ + + strlcpy(ipv6, hostname + 4, sizeof(ipv6)); + if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') + { + ipv6[ipv6len] = '\0'; + hostname = ipv6; + + /* + * Convert "+zone" in address to "%zone"... + */ + + if ((ipv6zone = strrchr(ipv6, '+')) != NULL) + *ipv6zone = '%'; + } + } + else + { + /* + * Copy the regular non-link-local IPv6 address... + */ + + strlcpy(ipv6, hostname + 1, sizeof(ipv6)); + if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') + { + ipv6[ipv6len] = '\0'; + hostname = ipv6; + } + } + } + + if ((error = getaddrinfo(hostname, service, &hints, &results)) == 0) + { + /* + * Copy the results to our own address list structure... + */ + + for (current = results; current; current = current->ai_next) + if (current->ai_family == AF_INET || current->ai_family == AF_INET6) + { + /* + * Copy the address over... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + + if (current->ai_family == AF_INET6) + memcpy(&(temp->addr.ipv6), current->ai_addr, + sizeof(temp->addr.ipv6)); + else + memcpy(&(temp->addr.ipv4), current->ai_addr, + sizeof(temp->addr.ipv4)); + + /* + * Append the address to the list... + */ + + if (!first) + first = temp; + + if (addr) + addr->next = temp; + + addr = temp; + } + + /* + * Free the results from getaddrinfo()... + */ + + freeaddrinfo(results); + } + else if (error == EAI_FAIL) + cg->need_res_init = 1; + +#else + if (hostname) + { + int i; /* Looping vars */ + unsigned ip[4]; /* IPv4 address components */ + const char *ptr; /* Pointer into hostname */ + struct hostent *host; /* Result of lookup */ + struct servent *port; /* Port number for service */ + int portnum; /* Port number */ + + + /* + * Lookup the service... + */ + + if (!service) + portnum = 0; + else if (isdigit(*service & 255)) + portnum = atoi(service); + else if ((port = getservbyname(service, NULL)) != NULL) + portnum = ntohs(port->s_port); + else if (!strcmp(service, "http")) + portnum = 80; + else if (!strcmp(service, "https")) + portnum = 443; + else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) + portnum = 631; + else if (!strcmp(service, "lpd")) + portnum = 515; + else if (!strcmp(service, "socket")) + portnum = 9100; + else + return (NULL); + + /* + * This code is needed because some operating systems have a + * buggy implementation of gethostbyname() that does not support + * IPv4 addresses. If the hostname string is an IPv4 address, then + * sscanf() is used to extract the IPv4 components. We then pack + * the components into an IPv4 address manually, since the + * inet_aton() function is deprecated. We use the htonl() macro + * to get the right byte order for the address. + */ + + for (ptr = hostname; isdigit(*ptr & 255) || *ptr == '.'; ptr ++); + + if (!*ptr) + { + /* + * We have an IPv4 address; break it up and create an IPv4 address... + */ + + if (sscanf(hostname, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) == 4 && + ip[0] <= 255 && ip[1] <= 255 && ip[2] <= 255 && ip[3] <= 255) + { + first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!first) + return (NULL); + + first->addr.ipv4.sin_family = AF_INET; + first->addr.ipv4.sin_addr.s_addr = htonl(((((((ip[0] << 8) | + ip[1]) << 8) | + ip[2]) << 8) | ip[3])); + first->addr.ipv4.sin_port = htons(portnum); + } + } + else if ((host = gethostbyname(hostname)) != NULL && +# ifdef AF_INET6 + (host->h_addrtype == AF_INET || host->h_addrtype == AF_INET6)) +# else + host->h_addrtype == AF_INET) +# endif /* AF_INET6 */ + { + for (i = 0; host->h_addr_list[i]; i ++) + { + /* + * Copy the address over... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + +# ifdef AF_INET6 + if (host->h_addrtype == AF_INET6) + { + temp->addr.ipv6.sin6_family = AF_INET6; + memcpy(&(temp->addr.ipv6.sin6_addr), host->h_addr_list[i], + sizeof(temp->addr.ipv6)); + temp->addr.ipv6.sin6_port = htons(portnum); + } + else +# endif /* AF_INET6 */ + { + temp->addr.ipv4.sin_family = AF_INET; + memcpy(&(temp->addr.ipv4.sin_addr), host->h_addr_list[i], + sizeof(temp->addr.ipv4)); + temp->addr.ipv4.sin_port = htons(portnum); + } + + /* + * Append the address to the list... + */ + + if (!first) + first = temp; + + if (addr) + addr->next = temp; + + addr = temp; + } + } + else if (h_errno == NO_RECOVERY) + cg->need_res_init = 1; + } +#endif /* HAVE_GETADDRINFO */ + } + + /* + * Detect some common errors and handle them sanely... + */ + + if (!addr && (!hostname || !_cups_strcasecmp(hostname, "localhost"))) + { + struct servent *port; /* Port number for service */ + int portnum; /* Port number */ + + + /* + * Lookup the service... + */ + + if (!service) + portnum = 0; + else if (isdigit(*service & 255)) + portnum = atoi(service); + else if ((port = getservbyname(service, NULL)) != NULL) + portnum = ntohs(port->s_port); + else if (!strcmp(service, "http")) + portnum = 80; + else if (!strcmp(service, "https")) + portnum = 443; + else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) + portnum = 631; + else if (!strcmp(service, "lpd")) + portnum = 515; + else if (!strcmp(service, "socket")) + portnum = 9100; + else + { + httpAddrFreeList(first); + return (NULL); + } + + if (hostname && !_cups_strcasecmp(hostname, "localhost")) + { + /* + * Unfortunately, some users ignore all of the warnings in the + * /etc/hosts file and delete "localhost" from it. If we get here + * then we were unable to resolve the name, so use the IPv6 and/or + * IPv4 loopback interface addresses... + */ + +#ifdef AF_INET6 + if (family != AF_INET) + { + /* + * Add [::1] to the address list... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + + temp->addr.ipv6.sin6_family = AF_INET6; + temp->addr.ipv6.sin6_port = htons(portnum); +# ifdef WIN32 + temp->addr.ipv6.sin6_addr.u.Byte[15] = 1; +# else + temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1); +# endif /* WIN32 */ + + if (!first) + first = temp; + + addr = temp; + } + + if (family != AF_INET6) +#endif /* AF_INET6 */ + { + /* + * Add 127.0.0.1 to the address list... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + + temp->addr.ipv4.sin_family = AF_INET; + temp->addr.ipv4.sin_port = htons(portnum); + temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001); + + if (!first) + first = temp; + + if (addr) + addr->next = temp; + } + } + else if (!hostname) + { + /* + * Provide one or more passive listening addresses... + */ + +#ifdef AF_INET6 + if (family != AF_INET) + { + /* + * Add [::] to the address list... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + + temp->addr.ipv6.sin6_family = AF_INET6; + temp->addr.ipv6.sin6_port = htons(portnum); + + if (!first) + first = temp; + + addr = temp; + } + + if (family != AF_INET6) +#endif /* AF_INET6 */ + { + /* + * Add 0.0.0.0 to the address list... + */ + + temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); + if (!temp) + { + httpAddrFreeList(first); + return (NULL); + } + + temp->addr.ipv4.sin_family = AF_INET; + temp->addr.ipv4.sin_port = htons(portnum); + + if (!first) + first = temp; + + if (addr) + addr->next = temp; + } + } + } + + /* + * Return the address list... + */ + + return (first); +} + + +/* + * End of "$Id: http-addrlist.c 10006 2011-09-20 18:36:33Z mike $". + */ diff --git a/cups/http-private.h b/cups/http-private.h new file mode 100644 index 0000000..29ae57e --- /dev/null +++ b/cups/http-private.h @@ -0,0 +1,408 @@ +/* + * "$Id: http-private.h 9960 2011-09-02 22:37:14Z mike $" + * + * Private HTTP definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_HTTP_PRIVATE_H_ +# define _CUPS_HTTP_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include "config.h" +# include +# include + +# ifdef __sun +# include +# endif /* __sun */ + +# include +# ifdef WIN32 +# include +# include +# else +# include +# include +# include +# define closesocket(f) close(f) +# endif /* WIN32 */ + +# ifdef HAVE_GSSAPI +# ifdef HAVE_GSS_GSSAPI_H +# include +# ifdef HAVE_GSSAPI_GENERIC_H +# include +# endif /* HAVE_GSSAPI_GENERIC_H */ +# ifdef HAVE_GSSAPI_KRB5_H +# include +# endif /* HAVE_GSSAPI_KRB5_H */ +# elif defined(HAVE_GSSAPI_GSSAPI_H) +# include +# ifdef HAVE_GSSAPI_GENERIC_H +# include +# endif /* HAVE_GSSAPI_GENERIC_H */ +# ifdef HAVE_GSSAPI_KRB5_H +# include +# endif /* HAVE_GSSAPI_KRB5_H */ +# elif defined(HAVE_GSSAPI_H) +# include +# endif /* HAVE_GSS_GSSAPI_H */ +# ifndef HAVE_GSS_C_NT_HOSTBASED_SERVICE +# define GSS_C_NT_HOSTBASED_SERVICE gss_nt_service_name +# endif /* !HAVE_GSS_C_NT_HOSTBASED_SERVICE */ +# ifdef HAVE_KRB5_H +# include +# endif /* HAVE_KRB5_H */ +# endif /* HAVE_GSSAPI */ + +# ifdef HAVE_AUTHORIZATION_H +# include +# endif /* HAVE_AUTHORIZATION_H */ + +# if defined(__sgi) || (defined(__APPLE__) && !defined(_SOCKLEN_T)) +/* + * IRIX and MacOS X 10.2.x do not define socklen_t, and in fact use an int instead of + * unsigned type for length values... + */ + +typedef int socklen_t; +# endif /* __sgi || (__APPLE__ && !_SOCKLEN_T) */ + +# include +# include "md5-private.h" +# include "ipp-private.h" + +# if defined HAVE_LIBSSL +# include +# include +# include +# elif defined HAVE_GNUTLS +# include +# include +# include +# elif defined(HAVE_CDSASSL) +# include +# include +# include +# ifdef HAVE_SECURETRANSPORTPRIV_H +# include +# endif /* HAVE_SECURETRANSPORTPRIV_H */ +# ifdef HAVE_SECITEM_H +# include +# endif /* HAVE_SECITEM_H */ +# ifdef HAVE_SECBASEPRIV_H +# include +# endif /* HAVE_SECBASEPRIV_H */ +# ifdef HAVE_SECCERTIFICATE_H +# include +# include +# endif /* HAVE_SECCERTIFICATE_H */ +# ifdef HAVE_SECITEMPRIV_H +# include +# endif /* HAVE_SECITEMPRIV_H */ +# ifdef HAVE_SECIDENTITYSEARCHPRIV_H +# include +# endif /* HAVE_SECIDENTITYSEARCHPRIV_H */ +# ifdef HAVE_SECPOLICYPRIV_H +# include +# endif /* HAVE_SECPOLICYPRIV_H */ +# elif defined(HAVE_SSPISSL) +# include "sspi-private.h" +# endif /* HAVE_LIBSSL */ + +# ifndef WIN32 +# include +# ifdef HAVE_GETIFADDRS +# include +# else +# include +# ifdef HAVE_SYS_SOCKIO_H +# include +# endif /* HAVE_SYS_SOCKIO_H */ +# endif /* HAVE_GETIFADDRS */ +# endif /* !WIN32 */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + + +#define _HTTP_RESOLVE_DEFAULT 0 /* Just resolve with default options */ +#define _HTTP_RESOLVE_STDERR 1 /* Log resolve progress to stderr */ +#define _HTTP_RESOLVE_FQDN 2 /* Resolve to a FQDN */ + + +/* + * Types and functions for SSL support... + */ + +# if defined HAVE_LIBSSL +/* + * The OpenSSL library provides its own SSL/TLS context structure for its + * IO and protocol management. However, we need to provide our own BIO + * (basic IO) implementation to do timeouts... + */ + +typedef SSL *http_tls_t; +typedef void *http_tls_credentials_t; + +extern BIO_METHOD *_httpBIOMethods(void); + +# elif defined HAVE_GNUTLS +/* + * The GNU TLS library is more of a "bare metal" SSL/TLS library... + */ + +typedef gnutls_session http_tls_t; +typedef void *http_tls_credentials_t; + +extern ssize_t _httpReadGNUTLS(gnutls_transport_ptr ptr, void *data, + size_t length); +extern ssize_t _httpWriteGNUTLS(gnutls_transport_ptr ptr, const void *data, + size_t length); + +# elif defined(HAVE_CDSASSL) +/* + * Darwin's Security framework provides its own SSL/TLS context structure + * for its IO and protocol management... + */ + +# if !defined(HAVE_SECBASEPRIV_H) && defined(HAVE_CSSMERRORSTRING) /* Declare prototype for function in that header... */ +extern const char *cssmErrorString(int error); +# endif /* !HAVE_SECBASEPRIV_H && HAVE_CSSMERRORSTRING */ +# ifndef HAVE_SECITEMPRIV_H /* Declare constants from that header... */ +extern const CFTypeRef kSecClassCertificate; +extern const CFTypeRef kSecClassIdentity; +# endif /* !HAVE_SECITEMPRIV_H */ +# if !defined(HAVE_SECIDENTITYSEARCHPRIV_H) && defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) /* Declare prototype for function in that header... */ +extern OSStatus SecIdentitySearchCreateWithPolicy(SecPolicyRef policy, + CFStringRef idString, CSSM_KEYUSE keyUsage, + CFTypeRef keychainOrArray, + Boolean returnOnlyValidIdentities, + SecIdentitySearchRef* searchRef); +# endif /* !HAVE_SECIDENTITYSEARCHPRIV_H && HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY */ +# if !defined(HAVE_SECPOLICYPRIV_H) && defined(HAVE_SECPOLICYSETVALUE) /* Declare prototype for function in that header... */ +extern OSStatus SecPolicySetValue(SecPolicyRef policyRef, + const CSSM_DATA *value); +# endif /* !HAVE_SECPOLICYPRIV_H && HAVE_SECPOLICYSETVALUE */ + +typedef SSLContextRef http_tls_t; +typedef CFArrayRef http_tls_credentials_t; + +extern OSStatus _httpReadCDSA(SSLConnectionRef connection, void *data, + size_t *dataLength); +extern OSStatus _httpWriteCDSA(SSLConnectionRef connection, const void *data, + size_t *dataLength); + +# elif defined(HAVE_SSPISSL) +/* + * Windows' SSPI library gets a CUPS wrapper... + */ + +typedef _sspi_struct_t * http_tls_t; +typedef void *http_tls_credentials_t; + +# else +/* + * Otherwise define stub types since we have no SSL support... + */ + +typedef void *http_tls_t; +typedef void *http_tls_credentials_t; +# endif /* HAVE_LIBSSL */ + +struct _http_s /**** HTTP connection structure. ****/ +{ + int fd; /* File descriptor for this socket */ + int blocking; /* To block or not to block */ + int error; /* Last error on read */ + time_t activity; /* Time since last read/write */ + http_state_t state; /* State of client */ + http_status_t status; /* Status of last request */ + http_version_t version; /* Protocol version */ + http_keepalive_t keep_alive; /* Keep-alive supported? */ + struct sockaddr_in _hostaddr; /* Address of connected host (deprecated) */ + char hostname[HTTP_MAX_HOST], + /* Name of connected host */ + fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE]; + /* Field values */ + char *data; /* Pointer to data buffer */ + http_encoding_t data_encoding; /* Chunked or not */ + int _data_remaining;/* Number of bytes left (deprecated) */ + int used; /* Number of bytes used in buffer */ + char buffer[HTTP_MAX_BUFFER]; + /* Buffer for incoming data */ + int auth_type; /* Authentication in use */ + _cups_md5_state_t md5_state; /* MD5 state */ + char nonce[HTTP_MAX_VALUE]; + /* Nonce value */ + int nonce_count; /* Nonce count */ + http_tls_t tls; /* TLS state information */ + http_encryption_t encryption; /* Encryption requirements */ + /**** New in CUPS 1.1.19 ****/ + fd_set *input_set; /* select() set for httpWait() (deprecated) */ + http_status_t expect; /* Expect: header */ + char *cookie; /* Cookie value(s) */ + /**** New in CUPS 1.1.20 ****/ + char _authstring[HTTP_MAX_VALUE], + /* Current Authentication value (deprecated) */ + userpass[HTTP_MAX_VALUE]; + /* Username:password string */ + int digest_tries; /* Number of tries for digest auth */ + /**** New in CUPS 1.2 ****/ + off_t data_remaining; /* Number of bytes left */ + http_addr_t *hostaddr; /* Current host address and port */ + http_addrlist_t *addrlist; /* List of valid addresses */ + char wbuffer[HTTP_MAX_BUFFER]; + /* Buffer for outgoing data */ + int wused; /* Write buffer bytes used */ + /**** New in CUPS 1.3 ****/ + char *field_authorization; + /* Authorization field */ + char *authstring; /* Current authorization field */ +# ifdef HAVE_GSSAPI + gss_OID gssmech; /* Authentication mechanism */ + gss_ctx_id_t gssctx; /* Authentication context */ + gss_name_t gssname; /* Authentication server name */ +# endif /* HAVE_GSSAPI */ +# ifdef HAVE_AUTHORIZATION_H + AuthorizationRef auth_ref; /* Authorization ref */ +# endif /* HAVE_AUTHORIZATION_H */ + /**** New in CUPS 1.5 ****/ + http_tls_credentials_t tls_credentials; + /* TLS credentials */ + http_timeout_cb_t timeout_cb; /* Timeout callback */ + void *timeout_data; /* User data pointer */ + double timeout_value; /* Timeout in seconds */ + int wait_value; /* httpWait value for timeout */ +# ifdef HAVE_GSSAPI + char gsshost[256]; /* Hostname for Kerberos */ +# endif /* HAVE_GSSAPI */ +}; + + +/* + * Some OS's don't have hstrerror(), most notably Solaris... + */ + +# ifndef HAVE_HSTRERROR +extern const char *_cups_hstrerror(int error); +# define hstrerror _cups_hstrerror +# elif defined(_AIX) || defined(__osf__) +/* + * AIX and Tru64 UNIX don't provide a prototype but do provide the function... + */ +extern const char *hstrerror(int error); +# endif /* !HAVE_HSTRERROR */ + + +/* + * Some OS's don't have getifaddrs() and freeifaddrs()... + */ + +# if !defined(WIN32) && !defined(HAVE_GETIFADDRS) +# ifdef ifa_dstaddr +# undef ifa_dstaddr +# endif /* ifa_dstaddr */ +# ifndef ifr_netmask +# define ifr_netmask ifr_addr +# endif /* !ifr_netmask */ + +struct ifaddrs /**** Interface Structure ****/ +{ + struct ifaddrs *ifa_next; /* Next interface in list */ + char *ifa_name; /* Name of interface */ + unsigned int ifa_flags; /* Flags (up, point-to-point, etc.) */ + struct sockaddr *ifa_addr, /* Network address */ + *ifa_netmask; /* Address mask */ + union + { + struct sockaddr *ifu_broadaddr; /* Broadcast address of this interface. */ + struct sockaddr *ifu_dstaddr; /* Point-to-point destination address. */ + } ifa_ifu; + + void *ifa_data; /* Interface statistics */ +}; + +# ifndef ifa_broadaddr +# define ifa_broadaddr ifa_ifu.ifu_broadaddr +# endif /* !ifa_broadaddr */ +# ifndef ifa_dstaddr +# define ifa_dstaddr ifa_ifu.ifu_dstaddr +# endif /* !ifa_dstaddr */ + +extern int _cups_getifaddrs(struct ifaddrs **addrs); +# define getifaddrs _cups_getifaddrs +extern void _cups_freeifaddrs(struct ifaddrs *addrs); +# define freeifaddrs _cups_freeifaddrs +# endif /* !WIN32 && !HAVE_GETIFADDRS */ + + +/* + * Prototypes... + */ + +#define _httpAddrFamily(addrp) (addrp)->addr.sa_family +extern int _httpAddrPort(http_addr_t *addr); +extern void _httpAddrSetPort(http_addr_t *addr, int port); +extern char *_httpAssembleUUID(const char *server, int port, + const char *name, int number, + char *buffer, size_t bufsize); +extern http_t *_httpCreate(const char *host, int port, + http_addrlist_t *addrlist, + http_encryption_t encryption, + int family); +extern http_tls_credentials_t + _httpCreateCredentials(cups_array_t *credentials); +extern char *_httpDecodeURI(char *dst, const char *src, + size_t dstsize); +extern void _httpDisconnect(http_t *http); +extern char *_httpEncodeURI(char *dst, const char *src, + size_t dstsize); +extern void _httpFreeCredentials(http_tls_credentials_t credentials); +extern ssize_t _httpPeek(http_t *http, char *buffer, size_t length); +extern const char *_httpResolveURI(const char *uri, char *resolved_uri, + size_t resolved_size, int options, + int (*cb)(void *context), + void *context); +extern int _httpUpdate(http_t *http, http_status_t *status); +extern int _httpWait(http_t *http, int msec, int usessl); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_HTTP_PRIVATE_H_ */ + +/* + * End of "$Id: http-private.h 9960 2011-09-02 22:37:14Z mike $". + */ diff --git a/cups/http-support.c b/cups/http-support.c new file mode 100644 index 0000000..f2d9175 --- /dev/null +++ b/cups/http-support.c @@ -0,0 +1,2111 @@ +/* + * "$Id: http-support.c 10284 2012-02-15 01:06:12Z mike $" + * + * HTTP support routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * httpAssembleURI() - Assemble a uniform resource identifier from its + * components. + * httpAssembleURIf() - Assemble a uniform resource identifier from its + * components with a formatted resource. + * _httpAssembleUUID() - Make a UUID URI conforming to RFC 4122. + * httpDecode64() - Base64-decode a string. + * httpDecode64_2() - Base64-decode a string. + * httpEncode64() - Base64-encode a string. + * httpEncode64_2() - Base64-encode a string. + * httpGetDateString() - Get a formatted date/time string from a time value. + * httpGetDateString2() - Get a formatted date/time string from a time value. + * httpGetDateTime() - Get a time value from a formatted date/time string. + * httpSeparate() - Separate a Universal Resource Identifier into its + * components. + * httpSeparate2() - Separate a Universal Resource Identifier into its + * components. + * httpSeparateURI() - Separate a Universal Resource Identifier into its + * components. + * httpStatus() - Return a short string describing a HTTP status code. + * _cups_hstrerror() - hstrerror() emulation function for Solaris and + * others. + * _httpDecodeURI() - Percent-decode a HTTP request URI. + * _httpEncodeURI() - Percent-encode a HTTP request URI. + * _httpResolveURI() - Resolve a DNS-SD URI. + * http_copy_decode() - Copy and decode a URI. + * http_copy_encode() - Copy and encode a URI. + * http_resolve_cb() - Build a device URI for the given service name. + * avahi_resolve_uri_client_cb() + * - Avahi client callback for resolving URI. + * avahi_resolve_uri_resolver_cb() + * - Avahi resolver callback for resolving URI. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#ifdef HAVE_DNSSD +# include +# ifdef WIN32 +# include +# elif defined(HAVE_POLL) +# include +# else +# include +# endif /* WIN32 */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +# include +# include +# include +#endif /* HAVE_AVAHI */ + + +/* + * Local types... + */ + +typedef struct _http_uribuf_s /* URI buffer */ +{ + char *buffer; /* Pointer to buffer */ + size_t bufsize; /* Size of buffer */ + int options; /* Options passed to _httpResolveURI */ +} _http_uribuf_t; + + +/* + * Local globals... + */ + +static const char * const http_days[7] = + { + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + }; +static const char * const http_months[12] = + { + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + }; + + +/* + * Local functions... + */ + +static const char *http_copy_decode(char *dst, const char *src, + int dstsize, const char *term, + int decode); +static char *http_copy_encode(char *dst, const char *src, + char *dstend, const char *reserved, + const char *term, int encode); +#ifdef HAVE_DNSSD +static void DNSSD_API http_resolve_cb(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, + DNSServiceErrorType errorCode, + const char *fullName, + const char *hostTarget, + uint16_t port, uint16_t txtLen, + const unsigned char *txtRecord, + void *context); +#endif /* HAVE_DNSSD */ + +#ifdef HAVE_AVAHI +static void avahi_resolve_uri_client_cb(AvahiClient *client, + AvahiClientState state, + void *simple_poll); +static void avahi_resolve_uri_resolver_cb(AvahiServiceResolver *resolver, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + const char *name, + const char *type, + const char *domain, + const char *host_name, + const AvahiAddress *address, + uint16_t port, + AvahiStringList *txt, + AvahiLookupResultFlags flags, + void *context); +#endif /* HAVE_AVAHI */ + +/* + * 'httpAssembleURI()' - Assemble a uniform resource identifier from its + * components. + * + * This function escapes reserved characters in the URI depending on the + * value of the "encoding" argument. You should use this function in + * place of traditional string functions whenever you need to create a + * URI string. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_uri_status_t /* O - URI status */ +httpAssembleURI( + http_uri_coding_t encoding, /* I - Encoding flags */ + char *uri, /* I - URI buffer */ + int urilen, /* I - Size of URI buffer */ + const char *scheme, /* I - Scheme name */ + const char *username, /* I - Username */ + const char *host, /* I - Hostname or address */ + int port, /* I - Port number */ + const char *resource) /* I - Resource */ +{ + char *ptr, /* Pointer into URI buffer */ + *end; /* End of URI buffer */ + + + /* + * Range check input... + */ + + if (!uri || urilen < 1 || !scheme || port < 0) + { + if (uri) + *uri = '\0'; + + return (HTTP_URI_BAD_ARGUMENTS); + } + + /* + * Assemble the URI starting with the scheme... + */ + + end = uri + urilen - 1; + ptr = http_copy_encode(uri, scheme, end, NULL, NULL, 0); + + if (!ptr) + goto assemble_overflow; + + if (!strcmp(scheme, "mailto")) + { + /* + * mailto: only has :, no //... + */ + + if (ptr < end) + *ptr++ = ':'; + else + goto assemble_overflow; + } + else + { + /* + * Schemes other than mailto: all have //... + */ + + if ((ptr + 2) < end) + { + *ptr++ = ':'; + *ptr++ = '/'; + *ptr++ = '/'; + } + else + goto assemble_overflow; + } + + /* + * Next the username and hostname, if any... + */ + + if (host) + { + if (username && *username) + { + /* + * Add username@ first... + */ + + ptr = http_copy_encode(ptr, username, end, "/?#[]@", NULL, + encoding & HTTP_URI_CODING_USERNAME); + + if (!ptr) + goto assemble_overflow; + + if (ptr < end) + *ptr++ = '@'; + else + goto assemble_overflow; + } + + /* + * Then add the hostname. Since IPv6 is a particular pain to deal + * with, we have several special cases to deal with. If we get + * an IPv6 address with brackets around it, assume it is already in + * URI format. Since DNS-SD service names can sometimes look like + * raw IPv6 addresses, we specifically look for "._tcp" in the name, + * too... + */ + + if (host[0] != '[' && strchr(host, ':') && !strstr(host, "._tcp")) + { + /* + * We have a raw IPv6 address... + */ + + if (strchr(host, '%')) + { + /* + * We have a link-local address, add "[v1." prefix... + */ + + if ((ptr + 4) < end) + { + *ptr++ = '['; + *ptr++ = 'v'; + *ptr++ = '1'; + *ptr++ = '.'; + } + else + goto assemble_overflow; + } + else + { + /* + * We have a normal address, add "[" prefix... + */ + + if (ptr < end) + *ptr++ = '['; + else + goto assemble_overflow; + } + + /* + * Copy the rest of the IPv6 address, and terminate with "]". + */ + + while (ptr < end && *host) + { + if (*host == '%') + { + *ptr++ = '+'; /* Convert zone separator */ + host ++; + } + else + *ptr++ = *host++; + } + + if (*host) + goto assemble_overflow; + + if (ptr < end) + *ptr++ = ']'; + else + goto assemble_overflow; + } + else + { + /* + * Otherwise, just copy the host string... + */ + + ptr = http_copy_encode(ptr, host, end, ":/?#[]@\\\"", NULL, + encoding & HTTP_URI_CODING_HOSTNAME); + + if (!ptr) + goto assemble_overflow; + } + + /* + * Finish things off with the port number... + */ + + if (port > 0) + { + snprintf(ptr, end - ptr + 1, ":%d", port); + ptr += strlen(ptr); + + if (ptr >= end) + goto assemble_overflow; + } + } + + /* + * Last but not least, add the resource string... + */ + + if (resource) + { + char *query; /* Pointer to query string */ + + + /* + * Copy the resource string up to the query string if present... + */ + + query = strchr(resource, '?'); + ptr = http_copy_encode(ptr, resource, end, NULL, "?", + encoding & HTTP_URI_CODING_RESOURCE); + if (!ptr) + goto assemble_overflow; + + if (query) + { + /* + * Copy query string without encoding... + */ + + ptr = http_copy_encode(ptr, query, end, NULL, NULL, + encoding & HTTP_URI_CODING_QUERY); + if (!ptr) + goto assemble_overflow; + } + } + else if (ptr < end) + *ptr++ = '/'; + else + goto assemble_overflow; + + /* + * Nul-terminate the URI buffer and return with no errors... + */ + + *ptr = '\0'; + + return (HTTP_URI_OK); + + /* + * Clear the URI string and return an overflow error; I don't usually + * like goto's, but in this case it makes sense... + */ + + assemble_overflow: + + *uri = '\0'; + return (HTTP_URI_OVERFLOW); +} + + +/* + * 'httpAssembleURIf()' - Assemble a uniform resource identifier from its + * components with a formatted resource. + * + * This function creates a formatted version of the resource string + * argument "resourcef" and escapes reserved characters in the URI + * depending on the value of the "encoding" argument. You should use + * this function in place of traditional string functions whenever + * you need to create a URI string. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_uri_status_t /* O - URI status */ +httpAssembleURIf( + http_uri_coding_t encoding, /* I - Encoding flags */ + char *uri, /* I - URI buffer */ + int urilen, /* I - Size of URI buffer */ + const char *scheme, /* I - Scheme name */ + const char *username, /* I - Username */ + const char *host, /* I - Hostname or address */ + int port, /* I - Port number */ + const char *resourcef, /* I - Printf-style resource */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to additional arguments */ + char resource[1024]; /* Formatted resource string */ + int bytes; /* Bytes in formatted string */ + + + /* + * Range check input... + */ + + if (!uri || urilen < 1 || !scheme || port < 0 || !resourcef) + { + if (uri) + *uri = '\0'; + + return (HTTP_URI_BAD_ARGUMENTS); + } + + /* + * Format the resource string and assemble the URI... + */ + + va_start(ap, resourcef); + bytes = vsnprintf(resource, sizeof(resource), resourcef, ap); + va_end(ap); + + if (bytes >= sizeof(resource)) + { + *uri = '\0'; + return (HTTP_URI_OVERFLOW); + } + else + return (httpAssembleURI(encoding, uri, urilen, scheme, username, host, + port, resource)); +} + + +/* + * '_httpAssembleUUID()' - Make a UUID URI conforming to RFC 4122. + * + * The buffer needs to be at least 46 bytes in size. + */ + +char * /* I - UUID string */ +_httpAssembleUUID(const char *server, /* I - Server name */ + int port, /* I - Port number */ + const char *name, /* I - Object name or NULL */ + int number, /* I - Object number or 0 */ + char *buffer, /* I - String buffer */ + size_t bufsize) /* I - Size of buffer */ +{ + char data[1024]; /* Source string for MD5 */ + _cups_md5_state_t md5state; /* MD5 state */ + unsigned char md5sum[16]; /* MD5 digest/sum */ + + + /* + * Build a version 3 UUID conforming to RFC 4122. + * + * Start with the MD5 sum of the server, port, object name and + * number, and some random data on the end. + */ + + snprintf(data, sizeof(data), "%s:%d:%s:%d:%04x:%04x", server, + port, name ? name : server, number, + (unsigned)CUPS_RAND() & 0xffff, (unsigned)CUPS_RAND() & 0xffff); + + _cupsMD5Init(&md5state); + _cupsMD5Append(&md5state, (unsigned char *)data, strlen(data)); + _cupsMD5Finish(&md5state, md5sum); + + /* + * Generate the UUID from the MD5... + */ + + snprintf(buffer, bufsize, + "urn:uuid:%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-" + "%02x%02x%02x%02x%02x%02x", + md5sum[0], md5sum[1], md5sum[2], md5sum[3], md5sum[4], md5sum[5], + (md5sum[6] & 15) | 0x30, md5sum[7], (md5sum[8] & 0x3f) | 0x40, + md5sum[9], md5sum[10], md5sum[11], md5sum[12], md5sum[13], + md5sum[14], md5sum[15]); + + return (buffer); +} + + +/* + * 'httpDecode64()' - Base64-decode a string. + * + * This function is deprecated. Use the httpDecode64_2() function instead + * which provides buffer length arguments. + * + * @deprecated@ + */ + +char * /* O - Decoded string */ +httpDecode64(char *out, /* I - String to write to */ + const char *in) /* I - String to read from */ +{ + int outlen; /* Output buffer length */ + + + /* + * Use the old maximum buffer size for binary compatibility... + */ + + outlen = 512; + + return (httpDecode64_2(out, &outlen, in)); +} + + +/* + * 'httpDecode64_2()' - Base64-decode a string. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +char * /* O - Decoded string */ +httpDecode64_2(char *out, /* I - String to write to */ + int *outlen, /* IO - Size of output string */ + const char *in) /* I - String to read from */ +{ + int pos, /* Bit position */ + base64; /* Value of this character */ + char *outptr, /* Output pointer */ + *outend; /* End of output buffer */ + + + /* + * Range check input... + */ + + if (!out || !outlen || *outlen < 1 || !in) + return (NULL); + + if (!*in) + { + *out = '\0'; + *outlen = 0; + + return (out); + } + + /* + * Convert from base-64 to bytes... + */ + + for (outptr = out, outend = out + *outlen - 1, pos = 0; *in != '\0'; in ++) + { + /* + * Decode this character into a number from 0 to 63... + */ + + if (*in >= 'A' && *in <= 'Z') + base64 = *in - 'A'; + else if (*in >= 'a' && *in <= 'z') + base64 = *in - 'a' + 26; + else if (*in >= '0' && *in <= '9') + base64 = *in - '0' + 52; + else if (*in == '+') + base64 = 62; + else if (*in == '/') + base64 = 63; + else if (*in == '=') + break; + else + continue; + + /* + * Store the result in the appropriate chars... + */ + + switch (pos) + { + case 0 : + if (outptr < outend) + *outptr = base64 << 2; + pos ++; + break; + case 1 : + if (outptr < outend) + *outptr++ |= (base64 >> 4) & 3; + if (outptr < outend) + *outptr = (base64 << 4) & 255; + pos ++; + break; + case 2 : + if (outptr < outend) + *outptr++ |= (base64 >> 2) & 15; + if (outptr < outend) + *outptr = (base64 << 6) & 255; + pos ++; + break; + case 3 : + if (outptr < outend) + *outptr++ |= base64; + pos = 0; + break; + } + } + + *outptr = '\0'; + + /* + * Return the decoded string and size... + */ + + *outlen = (int)(outptr - out); + + return (out); +} + + +/* + * 'httpEncode64()' - Base64-encode a string. + * + * This function is deprecated. Use the httpEncode64_2() function instead + * which provides buffer length arguments. + * + * @deprecated@ + */ + +char * /* O - Encoded string */ +httpEncode64(char *out, /* I - String to write to */ + const char *in) /* I - String to read from */ +{ + return (httpEncode64_2(out, 512, in, (int)strlen(in))); +} + + +/* + * 'httpEncode64_2()' - Base64-encode a string. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +char * /* O - Encoded string */ +httpEncode64_2(char *out, /* I - String to write to */ + int outlen, /* I - Size of output string */ + const char *in, /* I - String to read from */ + int inlen) /* I - Size of input string */ +{ + char *outptr, /* Output pointer */ + *outend; /* End of output buffer */ + static const char base64[] = /* Base64 characters... */ + { + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789" + "+/" + }; + + + /* + * Range check input... + */ + + if (!out || outlen < 1 || !in) + return (NULL); + + /* + * Convert bytes to base-64... + */ + + for (outptr = out, outend = out + outlen - 1; inlen > 0; in ++, inlen --) + { + /* + * Encode the up to 3 characters as 4 Base64 numbers... + */ + + if (outptr < outend) + *outptr ++ = base64[(in[0] & 255) >> 2]; + + if (outptr < outend) + { + if (inlen > 1) + *outptr ++ = base64[(((in[0] & 255) << 4) | ((in[1] & 255) >> 4)) & 63]; + else + *outptr ++ = base64[((in[0] & 255) << 4) & 63]; + } + + in ++; + inlen --; + if (inlen <= 0) + { + if (outptr < outend) + *outptr ++ = '='; + if (outptr < outend) + *outptr ++ = '='; + break; + } + + if (outptr < outend) + { + if (inlen > 1) + *outptr ++ = base64[(((in[0] & 255) << 2) | ((in[1] & 255) >> 6)) & 63]; + else + *outptr ++ = base64[((in[0] & 255) << 2) & 63]; + } + + in ++; + inlen --; + if (inlen <= 0) + { + if (outptr < outend) + *outptr ++ = '='; + break; + } + + if (outptr < outend) + *outptr ++ = base64[in[0] & 63]; + } + + *outptr = '\0'; + + /* + * Return the encoded string... + */ + + return (out); +} + + +/* + * 'httpGetDateString()' - Get a formatted date/time string from a time value. + * + * @deprecated@ + */ + +const char * /* O - Date/time string */ +httpGetDateString(time_t t) /* I - UNIX time */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + return (httpGetDateString2(t, cg->http_date, sizeof(cg->http_date))); +} + + +/* + * 'httpGetDateString2()' - Get a formatted date/time string from a time value. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - Date/time string */ +httpGetDateString2(time_t t, /* I - UNIX time */ + char *s, /* I - String buffer */ + int slen) /* I - Size of string buffer */ +{ + struct tm *tdate; /* UNIX date/time data */ + + + tdate = gmtime(&t); + if (tdate) + snprintf(s, slen, "%s, %02d %s %d %02d:%02d:%02d GMT", + http_days[tdate->tm_wday], tdate->tm_mday, + http_months[tdate->tm_mon], tdate->tm_year + 1900, + tdate->tm_hour, tdate->tm_min, tdate->tm_sec); + else + s[0] = '\0'; + + return (s); +} + + +/* + * 'httpGetDateTime()' - Get a time value from a formatted date/time string. + */ + +time_t /* O - UNIX time */ +httpGetDateTime(const char *s) /* I - Date/time string */ +{ + int i; /* Looping var */ + char mon[16]; /* Abbreviated month name */ + int day, year; /* Day of month and year */ + int hour, min, sec; /* Time */ + int days; /* Number of days since 1970 */ + static const int normal_days[] = /* Days to a month, normal years */ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + static const int leap_days[] = /* Days to a month, leap years */ + { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }; + + + DEBUG_printf(("2httpGetDateTime(s=\"%s\")", s)); + + /* + * Extract the date and time from the formatted string... + */ + + if (sscanf(s, "%*s%d%15s%d%d:%d:%d", &day, mon, &year, &hour, &min, &sec) < 6) + return (0); + + DEBUG_printf(("4httpGetDateTime: day=%d, mon=\"%s\", year=%d, hour=%d, " + "min=%d, sec=%d", day, mon, year, hour, min, sec)); + + /* + * Convert the month name to a number from 0 to 11. + */ + + for (i = 0; i < 12; i ++) + if (!_cups_strcasecmp(mon, http_months[i])) + break; + + if (i >= 12) + return (0); + + DEBUG_printf(("4httpGetDateTime: i=%d", i)); + + /* + * Now convert the date and time to a UNIX time value in seconds since + * 1970. We can't use mktime() since the timezone may not be UTC but + * the date/time string *is* UTC. + */ + + if ((year & 3) == 0 && ((year % 100) != 0 || (year % 400) == 0)) + days = leap_days[i] + day - 1; + else + days = normal_days[i] + day - 1; + + DEBUG_printf(("4httpGetDateTime: days=%d", days)); + + days += (year - 1970) * 365 + /* 365 days per year (normally) */ + ((year - 1) / 4 - 492) - /* + leap days */ + ((year - 1) / 100 - 19) + /* - 100 year days */ + ((year - 1) / 400 - 4); /* + 400 year days */ + + DEBUG_printf(("4httpGetDateTime: days=%d\n", days)); + + return (days * 86400 + hour * 3600 + min * 60 + sec); +} + + +/* + * 'httpSeparate()' - Separate a Universal Resource Identifier into its + * components. + * + * This function is deprecated; use the httpSeparateURI() function instead. + * + * @deprecated@ + */ + +void +httpSeparate(const char *uri, /* I - Universal Resource Identifier */ + char *scheme, /* O - Scheme [32] (http, https, etc.) */ + char *username, /* O - Username [1024] */ + char *host, /* O - Hostname [1024] */ + int *port, /* O - Port number to use */ + char *resource) /* O - Resource/filename [1024] */ +{ + httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, 32, username, + HTTP_MAX_URI, host, HTTP_MAX_URI, port, resource, + HTTP_MAX_URI); +} + + +/* + * 'httpSeparate2()' - Separate a Universal Resource Identifier into its + * components. + * + * This function is deprecated; use the httpSeparateURI() function instead. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + * @deprecated@ + */ + +void +httpSeparate2(const char *uri, /* I - Universal Resource Identifier */ + char *scheme, /* O - Scheme (http, https, etc.) */ + int schemelen, /* I - Size of scheme buffer */ + char *username, /* O - Username */ + int usernamelen, /* I - Size of username buffer */ + char *host, /* O - Hostname */ + int hostlen, /* I - Size of hostname buffer */ + int *port, /* O - Port number to use */ + char *resource, /* O - Resource/filename */ + int resourcelen) /* I - Size of resource buffer */ +{ + httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, schemelen, username, + usernamelen, host, hostlen, port, resource, resourcelen); +} + + +/* + * 'httpSeparateURI()' - Separate a Universal Resource Identifier into its + * components. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_uri_status_t /* O - Result of separation */ +httpSeparateURI( + http_uri_coding_t decoding, /* I - Decoding flags */ + const char *uri, /* I - Universal Resource Identifier */ + char *scheme, /* O - Scheme (http, https, etc.) */ + int schemelen, /* I - Size of scheme buffer */ + char *username, /* O - Username */ + int usernamelen, /* I - Size of username buffer */ + char *host, /* O - Hostname */ + int hostlen, /* I - Size of hostname buffer */ + int *port, /* O - Port number to use */ + char *resource, /* O - Resource/filename */ + int resourcelen) /* I - Size of resource buffer */ +{ + char *ptr, /* Pointer into string... */ + *end; /* End of string */ + const char *sep; /* Separator character */ + http_uri_status_t status; /* Result of separation */ + + + /* + * Initialize everything to blank... + */ + + if (scheme && schemelen > 0) + *scheme = '\0'; + + if (username && usernamelen > 0) + *username = '\0'; + + if (host && hostlen > 0) + *host = '\0'; + + if (port) + *port = 0; + + if (resource && resourcelen > 0) + *resource = '\0'; + + /* + * Range check input... + */ + + if (!uri || !port || !scheme || schemelen <= 0 || !username || + usernamelen <= 0 || !host || hostlen <= 0 || !resource || + resourcelen <= 0) + return (HTTP_URI_BAD_ARGUMENTS); + + if (!*uri) + return (HTTP_URI_BAD_URI); + + /* + * Grab the scheme portion of the URI... + */ + + status = HTTP_URI_OK; + + if (!strncmp(uri, "//", 2)) + { + /* + * Workaround for HP IPP client bug... + */ + + strlcpy(scheme, "ipp", schemelen); + status = HTTP_URI_MISSING_SCHEME; + } + else if (*uri == '/') + { + /* + * Filename... + */ + + strlcpy(scheme, "file", schemelen); + status = HTTP_URI_MISSING_SCHEME; + } + else + { + /* + * Standard URI with scheme... + */ + + for (ptr = scheme, end = scheme + schemelen - 1; + *uri && *uri != ':' && ptr < end;) + if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "0123456789-+.", *uri) != NULL) + *ptr++ = *uri++; + else + break; + + *ptr = '\0'; + + if (*uri != ':') + { + *scheme = '\0'; + return (HTTP_URI_BAD_SCHEME); + } + + uri ++; + } + + /* + * Set the default port number... + */ + + if (!strcmp(scheme, "http")) + *port = 80; + else if (!strcmp(scheme, "https")) + *port = 443; + else if (!strcmp(scheme, "ipp") || !strcmp(scheme, "ipps")) + *port = 631; + else if (!_cups_strcasecmp(scheme, "lpd")) + *port = 515; + else if (!strcmp(scheme, "socket")) /* Not yet registered with IANA... */ + *port = 9100; + else if (strcmp(scheme, "file") && strcmp(scheme, "mailto")) + status = HTTP_URI_UNKNOWN_SCHEME; + + /* + * Now see if we have a hostname... + */ + + if (!strncmp(uri, "//", 2)) + { + /* + * Yes, extract it... + */ + + uri += 2; + + /* + * Grab the username, if any... + */ + + if ((sep = strpbrk(uri, "@/")) != NULL && *sep == '@') + { + /* + * Get a username:password combo... + */ + + uri = http_copy_decode(username, uri, usernamelen, "@", + decoding & HTTP_URI_CODING_USERNAME); + + if (!uri) + { + *username = '\0'; + return (HTTP_URI_BAD_USERNAME); + } + + uri ++; + } + + /* + * Then the hostname/IP address... + */ + + if (*uri == '[') + { + /* + * Grab IPv6 address... + */ + + uri ++; + if (!strncmp(uri, "v1.", 3)) + uri += 3; /* Skip IPvN leader... */ + + uri = http_copy_decode(host, uri, hostlen, "]", + decoding & HTTP_URI_CODING_HOSTNAME); + + if (!uri) + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + + /* + * Validate value... + */ + + if (*uri != ']') + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + + uri ++; + + for (ptr = host; *ptr; ptr ++) + if (*ptr == '+') + { + /* + * Convert zone separator to % and stop here... + */ + + *ptr = '%'; + break; + } + else if (*ptr != ':' && *ptr != '.' && !isxdigit(*ptr & 255)) + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + } + else + { + /* + * Validate the hostname or IPv4 address first... + */ + + for (ptr = (char *)uri; *ptr; ptr ++) + if (strchr(":?/", *ptr)) + break; + else if (!strchr("abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "-._~" + "%" + "!$&'()*+,;=\\", *ptr)) + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + + /* + * Then copy the hostname or IPv4 address to the buffer... + */ + + uri = http_copy_decode(host, uri, hostlen, ":?/", + decoding & HTTP_URI_CODING_HOSTNAME); + + if (!uri) + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + } + + /* + * Validate hostname for file scheme - only empty and localhost are + * acceptable. + */ + + if (!strcmp(scheme, "file") && strcmp(host, "localhost") && host[0]) + { + *host = '\0'; + return (HTTP_URI_BAD_HOSTNAME); + } + + /* + * See if we have a port number... + */ + + if (*uri == ':') + { + /* + * Yes, collect the port number... + */ + + if (!isdigit(uri[1] & 255)) + { + *port = 0; + return (HTTP_URI_BAD_PORT); + } + + *port = strtol(uri + 1, (char **)&uri, 10); + + if (*uri != '/' && *uri) + { + *port = 0; + return (HTTP_URI_BAD_PORT); + } + } + } + + /* + * The remaining portion is the resource string... + */ + + if (*uri == '?' || !*uri) + { + /* + * Hostname but no path... + */ + + status = HTTP_URI_MISSING_RESOURCE; + *resource = '/'; + + /* + * Copy any query string... + */ + + if (*uri == '?') + uri = http_copy_decode(resource + 1, uri, resourcelen - 1, NULL, + decoding & HTTP_URI_CODING_QUERY); + else + resource[1] = '\0'; + } + else + { + uri = http_copy_decode(resource, uri, resourcelen, "?", + decoding & HTTP_URI_CODING_RESOURCE); + + if (uri && *uri == '?') + { + /* + * Concatenate any query string... + */ + + char *resptr = resource + strlen(resource); + + uri = http_copy_decode(resptr, uri, resourcelen - (int)(resptr - resource), + NULL, decoding & HTTP_URI_CODING_QUERY); + } + } + + if (!uri) + { + *resource = '\0'; + return (HTTP_URI_BAD_RESOURCE); + } + + /* + * Return the URI separation status... + */ + + return (status); +} + + +/* + * 'httpStatus()' - Return a short string describing a HTTP status code. + * + * The returned string is localized to the current POSIX locale and is based + * on the status strings defined in RFC 2616. + */ + +const char * /* O - Localized status string */ +httpStatus(http_status_t status) /* I - HTTP status code */ +{ + const char *s; /* Status string */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + switch (status) + { + case HTTP_CONTINUE : + s = _("Continue"); + break; + case HTTP_SWITCHING_PROTOCOLS : + s = _("Switching Protocols"); + break; + case HTTP_OK : + s = _("OK"); + break; + case HTTP_CREATED : + s = _("Created"); + break; + case HTTP_ACCEPTED : + s = _("Accepted"); + break; + case HTTP_NO_CONTENT : + s = _("No Content"); + break; + case HTTP_MOVED_PERMANENTLY : + s = _("Moved Permanently"); + break; + case HTTP_SEE_OTHER : + s = _("See Other"); + break; + case HTTP_NOT_MODIFIED : + s = _("Not Modified"); + break; + case HTTP_BAD_REQUEST : + s = _("Bad Request"); + break; + case HTTP_UNAUTHORIZED : + case HTTP_AUTHORIZATION_CANCELED : + s = _("Unauthorized"); + break; + case HTTP_FORBIDDEN : + s = _("Forbidden"); + break; + case HTTP_NOT_FOUND : + s = _("Not Found"); + break; + case HTTP_REQUEST_TOO_LARGE : + s = _("Request Entity Too Large"); + break; + case HTTP_URI_TOO_LONG : + s = _("URI Too Long"); + break; + case HTTP_UPGRADE_REQUIRED : + s = _("Upgrade Required"); + break; + case HTTP_NOT_IMPLEMENTED : + s = _("Not Implemented"); + break; + case HTTP_NOT_SUPPORTED : + s = _("Not Supported"); + break; + case HTTP_EXPECTATION_FAILED : + s = _("Expectation Failed"); + break; + case HTTP_SERVICE_UNAVAILABLE : + s = _("Service Unavailable"); + break; + case HTTP_SERVER_ERROR : + s = _("Internal Server Error"); + break; + case HTTP_PKI_ERROR : + s = _("SSL/TLS Negotiation Error"); + break; + case HTTP_WEBIF_DISABLED : + s = _("Web Interface is Disabled"); + break; + + default : + s = _("Unknown"); + break; + } + + return (_cupsLangString(cg->lang_default, s)); +} + + +#ifndef HAVE_HSTRERROR +/* + * '_cups_hstrerror()' - hstrerror() emulation function for Solaris and others. + */ + +const char * /* O - Error string */ +_cups_hstrerror(int error) /* I - Error number */ +{ + static const char * const errors[] = /* Error strings */ + { + "OK", + "Host not found.", + "Try again.", + "Unrecoverable lookup error.", + "No data associated with name." + }; + + + if (error < 0 || error > 4) + return ("Unknown hostname lookup error."); + else + return (errors[error]); +} +#endif /* !HAVE_HSTRERROR */ + + +/* + * '_httpDecodeURI()' - Percent-decode a HTTP request URI. + */ + +char * /* O - Decoded URI or NULL on error */ +_httpDecodeURI(char *dst, /* I - Destination buffer */ + const char *src, /* I - Source URI */ + size_t dstsize) /* I - Size of destination buffer */ +{ + if (http_copy_decode(dst, src, (int)dstsize, NULL, 1)) + return (dst); + else + return (NULL); +} + + +/* + * '_httpEncodeURI()' - Percent-encode a HTTP request URI. + */ + +char * /* O - Encoded URI */ +_httpEncodeURI(char *dst, /* I - Destination buffer */ + const char *src, /* I - Source URI */ + size_t dstsize) /* I - Size of destination buffer */ +{ + http_copy_encode(dst, src, dst + dstsize - 1, NULL, NULL, 1); + return (dst); +} + + +/* + * '_httpResolveURI()' - Resolve a DNS-SD URI. + */ + +const char * /* O - Resolved URI */ +_httpResolveURI( + const char *uri, /* I - DNS-SD URI */ + char *resolved_uri, /* I - Buffer for resolved URI */ + size_t resolved_size, /* I - Size of URI buffer */ + int options, /* I - Resolve options */ + int (*cb)(void *context), /* I - Continue callback function */ + void *context) /* I - Context pointer for callback */ +{ + char scheme[32], /* URI components... */ + userpass[256], + hostname[1024], + resource[1024]; + int port; +#ifdef DEBUG + http_uri_status_t status; /* URI decode status */ +#endif /* DEBUG */ + + + DEBUG_printf(("4_httpResolveURI(uri=\"%s\", resolved_uri=%p, " + "resolved_size=" CUPS_LLFMT ")", uri, resolved_uri, + CUPS_LLCAST resolved_size)); + + /* + * Get the device URI... + */ + +#ifdef DEBUG + if ((status = httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, + sizeof(scheme), userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, resource, + sizeof(resource))) < HTTP_URI_OK) +#else + if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, + sizeof(scheme), userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, resource, + sizeof(resource)) < HTTP_URI_OK) +#endif /* DEBUG */ + { + if (options & _HTTP_RESOLVE_STDERR) + _cupsLangPrintFilter(stderr, "ERROR", _("Bad device-uri \"%s\"."), uri); + + DEBUG_printf(("6_httpResolveURI: httpSeparateURI returned %d!", status)); + DEBUG_puts("5_httpResolveURI: Returning NULL"); + return (NULL); + } + + /* + * Resolve it as needed... + */ + + if (strstr(hostname, "._tcp")) + { +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + char *regtype, /* Pointer to type in hostname */ + *domain; /* Pointer to domain in hostname */ +#ifdef HAVE_DNSSD +# ifdef WIN32 +# pragma comment(lib, "dnssd.lib") +# endif /* WIN32 */ + DNSServiceRef ref, /* DNS-SD master service reference */ + domainref, /* DNS-SD service reference for domain */ + localref; /* DNS-SD service reference for .local */ + int domainsent = 0, /* Send the domain resolve? */ + offline = 0; /* offline-report state set? */ + char *regtype, /* Pointer to type in hostname */ + *domain; /* Pointer to domain in hostname */ + _http_uribuf_t uribuf; /* URI buffer */ +#ifdef HAVE_POLL + struct pollfd polldata; /* Polling data */ +#else /* select() */ + fd_set input_set; /* Input set for select() */ + struct timeval stimeout; /* Timeout value for select() */ +#endif /* HAVE_POLL */ +#else /* HAVE_AVAHI */ + AvahiSimplePoll *simple_poll; + AvahiClient *client; + int error; + struct + { + AvahiSimplePoll *poll; + _http_uribuf_t uribuf; + } user_data; +#endif /* HAVE_DNSSD */ + + + if (options & _HTTP_RESOLVE_STDERR) + fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname); + + /* + * Separate the hostname into service name, registration type, and domain... + */ + + for (regtype = strstr(hostname, "._tcp") - 2; + regtype > hostname; + regtype --) + if (regtype[0] == '.' && regtype[1] == '_') + { + /* + * Found ._servicetype in front of ._tcp... + */ + + *regtype++ = '\0'; + break; + } + + if (regtype <= hostname) + { + DEBUG_puts("5_httpResolveURI: Bad hostname, returning NULL"); + return (NULL); + } + + for (domain = strchr(regtype, '.'); + domain; + domain = strchr(domain + 1, '.')) + if (domain[1] != '_') + break; + + if (domain) + *domain++ = '\0'; + +#ifdef HAVE_DNSSD + uribuf.buffer = resolved_uri; + uribuf.bufsize = resolved_size; + uribuf.options = options; +#else + user_data.uribuf.buffer = resolved_uri; + user_data.uribuf.bufsize = resolved_size; + user_data.uribuf.options = options; +#endif + + resolved_uri[0] = '\0'; + + DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", " + "domain=\"%s\"\n", hostname, regtype, domain)); + if (options & _HTTP_RESOLVE_STDERR) + { + fputs("STATE: +connecting-to-device\n", stderr); + fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", " + "domain=\"local.\"...\n", hostname, regtype); + } + + uri = NULL; + +#ifdef HAVE_DNSSD + if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError) + { + localref = ref; + if (DNSServiceResolve(&localref, kDNSServiceFlagsShareConnection, 0, + hostname, regtype, "local.", http_resolve_cb, + &uribuf) == kDNSServiceErr_NoError) + { + int fds; /* Number of ready descriptors */ + time_t timeout, /* Poll timeout */ + start_time = time(NULL);/* Start time */ + + for (;;) + { + if (options & _HTTP_RESOLVE_STDERR) + _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer.")); + + if (cb && !(*cb)(context)) + { + DEBUG_puts("5_httpResolveURI: callback returned 0 (stop)"); + break; + } + + /* + * For the first minute (or forever if we have a callback), wakeup + * every 2 seconds to emit a "looking for printer" message... + */ + + timeout = (time(NULL) < (start_time + 60) || cb) ? 2000 : -1; + +#ifdef HAVE_POLL + polldata.fd = DNSServiceRefSockFD(ref); + polldata.events = POLLIN; + + fds = poll(&polldata, 1, timeout); + +#else /* select() */ + FD_ZERO(&input_set); + FD_SET(DNSServiceRefSockFD(ref), &input_set); + + stimeout.tv_sec = ((int)timeout) / 1000; + stimeout.tv_usec = ((int)(timeout) * 1000) % 1000000; + + fds = select(DNSServiceRefSockFD(ref)+1, &input_set, NULL, NULL, + timeout < 0.0 ? NULL : &stimeout); +#endif /* HAVE_POLL */ + + if (fds < 0) + { + if (errno != EINTR && errno != EAGAIN) + { + DEBUG_printf(("5_httpResolveURI: poll error: %s", strerror(errno))); + break; + } + } + else if (fds == 0) + { + /* + * Wait 2 seconds for a response to the local resolve; if nothing + * comes in, do an additional domain resolution... + */ + + if (domainsent == 0 && (domain && _cups_strcasecmp(domain, "local."))) + { + if (options & _HTTP_RESOLVE_STDERR) + fprintf(stderr, + "DEBUG: Resolving \"%s\", regtype=\"%s\", " + "domain=\"%s\"...\n", hostname, regtype, + domain ? domain : ""); + + domainref = ref; + if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, + 0, hostname, regtype, domain, + http_resolve_cb, &uribuf) + == kDNSServiceErr_NoError) + domainsent = 1; + } + + /* + * If it hasn't resolved within 5 seconds set the offline-report + * printer-state-reason... + */ + + if ((options & _HTTP_RESOLVE_STDERR) && offline == 0 && + time(NULL) > (start_time + 5)) + { + fputs("STATE: +offline-report\n", stderr); + offline = 1; + } + } + else + { + if (DNSServiceProcessResult(ref) == kDNSServiceErr_NoError) + { + uri = resolved_uri; + break; + } + } + } + + if (domainsent) + DNSServiceRefDeallocate(domainref); + + DNSServiceRefDeallocate(localref); + } + + DNSServiceRefDeallocate(ref); + } +#else /* HAVE_AVAHI */ + if ((simple_poll = avahi_simple_poll_new ()) != NULL) + { + if ((client = avahi_client_new (avahi_simple_poll_get (simple_poll), + 0, avahi_resolve_uri_client_cb, + &simple_poll, &error)) != NULL) + { + user_data.poll = simple_poll; + if (avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, hostname, + regtype, domain, AVAHI_PROTO_UNSPEC, 0, + avahi_resolve_uri_resolver_cb, + &user_data) != NULL) + { + avahi_simple_poll_loop (simple_poll); + + /* + * Collect the result. + */ + + if (resolved_uri[0]) + uri = resolved_uri; + } + + avahi_client_free (client); + } + + avahi_simple_poll_free (simple_poll); + } +#endif /* HAVE_DNSSD */ + + if (options & _HTTP_RESOLVE_STDERR) + { + if (uri) + fprintf(stderr, "DEBUG: Resolved as \"%s\"...\n", uri); + else + fputs("DEBUG: Unable to resolve URI\n", stderr); + + fputs("STATE: -connecting-to-device,offline-report\n", stderr); + } + +#else /* HAVE_DNSSD || HAVE_AVAHI */ + /* + * No DNS-SD support... + */ + + uri = NULL; +#endif /* HAVE_DNSSD || HAVE_AVAHI */ + + if ((options & _HTTP_RESOLVE_STDERR) && !uri) + _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer.")); + } + else + { + /* + * Nothing more to do... + */ + + strlcpy(resolved_uri, uri, resolved_size); + uri = resolved_uri; + } + + DEBUG_printf(("5_httpResolveURI: Returning \"%s\"", uri)); + + return (uri); +} + + +/* + * 'http_copy_decode()' - Copy and decode a URI. + */ + +static const char * /* O - New source pointer or NULL on error */ +http_copy_decode(char *dst, /* O - Destination buffer */ + const char *src, /* I - Source pointer */ + int dstsize, /* I - Destination size */ + const char *term, /* I - Terminating characters */ + int decode) /* I - Decode %-encoded values */ +{ + char *ptr, /* Pointer into buffer */ + *end; /* End of buffer */ + int quoted; /* Quoted character */ + + + /* + * Copy the src to the destination until we hit a terminating character + * or the end of the string. + */ + + for (ptr = dst, end = dst + dstsize - 1; + *src && (!term || !strchr(term, *src)); + src ++) + if (ptr < end) + { + if (*src == '%' && decode) + { + if (isxdigit(src[1] & 255) && isxdigit(src[2] & 255)) + { + /* + * Grab a hex-encoded character... + */ + + src ++; + if (isalpha(*src)) + quoted = (tolower(*src) - 'a' + 10) << 4; + else + quoted = (*src - '0') << 4; + + src ++; + if (isalpha(*src)) + quoted |= tolower(*src) - 'a' + 10; + else + quoted |= *src - '0'; + + *ptr++ = quoted; + } + else + { + /* + * Bad hex-encoded character... + */ + + *ptr = '\0'; + return (NULL); + } + } + else + *ptr++ = *src; + } + + *ptr = '\0'; + + return (src); +} + + +/* + * 'http_copy_encode()' - Copy and encode a URI. + */ + +static char * /* O - End of current URI */ +http_copy_encode(char *dst, /* O - Destination buffer */ + const char *src, /* I - Source pointer */ + char *dstend, /* I - End of destination buffer */ + const char *reserved, /* I - Extra reserved characters */ + const char *term, /* I - Terminating characters */ + int encode) /* I - %-encode reserved chars? */ +{ + static const char hex[] = "0123456789ABCDEF"; + + + while (*src && dst < dstend) + { + if (term && *src == *term) + return (dst); + + if (encode && (*src == '%' || *src <= ' ' || *src & 128 || + (reserved && strchr(reserved, *src)))) + { + /* + * Hex encode reserved characters... + */ + + if ((dst + 2) >= dstend) + break; + + *dst++ = '%'; + *dst++ = hex[(*src >> 4) & 15]; + *dst++ = hex[*src & 15]; + + src ++; + } + else + *dst++ = *src++; + } + + *dst = '\0'; + + if (*src) + return (NULL); + else + return (dst); +} + + +#ifdef HAVE_DNSSD +/* + * 'http_resolve_cb()' - Build a device URI for the given service name. + */ + +static void DNSSD_API +http_resolve_cb( + DNSServiceRef sdRef, /* I - Service reference */ + DNSServiceFlags flags, /* I - Results flags */ + uint32_t interfaceIndex, /* I - Interface number */ + DNSServiceErrorType errorCode, /* I - Error, if any */ + const char *fullName, /* I - Full service name */ + const char *hostTarget, /* I - Hostname */ + uint16_t port, /* I - Port number */ + uint16_t txtLen, /* I - Length of TXT record */ + const unsigned char *txtRecord, /* I - TXT record data */ + void *context) /* I - Pointer to URI buffer */ +{ + const char *scheme, /* URI scheme */ + *hostptr; /* Pointer into hostTarget */ + char rp[257], /* Remote printer */ + fqdn[256]; /* FQDN of the .local name */ + const void *value; /* Value from TXT record */ + uint8_t valueLen; /* Length of value */ + _http_uribuf_t *uribuf; /* URI buffer */ + + + DEBUG_printf(("7http_resolve_cb(sdRef=%p, flags=%x, interfaceIndex=%u, " + "errorCode=%d, fullName=\"%s\", hostTarget=\"%s\", port=%u, " + "txtLen=%u, txtRecord=%p, context=%p)", sdRef, flags, + interfaceIndex, errorCode, fullName, hostTarget, port, txtLen, + txtRecord, context)); + + uribuf = (_http_uribuf_t *)context; + + /* + * Figure out the scheme from the full name... + */ + + if (strstr(fullName, "._ipps") || strstr(fullName, "._ipp-tls")) + scheme = "ipps"; + else if (strstr(fullName, "._ipp") || strstr(fullName, "._fax-ipp")) + scheme = "ipp"; + else if (strstr(fullName, "._http.")) + scheme = "http"; + else if (strstr(fullName, "._https.")) + scheme = "https"; + else if (strstr(fullName, "._printer.")) + scheme = "lpd"; + else if (strstr(fullName, "._pdl-datastream.")) + scheme = "socket"; + else + scheme = "riousbprint"; + + /* + * Extract the "remote printer" key from the TXT record... + */ + + if ((value = TXTRecordGetValuePtr(txtLen, txtRecord, "rp", + &valueLen)) != NULL) + { + if (((char *)value)[0] == '/') + { + /* + * "rp" value (incorrectly) has a leading slash already... + */ + + memcpy(rp, value, valueLen); + rp[valueLen] = '\0'; + } + else + { + /* + * Convert to resource by concatenating with a leading "/"... + */ + + rp[0] = '/'; + memcpy(rp + 1, value, valueLen); + rp[valueLen + 1] = '\0'; + } + } + else + { + /* + * Default "rp" value is blank, mapping to a path of "/"... + */ + + rp[0] = '/'; + rp[1] = '\0'; + } + + /* + * Lookup the FQDN if needed... + */ + + if ((uribuf->options & _HTTP_RESOLVE_FQDN) && + (hostptr = hostTarget + strlen(hostTarget) - 7) > hostTarget && + !_cups_strcasecmp(hostptr, ".local.")) + { + /* + * OK, we got a .local name but the caller needs a real domain. Start by + * getting the IP address of the .local name and then do reverse-lookups... + */ + + http_addrlist_t *addrlist, /* List of addresses */ + *addr; /* Current address */ + + DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget)); + + snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port)); + if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL) + { + for (addr = addrlist; addr; addr = addr->next) + { + int error = getnameinfo(&(addr->addr.addr), + httpAddrLength(&(addr->addr)), + fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD); + + if (!error) + { + DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn)); + + if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn || + _cups_strcasecmp(hostptr, ".local")) + { + hostTarget = fqdn; + break; + } + } +#ifdef DEBUG + else + DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d", + httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)), + error)); +#endif /* DEBUG */ + } + } + } + + /* + * Assemble the final device URI... + */ + + httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, uribuf->bufsize, scheme, + NULL, hostTarget, ntohs(port), rp); + + DEBUG_printf(("8http_resolve_cb: Resolved URI is \"%s\"...", uribuf->buffer)); +} +#endif /* HAVE_DNSSD */ + + +#ifdef HAVE_AVAHI +/* + * 'avahi_resolve_uri_client_cb()' - Avahi client callback for resolving URI. + */ + +static void +avahi_resolve_uri_client_cb (AvahiClient *client, + AvahiClientState state, + void *simple_poll) +{ + DEBUG_printf(("avahi_resolve_uri_client_callback(client=%p, state=%d, " + "simple_poll=%p)\n", client, state, simple_poll)); + + /* + * If the connection drops, quit. + */ + + if (state == AVAHI_CLIENT_FAILURE) + avahi_simple_poll_quit (simple_poll); +} + + +/* + * 'avahi_resolve_uri_resolver_cb()' - Avahi resolver callback for resolving + * URI. + */ + +static void +avahi_resolve_uri_resolver_cb (AvahiServiceResolver *resolver, + AvahiIfIndex interface, + AvahiProtocol protocol, + AvahiResolverEvent event, + const char *name, + const char *type, + const char *domain, + const char *host_name, + const AvahiAddress *address, + uint16_t port, + AvahiStringList *txt, + AvahiLookupResultFlags flags, + void *context) +{ + const char *scheme; /* URI scheme */ + char rp[256]; /* Remote printer */ + AvahiStringList *pair; + char *value; + size_t valueLen = 0; + char addr[AVAHI_ADDRESS_STR_MAX]; + struct + { + AvahiSimplePoll *poll; + _http_uribuf_t uribuf; + } *poll_uribuf = context; + + DEBUG_printf(("avahi_resolve_uri_resolver_callback(resolver=%p, " + "interface=%d, protocol=%d, event=%d, name=\"%s\", " + "type=\"%s\", domain=\"%s\", host_name=\"%s\", address=%p, " + "port=%d, txt=%p, flags=%d, context=%p)\n", + resolver, interface, protocol, event, name, type, domain, + host_name, address, port, txt, flags, context)); + + if (event != AVAHI_RESOLVER_FOUND) + { + avahi_service_resolver_free (resolver); + avahi_simple_poll_quit (poll_uribuf->poll); + return; + } + + /* + * Figure out the scheme from the full name... + */ + + if (strstr(type, "_ipp.")) + scheme = "ipp"; + else if (strstr(type, "_printer.")) + scheme = "lpd"; + else if (strstr(type, "_pdl-datastream.")) + scheme = "socket"; + else + scheme = "riousbprint"; + + /* + * Extract the "remote printer key from the TXT record... + */ + + if ((pair = avahi_string_list_find (txt, "rp")) != NULL) + { + avahi_string_list_get_pair (pair, NULL, &value, &valueLen); + rp[0] = '/'; + memcpy (rp + 1, value, valueLen); + rp[valueLen + 1] = '\0'; + } + else + rp[0] = '\0'; + + /* + * Assemble the final device URI... + */ + + avahi_address_snprint (addr, AVAHI_ADDRESS_STR_MAX, address); + httpAssembleURI(HTTP_URI_CODING_ALL, poll_uribuf->uribuf.buffer, + poll_uribuf->uribuf.bufsize, scheme, NULL, + addr, port, rp); + DEBUG_printf(("avahi_resolve_uri_resolver_callback: Resolved URI is \"%s\"\n", + poll_uribuf->uribuf.buffer)); + avahi_simple_poll_quit (poll_uribuf->poll); +} +#endif /* HAVE_AVAHI */ + + +/* + * End of "$Id: http-support.c 10284 2012-02-15 01:06:12Z mike $". + */ diff --git a/cups/http.c b/cups/http.c new file mode 100644 index 0000000..18bad5b --- /dev/null +++ b/cups/http.c @@ -0,0 +1,4710 @@ +/* + * "$Id: http.c 10450 2012-05-04 22:52:56Z mike $" + * + * HTTP routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * This file contains Kerberos support code, copyright 2006 by + * Jelmer Vernooij. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * httpAddCredential() - Allocates and adds a single credential to an + * array. + * _httpBIOMethods() - Get the OpenSSL BIO methods for HTTP + * connections. + * httpBlocking() - Set blocking/non-blocking behavior on a + * connection. + * httpCheck() - Check to see if there is a pending response + * from the server. + * httpClearCookie() - Clear the cookie value(s). + * httpClearFields() - Clear HTTP request fields. + * httpClose() - Close an HTTP connection. + * httpConnect() - Connect to a HTTP server. + * httpConnectEncrypt() - Connect to a HTTP server using encryption. + * httpCopyCredentials() - Copy the credentials associated with an + * encrypted connection. + * _httpCreate() - Create an unconnected HTTP connection. + * _httpCreateCredentials() - Create credentials in the internal format. + * httpDelete() - Send a DELETE request to the server. + * _httpDisconnect() - Disconnect a HTTP connection. + * httpEncryption() - Set the required encryption on the link. + * httpError() - Get the last error on a connection. + * httpFlush() - Flush data from a HTTP connection. + * httpFlushWrite() - Flush data in write buffer. + * _httpFreeCredentials() - Free internal credentials. + * httpFreeCredentials() - Free an array of credentials. + * httpGet() - Send a GET request to the server. + * httpGetAuthString() - Get the current authorization string. + * httpGetBlocking() - Get the blocking/non-block state of a + * connection. + * httpGetCookie() - Get any cookie data from the response. + * httpGetFd() - Get the file descriptor associated with a + * connection. + * httpGetField() - Get a field value from a request/response. + * httpGetLength() - Get the amount of data remaining from the + * content-length or transfer-encoding fields. + * httpGetLength2() - Get the amount of data remaining from the + * content-length or transfer-encoding fields. + * httpGetStatus() - Get the status of the last HTTP request. + * httpGetSubField() - Get a sub-field value. + * httpGetSubField2() - Get a sub-field value. + * httpGets() - Get a line of text from a HTTP connection. + * httpHead() - Send a HEAD request to the server. + * httpInitialize() - Initialize the HTTP interface library and set + * the default HTTP proxy (if any). + * httpOptions() - Send an OPTIONS request to the server. + * _httpPeek() - Peek at data from a HTTP connection. + * httpPost() - Send a POST request to the server. + * httpPrintf() - Print a formatted string to a HTTP connection. + * httpPut() - Send a PUT request to the server. + * httpRead() - Read data from a HTTP connection. + * httpRead2() - Read data from a HTTP connection. + * _httpReadCDSA() - Read function for the CDSA library. + * _httpReadGNUTLS() - Read function for the GNU TLS library. + * httpReconnect() - Reconnect to a HTTP server. + * httpSetAuthString() - Set the current authorization string. + * httpSetCredentials() - Set the credentials associated with an + * encrypted connection. + * httpSetCookie() - Set the cookie value(s). + * httpSetExpect() - Set the Expect: header in a request. + * httpSetField() - Set the value of an HTTP header. + * httpSetLength() - Set the content-length and content-encoding. + * httpSetTimeout() - Set read/write timeouts and an optional + * callback. + * httpTrace() - Send an TRACE request to the server. + * _httpUpdate() - Update the current HTTP status for incoming + * data. + * httpUpdate() - Update the current HTTP state for incoming + * data. + * _httpWait() - Wait for data available on a connection (no + * flush). + * httpWait() - Wait for data available on a connection. + * httpWrite() - Write data to a HTTP connection. + * httpWrite2() - Write data to a HTTP connection. + * _httpWriteCDSA() - Write function for the CDSA library. + * _httpWriteGNUTLS() - Write function for the GNU TLS library. + * http_bio_ctrl() - Control the HTTP connection. + * http_bio_free() - Free OpenSSL data. + * http_bio_new() - Initialize an OpenSSL BIO structure. + * http_bio_puts() - Send a string for OpenSSL. + * http_bio_read() - Read data for OpenSSL. + * http_bio_write() - Write data for OpenSSL. + * http_debug_hex() - Do a hex dump of a buffer. + * http_field() - Return the field index for a field name. + * http_read_ssl() - Read from a SSL/TLS connection. + * http_locking_cb() - Lock/unlock a thread's mutex. + * http_send() - Send a request with all fields and the trailing + * blank line. + * http_set_credentials() - Set the SSL/TLS credentials. + * http_set_timeout() - Set the socket timeout values. + * http_set_wait() - Set the default wait value for reads. + * http_setup_ssl() - Set up SSL/TLS support on a connection. + * http_shutdown_ssl() - Shut down SSL/TLS on a connection. + * http_threadid_cb() - Return the current thread ID. + * http_upgrade() - Force upgrade to TLS encryption. + * http_write() - Write a buffer to a HTTP connection. + * http_write_chunk() - Write a chunked buffer. + * http_write_ssl() - Write to a SSL/TLS connection. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#ifdef WIN32 +# include +#else +# include +# include +# include +#endif /* WIN32 */ +#ifdef HAVE_POLL +# include +#endif /* HAVE_POLL */ + + +/* + * Some operating systems have done away with the Fxxxx constants for + * the fcntl() call; this works around that "feature"... + */ + +#ifndef FNONBLK +# define FNONBLK O_NONBLOCK +#endif /* !FNONBLK */ + + +/* + * Local functions... + */ + +#ifdef DEBUG +static void http_debug_hex(const char *prefix, const char *buffer, + int bytes); +#endif /* DEBUG */ +static http_field_t http_field(const char *name); +static int http_send(http_t *http, http_state_t request, + const char *uri); +static int http_write(http_t *http, const char *buffer, + int length); +static int http_write_chunk(http_t *http, const char *buffer, + int length); +#ifdef HAVE_SSL +static int http_read_ssl(http_t *http, char *buf, int len); +# if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA) +static int http_set_credentials(http_t *http); +# endif /* HAVE_CDSASSL ** HAVE_SECCERTIFICATECOPYDATA */ +#endif /* HAVE_SSL */ +static void http_set_timeout(int fd, double timeout); +static void http_set_wait(http_t *http); +#ifdef HAVE_SSL +static int http_setup_ssl(http_t *http); +static void http_shutdown_ssl(http_t *http); +static int http_upgrade(http_t *http); +static int http_write_ssl(http_t *http, const char *buf, int len); +#endif /* HAVE_SSL */ + + +/* + * Local globals... + */ + +static const char * const http_fields[] = + { + "Accept-Language", + "Accept-Ranges", + "Authorization", + "Connection", + "Content-Encoding", + "Content-Language", + "Content-Length", + "Content-Location", + "Content-MD5", + "Content-Range", + "Content-Type", + "Content-Version", + "Date", + "Host", + "If-Modified-Since", + "If-Unmodified-since", + "Keep-Alive", + "Last-Modified", + "Link", + "Location", + "Range", + "Referer", + "Retry-After", + "Transfer-Encoding", + "Upgrade", + "User-Agent", + "WWW-Authenticate" + }; +#ifdef DEBUG +static const char * const http_states[] = + { + "HTTP_WAITING", + "HTTP_OPTIONS", + "HTTP_GET", + "HTTP_GET_SEND", + "HTTP_HEAD", + "HTTP_POST", + "HTTP_POST_RECV", + "HTTP_POST_SEND", + "HTTP_PUT", + "HTTP_PUT_RECV", + "HTTP_DELETE", + "HTTP_TRACE", + "HTTP_CLOSE", + "HTTP_STATUS" + }; +#endif /* DEBUG */ + + +#if defined(HAVE_SSL) && defined(HAVE_LIBSSL) +/* + * BIO methods for OpenSSL... + */ + +static int http_bio_write(BIO *h, const char *buf, int num); +static int http_bio_read(BIO *h, char *buf, int size); +static int http_bio_puts(BIO *h, const char *str); +static long http_bio_ctrl(BIO *h, int cmd, long arg1, void *arg2); +static int http_bio_new(BIO *h); +static int http_bio_free(BIO *data); + +static BIO_METHOD http_bio_methods = + { + BIO_TYPE_SOCKET, + "http", + http_bio_write, + http_bio_read, + http_bio_puts, + NULL, /* http_bio_gets, */ + http_bio_ctrl, + http_bio_new, + http_bio_free, + NULL, + }; +#endif /* HAVE_SSL && HAVE_LIBSSL */ + + +/* + * 'httpAddCredential()' - Allocates and adds a single credential to an array. + * + * Use @code cupsArrayNew(NULL, NULL)@ to create a credentials array. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +int /* O - 0 on success, -1 on error */ +httpAddCredential( + cups_array_t *credentials, /* I - Credentials array */ + const void *data, /* I - PEM-encoded X.509 data */ + size_t datalen) /* I - Length of data */ +{ + http_credential_t *credential; /* Credential data */ + + + if ((credential = malloc(sizeof(http_credential_t))) != NULL) + { + credential->datalen = datalen; + + if ((credential->data = malloc(datalen)) != NULL) + { + memcpy(credential->data, data, datalen); + cupsArrayAdd(credentials, credential); + return (0); + } + + free(credential); + } + + return (-1); +} + + +#if defined(HAVE_SSL) && defined(HAVE_LIBSSL) +/* + * '_httpBIOMethods()' - Get the OpenSSL BIO methods for HTTP connections. + */ + +BIO_METHOD * /* O - BIO methods for OpenSSL */ +_httpBIOMethods(void) +{ + return (&http_bio_methods); +} +#endif /* HAVE_SSL && HAVE_LIBSSL */ + + +/* + * 'httpBlocking()' - Set blocking/non-blocking behavior on a connection. + */ + +void +httpBlocking(http_t *http, /* I - Connection to server */ + int b) /* I - 1 = blocking, 0 = non-blocking */ +{ + if (http) + { + http->blocking = b; + http_set_wait(http); + } +} + + +/* + * 'httpCheck()' - Check to see if there is a pending response from the server. + */ + +int /* O - 0 = no data, 1 = data available */ +httpCheck(http_t *http) /* I - Connection to server */ +{ + return (httpWait(http, 0)); +} + + +/* + * 'httpClearCookie()' - Clear the cookie value(s). + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +void +httpClearCookie(http_t *http) /* I - Connection to server */ +{ + if (!http) + return; + + if (http->cookie) + { + free(http->cookie); + http->cookie = NULL; + } +} + + +/* + * 'httpClearFields()' - Clear HTTP request fields. + */ + +void +httpClearFields(http_t *http) /* I - Connection to server */ +{ + if (http) + { + memset(http->fields, 0, sizeof(http->fields)); + if (http->hostname[0] == '/') + httpSetField(http, HTTP_FIELD_HOST, "localhost"); + else + httpSetField(http, HTTP_FIELD_HOST, http->hostname); + + if (http->field_authorization) + { + free(http->field_authorization); + http->field_authorization = NULL; + } + + http->expect = (http_status_t)0; + } +} + + +/* + * 'httpClose()' - Close an HTTP connection. + */ + +void +httpClose(http_t *http) /* I - Connection to server */ +{ +#ifdef HAVE_GSSAPI + OM_uint32 minor_status; /* Minor status code */ +#endif /* HAVE_GSSAPI */ + + + DEBUG_printf(("httpClose(http=%p)", http)); + + /* + * Range check input... + */ + + if (!http) + return; + + /* + * Close any open connection... + */ + + _httpDisconnect(http); + + /* + * Free memory used... + */ + + httpAddrFreeList(http->addrlist); + + if (http->cookie) + free(http->cookie); + +#ifdef HAVE_GSSAPI + if (http->gssctx != GSS_C_NO_CONTEXT) + gss_delete_sec_context(&minor_status, &http->gssctx, GSS_C_NO_BUFFER); + + if (http->gssname != GSS_C_NO_NAME) + gss_release_name(&minor_status, &http->gssname); +#endif /* HAVE_GSSAPI */ + +#ifdef HAVE_AUTHORIZATION_H + if (http->auth_ref) + AuthorizationFree(http->auth_ref, kAuthorizationFlagDefaults); +#endif /* HAVE_AUTHORIZATION_H */ + + httpClearFields(http); + + if (http->authstring && http->authstring != http->_authstring) + free(http->authstring); + + free(http); +} + + +/* + * 'httpConnect()' - Connect to a HTTP server. + * + * This function is deprecated - use @link httpConnectEncrypt@ instead. + * + * @deprecated@ + */ + +http_t * /* O - New HTTP connection */ +httpConnect(const char *host, /* I - Host to connect to */ + int port) /* I - Port number */ +{ + return (httpConnectEncrypt(host, port, HTTP_ENCRYPT_IF_REQUESTED)); +} + + +/* + * 'httpConnectEncrypt()' - Connect to a HTTP server using encryption. + */ + +http_t * /* O - New HTTP connection */ +httpConnectEncrypt( + const char *host, /* I - Host to connect to */ + int port, /* I - Port number */ + http_encryption_t encryption) /* I - Type of encryption to use */ +{ + http_t *http; /* New HTTP connection */ + + + DEBUG_printf(("httpConnectEncrypt(host=\"%s\", port=%d, encryption=%d)", + host, port, encryption)); + + /* + * Create the HTTP structure... + */ + + if ((http = _httpCreate(host, port, NULL, encryption, AF_UNSPEC)) == NULL) + return (NULL); + + /* + * Connect to the remote system... + */ + + if (!httpReconnect(http)) + return (http); + + /* + * Could not connect to any known address - bail out! + */ + + httpAddrFreeList(http->addrlist); + + free(http); + + return (NULL); +} + + +/* + * 'httpCopyCredentials()' - Copy the credentials associated with an encrypted + * connection. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +int /* O - Status of call (0 = success) */ +httpCopyCredentials( + http_t *http, /* I - Connection to server */ + cups_array_t **credentials) /* O - Array of credentials */ +{ +# ifdef HAVE_LIBSSL +# elif defined(HAVE_GNUTLS) +# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA) + OSStatus error; /* Error code */ + CFIndex count; /* Number of credentials */ + CFArrayRef peerCerts; /* Peer certificates */ + SecCertificateRef secCert; /* Certificate reference */ + CFDataRef data; /* Certificate data */ + int i; /* Looping var */ +# elif defined(HAVE_SSPISSL) +# endif /* HAVE_LIBSSL */ + + + if (credentials) + *credentials = NULL; + + if (!http || !http->tls || !credentials) + return (-1); + +# ifdef HAVE_LIBSSL + return (-1); + +# elif defined(HAVE_GNUTLS) + return (-1); + +# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA) + if (!(error = SSLCopyPeerCertificates(http->tls, &peerCerts)) && peerCerts) + { + if ((*credentials = cupsArrayNew(NULL, NULL)) != NULL) + { + for (i = 0, count = CFArrayGetCount(peerCerts); i < count; i++) + { + secCert = (SecCertificateRef)CFArrayGetValueAtIndex(peerCerts, i); + if ((data = SecCertificateCopyData(secCert))) + { + httpAddCredential(*credentials, CFDataGetBytePtr(data), + CFDataGetLength(data)); + CFRelease(data); + } + } + } + + CFRelease(peerCerts); + } + + return (error); + +# elif defined(HAVE_SSPISSL) + return (-1); + +# else + return (-1); +# endif /* HAVE_LIBSSL */ +} + + +/* + * '_httpCreate()' - Create an unconnected HTTP connection. + */ + +http_t * /* O - HTTP connection */ +_httpCreate( + const char *host, /* I - Hostname */ + int port, /* I - Port number */ + http_addrlist_t *addrlist, /* I - Address list or NULL */ + http_encryption_t encryption, /* I - Encryption to use */ + int family) /* I - Address family or AF_UNSPEC */ +{ + http_t *http; /* New HTTP connection */ + char service[255]; /* Service name */ + + + DEBUG_printf(("4_httpCreate(host=\"%s\", port=%d, encryption=%d)", + host, port, encryption)); + + if (!host) + return (NULL); + + httpInitialize(); + + /* + * Lookup the host... + */ + + sprintf(service, "%d", port); + + if (!addrlist) + if ((addrlist = httpAddrGetList(host, family, service)) == NULL) + return (NULL); + + /* + * Allocate memory for the structure... + */ + + if ((http = calloc(sizeof(http_t), 1)) == NULL) + { + httpAddrFreeList(addrlist); + return (NULL); + } + + /* + * Initialize the HTTP data... + */ + + http->activity = time(NULL); + http->addrlist = addrlist; + http->blocking = 1; + http->fd = -1; +#ifdef HAVE_GSSAPI + http->gssctx = GSS_C_NO_CONTEXT; + http->gssname = GSS_C_NO_NAME; +#endif /* HAVE_GSSAPI */ + http->version = HTTP_1_1; + + strlcpy(http->hostname, host, sizeof(http->hostname)); + + if (port == 443) /* Always use encryption for https */ + http->encryption = HTTP_ENCRYPT_ALWAYS; + else + http->encryption = encryption; + + http_set_wait(http); + + /* + * Return the new structure... + */ + + return (http); +} + + +/* + * '_httpCreateCredentials()' - Create credentials in the internal format. + */ + +http_tls_credentials_t /* O - Internal credentials */ +_httpCreateCredentials( + cups_array_t *credentials) /* I - Array of credentials */ +{ + if (!credentials) + return (NULL); + +# ifdef HAVE_LIBSSL + return (NULL); + +# elif defined(HAVE_GNUTLS) + return (NULL); + +# elif defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA) + CFMutableArrayRef peerCerts; /* Peer credentials reference */ + SecCertificateRef secCert; /* Certificate reference */ + CFDataRef data; /* Credential data reference */ + http_credential_t *credential; /* Credential data */ + + + if ((peerCerts = CFArrayCreateMutable(kCFAllocatorDefault, + cupsArrayCount(credentials), + &kCFTypeArrayCallBacks)) == NULL) + return (NULL); + + for (credential = (http_credential_t *)cupsArrayFirst(credentials); + credential; + credential = (http_credential_t *)cupsArrayNext(credentials)) + { + if ((data = CFDataCreate(kCFAllocatorDefault, credential->data, + credential->datalen))) + { + if ((secCert = SecCertificateCreateWithData(kCFAllocatorDefault, data)) + != NULL) + { + CFArrayAppendValue(peerCerts, secCert); + CFRelease(secCert); + } + + CFRelease(data); + } + } + + return (peerCerts); + +# elif defined(HAVE_SSPISSL) + return (NULL); + +# else + return (NULL); +# endif /* HAVE_LIBSSL */ +} + + +/* + * 'httpDelete()' - Send a DELETE request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpDelete(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI to delete */ +{ + return (http_send(http, HTTP_DELETE, uri)); +} + + +/* + * '_httpDisconnect()' - Disconnect a HTTP connection. + */ + +void +_httpDisconnect(http_t *http) /* I - Connection to server */ +{ +#ifdef HAVE_SSL + if (http->tls) + http_shutdown_ssl(http); +#endif /* HAVE_SSL */ + +#ifdef WIN32 + closesocket(http->fd); +#else + close(http->fd); +#endif /* WIN32 */ + + http->fd = -1; +} + + +/* + * 'httpEncryption()' - Set the required encryption on the link. + */ + +int /* O - -1 on error, 0 on success */ +httpEncryption(http_t *http, /* I - Connection to server */ + http_encryption_t e) /* I - New encryption preference */ +{ + DEBUG_printf(("httpEncryption(http=%p, e=%d)", http, e)); + +#ifdef HAVE_SSL + if (!http) + return (0); + + http->encryption = e; + + if ((http->encryption == HTTP_ENCRYPT_ALWAYS && !http->tls) || + (http->encryption == HTTP_ENCRYPT_NEVER && http->tls)) + return (httpReconnect(http)); + else if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls) + return (http_upgrade(http)); + else + return (0); +#else + if (e == HTTP_ENCRYPT_ALWAYS || e == HTTP_ENCRYPT_REQUIRED) + return (-1); + else + return (0); +#endif /* HAVE_SSL */ +} + + +/* + * 'httpError()' - Get the last error on a connection. + */ + +int /* O - Error code (errno) value */ +httpError(http_t *http) /* I - Connection to server */ +{ + if (http) + return (http->error); + else + return (EINVAL); +} + + +/* + * 'httpFlush()' - Flush data from a HTTP connection. + */ + +void +httpFlush(http_t *http) /* I - Connection to server */ +{ + char buffer[8192]; /* Junk buffer */ + int blocking; /* To block or not to block */ + http_state_t oldstate; /* Old state */ + + + DEBUG_printf(("httpFlush(http=%p), state=%s", http, + http_states[http->state])); + + /* + * Temporarily set non-blocking mode so we don't get stuck in httpRead()... + */ + + blocking = http->blocking; + http->blocking = 0; + + /* + * Read any data we can... + */ + + oldstate = http->state; + while (httpRead2(http, buffer, sizeof(buffer)) > 0); + + /* + * Restore blocking and reset the connection if we didn't get all of + * the remaining data... + */ + + http->blocking = blocking; + + if (http->state == oldstate && http->state != HTTP_WAITING && http->fd >= 0) + { + /* + * Didn't get the data back, so close the current connection. + */ + + http->state = HTTP_WAITING; + +#ifdef HAVE_SSL + if (http->tls) + http_shutdown_ssl(http); +#endif /* HAVE_SSL */ + +#ifdef WIN32 + closesocket(http->fd); +#else + close(http->fd); +#endif /* WIN32 */ + + http->fd = -1; + } +} + + +/* + * 'httpFlushWrite()' - Flush data in write buffer. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - Bytes written or -1 on error */ +httpFlushWrite(http_t *http) /* I - Connection to server */ +{ + int bytes; /* Bytes written */ + + + DEBUG_printf(("httpFlushWrite(http=%p)", http)); + + if (!http || !http->wused) + { + DEBUG_puts(http ? "1httpFlushWrite: Write buffer is empty." : + "1httpFlushWrite: No connection."); + return (0); + } + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + bytes = http_write_chunk(http, http->wbuffer, http->wused); + else + bytes = http_write(http, http->wbuffer, http->wused); + + http->wused = 0; + + DEBUG_printf(("1httpFlushWrite: Returning %d, errno=%d.", bytes, errno)); + + return (bytes); +} + + +/* + * '_httpFreeCredentials()' - Free internal credentials. + */ + +void +_httpFreeCredentials( + http_tls_credentials_t credentials) /* I - Internal credentials */ +{ + if (!credentials) + return; + +#ifdef HAVE_LIBSSL + (void)credentials; + +#elif defined(HAVE_GNUTLS) + (void)credentials; + +#elif defined(HAVE_CDSASSL) + CFRelease(credentials); + +#elif defined(HAVE_SSPISSL) + (void)credentials; + +#endif /* HAVE_LIBSSL */ +} + + +/* + * 'httpFreeCredentials()' - Free an array of credentials. + */ + +void +httpFreeCredentials( + cups_array_t *credentials) /* I - Array of credentials */ +{ + http_credential_t *credential; /* Credential */ + + + for (credential = (http_credential_t *)cupsArrayFirst(credentials); + credential; + credential = (http_credential_t *)cupsArrayNext(credentials)) + { + cupsArrayRemove(credentials, credential); + free((void *)credential->data); + free(credential); + } + + cupsArrayDelete(credentials); +} + + +/* + * 'httpGet()' - Send a GET request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpGet(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI to get */ +{ + return (http_send(http, HTTP_GET, uri)); +} + + +/* + * 'httpGetAuthString()' - Get the current authorization string. + * + * The authorization string is set by cupsDoAuthentication() and + * httpSetAuthString(). Use httpGetAuthString() to retrieve the + * string to use with httpSetField() for the HTTP_FIELD_AUTHORIZATION + * value. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +char * /* O - Authorization string */ +httpGetAuthString(http_t *http) /* I - Connection to server */ +{ + if (http) + return (http->authstring); + else + return (NULL); +} + + +/* + * 'httpGetBlocking()' - Get the blocking/non-block state of a connection. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 1 if blocking, 0 if non-blocking */ +httpGetBlocking(http_t *http) /* I - Connection to server */ +{ + return (http ? http->blocking : 0); +} + + +/* + * 'httpGetCookie()' - Get any cookie data from the response. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +const char * /* O - Cookie data or NULL */ +httpGetCookie(http_t *http) /* I - HTTP connecion */ +{ + return (http ? http->cookie : NULL); +} + + +/* + * 'httpGetFd()' - Get the file descriptor associated with a connection. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - File descriptor or -1 if none */ +httpGetFd(http_t *http) /* I - Connection to server */ +{ + return (http ? http->fd : -1); +} + + +/* + * 'httpGetField()' - Get a field value from a request/response. + */ + +const char * /* O - Field value */ +httpGetField(http_t *http, /* I - Connection to server */ + http_field_t field) /* I - Field to get */ +{ + if (!http || field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX) + return (NULL); + else if (field == HTTP_FIELD_AUTHORIZATION && + http->field_authorization) + { + /* + * Special case for WWW-Authenticate: as its contents can be + * longer than HTTP_MAX_VALUE... + */ + + return (http->field_authorization); + } + else + return (http->fields[field]); +} + + +/* + * 'httpGetLength()' - Get the amount of data remaining from the + * content-length or transfer-encoding fields. + * + * This function is deprecated and will not return lengths larger than + * 2^31 - 1; use httpGetLength2() instead. + * + * @deprecated@ + */ + +int /* O - Content length */ +httpGetLength(http_t *http) /* I - Connection to server */ +{ + /* + * Get the read content length and return the 32-bit value. + */ + + if (http) + { + httpGetLength2(http); + + return (http->_data_remaining); + } + else + return (-1); +} + + +/* + * 'httpGetLength2()' - Get the amount of data remaining from the + * content-length or transfer-encoding fields. + * + * This function returns the complete content length, even for + * content larger than 2^31 - 1. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +off_t /* O - Content length */ +httpGetLength2(http_t *http) /* I - Connection to server */ +{ + DEBUG_printf(("2httpGetLength2(http=%p), state=%s", http, + http_states[http->state])); + + if (!http) + return (-1); + + if (!_cups_strcasecmp(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked")) + { + DEBUG_puts("4httpGetLength2: chunked request!"); + + http->data_encoding = HTTP_ENCODE_CHUNKED; + http->data_remaining = 0; + } + else + { + http->data_encoding = HTTP_ENCODE_LENGTH; + + /* + * The following is a hack for HTTP servers that don't send a + * content-length or transfer-encoding field... + * + * If there is no content-length then the connection must close + * after the transfer is complete... + */ + + if (!http->fields[HTTP_FIELD_CONTENT_LENGTH][0]) + { + /* + * Default content length is 0 for errors and 2^31-1 for other + * successful requests... + */ + + if (http->status >= HTTP_MULTIPLE_CHOICES) + http->data_remaining = 0; + else + http->data_remaining = 2147483647; + } + else + http->data_remaining = strtoll(http->fields[HTTP_FIELD_CONTENT_LENGTH], + NULL, 10); + + DEBUG_printf(("4httpGetLength2: content_length=" CUPS_LLFMT, + CUPS_LLCAST http->data_remaining)); + } + + if (http->data_remaining <= INT_MAX) + http->_data_remaining = (int)http->data_remaining; + else + http->_data_remaining = INT_MAX; + + return (http->data_remaining); +} + + +/* + * 'httpGetStatus()' - Get the status of the last HTTP request. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +http_status_t /* O - HTTP status */ +httpGetStatus(http_t *http) /* I - Connection to server */ +{ + return (http ? http->status : HTTP_ERROR); +} + + +/* + * 'httpGetSubField()' - Get a sub-field value. + * + * @deprecated@ + */ + +char * /* O - Value or NULL */ +httpGetSubField(http_t *http, /* I - Connection to server */ + http_field_t field, /* I - Field index */ + const char *name, /* I - Name of sub-field */ + char *value) /* O - Value string */ +{ + return (httpGetSubField2(http, field, name, value, HTTP_MAX_VALUE)); +} + + +/* + * 'httpGetSubField2()' - Get a sub-field value. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Value or NULL */ +httpGetSubField2(http_t *http, /* I - Connection to server */ + http_field_t field, /* I - Field index */ + const char *name, /* I - Name of sub-field */ + char *value, /* O - Value string */ + int valuelen) /* I - Size of value buffer */ +{ + const char *fptr; /* Pointer into field */ + char temp[HTTP_MAX_VALUE], /* Temporary buffer for name */ + *ptr, /* Pointer into string buffer */ + *end; /* End of value buffer */ + + DEBUG_printf(("2httpGetSubField2(http=%p, field=%d, name=\"%s\", value=%p, " + "valuelen=%d)", http, field, name, value, valuelen)); + + if (!http || !name || !value || valuelen < 2 || + field <= HTTP_FIELD_UNKNOWN || field >= HTTP_FIELD_MAX) + return (NULL); + + end = value + valuelen - 1; + + for (fptr = http->fields[field]; *fptr;) + { + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*fptr)) + fptr ++; + + if (*fptr == ',') + { + fptr ++; + continue; + } + + /* + * Get the sub-field name... + */ + + for (ptr = temp; + *fptr && *fptr != '=' && !_cups_isspace(*fptr) && + ptr < (temp + sizeof(temp) - 1); + *ptr++ = *fptr++); + + *ptr = '\0'; + + DEBUG_printf(("4httpGetSubField2: name=\"%s\"", temp)); + + /* + * Skip trailing chars up to the '='... + */ + + while (_cups_isspace(*fptr)) + fptr ++; + + if (!*fptr) + break; + + if (*fptr != '=') + continue; + + /* + * Skip = and leading whitespace... + */ + + fptr ++; + + while (_cups_isspace(*fptr)) + fptr ++; + + if (*fptr == '\"') + { + /* + * Read quoted string... + */ + + for (ptr = value, fptr ++; + *fptr && *fptr != '\"' && ptr < end; + *ptr++ = *fptr++); + + *ptr = '\0'; + + while (*fptr && *fptr != '\"') + fptr ++; + + if (*fptr) + fptr ++; + } + else + { + /* + * Read unquoted string... + */ + + for (ptr = value; + *fptr && !_cups_isspace(*fptr) && *fptr != ',' && ptr < end; + *ptr++ = *fptr++); + + *ptr = '\0'; + + while (*fptr && !_cups_isspace(*fptr) && *fptr != ',') + fptr ++; + } + + DEBUG_printf(("4httpGetSubField2: value=\"%s\"", value)); + + /* + * See if this is the one... + */ + + if (!strcmp(name, temp)) + { + DEBUG_printf(("3httpGetSubField2: Returning \"%s\"", value)); + return (value); + } + } + + value[0] = '\0'; + + DEBUG_puts("3httpGetSubField2: Returning NULL"); + + return (NULL); +} + + +/* + * 'httpGets()' - Get a line of text from a HTTP connection. + */ + +char * /* O - Line or NULL */ +httpGets(char *line, /* I - Line to read into */ + int length, /* I - Max length of buffer */ + http_t *http) /* I - Connection to server */ +{ + char *lineptr, /* Pointer into line */ + *lineend, /* End of line */ + *bufptr, /* Pointer into input buffer */ + *bufend; /* Pointer to end of buffer */ + int bytes, /* Number of bytes read */ + eol; /* End-of-line? */ + + + DEBUG_printf(("2httpGets(line=%p, length=%d, http=%p)", line, length, http)); + + if (http == NULL || line == NULL) + return (NULL); + + /* + * Read a line from the buffer... + */ + + http->error = 0; + lineptr = line; + lineend = line + length - 1; + eol = 0; + + while (lineptr < lineend) + { + /* + * Pre-load the buffer as needed... + */ + +#ifdef WIN32 + WSASetLastError(0); +#else + errno = 0; +#endif /* WIN32 */ + + while (http->used == 0) + { + /* + * No newline; see if there is more data to be read... + */ + + while (!_httpWait(http, http->wait_value, 1)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + DEBUG_puts("3httpGets: Timed out!"); +#ifdef WIN32 + http->error = WSAETIMEDOUT; +#else + http->error = ETIMEDOUT; +#endif /* WIN32 */ + return (NULL); + } + +#ifdef HAVE_SSL + if (http->tls) + bytes = http_read_ssl(http, http->buffer + http->used, + HTTP_MAX_BUFFER - http->used); + else +#endif /* HAVE_SSL */ + bytes = recv(http->fd, http->buffer + http->used, + HTTP_MAX_BUFFER - http->used, 0); + + DEBUG_printf(("4httpGets: read %d bytes...", bytes)); + + if (bytes < 0) + { + /* + * Nope, can't get a line this time... + */ + +#ifdef WIN32 + DEBUG_printf(("3httpGets: recv() error %d!", WSAGetLastError())); + + if (WSAGetLastError() == WSAEINTR) + continue; + else if (WSAGetLastError() == WSAEWOULDBLOCK) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + http->error = WSAGetLastError(); + } + else if (WSAGetLastError() != http->error) + { + http->error = WSAGetLastError(); + continue; + } + +#else + DEBUG_printf(("3httpGets: recv() error %d!", errno)); + + if (errno == EINTR) + continue; + else if (errno == EWOULDBLOCK || errno == EAGAIN) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + else if (!http->timeout_cb && errno == EAGAIN) + continue; + + http->error = errno; + } + else if (errno != http->error) + { + http->error = errno; + continue; + } +#endif /* WIN32 */ + + return (NULL); + } + else if (bytes == 0) + { + http->error = EPIPE; + + return (NULL); + } + + /* + * Yup, update the amount used... + */ + + http->used += bytes; + } + + /* + * Now copy as much of the current line as possible... + */ + + for (bufptr = http->buffer, bufend = http->buffer + http->used; + lineptr < lineend && bufptr < bufend;) + { + if (*bufptr == 0x0a) + { + eol = 1; + bufptr ++; + break; + } + else if (*bufptr == 0x0d) + bufptr ++; + else + *lineptr++ = *bufptr++; + } + + http->used -= (int)(bufptr - http->buffer); + if (http->used > 0) + memmove(http->buffer, bufptr, http->used); + + if (eol) + { + /* + * End of line... + */ + + http->activity = time(NULL); + + *lineptr = '\0'; + + DEBUG_printf(("3httpGets: Returning \"%s\"", line)); + + return (line); + } + } + + DEBUG_puts("3httpGets: No new line available!"); + + return (NULL); +} + + +/* + * 'httpHead()' - Send a HEAD request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpHead(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI for head */ +{ + DEBUG_printf(("httpHead(http=%p, uri=\"%s\")", http, uri)); + return (http_send(http, HTTP_HEAD, uri)); +} + + +/* + * 'httpInitialize()' - Initialize the HTTP interface library and set the + * default HTTP proxy (if any). + */ + +void +httpInitialize(void) +{ + static int initialized = 0; /* Have we been called before? */ +#ifdef WIN32 + WSADATA winsockdata; /* WinSock data */ +#endif /* WIN32 */ +#ifdef HAVE_LIBSSL + int i; /* Looping var */ + unsigned char data[1024]; /* Seed data */ +#endif /* HAVE_LIBSSL */ + + + _cupsGlobalLock(); + if (initialized) + { + _cupsGlobalUnlock(); + return; + } + +#ifdef WIN32 + WSAStartup(MAKEWORD(2,2), &winsockdata); + +#elif !defined(SO_NOSIGPIPE) + /* + * Ignore SIGPIPE signals... + */ + +# ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); + +# elif defined(HAVE_SIGACTION) + struct sigaction action; /* POSIX sigaction data */ + + + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + +# else + signal(SIGPIPE, SIG_IGN); +# endif /* !SO_NOSIGPIPE */ +#endif /* WIN32 */ + +#ifdef HAVE_GNUTLS + /* + * Initialize GNU TLS... + */ + + gnutls_global_init(); + +#elif defined(HAVE_LIBSSL) + /* + * Initialize OpenSSL... + */ + + SSL_load_error_strings(); + SSL_library_init(); + + /* + * Using the current time is a dubious random seed, but on some systems + * it is the best we can do (on others, this seed isn't even used...) + */ + + CUPS_SRAND(time(NULL)); + + for (i = 0; i < sizeof(data); i ++) + data[i] = CUPS_RAND(); + + RAND_seed(data, sizeof(data)); +#endif /* HAVE_GNUTLS */ + + initialized = 1; + _cupsGlobalUnlock(); +} + + +/* + * 'httpOptions()' - Send an OPTIONS request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpOptions(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI for options */ +{ + return (http_send(http, HTTP_OPTIONS, uri)); +} + + +/* + * '_httpPeek()' - Peek at data from a HTTP connection. + * + * This function copies available data from the given HTTP connection, reading + * a buffer as needed. The data is still available for reading using + * @link httpRead@ or @link httpRead2@. + * + * For non-blocking connections the usual timeouts apply. + */ + +ssize_t /* O - Number of bytes copied */ +_httpPeek(http_t *http, /* I - Connection to server */ + char *buffer, /* I - Buffer for data */ + size_t length) /* I - Maximum number of bytes */ +{ + ssize_t bytes; /* Bytes read */ + char len[32]; /* Length string */ + + + DEBUG_printf(("_httpPeek(http=%p, buffer=%p, length=" CUPS_LLFMT ")", + http, buffer, CUPS_LLCAST length)); + + if (http == NULL || buffer == NULL) + return (-1); + + http->activity = time(NULL); + http->error = 0; + + if (length <= 0) + return (0); + + if (http->data_encoding == HTTP_ENCODE_CHUNKED && + http->data_remaining <= 0) + { + DEBUG_puts("2_httpPeek: Getting chunk length..."); + + if (httpGets(len, sizeof(len), http) == NULL) + { + DEBUG_puts("1_httpPeek: Could not get length!"); + return (0); + } + + http->data_remaining = strtoll(len, NULL, 16); + if (http->data_remaining < 0) + { + DEBUG_puts("1_httpPeek: Negative chunk length!"); + return (0); + } + } + + DEBUG_printf(("2_httpPeek: data_remaining=" CUPS_LLFMT, + CUPS_LLCAST http->data_remaining)); + + if (http->data_remaining <= 0) + { + /* + * A zero-length chunk ends a transfer; unless we are reading POST + * data, go idle... + */ + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + httpGets(len, sizeof(len), http); + + if (http->state == HTTP_POST_RECV) + http->state ++; + else + http->state = HTTP_WAITING; + + /* + * Prevent future reads for this request... + */ + + http->data_encoding = HTTP_ENCODE_LENGTH; + + return (0); + } + else if (length > (size_t)http->data_remaining) + length = (size_t)http->data_remaining; + + if (http->used == 0) + { + /* + * Buffer small reads for better performance... + */ + + if (!http->blocking) + { + while (!httpWait(http, http->wait_value)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + return (0); + } + } + + if (http->data_remaining > sizeof(http->buffer)) + bytes = sizeof(http->buffer); + else + bytes = http->data_remaining; + +#ifdef HAVE_SSL + if (http->tls) + bytes = http_read_ssl(http, http->buffer, bytes); + else +#endif /* HAVE_SSL */ + { + DEBUG_printf(("2_httpPeek: reading %d bytes from socket into buffer...", + (int)bytes)); + + bytes = recv(http->fd, http->buffer, bytes, 0); + + DEBUG_printf(("2_httpPeek: read %d bytes from socket into buffer...", + (int)bytes)); + } + + if (bytes > 0) + http->used = bytes; + else if (bytes < 0) + { +#ifdef WIN32 + if (WSAGetLastError() != WSAEINTR && WSAGetLastError() != WSAEWOULDBLOCK) + { + http->error = WSAGetLastError(); + return (-1); + } +#else + if (errno != EINTR && errno != EAGAIN) + { + http->error = errno; + return (-1); + } +#endif /* WIN32 */ + } + else + { + http->error = EPIPE; + return (0); + } + } + + if (http->used > 0) + { + if (length > (size_t)http->used) + length = (size_t)http->used; + + bytes = (ssize_t)length; + + DEBUG_printf(("2_httpPeek: grabbing %d bytes from input buffer...", + (int)bytes)); + + memcpy(buffer, http->buffer, length); + } + else + bytes = 0; + + if (bytes < 0) + { +#ifdef WIN32 + if (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK) + bytes = 0; + else + http->error = WSAGetLastError(); +#else + if (errno == EINTR || errno == EAGAIN) + bytes = 0; + else + http->error = errno; +#endif /* WIN32 */ + } + else if (bytes == 0) + { + http->error = EPIPE; + return (0); + } + +#ifdef DEBUG + http_debug_hex("_httpPeek", buffer, (int)bytes); +#endif /* DEBUG */ + + return (bytes); +} + + +/* + * 'httpPost()' - Send a POST request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpPost(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI for post */ +{ + return (http_send(http, HTTP_POST, uri)); +} + + +/* + * 'httpPrintf()' - Print a formatted string to a HTTP connection. + * + * @private@ + */ + +int /* O - Number of bytes written */ +httpPrintf(http_t *http, /* I - Connection to server */ + const char *format, /* I - printf-style format string */ + ...) /* I - Additional args as needed */ +{ + int bytes; /* Number of bytes to write */ + char buf[16384]; /* Buffer for formatted string */ + va_list ap; /* Variable argument pointer */ + + + DEBUG_printf(("2httpPrintf(http=%p, format=\"%s\", ...)", http, format)); + + va_start(ap, format); + bytes = vsnprintf(buf, sizeof(buf), format, ap); + va_end(ap); + + DEBUG_printf(("3httpPrintf: %s", buf)); + + if (http->data_encoding == HTTP_ENCODE_FIELDS) + return (httpWrite2(http, buf, bytes)); + else + { + if (http->wused) + { + DEBUG_puts("4httpPrintf: flushing existing data..."); + + if (httpFlushWrite(http) < 0) + return (-1); + } + + return (http_write(http, buf, bytes)); + } +} + + +/* + * 'httpPut()' - Send a PUT request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpPut(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI to put */ +{ + DEBUG_printf(("httpPut(http=%p, uri=\"%s\")", http, uri)); + return (http_send(http, HTTP_PUT, uri)); +} + + +/* + * 'httpRead()' - Read data from a HTTP connection. + * + * This function is deprecated. Use the httpRead2() function which can + * read more than 2GB of data. + * + * @deprecated@ + */ + +int /* O - Number of bytes read */ +httpRead(http_t *http, /* I - Connection to server */ + char *buffer, /* I - Buffer for data */ + int length) /* I - Maximum number of bytes */ +{ + return ((int)httpRead2(http, buffer, length)); +} + + +/* + * 'httpRead2()' - Read data from a HTTP connection. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Number of bytes read */ +httpRead2(http_t *http, /* I - Connection to server */ + char *buffer, /* I - Buffer for data */ + size_t length) /* I - Maximum number of bytes */ +{ + ssize_t bytes; /* Bytes read */ + char len[32]; /* Length string */ + + + DEBUG_printf(("httpRead2(http=%p, buffer=%p, length=" CUPS_LLFMT ")", + http, buffer, CUPS_LLCAST length)); + + if (http == NULL || buffer == NULL) + return (-1); + + http->activity = time(NULL); + http->error = 0; + + if (length <= 0) + return (0); + + if (http->data_encoding == HTTP_ENCODE_CHUNKED && + http->data_remaining <= 0) + { + DEBUG_puts("2httpRead2: Getting chunk length..."); + + if (httpGets(len, sizeof(len), http) == NULL) + { + DEBUG_puts("1httpRead2: Could not get length!"); + return (0); + } + + http->data_remaining = strtoll(len, NULL, 16); + if (http->data_remaining < 0) + { + DEBUG_puts("1httpRead2: Negative chunk length!"); + return (0); + } + } + + DEBUG_printf(("2httpRead2: data_remaining=" CUPS_LLFMT, + CUPS_LLCAST http->data_remaining)); + + if (http->data_remaining <= 0) + { + /* + * A zero-length chunk ends a transfer; unless we are reading POST + * data, go idle... + */ + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + httpGets(len, sizeof(len), http); + + if (http->state == HTTP_POST_RECV) + http->state ++; + else + http->state = HTTP_WAITING; + + /* + * Prevent future reads for this request... + */ + + http->data_encoding = HTTP_ENCODE_LENGTH; + + return (0); + } + else if (length > (size_t)http->data_remaining) + length = (size_t)http->data_remaining; + + if (http->used == 0 && length <= 256) + { + /* + * Buffer small reads for better performance... + */ + + ssize_t buflen; /* Length of read for buffer */ + + if (!http->blocking) + { + while (!httpWait(http, http->wait_value)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + return (0); + } + } + + if (http->data_remaining > sizeof(http->buffer)) + buflen = sizeof(http->buffer); + else + buflen = http->data_remaining; + + DEBUG_printf(("2httpRead2: Reading %d bytes into buffer.", (int)buflen)); + + do + { +#ifdef HAVE_SSL + if (http->tls) + bytes = http_read_ssl(http, http->buffer, buflen); + else +#endif /* HAVE_SSL */ + bytes = recv(http->fd, http->buffer, buflen, 0); + + if (bytes < 0) + { +#ifdef WIN32 + if (WSAGetLastError() != WSAEINTR) + { + http->error = WSAGetLastError(); + return (-1); + } + else if (WSAGetLastError() == WSAEWOULDBLOCK) + { + if (!http->timeout_cb || + !(*http->timeout_cb)(http, http->timeout_data)) + { + http->error = WSAEWOULDBLOCK; + return (-1); + } + } +#else + if (errno == EWOULDBLOCK || errno == EAGAIN) + { + if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data)) + { + http->error = errno; + return (-1); + } + else if (!http->timeout_cb && errno != EAGAIN) + { + http->error = errno; + return (-1); + } + } + else if (errno != EINTR) + { + http->error = errno; + return (-1); + } +#endif /* WIN32 */ + } + } + while (bytes < 0); + + DEBUG_printf(("2httpRead2: Read %d bytes into buffer.", (int)bytes)); + + http->used = bytes; + } + + if (http->used > 0) + { + if (length > (size_t)http->used) + length = (size_t)http->used; + + bytes = (ssize_t)length; + + DEBUG_printf(("2httpRead2: grabbing %d bytes from input buffer...", + (int)bytes)); + + memcpy(buffer, http->buffer, length); + http->used -= (int)length; + + if (http->used > 0) + memmove(http->buffer, http->buffer + length, http->used); + } +#ifdef HAVE_SSL + else if (http->tls) + { + if (!http->blocking) + { + while (!httpWait(http, http->wait_value)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + return (0); + } + } + + while ((bytes = (ssize_t)http_read_ssl(http, buffer, (int)length)) < 0) + { +#ifdef WIN32 + if (WSAGetLastError() == WSAEWOULDBLOCK) + { + if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data)) + break; + } + else if (WSAGetLastError() != WSAEINTR) + break; +#else + if (errno == EWOULDBLOCK || errno == EAGAIN) + { + if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data)) + break; + else if (!http->timeout_cb && errno != EAGAIN) + break; + } + else if (errno != EINTR) + break; +#endif /* WIN32 */ + } + } +#endif /* HAVE_SSL */ + else + { + if (!http->blocking) + { + while (!httpWait(http, http->wait_value)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + return (0); + } + } + + DEBUG_printf(("2httpRead2: reading " CUPS_LLFMT " bytes from socket...", + CUPS_LLCAST length)); + +#ifdef WIN32 + while ((bytes = (ssize_t)recv(http->fd, buffer, (int)length, 0)) < 0) + { + if (WSAGetLastError() == WSAEWOULDBLOCK) + { + if (!http->timeout_cb || !(*http->timeout_cb)(http, http->timeout_data)) + break; + } + else if (WSAGetLastError() != WSAEINTR) + break; + } +#else + while ((bytes = recv(http->fd, buffer, length, 0)) < 0) + { + if (errno == EWOULDBLOCK || errno == EAGAIN) + { + if (http->timeout_cb && !(*http->timeout_cb)(http, http->timeout_data)) + break; + else if (!http->timeout_cb && errno != EAGAIN) + break; + } + else if (errno != EINTR) + break; + } +#endif /* WIN32 */ + + DEBUG_printf(("2httpRead2: read " CUPS_LLFMT " bytes from socket...", + CUPS_LLCAST bytes)); + } + + if (bytes > 0) + { + http->data_remaining -= bytes; + + if (http->data_remaining <= INT_MAX) + http->_data_remaining = (int)http->data_remaining; + else + http->_data_remaining = INT_MAX; + } + else if (bytes < 0) + { +#ifdef WIN32 + if (WSAGetLastError() == WSAEINTR) + bytes = 0; + else + http->error = WSAGetLastError(); +#else + if (errno == EINTR || (errno == EAGAIN && !http->timeout_cb)) + bytes = 0; + else + http->error = errno; +#endif /* WIN32 */ + } + else + { + http->error = EPIPE; + return (0); + } + + if (http->data_remaining == 0) + { + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + httpGets(len, sizeof(len), http); + else if (http->state == HTTP_POST_RECV) + http->state ++; + else + http->state = HTTP_WAITING; + } + +#ifdef DEBUG + http_debug_hex("httpRead2", buffer, (int)bytes); +#endif /* DEBUG */ + + return (bytes); +} + + +#if defined(HAVE_SSL) && defined(HAVE_CDSASSL) +/* + * '_httpReadCDSA()' - Read function for the CDSA library. + */ + +OSStatus /* O - -1 on error, 0 on success */ +_httpReadCDSA( + SSLConnectionRef connection, /* I - SSL/TLS connection */ + void *data, /* I - Data buffer */ + size_t *dataLength) /* IO - Number of bytes */ +{ + OSStatus result; /* Return value */ + ssize_t bytes; /* Number of bytes read */ + http_t *http; /* HTTP connection */ + + + http = (http_t *)connection; + + if (!http->blocking) + { + /* + * Make sure we have data before we read... + */ + + while (!_httpWait(http, http->wait_value, 0)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + http->error = ETIMEDOUT; + return (-1); + } + } + + do + { + bytes = recv(http->fd, data, *dataLength, 0); + } + while (bytes == -1 && (errno == EINTR || errno == EAGAIN)); + + if (bytes == *dataLength) + { + result = 0; + } + else if (bytes > 0) + { + *dataLength = bytes; + result = errSSLWouldBlock; + } + else + { + *dataLength = 0; + + if (bytes == 0) + result = errSSLClosedGraceful; + else if (errno == EAGAIN) + result = errSSLWouldBlock; + else + result = errSSLClosedAbort; + } + + return (result); +} +#endif /* HAVE_SSL && HAVE_CDSASSL */ + + +#if defined(HAVE_SSL) && defined(HAVE_GNUTLS) +/* + * '_httpReadGNUTLS()' - Read function for the GNU TLS library. + */ + +ssize_t /* O - Number of bytes read or -1 on error */ +_httpReadGNUTLS( + gnutls_transport_ptr ptr, /* I - Connection to server */ + void *data, /* I - Buffer */ + size_t length) /* I - Number of bytes to read */ +{ + http_t *http; /* HTTP connection */ + ssize_t bytes; /* Bytes read */ + + + DEBUG_printf(("6_httpReadGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, (int)length)); + + http = (http_t *)ptr; + + if (!http->blocking) + { + /* + * Make sure we have data before we read... + */ + + while (!_httpWait(http, http->wait_value, 0)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + http->error = ETIMEDOUT; + return (-1); + } + } + + bytes = recv(http->fd, data, length, 0); + DEBUG_printf(("6_httpReadGNUTLS: bytes=%d", (int)bytes)); + return (bytes); +} +#endif /* HAVE_SSL && HAVE_GNUTLS */ + + +/* + * 'httpReconnect()' - Reconnect to a HTTP server. + */ + +int /* O - 0 on success, non-zero on failure */ +httpReconnect(http_t *http) /* I - Connection to server */ +{ + http_addrlist_t *addr; /* Connected address */ +#ifdef DEBUG + http_addrlist_t *current; /* Current address */ + char temp[256]; /* Temporary address string */ +#endif /* DEBUG */ + + + DEBUG_printf(("httpReconnect(http=%p)", http)); + + if (!http) + return (-1); + +#ifdef HAVE_SSL + if (http->tls) + { + DEBUG_puts("2httpReconnect: Shutting down SSL/TLS..."); + http_shutdown_ssl(http); + } +#endif /* HAVE_SSL */ + + /* + * Close any previously open socket... + */ + + if (http->fd >= 0) + { + DEBUG_printf(("2httpReconnect: Closing socket %d...", http->fd)); + +#ifdef WIN32 + closesocket(http->fd); +#else + close(http->fd); +#endif /* WIN32 */ + + http->fd = -1; + } + + /* + * Reset all state (except fields, which may be reused)... + */ + + http->state = HTTP_WAITING; + http->status = HTTP_CONTINUE; + http->version = HTTP_1_1; + http->keep_alive = HTTP_KEEPALIVE_OFF; + memset(&http->_hostaddr, 0, sizeof(http->_hostaddr)); + http->data_encoding = HTTP_ENCODE_LENGTH; + http->_data_remaining = 0; + http->used = 0; + http->expect = 0; + http->data_remaining = 0; + http->hostaddr = NULL; + http->wused = 0; + + /* + * Connect to the server... + */ + +#ifdef DEBUG + for (current = http->addrlist; current; current = current->next) + DEBUG_printf(("2httpReconnect: Address %s:%d", + httpAddrString(&(current->addr), temp, sizeof(temp)), + _httpAddrPort(&(current->addr)))); +#endif /* DEBUG */ + + if ((addr = httpAddrConnect(http->addrlist, &(http->fd))) == NULL) + { + /* + * Unable to connect... + */ + +#ifdef WIN32 + http->error = WSAGetLastError(); +#else + http->error = errno; +#endif /* WIN32 */ + http->status = HTTP_ERROR; + + DEBUG_printf(("1httpReconnect: httpAddrConnect failed: %s", + strerror(http->error))); + + return (-1); + } + + DEBUG_printf(("2httpReconnect: New socket=%d", http->fd)); + + if (http->timeout_value > 0) + http_set_timeout(http->fd, http->timeout_value); + + http->hostaddr = &(addr->addr); + http->error = 0; + +#ifdef HAVE_SSL + if (http->encryption == HTTP_ENCRYPT_ALWAYS) + { + /* + * Always do encryption via SSL. + */ + + if (http_setup_ssl(http) != 0) + { +# ifdef WIN32 + closesocket(http->fd); +# else + close(http->fd); +# endif /* WIN32 */ + + return (-1); + } + } + else if (http->encryption == HTTP_ENCRYPT_REQUIRED) + return (http_upgrade(http)); +#endif /* HAVE_SSL */ + + DEBUG_printf(("1httpReconnect: Connected to %s:%d...", + httpAddrString(http->hostaddr, temp, sizeof(temp)), + _httpAddrPort(http->hostaddr))); + + return (0); +} + + +/* + * 'httpSetAuthString()' - Set the current authorization string. + * + * This function just stores a copy of the current authorization string in + * the HTTP connection object. You must still call httpSetField() to set + * HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet(), + * httpHead(), httpOptions(), httpPost, or httpPut(). + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +void +httpSetAuthString(http_t *http, /* I - Connection to server */ + const char *scheme, /* I - Auth scheme (NULL to clear it) */ + const char *data) /* I - Auth data (NULL for none) */ +{ + /* + * Range check input... + */ + + if (!http) + return; + + if (http->authstring && http->authstring != http->_authstring) + free(http->authstring); + + http->authstring = http->_authstring; + + if (scheme) + { + /* + * Set the current authorization string... + */ + + int len = (int)strlen(scheme) + (data ? (int)strlen(data) + 1 : 0) + 1; + char *temp; + + if (len > (int)sizeof(http->_authstring)) + { + if ((temp = malloc(len)) == NULL) + len = sizeof(http->_authstring); + else + http->authstring = temp; + } + + if (data) + snprintf(http->authstring, len, "%s %s", scheme, data); + else + strlcpy(http->authstring, scheme, len); + } + else + { + /* + * Clear the current authorization string... + */ + + http->_authstring[0] = '\0'; + } +} + + +/* + * 'httpSetCredentials()' - Set the credentials associated with an encrypted + * connection. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +int /* O - Status of call (0 = success) */ +httpSetCredentials(http_t *http, /* I - Connection to server */ + cups_array_t *credentials) /* I - Array of credentials */ +{ + if (!http || cupsArrayCount(credentials) < 1) + return (-1); + + _httpFreeCredentials(http->tls_credentials); + + http->tls_credentials = _httpCreateCredentials(credentials); + + return (http->tls_credentials ? 0 : -1); +} + + +/* + * 'httpSetCookie()' - Set the cookie value(s). + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +void +httpSetCookie(http_t *http, /* I - Connection */ + const char *cookie) /* I - Cookie string */ +{ + if (!http) + return; + + if (http->cookie) + free(http->cookie); + + if (cookie) + http->cookie = strdup(cookie); + else + http->cookie = NULL; +} + + +/* + * 'httpSetExpect()' - Set the Expect: header in a request. + * + * Currently only HTTP_CONTINUE is supported for the "expect" argument. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +httpSetExpect(http_t *http, /* I - Connection to server */ + http_status_t expect) /* I - HTTP status to expect (HTTP_CONTINUE) */ +{ + if (http) + http->expect = expect; +} + + +/* + * 'httpSetField()' - Set the value of an HTTP header. + */ + +void +httpSetField(http_t *http, /* I - Connection to server */ + http_field_t field, /* I - Field index */ + const char *value) /* I - Value */ +{ + if (http == NULL || + field < HTTP_FIELD_ACCEPT_LANGUAGE || + field > HTTP_FIELD_WWW_AUTHENTICATE || + value == NULL) + return; + + strlcpy(http->fields[field], value, HTTP_MAX_VALUE); + + if (field == HTTP_FIELD_AUTHORIZATION) + { + /* + * Special case for Authorization: as its contents can be + * longer than HTTP_MAX_VALUE + */ + + if (http->field_authorization) + free(http->field_authorization); + + http->field_authorization = strdup(value); + } + else if (field == HTTP_FIELD_HOST) + { + /* + * Special-case for Host: as we don't want a trailing "." on the hostname and + * need to bracket IPv6 numeric addresses. + */ + + char *ptr = strchr(value, ':'); + + if (value[0] != '[' && ptr && strchr(ptr + 1, ':')) + { + /* + * Bracket IPv6 numeric addresses... + * + * This is slightly inefficient (basically copying twice), but is an edge + * case and not worth optimizing... + */ + + snprintf(http->fields[HTTP_FIELD_HOST], + sizeof(http->fields[HTTP_FIELD_HOST]), "[%s]", value); + } + else + { + /* + * Check for a trailing dot on the hostname... + */ + + ptr = http->fields[HTTP_FIELD_HOST]; + + if (*ptr) + { + ptr += strlen(ptr) - 1; + + if (*ptr == '.') + *ptr = '\0'; + } + } + } +} + + +/* + * 'httpSetLength()' - Set the content-length and content-encoding. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +void +httpSetLength(http_t *http, /* I - Connection to server */ + size_t length) /* I - Length (0 for chunked) */ +{ + if (!http) + return; + + if (!length) + { + strcpy(http->fields[HTTP_FIELD_TRANSFER_ENCODING], "chunked"); + http->fields[HTTP_FIELD_CONTENT_LENGTH][0] = '\0'; + } + else + { + http->fields[HTTP_FIELD_TRANSFER_ENCODING][0] = '\0'; + snprintf(http->fields[HTTP_FIELD_CONTENT_LENGTH], HTTP_MAX_VALUE, + CUPS_LLFMT, CUPS_LLCAST length); + } +} + + +/* + * 'httpSetTimeout()' - Set read/write timeouts and an optional callback. + * + * The optional timeout callback receives both the HTTP connection and a user + * data pointer and must return 1 to continue or 0 to error (time) out. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +void +httpSetTimeout( + http_t *http, /* I - Connection to server */ + double timeout, /* I - Number of seconds for timeout, + must be greater than 0 */ + http_timeout_cb_t cb, /* I - Callback function or NULL */ + void *user_data) /* I - User data pointer */ +{ + if (!http || timeout <= 0.0) + return; + + http->timeout_cb = cb; + http->timeout_data = user_data; + http->timeout_value = timeout; + + if (http->fd >= 0) + http_set_timeout(http->fd, timeout); + + http_set_wait(http); +} + + +/* + * 'httpTrace()' - Send an TRACE request to the server. + */ + +int /* O - Status of call (0 = success) */ +httpTrace(http_t *http, /* I - Connection to server */ + const char *uri) /* I - URI for trace */ +{ + return (http_send(http, HTTP_TRACE, uri)); +} + + +/* + * '_httpUpdate()' - Update the current HTTP status for incoming data. + * + * Note: Unlike httpUpdate(), this function does not flush pending write data + * and only retrieves a single status line from the HTTP connection. + */ + +int /* O - 1 to continue, 0 to stop */ +_httpUpdate(http_t *http, /* I - Connection to server */ + http_status_t *status) /* O - Current HTTP status */ +{ + char line[32768], /* Line from connection... */ + *value; /* Pointer to value on line */ + http_field_t field; /* Field index */ + int major, minor; /* HTTP version numbers */ + + + DEBUG_printf(("_httpUpdate(http=%p, status=%p), state=%s", http, status, + http_states[http->state])); + + /* + * Grab a single line from the connection... + */ + + if (!httpGets(line, sizeof(line), http)) + { + *status = HTTP_ERROR; + return (0); + } + + DEBUG_printf(("2_httpUpdate: Got \"%s\"", line)); + + if (line[0] == '\0') + { + /* + * Blank line means the start of the data section (if any). Return + * the result code, too... + * + * If we get status 100 (HTTP_CONTINUE), then we *don't* change states. + * Instead, we just return HTTP_CONTINUE to the caller and keep on + * tryin'... + */ + + if (http->status == HTTP_CONTINUE) + { + *status = http->status; + return (0); + } + + if (http->status < HTTP_BAD_REQUEST) + http->digest_tries = 0; + +#ifdef HAVE_SSL + if (http->status == HTTP_SWITCHING_PROTOCOLS && !http->tls) + { + if (http_setup_ssl(http) != 0) + { +# ifdef WIN32 + closesocket(http->fd); +# else + close(http->fd); +# endif /* WIN32 */ + + *status = http->status = HTTP_ERROR; + return (0); + } + + *status = HTTP_CONTINUE; + return (0); + } +#endif /* HAVE_SSL */ + + httpGetLength2(http); + + switch (http->state) + { + case HTTP_GET : + case HTTP_POST : + case HTTP_POST_RECV : + case HTTP_PUT : + http->state ++; + case HTTP_POST_SEND : + case HTTP_HEAD : + break; + + default : + http->state = HTTP_WAITING; + break; + } + + *status = http->status; + return (0); + } + else if (!strncmp(line, "HTTP/", 5)) + { + /* + * Got the beginning of a response... + */ + + int intstatus; /* Status value as an integer */ + + if (sscanf(line, "HTTP/%d.%d%d", &major, &minor, &intstatus) != 3) + { + *status = http->status = HTTP_ERROR; + return (0); + } + + http->version = (http_version_t)(major * 100 + minor); + *status = http->status = (http_status_t)intstatus; + } + else if ((value = strchr(line, ':')) != NULL) + { + /* + * Got a value... + */ + + *value++ = '\0'; + while (_cups_isspace(*value)) + value ++; + + /* + * Be tolerants of servers that send unknown attribute fields... + */ + + if (!_cups_strcasecmp(line, "expect")) + { + /* + * "Expect: 100-continue" or similar... + */ + + http->expect = (http_status_t)atoi(value); + } + else if (!_cups_strcasecmp(line, "cookie")) + { + /* + * "Cookie: name=value[; name=value ...]" - replaces previous cookies... + */ + + httpSetCookie(http, value); + } + else if ((field = http_field(line)) != HTTP_FIELD_UNKNOWN) + httpSetField(http, field, value); +#ifdef DEBUG + else + DEBUG_printf(("1_httpUpdate: unknown field %s seen!", line)); +#endif /* DEBUG */ + } + else + { + DEBUG_printf(("1_httpUpdate: Bad response line \"%s\"!", line)); + *status = http->status = HTTP_ERROR; + return (0); + } + + return (1); +} + + +/* + * 'httpUpdate()' - Update the current HTTP state for incoming data. + */ + +http_status_t /* O - HTTP status */ +httpUpdate(http_t *http) /* I - Connection to server */ +{ + http_status_t status; /* Request status */ + + + DEBUG_printf(("httpUpdate(http=%p), state=%s", http, + http_states[http->state])); + + /* + * Flush pending data, if any... + */ + + if (http->wused) + { + DEBUG_puts("2httpUpdate: flushing buffer..."); + + if (httpFlushWrite(http) < 0) + return (HTTP_ERROR); + } + + /* + * If we haven't issued any commands, then there is nothing to "update"... + */ + + if (http->state == HTTP_WAITING) + return (HTTP_CONTINUE); + + /* + * Grab all of the lines we can from the connection... + */ + + while (_httpUpdate(http, &status)); + + /* + * See if there was an error... + */ + + if (http->error == EPIPE && http->status > HTTP_CONTINUE) + { + DEBUG_printf(("1httpUpdate: Returning status %d...", http->status)); + return (http->status); + } + + if (http->error) + { + DEBUG_printf(("1httpUpdate: socket error %d - %s", http->error, + strerror(http->error))); + http->status = HTTP_ERROR; + return (HTTP_ERROR); + } + + /* + * Return the current status... + */ + + return (status); +} + + +/* + * '_httpWait()' - Wait for data available on a connection (no flush). + */ + +int /* O - 1 if data is available, 0 otherwise */ +_httpWait(http_t *http, /* I - Connection to server */ + int msec, /* I - Milliseconds to wait */ + int usessl) /* I - Use SSL context? */ +{ +#ifdef HAVE_POLL + struct pollfd pfd; /* Polled file descriptor */ +#else + fd_set input_set; /* select() input set */ + struct timeval timeout; /* Timeout */ +#endif /* HAVE_POLL */ + int nfds; /* Result from select()/poll() */ + + + DEBUG_printf(("4_httpWait(http=%p, msec=%d, usessl=%d)", http, msec, usessl)); + + if (http->fd < 0) + { + DEBUG_printf(("5_httpWait: Returning 0 since fd=%d", http->fd)); + return (0); + } + + /* + * Check the SSL/TLS buffers for data first... + */ + +#ifdef HAVE_SSL + if (http->tls && usessl) + { +# ifdef HAVE_LIBSSL + if (SSL_pending(http->tls)) + { + DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data."); + return (1); + } + +# elif defined(HAVE_GNUTLS) + if (gnutls_record_check_pending(http->tls)) + { + DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data."); + return (1); + } + +# elif defined(HAVE_CDSASSL) + size_t bytes; /* Bytes that are available */ + + if (!SSLGetBufferedReadSize(http->tls, &bytes) && + bytes > 0) + { + DEBUG_puts("5_httpWait: Return 1 since there is pending SSL data."); + return (1); + } +# endif /* HAVE_LIBSSL */ + } +#endif /* HAVE_SSL */ + + /* + * Then try doing a select() or poll() to poll the socket... + */ + +#ifdef HAVE_POLL + pfd.fd = http->fd; + pfd.events = POLLIN; + + while ((nfds = poll(&pfd, 1, msec)) < 0 && + (errno == EINTR || errno == EAGAIN)); + +#else + do + { + FD_ZERO(&input_set); + FD_SET(http->fd, &input_set); + + DEBUG_printf(("6_httpWait: msec=%d, http->fd=%d", msec, http->fd)); + + if (msec >= 0) + { + timeout.tv_sec = msec / 1000; + timeout.tv_usec = (msec % 1000) * 1000; + + nfds = select(http->fd + 1, &input_set, NULL, NULL, &timeout); + } + else + nfds = select(http->fd + 1, &input_set, NULL, NULL, NULL); + + DEBUG_printf(("6_httpWait: select() returned %d...", nfds)); + } +# ifdef WIN32 + while (nfds < 0 && (WSAGetLastError() == WSAEINTR || + WSAGetLastError() == WSAEWOULDBLOCK)); +# else + while (nfds < 0 && (errno == EINTR || errno == EAGAIN)); +# endif /* WIN32 */ +#endif /* HAVE_POLL */ + + DEBUG_printf(("5_httpWait: returning with nfds=%d, errno=%d...", nfds, + errno)); + + return (nfds > 0); +} + + +/* + * 'httpWait()' - Wait for data available on a connection. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +int /* O - 1 if data is available, 0 otherwise */ +httpWait(http_t *http, /* I - Connection to server */ + int msec) /* I - Milliseconds to wait */ +{ + /* + * First see if there is data in the buffer... + */ + + DEBUG_printf(("2httpWait(http=%p, msec=%d)", http, msec)); + + if (http == NULL) + return (0); + + if (http->used) + { + DEBUG_puts("3httpWait: Returning 1 since there is buffered data ready."); + return (1); + } + + /* + * Flush pending data, if any... + */ + + if (http->wused) + { + DEBUG_puts("3httpWait: Flushing write buffer."); + + if (httpFlushWrite(http) < 0) + return (0); + } + + /* + * If not, check the SSL/TLS buffers and do a select() on the connection... + */ + + return (_httpWait(http, msec, 1)); +} + + +/* + * 'httpWrite()' - Write data to a HTTP connection. + * + * This function is deprecated. Use the httpWrite2() function which can + * write more than 2GB of data. + * + * @deprecated@ + */ + +int /* O - Number of bytes written */ +httpWrite(http_t *http, /* I - Connection to server */ + const char *buffer, /* I - Buffer for data */ + int length) /* I - Number of bytes to write */ +{ + return ((int)httpWrite2(http, buffer, length)); +} + + +/* + * 'httpWrite2()' - Write data to a HTTP connection. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ssize_t /* O - Number of bytes written */ +httpWrite2(http_t *http, /* I - Connection to server */ + const char *buffer, /* I - Buffer for data */ + size_t length) /* I - Number of bytes to write */ +{ + ssize_t bytes; /* Bytes written */ + + + DEBUG_printf(("httpWrite2(http=%p, buffer=%p, length=" CUPS_LLFMT ")", http, + buffer, CUPS_LLCAST length)); + + /* + * Range check input... + */ + + if (http == NULL || buffer == NULL) + return (-1); + + /* + * Mark activity on the connection... + */ + + http->activity = time(NULL); + + /* + * Buffer small writes for better performance... + */ + + if (length > 0) + { + if (http->wused && (length + http->wused) > sizeof(http->wbuffer)) + { + DEBUG_printf(("2httpWrite2: Flushing buffer (wused=%d, length=" + CUPS_LLFMT ")", http->wused, CUPS_LLCAST length)); + + httpFlushWrite(http); + } + + if ((length + http->wused) <= sizeof(http->wbuffer) && + length < sizeof(http->wbuffer)) + { + /* + * Write to buffer... + */ + + DEBUG_printf(("2httpWrite2: Copying " CUPS_LLFMT " bytes to wbuffer...", + CUPS_LLCAST length)); + + memcpy(http->wbuffer + http->wused, buffer, length); + http->wused += (int)length; + bytes = (ssize_t)length; + } + else + { + /* + * Otherwise write the data directly... + */ + + DEBUG_printf(("2httpWrite2: Writing " CUPS_LLFMT " bytes to socket...", + CUPS_LLCAST length)); + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + bytes = (ssize_t)http_write_chunk(http, buffer, (int)length); + else + bytes = (ssize_t)http_write(http, buffer, (int)length); + + DEBUG_printf(("2httpWrite2: Wrote " CUPS_LLFMT " bytes...", + CUPS_LLCAST bytes)); + } + + if (http->data_encoding == HTTP_ENCODE_LENGTH) + http->data_remaining -= bytes; + } + else + bytes = 0; + + /* + * Handle end-of-request processing... + */ + + if ((http->data_encoding == HTTP_ENCODE_CHUNKED && length == 0) || + (http->data_encoding == HTTP_ENCODE_LENGTH && http->data_remaining == 0)) + { + /* + * Finished with the transfer; unless we are sending POST or PUT + * data, go idle... + */ + + DEBUG_puts("2httpWrite: changing states..."); + + if (http->wused) + httpFlushWrite(http); + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + { + /* + * Send a 0-length chunk at the end of the request... + */ + + http_write(http, "0\r\n\r\n", 5); + + /* + * Reset the data state... + */ + + http->data_encoding = HTTP_ENCODE_LENGTH; + http->data_remaining = 0; + } + } + + return (bytes); +} + + +#if defined(HAVE_SSL) && defined(HAVE_CDSASSL) +/* + * '_httpWriteCDSA()' - Write function for the CDSA library. + */ + +OSStatus /* O - -1 on error, 0 on success */ +_httpWriteCDSA( + SSLConnectionRef connection, /* I - SSL/TLS connection */ + const void *data, /* I - Data buffer */ + size_t *dataLength) /* IO - Number of bytes */ +{ + OSStatus result; /* Return value */ + ssize_t bytes; /* Number of bytes read */ + http_t *http; /* HTTP connection */ + + + http = (http_t *)connection; + + do + { + bytes = write(http->fd, data, *dataLength); + } + while (bytes == -1 && (errno == EINTR || errno == EAGAIN)); + + if (bytes == *dataLength) + { + result = 0; + } + else if (bytes >= 0) + { + *dataLength = bytes; + result = errSSLWouldBlock; + } + else + { + *dataLength = 0; + + if (errno == EAGAIN) + result = errSSLWouldBlock; + else + result = errSSLClosedAbort; + } + + return (result); +} +#endif /* HAVE_SSL && HAVE_CDSASSL */ + + +#if defined(HAVE_SSL) && defined(HAVE_GNUTLS) +/* + * '_httpWriteGNUTLS()' - Write function for the GNU TLS library. + */ + +ssize_t /* O - Number of bytes written or -1 on error */ +_httpWriteGNUTLS( + gnutls_transport_ptr ptr, /* I - Connection to server */ + const void *data, /* I - Data buffer */ + size_t length) /* I - Number of bytes to write */ +{ + ssize_t bytes; /* Bytes written */ + + + DEBUG_printf(("6_httpWriteGNUTLS(ptr=%p, data=%p, length=%d)", ptr, data, + (int)length)); +#ifdef DEBUG + http_debug_hex("_httpWriteGNUTLS", data, (int)length); +#endif /* DEBUG */ + + bytes = send(((http_t *)ptr)->fd, data, length, 0); + DEBUG_printf(("_httpWriteGNUTLS: bytes=%d", (int)bytes)); + + return (bytes); +} +#endif /* HAVE_SSL && HAVE_GNUTLS */ + + +#if defined(HAVE_SSL) && defined(HAVE_LIBSSL) +/* + * 'http_bio_ctrl()' - Control the HTTP connection. + */ + +static long /* O - Result/data */ +http_bio_ctrl(BIO *h, /* I - BIO data */ + int cmd, /* I - Control command */ + long arg1, /* I - First argument */ + void *arg2) /* I - Second argument */ +{ + switch (cmd) + { + default : + return (0); + + case BIO_CTRL_RESET : + h->ptr = NULL; + return (0); + + case BIO_C_SET_FILE_PTR : + h->ptr = arg2; + h->init = 1; + return (1); + + case BIO_C_GET_FILE_PTR : + if (arg2) + { + *((void **)arg2) = h->ptr; + return (1); + } + else + return (0); + + case BIO_CTRL_DUP : + case BIO_CTRL_FLUSH : + return (1); + } +} + + +/* + * 'http_bio_free()' - Free OpenSSL data. + */ + +static int /* O - 1 on success, 0 on failure */ +http_bio_free(BIO *h) /* I - BIO data */ +{ + if (!h) + return (0); + + if (h->shutdown) + { + h->init = 0; + h->flags = 0; + } + + return (1); +} + + +/* + * 'http_bio_new()' - Initialize an OpenSSL BIO structure. + */ + +static int /* O - 1 on success, 0 on failure */ +http_bio_new(BIO *h) /* I - BIO data */ +{ + if (!h) + return (0); + + h->init = 0; + h->num = 0; + h->ptr = NULL; + h->flags = 0; + + return (1); +} + + +/* + * 'http_bio_puts()' - Send a string for OpenSSL. + */ + +static int /* O - Bytes written */ +http_bio_puts(BIO *h, /* I - BIO data */ + const char *str) /* I - String to write */ +{ +#ifdef WIN32 + return (send(((http_t *)h->ptr)->fd, str, (int)strlen(str), 0)); +#else + return (send(((http_t *)h->ptr)->fd, str, strlen(str), 0)); +#endif /* WIN32 */ +} + + +/* + * 'http_bio_read()' - Read data for OpenSSL. + */ + +static int /* O - Bytes read */ +http_bio_read(BIO *h, /* I - BIO data */ + char *buf, /* I - Buffer */ + int size) /* I - Number of bytes to read */ +{ + http_t *http; /* HTTP connection */ + + + http = (http_t *)h->ptr; + + if (!http->blocking) + { + /* + * Make sure we have data before we read... + */ + + while (!_httpWait(http, http->wait_value, 0)) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + +#ifdef WIN32 + http->error = WSAETIMEDOUT; +#else + http->error = ETIMEDOUT; +#endif /* WIN32 */ + + return (-1); + } + } + + return (recv(http->fd, buf, size, 0)); +} + + +/* + * 'http_bio_write()' - Write data for OpenSSL. + */ + +static int /* O - Bytes written */ +http_bio_write(BIO *h, /* I - BIO data */ + const char *buf, /* I - Buffer to write */ + int num) /* I - Number of bytes to write */ +{ + return (send(((http_t *)h->ptr)->fd, buf, num, 0)); +} +#endif /* HAVE_SSL && HAVE_LIBSSL */ + + +#ifdef DEBUG +/* + * 'http_debug_hex()' - Do a hex dump of a buffer. + */ + +static void +http_debug_hex(const char *prefix, /* I - Prefix for line */ + const char *buffer, /* I - Buffer to dump */ + int bytes) /* I - Bytes to dump */ +{ + int i, j, /* Looping vars */ + ch; /* Current character */ + char line[255], /* Line buffer */ + *start, /* Start of line after prefix */ + *ptr; /* Pointer into line */ + + + if (_cups_debug_fd < 0 || _cups_debug_level < 6) + return; + + DEBUG_printf(("6%s: %d bytes:", prefix, bytes)); + + snprintf(line, sizeof(line), "6%s: ", prefix); + start = line + strlen(line); + + for (i = 0; i < bytes; i += 16) + { + for (j = 0, ptr = start; j < 16 && (i + j) < bytes; j ++, ptr += 2) + sprintf(ptr, "%02X", buffer[i + j] & 255); + + while (j < 16) + { + strcpy(ptr, " "); + ptr += 2; + j ++; + } + + strcpy(ptr, " "); + ptr += 2; + + for (j = 0; j < 16 && (i + j) < bytes; j ++) + { + ch = buffer[i + j] & 255; + + if (ch < ' ' || ch >= 127) + ch = '.'; + + *ptr++ = ch; + } + + *ptr = '\0'; + DEBUG_puts(line); + } +} +#endif /* DEBUG */ + + +/* + * 'http_field()' - Return the field index for a field name. + */ + +static http_field_t /* O - Field index */ +http_field(const char *name) /* I - String name */ +{ + int i; /* Looping var */ + + + for (i = 0; i < HTTP_FIELD_MAX; i ++) + if (_cups_strcasecmp(name, http_fields[i]) == 0) + return ((http_field_t)i); + + return (HTTP_FIELD_UNKNOWN); +} + + +#ifdef HAVE_SSL +/* + * 'http_read_ssl()' - Read from a SSL/TLS connection. + */ + +static int /* O - Bytes read */ +http_read_ssl(http_t *http, /* I - Connection to server */ + char *buf, /* I - Buffer to store data */ + int len) /* I - Length of buffer */ +{ +# if defined(HAVE_LIBSSL) + return (SSL_read((SSL *)(http->tls), buf, len)); + +# elif defined(HAVE_GNUTLS) + ssize_t result; /* Return value */ + + + result = gnutls_record_recv(http->tls, buf, len); + + if (result < 0 && !errno) + { + /* + * Convert GNU TLS error to errno value... + */ + + switch (result) + { + case GNUTLS_E_INTERRUPTED : + errno = EINTR; + break; + + case GNUTLS_E_AGAIN : + errno = EAGAIN; + break; + + default : + errno = EPIPE; + break; + } + + result = -1; + } + + return ((int)result); + +# elif defined(HAVE_CDSASSL) + int result; /* Return value */ + OSStatus error; /* Error info */ + size_t processed; /* Number of bytes processed */ + + + error = SSLRead(http->tls, buf, len, &processed); + DEBUG_printf(("6http_read_ssl: error=%d, processed=%d", (int)error, + (int)processed)); + switch (error) + { + case 0 : + result = (int)processed; + break; + + case errSSLWouldBlock : + if (processed) + result = (int)processed; + else + { + result = -1; + errno = EINTR; + } + break; + + case errSSLClosedGraceful : + default : + if (processed) + result = (int)processed; + else + { + result = -1; + errno = EPIPE; + } + break; + } + + return (result); + +# elif defined(HAVE_SSPISSL) + return _sspiRead((_sspi_struct_t*) http->tls, buf, len); +# endif /* HAVE_LIBSSL */ +} +#endif /* HAVE_SSL */ + + +/* + * 'http_send()' - Send a request with all fields and the trailing blank line. + */ + +static int /* O - 0 on success, non-zero on error */ +http_send(http_t *http, /* I - Connection to server */ + http_state_t request, /* I - Request code */ + const char *uri) /* I - URI */ +{ + int i; /* Looping var */ + char buf[1024]; /* Encoded URI buffer */ + static const char * const codes[] = + { /* Request code strings */ + NULL, + "OPTIONS", + "GET", + NULL, + "HEAD", + "POST", + NULL, + NULL, + "PUT", + NULL, + "DELETE", + "TRACE", + "CLOSE" + }; + + + DEBUG_printf(("7http_send(http=%p, request=HTTP_%s, uri=\"%s\")", + http, codes[request], uri)); + + if (http == NULL || uri == NULL) + return (-1); + + /* + * Set the User-Agent field if it isn't already... + */ + + if (!http->fields[HTTP_FIELD_USER_AGENT][0]) + httpSetField(http, HTTP_FIELD_USER_AGENT, CUPS_MINIMAL); + + /* + * Encode the URI as needed... + */ + + _httpEncodeURI(buf, uri, sizeof(buf)); + + /* + * See if we had an error the last time around; if so, reconnect... + */ + + if (http->status == HTTP_ERROR || http->status >= HTTP_BAD_REQUEST) + if (httpReconnect(http)) + return (-1); + + /* + * Flush any written data that is pending... + */ + + if (http->wused) + { + if (httpFlushWrite(http) < 0) + if (httpReconnect(http)) + return (-1); + } + + /* + * Send the request header... + */ + + http->state = request; + http->data_encoding = HTTP_ENCODE_FIELDS; + + if (request == HTTP_POST || request == HTTP_PUT) + http->state ++; + + http->status = HTTP_CONTINUE; + +#ifdef HAVE_SSL + if (http->encryption == HTTP_ENCRYPT_REQUIRED && !http->tls) + { + httpSetField(http, HTTP_FIELD_CONNECTION, "Upgrade"); + httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.0,SSL/2.0,SSL/3.0"); + } +#endif /* HAVE_SSL */ + + if (httpPrintf(http, "%s %s HTTP/1.1\r\n", codes[request], buf) < 1) + { + http->status = HTTP_ERROR; + return (-1); + } + + for (i = 0; i < HTTP_FIELD_MAX; i ++) + if (http->fields[i][0] != '\0') + { + DEBUG_printf(("9http_send: %s: %s", http_fields[i], + httpGetField(http, i))); + + if (httpPrintf(http, "%s: %s\r\n", http_fields[i], + httpGetField(http, i)) < 1) + { + http->status = HTTP_ERROR; + return (-1); + } + } + + if (http->cookie) + if (httpPrintf(http, "Cookie: $Version=0; %s\r\n", http->cookie) < 1) + { + http->status = HTTP_ERROR; + return (-1); + } + + if (http->expect == HTTP_CONTINUE && + (http->state == HTTP_POST_RECV || http->state == HTTP_PUT_RECV)) + if (httpPrintf(http, "Expect: 100-continue\r\n") < 1) + { + http->status = HTTP_ERROR; + return (-1); + } + + if (httpPrintf(http, "\r\n") < 1) + { + http->status = HTTP_ERROR; + return (-1); + } + + if (httpFlushWrite(http) < 0) + return (-1); + + httpGetLength2(http); + httpClearFields(http); + + /* + * The Kerberos and AuthRef authentication strings can only be used once... + */ + + if (http->field_authorization && http->authstring && + (!strncmp(http->authstring, "Negotiate", 9) || + !strncmp(http->authstring, "AuthRef", 7))) + { + http->_authstring[0] = '\0'; + + if (http->authstring != http->_authstring) + free(http->authstring); + + http->authstring = http->_authstring; + } + + return (0); +} + + +#ifdef HAVE_SSL +# if defined(HAVE_CDSASSL) && defined(HAVE_SECCERTIFICATECOPYDATA) +/* + * 'http_set_credentials()' - Set the SSL/TLS credentials. + */ + +static int /* O - Status of connection */ +http_set_credentials(http_t *http) /* I - Connection to server */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + OSStatus error = 0; /* Error code */ + http_tls_credentials_t credentials = NULL; + /* TLS credentials */ + + + DEBUG_printf(("7http_set_credentials(%p)", http)); + + /* + * Prefer connection specific credentials... + */ + + if ((credentials = http->tls_credentials) == NULL) + credentials = cg->tls_credentials; + +# if HAVE_SECPOLICYCREATESSL + /* + * Otherwise root around in the user's keychain to see if one can be found... + */ + + if (!credentials) + { + CFDictionaryRef query; /* Query dictionary */ + CFTypeRef matches = NULL; /* Matching credentials */ + CFArrayRef dn_array = NULL;/* Distinguished names array */ + CFTypeRef keys[] = { kSecClass, + kSecMatchLimit, + kSecReturnRef }; + /* Keys for dictionary */ + CFTypeRef values[] = { kSecClassCertificate, + kSecMatchLimitOne, + kCFBooleanTrue }; + /* Values for dictionary */ + + /* + * Get the names associated with the server. + */ + + if ((error = SSLCopyDistinguishedNames(http->tls, &dn_array)) != noErr) + { + DEBUG_printf(("4http_set_credentials: SSLCopyDistinguishedNames, error=%d", + (int)error)); + return (error); + } + + /* + * Create a query which will return all identities that can sign and match + * the passed in policy. + */ + + query = CFDictionaryCreate(NULL, + (const void**)(&keys[0]), + (const void**)(&values[0]), + sizeof(keys) / sizeof(keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (query) + { + error = SecItemCopyMatching(query, &matches); + DEBUG_printf(("4http_set_credentials: SecItemCopyMatching, error=%d", + (int)error)); + CFRelease(query); + } + + if (matches) + CFRelease(matches); + + if (dn_array) + CFRelease(dn_array); + } +# endif /* HAVE_SECPOLICYCREATESSL */ + + if (credentials) + { + error = SSLSetCertificate(http->tls, credentials); + DEBUG_printf(("4http_set_credentials: SSLSetCertificate, error=%d", + (int)error)); + } + else + DEBUG_puts("4http_set_credentials: No credentials to set."); + + return (error); +} +# endif /* HAVE_CDSASSL && HAVE_SECCERTIFICATECOPYDATA */ +#endif /* HAVE_SSL */ + + +/* + * 'http_set_timeout()' - Set the socket timeout values. + */ + +static void +http_set_timeout(int fd, /* I - File descriptor */ + double timeout) /* I - Timeout in seconds */ +{ +#ifdef WIN32 + DWORD tv = (DWORD)(timeout * 1000); + /* Timeout in milliseconds */ + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(tv)); + +#else + struct timeval tv; /* Timeout in secs and usecs */ + + tv.tv_sec = (int)timeout; + tv.tv_usec = (int)(1000000 * fmod(timeout, 1.0)); + + setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); + setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)); +#endif /* WIN32 */ +} + + +/* + * 'http_set_wait()' - Set the default wait value for reads. + */ + +static void +http_set_wait(http_t *http) /* I - Connection to server */ +{ + if (http->blocking) + { + http->wait_value = (int)(http->timeout_value * 1000); + + if (http->wait_value <= 0) + http->wait_value = 60000; + } + else + http->wait_value = 10000; +} + + +#ifdef HAVE_SSL +/* + * 'http_setup_ssl()' - Set up SSL/TLS support on a connection. + */ + +static int /* O - 0 on success, -1 on failure */ +http_setup_ssl(http_t *http) /* I - Connection to server */ +{ + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + int any_root; /* Allow any root */ + char hostname[256], /* Hostname */ + *hostptr; /* Pointer into hostname */ + +# ifdef HAVE_LIBSSL + SSL_CTX *context; /* Context for encryption */ + BIO *bio; /* BIO data */ + const char *message = NULL;/* Error message */ +# elif defined(HAVE_GNUTLS) + int status; /* Status of handshake */ + gnutls_certificate_client_credentials *credentials; + /* TLS credentials */ +# elif defined(HAVE_CDSASSL) + OSStatus error; /* Error code */ + const char *message = NULL;/* Error message */ +# ifdef HAVE_SECCERTIFICATECOPYDATA + cups_array_t *credentials; /* Credentials array */ + cups_array_t *names; /* CUPS distinguished names */ + CFArrayRef dn_array; /* CF distinguished names array */ + CFIndex count; /* Number of credentials */ + CFDataRef data; /* Certificate data */ + int i; /* Looping var */ + http_credential_t *credential; /* Credential data */ +# endif /* HAVE_SECCERTIFICATECOPYDATA */ +# elif defined(HAVE_SSPISSL) + TCHAR username[256]; /* Username returned from GetUserName() */ + TCHAR commonName[256];/* Common name for certificate */ + DWORD dwSize; /* 32 bit size */ +# endif /* HAVE_LIBSSL */ + + + DEBUG_printf(("7http_setup_ssl(http=%p)", http)); + + /* + * Always allow self-signed certificates for the local loopback address... + */ + + if (httpAddrLocalhost(http->hostaddr)) + { + any_root = 1; + strlcpy(hostname, "localhost", sizeof(hostname)); + } + else + { + /* + * Otherwise use the system-wide setting and make sure the hostname we have + * does not end in a trailing dot. + */ + + any_root = cg->any_root; + + strlcpy(hostname, http->hostname, sizeof(hostname)); + if ((hostptr = hostname + strlen(hostname) - 1) >= hostname && + *hostptr == '.') + *hostptr = '\0'; + } + +# ifdef HAVE_LIBSSL + (void)any_root; + + context = SSL_CTX_new(SSLv23_client_method()); + + SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */ + + bio = BIO_new(_httpBIOMethods()); + BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)http); + + http->tls = SSL_new(context); + SSL_set_bio(http->tls, bio, bio); + +# ifdef HAVE_SSL_SET_TLSEXT_HOST_NAME + SSL_set_tlsext_host_name(http->tls, hostname); +# endif /* HAVE_SSL_SET_TLSEXT_HOST_NAME */ + + if (SSL_connect(http->tls) != 1) + { + unsigned long error; /* Error code */ + + while ((error = ERR_get_error()) != 0) + { + message = ERR_error_string(error, NULL); + DEBUG_printf(("8http_setup_ssl: %s", message)); + } + + SSL_CTX_free(context); + SSL_free(http->tls); + http->tls = NULL; + +# ifdef WIN32 + http->error = WSAGetLastError(); +# else + http->error = errno; +# endif /* WIN32 */ + http->status = HTTP_ERROR; + + if (!message) + message = _("Unable to establish a secure connection to host."); + + _cupsSetError(IPP_PKI_ERROR, message, 1); + + return (-1); + } + +# elif defined(HAVE_GNUTLS) + (void)any_root; + + credentials = (gnutls_certificate_client_credentials *) + malloc(sizeof(gnutls_certificate_client_credentials)); + if (credentials == NULL) + { + DEBUG_printf(("8http_setup_ssl: Unable to allocate credentials: %s", + strerror(errno))); + http->error = errno; + http->status = HTTP_ERROR; + _cupsSetHTTPError(HTTP_ERROR); + + return (-1); + } + + gnutls_certificate_allocate_credentials(credentials); + + gnutls_init(&http->tls, GNUTLS_CLIENT); + gnutls_set_default_priority(http->tls); + gnutls_server_name_set(http->tls, GNUTLS_NAME_DNS, hostname, + strlen(hostname)); + gnutls_credentials_set(http->tls, GNUTLS_CRD_CERTIFICATE, *credentials); + gnutls_transport_set_ptr(http->tls, (gnutls_transport_ptr)http); + gnutls_transport_set_pull_function(http->tls, _httpReadGNUTLS); + gnutls_transport_set_push_function(http->tls, _httpWriteGNUTLS); + + while ((status = gnutls_handshake(http->tls)) != GNUTLS_E_SUCCESS) + { + DEBUG_printf(("8http_setup_ssl: gnutls_handshake returned %d (%s)", + status, gnutls_strerror(status))); + + if (gnutls_error_is_fatal(status)) + { + http->error = EIO; + http->status = HTTP_ERROR; + + _cupsSetError(IPP_PKI_ERROR, gnutls_strerror(status), 0); + + gnutls_deinit(http->tls); + gnutls_certificate_free_credentials(*credentials); + free(credentials); + http->tls = NULL; + + return (-1); + } + } + + http->tls_credentials = credentials; + +# elif defined(HAVE_CDSASSL) + if ((error = SSLNewContext(false, &http->tls))) + { + http->error = errno; + http->status = HTTP_ERROR; + _cupsSetHTTPError(HTTP_ERROR); + + return (-1); + } + + error = SSLSetConnection(http->tls, http); + DEBUG_printf(("4http_setup_ssl: SSLSetConnection, error=%d", (int)error)); + + if (!error) + { + error = SSLSetIOFuncs(http->tls, _httpReadCDSA, _httpWriteCDSA); + DEBUG_printf(("4http_setup_ssl: SSLSetIOFuncs, error=%d", (int)error)); + } + + if (!error) + { + error = SSLSetAllowsAnyRoot(http->tls, any_root); + DEBUG_printf(("4http_setup_ssl: SSLSetAllowsAnyRoot(%d), error=%d", + any_root, (int)error)); + } + + if (!error) + { + error = SSLSetAllowsExpiredCerts(http->tls, cg->expired_certs); + DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredCerts(%d), error=%d", + cg->expired_certs, (int)error)); + } + + if (!error) + { + error = SSLSetAllowsExpiredRoots(http->tls, cg->expired_root); + DEBUG_printf(("4http_setup_ssl: SSLSetAllowsExpiredRoots(%d), error=%d", + cg->expired_root, (int)error)); + } + + /* + * In general, don't verify certificates since things like the common name + * often do not match... + */ + + if (!error) + { + error = SSLSetEnableCertVerify(http->tls, false); + DEBUG_printf(("4http_setup_ssl: SSLSetEnableCertVerify, error=%d", + (int)error)); + } + +# ifdef HAVE_SECCERTIFICATECOPYDATA + if (!error) + { + if (cg->client_cert_cb) + { + error = SSLSetSessionOption(http->tls, + kSSLSessionOptionBreakOnCertRequested, true); + DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnCertRequested, " + "error=%d", (int)error)); + } + else + { + error = http_set_credentials(http); + DEBUG_printf(("4http_setup_ssl: http_set_credentials, error=%d", + (int)error)); + } + } + + /* + * If there's a server certificate callback installed let it evaluate the + * certificate(s) during the handshake... + */ + + if (!error && cg->server_cert_cb != NULL) + { + error = SSLSetSessionOption(http->tls, + kSSLSessionOptionBreakOnServerAuth, true); + DEBUG_printf(("4http_setup_ssl: kSSLSessionOptionBreakOnServerAuth, " + "error=%d", (int)error)); + } +# endif /* HAVE_SECCERTIFICATECOPYDATA */ + + /* + * Let the server know which hostname/domain we are trying to connect to + * in case it wants to serve up a certificate with a matching common name. + */ + + if (!error) + { + error = SSLSetPeerDomainName(http->tls, hostname, strlen(hostname)); + + DEBUG_printf(("4http_setup_ssl: SSLSetPeerDomainName, error=%d", + (int)error)); + } + + if (!error) + { + int done = 0; /* Are we done yet? */ + + while (!error && !done) + { + error = SSLHandshake(http->tls); + + DEBUG_printf(("4http_setup_ssl: SSLHandshake returned %d.", (int)error)); + + switch (error) + { + case noErr : + done = 1; + break; + + case errSSLWouldBlock : + error = noErr; /* Force a retry */ + usleep(1000); /* in 1 millisecond */ + break; + +# ifdef HAVE_SECCERTIFICATECOPYDATA + case errSSLServerAuthCompleted : + error = 0; + if (cg->server_cert_cb) + { + error = httpCopyCredentials(http, &credentials); + if (!error) + { + error = (cg->server_cert_cb)(http, http->tls, credentials, + cg->server_cert_data); + httpFreeCredentials(credentials); + } + + DEBUG_printf(("4http_setup_ssl: Server certificate callback " + "returned %d.", (int)error)); + } + break; + + case errSSLClientCertRequested : + error = 0; + + if (cg->client_cert_cb) + { + names = NULL; + if (!(error = SSLCopyDistinguishedNames(http->tls, &dn_array)) && + dn_array) + { + if ((names = cupsArrayNew(NULL, NULL)) != NULL) + { + for (i = 0, count = CFArrayGetCount(dn_array); i < count; i++) + { + data = (CFDataRef)CFArrayGetValueAtIndex(dn_array, i); + + if ((credential = malloc(sizeof(*credential))) != NULL) + { + credential->datalen = CFDataGetLength(data); + if ((credential->data = malloc(credential->datalen))) + { + memcpy((void *)credential->data, CFDataGetBytePtr(data), + credential->datalen); + cupsArrayAdd(names, credential); + } + } + } + } + + CFRelease(dn_array); + } + + if (!error) + { + error = (cg->client_cert_cb)(http, http->tls, names, + cg->client_cert_data); + + DEBUG_printf(("4http_setup_ssl: Client certificate callback " + "returned %d.", (int)error)); + } + + httpFreeCredentials(names); + } + break; +# endif /* HAVE_SECCERTIFICATECOPYDATA */ + + case errSSLUnknownRootCert : + message = _("Unable to establish a secure connection to host " + "(untrusted certificate)."); + break; + + case errSSLNoRootCert : + message = _("Unable to establish a secure connection to host " + "(self-signed certificate)."); + break; + + case errSSLCertExpired : + message = _("Unable to establish a secure connection to host " + "(expired certificate)."); + break; + + case errSSLCertNotYetValid : + message = _("Unable to establish a secure connection to host " + "(certificate not yet valid)."); + break; + + case errSSLHostNameMismatch : + message = _("Unable to establish a secure connection to host " + "(host name mismatch)."); + break; + + case errSSLXCertChainInvalid : + message = _("Unable to establish a secure connection to host " + "(certificate chain invalid)."); + break; + + case errSSLConnectionRefused : + message = _("Unable to establish a secure connection to host " + "(peer dropped connection before responding)."); + break; + + default : + break; + } + } + } + + if (error) + { + http->error = error; + http->status = HTTP_ERROR; + errno = ECONNREFUSED; + + SSLDisposeContext(http->tls); + http->tls = NULL; + + /* + * If an error string wasn't set by the callbacks use a generic one... + */ + + if (!message) +#ifdef HAVE_CSSMERRORSTRING + message = cssmErrorString(error); +#else + message = _("Unable to establish a secure connection to host."); +#endif /* HAVE_CSSMERRORSTRING */ + + _cupsSetError(IPP_PKI_ERROR, message, 1); + + return (-1); + } + +# elif defined(HAVE_SSPISSL) + http->tls = _sspiAlloc(); + + if (!http->tls) + { + _cupsSetHTTPError(HTTP_ERROR); + return (-1); + } + + http->tls->sock = http->fd; + dwSize = sizeof(username) / sizeof(TCHAR); + GetUserName(username, &dwSize); + _sntprintf_s(commonName, sizeof(commonName) / sizeof(TCHAR), + sizeof(commonName) / sizeof(TCHAR), TEXT("CN=%s"), username); + + if (!_sspiGetCredentials(http->tls_credentials, L"ClientContainer", + commonName, FALSE)) + { + _sspiFree(http->tls_credentials); + http->tls_credentials = NULL; + + http->error = EIO; + http->status = HTTP_ERROR; + + _cupsSetError(IPP_PKI_ERROR, + _("Unable to establish a secure connection to host."), 1); + + return (-1); + } + + _sspiSetAllowsAnyRoot(http->tls_credentials, any_root); + _sspiSetAllowsExpiredCerts(http->tls_credentials, TRUE); + + if (!_sspiConnect(http->tls_credentials, hostname)) + { + _sspiFree(http->tls_credentials); + http->tls_credentials = NULL; + + http->error = EIO; + http->status = HTTP_ERROR; + + _cupsSetError(IPP_PKI_ERROR, + _("Unable to establish a secure connection to host."), 1); + + return (-1); + } +# endif /* HAVE_CDSASSL */ + + return (0); +} + + +/* + * 'http_shutdown_ssl()' - Shut down SSL/TLS on a connection. + */ + +static void +http_shutdown_ssl(http_t *http) /* I - Connection to server */ +{ +# ifdef HAVE_LIBSSL + SSL_CTX *context; /* Context for encryption */ + + context = SSL_get_SSL_CTX(http->tls); + + SSL_shutdown(http->tls); + SSL_CTX_free(context); + SSL_free(http->tls); + +# elif defined(HAVE_GNUTLS) + gnutls_certificate_client_credentials *credentials; + /* TLS credentials */ + + credentials = (gnutls_certificate_client_credentials *)(http->tls_credentials); + + gnutls_bye(http->tls, GNUTLS_SHUT_RDWR); + gnutls_deinit(http->tls); + gnutls_certificate_free_credentials(*credentials); + free(credentials); + +# elif defined(HAVE_CDSASSL) + while (SSLClose(http->tls) == errSSLWouldBlock) + usleep(1000); + + SSLDisposeContext(http->tls); + + if (http->tls_credentials) + CFRelease(http->tls_credentials); + +# elif defined(HAVE_SSPISSL) + _sspiFree(http->tls_credentials); +# endif /* HAVE_LIBSSL */ + + http->tls = NULL; + http->tls_credentials = NULL; +} +#endif /* HAVE_SSL */ + + +#ifdef HAVE_SSL +/* + * 'http_upgrade()' - Force upgrade to TLS encryption. + */ + +static int /* O - Status of connection */ +http_upgrade(http_t *http) /* I - Connection to server */ +{ + int ret; /* Return value */ + http_t myhttp; /* Local copy of HTTP data */ + + + DEBUG_printf(("7http_upgrade(%p)", http)); + + /* + * Flush the connection to make sure any previous "Upgrade" message + * has been read. + */ + + httpFlush(http); + + /* + * Copy the HTTP data to a local variable so we can do the OPTIONS + * request without interfering with the existing request data... + */ + + memcpy(&myhttp, http, sizeof(myhttp)); + + /* + * Send an OPTIONS request to the server, requiring SSL or TLS + * encryption on the link... + */ + + http->field_authorization = NULL; /* Don't free the auth string */ + + httpClearFields(http); + httpSetField(http, HTTP_FIELD_CONNECTION, "upgrade"); + httpSetField(http, HTTP_FIELD_UPGRADE, "TLS/1.2, TLS/1.1, TLS/1.0, SSL/3.0"); + + if ((ret = httpOptions(http, "*")) == 0) + { + /* + * Wait for the secure connection... + */ + + while (httpUpdate(http) == HTTP_CONTINUE); + } + + /* + * Restore the HTTP request data... + */ + + memcpy(http->fields, myhttp.fields, sizeof(http->fields)); + http->data_encoding = myhttp.data_encoding; + http->data_remaining = myhttp.data_remaining; + http->_data_remaining = myhttp._data_remaining; + http->expect = myhttp.expect; + http->field_authorization = myhttp.field_authorization; + http->digest_tries = myhttp.digest_tries; + + /* + * See if we actually went secure... + */ + + if (!http->tls) + { + /* + * Server does not support HTTP upgrade... + */ + + DEBUG_puts("8http_upgrade: Server does not support HTTP upgrade!"); + +# ifdef WIN32 + closesocket(http->fd); +# else + close(http->fd); +# endif + + http->fd = -1; + + return (-1); + } + else + return (ret); +} +#endif /* HAVE_SSL */ + + +/* + * 'http_write()' - Write a buffer to a HTTP connection. + */ + +static int /* O - Number of bytes written */ +http_write(http_t *http, /* I - Connection to server */ + const char *buffer, /* I - Buffer for data */ + int length) /* I - Number of bytes to write */ +{ + int tbytes, /* Total bytes sent */ + bytes; /* Bytes sent */ + + + DEBUG_printf(("2http_write(http=%p, buffer=%p, length=%d)", http, buffer, + length)); + http->error = 0; + tbytes = 0; + + while (length > 0) + { + if (http->timeout_cb) + { +#ifdef HAVE_POLL + struct pollfd pfd; /* Polled file descriptor */ +#else + fd_set output_set; /* Output ready for write? */ + struct timeval timeout; /* Timeout value */ +#endif /* HAVE_POLL */ + int nfds; /* Result from select()/poll() */ + + do + { +#ifdef HAVE_POLL + pfd.fd = http->fd; + pfd.events = POLLOUT; + + while ((nfds = poll(&pfd, 1, http->wait_value)) < 0 && + (errno == EINTR || errno == EAGAIN)) + /* do nothing */; + +#else + do + { + FD_ZERO(&output_set); + FD_SET(http->fd, &output_set); + + timeout.tv_sec = http->wait_value / 1000; + timeout.tv_usec = 1000 * (http->wait_value % 1000); + + nfds = select(http->fd + 1, NULL, &output_set, NULL, &timeout); + } +# ifdef WIN32 + while (nfds < 0 && (WSAGetLastError() == WSAEINTR || + WSAGetLastError() == WSAEWOULDBLOCK)); +# else + while (nfds < 0 && (errno == EINTR || errno == EAGAIN)); +# endif /* WIN32 */ +#endif /* HAVE_POLL */ + + if (nfds < 0) + { + http->error = errno; + return (-1); + } + else if (nfds == 0 && !(*http->timeout_cb)(http, http->timeout_data)) + { +#ifdef WIN32 + http->error = WSAEWOULDBLOCK; +#else + http->error = EWOULDBLOCK; +#endif /* WIN32 */ + return (-1); + } + } + while (nfds <= 0); + } + +#ifdef HAVE_SSL + if (http->tls) + bytes = http_write_ssl(http, buffer, length); + else +#endif /* HAVE_SSL */ + bytes = send(http->fd, buffer, length, 0); + + if (bytes < 0) + { +#ifdef WIN32 + if (WSAGetLastError() == WSAEINTR) + continue; + else if (WSAGetLastError() == WSAEWOULDBLOCK) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + + http->error = WSAGetLastError(); + } + else if (WSAGetLastError() != http->error && + WSAGetLastError() != WSAECONNRESET) + { + http->error = WSAGetLastError(); + continue; + } + +#else + if (errno == EINTR) + continue; + else if (errno == EWOULDBLOCK || errno == EAGAIN) + { + if (http->timeout_cb && (*http->timeout_cb)(http, http->timeout_data)) + continue; + else if (!http->timeout_cb && errno == EAGAIN) + continue; + + http->error = errno; + } + else if (errno != http->error && errno != ECONNRESET) + { + http->error = errno; + continue; + } +#endif /* WIN32 */ + + DEBUG_printf(("3http_write: error writing data (%s).", + strerror(http->error))); + + return (-1); + } + + buffer += bytes; + tbytes += bytes; + length -= bytes; + } + +#ifdef DEBUG + http_debug_hex("http_write", buffer - tbytes, tbytes); +#endif /* DEBUG */ + + DEBUG_printf(("3http_write: Returning %d.", tbytes)); + + return (tbytes); +} + + +/* + * 'http_write_chunk()' - Write a chunked buffer. + */ + +static int /* O - Number bytes written */ +http_write_chunk(http_t *http, /* I - Connection to server */ + const char *buffer, /* I - Buffer to write */ + int length) /* I - Length of buffer */ +{ + char header[255]; /* Chunk header */ + int bytes; /* Bytes written */ + + + DEBUG_printf(("7http_write_chunk(http=%p, buffer=%p, length=%d)", + http, buffer, length)); + + /* + * Write the chunk header, data, and trailer. + */ + + sprintf(header, "%x\r\n", length); + if (http_write(http, header, (int)strlen(header)) < 0) + { + DEBUG_puts("8http_write_chunk: http_write of length failed!"); + return (-1); + } + + if ((bytes = http_write(http, buffer, length)) < 0) + { + DEBUG_puts("8http_write_chunk: http_write of buffer failed!"); + return (-1); + } + + if (http_write(http, "\r\n", 2) < 0) + { + DEBUG_puts("8http_write_chunk: http_write of CR LF failed!"); + return (-1); + } + + return (bytes); +} + + +#ifdef HAVE_SSL +/* + * 'http_write_ssl()' - Write to a SSL/TLS connection. + */ + +static int /* O - Bytes written */ +http_write_ssl(http_t *http, /* I - Connection to server */ + const char *buf, /* I - Buffer holding data */ + int len) /* I - Length of buffer */ +{ + ssize_t result; /* Return value */ + + + DEBUG_printf(("2http_write_ssl(http=%p, buf=%p, len=%d)", http, buf, len)); + +# if defined(HAVE_LIBSSL) + result = SSL_write((SSL *)(http->tls), buf, len); + +# elif defined(HAVE_GNUTLS) + result = gnutls_record_send(http->tls, buf, len); + + if (result < 0 && !errno) + { + /* + * Convert GNU TLS error to errno value... + */ + + switch (result) + { + case GNUTLS_E_INTERRUPTED : + errno = EINTR; + break; + + case GNUTLS_E_AGAIN : + errno = EAGAIN; + break; + + default : + errno = EPIPE; + break; + } + + result = -1; + } + +# elif defined(HAVE_CDSASSL) + OSStatus error; /* Error info */ + size_t processed; /* Number of bytes processed */ + + + error = SSLWrite(http->tls, buf, len, &processed); + + switch (error) + { + case 0 : + result = (int)processed; + break; + + case errSSLWouldBlock : + if (processed) + result = (int)processed; + else + { + result = -1; + errno = EINTR; + } + break; + + case errSSLClosedGraceful : + default : + if (processed) + result = (int)processed; + else + { + result = -1; + errno = EPIPE; + } + break; + } +# elif defined(HAVE_SSPISSL) + return _sspiWrite((_sspi_struct_t *)http->tls, (void *)buf, len); +# endif /* HAVE_LIBSSL */ + + DEBUG_printf(("3http_write_ssl: Returning %d.", (int)result)); + + return ((int)result); +} +#endif /* HAVE_SSL */ + + +/* + * End of "$Id: http.c 10450 2012-05-04 22:52:56Z mike $". + */ diff --git a/cups/http.h b/cups/http.h new file mode 100644 index 0000000..d24f9e6 --- /dev/null +++ b/cups/http.h @@ -0,0 +1,479 @@ +/* + * "$Id: http.h 9801 2011-05-21 04:02:41Z mike $" + * + * Hyper-Text Transport Protocol definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_HTTP_H_ +# define _CUPS_HTTP_H_ + +/* + * Include necessary headers... + */ + +# include "versioning.h" +# include "array.h" +# include +# include +# include +# ifdef WIN32 +# ifndef __CUPS_SSIZE_T_DEFINED +# define __CUPS_SSIZE_T_DEFINED +/* Windows does not support the ssize_t type, so map it to off_t... */ +typedef off_t ssize_t; /* @private@ */ +# endif /* !__CUPS_SSIZE_T_DEFINED */ +# include +# include +# else +# ifdef __sgi +# define INET6 /* IRIX IPv6 support... */ +# endif /* __sgi */ +# include +# include +# include +# include +# include +# include +# include +# include +# if !defined(__APPLE__) || !defined(TCP_NODELAY) +# include +# endif /* !__APPLE__ || !TCP_NODELAY */ +# if defined(AF_UNIX) && !defined(AF_LOCAL) +# define AF_LOCAL AF_UNIX /* Older UNIX's have old names... */ +# endif /* AF_UNIX && !AF_LOCAL */ +# ifdef AF_LOCAL +# include +# endif /* AF_LOCAL */ +# if defined(LOCAL_PEERCRED) && !defined(SO_PEERCRED) +# define SO_PEERCRED LOCAL_PEERCRED +# endif /* LOCAL_PEERCRED && !SO_PEERCRED */ +# endif /* WIN32 */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Oh, the wonderful world of IPv6 compatibility. Apparently some + * implementations expose the (more logical) 32-bit address parts + * to everyone, while others only expose it to kernel code... To + * make supporting IPv6 even easier, each vendor chose different + * core structure and union names, so the same defines or code + * can't be used on all platforms. + * + * The following will likely need tweaking on new platforms that + * support IPv6 - the "s6_addr32" define maps to the 32-bit integer + * array in the in6_addr union, which is named differently on various + * platforms. + */ + +#if defined(AF_INET6) && !defined(s6_addr32) +# if defined(__sun) +# define s6_addr32 _S6_un._S6_u32 +# elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__)|| defined(__DragonFly__) +# define s6_addr32 __u6_addr.__u6_addr32 +# elif defined(__osf__) +# define s6_addr32 s6_un.sa6_laddr +# elif defined(WIN32) +/* + * Windows only defines byte and 16-bit word members of the union and + * requires special casing of all raw address code... + */ +# define s6_addr32 error_need_win32_specific_code +# endif /* __sun */ +#endif /* AF_INET6 && !s6_addr32 */ + + +/* + * Limits... + */ + +# define HTTP_MAX_URI 1024 /* Max length of URI string */ +# define HTTP_MAX_HOST 256 /* Max length of hostname string */ +# define HTTP_MAX_BUFFER 2048 /* Max length of data buffer */ +# define HTTP_MAX_VALUE 256 /* Max header field value length */ + + +/* + * Types and structures... + */ + +typedef enum http_auth_e /**** HTTP authentication types ****/ +{ + HTTP_AUTH_NONE, /* No authentication in use */ + HTTP_AUTH_BASIC, /* Basic authentication in use */ + HTTP_AUTH_MD5, /* Digest authentication in use */ + HTTP_AUTH_MD5_SESS, /* MD5-session authentication in use */ + HTTP_AUTH_MD5_INT, /* Digest authentication in use for body */ + HTTP_AUTH_MD5_SESS_INT, /* MD5-session authentication in use for body */ + HTTP_AUTH_NEGOTIATE /* GSSAPI authentication in use @since CUPS 1.3/Mac OS X 10.5@ */ +} http_auth_t; + +typedef enum http_encoding_e /**** HTTP transfer encoding values ****/ +{ + HTTP_ENCODE_LENGTH, /* Data is sent with Content-Length */ + HTTP_ENCODE_CHUNKED, /* Data is chunked */ + HTTP_ENCODE_FIELDS /* Sending HTTP fields */ +} http_encoding_t; + +typedef enum http_encryption_e /**** HTTP encryption values ****/ +{ + HTTP_ENCRYPT_IF_REQUESTED, /* Encrypt if requested (TLS upgrade) */ + HTTP_ENCRYPT_NEVER, /* Never encrypt */ + HTTP_ENCRYPT_REQUIRED, /* Encryption is required (TLS upgrade) */ + HTTP_ENCRYPT_ALWAYS /* Always encrypt (SSL) */ +} http_encryption_t; + +typedef enum http_field_e /**** HTTP field names ****/ +{ + HTTP_FIELD_UNKNOWN = -1, /* Unknown field */ + HTTP_FIELD_ACCEPT_LANGUAGE, /* Accept-Language field */ + HTTP_FIELD_ACCEPT_RANGES, /* Accept-Ranges field */ + HTTP_FIELD_AUTHORIZATION, /* Authorization field */ + HTTP_FIELD_CONNECTION, /* Connection field */ + HTTP_FIELD_CONTENT_ENCODING, /* Content-Encoding field */ + HTTP_FIELD_CONTENT_LANGUAGE, /* Content-Language field */ + HTTP_FIELD_CONTENT_LENGTH, /* Content-Length field */ + HTTP_FIELD_CONTENT_LOCATION, /* Content-Location field */ + HTTP_FIELD_CONTENT_MD5, /* Content-MD5 field */ + HTTP_FIELD_CONTENT_RANGE, /* Content-Range field */ + HTTP_FIELD_CONTENT_TYPE, /* Content-Type field */ + HTTP_FIELD_CONTENT_VERSION, /* Content-Version field */ + HTTP_FIELD_DATE, /* Date field */ + HTTP_FIELD_HOST, /* Host field */ + HTTP_FIELD_IF_MODIFIED_SINCE, /* If-Modified-Since field */ + HTTP_FIELD_IF_UNMODIFIED_SINCE, /* If-Unmodified-Since field */ + HTTP_FIELD_KEEP_ALIVE, /* Keep-Alive field */ + HTTP_FIELD_LAST_MODIFIED, /* Last-Modified field */ + HTTP_FIELD_LINK, /* Link field */ + HTTP_FIELD_LOCATION, /* Location field */ + HTTP_FIELD_RANGE, /* Range field */ + HTTP_FIELD_REFERER, /* Referer field */ + HTTP_FIELD_RETRY_AFTER, /* Retry-After field */ + HTTP_FIELD_TRANSFER_ENCODING, /* Transfer-Encoding field */ + HTTP_FIELD_UPGRADE, /* Upgrade field */ + HTTP_FIELD_USER_AGENT, /* User-Agent field */ + HTTP_FIELD_WWW_AUTHENTICATE, /* WWW-Authenticate field */ + HTTP_FIELD_MAX /* Maximum field index */ +} http_field_t; + +typedef enum http_keepalive_e /**** HTTP keep-alive values ****/ +{ + HTTP_KEEPALIVE_OFF = 0, /* No keep alive support */ + HTTP_KEEPALIVE_ON /* Use keep alive */ +} http_keepalive_t; + +typedef enum http_state_e /**** HTTP state values; states + **** are server-oriented... + ****/ +{ + HTTP_WAITING, /* Waiting for command */ + HTTP_OPTIONS, /* OPTIONS command, waiting for blank line */ + HTTP_GET, /* GET command, waiting for blank line */ + HTTP_GET_SEND, /* GET command, sending data */ + HTTP_HEAD, /* HEAD command, waiting for blank line */ + HTTP_POST, /* POST command, waiting for blank line */ + HTTP_POST_RECV, /* POST command, receiving data */ + HTTP_POST_SEND, /* POST command, sending data */ + HTTP_PUT, /* PUT command, waiting for blank line */ + HTTP_PUT_RECV, /* PUT command, receiving data */ + HTTP_DELETE, /* DELETE command, waiting for blank line */ + HTTP_TRACE, /* TRACE command, waiting for blank line */ + HTTP_CLOSE, /* CLOSE command, waiting for blank line */ + HTTP_STATUS /* Command complete, sending status */ +} http_state_t; + +typedef enum http_status_e /**** HTTP status codes ****/ +{ + HTTP_ERROR = -1, /* An error response from httpXxxx() */ + + HTTP_CONTINUE = 100, /* Everything OK, keep going... */ + HTTP_SWITCHING_PROTOCOLS, /* HTTP upgrade to TLS/SSL */ + + HTTP_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */ + HTTP_CREATED, /* PUT command was successful */ + HTTP_ACCEPTED, /* DELETE command was successful */ + HTTP_NOT_AUTHORITATIVE, /* Information isn't authoritative */ + HTTP_NO_CONTENT, /* Successful command, no new data */ + HTTP_RESET_CONTENT, /* Content was reset/recreated */ + HTTP_PARTIAL_CONTENT, /* Only a partial file was recieved/sent */ + + HTTP_MULTIPLE_CHOICES = 300, /* Multiple files match request */ + HTTP_MOVED_PERMANENTLY, /* Document has moved permanently */ + HTTP_MOVED_TEMPORARILY, /* Document has moved temporarily */ + HTTP_SEE_OTHER, /* See this other link... */ + HTTP_NOT_MODIFIED, /* File not modified */ + HTTP_USE_PROXY, /* Must use a proxy to access this URI */ + + HTTP_BAD_REQUEST = 400, /* Bad request */ + HTTP_UNAUTHORIZED, /* Unauthorized to access host */ + HTTP_PAYMENT_REQUIRED, /* Payment required */ + HTTP_FORBIDDEN, /* Forbidden to access this URI */ + HTTP_NOT_FOUND, /* URI was not found */ + HTTP_METHOD_NOT_ALLOWED, /* Method is not allowed */ + HTTP_NOT_ACCEPTABLE, /* Not Acceptable */ + HTTP_PROXY_AUTHENTICATION, /* Proxy Authentication is Required */ + HTTP_REQUEST_TIMEOUT, /* Request timed out */ + HTTP_CONFLICT, /* Request is self-conflicting */ + HTTP_GONE, /* Server has gone away */ + HTTP_LENGTH_REQUIRED, /* A content length or encoding is required */ + HTTP_PRECONDITION, /* Precondition failed */ + HTTP_REQUEST_TOO_LARGE, /* Request entity too large */ + HTTP_URI_TOO_LONG, /* URI too long */ + HTTP_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */ + HTTP_REQUESTED_RANGE, /* The requested range is not satisfiable */ + HTTP_EXPECTATION_FAILED, /* The expectation given in an Expect header field was not met */ + HTTP_UPGRADE_REQUIRED = 426, /* Upgrade to SSL/TLS required */ + + HTTP_SERVER_ERROR = 500, /* Internal server error */ + HTTP_NOT_IMPLEMENTED, /* Feature not implemented */ + HTTP_BAD_GATEWAY, /* Bad gateway */ + HTTP_SERVICE_UNAVAILABLE, /* Service is unavailable */ + HTTP_GATEWAY_TIMEOUT, /* Gateway connection timed out */ + HTTP_NOT_SUPPORTED, /* HTTP version not supported */ + + HTTP_AUTHORIZATION_CANCELED = 1000, /* User canceled authorization @since CUPS 1.4@ */ + HTTP_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/Mac OS X 10.7@ */ + HTTP_WEBIF_DISABLED /* Web interface is disabled @private@ */ +} http_status_t; + +typedef enum http_uri_status_e /**** URI separation status @since CUPS 1.2@ ****/ +{ + HTTP_URI_OVERFLOW = -8, /* URI buffer for httpAssembleURI is too small */ + HTTP_URI_BAD_ARGUMENTS = -7, /* Bad arguments to function (error) */ + HTTP_URI_BAD_RESOURCE = -6, /* Bad resource in URI (error) */ + HTTP_URI_BAD_PORT = -5, /* Bad port number in URI (error) */ + HTTP_URI_BAD_HOSTNAME = -4, /* Bad hostname in URI (error) */ + HTTP_URI_BAD_USERNAME = -3, /* Bad username in URI (error) */ + HTTP_URI_BAD_SCHEME = -2, /* Bad scheme in URI (error) */ + HTTP_URI_BAD_URI = -1, /* Bad/empty URI (error) */ + HTTP_URI_OK = 0, /* URI decoded OK */ + HTTP_URI_MISSING_SCHEME, /* Missing scheme in URI (warning) */ + HTTP_URI_UNKNOWN_SCHEME, /* Unknown scheme in URI (warning) */ + HTTP_URI_MISSING_RESOURCE /* Missing resource in URI (warning) */ +} http_uri_status_t; + +typedef enum http_uri_coding_e /**** URI en/decode flags ****/ +{ + HTTP_URI_CODING_NONE = 0, /* Don't en/decode anything */ + HTTP_URI_CODING_USERNAME = 1, /* En/decode the username portion */ + HTTP_URI_CODING_HOSTNAME = 2, /* En/decode the hostname portion */ + HTTP_URI_CODING_RESOURCE = 4, /* En/decode the resource portion */ + HTTP_URI_CODING_MOST = 7, /* En/decode all but the query */ + HTTP_URI_CODING_QUERY = 8, /* En/decode the query portion */ + HTTP_URI_CODING_ALL = 15 /* En/decode everything */ +} http_uri_coding_t; + +typedef enum http_version_e /**** HTTP version numbers ****/ +{ + HTTP_0_9 = 9, /* HTTP/0.9 */ + HTTP_1_0 = 100, /* HTTP/1.0 */ + HTTP_1_1 = 101 /* HTTP/1.1 */ +} http_version_t; + +typedef union _http_addr_u /**** Socket address union, which + **** makes using IPv6 and other + **** address types easier and + **** more portable. @since CUPS 1.2/Mac OS X 10.5@ + ****/ +{ + struct sockaddr addr; /* Base structure for family value */ + struct sockaddr_in ipv4; /* IPv4 address */ +#ifdef AF_INET6 + struct sockaddr_in6 ipv6; /* IPv6 address */ +#endif /* AF_INET6 */ +#ifdef AF_LOCAL + struct sockaddr_un un; /* Domain socket file */ +#endif /* AF_LOCAL */ + char pad[256]; /* Padding to ensure binary compatibility */ +} http_addr_t; + +typedef struct http_addrlist_s /**** Socket address list, which is + **** used to enumerate all of the + **** addresses that are associated + **** with a hostname. @since CUPS 1.2/Mac OS X 10.5@ + ****/ +{ + struct http_addrlist_s *next; /* Pointer to next address in list */ + http_addr_t addr; /* Address */ +} http_addrlist_t; + +typedef struct _http_s http_t; /**** HTTP connection type ****/ + +typedef struct http_credential_s /**** HTTP credential data @since CUPS 1.5/Mac OS X 10.7@ ****/ +{ + void *data; /* Pointer to credential data */ + size_t datalen; /* Credential length */ +} http_credential_t; + +typedef int (*http_timeout_cb_t)(http_t *http, void *user_data); + /**** HTTP timeout callback @since CUPS 1.5/Mac OS X 10.7@ ****/ + + + +/* + * Prototypes... + */ + +extern void httpBlocking(http_t *http, int b); +extern int httpCheck(http_t *http); +extern void httpClearFields(http_t *http); +extern void httpClose(http_t *http); +extern http_t *httpConnect(const char *host, int port); +extern http_t *httpConnectEncrypt(const char *host, int port, + http_encryption_t encryption); +extern int httpDelete(http_t *http, const char *uri); +extern int httpEncryption(http_t *http, http_encryption_t e); +extern int httpError(http_t *http); +extern void httpFlush(http_t *http); +extern int httpGet(http_t *http, const char *uri); +extern char *httpGets(char *line, int length, http_t *http); +extern const char *httpGetDateString(time_t t); +extern time_t httpGetDateTime(const char *s); +extern const char *httpGetField(http_t *http, http_field_t field); +extern struct hostent *httpGetHostByName(const char *name); +extern char *httpGetSubField(http_t *http, http_field_t field, + const char *name, char *value); +extern int httpHead(http_t *http, const char *uri); +extern void httpInitialize(void); +extern int httpOptions(http_t *http, const char *uri); +extern int httpPost(http_t *http, const char *uri); +extern int httpPrintf(http_t *http, const char *format, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +# endif /* __GNUC__ */ +; +extern int httpPut(http_t *http, const char *uri); +extern int httpRead(http_t *http, char *buffer, int length) _CUPS_DEPRECATED; +extern int httpReconnect(http_t *http); +extern void httpSeparate(const char *uri, char *method, + char *username, char *host, int *port, + char *resource) _CUPS_DEPRECATED; +extern void httpSetField(http_t *http, http_field_t field, + const char *value); +extern const char *httpStatus(http_status_t status); +extern int httpTrace(http_t *http, const char *uri); +extern http_status_t httpUpdate(http_t *http); +extern int httpWrite(http_t *http, const char *buffer, int length) _CUPS_DEPRECATED; +extern char *httpEncode64(char *out, const char *in) _CUPS_DEPRECATED; +extern char *httpDecode64(char *out, const char *in) _CUPS_DEPRECATED; +extern int httpGetLength(http_t *http) _CUPS_DEPRECATED; +extern char *httpMD5(const char *, const char *, const char *, + char [33]); +extern char *httpMD5Final(const char *, const char *, const char *, + char [33]); +extern char *httpMD5String(const unsigned char *, char [33]); + +/**** New in CUPS 1.1.19 ****/ +extern void httpClearCookie(http_t *http) _CUPS_API_1_1_19; +extern const char *httpGetCookie(http_t *http) _CUPS_API_1_1_19; +extern void httpSetCookie(http_t *http, const char *cookie) _CUPS_API_1_1_19; +extern int httpWait(http_t *http, int msec) _CUPS_API_1_1_19; + +/**** New in CUPS 1.1.21 ****/ +extern char *httpDecode64_2(char *out, int *outlen, const char *in) _CUPS_API_1_1_21; +extern char *httpEncode64_2(char *out, int outlen, const char *in, + int inlen) _CUPS_API_1_1_21; +extern void httpSeparate2(const char *uri, + char *method, int methodlen, + char *username, int usernamelen, + char *host, int hostlen, int *port, + char *resource, int resourcelen) _CUPS_DEPRECATED; + +/**** New in CUPS 1.2/Mac OS X 10.5 ****/ +extern int httpAddrAny(const http_addr_t *addr) _CUPS_API_1_2; +extern http_addrlist_t *httpAddrConnect(http_addrlist_t *addrlist, int *sock) _CUPS_API_1_2; +extern int httpAddrEqual(const http_addr_t *addr1, + const http_addr_t *addr2) _CUPS_API_1_2; +extern void httpAddrFreeList(http_addrlist_t *addrlist) _CUPS_API_1_2; +extern http_addrlist_t *httpAddrGetList(const char *hostname, int family, + const char *service) _CUPS_API_1_2; +extern int httpAddrLength(const http_addr_t *addr) _CUPS_API_1_2; +extern int httpAddrLocalhost(const http_addr_t *addr) _CUPS_API_1_2; +extern char *httpAddrLookup(const http_addr_t *addr, + char *name, int namelen) _CUPS_API_1_2; +extern char *httpAddrString(const http_addr_t *addr, + char *s, int slen) _CUPS_API_1_2; +extern http_uri_status_t httpAssembleURI(http_uri_coding_t encoding, + char *uri, int urilen, + const char *scheme, + const char *username, + const char *host, int port, + const char *resource) _CUPS_API_1_2; +extern http_uri_status_t httpAssembleURIf(http_uri_coding_t encoding, + char *uri, int urilen, + const char *scheme, + const char *username, + const char *host, int port, + const char *resourcef, ...) _CUPS_API_1_2; +extern int httpFlushWrite(http_t *http) _CUPS_API_1_2; +extern int httpGetBlocking(http_t *http) _CUPS_API_1_2; +extern const char *httpGetDateString2(time_t t, char *s, int slen) _CUPS_API_1_2; +extern int httpGetFd(http_t *http) _CUPS_API_1_2; +extern const char *httpGetHostname(http_t *http, char *s, int slen) _CUPS_API_1_2; +extern off_t httpGetLength2(http_t *http) _CUPS_API_1_2; +extern http_status_t httpGetStatus(http_t *http) _CUPS_API_1_2; +extern char *httpGetSubField2(http_t *http, http_field_t field, + const char *name, char *value, + int valuelen) _CUPS_API_1_2; +extern ssize_t httpRead2(http_t *http, char *buffer, size_t length) _CUPS_API_1_2; +extern http_uri_status_t httpSeparateURI(http_uri_coding_t decoding, + const char *uri, + char *scheme, int schemelen, + char *username, int usernamelen, + char *host, int hostlen, int *port, + char *resource, int resourcelen) _CUPS_API_1_2; +extern void httpSetExpect(http_t *http, http_status_t expect) _CUPS_API_1_2; +extern void httpSetLength(http_t *http, size_t length) _CUPS_API_1_2; +extern ssize_t httpWrite2(http_t *http, const char *buffer, + size_t length) _CUPS_API_1_2; + +/**** New in CUPS 1.3/Mac OS X 10.5 ****/ +extern char *httpGetAuthString(http_t *http) _CUPS_API_1_3; +extern void httpSetAuthString(http_t *http, const char *scheme, + const char *data) _CUPS_API_1_3; + +/**** New in CUPS 1.5/Mac OS X 10.7 ****/ +extern int httpAddCredential(cups_array_t *credentials, + const void *data, size_t datalen) + _CUPS_API_1_5; +extern int httpCopyCredentials(http_t *http, + cups_array_t **credentials) + _CUPS_API_1_5; +extern void httpFreeCredentials(cups_array_t *certs) _CUPS_API_1_5; +extern int httpSetCredentials(http_t *http, cups_array_t *certs) + _CUPS_API_1_5; +extern void httpSetTimeout(http_t *http, double timeout, + http_timeout_cb_t cb, void *user_data); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_HTTP_H_ */ + +/* + * End of "$Id: http.h 9801 2011-05-21 04:02:41Z mike $". + */ diff --git a/cups/ipp-private.h b/cups/ipp-private.h new file mode 100644 index 0000000..a173f67 --- /dev/null +++ b/cups/ipp-private.h @@ -0,0 +1,87 @@ +/* + * "$Id: ipp-private.h 9084 2010-04-07 06:54:31Z mike $" + * + * Private IPP definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_IPP_PRIVATE_H_ +# define _CUPS_IPP_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define IPP_BUF_SIZE (IPP_MAX_LENGTH + 2) + /* Size of buffer */ + + +/* + * Structures... + */ + +typedef struct _ipp_buffer_s /**** Read/write buffer ****/ +{ + unsigned char d[IPP_BUF_SIZE];/* Data buffer */ + struct _ipp_buffer_s *next; /* Next buffer in list */ + int used; /* Is this buffer used? */ +} _ipp_buffer_t; + +typedef struct /**** Attribute mapping data ****/ +{ + int multivalue; /* Option has multiple values? */ + const char *name; /* Option/attribute name */ + ipp_tag_t value_tag; /* Value tag for this attribute */ + ipp_tag_t group_tag; /* Group tag for this attribute */ +} _ipp_option_t; + + +/* + * Prototypes for private functions... + */ + +extern ipp_attribute_t *_ippAddAttr(ipp_t *ipp, int num_values); +extern size_t _ippAttrString(ipp_attribute_t *attr, char *buffer, + size_t bufsize); +extern _ipp_option_t *_ippFindOption(const char *name); +extern void _ippFreeAttr(ipp_attribute_t *attr); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_IPP_H_ */ + +/* + * End of "$Id: ipp-private.h 9084 2010-04-07 06:54:31Z mike $". + */ diff --git a/cups/ipp-support.c b/cups/ipp-support.c new file mode 100644 index 0000000..a428170 --- /dev/null +++ b/cups/ipp-support.c @@ -0,0 +1,831 @@ +/* + * "$Id: ipp-support.c 10108 2011-11-04 22:22:22Z mike $" + * + * Internet Printing Protocol support functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _ippAttrString() - Convert the attribute's value to a string. + * ippErrorString() - Return a name for the given status code. + * ippErrorValue() - Return a status code for the given name. + * ippOpString() - Return a name for the given operation id. + * ippOpValue() - Return an operation id for the given name. + * ippPort() - Return the default IPP port number. + * ippSetPort() - Set the default port number. + * ippTagString() - Return the tag name corresponding to a tag value. + * ippTagValue() - Return the tag value corresponding to a tag name. + * ipp_col_string() - Convert a collection to a string. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * Local globals... + */ + +static const char * const ipp_status_oks[] = /* "OK" status codes */ + { + "successful-ok", + "successful-ok-ignored-or-substituted-attributes", + "successful-ok-conflicting-attributes", + "successful-ok-ignored-subscriptions", + "successful-ok-ignored-notifications", + "successful-ok-too-many-events", + "successful-ok-but-cancel-subscription", + "successful-ok-events-complete" + }, + * const ipp_status_400s[] = /* Client errors */ + { + "client-error-bad-request", + "client-error-forbidden", + "client-error-not-authenticated", + "client-error-not-authorized", + "client-error-not-possible", + "client-error-timeout", + "client-error-not-found", + "client-error-gone", + "client-error-request-entity-too-large", + "client-error-request-value-too-long", + "client-error-document-format-not-supported", + "client-error-attributes-or-values-not-supported", + "client-error-uri-scheme-not-supported", + "client-error-charset-not-supported", + "client-error-conflicting-attributes", + "client-error-compression-not-supported", + "client-error-compression-error", + "client-error-document-format-error", + "client-error-document-access-error", + "client-error-attributes-not-settable", + "client-error-ignored-all-subscriptions", + "client-error-too-many-subscriptions", + "client-error-ignored-all-notifications", + "client-error-print-support-file-not-found" + }, + * const ipp_status_500s[] = /* Server errors */ + { + "server-error-internal-error", + "server-error-operation-not-supported", + "server-error-service-unavailable", + "server-error-version-not-supported", + "server-error-device-error", + "server-error-temporary-error", + "server-error-not-accepting-jobs", + "server-error-busy", + "server-error-job-canceled", + "server-error-multiple-document-jobs-not-supported", + "server-error-printer-is-deactivated", + "server-error-too-many-jobs", + "server-error-too-many-documents" + }, + * const ipp_status_1000s[] = /* CUPS internal */ + { + "cups-authorization-canceled", + "cups-pki-error", + "cups-upgrade-required" + }; +static char * const ipp_std_ops[] = + { + /* 0x0000 - 0x000f */ + "0x00", + "0x01", + "Print-Job", + "Print-URI", + "Validate-Job", + "Create-Job", + "Send-Document", + "Send-URI", + "Cancel-Job", + "Get-Job-Attributes", + "Get-Jobs", + "Get-Printer-Attributes", + "Hold-Job", + "Release-Job", + "Restart-Job", + "0x0f", + + /* 0x0010 - 0x001f */ + "Pause-Printer", + "Resume-Printer", + "Purge-Jobs", + "Set-Printer-Attributes", + "Set-Job-Attributes", + "Get-Printer-Supported-Values", + "Create-Printer-Subscription", + "Create-Job-Subscription", + "Get-Subscription-Attributes", + "Get-Subscriptions", + "Renew-Subscription", + "Cancel-Subscription", + "Get-Notifications", + "Send-Notifications", + "0x1e", + "0x1f", + + /* 0x0020 - 0x002f */ + "0x20", + "Get-Printer-Support-Files", + "Enable-Printer", + "Disable-Printer", + "Pause-Printer-After-Current-Job", + "Hold-New-Jobs", + "Release-Held-New-Jobs", + "Deactivate-Printer", + "Activate-Printer", + "Restart-Printer", + "Shutdown-Printer", + "Startup-Printer", + "Reprocess-Job", + "Cancel-Current-Job", + "Suspend-Current-Job", + "Resume-Job", + + /* 0x0030 - 0x003b */ + "Promote-Job", + "Schedule-Job-After", + "0x32", + "Cancel-Document", + "Get-Document-Attributes", + "Get-Documents", + "Delete-Document", + "Set-Document-Attributes", + "Cancel-Jobs", + "Cancel-My-Jobs", + "Resubmit-Job", + "Close-Job", + "Identify-Printer" + }, + * const ipp_cups_ops[] = + { + "CUPS-Get-Default", + "CUPS-Get-Printers", + "CUPS-Add-Modify-Printer", + "CUPS-Delete-Printer", + "CUPS-Get-Classes", + "CUPS-Add-Modify-Class", + "CUPS-Delete-Class", + "CUPS-Accept-Jobs", + "CUPS-Reject-Jobs", + "CUPS-Set-Default", + "CUPS-Get-Devices", + "CUPS-Get-PPDs", + "CUPS-Move-Job", + "CUPS-Authenticate-Job", + "CUPS-Get-PPD" + }, + * const ipp_cups_ops2[] = + { + "CUPS-Get-Document" + }, + * const ipp_tag_names[] = + { /* Value/group tag names */ + "zero", /* 0x00 */ + "operation-attributes-tag", + /* 0x01 */ + "job-attributes-tag", /* 0x02 */ + "end-of-attributes-tag", + /* 0x03 */ + "printer-attributes-tag", + /* 0x04 */ + "unsupported-attributes-tag", + /* 0x05 */ + "subscription-attributes-tag", + /* 0x06 */ + "event-notification-attributes-tag", + /* 0x07 */ + "0x08", /* 0x08 */ + "document-attributes-tag", + /* 0x09 */ + "0x0a", /* 0x0a */ + "0x0b", /* 0x0b */ + "0x0c", /* 0x0c */ + "0x0d", /* 0x0d */ + "0x0e", /* 0x0e */ + "0x0f", /* 0x0f */ + "unsupported", /* 0x10 */ + "default", /* 0x11 */ + "unknown", /* 0x12 */ + "no-value", /* 0x13 */ + "0x14", /* 0x14 */ + "not-settable", /* 0x15 */ + "delete-attribute", /* 0x16 */ + "admin-define", /* 0x17 */ + "0x18", /* 0x18 */ + "0x19", /* 0x19 */ + "0x1a", /* 0x1a */ + "0x1b", /* 0x1b */ + "0x1c", /* 0x1c */ + "0x1d", /* 0x1d */ + "0x1e", /* 0x1e */ + "0x1f", /* 0x1f */ + "0x20", /* 0x20 */ + "integer", /* 0x21 */ + "boolean", /* 0x22 */ + "enum", /* 0x23 */ + "0x24", /* 0x24 */ + "0x25", /* 0x25 */ + "0x26", /* 0x26 */ + "0x27", /* 0x27 */ + "0x28", /* 0x28 */ + "0x29", /* 0x29 */ + "0x2a", /* 0x2a */ + "0x2b", /* 0x2b */ + "0x2c", /* 0x2c */ + "0x2d", /* 0x2d */ + "0x2e", /* 0x2e */ + "0x2f", /* 0x2f */ + "octetString", /* 0x30 */ + "dateTime", /* 0x31 */ + "resolution", /* 0x32 */ + "rangeOfInteger", /* 0x33 */ + "collection", /* 0x34 */ + "textWithLanguage", /* 0x35 */ + "nameWithLanguage", /* 0x36 */ + "endCollection", /* 0x37 */ + "0x38", /* 0x38 */ + "0x39", /* 0x39 */ + "0x3a", /* 0x3a */ + "0x3b", /* 0x3b */ + "0x3c", /* 0x3c */ + "0x3d", /* 0x3d */ + "0x3e", /* 0x3e */ + "0x3f", /* 0x3f */ + "0x40", /* 0x40 */ + "textWithoutLanguage",/* 0x41 */ + "nameWithoutLanguage",/* 0x42 */ + "0x43", /* 0x43 */ + "keyword", /* 0x44 */ + "uri", /* 0x45 */ + "uriScheme", /* 0x46 */ + "charset", /* 0x47 */ + "naturalLanguage", /* 0x48 */ + "mimeMediaType", /* 0x49 */ + "memberAttrName" /* 0x4a */ + }; +static const char * const job_states[] = +{ /* job-state enums */ + "pending", + "pending-held", + "processing", + "processing-stopped", + "canceled", + "aborted", + "completed" +}; +static const char * const printer_states[] = +{ /* printer-state enums */ + "idle", + "processing", + "stopped", +}; + + +/* + * Local functions... + */ + +static size_t ipp_col_string(ipp_t *col, char *buffer, size_t bufsize); + + +/* + * '_ippAttrString()' - Convert the attribute's value to a string. + * + * Returns the number of bytes that would be written, not including the + * trailing nul. The buffer pointer can be NULL to get the required length, + * just like (v)snprintf. + */ + +size_t /* O - Number of bytes less nul */ +_ippAttrString(ipp_attribute_t *attr, /* I - Attribute */ + char *buffer, /* I - String buffer or NULL */ + size_t bufsize) /* I - Size of string buffer */ +{ + int i; /* Looping var */ + char *bufptr, /* Pointer into buffer */ + *bufend, /* End of buffer */ + temp[256]; /* Temporary string */ + const char *ptr; /* Pointer into string */ + ipp_value_t *val; /* Current value */ + + + if (!attr || !attr->name) + { + if (buffer) + *buffer = '\0'; + + return (0); + } + + bufptr = buffer; + if (buffer) + bufend = buffer + bufsize - 1; + else + bufend = NULL; + + for (i = attr->num_values, val = attr->values; i > 0; i --, val ++) + { + if (val > attr->values) + { + if (buffer && bufptr < bufend) + *bufptr++ = ','; + else + bufptr ++; + } + + switch (attr->value_tag & ~IPP_TAG_COPY) + { + case IPP_TAG_ENUM : + if (!strcmp(attr->name, "printer-state") && + val->integer >= IPP_PRINTER_IDLE && + val->integer <= IPP_PRINTER_STOPPED) + { + ptr = printer_states[val->integer - IPP_PRINTER_IDLE]; + + if (buffer && bufptr < bufend) + strlcpy(bufptr, ptr, bufend - bufptr + 1); + + bufptr += strlen(ptr); + break; + } + else if (!strcmp(attr->name, "job-state") && + val->integer >= IPP_JOB_PENDING && + val->integer <= IPP_JOB_COMPLETED) + { + ptr = job_states[val->integer - IPP_JOB_PENDING]; + + if (buffer && bufptr < bufend) + strlcpy(bufptr, ptr, bufend - bufptr + 1); + + bufptr += strlen(ptr); + break; + } + else if (!strcmp(attr->name, "operations-supported")) + { + ptr = ippOpString(val->integer); + + if (buffer && bufptr < bufend) + strlcpy(bufptr, ptr, bufend - bufptr + 1); + + bufptr += strlen(ptr); + break; + } + + case IPP_TAG_INTEGER : + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d", val->integer); + else + bufptr += snprintf(temp, sizeof(temp), "%d", val->integer); + break; + + case IPP_TAG_BOOLEAN : + if (buffer && bufptr < bufend) + strlcpy(bufptr, val->boolean ? "true" : "false", + bufend - bufptr + 1); + + bufptr += val->boolean ? 4 : 5; + break; + + case IPP_TAG_RANGE : + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, bufend - bufptr + 1, "%d-%d", + val->range.lower, val->range.upper); + else + bufptr += snprintf(temp, sizeof(temp), "%d-%d", val->range.lower, + val->range.upper); + break; + + case IPP_TAG_RESOLUTION : + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, bufend - bufptr + 1, "%dx%d%s", + val->resolution.xres, val->resolution.yres, + val->resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + else + bufptr += snprintf(temp, sizeof(temp), "%dx%d%s", + val->resolution.xres, val->resolution.yres, + val->resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + break; + + case IPP_TAG_DATE : + { + unsigned year; /* Year */ + + year = (val->date[0] << 8) + val->date[1]; + + if (val->date[9] == 0 && val->date[10] == 0) + snprintf(temp, sizeof(temp), "%04u-%02u-%02uT%02u:%02u:%02uZ", + year, val->date[2], val->date[3], val->date[4], + val->date[5], val->date[6]); + else + snprintf(temp, sizeof(temp), + "%04u-%02u-%02uT%02u:%02u:%02u%c%02u%02u", + year, val->date[2], val->date[3], val->date[4], + val->date[5], val->date[6], val->date[8], val->date[9], + val->date[10]); + + if (buffer && bufptr < bufend) + strlcpy(bufptr, temp, bufend - bufptr + 1); + + bufptr += strlen(temp); + } + break; + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_MIMETYPE : + case IPP_TAG_LANGUAGE : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + if (!val->string.text) + break; + + for (ptr = val->string.text; *ptr; ptr ++) + { + if (*ptr == '\\' || *ptr == '\"') + { + if (buffer && bufptr < bufend) + *bufptr = '\\'; + bufptr ++; + } + + if (buffer && bufptr < bufend) + *bufptr = *ptr; + bufptr ++; + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + if (buffer && bufptr < bufend) + bufptr += ipp_col_string(val->collection, bufptr, + bufend - bufptr + 1); + else + bufptr += ipp_col_string(val->collection, NULL, 0); + break; + + case IPP_TAG_STRING : + for (ptr = val->string.text; *ptr; ptr ++) + { + if (*ptr == '\\' || _cups_isspace(*ptr)) + { + if (buffer && bufptr < bufend) + *bufptr = '\\'; + bufptr ++; + + if (buffer && bufptr < bufend) + *bufptr = *ptr; + bufptr ++; + } + else if (!isprint(*ptr & 255)) + { + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, bufend - bufptr + 1, "\\%03o", + *ptr & 255); + else + bufptr += snprintf(temp, sizeof(temp), "\\%03o", + *ptr & 255); + } + else + { + if (buffer && bufptr < bufend) + *bufptr = *ptr; + bufptr ++; + } + } + break; + + default : + ptr = ippTagString(attr->value_tag); + if (buffer && bufptr < bufend) + strlcpy(bufptr, ptr, bufend - bufptr + 1); + bufptr += strlen(ptr); + break; + } + } + + if (buffer && bufptr < bufend) + *bufptr = '\0'; + else if (bufend) + *bufend = '\0'; + + return (bufptr - buffer); +} + + +/* + * 'ippErrorString()' - Return a name for the given status code. + */ + +const char * /* O - Text string */ +ippErrorString(ipp_status_t error) /* I - Error status */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * See if the error code is a known value... + */ + + if (error >= IPP_OK && error <= IPP_OK_EVENTS_COMPLETE) + return (ipp_status_oks[error]); + else if (error == IPP_REDIRECTION_OTHER_SITE) + return ("redirection-other-site"); + else if (error == CUPS_SEE_OTHER) + return ("cups-see-other"); + else if (error >= IPP_BAD_REQUEST && error <= IPP_PRINT_SUPPORT_FILE_NOT_FOUND) + return (ipp_status_400s[error - IPP_BAD_REQUEST]); + else if (error >= IPP_INTERNAL_ERROR && error <= IPP_PRINTER_IS_DEACTIVATED) + return (ipp_status_500s[error - IPP_INTERNAL_ERROR]); + else if (error >= IPP_AUTHENTICATION_CANCELED && error <= IPP_UPGRADE_REQUIRED) + return (ipp_status_1000s[error - IPP_AUTHENTICATION_CANCELED]); + + /* + * No, build an "0xxxxx" error string... + */ + + sprintf(cg->ipp_unknown, "0x%04x", error); + + return (cg->ipp_unknown); +} + + +/* + * 'ippErrorValue()' - Return a status code for the given name. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_status_t /* O - IPP status code */ +ippErrorValue(const char *name) /* I - Name */ +{ + int i; + + + for (i = 0; i < (sizeof(ipp_status_oks) / sizeof(ipp_status_oks[0])); i ++) + if (!_cups_strcasecmp(name, ipp_status_oks[i])) + return ((ipp_status_t)i); + + if (!_cups_strcasecmp(name, "redirection-other-site")) + return (IPP_REDIRECTION_OTHER_SITE); + + if (!_cups_strcasecmp(name, "cups-see-other")) + return (CUPS_SEE_OTHER); + + for (i = 0; i < (sizeof(ipp_status_400s) / sizeof(ipp_status_400s[0])); i ++) + if (!_cups_strcasecmp(name, ipp_status_400s[i])) + return ((ipp_status_t)(i + 0x400)); + + for (i = 0; i < (sizeof(ipp_status_500s) / sizeof(ipp_status_500s[0])); i ++) + if (!_cups_strcasecmp(name, ipp_status_500s[i])) + return ((ipp_status_t)(i + 0x500)); + + for (i = 0; i < (sizeof(ipp_status_1000s) / sizeof(ipp_status_1000s[0])); i ++) + if (!_cups_strcasecmp(name, ipp_status_1000s[i])) + return ((ipp_status_t)(i + 0x1000)); + + return ((ipp_status_t)-1); +} + + +/* + * 'ippOpString()' - Return a name for the given operation id. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - Name */ +ippOpString(ipp_op_t op) /* I - Operation ID */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * See if the operation ID is a known value... + */ + + if (op >= IPP_PRINT_JOB && op <= IPP_CLOSE_JOB) + return (ipp_std_ops[op]); + else if (op == IPP_PRIVATE) + return ("windows-ext"); + else if (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD) + return (ipp_cups_ops[op - CUPS_GET_DEFAULT]); + else if (op == CUPS_GET_DOCUMENT) + return (ipp_cups_ops2[0]); + + /* + * No, build an "0xxxxx" operation string... + */ + + sprintf(cg->ipp_unknown, "0x%04x", op); + + return (cg->ipp_unknown); +} + + +/* + * 'ippOpValue()' - Return an operation id for the given name. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_op_t /* O - Operation ID */ +ippOpValue(const char *name) /* I - Textual name */ +{ + int i; + + + if (!strncmp(name, "0x", 2)) + return ((ipp_op_t)strtol(name + 2, NULL, 16)); + + for (i = 0; i < (sizeof(ipp_std_ops) / sizeof(ipp_std_ops[0])); i ++) + if (!_cups_strcasecmp(name, ipp_std_ops[i])) + return ((ipp_op_t)i); + + if (!_cups_strcasecmp(name, "windows-ext")) + return (IPP_PRIVATE); + + for (i = 0; i < (sizeof(ipp_cups_ops) / sizeof(ipp_cups_ops[0])); i ++) + if (!_cups_strcasecmp(name, ipp_cups_ops[i])) + return ((ipp_op_t)(i + 0x4001)); + + for (i = 0; i < (sizeof(ipp_cups_ops2) / sizeof(ipp_cups_ops2[0])); i ++) + if (!_cups_strcasecmp(name, ipp_cups_ops2[i])) + return ((ipp_op_t)(i + 0x4027)); + + if (!_cups_strcasecmp(name, "CUPS-Add-Class")) + return (CUPS_ADD_MODIFY_CLASS); + + if (!_cups_strcasecmp(name, "CUPS-Add-Printer")) + return (CUPS_ADD_MODIFY_PRINTER); + + return ((ipp_op_t)-1); +} + + +/* + * 'ippPort()' - Return the default IPP port number. + */ + +int /* O - Port number */ +ippPort(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + DEBUG_puts("ippPort()"); + + if (!cg->ipp_port) + _cupsSetDefaults(); + + DEBUG_printf(("1ippPort: Returning %d...", cg->ipp_port)); + + return (cg->ipp_port); +} + + +/* + * 'ippSetPort()' - Set the default port number. + */ + +void +ippSetPort(int p) /* I - Port number to use */ +{ + DEBUG_printf(("ippSetPort(p=%d)", p)); + + _cupsGlobals()->ipp_port = p; +} + + +/* + * 'ippTagString()' - Return the tag name corresponding to a tag value. + * + * The returned names are defined in RFC 2911 and 3382. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +const char * /* O - Tag name */ +ippTagString(ipp_tag_t tag) /* I - Tag value */ +{ + tag &= IPP_TAG_MASK; + + if (tag < (ipp_tag_t)(sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0]))) + return (ipp_tag_names[tag]); + else + return ("UNKNOWN"); +} + + +/* + * 'ippTagValue()' - Return the tag value corresponding to a tag name. + * + * The tag names are defined in RFC 2911 and 3382. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ipp_tag_t /* O - Tag value */ +ippTagValue(const char *name) /* I - Tag name */ +{ + int i; /* Looping var */ + + + for (i = 0; i < (sizeof(ipp_tag_names) / sizeof(ipp_tag_names[0])); i ++) + if (!_cups_strcasecmp(name, ipp_tag_names[i])) + return ((ipp_tag_t)i); + + if (!_cups_strcasecmp(name, "operation")) + return (IPP_TAG_OPERATION); + else if (!_cups_strcasecmp(name, "job")) + return (IPP_TAG_JOB); + else if (!_cups_strcasecmp(name, "printer")) + return (IPP_TAG_PRINTER); + else if (!_cups_strcasecmp(name, "unsupported")) + return (IPP_TAG_UNSUPPORTED_GROUP); + else if (!_cups_strcasecmp(name, "subscription")) + return (IPP_TAG_SUBSCRIPTION); + else if (!_cups_strcasecmp(name, "event")) + return (IPP_TAG_EVENT_NOTIFICATION); + else if (!_cups_strcasecmp(name, "language")) + return (IPP_TAG_LANGUAGE); + else if (!_cups_strcasecmp(name, "mimetype")) + return (IPP_TAG_MIMETYPE); + else if (!_cups_strcasecmp(name, "name")) + return (IPP_TAG_NAME); + else if (!_cups_strcasecmp(name, "text")) + return (IPP_TAG_TEXT); + else if (!_cups_strcasecmp(name, "begCollection")) + return (IPP_TAG_BEGIN_COLLECTION); + else + return (IPP_TAG_ZERO); +} + + +/* + * 'ipp_col_string()' - Convert a collection to a string. + */ + +static size_t /* O - Number of bytes */ +ipp_col_string(ipp_t *col, /* I - Collection attribute */ + char *buffer, /* I - Buffer or NULL */ + size_t bufsize) /* I - Size of buffer */ +{ + char *bufptr, /* Position in buffer */ + *bufend, /* End of buffer */ + temp[256]; /* Temporary string */ + ipp_attribute_t *attr; /* Current member attribute */ + + + bufptr = buffer; + bufend = buffer + bufsize - 1; + + if (buffer && bufptr < bufend) + *bufptr = '{'; + bufptr ++; + + for (attr = col->attrs; attr; attr = attr->next) + { + if (!attr->name) + continue; + + if (buffer && bufptr < bufend) + bufptr += snprintf(bufptr, bufend - bufptr + 1, "%s=", attr->name); + else + bufptr += strlen(attr->name) + 1; + + if (buffer && bufptr < bufend) + bufptr += _ippAttrString(attr, bufptr, bufend - bufptr + 1); + else + bufptr += _ippAttrString(attr, temp, sizeof(temp)); + } + + if (buffer && bufptr < bufend) + *bufptr = '}'; + bufptr ++; + + return (bufptr - buffer); +} + + +/* + * End of "$Id: ipp-support.c 10108 2011-11-04 22:22:22Z mike $". + */ diff --git a/cups/ipp.c b/cups/ipp.c new file mode 100644 index 0000000..15759b3 --- /dev/null +++ b/cups/ipp.c @@ -0,0 +1,3337 @@ +/* + * "$Id: ipp.c 10450 2012-05-04 22:52:56Z mike $" + * + * Internet Printing Protocol functions for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ippAddBoolean() - Add a boolean attribute to an IPP message. + * ippAddBooleans() - Add an array of boolean values. + * ippAddDate() - Add a date attribute to an IPP message. + * ippAddInteger() - Add a integer attribute to an IPP message. + * ippAddIntegers() - Add an array of integer values. + * ippAddOctetString() - Add an octetString value to an IPP message. + * ippAddString() - Add a language-encoded string to an IPP message. + * ippAddStrings() - Add language-encoded strings to an IPP message. + * ippAddRange() - Add a range of values to an IPP message. + * ippAddRanges() - Add ranges of values to an IPP message. + * ippAddResolution() - Add a resolution value to an IPP message. + * ippAddResolutions() - Add resolution values to an IPP message. + * ippAddSeparator() - Add a group separator to an IPP message. + * ippDateToTime() - Convert from RFC 1903 Date/Time format to + * UNIX time in seconds. + * ippDelete() - Delete an IPP message. + * ippDeleteAttribute() - Delete a single attribute in an IPP message. + * ippFindAttribute() - Find a named attribute in a request... + * ippFindNextAttribute() - Find the next named attribute in a request... + * ippLength() - Compute the length of an IPP message. + * ippNew() - Allocate a new IPP message. + * ippNewRequest() - Allocate a new IPP message. + * ippRead() - Read data for an IPP message from a HTTP + * connection. + * ippFilterPrinters() - Filter printer list based on an environment variable + * ippReadFile() - Read data for an IPP message from a file. + * ippReadIO() - Read data for an IPP message. + * ippTimeToDate() - Convert from UNIX time to RFC 1903 format. + * ippWrite() - Write data for an IPP message to a HTTP + * connection. + * ippWriteFile() - Write data for an IPP message to a file. + * ippWriteIO() - Write data for an IPP message. + * _ippAddAttr() - Add a new attribute to the request. + * _ippFreeAttr() - Free an attribute. + * ipp_length() - Compute the length of an IPP message or + * collection value. + * ipp_read_http() - Semi-blocking read on a HTTP connection... + * ipp_read_file() - Read IPP data from a file. + * ipp_write_file() - Write IPP data to a file. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#ifdef WIN32 +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +static unsigned char *ipp_buffer_get(void); +static void ipp_buffer_release(unsigned char *b); +static size_t ipp_length(ipp_t *ipp, int collection); +static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer, + size_t length); +static ssize_t ipp_read_file(int *fd, ipp_uchar_t *buffer, + size_t length); +static ssize_t ipp_write_file(int *fd, ipp_uchar_t *buffer, + size_t length); + + +/* + * 'ippAddBoolean()' - Add a boolean attribute to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddBoolean(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + char value) /* I - Value of attribute */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)", + ipp, group, ippTagString(group), name, value)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_BOOLEAN; + attr->values[0].boolean = value; + + return (attr); +} + + +/* + * 'ippAddBooleans()' - Add an array of boolean values. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddBooleans(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + int num_values, /* I - Number of values */ + const char *values) /* I - Values */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", " + "num_values=%d, values=%p)", ipp, group, ippTagString(group), + name, num_values, values)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_BOOLEAN; + + if (values != NULL) + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + value->boolean = values[i]; + + return (attr); +} + + +/* + * 'ippAddCollection()' - Add a collection value. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddCollection(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + ipp_t *value) /* I - Value */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", " + "value=%p)", ipp, group, ippTagString(group), name, value)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_BEGIN_COLLECTION; + attr->values[0].collection = value; + + value->use ++; + + return (attr); +} + + +/* + * 'ippAddCollections()' - Add an array of collection values. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddCollections( + ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + int num_values, /* I - Number of values */ + const ipp_t **values) /* I - Values */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", " + "num_values=%d, values=%p)", ipp, group, ippTagString(group), + name, num_values, values)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_BEGIN_COLLECTION; + + if (values != NULL) + { + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + { + value->collection = (ipp_t *)values[i]; + value->collection->use ++; + } + } + + return (attr); +} + + +/* + * 'ippAddDate()' - Add a date attribute to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddDate(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + const ipp_uchar_t *value) /* I - Value */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", + ipp, group, ippTagString(group), name, value)); + + if (!ipp || !name || !value) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_DATE; + memcpy(attr->values[0].date, value, 11); + + return (attr); +} + + +/* + * 'ippAddInteger()' - Add a integer attribute to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddInteger(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + ipp_tag_t type, /* I - Type of attribute */ + const char *name, /* I - Name of attribute */ + int value) /* I - Value of attribute */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), " + "name=\"%s\", value=%d)", ipp, group, ippTagString(group), + type, ippTagString(type), name, value)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = type; + attr->values[0].integer = value; + + return (attr); +} + + +/* + * 'ippAddIntegers()' - Add an array of integer values. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddIntegers(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + ipp_tag_t type, /* I - Type of attribute */ + const char *name, /* I - Name of attribute */ + int num_values, /* I - Number of values */ + const int *values) /* I - Values */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), " + "name=\"%s\", num_values=%d, values=%p)", ipp, + group, ippTagString(group), type, ippTagString(type), name, + num_values, values)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = type; + + if (values != NULL) + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + value->integer = values[i]; + + return (attr); +} + + +/* + * 'ippAddOctetString()' - Add an octetString value to an IPP message. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddOctetString(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + const void *data, /* I - octetString data */ + int datalen) /* I - Length of data in bytes */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + if (ipp == NULL || name == NULL) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + /* + * Initialize the attribute data... + */ + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_STRING; + attr->values[0].unknown.length = datalen; + + if (data) + { + if ((attr->values[0].unknown.data = malloc(datalen)) == NULL) + { + ippDeleteAttribute(ipp, attr); + return (NULL); + } + + memcpy(attr->values[0].unknown.data, data, datalen); + } + + /* + * Return the new attribute... + */ + + return (attr); +} + + +/* + * 'ippAddString()' - Add a language-encoded string to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddString(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + ipp_tag_t type, /* I - Type of attribute */ + const char *name, /* I - Name of attribute */ + const char *charset, /* I - Character set */ + const char *value) /* I - Value */ +{ + ipp_attribute_t *attr; /* New attribute */ + char buffer[1024], /* Language/charset value buffer */ + *bufptr; /* Pointer into buffer */ + + + DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), type=%02x(%s), " + "name=\"%s\", charset=\"%s\", value=\"%s\")", ipp, + group, ippTagString(group), type, ippTagString(type), name, + charset, value)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + /* + * Force value to be English for the POSIX locale... + */ + + if (type == IPP_TAG_LANGUAGE && !_cups_strcasecmp(value, "C")) + value = "en"; + + /* + * Convert language and charset values to lowercase and change _ to - as + * needed... + */ + + if ((type == IPP_TAG_LANGUAGE || type == IPP_TAG_CHARSET) && value) + { + strlcpy(buffer, value, sizeof(buffer)); + value = buffer; + + for (bufptr = buffer; *bufptr; bufptr ++) + if (*bufptr == '_') + *bufptr = '-'; + else + *bufptr = tolower(*bufptr & 255); + } + + /* + * Initialize the attribute data... + */ + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = type; + attr->values[0].string.charset = ((int)type & IPP_TAG_COPY) ? (char *)charset : + charset ? _cupsStrAlloc(charset) : NULL; + attr->values[0].string.text = ((int)type & IPP_TAG_COPY) ? (char *)value : + value ? _cupsStrAlloc(value) : NULL; + + return (attr); +} + + +/* + * 'ippAddStrings()' - Add language-encoded strings to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddStrings( + ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + ipp_tag_t type, /* I - Type of attribute */ + const char *name, /* I - Name of attribute */ + int num_values, /* I - Number of values */ + const char *charset, /* I - Character set */ + const char * const *values) /* I - Values */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + char buffer[1024], /* Language/charset value buffer */ + *bufptr; /* Pointer into buffer */ + + + DEBUG_printf(("ippAddStrings(ipp=%p, group=%02x(%s), type=%02x(%s), " + "name=\"%s\", num_values=%d, charset=\"%s\", values=%p)", ipp, + group, ippTagString(group), type, ippTagString(type), name, + num_values, charset, values)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + /* + * Initialize the attribute data... + */ + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = type; + + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + { + if (i == 0) + value->string.charset = ((int)type & IPP_TAG_COPY) ? (char *)charset : + charset ? _cupsStrAlloc(charset) : NULL; + else + value->string.charset = attr->values[0].string.charset; + + if (values != NULL) + { + if ((int)type & IPP_TAG_COPY) + value->string.text = (char *)values[i]; + else if (type == IPP_TAG_LANGUAGE && !_cups_strcasecmp(values[i], "C")) + { + /* + * Force language to be English for the POSIX locale... + */ + + value->string.text = ((int)type & IPP_TAG_COPY) ? "en" : + _cupsStrAlloc("en"); + } + else if (type == IPP_TAG_LANGUAGE || type == IPP_TAG_CHARSET) + { + /* + * Convert language values to lowercase and change _ to - as needed... + */ + + strlcpy(buffer, values[i], sizeof(buffer)); + + for (bufptr = buffer; *bufptr; bufptr ++) + if (*bufptr == '_') + *bufptr = '-'; + else + *bufptr = tolower(*bufptr & 255); + + value->string.text = _cupsStrAlloc(buffer); + } + else + value->string.text = _cupsStrAlloc(values[i]); + + } + } + + return (attr); +} + + +/* + * 'ippAddRange()' - Add a range of values to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddRange(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + int lower, /* I - Lower value */ + int upper) /* I - Upper value */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, " + "upper=%d)", ipp, group, ippTagString(group), name, lower, + upper)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_RANGE; + attr->values[0].range.lower = lower; + attr->values[0].range.upper = upper; + + return (attr); +} + + +/* + * 'ippAddRanges()' - Add ranges of values to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddRanges(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + int num_values, /* I - Number of values */ + const int *lower, /* I - Lower values */ + const int *upper) /* I - Upper values */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", " + "num_values=%d, lower=%p, upper=%p)", ipp, group, + ippTagString(group), name, num_values, lower, upper)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_RANGE; + + if (lower != NULL && upper != NULL) + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + { + value->range.lower = lower[i]; + value->range.upper = upper[i]; + } + + return (attr); +} + + +/* + * 'ippAddResolution()' - Add a resolution value to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddResolution(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + ipp_res_t units, /* I - Units for resolution */ + int xres, /* I - X resolution */ + int yres) /* I - Y resolution */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", " + "units=%d, xres=%d, yres=%d)", ipp, group, + ippTagString(group), name, units, xres, yres)); + + if (!ipp || !name) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 1)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_RESOLUTION; + attr->values[0].resolution.xres = xres; + attr->values[0].resolution.yres = yres; + attr->values[0].resolution.units = units; + + return (attr); +} + + +/* + * 'ippAddResolutions()' - Add resolution values to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddResolutions(ipp_t *ipp, /* I - IPP message */ + ipp_tag_t group, /* I - IPP group */ + const char *name, /* I - Name of attribute */ + int num_values,/* I - Number of values */ + ipp_res_t units, /* I - Units for resolution */ + const int *xres, /* I - X resolutions */ + const int *yres) /* I - Y resolutions */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* New attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", " + "num_value=%d, units=%d, xres=%p, yres=%p)", ipp, group, + ippTagString(group), name, num_values, units, xres, yres)); + + if (!ipp || !name || num_values < 1) + return (NULL); + + if ((attr = _ippAddAttr(ipp, num_values)) == NULL) + return (NULL); + + attr->name = _cupsStrAlloc(name); + attr->group_tag = group; + attr->value_tag = IPP_TAG_RESOLUTION; + + if (xres != NULL && yres != NULL) + for (i = 0, value = attr->values; + i < num_values; + i ++, value ++) + { + value->resolution.xres = xres[i]; + value->resolution.yres = yres[i]; + value->resolution.units = units; + } + + return (attr); +} + + +/* + * 'ippAddSeparator()' - Add a group separator to an IPP message. + */ + +ipp_attribute_t * /* O - New attribute */ +ippAddSeparator(ipp_t *ipp) /* I - IPP message */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("ippAddSeparator(ipp=%p)", ipp)); + + if (!ipp) + return (NULL); + + if ((attr = _ippAddAttr(ipp, 0)) == NULL) + return (NULL); + + attr->group_tag = IPP_TAG_ZERO; + attr->value_tag = IPP_TAG_ZERO; + + return (attr); +} + + +/* + * 'ippDateToTime()' - Convert from RFC 1903 Date/Time format to UNIX time + * in seconds. + */ + +time_t /* O - UNIX time value */ +ippDateToTime(const ipp_uchar_t *date) /* I - RFC 1903 date info */ +{ + struct tm unixdate; /* UNIX date/time info */ + time_t t; /* Computed time */ + + + if (!date) + return (0); + + memset(&unixdate, 0, sizeof(unixdate)); + + /* + * RFC-1903 date/time format is: + * + * Byte(s) Description + * ------- ----------- + * 0-1 Year (0 to 65535) + * 2 Month (1 to 12) + * 3 Day (1 to 31) + * 4 Hours (0 to 23) + * 5 Minutes (0 to 59) + * 6 Seconds (0 to 60, 60 = "leap second") + * 7 Deciseconds (0 to 9) + * 8 +/- UTC + * 9 UTC hours (0 to 11) + * 10 UTC minutes (0 to 59) + */ + + unixdate.tm_year = ((date[0] << 8) | date[1]) - 1900; + unixdate.tm_mon = date[2] - 1; + unixdate.tm_mday = date[3]; + unixdate.tm_hour = date[4]; + unixdate.tm_min = date[5]; + unixdate.tm_sec = date[6]; + + t = mktime(&unixdate); + + if (date[8] == '-') + t += date[9] * 3600 + date[10] * 60; + else + t -= date[9] * 3600 + date[10] * 60; + + return (t); +} + + +/* + * 'ippDelete()' - Delete an IPP message. + */ + +void +ippDelete(ipp_t *ipp) /* I - IPP message */ +{ + ipp_attribute_t *attr, /* Current attribute */ + *next; /* Next attribute */ + + + DEBUG_printf(("ippDelete(ipp=%p)", ipp)); + + if (!ipp) + return; + + ipp->use --; + if (ipp->use > 0) + return; + + for (attr = ipp->attrs; attr != NULL; attr = next) + { + next = attr->next; + _ippFreeAttr(attr); + } + + free(ipp); +} + + +/* + * 'ippDeleteAttribute()' - Delete a single attribute in an IPP message. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +void +ippDeleteAttribute( + ipp_t *ipp, /* I - IPP message */ + ipp_attribute_t *attr) /* I - Attribute to delete */ +{ + ipp_attribute_t *current, /* Current attribute */ + *prev; /* Previous attribute */ + + + DEBUG_printf(("ippDeleteAttribute(ipp=%p, attr=%p(%s))", ipp, attr, + attr ? attr->name : "(null)")); + + /* + * Find the attribute in the list... + */ + + for (current = ipp->attrs, prev = NULL; + current != NULL && current != attr; + prev = current, current = current->next); + + if (current) + { + /* + * Found it, remove the attribute from the list... + */ + + if (prev) + prev->next = current->next; + else + ipp->attrs = current->next; + + if (current == ipp->last) + ipp->last = prev; + + /* + * Free memory used by the attribute... + */ + + _ippFreeAttr(current); + } +} + + +/* + * 'ippFindAttribute()' - Find a named attribute in a request... + */ + +ipp_attribute_t * /* O - Matching attribute */ +ippFindAttribute(ipp_t *ipp, /* I - IPP message */ + const char *name, /* I - Name of attribute */ + ipp_tag_t type) /* I - Type of attribute */ +{ + DEBUG_printf(("2ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", ipp, + name, type, ippTagString(type))); + + if (!ipp || !name) + return (NULL); + + /* + * Reset the current pointer... + */ + + ipp->current = NULL; + + /* + * Search for the attribute... + */ + + return (ippFindNextAttribute(ipp, name, type)); +} + + +/* + * 'ippFindNextAttribute()' - Find the next named attribute in a request... + */ + +ipp_attribute_t * /* O - Matching attribute */ +ippFindNextAttribute(ipp_t *ipp, /* I - IPP message */ + const char *name, /* I - Name of attribute */ + ipp_tag_t type) /* I - Type of attribute */ +{ + ipp_attribute_t *attr; /* Current atttribute */ + ipp_tag_t value_tag; /* Value tag */ + + + DEBUG_printf(("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", + ipp, name, type, ippTagString(type))); + + if (!ipp || !name) + return (NULL); + + if (ipp->current) + { + ipp->prev = ipp->current; + attr = ipp->current->next; + } + else + { + ipp->prev = NULL; + attr = ipp->attrs; + } + + for (; attr != NULL; ipp->prev = attr, attr = attr->next) + { + DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", attr, + attr->name)); + + value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK); + + if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 && + (value_tag == type || type == IPP_TAG_ZERO || + (value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) || + (value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME))) + { + ipp->current = attr; + + return (attr); + } + } + + ipp->current = NULL; + ipp->prev = NULL; + + return (NULL); +} + + +/* + * 'ippLength()' - Compute the length of an IPP message. + */ + +size_t /* O - Size of IPP message */ +ippLength(ipp_t *ipp) /* I - IPP message */ +{ + return (ipp_length(ipp, 0)); +} + + +/* + * 'ippNew()' - Allocate a new IPP message. + */ + +ipp_t * /* O - New IPP message */ +ippNew(void) +{ + ipp_t *temp; /* New IPP message */ + + + DEBUG_puts("ippNew()"); + + if ((temp = (ipp_t *)calloc(1, sizeof(ipp_t))) != NULL) + { + /* + * Default to IPP 1.1... + */ + + temp->request.any.version[0] = 1; + temp->request.any.version[1] = 1; + temp->use = 1; + } + + DEBUG_printf(("1ippNew: Returning %p", temp)); + + return (temp); +} + +/* + * 'ippFilterPrinters()' - Filter printer list based on environment variables + */ +ipp_state_t /* O - Current state */ +ippFilterPrinters(ipp_t *ipp) /* I - IPP data */ +{ + char *env_printer_list = NULL; + char *result_printer_list; + char delim_printers[] = ","; + char **printer_list_array; + char *default_printer_env; + int printer_list_size = 0; + ipp_attribute_t *filtertmpattr; + ipp_attribute_t *filtertmpattr2; + int i = 0; + int j = 0; + int found = 0; + int printer_name_found = 0; + int len = 0; + int last_null = 0; + + /* + * First we create an array from PRINTER and PRINTER_LIST + */ + if(getenv("PRINTER") != NULL) { + default_printer_env = getenv("PRINTER"); + printer_list_size++; + } else { + default_printer_env = (char *)malloc(sizeof(char)); + default_printer_env = ""; + } + + env_printer_list = strdup(getenv("PRINTER_LIST")); + result_printer_list = strtok(env_printer_list, delim_printers); + while(result_printer_list) { + if(default_printer_env && strcasecmp(result_printer_list, default_printer_env) != 0) + printer_list_size++; + result_printer_list = strtok( NULL, delim_printers); + } + + printer_list_array = (char **)malloc(printer_list_size * sizeof(char *)); + + env_printer_list = strdup(getenv("PRINTER_LIST")); + + result_printer_list = strtok(env_printer_list, delim_printers); + while(result_printer_list) { + /* + * Don't add the default printer if it's defined + */ + if(strcasecmp(result_printer_list, default_printer_env) != 0) { + printer_list_array[i] = (char *)malloc(sizeof(result_printer_list)); + printer_list_array[i++] = result_printer_list; + } + result_printer_list = strtok( NULL, delim_printers); + } + + if(strcasecmp(default_printer_env, "") != 0) + printer_list_array[printer_list_size-1] = default_printer_env; + + // number of attributes + for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next) { + len++; + } + ipp_attribute_t* array[len]; + + for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next) { + array[j++] = filtertmpattr; + } + + for (j=0; jvalue_tag == IPP_TAG_NAME) && + (strcasecmp(filtertmpattr->name, "printer-name") == 0)) { + printer_name_found = 1; + + // compare the current printer with the values in the list + for(i = 0; i < printer_list_size; i++) { + if (printer_list_array[i] && filtertmpattr->values[0].string.text && + (strcasecmp(filtertmpattr->values[0].string.text, printer_list_array[i]) == 0)) { + found = 1; + } + } + } + + // last attribute of a printer (separator) or last attribute + if (filtertmpattr->value_tag == IPP_TAG_ZERO || filtertmpattr->next == NULL) { + if(found == 0 && printer_name_found == 1) { // not found so we remove it + // First printer + if(last_null == 0) { + ipp->attrs = filtertmpattr->next; + } else { + // Printer in the middle + (array[last_null])->next = filtertmpattr->next; + } + } else { + // the last known good printer + last_null = j; + } + printer_name_found = 0; + found = 0; + } + } + + // remove the last IPP_TAG_ZERO if the last element in the list + for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next){ + if (filtertmpattr->value_tag == IPP_TAG_ZERO && filtertmpattr->next == NULL){ + filtertmpattr2->next = NULL; + } + filtertmpattr2 = filtertmpattr; + } + return 0; +} + + +/* + * 'ippNewRequest()' - Allocate a new IPP request message. + * + * The new request message is initialized with the attributes-charset and + * attributes-natural-language attributes added. The + * attributes-natural-language value is derived from the current locale. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_t * /* O - IPP request message */ +ippNewRequest(ipp_op_t op) /* I - Operation code */ +{ + ipp_t *request; /* IPP request message */ + cups_lang_t *language; /* Current language localization */ + + + DEBUG_printf(("ippNewRequest(op=%02x(%s))", op, ippOpString(op))); + + /* + * Create a new IPP message... + */ + + if ((request = ippNew()) == NULL) + return (NULL); + + /* + * Set the operation and request ID... + */ + + request->request.op.operation_id = op; + request->request.op.request_id = 1; + + /* + * Use UTF-8 as the character set... + */ + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, "utf-8"); + + /* + * Get the language from the current locale... + */ + + language = cupsLangDefault(); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, language->language); + + /* + * Return the new request... + */ + + return (request); +} + + +/* + * 'ippRead()' - Read data for an IPP message from a HTTP connection. + */ + +ipp_state_t /* O - Current state */ +ippRead(http_t *http, /* I - HTTP connection */ + ipp_t *ipp) /* I - IPP data */ +{ + DEBUG_printf(("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT, + http, ipp, CUPS_LLCAST (http ? http->data_remaining : -1))); + + if (!http) + return (IPP_ERROR); + + DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state, + http->used)); + + return (ippReadIO(http, (ipp_iocb_t)ipp_read_http, http->blocking, NULL, + ipp)); +} + + +/* + * 'ippReadFile()' - Read data for an IPP message from a file. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ipp_state_t /* O - Current state */ +ippReadFile(int fd, /* I - HTTP data */ + ipp_t *ipp) /* I - IPP data */ +{ + DEBUG_printf(("ippReadFile(fd=%d, ipp=%p)", fd, ipp)); + + return (ippReadIO(&fd, (ipp_iocb_t)ipp_read_file, 1, NULL, ipp)); +} + + +/* + * 'ippReadIO()' - Read data for an IPP message. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_state_t /* O - Current state */ +ippReadIO(void *src, /* I - Data source */ + ipp_iocb_t cb, /* I - Read callback function */ + int blocking, /* I - Use blocking IO? */ + ipp_t *parent, /* I - Parent request, if any */ + ipp_t *ipp) /* I - IPP data */ +{ + int n; /* Length of data */ + unsigned char *buffer, /* Data buffer */ + string[IPP_MAX_NAME], + /* Small string buffer */ + *bufptr; /* Pointer into buffer */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_tag_t tag; /* Current tag */ + ipp_tag_t value_tag; /* Current value tag */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", + src, cb, blocking, parent, ipp)); + DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_ERROR)); + + if (!src || !ipp) + return (IPP_ERROR); + + if ((buffer = ipp_buffer_get()) == NULL) + { + DEBUG_puts("1ippReadIO: Unable to get read buffer."); + return (IPP_ERROR); + } + + switch (ipp->state) + { + case IPP_IDLE : + ipp->state ++; /* Avoid common problem... */ + + case IPP_HEADER : + if (parent == NULL) + { + /* + * Get the request header... + */ + + if ((*cb)(src, buffer, 8) < 8) + { + DEBUG_puts("1ippReadIO: Unable to read header."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + /* + * Then copy the request header over... + */ + + ipp->request.any.version[0] = buffer[0]; + ipp->request.any.version[1] = buffer[1]; + ipp->request.any.op_status = (buffer[2] << 8) | buffer[3]; + ipp->request.any.request_id = (((((buffer[4] << 8) | buffer[5]) << 8) | + buffer[6]) << 8) | buffer[7]; + + DEBUG_printf(("2ippReadIO: version=%d.%d", buffer[0], buffer[1])); + DEBUG_printf(("2ippReadIO: op_status=%04x", + ipp->request.any.op_status)); + DEBUG_printf(("2ippReadIO: request_id=%d", + ipp->request.any.request_id)); + } + + ipp->state = IPP_ATTRIBUTE; + ipp->current = NULL; + ipp->curtag = IPP_TAG_ZERO; + ipp->prev = ipp->last; + + /* + * If blocking is disabled, stop here... + */ + + if (!blocking) + break; + + case IPP_ATTRIBUTE : + for (;;) + { + if ((*cb)(src, buffer, 1) < 1) + { + DEBUG_puts("1ippReadIO: Callback returned EOF/error"); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p", + ipp->current, ipp->prev)); + + /* + * Read this attribute... + */ + + tag = (ipp_tag_t)buffer[0]; + + if (tag == IPP_TAG_END) + { + /* + * No more attributes left... + */ + + DEBUG_puts("2ippReadIO: IPP_TAG_END."); + if(getenv("PRINTER_LIST")) + ippFilterPrinters(ipp); + + ipp->state = IPP_DATA; + break; + } + else if (tag < IPP_TAG_UNSUPPORTED_VALUE) + { + /* + * Group tag... Set the current group and continue... + */ + + if (ipp->curtag == tag) + ipp->prev = ippAddSeparator(ipp); + else if (ipp->current) + ipp->prev = ipp->current; + + ipp->curtag = tag; + ipp->current = NULL; + DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag, + ippTagString(tag), ipp->prev)); + continue; + } + + DEBUG_printf(("2ippReadIO: value tag=%x(%s)", tag, + ippTagString(tag))); + + /* + * Get the name... + */ + + if ((*cb)(src, buffer, 2) < 2) + { + DEBUG_puts("1ippReadIO: unable to read name length."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + n = (buffer[0] << 8) | buffer[1]; + + if (n >= IPP_BUF_SIZE) + { + _cupsSetError(IPP_ERROR, _("IPP name larger than 32767 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad name length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + DEBUG_printf(("2ippReadIO: name length=%d", n)); + + if (n == 0 && tag != IPP_TAG_MEMBERNAME && + tag != IPP_TAG_END_COLLECTION) + { + /* + * More values for current attribute... + */ + + if (ipp->current == NULL) + { + _cupsSetError(IPP_ERROR, _("IPP attribute has no name."), 1); + DEBUG_puts("1ippReadIO: Attribute without name and no current."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + attr = ipp->current; + value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK); + + /* + * Make sure we aren't adding a new value of a different + * type... + */ + + if (value_tag == IPP_TAG_ZERO) + { + /* + * Setting the value of a collection member... + */ + + attr->value_tag = tag; + } + else if (value_tag == IPP_TAG_TEXTLANG || + value_tag == IPP_TAG_NAMELANG || + (value_tag >= IPP_TAG_TEXT && + value_tag <= IPP_TAG_MIMETYPE)) + { + /* + * String values can sometimes come across in different + * forms; accept sets of differing values... + */ + + if (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && + (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) && + tag != IPP_TAG_NOVALUE) + { + _cupsSetError(IPP_ERROR, + _("IPP 1setOf attribute with incompatible value " + "tags."), 1); + DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", + value_tag, ippTagString(value_tag), tag, + ippTagString(tag))); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + } + else if (value_tag == IPP_TAG_INTEGER || + value_tag == IPP_TAG_RANGE) + { + /* + * Integer and rangeOfInteger values can sometimes be mixed; accept + * sets of differing values... + */ + + if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE) + { + _cupsSetError(IPP_ERROR, + _("IPP 1setOf attribute with incompatible value " + "tags."), 1); + DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)", + value_tag, ippTagString(value_tag), tag, + ippTagString(tag))); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE) + { + /* + * Convert integer values to rangeOfInteger values... + */ + + int i; /* Looping var */ + + DEBUG_printf(("1ippReadIO: Converting %s attribute to " + "rangeOfInteger.", attr->name)); + + attr->value_tag = IPP_TAG_RANGE; + + for (i = attr->num_values, value = attr->values; + i > 0; + i --, value ++) + { + n = value->integer; + value->range.lower = value->range.upper = n; + } + } + } + else if (value_tag != tag) + { + _cupsSetError(IPP_ERROR, + _("IPP 1setOf attribute with incompatible value " + "tags."), 1); + DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)", + value_tag, ippTagString(value_tag), tag, + ippTagString(tag))); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + /* + * Finally, reallocate the attribute array as needed... + */ + + if (attr->num_values == 1 || + (attr->num_values > 0 && + (attr->num_values & (IPP_MAX_VALUES - 1)) == 0)) + { + ipp_attribute_t *temp; /* Pointer to new buffer */ + + DEBUG_printf(("2ippReadIO: reallocating for up to %d values...", + attr->num_values + IPP_MAX_VALUES)); + + /* + * Reallocate memory... + */ + + if ((temp = realloc(attr, sizeof(ipp_attribute_t) + + (attr->num_values + IPP_MAX_VALUES - 1) * + sizeof(ipp_value_t))) == NULL) + { + _cupsSetHTTPError(HTTP_ERROR); + DEBUG_puts("1ippReadIO: Unable to resize attribute"); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if (temp != attr) + { + /* + * Reset pointers in the list... + */ + + if (ipp->prev) + ipp->prev->next = temp; + else + ipp->attrs = temp; + + attr = ipp->current = ipp->last = temp; + } + } + } + else if (tag == IPP_TAG_MEMBERNAME) + { + /* + * Name must be length 0! + */ + + if (n) + { + _cupsSetError(IPP_ERROR, _("IPP member name is not empty."), 1); + DEBUG_puts("1ippReadIO: member name not empty."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if (ipp->current) + ipp->prev = ipp->current; + + attr = ipp->current = _ippAddAttr(ipp, 1); + + DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, " + "ipp->prev=%p", ipp->current, ipp->prev)); + + attr->group_tag = ipp->curtag; + attr->value_tag = IPP_TAG_ZERO; + attr->num_values = 0; + } + else if (tag != IPP_TAG_END_COLLECTION) + { + /* + * New attribute; read the name and add it... + */ + + if ((*cb)(src, buffer, n) < n) + { + DEBUG_puts("1ippReadIO: unable to read name."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + buffer[n] = '\0'; + + if (ipp->current) + ipp->prev = ipp->current; + + if ((attr = ipp->current = _ippAddAttr(ipp, 1)) == NULL) + { + _cupsSetHTTPError(HTTP_ERROR); + DEBUG_puts("1ippReadIO: unable to allocate attribute."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, " + "ipp->prev=%p", buffer, ipp->current, ipp->prev)); + + attr->group_tag = ipp->curtag; + attr->value_tag = tag; + attr->name = _cupsStrAlloc((char *)buffer); + attr->num_values = 0; + } + else + attr = NULL; + + if (tag != IPP_TAG_END_COLLECTION) + value = attr->values + attr->num_values; + else + value = NULL; + + if ((*cb)(src, buffer, 2) < 2) + { + DEBUG_puts("1ippReadIO: unable to read value length."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + n = (buffer[0] << 8) | buffer[1]; + DEBUG_printf(("2ippReadIO: value length=%d", n)); + + if (n >= IPP_BUF_SIZE) + { + _cupsSetError(IPP_ERROR, + _("IPP value larger than 32767 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + switch (tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + if (n != 4) + { + if (tag == IPP_TAG_INTEGER) + _cupsSetError(IPP_ERROR, + _("IPP integer value not 4 bytes."), 1); + else + _cupsSetError(IPP_ERROR, + _("IPP enum value not 4 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, buffer, 4) < 4) + { + DEBUG_puts("1ippReadIO: Unable to read integer value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | + buffer[3]; + + if (attr->value_tag == IPP_TAG_RANGE) + value->range.lower = value->range.upper = n; + else + value->integer = n; + break; + + case IPP_TAG_BOOLEAN : + if (n != 1) + { + _cupsSetError(IPP_ERROR, _("IPP boolean value not 1 byte."), + 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, buffer, 1) < 1) + { + DEBUG_puts("1ippReadIO: Unable to read boolean value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + value->boolean = buffer[0]; + break; + + case IPP_TAG_NOVALUE : + case IPP_TAG_NOTSETTABLE : + case IPP_TAG_DELETEATTR : + case IPP_TAG_ADMINDEFINE : + /* + * These value types are not supposed to have values, however + * some vendors (Brother) do not implement IPP correctly and so + * we need to map non-empty values to text... + */ + + if (attr->value_tag == tag) + { + if (n == 0) + break; + + attr->value_tag = IPP_TAG_TEXT; + } + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + if ((*cb)(src, buffer, n) < n) + { + DEBUG_puts("1ippReadIO: unable to read string value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + buffer[n] = '\0'; + value->string.text = _cupsStrAlloc((char *)buffer); + DEBUG_printf(("2ippReadIO: value=\"%s\"", value->string.text)); + break; + + case IPP_TAG_DATE : + if (n != 11) + { + _cupsSetError(IPP_ERROR, _("IPP date value not 11 bytes."), + 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, value->date, 11) < 11) + { + DEBUG_puts("1ippReadIO: Unable to read date value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + break; + + case IPP_TAG_RESOLUTION : + if (n != 9) + { + _cupsSetError(IPP_ERROR, + _("IPP resolution value not 9 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, buffer, 9) < 9) + { + DEBUG_puts("1ippReadIO: Unable to read resolution value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + value->resolution.xres = + (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | + buffer[3]; + value->resolution.yres = + (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) | + buffer[7]; + value->resolution.units = + (ipp_res_t)buffer[8]; + break; + + case IPP_TAG_RANGE : + if (n != 8) + { + _cupsSetError(IPP_ERROR, + _("IPP rangeOfInteger value not 8 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, buffer, 8) < 8) + { + DEBUG_puts("1ippReadIO: Unable to read range value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + value->range.lower = + (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) | + buffer[3]; + value->range.upper = + (((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) | + buffer[7]; + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + if (n < 4) + { + if (tag == IPP_TAG_TEXTLANG) + _cupsSetError(IPP_ERROR, + _("IPP textWithLanguage value less than " + "minimum 4 bytes."), 1); + else + _cupsSetError(IPP_ERROR, + _("IPP nameWithLanguage value less than " + "minimum 4 bytes."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, buffer, n) < n) + { + DEBUG_puts("1ippReadIO: Unable to read string w/language " + "value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + + /* + * text-with-language and name-with-language are composite + * values: + * + * language-length + * language + * text-length + * text + * + * The "charset" field name is an unfortunate typo from + * CUPS 1.0... + */ + + n = (bufptr[0] << 8) | bufptr[1]; + + if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || + n >= sizeof(string)) + { + _cupsSetError(IPP_ERROR, + _("IPP language length overflows value."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + memcpy(string, bufptr + 2, n); + string[n] = '\0'; + + value->string.charset = _cupsStrAlloc((char *)string); + + bufptr += 2 + n; + n = (bufptr[0] << 8) | bufptr[1]; + + if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE)) + { + _cupsSetError(IPP_ERROR, + _("IPP string length overflows value."), 1); + DEBUG_printf(("1ippReadIO: bad value length %d.", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr[2 + n] = '\0'; + value->string.text = _cupsStrAlloc((char *)bufptr + 2); + break; + + case IPP_TAG_BEGIN_COLLECTION : + /* + * Oh, boy, here comes a collection value, so read it... + */ + + value->collection = ippNew(); + + if (n > 0) + { + _cupsSetError(IPP_ERROR, + _("IPP begCollection value not 0 bytes."), 1); + DEBUG_puts("1ippReadIO: begCollection tag with value length " + "> 0."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_ERROR) + { + DEBUG_puts("1ippReadIO: Unable to read collection value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + break; + + case IPP_TAG_END_COLLECTION : + ipp_buffer_release(buffer); + + if (n > 0) + { + _cupsSetError(IPP_ERROR, + _("IPP endCollection value not 0 bytes."), 1); + DEBUG_puts("1ippReadIO: endCollection tag with value length " + "> 0."); + return (IPP_ERROR); + } + + DEBUG_puts("1ippReadIO: endCollection tag..."); + return (ipp->state = IPP_DATA); + + case IPP_TAG_MEMBERNAME : + /* + * The value the name of the member in the collection, which + * we need to carry over... + */ + + if ((*cb)(src, buffer, n) < n) + { + DEBUG_puts("1ippReadIO: Unable to read member name value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + buffer[n] = '\0'; + attr->name = _cupsStrAlloc((char *)buffer); + + /* + * Since collection members are encoded differently than + * regular attributes, make sure we don't start with an + * empty value... + */ + + attr->num_values --; + + DEBUG_printf(("2ippReadIO: member name=\"%s\"", attr->name)); + break; + + default : /* Other unsupported values */ + value->unknown.length = n; + if (n > 0) + { + if ((value->unknown.data = malloc(n)) == NULL) + { + _cupsSetHTTPError(HTTP_ERROR); + DEBUG_puts("1ippReadIO: Unable to allocate value"); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((*cb)(src, value->unknown.data, n) < n) + { + DEBUG_puts("1ippReadIO: Unable to read unsupported value."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + } + else + value->unknown.data = NULL; + break; + } + + attr->num_values ++; + + /* + * If blocking is disabled, stop here... + */ + + if (!blocking) + break; + } + break; + + case IPP_DATA : + break; + + default : + break; /* anti-compiler-warning-code */ + } + + DEBUG_printf(("1ippReadIO: returning ipp->state=%d.", ipp->state)); + ipp_buffer_release(buffer); + + return (ipp->state); +} + + +/* + * 'ippTimeToDate()' - Convert from UNIX time to RFC 1903 format. + */ + +const ipp_uchar_t * /* O - RFC-1903 date/time data */ +ippTimeToDate(time_t t) /* I - UNIX time value */ +{ + struct tm *unixdate; /* UNIX unixdate/time info */ + ipp_uchar_t *date = _cupsGlobals()->ipp_date; + /* RFC-1903 date/time data */ + + + /* + * RFC-1903 date/time format is: + * + * Byte(s) Description + * ------- ----------- + * 0-1 Year (0 to 65535) + * 2 Month (1 to 12) + * 3 Day (1 to 31) + * 4 Hours (0 to 23) + * 5 Minutes (0 to 59) + * 6 Seconds (0 to 60, 60 = "leap second") + * 7 Deciseconds (0 to 9) + * 8 +/- UTC + * 9 UTC hours (0 to 11) + * 10 UTC minutes (0 to 59) + */ + + unixdate = gmtime(&t); + unixdate->tm_year += 1900; + + date[0] = unixdate->tm_year >> 8; + date[1] = unixdate->tm_year; + date[2] = unixdate->tm_mon + 1; + date[3] = unixdate->tm_mday; + date[4] = unixdate->tm_hour; + date[5] = unixdate->tm_min; + date[6] = unixdate->tm_sec; + date[7] = 0; + date[8] = '+'; + date[9] = 0; + date[10] = 0; + + return (date); +} + + +/* + * 'ippWrite()' - Write data for an IPP message to a HTTP connection. + */ + +ipp_state_t /* O - Current state */ +ippWrite(http_t *http, /* I - HTTP connection */ + ipp_t *ipp) /* I - IPP data */ +{ + DEBUG_printf(("ippWrite(http=%p, ipp=%p)", http, ipp)); + + if (!http) + return (IPP_ERROR); + + return (ippWriteIO(http, (ipp_iocb_t)httpWrite2, http->blocking, NULL, ipp)); +} + + +/* + * 'ippWriteFile()' - Write data for an IPP message to a file. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ipp_state_t /* O - Current state */ +ippWriteFile(int fd, /* I - HTTP data */ + ipp_t *ipp) /* I - IPP data */ +{ + DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, ipp)); + + ipp->state = IPP_IDLE; + + return (ippWriteIO(&fd, (ipp_iocb_t)ipp_write_file, 1, NULL, ipp)); +} + + +/* + * 'ippWriteIO()' - Write data for an IPP message. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ipp_state_t /* O - Current state */ +ippWriteIO(void *dst, /* I - Destination */ + ipp_iocb_t cb, /* I - Write callback function */ + int blocking, /* I - Use blocking IO? */ + ipp_t *parent, /* I - Parent IPP message */ + ipp_t *ipp) /* I - IPP data */ +{ + int i; /* Looping var */ + int n; /* Length of data */ + unsigned char *buffer, /* Data buffer */ + *bufptr; /* Pointer into buffer */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", + dst, cb, blocking, parent, ipp)); + + if (!dst || !ipp) + return (IPP_ERROR); + + if ((buffer = ipp_buffer_get()) == NULL) + { + DEBUG_puts("1ippWriteIO: Unable to get write buffer"); + return (IPP_ERROR); + } + + switch (ipp->state) + { + case IPP_IDLE : + ipp->state ++; /* Avoid common problem... */ + + case IPP_HEADER : + if (parent == NULL) + { + /* + * Send the request header: + * + * Version = 2 bytes + * Operation/Status Code = 2 bytes + * Request ID = 4 bytes + * Total = 8 bytes + */ + + bufptr = buffer; + + *bufptr++ = ipp->request.any.version[0]; + *bufptr++ = ipp->request.any.version[1]; + *bufptr++ = ipp->request.any.op_status >> 8; + *bufptr++ = ipp->request.any.op_status; + *bufptr++ = ipp->request.any.request_id >> 24; + *bufptr++ = ipp->request.any.request_id >> 16; + *bufptr++ = ipp->request.any.request_id >> 8; + *bufptr++ = ipp->request.any.request_id; + + DEBUG_printf(("2ippWriteIO: version=%d.%d", buffer[0], buffer[1])); + DEBUG_printf(("2ippWriteIO: op_status=%04x", + ipp->request.any.op_status)); + DEBUG_printf(("2ippWriteIO: request_id=%d", + ipp->request.any.request_id)); + + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP header..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + } + + /* + * Reset the state engine to point to the first attribute + * in the request/response, with no current group. + */ + + ipp->state = IPP_ATTRIBUTE; + ipp->current = ipp->attrs; + ipp->curtag = IPP_TAG_ZERO; + + DEBUG_printf(("1ippWriteIO: ipp->current=%p", ipp->current)); + + /* + * If blocking is disabled, stop here... + */ + + if (!blocking) + break; + + case IPP_ATTRIBUTE : + while (ipp->current != NULL) + { + /* + * Write this attribute... + */ + + bufptr = buffer; + attr = ipp->current; + + ipp->current = ipp->current->next; + + if (!parent) + { + if (ipp->curtag != attr->group_tag) + { + /* + * Send a group tag byte... + */ + + ipp->curtag = attr->group_tag; + + if (attr->group_tag == IPP_TAG_ZERO) + continue; + + DEBUG_printf(("2ippWriteIO: wrote group tag=%x(%s)", + attr->group_tag, ippTagString(attr->group_tag))); + *bufptr++ = attr->group_tag; + } + else if (attr->group_tag == IPP_TAG_ZERO) + continue; + } + + DEBUG_printf(("1ippWriteIO: %s (%s%s)", attr->name, + attr->num_values > 1 ? "1setOf " : "", + ippTagString(attr->value_tag))); + + /* + * Write the attribute tag and name. The current implementation + * does not support the extension value tags above 0x7f, so all + * value tags are 1 byte. + * + * The attribute name length does not include the trailing nul + * character in the source string. + * + * Collection values (parent != NULL) are written differently... + */ + + if (parent == NULL) + { + /* + * Get the length of the attribute name, and make sure it won't + * overflow the buffer... + */ + + if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 4)) + { + DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + /* + * Write the value tag, name length, and name string... + */ + + DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", + attr->value_tag, ippTagString(attr->value_tag))); + DEBUG_printf(("2ippWriteIO: writing name=%d,\"%s\"", n, + attr->name)); + + *bufptr++ = attr->value_tag; + *bufptr++ = n >> 8; + *bufptr++ = n; + memcpy(bufptr, attr->name, n); + bufptr += n; + } + else + { + /* + * Get the length of the attribute name, and make sure it won't + * overflow the buffer... + */ + + if ((n = (int)strlen(attr->name)) > (IPP_BUF_SIZE - 7)) + { + DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + /* + * Write the member name tag, name length, name string, value tag, + * and empty name for the collection member attribute... + */ + + DEBUG_printf(("2ippWriteIO: writing value tag=%x(memberName)", + IPP_TAG_MEMBERNAME)); + DEBUG_printf(("2ippWriteIO: writing name=%d,\"%s\"", n, + attr->name)); + DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", + attr->value_tag, ippTagString(attr->value_tag))); + DEBUG_puts("2ippWriteIO: writing name=0,\"\""); + + *bufptr++ = IPP_TAG_MEMBERNAME; + *bufptr++ = 0; + *bufptr++ = 0; + *bufptr++ = n >> 8; + *bufptr++ = n; + memcpy(bufptr, attr->name, n); + bufptr += n; + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Now write the attribute value(s)... + */ + + switch (attr->value_tag & ~IPP_TAG_COPY) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Integers and enumerations are both 4-byte signed + * (twos-complement) values. + * + * Put the 2-byte length and 4-byte value into the buffer... + */ + + *bufptr++ = 0; + *bufptr++ = 4; + *bufptr++ = value->integer >> 24; + *bufptr++ = value->integer >> 16; + *bufptr++ = value->integer >> 8; + *bufptr++ = value->integer; + } + break; + + case IPP_TAG_BOOLEAN : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Boolean values are 1-byte; 0 = false, 1 = true. + * + * Put the 2-byte length and 1-byte value into the buffer... + */ + + *bufptr++ = 0; + *bufptr++ = 1; + *bufptr++ = value->boolean; + } + break; + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + DEBUG_printf(("2ippWriteIO: writing value tag=%x(%s)", + attr->value_tag, + ippTagString(attr->value_tag))); + DEBUG_printf(("2ippWriteIO: writing name=0,\"\"")); + + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + if (value->string.text != NULL) + n = (int)strlen(value->string.text); + else + n = 0; + + if (n > (IPP_BUF_SIZE - 2)) + { + DEBUG_printf(("1ippWriteIO: String too long (%d)", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + DEBUG_printf(("2ippWriteIO: writing string=%d,\"%s\"", n, + value->string.text)); + + if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + /* + * All simple strings consist of the 2-byte length and + * character data without the trailing nul normally found + * in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH + * bytes since the 2-byte length is a signed (twos-complement) + * value. + * + * Put the 2-byte length and string characters in the buffer. + */ + + *bufptr++ = n >> 8; + *bufptr++ = n; + + if (n > 0) + { + memcpy(bufptr, value->string.text, n); + bufptr += n; + } + } + break; + + case IPP_TAG_DATE : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Date values consist of a 2-byte length and an + * 11-byte date/time structure defined by RFC 1903. + * + * Put the 2-byte length and 11-byte date/time + * structure in the buffer. + */ + + *bufptr++ = 0; + *bufptr++ = 11; + memcpy(bufptr, value->date, 11); + bufptr += 11; + } + break; + + case IPP_TAG_RESOLUTION : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Resolution values consist of a 2-byte length, + * 4-byte horizontal resolution value, 4-byte vertical + * resolution value, and a 1-byte units value. + * + * Put the 2-byte length and resolution value data + * into the buffer. + */ + + *bufptr++ = 0; + *bufptr++ = 9; + *bufptr++ = value->resolution.xres >> 24; + *bufptr++ = value->resolution.xres >> 16; + *bufptr++ = value->resolution.xres >> 8; + *bufptr++ = value->resolution.xres; + *bufptr++ = value->resolution.yres >> 24; + *bufptr++ = value->resolution.yres >> 16; + *bufptr++ = value->resolution.yres >> 8; + *bufptr++ = value->resolution.yres; + *bufptr++ = value->resolution.units; + } + break; + + case IPP_TAG_RANGE : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Range values consist of a 2-byte length, + * 4-byte lower value, and 4-byte upper value. + * + * Put the 2-byte length and range value data + * into the buffer. + */ + + *bufptr++ = 0; + *bufptr++ = 8; + *bufptr++ = value->range.lower >> 24; + *bufptr++ = value->range.lower >> 16; + *bufptr++ = value->range.lower >> 8; + *bufptr++ = value->range.lower; + *bufptr++ = value->range.upper >> 24; + *bufptr++ = value->range.upper >> 16; + *bufptr++ = value->range.upper >> 8; + *bufptr++ = value->range.upper; + } + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * textWithLanguage and nameWithLanguage values consist + * of a 2-byte length for both strings and their + * individual lengths, a 2-byte length for the + * character string, the character string without the + * trailing nul, a 2-byte length for the character + * set string, and the character set string without + * the trailing nul. + */ + + n = 4; + + if (value->string.charset != NULL) + n += (int)strlen(value->string.charset); + + if (value->string.text != NULL) + n += (int)strlen(value->string.text); + + if (n > (IPP_BUF_SIZE - 2)) + { + DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value " + "too long (%d)", n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + /* Length of entire value */ + *bufptr++ = n >> 8; + *bufptr++ = n; + + /* Length of charset */ + if (value->string.charset != NULL) + n = (int)strlen(value->string.charset); + else + n = 0; + + *bufptr++ = n >> 8; + *bufptr++ = n; + + /* Charset */ + if (n > 0) + { + memcpy(bufptr, value->string.charset, n); + bufptr += n; + } + + /* Length of text */ + if (value->string.text != NULL) + n = (int)strlen(value->string.text); + else + n = 0; + + *bufptr++ = n >> 8; + *bufptr++ = n; + + /* Text */ + if (n > 0) + { + memcpy(bufptr, value->string.text, n); + bufptr += n; + } + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + /* + * Collections are written with the begin-collection + * tag first with a value of 0 length, followed by the + * attributes in the collection, then the end-collection + * value... + */ + + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * Write a data length of 0 and flush the buffer... + */ + + *bufptr++ = 0; + *bufptr++ = 0; + + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + + /* + * Then write the collection attribute... + */ + + value->collection->state = IPP_IDLE; + + if (ippWriteIO(dst, cb, 1, ipp, + value->collection) == IPP_ERROR) + { + DEBUG_puts("1ippWriteIO: Unable to write collection value"); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + } + break; + + default : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if (i) + { + /* + * Arrays and sets are done by sending additional + * values with a zero-length name... + */ + + if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + *bufptr++ = attr->value_tag; + *bufptr++ = 0; + *bufptr++ = 0; + } + + /* + * An unknown value might some new value that a + * vendor has come up with. It consists of a + * 2-byte length and the bytes in the unknown + * value buffer. + */ + + n = value->unknown.length; + + if (n > (IPP_BUF_SIZE - 2)) + { + DEBUG_printf(("1ippWriteIO: Data length too long (%d)", + n)); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2)) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP " + "attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + bufptr = buffer; + } + + /* Length of unknown value */ + *bufptr++ = n >> 8; + *bufptr++ = n; + + /* Value */ + if (n > 0) + { + memcpy(bufptr, value->unknown.data, n); + bufptr += n; + } + } + break; + } + + /* + * Write the data out... + */ + + if (bufptr > buffer) + { + if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP attribute..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + DEBUG_printf(("2ippWriteIO: wrote %d bytes", + (int)(bufptr - buffer))); + } + + /* + * If blocking is disabled, stop here... + */ + + if (!blocking) + break; + } + + if (ipp->current == NULL) + { + /* + * Done with all of the attributes; add the end-of-attributes + * tag or end-collection attribute... + */ + + if (parent == NULL) + { + buffer[0] = IPP_TAG_END; + n = 1; + } + else + { + buffer[0] = IPP_TAG_END_COLLECTION; + buffer[1] = 0; /* empty name */ + buffer[2] = 0; + buffer[3] = 0; /* empty value */ + buffer[4] = 0; + n = 5; + } + + if ((*cb)(dst, buffer, n) < 0) + { + DEBUG_puts("1ippWriteIO: Could not write IPP end-tag..."); + ipp_buffer_release(buffer); + return (IPP_ERROR); + } + + ipp->state = IPP_DATA; + } + break; + + case IPP_DATA : + break; + + default : + break; /* anti-compiler-warning-code */ + } + + ipp_buffer_release(buffer); + + return (ipp->state); +} + + +/* + * '_ippAddAttr()' - Add a new attribute to the request. + */ + +ipp_attribute_t * /* O - New attribute */ +_ippAddAttr(ipp_t *ipp, /* I - IPP message */ + int num_values) /* I - Number of values */ +{ + ipp_attribute_t *attr; /* New attribute */ + + + DEBUG_printf(("4_ippAddAttr(ipp=%p, num_values=%d)", ipp, num_values)); + + if (!ipp || num_values < 0) + return (NULL); + + attr = calloc(sizeof(ipp_attribute_t) + + (num_values - 1) * sizeof(ipp_value_t), 1); + + if (attr != NULL) + { + attr->num_values = num_values; + + if (ipp->last == NULL) + ipp->attrs = attr; + else + ipp->last->next = attr; + + ipp->last = attr; + } + + DEBUG_printf(("5_ippAddAttr: Returning %p", attr)); + + return (attr); +} + + +/* + * '_ippFreeAttr()' - Free an attribute. + */ + +void +_ippFreeAttr(ipp_attribute_t *attr) /* I - Attribute to free */ +{ + int i; /* Looping var */ + ipp_value_t *value; /* Current value */ + + + DEBUG_printf(("4_ippFreeAttr(attr=%p)", attr)); + + switch (attr->value_tag) + { + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_RESERVED_STRING : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + _cupsStrFree(value->string.text); + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if (value->string.charset && i == 0) + _cupsStrFree(value->string.charset); + _cupsStrFree(value->string.text); + } + break; + + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + case IPP_TAG_BOOLEAN : + case IPP_TAG_DATE : + case IPP_TAG_RESOLUTION : + case IPP_TAG_RANGE : + break; + + case IPP_TAG_BEGIN_COLLECTION : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + ippDelete(value->collection); + break; + + case IPP_TAG_STRING : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + free(value->unknown.data); + break; + + default : + if (!((int)attr->value_tag & IPP_TAG_COPY)) + { + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + if (value->unknown.data) + free(value->unknown.data); + } + break; + } + + if (attr->name) + _cupsStrFree(attr->name); + + free(attr); +} + + +/* + * 'ipp_buffer_get()' - Get a read/write buffer. + */ + +static unsigned char * /* O - Buffer */ +ipp_buffer_get(void) +{ + _ipp_buffer_t *buffer; /* Current buffer */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + for (buffer = cg->ipp_buffers; buffer; buffer = buffer->next) + if (!buffer->used) + { + buffer->used = 1; + return (buffer->d); + } + + if ((buffer = malloc(sizeof(_ipp_buffer_t))) == NULL) + return (NULL); + + buffer->used = 1; + buffer->next = cg->ipp_buffers; + cg->ipp_buffers = buffer; + + return (buffer->d); +} + + +/* + * 'ipp_buffer_release()' - Release a read/write buffer. + */ + +static void +ipp_buffer_release(unsigned char *b) /* I - Buffer to release */ +{ + ((_ipp_buffer_t *)b)->used = 0; +} + + +/* + * 'ipp_length()' - Compute the length of an IPP message or collection value. + */ + +static size_t /* O - Size of IPP message */ +ipp_length(ipp_t *ipp, /* I - IPP message or collection */ + int collection) /* I - 1 if a collection, 0 otherwise */ +{ + int i; /* Looping var */ + int bytes; /* Number of bytes */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_tag_t group; /* Current group */ + ipp_value_t *value; /* Current value */ + + + if (ipp == NULL) + return (0); + + /* + * Start with 8 bytes for the IPP message header... + */ + + bytes = collection ? 0 : 8; + + /* + * Then add the lengths of each attribute... + */ + + group = IPP_TAG_ZERO; + + for (attr = ipp->attrs; attr != NULL; attr = attr->next) + { + if (attr->group_tag != group && !collection) + { + group = attr->group_tag; + if (group == IPP_TAG_ZERO) + continue; + + bytes ++; /* Group tag */ + } + + if (!attr->name) + continue; + + DEBUG_printf(("9ipp_length: attr->name=\"%s\", attr->num_values=%d, " + "bytes=%d", attr->name, attr->num_values, bytes)); + + bytes += (int)strlen(attr->name); /* Name */ + bytes += attr->num_values; /* Value tag for each value */ + bytes += 2 * attr->num_values; /* Name lengths */ + bytes += 2 * attr->num_values; /* Value lengths */ + + if (collection) + bytes += 5; /* Add membername overhead */ + + switch (attr->value_tag & ~IPP_TAG_COPY) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + bytes += 4 * attr->num_values; + break; + + case IPP_TAG_BOOLEAN : + bytes += attr->num_values; + break; + + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + if (value->string.text != NULL) + bytes += (int)strlen(value->string.text); + break; + + case IPP_TAG_DATE : + bytes += 11 * attr->num_values; + break; + + case IPP_TAG_RESOLUTION : + bytes += 9 * attr->num_values; + break; + + case IPP_TAG_RANGE : + bytes += 8 * attr->num_values; + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + bytes += 4 * attr->num_values;/* Charset + text length */ + + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + { + if (value->string.charset != NULL) + bytes += (int)strlen(value->string.charset); + + if (value->string.text != NULL) + bytes += (int)strlen(value->string.text); + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + bytes += (int)ipp_length(value->collection, 1); + break; + + default : + for (i = 0, value = attr->values; + i < attr->num_values; + i ++, value ++) + bytes += value->unknown.length; + break; + } + } + + /* + * Finally, add 1 byte for the "end of attributes" tag or 5 bytes + * for the "end of collection" tag and return... + */ + + if (collection) + bytes += 5; + else + bytes ++; + + DEBUG_printf(("8ipp_length: Returning %d bytes", bytes)); + + return (bytes); +} + + +/* + * 'ipp_read_http()' - Semi-blocking read on a HTTP connection... + */ + +static ssize_t /* O - Number of bytes read */ +ipp_read_http(http_t *http, /* I - Client connection */ + ipp_uchar_t *buffer, /* O - Buffer for data */ + size_t length) /* I - Total length */ +{ + int tbytes, /* Total bytes read */ + bytes; /* Bytes read this pass */ + + + DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)", + http, buffer, (int)length)); + + /* + * Loop until all bytes are read... + */ + + for (tbytes = 0, bytes = 0; + tbytes < (int)length; + tbytes += bytes, buffer += bytes) + { + DEBUG_printf(("9ipp_read_http: tbytes=%d, http->state=%d", tbytes, + http->state)); + + if (http->state == HTTP_WAITING) + break; + + if (http->used == 0 && !http->blocking) + { + /* + * Wait up to 10 seconds for more data on non-blocking sockets... + */ + + if (!httpWait(http, 10000)) + { + /* + * Signal no data... + */ + + bytes = -1; + break; + } + } + + if ((bytes = httpRead2(http, (char *)buffer, length - tbytes)) < 0) + { +#ifdef WIN32 + break; +#else + if (errno != EAGAIN && errno != EINTR) + break; + + bytes = 0; +#endif /* WIN32 */ + } + else if (bytes == 0) + break; + } + + /* + * Return the number of bytes read... + */ + + if (tbytes == 0 && bytes < 0) + tbytes = -1; + + DEBUG_printf(("8ipp_read_http: Returning %d bytes", tbytes)); + + return (tbytes); +} + + +/* + * 'ipp_read_file()' - Read IPP data from a file. + */ + +static ssize_t /* O - Number of bytes read */ +ipp_read_file(int *fd, /* I - File descriptor */ + ipp_uchar_t *buffer, /* O - Read buffer */ + size_t length) /* I - Number of bytes to read */ +{ +#ifdef WIN32 + return ((ssize_t)read(*fd, buffer, (unsigned)length)); +#else + return (read(*fd, buffer, length)); +#endif /* WIN32 */ +} + + +/* + * 'ipp_write_file()' - Write IPP data to a file. + */ + +static ssize_t /* O - Number of bytes written */ +ipp_write_file(int *fd, /* I - File descriptor */ + ipp_uchar_t *buffer, /* I - Data to write */ + size_t length) /* I - Number of bytes to write */ +{ +#ifdef WIN32 + return ((ssize_t)write(*fd, buffer, (unsigned)length)); +#else + return (write(*fd, buffer, length)); +#endif /* WIN32 */ +} + + +#ifdef __linux +/* + * The following symbol definitions are provided only for KDE + * compatibility during the CUPS 1.2 testing period and will be + * removed in a future release of CUPS. These are PRIVATE APIs + * from CUPS 1.1.x that the KDE developers chose to use... + */ + +ipp_attribute_t * /* O - New attribute */ +_ipp_add_attr(ipp_t *ipp, /* I - IPP message */ + int num_values) /* I - Number of values */ +{ + return (_ippAddAttr(ipp, num_values)); +} + +void +_ipp_free_attr(ipp_attribute_t *attr) /* I - Attribute to free */ +{ + _ippFreeAttr(attr); +} +#endif /* __linux */ + + +/* + * End of "$Id: ipp.c 10450 2012-05-04 22:52:56Z mike $". + */ diff --git a/cups/ipp.h b/cups/ipp.h new file mode 100644 index 0000000..6d6a6f0 --- /dev/null +++ b/cups/ipp.h @@ -0,0 +1,522 @@ +/* + * "$Id: ipp.h 10108 2011-11-04 22:22:22Z mike $" + * + * Internet Printing Protocol definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_IPP_H_ +# define _CUPS_IPP_H_ + +/* + * Include necessary headers... + */ + +# include "http.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * IPP version string... + */ + +# define IPP_VERSION "\002\001" + +/* + * IPP registered port number... + * + * Note: Applications should never use IPP_PORT, but instead use the + * ippPort() function to allow overrides via the IPP_PORT environment + * variable and services file if needed! + */ + +# define IPP_PORT 631 + +/* + * Common limits... + */ + +# define IPP_MAX_LENGTH 32767 /* Maximum size of any single value */ +# define IPP_MAX_NAME 256 /* Maximum length of common name values */ +# define IPP_MAX_VALUES 8 /* Power-of-2 allocation increment */ + + +/* + * Types and structures... + */ + +typedef enum ipp_tag_e /**** Format tags for attributes ****/ +{ + IPP_TAG_ZERO = 0x00, /* Zero tag - used for separators */ + IPP_TAG_OPERATION, /* Operation group */ + IPP_TAG_JOB, /* Job group */ + IPP_TAG_END, /* End-of-attributes */ + IPP_TAG_PRINTER, /* Printer group */ + IPP_TAG_UNSUPPORTED_GROUP, /* Unsupported attributes group */ + IPP_TAG_SUBSCRIPTION, /* Subscription group */ + IPP_TAG_EVENT_NOTIFICATION, /* Event group */ + IPP_TAG_DOCUMENT = 0x09, /* Document group */ + IPP_TAG_UNSUPPORTED_VALUE = 0x10, /* Unsupported value */ + IPP_TAG_DEFAULT, /* Default value */ + IPP_TAG_UNKNOWN, /* Unknown value */ + IPP_TAG_NOVALUE, /* No-value value */ + IPP_TAG_NOTSETTABLE = 0x15, /* Not-settable value */ + IPP_TAG_DELETEATTR, /* Delete-attribute value */ + IPP_TAG_ADMINDEFINE, /* Admin-defined value */ + IPP_TAG_INTEGER = 0x21, /* Integer value */ + IPP_TAG_BOOLEAN, /* Boolean value */ + IPP_TAG_ENUM, /* Enumeration value */ + IPP_TAG_STRING = 0x30, /* Octet string value */ + IPP_TAG_DATE, /* Date/time value */ + IPP_TAG_RESOLUTION, /* Resolution value */ + IPP_TAG_RANGE, /* Range value */ + IPP_TAG_BEGIN_COLLECTION, /* Beginning of collection value */ + IPP_TAG_TEXTLANG, /* Text-with-language value */ + IPP_TAG_NAMELANG, /* Name-with-language value */ + IPP_TAG_END_COLLECTION, /* End of collection value */ + IPP_TAG_TEXT = 0x41, /* Text value */ + IPP_TAG_NAME, /* Name value */ + IPP_TAG_RESERVED_STRING, /* Reserved for future string value @private@ */ + IPP_TAG_KEYWORD, /* Keyword value */ + IPP_TAG_URI, /* URI value */ + IPP_TAG_URISCHEME, /* URI scheme value */ + IPP_TAG_CHARSET, /* Character set value */ + IPP_TAG_LANGUAGE, /* Language value */ + IPP_TAG_MIMETYPE, /* MIME media type value */ + IPP_TAG_MEMBERNAME, /* Collection member name value */ + IPP_TAG_MASK = 0x7fffffff, /* Mask for copied attribute values */ + IPP_TAG_COPY = -0x7fffffff-1 /* Bitflag for copied attribute values */ +} ipp_tag_t; + +typedef enum ipp_res_e /**** Resolution units ****/ +{ + IPP_RES_PER_INCH = 3, /* Pixels per inch */ + IPP_RES_PER_CM /* Pixels per centimeter */ +} ipp_res_t; + +typedef enum ipp_finish_e /**** Finishings ****/ +{ + IPP_FINISHINGS_NONE = 3, /* No finishing */ + IPP_FINISHINGS_STAPLE, /* Staple (any location) */ + IPP_FINISHINGS_PUNCH, /* Punch (any location/count) */ + IPP_FINISHINGS_COVER, /* Add cover */ + IPP_FINISHINGS_BIND, /* Bind */ + IPP_FINISHINGS_SADDLE_STITCH, /* Staple interior */ + IPP_FINISHINGS_EDGE_STITCH, /* Stitch along any side */ + IPP_FINISHINGS_FOLD, /* Fold (any type) */ + IPP_FINISHINGS_TRIM, /* Trim (any type) */ + IPP_FINISHINGS_BALE, /* Bale (any type) */ + IPP_FINISHINGS_BOOKLET_MAKER, /* Fold to make booklet */ + IPP_FINISHINGS_JOB_OFFSET, /* Offset for binding (any type) */ + IPP_FINISHINGS_STAPLE_TOP_LEFT = 20, /* Staple top left corner */ + IPP_FINISHINGS_STAPLE_BOTTOM_LEFT, /* Staple bottom left corner */ + IPP_FINISHINGS_STAPLE_TOP_RIGHT, /* Staple top right corner */ + IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT, /* Staple bottom right corner */ + IPP_FINISHINGS_EDGE_STITCH_LEFT, /* Stitch along left side */ + IPP_FINISHINGS_EDGE_STITCH_TOP, /* Stitch along top edge */ + IPP_FINISHINGS_EDGE_STITCH_RIGHT, /* Stitch along right side */ + IPP_FINISHINGS_EDGE_STITCH_BOTTOM, /* Stitch along bottom edge */ + IPP_FINISHINGS_STAPLE_DUAL_LEFT, /* Two staples on left */ + IPP_FINISHINGS_STAPLE_DUAL_TOP, /* Two staples on top */ + IPP_FINISHINGS_STAPLE_DUAL_RIGHT, /* Two staples on right */ + IPP_FINISHINGS_STAPLE_DUAL_BOTTOM, /* Two staples on bottom */ + IPP_FINISHINGS_BIND_LEFT = 50, /* Bind on left */ + IPP_FINISHINGS_BIND_TOP, /* Bind on top */ + IPP_FINISHINGS_BIND_RIGHT, /* Bind on right */ + IPP_FINISHINGS_BIND_BOTTOM /* Bind on bottom */ +} ipp_finish_t; + +typedef enum ipp_orient_e /**** Orientation values ****/ +{ + IPP_PORTRAIT = 3, /* No rotation */ + IPP_LANDSCAPE, /* 90 degrees counter-clockwise */ + IPP_REVERSE_LANDSCAPE, /* 90 degrees clockwise */ + IPP_REVERSE_PORTRAIT /* 180 degrees */ +} ipp_orient_t; + +typedef enum ipp_quality_e /**** Qualities ****/ +{ + IPP_QUALITY_DRAFT = 3, /* Draft quality */ + IPP_QUALITY_NORMAL, /* Normal quality */ + IPP_QUALITY_HIGH /* High quality */ +} ipp_quality_t; + +typedef enum ipp_jstate_e /**** Job states ****/ +{ + IPP_JOB_PENDING = 3, /* Job is waiting to be printed */ + IPP_JOB_HELD, /* Job is held for printing */ + IPP_JOB_PROCESSING, /* Job is currently printing */ + IPP_JOB_STOPPED, /* Job has been stopped */ + IPP_JOB_CANCELED, /* Job has been canceled */ + IPP_JOB_ABORTED, /* Job has aborted due to error */ + IPP_JOB_COMPLETED /* Job has completed successfully */ +} ipp_jstate_t; +#define IPP_JOB_CANCELLED IPP_JOB_CANCELED + +typedef enum ipp_pstate_e /**** Printer states ****/ +{ + IPP_PRINTER_IDLE = 3, /* Printer is idle */ + IPP_PRINTER_PROCESSING, /* Printer is working */ + IPP_PRINTER_STOPPED /* Printer is stopped */ +} ipp_pstate_t; + +typedef enum ipp_state_e /**** IPP states ****/ +{ + IPP_ERROR = -1, /* An error occurred */ + IPP_IDLE, /* Nothing is happening/request completed */ + IPP_HEADER, /* The request header needs to be sent/received */ + IPP_ATTRIBUTE, /* One or more attributes need to be sent/received */ + IPP_DATA /* IPP request data needs to be sent/received */ +} ipp_state_t; + +typedef enum ipp_op_e /**** IPP operations ****/ +{ + IPP_PRINT_JOB = 0x0002, /* Print a single file */ + IPP_PRINT_URI, /* Print a single URL @private@ */ + IPP_VALIDATE_JOB, /* Validate job options */ + IPP_CREATE_JOB, /* Create an empty print job */ + IPP_SEND_DOCUMENT, /* Add a file to a job */ + IPP_SEND_URI, /* Add a URL to a job @private@ */ + IPP_CANCEL_JOB, /* Cancel a job */ + IPP_GET_JOB_ATTRIBUTES, /* Get job attributes */ + IPP_GET_JOBS, /* Get a list of jobs */ + IPP_GET_PRINTER_ATTRIBUTES, /* Get printer attributes */ + IPP_HOLD_JOB, /* Hold a job for printing */ + IPP_RELEASE_JOB, /* Release a job for printing */ + IPP_RESTART_JOB, /* Reprint a job */ + IPP_PAUSE_PRINTER = 0x0010, /* Stop a printer */ + IPP_RESUME_PRINTER, /* Start a printer */ + IPP_PURGE_JOBS, /* Cancel all jobs */ + IPP_SET_PRINTER_ATTRIBUTES, /* Set printer attributes @private@ */ + IPP_SET_JOB_ATTRIBUTES, /* Set job attributes */ + IPP_GET_PRINTER_SUPPORTED_VALUES, /* Get supported attribute values */ + IPP_CREATE_PRINTER_SUBSCRIPTION, /* Create a printer subscription @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_CREATE_JOB_SUBSCRIPTION, /* Create a job subscription @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_GET_SUBSCRIPTION_ATTRIBUTES, /* Get subscription attributes @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_GET_SUBSCRIPTIONS, /* Get list of subscriptions @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_RENEW_SUBSCRIPTION, /* Renew a printer subscription @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_CANCEL_SUBSCRIPTION, /* Cancel a subscription @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_GET_NOTIFICATIONS, /* Get notification events @since CUPS 1.2/Mac OS X 10.5@ */ + IPP_SEND_NOTIFICATIONS, /* Send notification events @private@ */ + IPP_GET_PRINT_SUPPORT_FILES = 0x0021, /* Get printer support files @private@ */ + IPP_ENABLE_PRINTER, /* Start a printer */ + IPP_DISABLE_PRINTER, /* Stop a printer */ + IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB, /* Stop printer after the current job @private@ */ + IPP_HOLD_NEW_JOBS, /* Hold new jobs @private@ */ + IPP_RELEASE_HELD_NEW_JOBS, /* Release new jobs @private@ */ + IPP_DEACTIVATE_PRINTER, /* Stop a printer @private@ */ + IPP_ACTIVATE_PRINTER, /* Start a printer @private@ */ + IPP_RESTART_PRINTER, /* Restart a printer @private@ */ + IPP_SHUTDOWN_PRINTER, /* Turn a printer off @private@ */ + IPP_STARTUP_PRINTER, /* Turn a printer on @private@ */ + IPP_REPROCESS_JOB, /* Reprint a job @private@ */ + IPP_CANCEL_CURRENT_JOB, /* Cancel the current job @private@ */ + IPP_SUSPEND_CURRENT_JOB, /* Suspend the current job @private@ */ + IPP_RESUME_JOB, /* Resume the current job @private@ */ + IPP_PROMOTE_JOB, /* Promote a job to print sooner @private@ */ + IPP_SCHEDULE_JOB_AFTER, /* Schedule a job to print after another @private@ */ + IPP_CANCEL_DOCUMENT = 0x0033, /* Cancel-Document @private@ */ + IPP_GET_DOCUMENT_ATTRIBUTES, /* Get-Document-Attributes @private@ */ + IPP_GET_DOCUMENTS, /* Get-Documents @private@ */ + IPP_DELETE_DOCUMENT, /* Delete-Document @private@ */ + IPP_SET_DOCUMENT_ATTRIBUTES, /* Set-Document-Attributes @private@ */ + IPP_CANCEL_JOBS, /* Cancel-Jobs */ + IPP_CANCEL_MY_JOBS, /* Cancel-My-Jobs */ + IPP_RESUBMIT_JOB, /* Resubmit-Job */ + IPP_CLOSE_JOB, /* Close-Job */ + IPP_IDENTIFY_PRINTER, /* Identify-Printer (proposed IPP JPS3) */ + IPP_PRIVATE = 0x4000, /* Reserved @private@ */ + CUPS_GET_DEFAULT, /* Get the default printer */ + CUPS_GET_PRINTERS, /* Get a list of printers and/or classes */ + CUPS_ADD_MODIFY_PRINTER, /* Add or modify a printer */ + CUPS_DELETE_PRINTER, /* Delete a printer */ + CUPS_GET_CLASSES, /* Get a list of classes @deprecated@ */ + CUPS_ADD_MODIFY_CLASS, /* Add or modify a class */ + CUPS_DELETE_CLASS, /* Delete a class */ + CUPS_ACCEPT_JOBS, /* Accept new jobs on a printer */ + CUPS_REJECT_JOBS, /* Reject new jobs on a printer */ + CUPS_SET_DEFAULT, /* Set the default printer */ + CUPS_GET_DEVICES, /* Get a list of supported devices */ + CUPS_GET_PPDS, /* Get a list of supported drivers */ + CUPS_MOVE_JOB, /* Move a job to a different printer */ + CUPS_AUTHENTICATE_JOB, /* Authenticate a job @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_GET_PPD, /* Get a PPD file @since CUPS 1.3/Mac OS X 10.5@ */ + CUPS_GET_DOCUMENT = 0x4027 /* Get a document file @since CUPS 1.4/Mac OS X 10.6@ */ +} ipp_op_t; + +/* Old names for the operations */ +#define CUPS_ADD_PRINTER CUPS_ADD_MODIFY_PRINTER +#define CUPS_ADD_CLASS CUPS_ADD_MODIFY_CLASS + +typedef enum ipp_status_e /**** IPP status codes ****/ +{ + IPP_OK = 0x0000, /* successful-ok */ + IPP_OK_SUBST, /* successful-ok-ignored-or-substituted-attributes */ + IPP_OK_CONFLICT, /* successful-ok-conflicting-attributes */ + IPP_OK_IGNORED_SUBSCRIPTIONS, /* successful-ok-ignored-subscriptions */ + IPP_OK_IGNORED_NOTIFICATIONS, /* successful-ok-ignored-notifications */ + IPP_OK_TOO_MANY_EVENTS, /* successful-ok-too-many-events */ + IPP_OK_BUT_CANCEL_SUBSCRIPTION, /* successful-ok-but-cancel-subscription */ + IPP_OK_EVENTS_COMPLETE, /* successful-ok-events-complete */ + IPP_REDIRECTION_OTHER_SITE = 0x200, /* redirection-other-site @private@ */ + CUPS_SEE_OTHER = 0x280, /* cups-see-other */ + IPP_BAD_REQUEST = 0x0400, /* client-error-bad-request */ + IPP_FORBIDDEN, /* client-error-forbidden */ + IPP_NOT_AUTHENTICATED, /* client-error-not-authenticated */ + IPP_NOT_AUTHORIZED, /* client-error-not-authorized */ + IPP_NOT_POSSIBLE, /* client-error-not-possible */ + IPP_TIMEOUT, /* client-error-timeout */ + IPP_NOT_FOUND, /* client-error-not-found */ + IPP_GONE, /* client-error-gone */ + IPP_REQUEST_ENTITY, /* client-error-request-entity-too-large */ + IPP_REQUEST_VALUE, /* client-error-request-value-too-long */ + IPP_DOCUMENT_FORMAT, /* client-error-document-format-not-supported */ + IPP_ATTRIBUTES, /* client-error-attributes-or-values-not-supported */ + IPP_URI_SCHEME, /* client-error-uri-scheme-not-supported */ + IPP_CHARSET, /* client-error-charset-not-supported */ + IPP_CONFLICT, /* client-error-conflicting-attributes */ + IPP_COMPRESSION_NOT_SUPPORTED, /* client-error-compression-not-supported */ + IPP_COMPRESSION_ERROR, /* client-error-compression-error */ + IPP_DOCUMENT_FORMAT_ERROR, /* client-error-document-format-error */ + IPP_DOCUMENT_ACCESS_ERROR, /* client-error-document-access-error */ + IPP_ATTRIBUTES_NOT_SETTABLE, /* client-error-attributes-not-settable */ + IPP_IGNORED_ALL_SUBSCRIPTIONS, /* client-error-ignored-all-subscriptions */ + IPP_TOO_MANY_SUBSCRIPTIONS, /* client-error-too-many-subscriptions */ + IPP_IGNORED_ALL_NOTIFICATIONS, /* client-error-ignored-all-notifications */ + IPP_PRINT_SUPPORT_FILE_NOT_FOUND, /* client-error-print-support-file-not-found */ + + IPP_INTERNAL_ERROR = 0x0500, /* server-error-internal-error */ + IPP_OPERATION_NOT_SUPPORTED, /* server-error-operation-not-supported */ + IPP_SERVICE_UNAVAILABLE, /* server-error-service-unavailable */ + IPP_VERSION_NOT_SUPPORTED, /* server-error-version-not-supported */ + IPP_DEVICE_ERROR, /* server-error-device-error */ + IPP_TEMPORARY_ERROR, /* server-error-temporary-error */ + IPP_NOT_ACCEPTING, /* server-error-not-accepting-jobs */ + IPP_PRINTER_BUSY, /* server-error-busy */ + IPP_ERROR_JOB_CANCELED, /* server-error-job-canceled */ + IPP_MULTIPLE_JOBS_NOT_SUPPORTED, /* server-error-multiple-document-jobs-not-supported */ + IPP_PRINTER_IS_DEACTIVATED, /* server-error-printer-is-deactivated */ + IPP_TOO_MANY_JOBS, /* server-error-too-many-jobs */ + IPP_TOO_MANY_DOCUMENTS, /* server-error-too-many-documents */ + + IPP_AUTHENTICATION_CANCELED = 0x1000, /* Authentication canceled by user @since CUPS 1.5/Mac OS X 10.7@ */ + IPP_PKI_ERROR, /* Error negotiating a secure connection @since CUPS 1.5/Mac OS X 10.7@ */ + IPP_UPGRADE_REQUIRED /* TLS upgrade required */ +} ipp_status_t; +#define IPP_ERROR_JOB_CANCELLED IPP_ERROR_JOB_CANCELED + +typedef unsigned char ipp_uchar_t; /**** Unsigned 8-bit integer/character ****/ + +/**** New in CUPS 1.2 ****/ +typedef ssize_t (*ipp_iocb_t)(void *, ipp_uchar_t *, size_t); + /**** IPP IO Callback Function @since CUPS 1.2/Mac OS X 10.5@ ****/ + +typedef union ipp_request_u /**** Request Header ****/ +{ + struct /* Any Header */ + { + ipp_uchar_t version[2]; /* Protocol version number */ + int op_status; /* Operation ID or status code*/ + int request_id; /* Request ID */ + } any; + + struct /* Operation Header */ + { + ipp_uchar_t version[2]; /* Protocol version number */ + ipp_op_t operation_id; /* Operation ID */ + int request_id; /* Request ID */ + } op; + + struct /* Status Header */ + { + ipp_uchar_t version[2]; /* Protocol version number */ + ipp_status_t status_code; /* Status code */ + int request_id; /* Request ID */ + } status; + + /**** New in CUPS 1.1.19 ****/ + struct /* Event Header @since CUPS 1.1.19/Mac OS X 10.3@ */ + { + ipp_uchar_t version[2]; /* Protocol version number */ + ipp_status_t status_code; /* Status code */ + int request_id; /* Request ID */ + } event; +} ipp_request_t; + +/**** New in CUPS 1.1.19 ****/ +typedef struct ipp_s ipp_t; + +typedef union ipp_value_u /**** Attribute Value ****/ +{ + int integer; /* Integer/enumerated value */ + + char boolean; /* Boolean value */ + + ipp_uchar_t date[11]; /* Date/time value */ + + struct + { + int xres, /* Horizontal resolution */ + yres; /* Vertical resolution */ + ipp_res_t units; /* Resolution units */ + } resolution; /* Resolution value */ + + struct + { + int lower, /* Lower value */ + upper; /* Upper value */ + } range; /* Range of integers value */ + + struct + { + char *charset; /* Character set */ + char *text; /* String */ + } string; /* String with language value */ + + struct + { + int length; /* Length of attribute */ + void *data; /* Data in attribute */ + } unknown; /* Unknown attribute type */ + +/**** New in CUPS 1.1.19 ****/ + ipp_t *collection; /* Collection value @since CUPS 1.1.19/Mac OS X 10.3@ */ +} ipp_value_t; + +typedef struct ipp_attribute_s /**** Attribute ****/ +{ + struct ipp_attribute_s *next; /* Next attribute in list */ + ipp_tag_t group_tag, /* Job/Printer/Operation group tag */ + value_tag; /* What type of value is it? */ + char *name; /* Name of attribute */ + int num_values; /* Number of values */ + ipp_value_t values[1]; /* Values */ +} ipp_attribute_t; + +struct ipp_s /**** IPP Request/Response/Notification ****/ +{ + ipp_state_t state; /* State of request */ + ipp_request_t request; /* Request header */ + ipp_attribute_t *attrs; /* Attributes */ + ipp_attribute_t *last; /* Last attribute in list */ + ipp_attribute_t *current; /* Current attribute (for read/write) */ + ipp_tag_t curtag; /* Current attribute group tag */ + +/**** New in CUPS 1.2 ****/ + ipp_attribute_t *prev; /* Previous attribute (for read) @since CUPS 1.2/Mac OS X 10.5@ */ + +/**** New in CUPS 1.4.4 ****/ + int use; /* Use count @since CUPS 1.4.4/Mac OS X 10.6.?@ */ +}; + + +/* + * Prototypes... + */ + +extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, + const char *name, char value); +extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, + const char *name, int num_values, + const char *values); +extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, + const char *name, const ipp_uchar_t *value); +extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, + ipp_tag_t type, const char *name, + int value); +extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, + ipp_tag_t type, const char *name, + int num_values, const int *values); +extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, + const char *name, int lower, int upper); +extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, + const char *name, int num_values, + const int *lower, const int *upper); +extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, + const char *name, ipp_res_t units, + int xres, int yres); +extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, + const char *name, int num_values, + ipp_res_t units, const int *xres, + const int *yres); +extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp); +extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, + ipp_tag_t type, const char *name, + const char *charset, const char *value); +extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, + ipp_tag_t type, const char *name, + int num_values, const char *charset, + const char * const *values); +extern time_t ippDateToTime(const ipp_uchar_t *date); +extern void ippDelete(ipp_t *ipp); +extern const char *ippErrorString(ipp_status_t error); +extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, + ipp_tag_t type); +extern ipp_attribute_t *ippFindNextAttribute(ipp_t *ipp, const char *name, + ipp_tag_t type); +extern size_t ippLength(ipp_t *ipp); +extern ipp_t *ippNew(void); +extern ipp_state_t ippRead(http_t *http, ipp_t *ipp); +extern const ipp_uchar_t *ippTimeToDate(time_t t); +extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp); +extern int ippPort(void); +extern void ippSetPort(int p); + +/**** New in CUPS 1.1.19 ****/ +extern ipp_attribute_t *ippAddCollection(ipp_t *ipp, ipp_tag_t group, + const char *name, ipp_t *value) _CUPS_API_1_1_19; +extern ipp_attribute_t *ippAddCollections(ipp_t *ipp, ipp_tag_t group, + const char *name, int num_values, + const ipp_t **values) _CUPS_API_1_1_19; +extern void ippDeleteAttribute(ipp_t *ipp, ipp_attribute_t *attr) _CUPS_API_1_1_19; +extern ipp_state_t ippReadFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; +extern ipp_state_t ippWriteFile(int fd, ipp_t *ipp) _CUPS_API_1_1_19; + +/**** New in CUPS 1.2 ****/ +extern ipp_attribute_t *ippAddOctetString(ipp_t *ipp, ipp_tag_t group, + const char *name, + const void *data, int datalen) _CUPS_API_1_2; +extern ipp_status_t ippErrorValue(const char *name) _CUPS_API_1_2; +extern ipp_t *ippNewRequest(ipp_op_t op) _CUPS_API_1_2; +extern const char *ippOpString(ipp_op_t op) _CUPS_API_1_2; +extern ipp_op_t ippOpValue(const char *name) _CUPS_API_1_2; +extern ipp_state_t ippReadIO(void *src, ipp_iocb_t cb, int blocking, + ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; +extern ipp_state_t ippWriteIO(void *dst, ipp_iocb_t cb, int blocking, + ipp_t *parent, ipp_t *ipp) _CUPS_API_1_2; + +/**** New in CUPS 1.4 ****/ +extern const char *ippTagString(ipp_tag_t tag) _CUPS_API_1_4; +extern ipp_tag_t ippTagValue(const char *name) _CUPS_API_1_4; + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_IPP_H_ */ + +/* + * End of "$Id: ipp.h 10108 2011-11-04 22:22:22Z mike $". + */ diff --git a/cups/langprintf.c b/cups/langprintf.c new file mode 100644 index 0000000..6c7d946 --- /dev/null +++ b/cups/langprintf.c @@ -0,0 +1,352 @@ +/* + * "$Id: langprintf.c 9637 2011-03-21 23:03:22Z mike $" + * + * Localized printf/puts functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2002-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsLangPrintError() - Print a message followed by a standard error. + * _cupsLangPrintFilter() - Print a formatted filter message string to a file. + * _cupsLangPrintf() - Print a formatted message string to a file. + * _cupsLangPuts() - Print a static message string to a file. + * _cupsSetLocale() - Set the current locale and transcode the + * command-line. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * '_cupsLangPrintError()' - Print a message followed by a standard error. + */ + +void +_cupsLangPrintError(const char *prefix, /* I - Non-localized message prefix */ + const char *message)/* I - Message */ +{ + int bytes; /* Number of bytes formatted */ + int last_errno; /* Last error */ + char buffer[2048], /* Message buffer */ + *bufptr, /* Pointer into buffer */ + output[8192]; /* Output buffer */ + _cups_globals_t *cg; /* Global data */ + + + /* + * Range check... + */ + + if (!message) + return; + + /* + * Save the errno value... + */ + + last_errno = errno; + + /* + * Get the message catalog... + */ + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + /* + * Format the message... + */ + + if (prefix) + { + snprintf(buffer, sizeof(buffer), "%s:", prefix); + bufptr = buffer + strlen(buffer); + } + else + bufptr = buffer; + + snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), + /* TRANSLATORS: Message is "subject: error" */ + _cupsLangString(cg->lang_default, _("%s: %s")), + _cupsLangString(cg->lang_default, message), strerror(last_errno)); + strlcat(buffer, "\n", sizeof(buffer)); + + /* + * Convert and write to stderr... + */ + + bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), + cg->lang_default->encoding); + + if (bytes > 0) + fwrite(output, 1, bytes, stderr); +} + + +/* + * '_cupsLangPrintFilter()' - Print a formatted filter message string to a file. + */ + +int /* O - Number of bytes written */ +_cupsLangPrintFilter( + FILE *fp, /* I - File to write to */ + const char *prefix, /* I - Non-localized message prefix */ + const char *message, /* I - Message string to use */ + ...) /* I - Additional arguments as needed */ +{ + int bytes; /* Number of bytes formatted */ + char temp[2048], /* Temporary format buffer */ + buffer[2048], /* Message buffer */ + output[8192]; /* Output buffer */ + va_list ap; /* Pointer to additional arguments */ + _cups_globals_t *cg; /* Global data */ + + + /* + * Range check... + */ + + if (!fp || !message) + return (-1); + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + /* + * Format the string... + */ + + va_start(ap, message); + snprintf(temp, sizeof(temp), "%s: %s\n", prefix, + _cupsLangString(cg->lang_default, message)); + vsnprintf(buffer, sizeof(buffer), temp, ap); + va_end(ap); + + /* + * Transcode to the destination charset... + */ + + bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), + cg->lang_default->encoding); + + /* + * Write the string and return the number of bytes written... + */ + + if (bytes > 0) + return ((int)fwrite(output, 1, bytes, fp)); + else + return (bytes); +} + + +/* + * '_cupsLangPrintf()' - Print a formatted message string to a file. + */ + +int /* O - Number of bytes written */ +_cupsLangPrintf(FILE *fp, /* I - File to write to */ + const char *message, /* I - Message string to use */ + ...) /* I - Additional arguments as needed */ +{ + int bytes; /* Number of bytes formatted */ + char buffer[2048], /* Message buffer */ + output[8192]; /* Output buffer */ + va_list ap; /* Pointer to additional arguments */ + _cups_globals_t *cg; /* Global data */ + + + /* + * Range check... + */ + + if (!fp || !message) + return (-1); + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + /* + * Format the string... + */ + + va_start(ap, message); + vsnprintf(buffer, sizeof(buffer) - 1, + _cupsLangString(cg->lang_default, message), ap); + va_end(ap); + + strlcat(buffer, "\n", sizeof(buffer)); + + /* + * Transcode to the destination charset... + */ + + bytes = cupsUTF8ToCharset(output, (cups_utf8_t *)buffer, sizeof(output), + cg->lang_default->encoding); + + /* + * Write the string and return the number of bytes written... + */ + + if (bytes > 0) + return ((int)fwrite(output, 1, bytes, fp)); + else + return (bytes); +} + + +/* + * '_cupsLangPuts()' - Print a static message string to a file. + */ + +int /* O - Number of bytes written */ +_cupsLangPuts(FILE *fp, /* I - File to write to */ + const char *message) /* I - Message string to use */ +{ + int bytes; /* Number of bytes formatted */ + char output[8192]; /* Message buffer */ + _cups_globals_t *cg; /* Global data */ + + + /* + * Range check... + */ + + if (!fp || !message) + return (-1); + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + /* + * Transcode to the destination charset... + */ + + bytes = cupsUTF8ToCharset(output, + (cups_utf8_t *)_cupsLangString(cg->lang_default, + message), + sizeof(output) - 4, cg->lang_default->encoding); + bytes += cupsUTF8ToCharset(output + bytes, (cups_utf8_t *)"\n", + sizeof(output) - bytes, + cg->lang_default->encoding); + + /* + * Write the string and return the number of bytes written... + */ + + if (bytes > 0) + return ((int)fwrite(output, 1, bytes, fp)); + else + return (bytes); +} + + +/* + * '_cupsSetLocale()' - Set the current locale and transcode the command-line. + */ + +void +_cupsSetLocale(char *argv[]) /* IO - Command-line arguments */ +{ + int i; /* Looping var */ + char buffer[8192]; /* Command-line argument buffer */ + _cups_globals_t *cg; /* Global data */ +#ifdef LC_TIME + const char *lc_time; /* Current LC_TIME value */ + char new_lc_time[255], /* New LC_TIME value */ + *charset; /* Pointer to character set */ +#endif /* LC_TIME */ + + + /* + * Set the locale so that times, etc. are displayed properly. + * + * Unfortunately, while we need the localized time value, we *don't* + * want to use the localized charset for the time value, so we need + * to set LC_TIME to the locale name with .UTF-8 on the end (if + * the locale includes a character set specifier...) + */ + + setlocale(LC_ALL, ""); + +#ifdef LC_TIME + if ((lc_time = setlocale(LC_TIME, NULL)) == NULL) + lc_time = setlocale(LC_ALL, NULL); + + if (lc_time) + { + strlcpy(new_lc_time, lc_time, sizeof(new_lc_time)); + if ((charset = strchr(new_lc_time, '.')) == NULL) + charset = new_lc_time + strlen(new_lc_time); + + strlcpy(charset, ".UTF-8", sizeof(new_lc_time) - (charset - new_lc_time)); + } + else + strcpy(new_lc_time, "C"); + + setlocale(LC_TIME, new_lc_time); +#endif /* LC_TIME */ + + /* + * Initialize the default language info... + */ + + cg = _cupsGlobals(); + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + /* + * Transcode the command-line arguments from the locale charset to + * UTF-8... + */ + + if (cg->lang_default->encoding != CUPS_US_ASCII && + cg->lang_default->encoding != CUPS_UTF8) + { + for (i = 1; argv[i]; i ++) + { + /* + * Try converting from the locale charset to UTF-8... + */ + + if (cupsCharsetToUTF8((cups_utf8_t *)buffer, argv[i], sizeof(buffer), + cg->lang_default->encoding) < 0) + continue; + + /* + * Save the new string if it differs from the original... + */ + + if (strcmp(buffer, argv[i])) + argv[i] = strdup(buffer); + } + } +} + + +/* + * End of "$Id: langprintf.c 9637 2011-03-21 23:03:22Z mike $". + */ diff --git a/cups/language-private.h b/cups/language-private.h new file mode 100644 index 0000000..1a6a09e --- /dev/null +++ b/cups/language-private.h @@ -0,0 +1,91 @@ +/* + * "$Id: language-private.h 9382 2010-11-20 01:03:46Z mike $" + * + * Private localization support for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_LANGUAGE_PRIVATE_H_ +# define _CUPS_LANGUAGE_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Macro for localized text... + */ + +# define _(x) x + + +/* + * Types... + */ + +typedef struct _cups_message_s /**** Message catalog entry ****/ +{ + char *id, /* Original string */ + *str; /* Localized string */ +} _cups_message_t; + + +/* + * Prototypes... + */ + +# ifdef __APPLE__ +extern const char *_cupsAppleLanguage(const char *locale, char *language, + size_t langsize); +# endif /* __APPLE__ */ +extern void _cupsCharmapFlush(void); +extern const char *_cupsEncodingName(cups_encoding_t encoding); +extern void _cupsLangPrintError(const char *prefix, + const char *message); +extern int _cupsLangPrintFilter(FILE *fp, const char *prefix, + const char *message, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +extern int _cupsLangPrintf(FILE *fp, const char *message, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +# endif /* __GNUC__ */ +; +extern int _cupsLangPuts(FILE *fp, const char *message); +extern const char *_cupsLangString(cups_lang_t *lang, + const char *message); +extern void _cupsMessageFree(cups_array_t *a); +extern cups_array_t *_cupsMessageLoad(const char *filename, int unquote); +extern const char *_cupsMessageLookup(cups_array_t *a, const char *m); +extern void _cupsSetLocale(char *argv[]); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_LANGUAGE_PRIVATE_H_ */ + +/* + * End of "$Id: language-private.h 9382 2010-11-20 01:03:46Z mike $". + */ diff --git a/cups/language.c b/cups/language.c new file mode 100644 index 0000000..b762e7d --- /dev/null +++ b/cups/language.c @@ -0,0 +1,1549 @@ +/* + * "$Id: language.c 10379 2012-03-23 22:16:22Z mike $" + * + * I18N/language support for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsAppleLanguage() - Get the Apple language identifier associated with + * a locale ID. + * _cupsEncodingName() - Return the character encoding name string for the + * given encoding enumeration. + * cupsLangDefault() - Return the default language. + * cupsLangEncoding() - Return the character encoding (us-ascii, etc.) for + * the given language. + * cupsLangFlush() - Flush all language data out of the cache. + * cupsLangFree() - Free language data. + * cupsLangGet() - Get a language. + * _cupsLangString() - Get a message string. + * _cupsMessageFree() - Free a messages array. + * _cupsMessageLoad() - Load a .po file into a messages array. + * _cupsMessageLookup() - Lookup a message string. + * appleLangDefault() - Get the default locale string. + * appleMessageLoad() - Load a message catalog from a localizable bundle. + * cups_cache_lookup() - Lookup a language in the cache... + * cups_message_compare() - Compare two messages. + * cups_message_free() - Free a message. + * cups_unquote() - Unquote characters in strings... + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#ifdef HAVE_LANGINFO_H +# include +#endif /* HAVE_LANGINFO_H */ +#ifdef WIN32 +# include +#else +# include +#endif /* WIN32 */ +#ifdef HAVE_COREFOUNDATION_H +# include +#endif /* HAVE_COREFOUNDATION_H */ + + +/* + * Local globals... + */ + +static _cups_mutex_t lang_mutex = _CUPS_MUTEX_INITIALIZER; + /* Mutex to control access to cache */ +static cups_lang_t *lang_cache = NULL; + /* Language string cache */ +static const char * const lang_encodings[] = + { /* Encoding strings */ + "us-ascii", "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", "utf-8", + "iso-8859-13", "iso-8859-14", + "iso-8859-15", "cp874", + "cp1250", "cp1251", + "cp1252", "cp1253", + "cp1254", "cp1255", + "cp1256", "cp1257", + "cp1258", "koi8-r", + "koi8-u", "iso-8859-11", + "iso-8859-16", "mac", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "cp932", "cp936", + "cp949", "cp950", + "cp1361", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "euc-cn", "euc-jp", + "euc-kr", "euc-tw", + "jis-x0213" + }; + +#ifdef __APPLE__ +typedef struct +{ + const char * const language; /* Language ID */ + const char * const locale; /* Locale ID */ +} _apple_language_locale_t; + +static const _apple_language_locale_t apple_language_locale[] = +{ /* Locale to language ID LUT */ + { "en", "en_US" }, + { "nb", "no" }, + { "zh-Hans", "zh_CN" }, + { "zh-Hant", "zh_TW" } +}; +#endif /* __APPLE__ */ + + +/* + * Local functions... + */ + + +#ifdef __APPLE__ +static const char *appleLangDefault(void); +# ifdef CUPS_BUNDLEDIR +# ifndef CF_RETURNS_RETAINED +# if __has_feature(attribute_cf_returns_retained) +# define CF_RETURNS_RETAINED __attribute__((cf_returns_retained)) +# else +# define CF_RETURNS_RETAINED +# endif /* __has_feature(attribute_cf_returns_retained) */ +# endif /* !CF_RETURNED_RETAINED */ +static cups_array_t *appleMessageLoad(const char *locale) + CF_RETURNS_RETAINED; +# endif /* CUPS_BUNDLEDIR */ +#endif /* __APPLE__ */ +static cups_lang_t *cups_cache_lookup(const char *name, + cups_encoding_t encoding); +static int cups_message_compare(_cups_message_t *m1, + _cups_message_t *m2); +static void cups_message_free(_cups_message_t *m); +static void cups_unquote(char *d, const char *s); + + +#ifdef __APPLE__ +/* + * '_cupsAppleLanguage()' - Get the Apple language identifier associated with a + * locale ID. + */ + +const char * /* O - Language ID */ +_cupsAppleLanguage(const char *locale, /* I - Locale ID */ + char *language,/* I - Language ID buffer */ + size_t langsize) /* I - Size of language ID buffer */ +{ + int i; /* Looping var */ + CFStringRef localeid, /* CF locale identifier */ + langid; /* CF language identifier */ + + + /* + * Copy the locale name and convert, as needed, to the Apple-specific + * locale identifier... + */ + + switch (strlen(locale)) + { + default : + /* + * Invalid locale... + */ + + strlcpy(language, "en", langsize); + break; + + case 2 : + strlcpy(language, locale, langsize); + break; + + case 5 : + strlcpy(language, locale, langsize); + + if (language[2] == '-') + { + /* + * Convert ll-cc to ll_CC... + */ + + language[2] = '_'; + language[3] = toupper(language[3] & 255); + language[4] = toupper(language[4] & 255); + } + break; + } + + for (i = 0; + i < (int)(sizeof(apple_language_locale) / + sizeof(apple_language_locale[0])); + i ++) + if (!strcmp(locale, apple_language_locale[i].locale)) + { + strlcpy(language, apple_language_locale[i].language, sizeof(language)); + break; + } + + /* + * Attempt to map the locale ID to a language ID... + */ + + if ((localeid = CFStringCreateWithCString(kCFAllocatorDefault, language, + kCFStringEncodingASCII)) != NULL) + { + if ((langid = CFLocaleCreateCanonicalLanguageIdentifierFromString( + kCFAllocatorDefault, localeid)) != NULL) + { + CFStringGetCString(langid, language, langsize, kCFStringEncodingASCII); + CFRelease(langid); + } + + CFRelease(localeid); + } + + /* + * Return what we got... + */ + + return (language); +} +#endif /* __APPLE__ */ + + +/* + * '_cupsEncodingName()' - Return the character encoding name string + * for the given encoding enumeration. + */ + +const char * /* O - Character encoding */ +_cupsEncodingName( + cups_encoding_t encoding) /* I - Encoding value */ +{ + if (encoding < 0 || + encoding >= (sizeof(lang_encodings) / sizeof(const char *))) + { + DEBUG_printf(("1_cupsEncodingName(encoding=%d) = out of range (\"%s\")", + encoding, lang_encodings[0])); + return (lang_encodings[0]); + } + else + { + DEBUG_printf(("1_cupsEncodingName(encoding=%d) = \"%s\"", + encoding, lang_encodings[encoding])); + return (lang_encodings[encoding]); + } +} + + +/* + * 'cupsLangDefault()' - Return the default language. + */ + +cups_lang_t * /* O - Language data */ +cupsLangDefault(void) +{ + return (cupsLangGet(NULL)); +} + + +/* + * 'cupsLangEncoding()' - Return the character encoding (us-ascii, etc.) + * for the given language. + */ + +const char * /* O - Character encoding */ +cupsLangEncoding(cups_lang_t *lang) /* I - Language data */ +{ + if (lang == NULL) + return ((char*)lang_encodings[0]); + else + return ((char*)lang_encodings[lang->encoding]); +} + + +/* + * 'cupsLangFlush()' - Flush all language data out of the cache. + */ + +void +cupsLangFlush(void) +{ + cups_lang_t *lang, /* Current language */ + *next; /* Next language */ + + + /* + * Free all languages in the cache... + */ + + _cupsMutexLock(&lang_mutex); + + for (lang = lang_cache; lang != NULL; lang = next) + { + /* + * Free all messages... + */ + + _cupsMessageFree(lang->strings); + + /* + * Then free the language structure itself... + */ + + next = lang->next; + free(lang); + } + + lang_cache = NULL; + + _cupsMutexUnlock(&lang_mutex); +} + + +/* + * 'cupsLangFree()' - Free language data. + * + * This does not actually free anything; use @link cupsLangFlush@ for that. + */ + +void +cupsLangFree(cups_lang_t *lang) /* I - Language to free */ +{ + _cupsMutexLock(&lang_mutex); + + if (lang != NULL && lang->used > 0) + lang->used --; + + _cupsMutexUnlock(&lang_mutex); +} + + +/* + * 'cupsLangGet()' - Get a language. + */ + +cups_lang_t * /* O - Language data */ +cupsLangGet(const char *language) /* I - Language or locale */ +{ + int i; /* Looping var */ +#ifndef __APPLE__ + char locale[255]; /* Copy of locale name */ +#endif /* !__APPLE__ */ + char langname[16], /* Requested language name */ + country[16], /* Country code */ + charset[16], /* Character set */ + *csptr, /* Pointer to CODESET string */ + *ptr, /* Pointer into language/charset */ + real[48]; /* Real language name */ + cups_encoding_t encoding; /* Encoding to use */ + cups_lang_t *lang; /* Current language... */ +#if !defined(__APPLE__) || !defined(CUPS_BUNDLEDIR) + char filename[1024]; /* Filename for language locale file */ + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ +#endif /* !__APPLE__ || !CUPS_BUNDLEDIR */ + static const char * const locale_encodings[] = + { /* Locale charset names */ + "ASCII", "ISO88591", "ISO88592", "ISO88593", + "ISO88594", "ISO88595", "ISO88596", "ISO88597", + "ISO88598", "ISO88599", "ISO885910", "UTF8", + "ISO885913", "ISO885914", "ISO885915", "CP874", + "CP1250", "CP1251", "CP1252", "CP1253", + "CP1254", "CP1255", "CP1256", "CP1257", + "CP1258", "KOI8R", "KOI8U", "ISO885911", + "ISO885916", "MACROMAN", "", "", + + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + + "CP932", "CP936", "CP949", "CP950", + "CP1361", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + + "EUCCN", "EUCJP", "EUCKR", "EUCTW", + "SHIFT_JISX0213" + }; + + + DEBUG_printf(("2cupsLangGet(language=\"%s\")", language)); + +#ifdef __APPLE__ + /* + * Set the character set to UTF-8... + */ + + strcpy(charset, "UTF8"); + + /* + * Apple's setlocale doesn't give us the user's localization + * preference so we have to look it up this way... + */ + + if (!language) + { + if (!getenv("SOFTWARE") || (language = getenv("LANG")) == NULL) + language = appleLangDefault(); + + DEBUG_printf(("4cupsLangGet: language=\"%s\"", language)); + } + +#else + /* + * Set the charset to "unknown"... + */ + + charset[0] = '\0'; + + /* + * Use setlocale() to determine the currently set locale, and then + * fallback to environment variables to avoid setting the locale, + * since setlocale() is not thread-safe! + */ + + if (!language) + { + /* + * First see if the locale has been set; if it is still "C" or + * "POSIX", use the environment to get the default... + */ + +# ifdef LC_MESSAGES + ptr = setlocale(LC_MESSAGES, NULL); +# else + ptr = setlocale(LC_ALL, NULL); +# endif /* LC_MESSAGES */ + + DEBUG_printf(("4cupsLangGet: current locale is \"%s\"", ptr)); + + if (!ptr || !strcmp(ptr, "C") || !strcmp(ptr, "POSIX")) + { + /* + * Get the character set from the LC_CTYPE locale setting... + */ + + if ((ptr = getenv("LC_CTYPE")) == NULL) + if ((ptr = getenv("LC_ALL")) == NULL) + if ((ptr = getenv("LANG")) == NULL) + ptr = "en_US"; + + if ((csptr = strchr(ptr, '.')) != NULL) + { + /* + * Extract the character set from the environment... + */ + + for (ptr = charset, csptr ++; *csptr; csptr ++) + if (ptr < (charset + sizeof(charset) - 1) && _cups_isalnum(*csptr)) + *ptr++ = *csptr; + + *ptr = '\0'; + } + + /* + * Get the locale for messages from the LC_MESSAGES locale setting... + */ + + if ((ptr = getenv("LC_MESSAGES")) == NULL) + if ((ptr = getenv("LC_ALL")) == NULL) + if ((ptr = getenv("LANG")) == NULL) + ptr = "en_US"; + } + + if (ptr) + { + strlcpy(locale, ptr, sizeof(locale)); + language = locale; + + /* + * CUPS STR #2575: Map "nb" to "no" for back-compatibility... + */ + + if (!strncmp(locale, "nb", 2)) + locale[1] = 'o'; + + DEBUG_printf(("4cupsLangGet: new language value is \"%s\"", language)); + } + } +#endif /* __APPLE__ */ + + /* + * If "language" is NULL at this point, then chances are we are using + * a language that is not installed for the base OS. + */ + + if (!language) + { + /* + * Switch to the POSIX ("C") locale... + */ + + language = "C"; + } + +#ifdef CODESET + /* + * On systems that support the nl_langinfo(CODESET) call, use + * this value as the character set... + */ + + if (!charset[0] && (csptr = nl_langinfo(CODESET)) != NULL) + { + /* + * Copy all of the letters and numbers in the CODESET string... + */ + + for (ptr = charset; *csptr; csptr ++) + if (_cups_isalnum(*csptr) && ptr < (charset + sizeof(charset) - 1)) + *ptr++ = *csptr; + + *ptr = '\0'; + + DEBUG_printf(("4cupsLangGet: charset set to \"%s\" via " + "nl_langinfo(CODESET)...", charset)); + } +#endif /* CODESET */ + + /* + * If we don't have a character set by now, default to UTF-8... + */ + + if (!charset[0]) + strcpy(charset, "UTF8"); + + /* + * Parse the language string passed in to a locale string. "C" is the + * standard POSIX locale and is copied unchanged. Otherwise the + * language string is converted from ll-cc[.charset] (language-country) + * to ll_CC[.CHARSET] to match the file naming convention used by all + * POSIX-compliant operating systems. Invalid language names are mapped + * to the POSIX locale. + */ + + country[0] = '\0'; + + if (language == NULL || !language[0] || + !strcmp(language, "POSIX")) + strcpy(langname, "C"); + else + { + /* + * Copy the parts of the locale string over safely... + */ + + for (ptr = langname; *language; language ++) + if (*language == '_' || *language == '-' || *language == '.') + break; + else if (ptr < (langname + sizeof(langname) - 1)) + *ptr++ = tolower(*language & 255); + + *ptr = '\0'; + + if (*language == '_' || *language == '-') + { + /* + * Copy the country code... + */ + + for (language ++, ptr = country; *language; language ++) + if (*language == '.') + break; + else if (ptr < (country + sizeof(country) - 1)) + *ptr++ = toupper(*language & 255); + + *ptr = '\0'; + } + + if (*language == '.' && !charset[0]) + { + /* + * Copy the encoding... + */ + + for (language ++, ptr = charset; *language; language ++) + if (_cups_isalnum(*language) && ptr < (charset + sizeof(charset) - 1)) + *ptr++ = toupper(*language & 255); + + *ptr = '\0'; + } + + /* + * Force a POSIX locale for an invalid language name... + */ + + if (strlen(langname) != 2) + { + strcpy(langname, "C"); + country[0] = '\0'; + charset[0] = '\0'; + } + } + + DEBUG_printf(("4cupsLangGet: langname=\"%s\", country=\"%s\", charset=\"%s\"", + langname, country, charset)); + + /* + * Figure out the desired encoding... + */ + + encoding = CUPS_AUTO_ENCODING; + + if (charset[0]) + { + for (i = 0; + i < (int)(sizeof(locale_encodings) / sizeof(locale_encodings[0])); + i ++) + if (!_cups_strcasecmp(charset, locale_encodings[i])) + { + encoding = (cups_encoding_t)i; + break; + } + + if (encoding == CUPS_AUTO_ENCODING) + { + /* + * Map alternate names for various character sets... + */ + + if (!_cups_strcasecmp(charset, "iso-2022-jp") || + !_cups_strcasecmp(charset, "sjis")) + encoding = CUPS_WINDOWS_932; + else if (!_cups_strcasecmp(charset, "iso-2022-cn")) + encoding = CUPS_WINDOWS_936; + else if (!_cups_strcasecmp(charset, "iso-2022-kr")) + encoding = CUPS_WINDOWS_949; + else if (!_cups_strcasecmp(charset, "big5")) + encoding = CUPS_WINDOWS_950; + } + } + + DEBUG_printf(("4cupsLangGet: encoding=%d(%s)", encoding, + encoding == CUPS_AUTO_ENCODING ? "auto" : + lang_encodings[encoding])); + + /* + * See if we already have this language/country loaded... + */ + + if (country[0]) + { + snprintf(real, sizeof(real), "%s_%s", langname, country); + +#if !defined(__APPLE__) || !defined(CUPS_BUNDLEDIR) + snprintf(filename, sizeof(filename), "%s/%s/cups_%s.po", cg->localedir, + real, real); +#endif /* !__APPLE__ || !CUPS_BUNDLEDIR */ + } + else + { + strcpy(real, langname); +#if !defined(__APPLE__) || !defined(CUPS_BUNDLEDIR) + filename[0] = '\0'; /* anti-compiler-warning-code */ +#endif /* !__APPLE__ || !CUPS_BUNDLEDIR */ + } + + _cupsMutexLock(&lang_mutex); + + if ((lang = cups_cache_lookup(real, encoding)) != NULL) + { + _cupsMutexUnlock(&lang_mutex); + + DEBUG_printf(("3cupsLangGet: Using cached copy of \"%s\"...", real)); + + return (lang); + } + +#if !defined(__APPLE__) || !defined(CUPS_BUNDLEDIR) + if (!country[0] || access(filename, 0)) + { + /* + * Country localization not available, look for generic localization... + */ + + snprintf(filename, sizeof(filename), "%s/%s/cups_%s.po", cg->localedir, + langname, langname); + + if (access(filename, 0)) + { + /* + * No generic localization, so use POSIX... + */ + + DEBUG_printf(("4cupsLangGet: access(\"%s\", 0): %s", filename, + strerror(errno))); + + snprintf(filename, sizeof(filename), "%s/C/cups_C.po", cg->localedir); + } + } +#endif /* !__APPLE__ || !CUPS_BUNDLEDIR */ + + /* + * See if there is a free language available; if so, use that + * record... + */ + + for (lang = lang_cache; lang != NULL; lang = lang->next) + if (lang->used == 0) + break; + + if (lang == NULL) + { + /* + * Allocate memory for the language and add it to the cache. + */ + + if ((lang = calloc(sizeof(cups_lang_t), 1)) == NULL) + { + _cupsMutexUnlock(&lang_mutex); + + return (NULL); + } + + lang->next = lang_cache; + lang_cache = lang; + } + else + { + /* + * Free all old strings as needed... + */ + + _cupsMessageFree(lang->strings); + } + + /* + * Then assign the language and encoding fields... + */ + + lang->used ++; + strlcpy(lang->language, real, sizeof(lang->language)); + + if (encoding != CUPS_AUTO_ENCODING) + lang->encoding = encoding; + else + lang->encoding = CUPS_UTF8; + + /* + * Read the strings from the file... + */ + +#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) + lang->strings = appleMessageLoad(lang->language); +#else + lang->strings = _cupsMessageLoad(filename, 1); +#endif /* __APPLE__ && CUPS_BUNDLEDIR */ + + /* + * Return... + */ + + _cupsMutexUnlock(&lang_mutex); + + return (lang); +} + + +/* + * '_cupsLangString()' - Get a message string. + * + * The returned string is UTF-8 encoded; use cupsUTF8ToCharset() to + * convert the string to the language encoding. + */ + +const char * /* O - Localized message */ +_cupsLangString(cups_lang_t *lang, /* I - Language */ + const char *message) /* I - Message */ +{ + const char *s; /* Localized message */ + + /* + * Range check input... + */ + + if (!lang || !message) + return (message); + + _cupsMutexLock(&lang_mutex); + + s = _cupsMessageLookup(lang->strings, message); + + _cupsMutexUnlock(&lang_mutex); + + return (s); +} + + +/* + * '_cupsMessageFree()' - Free a messages array. + */ + +void +_cupsMessageFree(cups_array_t *a) /* I - Message array */ +{ +#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) + /* + * Release the cups.strings dictionary as needed... + */ + + if (cupsArrayUserData(a)) + CFRelease((CFDictionaryRef)cupsArrayUserData(a)); +#endif /* __APPLE__ && CUPS_BUNDLEDIR */ + + /* + * Free the array... + */ + + cupsArrayDelete(a); +} + + +/* + * '_cupsMessageLoad()' - Load a .po file into a messages array. + */ + +cups_array_t * /* O - New message array */ +_cupsMessageLoad(const char *filename, /* I - Message catalog to load */ + int unquote) /* I - Unescape \foo in strings? */ +{ + cups_file_t *fp; /* Message file */ + cups_array_t *a; /* Message array */ + _cups_message_t *m; /* Current message */ + char s[4096], /* String buffer */ + *ptr, /* Pointer into buffer */ + *temp; /* New string */ + int length; /* Length of combined strings */ + + + DEBUG_printf(("4_cupsMessageLoad(filename=\"%s\")", filename)); + + /* + * Create an array to hold the messages... + */ + + if ((a = cupsArrayNew3((cups_array_func_t)cups_message_compare, NULL, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)cups_message_free)) == NULL) + { + DEBUG_puts("5_cupsMessageLoad: Unable to allocate array!"); + return (NULL); + } + + /* + * Open the message catalog file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + DEBUG_printf(("5_cupsMessageLoad: Unable to open file: %s", + strerror(errno))); + return (a); + } + + /* + * Read messages from the catalog file until EOF... + * + * The format is the GNU gettext .po format, which is fairly simple: + * + * msgid "some text" + * msgstr "localized text" + * + * The ID and localized text can span multiple lines using the form: + * + * msgid "" + * "some long text" + * msgstr "" + * "localized text spanning " + * "multiple lines" + */ + + m = NULL; + + while (cupsFileGets(fp, s, sizeof(s)) != NULL) + { + /* + * Skip blank and comment lines... + */ + + if (s[0] == '#' || !s[0]) + continue; + + /* + * Strip the trailing quote... + */ + + if ((ptr = strrchr(s, '\"')) == NULL) + continue; + + *ptr = '\0'; + + /* + * Find start of value... + */ + + if ((ptr = strchr(s, '\"')) == NULL) + continue; + + ptr ++; + + /* + * Unquote the text... + */ + + if (unquote) + cups_unquote(ptr, ptr); + + /* + * Create or add to a message... + */ + + if (!strncmp(s, "msgid", 5)) + { + /* + * Add previous message as needed... + */ + + if (m) + { + if (m->str && m->str[0]) + { + cupsArrayAdd(a, m); + } + else + { + /* + * Translation is empty, don't add it... (STR #4033) + */ + + free(m->id); + if (m->str) + free(m->str); + free(m); + } + } + + /* + * Create a new message with the given msgid string... + */ + + if ((m = (_cups_message_t *)calloc(1, sizeof(_cups_message_t))) == NULL) + { + cupsFileClose(fp); + return (a); + } + + if ((m->id = strdup(ptr)) == NULL) + { + free(m); + cupsFileClose(fp); + return (a); + } + } + else if (s[0] == '\"' && m) + { + /* + * Append to current string... + */ + + length = (int)strlen(m->str ? m->str : m->id); + + if ((temp = realloc(m->str ? m->str : m->id, + length + strlen(ptr) + 1)) == NULL) + { + if (m->str) + free(m->str); + free(m->id); + free(m); + + cupsFileClose(fp); + return (a); + } + + if (m->str) + { + /* + * Copy the new portion to the end of the msgstr string - safe + * to use strcpy because the buffer is allocated to the correct + * size... + */ + + m->str = temp; + + strcpy(m->str + length, ptr); + } + else + { + /* + * Copy the new portion to the end of the msgid string - safe + * to use strcpy because the buffer is allocated to the correct + * size... + */ + + m->id = temp; + + strcpy(m->id + length, ptr); + } + } + else if (!strncmp(s, "msgstr", 6) && m) + { + /* + * Set the string... + */ + + if ((m->str = strdup(ptr)) == NULL) + { + free(m->id); + free(m); + + cupsFileClose(fp); + return (a); + } + } + } + + /* + * Add the last message string to the array as needed... + */ + + if (m) + { + if (m->str && m->str[0]) + { + cupsArrayAdd(a, m); + } + else + { + /* + * Translation is empty, don't add it... (STR #4033) + */ + + free(m->id); + if (m->str) + free(m->str); + free(m); + } + } + + /* + * Close the message catalog file and return the new array... + */ + + cupsFileClose(fp); + + DEBUG_printf(("5_cupsMessageLoad: Returning %d messages...", + cupsArrayCount(a))); + + return (a); +} + + +/* + * '_cupsMessageLookup()' - Lookup a message string. + */ + +const char * /* O - Localized message */ +_cupsMessageLookup(cups_array_t *a, /* I - Message array */ + const char *m) /* I - Message */ +{ + _cups_message_t key, /* Search key */ + *match; /* Matching message */ + + + /* + * Lookup the message string; if it doesn't exist in the catalog, + * then return the message that was passed to us... + */ + + key.id = (char *)m; + match = (_cups_message_t *)cupsArrayFind(a, &key); + +#if defined(__APPLE__) && defined(CUPS_BUNDLEDIR) + if (!match && cupsArrayUserData(a)) + { + /* + * Try looking the string up in the cups.strings dictionary... + */ + + CFDictionaryRef dict; /* cups.strings dictionary */ + CFStringRef cfm, /* Message as a CF string */ + cfstr; /* Localized text as a CF string */ + + dict = (CFDictionaryRef)cupsArrayUserData(a); + cfm = CFStringCreateWithCString(kCFAllocatorDefault, m, + kCFStringEncodingUTF8); + match = calloc(1, sizeof(_cups_message_t)); + match->id = strdup(m); + cfstr = cfm ? CFDictionaryGetValue(dict, cfm) : NULL; + + if (cfstr) + { + char buffer[1024]; /* Message buffer */ + + CFStringGetCString(cfstr, buffer, sizeof(buffer), kCFStringEncodingUTF8); + match->str = strdup(buffer); + + DEBUG_printf(("1_cupsMessageLookup: Found \"%s\" as \"%s\"...", + m, buffer)); + } + else + { + match->str = strdup(m); + + DEBUG_printf(("1_cupsMessageLookup: Did not find \"%s\"...", m)); + } + + cupsArrayAdd(a, match); + + if (cfm) + CFRelease(cfm); + } +#endif /* __APPLE__ && CUPS_BUNDLEDIR */ + + if (match && match->str) + return (match->str); + else + return (m); +} + + +#ifdef __APPLE__ +/* + * 'appleLangDefault()' - Get the default locale string. + */ + +static const char * /* O - Locale string */ +appleLangDefault(void) +{ + int i; /* Looping var */ + CFBundleRef bundle; /* Main bundle (if any) */ + CFArrayRef bundleList; /* List of localizations in bundle */ + CFPropertyListRef localizationList; + /* List of localization data */ + CFStringRef languageName; /* Current name */ + CFStringRef localeName; /* Canonical from of name */ + char *lang; /* LANG environment variable */ + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + + + DEBUG_puts("2appleLangDefault()"); + + /* + * Only do the lookup and translation the first time. + */ + + if (!cg->language[0]) + { + if (getenv("SOFTWARE") != NULL && (lang = getenv("LANG")) != NULL) + { + strlcpy(cg->language, lang, sizeof(cg->language)); + return (cg->language); + } + else if ((bundle = CFBundleGetMainBundle()) != NULL && + (bundleList = CFBundleCopyBundleLocalizations(bundle)) != NULL) + { + localizationList = + CFBundleCopyPreferredLocalizationsFromArray(bundleList); + + CFRelease(bundleList); + } + else + localizationList = + CFPreferencesCopyAppValue(CFSTR("AppleLanguages"), + kCFPreferencesCurrentApplication); + + if (localizationList) + { + if (CFGetTypeID(localizationList) == CFArrayGetTypeID() && + CFArrayGetCount(localizationList) > 0) + { + languageName = CFArrayGetValueAtIndex(localizationList, 0); + + if (languageName && + CFGetTypeID(languageName) == CFStringGetTypeID()) + { + localeName = CFLocaleCreateCanonicalLocaleIdentifierFromString( + kCFAllocatorDefault, languageName); + + if (localeName) + { + CFStringGetCString(localeName, cg->language, sizeof(cg->language), + kCFStringEncodingASCII); + CFRelease(localeName); + + DEBUG_printf(("9appleLangDefault: cg->language=\"%s\"", + cg->language)); + + /* + * Map new language identifiers to locales... + */ + + for (i = 0; + i < (int)(sizeof(apple_language_locale) / + sizeof(apple_language_locale[0])); + i ++) + { + if (!strcmp(cg->language, apple_language_locale[i].language)) + { + DEBUG_printf(("9appleLangDefault: mapping \"%s\" to \"%s\"...", + cg->language, apple_language_locale[i].locale)); + strlcpy(cg->language, apple_language_locale[i].locale, + sizeof(cg->language)); + break; + } + } + + /* + * Convert language subtag into region subtag... + */ + + if (cg->language[2] == '-') + cg->language[2] = '_'; + + if (!strchr(cg->language, '.')) + strlcat(cg->language, ".UTF-8", sizeof(cg->language)); + } + } + } + + CFRelease(localizationList); + } + + /* + * If we didn't find the language, default to en_US... + */ + + if (!cg->language[0]) + strlcpy(cg->language, "en_US.UTF-8", sizeof(cg->language)); + } + + /* + * Return the cached locale... + */ + + return (cg->language); +} + + +# ifdef CUPS_BUNDLEDIR +/* + * 'appleMessageLoad()' - Load a message catalog from a localizable bundle. + */ + +static cups_array_t * /* O - Message catalog */ +appleMessageLoad(const char *locale) /* I - Locale ID */ +{ + char filename[1024], /* Path to cups.strings file */ + applelang[256]; /* Apple language ID */ + CFURLRef url; /* URL to cups.strings file */ + CFReadStreamRef stream = NULL; /* File stream */ + CFPropertyListRef plist = NULL; /* Localization file */ +#ifdef DEBUG + CFErrorRef error = NULL; /* Error when opening file */ +#endif /* DEBUG */ + + + DEBUG_printf(("appleMessageLoad(locale=\"%s\")", locale)); + + /* + * Load the cups.strings file... + */ + + snprintf(filename, sizeof(filename), + CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", + _cupsAppleLanguage(locale, applelang, sizeof(applelang))); + DEBUG_printf(("1appleMessageLoad: filename=\"%s\"", filename)); + + if (access(filename, 0)) + { + /* + * Try alternate lproj directory names... + */ + + if (!strncmp(locale, "en", 2)) + locale = "English"; + else if (!strncmp(locale, "nb", 2) || !strncmp(locale, "nl", 2)) + locale = "Dutch"; + else if (!strncmp(locale, "fr", 2)) + locale = "French"; + else if (!strncmp(locale, "de", 2)) + locale = "German"; + else if (!strncmp(locale, "it", 2)) + locale = "Italian"; + else if (!strncmp(locale, "ja", 2)) + locale = "Japanese"; + else if (!strncmp(locale, "es", 2)) + locale = "Spanish"; + + snprintf(filename, sizeof(filename), + CUPS_BUNDLEDIR "/Resources/%s.lproj/cups.strings", locale); + DEBUG_printf(("1appleMessageLoad: alternate filename=\"%s\"", filename)); + } + + url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, + (UInt8 *)filename, + strlen(filename), false); + if (url) + { + stream = CFReadStreamCreateWithFile(kCFAllocatorDefault, url); + if (stream) + { + /* + * Read the property list containing the localization data. + * + * NOTE: This code currently generates a clang "potential leak" + * warning, but the object is released in _cupsMessageFree(). + */ + + CFReadStreamOpen(stream); + +#ifdef DEBUG + plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, + kCFPropertyListImmutable, NULL, + &error); + if (error) + { + CFStringRef msg = CFErrorCopyDescription(error); + /* Error message */ + + CFStringGetCString(msg, filename, sizeof(filename), + kCFStringEncodingUTF8); + DEBUG_printf(("1appleMessageLoad: %s", filename)); + + CFRelease(msg); + CFRelease(error); + } + +#else + plist = CFPropertyListCreateWithStream(kCFAllocatorDefault, stream, 0, + kCFPropertyListImmutable, NULL, + NULL); +#endif /* DEBUG */ + + if (plist && CFGetTypeID(plist) != CFDictionaryGetTypeID()) + { + CFRelease(plist); + plist = NULL; + } + + CFRelease(stream); + } + + CFRelease(url); + } + + DEBUG_printf(("1appleMessageLoad: url=%p, stream=%p, plist=%p", url, stream, + plist)); + + /* + * Create and return an empty array to act as a cache for messages, passing the + * plist as the user data. + */ + + return (cupsArrayNew3((cups_array_func_t)cups_message_compare, (void *)plist, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)cups_message_free)); +} +# endif /* CUPS_BUNDLEDIR */ +#endif /* __APPLE__ */ + + +/* + * 'cups_cache_lookup()' - Lookup a language in the cache... + */ + +static cups_lang_t * /* O - Language data or NULL */ +cups_cache_lookup( + const char *name, /* I - Name of locale */ + cups_encoding_t encoding) /* I - Encoding of locale */ +{ + cups_lang_t *lang; /* Current language */ + + + DEBUG_printf(("7cups_cache_lookup(name=\"%s\", encoding=%d(%s))", name, + encoding, encoding == CUPS_AUTO_ENCODING ? "auto" : + lang_encodings[encoding])); + + /* + * Loop through the cache and return a match if found... + */ + + for (lang = lang_cache; lang != NULL; lang = lang->next) + { + DEBUG_printf(("9cups_cache_lookup: lang=%p, language=\"%s\", " + "encoding=%d(%s)", lang, lang->language, lang->encoding, + lang_encodings[lang->encoding])); + + if (!strcmp(lang->language, name) && + (encoding == CUPS_AUTO_ENCODING || encoding == lang->encoding)) + { + lang->used ++; + + DEBUG_puts("8cups_cache_lookup: returning match!"); + + return (lang); + } + } + + DEBUG_puts("8cups_cache_lookup: returning NULL!"); + + return (NULL); +} + + +/* + * 'cups_message_compare()' - Compare two messages. + */ + +static int /* O - Result of comparison */ +cups_message_compare( + _cups_message_t *m1, /* I - First message */ + _cups_message_t *m2) /* I - Second message */ +{ + return (strcmp(m1->id, m2->id)); +} + + +/* + * 'cups_message_free()' - Free a message. + */ + +static void +cups_message_free(_cups_message_t *m) /* I - Message */ +{ + if (m->id) + free(m->id); + + if (m->str) + free(m->str); + + free(m); +} + + +/* + * 'cups_unquote()' - Unquote characters in strings... + */ + +static void +cups_unquote(char *d, /* O - Unquoted string */ + const char *s) /* I - Original string */ +{ + while (*s) + { + if (*s == '\\') + { + s ++; + if (isdigit(*s)) + { + *d = 0; + + while (isdigit(*s)) + { + *d = *d * 8 + *s - '0'; + s ++; + } + + d ++; + } + else + { + if (*s == 'n') + *d ++ = '\n'; + else if (*s == 'r') + *d ++ = '\r'; + else if (*s == 't') + *d ++ = '\t'; + else + *d++ = *s; + + s ++; + } + } + else + *d++ = *s++; + } + + *d = '\0'; +} + + +/* + * End of "$Id: language.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/cups/language.h b/cups/language.h new file mode 100644 index 0000000..03c8eb5 --- /dev/null +++ b/cups/language.h @@ -0,0 +1,115 @@ +/* + * "$Id: language.h 9771 2011-05-12 05:21:56Z mike $" + * + * Multi-language support for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_LANGUAGE_H_ +# define _CUPS_LANGUAGE_H_ + +/* + * Include necessary headers... + */ + +# include +# include "array.h" + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Types... + */ + +typedef enum cups_encoding_e /**** Language Encodings ****/ +{ + CUPS_AUTO_ENCODING = -1, /* Auto-detect the encoding @private@ */ + CUPS_US_ASCII, /* US ASCII */ + CUPS_ISO8859_1, /* ISO-8859-1 */ + CUPS_ISO8859_2, /* ISO-8859-2 */ + CUPS_ISO8859_3, /* ISO-8859-3 */ + CUPS_ISO8859_4, /* ISO-8859-4 */ + CUPS_ISO8859_5, /* ISO-8859-5 */ + CUPS_ISO8859_6, /* ISO-8859-6 */ + CUPS_ISO8859_7, /* ISO-8859-7 */ + CUPS_ISO8859_8, /* ISO-8859-8 */ + CUPS_ISO8859_9, /* ISO-8859-9 */ + CUPS_ISO8859_10, /* ISO-8859-10 */ + CUPS_UTF8, /* UTF-8 */ + CUPS_ISO8859_13, /* ISO-8859-13 */ + CUPS_ISO8859_14, /* ISO-8859-14 */ + CUPS_ISO8859_15, /* ISO-8859-15 */ + CUPS_WINDOWS_874, /* CP-874 */ + CUPS_WINDOWS_1250, /* CP-1250 */ + CUPS_WINDOWS_1251, /* CP-1251 */ + CUPS_WINDOWS_1252, /* CP-1252 */ + CUPS_WINDOWS_1253, /* CP-1253 */ + CUPS_WINDOWS_1254, /* CP-1254 */ + CUPS_WINDOWS_1255, /* CP-1255 */ + CUPS_WINDOWS_1256, /* CP-1256 */ + CUPS_WINDOWS_1257, /* CP-1257 */ + CUPS_WINDOWS_1258, /* CP-1258 */ + CUPS_KOI8_R, /* KOI-8-R */ + CUPS_KOI8_U, /* KOI-8-U */ + CUPS_ISO8859_11, /* ISO-8859-11 */ + CUPS_ISO8859_16, /* ISO-8859-16 */ + CUPS_MAC_ROMAN, /* MacRoman */ + CUPS_ENCODING_SBCS_END = 63, /* End of single-byte encodings @private@ */ + + CUPS_WINDOWS_932, /* Japanese JIS X0208-1990 */ + CUPS_WINDOWS_936, /* Simplified Chinese GB 2312-80 */ + CUPS_WINDOWS_949, /* Korean KS C5601-1992 */ + CUPS_WINDOWS_950, /* Traditional Chinese Big Five */ + CUPS_WINDOWS_1361, /* Korean Johab */ + CUPS_ENCODING_DBCS_END = 127, /* End of double-byte encodings @private@ */ + + CUPS_EUC_CN, /* EUC Simplified Chinese */ + CUPS_EUC_JP, /* EUC Japanese */ + CUPS_EUC_KR, /* EUC Korean */ + CUPS_EUC_TW, /* EUC Traditional Chinese */ + CUPS_JIS_X0213, /* JIS X0213 aka Shift JIS */ + CUPS_ENCODING_VBCS_END = 191 /* End of variable-length encodings @private@ */ +} cups_encoding_t; + +typedef struct cups_lang_s /**** Language Cache Structure ****/ +{ + struct cups_lang_s *next; /* Next language in cache */ + int used; /* Number of times this entry has been used. */ + cups_encoding_t encoding; /* Text encoding */ + char language[16]; /* Language/locale name */ + cups_array_t *strings; /* Message strings @private@ */ +} cups_lang_t; + + +/* + * Prototypes... + */ + +extern cups_lang_t *cupsLangDefault(void); +extern const char *cupsLangEncoding(cups_lang_t *lang); +extern void cupsLangFlush(void); +extern void cupsLangFree(cups_lang_t *lang); +extern cups_lang_t *cupsLangGet(const char *language); + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_LANGUAGE_H_ */ + +/* + * End of "$Id: language.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cups/libcups2.def b/cups/libcups2.def new file mode 100644 index 0000000..1576fff --- /dev/null +++ b/cups/libcups2.def @@ -0,0 +1,339 @@ +LIBRARY libcups2 +VERSION 2.9 +EXPORTS +_cupsGet1284Values +_cupsGetDests +_cupsGetPassword +_cupsGlobals +_cupsLangPrintError +_cupsLangPrintf +_cupsLangPuts +_cupsLangString +_cupsMD5Append +_cupsMD5Finish +_cupsMD5Init +_cupsMessageFree +_cupsMessageLoad +_cupsMessageLookup +_cupsNextDelay +_cupsSetError +_cupsSetLocale +_cupsStrAlloc +_cupsStrFlush +_cupsStrFormatd +_cupsStrFree +_cupsStrRetain +_cupsStrScand +_cupsStrStatistics +_cups_strcasecmp +_cups_strncasecmp +_cups_strcpy +_cups_strlcat +_cups_strlcpy +_httpAddrPort +_httpAddrSetPort +_httpAssembleUUID +_httpCreate +_httpEncodeURI +_httpPeek +_httpResolveURI +_httpWait +_ippAddAttr +_ippAttrString +_ippFindOption +_ippFreeAttr +_ppdCacheCreateWithFile +_ppdCacheCreateWithPPD +_ppdCacheDestroy +_ppdCacheGetBin +_ppdCacheGetInputSlot +_ppdCacheGetMediaType +_ppdCacheGetOutputBin +_ppdCacheGetPageSize +_ppdCacheGetSize +_ppdCacheGetSource +_ppdCacheGetType +_ppdCacheWriteFile +_ppdFreeLanguages +_ppdGetEncoding +_ppdGetLanguages +_ppdHashName +_ppdLocalizedAttr +_ppdNormalizeMakeAndModel +_ppdParseOptions +_pwgGenerateSize +_pwgInitSize +_pwgMediaForLegacy +_pwgMediaForPPD +_pwgMediaForPWG +_pwgMediaForSize +_pwgMediaTypeForType +_pwgPageSizeForMedia +cupsAddDest +cupsAddOption +cupsAdminCreateWindowsPPD +cupsAdminExportSamba +cupsArrayAdd +cupsArrayClear +cupsArrayCount +cupsArrayCurrent +cupsArrayDelete +cupsArrayDup +cupsArrayFind +cupsArrayFirst +cupsArrayGetIndex +cupsArrayGetInsert +cupsArrayIndex +cupsArrayInsert +cupsArrayLast +cupsArrayNew +cupsArrayNew2 +cupsArrayNew3 +cupsArrayNext +cupsArrayPrev +cupsArrayRemove +cupsArrayRestore +cupsArraySave +cupsArrayUserData +cupsCancelJob +cupsCharsetToUTF8 +cupsDirClose +cupsDirOpen +cupsDirRead +cupsDirRewind +cupsDoAuthentication +cupsDoFileRequest +cupsDoIORequest +cupsDoRequest +cupsEncodeOptions +cupsEncodeOptions2 +cupsEncryption +cupsFileClose +cupsFileCompression +cupsFileEOF +cupsFileFind +cupsFileFlush +cupsFileGetChar +cupsFileGetConf +cupsFileGetLine +cupsFileGets +cupsFileLock +cupsFileNumber +cupsFileOpen +cupsFileOpenFd +cupsFilePeekChar +cupsFilePrintf +cupsFilePutChar +cupsFilePuts +cupsFileRead +cupsFileRewind +cupsFileSeek +cupsFileStderr +cupsFileStdin +cupsFileStdout +cupsFileTell +cupsFileUnlock +cupsFileWrite +cupsFreeDests +cupsFreeJobs +cupsFreeOptions +cupsGetClasses +cupsGetDefault +cupsGetDefault2 +cupsGetDest +cupsGetDests +cupsGetDests2 +cupsGetFd +cupsGetFile +cupsGetJobs +cupsGetJobs2 +cupsGetOption +cupsGetPPD +cupsGetPPD2 +cupsGetPassword +cupsGetPrinters +cupsGetResponse +cupsLangDefault +cupsLangEncoding +cupsLangFlush +cupsLangFree +cupsLangGet +cupsLastError +cupsLastErrorString +cupsMarkOptions +cupsNotifySubject +cupsNotifyText +cupsParseOptions +cupsPrintFile +cupsPrintFile2 +cupsPrintFiles +cupsPrintFiles2 +cupsPutFd +cupsPutFile +cupsRemoveOption +cupsResolveConflicts +cupsSendRequest +cupsServer +cupsSetClientCertCB +cupsSetCredentials +cupsSetDests +cupsSetDests2 +cupsSetEncryption +cupsSetPasswordCB +cupsSetServer +cupsSetServerCertCB +cupsSetUser +cupsTempFd +cupsTempFile +cupsTempFile2 +cupsUTF32ToUTF8 +cupsUTF8ToCharset +cupsUTF8ToUTF32 +cupsUser +cupsWriteRequestData +httpAddCredential +httpAddrAny +httpAddrConnect +httpAddrEqual +httpAddrFreeList +httpAddrGetList +httpAddrLength +httpAddrLocalhost +httpAddrLookup +httpAddrString +httpAssembleURI +httpAssembleURIf +httpBlocking +httpCheck +httpClearCookie +httpClearFields +httpClose +httpConnect +httpConnectEncrypt +httpCopyCredentials +httpDecode64 +httpDecode64_2 +httpDelete +httpEncode64 +httpEncode64_2 +httpEncryption +httpError +httpFlush +httpFlushWrite +httpFreeCredentials +httpGet +httpGetBlocking +httpGetCookie +httpGetDateString +httpGetDateString2 +httpGetDateTime +httpGetFd +httpGetField +httpGetHostByName +httpGetHostname +httpGetLength +httpGetLength2 +httpGetStatus +httpGetSubField +httpGetSubField2 +httpGets +httpHead +httpInitialize +httpMD5 +httpMD5Final +httpMD5String +httpOptions +httpPost +httpPrintf +httpPut +httpRead +httpRead2 +httpReconnect +httpSeparate +httpSeparate2 +httpSeparateURI +httpSetCookie +httpSetCredentials +httpSetExpect +httpSetField +httpSetLength +httpSetTimeout +httpStatus +httpTrace +httpUpdate +httpWait +httpWrite +httpWrite2 +ippAddBoolean +ippAddBooleans +ippAddCollection +ippAddCollections +ippAddDate +ippAddInteger +ippAddIntegers +ippAddOctetString +ippAddRange +ippAddRanges +ippAddResolution +ippAddResolutions +ippAddSeparator +ippAddString +ippAddStrings +ippDateToTime +ippDelete +ippDeleteAttribute +ippErrorString +ippErrorValue +ippFindAttribute +ippFindNextAttribute +ippLength +ippNew +ippNewRequest +ippOpString +ippOpValue +ippPort +ippRead +ippReadFile +ippReadIO +ippSetPort +ippTagString +ippTagValue +ippTimeToDate +ippWrite +ippWriteFile +ippWriteIO +ppdClose +ppdCollect +ppdCollect2 +ppdConflicts +ppdEmit +ppdEmitAfterOrder +ppdEmitFd +ppdEmitJCL +ppdEmitJCLEnd +ppdEmitString +ppdErrorString +ppdFindAttr +ppdFindChoice +ppdFindCustomOption +ppdFindCustomParam +ppdFindMarkedChoice +ppdFindNextAttr +ppdFindOption +ppdFirstCustomParam +ppdFirstOption +ppdIsMarked +ppdLastError +ppdLocalize +ppdMarkDefaults +ppdMarkOption +ppdNextCustomParam +ppdNextOption +ppdOpen +ppdOpen2 +ppdOpenFd +ppdOpenFile +ppdPageLength +ppdPageSize +ppdPageWidth +ppdSetConformance diff --git a/cups/libcups2.rc b/cups/libcups2.rc new file mode 100644 index 0000000..bac3b17 --- /dev/null +++ b/cups/libcups2.rc @@ -0,0 +1,75 @@ +// Microsoft Visual C++ generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" +#include "WinVersRes.h" +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION MASTER_PROD_VERS + PRODUCTVERSION MASTER_PROD_VERS + FILEFLAGSMASK 0x17L +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", MASTER_COMPANY_NAME + VALUE "FileDescription", "CUPS Library" + VALUE "FileVersion", MASTER_PROD_VERS_STR + VALUE "InternalName", "libcups2.dll" + VALUE "LegalCopyright", MASTER_LEGAL_COPYRIGHT + VALUE "OriginalFilename", "libcups2.dll" + VALUE "ProductName", MASTER_PROD_NAME + VALUE "ProductVersion", MASTER_PROD_VERS_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/cups/libcups_s.exp b/cups/libcups_s.exp new file mode 100644 index 0000000..4d09553 --- /dev/null +++ b/cups/libcups_s.exp @@ -0,0 +1,83 @@ +_cups_debug_fd +_cupsGet1284Values +_cupsGetDests +_cupsGetPassword +_cupsGlobals +_cupsLangPrintError +_cupsLangPrintf +_cupsLangPuts +_cupsLangString +_cupsMD5Append +_cupsMD5Finish +_cupsMD5Init +_cupsMessageFree +_cupsMessageLoad +_cupsMessageLookup +_cupsNextDelay +_cupsSetError +_cupsSetLocale +_cupsSNMPClose +_cupsSNMPCopyOID +_cupsSNMPDefaultCommunity +_cupsSNMPIsOID +_cupsSNMPIsOIDPrefixed +_cupsSNMPOIDToString +_cupsSNMPOpen +_cupsSNMPRead +_cupsSNMPSetDebug +_cupsSNMPStringToOID +_cupsSNMPWalk +_cupsSNMPWrite +_cupsStrAlloc +_cupsStrFlush +_cupsStrFormatd +_cupsStrFree +_cupsStrRetain +_cupsStrScand +_cupsStrStatistics +_cups_getifaddrs +_cups_freeifaddrs +_cups_strcpy +_cups_strlcat +_cups_strlcpy +_httpAddrPort +_httpAddrSetPort +_httpAssembleUUID +_httpBIOMethods +_httpCreate +_httpEncodeURI +_httpPeek +_httpResolveURI +_httpSetTimeout +_httpWait +_ippAddAttr +_ippFindOption +_ippFreeAttr +_ppdFreeLanguages +_ppdGetEncoding +_ppdGetLanguages +_ppdHashName +_ppdLocalizedAttr +_ppdNormalizeMakeAndModel +_ppdParseOptions +_pwgCreateWithFile +_pwgDestroy +_pwgWriteFile +_pwgGenerateSize +_pwgInitSize +_pwgMediaForLegacy +_pwgMediaForPPD +_pwgMediaForPWG +_pwgMediaForSize +_pwgCreateWithPPD +_pwgGetBin +_pwgGetInputSlot +_pwgGetMediaType +_pwgGetOutputBin +_pwgGetPageSize +_pwgGetSize +_pwgGetSource +_pwgGetType +_pwgInputSlotForSource +_pwgMediaTypeForType +_pwgPageSizeForMedia diff --git a/cups/localize.c b/cups/localize.c new file mode 100644 index 0000000..6a35c38 --- /dev/null +++ b/cups/localize.c @@ -0,0 +1,779 @@ +/* + * "$Id: localize.c 10270 2012-02-13 17:13:21Z mike $" + * + * PPD localization routines for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ppdLocalize() - Localize the PPD file to the current locale. + * ppdLocalizeAttr() - Localize an attribute. + * ppdLocalizeIPPReason() - Get the localized version of a cupsIPPReason + * attribute. + * ppdLocalizeMarkerName() - Get the localized version of a marker-names + * attribute value. + * _ppdFreeLanguages() - Free an array of languages from _ppdGetLanguages. + * _ppdGetLanguages() - Get an array of languages from a PPD file. + * _ppdHashName() - Generate a hash value for a device or profile + * name. + * _ppdLocalizedAttr() - Find a localized attribute. + * ppd_ll_CC() - Get the current locale names. + */ + +/* + * Include necessary headers. + */ + +#include "cups-private.h" +#include "ppd-private.h" + + +/* + * Local functions... + */ + +static cups_lang_t *ppd_ll_CC(char *ll_CC, int ll_CC_size); + + +/* + * 'ppdLocalize()' - Localize the PPD file to the current locale. + * + * All groups, options, and choices are localized, as are ICC profile + * descriptions, printer presets, and custom option parameters. Each + * localized string uses the UTF-8 character encoding. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +ppdLocalize(ppd_file_t *ppd) /* I - PPD file */ +{ + int i, j, k; /* Looping vars */ + ppd_group_t *group; /* Current group */ + ppd_option_t *option; /* Current option */ + ppd_choice_t *choice; /* Current choice */ + ppd_coption_t *coption; /* Current custom option */ + ppd_cparam_t *cparam; /* Current custom parameter */ + ppd_attr_t *attr, /* Current attribute */ + *locattr; /* Localized attribute */ + char ckeyword[PPD_MAX_NAME], /* Custom keyword */ + ll_CC[6]; /* Language + country locale */ + + + /* + * Range check input... + */ + + DEBUG_printf(("ppdLocalize(ppd=%p)", ppd)); + + if (!ppd) + return (-1); + + /* + * Get the default language... + */ + + ppd_ll_CC(ll_CC, sizeof(ll_CC)); + + /* + * Now lookup all of the groups, options, choices, etc. + */ + + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + { + if ((locattr = _ppdLocalizedAttr(ppd, "Translation", group->name, + ll_CC)) != NULL) + strlcpy(group->text, locattr->text, sizeof(group->text)); + + for (j = group->num_options, option = group->options; j > 0; j --, option ++) + { + if ((locattr = _ppdLocalizedAttr(ppd, "Translation", option->keyword, + ll_CC)) != NULL) + strlcpy(option->text, locattr->text, sizeof(option->text)); + + for (k = option->num_choices, choice = option->choices; + k > 0; + k --, choice ++) + { + if (strcmp(choice->choice, "Custom") || + !ppdFindCustomOption(ppd, option->keyword)) + locattr = _ppdLocalizedAttr(ppd, option->keyword, choice->choice, + ll_CC); + else + { + snprintf(ckeyword, sizeof(ckeyword), "Custom%s", option->keyword); + + locattr = _ppdLocalizedAttr(ppd, ckeyword, "True", ll_CC); + } + + if (locattr) + strlcpy(choice->text, locattr->text, sizeof(choice->text)); + } + } + } + + /* + * Translate any custom parameters... + */ + + for (coption = (ppd_coption_t *)cupsArrayFirst(ppd->coptions); + coption; + coption = (ppd_coption_t *)cupsArrayNext(ppd->coptions)) + { + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + snprintf(ckeyword, sizeof(ckeyword), "ParamCustom%s", coption->keyword); + + if ((locattr = _ppdLocalizedAttr(ppd, ckeyword, cparam->name, + ll_CC)) != NULL) + strlcpy(cparam->text, locattr->text, sizeof(cparam->text)); + } + } + + /* + * Translate ICC profile names... + */ + + if ((attr = ppdFindAttr(ppd, "APCustomColorMatchingName", NULL)) != NULL) + { + if ((locattr = _ppdLocalizedAttr(ppd, "APCustomColorMatchingName", + attr->spec, ll_CC)) != NULL) + strlcpy(attr->text, locattr->text, sizeof(attr->text)); + } + + for (attr = ppdFindAttr(ppd, "cupsICCProfile", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL)) + { + cupsArraySave(ppd->sorted_attrs); + + if ((locattr = _ppdLocalizedAttr(ppd, "cupsICCProfile", attr->spec, + ll_CC)) != NULL) + strlcpy(attr->text, locattr->text, sizeof(attr->text)); + + cupsArrayRestore(ppd->sorted_attrs); + } + + /* + * Translate printer presets... + */ + + for (attr = ppdFindAttr(ppd, "APPrinterPreset", NULL); + attr; + attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) + { + cupsArraySave(ppd->sorted_attrs); + + if ((locattr = _ppdLocalizedAttr(ppd, "APPrinterPreset", attr->spec, + ll_CC)) != NULL) + strlcpy(attr->text, locattr->text, sizeof(attr->text)); + + cupsArrayRestore(ppd->sorted_attrs); + } + + return (0); +} + + +/* + * 'ppdLocalizeAttr()' - Localize an attribute. + * + * This function uses the current locale to find the localized attribute for + * the given main and option keywords. If no localized version of the + * attribute exists for the current locale, the unlocalized version is returned. + */ + +ppd_attr_t * /* O - Localized attribute or @code NULL@ if none exists */ +ppdLocalizeAttr(ppd_file_t *ppd, /* I - PPD file */ + const char *keyword, /* I - Main keyword */ + const char *spec) /* I - Option keyword or @code NULL@ for none */ +{ + ppd_attr_t *locattr; /* Localized attribute */ + char ll_CC[6]; /* Language + country locale */ + + + /* + * Get the default language... + */ + + ppd_ll_CC(ll_CC, sizeof(ll_CC)); + + /* + * Find the localized attribute... + */ + + if (spec) + locattr = _ppdLocalizedAttr(ppd, keyword, spec, ll_CC); + else + locattr = _ppdLocalizedAttr(ppd, "Translation", keyword, ll_CC); + + if (!locattr) + locattr = ppdFindAttr(ppd, keyword, spec); + + return (locattr); +} + + +/* + * 'ppdLocalizeIPPReason()' - Get the localized version of a cupsIPPReason + * attribute. + * + * This function uses the current locale to find the corresponding reason + * text or URI from the attribute value. If "scheme" is NULL or "text", + * the returned value contains human-readable (UTF-8) text from the translation + * string or attribute value. Otherwise the corresponding URI is returned. + * + * If no value of the requested scheme can be found, NULL is returned. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +const char * /* O - Value or NULL if not found */ +ppdLocalizeIPPReason( + ppd_file_t *ppd, /* I - PPD file */ + const char *reason, /* I - IPP reason keyword to look up */ + const char *scheme, /* I - URI scheme or NULL for text */ + char *buffer, /* I - Value buffer */ + size_t bufsize) /* I - Size of value buffer */ +{ + cups_lang_t *lang; /* Current language */ + ppd_attr_t *locattr; /* Localized attribute */ + char ll_CC[6], /* Language + country locale */ + *bufptr, /* Pointer into buffer */ + *bufend, /* Pointer to end of buffer */ + *valptr; /* Pointer into value */ + int ch, /* Hex-encoded character */ + schemelen; /* Length of scheme name */ + + + /* + * Range check input... + */ + + if (buffer) + *buffer = '\0'; + + if (!ppd || !reason || (scheme && !*scheme) || + !buffer || bufsize < PPD_MAX_TEXT) + return (NULL); + + /* + * Get the default language... + */ + + lang = ppd_ll_CC(ll_CC, sizeof(ll_CC)); + + /* + * Find the localized attribute... + */ + + if ((locattr = _ppdLocalizedAttr(ppd, "cupsIPPReason", reason, + ll_CC)) == NULL) + locattr = ppdFindAttr(ppd, "cupsIPPReason", reason); + + if (!locattr) + { + if (lang && (!scheme || !strcmp(scheme, "text"))) + { + /* + * Try to localize a standard printer-state-reason keyword... + */ + + const char *message = NULL; /* Localized message */ + + if (!strncmp(reason, "media-needed", 12)) + message = _("The paper tray needs to be filled."); + else if (!strncmp(reason, "media-jam", 9)) + message = _("There is a paper jam."); + else if (!strncmp(reason, "offline", 7) || + !strncmp(reason, "shutdown", 8)) + message = _("The printer is not connected."); + else if (!strncmp(reason, "toner-low", 9)) + message = _("The printer is running low on toner."); + else if (!strncmp(reason, "toner-empty", 11)) + message = _("The printer may be out of toner."); + else if (!strncmp(reason, "cover-open", 10)) + message = _("The printer's cover is open."); + else if (!strncmp(reason, "interlock-open", 14)) + message = _("The printer's interlock is open."); + else if (!strncmp(reason, "door-open", 9)) + message = _("The printer's door is open."); + else if (!strncmp(reason, "input-tray-missing", 18)) + message = _("The paper tray is missing."); + else if (!strncmp(reason, "media-low", 9)) + message = _("The paper tray is almost empty."); + else if (!strncmp(reason, "media-empty", 11)) + message = _("The paper tray is empty."); + else if (!strncmp(reason, "output-tray-missing", 19)) + message = _("The output bin is missing."); + else if (!strncmp(reason, "output-area-almost-full", 23)) + message = _("The output bin is almost full."); + else if (!strncmp(reason, "output-area-full", 16)) + message = _("The output bin is full."); + else if (!strncmp(reason, "marker-supply-low", 17)) + message = _("The printer is running low on ink."); + else if (!strncmp(reason, "marker-supply-empty", 19)) + message = _("The printer is out of ink."); + else if (!strncmp(reason, "marker-waste-almost-full", 24)) + message = _("The printer's waste bin is almost full."); + else if (!strncmp(reason, "marker-waste-full", 17)) + message = _("The printer's waste bin is full."); + else if (!strncmp(reason, "fuser-over-temp", 15)) + message = _("The fuser's temperature is high."); + else if (!strncmp(reason, "fuser-under-temp", 16)) + message = _("The fuser's temperature is low."); + else if (!strncmp(reason, "opc-near-eol", 12)) + message = _("The optical photoconductor will need to be replaced soon."); + else if (!strncmp(reason, "opc-life-over", 13)) + message = _("The optical photoconductor needs to be replaced."); + else if (!strncmp(reason, "developer-low", 13)) + message = _("The developer unit will need to be replaced soon."); + else if (!strncmp(reason, "developer-empty", 15)) + message = _("The developer unit needs to be replaced."); + + if (message) + { + strlcpy(buffer, _cupsLangString(lang, message), bufsize); + return (buffer); + } + } + + return (NULL); + } + + /* + * Now find the value we need... + */ + + bufend = buffer + bufsize - 1; + + if (!scheme || !strcmp(scheme, "text")) + { + /* + * Copy a text value (either the translation text or text:... URIs from + * the value... + */ + + strlcpy(buffer, locattr->text, bufsize); + + for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;) + { + if (!strncmp(valptr, "text:", 5)) + { + /* + * Decode text: URI and add to the buffer... + */ + + valptr += 5; + + while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend) + { + if (*valptr == '%' && isxdigit(valptr[1] & 255) && + isxdigit(valptr[2] & 255)) + { + /* + * Pull a hex-encoded character from the URI... + */ + + valptr ++; + + if (isdigit(*valptr & 255)) + ch = (*valptr - '0') << 4; + else + ch = (tolower(*valptr) - 'a' + 10) << 4; + valptr ++; + + if (isdigit(*valptr & 255)) + *bufptr++ = ch | (*valptr - '0'); + else + *bufptr++ = ch | (tolower(*valptr) - 'a' + 10); + valptr ++; + } + else if (*valptr == '+') + { + *bufptr++ = ' '; + valptr ++; + } + else + *bufptr++ = *valptr++; + } + } + else + { + /* + * Skip this URI... + */ + + while (*valptr && !_cups_isspace(*valptr)) + valptr++; + } + + /* + * Skip whitespace... + */ + + while (_cups_isspace(*valptr)) + valptr ++; + } + + if (bufptr > buffer) + *bufptr = '\0'; + + return (buffer); + } + else + { + /* + * Copy a URI... + */ + + schemelen = strlen(scheme); + if (scheme[schemelen - 1] == ':') /* Force scheme to be just the name */ + schemelen --; + + for (valptr = locattr->value, bufptr = buffer; *valptr && bufptr < bufend;) + { + if ((!strncmp(valptr, scheme, schemelen) && valptr[schemelen] == ':') || + (*valptr == '/' && !strcmp(scheme, "file"))) + { + /* + * Copy URI... + */ + + while (*valptr && !_cups_isspace(*valptr) && bufptr < bufend) + *bufptr++ = *valptr++; + + *bufptr = '\0'; + + return (buffer); + } + else + { + /* + * Skip this URI... + */ + + while (*valptr && !_cups_isspace(*valptr)) + valptr++; + } + + /* + * Skip whitespace... + */ + + while (_cups_isspace(*valptr)) + valptr ++; + } + + return (NULL); + } +} + + +/* + * 'ppdLocalizeMarkerName()' - Get the localized version of a marker-names + * attribute value. + * + * This function uses the current locale to find the corresponding name + * text from the attribute value. If no localized text for the requested + * name can be found, @code NULL@ is returned. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +const char * /* O - Value or @code NULL@ if not found */ +ppdLocalizeMarkerName( + ppd_file_t *ppd, /* I - PPD file */ + const char *name) /* I - Marker name to look up */ +{ + ppd_attr_t *locattr; /* Localized attribute */ + char ll_CC[6]; /* Language + country locale */ + + + /* + * Range check input... + */ + + if (!ppd || !name) + return (NULL); + + /* + * Get the default language... + */ + + ppd_ll_CC(ll_CC, sizeof(ll_CC)); + + /* + * Find the localized attribute... + */ + + if ((locattr = _ppdLocalizedAttr(ppd, "cupsMarkerName", name, + ll_CC)) == NULL) + locattr = ppdFindAttr(ppd, "cupsMarkerName", name); + + return (locattr ? locattr->text : NULL); +} + + +/* + * '_ppdFreeLanguages()' - Free an array of languages from _ppdGetLanguages. + */ + +void +_ppdFreeLanguages( + cups_array_t *languages) /* I - Languages array */ +{ + char *language; /* Current language */ + + + for (language = (char *)cupsArrayFirst(languages); + language; + language = (char *)cupsArrayNext(languages)) + free(language); + + cupsArrayDelete(languages); +} + + +/* + * '_ppdGetLanguages()' - Get an array of languages from a PPD file. + */ + +cups_array_t * /* O - Languages array */ +_ppdGetLanguages(ppd_file_t *ppd) /* I - PPD file */ +{ + cups_array_t *languages; /* Languages array */ + ppd_attr_t *attr; /* cupsLanguages attribute */ + char *value, /* Copy of attribute value */ + *start, /* Start of current language */ + *ptr; /* Pointer into languages */ + + + /* + * See if we have a cupsLanguages attribute... + */ + + if ((attr = ppdFindAttr(ppd, "cupsLanguages", NULL)) == NULL || !attr->value) + return (NULL); + + /* + * Yes, load the list... + */ + + if ((languages = cupsArrayNew((cups_array_func_t)strcmp, NULL)) == NULL) + return (NULL); + + if ((value = strdup(attr->value)) == NULL) + { + cupsArrayDelete(languages); + return (NULL); + } + + for (ptr = value; *ptr;) + { + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*ptr)) + ptr ++; + + if (!*ptr) + break; + + /* + * Find the end of this language name... + */ + + for (start = ptr; *ptr && !_cups_isspace(*ptr); ptr ++); + + if (*ptr) + *ptr++ = '\0'; + + if (!strcmp(start, "en")) + continue; + + cupsArrayAdd(languages, strdup(start)); + } + + /* + * Free the temporary string and return either an array with one or more + * values or a NULL pointer... + */ + + free(value); + + if (cupsArrayCount(languages) == 0) + { + cupsArrayDelete(languages); + return (NULL); + } + else + return (languages); +} + + +/* + * '_ppdHashName()' - Generate a hash value for a device or profile name. + * + * This function is primarily used on Mac OS X, but is generally accessible + * since cupstestppd needs to check for profile name collisions in PPD files... + */ + +unsigned /* O - Hash value */ +_ppdHashName(const char *name) /* I - Name to hash */ +{ + int mult; /* Multiplier */ + unsigned hash = 0; /* Hash value */ + + + for (mult = 1; *name && mult <= 128; mult ++, name ++) + hash += (*name & 255) * mult; + + return (hash); +} + + +/* + * '_ppdLocalizedAttr()' - Find a localized attribute. + */ + +ppd_attr_t * /* O - Localized attribute or NULL */ +_ppdLocalizedAttr(ppd_file_t *ppd, /* I - PPD file */ + const char *keyword, /* I - Main keyword */ + const char *spec, /* I - Option keyword */ + const char *ll_CC) /* I - Language + country locale */ +{ + char lkeyword[PPD_MAX_NAME]; /* Localization keyword */ + ppd_attr_t *attr; /* Current attribute */ + + + DEBUG_printf(("4_ppdLocalizedAttr(ppd=%p, keyword=\"%s\", spec=\"%s\", " + "ll_CC=\"%s\")", ppd, keyword, spec, ll_CC)); + + /* + * Look for Keyword.ll_CC, then Keyword.ll... + */ + + snprintf(lkeyword, sizeof(lkeyword), "%s.%s", ll_CC, keyword); + if ((attr = ppdFindAttr(ppd, lkeyword, spec)) == NULL) + { + snprintf(lkeyword, sizeof(lkeyword), "%2.2s.%s", ll_CC, keyword); + attr = ppdFindAttr(ppd, lkeyword, spec); + + if (!attr) + { + if (!strncmp(ll_CC, "ja", 2)) + { + /* + * Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese + * PPD files were incorrectly assigned "jp" as the locale name + * instead of "ja". Support both the old (incorrect) and new + * locale names for Japanese... + */ + + snprintf(lkeyword, sizeof(lkeyword), "jp.%s", keyword); + attr = ppdFindAttr(ppd, lkeyword, spec); + } + else if (!strncmp(ll_CC, "no", 2)) + { + /* + * Norway has two languages, "Bokmal" (the primary one) + * and "Nynorsk" (new Norwegian); we map "no" to "nb" here as + * recommended by the locale folks... + */ + + snprintf(lkeyword, sizeof(lkeyword), "nb.%s", keyword); + attr = ppdFindAttr(ppd, lkeyword, spec); + } + } + } + +#ifdef DEBUG + if (attr) + DEBUG_printf(("5_ppdLocalizedAttr: *%s %s/%s: \"%s\"\n", attr->name, + attr->spec, attr->text, attr->value ? attr->value : "")); + else + DEBUG_puts("5_ppdLocalizedAttr: NOT FOUND"); +#endif /* DEBUG */ + + return (attr); +} + + +/* + * 'ppd_ll_CC()' - Get the current locale names. + */ + +static cups_lang_t * /* O - Current language */ +ppd_ll_CC(char *ll_CC, /* O - Country-specific locale name */ + int ll_CC_size) /* I - Size of country-specific name */ +{ + cups_lang_t *lang; /* Current language */ + + + /* + * Get the current locale... + */ + + if ((lang = cupsLangDefault()) == NULL) + { + strlcpy(ll_CC, "en_US", ll_CC_size); + return (NULL); + } + + /* + * Copy the locale name... + */ + + strlcpy(ll_CC, lang->language, ll_CC_size); + + if (strlen(ll_CC) == 2) + { + /* + * Map "ll" to primary/origin country locales to have the best + * chance of finding a match... + */ + + if (!strcmp(ll_CC, "cs")) + strlcpy(ll_CC, "cs_CZ", ll_CC_size); + else if (!strcmp(ll_CC, "en")) + strlcpy(ll_CC, "en_US", ll_CC_size); + else if (!strcmp(ll_CC, "ja")) + strlcpy(ll_CC, "ja_JP", ll_CC_size); + else if (!strcmp(ll_CC, "sv")) + strlcpy(ll_CC, "sv_SE", ll_CC_size); + else if (!strcmp(ll_CC, "zh")) /* Simplified Chinese */ + strlcpy(ll_CC, "zh_CN", ll_CC_size); + } + + DEBUG_printf(("8ppd_ll_CC: lang->language=\"%s\", ll_CC=\"%s\"...", + lang->language, ll_CC)); + return (lang); +} + + +/* + * End of "$Id: localize.c 10270 2012-02-13 17:13:21Z mike $". + */ diff --git a/cups/mark.c b/cups/mark.c new file mode 100644 index 0000000..f598551 --- /dev/null +++ b/cups/mark.c @@ -0,0 +1,1101 @@ +/* + * "$Id: mark.c 9895 2011-08-12 00:16:55Z mike $" + * + * Option marking routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsMarkOptions() - Mark command-line options in a PPD file. + * ppdFindChoice() - Return a pointer to an option choice. + * ppdFindMarkedChoice() - Return the marked choice for the specified option. + * ppdFindOption() - Return a pointer to the specified option. + * ppdIsMarked() - Check to see if an option is marked. + * ppdMarkDefaults() - Mark all default options in the PPD file. + * ppdMarkOption() - Mark an option in a PPD file and return the number + * of conflicts. + * ppdFirstOption() - Return the first option in the PPD file. + * ppdNextOption() - Return the next option in the PPD file. + * _ppdParseOptions() - Parse options from a PPD file. + * ppd_debug_marked() - Output the marked array to stdout... + * ppd_defaults() - Set the defaults for this group and all sub-groups. + * ppd_mark_choices() - Mark one or more option choices from a string. + * ppd_mark_option() - Quickly mark an option without checking for + * conflicts. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * Local functions... + */ + +#ifdef DEBUG +static void ppd_debug_marked(ppd_file_t *ppd, const char *title); +#else +# define ppd_debug_marked(ppd,title) +#endif /* DEBUG */ +static void ppd_defaults(ppd_file_t *ppd, ppd_group_t *g); +static void ppd_mark_choices(ppd_file_t *ppd, const char *s); +static void ppd_mark_option(ppd_file_t *ppd, const char *option, + const char *choice); + + +/* + * 'cupsMarkOptions()' - Mark command-line options in a PPD file. + * + * This function maps the IPP "finishings", "media", "mirror", + * "multiple-document-handling", "output-bin", "print-color-mode", + * "print-quality", "printer-resolution", and "sides" attributes to their + * corresponding PPD options and choices. + */ + +int /* O - 1 if conflicts exist, 0 otherwise */ +cupsMarkOptions( + ppd_file_t *ppd, /* I - PPD file */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + int i, j; /* Looping vars */ + char *ptr, /* Pointer into string */ + s[255]; /* Temporary string */ + const char *val, /* Pointer into value */ + *media, /* media option */ + *output_bin, /* output-bin option */ + *page_size, /* PageSize option */ + *ppd_keyword, /* PPD keyword */ + *print_color_mode, /* print-color-mode option */ + *print_quality, /* print-quality option */ + *sides; /* sides option */ + cups_option_t *optptr; /* Current option */ + ppd_attr_t *attr; /* PPD attribute */ + _ppd_cache_t *cache; /* PPD cache and mapping data */ + + + /* + * Check arguments... + */ + + if (!ppd || num_options <= 0 || !options) + return (0); + + ppd_debug_marked(ppd, "Before..."); + + /* + * Do special handling for finishings, media, output-bin, output-mode, + * print-color-mode, print-quality, and PageSize... + */ + + media = cupsGetOption("media", num_options, options); + output_bin = cupsGetOption("output-bin", num_options, options); + page_size = cupsGetOption("PageSize", num_options, options); + print_quality = cupsGetOption("print-quality", num_options, options); + sides = cupsGetOption("sides", num_options, options); + + if ((print_color_mode = cupsGetOption("print-color-mode", num_options, + options)) == NULL) + print_color_mode = cupsGetOption("output-mode", num_options, options); + + if ((media || output_bin || print_color_mode || print_quality || sides) && + !ppd->cache) + { + /* + * Load PPD cache and mapping data as needed... + */ + + ppd->cache = _ppdCacheCreateWithPPD(ppd); + } + + cache = ppd->cache; + + if (media) + { + /* + * Loop through the option string, separating it at commas and marking each + * individual option as long as the corresponding PPD option (PageSize, + * InputSlot, etc.) is not also set. + * + * For PageSize, we also check for an empty option value since some versions + * of MacOS X use it to specify auto-selection of the media based solely on + * the size. + */ + + for (val = media; *val;) + { + /* + * Extract the sub-option from the string... + */ + + for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);) + *ptr++ = *val++; + *ptr++ = '\0'; + + if (*val == ',') + val ++; + + /* + * Mark it... + */ + + if (!page_size || !page_size[0]) + { + if (!_cups_strncasecmp(s, "Custom.", 7) || ppdPageSize(ppd, s)) + ppd_mark_option(ppd, "PageSize", s); + else if ((ppd_keyword = _ppdCacheGetPageSize(cache, NULL, s, NULL)) != NULL) + ppd_mark_option(ppd, "PageSize", ppd_keyword); + } + + if (cache && cache->source_option && + !cupsGetOption(cache->source_option, num_options, options) && + (ppd_keyword = _ppdCacheGetInputSlot(cache, NULL, s)) != NULL) + ppd_mark_option(ppd, cache->source_option, ppd_keyword); + + if (!cupsGetOption("MediaType", num_options, options) && + (ppd_keyword = _ppdCacheGetMediaType(cache, NULL, s)) != NULL) + ppd_mark_option(ppd, "MediaType", ppd_keyword); + } + } + + if (cache) + { + if (!cupsGetOption("com.apple.print.DocumentTicket.PMSpoolFormat", + num_options, options) && + !cupsGetOption("APPrinterPreset", num_options, options) && + (print_color_mode || print_quality)) + { + /* + * Map output-mode and print-quality to a preset... + */ + + _pwg_print_color_mode_t pwg_pcm;/* print-color-mode index */ + _pwg_print_quality_t pwg_pq; /* print-quality index */ + cups_option_t *preset;/* Current preset option */ + + if (print_color_mode && !strcmp(print_color_mode, "monochrome")) + pwg_pcm = _PWG_PRINT_COLOR_MODE_MONOCHROME; + else + pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; + + if (print_quality) + { + pwg_pq = atoi(print_quality) - IPP_QUALITY_DRAFT; + if (pwg_pq < _PWG_PRINT_QUALITY_DRAFT) + pwg_pq = _PWG_PRINT_QUALITY_DRAFT; + else if (pwg_pq > _PWG_PRINT_QUALITY_HIGH) + pwg_pq = _PWG_PRINT_QUALITY_HIGH; + } + else + pwg_pq = _PWG_PRINT_QUALITY_NORMAL; + + if (cache->num_presets[pwg_pcm][pwg_pq] == 0) + { + /* + * Try to find a preset that works so that we maximize the chances of us + * getting a good print using IPP attributes. + */ + + if (cache->num_presets[pwg_pcm][_PWG_PRINT_QUALITY_NORMAL] > 0) + pwg_pq = _PWG_PRINT_QUALITY_NORMAL; + else if (cache->num_presets[_PWG_PRINT_COLOR_MODE_COLOR][pwg_pq] > 0) + pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; + else + { + pwg_pq = _PWG_PRINT_QUALITY_NORMAL; + pwg_pcm = _PWG_PRINT_COLOR_MODE_COLOR; + } + } + + if (cache->num_presets[pwg_pcm][pwg_pq] > 0) + { + /* + * Copy the preset options as long as the corresponding names are not + * already defined in the IPP request... + */ + + for (i = cache->num_presets[pwg_pcm][pwg_pq], + preset = cache->presets[pwg_pcm][pwg_pq]; + i > 0; + i --, preset ++) + { + if (!cupsGetOption(preset->name, num_options, options)) + ppd_mark_option(ppd, preset->name, preset->value); + } + } + } + + if (output_bin && !cupsGetOption("OutputBin", num_options, options) && + (ppd_keyword = _ppdCacheGetOutputBin(cache, output_bin)) != NULL) + { + /* + * Map output-bin to OutputBin... + */ + + ppd_mark_option(ppd, "OutputBin", ppd_keyword); + } + + if (sides && cache->sides_option && + !cupsGetOption(cache->sides_option, num_options, options)) + { + /* + * Map sides to duplex option... + */ + + if (!strcmp(sides, "one-sided") && cache->sides_1sided) + ppd_mark_option(ppd, cache->sides_option, cache->sides_1sided); + else if (!strcmp(sides, "two-sided-long-edge") && + cache->sides_2sided_long) + ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_long); + else if (!strcmp(sides, "two-sided-short-edge") && + cache->sides_2sided_short) + ppd_mark_option(ppd, cache->sides_option, cache->sides_2sided_short); + } + } + + /* + * Mark other options... + */ + + for (i = num_options, optptr = options; i > 0; i --, optptr ++) + if (!_cups_strcasecmp(optptr->name, "media") || + !_cups_strcasecmp(optptr->name, "output-bin") || + !_cups_strcasecmp(optptr->name, "output-mode") || + !_cups_strcasecmp(optptr->name, "print-quality") || + !_cups_strcasecmp(optptr->name, "sides")) + continue; + else if (!_cups_strcasecmp(optptr->name, "resolution") || + !_cups_strcasecmp(optptr->name, "printer-resolution")) + { + ppd_mark_option(ppd, "Resolution", optptr->value); + ppd_mark_option(ppd, "SetResolution", optptr->value); + /* Calcomp, Linotype, QMS, Summagraphics, Tektronix, Varityper */ + ppd_mark_option(ppd, "JCLResolution", optptr->value); + /* HP */ + ppd_mark_option(ppd, "CNRes_PGP", optptr->value); + /* Canon */ + } + else if (!_cups_strcasecmp(optptr->name, "multiple-document-handling")) + { + if (!cupsGetOption("Collate", num_options, options) && + ppdFindOption(ppd, "Collate")) + { + if (_cups_strcasecmp(optptr->value, "separate-documents-uncollated-copies")) + ppd_mark_option(ppd, "Collate", "True"); + else + ppd_mark_option(ppd, "Collate", "False"); + } + } + else if (!_cups_strcasecmp(optptr->name, "finishings")) + { + /* + * Lookup cupsIPPFinishings attributes for each value... + */ + + for (ptr = optptr->value; *ptr;) + { + /* + * Get the next finishings number... + */ + + if (!isdigit(*ptr & 255)) + break; + + if ((j = strtol(ptr, &ptr, 10)) < 3) + break; + + /* + * Skip separator as needed... + */ + + if (*ptr == ',') + ptr ++; + + /* + * Look it up in the PPD file... + */ + + sprintf(s, "%d", j); + + if ((attr = ppdFindAttr(ppd, "cupsIPPFinishings", s)) == NULL) + continue; + + /* + * Apply "*Option Choice" settings from the attribute value... + */ + + ppd_mark_choices(ppd, attr->value); + } + } + else if (!_cups_strcasecmp(optptr->name, "APPrinterPreset")) + { + /* + * Lookup APPrinterPreset value... + */ + + if ((attr = ppdFindAttr(ppd, "APPrinterPreset", optptr->value)) != NULL) + { + /* + * Apply "*Option Choice" settings from the attribute value... + */ + + ppd_mark_choices(ppd, attr->value); + } + } + else if (!_cups_strcasecmp(optptr->name, "mirror")) + ppd_mark_option(ppd, "MirrorPrint", optptr->value); + else + ppd_mark_option(ppd, optptr->name, optptr->value); + + ppd_debug_marked(ppd, "After..."); + + return (ppdConflicts(ppd) > 0); +} + + +/* + * 'ppdFindChoice()' - Return a pointer to an option choice. + */ + +ppd_choice_t * /* O - Choice pointer or @code NULL@ */ +ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */ + const char *choice) /* I - Name of choice */ +{ + int i; /* Looping var */ + ppd_choice_t *c; /* Current choice */ + + + if (!o || !choice) + return (NULL); + + if (choice[0] == '{' || !_cups_strncasecmp(choice, "Custom.", 7)) + choice = "Custom"; + + for (i = o->num_choices, c = o->choices; i > 0; i --, c ++) + if (!_cups_strcasecmp(c->choice, choice)) + return (c); + + return (NULL); +} + + +/* + * 'ppdFindMarkedChoice()' - Return the marked choice for the specified option. + */ + +ppd_choice_t * /* O - Pointer to choice or @code NULL@ */ +ppdFindMarkedChoice(ppd_file_t *ppd, /* I - PPD file */ + const char *option) /* I - Keyword/option name */ +{ + ppd_choice_t key, /* Search key for choice */ + *marked; /* Marked choice */ + + + DEBUG_printf(("2ppdFindMarkedChoice(ppd=%p, option=\"%s\")", ppd, option)); + + if ((key.option = ppdFindOption(ppd, option)) == NULL) + { + DEBUG_puts("3ppdFindMarkedChoice: Option not found, returning NULL"); + return (NULL); + } + + marked = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key); + + DEBUG_printf(("3ppdFindMarkedChoice: Returning %p(%s)...", marked, + marked ? marked->choice : "NULL")); + + return (marked); +} + + +/* + * 'ppdFindOption()' - Return a pointer to the specified option. + */ + +ppd_option_t * /* O - Pointer to option or @code NULL@ */ +ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */ + const char *option) /* I - Option/Keyword name */ +{ + /* + * Range check input... + */ + + if (!ppd || !option) + return (NULL); + + if (ppd->options) + { + /* + * Search in the array... + */ + + ppd_option_t key; /* Option search key */ + + + strlcpy(key.keyword, option, sizeof(key.keyword)); + + return ((ppd_option_t *)cupsArrayFind(ppd->options, &key)); + } + else + { + /* + * Search in each group... + */ + + int i, j; /* Looping vars */ + ppd_group_t *group; /* Current group */ + ppd_option_t *optptr; /* Current option */ + + + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + for (j = group->num_options, optptr = group->options; + j > 0; + j --, optptr ++) + if (!_cups_strcasecmp(optptr->keyword, option)) + return (optptr); + + return (NULL); + } +} + + +/* + * 'ppdIsMarked()' - Check to see if an option is marked. + */ + +int /* O - Non-zero if option is marked */ +ppdIsMarked(ppd_file_t *ppd, /* I - PPD file data */ + const char *option, /* I - Option/Keyword name */ + const char *choice) /* I - Choice name */ +{ + ppd_choice_t key, /* Search key */ + *c; /* Choice pointer */ + + + if (!ppd) + return (0); + + if ((key.option = ppdFindOption(ppd, option)) == NULL) + return (0); + + if ((c = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) == NULL) + return (0); + + return (!strcmp(c->choice, choice)); +} + + +/* + * 'ppdMarkDefaults()' - Mark all default options in the PPD file. + */ + +void +ppdMarkDefaults(ppd_file_t *ppd) /* I - PPD file record */ +{ + int i; /* Looping variables */ + ppd_group_t *g; /* Current group */ + ppd_choice_t *c; /* Current choice */ + + + if (!ppd) + return; + + /* + * Clean out the marked array... + */ + + for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); + c; + c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) + { + cupsArrayRemove(ppd->marked, c); + c->marked = 0; + } + + /* + * Then repopulate it with the defaults... + */ + + for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++) + ppd_defaults(ppd, g); +} + + +/* + * 'ppdMarkOption()' - Mark an option in a PPD file and return the number of + * conflicts. + */ + +int /* O - Number of conflicts */ +ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */ + const char *option, /* I - Keyword */ + const char *choice) /* I - Option name */ +{ + DEBUG_printf(("ppdMarkOption(ppd=%p, option=\"%s\", choice=\"%s\")", + ppd, option, choice)); + + /* + * Range check input... + */ + + if (!ppd || !option || !choice) + return (0); + + /* + * Mark the option... + */ + + ppd_mark_option(ppd, option, choice); + + /* + * Return the number of conflicts... + */ + + return (ppdConflicts(ppd)); +} + + +/* + * 'ppdFirstOption()' - Return the first option in the PPD file. + * + * Options are returned from all groups in ascending alphanumeric order. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_option_t * /* O - First option or @code NULL@ */ +ppdFirstOption(ppd_file_t *ppd) /* I - PPD file */ +{ + if (!ppd) + return (NULL); + else + return ((ppd_option_t *)cupsArrayFirst(ppd->options)); +} + + +/* + * 'ppdNextOption()' - Return the next option in the PPD file. + * + * Options are returned from all groups in ascending alphanumeric order. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_option_t * /* O - Next option or @code NULL@ */ +ppdNextOption(ppd_file_t *ppd) /* I - PPD file */ +{ + if (!ppd) + return (NULL); + else + return ((ppd_option_t *)cupsArrayNext(ppd->options)); +} + + +/* + * '_ppdParseOptions()' - Parse options from a PPD file. + * + * This function looks for strings of the form: + * + * *option choice ... *optionN choiceN + * property value ... propertyN valueN + * + * It stops when it finds a string that doesn't match this format. + */ + +int /* O - Number of options */ +_ppdParseOptions( + const char *s, /* I - String to parse */ + int num_options, /* I - Number of options */ + cups_option_t **options, /* IO - Options */ + _ppd_parse_t which) /* I - What to parse */ +{ + char option[PPD_MAX_NAME * 2 + 1], /* Current option/property */ + choice[PPD_MAX_NAME], /* Current choice/value */ + *ptr; /* Pointer into option or choice */ + + + if (!s) + return (num_options); + + /* + * Read all of the "*Option Choice" and "property value" pairs from the + * string, add them to an options array as we go... + */ + + while (*s) + { + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*s)) + s ++; + + /* + * Get the option/property name... + */ + + ptr = option; + while (*s && !_cups_isspace(*s) && ptr < (option + sizeof(option) - 1)) + *ptr++ = *s++; + + if (ptr == s || !_cups_isspace(*s)) + break; + + *ptr = '\0'; + + /* + * Get the choice... + */ + + while (_cups_isspace(*s)) + s ++; + + if (!*s) + break; + + ptr = choice; + while (*s && !_cups_isspace(*s) && ptr < (choice + sizeof(choice) - 1)) + *ptr++ = *s++; + + if (*s && !_cups_isspace(*s)) + break; + + *ptr = '\0'; + + /* + * Add it to the options array... + */ + + if (option[0] == '*' && which != _PPD_PARSE_PROPERTIES) + num_options = cupsAddOption(option + 1, choice, num_options, options); + else if (option[0] != '*' && which != _PPD_PARSE_OPTIONS) + num_options = cupsAddOption(option, choice, num_options, options); + } + + return (num_options); +} + + +#ifdef DEBUG +/* + * 'ppd_debug_marked()' - Output the marked array to stdout... + */ + +static void +ppd_debug_marked(ppd_file_t *ppd, /* I - PPD file data */ + const char *title) /* I - Title for list */ +{ + ppd_choice_t *c; /* Current choice */ + + + DEBUG_printf(("2cupsMarkOptions: %s", title)); + + for (c = (ppd_choice_t *)cupsArrayFirst(ppd->marked); + c; + c = (ppd_choice_t *)cupsArrayNext(ppd->marked)) + DEBUG_printf(("2cupsMarkOptions: %s=%s", c->option->keyword, c->choice)); +} +#endif /* DEBUG */ + + +/* + * 'ppd_defaults()' - Set the defaults for this group and all sub-groups. + */ + +static void +ppd_defaults(ppd_file_t *ppd, /* I - PPD file */ + ppd_group_t *g) /* I - Group to default */ +{ + int i; /* Looping var */ + ppd_option_t *o; /* Current option */ + ppd_group_t *sg; /* Current sub-group */ + + + for (i = g->num_options, o = g->options; i > 0; i --, o ++) + if (_cups_strcasecmp(o->keyword, "PageRegion") != 0) + ppdMarkOption(ppd, o->keyword, o->defchoice); + + for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++) + ppd_defaults(ppd, sg); +} + + +/* + * 'ppd_mark_choices()' - Mark one or more option choices from a string. + */ + +static void +ppd_mark_choices(ppd_file_t *ppd, /* I - PPD file */ + const char *s) /* I - "*Option Choice ..." string */ +{ + int i, /* Looping var */ + num_options; /* Number of options */ + cups_option_t *options, /* Options */ + *option; /* Current option */ + + + if (!s) + return; + + options = NULL; + num_options = _ppdParseOptions(s, 0, &options, 0); + + for (i = num_options, option = options; i > 0; i --, option ++) + ppd_mark_option(ppd, option->name, option->value); + + cupsFreeOptions(num_options, options); +} + + +/* + * 'ppd_mark_option()' - Quick mark an option without checking for conflicts. + */ + +static void +ppd_mark_option(ppd_file_t *ppd, /* I - PPD file */ + const char *option, /* I - Option name */ + const char *choice) /* I - Choice name */ +{ + int i, j; /* Looping vars */ + ppd_option_t *o; /* Option pointer */ + ppd_choice_t *c, /* Choice pointer */ + *oldc, /* Old choice pointer */ + key; /* Search key for choice */ + struct lconv *loc; /* Locale data */ + + + DEBUG_printf(("7ppd_mark_option(ppd=%p, option=\"%s\", choice=\"%s\")", + ppd, option, choice)); + + /* + * AP_D_InputSlot is the "default input slot" on MacOS X, and setting + * it clears the regular InputSlot choices... + */ + + if (!_cups_strcasecmp(option, "AP_D_InputSlot")) + { + cupsArraySave(ppd->options); + + if ((o = ppdFindOption(ppd, "InputSlot")) != NULL) + { + key.option = o; + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + } + + cupsArrayRestore(ppd->options); + } + + /* + * Check for custom options... + */ + + cupsArraySave(ppd->options); + + o = ppdFindOption(ppd, option); + + cupsArrayRestore(ppd->options); + + if (!o) + return; + + loc = localeconv(); + + if (!_cups_strncasecmp(choice, "Custom.", 7)) + { + /* + * Handle a custom option... + */ + + if ((c = ppdFindChoice(o, "Custom")) == NULL) + return; + + if (!_cups_strcasecmp(option, "PageSize")) + { + /* + * Handle custom page sizes... + */ + + ppdPageSize(ppd, choice); + } + else + { + /* + * Handle other custom options... + */ + + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + char *units; /* Custom points units */ + + + if ((coption = ppdFindCustomOption(ppd, option)) != NULL) + { + if ((cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params)) == NULL) + return; + + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_REAL : + cparam->current.custom_real = (float)_cupsStrScand(choice + 7, + NULL, loc); + break; + + case PPD_CUSTOM_POINTS : + cparam->current.custom_points = (float)_cupsStrScand(choice + 7, + &units, + loc); + + if (units) + { + if (!_cups_strcasecmp(units, "cm")) + cparam->current.custom_points *= 72.0f / 2.54f; + else if (!_cups_strcasecmp(units, "mm")) + cparam->current.custom_points *= 72.0f / 25.4f; + else if (!_cups_strcasecmp(units, "m")) + cparam->current.custom_points *= 72.0f / 0.0254f; + else if (!_cups_strcasecmp(units, "in")) + cparam->current.custom_points *= 72.0f; + else if (!_cups_strcasecmp(units, "ft")) + cparam->current.custom_points *= 12.0f * 72.0f; + } + break; + + case PPD_CUSTOM_INT : + cparam->current.custom_int = atoi(choice + 7); + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + if (cparam->current.custom_string) + _cupsStrFree(cparam->current.custom_string); + + cparam->current.custom_string = _cupsStrAlloc(choice + 7); + break; + } + } + } + + /* + * Make sure that we keep the option marked below... + */ + + choice = "Custom"; + } + else if (choice[0] == '{') + { + /* + * Handle multi-value custom options... + */ + + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + char *units; /* Custom points units */ + int num_vals; /* Number of values */ + cups_option_t *vals, /* Values */ + *val; /* Value */ + + + if ((c = ppdFindChoice(o, "Custom")) == NULL) + return; + + if ((coption = ppdFindCustomOption(ppd, option)) != NULL) + { + num_vals = cupsParseOptions(choice, 0, &vals); + + for (i = 0, val = vals; i < num_vals; i ++, val ++) + { + if ((cparam = ppdFindCustomParam(coption, val->name)) == NULL) + continue; + + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + case PPD_CUSTOM_INVCURVE : + case PPD_CUSTOM_REAL : + cparam->current.custom_real = (float)_cupsStrScand(val->value, + NULL, loc); + break; + + case PPD_CUSTOM_POINTS : + cparam->current.custom_points = (float)_cupsStrScand(val->value, + &units, + loc); + + if (units) + { + if (!_cups_strcasecmp(units, "cm")) + cparam->current.custom_points *= 72.0f / 2.54f; + else if (!_cups_strcasecmp(units, "mm")) + cparam->current.custom_points *= 72.0f / 25.4f; + else if (!_cups_strcasecmp(units, "m")) + cparam->current.custom_points *= 72.0f / 0.0254f; + else if (!_cups_strcasecmp(units, "in")) + cparam->current.custom_points *= 72.0f; + else if (!_cups_strcasecmp(units, "ft")) + cparam->current.custom_points *= 12.0f * 72.0f; + } + break; + + case PPD_CUSTOM_INT : + cparam->current.custom_int = atoi(val->value); + break; + + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + if (cparam->current.custom_string) + _cupsStrFree(cparam->current.custom_string); + + cparam->current.custom_string = _cupsStrRetain(val->value); + break; + } + } + + cupsFreeOptions(num_vals, vals); + } + } + else + { + for (i = o->num_choices, c = o->choices; i > 0; i --, c ++) + if (!_cups_strcasecmp(c->choice, choice)) + break; + + if (!i) + return; + } + + /* + * Option found; mark it and then handle unmarking any other options. + */ + + if (o->ui != PPD_UI_PICKMANY) + { + /* + * Unmark all other choices... + */ + + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, c)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + + if (!_cups_strcasecmp(option, "PageSize") || !_cups_strcasecmp(option, "PageRegion")) + { + /* + * Mark current page size... + */ + + for (j = 0; j < ppd->num_sizes; j ++) + ppd->sizes[j].marked = !_cups_strcasecmp(ppd->sizes[j].name, + choice); + + /* + * Unmark the current PageSize or PageRegion setting, as + * appropriate... + */ + + cupsArraySave(ppd->options); + + if (!_cups_strcasecmp(option, "PageSize")) + { + if ((o = ppdFindOption(ppd, "PageRegion")) != NULL) + { + key.option = o; + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + } + } + else + { + if ((o = ppdFindOption(ppd, "PageSize")) != NULL) + { + key.option = o; + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + } + } + + cupsArrayRestore(ppd->options); + } + else if (!_cups_strcasecmp(option, "InputSlot")) + { + /* + * Unmark ManualFeed option... + */ + + cupsArraySave(ppd->options); + + if ((o = ppdFindOption(ppd, "ManualFeed")) != NULL) + { + key.option = o; + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + } + + cupsArrayRestore(ppd->options); + } + else if (!_cups_strcasecmp(option, "ManualFeed") && + !_cups_strcasecmp(choice, "True")) + { + /* + * Unmark InputSlot option... + */ + + cupsArraySave(ppd->options); + + if ((o = ppdFindOption(ppd, "InputSlot")) != NULL) + { + key.option = o; + if ((oldc = (ppd_choice_t *)cupsArrayFind(ppd->marked, &key)) != NULL) + { + oldc->marked = 0; + cupsArrayRemove(ppd->marked, oldc); + } + } + + cupsArrayRestore(ppd->options); + } + } + + c->marked = 1; + + cupsArrayAdd(ppd->marked, c); +} + + +/* + * End of "$Id: mark.c 9895 2011-08-12 00:16:55Z mike $". + */ diff --git a/cups/md5-private.h b/cups/md5-private.h new file mode 100644 index 0000000..720ae34 --- /dev/null +++ b/cups/md5-private.h @@ -0,0 +1,79 @@ +/* + * "$Id: md5-private.h 9042 2010-03-24 00:45:34Z mike $" + * + * Private MD5 definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2005 by Easy Software Products + * + * Copyright (C) 1999 Aladdin Enterprises. All rights reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors 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. + * + * L. Peter Deutsch + * ghost@aladdin.com + */ + +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321. + It is derived directly from the text of the RFC and not from the + reference implementation. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + */ + +#ifndef _CUPS_MD5_PRIVATE_H_ +# define _CUPS_MD5_PRIVATE_H_ + +/* Define the state of the MD5 Algorithm. */ +typedef struct _cups_md5_state_s { + unsigned int count[2]; /* message length in bits, lsw first */ + unsigned int abcd[4]; /* digest buffer */ + unsigned char buf[64]; /* accumulate block */ +} _cups_md5_state_t; + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* Initialize the algorithm. */ +void _cupsMD5Init(_cups_md5_state_t *pms); + +/* Append a string to the message. */ +void _cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes); + +/* Finish the message and return the digest. */ +void _cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]); + +# ifdef __cplusplus +} /* end extern "C" */ +# endif /* __cplusplus */ +#endif /* !_CUPS_MD5_PRIVATE_H_ */ + +/* + * End of "$Id: md5-private.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/md5.c b/cups/md5.c new file mode 100644 index 0000000..f7c42ad --- /dev/null +++ b/cups/md5.c @@ -0,0 +1,346 @@ +/* + * "$Id: md5.c 9042 2010-03-24 00:45:34Z mike $" + * + * Private MD5 implementation for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2005 by Easy Software Products + * + * Copyright (C) 1999 Aladdin Enterprises. All rights reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors 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. + * + * L. Peter Deutsch + * ghost@aladdin.com + */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321. + It is derived directly from the text of the RFC and not from the + reference implementation. + + The original and principal author of md5.c is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). + 1999-05-03 lpd Original version. + */ + +#include "md5-private.h" +#include "string-private.h" + +#define T1 0xd76aa478 +#define T2 0xe8c7b756 +#define T3 0x242070db +#define T4 0xc1bdceee +#define T5 0xf57c0faf +#define T6 0x4787c62a +#define T7 0xa8304613 +#define T8 0xfd469501 +#define T9 0x698098d8 +#define T10 0x8b44f7af +#define T11 0xffff5bb1 +#define T12 0x895cd7be +#define T13 0x6b901122 +#define T14 0xfd987193 +#define T15 0xa679438e +#define T16 0x49b40821 +#define T17 0xf61e2562 +#define T18 0xc040b340 +#define T19 0x265e5a51 +#define T20 0xe9b6c7aa +#define T21 0xd62f105d +#define T22 0x02441453 +#define T23 0xd8a1e681 +#define T24 0xe7d3fbc8 +#define T25 0x21e1cde6 +#define T26 0xc33707d6 +#define T27 0xf4d50d87 +#define T28 0x455a14ed +#define T29 0xa9e3e905 +#define T30 0xfcefa3f8 +#define T31 0x676f02d9 +#define T32 0x8d2a4c8a +#define T33 0xfffa3942 +#define T34 0x8771f681 +#define T35 0x6d9d6122 +#define T36 0xfde5380c +#define T37 0xa4beea44 +#define T38 0x4bdecfa9 +#define T39 0xf6bb4b60 +#define T40 0xbebfbc70 +#define T41 0x289b7ec6 +#define T42 0xeaa127fa +#define T43 0xd4ef3085 +#define T44 0x04881d05 +#define T45 0xd9d4d039 +#define T46 0xe6db99e5 +#define T47 0x1fa27cf8 +#define T48 0xc4ac5665 +#define T49 0xf4292244 +#define T50 0x432aff97 +#define T51 0xab9423a7 +#define T52 0xfc93a039 +#define T53 0x655b59c3 +#define T54 0x8f0ccc92 +#define T55 0xffeff47d +#define T56 0x85845dd1 +#define T57 0x6fa87e4f +#define T58 0xfe2ce6e0 +#define T59 0xa3014314 +#define T60 0x4e0811a1 +#define T61 0xf7537e82 +#define T62 0xbd3af235 +#define T63 0x2ad7d2bb +#define T64 0xeb86d391 + +static void +_cups_md5_process(_cups_md5_state_t *pms, const unsigned char *data /*[64]*/) +{ + unsigned int + a = pms->abcd[0], b = pms->abcd[1], + c = pms->abcd[2], d = pms->abcd[3]; + unsigned int t; + +#ifndef ARCH_IS_BIG_ENDIAN +# define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */ +#endif +#if ARCH_IS_BIG_ENDIAN + + /* + * On big-endian machines, we must arrange the bytes in the right + * order. (This also works on machines of unknown byte order.) + */ + unsigned int X[16]; + const unsigned char *xp = data; + int i; + + for (i = 0; i < 16; ++i, xp += 4) + X[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); + +#else /* !ARCH_IS_BIG_ENDIAN */ + + /* + * On little-endian machines, we can process properly aligned data + * without copying it. + */ + unsigned int xbuf[16]; + const unsigned int *X; + + if (!((data - (const unsigned char *)0) & 3)) { + /* data are properly aligned */ + X = (const unsigned int *)data; + } else { + /* not aligned */ + memcpy(xbuf, data, 64); + X = xbuf; + } +#endif + +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ +#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 7, T1); + SET(d, a, b, c, 1, 12, T2); + SET(c, d, a, b, 2, 17, T3); + SET(b, c, d, a, 3, 22, T4); + SET(a, b, c, d, 4, 7, T5); + SET(d, a, b, c, 5, 12, T6); + SET(c, d, a, b, 6, 17, T7); + SET(b, c, d, a, 7, 22, T8); + SET(a, b, c, d, 8, 7, T9); + SET(d, a, b, c, 9, 12, T10); + SET(c, d, a, b, 10, 17, T11); + SET(b, c, d, a, 11, 22, T12); + SET(a, b, c, d, 12, 7, T13); + SET(d, a, b, c, 13, 12, T14); + SET(c, d, a, b, 14, 17, T15); + SET(b, c, d, a, 15, 22, T16); +#undef SET + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ +#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 1, 5, T17); + SET(d, a, b, c, 6, 9, T18); + SET(c, d, a, b, 11, 14, T19); + SET(b, c, d, a, 0, 20, T20); + SET(a, b, c, d, 5, 5, T21); + SET(d, a, b, c, 10, 9, T22); + SET(c, d, a, b, 15, 14, T23); + SET(b, c, d, a, 4, 20, T24); + SET(a, b, c, d, 9, 5, T25); + SET(d, a, b, c, 14, 9, T26); + SET(c, d, a, b, 3, 14, T27); + SET(b, c, d, a, 8, 20, T28); + SET(a, b, c, d, 13, 5, T29); + SET(d, a, b, c, 2, 9, T30); + SET(c, d, a, b, 7, 14, T31); + SET(b, c, d, a, 12, 20, T32); +#undef SET + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + H(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 5, 4, T33); + SET(d, a, b, c, 8, 11, T34); + SET(c, d, a, b, 11, 16, T35); + SET(b, c, d, a, 14, 23, T36); + SET(a, b, c, d, 1, 4, T37); + SET(d, a, b, c, 4, 11, T38); + SET(c, d, a, b, 7, 16, T39); + SET(b, c, d, a, 10, 23, T40); + SET(a, b, c, d, 13, 4, T41); + SET(d, a, b, c, 0, 11, T42); + SET(c, d, a, b, 3, 16, T43); + SET(b, c, d, a, 6, 23, T44); + SET(a, b, c, d, 9, 4, T45); + SET(d, a, b, c, 12, 11, T46); + SET(c, d, a, b, 15, 16, T47); + SET(b, c, d, a, 2, 23, T48); +#undef SET + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ +#define I(x, y, z) ((y) ^ ((x) | ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 6, T49); + SET(d, a, b, c, 7, 10, T50); + SET(c, d, a, b, 14, 15, T51); + SET(b, c, d, a, 5, 21, T52); + SET(a, b, c, d, 12, 6, T53); + SET(d, a, b, c, 3, 10, T54); + SET(c, d, a, b, 10, 15, T55); + SET(b, c, d, a, 1, 21, T56); + SET(a, b, c, d, 8, 6, T57); + SET(d, a, b, c, 15, 10, T58); + SET(c, d, a, b, 6, 15, T59); + SET(b, c, d, a, 13, 21, T60); + SET(a, b, c, d, 4, 6, T61); + SET(d, a, b, c, 11, 10, T62); + SET(c, d, a, b, 2, 15, T63); + SET(b, c, d, a, 9, 21, T64); +#undef SET + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + pms->abcd[0] += a; + pms->abcd[1] += b; + pms->abcd[2] += c; + pms->abcd[3] += d; +} + +void +_cupsMD5Init(_cups_md5_state_t *pms) +{ + pms->count[0] = pms->count[1] = 0; + pms->abcd[0] = 0x67452301; + pms->abcd[1] = 0xefcdab89; + pms->abcd[2] = 0x98badcfe; + pms->abcd[3] = 0x10325476; +} + +void +_cupsMD5Append(_cups_md5_state_t *pms, const unsigned char *data, int nbytes) +{ + const unsigned char *p = data; + int left = nbytes; + int offset = (pms->count[0] >> 3) & 63; + unsigned int nbits = (unsigned int)(nbytes << 3); + + if (nbytes <= 0) + return; + + /* Update the message length. */ + pms->count[1] += nbytes >> 29; + pms->count[0] += nbits; + if (pms->count[0] < nbits) + pms->count[1]++; + + /* Process an initial partial block. */ + if (offset) { + int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); + + memcpy(pms->buf + offset, p, copy); + if (offset + copy < 64) + return; + p += copy; + left -= copy; + _cups_md5_process(pms, pms->buf); + } + + /* Process full blocks. */ + for (; left >= 64; p += 64, left -= 64) + _cups_md5_process(pms, p); + + /* Process a final partial block. */ + if (left) + memcpy(pms->buf, p, left); +} + +void +_cupsMD5Finish(_cups_md5_state_t *pms, unsigned char digest[16]) +{ + static const unsigned char pad[64] = { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + unsigned char data[8]; + int i; + + /* Save the length before padding. */ + for (i = 0; i < 8; ++i) + data[i] = (unsigned char)(pms->count[i >> 2] >> ((i & 3) << 3)); + /* Pad to 56 bytes mod 64. */ + _cupsMD5Append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); + /* Append the length. */ + _cupsMD5Append(pms, data, 8); + for (i = 0; i < 16; ++i) + digest[i] = (unsigned char)(pms->abcd[i >> 2] >> ((i & 3) << 3)); +} + + +/* + * End of "$Id: md5.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/md5passwd.c b/cups/md5passwd.c new file mode 100644 index 0000000..8b53897 --- /dev/null +++ b/cups/md5passwd.c @@ -0,0 +1,142 @@ +/* + * "$Id: md5passwd.c 9042 2010-03-24 00:45:34Z mike $" + * + * MD5 password support for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * httpMD5() - Compute the MD5 sum of the username:group:password. + * httpMD5Nonce() - Combine the MD5 sum of the username, group, and password + * with the server-supplied nonce value. + * httpMD5String() - Convert an MD5 sum to a character string. + */ + +/* + * Include necessary headers... + */ + +#include "http-private.h" +#include "string-private.h" + + +/* + * 'httpMD5()' - Compute the MD5 sum of the username:group:password. + */ + +char * /* O - MD5 sum */ +httpMD5(const char *username, /* I - User name */ + const char *realm, /* I - Realm name */ + const char *passwd, /* I - Password string */ + char md5[33]) /* O - MD5 string */ +{ + _cups_md5_state_t state; /* MD5 state info */ + unsigned char sum[16]; /* Sum data */ + char line[256]; /* Line to sum */ + + + /* + * Compute the MD5 sum of the user name, group name, and password. + */ + + snprintf(line, sizeof(line), "%s:%s:%s", username, realm, passwd); + _cupsMD5Init(&state); + _cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line)); + _cupsMD5Finish(&state, sum); + + /* + * Return the sum... + */ + + return (httpMD5String(sum, md5)); +} + + +/* + * 'httpMD5Final()' - Combine the MD5 sum of the username, group, and password + * with the server-supplied nonce value, method, and + * request-uri. + */ + +char * /* O - New sum */ +httpMD5Final(const char *nonce, /* I - Server nonce value */ + const char *method, /* I - METHOD (GET, POST, etc.) */ + const char *resource, /* I - Resource path */ + char md5[33]) /* IO - MD5 sum */ +{ + _cups_md5_state_t state; /* MD5 state info */ + unsigned char sum[16]; /* Sum data */ + char line[1024]; /* Line of data */ + char a2[33]; /* Hash of method and resource */ + + + /* + * First compute the MD5 sum of the method and resource... + */ + + snprintf(line, sizeof(line), "%s:%s", method, resource); + _cupsMD5Init(&state); + _cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line)); + _cupsMD5Finish(&state, sum); + httpMD5String(sum, a2); + + /* + * Then combine A1 (MD5 of username, realm, and password) with the nonce + * and A2 (method + resource) values to get the final MD5 sum for the + * request... + */ + + snprintf(line, sizeof(line), "%s:%s:%s", md5, nonce, a2); + + _cupsMD5Init(&state); + _cupsMD5Append(&state, (unsigned char *)line, (int)strlen(line)); + _cupsMD5Finish(&state, sum); + + return (httpMD5String(sum, md5)); +} + + +/* + * 'httpMD5String()' - Convert an MD5 sum to a character string. + */ + +char * /* O - MD5 sum in hex */ +httpMD5String(const unsigned char *sum, /* I - MD5 sum data */ + char md5[33]) + /* O - MD5 sum in hex */ +{ + int i; /* Looping var */ + char *md5ptr; /* Pointer into MD5 string */ + static const char hex[] = "0123456789abcdef"; + /* Hex digits */ + + + /* + * Convert the MD5 sum to hexadecimal... + */ + + for (i = 16, md5ptr = md5; i > 0; i --, sum ++) + { + *md5ptr++ = hex[*sum >> 4]; + *md5ptr++ = hex[*sum & 15]; + } + + *md5ptr = '\0'; + + return (md5); +} + + +/* + * End of "$Id: md5passwd.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/notify.c b/cups/notify.c new file mode 100644 index 0000000..9ac2f62 --- /dev/null +++ b/cups/notify.c @@ -0,0 +1,202 @@ +/* + * "$Id: notify.c 9042 2010-03-24 00:45:34Z mike $" + * + * Notification routines for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2005-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsNotifySubject() - Return the subject for the given notification + * message. + * cupsNotifyText() - Return the text for the given notification message. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * 'cupsNotifySubject()' - Return the subject for the given notification message. + * + * The returned string must be freed by the caller using @code free@. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Subject string or @code NULL@ */ +cupsNotifySubject(cups_lang_t *lang, /* I - Language data */ + ipp_t *event) /* I - Event data */ +{ + char buffer[1024]; /* Subject buffer */ + const char *prefix, /* Prefix on subject */ + *state; /* Printer/job state string */ + ipp_attribute_t *job_id, /* notify-job-id */ + *job_name, /* job-name */ + *job_state, /* job-state */ + *printer_name, /* printer-name */ + *printer_state, /* printer-state */ + *printer_uri, /* notify-printer-uri */ + *subscribed; /* notify-subscribed-event */ + + + /* + * Range check input... + */ + + if (!event || !lang) + return (NULL); + + /* + * Get the required attributes... + */ + + job_id = ippFindAttribute(event, "notify-job-id", IPP_TAG_INTEGER); + job_name = ippFindAttribute(event, "job-name", IPP_TAG_NAME); + job_state = ippFindAttribute(event, "job-state", IPP_TAG_ENUM); + printer_name = ippFindAttribute(event, "printer-name", IPP_TAG_NAME); + printer_state = ippFindAttribute(event, "printer-state", IPP_TAG_ENUM); + printer_uri = ippFindAttribute(event, "notify-printer-uri", IPP_TAG_URI); + subscribed = ippFindAttribute(event, "notify-subscribed-event", + IPP_TAG_KEYWORD); + + + if (job_id && printer_name && printer_uri && job_state) + { + /* + * Job event... + */ + + prefix = _cupsLangString(lang, _("Print Job:")); + + switch (job_state->values[0].integer) + { + case IPP_JOB_PENDING : + state = _cupsLangString(lang, _("pending")); + break; + case IPP_JOB_HELD : + state = _cupsLangString(lang, _("held")); + break; + case IPP_JOB_PROCESSING : + state = _cupsLangString(lang, _("processing")); + break; + case IPP_JOB_STOPPED : + state = _cupsLangString(lang, _("stopped")); + break; + case IPP_JOB_CANCELED : + state = _cupsLangString(lang, _("canceled")); + break; + case IPP_JOB_ABORTED : + state = _cupsLangString(lang, _("aborted")); + break; + case IPP_JOB_COMPLETED : + state = _cupsLangString(lang, _("completed")); + break; + default : + state = _cupsLangString(lang, _("unknown")); + break; + } + + snprintf(buffer, sizeof(buffer), "%s %s-%d (%s) %s", + prefix, + printer_name->values[0].string.text, + job_id->values[0].integer, + job_name ? job_name->values[0].string.text : + _cupsLangString(lang, _("untitled")), + state); + } + else if (printer_uri && printer_name && printer_state) + { + /* + * Printer event... + */ + + prefix = _cupsLangString(lang, _("Printer:")); + + switch (printer_state->values[0].integer) + { + case IPP_PRINTER_IDLE : + state = _cupsLangString(lang, _("idle")); + break; + case IPP_PRINTER_PROCESSING : + state = _cupsLangString(lang, _("processing")); + break; + case IPP_PRINTER_STOPPED : + state = _cupsLangString(lang, _("stopped")); + break; + default : + state = _cupsLangString(lang, _("unknown")); + break; + } + + snprintf(buffer, sizeof(buffer), "%s %s %s", + prefix, + printer_name->values[0].string.text, + state); + } + else if (subscribed) + strlcpy(buffer, subscribed->values[0].string.text, sizeof(buffer)); + else + return (NULL); + + /* + * Duplicate and return the subject string... + */ + + return (strdup(buffer)); +} + + +/* + * 'cupsNotifyText()' - Return the text for the given notification message. + * + * The returned string must be freed by the caller using @code free@. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +char * /* O - Message text or @code NULL@ */ +cupsNotifyText(cups_lang_t *lang, /* I - Language data */ + ipp_t *event) /* I - Event data */ +{ + ipp_attribute_t *notify_text; /* notify-text */ + + + /* + * Range check input... + */ + + if (!event || !lang) + return (NULL); + + /* + * Get the notify-text attribute from the server... + */ + + if ((notify_text = ippFindAttribute(event, "notify-text", + IPP_TAG_TEXT)) == NULL) + return (NULL); + + /* + * Return a copy... + */ + + return (strdup(notify_text->values[0].string.text)); +} + + +/* + * End of "$Id: notify.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/options.c b/cups/options.c new file mode 100644 index 0000000..2058c04 --- /dev/null +++ b/cups/options.c @@ -0,0 +1,711 @@ +/* + * "$Id: options.c 9793 2011-05-20 03:49:49Z mike $" + * + * Option routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsAddOption() - Add an option to an option array. + * cupsFreeOptions() - Free all memory used by options. + * cupsGetOption() - Get an option value. + * cupsParseOptions() - Parse options from a command-line argument. + * cupsRemoveOption() - Remove an option from an option array. + * _cupsGet1284Values() - Get 1284 device ID keys and values. + * cups_compare_options() - Compare two options. + * cups_find_option() - Find an option using a binary search. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * Local functions... + */ + +static int cups_compare_options(cups_option_t *a, cups_option_t *b); +static int cups_find_option(const char *name, int num_options, + cups_option_t *option, int prev, int *rdiff); + + +/* + * 'cupsAddOption()' - Add an option to an option array. + * + * New option arrays can be initialized simply by passing 0 for the + * "num_options" parameter. + */ + +int /* O - Number of options */ +cupsAddOption(const char *name, /* I - Name of option */ + const char *value, /* I - Value of option */ + int num_options,/* I - Number of options */ + cups_option_t **options) /* IO - Pointer to options */ +{ + cups_option_t *temp; /* Pointer to new option */ + int insert, /* Insertion point */ + diff; /* Result of search */ + + + DEBUG_printf(("2cupsAddOption(name=\"%s\", value=\"%s\", num_options=%d, " + "options=%p)", name, value, num_options, options)); + + if (!name || !name[0] || !value || !options || num_options < 0) + { + DEBUG_printf(("3cupsAddOption: Returning %d", num_options)); + return (num_options); + } + + /* + * Look for an existing option with the same name... + */ + + if (num_options == 0) + { + insert = 0; + diff = 1; + } + else + { + insert = cups_find_option(name, num_options, *options, num_options - 1, + &diff); + + if (diff > 0) + insert ++; + } + + if (diff) + { + /* + * No matching option name... + */ + + DEBUG_printf(("4cupsAddOption: New option inserted at index %d...", + insert)); + + if (num_options == 0) + temp = (cups_option_t *)malloc(sizeof(cups_option_t)); + else + temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) * + (num_options + 1)); + + if (temp == NULL) + { + DEBUG_puts("3cupsAddOption: Unable to expand option array, returning 0"); + return (0); + } + + *options = temp; + + if (insert < num_options) + { + DEBUG_printf(("4cupsAddOption: Shifting %d options...", + (int)(num_options - insert))); + memmove(temp + insert + 1, temp + insert, + (num_options - insert) * sizeof(cups_option_t)); + } + + temp += insert; + temp->name = _cupsStrAlloc(name); + num_options ++; + } + else + { + /* + * Match found; free the old value... + */ + + DEBUG_printf(("4cupsAddOption: Option already exists at index %d...", + insert)); + + temp = *options + insert; + _cupsStrFree(temp->value); + } + + temp->value = _cupsStrAlloc(value); + + DEBUG_printf(("3cupsAddOption: Returning %d", num_options)); + + return (num_options); +} + + +/* + * 'cupsFreeOptions()' - Free all memory used by options. + */ + +void +cupsFreeOptions( + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Pointer to options */ +{ + int i; /* Looping var */ + + + DEBUG_printf(("cupsFreeOptions(num_options=%d, options=%p)", num_options, + options)); + + if (num_options <= 0 || !options) + return; + + for (i = 0; i < num_options; i ++) + { + _cupsStrFree(options[i].name); + _cupsStrFree(options[i].value); + } + + free(options); +} + + +/* + * 'cupsGetOption()' - Get an option value. + */ + +const char * /* O - Option value or @code NULL@ */ +cupsGetOption(const char *name, /* I - Name of option */ + int num_options,/* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + int diff, /* Result of comparison */ + match; /* Matching index */ + + + DEBUG_printf(("2cupsGetOption(name=\"%s\", num_options=%d, options=%p)", + name, num_options, options)); + + if (!name || num_options <= 0 || !options) + { + DEBUG_puts("3cupsGetOption: Returning NULL"); + return (NULL); + } + + match = cups_find_option(name, num_options, options, -1, &diff); + + if (!diff) + { + DEBUG_printf(("3cupsGetOption: Returning \"%s\"", options[match].value)); + return (options[match].value); + } + + DEBUG_puts("3cupsGetOption: Returning NULL"); + return (NULL); +} + + +/* + * 'cupsParseOptions()' - Parse options from a command-line argument. + * + * This function converts space-delimited name/value pairs according + * to the PAPI text option ABNF specification. Collection values + * ("name={a=... b=... c=...}") are stored with the curley brackets + * intact - use @code cupsParseOptions@ on the value to extract the + * collection attributes. + */ + +int /* O - Number of options found */ +cupsParseOptions( + const char *arg, /* I - Argument to parse */ + int num_options, /* I - Number of options */ + cups_option_t **options) /* O - Options found */ +{ + char *copyarg, /* Copy of input string */ + *ptr, /* Pointer into string */ + *name, /* Pointer to name */ + *value, /* Pointer to value */ + sep, /* Separator character */ + quote; /* Quote character */ + + + DEBUG_printf(("cupsParseOptions(arg=\"%s\", num_options=%d, options=%p)", + arg, num_options, options)); + + /* + * Range check input... + */ + + if (!arg) + { + DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); + return (num_options); + } + + if (!options || num_options < 0) + { + DEBUG_puts("1cupsParseOptions: Returning 0"); + return (0); + } + + /* + * Make a copy of the argument string and then divide it up... + */ + + if ((copyarg = strdup(arg)) == NULL) + { + DEBUG_puts("1cupsParseOptions: Unable to copy arg string"); + DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); + return (num_options); + } + + if (*copyarg == '{') + { + /* + * Remove surrounding {} so we can parse "{name=value ... name=value}"... + */ + + if ((ptr = copyarg + strlen(copyarg) - 1) > copyarg && *ptr == '}') + { + *ptr = '\0'; + ptr = copyarg + 1; + } + else + ptr = copyarg; + } + else + ptr = copyarg; + + /* + * Skip leading spaces... + */ + + while (_cups_isspace(*ptr)) + ptr ++; + + /* + * Loop through the string... + */ + + while (*ptr != '\0') + { + /* + * Get the name up to a SPACE, =, or end-of-string... + */ + + name = ptr; + while (!strchr("\f\n\r\t\v =", *ptr) && *ptr) + ptr ++; + + /* + * Avoid an empty name... + */ + + if (ptr == name) + break; + + /* + * Skip trailing spaces... + */ + + while (_cups_isspace(*ptr)) + *ptr++ = '\0'; + + if ((sep = *ptr) == '=') + *ptr++ = '\0'; + + DEBUG_printf(("2cupsParseOptions: name=\"%s\"", name)); + + if (sep != '=') + { + /* + * Boolean option... + */ + + if (!_cups_strncasecmp(name, "no", 2)) + num_options = cupsAddOption(name + 2, "false", num_options, + options); + else + num_options = cupsAddOption(name, "true", num_options, options); + + continue; + } + + /* + * Remove = and parse the value... + */ + + value = ptr; + + while (*ptr && !_cups_isspace(*ptr)) + { + if (*ptr == ',') + ptr ++; + else if (*ptr == '\'' || *ptr == '\"') + { + /* + * Quoted string constant... + */ + + quote = *ptr; + _cups_strcpy(ptr, ptr + 1); + + while (*ptr != quote && *ptr) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + + ptr ++; + } + + if (*ptr) + _cups_strcpy(ptr, ptr + 1); + } + else if (*ptr == '{') + { + /* + * Collection value... + */ + + int depth; + + for (depth = 0; *ptr; ptr ++) + { + if (*ptr == '{') + depth ++; + else if (*ptr == '}') + { + depth --; + if (!depth) + { + ptr ++; + break; + } + } + else if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + } + } + else + { + /* + * Normal space-delimited string... + */ + + while (*ptr && !_cups_isspace(*ptr)) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + + ptr ++; + } + } + } + + if (*ptr != '\0') + *ptr++ = '\0'; + + DEBUG_printf(("2cupsParseOptions: value=\"%s\"", value)); + + /* + * Skip trailing whitespace... + */ + + while (_cups_isspace(*ptr)) + ptr ++; + + /* + * Add the string value... + */ + + num_options = cupsAddOption(name, value, num_options, options); + } + + /* + * Free the copy of the argument we made and return the number of options + * found. + */ + + free(copyarg); + + DEBUG_printf(("1cupsParseOptions: Returning %d", num_options)); + + return (num_options); +} + + +/* + * 'cupsRemoveOption()' - Remove an option from an option array. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - New number of options */ +cupsRemoveOption( + const char *name, /* I - Option name */ + int num_options, /* I - Current number of options */ + cups_option_t **options) /* IO - Options */ +{ + int i; /* Looping var */ + cups_option_t *option; /* Current option */ + + + DEBUG_printf(("2cupsRemoveOption(name=\"%s\", num_options=%d, options=%p)", + name, num_options, options)); + + /* + * Range check input... + */ + + if (!name || num_options < 1 || !options) + { + DEBUG_printf(("3cupsRemoveOption: Returning %d", num_options)); + return (num_options); + } + + /* + * Loop for the option... + */ + + for (i = num_options, option = *options; i > 0; i --, option ++) + if (!_cups_strcasecmp(name, option->name)) + break; + + if (i) + { + /* + * Remove this option from the array... + */ + + DEBUG_puts("4cupsRemoveOption: Found option, removing it..."); + + num_options --; + i --; + + _cupsStrFree(option->name); + _cupsStrFree(option->value); + + if (i > 0) + memmove(option, option + 1, i * sizeof(cups_option_t)); + } + + /* + * Return the new number of options... + */ + + DEBUG_printf(("3cupsRemoveOption: Returning %d", num_options)); + return (num_options); +} + + +/* + * '_cupsGet1284Values()' - Get 1284 device ID keys and values. + * + * The returned dictionary is a CUPS option array that can be queried with + * cupsGetOption and freed with cupsFreeOptions. + */ + +int /* O - Number of key/value pairs */ +_cupsGet1284Values( + const char *device_id, /* I - IEEE-1284 device ID string */ + cups_option_t **values) /* O - Array of key/value pairs */ +{ + int num_values; /* Number of values */ + char key[256], /* Key string */ + value[256], /* Value string */ + *ptr; /* Pointer into key/value */ + + + /* + * Range check input... + */ + + if (values) + *values = NULL; + + if (!device_id || !values) + return (0); + + /* + * Parse the 1284 device ID value into keys and values. The format is + * repeating sequences of: + * + * [whitespace]key:value[whitespace]; + */ + + num_values = 0; + while (*device_id) + { + while (_cups_isspace(*device_id)) + device_id ++; + + if (!*device_id) + break; + + for (ptr = key; *device_id && *device_id != ':'; device_id ++) + if (ptr < (key + sizeof(key) - 1)) + *ptr++ = *device_id; + + if (!*device_id) + break; + + while (ptr > key && _cups_isspace(ptr[-1])) + ptr --; + + *ptr = '\0'; + device_id ++; + + while (_cups_isspace(*device_id)) + device_id ++; + + if (!*device_id) + break; + + for (ptr = value; *device_id && *device_id != ';'; device_id ++) + if (ptr < (value + sizeof(value) - 1)) + *ptr++ = *device_id; + + if (!*device_id) + break; + + while (ptr > value && _cups_isspace(ptr[-1])) + ptr --; + + *ptr = '\0'; + device_id ++; + + num_values = cupsAddOption(key, value, num_values, values); + } + + return (num_values); +} + + +/* + * 'cups_compare_options()' - Compare two options. + */ + +static int /* O - Result of comparison */ +cups_compare_options(cups_option_t *a, /* I - First option */ + cups_option_t *b) /* I - Second option */ +{ + return (_cups_strcasecmp(a->name, b->name)); +} + + +/* + * 'cups_find_option()' - Find an option using a binary search. + */ + +static int /* O - Index of match */ +cups_find_option( + const char *name, /* I - Option name */ + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + int prev, /* I - Previous index */ + int *rdiff) /* O - Difference of match */ +{ + int left, /* Low mark for binary search */ + right, /* High mark for binary search */ + current, /* Current index */ + diff; /* Result of comparison */ + cups_option_t key; /* Search key */ + + + DEBUG_printf(("7cups_find_option(name=\"%s\", num_options=%d, options=%p, " + "prev=%d, rdiff=%p)", name, num_options, options, prev, + rdiff)); + +#ifdef DEBUG + for (left = 0; left < num_options; left ++) + DEBUG_printf(("9cups_find_option: options[%d].name=\"%s\", .value=\"%s\"", + left, options[left].name, options[left].value)); +#endif /* DEBUG */ + + key.name = (char *)name; + + if (prev >= 0) + { + /* + * Start search on either side of previous... + */ + + if ((diff = cups_compare_options(&key, options + prev)) == 0 || + (diff < 0 && prev == 0) || + (diff > 0 && prev == (num_options - 1))) + { + *rdiff = diff; + return (prev); + } + else if (diff < 0) + { + /* + * Start with previous on right side... + */ + + left = 0; + right = prev; + } + else + { + /* + * Start wih previous on left side... + */ + + left = prev; + right = num_options - 1; + } + } + else + { + /* + * Start search in the middle... + */ + + left = 0; + right = num_options - 1; + } + + do + { + current = (left + right) / 2; + diff = cups_compare_options(&key, options + current); + + if (diff == 0) + break; + else if (diff < 0) + right = current; + else + left = current; + } + while ((right - left) > 1); + + if (diff != 0) + { + /* + * Check the last 1 or 2 elements... + */ + + if ((diff = cups_compare_options(&key, options + left)) <= 0) + current = left; + else + { + diff = cups_compare_options(&key, options + right); + current = right; + } + } + + /* + * Return the closest destination and the difference... + */ + + *rdiff = diff; + + return (current); +} + + +/* + * End of "$Id: options.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/page.c b/cups/page.c new file mode 100644 index 0000000..1abd3f8 --- /dev/null +++ b/cups/page.c @@ -0,0 +1,396 @@ +/* + * "$Id: page.c 9793 2011-05-20 03:49:49Z mike $" + * + * Page size functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ppdPageSize() - Get the page size record for the given size. + * ppdPageSizeLimits() - Return the custom page size limits. + * ppdPageWidth() - Get the page width for the given size. + * ppdPageLength() - Get the page length for the given size. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "debug-private.h" +#include "ppd.h" + + +/* + * 'ppdPageSize()' - Get the page size record for the given size. + */ + +ppd_size_t * /* O - Size record for page or NULL */ +ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */ + const char *name) /* I - Size name */ +{ + int i; /* Looping var */ + ppd_size_t *size; /* Current page size */ + double w, l; /* Width and length of page */ + char *nameptr; /* Pointer into name */ + struct lconv *loc; /* Locale data */ + ppd_coption_t *coption; /* Custom option for page size */ + ppd_cparam_t *cparam; /* Custom option parameter */ + + + DEBUG_printf(("2ppdPageSize(ppd=%p, name=\"%s\")", ppd, name)); + + if (!ppd) + { + DEBUG_puts("3ppdPageSize: Bad PPD pointer, returning NULL..."); + return (NULL); + } + + if (name) + { + if (!strncmp(name, "Custom.", 7) && ppd->variable_sizes) + { + /* + * Find the custom page size... + */ + + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + if (!strcmp("Custom", size->name)) + break; + + if (!i) + { + DEBUG_puts("3ppdPageSize: No custom sizes, returning NULL..."); + return (NULL); + } + + /* + * Variable size; size name can be one of the following: + * + * Custom.WIDTHxLENGTHin - Size in inches + * Custom.WIDTHxLENGTHft - Size in feet + * Custom.WIDTHxLENGTHcm - Size in centimeters + * Custom.WIDTHxLENGTHmm - Size in millimeters + * Custom.WIDTHxLENGTHm - Size in meters + * Custom.WIDTHxLENGTH[pt] - Size in points + */ + + loc = localeconv(); + w = _cupsStrScand(name + 7, &nameptr, loc); + if (!nameptr || *nameptr != 'x') + return (NULL); + + l = _cupsStrScand(nameptr + 1, &nameptr, loc); + if (!nameptr) + return (NULL); + + if (!_cups_strcasecmp(nameptr, "in")) + { + w *= 72.0; + l *= 72.0; + } + else if (!_cups_strcasecmp(nameptr, "ft")) + { + w *= 12.0 * 72.0; + l *= 12.0 * 72.0; + } + else if (!_cups_strcasecmp(nameptr, "mm")) + { + w *= 72.0 / 25.4; + l *= 72.0 / 25.4; + } + else if (!_cups_strcasecmp(nameptr, "cm")) + { + w *= 72.0 / 2.54; + l *= 72.0 / 2.54; + } + else if (!_cups_strcasecmp(nameptr, "m")) + { + w *= 72.0 / 0.0254; + l *= 72.0 / 0.0254; + } + + size->width = (float)w; + size->length = (float)l; + size->left = ppd->custom_margins[0]; + size->bottom = ppd->custom_margins[1]; + size->right = (float)(w - ppd->custom_margins[2]); + size->top = (float)(l - ppd->custom_margins[3]); + + /* + * Update the custom option records for the page size, too... + */ + + if ((coption = ppdFindCustomOption(ppd, "PageSize")) != NULL) + { + if ((cparam = ppdFindCustomParam(coption, "Width")) != NULL) + cparam->current.custom_points = (float)w; + + if ((cparam = ppdFindCustomParam(coption, "Height")) != NULL) + cparam->current.custom_points = (float)l; + } + + /* + * Return the page size... + */ + + DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, + size->name, size->width, size->length)); + + return (size); + } + else + { + /* + * Lookup by name... + */ + + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + if (!_cups_strcasecmp(name, size->name)) + { + DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, + size->name, size->width, size->length)); + + return (size); + } + } + } + else + { + /* + * Find default... + */ + + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + if (size->marked) + { + DEBUG_printf(("3ppdPageSize: Returning %p (\"%s\", %gx%g)", size, + size->name, size->width, size->length)); + + return (size); + } + } + + DEBUG_puts("3ppdPageSize: Size not found, returning NULL"); + + return (NULL); +} + + +/* + * 'ppdPageSizeLimits()' - Return the custom page size limits. + * + * This function returns the minimum and maximum custom page sizes and printable + * areas based on the currently-marked (selected) options. + * + * If the specified PPD file does not support custom page sizes, both + * "minimum" and "maximum" are filled with zeroes. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +int /* O - 1 if custom sizes are supported, 0 otherwise */ +ppdPageSizeLimits(ppd_file_t *ppd, /* I - PPD file record */ + ppd_size_t *minimum, /* O - Minimum custom size */ + ppd_size_t *maximum) /* O - Maximum custom size */ +{ + ppd_choice_t *qualifier2, /* Second media qualifier */ + *qualifier3; /* Third media qualifier */ + ppd_attr_t *attr; /* Attribute */ + float width, /* Min/max width */ + length; /* Min/max length */ + char spec[PPD_MAX_NAME]; /* Selector for min/max */ + + + /* + * Range check input... + */ + + if (!ppd || !ppd->variable_sizes || !minimum || !maximum) + { + if (minimum) + memset(minimum, 0, sizeof(ppd_size_t)); + + if (maximum) + memset(maximum, 0, sizeof(ppd_size_t)); + + return (0); + } + + /* + * See if we have the cupsMediaQualifier2 and cupsMediaQualifier3 attributes... + */ + + cupsArraySave(ppd->sorted_attrs); + + if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier2", NULL)) != NULL && + attr->value) + qualifier2 = ppdFindMarkedChoice(ppd, attr->value); + else + qualifier2 = NULL; + + if ((attr = ppdFindAttr(ppd, "cupsMediaQualifier3", NULL)) != NULL && + attr->value) + qualifier3 = ppdFindMarkedChoice(ppd, attr->value); + else + qualifier3 = NULL; + + /* + * Figure out the current minimum width and length... + */ + + width = ppd->custom_min[0]; + length = ppd->custom_min[1]; + + if (qualifier2) + { + /* + * Try getting cupsMinSize... + */ + + if (qualifier3) + { + snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice, + qualifier3->choice); + attr = ppdFindAttr(ppd, "cupsMinSize", spec); + } + else + attr = NULL; + + if (!attr) + { + snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice); + attr = ppdFindAttr(ppd, "cupsMinSize", spec); + } + + if (!attr && qualifier3) + { + snprintf(spec, sizeof(spec), "..%s", qualifier3->choice); + attr = ppdFindAttr(ppd, "cupsMinSize", spec); + } + + if ((attr && attr->value && + sscanf(attr->value, "%f%f", &width, &length) != 2) || !attr) + { + width = ppd->custom_min[0]; + length = ppd->custom_min[1]; + } + } + + minimum->width = width; + minimum->length = length; + minimum->left = ppd->custom_margins[0]; + minimum->bottom = ppd->custom_margins[1]; + minimum->right = width - ppd->custom_margins[2]; + minimum->top = length - ppd->custom_margins[3]; + + /* + * Figure out the current maximum width and length... + */ + + width = ppd->custom_max[0]; + length = ppd->custom_max[1]; + + if (qualifier2) + { + /* + * Try getting cupsMaxSize... + */ + + if (qualifier3) + { + snprintf(spec, sizeof(spec), ".%s.%s", qualifier2->choice, + qualifier3->choice); + attr = ppdFindAttr(ppd, "cupsMaxSize", spec); + } + else + attr = NULL; + + if (!attr) + { + snprintf(spec, sizeof(spec), ".%s.", qualifier2->choice); + attr = ppdFindAttr(ppd, "cupsMaxSize", spec); + } + + if (!attr && qualifier3) + { + snprintf(spec, sizeof(spec), "..%s", qualifier3->choice); + attr = ppdFindAttr(ppd, "cupsMaxSize", spec); + } + + if (!attr || + (attr->value && sscanf(attr->value, "%f%f", &width, &length) != 2)) + { + width = ppd->custom_max[0]; + length = ppd->custom_max[1]; + } + } + + maximum->width = width; + maximum->length = length; + maximum->left = ppd->custom_margins[0]; + maximum->bottom = ppd->custom_margins[1]; + maximum->right = width - ppd->custom_margins[2]; + maximum->top = length - ppd->custom_margins[3]; + + /* + * Return the min and max... + */ + + cupsArrayRestore(ppd->sorted_attrs); + + return (1); +} + + +/* + * 'ppdPageWidth()' - Get the page width for the given size. + */ + +float /* O - Width of page in points or 0.0 */ +ppdPageWidth(ppd_file_t *ppd, /* I - PPD file record */ + const char *name) /* I - Size name */ +{ + ppd_size_t *size; /* Page size */ + + + if ((size = ppdPageSize(ppd, name)) == NULL) + return (0.0); + else + return (size->width); +} + + +/* + * 'ppdPageLength()' - Get the page length for the given size. + */ + +float /* O - Length of page in points or 0.0 */ +ppdPageLength(ppd_file_t *ppd, /* I - PPD file */ + const char *name) /* I - Size name */ +{ + ppd_size_t *size; /* Page size */ + + + if ((size = ppdPageSize(ppd, name)) == NULL) + return (0.0); + else + return (size->length); +} + + +/* + * End of "$Id: page.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/ppd-cache.c b/cups/ppd-cache.c new file mode 100644 index 0000000..9292715 --- /dev/null +++ b/cups/ppd-cache.c @@ -0,0 +1,2606 @@ +/* + * "$Id: ppd-cache.c 10340 2012-03-07 17:16:42Z mike $" + * + * PPD cache implementation for CUPS. + * + * Copyright 2010-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _ppdCacheCreateWithFile() - Create PPD cache and mapping data from a + * written file. + * _ppdCacheCreateWithPPD() - Create PWG mapping data from a PPD file. + * _ppdCacheDestroy() - Free all memory used for PWG mapping data. + * _ppdCacheGetBin() - Get the PWG output-bin keyword associated with + * a PPD OutputBin. + * _ppdCacheGetInputSlot() - Get the PPD InputSlot associated with the job + * attributes or a keyword string. + * _ppdCacheGetMediaType() - Get the PPD MediaType associated with the job + * attributes or a keyword string. + * _ppdCacheGetOutputBin() - Get the PPD OutputBin associated with the + * keyword string. + * _ppdCacheGetPageSize() - Get the PPD PageSize associated with the job + * attributes or a keyword string. + * _ppdCacheGetSize() - Get the PWG size associated with a PPD + * PageSize. + * _ppdCacheGetSource() - Get the PWG media-source associated with a PPD + * InputSlot. + * _ppdCacheGetType() - Get the PWG media-type associated with a PPD + * MediaType. + * _ppdCacheWriteFile() - Write PWG mapping data to a file. + * _pwgInputSlotForSource() - Get the InputSlot name for the given PWG + * media-source. + * _pwgMediaTypeForType() - Get the MediaType name for the given PWG + * media-type. + * _pwgPageSizeForMedia() - Get the PageSize name for the given media. + * pwg_ppdize_name() - Convert an IPP keyword to a PPD keyword. + * pwg_unppdize_name() - Convert a PPD keyword to a lowercase IPP + * keyword. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include + + +/* + * Macro to test for two almost-equal PWG measurements. + */ + +#define _PWG_EQUIVALENT(x, y) (abs((x)-(y)) < 2) + + +/* + * Local functions... + */ + +static int pwg_compare_finishings(_pwg_finishings_t *a, + _pwg_finishings_t *b); +static void pwg_free_finishings(_pwg_finishings_t *f); +static void pwg_ppdize_name(const char *ipp, char *name, size_t namesize); +static void pwg_unppdize_name(const char *ppd, char *name, size_t namesize); + + +/* + * '_ppdCacheCreateWithFile()' - Create PPD cache and mapping data from a + * written file. + * + * Use the @link _ppdCacheWriteFile@ function to write PWG mapping data to a + * file. + */ + +_ppd_cache_t * /* O - PPD cache and mapping data */ +_ppdCacheCreateWithFile( + const char *filename, /* I - File to read */ + ipp_t **attrs) /* IO - IPP attributes, if any */ +{ + cups_file_t *fp; /* File */ + _ppd_cache_t *pc; /* PWG mapping data */ + _pwg_size_t *size; /* Current size */ + _pwg_map_t *map; /* Current map */ + _pwg_finishings_t *finishings; /* Current finishings option */ + int linenum, /* Current line number */ + num_bins, /* Number of bins in file */ + num_sizes, /* Number of sizes in file */ + num_sources, /* Number of sources in file */ + num_types; /* Number of types in file */ + char line[2048], /* Current line */ + *value, /* Pointer to value in line */ + *valueptr, /* Pointer into value */ + pwg_keyword[128], /* PWG keyword */ + ppd_keyword[PPD_MAX_NAME]; + /* PPD keyword */ + _pwg_print_color_mode_t print_color_mode; + /* Print color mode for preset */ + _pwg_print_quality_t print_quality; /* Print quality for preset */ + + + DEBUG_printf(("_ppdCacheCreateWithFile(filename=\"%s\")", filename)); + + /* + * Range check input... + */ + + if (attrs) + *attrs = NULL; + + if (!filename) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + return (NULL); + } + + /* + * Open the file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + return (NULL); + } + + /* + * Read the first line and make sure it has "#CUPS-PPD-CACHE-version" in it... + */ + + if (!cupsFileGets(fp, line, sizeof(line))) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + DEBUG_puts("_ppdCacheCreateWithFile: Unable to read first line."); + cupsFileClose(fp); + return (NULL); + } + + if (strncmp(line, "#CUPS-PPD-CACHE-", 16)) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + DEBUG_printf(("_ppdCacheCreateWithFile: Wrong first line \"%s\".", line)); + cupsFileClose(fp); + return (NULL); + } + + if (atoi(line + 16) != _PPD_CACHE_VERSION) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Out of date PPD cache file."), 1); + DEBUG_printf(("_ppdCacheCreateWithFile: Cache file has version %s, " + "expected %d.", line + 16, _PPD_CACHE_VERSION)); + cupsFileClose(fp); + return (NULL); + } + + /* + * Allocate the mapping data structure... + */ + + if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + DEBUG_puts("_ppdCacheCreateWithFile: Unable to allocate _ppd_cache_t."); + goto create_error; + } + + /* + * Read the file... + */ + + linenum = 0; + num_bins = 0; + num_sizes = 0; + num_sources = 0; + num_types = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + DEBUG_printf(("_ppdCacheCreateWithFile: line=\"%s\", value=\"%s\", " + "linenum=%d", line, value, linenum)); + + if (!value) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Missing value on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + else if (!_cups_strcasecmp(line, "Filter")) + { + if (!pc->filters) + pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + cupsArrayAdd(pc->filters, value); + } + else if (!_cups_strcasecmp(line, "PreFilter")) + { + if (!pc->prefilters) + pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + cupsArrayAdd(pc->prefilters, value); + } + else if (!_cups_strcasecmp(line, "Product")) + { + pc->product = _cupsStrAlloc(value); + } + else if (!_cups_strcasecmp(line, "SingleFile")) + { + pc->single_file = !_cups_strcasecmp(value, "true"); + } + else if (!_cups_strcasecmp(line, "IPP")) + { + off_t pos = cupsFileTell(fp), /* Position in file */ + length = strtol(value, NULL, 10); + /* Length of IPP attributes */ + + if (attrs && *attrs) + { + DEBUG_puts("_ppdCacheCreateWithFile: IPP listed multiple times."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + else if (length <= 0) + { + DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP length."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (attrs) + { + /* + * Read IPP attributes into the provided variable... + */ + + *attrs = ippNew(); + + if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, + *attrs) != IPP_DATA) + { + DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + } + else + { + /* + * Skip the IPP data entirely... + */ + + cupsFileSeek(fp, pos + length); + } + + if (cupsFileTell(fp) != (pos + length)) + { + DEBUG_puts("_ppdCacheCreateWithFile: Bad IPP data."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + } + else if (!_cups_strcasecmp(line, "NumBins")) + { + if (num_bins > 0) + { + DEBUG_puts("_ppdCacheCreateWithFile: NumBins listed multiple times."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((num_bins = atoi(value)) <= 0 || num_bins > 65536) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumBins value %d on line " + "%d.", num_sizes, linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((pc->bins = calloc(num_bins, sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d bins.", + num_sizes)); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + goto create_error; + } + } + else if (!_cups_strcasecmp(line, "Bin")) + { + if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad Bin on line %d.", linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (pc->num_bins >= num_bins) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Too many Bin's on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + map = pc->bins + pc->num_bins; + map->pwg = _cupsStrAlloc(pwg_keyword); + map->ppd = _cupsStrAlloc(ppd_keyword); + + pc->num_bins ++; + } + else if (!_cups_strcasecmp(line, "NumSizes")) + { + if (num_sizes > 0) + { + DEBUG_puts("_ppdCacheCreateWithFile: NumSizes listed multiple times."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((num_sizes = atoi(value)) <= 0 || num_sizes > 65536) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSizes value %d on line " + "%d.", num_sizes, linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((pc->sizes = calloc(num_sizes, sizeof(_pwg_size_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sizes.", + num_sizes)); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + goto create_error; + } + } + else if (!_cups_strcasecmp(line, "Size")) + { + if (pc->num_sizes >= num_sizes) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Too many Size's on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + size = pc->sizes + pc->num_sizes; + + if (sscanf(value, "%127s%40s%d%d%d%d%d%d", pwg_keyword, ppd_keyword, + &(size->width), &(size->length), &(size->left), + &(size->bottom), &(size->right), &(size->top)) != 8) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad Size on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + size->map.pwg = _cupsStrAlloc(pwg_keyword); + size->map.ppd = _cupsStrAlloc(ppd_keyword); + + pc->num_sizes ++; + } + else if (!_cups_strcasecmp(line, "CustomSize")) + { + if (pc->custom_max_width > 0) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Too many CustomSize's on line " + "%d.", linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (sscanf(value, "%d%d%d%d%d%d%d%d", &(pc->custom_max_width), + &(pc->custom_max_length), &(pc->custom_min_width), + &(pc->custom_min_length), &(pc->custom_size.left), + &(pc->custom_size.bottom), &(pc->custom_size.right), + &(pc->custom_size.top)) != 8) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad CustomSize on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max", + pc->custom_max_width, pc->custom_max_length); + pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword); + + _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min", + pc->custom_min_width, pc->custom_min_length); + pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword); + } + else if (!_cups_strcasecmp(line, "SourceOption")) + { + pc->source_option = _cupsStrAlloc(value); + } + else if (!_cups_strcasecmp(line, "NumSources")) + { + if (num_sources > 0) + { + DEBUG_puts("_ppdCacheCreateWithFile: NumSources listed multiple " + "times."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((num_sources = atoi(value)) <= 0 || num_sources > 65536) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumSources value %d on " + "line %d.", num_sources, linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((pc->sources = calloc(num_sources, sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d sources.", + num_sources)); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + goto create_error; + } + } + else if (!_cups_strcasecmp(line, "Source")) + { + if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad Source on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (pc->num_sources >= num_sources) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Too many Source's on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + map = pc->sources + pc->num_sources; + map->pwg = _cupsStrAlloc(pwg_keyword); + map->ppd = _cupsStrAlloc(ppd_keyword); + + pc->num_sources ++; + } + else if (!_cups_strcasecmp(line, "NumTypes")) + { + if (num_types > 0) + { + DEBUG_puts("_ppdCacheCreateWithFile: NumTypes listed multiple times."); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((num_types = atoi(value)) <= 0 || num_types > 65536) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad NumTypes value %d on " + "line %d.", num_types, linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if ((pc->types = calloc(num_types, sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Unable to allocate %d types.", + num_types)); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + goto create_error; + } + } + else if (!_cups_strcasecmp(line, "Type")) + { + if (sscanf(value, "%127s%40s", pwg_keyword, ppd_keyword) != 2) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad Type on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (pc->num_types >= num_types) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Too many Type's on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + map = pc->types + pc->num_types; + map->pwg = _cupsStrAlloc(pwg_keyword); + map->ppd = _cupsStrAlloc(ppd_keyword); + + pc->num_types ++; + } + else if (!_cups_strcasecmp(line, "Preset")) + { + /* + * Preset output-mode print-quality name=value ... + */ + + print_color_mode = (_pwg_print_color_mode_t)strtol(value, &valueptr, 10); + print_quality = (_pwg_print_quality_t)strtol(valueptr, &valueptr, 10); + + if (print_color_mode < _PWG_PRINT_COLOR_MODE_MONOCHROME || + print_color_mode >= _PWG_PRINT_COLOR_MODE_MAX || + print_quality < _PWG_PRINT_QUALITY_DRAFT || + print_quality >= _PWG_PRINT_QUALITY_MAX || + valueptr == value || !*valueptr) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Bad Preset on line %d.", + linenum)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + pc->num_presets[print_color_mode][print_quality] = + cupsParseOptions(valueptr, 0, + pc->presets[print_color_mode] + print_quality); + } + else if (!_cups_strcasecmp(line, "SidesOption")) + pc->sides_option = _cupsStrAlloc(value); + else if (!_cups_strcasecmp(line, "Sides1Sided")) + pc->sides_1sided = _cupsStrAlloc(value); + else if (!_cups_strcasecmp(line, "Sides2SidedLong")) + pc->sides_2sided_long = _cupsStrAlloc(value); + else if (!_cups_strcasecmp(line, "Sides2SidedShort")) + pc->sides_2sided_short = _cupsStrAlloc(value); + else if (!_cups_strcasecmp(line, "Finishings")) + { + if (!pc->finishings) + pc->finishings = + cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, + NULL, NULL, 0, NULL, + (cups_afree_func_t)pwg_free_finishings); + + if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL) + goto create_error; + + finishings->value = strtol(value, &valueptr, 10); + finishings->num_options = cupsParseOptions(valueptr, 0, + &(finishings->options)); + + cupsArrayAdd(pc->finishings, finishings); + } + else + { + DEBUG_printf(("_ppdCacheCreateWithFile: Unknown %s on line %d.", line, + linenum)); + } + } + + if (pc->num_sizes < num_sizes) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sizes (%d < %d).", + pc->num_sizes, num_sizes)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (pc->num_sources < num_sources) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Not enough sources (%d < %d).", + pc->num_sources, num_sources)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + if (pc->num_types < num_types) + { + DEBUG_printf(("_ppdCacheCreateWithFile: Not enough types (%d < %d).", + pc->num_types, num_types)); + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad PPD cache file."), 1); + goto create_error; + } + + cupsFileClose(fp); + + return (pc); + + /* + * If we get here the file was bad - free any data and return... + */ + + create_error: + + cupsFileClose(fp); + _ppdCacheDestroy(pc); + + if (attrs) + { + ippDelete(*attrs); + *attrs = NULL; + } + + return (NULL); +} + + +/* + * '_ppdCacheCreateWithPPD()' - Create PWG mapping data from a PPD file. + */ + +_ppd_cache_t * /* O - PPD cache and mapping data */ +_ppdCacheCreateWithPPD(ppd_file_t *ppd) /* I - PPD file */ +{ + int i, j, k; /* Looping vars */ + _ppd_cache_t *pc; /* PWG mapping data */ + ppd_option_t *input_slot, /* InputSlot option */ + *media_type, /* MediaType option */ + *output_bin, /* OutputBin option */ + *color_model, /* ColorModel option */ + *duplex; /* Duplex option */ + ppd_choice_t *choice; /* Current InputSlot/MediaType */ + _pwg_map_t *map; /* Current source/type map */ + ppd_attr_t *ppd_attr; /* Current PPD preset attribute */ + int num_options; /* Number of preset options and props */ + cups_option_t *options; /* Preset options and properties */ + ppd_size_t *ppd_size; /* Current PPD size */ + _pwg_size_t *pwg_size; /* Current PWG size */ + char pwg_keyword[3 + PPD_MAX_NAME + 1 + 12 + 1 + 12 + 3], + /* PWG keyword string */ + ppd_name[PPD_MAX_NAME]; + /* Normalized PPD name */ + const char *pwg_name; /* Standard PWG media name */ + _pwg_media_t *pwg_media; /* PWG media data */ + _pwg_print_color_mode_t pwg_print_color_mode; + /* print-color-mode index */ + _pwg_print_quality_t pwg_print_quality; + /* print-quality index */ + int similar; /* Are the old and new size similar? */ + _pwg_size_t *old_size; /* Current old size */ + int old_imageable, /* Old imageable length in 2540ths */ + old_borderless, /* Old borderless state */ + old_known_pwg; /* Old PWG name is well-known */ + int new_width, /* New width in 2540ths */ + new_length, /* New length in 2540ths */ + new_left, /* New left margin in 2540ths */ + new_bottom, /* New bottom margin in 2540ths */ + new_right, /* New right margin in 2540ths */ + new_top, /* New top margin in 2540ths */ + new_imageable, /* New imageable length in 2540ths */ + new_borderless, /* New borderless state */ + new_known_pwg; /* New PWG name is well-known */ + _pwg_size_t *new_size; /* New size to add, if any */ + const char *filter; /* Current filter */ + _pwg_finishings_t *finishings; /* Current finishings value */ + + + DEBUG_printf(("_ppdCacheCreateWithPPD(ppd=%p)", ppd)); + + /* + * Range check input... + */ + + if (!ppd) + return (NULL); + + /* + * Allocate memory... + */ + + if ((pc = calloc(1, sizeof(_ppd_cache_t))) == NULL) + { + DEBUG_puts("_ppdCacheCreateWithPPD: Unable to allocate _ppd_cache_t."); + goto create_error; + } + + /* + * Copy and convert size data... + */ + + if (ppd->num_sizes == 0) + { + DEBUG_puts("_ppdCacheCreateWithPPD: No page sizes in PPD."); + goto create_error; + } + + if ((pc->sizes = calloc(ppd->num_sizes, sizeof(_pwg_size_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " + "_pwg_size_t's.", ppd->num_sizes)); + goto create_error; + } + + for (i = ppd->num_sizes, pwg_size = pc->sizes, ppd_size = ppd->sizes; + i > 0; + i --, ppd_size ++) + { + /* + * Don't copy over custom size... + */ + + if (!_cups_strcasecmp(ppd_size->name, "Custom")) + continue; + + /* + * Convert the PPD size name to the corresponding PWG keyword name. + */ + + if ((pwg_media = _pwgMediaForPPD(ppd_size->name)) != NULL) + { + /* + * Standard name, do we have conflicts? + */ + + for (j = 0; j < pc->num_sizes; j ++) + if (!strcmp(pc->sizes[j].map.pwg, pwg_media->pwg)) + { + pwg_media = NULL; + break; + } + } + + if (pwg_media) + { + /* + * Standard name and no conflicts, use it! + */ + + pwg_name = pwg_media->pwg; + new_known_pwg = 1; + } + else + { + /* + * Not a standard name; convert it to a PWG vendor name of the form: + * + * pp_lowerppd_WIDTHxHEIGHTuu + */ + + pwg_name = pwg_keyword; + new_known_pwg = 0; + + pwg_unppdize_name(ppd_size->name, ppd_name, sizeof(ppd_name)); + _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), NULL, ppd_name, + _PWG_FROMPTS(ppd_size->width), + _PWG_FROMPTS(ppd_size->length)); + } + + /* + * If we have a similar paper with non-zero margins then we only want to + * keep it if it has a larger imageable area length. The NULL check is for + * dimensions that are <= 0... + */ + + if ((pwg_media = _pwgMediaForSize(_PWG_FROMPTS(ppd_size->width), + _PWG_FROMPTS(ppd_size->length))) == NULL) + continue; + + new_width = pwg_media->width; + new_length = pwg_media->length; + new_left = _PWG_FROMPTS(ppd_size->left); + new_bottom = _PWG_FROMPTS(ppd_size->bottom); + new_right = _PWG_FROMPTS(ppd_size->width - ppd_size->right); + new_top = _PWG_FROMPTS(ppd_size->length - ppd_size->top); + new_imageable = new_length - new_top - new_bottom; + new_borderless = new_bottom == 0 && new_top == 0 && + new_left == 0 && new_right == 0; + + for (k = pc->num_sizes, similar = 0, old_size = pc->sizes, new_size = NULL; + k > 0 && !similar; + k --, old_size ++) + { + old_imageable = old_size->length - old_size->top - old_size->bottom; + old_borderless = old_size->left == 0 && old_size->bottom == 0 && + old_size->right == 0 && old_size->top == 0; + old_known_pwg = strncmp(old_size->map.pwg, "oe_", 3) && + strncmp(old_size->map.pwg, "om_", 3); + + similar = old_borderless == new_borderless && + _PWG_EQUIVALENT(old_size->width, new_width) && + _PWG_EQUIVALENT(old_size->length, new_length); + + if (similar && + (new_known_pwg || (!old_known_pwg && new_imageable > old_imageable))) + { + /* + * The new paper has a larger imageable area so it could replace + * the older paper. Regardless of the imageable area, we always + * prefer the size with a well-known PWG name. + */ + + new_size = old_size; + _cupsStrFree(old_size->map.ppd); + _cupsStrFree(old_size->map.pwg); + } + } + + if (!similar) + { + /* + * The paper was unique enough to deserve its own entry so add it to the + * end. + */ + + new_size = pwg_size ++; + pc->num_sizes ++; + } + + if (new_size) + { + /* + * Save this size... + */ + + new_size->map.ppd = _cupsStrAlloc(ppd_size->name); + new_size->map.pwg = _cupsStrAlloc(pwg_name); + new_size->width = new_width; + new_size->length = new_length; + new_size->left = new_left; + new_size->bottom = new_bottom; + new_size->right = new_right; + new_size->top = new_top; + } + } + + if (ppd->variable_sizes) + { + /* + * Generate custom size data... + */ + + _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "max", + _PWG_FROMPTS(ppd->custom_max[0]), + _PWG_FROMPTS(ppd->custom_max[1])); + pc->custom_max_keyword = _cupsStrAlloc(pwg_keyword); + pc->custom_max_width = _PWG_FROMPTS(ppd->custom_max[0]); + pc->custom_max_length = _PWG_FROMPTS(ppd->custom_max[1]); + + _pwgGenerateSize(pwg_keyword, sizeof(pwg_keyword), "custom", "min", + _PWG_FROMPTS(ppd->custom_min[0]), + _PWG_FROMPTS(ppd->custom_min[1])); + pc->custom_min_keyword = _cupsStrAlloc(pwg_keyword); + pc->custom_min_width = _PWG_FROMPTS(ppd->custom_min[0]); + pc->custom_min_length = _PWG_FROMPTS(ppd->custom_min[1]); + + pc->custom_size.left = _PWG_FROMPTS(ppd->custom_margins[0]); + pc->custom_size.bottom = _PWG_FROMPTS(ppd->custom_margins[1]); + pc->custom_size.right = _PWG_FROMPTS(ppd->custom_margins[2]); + pc->custom_size.top = _PWG_FROMPTS(ppd->custom_margins[3]); + } + + /* + * Copy and convert InputSlot data... + */ + + if ((input_slot = ppdFindOption(ppd, "InputSlot")) == NULL) + input_slot = ppdFindOption(ppd, "HPPaperSource"); + + if (input_slot) + { + pc->source_option = _cupsStrAlloc(input_slot->keyword); + + if ((pc->sources = calloc(input_slot->num_choices, + sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " + "_pwg_map_t's for InputSlot.", input_slot->num_choices)); + goto create_error; + } + + pc->num_sources = input_slot->num_choices; + + for (i = input_slot->num_choices, choice = input_slot->choices, + map = pc->sources; + i > 0; + i --, choice ++, map ++) + { + if (!_cups_strncasecmp(choice->choice, "Auto", 4) || + !_cups_strcasecmp(choice->choice, "Default")) + pwg_name = "auto"; + else if (!_cups_strcasecmp(choice->choice, "Cassette")) + pwg_name = "main"; + else if (!_cups_strcasecmp(choice->choice, "PhotoTray")) + pwg_name = "photo"; + else if (!_cups_strcasecmp(choice->choice, "CDTray")) + pwg_name = "disc"; + else if (!_cups_strncasecmp(choice->choice, "Multipurpose", 12) || + !_cups_strcasecmp(choice->choice, "MP") || + !_cups_strcasecmp(choice->choice, "MPTray")) + pwg_name = "by-pass-tray"; + else if (!_cups_strcasecmp(choice->choice, "LargeCapacity")) + pwg_name = "large-capacity"; + else if (!_cups_strncasecmp(choice->choice, "Lower", 5)) + pwg_name = "bottom"; + else if (!_cups_strncasecmp(choice->choice, "Middle", 6)) + pwg_name = "middle"; + else if (!_cups_strncasecmp(choice->choice, "Upper", 5)) + pwg_name = "top"; + else if (!_cups_strncasecmp(choice->choice, "Side", 4)) + pwg_name = "side"; + else if (!_cups_strcasecmp(choice->choice, "Roll")) + pwg_name = "main-roll"; + else + { + /* + * Convert PPD name to lowercase... + */ + + pwg_name = pwg_keyword; + pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword)); + } + + map->pwg = _cupsStrAlloc(pwg_name); + map->ppd = _cupsStrAlloc(choice->choice); + } + } + + /* + * Copy and convert MediaType data... + */ + + if ((media_type = ppdFindOption(ppd, "MediaType")) != NULL) + { + if ((pc->types = calloc(media_type->num_choices, + sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " + "_pwg_map_t's for MediaType.", media_type->num_choices)); + goto create_error; + } + + pc->num_types = media_type->num_choices; + + for (i = media_type->num_choices, choice = media_type->choices, + map = pc->types; + i > 0; + i --, choice ++, map ++) + { + if (!_cups_strncasecmp(choice->choice, "Auto", 4) || + !_cups_strcasecmp(choice->choice, "Any") || + !_cups_strcasecmp(choice->choice, "Default")) + pwg_name = "auto"; + else if (!_cups_strncasecmp(choice->choice, "Card", 4)) + pwg_name = "cardstock"; + else if (!_cups_strncasecmp(choice->choice, "Env", 3)) + pwg_name = "envelope"; + else if (!_cups_strncasecmp(choice->choice, "Gloss", 5)) + pwg_name = "photographic-glossy"; + else if (!_cups_strcasecmp(choice->choice, "HighGloss")) + pwg_name = "photographic-high-gloss"; + else if (!_cups_strcasecmp(choice->choice, "Matte")) + pwg_name = "photographic-matte"; + else if (!_cups_strncasecmp(choice->choice, "Plain", 5)) + pwg_name = "stationery"; + else if (!_cups_strncasecmp(choice->choice, "Coated", 6)) + pwg_name = "stationery-coated"; + else if (!_cups_strcasecmp(choice->choice, "Inkjet")) + pwg_name = "stationery-inkjet"; + else if (!_cups_strcasecmp(choice->choice, "Letterhead")) + pwg_name = "stationery-letterhead"; + else if (!_cups_strncasecmp(choice->choice, "Preprint", 8)) + pwg_name = "stationery-preprinted"; + else if (!_cups_strcasecmp(choice->choice, "Recycled")) + pwg_name = "stationery-recycled"; + else if (!_cups_strncasecmp(choice->choice, "Transparen", 10)) + pwg_name = "transparency"; + else + { + /* + * Convert PPD name to lowercase... + */ + + pwg_name = pwg_keyword; + pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword)); + } + + map->pwg = _cupsStrAlloc(pwg_name); + map->ppd = _cupsStrAlloc(choice->choice); + } + } + + /* + * Copy and convert OutputBin data... + */ + + if ((output_bin = ppdFindOption(ppd, "OutputBin")) != NULL) + { + if ((pc->bins = calloc(output_bin->num_choices, + sizeof(_pwg_map_t))) == NULL) + { + DEBUG_printf(("_ppdCacheCreateWithPPD: Unable to allocate %d " + "_pwg_map_t's for OutputBin.", output_bin->num_choices)); + goto create_error; + } + + pc->num_bins = output_bin->num_choices; + + for (i = output_bin->num_choices, choice = output_bin->choices, + map = pc->bins; + i > 0; + i --, choice ++, map ++) + { + pwg_unppdize_name(choice->choice, pwg_keyword, sizeof(pwg_keyword)); + + map->pwg = _cupsStrAlloc(pwg_keyword); + map->ppd = _cupsStrAlloc(choice->choice); + } + } + + if ((ppd_attr = ppdFindAttr(ppd, "APPrinterPreset", NULL)) != NULL) + { + /* + * Copy and convert APPrinterPreset (output-mode + print-quality) data... + */ + + const char *quality, /* com.apple.print.preset.quality value */ + *output_mode, /* com.apple.print.preset.output-mode value */ + *color_model_val, /* ColorModel choice */ + *graphicsType, /* com.apple.print.preset.graphicsType value */ + *media_front_coating; /* com.apple.print.preset.media-front-coating value */ + + do + { + num_options = _ppdParseOptions(ppd_attr->value, 0, &options, + _PPD_PARSE_ALL); + + if ((quality = cupsGetOption("com.apple.print.preset.quality", + num_options, options)) != NULL) + { + /* + * Get the print-quality for this preset... + */ + + if (!strcmp(quality, "low")) + pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT; + else if (!strcmp(quality, "high")) + pwg_print_quality = _PWG_PRINT_QUALITY_HIGH; + else + pwg_print_quality = _PWG_PRINT_QUALITY_NORMAL; + + /* + * Ignore graphicsType "Photo" presets that are not high quality. + */ + + graphicsType = cupsGetOption("com.apple.print.preset.graphicsType", + num_options, options); + + if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && graphicsType && + !strcmp(graphicsType, "Photo")) + continue; + + /* + * Ignore presets for normal and draft quality where the coating + * isn't "none" or "autodetect". + */ + + media_front_coating = cupsGetOption( + "com.apple.print.preset.media-front-coating", + num_options, options); + + if (pwg_print_quality != _PWG_PRINT_QUALITY_HIGH && + media_front_coating && + strcmp(media_front_coating, "none") && + strcmp(media_front_coating, "autodetect")) + continue; + + /* + * Get the output mode for this preset... + */ + + output_mode = cupsGetOption("com.apple.print.preset.output-mode", + num_options, options); + color_model_val = cupsGetOption("ColorModel", num_options, options); + + if (output_mode) + { + if (!strcmp(output_mode, "monochrome")) + pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME; + else + pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + } + else if (color_model_val) + { + if (!_cups_strcasecmp(color_model_val, "Gray")) + pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME; + else + pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + } + else + pwg_print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + + /* + * Save the options for this combination as needed... + */ + + if (!pc->num_presets[pwg_print_color_mode][pwg_print_quality]) + pc->num_presets[pwg_print_color_mode][pwg_print_quality] = + _ppdParseOptions(ppd_attr->value, 0, + pc->presets[pwg_print_color_mode] + + pwg_print_quality, _PPD_PARSE_OPTIONS); + } + + cupsFreeOptions(num_options, options); + } + while ((ppd_attr = ppdFindNextAttr(ppd, "APPrinterPreset", NULL)) != NULL); + } + + if (!pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_DRAFT] && + !pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_NORMAL] && + !pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][_PWG_PRINT_QUALITY_HIGH]) + { + /* + * Try adding some common color options to create grayscale presets. These + * are listed in order of popularity... + */ + + const char *color_option = NULL, /* Color control option */ + *gray_choice = NULL; /* Choice to select grayscale */ + + if ((color_model = ppdFindOption(ppd, "ColorModel")) != NULL && + ppdFindChoice(color_model, "Gray")) + { + color_option = "ColorModel"; + gray_choice = "Gray"; + } + else if ((color_model = ppdFindOption(ppd, "HPColorMode")) != NULL && + ppdFindChoice(color_model, "grayscale")) + { + color_option = "HPColorMode"; + gray_choice = "grayscale"; + } + else if ((color_model = ppdFindOption(ppd, "BRMonoColor")) != NULL && + ppdFindChoice(color_model, "Mono")) + { + color_option = "BRMonoColor"; + gray_choice = "Mono"; + } + else if ((color_model = ppdFindOption(ppd, "CNIJSGrayScale")) != NULL && + ppdFindChoice(color_model, "1")) + { + color_option = "CNIJSGrayScale"; + gray_choice = "1"; + } + else if ((color_model = ppdFindOption(ppd, "HPColorAsGray")) != NULL && + ppdFindChoice(color_model, "True")) + { + color_option = "HPColorAsGray"; + gray_choice = "True"; + } + + if (color_option && gray_choice) + { + /* + * Copy and convert ColorModel (output-mode) data... + */ + + cups_option_t *coption, /* Color option */ + *moption; /* Monochrome option */ + + for (pwg_print_quality = _PWG_PRINT_QUALITY_DRAFT; + pwg_print_quality < _PWG_PRINT_QUALITY_MAX; + pwg_print_quality ++) + { + if (pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR][pwg_print_quality]) + { + /* + * Copy the color options... + */ + + num_options = pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR] + [pwg_print_quality]; + options = calloc(sizeof(cups_option_t), num_options); + + if (options) + { + for (i = num_options, moption = options, + coption = pc->presets[_PWG_PRINT_COLOR_MODE_COLOR] + [pwg_print_quality]; + i > 0; + i --, moption ++, coption ++) + { + moption->name = _cupsStrRetain(coption->name); + moption->value = _cupsStrRetain(coption->value); + } + + pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = + num_options; + pc->presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = + options; + } + } + else if (pwg_print_quality != _PWG_PRINT_QUALITY_NORMAL) + continue; + + /* + * Add the grayscale option to the preset... + */ + + pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME][pwg_print_quality] = + cupsAddOption(color_option, gray_choice, + pc->num_presets[_PWG_PRINT_COLOR_MODE_MONOCHROME] + [pwg_print_quality], + pc->presets[_PWG_PRINT_COLOR_MODE_MONOCHROME] + + pwg_print_quality); + } + } + } + + /* + * Copy and convert Duplex (sides) data... + */ + + if ((duplex = ppdFindOption(ppd, "Duplex")) == NULL) + if ((duplex = ppdFindOption(ppd, "JCLDuplex")) == NULL) + if ((duplex = ppdFindOption(ppd, "EFDuplex")) == NULL) + if ((duplex = ppdFindOption(ppd, "EFDuplexing")) == NULL) + duplex = ppdFindOption(ppd, "KD03Duplex"); + + if (duplex) + { + pc->sides_option = _cupsStrAlloc(duplex->keyword); + + for (i = duplex->num_choices, choice = duplex->choices; + i > 0; + i --, choice ++) + { + if ((!_cups_strcasecmp(choice->choice, "None") || + !_cups_strcasecmp(choice->choice, "False")) && !pc->sides_1sided) + pc->sides_1sided = _cupsStrAlloc(choice->choice); + else if ((!_cups_strcasecmp(choice->choice, "DuplexNoTumble") || + !_cups_strcasecmp(choice->choice, "LongEdge") || + !_cups_strcasecmp(choice->choice, "Top")) && !pc->sides_2sided_long) + pc->sides_2sided_long = _cupsStrAlloc(choice->choice); + else if ((!_cups_strcasecmp(choice->choice, "DuplexTumble") || + !_cups_strcasecmp(choice->choice, "ShortEdge") || + !_cups_strcasecmp(choice->choice, "Bottom")) && + !pc->sides_2sided_short) + pc->sides_2sided_short = _cupsStrAlloc(choice->choice); + } + } + + /* + * Copy filters and pre-filters... + */ + + pc->filters = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + cupsArrayAdd(pc->filters, + "application/vnd.cups-raw application/octet-stream 0 -"); + + if ((ppd_attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) != NULL) + { + do + { + cupsArrayAdd(pc->filters, ppd_attr->value); + } + while ((ppd_attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); + } + else if (ppd->num_filters > 0) + { + for (i = 0; i < ppd->num_filters; i ++) + cupsArrayAdd(pc->filters, ppd->filters[i]); + } + else + cupsArrayAdd(pc->filters, "application/vnd.cups-postscript 0 -"); + + /* + * See if we have a command filter... + */ + + for (filter = (const char *)cupsArrayFirst(pc->filters); + filter; + filter = (const char *)cupsArrayNext(pc->filters)) + if (!_cups_strncasecmp(filter, "application/vnd.cups-command", 28) && + _cups_isspace(filter[28])) + break; + + if (!filter && + ((ppd_attr = ppdFindAttr(ppd, "cupsCommands", NULL)) == NULL || + _cups_strcasecmp(ppd_attr->value, "none"))) + { + /* + * No command filter and no cupsCommands keyword telling us not to use one. + * See if this is a PostScript printer, and if so add a PostScript command + * filter... + */ + + for (filter = (const char *)cupsArrayFirst(pc->filters); + filter; + filter = (const char *)cupsArrayNext(pc->filters)) + if (!_cups_strncasecmp(filter, "application/vnd.cups-postscript", 31) && + _cups_isspace(filter[31])) + break; + + if (filter) + cupsArrayAdd(pc->filters, + "application/vnd.cups-command application/postscript 100 " + "commandtops"); + } + + if ((ppd_attr = ppdFindAttr(ppd, "cupsPreFilter", NULL)) != NULL) + { + pc->prefilters = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + do + { + cupsArrayAdd(pc->prefilters, ppd_attr->value); + } + while ((ppd_attr = ppdFindNextAttr(ppd, "cupsPreFilter", NULL)) != NULL); + } + + if ((ppd_attr = ppdFindAttr(ppd, "cupsSingleFile", NULL)) != NULL) + pc->single_file = !_cups_strcasecmp(ppd_attr->value, "true"); + + /* + * Copy the product string, if any... + */ + + if (ppd->product) + pc->product = _cupsStrAlloc(ppd->product); + + /* + * Copy finishings mapping data... + */ + + if ((ppd_attr = ppdFindAttr(ppd, "cupsIPPFinishings", NULL)) != NULL) + { + pc->finishings = cupsArrayNew3((cups_array_func_t)pwg_compare_finishings, + NULL, NULL, 0, NULL, + (cups_afree_func_t)pwg_free_finishings); + + do + { + if ((finishings = calloc(1, sizeof(_pwg_finishings_t))) == NULL) + goto create_error; + + finishings->value = atoi(ppd_attr->spec); + finishings->num_options = _ppdParseOptions(ppd_attr->value, 0, + &(finishings->options), + _PPD_PARSE_OPTIONS); + + cupsArrayAdd(pc->finishings, finishings); + } + while ((ppd_attr = ppdFindNextAttr(ppd, "cupsIPPFinishings", + NULL)) != NULL); + } + + /* + * Return the cache data... + */ + + return (pc); + + /* + * If we get here we need to destroy the PWG mapping data and return NULL... + */ + + create_error: + + _cupsSetError(IPP_INTERNAL_ERROR, _("Out of memory."), 1); + _ppdCacheDestroy(pc); + + return (NULL); +} + + +/* + * '_ppdCacheDestroy()' - Free all memory used for PWG mapping data. + */ + +void +_ppdCacheDestroy(_ppd_cache_t *pc) /* I - PPD cache and mapping data */ +{ + int i; /* Looping var */ + _pwg_map_t *map; /* Current map */ + _pwg_size_t *size; /* Current size */ + + + /* + * Range check input... + */ + + if (!pc) + return; + + /* + * Free memory as needed... + */ + + if (pc->bins) + { + for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++) + { + _cupsStrFree(map->pwg); + _cupsStrFree(map->ppd); + } + + free(pc->bins); + } + + if (pc->sizes) + { + for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) + { + _cupsStrFree(size->map.pwg); + _cupsStrFree(size->map.ppd); + } + + free(pc->sizes); + } + + if (pc->source_option) + _cupsStrFree(pc->source_option); + + if (pc->sources) + { + for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++) + { + _cupsStrFree(map->pwg); + _cupsStrFree(map->ppd); + } + + free(pc->sources); + } + + if (pc->types) + { + for (i = pc->num_types, map = pc->types; i > 0; i --, map ++) + { + _cupsStrFree(map->pwg); + _cupsStrFree(map->ppd); + } + + free(pc->types); + } + + if (pc->custom_max_keyword) + _cupsStrFree(pc->custom_max_keyword); + + if (pc->custom_min_keyword) + _cupsStrFree(pc->custom_min_keyword); + + _cupsStrFree(pc->product); + cupsArrayDelete(pc->filters); + cupsArrayDelete(pc->prefilters); + cupsArrayDelete(pc->finishings); + + free(pc); +} + + +/* + * '_ppdCacheGetBin()' - Get the PWG output-bin keyword associated with a PPD + * OutputBin. + */ + +const char * /* O - output-bin or NULL */ +_ppdCacheGetBin( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *output_bin) /* I - PPD OutputBin string */ +{ + int i; /* Looping var */ + + + /* + * Range check input... + */ + + if (!pc || !output_bin) + return (NULL); + + /* + * Look up the OutputBin string... + */ + + + for (i = 0; i < pc->num_bins; i ++) + if (!_cups_strcasecmp(output_bin, pc->bins[i].ppd)) + return (pc->bins[i].pwg); + + return (NULL); +} + + +/* + * '_ppdCacheGetFinishingOptions()' - Get PPD finishing options for the given + * IPP finishings value(s). + */ + +int /* O - New number of options */ +_ppdCacheGetFinishingOptions( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + ipp_t *job, /* I - Job attributes or NULL */ + ipp_finish_t value, /* I - IPP finishings value of IPP_FINISHINGS_NONE */ + int num_options, /* I - Number of options */ + cups_option_t **options) /* IO - Options */ +{ + int i; /* Looping var */ + _pwg_finishings_t *f, /* PWG finishings options */ + key; /* Search key */ + ipp_attribute_t *attr; /* Finishings attribute */ + cups_option_t *option; /* Current finishings option */ + + + /* + * Range check input... + */ + + if (!pc || cupsArrayCount(pc->finishings) == 0 || !options || + (!job && value == IPP_FINISHINGS_NONE)) + return (num_options); + + /* + * Apply finishing options... + */ + + if (job && (attr = ippFindAttribute(job, "finishings", IPP_TAG_ENUM)) != NULL) + { + for (i = 0; i < attr->num_values; i ++) + { + key.value = attr->values[i].integer; + + if ((f = cupsArrayFind(pc->finishings, &key)) != NULL) + { + int j; /* Another looping var */ + + for (j = f->num_options, option = f->options; j > 0; j --, option ++) + num_options = cupsAddOption(option->name, option->value, + num_options, options); + } + } + } + else if (value != IPP_FINISHINGS_NONE) + { + key.value = value; + + if ((f = cupsArrayFind(pc->finishings, &key)) != NULL) + { + int j; /* Another looping var */ + + for (j = f->num_options, option = f->options; j > 0; j --, option ++) + num_options = cupsAddOption(option->name, option->value, + num_options, options); + } + } + + return (num_options); +} + + +/* + * '_ppdCacheGetFinishingValues()' - Get IPP finishings value(s) from the given + * PPD options. + */ + +int /* O - Number of finishings values */ +_ppdCacheGetFinishingValues( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + int max_values, /* I - Maximum number of finishings values */ + int *values) /* O - Finishings values */ +{ + int i, /* Looping var */ + num_values = 0; /* Number of values */ + _pwg_finishings_t *f; /* Current finishings option */ + cups_option_t *option; /* Current option */ + const char *val; /* Value for option */ + + + /* + * Range check input... + */ + + if (!pc || !pc->finishings || num_options < 1 || max_values < 1 || !values) + return (0); + + /* + * Go through the finishings options and see what is set... + */ + + for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); + f; + f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) + { + for (i = f->num_options, option = f->options; i > 0; i --, option ++) + if ((val = cupsGetOption(option->name, num_options, options)) == NULL || + _cups_strcasecmp(option->value, val)) + break; + + if (i == 0) + { + values[num_values ++] = f->value; + + if (num_values >= max_values) + break; + } + } + + return (num_values); +} + + +/* + * '_ppdCacheGetInputSlot()' - Get the PPD InputSlot associated with the job + * attributes or a keyword string. + */ + +const char * /* O - PPD InputSlot or NULL */ +_ppdCacheGetInputSlot( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + ipp_t *job, /* I - Job attributes or NULL */ + const char *keyword) /* I - Keyword string or NULL */ +{ + /* + * Range check input... + */ + + if (!pc || pc->num_sources == 0 || (!job && !keyword)) + return (NULL); + + if (job && !keyword) + { + /* + * Lookup the media-col attribute and any media-source found there... + */ + + ipp_attribute_t *media_col, /* media-col attribute */ + *media_source; /* media-source attribute */ + _pwg_size_t size; /* Dimensional size */ + int margins_set; /* Were the margins set? */ + + media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION); + if (media_col && + (media_source = ippFindAttribute(media_col->values[0].collection, + "media-source", + IPP_TAG_KEYWORD)) != NULL) + { + /* + * Use the media-source value from media-col... + */ + + keyword = media_source->values[0].string.text; + } + else if (_pwgInitSize(&size, job, &margins_set)) + { + /* + * For media <= 5x7, look for a photo tray... + */ + + if (size.width <= (5 * 2540) && size.length <= (7 * 2540)) + keyword = "photo"; + } + } + + if (keyword) + { + int i; /* Looping var */ + + for (i = 0; i < pc->num_sources; i ++) + if (!_cups_strcasecmp(keyword, pc->sources[i].pwg)) + return (pc->sources[i].ppd); + } + + return (NULL); +} + + +/* + * '_ppdCacheGetMediaType()' - Get the PPD MediaType associated with the job + * attributes or a keyword string. + */ + +const char * /* O - PPD MediaType or NULL */ +_ppdCacheGetMediaType( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + ipp_t *job, /* I - Job attributes or NULL */ + const char *keyword) /* I - Keyword string or NULL */ +{ + /* + * Range check input... + */ + + if (!pc || pc->num_types == 0 || (!job && !keyword)) + return (NULL); + + if (job && !keyword) + { + /* + * Lookup the media-col attribute and any media-source found there... + */ + + ipp_attribute_t *media_col, /* media-col attribute */ + *media_type; /* media-type attribute */ + + media_col = ippFindAttribute(job, "media-col", IPP_TAG_BEGIN_COLLECTION); + if (media_col) + { + if ((media_type = ippFindAttribute(media_col->values[0].collection, + "media-type", + IPP_TAG_KEYWORD)) == NULL) + media_type = ippFindAttribute(media_col->values[0].collection, + "media-type", IPP_TAG_NAME); + + if (media_type) + keyword = media_type->values[0].string.text; + } + } + + if (keyword) + { + int i; /* Looping var */ + + for (i = 0; i < pc->num_types; i ++) + if (!_cups_strcasecmp(keyword, pc->types[i].pwg)) + return (pc->types[i].ppd); + } + + return (NULL); +} + + +/* + * '_ppdCacheGetOutputBin()' - Get the PPD OutputBin associated with the keyword + * string. + */ + +const char * /* O - PPD OutputBin or NULL */ +_ppdCacheGetOutputBin( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *output_bin) /* I - Keyword string */ +{ + int i; /* Looping var */ + + + /* + * Range check input... + */ + + if (!pc || !output_bin) + return (NULL); + + /* + * Look up the OutputBin string... + */ + + + for (i = 0; i < pc->num_bins; i ++) + if (!_cups_strcasecmp(output_bin, pc->bins[i].pwg)) + return (pc->bins[i].ppd); + + return (NULL); +} + + +/* + * '_ppdCacheGetPageSize()' - Get the PPD PageSize associated with the job + * attributes or a keyword string. + */ + +const char * /* O - PPD PageSize or NULL */ +_ppdCacheGetPageSize( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + ipp_t *job, /* I - Job attributes or NULL */ + const char *keyword, /* I - Keyword string or NULL */ + int *exact) /* O - 1 if exact match, 0 otherwise */ +{ + int i; /* Looping var */ + _pwg_size_t *size, /* Current size */ + *closest, /* Closest size */ + jobsize; /* Size data from job */ + int margins_set, /* Were the margins set? */ + dwidth, /* Difference in width */ + dlength, /* Difference in length */ + dleft, /* Difference in left margins */ + dright, /* Difference in right margins */ + dbottom, /* Difference in bottom margins */ + dtop, /* Difference in top margins */ + dmin, /* Minimum difference */ + dclosest; /* Closest difference */ + const char *ppd_name; /* PPD media name */ + + + DEBUG_printf(("_ppdCacheGetPageSize(pc=%p, job=%p, keyword=\"%s\", exact=%p)", + pc, job, keyword, exact)); + + /* + * Range check input... + */ + + if (!pc || (!job && !keyword)) + return (NULL); + + if (exact) + *exact = 0; + + ppd_name = keyword; + + if (job) + { + /* + * Try getting the PPD media name from the job attributes... + */ + + ipp_attribute_t *attr; /* Job attribute */ + + if ((attr = ippFindAttribute(job, "PageSize", IPP_TAG_ZERO)) == NULL) + if ((attr = ippFindAttribute(job, "PageRegion", IPP_TAG_ZERO)) == NULL) + attr = ippFindAttribute(job, "media", IPP_TAG_ZERO); + +#ifdef DEBUG + if (attr) + DEBUG_printf(("1_ppdCacheGetPageSize: Found attribute %s (%s)", + attr->name, ippTagString(attr->value_tag))); + else + DEBUG_puts("1_ppdCacheGetPageSize: Did not find media attribute."); +#endif /* DEBUG */ + + if (attr && (attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_KEYWORD)) + ppd_name = attr->values[0].string.text; + } + + DEBUG_printf(("1_ppdCacheGetPageSize: ppd_name=\"%s\"", ppd_name)); + + if (ppd_name) + { + /* + * Try looking up the named PPD size first... + */ + + for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) + { + DEBUG_printf(("2_ppdCacheGetPageSize: size[%d]=[\"%s\" \"%s\"]", + (int)(size - pc->sizes), size->map.pwg, size->map.ppd)); + + if (!_cups_strcasecmp(ppd_name, size->map.ppd) || + !_cups_strcasecmp(ppd_name, size->map.pwg)) + { + if (exact) + *exact = 1; + + DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\"", ppd_name)); + + return (size->map.ppd); + } + } + } + + if (job && !keyword) + { + /* + * Get the size using media-col or media, with the preference being + * media-col. + */ + + if (!_pwgInitSize(&jobsize, job, &margins_set)) + return (NULL); + } + else + { + /* + * Get the size using a media keyword... + */ + + _pwg_media_t *media; /* Media definition */ + + + if ((media = _pwgMediaForPWG(keyword)) == NULL) + if ((media = _pwgMediaForLegacy(keyword)) == NULL) + if ((media = _pwgMediaForPPD(keyword)) == NULL) + return (NULL); + + jobsize.width = media->width; + jobsize.length = media->length; + margins_set = 0; + } + + /* + * Now that we have the dimensions and possibly the margins, look at the + * available sizes and find the match... + */ + + closest = NULL; + dclosest = 999999999; + + if (!ppd_name || _cups_strncasecmp(ppd_name, "Custom.", 7) || + _cups_strncasecmp(ppd_name, "custom_", 7)) + { + for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) + { + /* + * Adobe uses a size matching algorithm with an epsilon of 5 points, which + * is just about 176/2540ths... + */ + + dwidth = size->width - jobsize.width; + dlength = size->length - jobsize.length; + + if (dwidth <= -176 || dwidth >= 176 || dlength <= -176 || dlength >= 176) + continue; + + if (margins_set) + { + /* + * Use a tighter epsilon of 1 point (35/2540ths) for margins... + */ + + dleft = size->left - jobsize.left; + dright = size->right - jobsize.right; + dtop = size->top - jobsize.top; + dbottom = size->bottom - jobsize.bottom; + + if (dleft <= -35 || dleft >= 35 || dright <= -35 || dright >= 35 || + dtop <= -35 || dtop >= 35 || dbottom <= -35 || dbottom >= 35) + { + dleft = dleft < 0 ? -dleft : dleft; + dright = dright < 0 ? -dright : dright; + dbottom = dbottom < 0 ? -dbottom : dbottom; + dtop = dtop < 0 ? -dtop : dtop; + dmin = dleft + dright + dbottom + dtop; + + if (dmin < dclosest) + { + dclosest = dmin; + closest = size; + } + + continue; + } + } + + if (exact) + *exact = 1; + + DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\"", size->map.ppd)); + + return (size->map.ppd); + } + } + + if (closest) + { + DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\" (closest)", + closest->map.ppd)); + + return (closest->map.ppd); + } + + /* + * If we get here we need to check for custom page size support... + */ + + if (jobsize.width >= pc->custom_min_width && + jobsize.width <= pc->custom_max_width && + jobsize.length >= pc->custom_min_length && + jobsize.length <= pc->custom_max_length) + { + /* + * In range, format as Custom.WWWWxLLLL (points). + */ + + snprintf(pc->custom_ppd_size, sizeof(pc->custom_ppd_size), "Custom.%dx%d", + (int)_PWG_TOPTS(jobsize.width), (int)_PWG_TOPTS(jobsize.length)); + + if (margins_set && exact) + { + dleft = pc->custom_size.left - jobsize.left; + dright = pc->custom_size.right - jobsize.right; + dtop = pc->custom_size.top - jobsize.top; + dbottom = pc->custom_size.bottom - jobsize.bottom; + + if (dleft > -35 && dleft < 35 && dright > -35 && dright < 35 && + dtop > -35 && dtop < 35 && dbottom > -35 && dbottom < 35) + *exact = 1; + } + else if (exact) + *exact = 1; + + DEBUG_printf(("1_ppdCacheGetPageSize: Returning \"%s\" (custom)", + pc->custom_ppd_size)); + + return (pc->custom_ppd_size); + } + + /* + * No custom page size support or the size is out of range - return NULL. + */ + + DEBUG_puts("1_ppdCacheGetPageSize: Returning NULL"); + + return (NULL); +} + + +/* + * '_ppdCacheGetSize()' - Get the PWG size associated with a PPD PageSize. + */ + +_pwg_size_t * /* O - PWG size or NULL */ +_ppdCacheGetSize( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *page_size) /* I - PPD PageSize */ +{ + int i; /* Looping var */ + _pwg_media_t *media; /* Media */ + _pwg_size_t *size; /* Current size */ + + + /* + * Range check input... + */ + + if (!pc || !page_size) + return (NULL); + + if (!_cups_strncasecmp(page_size, "Custom.", 7)) + { + /* + * Custom size; size name can be one of the following: + * + * Custom.WIDTHxLENGTHin - Size in inches + * Custom.WIDTHxLENGTHft - Size in feet + * Custom.WIDTHxLENGTHcm - Size in centimeters + * Custom.WIDTHxLENGTHmm - Size in millimeters + * Custom.WIDTHxLENGTHm - Size in meters + * Custom.WIDTHxLENGTH[pt] - Size in points + */ + + double w, l; /* Width and length of page */ + char *ptr; /* Pointer into PageSize */ + struct lconv *loc; /* Locale data */ + + loc = localeconv(); + w = (float)_cupsStrScand(page_size + 7, &ptr, loc); + if (!ptr || *ptr != 'x') + return (NULL); + + l = (float)_cupsStrScand(ptr + 1, &ptr, loc); + if (!ptr) + return (NULL); + + if (!_cups_strcasecmp(ptr, "in")) + { + w *= 2540.0; + l *= 2540.0; + } + else if (!_cups_strcasecmp(ptr, "ft")) + { + w *= 12.0 * 2540.0; + l *= 12.0 * 2540.0; + } + else if (!_cups_strcasecmp(ptr, "mm")) + { + w *= 100.0; + l *= 100.0; + } + else if (!_cups_strcasecmp(ptr, "cm")) + { + w *= 1000.0; + l *= 1000.0; + } + else if (!_cups_strcasecmp(ptr, "m")) + { + w *= 100000.0; + l *= 100000.0; + } + else + { + w *= 2540.0 / 72.0; + l *= 2540.0 / 72.0; + } + + pc->custom_size.width = (int)w; + pc->custom_size.length = (int)l; + + return (&(pc->custom_size)); + } + + /* + * Not a custom size - look it up... + */ + + for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) + if (!_cups_strcasecmp(page_size, size->map.ppd) || + !_cups_strcasecmp(page_size, size->map.pwg)) + return (size); + + /* + * Look up standard sizes... + */ + + if ((media = _pwgMediaForPPD(page_size)) == NULL) + if ((media = _pwgMediaForLegacy(page_size)) == NULL) + media = _pwgMediaForPWG(page_size); + + if (media) + { + pc->custom_size.width = media->width; + pc->custom_size.length = media->length; + + return (&(pc->custom_size)); + } + + return (NULL); +} + + +/* + * '_ppdCacheGetSource()' - Get the PWG media-source associated with a PPD + * InputSlot. + */ + +const char * /* O - PWG media-source keyword */ +_ppdCacheGetSource( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *input_slot) /* I - PPD InputSlot */ +{ + int i; /* Looping var */ + _pwg_map_t *source; /* Current source */ + + + /* + * Range check input... + */ + + if (!pc || !input_slot) + return (NULL); + + for (i = pc->num_sources, source = pc->sources; i > 0; i --, source ++) + if (!_cups_strcasecmp(input_slot, source->ppd)) + return (source->pwg); + + return (NULL); +} + + +/* + * '_ppdCacheGetType()' - Get the PWG media-type associated with a PPD + * MediaType. + */ + +const char * /* O - PWG media-type keyword */ +_ppdCacheGetType( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *media_type) /* I - PPD MediaType */ +{ + int i; /* Looping var */ + _pwg_map_t *type; /* Current type */ + + + /* + * Range check input... + */ + + if (!pc || !media_type) + return (NULL); + + for (i = pc->num_types, type = pc->types; i > 0; i --, type ++) + if (!_cups_strcasecmp(media_type, type->ppd)) + return (type->pwg); + + return (NULL); +} + + +/* + * '_ppdCacheWriteFile()' - Write PWG mapping data to a file. + */ + +int /* O - 1 on success, 0 on failure */ +_ppdCacheWriteFile( + _ppd_cache_t *pc, /* I - PPD cache and mapping data */ + const char *filename, /* I - File to write */ + ipp_t *attrs) /* I - Attributes to write, if any */ +{ + int i, j, k; /* Looping vars */ + cups_file_t *fp; /* Output file */ + _pwg_size_t *size; /* Current size */ + _pwg_map_t *map; /* Current map */ + _pwg_finishings_t *f; /* Current finishing option */ + cups_option_t *option; /* Current option */ + const char *value; /* Filter/pre-filter value */ + char newfile[1024]; /* New filename */ + + + /* + * Range check input... + */ + + if (!pc || !filename) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + return (0); + } + + /* + * Open the file and write with compression... + */ + + snprintf(newfile, sizeof(newfile), "%s.N", filename); + if ((fp = cupsFileOpen(newfile, "w9")) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + return (0); + } + + /* + * Standard header... + */ + + cupsFilePrintf(fp, "#CUPS-PPD-CACHE-%d\n", _PPD_CACHE_VERSION); + + /* + * Output bins... + */ + + if (pc->num_bins > 0) + { + cupsFilePrintf(fp, "NumBins %d\n", pc->num_bins); + for (i = pc->num_bins, map = pc->bins; i > 0; i --, map ++) + cupsFilePrintf(fp, "Bin %s %s\n", map->pwg, map->ppd); + } + + /* + * Media sizes... + */ + + cupsFilePrintf(fp, "NumSizes %d\n", pc->num_sizes); + for (i = pc->num_sizes, size = pc->sizes; i > 0; i --, size ++) + cupsFilePrintf(fp, "Size %s %s %d %d %d %d %d %d\n", size->map.pwg, + size->map.ppd, size->width, size->length, size->left, + size->bottom, size->right, size->top); + if (pc->custom_max_width > 0) + cupsFilePrintf(fp, "CustomSize %d %d %d %d %d %d %d %d\n", + pc->custom_max_width, pc->custom_max_length, + pc->custom_min_width, pc->custom_min_length, + pc->custom_size.left, pc->custom_size.bottom, + pc->custom_size.right, pc->custom_size.top); + + /* + * Media sources... + */ + + if (pc->source_option) + cupsFilePrintf(fp, "SourceOption %s\n", pc->source_option); + + if (pc->num_sources > 0) + { + cupsFilePrintf(fp, "NumSources %d\n", pc->num_sources); + for (i = pc->num_sources, map = pc->sources; i > 0; i --, map ++) + cupsFilePrintf(fp, "Source %s %s\n", map->pwg, map->ppd); + } + + /* + * Media types... + */ + + if (pc->num_types > 0) + { + cupsFilePrintf(fp, "NumTypes %d\n", pc->num_types); + for (i = pc->num_types, map = pc->types; i > 0; i --, map ++) + cupsFilePrintf(fp, "Type %s %s\n", map->pwg, map->ppd); + } + + /* + * Presets... + */ + + for (i = _PWG_PRINT_COLOR_MODE_MONOCHROME; i < _PWG_PRINT_COLOR_MODE_MAX; i ++) + for (j = _PWG_PRINT_QUALITY_DRAFT; j < _PWG_PRINT_QUALITY_MAX; j ++) + if (pc->num_presets[i][j]) + { + cupsFilePrintf(fp, "Preset %d %d", i, j); + for (k = pc->num_presets[i][j], option = pc->presets[i][j]; + k > 0; + k --, option ++) + cupsFilePrintf(fp, " %s=%s", option->name, option->value); + cupsFilePutChar(fp, '\n'); + } + + /* + * Duplex/sides... + */ + + if (pc->sides_option) + cupsFilePrintf(fp, "SidesOption %s\n", pc->sides_option); + + if (pc->sides_1sided) + cupsFilePrintf(fp, "Sides1Sided %s\n", pc->sides_1sided); + + if (pc->sides_2sided_long) + cupsFilePrintf(fp, "Sides2SidedLong %s\n", pc->sides_2sided_long); + + if (pc->sides_2sided_short) + cupsFilePrintf(fp, "Sides2SidedShort %s\n", pc->sides_2sided_short); + + /* + * Product, cupsFilter, cupsFilter2, and cupsPreFilter... + */ + + if (pc->product) + cupsFilePutConf(fp, "Product", pc->product); + + for (value = (const char *)cupsArrayFirst(pc->filters); + value; + value = (const char *)cupsArrayNext(pc->filters)) + cupsFilePutConf(fp, "Filter", value); + + for (value = (const char *)cupsArrayFirst(pc->prefilters); + value; + value = (const char *)cupsArrayNext(pc->prefilters)) + cupsFilePutConf(fp, "PreFilter", value); + + cupsFilePrintf(fp, "SingleFile %s\n", pc->single_file ? "true" : "false"); + + /* + * Finishing options... + */ + + for (f = (_pwg_finishings_t *)cupsArrayFirst(pc->finishings); + f; + f = (_pwg_finishings_t *)cupsArrayNext(pc->finishings)) + { + cupsFilePrintf(fp, "Finishings %d", f->value); + for (i = f->num_options, option = f->options; i > 0; i --, option ++) + cupsFilePrintf(fp, " %s=%s", option->name, option->value); + cupsFilePutChar(fp, '\n'); + } + + /* + * IPP attributes, if any... + */ + + if (attrs) + { + cupsFilePrintf(fp, "IPP " CUPS_LLFMT "\n", CUPS_LLCAST ippLength(attrs)); + + attrs->state = IPP_IDLE; + ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, attrs); + } + + /* + * Close and return... + */ + + if (cupsFileClose(fp)) + { + unlink(newfile); + return (0); + } + + unlink(filename); + return (!rename(newfile, filename)); +} + + +/* + * '_pwgInputSlotForSource()' - Get the InputSlot name for the given PWG + * media-source. + */ + +const char * /* O - InputSlot name */ +_pwgInputSlotForSource( + const char *media_source, /* I - PWG media-source */ + char *name, /* I - Name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + /* + * Range check input... + */ + + if (!media_source || !name || namesize < PPD_MAX_NAME) + return (NULL); + + if (_cups_strcasecmp(media_source, "main")) + strlcpy(name, "Cassette", namesize); + else if (_cups_strcasecmp(media_source, "alternate")) + strlcpy(name, "Multipurpose", namesize); + else if (_cups_strcasecmp(media_source, "large-capacity")) + strlcpy(name, "LargeCapacity", namesize); + else if (_cups_strcasecmp(media_source, "bottom")) + strlcpy(name, "Lower", namesize); + else if (_cups_strcasecmp(media_source, "middle")) + strlcpy(name, "Middle", namesize); + else if (_cups_strcasecmp(media_source, "top")) + strlcpy(name, "Upper", namesize); + else if (_cups_strcasecmp(media_source, "rear")) + strlcpy(name, "Rear", namesize); + else if (_cups_strcasecmp(media_source, "side")) + strlcpy(name, "Side", namesize); + else if (_cups_strcasecmp(media_source, "envelope")) + strlcpy(name, "Envelope", namesize); + else if (_cups_strcasecmp(media_source, "main-roll")) + strlcpy(name, "Roll", namesize); + else if (_cups_strcasecmp(media_source, "alternate-roll")) + strlcpy(name, "Roll2", namesize); + else + pwg_ppdize_name(media_source, name, namesize); + + return (name); +} + + +/* + * '_pwgMediaTypeForType()' - Get the MediaType name for the given PWG + * media-type. + */ + +const char * /* O - MediaType name */ +_pwgMediaTypeForType( + const char *media_type, /* I - PWG media-type */ + char *name, /* I - Name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + /* + * Range check input... + */ + + if (!media_type || !name || namesize < PPD_MAX_NAME) + return (NULL); + + if (_cups_strcasecmp(media_type, "auto")) + strlcpy(name, "Auto", namesize); + else if (_cups_strcasecmp(media_type, "cardstock")) + strlcpy(name, "Cardstock", namesize); + else if (_cups_strcasecmp(media_type, "envelope")) + strlcpy(name, "Envelope", namesize); + else if (_cups_strcasecmp(media_type, "photographic-glossy")) + strlcpy(name, "Glossy", namesize); + else if (_cups_strcasecmp(media_type, "photographic-high-gloss")) + strlcpy(name, "HighGloss", namesize); + else if (_cups_strcasecmp(media_type, "photographic-matte")) + strlcpy(name, "Matte", namesize); + else if (_cups_strcasecmp(media_type, "stationery")) + strlcpy(name, "Plain", namesize); + else if (_cups_strcasecmp(media_type, "stationery-coated")) + strlcpy(name, "Coated", namesize); + else if (_cups_strcasecmp(media_type, "stationery-inkjet")) + strlcpy(name, "Inkjet", namesize); + else if (_cups_strcasecmp(media_type, "stationery-letterhead")) + strlcpy(name, "Letterhead", namesize); + else if (_cups_strcasecmp(media_type, "stationery-preprinted")) + strlcpy(name, "Preprinted", namesize); + else if (_cups_strcasecmp(media_type, "transparency")) + strlcpy(name, "Transparency", namesize); + else + pwg_ppdize_name(media_type, name, namesize); + + return (name); +} + + +/* + * '_pwgPageSizeForMedia()' - Get the PageSize name for the given media. + */ + +const char * /* O - PageSize name */ +_pwgPageSizeForMedia( + _pwg_media_t *media, /* I - Media */ + char *name, /* I - PageSize name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + const char *sizeptr, /* Pointer to size in PWG name */ + *dimptr; /* Pointer to dimensions in PWG name */ + + + /* + * Range check input... + */ + + if (!media || !name || namesize < PPD_MAX_NAME) + return (NULL); + + /* + * Copy or generate a PageSize name... + */ + + if (media->ppd) + { + /* + * Use a standard Adobe name... + */ + + strlcpy(name, media->ppd, namesize); + } + else if (!media->pwg || !strncmp(media->pwg, "custom_", 7) || + (sizeptr = strchr(media->pwg, '_')) == NULL || + (dimptr = strchr(sizeptr + 1, '_')) == NULL || + (size_t)(dimptr - sizeptr) > namesize) + { + /* + * Use a name of the form "wNNNhNNN"... + */ + + snprintf(name, namesize, "w%dh%d", (int)_PWG_TOPTS(media->width), + (int)_PWG_TOPTS(media->length)); + } + else + { + /* + * Copy the size name from class_sizename_dimensions... + */ + + memcpy(name, sizeptr + 1, dimptr - sizeptr - 1); + name[dimptr - sizeptr - 1] = '\0'; + } + + return (name); +} + + +/* + * 'pwg_compare_finishings()' - Compare two finishings values. + */ + +static int /* O- Result of comparison */ +pwg_compare_finishings( + _pwg_finishings_t *a, /* I - First finishings value */ + _pwg_finishings_t *b) /* I - Second finishings value */ +{ + return (b->value - a->value); +} + + +/* + * 'pwg_free_finishings()' - Free a finishings value. + */ + +static void +pwg_free_finishings( + _pwg_finishings_t *f) /* I - Finishings value */ +{ + cupsFreeOptions(f->num_options, f->options); + free(f); +} + + +/* + * 'pwg_ppdize_name()' - Convert an IPP keyword to a PPD keyword. + */ + +static void +pwg_ppdize_name(const char *ipp, /* I - IPP keyword */ + char *name, /* I - Name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + char *ptr, /* Pointer into name buffer */ + *end; /* End of name buffer */ + + + *name = toupper(*ipp++); + + for (ptr = name + 1, end = name + namesize - 1; *ipp && ptr < end;) + { + if (*ipp == '-' && _cups_isalpha(ipp[1])) + { + ipp ++; + *ptr++ = toupper(*ipp++ & 255); + } + else + *ptr++ = *ipp++; + } + + *ptr = '\0'; +} + + +/* + * 'pwg_unppdize_name()' - Convert a PPD keyword to a lowercase IPP keyword. + */ + +static void +pwg_unppdize_name(const char *ppd, /* I - PPD keyword */ + char *name, /* I - Name buffer */ + size_t namesize) /* I - Size of name buffer */ +{ + char *ptr, /* Pointer into name buffer */ + *end; /* End of name buffer */ + + + for (ptr = name, end = name + namesize - 1; *ppd && ptr < end; ppd ++) + { + if (_cups_isalnum(*ppd) || *ppd == '-') + *ptr++ = tolower(*ppd & 255); + else if (*ppd == '_' || *ppd == '.') + *ptr++ = '-'; + + if (!_cups_isupper(*ppd) && _cups_isalnum(*ppd) && + _cups_isupper(ppd[1]) && ptr < end) + *ptr++ = '-'; + } + + *ptr = '\0'; +} + + +/* + * End of "$Id: ppd-cache.c 10340 2012-03-07 17:16:42Z mike $". + */ diff --git a/cups/ppd-private.h b/cups/ppd-private.h new file mode 100644 index 0000000..be161df --- /dev/null +++ b/cups/ppd-private.h @@ -0,0 +1,202 @@ +/* + * "$Id: ppd-private.h 10244 2012-02-11 02:21:34Z mike $" + * + * Private PPD definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_PPD_PRIVATE_H_ +# define _CUPS_PPD_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include +# include "pwg-private.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define _PPD_CACHE_VERSION 2 /* Version number in cache file */ + + +/* + * Types and structures... + */ + +typedef enum _ppd_parse_e /**** Selector for _ppdParseOptions ****/ +{ + _PPD_PARSE_OPTIONS, /* Parse only the options */ + _PPD_PARSE_PROPERTIES, /* Parse only the properties */ + _PPD_PARSE_ALL /* Parse everything */ +} _ppd_parse_t; + +typedef struct _ppd_cups_uiconst_s /**** Constraint from cupsUIConstraints ****/ +{ + ppd_option_t *option; /* Constrained option */ + ppd_choice_t *choice; /* Constrained choice or @code NULL@ */ + int installable; /* Installable option? */ +} _ppd_cups_uiconst_t; + +typedef struct _ppd_cups_uiconsts_s /**** cupsUIConstraints ****/ +{ + char resolver[PPD_MAX_NAME]; /* Resolver name */ + int installable, /* Constrained against any installable options? */ + num_constraints; /* Number of constraints */ + _ppd_cups_uiconst_t *constraints; /* Constraints */ +} _ppd_cups_uiconsts_t; + +typedef enum _pwg_print_color_mode_e /**** PWG print-color-mode indices ****/ +{ + _PWG_PRINT_COLOR_MODE_MONOCHROME = 0, /* print-color-mode=monochrome */ + _PWG_PRINT_COLOR_MODE_COLOR, /* print-color-mode=color */ + /* Other proposed values are not supported by CUPS yet. */ + _PWG_PRINT_COLOR_MODE_MAX +} _pwg_print_color_mode_t; + +typedef enum _pwg_print_quality_e /**** PWG print-quality values ****/ +{ + _PWG_PRINT_QUALITY_DRAFT = 0, /* print-quality=3 */ + _PWG_PRINT_QUALITY_NORMAL, /* print-quality=4 */ + _PWG_PRINT_QUALITY_HIGH, /* print-quality=5 */ + _PWG_PRINT_QUALITY_MAX +} _pwg_print_quality_t; + +typedef struct _pwg_finishings_s /**** PWG finishings mapping data ****/ +{ + ipp_finish_t value; /* finishings value */ + int num_options; /* Number of options to apply */ + cups_option_t *options; /* Options to apply */ +} _pwg_finishings_t; + +struct _ppd_cache_s /**** PPD cache and PWG conversion data ****/ +{ + int num_bins; /* Number of output bins */ + _pwg_map_t *bins; /* Output bins */ + int num_sizes; /* Number of media sizes */ + _pwg_size_t *sizes; /* Media sizes */ + int custom_max_width, /* Maximum custom width in 2540ths */ + custom_max_length, /* Maximum custom length in 2540ths */ + custom_min_width, /* Minimum custom width in 2540ths */ + custom_min_length; /* Minimum custom length in 2540ths */ + char *custom_max_keyword, /* Maximum custom size PWG keyword */ + *custom_min_keyword, /* Minimum custom size PWG keyword */ + custom_ppd_size[41]; /* Custom PPD size name */ + _pwg_size_t custom_size; /* Custom size record */ + char *source_option; /* PPD option for media source */ + int num_sources; /* Number of media sources */ + _pwg_map_t *sources; /* Media sources */ + int num_types; /* Number of media types */ + _pwg_map_t *types; /* Media types */ + int num_presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX]; + /* Number of print-color-mode/print-quality options */ + cups_option_t *presets[_PWG_PRINT_COLOR_MODE_MAX][_PWG_PRINT_QUALITY_MAX]; + /* print-color-mode/print-quality options */ + char *sides_option, /* PPD option for sides */ + *sides_1sided, /* Choice for one-sided */ + *sides_2sided_long, /* Choice for two-sided-long-edge */ + *sides_2sided_short; /* Choice for two-sided-short-edge */ + char *product; /* Product value */ + cups_array_t *filters, /* cupsFilter/cupsFilter2 values */ + *prefilters; /* cupsPreFilter values */ + int single_file; /* cupsSingleFile value */ + cups_array_t *finishings; /* cupsIPPFinishings values */ +}; + + +/* + * Prototypes... + */ + +extern _ppd_cache_t *_ppdCacheCreateWithFile(const char *filename, + ipp_t **attrs); +extern _ppd_cache_t *_ppdCacheCreateWithPPD(ppd_file_t *ppd); +extern void _ppdCacheDestroy(_ppd_cache_t *pc); +extern const char *_ppdCacheGetBin(_ppd_cache_t *pc, + const char *output_bin); +extern int _ppdCacheGetFinishingOptions(_ppd_cache_t *pc, ipp_t *job, + ipp_finish_t value, int num_options, + cups_option_t **options); +extern int _ppdCacheGetFinishingValues(_ppd_cache_t *pc, int num_options, + cups_option_t *options, + int max_values, int *values); +extern const char *_ppdCacheGetInputSlot(_ppd_cache_t *pc, ipp_t *job, + const char *keyword); +extern const char *_ppdCacheGetMediaType(_ppd_cache_t *pc, ipp_t *job, + const char *keyword); +extern const char *_ppdCacheGetOutputBin(_ppd_cache_t *pc, + const char *keyword); +extern const char *_ppdCacheGetPageSize(_ppd_cache_t *pc, ipp_t *job, + const char *keyword, int *exact); +extern _pwg_size_t *_ppdCacheGetSize(_ppd_cache_t *pc, + const char *page_size); +extern const char *_ppdCacheGetSource(_ppd_cache_t *pc, + const char *input_slot); +extern const char *_ppdCacheGetType(_ppd_cache_t *pc, + const char *media_type); +extern int _ppdCacheWriteFile(_ppd_cache_t *pc, + const char *filename, ipp_t *attrs); +extern void _ppdFreeLanguages(cups_array_t *languages); +extern cups_encoding_t _ppdGetEncoding(const char *name); +extern cups_array_t *_ppdGetLanguages(ppd_file_t *ppd); +extern unsigned _ppdHashName(const char *name); +extern ppd_attr_t *_ppdLocalizedAttr(ppd_file_t *ppd, const char *keyword, + const char *spec, const char *ll_CC); +extern char *_ppdNormalizeMakeAndModel(const char *make_and_model, + char *buffer, + size_t bufsize); +extern int _ppdParseOptions(const char *s, int num_options, + cups_option_t **options, + _ppd_parse_t which); +extern const char *_pwgInputSlotForSource(const char *media_source, + char *name, size_t namesize); +extern const char *_pwgMediaTypeForType(const char *media_type, + char *name, size_t namesize); +extern const char *_pwgPageSizeForMedia(_pwg_media_t *media, + char *name, size_t namesize); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_PPD_PRIVATE_H_ */ + +/* + * End of "$Id: ppd-private.h 10244 2012-02-11 02:21:34Z mike $". + */ diff --git a/cups/ppd.c b/cups/ppd.c new file mode 100644 index 0000000..99e6d43 --- /dev/null +++ b/cups/ppd.c @@ -0,0 +1,3296 @@ +/* + * "$Id: ppd.c 9901 2011-08-17 21:01:53Z mike $" + * + * PPD file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * ppdClose() - Free all memory used by the PPD file. + * ppdErrorString() - Returns the text assocated with a status. + * _ppdGetEncoding() - Get the CUPS encoding value for the given + * LanguageEncoding. + * ppdLastError() - Return the status from the last ppdOpen*(). + * ppdOpen() - Read a PPD file into memory. + * ppdOpen2() - Read a PPD file into memory. + * ppdOpenFd() - Read a PPD file into memory. + * ppdOpenFile() - Read a PPD file into memory. + * ppdSetConformance() - Set the conformance level for PPD files. + * ppd_add_attr() - Add an attribute to the PPD data. + * ppd_add_choice() - Add a choice to an option. + * ppd_add_size() - Add a page size. + * ppd_compare_attrs() - Compare two attributes. + * ppd_compare_choices() - Compare two choices... + * ppd_compare_coptions() - Compare two custom options. + * ppd_compare_options() - Compare two options. + * ppd_decode() - Decode a string value... + * ppd_free_filters() - Free the filters array. + * ppd_free_group() - Free a single UI group. + * ppd_free_option() - Free a single option. + * ppd_get_coption() - Get a custom option record. + * ppd_get_cparam() - Get a custom parameter record. + * ppd_get_group() - Find or create the named group as needed. + * ppd_get_option() - Find or create the named option as needed. + * ppd_hash_option() - Generate a hash of the option name... + * ppd_read() - Read a line from a PPD file, skipping comment + * lines as necessary. + * ppd_update_filters() - Update the filters array as needed. + */ + +/* + * Include necessary headers. + */ + +#include "cups-private.h" +#include "ppd-private.h" + + +/* + * Definitions... + */ + +#if defined(WIN32) || defined(__EMX__) +# define READ_BINARY "rb" /* Open a binary file for reading */ +# define WRITE_BINARY "wb" /* Open a binary file for writing */ +#else +# define READ_BINARY "r" /* Open a binary file for reading */ +# define WRITE_BINARY "w" /* Open a binary file for writing */ +#endif /* WIN32 || __EMX__ */ + +#define ppd_free(p) if (p) free(p) /* Safe free macro */ + +#define PPD_KEYWORD 1 /* Line contained a keyword */ +#define PPD_OPTION 2 /* Line contained an option name */ +#define PPD_TEXT 4 /* Line contained human-readable text */ +#define PPD_STRING 8 /* Line contained a string or code */ + +#define PPD_HASHSIZE 512 /* Size of hash */ + + +/* + * Line buffer structure... + */ + +typedef struct _ppd_line_s +{ + char *buffer; /* Pointer to buffer */ + size_t bufsize; /* Size of the buffer */ +} _ppd_line_t; + + +/* + * Local functions... + */ + +static ppd_attr_t *ppd_add_attr(ppd_file_t *ppd, const char *name, + const char *spec, const char *text, + const char *value); +static ppd_choice_t *ppd_add_choice(ppd_option_t *option, const char *name); +static ppd_size_t *ppd_add_size(ppd_file_t *ppd, const char *name); +static int ppd_compare_attrs(ppd_attr_t *a, ppd_attr_t *b); +static int ppd_compare_choices(ppd_choice_t *a, ppd_choice_t *b); +static int ppd_compare_coptions(ppd_coption_t *a, + ppd_coption_t *b); +static int ppd_compare_options(ppd_option_t *a, ppd_option_t *b); +static int ppd_decode(char *string); +static void ppd_free_filters(ppd_file_t *ppd); +static void ppd_free_group(ppd_group_t *group); +static void ppd_free_option(ppd_option_t *option); +static ppd_coption_t *ppd_get_coption(ppd_file_t *ppd, const char *name); +static ppd_cparam_t *ppd_get_cparam(ppd_coption_t *opt, + const char *param, + const char *text); +static ppd_group_t *ppd_get_group(ppd_file_t *ppd, const char *name, + const char *text, _cups_globals_t *cg, + cups_encoding_t encoding); +static ppd_option_t *ppd_get_option(ppd_group_t *group, const char *name); +static int ppd_hash_option(ppd_option_t *option); +static int ppd_read(cups_file_t *fp, _ppd_line_t *line, + char *keyword, char *option, char *text, + char **string, int ignoreblank, + _cups_globals_t *cg); +static int ppd_update_filters(ppd_file_t *ppd, + _cups_globals_t *cg); + + +/* + * 'ppdClose()' - Free all memory used by the PPD file. + */ + +void +ppdClose(ppd_file_t *ppd) /* I - PPD file record */ +{ + int i; /* Looping var */ + ppd_emul_t *emul; /* Current emulation */ + ppd_group_t *group; /* Current group */ + char **font; /* Current font */ + ppd_attr_t **attr; /* Current attribute */ + ppd_coption_t *coption; /* Current custom option */ + ppd_cparam_t *cparam; /* Current custom parameter */ + + + /* + * Range check arguments... + */ + + if (!ppd) + return; + + /* + * Free all strings at the top level... + */ + + _cupsStrFree(ppd->lang_encoding); + _cupsStrFree(ppd->nickname); + if (ppd->patches) + free(ppd->patches); + _cupsStrFree(ppd->jcl_begin); + _cupsStrFree(ppd->jcl_end); + _cupsStrFree(ppd->jcl_ps); + + /* + * Free any emulations... + */ + + if (ppd->num_emulations > 0) + { + for (i = ppd->num_emulations, emul = ppd->emulations; i > 0; i --, emul ++) + { + _cupsStrFree(emul->start); + _cupsStrFree(emul->stop); + } + + ppd_free(ppd->emulations); + } + + /* + * Free any UI groups, subgroups, and options... + */ + + if (ppd->num_groups > 0) + { + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + ppd_free_group(group); + + ppd_free(ppd->groups); + } + + cupsArrayDelete(ppd->options); + cupsArrayDelete(ppd->marked); + + /* + * Free any page sizes... + */ + + if (ppd->num_sizes > 0) + ppd_free(ppd->sizes); + + /* + * Free any constraints... + */ + + if (ppd->num_consts > 0) + ppd_free(ppd->consts); + + /* + * Free any filters... + */ + + ppd_free_filters(ppd); + + /* + * Free any fonts... + */ + + if (ppd->num_fonts > 0) + { + for (i = ppd->num_fonts, font = ppd->fonts; i > 0; i --, font ++) + _cupsStrFree(*font); + + ppd_free(ppd->fonts); + } + + /* + * Free any profiles... + */ + + if (ppd->num_profiles > 0) + ppd_free(ppd->profiles); + + /* + * Free any attributes... + */ + + if (ppd->num_attrs > 0) + { + for (i = ppd->num_attrs, attr = ppd->attrs; i > 0; i --, attr ++) + { + _cupsStrFree((*attr)->value); + ppd_free(*attr); + } + + ppd_free(ppd->attrs); + } + + cupsArrayDelete(ppd->sorted_attrs); + + /* + * Free custom options... + */ + + for (coption = (ppd_coption_t *)cupsArrayFirst(ppd->coptions); + coption; + coption = (ppd_coption_t *)cupsArrayNext(ppd->coptions)) + { + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + switch (cparam->type) + { + case PPD_CUSTOM_PASSCODE : + case PPD_CUSTOM_PASSWORD : + case PPD_CUSTOM_STRING : + _cupsStrFree(cparam->current.custom_string); + break; + + default : + break; + } + + free(cparam); + } + + cupsArrayDelete(coption->params); + + free(coption); + } + + cupsArrayDelete(ppd->coptions); + + /* + * Free constraints... + */ + + if (ppd->cups_uiconstraints) + { + _ppd_cups_uiconsts_t *consts; /* Current constraints */ + + + for (consts = (_ppd_cups_uiconsts_t *)cupsArrayFirst(ppd->cups_uiconstraints); + consts; + consts = (_ppd_cups_uiconsts_t *)cupsArrayNext(ppd->cups_uiconstraints)) + { + free(consts->constraints); + free(consts); + } + + cupsArrayDelete(ppd->cups_uiconstraints); + } + + /* + * Free any PPD cache/mapping data... + */ + + if (ppd->cache) + _ppdCacheDestroy(ppd->cache); + + /* + * Free the whole record... + */ + + ppd_free(ppd); +} + + +/* + * 'ppdErrorString()' - Returns the text assocated with a status. + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +const char * /* O - Status string */ +ppdErrorString(ppd_status_t status) /* I - PPD status */ +{ + static const char * const messages[] =/* Status messages */ + { + _("OK"), + _("Unable to open PPD file"), + _("NULL PPD file pointer"), + _("Memory allocation error"), + _("Missing PPD-Adobe-4.x header"), + _("Missing value string"), + _("Internal error"), + _("Bad OpenGroup"), + _("OpenGroup without a CloseGroup first"), + _("Bad OpenUI/JCLOpenUI"), + _("OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"), + _("Bad OrderDependency"), + _("Bad UIConstraints"), + _("Missing asterisk in column 1"), + _("Line longer than the maximum allowed (255 characters)"), + _("Illegal control character"), + _("Illegal main keyword string"), + _("Illegal option keyword string"), + _("Illegal translation string"), + _("Illegal whitespace character"), + _("Bad custom parameter"), + _("Missing option keyword"), + _("Bad value string"), + _("Missing CloseGroup") + }; + + + if (status < PPD_OK || status >= PPD_MAX_STATUS) + return (_cupsLangString(cupsLangDefault(), _("Unknown"))); + else + return (_cupsLangString(cupsLangDefault(), messages[status])); +} + + +/* + * '_ppdGetEncoding()' - Get the CUPS encoding value for the given + * LanguageEncoding. + */ + +cups_encoding_t /* O - CUPS encoding value */ +_ppdGetEncoding(const char *name) /* I - LanguageEncoding string */ +{ + if (!_cups_strcasecmp(name, "ISOLatin1")) + return (CUPS_ISO8859_1); + else if (!_cups_strcasecmp(name, "ISOLatin2")) + return (CUPS_ISO8859_2); + else if (!_cups_strcasecmp(name, "ISOLatin5")) + return (CUPS_ISO8859_5); + else if (!_cups_strcasecmp(name, "JIS83-RKSJ")) + return (CUPS_JIS_X0213); + else if (!_cups_strcasecmp(name, "MacStandard")) + return (CUPS_MAC_ROMAN); + else if (!_cups_strcasecmp(name, "WindowsANSI")) + return (CUPS_WINDOWS_1252); + else + return (CUPS_UTF8); +} + + +/* + * 'ppdLastError()' - Return the status from the last ppdOpen*(). + * + * @since CUPS 1.1.19/Mac OS X 10.3@ + */ + +ppd_status_t /* O - Status code */ +ppdLastError(int *line) /* O - Line number */ +{ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + if (line) + *line = cg->ppd_line; + + return (cg->ppd_status); +} + + +/* + * 'ppdOpen()' - Read a PPD file into memory. + */ + +ppd_file_t * /* O - PPD file record */ +ppdOpen(FILE *fp) /* I - File to read from */ +{ + ppd_file_t *ppd; /* PPD file record */ + cups_file_t *cf; /* CUPS file */ + + + /* + * Reopen the stdio file as a CUPS file... + */ + + if ((cf = cupsFileOpenFd(fileno(fp), "r")) == NULL) + return (NULL); + + /* + * Load the PPD file using the newer API... + */ + + ppd = ppdOpen2(cf); + + /* + * Close the CUPS file and return the PPD... + */ + + cupsFileClose(cf); + + return (ppd); +} + + +/* + * 'ppdOpen2()' - Read a PPD file into memory. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ +ppdOpen2(cups_file_t *fp) /* I - File to read from */ +{ + int i, j, k; /* Looping vars */ + int count; /* Temporary count */ + _ppd_line_t line; /* Line buffer */ + ppd_file_t *ppd; /* PPD file record */ + ppd_group_t *group, /* Current group */ + *subgroup; /* Current sub-group */ + ppd_option_t *option; /* Current option */ + ppd_choice_t *choice; /* Current choice */ + ppd_const_t *constraint; /* Current constraint */ + ppd_size_t *size; /* Current page size */ + int mask; /* Line data mask */ + char keyword[PPD_MAX_NAME], + /* Keyword from file */ + name[PPD_MAX_NAME], + /* Option from file */ + text[PPD_MAX_LINE], + /* Human-readable text from file */ + *string, /* Code/text from file */ + *sptr, /* Pointer into string */ + *nameptr, /* Pointer into name */ + *temp, /* Temporary string pointer */ + **tempfonts; /* Temporary fonts pointer */ + float order; /* Order dependency number */ + ppd_section_t section; /* Order dependency section */ + ppd_profile_t *profile; /* Pointer to color profile */ + char **filter; /* Pointer to filter */ + struct lconv *loc; /* Locale data */ + int ui_keyword; /* Is this line a UI keyword? */ + cups_encoding_t encoding; /* Encoding of PPD file */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + char custom_name[PPD_MAX_NAME]; + /* CustomFoo attribute name */ + ppd_attr_t *custom_attr; /* CustomFoo attribute */ + static const char * const ui_keywords[] = + { +#ifdef CUPS_USE_FULL_UI_KEYWORDS_LIST + /* + * Adobe defines some 41 keywords as "UI", meaning that they are + * user interface elements and that they should be treated as such + * even if the PPD creator doesn't use Open/CloseUI around them. + * + * Since this can cause previously invisible options to appear and + * confuse users, the default is to only treat the PageSize and + * PageRegion keywords this way. + */ + /* Boolean keywords */ + "BlackSubstitution", + "Booklet", + "Collate", + "ManualFeed", + "MirrorPrint", + "NegativePrint", + "Sorter", + "TraySwitch", + + /* PickOne keywords */ + "AdvanceMedia", + "BindColor", + "BindEdge", + "BindType", + "BindWhen", + "BitsPerPixel", + "ColorModel", + "CutMedia", + "Duplex", + "FoldType", + "FoldWhen", + "InputSlot", + "JCLFrameBufferSize", + "JCLResolution", + "Jog", + "MediaColor", + "MediaType", + "MediaWeight", + "OutputBin", + "OutputMode", + "OutputOrder", + "PageRegion", + "PageSize", + "Resolution", + "Separations", + "Signature", + "Slipsheet", + "Smoothing", + "StapleLocation", + "StapleOrientation", + "StapleWhen", + "StapleX", + "StapleY" +#else /* !CUPS_USE_FULL_UI_KEYWORDS_LIST */ + "PageRegion", + "PageSize" +#endif /* CUPS_USE_FULL_UI_KEYWORDS_LIST */ + }; + + + DEBUG_printf(("ppdOpen2(fp=%p)", fp)); + + /* + * Default to "OK" status... + */ + + cg->ppd_status = PPD_OK; + cg->ppd_line = 0; + + /* + * Range check input... + */ + + if (fp == NULL) + { + cg->ppd_status = PPD_NULL_FILE; + return (NULL); + } + + /* + * Grab the first line and make sure it reads '*PPD-Adobe: "major.minor"'... + */ + + line.buffer = NULL; + line.bufsize = 0; + + mask = ppd_read(fp, &line, keyword, name, text, &string, 0, cg); + + DEBUG_printf(("2ppdOpen2: mask=%x, keyword=\"%s\"...", mask, keyword)); + + if (mask == 0 || + strcmp(keyword, "PPD-Adobe") || + string == NULL || string[0] != '4') + { + /* + * Either this is not a PPD file, or it is not a 4.x PPD file. + */ + + if (cg->ppd_status == PPD_OK) + cg->ppd_status = PPD_MISSING_PPDADOBE4; + + _cupsStrFree(string); + ppd_free(line.buffer); + + return (NULL); + } + + DEBUG_printf(("2ppdOpen2: keyword=%s, string=%p", keyword, string)); + + _cupsStrFree(string); + + /* + * Allocate memory for the PPD file record... + */ + + if ((ppd = calloc(1, sizeof(ppd_file_t))) == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + _cupsStrFree(string); + ppd_free(line.buffer); + + return (NULL); + } + + ppd->language_level = 2; + ppd->color_device = 0; + ppd->colorspace = PPD_CS_N; + ppd->landscape = -90; + ppd->coptions = cupsArrayNew((cups_array_func_t)ppd_compare_coptions, + NULL); + + /* + * Read lines from the PPD file and add them to the file record... + */ + + group = NULL; + subgroup = NULL; + option = NULL; + choice = NULL; + ui_keyword = 0; + encoding = CUPS_ISO8859_1; + loc = localeconv(); + + while ((mask = ppd_read(fp, &line, keyword, name, text, &string, 1, cg)) != 0) + { + DEBUG_printf(("2ppdOpen2: mask=%x, keyword=\"%s\", name=\"%s\", " + "text=\"%s\", string=%d chars...", mask, keyword, name, text, + string ? (int)strlen(string) : 0)); + + if (strncmp(keyword, "Default", 7) && !string && + cg->ppd_conform != PPD_CONFORM_RELAXED) + { + /* + * Need a string value! + */ + + cg->ppd_status = PPD_MISSING_VALUE; + + goto error; + } + else if (!string) + continue; + + /* + * Certain main keywords (as defined by the PPD spec) may be used + * without the usual OpenUI/CloseUI stuff. Presumably this is just + * so that Adobe wouldn't completely break compatibility with PPD + * files prior to v4.0 of the spec, but it is hopelessly + * inconsistent... Catch these main keywords and automatically + * create the corresponding option, as needed... + */ + + if (ui_keyword) + { + /* + * Previous line was a UI keyword... + */ + + option = NULL; + ui_keyword = 0; + } + + if (option == NULL && + (mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) == + (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) + { + for (i = 0; i < (int)(sizeof(ui_keywords) / sizeof(ui_keywords[0])); i ++) + if (!strcmp(keyword, ui_keywords[i])) + break; + + if (i < (int)(sizeof(ui_keywords) / sizeof(ui_keywords[0]))) + { + /* + * Create the option in the appropriate group... + */ + + ui_keyword = 1; + + DEBUG_printf(("2ppdOpen2: FOUND ADOBE UI KEYWORD %s WITHOUT OPENUI!", + keyword)); + + if (!group) + { + if ((group = ppd_get_group(ppd, "General", _("General"), cg, + encoding)) == NULL) + goto error; + + DEBUG_printf(("2ppdOpen2: Adding to group %s...", group->text)); + option = ppd_get_option(group, keyword); + group = NULL; + } + else + option = ppd_get_option(group, keyword); + + if (option == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + /* + * Now fill in the initial information for the option... + */ + + if (!strncmp(keyword, "JCL", 3)) + option->section = PPD_ORDER_JCL; + else + option->section = PPD_ORDER_ANY; + + option->order = 10.0f; + + if (i < 8) + option->ui = PPD_UI_BOOLEAN; + else + option->ui = PPD_UI_PICKONE; + + for (j = 0; j < ppd->num_attrs; j ++) + if (!strncmp(ppd->attrs[j]->name, "Default", 7) && + !strcmp(ppd->attrs[j]->name + 7, keyword) && + ppd->attrs[j]->value) + { + DEBUG_printf(("2ppdOpen2: Setting Default%s to %s via attribute...", + option->keyword, ppd->attrs[j]->value)); + strlcpy(option->defchoice, ppd->attrs[j]->value, + sizeof(option->defchoice)); + break; + } + + if (!strcmp(keyword, "PageSize")) + strlcpy(option->text, _("Media Size"), sizeof(option->text)); + else if (!strcmp(keyword, "MediaType")) + strlcpy(option->text, _("Media Type"), sizeof(option->text)); + else if (!strcmp(keyword, "InputSlot")) + strlcpy(option->text, _("Media Source"), sizeof(option->text)); + else if (!strcmp(keyword, "ColorModel")) + strlcpy(option->text, _("Output Mode"), sizeof(option->text)); + else if (!strcmp(keyword, "Resolution")) + strlcpy(option->text, _("Resolution"), sizeof(option->text)); + else + strlcpy(option->text, keyword, sizeof(option->text)); + } + } + + if (!strcmp(keyword, "LanguageLevel")) + ppd->language_level = atoi(string); + else if (!strcmp(keyword, "LanguageEncoding")) + { + /* + * Say all PPD files are UTF-8, since we convert to UTF-8... + */ + + ppd->lang_encoding = _cupsStrAlloc("UTF-8"); + encoding = _ppdGetEncoding(string); + } + else if (!strcmp(keyword, "LanguageVersion")) + ppd->lang_version = string; + else if (!strcmp(keyword, "Manufacturer")) + ppd->manufacturer = string; + else if (!strcmp(keyword, "ModelName")) + ppd->modelname = string; + else if (!strcmp(keyword, "Protocols")) + ppd->protocols = string; + else if (!strcmp(keyword, "PCFileName")) + ppd->pcfilename = string; + else if (!strcmp(keyword, "NickName")) + { + if (encoding != CUPS_UTF8) + { + cups_utf8_t utf8[256]; /* UTF-8 version of NickName */ + + + cupsCharsetToUTF8(utf8, string, sizeof(utf8), encoding); + ppd->nickname = _cupsStrAlloc((char *)utf8); + } + else + ppd->nickname = _cupsStrAlloc(string); + } + else if (!strcmp(keyword, "Product")) + ppd->product = string; + else if (!strcmp(keyword, "ShortNickName")) + ppd->shortnickname = string; + else if (!strcmp(keyword, "TTRasterizer")) + ppd->ttrasterizer = string; + else if (!strcmp(keyword, "JCLBegin")) + { + ppd->jcl_begin = _cupsStrAlloc(string); + ppd_decode(ppd->jcl_begin); /* Decode quoted string */ + } + else if (!strcmp(keyword, "JCLEnd")) + { + ppd->jcl_end = _cupsStrAlloc(string); + ppd_decode(ppd->jcl_end); /* Decode quoted string */ + } + else if (!strcmp(keyword, "JCLToPSInterpreter")) + { + ppd->jcl_ps = _cupsStrAlloc(string); + ppd_decode(ppd->jcl_ps); /* Decode quoted string */ + } + else if (!strcmp(keyword, "AccurateScreensSupport")) + ppd->accurate_screens = !strcmp(string, "True"); + else if (!strcmp(keyword, "ColorDevice")) + ppd->color_device = !strcmp(string, "True"); + else if (!strcmp(keyword, "ContoneOnly")) + ppd->contone_only = !strcmp(string, "True"); + else if (!strcmp(keyword, "cupsFlipDuplex")) + ppd->flip_duplex = !strcmp(string, "True"); + else if (!strcmp(keyword, "cupsManualCopies")) + ppd->manual_copies = !strcmp(string, "True"); + else if (!strcmp(keyword, "cupsModelNumber")) + ppd->model_number = atoi(string); + else if (!strcmp(keyword, "cupsColorProfile")) + { + if (ppd->num_profiles == 0) + profile = malloc(sizeof(ppd_profile_t)); + else + profile = realloc(ppd->profiles, sizeof(ppd_profile_t) * + (ppd->num_profiles + 1)); + + if (!profile) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + ppd->profiles = profile; + profile += ppd->num_profiles; + ppd->num_profiles ++; + + memset(profile, 0, sizeof(ppd_profile_t)); + strlcpy(profile->resolution, name, sizeof(profile->resolution)); + strlcpy(profile->media_type, text, sizeof(profile->media_type)); + + profile->density = (float)_cupsStrScand(string, &sptr, loc); + profile->gamma = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[0][0] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[0][1] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[0][2] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[1][0] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[1][1] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[1][2] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[2][0] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[2][1] = (float)_cupsStrScand(sptr, &sptr, loc); + profile->matrix[2][2] = (float)_cupsStrScand(sptr, &sptr, loc); + } + else if (!strcmp(keyword, "cupsFilter")) + { + if (ppd->num_filters == 0) + filter = malloc(sizeof(char *)); + else + filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1)); + + if (filter == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + ppd->filters = filter; + filter += ppd->num_filters; + ppd->num_filters ++; + + /* + * Retain a copy of the filter string... + */ + + *filter = _cupsStrRetain(string); + } + else if (!strcmp(keyword, "Throughput")) + ppd->throughput = atoi(string); + else if (!strcmp(keyword, "Font")) + { + /* + * Add this font to the list of available fonts... + */ + + if (ppd->num_fonts == 0) + tempfonts = (char **)malloc(sizeof(char *)); + else + tempfonts = (char **)realloc(ppd->fonts, + sizeof(char *) * (ppd->num_fonts + 1)); + + if (tempfonts == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + ppd->fonts = tempfonts; + ppd->fonts[ppd->num_fonts] = _cupsStrAlloc(name); + ppd->num_fonts ++; + } + else if (!strncmp(keyword, "ParamCustom", 11)) + { + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + int corder; /* Order number */ + char ctype[33], /* Data type */ + cminimum[65], /* Minimum value */ + cmaximum[65]; /* Maximum value */ + + + /* + * Get the custom option and parameter... + */ + + if ((coption = ppd_get_coption(ppd, keyword + 11)) == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + if ((cparam = ppd_get_cparam(coption, name, text)) == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + /* + * Get the parameter data... + */ + + if (!string || + sscanf(string, "%d%32s%64s%64s", &corder, ctype, cminimum, + cmaximum) != 4) + { + cg->ppd_status = PPD_BAD_CUSTOM_PARAM; + + goto error; + } + + cparam->order = corder; + + if (!strcmp(ctype, "curve")) + { + cparam->type = PPD_CUSTOM_CURVE; + cparam->minimum.custom_curve = (float)_cupsStrScand(cminimum, NULL, loc); + cparam->maximum.custom_curve = (float)_cupsStrScand(cmaximum, NULL, loc); + } + else if (!strcmp(ctype, "int")) + { + cparam->type = PPD_CUSTOM_INT; + cparam->minimum.custom_int = atoi(cminimum); + cparam->maximum.custom_int = atoi(cmaximum); + } + else if (!strcmp(ctype, "invcurve")) + { + cparam->type = PPD_CUSTOM_INVCURVE; + cparam->minimum.custom_invcurve = (float)_cupsStrScand(cminimum, NULL, loc); + cparam->maximum.custom_invcurve = (float)_cupsStrScand(cmaximum, NULL, loc); + } + else if (!strcmp(ctype, "passcode")) + { + cparam->type = PPD_CUSTOM_PASSCODE; + cparam->minimum.custom_passcode = atoi(cminimum); + cparam->maximum.custom_passcode = atoi(cmaximum); + } + else if (!strcmp(ctype, "password")) + { + cparam->type = PPD_CUSTOM_PASSWORD; + cparam->minimum.custom_password = atoi(cminimum); + cparam->maximum.custom_password = atoi(cmaximum); + } + else if (!strcmp(ctype, "points")) + { + cparam->type = PPD_CUSTOM_POINTS; + cparam->minimum.custom_points = (float)_cupsStrScand(cminimum, NULL, loc); + cparam->maximum.custom_points = (float)_cupsStrScand(cmaximum, NULL, loc); + } + else if (!strcmp(ctype, "real")) + { + cparam->type = PPD_CUSTOM_REAL; + cparam->minimum.custom_real = (float)_cupsStrScand(cminimum, NULL, loc); + cparam->maximum.custom_real = (float)_cupsStrScand(cmaximum, NULL, loc); + } + else if (!strcmp(ctype, "string")) + { + cparam->type = PPD_CUSTOM_STRING; + cparam->minimum.custom_string = atoi(cminimum); + cparam->maximum.custom_string = atoi(cmaximum); + } + else + { + cg->ppd_status = PPD_BAD_CUSTOM_PARAM; + + goto error; + } + + /* + * Now special-case for CustomPageSize... + */ + + if (!strcmp(coption->keyword, "PageSize")) + { + if (!strcmp(name, "Width")) + { + ppd->custom_min[0] = cparam->minimum.custom_points; + ppd->custom_max[0] = cparam->maximum.custom_points; + } + else if (!strcmp(name, "Height")) + { + ppd->custom_min[1] = cparam->minimum.custom_points; + ppd->custom_max[1] = cparam->maximum.custom_points; + } + } + } + else if (!strcmp(keyword, "HWMargins")) + { + for (i = 0, sptr = string; i < 4; i ++) + ppd->custom_margins[i] = (float)_cupsStrScand(sptr, &sptr, loc); + } + else if (!strncmp(keyword, "Custom", 6) && !strcmp(name, "True") && !option) + { + ppd_option_t *custom_option; /* Custom option */ + + DEBUG_puts("2ppdOpen2: Processing Custom option..."); + + /* + * Get the option and custom option... + */ + + if (!ppd_get_coption(ppd, keyword + 6)) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + if (option && !_cups_strcasecmp(option->keyword, keyword + 6)) + custom_option = option; + else + custom_option = ppdFindOption(ppd, keyword + 6); + + if (custom_option) + { + /* + * Add the "custom" option... + */ + + if ((choice = ppdFindChoice(custom_option, "Custom")) == NULL) + if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL) + { + DEBUG_puts("1ppdOpen2: Unable to add Custom choice!"); + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + strlcpy(choice->text, text[0] ? text : _("Custom"), + sizeof(choice->text)); + + choice->code = _cupsStrAlloc(string); + + if (custom_option->section == PPD_ORDER_JCL) + ppd_decode(choice->code); + } + + /* + * Now process custom page sizes specially... + */ + + if (!strcmp(keyword, "CustomPageSize")) + { + /* + * Add a "Custom" page size entry... + */ + + ppd->variable_sizes = 1; + + ppd_add_size(ppd, "Custom"); + + if (option && !_cups_strcasecmp(option->keyword, "PageRegion")) + custom_option = option; + else + custom_option = ppdFindOption(ppd, "PageRegion"); + + if (custom_option) + { + if ((choice = ppdFindChoice(custom_option, "Custom")) == NULL) + if ((choice = ppd_add_choice(custom_option, "Custom")) == NULL) + { + DEBUG_puts("1ppdOpen2: Unable to add Custom choice!"); + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + strlcpy(choice->text, text[0] ? text : _("Custom"), + sizeof(choice->text)); + } + } + } + else if (!strcmp(keyword, "LandscapeOrientation")) + { + if (!strcmp(string, "Minus90")) + ppd->landscape = -90; + else if (!strcmp(string, "Plus90")) + ppd->landscape = 90; + } + else if (!strcmp(keyword, "Emulators") && string) + { + for (count = 1, sptr = string; sptr != NULL;) + if ((sptr = strchr(sptr, ' ')) != NULL) + { + count ++; + while (*sptr == ' ') + sptr ++; + } + + ppd->num_emulations = count; + if ((ppd->emulations = calloc(count, sizeof(ppd_emul_t))) == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + for (i = 0, sptr = string; i < count; i ++) + { + for (nameptr = ppd->emulations[i].name; + *sptr != '\0' && *sptr != ' '; + sptr ++) + if (nameptr < (ppd->emulations[i].name + sizeof(ppd->emulations[i].name) - 1)) + *nameptr++ = *sptr; + + *nameptr = '\0'; + + while (*sptr == ' ') + sptr ++; + } + } + else if (!strncmp(keyword, "StartEmulator_", 14)) + { + ppd_decode(string); + + for (i = 0; i < ppd->num_emulations; i ++) + if (!strcmp(keyword + 14, ppd->emulations[i].name)) + { + ppd->emulations[i].start = string; + string = NULL; + } + } + else if (!strncmp(keyword, "StopEmulator_", 13)) + { + ppd_decode(string); + + for (i = 0; i < ppd->num_emulations; i ++) + if (!strcmp(keyword + 13, ppd->emulations[i].name)) + { + ppd->emulations[i].stop = string; + string = NULL; + } + } + else if (!strcmp(keyword, "JobPatchFile")) + { + /* + * CUPS STR #3421: Check for "*JobPatchFile: int: string" + */ + + if (isdigit(*string & 255)) + { + for (sptr = string + 1; isdigit(*sptr & 255); sptr ++); + + if (*sptr == ':') + { + /* + * Found "*JobPatchFile: int: string"... + */ + + cg->ppd_status = PPD_BAD_VALUE; + + goto error; + } + } + + if (!name[0] && cg->ppd_conform == PPD_CONFORM_STRICT) + { + /* + * Found "*JobPatchFile: string"... + */ + + cg->ppd_status = PPD_MISSING_OPTION_KEYWORD; + + goto error; + } + + if (ppd->patches == NULL) + ppd->patches = strdup(string); + else + { + temp = realloc(ppd->patches, strlen(ppd->patches) + + strlen(string) + 1); + if (temp == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + ppd->patches = temp; + + strcpy(ppd->patches + strlen(ppd->patches), string); + } + } + else if (!strcmp(keyword, "OpenUI")) + { + /* + * Don't allow nesting of options... + */ + + if (option && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_NESTED_OPEN_UI; + + goto error; + } + + /* + * Add an option record to the current sub-group, group, or file... + */ + + DEBUG_printf(("2ppdOpen2: name=\"%s\" (%d)", name, (int)strlen(name))); + + if (name[0] == '*') + _cups_strcpy(name, name + 1); /* Eliminate leading asterisk */ + + for (i = (int)strlen(name) - 1; i > 0 && _cups_isspace(name[i]); i --) + name[i] = '\0'; /* Eliminate trailing spaces */ + + DEBUG_printf(("2ppdOpen2: OpenUI of %s in group %s...", name, + group ? group->text : "(null)")); + + if (subgroup != NULL) + option = ppd_get_option(subgroup, name); + else if (group == NULL) + { + if ((group = ppd_get_group(ppd, "General", _("General"), cg, + encoding)) == NULL) + goto error; + + DEBUG_printf(("2ppdOpen2: Adding to group %s...", group->text)); + option = ppd_get_option(group, name); + group = NULL; + } + else + option = ppd_get_option(group, name); + + if (option == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + /* + * Now fill in the initial information for the option... + */ + + if (string && !strcmp(string, "PickMany")) + option->ui = PPD_UI_PICKMANY; + else if (string && !strcmp(string, "Boolean")) + option->ui = PPD_UI_BOOLEAN; + else if (string && !strcmp(string, "PickOne")) + option->ui = PPD_UI_PICKONE; + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_OPEN_UI; + + goto error; + } + else + option->ui = PPD_UI_PICKONE; + + for (j = 0; j < ppd->num_attrs; j ++) + if (!strncmp(ppd->attrs[j]->name, "Default", 7) && + !strcmp(ppd->attrs[j]->name + 7, name) && + ppd->attrs[j]->value) + { + DEBUG_printf(("2ppdOpen2: Setting Default%s to %s via attribute...", + option->keyword, ppd->attrs[j]->value)); + strlcpy(option->defchoice, ppd->attrs[j]->value, + sizeof(option->defchoice)); + break; + } + + if (text[0]) + cupsCharsetToUTF8((cups_utf8_t *)option->text, text, + sizeof(option->text), encoding); + else + { + if (!strcmp(name, "PageSize")) + strlcpy(option->text, _("Media Size"), sizeof(option->text)); + else if (!strcmp(name, "MediaType")) + strlcpy(option->text, _("Media Type"), sizeof(option->text)); + else if (!strcmp(name, "InputSlot")) + strlcpy(option->text, _("Media Source"), sizeof(option->text)); + else if (!strcmp(name, "ColorModel")) + strlcpy(option->text, _("Output Mode"), sizeof(option->text)); + else if (!strcmp(name, "Resolution")) + strlcpy(option->text, _("Resolution"), sizeof(option->text)); + else + strlcpy(option->text, name, sizeof(option->text)); + } + + option->section = PPD_ORDER_ANY; + + _cupsStrFree(string); + string = NULL; + + /* + * Add a custom option choice if we have already seen a CustomFoo + * attribute... + */ + + if (!_cups_strcasecmp(name, "PageRegion")) + strcpy(custom_name, "CustomPageSize"); + else + snprintf(custom_name, sizeof(custom_name), "Custom%s", name); + + if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL) + { + if ((choice = ppdFindChoice(option, "Custom")) == NULL) + if ((choice = ppd_add_choice(option, "Custom")) == NULL) + { + DEBUG_puts("1ppdOpen2: Unable to add Custom choice!"); + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + strlcpy(choice->text, + custom_attr->text[0] ? custom_attr->text : _("Custom"), + sizeof(choice->text)); + choice->code = _cupsStrRetain(custom_attr->value); + } + } + else if (!strcmp(keyword, "JCLOpenUI")) + { + /* + * Don't allow nesting of options... + */ + + if (option && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_NESTED_OPEN_UI; + + goto error; + } + + /* + * Find the JCL group, and add if needed... + */ + + group = ppd_get_group(ppd, "JCL", _("JCL"), cg, encoding); + + if (group == NULL) + goto error; + + /* + * Add an option record to the current JCLs... + */ + + if (name[0] == '*') + _cups_strcpy(name, name + 1); + + option = ppd_get_option(group, name); + + if (option == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + /* + * Now fill in the initial information for the option... + */ + + if (string && !strcmp(string, "PickMany")) + option->ui = PPD_UI_PICKMANY; + else if (string && !strcmp(string, "Boolean")) + option->ui = PPD_UI_BOOLEAN; + else if (string && !strcmp(string, "PickOne")) + option->ui = PPD_UI_PICKONE; + else + { + cg->ppd_status = PPD_BAD_OPEN_UI; + + goto error; + } + + for (j = 0; j < ppd->num_attrs; j ++) + if (!strncmp(ppd->attrs[j]->name, "Default", 7) && + !strcmp(ppd->attrs[j]->name + 7, name) && + ppd->attrs[j]->value) + { + DEBUG_printf(("2ppdOpen2: Setting Default%s to %s via attribute...", + option->keyword, ppd->attrs[j]->value)); + strlcpy(option->defchoice, ppd->attrs[j]->value, + sizeof(option->defchoice)); + break; + } + + if (text[0]) + cupsCharsetToUTF8((cups_utf8_t *)option->text, text, + sizeof(option->text), encoding); + else + strlcpy(option->text, name, sizeof(option->text)); + + option->section = PPD_ORDER_JCL; + group = NULL; + + _cupsStrFree(string); + string = NULL; + + /* + * Add a custom option choice if we have already seen a CustomFoo + * attribute... + */ + + snprintf(custom_name, sizeof(custom_name), "Custom%s", name); + + if ((custom_attr = ppdFindAttr(ppd, custom_name, "True")) != NULL) + { + if ((choice = ppd_add_choice(option, "Custom")) == NULL) + { + DEBUG_puts("1ppdOpen2: Unable to add Custom choice!"); + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + strlcpy(choice->text, + custom_attr->text[0] ? custom_attr->text : _("Custom"), + sizeof(choice->text)); + choice->code = _cupsStrRetain(custom_attr->value); + } + } + else if (!strcmp(keyword, "CloseUI") || !strcmp(keyword, "JCLCloseUI")) + { + option = NULL; + + _cupsStrFree(string); + string = NULL; + } + else if (!strcmp(keyword, "OpenGroup")) + { + /* + * Open a new group... + */ + + if (group != NULL) + { + cg->ppd_status = PPD_NESTED_OPEN_GROUP; + + goto error; + } + + if (!string) + { + cg->ppd_status = PPD_BAD_OPEN_GROUP; + + goto error; + } + + /* + * Separate the group name from the text (name/text)... + */ + + if ((sptr = strchr(string, '/')) != NULL) + *sptr++ = '\0'; + else + sptr = string; + + /* + * Fix up the text... + */ + + ppd_decode(sptr); + + /* + * Find/add the group... + */ + + group = ppd_get_group(ppd, string, sptr, cg, encoding); + + if (group == NULL) + goto error; + + _cupsStrFree(string); + string = NULL; + } + else if (!strcmp(keyword, "CloseGroup")) + { + group = NULL; + + _cupsStrFree(string); + string = NULL; + } + else if (!strcmp(keyword, "OrderDependency")) + { + order = (float)_cupsStrScand(string, &sptr, loc); + + if (!sptr || sscanf(sptr, "%40s%40s", name, keyword) != 2) + { + cg->ppd_status = PPD_BAD_ORDER_DEPENDENCY; + + goto error; + } + + if (keyword[0] == '*') + _cups_strcpy(keyword, keyword + 1); + + if (!strcmp(name, "ExitServer")) + section = PPD_ORDER_EXIT; + else if (!strcmp(name, "Prolog")) + section = PPD_ORDER_PROLOG; + else if (!strcmp(name, "DocumentSetup")) + section = PPD_ORDER_DOCUMENT; + else if (!strcmp(name, "PageSetup")) + section = PPD_ORDER_PAGE; + else if (!strcmp(name, "JCLSetup")) + section = PPD_ORDER_JCL; + else + section = PPD_ORDER_ANY; + + if (option == NULL) + { + ppd_group_t *gtemp; + + + /* + * Only valid for Non-UI options... + */ + + for (i = ppd->num_groups, gtemp = ppd->groups; i > 0; i --, gtemp ++) + if (gtemp->text[0] == '\0') + break; + + if (i > 0) + for (i = 0; i < gtemp->num_options; i ++) + if (!strcmp(keyword, gtemp->options[i].keyword)) + { + gtemp->options[i].section = section; + gtemp->options[i].order = order; + break; + } + } + else + { + option->section = section; + option->order = order; + } + + _cupsStrFree(string); + string = NULL; + } + else if (!strncmp(keyword, "Default", 7)) + { + if (string == NULL) + continue; + + /* + * Drop UI text, if any, from value... + */ + + if (strchr(string, '/') != NULL) + *strchr(string, '/') = '\0'; + + /* + * Assign the default value as appropriate... + */ + + if (!strcmp(keyword, "DefaultColorSpace")) + { + /* + * Set default colorspace... + */ + + if (!strcmp(string, "CMY")) + ppd->colorspace = PPD_CS_CMY; + else if (!strcmp(string, "CMYK")) + ppd->colorspace = PPD_CS_CMYK; + else if (!strcmp(string, "RGB")) + ppd->colorspace = PPD_CS_RGB; + else if (!strcmp(string, "RGBK")) + ppd->colorspace = PPD_CS_RGBK; + else if (!strcmp(string, "N")) + ppd->colorspace = PPD_CS_N; + else + ppd->colorspace = PPD_CS_GRAY; + } + else if (option && !strcmp(keyword + 7, option->keyword)) + { + /* + * Set the default as part of the current option... + */ + + DEBUG_printf(("2ppdOpen2: Setting %s to %s...", keyword, string)); + + strlcpy(option->defchoice, string, sizeof(option->defchoice)); + + DEBUG_printf(("2ppdOpen2: %s is now %s...", keyword, option->defchoice)); + } + else + { + /* + * Lookup option and set if it has been defined... + */ + + ppd_option_t *toption; /* Temporary option */ + + + if ((toption = ppdFindOption(ppd, keyword + 7)) != NULL) + { + DEBUG_printf(("2ppdOpen2: Setting %s to %s...", keyword, string)); + strlcpy(toption->defchoice, string, sizeof(toption->defchoice)); + } + } + } + else if (!strcmp(keyword, "UIConstraints") || + !strcmp(keyword, "NonUIConstraints")) + { + if (!string) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (ppd->num_consts == 0) + constraint = calloc(2, sizeof(ppd_const_t)); + else + constraint = realloc(ppd->consts, + (ppd->num_consts + 2) * sizeof(ppd_const_t)); + + if (constraint == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + ppd->consts = constraint; + constraint += ppd->num_consts; + ppd->num_consts ++; + + switch (sscanf(string, "%40s%40s%40s%40s", constraint->option1, + constraint->choice1, constraint->option2, + constraint->choice2)) + { + case 0 : /* Error */ + case 1 : /* Error */ + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + + case 2 : /* Two options... */ + /* + * Check for broken constraints like "* Option"... + */ + + if (cg->ppd_conform == PPD_CONFORM_STRICT && + (!strcmp(constraint->option1, "*") || + !strcmp(constraint->choice1, "*"))) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + /* + * The following strcpy's are safe, as optionN and + * choiceN are all the same size (size defined by PPD spec...) + */ + + if (constraint->option1[0] == '*') + _cups_strcpy(constraint->option1, constraint->option1 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (constraint->choice1[0] == '*') + _cups_strcpy(constraint->option2, constraint->choice1 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + constraint->choice1[0] = '\0'; + constraint->choice2[0] = '\0'; + break; + + case 3 : /* Two options, one choice... */ + /* + * Check for broken constraints like "* Option"... + */ + + if (cg->ppd_conform == PPD_CONFORM_STRICT && + (!strcmp(constraint->option1, "*") || + !strcmp(constraint->choice1, "*") || + !strcmp(constraint->option2, "*"))) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + /* + * The following _cups_strcpy's are safe, as optionN and + * choiceN are all the same size (size defined by PPD spec...) + */ + + if (constraint->option1[0] == '*') + _cups_strcpy(constraint->option1, constraint->option1 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (constraint->choice1[0] == '*') + { + if (cg->ppd_conform == PPD_CONFORM_STRICT && + constraint->option2[0] == '*') + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + _cups_strcpy(constraint->choice2, constraint->option2); + _cups_strcpy(constraint->option2, constraint->choice1 + 1); + constraint->choice1[0] = '\0'; + } + else + { + if (constraint->option2[0] == '*') + _cups_strcpy(constraint->option2, constraint->option2 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + constraint->choice2[0] = '\0'; + } + break; + + case 4 : /* Two options, two choices... */ + /* + * Check for broken constraints like "* Option"... + */ + + if (cg->ppd_conform == PPD_CONFORM_STRICT && + (!strcmp(constraint->option1, "*") || + !strcmp(constraint->choice1, "*") || + !strcmp(constraint->option2, "*") || + !strcmp(constraint->choice2, "*"))) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (constraint->option1[0] == '*') + _cups_strcpy(constraint->option1, constraint->option1 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (cg->ppd_conform == PPD_CONFORM_STRICT && + constraint->choice1[0] == '*') + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (constraint->option2[0] == '*') + _cups_strcpy(constraint->option2, constraint->option2 + 1); + else if (cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + + if (cg->ppd_conform == PPD_CONFORM_STRICT && + constraint->choice2[0] == '*') + { + cg->ppd_status = PPD_BAD_UI_CONSTRAINTS; + goto error; + } + break; + } + + /* + * Don't add this one as an attribute... + */ + + _cupsStrFree(string); + string = NULL; + } + else if (!strcmp(keyword, "PaperDimension")) + { + if ((size = ppdPageSize(ppd, name)) == NULL) + size = ppd_add_size(ppd, name); + + if (size == NULL) + { + /* + * Unable to add or find size! + */ + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + size->width = (float)_cupsStrScand(string, &sptr, loc); + size->length = (float)_cupsStrScand(sptr, NULL, loc); + + _cupsStrFree(string); + string = NULL; + } + else if (!strcmp(keyword, "ImageableArea")) + { + if ((size = ppdPageSize(ppd, name)) == NULL) + size = ppd_add_size(ppd, name); + + if (size == NULL) + { + /* + * Unable to add or find size! + */ + + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + size->left = (float)_cupsStrScand(string, &sptr, loc); + size->bottom = (float)_cupsStrScand(sptr, &sptr, loc); + size->right = (float)_cupsStrScand(sptr, &sptr, loc); + size->top = (float)_cupsStrScand(sptr, NULL, loc); + + _cupsStrFree(string); + string = NULL; + } + else if (option != NULL && + (mask & (PPD_KEYWORD | PPD_OPTION | PPD_STRING)) == + (PPD_KEYWORD | PPD_OPTION | PPD_STRING) && + !strcmp(keyword, option->keyword)) + { + DEBUG_printf(("2ppdOpen2: group=%p, subgroup=%p", group, subgroup)); + + if (!strcmp(keyword, "PageSize")) + { + /* + * Add a page size... + */ + + if (ppdPageSize(ppd, name) == NULL) + ppd_add_size(ppd, name); + } + + /* + * Add the option choice... + */ + + if ((choice = ppd_add_choice(option, name)) == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + goto error; + } + + if (text[0]) + cupsCharsetToUTF8((cups_utf8_t *)choice->text, text, + sizeof(choice->text), encoding); + else if (!strcmp(name, "True")) + strcpy(choice->text, _("Yes")); + else if (!strcmp(name, "False")) + strcpy(choice->text, _("No")); + else + strlcpy(choice->text, name, sizeof(choice->text)); + + if (option->section == PPD_ORDER_JCL) + ppd_decode(string); /* Decode quoted string */ + + choice->code = string; + string = NULL; /* Don't add as an attribute below */ + } + + /* + * Add remaining lines with keywords and string values as attributes... + */ + + if (string && + (mask & (PPD_KEYWORD | PPD_STRING)) == (PPD_KEYWORD | PPD_STRING)) + ppd_add_attr(ppd, keyword, name, text, string); + else + _cupsStrFree(string); + } + + /* + * Check for a missing CloseGroup... + */ + + if (group && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_MISSING_CLOSE_GROUP; + goto error; + } + + ppd_free(line.buffer); + + /* + * Reset language preferences... + */ + +#ifdef DEBUG + if (!cupsFileEOF(fp)) + DEBUG_printf(("1ppdOpen2: Premature EOF at %lu...\n", + (unsigned long)cupsFileTell(fp))); +#endif /* DEBUG */ + + if (cg->ppd_status != PPD_OK) + { + /* + * Had an error reading the PPD file, cannot continue! + */ + + ppdClose(ppd); + + return (NULL); + } + + /* + * Update the filters array as needed... + */ + + if (!ppd_update_filters(ppd, cg)) + { + ppdClose(ppd); + + return (NULL); + } + + /* + * Create the sorted options array and set the option back-pointer for + * each choice and custom option... + */ + + ppd->options = cupsArrayNew2((cups_array_func_t)ppd_compare_options, NULL, + (cups_ahash_func_t)ppd_hash_option, + PPD_HASHSIZE); + + for (i = ppd->num_groups, group = ppd->groups; + i > 0; + i --, group ++) + { + for (j = group->num_options, option = group->options; + j > 0; + j --, option ++) + { + ppd_coption_t *coption; /* Custom option */ + + + cupsArrayAdd(ppd->options, option); + + for (k = 0; k < option->num_choices; k ++) + option->choices[k].option = option; + + if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL) + coption->option = option; + } + } + + /* + * Create an array to track the marked choices... + */ + + ppd->marked = cupsArrayNew((cups_array_func_t)ppd_compare_choices, NULL); + + /* + * Return the PPD file structure... + */ + + return (ppd); + + /* + * Common exit point for errors to save code size... + */ + + error: + + _cupsStrFree(string); + ppd_free(line.buffer); + + ppdClose(ppd); + + return (NULL); +} + + +/* + * 'ppdOpenFd()' - Read a PPD file into memory. + */ + +ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ +ppdOpenFd(int fd) /* I - File to read from */ +{ + cups_file_t *fp; /* CUPS file pointer */ + ppd_file_t *ppd; /* PPD file record */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + /* + * Set the line number to 0... + */ + + cg->ppd_line = 0; + + /* + * Range check input... + */ + + if (fd < 0) + { + cg->ppd_status = PPD_NULL_FILE; + + return (NULL); + } + + /* + * Try to open the file and parse it... + */ + + if ((fp = cupsFileOpenFd(fd, "r")) != NULL) + { + ppd = ppdOpen2(fp); + + cupsFileClose(fp); + } + else + { + cg->ppd_status = PPD_FILE_OPEN_ERROR; + ppd = NULL; + } + + return (ppd); +} + + +/* + * 'ppdOpenFile()' - Read a PPD file into memory. + */ + +ppd_file_t * /* O - PPD file record or @code NULL@ if the PPD file could not be opened. */ +ppdOpenFile(const char *filename) /* I - File to read from */ +{ + cups_file_t *fp; /* File pointer */ + ppd_file_t *ppd; /* PPD file record */ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + /* + * Set the line number to 0... + */ + + cg->ppd_line = 0; + + /* + * Range check input... + */ + + if (filename == NULL) + { + cg->ppd_status = PPD_NULL_FILE; + + return (NULL); + } + + /* + * Try to open the file and parse it... + */ + + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + ppd = ppdOpen2(fp); + + cupsFileClose(fp); + } + else + { + cg->ppd_status = PPD_FILE_OPEN_ERROR; + ppd = NULL; + } + + return (ppd); +} + + +/* + * 'ppdSetConformance()' - Set the conformance level for PPD files. + * + * @since CUPS 1.1.20/Mac OS X 10.4@ + */ + +void +ppdSetConformance(ppd_conform_t c) /* I - Conformance level */ +{ + _cups_globals_t *cg = _cupsGlobals(); + /* Global data */ + + + cg->ppd_conform = c; +} + + +/* + * 'ppd_add_attr()' - Add an attribute to the PPD data. + */ + +static ppd_attr_t * /* O - New attribute */ +ppd_add_attr(ppd_file_t *ppd, /* I - PPD file data */ + const char *name, /* I - Attribute name */ + const char *spec, /* I - Specifier string, if any */ + const char *text, /* I - Text string, if any */ + const char *value) /* I - Value of attribute */ +{ + ppd_attr_t **ptr, /* New array */ + *temp; /* New attribute */ + + + /* + * Range check input... + */ + + if (ppd == NULL || name == NULL || spec == NULL) + return (NULL); + + /* + * Create the array as needed... + */ + + if (!ppd->sorted_attrs) + ppd->sorted_attrs = cupsArrayNew((cups_array_func_t)ppd_compare_attrs, + NULL); + + /* + * Allocate memory for the new attribute... + */ + + if (ppd->num_attrs == 0) + ptr = malloc(sizeof(ppd_attr_t *)); + else + ptr = realloc(ppd->attrs, (ppd->num_attrs + 1) * sizeof(ppd_attr_t *)); + + if (ptr == NULL) + return (NULL); + + ppd->attrs = ptr; + ptr += ppd->num_attrs; + + if ((temp = calloc(1, sizeof(ppd_attr_t))) == NULL) + return (NULL); + + *ptr = temp; + + ppd->num_attrs ++; + + /* + * Copy data over... + */ + + strlcpy(temp->name, name, sizeof(temp->name)); + strlcpy(temp->spec, spec, sizeof(temp->spec)); + strlcpy(temp->text, text, sizeof(temp->text)); + temp->value = (char *)value; + + /* + * Add the attribute to the sorted array... + */ + + cupsArrayAdd(ppd->sorted_attrs, temp); + + /* + * Return the attribute... + */ + + return (temp); +} + + +/* + * 'ppd_add_choice()' - Add a choice to an option. + */ + +static ppd_choice_t * /* O - Named choice */ +ppd_add_choice(ppd_option_t *option, /* I - Option */ + const char *name) /* I - Name of choice */ +{ + ppd_choice_t *choice; /* Choice */ + + + if (option->num_choices == 0) + choice = malloc(sizeof(ppd_choice_t)); + else + choice = realloc(option->choices, + sizeof(ppd_choice_t) * (option->num_choices + 1)); + + if (choice == NULL) + return (NULL); + + option->choices = choice; + choice += option->num_choices; + option->num_choices ++; + + memset(choice, 0, sizeof(ppd_choice_t)); + strlcpy(choice->choice, name, sizeof(choice->choice)); + + return (choice); +} + + +/* + * 'ppd_add_size()' - Add a page size. + */ + +static ppd_size_t * /* O - Named size */ +ppd_add_size(ppd_file_t *ppd, /* I - PPD file */ + const char *name) /* I - Name of size */ +{ + ppd_size_t *size; /* Size */ + + + if (ppd->num_sizes == 0) + size = malloc(sizeof(ppd_size_t)); + else + size = realloc(ppd->sizes, sizeof(ppd_size_t) * (ppd->num_sizes + 1)); + + if (size == NULL) + return (NULL); + + ppd->sizes = size; + size += ppd->num_sizes; + ppd->num_sizes ++; + + memset(size, 0, sizeof(ppd_size_t)); + strlcpy(size->name, name, sizeof(size->name)); + + return (size); +} + + +/* + * 'ppd_compare_attrs()' - Compare two attributes. + */ + +static int /* O - Result of comparison */ +ppd_compare_attrs(ppd_attr_t *a, /* I - First attribute */ + ppd_attr_t *b) /* I - Second attribute */ +{ + return (_cups_strcasecmp(a->name, b->name)); +} + + +/* + * 'ppd_compare_choices()' - Compare two choices... + */ + +static int /* O - Result of comparison */ +ppd_compare_choices(ppd_choice_t *a, /* I - First choice */ + ppd_choice_t *b) /* I - Second choice */ +{ + return (strcmp(a->option->keyword, b->option->keyword)); +} + + +/* + * 'ppd_compare_coptions()' - Compare two custom options. + */ + +static int /* O - Result of comparison */ +ppd_compare_coptions(ppd_coption_t *a, /* I - First option */ + ppd_coption_t *b) /* I - Second option */ +{ + return (_cups_strcasecmp(a->keyword, b->keyword)); +} + + +/* + * 'ppd_compare_options()' - Compare two options. + */ + +static int /* O - Result of comparison */ +ppd_compare_options(ppd_option_t *a, /* I - First option */ + ppd_option_t *b) /* I - Second option */ +{ + return (_cups_strcasecmp(a->keyword, b->keyword)); +} + + +/* + * 'ppd_decode()' - Decode a string value... + */ + +static int /* O - Length of decoded string */ +ppd_decode(char *string) /* I - String to decode */ +{ + char *inptr, /* Input pointer */ + *outptr; /* Output pointer */ + + + inptr = string; + outptr = string; + + while (*inptr != '\0') + if (*inptr == '<' && isxdigit(inptr[1] & 255)) + { + /* + * Convert hex to 8-bit values... + */ + + inptr ++; + while (isxdigit(*inptr & 255)) + { + if (_cups_isalpha(*inptr)) + *outptr = (tolower(*inptr) - 'a' + 10) << 4; + else + *outptr = (*inptr - '0') << 4; + + inptr ++; + + if (!isxdigit(*inptr & 255)) + break; + + if (_cups_isalpha(*inptr)) + *outptr |= tolower(*inptr) - 'a' + 10; + else + *outptr |= *inptr - '0'; + + inptr ++; + outptr ++; + } + + while (*inptr != '>' && *inptr != '\0') + inptr ++; + while (*inptr == '>') + inptr ++; + } + else + *outptr++ = *inptr++; + + *outptr = '\0'; + + return ((int)(outptr - string)); +} + + +/* + * 'ppd_free_filters()' - Free the filters array. + */ + +static void +ppd_free_filters(ppd_file_t *ppd) /* I - PPD file */ +{ + int i; /* Looping var */ + char **filter; /* Current filter */ + + + if (ppd->num_filters > 0) + { + for (i = ppd->num_filters, filter = ppd->filters; i > 0; i --, filter ++) + _cupsStrFree(*filter); + + ppd_free(ppd->filters); + + ppd->num_filters = 0; + ppd->filters = NULL; + } +} + + +/* + * 'ppd_free_group()' - Free a single UI group. + */ + +static void +ppd_free_group(ppd_group_t *group) /* I - Group to free */ +{ + int i; /* Looping var */ + ppd_option_t *option; /* Current option */ + ppd_group_t *subgroup; /* Current sub-group */ + + + if (group->num_options > 0) + { + for (i = group->num_options, option = group->options; + i > 0; + i --, option ++) + ppd_free_option(option); + + ppd_free(group->options); + } + + if (group->num_subgroups > 0) + { + for (i = group->num_subgroups, subgroup = group->subgroups; + i > 0; + i --, subgroup ++) + ppd_free_group(subgroup); + + ppd_free(group->subgroups); + } +} + + +/* + * 'ppd_free_option()' - Free a single option. + */ + +static void +ppd_free_option(ppd_option_t *option) /* I - Option to free */ +{ + int i; /* Looping var */ + ppd_choice_t *choice; /* Current choice */ + + + if (option->num_choices > 0) + { + for (i = option->num_choices, choice = option->choices; + i > 0; + i --, choice ++) + { + _cupsStrFree(choice->code); + } + + ppd_free(option->choices); + } +} + + +/* + * 'ppd_get_coption()' - Get a custom option record. + */ + +static ppd_coption_t * /* O - Custom option... */ +ppd_get_coption(ppd_file_t *ppd, /* I - PPD file */ + const char *name) /* I - Name of option */ +{ + ppd_coption_t *copt; /* New custom option */ + + + /* + * See if the option already exists... + */ + + if ((copt = ppdFindCustomOption(ppd, name)) != NULL) + return (copt); + + /* + * Not found, so create the custom option record... + */ + + if ((copt = calloc(1, sizeof(ppd_coption_t))) == NULL) + return (NULL); + + strlcpy(copt->keyword, name, sizeof(copt->keyword)); + + copt->params = cupsArrayNew((cups_array_func_t)NULL, NULL); + + cupsArrayAdd(ppd->coptions, copt); + + /* + * Return the new record... + */ + + return (copt); +} + + +/* + * 'ppd_get_cparam()' - Get a custom parameter record. + */ + +static ppd_cparam_t * /* O - Extended option... */ +ppd_get_cparam(ppd_coption_t *opt, /* I - PPD file */ + const char *param, /* I - Name of parameter */ + const char *text) /* I - Human-readable text */ +{ + ppd_cparam_t *cparam; /* New custom parameter */ + + + /* + * See if the parameter already exists... + */ + + if ((cparam = ppdFindCustomParam(opt, param)) != NULL) + return (cparam); + + /* + * Not found, so create the custom parameter record... + */ + + if ((cparam = calloc(1, sizeof(ppd_cparam_t))) == NULL) + return (NULL); + + strlcpy(cparam->name, param, sizeof(cparam->name)); + strlcpy(cparam->text, text[0] ? text : param, sizeof(cparam->text)); + + /* + * Add this record to the array... + */ + + cupsArrayAdd(opt->params, cparam); + + /* + * Return the new record... + */ + + return (cparam); +} + + +/* + * 'ppd_get_group()' - Find or create the named group as needed. + */ + +static ppd_group_t * /* O - Named group */ +ppd_get_group(ppd_file_t *ppd, /* I - PPD file */ + const char *name, /* I - Name of group */ + const char *text, /* I - Text for group */ + _cups_globals_t *cg, /* I - Global data */ + cups_encoding_t encoding) /* I - Encoding of text */ +{ + int i; /* Looping var */ + ppd_group_t *group; /* Group */ + + + DEBUG_printf(("7ppd_get_group(ppd=%p, name=\"%s\", text=\"%s\", cg=%p)", + ppd, name, text, cg)); + + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + if (!strcmp(group->name, name)) + break; + + if (i == 0) + { + DEBUG_printf(("8ppd_get_group: Adding group %s...", name)); + + if (cg->ppd_conform == PPD_CONFORM_STRICT && strlen(text) >= sizeof(group->text)) + { + cg->ppd_status = PPD_ILLEGAL_TRANSLATION; + + return (NULL); + } + + if (ppd->num_groups == 0) + group = malloc(sizeof(ppd_group_t)); + else + group = realloc(ppd->groups, + (ppd->num_groups + 1) * sizeof(ppd_group_t)); + + if (group == NULL) + { + cg->ppd_status = PPD_ALLOC_ERROR; + + return (NULL); + } + + ppd->groups = group; + group += ppd->num_groups; + ppd->num_groups ++; + + memset(group, 0, sizeof(ppd_group_t)); + strlcpy(group->name, name, sizeof(group->name)); + + cupsCharsetToUTF8((cups_utf8_t *)group->text, text, + sizeof(group->text), encoding); + } + + return (group); +} + + +/* + * 'ppd_get_option()' - Find or create the named option as needed. + */ + +static ppd_option_t * /* O - Named option */ +ppd_get_option(ppd_group_t *group, /* I - Group */ + const char *name) /* I - Name of option */ +{ + int i; /* Looping var */ + ppd_option_t *option; /* Option */ + + + DEBUG_printf(("7ppd_get_option(group=%p(\"%s\"), name=\"%s\")", + group, group->name, name)); + + for (i = group->num_options, option = group->options; i > 0; i --, option ++) + if (!strcmp(option->keyword, name)) + break; + + if (i == 0) + { + if (group->num_options == 0) + option = malloc(sizeof(ppd_option_t)); + else + option = realloc(group->options, + (group->num_options + 1) * sizeof(ppd_option_t)); + + if (option == NULL) + return (NULL); + + group->options = option; + option += group->num_options; + group->num_options ++; + + memset(option, 0, sizeof(ppd_option_t)); + strlcpy(option->keyword, name, sizeof(option->keyword)); + } + + return (option); +} + + +/* + * 'ppd_hash_option()' - Generate a hash of the option name... + */ + +static int /* O - Hash index */ +ppd_hash_option(ppd_option_t *option) /* I - Option */ +{ + int hash = 0; /* Hash index */ + const char *k; /* Pointer into keyword */ + + + for (hash = option->keyword[0], k = option->keyword + 1; *k;) + hash = 33 * hash + *k++; + + return (hash & 511); +} + + +/* + * 'ppd_read()' - Read a line from a PPD file, skipping comment lines as + * necessary. + */ + +static int /* O - Bitmask of fields read */ +ppd_read(cups_file_t *fp, /* I - File to read from */ + _ppd_line_t *line, /* I - Line buffer */ + char *keyword, /* O - Keyword from line */ + char *option, /* O - Option from line */ + char *text, /* O - Human-readable text from line */ + char **string, /* O - Code/string data */ + int ignoreblank, /* I - Ignore blank lines? */ + _cups_globals_t *cg) /* I - Global data */ +{ + int ch, /* Character from file */ + col, /* Column in line */ + colon, /* Colon seen? */ + endquote, /* Waiting for an end quote */ + mask, /* Mask to be returned */ + startline, /* Start line */ + textlen; /* Length of text */ + char *keyptr, /* Keyword pointer */ + *optptr, /* Option pointer */ + *textptr, /* Text pointer */ + *strptr, /* Pointer into string */ + *lineptr; /* Current position in line buffer */ + + + /* + * Now loop until we have a valid line... + */ + + *string = NULL; + col = 0; + startline = cg->ppd_line + 1; + + if (!line->buffer) + { + line->bufsize = 1024; + line->buffer = malloc(1024); + + if (!line->buffer) + return (0); + } + + do + { + /* + * Read the line... + */ + + lineptr = line->buffer; + endquote = 0; + colon = 0; + + while ((ch = cupsFileGetChar(fp)) != EOF) + { + if (lineptr >= (line->buffer + line->bufsize - 1)) + { + /* + * Expand the line buffer... + */ + + char *temp; /* Temporary line pointer */ + + + line->bufsize += 1024; + if (line->bufsize > 262144) + { + /* + * Don't allow lines longer than 256k! + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_LINE_TOO_LONG; + + return (0); + } + + temp = realloc(line->buffer, line->bufsize); + if (!temp) + { + cg->ppd_line = startline; + cg->ppd_status = PPD_LINE_TOO_LONG; + + return (0); + } + + lineptr = temp + (lineptr - line->buffer); + line->buffer = temp; + } + + if (ch == '\r' || ch == '\n') + { + /* + * Line feed or carriage return... + */ + + cg->ppd_line ++; + col = 0; + + if (ch == '\r') + { + /* + * Check for a trailing line feed... + */ + + if ((ch = cupsFilePeekChar(fp)) == EOF) + { + ch = '\n'; + break; + } + + if (ch == 0x0a) + cupsFileGetChar(fp); + } + + if (lineptr == line->buffer && ignoreblank) + continue; /* Skip blank lines */ + + ch = '\n'; + + if (!endquote) /* Continue for multi-line text */ + break; + + *lineptr++ = '\n'; + } + else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT) + { + /* + * Other control characters... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_ILLEGAL_CHARACTER; + + return (0); + } + else if (ch != 0x1a) + { + /* + * Any other character... + */ + + *lineptr++ = ch; + col ++; + + if (col > (PPD_MAX_LINE - 1)) + { + /* + * Line is too long... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_LINE_TOO_LONG; + + return (0); + } + + if (ch == ':' && strncmp(line->buffer, "*%", 2) != 0) + colon = 1; + + if (ch == '\"' && colon) + endquote = !endquote; + } + } + + if (endquote) + { + /* + * Didn't finish this quoted string... + */ + + while ((ch = cupsFileGetChar(fp)) != EOF) + if (ch == '\"') + break; + else if (ch == '\r' || ch == '\n') + { + cg->ppd_line ++; + col = 0; + + if (ch == '\r') + { + /* + * Check for a trailing line feed... + */ + + if ((ch = cupsFilePeekChar(fp)) == EOF) + break; + if (ch == 0x0a) + cupsFileGetChar(fp); + } + } + else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT) + { + /* + * Other control characters... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_ILLEGAL_CHARACTER; + + return (0); + } + else if (ch != 0x1a) + { + col ++; + + if (col > (PPD_MAX_LINE - 1)) + { + /* + * Line is too long... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_LINE_TOO_LONG; + + return (0); + } + } + } + + if (ch != '\n') + { + /* + * Didn't finish this line... + */ + + while ((ch = cupsFileGetChar(fp)) != EOF) + if (ch == '\r' || ch == '\n') + { + /* + * Line feed or carriage return... + */ + + cg->ppd_line ++; + col = 0; + + if (ch == '\r') + { + /* + * Check for a trailing line feed... + */ + + if ((ch = cupsFilePeekChar(fp)) == EOF) + break; + if (ch == 0x0a) + cupsFileGetChar(fp); + } + + break; + } + else if (ch < ' ' && ch != '\t' && cg->ppd_conform == PPD_CONFORM_STRICT) + { + /* + * Other control characters... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_ILLEGAL_CHARACTER; + + return (0); + } + else if (ch != 0x1a) + { + col ++; + + if (col > (PPD_MAX_LINE - 1)) + { + /* + * Line is too long... + */ + + cg->ppd_line = startline; + cg->ppd_status = PPD_LINE_TOO_LONG; + + return (0); + } + } + } + + if (lineptr > line->buffer && lineptr[-1] == '\n') + lineptr --; + + *lineptr = '\0'; + + DEBUG_printf(("9ppd_read: LINE=\"%s\"", line->buffer)); + + /* + * The dynamically created PPDs for older style Mac OS X + * drivers include a large blob of data inserted as comments + * at the end of the file. As an optimization we can stop + * reading the PPD when we get to the start of this data. + */ + + if (!strcmp(line->buffer, "*%APLWORKSET START")) + return (0); + + if (ch == EOF && lineptr == line->buffer) + return (0); + + /* + * Now parse it... + */ + + mask = 0; + lineptr = line->buffer + 1; + + keyword[0] = '\0'; + option[0] = '\0'; + text[0] = '\0'; + *string = NULL; + + if ((!line->buffer[0] || /* Blank line */ + !strncmp(line->buffer, "*%", 2) || /* Comment line */ + !strcmp(line->buffer, "*End")) && /* End of multi-line string */ + ignoreblank) /* Ignore these? */ + { + startline = cg->ppd_line + 1; + continue; + } + + if (!strcmp(line->buffer, "*")) /* (Bad) comment line */ + { + if (cg->ppd_conform == PPD_CONFORM_RELAXED) + { + startline = cg->ppd_line + 1; + continue; + } + else + { + cg->ppd_line = startline; + cg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD; + + return (0); + } + } + + if (line->buffer[0] != '*') /* All lines start with an asterisk */ + { + /* + * Allow lines consisting of just whitespace... + */ + + for (lineptr = line->buffer; *lineptr; lineptr ++) + if (*lineptr && !_cups_isspace(*lineptr)) + break; + + if (*lineptr) + { + cg->ppd_status = PPD_MISSING_ASTERISK; + return (0); + } + else if (ignoreblank) + continue; + else + return (0); + } + + /* + * Get a keyword... + */ + + keyptr = keyword; + + while (*lineptr && *lineptr != ':' && !_cups_isspace(*lineptr)) + { + if (*lineptr <= ' ' || *lineptr > 126 || *lineptr == '/' || + (keyptr - keyword) >= (PPD_MAX_NAME - 1)) + { + cg->ppd_status = PPD_ILLEGAL_MAIN_KEYWORD; + return (0); + } + + *keyptr++ = *lineptr++; + } + + *keyptr = '\0'; + + if (!strcmp(keyword, "End")) + continue; + + mask |= PPD_KEYWORD; + + if (_cups_isspace(*lineptr)) + { + /* + * Get an option name... + */ + + while (_cups_isspace(*lineptr)) + lineptr ++; + + optptr = option; + + while (*lineptr && !_cups_isspace(*lineptr) && *lineptr != ':' && + *lineptr != '/') + { + if (*lineptr <= ' ' || *lineptr > 126 || + (optptr - option) >= (PPD_MAX_NAME - 1)) + { + cg->ppd_status = PPD_ILLEGAL_OPTION_KEYWORD; + return (0); + } + + *optptr++ = *lineptr++; + } + + *optptr = '\0'; + + if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_ILLEGAL_WHITESPACE; + return (0); + } + + while (_cups_isspace(*lineptr)) + lineptr ++; + + mask |= PPD_OPTION; + + if (*lineptr == '/') + { + /* + * Get human-readable text... + */ + + lineptr ++; + + textptr = text; + + while (*lineptr != '\0' && *lineptr != '\n' && *lineptr != ':') + { + if (((unsigned char)*lineptr < ' ' && *lineptr != '\t') || + (textptr - text) >= (PPD_MAX_LINE - 1)) + { + cg->ppd_status = PPD_ILLEGAL_TRANSLATION; + return (0); + } + + *textptr++ = *lineptr++; + } + + *textptr = '\0'; + textlen = ppd_decode(text); + + if (textlen > PPD_MAX_TEXT && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_ILLEGAL_TRANSLATION; + return (0); + } + + mask |= PPD_TEXT; + } + } + + if (_cups_isspace(*lineptr) && cg->ppd_conform == PPD_CONFORM_STRICT) + { + cg->ppd_status = PPD_ILLEGAL_WHITESPACE; + return (0); + } + + while (_cups_isspace(*lineptr)) + lineptr ++; + + if (*lineptr == ':') + { + /* + * Get string after triming leading and trailing whitespace... + */ + + lineptr ++; + while (_cups_isspace(*lineptr)) + lineptr ++; + + strptr = lineptr + strlen(lineptr) - 1; + while (strptr >= lineptr && _cups_isspace(*strptr)) + *strptr-- = '\0'; + + if (*strptr == '\"') + { + /* + * Quoted string by itself, remove quotes... + */ + + *strptr = '\0'; + lineptr ++; + } + + *string = _cupsStrAlloc(lineptr); + + mask |= PPD_STRING; + } + } + while (mask == 0); + + return (mask); +} + + +/* + * 'ppd_update_filters()' - Update the filters array as needed. + * + * This function re-populates the filters array with cupsFilter2 entries that + * have been stripped of the destination MIME media types and any maxsize hints. + * + * (All for backwards-compatibility) + */ + +static int /* O - 1 on success, 0 on failure */ +ppd_update_filters(ppd_file_t *ppd,/* I - PPD file */ + _cups_globals_t *cg) /* I - Global data */ +{ + ppd_attr_t *attr; /* Current cupsFilter2 value */ + char srcsuper[16], /* Source MIME media type */ + srctype[256], + dstsuper[16], /* Destination MIME media type */ + dsttype[256], + program[1024], /* Command to run */ + *ptr, /* Pointer into command to run */ + buffer[1024], /* Re-written cupsFilter value */ + **filter; /* Current filter */ + int cost; /* Cost of filter */ + + + DEBUG_printf(("4ppd_update_filters(ppd=%p, cg=%p)", ppd, cg)); + + /* + * See if we have any cupsFilter2 lines... + */ + + if ((attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) == NULL) + { + DEBUG_puts("5ppd_update_filters: No cupsFilter2 keywords present."); + return (1); + } + + /* + * Yes, free the cupsFilter-defined filters and re-build... + */ + + ppd_free_filters(ppd); + + do + { + /* + * Parse the cupsFilter2 string: + * + * src/type dst/type cost program + * src/type dst/type cost maxsize(n) program + */ + + DEBUG_printf(("5ppd_update_filters: cupsFilter2=\"%s\"", attr->value)); + + if (sscanf(attr->value, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + srcsuper, srctype, dstsuper, dsttype, &cost, program) != 6) + { + DEBUG_puts("5ppd_update_filters: Bad cupsFilter2 line."); + cg->ppd_status = PPD_BAD_VALUE; + + return (0); + } + + DEBUG_printf(("5ppd_update_filters: srcsuper=\"%s\", srctype=\"%s\", " + "dstsuper=\"%s\", dsttype=\"%s\", cost=%d, program=\"%s\"", + srcsuper, srctype, dstsuper, dsttype, cost, program)); + + if (!strncmp(program, "maxsize(", 8) && + (ptr = strchr(program + 8, ')')) != NULL) + { + DEBUG_puts("5ppd_update_filters: Found maxsize(nnn)."); + + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + DEBUG_printf(("5ppd_update_filters: New program=\"%s\"", program)); + } + + /* + * Convert to cupsFilter format: + * + * src/type cost program + */ + + snprintf(buffer, sizeof(buffer), "%s/%s %d %s", srcsuper, srctype, cost, + program); + DEBUG_printf(("5ppd_update_filters: Adding \"%s\".", buffer)); + + /* + * Add a cupsFilter-compatible string to the filters array. + */ + + if (ppd->num_filters == 0) + filter = malloc(sizeof(char *)); + else + filter = realloc(ppd->filters, sizeof(char *) * (ppd->num_filters + 1)); + + if (filter == NULL) + { + DEBUG_puts("5ppd_update_filters: Out of memory."); + cg->ppd_status = PPD_ALLOC_ERROR; + + return (0); + } + + ppd->filters = filter; + filter += ppd->num_filters; + ppd->num_filters ++; + + *filter = _cupsStrAlloc(buffer); + } + while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); + + DEBUG_puts("5ppd_update_filters: Completed OK."); + return (1); +} + + +/* + * End of "$Id: ppd.c 9901 2011-08-17 21:01:53Z mike $". + */ diff --git a/cups/ppd.h b/cups/ppd.h new file mode 100644 index 0000000..1d09762 --- /dev/null +++ b/cups/ppd.h @@ -0,0 +1,450 @@ +/* + * "$Id: ppd.h 9772 2011-05-12 05:46:30Z mike $" + * + * PostScript Printer Description definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This code and any derivative of it may be used and distributed + * freely under the terms of the GNU General Public License when + * used with GNU Ghostscript or its derivatives. Use of the code + * (or any derivative of it) with software other than GNU + * GhostScript (or its derivatives) is governed by the CUPS license + * agreement. + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_PPD_H_ +# define _CUPS_PPD_H_ + +/* + * Include necessary headers... + */ + +# include +# include "cups.h" +# include "array.h" +# include "file.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * PPD version... + */ + +# define PPD_VERSION 4.3 /* Kept in sync with Adobe version number */ + + +/* + * PPD size limits (defined in Adobe spec) + */ + +# define PPD_MAX_NAME 41 /* Maximum size of name + 1 for nul */ +# define PPD_MAX_TEXT 81 /* Maximum size of text + 1 for nul */ +# define PPD_MAX_LINE 256 /* Maximum size of line + 1 for nul */ + + +/* + * Types and structures... + */ + +typedef enum ppd_ui_e /**** UI Types ****/ +{ + PPD_UI_BOOLEAN, /* True or False option */ + PPD_UI_PICKONE, /* Pick one from a list */ + PPD_UI_PICKMANY /* Pick zero or more from a list */ +} ppd_ui_t; + +typedef enum ppd_section_e /**** Order dependency sections ****/ +{ + PPD_ORDER_ANY, /* Option code can be anywhere in the file */ + PPD_ORDER_DOCUMENT, /* ... must be in the DocumentSetup section */ + PPD_ORDER_EXIT, /* ... must be sent prior to the document */ + PPD_ORDER_JCL, /* ... must be sent as a JCL command */ + PPD_ORDER_PAGE, /* ... must be in the PageSetup section */ + PPD_ORDER_PROLOG /* ... must be in the Prolog section */ +} ppd_section_t; + +typedef enum ppd_cs_e /**** Colorspaces ****/ +{ + PPD_CS_CMYK = -4, /* CMYK colorspace */ + PPD_CS_CMY, /* CMY colorspace */ + PPD_CS_GRAY = 1, /* Grayscale colorspace */ + PPD_CS_RGB = 3, /* RGB colorspace */ + PPD_CS_RGBK, /* RGBK (K = gray) colorspace */ + PPD_CS_N /* DeviceN colorspace */ +} ppd_cs_t; + +typedef enum ppd_status_e /**** Status Codes @since CUPS 1.1.19/Mac OS X 10.3@ ****/ +{ + PPD_OK = 0, /* OK */ + PPD_FILE_OPEN_ERROR, /* Unable to open PPD file */ + PPD_NULL_FILE, /* NULL PPD file pointer */ + PPD_ALLOC_ERROR, /* Memory allocation error */ + PPD_MISSING_PPDADOBE4, /* Missing PPD-Adobe-4.x header */ + PPD_MISSING_VALUE, /* Missing value string */ + PPD_INTERNAL_ERROR, /* Internal error */ + PPD_BAD_OPEN_GROUP, /* Bad OpenGroup */ + PPD_NESTED_OPEN_GROUP, /* OpenGroup without a CloseGroup first */ + PPD_BAD_OPEN_UI, /* Bad OpenUI/JCLOpenUI */ + PPD_NESTED_OPEN_UI, /* OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first */ + PPD_BAD_ORDER_DEPENDENCY, /* Bad OrderDependency */ + PPD_BAD_UI_CONSTRAINTS, /* Bad UIConstraints */ + PPD_MISSING_ASTERISK, /* Missing asterisk in column 0 */ + PPD_LINE_TOO_LONG, /* Line longer than 255 chars */ + PPD_ILLEGAL_CHARACTER, /* Illegal control character */ + PPD_ILLEGAL_MAIN_KEYWORD, /* Illegal main keyword string */ + PPD_ILLEGAL_OPTION_KEYWORD, /* Illegal option keyword string */ + PPD_ILLEGAL_TRANSLATION, /* Illegal translation string */ + PPD_ILLEGAL_WHITESPACE, /* Illegal whitespace character */ + PPD_BAD_CUSTOM_PARAM, /* Bad custom parameter */ + PPD_MISSING_OPTION_KEYWORD, /* Missing option keyword */ + PPD_BAD_VALUE, /* Bad value string */ + PPD_MISSING_CLOSE_GROUP, /* Missing CloseGroup */ + PPD_MAX_STATUS /* @private@ */ +} ppd_status_t; + +enum ppd_conform_e /**** Conformance Levels @since CUPS 1.1.19/Mac OS X 10.3@ ****/ +{ + PPD_CONFORM_RELAXED, /* Relax whitespace and control char */ + PPD_CONFORM_STRICT /* Require strict conformance */ +}; + +typedef enum ppd_conform_e ppd_conform_t; + /**** Conformance Levels @since CUPS 1.1.19/Mac OS X 10.3@ ****/ + +typedef struct ppd_attr_s /**** PPD Attribute Structure @since CUPS 1.1.19/Mac OS X 10.3@ ****/ +{ + char name[PPD_MAX_NAME]; /* Name of attribute (cupsXYZ) */ + char spec[PPD_MAX_NAME]; /* Specifier string, if any */ + char text[PPD_MAX_TEXT]; /* Human-readable text, if any */ + char *value; /* Value string */ +} ppd_attr_t; + +typedef struct ppd_option_s ppd_option_t; + /**** Options ****/ + +typedef struct ppd_choice_s /**** Option choices ****/ +{ + char marked; /* 0 if not selected, 1 otherwise */ + char choice[PPD_MAX_NAME]; /* Computer-readable option name */ + char text[PPD_MAX_TEXT]; /* Human-readable option name */ + char *code; /* Code to send for this option */ + ppd_option_t *option; /* Pointer to parent option structure */ +} ppd_choice_t; + +struct ppd_option_s /**** Options ****/ +{ + char conflicted; /* 0 if no conflicts exist, 1 otherwise */ + char keyword[PPD_MAX_NAME]; /* Option keyword name ("PageSize", etc.) */ + char defchoice[PPD_MAX_NAME];/* Default option choice */ + char text[PPD_MAX_TEXT]; /* Human-readable text */ + ppd_ui_t ui; /* Type of UI option */ + ppd_section_t section; /* Section for command */ + float order; /* Order number */ + int num_choices; /* Number of option choices */ + ppd_choice_t *choices; /* Option choices */ +}; + +typedef struct ppd_group_s /**** Groups ****/ +{ + /**** Group text strings are limited to 39 chars + nul in order to + **** preserve binary compatibility and allow applications to get + **** the group's keyword name. + ****/ + char text[PPD_MAX_TEXT - PPD_MAX_NAME]; + /* Human-readable group name */ + char name[PPD_MAX_NAME]; /* Group name @since CUPS 1.1.18/Mac OS X 10.3@ */ + int num_options; /* Number of options */ + ppd_option_t *options; /* Options */ + int num_subgroups; /* Number of sub-groups */ + struct ppd_group_s *subgroups; /* Sub-groups (max depth = 1) */ +} ppd_group_t; + +typedef struct ppd_const_s /**** Constraints ****/ +{ + char option1[PPD_MAX_NAME]; /* First keyword */ + char choice1[PPD_MAX_NAME]; /* First option/choice (blank for all) */ + char option2[PPD_MAX_NAME]; /* Second keyword */ + char choice2[PPD_MAX_NAME]; /* Second option/choice (blank for all) */ +} ppd_const_t; + +typedef struct ppd_size_s /**** Page Sizes ****/ +{ + int marked; /* Page size selected? */ + char name[PPD_MAX_NAME]; /* Media size option */ + float width; /* Width of media in points */ + float length; /* Length of media in points */ + float left; /* Left printable margin in points */ + float bottom; /* Bottom printable margin in points */ + float right; /* Right printable margin in points */ + float top; /* Top printable margin in points */ +} ppd_size_t; + +typedef struct ppd_emul_s /**** Emulators ****/ +{ + char name[PPD_MAX_NAME]; /* Emulator name */ + char *start; /* Code to switch to this emulation */ + char *stop; /* Code to stop this emulation */ +} ppd_emul_t; + +typedef struct ppd_profile_s /**** sRGB Color Profiles ****/ +{ + char resolution[PPD_MAX_NAME]; + /* Resolution or "-" */ + char media_type[PPD_MAX_NAME]; + /* Media type or "-" */ + float density; /* Ink density to use */ + float gamma; /* Gamma correction to use */ + float matrix[3][3]; /* Transform matrix */ +} ppd_profile_t; + +/**** New in CUPS 1.2/Mac OS X 10.5 ****/ +typedef enum ppd_cptype_e /**** Custom Parameter Type @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + PPD_CUSTOM_CURVE, /* Curve value for f(x) = x^value */ + PPD_CUSTOM_INT, /* Integer number value */ + PPD_CUSTOM_INVCURVE, /* Curve value for f(x) = x^(1/value) */ + PPD_CUSTOM_PASSCODE, /* String of (hidden) numbers */ + PPD_CUSTOM_PASSWORD, /* String of (hidden) characters */ + PPD_CUSTOM_POINTS, /* Measurement value in points */ + PPD_CUSTOM_REAL, /* Real number value */ + PPD_CUSTOM_STRING /* String of characters */ +} ppd_cptype_t; + +typedef union ppd_cplimit_u /**** Custom Parameter Limit @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + float custom_curve; /* Gamma value */ + int custom_int; /* Integer value */ + float custom_invcurve; /* Gamma value */ + int custom_passcode; /* Passcode length */ + int custom_password; /* Password length */ + float custom_points; /* Measurement value */ + float custom_real; /* Real value */ + int custom_string; /* String length */ +} ppd_cplimit_t; + +typedef union ppd_cpvalue_u /**** Custom Parameter Value @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + float custom_curve; /* Gamma value */ + int custom_int; /* Integer value */ + float custom_invcurve; /* Gamma value */ + char *custom_passcode; /* Passcode value */ + char *custom_password; /* Password value */ + float custom_points; /* Measurement value */ + float custom_real; /* Real value */ + char *custom_string; /* String value */ +} ppd_cpvalue_t; + +typedef struct ppd_cparam_s /**** Custom Parameter @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + char name[PPD_MAX_NAME]; /* Parameter name */ + char text[PPD_MAX_TEXT]; /* Human-readable text */ + int order; /* Order (0 to N) */ + ppd_cptype_t type; /* Parameter type */ + ppd_cplimit_t minimum, /* Minimum value */ + maximum; /* Maximum value */ + ppd_cpvalue_t current; /* Current value */ +} ppd_cparam_t; + +typedef struct ppd_coption_s /**** Custom Option @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + char keyword[PPD_MAX_NAME]; /* Name of option that is being extended... */ + ppd_option_t *option; /* Option that is being extended... */ + int marked; /* Extended option is marked */ + cups_array_t *params; /* Parameters */ +} ppd_coption_t; + +typedef struct _ppd_cache_s _ppd_cache_t; + /**** PPD cache and mapping data @since CUPS 1.5/Mac OS X 10.7@ @private@ ****/ + +typedef struct ppd_file_s /**** PPD File ****/ +{ + int language_level; /* Language level of device */ + int color_device; /* 1 = color device, 0 = grayscale */ + int variable_sizes; /* 1 = supports variable sizes, 0 = doesn't */ + int accurate_screens; /* 1 = supports accurate screens, 0 = not */ + int contone_only; /* 1 = continuous tone only, 0 = not */ + int landscape; /* -90 or 90 */ + int model_number; /* Device-specific model number */ + int manual_copies; /* 1 = Copies done manually, 0 = hardware */ + int throughput; /* Pages per minute */ + ppd_cs_t colorspace; /* Default colorspace */ + char *patches; /* Patch commands to be sent to printer */ + int num_emulations; /* Number of emulations supported */ + ppd_emul_t *emulations; /* Emulations and the code to invoke them */ + char *jcl_begin; /* Start JCL commands */ + char *jcl_ps; /* Enter PostScript interpreter */ + char *jcl_end; /* End JCL commands */ + char *lang_encoding; /* Language encoding */ + char *lang_version; /* Language version (English, Spanish, etc.) */ + char *modelname; /* Model name (general) */ + char *ttrasterizer; /* Truetype rasterizer */ + char *manufacturer; /* Manufacturer name */ + char *product; /* Product name (from PS RIP/interpreter) */ + char *nickname; /* Nickname (specific) */ + char *shortnickname; /* Short version of nickname */ + int num_groups; /* Number of UI groups */ + ppd_group_t *groups; /* UI groups */ + int num_sizes; /* Number of page sizes */ + ppd_size_t *sizes; /* Page sizes */ + float custom_min[2]; /* Minimum variable page size */ + float custom_max[2]; /* Maximum variable page size */ + float custom_margins[4]; /* Margins around page */ + int num_consts; /* Number of UI/Non-UI constraints */ + ppd_const_t *consts; /* UI/Non-UI constraints */ + int num_fonts; /* Number of pre-loaded fonts */ + char **fonts; /* Pre-loaded fonts */ + int num_profiles; /* Number of sRGB color profiles @deprecated@ */ + ppd_profile_t *profiles; /* sRGB color profiles @deprecated@ */ + int num_filters; /* Number of filters */ + char **filters; /* Filter strings... */ + + /**** New in CUPS 1.1 ****/ + int flip_duplex; /* 1 = Flip page for back sides @deprecated@ */ + + /**** New in CUPS 1.1.19 ****/ + char *protocols; /* Protocols (BCP, TBCP) string @since CUPS 1.1.19/Mac OS X 10.3@ */ + char *pcfilename; /* PCFileName string @since CUPS 1.1.19/Mac OS X 10.3@ */ + int num_attrs; /* Number of attributes @since CUPS 1.1.19/Mac OS X 10.3@ @private@ */ + int cur_attr; /* Current attribute @since CUPS 1.1.19/Mac OS X 10.3@ @private@ */ + ppd_attr_t **attrs; /* Attributes @since CUPS 1.1.19/Mac OS X 10.3@ @private@ */ + + /**** New in CUPS 1.2/Mac OS X 10.5 ****/ + cups_array_t *sorted_attrs; /* Attribute lookup array @since CUPS 1.2/Mac OS X 10.5@ @private@ */ + cups_array_t *options; /* Option lookup array @since CUPS 1.2/Mac OS X 10.5@ @private@ */ + cups_array_t *coptions; /* Custom options array @since CUPS 1.2/Mac OS X 10.5@ @private@ */ + + /**** New in CUPS 1.3/Mac OS X 10.5 ****/ + cups_array_t *marked; /* Marked choices @since CUPS 1.3/Mac OS X 10.5@ @private@ */ + + /**** New in CUPS 1.4/Mac OS X 10.6 ****/ + cups_array_t *cups_uiconstraints; /* cupsUIConstraints @since CUPS 1.4/Mac OS X 10.6@ @private@ */ + + /**** New in CUPS 1.5 ****/ + _ppd_cache_t *cache; /* PPD cache and mapping data @since CUPS 1.5/Mac OS X 10.7@ @private@ */ +} ppd_file_t; + + +/* + * Prototypes... + */ + +extern int cupsMarkOptions(ppd_file_t *ppd, int num_options, + cups_option_t *options); +extern void ppdClose(ppd_file_t *ppd); +extern int ppdCollect(ppd_file_t *ppd, ppd_section_t section, + ppd_choice_t ***choices); +extern int ppdConflicts(ppd_file_t *ppd); +extern int ppdEmit(ppd_file_t *ppd, FILE *fp, + ppd_section_t section); +extern int ppdEmitFd(ppd_file_t *ppd, int fd, + ppd_section_t section); +extern int ppdEmitJCL(ppd_file_t *ppd, FILE *fp, int job_id, + const char *user, const char *title); +extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option); +extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword); +extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword); +extern int ppdIsMarked(ppd_file_t *ppd, const char *keyword, + const char *option); +extern void ppdMarkDefaults(ppd_file_t *ppd); +extern int ppdMarkOption(ppd_file_t *ppd, const char *keyword, + const char *option); +extern ppd_file_t *ppdOpen(FILE *fp); +extern ppd_file_t *ppdOpenFd(int fd); +extern ppd_file_t *ppdOpenFile(const char *filename); +extern float ppdPageLength(ppd_file_t *ppd, const char *name); +extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name); +extern float ppdPageWidth(ppd_file_t *ppd, const char *name); + +/**** New in CUPS 1.1.19 ****/ +extern const char *ppdErrorString(ppd_status_t status) _CUPS_API_1_1_19; +extern ppd_attr_t *ppdFindAttr(ppd_file_t *ppd, const char *name, + const char *spec) _CUPS_API_1_1_19; +extern ppd_attr_t *ppdFindNextAttr(ppd_file_t *ppd, const char *name, + const char *spec) _CUPS_API_1_1_19; +extern ppd_status_t ppdLastError(int *line) _CUPS_API_1_1_19; + +/**** New in CUPS 1.1.20 ****/ +extern void ppdSetConformance(ppd_conform_t c) _CUPS_API_1_1_20; + +/**** New in CUPS 1.2 ****/ +extern int ppdCollect2(ppd_file_t *ppd, ppd_section_t section, + float min_order, ppd_choice_t ***choices) _CUPS_API_1_2; +extern int ppdEmitAfterOrder(ppd_file_t *ppd, FILE *fp, + ppd_section_t section, int limit, + float min_order) _CUPS_API_1_2; +extern int ppdEmitJCLEnd(ppd_file_t *ppd, FILE *fp) _CUPS_API_1_2; +extern char *ppdEmitString(ppd_file_t *ppd, ppd_section_t section, + float min_order) _CUPS_API_1_2; +extern ppd_coption_t *ppdFindCustomOption(ppd_file_t *ppd, + const char *keyword) _CUPS_API_1_2; +extern ppd_cparam_t *ppdFindCustomParam(ppd_coption_t *opt, + const char *name) _CUPS_API_1_2; +extern ppd_cparam_t *ppdFirstCustomParam(ppd_coption_t *opt) _CUPS_API_1_2; +extern ppd_option_t *ppdFirstOption(ppd_file_t *ppd) _CUPS_API_1_2; +extern ppd_cparam_t *ppdNextCustomParam(ppd_coption_t *opt) _CUPS_API_1_2; +extern ppd_option_t *ppdNextOption(ppd_file_t *ppd) _CUPS_API_1_2; +extern int ppdLocalize(ppd_file_t *ppd) _CUPS_API_1_2; +extern ppd_file_t *ppdOpen2(cups_file_t *fp) _CUPS_API_1_2; + +/**** New in CUPS 1.3/Mac OS X 10.5 ****/ +extern const char *ppdLocalizeIPPReason(ppd_file_t *ppd, + const char *reason, + const char *scheme, + char *buffer, + size_t bufsize) _CUPS_API_1_3; + +/**** New in CUPS 1.4/Mac OS X 10.6 ****/ +extern int cupsGetConflicts(ppd_file_t *ppd, const char *option, + const char *choice, + cups_option_t **options) + _CUPS_API_1_4; +extern int cupsResolveConflicts(ppd_file_t *ppd, const char *option, + const char *choice, + int *num_options, + cups_option_t **options) + _CUPS_API_1_4; +extern int ppdInstallableConflict(ppd_file_t *ppd, + const char *option, + const char *choice) + _CUPS_API_1_4; +extern ppd_attr_t *ppdLocalizeAttr(ppd_file_t *ppd, const char *keyword, + const char *spec) _CUPS_API_1_4; +extern const char *ppdLocalizeMarkerName(ppd_file_t *ppd, + const char *name) _CUPS_API_1_4; +extern int ppdPageSizeLimits(ppd_file_t *ppd, + ppd_size_t *minimum, + ppd_size_t *maximum) _CUPS_API_1_4; + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_PPD_H_ */ + +/* + * End of "$Id: ppd.h 9772 2011-05-12 05:46:30Z mike $". + */ diff --git a/cups/pwg-media.c b/cups/pwg-media.c new file mode 100644 index 0000000..3bfbc24 --- /dev/null +++ b/cups/pwg-media.c @@ -0,0 +1,851 @@ +/* + * "$Id: pwg-media.c 10340 2012-03-07 17:16:42Z mike $" + * + * PWG media name API implementation for CUPS. + * + * Copyright 2009-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _pwgGenerateSize() - Generate a PWG size keyword. + * _pwgInitSize() - Initialize a PWG size using IPP job template + * attributes. + * _pwgMediaForLegacy() - Find a PWG media size by ISO/IPP legacy name. + * _pwgMediaForPPD() - Find a PWG media size by Adobe PPD name. + * _pwgMediaForPWG() - Find a PWG media size by 5101.1 self-describing + * name. + * _pwgMediaForSize() - Get the PWG media name for a given size. + * pwg_compare_legacy() - Compare two sizes using the legacy names. + * pwg_compare_ppd() - Compare two sizes using the PPD names. + * pwg_compare_pwg() - Compare two sizes using the PWG names. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include + + +/* + * Local macros... + */ + +#define _PWG_MEDIA_IN(p,l,a,x,y) {p, l, a, (int)(x * 2540), (int)(y * 2540)} +#define _PWG_MEDIA_MM(p,l,a,x,y) {p, l, a, (int)(x * 100), (int)(y * 100)} + + +/* + * Local functions... + */ + +static int pwg_compare_legacy(_pwg_media_t *a, _pwg_media_t *b); +static int pwg_compare_pwg(_pwg_media_t *a, _pwg_media_t *b); +static int pwg_compare_ppd(_pwg_media_t *a, _pwg_media_t *b); + + +/* + * Local globals... + */ + +static _pwg_media_t const cups_pwg_media[] = +{ /* Media size lookup table */ + /* North American Standard Sheet Media Sizes */ + _PWG_MEDIA_IN("na_index-3x5_3x5in", NULL, "3x5", 3, 5), + _PWG_MEDIA_IN("na_personal_3.625x6.5in", NULL, "EnvPersonal", 3.625, 6.5), + _PWG_MEDIA_IN("na_monarch_3.875x7.5in", "monarch-envelope", "EnvMonarch", 3.875, 7.5), + _PWG_MEDIA_IN("na_number-9_3.875x8.875in", "na-number-9-envelope", "Env9", 3.875, 8.875), + _PWG_MEDIA_IN("na_index-4x6_4x6in", NULL, "4x6", 4, 6), + _PWG_MEDIA_IN("na_number-10_4.125x9.5in", "na-number-10-envelope", "Env10", 4.125, 9.5), + _PWG_MEDIA_IN("na_a2_4.375x5.75in", NULL, NULL, 4.375, 5.75), + _PWG_MEDIA_IN("na_number-11_4.5x10.375in", NULL, "Env11", 4.5, 10.375), + _PWG_MEDIA_IN("na_number-12_4.75x11in", NULL, "Env12", 4.75, 11), + _PWG_MEDIA_IN("na_5x7_5x7in", NULL, "5x7", 5, 7), + _PWG_MEDIA_IN("na_index-5x8_5x8in", NULL, "5x8", 5, 8), + _PWG_MEDIA_IN("na_number-14_5x11.5in", NULL, "Env14", 5, 11.5), + _PWG_MEDIA_IN("na_invoice_5.5x8.5in", "invoice", "Statement", 5.5, 8.5), + _PWG_MEDIA_IN("na_index-4x6-ext_6x8in", NULL, NULL, 6, 8), + _PWG_MEDIA_IN("na_6x9_6x9in", "na-6x9-envelope", "6x9", 6, 9), + _PWG_MEDIA_IN("na_c5_6.5x9.5in", NULL, "6.5x9.5", 6.5, 9.5), + _PWG_MEDIA_IN("na_7x9_7x9in", "na-7x9-envelope", "7x9", 7, 9), + _PWG_MEDIA_IN("na_executive_7.25x10.5in", "executive", "Executive", 7.25, 10.5), + _PWG_MEDIA_IN("na_govt-letter_8x10in", "na-8x10", "8x10", 8, 10), + _PWG_MEDIA_IN("na_govt-legal_8x13in", NULL, "8x13", 8, 13), + _PWG_MEDIA_IN("na_quarto_8.5x10.83in", "quarto", "Quarto", 8.5, 10.83), + _PWG_MEDIA_IN("na_letter_8.5x11in", "na-letter", "Letter", 8.5, 11), + _PWG_MEDIA_IN("na_fanfold-eur_8.5x12in", NULL, "FanFoldGerman", 8.5, 12), + _PWG_MEDIA_IN("na_letter-plus_8.5x12.69in", NULL, "LetterPlus", 8.5, 12.69), + _PWG_MEDIA_IN("na_foolscap_8.5x13in", NULL, "FanFoldGermanLegal", 8.5, 13), + _PWG_MEDIA_IN("na_legal_8.5x14in", "na-legal", "Legal", 8.5, 14), + _PWG_MEDIA_IN("na_super-a_8.94x14in", NULL, "SuperA", 8.94, 14), + _PWG_MEDIA_IN("na_9x11_9x11in", "na-9x11-envelope", "9x11", 9, 11), + _PWG_MEDIA_IN("na_arch-a_9x12in", "arch-a", "ARCHA", 9, 12), + _PWG_MEDIA_IN("na_letter-extra_9.5x12in", NULL, "LetterExtra", 9.5, 12), + _PWG_MEDIA_IN("na_legal-extra_9.5x15in", NULL, "LegalExtra", 9.5, 15), + _PWG_MEDIA_IN("na_10x11_10x11in", NULL, "10x11", 10, 11), + _PWG_MEDIA_IN("na_10x13_10x13in", "na-10x13-envelope", "10x13", 10, 13), + _PWG_MEDIA_IN("na_10x14_10x14in", "na-10x14-envelope", "10x14", 10, 14), + _PWG_MEDIA_IN("na_10x15_10x15in", "na-10x15-envelope", "10x15", 10, 15), + _PWG_MEDIA_IN("na_11x12_11x12in", NULL, "11x12", 11, 12), + _PWG_MEDIA_IN("na_edp_11x14in", NULL, "11x14", 11, 14), + _PWG_MEDIA_IN("na_fanfold-us_11x14.875in", NULL, NULL, 11, 14.875), + _PWG_MEDIA_IN("na_11x15_11x15in", NULL, "11x15", 11, 15), + _PWG_MEDIA_IN("na_ledger_11x17in", "tabloid", "Tabloid", 11, 17), + _PWG_MEDIA_IN("na_eur-edp_12x14in", NULL, NULL, 12, 14), + _PWG_MEDIA_IN("na_arch-b_12x18in", "arch-b", "ARCHB", 12, 18), + _PWG_MEDIA_IN("na_12x19_12x19in", NULL, "12x19", 12, 19), + _PWG_MEDIA_IN("na_b-plus_12x19.17in", NULL, "SuperB", 12, 19.17), + _PWG_MEDIA_IN("na_super-b_13x19in", "super-b", "13x19", 13, 19), + _PWG_MEDIA_IN("na_c_17x22in", "c", "AnsiC", 17, 22), + _PWG_MEDIA_IN("na_arch-c_18x24in", "arch-c", "ARCHC", 18, 24), + _PWG_MEDIA_IN("na_d_22x34in", "d", "AnsiD", 22, 34), + _PWG_MEDIA_IN("na_arch-d_24x36in", "arch-d", "ARCHD", 24, 36), + _PWG_MEDIA_IN("asme_f_28x40in", "f", NULL, 28, 40), + _PWG_MEDIA_IN("na_wide-format_30x42in", NULL, NULL, 30, 42), + _PWG_MEDIA_IN("na_e_34x44in", "e", "AnsiE", 34, 44), + _PWG_MEDIA_IN("na_arch-e_36x48in", "arch-e", "ARCHE", 36, 48), + _PWG_MEDIA_IN("na_f_44x68in", NULL, "AnsiF", 44, 68), + + /* Chinese Standard Sheet Media Inch Sizes */ + _PWG_MEDIA_IN("roc_16k_7.75x10.75in", NULL, "roc16k", 7.75, 10.75), + _PWG_MEDIA_IN("roc_8k_10.75x15.5in", NULL, "roc8k", 10.75, 15.5), + + /* ISO Standard Sheet Media Sizes */ + _PWG_MEDIA_MM("iso_a10_26x37mm", "iso-a10", "A10", 26, 37), + _PWG_MEDIA_MM("iso_a9_37x52mm", "iso-a9", "A9", 37, 52), + _PWG_MEDIA_MM("iso_a8_52x74mm", "iso-a8", "A8", 52, 74), + _PWG_MEDIA_MM("iso_a7_74x105mm", "iso-a7", "A7", 74, 105), + _PWG_MEDIA_MM("iso_a6_105x148mm", "iso-a6", "A6", 105, 148), + _PWG_MEDIA_MM("iso_a5_148x210mm", "iso-a5", "A5", 148, 210), + _PWG_MEDIA_MM("iso_a5-extra_174x235mm", NULL, "A5Extra", 174, 235), + _PWG_MEDIA_MM("iso_a4_210x297mm", "iso-a4", "A4", 210, 297), + _PWG_MEDIA_MM("iso_a4-tab_225x297mm", NULL, "A4Tab", 225, 297), + _PWG_MEDIA_MM("iso_a4-extra_235.5x322.3mm", NULL, "A4Extra", 235.5, 322.3), + _PWG_MEDIA_MM("iso_a3_297x420mm", "iso-a3", "A3", 297, 420), + _PWG_MEDIA_MM("iso_a4x3_297x630mm", "iso-a4x3", NULL, 297, 630), + _PWG_MEDIA_MM("iso_a4x4_297x841mm", "iso-a4x4", NULL, 297, 841), + _PWG_MEDIA_MM("iso_a4x5_297x1051mm", "iso-a4x5", NULL, 297, 1051), + _PWG_MEDIA_MM("iso_a4x6_297x1261mm", "iso-a4x6", NULL, 297, 1261), + _PWG_MEDIA_MM("iso_a4x7_297x1471mm", "iso-a4x7", NULL, 297, 1471), + _PWG_MEDIA_MM("iso_a4x8_297x1682mm", "iso-a4x8", NULL, 297, 1682), + _PWG_MEDIA_MM("iso_a4x9_297x1892mm", "iso-a4x9", NULL, 297, 1892), + _PWG_MEDIA_MM("iso_a3-extra_322x445mm", "iso-a3-extra", "A3Extra", 322, 445), + _PWG_MEDIA_MM("iso_a2_420x594mm", "iso-a2", "A2", 420, 594), + _PWG_MEDIA_MM("iso_a3x3_420x891mm", "iso-a3x3", NULL, 420, 891), + _PWG_MEDIA_MM("iso_a3x4_420x1189mm", "iso-a3x4", NULL, 420, 1189), + _PWG_MEDIA_MM("iso_a3x5_420x1486mm", "iso-a3x5", NULL, 420, 1486), + _PWG_MEDIA_MM("iso_a3x6_420x1783mm", "iso-a3x6", NULL, 420, 1783), + _PWG_MEDIA_MM("iso_a3x7_420x2080mm", "iso-a3x7", NULL, 420, 2080), + _PWG_MEDIA_MM("iso_a1_594x841mm", "iso-a1", "A1", 594, 841), + _PWG_MEDIA_MM("iso_a2x3_594x1261mm", "iso-a2x3", NULL, 594, 1261), + _PWG_MEDIA_MM("iso_a2x4_594x1682mm", "iso-a2x4", NULL, 594, 1682), + _PWG_MEDIA_MM("iso_a2x5_594x2102mm", "iso-a2x5", NULL, 594, 2102), + _PWG_MEDIA_MM("iso_a0_841x1189mm", "iso-a0", "A0", 841, 1189), + _PWG_MEDIA_MM("iso_a1x3_841x1783mm", "iso-a1x3", NULL, 841, 1783), + _PWG_MEDIA_MM("iso_a1x4_841x2378mm", "iso-a1x4", NULL, 841, 2378), + _PWG_MEDIA_MM("iso_2a0_1189x1682mm", NULL, NULL, 1189, 1682), + _PWG_MEDIA_MM("iso_a0x3_1189x2523mm", NULL, NULL, 1189, 2523), + _PWG_MEDIA_MM("iso_b10_31x44mm", "iso-b10", "ISOB10", 31, 44), + _PWG_MEDIA_MM("iso_b9_44x62mm", "iso-b9", "ISOB9", 44, 62), + _PWG_MEDIA_MM("iso_b8_62x88mm", "iso-b8", "ISOB8", 62, 88), + _PWG_MEDIA_MM("iso_b7_88x125mm", "iso-b7", "ISOB7", 88, 125), + _PWG_MEDIA_MM("iso_b6_125x176mm", "iso-b6", "ISOB6", 125, 176), + _PWG_MEDIA_MM("iso_b6c4_125x324mm", NULL, NULL, 125, 324), + _PWG_MEDIA_MM("iso_b5_176x250mm", "iso-b5", "ISOB5", 176, 250), + _PWG_MEDIA_MM("iso_b5-extra_201x276mm", NULL, "ISOB5Extra", 201, 276), + _PWG_MEDIA_MM("iso_b4_250x353mm", "iso-b4", "ISOB4", 250, 353), + _PWG_MEDIA_MM("iso_b3_353x500mm", "iso-b3", "ISOB3", 353, 500), + _PWG_MEDIA_MM("iso_b2_500x707mm", "iso-b2", "ISOB2", 500, 707), + _PWG_MEDIA_MM("iso_b1_707x1000mm", "iso-b1", "ISOB1", 707, 1000), + _PWG_MEDIA_MM("iso_b0_1000x1414mm", "iso-b0", "ISOB0", 1000, 1414), + _PWG_MEDIA_MM("iso_c10_28x40mm", "iso-c10", NULL, 28, 40), + _PWG_MEDIA_MM("iso_c9_40x57mm", "iso-c9", NULL, 40, 57), + _PWG_MEDIA_MM("iso_c8_57x81mm", "iso-c8", NULL, 57, 81), + _PWG_MEDIA_MM("iso_c7_81x114mm", "iso-c7", "EnvC7", 81, 114), + _PWG_MEDIA_MM("iso_c7c6_81x162mm", NULL, NULL, 81, 162), + _PWG_MEDIA_MM("iso_c6_114x162mm", "iso-c6", "EnvC6", 114, 162), + _PWG_MEDIA_MM("iso_c6c5_114x229mm", NULL, "EnvC65", 114, 229), + _PWG_MEDIA_MM("iso_c5_162x229mm", "iso-c5", "EnvC5", 162, 229), + _PWG_MEDIA_MM("iso_c4_229x324mm", "iso-c4", "EnvC4", 229, 324), + _PWG_MEDIA_MM("iso_c3_324x458mm", "iso-c3", "EnvC3", 324, 458), + _PWG_MEDIA_MM("iso_c2_458x648mm", "iso-c2", "EnvC2", 458, 648), + _PWG_MEDIA_MM("iso_c1_648x917mm", "iso-c1", "EnvC1", 648, 917), + _PWG_MEDIA_MM("iso_c0_917x1297mm", "iso-c0", "EnvC0", 917, 1297), + _PWG_MEDIA_MM("iso_dl_110x220mm", "iso-designated", "EnvDL", 110, 220), + _PWG_MEDIA_MM("iso_ra2_430x610mm", "iso-ra2", NULL, 430, 610), + _PWG_MEDIA_MM("iso_sra2_450x640mm", "iso-sra2", NULL, 450, 640), + _PWG_MEDIA_MM("iso_ra1_610x860mm", "iso-ra1", NULL, 610, 860), + _PWG_MEDIA_MM("iso_sra1_640x900mm", "iso-sra1", NULL, 640, 900), + _PWG_MEDIA_MM("iso_ra0_860x1220mm", "iso-ra0", NULL, 860, 1220), + _PWG_MEDIA_MM("iso_sra0_900x1280mm", "iso-sra0", NULL, 900, 1280), + + /* Japanese Standard Sheet Media Sizes */ + _PWG_MEDIA_MM("jis_b10_32x45mm", "jis-b10", "B10", 32, 45), + _PWG_MEDIA_MM("jis_b9_45x64mm", "jis-b9", "B9", 45, 64), + _PWG_MEDIA_MM("jis_b8_64x91mm", "jis-b8", "B8", 64, 91), + _PWG_MEDIA_MM("jis_b7_91x128mm", "jis-b7", "B7", 91, 128), + _PWG_MEDIA_MM("jis_b6_128x182mm", "jis-b6", "B6", 128, 182), + _PWG_MEDIA_MM("jis_b5_182x257mm", "jis-b5", "B5", 182, 257), + _PWG_MEDIA_MM("jis_b4_257x364mm", "jis-b4", "B4", 257, 364), + _PWG_MEDIA_MM("jis_b3_364x515mm", "jis-b3", "B3", 364, 515), + _PWG_MEDIA_MM("jis_b2_515x728mm", "jis-b2", "B2", 515, 728), + _PWG_MEDIA_MM("jis_b1_728x1030mm", "jis-b1", "B1", 728, 1030), + _PWG_MEDIA_MM("jis_b0_1030x1456mm", "jis-b0", "B0", 1030, 1456), + _PWG_MEDIA_MM("jis_exec_216x330mm", NULL, NULL, 216, 330), + _PWG_MEDIA_MM("jpn_chou4_90x205mm", NULL, "EnvChou4", 90, 205), + _PWG_MEDIA_MM("jpn_hagaki_100x148mm", NULL, "Postcard", 100, 148), + _PWG_MEDIA_MM("jpn_you4_105x235mm", NULL, "EnvYou4", 105, 235), + _PWG_MEDIA_MM("jpn_chou2_111.1x146mm", NULL, NULL, 111.1, 146), + _PWG_MEDIA_MM("jpn_chou3_120x235mm", NULL, "EnvChou3", 120, 235), + _PWG_MEDIA_MM("jpn_oufuku_148x200mm", NULL, "DoublePostcardRotated", 148, 200), + _PWG_MEDIA_MM("jpn_kahu_240x322.1mm", NULL, NULL, 240, 322.1), + _PWG_MEDIA_MM("jpn_kaku2_240x332mm", NULL, "EnvKaku2", 240, 332), + + /* Chinese Standard Sheet Media Sizes */ + _PWG_MEDIA_MM("prc_32k_97x151mm", NULL, "PRC32K", 97, 151), + _PWG_MEDIA_MM("prc_1_102x165mm", NULL, "EnvPRC1", 102, 165), + _PWG_MEDIA_MM("prc_2_102x176mm", NULL, "EnvPRC2", 102, 176), + _PWG_MEDIA_MM("prc_4_110x208mm", NULL, "EnvPRC4", 110, 208), + _PWG_MEDIA_MM("prc_5_110x220mm", NULL, "EnvPRC5", 110, 220), + _PWG_MEDIA_MM("prc_8_120x309mm", NULL, "EnvPRC8", 120, 309), + _PWG_MEDIA_MM("prc_6_120x320mm", NULL, NULL, 120, 320), + _PWG_MEDIA_MM("prc_3_125x176mm", NULL, "EnvPRC3", 125, 176), + _PWG_MEDIA_MM("prc_16k_146x215mm", NULL, "PRC16K", 146, 215), + _PWG_MEDIA_MM("prc_7_160x230mm", NULL, "EnvPRC7", 160, 230), + _PWG_MEDIA_MM("om_juuro-ku-kai_198x275mm", NULL, NULL, 198, 275), + _PWG_MEDIA_MM("om_pa-kai_267x389mm", NULL, NULL, 267, 389), + _PWG_MEDIA_MM("om_dai-pa-kai_275x395mm", NULL, NULL, 275, 395), + _PWG_MEDIA_MM("prc_10_324x458mm", NULL, "EnvPRC10", 324, 458), + + /* Other English Standard Sheet Media Sizes */ + _PWG_MEDIA_IN("oe_photo-l_3.5x5in", NULL, "3.5x5", 3.5, 5), + + /* Other Metric Standard Sheet Media Sizes */ + _PWG_MEDIA_MM("om_small-photo_100x150mm", NULL, NULL, 100, 150), + _PWG_MEDIA_MM("om_italian_110x230mm", NULL, "EnvItalian", 110, 230), + _PWG_MEDIA_MM("om_postfix_114x229mm", NULL, NULL, 114, 229), + _PWG_MEDIA_MM("om_large-photo_200x300", NULL, "om_large-photo", 200, 300), + _PWG_MEDIA_MM("om_folio_210x330mm", "folio", "Folio", 210, 330), + _PWG_MEDIA_MM("om_folio-sp_215x315mm", NULL, "FolioSP", 215, 315), + _PWG_MEDIA_MM("om_invite_220x220mm", NULL, "EnvInvite", 220, 220) +}; + + +/* + * '_pwgGenerateSize()' - Generate a PWG size keyword. + */ + +void +_pwgGenerateSize(char *keyword, /* I - Keyword buffer */ + size_t keysize, /* I - Size of keyword buffer */ + const char *prefix, /* I - Prefix for PWG size or NULL */ + const char *name, /* I - Size name or NULL */ + int width, /* I - Width of page in 2540ths */ + int length) /* I - Length of page in 2540ths */ +{ + struct lconv *loc; /* Locale conversion data */ + double uwidth, /* Width in inches or millimeters */ + ulength; /* Height in inches or millimeters */ + const char *units; /* Units to report */ + char usize[12 + 1 + 12 + 3], /* Unit size: NNNNNNNNNNNNxNNNNNNNNNNNNuu */ + *uptr; /* Pointer into unit size */ + + + loc = localeconv(); + + if ((width % 635) == 0 && (length % 635) == 0) + { + /* + * Use inches since the size is a multiple of 1/4 inch. + */ + + uwidth = width / 2540.0; + ulength = length / 2540.0; + units = "in"; + + if (!prefix) + prefix = "oe"; + } + else + { + /* + * Use millimeters since the size is not a multiple of 1/4 inch. + */ + + uwidth = width * 0.01; + ulength = length * 0.01; + units = "mm"; + + if (!prefix) + prefix = "om"; + } + + uptr = usize; + _cupsStrFormatd(uptr, uptr + 12, uwidth, loc); + uptr += strlen(uptr); + *uptr++ = 'x'; + _cupsStrFormatd(uptr, uptr + 12, ulength, loc); + uptr += strlen(uptr); + + /* + * Safe because usize can hold up to 12 + 1 + 12 + 4 bytes. + */ + + strcpy(uptr, units); + + if (!name) + name = usize; + + /* + * Format the name... + */ + + snprintf(keyword, keysize, "%s_%s_%s", prefix, name, usize); +} + + +/* + * '_pwgInitSize()' - Initialize a PWG size using IPP job template attributes. + */ + +int /* O - 1 if size was initialize, 0 otherwise */ +_pwgInitSize(_pwg_size_t *size, /* I - Size to initialize */ + ipp_t *job, /* I - Job template attributes */ + int *margins_set) /* O - 1 if margins were set, 0 otherwise */ +{ + ipp_attribute_t *media, /* media attribute */ + *media_bottom_margin, /* media-bottom-margin member attribute */ + *media_col, /* media-col attribute */ + *media_left_margin, /* media-left-margin member attribute */ + *media_right_margin, /* media-right-margin member attribute */ + *media_size, /* media-size member attribute */ + *media_top_margin, /* media-top-margin member attribute */ + *x_dimension, /* x-dimension member attribute */ + *y_dimension; /* y-dimension member attribute */ + _pwg_media_t *pwg; /* PWG media value */ + + + /* + * Range check input... + */ + + if (!size || !job || !margins_set) + return (0); + + /* + * Look for media-col and then media... + */ + + memset(size, 0, sizeof(_pwg_size_t)); + *margins_set = 0; + + if ((media_col = ippFindAttribute(job, "media-col", + IPP_TAG_BEGIN_COLLECTION)) != NULL) + { + /* + * Got media-col, look for media-size member attribute... + */ + + if ((media_size = ippFindAttribute(media_col->values[0].collection, + "media-size", + IPP_TAG_BEGIN_COLLECTION)) != NULL) + { + /* + * Got media-size, look for x-dimension and y-dimension member + * attributes... + */ + + x_dimension = ippFindAttribute(media_size->values[0].collection, + "x-dimension", IPP_TAG_INTEGER); + y_dimension = ippFindAttribute(media_size->values[0].collection, + "y-dimension", IPP_TAG_INTEGER); + + if (x_dimension && y_dimension) + { + size->width = x_dimension->values[0].integer; + size->length = y_dimension->values[0].integer; + } + else if (!x_dimension) + { + _cupsSetError(IPP_INTERNAL_ERROR, + _("Missing x-dimension in media-size."), 1); + return (0); + } + else if (!y_dimension) + { + _cupsSetError(IPP_INTERNAL_ERROR, + _("Missing y-dimension in media-size."), 1); + return (0); + } + } + else + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media-size in media-col."), + 1); + return (0); + } + + /* media-*-margin */ + media_bottom_margin = ippFindAttribute(media_col->values[0].collection, + "media-bottom-margin", + IPP_TAG_INTEGER); + media_left_margin = ippFindAttribute(media_col->values[0].collection, + "media-left-margin", + IPP_TAG_INTEGER); + media_right_margin = ippFindAttribute(media_col->values[0].collection, + "media-right-margin", + IPP_TAG_INTEGER); + media_top_margin = ippFindAttribute(media_col->values[0].collection, + "media-top-margin", + IPP_TAG_INTEGER); + if (media_bottom_margin && media_left_margin && media_right_margin && + media_top_margin) + { + *margins_set = 1; + size->bottom = media_bottom_margin->values[0].integer; + size->left = media_left_margin->values[0].integer; + size->right = media_right_margin->values[0].integer; + size->top = media_top_margin->values[0].integer; + } + } + else + { + if ((media = ippFindAttribute(job, "media", IPP_TAG_NAME)) == NULL) + if ((media = ippFindAttribute(job, "media", IPP_TAG_KEYWORD)) == NULL) + if ((media = ippFindAttribute(job, "PageSize", IPP_TAG_NAME)) == NULL) + media = ippFindAttribute(job, "PageRegion", IPP_TAG_NAME); + + if (media) + { + const char *name = media->values[0].string.text; + /* Name string */ + + if ((pwg = _pwgMediaForPWG(name)) == NULL) + { + /* + * Not a PWG name, try a legacy name... + */ + + if ((pwg = _pwgMediaForLegacy(name)) == NULL) + { + /* + * Not a legacy name, try a PPD name... + */ + + const char *suffix; /* Suffix on media string */ + + pwg = _pwgMediaForPPD(name); + if (pwg && + (suffix = name + strlen(name) - 10 /* .FullBleed */) > name && + !_cups_strcasecmp(suffix, ".FullBleed")) + { + /* + * Indicate that margins are set with the default values of 0. + */ + + *margins_set = 1; + } + } + } + + if (pwg) + { + size->width = pwg->width; + size->length = pwg->length; + } + else + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Unsupported media value."), 1); + return (0); + } + } + else + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Missing media or media-col."), 1); + return (0); + } + } + + return (1); +} + + +/* + * '_pwgMediaForLegacy()' - Find a PWG media size by ISO/IPP legacy name. + */ + +_pwg_media_t * /* O - Matching size or NULL */ +_pwgMediaForLegacy( + const char *legacy) /* I - Legacy size name */ +{ + _pwg_media_t key; /* Search key */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (!legacy) + return (NULL); + + /* + * Build the lookup table for PWG names as needed... + */ + + if (!cg->leg_size_lut) + { + int i; /* Looping var */ + _pwg_media_t *size; /* Current size */ + + cg->leg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_legacy, + NULL); + + for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), + size = (_pwg_media_t *)cups_pwg_media; + i > 0; + i --, size ++) + if (size->legacy) + cupsArrayAdd(cg->leg_size_lut, size); + } + + /* + * Lookup the name... + */ + + key.legacy = legacy; + return ((_pwg_media_t *)cupsArrayFind(cg->leg_size_lut, &key)); +} + + +/* + * '_pwgMediaForPPD()' - Find a PWG media size by Adobe PPD name. + */ + +_pwg_media_t * /* O - Matching size or NULL */ +_pwgMediaForPPD(const char *ppd) /* I - PPD size name */ +{ + _pwg_media_t key, /* Search key */ + *size; /* Matching size */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (!ppd) + return (NULL); + + /* + * Build the lookup table for PWG names as needed... + */ + + if (!cg->ppd_size_lut) + { + int i; /* Looping var */ + + cg->ppd_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_ppd, NULL); + + for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), + size = (_pwg_media_t *)cups_pwg_media; + i > 0; + i --, size ++) + if (size->ppd) + cupsArrayAdd(cg->ppd_size_lut, size); + } + + /* + * Lookup the name... + */ + + key.ppd = ppd; + if ((size = (_pwg_media_t *)cupsArrayFind(cg->ppd_size_lut, &key)) == NULL) + { + /* + * See if the name is of the form: + * + * [Custom.]WIDTHxLENGTH[.FullBleed] - Size in points/inches [borderless] + * [Custom.]WIDTHxLENGTHcm[.FullBleed] - Size in centimeters [borderless] + * [Custom.]WIDTHxLENGTHft[.FullBleed] - Size in feet [borderless] + * [Custom.]WIDTHxLENGTHin[.FullBleed] - Size in inches [borderless] + * [Custom.]WIDTHxLENGTHm[.FullBleed] - Size in meters [borderless] + * [Custom.]WIDTHxLENGTHmm[.FullBleed] - Size in millimeters [borderless] + * [Custom.]WIDTHxLENGTHpt[.FullBleed] - Size in points [borderless] + */ + + double w, l, /* Width and length of page */ + factor; /* Unit scaling factor */ + char *ptr; /* Pointer into name */ + struct lconv *loc; /* Locale data */ + int custom; /* Custom page size? */ + + if (!_cups_strncasecmp(ppd, "Custom.", 7)) + { + custom = 1; + factor = 2540.0 / 72.0; + ptr = (char *)ppd + 7; + } + else + { + custom = 0; + factor = 2540.0; + ptr = (char *)ppd; + } + + loc = localeconv(); + w = _cupsStrScand(ptr, &ptr, loc); + + if (ptr && ptr > ppd && *ptr == 'x') + { + l = _cupsStrScand(ptr + 1, &ptr, loc); + + if (ptr && + (!*ptr || + !_cups_strcasecmp(ptr, "FullBleed") || + !_cups_strcasecmp(ptr, ".FullBleed") || + !_cups_strcasecmp(ptr, "cm") || + !_cups_strcasecmp(ptr, "cm.FullBleed") || + !_cups_strcasecmp(ptr, "ft") || + !_cups_strcasecmp(ptr, "ft.FullBleed") || + !_cups_strcasecmp(ptr, "in") || + !_cups_strcasecmp(ptr, "in.FullBleed") || + !_cups_strcasecmp(ptr, "m") || + !_cups_strcasecmp(ptr, "m.FullBleed") || + !_cups_strcasecmp(ptr, "mm") || + !_cups_strcasecmp(ptr, "mm.FullBleed") || + !_cups_strcasecmp(ptr, "pt") || + !_cups_strcasecmp(ptr, "pt.FullBleed"))) + { + size = &(cg->pwg_media); + + if (!_cups_strncasecmp(ptr, "cm", 2)) + factor = 1000.0; + else if (!_cups_strncasecmp(ptr, "ft", 2)) + factor = 2540.0 * 12.0; + else if (!_cups_strncasecmp(ptr, "in", 2)) + factor = 2540.0; + else if (!_cups_strncasecmp(ptr, "mm", 2)) + factor = 100.0; + else if (*ptr == 'm' || *ptr == 'M') + factor = 100000.0; + else if (!_cups_strncasecmp(ptr, "pt", 2)) + factor = 2540.0 / 72.0; + + /* + * Not a standard size; convert it to a PWG custom name of the form: + * + * [oe|om]_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu + */ + + size->width = (int)(w * factor); + size->length = (int)(l * factor); + size->pwg = cg->pwg_name; + + _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name), + custom ? "custom" : NULL, custom ? ppd + 7 : NULL, + size->width, size->length); + } + } + } + + return (size); +} + + +/* + * '_pwgMediaForPWG()' - Find a PWG media size by 5101.1 self-describing name. + */ + +_pwg_media_t * /* O - Matching size or NULL */ +_pwgMediaForPWG(const char *pwg) /* I - PWG size name */ +{ + char *ptr; /* Pointer into name */ + _pwg_media_t key, /* Search key */ + *size; /* Matching size */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (!pwg) + return (NULL); + + /* + * Build the lookup table for PWG names as needed... + */ + + if (!cg->pwg_size_lut) + { + int i; /* Looping var */ + + cg->pwg_size_lut = cupsArrayNew((cups_array_func_t)pwg_compare_pwg, NULL); + + for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), + size = (_pwg_media_t *)cups_pwg_media; + i > 0; + i --, size ++) + cupsArrayAdd(cg->pwg_size_lut, size); + } + + /* + * Lookup the name... + */ + + key.pwg = pwg; + if ((size = (_pwg_media_t *)cupsArrayFind(cg->pwg_size_lut, &key)) == NULL && + (ptr = (char *)strchr(pwg, '_')) != NULL && + (ptr = (char *)strchr(ptr + 1, '_')) != NULL) + { + /* + * Try decoding the self-describing name of the form: + * + * class_name_WWWxHHHin + * class_name_WWWxHHHmm + */ + + double w, l; /* Width and length of page */ + struct lconv *loc; /* Locale data */ + + ptr ++; + loc = localeconv(); + w = _cupsStrScand(ptr, &ptr, loc); + + if (ptr && *ptr == 'x') + { + l = _cupsStrScand(ptr + 1, &ptr, loc); + + if (ptr && (!strcmp(ptr, "in") || !strcmp(ptr, "mm"))) + { + size = &(cg->pwg_media); + + if (!strcmp(ptr, "mm")) + { + size->width = (int)(w * 100); + size->length = (int)(l * 100); + } + else + { + size->width = (int)(w * 2540); + size->length = (int)(l * 2540); + } + + strlcpy(cg->pwg_name, pwg, sizeof(cg->pwg_name)); + size->pwg = cg->pwg_name; + } + } + } + + return (size); +} + + +/* + * '_pwgMediaForSize()' - Get the PWG media name for a given size. + */ + +_pwg_media_t * /* O - PWG media name */ +_pwgMediaForSize(int width, /* I - Width in 2540ths */ + int length) /* I - Length in 2540ths */ +{ + int i; /* Looping var */ + _pwg_media_t *media; /* Current media */ + int dw, dl; /* Difference in width and length */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + /* + * Range check input... + */ + + if (width <= 0 || length <= 0) + return (NULL); + + /* + * Look for a standard size... + */ + + for (i = (int)(sizeof(cups_pwg_media) / sizeof(cups_pwg_media[0])), + media = (_pwg_media_t *)cups_pwg_media; + i > 0; + i --, media ++) + { + /* + * Adobe uses a size matching algorithm with an epsilon of 5 points, which + * is just about 176/2540ths... + */ + + dw = media->width - width; + dl = media->length - length; + + if (dw > -176 && dw < 176 && dl > -176 && dl < 176) + return (media); + } + + /* + * Not a standard size; convert it to a PWG custom name of the form: + * + * custom_WIDTHxHEIGHTuu_WIDTHxHEIGHTuu + */ + + _pwgGenerateSize(cg->pwg_name, sizeof(cg->pwg_name), "custom", NULL, width, + length); + + cg->pwg_media.pwg = cg->pwg_name; + cg->pwg_media.width = width; + cg->pwg_media.length = length; + + return (&(cg->pwg_media)); +} + + +/* + * 'pwg_compare_legacy()' - Compare two sizes using the legacy names. + */ + +static int /* O - Result of comparison */ +pwg_compare_legacy(_pwg_media_t *a, /* I - First size */ + _pwg_media_t *b) /* I - Second size */ +{ + return (strcmp(a->legacy, b->legacy)); +} + + +/* + * 'pwg_compare_ppd()' - Compare two sizes using the PPD names. + */ + +static int /* O - Result of comparison */ +pwg_compare_ppd(_pwg_media_t *a, /* I - First size */ + _pwg_media_t *b) /* I - Second size */ +{ + return (strcmp(a->ppd, b->ppd)); +} + + +/* + * 'pwg_compare_pwg()' - Compare two sizes using the PWG names. + */ + +static int /* O - Result of comparison */ +pwg_compare_pwg(_pwg_media_t *a, /* I - First size */ + _pwg_media_t *b) /* I - Second size */ +{ + return (strcmp(a->pwg, b->pwg)); +} + + +/* + * End of "$Id: pwg-media.c 10340 2012-03-07 17:16:42Z mike $". + */ diff --git a/cups/pwg-private.h b/cups/pwg-private.h new file mode 100644 index 0000000..1d00e83 --- /dev/null +++ b/cups/pwg-private.h @@ -0,0 +1,102 @@ +/* + * "$Id: pwg-private.h 10245 2012-02-11 02:24:44Z mike $" + * + * Private PWG media API definitions for CUPS. + * + * Copyright 2009-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_PWG_PRIVATE_H_ +# define _CUPS_PWG_PRIVATE_H_ + + +/* + * Include necessary headers... + */ + +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Macros... + */ + +/* Convert from points to 2540ths */ +# define _PWG_FROMPTS(n) (int)(((n) * 2540 + 36) / 72) +/* Convert from 2540ths to points */ +# define _PWG_TOPTS(n) ((n) * 72.0 / 2540.0) + + +/* + * Types and structures... + */ + +typedef struct _pwg_map_s /**** Map element - PPD to/from PWG */ +{ + char *pwg, /* PWG media keyword */ + *ppd; /* PPD option keyword */ +} _pwg_map_t; + +typedef struct _pwg_media_s /**** Common media size data ****/ +{ + const char *pwg, /* PWG 5101.1 "self describing" name */ + *legacy, /* IPP/ISO legacy name */ + *ppd; /* Standard Adobe PPD name */ + int width, /* Width in 2540ths */ + length; /* Length in 2540ths */ +} _pwg_media_t; + +typedef struct _pwg_size_s /**** Size element - PPD to/from PWG */ +{ + _pwg_map_t map; /* Map element */ + int width, /* Width in 2540ths */ + length, /* Length in 2540ths */ + left, /* Left margin in 2540ths */ + bottom, /* Bottom margin in 2540ths */ + right, /* Right margin in 2540ths */ + top; /* Top margin in 2540ths */ +} _pwg_size_t; + + +/* + * Functions... + */ + +extern void _pwgGenerateSize(char *keyword, size_t keysize, + const char *prefix, + const char *name, + int width, int length); +extern int _pwgInitSize(_pwg_size_t *size, ipp_t *job, + int *margins_set); +extern _pwg_media_t *_pwgMediaForLegacy(const char *legacy); +extern _pwg_media_t *_pwgMediaForPPD(const char *ppd); +extern _pwg_media_t *_pwgMediaForPWG(const char *pwg); +extern _pwg_media_t *_pwgMediaForSize(int width, int length); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_PWG_PRIVATE_H_ */ + +/* + * End of "$Id: pwg-private.h 10245 2012-02-11 02:24:44Z mike $". + */ diff --git a/cups/raster.h b/cups/raster.h new file mode 100644 index 0000000..0516a93 --- /dev/null +++ b/cups/raster.h @@ -0,0 +1,405 @@ +/* + * "$Id: raster.h 9772 2011-05-12 05:46:30Z mike $" + * + * Raster file definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * This file is part of the CUPS Imaging library. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_RASTER_H_ +# define _CUPS_RASTER_H_ + +/* + * Include necessary headers... + */ + +# include "cups.h" +# include "ppd.h" + + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Every non-PostScript printer driver that supports raster images + * should use the application/vnd.cups-raster image file format. + * Since both the PostScript RIP (pstoraster, based on GNU/GPL + * Ghostscript) and Image RIP (imagetoraster, located in the filter + * directory) use it, using this format saves you a lot of work. + * Also, the PostScript RIP passes any printer options that are in + * a PS file to your driver this way as well... + */ + +/* + * Constants... + */ + +# define CUPS_RASTER_SYNC 0x52615333 /* RaS3 */ +# define CUPS_RASTER_REVSYNC 0x33536152 /* 3SaR */ + +# define CUPS_RASTER_SYNCv1 0x52615374 /* RaSt */ +# define CUPS_RASTER_REVSYNCv1 0x74536152 /* tSaR */ + +# define CUPS_RASTER_SYNCv2 0x52615332 /* RaS2 */ +# define CUPS_RASTER_REVSYNCv2 0x32536152 /* 2SaR */ + +# define CUPS_RASTER_SYNC_PWG CUPS_RASTER_SYNCv2 + + +/* + * The following definition can be used to determine if the + * colorimetric colorspaces (CIEXYZ, CIELAB, and ICCn) are + * defined... + */ + +# define CUPS_RASTER_HAVE_COLORIMETRIC 1 + +/* + * The following definition can be used to determine if the + * device colorspaces (DEVICEn) are defined... + */ + +# define CUPS_RASTER_HAVE_DEVICE 1 + +/* + * The following definition can be used to determine if PWG Raster is supported. + */ + +# define CUPS_RASTER_HAVE_PWGRASTER 1 + + +/* + * Types... + */ + +typedef enum cups_adv_e /**** AdvanceMedia attribute values ****/ +{ + CUPS_ADVANCE_NONE = 0, /* Never advance the roll */ + CUPS_ADVANCE_FILE = 1, /* Advance the roll after this file */ + CUPS_ADVANCE_JOB = 2, /* Advance the roll after this job */ + CUPS_ADVANCE_SET = 3, /* Advance the roll after this set */ + CUPS_ADVANCE_PAGE = 4 /* Advance the roll after this page */ +} cups_adv_t; + +typedef enum cups_bool_e /**** Boolean type ****/ +{ + CUPS_FALSE = 0, /* Logical false */ + CUPS_TRUE = 1 /* Logical true */ +} cups_bool_t; + +typedef enum cups_cspace_e /**** cupsColorSpace attribute values ****/ +{ + CUPS_CSPACE_W = 0, /* Luminance (DeviceGray, gamma 2.2 by default) */ + CUPS_CSPACE_RGB = 1, /* Red, green, blue (DeviceRGB, sRGB by default) */ + CUPS_CSPACE_RGBA = 2, /* Red, green, blue, alpha (DeviceRGB, sRGB by default) */ + CUPS_CSPACE_K = 3, /* Black (DeviceK) */ + CUPS_CSPACE_CMY = 4, /* Cyan, magenta, yellow (DeviceCMY) */ + CUPS_CSPACE_YMC = 5, /* Yellow, magenta, cyan @deprecated@ */ + CUPS_CSPACE_CMYK = 6, /* Cyan, magenta, yellow, black (DeviceCMYK) */ + CUPS_CSPACE_YMCK = 7, /* Yellow, magenta, cyan, black @deprecated@ */ + CUPS_CSPACE_KCMY = 8, /* Black, cyan, magenta, yellow @deprecated@ */ + CUPS_CSPACE_KCMYcm = 9, /* Black, cyan, magenta, yellow, light-cyan, light-magenta @deprecated@ */ + CUPS_CSPACE_GMCK = 10, /* Gold, magenta, yellow, black @deprecated@ */ + CUPS_CSPACE_GMCS = 11, /* Gold, magenta, yellow, silver @deprecated@ */ + CUPS_CSPACE_WHITE = 12, /* White ink (as black) @deprecated@ */ + CUPS_CSPACE_GOLD = 13, /* Gold foil @deprecated@ */ + CUPS_CSPACE_SILVER = 14, /* Silver foil @deprecated@ */ + + CUPS_CSPACE_CIEXYZ = 15, /* CIE XYZ @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_CIELab = 16, /* CIE Lab @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_RGBW = 17, /* Red, green, blue, white (DeviceRGB, sRGB by default) @since CUPS 1.2/Mac OS X 10.5@ */ + CUPS_CSPACE_SW = 18, /* Luminance (gamma 2.2) @since CUPS 1.4.5@ */ + CUPS_CSPACE_SRGB = 19, /* Red, green, blue (sRGB) @since CUPS 1.4.5@ */ + CUPS_CSPACE_ADOBERGB = 20, /* Red, green, blue (Adobe RGB) @since CUPS 1.4.5@ */ + + CUPS_CSPACE_ICC1 = 32, /* ICC-based, 1 color @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC2 = 33, /* ICC-based, 2 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC3 = 34, /* ICC-based, 3 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC4 = 35, /* ICC-based, 4 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC5 = 36, /* ICC-based, 5 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC6 = 37, /* ICC-based, 6 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC7 = 38, /* ICC-based, 7 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC8 = 39, /* ICC-based, 8 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICC9 = 40, /* ICC-based, 9 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCA = 41, /* ICC-based, 10 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCB = 42, /* ICC-based, 11 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCC = 43, /* ICC-based, 12 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCD = 44, /* ICC-based, 13 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCE = 45, /* ICC-based, 14 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + CUPS_CSPACE_ICCF = 46, /* ICC-based, 15 colors @since CUPS 1.1.19/Mac OS X 10.3@ */ + + CUPS_CSPACE_DEVICE1 = 48, /* DeviceN, 1 color @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE2 = 49, /* DeviceN, 2 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE3 = 50, /* DeviceN, 3 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE4 = 51, /* DeviceN, 4 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE5 = 52, /* DeviceN, 5 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE6 = 53, /* DeviceN, 6 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE7 = 54, /* DeviceN, 7 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE8 = 55, /* DeviceN, 8 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICE9 = 56, /* DeviceN, 9 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICEA = 57, /* DeviceN, 10 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICEB = 58, /* DeviceN, 11 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICEC = 59, /* DeviceN, 12 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICED = 60, /* DeviceN, 13 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICEE = 61, /* DeviceN, 14 colors @since CUPS 1.4.5@ */ + CUPS_CSPACE_DEVICEF = 62 /* DeviceN, 15 colors @since CUPS 1.4.5@ */ +} cups_cspace_t; + +typedef enum cups_cut_e /**** CutMedia attribute values ****/ +{ + CUPS_CUT_NONE = 0, /* Never cut the roll */ + CUPS_CUT_FILE = 1, /* Cut the roll after this file */ + CUPS_CUT_JOB = 2, /* Cut the roll after this job */ + CUPS_CUT_SET = 3, /* Cut the roll after this set */ + CUPS_CUT_PAGE = 4 /* Cut the roll after this page */ +} cups_cut_t; + +typedef enum cups_edge_e /**** LeadingEdge attribute values ****/ +{ + CUPS_EDGE_TOP = 0, /* Leading edge is the top of the page */ + CUPS_EDGE_RIGHT = 1, /* Leading edge is the right of the page */ + CUPS_EDGE_BOTTOM = 2, /* Leading edge is the bottom of the page */ + CUPS_EDGE_LEFT = 3 /* Leading edge is the left of the page */ +} cups_edge_t; + +typedef enum cups_jog_e /**** Jog attribute values ****/ +{ + CUPS_JOG_NONE = 0, /* Never move pages */ + CUPS_JOG_FILE = 1, /* Move pages after this file */ + CUPS_JOG_JOB = 2, /* Move pages after this job */ + CUPS_JOG_SET = 3 /* Move pages after this set */ +} cups_jog_t; + +enum cups_mode_e /**** cupsRasterOpen modes ****/ +{ + CUPS_RASTER_READ = 0, /* Open stream for reading */ + CUPS_RASTER_WRITE = 1, /* Open stream for writing */ + CUPS_RASTER_WRITE_COMPRESSED = 2, /* Open stream for compressed writing @since CUPS 1.3/Mac OS X 10.5@ */ + CUPS_RASTER_WRITE_PWG = 3 /* Open stream for compressed writing in PWG mode @since CUPS 1.5/Mac OS X 10.7@ */ +}; + +typedef enum cups_mode_e cups_mode_t; /**** cupsRasterOpen modes ****/ + +typedef enum cups_order_e /**** cupsColorOrder attribute values ****/ +{ + CUPS_ORDER_CHUNKED = 0, /* CMYK CMYK CMYK ... */ + CUPS_ORDER_BANDED = 1, /* CCC MMM YYY KKK ... */ + CUPS_ORDER_PLANAR = 2 /* CCC ... MMM ... YYY ... KKK ... */ +} cups_order_t; + +typedef enum cups_orient_e /**** Orientation attribute values ****/ +{ + CUPS_ORIENT_0 = 0, /* Don't rotate the page */ + CUPS_ORIENT_90 = 1, /* Rotate the page counter-clockwise */ + CUPS_ORIENT_180 = 2, /* Turn the page upside down */ + CUPS_ORIENT_270 = 3 /* Rotate the page clockwise */ +} cups_orient_t; + + +/* + * The page header structure contains the standard PostScript page device + * dictionary, along with some CUPS-specific parameters that are provided + * by the RIPs... + * + * The API supports a "version 1" (from CUPS 1.0 and 1.1) and a "version 2" + * (from CUPS 1.2 and higher) page header, for binary compatibility. + */ + +typedef struct cups_page_header_s /**** Version 1 page header @deprecated@ ****/ +{ + /**** Standard Page Device Dictionary String Values ****/ + char MediaClass[64]; /* MediaClass string */ + char MediaColor[64]; /* MediaColor string */ + char MediaType[64]; /* MediaType string */ + char OutputType[64]; /* OutputType string */ + + /**** Standard Page Device Dictionary Integer Values ****/ + unsigned AdvanceDistance; /* AdvanceDistance value in points */ + cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ + cups_bool_t Collate; /* Collated copies value */ + cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ + cups_bool_t Duplex; /* Duplexed (double-sided) value */ + unsigned HWResolution[2]; /* Resolution in dots-per-inch */ + unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ + cups_bool_t InsertSheet; /* InsertSheet value */ + cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ + cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ + unsigned Margins[2]; /* Lower-lefthand margins in points */ + cups_bool_t ManualFeed; /* ManualFeed value */ + unsigned MediaPosition; /* MediaPosition value */ + unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ + cups_bool_t MirrorPrint; /* MirrorPrint value */ + cups_bool_t NegativePrint; /* NegativePrint value */ + unsigned NumCopies; /* Number of copies to produce */ + cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ + cups_bool_t OutputFaceUp; /* OutputFaceUp value */ + unsigned PageSize[2]; /* Width and length of page in points */ + cups_bool_t Separations; /* Separations value */ + cups_bool_t TraySwitch; /* TraySwitch value */ + cups_bool_t Tumble; /* Tumble value */ + + /**** CUPS Page Device Dictionary Values ****/ + unsigned cupsWidth; /* Width of page image in pixels */ + unsigned cupsHeight; /* Height of page image in pixels */ + unsigned cupsMediaType; /* Media type code */ + unsigned cupsBitsPerColor; /* Number of bits for each color */ + unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ + unsigned cupsBytesPerLine; /* Number of bytes per line */ + cups_order_t cupsColorOrder; /* Order of colors */ + cups_cspace_t cupsColorSpace; /* True colorspace */ + unsigned cupsCompression; /* Device compression to use */ + unsigned cupsRowCount; /* Rows per band */ + unsigned cupsRowFeed; /* Feed between bands */ + unsigned cupsRowStep; /* Spacing between lines */ +} cups_page_header_t; + +/**** New in CUPS 1.2 ****/ +typedef struct cups_page_header2_s /**** Version 2 page header @since CUPS 1.2/Mac OS X 10.5@ ****/ +{ + /**** Standard Page Device Dictionary String Values ****/ + char MediaClass[64]; /* MediaClass string */ + char MediaColor[64]; /* MediaColor string */ + char MediaType[64]; /* MediaType string */ + char OutputType[64]; /* OutputType string */ + + /**** Standard Page Device Dictionary Integer Values ****/ + unsigned AdvanceDistance; /* AdvanceDistance value in points */ + cups_adv_t AdvanceMedia; /* AdvanceMedia value (@link cups_adv_t@) */ + cups_bool_t Collate; /* Collated copies value */ + cups_cut_t CutMedia; /* CutMedia value (@link cups_cut_t@) */ + cups_bool_t Duplex; /* Duplexed (double-sided) value */ + unsigned HWResolution[2]; /* Resolution in dots-per-inch */ + unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points, left, bottom, right, top) */ + cups_bool_t InsertSheet; /* InsertSheet value */ + cups_jog_t Jog; /* Jog value (@link cups_jog_t@) */ + cups_edge_t LeadingEdge; /* LeadingEdge value (@link cups_edge_t@) */ + unsigned Margins[2]; /* Lower-lefthand margins in points */ + cups_bool_t ManualFeed; /* ManualFeed value */ + unsigned MediaPosition; /* MediaPosition value */ + unsigned MediaWeight; /* MediaWeight value in grams/m^2 */ + cups_bool_t MirrorPrint; /* MirrorPrint value */ + cups_bool_t NegativePrint; /* NegativePrint value */ + unsigned NumCopies; /* Number of copies to produce */ + cups_orient_t Orientation; /* Orientation value (@link cups_orient_t@) */ + cups_bool_t OutputFaceUp; /* OutputFaceUp value */ + unsigned PageSize[2]; /* Width and length of page in points */ + cups_bool_t Separations; /* Separations value */ + cups_bool_t TraySwitch; /* TraySwitch value */ + cups_bool_t Tumble; /* Tumble value */ + + /**** CUPS Page Device Dictionary Values ****/ + unsigned cupsWidth; /* Width of page image in pixels */ + unsigned cupsHeight; /* Height of page image in pixels */ + unsigned cupsMediaType; /* Media type code */ + unsigned cupsBitsPerColor; /* Number of bits for each color */ + unsigned cupsBitsPerPixel; /* Number of bits for each pixel */ + unsigned cupsBytesPerLine; /* Number of bytes per line */ + cups_order_t cupsColorOrder; /* Order of colors */ + cups_cspace_t cupsColorSpace; /* True colorspace */ + unsigned cupsCompression; /* Device compression to use */ + unsigned cupsRowCount; /* Rows per band */ + unsigned cupsRowFeed; /* Feed between bands */ + unsigned cupsRowStep; /* Spacing between lines */ + + /**** Version 2 Dictionary Values ****/ + unsigned cupsNumColors; /* Number of color compoents @since CUPS 1.2/Mac OS X 10.5@ */ + float cupsBorderlessScalingFactor; + /* Scaling that was applied to page data @since CUPS 1.2/Mac OS X 10.5@ */ + float cupsPageSize[2]; /* Floating point PageSize (scaling * + * factor not applied) @since CUPS 1.2/Mac OS X 10.5@ */ + float cupsImagingBBox[4]; /* Floating point ImagingBoundingBox + * (scaling factor not applied, left, + * bottom, right, top) @since CUPS 1.2/Mac OS X 10.5@ */ + unsigned cupsInteger[16]; /* User-defined integer values @since CUPS 1.2/Mac OS X 10.5@ */ + float cupsReal[16]; /* User-defined floating-point values @since CUPS 1.2/Mac OS X 10.5@ */ + char cupsString[16][64]; /* User-defined string values @since CUPS 1.2/Mac OS X 10.5@ */ + char cupsMarkerType[64]; /* Ink/toner type @since CUPS 1.2/Mac OS X 10.5@ */ + char cupsRenderingIntent[64];/* Color rendering intent @since CUPS 1.2/Mac OS X 10.5@ */ + char cupsPageSizeName[64]; /* PageSize name @since CUPS 1.2/Mac OS X 10.5@ */ +} cups_page_header2_t; + +typedef struct _cups_raster_s cups_raster_t; + /**** Raster stream data ****/ + +typedef int (*cups_interpret_cb_t)(cups_page_header2_t *header, int preferred_bits); + /**** cupsRasterInterpretPPD callback function + * + * This function is called by + * @link cupsRasterInterpretPPD@ to + * validate (and update, as needed) + * the page header attributes. The + * "preferred_bits" argument provides + * the value of the + * @code cupsPreferredBitsPerColor@ + * key from the PostScript page device + * dictionary and is 0 if undefined. + ****/ + +/**** New in CUPS 1.5 ****/ +typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); + /**** cupsRasterOpenIO callback function + * + * This function is specified when + * creating a raster stream with + * @link cupsRasterOpenIO@ and handles + * generic reading and writing of raster + * data. It must return -1 on error or + * the number of bytes specified by + * "length" on success. + ****/ + + +/* + * Prototypes... + */ + +extern void cupsRasterClose(cups_raster_t *r); +extern cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode); +extern unsigned cupsRasterReadHeader(cups_raster_t *r, + cups_page_header_t *h) _CUPS_DEPRECATED; +extern unsigned cupsRasterReadPixels(cups_raster_t *r, + unsigned char *p, unsigned len); +extern unsigned cupsRasterWriteHeader(cups_raster_t *r, + cups_page_header_t *h) _CUPS_DEPRECATED; +extern unsigned cupsRasterWritePixels(cups_raster_t *r, + unsigned char *p, unsigned len); + +/**** New in CUPS 1.2 ****/ +extern int cupsRasterInterpretPPD(cups_page_header2_t *h, + ppd_file_t *ppd, + int num_options, + cups_option_t *options, + cups_interpret_cb_t func) _CUPS_API_1_2; +extern unsigned cupsRasterReadHeader2(cups_raster_t *r, + cups_page_header2_t *h) _CUPS_API_1_2; +extern unsigned cupsRasterWriteHeader2(cups_raster_t *r, + cups_page_header2_t *h) _CUPS_API_1_2; + +/**** New in CUPS 1.3 ****/ +extern const char *cupsRasterErrorString(void) _CUPS_API_1_3; + +/**** New in CUPS 1.5 ****/ +extern cups_raster_t *cupsRasterOpenIO(cups_raster_iocb_t iocb, void *ctx, + cups_mode_t mode); + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_RASTER_H_ */ + +/* + * End of "$Id: raster.h 9772 2011-05-12 05:46:30Z mike $". + */ diff --git a/cups/request.c b/cups/request.c new file mode 100644 index 0000000..885c01b --- /dev/null +++ b/cups/request.c @@ -0,0 +1,1149 @@ +/* + * "$Id: request.c 10015 2011-09-21 22:09:29Z mike $" + * + * IPP utilities for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsDoFileRequest() - Do an IPP request with a file. + * cupsDoIORequest() - Do an IPP request with file descriptors. + * cupsDoRequest() - Do an IPP request. + * cupsGetResponse() - Get a response to an IPP request. + * cupsLastError() - Return the last IPP status code. + * cupsLastErrorString() - Return the last IPP status-message. + * _cupsNextDelay() - Return the next retry delay value. + * cupsReadResponseData() - Read additional data after the IPP response. + * cupsSendRequest() - Send an IPP request. + * cupsWriteRequestData() - Write additional data after an IPP request. + * _cupsConnect() - Get the default server connection... + * _cupsSetError() - Set the last IPP status code and status-message. + * _cupsSetHTTPError() - Set the last error using the HTTP status. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ +#ifndef O_BINARY +# define O_BINARY 0 +#endif /* O_BINARY */ + + +/* + * 'cupsDoFileRequest()' - Do an IPP request with a file. + * + * This function sends the IPP request to the specified server, retrying + * and authenticating as necessary. The request is freed with @link ippDelete@ + * after receiving a valid IPP response. + */ + +ipp_t * /* O - Response data */ +cupsDoFileRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + ipp_t *request, /* I - IPP request */ + const char *resource, /* I - HTTP resource for POST */ + const char *filename) /* I - File to send or @code NULL@ for none */ +{ + ipp_t *response; /* IPP response data */ + int infile; /* Input file */ + + + DEBUG_printf(("cupsDoFileRequest(http=%p, request=%p(%s), resource=\"%s\", " + "filename=\"%s\")", http, request, + request ? ippOpString(request->request.op.operation_id) : "?", + resource, filename)); + + if (filename) + { + if ((infile = open(filename, O_RDONLY | O_BINARY)) < 0) + { + /* + * Can't get file information! + */ + + _cupsSetError(errno == ENOENT ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED, + NULL, 0); + + ippDelete(request); + + return (NULL); + } + } + else + infile = -1; + + response = cupsDoIORequest(http, request, resource, infile, -1); + + if (infile >= 0) + close(infile); + + return (response); +} + + +/* + * 'cupsDoIORequest()' - Do an IPP request with file descriptors. + * + * This function sends the IPP request to the specified server, retrying + * and authenticating as necessary. The request is freed with ippDelete() + * after receiving a valid IPP response. + * + * If "infile" is a valid file descriptor, cupsDoIORequest() copies + * all of the data from the file after the IPP request message. + * + * If "outfile" is a valid file descriptor, cupsDoIORequest() copies + * all of the data after the IPP response message to the file. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +ipp_t * /* O - Response data */ +cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + ipp_t *request, /* I - IPP request */ + const char *resource, /* I - HTTP resource for POST */ + int infile, /* I - File to read from or -1 for none */ + int outfile) /* I - File to write to or -1 for none */ +{ + ipp_t *response = NULL; /* IPP response data */ + size_t length = 0; /* Content-Length value */ + http_status_t status; /* Status of HTTP request */ + struct stat fileinfo; /* File information */ + int bytes; /* Number of bytes read/written */ + char buffer[32768]; /* Output buffer */ + + + DEBUG_printf(("cupsDoIORequest(http=%p, request=%p(%s), resource=\"%s\", " + "infile=%d, outfile=%d)", http, request, + request ? ippOpString(request->request.op.operation_id) : "?", + resource, infile, outfile)); + + /* + * Range check input... + */ + + if (!request || !resource) + { + ippDelete(request); + + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (NULL); + } + + /* + * Get the default connection as needed... + */ + + if (!http) + if ((http = _cupsConnect()) == NULL) + { + ippDelete(request); + + return (NULL); + } + + /* + * See if we have a file to send... + */ + + if (infile >= 0) + { + if (fstat(infile, &fileinfo)) + { + /* + * Can't get file information! + */ + + _cupsSetError(errno == EBADF ? IPP_NOT_FOUND : IPP_NOT_AUTHORIZED, + NULL, 0); + + ippDelete(request); + + return (NULL); + } + +#ifdef WIN32 + if (fileinfo.st_mode & _S_IFDIR) +#else + if (S_ISDIR(fileinfo.st_mode)) +#endif /* WIN32 */ + { + /* + * Can't send a directory... + */ + + ippDelete(request); + + _cupsSetError(IPP_NOT_POSSIBLE, strerror(EISDIR), 0); + + return (NULL); + } + +#ifndef WIN32 + if (!S_ISREG(fileinfo.st_mode)) + length = 0; /* Chunk when piping */ + else +#endif /* !WIN32 */ + length = ippLength(request) + fileinfo.st_size; + } + else + length = ippLength(request); + + DEBUG_printf(("2cupsDoIORequest: Request length=%ld, total length=%ld", + (long)ippLength(request), (long)length)); + + /* + * Clear any "Local" authentication data since it is probably stale... + */ + + if (http->authstring && !strncmp(http->authstring, "Local ", 6)) + httpSetAuthString(http, NULL, NULL); + + /* + * Loop until we can send the request without authorization problems. + */ + + while (response == NULL) + { + DEBUG_puts("2cupsDoIORequest: setup..."); + + /* + * Send the request... + */ + + status = cupsSendRequest(http, request, resource, length); + + DEBUG_printf(("2cupsDoIORequest: status=%d", status)); + + if (status == HTTP_CONTINUE && request->state == IPP_DATA && infile >= 0) + { + DEBUG_puts("2cupsDoIORequest: file write..."); + + /* + * Send the file with the request... + */ + +#ifndef WIN32 + if (S_ISREG(fileinfo.st_mode)) +#endif /* WIN32 */ + lseek(infile, 0, SEEK_SET); + + while ((bytes = (int)read(infile, buffer, sizeof(buffer))) > 0) + { + if ((status = cupsWriteRequestData(http, buffer, bytes)) + != HTTP_CONTINUE) + break; + } + } + + /* + * Get the server's response... + */ + + if (status != HTTP_ERROR) + { + response = cupsGetResponse(http, resource); + status = httpGetStatus(http); + } + + DEBUG_printf(("2cupsDoIORequest: status=%d", status)); + + if (status == HTTP_ERROR || + (status >= HTTP_BAD_REQUEST && status != HTTP_UNAUTHORIZED && + status != HTTP_UPGRADE_REQUIRED)) + { + _cupsSetHTTPError(status); + break; + } + + if (response && outfile >= 0) + { + /* + * Write trailing data to file... + */ + + while ((bytes = (int)httpRead2(http, buffer, sizeof(buffer))) > 0) + if (write(outfile, buffer, bytes) < bytes) + break; + } + + if (http->state != HTTP_WAITING) + { + /* + * Flush any remaining data... + */ + + httpFlush(http); + } + } + + /* + * Delete the original request and return the response... + */ + + ippDelete(request); + + return (response); +} + + +/* + * 'cupsDoRequest()' - Do an IPP request. + * + * This function sends the IPP request to the specified server, retrying + * and authenticating as necessary. The request is freed with ippDelete() + * after receiving a valid IPP response. + */ + +ipp_t * /* O - Response data */ +cupsDoRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + ipp_t *request, /* I - IPP request */ + const char *resource) /* I - HTTP resource for POST */ +{ + DEBUG_printf(("cupsDoRequest(http=%p, request=%p(%s), resource=\"%s\")", + http, request, + request ? ippOpString(request->request.op.operation_id) : "?", + resource)); + + return (cupsDoIORequest(http, request, resource, -1, -1)); +} + + +/* + * 'cupsGetResponse()' - Get a response to an IPP request. + * + * Use this function to get the response for an IPP request sent using + * cupsSendDocument() or cupsSendRequest(). For requests that return + * additional data, use httpRead() after getting a successful response, + * otherwise call httpFlush() to complete the response processing. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ipp_t * /* O - Response or @code NULL@ on HTTP error */ +cupsGetResponse(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *resource) /* I - HTTP resource for POST */ +{ + http_status_t status; /* HTTP status */ + ipp_state_t state; /* IPP read state */ + ipp_t *response = NULL; /* IPP response */ + + + DEBUG_printf(("cupsGetResponse(http=%p, resource=\"%s\")", http, resource)); + + /* + * Connect to the default server as needed... + */ + + if (!http) + http = _cupsConnect(); + + if (!http || (http->state != HTTP_POST_RECV && http->state != HTTP_POST_SEND)) + return (NULL); + + /* + * Check for an unfinished chunked request... + */ + + if (http->data_encoding == HTTP_ENCODE_CHUNKED) + { + /* + * Send a 0-length chunk to finish off the request... + */ + + DEBUG_puts("2cupsGetResponse: Finishing chunked POST..."); + + if (httpWrite2(http, "", 0) < 0) + return (NULL); + } + + /* + * Wait for a response from the server... + */ + + DEBUG_printf(("2cupsGetResponse: Update loop, http->status=%d...", + http->status)); + + do + { + status = httpUpdate(http); + } + while (status != HTTP_ERROR && http->state == HTTP_POST_RECV); + + DEBUG_printf(("2cupsGetResponse: status=%d", status)); + + if (status == HTTP_OK) + { + /* + * Get the IPP response... + */ + + response = ippNew(); + + while ((state = ippRead(http, response)) != IPP_DATA) + if (state == IPP_ERROR) + break; + + if (state == IPP_ERROR) + { + /* + * Flush remaining data and delete the response... + */ + + DEBUG_puts("1cupsGetResponse: IPP read error!"); + + httpFlush(http); + + ippDelete(response); + response = NULL; + + _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0); + http->status = status = HTTP_ERROR; + http->error = EIO; + } + } + else if (status != HTTP_ERROR) + { + /* + * Flush any error message... + */ + + httpFlush(http); + + /* + * Then handle encryption and authentication... + */ + + if (status == HTTP_UNAUTHORIZED) + { + /* + * See if we can do authentication... + */ + + DEBUG_puts("2cupsGetResponse: Need authorization..."); + + if (!cupsDoAuthentication(http, "POST", resource)) + httpReconnect(http); + else + http->status = status = HTTP_AUTHORIZATION_CANCELED; + } + +#ifdef HAVE_SSL + else if (status == HTTP_UPGRADE_REQUIRED) + { + /* + * Force a reconnect with encryption... + */ + + DEBUG_puts("2cupsGetResponse: Need encryption..."); + + if (!httpReconnect(http)) + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); + } +#endif /* HAVE_SSL */ + } + + if (response) + { + ipp_attribute_t *attr; /* status-message attribute */ + + + attr = ippFindAttribute(response, "status-message", IPP_TAG_TEXT); + + DEBUG_printf(("1cupsGetResponse: status-code=%s, status-message=\"%s\"", + ippErrorString(response->request.status.status_code), + attr ? attr->values[0].string.text : "")); + + _cupsSetError(response->request.status.status_code, + attr ? attr->values[0].string.text : + ippErrorString(response->request.status.status_code), 0); + } + else if (status == HTTP_ERROR) + _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0); + else if (status != HTTP_OK) + _cupsSetHTTPError(status); + + return (response); +} + + +/* + * 'cupsLastError()' - Return the last IPP status code. + */ + +ipp_status_t /* O - IPP status code from last request */ +cupsLastError(void) +{ + return (_cupsGlobals()->last_error); +} + + +/* + * 'cupsLastErrorString()' - Return the last IPP status-message. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +const char * /* O - status-message text from last request */ +cupsLastErrorString(void) +{ + return (_cupsGlobals()->last_status_message); +} + + +/* + * '_cupsNextDelay()' - Return the next retry delay value. + * + * This function currently returns the Fibonacci sequence 1 1 2 3 5 8. + * + * Pass 0 for the current delay value to initialize the sequence. + */ + +int /* O - Next delay value */ +_cupsNextDelay(int current, /* I - Current delay value or 0 */ + int *previous) /* IO - Previous delay value */ +{ + int next; /* Next delay value */ + + + if (current > 0) + { + next = (current + *previous) % 12; + *previous = next < current ? 0 : current; + } + else + { + next = 1; + *previous = 0; + } + + return (next); +} + + +/* + * 'cupsReadResponseData()' - Read additional data after the IPP response. + * + * This function is used after cupsGetResponse() to read the PPD or document + * files for CUPS_GET_PPD and CUPS_GET_DOCUMENT requests, respectively. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ssize_t /* O - Bytes read, 0 on EOF, -1 on error */ +cupsReadResponseData( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + char *buffer, /* I - Buffer to use */ + size_t length) /* I - Number of bytes to read */ +{ + /* + * Get the default connection as needed... + */ + + DEBUG_printf(("cupsReadResponseData(http=%p, buffer=%p, " + "length=" CUPS_LLFMT ")", http, buffer, CUPS_LLCAST length)); + + if (!http) + { + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + + if ((http = cg->http) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1); + return (-1); + } + } + + /* + * Then read from the HTTP connection... + */ + + return (httpRead2(http, buffer, length)); +} + + +/* + * 'cupsSendRequest()' - Send an IPP request. + * + * Use httpWrite() to write any additional data (document, PPD file, etc.) + * for the request, cupsGetResponse() to get the IPP response, and httpRead() + * to read any additional data following the response. Only one request can be + * sent/queued at a time. + * + * Unlike cupsDoFileRequest(), cupsDoIORequest(), and cupsDoRequest(), the + * request is not freed. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +http_status_t /* O - Initial HTTP status */ +cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + ipp_t *request, /* I - IPP request */ + const char *resource, /* I - Resource path */ + size_t length) /* I - Length of data to follow or @code CUPS_LENGTH_VARIABLE@ */ +{ + http_status_t status; /* Status of HTTP request */ + int got_status; /* Did we get the status? */ + ipp_state_t state; /* State of IPP processing */ + http_status_t expect; /* Expect: header to use */ + + + DEBUG_printf(("cupsSendRequest(http=%p, request=%p(%s), resource=\"%s\", " + "length=" CUPS_LLFMT ")", http, request, + request ? ippOpString(request->request.op.operation_id) : "?", + resource, CUPS_LLCAST length)); + + /* + * Range check input... + */ + + if (!request || !resource) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (HTTP_ERROR); + } + + /* + * Get the default connection as needed... + */ + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_SERVICE_UNAVAILABLE); + + /* + * If the prior request was not flushed out, do so now... + */ + + if (http->state == HTTP_GET_SEND || + http->state == HTTP_POST_SEND) + { + DEBUG_puts("2cupsSendRequest: Flush prior response."); + httpFlush(http); + } + else if (http->state != HTTP_WAITING) + { + DEBUG_printf(("1cupsSendRequest: Unknown HTTP state (%d), bailing.", + http->state)); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (HTTP_ERROR); + } + +#ifdef HAVE_SSL + /* + * See if we have an auth-info attribute and are communicating over + * a non-local link. If so, encrypt the link so that we can pass + * the authentication information securely... + */ + + if (ippFindAttribute(request, "auth-info", IPP_TAG_TEXT) && + !httpAddrLocalhost(http->hostaddr) && !http->tls && + httpEncryption(http, HTTP_ENCRYPT_REQUIRED)) + { + DEBUG_puts("1cupsSendRequest: Unable to encrypt connection."); + return (HTTP_SERVICE_UNAVAILABLE); + } +#endif /* HAVE_SSL */ + + /* + * Reconnect if the last response had a "Connection: close"... + */ + + if (!_cups_strcasecmp(http->fields[HTTP_FIELD_CONNECTION], "close")) + { + DEBUG_puts("2cupsSendRequest: Connection: close"); + httpClearFields(http); + if (httpReconnect(http)) + { + DEBUG_puts("1cupsSendRequest: Unable to reconnect."); + return (HTTP_SERVICE_UNAVAILABLE); + } + } + + /* + * Loop until we can send the request without authorization problems. + */ + + expect = HTTP_CONTINUE; + + for (;;) + { + DEBUG_puts("2cupsSendRequest: Setup..."); + + /* + * Setup the HTTP variables needed... + */ + + httpClearFields(http); + httpSetExpect(http, expect); + httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp"); + httpSetLength(http, length); + +#ifdef HAVE_GSSAPI + if (http->authstring && !strncmp(http->authstring, "Negotiate", 9)) + { + /* + * Do not use cached Kerberos credentials since they will look like a + * "replay" attack... + */ + + _cupsSetNegotiateAuthString(http, "POST", resource); + } +#endif /* HAVE_GSSAPI */ + + httpSetField(http, HTTP_FIELD_AUTHORIZATION, http->authstring); + + DEBUG_printf(("2cupsSendRequest: authstring=\"%s\"", http->authstring)); + + /* + * Try the request... + */ + + DEBUG_puts("2cupsSendRequest: Sending HTTP POST..."); + + if (httpPost(http, resource)) + { + DEBUG_puts("2cupsSendRequest: POST failed, reconnecting."); + if (httpReconnect(http)) + { + DEBUG_puts("1cupsSendRequest: Unable to reconnect."); + return (HTTP_SERVICE_UNAVAILABLE); + } + else + continue; + } + + /* + * Send the IPP data... + */ + + DEBUG_puts("2cupsSendRequest: Writing IPP request..."); + + request->state = IPP_IDLE; + status = HTTP_CONTINUE; + got_status = 0; + + while ((state = ippWrite(http, request)) != IPP_DATA) + if (state == IPP_ERROR) + break; + else if (httpCheck(http)) + { + got_status = 1; + + _httpUpdate(http, &status); + if (status >= HTTP_MULTIPLE_CHOICES) + break; + } + + if (state == IPP_ERROR) + { + DEBUG_puts("1cupsSendRequest: Unable to send IPP request."); + + http->status = HTTP_ERROR; + http->state = HTTP_WAITING; + + return (HTTP_ERROR); + } + + /* + * Wait up to 1 second to get the 100-continue response as needed... + */ + + if (!got_status) + { + if (expect == HTTP_CONTINUE) + { + DEBUG_puts("2cupsSendRequest: Waiting for 100-continue..."); + + if (httpWait(http, 1000)) + _httpUpdate(http, &status); + } + else if (httpCheck(http)) + _httpUpdate(http, &status); + } + + DEBUG_printf(("2cupsSendRequest: status=%d", status)); + + /* + * Process the current HTTP status... + */ + + if (status >= HTTP_MULTIPLE_CHOICES) + { + _cupsSetHTTPError(status); + + do + { + status = httpUpdate(http); + } + while (status != HTTP_ERROR && http->state == HTTP_POST_RECV); + + httpFlush(http); + } + + switch (status) + { + case HTTP_ERROR : + case HTTP_CONTINUE : + case HTTP_OK : + DEBUG_printf(("1cupsSendRequest: Returning %d.", status)); + return (status); + + case HTTP_UNAUTHORIZED : + if (cupsDoAuthentication(http, "POST", resource)) + { + DEBUG_puts("1cupsSendRequest: Returning HTTP_AUTHORIZATION_CANCELED."); + return (HTTP_AUTHORIZATION_CANCELED); + } + + DEBUG_puts("2cupsSendRequest: Reconnecting after HTTP_UNAUTHORIZED."); + + if (httpReconnect(http)) + { + DEBUG_puts("1cupsSendRequest: Unable to reconnect."); + return (HTTP_SERVICE_UNAVAILABLE); + } + break; + +#ifdef HAVE_SSL + case HTTP_UPGRADE_REQUIRED : + /* + * Flush any error message, reconnect, and then upgrade with + * encryption... + */ + + DEBUG_puts("2cupsSendRequest: Reconnecting after " + "HTTP_UPGRADE_REQUIRED."); + + if (httpReconnect(http)) + { + DEBUG_puts("1cupsSendRequest: Unable to reconnect."); + return (HTTP_SERVICE_UNAVAILABLE); + } + + DEBUG_puts("2cupsSendRequest: Upgrading to TLS."); + if (httpEncryption(http, HTTP_ENCRYPT_REQUIRED)) + { + DEBUG_puts("1cupsSendRequest: Unable to encrypt connection."); + return (HTTP_SERVICE_UNAVAILABLE); + } + break; +#endif /* HAVE_SSL */ + + case HTTP_EXPECTATION_FAILED : + /* + * Don't try using the Expect: header the next time around... + */ + + expect = (http_status_t)0; + + DEBUG_puts("2cupsSendRequest: Reconnecting after " + "HTTP_EXPECTATION_FAILED."); + + if (httpReconnect(http)) + { + DEBUG_puts("1cupsSendRequest: Unable to reconnect."); + return (HTTP_SERVICE_UNAVAILABLE); + } + break; + + default : + /* + * Some other error... + */ + + return (status); + } + } +} + + +/* + * 'cupsWriteRequestData()' - Write additional data after an IPP request. + * + * This function is used after @link cupsSendRequest@ to provide a PPD and + * after @link cupsStartDocument@ to provide a document file. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +http_status_t /* O - @code HTTP_CONTINUE@ if OK or HTTP status on error */ +cupsWriteRequestData( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *buffer, /* I - Bytes to write */ + size_t length) /* I - Number of bytes to write */ +{ + int wused; /* Previous bytes in buffer */ + + + /* + * Get the default connection as needed... + */ + + DEBUG_printf(("cupsWriteRequestData(http=%p, buffer=%p, " + "length=" CUPS_LLFMT ")", http, buffer, CUPS_LLCAST length)); + + if (!http) + { + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + + if ((http = cg->http) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("No active connection"), 1); + DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR."); + return (HTTP_ERROR); + } + } + + /* + * Then write to the HTTP connection... + */ + + wused = http->wused; + + if (httpWrite2(http, buffer, length) < 0) + { + DEBUG_puts("1cupsWriteRequestData: Returning HTTP_ERROR."); + _cupsSetError(IPP_INTERNAL_ERROR, strerror(http->error), 0); + return (HTTP_ERROR); + } + + /* + * Finally, check if we have any pending data from the server... + */ + + if (length >= HTTP_MAX_BUFFER || + http->wused < wused || + (wused > 0 && http->wused == length)) + { + /* + * We've written something to the server, so check for response data... + */ + + if (_httpWait(http, 0, 1)) + { + http_status_t status; /* Status from _httpUpdate */ + + _httpUpdate(http, &status); + if (status >= HTTP_MULTIPLE_CHOICES) + { + _cupsSetHTTPError(status); + + do + { + status = httpUpdate(http); + } + while (status != HTTP_ERROR && http->state == HTTP_POST_RECV); + + httpFlush(http); + } + + DEBUG_printf(("1cupsWriteRequestData: Returning %d.\n", status)); + return (status); + } + } + + DEBUG_puts("1cupsWriteRequestData: Returning HTTP_CONTINUE."); + return (HTTP_CONTINUE); +} + + +/* + * '_cupsConnect()' - Get the default server connection... + */ + +http_t * /* O - HTTP connection */ +_cupsConnect(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * See if we are connected to the same server... + */ + + if (cg->http) + { + /* + * Compare the connection hostname, port, and encryption settings to + * the cached defaults; these were initialized the first time we + * connected... + */ + + if (strcmp(cg->http->hostname, cg->server) || + cg->ipp_port != _httpAddrPort(cg->http->hostaddr) || + (cg->http->encryption != cg->encryption && + cg->http->encryption == HTTP_ENCRYPT_NEVER)) + { + /* + * Need to close the current connection because something has changed... + */ + + httpClose(cg->http); + cg->http = NULL; + } + } + + /* + * (Re)connect as needed... + */ + + if (!cg->http) + { + if ((cg->http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + if (errno) + _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0); + else + _cupsSetError(IPP_SERVICE_UNAVAILABLE, + _("Unable to connect to host."), 1); + } + } + + /* + * Return the cached connection... + */ + + return (cg->http); +} + + +/* + * '_cupsSetError()' - Set the last IPP status code and status-message. + */ + +void +_cupsSetError(ipp_status_t status, /* I - IPP status code */ + const char *message, /* I - status-message value */ + int localize) /* I - Localize the message? */ +{ + _cups_globals_t *cg; /* Global data */ + + + if (!message && errno) + { + message = strerror(errno); + localize = 0; + } + + cg = _cupsGlobals(); + cg->last_error = status; + + if (cg->last_status_message) + { + _cupsStrFree(cg->last_status_message); + + cg->last_status_message = NULL; + } + + if (message) + { + if (localize) + { + /* + * Get the message catalog... + */ + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + cg->last_status_message = _cupsStrAlloc(_cupsLangString(cg->lang_default, + message)); + } + else + cg->last_status_message = _cupsStrAlloc(message); + } + + DEBUG_printf(("4_cupsSetError: last_error=%s, last_status_message=\"%s\"", + ippErrorString(cg->last_error), cg->last_status_message)); +} + + +/* + * '_cupsSetHTTPError()' - Set the last error using the HTTP status. + */ + +void +_cupsSetHTTPError(http_status_t status) /* I - HTTP status code */ +{ + switch (status) + { + case HTTP_NOT_FOUND : + _cupsSetError(IPP_NOT_FOUND, httpStatus(status), 0); + break; + + case HTTP_UNAUTHORIZED : + _cupsSetError(IPP_NOT_AUTHENTICATED, httpStatus(status), 0); + break; + + case HTTP_AUTHORIZATION_CANCELED : + _cupsSetError(IPP_AUTHENTICATION_CANCELED, httpStatus(status), 0); + break; + + case HTTP_FORBIDDEN : + _cupsSetError(IPP_FORBIDDEN, httpStatus(status), 0); + break; + + case HTTP_BAD_REQUEST : + _cupsSetError(IPP_BAD_REQUEST, httpStatus(status), 0); + break; + + case HTTP_REQUEST_TOO_LARGE : + _cupsSetError(IPP_REQUEST_VALUE, httpStatus(status), 0); + break; + + case HTTP_NOT_IMPLEMENTED : + _cupsSetError(IPP_OPERATION_NOT_SUPPORTED, httpStatus(status), 0); + break; + + case HTTP_NOT_SUPPORTED : + _cupsSetError(IPP_VERSION_NOT_SUPPORTED, httpStatus(status), 0); + break; + + case HTTP_UPGRADE_REQUIRED : + _cupsSetError(IPP_UPGRADE_REQUIRED, httpStatus(status), 0); + break; + + case HTTP_PKI_ERROR : + _cupsSetError(IPP_PKI_ERROR, httpStatus(status), 0); + break; + + case HTTP_ERROR : + _cupsSetError(IPP_INTERNAL_ERROR, strerror(errno), 0); + break; + + default : + DEBUG_printf(("4_cupsSetHTTPError: HTTP error %d mapped to " + "IPP_SERVICE_UNAVAILABLE!", status)); + _cupsSetError(IPP_SERVICE_UNAVAILABLE, httpStatus(status), 0); + break; + } +} + + +/* + * End of "$Id: request.c 10015 2011-09-21 22:09:29Z mike $". + */ diff --git a/cups/sidechannel.c b/cups/sidechannel.c new file mode 100644 index 0000000..35940ea --- /dev/null +++ b/cups/sidechannel.c @@ -0,0 +1,575 @@ +/* + * "$Id: sidechannel.c 9578 2011-03-04 18:44:47Z mike $" + * + * Side-channel API code for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsSideChannelDoRequest() - Send a side-channel command to a backend and + * wait for a response. + * cupsSideChannelRead() - Read a side-channel message. + * cupsSideChannelSNMPGet() - Query a SNMP OID's value. + * cupsSideChannelSNMPWalk() - Query multiple SNMP OID values. + * cupsSideChannelWrite() - Write a side-channel message. + */ + +/* + * Include necessary headers... + */ + +#include "sidechannel.h" +#include "string-private.h" +#include "debug-private.h" +#ifdef WIN32 +# include +#else +# include +#endif /* WIN32 */ +#ifdef __hpux +# include +#elif !defined(WIN32) +# include +#endif /* __hpux */ +#ifndef WIN32 +# include +#endif /* !WIN32 */ +#ifdef HAVE_POLL +# include +#endif /* HAVE_POLL */ + + +/* + * 'cupsSideChannelDoRequest()' - Send a side-channel command to a backend and wait for a response. + * + * This function is normally only called by filters, drivers, or port + * monitors in order to communicate with the backend used by the current + * printer. Programs must be prepared to handle timeout or "not + * implemented" status codes, which indicate that the backend or device + * do not support the specified side-channel command. + * + * The "datalen" parameter must be initialized to the size of the buffer + * pointed to by the "data" parameter. cupsSideChannelDoRequest() will + * update the value to contain the number of data bytes in the buffer. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +cups_sc_status_t /* O - Status of command */ +cupsSideChannelDoRequest( + cups_sc_command_t command, /* I - Command to send */ + char *data, /* O - Response data buffer pointer */ + int *datalen, /* IO - Size of data buffer on entry, number of bytes in buffer on return */ + double timeout) /* I - Timeout in seconds */ +{ + cups_sc_status_t status; /* Status of command */ + cups_sc_command_t rcommand; /* Response command */ + + + if (cupsSideChannelWrite(command, CUPS_SC_STATUS_NONE, NULL, 0, timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + if (cupsSideChannelRead(&rcommand, &status, data, datalen, timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + if (rcommand != command) + return (CUPS_SC_STATUS_BAD_MESSAGE); + + return (status); +} + + +/* + * 'cupsSideChannelRead()' - Read a side-channel message. + * + * This function is normally only called by backend programs to read + * commands from a filter, driver, or port monitor program. The + * caller must be prepared to handle incomplete or invalid messages + * and return the corresponding status codes. + * + * The "datalen" parameter must be initialized to the size of the buffer + * pointed to by the "data" parameter. cupsSideChannelDoRequest() will + * update the value to contain the number of data bytes in the buffer. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsSideChannelRead( + cups_sc_command_t *command, /* O - Command code */ + cups_sc_status_t *status, /* O - Status code */ + char *data, /* O - Data buffer pointer */ + int *datalen, /* IO - Size of data buffer on entry, number of bytes in buffer on return */ + double timeout) /* I - Timeout in seconds */ +{ + char buffer[16388]; /* Message buffer */ + int bytes; /* Bytes read */ + int templen; /* Data length from message */ + int nfds; /* Number of file descriptors */ +#ifdef HAVE_POLL + struct pollfd pfd; /* Poll structure for poll() */ +#else /* select() */ + fd_set input_set; /* Input set for select() */ + struct timeval stimeout; /* Timeout value for select() */ +#endif /* HAVE_POLL */ + + + DEBUG_printf(("cupsSideChannelRead(command=%p, status=%p, data=%p, " + "datalen=%p(%d), timeout=%.3f)", command, status, data, + datalen, datalen ? *datalen : -1, timeout)); + + /* + * Range check input... + */ + + if (!command || !status) + return (-1); + + /* + * See if we have pending data on the side-channel socket... + */ + +#ifdef HAVE_POLL + pfd.fd = CUPS_SC_FD; + pfd.events = POLLIN; + + while ((nfds = poll(&pfd, 1, + timeout < 0.0 ? -1 : (long)(timeout * 1000))) < 0 && + (errno == EINTR || errno == EAGAIN)) + ; + +#else /* select() */ + FD_ZERO(&input_set); + FD_SET(CUPS_SC_FD, &input_set); + + stimeout.tv_sec = (int)timeout; + stimeout.tv_usec = (int)(timeout * 1000000) % 1000000; + + while ((nfds = select(CUPS_SC_FD + 1, &input_set, NULL, NULL, + timeout < 0.0 ? NULL : &stimeout)) < 0 && + (errno == EINTR || errno == EAGAIN)) + ; + +#endif /* HAVE_POLL */ + + if (nfds < 1) + { + *status = nfds==0 ? CUPS_SC_STATUS_TIMEOUT : CUPS_SC_STATUS_IO_ERROR; + return (-1); + } + + /* + * Read a side-channel message for the format: + * + * Byte(s) Description + * ------- ------------------------------------------- + * 0 Command code + * 1 Status code + * 2-3 Data length (network byte order) <= 16384 + * 4-N Data + */ + + while ((bytes = read(CUPS_SC_FD, buffer, sizeof(buffer))) < 0) + if (errno != EINTR && errno != EAGAIN) + { + DEBUG_printf(("1cupsSideChannelRead: Read error: %s", strerror(errno))); + *command = CUPS_SC_CMD_NONE; + *status = CUPS_SC_STATUS_IO_ERROR; + return (-1); + } + + /* + * Watch for EOF or too few bytes... + */ + + if (bytes < 4) + { + DEBUG_printf(("1cupsSideChannelRead: Short read of %d bytes", bytes)); + *command = CUPS_SC_CMD_NONE; + *status = CUPS_SC_STATUS_BAD_MESSAGE; + return (-1); + } + + /* + * Validate the command code in the message... + */ + + if (buffer[0] < CUPS_SC_CMD_SOFT_RESET || + buffer[0] >= CUPS_SC_CMD_MAX) + { + DEBUG_printf(("1cupsSideChannelRead: Bad command %d!", buffer[0])); + *command = CUPS_SC_CMD_NONE; + *status = CUPS_SC_STATUS_BAD_MESSAGE; + return (-1); + } + + *command = (cups_sc_command_t)buffer[0]; + + /* + * Validate the data length in the message... + */ + + templen = ((buffer[2] & 255) << 8) | (buffer[3] & 255); + + if (templen > 0 && (!data || !datalen)) + { + /* + * Either the response is bigger than the provided buffer or the + * response is bigger than we've read... + */ + + *status = CUPS_SC_STATUS_TOO_BIG; + } + else if (!datalen || templen > *datalen || templen > (bytes - 4)) + { + /* + * Either the response is bigger than the provided buffer or the + * response is bigger than we've read... + */ + + *status = CUPS_SC_STATUS_TOO_BIG; + } + else + { + /* + * The response data will fit, copy it over and provide the actual + * length... + */ + + *status = (cups_sc_status_t)buffer[1]; + *datalen = templen; + + memcpy(data, buffer + 4, templen); + } + + DEBUG_printf(("1cupsSideChannelRead: Returning status=%d", *status)); + + return (0); +} + + +/* + * 'cupsSideChannelSNMPGet()' - Query a SNMP OID's value. + * + * This function asks the backend to do a SNMP OID query on behalf of the + * filter, port monitor, or backend using the default community name. + * + * "oid" contains a numeric OID consisting of integers separated by periods, + * for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not + * supported and must be converted to their numeric forms. + * + * On input, "data" and "datalen" provide the location and size of the + * buffer to hold the OID value as a string. HEX-String (binary) values are + * converted to hexadecimal strings representing the binary data, while + * NULL-Value and unknown OID types are returned as the empty string. + * The returned "datalen" does not include the trailing nul. + * + * @code CUPS_SC_STATUS_NOT_IMPLEMENTED@ is returned by backends that do not + * support SNMP queries. @code CUPS_SC_STATUS_NO_RESPONSE@ is returned when + * the printer does not respond to the SNMP query. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +cups_sc_status_t /* O - Query status */ +cupsSideChannelSNMPGet( + const char *oid, /* I - OID to query */ + char *data, /* I - Buffer for OID value */ + int *datalen, /* IO - Size of OID buffer on entry, size of value on return */ + double timeout) /* I - Timeout in seconds */ +{ + cups_sc_status_t status; /* Status of command */ + cups_sc_command_t rcommand; /* Response command */ + char real_data[2048];/* Real data buffer for response */ + int real_datalen, /* Real length of data buffer */ + real_oidlen; /* Length of returned OID string */ + + + DEBUG_printf(("cupsSideChannelSNMPGet(oid=\"%s\", data=%p, datalen=%p(%d), " + "timeout=%.3f)", oid, data, datalen, datalen ? *datalen : -1, + timeout)); + + /* + * Range check input... + */ + + if (!oid || !*oid || !data || !datalen || *datalen < 2) + return (CUPS_SC_STATUS_BAD_MESSAGE); + + *data = '\0'; + + /* + * Send the request to the backend and wait for a response... + */ + + if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET, CUPS_SC_STATUS_NONE, oid, + (int)strlen(oid) + 1, timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + real_datalen = sizeof(real_data); + if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen, timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + if (rcommand != CUPS_SC_CMD_SNMP_GET) + return (CUPS_SC_STATUS_BAD_MESSAGE); + + if (status == CUPS_SC_STATUS_OK) + { + /* + * Parse the response of the form "oid\0value"... + */ + + real_oidlen = strlen(real_data) + 1; + real_datalen -= real_oidlen; + + if ((real_datalen + 1) > *datalen) + return (CUPS_SC_STATUS_TOO_BIG); + + memcpy(data, real_data + real_oidlen, real_datalen); + data[real_datalen] = '\0'; + + *datalen = real_datalen; + } + + return (status); +} + + +/* + * 'cupsSideChannelSNMPWalk()' - Query multiple SNMP OID values. + * + * This function asks the backend to do multiple SNMP OID queries on behalf + * of the filter, port monitor, or backend using the default community name. + * All OIDs under the "parent" OID are queried and the results are sent to + * the callback function you provide. + * + * "oid" contains a numeric OID consisting of integers separated by periods, + * for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not + * supported and must be converted to their numeric forms. + * + * "timeout" specifies the timeout for each OID query. The total amount of + * time will depend on the number of OID values found and the time required + * for each query. + * + * "cb" provides a function to call for every value that is found. "context" + * is an application-defined pointer that is sent to the callback function + * along with the OID and current data. The data passed to the callback is the + * same as returned by @link cupsSideChannelSNMPGet@. + * + * @code CUPS_SC_STATUS_NOT_IMPLEMENTED@ is returned by backends that do not + * support SNMP queries. @code CUPS_SC_STATUS_NO_RESPONSE@ is returned when + * the printer does not respond to the first SNMP query. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +cups_sc_status_t /* O - Status of first query of @code CUPS_SC_STATUS_OK@ on success */ +cupsSideChannelSNMPWalk( + const char *oid, /* I - First numeric OID to query */ + double timeout, /* I - Timeout for each query in seconds */ + cups_sc_walk_func_t cb, /* I - Function to call with each value */ + void *context) /* I - Application-defined pointer to send to callback */ +{ + cups_sc_status_t status; /* Status of command */ + cups_sc_command_t rcommand; /* Response command */ + char real_data[2048];/* Real data buffer for response */ + int real_datalen, /* Real length of data buffer */ + real_oidlen, /* Length of returned OID string */ + oidlen; /* Length of first OID */ + const char *current_oid; /* Current OID */ + char last_oid[2048]; /* Last OID */ + + + DEBUG_printf(("cupsSideChannelSNMPWalk(oid=\"%s\", timeout=%.3f, cb=%p, " + "context=%p)", oid, timeout, cb, context)); + + /* + * Range check input... + */ + + if (!oid || !*oid || !cb) + return (CUPS_SC_STATUS_BAD_MESSAGE); + + /* + * Loop until the OIDs don't match... + */ + + current_oid = oid; + oidlen = (int)strlen(oid); + last_oid[0] = '\0'; + + do + { + /* + * Send the request to the backend and wait for a response... + */ + + if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET_NEXT, CUPS_SC_STATUS_NONE, + current_oid, (int)strlen(current_oid) + 1, timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + real_datalen = sizeof(real_data); + if (cupsSideChannelRead(&rcommand, &status, real_data, &real_datalen, + timeout)) + return (CUPS_SC_STATUS_TIMEOUT); + + if (rcommand != CUPS_SC_CMD_SNMP_GET_NEXT) + return (CUPS_SC_STATUS_BAD_MESSAGE); + + if (status == CUPS_SC_STATUS_OK) + { + /* + * Parse the response of the form "oid\0value"... + */ + + if (strncmp(real_data, oid, oidlen) || real_data[oidlen] != '.' || + !strcmp(real_data, last_oid)) + { + /* + * Done with this set of OIDs... + */ + + return (CUPS_SC_STATUS_OK); + } + + if (real_datalen < sizeof(real_data)) + real_data[real_datalen] = '\0'; + + real_oidlen = strlen(real_data) + 1; + real_datalen -= real_oidlen; + + /* + * Call the callback with the OID and data... + */ + + (*cb)(real_data, real_data + real_oidlen, real_datalen, context); + + /* + * Update the current OID... + */ + + current_oid = real_data; + strlcpy(last_oid, current_oid, sizeof(last_oid)); + } + } + while (status == CUPS_SC_STATUS_OK); + + return (status); +} + + +/* + * 'cupsSideChannelWrite()' - Write a side-channel message. + * + * This function is normally only called by backend programs to send + * responses to a filter, driver, or port monitor program. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on error */ +cupsSideChannelWrite( + cups_sc_command_t command, /* I - Command code */ + cups_sc_status_t status, /* I - Status code */ + const char *data, /* I - Data buffer pointer */ + int datalen, /* I - Number of bytes of data */ + double timeout) /* I - Timeout in seconds */ +{ + char buffer[16388]; /* Message buffer */ + int bytes; /* Bytes written */ +#ifdef HAVE_POLL + struct pollfd pfd; /* Poll structure for poll() */ +#else /* select() */ + fd_set output_set; /* Output set for select() */ + struct timeval stimeout; /* Timeout value for select() */ +#endif /* HAVE_POLL */ + + + /* + * Range check input... + */ + + if (command < CUPS_SC_CMD_SOFT_RESET || command >= CUPS_SC_CMD_MAX || + datalen < 0 || datalen > 16384 || (datalen > 0 && !data)) + return (-1); + + /* + * See if we can safely write to the side-channel socket... + */ + +#ifdef HAVE_POLL + pfd.fd = CUPS_SC_FD; + pfd.events = POLLOUT; + + if (timeout < 0.0) + { + if (poll(&pfd, 1, -1) < 1) + return (-1); + } + else if (poll(&pfd, 1, (long)(timeout * 1000)) < 1) + return (-1); + +#else /* select() */ + FD_ZERO(&output_set); + FD_SET(CUPS_SC_FD, &output_set); + + if (timeout < 0.0) + { + if (select(CUPS_SC_FD + 1, NULL, &output_set, NULL, NULL) < 1) + return (-1); + } + else + { + stimeout.tv_sec = (int)timeout; + stimeout.tv_usec = (int)(timeout * 1000000) % 1000000; + + if (select(CUPS_SC_FD + 1, NULL, &output_set, NULL, &stimeout) < 1) + return (-1); + } +#endif /* HAVE_POLL */ + + /* + * Write a side-channel message in the format: + * + * Byte(s) Description + * ------- ------------------------------------------- + * 0 Command code + * 1 Status code + * 2-3 Data length (network byte order) <= 16384 + * 4-N Data + */ + + buffer[0] = command; + buffer[1] = status; + buffer[2] = datalen >> 8; + buffer[3] = datalen & 255; + + bytes = 4; + + if (datalen > 0) + { + memcpy(buffer + 4, data, datalen); + bytes += datalen; + } + + while (write(CUPS_SC_FD, buffer, bytes) < 0) + if (errno != EINTR && errno != EAGAIN) + return (-1); + + return (0); +} + + +/* + * End of "$Id: sidechannel.c 9578 2011-03-04 18:44:47Z mike $". + */ diff --git a/cups/sidechannel.h b/cups/sidechannel.h new file mode 100644 index 0000000..94858c6 --- /dev/null +++ b/cups/sidechannel.h @@ -0,0 +1,147 @@ +/* + * "$Id: sidechannel.h 9772 2011-05-12 05:46:30Z mike $" + * + * Side-channel API definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_SIDECHANNEL_H_ +# define _CUPS_SIDECHANNEL_H_ + +/* + * Include necessary headers... + */ + +# include "versioning.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +#define CUPS_SC_FD 4 /* File descriptor for select/poll */ + + +/* + * Enumerations... + */ + +enum cups_sc_bidi_e /**** Bidirectional capability values ****/ +{ + CUPS_SC_BIDI_NOT_SUPPORTED = 0, /* Bidirectional I/O is not supported */ + CUPS_SC_BIDI_SUPPORTED = 1 /* Bidirectional I/O is supported */ +}; +typedef enum cups_sc_bidi_e cups_sc_bidi_t; + /**** Bidirectional capabilities ****/ + +enum cups_sc_command_e /**** Request command codes ****/ +{ + CUPS_SC_CMD_NONE = 0, /* No command @private@ */ + CUPS_SC_CMD_SOFT_RESET = 1, /* Do a soft reset */ + CUPS_SC_CMD_DRAIN_OUTPUT = 2, /* Drain all pending output */ + CUPS_SC_CMD_GET_BIDI = 3, /* Return bidirectional capabilities */ + CUPS_SC_CMD_GET_DEVICE_ID = 4, /* Return the IEEE-1284 device ID */ + CUPS_SC_CMD_GET_STATE = 5, /* Return the device state */ + CUPS_SC_CMD_SNMP_GET = 6, /* Query an SNMP OID @since CUPS 1.4/Mac OS X 10.6@ */ + CUPS_SC_CMD_SNMP_GET_NEXT = 7, /* Query the next SNMP OID @since CUPS 1.4/Mac OS X 10.6@ */ + CUPS_SC_CMD_GET_CONNECTED = 8, /* Return whether the backend is "connected" to the printer @since CUPS 1.5/Mac OS X 10.7@ */ + CUPS_SC_CMD_MAX /* End of valid values @private@ */ +}; +typedef enum cups_sc_command_e cups_sc_command_t; + /**** Request command codes ****/ + +enum cups_sc_connected_e /**** Connectivity values ****/ +{ + CUPS_SC_NOT_CONNECTED = 0, /* Backend is not "connected" to printer */ + CUPS_SC_CONNECTED = 1 /* Backend is "connected" to printer */ +}; +typedef enum cups_sc_connected_e cups_sc_connected_t; + /**** Connectivity values ****/ + + +enum cups_sc_state_e /**** Printer state bits ****/ +{ + CUPS_SC_STATE_OFFLINE = 0, /* Device is offline */ + CUPS_SC_STATE_ONLINE = 1, /* Device is online */ + CUPS_SC_STATE_BUSY = 2, /* Device is busy */ + CUPS_SC_STATE_ERROR = 4, /* Other error condition */ + CUPS_SC_STATE_MEDIA_LOW = 16, /* Paper low condition */ + CUPS_SC_STATE_MEDIA_EMPTY = 32, /* Paper out condition */ + CUPS_SC_STATE_MARKER_LOW = 64, /* Toner/ink low condition */ + CUPS_SC_STATE_MARKER_EMPTY = 128 /* Toner/ink out condition */ +}; +typedef enum cups_sc_state_e cups_sc_state_t; + /**** Printer state bits ****/ + +enum cups_sc_status_e /**** Response status codes ****/ +{ + CUPS_SC_STATUS_NONE, /* No status */ + CUPS_SC_STATUS_OK, /* Operation succeeded */ + CUPS_SC_STATUS_IO_ERROR, /* An I/O error occurred */ + CUPS_SC_STATUS_TIMEOUT, /* The backend did not respond */ + CUPS_SC_STATUS_NO_RESPONSE, /* The device did not respond */ + CUPS_SC_STATUS_BAD_MESSAGE, /* The command/response message was invalid */ + CUPS_SC_STATUS_TOO_BIG, /* Response too big */ + CUPS_SC_STATUS_NOT_IMPLEMENTED /* Command not implemented */ +}; +typedef enum cups_sc_status_e cups_sc_status_t; + /**** Response status codes ****/ + +typedef void (*cups_sc_walk_func_t)(const char *oid, const char *data, + int datalen, void *context); + /**** SNMP walk callback ****/ + + +/* + * Prototypes... + */ + +extern cups_sc_status_t cupsSideChannelDoRequest(cups_sc_command_t command, + char *data, int *datalen, + double timeout) _CUPS_API_1_3; +extern int cupsSideChannelRead(cups_sc_command_t *command, + cups_sc_status_t *status, + char *data, int *datalen, + double timeout) _CUPS_API_1_3; +extern int cupsSideChannelWrite(cups_sc_command_t command, + cups_sc_status_t status, + const char *data, int datalen, + double timeout) _CUPS_API_1_3; + +/**** New in CUPS 1.4 ****/ +extern cups_sc_status_t cupsSideChannelSNMPGet(const char *oid, char *data, + int *datalen, double timeout) + _CUPS_API_1_4; +extern cups_sc_status_t cupsSideChannelSNMPWalk(const char *oid, double timeout, + cups_sc_walk_func_t cb, + void *context) _CUPS_API_1_4; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_SIDECHANNEL_H_ */ + +/* + * End of "$Id: sidechannel.h 9772 2011-05-12 05:46:30Z mike $". + */ diff --git a/cups/snmp-private.h b/cups/snmp-private.h new file mode 100644 index 0000000..896b662 --- /dev/null +++ b/cups/snmp-private.h @@ -0,0 +1,145 @@ +/* + * "$Id: snmp-private.h 9042 2010-03-24 00:45:34Z mike $" + * + * Private SNMP definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_SNMP_PRIVATE_H_ +# define _CUPS_SNMP_PRIVATE_H_ + + +/* + * Include necessary headers. + */ + +#include + + +/* + * Constants... + */ + +#define CUPS_SNMP_PORT 161 /* SNMP well-known port */ +#define CUPS_SNMP_MAX_OID 128 /* Maximum number of OID numbers */ +#define CUPS_SNMP_MAX_PACKET 1472 /* Maximum size of SNMP packet */ +#define CUPS_SNMP_MAX_STRING 512 /* Maximum size of string */ +#define CUPS_SNMP_VERSION_1 0 /* SNMPv1 */ + + +/* + * Types... + */ + +enum cups_asn1_e /**** ASN1 request/object types ****/ +{ + CUPS_ASN1_END_OF_CONTENTS = 0x00, /* End-of-contents */ + CUPS_ASN1_BOOLEAN = 0x01, /* BOOLEAN */ + CUPS_ASN1_INTEGER = 0x02, /* INTEGER or ENUMERATION */ + CUPS_ASN1_BIT_STRING = 0x03, /* BIT STRING */ + CUPS_ASN1_OCTET_STRING = 0x04, /* OCTET STRING */ + CUPS_ASN1_NULL_VALUE = 0x05, /* NULL VALUE */ + CUPS_ASN1_OID = 0x06, /* OBJECT IDENTIFIER */ + CUPS_ASN1_SEQUENCE = 0x30, /* SEQUENCE */ + CUPS_ASN1_HEX_STRING = 0x40, /* Binary string aka Hex-STRING */ + CUPS_ASN1_COUNTER = 0x41, /* 32-bit unsigned aka Counter32 */ + CUPS_ASN1_GAUGE = 0x42, /* 32-bit unsigned aka Gauge32 */ + CUPS_ASN1_TIMETICKS = 0x43, /* 32-bit unsigned aka Timeticks32 */ + CUPS_ASN1_GET_REQUEST = 0xa0, /* GetRequest-PDU */ + CUPS_ASN1_GET_NEXT_REQUEST = 0xa1, /* GetNextRequest-PDU */ + CUPS_ASN1_GET_RESPONSE = 0xa2 /* GetResponse-PDU */ +}; +typedef enum cups_asn1_e cups_asn1_t; /**** ASN1 request/object types ****/ + +typedef struct cups_snmp_string_s /**** String value ****/ +{ + unsigned char bytes[CUPS_SNMP_MAX_STRING]; + /* Bytes in string */ + int num_bytes; /* Number of bytes */ +} cups_snmp_string_t; + +union cups_snmp_value_u /**** Object value ****/ +{ + int boolean; /* Boolean value */ + int integer; /* Integer value */ + unsigned counter; /* Counter value */ + unsigned gauge; /* Gauge value */ + unsigned timeticks; /* Timeticks value */ + int oid[CUPS_SNMP_MAX_OID]; /* OID value */ + cups_snmp_string_t string; /* String value */ +}; + +typedef struct cups_snmp_s /**** SNMP data packet ****/ +{ + const char *error; /* Encode/decode error */ + http_addr_t address; /* Source address */ + int version; /* Version number */ + char community[CUPS_SNMP_MAX_STRING]; + /* Community name */ + cups_asn1_t request_type; /* Request type */ + int request_id; /* request-id value */ + int error_status; /* error-status value */ + int error_index; /* error-index value */ + int object_name[CUPS_SNMP_MAX_OID]; + /* object-name value */ + cups_asn1_t object_type; /* object-value type */ + union cups_snmp_value_u + object_value; /* object-value value */ +} cups_snmp_t; + +typedef void (*cups_snmp_cb_t)(cups_snmp_t *packet, void *data); + +/* + * Prototypes... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +extern void _cupsSNMPClose(int fd) _CUPS_API_1_4; +extern int *_cupsSNMPCopyOID(int *dst, const int *src, int dstsize) + _CUPS_API_1_4; +extern const char *_cupsSNMPDefaultCommunity(void) _CUPS_API_1_4; +extern int _cupsSNMPIsOID(cups_snmp_t *packet, const int *oid) + _CUPS_API_1_4; +extern int _cupsSNMPIsOIDPrefixed(cups_snmp_t *packet, + const int *prefix) _CUPS_API_1_4; +extern char *_cupsSNMPOIDToString(const int *src, char *dst, + size_t dstsize) _CUPS_API_1_4; +extern int _cupsSNMPOpen(int family) _CUPS_API_1_4; +extern cups_snmp_t *_cupsSNMPRead(int fd, cups_snmp_t *packet, + double timeout) _CUPS_API_1_4; +extern void _cupsSNMPSetDebug(int level) _CUPS_API_1_4; +extern int *_cupsSNMPStringToOID(const char *src, + int *dst, int dstsize) + _CUPS_API_1_4; +extern int _cupsSNMPWalk(int fd, http_addr_t *address, int version, + const char *community, const int *prefix, + double timeout, cups_snmp_cb_t cb, + void *data) _CUPS_API_1_4; +extern int _cupsSNMPWrite(int fd, http_addr_t *address, int version, + const char *community, + cups_asn1_t request_type, + const unsigned request_id, + const int *oid) _CUPS_API_1_4; + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_SNMP_PRIVATE_H_ */ + + +/* + * End of "$Id: snmp-private.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/snmp.c b/cups/snmp.c new file mode 100644 index 0000000..3f1a2a3 --- /dev/null +++ b/cups/snmp.c @@ -0,0 +1,1737 @@ +/* + * "$Id: snmp.c 9793 2011-05-20 03:49:49Z mike $" + * + * SNMP functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsSNMPClose() - Close a SNMP socket. + * _cupsSNMPCopyOID() - Copy an OID. + * _cupsSNMPDefaultCommunity() - Get the default SNMP community name. + * _cupsSNMPIsOID() - Test whether a SNMP response contains the + * specified OID. + * _cupsSNMPIsOIDPrefixed() - Test whether a SNMP response uses the + * specified OID prefix. + * _cupsSNMPOIDToString() - Convert an OID to a string. + * _cupsSNMPOpen() - Open a SNMP socket. + * _cupsSNMPRead() - Read and parse a SNMP response. + * _cupsSNMPSetDebug() - Enable/disable debug logging to stderr. + * _cupsSNMPStringToOID() - Convert a numeric OID string to an OID array. + * _cupsSNMPWalk() - Enumerate a group of OIDs. + * _cupsSNMPWrite() - Send an SNMP query packet. + * asn1_debug() - Decode an ASN1-encoded message. + * asn1_decode_snmp() - Decode a SNMP packet. + * asn1_encode_snmp() - Encode a SNMP packet. + * asn1_get_integer() - Get an integer value. + * asn1_get_length() - Get a value length. + * asn1_get_oid() - Get an OID value. + * asn1_get_packed() - Get a packed integer value. + * asn1_get_string() - Get a string value. + * asn1_get_type() - Get a value type. + * asn1_set_integer() - Set an integer value. + * asn1_set_length() - Set a value length. + * asn1_set_oid() - Set an OID value. + * asn1_set_packed() - Set a packed integer value. + * asn1_size_integer() - Figure out the number of bytes needed for an + * integer value. + * asn1_size_length() - Figure out the number of bytes needed for a + * length value. + * asn1_size_oid() - Figure out the numebr of bytes needed for an + * OID value. + * asn1_size_packed() - Figure out the number of bytes needed for a + * packed integer value. + * snmp_set_error() - Set the localized error for a packet. + */ + +/* + * Include necessary headers. + */ + +#include "cups-private.h" +#include "snmp-private.h" +#ifdef HAVE_POLL +# include +#endif /* HAVE_POLL */ + + +/* + * Local functions... + */ + +static void asn1_debug(const char *prefix, unsigned char *buffer, + size_t len, int indent); +static int asn1_decode_snmp(unsigned char *buffer, size_t len, + cups_snmp_t *packet); +static int asn1_encode_snmp(unsigned char *buffer, size_t len, + cups_snmp_t *packet); +static int asn1_get_integer(unsigned char **buffer, + unsigned char *bufend, + int length); +static int asn1_get_oid(unsigned char **buffer, + unsigned char *bufend, + int length, int *oid, int oidsize); +static int asn1_get_packed(unsigned char **buffer, + unsigned char *bufend); +static char *asn1_get_string(unsigned char **buffer, + unsigned char *bufend, + int length, char *string, + int strsize); +static unsigned asn1_get_length(unsigned char **buffer, + unsigned char *bufend); +static int asn1_get_type(unsigned char **buffer, + unsigned char *bufend); +static void asn1_set_integer(unsigned char **buffer, + int integer); +static void asn1_set_length(unsigned char **buffer, + unsigned length); +static void asn1_set_oid(unsigned char **buffer, + const int *oid); +static void asn1_set_packed(unsigned char **buffer, + int integer); +static int asn1_size_integer(int integer); +static int asn1_size_length(int length); +static int asn1_size_oid(const int *oid); +static int asn1_size_packed(int integer); +static void snmp_set_error(cups_snmp_t *packet, + const char *message); + + +/* + * '_cupsSNMPClose()' - Close a SNMP socket. + */ + +void +_cupsSNMPClose(int fd) /* I - SNMP socket file descriptor */ +{ + DEBUG_printf(("4_cupsSNMPClose(fd=%d)", fd)); + +#ifdef WIN32 + closesocket(fd); +#else + close(fd); +#endif /* WIN32 */ +} + + +/* + * '_cupsSNMPCopyOID()' - Copy an OID. + * + * The array pointed to by "src" is terminated by the value -1. + */ + +int * /* O - New OID */ +_cupsSNMPCopyOID(int *dst, /* I - Destination OID */ + const int *src, /* I - Source OID */ + int dstsize) /* I - Number of integers in dst */ +{ + int i; /* Looping var */ + + + DEBUG_printf(("4_cupsSNMPCopyOID(dst=%p, src=%p, dstsize=%d)", dst, src, + dstsize)); + + for (i = 0, dstsize --; src[i] >= 0 && i < dstsize; i ++) + dst[i] = src[i]; + + dst[i] = -1; + + return (dst); +} + + +/* + * '_cupsSNMPDefaultCommunity()' - Get the default SNMP community name. + * + * The default community name is the first community name found in the + * snmp.conf file. If no community name is defined there, "public" is used. + */ + +const char * /* O - Default community name */ +_cupsSNMPDefaultCommunity(void) +{ + cups_file_t *fp; /* snmp.conf file */ + char line[1024], /* Line from file */ + *value; /* Value from file */ + int linenum; /* Line number in file */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + DEBUG_puts("4_cupsSNMPDefaultCommunity()"); + + if (!cg->snmp_community[0]) + { + strlcpy(cg->snmp_community, "public", sizeof(cg->snmp_community)); + + snprintf(line, sizeof(line), "%s/snmp.conf", cg->cups_serverroot); + if ((fp = cupsFileOpen(line, "r")) != NULL) + { + linenum = 0; + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + if (!_cups_strcasecmp(line, "Community") && value) + { + strlcpy(cg->snmp_community, value, sizeof(cg->snmp_community)); + break; + } + + cupsFileClose(fp); + } + } + + DEBUG_printf(("5_cupsSNMPDefaultCommunity: Returning \"%s\"", + cg->snmp_community)); + + return (cg->snmp_community); +} + + +/* + * '_cupsSNMPIsOID()' - Test whether a SNMP response contains the specified OID. + * + * The array pointed to by "oid" is terminated by the value -1. + */ + +int /* O - 1 if equal, 0 if not equal */ +_cupsSNMPIsOID(cups_snmp_t *packet, /* I - Response packet */ + const int *oid) /* I - OID */ +{ + int i; /* Looping var */ + + + /* + * Range check input... + */ + + DEBUG_printf(("4_cupsSNMPIsOID(packet=%p, oid=%p)", packet, oid)); + + if (!packet || !oid) + { + DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); + + return (0); + } + + /* + * Compare OIDs... + */ + + for (i = 0; + i < CUPS_SNMP_MAX_OID && oid[i] >= 0 && packet->object_name[i] >= 0; + i ++) + if (oid[i] != packet->object_name[i]) + { + DEBUG_puts("5_cupsSNMPIsOID: Returning 0"); + + return (0); + } + + DEBUG_printf(("5_cupsSNMPIsOID: Returning %d", + i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i])); + + return (i < CUPS_SNMP_MAX_OID && oid[i] == packet->object_name[i]); +} + + +/* + * '_cupsSNMPIsOIDPrefixed()' - Test whether a SNMP response uses the specified + * OID prefix. + * + * The array pointed to by "prefix" is terminated by the value -1. + */ + +int /* O - 1 if prefixed, 0 if not prefixed */ +_cupsSNMPIsOIDPrefixed( + cups_snmp_t *packet, /* I - Response packet */ + const int *prefix) /* I - OID prefix */ +{ + int i; /* Looping var */ + + + /* + * Range check input... + */ + + DEBUG_printf(("4_cupsSNMPIsOIDPrefixed(packet=%p, prefix=%p)", packet, + prefix)); + + if (!packet || !prefix) + { + DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); + + return (0); + } + + /* + * Compare OIDs... + */ + + for (i = 0; + i < CUPS_SNMP_MAX_OID && prefix[i] >= 0 && packet->object_name[i] >= 0; + i ++) + if (prefix[i] != packet->object_name[i]) + { + DEBUG_puts("5_cupsSNMPIsOIDPrefixed: Returning 0"); + + return (0); + } + + DEBUG_printf(("5_cupsSNMPIsOIDPrefixed: Returning %d", + i < CUPS_SNMP_MAX_OID)); + + return (i < CUPS_SNMP_MAX_OID); +} + + +/* + * '_cupsSNMPOIDToString()' - Convert an OID to a string. + */ + + +char * /* O - New string or @code NULL@ on error */ +_cupsSNMPOIDToString(const int *src, /* I - OID */ + char *dst, /* I - String buffer */ + size_t dstsize) /* I - Size of string buffer */ +{ + char *dstptr, /* Pointer into string buffer */ + *dstend; /* End of string buffer */ + + + DEBUG_printf(("4_cupsSNMPOIDToString(src=%p, dst=%p, dstsize=" CUPS_LLFMT ")", + src, dst, CUPS_LLCAST dstsize)); + + /* + * Range check input... + */ + + if (!src || !dst || dstsize < 4) + return (NULL); + + /* + * Loop through the OID array and build a string... + */ + + for (dstptr = dst, dstend = dstptr + dstsize - 1; + *src >= 0 && dstptr < dstend; + src ++, dstptr += strlen(dstptr)) + snprintf(dstptr, dstend - dstptr + 1, ".%d", *src); + + if (*src >= 0) + return (NULL); + else + return (dst); +} + + +/* + * '_cupsSNMPOpen()' - Open a SNMP socket. + */ + +int /* O - SNMP socket file descriptor */ +_cupsSNMPOpen(int family) /* I - Address family - @code AF_INET@ or @code AF_INET6@ */ +{ + int fd; /* SNMP socket file descriptor */ + int val; /* Socket option value */ + + + /* + * Create the SNMP socket... + */ + + DEBUG_printf(("4_cupsSNMPOpen(family=%d)", family)); + + if ((fd = socket(family, SOCK_DGRAM, 0)) < 0) + { + DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); + + return (-1); + } + + /* + * Set the "broadcast" flag... + */ + + val = 1; + +#ifdef WIN32 + if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char *)&val, sizeof(val))) +#else + if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val))) +#endif /* WIN32 */ + { + DEBUG_printf(("5_cupsSNMPOpen: Returning -1 (%s)", strerror(errno))); + + close(fd); + + return (-1); + } + + DEBUG_printf(("5_cupsSNMPOpen: Returning %d", fd)); + + return (fd); +} + + +/* + * '_cupsSNMPRead()' - Read and parse a SNMP response. + * + * If "timeout" is negative, @code _cupsSNMPRead@ will wait for a response + * indefinitely. + */ + +cups_snmp_t * /* O - SNMP packet or @code NULL@ if none */ +_cupsSNMPRead(int fd, /* I - SNMP socket file descriptor */ + cups_snmp_t *packet, /* I - SNMP packet buffer */ + double timeout) /* I - Timeout in seconds */ +{ + unsigned char buffer[CUPS_SNMP_MAX_PACKET]; + /* Data packet */ + int bytes; /* Number of bytes received */ + socklen_t addrlen; /* Source address length */ + http_addr_t address; /* Source address */ + + + /* + * Range check input... + */ + + DEBUG_printf(("4_cupsSNMPRead(fd=%d, packet=%p, timeout=%.1f)", fd, packet, + timeout)); + + if (fd < 0 || !packet) + { + DEBUG_puts("5_cupsSNMPRead: Returning NULL"); + + return (NULL); + } + + /* + * Optionally wait for a response... + */ + + if (timeout >= 0.0) + { + int ready; /* Data ready on socket? */ +#ifdef HAVE_POLL + struct pollfd pfd; /* Polled file descriptor */ + + pfd.fd = fd; + pfd.events = POLLIN; + + while ((ready = poll(&pfd, 1, (int)(timeout * 1000.0))) < 0 && + (errno == EINTR || errno == EAGAIN)); + +#else + fd_set input_set; /* select() input set */ + struct timeval stimeout; /* select() timeout */ + + do + { + FD_ZERO(&input_set); + FD_SET(fd, &input_set); + + stimeout.tv_sec = (int)timeout; + stimeout.tv_usec = (int)((timeout - stimeout.tv_sec) * 1000000); + + ready = select(fd + 1, &input_set, NULL, NULL, &stimeout); + } +# ifdef WIN32 + while (ready < 0 && WSAGetLastError() == WSAEINTR); +# else + while (ready < 0 && (errno == EINTR || errno == EAGAIN)); +# endif /* WIN32 */ +#endif /* HAVE_POLL */ + + /* + * If we don't have any data ready, return right away... + */ + + if (ready <= 0) + { + DEBUG_puts("5_cupsSNMPRead: Returning NULL (timeout)"); + + return (NULL); + } + } + + /* + * Read the response data... + */ + + addrlen = sizeof(address); + + if ((bytes = recvfrom(fd, buffer, sizeof(buffer), 0, (void *)&address, + &addrlen)) < 0) + { + DEBUG_printf(("5_cupsSNMPRead: Returning NULL (%s)", strerror(errno))); + + return (NULL); + } + + /* + * Look for the response status code in the SNMP message header... + */ + + asn1_debug("DEBUG: IN ", buffer, bytes, 0); + + asn1_decode_snmp(buffer, bytes, packet); + + memcpy(&(packet->address), &address, sizeof(packet->address)); + + /* + * Return decoded data packet... + */ + + DEBUG_puts("5_cupsSNMPRead: Returning packet"); + + return (packet); +} + + +/* + * '_cupsSNMPSetDebug()' - Enable/disable debug logging to stderr. + */ + +void +_cupsSNMPSetDebug(int level) /* I - 1 to enable debug output, 0 otherwise */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + DEBUG_printf(("4_cupsSNMPSetDebug(level=%d)", level)); + + cg->snmp_debug = level; +} + + +/* + * '_cupsSNMPStringToOID()' - Convert a numeric OID string to an OID array. + * + * This function converts a string of the form ".N.N.N.N.N" to the + * corresponding OID array terminated by -1. + * + * @code NULL@ is returned if the array is not large enough or the string is + * not a valid OID number. + */ + +int * /* O - Pointer to OID array or @code NULL@ on error */ +_cupsSNMPStringToOID(const char *src, /* I - OID string */ + int *dst, /* I - OID array */ + int dstsize)/* I - Number of integers in OID array */ +{ + int *dstptr, /* Pointer into OID array */ + *dstend; /* End of OID array */ + + + DEBUG_printf(("4_cupsSNMPStringToOID(src=\"%s\", dst=%p, dstsize=%d)", + src, dst, dstsize)); + + /* + * Range check input... + */ + + if (!src || !dst || dstsize < 2) + return (NULL); + + /* + * Skip leading "."... + */ + + if (*src == '.') + src ++; + + /* + * Loop to the end of the string... + */ + + for (dstend = dst + dstsize - 1, dstptr = dst, *dstptr = 0; + *src && dstptr < dstend; + src ++) + { + if (*src == '.') + { + dstptr ++; + *dstptr = 0; + } + else if (isdigit(*src & 255)) + *dstptr = *dstptr * 10 + *src - '0'; + else + break; + } + + if (*src) + return (NULL); + + /* + * Terminate the end of the OID array and return... + */ + + dstptr[1] = -1; + + return (dst); +} + + +/* + * '_cupsSNMPWalk()' - Enumerate a group of OIDs. + * + * This function queries all of the OIDs with the specified OID prefix, + * calling the "cb" function for every response that is received. + * + * The array pointed to by "prefix" is terminated by the value -1. + * + * If "timeout" is negative, @code _cupsSNMPWalk@ will wait for a response + * indefinitely. + */ + +int /* O - Number of OIDs found or -1 on error */ +_cupsSNMPWalk(int fd, /* I - SNMP socket */ + http_addr_t *address, /* I - Address to query */ + int version, /* I - SNMP version */ + const char *community,/* I - Community name */ + const int *prefix, /* I - OID prefix */ + double timeout, /* I - Timeout for each response in seconds */ + cups_snmp_cb_t cb, /* I - Function to call for each response */ + void *data) /* I - User data pointer that is passed to the callback function */ +{ + int count = 0; /* Number of OIDs found */ + int request_id = 0; /* Current request ID */ + cups_snmp_t packet; /* Current response packet */ + int lastoid[CUPS_SNMP_MAX_OID]; + /* Last OID we got */ + + + /* + * Range check input... + */ + + DEBUG_printf(("4_cupsSNMPWalk(fd=%d, address=%p, version=%d, " + "community=\"%s\", prefix=%p, timeout=%.1f, cb=%p, data=%p)", + fd, address, version, community, prefix, timeout, cb, data)); + + if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || + !prefix || !cb) + { + DEBUG_puts("5_cupsSNMPWalk: Returning -1"); + + return (-1); + } + + /* + * Copy the OID prefix and then loop until we have no more OIDs... + */ + + _cupsSNMPCopyOID(packet.object_name, prefix, CUPS_SNMP_MAX_OID); + lastoid[0] = -1; + + for (;;) + { + request_id ++; + + if (!_cupsSNMPWrite(fd, address, version, community, + CUPS_ASN1_GET_NEXT_REQUEST, request_id, + packet.object_name)) + { + DEBUG_puts("5_cupsSNMPWalk: Returning -1"); + + return (-1); + } + + if (!_cupsSNMPRead(fd, &packet, timeout)) + { + DEBUG_puts("5_cupsSNMPWalk: Returning -1"); + + return (-1); + } + + if (!_cupsSNMPIsOIDPrefixed(&packet, prefix) || + _cupsSNMPIsOID(&packet, lastoid)) + { + DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count)); + + return (count); + } + + if (packet.error || packet.error_status) + { + DEBUG_printf(("5_cupsSNMPWalk: Returning %d", count > 0 ? count : -1)); + + return (count > 0 ? count : -1); + } + + _cupsSNMPCopyOID(lastoid, packet.object_name, CUPS_SNMP_MAX_OID); + + count ++; + + (*cb)(&packet, data); + } +} + + +/* + * '_cupsSNMPWrite()' - Send an SNMP query packet. + * + * The array pointed to by "oid" is terminated by the value -1. + */ + +int /* O - 1 on success, 0 on error */ +_cupsSNMPWrite( + int fd, /* I - SNMP socket */ + http_addr_t *address, /* I - Address to send to */ + int version, /* I - SNMP version */ + const char *community, /* I - Community name */ + cups_asn1_t request_type, /* I - Request type */ + const unsigned request_id, /* I - Request ID */ + const int *oid) /* I - OID */ +{ + int i; /* Looping var */ + cups_snmp_t packet; /* SNMP message packet */ + unsigned char buffer[CUPS_SNMP_MAX_PACKET]; + /* SNMP message buffer */ + int bytes; /* Size of message */ + http_addr_t temp; /* Copy of address */ + + + /* + * Range check input... + */ + + DEBUG_printf(("4_cupsSNMPWrite(fd=%d, address=%p, version=%d, " + "community=\"%s\", request_type=%d, request_id=%u, oid=%p)", + fd, address, version, community, request_type, request_id, oid)); + + if (fd < 0 || !address || version != CUPS_SNMP_VERSION_1 || !community || + (request_type != CUPS_ASN1_GET_REQUEST && + request_type != CUPS_ASN1_GET_NEXT_REQUEST) || request_id < 1 || !oid) + { + DEBUG_puts("5_cupsSNMPWrite: Returning 0 (bad arguments)"); + + return (0); + } + + /* + * Create the SNMP message... + */ + + memset(&packet, 0, sizeof(packet)); + + packet.version = version; + packet.request_type = request_type; + packet.request_id = request_id; + packet.object_type = CUPS_ASN1_NULL_VALUE; + + strlcpy(packet.community, community, sizeof(packet.community)); + + for (i = 0; oid[i] >= 0 && i < (CUPS_SNMP_MAX_OID - 1); i ++) + packet.object_name[i] = oid[i]; + packet.object_name[i] = -1; + + if (oid[i] >= 0) + { + DEBUG_puts("5_cupsSNMPWrite: Returning 0 (OID too big)"); + + errno = E2BIG; + return (0); + } + + bytes = asn1_encode_snmp(buffer, sizeof(buffer), &packet); + + if (bytes < 0) + { + DEBUG_puts("5_cupsSNMPWrite: Returning 0 (request too big)"); + + errno = E2BIG; + return (0); + } + + asn1_debug("DEBUG: OUT ", buffer, bytes, 0); + + /* + * Send the message... + */ + + temp = *address; + + _httpAddrSetPort(&temp, CUPS_SNMP_PORT); + + return (sendto(fd, buffer, bytes, 0, (void *)&temp, + httpAddrLength(&temp)) == bytes); +} + + +/* + * 'asn1_debug()' - Decode an ASN1-encoded message. + */ + +static void +asn1_debug(const char *prefix, /* I - Prefix string */ + unsigned char *buffer, /* I - Buffer */ + size_t len, /* I - Length of buffer */ + int indent) /* I - Indentation */ +{ + int i; /* Looping var */ + unsigned char *bufend; /* End of buffer */ + int integer; /* Number value */ + int oid[CUPS_SNMP_MAX_OID]; /* OID value */ + char string[CUPS_SNMP_MAX_STRING]; + /* String value */ + unsigned char value_type; /* Type of value */ + int value_length; /* Length of value */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + if (cg->snmp_debug <= 0) + return; + + if (cg->snmp_debug > 1 && indent == 0) + { + /* + * Do a hex dump of the packet... + */ + + int j; + + fprintf(stderr, "%sHex Dump (%d bytes):\n", prefix, (int)len); + + for (i = 0; i < (int)len; i += 16) + { + fprintf(stderr, "%s%04x:", prefix, i); + + for (j = 0; j < 16 && (i + j) < (int)len; j ++) + { + if (j && !(j & 3)) + fprintf(stderr, " %02x", buffer[i + j]); + else + fprintf(stderr, " %02x", buffer[i + j]); + } + + while (j < 16) + { + if (j && !(j & 3)) + fputs(" ", stderr); + else + fputs(" ", stderr); + + j ++; + } + + fputs(" ", stderr); + + for (j = 0; j < 16 && (i + j) < (int)len; j ++) + if (buffer[i + j] < ' ' || buffer[i + j] >= 0x7f) + putc('.', stderr); + else + putc(buffer[i + j], stderr); + + putc('\n', stderr); + } + } + + if (indent == 0) + fprintf(stderr, "%sMessage:\n", prefix); + + bufend = buffer + len; + + while (buffer < bufend) + { + /* + * Get value type... + */ + + value_type = asn1_get_type(&buffer, bufend); + value_length = asn1_get_length(&buffer, bufend); + + switch (value_type) + { + case CUPS_ASN1_BOOLEAN : + integer = asn1_get_integer(&buffer, bufend, value_length); + + fprintf(stderr, "%s%*sBOOLEAN %d bytes %d\n", prefix, indent, "", + value_length, integer); + break; + + case CUPS_ASN1_INTEGER : + integer = asn1_get_integer(&buffer, bufend, value_length); + + fprintf(stderr, "%s%*sINTEGER %d bytes %d\n", prefix, indent, "", + value_length, integer); + break; + + case CUPS_ASN1_COUNTER : + integer = asn1_get_integer(&buffer, bufend, value_length); + + fprintf(stderr, "%s%*sCOUNTER %d bytes %u\n", prefix, indent, "", + value_length, (unsigned)integer); + break; + + case CUPS_ASN1_GAUGE : + integer = asn1_get_integer(&buffer, bufend, value_length); + + fprintf(stderr, "%s%*sGAUGE %d bytes %u\n", prefix, indent, "", + value_length, (unsigned)integer); + break; + + case CUPS_ASN1_TIMETICKS : + integer = asn1_get_integer(&buffer, bufend, value_length); + + fprintf(stderr, "%s%*sTIMETICKS %d bytes %u\n", prefix, indent, "", + value_length, (unsigned)integer); + break; + + case CUPS_ASN1_OCTET_STRING : + fprintf(stderr, "%s%*sOCTET STRING %d bytes \"%s\"\n", prefix, + indent, "", value_length, + asn1_get_string(&buffer, bufend, value_length, string, + sizeof(string))); + break; + + case CUPS_ASN1_HEX_STRING : + asn1_get_string(&buffer, bufend, value_length, string, + sizeof(string)); + fprintf(stderr, "%s%*sHex-STRING %d bytes", prefix, + indent, "", value_length); + for (i = 0; i < value_length; i ++) + fprintf(stderr, " %02X", string[i] & 255); + putc('\n', stderr); + break; + + case CUPS_ASN1_NULL_VALUE : + fprintf(stderr, "%s%*sNULL VALUE %d bytes\n", prefix, indent, "", + value_length); + + buffer += value_length; + break; + + case CUPS_ASN1_OID : + integer = asn1_get_oid(&buffer, bufend, value_length, oid, + CUPS_SNMP_MAX_OID); + + fprintf(stderr, "%s%*sOID %d bytes ", prefix, indent, "", + value_length); + for (i = 0; i < integer; i ++) + fprintf(stderr, ".%d", oid[i]); + putc('\n', stderr); + break; + + case CUPS_ASN1_SEQUENCE : + fprintf(stderr, "%s%*sSEQUENCE %d bytes\n", prefix, indent, "", + value_length); + asn1_debug(prefix, buffer, value_length, indent + 4); + + buffer += value_length; + break; + + case CUPS_ASN1_GET_NEXT_REQUEST : + fprintf(stderr, "%s%*sGet-Next-Request-PDU %d bytes\n", prefix, + indent, "", value_length); + asn1_debug(prefix, buffer, value_length, indent + 4); + + buffer += value_length; + break; + + case CUPS_ASN1_GET_REQUEST : + fprintf(stderr, "%s%*sGet-Request-PDU %d bytes\n", prefix, indent, "", + value_length); + asn1_debug(prefix, buffer, value_length, indent + 4); + + buffer += value_length; + break; + + case CUPS_ASN1_GET_RESPONSE : + fprintf(stderr, "%s%*sGet-Response-PDU %d bytes\n", prefix, indent, + "", value_length); + asn1_debug(prefix, buffer, value_length, indent + 4); + + buffer += value_length; + break; + + default : + fprintf(stderr, "%s%*sUNKNOWN(%x) %d bytes\n", prefix, indent, "", + value_type, value_length); + + buffer += value_length; + break; + } + } +} + + +/* + * 'asn1_decode_snmp()' - Decode a SNMP packet. + */ + +static int /* O - 0 on success, -1 on error */ +asn1_decode_snmp(unsigned char *buffer, /* I - Buffer */ + size_t len, /* I - Size of buffer */ + cups_snmp_t *packet) /* I - SNMP packet */ +{ + unsigned char *bufptr, /* Pointer into the data */ + *bufend; /* End of data */ + int length; /* Length of value */ + + + /* + * Initialize the decoding... + */ + + memset(packet, 0, sizeof(cups_snmp_t)); + packet->object_name[0] = -1; + + bufptr = buffer; + bufend = buffer + len; + + if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) + snmp_set_error(packet, _("Packet does not start with SEQUENCE")); + else if (asn1_get_length(&bufptr, bufend) == 0) + snmp_set_error(packet, _("SEQUENCE uses indefinite length")); + else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) + snmp_set_error(packet, _("No version number")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("Version uses indefinite length")); + else if ((packet->version = asn1_get_integer(&bufptr, bufend, length)) + != CUPS_SNMP_VERSION_1) + snmp_set_error(packet, _("Bad SNMP version number")); + else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OCTET_STRING) + snmp_set_error(packet, _("No community name")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("Community name uses indefinite length")); + else + { + asn1_get_string(&bufptr, bufend, length, packet->community, + sizeof(packet->community)); + + if ((packet->request_type = asn1_get_type(&bufptr, bufend)) + != CUPS_ASN1_GET_RESPONSE) + snmp_set_error(packet, _("Packet does not contain a Get-Response-PDU")); + else if (asn1_get_length(&bufptr, bufend) == 0) + snmp_set_error(packet, _("Get-Response-PDU uses indefinite length")); + else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) + snmp_set_error(packet, _("No request-id")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("request-id uses indefinite length")); + else + { + packet->request_id = asn1_get_integer(&bufptr, bufend, length); + + if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) + snmp_set_error(packet, _("No error-status")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("error-status uses indefinite length")); + else + { + packet->error_status = asn1_get_integer(&bufptr, bufend, length); + + if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_INTEGER) + snmp_set_error(packet, _("No error-index")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("error-index uses indefinite length")); + else + { + packet->error_index = asn1_get_integer(&bufptr, bufend, length); + + if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) + snmp_set_error(packet, _("No variable-bindings SEQUENCE")); + else if (asn1_get_length(&bufptr, bufend) == 0) + snmp_set_error(packet, + _("variable-bindings uses indefinite length")); + else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_SEQUENCE) + snmp_set_error(packet, _("No VarBind SEQUENCE")); + else if (asn1_get_length(&bufptr, bufend) == 0) + snmp_set_error(packet, _("VarBind uses indefinite length")); + else if (asn1_get_type(&bufptr, bufend) != CUPS_ASN1_OID) + snmp_set_error(packet, _("No name OID")); + else if ((length = asn1_get_length(&bufptr, bufend)) == 0) + snmp_set_error(packet, _("Name OID uses indefinite length")); + else + { + asn1_get_oid(&bufptr, bufend, length, packet->object_name, + CUPS_SNMP_MAX_OID); + + packet->object_type = asn1_get_type(&bufptr, bufend); + + if ((length = asn1_get_length(&bufptr, bufend)) == 0 && + packet->object_type != CUPS_ASN1_NULL_VALUE && + packet->object_type != CUPS_ASN1_OCTET_STRING) + snmp_set_error(packet, _("Value uses indefinite length")); + else + { + switch (packet->object_type) + { + case CUPS_ASN1_BOOLEAN : + packet->object_value.boolean = + asn1_get_integer(&bufptr, bufend, length); + break; + + case CUPS_ASN1_INTEGER : + packet->object_value.integer = + asn1_get_integer(&bufptr, bufend, length); + break; + + case CUPS_ASN1_NULL_VALUE : + break; + + case CUPS_ASN1_OCTET_STRING : + case CUPS_ASN1_BIT_STRING : + case CUPS_ASN1_HEX_STRING : + packet->object_value.string.num_bytes = length; + asn1_get_string(&bufptr, bufend, length, + (char *)packet->object_value.string.bytes, + CUPS_SNMP_MAX_STRING); + break; + + case CUPS_ASN1_OID : + asn1_get_oid(&bufptr, bufend, length, + packet->object_value.oid, CUPS_SNMP_MAX_OID); + break; + + case CUPS_ASN1_COUNTER : + packet->object_value.counter = + asn1_get_integer(&bufptr, bufend, length); + break; + + case CUPS_ASN1_GAUGE : + packet->object_value.gauge = + asn1_get_integer(&bufptr, bufend, length); + break; + + case CUPS_ASN1_TIMETICKS : + packet->object_value.timeticks = + asn1_get_integer(&bufptr, bufend, length); + break; + + default : + snmp_set_error(packet, _("Unsupported value type")); + break; + } + } + } + } + } + } + } + + return (packet->error ? -1 : 0); +} + + +/* + * 'asn1_encode_snmp()' - Encode a SNMP packet. + */ + +static int /* O - Length on success, -1 on error */ +asn1_encode_snmp(unsigned char *buffer, /* I - Buffer */ + size_t bufsize, /* I - Size of buffer */ + cups_snmp_t *packet) /* I - SNMP packet */ +{ + unsigned char *bufptr; /* Pointer into buffer */ + int total, /* Total length */ + msglen, /* Length of entire message */ + commlen, /* Length of community string */ + reqlen, /* Length of request */ + listlen, /* Length of variable list */ + varlen, /* Length of variable */ + namelen, /* Length of object name OID */ + valuelen; /* Length of object value */ + + + /* + * Get the lengths of the community string, OID, and message... + */ + + + namelen = asn1_size_oid(packet->object_name); + + switch (packet->object_type) + { + case CUPS_ASN1_NULL_VALUE : + valuelen = 0; + break; + + case CUPS_ASN1_BOOLEAN : + valuelen = asn1_size_integer(packet->object_value.boolean); + break; + + case CUPS_ASN1_INTEGER : + valuelen = asn1_size_integer(packet->object_value.integer); + break; + + case CUPS_ASN1_OCTET_STRING : + valuelen = packet->object_value.string.num_bytes; + break; + + case CUPS_ASN1_OID : + valuelen = asn1_size_oid(packet->object_value.oid); + break; + + default : + packet->error = "Unknown object type"; + return (-1); + } + + varlen = 1 + asn1_size_length(namelen) + namelen + + 1 + asn1_size_length(valuelen) + valuelen; + listlen = 1 + asn1_size_length(varlen) + varlen; + reqlen = 2 + asn1_size_integer(packet->request_id) + + 2 + asn1_size_integer(packet->error_status) + + 2 + asn1_size_integer(packet->error_index) + + 1 + asn1_size_length(listlen) + listlen; + commlen = strlen(packet->community); + msglen = 2 + asn1_size_integer(packet->version) + + 1 + asn1_size_length(commlen) + commlen + + 1 + asn1_size_length(reqlen) + reqlen; + total = 1 + asn1_size_length(msglen) + msglen; + + if (total > (int)bufsize) + { + packet->error = "Message too large for buffer"; + return (-1); + } + + /* + * Then format the message... + */ + + bufptr = buffer; + + *bufptr++ = CUPS_ASN1_SEQUENCE; /* SNMPv1 message header */ + asn1_set_length(&bufptr, msglen); + + asn1_set_integer(&bufptr, packet->version); + /* version */ + + *bufptr++ = CUPS_ASN1_OCTET_STRING; /* community */ + asn1_set_length(&bufptr, commlen); + memcpy(bufptr, packet->community, commlen); + bufptr += commlen; + + *bufptr++ = packet->request_type; /* Get-Request-PDU/Get-Next-Request-PDU */ + asn1_set_length(&bufptr, reqlen); + + asn1_set_integer(&bufptr, packet->request_id); + + asn1_set_integer(&bufptr, packet->error_status); + + asn1_set_integer(&bufptr, packet->error_index); + + *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable-bindings */ + asn1_set_length(&bufptr, listlen); + + *bufptr++ = CUPS_ASN1_SEQUENCE; /* variable */ + asn1_set_length(&bufptr, varlen); + + asn1_set_oid(&bufptr, packet->object_name); + /* ObjectName */ + + switch (packet->object_type) + { + case CUPS_ASN1_NULL_VALUE : + *bufptr++ = CUPS_ASN1_NULL_VALUE; + /* ObjectValue */ + *bufptr++ = 0; /* Length */ + break; + + case CUPS_ASN1_BOOLEAN : + asn1_set_integer(&bufptr, packet->object_value.boolean); + break; + + case CUPS_ASN1_INTEGER : + asn1_set_integer(&bufptr, packet->object_value.integer); + break; + + case CUPS_ASN1_OCTET_STRING : + *bufptr++ = CUPS_ASN1_OCTET_STRING; + asn1_set_length(&bufptr, valuelen); + memcpy(bufptr, packet->object_value.string.bytes, valuelen); + bufptr += valuelen; + break; + + case CUPS_ASN1_OID : + asn1_set_oid(&bufptr, packet->object_value.oid); + break; + + default : + break; + } + + return (bufptr - buffer); +} + + +/* + * 'asn1_get_integer()' - Get an integer value. + */ + +static int /* O - Integer value */ +asn1_get_integer( + unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend, /* I - End of buffer */ + int length) /* I - Length of value */ +{ + int value; /* Integer value */ + + + if (length > sizeof(int)) + { + (*buffer) += length; + return (0); + } + + for (value = (**buffer & 0x80) ? -1 : 0; + length > 0 && *buffer < bufend; + length --, (*buffer) ++) + value = (value << 8) | **buffer; + + return (value); +} + + +/* + * 'asn1_get_length()' - Get a value length. + */ + +static unsigned /* O - Length */ +asn1_get_length(unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend) /* I - End of buffer */ +{ + unsigned length; /* Length */ + + + length = **buffer; + (*buffer) ++; + + if (length & 128) + { + int count; /* Number of bytes for length */ + + + if ((count = length & 127) > sizeof(unsigned)) + { + (*buffer) += count; + return (0); + } + + for (length = 0; + count > 0 && *buffer < bufend; + count --, (*buffer) ++) + length = (length << 8) | **buffer; + } + + return (length); +} + + +/* + * 'asn1_get_oid()' - Get an OID value. + */ + +static int /* O - Number of OIDs */ +asn1_get_oid( + unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend, /* I - End of buffer */ + int length, /* I - Length of value */ + int *oid, /* I - OID buffer */ + int oidsize) /* I - Size of OID buffer */ +{ + unsigned char *valend; /* End of value */ + int *oidptr, /* Current OID */ + *oidend; /* End of OID buffer */ + int number; /* OID number */ + + + valend = *buffer + length; + oidptr = oid; + oidend = oid + oidsize - 1; + + if (valend > bufend) + valend = bufend; + + number = asn1_get_packed(buffer, bufend); + + if (number < 80) + { + *oidptr++ = number / 40; + number = number % 40; + *oidptr++ = number; + } + else + { + *oidptr++ = 2; + number -= 80; + *oidptr++ = number; + } + + while (*buffer < valend) + { + number = asn1_get_packed(buffer, bufend); + + if (oidptr < oidend) + *oidptr++ = number; + } + + *oidptr = -1; + + return (oidptr - oid); +} + + +/* + * 'asn1_get_packed()' - Get a packed integer value. + */ + +static int /* O - Value */ +asn1_get_packed( + unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend) /* I - End of buffer */ +{ + int value; /* Value */ + + + value = 0; + + while ((**buffer & 128) && *buffer < bufend) + { + value = (value << 7) | (**buffer & 127); + (*buffer) ++; + } + + if (*buffer < bufend) + { + value = (value << 7) | **buffer; + (*buffer) ++; + } + + return (value); +} + + +/* + * 'asn1_get_string()' - Get a string value. + */ + +static char * /* O - String */ +asn1_get_string( + unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend, /* I - End of buffer */ + int length, /* I - Value length */ + char *string, /* I - String buffer */ + int strsize) /* I - String buffer size */ +{ + if (length > (bufend - *buffer)) + length = bufend - *buffer; + + if (length < 0) + { + /* + * Disallow negative lengths! + */ + + *string = '\0'; + } + else if (length < strsize) + { + /* + * String is smaller than the buffer... + */ + + if (length > 0) + memcpy(string, *buffer, length); + + string[length] = '\0'; + } + else + { + /* + * String is larger than the buffer... + */ + + memcpy(string, *buffer, strsize - 1); + string[strsize - 1] = '\0'; + } + + if (length > 0) + (*buffer) += length; + + return (length < 0 ? NULL : string); +} + + +/* + * 'asn1_get_type()' - Get a value type. + */ + +static int /* O - Type */ +asn1_get_type(unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned char *bufend) /* I - End of buffer */ +{ + int type; /* Type */ + + + type = **buffer; + (*buffer) ++; + + if ((type & 31) == 31) + type = asn1_get_packed(buffer, bufend); + + return (type); +} + + +/* + * 'asn1_set_integer()' - Set an integer value. + */ + +static void +asn1_set_integer(unsigned char **buffer,/* IO - Pointer in buffer */ + int integer) /* I - Integer value */ +{ + **buffer = CUPS_ASN1_INTEGER; + (*buffer) ++; + + if (integer > 0x7fffff || integer < -0x800000) + { + **buffer = 4; + (*buffer) ++; + **buffer = integer >> 24; + (*buffer) ++; + **buffer = integer >> 16; + (*buffer) ++; + **buffer = integer >> 8; + (*buffer) ++; + **buffer = integer; + (*buffer) ++; + } + else if (integer > 0x7fff || integer < -0x8000) + { + **buffer = 3; + (*buffer) ++; + **buffer = integer >> 16; + (*buffer) ++; + **buffer = integer >> 8; + (*buffer) ++; + **buffer = integer; + (*buffer) ++; + } + else if (integer > 0x7f || integer < -0x80) + { + **buffer = 2; + (*buffer) ++; + **buffer = integer >> 8; + (*buffer) ++; + **buffer = integer; + (*buffer) ++; + } + else + { + **buffer = 1; + (*buffer) ++; + **buffer = integer; + (*buffer) ++; + } +} + + +/* + * 'asn1_set_length()' - Set a value length. + */ + +static void +asn1_set_length(unsigned char **buffer, /* IO - Pointer in buffer */ + unsigned length) /* I - Length value */ +{ + if (length > 255) + { + **buffer = 0x82; /* 2-byte length */ + (*buffer) ++; + **buffer = length >> 8; + (*buffer) ++; + **buffer = length; + (*buffer) ++; + } + else if (length > 127) + { + **buffer = 0x81; /* 1-byte length */ + (*buffer) ++; + **buffer = length; + (*buffer) ++; + } + else + { + **buffer = length; /* Length */ + (*buffer) ++; + } +} + + +/* + * 'asn1_set_oid()' - Set an OID value. + */ + +static void +asn1_set_oid(unsigned char **buffer, /* IO - Pointer in buffer */ + const int *oid) /* I - OID value */ +{ + **buffer = CUPS_ASN1_OID; + (*buffer) ++; + + asn1_set_length(buffer, asn1_size_oid(oid)); + + if (oid[1] < 0) + { + asn1_set_packed(buffer, oid[0] * 40); + return; + } + + asn1_set_packed(buffer, oid[0] * 40 + oid[1]); + + for (oid += 2; *oid >= 0; oid ++) + asn1_set_packed(buffer, *oid); +} + + +/* + * 'asn1_set_packed()' - Set a packed integer value. + */ + +static void +asn1_set_packed(unsigned char **buffer, /* IO - Pointer in buffer */ + int integer) /* I - Integer value */ +{ + if (integer > 0xfffffff) + { + **buffer = ((integer >> 28) & 0x7f) | 0x80; + (*buffer) ++; + } + + if (integer > 0x1fffff) + { + **buffer = ((integer >> 21) & 0x7f) | 0x80; + (*buffer) ++; + } + + if (integer > 0x3fff) + { + **buffer = ((integer >> 14) & 0x7f) | 0x80; + (*buffer) ++; + } + + if (integer > 0x7f) + { + **buffer = ((integer >> 7) & 0x7f) | 0x80; + (*buffer) ++; + } + + **buffer = integer & 0x7f; + (*buffer) ++; +} + + +/* + * 'asn1_size_integer()' - Figure out the number of bytes needed for an + * integer value. + */ + +static int /* O - Size in bytes */ +asn1_size_integer(int integer) /* I - Integer value */ +{ + if (integer > 0x7fffff || integer < -0x800000) + return (4); + else if (integer > 0x7fff || integer < -0x8000) + return (3); + else if (integer > 0x7f || integer < -0x80) + return (2); + else + return (1); +} + + +/* + * 'asn1_size_length()' - Figure out the number of bytes needed for a + * length value. + */ + +static int /* O - Size in bytes */ +asn1_size_length(int length) /* I - Length value */ +{ + if (length > 0xff) + return (3); + else if (length > 0x7f) + return (2); + else + return (1); +} + + +/* + * 'asn1_size_oid()' - Figure out the numebr of bytes needed for an + * OID value. + */ + +static int /* O - Size in bytes */ +asn1_size_oid(const int *oid) /* I - OID value */ +{ + int length; /* Length of value */ + + + if (oid[1] < 0) + return (asn1_size_packed(oid[0] * 40)); + + for (length = asn1_size_packed(oid[0] * 40 + oid[1]), oid += 2; + *oid >= 0; + oid ++) + length += asn1_size_packed(*oid); + + return (length); +} + + +/* + * 'asn1_size_packed()' - Figure out the number of bytes needed for a + * packed integer value. + */ + +static int /* O - Size in bytes */ +asn1_size_packed(int integer) /* I - Integer value */ +{ + if (integer > 0xfffffff) + return (5); + else if (integer > 0x1fffff) + return (4); + else if (integer > 0x3fff) + return (3); + else if (integer > 0x7f) + return (2); + else + return (1); +} + + +/* + * 'snmp_set_error()' - Set the localized error for a packet. + */ + +static void +snmp_set_error(cups_snmp_t *packet, /* I - Packet */ + const char *message) /* I - Error message */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + + + if (!cg->lang_default) + cg->lang_default = cupsLangDefault(); + + packet->error = _cupsLangString(cg->lang_default, message); +} + + +/* + * End of "$Id: snmp.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/snprintf.c b/cups/snprintf.c new file mode 100644 index 0000000..75e92cd --- /dev/null +++ b/cups/snprintf.c @@ -0,0 +1,362 @@ +/* + * "$Id: snprintf.c 9042 2010-03-24 00:45:34Z mike $" + * + * snprintf functions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cups_vsnprintf() - Format a string into a fixed size buffer. + * _cups_snprintf() - Format a string into a fixed size buffer. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" + + +#ifndef HAVE_VSNPRINTF +/* + * '_cups_vsnprintf()' - Format a string into a fixed size buffer. + */ + +int /* O - Number of bytes formatted */ +_cups_vsnprintf(char *buffer, /* O - Output buffer */ + size_t bufsize, /* O - Size of output buffer */ + const char *format, /* I - printf-style format string */ + va_list ap) /* I - Pointer to additional arguments */ +{ + char *bufptr, /* Pointer to position in buffer */ + *bufend, /* Pointer to end of buffer */ + sign, /* Sign of format width */ + size, /* Size character (h, l, L) */ + type; /* Format type character */ + int width, /* Width of field */ + prec; /* Number of characters of precision */ + char tformat[100], /* Temporary format string for sprintf() */ + *tptr, /* Pointer into temporary format */ + temp[1024]; /* Buffer for formatted numbers */ + char *s; /* Pointer to string */ + int slen; /* Length of string */ + int bytes; /* Total number of bytes needed */ + + + /* + * Loop through the format string, formatting as needed... + */ + + bufptr = buffer; + bufend = buffer + bufsize - 1; + bytes = 0; + + while (*format) + { + if (*format == '%') + { + tptr = tformat; + *tptr++ = *format++; + + if (*format == '%') + { + if (bufptr && bufptr < bufend) *bufptr++ = *format; + bytes ++; + format ++; + continue; + } + else if (strchr(" -+#\'", *format)) + { + *tptr++ = *format; + sign = *format++; + } + else + sign = 0; + + if (*format == '*') + { + /* + * Get width from argument... + */ + + format ++; + width = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); + tptr += strlen(tptr); + } + else + { + width = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + width = width * 10 + *format++ - '0'; + } + } + + if (*format == '.') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + format ++; + + if (*format == '*') + { + /* + * Get precision from argument... + */ + + format ++; + prec = va_arg(ap, int); + + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); + tptr += strlen(tptr); + } + else + { + prec = 0; + + while (isdigit(*format & 255)) + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + prec = prec * 10 + *format++ - '0'; + } + } + } + else + prec = -1; + + if (*format == 'l' && format[1] == 'l') + { + size = 'L'; + + if (tptr < (tformat + sizeof(tformat) - 2)) + { + *tptr++ = 'l'; + *tptr++ = 'l'; + } + + format += 2; + } + else if (*format == 'h' || *format == 'l' || *format == 'L') + { + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + size = *format++; + } + + if (!*format) + break; + + if (tptr < (tformat + sizeof(tformat) - 1)) + *tptr++ = *format; + + type = *format++; + *tptr = '\0'; + + switch (type) + { + case 'E' : /* Floating point formats */ + case 'G' : + case 'e' : + case 'f' : + case 'g' : + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, double)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'B' : /* Integer formats */ + case 'X' : + case 'b' : + case 'd' : + case 'i' : + case 'o' : + case 'u' : + case 'x' : + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, int)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'p' : /* Pointer value */ + if ((width + 2) > sizeof(temp)) + break; + + sprintf(temp, tformat, va_arg(ap, void *)); + + bytes += (int)strlen(temp); + + if (bufptr) + { + if ((bufptr + strlen(temp)) > bufend) + { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } + else + { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'c' : /* Character or character array */ + bytes += width; + + if (bufptr) + { + if (width <= 1) + *bufptr++ = va_arg(ap, int); + else + { + if ((bufptr + width) > bufend) + width = (int)(bufend - bufptr); + + memcpy(bufptr, va_arg(ap, char *), (size_t)width); + bufptr += width; + } + } + break; + + case 's' : /* String */ + if ((s = va_arg(ap, char *)) == NULL) + s = "(null)"; + + slen = (int)strlen(s); + if (slen > width && prec != width) + width = slen; + + bytes += width; + + if (bufptr) + { + if ((bufptr + width) > bufend) + width = (int)(bufend - bufptr); + + if (slen > width) + slen = width; + + if (sign == '-') + { + strncpy(bufptr, s, (size_t)slen); + memset(bufptr + slen, ' ', (size_t)(width - slen)); + } + else + { + memset(bufptr, ' ', (size_t)(width - slen)); + strncpy(bufptr + width - slen, s, (size_t)slen); + } + + bufptr += width; + } + break; + + case 'n' : /* Output number of chars so far */ + *(va_arg(ap, int *)) = bytes; + break; + } + } + else + { + bytes ++; + + if (bufptr && bufptr < bufend) + *bufptr++ = *format; + + format ++; + } + } + + /* + * Nul-terminate the string and return the number of characters needed. + */ + + *bufptr = '\0'; + + return (bytes); +} +#endif /* !HAVE_VSNPRINT */ + + +#ifndef HAVE_SNPRINTF +/* + * '_cups_snprintf()' - Format a string into a fixed size buffer. + */ + +int /* O - Number of bytes formatted */ +_cups_snprintf(char *buffer, /* O - Output buffer */ + size_t bufsize, /* O - Size of output buffer */ + const char *format, /* I - printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + int bytes; /* Number of bytes formatted */ + va_list ap; /* Pointer to additional arguments */ + + + va_start(ap, format); + bytes = vsnprintf(buffer, bufsize, format, ap); + va_end(ap); + + return (bytes); +} +#endif /* !HAVE_SNPRINTF */ + + +/* + * End of "$Id: snprintf.c 9042 2010-03-24 00:45:34Z mike $". + */ + diff --git a/cups/sspi-private.h b/cups/sspi-private.h new file mode 100644 index 0000000..e8f36c2 --- /dev/null +++ b/cups/sspi-private.h @@ -0,0 +1,82 @@ +/* + * Private SSPI definitions for CUPS. + * + * Copyright 2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_SSPI_PRIVATE_H_ +# define _CUPS_SSPI_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include +# include +# include +# define SECURITY_WIN32 +# include +# include + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +typedef struct /**** SSPI/SSL data structure ****/ +{ + SOCKET sock; /* TCP/IP socket */ + CredHandle creds; /* Credentials */ + CtxtHandle context; /* SSL context */ + BOOL contextInitialized; /* Is context init'd? */ + SecPkgContext_StreamSizes streamSizes; /* SSL data stream sizes */ + BYTE *decryptBuffer; /* Data pre-decryption*/ + size_t decryptBufferLength; /* Length of decrypt buffer */ + size_t decryptBufferUsed; /* Bytes used in buffer */ + BYTE *readBuffer; /* Data post-decryption */ + size_t readBufferLength; /* Length of read buffer */ + size_t readBufferUsed; /* Bytes used in buffer */ + DWORD certFlags; /* Cert verification flags */ +} _sspi_struct_t; + + +/* + * Prototypes... + */ +_sspi_struct_t *_sspiAlloc(void); +BOOL _sspiAccept(_sspi_struct_t *conn); +BOOL _sspiConnect(_sspi_struct_t *conn, + const CHAR *hostname); +void _sspiFree(_sspi_struct_t *conn); +BOOL _sspiGetCredentials(_sspi_struct_t *conn, + const LPWSTR containerName, + const TCHAR *commonName, + BOOL server); +int _sspiPending(_sspi_struct_t *conn); +int _sspiRead(_sspi_struct_t *conn, + void *buf, size_t len); +void _sspiSetAllowsAnyRoot(_sspi_struct_t *conn, + BOOL allow); +void _sspiSetAllowsExpiredCerts(_sspi_struct_t *conn, + BOOL allow); +int _sspiWrite(_sspi_struct_t *conn, + void *buf, size_t len); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_SSPI_PRIVATE_H_ */ diff --git a/cups/sspi.c b/cups/sspi.c new file mode 100644 index 0000000..3ad3a01 --- /dev/null +++ b/cups/sspi.c @@ -0,0 +1,1485 @@ +/* + * "$Id: sspi.c 9771 2011-05-12 05:21:56Z mike $" + * + * Windows SSPI SSL implementation for CUPS. + * + * Copyright 2010-2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * sspi_alloc() - Allocate SSPI ssl object + * _sspiGetCredentials() - Retrieve an SSL/TLS certificate from the + * system store If one cannot be found, one is + * created. + * _sspiConnect() - Make an SSL connection. This function + * assumes a TCP/IP connection has already been + * successfully made + * _sspiAccept() - Accept an SSL/TLS connection + * _sspiSetAllowsAnyRoot() - Set the client cert policy for untrusted + * root certs + * _sspiSetAllowsExpiredCerts() - Set the client cert policy for expired root + * certs + * _sspiWrite() - Write a buffer to an ssl socket + * _sspiRead() - Read a buffer from an ssl socket + * _sspiPending() - Returns the number of available bytes + * _sspiFree() - Close a connection and free resources + * sspi_verify_certificate() - Verify a server certificate + */ + +/* + * Include necessary headers... + */ + +#include "sspi-private.h" +#include "debug-private.h" + + +/* required to link this library for certificate functions */ +#pragma comment(lib, "Crypt32.lib") +#pragma comment(lib, "Secur32.lib") +#pragma comment(lib, "Ws2_32.lib") + + +#if !defined(SECURITY_FLAG_IGNORE_UNKNOWN_CA) +# define SECURITY_FLAG_IGNORE_UNKNOWN_CA 0x00000100 /* Untrusted root */ +#endif + +#if !defined(SECURITY_FLAG_IGNORE_CERT_DATE_INVALID) +# define SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 0x00002000 /* Expired X509 Cert. */ +#endif + +static DWORD sspi_verify_certificate(PCCERT_CONTEXT serverCert, + const CHAR *serverName, + DWORD dwCertFlags); + + +/* + * 'sspi_alloc()' - Allocate SSPI ssl object + */ +_sspi_struct_t* /* O - New SSPI/SSL object */ +_sspiAlloc(void) +{ + _sspi_struct_t *conn = calloc(sizeof(_sspi_struct_t), 1); + + if (conn) + conn->sock = INVALID_SOCKET; + + return (conn); +} + + +/* + * '_sspiGetCredentials()' - Retrieve an SSL/TLS certificate from the system store + * If one cannot be found, one is created. + */ +BOOL /* O - 1 on success, 0 on failure */ +_sspiGetCredentials(_sspi_struct_t *conn, + /* I - Client connection */ + const LPWSTR container, + /* I - Cert container name */ + const TCHAR *cn, /* I - Common name of certificate */ + BOOL isServer) + /* I - Is caller a server? */ +{ + HCERTSTORE store = NULL; /* Certificate store */ + PCCERT_CONTEXT storedContext = NULL; + /* Context created from the store */ + PCCERT_CONTEXT createdContext = NULL; + /* Context created by us */ + DWORD dwSize = 0; /* 32 bit size */ + PBYTE p = NULL; /* Temporary storage */ + HCRYPTPROV hProv = (HCRYPTPROV) NULL; + /* Handle to a CSP */ + CERT_NAME_BLOB sib; /* Arbitrary array of bytes */ + SCHANNEL_CRED SchannelCred; /* Schannel credential data */ + TimeStamp tsExpiry; /* Time stamp */ + SECURITY_STATUS Status; /* Status */ + HCRYPTKEY hKey = (HCRYPTKEY) NULL; + /* Handle to crypto key */ + CRYPT_KEY_PROV_INFO kpi; /* Key container info */ + SYSTEMTIME et; /* System time */ + CERT_EXTENSIONS exts; /* Array of cert extensions */ + CRYPT_KEY_PROV_INFO ckp; /* Handle to crypto key */ + BOOL ok = TRUE; /* Return value */ + + if (!conn) + return (FALSE); + if (!cn) + return (FALSE); + + if (!CryptAcquireContextW(&hProv, (LPWSTR) container, MS_DEF_PROV_W, + PROV_RSA_FULL, + CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET)) + { + if (GetLastError() == NTE_EXISTS) + { + if (!CryptAcquireContextW(&hProv, (LPWSTR) container, MS_DEF_PROV_W, + PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) + { + DEBUG_printf(("_sspiGetCredentials: CryptAcquireContext failed: %x\n", + GetLastError())); + ok = FALSE; + goto cleanup; + } + } + } + + store = CertOpenStore(CERT_STORE_PROV_SYSTEM, + X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, + hProv, + CERT_SYSTEM_STORE_LOCAL_MACHINE | + CERT_STORE_NO_CRYPT_RELEASE_FLAG | + CERT_STORE_OPEN_EXISTING_FLAG, + L"MY"); + + if (!store) + { + DEBUG_printf(("_sspiGetCredentials: CertOpenSystemStore failed: %x\n", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + dwSize = 0; + + if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR, + NULL, NULL, &dwSize, NULL)) + { + DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x\n", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + p = (PBYTE) malloc(dwSize); + + if (!p) + { + DEBUG_printf(("_sspiGetCredentials: malloc failed for %d bytes", dwSize)); + ok = FALSE; + goto cleanup; + } + + if (!CertStrToName(X509_ASN_ENCODING, cn, CERT_OID_NAME_STR, NULL, + p, &dwSize, NULL)) + { + DEBUG_printf(("_sspiGetCredentials: CertStrToName failed: %x", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + sib.cbData = dwSize; + sib.pbData = p; + + storedContext = CertFindCertificateInStore(store, X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, + 0, CERT_FIND_SUBJECT_NAME, &sib, NULL); + + if (!storedContext) + { + /* + * If we couldn't find the context, then we'll + * create a new one + */ + if (!CryptGenKey(hProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hKey)) + { + DEBUG_printf(("_sspiGetCredentials: CryptGenKey failed: %x", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + ZeroMemory(&kpi, sizeof(kpi)); + kpi.pwszContainerName = (LPWSTR) container; + kpi.pwszProvName = MS_DEF_PROV_W; + kpi.dwProvType = PROV_RSA_FULL; + kpi.dwFlags = CERT_SET_KEY_CONTEXT_PROP_ID; + kpi.dwKeySpec = AT_KEYEXCHANGE; + + GetSystemTime(&et); + et.wYear += 10; + + ZeroMemory(&exts, sizeof(exts)); + + createdContext = CertCreateSelfSignCertificate(hProv, &sib, 0, &kpi, NULL, NULL, + &et, &exts); + + if (!createdContext) + { + DEBUG_printf(("_sspiGetCredentials: CertCreateSelfSignCertificate failed: %x", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + if (!CertAddCertificateContextToStore(store, createdContext, + CERT_STORE_ADD_REPLACE_EXISTING, + &storedContext)) + { + DEBUG_printf(("_sspiGetCredentials: CertAddCertificateContextToStore failed: %x", + GetLastError())); + ok = FALSE; + goto cleanup; + } + + ZeroMemory(&ckp, sizeof(ckp)); + ckp.pwszContainerName = (LPWSTR) container; + ckp.pwszProvName = MS_DEF_PROV_W; + ckp.dwProvType = PROV_RSA_FULL; + ckp.dwFlags = CRYPT_MACHINE_KEYSET; + ckp.dwKeySpec = AT_KEYEXCHANGE; + + if (!CertSetCertificateContextProperty(storedContext, + CERT_KEY_PROV_INFO_PROP_ID, + 0, &ckp)) + { + DEBUG_printf(("_sspiGetCredentials: CertSetCertificateContextProperty failed: %x", + GetLastError())); + ok = FALSE; + goto cleanup; + } + } + + ZeroMemory(&SchannelCred, sizeof(SchannelCred)); + + SchannelCred.dwVersion = SCHANNEL_CRED_VERSION; + SchannelCred.cCreds = 1; + SchannelCred.paCred = &storedContext; + + /* + * SSPI doesn't seem to like it if grbitEnabledProtocols + * is set for a client + */ + if (isServer) + SchannelCred.grbitEnabledProtocols = SP_PROT_SSL3TLS1; + + /* + * Create an SSPI credential. + */ + Status = AcquireCredentialsHandle(NULL, UNISP_NAME, + isServer ? SECPKG_CRED_INBOUND:SECPKG_CRED_OUTBOUND, + NULL, &SchannelCred, NULL, NULL, &conn->creds, + &tsExpiry); + if (Status != SEC_E_OK) + { + DEBUG_printf(("_sspiGetCredentials: AcquireCredentialsHandle failed: %x", Status)); + ok = FALSE; + goto cleanup; + } + +cleanup: + + /* + * Cleanup + */ + if (hKey) + CryptDestroyKey(hKey); + + if (createdContext) + CertFreeCertificateContext(createdContext); + + if (storedContext) + CertFreeCertificateContext(storedContext); + + if (p) + free(p); + + if (store) + CertCloseStore(store, 0); + + if (hProv) + CryptReleaseContext(hProv, 0); + + return (ok); +} + + +/* + * '_sspiConnect()' - Make an SSL connection. This function + * assumes a TCP/IP connection has already + * been successfully made + */ +BOOL /* O - 1 on success, 0 on failure */ +_sspiConnect(_sspi_struct_t *conn, /* I - Client connection */ + const CHAR *hostname) /* I - Server hostname */ +{ + PCCERT_CONTEXT serverCert; /* Server certificate */ + DWORD dwSSPIFlags; /* SSL connection attributes we want */ + DWORD dwSSPIOutFlags; /* SSL connection attributes we got */ + TimeStamp tsExpiry; /* Time stamp */ + SECURITY_STATUS scRet; /* Status */ + DWORD cbData; /* Data count */ + SecBufferDesc inBuffer; /* Array of SecBuffer structs */ + SecBuffer inBuffers[2]; /* Security package buffer */ + SecBufferDesc outBuffer; /* Array of SecBuffer structs */ + SecBuffer outBuffers[1]; /* Security package buffer */ + BOOL ok = TRUE; /* Return value */ + + serverCert = NULL; + + dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT | + ISC_REQ_REPLAY_DETECT | + ISC_REQ_CONFIDENTIALITY | + ISC_RET_EXTENDED_ERROR | + ISC_REQ_ALLOCATE_MEMORY | + ISC_REQ_STREAM; + + /* + * Initiate a ClientHello message and generate a token. + */ + outBuffers[0].pvBuffer = NULL; + outBuffers[0].BufferType = SECBUFFER_TOKEN; + outBuffers[0].cbBuffer = 0; + + outBuffer.cBuffers = 1; + outBuffer.pBuffers = outBuffers; + outBuffer.ulVersion = SECBUFFER_VERSION; + + scRet = InitializeSecurityContext(&conn->creds, NULL, TEXT(""), dwSSPIFlags, + 0, SECURITY_NATIVE_DREP, NULL, 0, &conn->context, + &outBuffer, &dwSSPIOutFlags, &tsExpiry); + + if (scRet != SEC_I_CONTINUE_NEEDED) + { + DEBUG_printf(("_sspiConnect: InitializeSecurityContext(1) failed: %x", scRet)); + ok = FALSE; + goto cleanup; + } + + /* + * Send response to server if there is one. + */ + if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) + { + cbData = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0); + + if ((cbData == SOCKET_ERROR) || !cbData) + { + DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError())); + FreeContextBuffer(outBuffers[0].pvBuffer); + DeleteSecurityContext(&conn->context); + ok = FALSE; + goto cleanup; + } + + DEBUG_printf(("_sspiConnect: %d bytes of handshake data sent", cbData)); + + /* + * Free output buffer. + */ + FreeContextBuffer(outBuffers[0].pvBuffer); + outBuffers[0].pvBuffer = NULL; + } + + dwSSPIFlags = ISC_REQ_MANUAL_CRED_VALIDATION | + ISC_REQ_SEQUENCE_DETECT | + ISC_REQ_REPLAY_DETECT | + ISC_REQ_CONFIDENTIALITY | + ISC_RET_EXTENDED_ERROR | + ISC_REQ_ALLOCATE_MEMORY | + ISC_REQ_STREAM; + + conn->decryptBufferUsed = 0; + + /* + * Loop until the handshake is finished or an error occurs. + */ + scRet = SEC_I_CONTINUE_NEEDED; + + while(scRet == SEC_I_CONTINUE_NEEDED || + scRet == SEC_E_INCOMPLETE_MESSAGE || + scRet == SEC_I_INCOMPLETE_CREDENTIALS) + { + if ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE)) + { + if (conn->decryptBufferLength <= conn->decryptBufferUsed) + { + conn->decryptBufferLength += 4096; + conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer, conn->decryptBufferLength); + + if (!conn->decryptBuffer) + { + DEBUG_printf(("_sspiConnect: unable to allocate %d byte decrypt buffer", + conn->decryptBufferLength)); + SetLastError(E_OUTOFMEMORY); + ok = FALSE; + goto cleanup; + } + } + + cbData = recv(conn->sock, conn->decryptBuffer + conn->decryptBufferUsed, + (int) (conn->decryptBufferLength - conn->decryptBufferUsed), 0); + + if (cbData == SOCKET_ERROR) + { + DEBUG_printf(("_sspiConnect: recv failed: %d", WSAGetLastError())); + ok = FALSE; + goto cleanup; + } + else if (cbData == 0) + { + DEBUG_printf(("_sspiConnect: server unexpectedly disconnected")); + ok = FALSE; + goto cleanup; + } + + DEBUG_printf(("_sspiConnect: %d bytes of handshake data received", + cbData)); + + conn->decryptBufferUsed += cbData; + } + + /* + * Set up the input buffers. Buffer 0 is used to pass in data + * received from the server. Schannel will consume some or all + * of this. Leftover data (if any) will be placed in buffer 1 and + * given a buffer type of SECBUFFER_EXTRA. + */ + inBuffers[0].pvBuffer = conn->decryptBuffer; + inBuffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed; + inBuffers[0].BufferType = SECBUFFER_TOKEN; + + inBuffers[1].pvBuffer = NULL; + inBuffers[1].cbBuffer = 0; + inBuffers[1].BufferType = SECBUFFER_EMPTY; + + inBuffer.cBuffers = 2; + inBuffer.pBuffers = inBuffers; + inBuffer.ulVersion = SECBUFFER_VERSION; + + /* + * Set up the output buffers. These are initialized to NULL + * so as to make it less likely we'll attempt to free random + * garbage later. + */ + outBuffers[0].pvBuffer = NULL; + outBuffers[0].BufferType= SECBUFFER_TOKEN; + outBuffers[0].cbBuffer = 0; + + outBuffer.cBuffers = 1; + outBuffer.pBuffers = outBuffers; + outBuffer.ulVersion = SECBUFFER_VERSION; + + /* + * Call InitializeSecurityContext. + */ + scRet = InitializeSecurityContext(&conn->creds, &conn->context, NULL, dwSSPIFlags, + 0, SECURITY_NATIVE_DREP, &inBuffer, 0, NULL, + &outBuffer, &dwSSPIOutFlags, &tsExpiry); + + /* + * If InitializeSecurityContext was successful (or if the error was + * one of the special extended ones), send the contends of the output + * buffer to the server. + */ + if (scRet == SEC_E_OK || + scRet == SEC_I_CONTINUE_NEEDED || + FAILED(scRet) && (dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR)) + { + if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) + { + cbData = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0); + + if ((cbData == SOCKET_ERROR) || !cbData) + { + DEBUG_printf(("_sspiConnect: send failed: %d", WSAGetLastError())); + FreeContextBuffer(outBuffers[0].pvBuffer); + DeleteSecurityContext(&conn->context); + ok = FALSE; + goto cleanup; + } + + DEBUG_printf(("_sspiConnect: %d bytes of handshake data sent", cbData)); + + /* + * Free output buffer. + */ + FreeContextBuffer(outBuffers[0].pvBuffer); + outBuffers[0].pvBuffer = NULL; + } + } + + /* + * If InitializeSecurityContext returned SEC_E_INCOMPLETE_MESSAGE, + * then we need to read more data from the server and try again. + */ + if (scRet == SEC_E_INCOMPLETE_MESSAGE) + continue; + + /* + * If InitializeSecurityContext returned SEC_E_OK, then the + * handshake completed successfully. + */ + if (scRet == SEC_E_OK) + { + /* + * If the "extra" buffer contains data, this is encrypted application + * protocol layer stuff. It needs to be saved. The application layer + * will later decrypt it with DecryptMessage. + */ + DEBUG_printf(("_sspiConnect: Handshake was successful")); + + if (inBuffers[1].BufferType == SECBUFFER_EXTRA) + { + if (conn->decryptBufferLength < inBuffers[1].cbBuffer) + { + conn->decryptBuffer = realloc(conn->decryptBuffer, inBuffers[1].cbBuffer); + + if (!conn->decryptBuffer) + { + DEBUG_printf(("_sspiConnect: unable to allocate %d bytes for decrypt buffer", + inBuffers[1].cbBuffer)); + SetLastError(E_OUTOFMEMORY); + ok = FALSE; + goto cleanup; + } + } + + memmove(conn->decryptBuffer, + conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer), + inBuffers[1].cbBuffer); + + conn->decryptBufferUsed = inBuffers[1].cbBuffer; + + DEBUG_printf(("_sspiConnect: %d bytes of app data was bundled with handshake data", + conn->decryptBufferUsed)); + } + else + conn->decryptBufferUsed = 0; + + /* + * Bail out to quit + */ + break; + } + + /* + * Check for fatal error. + */ + if (FAILED(scRet)) + { + DEBUG_printf(("_sspiConnect: InitializeSecurityContext(2) failed: %x", scRet)); + ok = FALSE; + break; + } + + /* + * If InitializeSecurityContext returned SEC_I_INCOMPLETE_CREDENTIALS, + * then the server just requested client authentication. + */ + if (scRet == SEC_I_INCOMPLETE_CREDENTIALS) + { + /* + * Unimplemented + */ + DEBUG_printf(("_sspiConnect: server requested client credentials")); + ok = FALSE; + break; + } + + /* + * Copy any leftover data from the "extra" buffer, and go around + * again. + */ + if (inBuffers[1].BufferType == SECBUFFER_EXTRA) + { + memmove(conn->decryptBuffer, + conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer), + inBuffers[1].cbBuffer); + + conn->decryptBufferUsed = inBuffers[1].cbBuffer; + } + else + { + conn->decryptBufferUsed = 0; + } + } + + if (ok) + { + conn->contextInitialized = TRUE; + + /* + * Get the server cert + */ + scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, (VOID*) &serverCert ); + + if (scRet != SEC_E_OK) + { + DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_REMOTE_CERT_CONTEXT): %x", scRet)); + ok = FALSE; + goto cleanup; + } + + scRet = sspi_verify_certificate(serverCert, hostname, conn->certFlags); + + if (scRet != SEC_E_OK) + { + DEBUG_printf(("_sspiConnect: sspi_verify_certificate failed: %x", scRet)); + ok = FALSE; + goto cleanup; + } + + /* + * Find out how big the header/trailer will be: + */ + scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes); + + if (scRet != SEC_E_OK) + { + DEBUG_printf(("_sspiConnect: QueryContextAttributes failed(SECPKG_ATTR_STREAM_SIZES): %x", scRet)); + ok = FALSE; + } + } + +cleanup: + + if (serverCert) + CertFreeCertificateContext(serverCert); + + return (ok); +} + + +/* + * '_sspiAccept()' - Accept an SSL/TLS connection + */ +BOOL /* O - 1 on success, 0 on failure */ +_sspiAccept(_sspi_struct_t *conn) /* I - Client connection */ +{ + DWORD dwSSPIFlags; /* SSL connection attributes we want */ + DWORD dwSSPIOutFlags; /* SSL connection attributes we got */ + TimeStamp tsExpiry; /* Time stamp */ + SECURITY_STATUS scRet; /* SSPI Status */ + SecBufferDesc inBuffer; /* Array of SecBuffer structs */ + SecBuffer inBuffers[2]; /* Security package buffer */ + SecBufferDesc outBuffer; /* Array of SecBuffer structs */ + SecBuffer outBuffers[1]; /* Security package buffer */ + DWORD num = 0; /* 32 bit status value */ + BOOL fInitContext = TRUE; + /* Has the context been init'd? */ + BOOL ok = TRUE; /* Return value */ + + if (!conn) + return (FALSE); + + dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT | + ASC_REQ_REPLAY_DETECT | + ASC_REQ_CONFIDENTIALITY | + ASC_REQ_EXTENDED_ERROR | + ASC_REQ_ALLOCATE_MEMORY | + ASC_REQ_STREAM; + + conn->decryptBufferUsed = 0; + + /* + * Set OutBuffer for AcceptSecurityContext call + */ + outBuffer.cBuffers = 1; + outBuffer.pBuffers = outBuffers; + outBuffer.ulVersion = SECBUFFER_VERSION; + + scRet = SEC_I_CONTINUE_NEEDED; + + while (scRet == SEC_I_CONTINUE_NEEDED || + scRet == SEC_E_INCOMPLETE_MESSAGE || + scRet == SEC_I_INCOMPLETE_CREDENTIALS) + { + if ((conn->decryptBufferUsed == 0) || (scRet == SEC_E_INCOMPLETE_MESSAGE)) + { + if (conn->decryptBufferLength <= conn->decryptBufferUsed) + { + conn->decryptBufferLength += 4096; + conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer, + conn->decryptBufferLength); + + if (!conn->decryptBuffer) + { + DEBUG_printf(("_sspiAccept: unable to allocate %d byte decrypt buffer", + conn->decryptBufferLength)); + ok = FALSE; + goto cleanup; + } + } + + for (;;) + { + num = recv(conn->sock, + conn->decryptBuffer + conn->decryptBufferUsed, + (int)(conn->decryptBufferLength - conn->decryptBufferUsed), + 0); + + if ((num == SOCKET_ERROR) && (WSAGetLastError() == WSAEWOULDBLOCK)) + Sleep(1); + else + break; + } + + if (num == SOCKET_ERROR) + { + DEBUG_printf(("_sspiAccept: recv failed: %d", WSAGetLastError())); + ok = FALSE; + goto cleanup; + } + else if (num == 0) + { + DEBUG_printf(("_sspiAccept: client disconnected")); + ok = FALSE; + goto cleanup; + } + + DEBUG_printf(("_sspiAccept: received %d (handshake) bytes from client", + num)); + conn->decryptBufferUsed += num; + } + + /* + * InBuffers[1] is for getting extra data that + * SSPI/SCHANNEL doesn't proccess on this + * run around the loop. + */ + inBuffers[0].pvBuffer = conn->decryptBuffer; + inBuffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed; + inBuffers[0].BufferType = SECBUFFER_TOKEN; + + inBuffers[1].pvBuffer = NULL; + inBuffers[1].cbBuffer = 0; + inBuffers[1].BufferType = SECBUFFER_EMPTY; + + inBuffer.cBuffers = 2; + inBuffer.pBuffers = inBuffers; + inBuffer.ulVersion = SECBUFFER_VERSION; + + /* + * Initialize these so if we fail, pvBuffer contains NULL, + * so we don't try to free random garbage at the quit + */ + outBuffers[0].pvBuffer = NULL; + outBuffers[0].BufferType = SECBUFFER_TOKEN; + outBuffers[0].cbBuffer = 0; + + scRet = AcceptSecurityContext(&conn->creds, (fInitContext?NULL:&conn->context), + &inBuffer, dwSSPIFlags, SECURITY_NATIVE_DREP, + (fInitContext?&conn->context:NULL), &outBuffer, + &dwSSPIOutFlags, &tsExpiry); + + fInitContext = FALSE; + + if (scRet == SEC_E_OK || + scRet == SEC_I_CONTINUE_NEEDED || + (FAILED(scRet) && ((dwSSPIOutFlags & ISC_RET_EXTENDED_ERROR) != 0))) + { + if (outBuffers[0].cbBuffer && outBuffers[0].pvBuffer) + { + /* + * Send response to server if there is one + */ + num = send(conn->sock, outBuffers[0].pvBuffer, outBuffers[0].cbBuffer, 0); + + if ((num == SOCKET_ERROR) || (num == 0)) + { + DEBUG_printf(("_sspiAccept: handshake send failed: %d", WSAGetLastError())); + ok = FALSE; + goto cleanup; + } + + DEBUG_printf(("_sspiAccept: send %d handshake bytes to client", + outBuffers[0].cbBuffer)); + + FreeContextBuffer(outBuffers[0].pvBuffer); + outBuffers[0].pvBuffer = NULL; + } + } + + if (scRet == SEC_E_OK) + { + /* + * If there's extra data then save it for + * next time we go to decrypt + */ + if (inBuffers[1].BufferType == SECBUFFER_EXTRA) + { + memcpy(conn->decryptBuffer, + (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)), + inBuffers[1].cbBuffer); + conn->decryptBufferUsed = inBuffers[1].cbBuffer; + } + else + { + conn->decryptBufferUsed = 0; + } + + ok = TRUE; + break; + } + else if (FAILED(scRet) && (scRet != SEC_E_INCOMPLETE_MESSAGE)) + { + DEBUG_printf(("_sspiAccept: AcceptSecurityContext failed: %x", scRet)); + ok = FALSE; + break; + } + + if (scRet != SEC_E_INCOMPLETE_MESSAGE && + scRet != SEC_I_INCOMPLETE_CREDENTIALS) + { + if (inBuffers[1].BufferType == SECBUFFER_EXTRA) + { + memcpy(conn->decryptBuffer, + (LPBYTE) (conn->decryptBuffer + (conn->decryptBufferUsed - inBuffers[1].cbBuffer)), + inBuffers[1].cbBuffer); + conn->decryptBufferUsed = inBuffers[1].cbBuffer; + } + else + { + conn->decryptBufferUsed = 0; + } + } + } + + if (ok) + { + conn->contextInitialized = TRUE; + + /* + * Find out how big the header will be: + */ + scRet = QueryContextAttributes(&conn->context, SECPKG_ATTR_STREAM_SIZES, &conn->streamSizes); + + if (scRet != SEC_E_OK) + { + DEBUG_printf(("_sspiAccept: QueryContextAttributes failed: %x", scRet)); + ok = FALSE; + } + } + +cleanup: + + return (ok); +} + + +/* + * '_sspiSetAllowsAnyRoot()' - Set the client cert policy for untrusted root certs + */ +void +_sspiSetAllowsAnyRoot(_sspi_struct_t *conn, + /* I - Client connection */ + BOOL allow) + /* I - Allow any root */ +{ + conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_UNKNOWN_CA : + conn->certFlags & ~SECURITY_FLAG_IGNORE_UNKNOWN_CA; +} + + +/* + * '_sspiSetAllowsExpiredCerts()' - Set the client cert policy for expired root certs + */ +void +_sspiSetAllowsExpiredCerts(_sspi_struct_t *conn, + /* I - Client connection */ + BOOL allow) + /* I - Allow expired certs */ +{ + conn->certFlags = (allow) ? conn->certFlags | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID : + conn->certFlags & ~SECURITY_FLAG_IGNORE_CERT_DATE_INVALID; +} + + +/* + * '_sspiWrite()' - Write a buffer to an ssl socket + */ +int /* O - Bytes written or SOCKET_ERROR */ +_sspiWrite(_sspi_struct_t *conn, /* I - Client connection */ + void *buf, /* I - Buffer */ + size_t len) /* I - Buffer length */ +{ + SecBufferDesc message; /* Array of SecBuffer struct */ + SecBuffer buffers[4] = { 0 }; /* Security package buffer */ + BYTE *buffer = NULL; /* Scratch buffer */ + int bufferLen; /* Buffer length */ + size_t bytesLeft; /* Bytes left to write */ + int index = 0; /* Index into buffer */ + int num = 0; /* Return value */ + + if (!conn || !buf || !len) + { + WSASetLastError(WSAEINVAL); + num = SOCKET_ERROR; + goto cleanup; + } + + bufferLen = conn->streamSizes.cbMaximumMessage + + conn->streamSizes.cbHeader + + conn->streamSizes.cbTrailer; + + buffer = (BYTE*) malloc(bufferLen); + + if (!buffer) + { + DEBUG_printf(("_sspiWrite: buffer alloc of %d bytes failed", bufferLen)); + WSASetLastError(E_OUTOFMEMORY); + num = SOCKET_ERROR; + goto cleanup; + } + + bytesLeft = len; + + while (bytesLeft) + { + size_t chunk = min(conn->streamSizes.cbMaximumMessage, /* Size of data to write */ + bytesLeft); + SECURITY_STATUS scRet; /* SSPI status */ + + /* + * Copy user data into the buffer, starting + * just past the header + */ + memcpy(buffer + conn->streamSizes.cbHeader, + ((BYTE*) buf) + index, + chunk); + + /* + * Setup the SSPI buffers + */ + message.ulVersion = SECBUFFER_VERSION; + message.cBuffers = 4; + message.pBuffers = buffers; + buffers[0].pvBuffer = buffer; + buffers[0].cbBuffer = conn->streamSizes.cbHeader; + buffers[0].BufferType = SECBUFFER_STREAM_HEADER; + buffers[1].pvBuffer = buffer + conn->streamSizes.cbHeader; + buffers[1].cbBuffer = (unsigned long) chunk; + buffers[1].BufferType = SECBUFFER_DATA; + buffers[2].pvBuffer = buffer + conn->streamSizes.cbHeader + chunk; + buffers[2].cbBuffer = conn->streamSizes.cbTrailer; + buffers[2].BufferType = SECBUFFER_STREAM_TRAILER; + buffers[3].BufferType = SECBUFFER_EMPTY; + + /* + * Encrypt the data + */ + scRet = EncryptMessage(&conn->context, 0, &message, 0); + + if (FAILED(scRet)) + { + DEBUG_printf(("_sspiWrite: EncryptMessage failed: %x", scRet)); + WSASetLastError(WSASYSCALLFAILURE); + num = SOCKET_ERROR; + goto cleanup; + } + + /* + * Send the data. Remember the size of + * the total data to send is the size + * of the header, the size of the data + * the caller passed in and the size + * of the trailer + */ + num = send(conn->sock, + buffer, + buffers[0].cbBuffer + buffers[1].cbBuffer + buffers[2].cbBuffer, + 0); + + if ((num == SOCKET_ERROR) || (num == 0)) + { + DEBUG_printf(("_sspiWrite: send failed: %ld", WSAGetLastError())); + goto cleanup; + } + + bytesLeft -= (int) chunk; + index += (int) chunk; + } + + num = (int) len; + +cleanup: + + if (buffer) + free(buffer); + + return (num); +} + + +/* + * '_sspiRead()' - Read a buffer from an ssl socket + */ +int /* O - Bytes read or SOCKET_ERROR */ +_sspiRead(_sspi_struct_t *conn, /* I - Client connection */ + void *buf, /* I - Buffer */ + size_t len) /* I - Buffer length */ +{ + SecBufferDesc message; /* Array of SecBuffer struct */ + SecBuffer buffers[4] = { 0 }; /* Security package buffer */ + int num = 0; /* Return value */ + + if (!conn) + { + WSASetLastError(WSAEINVAL); + num = SOCKET_ERROR; + goto cleanup; + } + + /* + * If there are bytes that have already been + * decrypted and have not yet been read, return + * those + */ + if (buf && (conn->readBufferUsed > 0)) + { + int bytesToCopy = (int) min(conn->readBufferUsed, len); /* Amount of bytes to copy */ + /* from read buffer */ + + memcpy(buf, conn->readBuffer, bytesToCopy); + conn->readBufferUsed -= bytesToCopy; + + if (conn->readBufferUsed > 0) + /* + * If the caller didn't request all the bytes + * we have in the buffer, then move the unread + * bytes down + */ + memmove(conn->readBuffer, + conn->readBuffer + bytesToCopy, + conn->readBufferUsed); + + num = bytesToCopy; + } + else + { + PSecBuffer pDataBuffer; /* Data buffer */ + PSecBuffer pExtraBuffer; /* Excess data buffer */ + SECURITY_STATUS scRet; /* SSPI status */ + int i; /* Loop control variable */ + + /* + * Initialize security buffer structs + */ + message.ulVersion = SECBUFFER_VERSION; + message.cBuffers = 4; + message.pBuffers = buffers; + + do + { + /* + * If there is not enough space in the + * buffer, then increase it's size + */ + if (conn->decryptBufferLength <= conn->decryptBufferUsed) + { + conn->decryptBufferLength += 4096; + conn->decryptBuffer = (BYTE*) realloc(conn->decryptBuffer, + conn->decryptBufferLength); + + if (!conn->decryptBuffer) + { + DEBUG_printf(("_sspiRead: unable to allocate %d byte buffer", + conn->decryptBufferLength)); + WSASetLastError(E_OUTOFMEMORY); + num = SOCKET_ERROR; + goto cleanup; + } + } + + buffers[0].pvBuffer = conn->decryptBuffer; + buffers[0].cbBuffer = (unsigned long) conn->decryptBufferUsed; + buffers[0].BufferType = SECBUFFER_DATA; + buffers[1].BufferType = SECBUFFER_EMPTY; + buffers[2].BufferType = SECBUFFER_EMPTY; + buffers[3].BufferType = SECBUFFER_EMPTY; + + scRet = DecryptMessage(&conn->context, &message, 0, NULL); + + if (scRet == SEC_E_INCOMPLETE_MESSAGE) + { + if (buf) + { + num = recv(conn->sock, + conn->decryptBuffer + conn->decryptBufferUsed, + (int)(conn->decryptBufferLength - conn->decryptBufferUsed), + 0); + if (num == SOCKET_ERROR) + { + DEBUG_printf(("_sspiRead: recv failed: %d", WSAGetLastError())); + goto cleanup; + } + else if (num == 0) + { + DEBUG_printf(("_sspiRead: server disconnected")); + goto cleanup; + } + + conn->decryptBufferUsed += num; + } + else + { + num = (int) conn->readBufferUsed; + goto cleanup; + } + } + } + while (scRet == SEC_E_INCOMPLETE_MESSAGE); + + if (scRet == SEC_I_CONTEXT_EXPIRED) + { + DEBUG_printf(("_sspiRead: context expired")); + WSASetLastError(WSAECONNRESET); + num = SOCKET_ERROR; + goto cleanup; + } + else if (scRet != SEC_E_OK) + { + DEBUG_printf(("_sspiRead: DecryptMessage failed: %lx", scRet)); + WSASetLastError(WSASYSCALLFAILURE); + num = SOCKET_ERROR; + goto cleanup; + } + + /* + * The decryption worked. Now, locate data buffer. + */ + pDataBuffer = NULL; + pExtraBuffer = NULL; + for (i = 1; i < 4; i++) + { + if (buffers[i].BufferType == SECBUFFER_DATA) + pDataBuffer = &buffers[i]; + else if (!pExtraBuffer && (buffers[i].BufferType == SECBUFFER_EXTRA)) + pExtraBuffer = &buffers[i]; + } + + /* + * If a data buffer is found, then copy + * the decrypted bytes to the passed-in + * buffer + */ + if (pDataBuffer) + { + int bytesToCopy = min(pDataBuffer->cbBuffer, (int) len); + /* Number of bytes to copy into buf */ + int bytesToSave = pDataBuffer->cbBuffer - bytesToCopy; + /* Number of bytes to save in our read buffer */ + + if (bytesToCopy) + memcpy(buf, pDataBuffer->pvBuffer, bytesToCopy); + + /* + * If there are more decrypted bytes than can be + * copied to the passed in buffer, then save them + */ + if (bytesToSave) + { + if ((int)(conn->readBufferLength - conn->readBufferUsed) < bytesToSave) + { + conn->readBufferLength = conn->readBufferUsed + bytesToSave; + conn->readBuffer = realloc(conn->readBuffer, + conn->readBufferLength); + + if (!conn->readBuffer) + { + DEBUG_printf(("_sspiRead: unable to allocate %d bytes", conn->readBufferLength)); + WSASetLastError(E_OUTOFMEMORY); + num = SOCKET_ERROR; + goto cleanup; + } + } + + memcpy(((BYTE*) conn->readBuffer) + conn->readBufferUsed, + ((BYTE*) pDataBuffer->pvBuffer) + bytesToCopy, + bytesToSave); + + conn->readBufferUsed += bytesToSave; + } + + num = (buf) ? bytesToCopy : (int) conn->readBufferUsed; + } + else + { + DEBUG_printf(("_sspiRead: unable to find data buffer")); + WSASetLastError(WSASYSCALLFAILURE); + num = SOCKET_ERROR; + goto cleanup; + } + + /* + * If the decryption process left extra bytes, + * then save those back in decryptBuffer. They will + * be processed the next time through the loop. + */ + if (pExtraBuffer) + { + memmove(conn->decryptBuffer, pExtraBuffer->pvBuffer, pExtraBuffer->cbBuffer); + conn->decryptBufferUsed = pExtraBuffer->cbBuffer; + } + else + { + conn->decryptBufferUsed = 0; + } + } + +cleanup: + + return (num); +} + + +/* + * '_sspiPending()' - Returns the number of available bytes + */ +int /* O - Number of available bytes */ +_sspiPending(_sspi_struct_t *conn) /* I - Client connection */ +{ + return (_sspiRead(conn, NULL, 0)); +} + + +/* + * '_sspiFree()' - Close a connection and free resources + */ +void +_sspiFree(_sspi_struct_t *conn) /* I - Client connection */ +{ + if (!conn) + return; + + if (conn->contextInitialized) + { + SecBufferDesc message; /* Array of SecBuffer struct */ + SecBuffer buffers[1] = { 0 }; + /* Security package buffer */ + DWORD dwType; /* Type */ + DWORD status; /* Status */ + + /* + * Notify schannel that we are about to close the connection. + */ + dwType = SCHANNEL_SHUTDOWN; + + buffers[0].pvBuffer = &dwType; + buffers[0].BufferType = SECBUFFER_TOKEN; + buffers[0].cbBuffer = sizeof(dwType); + + message.cBuffers = 1; + message.pBuffers = buffers; + message.ulVersion = SECBUFFER_VERSION; + + status = ApplyControlToken(&conn->context, &message); + + if (SUCCEEDED(status)) + { + PBYTE pbMessage; /* Message buffer */ + DWORD cbMessage; /* Message buffer count */ + DWORD cbData; /* Data count */ + DWORD dwSSPIFlags; /* SSL attributes we requested */ + DWORD dwSSPIOutFlags; /* SSL attributes we received */ + TimeStamp tsExpiry; /* Time stamp */ + + dwSSPIFlags = ASC_REQ_SEQUENCE_DETECT | + ASC_REQ_REPLAY_DETECT | + ASC_REQ_CONFIDENTIALITY | + ASC_REQ_EXTENDED_ERROR | + ASC_REQ_ALLOCATE_MEMORY | + ASC_REQ_STREAM; + + buffers[0].pvBuffer = NULL; + buffers[0].BufferType = SECBUFFER_TOKEN; + buffers[0].cbBuffer = 0; + + message.cBuffers = 1; + message.pBuffers = buffers; + message.ulVersion = SECBUFFER_VERSION; + + status = AcceptSecurityContext(&conn->creds, &conn->context, NULL, + dwSSPIFlags, SECURITY_NATIVE_DREP, NULL, + &message, &dwSSPIOutFlags, &tsExpiry); + + if (SUCCEEDED(status)) + { + pbMessage = buffers[0].pvBuffer; + cbMessage = buffers[0].cbBuffer; + + /* + * Send the close notify message to the client. + */ + if (pbMessage && cbMessage) + { + cbData = send(conn->sock, pbMessage, cbMessage, 0); + if ((cbData == SOCKET_ERROR) || (cbData == 0)) + { + status = WSAGetLastError(); + DEBUG_printf(("_sspiFree: sending close notify failed: %d", status)); + } + else + { + FreeContextBuffer(pbMessage); + } + } + } + else + { + DEBUG_printf(("_sspiFree: AcceptSecurityContext failed: %x", status)); + } + } + else + { + DEBUG_printf(("_sspiFree: ApplyControlToken failed: %x", status)); + } + + DeleteSecurityContext(&conn->context); + conn->contextInitialized = FALSE; + } + + if (conn->decryptBuffer) + { + free(conn->decryptBuffer); + conn->decryptBuffer = NULL; + } + + if (conn->readBuffer) + { + free(conn->readBuffer); + conn->readBuffer = NULL; + } + + if (conn->sock != INVALID_SOCKET) + { + closesocket(conn->sock); + conn->sock = INVALID_SOCKET; + } + + free(conn); +} + + +/* + * 'sspi_verify_certificate()' - Verify a server certificate + */ +static DWORD /* 0 - Error code (0 == No error) */ +sspi_verify_certificate(PCCERT_CONTEXT serverCert, + /* I - Server certificate */ + const CHAR *serverName, + /* I - Server name */ + DWORD dwCertFlags) + /* I - Verification flags */ +{ + HTTPSPolicyCallbackData httpsPolicy; + /* HTTPS Policy Struct */ + CERT_CHAIN_POLICY_PARA policyPara; + /* Cert chain policy parameters */ + CERT_CHAIN_POLICY_STATUS policyStatus; + /* Cert chain policy status */ + CERT_CHAIN_PARA chainPara; + /* Used for searching and matching criteria */ + PCCERT_CHAIN_CONTEXT chainContext = NULL; + /* Certificate chain */ + PWSTR serverNameUnicode = NULL; + /* Unicode server name */ + LPSTR rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH, + szOID_SERVER_GATED_CRYPTO, + szOID_SGC_NETSCAPE }; + /* How are we using this certificate? */ + DWORD cUsages = sizeof(rgszUsages) / sizeof(LPSTR); + /* Number of ites in rgszUsages */ + DWORD count; /* 32 bit count variable */ + DWORD status; /* Return value */ + + if (!serverCert) + { + status = SEC_E_WRONG_PRINCIPAL; + goto cleanup; + } + + /* + * Convert server name to unicode. + */ + if (!serverName || (strlen(serverName) == 0)) + { + status = SEC_E_WRONG_PRINCIPAL; + goto cleanup; + } + + count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, NULL, 0); + serverNameUnicode = LocalAlloc(LMEM_FIXED, count * sizeof(WCHAR)); + if (!serverNameUnicode) + { + status = SEC_E_INSUFFICIENT_MEMORY; + goto cleanup; + } + count = MultiByteToWideChar(CP_ACP, 0, serverName, -1, serverNameUnicode, count); + if (count == 0) + { + status = SEC_E_WRONG_PRINCIPAL; + goto cleanup; + } + + /* + * Build certificate chain. + */ + ZeroMemory(&chainPara, sizeof(chainPara)); + chainPara.cbSize = sizeof(chainPara); + chainPara.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; + chainPara.RequestedUsage.Usage.cUsageIdentifier = cUsages; + chainPara.RequestedUsage.Usage.rgpszUsageIdentifier = rgszUsages; + + if (!CertGetCertificateChain(NULL, serverCert, NULL, serverCert->hCertStore, + &chainPara, 0, NULL, &chainContext)) + { + status = GetLastError(); + DEBUG_printf(("CertGetCertificateChain returned 0x%x\n", status)); + goto cleanup; + } + + /* + * Validate certificate chain. + */ + ZeroMemory(&httpsPolicy, sizeof(HTTPSPolicyCallbackData)); + httpsPolicy.cbStruct = sizeof(HTTPSPolicyCallbackData); + httpsPolicy.dwAuthType = AUTHTYPE_SERVER; + httpsPolicy.fdwChecks = dwCertFlags; + httpsPolicy.pwszServerName = serverNameUnicode; + + memset(&policyPara, 0, sizeof(policyPara)); + policyPara.cbSize = sizeof(policyPara); + policyPara.pvExtraPolicyPara = &httpsPolicy; + + memset(&policyStatus, 0, sizeof(policyStatus)); + policyStatus.cbSize = sizeof(policyStatus); + + if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chainContext, + &policyPara, &policyStatus)) + { + status = GetLastError(); + DEBUG_printf(("CertVerifyCertificateChainPolicy returned %d", status)); + goto cleanup; + } + + if (policyStatus.dwError) + { + status = policyStatus.dwError; + goto cleanup; + } + + status = SEC_E_OK; + +cleanup: + + if (chainContext) + CertFreeCertificateChain(chainContext); + + if (serverNameUnicode) + LocalFree(serverNameUnicode); + + return (status); +} + + +/* + * End of "$Id: sspi.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/cups/string-private.h b/cups/string-private.h new file mode 100644 index 0000000..7600357 --- /dev/null +++ b/cups/string-private.h @@ -0,0 +1,203 @@ +/* + * "$Id: string-private.h 9793 2011-05-20 03:49:49Z mike $" + * + * Private string definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_STRING_PRIVATE_H_ +# define _CUPS_STRING_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include +# include +# include + +# include "config.h" + +# ifdef HAVE_STRING_H +# include +# endif /* HAVE_STRING_H */ + +# ifdef HAVE_STRINGS_H +# include +# endif /* HAVE_STRINGS_H */ + +# ifdef HAVE_BSTRING_H +# include +# endif /* HAVE_BSTRING_H */ + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * String pool structures... + */ + +# define _CUPS_STR_GUARD 0x12344321 + +typedef struct _cups_sp_item_s /**** String Pool Item ****/ +{ +# ifdef DEBUG_GUARDS + unsigned int guard; /* Guard word */ +# endif /* DEBUG_GUARDS */ + unsigned int ref_count; /* Reference count */ + char str[1]; /* String */ +} _cups_sp_item_t; + + +/* + * Replacements for the ctype macros that are not affected by locale, since we + * really only care about testing for ASCII characters when parsing files, etc. + * + * The _CUPS_INLINE definition controls whether we get an inline function body, + * and external function body, or an external definition. + */ + +# if defined(__GNUC__) || __STDC_VERSION__ >= 199901L +# define _CUPS_INLINE static inline +# elif defined(_MSC_VER) +# define _CUPS_INLINE static __inline +# elif defined(_CUPS_STRING_C_) +# define _CUPS_INLINE +# endif /* __GNUC__ || __STDC_VERSION__ */ + +# ifdef _CUPS_INLINE +_CUPS_INLINE int /* O - 1 on match, 0 otherwise */ +_cups_isalnum(int ch) /* I - Character to test */ +{ + return ((ch >= '0' && ch <= '9') || + (ch >= 'A' && ch <= 'Z') || + (ch >= 'a' && ch <= 'z')); +} + +_CUPS_INLINE int /* O - 1 on match, 0 otherwise */ +_cups_isalpha(int ch) /* I - Character to test */ +{ + return ((ch >= 'A' && ch <= 'Z') || + (ch >= 'a' && ch <= 'z')); +} + +_CUPS_INLINE int /* O - 1 on match, 0 otherwise */ +_cups_isspace(int ch) /* I - Character to test */ +{ + return (ch == ' ' || ch == '\f' || ch == '\n' || ch == '\r' || ch == '\t' || + ch == '\v'); +} + +_CUPS_INLINE int /* O - 1 on match, 0 otherwise */ +_cups_isupper(int ch) /* I - Character to test */ +{ + return (ch >= 'A' && ch <= 'Z'); +} + +_CUPS_INLINE int /* O - Converted character */ +_cups_tolower(int ch) /* I - Character to convert */ +{ + return (_cups_isupper(ch) ? ch - 'A' + 'a' : ch); +} +# else +extern int _cups_isalnum(int ch); +extern int _cups_isalpha(int ch); +extern int _cups_isspace(int ch); +extern int _cups_isupper(int ch); +extern int _cups_tolower(int ch); +# endif /* _CUPS_INLINE */ + + +/* + * Prototypes... + */ + +extern void _cups_strcpy(char *dst, const char *src); + +# ifndef HAVE_STRDUP +extern char *_cups_strdup(const char *); +# define strdup _cups_strdup +# endif /* !HAVE_STRDUP */ + +extern int _cups_strcasecmp(const char *, const char *); + +extern int _cups_strncasecmp(const char *, const char *, size_t n); + +# ifndef HAVE_STRLCAT +extern size_t _cups_strlcat(char *, const char *, size_t); +# define strlcat _cups_strlcat +# endif /* !HAVE_STRLCAT */ + +# ifndef HAVE_STRLCPY +extern size_t _cups_strlcpy(char *, const char *, size_t); +# define strlcpy _cups_strlcpy +# endif /* !HAVE_STRLCPY */ + +# ifndef HAVE_SNPRINTF +extern int _cups_snprintf(char *, size_t, const char *, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +# define snprintf _cups_snprintf +# endif /* !HAVE_SNPRINTF */ + +# ifndef HAVE_VSNPRINTF +extern int _cups_vsnprintf(char *, size_t, const char *, va_list); +# define vsnprintf _cups_vsnprintf +# endif /* !HAVE_VSNPRINTF */ + +/* + * String pool functions... + */ + +extern char *_cupsStrAlloc(const char *s); +extern void _cupsStrFlush(void); +extern void _cupsStrFree(const char *s); +extern char *_cupsStrRetain(const char *s); +extern size_t _cupsStrStatistics(size_t *alloc_bytes, size_t *total_bytes); + + +/* + * Floating point number functions... + */ + +extern char *_cupsStrFormatd(char *buf, char *bufend, double number, + struct lconv *loc); +extern double _cupsStrScand(const char *buf, char **bufptr, + struct lconv *loc); + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_STRING_H_ */ + +/* + * End of "$Id: string-private.h 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/string.c b/cups/string.c new file mode 100644 index 0000000..01bfbe3 --- /dev/null +++ b/cups/string.c @@ -0,0 +1,759 @@ +/* + * "$Id: string.c 9793 2011-05-20 03:49:49Z mike $" + * + * String functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsStrAlloc() - Allocate/reference a string. + * _cupsStrFlush() - Flush the string pool. + * _cupsStrFormatd() - Format a floating-point number. + * _cupsStrFree() - Free/dereference a string. + * _cupsStrRetain() - Increment the reference count of a string. + * _cupsStrScand() - Scan a string for a floating-point number. + * _cupsStrStatistics() - Return allocation statistics for string pool. + * _cups_strcpy() - Copy a string allowing for overlapping strings. + * _cups_strdup() - Duplicate a string. + * _cups_strcasecmp() - Do a case-insensitive comparison. + * _cups_strncasecmp() - Do a case-insensitive comparison on up to N chars. + * _cups_strlcat() - Safely concatenate two strings. + * _cups_strlcpy() - Safely copy two strings. + * compare_sp_items() - Compare two string pool items... + */ + +/* + * Include necessary headers... + */ + +#define _CUPS_STRING_C_ +#include "string-private.h" +#include "debug-private.h" +#include "thread-private.h" +#include "array.h" +#include +#include + + +/* + * Local globals... + */ + +static _cups_mutex_t sp_mutex = _CUPS_MUTEX_INITIALIZER; + /* Mutex to control access to pool */ +static cups_array_t *stringpool = NULL; + /* Global string pool */ + + +/* + * Local functions... + */ + +static int compare_sp_items(_cups_sp_item_t *a, _cups_sp_item_t *b); + + +/* + * '_cupsStrAlloc()' - Allocate/reference a string. + */ + +char * /* O - String pointer */ +_cupsStrAlloc(const char *s) /* I - String */ +{ + _cups_sp_item_t *item, /* String pool item */ + *key; /* Search key */ + + + /* + * Range check input... + */ + + if (!s) + return (NULL); + + /* + * Get the string pool... + */ + + _cupsMutexLock(&sp_mutex); + + if (!stringpool) + stringpool = cupsArrayNew((cups_array_func_t)compare_sp_items, NULL); + + if (!stringpool) + { + _cupsMutexUnlock(&sp_mutex); + + return (NULL); + } + + /* + * See if the string is already in the pool... + */ + + key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); + + if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL) + { + /* + * Found it, return the cached string... + */ + + item->ref_count ++; + +#ifdef DEBUG_GUARDS + DEBUG_printf(("5_cupsStrAlloc: Using string %p(%s) for \"%s\", guard=%08x, " + "ref_count=%d", item, item->str, s, item->guard, + item->ref_count)); + + if (item->guard != _CUPS_STR_GUARD) + abort(); +#endif /* DEBUG_GUARDS */ + + _cupsMutexUnlock(&sp_mutex); + + return (item->str); + } + + /* + * Not found, so allocate a new one... + */ + + item = (_cups_sp_item_t *)calloc(1, sizeof(_cups_sp_item_t) + strlen(s)); + if (!item) + { + _cupsMutexUnlock(&sp_mutex); + + return (NULL); + } + + item->ref_count = 1; + strcpy(item->str, s); + +#ifdef DEBUG_GUARDS + item->guard = _CUPS_STR_GUARD; + + DEBUG_printf(("5_cupsStrAlloc: Created string %p(%s) for \"%s\", guard=%08x, " + "ref_count=%d", item, item->str, s, item->guard, + item->ref_count)); +#endif /* DEBUG_GUARDS */ + + /* + * Add the string to the pool and return it... + */ + + cupsArrayAdd(stringpool, item); + + _cupsMutexUnlock(&sp_mutex); + + return (item->str); +} + + +/* + * '_cupsStrFlush()' - Flush the string pool. + */ + +void +_cupsStrFlush(void) +{ + _cups_sp_item_t *item; /* Current item */ + + + DEBUG_printf(("4_cupsStrFlush: %d strings in array", + cupsArrayCount(stringpool))); + + _cupsMutexLock(&sp_mutex); + + for (item = (_cups_sp_item_t *)cupsArrayFirst(stringpool); + item; + item = (_cups_sp_item_t *)cupsArrayNext(stringpool)) + free(item); + + cupsArrayDelete(stringpool); + stringpool = NULL; + + _cupsMutexUnlock(&sp_mutex); +} + + +/* + * '_cupsStrFormatd()' - Format a floating-point number. + */ + +char * /* O - Pointer to end of string */ +_cupsStrFormatd(char *buf, /* I - String */ + char *bufend, /* I - End of string buffer */ + double number, /* I - Number to format */ + struct lconv *loc) /* I - Locale data */ +{ + char *bufptr, /* Pointer into buffer */ + temp[1024], /* Temporary string */ + *tempdec, /* Pointer to decimal point */ + *tempptr; /* Pointer into temporary string */ + const char *dec; /* Decimal point */ + int declen; /* Length of decimal point */ + + + /* + * Format the number using the "%.12f" format and then eliminate + * unnecessary trailing 0's. + */ + + snprintf(temp, sizeof(temp), "%.12f", number); + for (tempptr = temp + strlen(temp) - 1; + tempptr > temp && *tempptr == '0'; + *tempptr-- = '\0'); + + /* + * Next, find the decimal point... + */ + + if (loc && loc->decimal_point) + { + dec = loc->decimal_point; + declen = (int)strlen(dec); + } + else + { + dec = "."; + declen = 1; + } + + if (declen == 1) + tempdec = strchr(temp, *dec); + else + tempdec = strstr(temp, dec); + + /* + * Copy everything up to the decimal point... + */ + + if (tempdec) + { + for (tempptr = temp, bufptr = buf; + tempptr < tempdec && bufptr < bufend; + *bufptr++ = *tempptr++); + + tempptr += declen; + + if (*tempptr && bufptr < bufend) + { + *bufptr++ = '.'; + + while (*tempptr && bufptr < bufend) + *bufptr++ = *tempptr++; + } + + *bufptr = '\0'; + } + else + { + strlcpy(buf, temp, bufend - buf + 1); + bufptr = buf + strlen(buf); + } + + return (bufptr); +} + + +/* + * '_cupsStrFree()' - Free/dereference a string. + */ + +void +_cupsStrFree(const char *s) /* I - String to free */ +{ + _cups_sp_item_t *item, /* String pool item */ + *key; /* Search key */ + + + /* + * Range check input... + */ + + if (!s) + return; + + /* + * Check the string pool... + * + * We don't need to lock the mutex yet, as we only want to know if + * the stringpool is initialized. The rest of the code will still + * work if it is initialized before we lock... + */ + + if (!stringpool) + return; + + /* + * See if the string is already in the pool... + */ + + _cupsMutexLock(&sp_mutex); + + key = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); + +#ifdef DEBUG_GUARDS + if (key->guard != _CUPS_STR_GUARD) + { + DEBUG_printf(("5_cupsStrFree: Freeing string %p(%s), guard=%08x, " + "ref_count=%d", key, key->str, key->guard, key->ref_count)); + abort(); + } +#endif /* DEBUG_GUARDS */ + + if ((item = (_cups_sp_item_t *)cupsArrayFind(stringpool, key)) != NULL && + item == key) + { + /* + * Found it, dereference... + */ + + item->ref_count --; + + if (!item->ref_count) + { + /* + * Remove and free... + */ + + cupsArrayRemove(stringpool, item); + + free(item); + } + } + + _cupsMutexUnlock(&sp_mutex); +} + + +/* + * '_cupsStrRetain()' - Increment the reference count of a string. + * + * Note: This function does not verify that the passed pointer is in the + * string pool, so any calls to it MUST know they are passing in a + * good pointer. + */ + +char * /* O - Pointer to string */ +_cupsStrRetain(const char *s) /* I - String to retain */ +{ + _cups_sp_item_t *item; /* Pointer to string pool item */ + + + if (s) + { + item = (_cups_sp_item_t *)(s - offsetof(_cups_sp_item_t, str)); + +#ifdef DEBUG_GUARDS + if (item->guard != _CUPS_STR_GUARD) + { + DEBUG_printf(("5_cupsStrRetain: Retaining string %p(%s), guard=%08x, " + "ref_count=%d", item, s, item->guard, item->ref_count)); + abort(); + } +#endif /* DEBUG_GUARDS */ + + _cupsMutexLock(&sp_mutex); + + item->ref_count ++; + + _cupsMutexUnlock(&sp_mutex); + } + + return ((char *)s); +} + + +/* + * '_cupsStrScand()' - Scan a string for a floating-point number. + * + * This function handles the locale-specific BS so that a decimal + * point is always the period (".")... + */ + +double /* O - Number */ +_cupsStrScand(const char *buf, /* I - Pointer to number */ + char **bufptr, /* O - New pointer or NULL on error */ + struct lconv *loc) /* I - Locale data */ +{ + char temp[1024], /* Temporary buffer */ + *tempptr; /* Pointer into temporary buffer */ + + + /* + * Range check input... + */ + + if (!buf) + return (0.0); + + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*buf)) + buf ++; + + /* + * Copy leading sign, numbers, period, and then numbers... + */ + + tempptr = temp; + if (*buf == '-' || *buf == '+') + *tempptr++ = *buf++; + + while (isdigit(*buf & 255)) + if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = *buf++; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + + if (*buf == '.') + { + /* + * Read fractional portion of number... + */ + + buf ++; + + if (loc && loc->decimal_point) + { + strlcpy(tempptr, loc->decimal_point, sizeof(temp) - (tempptr - temp)); + tempptr += strlen(tempptr); + } + else if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = '.'; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + + while (isdigit(*buf & 255)) + if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = *buf++; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + } + + if (*buf == 'e' || *buf == 'E') + { + /* + * Read exponent... + */ + + if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = *buf++; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + + if (*buf == '+' || *buf == '-') + { + if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = *buf++; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + } + + while (isdigit(*buf & 255)) + if (tempptr < (temp + sizeof(temp) - 1)) + *tempptr++ = *buf++; + else + { + if (bufptr) + *bufptr = NULL; + + return (0.0); + } + } + + /* + * Nul-terminate the temporary string and return the value... + */ + + if (bufptr) + *bufptr = (char *)buf; + + *tempptr = '\0'; + + return (strtod(temp, NULL)); +} + + +/* + * '_cupsStrStatistics()' - Return allocation statistics for string pool. + */ + +size_t /* O - Number of strings */ +_cupsStrStatistics(size_t *alloc_bytes, /* O - Allocated bytes */ + size_t *total_bytes) /* O - Total string bytes */ +{ + size_t count, /* Number of strings */ + abytes, /* Allocated string bytes */ + tbytes, /* Total string bytes */ + len; /* Length of string */ + _cups_sp_item_t *item; /* Current item */ + + + /* + * Loop through strings in pool, counting everything up... + */ + + _cupsMutexLock(&sp_mutex); + + for (count = 0, abytes = 0, tbytes = 0, + item = (_cups_sp_item_t *)cupsArrayFirst(stringpool); + item; + item = (_cups_sp_item_t *)cupsArrayNext(stringpool)) + { + /* + * Count allocated memory, using a 64-bit aligned buffer as a basis. + */ + + count += item->ref_count; + len = (strlen(item->str) + 8) & ~7; + abytes += sizeof(_cups_sp_item_t) + len; + tbytes += item->ref_count * len; + } + + _cupsMutexUnlock(&sp_mutex); + + /* + * Return values... + */ + + if (alloc_bytes) + *alloc_bytes = abytes; + + if (total_bytes) + *total_bytes = tbytes; + + return (count); +} + + +/* + * '_cups_strcpy()' - Copy a string allowing for overlapping strings. + */ + +void +_cups_strcpy(char *dst, /* I - Destination string */ + const char *src) /* I - Source string */ +{ + while (*src) + *dst++ = *src++; + + *dst = '\0'; +} + + +/* + * '_cups_strdup()' - Duplicate a string. + */ + +#ifndef HAVE_STRDUP +char * /* O - New string pointer */ +_cups_strdup(const char *s) /* I - String to duplicate */ +{ + char *t; /* New string pointer */ + + + if (s == NULL) + return (NULL); + + if ((t = malloc(strlen(s) + 1)) == NULL) + return (NULL); + + return (strcpy(t, s)); +} +#endif /* !HAVE_STRDUP */ + + +/* + * '_cups_strcasecmp()' - Do a case-insensitive comparison. + */ + +int /* O - Result of comparison (-1, 0, or 1) */ +_cups_strcasecmp(const char *s, /* I - First string */ + const char *t) /* I - Second string */ +{ + while (*s != '\0' && *t != '\0') + { + if (_cups_tolower(*s) < _cups_tolower(*t)) + return (-1); + else if (_cups_tolower(*s) > _cups_tolower(*t)) + return (1); + + s ++; + t ++; + } + + if (*s == '\0' && *t == '\0') + return (0); + else if (*s != '\0') + return (1); + else + return (-1); +} + +/* + * '_cups_strncasecmp()' - Do a case-insensitive comparison on up to N chars. + */ + +int /* O - Result of comparison (-1, 0, or 1) */ +_cups_strncasecmp(const char *s, /* I - First string */ + const char *t, /* I - Second string */ + size_t n) /* I - Maximum number of characters to compare */ +{ + while (*s != '\0' && *t != '\0' && n > 0) + { + if (_cups_tolower(*s) < _cups_tolower(*t)) + return (-1); + else if (_cups_tolower(*s) > _cups_tolower(*t)) + return (1); + + s ++; + t ++; + n --; + } + + if (n == 0) + return (0); + else if (*s == '\0' && *t == '\0') + return (0); + else if (*s != '\0') + return (1); + else + return (-1); +} + + +#ifndef HAVE_STRLCAT +/* + * '_cups_strlcat()' - Safely concatenate two strings. + */ + +size_t /* O - Length of string */ +_cups_strlcat(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) /* I - Size of destination string buffer */ +{ + size_t srclen; /* Length of source string */ + size_t dstlen; /* Length of destination string */ + + + /* + * Figure out how much room is left... + */ + + dstlen = strlen(dst); + size -= dstlen + 1; + + if (!size) + return (dstlen); /* No room, return immediately... */ + + /* + * Figure out how much room is needed... + */ + + srclen = strlen(src); + + /* + * Copy the appropriate amount... + */ + + if (srclen > size) + srclen = size; + + memcpy(dst + dstlen, src, srclen); + dst[dstlen + srclen] = '\0'; + + return (dstlen + srclen); +} +#endif /* !HAVE_STRLCAT */ + + +#ifndef HAVE_STRLCPY +/* + * '_cups_strlcpy()' - Safely copy two strings. + */ + +size_t /* O - Length of string */ +_cups_strlcpy(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) /* I - Size of destination string buffer */ +{ + size_t srclen; /* Length of source string */ + + + /* + * Figure out how much room is needed... + */ + + size --; + + srclen = strlen(src); + + /* + * Copy the appropriate amount... + */ + + if (srclen > size) + srclen = size; + + memcpy(dst, src, srclen); + dst[srclen] = '\0'; + + return (srclen); +} +#endif /* !HAVE_STRLCPY */ + + +/* + * 'compare_sp_items()' - Compare two string pool items... + */ + +static int /* O - Result of comparison */ +compare_sp_items(_cups_sp_item_t *a, /* I - First item */ + _cups_sp_item_t *b) /* I - Second item */ +{ + return (strcmp(a->str, b->str)); +} + + +/* + * End of "$Id: string.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/tempfile.c b/cups/tempfile.c new file mode 100644 index 0000000..fe46a7a --- /dev/null +++ b/cups/tempfile.c @@ -0,0 +1,233 @@ +/* + * "$Id: tempfile.c 9042 2010-03-24 00:45:34Z mike $" + * + * Temp file utilities for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsTempFd() - Creates a temporary file. + * cupsTempFile() - Generates a temporary filename. + * cupsTempFile2() - Creates a temporary CUPS file. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#include +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ + + +/* + * 'cupsTempFd()' - Creates a temporary file. + * + * The temporary filename is returned in the filename buffer. + * The temporary file is opened for reading and writing. + */ + +int /* O - New file descriptor or -1 on error */ +cupsTempFd(char *filename, /* I - Pointer to buffer */ + int len) /* I - Size of buffer */ +{ + int fd; /* File descriptor for temp file */ + int tries; /* Number of tries */ + const char *tmpdir; /* TMPDIR environment var */ +#ifdef WIN32 + char tmppath[1024]; /* Windows temporary directory */ + DWORD curtime; /* Current time */ +#else + struct timeval curtime; /* Current time */ +#endif /* WIN32 */ + + + /* + * See if TMPDIR is defined... + */ + +#ifdef WIN32 + if ((tmpdir = getenv("TEMP")) == NULL) + { + GetTempPath(sizeof(tmppath), tmppath); + tmpdir = tmppath; + } +#else + /* + * Previously we put root temporary files in the default CUPS temporary + * directory under /var/spool/cups. However, since the scheduler cleans + * out temporary files there and runs independently of the user apps, we + * don't want to use it unless specifically told to by cupsd. + */ + + if ((tmpdir = getenv("TMPDIR")) == NULL) +# ifdef __APPLE__ + tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */ +# else + tmpdir = "/tmp"; +# endif /* __APPLE__ */ +#endif /* WIN32 */ + + /* + * Make the temporary name using the specified directory... + */ + + tries = 0; + + do + { +#ifdef WIN32 + /* + * Get the current time of day... + */ + + curtime = GetTickCount() + tries; + + /* + * Format a string using the hex time values... + */ + + snprintf(filename, len - 1, "%s/%05lx%08lx", tmpdir, + GetCurrentProcessId(), curtime); +#else + /* + * Get the current time of day... + */ + + gettimeofday(&curtime, NULL); + + /* + * Format a string using the hex time values... + */ + + snprintf(filename, len - 1, "%s/%05x%08x", tmpdir, (unsigned)getpid(), + (unsigned)(curtime.tv_sec + curtime.tv_usec + tries)); +#endif /* WIN32 */ + + /* + * Open the file in "exclusive" mode, making sure that we don't + * stomp on an existing file or someone's symlink crack... + */ + +#ifdef WIN32 + fd = open(filename, _O_CREAT | _O_RDWR | _O_TRUNC | _O_BINARY, + _S_IREAD | _S_IWRITE); +#elif defined(O_NOFOLLOW) + fd = open(filename, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW, 0600); +#else + fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600); +#endif /* WIN32 */ + + if (fd < 0 && errno != EEXIST) + break; + + tries ++; + } + while (fd < 0 && tries < 1000); + + /* + * Return the file descriptor... + */ + + return (fd); +} + + +/* + * 'cupsTempFile()' - Generates a temporary filename. + * + * The temporary filename is returned in the filename buffer. + * This function is deprecated - use @link cupsTempFd@ or + * @link cupsTempFile2@ instead. + * + * @deprecated@ + */ + +char * /* O - Filename or @code NULL@ on error */ +cupsTempFile(char *filename, /* I - Pointer to buffer */ + int len) /* I - Size of buffer */ +{ + int fd; /* File descriptor for temp file */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * See if a filename was specified... + */ + + if (filename == NULL) + { + filename = cg->tempfile; + len = sizeof(cg->tempfile); + } + + /* + * Create the temporary file... + */ + + if ((fd = cupsTempFd(filename, len)) < 0) + return (NULL); + + /* + * Close the temp file - it'll be reopened later as needed... + */ + + close(fd); + + /* + * Return the temp filename... + */ + + return (filename); +} + + +/* + * 'cupsTempFile2()' - Creates a temporary CUPS file. + * + * The temporary filename is returned in the filename buffer. + * The temporary file is opened for writing. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +cups_file_t * /* O - CUPS file or @code NULL@ on error */ +cupsTempFile2(char *filename, /* I - Pointer to buffer */ + int len) /* I - Size of buffer */ +{ + cups_file_t *file; /* CUPS file */ + int fd; /* File descriptor */ + + + if ((fd = cupsTempFd(filename, len)) < 0) + return (NULL); + else if ((file = cupsFileOpenFd(fd, "w")) == NULL) + { + close(fd); + unlink(filename); + return (NULL); + } + else + return (file); +} + + +/* + * End of "$Id: tempfile.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/test.ppd b/cups/test.ppd new file mode 100644 index 0000000..b5de344 --- /dev/null +++ b/cups/test.ppd @@ -0,0 +1,262 @@ +*PPD-Adobe: "4.3" +*% +*% "$Id: test.ppd 9314 2010-09-24 02:36:17Z mike $" +*% +*% Test PPD file for CUPS. +*% +*% This file is used to test the CUPS PPD API functions and cannot be +*% used with any known printers. Look on the CUPS web site for working PPD +*% files. +*% +*% If you are a PPD file developer, consider using the PPD compiler (ppdc) +*% to create your PPD files - not only will it save you time, it produces +*% consistently high-quality files. +*% +*% Copyright 2007-2010 by Apple Inc. +*% Copyright 2002-2006 by Easy Software Products. +*% +*% These coded instructions, statements, and computer programs are the +*% property of Apple Inc. and are protected by Federal copyright +*% law. Distribution and use rights are outlined in the file "LICENSE.txt" +*% which should have been included with this file. If this file is +*% file is missing or damaged, see the license at "http://www.cups.org/". +*FormatVersion: "4.3" +*FileVersion: "1.3" +*LanguageVersion: English +*LanguageEncoding: ISOLatin1 +*PCFileName: "TEST.PPD" +*Manufacturer: "ESP" +*Product: "(Test)" +*cupsVersion: 1.4 +*ModelName: "Test" +*ShortNickName: "Test" +*NickName: "Test for CUPS" +*PSVersion: "(3010.000) 0" +*LanguageLevel: "3" +*ColorDevice: True +*DefaultColorSpace: RGB +*FileSystem: False +*Throughput: "1" +*LandscapeOrientation: Plus90 +*TTRasterizer: Type42 +*cupsFilter: "application/vnd.cups-raster 0 -" +*RequiresPageRegion All: True + +*% These constraints are used to test ppdConflicts() and cupsResolveConflicts() +*UIConstraints: *PageSize Letter *InputSlot Envelope +*UIConstraints: *InputSlot Envelope *PageSize Letter +*UIConstraints: *PageRegion Letter *InputSlot Envelope +*UIConstraints: *InputSlot Envelope *PageRegion Letter + +*% These constraints are used to test ppdInstallableConflict() +*UIConstraints: "*Duplex *InstalledDuplexer False" +*UIConstraints: "*InstalledDuplexer False *Duplex" + +*% These attributes test ppdFindAttr/ppdFindNext... +*cupsTest Foo/I Love Foo: "" +*cupsTest Bar/I Love Bar: "" + +*% For PageSize, we have put all of the translations in-line... +*OpenUI *PageSize/Page Size: PickOne +*fr.Translation PageSize/French Page Size: "" +*fr_CA.Translation PageSize/French Canadian Page Size: "" +*OrderDependency: 10 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter/US Letter: "PageSize=Letter" +*fr.PageSize Letter/French US Letter: "" +*fr_CA.PageSize Letter/French Canadian US Letter: "" +*PageSize Letter.Banner/US Letter Banner: "PageSize=Letter.Banner" +*fr.PageSize Letter.Banner/French US Letter Banner: "" +*fr_CA.PageSize Letter.Banner/French Canadian US Letter Banner: "" +*PageSize Letter.Fullbleed/US Letter Borderless: "PageSize=Letter.Fullbleed" +*fr.PageSize Letter.Fullbleed/French US Letter Borderless: "" +*fr_CA.PageSize Letter.Fullbleed/French Canadian US Letter Borderless: "" +*PageSize A4/A4: "PageSize=A4" +*fr.PageSize A4/French A4: "" +*fr_CA.PageSize A4/French Canadian A4: "" +*PageSize Env10/#10 Envelope: "PageSize=Env10" +*fr.PageSize Env10/French #10 Envelope: "" +*fr_CA.PageSize Env10/French Canadian #10 Envelope: "" +*CloseUI: *PageSize + +*% For PageRegion, we have separated the translations... +*OpenUI *PageRegion/Page Region: PickOne +*OrderDependency: 10 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter/US Letter: "PageRegion=Letter" +*PageRegion Letter.Banner/US Letter Banner: "PageRegion=Letter.Fullbleed" +*PageRegion Letter.Fullbleed/US Letter Borderless: "PageRegion=Letter.Fullbleed" +*PageRegion A4/A4: "PageRegion=A4" +*PageRegion Env10/#10 Envelope: "PageRegion=Env10" +*CloseUI: *PageRegion + +*fr.Translation PageRegion/French Page Region: "" +*fr.PageRegion Letter/French US Letter: "" +*fr.PageRegion Letter.Banner/French US Letter Banner: "" +*fr.PageRegion Letter.Fullbleed/French US Letter Borderless: "" +*fr.PageRegion A4/French A4: "" +*fr.PageRegion Env10/French #10 Envelope: "" + +*fr_CA.Translation PageRegion/French Canadian Page Region: "" +*fr_CA.PageRegion Letter/French Canadian US Letter: "" +*fr_CA.PageRegion Letter.Banner/French Canadian US Letter Banner: "" +*fr_CA.PageRegion Letter.Fullbleed/French Canadian US Letter Borderless: "" +*fr_CA.PageRegion A4/French Canadian A4: "" +*fr_CA.PageRegion Env10/French Canadian #10 Envelope: "" + +*DefaultImageableArea: Letter +*ImageableArea Letter: "18 36 594 756" +*ImageableArea Letter.Banner: "18 0 594 792" +*ImageableArea Letter.Fullbleed: "0 0 612 792" +*ImageableArea A4: "18 36 577 806" +*ImageableArea Env10: "18 36 279 648" + +*DefaultPaperDimension: Letter +*PaperDimension Letter: "612 792" +*PaperDimension Letter.Banner: "612 792" +*PaperDimension Letter.Fullbleed: "612 792" +*PaperDimension A4: "595 842" +*PaperDimension Env10: "297 684" + +*% Custom page size support +*HWMargins: 0 0 0 0 +*NonUIOrderDependency: 100 AnySetup *CustomPageSize True +*CustomPageSize True/Custom Page Size: "PageSize=Custom" +*ParamCustomPageSize Width: 1 points 36 1080 +*ParamCustomPageSize Height: 2 points 36 86400 +*ParamCustomPageSize WidthOffset/Width Offset: 3 points 0 0 +*ParamCustomPageSize HeightOffset/Height Offset: 4 points 0 0 +*ParamCustomPageSize Orientation: 5 int 0 0 + +*OpenUI *InputSlot/Input Slot: PickOne +*OrderDependency: 20 AnySetup *InputSlot +*DefaultInputSlot: Tray +*InputSlot Tray/Tray: "InputSlot=Tray" +*InputSlot Manual/Manual Feed: "InputSlot=Manual" +*InputSlot Envelope/Envelope Feed: "InputSlot=Envelope" +*CloseUI: *InputSlot + +*OpenUI *MediaType/Media Type: PickOne +*OrderDependency: 25 AnySetup *MediaType +*DefaultMediaType: Plain +*MediaType Plain/Plain Paper: "MediaType=Plain" +*MediaType Matte/Matte Photo: "MediaType=Matte" +*MediaType Glossy/Glossy Photo: "MediaType=Glossy" +*MediaType Transparency/Transparency Film: "MediaType=Transparency" +*CloseUI: *MediaType + +*OpenUI *Duplex/2-Sided Printing: PickOne +*OrderDependency: 10 DocumentSetup *Duplex +*DefaultDuplex: None +*Duplex None/Off: "Duplex=None" +*Duplex DuplexNoTumble/Long Edge: "Duplex=DuplexNoTumble" +*Duplex DuplexTumble/Short Edge: "Duplex=DuplexTumble" +*CloseUI: *Duplex + +*% Installable option... +*OpenGroup: InstallableOptions/Installable Options +*OpenUI InstalledDuplexer/Duplexer Installed: Boolean +*DefaultInstalledDuplexer: False +*InstalledDuplexer False: "" +*InstalledDuplexer True: "" +*CloseUI: *InstalledDuplexer +*CloseGroup: InstallableOptions + +*% Custom options... +*OpenGroup: Extended/Extended Options + +*OpenUI IntOption/Integer: PickOne +*OrderDependency: 30 AnySetup *IntOption +*DefaultIntOption: None +*IntOption None: "" +*IntOption 1: "IntOption=1" +*IntOption 2: "IntOption=2" +*IntOption 3: "IntOption=3" +*CloseUI: *IntOption + +*CustomIntOption True/Custom Integer: "IntOption=Custom" +*ParamCustomIntOption Integer: 1 int -100 100 + +*OpenUI StringOption/String: PickOne +*OrderDependency: 40 AnySetup *StringOption +*DefaultStringOption: None +*StringOption None: "" +*StringOption foo: "StringOption=foo" +*StringOption bar: "StringOption=bar" +*CloseUI: *StringOption + +*CustomStringOption True/Custom String: "StringOption=Custom" +*ParamCustomStringOption String1: 2 string 1 10 +*ParamCustomStringOption String2: 1 string 1 10 + +*CloseGroup: Extended + +*% IPP reasons for ppdLocalizeIPPReason tests +*cupsIPPReason foo/Foo Reason: "http://foo/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/foo/bar.html" +*End +*fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long%20 +text:Foo%20Reason +http://foo/fr/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/fr/foo/bar.html" +*End +*zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201%20 +text:Foo%20Reason +http://foo/zh_TW/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/zh_TW/foo/bar.html" +*End +*zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202%20 +text:Foo%20Reason +http://foo/zh/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/zh/foo/bar.html" +*End + +*% Marker names for ppdLocalizeMarkerName tests +*cupsMarkerName cyan/Cyan Toner: "" +*fr.cupsMarkerName cyan/La Toner Cyan: "" +*zh_TW.cupsMarkerName cyan/Number 1 Cyan Toner: "" +*zh.cupsMarkerName cyan/Number 2 Cyan Toner: "" + +*DefaultFont: Courier +*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM +*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM +*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM +*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM +*Font Bookman-Demi: Standard "(001.004S)" Standard ROM +*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM +*Font Bookman-Light: Standard "(001.004S)" Standard ROM +*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM +*Font Courier: Standard "(002.004S)" Standard ROM +*Font Courier-Bold: Standard "(002.004S)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM +*Font Courier-Oblique: Standard "(002.004S)" Standard ROM +*Font Helvetica: Standard "(001.006S)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM +*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM +*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM +*Font Palatino-Bold: Standard "(001.005S)" Standard ROM +*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM +*Font Palatino-Italic: Standard "(001.005S)" Standard ROM +*Font Palatino-Roman: Standard "(001.005S)" Standard ROM +*Font Symbol: Special "(001.007S)" Special ROM +*Font Times-Bold: Standard "(001.007S)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM +*Font Times-Italic: Standard "(001.007S)" Standard ROM +*Font Times-Roman: Standard "(001.007S)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM +*Font ZapfDingbats: Special "(001.004S)" Standard ROM +*% +*% End of "$Id: test.ppd 9314 2010-09-24 02:36:17Z mike $". +*% diff --git a/cups/test2.ppd b/cups/test2.ppd new file mode 100644 index 0000000..3f19bc3 --- /dev/null +++ b/cups/test2.ppd @@ -0,0 +1,252 @@ +*PPD-Adobe: "4.3" +*% +*% "$Id: test2.ppd 9771 2011-05-12 05:21:56Z mike $" +*% +*% Test PPD file #2 for CUPS. +*% +*% This file is used to test the CUPS PPD API functions and cannot be +*% used with any known printers. Look on the CUPS web site for working PPD +*% files. +*% +*% If you are a PPD file developer, consider using the PPD compiler (ppdc) +*% to create your PPD files - not only will it save you time, it produces +*% consistently high-quality files. +*% +*% Copyright 2007-2011 by Apple Inc. +*% Copyright 2002-2006 by Easy Software Products. +*% +*% These coded instructions, statements, and computer programs are the +*% property of Apple Inc. and are protected by Federal copyright +*% law. Distribution and use rights are outlined in the file "LICENSE.txt" +*% which should have been included with this file. If this file is +*% file is missing or damaged, see the license at "http://www.cups.org/". +*FormatVersion: "4.3" +*FileVersion: "1.3" +*LanguageVersion: English +*LanguageEncoding: ISOLatin1 +*PCFileName: "TEST.PPD" +*Manufacturer: "ESP" +*Product: "(Test2)" +*cupsVersion: 1.4 +*ModelName: "Test2" +*ShortNickName: "Test2" +*NickName: "Test2 for CUPS" +*PSVersion: "(3010.000) 0" +*LanguageLevel: "3" +*ColorDevice: True +*DefaultColorSpace: RGB +*FileSystem: False +*Throughput: "1" +*LandscapeOrientation: Plus90 +*TTRasterizer: Type42 + +*% These constraints are used to test ppdConflicts() and cupsResolveConflicts() +*cupsUIConstraints envelope: "*PageSize Letter *InputSlot Envelope" +*cupsUIConstraints envelope: "*PageSize A4 *InputSlot Envelope" +*cupsUIResolver envelope: "*InputSlot Manual *PageSize Env10" + +*cupsUIConstraints envphoto: "*PageSize Env10 *InputSlot Envelope *Quality Photo" +*cupsUIResolver envphoto: "*Quality Normal" + +*% This constraint is used to test ppdInstallableConflict() +*cupsUIConstraints: "*Duplex *InstalledDuplexer False" + +*% These constraints are used to test the loop detection code in cupsResolveConflicts() +*cupsUIConstraints loop1: "*PageSize A4 *Quality Photo" +*cupsUIResolver loop1: "*Quality Normal" +*cupsUIConstraints loop2: "*PageSize A4 *Quality Normal" +*cupsUIResolver loop2: "*Quality Photo" + +*% For PageSize, we have put all of the translations in-line... +*OpenUI *PageSize/Page Size: PickOne +*fr.Translation PageSize/French Page Size: "" +*fr_CA.Translation PageSize/French Canadian Page Size: "" +*OrderDependency: 10 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter/US Letter: "PageSize=Letter" +*fr.PageSize Letter/French US Letter: "" +*fr_CA.PageSize Letter/French Canadian US Letter: "" +*PageSize A4/A4: "PageSize=A4" +*fr.PageSize A4/French A4: "" +*fr_CA.PageSize A4/French Canadian A4: "" +*PageSize Env10/#10 Envelope: "PageSize=Env10" +*fr.PageSize Env10/French #10 Envelope: "" +*fr_CA.PageSize Env10/French Canadian #10 Envelope: "" +*CloseUI: *PageSize + +*% For PageRegion, we have separated the translations... +*OpenUI *PageRegion/Page Region: PickOne +*OrderDependency: 10 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter/US Letter: "PageRegion=Letter" +*PageRegion A4/A4: "PageRegion=A4" +*PageRegion Env10/#10 Envelope: "PageRegion=Env10" +*CloseUI: *PageRegion + +*fr.Translation PageRegion/French Page Region: "" +*fr.PageRegion Letter/French US Letter: "" +*fr.PageRegion A4/French A4: "" +*fr.PageRegion Env10/French #10 Envelope: "" + +*fr_CA.Translation PageRegion/French Canadian Page Region: "" +*fr_CA.PageRegion Letter/French Canadian US Letter: "" +*fr_CA.PageRegion A4/French Canadian A4: "" +*fr_CA.PageRegion Env10/French Canadian #10 Envelope: "" + +*DefaultImageableArea: Letter +*ImageableArea Letter: "18 36 594 756" +*ImageableArea A4: "18 36 577 806" +*ImageableArea Env10: "18 36 279 648" + +*DefaultPaperDimension: Letter +*PaperDimension Letter: "612 792" +*PaperDimension A4: "595 842" +*PaperDimension Env10: "297 684" + +*% Custom page size support +*HWMargins: 0 0 0 0 +*NonUIOrderDependency: 100 AnySetup *CustomPageSize True +*CustomPageSize True/Custom Page Size: "PageSize=Custom" +*ParamCustomPageSize Width: 1 points 36 1080 +*ParamCustomPageSize Height: 2 points 36 86400 +*ParamCustomPageSize WidthOffset/Width Offset: 3 points 0 0 +*ParamCustomPageSize HeightOffset/Height Offset: 4 points 0 0 +*ParamCustomPageSize Orientation: 5 int 0 0 + +*cupsMediaQualifier2: InputSlot +*cupsMediaQualifier3: Quality +*cupsMaxSize .Manual.: "1000 1000" +*cupsMinSize .Manual.: "100 100" +*cupsMinSize .Manual.Photo: "200 200" +*cupsMinSize ..Photo: "300 300" + +*OpenUI *InputSlot/Input Slot: PickOne +*OrderDependency: 20 AnySetup *InputSlot +*DefaultInputSlot: Tray +*InputSlot Tray/Tray: "InputSlot=Tray" +*InputSlot Manual/Manual Feed: "InputSlot=Manual" +*InputSlot Envelope/Envelope Feed: "InputSlot=Envelope" +*CloseUI: *InputSlot + +*OpenUI *Quality/Output Mode: PickOne +*OrderDependency: 20 AnySetup *Quality +*DefaultQuality: Normal +*Quality Draft: "Quality=Draft" +*Quality Normal: "Quality=Normal" +*Quality Photo: "Quality=Photo" +*CloseUI: *Quality + +*OpenUI *Duplex/2-Sided Printing: PickOne +*OrderDependency: 10 DocumentSetup *Duplex +*DefaultDuplex: None +*Duplex None/Off: "Duplex=None" +*Duplex DuplexNoTumble/Long Edge: "Duplex=DuplexNoTumble" +*Duplex DuplexTumble/Short Edge: "Duplex=DuplexTumble" +*CloseUI: *Duplex + +*% Installable option... +*OpenGroup: InstallableOptions/Installable Options +*OpenUI InstalledDuplexer/Duplexer Installed: Boolean +*DefaultInstalledDuplexer: False +*InstalledDuplexer False: "" +*InstalledDuplexer True: "" +*CloseUI: *InstalledDuplexer +*CloseGroup: InstallableOptions + +*% Custom options... +*OpenGroup: Extended/Extended Options + +*OpenUI IntOption/Integer: PickOne +*OrderDependency: 30 AnySetup *IntOption +*DefaultIntOption: None +*IntOption None: "" +*IntOption 1: "IntOption=1" +*IntOption 2: "IntOption=2" +*IntOption 3: "IntOption=3" +*CloseUI: *IntOption + +*CustomIntOption True/Custom Integer: "IntOption=Custom" +*ParamCustomIntOption Integer: 1 int -100 100 + +*OpenUI StringOption/String: PickOne +*OrderDependency: 40 AnySetup *StringOption +*DefaultStringOption: None +*StringOption None: "" +*StringOption foo: "StringOption=foo" +*StringOption bar: "StringOption=bar" +*CloseUI: *StringOption + +*CustomStringOption True/Custom String: "StringOption=Custom" +*ParamCustomStringOption String: 1 string 1 10 + +*CloseGroup: Extended + +*% IPP reasons for ppdLocalizeIPPReason tests +*cupsIPPReason foo/Foo Reason: "http://foo/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/foo/bar.html" +*End +*fr.cupsIPPReason foo/La Foo Reason: "text:La%20Long%20 +text:Foo%20Reason +http://foo/fr/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/fr/foo/bar.html" +*End +*zh_TW.cupsIPPReason foo/Number 1 Foo Reason: "text:Number%201%20 +text:Foo%20Reason +http://foo/zh_TW/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/zh_TW/foo/bar.html" +*End +*zh.cupsIPPReason foo/Number 2 Foo Reason: "text:Number%202%20 +text:Foo%20Reason +http://foo/zh/bar.html +help:anchor='foo'%20bookID=Vendor%20Help +/help/zh/foo/bar.html" +*End + +*% Marker names for ppdLocalizeMarkerName tests +*cupsMarkerName cyan/Cyan Toner: "" +*fr.cupsMarkerName cyan/La Toner Cyan: "" +*zh_TW.cupsMarkerName cyan/Number 1 Cyan Toner: "" +*zh.cupsMarkerName cyan/Number 2 Cyan Toner: "" + +*DefaultFont: Courier +*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM +*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM +*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM +*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM +*Font Bookman-Demi: Standard "(001.004S)" Standard ROM +*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM +*Font Bookman-Light: Standard "(001.004S)" Standard ROM +*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM +*Font Courier: Standard "(002.004S)" Standard ROM +*Font Courier-Bold: Standard "(002.004S)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM +*Font Courier-Oblique: Standard "(002.004S)" Standard ROM +*Font Helvetica: Standard "(001.006S)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM +*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM +*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM +*Font Palatino-Bold: Standard "(001.005S)" Standard ROM +*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM +*Font Palatino-Italic: Standard "(001.005S)" Standard ROM +*Font Palatino-Roman: Standard "(001.005S)" Standard ROM +*Font Symbol: Special "(001.007S)" Special ROM +*Font Times-Bold: Standard "(001.007S)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM +*Font Times-Italic: Standard "(001.007S)" Standard ROM +*Font Times-Roman: Standard "(001.007S)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM +*Font ZapfDingbats: Special "(001.004S)" Standard ROM +*% +*% End of "$Id: test2.ppd 9771 2011-05-12 05:21:56Z mike $". +*% diff --git a/cups/testadmin.c b/cups/testadmin.c new file mode 100644 index 0000000..c6946d4 --- /dev/null +++ b/cups/testadmin.c @@ -0,0 +1,120 @@ +/* + * "$Id: testadmin.c 9042 2010-03-24 00:45:34Z mike $" + * + * Admin function test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * show_settings() - Show settings in the array... + */ + +/* + * Include necessary headers... + */ + +#include "adminutil.h" +#include "string-private.h" + + +/* + * Local functions... + */ + +static void show_settings(int num_settings, cups_option_t *settings); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, /* Looping var */ + num_settings; /* Number of settings */ + cups_option_t *settings; /* Settings */ + http_t *http; /* Connection to server */ + + + /* + * Connect to the server using the defaults... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + /* + * Set the current configuration if we have anything on the command-line... + */ + + if (argc > 1) + { + for (i = 1, num_settings = 0, settings = NULL; i < argc; i ++) + num_settings = cupsParseOptions(argv[i], num_settings, &settings); + + if (cupsAdminSetServerSettings(http, num_settings, settings)) + { + puts("New server settings:"); + cupsFreeOptions(num_settings, settings); + } + else + { + printf("Server settings not changed: %s\n", cupsLastErrorString()); + return (1); + } + } + else + puts("Current server settings:"); + + /* + * Get the current configuration... + */ + + if (cupsAdminGetServerSettings(http, &num_settings, &settings)) + { + show_settings(num_settings, settings); + cupsFreeOptions(num_settings, settings); + return (0); + } + else + { + printf(" %s\n", cupsLastErrorString()); + return (1); + } +} + + +/* + * 'show_settings()' - Show settings in the array... + */ + +static void +show_settings( + int num_settings, /* I - Number of settings */ + cups_option_t *settings) /* I - Settings */ +{ + while (num_settings > 0) + { + printf(" %s=%s\n", settings->name, settings->value); + + settings ++; + num_settings --; + } +} + + +/* + * End of "$Id: testadmin.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/testarray.c b/cups/testarray.c new file mode 100644 index 0000000..31d227c --- /dev/null +++ b/cups/testarray.c @@ -0,0 +1,480 @@ +/* + * "$Id: testarray.c 9099 2010-04-11 07:16:05Z mike $" + * + * Array test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * get_seconds() - Get the current time in seconds... + * load_words() - Load words from a file. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "debug-private.h" +#include "array.h" +#include "dir.h" + + +/* + * Local functions... + */ + +static double get_seconds(void); +static int load_words(const char *filename, cups_array_t *array); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + cups_array_t *array, /* Test array */ + *dup_array; /* Duplicate array */ + int status; /* Exit status */ + char *text; /* Text from array */ + char word[256]; /* Word from file */ + double start, /* Start time */ + end; /* End time */ + cups_dir_t *dir; /* Current directory */ + cups_dentry_t *dent; /* Directory entry */ + char *saved[32]; /* Saved entries */ + void *data; /* User data for arrays */ + + + /* + * No errors so far... + */ + + status = 0; + + /* + * cupsArrayNew() + */ + + fputs("cupsArrayNew: ", stdout); + + data = (void *)"testarray"; + array = cupsArrayNew((cups_array_func_t)strcmp, data); + + if (array) + puts("PASS"); + else + { + puts("FAIL (returned NULL, expected pointer)"); + status ++; + } + + /* + * cupsArrayUserData() + */ + + fputs("cupsArrayUserData: ", stdout); + if (cupsArrayUserData(array) == data) + puts("PASS"); + else + { + printf("FAIL (returned %p instead of %p!)\n", cupsArrayUserData(array), + data); + status ++; + } + + /* + * cupsArrayAdd() + */ + + fputs("cupsArrayAdd: ", stdout); + + if (!cupsArrayAdd(array, strdup("One Fish"))) + { + puts("FAIL (\"One Fish\")"); + status ++; + } + else + { + if (!cupsArrayAdd(array, strdup("Two Fish"))) + { + puts("FAIL (\"Two Fish\")"); + status ++; + } + else + { + if (!cupsArrayAdd(array, strdup("Red Fish"))) + { + puts("FAIL (\"Red Fish\")"); + status ++; + } + else + { + if (!cupsArrayAdd(array, strdup("Blue Fish"))) + { + puts("FAIL (\"Blue Fish\")"); + status ++; + } + else + puts("PASS"); + } + } + } + + /* + * cupsArrayCount() + */ + + fputs("cupsArrayCount: ", stdout); + if (cupsArrayCount(array) == 4) + puts("PASS"); + else + { + printf("FAIL (returned %d, expected 4)\n", cupsArrayCount(array)); + status ++; + } + + /* + * cupsArrayFirst() + */ + + fputs("cupsArrayFirst: ", stdout); + if ((text = (char *)cupsArrayFirst(array)) != NULL && + !strcmp(text, "Blue Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"Blue Fish\")\n", text); + status ++; + } + + /* + * cupsArrayNext() + */ + + fputs("cupsArrayNext: ", stdout); + if ((text = (char *)cupsArrayNext(array)) != NULL && + !strcmp(text, "One Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); + status ++; + } + + /* + * cupsArrayLast() + */ + + fputs("cupsArrayLast: ", stdout); + if ((text = (char *)cupsArrayLast(array)) != NULL && + !strcmp(text, "Two Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"Two Fish\")\n", text); + status ++; + } + + /* + * cupsArrayPrev() + */ + + fputs("cupsArrayPrev: ", stdout); + if ((text = (char *)cupsArrayPrev(array)) != NULL && + !strcmp(text, "Red Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"Red Fish\")\n", text); + status ++; + } + + /* + * cupsArrayFind() + */ + + fputs("cupsArrayFind: ", stdout); + if ((text = (char *)cupsArrayFind(array, (void *)"One Fish")) != NULL && + !strcmp(text, "One Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); + status ++; + } + + /* + * cupsArrayCurrent() + */ + + fputs("cupsArrayCurrent: ", stdout); + if ((text = (char *)cupsArrayCurrent(array)) != NULL && + !strcmp(text, "One Fish")) + puts("PASS"); + else + { + printf("FAIL (returned \"%s\", expected \"One Fish\")\n", text); + status ++; + } + + /* + * cupsArrayDup() + */ + + fputs("cupsArrayDup: ", stdout); + if ((dup_array = cupsArrayDup(array)) != NULL && + cupsArrayCount(dup_array) == 4) + puts("PASS"); + else + { + printf("FAIL (returned %p with %d elements, expected pointer with 4 elements)\n", + dup_array, cupsArrayCount(dup_array)); + status ++; + } + + /* + * cupsArrayRemove() + */ + + fputs("cupsArrayRemove: ", stdout); + if (cupsArrayRemove(array, (void *)"One Fish") && + cupsArrayCount(array) == 3) + puts("PASS"); + else + { + printf("FAIL (returned 0 with %d elements, expected 1 with 4 elements)\n", + cupsArrayCount(array)); + status ++; + } + + /* + * cupsArrayClear() + */ + + fputs("cupsArrayClear: ", stdout); + cupsArrayClear(array); + if (cupsArrayCount(array) == 0) + puts("PASS"); + else + { + printf("FAIL (%d elements, expected 0 elements)\n", + cupsArrayCount(array)); + status ++; + } + + /* + * Now load this source file and grab all of the unique words... + */ + + fputs("Load unique words: ", stdout); + fflush(stdout); + + start = get_seconds(); + + if ((dir = cupsDirOpen(".")) == NULL) + { + puts("FAIL (cupsDirOpen failed)"); + status ++; + } + else + { + while ((dent = cupsDirRead(dir)) != NULL) + { + i = strlen(dent->filename) - 2; + + if (i > 0 && dent->filename[i] == '.' && + (dent->filename[i + 1] == 'c' || + dent->filename[i + 1] == 'h')) + load_words(dent->filename, array); + } + + cupsDirClose(dir); + + end = get_seconds(); + + printf("%d words in %.3f seconds (%.0f words/sec), ", cupsArrayCount(array), + end - start, cupsArrayCount(array) / (end - start)); + fflush(stdout); + + for (text = (char *)cupsArrayFirst(array); text;) + { + /* + * Copy this word to the word buffer (safe because we strdup'd from + * the same buffer in the first place... :) + */ + + strcpy(word, text); + + /* + * Grab the next word and compare... + */ + + if ((text = (char *)cupsArrayNext(array)) == NULL) + break; + + if (strcmp(word, text) >= 0) + break; + } + + if (text) + { + printf("FAIL (\"%s\" >= \"%s\"!)\n", word, text); + status ++; + } + else + puts("PASS"); + } + + /* + * Test deleting with iteration... + */ + + fputs("Delete While Iterating: ", stdout); + + text = (char *)cupsArrayFirst(array); + cupsArrayRemove(array, text); + free(text); + + text = (char *)cupsArrayNext(array); + if (!text) + { + puts("FAIL (cupsArrayNext returned NULL!)"); + status ++; + } + else + puts("PASS"); + + /* + * Test save/restore... + */ + + fputs("cupsArraySave: ", stdout); + + for (i = 0, text = (char *)cupsArrayFirst(array); + i < 32; + i ++, text = (char *)cupsArrayNext(array)) + { + saved[i] = text; + + if (!cupsArraySave(array)) + break; + } + + if (i < 32) + printf("FAIL (depth = %d)\n", i); + else + puts("PASS"); + + fputs("cupsArrayRestore: ", stdout); + + while (i > 0) + { + i --; + + text = cupsArrayRestore(array); + if (text != saved[i]) + break; + } + + if (i) + printf("FAIL (depth = %d)\n", i); + else + puts("PASS"); + + /* + * Delete the arrays... + */ + + cupsArrayDelete(array); + cupsArrayDelete(dup_array); + + /* + * Summarize the results and return... + */ + + if (!status) + puts("\nALL TESTS PASSED!"); + else + printf("\n%d TEST(S) FAILED!\n", status); + + return (status); +} + + +/* + * 'get_seconds()' - Get the current time in seconds... + */ + +#ifdef WIN32 +# include + + +static double +get_seconds(void) +{ +} +#else +# include + + +static double +get_seconds(void) +{ + struct timeval curtime; /* Current time */ + + + gettimeofday(&curtime, NULL); + return (curtime.tv_sec + 0.000001 * curtime.tv_usec); +} +#endif /* WIN32 */ + + +/* + * 'load_words()' - Load words from a file. + */ + +static int /* O - 1 on success, 0 on failure */ +load_words(const char *filename, /* I - File to load */ + cups_array_t *array) /* I - Array to add to */ +{ + FILE *fp; /* Test file */ + char word[256]; /* Word from file */ + + + if ((fp = fopen(filename, "r")) == NULL) + { + perror(filename); + return (0); + } + + while (fscanf(fp, "%255s", word) == 1) + { + if (!cupsArrayFind(array, word)) + cupsArrayAdd(array, strdup(word)); + } + + fclose(fp); + + return (1); +} + + +/* + * End of "$Id: testarray.c 9099 2010-04-11 07:16:05Z mike $". + */ diff --git a/cups/testconflicts.c b/cups/testconflicts.c new file mode 100644 index 0000000..ec0ea1c --- /dev/null +++ b/cups/testconflicts.c @@ -0,0 +1,138 @@ +/* + * "$Id: testconflicts.c 10379 2012-03-23 22:16:22Z mike $" + * + * PPD constraint test program for CUPS. + * + * Copyright 2008-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + */ + +/* + * Include necessary headers... + */ + +#include "cups.h" +#include "ppd.h" +#include "string-private.h" + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + ppd_file_t *ppd; /* PPD file loaded from disk */ + char line[256], /* Input buffer */ + *ptr, /* Pointer into buffer */ + *optr, /* Pointer to first option name */ + *cptr; /* Pointer to first choice */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + char *option, /* Current option */ + *choice; /* Current choice */ + + + if (argc != 2) + { + puts("Usage: testconflicts filename.ppd"); + return (1); + } + + if ((ppd = ppdOpenFile(argv[1])) == NULL) + { + ppd_status_t err; /* Last error in file */ + int linenum; /* Line number in file */ + + err = ppdLastError(&linenum); + + printf("Unable to open PPD file \"%s\": %s on line %d\n", argv[1], + ppdErrorString(err), linenum); + return (1); + } + + ppdMarkDefaults(ppd); + + option = NULL; + choice = NULL; + + for (;;) + { + num_options = 0; + options = NULL; + + if (!cupsResolveConflicts(ppd, option, choice, &num_options, &options)) + puts("Unable to resolve conflicts!"); + else if ((!option && num_options > 0) || (option && num_options > 1)) + { + fputs("Resolved conflicts with the following options:\n ", stdout); + for (i = 0; i < num_options; i ++) + if (!option || _cups_strcasecmp(option, options[i].name)) + printf(" %s=%s", options[i].name, options[i].value); + putchar('\n'); + + cupsFreeOptions(num_options, options); + } + + if (option) + { + free(option); + option = NULL; + } + + if (choice) + { + free(choice); + choice = NULL; + } + + printf("\nNew Option(s): "); + fflush(stdout); + if (!fgets(line, sizeof(line), stdin) || line[0] == '\n') + break; + + for (ptr = line; isspace(*ptr & 255); ptr ++); + for (optr = ptr; *ptr && *ptr != '='; ptr ++); + if (!*ptr) + break; + for (*ptr++ = '\0', cptr = ptr; *ptr && !isspace(*ptr & 255); ptr ++); + if (!*ptr) + break; + *ptr++ = '\0'; + + option = strdup(optr); + choice = strdup(cptr); + num_options = cupsParseOptions(ptr, 0, &options); + + ppdMarkOption(ppd, option, choice); + if (cupsMarkOptions(ppd, num_options, options)) + puts("Options Conflict!"); + cupsFreeOptions(num_options, options); + } + + if (option) + free(option); + if (choice) + free(choice); + + return (0); +} + + +/* + * End of "$Id: testconflicts.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/cups/testcups.c b/cups/testcups.c new file mode 100644 index 0000000..c6cf134 --- /dev/null +++ b/cups/testcups.c @@ -0,0 +1,416 @@ +/* + * "$Id: testcups.c 9979 2011-09-09 16:34:29Z mike $" + * + * CUPS API test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * dests_equal() - Determine whether two destinations are equal. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "cups.h" +#include "ppd.h" +#include + + +/* + * Local functions... + */ + +static int dests_equal(cups_dest_t *a, cups_dest_t *b); +static void show_diffs(cups_dest_t *a, cups_dest_t *b); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int status = 0, /* Exit status */ + i, /* Looping var */ + num_dests; /* Number of destinations */ + cups_dest_t *dests, /* Destinations */ + *dest, /* Current destination */ + *named_dest; /* Current named destination */ + const char *ppdfile; /* PPD file */ + ppd_file_t *ppd; /* PPD file data */ + int num_jobs; /* Number of jobs for queue */ + cups_job_t *jobs; /* Jobs for queue */ + + + if (argc > 1) + { + /* + * ./testcups printer file interval + */ + + int interval, /* Interval between writes */ + job_id; /* Job ID */ + cups_file_t *fp; /* Print file */ + char buffer[16384]; /* Read/write buffer */ + ssize_t bytes; /* Bytes read/written */ + + + if (argc != 4) + { + puts("Usage: ./testcups"); + puts(" ./testcups printer file interval"); + return (1); + } + + if ((fp = cupsFileOpen(argv[2], "r")) == NULL) + { + printf("Unable to open \"%s\": %s\n", argv[2], strerror(errno)); + return (1); + } + + if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, argv[1], "testcups", 0, + NULL)) <= 0) + { + printf("Unable to create print job on %s: %s\n", argv[1], + cupsLastErrorString()); + return (1); + } + + interval = atoi(argv[3]); + + if (cupsStartDocument(CUPS_HTTP_DEFAULT, argv[1], job_id, argv[2], + CUPS_FORMAT_AUTO, 1) != HTTP_CONTINUE) + { + puts("Unable to start document!"); + return (1); + } + + while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) + { + printf("Writing %d bytes...\n", (int)bytes); + + if (cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, + bytes) != HTTP_CONTINUE) + { + puts("Unable to write bytes!"); + return (1); + } + + sleep(interval); + } + + cupsFileClose(fp); + + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, argv[1]) > IPP_OK_SUBST) + { + puts("Unable to finish document!"); + return (1); + } + + return (0); + } + + /* + * cupsGetDests() + */ + + fputs("cupsGetDests: ", stdout); + fflush(stdout); + + num_dests = cupsGetDests(&dests); + + if (num_dests == 0) + { + puts("FAIL"); + return (1); + } + else + { + printf("PASS (%d dests)\n", num_dests); + + for (i = num_dests, dest = dests; i > 0; i --, dest ++) + { + printf(" %s", dest->name); + + if (dest->instance) + printf(" /%s", dest->instance); + + if (dest->is_default) + puts(" ***DEFAULT***"); + else + putchar('\n'); + } + } + + /* + * cupsGetDest(NULL) + */ + + fputs("cupsGetDest(NULL): ", stdout); + fflush(stdout); + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) + { + for (i = num_dests, dest = dests; i > 0; i --, dest ++) + if (dest->is_default) + break; + + if (i) + { + status = 1; + puts("FAIL"); + } + else + puts("PASS (no default)"); + + dest = NULL; + } + else + printf("PASS (%s)\n", dest->name); + + /* + * cupsGetNamedDest(NULL, NULL, NULL) + */ + + fputs("cupsGetNamedDest(NULL, NULL, NULL): ", stdout); + fflush(stdout); + + if ((named_dest = cupsGetNamedDest(NULL, NULL, NULL)) == NULL || + !dests_equal(dest, named_dest)) + { + if (!dest) + puts("PASS (no default)"); + else if (named_dest) + { + puts("FAIL (different values)"); + show_diffs(dest, named_dest); + status = 1; + } + else + { + puts("FAIL (no default)"); + status = 1; + } + } + else + printf("PASS (%s)\n", named_dest->name); + + if (named_dest) + cupsFreeDests(1, named_dest); + + /* + * cupsGetDest(printer) + */ + + printf("cupsGetDest(\"%s\"): ", dests[num_dests / 2].name); + fflush(stdout); + + if ((dest = cupsGetDest(dests[num_dests / 2].name, NULL, num_dests, + dests)) == NULL) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + /* + * cupsGetNamedDest(NULL, printer, instance) + */ + + printf("cupsGetNamedDest(NULL, \"%s\", \"%s\"): ", dest->name, + dest->instance ? dest->instance : "(null)"); + fflush(stdout); + + if ((named_dest = cupsGetNamedDest(NULL, dest->name, + dest->instance)) == NULL || + !dests_equal(dest, named_dest)) + { + if (named_dest) + { + puts("FAIL (different values)"); + show_diffs(dest, named_dest); + } + else + puts("FAIL (no destination)"); + + + status = 1; + } + else + puts("PASS"); + + if (named_dest) + cupsFreeDests(1, named_dest); + + /* + * cupsPrintFile() + */ + + fputs("cupsPrintFile: ", stdout); + fflush(stdout); + + if (cupsPrintFile(dest->name, "../data/testprint", "Test Page", + dest->num_options, dest->options) <= 0) + { + printf("FAIL (%s)\n", cupsLastErrorString()); + return (1); + } + else + puts("PASS"); + + /* + * cupsGetPPD(printer) + */ + + fputs("cupsGetPPD(): ", stdout); + fflush(stdout); + + if ((ppdfile = cupsGetPPD(dest->name)) == NULL) + { + puts("FAIL"); + } + else + { + puts("PASS"); + + /* + * ppdOpenFile() + */ + + fputs("ppdOpenFile(): ", stdout); + fflush(stdout); + + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + ppdClose(ppd); + unlink(ppdfile); + } + + /* + * cupsGetJobs() + */ + + fputs("cupsGetJobs: ", stdout); + fflush(stdout); + + num_jobs = cupsGetJobs(&jobs, NULL, 0, -1); + + if (num_jobs == 0) + { + puts("FAIL"); + return (1); + } + else + puts("PASS"); + + cupsFreeJobs(num_jobs, jobs); + cupsFreeDests(num_dests, dests); + + return (status); +} + + +/* + * 'dests_equal()' - Determine whether two destinations are equal. + */ + +static int /* O - 1 if equal, 0 if not equal */ +dests_equal(cups_dest_t *a, /* I - First destination */ + cups_dest_t *b) /* I - Second destination */ +{ + int i; /* Looping var */ + cups_option_t *aoption; /* Current option */ + const char *bval; /* Option value */ + + + if (a == b) + return (1); + + if (!a || !b) + return (0); + + if (_cups_strcasecmp(a->name, b->name) || + (a->instance && !b->instance) || + (!a->instance && b->instance) || + (a->instance && _cups_strcasecmp(a->instance, b->instance)) || + a->num_options != b->num_options) + return (0); + + for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++) + if ((bval = cupsGetOption(aoption->name, b->num_options, + b->options)) == NULL || + strcmp(aoption->value, bval)) + return (0); + + return (1); +} + + +/* + * 'show_diffs()' - Show differences between two destinations. + */ + +static void +show_diffs(cups_dest_t *a, /* I - First destination */ + cups_dest_t *b) /* I - Second destination */ +{ + int i; /* Looping var */ + cups_option_t *aoption; /* Current option */ + const char *bval; /* Option value */ + + + if (!a || !b) + return; + + puts(" Item cupsGetDest cupsGetNamedDest"); + puts(" -------------------- -------------------- --------------------"); + + if (_cups_strcasecmp(a->name, b->name)) + printf(" name %-20.20s %-20.20s\n", a->name, b->name); + + if ((a->instance && !b->instance) || + (!a->instance && b->instance) || + (a->instance && _cups_strcasecmp(a->instance, b->instance))) + printf(" instance %-20.20s %-20.20s\n", + a->instance ? a->instance : "(null)", + b->instance ? b->instance : "(null)"); + + if (a->num_options != b->num_options) + printf(" num_options %-20d %-20d\n", a->num_options, + b->num_options); + + for (i = a->num_options, aoption = a->options; i > 0; i --, aoption ++) + if ((bval = cupsGetOption(aoption->name, b->num_options, + b->options)) == NULL || + strcmp(aoption->value, bval)) + printf(" %-20.20s %-20.20s %-20.20s\n", aoption->name, + aoption->value, bval ? bval : "(null)"); +} + + +/* + * End of "$Id: testcups.c 9979 2011-09-09 16:34:29Z mike $". + */ diff --git a/cups/testfile.c b/cups/testfile.c new file mode 100644 index 0000000..d92f2e6 --- /dev/null +++ b/cups/testfile.c @@ -0,0 +1,821 @@ +/* + * "$Id: testfile.c 9793 2011-05-20 03:49:49Z mike $" + * + * File test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * count_lines() - Count the number of lines in a file. + * random_tests() - Do random access tests. + * read_write_tests() - Perform read/write tests. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "debug-private.h" +#include "file.h" +#include +#include +#ifdef HAVE_LIBZ +# include +#endif /* HAVE_LIBZ */ +#ifdef WIN32 +# include +#else +# include +#endif /* WIN32 */ +#include + + +/* + * Local functions... + */ + +static int count_lines(cups_file_t *fp); +static int random_tests(void); +static int read_write_tests(int compression); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int status; /* Exit status */ + char filename[1024]; /* Filename buffer */ + cups_file_t *fp; /* File pointer */ +#ifndef WIN32 + int fds[2]; /* Open file descriptors */ + cups_file_t *fdfile; /* File opened with cupsFileOpenFd() */ +#endif /* !WIN32 */ + int count; /* Number of lines in file */ + + + if (argc == 1) + { + /* + * Do uncompressed file tests... + */ + + status = read_write_tests(0); + +#ifdef HAVE_LIBZ + /* + * Do compressed file tests... + */ + + putchar('\n'); + + status += read_write_tests(1); +#endif /* HAVE_LIBZ */ + + /* + * Do uncompressed random I/O tests... + */ + + status += random_tests(); + +#ifndef WIN32 + /* + * Test fdopen and close without reading... + */ + + pipe(fds); + close(fds[1]); + + fputs("\ncupsFileOpenFd(fd, \"r\"): ", stdout); + fflush(stdout); + + if ((fdfile = cupsFileOpenFd(fds[0], "r")) == NULL) + { + puts("FAIL"); + status ++; + } + else + { + /* + * Able to open file, now close without reading. If we don't return + * before the alarm fires, that is a failure and we will crash on the + * alarm signal... + */ + + puts("PASS"); + fputs("cupsFileClose(no read): ", stdout); + fflush(stdout); + + alarm(5); + cupsFileClose(fdfile); + alarm(0); + + puts("PASS"); + } +#endif /* !WIN32 */ + + /* + * Count lines in psglyphs, rewind, then count again. + */ + + fputs("\ncupsFileOpen(\"../data/psglyphs\", \"r\"): ", stdout); + + if ((fp = cupsFileOpen("../data/psglyphs", "r")) == NULL) + { + puts("FAIL"); + status ++; + } + else + { + puts("PASS"); + fputs("cupsFileGets: ", stdout); + + if ((count = count_lines(fp)) != 1051) + { + printf("FAIL (got %d lines, expected 1051)\n", count); + status ++; + } + else + { + puts("PASS"); + fputs("cupsFileRewind: ", stdout); + + if (cupsFileRewind(fp) != 0) + { + puts("FAIL"); + status ++; + } + else + { + puts("PASS"); + fputs("cupsFileGets: ", stdout); + + if ((count = count_lines(fp)) != 1051) + { + printf("FAIL (got %d lines, expected 1051)\n", count); + status ++; + } + else + puts("PASS"); + } + } + + cupsFileClose(fp); + } + + /* + * Test path functions... + */ + + fputs("\ncupsFileFind: ", stdout); +#ifdef WIN32 + if (cupsFileFind("notepad.exe", "C:/WINDOWS", 1, filename, sizeof(filename)) && + cupsFileFind("notepad.exe", "C:/WINDOWS;C:/WINDOWS/SYSTEM32", 1, filename, sizeof(filename))) +#else + if (cupsFileFind("cat", "/bin", 1, filename, sizeof(filename)) && + cupsFileFind("cat", "/bin:/usr/bin", 1, filename, sizeof(filename))) +#endif /* WIN32 */ + printf("PASS (%s)\n", filename); + else + { + puts("FAIL"); + status ++; + } + + /* + * Summarize the results and return... + */ + + if (!status) + puts("\nALL TESTS PASSED!"); + else + printf("\n%d TEST(S) FAILED!\n", status); + } + else + { + /* + * Cat the filename on the command-line... + */ + + char line[1024]; /* Line from file */ + + if ((fp = cupsFileOpen(argv[1], "r")) == NULL) + { + perror(argv[1]); + status = 1; + } + else + { + status = 0; + + while (cupsFileGets(fp, line, sizeof(line))) + puts(line); + + if (!cupsFileEOF(fp)) + perror(argv[1]); + + cupsFileClose(fp); + } + } + + return (status); +} + + +/* + * 'count_lines()' - Count the number of lines in a file. + */ + +static int /* O - Number of lines */ +count_lines(cups_file_t *fp) /* I - File to read from */ +{ + int count; /* Number of lines */ + char line[1024]; /* Line buffer */ + + + for (count = 0; cupsFileGets(fp, line, sizeof(line)); count ++); + + return (count); +} + + +/* + * 'random_tests()' - Do random access tests. + */ + +static int /* O - Status */ +random_tests(void) +{ + int status, /* Status of tests */ + pass, /* Current pass */ + count, /* Number of records read */ + record, /* Current record */ + num_records; /* Number of records */ + ssize_t pos, /* Position in file */ + expected; /* Expected position in file */ + cups_file_t *fp; /* File */ + char buffer[512]; /* Data buffer */ + + + /* + * Run 4 passes, each time appending to a data file and then reopening the + * file for reading to validate random records in the file. + */ + + for (status = 0, pass = 0; pass < 4; pass ++) + { + /* + * cupsFileOpen(append) + */ + + printf("\ncupsFileOpen(append %d): ", pass); + + if ((fp = cupsFileOpen("testfile.dat", "a")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + break; + } + else + puts("PASS"); + + /* + * cupsFileTell() + */ + + expected = 256 * sizeof(buffer) * pass; + + fputs("cupsFileTell(): ", stdout); + if ((pos = cupsFileTell(fp)) != expected) + { + printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", + CUPS_LLCAST pos, CUPS_LLCAST expected); + status ++; + break; + } + else + puts("PASS"); + + /* + * cupsFileWrite() + */ + + fputs("cupsFileWrite(256 512-byte records): ", stdout); + for (record = 0; record < 256; record ++) + { + memset(buffer, record, sizeof(buffer)); + if (cupsFileWrite(fp, buffer, sizeof(buffer)) < sizeof(buffer)) + break; + } + + if (record < 256) + { + printf("FAIL (%d: %s)\n", record, strerror(errno)); + status ++; + break; + } + else + puts("PASS"); + + /* + * cupsFileTell() + */ + + expected += 256 * sizeof(buffer); + + fputs("cupsFileTell(): ", stdout); + if ((pos = cupsFileTell(fp)) != expected) + { + printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", + CUPS_LLCAST pos, CUPS_LLCAST expected); + status ++; + break; + } + else + puts("PASS"); + + cupsFileClose(fp); + + /* + * cupsFileOpen(read) + */ + + printf("\ncupsFileOpen(read %d): ", pass); + + if ((fp = cupsFileOpen("testfile.dat", "r")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + break; + } + else + puts("PASS"); + + /* + * cupsFileSeek, cupsFileRead + */ + + fputs("cupsFileSeek(), cupsFileRead(): ", stdout); + + for (num_records = (pass + 1) * 256, count = (pass + 1) * 256, + record = CUPS_RAND() % num_records; + count > 0; + count --, record = (record + (CUPS_RAND() & 31) - 16 + num_records) % + num_records) + { + /* + * The last record is always the first... + */ + + if (count == 1) + record = 0; + + /* + * Try reading the data for the specified record, and validate the + * contents... + */ + + expected = sizeof(buffer) * record; + + if ((pos = cupsFileSeek(fp, expected)) != expected) + { + printf("FAIL (" CUPS_LLFMT " instead of " CUPS_LLFMT ")\n", + CUPS_LLCAST pos, CUPS_LLCAST expected); + status ++; + break; + } + else + { + if (cupsFileRead(fp, buffer, sizeof(buffer)) != sizeof(buffer)) + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + break; + } + else if ((buffer[0] & 255) != (record & 255) || + memcmp(buffer, buffer + 1, sizeof(buffer) - 1)) + { + printf("FAIL (Bad Data - %d instead of %d)\n", buffer[0] & 255, + record & 255); + status ++; + break; + } + } + } + + if (count == 0) + puts("PASS"); + + cupsFileClose(fp); + } + + /* + * Remove the test file... + */ + + unlink("testfile.dat"); + + /* + * Return the test status... + */ + + return (status); +} + + +/* + * 'read_write_tests()' - Perform read/write tests. + */ + +static int /* O - Status */ +read_write_tests(int compression) /* I - Use compression? */ +{ + int i; /* Looping var */ + cups_file_t *fp; /* File */ + int status; /* Exit status */ + char line[1024], /* Line from file */ + *value; /* Directive value from line */ + int linenum; /* Line number */ + unsigned char readbuf[8192], /* Read buffer */ + writebuf[8192]; /* Write buffer */ + int byte; /* Byte from file */ + off_t length; /* Length of file */ + static const char *partial_line = "partial line"; + /* Partial line */ + + + /* + * No errors so far... + */ + + status = 0; + + /* + * Initialize the write buffer with random data... + */ + + CUPS_SRAND((unsigned)time(NULL)); + + for (i = 0; i < (int)sizeof(writebuf); i ++) + writebuf[i] = CUPS_RAND(); + + /* + * cupsFileOpen(write) + */ + + printf("cupsFileOpen(write%s): ", compression ? " compressed" : ""); + + fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat", + compression ? "w9" : "w"); + if (fp) + { + puts("PASS"); + + /* + * cupsFileCompression() + */ + + fputs("cupsFileCompression(): ", stdout); + + if (cupsFileCompression(fp) == compression) + puts("PASS"); + else + { + printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp), + compression); + status ++; + } + + /* + * cupsFilePuts() + */ + + fputs("cupsFilePuts(): ", stdout); + + if (cupsFilePuts(fp, "# Hello, World\n") > 0) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFilePrintf() + */ + + fputs("cupsFilePrintf(): ", stdout); + + for (i = 0; i < 1000; i ++) + if (cupsFilePrintf(fp, "TestLine %03d\n", i) < 0) + break; + + if (i >= 1000) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFilePutChar() + */ + + fputs("cupsFilePutChar(): ", stdout); + + for (i = 0; i < 256; i ++) + if (cupsFilePutChar(fp, i) < 0) + break; + + if (i >= 256) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileWrite() + */ + + fputs("cupsFileWrite(): ", stdout); + + for (i = 0; i < 10000; i ++) + if (cupsFileWrite(fp, (char *)writebuf, sizeof(writebuf)) < 0) + break; + + if (i >= 10000) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFilePuts() with partial line... + */ + + fputs("cupsFilePuts(\"partial line\"): ", stdout); + + if (cupsFilePuts(fp, partial_line) > 0) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileTell() + */ + + fputs("cupsFileTell(): ", stdout); + + if ((length = cupsFileTell(fp)) == 81933283) + puts("PASS"); + else + { + printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length); + status ++; + } + + /* + * cupsFileClose() + */ + + fputs("cupsFileClose(): ", stdout); + + if (!cupsFileClose(fp)) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileOpen(read) + */ + + fputs("\ncupsFileOpen(read): ", stdout); + + fp = cupsFileOpen(compression ? "testfile.dat.gz" : "testfile.dat", "r"); + if (fp) + { + puts("PASS"); + + /* + * cupsFileGets() + */ + + fputs("cupsFileGets(): ", stdout); + + if (cupsFileGets(fp, line, sizeof(line))) + { + if (line[0] == '#') + puts("PASS"); + else + { + printf("FAIL (Got line \"%s\", expected comment line)\n", line); + status ++; + } + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileCompression() + */ + + fputs("cupsFileCompression(): ", stdout); + + if (cupsFileCompression(fp) == compression) + puts("PASS"); + else + { + printf("FAIL (Got %d, expected %d)\n", cupsFileCompression(fp), + compression); + status ++; + } + + /* + * cupsFileGetConf() + */ + + linenum = 1; + + fputs("cupsFileGetConf(): ", stdout); + + for (i = 0; i < 1000; i ++) + if (!cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + break; + else if (_cups_strcasecmp(line, "TestLine") || !value || atoi(value) != i || + linenum != (i + 2)) + break; + + if (i >= 1000) + puts("PASS"); + else if (line[0]) + { + printf("FAIL (Line %d, directive \"%s\", value \"%s\")\n", linenum, + line, value ? value : "(null)"); + status ++; + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileGetChar() + */ + + fputs("cupsFileGetChar(): ", stdout); + + for (i = 0; i < 256; i ++) + if ((byte = cupsFileGetChar(fp)) != i) + break; + + if (i >= 256) + puts("PASS"); + else if (byte >= 0) + { + printf("FAIL (Got %d, expected %d)\n", byte, i); + status ++; + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileRead() + */ + + fputs("cupsFileRead(): ", stdout); + + for (i = 0; i < 10000; i ++) + if ((byte = cupsFileRead(fp, (char *)readbuf, sizeof(readbuf))) < 0) + break; + else if (memcmp(readbuf, writebuf, sizeof(readbuf))) + break; + + if (i >= 10000) + puts("PASS"); + else if (byte > 0) + { + printf("FAIL (Pass %d, ", i); + + for (i = 0; i < (int)sizeof(readbuf); i ++) + if (readbuf[i] != writebuf[i]) + break; + + printf("match failed at offset %d - got %02X, expected %02X)\n", + i, readbuf[i], writebuf[i]); + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * cupsFileGetChar() with partial line... + */ + + fputs("cupsFileGetChar(partial line): ", stdout); + + for (i = 0; i < (int)strlen(partial_line); i ++) + if ((byte = cupsFileGetChar(fp)) < 0) + break; + else if (byte != partial_line[i]) + break; + + if (!partial_line[i]) + puts("PASS"); + else + { + printf("FAIL (got '%c', expected '%c')\n", byte, partial_line[i]); + status ++; + } + + /* + * cupsFileTell() + */ + + fputs("cupsFileTell(): ", stdout); + + if ((length = cupsFileTell(fp)) == 81933283) + puts("PASS"); + else + { + printf("FAIL (" CUPS_LLFMT " instead of 81933283)\n", CUPS_LLCAST length); + status ++; + } + + /* + * cupsFileClose() + */ + + fputs("cupsFileClose(): ", stdout); + + if (!cupsFileClose(fp)) + puts("PASS"); + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + } + else + { + printf("FAIL (%s)\n", strerror(errno)); + status ++; + } + + /* + * Remove the test file... + */ + + unlink(compression ? "testfile.dat.gz" : "testfile.dat"); + + /* + * Return the test status... + */ + + return (status); +} + + +/* + * End of "$Id: testfile.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/testhttp.c b/cups/testhttp.c new file mode 100644 index 0000000..64b5580 --- /dev/null +++ b/cups/testhttp.c @@ -0,0 +1,600 @@ +/* + * "$Id: testhttp.c 9993 2011-09-09 21:55:11Z mike $" + * + * HTTP test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "http-private.h" + + +/* + * Types and structures... + */ + +typedef struct uri_test_s /**** URI test cases ****/ +{ + http_uri_status_t result; /* Expected return value */ + const char *uri, /* URI */ + *scheme, /* Scheme string */ + *username, /* Username:password string */ + *hostname, /* Hostname string */ + *resource; /* Resource string */ + int port, /* Port number */ + assemble_port; /* Port number for httpAssembleURI() */ +} uri_test_t; + + +/* + * Local globals... + */ + +static uri_test_t uri_tests[] = /* URI test data */ + { + /* Start with valid URIs */ + { HTTP_URI_OK, "file:/filename", + "file", "", "", "/filename", 0, 0 }, + { HTTP_URI_OK, "file:/filename%20with%20spaces", + "file", "", "", "/filename with spaces", 0, 0 }, + { HTTP_URI_OK, "file:///filename", + "file", "", "", "/filename", 0, 0 }, + { HTTP_URI_OK, "file:///filename%20with%20spaces", + "file", "", "", "/filename with spaces", 0, 0 }, + { HTTP_URI_OK, "file://localhost/filename", + "file", "", "localhost", "/filename", 0, 0 }, + { HTTP_URI_OK, "file://localhost/filename%20with%20spaces", + "file", "", "localhost", "/filename with spaces", 0, 0 }, + { HTTP_URI_OK, "http://server/", + "http", "", "server", "/", 80, 0 }, + { HTTP_URI_OK, "http://username@server/", + "http", "username", "server", "/", 80, 0 }, + { HTTP_URI_OK, "http://username:passwor%64@server/", + "http", "username:password", "server", "/", 80, 0 }, + { HTTP_URI_OK, "http://username:passwor%64@server:8080/", + "http", "username:password", "server", "/", 8080, 8080 }, + { HTTP_URI_OK, "http://username:passwor%64@server:8080/directory/filename", + "http", "username:password", "server", "/directory/filename", 8080, 8080 }, + { HTTP_URI_OK, "http://[2000::10:100]:631/ipp", + "http", "", "2000::10:100", "/ipp", 631, 631 }, + { HTTP_URI_OK, "https://username:passwor%64@server/directory/filename", + "https", "username:password", "server", "/directory/filename", 443, 0 }, + { HTTP_URI_OK, "ipp://username:passwor%64@[::1]/ipp", + "ipp", "username:password", "::1", "/ipp", 631, 0 }, + { HTTP_URI_OK, "lpd://server/queue?reserve=yes", + "lpd", "", "server", "/queue?reserve=yes", 515, 0 }, + { HTTP_URI_OK, "mailto:user@domain.com", + "mailto", "", "", "user@domain.com", 0, 0 }, + { HTTP_URI_OK, "socket://server/", + "socket", "", "server", "/", 9100, 0 }, + { HTTP_URI_OK, "socket://192.168.1.1:9101/", + "socket", "", "192.168.1.1", "/", 9101, 9101 }, + { HTTP_URI_OK, "ipp://username:password@[v1.fe80::200:1234:5678:9abc+eth0]:999/ipp", + "ipp", "username:password", "fe80::200:1234:5678:9abc%eth0", "/ipp", 999, 999 }, + { HTTP_URI_OK, "http://server/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", + "http", "", "server", "/admin?DEVICE_URI=usb://HP/Photosmart%25202600%2520series?serial=MY53OK70V10400", 80, 0 }, + { HTTP_URI_OK, "lpd://Acme%20Laser%20(01%3A23%3A45).local._tcp._printer/", + "lpd", "", "Acme Laser (01:23:45).local._tcp._printer", "/", 515, 0 }, + { HTTP_URI_OK, "ipp://HP%20Officejet%204500%20G510n-z%20%40%20Will's%20MacBook%20Pro%2015%22._ipp._tcp.local./", + "ipp", "", "HP Officejet 4500 G510n-z @ Will's MacBook Pro 15\"._ipp._tcp.local.", "/", 631, 0 }, + + /* Missing scheme */ + { HTTP_URI_MISSING_SCHEME, "/path/to/file/index.html", + "file", "", "", "/path/to/file/index.html", 0, 0 }, + { HTTP_URI_MISSING_SCHEME, "//server/ipp", + "ipp", "", "server", "/ipp", 631, 0 }, + + /* Unknown scheme */ + { HTTP_URI_UNKNOWN_SCHEME, "vendor://server/resource", + "vendor", "", "server", "/resource", 0, 0 }, + + /* Missing resource */ + { HTTP_URI_MISSING_RESOURCE, "socket://[::192.168.2.1]", + "socket", "", "::192.168.2.1", "/", 9100, 0 }, + { HTTP_URI_MISSING_RESOURCE, "socket://192.168.1.1:9101", + "socket", "", "192.168.1.1", "/", 9101 }, + + /* Bad URI */ + { HTTP_URI_BAD_URI, "", + "", "", "", "", 0, 0 }, + + /* Bad scheme */ + { HTTP_URI_BAD_SCHEME, "bad_scheme://server/resource", + "", "", "", "", 0, 0 }, + + /* Bad username */ + { HTTP_URI_BAD_USERNAME, "http://username:passwor%6@server/resource", + "http", "", "", "", 80, 0 }, + + /* Bad hostname */ + { HTTP_URI_BAD_HOSTNAME, "http://[/::1]/index.html", + "http", "", "", "", 80, 0 }, + { HTTP_URI_BAD_HOSTNAME, "http://[", + "http", "", "", "", 80, 0 }, + { HTTP_URI_BAD_HOSTNAME, "http://serve%7/index.html", + "http", "", "", "", 80, 0 }, + + /* Bad port number */ + { HTTP_URI_BAD_PORT, "http://127.0.0.1:9999a/index.html", + "http", "", "127.0.0.1", "", 0, 0 }, + + /* Bad resource */ + { HTTP_URI_BAD_RESOURCE, "http://server/index.html%", + "http", "", "server", "", 80, 0 } + }; +static const char * const base64_tests[][2] = + { + { "A", "QQ==" }, + /* 010000 01 */ + { "AB", "QUI=" }, + /* 010000 010100 0010 */ + { "ABC", "QUJD" }, + /* 010000 010100 001001 000011 */ + { "ABCD", "QUJDRA==" }, + /* 010000 010100 001001 000011 010001 00 */ + { "ABCDE", "QUJDREU=" }, + /* 010000 010100 001001 000011 010001 000100 0101 */ + { "ABCDEF", "QUJDREVG" }, + /* 010000 010100 001001 000011 010001 000100 010101 000110 */ + }; + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j, k; /* Looping vars */ + http_t *http; /* HTTP connection */ + http_encryption_t encryption; /* Encryption type */ + http_status_t status; /* Status of GET command */ + int failures; /* Number of test failures */ + char buffer[8192]; /* Input buffer */ + long bytes; /* Number of bytes read */ + FILE *out; /* Output file */ + char encode[256], /* Base64-encoded string */ + decode[256]; /* Base64-decoded string */ + int decodelen; /* Length of decoded string */ + char scheme[HTTP_MAX_URI], /* Scheme from URI */ + hostname[HTTP_MAX_URI], /* Hostname from URI */ + username[HTTP_MAX_URI], /* Username:password from URI */ + resource[HTTP_MAX_URI]; /* Resource from URI */ + int port; /* Port number from URI */ + http_uri_status_t uri_status; /* Status of URI separation */ + http_addrlist_t *addrlist, /* Address list */ + *addr; /* Current address */ + off_t length, total; /* Length and total bytes */ + time_t start, current; /* Start and end time */ + static const char * const uri_status_strings[] = + { + "HTTP_URI_OVERFLOW", + "HTTP_URI_BAD_ARGUMENTS", + "HTTP_URI_BAD_RESOURCE", + "HTTP_URI_BAD_PORT", + "HTTP_URI_BAD_HOSTNAME", + "HTTP_URI_BAD_USERNAME", + "HTTP_URI_BAD_SCHEME", + "HTTP_URI_BAD_URI", + "HTTP_URI_OK", + "HTTP_URI_MISSING_SCHEME", + "HTTP_URI_UNKNOWN_SCHEME", + "HTTP_URI_MISSING_RESOURCE" + }; + + + /* + * Do API tests if we don't have a URL on the command-line... + */ + + if (argc == 1) + { + failures = 0; + + /* + * httpGetDateString()/httpGetDateTime() + */ + + fputs("httpGetDateString()/httpGetDateTime(): ", stdout); + + start = time(NULL); + strcpy(buffer, httpGetDateString(start)); + current = httpGetDateTime(buffer); + + i = (int)(current - start); + if (i < 0) + i = -i; + + if (!i) + puts("PASS"); + else + { + failures ++; + puts("FAIL"); + printf(" Difference is %d seconds, %02d:%02d:%02d...\n", i, i / 3600, + (i / 60) % 60, i % 60); + printf(" httpGetDateString(%d) returned \"%s\"\n", (int)start, buffer); + printf(" httpGetDateTime(\"%s\") returned %d\n", buffer, (int)current); + printf(" httpGetDateString(%d) returned \"%s\"\n", (int)current, + httpGetDateString(current)); + } + + /* + * httpDecode64_2()/httpEncode64_2() + */ + + fputs("httpDecode64_2()/httpEncode64_2(): ", stdout); + + for (i = 0, j = 0; i < (int)(sizeof(base64_tests) / sizeof(base64_tests[0])); i ++) + { + httpEncode64_2(encode, sizeof(encode), base64_tests[i][0], + (int)strlen(base64_tests[i][0])); + decodelen = (int)sizeof(decode); + httpDecode64_2(decode, &decodelen, base64_tests[i][1]); + + if (strcmp(decode, base64_tests[i][0])) + { + failures ++; + + if (j) + { + puts("FAIL"); + j = 1; + } + + printf(" httpDecode64_2() returned \"%s\", expected \"%s\"...\n", + decode, base64_tests[i][0]); + } + + if (strcmp(encode, base64_tests[i][1])) + { + failures ++; + + if (j) + { + puts("FAIL"); + j = 1; + } + + printf(" httpEncode64_2() returned \"%s\", expected \"%s\"...\n", + encode, base64_tests[i][1]); + } + } + + if (!j) + puts("PASS"); + + /* + * httpGetHostname() + */ + + fputs("httpGetHostname(): ", stdout); + + if (httpGetHostname(NULL, hostname, sizeof(hostname))) + printf("PASS (%s)\n", hostname); + else + { + failures ++; + puts("FAIL"); + } + + /* + * httpAddrGetList() + */ + + printf("httpAddrGetList(%s): ", hostname); + + addrlist = httpAddrGetList(hostname, AF_UNSPEC, NULL); + if (addrlist) + { + for (i = 0, addr = addrlist; addr; i ++, addr = addr->next) + { + char numeric[1024]; /* Numeric IP address */ + + + httpAddrString(&(addr->addr), numeric, sizeof(numeric)); + if (!strcmp(numeric, "UNKNOWN")) + break; + } + + if (addr) + printf("FAIL (bad address for %s)\n", hostname); + else + printf("PASS (%d address(es) for %s)\n", i, hostname); + + httpAddrFreeList(addrlist); + } + else if (isdigit(hostname[0] & 255)) + { + puts("FAIL (ignored because hostname is numeric)"); + } + else + { + failures ++; + puts("FAIL"); + } + + /* + * Test httpSeparateURI()... + */ + + fputs("httpSeparateURI(): ", stdout); + for (i = 0, j = 0; i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0])); i ++) + { + uri_status = httpSeparateURI(HTTP_URI_CODING_MOST, + uri_tests[i].uri, scheme, sizeof(scheme), + username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + if (uri_status != uri_tests[i].result || + strcmp(scheme, uri_tests[i].scheme) || + strcmp(username, uri_tests[i].username) || + strcmp(hostname, uri_tests[i].hostname) || + port != uri_tests[i].port || + strcmp(resource, uri_tests[i].resource)) + { + failures ++; + + if (!j) + { + puts("FAIL"); + j = 1; + } + + printf(" \"%s\":\n", uri_tests[i].uri); + + if (uri_status != uri_tests[i].result) + printf(" Returned %s instead of %s\n", + uri_status_strings[uri_status + 8], + uri_status_strings[uri_tests[i].result + 8]); + + if (strcmp(scheme, uri_tests[i].scheme)) + printf(" Scheme \"%s\" instead of \"%s\"\n", + scheme, uri_tests[i].scheme); + + if (strcmp(username, uri_tests[i].username)) + printf(" Username \"%s\" instead of \"%s\"\n", + username, uri_tests[i].username); + + if (strcmp(hostname, uri_tests[i].hostname)) + printf(" Hostname \"%s\" instead of \"%s\"\n", + hostname, uri_tests[i].hostname); + + if (port != uri_tests[i].port) + printf(" Port %d instead of %d\n", + port, uri_tests[i].port); + + if (strcmp(resource, uri_tests[i].resource)) + printf(" Resource \"%s\" instead of \"%s\"\n", + resource, uri_tests[i].resource); + } + } + + if (!j) + printf("PASS (%d URIs tested)\n", + (int)(sizeof(uri_tests) / sizeof(uri_tests[0]))); + + /* + * Test httpAssembleURI()... + */ + + fputs("httpAssembleURI(): ", stdout); + for (i = 0, j = 0, k = 0; + i < (int)(sizeof(uri_tests) / sizeof(uri_tests[0])); + i ++) + if (uri_tests[i].result == HTTP_URI_OK && + !strstr(uri_tests[i].uri, "%64") && + strstr(uri_tests[i].uri, "//")) + { + k ++; + uri_status = httpAssembleURI(HTTP_URI_CODING_MOST, + buffer, sizeof(buffer), + uri_tests[i].scheme, + uri_tests[i].username, + uri_tests[i].hostname, + uri_tests[i].assemble_port, + uri_tests[i].resource); + + if (uri_status != HTTP_URI_OK) + { + failures ++; + + if (!j) + { + puts("FAIL"); + j = 1; + } + + printf(" \"%s\": %s\n", uri_tests[i].uri, + uri_status_strings[uri_status + 8]); + } + else if (strcmp(buffer, uri_tests[i].uri)) + { + failures ++; + + if (!j) + { + puts("FAIL"); + j = 1; + } + + printf(" \"%s\": assembled = \"%s\"\n", uri_tests[i].uri, + buffer); + } + } + + if (!j) + printf("PASS (%d URIs tested)\n", k); + + /* + * Show a summary and return... + */ + + if (failures) + printf("\n%d TESTS FAILED!\n", failures); + else + puts("\nALL TESTS PASSED!"); + + return (failures); + } + else if (strstr(argv[1], "._tcp")) + { + /* + * Test resolving an mDNS name. + */ + + char resolved[1024]; /* Resolved URI */ + + + printf("_httpResolveURI(%s, _HTTP_RESOLVE_DEFAULT): ", argv[1]); + fflush(stdout); + + if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), + _HTTP_RESOLVE_DEFAULT, NULL, NULL)) + { + puts("FAIL"); + return (1); + } + else + printf("PASS (%s)\n", resolved); + + printf("_httpResolveURI(%s, _HTTP_RESOLVE_FQDN): ", argv[1]); + fflush(stdout); + + if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), + _HTTP_RESOLVE_FQDN, NULL, NULL)) + { + puts("FAIL"); + return (1); + } + else if (strstr(resolved, ".local:")) + { + printf("FAIL (%s)\n", resolved); + return (1); + } + else + { + printf("PASS (%s)\n", resolved); + return (0); + } + } + else if (!strcmp(argv[1], "-u") && argc == 3) + { + /* + * Test URI separation... + */ + + uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, argv[2], scheme, + sizeof(scheme), username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + printf("uri_status = %s\n", uri_status_strings[uri_status + 8]); + printf("scheme = \"%s\"\n", scheme); + printf("username = \"%s\"\n", username); + printf("hostname = \"%s\"\n", hostname); + printf("port = %d\n", port); + printf("resource = \"%s\"\n", resource); + + return (0); + } + + /* + * Test HTTP GET requests... + */ + + http = NULL; + out = stdout; + + for (i = 1; i < argc; i ++) + { + if (!strcmp(argv[i], "-o")) + { + i ++; + if (i >= argc) + break; + + out = fopen(argv[i], "wb"); + continue; + } + + httpSeparateURI(HTTP_URI_CODING_MOST, argv[i], scheme, sizeof(scheme), + username, sizeof(username), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if (!_cups_strcasecmp(scheme, "https") || !_cups_strcasecmp(scheme, "ipps") || + port == 443) + encryption = HTTP_ENCRYPT_ALWAYS; + else + encryption = HTTP_ENCRYPT_IF_REQUESTED; + + http = httpConnectEncrypt(hostname, port, encryption); + if (http == NULL) + { + perror(hostname); + continue; + } + printf("Requesting file \"%s\"...\n", resource); + httpClearFields(http); + httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en"); + httpGet(http, resource); + while ((status = httpUpdate(http)) == HTTP_CONTINUE); + + if (status == HTTP_OK) + puts("GET OK:"); + else + printf("GET failed with status %d...\n", status); + + start = time(NULL); + length = httpGetLength2(http); + total = 0; + + while ((bytes = httpRead2(http, buffer, sizeof(buffer))) > 0) + { + total += bytes; + fwrite(buffer, bytes, 1, out); + if (out != stdout) + { + current = time(NULL); + if (current == start) current ++; + printf("\r" CUPS_LLFMT "/" CUPS_LLFMT " bytes (" + CUPS_LLFMT " bytes/sec) ", CUPS_LLCAST total, + CUPS_LLCAST length, CUPS_LLCAST (total / (current - start))); + fflush(stdout); + } + } + } + + puts("Closing connection to server..."); + httpClose(http); + + if (out != stdout) + fclose(out); + + return (0); +} + + +/* + * End of "$Id: testhttp.c 9993 2011-09-09 21:55:11Z mike $". + */ diff --git a/cups/testi18n.c b/cups/testi18n.c new file mode 100644 index 0000000..6814186 --- /dev/null +++ b/cups/testi18n.c @@ -0,0 +1,619 @@ +/* + * "$Id: testi18n.c 9793 2011-05-20 03:49:49Z mike $" + * + * Internationalization test for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry for internationalization test module. + * print_utf8() - Print UTF-8 string with (optional) message. + */ + +/* + * Include necessary headers... + */ + +#include "string-private.h" +#include "language-private.h" +#include +#include +#include + + +/* + * Local globals... + */ + +static const char * const lang_encodings[] = + { /* Encoding strings */ + "us-ascii", "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", "utf-8", + "iso-8859-13", "iso-8859-14", + "iso-8859-15", "windows-874", + "windows-1250", "windows-1251", + "windows-1252", "windows-1253", + "windows-1254", "windows-1255", + "windows-1256", "windows-1257", + "windows-1258", "koi8-r", + "koi8-u", "iso-8859-11", + "iso-8859-16", "mac-roman", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "windows-932", "windows-936", + "windows-949", "windows-950", + "windows-1361", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "unknown", "unknown", + "euc-cn", "euc-jp", + "euc-kr", "euc-tw", + "jis-x0213" + }; + + +/* + * Local functions... + */ + +static void print_utf8(const char *msg, const cups_utf8_t *src); + + +/* + * 'main()' - Main entry for internationalization test module. + */ + +int /* O - Exit code */ +main(int argc, /* I - Argument Count */ + char *argv[]) /* I - Arguments */ +{ + FILE *fp; /* File pointer */ + int count; /* File line counter */ + int status, /* Status of current test */ + errors; /* Error count */ + char line[1024]; /* File line source string */ + int len; /* Length (count) of string */ + char legsrc[1024], /* Legacy source string */ + legdest[1024], /* Legacy destination string */ + *legptr; /* Pointer into legacy string */ + cups_utf8_t utf8latin[] = /* UTF-8 Latin-1 source */ + { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; + /* "A != ." - use ISO 8859-1 */ + cups_utf8_t utf8repla[] = /* UTF-8 Latin-1 replacement */ + { 0x41, 0x20, 0xE2, 0x89, 0xA2, 0x20, 0xC3, 0x84, 0x2E, 0x00 }; + /* "A ." */ + cups_utf8_t utf8greek[] = /* UTF-8 Greek source string */ + { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xCE, 0x91, 0x2E, 0x00 }; + /* "A != ." - use ISO 8859-7 */ + cups_utf8_t utf8japan[] = /* UTF-8 Japanese source */ + { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xEE, 0x9C, 0x80, 0x2E, 0x00 }; + /* "A != ." - use Windows 932 or EUC-JP */ + cups_utf8_t utf8taiwan[] = /* UTF-8 Chinese source */ + { 0x41, 0x20, 0x21, 0x3D, 0x20, 0xE4, 0xB9, 0x82, 0x2E, 0x00 }; + /* "A != ." - use Windows 950 (Big5) or EUC-TW */ + cups_utf8_t utf8dest[1024]; /* UTF-8 destination string */ + cups_utf32_t utf32dest[1024]; /* UTF-32 destination string */ + + + if (argc > 1) + { + int i; /* Looping var */ + cups_encoding_t encoding; /* Source encoding */ + + + if (argc != 3) + { + puts("Usage: ./testi18n [filename charset]"); + return (1); + } + + if ((fp = fopen(argv[1], "rb")) == NULL) + { + perror(argv[1]); + return (1); + } + + for (i = 0, encoding = CUPS_AUTO_ENCODING; + i < (int)(sizeof(lang_encodings) / sizeof(lang_encodings[0])); + i ++) + if (!_cups_strcasecmp(lang_encodings[i], argv[2])) + { + encoding = (cups_encoding_t)i; + break; + } + + if (encoding == CUPS_AUTO_ENCODING) + { + fprintf(stderr, "%s: Unknown character set!\n", argv[2]); + return (1); + } + + while (fgets(line, sizeof(line), fp)) + { + if (cupsCharsetToUTF8(utf8dest, line, sizeof(utf8dest), encoding) < 0) + { + fprintf(stderr, "%s: Unable to convert line: %s", argv[1], line); + return (1); + } + + fputs((char *)utf8dest, stdout); + } + + fclose(fp); + return (0); + } + + /* + * Start with some conversion tests from a UTF-8 test file. + */ + + errors = 0; + + if ((fp = fopen("utf8demo.txt", "rb")) == NULL) + { + perror("utf8demo.txt"); + return (1); + } + + /* + * cupsUTF8ToUTF32 + */ + + fputs("cupsUTF8ToUTF32 of utfdemo.txt: ", stdout); + + for (count = 0, status = 0; fgets(line, sizeof(line), fp);) + { + count ++; + + if (cupsUTF8ToUTF32(utf32dest, (cups_utf8_t *)line, 1024) < 0) + { + printf("FAIL (UTF-8 to UTF-32 on line %d)\n", count); + errors ++; + status = 1; + break; + } + } + + if (!status) + puts("PASS"); + + /* + * cupsUTF8ToCharset(CUPS_EUC_JP) + */ + + fputs("cupsUTF8ToCharset(CUPS_EUC_JP) of utfdemo.txt: ", stdout); + + rewind(fp); + + for (count = 0, status = 0; fgets(line, sizeof(line), fp);) + { + count ++; + + len = cupsUTF8ToCharset(legdest, (cups_utf8_t *)line, 1024, CUPS_EUC_JP); + if (len < 0) + { + printf("FAIL (UTF-8 to EUC-JP on line %d)\n", count); + errors ++; + status = 1; + break; + } + } + + if (!status) + puts("PASS"); + + fclose(fp); + + /* + * Test UTF-8 to legacy charset (ISO 8859-1)... + */ + + fputs("cupsUTF8ToCharset(CUPS_ISO8859_1): ", stdout); + + legdest[0] = 0; + + len = cupsUTF8ToCharset(legdest, utf8latin, 1024, CUPS_ISO8859_1); + if (len < 0) + { + printf("FAIL (len=%d)\n", len); + errors ++; + } + else + puts("PASS"); + + /* + * cupsCharsetToUTF8 + */ + + fputs("cupsCharsetToUTF8(CUPS_ISO8859_1): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_1); + if (len != strlen((char *)utf8latin)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8latin)); + print_utf8(" utf8latin", utf8latin); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8latin, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8latin", utf8latin); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (cupsUTF8ToCharset(legdest, utf8repla, 1024, CUPS_ISO8859_1) < 0) + { + puts("FAIL (replacement characters do not work!)"); + errors ++; + } + else + puts("PASS"); + + /* + * Test UTF-8 to/from legacy charset (ISO 8859-7)... + */ + + fputs("cupsUTF8ToCharset(CUPS_ISO8859_7): ", stdout); + + if (cupsUTF8ToCharset(legdest, utf8greek, 1024, CUPS_ISO8859_7) < 0) + { + puts("FAIL"); + errors ++; + } + else + { + for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); + + if (*legptr) + { + puts("FAIL (unknown character)"); + errors ++; + } + else + puts("PASS"); + } + + fputs("cupsCharsetToUTF8(CUPS_ISO8859_7): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_ISO8859_7); + if (len != strlen((char *)utf8greek)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8greek)); + print_utf8(" utf8greek", utf8greek); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8greek, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8greek", utf8greek); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else + puts("PASS"); + + /* + * Test UTF-8 to/from legacy charset (Windows 932)... + */ + + fputs("cupsUTF8ToCharset(CUPS_WINDOWS_932): ", stdout); + + if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_WINDOWS_932) < 0) + { + puts("FAIL"); + errors ++; + } + else + { + for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); + + if (*legptr) + { + puts("FAIL (unknown character)"); + errors ++; + } + else + puts("PASS"); + } + + fputs("cupsCharsetToUTF8(CUPS_WINDOWS_932): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_932); + if (len != strlen((char *)utf8japan)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan)); + print_utf8(" utf8japan", utf8japan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8japan, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8japan", utf8japan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else + puts("PASS"); + + /* + * Test UTF-8 to/from legacy charset (EUC-JP)... + */ + + fputs("cupsUTF8ToCharset(CUPS_EUC_JP): ", stdout); + + if (cupsUTF8ToCharset(legdest, utf8japan, 1024, CUPS_EUC_JP) < 0) + { + puts("FAIL"); + errors ++; + } + else + { + for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); + + if (*legptr) + { + puts("FAIL (unknown character)"); + errors ++; + } + else + puts("PASS"); + } + +#if !defined(__linux__) && !defined(__GLIBC__) + fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_JP); + if (len != strlen((char *)utf8japan)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8japan)); + print_utf8(" utf8japan", utf8japan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8japan, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8japan", utf8japan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else + puts("PASS"); +#endif /* !__linux */ + + /* + * Test UTF-8 to/from legacy charset (Windows 950)... + */ + + fputs("cupsUTF8ToCharset(CUPS_WINDOWS_950): ", stdout); + + if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_WINDOWS_950) < 0) + { + puts("FAIL"); + errors ++; + } + else + { + for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); + + if (*legptr) + { + puts("FAIL (unknown character)"); + errors ++; + } + else + puts("PASS"); + } + + fputs("cupsCharsetToUTF8(CUPS_WINDOWS_950): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_WINDOWS_950); + if (len != strlen((char *)utf8taiwan)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan)); + print_utf8(" utf8taiwan", utf8taiwan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8taiwan, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8taiwan", utf8taiwan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else + puts("PASS"); + + /* + * Test UTF-8 to/from legacy charset (EUC-TW)... + */ + + fputs("cupsUTF8ToCharset(CUPS_EUC_TW): ", stdout); + + if (cupsUTF8ToCharset(legdest, utf8taiwan, 1024, CUPS_EUC_TW) < 0) + { + puts("FAIL"); + errors ++; + } + else + { + for (legptr = legdest; *legptr && *legptr != '?'; legptr ++); + + if (*legptr) + { + puts("FAIL (unknown character)"); + errors ++; + } + else + puts("PASS"); + } + + fputs("cupsCharsetToUTF8(CUPS_EUC_TW): ", stdout); + + strcpy(legsrc, legdest); + + len = cupsCharsetToUTF8(utf8dest, legsrc, 1024, CUPS_EUC_TW); + if (len != strlen((char *)utf8taiwan)) + { + printf("FAIL (len=%d, expected %d)\n", len, (int)strlen((char *)utf8taiwan)); + print_utf8(" utf8taiwan", utf8taiwan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else if (memcmp(utf8taiwan, utf8dest, len)) + { + puts("FAIL (results do not match)"); + print_utf8(" utf8taiwan", utf8taiwan); + print_utf8(" utf8dest", utf8dest); + errors ++; + } + else + puts("PASS"); + +#if 0 + /* + * Test UTF-8 (16-bit) to UTF-32 (w/ BOM)... + */ + if (verbose) + printf("\ntesti18n: Testing UTF-8 to UTF-32 (w/ BOM)...\n"); + len = cupsUTF8ToUTF32(utf32dest, utf8good, 1024); + if (len < 0) + return (1); + if (verbose) + { + print_utf8(" utf8good ", utf8good); + print_utf32(" utf32dest", utf32dest); + } + memcpy (utf32src, utf32dest, (len + 1) * sizeof(cups_utf32_t)); + len = cupsUTF32ToUTF8(utf8dest, utf32src, 1024); + if (len < 0) + return (1); + if (len != strlen ((char *) utf8good)) + return (1); + if (memcmp(utf8good, utf8dest, len) != 0) + return (1); + + /* + * Test invalid UTF-8 (16-bit) to UTF-32 (w/ BOM)... + */ + if (verbose) + printf("\ntesti18n: Testing UTF-8 bad 16-bit source string...\n"); + len = cupsUTF8ToUTF32(utf32dest, utf8bad, 1024); + if (len >= 0) + return (1); + if (verbose) + print_utf8(" utf8bad ", utf8bad); + + /* + * Test _cupsCharmapFlush()... + */ + if (verbose) + printf("\ntesti18n: Testing _cupsCharmapFlush()...\n"); + _cupsCharmapFlush(); + return (0); +#endif /* 0 */ + + return (errors > 0); +} + + +/* + * 'print_utf8()' - Print UTF-8 string with (optional) message. + */ + +static void +print_utf8(const char *msg, /* I - Message String */ + const cups_utf8_t *src) /* I - UTF-8 Source String */ +{ + const char *prefix; /* Prefix string */ + + + if (msg) + printf("%s:", msg); + + for (prefix = " "; *src; src ++) + { + printf("%s%02x", prefix, *src); + + if ((src[0] & 0x80) && (src[1] & 0x80)) + prefix = ""; + else + prefix = " "; + } + + putchar('\n'); +} + + +/* + * End of "$Id: testi18n.c 9793 2011-05-20 03:49:49Z mike $" + */ diff --git a/cups/testipp.c b/cups/testipp.c new file mode 100644 index 0000000..92b0e14 --- /dev/null +++ b/cups/testipp.c @@ -0,0 +1,1005 @@ +/* + * "$Id: testipp.c 9999 2011-09-14 00:31:10Z mike $" + * + * IPP test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * hex_dump() - Produce a hex dump of a buffer. + * print_attributes() - Print the attributes in a request... + * read_cb() - Read data from a buffer. + * write_cb() - Write data into a buffer. + */ + +/* + * Include necessary headers... + */ + +#include "file.h" +#include "string-private.h" +#include "ipp-private.h" +#ifdef WIN32 +# include +#else +# include +# include +#endif /* WIN32 */ + + +/* + * Local types... + */ + +typedef struct _ippdata_t +{ + size_t rpos, /* Read position */ + wused, /* Bytes used */ + wsize; /* Max size of buffer */ + ipp_uchar_t *wbuffer; /* Buffer */ +} _ippdata_t; + + +/* + * Local globals... + */ + +ipp_uchar_t collection[] = /* Collection buffer */ + { + 0x01, 0x01, /* IPP version */ + 0x00, 0x02, /* Print-Job operation */ + 0x00, 0x00, 0x00, 0x01, + /* Request ID */ + + IPP_TAG_OPERATION, + + IPP_TAG_CHARSET, + 0x00, 0x12, /* Name length + name */ + 'a','t','t','r','i','b','u','t','e','s','-', + 'c','h','a','r','s','e','t', + 0x00, 0x05, /* Value length + value */ + 'u','t','f','-','8', + + IPP_TAG_LANGUAGE, + 0x00, 0x1b, /* Name length + name */ + 'a','t','t','r','i','b','u','t','e','s','-', + 'n','a','t','u','r','a','l','-','l','a','n', + 'g','u','a','g','e', + 0x00, 0x02, /* Value length + value */ + 'e','n', + + IPP_TAG_URI, + 0x00, 0x0b, /* Name length + name */ + 'p','r','i','n','t','e','r','-','u','r','i', + 0x00, 0x1c, /* Value length + value */ + 'i','p','p',':','/','/','l','o','c','a','l', + 'h','o','s','t','/','p','r','i','n','t','e', + 'r','s','/','f','o','o', + + IPP_TAG_JOB, /* job group tag */ + + IPP_TAG_BEGIN_COLLECTION, + /* begCollection tag */ + 0x00, 0x09, /* Name length + name */ + 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0a, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', + IPP_TAG_BEGIN_COLLECTION, + /* begCollection tag */ + 0x00, 0x00, /* Name length + name */ + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, + /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', + IPP_TAG_INTEGER, /* integer tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x04, /* Value length + value */ + 0x00, 0x00, 0x54, 0x56, + IPP_TAG_MEMBERNAME, + /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', + IPP_TAG_INTEGER, /* integer tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x04, /* Value length + value */ + 0x00, 0x00, 0x6d, 0x24, + IPP_TAG_END_COLLECTION, + /* endCollection tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', + IPP_TAG_KEYWORD, /* keyword tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x04, /* Value length + value */ + 'b', 'l', 'u', 'e', + + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0a, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', + IPP_TAG_KEYWORD, /* keyword tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x05, /* Value length + value */ + 'p', 'l', 'a', 'i', 'n', + IPP_TAG_END_COLLECTION, + /* endCollection tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x00, /* No value */ + + IPP_TAG_BEGIN_COLLECTION, + /* begCollection tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0a, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 's', 'i', 'z', 'e', + IPP_TAG_BEGIN_COLLECTION, + /* begCollection tag */ + 0x00, 0x00, /* Name length + name */ + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, + /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'x', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', + IPP_TAG_INTEGER, /* integer tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x04, /* Value length + value */ + 0x00, 0x00, 0x52, 0x08, + IPP_TAG_MEMBERNAME, + /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'y', '-', 'd', 'i', 'm', 'e', 'n', 's', 'i', 'o', 'n', + IPP_TAG_INTEGER, /* integer tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x04, /* Value length + value */ + 0x00, 0x00, 0x74, 0x04, + IPP_TAG_END_COLLECTION, + /* endCollection tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x00, /* No value */ + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0b, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 'c', 'o', 'l', 'o', 'r', + IPP_TAG_KEYWORD, /* keyword tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x05, /* Value length + value */ + 'p', 'l', 'a', 'i', 'd', + + IPP_TAG_MEMBERNAME, /* memberAttrName tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x0a, /* Value length + value */ + 'm', 'e', 'd', 'i', 'a', '-', 't', 'y', 'p', 'e', + IPP_TAG_KEYWORD, /* keyword tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x06, /* Value length + value */ + 'g', 'l', 'o', 's', 's', 'y', + IPP_TAG_END_COLLECTION, + /* endCollection tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x00, /* No value */ + + IPP_TAG_END /* end tag */ + }; + +ipp_uchar_t mixed[] = /* Mixed value buffer */ + { + 0x01, 0x01, /* IPP version */ + 0x00, 0x02, /* Print-Job operation */ + 0x00, 0x00, 0x00, 0x01, + /* Request ID */ + + IPP_TAG_OPERATION, + + IPP_TAG_INTEGER, /* integer tag */ + 0x00, 0x1f, /* Name length + name */ + 'n', 'o', 't', 'i', 'f', 'y', '-', 'l', 'e', 'a', 's', 'e', + '-', 'd', 'u', 'r', 'a', 't', 'i', 'o', 'n', '-', 's', 'u', + 'p', 'p', 'o', 'r', 't', 'e', 'd', + 0x00, 0x04, /* Value length + value */ + 0x00, 0x00, 0x00, 0x01, + + IPP_TAG_RANGE, /* rangeOfInteger tag */ + 0x00, 0x00, /* No name */ + 0x00, 0x08, /* Value length + value */ + 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x20, + + IPP_TAG_END /* end tag */ + }; + + +/* + * Local functions... + */ + +void hex_dump(const char *title, ipp_uchar_t *buffer, int bytes); +void print_attributes(ipp_t *ipp, int indent); +ssize_t read_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes); +ssize_t write_cb(_ippdata_t *data, ipp_uchar_t *buffer, size_t bytes); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + _ippdata_t data; /* IPP buffer */ + ipp_uchar_t buffer[8192]; /* Write buffer data */ + ipp_t *cols[2], /* Collections */ + *size; /* media-size collection */ + ipp_t *request; /* Request */ + ipp_attribute_t *media_col, /* media-col attribute */ + *media_size, /* media-size attribute */ + *attr; /* Other attribute */ + ipp_state_t state; /* State */ + int length; /* Length of data */ + cups_file_t *fp; /* File pointer */ + int i; /* Looping var */ + int status; /* Status of tests (0 = success, 1 = fail) */ + + + status = 0; + + if (argc == 1) + { + /* + * Test request generation code... + */ + + printf("Create Sample Request: "); + + request = ippNew(); + request->request.op.version[0] = 0x01; + request->request.op.version[1] = 0x01; + request->request.op.operation_id = IPP_PRINT_JOB; + request->request.op.request_id = 1; + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, "utf-8"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, "en"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, "ipp://localhost/printers/foo"); + + cols[0] = ippNew(); + size = ippNew(); + ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21590); + ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 27940); + ippAddCollection(cols[0], IPP_TAG_JOB, "media-size", size); + ippDelete(size); + ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL, + "blue"); + ippAddString(cols[0], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL, + "plain"); + + cols[1] = ippNew(); + size = ippNew(); + ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "x-dimension", 21000); + ippAddInteger(size, IPP_TAG_ZERO, IPP_TAG_INTEGER, "y-dimension", 29700); + ippAddCollection(cols[1], IPP_TAG_JOB, "media-size", size); + ippDelete(size); + ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-color", NULL, + "plaid"); + ippAddString(cols[1], IPP_TAG_JOB, IPP_TAG_KEYWORD, "media-type", NULL, + "glossy"); + + ippAddCollections(request, IPP_TAG_JOB, "media-col", 2, + (const ipp_t **)cols); + ippDelete(cols[0]); + ippDelete(cols[1]); + + length = ippLength(request); + if (length != sizeof(collection)) + { + printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + length, (int)sizeof(collection)); + status = 1; + } + else + puts("PASS"); + + /* + * Write test #1... + */ + + printf("Write Sample to Memory: "); + + data.wused = 0; + data.wsize = sizeof(buffer); + data.wbuffer = buffer; + + while ((state = ippWriteIO(&data, (ipp_iocb_t)write_cb, 1, NULL, + request)) != IPP_DATA) + if (state == IPP_ERROR) + break; + + if (state != IPP_DATA) + { + printf("FAIL - %d bytes written.\n", (int)data.wused); + status = 1; + } + else if (data.wused != sizeof(collection)) + { + printf("FAIL - wrote %d bytes, expected %d bytes!\n", (int)data.wused, + (int)sizeof(collection)); + hex_dump("Bytes Written", data.wbuffer, data.wused); + hex_dump("Baseline", collection, sizeof(collection)); + status = 1; + } + else if (memcmp(data.wbuffer, collection, data.wused)) + { + for (i = 0; i < data.wused; i ++) + if (data.wbuffer[i] != collection[i]) + break; + + printf("FAIL - output does not match baseline at 0x%04x!\n", i); + hex_dump("Bytes Written", data.wbuffer, data.wused); + hex_dump("Baseline", collection, sizeof(collection)); + status = 1; + } + else + puts("PASS"); + + ippDelete(request); + + /* + * Read the data back in and confirm... + */ + + printf("Read Sample from Memory: "); + + request = ippNew(); + data.rpos = 0; + + while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, + request)) != IPP_DATA) + if (state == IPP_ERROR) + break; + + length = ippLength(request); + + if (state != IPP_DATA) + { + printf("FAIL - %d bytes read.\n", (int)data.rpos); + status = 1; + } + else if (data.rpos != data.wused) + { + printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, + (int)data.wused); + print_attributes(request, 8); + status = 1; + } + else if (length != sizeof(collection)) + { + printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + length, (int)sizeof(collection)); + print_attributes(request, 8); + status = 1; + } + else + puts("PASS"); + + fputs("ippFindAttribute(media-col): ", stdout); + if ((media_col = ippFindAttribute(request, "media-col", + IPP_TAG_BEGIN_COLLECTION)) == NULL) + { + if ((media_col = ippFindAttribute(request, "media-col", + IPP_TAG_ZERO)) == NULL) + puts("FAIL (not found)"); + else + printf("FAIL (wrong type - %s)\n", ippTagString(media_col->value_tag)); + + status = 1; + } + else if (media_col->num_values != 2) + { + printf("FAIL (wrong count - %d)\n", media_col->num_values); + status = 1; + } + else + puts("PASS"); + + if (media_col) + { + fputs("ippFindAttribute(media-size 1): ", stdout); + if ((media_size = ippFindAttribute(media_col->values[0].collection, + "media-size", + IPP_TAG_BEGIN_COLLECTION)) == NULL) + { + if ((media_size = ippFindAttribute(media_col->values[0].collection, + "media-col", + IPP_TAG_ZERO)) == NULL) + puts("FAIL (not found)"); + else + printf("FAIL (wrong type - %s)\n", + ippTagString(media_size->value_tag)); + + status = 1; + } + else + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "x-dimension", IPP_TAG_INTEGER)) == NULL) + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "x-dimension", IPP_TAG_ZERO)) == NULL) + puts("FAIL (missing x-dimension)"); + else + printf("FAIL (wrong type for x-dimension - %s)\n", + ippTagString(attr->value_tag)); + + status = 1; + } + else if (attr->values[0].integer != 21590) + { + printf("FAIL (wrong value for x-dimension - %d)\n", + attr->values[0].integer); + status = 1; + } + else if ((attr = ippFindAttribute(media_size->values[0].collection, + "y-dimension", + IPP_TAG_INTEGER)) == NULL) + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "y-dimension", IPP_TAG_ZERO)) == NULL) + puts("FAIL (missing y-dimension)"); + else + printf("FAIL (wrong type for y-dimension - %s)\n", + ippTagString(attr->value_tag)); + + status = 1; + } + else if (attr->values[0].integer != 27940) + { + printf("FAIL (wrong value for y-dimension - %d)\n", + attr->values[0].integer); + status = 1; + } + else + puts("PASS"); + } + + fputs("ippFindAttribute(media-size 2): ", stdout); + if ((media_size = ippFindAttribute(media_col->values[1].collection, + "media-size", + IPP_TAG_BEGIN_COLLECTION)) == NULL) + { + if ((media_size = ippFindAttribute(media_col->values[1].collection, + "media-col", + IPP_TAG_ZERO)) == NULL) + puts("FAIL (not found)"); + else + printf("FAIL (wrong type - %s)\n", + ippTagString(media_size->value_tag)); + + status = 1; + } + else + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "x-dimension", + IPP_TAG_INTEGER)) == NULL) + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "x-dimension", IPP_TAG_ZERO)) == NULL) + puts("FAIL (missing x-dimension)"); + else + printf("FAIL (wrong type for x-dimension - %s)\n", + ippTagString(attr->value_tag)); + + status = 1; + } + else if (attr->values[0].integer != 21000) + { + printf("FAIL (wrong value for x-dimension - %d)\n", + attr->values[0].integer); + status = 1; + } + else if ((attr = ippFindAttribute(media_size->values[0].collection, + "y-dimension", + IPP_TAG_INTEGER)) == NULL) + { + if ((attr = ippFindAttribute(media_size->values[0].collection, + "y-dimension", IPP_TAG_ZERO)) == NULL) + puts("FAIL (missing y-dimension)"); + else + printf("FAIL (wrong type for y-dimension - %s)\n", + ippTagString(attr->value_tag)); + + status = 1; + } + else if (attr->values[0].integer != 29700) + { + printf("FAIL (wrong value for y-dimension - %d)\n", + attr->values[0].integer); + status = 1; + } + else + puts("PASS"); + } + } + + ippDelete(request); + + /* + * Read the mixed data and confirm we converted everything to rangeOfInteger + * values... + */ + + printf("Read Mixed integer/rangeOfInteger from Memory: "); + + request = ippNew(); + data.rpos = 0; + data.wused = sizeof(mixed); + data.wsize = sizeof(mixed); + data.wbuffer = mixed; + + while ((state = ippReadIO(&data, (ipp_iocb_t)read_cb, 1, NULL, + request)) != IPP_DATA) + if (state == IPP_ERROR) + break; + + length = ippLength(request); + + if (state != IPP_DATA) + { + printf("FAIL - %d bytes read.\n", (int)data.rpos); + status = 1; + } + else if (data.rpos != sizeof(mixed)) + { + printf("FAIL - read %d bytes, expected %d bytes!\n", (int)data.rpos, + (int)sizeof(mixed)); + print_attributes(request, 8); + status = 1; + } + else if (length != (sizeof(mixed) + 4)) + { + printf("FAIL - wrong ippLength(), %d instead of %d bytes!\n", + length, (int)sizeof(mixed) + 4); + print_attributes(request, 8); + status = 1; + } + else + puts("PASS"); + + fputs("ippFindAttribute(notify-lease-duration-supported): ", stdout); + if ((attr = ippFindAttribute(request, "notify-lease-duration-supported", + IPP_TAG_ZERO)) == NULL) + { + puts("FAIL (not found)"); + status = 1; + } + else if (attr->value_tag != IPP_TAG_RANGE) + { + printf("FAIL (wrong type - %s)\n", ippTagString(attr->value_tag)); + status = 1; + } + else if (attr->num_values != 2) + { + printf("FAIL (wrong count - %d)\n", attr->num_values); + status = 1; + } + else if (attr->values[0].range.lower != 1 || + attr->values[0].range.upper != 1 || + attr->values[1].range.lower != 16 || + attr->values[1].range.upper != 32) + { + printf("FAIL (wrong values - %d,%d and %d,%d)\n", + attr->values[0].range.lower, + attr->values[0].range.upper, + attr->values[1].range.lower, + attr->values[1].range.upper); + status = 1; + } + else + puts("PASS"); + + ippDelete(request); + + /* + * Test _ippFindOption() private API... + */ + + fputs("_ippFindOption(printer-type): ", stdout); + if (_ippFindOption("printer-type")) + puts("PASS"); + else + { + puts("FAIL"); + status = 1; + } + + /* + * Summarize... + */ + + putchar('\n'); + + if (status) + puts("Core IPP tests failed."); + else + puts("Core IPP tests passed."); + } + else + { + /* + * Read IPP files... + */ + + for (i = 1; i < argc; i ++) + { + if ((fp = cupsFileOpen(argv[i], "r")) == NULL) + { + printf("Unable to open \"%s\" - %s\n", argv[i], strerror(errno)); + status = 1; + continue; + } + + request = ippNew(); + while ((state = ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, + request)) == IPP_ATTRIBUTE); + + if (state != IPP_DATA) + { + printf("Error reading IPP message from \"%s\"!\n", argv[i]); + status = 1; + } + else + { + printf("\n%s:\n", argv[i]); + print_attributes(request, 4); + } + + ippDelete(request); + cupsFileClose(fp); + } + } + + return (status); +} + + +/* + * 'hex_dump()' - Produce a hex dump of a buffer. + */ + +void +hex_dump(const char *title, /* I - Title */ + ipp_uchar_t *buffer, /* I - Buffer to dump */ + int bytes) /* I - Number of bytes */ +{ + int i, j; /* Looping vars */ + int ch; /* Current ASCII char */ + + + /* + * Show lines of 16 bytes at a time... + */ + + printf(" %s:\n", title); + + for (i = 0; i < bytes; i += 16) + { + /* + * Show the offset... + */ + + printf(" %04x ", i); + + /* + * Then up to 16 bytes in hex... + */ + + for (j = 0; j < 16; j ++) + if ((i + j) < bytes) + printf(" %02x", buffer[i + j]); + else + printf(" "); + + /* + * Then the ASCII representation of the bytes... + */ + + putchar(' '); + putchar(' '); + + for (j = 0; j < 16 && (i + j) < bytes; j ++) + { + ch = buffer[i + j] & 127; + + if (ch < ' ' || ch == 127) + putchar('.'); + else + putchar(ch); + } + + putchar('\n'); + } +} + + +/* + * 'print_attributes()' - Print the attributes in a request... + */ + +void +print_attributes(ipp_t *ipp, /* I - IPP request */ + int indent) /* I - Indentation */ +{ + int i; /* Looping var */ + ipp_tag_t group; /* Current group */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_value_t *val; /* Current value */ + static const char * const tags[] = /* Value/group tag strings */ + { + "reserved-00", + "operation-attributes-tag", + "job-attributes-tag", + "end-of-attributes-tag", + "printer-attributes-tag", + "unsupported-attributes-tag", + "subscription-attributes-tag", + "event-attributes-tag", + "reserved-08", + "reserved-09", + "reserved-0A", + "reserved-0B", + "reserved-0C", + "reserved-0D", + "reserved-0E", + "reserved-0F", + "unsupported", + "default", + "unknown", + "no-value", + "reserved-14", + "not-settable", + "delete-attr", + "admin-define", + "reserved-18", + "reserved-19", + "reserved-1A", + "reserved-1B", + "reserved-1C", + "reserved-1D", + "reserved-1E", + "reserved-1F", + "reserved-20", + "integer", + "boolean", + "enum", + "reserved-24", + "reserved-25", + "reserved-26", + "reserved-27", + "reserved-28", + "reserved-29", + "reserved-2a", + "reserved-2b", + "reserved-2c", + "reserved-2d", + "reserved-2e", + "reserved-2f", + "octetString", + "dateTime", + "resolution", + "rangeOfInteger", + "begCollection", + "textWithLanguage", + "nameWithLanguage", + "endCollection", + "reserved-38", + "reserved-39", + "reserved-3a", + "reserved-3b", + "reserved-3c", + "reserved-3d", + "reserved-3e", + "reserved-3f", + "reserved-40", + "textWithoutLanguage", + "nameWithoutLanguage", + "reserved-43", + "keyword", + "uri", + "uriScheme", + "charset", + "naturalLanguage", + "mimeMediaType", + "memberName" + }; + + + for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) + { + if (!attr->name && indent == 4) + { + group = IPP_TAG_ZERO; + putchar('\n'); + continue; + } + + if (group != attr->group_tag) + { + group = attr->group_tag; + + printf("\n%*s%s:\n\n", indent - 4, "", tags[group]); + } + + printf("%*s%s (", indent, "", attr->name ? attr->name : "(null)"); + if (attr->num_values > 1) + printf("1setOf "); + printf("%s):", tags[attr->value_tag]); + + switch (attr->value_tag) + { + case IPP_TAG_ENUM : + case IPP_TAG_INTEGER : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %d", val->integer); + putchar('\n'); + break; + + case IPP_TAG_BOOLEAN : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %s", val->boolean ? "true" : "false"); + putchar('\n'); + break; + + case IPP_TAG_RANGE : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %d-%d", val->range.lower, val->range.upper); + putchar('\n'); + break; + + case IPP_TAG_DATE : + { + time_t vtime; /* Date/Time value */ + struct tm *vdate; /* Date info */ + char vstring[256]; /* Formatted time */ + + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + { + vtime = ippDateToTime(val->date); + vdate = localtime(&vtime); + strftime(vstring, sizeof(vstring), "%c", vdate); + printf(" (%s)", vstring); + } + } + putchar('\n'); + break; + + case IPP_TAG_RESOLUTION : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %dx%d%s", val->resolution.xres, val->resolution.yres, + val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpc"); + putchar('\n'); + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" \"%s\"", val->string.text); + putchar('\n'); + break; + + case IPP_TAG_BEGIN_COLLECTION : + putchar('\n'); + + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + { + if (i) + putchar('\n'); + print_attributes(val->collection, indent + 4); + } + break; + + default : + printf("UNKNOWN (%d values)\n", attr->num_values); + break; + } + } +} + + +/* + * 'read_cb()' - Read data from a buffer. + */ + +ssize_t /* O - Number of bytes read */ +read_cb(_ippdata_t *data, /* I - Data */ + ipp_uchar_t *buffer, /* O - Buffer to read */ + size_t bytes) /* I - Number of bytes to read */ +{ + size_t count; /* Number of bytes */ + + + /* + * Copy bytes from the data buffer to the read buffer... + */ + + if ((count = data->wsize - data->rpos) > bytes) + count = bytes; + + memcpy(buffer, data->wbuffer + data->rpos, count); + data->rpos += count; + + /* + * Return the number of bytes read... + */ + + return (count); +} + + +/* + * 'write_cb()' - Write data into a buffer. + */ + +ssize_t /* O - Number of bytes written */ +write_cb(_ippdata_t *data, /* I - Data */ + ipp_uchar_t *buffer, /* I - Buffer to write */ + size_t bytes) /* I - Number of bytes to write */ +{ + size_t count; /* Number of bytes */ + + + /* + * Loop until all bytes are written... + */ + + if ((count = data->wsize - data->wused) > bytes) + count = bytes; + + memcpy(data->wbuffer + data->wused, buffer, count); + data->wused += count; + + /* + * Return the number of bytes written... + */ + + return (count); +} + + +/* + * End of "$Id: testipp.c 9999 2011-09-14 00:31:10Z mike $". + */ diff --git a/cups/testlang.c b/cups/testlang.c new file mode 100644 index 0000000..4e80e4f --- /dev/null +++ b/cups/testlang.c @@ -0,0 +1,114 @@ +/* + * "$Id: testlang.c 9042 2010-03-24 00:45:34Z mike $" + * + * Localization test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Load the specified language and show the strings for yes and no. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * 'main()' - Load the specified language and show the strings for yes and no. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int errors = 0; /* Number of errors */ + cups_lang_t *language; /* Message catalog */ + cups_lang_t *language2; /* Message catalog */ + struct lconv *loc; /* Locale data */ + char buffer[1024]; /* String buffer */ + double number; /* Number */ + static const char * const tests[] = /* Test strings */ + { + "1", + "-1", + "3", + "5.125" + }; + + + _cupsSetLocale(argv); + + if (argc == 1) + { + language = cupsLangDefault(); + language2 = cupsLangDefault(); + } + else + { + language = cupsLangGet(argv[1]); + language2 = cupsLangGet(argv[1]); + } + + if (language != language2) + { + errors ++; + + puts("**** ERROR: Language cache did not work! ****"); + puts("First result from cupsLangGet:"); + } + + printf("Language = \"%s\"\n", language->language); + printf("Encoding = \"%s\"\n", _cupsEncodingName(language->encoding)); + printf("No = \"%s\"\n", _cupsLangString(language, "No")); + printf("Yes = \"%s\"\n", _cupsLangString(language, "Yes")); + + if (language != language2) + { + puts("Second result from cupsLangGet:"); + + printf("Language = \"%s\"\n", language2->language); + printf("Encoding = \"%s\"\n", _cupsEncodingName(language2->encoding)); + printf("No = \"%s\"\n", _cupsLangString(language2, "No")); + printf("Yes = \"%s\"\n", _cupsLangString(language2, "Yes")); + } + + loc = localeconv(); + + for (i = 0; i < (int)(sizeof(tests) / sizeof(tests[0])); i ++) + { + number = _cupsStrScand(tests[i], NULL, loc); + + printf("_cupsStrScand(\"%s\") number=%f\n", tests[i], number); + + _cupsStrFormatd(buffer, buffer + sizeof(buffer), number, loc); + + printf("_cupsStrFormatd(%f) buffer=\"%s\"\n", number, buffer); + + if (strcmp(buffer, tests[i])) + { + errors ++; + puts("**** ERROR: Bad formatted number! ****"); + } + } + + return (errors > 0); +} + + +/* + * End of "$Id: testlang.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/testoptions.c b/cups/testoptions.c new file mode 100644 index 0000000..424e00f --- /dev/null +++ b/cups/testoptions.c @@ -0,0 +1,116 @@ +/* + * "$Id: testoptions.c 9042 2010-03-24 00:45:34Z mike $" + * + * Option test program for CUPS. + * + * Copyright 2008-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Test option processing functions. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" + + +/* + * 'main()' - Test option processing functions. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int status = 0, /* Exit status */ + num_options; /* Number of options */ + cups_option_t *options; /* Options */ + const char *value; /* Value of an option */ + + + if (argc == 1) + { + /* + * cupsParseOptions() + */ + + fputs("cupsParseOptions: ", stdout); + + num_options = cupsParseOptions("foo=1234 " + "bar=\"One Fish\",\"Two Fish\",\"Red Fish\"," + "\"Blue Fish\" " + "baz={param1=1 param2=2} " + "foobar=FOO\\ BAR " + "barfoo=barfoo " + "barfoo=\"\'BAR FOO\'\"", 0, &options); + + if (num_options != 5) + { + printf("FAIL (num_options=%d, expected 5)\n", num_options); + status ++; + } + else if ((value = cupsGetOption("foo", num_options, options)) == NULL || + strcmp(value, "1234")) + { + printf("FAIL (foo=\"%s\", expected \"1234\")\n", value); + status ++; + } + else if ((value = cupsGetOption("bar", num_options, options)) == NULL || + strcmp(value, "One Fish,Two Fish,Red Fish,Blue Fish")) + { + printf("FAIL (bar=\"%s\", expected \"One Fish,Two Fish,Red Fish,Blue " + "Fish\")\n", value); + status ++; + } + else if ((value = cupsGetOption("baz", num_options, options)) == NULL || + strcmp(value, "{param1=1 param2=2}")) + { + printf("FAIL (baz=\"%s\", expected \"{param1=1 param2=2}\")\n", value); + status ++; + } + else if ((value = cupsGetOption("foobar", num_options, options)) == NULL || + strcmp(value, "FOO BAR")) + { + printf("FAIL (foobar=\"%s\", expected \"FOO BAR\")\n", value); + status ++; + } + else if ((value = cupsGetOption("barfoo", num_options, options)) == NULL || + strcmp(value, "\'BAR FOO\'")) + { + printf("FAIL (barfoo=\"%s\", expected \"\'BAR FOO\'\")\n", value); + status ++; + } + else + puts("PASS"); + } + else + { + int i; /* Looping var */ + cups_option_t *option; /* Current option */ + + + num_options = cupsParseOptions(argv[1], 0, &options); + + for (i = 0, option = options; i < num_options; i ++, option ++) + printf("options[%d].name=\"%s\", value=\"%s\"\n", i, option->name, + option->value); + } + + exit (status); +} + + +/* + * End of "$Id: testoptions.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/cups/testppd.c b/cups/testppd.c new file mode 100644 index 0000000..8c23664 --- /dev/null +++ b/cups/testppd.c @@ -0,0 +1,1082 @@ +/* + * "$Id: testppd.c 9793 2011-05-20 03:49:49Z mike $" + * + * PPD test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#ifdef WIN32 +# include +#else +# include +# include +#endif /* WIN32 */ + + +/* + * Test data... + */ + +static const char *default_code = + "[{\n" + "%%BeginFeature: *InstalledDuplexer False\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *PageRegion Letter\n" + "PageRegion=Letter\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *InputSlot Tray\n" + "InputSlot=Tray\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *MediaType Plain\n" + "MediaType=Plain\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *IntOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *StringOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n"; + +static const char *custom_code = + "[{\n" + "%%BeginFeature: *InstalledDuplexer False\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *InputSlot Tray\n" + "InputSlot=Tray\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *MediaType Plain\n" + "MediaType=Plain\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *IntOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *CustomStringOption True\n" + "(value\\0502\\051)\n" + "(value 1)\n" + "StringOption=Custom\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *CustomPageSize True\n" + "400\n" + "500\n" + "0\n" + "0\n" + "0\n" + "PageSize=Custom\n" + "%%EndFeature\n" + "} stopped cleartomark\n"; + +static const char *default2_code = + "[{\n" + "%%BeginFeature: *InstalledDuplexer False\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *InputSlot Tray\n" + "InputSlot=Tray\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *Quality Normal\n" + "Quality=Normal\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *IntOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n" + "[{\n" + "%%BeginFeature: *StringOption None\n" + "%%EndFeature\n" + "} stopped cleartomark\n"; + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + ppd_file_t *ppd; /* PPD file loaded from disk */ + int status; /* Status of tests (0 = success, 1 = fail) */ + int conflicts; /* Number of conflicts */ + char *s; /* String */ + char buffer[8192]; /* String buffer */ + const char *text, /* Localized text */ + *val; /* Option value */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + ppd_size_t minsize, /* Minimum size */ + maxsize, /* Maximum size */ + *size; /* Current size */ + ppd_attr_t *attr; /* Current attribute */ + + + status = 0; + + if (argc == 1) + { + /* + * Setup directories for locale stuff... + */ + + if (access("locale", 0)) + { + mkdir("locale", 0777); + mkdir("locale/fr", 0777); + symlink("../../../locale/cups_fr.po", "locale/fr/cups_fr.po"); + mkdir("locale/zh_TW", 0777); + symlink("../../../locale/cups_zh_TW.po", "locale/zh_TW/cups_zh_TW.po"); + } + + putenv("LOCALEDIR=locale"); + putenv("SOFTWARE=CUPS"); + + /* + * Do tests with test.ppd... + */ + + fputs("ppdOpenFile(test.ppd): ", stdout); + + if ((ppd = ppdOpenFile("test.ppd")) != NULL) + puts("PASS"); + else + { + ppd_status_t err; /* Last error in file */ + int line; /* Line number in file */ + + + status ++; + err = ppdLastError(&line); + + printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); + } + + fputs("ppdFindAttr(wildcard): ", stdout); + if ((attr = ppdFindAttr(ppd, "cupsTest", NULL)) == NULL) + { + status ++; + puts("FAIL (not found)"); + } + else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo")) + { + status ++; + printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); + } + else + puts("PASS"); + + fputs("ppdFindNextAttr(wildcard): ", stdout); + if ((attr = ppdFindNextAttr(ppd, "cupsTest", NULL)) == NULL) + { + status ++; + puts("FAIL (not found)"); + } + else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Bar")) + { + status ++; + printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); + } + else + puts("PASS"); + + fputs("ppdFindAttr(Foo): ", stdout); + if ((attr = ppdFindAttr(ppd, "cupsTest", "Foo")) == NULL) + { + status ++; + puts("FAIL (not found)"); + } + else if (strcmp(attr->name, "cupsTest") || strcmp(attr->spec, "Foo")) + { + status ++; + printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); + } + else + puts("PASS"); + + fputs("ppdFindNextAttr(Foo): ", stdout); + if ((attr = ppdFindNextAttr(ppd, "cupsTest", "Foo")) != NULL) + { + status ++; + printf("FAIL (got \"%s %s\")\n", attr->name, attr->spec); + } + else + puts("PASS"); + + fputs("ppdMarkDefaults: ", stdout); + ppdMarkDefaults(ppd); + + if ((conflicts = ppdConflicts(ppd)) == 0) + puts("PASS"); + else + { + status ++; + printf("FAIL (%d conflicts)\n", conflicts); + } + + fputs("ppdEmitString (defaults): ", stdout); + if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && + !strcmp(s, default_code)) + puts("PASS"); + else + { + status ++; + printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, + (int)strlen(default_code)); + + if (s) + puts(s); + } + + if (s) + free(s); + + fputs("ppdEmitString (custom size and string): ", stdout); + ppdMarkOption(ppd, "PageSize", "Custom.400x500"); + ppdMarkOption(ppd, "StringOption", "{String1=\"value 1\" String2=value(2)}"); + + if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && + !strcmp(s, custom_code)) + puts("PASS"); + else + { + status ++; + printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, + (int)strlen(custom_code)); + + if (s) + puts(s); + } + + if (s) + free(s); + + /* + * Test constraints... + */ + + fputs("cupsGetConflicts(InputSlot=Envelope): ", stdout); + ppdMarkOption(ppd, "PageSize", "Letter"); + + num_options = cupsGetConflicts(ppd, "InputSlot", "Envelope", &options); + if (num_options != 2 || + (val = cupsGetOption("PageRegion", num_options, options)) == NULL || + _cups_strcasecmp(val, "Letter") || + (val = cupsGetOption("PageSize", num_options, options)) == NULL || + _cups_strcasecmp(val, "Letter")) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + status ++; + } + else + puts("PASS"); + + fputs("ppdConflicts(): ", stdout); + ppdMarkOption(ppd, "InputSlot", "Envelope"); + + if ((conflicts = ppdConflicts(ppd)) == 2) + puts("PASS (2)"); + else + { + printf("FAIL (%d)\n", conflicts); + status ++; + } + + fputs("cupsResolveConflicts(InputSlot=Envelope): ", stdout); + num_options = 0; + options = NULL; + if (!cupsResolveConflicts(ppd, "InputSlot", "Envelope", &num_options, + &options)) + { + puts("FAIL (Unable to resolve)"); + status ++; + } + else if (num_options != 2 || + !cupsGetOption("PageSize", num_options, options)) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + status ++; + } + else + puts("PASS (Resolved by changing PageSize)"); + + cupsFreeOptions(num_options, options); + + fputs("cupsResolveConflicts(No option/choice): ", stdout); + num_options = 0; + options = NULL; + if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) && + num_options == 1 && !_cups_strcasecmp(options[0].name, "InputSlot") && + !_cups_strcasecmp(options[0].value, "Tray")) + puts("PASS (Resolved by changing InputSlot)"); + else if (num_options > 0) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + status ++; + } + else + { + puts("FAIL (Unable to resolve)"); + status ++; + } + cupsFreeOptions(num_options, options); + + fputs("ppdInstallableConflict(): ", stdout); + if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") && + !ppdInstallableConflict(ppd, "Duplex", "None")) + puts("PASS"); + else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble")) + { + puts("FAIL (Duplex=DuplexNoTumble did not conflict)"); + status ++; + } + else + { + puts("FAIL (Duplex=None conflicted)"); + status ++; + } + + /* + * ppdPageSizeLimits + */ + + fputs("ppdPageSizeLimits: ", stdout); + if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) + { + if (minsize.width != 36 || minsize.length != 36 || + maxsize.width != 1080 || maxsize.length != 86400) + { + printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " + "expected min=36x36, max=1080x86400)\n", minsize.width, + minsize.length, maxsize.width, maxsize.length); + status ++; + } + else + puts("PASS"); + } + else + { + puts("FAIL (returned 0)"); + status ++; + } + + /* + * cupsMarkOptions with PWG and IPP size names. + */ + + fputs("cupsMarkOptions(media=iso-a4): ", stdout); + num_options = cupsAddOption("media", "iso-a4", 0, &options); + cupsMarkOptions(ppd, num_options, options); + cupsFreeOptions(num_options, options); + + size = ppdPageSize(ppd, NULL); + if (!size || strcmp(size->name, "A4")) + { + printf("FAIL (%s)\n", size ? size->name : "unknown"); + status ++; + } + else + puts("PASS"); + + fputs("cupsMarkOptions(media=na_letter_8.5x11in): ", stdout); + num_options = cupsAddOption("media", "na_letter_8.5x11in", 0, &options); + cupsMarkOptions(ppd, num_options, options); + cupsFreeOptions(num_options, options); + + size = ppdPageSize(ppd, NULL); + if (!size || strcmp(size->name, "Letter")) + { + printf("FAIL (%s)\n", size ? size->name : "unknown"); + status ++; + } + else + puts("PASS"); + + fputs("cupsMarkOptions(media=oe_letter-fullbleed_8.5x11in): ", stdout); + num_options = cupsAddOption("media", "oe_letter-fullbleed_8.5x11in", 0, + &options); + cupsMarkOptions(ppd, num_options, options); + cupsFreeOptions(num_options, options); + + size = ppdPageSize(ppd, NULL); + if (!size || strcmp(size->name, "Letter.Fullbleed")) + { + printf("FAIL (%s)\n", size ? size->name : "unknown"); + status ++; + } + else + puts("PASS"); + + fputs("cupsMarkOptions(media=A4): ", stdout); + num_options = cupsAddOption("media", "A4", 0, &options); + cupsMarkOptions(ppd, num_options, options); + cupsFreeOptions(num_options, options); + + size = ppdPageSize(ppd, NULL); + if (!size || strcmp(size->name, "A4")) + { + printf("FAIL (%s)\n", size ? size->name : "unknown"); + status ++; + } + else + puts("PASS"); + + /* + * Test localization... + */ + + fputs("ppdLocalizeIPPReason(text): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && + !strcmp(buffer, "Foo Reason")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"Foo Reason\")\n", buffer); + } + + fputs("ppdLocalizeIPPReason(http): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", "http", buffer, sizeof(buffer)) && + !strcmp(buffer, "http://foo/bar.html")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"http://foo/bar.html\")\n", buffer); + } + + fputs("ppdLocalizeIPPReason(help): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", "help", buffer, sizeof(buffer)) && + !strcmp(buffer, "help:anchor='foo'%20bookID=Vendor%20Help")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"help:anchor='foo'%%20bookID=Vendor%%20Help\")\n", buffer); + } + + fputs("ppdLocalizeIPPReason(file): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", "file", buffer, sizeof(buffer)) && + !strcmp(buffer, "/help/foo/bar.html")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"/help/foo/bar.html\")\n", buffer); + } + + putenv("LANG=fr"); + putenv("LC_ALL=fr"); + putenv("LC_CTYPE=fr"); + putenv("LC_MESSAGES=fr"); + + fputs("ppdLocalizeIPPReason(fr text): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && + !strcmp(buffer, "La Long Foo Reason")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"La Long Foo Reason\")\n", buffer); + } + + putenv("LANG=zh_TW"); + putenv("LC_ALL=zh_TW"); + putenv("LC_CTYPE=zh_TW"); + putenv("LC_MESSAGES=zh_TW"); + + fputs("ppdLocalizeIPPReason(zh_TW text): ", stdout); + if (ppdLocalizeIPPReason(ppd, "foo", NULL, buffer, sizeof(buffer)) && + !strcmp(buffer, "Number 1 Foo Reason")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"Number 1 Foo Reason\")\n", buffer); + } + + /* + * cupsMarkerName localization... + */ + + putenv("LANG=en"); + putenv("LC_ALL=en"); + putenv("LC_CTYPE=en"); + putenv("LC_MESSAGES=en"); + + fputs("ppdLocalizeMarkerName(bogus): ", stdout); + + if ((text = ppdLocalizeMarkerName(ppd, "bogus")) != NULL) + { + status ++; + printf("FAIL (\"%s\" instead of NULL)\n", text); + } + else + puts("PASS"); + + fputs("ppdLocalizeMarkerName(cyan): ", stdout); + + if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && + !strcmp(text, "Cyan Toner")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"Cyan Toner\")\n", + text ? text : "(null)"); + } + + putenv("LANG=fr"); + putenv("LC_ALL=fr"); + putenv("LC_CTYPE=fr"); + putenv("LC_MESSAGES=fr"); + + fputs("ppdLocalizeMarkerName(fr cyan): ", stdout); + if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && + !strcmp(text, "La Toner Cyan")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"La Toner Cyan\")\n", + text ? text : "(null)"); + } + + putenv("LANG=zh_TW"); + putenv("LC_ALL=zh_TW"); + putenv("LC_CTYPE=zh_TW"); + putenv("LC_MESSAGES=zh_TW"); + + fputs("ppdLocalizeMarkerName(zh_TW cyan): ", stdout); + if ((text = ppdLocalizeMarkerName(ppd, "cyan")) != NULL && + !strcmp(text, "Number 1 Cyan Toner")) + puts("PASS"); + else + { + status ++; + printf("FAIL (\"%s\" instead of \"Number 1 Cyan Toner\")\n", + text ? text : "(null)"); + } + + ppdClose(ppd); + + /* + * Test new constraints... + */ + + fputs("ppdOpenFile(test2.ppd): ", stdout); + + if ((ppd = ppdOpenFile("test2.ppd")) != NULL) + puts("PASS"); + else + { + ppd_status_t err; /* Last error in file */ + int line; /* Line number in file */ + + + status ++; + err = ppdLastError(&line); + + printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); + } + + fputs("ppdMarkDefaults: ", stdout); + ppdMarkDefaults(ppd); + + if ((conflicts = ppdConflicts(ppd)) == 0) + puts("PASS"); + else + { + status ++; + printf("FAIL (%d conflicts)\n", conflicts); + } + + fputs("ppdEmitString (defaults): ", stdout); + if ((s = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL && + !strcmp(s, default2_code)) + puts("PASS"); + else + { + status ++; + printf("FAIL (%d bytes instead of %d)\n", s ? (int)strlen(s) : 0, + (int)strlen(default2_code)); + + if (s) + puts(s); + } + + if (s) + free(s); + + fputs("ppdConflicts(): ", stdout); + ppdMarkOption(ppd, "PageSize", "Env10"); + ppdMarkOption(ppd, "InputSlot", "Envelope"); + ppdMarkOption(ppd, "Quality", "Photo"); + + if ((conflicts = ppdConflicts(ppd)) == 1) + puts("PASS (1)"); + else + { + printf("FAIL (%d)\n", conflicts); + status ++; + } + + fputs("cupsResolveConflicts(Quality=Photo): ", stdout); + num_options = 0; + options = NULL; + if (cupsResolveConflicts(ppd, "Quality", "Photo", &num_options, + &options)) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + status ++; + } + else + puts("PASS (Unable to resolve)"); + cupsFreeOptions(num_options, options); + + fputs("cupsResolveConflicts(No option/choice): ", stdout); + num_options = 0; + options = NULL; + if (cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options) && + num_options == 1 && !_cups_strcasecmp(options->name, "Quality") && + !_cups_strcasecmp(options->value, "Normal")) + puts("PASS"); + else if (num_options > 0) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + status ++; + } + else + { + puts("FAIL (Unable to resolve!)"); + status ++; + } + cupsFreeOptions(num_options, options); + + fputs("cupsResolveConflicts(loop test): ", stdout); + ppdMarkOption(ppd, "PageSize", "A4"); + ppdMarkOption(ppd, "InputSlot", "Tray"); + ppdMarkOption(ppd, "Quality", "Photo"); + num_options = 0; + options = NULL; + if (!cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options)) + puts("PASS"); + else if (num_options > 0) + { + printf("FAIL (%d options:", num_options); + for (i = 0; i < num_options; i ++) + printf(" %s=%s", options[i].name, options[i].value); + puts(")"); + } + else + puts("FAIL (No conflicts!)"); + + fputs("ppdInstallableConflict(): ", stdout); + if (ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble") && + !ppdInstallableConflict(ppd, "Duplex", "None")) + puts("PASS"); + else if (!ppdInstallableConflict(ppd, "Duplex", "DuplexNoTumble")) + { + puts("FAIL (Duplex=DuplexNoTumble did not conflict)"); + status ++; + } + else + { + puts("FAIL (Duplex=None conflicted)"); + status ++; + } + + /* + * ppdPageSizeLimits + */ + + ppdMarkDefaults(ppd); + + fputs("ppdPageSizeLimits(default): ", stdout); + if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) + { + if (minsize.width != 36 || minsize.length != 36 || + maxsize.width != 1080 || maxsize.length != 86400) + { + printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " + "expected min=36x36, max=1080x86400)\n", minsize.width, + minsize.length, maxsize.width, maxsize.length); + status ++; + } + else + puts("PASS"); + } + else + { + puts("FAIL (returned 0)"); + status ++; + } + + ppdMarkOption(ppd, "InputSlot", "Manual"); + + fputs("ppdPageSizeLimits(InputSlot=Manual): ", stdout); + if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) + { + if (minsize.width != 100 || minsize.length != 100 || + maxsize.width != 1000 || maxsize.length != 1000) + { + printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " + "expected min=100x100, max=1000x1000)\n", minsize.width, + minsize.length, maxsize.width, maxsize.length); + status ++; + } + else + puts("PASS"); + } + else + { + puts("FAIL (returned 0)"); + status ++; + } + + ppdMarkOption(ppd, "Quality", "Photo"); + + fputs("ppdPageSizeLimits(Quality=Photo): ", stdout); + if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) + { + if (minsize.width != 200 || minsize.length != 200 || + maxsize.width != 1000 || maxsize.length != 1000) + { + printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " + "expected min=200x200, max=1000x1000)\n", minsize.width, + minsize.length, maxsize.width, maxsize.length); + status ++; + } + else + puts("PASS"); + } + else + { + puts("FAIL (returned 0)"); + status ++; + } + + ppdMarkOption(ppd, "InputSlot", "Tray"); + + fputs("ppdPageSizeLimits(Quality=Photo): ", stdout); + if (ppdPageSizeLimits(ppd, &minsize, &maxsize)) + { + if (minsize.width != 300 || minsize.length != 300 || + maxsize.width != 1080 || maxsize.length != 86400) + { + printf("FAIL (got min=%.0fx%.0f, max=%.0fx%.0f, " + "expected min=300x300, max=1080x86400)\n", minsize.width, + minsize.length, maxsize.width, maxsize.length); + status ++; + } + else + puts("PASS"); + } + else + { + puts("FAIL (returned 0)"); + status ++; + } + } + else + { + const char *filename; /* PPD filename */ + struct stat fileinfo; /* File information */ + + + if (!strncmp(argv[1], "-d", 2)) + { + const char *printer; /* Printer name */ + + if (argv[1][2]) + printer = argv[1] + 2; + else if (argv[2]) + printer = argv[2]; + else + { + puts("Usage: ./testppd -d printer"); + return (1); + } + + filename = cupsGetPPD(printer); + + if (!filename) + { + printf("%s: %s\n", printer, cupsLastErrorString()); + return (1); + } + } + else + filename = argv[1]; + + if (lstat(filename, &fileinfo)) + { + printf("%s: %s\n", filename, strerror(errno)); + return (1); + } + + if (S_ISLNK(fileinfo.st_mode)) + { + char realfile[1024]; /* Real file path */ + ssize_t realsize; /* Size of real file path */ + + + if ((realsize = readlink(filename, realfile, sizeof(realfile) - 1)) < 0) + strcpy(realfile, "Unknown"); + else + realfile[realsize] = '\0'; + + if (stat(realfile, &fileinfo)) + printf("%s: symlink to \"%s\", %s\n", filename, realfile, + strerror(errno)); + else + printf("%s: symlink to \"%s\", %ld bytes\n", filename, realfile, + (long)fileinfo.st_size); + } + else + printf("%s: regular file, %ld bytes\n", filename, (long)fileinfo.st_size); + + if ((ppd = ppdOpenFile(filename)) == NULL) + { + ppd_status_t err; /* Last error in file */ + int line; /* Line number in file */ + + + status ++; + err = ppdLastError(&line); + + printf("%s: %s on line %d\n", argv[1], ppdErrorString(err), line); + } + else + { + int j, k; /* Looping vars */ + ppd_group_t *group; /* Option group */ + ppd_option_t *option; /* Option */ + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + ppd_const_t *c; /* UIConstraints */ + char lang[255], /* LANG environment variable */ + lc_all[255], /* LC_ALL environment variable */ + lc_ctype[255], /* LC_CTYPE environment variable */ + lc_messages[255];/* LC_MESSAGES environment variable */ + + + if (argc > 2) + { + snprintf(lang, sizeof(lang), "LANG=%s", argv[2]); + putenv(lang); + snprintf(lc_all, sizeof(lc_all), "LC_ALL=%s", argv[2]); + putenv(lc_all); + snprintf(lc_ctype, sizeof(lc_ctype), "LC_CTYPE=%s", argv[2]); + putenv(lc_ctype); + snprintf(lc_messages, sizeof(lc_messages), "LC_MESSAGES=%s", argv[2]); + putenv(lc_messages); + } + + ppdLocalize(ppd); + ppdMarkDefaults(ppd); + + if (argc > 3) + { + text = ppdLocalizeIPPReason(ppd, argv[3], NULL, buffer, sizeof(buffer)); + printf("ppdLocalizeIPPReason(%s)=%s\n", argv[3], + text ? text : "(null)"); + return (text == NULL); + } + + for (i = ppd->num_groups, group = ppd->groups; + i > 0; + i --, group ++) + { + printf("%s (%s):\n", group->name, group->text); + + for (j = group->num_options, option = group->options; + j > 0; + j --, option ++) + { + printf(" %s (%s):\n", option->keyword, option->text); + + for (k = 0; k < option->num_choices; k ++) + printf(" - %s%s (%s)\n", + option->choices[k].marked ? "*" : "", + option->choices[k].choice, option->choices[k].text); + + if ((coption = ppdFindCustomOption(ppd, option->keyword)) != NULL) + { + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + switch (cparam->type) + { + case PPD_CUSTOM_CURVE : + printf(" %s(%s): PPD_CUSTOM_CURVE (%g to %g)\n", + cparam->name, cparam->text, + cparam->minimum.custom_curve, + cparam->maximum.custom_curve); + break; + + case PPD_CUSTOM_INT : + printf(" %s(%s): PPD_CUSTOM_INT (%d to %d)\n", + cparam->name, cparam->text, + cparam->minimum.custom_int, + cparam->maximum.custom_int); + break; + + case PPD_CUSTOM_INVCURVE : + printf(" %s(%s): PPD_CUSTOM_INVCURVE (%g to %g)\n", + cparam->name, cparam->text, + cparam->minimum.custom_invcurve, + cparam->maximum.custom_invcurve); + break; + + case PPD_CUSTOM_PASSCODE : + printf(" %s(%s): PPD_CUSTOM_PASSCODE (%d to %d)\n", + cparam->name, cparam->text, + cparam->minimum.custom_passcode, + cparam->maximum.custom_passcode); + break; + + case PPD_CUSTOM_PASSWORD : + printf(" %s(%s): PPD_CUSTOM_PASSWORD (%d to %d)\n", + cparam->name, cparam->text, + cparam->minimum.custom_password, + cparam->maximum.custom_password); + break; + + case PPD_CUSTOM_POINTS : + printf(" %s(%s): PPD_CUSTOM_POINTS (%g to %g)\n", + cparam->name, cparam->text, + cparam->minimum.custom_points, + cparam->maximum.custom_points); + break; + + case PPD_CUSTOM_REAL : + printf(" %s(%s): PPD_CUSTOM_REAL (%g to %g)\n", + cparam->name, cparam->text, + cparam->minimum.custom_real, + cparam->maximum.custom_real); + break; + + case PPD_CUSTOM_STRING : + printf(" %s(%s): PPD_CUSTOM_STRING (%d to %d)\n", + cparam->name, cparam->text, + cparam->minimum.custom_string, + cparam->maximum.custom_string); + break; + } + } + } + } + } + + puts("\nSizes:"); + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + printf(" %s = %gx%g, [%g %g %g %g]\n", size->name, size->width, + size->length, size->left, size->bottom, size->right, size->top); + + puts("\nConstraints:"); + + for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++) + printf(" *UIConstraints: *%s %s *%s %s\n", c->option1, c->choice1, + c->option2, c->choice2); + if (ppd->num_consts == 0) + puts(" NO CONSTRAINTS"); + + puts("\nFilters:"); + + for (i = 0; i < ppd->num_filters; i ++) + printf(" %s\n", ppd->filters[i]); + + if (ppd->num_filters == 0) + puts(" NO FILTERS"); + + puts("\nAttributes:"); + + for (attr = (ppd_attr_t *)cupsArrayFirst(ppd->sorted_attrs); + attr; + attr = (ppd_attr_t *)cupsArrayNext(ppd->sorted_attrs)) + printf(" *%s %s/%s: \"%s\"\n", attr->name, attr->spec, + attr->text, attr->value ? attr->value : ""); + } + + if (!strncmp(argv[1], "-d", 2)) + unlink(filename); + } + +#ifdef __APPLE__ + if (getenv("MallocStackLogging") && getenv("MallocStackLoggingNoCompact")) + { + char command[1024]; /* malloc_history command */ + + snprintf(command, sizeof(command), "malloc_history %d -all_by_size", + getpid()); + fflush(stdout); + system(command); + } +#endif /* __APPLE__ */ + + ppdClose(ppd); + + return (status); +} + + +/* + * End of "$Id: testppd.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/testpwg.c b/cups/testpwg.c new file mode 100644 index 0000000..b372306 --- /dev/null +++ b/cups/testpwg.c @@ -0,0 +1,497 @@ +/* + * "$Id: testpwg.c 9793 2011-05-20 03:49:49Z mike $" + * + * PWG test program for CUPS. + * + * Copyright 2009-2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * test_pagesize() - Test the PWG mapping functions. + * test_ppd_cache() - Test the PPD cache functions. + */ + +/* + * Include necessary headers... + */ + +#include "ppd-private.h" +#include "file-private.h" + + +/* + * Local functions... + */ + +static int test_pagesize(_ppd_cache_t *pc, ppd_file_t *ppd, + const char *ppdsize); +static int test_ppd_cache(_ppd_cache_t *pc, ppd_file_t *ppd); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int status; /* Status of tests (0 = success, 1 = fail) */ + const char *ppdfile; /* PPD filename */ + ppd_file_t *ppd; /* PPD file */ + _ppd_cache_t *pc; /* PPD cache and PWG mapping data */ + _pwg_media_t *pwgmedia; /* PWG media size */ + + + status = 0; + + if (argc < 2 || argc > 3) + { + puts("Usage: ./testpwg filename.ppd [jobfile]"); + return (1); + } + + ppdfile = argv[1]; + + printf("ppdOpenFile(%s): ", ppdfile); + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + ppd_status_t err; /* Last error in file */ + int line; /* Line number in file */ + + + err = ppdLastError(&line); + + printf("FAIL (%s on line %d)\n", ppdErrorString(err), line); + + return (1); + } + else + puts("PASS"); + + fputs("_ppdCacheCreateWithPPD(ppd): ", stdout); + if ((pc = _ppdCacheCreateWithPPD(ppd)) == NULL) + { + puts("FAIL"); + status ++; + } + else + { + puts("PASS"); + status += test_ppd_cache(pc, ppd); + + if (argc == 3) + { + /* + * Test PageSize mapping code. + */ + + int fd; /* Job file descriptor */ + const char *pagesize; /* PageSize value */ + ipp_t *job; /* Job attributes */ + ipp_attribute_t *media; /* Media attribute */ + + if ((fd = open(argv[2], O_RDONLY)) >= 0) + { + job = ippNew(); + ippReadFile(fd, job); + close(fd); + + if ((media = ippFindAttribute(job, "media", IPP_TAG_ZERO)) != NULL && + media->value_tag != IPP_TAG_NAME && + media->value_tag != IPP_TAG_KEYWORD) + media = NULL; + + if (media) + printf("_ppdCacheGetPageSize(media=%s): ", + media->values[0].string.text); + else + fputs("_ppdCacheGetPageSize(media-col): ", stdout); + + fflush(stdout); + + if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL) + { + puts("FAIL (Not Found)"); + status = 1; + } + else if (media && _cups_strcasecmp(pagesize, media->values[0].string.text)) + { + printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, + media->values[0].string.text); + status = 1; + } + else + printf("PASS (%s)\n", pagesize); + + ippDelete(job); + } + else + { + perror(argv[2]); + status = 1; + } + } + + /* + * _ppdCacheDestroy should never fail... + */ + + fputs("_ppdCacheDestroy(pc): ", stdout); + _ppdCacheDestroy(pc); + puts("PASS"); + } + + fputs("_pwgMediaForPWG(\"iso_a4_210x297mm\"): ", stdout); + if ((pwgmedia = _pwgMediaForPWG("iso_a4_210x297mm")) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "iso_a4_210x297mm")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else if (pwgmedia->width != 21000 || pwgmedia->length != 29700) + { + printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); + status ++; + } + else + puts("PASS"); + + fputs("_pwgMediaForLegacy(\"na-letter\"): ", stdout); + if ((pwgmedia = _pwgMediaForLegacy("na-letter")) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "na_letter_8.5x11in")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else if (pwgmedia->width != 21590 || pwgmedia->length != 27940) + { + printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); + status ++; + } + else + puts("PASS"); + + fputs("_pwgMediaForPPD(\"4x6\"): ", stdout); + if ((pwgmedia = _pwgMediaForPPD("4x6")) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "na_index-4x6_4x6in")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else if (pwgmedia->width != 10160 || pwgmedia->length != 15240) + { + printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); + status ++; + } + else + puts("PASS"); + + fputs("_pwgMediaForPPD(\"10x15cm\"): ", stdout); + if ((pwgmedia = _pwgMediaForPPD("10x15cm")) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "om_100x150mm_100x150mm")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else if (pwgmedia->width != 10000 || pwgmedia->length != 15000) + { + printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); + status ++; + } + else + puts("PASS"); + + fputs("_pwgMediaForPPD(\"Custom.10x15cm\"): ", stdout); + if ((pwgmedia = _pwgMediaForPPD("Custom.10x15cm")) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "custom_10x15cm_100x150mm")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else if (pwgmedia->width != 10000 || pwgmedia->length != 15000) + { + printf("FAIL (%dx%d)\n", pwgmedia->width, pwgmedia->length); + status ++; + } + else + puts("PASS"); + + fputs("_pwgMediaForSize(29700, 42000): ", stdout); + if ((pwgmedia = _pwgMediaForSize(29700, 42000)) == NULL) + { + puts("FAIL (not found)"); + status ++; + } + else if (strcmp(pwgmedia->pwg, "iso_a3_297x420mm")) + { + printf("FAIL (%s)\n", pwgmedia->pwg); + status ++; + } + else + puts("PASS"); + + return (status); +} + + +/* + * 'test_pagesize()' - Test the PWG mapping functions. + */ + +static int /* O - 1 on failure, 0 on success */ +test_pagesize(_ppd_cache_t *pc, /* I - PWG mapping data */ + ppd_file_t *ppd, /* I - PPD file */ + const char *ppdsize) /* I - PPD page size */ +{ + int status = 0; /* Return status */ + ipp_t *job; /* Job attributes */ + const char *pagesize; /* PageSize value */ + + + if (ppdPageSize(ppd, ppdsize)) + { + printf("_ppdCacheGetPageSize(keyword=%s): ", ppdsize); + fflush(stdout); + + if ((pagesize = _ppdCacheGetPageSize(pc, NULL, ppdsize, NULL)) == NULL) + { + puts("FAIL (Not Found)"); + status = 1; + } + else if (_cups_strcasecmp(pagesize, ppdsize)) + { + printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize); + status = 1; + } + else + puts("PASS"); + + job = ippNew(); + ippAddString(job, IPP_TAG_JOB, IPP_TAG_KEYWORD, "media", NULL, ppdsize); + + printf("_ppdCacheGetPageSize(media=%s): ", ppdsize); + fflush(stdout); + + if ((pagesize = _ppdCacheGetPageSize(pc, job, NULL, NULL)) == NULL) + { + puts("FAIL (Not Found)"); + status = 1; + } + else if (_cups_strcasecmp(pagesize, ppdsize)) + { + printf("FAIL (Got \"%s\", Expected \"%s\")\n", pagesize, ppdsize); + status = 1; + } + else + puts("PASS"); + + ippDelete(job); + } + + return (status); +} + + +/* + * 'test_ppd_cache()' - Test the PPD cache functions. + */ + +static int /* O - 1 on failure, 0 on success */ +test_ppd_cache(_ppd_cache_t *pc, /* I - PWG mapping data */ + ppd_file_t *ppd) /* I - PPD file */ +{ + int i, /* Looping var */ + status = 0; /* Return status */ + _ppd_cache_t *pc2; /* Loaded data */ + _pwg_size_t *size, /* Size from original */ + *size2; /* Size from saved */ + _pwg_map_t *map, /* Map from original */ + *map2; /* Map from saved */ + + + /* + * Verify that we can write and read back the same data... + */ + + fputs("_ppdCacheWriteFile(test.pwg): ", stdout); + if (!_ppdCacheWriteFile(pc, "test.pwg", NULL)) + { + puts("FAIL"); + status ++; + } + else + puts("PASS"); + + fputs("_ppdCacheCreateWithFile(test.pwg): ", stdout); + if ((pc2 = _ppdCacheCreateWithFile("test.pwg", NULL)) == NULL) + { + puts("FAIL"); + status ++; + } + else + { + // TODO: FINISH ADDING ALL VALUES IN STRUCTURE + if (pc2->num_sizes != pc->num_sizes) + { + if (!status) + puts("FAIL"); + + printf(" SAVED num_sizes=%d, ORIG num_sizes=%d\n", pc2->num_sizes, + pc->num_sizes); + + status ++; + } + else + { + for (i = pc->num_sizes, size = pc->sizes, size2 = pc2->sizes; + i > 0; + i --, size ++, size2 ++) + { + if (strcmp(size2->map.pwg, size->map.pwg) || + strcmp(size2->map.ppd, size->map.ppd) || + size2->width != size->width || + size2->length != size->length || + size2->left != size->left || + size2->bottom != size->bottom || + size2->right != size->right || + size2->top != size->top) + { + if (!status) + puts("FAIL"); + + if (strcmp(size->map.pwg, size2->map.pwg)) + printf(" SAVED size->map.pwg=\"%s\", ORIG " + "size->map.pwg=\"%s\"\n", size2->map.pwg, size->map.pwg); + + if (strcmp(size2->map.ppd, size->map.ppd)) + printf(" SAVED size->map.ppd=\"%s\", ORIG " + "size->map.ppd=\"%s\"\n", size2->map.ppd, size->map.ppd); + + if (size2->width != size->width) + printf(" SAVED size->width=%d, ORIG size->width=%d\n", + size2->width, size->width); + + if (size2->length != size->length) + printf(" SAVED size->length=%d, ORIG size->length=%d\n", + size2->length, size->length); + + if (size2->left != size->left) + printf(" SAVED size->left=%d, ORIG size->left=%d\n", + size2->left, size->left); + + if (size2->bottom != size->bottom) + printf(" SAVED size->bottom=%d, ORIG size->bottom=%d\n", + size2->bottom, size->bottom); + + if (size2->right != size->right) + printf(" SAVED size->right=%d, ORIG size->right=%d\n", + size2->right, size->right); + + if (size2->top != size->top) + printf(" SAVED size->top=%d, ORIG size->top=%d\n", + size2->top, size->top); + + status ++; + break; + } + } + + for (i = pc->num_sources, map = pc->sources, map2 = pc2->sources; + i > 0; + i --, map ++, map2 ++) + { + if (strcmp(map2->pwg, map->pwg) || + strcmp(map2->ppd, map->ppd)) + { + if (!status) + puts("FAIL"); + + if (strcmp(map->pwg, map2->pwg)) + printf(" SAVED source->pwg=\"%s\", ORIG source->pwg=\"%s\"\n", + map2->pwg, map->pwg); + + if (strcmp(map2->ppd, map->ppd)) + printf(" SAVED source->ppd=\"%s\", ORIG source->ppd=\"%s\"\n", + map2->ppd, map->ppd); + + status ++; + break; + } + } + + for (i = pc->num_types, map = pc->types, map2 = pc2->types; + i > 0; + i --, map ++, map2 ++) + { + if (strcmp(map2->pwg, map->pwg) || + strcmp(map2->ppd, map->ppd)) + { + if (!status) + puts("FAIL"); + + if (strcmp(map->pwg, map2->pwg)) + printf(" SAVED type->pwg=\"%s\", ORIG type->pwg=\"%s\"\n", + map2->pwg, map->pwg); + + if (strcmp(map2->ppd, map->ppd)) + printf(" SAVED type->ppd=\"%s\", ORIG type->ppd=\"%s\"\n", + map2->ppd, map->ppd); + + status ++; + break; + } + } + } + + if (!status) + puts("PASS"); + + _ppdCacheDestroy(pc2); + } + + /* + * Test PageSize mapping code... + */ + + status += test_pagesize(pc, ppd, "Letter"); + status += test_pagesize(pc, ppd, "na-letter"); + status += test_pagesize(pc, ppd, "A4"); + status += test_pagesize(pc, ppd, "iso-a4"); + + return (status); +} + + +/* + * End of "$Id: testpwg.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/cups/testsnmp.c b/cups/testsnmp.c new file mode 100644 index 0000000..14700fd --- /dev/null +++ b/cups/testsnmp.c @@ -0,0 +1,304 @@ +/* + * "$Id: testsnmp.c 9099 2010-04-11 07:16:05Z mike $" + * + * SNMP test program for CUPS. + * + * Copyright 2008-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * scan_oid() - Scan an OID value. + * show_oid() - Show the specified OID. + * usage() - Show program usage and exit. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "snmp-private.h" + + +/* + * Local functions... + */ + +static void print_packet(cups_snmp_t *packet, void *data); +static int show_oid(int fd, const char *community, + http_addr_t *addr, const char *s, int walk); +static void usage(void); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int fd = -1; /* SNMP socket */ + http_addrlist_t *host = NULL; /* Address of host */ + int walk = 0; /* Walk OIDs? */ + char *oid = NULL; /* Last OID shown */ + const char *community; /* Community name */ + + + fputs("_cupsSNMPDefaultCommunity: ", stdout); + + if ((community = _cupsSNMPDefaultCommunity()) == NULL) + { + puts("FAIL (NULL community name)"); + return (1); + } + + printf("PASS (%s)\n", community); + + /* + * Query OIDs from the command-line... + */ + + for (i = 1; i < argc; i ++) + if (!strcmp(argv[i], "-c")) + { + i ++; + + if (i >= argc) + usage(); + else + community = argv[i]; + } + else if (!strcmp(argv[i], "-d")) + _cupsSNMPSetDebug(10); + else if (!strcmp(argv[i], "-w")) + walk = 1; + else if (!host) + { + if ((host = httpAddrGetList(argv[i], AF_UNSPEC, "161")) == NULL) + { + printf("testsnmp: Unable to find \"%s\"!\n", argv[1]); + return (1); + } + + if (fd < 0) + { + fputs("_cupsSNMPOpen: ", stdout); + + if ((fd = _cupsSNMPOpen(host->addr.addr.sa_family)) < 0) + { + printf("FAIL (%s)\n", strerror(errno)); + return (1); + } + + puts("PASS"); + } + } + else if (!show_oid(fd, community, &(host->addr), argv[i], walk)) + return (1); + else + oid = argv[i]; + + if (!host) + usage(); + + if (!oid) + { + if (!show_oid(fd, community, &(host->addr), + walk ? ".1.3.6.1.2.1.43" : + ".1.3.6.1.2.1.43.10.2.1.4.1.1", walk)) + return (1); + } + + return (0); +} + + +/* + * 'print_packet()' - Print the contents of the response packet. + */ + +static void +print_packet(cups_snmp_t *packet, /* I - SNMP response packet */ + void *data) /* I - User data pointer (not used) */ +{ + int i; /* Looping var */ + char temp[1024]; /* Temporary OID string */ + + + (void)data; + + printf("%s = ", _cupsSNMPOIDToString(packet->object_name, temp, sizeof(temp))); + + switch (packet->object_type) + { + case CUPS_ASN1_BOOLEAN : + printf("BOOLEAN %s\n", + packet->object_value.boolean ? "TRUE" : "FALSE"); + break; + + case CUPS_ASN1_INTEGER : + printf("INTEGER %d\n", packet->object_value.integer); + break; + + case CUPS_ASN1_BIT_STRING : + printf("BIT-STRING \"%s\"\n", + (char *)packet->object_value.string.bytes); + break; + + case CUPS_ASN1_OCTET_STRING : + printf("OCTET-STRING \"%s\"\n", + (char *)packet->object_value.string.bytes); + break; + + case CUPS_ASN1_NULL_VALUE : + puts("NULL-VALUE"); + break; + + case CUPS_ASN1_OID : + printf("OID %s\n", _cupsSNMPOIDToString(packet->object_value.oid, + temp, sizeof(temp))); + break; + + case CUPS_ASN1_HEX_STRING : + fputs("Hex-STRING", stdout); + for (i = 0; i < packet->object_value.string.num_bytes; i ++) + printf(" %02X", packet->object_value.string.bytes[i]); + putchar('\n'); + break; + + case CUPS_ASN1_COUNTER : + printf("Counter %d\n", packet->object_value.counter); + break; + + case CUPS_ASN1_GAUGE : + printf("Gauge %u\n", packet->object_value.gauge); + break; + + case CUPS_ASN1_TIMETICKS : + printf("Timeticks %u days, %u:%02u:%02u.%02u\n", + packet->object_value.timeticks / 8640000, + (packet->object_value.timeticks / 360000) % 24, + (packet->object_value.timeticks / 6000) % 60, + (packet->object_value.timeticks / 100) % 60, + packet->object_value.timeticks % 100); + break; + + default : + printf("Unknown-%X\n", packet->object_type); + break; + } +} + + +/* + * 'show_oid()' - Show the specified OID. + */ + +static int /* O - 1 on success, 0 on error */ +show_oid(int fd, /* I - SNMP socket */ + const char *community, /* I - Community name */ + http_addr_t *addr, /* I - Address to query */ + const char *s, /* I - OID to query */ + int walk) /* I - Walk OIDs? */ +{ + int i; /* Looping var */ + int oid[CUPS_SNMP_MAX_OID]; /* OID */ + cups_snmp_t packet; /* SNMP packet */ + char temp[1024]; /* Temporary OID string */ + + + if (!_cupsSNMPStringToOID(s, oid, sizeof(oid) / sizeof(oid[0]))) + { + puts("testsnmp: Bad OID"); + return (0); + } + + if (walk) + { + printf("_cupsSNMPWalk(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp))); + + if (_cupsSNMPWalk(fd, addr, CUPS_SNMP_VERSION_1, community, oid, 5.0, + print_packet, NULL) < 0) + { + printf("FAIL (%s)\n", strerror(errno)); + return (0); + } + } + else + { + printf("_cupsSNMPWrite(%s): ", _cupsSNMPOIDToString(oid, temp, sizeof(temp))); + + if (!_cupsSNMPWrite(fd, addr, CUPS_SNMP_VERSION_1, community, + CUPS_ASN1_GET_REQUEST, 1, oid)) + { + printf("FAIL (%s)\n", strerror(errno)); + return (0); + } + + puts("PASS"); + + fputs("_cupsSNMPRead(5.0): ", stdout); + + if (!_cupsSNMPRead(fd, &packet, 5.0)) + { + puts("FAIL (timeout)"); + return (0); + } + + if (!_cupsSNMPIsOID(&packet, oid)) + { + printf("FAIL (bad OID %d", packet.object_name[0]); + for (i = 1; packet.object_name[i] >= 0; i ++) + printf(".%d", packet.object_name[i]); + puts(")"); + return (0); + } + + if (packet.error) + { + printf("FAIL (%s)\n", packet.error); + return (0); + } + + puts("PASS"); + + print_packet(&packet, NULL); + } + + return (1); +} + + +/* + * 'usage()' - Show program usage and exit. + */ + +static void +usage(void) +{ + puts("Usage: testsnmp [options] host-or-ip [oid ...]"); + puts(""); + puts("Options:"); + puts(""); + puts(" -c community Set community name"); + puts(" -d Enable debugging"); + puts(" -w Walk all OIDs under the specified one"); + + exit (1); +} + + +/* + * End of "$Id: testsnmp.c 9099 2010-04-11 07:16:05Z mike $". + */ diff --git a/cups/thread-private.h b/cups/thread-private.h new file mode 100644 index 0000000..5057879 --- /dev/null +++ b/cups/thread-private.h @@ -0,0 +1,98 @@ +/* + * "$Id: thread-private.h 10436 2012-04-23 21:52:02Z mike $" + * + * Private threading definitions for CUPS. + * + * Copyright 2009-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_THREAD_PRIVATE_H_ +# define _CUPS_THREAD_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include "config.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +# ifdef HAVE_PTHREAD_H +# include +typedef void *(*_cups_thread_func_t)(void *arg); +typedef pthread_mutex_t _cups_mutex_t; +typedef pthread_rwlock_t _cups_rwlock_t; +typedef pthread_key_t _cups_threadkey_t; +# define _CUPS_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER +# define _CUPS_RWLOCK_INITIALIZER PTHREAD_RWLOCK_INITIALIZER +# define _CUPS_THREADKEY_INITIALIZER -1 +# define _cupsThreadGetData(k) pthread_getspecific(k) +# define _cupsThreadSetData(k,p) pthread_setspecific(k,p) + +# elif defined(WIN32) +# include +# include +typedef void *(__stdcall *_cups_thread_func_t)(void *arg); +typedef struct _cups_mutex_s +{ + int m_init; /* Flag for on-demand initialization */ + CRITICAL_SECTION m_criticalSection; + /* Win32 Critical Section */ +} _cups_mutex_t; +typedef _cups_mutex_t _cups_rwlock_t; /* TODO: Implement Win32 reader/writer lock */ +typedef DWORD _cups_threadkey_t; +# define _CUPS_MUTEX_INITIALIZER { 0, 0 } +# define _CUPS_RWLOCK_INITIALIZER { 0, 0 } +# define _CUPS_THREADKEY_INITIALIZER 0 +# define _cupsThreadGetData(k) TlsGetValue(k) +# define _cupsThreadSetData(k,p) TlsSetValue(k,p) + +# else +typedef void *(*_cups_thread_func_t)(void *arg); +typedef char _cups_mutex_t; +typedef char _cups_rwlock_t; +typedef void *_cups_threadkey_t; +# define _CUPS_MUTEX_INITIALIZER 0 +# define _CUPS_RWLOCK_INITIALIZER 0 +# define _CUPS_THREADKEY_INITIALIZER (void *)0 +# define _cupsThreadGetData(k) k +# define _cupsThreadSetData(k,p) k=p +# endif /* HAVE_PTHREAD_H */ + + +/* + * Functions... + */ + +extern void _cupsMutexInit(_cups_mutex_t *mutex); +extern void _cupsMutexLock(_cups_mutex_t *mutex); +extern void _cupsMutexUnlock(_cups_mutex_t *mutex); +extern void _cupsRWInit(_cups_rwlock_t *rwlock); +extern void _cupsRWLockRead(_cups_rwlock_t *rwlock); +extern void _cupsRWLockWrite(_cups_rwlock_t *rwlock); +extern void _cupsRWUnlock(_cups_rwlock_t *rwlock); +extern int _cupsThreadCreate(_cups_thread_func_t func, void *arg); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_THREAD_PRIVATE_H_ */ + +/* + * End of "$Id: thread-private.h 10436 2012-04-23 21:52:02Z mike $". + */ diff --git a/cups/thread.c b/cups/thread.c new file mode 100644 index 0000000..0907b4a --- /dev/null +++ b/cups/thread.c @@ -0,0 +1,336 @@ +/* + * "$Id: thread.c 10436 2012-04-23 21:52:02Z mike $" + * + * Threading primitives for CUPS. + * + * Copyright 2009-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * _cupsMutexInit() - Initialize a mutex. + * _cupsMutexLock() - Lock a mutex. + * _cupsMutexUnlock() - Unlock a mutex. + * _cupsRWInit() - Initialize a reader/writer lock. + * _cupsRWLockRead() - Acquire a reader/writer lock for reading. + * _cupsRWLockWrite() - Acquire a reader/writer lock for writing. + * _cupsRWUnlock() - Release a reader/writer lock. + * _cupsThreadCreate() - Create a thread. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include "thread-private.h" + + +#if defined(HAVE_PTHREAD_H) +/* + * '_cupsMutexInit()' - Initialize a mutex. + */ + +void +_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ +{ + pthread_mutex_init(mutex, NULL); +} + + +/* + * '_cupsMutexLock()' - Lock a mutex. + */ + +void +_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + pthread_mutex_lock(mutex); +} + + +/* + * '_cupsMutexUnlock()' - Unlock a mutex. + */ + +void +_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + pthread_mutex_unlock(mutex); +} + + +/* + * '_cupsRWInit()' - Initialize a reader/writer lock. + */ + +void +_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + pthread_rwlock_init(rwlock, NULL); +} + + +/* + * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. + */ + +void +_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + pthread_rwlock_rdlock(rwlock); +} + + +/* + * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. + */ + +void +_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ +{ + pthread_rwlock_wrlock(rwlock); +} + + +/* + * '_cupsRWUnlock()' - Release a reader/writer lock. + */ + +void +_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + pthread_rwlock_unlock(rwlock); +} + + +/* + * '_cupsThreadCreate()' - Create a thread. + */ + +int /* O - 0 on failure, 1 on success */ +_cupsThreadCreate( + _cups_thread_func_t func, /* I - Entry point */ + void *arg) /* I - Entry point context */ +{ + pthread_t thread; + + return (pthread_create(&thread, NULL, (void *(*)(void *))func, arg) == 0); +} + + +#elif defined(WIN32) +# include + + +/* + * '_cupsMutexInit()' - Initialize a mutex. + */ + +void +_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ +{ + InitializeCriticalSection(&mutex->m_criticalSection); + mutex->m_init = 1; +} + + +/* + * '_cupsMutexLock()' - Lock a mutex. + */ + +void +_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + if (!mutex->m_init) + { + _cupsGlobalLock(); + + if (!mutex->m_init) + { + InitializeCriticalSection(&mutex->m_criticalSection); + mutex->m_init = 1; + } + + _cupsGlobalUnlock(); + } + + EnterCriticalSection(&mutex->m_criticalSection); +} + + +/* + * '_cupsMutexUnlock()' - Unlock a mutex. + */ + +void +_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + LeaveCriticalSection(&mutex->m_criticalSection); +} + + +/* + * '_cupsRWInit()' - Initialize a reader/writer lock. + */ + +void +_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + _cupsMutexInit((_cups_mutex_t *)rwlock); +} + + +/* + * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. + */ + +void +_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + _cupsMutexLock((_cups_mutex_t *)rwlock); +} + + +/* + * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. + */ + +void +_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ +{ + _cupsMutexLock((_cups_mutex_t *)rwlock); +} + + +/* + * '_cupsRWUnlock()' - Release a reader/writer lock. + */ + +void +_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + _cupsMutexUnlock((_cups_mutex_t *)rwlock); +} + + +/* + * '_cupsThreadCreate()' - Create a thread. + */ + +int /* O - 0 on failure, 1 on success */ +_cupsThreadCreate( + _cups_thread_func_t func, /* I - Entry point */ + void *arg) /* I - Entry point context */ +{ + return (_beginthreadex(NULL, 0, (LPTHREAD_START_ROUTINE) func, arg, 0, NULL) + != 0); +} + + +#else +/* + * '_cupsMutexInit()' - Initialize a mutex. + */ + +void +_cupsMutexInit(_cups_mutex_t *mutex) /* I - Mutex */ +{ + (void)mutex; +} + + +/* + * '_cupsMutexLock()' - Lock a mutex. + */ + +void +_cupsMutexLock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + (void)mutex; +} + + +/* + * '_cupsMutexUnlock()' - Unlock a mutex. + */ + +void +_cupsMutexUnlock(_cups_mutex_t *mutex) /* I - Mutex */ +{ + (void)mutex; +} + + +/* + * '_cupsRWInit()' - Initialize a reader/writer lock. + */ + +void +_cupsRWInit(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + (void)rwlock; +} + + +/* + * '_cupsRWLockRead()' - Acquire a reader/writer lock for reading. + */ + +void +_cupsRWLockRead(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + (void)rwlock; +} + + +/* + * '_cupsRWLockWrite()' - Acquire a reader/writer lock for writing. + */ + +void +_cupsRWLockWrite(_cups_rwlock_t *rwlock)/* I - Reader/writer lock */ +{ + (void)rwlock; +} + + +/* + * '_cupsRWUnlock()' - Release a reader/writer lock. + */ + +void +_cupsRWUnlock(_cups_rwlock_t *rwlock) /* I - Reader/writer lock */ +{ + (void)rwlock; +} + + +/* + * '_cupsThreadCreate()' - Create a thread. + */ + +int /* O - 0 on failure, 1 on success */ +_cupsThreadCreate( + _cups_thread_func_t func, /* I - Entry point */ + void *arg) /* I - Entry point context */ +{ + fputs("DEBUG: CUPS was compiled without threading support, no thread " + "created.\n", stderr); + + (void)func; + (void)arg; + + return (0); +} +#endif /* HAVE_PTHREAD_H */ + + +/* + * End of "$Id: thread.c 10436 2012-04-23 21:52:02Z mike $". + */ diff --git a/cups/transcode.c b/cups/transcode.c new file mode 100644 index 0000000..effc7ec --- /dev/null +++ b/cups/transcode.c @@ -0,0 +1,720 @@ +/* + * "$Id: transcode.c 9820 2011-06-10 22:06:26Z mike $" + * + * Transcoding support for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsCharmapFlush() - Flush all character set maps out of cache. + * cupsCharsetToUTF8() - Convert legacy character set to UTF-8. + * cupsUTF8ToCharset() - Convert UTF-8 to legacy character set. + * cupsUTF8ToUTF32() - Convert UTF-8 to UTF-32. + * cupsUTF32ToUTF8() - Convert UTF-32 to UTF-8. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#ifdef HAVE_ICONV_H +# include +#endif /* HAVE_ICONV_H */ + + +/* + * Local globals... + */ + +#ifdef HAVE_ICONV_H +static _cups_mutex_t map_mutex = _CUPS_MUTEX_INITIALIZER; + /* Mutex to control access to maps */ +static iconv_t map_from_utf8 = (iconv_t)-1; + /* Convert from UTF-8 to charset */ +static iconv_t map_to_utf8 = (iconv_t)-1; + /* Convert from charset to UTF-8 */ +static cups_encoding_t map_encoding = CUPS_AUTO_ENCODING; + /* Which charset is cached */ +#endif /* HAVE_ICONV_H */ + + +/* + * '_cupsCharmapFlush()' - Flush all character set maps out of cache. + */ + +void +_cupsCharmapFlush(void) +{ +#ifdef HAVE_ICONV_H + if (map_from_utf8 != (iconv_t)-1) + { + iconv_close(map_from_utf8); + map_from_utf8 = (iconv_t)-1; + } + + if (map_to_utf8 != (iconv_t)-1) + { + iconv_close(map_to_utf8); + map_to_utf8 = (iconv_t)-1; + } + + map_encoding = CUPS_AUTO_ENCODING; +#endif /* HAVE_ICONV_H */ +} + + +/* + * 'cupsCharsetToUTF8()' - Convert legacy character set to UTF-8. + */ + +int /* O - Count or -1 on error */ +cupsCharsetToUTF8( + cups_utf8_t *dest, /* O - Target string */ + const char *src, /* I - Source string */ + const int maxout, /* I - Max output */ + const cups_encoding_t encoding) /* I - Encoding */ +{ + cups_utf8_t *destptr; /* Pointer into UTF-8 buffer */ +#ifdef HAVE_ICONV_H + size_t srclen, /* Length of source string */ + outBytesLeft; /* Bytes remaining in output buffer */ +#endif /* HAVE_ICONV_H */ + + + /* + * Check for valid arguments... + */ + + DEBUG_printf(("2cupsCharsetToUTF8(dest=%p, src=\"%s\", maxout=%d, encoding=%d)", + dest, src, maxout, encoding)); + + if (!dest || !src || maxout < 1) + { + if (dest) + *dest = '\0'; + + DEBUG_puts("3cupsCharsetToUTF8: Bad arguments, returning -1"); + return (-1); + } + + /* + * Handle identity conversions... + */ + + if (encoding == CUPS_UTF8 || encoding <= CUPS_US_ASCII || + encoding >= CUPS_ENCODING_VBCS_END) + { + strlcpy((char *)dest, src, maxout); + return ((int)strlen((char *)dest)); + } + + /* + * Handle ISO-8859-1 to UTF-8 directly... + */ + + destptr = dest; + + if (encoding == CUPS_ISO8859_1) + { + int ch; /* Character from string */ + cups_utf8_t *destend; /* End of UTF-8 buffer */ + + + destend = dest + maxout - 2; + + while (*src && destptr < destend) + { + ch = *src++ & 255; + + if (ch & 128) + { + *destptr++ = 0xc0 | (ch >> 6); + *destptr++ = 0x80 | (ch & 0x3f); + } + else + *destptr++ = ch; + } + + *destptr = '\0'; + + return ((int)(destptr - dest)); + } + + /* + * Convert input legacy charset to UTF-8... + */ + +#ifdef HAVE_ICONV_H + _cupsMutexLock(&map_mutex); + + if (map_encoding != encoding) + { + _cupsCharmapFlush(); + + map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8"); + map_to_utf8 = iconv_open("UTF-8", _cupsEncodingName(encoding)); + map_encoding = encoding; + } + + if (map_to_utf8 != (iconv_t)-1) + { + char *altdestptr = (char *)dest; /* Silence bogus GCC type-punned */ + + srclen = strlen(src); + outBytesLeft = maxout - 1; + + iconv(map_to_utf8, (char **)&src, &srclen, &altdestptr, &outBytesLeft); + *altdestptr = '\0'; + + _cupsMutexUnlock(&map_mutex); + + return ((int)(altdestptr - (char *)dest)); + } + + _cupsMutexUnlock(&map_mutex); +#endif /* HAVE_ICONV_H */ + + /* + * No iconv() support, so error out... + */ + + *destptr = '\0'; + + return (-1); +} + + +/* + * 'cupsUTF8ToCharset()' - Convert UTF-8 to legacy character set. + */ + +int /* O - Count or -1 on error */ +cupsUTF8ToCharset( + char *dest, /* O - Target string */ + const cups_utf8_t *src, /* I - Source string */ + const int maxout, /* I - Max output */ + const cups_encoding_t encoding) /* I - Encoding */ +{ + char *destptr; /* Pointer into destination */ +#ifdef HAVE_ICONV_H + size_t srclen, /* Length of source string */ + outBytesLeft; /* Bytes remaining in output buffer */ +#endif /* HAVE_ICONV_H */ + + + /* + * Check for valid arguments... + */ + + if (!dest || !src || maxout < 1) + { + if (dest) + *dest = '\0'; + + return (-1); + } + + /* + * Handle identity conversions... + */ + + if (encoding == CUPS_UTF8 || + encoding >= CUPS_ENCODING_VBCS_END) + { + strlcpy(dest, (char *)src, maxout); + return ((int)strlen(dest)); + } + + /* + * Handle UTF-8 to ISO-8859-1 directly... + */ + + destptr = dest; + + if (encoding == CUPS_ISO8859_1 || encoding <= CUPS_US_ASCII) + { + int ch, /* Character from string */ + maxch; /* Maximum character for charset */ + char *destend; /* End of ISO-8859-1 buffer */ + + maxch = encoding == CUPS_ISO8859_1 ? 256 : 128; + destend = dest + maxout - 1; + + while (*src && destptr < destend) + { + ch = *src++; + + if ((ch & 0xe0) == 0xc0) + { + ch = ((ch & 0x1f) << 6) | (*src++ & 0x3f); + + if (ch < maxch) + *destptr++ = ch; + else + *destptr++ = '?'; + } + else if ((ch & 0xf0) == 0xe0 || + (ch & 0xf8) == 0xf0) + *destptr++ = '?'; + else if (!(ch & 0x80)) + *destptr++ = ch; + } + + *destptr = '\0'; + + return ((int)(destptr - dest)); + } + +#ifdef HAVE_ICONV_H + /* + * Convert input UTF-8 to legacy charset... + */ + + _cupsMutexLock(&map_mutex); + + if (map_encoding != encoding) + { + _cupsCharmapFlush(); + + map_from_utf8 = iconv_open(_cupsEncodingName(encoding), "UTF-8"); + map_to_utf8 = iconv_open("UTF-8", _cupsEncodingName(encoding)); + map_encoding = encoding; + } + + if (map_from_utf8 != (iconv_t)-1) + { + char *altsrc = (char *)src; /* Silence bogus GCC type-punned */ + + srclen = strlen((char *)src); + outBytesLeft = maxout - 1; + + iconv(map_from_utf8, &altsrc, &srclen, &destptr, &outBytesLeft); + *destptr = '\0'; + + _cupsMutexUnlock(&map_mutex); + + return ((int)(destptr - dest)); + } + + _cupsMutexUnlock(&map_mutex); +#endif /* HAVE_ICONV_H */ + + /* + * No iconv() support, so error out... + */ + + *destptr = '\0'; + + return (-1); +} + + +/* + * 'cupsUTF8ToUTF32()' - Convert UTF-8 to UTF-32. + * + * 32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows... + * + * UTF-32 char UTF-8 char(s) + * -------------------------------------------------- + * 0 to 127 = 0xxxxxxx (US-ASCII) + * 128 to 2047 = 110xxxxx 10yyyyyy + * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz + * > 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx + * + * UTF-32 prohibits chars beyond Plane 16 (> 0x10ffff) in UCS-4, + * which would convert to five- or six-octet UTF-8 sequences... + */ + +int /* O - Count or -1 on error */ +cupsUTF8ToUTF32( + cups_utf32_t *dest, /* O - Target string */ + const cups_utf8_t *src, /* I - Source string */ + const int maxout) /* I - Max output */ +{ + int i; /* Looping variable */ + cups_utf8_t ch; /* Character value */ + cups_utf8_t next; /* Next character value */ + cups_utf32_t ch32; /* UTF-32 character value */ + + + /* + * Check for valid arguments and clear output... + */ + + DEBUG_printf(("2cupsUTF8ToUTF32(dest=%p, src=\"%s\", maxout=%d)", dest, + src, maxout)); + + if (dest) + *dest = 0; + + if (!dest || !src || maxout < 1 || maxout > CUPS_MAX_USTRING) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad arguments)"); + + return (-1); + } + + /* + * Convert input UTF-8 to output UTF-32... + */ + + for (i = maxout - 1; *src && i > 0; i --) + { + ch = *src++; + + /* + * Convert UTF-8 character(s) to UTF-32 character... + */ + + if (!(ch & 0x80)) + { + /* + * One-octet UTF-8 <= 127 (US-ASCII)... + */ + + *dest++ = ch; + + DEBUG_printf(("4cupsUTF8ToUTF32: %02x => %08X", src[-1], ch)); + continue; + } + else if ((ch & 0xe0) == 0xc0) + { + /* + * Two-octet UTF-8 <= 2047 (Latin-x)... + */ + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = ((ch & 0x1f) << 6) | (next & 0x3f); + + /* + * Check for non-shortest form (invalid UTF-8)... + */ + + if (ch32 < 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + *dest++ = ch32; + + DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x => %08X", + src[-2], src[-1], (unsigned)ch32)); + } + else if ((ch & 0xf0) == 0xe0) + { + /* + * Three-octet UTF-8 <= 65535 (Plane 0 - BMP)... + */ + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = ((ch & 0x0f) << 6) | (next & 0x3f); + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = (ch32 << 6) | (next & 0x3f); + + /* + * Check for non-shortest form (invalid UTF-8)... + */ + + if (ch32 < 0x800) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + *dest++ = ch32; + + DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x %02x => %08X", + src[-3], src[-2], src[-1], (unsigned)ch32)); + } + else if ((ch & 0xf8) == 0xf0) + { + /* + * Four-octet UTF-8... + */ + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = ((ch & 0x07) << 6) | (next & 0x3f); + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = (ch32 << 6) | (next & 0x3f); + + next = *src++; + if ((next & 0xc0) != 0x80) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + ch32 = (ch32 << 6) | (next & 0x3f); + + /* + * Check for non-shortest form (invalid UTF-8)... + */ + + if (ch32 < 0x10000) + { + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + *dest++ = ch32; + + DEBUG_printf(("4cupsUTF8ToUTF32: %02x %02x %02x %02x => %08X", + src[-4], src[-3], src[-2], src[-1], (unsigned)ch32)); + } + else + { + /* + * More than 4-octet (invalid UTF-8 sequence)... + */ + + DEBUG_puts("3cupsUTF8ToUTF32: Returning -1 (bad UTF-8 sequence)"); + + return (-1); + } + + /* + * Check for UTF-16 surrogate (illegal UTF-8)... + */ + + if (ch32 >= 0xd800 && ch32 <= 0xdfff) + return (-1); + } + + *dest = 0; + + DEBUG_printf(("3cupsUTF8ToUTF32: Returning %d characters", maxout - 1 - i)); + + return (maxout - 1 - i); +} + + +/* + * 'cupsUTF32ToUTF8()' - Convert UTF-32 to UTF-8. + * + * 32-bit UTF-32 (actually 21-bit) maps to UTF-8 as follows... + * + * UTF-32 char UTF-8 char(s) + * -------------------------------------------------- + * 0 to 127 = 0xxxxxxx (US-ASCII) + * 128 to 2047 = 110xxxxx 10yyyyyy + * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz + * > 65535 = 11110xxx 10yyyyyy 10zzzzzz 10xxxxxx + * + * UTF-32 prohibits chars beyond Plane 16 (> 0x10ffff) in UCS-4, + * which would convert to five- or six-octet UTF-8 sequences... + */ + +int /* O - Count or -1 on error */ +cupsUTF32ToUTF8( + cups_utf8_t *dest, /* O - Target string */ + const cups_utf32_t *src, /* I - Source string */ + const int maxout) /* I - Max output */ +{ + cups_utf8_t *start; /* Start of destination string */ + int i; /* Looping variable */ + int swap; /* Byte-swap input to output */ + cups_utf32_t ch; /* Character value */ + + + /* + * Check for valid arguments and clear output... + */ + + DEBUG_printf(("2cupsUTF32ToUTF8(dest=%p, src=%p, maxout=%d)", dest, src, + maxout)); + + if (dest) + *dest = '\0'; + + if (!dest || !src || maxout < 1) + { + DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (bad args)"); + + return (-1); + } + + /* + * Check for leading BOM in UTF-32 and inverted BOM... + */ + + start = dest; + swap = *src == 0xfffe0000; + + DEBUG_printf(("4cupsUTF32ToUTF8: swap=%d", swap)); + + if (*src == 0xfffe0000 || *src == 0xfeff) + src ++; + + /* + * Convert input UTF-32 to output UTF-8... + */ + + for (i = maxout - 1; *src && i > 0;) + { + ch = *src++; + + /* + * Byte swap input UTF-32, if necessary... + * (only byte-swapping 24 of 32 bits) + */ + + if (swap) + ch = ((ch >> 24) | ((ch >> 8) & 0xff00) | ((ch << 8) & 0xff0000)); + + /* + * Check for beyond Plane 16 (invalid UTF-32)... + */ + + if (ch > 0x10ffff) + { + DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (character out of range)"); + + return (-1); + } + + /* + * Convert UTF-32 character to UTF-8 character(s)... + */ + + if (ch < 0x80) + { + /* + * One-octet UTF-8 <= 127 (US-ASCII)... + */ + + *dest++ = (cups_utf8_t)ch; + i --; + + DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x", (unsigned)ch, dest[-1])); + } + else if (ch < 0x800) + { + /* + * Two-octet UTF-8 <= 2047 (Latin-x)... + */ + + if (i < 2) + { + DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 2)"); + + return (-1); + } + + *dest++ = (cups_utf8_t)(0xc0 | ((ch >> 6) & 0x1f)); + *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); + i -= 2; + + DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x", (unsigned)ch, + dest[-2], dest[-1])); + } + else if (ch < 0x10000) + { + /* + * Three-octet UTF-8 <= 65535 (Plane 0 - BMP)... + */ + + if (i < 3) + { + DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 3)"); + + return (-1); + } + + *dest++ = (cups_utf8_t)(0xe0 | ((ch >> 12) & 0x0f)); + *dest++ = (cups_utf8_t)(0x80 | ((ch >> 6) & 0x3f)); + *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); + i -= 3; + + DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x %02x", (unsigned)ch, + dest[-3], dest[-2], dest[-1])); + } + else + { + /* + * Four-octet UTF-8... + */ + + if (i < 4) + { + DEBUG_puts("3cupsUTF32ToUTF8: Returning -1 (too long 4)"); + + return (-1); + } + + *dest++ = (cups_utf8_t)(0xf0 | ((ch >> 18) & 0x07)); + *dest++ = (cups_utf8_t)(0x80 | ((ch >> 12) & 0x3f)); + *dest++ = (cups_utf8_t)(0x80 | ((ch >> 6) & 0x3f)); + *dest++ = (cups_utf8_t)(0x80 | (ch & 0x3f)); + i -= 4; + + DEBUG_printf(("4cupsUTF32ToUTF8: %08x => %02x %02x %02x %02x", + (unsigned)ch, dest[-4], dest[-3], dest[-2], dest[-1])); + } + } + + *dest = '\0'; + + DEBUG_printf(("3cupsUTF32ToUTF8: Returning %d", (int)(dest - start))); + + return ((int)(dest - start)); +} + + +/* + * End of "$Id: transcode.c 9820 2011-06-10 22:06:26Z mike $" + */ diff --git a/cups/transcode.h b/cups/transcode.h new file mode 100644 index 0000000..e4a4252 --- /dev/null +++ b/cups/transcode.h @@ -0,0 +1,81 @@ +/* + * "$Id: transcode.h 9771 2011-05-12 05:21:56Z mike $" + * + * Transcoding definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_TRANSCODE_H_ +# define _CUPS_TRANSCODE_H_ + +/* + * Include necessary headers... + */ + +# include "language.h" + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define CUPS_MAX_USTRING 8192 /* Max size of Unicode string */ + + +/* + * Types... + */ + +typedef unsigned char cups_utf8_t; /* UTF-8 Unicode/ISO-10646 unit */ +typedef unsigned long cups_utf32_t; /* UTF-32 Unicode/ISO-10646 unit */ +typedef unsigned short cups_ucs2_t; /* UCS-2 Unicode/ISO-10646 unit */ +typedef unsigned long cups_ucs4_t; /* UCS-4 Unicode/ISO-10646 unit */ +typedef unsigned char cups_sbcs_t; /* SBCS Legacy 8-bit unit */ +typedef unsigned short cups_dbcs_t; /* DBCS Legacy 16-bit unit */ +typedef unsigned long cups_vbcs_t; /* VBCS Legacy 32-bit unit */ + /* EUC uses 8, 16, 24, 32-bit */ + + +/* + * Prototypes... + */ + +extern int cupsCharsetToUTF8(cups_utf8_t *dest, + const char *src, + const int maxout, + const cups_encoding_t encoding) _CUPS_API_1_2; +extern int cupsUTF8ToCharset(char *dest, + const cups_utf8_t *src, + const int maxout, + const cups_encoding_t encoding) _CUPS_API_1_2; +extern int cupsUTF8ToUTF32(cups_utf32_t *dest, + const cups_utf8_t *src, + const int maxout) _CUPS_API_1_2; +extern int cupsUTF32ToUTF8(cups_utf8_t *dest, + const cups_utf32_t *src, + const int maxout) _CUPS_API_1_2; + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_TRANSCODE_H_ */ + + +/* + * End of "$Id: transcode.h 9771 2011-05-12 05:21:56Z mike $" + */ diff --git a/cups/usersys.c b/cups/usersys.c new file mode 100644 index 0000000..706a402 --- /dev/null +++ b/cups/usersys.c @@ -0,0 +1,810 @@ +/* + * "$Id: usersys.c 9969 2011-09-07 22:32:14Z mike $" + * + * User, system, and password routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsEncryption() - Get the current encryption settings. + * cupsGetPassword() - Get a password from the user. + * cupsGetPassword2() - Get a password from the user using the advanced + * password callback. + * cupsServer() - Return the hostname/address of the current + * server. + * cupsSetClientCertCB() - Set the client certificate callback. + * cupsSetEncryption() - Set the encryption preference. + * cupsSetPasswordCB() - Set the password callback for CUPS. + * cupsSetPasswordCB2() - Set the advanced password callback for CUPS. + * cupsSetServer() - Set the default server name and port. + * cupsSetServerCertCB() - Set the server certificate callback. + * cupsSetUser() - Set the default user name. + * cupsUser() - Return the current user's name. + * _cupsGetPassword() - Get a password from the user. + * _cupsGSSServiceName() - Get the GSS (Kerberos) service name. + * _cupsSetDefaults() - Set the default server, port, and encryption. + * cups_read_client_conf() - Read a client.conf file. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#ifdef WIN32 +# include +#else +# include +#endif /* WIN32 */ + + +/* + * Local functions... + */ + +static void cups_read_client_conf(cups_file_t *fp, + _cups_globals_t *cg, + const char *cups_encryption, + const char *cups_server, +#ifdef HAVE_GSSAPI + const char *cups_gssservicename, +#endif /* HAVE_GSSAPI */ + const char *cups_anyroot, + const char *cups_expiredroot, + const char *cups_expiredcerts); + + +/* + * 'cupsEncryption()' - Get the current encryption settings. + * + * The default encryption setting comes from the CUPS_ENCRYPTION + * environment variable, then the ~/.cups/client.conf file, and finally the + * /etc/cups/client.conf file. If not set, the default is + * @code HTTP_ENCRYPT_IF_REQUESTED@. + * + * Note: The current encryption setting is tracked separately for each thread + * in a program. Multi-threaded programs that override the setting via the + * @link cupsSetEncryption@ function need to do so in each thread for the same + * setting to be used. + */ + +http_encryption_t /* O - Encryption settings */ +cupsEncryption(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (cg->encryption == (http_encryption_t)-1) + _cupsSetDefaults(); + + return (cg->encryption); +} + + +/* + * 'cupsGetPassword()' - Get a password from the user. + * + * Uses the current password callback function. Returns @code NULL@ if the + * user does not provide a password. + * + * Note: The current password callback function is tracked separately for each + * thread in a program. Multi-threaded programs that override the setting via + * the @link cupsSetPasswordCB@ or @link cupsSetPasswordCB2@ functions need to + * do so in each thread for the same function to be used. + */ + +const char * /* O - Password */ +cupsGetPassword(const char *prompt) /* I - Prompt string */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + return ((cg->password_cb)(prompt, NULL, NULL, NULL, cg->password_data)); +} + + +/* + * 'cupsGetPassword2()' - Get a password from the user using the advanced + * password callback. + * + * Uses the current password callback function. Returns @code NULL@ if the + * user does not provide a password. + * + * Note: The current password callback function is tracked separately for each + * thread in a program. Multi-threaded programs that override the setting via + * the @link cupsSetPasswordCB@ or @link cupsSetPasswordCB2@ functions need to + * do so in each thread for the same function to be used. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +const char * /* O - Password */ +cupsGetPassword2(const char *prompt, /* I - Prompt string */ + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *method, /* I - Request method ("GET", "POST", "PUT") */ + const char *resource) /* I - Resource path */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (!http) + http = _cupsConnect(); + + return ((cg->password_cb)(prompt, http, method, resource, cg->password_data)); +} + + +/* + * 'cupsServer()' - Return the hostname/address of the current server. + * + * The default server comes from the CUPS_SERVER environment variable, then the + * ~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not + * set, the default is the local system - either "localhost" or a domain socket + * path. + * + * The returned value can be a fully-qualified hostname, a numeric IPv4 or IPv6 + * address, or a domain socket pathname. + * + * Note: The current server is tracked separately for each thread in a program. + * Multi-threaded programs that override the server via the + * @link cupsSetServer@ function need to do so in each thread for the same + * server to be used. + */ + +const char * /* O - Server name */ +cupsServer(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (!cg->server[0]) + _cupsSetDefaults(); + + return (cg->server); +} + + +/* + * 'cupsSetClientCertCB()' - Set the client certificate callback. + * + * Pass @code NULL@ to restore the default callback. + * + * Note: The current certificate callback is tracked separately for each thread + * in a program. Multi-threaded programs that override the callback need to do + * so in each thread for the same callback to be used. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +void +cupsSetClientCertCB( + cups_client_cert_cb_t cb, /* I - Callback function */ + void *user_data) /* I - User data pointer */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + cg->client_cert_cb = cb; + cg->client_cert_data = user_data; +} + + +/* + * 'cupsSetCredentials()' - Set the default credentials to be used for SSL/TLS + * connections. + * + * Note: The default credentials are tracked separately for each thread in a + * program. Multi-threaded programs that override the setting need to do so in + * each thread for the same setting to be used. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +int /* O - Status of call (0 = success) */ +cupsSetCredentials( + cups_array_t *credentials) /* I - Array of credentials */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (cupsArrayCount(credentials) < 1) + return (-1); + + _httpFreeCredentials(cg->tls_credentials); + cg->tls_credentials = _httpCreateCredentials(credentials); + + return (cg->tls_credentials ? 0 : -1); +} + + +/* + * 'cupsSetEncryption()' - Set the encryption preference. + * + * The default encryption setting comes from the CUPS_ENCRYPTION + * environment variable, then the ~/.cups/client.conf file, and finally the + * /etc/cups/client.conf file. If not set, the default is + * @code HTTP_ENCRYPT_IF_REQUESTED@. + * + * Note: The current encryption setting is tracked separately for each thread + * in a program. Multi-threaded programs that override the setting need to do + * so in each thread for the same setting to be used. + */ + +void +cupsSetEncryption(http_encryption_t e) /* I - New encryption preference */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + cg->encryption = e; + + if (cg->http) + httpEncryption(cg->http, e); +} + + +/* + * 'cupsSetPasswordCB()' - Set the password callback for CUPS. + * + * Pass @code NULL@ to restore the default (console) password callback, which + * reads the password from the console. Programs should call either this + * function or @link cupsSetPasswordCB2@, as only one callback can be registered + * by a program per thread. + * + * Note: The current password callback is tracked separately for each thread + * in a program. Multi-threaded programs that override the callback need to do + * so in each thread for the same callback to be used. + */ + +void +cupsSetPasswordCB(cups_password_cb_t cb)/* I - Callback function */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (cb == (cups_password_cb_t)0) + cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; + else + cg->password_cb = (cups_password_cb2_t)cb; + + cg->password_data = NULL; +} + + +/* + * 'cupsSetPasswordCB2()' - Set the advanced password callback for CUPS. + * + * Pass @code NULL@ to restore the default (console) password callback, which + * reads the password from the console. Programs should call either this + * function or @link cupsSetPasswordCB2@, as only one callback can be registered + * by a program per thread. + * + * Note: The current password callback is tracked separately for each thread + * in a program. Multi-threaded programs that override the callback need to do + * so in each thread for the same callback to be used. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +void +cupsSetPasswordCB2( + cups_password_cb2_t cb, /* I - Callback function */ + void *user_data) /* I - User data pointer */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (cb == (cups_password_cb2_t)0) + cg->password_cb = (cups_password_cb2_t)_cupsGetPassword; + else + cg->password_cb = cb; + + cg->password_data = user_data; +} + + +/* + * 'cupsSetServer()' - Set the default server name and port. + * + * The "server" string can be a fully-qualified hostname, a numeric + * IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP + * addresses can be optionally followed by a colon and port number to override + * the default port 631, e.g. "hostname:8631". Pass @code NULL@ to restore the + * default server name and port. + * + * Note: The current server is tracked separately for each thread in a program. + * Multi-threaded programs that override the server need to do so in each + * thread for the same server to be used. + */ + +void +cupsSetServer(const char *server) /* I - Server name */ +{ + char *port; /* Pointer to port */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (server) + { + strlcpy(cg->server, server, sizeof(cg->server)); + + if (cg->server[0] != '/' && (port = strrchr(cg->server, ':')) != NULL && + !strchr(port, ']') && isdigit(port[1] & 255)) + { + *port++ = '\0'; + + cg->ipp_port = atoi(port); + } + + if (cg->server[0] == '/') + strcpy(cg->servername, "localhost"); + else + strlcpy(cg->servername, cg->server, sizeof(cg->servername)); + } + else + { + cg->server[0] = '\0'; + cg->servername[0] = '\0'; + } + + if (cg->http) + { + httpClose(cg->http); + cg->http = NULL; + } +} + + +/* + * 'cupsSetServerCertCB()' - Set the server certificate callback. + * + * Pass @code NULL@ to restore the default callback. + * + * Note: The current credentials callback is tracked separately for each thread + * in a program. Multi-threaded programs that override the callback need to do + * so in each thread for the same callback to be used. + * + * @since CUPS 1.5/Mac OS X 10.7@ + */ + +void +cupsSetServerCertCB( + cups_server_cert_cb_t cb, /* I - Callback function */ + void *user_data) /* I - User data pointer */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + cg->server_cert_cb = cb; + cg->server_cert_data = user_data; +} + + +/* + * 'cupsSetUser()' - Set the default user name. + * + * Pass @code NULL@ to restore the default user name. + * + * Note: The current user name is tracked separately for each thread in a + * program. Multi-threaded programs that override the user name need to do so + * in each thread for the same user name to be used. + */ + +void +cupsSetUser(const char *user) /* I - User name */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (user) + strlcpy(cg->user, user, sizeof(cg->user)); + else + cg->user[0] = '\0'; +} + + +/* + * 'cupsUser()' - Return the current user's name. + * + * Note: The current user name is tracked separately for each thread in a + * program. Multi-threaded programs that override the user name with the + * @link cupsSetUser@ function need to do so in each thread for the same user + * name to be used. + */ + +const char * /* O - User name */ +cupsUser(void) +{ + const char *user; /* USER environment variable */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + if (!cg->user[0]) + { +#ifdef WIN32 + /* + * Get the current user name from the OS... + */ + + DWORD size; /* Size of string */ + + size = sizeof(cg->user); + if (!GetUserName(cg->user, &size)) +#else + /* + * Get the user name corresponding to the current UID... + */ + + struct passwd *pwd; /* User/password entry */ + + setpwent(); + if ((pwd = getpwuid(getuid())) != NULL) + { + /* + * Found a match! + */ + + strlcpy(cg->user, pwd->pw_name, sizeof(cg->user)); + } + else +#endif /* WIN32 */ + if ((user = getenv("USER")) != NULL) + { + /* + * Use the username from the "USER" environment variable... + */ + strlcpy(cg->user, user, sizeof(cg->user)); + } + else + { + /* + * Use the default "unknown" user name... + */ + + strcpy(cg->user, "unknown"); + } + } + + return (cg->user); +} + + +/* + * '_cupsGetPassword()' - Get a password from the user. + */ + +const char * /* O - Password */ +_cupsGetPassword(const char *prompt) /* I - Prompt string */ +{ +#ifdef WIN32 + /* + * Currently no console password support is provided on Windows. + */ + + return (NULL); + +#else + /* + * Use the standard getpass function to get a password from the console. An + * empty password is treated as canceling the authentication request. + */ + + const char *password = getpass(prompt); + /* Password string */ + + if (!password || !password[0]) + return (NULL); + else + return (password); +#endif /* WIN32 */ +} + + +#ifdef HAVE_GSSAPI +/* + * '_cupsGSSServiceName()' - Get the GSS (Kerberos) service name. + */ + +const char * +_cupsGSSServiceName(void) +{ + _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ + + + if (!cg->gss_service_name[0]) + _cupsSetDefaults(); + + return (cg->gss_service_name); +} +#endif /* HAVE_GSSAPI */ + + +/* + * '_cupsSetDefaults()' - Set the default server, port, and encryption. + */ + +void +_cupsSetDefaults(void) +{ + cups_file_t *fp; /* File */ + const char *home, /* Home directory of user */ + *cups_encryption, /* CUPS_ENCRYPTION env var */ + *cups_server, /* CUPS_SERVER env var */ +#ifdef HAVE_GSSAPI + *cups_gssservicename, /* CUPS_GSSSERVICENAME env var */ +#endif /* HAVE_GSSAPI */ + *cups_anyroot, /* CUPS_ANYROOT env var */ + *cups_expiredroot, /* CUPS_EXPIREDROOT env var */ + *cups_expiredcerts; /* CUPS_EXPIREDCERTS env var */ + char filename[1024]; /* Filename */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + DEBUG_puts("_cupsSetDefaults()"); + + /* + * First collect environment variables... + */ + + cups_encryption = getenv("CUPS_ENCRYPTION"); + cups_server = getenv("CUPS_SERVER"); +#ifdef HAVE_GSSAPI + cups_gssservicename = getenv("CUPS_GSSSERVICENAME"); +#endif /* HAVE_GSSAPI */ + cups_anyroot = getenv("CUPS_ANYROOT"); + cups_expiredroot = getenv("CUPS_EXPIREDROOT"); + cups_expiredcerts = getenv("CUPS_EXPIREDCERTS"); + + /* + * Then, if needed, read the ~/.cups/client.conf or /etc/cups/client.conf + * files to get the default values... + */ + + if (cg->encryption == (http_encryption_t)-1 || !cg->server[0] || + !cg->ipp_port) + { + if ((home = getenv("HOME")) != NULL) + { + /* + * Look for ~/.cups/client.conf... + */ + + snprintf(filename, sizeof(filename), "%s/.cups/client.conf", home); + fp = cupsFileOpen(filename, "r"); + } + else + fp = NULL; + + if (!fp) + { + /* + * Look for CUPS_SERVERROOT/client.conf... + */ + + snprintf(filename, sizeof(filename), "%s/client.conf", + cg->cups_serverroot); + fp = cupsFileOpen(filename, "r"); + } + + /* + * Read the configuration file and apply any environment variables; both + * functions handle NULL cups_file_t pointers... + */ + + cups_read_client_conf(fp, cg, cups_encryption, cups_server, +#ifdef HAVE_GSSAPI + cups_gssservicename, +#endif /* HAVE_GSSAPI */ + cups_anyroot, cups_expiredroot, + cups_expiredcerts); + cupsFileClose(fp); + } +} + + +/* + * 'cups_read_client_conf()' - Read a client.conf file. + */ + +static void +cups_read_client_conf( + cups_file_t *fp, /* I - File to read */ + _cups_globals_t *cg, /* I - Global data */ + const char *cups_encryption, /* I - CUPS_ENCRYPTION env var */ + const char *cups_server, /* I - CUPS_SERVER env var */ +#ifdef HAVE_GSSAPI + const char *cups_gssservicename, + /* I - CUPS_GSSSERVICENAME env var */ +#endif /* HAVE_GSSAPI */ + const char *cups_anyroot, /* I - CUPS_ANYROOT env var */ + const char *cups_expiredroot, /* I - CUPS_EXPIREDROOT env var */ + const char *cups_expiredcerts) /* I - CUPS_EXPIREDCERTS env var */ +{ + int linenum; /* Current line number */ + char line[1024], /* Line from file */ + *value, /* Pointer into line */ + encryption[1024], /* Encryption value */ +#ifndef __APPLE__ + server_name[1024], /* ServerName value */ +#endif /* !__APPLE__ */ + any_root[1024], /* AllowAnyRoot value */ + expired_root[1024], /* AllowExpiredRoot value */ + expired_certs[1024]; /* AllowExpiredCerts value */ +#ifdef HAVE_GSSAPI + char gss_service_name[32]; /* GSSServiceName value */ +#endif /* HAVE_GSSAPI */ + + + /* + * Read from the file... + */ + + linenum = 0; + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!cups_encryption && cg->encryption == (http_encryption_t)-1 && + !_cups_strcasecmp(line, "Encryption") && value) + { + strlcpy(encryption, value, sizeof(encryption)); + cups_encryption = encryption; + } +#ifndef __APPLE__ + /* + * The Server directive is not supported on Mac OS X due to app sandboxing + * restrictions, i.e. not all apps request network access. + */ + else if (!cups_server && (!cg->server[0] || !cg->ipp_port) && + !_cups_strcasecmp(line, "ServerName") && value) + { + strlcpy(server_name, value, sizeof(server_name)); + cups_server = server_name; + } +#endif /* !__APPLE__ */ + else if (!cups_anyroot && !_cups_strcasecmp(line, "AllowAnyRoot") && value) + { + strlcpy(any_root, value, sizeof(any_root)); + cups_anyroot = any_root; + } + else if (!cups_expiredroot && !_cups_strcasecmp(line, "AllowExpiredRoot") && + value) + { + strlcpy(expired_root, value, sizeof(expired_root)); + cups_expiredroot = expired_root; + } + else if (!cups_expiredcerts && !_cups_strcasecmp(line, "AllowExpiredCerts") && + value) + { + strlcpy(expired_certs, value, sizeof(expired_certs)); + cups_expiredcerts = expired_certs; + } +#ifdef HAVE_GSSAPI + else if (!cups_gssservicename && !_cups_strcasecmp(line, "GSSServiceName") && + value) + { + strlcpy(gss_service_name, value, sizeof(gss_service_name)); + cups_gssservicename = gss_service_name; + } +#endif /* HAVE_GSSAPI */ + } + + /* + * Set values... + */ + + if (cg->encryption == (http_encryption_t)-1 && cups_encryption) + { + if (!_cups_strcasecmp(cups_encryption, "never")) + cg->encryption = HTTP_ENCRYPT_NEVER; + else if (!_cups_strcasecmp(cups_encryption, "always")) + cg->encryption = HTTP_ENCRYPT_ALWAYS; + else if (!_cups_strcasecmp(cups_encryption, "required")) + cg->encryption = HTTP_ENCRYPT_REQUIRED; + else + cg->encryption = HTTP_ENCRYPT_IF_REQUESTED; + } + + if ((!cg->server[0] || !cg->ipp_port) && cups_server) + { + if (!cg->server[0]) + { + /* + * Copy server name... + */ + + strlcpy(cg->server, cups_server, sizeof(cg->server)); + + if (cg->server[0] != '/' && (value = strrchr(cg->server, ':')) != NULL && + !strchr(value, ']') && isdigit(value[1] & 255)) + *value++ = '\0'; + else + value = NULL; + + if (cg->server[0] == '/') + strcpy(cg->servername, "localhost"); + else + strlcpy(cg->servername, cg->server, sizeof(cg->servername)); + } + else if (cups_server[0] != '/' && + (value = strrchr(cups_server, ':')) != NULL && + !strchr(value, ']') && isdigit(value[1] & 255)) + value ++; + else + value = NULL; + + if (!cg->ipp_port && value) + cg->ipp_port = atoi(value); + } + + if (!cg->server[0]) + { +#ifdef CUPS_DEFAULT_DOMAINSOCKET + /* + * If we are compiled with domain socket support, only use the + * domain socket if it exists and has the right permissions... + */ + + struct stat sockinfo; /* Domain socket information */ + + if (!stat(CUPS_DEFAULT_DOMAINSOCKET, &sockinfo) && + (sockinfo.st_mode & S_IRWXO) == S_IRWXO) + cups_server = CUPS_DEFAULT_DOMAINSOCKET; + else +#endif /* CUPS_DEFAULT_DOMAINSOCKET */ + cups_server = "localhost"; + + cupsSetServer(cups_server); + } + + if (!cg->ipp_port) + { + const char *ipp_port; /* IPP_PORT environment variable */ + + if ((ipp_port = getenv("IPP_PORT")) != NULL) + { + if ((cg->ipp_port = atoi(ipp_port)) <= 0) + cg->ipp_port = CUPS_DEFAULT_IPP_PORT; + } + else + cg->ipp_port = CUPS_DEFAULT_IPP_PORT; + } + +#ifdef HAVE_GSSAPI + if (!cups_gssservicename) + cups_gssservicename = CUPS_DEFAULT_GSSSERVICENAME; + + strlcpy(cg->gss_service_name, cups_gssservicename, + sizeof(cg->gss_service_name)); +#endif /* HAVE_GSSAPI */ + + if (cups_anyroot) + cg->any_root = !_cups_strcasecmp(cups_anyroot, "yes") || + !_cups_strcasecmp(cups_anyroot, "on") || + !_cups_strcasecmp(cups_anyroot, "true"); + + if (cups_expiredroot) + cg->expired_root = !_cups_strcasecmp(cups_expiredroot, "yes") || + !_cups_strcasecmp(cups_expiredroot, "on") || + !_cups_strcasecmp(cups_expiredroot, "true"); + + if (cups_expiredcerts) + cg->expired_certs = !_cups_strcasecmp(cups_expiredcerts, "yes") || + !_cups_strcasecmp(cups_expiredcerts, "on") || + !_cups_strcasecmp(cups_expiredcerts, "true"); +} + + +/* + * End of "$Id: usersys.c 9969 2011-09-07 22:32:14Z mike $". + */ diff --git a/cups/utf8demo.txt b/cups/utf8demo.txt new file mode 100644 index 0000000..03802e4 --- /dev/null +++ b/cups/utf8demo.txt @@ -0,0 +1,213 @@ +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 £©µÀÆÖÞßéöÿ + –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд + ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi?⑀₂ἠḂӥẄɐː⍎אԱა + +Greetings in various languages: + + Hello world, Καλημέρα κόσμε, コンニチハ + +Box drawing alignment tests: █ + ▉ + ╔══╦══╗ ┌──┬──┐ ╭──┬──╮ ╭──┬──╮ ┏━━┳━━┓ ┎┒┏┑ ╷ ╻ ┏┯┓ ┌┰┐ ▊ ╱╲╱╲╳╳╳ + ║┌─╨─┐║ │╔═╧═╗│ │╒═╪═╕│ │╓─╁─╖│ ┃┌─╂─┐┃ ┗╃╄┙ ╶┼╴╺╋╸┠┼┨ ┝╋┥ ▋ ╲╱╲╱╳╳╳ + ║│╲ ╱│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╿ │┃ ┍╅╆┓ ╵ ╹ ┗┷┛ └┸┘ ▌ ╱╲╱╲╳╳╳ + ╠╡ ╳ ╞╣ ├╢ ╟┤ ├┼─┼─┼┤ ├╫─╂─╫┤ ┣┿╾┼╼┿┫ ┕┛┖┚ ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ + ║│╱ ╲│║ │║ ║│ ││ │ ││ │║ ┃ ║│ ┃│ ╽ │┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▎ + ║└─╥─┘║ │╚═╤═╝│ │╘═╪═╛│ │╙─╀─╜│ ┃└─╂─┘┃ ░░▒▒▓▓██ ┊ ┆ ╎ ╏ ┇ ┋ ▏ + ╚══╩══╝ └──┴──┘ ╰──┴──╯ ╰──┴──╯ ┗━━┻━━┛ ▗▄▖▛▀▜ └╌╌┘ ╎ ┗╍╍┛ ┋ ▁▂▃▄▅▆▇█ + ▝▀▘▙▄▟ + + diff --git a/cups/util.c b/cups/util.c new file mode 100644 index 0000000..743be20 --- /dev/null +++ b/cups/util.c @@ -0,0 +1,1813 @@ +/* + * "$Id: util.c 10262 2012-02-12 05:48:09Z mike $" + * + * Printing utilities for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsCancelJob() - Cancel a print job on the default server. + * cupsCancelJob2() - Cancel or purge a print job. + * cupsCreateJob() - Create an empty job for streaming. + * cupsFinishDocument() - Finish sending a document. + * cupsFreeJobs() - Free memory used by job data. + * cupsGetClasses() - Get a list of printer classes from the default + * server. + * cupsGetDefault() - Get the default printer or class for the default + * server. + * cupsGetDefault2() - Get the default printer or class for the specified + * server. + * cupsGetJobs() - Get the jobs from the default server. + * cupsGetJobs2() - Get the jobs from the specified server. + * cupsGetPPD() - Get the PPD file for a printer on the default + * server. + * cupsGetPPD2() - Get the PPD file for a printer from the specified + * server. + * cupsGetPPD3() - Get the PPD file for a printer on the specified + * server if it has changed. + * cupsGetPrinters() - Get a list of printers from the default server. + * cupsGetServerPPD() - Get an available PPD file from the server. + * cupsPrintFile() - Print a file to a printer or class on the default + * server. + * cupsPrintFile2() - Print a file to a printer or class on the + * specified server. + * cupsPrintFiles() - Print one or more files to a printer or class on + * the default server. + * cupsPrintFiles2() - Print one or more files to a printer or class on + * the specified server. + * cupsStartDocument() - Add a document to a job created with + * cupsCreateJob(). + * cups_get_printer_uri() - Get the printer-uri-supported attribute for the + * first printer in a class. + */ + +/* + * Include necessary headers... + */ + +#include "cups-private.h" +#include +#include +#if defined(WIN32) || defined(__EMX__) +# include +#else +# include +#endif /* WIN32 || __EMX__ */ + + +/* + * Local functions... + */ + +static int cups_get_printer_uri(http_t *http, const char *name, + char *host, int hostsize, int *port, + char *resource, int resourcesize, + int depth); + + +/* + * 'cupsCancelJob()' - Cancel a print job on the default server. + * + * Pass @code CUPS_JOBID_ALL@ to cancel all jobs or @code CUPS_JOBID_CURRENT@ + * to cancel the current job on the named destination. + * + * Use the @link cupsLastError@ and @link cupsLastErrorString@ functions to get + * the cause of any failure. + */ + +int /* O - 1 on success, 0 on failure */ +cupsCancelJob(const char *name, /* I - Name of printer or class */ + int job_id) /* I - Job ID, @code CUPS_JOBID_CURRENT@ for the current job, or @code CUPS_JOBID_ALL@ for all jobs */ +{ + return (cupsCancelJob2(CUPS_HTTP_DEFAULT, name, job_id, 0) + < IPP_REDIRECTION_OTHER_SITE); +} + + +/* + * 'cupsCancelJob2()' - Cancel or purge a print job. + * + * Canceled jobs remain in the job history while purged jobs are removed + * from the job history. + * + * Pass @code CUPS_JOBID_ALL@ to cancel all jobs or @code CUPS_JOBID_CURRENT@ + * to cancel the current job on the named destination. + * + * Use the @link cupsLastError@ and @link cupsLastErrorString@ functions to get + * the cause of any failure. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ipp_status_t /* O - IPP status */ +cupsCancelJob2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Name of printer or class */ + int job_id, /* I - Job ID, @code CUPS_JOBID_CURRENT@ for the current job, or @code CUPS_JOBID_ALL@ for all jobs */ + int purge) /* I - 1 to purge, 0 to cancel */ +{ + char uri[HTTP_MAX_URI]; /* Job/printer URI */ + ipp_t *request; /* IPP request */ + + + /* + * Range check input... + */ + + if (job_id < -1 || (!name && job_id == 0)) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + return (0); + } + + /* + * Connect to the default server as needed... + */ + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (IPP_SERVICE_UNAVAILABLE); + + /* + * Build an IPP_CANCEL_JOB or IPP_PURGE_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri or printer-uri + job-id + * requesting-user-name + * [purge-job] or [purge-jobs] + */ + + request = ippNewRequest(job_id < 0 ? IPP_PURGE_JOBS : IPP_CANCEL_JOB); + + if (name) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", ippPort(), "/printers/%s", name); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + } + else if (job_id > 0) + { + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", job_id); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + } + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + if (purge && job_id >= 0) + ippAddBoolean(request, IPP_TAG_OPERATION, "purge-job", 1); + else if (!purge && job_id < 0) + ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", 0); + + /* + * Do the request... + */ + + ippDelete(cupsDoRequest(http, request, "/jobs/")); + + return (cupsLastError()); +} + + +/* + * 'cupsCreateJob()' - Create an empty job for streaming. + * + * Use this function when you want to stream print data using the + * @link cupsStartDocument@, @link cupsWriteRequestData@, and + * @link cupsFinishDocument@ functions. If you have one or more files to + * print, use the @link cupsPrintFile2@ or @link cupsPrintFiles2@ function + * instead. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +int /* O - Job ID or 0 on error */ +cupsCreateJob( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Destination name */ + const char *title, /* I - Title of job */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + char printer_uri[1024], /* Printer URI */ + resource[1024]; /* Printer resource */ + ipp_t *request, /* Create-Job request */ + *response; /* Create-Job response */ + ipp_attribute_t *attr; /* job-id attribute */ + int job_id = 0; /* job-id value */ + + + DEBUG_printf(("cupsCreateJob(http=%p, name=\"%s\", title=\"%s\", " + "num_options=%d, options=%p)", + http, name, title, num_options, options)); + + /* + * Range check input... + */ + + if (!name) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + return (0); + } + + /* + * Build a Create-Job request... + */ + + if ((request = ippNewRequest(IPP_CREATE_JOB)) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0); + return (0); + } + + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", + NULL, "localhost", ippPort(), "/printers/%s", name); + snprintf(resource, sizeof(resource), "/printers/%s", name); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, printer_uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + if (title) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, + title); + cupsEncodeOptions(request, num_options, options); + + /* + * Send the request and get the job-id... + */ + + response = cupsDoRequest(http, request, resource); + + if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) != NULL) + job_id = attr->values[0].integer; + + ippDelete(response); + + /* + * Return it... + */ + + return (job_id); +} + + +/* + * 'cupsFinishDocument()' - Finish sending a document. + * + * The document must have been started using @link cupsStartDocument@. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +ipp_status_t /* O - Status of document submission */ +cupsFinishDocument(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name) /* I - Destination name */ +{ + char resource[1024]; /* Printer resource */ + + + snprintf(resource, sizeof(resource), "/printers/%s", name); + + ippDelete(cupsGetResponse(http, resource)); + + return (cupsLastError()); +} + + +/* + * 'cupsFreeJobs()' - Free memory used by job data. + */ + +void +cupsFreeJobs(int num_jobs, /* I - Number of jobs */ + cups_job_t *jobs) /* I - Jobs */ +{ + int i; /* Looping var */ + cups_job_t *job; /* Current job */ + + + if (num_jobs <= 0 || !jobs) + return; + + for (i = num_jobs, job = jobs; i > 0; i --, job ++) + { + _cupsStrFree(job->dest); + _cupsStrFree(job->user); + _cupsStrFree(job->format); + _cupsStrFree(job->title); + } + + free(jobs); +} + + +/* + * 'cupsGetClasses()' - Get a list of printer classes from the default server. + * + * This function is deprecated - use @link cupsGetDests@ instead. + * + * @deprecated@ + */ + +int /* O - Number of classes */ +cupsGetClasses(char ***classes) /* O - Classes */ +{ + int n; /* Number of classes */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + char **temp; /* Temporary pointer */ + http_t *http; /* Connection to server */ + + + if (!classes) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (0); + } + + *classes = NULL; + + if ((http = _cupsConnect()) == NULL) + return (0); + + /* + * Build a CUPS_GET_CLASSES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + */ + + request = ippNewRequest(CUPS_GET_CLASSES); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "printer-name"); + + /* + * Do the request and get back a response... + */ + + n = 0; + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + for (attr = response->attrs; attr != NULL; attr = attr->next) + if (attr->name != NULL && + _cups_strcasecmp(attr->name, "printer-name") == 0 && + attr->value_tag == IPP_TAG_NAME) + { + if (n == 0) + temp = malloc(sizeof(char *)); + else + temp = realloc(*classes, sizeof(char *) * (n + 1)); + + if (temp == NULL) + { + /* + * Ran out of memory! + */ + + while (n > 0) + { + n --; + free((*classes)[n]); + } + + free(*classes); + ippDelete(response); + return (0); + } + + *classes = temp; + temp[n] = strdup(attr->values[0].string.text); + n ++; + } + + ippDelete(response); + } + + return (n); +} + + +/* + * 'cupsGetDefault()' - Get the default printer or class for the default server. + * + * This function returns the default printer or class as defined by + * the LPDEST or PRINTER environment variables. If these environment + * variables are not set, the server default destination is returned. + * Applications should use the @link cupsGetDests@ and @link cupsGetDest@ + * functions to get the user-defined default printer, as this function does + * not support the lpoptions-defined default printer. + */ + +const char * /* O - Default printer or @code NULL@ */ +cupsGetDefault(void) +{ + /* + * Return the default printer... + */ + + return (cupsGetDefault2(CUPS_HTTP_DEFAULT)); +} + + +/* + * 'cupsGetDefault2()' - Get the default printer or class for the specified server. + * + * This function returns the default printer or class as defined by + * the LPDEST or PRINTER environment variables. If these environment + * variables are not set, the server default destination is returned. + * Applications should use the @link cupsGetDests@ and @link cupsGetDest@ + * functions to get the user-defined default printer, as this function does + * not support the lpoptions-defined default printer. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +const char * /* O - Default printer or @code NULL@ */ +cupsGetDefault2(http_t *http) /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ +{ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * See if we have a user default printer set... + */ + + if (_cupsUserDefault(cg->def_printer, sizeof(cg->def_printer))) + return (cg->def_printer); + + /* + * Connect to the server as needed... + */ + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (NULL); + + /* + * Build a CUPS_GET_DEFAULT request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + */ + + request = ippNewRequest(CUPS_GET_DEFAULT); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "printer-name", + IPP_TAG_NAME)) != NULL) + { + strlcpy(cg->def_printer, attr->values[0].string.text, + sizeof(cg->def_printer)); + ippDelete(response); + return (cg->def_printer); + } + + ippDelete(response); + } + + return (NULL); +} + + +/* + * 'cupsGetJobs()' - Get the jobs from the default server. + * + * A "whichjobs" value of @code CUPS_WHICHJOBS_ALL@ returns all jobs regardless + * of state, while @code CUPS_WHICHJOBS_ACTIVE@ returns jobs that are + * pending, processing, or held and @code CUPS_WHICHJOBS_COMPLETED@ returns + * jobs that are stopped, canceled, aborted, or completed. + */ + +int /* O - Number of jobs */ +cupsGetJobs(cups_job_t **jobs, /* O - Job data */ + const char *name, /* I - @code NULL@ = all destinations, otherwise show jobs for named destination */ + int myjobs, /* I - 0 = all users, 1 = mine */ + int whichjobs) /* I - @code CUPS_WHICHJOBS_ALL@, @code CUPS_WHICHJOBS_ACTIVE@, or @code CUPS_WHICHJOBS_COMPLETED@ */ +{ + /* + * Return the jobs... + */ + + return (cupsGetJobs2(CUPS_HTTP_DEFAULT, jobs, name, myjobs, whichjobs)); +} + + + +/* + * 'cupsGetJobs2()' - Get the jobs from the specified server. + * + * A "whichjobs" value of @code CUPS_WHICHJOBS_ALL@ returns all jobs regardless + * of state, while @code CUPS_WHICHJOBS_ACTIVE@ returns jobs that are + * pending, processing, or held and @code CUPS_WHICHJOBS_COMPLETED@ returns + * jobs that are stopped, canceled, aborted, or completed. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +int /* O - Number of jobs */ +cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + cups_job_t **jobs, /* O - Job data */ + const char *name, /* I - @code NULL@ = all destinations, otherwise show jobs for named destination */ + int myjobs, /* I - 0 = all users, 1 = mine */ + int whichjobs) /* I - @code CUPS_WHICHJOBS_ALL@, @code CUPS_WHICHJOBS_ACTIVE@, or @code CUPS_WHICHJOBS_COMPLETED@ */ +{ + int n; /* Number of jobs */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + cups_job_t *temp; /* Temporary pointer */ + int id, /* job-id */ + priority, /* job-priority */ + size; /* job-k-octets */ + ipp_jstate_t state; /* job-state */ + time_t completed_time, /* time-at-completed */ + creation_time, /* time-at-creation */ + processing_time; /* time-at-processing */ + const char *dest, /* job-printer-uri */ + *format, /* document-format */ + *title, /* job-name */ + *user; /* job-originating-user-name */ + char uri[HTTP_MAX_URI]; /* URI for jobs */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + static const char * const attrs[] = /* Requested attributes */ + { + "document-format", + "job-id", + "job-k-octets", + "job-name", + "job-originating-user-name", + "job-printer-uri", + "job-priority", + "job-state", + "time-at-completed", + "time-at-creation", + "time-at-processing" + }; + + + /* + * Range check input... + */ + + if (!jobs) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (-1); + } + + /* + * Get the right URI... + */ + + if (name) + { + if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", name) != HTTP_URI_OK) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1); + + return (-1); + } + } + else + strcpy(uri, "ipp://localhost/"); + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (-1); + + /* + * Build an IPP_GET_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * which-jobs + * my-jobs + * requested-attributes + */ + + request = ippNewRequest(IPP_GET_JOBS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + if (myjobs) + ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); + + if (whichjobs == CUPS_WHICHJOBS_COMPLETED) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "which-jobs", NULL, "completed"); + else if (whichjobs == CUPS_WHICHJOBS_ALL) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "which-jobs", NULL, "all"); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(attrs) / sizeof(attrs[0]), + NULL, attrs); + + /* + * Do the request and get back a response... + */ + + n = 0; + *jobs = NULL; + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + for (attr = response->attrs; attr; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr && attr->group_tag != IPP_TAG_JOB) + attr = attr->next; + + if (!attr) + break; + + /* + * Pull the needed attributes from this job... + */ + + id = 0; + size = 0; + priority = 50; + state = IPP_JOB_PENDING; + user = "unknown"; + dest = NULL; + format = "application/octet-stream"; + title = "untitled"; + creation_time = 0; + completed_time = 0; + processing_time = 0; + + while (attr && attr->group_tag == IPP_TAG_JOB) + { + if (!strcmp(attr->name, "job-id") && + attr->value_tag == IPP_TAG_INTEGER) + id = attr->values[0].integer; + else if (!strcmp(attr->name, "job-state") && + attr->value_tag == IPP_TAG_ENUM) + state = (ipp_jstate_t)attr->values[0].integer; + else if (!strcmp(attr->name, "job-priority") && + attr->value_tag == IPP_TAG_INTEGER) + priority = attr->values[0].integer; + else if (!strcmp(attr->name, "job-k-octets") && + attr->value_tag == IPP_TAG_INTEGER) + size = attr->values[0].integer; + else if (!strcmp(attr->name, "time-at-completed") && + attr->value_tag == IPP_TAG_INTEGER) + completed_time = attr->values[0].integer; + else if (!strcmp(attr->name, "time-at-creation") && + attr->value_tag == IPP_TAG_INTEGER) + creation_time = attr->values[0].integer; + else if (!strcmp(attr->name, "time-at-processing") && + attr->value_tag == IPP_TAG_INTEGER) + processing_time = attr->values[0].integer; + else if (!strcmp(attr->name, "job-printer-uri") && + attr->value_tag == IPP_TAG_URI) + { + if ((dest = strrchr(attr->values[0].string.text, '/')) != NULL) + dest ++; + } + else if (!strcmp(attr->name, "job-originating-user-name") && + attr->value_tag == IPP_TAG_NAME) + user = attr->values[0].string.text; + else if (!strcmp(attr->name, "document-format") && + attr->value_tag == IPP_TAG_MIMETYPE) + format = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-name") && + (attr->value_tag == IPP_TAG_TEXT || + attr->value_tag == IPP_TAG_NAME)) + title = attr->values[0].string.text; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (!dest || !id) + { + if (!attr) + break; + else + continue; + } + + /* + * Allocate memory for the job... + */ + + if (n == 0) + temp = malloc(sizeof(cups_job_t)); + else + temp = realloc(*jobs, sizeof(cups_job_t) * (n + 1)); + + if (!temp) + { + /* + * Ran out of memory! + */ + + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + cupsFreeJobs(n, *jobs); + *jobs = NULL; + + ippDelete(response); + + return (-1); + } + + *jobs = temp; + temp += n; + n ++; + + /* + * Copy the data over... + */ + + temp->dest = _cupsStrAlloc(dest); + temp->user = _cupsStrAlloc(user); + temp->format = _cupsStrAlloc(format); + temp->title = _cupsStrAlloc(title); + temp->id = id; + temp->priority = priority; + temp->state = state; + temp->size = size; + temp->completed_time = completed_time; + temp->creation_time = creation_time; + temp->processing_time = processing_time; + + if (!attr) + break; + } + + ippDelete(response); + } + + if (n == 0 && cg->last_error >= IPP_BAD_REQUEST) + return (-1); + else + return (n); +} + + +/* + * 'cupsGetPPD()' - Get the PPD file for a printer on the default server. + * + * For classes, @code cupsGetPPD@ returns the PPD file for the first printer + * in the class. + * + * The returned filename is stored in a static buffer and is overwritten with + * each call to @code cupsGetPPD@ or @link cupsGetPPD2@. The caller "owns" the + * file that is created and must @code unlink@ the returned filename. + */ + +const char * /* O - Filename for PPD file */ +cupsGetPPD(const char *name) /* I - Destination name */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + time_t modtime = 0; /* Modification time */ + + + /* + * Return the PPD file... + */ + + cg->ppd_filename[0] = '\0'; + + if (cupsGetPPD3(CUPS_HTTP_DEFAULT, name, &modtime, cg->ppd_filename, + sizeof(cg->ppd_filename)) == HTTP_OK) + return (cg->ppd_filename); + else + return (NULL); +} + + +/* + * 'cupsGetPPD2()' - Get the PPD file for a printer from the specified server. + * + * For classes, @code cupsGetPPD2@ returns the PPD file for the first printer + * in the class. + * + * The returned filename is stored in a static buffer and is overwritten with + * each call to @link cupsGetPPD@ or @code cupsGetPPD2@. The caller "owns" the + * file that is created and must @code unlink@ the returned filename. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +const char * /* O - Filename for PPD file */ +cupsGetPPD2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name) /* I - Destination name */ +{ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + time_t modtime = 0; /* Modification time */ + + + cg->ppd_filename[0] = '\0'; + + if (cupsGetPPD3(http, name, &modtime, cg->ppd_filename, + sizeof(cg->ppd_filename)) == HTTP_OK) + return (cg->ppd_filename); + else + return (NULL); +} + + +/* + * 'cupsGetPPD3()' - Get the PPD file for a printer on the specified + * server if it has changed. + * + * The "modtime" parameter contains the modification time of any + * locally-cached content and is updated with the time from the PPD file on + * the server. + * + * The "buffer" parameter contains the local PPD filename. If it contains + * the empty string, a new temporary file is created, otherwise the existing + * file will be overwritten as needed. The caller "owns" the file that is + * created and must @code unlink@ the returned filename. + * + * On success, @code HTTP_OK@ is returned for a new PPD file and + * @code HTTP_NOT_MODIFIED@ if the existing PPD file is up-to-date. Any other + * status is an error. + * + * For classes, @code cupsGetPPD3@ returns the PPD file for the first printer + * in the class. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +http_status_t /* O - HTTP status */ +cupsGetPPD3(http_t *http, /* I - HTTP connection or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Destination name */ + time_t *modtime, /* IO - Modification time */ + char *buffer, /* I - Filename buffer */ + size_t bufsize) /* I - Size of filename buffer */ +{ + int http_port; /* Port number */ + char http_hostname[HTTP_MAX_HOST]; + /* Hostname associated with connection */ + http_t *http2; /* Alternate HTTP connection */ + int fd; /* PPD file */ + char localhost[HTTP_MAX_URI],/* Local hostname */ + hostname[HTTP_MAX_URI], /* Hostname */ + resource[HTTP_MAX_URI]; /* Resource name */ + int port; /* Port number */ + http_status_t status; /* HTTP status from server */ + char tempfile[1024] = ""; /* Temporary filename */ + _cups_globals_t *cg = _cupsGlobals(); /* Pointer to library globals */ + + + /* + * Range check input... + */ + + DEBUG_printf(("cupsGetPPD3(http=%p, name=\"%s\", modtime=%p(%d), buffer=%p, " + "bufsize=%d)", http, name, modtime, + modtime ? (int)*modtime : 0, buffer, (int)bufsize)); + + if (!name) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("No printer name"), 1); + return (HTTP_NOT_ACCEPTABLE); + } + + if (!modtime) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("No modification time"), 1); + return (HTTP_NOT_ACCEPTABLE); + } + + if (!buffer || bufsize <= 1) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Bad filename buffer"), 1); + return (HTTP_NOT_ACCEPTABLE); + } + +#ifndef WIN32 + /* + * See if the PPD file is available locally... + */ + + if (!cg->servername[0]) + cupsServer(); + + if (!_cups_strcasecmp(cg->servername, "localhost")) + { + char ppdname[1024]; /* PPD filename */ + struct stat ppdinfo; /* PPD file information */ + + + snprintf(ppdname, sizeof(ppdname), "%s/ppd/%s.ppd", cg->cups_serverroot, + name); + if (!stat(ppdname, &ppdinfo)) + { + /* + * OK, the file exists, use it! + */ + + if (buffer[0]) + { + unlink(buffer); + + if (symlink(ppdname, buffer) && errno != EEXIST) + { + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + return (HTTP_SERVER_ERROR); + } + } + else + { + int tries; /* Number of tries */ + const char *tmpdir; /* TMPDIR environment variable */ + struct timeval curtime; /* Current time */ + + /* + * Previously we put root temporary files in the default CUPS temporary + * directory under /var/spool/cups. However, since the scheduler cleans + * out temporary files there and runs independently of the user apps, we + * don't want to use it unless specifically told to by cupsd. + */ + + if ((tmpdir = getenv("TMPDIR")) == NULL) +# ifdef __APPLE__ + tmpdir = "/private/tmp"; /* /tmp is a symlink to /private/tmp */ +# else + tmpdir = "/tmp"; +# endif /* __APPLE__ */ + + /* + * Make the temporary name using the specified directory... + */ + + tries = 0; + + do + { + /* + * Get the current time of day... + */ + + gettimeofday(&curtime, NULL); + + /* + * Format a string using the hex time values... + */ + + snprintf(buffer, bufsize, "%s/%08lx%05lx", tmpdir, + (unsigned long)curtime.tv_sec, + (unsigned long)curtime.tv_usec); + + /* + * Try to make a symlink... + */ + + if (!symlink(ppdname, buffer)) + break; + + tries ++; + } + while (tries < 1000); + + if (tries >= 1000) + { + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + return (HTTP_SERVER_ERROR); + } + } + + if (*modtime >= ppdinfo.st_mtime) + return (HTTP_NOT_MODIFIED); + else + { + *modtime = ppdinfo.st_mtime; + return (HTTP_OK); + } + } + } +#endif /* !WIN32 */ + + /* + * Try finding a printer URI for this printer... + */ + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (HTTP_SERVICE_UNAVAILABLE); + + if (!cups_get_printer_uri(http, name, hostname, sizeof(hostname), &port, + resource, sizeof(resource), 0)) + return (HTTP_NOT_FOUND); + + DEBUG_printf(("2cupsGetPPD3: Printer hostname=\"%s\", port=%d", hostname, + port)); + + /* + * Remap local hostname to localhost... + */ + + httpGetHostname(NULL, localhost, sizeof(localhost)); + + DEBUG_printf(("2cupsGetPPD3: Local hostname=\"%s\"", localhost)); + + if (!_cups_strcasecmp(localhost, hostname)) + strcpy(hostname, "localhost"); + + /* + * Get the hostname and port number we are connected to... + */ + + httpGetHostname(http, http_hostname, sizeof(http_hostname)); + http_port = _httpAddrPort(http->hostaddr); + + DEBUG_printf(("2cupsGetPPD3: Connection hostname=\"%s\", port=%d", + http_hostname, http_port)); + + /* + * Reconnect to the correct server as needed... + */ + + if (!_cups_strcasecmp(http_hostname, hostname) && port == http_port) + http2 = http; + else if ((http2 = httpConnectEncrypt(hostname, port, + cupsEncryption())) == NULL) + if ((http2 = httpConnectEncrypt(http_hostname, http_port, + cupsEncryption())) == NULL) + { + DEBUG_puts("1cupsGetPPD3: Unable to connect to server"); + + return (HTTP_SERVICE_UNAVAILABLE); + } + + /* + * Get a temp file... + */ + + if (buffer[0]) + fd = open(buffer, O_CREAT | O_TRUNC | O_WRONLY, 0600); + else + fd = cupsTempFd(tempfile, sizeof(tempfile)); + + if (fd < 0) + { + /* + * Can't open file; close the server connection and return NULL... + */ + + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + if (http2 != http) + httpClose(http2); + + return (HTTP_SERVER_ERROR); + } + + /* + * And send a request to the HTTP server... + */ + + strlcat(resource, ".ppd", sizeof(resource)); + + if (*modtime > 0) + httpSetField(http2, HTTP_FIELD_IF_MODIFIED_SINCE, + httpGetDateString(*modtime)); + + status = cupsGetFd(http2, resource, fd); + + close(fd); + + /* + * See if we actually got the file or an error... + */ + + if (status == HTTP_OK) + { + *modtime = httpGetDateTime(httpGetField(http2, HTTP_FIELD_DATE)); + + if (tempfile[0]) + strlcpy(buffer, tempfile, bufsize); + } + else if (status != HTTP_NOT_MODIFIED) + { + _cupsSetHTTPError(status); + + if (buffer[0]) + unlink(buffer); + else if (tempfile[0]) + unlink(tempfile); + } + else if (tempfile[0]) + unlink(tempfile); + + if (http2 != http) + httpClose(http2); + + /* + * Return the PPD file... + */ + + DEBUG_printf(("1cupsGetPPD3: Returning status %d", status)); + + return (status); +} + + +/* + * 'cupsGetPrinters()' - Get a list of printers from the default server. + * + * This function is deprecated - use @link cupsGetDests@ instead. + * + * @deprecated@ + */ + +int /* O - Number of printers */ +cupsGetPrinters(char ***printers) /* O - Printers */ +{ + int n; /* Number of printers */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + char **temp; /* Temporary pointer */ + http_t *http; /* Connection to server */ + + + /* + * Range check input... + */ + + if (!printers) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (0); + } + + *printers = NULL; + + /* + * Try to connect to the server... + */ + + if ((http = _cupsConnect()) == NULL) + return (0); + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "printer-name"); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type", 0); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type-mask", CUPS_PRINTER_CLASS); + + /* + * Do the request and get back a response... + */ + + n = 0; + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + for (attr = response->attrs; attr != NULL; attr = attr->next) + if (attr->name != NULL && + _cups_strcasecmp(attr->name, "printer-name") == 0 && + attr->value_tag == IPP_TAG_NAME) + { + if (n == 0) + temp = malloc(sizeof(char *)); + else + temp = realloc(*printers, sizeof(char *) * (n + 1)); + + if (temp == NULL) + { + /* + * Ran out of memory! + */ + + while (n > 0) + { + n --; + free((*printers)[n]); + } + + free(*printers); + ippDelete(response); + return (0); + } + + *printers = temp; + temp[n] = strdup(attr->values[0].string.text); + n ++; + } + + ippDelete(response); + } + + return (n); +} + + +/* + * 'cupsGetServerPPD()' - Get an available PPD file from the server. + * + * This function returns the named PPD file from the server. The + * list of available PPDs is provided by the IPP @code CUPS_GET_PPDS@ + * operation. + * + * You must remove (unlink) the PPD file when you are finished with + * it. The PPD filename is stored in a static location that will be + * overwritten on the next call to @link cupsGetPPD@, @link cupsGetPPD2@, + * or @link cupsGetServerPPD@. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +char * /* O - Name of PPD file or @code NULL@ on error */ +cupsGetServerPPD(http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name) /* I - Name of PPD file ("ppd-name") */ +{ + int fd; /* PPD file descriptor */ + ipp_t *request; /* IPP request */ + _cups_globals_t *cg = _cupsGlobals(); + /* Pointer to library globals */ + + + /* + * Range check input... + */ + + if (!name) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("No PPD name"), 1); + + return (NULL); + } + + if (!http) + if ((http = _cupsConnect()) == NULL) + return (NULL); + + /* + * Get a temp file... + */ + + if ((fd = cupsTempFd(cg->ppd_filename, sizeof(cg->ppd_filename))) < 0) + { + /* + * Can't open file; close the server connection and return NULL... + */ + + _cupsSetError(IPP_INTERNAL_ERROR, NULL, 0); + + return (NULL); + } + + /* + * Get the PPD file... + */ + + request = ippNewRequest(CUPS_GET_PPD); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name", NULL, + name); + + ippDelete(cupsDoIORequest(http, request, "/", -1, fd)); + + close(fd); + + if (cupsLastError() != IPP_OK) + { + unlink(cg->ppd_filename); + return (NULL); + } + else + return (cg->ppd_filename); +} + + +/* + * 'cupsPrintFile()' - Print a file to a printer or class on the default server. + */ + +int /* O - Job ID or 0 on error */ +cupsPrintFile(const char *name, /* I - Destination name */ + const char *filename, /* I - File to print */ + const char *title, /* I - Title of job */ + int num_options,/* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + DEBUG_printf(("cupsPrintFile(name=\"%s\", filename=\"%s\", " + "title=\"%s\", num_options=%d, options=%p)", + name, filename, title, num_options, options)); + + return (cupsPrintFiles2(CUPS_HTTP_DEFAULT, name, 1, &filename, title, + num_options, options)); +} + + +/* + * 'cupsPrintFile2()' - Print a file to a printer or class on the specified + * server. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +int /* O - Job ID or 0 on error */ +cupsPrintFile2( + http_t *http, /* I - Connection to server */ + const char *name, /* I - Destination name */ + const char *filename, /* I - File to print */ + const char *title, /* I - Title of job */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + DEBUG_printf(("cupsPrintFile2(http=%p, name=\"%s\", filename=\"%s\", " + "title=\"%s\", num_options=%d, options=%p)", + http, name, filename, title, num_options, options)); + + return (cupsPrintFiles2(http, name, 1, &filename, title, num_options, + options)); +} + + +/* + * 'cupsPrintFiles()' - Print one or more files to a printer or class on the + * default server. + */ + +int /* O - Job ID or 0 on error */ +cupsPrintFiles( + const char *name, /* I - Destination name */ + int num_files, /* I - Number of files */ + const char **files, /* I - File(s) to print */ + const char *title, /* I - Title of job */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + DEBUG_printf(("cupsPrintFiles(name=\"%s\", num_files=%d, " + "files=%p, title=\"%s\", num_options=%d, options=%p)", + name, num_files, files, title, num_options, options)); + + /* + * Print the file(s)... + */ + + return (cupsPrintFiles2(CUPS_HTTP_DEFAULT, name, num_files, files, title, + num_options, options)); +} + + +/* + * 'cupsPrintFiles2()' - Print one or more files to a printer or class on the + * specified server. + * + * @since CUPS 1.1.21/Mac OS X 10.4@ + */ + +int /* O - Job ID or 0 on error */ +cupsPrintFiles2( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Destination name */ + int num_files, /* I - Number of files */ + const char **files, /* I - File(s) to print */ + const char *title, /* I - Title of job */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + int i; /* Looping var */ + int job_id; /* New job ID */ + const char *docname; /* Basename of current filename */ + const char *format; /* Document format */ + cups_file_t *fp; /* Current file */ + char buffer[8192]; /* Copy buffer */ + ssize_t bytes; /* Bytes in buffer */ + http_status_t status; /* Status of write */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + ipp_status_t cancel_status; /* Status code to preserve */ + char *cancel_message; /* Error message to preserve */ + + + DEBUG_printf(("cupsPrintFiles2(http=%p, name=\"%s\", num_files=%d, " + "files=%p, title=\"%s\", num_options=%d, options=%p)", + http, name, num_files, files, title, num_options, options)); + + /* + * Range check input... + */ + + if (!name || num_files < 1 || !files) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(EINVAL), 0); + + return (0); + } + + /* + * Create the print job... + */ + + if ((job_id = cupsCreateJob(http, name, title, num_options, options)) == 0) + return (0); + + /* + * Send each of the files... + */ + + if (cupsGetOption("raw", num_options, options)) + format = CUPS_FORMAT_RAW; + else if ((format = cupsGetOption("document-format", num_options, + options)) == NULL) + format = CUPS_FORMAT_AUTO; + + for (i = 0; i < num_files; i ++) + { + /* + * Start the next file... + */ + + if ((docname = strrchr(files[i], '/')) != NULL) + docname ++; + else + docname = files[i]; + + if ((fp = cupsFileOpen(files[i], "rb")) == NULL) + { + /* + * Unable to open print file, cancel the job and return... + */ + + _cupsSetError(IPP_DOCUMENT_ACCESS_ERROR, NULL, 0); + goto cancel_job; + } + + status = cupsStartDocument(http, name, job_id, docname, format, + i == (num_files - 1)); + + while (status == HTTP_CONTINUE && + (bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) + status = cupsWriteRequestData(http, buffer, bytes); + + cupsFileClose(fp); + + if (status != HTTP_CONTINUE || cupsFinishDocument(http, name) != IPP_OK) + { + /* + * Unable to queue, cancel the job and return... + */ + + goto cancel_job; + } + } + + return (job_id); + + /* + * If we get here, something happened while sending the print job so we need + * to cancel the job without setting the last error (since we need to preserve + * the current error... + */ + + cancel_job: + + cancel_status = cg->last_error; + cancel_message = cg->last_status_message ? + _cupsStrRetain(cg->last_status_message) : NULL; + + cupsCancelJob2(http, name, job_id, 0); + + cg->last_error = cancel_status; + cg->last_status_message = cancel_message; + + return (0); +} + + +/* + * 'cupsStartDocument()' - Add a document to a job created with cupsCreateJob(). + * + * Use @link cupsWriteRequestData@ to write data for the document and + * @link cupsFinishDocument@ to finish the document and get the submission status. + * + * The MIME type constants @code CUPS_FORMAT_AUTO@, @code CUPS_FORMAT_PDF@, + * @code CUPS_FORMAT_POSTSCRIPT@, @code CUPS_FORMAT_RAW@, and + * @code CUPS_FORMAT_TEXT@ are provided for the "format" argument, although + * any supported MIME type string can be supplied. + * + * @since CUPS 1.4/Mac OS X 10.6@ + */ + +http_status_t /* O - HTTP status of request */ +cupsStartDocument( + http_t *http, /* I - Connection to server or @code CUPS_HTTP_DEFAULT@ */ + const char *name, /* I - Destination name */ + int job_id, /* I - Job ID from @link cupsCreateJob@ */ + const char *docname, /* I - Name of document */ + const char *format, /* I - MIME type or @code CUPS_FORMAT_foo@ */ + int last_document) /* I - 1 for last document in job, 0 otherwise */ +{ + char resource[1024], /* Resource for destinatio */ + printer_uri[1024]; /* Printer URI */ + ipp_t *request; /* Send-Document request */ + http_status_t status; /* HTTP status */ + + + /* + * Create a Send-Document request... + */ + + if ((request = ippNewRequest(IPP_SEND_DOCUMENT)) == NULL) + { + _cupsSetError(IPP_INTERNAL_ERROR, strerror(ENOMEM), 0); + return (0); + } + + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), "ipp", + NULL, "localhost", ippPort(), "/printers/%s", name); + snprintf(resource, sizeof(resource), "/printers/%s", name); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, printer_uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job_id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + if (docname) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "document-name", + NULL, docname); + if (format) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, format); + ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", last_document); + + /* + * Send and delete the request, then return the status... + */ + + status = cupsSendRequest(http, request, resource, CUPS_LENGTH_VARIABLE); + + ippDelete(request); + + return (status); +} + + +/* + * 'cups_get_printer_uri()' - Get the printer-uri-supported attribute for the + * first printer in a class. + */ + +static int /* O - 1 on success, 0 on failure */ +cups_get_printer_uri( + http_t *http, /* I - Connection to server */ + const char *name, /* I - Name of printer or class */ + char *host, /* I - Hostname buffer */ + int hostsize, /* I - Size of hostname buffer */ + int *port, /* O - Port number */ + char *resource, /* I - Resource buffer */ + int resourcesize, /* I - Size of resource buffer */ + int depth) /* I - Depth of query */ +{ + int i; /* Looping var */ + int http_port; /* Port number */ + http_t *http2; /* Alternate HTTP connection */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* Current attribute */ + char uri[HTTP_MAX_URI], /* printer-uri attribute */ + scheme[HTTP_MAX_URI], /* Scheme name */ + username[HTTP_MAX_URI], /* Username:password */ + classname[255], /* Temporary class name */ + http_hostname[HTTP_MAX_HOST]; + /* Hostname associated with connection */ + static const char * const requested_attrs[] = + { /* Requested attributes */ + "member-uris", + "printer-uri-supported", + "printer-type" + }; + + + DEBUG_printf(("7cups_get_printer_uri(http=%p, name=\"%s\", host=%p, " + "hostsize=%d, resource=%p, resourcesize=%d, depth=%d)", + http, name, host, hostsize, resource, resourcesize, depth)); + + /* + * Setup the printer URI... + */ + + if (httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", name) != HTTP_URI_OK) + { + _cupsSetError(IPP_INTERNAL_ERROR, _("Unable to create printer-uri"), 1); + + *host = '\0'; + *resource = '\0'; + + return (0); + } + + DEBUG_printf(("9cups_get_printer_uri: printer-uri=\"%s\"", uri)); + + /* + * Get the hostname and port number we are connected to... + */ + + httpGetHostname(http, http_hostname, sizeof(http_hostname)); + http_port = _httpAddrPort(http->hostaddr); + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requested-attributes + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requested-attributes", + sizeof(requested_attrs) / sizeof(requested_attrs[0]), + NULL, requested_attrs); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/")) != NULL) + { + if ((attr = ippFindAttribute(response, "member-uris", IPP_TAG_URI)) != NULL) + { + /* + * Get the first actual printer name in the class... + */ + + for (i = 0; i < attr->num_values; i ++) + { + httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, + scheme, sizeof(scheme), username, sizeof(username), + host, hostsize, port, resource, resourcesize); + if (!strncmp(resource, "/printers/", 10)) + { + /* + * Found a printer! + */ + + ippDelete(response); + + return (1); + } + } + + /* + * No printers in this class - try recursively looking for a printer, + * but not more than 3 levels deep... + */ + + if (depth < 3) + { + for (i = 0; i < attr->num_values; i ++) + { + httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, + scheme, sizeof(scheme), username, sizeof(username), + host, hostsize, port, resource, resourcesize); + if (!strncmp(resource, "/classes/", 9)) + { + /* + * Found a class! Connect to the right server... + */ + + if (!_cups_strcasecmp(http_hostname, host) && *port == http_port) + http2 = http; + else if ((http2 = httpConnectEncrypt(host, *port, + cupsEncryption())) == NULL) + { + DEBUG_puts("8cups_get_printer_uri: Unable to connect to server"); + + continue; + } + + /* + * Look up printers on that server... + */ + + strlcpy(classname, resource + 9, sizeof(classname)); + + cups_get_printer_uri(http2, classname, host, hostsize, port, + resource, resourcesize, depth + 1); + + /* + * Close the connection as needed... + */ + + if (http2 != http) + httpClose(http2); + + if (*host) + return (1); + } + } + } + } + else if ((attr = ippFindAttribute(response, "printer-uri-supported", + IPP_TAG_URI)) != NULL) + { + httpSeparateURI(HTTP_URI_CODING_ALL, + _httpResolveURI(attr->values[0].string.text, uri, + sizeof(uri), _HTTP_RESOLVE_DEFAULT, + NULL, NULL), + scheme, sizeof(scheme), username, sizeof(username), + host, hostsize, port, resource, resourcesize); + ippDelete(response); + + if (!strncmp(resource, "/classes/", 9)) + { + _cupsSetError(IPP_INTERNAL_ERROR, + _("No printer-uri found for class"), 1); + + *host = '\0'; + *resource = '\0'; + + return (0); + } + + return (1); + } + + ippDelete(response); + } + + if (cupsLastError() != IPP_NOT_FOUND) + _cupsSetError(IPP_INTERNAL_ERROR, _("No printer-uri found"), 1); + + *host = '\0'; + *resource = '\0'; + + return (0); +} + + +/* + * End of "$Id: util.c 10262 2012-02-12 05:48:09Z mike $". + */ diff --git a/cups/versioning.h b/cups/versioning.h new file mode 100644 index 0000000..39d01d3 --- /dev/null +++ b/cups/versioning.h @@ -0,0 +1,85 @@ +/* + * "$Id: versioning.h 9230 2010-08-10 00:02:02Z mike $" + * + * API versioning definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_VERSIONING_H_ +# define _CUPS_VERSIONING_H_ + +/* + * This header defines several constants - _CUPS_DEPRECATED, + * _CUPS_API_1_1, _CUPS_API_1_1_19, _CUPS_API_1_1_20, _CUPS_API_1_1_21, + * _CUPS_API_1_2, _CUPS_API_1_3, _CUPS_API_1_4, _CUPS_API_1_5 - which add + * compiler-specific attributes that flag functions that are deprecated or added + * in particular releases. + * + * On Mac OS X, the _CUPS_API_* constants are defined based on the values of + * the MAC_OS_X_VERSION_MIN_ALLOWED and MAC_OS_X_VERSION_MAX_ALLOWED constants + * provided by the compiler. + */ + +# if defined(__APPLE__) && !defined(_CUPS_SOURCE) +# include +# ifndef AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER +# define AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER __attribute__((unavailable)) +# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER */ +# ifndef AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER +# define AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER __attribute__((unavailable)) +# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER */ +# ifndef AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER +# define AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER __attribute__((unavailable)) +# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER */ +# ifndef AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +# define AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER __attribute__((unavailable)) +# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER */ +# ifndef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER +# define AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER __attribute__((unavailable)) +# endif /* !AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER */ +# define _CUPS_API_1_1_19 AVAILABLE_MAC_OS_X_VERSION_10_3_AND_LATER +# define _CUPS_API_1_1_20 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER +# define _CUPS_API_1_1_21 AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER +# define _CUPS_API_1_2 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER +# define _CUPS_API_1_3 AVAILABLE_MAC_OS_X_VERSION_10_5_AND_LATER +# define _CUPS_API_1_4 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER +# define _CUPS_API_1_5 AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER +# else +# define _CUPS_API_1_1_19 +# define _CUPS_API_1_1_20 +# define _CUPS_API_1_1_21 +# define _CUPS_API_1_2 +# define _CUPS_API_1_3 +# define _CUPS_API_1_4 +# define _CUPS_API_1_5 +# endif /* __APPLE__ && !_CUPS_SOURCE */ + +/* + * With GCC 3.0 and higher, we can mark old APIs "deprecated" so you get + * a warning at compile-time. + */ + +# if defined(__GNUC__) && __GNUC__ > 2 +# define _CUPS_DEPRECATED __attribute__ ((__deprecated__)) +# else +# define _CUPS_DEPRECATED +# endif /* __GNUC__ && __GNUC__ > 2 */ + +# ifndef __GNUC__ +# define __attribute__(x) +# endif /* !__GNUC__ */ + +#endif /* !_CUPS_VERSIONING_H_ */ + +/* + * End of "$Id: versioning.h 9230 2010-08-10 00:02:02Z mike $". + */ diff --git a/data/Makefile b/data/Makefile new file mode 100644 index 0000000..fa4d247 --- /dev/null +++ b/data/Makefile @@ -0,0 +1,166 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Datafile makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Data files... +# + +BANNERS = \ + classified \ + confidential \ + secret \ + standard \ + topsecret \ + unclassified + +CHARSETS = \ + utf-8 + +DATAFILES = \ + psglyphs \ + testprint + +PPDCFILES = \ + epson.h \ + escp.h \ + font.defs \ + hp.h \ + label.h \ + media.defs \ + pcl.h \ + raster.defs + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + $(INSTALL_DIR) -m 755 $(DATADIR)/banners + for file in $(BANNERS); do \ + $(INSTALL_DATA) $$file $(DATADIR)/banners; \ + done + $(INSTALL_DIR) -m 755 $(DATADIR)/charsets + if test "x$(BANNERTOPS)" != x -o "x$(TEXTTOPS)" != x; then \ + for file in $(CHARSETS); do \ + $(INSTALL_DATA) $$file $(DATADIR)/charsets; \ + done; \ + fi + $(INSTALL_DIR) -m 755 $(DATADIR)/data + for file in $(DATAFILES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/data; \ + done + $(INSTALL_DIR) -m 755 $(DATADIR)/model + $(INSTALL_DIR) -m 755 $(DATADIR)/ppdc + for file in $(PPDCFILES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/ppdc; \ + done + $(INSTALL_DIR) -m 755 $(DATADIR)/profiles + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + for file in $(BANNERS); do \ + $(RM) $(DATADIR)/banners/$$file; \ + done + for file in $(CHARSETS); do \ + $(RM) $(DATADIR)/charsets/$$file; \ + done + for file in $(DATAFILES); do \ + $(RM) $(DATADIR)/data/$$file; \ + done + for file in $(PPDCFILES); do \ + $(RM) $(DATADIR)/ppdc/$$file; \ + done + -$(RMDIR) $(DATADIR)/profiles + -$(RMDIR) $(DATADIR)/ppdc + -$(RMDIR) $(DATADIR)/model + -$(RMDIR) $(DATADIR)/data + -$(RMDIR) $(DATADIR)/charsets + -$(RMDIR) $(DATADIR)/banners + -$(RMDIR) $(DATADIR) + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/data/classified b/data/classified new file mode 100644 index 0000000..ca01a13 --- /dev/null +++ b/data/classified @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Classified +Footer Classified +Image images/cups.png + diff --git a/data/confidential b/data/confidential new file mode 100644 index 0000000..f1f0d85 --- /dev/null +++ b/data/confidential @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Confidential +Footer Confidential +Image images/cups.png + diff --git a/data/cups.irix b/data/cups.irix new file mode 100644 index 0000000..476383a --- /dev/null +++ b/data/cups.irix @@ -0,0 +1,3 @@ +#%PAM-1.0 +auth required pam_unix.so shadow nodelay nullok +account required pam_unix.so diff --git a/data/cups.pam b/data/cups.pam new file mode 100644 index 0000000..f38e701 --- /dev/null +++ b/data/cups.pam @@ -0,0 +1,2 @@ +auth required /lib/security/pam_pwdb.so nullok shadow +account required /lib/security/pam_pwdb.so diff --git a/data/cups.suse b/data/cups.suse new file mode 100644 index 0000000..a9369e1 --- /dev/null +++ b/data/cups.suse @@ -0,0 +1,2 @@ +auth required pam_unix2.so nullok shadow +account required pam_unix2.so diff --git a/data/epson.h b/data/epson.h new file mode 100644 index 0000000..8f6d2c3 --- /dev/null +++ b/data/epson.h @@ -0,0 +1,27 @@ +/* + * "$Id: epson.h 7304 2008-02-14 01:52:22Z mike $" + * + * This file contains model number definitions for the CUPS sample + * ESC/P driver. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#define EPSON_9PIN 0 /* 9-pin dot matrix */ +#define EPSON_24PIN 1 /* 24-pin dot matrix */ +#define EPSON_COLOR 2 /* Epson Stylus Color with ESC . */ +#define EPSON_PHOTO 3 /* Epson Stylus Photo with ESC . */ +#define EPSON_ICOLOR 4 /* Epson Stylus Color with ESC i */ +#define EPSON_IPHOTO 5 /* Epson Stylus Photo with ESC i */ + + +/* + * End of "$Id: epson.h 7304 2008-02-14 01:52:22Z mike $". + */ diff --git a/data/escp.h b/data/escp.h new file mode 100644 index 0000000..096ee56 --- /dev/null +++ b/data/escp.h @@ -0,0 +1,34 @@ +/* + * "$Id: escp.h 7304 2008-02-14 01:52:22Z mike $" + * + * This file contains model number definitions for the CUPS unified + * ESC/P driver. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* General ESC/P Support */ +#define ESCP_DOTMATRIX 0x1 /* Dot matrix printer? */ +#define ESCP_MICROWEAVE 0x2 /* Use microweave command? */ +#define ESCP_STAGGER 0x4 /* Are color jets staggered? */ +#define ESCP_ESCK 0x8 /* Use print mode command?*/ +#define ESCP_EXT_UNITS 0x10 /* Use extended unit commands? */ +#define ESCP_EXT_MARGINS 0x20 /* Use extended margin command */ +#define ESCP_USB 0x40 /* Send USB packet mode escape? */ +#define ESCP_PAGE_SIZE 0x80 /* Use page size command */ +#define ESCP_RASTER_ESCI 0x100 /* Use ESC i graphics command */ + +/* Remote mode support */ +#define ESCP_REMOTE 0x1000 /* Use remote mode commands? */ + + +/* + * End of "$Id: escp.h 7304 2008-02-14 01:52:22Z mike $". + */ diff --git a/data/font.defs b/data/font.defs new file mode 100644 index 0000000..ee4559e --- /dev/null +++ b/data/font.defs @@ -0,0 +1,55 @@ +/* + * "$Id: font.defs 343 2007-07-13 19:52:48Z mike $" + * + * Standard ESP Ghostscript font definitions for the CUPS PPD file + * compiler. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#font AvantGarde-Book Standard "(1.05)" Standard ROM +#font AvantGarde-BookOblique Standard "(1.05)" Standard ROM +#font AvantGarde-Demi Standard "(1.05)" Standard ROM +#font AvantGarde-DemiOblique Standard "(1.05)" Standard ROM +#font Bookman-Demi Standard "(1.05)" Standard ROM +#font Bookman-DemiItalic Standard "(1.05)" Standard ROM +#font Bookman-Light Standard "(1.05)" Standard ROM +#font Bookman-LightItalic Standard "(1.05)" Standard ROM +#font Courier Standard "(1.05)" Standard ROM +#font Courier-Bold Standard "(1.05)" Standard ROM +#font Courier-BoldOblique Standard "(1.05)" Standard ROM +#font Courier-Oblique Standard "(1.05)" Standard ROM +#font Helvetica Standard "(1.05)" Standard ROM +#font Helvetica-Bold Standard "(1.05)" Standard ROM +#font Helvetica-BoldOblique Standard "(1.05)" Standard ROM +#font Helvetica-Narrow Standard "(1.05)" Standard ROM +#font Helvetica-Narrow-Bold Standard "(1.05)" Standard ROM +#font Helvetica-Narrow-BoldOblique Standard "(1.05)" Standard ROM +#font Helvetica-Narrow-Oblique Standard "(1.05)" Standard ROM +#font Helvetica-Oblique Standard "(1.05)" Standard ROM +#font NewCenturySchlbk-Bold Standard "(1.05)" Standard ROM +#font NewCenturySchlbk-BoldItalic Standard "(1.05)" Standard ROM +#font NewCenturySchlbk-Italic Standard "(1.05)" Standard ROM +#font NewCenturySchlbk-Roman Standard "(1.05)" Standard ROM +#font Palatino-Bold Standard "(1.05)" Standard ROM +#font Palatino-BoldItalic Standard "(1.05)" Standard ROM +#font Palatino-Italic Standard "(1.05)" Standard ROM +#font Palatino-Roman Standard "(1.05)" Standard ROM +#font Symbol Special "(001.005)" Special ROM +#font Times-Bold Standard "(1.05)" Standard ROM +#font Times-BoldItalic Standard "(1.05)" Standard ROM +#font Times-Italic Standard "(1.05)" Standard ROM +#font Times-Roman Standard "(1.05)" Standard ROM +#font ZapfChancery-MediumItalic Standard "(1.05)" Standard ROM +#font ZapfDingbats Special "(001.005)" Special ROM + +/* + * End of "$Id: font.defs 343 2007-07-13 19:52:48Z mike $". + */ diff --git a/data/hp.h b/data/hp.h new file mode 100644 index 0000000..f6938fd --- /dev/null +++ b/data/hp.h @@ -0,0 +1,24 @@ +/* + * "$Id: hp.h 7304 2008-02-14 01:52:22Z mike $" + * + * This file contains model number definitions for the CUPS sample + * HP driver. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#define HP_LASERJET 0 /* HP LaserJet */ +#define HP_DESKJET 1 /* HP DeskJet with simple color */ +#define HP_DESKJET2 2 /* HP DeskJet with CRet color */ + + +/* + * End of "$Id: hp.h 7304 2008-02-14 01:52:22Z mike $". + */ diff --git a/data/label.h b/data/label.h new file mode 100644 index 0000000..a23d964 --- /dev/null +++ b/data/label.h @@ -0,0 +1,28 @@ +/* + * "$Id: label.h 7304 2008-02-14 01:52:22Z mike $" + * + * This file contains model number definitions for the CUPS sample + * label printer driver. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#define DYMO_3x0 0 /* Dymo Labelwriter 300/330/330 Turbo */ + +#define ZEBRA_EPL_LINE 0x10 /* Zebra EPL line mode printers */ +#define ZEBRA_EPL_PAGE 0x11 /* Zebra EPL page mode printers */ +#define ZEBRA_ZPL 0x12 /* Zebra ZPL-based printers */ +#define ZEBRA_CPCL 0x13 /* Zebra CPCL-based printers */ + +#define INTELLITECH_PCL 0x20 /* Intellitech PCL-based printers */ + +/* + * End of "$Id: label.h 7304 2008-02-14 01:52:22Z mike $". + */ diff --git a/data/media.defs b/data/media.defs new file mode 100644 index 0000000..43b48c3 --- /dev/null +++ b/data/media.defs @@ -0,0 +1,208 @@ +/* + * "$Id: media.defs 343 2007-07-13 19:52:48Z mike $" + * + * Adobe standard media size definitions for the CUPS PPD file compiler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These codedinstructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * copyright law. Distribution and use rights are outlinedin the file + * "LICENSE.txt" which should have beenincluded with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#media "3x5/3 x 5" 216 360 +#media "3.5x5/3.5 x 5" 252 360 +#media "5x7/5 x 7" 360 504 +#media "10x11/10 x 11" 720 792 +#media "10x13/10 x 13" 720 936 +#media "10x14/10 x 14" 720 1008 +#media "12x11/12 x 11" 864 792 +#media "15x11/15 x 11" 1080 792 +#media "7x9/7 x 9" 504 648 +#media "8x10/8 x 10" 576 720 +#media "9x11/9 x 11" 648 792 +#media "9x12/9 x 12" 648 864 +#media "A0/A0" 2384 3370 +#media "A0.Transverse/A0 Long Edge" 3370 2384 +#media "A1/A1" 1684 2384 +#media "A1.Transverse/A1 Long Edge" 2384 1684 +#media "A2/A2" 1191 1684 +#media "A2.Transverse/A2 Long Edge" 1684 1191 +#media "A3/A3" 842 1191 +#media "A3.Transverse/A3 Long Edge" 1191 842 +#media "A3Extra/A3 Oversize" 913 1262 +#media "A3Extra.Transverse/A3 Oversize Long Edge" 913 1262 +#media "A3Rotated/A3 Long Edge" 1191 842 +#media "A4/A4" 595 842 +#media "A4Extra/A4 Oversize" 667 914 +#media "A4Plus/A4 Oversize" 595 936 +#media "A4Rotated/A4 Long Edge" 842 595 +#media "A4Small/A4 Small" 595 842 +#media "A4.Transverse/A4 Long Edge" 842 595 +#media "A5/A5" 420 595 +#media "A5Extra/A5 Oversize" 492 668 +#media "A5Rotated/A5 Long Edge" 595 420 +#media "A5.Transverse/A5 Long Edge" 595 420 +#media "A6/A6" 297 420 +#media "A6Rotated/A6 Long Edge" 420 297 +#media "A7/A7" 210 297 +#media "A8/A8" 148 210 +#media "A9/A9" 105 148 +#media "A10/A10" 73 105 +#media "AnsiA/ANSI A" 612 792 +#media "AnsiB/ANSI B" 792 1224 +#media "AnsiC/ANSI C" 1224 1584 +#media "AnsiD/ANSI D" 1584 2448 +#media "AnsiE/ANSI E" 2448 3168 +#media "ARCHA/Letter Oversize" 648 864 +#media "ARCHA.Transverse/Letter Oversize Long Edge" 864 648 +#media "ARCHB/Tabloid Oversize" 864 1296 +#media "ARCHB.Transverse/Tabloid Oversize Long Edge" 1296 864 +#media "ARCHC/ARCH C" 1296 1728 +#media "ARCHC.Transverse/ARCH C Long Edge" 1728 1296 +#media "ARCHD/ARCH D" 1728 2592 +#media "ARCHD.Transverse/ARCH D Long Edge" 2592 1728 +#media "ARCHE/ARCH E" 2592 3456 +#media "ARCHE.Transverse/ARCH E Long Edge" 3456 2592 +#media "B0/JIS B0" 2920 4127 +#media "B10/JIS B10" 91 127 +#media "B1/JIS B1" 2064 2918 +#media "B1/JIS B1" 2064 2920 +#media "B2/JIS B2" 1460 2064 +#media "B3/JIS B3" 1032 1460 +#media "B4/JIS B4" 729 1032 +#media "B4Rotated/JIS B4 Long Edge" 1032 729 +#media "B5/JIS B5" 516 729 +#media "B5Rotated/JIS B5 Long Edge" 729 516 +#media "B5.Transverse/JIS B5 Long Edge" 516 729 +#media "B6/JIS B6" 363 516 +#media "B6Rotated/JIS B6 Long Edge" 516 363 +#media "B7/JIS B7" 258 363 +#media "B8/JIS B8" 181 258 +#media "B9/JIS B9" 127 181 +#media "C4/Envelope C4" 649 918 +#media "C5/Envelope C5" 459 649 +#media "C6/Envelope C6" 323 459 +#media "DL/Envelope DL" 312 624 +#media "DoublePostcard/Postcard Double " 567 420 +#media "DoublePostcardRotated/Postcard Double Long Edge" 420 567 +#media "Env10/Envelope #10 " 297 684 +#media "Env11/Envelope #11" 324 747 +#media "Env12/Envelope #12" 342 792 +#media "Env14/Envelope #14" 360 828 +#media "Env9/Envelope #9" 279 639 +#media "EnvC0/Envelope C0" 2599 3676 +#media "EnvC1/Envelope C1" 1837 2599 +#media "EnvC2/Envelope C2" 1298 1837 +#media "EnvC3/Envelope C3" 918 1296 +#media "EnvC4/Envelope C4" 649 918 +#media "EnvC5/Envelope C5" 459 649 +#media "EnvC65/Envelope C65" 324 648 +#media "EnvC6/Envelope C6" 323 459 +#media "EnvC7/Envelope C7" 230 323 +#media "EnvChou3/Envelope Choukei 3" 340 666 +#media "EnvChou3Rotated/Envelope Choukei 3 Long Edge" 666 340 +#media "EnvChou4/Envelope Choukei 4" 255 581 +#media "EnvChou4Rotated/Envelope Choukei 4 Long Edge" 581 255 +#media "EnvDL/Envelope DL" 312 624 +#media "EnvInvite/Envelope Invite" 624 624 +#media "EnvISOB4/Envelope B4" 708 1001 +#media "EnvISOB5/Envelope B5" 499 709 +#media "EnvISOB6/Envelope B6" 499 354 +#media "EnvItalian/Envelope Italian" 312 652 +#media "EnvKaku2/Envelope Kaku2" 680 941 +#media "EnvKaku2Rotated/Envelope Kaku2 Long Edge" 941 680 +#media "EnvKaku3/Envelope Kaku3" 612 785 +#media "EnvKaku3Rotated/Envelope Kaku3 Long Edge" 785 612 +#media "EnvMonarch/Envelope Monarch" 279 540 +#media "EnvPersonal/Envelope Personal" 261 468 +#media "EnvPRC1/Envelope PRC1 " 289 468 +#media "EnvPRC1Rotated/Envelope PRC1 Long Edge" 468 289 +#media "EnvPRC2/Envelope PRC2" 289 499 +#media "EnvPRC2Rotated/Envelope PRC2 Long Edge" 499 289 +#media "EnvPRC3/Envelope PRC3" 354 499 +#media "EnvPRC3Rotated/Envelope PRC3 Long Edge" 499 354 +#media "EnvPRC4/Envelope PRC4" 312 590 +#media "EnvPRC4Rotated/Envelope PRC4 Long Edge" 590 312 +#media "EnvPRC5/Envelope PRC5PRC5" 312 624 +#media "EnvPRC5Rotated/Envelope PRC5 Long Edge" 624 312 +#media "EnvPRC6/Envelope PRC6" 340 652 +#media "EnvPRC6Rotated/Envelope PRC6 Long Edge" 652 340 +#media "EnvPRC7/Envelope PRC7" 454 652 +#media "EnvPRC7Rotated/Envelope PRC7 Long Edge" 652 454 +#media "EnvPRC8/Envelope PRC8" 340 876 +#media "EnvPRC8Rotated/Envelope PRC8 Long Edge" 876 340 +#media "EnvPRC9/Envelope PRC9" 649 918 +#media "EnvPRC9Rotated/Envelope PRC9 Long Edge" 918 649 +#media "EnvPRC10/Envelope PRC10" 918 1298 +#media "EnvPRC10Rotated/Envelope PRC10 Long Edge" 1298 918 +#media "EnvYou4/Envelope You4" 298 666 +#media "EnvYou4Rotated/Envelope You4 Long Edge" 666 298 +#media "Executive/Executive" 522 756 +#media "FanFoldGerman/FanFold German" 612 864 +#media "FanFoldGermanLegal/FanFold Legal German" 612 936 +#media "FanFoldUS/Fanfold US" 1071 792 +#media "Folio/Folio" 595 935 +#media "ISOB0/B0" 2835 4008 +#media "ISOB1/B1" 2004 2835 +#media "ISOB2/B2" 1417 2004 +#media "ISOB3/B3" 1001 1417 +#media "ISOB4/B4" 709 1001 +#media "ISOB5/B5" 499 709 +#media "ISOB5Extra/B5 Oversize" 570 782 +#media "ISOB6/B6" 354 499 +#media "ISOB7/B7" 249 354 +#media "ISOB8/B8" 176 249 +#media "ISOB9/B9" 125 176 +#media "ISOB10/B10" 88 125 +#media "Ledger/US Ledger" 1224 792 +#media "Legal/US Legal" 612 1008 +#media "LegalExtra/US Legal Oversize" 684 1080 +#media "Letter/US Letter" 612 792 +#media "Letter.Transverse/US Letter Long Edge" 792 612 +#media "LetterExtra/US Letter Oversize" 684 864 +#media "LetterExtra.Transverse/US Letter Oversize Long Edge" 864 684 +#media "LetterPlus/US Letter Oversize" 612 914 +#media "LetterRotated/US Letter Long Edge" 792 612 +#media "LetterSmall/US Letter Small" 612 792 +#media "Monarch/Envelope Monarch" 279 540 +#media "Note/Note" 612 792 +#media "Postcard/Postcard" 284 419 +#media "PostcardRotated/Postcard Long Edge" 419 284 +#media "PRC16K/PRC16K" 414 610 +#media "PRC16KRotated/PRC16K Long Edge" 610 414 +#media "PRC32K/PRC32K" 275 428 +#media "PRC32KBig/PRC32K Oversize" 275 428 +#media "PRC32KBigRotated/PRC32K Oversize Long Edge" 428 275 +#media "PRC32KRotated/PRC32K Long Edge" 428 275 +#media "Quarto/Quarto" 610 780 +#media "Statement/Statement" 396 612 +#media "SuperA/Super A" 643 1009 +#media "SuperB/Super B" 864 1380 +#media "Tabloid/Tabloid" 792 1224 +#media "TabloidExtra/Tabloid Oversize" 864 1296 + +/* + * Non-standard sizes... + */ + +#media "Photo4x6/Photo" 288 432 +#media "PhotoLabel/Photo Labels" 288 468 +#media "w936h1368/Super B/A3" 936 1368 +#media "w81h252/Address" 81 252 +#media "w101h252/Large Address" 101 252 +#media "w54h144/Return Address" 54 144 +#media "w167h288/Shipping Address" 167 288 +#media "w162h540/Internet Postage 2-Part" 162 540 +#media "w162h504/Internet Postage 3-Part" 162 504 +#media "w41h248/File Folder" 41 248 +#media "w41h144/Hanging Folder" 41 144 +#media "w153h198/3.5\" Disk" 153 198 + + +/* + * End of "$Id: media.defs 343 2007-07-13 19:52:48Z mike $". + */ diff --git a/data/pcl.h b/data/pcl.h new file mode 100644 index 0000000..a1fedad --- /dev/null +++ b/data/pcl.h @@ -0,0 +1,38 @@ +/* + * "$Id: pcl.h 7304 2008-02-14 01:52:22Z mike $" + * + * This file contains model number definitions for the CUPS unified + * PCL driver. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* General PCL Support */ +#define PCL_PAPER_SIZE 0x1 /* Use ESC&l#A */ +#define PCL_INKJET 0x2 /* Use inkjet commands */ + +/* Raster Support */ +#define PCL_RASTER_END_COLOR 0x100 /* Use ESC*rC */ +#define PCL_RASTER_CID 0x200 /* Use ESC*v#W */ +#define PCL_RASTER_CRD 0x400 /* Use ESC*g#W */ +#define PCL_RASTER_SIMPLE 0x800 /* Use ESC*r#U */ +#define PCL_RASTER_RGB24 0x1000 /* Use 24-bit RGB mode */ + +/* PJL Support */ +#define PCL_PJL 0x10000 /* Use PJL Commands */ +#define PCL_PJL_PAPERWIDTH 0x20000 /* Use PJL PAPERWIDTH/LENGTH */ +#define PCL_PJL_HPGL2 0x40000 /* Enter HPGL2 */ +#define PCL_PJL_PCL3GUI 0x80000 /* Enter PCL3GUI */ +#define PCL_PJL_RESOLUTION 0x100000 /* Use PJL SET RESOLUTION */ + + +/* + * End of "$Id: pcl.h 7304 2008-02-14 01:52:22Z mike $". + */ diff --git a/data/psglyphs b/data/psglyphs new file mode 100644 index 0000000..c4a902c --- /dev/null +++ b/data/psglyphs @@ -0,0 +1,1051 @@ +0020 space +0021 exclam +0022 quotedbl +0023 numbersign +0024 dollar +0025 percent +0026 ampersand +0027 quotesingle +0028 parenleft +0029 parenright +002a asterisk +002b plus +002c comma +002d minus +002e period +002f slash +0030 zero +0031 one +0032 two +0033 three +0034 four +0035 five +0036 six +0037 seven +0038 eight +0039 nine +003a colon +003b semicolon +003c less +003d equal +003e greater +003f question +0040 at +0041 A +0042 B +0043 C +0044 D +0045 E +0046 F +0047 G +0048 H +0049 I +004a J +004b K +004c L +004d M +004e N +004f O +0050 P +0051 Q +0052 R +0053 S +0054 T +0055 U +0056 V +0057 W +0058 X +0059 Y +005a Z +005b bracketleft +005c backslash +005d bracketright +005e asciicircum +005f underscore +0060 grave +0061 a +0062 b +0063 c +0064 d +0065 e +0066 f +0067 g +0068 h +0069 i +006a j +006b k +006c l +006d m +006e n +006f o +0070 p +0071 q +0072 r +0073 s +0074 t +0075 u +0076 v +0077 w +0078 x +0079 y +007a z +007b braceleft +007c bar +007d braceright +007e asciitilde +00a0 space +00a1 exclamdown +00a2 cent +00a3 sterling +00a4 currency +00a5 yen +00a6 brokenbar +00a7 section +00a8 dieresis +00a9 copyright +00aa ordfeminine +00ab guillemotleft +00ac logicalnot +00ad hyphen +00ae registered +00af macron +00b0 degree +00b1 plusminus +00b2 twosuperior +00b3 threesuperior +00b4 acute +00b5 mu +00b6 paragraph +00b7 periodcentered +00b8 cedilla +00b9 onesuperior +00ba ordmasculine +00bb guillemotright +00bc onequarter +00bd onehalf +00be threequarters +00bf questiondown +00c0 Agrave +00c1 Aacute +00c2 Acircumflex +00c3 Atilde +00c4 Adieresis +00c5 Aring +00c6 AE +00c7 Ccedilla +00c8 Egrave +00c9 Eacute +00ca Ecircumflex +00cb Edieresis +00cc Igrave +00cd Iacute +00ce Icircumflex +00cf Idieresis +00d0 Eth +00d1 Ntilde +00d2 Ograve +00d3 Oacute +00d4 Ocircumflex +00d5 Otilde +00d6 Odieresis +00d7 multiply +00d8 Oslash +00d9 Ugrave +00da Uacute +00db Ucircumflex +00dc Udieresis +00dd Yacute +00de Thorn +00df germandbls +00e0 agrave +00e1 aacute +00e2 acircumflex +00e3 atilde +00e4 adieresis +00e5 aring +00e6 ae +00e7 ccedilla +00e8 egrave +00e9 eacute +00ea ecircumflex +00eb edieresis +00ec igrave +00ed iacute +00ee icircumflex +00ef idieresis +00f0 eth +00f1 ntilde +00f2 ograve +00f3 oacute +00f4 ocircumflex +00f5 otilde +00f6 odieresis +00f7 divide +00f8 oslash +00f9 ugrave +00fa uacute +00fb ucircumflex +00fc udieresis +00fd yacute +00fe thorn +00ff ydieresis +0100 Amacron +0101 amacron +0102 Abreve +0103 abreve +0104 Aogonek +0105 aogonek +0106 Cacute +0107 cacute +0108 Ccircumflex +0109 ccircumflex +010a Cdotaccent +010b cdotaccent +010c Ccaron +010d ccaron +010e Dcaron +010f dcaron +0110 Dcroat +0111 dcroat +0112 Emacron +0113 emacron +0114 Ebreve +0115 ebreve +0116 Edotaccent +0117 edotaccent +0118 Eogonek +0119 eogonek +011a Ecaron +011b ecaron +011c Gcircumflex +011d gcircumflex +011e Gbreve +011f gbreve +0120 Gdotaccent +0121 gdotaccent +0122 Gcommaaccent +0123 gcommaaccent +0124 Hcircumflex +0125 hcircumflex +0126 Hbar +0127 hbar +0128 Itilde +0129 itilde +012a Imacron +012b imacron +012c Ibreve +012d ibreve +012e Iogonek +012f iogonek +0130 Idotaccent +0131 dotlessi +0132 IJ +0133 ij +0134 Jcircumflex +0135 jcircumflex +0136 Kcommaaccent +0137 kcommaaccent +0138 kgreenlandic +0139 Lacute +013a lacute +013b Lcommaaccent +013c lcommaaccent +013d Lcaron +013e lcaron +013f Ldot +0140 ldot +0141 Lslash +0142 lslash +0143 Nacute +0144 nacute +0145 Ncommaaccent +0146 ncommaaccent +0147 Ncaron +0148 ncaron +0149 napostrophe +014a Eng +014b eng +014c Omacron +014d omacron +014e Obreve +014f obreve +0150 Ohungarumlaut +0151 ohungarumlaut +0152 OE +0153 oe +0154 Racute +0155 racute +0156 Rcommaaccent +0157 rcommaaccent +0158 Rcaron +0159 rcaron +015a Sacute +015b sacute +015c Scircumflex +015d scircumflex +015e Scedilla +015f scedilla +0160 Scaron +0161 scaron +0162 Tcommaaccent +0163 tcommaaccent +0164 Tcaron +0165 tcaron +0166 Tbar +0167 tbar +0168 Utilde +0169 utilde +016a Umacron +016b umacron +016c Ubreve +016d ubreve +016e Uring +016f uring +0170 Uhungarumlaut +0171 uhungarumlaut +0172 Uogonek +0173 uogonek +0174 Wcircumflex +0175 wcircumflex +0176 Ycircumflex +0177 ycircumflex +0178 Ydieresis +0179 Zacute +017a zacute +017b Zdotaccent +017c zdotaccent +017d Zcaron +017e zcaron +017f longs +0192 florin +01a0 Ohorn +01a1 ohorn +01af Uhorn +01b0 uhorn +01e6 Gcaron +01e7 gcaron +01fa Aringacute +01fb aringacute +01fc AEacute +01fd aeacute +01fe Oslashacute +01ff oslashacute +0218 Scommaaccent +0219 scommaaccent +021a Tcommaaccent +021b tcommaaccent +02bc afii57929 +02bd afii64937 +02c6 circumflex +02c7 caron +02c9 macron +02d8 breve +02d9 dotaccent +02da ring +02db ogonek +02dc tilde +02dd hungarumlaut +0300 gravecomb +0301 acutecomb +0303 tildecomb +0309 hookabovecomb +0323 dotbelowcomb +0384 tonos +0385 dieresistonos +0386 Alphatonos +0387 anoteleia +0388 Epsilontonos +0389 Etatonos +038a Iotatonos +038c Omicrontonos +038e Upsilontonos +038f Omegatonos +0390 iotadieresistonos +0391 Alpha +0392 Beta +0393 Gamma +0394 Delta +0395 Epsilon +0396 Zeta +0397 Eta +0398 Theta +0399 Iota +039a Kappa +039b Lambda +039c Mu +039d Nu +039e Xi +039f Omicron +03a0 Pi +03a1 Rho +03a3 Sigma +03a4 Tau +03a5 Upsilon +03a6 Phi +03a7 Chi +03a8 Psi +03a9 Omega +03aa Iotadieresis +03ab Upsilondieresis +03ac alphatonos +03ad epsilontonos +03ae etatonos +03af iotatonos +03b0 upsilondieresistonos +03b1 alpha +03b2 beta +03b3 gamma +03b4 delta +03b5 epsilon +03b6 zeta +03b7 eta +03b8 theta +03b9 iota +03ba kappa +03bb lambda +03bc mu +03bd nu +03be xi +03bf omicron +03c0 pi +03c1 rho +03c2 sigma1 +03c3 sigma +03c4 tau +03c5 upsilon +03c6 phi +03c7 chi +03c8 psi +03c9 omega +03ca iotadieresis +03cb upsilondieresis +03cc omicrontonos +03cd upsilontonos +03ce omegatonos +03d1 theta1 +03d2 Upsilon1 +03d5 phi1 +03d6 omega1 +0401 afii10023 +0402 afii10051 +0403 afii10052 +0404 afii10053 +0405 afii10054 +0406 afii10055 +0407 afii10056 +0408 afii10057 +0409 afii10058 +040a afii10059 +040b afii10060 +040c afii10061 +040e afii10062 +040f afii10145 +0410 afii10017 +0411 afii10018 +0412 afii10019 +0413 afii10020 +0414 afii10021 +0415 afii10022 +0416 afii10024 +0417 afii10025 +0418 afii10026 +0419 afii10027 +041a afii10028 +041b afii10029 +041c afii10030 +041d afii10031 +041e afii10032 +041f afii10033 +0420 afii10034 +0421 afii10035 +0422 afii10036 +0423 afii10037 +0424 afii10038 +0425 afii10039 +0426 afii10040 +0427 afii10041 +0428 afii10042 +0429 afii10043 +042a afii10044 +042b afii10045 +042c afii10046 +042d afii10047 +042e afii10048 +042f afii10049 +0430 afii10065 +0431 afii10066 +0432 afii10067 +0433 afii10068 +0434 afii10069 +0435 afii10070 +0436 afii10072 +0437 afii10073 +0438 afii10074 +0439 afii10075 +043a afii10076 +043b afii10077 +043c afii10078 +043d afii10079 +043e afii10080 +043f afii10081 +0440 afii10082 +0441 afii10083 +0442 afii10084 +0443 afii10085 +0444 afii10086 +0445 afii10087 +0446 afii10088 +0447 afii10089 +0448 afii10090 +0449 afii10091 +044a afii10092 +044b afii10093 +044c afii10094 +044d afii10095 +044e afii10096 +044f afii10097 +0451 afii10071 +0452 afii10099 +0453 afii10100 +0454 afii10101 +0455 afii10102 +0456 afii10103 +0457 afii10104 +0458 afii10105 +0459 afii10106 +045a afii10107 +045b afii10108 +045c afii10109 +045e afii10110 +045f afii10193 +0462 afii10146 +0463 afii10194 +0472 afii10147 +0473 afii10195 +0474 afii10148 +0475 afii10196 +0490 afii10050 +0491 afii10098 +04d9 afii10846 +05b0 afii57799 +05b1 afii57801 +05b2 afii57800 +05b3 afii57802 +05b4 afii57793 +05b5 afii57794 +05b6 afii57795 +05b7 afii57798 +05b8 afii57797 +05b9 afii57806 +05bb afii57796 +05bc afii57807 +05bd afii57839 +05be afii57645 +05bf afii57841 +05c0 afii57842 +05c1 afii57804 +05c2 afii57803 +05c3 afii57658 +05d0 afii57664 +05d1 afii57665 +05d2 afii57666 +05d3 afii57667 +05d4 afii57668 +05d5 afii57669 +05d6 afii57670 +05d7 afii57671 +05d8 afii57672 +05d9 afii57673 +05da afii57674 +05db afii57675 +05dc afii57676 +05dd afii57677 +05de afii57678 +05df afii57679 +05e0 afii57680 +05e1 afii57681 +05e2 afii57682 +05e3 afii57683 +05e4 afii57684 +05e5 afii57685 +05e6 afii57686 +05e7 afii57687 +05e8 afii57688 +05e9 afii57689 +05ea afii57690 +05f0 afii57716 +05f1 afii57717 +05f2 afii57718 +060c afii57388 +061b afii57403 +061f afii57407 +0621 afii57409 +0622 afii57410 +0623 afii57411 +0624 afii57412 +0625 afii57413 +0626 afii57414 +0627 afii57415 +0628 afii57416 +0629 afii57417 +062a afii57418 +062b afii57419 +062c afii57420 +062d afii57421 +062e afii57422 +062f afii57423 +0630 afii57424 +0631 afii57425 +0632 afii57426 +0633 afii57427 +0634 afii57428 +0635 afii57429 +0636 afii57430 +0637 afii57431 +0638 afii57432 +0639 afii57433 +063a afii57434 +0640 afii57440 +0641 afii57441 +0642 afii57442 +0643 afii57443 +0644 afii57444 +0645 afii57445 +0646 afii57446 +0647 afii57470 +0648 afii57448 +0649 afii57449 +064a afii57450 +064b afii57451 +064c afii57452 +064d afii57453 +064e afii57454 +064f afii57455 +0650 afii57456 +0651 afii57457 +0652 afii57458 +0660 afii57392 +0661 afii57393 +0662 afii57394 +0663 afii57395 +0664 afii57396 +0665 afii57397 +0666 afii57398 +0667 afii57399 +0668 afii57400 +0669 afii57401 +066a afii57381 +066d afii63167 +0679 afii57511 +067e afii57506 +0686 afii57507 +0688 afii57512 +0691 afii57513 +0698 afii57508 +06a4 afii57505 +06af afii57509 +06ba afii57514 +06d2 afii57519 +06d5 afii57534 +1e80 Wgrave +1e81 wgrave +1e82 Wacute +1e83 wacute +1e84 Wdieresis +1e85 wdieresis +1ef2 Ygrave +1ef3 ygrave +200c afii61664 +200d afii301 +200e afii299 +200f afii300 +2012 figuredash +2013 endash +2014 emdash +2015 afii00208 +2017 underscoredbl +2018 quoteleft +2019 quoteright +201a quotesinglbase +201b quotereversed +201c quotedblleft +201d quotedblright +201e quotedblbase +2020 dagger +2021 daggerdbl +2022 bullet +2024 onedotenleader +2025 twodotenleader +2026 ellipsis +202c afii61573 +202d afii61574 +202e afii61575 +2030 perthousand +2032 minute +2033 second +2039 guilsinglleft +203a guilsinglright +203c exclamdbl +2044 fraction +2070 zerosuperior +2074 foursuperior +2075 fivesuperior +2076 sixsuperior +2077 sevensuperior +2078 eightsuperior +2079 ninesuperior +207d parenleftsuperior +207e parenrightsuperior +207f nsuperior +2080 zeroinferior +2081 oneinferior +2082 twoinferior +2083 threeinferior +2084 fourinferior +2085 fiveinferior +2086 sixinferior +2087 seveninferior +2088 eightinferior +2089 nineinferior +208d parenleftinferior +208e parenrightinferior +20a1 colonmonetary +20a3 franc +20a4 lira +20a7 peseta +20aa afii57636 +20ab dong +20ac Euro +2105 afii61248 +2111 Ifraktur +2113 afii61289 +2116 afii61352 +2118 weierstrass +211c Rfraktur +211e prescription +2122 trademark +2126 Omega +212e estimated +2135 aleph +2153 onethird +2154 twothirds +215b oneeighth +215c threeeighths +215d fiveeighths +215e seveneighths +2190 arrowleft +2191 arrowup +2192 arrowright +2193 arrowdown +2194 arrowboth +2195 arrowupdn +21a8 arrowupdnbse +21b5 carriagereturn +21d0 arrowdblleft +21d1 arrowdblup +21d2 arrowdblright +21d3 arrowdbldown +21d4 arrowdblboth +2200 universal +2202 partialdiff +2203 existential +2205 emptyset +2206 Delta +2207 gradient +2208 element +2209 notelement +220b suchthat +220f product +2211 summation +2212 minus +2215 fraction +2217 asteriskmath +2219 periodcentered +221a radical +221d proportional +221e infinity +221f orthogonal +2220 angle +2227 logicaland +2228 logicalor +2229 intersection +222a union +222b integral +2234 therefore +223c similar +2245 congruent +2248 approxequal +2260 notequal +2261 equivalence +2264 lessequal +2265 greaterequal +2282 propersubset +2283 propersuperset +2284 notsubset +2286 reflexsubset +2287 reflexsuperset +2295 circleplus +2297 circlemultiply +22a5 perpendicular +22c5 dotmath +2302 house +2310 revlogicalnot +2320 integraltp +2321 integralbt +2329 angleleft +232a angleright +2500 SF100000 +2502 SF110000 +250c SF010000 +2510 SF030000 +2514 SF020000 +2518 SF040000 +251c SF080000 +2524 SF090000 +252c SF060000 +2534 SF070000 +253c SF050000 +2550 SF430000 +2551 SF240000 +2552 SF510000 +2553 SF520000 +2554 SF390000 +2555 SF220000 +2556 SF210000 +2557 SF250000 +2558 SF500000 +2559 SF490000 +255a SF380000 +255b SF280000 +255c SF270000 +255d SF260000 +255e SF360000 +255f SF370000 +2560 SF420000 +2561 SF190000 +2562 SF200000 +2563 SF230000 +2564 SF470000 +2565 SF480000 +2566 SF410000 +2567 SF450000 +2568 SF460000 +2569 SF400000 +256a SF540000 +256b SF530000 +256c SF440000 +2580 upblock +2584 dnblock +2588 block +258c lfblock +2590 rtblock +2591 ltshade +2592 shade +2593 dkshade +25a0 filledbox +25a1 H22073 +25aa H18543 +25ab H18551 +25ac filledrect +25b2 triagup +25ba triagrt +25bc triagdn +25c4 triaglf +25ca lozenge +25cb circle +25cf H18533 +25d8 invbullet +25d9 invcircle +25e6 openbullet +263a smileface +263b invsmileface +263c sun +2640 female +2642 male +2660 spade +2663 club +2665 heart +2666 diamond +266a musicalnote +266b musicalnotedbl +f6be dotlessj +f6bf LL +f6c0 ll +f6c1 Scedilla +f6c2 scedilla +f6c3 commaaccent +f6c4 afii10063 +f6c5 afii10064 +f6c6 afii10192 +f6c7 afii10831 +f6c8 afii10832 +f6c9 Acute +f6ca Caron +f6cb Dieresis +f6cc DieresisAcute +f6cd DieresisGrave +f6ce Grave +f6cf Hungarumlaut +f6d0 Macron +f6d1 cyrBreve +f6d2 cyrFlex +f6d3 dblGrave +f6d4 cyrbreve +f6d5 cyrflex +f6d6 dblgrave +f6d7 dieresisacute +f6d8 dieresisgrave +f6d9 copyrightserif +f6da registerserif +f6db trademarkserif +f6dc onefitted +f6dd rupiah +f6de threequartersemdash +f6df centinferior +f6e0 centsuperior +f6e1 commainferior +f6e2 commasuperior +f6e3 dollarinferior +f6e4 dollarsuperior +f6e5 hypheninferior +f6e6 hyphensuperior +f6e7 periodinferior +f6e8 periodsuperior +f6e9 asuperior +f6ea bsuperior +f6eb dsuperior +f6ec esuperior +f6ed isuperior +f6ee lsuperior +f6ef msuperior +f6f0 osuperior +f6f1 rsuperior +f6f2 ssuperior +f6f3 tsuperior +f6f4 Brevesmall +f6f5 Caronsmall +f6f6 Circumflexsmall +f6f7 Dotaccentsmall +f6f8 Hungarumlautsmall +f6f9 Lslashsmall +f6fa OEsmall +f6fb Ogoneksmall +f6fc Ringsmall +f6fd Scaronsmall +f6fe Tildesmall +f6ff Zcaronsmall +f721 exclamsmall +f724 dollaroldstyle +f726 ampersandsmall +f730 zerooldstyle +f731 oneoldstyle +f732 twooldstyle +f733 threeoldstyle +f734 fouroldstyle +f735 fiveoldstyle +f736 sixoldstyle +f737 sevenoldstyle +f738 eightoldstyle +f739 nineoldstyle +f73f questionsmall +f760 Gravesmall +f761 Asmall +f762 Bsmall +f763 Csmall +f764 Dsmall +f765 Esmall +f766 Fsmall +f767 Gsmall +f768 Hsmall +f769 Ismall +f76a Jsmall +f76b Ksmall +f76c Lsmall +f76d Msmall +f76e Nsmall +f76f Osmall +f770 Psmall +f771 Qsmall +f772 Rsmall +f773 Ssmall +f774 Tsmall +f775 Usmall +f776 Vsmall +f777 Wsmall +f778 Xsmall +f779 Ysmall +f77a Zsmall +f7a1 exclamdownsmall +f7a2 centoldstyle +f7a8 Dieresissmall +f7af Macronsmall +f7b4 Acutesmall +f7b8 Cedillasmall +f7bf questiondownsmall +f7e0 Agravesmall +f7e1 Aacutesmall +f7e2 Acircumflexsmall +f7e3 Atildesmall +f7e4 Adieresissmall +f7e5 Aringsmall +f7e6 AEsmall +f7e7 Ccedillasmall +f7e8 Egravesmall +f7e9 Eacutesmall +f7ea Ecircumflexsmall +f7eb Edieresissmall +f7ec Igravesmall +f7ed Iacutesmall +f7ee Icircumflexsmall +f7ef Idieresissmall +f7f0 Ethsmall +f7f1 Ntildesmall +f7f2 Ogravesmall +f7f3 Oacutesmall +f7f4 Ocircumflexsmall +f7f5 Otildesmall +f7f6 Odieresissmall +f7f8 Oslashsmall +f7f9 Ugravesmall +f7fa Uacutesmall +f7fb Ucircumflexsmall +f7fc Udieresissmall +f7fd Yacutesmall +f7fe Thornsmall +f7ff Ydieresissmall +f8e5 radicalex +f8e6 arrowvertex +f8e7 arrowhorizex +f8e8 registersans +f8e9 copyrightsans +f8ea trademarksans +f8eb parenlefttp +f8ec parenleftex +f8ed parenleftbt +f8ee bracketlefttp +f8ef bracketleftex +f8f0 bracketleftbt +f8f1 bracelefttp +f8f2 braceleftmid +f8f3 braceleftbt +f8f4 braceex +f8f5 integralex +f8f6 parenrighttp +f8f7 parenrightex +f8f8 parenrightbt +f8f9 bracketrighttp +f8fa bracketrightex +f8fb bracketrightbt +f8fc bracerighttp +f8fd bracerightmid +f8fe bracerightbt +fb00 ff +fb01 fi +fb02 fl +fb03 ffi +fb04 ffl +fb1f afii57705 +fb2a afii57694 +fb2b afii57695 +fb35 afii57723 +fb4b afii57700 diff --git a/data/raster.defs b/data/raster.defs new file mode 100644 index 0000000..486165f --- /dev/null +++ b/data/raster.defs @@ -0,0 +1,94 @@ +/* + * "$Id: raster.defs 343 2007-07-13 19:52:48Z mike $" + * + * This file contains the standard definitions for enumerated attributes + * in the CUPS raster page device dictionary. + * + * Copyright 2007 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* Jog values */ +#define CUPS_JOG_NONE 0 /* Never move pages */ +#define CUPS_JOG_FILE 1 /* Move pages after this file */ +#define CUPS_JOG_JOB 2 /* Move pages after this job */ +#define CUPS_JOG_SET 3 /* Move pages after this set */ + +/* Orientation values */ +#define CUPS_ORIENT_0 0 /* Don't rotate the page */ +#define CUPS_ORIENT_90 1 /* Rotate the page counter-clockwise */ +#define CUPS_ORIENT_180 2 /* Turn the page upside down */ +#define CUPS_ORIENT_270 3 /* Rotate the page clockwise */ + +/* CutMedia values */ +#define CUPS_CUT_NONE 0 /* Never cut the roll */ +#define CUPS_CUT_FILE 1 /* Cut the roll after this file */ +#define CUPS_CUT_JOB 2 /* Cut the roll after this job */ +#define CUPS_CUT_SET 3 /* Cut the roll after this set */ +#define CUPS_CUT_PAGE 4 /* Cut the roll after this page */ + +/* AdvanceMedia values */ +#define CUPS_ADVANCE_NONE 0 /* Never advance the roll */ +#define CUPS_ADVANCE_FILE 1 /* Advance the roll after this file */ +#define CUPS_ADVANCE_JOB 2 /* Advance the roll after this job */ +#define CUPS_ADVANCE_SET 3 /* Advance the roll after this set */ +#define CUPS_ADVANCE_PAGE 4 /* Advance the roll after this page */ + +/* LeadingEdge values */ +#define CUPS_EDGE_TOP 0 /* Leading edge is the top of the page */ +#define CUPS_EDGE_RIGHT 1 /* Leading edge is the right of the page */ +#define CUPS_EDGE_BOTTOM 2 /* Leading edge is the bottom of the page */ +#define CUPS_EDGE_LEFT 3 /* Leading edge is the left of the page */ + +/* cupsColorOrder values */ +#define CUPS_ORDER_CHUNKED 0 /* CMYK CMYK CMYK ... */ +#define CUPS_ORDER_BANDED 1 /* CCC MMM YYY KKK ... */ +#define CUPS_ORDER_PLANAR 2 /* CCC ... MMM ... YYY ... KKK ... */ + +/* cupsColorSpace values */ +#define CUPS_CSPACE_W 0 /* Luminance */ +#define CUPS_CSPACE_RGB 1 /* Red, green, blue */ +#define CUPS_CSPACE_RGBA 2 /* Red, green, blue, alpha */ +#define CUPS_CSPACE_K 3 /* Black */ +#define CUPS_CSPACE_CMY 4 /* Cyan, magenta, yellow */ +#define CUPS_CSPACE_YMC 5 /* Yellow, magenta, cyan */ +#define CUPS_CSPACE_CMYK 6 /* Cyan, magenta, yellow, black */ +#define CUPS_CSPACE_YMCK 7 /* Yellow, magenta, cyan, black */ +#define CUPS_CSPACE_KCMY 8 /* Black, cyan, magenta, yellow */ +#define CUPS_CSPACE_KCMYcm 9 /* Black, cyan, magenta, yellow, * + * light-cyan, light-magenta */ +#define CUPS_CSPACE_GMCK 10 /* Gold, magenta, yellow, black */ +#define CUPS_CSPACE_GMCS 11 /* Gold, magenta, yellow, silver */ +#define CUPS_CSPACE_WHITE 12 /* White ink (as black) */ +#define CUPS_CSPACE_GOLD 13 /* Gold foil */ +#define CUPS_CSPACE_SILVER 14 /* Silver foil */ + +#define CUPS_CSPACE_CIEXYZ 15 /* CIE XYZ */ +#define CUPS_CSPACE_CIELab 16 /* CIE Lab */ + +#define CUPS_CSPACE_ICC1 32 /* ICC-based, 1 color */ +#define CUPS_CSPACE_ICC2 33 /* ICC-based, 2 colors */ +#define CUPS_CSPACE_ICC3 34 /* ICC-based, 3 colors */ +#define CUPS_CSPACE_ICC4 35 /* ICC-based, 4 colors */ +#define CUPS_CSPACE_ICC5 36 /* ICC-based, 5 colors */ +#define CUPS_CSPACE_ICC6 37 /* ICC-based, 6 colors */ +#define CUPS_CSPACE_ICC7 38 /* ICC-based, 7 colors */ +#define CUPS_CSPACE_ICC8 39 /* ICC-based, 8 colors */ +#define CUPS_CSPACE_ICC9 40 /* ICC-based, 9 colors */ +#define CUPS_CSPACE_ICCA 41 /* ICC-based, 10 colors */ +#define CUPS_CSPACE_ICCB 42 /* ICC-based, 11 colors */ +#define CUPS_CSPACE_ICCC 43 /* ICC-based, 12 colors */ +#define CUPS_CSPACE_ICCD 44 /* ICC-based, 13 colors */ +#define CUPS_CSPACE_ICCE 45 /* ICC-based, 14 colors */ +#define CUPS_CSPACE_ICCF 46 /* ICC-based, 15 colors */ + + +/* + * End of "$Id: raster.defs 343 2007-07-13 19:52:48Z mike $". + */ diff --git a/data/secret b/data/secret new file mode 100644 index 0000000..66a0e8a --- /dev/null +++ b/data/secret @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Secret +Footer Secret +Image images/cups.png + diff --git a/data/smiley.ps b/data/smiley.ps new file mode 100644 index 0000000..6ff31fd --- /dev/null +++ b/data/smiley.ps @@ -0,0 +1,28 @@ +%!PS-Adobe-3.0 +%%BoundingBox: 36 36 576 756 +%%Pages: 1 +%%LanguageLevel: 2 +%%EndComments +%%Page: (1) 1 +% Draw a black box around the page +0 setgray +1 setlinewidth +36 36 540 720 rectstroke + +% Draw a two inch blue circle in the middle of the page +0 0 1 setrgbcolor +306 396 144 0 360 arc closepath fill + +% Draw two half inch yellow circles for eyes +1 1 0 setrgbcolor +252 432 36 0 360 arc closepath fill +360 432 36 0 360 arc closepath fill + +% Draw the smile +1 setlinecap +18 setlinewidth +306 396 99 200 340 arc stroke + +% Print it! +showpage +%%EOF diff --git a/data/standard b/data/standard new file mode 100644 index 0000000..31c68a0 --- /dev/null +++ b/data/standard @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Cover Page +Footer Cover Page +Image images/cups.png + diff --git a/data/testprint.in b/data/testprint.in new file mode 100644 index 0000000..8cee3ab --- /dev/null +++ b/data/testprint.in @@ -0,0 +1,7 @@ +#CUPS-BANNER +Show printer-name printer-info printer-location printer-make-and-model printer-driver-name printer-driver-version paper-size imageable-area +Header Printer Test Page +Footer Printer Test Page +Notice CUPS @CUPS_VERSION@. +Image images/cups.png +Image images/color-wheel.png diff --git a/data/topsecret b/data/topsecret new file mode 100644 index 0000000..d2b87fa --- /dev/null +++ b/data/topsecret @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Top Secret +Footer Top Secret +Image images/cups.png + diff --git a/data/unclassified b/data/unclassified new file mode 100644 index 0000000..2d1a7d0 --- /dev/null +++ b/data/unclassified @@ -0,0 +1,6 @@ +#CUPS-BANNER +Show job-id job-name job-originating-user-name job-originating-host-name job-billing +Header Unclassified +Footer Unclassified +Image images/cups.png + diff --git a/data/utf-8 b/data/utf-8 new file mode 100644 index 0000000..044691b --- /dev/null +++ b/data/utf-8 @@ -0,0 +1,40 @@ +charset utf8 + +# +# This file defines the font mappings used for Unicode/UTF-8 text printing. +# +# Each line consists of: +# +# first last direction width normal bold italic bold-italic +# +# First and last are the first and last glyphs in the font mapping +# that correspond to that font; a maximum of 256 characters can be +# mapped within each group, with a maximum of 256 mappings (this is a +# PostScript limitation.) The glyph values are hexadecimal. +# +# Direction is the string "ltor" or "rtol", indicating left-to-right or +# right-to-left text. +# +# Width is the string "single" or "double"; double means that the glyphs +# are twice as wide as ASCII characters in the Monospace typeface. +# +# "Normal", "bold", "italic", and "bold-italic" are the typefaces to use +# for each presentation. If characters are only available in a single +# style then only one typeface should be listed, e.g. +# +# 1000 10ff ltor single Monospace +# +# Each font that is listed will be downloaded to the printer when used. +# + +0000 00FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +0100 01FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +0200 02FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +0300 03FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +0400 04FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +1E00 1EFF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +2000 20FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +2300 23FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +2400 24FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +2500 25FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique +2600 26FF ltor single Monospace Monospace-Bold Monospace-Oblique Monospace-BoldOblique diff --git a/debian/HOWTO_BUGREPORT.txt b/debian/HOWTO_BUGREPORT.txt new file mode 100644 index 0000000..c6540e8 --- /dev/null +++ b/debian/HOWTO_BUGREPORT.txt @@ -0,0 +1,28 @@ +Debian users, + +For making clear your printing problem, I need some information. + +1. Please describe your CUPS version/revision. This will be written + automatically if you use Debian bug system tools. +2. Please describe Your printer vendor and model, and how to connect (usb, + parallel, serial, lpd, ipp, http, socket, smb). +3. Please attach your /etc/cups/printers.conf (only about problematic printer) +4. Set LogLeveld as "debug" in your /etc/cups/cupsd.conf and reload by + /etc/init.d/cups reload. After you do something causes a problem, + please attach gzippped your /var/log/cups/error_log. +5. Please attach gzipped PPD file in /etc/cups/ppd/. + +Before you report... +1. If you use gs as filter, please check /usr/bin/gs indicates gs-esp. + gs-gnu doesn't support some drivers. If gs indicates gs-gnu, please + change by 'update-alternatives --config gs'. +2. Please don't set severity to 'grave' or 'critical' if you couldn't success + to print out. I usually test by my printer, then upload. (it means at + least I can success to print out) + I promise to look over your report. Please use 'important' for + "I can't print out by my printer!". + +Thanks, +-- +Kenshi Muto +kmuto@debian.org diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..013a55d --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,244 @@ +cups for Debian +---------------------- + +If you found a problem, please read HOWTO_BUGREPORT.txt and report me +via Debian Bug Tracking System. +-- +Kenshi Muto +kmuto@debian.org + +--------- +This package contains the Common UNIX Printing System(tm), or CUPS(tm) +for short. CUPS is a new printing system for Unix that acts as a +substitute for System V or BSD printing systems; it supports a more +comprehensive driver model, more protocols, and Web administration, +among other things. Internally, CUPS uses the new Internet Printing +Protocol (IPP) described in RFCs 2565 through 2569. + +The terms "CUPS" and "Common UNIX Printing System" are trademarks of +Easy Software Products, the author of the system. This package is a +derivative of the CUPS system, modified for Debian and possibly +containing modifications and fixes that are not present in the +standard CUPS package. For a comprehensive list of changes from the +original source, see the diff file from the source package. For more +information about the legal stuff surrounding this package, see the +Debian copyright file or the CUPS Web site (www.cups.org). + +After installation, CUPS is pretty close to being ready to go. The +last step is to add administrative access; the "lpadmin" group has +been created and granted administrative rights to CUPS. You may need +to add users to this group in order to add printers, modify settings, +etc. By default, the root user has been granted this permission, but +you should only use the root user on the local system. + +The printers can be added with either the lpadmin program or the web +interface, which is located at http://localhost:631/admin by default. + +Backend Configuration +--------------------- + +CUPS supports serial, parallel, USB, SCSI, IPP, HTTP, Socket and Samba +for its backend. But unfortunately, some backends cause a trouble. +For example, serial backend confuses and won't stop when non printer +device connects serial port. Parallel backend is more terrible for PPC, +it may cause kernel crash (kernel bug, sigh). +So, CUPS setting puts serial and SCSI off from backend by default. And +if you use PPC, parallel backend is off also. + +If you want to use these backends, you can configure by using +'dpkg-reconfigure cups'. + +SSL Support +----------- + +CUPS supports SSL via the OpenSSL toolkit, but licensing conflicts +between OpenSSL's license and the GPL make this combination difficult +to use, even though the CUPS license itself allows this. A competing +library, GNU TLS, has an OpenSSL compatibility layer that could work +with these packages, but the compatibility library is licensed under +the GNU GPL, which could conflict with the license of certain programs +that support CUPS. Therefore, the cups packages as shipped do not +support SSL. + +It is possible to build the packages yourself with SSL support. You +can either use the OpenSSL libraries or GNU TLS's OpenSSL +compatibility library. Just set an environment variable: +"CUPS_OPENSSL" for OpenSSL support, or "CUPS_GNUTLS" for GNU TLS +support, and make sure you have the proper development packages +installed (libssl-dev for OpenSSL or libgnutls7-dev for GNU TLS). + +PLEASE NOTE: If you build packages with SSL support and distribute +them, you are responsible for making sure you do not violate the +licenses of any of the software you distribute. + +Important Security Notes +------------------------ + + - By default, cups is configured to only allow connections to + printers from localhost, effectively disabling network printing. + The previous default was to allow anyone to connect to printers + from any location. You can change these defaults by editing + /etc/cups/cupsd.conf; the access controls are at the end of the + file. Be sure you only allow access from the locations you trust, + or require authentication. + + - CUPS used to support a file backend that was handled internally by + cupsd. This was only intended to be used for testing filters, and + not in production use, as it can be a security risk and will drop + jobs under certain circumstances. In keeping with that, the file + "backend" has been renamed to "test", and the lpadmin command no + longer rewrites bare path URIs (either to "file:" or "test:"). If + you need a backend that dumps a completed job to a file on the + filesystem, you should write a separate backend and put it in + /usr/lib/cups/backend. See the CUPS documentation for information + on how to do this. + + - To relieve the burden of local authentication somewhat, CUPS uses + special tokens called "certs" that are passed between client and + server. In normal CUPS installations, these are stored in + /etc/cups/certs. However, this location violates Debian policy, as + the certs are generated and not available to edit. Thus, the real + certs are now stored in /var/spool/cups/certs, with a symlink at + /etc/cups/certs for compatibility. + +Drivers +------- + +The CUPS software includes generic drivers for several brands of +printers. At the moment, this includes HP LaserJets and DeskJets, +various Epson and Okidata printers, and Dymo label printers. + +There are also other packages containing CUPS printer drivers. If any +of those were written explicitly for your printer, chances are that it +will support your printer better than the generic drivers that ship +with CUPS. I try to keep the package Suggestions current regarding +popular CUPS driver packages; to see this list, run this command: + + apt-cache show cups | grep Suggests + +PostScript printers often ship with PPD files supplied by the printer +manufacturer. Any valid PPD for a PostScript printer is a valid CUPS +driver. To enable them for use with CUPS, copy the PPDs into +/usr/share/cups/model; they should then be available for use with +lpadmin -m and the Web interface for adding printers. + +If you find a CUPS driver that isn't packaged for Debian and you'd +like it to be, you can contact me and let me know where the driver is, +and I'll get to it as soon as I can. + +Or, you can package them yourself. See below for details. + +Packaging +--------- + +There are five packages provided by CUPS: the server, the primary +command-line client programs, the BSD client and server compatibility +programs, and the library and development packages. + +The CUPS BSD commands and cups-lpd daemon are separated into their own +package (cups-bsd); the hope is to make it possible to run CUPS and +some other BSD-style printing system (such as lpr) side-by-side for +testing purposes. If you encounter any trouble doing this, file a +bug. It's known that CUPS conflicts with LPRng, since LPRng provides +some System V printing commands as well; this problem will (hopefully) +be dealt with in time. + +Add-ons for CUPS (such as drivers, backends, clients, etc.) should +depend on the proper packages. If your package is CUPS-specific, you +should name it so it can be easily identified as a CUPS package, with +names such as: + + cups-driver-foo (for a driver for Foo printers) + cups-backend-bar (for a backend to print to Bar printers) + cups-client-baz (for a client module to hook Baz into CUPS) + +If you feel your driver/backend/client/whatever package is popular +enough that most CUPS users would be interested in it, please file a +wishlist bug against cups requesting that it be added to the +Suggests line for cups. + +Other Add-Ons +------------- + +I'm also collecting add-ons - filters, backends, etc. - and putting +them in the "examples" directory with the rest of the cups package +documentation files. Check there for some interesting filters and +backends. + +To install a filter from the filters directory, copy the filter itself +into /usr/lib/cups/filter and the associated .types and .convs files +into /etc/cups. Then restart cupsd, and you should be ready to use +it. + +If you have a filter or backend you'd like to contribute, but don't +think it's big enough to warrant its own package, file a wishlist bug +and attach your script. If it's a filter, send along a .convs and +.types file as well. + +Integration with Samba +---------------------- + +It is possible to configure Samba to share CUPS printers to Microsoft +clients. There are two ways to do this: + +1. Recent versions of Samba have direct CUPS support, including +Debian's. With this present, you can configure Samba as follows: + +[global] + printing = cups + printcap name = cups + +2. If, for some reason, you don't want to use Samba's native CUPS +support, you can configure Samba to use System V printing. This can +be done by adding the following information to Samba's smb.conf +(/etc/samba/smb.conf on Debian): + +[global] + printing = sysv + printcap name = lpstat + +[printers] + lpq command = /usr/bin/lpstat %p + lprm command = /usr/bin/cancel %p-%j + print command = /usr/bin/lp -d%p -oraw %s ; /bin/rm -f %s + +This method will require installation of the cups-client package. + +For more tips on integration with Samba, check out the man page for +cupsaddsmb, which is part of the cups-client package. + +Miscellaneous Tips +------------------ + + - CUPS has support for browsing, which uses broadcast traffic to + auto-discover other CUPS servers and printers and make them + available to clients. In the default configuration, cupsd will + accept browse packets in the CUPS format from other CUPS servers, + but will not send any. If sending browse packets is turned on, it + may trigger demand dialers and increase traffic on the network. To + help prevent this, set the BrowseAddress parameter to only + advertise CUPS printers on specific interfaces. As a potentially + more robust option, CUPS also supports SLP (Service Location + Protocol). + + - You may encounter some problems using the "enable" command under + bash, as "enable" is a builtin there. As a workaround, I've + created the "cupsenable" command, which acts exactly as "enable" + does. There are also "cupsdisable", "cupsaccept", and "cupsreject" + commands for consistency. + + - There is an online database with PPDs for lots of different + printers at http://www.linuxprinting.org/. These will often + require the "cupsomatic" utility; this can be found in the + foomatic-bin package. Another case, some PPDs require the + "foomatic-rip" utility; this can be found in the + foomatic-filters package (this package will be installed when you + install foomatic-filters-ppds package). + + - Default location of pid file is /var/run/cups/cupsd.pid. + If you'd like to change this, you can modify by using + "PidFile " directive at your /etc/cups/cupsd.conf. + +Enjoy! + + -- Jeff Licquia and Kenshi Muto diff --git a/debian/README.source b/debian/README.source new file mode 100644 index 0000000..c194aa2 --- /dev/null +++ b/debian/README.source @@ -0,0 +1,20 @@ +cups packaging for Debian +------------------------- + +cups is maintained with bzr-builddeb on bzr.debian.org (see Vcs-Bzr: control +field). bzr-builddeb is documented at /usr/share/doc/bzr-builddeb/ (README.gz or +README.html, or the comprehensive user_manual/). + +It uses the common dpatch patch system, see +/usr/share/doc/dpatch/README.source.gz for details. + +The really short path to get a buildable source tree is: + + debcheckout cups + cd cups + bzr bd-do + +Then you can do dpatch-edit-patch, change debian/*, etc. When you "exit 0", the +changes to debian/ will be written back to the bzr checkout, where you can +debcommit them. + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..65c76db --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5569 @@ +cups (1.5.3-11slp2) unstable; urgency=low + + * Fixed build error that it can't find gcrypt.h + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-11slp2 + + -- GangHeok Kim Thu, 16 Aug 2012 18:22:45 +0900 + +cups (1.5.3-10slp2) unstable; urgency=low + + * Fixed build error not to find gcrypt.h + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-10slp2 + + -- GangHeok Kim Tue, 14 Aug 2012 11:01:25 +0900 + +cups (1.5.3-9slp2) unstable; urgency=low + + * Update version for submitting to SLP:Main as correct SR note + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-9slp2 + + -- GangHeok Kim Fri, 27 Jul 2012 13:23:13 +0900 + +cups (1.5.3-8slp2) unstable; urgency=low + + * Changed dnssd backend to ignore SIGPIPE + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-8slp2 + + -- GangHeok Kim Thu, 26 Jul 2012 22:55:21 +0900 + +cups (1.5.3-7slp2) unstable; urgency=low + + * Updated to cups_1.5.3-3ubuntu1 to fix ipp printing issue + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-7slp2 + + -- GangHeok Kim Thu, 26 Jul 2012 14:35:59 +0900 + +cups (1.5.3-6slp2) unstable; urgency=low + + * Updated changelog version because OBS merging was incorrect. + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-6slp2 + + -- GangHeok Kim Wed, 25 Jul 2012 09:07:44 +0900 + +cups (1.5.3-5slp2) unstable; urgency=low + + * Added cups-data pacakge(rw) for FOTA update + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-5slp2 + + -- GangHeok Kim Mon, 23 Jul 2012 16:57:07 +0900 + +cups (1.5.3-4slp2) unstable; urgency=low + + * Deleted addgroup in spec file for security + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-4slp2 + + -- GangHeok Kim Mon, 23 Jul 2012 16:46:17 +0900 + +cups (1.5.3-3slp2) unstable; urgency=low + + * Fixed printcap file permission error + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-3slp2 + + -- GangHeok Kim Sun, 22 Jul 2012 16:27:33 +0900 + +cups (1.5.3-2slp2) unstable; urgency=low + + * Fixed the issue that installed files of cups are duplicate with cups-filters + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-2slp2 + + -- GangHeok Kim Fri, 20 Jul 2012 13:21:17 +0900 + +cups (1.5.3-1slp2) unstable; urgency=low + + * Update to version 1.5.3 + * Git: slp/pkgs/c/cups + * Tag: cups_1.5.3-1slp2 + + -- GangHeok Kim Wed, 18 Jul 2012 21:42:02 +0900 + +cups (1.5.3-0ubuntu1) precise-proposed; urgency=low + + [ Till Kamppeter ] + * New upstream release + - Numerous fixes on IPP (LP: #945028, LP: #973270, LP: #990734, + LP: #992468, LP: #992982, LP: #1000172, LP: #1000758) + - USB backend based on the maintained libusb 1.0.x with support for + bi-directional communication + - Fixes on SNMP-based supply level reporting + - PostScript prtinter auto-configuration reliable now + - Several fixes on PostScript, SSL, authenticated printing, and + networking issues + * debian/patches/ipp-fixes-1.5.3.patch, + debian/patches/fix-empty-translations.patch, + debian/patches/ppd-cache-fix-crash.patch, + debian/patches/commandtops-make-robust-against-broken-postscript.patch, + debian/patches/cups-polld-reconnect.patch, + debian/patches/usb-backend-libusb-1.0.patch, + debian/patches/usb-backend-backchannel-support.patch: Removed patches which + got included upstream. + * debian/patches/fix-supply-level-computation-for-percent-supply-unit.patch, + debian/patches/fix-supply-levels-for-enumerated-prtmarkersupplieslevel.patch, + debian/patches/fix-status-reports-when-supply-levels-grow.patch, + debian/patches/add-status-reports-for-full-waste-trays-and-cleaner-unit-eol.patch, + debian/patches/match-marker-colorants-which-use-non-standard-string.patch, + debian/patches/truncate-marker-supply-names-at-comma.patch: Removed supply + level report fixes. This got solved differently upstream. + * debian/patches/do-not-suppress-inputslot-setting-with-empty-ap-d-inputslot.patch: + Removed, problem solved differently upstream. + * debian/patches/cups-avahi.patch: Manually regenerated to adapt to upstream + changes. + * debian/patches/ppd-poll-with-client-conf.patch, + debian/patches/colord-support.patch, + debian/patches/airprint-support.patch, + debian/patches/no-conffile-timestamp.patch, + debian/patches/drop_unnecessary_dependencies.patch, + debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch, + debian/patches/show-compile-command-lines.patch: Refreshed using quilt. + * debian/patches/usb-backend-busy-loop-fix.patch: Correct loops to repeat + claiming interfaces on USB devices when they are busy. Before, hitting busy + state made the device opening function error out without comment + (LP: #987485). + * debian/patches/usb-backend-detach-usblp-earlier-crash-guards.patch: Protect + against crashes by checking error codes of libusb functions (LP: #997040) + and detach usblp kernel module in an earlier stage when opening a device + (LP: #987485, LP: #997040). + * debian/patches/usb-backend-initialize-usblp-attached-state.patch: Initialize + usblp_attached field in printer data structure to assure that detaching + and re-attaching the usblp kernel module is always done correctly + (LP: #902535, LP: #959676, LP: #960666, LP: #987485, + LP: #995111, LP: #997040, LP: #1000253, LP: #1001028). + * debian/patches/install-sh-remove-bashism.patch: Removed bashism. + * debian/local/blacklist-cups-usblp.conf, debian/cups.postinst, + debian/cups.install: Blacklist the "usblp" kernel module again. We have + now a full-featured USB backend based on the maintained libusb 1.0.x + and so we can acess printers always through the raw USB devices making + the module deprecated. Detaching the kernel module for each access causes + a lot of problems: LP: #902535, LP: #959676, LP: #960666, LP: #987485, + LP: #995111, LP: #997040, LP: #1000253, LP: #1001028. + + [ Martin Pitt ] + * debian/cups.{preinst,postinst,postrm}: Drop the removal of obsolete + /etc/modprobe.d/blacklist-cups-usblp.conf conffile, as this file is + reintroduced now. + + -- Till Kamppeter Wed, 23 May 2012 15:28:01 +0200 + +cups (1.5.2-9ubuntu1) precise; urgency=low + + * Don't wait on udevtrigger before starting cups; the only reason this + is here is to let '/lib/udev/udev-configure-printer enumerate' work, but + if cups does start before we've cold-plugged everything, the udev rule + will call '/lib/udev/udev-configure-printer add' for each device it + discovers anyway, so this is redundant. + + -- Steve Langasek Mon, 09 Apr 2012 08:24:48 -0700 + +cups (1.5.2-9) unstable; urgency=low + + [ Till Kamppeter ] + * debian/control: In the Recommends: section of the "cups" binary package + replaced "cups-driver-gutenprint" by "printer-driver-gutenprint" to + reflect the new name (LP: #966217). + * debian/patches/cups-polld-reconnect.patch: The CUPS polling daemon did not + reinitialize its connection to the remote server on errors in all cases + (LP: #965124, CUPS STR #4031, Red Hat bug #799595). + * debian/patches/commandtops-make-robust-against-broken-postscript.patch: + Updated patch to the upstream state of commandtops. + * debian/patches/ppd-cache-fix-crash.patch: Added NULL check to fix crash + of cupsd on corrupted data in /var/cache/cups/ (LP: #957023, CUPS STR + #4049). + * debian/patches/cups-avahi.patch: Refreshed with quilt. + + [ Martin Pitt ] + * debian/cups.postinst: Don't fall over if /etc/apparmor.d/local exists and + is not a directory. (LP: #962226) + + -- Martin Pitt Fri, 30 Mar 2012 08:44:35 +0200 + +cups (1.5.2-8) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/ipp-fixes-1.5.3.patch: Updated IPP backend to the state of + the upcoming CUPS 1.5.3, fixing most of the known problems with printing + to IPP printers or servers. + * debian/patches/ipp-backend-fails-to-trigger-authentication-prompts.patch, + debian/patches/ipp-backend-http-1.0-fallback-fix.patch, + debian/patches/ipp-backend-missing-document-type.patch: Removed old + patches for the IPP backend. + + [ Martin Pitt ] + * test-i18n-nonlinux.patch: Fix typo in #if which broke the patch. Hopefully + Closes: #662996 for good now. + + -- Martin Pitt Wed, 14 Mar 2012 14:40:23 +0100 + +cups (1.5.2-7) unstable; urgency=low + + * Add fix-empty-translations.patch: Do not translate msgids to empty + strings. Backported from upstream SVN. (LP: #953321) + * Add test-i18n-nonlinux.patch: Do not run the CUPS_EUC_JP test case on + BSD/Hurd either, as glibc's iconv behavior is different than what the test + expects. (Closes: #662996) + * debian/local/apparmor-profile: Allow gs to read /proc/*/auxv; it's + harmless information. (LP: #936629) + * debian/cups.dirs, debian/rules: Disable /usr/local/share/ppd/ directory + for now, until dh_usrlocal stops failing on those. + + -- Martin Pitt Tue, 13 Mar 2012 11:46:09 +0100 + +cups (1.5.2-6) unstable; urgency=low + + [ Till Kamppeter ] + * debian/cups.postinst: Run "triggered" code porion of cups postinstall + script also when configuring cups ("configure") so that when cups + and a printer driver package (which triggers cups to update the PPD files + of existing print queues) get updated together the PPD update for sure + happens also if the driver's trigger action is not executed due to cups + also being updated (LP: #932882). + + [ Martin Pitt ] + * debian/control: Wrap dependencies. + * debian/control, debian/rules: Move from hardening-wrapper to using + dpkg-buildflags. Bump dpkg-dev build dependency to (>= 1.16.1~) for this. + * Add tests-ignore-warnings.patch: Ignore warnings from colord and Avahi in + the tests, as they change the expected number of warnings. These services + are not running in a buildd environment. + * debian/rules: Have package fail to build on test failures again. + * debian/copyright: Convert to copyright format 1.0, and update to current + license/copyrights. + * debian/control: Bump Standards-Version to 3.9.3. + * debian/control: Build against libpng-dev, with an alternative to the older + libpng12-dev. (Closes: #662294) + * debian/control: Prefer building against libtiff5-dev if available, falling + back to libtiff-dev. + * Add tests-ignore-usb-crash.patch: Ignore "[cups-deviced] PID 17962 (usb) + crashed on signal 11!" errors in the log during the test suite. This seems + to regularly happen on Debian/Ubuntu buildds. + + -- Martin Pitt Mon, 05 Mar 2012 08:05:41 +0100 + +cups (1.5.2-5) unstable; urgency=low + + * debian/patches/commandtops-make-robust-against-broken-postscript.patch: + CUPS' commandtops filter allows auto-configuration of the default option + settings of PostScript printers querying the printer using PostScript + commands defined in the PPD file ("*?..." entries). Problem is that if + one of the query commands has a PostScript error (rather common in + manufacturer-supplied PPD files) the printer errors out and ignores all + subsequent queries putting the auto-configuration job into a 90-second + timeout for each query. This patch protects the job against failures + on broken PostScript and shortens the timeout to 10 seconds, so that + as many options as possible get auto-configured in a reasonable time. + Thanks to Helge Blischke for applying the needed PostScript tricks + (CUPS STR #4028). Now auto-configuration of PostScript printers actually + works by sending a job like "echo -en '#CUPS-COMMAND\nAutoConfigure\n' | + lp -d " which could be done by a button in a printer setup tool. + + -- Till Kamppeter Thu, 23 Feb 2012 14:52:01 +0100 + +cups (1.5.2-4) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/blacklist-cups-usblp.conf, debian/cups.install: Removed + the blacklisting of the "usblp" kernel module. The new libusb-1.0.x- + based "usb" backend automatically disconnects the module from the + printer with which it communicates and reconnects it afterwards. This + way we can keep the module available for third-party drivers but let + the CUPS backend use the more modern libusb method, especially + providing bi-di access for all printers (CUPS STR #3626). + + [ Martin Pitt ] + * Clean up /etc/modprobe.d/blacklist-cups-usblp.conf conffile on upgrade, + using dpkg-maintscript-helper. Add necessary dpkg pre-depends for this. + * debian/cups.{pre,post}inst: Remove upgrade transitions for versions prior + to Debian Squeeze/Ubuntu 10.04 LTS. + + -- Till Kamppeter Thu, 16 Feb 2012 11:28:36 +0100 + +cups (1.5.2-3) unstable; urgency=low + + * debian/patches/usb-backend-backchannel-support.patch: Added backchannel + (bi-directional access) support to the "usb" backend. This allows things + like status checks, auto-configuration (run command "echo -en + '#CUPS-COMMAND\nAutoConfigure\n' | lpr -P " on USB-connected + PostScript printer with manufacturer's PPD), and also use of proprietary + manufacturer drivers which require read-back from printer (CUPS STR #2890). + + -- Till Kamppeter Thu, 09 Feb 2012 06:17:57 +0100 + +cups (1.5.2-2) unstable; urgency=low + + * debian/patches/series: Actually add the new patches for the IPP backend and + the SNMP supply level check (LP: #879625, LP: #881843, LP: #925086, + LP: #926457). + + -- Till Kamppeter Tue, 07 Feb 2012 17:57:57 +0100 + +cups (1.5.2-1) unstable; urgency=low + + [ Till Kamppeter ] + * New upstream release + * debian/patches/00svn_gif_overflow.patch, + debian/patches/cups-driverd-recognize-cached-drv-generated-ppds.patch, + debian/patches/dont-send-malformed-dbus-messages.patch, + debian/patches/execute-commandtops-commands.patch, + debian/patches/usb-backend-gracefully-fail-on-more-cases-of-bad-device-id.patch, + debian/patches/usb-backend-skip-set-configuration-set-interface.patch: + Removed, included upstream. + * debian/patches/ipp-patch-r8950+.patch, + debian/patches/ipp-backend-fails-to-trigger-authentication-prompts.patch, + debian/patches/ipp-backend-missing-document-type.patch, + debian/patches/ipp-backend-http-1.0-fallback-fix.patch: Replaced patch + for downgrading to the IPP backend to the version of CUPS 1.4.x by patches + for the current backend (LP: #879625, LP: #881843, CUPS STR #3985, + CUPS STR #3986, CUPS STR #3988, thanks to Robert Bradley, robert dot + bradley1 at gmail dot com, for the patches). + * debian/patches/drop_unnecessary_dependencies.patch: Updated patch to + add "-lm" to the linker command line, libcups uses the "fmod()" function + now. + * debian/patches/cups-avahi.patch, + debian/patches/usb-backend-libusb-1.0.patch, + debian/patches/printer-filtering.patch: + Manually regenerated to adapt to upstream changes. + * debian/patches/pidfile.patch, + debian/patches/rootbackends-worldreadable.patch, + debian/patches/colord-support.patch, + debian/patches/airprint-support.patch, + debian/patches/no-conffile-timestamp.patch, + debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch, + debian/patches/do-not-broadcast-with-hostnames.patch, + debian/patches/do-not-suppress-inputslot-setting-with-empty-ap-d-inputslot.patch, + debian/patches/confdirperms.patch, + debian/patches/show-compile-command-lines.patch, + debian/patches/log-debug-history-nearly-unlimited.patch, + debian/patches/dnssd-reg-array-linear-search.patch: + Refreshed using quilt. + * debian/patches/fix-supply-level-computation-for-percent-supply-unit.patch, + debian/patches/fix-supply-levels-for-enumerated-prtmarkersupplieslevel.patch, + debian/patches/fix-status-reports-when-supply-levels-grow.patch: + The printer supply levels reported via SNMP, according to the printer MIB + were not correctly interpreted (LP: #925086, CUPS STR #4016, thanks to + Peter Hurley, peter at hurleysoftware dot com, for the patches). + * debian/patches/add-status-reports-for-full-waste-trays-and-cleaner-unit-eol.patch: + Added status reports for waste tray status and cleaner unit end-of-life + (LP: #925086, CUPS STR #4017, thanks to Peter Hurley, peter at + hurleysoftware dot com, for the patch). + * debian/patches/match-marker-colorants-which-use-non-standard-string.patch: + Try harder to match supply colorant values (LP: #925086, CUPS STR #4019, + thanks to Peter Hurley, peter at hurleysoftware dot com, for the patch). + * debian/patches/truncate-marker-supply-names-at-comma.patch: Commas in + marker supply names misinterpreted as additional markers (LP: #926457, + CUPS STR #4020, thanks to Peter Hurley, peter at hurleysoftware dot com, + for the patch). + * debian/cups.postinst, debian/cups.prerm: Updated symlinks for alias names + of debconf-selectable CUPS backends. + + [ Martin-Éric Racine ] + * Removed myself from Uploaders. + + [ Martin Pitt ] + * debian/control: Drop now obsolete poppler-dev build dependency, thanks + Pino Toscano. (Closes: #658237) + * Drop do-not-emit-ps-level-3-with-poppler.patch, filter is now built by + the cups-filters package. + * debian/control, debian/rules: libusb-1.0 is not available on hurd. Drop + build dependency on hurd and build with --disable-libusb there. Thanks + Pino Toscano for the patch. (Closes: #658236) + + -- Martin Pitt Tue, 07 Feb 2012 09:29:59 +0100 + +cups (1.5.0-16) unstable; urgency=low + + [ Till Kamppeter ] + * debian/filters/, debian/local/backends/, debian/local/filters/, + debian/local/cpdftocps.convs, debian/local/oopstops.convs, + debian/local/oopstops.types, debian/local/postscript.ppd, + debian/local/pstopdf.convs, debian/local/pstopdf.types, + debian/local/text.convs, debian/local/textonly.ppd, debian/cups.install, + debian/cups-common.links, debian/cups.links, debian/rules: Removed all + add-on filters and backends which now get hosted by OpenPrinting in the + OpenPrinting CUPS filters package (Debian package "cups-filters"). Also + removed some obsolete or redundant filters/backends/PPDs: mailto, oopstops, + dvipipetops, samba-to-ps, postscript.ppd, pdf.ppd. + * debian/rules: Removed filters, backends, and MIME conversion rules from + upstream CUPS which have now moved to the cups-filters package. + * debian/rules: Do not apply the PDF filters add-on package any more as + the filters are supplied by cups-filters now. Call aclocal and + autoconf explicitly, as the add-on package does not call them for us + any more. + * debian/control: Let the cups binary package depend on cups-filters, so + that the moved filters and backends stay available. + * debian/control: Do not build-depend on liblcms1-dev any more. We do not + have the PDF filters in this package any more. + * debian/control: Do not depend on ttf-freefont any more. + * debian/cups.lintian-overrides: Removed entries for serial and parallel + backends. + * debian/cups.postinst, debian/cups.prerm, debian/cups.templates, + Updated debconf for the removal of the parallel and serial backends. + * debian/patches/ubuntu/poppler-0.18.patch: Removed, as the CUPS package + does not contain the PDF filters any more. + + [ Martin Pitt ] + * debian/rules: Stop setting LC_MESSAGES, this was fixed upstream in the + test suite a while ago. + * Drop debian/dirs: Unnecessary. + * Drop debian/suid: Not used anywhere, and the time when cups shipped suid + backends is long gone. + * Drop debian/docs: Redundant with debian/cups.docs. + * Drop debian/patches/pdftops-testsuite.patch: Not applied, and fixed + upstream. + * manpage-translations.patch: Update German translations, thanks Helge + Kreutzmann. (Closes: #630217) + * Add Polish debconf translations, thanks Michał Kułach. (Closes: #657670) + * debian/local/apparmor-profile: Allow cups-pdf to read /var/spool/cups. + (LP: #923538) + + -- Martin Pitt Mon, 30 Jan 2012 08:35:28 +0100 + +cups (1.5.0-15) unstable; urgency=low + + * debian/patches/execute-commandtops-commands.patch: When sending maintenance + command files to PostScript printers the commands got printed as plain text + and not executed, due to the "commandtops" filter not being executed + (CUPS STR #4007). + * debian/patches/series, + debian/patches/usb-backend-gracefully-fail-on-more-cases-of-bad-device-id.patch, + debian/patches/usb-backend-libusb-1.0.patch, + debian/patches/usb-backend-skip-set-configuration-set-interface.patch: + Added references to the upstream bugs under which these patches got + submitted upstream as header comments. Also moved the entries in the series + file to the section of patches submitted upstream. + * debian/patches/usb-backend-libusb-1.0.patch: Updated the patch to correctly + generate the make/model string if no device ID could be found. Before, + arbitrary memory content was picked up, not only giving an ugly listing + of the ID-less printer in printer setup tools but also a being a potential + crash bug. + + -- Till Kamppeter Fri, 20 Jan 2012 10:02:27 +0100 + +cups (1.5.0-14) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-libusb-1.0.patch: Migrated the "usb" CUPS + backend to libusb 1.0.x, as libusb 0.1.x is deprecated and not maintained + upstream any more. Also make printers working independent of what gets + reported as their device ID, including random characters or nothing. This + should especially make all USB->Parallel adapters work (LP: #910272). + * debian/control: Build-depend on libusb-1.0-0-dev instead of on libusb-dev. + + [ Martin Pitt ] + * debian/local/filters/pdf-filters/pdftoopvp/OPVPOutputDev.{h,cxx}: Drop + definition of drawLink(). It is not being used anywhere and uses the + "Link" class which is gone in poppler 0.18. + * Add debian/patches/ubuntu/poppler-0.18.patch: Port SplashFontEngine() + constructor call to poppler 0.18 API. Keep it as Ubuntu patch until Debian + gets poppler 0.18, too. (Closes: #645507) + + -- Martin Pitt Mon, 16 Jan 2012 10:51:53 +0100 + +cups (1.5.0-13) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/ipp-patch-r8950+.patch: Revert the IPP backend to the state + of CUPS 1.4.x, as the 1.5.x versiuon has major regressions (LP: #877958, + LP: #879625, LP: #881843, LP: #883585, Closes: #638521, CUPS STR #3966, + CUPS STR #3967). This patch will get removed as soon as upstream has fixed + all these regressions. As upstream did not announce any new features for + the IPP backend in the release notes for 1.5.x, we assume that with this + step no features will get lost. + * debian/patches/dont-send-malformed-dbus-messages.patch: Do not send D-Bus + notifications with too few parameters when there are parameters which + cannot be added to the D-Bus request, especially invalid UTF-8 strings. + This made gnome-session-daemon crash (LP: #893676, CUPS STR #3984). + * debian/local/filters/cpdftocps: The cpdftocps filter (used for PostScript + printers and for drivers with PPDs which are not PDF-aware) did not + recognize the duplex setting correctly, making duplex not working on + many common printers (LP: #897723). + * debian/local/filters/cpdftocps: Cleaned up the header comments. + + [ Martin-Éric Racine ] + * [cups.postrm]: purge /etc/cups/ssl/server.[crt|key] and /etc/cups/ssl. + + [ Martin Pitt ] + * debian/compat: Bump from 5 to 9, this apparently was forgotten in the + Multi-Arch transition. + + -- Martin Pitt Fri, 02 Dec 2011 11:05:51 +0100 + +cups (1.5.0-12) unstable; urgency=low + + [ Martin-Éric Racine ] + * debian/control: cups-ppdc: move from net/optional to utils/optional + to match the repository override's correct assumption. + * Fixed: Lintian: W: spelling-error-in-changelog: lenght length. + * Fixed: Lintian: I: conflicts-with-version: cupsddk-drivers (<< 1.4.0). + * Fixed: Lintian: I: conflicts-with-version: cupsddk (<< 1.4.0). + * Fixed: Lintian: W: symbols-file-contains-debian-revision: 1.5.0-0ubuntu1 + (-0ubuntu1 version removed): _mimeError@Base and mimeNew@Base. + * Removed |libheimdal-dev from libcups2-dev Depends. (Closes: #648105) + + [ Martin Pitt ] + * Add debian/source/options: Ignore .bzr-builddeb/, for developers who use + bzr, but not bzr-buildpackage. + * debian/cups.lintian-overrides: Quiesce "possible-missing-stop" warning, we + quite deliberately do not run the init script on levels 0 and 6. + + -- Martin Pitt Sun, 13 Nov 2011 14:39:22 +0100 + +cups (1.5.0-11) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-gracefully-fail-on-more-cases-of-bad-device-id.patch: + When reading out the device ID check also for too short lengths of the + device ID and also in this case try to change the byte order of the length + bytes and fail if the device ID lenght is still too short (LP: #887094). + * debian/patches/usb-backend-skip-set-configuration-set-interface.patch: + Avoid unneeded SET_CONFIGURATION and SET_INTERFACE requests after the + printer has already been configured. This often leads to subsequent jobs + coming out as garbage or not at all (CUPS STR #3965, LP: #872483). + * debian/patches/usb-backend-reset-printer-before-printing.patch: Removed, + as we are using the less invasive approach of CUPS STR #3965 now. + This also removes the Linux specific #include, causing FTBFS on non-Linux + platforms. (Closes: #647666) + * debian/cups.postinst: Allow PPD updater trigger files in + /usr/share/cups/ppd-updaters/ also be named + printer-driver-.ppd-updater and not only or + .ppd-updater. This makes it easier to provide these + files in the printer driver packages when we rename all binary packages + of printer drivers to "printer-driver-". + + [ Martin-Éric Racine ] + * debian/control: + + Added the Homepage field. + + Cleaned up duplicate Build-Depends. + * Removed |libheimdal-dev alternative from Build-Depends (Closes: #648105) + + -- Martin Pitt Fri, 11 Nov 2011 15:48:39 +0100 + +cups (1.5.0-10) unstable; urgency=low + + * debian/cups.postinst: Allow PPD updater trigger files in + /usr/share/cups/ppd-updaters/ also be named .ppd-updater + and not only simply . This makes it easier to provide these + files in the printer driver packages. + * debian/patches/usb-backend-reset-printer-before-printing.patch: When + using the "usb" CUPS backend, reset the printer before each job as + otherwise on some printers subsequent jobs will come out as garbage + (LP: #872483). + + -- Till Kamppeter Fri, 21 Oct 2011 06:26:41 +0200 + +cups (1.5.0-9) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/do-not-suppress-inputslot-setting-with-empty-ap-d-inputslot.patch: + CUPS adds the option setting "AP_D_InputSlot=" to every job. This overrides + the InputSlot option and so the InputSlot setting and even the default + setting for InputSlot in the PPD get never used, rendering InputSlot + useless (LP: #872527). + * debian/patches/cups-avahi.patch: Updated patch from upstream (Red Hat) + to fix crashes of the CUPS daemon when using the timeout function call + functionality (LP: #860691, LP: #860498). + + [ Martin Pitt ] + * debian/local/apparmor-profile: Also allow cups to map libraries under + /usr/local/. (LP: #860765) + * cups-avahi.patch: Make sure to guard against retrying the Avahi connection + whilst already doing so. Thanks to Tim Waugh for the patch! (LP: #877967) + + [ Michael Vogt ] + * debian/control: Add Conflicts/Replaces: libcupsys2 to ensure that the apt + resolver can calculate the upgrade in a multiarch scenario where a old + libcupsys2 package is installed (LP: #874835) + + -- Martin Pitt Wed, 19 Oct 2011 14:57:50 +0200 + +cups (1.5.0-8) unstable; urgency=medium + + * Urgency medium due to security fix. The previous version wasn't in testing + yet, but already matured for half of the usual period, so it will still + be 10 days in sum. + * Add 00svn_gif_overflow.patch: Fix heap overflow with broken/crafted GIF + files. Patch taken from upstream svn. [CVE-2011-3170] + + -- Martin Pitt Tue, 27 Sep 2011 14:46:38 +0200 + +cups (1.5.0-7) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/dnssd-reg-array-linear-search.patch: Let the array of + DNS-SD-registered printers be searched linearly and not binarily by + the DNS-SD service name, as due to another bug the DNS-SD service name + is not correctly set in some array elements (LP: #855445). Not + reporting upstream yet, as the original bug can be in the Avahi + support patch. + + [ Martin Pitt ] + * debian/local/cups.upstart: Lower the timeout for waiting for the socket + to 3 seconds. Tweak the respawn count and limit to be longer than the + socket poll time, so that a continuously failing cupsd process will not + cause an eternal respawn loop. (LP: #854490) + * debian/control: Have libcupsmime1 break pre-1.5 versions of cups as well, + so that we avoid having a configured "cups" packae with an upgraded, but + unconfigured libcupsmime1 package. This takes care of LP: #854490 during + upgrades. + * debian/rules: Configure with --enable-debug, to stop the upstream build + system stripping all our binaries. This fixes the cups-dbg package. + + -- Martin Pitt Thu, 22 Sep 2011 19:57:54 +0200 + +cups (1.5.0-6) unstable; urgency=low + + * debian/cups-client.install: Do not install the jpg/pdf/ps ipptool test + files. They are quite large, and not used anywhere by cups itself. + * debian/libcups2.symbols, debian/libcupsmime1.symbols: Drop revisions from + new symbols of 1.5.0. + * debian/local/apparmor-profile: Some third-party filters install themselves + into a subdirectory of /usr/lib/cups/filter, adjust rule. (See LP #160092) + * debian/control: Force libcups2 (>= 1.5) dependency on libcupsmime1, as it + uses private symbols from libcups2. (Closes: #641182) + * debian/libcupsmime1.symbols: Drop Debian revision suffix. + * Update debconf translations (debconf-updatepo). + + -- Martin Pitt Thu, 15 Sep 2011 12:03:27 +0200 + +cups (1.5.0-5) unstable; urgency=low + + [ Till Kamppeter ] + * debian/cups.postinst: When executing the trigger on *.ppd-updater files of + printer driver packages, log the modification dates of the *.ppd-updater + (are more or less the build dates of the driver packages) after updating + the PPDs of the existing queues for this package and only update again if + the *.ppd-updater file has a different modification date (package got + replaced). This avoids unnecessary updates and so long delays when one + printer driver package gets updated. + * debian/control: Added myself to Uploaders: to avoid Lintian warnings about + unlogged NMUs. + + [ Martin Pitt ] + * debian/control: Bump Breaks: cups version for libcups2, as cupsd seems to + use internal private symbols from this library. (Closes: #638462) + + -- Till Kamppeter Mon, 22 Aug 2011 12:13:43 +0200 + +cups (1.5.0-4) unstable; urgency=low + + * debian/cups.postinst: Another fix for the PPD updater: Let the PPD updater + not stop altogether in the case that for one driver there is no entry at all + in the output of "lpinfo -m". This is for example the case for + foomatic-db-engine if foomatic-db is not installed. + + -- Till Kamppeter Fri, 19 Aug 2011 06:38:18 +0200 + +cups (1.5.0-3) unstable; urgency=low + + * debian/patches/cups-driverd-recognize-cached-drv-generated-ppds.patch: + CUPS did not recognize that the PPD files generated by *.drv are cached + in ppds.dat, and when reloading them over the entries already loaded from + the cache, the PPD list got totally messed up (CUPS STR #3921). + * debian/cups.postinst: Clear PPD cache when upgrading from an older version + to remove the buggy entries for the *.drv files. + * debian/cups.postinst: Fixes on the PPD updater: + o Added "return 0" at the end of the ppd_updater() function, otherwise + the progrem terminates at its end and so only the first updater file + in /usr/share/cups/ppd-updaters/ is treated. + o Added quotes around parameter names to conserve the special characters + of the regexps. + o Made sure that when regexps are applied to the lines of the temporary + files that the resulting lines have still single newlines at their ends. + o Log for which drivers the PPDs get updated. + + -- Till Kamppeter Thu, 18 Aug 2011 08:45:53 +0200 + +cups (1.5.0-2) unstable; urgency=low + + [ Didier Raboud ] + * Add a dpkg trigger to update the queues' PPDs on (cooperative) driver + upgrades (Closes: #637978). + + [ Till Kamppeter ] + * debian/patches/cups-avahi.patch: Resynced with patch upstream (Tim Waugh, + Red Hat), via "git clone http://twaugh.fedorapeople.org/cups-avahi.git; + cd cups-avahi, git diff origin/master origin/avahi-services-1.5 > + ../cups-1.5-avahi.patch" and replacing cups-avahi.patch by the resulting + patch. + * debian/patches/airprint-support.patch: The changes for supporting Apple's + AirPrint are not in Tim Waugh's upstream repository of cups-avahi.patch. + Therefore we carry these changes in a separate patch to make syncing + with Tim's patch easier. + * debian/patches/no-conffile-timestamp.patch: Refreshed with quilt. + * debian/patches/colord-support.patch: Added colord support. Thanks to + Richard Hughes from Red Hat for the patch (LP: #787767, CUPS STR #3808). + * debian/patches/no-conffile-timestamp.patch, + debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch, + debian/patches/show-compile-command-lines.patch: Refreshed with quilt. + * debian/control: Added "Recommends: colord" to the cups binary package. + * debian/rules: Deactivated test suite failures only for this upload as the + test suite must be adapted to colord. It changes the number of warnings + in error_log which makes the test suite fail. + * debian/local/filters/pdf-filters/pdftopdf/P2PFont.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2POutput.cxx, + debian/local/filters/pdf-filters/pdftopdf/pdf2pdf.cxx: Several bug fixes + on the pdftopdf filter from the upstream author Koji Otani. This fixes + especially LP: #780935. + + -- Till Kamppeter Tue, 16 Aug 2011 17:30:37 +0200 + +cups (1.5.0-1) experimental; urgency=low + + [ Till Kamppeter ] + * New upstream release + * debian/patches/usb-backend-no-segfault-on-bad-device-id.patch, + debian/patches/usb-backend-accept-old-usblp-uris.patch, + debian/patches/use-ps2write-ghostscript-device-for-pdftops-filter.patch: + Removed, included upstream. + * debian/patches/poppler-based-pdftops-fixes.patch, + debian/patches/do-not-emit-ps-level-3-with-poppler.patch: Replaced patch + by a new one only containing the parts which remain after removing the + parts included upstream. + * debian/patches/pidfile.patch, + debian/patches/ppd-poll-with-client-conf.patch, + debian/patches/cups-avahi.patch, + debian/patches/drop_unnecessary_dependencies.patch, + debian/patches/do-not-broadcast-with-hostnames.patch, + debian/patches/ppdc-dynamic-linking.patch, + debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch: + Manually regenerated to adapt to upstream changes. + * debian/patches/manpage-translations.patch, + debian/patches/rootbackends-worldreadable.patch, + debian/patches/no-conffile-timestamp.patch, + debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch, + debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch, + debian/patches/configure-default-browse-protocols.patch, + debian/patches/logfiles_adm_readable.patch, + debian/patches/confdirperms.patch, + debian/patches/printer-filtering.patch, + debian/patches/show-compile-command-lines.patch, + debian/patches/log-debug-history-nearly-unlimited.patch: + Refreshed using quilt. + * debian/patches/default-ripcache-size-auto.patch: Dropped, as once, + Ghostscript 9.04 is ignoring the cache size value as it crashes easily + otherwise (Ghostscript upstream bug #691586) and second, CUPS defaults to + more reasonable 128 MB (now only used for imagetops). + * debian/patches/support-gzipped-charmaps.patch: Dropped, as the SBCS and + VBCS character maps are not used any more by CUPS. + * debian/rules: Enable threads in the ./configure command line, as otherwise + CUPS 1.5.0 does not build at all. + * debian/local/filters/pdf-filters/filter/pdftoijs.cxx, + debian/local/filters/pdf-filters/filter/pdftoraster.cxx, + debian/local/filters/pdf-filters/pdftoopvp/pdftoopvp.cxx, + debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Under CUPS 1.5.x. + all programs using the PPD API of CUPS need to explicitly include + "". Updated the PDF filter add-on package. + * debian/local/filters/pdf-filters/addtocups: Make the addition of the + pdftopdf and pdftoopvp directories also work with CUPS 1.5.x. + * debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/removefromcups: Added a symbolic link + cups/i18n.h, so that texttopdf builds. + * debian/cups-client.install: Install the new ipptool and its sample + files and manpages. + * debian/cups-client.install: Commented out lines for dropped man page + translations: ipptool, lppasswd, client.conf, ipptoolfile, cupsenable, + lpadmin, lpinfo, cupsreject, cupsdisable, cupsaccept + * debian/cups-common.install, debian/rules: The /usr/share/cups/charmaps + directory got removed from CUPS. + * debian/libcups2-dev.install: cups/i18n.h got renamed to + cups/language-private.h. Install this as /usr/include/cups/i18n.h. + * debian/libcups2.symbols, debian/libcupsmime1.symbols: Updated. + * debian/cups.lintian-overrides, debian/cups.postinst, debian/cups.prerm, + debian/cups.templates, debian/local/apparmor-profile: The "scsi" + CUPS backend got dropped upstream, removed its treatment from these files. + + [ Martin Pitt ] + * Add Serbian (Cyrillic) debconf translations, thanks Zlatan Todoric. + (Closes: #635105) + * Add Serbian (Latin) debconf translations, thanks Zlatan Todoric. + (Closes: #635108) + * debian/local/apparmor-profile: Allow access to serial printers on USB + adapters. (LP: #677432) + + -- Martin Pitt Sun, 07 Aug 2011 12:53:12 +0200 + +cups (1.4.8-2) unstable; urgency=low + + * debian/control: Unbreak Maintainer: field. (Closes: #636574) + + -- Martin Pitt Thu, 04 Aug 2011 13:28:47 +0200 + +cups (1.4.8-1) unstable; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf: Added "-dNOINTERPOLATE" to the Ghostscript command + line, this makes Ghostscript vastly faster. + * debian/patches/use-ps2write-ghostscript-device-for-pdftops-filter.patch: + Regenerated the patch, as we actually use it now. The "ps2write" output + device produces finally DSC-conforming PostScript and so we can use + Ghostscript for the pdftops filter. Made the patch also adding the + "-dNOINTERPOLATE" to the Ghostscript command line. + * debian/patches/series: Reactivated + use-ps2write-ghostscript-device-for-pdftops-filter.patch and promoted it + to the patches which should be submitted upstream. + * debian/rules: Build CUPS with a Ghostscript-based pdftops filter. + * debian/rules: Do not rename the pdftoraster filter of the PDF filter + add-on any more as Ghostscript has the unified gstoraster filter now. + Change the cost factor to make Ghostscript's filter being preferred. + * debian/control: Let the "cups" package require at least version 9.02 + of Ghostscript, as this version does not ship a filter named pdftoraster + any more. Added Replaces/Breaks on older Ghostscript versions + (ghostscript-cups binary package) for smooth updating. + + [ Jamie Strandboge ] + * debian/local/apparmor-profile: we need to allow both /var/run and /run + for upgrades (LP: #810687) + + [ Martin Pitt ] + * New upstream bug fix release, fixing two regressions from 1.4.7. + (Closes: #635842) + * debian/watch: Look for tar.bz2 instead of tar.gz now. + * debian/local/apparmor-profile: Explicitly deny cupsd to write /run/samba, + to avoid dmesg errors. (LP: #812035) + * debian/control: Slightly relax ghostscript dependency to also match + current Debian version. + * debian/control: Add missing ghostscript build dependency. + + -- Martin Pitt Thu, 04 Aug 2011 09:35:35 +0200 + +cups (1.4.7-1ubuntu5) oneiric; urgency=low + + * debian/control: Added Replaces/Breaks on older Ghostscript versions + (ghostscript-cups binary package) for smooth updating (LP: #815206). + + -- Till Kamppeter Mon, 25 Jul 2011 09:13:11 +0200 + +cups (1.4.7-1ubuntu4) oneiric; urgency=low + + Reupload Debian packaging trunk for the FTBFS fix (missing ghostscript build + dep). + + [ Till Kamppeter ] + * debian/filters/pstopdf: Added "-dNOINTERPOLATE" to the Ghostscript command + line, this makes Ghostscript vastly faster. + * debian/patches/use-ps2write-ghostscript-device-for-pdftops-filter.patch: + Regenerated the patch, as we actually use it now. The "ps2write" output + device produces finally DSC-conforming PostScript and so we can use + Ghostscript for the pdftops filter. Made the patch also adding the + "-dNOINTERPOLATE" to the Ghostscript command line. + * debian/patches/series: Reactivated + use-ps2write-ghostscript-device-for-pdftops-filter.patch and promoted it + to the patches which should be submitted upstream. + * debian/rules: Build CUPS with a Ghostscript-based pdftops filter. + * debian/rules: Do not rename the pdftoraster filter of the PDF filter + add-on any more as Ghostscript has the unified gstoraster filter now. + Change the cost factor to make Ghostscript's filter being preferred. + * debian/control: Let the "cups" package require at least version 9.02 + of Ghostscript, as this version does not ship a filter named pdftoraster + any more. + + [ Jamie Strandboge ] + * debian/local/apparmor-profile: we need to allow both /var/run and /run + for upgrades (LP: #810687) + + [ Martin Pitt ] + * debian/local/apparmor-profile: Explicitly deny cupsd to write /run/samba, + to avoid dmesg errors. (LP: #812035) + * debian/control: Slightly relax ghostscript dependency to also match + current Debian version. + * debian/control: Add missing ghostscript build dependency. + + -- Martin Pitt Fri, 22 Jul 2011 08:04:49 +0200 + +cups (1.4.7-1) unstable; urgency=low + + * New upstream version. + + [ Till Kamppeter ] + * debian/patches/ubuntu-upstart.dpatch: Updated the patch to add support + to the new device enumeration functionality of udev-configure-printer. + This way we do not need to retrigger the printers. Retriggering is only + needed if udev rules change. A fallback to the old behavior is provided + so that this CUPS package continues to work with older versions of + udev-configure-printer. + + [ Martin Pitt ] + * Update patches for new upstream release. + * Drop fix-broken-ipv6-uris.patch, applied upstream. + * debian/local/apparmor-profile: /var/run → /run transition. (LP: #810270) + * Drop debian/patches/ubuntu-upstart.dpatch and move the upstart script to + debian/local/cups.upstart. In debian/rules, copy it to debian/, and remove + that again during clean. This is a slightly easier workaround for a + nonexisting "dh_installinit --sysvinit-only" option than the previous + creation of the upstart file with an ubuntu specific dpatch. + * debian/patches/, debian/rules, debian/control, debian/source/format: Move + to source format "3.0 (quilt)" and convert our dpatches to quilt patches. + Drop dpatch build dependency. + * Move Ubuntu specific patches to debian/patches/ubuntu. In debian/rules, + apply them when building on Ubuntu. Add "patch" build dependency. + + -- Martin Pitt Thu, 14 Jul 2011 15:02:36 +0200 + +cups (1.4.6-11) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/cups-avahi.dpatch: Updated Avahi patch to fix places in + the CUPS source code where libdns_sd is supported but not Avahi. + especially accept being called with a hostname with ".local" domain + so that AirPrint works without "ServerAlias *" in cupsd.conf (LP: #801306). + + [ Steve Langasek ] + * Build for multiarch. (Closes: #631425) + + -- Martin Pitt Tue, 28 Jun 2011 18:03:26 +0100 + +cups (1.4.6-10) unstable; urgency=low + + * debian/patches/cups-avahi.dpatch: Updated Avahi patch so that it + generates the DNS-SD service names also correctly if there is a very + long server name. Before it could crash if the server name was longer than + AVAHI_LABEL_MAX - 4 (60) characters (LP: #793265). + + -- Till Kamppeter Thu, 16 Jun 2011 19:09:11 +0200 + +cups (1.4.6-9) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-accept-old-usblp-uris.dpatch: Fixed bugs in + the patch which got introduced by the upstream clean-up and by the fix + of a potential segfault. + * debian/patches/usb-backend-accept-old-usblp-uris.dpatch: + Patch got accepted upstream, replaced it by the version from + the upstream trunk (1.5.x). + + [ Martin Pitt ] + * debian/cups.postinst: Quiesce errors from rmmod. (Closes: #630109) + + -- Martin Pitt Wed, 15 Jun 2011 06:39:52 +0200 + +cups (1.4.6-8) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-accept-old-usblp-uris.dpatch: Let the + libusb-based "usb" backend accept also the old device URIs from the + usblp-kernel-module-based "usb" backend, so that printing stays working + for users who update from an old CUPS package with the usblp-based backend + without needing to migrate the URIs. Warnings in error_log tell about + the use of old URIs and the advantages of updating them. + * debian/patches/cups-deviced-allow-device-ids-with-newline.dpatch: Fixed + segfault happening sometimes when a device with a newline in its device + ID is found. + + [ Martin Pitt ] + * Drop usb-backend-both-usblp-and-libusb.dpatch. It's causing crashes, and + upstream does not want it either. Instead, add a blacklist file + debian/local/blacklist-cups-usblp.patch and install it into + /etc/modprobe.d/; that way, we don't require kernels to disable usblp, and + allow other spoolers than cups to work. + * debian/cups.postinst: rmmod usblp on upgrades from earlier versions or + fresh installs, to make above change effective without reboots as well. + + -- Martin Pitt Fri, 10 Jun 2011 11:35:33 +0200 + +cups (1.4.6-7) unstable; urgency=low + + * debian/patches/cups-avahi.dpatch: Updated Avahi patch so that it does + not generate too long service names which Avahi does not accept. Printers + did not get advertized via DNS-SD then. (LP: #793265). + * debian/patches/cups-avahi.dpatch: Updated Avahi patch to add the text + field entry "URF=none" and the service subtype "_universal" so that + mDNS/Bonjour-advertized printers are recognized by AirPrint clients + (iPhone/iPad with iOS 4.2 or newer). (LP: #711779). + * debian/patches/cups-avahi.dpatch: In contrary to the libdns_sd API the + Avahi API requires port numbers in host order and not in network order. + This made the Avahi-based DNS-SD broadcasting of CUPS advertizing wronmg + port numbers. Updated the Avahi patch to fix it. Thanks to Tim Waugh + from Red Hat on confirming this (LP: #792309). + * debian/local/filters/pdf-filters/pdftopdf/P2PResources.cxx: Fixed + memory leak in pdftopdf filter which made the filter taking up several + gigabytes when processing certain PDF files. Thanks to upstream + author Koji Otani for the quick fix (LP: #790378). + * debian/local/pstopdf.convs, debian/local/pstopdf.types: Do not apply + the PDF printing workflow to PostScript input coming from the Adobe + Reader. If this PostScript comes from an encrypted (DRM) PDF, it cannot + be converted to PDF again by Ghostscript (LP: #782309). + + -- Till Kamppeter Tue, 07 Jun 2011 07:04:11 +0200 + +cups (1.4.6-6) unstable; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf: Let pstopdf determine the page size via + the "PageSize" or "PageRegion" setting in the 5th command line + argument and not via "media". The "media" setting is usually + inserted by CUPS and uses a PWG name of the paper size and not the + name used in the PPD file. This makes Ghostscript being called + without paper size setting and so a PDF file in the default paper + size (A4/Letter) is passed on, breaking any printout from applications + which send jobs in PostScript and which have a non-default paper + size (LP: #787635). + + [ Martin Pitt ] + * Revert calling "convert" on the banner PNGs (r961); the file is already + correct in the source. The format conversion happens in Ubuntu's + pkgbinarymangler, so it does not affect Debian builds at all and also this + cannot be circumvented that way. Instead, blacklist this package from + pkgstripfiles. (LP: #710881) + * Bump Standards-Version to 3.9.2 (no changes necessary). + + -- Martin Pitt Wed, 25 May 2011 07:03:55 +0200 + +cups (1.4.6-5) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/cups-avahi.dpatch: Updated the patch to add Avahi support + to the newest state of the art from + http://twaugh.fedorapeople.org/cups-avahi/ (upstream of the patch), + in the hope to fix CUPS crashers like LP #759031, #754567, #711875, + #751770. + + [ Martin Pitt ] + * debian/local/apparmor-profile: Add cap_dac_read_search for cups-pdf. This + circumvents the sandboxing even more, but with cups-pdf's architecture + there is no way around it. (LP: #295536) + + -- Martin Pitt Mon, 18 Apr 2011 19:22:20 +0200 + +cups (1.4.6-4) unstable; urgency=low + + * debian/patches/fix-broken-ipv6-uris.dpatch: When accessing the web + interface via http: (unencrypted) and one does an adminstrative task + which requires encryption, on upgrading to https: (encrypted) mode + IPv6 IP addresses without "[...]" get inserted into the URL and the + browser cannot parse the URL correctly. Fixed with a patch from upstream + (LP: #744674). + * debian/rules: Convert cups.png (CUPS logo for test page) to RGBA, as the + original 8-bit-per-pixel color map format leads to a crash in libpng. This + prevents the CUPS test page and the banner pages from printing + (LP: #710881). + * debian/control: Add ImageMagick to the build dependencies, as it is + needed for the CUPS logo image conversion. + + -- Till Kamppeter Fri, 01 Apr 2011 11:06:02 +0200 + +cups (1.4.6-3) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/pdftoraster.cxx: Latest bug fixes + from upstream: + o Respect the "*RequiresPageRegion" attribute of the PPD files in the + same way as pstops does (LP: #405116). + o Change default rendering intent to PERCEPTUAL. + o Use external ICC color profile also with CMYK color space. + * debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Latest bug fixes + from upstream: + o Support ipp-attribute-fidelity option and MirrorPrint choice. This is + needed that appropriate options in printing dialogs and printer setup + tools are respected. + + [ Martin Pitt ] + * debian/control: Downgrade smbclient to Recommends. (Closes: #618545) + + -- Martin Pitt Thu, 17 Mar 2011 10:49:04 +0100 + +cups (1.4.6-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/printer.schema: Added missing "printerType" attribute. Thanks to + Mario Fetka for the hint (LP: #724980). + + [ Martin Pitt ] + * ubuntu-upstart.dpatch: Fix start failure if apparmor-profile-load doesn't + exist. Thanks Zach! (LP: #728592) + + [ Martin-Éric Racine ] + * Added Recommends:smbclient to cups-client (Closes: #616015). + + -- Martin Pitt Tue, 15 Mar 2011 15:11:19 +0100 + +cups (1.4.6-1) unstable; urgency=low + + * New upstream release. + + [ Martin Pitt ] + * ppdc-dynamic-linking.dpatch: Update to new upstream version. + * debian/control: Bump smbclient from Suggests to Recommends. + (Closes: #595771) + + [ Martin-Éric Racine ] + * Updated my contact info in debian/control. + + -- Martin Pitt Sat, 19 Feb 2011 22:41:08 +0100 + +cups (1.4.5-3) unstable; urgency=low + + [ Till Kamppeter ] + * debian/rules: Do not remove the /usr/share/cups/model/ directory, some + manufacturer-supplied printer drivers (like from Brother) still use it. + * debian/rules: Remove a cost factor change for pstops. It is not used any + more and overridden by + pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.dpatch + * debian/local/filters/pdf-filters/filter/pdftoraster.cxx, + debian/local/filters/pdf-filters/conf/pdftoraster.convs, + debian/local/filters/pdf-filters/README, + debian/local/filters/pdf-filters/addtocups + debian/local/filters/pdf-filters/conf/HP-PhotoSmart_Pro_B8300-hpijs-pdftoijs.ppd, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4, + debian/local/filters/pdf-filters/removefromcups: Upstream changes of + the PDF filter add-on package: + o Added the Poppler-based pdftoraster filter. This filter is much faster + than the Ghostscript-based filter (LP: #668800). + o Cleaned up the sample PPD file for pdftoijs (does not go into the + Debian/Ubuntu package of CUPS). + * debian/rules: Rename the newly added Poppler-based pdftoraster filter + to pdftoraster-poppler to not conflict with Ghostscript's pdftoraster + and lower its cost factor so that it is prioritized against Ghostscript's + filter. + * debian/patches/cups-avahi.dpatch: Updated to fix assertion failure + (LP: #707592, Red Hat bug #672143). + + [ Martin Pitt ] + * debian/patches/ubuntu-upstart.dpatch: Don't ignore failures from + apparmor-profile-load. + + -- Martin Pitt Tue, 08 Feb 2011 10:46:25 +0100 + +cups (1.4.5-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/cups-avahi.dpatch: Added patch from Tim Waugh from Red Hat + to implement full Avahi support, not only for printer discovery by the + "dnssd" backend but also for print queue broadcasting and browsing by the + scheduler (CUPS daemon). Fixes LP: #465916. + * debian/patches/dnssd-avahi.dpatch: Removed, is part of new + cups-avahi.dpatch. + * debian/patches/quiesce-bonjour-warning.dpatch: Removed, not needed any + more with the new cups-avahi.dpatch. + * debian/rules: Added "--with-local_protocols='CUPS dnssd' + --with-remote_protocols='CUPS dnssd'" to the command line of "./configure". + This adds support for DNS-SD-based browsing and broadcasting by default. + * debian/patches/configure-default-browse-protocols.dpatch: Fixed handling + of "--with-local_protocols=..." and "--with-remote_protocols=..." on the + command line of "./configure". Now (quoted) values with spaces, like + "CUPS dnssd" are treated correctly. + * debian/patches/usb-backend-no-segfault-on-bad-device-id.dpatch: Assure + that the device ID string read from a USB device can never be a mess: Try + other byte order for device ID string length also if length is too small, + empty the read device ID string if there is an IOCTL failure, reject ID + strings with unprintable characters, clean white space in the ID string, + and finally accept the empty ID string as an unknown device. This + overcomes the problem that USB-to-Parallel adapter cables do not + report back a usable ID string. With these changes it is at least possible + to use one adapter cable per computer if the cables do not report unique + serial numbers via libusb and any number of adapter cables if they do + report serial numbers via libusb. Real USB printers can always be used, + also if there are other printers connected with an adapter cable + (LP: #468701, LP: #564917). + + [ Martin Pitt ] + * debian/local/apparmor-profile: Explicitly deny access to ttyUSB* to + silence noise. This is presumably an extra control channel for some USB + printers, but cupsd can't use it anyway. (LP: #692892) + * ubuntu-upstart.dpatch: Drop reloading of Samba. It didn't work in some + cases, and is better fixed in samba's upstart script (start cups in its + pre-start). + * debian/rules: Set LC_MESSAGES=C to avoid breaking the test suite in + non-English locales. This is a temporary fix until it is resolved upstream + (see http://www.cups.org/str.php?L3765). + + [ Kees Cook ] + * ubuntu-upstart.dpatch: Use AppArmor profile loading helper. (LP: #690040) + + -- Martin Pitt Tue, 04 Jan 2011 11:02:32 +0100 + +cups (1.4.5-1) unstable; urgency=low + + [ Martin Pitt ] + * New upstream bug fix/security release. The security issue + (CVE-2010-2941) was already fixed by a backported patch in the previous + upload. + * Drop CVE-2010-2941.dpatch, upstream now. + * Drop manual-section-for-drv.dpatch, obsolete with new upstream version. + * dnssd-avahi.dpatch: Unfuzz for new upstream version. + * debian/control: Drop xpdf-* CJK suggests, they got removed from squeeze. + (Closes: #603467) + * debian/control: Clean up obsolete suggests. + * Update Catalan debconf translations, thanks Jordi Mallach! + (Closes: #601138) + * debian/cups-ppdc.install: Drop drv manpage, doesn't exist any more. + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PForm.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PForm.h, + debian/local/filters/pdf-filters/pdftopdf/Makefile, + debian/local/filters/pdf-filters/pdftopdf/P2PMatrix.h, + debian/local/filters/pdf-filters/pdftopdf/P2PPage.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PPage.h, + debian/local/filters/pdf-filters/pdftopdf/P2PResources.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PResources.h: Make + pdftopdf working with PDF files which use "Form" without "Resource" + dictionary. Thanks to Koji Otani for this patch and to Nicola + Ruggero for reporting the problem and sending sample files. + + -- Martin Pitt Mon, 06 Dec 2010 19:40:56 +0100 + +cups (1.4.4-7) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/parseargs.c, + debian/local/filters/pdf-filters/pdftopdf/parseargs.cxx, + debian/local/filters/pdf-filters/pdftopdf/parseargs.h, + debian/local/filters/pdf-filters/pdftopdf/Makefile: Made pdftopdf + building with Poppler 0.15.x. Thanks to Koji Otani for this patch. + * debian/control: Added dependency on "cups-ppdc" package to the "cups" + package, so that the PPDs of the drivers which come with CUPS get built + (LP: #485383). + + [ Martin Pitt ] + * ubuntu-upstart.dpatch: Wait until daemon is ready, to avoid race + conditions with init scripts which expect cups tools to work right after + restarting it. (LP: #647369) + * ubuntu-upstart.dpatch: If D-BUS is not available, start on runlevels 2 to + 5, so that this also works in server environments. (LP: #650893) + * debian/local/apparmor-profile: Allow access to /usr/local/lib/cups/**. + (LP: #160092) + * debian/local/apparmor-profile: Allow reading /usr/local/**, in case + third-party printer drivers need auxiliary files. + * debian/local/apparmor-profile: Allow reading /var/run/**. (LP: #659961) + * ubuntu-upstart.dpatch: Time out after 5 seconds when the local socket + doesn't get created. Apparently a lot of users disable it in cupsd.conf. + (LP: #672438) + * debian/local/filters/pdf-filters/addtocups: Link pdftoijs with $(CXX), + since it's a C++ program. Fixes FTBFS with gcc 4.5. + * debian/local/filters/pdf-filters/pdftopdf/Makefile: Explicitly pdftopdf + with -lz. gcc 4.5 does not automatically link to transitive library + dependencies any more. + * drop_unnecessary_dependencies.dpatch: Drop hunk for reduced krb5/gssapi + linkage. With gcc 4.5, we now need -lkrb5. + + [ Marc Deslauriers ] + * Add CVE-2010-2941.dpatch: Fix denial of service and possible code execution + via invalid free. Skip over and reserve unused tags in cups/ipp.{c,h}. + [CVE-2010-2941] (Closes: #603344) + + -- Martin Pitt Fri, 12 Nov 2010 11:07:33 +0100 + +cups (1.4.4-6) unstable; urgency=low + + * debian/cups.preinst: Go back to using lsb-release, since dpkg-vendor is + not installed by default (it's in dpkg-dev). Bump the version guard to + this version, to reattempt the migration. (LP: #645328) + + -- Martin Pitt Thu, 23 Sep 2010 08:47:11 +0200 + +cups (1.4.4-5) unstable; urgency=low + + [ Martin Pitt ] + * ubuntu-upstart.dpatch: Drop the dependency "on starting smbd", it causes + samba to hang on package upgrades or manual restarts. There doesn't seem + to be a good way to express this dependency right now. (LP: #639768) + Instead, send a SIGHUP to smbd if it is running, which causes it to reload + printers. + + [ Till Kamppeter ] + * pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.dpatch: + Let CUPS use the former PostScript-based filter chain only if the input + file is PostScript and the printer is a PostScript printer with + manufacturer-supplied PPD file. This avoids ugly PS->PDF->PS conversions + which are bad for the performance and sometimes cause issues + (Closes: #593338, requested by Ricoh). + + -- Martin Pitt Thu, 16 Sep 2010 18:57:06 +0200 + +cups (1.4.4-4) unstable; urgency=low + + [ Till Kamppeter ] + * default-ripcache-size-auto.dpatch: Replaced patch for letting CUPS default + RIP_MAX_CACHE to 1/4 of the system's RAM by a patch defaulting + RIP_MAX_CACHE to "auto". See LP: #628030. + * debian/patches/cups-snmp-oids-device-id-hp-ricoh.dpatch: Let the "snmp" + backend also use the manufacturer-specific MIBs of HP and Ricoh to + obtain the device IDs of network-connected printers. This way we get more + reliable information about make and model and in addition the supported + page description languages, which allow to identify whether an optional + PostScript add-on is installed or for an unsupported printer which + generic PPD is the best choice (requested by Ricoh, thanks to Tim Waugh + from Red Hat to create the patch). + + [ Martin Pitt ] + * debian/control: Drop perl-modules dependency. The only script that uses + perl is oopstops, which uses IO::Handle, and this is in perl-base. + * debian/control, debian/rules, ubuntu-*.dpatch: Replace lsb_release call + with dpkg-vendor, and drop lsb-release build dependency. + * Upstartify for Ubuntu: + - Add ubuntu-upstart.dpatch: Add debian/cups.upstart script, which now + causes Samba to wait for cups to start. Don't have it in debian/ by + default, since dh_installinit unconditionally prefers it over .init. + - debian/rules: Call dh_installinit with --upstart-only when building on + Ubuntu. + - debian/cups.preinst: Remove old init script on upgrades when running on + Ubuntu. + * debian/cups.preinst: Remove some obsolete transitional code. + * debian/cups.init.d, debian/cups.postinst: Move custom PPD directory setup + from init script into postinst. No need to do that on every boot. + + -- Martin Pitt Tue, 14 Sep 2010 18:49:39 +0200 + +cups (1.4.4-3) unstable; urgency=low + + [ Jamie Strandboge ] + * debian/cups.post{inst,rm}: update for local include file + * debian/local/apparmor-profile: add local include file + + [ Martin Pitt ] + * debian/rules: Stop building with --enable-threads, since currenu GnuTLS + does not work with threads. This brings back the lost SSL/TLS support. + (Closes: #588234, #591509) + * debian/libcups2.symbols: Readd _http{Read,Write}GNUTLS@Base symbols to + ensure that autogenerated shlibs dependencies for libcups get tight + enough. + * manpage-translations.dpatch: Update German manpage translations, thanks + Helge Kreutzmann! (Closes: #588028) + * debian/rules: Set DPKG_GENSYMBOLS_CHECK_LEVEL to 4 to point out outdated + .symbols files more strongly. + * debian/libcups2.symbols, debian/libcupsimage2.symbols: Subsume private + optional symbols into regexps. + + -- Martin Pitt Wed, 11 Aug 2010 19:03:01 +0200 + +cups (1.4.4-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/fontembed/bitset.h, + debian/local/filters/pdf-filters/filter/fontembed/sfnt.c, + debian/local/filters/pdf-filters/filter/texttopdf.c: Fixed bug with + subsetting certain composite chars (LP: #605479). + * debian/local/acroread.conf, debian/local/pdftops.conf, debian/cups.install: + Removed /etc/cups/acroread.conf and /etc/cups/pdftops.conf. These two files + were used by the alternative pdftops filter from Helge Blischke. As we + switched back to the original pdftops filter these files are not needed any + more (LP: #605564). + * debian/local/filters/cpdftocps: The PostScript level from the PPD file + was not used, but always the default value "2" instead. This made Xerox + color laser printers crash on some files. Thanks to Roel van Os for the + patch (LP: #600972). + + [ Martin Pitt ] + * debian/control: Reintroduce the libcupsys2{-dev} Provides:, since some + third-party printer drivers still depend on them. (LP: #433311) + * debian/control: Have libcups2 break older cups versions. (Closes: #588643) + + -- Martin Pitt Sat, 24 Jul 2010 19:38:50 +0200 + +cups (1.4.4-1) unstable; urgency=medium + + [ Till Kamppeter ] + * debian/cups.init.d: When loading kernel modules for the parallel port + load also the "parport_pc" module (LP: #369850). + * debian/filters/pstopdf: Fixed the problem of the UseCIEColor warning of + Ghostscript correctly. The file format converter should not do any kind + of color correction but simply pass the colors through (LP: #578181). + * debian/patches/cups-deviced-allow-device-ids-with-newline.dpatch: Some + printers have broken device IDs with newline characters inside. These + break the cups-deviced printer discovery mechanism and so the printers + get ignored. This patch allows newline characters in device IDs + (LP: #468701). + + [ Martin Pitt ] + * New upstream bug fix/security release. Therefore "medium" urgency. + - CUPS could overwrite files as root in directories owned or writable by + non-root users. [STR #3510, CVE-2010-2431] + - The web interface now includes additional CSRF protection. + [STR #3498, CVE-2010-0540] + - The texttops filter did not check the results of allocations. + [STR #3516, CVE-2010-0542] + - The web admin interface could disclose the contents of memory. + [STR #3577, CVE-2010-1748] + * Drop select_use_after_free.dpatch: Applied upstream. + * do-not-broadcast-with-hostnames.dpatch: Update to apply to new version. + * debian/libcups2.symbols, debian/libcupscgi1.symbols: Update for new + version. + * Add support-gzipped-charmaps.dpatch: Support gzipped charset → UTF8 maps; + they compress very well and take a lot of space. + * debian/rules: Compress /usr/share/cups/charmaps/*.txt in cups-common. + * debian/local/filters/pdf-filters/*: Reenable call of setErrorFunction() on + armel, now that poppler on arm has been fixed (see #575262) + * debian/cups.postinst: Drop some obsolete transition code. + * debian/cups.postinst: Some versions of cups-pdf (and perhaps other + packages) changed the permissions of /usr/lib/cups/backend. Fix that + during upgrade. (Closes: #582942) + * debian/control: Drop all the transitional cupsys* packages and the + remaining provides/conflicts/replaces on them. All packages in sid are now + transitioned to the new package names, and Lenny already had them. + + -- Martin Pitt Tue, 29 Jun 2010 19:03:39 +0200 + +cups (1.4.3-1) unstable; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf: Use "-dUseCIEColor" for the Ghostscript call in the + pstopdf filter, to eliminate the warning "Set UseCIEColor for + UseDeviceIndependentColor to work properly.". + + [ Martin Pitt ] + * New upstream bug fix release. See http://www.cups.org/articles.php?L594 + for details. + * Drop CVE-2010-0393.dpatch, upstream now. + * Update usb-backend-both-usblp-and-libusb.dpatch for new version. + * select_use_after_free.dpatch: Add additional fix by Tim Waugh and Vincent + Danen for CVE-2010-0302, and update tag header. (Closes: #572940) + + -- Martin Pitt Fri, 09 Apr 2010 16:19:16 +0200 + +cups (1.4.2-10) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PDoc.cxx: Output of the + pdftopdf filter was not completely complying with the Adobe specs for PDF. + Thanks to Duncan Lock for finding and reporting the bug and Johann Felix + Soden for creating the patch to fix it (LP: #544636). + + [ Martin Pitt ] + * Add no-conffile-timestamp.dpatch: Disable time stamps in conffiles, to + avoid ever-changing files in /etc. Thanks Joey Hess! + (Rejected upstream, STR#3067; Closes: #549673) + * CVE-2010-0393.dpatch: Replace with patch from upstream, and tag + header. (Closes: #572940) + * debian/local/filters/pdf-filters/*: Disable call of setErrorFunction() on + armel for now, since armel's libpoppler is broken. This works around + #575262, so that cups can finally go into testing again (which is more + than overdue). + + -- Martin Pitt Wed, 24 Mar 2010 16:50:56 +0100 + +cups (1.4.2-9.1) unstable; urgency=high + + * Non-maintainer upload by the Security Team. + * Fix loading of localized message string from arbitrary files + through exporting the LOCALEDIR environment variable when lppasswd + has a setuid bit set (CVE-2010-0393). + + -- Nico Golde Wed, 03 Mar 2010 21:28:13 +0100 + +cups (1.4.2-9) unstable; urgency=low + + * debian/control: Build depend on virtual libjpeg-dev package only. + (Closes: #570381) + * debian/cups.init.d: Fix syntax error which caused coldplug_usb_printers() + to needlessly run udev-configure-printer for all USB devices. + * Bump Standards-Version to 3.8.4 (no changes necesssary). + * debian/libcupscgi1.symbols: Add new symbol from 1.4.2. + * debian/cups.init.d: Add missing $remote_fs dependency. + + -- Martin Pitt Thu, 18 Feb 2010 15:16:26 +0100 + +cups (1.4.2-8) unstable; urgency=low + + [ Till Kamppeter ] + * dynamic-default-ripcache-size.dpatch: Fixed the copy of thr new function + cupsdDefaultRIPCacheSize() which goes into the cupsfilter utility. It did + not return its result and made cupsfilter segfaulting independent of the + input (LP: #442283). + + [ Martin Pitt ] + * debian/control: Update libjpeg62-dev build/binary dependency to + libjpeg8-dev | libjpeg-dev. (Closes: #569230) + * Acknowledge Bdale Garbee's NMU to work around bad pdftotext behaviour due + to a bug in ttf-freefont. This has been worked around in texttopdf itself + in the previous upload (see LP #447961). (Closes: #519643) + + -- Till Kamppeter Thu, 11 Feb 2010 14:26:33 +0100 + +cups (1.4.2-7) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/texttopdf.c: Workaround for + bug in ttf-freefont which messed up the output of the texttopdf filter. + Thanks to Hin-Tak Leung and Steve White to find this solution (LP: #447961). + * debian/local/filters/pdf-filters/pdftopdf/P2PDoc.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PGfx.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PGfx.h, + debian/local/filters/pdf-filters/pdftopdf/P2PObject.h, + debian/local/filters/pdf-filters/pdftopdf/P2POutput.cxx: Upstream + fix from Koji Otani for the following: (1) Fixed some memory leak; + (2) pdftopdf now delays fetching a referenced object until when it is + written to the output. This fixes memory hogging with N-up output + (N pages per sheet). The fix is mainly done by (2). This fixes + LP: #508731. + + [ Martin Pitt ] + * manpage-translations.dpatch: Update to German manpage translations, thanks + Helge Kreutzmann! (Closes: #502908) + * debian/cups.postinst: Do not symlink snakeoil SSL certificate if + server.{crt,key} already exist as broken symlinks. Thanks Andreas + Büsching! (Closes: #554579) + + -- Martin Pitt Wed, 27 Jan 2010 09:19:32 +0100 + +cups (1.4.2-6) unstable; urgency=medium + + [ Till Kamppeter ] + * Urgency medium, this only fixes a highly visible crash. + * debian/local/filters/pdf-filters/pdftopdf/P2PGfx.cxx: Fixed segfault of + the pdftopdf filter when the input PDF file has ICC-profile-based color + space inline images. Thanks to Koji Otani for the fix. Fixes: + LP: #407344, LP: #466119, LP: #467919, LP: #475330, LP: #488752. + + [ Martin Pitt ] + * debian/rules: Have a failed test suite fail the build on Ubuntu again, + buildds were fixed. (LP: #447919) + + -- Martin Pitt Mon, 21 Dec 2009 10:19:44 +0100 + +cups (1.4.2-5) unstable; urgency=low + + * debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4, + debian/local/filters/pdf-filters/pdftoopvp/Makefile, + debian/local/filters/pdf-filters/pdftoopvp/OPVPOutputDev.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PGfx.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PPattern.cxx: Synced + the PDF CUPS filters with upstream. This introduces a change by Koji Otani + to also support Poppler 0.12.2 and newer with a change in its API/ABI. + This version compiles with both the new and the old Poppler, but it + runs only with the Poppler with which it got compiled. This allows to + build this package with both Ubuntu which ships the unchanged upstream + version of Poppler 0.12.2 and Debian where the ABI changes got reverted + by a Debian-only patch. + + -- Till Kamppeter Wed, 09 Dec 2009 15:04:39 +0100 + +cups (1.4.2-4) unstable; urgency=high + + * High urgency, since this fixes a security issue and should not block the + already messy poppler transition any further. + * pdftopdf, pdftoopvp: Revert patch to build against new upstream 0.12.2 + poppler ABI, since it was reverted in poppler's -2 package. Tighten build + dependency and conflict to any libpoppler5 < 0.12.2-2 now. + (Closes: #558906, #559038, #559094) + * Add select_use_after_free.dpatch: Fix use-after-free segfault, causing a + remote DoS. (STR #3200, CVE-2009-3553, Closes: #557740) + + -- Martin Pitt Wed, 02 Dec 2009 09:39:28 +0100 + +cups (1.4.2-3) unstable; urgency=low + + * pdftopdf, pdftoopvp: Patch to build with poppler 0.12.2, which broke ABI + without bumping SONAME or even just shlibs :-(. Thanks to Jonathan Guthrie + for the patch! (Closes: #558755) + + -- Martin Pitt Mon, 30 Nov 2009 22:58:04 +0100 + +cups (1.4.2-2) unstable; urgency=low + + * debian/control, debian/rules: Drop dpkg-substvars hack for poppler-utils + dependency, since 0.12 is in Debian now. Bump poppler-utils dependency. + * debian/rules: Don't fail the build on test suite failure on Ubuntu, since + its buildds currently can't resolve their own hostname. (See LP#447919) + * poppler is now built on all architectures, so cups will build on amd64, + too. (Closes: #556359) + + -- Martin Pitt Tue, 17 Nov 2009 07:13:55 -0600 + +cups (1.4.2-1) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/log-debug-history-nearly-unlimited.dpatch: Made automatic + debug logging of failed jobs (without need of "LogLevel debug") practically + unlimited by raising the default limit from 200 to 99999 lines. + * debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: pdftopdf did + note collate for printers when they have "Collate" and + "cupsManualCopies:True" in the PPD. Thanks to Koji Otani from BBR Japan + for the fix. + * debian/local/filters/cpdftocps: Fixed turning off duplex via command line + (http://bugs.linux-foundation.org/show_bug.cgi?id=397). + * debian/patches/usb-backend-both-usblp-and-libusb.dpatch: Fixed a bug + of modifying the URI of the current print queue when comparing it with + discovered URIs. Made the USB backend also compatible with URIS generated + by old versions of CUPS, without serial number or with "serial=?" + (LP: #450513). + * debian/cups.init.d: Make cold-plugging of USB printers also correctly + work if the usblp kernel module is loaded. + + [ Martin Pitt ] + * New upstream security/bug fix release: + - The CUPS web interface was vulnerable to several XSS and HTTP + header/body attacks via attribute injection (STR #3367, STR #3401, + CVE-2009-2820; Closes: #555666) + * Drop maintain-default-option-settings.dpatch, applied upstream. + * Update patches to new upstream version. + * debian/control: Drop trademark stuff from package descriptions. No other + package does that, and it's uninteresting here. The current ones with + "easysw" were out of date, too. (Closes: #552781) + * Now that poppler 0.12 is in Debian, drop + disable-pdftoopvp-with-old-poppler.dpatch and bump libpoppler-dev build + dependency. + * poppler now ships fofi include files, which fixes the build. + (Closes: #552818, #552223); rebuilding against new poppler ABI fixes + uninstallability (Closes: #552456) + + -- Martin Pitt Thu, 12 Nov 2009 15:03:41 +0100 + +cups (1.4.1-5) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/do-not-broadcast-with-hostnames.dpatch: Do not use host + names for broadcasting print queues and managing print queues broadcasted + from other servers by default. Many networks do not have valid host names + for all machines (LP: #449586). + * debian/cups.postinst: Clear cache for upgrade to CUPS 1.4.x (LP: #420490). + * usb-backend-both-usblp-and-libusb.dpatch: Removed some lines which were + temporarily inserted for debugging. + + [ Martin Pitt ] + * usb-backend-both-usblp-and-libusb.dpatch: Add upstream link. + * Drop: disable-pie-mipsen.dpatch: Didn't help to fix the mipsen segfault. + * debian/cups.postinst: Simplify structure and avoid calling invoke-rc.d in + Till's change above. + * Add ppdc-dynamic-linking.dpatch: Dynamically link ppdc, to work around + segfault on mipsen. Thanks to Sune Vuorela! (Closes: #548246) + + [ Tormod Volden ] + * debian/cups.init.d: honour blacklist when loading ppdev and lp kernel + modules (LP: #424795) + + -- Martin Pitt Tue, 13 Oct 2009 09:57:11 +0200 + +cups (1.4.1-4) unstable; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-both-usblp-and-libusb.dpatch: Make the USB + backend supporting both printer access via libusb and via the usblp kernel + module. Make it also printing via libusb if the URI for the queue was + generated via usblp and vice versa. This should solve most USB printing + problems which occured on the transition to CUPS 1.4.x (LP: #420015, + LP: #436495; Closes: #546558, #545288, #545453). + + [ Martin Pitt ] + * debian/rules: Make the USB backend run as root again, udev rules do not + cover all printers. (LP: #420015) + * Drop debian/blacklist-cups.conf, and remove it on upgrade. With Till's fix + from above this is not necessary any more. + + -- Martin Pitt Wed, 30 Sep 2009 15:17:53 +0200 + +cups (1.4.1-3) unstable; urgency=low + + * Add disable-pie-mipsen.dpatch: Disable PIE on mipsen, its binutils + segfaults with it. (Closes: #548246) + + -- Martin Pitt Tue, 29 Sep 2009 09:22:12 +0200 + +cups (1.4.1-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/cpdftocps: Double-sided printing did not work on + PostScript printers when the "sides" command line option for "lp"/"lpr" + was used (LP: #411392). + * debian/patches/maintain-default-option-settings.dpatch: For options with + an underscore (or any other allowed non-alphanumeric character) in their + names the default settings were not conserved when the PPD got replaced + ("lpadmin -p ... -m ...", system-config-printer, automatic PPD update + for existing print queues). Fixes LP: #432902 and CUPS STR #3340. + + [ Martin Pitt ] + * debian/cups.init.d: Don't actually re-trigger udev events for printer + coldplugging, since according to Scott James Remnant this slows down boot + and kills kittens. Instead, just call it with --dry-run and manually call + udev-configure-printer. + * debian/cups.init.d: Only run udevadm if udev and the callout are actually + available. Drop udev dependency to a suggests. This unbreaks cups on + platforms which do not have udev, such as kfreebsd. (Closes: #546922) + * debian/cups.init.d: Drop "cupsctl RIPCache" setting. It changes our + conffile (causing dpkg prompts on upgrade), and overwrites the admin's + setting without warning. + * Add dynamic-default-ripcache-size.dpatch: Replace above functionality by + setting the internal default value of RIPCache to MemTotal/4, if not given + in the configuration file. + * debian/rules: Do not let the usb backend run as root in Ubuntu any more, + since that has a recent enough udev. Still keep it for Debian. + * debian/cups-ppdc.install: Update path for Martin-Éric's section change of + drv manpage. + + [ Martin-Éric Racine ] + * Add manual-section-for-drv.dpatch: Fix incorrect man section 7 -> 1 as + reported by Lintian. + + -- Martin Pitt Wed, 23 Sep 2009 23:58:15 +0200 + +cups (1.4.1-1) unstable; urgency=low + + [ Till Kamppeter ] + * debian/cups.postinst: Fixed "lpstat -r" check for the auto update of + PPDs of existing queues. "lpstat -r" exits always with status 0, we must + check the actual output. + * debian/cups.postinst: Updated PPD auto update, so that it works with the + new CUPS sample driver PPDs which are dynamically generated now. + + [ Martin Pitt ] + * New upstream bug fix release. + * Drop patches accepted upstream: + - ppdc-locale-formatting.dpatch + - usb-backend-infinite-loop-on-end-of-job.dpatch + - dns-sd-check-typo.dpatch + * debian/cups.preinst: Add cleanup of obsolete symlinks in /usr/share/ppd/. + Drop cleanup from debian/cups.prerm. (Closes: #545298) + * debian/control: Add udev dependency, since the init script calls udevadm. + (LP: #429880) + * debian/cups.postinst, debian/cups.init.d: Call client tools with + "-h /var/run/cups/cups.sock" instead of "-h localhost", just in case the + server isn't configured to listen on a TCP port. + * dnssd-avahi.dpatch: Update to latest Fedora version, which fixes the dnssd + backend so that it only reports devices once avahi resolution has + completed. This makes it report Device IDs. + + -- Martin Pitt Tue, 15 Sep 2009 11:30:07 +0200 + +cups (1.4.0-5) unstable; urgency=low + + * Drop shlibs files and add symbols files for all libraries, to avoid too + weak dependencies. (Closes: #545244) + * debian/control: Tighten dependencies between server, client, and -common + versions. + + -- Martin Pitt Sun, 06 Sep 2009 13:17:12 +0200 + +cups (1.4.0-4) unstable; urgency=low + + Upload 1.4 to unstable. + + [ Till Kamppeter ] + * debian/patches/usb-backend-infinite-loop-on-end-of-job.dpatch: Fixed the + patch so that the usb backend really terminates after a job (LP: #420797). + * debian/local/apparmor-profile: cupsd needs also to be allowed to read + the /dev/bus/usb/ directory, given with the "/" in the end. This should + finally fix LP: #420015. + + [ Martin Pitt ] + * debian/control: Drop the transitional cupsys packages. + * printer-filtering.dpatch: Fix sometimes overzealous filtering, thanks to + Stéphane Graber! + * debian/rules: Drop autoconf call on build again, we have a proper upstream + release. + * debian/cups.postinst, debian/cups.init.d: Call lpstat, lpadmin, and + cupsctl with "-h localhost" to avoid querying network printers set up in + /etc/cups/client.conf, and asking for passwords. Thanks to Martin-Éric + Racine for tracking this down and the solution! (Closes: #543468) + * debian/control: Bump Standards-Version to 3.8.3 (no changes). + * debian/cups.postinst: Use signal names instead of numbers for trap. + Quiesces a lintian bashism warning. + * Add debian/README.source. + * debian/local/filters/pdf-filters/filter/fontembed/Makefile: Build + libfontembed with -fPIC to also work on HPPA. (Closes: #543973) + * debian/local/filters/pdf-filters/pdftoopvp/Makefile: Don't install font + configuration file as executable. + * debian/cups.lintian-overrides: Update for currently installed backends. + * debian/control: Re-add transitional cupsys packages (except the + libraries), they are still needed for upgrades from Ubuntu 8.04. Add the + "You can safely remove after upgrade" note to their description. + + -- Martin Pitt Sat, 05 Sep 2009 15:31:07 +0200 + +cups (1.4.0-3) experimental; urgency=low + + [ Till Kamppeter ] + * debian/patches/usb-backend-infinite-loop-on-end-of-job.dpatch: Fixed + upstream bug of the new libusb-based CUPS "usb" backend falling into + an infinite loop after completing the job, blocking the next job + (LP: #420797). + + [ Martin Pitt ] + * debian/local/filters/pdf-filters/pdftopdf/P2PDoc.cxx: Update for poppler + 0.11.3 API, thanks to Koji Otani ! + * disable-pdftoopvp-with-old-poppler.dpatch: Revert above change when + building with poppler 0.10.x. + + -- Martin Pitt Tue, 01 Sep 2009 09:44:33 +0200 + +cups (1.4.0-2) experimental; urgency=low + + * Add debian/blacklist-cups.conf: Blacklist the usblp module, it's obsolete. + CUPS uses libusb directly now. (LP: #420015, part 1) + * debian/local/apparmor-profile: Allow cupsd to access /dev/bus/usb/. + (LP: #420015, part 2) + * debian/rules: Make the usb backend run as root, since /dev/bus/usb/* are + root:root, and cups does not use the usblp kernel module any more. + (LP: #420015, part 3) + * disable-pdftoopvp-with-old-poppler.dpatch: Update. + + -- Martin Pitt Mon, 31 Aug 2009 17:34:48 +0200 + +cups (1.4.0-1) experimental; urgency=low + + [ Martin Pitt ] + * Final 1.4.0 release. + * Add ppdc-locale-formatting.dpatch: Fix locale handling in ppdc to avoid + broken PPD files in non-English locales. (STR#3300) + + [ Till Kamppeter ] + * debian/control: Let the cups package only suggest cups-ppdc and not + recommend it, as cups-ppdc is only interesting for developers. + + -- Martin Pitt Sun, 30 Aug 2009 21:20:46 +0200 + +cups (1.4.0~svn8773-1) experimental; urgency=low + + * New upstream prerelease snapshot. + [ Changes listed explicitly here as they are not yet available on + www.cups.org ] + 1. accept and reject; the accept and reject commands have been + officially renamed to cupsaccept and cupsreject. The old names are + still supported via symlinks. + 2. cupsdisable and cupsenable; the cupsdisable command now supports a + --hold option to stop printing after the current job and the + cupsenable command now supports a --release option to release + pending jobs for printing. + 3. cupsfilter; the cupsfilter program now supports filtering of + already-queued print job files and can also run printer-specific + filters specified in the PPD file. + 4. cupstestdsc; the cupstestdsc utility has been improved to better + detect problems with PostScript print files. + 5. cupstestppd; the cupstestppd utility has been improved to test new + PPD keywords and better detect impossible constraints. + 6. lpadmin; the lpadmin command now supports options to hold and + release new jobs on a printer or all printers. + 7. lpoptions; the lpoptions command now describes custom options and + their parameters. + 8. lppasswd; the lppasswd program is no longer installed setuid by + default. + 9. lpstat; the lpstat command now supports a -H option to show the + current default server and no longer slows down when a printer is + specified. + 10. Look-n-feel; the web interface has been given a new look. + 11. PHP support; the "php-cgi" program is used, when available, to + process PHP pages in the CUPS web interface. + 12. Printer configuration; improvements have been made to the add and + modify printer pages. + 13. Printer options; the Set Default Options page now provides a + "query" button that queries the default and installed options from + the printer. + 14. Printer sharing; the "share printer" and "unshare printer" buttons + are now only shown when printer sharing is enabled in the + scheduler. + 15. Security; the web interface has been updated to support + authentication for printing of test pages and RSS subscription + operations. + 16. Server settings; the Administration page now provides access to + common "advanced" server settings. + 17. Bonjour (DNS-SD) printing support; a new mdns backend provides + Bonjour-based printer discovery and the ipp, lpd, and socket + backends now support Bonjour address resolution. + 18. Bonjour (DNS-SD) perforance tuning; the scheduler now only uses a + single file descriptor for printer sharing. It previously used one + per printer. + 19. Bonjour (DNS-SD) web interface registry; when remote access is + enabled, the scheduler can register the web interface for easier + access. + 20. LPD client support; the cups-lpd mini-daemon now provides the + document-name for print jobs and supports specification of a CUPS + server. + 21. PWG Port Monitor MIB; the snmp backend now supports the PWG Port + Monitor MIB to better choose the device URI to use. + 22. SNMP-based monitoring; the ipp, lpd, and socket backends now report + supply levels and printer status using SNMP queries. + 23. IPP/2.x support; CUPS now conforms to the draft IPP/2.0 and IPP/2.1 + specifications. + 24. CUPS-Add-Modify-Printer operation; the scheduler now supports + setting the printer-state-reasons attribute using this operation. + 25. CUPS-Get-Document operation; the scheduler now supports a "get + document" operation to download files from a print job. + 26. Device location; the scheduler and backend discovery interface now + support a device-location attribute. + 27. Hold-New-Jobs and Release-Held-New-Jobs operations; the scheduler + now supports the Hold-New-Jobs and Release-Held-New-Jobs + operations. + 28. Access control; the scheduler now supports multiple addresses in + Allow and Deny lines. It also now returns a HTTP 403 (forbidden) + status when a user authenticates successfully but is not allowed to + perform an operation. + 29. Access logging; the scheduler now supports an AccessLogLevel + directive to control what is logged in the access_log file. + 30. Configuration files; the default cupsd.conf file now provides an + "authenticated" policy for easy authenticated sharing of printers. + 31. Default LogLevel; the default LogLevel is now "warn" instead of + "info". + 32. Automatic debug logging; the scheduler now records up to the last N + (default 200) debug messages for failed print jobs. + 33. Default paper size; the scheduler now supports a DefaultPaperSize + directive to override the default paper size defined by the locale + or libpaper configuration. + 34. Encryption support; the scheduler now supports a SSLOptions + directive to optionally support Windows clients in "FIPS" mode. It + also now loads both the server and CA certificates (if present) + from the ServerCertificate file. + 35. Error logging; the scheduler now logs unsuccessful operations as + errors in the error_log file. + 36. Error policies; the scheduler now supports a retry-current-job + error policy that retries the current job immediately. + 37. Fatal error handling; the scheduler now supports a FatalErrors + directive to control which startup errors should be considered + fatal. + 38. Filter command-line; the scheduer now passes the + job-originating-host-name attribute as a CUPS option to filters and + backends. + 39. Filter environment; the scheduler now includes CUPS_JOBTYPE, + PRINTER_INFO, and PRINTER_LOCATION variables in the environment + passed to filters and backends. + 40. Job progress; the scheduler now supports a job-media-progress + attribute to track the printing progress of each page. + 41. MIME database; MIME types now support a priority attribute to + override the default (alphabetical) rules of precedence. + 42. Page logging; the scheduler now supports a PageLogFormat directive + to control the format of the page_log file. + 43. PAM support; the scheduler now sets more PAM attributes to better + support third-party authentication schemes. + 44. PDF job ticket support; the scheduler now supports cupsJobTicket + comments at the beginning of PDF print jobs. + 45. Performance tuning; the scheduler now coalesces configuration and + state file changes to reduce the amount of disk activity and caches + printer attributes to further reduce startup time. + 46. Printcap support; the scheduler no longer clears the printcap file + when shutting down, and can now create XML "plist" printcap files + as well. + 47. RSS subscriptions; the scheduler now starts the notifier for RSS + subscriptions after creation so the feed is available immediately. + 48. Sandbox support; the scheduler now runs child processes using + restrictive policies on Mac OS X for improved security and job + isolation. + 49. Test option; the scheduler now supports a test mode via the "-t" + option. + 50. Device discovery; the cups-deviced helper now runs backends in + parallel for faster discovery and streams the results of discovery + as the backends provide them. + 51. Driver development kit; the CUPS DDK is now a standard part of + CUPS. + 52. Driver information file support; the cups-driverd helper program + now directly supports PPD compiler driver information files. + 53. Dynamic PPD support; drivers can now set PPD keywords dynamically + using PPD: messages. + 54. Generic PostScript command filter; a new CUPS command file filter + for PostScript printers provides auto-configuration, self-test + page, and status and supply level reporting functions. + 55. New printer drivers; new generic PostScript and PCL drivers provide + improved support for laser printers, the CUPS DDK drivers offer + support for many HP DesignJet printers, and new label drivers offer + support for Seiko and Tharo label printers. + 56. PJL support; the cupsPJLDisplay PPD attribute controls the PJL + commands used to display the current user and job on the printer. + 57. PPD compiler improvements; the PPD compiler now supports Mac OS X + .strings files, OID query strings, conditional directives, long + file names, and a test mode. It also fixes many other bugs from the + CUPS DDK 1.2.3 release. + 58. USB printer support; the usb backend now uses libusb when available + to allow it to better work with third-party scanning and printing + solutions. + 59. Banner filter; the bundled banner ("job-sheets") pages are now + generated using a new banner filter provides easier customization + and better support for UTF-8 text. + 60. Image filters; the standard image filters now support image files + larger than 2GB. + 61. PDF filter; the pdftops filter has been replaced with a wrapper + program that runs the Xpdf, poppler, or Ghostscript PDF to + PostScript utilities. + 62. Backend API; a new cupsBackendReport function is provided to report + a device from a backend and handles any needed quoting of the + make-and-model, info, device-id, and location strings. + 63. Device discovery; the new cupsGetDevices function streams + discovered devices to an application-provided callback function. + 64. IPP API; the IPP read and write functions no longer use a large + stack-based buffer when reading and writing IPP attributes. + 65. PPD support; several new functions are provided: cupsGetPPD3, + cupsResolveConflicts, ppdInstallableConflict, ppdLocalizeAttr, + ppdLocalizeMarkerName and ppdPageSizeLimits. + 66. Side-Channel API; new cupsSideChannelSNMPGet and + cupsSideChannelSNMPWalk functions allow printer drivers to do SNMP + queries via the standard network backends. + 67. Streaming API; a new streaming request API provides asynchronous + job creation and request submission. + * debian/patches/freebsd.dpatch, + debian/patches/manpage-typos.dpatch, + debian/patches/search_mime_files_in_usr_share.dpatch, + debian/patches/cupsaccept.dpatch, + debian/patches/gnutls-pkgconfig.dpatch: Removed backport patches of upstream + features. + * debian/patches/testsuite-increase-wait-timeout.dpatch: Removed, fixed + upstream. + * debian/patches/removecvstag.dpatch, + debian/patches/pidfile.dpatch, + debian/patches/ppd-poll-with-client-conf.dpatch, + debian/patches/quiesce-bonjour-warning.dpatch, + debian/patches/rootbackends-worldreadable.dpatch, + debian/patches/drop_unnecessary_dependencies.dpatch, + debian/patches/reactivate_recommended_driver.dpatch, + debian/patches/default_log_settings.dpatch, + debian/patches/confdirperms.dpatch, + debian/patches/printer-filtering.dpatch, + debian/patches/ubuntu-disable-browsing.dpatch: Regenerated. + * debian/local/backends/dnssd, debian/control, debian/cups.install, + debian/rules: "dnssd" backend removed, DNS-SD discovery backend is now + provided upstream. + * debian/patches/dns-sd-check-typo.dpatch: Fixed typo in upstream code to + check for the availability of dns_sd.h. + * debian/patches/dnssd-avahi.dpatch: Added avahi support for the "dnssd" CUPS + backend (patch from Fedora). CUPS' DNS-SD support does not build with the + libdns_sd of avahi. + * debian/patches/show-compile-command-lines.dpatch: Show compiler command + lines in the output of the "make" process. + * debian/control: Added libusb-dev to the build dependencies, the new USB + printer backend uses libusb and not any more the usblp kernel module. + * debian/control: Added libavahi-common-dev and libavahi-client-dev to + the build dependencies, for the avahi patch for the DNS-SD support. + * debian/control: Added new packages for the new shared libraries and also + cups-ppdc for the PPD manipulation utilities of the former CUPS DDk. Added + transitional package for CUPS DDK. Added Conflicts:/Replaces: as cupsddk + is replaced by cups-ppdc and the files of cupsddk-drivers go into the + main cups package. + * debian/rules: Added "--enable-libusb" to the ./configure command line. + * debian/rules: Added "--enable-avahi" to the ./configure command line. + * debian/rules: Call autoconf, as we have an SVN snapshot currently. + * debian/rules: Updated individual file installation and adaptation steps + for the new CUPS version. + * debian/libcups2-dev.install: Added new header file versioning.h. + * debian/libcupscgi1-dev.install, debian/libcupscgi1.install, + debian/libcupsdriver1-dev.install, debian/libcupsdriver1.install, + debian/libcupsmime1-dev.install, debian/libcupsmime1.install, + debian/libcupsppdc1-dev.install, debian/libcupsppdc1.install: Added install + file lists for newly added libraries. + * debian/cups-ppdc.install: File list for new cups-ppdc package. This package + holds the PPD file manipulation tools which were in CUPS DDK formerly. + * debian/cups-common.install, debian/cups.install: Updated for new CUPS + version. + * debian/cups.install, debian/cups-client.install, debian/cups-ppdc.install: + Commented out lines for missing translated man pages. + * debian/cups.postinst: Do not create the /usr/share/ppd/1-local-admin + and /usr/share/ppd/2-third-party links. They are not needed with current + CUPS and they also break the test procedure during package build. + * debian/libcups2.postinst, debian/libcupsimage2.postinst: Removed no-op + maintainer scripts. + * debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4, + debian/local/filters/pdf-filters/filter/texttopdf.c: Let ./configure + script check the CUPS version so that in texttopdf.c a missing variable + can get defined if CUPS is 1.4.x or newer. + * debian/local/filters/pdf-filters/pdftoopvp/Makefile, + debian/local/filters/pdf-filters/pdftopdf/Makefile: Added missing + "unittests", "install-data", "install-headers", "install-libs", + "install-exec", "libs", "apihelp", and "framedhelp" targets to the + Makefiles of the PDF filters. + + [ Martin Pitt ] + * debian/cups.install, debian/local/filters/pdf-filters/addtocups: Enable + pdftoopvp filter. + * Add disable-pdftoopvp-with-old-poppler.dpatch: Disable pdftoopvp if we + build against a poppler older than 0.11, since pdftoopvp needs that new + API. (This uses pkg-config --atleast-version in the dpatch script header.) + * ubuntu-disable-browsing.dpatch: Restore Ubuntu check. + * dnssd-avahi.dpatch: Add upstream bug link. + * dnssd-avahi.dpatch: Do not error out of the dnssd backend if system D-Bus + is not running. This unbreaks the test suite when running in a build + environment. + + -- Martin Pitt Tue, 25 Aug 2009 22:07:17 +0200 + +cups (1.3.11-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/cups.init.d: Trigger udev event for all USB printers right after + starting the CUPS daemon to run the udev callouts for the printers. This + allows automatic print queue setup and re-enabling print queues also if + the printer is cold-plugged (connected before CUPS and/or udev got + started). + * debian/cups.init.d: Set CUPS RIP cache to 1/4 of the total RAM when CUPS + is started. This way CUPS Raster drivers get enough memory for reliable + and quick operation even if large paper sizes with high resolutions are + printed. + * debian/local/filters/pdf-filters/pdftoopvp/OPVPOutputDev.cxx, + debian/local/filters/pdf-filters/pdftoopvp/OPVPOutputDev.h, + debian/local/filters/pdf-filters/pdftoopvp/pdftoopvp.cxx, + debian/local/filters/pdf-filters/pdftoopvp/opvp/opvp.h, + debian/local/filters/pdf-filters/pdftoopvp/opvp/opvp_0_2_0.h: Adapted + pdftoopvp filter to the new API of Poppler 0.11.2. Thanks to upstream + author Koji Otani for the patch. + * debian/rules: Explicitly create empty file pdftoopvp/Dependencies after + applying the PDF filters add-on as the build servers seem to not copy + empty files. + * debian/patches/default_log_warn.dpatch, + debian/patches/default_log_settings.dpatch: Renamed patch for cupsd.conf + logging settings and added "MaxLogSize 0" so that CUPS does not do its + own log rotation, as our log rotation is much better. + * debian/cups-bsd.postinst, debian/cups.postinst: Moved handling of + /etc/printcap symlink from the post-install script of the cups-bsd + package to the cups package. Should assure that the symlink gets + also set on initial system installation (LP: #415825). + * debian/local/filters/cpdftocps: Updated filter to not use the pdftops + filter of CUPS, as from version 1.3.11 on CUPS' pdftops filter integrates + the call of pstops, and in the PDF workflow this would duplicate the + application of page management options, like N-up, even/odd pages, and + even the number of copies for some printers (LP: #412709). + + [ Jamie Strandboge ] + * debian/cups.postinst: reload individual cups profile, not all of apparmor + (LP: #412745) + + [ Martin Pitt ] + * debian/local/apparmor-profile: Allow cups-pdf to run /bin/cp. + * debian/control: Drop smbclient to Suggests. (Closes: #542464) + + -- Martin Pitt Sat, 22 Aug 2009 17:49:59 +0200 + +cups (1.3.11-1) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/textonly: Adding a final form feed to the job (via + PPD option) did not work (LP: #396673). + * debian/local/filters/pdf-filters/filter/imagetopdf.c: imagetopdf proceeded + the PDF output with a blank line. This made some filters misbehave. + * debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.dpatch: + Make CUPS read the number of copies out of Windows print jobs reliably by + also considering lines like "%%BeginNonPPDFeature: NumCopies 2". Thanks + to Dan Sheridan from Adelard (djs at adelard dot com) for this improvement + of the patch. + + [ Stéphane Graber ] + * Add printer-filtering.dpatch: Add support for printer filtering. + With this patch, when the PRINTER_LIST environment variable is defined + only the printers (comma separated) in it will be displayed. + + [ Martin Pitt ] + * New upstream bug fix release. See http://www.cups.org/articles.php?L586 + for details. + * Drop pdftops-testsuite.dpatch (fixed upstream). + * poppler-based-pdftops-fixes.dpatch, search_mime_files_in_usr_share.dpatch: + Update to new upstream version. + + -- Martin Pitt Sat, 11 Jul 2009 17:27:03 +0200 + +cups (1.3.10-5) unstable; urgency=low + + * debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.dpatch: + Make CUPS reading all option settings in PostScript print jobs and add + the option settings to the filter command line before starting the filter + chain. This fixes the problem that in the PDF printing workflow (where + incoming PostScript gets converted to PDF by pstopdf) option settings + embedded in the incoming PostScript code do not get obeyed. Especially + the options of jobs from Windows clients get ignored. + * debian/filters/pstopdf: Do not let Ghostscript generate multiple copies + of the job if the filter command line from CUPS already supplies the + correct number of copies. + * debian/local/filters/pdf-filters/addtocups: The disabling of the + pdftoopvp filter in cups 1.3.10-3 also disabled pdftopdf. Re-enabled + pdftopdf. + + -- Till Kamppeter Mon, 15 Jun 2009 10:50:33 +0200 + +cups (1.3.10-4) unstable; urgency=low + + * Add ghostscript-cups dependency. (LP: #385606) + * debian/control: Add back dropped comma, which led to the ssl-cert + dependency being dropped. (Closes: #532845) + * debian/local/apparmor-profile: Allow reading /proc/sys/crypto/**. + (LP: #335898) + * debian/local/apparmor-profile: Allow dac_override to cups-pdf. This is + unfortunate, but required with some $HOME permissions; the profile is very + tight, so this shouldn't actually considerably increase privileges. + (LP: #224365) + + -- Martin Pitt Fri, 12 Jun 2009 11:32:28 +0200 + +cups (1.3.10-3) unstable; urgency=low + + [ Till Kamppeter ] + * debian/cups.install, debian/rules: Move added *.convs and *.types files to + /usr/share/cups/mime/ so that they are not considered config files + by dpkg. + * debian/local/text.convs: Turn all text input formats to text/plain at + a high cost, so that the text-only printer (which accepts only text/plain) + accepts them (LP: #385797). + * debian/rules: Switch the pdftops filter back to Poppler, as Ghostscript + has a lot of problems in generating PostScript (LP: #382379). + * debian/patches/poppler-based-pdftops-fixes.dpatch: Fixes for the pdftops + filter in Poppler mode: Do not emit PostScript level 3 as it Poppler's + PostScript level 3 output is not compatible with HP's PostScript printers + (LP: #277404); Added support for the new "-origpagesizes" option of + Poppler's pdftops, so that documents with pages of different sizes get + correctly printed (LP: #310575). + * debian/filters/pstopdf: Do not call Ghostscript with asymmetric resolutions + (like 1200x600 dpi), as it leads to problems with images in some cases. + See http://bugs.ghostscript.com/show_bug.cgi?id=690504. + * debian/local/filters/pdf-filters/pdftopdf/P2PObject.h, + debian/local/filters/pdf-filters/pdftopdf/P2POutput.cxx: Fixed infinite + loop which occured for some PDF files (LP: #382880). + * debian/filters/pstopdf: Make it also correctly working if PaperDimension + and ImageableArea entries in the PPD have no translation strings. Thanks + to Koji Otani to find the bug. + * debian/local/filters/pdf-filters/pdftoopvp/, + debian/local/filters/pdf-filters/README, + debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/removefromcups, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4: + Added pdftoopvp CUPS filter as part of the PDF filter add-on. + * debian/cups.install: Make /etc/fonts/conf.d/99pdftoopvp.conf of pdftoopvp + be installed as part of the cups package + * debian/control: Added build dependencies needed by pdftoopvp: liblcms1-dev, + libfreetype6-dev, libfontconfig1-dev + * debian/control: Moved dependency on cups-client to Depends:, as + cups-client is needed by the post-install script for the update of the + PPDs of existing print queues. + * debian/cups.postinst: Case-insensitive check for model names when updating + PPDs of already existing print queues. + + [ Martin Pitt ] + * Add gnutls-pkgconfig.dpatch: Use "pkg-config gnutls" instead of deprecated + libgnutls-config. (Closes: #529903) + * Bump Standards-Version to 3.8.1 (no changes necessary). + * debian/control: Point Vcs-Browser: to bzr.d.o. loggerhead, and use http:// + URL for Vcs-Bzr. + * debian/control: Drop ghostscript build dependency again, pdftops filter + uses poppler again. Also Drop alternative xpdf-utils build dependency, + since configure now checks for poppler's pdftops capabilities. + * debian/control, debian/rules: Do a build-time check if pdftops supports + -origpagesizes, and dynamically set the poppler-utils dependency. This is + a hack until https://bugs.freedesktop.org/show_bug.cgi?id=19777 makes it + into Debian. + * debian/cups.install, debian/local/filters/pdf-filters/addtocups: Disable + new pdftoopvp filter for now, since sid does not yet have poppler 0.11. + Lower libpoppler-dev build dependency again. + + -- Martin Pitt Thu, 11 Jun 2009 12:19:33 +0200 + +cups (1.3.10-2) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PFont.cxx: Make the pdftopdf + filter also building with Poppler 0.11.0. + * debian/filters/pstopdf: Make pstopdf also reading default values from the + PPD if there is no space between the colon and the value. Some programs + seem to remove this space when setting the defaults. Fixes problem of + Shaun Crampton in LP: #357732. + + [ Martin Pitt ] + * debian/control: Lift cups-driver-gutenprint from Suggests to Recommends, + it's needed by many printers and not very large. (Closes: #522428) + * debian/control: Drop cups-bsd's Recommends: cups to a Suggests:. Client + packages shouldn't pull in the server by default. (Closes: #529630) + * debian/libcups2.dirs: Drop, obsolete. + * debian/cups.dirs: Remove most directories, not necessary to explicitly + create them. + + [ Martin-Éric Racine] + * Cleaned Lintian errors: + (source) + E: debian-rules-ignores-make-clean-error + W: debhelper-but-no-misc-depends + W: dbg-package-missing-depends + (cups) + E: dir-or-file-in-var-run + (cups-common) + W: symlink-should-be-relative + * Added Lintian overrides: + (cups) + W: non-standard-executable-perm + usr/lib/cups/backend-available/[ipp|lpd|serial] 0744 != 0755 + + -- Martin Pitt Thu, 21 May 2009 19:01:37 +0200 + +cups (1.3.10-1) unstable; urgency=medium + + [ Martin Pitt ] + * New upstream security/bug fix release: + - The scheduler now protects against DNS rebinding attacks. Please note + that this could lead to some regressions. (CVE-2009-0164) + - Fixed TIFF integer overflow in image filters. (CVE-2009-0163) + - Lots of bug fixes. + * Drop patches included upstream: + - hpgl-regression.dpatch + - runloop-backchannel-eof-spin.dpatch + - png-image-int-overflow.dpatch + - CVE-2008-5183.dpatch + - pdftops-cups-1.4.dpatch + * Add pdftops-testsuite.dpatch: Fix path to pdftops in the test suite. + * debian/rules: Specify --with-pdftops=gs, so that the pdftops filter is + built with intended ghostscript support. + + [ Till Kamppeter ] + * debian/filters/pstopdf: Added support for custom page sizes to the + pstopdf CUPS filter. + * debian/filters/pstopdf: Call Ghostscript with the default paper size + (from PPD or from CUPS filter command line) on its command line. Some + applications generate PostScript without PageSize requests. + Multi-page-size jobs (LP: 310575) do not get broken by this as + Ghostscript uses the given page size only as default and gives priority + to page sizes requested by the document (in contrary to Poppler). + Fixes LP: #357732). + + -- Martin Pitt Fri, 17 Apr 2009 11:53:48 +0200 + +cups (1.3.9-17) unstable; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf: Added "-dDoNumCopies" to the "ps2pdf" call in + the pstopdf CUPS filter, so that Ghostscript takes into account + /#copies and /NumCopies when converting incoming PostScript to PDF + (Ghostscript upstream bug #690355, LP: #320391). + + [ Martin Pitt ] + * debian/control: Update section of cups-dbg to "debug". + + -- Martin Pitt Sun, 05 Apr 2009 18:04:33 -0700 + +cups (1.3.9-16) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PResources.cxx: Fixed + corruption of output when generating mmultiple copies of EOG or GIMP + output files (LP: #345183). + * debian/cups.postinst: Silenced non-fatal error messages when + post-install script updates PPDs and there are PPDs not belonging to + a CUPS queue in /etc/cups/ppd/ (LP: #345866). + + [ Martin Pitt ] + * debian/local/apparmor-profile: Drop 'm' permission for /etc/passwd and + friends, which was a workaround for a kernel apparmor bug on i386. This is + fixed in current kernels. Thanks to Kees Cook for pointing this out! + (LP: #270663) + * debian/cups.install: Do not install the unnecessary (and broken) D-BUS + configuration file any more. All cupsd does is to send signals, which are + allowed by default. It does not provide any D-BUS service right now. Also + remove the obsolete file on upgrades in debian/cups.preinst. + (Closes: #510634, LP: #318742) + * Add logfiles_adm_readable.dpatch: Make log files readable by group "adm". + (LP: #345953) + * debian/changelog: Fix cruft at the end of file. + * debian/local/apparmor-profile: Explicitly deny access to /dev/tty and + writing access to /etc/krb5.conf, so that accesses to them do not create + log spewage. (LP: #348556) + + -- Martin Pitt Fri, 27 Mar 2009 09:35:56 +0100 + +cups (1.3.9-15) unstable; urgency=low + + * Add debian/local/apport-hook.py: Apport package hook, thanks to + Brian Murray! Install it in debian/rules if we build for Ubuntu. + (LP: #334080) + * debian/rules: Move init script priority to 50, so that cups starts later + in the boot sequence. There is no reason why it should start so early + (before e. g. gdm). Do the transition on upgrades in debian/cups.postinst. + * debian/control: Promote ttf-freefont from Recommends to Depends, since the + PDF filter chain needs it. (Closes: #516335) + * debian/control: Add "Breaks: foomatic-filters (<< 4.0)", and bump + Recommends: version. Earlier foomatic-filters do not support the PDF + filter chain. (Closes: #511009) + * debian/local/apparmor-profile: Add a few missing rules for Kerberos + authentication. (LP: #324645) + * Add bzr-builddeb configuration (merge mode). + * debian/watch: Update so that it works again. + * debian/local/apparmor-profile: Allow cups to read /etc/likewise, for + authentication. (LP: #303927) + * Add testsuite-increase-wait-timeout.dpatch: Increase test suite's timeout + for waiting for jobs to 10 minutes, for slower architectures like arm and + m68k. (Closes: #518787) + + -- Martin Pitt Tue, 10 Mar 2009 13:46:19 +0100 + +cups (1.3.9-14) unstable; urgency=low + + * debian/patches/pdftops-cups-1.4.dpatch: Revert previous change to + define HAVE_PDFTOPS and CUPS_PDFTOPS, since Till says the filter + should actually use ghostscript now. Add ghostscript build + dependency instead. (LP: #329991) + * Add drop_unnecessary_dependencies.dpatch: Do not link libcups.so + and libcupsimage.so against unnecessary libraries. This avoids + unnecessary package dependencies for both libcups, as well as for + packages using cups-config. (Closes: #438067) + * debian/control: Drop XSBC-Original-Maintainer Ubuntu-ism which + accidentally crept in in r607. + + -- Martin Pitt Mon, 16 Feb 2009 18:05:21 +0100 + +cups (1.3.9-13) unstable; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/imagetopdf.c: Added support for + the new "fit-to-page" option (new, more intuitive name for "fitplot"). + * debian/filters/pstopdf: Only apply paper size if the "fitplot" or the + "fit-to-page" option is set. + * debian/local/filters/cpdftocps: Only the last digit of the number of + copies was used (LP: #309314). + * debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Do not preceed the + PDF output with a newline (LP: #303691). Only impose the page size from + the PPD file to all pages if the "fitplot" or the "fit-to-page" option is + set. This prevented from automatic paper tray switching to the correct paper + sizes when a multiple-page-size document is printed (partial fix for + LP: #310575). + * debian/patches/pdftops-cups-1.4.dpatch: Updated from CUPS 1.4 SVN. Contains + fixes for multiple-page-size document printing (partial fix for + LP: #310575). + * debian/patches/pdftops-dont_fail_on_cancel.dpatch: Removed, should be + fixed in the new upstream version of pdftops. + + [ Martin Pitt ] + * debian/patches/pdftops-cups-1.4.dpatch: Add definition of + HAVE_PDFTOPS and CUPS_PDFTOPS, so that the filter actually gets + again built with pdftops support. (Fixes Till's change from above). + + -- Martin Pitt Sun, 15 Feb 2009 18:39:03 +0100 + +cups (1.3.9-12) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PPage.cxx, + debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Do not reposition + the pages when an automatic rotation did not actually take place and + do not apply the page size and margins from the PPD file or the coomand + line if no manipulations affecting the printout size are done (N-up, + scaling, fitplot, ...). This caused LP: #310575. + + * debian/cups.postinst: Let the PPD files of the existing print queues get + automatically updated after each installation of this package (if they + use PPDs of this package). + + [ Marc Deslauriers ] + * SECURITY UPDATE: denial of service by adding a large number of RSS + subscriptions (Closes: #506180, LP: #298241) + - debian/patches/CVE-2008-5183.dpatch: gracefully handle MaxSubscriptions + being reached in scheduler/{ipp.c,subscriptions.c} + - CVE-2008-5183 + + [ Martin Pitt ] + * pidfile.dpatch: Adapt to changes from MaxSubscriptions fix from + above. + + -- Till Kamppeter Sun, 25 Jan 2009 12:05:44 +0100 + +cups (1.3.9-11) experimental; urgency=low + + * debian/local/filters/cpdftocps: Fixed the fix for the number of copies. + In some cases it failed and pstops was called with 0 copies requested + (LP: #309314, LP: #300312, LP: #286048). + + -- Till Kamppeter Fri, 19 Dec 2008 15:58:55 +0100 + +cups (1.3.9-10) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PCatalog.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PCatalog.h, + debian/local/filters/pdf-filters/pdftopdf/P2PDoc.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PDoc.h, + debian/local/filters/pdf-filters/pdftopdf/P2PPage.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PPage.h, + debian/local/filters/pdf-filters/pdftopdf/P2PPageTree.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PPageTree.h, + debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: Fixed problem + of Landscape-oriented PDF files being printed in the wrong orientation + (LP: #47649, LP: #244840). + + * debian/local/filters/cpdftocps: Made correct number of copies being + printed on PostScript printers with hardware copy handling (LP: #286048). + + [ Martin Pitt ] + * debian/local/apparmor-profile: Allow cupsd to run Brother drivers. + (LP: #237256) + + -- Martin Pitt Wed, 17 Dec 2008 07:46:04 +0100 + +cups (1.3.9-9) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PPage.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PResources.cxx: Added + processing of the rotate tag (LP: #300312). + + [ Martin Pitt ] + * Add png-image-int-overflow.dpatch: Fix integer overflow in the PNG image + reader (Closes: #507183, STR #2974, CVE-2008-5286) + + -- Martin Pitt Mon, 01 Dec 2008 15:47:10 -0800 + +cups (1.3.9-8) experimental; urgency=low + + * debian/local/filters/pdf-filters/pdftopdf/P2POutputStream.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2POutputStream.h: Removed + an endianess dependency from the pdftopdf filter, so that it also + works on non-PC platforms like PowerPC (LP: #271350). This also fixes the + filter on mipsel and makes the test suite, and thus the build, succeed + again. (Closes: #500305) + * debian/filters/pstopdf: Do not supply the margins from the PPD to the + ps2pdf process, as this breaks full-bleed printing and is also disturbs + the printing if PPDs have too conservative margin definitions (LP: #282186). + + -- Till Kamppeter Wed, 26 Nov 2008 15:14:57 +0100 + +cups (1.3.9-7) experimental; urgency=low + + * Previous upload had some cruft in the diff.gz which caused some changed + defaults in cupsd.conf. Reupload with a clean diff.gz. *Brown paperbag* + + -- Martin Pitt Thu, 20 Nov 2008 18:49:46 +0100 + +cups (1.3.9-6) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/cpdftocps: The cpdftocps filter did case-sensitive + checking for CUPS options to keep them away from the pstops filter. CUPS + treats such options case-insensitive, so in some cases CUPS options got + applied twice (LP: #299707). + + [ Martin Pitt ] + * debian/rules: Install the serial backend with 0744 permissions to make it + run as root, since /dev/ttyS* are root:dialout and thus not accessible as + user "lp". Thanks to Chanoch (Ken) Bloom. (part of #506181, LP: #154277) + + -- Martin Pitt Thu, 20 Nov 2008 13:43:27 +0100 + +cups (1.3.9-5) experimental; urgency=low + + * hpgl-regression.dpatch: Replaced with version which got committed + upstream. + * Add runloop-backchannel-eof-spin.dpatch: Fix backend runloop spin on + backchannel EOF (select() returns "ready for read" on EOF). This + completely broke printing with e. g. HPJetDirect. Thanks to + Samuel Thibault for tracking down the problem! (Closes: #489045) + * debian/cups-bsd.postinst: Assume default printcap path (in /var/run/cups/) + if not specified in cupsd.conf. This brings back the lost /etc/printcap + for legacy applications. (Closes: #482186, LP: #282667) + * debian/rules: Drop arm/armel -f-no-stack-protector workaround, since SSP + works on these architectures now. (See #469517) + * debian/cups-bsd.postinst: Robustify the cupsd.conf parsing for Printcap, + as per suggestion from Jo Mills. + * rootbackends-worldreadable.dpatch: Apply the same relaxed permission check + to cups-deviced, so that backends installed as 0744 don't disappear from + printer detecttion. (Closes: #503644, LP: #275407) + + -- Martin Pitt Mon, 17 Nov 2008 08:50:34 +0100 + +cups (1.3.9-4) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/conf/pdftoraster.convs, + debian/local/filters/pdf-filters/filter/pdftoraster.cxx, + debian/local/filters/pdf-filters/README, + debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/removefromcups, debian/rules, + debian/copyright: Removed Poppler-based pdftoraster filter. It will be + replaced by a Ghostscript-based pdftoraster filter filter provided by the + Ghostscript package, requested via Debian bug #505282 (fixes LP: #290395). + + * debian/filters/pstopdf: Fixed debug output. + + -- Till Kamppeter Tue, 11 Nov 2008 13:46:55 +0100 + +cups (1.3.9-3) experimental; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf: Fixed several bugs in the pstopdf filter. First, + removed the use of CUPS' pstops filter for inserting option settings. This + also inserts PJL headers and then Ghostscript cannot convert the PostScript + to PDF in the next step. Fixed also the sed magic so that the paper size + and the margins get really read from the PPD and fixed the calculation of + the top and bottom margins, they were exchanged. Fixes LP: #289759, + LP: #292690, LP: #282186. Possible fix for LP #293883. + + [ Martin Pitt ] + * debian/local/apparmor-profile: Allow dnssd backend to create various less + common network protocols (x25, appletalk, etc.) for detection. Also allow + it to read /proc/*/net/, which the bonjour avahi library apparently uses. + (LP: #254022) + + -- Martin Pitt Wed, 29 Oct 2008 11:41:38 +0100 + +cups (1.3.9-2) experimental; urgency=low + + * debian/local/filters/cpdftocps, debian/filters/pstopdf: Avoid duplicate + execution of the number of copies. Sending a PostScript job to a + non-PostScript printer produced n*n copies instead of n copies, also + sending a non-PostScript job to a PostScript printer. A PostScript job + sent to a PostScript printer could even produce n*n*n copies (LP: #286048). + + -- Till Kamppeter Mon, 20 Oct 2008 08:18:20 +0200 + +cups (1.3.9-1) experimental; urgency=low + + * New upstream security/bug fix release: + - The HP-GL/2 filter did not range check pen numbers. [CVE-2008-3641] + - The SGI image file reader did not range check 16-bit run lengths. + [CVE-2008-3639] + - The text filter did not range check cpi, lpi, or column values. + [CVE-2008-3640] + - Fix incompatibility with Firefox 3.0 when using SSL. + - Update the French admin.tmpl, to have the missing "Find new printer" + button and the "Subscriptions" section. Thanks to Yves-Alexis Perez! + (Closes: #475270) + - Lots of other bug fixes, see http://www.cups.org/articles.php?L575. + * Drop patches accepted upstream: + - cupsfilter-path-typo.dpatch + - pjl-display-ready-message.dpatch + - dont-chown-symlinked-ssl.dpatch + * Add hpgl-regression.dpatch: Revert the SP_select_pen() enumeration change + introduced in STR #2911, because it changes the color mapping (e. g. "SP1" + would now select a white pen instead of a black one, and "SP0" would not + be valid at all any more). Also fix a remaining off-by-one loop. (STR + #2966) + + -- Martin Pitt Fri, 10 Oct 2008 11:07:17 +0200 + +cups (1.3.8-13) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/pdftopdf/P2PCatalog.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PCatalog.h, + debian/local/filters/pdf-filters/pdftopdf/P2PDoc.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PDoc.h, + debian/local/filters/pdf-filters/pdftopdf/P2PPageTree.cxx, + debian/local/filters/pdf-filters/pdftopdf/P2PPageTree.h, + debian/local/filters/pdf-filters/pdftopdf/pdftopdf.cxx: + When N-up printing and selection of only the even or odd pages + (for manual duplex) was used together the pages were selected + the wrong way (number-up=2 page-set=even with an 8-page document gave + 2+4, 6+8 and should give 3+4, 7+8). This is fixed now. The behavior + of pdftopdf is now exactly the same as of pstops. + + [ Martin Pitt ] + * debian/local/apparmor-profile: Allow locking on /var/cache/cups/**. + (Mentioned in LP #270046) + + -- Martin Pitt Wed, 08 Oct 2008 11:19:36 +0200 + +cups (1.3.8-12) experimental; urgency=low + + [ Till Kamppeter ] + * debian/filters/pstopdf, + debian/local/filters/pdf-filters/filter/pdftoraster.cxx, + debian/local/filters/pdf-filters/pdftopdf/*: Fixed paper + size handling of pstopdf, pdftopdf, and pdftoraster which led SpliX + to crash (LP: #261363, LP: #268510), fixed monochrome CUPS Raster + output of pdftoraster which led to black pages being printed + (LP: #269691). + + -- Martin Pitt Mon, 06 Oct 2008 16:33:02 +0200 + +cups (1.3.8-11) experimental; urgency=low + + * debian/rules: Explicitly configure with --with-dbusdir. For some obscure + reason, the automatic check fails on the buildds, causing the D-BUS + configuratin not to be installed. Fixes FTBFS. (Closes: #498664) + + -- Martin Pitt Sat, 13 Sep 2008 10:59:31 +0200 + +cups (1.3.8-10) experimental; urgency=low + + [ Martin Pitt ] + * rootbackends-worldreadable.dpatch: Do not run backends as root if they are + group or world writable (this is by and large a paranoia fix, though). + * dont-chown-symlinked-ssl.dpatch: Replace patch with the upstream committed + version, which is more general. + * debian/control: Package development moved to bzr, update Vcs- tags. + * cupsaccept.dpatch: Replaced with the more comprehensive solution upstream + committed to 1.4 trunk. Removed debian/cups-client.links, since the links + are now installed by upstream. Adapt manpage-translations.dpatch + accordingly. + * Move installation of D-BUS configuration files from debian/rules to + debian/cups.install. + * debian/libcups2-dev.install: Add missing sidechannel.h. + + [ Johan Kiviniemi ] + * debian/filters/pstopdf: Apply PPD settings (resolution, page size, page + margins) to the conversion (LP: #263049). + * debian/control: cups Depends: bc (for margin calculation). + + -- Martin Pitt Thu, 11 Sep 2008 13:43:34 +0200 + +cups (1.3.8-9) experimental; urgency=low + + * Previous upload had some cruft in the diff.gz which caused some changed + defaults in cupsd.conf. Reupload with a clean diff.gz. *Brown paperbag* + + -- Martin Pitt Sun, 07 Sep 2008 00:22:23 +0200 + +cups (1.3.8-8) experimental; urgency=low + + * Remove debian/patches/dont_force_ssl.dpatch; gnome-cups-manager is ancient + and removed from Debian, and newer GUIs like system-config-printer get + along fine with the default setting. + * Add quiesce-bonjour-warning.dpatch: Silence the "Apple Bonjour + compatibility layer of Avahi" warning, since it can cause SIGPIPE crashes + when being issued in a child process without stderr. (Closes: #497492) + * confdirperms.dpatch, manpage-translations.dpatch: Revert note that Debian + doesn't install lppasswd suid root, since we do. (Closes: #478280) + * debian/control: Drop the "It can be safely removed from your system" from + the old package names, since that is untrue until the transition is + actually complete. (Closes: #489246) + * debian/control: Bump Standards-Version (no actual changes necessary). + * Remove classes_crash.dpatch, it has been fixed upstream a while ago. + * cupsaccept.dpatch: Rewrite to be consistent with current upstream code, + and send it upstream. + * Drop quiesce_ipp_logging.dpatch: It was only necessary for the polling + from gnome-cups-icon, but fortunately gnome-cups-manager has been removed + now. + * confdirperms.dpatch: Remove a few hunks which were only relevant for + running cups as system user. Remove the SSL certificate bits as well, + rewrite it to be upstream compatible, split it out to + dont-chown-symlinked-ssl.dpatch, reported it upstream. + * Remove device_uri.dpatch, does not seem to be necessary any more. + * Add rootbackends-worldreadable.dpatch: Install root backends + world-readable, to comply to Debian Policy and because it is both + nonsensical to to not do so, and also breaks system checkers, bug + reporting, etc. (Closes: #410171) + + -- Martin Pitt Sat, 06 Sep 2008 18:21:01 +0200 + +cups (1.3.8-7) experimental; urgency=low + + * Previous upload had some cruft in the diff.gz which caused some changed + defaults in cupsd.conf. Reupload with a clean diff.gz. + + -- Martin Pitt Tue, 02 Sep 2008 12:27:18 +0200 + +cups (1.3.8-6) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/texttopdf.c, + debian/local/filters/pdf-filters/filter/pdfutils.c, + debian/local/filters/pdf-filters/filter/test_pdf2.c, + debian/local/filters/pdf-filters/filter/fontembed/test_ps.c, + debian/local/filters/pdf-filters/filter/fontembed/test_pdf.c, + debian/local/filters/pdf-filters/filter/fontembed/sfnt.h, + debian/local/filters/pdf-filters/filter/fontembed/main.c, + debian/local/filters/pdf-filters/filter/fontembed/iofn.h, + debian/local/filters/pdf-filters/filter/fontembed/fontfile.h, + debian/local/filters/pdf-filters/filter/fontembed/fontfile.c, + debian/local/filters/pdf-filters/filter/fontembed/embed.h, + debian/local/filters/pdf-filters/filter/fontembed/embed.c, + debian/local/filters/pdf-filters/filter/fontembed/Makefile, + debian/local/filters/pdf-filters/addtocups: + Fixed crashes of texttopdf on bad or missing fonts, make texttopdf + also working without configuration of the fonts (at least for ASCII). + * debian/local/filters/pdf-filters/filter/pdftoijs.cxx, + debian/local/filters/pdf-filters/conf/HP-PhotoSmart_Pro_B8300-hpijs-pdftoijs.ppd + debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4, + debian/local/filters/pdf-filters/removefromcups, + debian/local/filters/pdf-filters/README, + debian/control, debian/rules: Added pdftoijs filter. + + [ Johan Kiviniemi ] + * debian/filters/pstopdf: + - Adobe Reader generates DRM-infested PostScript from encrypted PDF files. + This PostScript contains code which stops Ghostscript with an error when + one tries to convert it to (now unencrypted) PDF. Change the filter to + normalize such PostScript using ps2ps before conversion. + + [ Martin Pitt ] + * Add alternative dependency "gsfonts-x11" for ttf-freefonts. + (Closes: #495598) + * debian/patches/: Update the status of patches, add some upstream + references, update status in 00list. + * Drop obsolete include_krb5_h_in_job_h.dpatch, package builds fine in + current unstable. + * debian/rules: Enable PIE and other compiler flags security enhancements + with DEB_BUILD_HARDENING=1. Add hardening-wrapper build dependency. Thanks + to Kees Cook! + * Add debian/local/cups.ufw.profile: "ufw" firewall profile. Install it + for Ubuntu builds only for now, until ufw enters Debian as well. Thanks to + Didier Roche and Jamie Strandboge! (https://launchpad.net/bugs/261903) + + -- Martin Pitt Tue, 02 Sep 2008 11:34:54 +0200 + +cups (1.3.8-5) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/filter/texttopdf.c: Added bug fix + from upstream so that texttopdf does not segfault on missing or bad + fonts any more. Backed out Johan Kiviniemi's patch of replacing + Courier by FreeMono. + * Remove hardcoded -march=pentium from texttopdf Makefile. + (Closes: #495220) + + * debian/local/filters/pdf-filters/conf/imagetopdf.convs: Reduced cost + factor to prefer this filter instead of imagetops. + + [ Johan Kiviniemi ] + * debian/local/filters/cpdftocps, debian/local/cpdftocps.convs, + debian/cups.install, debian/rules: + - Add an application/vnd.cups-pdf → application/vnd.cups-postscript + filter, thus making the PDF filter chain possible for PostScript + printers. + - The filter’s cost is 22, making the total cost of pstopdf → pdftopdf → + cpdftocps 66 after the following change. + * debian/local/filters/pdf-filters/conf/pdftopdf.convs, + debian/local/pstopdf.convs, debian/rules: + - Change filter costs to prefer the PDF chain over pstops. + • pdftopdf: 22 instead of 66. + • pstopdf: 22 instead of 100. + • pstops: 100 instead of 66. + * Add pjl-display-ready-message.dpatch: + - According to the PJL spec, one should use "" (not "READY") to return the + display to the normal ready message. + + -- Martin Pitt Fri, 15 Aug 2008 15:54:36 +0200 + +cups (1.3.8-4) experimental; urgency=low + + [ Till Kamppeter ] + * debian/control, debian/rules, + debian/local/filters/pdf-filters/filter/pdfutils.h, + debian/local/filters/pdf-filters/filter/texttopdf.c, + debian/local/filters/pdf-filters/filter/fontembed, + debian/local/filters/pdf-filters/filter/test.sh, + debian/local/filters/pdf-filters/filter/test_pdf1.c, + debian/local/filters/pdf-filters/filter/test_pdf2.c, + debian/local/filters/pdf-filters/filter/pdfutils.c, + debian/local/filters/pdf-filters/conf/texttopdf.convs, + debian/local/filters/pdf-filters/AUTHORS, + debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/data, + debian/local/filters/pdf-filters/data/pdf.utf-8.simple, + debian/local/filters/pdf-filters/data/pdf.utf-8.heavy, + debian/local/filters/pdf-filters/removefromcups, + debian/local/filters/pdf-filters/README: Added texttopdf filter. + Added "Depends: ttf-freefont" for the cups package, as the + texttopdf filter needs these fonts. + + [ Johan Kiviniemi ] + * Add cupsfilter-path-typo.dpatch: Fix a typo in scheduler/cupsfilter.c, + which caused filters not to have /bin in their PATH. + * debian/filters/pstopdf: + - Do not log to /tmp/pstopdf.log. A user running the filter (e.g. via + cupsfilter) made all other users (including cups itself) unable to run + the filter because of no permission to open the logfile. + - Put unquoted variables into quotes where appropriate. + - Never create an outfile in the same directory as the given infile; the + process might not have write access there. + - set -e. + * debian/local/filters/pdf-filters/filter/texttopdf.c: + - Use FreeMono instead of Courier, since texttopdf requires a TrueType + font. + + [ Martin Pitt ] + * Bump shlibs version for libcups2 and libcupsimage2. (Closes: #494168) + + -- Martin Pitt Fri, 15 Aug 2008 08:02:32 +0200 + +cups (1.3.8-3) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/addtocups, + debian/local/filters/pdf-filters/removefromcups, + debian/local/filters/pdf-filters/config-scripts/cups-pdf-filters.m4, + pdftopdf/Makefile: Avoid that all executables and libraries of CUPS + get linked against libpoppler. This especially leads to all packages + dependent on CUPS needing libpoppler, even for building. + + -- Martin Pitt Mon, 11 Aug 2008 16:48:59 +0200 + +cups (1.3.8-2) experimental; urgency=low + + [ Till Kamppeter ] + * debian/local/filters/pdf-filters/, debian/local/pstopdf.convs, + debian/rules, debian/control, debian/copyright, debian/cups.install: + Introduced the first bunch of infrastructure for using PDF as standard + print job format. Added CUPS filters imagetopdf, pstopdf, pdftopdf, + pdftoraster, added build dependency on libpoppler-dev, as the new filters + are Poppler-based. texttopdf and pdftoijs will be added soon. + All this is temporary, as the filters are planned to be added to the + upstream package of CUPS (CUPS STR #2897, #1595). + * debian/patches/search_mime_files_in_usr_share.dpatch: Replaced by the + changes which were done for this purpose in CUPS 1.4. In addition to + the introduction of /usr/share/cups/mime for installing file detection and + conversion rules as non-conffiles it also changes the reading order to + all *.types files and the all *.convs files (instead of all in + /usr/share/cups/mime and then all in /etc/cups). This way + /usr/share/cups/mime can contain conversion rules based on file types + defined by files in /etc/cups (CUPS STR #2719, CUPS SVN revs #7670 and + #7694). + + [ Martin Pitt ] + * Add missing CVE and more verbose descriptions to security fixes to 1.3.6-1 + changelog. + + -- Martin Pitt Sat, 9 Aug 2008 23:48:59 +0200 + +cups (1.3.8-1) unstable; urgency=low + + * New upstream release: some 20 bug fixes, no new features (see + http://www.cups.org/articles.php?L562 for details). + - Fixes remote DoS through RSS subscriptions. (CVE-2008-5184) + * Dropped patches, accepted upstream: + - empty_option_value_crash.dpatch + - CVE-2008-1722.dpatch + - glibc2.8_build.dpatch + - HostNameLookups_values.dpatch + * manpage-typos.dpatch: Most of this got applied to 1.3.8. The ".Sh" -> + ".SS" fix only got applied to trunk, so backport these remaining ones. + * manpage-translations.dpatch: Update to new upstream version. + + -- Martin Pitt Wed, 23 Jul 2008 08:58:57 +0200 + +cups (1.3.7-9) unstable; urgency=low + + [ Martin Pitt ] + * Update Turkish debconf translations, thanks Mert Dirik! + (Closes: #489408) + + [ Till Kamppeter ] + * Updated "Suggests:" for the "cups" package, replacing obsolete + foomatic-filters-ppds by foomatic-db and foomatic-db-engine. + (Closes: #286127) + + -- Martin Pitt Fri, 11 Jul 2008 09:49:08 +0200 + +cups (1.3.7-8) unstable; urgency=medium + + * Urgency medium due to RC bug fix (#487606). + * debian/cups.init.d: Restart xprint on start/stop/reload. (Closes: #285332) + * Add empty_option_value_crash.dpatch: Fix crash on cupsd.conf options + without a value. (Closes: #250848) + * Add glibc2.8_build.dpatch: Fix building with glibc 2.8. + * debian/patches/00list: Sort patches by upstream status. + * Add HostNameLookups_values.dpatch: Make possible values of HostNameLookups + consistent to manpage and to other options in cupsd.conf. (Closes: #379014) + * debian/patches/confdirperms.dpatch: Fix typo, thanks Nicolas François! + * Add manpage-typos.dpatch: Fix various typos in manpages, thanks Nicolas + François! (part of #478597) + * Add manpage-translations.dpatch: Provide po4a infrastructure for + translating mangpages, and add French manpage translations. Add po4a build + dependency, and add translated manpages to debian/*.install. Thanks to + Nicolas François! (Closes: #478597) + * Add Slovak debconf translations, thanks to Ivan Masár. (Closes: #488906) + * Add Romanian debconf translations, thanks to Eddy Petrișor. + (Closes: #488597) + * debian/cups.init.d: Test for executability of daemon, not merely its + existence. (Closes: #488843) + * debian/cups.prerm: Do not delete the /usr/lib/cups/backend/smb symlink on + removal, it is owned by smbclient, not cups. (Closes: #487606) + + -- Martin Pitt Wed, 02 Jul 2008 11:58:47 +0200 + +cups (1.3.7-7) unstable; urgency=low + + * Provide transitional cupsys-common package, to ease apt-get dist-upgrade. + * debian/cups.preinst: Run conffile transition for "install" as well, not + just for "upgrade" (brown paperback for this thinko!), and also remove the + old rc.d symlinks for cupsys. (Closes: #485514) + * debian/control: Drop obsolete "gs-esp" alternative dependency. + + -- Martin Pitt Tue, 10 Jun 2008 16:32:33 +0200 + +cups (1.3.7-6) unstable; urgency=low + + * Rename the package to cups. This is the proper upstream name. Upstream has + made it clear that the usual distro patches are not a trademark violation. + This unbreaks all the documentation out there, which refers to "cups", not + "cupsys" (including names of the init script), as well as unbreaks + dependencies of openprinting.org's LSB printer driver packages. + (Closes: #482296, LP: #233790) + * debian/cups.{config,postinst}: Remove some old cruft. + * debian/cups.preinst: Move conffiles to new names on upgrades, in a dpkg + conffile question avoiding manner. + * debian/cupsys.install: Install oopstops.{convs,types} in /etc/cups, they + do not work in /usr/share/cups/mime (loaded too early). (Closes: #474109) + + -- Martin Pitt Fri, 23 May 2008 00:32:17 +0200 + +cupsys (1.3.7-5) unstable; urgency=low + + * debian/cupsys-bsd.install: Remove daemon/cups-lpd. It really does not + belong into -bsd. + * debian/control: Add appropriate Conflicts/Replaces to older cupsys-bsd + which shipped daemon/cups-lpd. (Closes: #477392) + + -- Martin Pitt Wed, 23 Apr 2008 11:00:41 +0200 + +cupsys (1.3.7-4) unstable; urgency=high + + * debian/rules: Do not fail the build when the test suite fails on m68k and + arm. It is currently unclear why these tests fail on these architectures, + but that shouldn't block testing migration (given that the actual bugs + existed before as well, they just didn't get caught during build). + + -- Martin Pitt Tue, 22 Apr 2008 18:34:35 +0200 + +cupsys (1.3.7-3) unstable; urgency=low + + * debian/copyright: Update to current reality. (Closes: #474176) + * Drop usage of dh_movefiles, rename the remaining debian/*.files to + debian/*.install. This also brings back the lost + /usr/lib/cups/daemon/cups-lpd. + * debian/libcupsimage2-dev.install: Add cups/i18n.h from upstream (not + installed by upstream Makefiles any more). (Closes: #474922) + * debian/rules: Drop lintian magic, current debhelper (dh_lintian) and cdbs + support that now. Rename .lintian -> .lintian-overrides for this. + * debian/cupsys.doc-base: Fix section. + + -- Martin Pitt Tue, 22 Apr 2008 12:28:25 +0200 + +cupsys (1.3.7-2) unstable; urgency=high + + [ Martin Pitt ] + * debian/control: Add missing build dependency lsb-release. (LP: #211375) + Also wrap long fields, so that they are easier to edit. + * Drop pdftops-wait-eintr.dpatch, an improved version has been committed + upstream. Integrate the upstream solution into pdftops-cups-1.4.dpatch. + * Add pdftops-dont_fail_on_cancel.dpatch: Fix behavioural change in patch + from STR #2780 which broke the test suite: When a job is cancelled, do not + report a failure in the exit code of pdftops. + * Rebuild against fixed debhelper to properly compress manpages again (see + #470913). (Closes: #475887, #476495) + + [ Nico Golde ] + * Add debian/patches/CVE-2008-1722.dpatch: Two integer overflows in png + image filter allow a denial of service attack and possibly arbitrary code + execution. [STR #2790, CVE-2008-1722] (Closes: #476305). + + -- Martin Pitt Mon, 21 Apr 2008 19:06:55 +0200 + +cupsys (1.3.7-1) unstable; urgency=medium + + * Urgency medium due to security fix. + * New upstream bugfix/security update release. For a detailled list of + changes see http://www.cups.org/articles.php?L537. + - CUPS GIF image filter overflow [CVE-2008-1373, STR #2765]. + * Drop patches which are now upstream: + - cgiCompileSearch_buffer_overflow.dpatch + - testsuite-exit-code.dpatch + - pbmprint.dpatch + * search_mime_files_in_usr_share.dpatch: Drop log message about missing + /usr/share/cups/mime/ from error to info, since it is not really an + error, and causing the test suite to fail due to error log count mismatch. + * pdftops-cups-1.4.dpatch: Apply r7391 from SVN head to fix missing error + message newlines (STR #2743). + * debian/rules: Remove cleaning of test suite HTML reports in test/, they + are written to /tmp now. + * Add pdftops-wait-eintr.dpatch: Handle EINTR in pdftops' wait() call. + (Caught by test suite.) + * debian/libcupsys2-dev.files: Drop i18n.h, it's an internal interface and + not installed by upstream any more. + * debian/control: Add poppler-utils | xpdf-utils build dependency, so that + the test suite works during build. + + -- Martin Pitt Wed, 02 Apr 2008 11:03:37 +0200 + +cupsys (1.3.6-3) unstable; urgency=high + + [ Till Kamppeter ] + * pdftops-cups-1.4.dpatch: Updated to Mike Sweet's patch version from CUPS + STR #2716. + * debian/patches/ppd-poll-with-client-conf.dpatch: If there is a client.conf + pointing to a remote server, clients were not able to poll the PPD options + from printers on that server (CUPS STRs #2731, #2763) + + [ Martin Pitt ] + * Urgency high due to security fix. + * debian/local/apparmor-profile: Allow cups-pdf to read files in ~/PDF/, so + that it can overwrite files. (LP: #161222) + * Add cgiCompileSearch_buffer_overflow.dpatch: Fix buffer overflow in + cgiCompileSearch() using crafted search expressions. Exploitable if + printer sharing is enabled. (CVE-2008-0047, STR #2729, Closes: #472105) + + -- Martin Pitt Sat, 22 Mar 2008 12:37:57 +0100 + +cupsys (1.3.6-2) unstable; urgency=low + + * debian/rules: Configure with default log file permissions 0640. + (Closes: #469853) + * debian/control: Mention "lpr" in the description of -bsd, for easier + apt-cache search catching. (Closes: #426519) + * Remove debian/NEWS, there's nothing new since Etch's release. + (Closes: #376580) + * Add debian/patches/pbmprint.dpatch: Fix printing of PBM files, thanks to + Eugeniy Meshcheryakov! (Closes: #313536) + * debian/cupsys.preinst: Only chown /var/run/cups if it exists. (LP #156634) + * Move scripting examples from cupsys to libcupsys2-dev. No need to install + those 1.3 MB by default on every system, this is much more developer + oriented. Mention this in the package description. + * debian/rules: Explicitly build with -fno-stack-protector on arm and armel, + since the compiler produces segfaulting binaries. Works around #469517. + * search_mime_files_in_usr_share.dpatch: Do not fatally fail if + DataDir/mime does not exist. This both makes much more sense (since + /etc/cups is the canonical dir which must exist, and /usr/share/cups/mime + is optional), and also unbreaks the test suite (which does not create this + directory by default). + * pidfile.dpatch: Specify PidFile in temporary directory in the self test's + cupsd.conf. + * debian/rules clean: Remove test suite HTML reports. + * Add testsuite-exit-code.dpatch: Exit with nonzero if the test suite fails, + so that it is easier to integrate into package building. + * pdftops-cups-1.4.dpatch: Update pdftops location in test suite, too, so + that it does not fail the PDF printing test. (Forwarded to STR #2759) + * debian/rules: Run test suite on build. This will fail the build if any + tests fail, so that problems on particular platforms will be caught + easily. + * debian/control: Add alternative (build-)depends to heimdal-dev. + * debian/rules, debian/cupsys.postinst: Call update-rc.d to not install stop + symlinks for runlevels 0 and 6, since they just needlessly slow down + shutdown. Remove the obsolete kill symlinks on upgrade. Patch adopted from + the Ubuntu branch, but without using the Ubuntu-only 'multiuser' mode of + update-rc.d. + * Add debian/local/apparmor-profile: AppArmor profile (taken from Ubuntu + branch). Install it in debian/rules if package is built on Ubuntu (tested + with lsb_release -is). Reload AppArmor in debian/cupsys.postinst if both + the cupsys profile and AppArmor itself are present. + * Add debian/patches/ubuntu-disable-browsing.dpatch: Disable Browsing by + default when building on Ubuntu. + * Add debian/patches/ubuntu-default-error-policy-retry-job.dpatch: Set + default job error policy to "Retry", since it is less confusing and a + better default on desktop machines. This is only applied when building on + Ubuntu. + * debian/control: Add Vcs-{Svn,Browser} fields. + + -- Martin Pitt Sun, 16 Mar 2008 22:34:50 +0100 + +cupsys (1.3.6-1) unstable; urgency=low + + * New upstream bugfix release. + - Fixes buffer overflows in filter/hpgl-input.c, possibly exploitable to + run arbitrary code with crafted HP-GL files. (CVE-2008-0053) + - Fixes double free vulnerability in process_browse_data(), + exploitable to remote DoS. (CVE-2008-0882, bug #467653) + * Remove the following patches which are upstream now: + - fix_regression_reactivate_net_ifaces_changes_detection.dpatch + - web-interface-breaks-default-auth-setting.dpatch + * search_mime_files_in_usr_share.dpatch: Greatly simplified the patch by + using mimeMerge(), so that it is more robust against upstream changes. + Forwarded to STR#2719. + * Dropped cupsd.conf-AllowLocal.dpatch; it does not do anything good any + more for the current web and GUI administration tools (they handle this + fine by themselves), so it's obsolete now. + * Drop enable{sharing,browsing} and {sharing,browsing}_status scripts. They + have never been used in Debian, not used any more in Ubuntu, and the + current frontends (web, system-config-printer, etc.) do this in a much + better way. + * debian/docs: Remove redundant LICENSE.txt. + * debian/rules: Add a generic rule to install lintian overrides in + debian/packagename.lintian. + * Add lintian overrides for unjustified/wontfix complaints about libcupsys2 + and cupsys. + * debian/cupsys.doc-base: Remove erroneous whitespace in the section + separator. + * debian/rules: Remove *.o and *.so files from PHP scripting examples + directory (it's /usr/share after all). + * debian/cupsys.init.d: Add Short-Description. + * debian/rules: Do not ship an empty /usr/share/cups/model/ directory. + + -- Martin Pitt Tue, 26 Feb 2008 14:23:50 +0100 + +cupsys (1.3.5-2) unstable; urgency=low + + [ Martin Pitt ] + * debian/cupsys.init.d: Add Should-Start: avahi. (Closes: #459662) + + [ Till Kamppeter ] + * debian/patches/pdftops-cups-1.4.dpatch, debian/local/filters/pdftops: + Replaced Helge Blischke's alternative pdftops wrapper by the pdftops + of CUPS 1.4. The old pdftops wrapper did not work with the pdftops + filter of Poppler, the new one works with the pdftops filters of both + Poppler and XPDF (Closes: #457810; Ubuntu LP: #182379). + * debian/patches/web-interface-breaks-default-auth-setting.dpatch: When + modifying server settings with the CUPS web interface, the setting + for the default authentication got overwritten with gibberish + (Closes: #461331; CUPS STR #2703, Ubuntu LP: #188426). + * debian/local/backends/dnssd: Updated dnssd to filter out IPv6 entries, + as they clutter the lists of detected printers and make the network + printer discovery process taking more time than needed. Applied also + a bug fix and the possibility of querying one IP address by calling + the dnssd backend with the IP as command line argument (like the + snmp CUPS backend). + + -- Martin Pitt Mon, 25 Feb 2008 11:13:15 +0100 + +cupsys (1.3.5-1) unstable; urgency=high + + [ Kenshi Muto] + * New upstream release + - cups-stops-broadcasting-on-HUP-with-explicit-BrowseAddress patch is + merged. + - Fix that SNMP backend did not check for negative string lengths. + (CVE-2007-5849, closes: #457453). + * Update pdftops.pl to 1.20. It fixes overwriting arbitary files + via symlink attack. (CVE-2007-6358, closes: #456960) + + [ Till Kamppeter ] + * debian/patches/fix_regression_reactivate_net_ifaces_changes_detection.dpatch : + Fix a regression in upstream code that has removed the network interface + update poll (CUPS STR #2631, LP: #177075). Thanks to Hugues Fournier + (hugues dot fournier at gmail dot com) for the patch. + + -- Kenshi Muto Wed, 19 Dec 2007 17:07:05 +0900 + +cupsys (1.3.4-4) unstable; urgency=high + + [ Kenshi Muto] + * cupsys depends on "ghostscript | gs-esp", not "ghostscript | gsp-esp"! + I should punish myself. + (closes: #456455) + + -- Kenshi Muto Tue, 18 Dec 2007 07:49:17 +0900 + +cupsys (1.3.4-3) unstable; urgency=high + + [ Martin Pitt ] + * debian/control: Bump Standards-Version to 3.7.3 (no changes necessary). + + [ Till Kamppeter ] + * debian/patches/cups-stops-broadcasting-on-HUP-with-explicit-BrowseAddress.dpatch: + CUPS stopped broadcasting on a HUP signal when using a fixed + BrowseAddress (CUPS STR #2618, Ubuntu LP: #173470). + * debian/local/backends/dnssd: Updated dnssd to support Mac OS X servers + which broadcast their print queues only via DNS-SD and require clients + to create raw IPP queues pointing to the server's queues manually. + + [ Kenshi Muto] + * Debconf translation + - French (closes: #456272) + - do update-debconfpo. Update all translations to use the msgstr 'dnssd' + for msgid 'dnssd'. + * cupsys depends on "ghostscript | gs-esp", to ease testing transition and + upgrades from etch (closes: #456455). + + -- Kenshi Muto Mon, 17 Dec 2007 10:25:02 +0900 + +cupsys (1.3.4-2) unstable; urgency=low + + [ Kenshi Muto ] + * Bumps up shlibs to 1.3.4. + + [ Martin Pitt ] + * debian/control: Remove gs-esp alternative dependency, it's just + "ghostscript" nowadays. + * debian/control: Slightly bump the C/R: for -common; it's a pointless delta + to Ubuntu and it doesn't hurt us. + * debian/cupsys-bsd.postinst: Symlink cupsys-bsd's doc directory to + cupsys-common's, not cupsys', since the latter is not a dependency. + * debian/control: Demote cups-pdf from Recommends: to Suggests: to match the + semantics (apt installs recommends by default now). + * debian/cupsys.init.d: Add LSB header, thanks to Petter Reinholdtsen! + (closes: #337640) + * debian/rules: Configure with default printcap in /var/run/cups/. + (closes: #452446) + + [ Till Kamppeter ] + * Add debian/local/backends/dnssd: Printer discovery backend for + several cheaper printers, like the HP Color LaserJet 2600n, are not + discovered by the "snmp" backend. In addition, this backend extracts more + info from the printers than the "snmp" backend, like for example available + page description languages. This leads to better driver choices for + unknown printer models. + * debian/cupsys.install, debian/cupsys.{prerm,postinst,templates,rules}: + Install new backend. + * debian/control: Add Recommends: to avahi-utils; if it is installed, the + dnssd backend can actually work. + * debian/postinst: Activate new backends (since Etch) by default on + upgrades. This affects snmp, scsi, serial, and dnssd. + + -- Martin Pitt Fri, 30 Nov 2007 18:42:15 +0100 + +cupsys (1.3.4-1) unstable; urgency=high + + * New upstream release. + - Fixes CVE-2007-4351 + IPP Tags Memory Corruption Vulnerability (closes: #448866) + + [ Martin Pitt ] + * debian/cupsys.postinst: Drop ancient code to remove root from group + lpadmin. + + [ Kenshi Muto ] + * Debconf translation + - Finnish (closes: #446740) + + -- Kenshi Muto Fri, 02 Nov 2007 21:32:29 +0900 + +cupsys (1.3.2-1) unstable; urgency=low + + * New upstream bug fix release. + - Fixes web interface for many browsers. (STR#2472, Closes: #440589) + * Remove str2488-fix-localedir.dpatch, str2505_localize.dpatch, + str2508-dont_kill_edit-config.tmpl.dpatch: Fixed upstream. + + -- Martin Pitt Tue, 18 Sep 2007 08:15:17 +0200 + +cupsys (1.3.0-4) unstable; urgency=low + + * Install PO files again, but this time under /usr/share/cups/locale. cups + has its own crazy PO file parser. + * Add debian/patches/str2488-fix-localedir.dpatch: Make the --localedir + configure option actually work (taken from upstream SVN, STR#2488) + * debian/rules: Add --enable-gssapi to ensure that the package is built with + Kerberos support. + * debian/rules: Use -Wl,--as-needed linker flag. This drops a few + unnecessary dependencies and should make checklib much happier. + * Add debian/patches/str2508-dont_kill_edit-config.tmpl.dpatch: Do not kill + edit-config.tmpl on distclean. Forwarded upstream as STR#2508. + (Closes: #441697) + * Add debian/patches/str2505_localize.dpatch: Fix localization of web + interface (STR#2505, Closes: #440256) + + -- Martin Pitt Tue, 11 Sep 2007 22:43:06 +0200 + +cupsys (1.3.0-3) unstable; urgency=low + + [ Martin Pitt ] + * debian/control: Allow 'ghostscript' as alternative dependency to gs-esp. + * debian/cupsys.dirs: Create /usr/lib/cups/backend/ (regression from the big + debian/rules cleanup). (closes: #438432) + * debian/cupsys.preinst: Bump the version comparison for the file owner + cleanup, since some log files were still left as owned by 'cupsys' until + #437536 was fixed. + * debian/cupsys-common.files: Do not install the .po files, cups does not + use them at runtime. (closes: #438625) + + [ Till Kamppeter ] + * debian/local/postscript.ppd: New generic PostScript PPD file for + unknown PostScript printers added. + + -- Martin Pitt Mon, 20 Aug 2007 16:23:58 +0200 + +cupsys (1.3.0-2) unstable; urgency=low + + * debian/control: Re-add erroneously dropped adduser dependencies to cupsys + and cupsys-client. Still needed for addgroup lpadmin. (closes: #437951) + * debian/control: Add missing libkrb5-dev dependency to libcupsys2-dev. + + -- Martin Pitt Wed, 15 Aug 2007 09:22:29 +0200 + +cupsys (1.3.0-1) unstable; urgency=low + + [ Till Kamppeter ] + * New upstream release (first release of 1.3.x generation) + * 90_include_krb5_h_in_job_h.dpatch: Added a missing "#include " to + the scheduler/job.h file (upstream bug). + * Regenerated patches: 44_fixconfdirperms.dpatch, 47_pid.dpatch, + 70_reactivate_recommended_driver.dpatch. + * Removed patches (fixed upstream): 53_usr_share_ppd_support.dpatch, + 55_ppd_okidata_name.dpatch, 68_edit-config.dpatch + * debian/control: Added "libkrb5-dev", and "libavahi-compat-libdnssd-dev" + to the build dependencies, so that the new Kerberos and DNS Service + Discovery support of CUPS gets compiled. + * debian/libcupsys2-dev.files: Removed /usr/include/cups/md5.h This file is + not provided any more by CUPS + * debian/cupsys.install, debian/cupsys-client.files: Added new files. + * debian/rules: Added more files to "clean::" rule which upstream has + forgotten in "make clean". + + [ Martin Pitt ] + * Bump library shlibs to >= 1.3.0. + * Drop 02_configure.dpatch, upstream configure does not set rpath any more + for prefix=/usr. + * Drop 54_cups-config_modeldir.dpatch, --modeldir was never actually used + anywhere and not documented, and LSB prescribes /usr/share/ppd/ anyway. + * Drop 56_dirsvc.dpatch, which was fixed upstream long ago and disabled in + 00list anyway since then. + * Drop 67_printcap.dpatch: /var/run/cups/printcap is now the implicit + default upstream. + * debian/patches: Drop number prefixes from patches. The enumeration is not + useful at all any more since it both got inflated and is not sorted by any + category. With dpatch we also do not need number prefixes. + + -- Martin Pitt Tue, 14 Aug 2007 21:10:50 +0200 + +cupsys (1.2.12-4) unstable; urgency=low + + [ Martin Pitt ] + * cupsys.logrotate: Fix last occurence of 'cupsys' user. + (closes: #437536) + * Moved all Debian specific filters to debian/local/filters. + * Cleaned up debian/rules, moved some file installs to + debian/cupsys.install. + * Merge debian/cupsys.files into debian/cupsys.install and remove the + former. Two different files are just too confusing. + * debian/local/filters/pdftops: Do not pass /etc/cups/pdftops.conf to + pdftops if it does not exist (poppler-utils does not have this file). + (https://launchpad.net/bugs/125300) + + [ Martin-Éric Racine ] + * Corrected download URL in debian/copyright. + * Added debian/watch file using that URL. + * Revised the Uploaders in debian/control: + - Fixed the name for Masayuki Hatta. + - Added Roger Leigh. + * Removed cupsys-driver-gimpprint alternative in debian/control; + superseded by cupsys-driver-gutenprint since Etch. + + -- Martin-Éric Racine Sun, 12 Aug 2007 13:36:30 +0300 + +cupsys (1.2.12-3) unstable; urgency=low + + [ Martin-Éric Racine ] + * Added presubj script to warn bug reporters to avoid filing Poppler + or XPDF security issues, since we don't use that codebase; we call + external programs who do and that's where the bug should be filed. + + [ Martin Pitt ] + * cupsys.init.d: Remove stray chown'ing to 'cupsys' which does not exist any + more. (closes: #436662) + * cupsys.init.d: Fix detection of parallel printers when 'lp' is already + loaded. (https://launchpad.net/bugs/29050) + * debian/cupsys.init.d: Put back 'reload'. + + -- Martin Pitt Thu, 09 Aug 2007 20:47:42 +0200 + +cupsys (1.2.12-2) unstable; urgency=low + + [ Kenshi Muto ] + * Added scripting directory to /usr/share/doc/cupsys/examples. + This directory contains the binding code from Java, Perl, and PHP + to CUPS. (closes: #193076) + Although we Debian CUPS team cannot afford to maintain them, + some of you may want them. + * Added 'Recommends: cupsys' to cupsys-bsd. (closes: #426521) + * Changed cupsys-client from 'Recommends: cupsys-bsd' to 'Suggests: + cupsys-bsd.' because cupsys-bsd isn't so necessary for cupsys-client. + * Fixed to use 'cupsys' instead of 'cups' for PAM on cups-check-pam-auth. + (though Debian CUPS doesn't use this daemon) (closes: #425701) + * Added debconf-2.0 to the dependency of cupsys-bsd. (closes: #415684) + + [ Martin Pitt ] + * Drop the derooting changes. It still has some regressions, and with + upstream not even acknowledging the need for improving cupsys' security we + will sit on this forever. This will be replaced by an AppArmor/SELinux + profiles in the future. + - Drop derooting related patches: + 06_disable_backend_setuid.dpatch + 10_external_pam_helper.dpatch + 09_runasuser.dpatch + 09_runasuser_autoconf.dpatch + - debian/cupsys{,-client}.postinst: Drop the 'cupsys' user setup and file + permission juggling. + - debian/rules: + + Drop --with-cups-user configure option. + + Do not modify the upstream default backend permissions. + - debian/cupsys.init.d: Do not touch log file permissions any more. + - debian/cupsys.files: Drop cups-check-pam-auth. + - debian/NEWS: Drop description of derooting changes. + - debian/control: Drop adduser dependency. + * debian/patches/44_fixconfdirperms.dpatch: Do not create + /var/run/cups/certs as lp:lpadmin, but as root:lpadmin, so that cupsd + does not need CAP_DAC_OVERRIDE. This will make it possible to create a + sensible AppArmor/SELinux profile. + * debian/cupsys.preinst: Fix file permissions on upgrades (owner cupsys -> + root). + * debian/control, debian/rules: Remove references to libcupsys2-gnutls10, + since it's a transitional package in Etch and not relevant any more in + Lenny. + * debian/cupsys.{pre,post}inst: Remove obsolete transition bits. + * Remove obsolete debian/patches/05_avoidunknowngroup.dpatch. + * Use ssl-cert's "snakeoil" SSL certificate by default: (Closes: #402370) + - debian/control: Add ssl-cert dependency. + - debian/cupsys.postinst: Symlink snakeoil SSL certificate if present, and + there is none present yet. + * debian/control: Replace obsolete ${Source-Version} with ${binary:Version}. + + [ Till Kamppeter ] + * Add debian/local/textonly.{ppd,filter}: Text-only printer driver from Red + Hat. Install it in debian/rules. + * debian/rules: Install the D-Bus config file so that CUPS reports + job progress to dbus clients (like sytem-config-printer). + * Add debian/local/oopstops.{.pl,types,convs}: Helge Bliscke's oopstops + filter to work around the bugs in the PostScript output of OpenOffice.org + (from http://www.srz.de/Members/bla/cups/filter/oopstops). Install them in + debian/rules. + + -- Martin Pitt Mon, 06 Aug 2007 15:47:33 +0200 + +cupsys (1.2.12-1) unstable; urgency=low + + * New upstream release + * removed unnecessary dependency against patch package (Closes: #431069) + * Debconf translation + - Danish (Closes: #426772) + - Vietnamese (Closes: #426822) + - Spanish (Closes: #430004) + * Disabled external_pam_helper due to #425944 and Ubuntu#112803. + (closes: #425944) + + -- Kenshi Muto Sat, 14 Jul 2007 14:56:24 +0900 + +cupsys (1.2.11-3) unstable; urgency=medium + + * debian/rules: Disable privilege dropping for now until we fixed the + backend invocation to become compatible to upstream's behaviour again. + This unbreaks third-party backends again for now. (Closes: #427559) + + -- Martin Pitt Fri, 08 Jun 2007 11:15:12 +0200 + +cupsys (1.2.11-2) unstable; urgency=low + + * debian/rules: Latest cups installs the ipp backend with 0700 permissions, + which makes it inaccessible to both the cups daemon (Closes: #423972) and + unreadable for users (Closes: #415872) + + -- Martin Pitt Wed, 16 May 2007 09:06:44 +0200 + +cupsys (1.2.11-1) unstable; urgency=low + + [ Kenshi Muto ] + * Applied templates improvement patch contributed by + debian-l10n-english team. (closes: #416350) + * Debconf translation + - Japanese + - Galician (closes: #416357) + - Swedish (closes: #416356) + - Catalan (closes: #416367) + - Basque (closes: #416385) + - Norwegian (closes: #416401) + - Italian (closes: #416407) + * New upstream version 1.2.11: + - 56_dirsvc patch is merged. + + [ Christian Perrier ] + * Debconf translation + - Czech (closes: #416939) + - German (closes: #416994) + - Brazilian Portuguese (closes: #417249) + - French + - Malayalam. (closes: #418030) + - Russian. (closes: #417874) + - Dutch. (closes: #418135) + - Portuguese (closes: #418299) + + [ Martin Pitt ] + * New upstream bugfix release (closes: #421899). + + Synchronize patches with Ubuntu and new upstream version 1.2.10: + + * Drop patches which are fixed upstream: + 00_00str2111.dpatch, 00_01str2137.dpatch, 00_02str2144.dpatch, + 00_03str2106.dpatch, 00_04str2117.dpatch, 00_05str2133.dpatch, + 00_06str2121.dpatch, 00_07str2123.dpatch, 00_08str2135.dpatch, + 00_09str2198.dpatch, 03_clean.dpatch, 65_detect_http_shutdown.dpatch + * Remove a few obsolete patches: + 08_cupsd.conf.conf.d.dpatch, 26_modprobe.dpatch, 48_stdlib.dpatch, + 61_job_c_strangeloop.dpatch, 08_cupsd.conf.conf.d.dpatch, + 64_driverfolder.dpatch. + * Add debian/patches/14_dont_force_ssl.dpatch: Do not require SSL for /admin + pages, since gnome-cups-manager (and most probably other GUI frontends) + does not support this. + * Add debian/patches/58_cupsd.conf-AllowLocal.dpatch: Allow access to local + ethernet by default. This just affects the ACL, for actually enabling + access cupsd needs to be switched to not only listen on localhost. With + that, this setting does not need to be configured in two different places. + * Add debian/patches/70_reactivate_recommended_driver.dpatch: Upstream CUPS + filters the "(recommended)" marking from the NickNames of the PPD files + when listing PPDs. These are an important orientation for the user and + they are also made use of by some printer setup tools. We need them at + least until a better solution for recommending drivers gets available. + * Add debian/patches/98_search_mime_files_in_usr_share.dpatch: Let CUPS also + search for *.types and *.convs files in /usr/share/cups/mime. This way + packages can provide *.types and *.convs files which do not get considered + as conffiles. (See https://launchpad.net/36532 for details). + * debian/patches/*.dpatch: Forwarded a lot of patches to upstream bug + tracker, add STR URLs to dpatch DP: headers. + + Synchronize packaging with Ubuntu: + + * debian/control: Drop transitional libcupsys2-gnutls10 package, it was only + required for Sarge->Etch upgrades. + * debian/control: Change netbase dependency to update-inetd, since that + lives in its own package now. + * debian/local/enable_sharing: Also match on 127.0.0.1 IP adresses in + addition to 'localhost'. + * debian/rules: Most of the clean:: rule is obsolete, only two files are + left behind now. These two have been reported upstream in + http://www.cups.org/str.php?L2366. + * debian/cupsys.templates: Activate SCSI, serial, and SNMP backends by + default. With these backends activated, many printers can be easily set up + with the printer setup tools. Especially network printers get + auto-detected and the correct URI gets assigned to them (doing this + manually is a non-trivial task for most users). + * debian/cupsys.dirs: Add /usr/share/ppd/custom/, a place where lpadmins can + store additional PPDs (this functionality is e. g. provided in + gnome-cups-manager's "Custom driver..." file dialog). + * debian/cupsys.init.d: Give proper permissions to /usr/share/ppd/custom/: + root:lpadmin 3775. Drop the obsolete chmod/chowning of + /usr/share/cups/model. + * Run the backend as non-root system user to confine the impact of security + vulnerabilities: + - Add debian/patches/10_external_pam_helper.dpatch: + + Add a helper program 'cups-check-pam-auth' which performs PAM + authentication and returns the status as exit code. + + scheduler/auth.c, cupsdAuthorize(): Attempt to use + cups-check-pam-auth before trying native PAM. + + With this we do not need to put the cupsys user into the shadow group. + - debian/cupsys.files: Install PAM helper. + - debian/cupsys.postinst: Set permissions of PAM helper to cupsys:shadow + 2754, alter permissions of some configuration files and directories to + work with non-root cupsd. + - debian/cupsys.postinst: Fix /var/cache/cups/ permissions for upgrades + which might have written cache files as root. + - debian/cupsys.logrotate: Save log files as cupsys:lpadmin. + - debian/cupsys.init.d: Disable 'reload'; change force-reload to restart, + since cupsd cannot reload as non-root. + - debian/cupsys.init.d: Set up proper permissions of log files. + - debian/rules: Enable --enable-privilege-dropping configure option. + - debian/rules: Install lpd backend suid root, so that it can bind to + ports < 1024 (really silly, but required for RFC compliance). + - debian/cupsys-client.postinst, debian/cupsys.postinst: Set up cupsys + system user. + * debian/NEWS: Describe derooting. + + -- Martin Pitt Mon, 14 May 2007 09:23:16 +0200 + +cupsys (1.2.7-4) unstable; urgency=high + + [ Kenshi Muto ] + * Use dh_usrlocal to install files in /usr/local in the + maintainer scripts, instead of shipping them in the deb. + This was policy violation (closes: #409335) + + -- Kenshi Muto Fri, 2 Feb 2007 18:16:24 +0900 + +cupsys (1.2.7-3) unstable; urgency=high + + [ Kenshi Muto ] + * removed STR2137 patch. This patch corruted some + Postscript files. (closes: #403703) This was a release + critical bug. + * Provides /usr/local/share/ppd and /opt/share/ppd + to satisfy LSB 3.2. (closes: #408154) + * Applied upstream patch: + - STR2198: The scheduler still loaded the remote printer cache, + even when browsing was disabled + * Debconf translation + - Portuguese (closes: #408332) + - Norwegian (closes: #406253) + + -- Kenshi Muto Thu, 1 Feb 2007 10:17:30 +0000 + +cupsys (1.2.7-2) unstable; urgency=high + + [ Kenshi Muto ] + * Applied upstream patches to fix some (include RC) bugs as dpatch style: + - STR2106: Raw PBM files did not print correctly + - STR2111: The PostScript filter did not properly output + document setup commands for reversed output (closes: Bug#403703) + - STR2117: The scheduler did not parse IPv6 netmask properly + - STR2121: cupsDoAuthentication() did not translate the password + prompt + - STR2123: The backends incorrectly used STATUS: + media-tray-empty-error messages for out-of-paper conditions + - STR2133: httpGetLength2() did not handle error messages without + content correctly + - STR2135: cupsMarkOptions() did not handle the + multiple-document-handling option + - STR2137: Collated output produced by the PostScript filter could + lose some options + - STR2144: job-hold-until with time values for the next day would + be held for 60 days + * 67_printcap: Add Printcap/PrintcapFormat/PrintcapGUI variables to + cupsd.conf file. (closes: #401981) + * cupsys makes /var/run/cups/certs. Although CUPS daemon can make + it automatically, the daemon logs an warning. + * 68_edit-config: Provide same cupsd.conf as initial package + installation. + + -- Kenshi Muto Wed, 6 Dec 2006 22:42:34 +0000 + +cupsys (1.2.7-1) unstable; urgency=low + + * New upstream release + - Added Italian translation + + [ Kenshi Muto ] + * Add printer.schema to /usr/share/doc/cupsys/examples for LDAP. + (closes: #399122) + + -- Kenshi Muto Sat, 18 Nov 2006 10:03:30 +0900 + +cupsys (1.2.6-2) unstable; urgency=low + + [ Kenshi Muto ] + * Debconf translation + - Brazillian Portuguese (closes: #397842) + - Basque (closes: #398574) + * 00_r6100: Apply SVN r6100. + - Fixed an inefficiency in the SNMP IPP detection code + (closes: #397833) + + -- Kenshi Muto Tue, 14 Nov 2006 22:29:08 +0900 + +cupsys (1.2.6-1) unstable; urgency=low + + * New upstream release + Fixes bugs include + - "lpc status" did not show the number of queued jobs for + disabled queues + - The lpstat program could hang + + -- Kenshi Muto Tue, 7 Nov 2006 21:09:33 +0900 + +cupsys (1.2.5-1) unstable; urgency=medium + + * New upstream release. + + [ Kenshi Muto ] + * 00_r6052: Apply SVN r6052 to pass the compile with libpaper. + * provides /etc/pam.d/cupsys correctly. (closes: #392142) + (renamed debian/pam to debian/cupsys.pam) + * fixed "ppd API fails to discover printer nickname and options" + problem" by upstream (closes: #394255) + + -- Kenshi Muto Sat, 21 Oct 2006 01:18:34 +0000 + +cupsys (1.2.4-2) unstable; urgency=low + + [ Kenshi Muto ] + * PPD transition to /usr/share/ppd is mostly finished. + Now I remove old symlink /usr/share/ppd/cups-transitional-dir and + /usr/share/cups/cups-included. (closes: #381266, #383291) + * Update debconf translations: + - Brazilian Portuguese (closes: #389222) + * Tried to solve the backend permission problem. CUPS scheduler + uses a permission and owner information of backend program. + - Install ipp and lpd as mode 0700. + - Create backend links as hardlink instead of symlink. + + -- Kenshi Muto Sat, 30 Sep 2006 14:56:29 +0900 + +cupsys (1.2.4-1) unstable; urgency=medium + + * New upstream release + - The web interface change settings and edit configuration + file buttons would truncate the cupsd.conf file (STR #1976, + closes: #389093) + Because this bug seems critical, we upload this fixed version + as urgency=medium. + [ Martin Pitt ] + * debian/patches/56_dirsvc.dpatch: Update patch so that a patch/unpatch + cycle restores the source properly instead of breaking dirsvc.c in two + different places. + + [ Kenshi Muto ] + * debian/patches/65_detect_http_shutdown.dpatch: avoid that + gnome-cups-manager eats CPU 100%. (closes: #377640) + + -- Kenshi Muto Sun, 24 Sep 2006 09:54:44 +0000 + +cupsys (1.2.3-1) unstable; urgency=medium + + * New upstream release + - The parallel and USB backends no longer wait for the + printer to go on-line - this caused problems with + certain printers that don't follow with the IEEE-1284 + standard (STR #1738, closes: #383091) + - fixed Printer options were not always honored when printing + from Windows clients (STR#1839, closes: #385605) + + [ Martin Pitt ] + * Add appropriate Replaces: to cupsys-common to unbreak upgrades. + * debian/patches/44_fixconfdirperms.dpatch: Fix file mode specification: + 3755 -> 03755 (regression of svn commit 353). + + [ Kenshi Muto ] + * Apply upstream svn r5958. + * check modprobe command and /proc/modules dir exist before running + modprobe (closes: #387176). + * 62_classes_crash: fix incorrect code. old code returned an error + even if user use the correct class configuration. (closes: #380663, #384654) + * bump up libcupsys2.shlibs version to 1.2.3. (closes: #385724) + * Merge old separated style configuration to the single format + only if user upgraded from an affected version. (closes: #386551) + * Provide /usr/share/cups/drivers to contain Windows drivers. + * 57_cupsaddsmb: original cupsaddsmb easily goes infinite and DoS-like + loop. Debian cupsaddsmb ends soon when it catches an error. + + -- Kenshi Muto Fri, 8 Sep 2006 11:28:12 +0200 + +cupsys (1.2.2-2) unstable; urgency=high + + [ Kenshi Muto ] + * Apply upstream svn change r5845. + - BrowseRelay didn't work on Debian (closes: #372855) + 61_job_c_strangeloop.dpatch: I don't make sure but job.c of + r5818 causes strange CPU busy when it gets printing jobs. + This patch avoids it. + * 12_quiesce_ipp_logging: some part are merged into the upstream + source. updated. + * libcupsys2 conflicts cupsys version 1.1. + libcupsys2 version 1.2 changed its private API. This breaks + old cupsys 1.1, but we believe cupsys is only one application + is affected by this change. (closes: #380619) + * Provide an new package, "cupsys-dbg" to help chasing the + problems at user's environment. + * Increment compat to 5. + * 44_fixconfdirperms: set owner lp for /etc/cups directory. + And modify lppasswd.man to mention about Debian + specific changes. lppasswd command now work. (closes: #378062) + * 62_classes_crash: when class hasn't any printers, cupsd will + crash immedieately after receiving a job. This patch avoids + a crash. + * Update debconf translations: + - Spanish (closes: #383087) + + -- Kenshi Muto Thu, 27 Jul 2006 23:40:54 +0900 + +cupsys (1.2.2-1) unstable; urgency=medium + + * New upstream release + + [ Martin Pitt ] + * Adapt patches to new upstream version. + * debian/cupsys.init.d: If lp module loading is requested, also load the + 'ppdev' module to fix the name and model detection of parallel printers on + newer kernels. + * Revive debian/patches/56_dirsvc.dpatch; it's still not fixed upstream. + * debian/patches/09_runasuser.dpatch: Do not drop additional group + privileges in scheduler/process.c. This should fix a range of bugs + concerning detection of parallel port printers and other 'permission + denied' bugs if privilege dropping is enabled (it is disabled by default in + Debian). + * debian/patches/44_fixconfdirperms.dpatch: Do not change owner and mode of + SSL certificate, in order to not break permissions of customized global + ones (like the one from the ssl-cert package). Grrr, cups, no, you cannot + own the world! + * debian/patches/54_cups-config_modeldir.dpatch: Add --modeldir to + cups-config so that other packages can use it to figure out the correct + PPD base path. + * debian/cupsys.examples: Do not ship .svn files (upstream Makefiles install + them). + * debian/local/{enable_browsing,browsing_status}: Adapt to single-file + configuration file style. + * Add debian/local/{enable_sharing,sharing_status}: Similar to + enable_browsing and browsing_status, this switches between "Listen + localhost:631" and "Port 631" (just as the web interface does). Install + files in debian/rules. + + -- Kenshi Muto Mon, 24 Jul 2006 10:59:27 +0200 + +cupsys (1.2.1-4) unstable; urgency=medium + + [Kenshi Muto] + * Include changelogs during 1.1.23-13 - 1.1.23-15. (closes: #374494) + * Apply upstream svn change r5754. + - Fix negotiation problem between unstable clients and sarge servers. + (closes: #375359) + * 58_fixdestc: avoid build failure of r5754 (add ipp-private.h include). + * 59_de_docroot: install German translation/images. Although upstream + SVN has, Debian diff structure can't handle a binary diff. This patch + will be removed when 1.2.2 is released. + * Add snmp to backend choices. Because I don't make sure this backend + is stable, the default is disabled. Use dpkg-reconfigure cupsys to + enable. (closes: #376496) + * Don't remove backend symlinks during reconfigure/upgrade process. + (closes: #376499) + * Check Include directive with case insensitive. (closes: #376883) + * libcupsys2 has /etc/cups directory to allow admin put own + client.conf. (closes: #370788) + * Include sample client.conf in libcupsys2. You can copy /usr/share/ + doc/libcupsys2/examples/client.conf to /etc/cups or ~/.cups and modify + for your environment. (closes: #376840) + * Split locale files to new package "cupsys-common". (closes: #378659) + This package is used by cupsys and cupsys-client/cupsys-bsd. + * removed 26_modprobe: because parallel backend executes with user 'lp' + permission, modprobe can't work. We CUPS team believe it's better + that lp module is loaded by discover or any other hardware detection + programs instead of CUPS. We provide a module loader by init script + for user's convenience at this time. + * 60_device_uri: preserve old URI during the printer configuration on + Web interface. + + -- Kenshi Muto Wed, 21 Jun 2006 15:06:02 +0000 + +cupsys (1.2.1-3) unstable; urgency=low + + [Kenshi Muto] + * Apply upstream svn change r5673. + - Remove unnecessary %s from dirsvc.c and will solve a mysterious + cupsd crash. Thanks Neil. (closes: #372696, #370611) + - Support again * character as IP address. (closes: #372291) + - Fixes wrong command line arguments to backend. (closes: #372586, #373839) + * Improve the wording of NEWS file, thanks Tomas (closes: #372256) + * 53_usr_share_ppd_support: Use /usr/share/ppd as PPD path. + (closes: #365300, #373722) + Make symlink /usr/share/ppd/cups-transitional-dir -> /usr/share/cups/ppd + for keeping a compatibility. We'll migrate all of PPD files to + /usr/share/ppd in the future. + * Revert to use single /etc/cups/cupsd.conf file for the configuration + instead of using separate files in /etc/cups/cups.d. The migration will + be done automatically. (closes: #345973, #372727) + * Apply correct permission modes to the files under /etc/cups at postinst + stage. + * Update debconf translations: + - Danish (closes: #371170) + - French (closes: #372714) + - Italian (closes: #372198) + + -- Kenshi Muto Sun, 11 Jun 2006 11:51:01 +0000 + +cupsys (1.2.1-2) unstable; urgency=low + + [Kenshi Muto] + * Provides /etc/cups/ssl directory for SSL. (closes: #370407, #370450) + * Add an newline after 'Starting ...' message by appending log_end_msg + to /etc/init.d/cupsys. (closes: #370460) + + -- Kenshi Muto Mon, 5 Jun 2006 22:44:55 +0900 + +cupsys (1.2.1-1) unstable; urgency=low + + [Kenshi Muto] + * New upstream release 1.2.1 for Debian unstable/testing. + * 00_r5610: Apply patches from upstream r5610. + * Re-update Dutch debconf translation (closes: #369004) + * Pump up shlibs to >=1.2.1 for compatibility safe. + + -- Kenshi Muto Wed, 31 May 2006 13:17:16 +0000 + +cupsys (1.2.1-0exp1) experimental; urgency=low + + [Kenshi Muto] + * New upstream release 1.2.1. + * Update Dutch debconf translation (closes: #369004) + * Update Italian debconf translation (closes: #367943) + * Includes the installation guide of dvi filter to /usr/share/doc/ + cupsys/examples/filters/dvipipetops.INSTALL is contributed by + Francesco Potort. This is partial fix for Bug#368450. + + [Martin Pitt] + * New upstream release 1.2.0. + * Update patches for new upstream release. + * Remove debian/patches/01_cupsimage.dpatch, fixed upstream. + * Remove debian/patches/20_httpGetHostname_crash.dpatch, fixed upstream. + * debian/patches/55_ppd_okidata_name.dpatch: Change "Oki" manufacturer name + to "Okidata" to be consistent with other PPD files. + * Implement http://wiki.debian.org/PpdFileStructureSpecification: + - debian/dirs: Create /usr/share/ppd/cups-included/. + - debian/rules: Install shipped PPDs into + /usr/share/ppd/cups-included// and provide a symlink to + the old /usr/share/cups/model directory for backwards compatibility. + * debian/cupsys.dirs: Ship /usr/lib/cups/driver/ to avoid error messages if + it's missing. + * debian/patches/09_runasuser.dpatch, scheduler/cert.c: Change root + certificate permissions from 0440 to 0240, so that the CGI programs cannot + read it any more. Without this patch, cupsd presented its own certificate + to itself, and *every* user could do admin tasks without authentication. + * debian/cupsys-client.links: Fix cupsenable/cupsdisable manpage link. + Closes: #364447 + * debian/patches/08_cupsd.conf.conf.d.dpatch: + - Set "BrowseAddress @LOCAL"; without this, sending browsing information + does not work (Browsing still has to be enabled). + - Add some comments to point out that the Port and Browsing settings are + moved to /etc/cups/cups.d/. + * debian/cupsys.postrm: Clean up passwd.md5 on purge. + + -- Kenshi Muto Sun, 28 May 2006 13:07:36 +0000 + +cupsys (1.1.99.rc2-0exp1) experimental; urgency=low + + [ Kenshi Muto ] + * New upstream release 1.2RC2. + - Because -fpie config becomes optional, compiler works on amd64 and + other architectures. (closes: #335199) + * Enable LDAP support. + * Remove duplicated update-rc.d (closes: #356911) + * Stopped asking admin password because it works only if user chooses + digest authentication. The default configuration of Debian uses + PAM and basic authentication. + * Enable dbus support. + * 03_clean.dpatch: Remove produced and remained files during build. + * Now CUPS uses 'lp' user/group privilege to call backend or any other + programs. + CUPS SystemGroup is 'lpadmin'. You need to add users who are allowed + to add/modify/remove printers/jobs/classes. + * Remove image.h.patch from source. It is no longer needed. + * 02_configure.dpath: Remove -rpath from configure. + * Fix typo in cupsys-bsd description. (closes: #362070) + * Add Galician debconf translation. (closes: #361258) + * Update Danish debconf translation. (closes: #357969) + * Use 'reload' during logrotate instead of 'restart'. It looks safe + on CUPS 1.2. (though job-restart problem still remains) + * set TZ in init script only if TZ isn't defined yet. + * Use if-fi structure style for postrotate of logrotate script. + It solves error when cupsys is not running. (closes: #347641) + * Unset TMPDIR environment variable before running daemon. (closes: #347829) + * Removed /etc/cups/pdftops.conf because it was for pdftops of upstream + version. Debian CUPS uses xpdf-utils wrapper and doesn't need + pdftops.conf. + * Notice: /etc/cups/client.conf has been removed upstream. + * Notice: {dis,en}able have been renamed to cups{dis,en}able. + + [ Martin Pitt ] + * debian/patches/48_stdlib.dpatch: Adapted to new upstream version. + * debian/cupsys.init.d: + - Fix arguments of start-stop-daemon and remove the hideous kill + algorithm. + - Ensure that /var/run/cupsd exists; this makes the init script work with + /var/run mounted on a tmpfs. + * debian/libcupsys2-dev.files, debian/libcupsimage2-dev.files: Remove static + library; upstream does not build them any more, and they are useless + anyway. + * Add debian/patches/06_disable_backend_setuid.dpatch: Remove the uid + changing in scheduler/cups-deviced.c which was introduced recently in + upstream. It totally breaks device node access (e. g. /dev/lp0 is root:lp + 0660, which is inaccessible for a process which runs as lp:root). + * debian/rules: Remove --with-cups-user, upstream does not support + it any more. + * debian/patches/09_runasuser_fixes.dpatch: RunAsUser was removed upstream; + rename the patch to 09_runasuser.dpatch and rewrite it: + - Enclose all changes in an #if CUPS_DROP_PRIVILEGES, so that it is easy to + enable this feature. + - scheduler/main.c: Drop privileges after initialization. + - scheduler/conf.c: If we build with CUPS_DROP_PRIVILEGES, set RunUser to + User instead of getuid(), since at that point we will always run as root + (privileges cannot yet be dropped at that point). + - config-scripts/cups-defaults.m4: Add --enable-privilege-dropping option. + - config.h.in: Add CUPS_DROP_PRIVILEGES option template. + * Add debian/patches/09_runasuser_autoconf.dpatch: autoconf changes for + 09_runasuser_fixes.dpatch changes. + * debian/pdftops: Fix reading from stdin (https://launchpad.net/bugs/17124) + * debian/cupsys.preinst: Remove dangling /etc/cups/pdftops.conf symlink on + upgrades to unbreak printing with poppler-utils. + * debian/control: Add poppler-utils alternative for xpdf-utils dependency. + * Add debian/patches/12_quiesce_ipp_logging.dpatch: + - Drop successful IPP messages to log level 'debug' and unsuccessful ones + to 'info'. + - Do not flood access_log with successful CUPS-Get-Printers and + Get-Printer-Attributes queries (which are generated by e. g. + gnome-cups-icon every 3 seconds). + - Closes: #280718 + * Add debian/patches/13_default_log_warn.dpatch: Raise default log severity + to 'warning' to not log gazillions of IPP requests by default. (other part + of #280718) + * debian/rules, debian/cupsys.postinst: Remove obsolete /etc/cups/certs and + /var/lib/cups/certs (certificates are managed in /var/run/certs now). + * debian/cupsys.preinst: Remove obsolete /etc/cups/certs symlink on upgrades. + * debian/cupsys-client.files: Install cupstestdsc and manpage. + * debian/cupsd.init: Have force-reload to reload, not restart. + * debian/cupsys.logrotate: Use force-reload instead of reload, since the + latter is not required to exist by Debian Policy. + * debian/rules: Ship browsing_status and enable_browsing. + * debian/patches/20_httpGetHostname_crash.dpatch: Add some robustifications + to httpGetHostname() to hopefully fix a reported crash. + + -- Kenshi Muto Sun, 16 Apr 2006 17:49:57 +0900 + +cupsys (1.1.99.b1.r4885-1) experimental; urgency=low + + [ Kenshi Muto ] + * New SVN release taken from rr4885. + * Updated Russian debconf translation, taken from cupsys trunk. + * Downgrade port and browse question to low. + * Add timeout routine to avoid lockup. + * debian/patches/08_cupsd.conf.conf.d.dpatch: + - Commented out Port/Listen/Browsing from cupsd.conf.in. + CUPS crashes when there is a duplicate definition. + * Updated Swedish debconf translation. + * Set seen false flag when ports configuration is failed. + * Allow '*' for hostname in ports.conf. + * Use /bin/echo instead of shell built-in echo. + * Improve cupsys.templates. + * Updated Russian, German, Czech,French, Vietnamese debconf translation. + * Removed example descriptions from init.d script. + * Fix IPv4 validation. + + [ Martin Pitt ] + * Adapt debian/patches/02_configure.dpatch to r4885. + * Move forcefully killing of cupsd if start-stop-daemon fails from + postinst to init script, where it belongs to. Do not kill all running + cupsd processes, but only the one in the pid file; this will unbreak cupsd + behaviour in chroots. + * debian/cupsys.default: Remove obsolete FORCE_RESTART option. + * Resurrect debian/patches/01_cupsimage.dpatch (formerly + 03_cupsimage.dpatch), as we get unresolved symbols if libcupsimage + isn't properly linked to libcupsys, causing other packages to FTBFS. + Thanks to Adam Conrad. + * debian/cupsys.init.d: Add --oknodo to not fail if cupsd is already + running. + * debian/rules: In clean rule, clean up a lot of files that are left behind + by 'make clean'. + + -- Kenshi Muto Fri, 23 Dec 2005 06:33:05 +0000 + +cupsys (1.1.99.b1.r4876-1) unstable; urgency=low + + [ Martin Pitt ] + * debian/local/{enable_browsing,browsing_status}: Adapt configuration file + locations to new conf.d structure. + * debian/cupsys.templates: Fix default value for cupsys/browse: 'yes' is an + invalid bool option, change to true. + * debian/cupsys.init.d: Use LSB init functions. Add lsb-base package + dependency. + * debian/cupsys.postinst: Wait a second between kill -9'ing cupsys and + checking if the process still exists to avoid false positives and upgrade + failures. + * Clean up support for /etc/cups/conf.d: + - Add debian/patches/08_cupsd.conf.conf.d.dpatch: Add include commands to + default cupsd.conf file. + - debian/cupsys.postinst: Remove fiddling with cupsd.conf. + - This will ensure that cupsd.conf will remain an unchanged conffile. + * debian/rules: Remove empty debian/patched on clean. + * debian/patches/10_cupsd.conf2.dpatch: Re-enable listening to localhost to + make the web interface work. + * debian/patches/44_fixconfdirperms.dpatch: + - Put configuration files into group root instead of nobody to avoid + privilege escalation of nobody/nogroup and comply to Debian standards. + - Use CUPS_DEFAULT_GROUP instead of 'nobody' as the default group for + setgid'ing to and conffiles which must be writable for cupsd. + - Disable changing permissions of cupsd.conf conffile. + * Add debian/patches/09_runasuser_fixes.dpatch: + - scheduler/main.c: Generate a certificate even when running as user, just + as in 1.1.x; this unbreaks local certificate authorization for cupsd + when it runs as normal user. + - scheduler/main.c: When running as non-root, call initgroups() instead of + setgroups() to allow auxiliary groups. These are required to access + different device types (lp for USB/parallel printers, dialout for serial + printers, etc.) + + [ Kenshi Muto ] + * New SVN release taken from r4876. + + -- Kenshi Muto Thu, 8 Dec 2005 21:26:22 +0900 + +cupsys (1.1.99.b1.r4841-1) experimental; urgency=low + + * EXPERIMENTAL + * New SVN release taken from r4841. + * Remove -pie and -fpie from compiler option. pie option causes + a problem with Debian binutils. + I hope this change avoids FTBFS on sparc and others. (closes: #339120) + + -- Kenshi Muto Wed, 16 Nov 2005 12:27:27 +0000 + +cupsys (1.1.99.b1.r4748-4) experimental; urgency=low + + * EXPERIMENTAL + * 00_r4835.dpatch: Taken from r4835. + Well, r4835 removes some files. It means dpkg-buildpackage always + fails when we rebuild source. Maybe it's time to change orig source. + Moved obsolete patches to patches/obsolete. + * 48_stdlib.dpatch: Fix FTBFS for arm, mips, and mipsel. + * 03_manext.dpatch: Don't use upstream's manpage file handling. + Debian uses dh_installman. + * 04_freebsd.dpatch: Apply Brian's patch to support GNU/kFreeBSD + (closes: #338266) + * Install lppasswd as owner 'lp'. + + -- Kenshi Muto Fri, 4 Nov 2005 13:56:27 +0000 + +cupsys (1.1.99.b1.r4748-3) experimental; urgency=low + + * EXPERIMENTAL + * 47_pid.dpatch: Modified to allow to configure location of pid file. + (closes: #337093) + You can change this location by PidFile directive at your cupsd.conf. + * Remove example comments from init script. (closes: #334842) + + -- Kenshi Muto Thu, 3 Nov 2005 11:39:07 +0000 + +cupsys (1.1.99.b1.r4748-2) experimental; urgency=medium + + * EXPERIMENTAL + * 02_configure.dpatch: Modified to remove -pie/-fpie if arch = x86_64. + (closes: #335199) + + -- Kenshi Muto Mon, 24 Oct 2005 11:42:59 +0000 + +cupsys (1.1.99.b1.r4748-1) experimental; urgency=low + + * EXPERIMENTAL + * CUPS 1.2 snapshot (r4748) from SVN. + + -- Kenshi Muto Wed, 5 Oct 2005 12:54:27 +0000 + +cupsys (1.1.23-15) unstable; urgency=high + + [Kenshi Muto] + * Allow '*' for hostname in ports.conf. (closes: #340975) + * Fix IPv4 address validation. + * Use /bin/echo instead of shell built-in echo. (closes: #343566) + * Improve cupsys.templates. (closes: #343498) + * Updated Swedish debconf translation. + * Updated Russian debconf translation. + * Updated German debconf translation. + * Updated Czech debconf translation. (closes: #343716) + * Updated French debconf translation. (closes: #344116) + * Updated Vietnamese debconf translation. + * Removed example descriptions from init.d script. (closes: #334842) + * Apply kFreeBSD patch. (closes: 338266) + + -- Kenshi Muto Fri, 16 Dec 2005 21:05:47 +0900 + +cupsys (1.1.23-14) unstable; urgency=high + + [Kenshi Muto] + * Downgrade port and browse question to low. (closes: #343341) + * debian/patches/08_cupsd.conf.conf.d.dpatch: + - Commented out Port/Listen/Browsing in cupsd.conf.in because + CUPS crashes when there is a duplicate definition! + (closes: #343251, #343279, ##343285, #343292) + * Added NEWS to explain how to fix this for 1.1.23-13 users: + Tweaking cupsd.conf via postinst is a bad idea, so I gave up + trying to correct this automatically. Instead, comment out the + Port/Listen/Browsing lines in /etc/cups/cupsd.conf if you had + already replaced this file by the one from 1.1.23-13. + * Updated Swedish debconf translation. (closes: #343397) + * Set seen false flag when ports configuration is failed. + (closes: #343400) + + [Martin-Éric Racine] + * Added debian/watch file. + + -- Kenshi Muto Thu, 15 Dec 2005 06:00:09 +0900 + +cupsys (1.1.23-13) unstable; urgency=high + + * 38_pdftopscan.dpatch: Apply CAN-2005-0064, CAN-2004-0888, + and CAN-2005-2097 patches. (closes: #324459, #324460, #324464) + Because Debian cupsys uses xpdf wrapper instead of forked pdftops, + so users aren't affected these security problems. + This patch is just for users who want to create own pdftops from + source. + * Move Port/Listen and Browsing configurations from /etc/cups/ + cupsd.conf to /etc/cups/cups.d/. + + /etc/cups/cups.d/ports.conf: Port/Listen configuration. + /etc/cups/cups.d/browse.conf: Browsing configuration + + You can configure these values by using "dpkg-reconfigure cupsys". + (closes: #235906, #297695, #178838, #288838) + + * Added Swedish debconf translation (closes: #338545). Thanks Daniel. + * Updated Russian debconf translation (closes: #340626). Thanks Yuri. + + * Applied xpdf patch to fix buffer overflows [pdftops/Stream.cxx, + pdftops/Stream.h, CAN-2005-3191, CAN-2005-3192, + 48_security_CAN-2005-3191.dpatch] + Because Debian cupsys uses xpdf wrapper instead of forked pdftops, + so users aren't affected these security problems. + This patch is just for users who want to create own pdftops from + source. + + -- Kenshi Muto Mon, 22 Aug 2005 18:50:26 +0900 + +cupsys (1.1.23-12) unstable; urgency=medium + + * foomatic-rip may be treated as recommended tool. + Modified control file. (closes: #320196) + * Add debconf-2.0 as debconf alternative. + * Migrated to libgnutls12. (closes: #322087) + libcupsys2 backed as real library. libcupsys2-gnutls10 became + transitional package. (closes: #322018) + * Add procps to Depends: of cupsys. ps command is used by + cupsys.postinst. + * 47_pid.dpatch: Added a patch to make forked PID file. + Now init script use this file instead of one created by + start-stop-daemon. + I hope this solves Samba starting bug. (closes: #315017) + * Back gs-esp to Depends:. (closes: #312244) + PostScript printer owners may claim this, but currently + we Debian CUPS Maintainers team have massive complains about + missing gs-esp dependency. It's current best workaround to + avoid such printing problems. + + -- Kenshi Muto Thu, 28 Jul 2005 11:35:27 +0900 + +cupsys (1.1.23-11) unstable; urgency=low + + * "At Debconf 5" release. + * Now CUPS is maintained by Debian CUPS Maintainers Team. + + * Do "sleep 2" to wait daemon's wake up. (this is just workaround... + needs better solution, for #309794 and #315017) + * Added Vietnamese translation. (closes: #310152) + * Check whether daemon is running or not before restart in logrotate. + (closes: #310535) + * Add description about foomatic-rip (in foomatic-filters package) + to README.Debian. (closes: #309399) + * Remove unnecessary comment from debian/po/de.po (closes: #314135) + * Apply status option for init script (closes: #312683). Thanks Stephen. + * Suggests cupsys-driver-gutenprint, this package is new name of + cupsys-driver-gimpprint. + * 46_ppdsdat: Move /etc/cups/ppds.dat to /var/lib/cups/ppds.dat and + make symlink. (closes: #317905) + * Unapply NOAUTH handling from 33_jobauthorize. A user warns me + it's dangerous to use. + + -- Kenshi Muto Fri, 20 May 2005 11:07:42 +0900 + +cupsys (1.1.23-10) unstable; urgency=high + + * Recovered http backend. -8 and -9 missed it. (closes: #305169) + * Use absolete path for doc-root instead of relative path. + (closes: #305339) + + -- Kenshi Muto Tue, 19 Apr 2005 20:47:49 +0900 + +cupsys (1.1.23-9) unstable; urgency=medium + + * Remove unnecessary and toxic space in doc-base file. + (closes: #305084) + + -- Kenshi Muto Mon, 18 Apr 2005 08:08:03 +0900 + +cupsys (1.1.23-8) unstable; urgency=medium + + * "Brush up for Sarge" release. + * Introduced dpatch for source management. + * Included Spanish man pages. + * 43_filtercost: Applied a patch for wrong computation of cost + (closes: #304205) + * Applied many part of ubuntu patch, http://people.ubuntu.com/~scott/patches/cupsys/cupsys_1.1.23-7ubuntu1.patch. + (User 'cupsys' feature and Browsing feature aren't applied at this time. + They are post-Sarge things) + * Applied improved dvifilter patch. (Although you need to modify + /etc/cups/mime.convs and some other files to use it) (closes: #198100) + * Provides /var/run/cups/cupsd.pid. (closes: #301804) + * Added cupsys documentation to doc-base structure. (closes: #171396, #304333) + * Included filter for PostScript from Windows PostScript driver, created by + Matt Swift . + If you want to use, put /usr/share/doc/cupsys/examples/filters/samba-postscript.* to /etc/cups, + and put /usr/share/doc/cupsys/examples/filters/samba-ps-to-ps to /usr/lib/cups/filter. (closes: #246577) + + -- Kenshi Muto Wed, 16 Mar 2005 10:01:57 +0900 + +cupsys (1.1.23-7) unstable; urgency=low + + * Drop /etc/cups/printers.conf and /etc/cups/classes.conf from + configuration files. (closes: #298103) + Migration will be done automatically. + * Add /etc/default/cupsys. You can change force stop behavior by + changing FORCE_RESTART in this file. (closes: #298040) + * Add hplip to Suggests:. (closes: #297776) + + -- Kenshi Muto Sat, 5 Mar 2005 12:27:32 +0900 + +cupsys (1.1.23-6) unstable; urgency=medium + + * Fix missing adduser dependency in cupsys-client. (closes: #296849) + * Apply parallel backend improvement patch. + - don't receive signal during writing (closes: #296222) + - fix 64bit problem (closes: #296223) + + -- Kenshi Muto Sat, 26 Feb 2005 08:07:39 +0000 + +cupsys (1.1.23-5) unstable; urgency=low + + * Improve postinst message (closes: #295642). Thanks Adam. + + -- Kenshi Muto Fri, 18 Feb 2005 21:23:10 +0900 + +cupsys (1.1.23-4) unstable; urgency=low + + * 20defaultport.patch is merged in upstream source. + * ARGH, libcupsys2-dev should conflict/replace against <<1.1.22-3. + Fix control file. (closes: #292879) + * Remove obsolete README_fr.txt. (closes: #293274) + + -- Kenshi Muto Sun, 30 Jan 2005 08:35:17 +0900 + +cupsys (1.1.23-3) unstable; urgency=low + + * Remove $Id$ from config file: 07cvsremovetag.patch (closes: #291629) + * Fix 'lppasswd does not work with nonexisting passwd file' by mpitt's patch: + 41lppasswdnoexistingconf.patch (closes: 290011) + + -- Kenshi Muto Sat, 22 Jan 2005 12:23:46 +0900 + +cupsys (1.1.23-2) unstable; urgency=medium + + * Move defvalue declaration to begin block for compile on + backports environment. Thanks Massimiliano. + * Fix Cyclades serial port name: 40cycladeserial.patch (closes: #270375) + * Upgrade shlibs of libcupsys2-gnutls10. cupsys-client needs newest + libcupsys2-gnutls10 (closes: #289930, #289939). + + -- Kenshi Muto Mon, 10 Jan 2005 13:48:32 +0900 + +cupsys (1.1.23-1) unstable; urgency=low + + * New upstream release + * lprng disabled ipp feature since 3.8.26-1. Remove conflicts: lprng + of cupsys. (closes: #288531) + + -- Kenshi Muto Tue, 4 Jan 2005 19:32:16 +0900 + +cupsys (1.1.22-8) unstable; urgency=high + + * Fix another security vulnerability since 1.1.21. Sigh... + (closes: #287835) + + -- Kenshi Muto Fri, 31 Dec 2004 13:16:54 +0900 + +cupsys (1.1.22-7) unstable; urgency=medium + + * Use Depends: xpdf-utils instead of Recommends:. + This is RC fix (closes: #287921) + + -- Kenshi Muto Fri, 31 Dec 2004 08:37:54 +0900 + +cupsys (1.1.22-6) unstable; urgency=high + + * Replaced upstream pdftops (derived from Xpdf) with pdftops.pl wrapper. + pdftops.pl is made by Helge Blischke, GNU GPL licensed. + + CUPS 1.1.22 should enter to Sarge ASAP by some security reasons, + but upstream pdftops prevents to enter because it has libgcc_s.so + dependency and current gcc 3.4 faces difficult 'unwind' problem. + Now I believe cupsys 1.1.22-6 can enter soon without waiting + gcc problem. + + If you want to print PDF files directly, you need to install + xpdf-utils. pdftops.pl calls pdftops in xpdf-utils package. + * Fix typo in control file. + + -- Kenshi Muto Wed, 29 Dec 2004 14:59:28 +0000 + +cupsys (1.1.22-5) unstable; urgency=high + + * Apply upstream CVS patch (00cvs20041229.patch) + This includes fix of buffer overflow possibility in scheduler. + + -- Kenshi Muto Wed, 29 Dec 2004 21:35:51 +0900 + +cupsys (1.1.22-4) unstable; urgency=high + + * Add Replaces migration for libcupsys2-dev. + It solves 'libcupsys2-dev overwrite a file in cupsys' problem. + (closes: #287609) + + -- Kenshi Muto Wed, 29 Dec 2004 02:43:09 +0000 + +cupsys (1.1.22-3) unstable; urgency=medium + + * Remove unwanted ldflag: Back 02configure.patch (closes: #286450) + * Move fr/cups-config.1 to libcupsys2-dev (closes: #286449) + Thanks for your above two bug reports, Henrique. + * Note: [CAN-2004-1125] "xpdf buffer overflows" is already fixed in + previous Debian revision (1.1.22-2) with upstream patch. + + -- Kenshi Muto Sat, 25 Dec 2004 23:40:15 +0900 + +cupsys (1.1.22-2) unstable; urgency=medium + + * Apply security fix patches from 1.1.23rc1. + * Revert logrotate to use 'reload'. (closes: #271872) + + -- Kenshi Muto Sun, 19 Dec 2004 17:43:10 +0900 + +cupsys (1.1.22-1) unstable; urgency=low + + * New upstream release for unstable. Time is over, sarge isn't shipped. + I checked 1.1.21 to 1.1.22 migration doesn't break ABI quickly, + but I'm still scared... + * Apply gcc-4.0 patch for amd64: 37gfxfont.patch (closes: #285601) + * Do 'restart' instead of 'reload' when log is rotated. + 'reload' sometime causes just shutdown daemon. (Unknown problem) + * Fix equation in cupsys.postscript. (closes: #285205) + * Apply Russell's patch: 38httpwait.patch (closes: #284829) + (This is trial. If there is any grave problem by this, I'll off this + patch) + - Made http_wait() handle EINTR. This bug was causing cups + to print multiple copies of reports on remote printers. + - Lengthed the wait in ipp_http_read to handle connections + running over the internet. The short wait was causing + unwated multiple copies of reports to be printed. + - While both these bugs need to be fixed, neither completely + solves the original multiple copies problem. To solve + that no data should be printed if there was a read error. + * Add dependency version of smbclient. (closes: #284733) + * Fix SIGSEGV when remote destination goes timeout: 39remotetimeout.patch + (closes: #283500) + + -- Kenshi Muto Wed, 15 Dec 2004 18:58:55 +0900 + +cupsys (1.1.22-0.experimental4) experimental; urgency=low + + * "I'm tired waiting Sarge forever" release. + I'm considering to upload 1.1.22 to unstable. + * I forgot to copy files from unstable version... FTBFS is solved. + (closes: #284574) + * Downgrade gs-esp dependency to Recommends. + I'm bore with attacks from stingy people. + + -- Kenshi Muto Tue, 7 Dec 2004 21:39:55 +0900 + +cupsys (1.1.22-0.experimental3) experimental; urgency=low + + * Rebuild with -sa. + + -- Kenshi Muto Tue, 7 Dec 2004 00:52:15 +0900 + +cupsys (1.1.22-0.experimental2) experimental; urgency=low + + * New upstream release + + -- Kenshi Muto Mon, 6 Dec 2004 23:10:18 +0900 + +cupsys (1.1.21-0.experimental2) experimental; urgency=low + + * Fix typo in templates and unfuzzied po files. (closes: Bug#274851) + * Update German translation (closes: Bug#274828) + * Make pam.d/cupsys standard @include style (closes: Bug#265299) + * Set up group lpadmin in postinst instead of rules. + Because lpadmin isn't there on initial build environemnt + (closes: Bug#274985) + + -- Kenshi Muto Mon, 4 Oct 2004 23:09:51 +0900 + +cupsys (1.1.21-0.experimental1) experimental; urgency=low + + * Experimental. + * new upstream version. + + -- Kenshi Muto Sun, 3 Oct 2004 18:15:23 +0900 + +cupsys (1.1.20final+rc1-8) unstable; urgency=medium + + * Apply GNU Hurd configure patch for fix FTBFS. (closes: Bug#274599) + * Improve patch test routine. (closes: Bug#272952, Bug#274564) + + -- Kenshi Muto Sun, 3 Oct 2004 13:07:43 +0900 + +cupsys (1.1.20final+rc1-7) unstable; urgency=medium + + * Fix french debconf translation (closes: Bug#272520). + This update is important because previous version shows + illegal debconf choice in French. + + -- Kenshi Muto Tue, 21 Sep 2004 22:31:54 +0900 + +cupsys (1.1.20final+rc1-6) unstable; urgency=high + + * Applied patch from Alvaro Martinez Echevarria to fix + daniel of service [scheduler/dirsvc.c, CAN-2004-0558] + * Apply GNU/Hurd patch (closes: Bug#263526) + * Update pt_PR debconf translation (closes: Bug#264096) + * Remove directory before making symlink (closes: Bug#270741) + + -- Kenshi Muto Tue, 24 Aug 2004 10:31:32 +0900 + +cupsys (1.1.20final+rc1-5) unstable; urgency=low + + * Apply anonymous patch for /jobs. This patch avoids many + client-error-forbidden. (closes: Bug#184361) + cupsd.conf will be automatically modified to use basic user + authentication (Add AuthType Basic + AuthType User). + + -- Kenshi Muto Wed, 4 Aug 2004 09:13:02 +0900 + +cupsys (1.1.20final+rc1-4) unstable; urgency=medium + + * Wait 10 seconds after reload for samba restart problem. + (closes: Bug#260969) + * Update Czech debconf translation (closes: Bug#260862) + * Built against libtiff4. + * Build against libgnutls11. (Though package name is still + libcupsys2-gnutls10) + + -- Kenshi Muto Mon, 26 Jul 2004 22:12:18 +0900 + +cupsys (1.1.20final+rc1-3) unstable; urgency=high + + * Change guess order of USB device name for FHS compliant. + (closes: Bug#259965) + + -- Kenshi Muto Sun, 18 Jul 2004 04:54:58 +0900 + +cupsys (1.1.20final+rc1-2) unstable; urgency=medium + + * Replace set-as-default icon of Japanese. Thanks Tomo-p. + * Provides libcupsys2 dummy package for smooth transition. (closes: #259378) + + -- Kenshi Muto Wed, 14 Jul 2004 19:10:43 +0900 + +cupsys (1.1.20final+rc1-1) unstable; urgency=low + + * Apply a patch for fixing typo in DE templates. (Closes: Bug#250883) + * New upstream source, 2004-07-03 CVS. + * Add netbase dependency for cupsys-bsd. + * Move certs files to /var/lib/cups/certs. (Closes: Bug#254153) + + -- Kenshi Muto Wed, 26 May 2004 08:46:35 +0900 + +cupsys (1.1.20final+cvs20040330-4) unstable; urgency=medium + + * Now libgnutls10 migration starts at 'unstable'/'testing'. + Packages depending libcupsys2 should be rebuit with newer + libcupsys2-dev. + * Fix log rotation problem by adding 'sharedscripts' to + /etc/logrotate.d/cupsys. (Closes: Bug#249023) + + -- Kenshi Muto Tue, 25 May 2004 08:14:44 +0900 + +cupsys (1.1.20final+cvs20040330-3experimental2) experimental; urgency=medium + + * Rename libcupsys2 to libcupsys2-gnutls10. + This package doesn't 'Provides: libcupsys2' to migrate libgnutls10. + Sebastien Bacher plans cups/libgnutls10 migration. + * Add notes about backend configuration to README.Debian. + * Fix (I hope) log rotation problem by adding sharedscripts to + /etc/logrotate.d/cupsys. (Closes: Bug#249024) + + -- Kenshi Muto Sat, 15 May 2004 11:17:16 +0900 + +cupsys (1.1.20final+cvs20040330-3) unstable; urgency=low + + * Remove EXPORT_SSLLIBS variable from cups-config (Closes: Bug#246102). + -lgnutls isn't necessary by software using libcups. + * Apply PJL detection patch from upstream. + * Translations + - Updated Turkish debconf messages (Closes: Bug#246075). Thanks + Recai and Gurkan. + + -- Kenshi Muto Wed, 28 Apr 2004 00:23:59 +0900 + +cupsys (1.1.20final+cvs20040330-2) unstable; urgency=low + + * Fix typo in HOWTO_BUGREPORT.txt. + * Translations + - Update Dutch debconf messages (Closes: Bug#242260). Thanks Tim. + + -- Kenshi Muto Tue, 6 Apr 2004 19:16:48 +0900 + +cupsys (1.1.20final+cvs20040330-1) unstable; urgency=low + + * New upstream CVS + * Revert pstops to old 1.1.20. (Closes: Bug#240792) + * Translations + - Updated Danish debconf messages. + + -- Kenshi Muto Fri, 26 Mar 2004 19:00:01 +0900 + +cupsys (1.1.20final+cvs20040317-4) unstable; urgency=low + + * Chagnge backend question priority to low. (Closes: Bug#238847) + When you use PPC, parallel backend will be removed from default choice + automatically. + If you want to use parallel (and you know what you will do), + please run 'dpkg-reconfigure cupsys'. + * Translations + - Updated Danish debconf messages (Closes: Bug#239256). Thanks Claus. + - Updated French debconf messages (Closes: Bug#239756). Thanks Christian. + + -- Kenshi Muto Wed, 24 Mar 2004 22:30:28 +0900 + +cupsys (1.1.20final+cvs20040317-3) unstable; urgency=low + + * Remove sysvinit. This package is essential. Thanks Thomas. + * Now choice menu is translatable (Closes: Bug#238821). + * Updated French debconf messages. Thanks Christian. + * Add socket to default choice. I think this backend doesn't + cause hang up anywhere. + + -- Kenshi Muto Fri, 19 Mar 2004 17:16:48 +0900 + +cupsys (1.1.20final+cvs20040317-2) unstable; urgency=medium + + * Add sysvinit in dependency. (Closes: Bug#238763) + * Updated Brazilian Portuguese debconf messages. Thanks Andre. + * Fix printers.cgi crash (Closes: Bug#238800) + * Updated Japanese templates & images. + + -- Kenshi Muto Fri, 19 Mar 2004 09:00:04 +0900 + +cupsys (1.1.20final+cvs20040317-1) unstable; urgency=low + + * New CVS release. + * Add asking about backend program. This is not best way to solve + PPC crash / i386 serial hang-up, but at least user can choose what + he/she want to use. serial backend becomes 'not use' by default. + Add notice about 'parallel of PPC may cause a problem'. + (closes: Bug#237613, Bug#233529, Bug#211677, Bug#224760) + * Updated Spanish debconf messages (closes: Bug#236470). Thanks Carlos. + * Updated Danish debconf messages. Thanks Claus. + * Updated French debconf messages. Thanks Christian. + * Updated Czech debconf messages. Thanks Miroslav. + + -- Kenshi Muto Sat, 6 Mar 2004 21:36:35 +0900 + +cupsys (1.1.20final-16) unstable; urgency=low + + * Improved init.d/cupsys message (closes: Bug#235693). Thanks Lee. + * Add Czech debconf messages (closes: Bug#236276). Thanks Miroslav. + + -- Kenshi Muto Tue, 2 Mar 2004 09:13:07 +0900 + +cupsys (1.1.20final-15) unstable; urgency=low + + * Add conflicts lprng for avoid conflicting ipp support. + * Add Danish debconf messages (closes: Bug#233067). Thanks Claus. + * Apply current CVS patch. + + -- Kenshi Muto Sat, 14 Feb 2004 18:10:54 +0900 + +cupsys (1.1.20final-14) unstable; urgency=medium + + * Apply loop avoid patch. (closes: Bug#231676) Thanks Ray. + + -- Kenshi Muto Wed, 11 Feb 2004 14:59:46 +0900 + +cupsys (1.1.20final-13) unstable; urgency=medium + + * Use pidof instead of start-stop-daemon for stopping cupsys. + I hope this will fix Bug#228967. + + -- Kenshi Muto Thu, 22 Jan 2004 09:12:25 +0900 + +cupsys (1.1.20final-12) unstable; urgency=low + + * Fix incorrect root detection routine (closes: Bug#227733). THanks David. + * Continue to install whether deluser is failed (for NIS/LDAP). + * 22ipprewrite.patch has critical bug. Fixed by better patch. + (closes: Bug#162613) + + -- Kenshi Muto Sat, 17 Jan 2004 12:57:47 +0900 + +cupsys (1.1.20final-11) unstable; urgency=low + + * Improved cupsys stop check. + * Apply username patch for Solaris lpd printing (closes: Bug#228078). Thanks + Lionel. + + -- Kenshi Muto Sat, 17 Jan 2004 12:28:15 +0900 + +cupsys (1.1.20final-10) unstable; urgency=low + + * Apply Brazilian Portuguese debconf message (closes: Bug#227445). Thanks + Andre. + * Show verbose message when cups won't stop. + + -- Kenshi Muto Wed, 14 Jan 2004 08:38:55 +0900 + +cupsys (1.1.20final-9) unstable; urgency=low + + * Apply patch for avoid infinite loop (closes: Bug#225625). + * Apply patch for http password authenticaion cache (closes: Bug#227143). + + -- Kenshi Muto Mon, 12 Jan 2004 12:00:17 +0900 + +cupsys (1.1.20final-8) unstable; urgency=low + + * Fix typo in lpadmin.8.gz (one of Bug#226149). Thanks Dan. + * Unfortunately, I heard cupsys won't stop when upgrading. + I implemented Force-stop routine into postinst (closes: Bug#222464, + Bug#226140). + + -- Kenshi Muto Mon, 5 Jan 2004 21:11:30 +0900 + +cupsys (1.1.20final-7) unstable; urgency=low + + * Argh, I forgot to apply default port patch. + + -- Kenshi Muto Tue, 30 Dec 2003 23:01:29 +0900 + +cupsys (1.1.20final-6) unstable; urgency=low + + * Apply Dutch debconf translation (closes: Bug#225410). Thanks Tim. + * Set default port when any Port/Listen isn't defined (closes: Bug#225208). + + -- Kenshi Muto Tue, 30 Dec 2003 08:57:10 +0900 + +cupsys (1.1.20final-5) unstable; urgency=low + + * Add pdftops.conf into /etc/cups/. This file is symlink to + /etc/xpdf/xpdfrc, and configuration for pdftops tool. + + -- Kenshi Muto Sun, 21 Dec 2003 11:45:38 +0900 + +cupsys (1.1.20final-4) unstable; urgency=low + + * Fix cups* commands don't work (closes: Bug#224585). Thanks Rainer. + + -- Kenshi Muto Sat, 20 Dec 2003 20:52:24 +0900 + +cupsys (1.1.20final-3) unstable; urgency=low + + * Apply patch into lpd.c for true compatible with RFC1179 + (closes: Bug#223432). Thanks Lionel. + * Hmm, PJL patch causes a problem. Since I don't have any PJL + printers, I simply unapply PJL patch and reopen Bug#220611 (closes: + Bug#223748) + + -- Kenshi Muto Fri, 12 Dec 2003 18:32:58 +0900 + +cupsys (1.1.20final-2) unstable; urgency=low + + * Apply PJL patch (closes: Bug#220611). Thanks Zed. + + -- Kenshi Muto Sat, 6 Dec 2003 10:42:37 +0900 + +cupsys (1.1.20final-1) unstable; urgency=low + + * New upstream release + * cupsys set UTF-8 as defaultCharset, but it causes some browsing + problem, and looks don't need indeed. I changed defaultCharset to + invalid value. It will fix French screen (closes: Bug#221904). + * Fix dependency with libgnutls7 by dirty trick. + I hope libgnutls7 maintainer will fix Bug#221309. + + -- Kenshi Muto Tue, 25 Nov 2003 19:17:57 +0900 + +cupsys (1.1.20candidate6-6) unstable; urgency=low + + * Set fixed version into Depends for cupsys, cupsys-client. + + -- Kenshi Muto Mon, 17 Nov 2003 21:35:55 +0900 + +cupsys (1.1.20candidate6-5) unstable; urgency=high + + * I'm sorry but openssl license conflicts. I use libgnutls (closes: Bug#220902). + * Add euc-jp text. + + -- Kenshi Muto Sat, 15 Nov 2003 23:55:06 +0900 + +cupsys (1.1.20candidate6-4) unstable; urgency=low + + * Add French translation (closes: Bug#220805). Thanks, Christian. + * openssl, popular SSL implementation, becomes Debian main, so I think + it is no reason for using libgnutls. I changed depends openssl instead of + libgnutls. + + -- Kenshi Muto Sat, 15 Nov 2003 10:24:38 +0900 + +cupsys (1.1.20candidate6-3) unstable; urgency=low + + * Remove -Wl from configure (closes: Bug#194353) + * Remove /etc/sups/raw.* when purged (closes: Bug#198126) + * Remove always Content-Type charset header. This is test (and ad-hoc) + case. I'll unapply if this patch causes a problem. + * Add Japanese resource. + + -- Kenshi Muto Thu, 13 Nov 2003 23:02:40 +0900 + +cupsys (1.1.20candidate6-2) unstable; urgency=medium + + * Fix FTBFS build error (closes: Bug#220534) + + -- Kenshi Muto Thu, 13 Nov 2003 15:52:00 +0900 + +cupsys (1.1.20candidate6-1) unstable; urgency=low + + * New upstream. + * Rename filter, backend man page (closes: Bug#220500). + + -- Kenshi Muto Wed, 12 Nov 2003 23:41:02 +0900 + +cupsys (1.1.19final-4) unstable; urgency=low + + * "Welcome patch" release. + * Transited packaging system to CDBS. + This release wll be final version for 1.1.19. I'll upload + 1.1.20candidate version at next time. + * libcupsimage2.so.2 links libcupsys.so.2. (closes: Bug#193618) + + -- Kenshi Muto Mon, 10 Nov 2003 10:01:58 +0900 + +cupsys (1.1.19final-3) unstable; urgency=low + + * Fix check routine of Printcap. (closes: Bug#200278) + * Removed "suggests qtcups". (closes: Bug#197267) + + -- Kenshi Muto Fri, 7 Nov 2003 21:43:39 +0900 + +cupsys (1.1.19final-2) unstable; urgency=low + + * lpadmin group included root user, but I didn't understand why it needs. + This may cause security problem, so I remove this process and + remove root from lpadmin group. (closes: Bug#214746) + * Support large file. (closes: Bug#215568) + * Support log rotation. (closes: Bug#200704) + * Force enable PAM (closes: Bug#183211, Bug#181512) + + -- Kenshi Muto Thu, 6 Nov 2003 18:31:02 +0900 + +cupsys (1.1.19final-1.5) unstable; urgency=low + + * New maintainer (acknowledged from Jeff Licquia). + Thanks Jeff! + * Changed templates.* to po-debconf style (closes: Bug#199236). + * Added Japanese debconf translation (closes: Bug#202273). + + -- Kenshi Muto Thu, 6 Nov 2003 09:50:29 +0900 + +cupsys (1.1.19final-1.4) unstable; urgency=low + + * Non-maintainer upload + * Removed '#include ' line from image.h from the version + in libcupsimage2-dev with debian/image.h.patch (Closes: #200427) + + -- Roland Stigge Thu, 4 Sep 2003 14:04:15 +0200 + +cupsys (1.1.19final-1.3) unstable; urgency=low + + * Non-maintainer upload + * cupsys Replaces: and Conflicts: cupsys-pstoraster (Closes: #206547) + NOTE: the Conflicts: was made versioned (<< 2) not to Conflict + with gs-esp which provides cupsys-pstoraster. + * Build-Depends: libpam0g-dev (new) instead of libpam-dev (removed from + archive) + + -- Roland Stigge Wed, 3 Sep 2003 19:33:09 +0200 + +cupsys (1.1.19final-1.2) unstable; urgency=low + + * NMU. + * Completely remove dependency on libgnutls5-dev. + + -- Robin Verduijn Wed, 27 Aug 2003 18:08:50 -0100 + +cupsys (1.1.19final-1.1) unstable; urgency=low + + * NMU. + * Built against libgnutls7-dev instead of (obsolete) libgnutls5-dev. + Closes: #203059. + + -- Robin Verduijn Tue, 26 Aug 2003 19:28:21 -0100 + +cupsys (1.1.19final-1) unstable; urgency=high + + * New upstream final release. DoS attack fixed; thus the urgency. + * Rebuilt with the latest libpng-dev, and fixed the explicit deps + in the control file. + * Removed rpath statment from output of cups-config --ldflags. + Closes: #194262. + + -- Jeff Licquia Thu, 29 May 2003 20:44:48 -0500 + +cupsys (1.1.19candidate4-1) unstable; urgency=low + + * New upstream release candidate. + * Includes upstream fix to the problem with 100% CPU consumption. + Closes: #189795. + * Added a dh_makeshlibs call for libcupsimage2. + * Made libcupsys2 conflict with cupsys-driver-gimpprint versions + built before the libcupsimage split. Closes: #189175. + * Move /etc/printcap.cups to /var/run/cups/printcap, since it's + generated and non-editable. Also, take care of the /etc/printcap + symlink. Closes: #187954. + * Per suggestion from the KDE project, suggest the kdeprint package + instead of the kdelibs3-cups package. + + -- Jeff Licquia Sat, 10 May 2003 13:05:33 -0500 + +cupsys (1.1.19candidate1-3) unstable; urgency=low + + * Make libcupsys2 conflict with gs-esp versions built before the + libcupsimage split. This is part of the fix for bug 189175. + * Add a dep on libgnutls-dev for libcupsys2-dev. Closes: #190877. + + -- Jeff Licquia Mon, 28 Apr 2003 10:57:03 -0500 + +cupsys (1.1.19candidate1-2) unstable; urgency=low + + * Set Replaces: on cupsys-client to cover the move of the + French man page for cupstestppd. Closes: #189737, #190042. + * Add cupsys-pt and xpp to Suggests for cupsys-client. + Closes: #168399, #170929. + * Added some more example filters: mailto and pstopdf. + Closes: #152001. + * Pass --system to addgroup when adding the lpadmin group. + Closes: #189835. + * Set section for the -dev packages to "libdevel". + * Fix shlibs files for libcupsys2 and libcupsimage2 to reference + the right package versions. Closes: #174391. + + -- Jeff Licquia Tue, 22 Apr 2003 14:27:43 -0500 + +cupsys (1.1.19candidate1-1) unstable; urgency=low + + * New upstream version. I will try to follow upstream's new + release policy by uploading release candidate versions to + unstable. + * Wrote a new GNU TLS patch, which was accepted by upstream. + Re-enable SSL support based on this. + * Based on recent upstream work, wrote a libpaper patch which has + also been accepted upstream. Closes: #60035, #88597, #101591. + * Upstream fix included to allow SLP-only browsing support to work. + Closes: #178380. + * Updated the Spanish debconf template for cupsys-bsd. + Closes: #167171. + * Added cupstestppd to cupsys-client. Closes: #176941. + * Don't respect TMPDIR if we don't have write permissions to that + directory. Closes: #176725. + + -- Jeff Licquia Sat, 12 Apr 2003 14:36:20 -0500 + +cupsys (1.1.18-3) unstable; urgency=low + + * Split libcupsimage into its own package. Closes: #187897. + * Added versioned build-dep on debhelper >= 2. + + -- Jeff Licquia Tue, 8 Apr 2003 02:59:57 -0500 + +cupsys (1.1.18-2) unstable; urgency=high + + * Disable SSL again. Inexplicably, the GNU TLS people put the + OpenSSL compatibility layer under the GPL, not the LGPL. + This forces the effective license on libcupsys2 to GPL, which + I'm not comfortable with. The urgency reflects possible + license conflicts for apps that link to libcupsys2. + Closes: #168056. + * Add a debconf question to ask whether unrecognized + application/octet-stream jobs should be printed as raw jobs. + * Forward-port some of the security fixes from woody. + * Set the default group for lppasswd to "lpadmin", in keeping + with the default in cupsd. Closes: #172842. + * Replaced the conflict with manpages-fr, versioned this time + to allow for easy upgrades. Also added a Replaces entry for + it. + + -- Jeff Licquia Sun, 5 Jan 2003 23:36:50 -0500 + +cupsys (1.1.18-1) unstable; urgency=high + + * New upstream version. This is a security update for problems that + include remote root exploits - thus the urgency. + * Remove the conflict with manpages-fr per reports that the offending + files are now all gone. Closes: #158500. + + -- Jeff Licquia Fri, 20 Dec 2002 03:27:18 -0500 + +cupsys (1.1.16-4) unstable; urgency=low + + * Documentation updates. + * Change the GNU TLS patch to more explicitly control which SSL + library is linked to, and support switching SSL libraries in + the build. By default, the package will not use OpenSSL, so + autobuilders won't accidentally build it that way. + Closes: #167489. + * Add libgnutls-dev to the Dependencies for libcupsys2-dev. + * Set the proper permissions on cupsys-client man pages. + + -- Jeff Licquia Sat, 9 Nov 2002 16:39:54 -0500 + +cupsys (1.1.16-3) unstable; urgency=low + + * Totally nuke all script modifications for dh_installinit; do it + all manually instead. Closes: #166878. + + -- Jeff Licquia Tue, 29 Oct 2002 23:06:20 -0500 + +cupsys (1.1.16-2) unstable; urgency=low + + * Add libpam-dev to Build-Depends. Closes: #166556. + * Update clean target in debian/rules to clean a few more files + that are missed by the Makefiles. + * Remove SFont.cxx and T1Font.cxx from the pdftops Makefile; + these two files aren't needed, and including them would pull + in a build dep on xlibs-dev, which is bad news. Closes: #166716. + * Tell dh_installdocs to not mess with the postinst/prerm, so + the compatibility symlinks aren't created. + + -- Jeff Licquia Tue, 29 Oct 2002 00:45:38 -0500 + +cupsys (1.1.16-1) unstable; urgency=low + + * New upstream version... Closes: #165631. + * ...which includes bugfixes to several BSD utilities to avoid + segfaulting when certain options are misused. Closes: #159597. + * Add upstream patch to scheduler that fixes certain printer + operations in the web interface. + * Re-enabled SSL support using the OpenSSL compatibility library + in libgnutls. Closes: #150600. + * Use our own logic for stopping/restarting cupsd on upgrade, + instead of relying on dh_installinit. Closes: #160345, #164435. + * Make cupsys-client Recommend cupsys-bsd. Closes: #157974. + * Make sure we remove everything in /var/spool/cups on purge. + Closes: #163571. + * Make force-reload send SIGHUP, since policy prefers that mode + of operation. + * Add dependencies for libcupsys2-dev on the image libraries we + need. Closes: #166451. + + -- Jeff Licquia Sat, 26 Oct 2002 19:37:56 -0500 + +cupsys (1.1.15-4) unstable; urgency=low + + * Fix segfault in lp when passing "-q" by itself as the last + option. Closes: #150819. + * Make the switch to libpng3, now that woody is out. + Closes: #156622. + * It seemed that the rastertoepson filter occasionally lost its + cookies under certain circumstances and passed NULL for a field. + Cancel the pending job if that happens. Closes: #147119. + * Remove .cvsignore files. + * Turned browsing back on by default. With no BrowseAddresses set, + no broadcast packets will go out, but cupsd will recognize and + accept incoming packets. Closes: #155574. + + -- Jeff Licquia Tue, 20 Aug 2002 15:51:45 -0500 + +cupsys (1.1.15-3) unstable; urgency=low + + * Reorganized the French man pages so they appear in the proper + packages. + * Declared a Conflict between cupsys-bsd and manpages-fr, as the + latter package includes man pages for lpr, lpq, and lprm. + * Move lpinfo and lpmove utilities to cupsys-client, where they + belong. + * Added patch from upstream that fixes some problems with + Orientation settings made by some PostScript generators. + Closes: #155534. + * Fixed compiler settings for the static and shared versions of + libcupsys2. + + -- Jeff Licquia Sun, 11 Aug 2002 02:45:02 -0500 + +cupsys (1.1.15-2) unstable; urgency=high + + * Removed SSL support again due to license infection problems. + Closes: #154792. + * Removed the preformatted French man pages. + + -- Jeff Licquia Mon, 29 Jul 2002 19:02:21 -0500 + +cupsys (1.1.15-1) unstable; urgency=low + + * New upstream version. + * Removed cupsys-pstoraster (since it's no longer provided in CUPS), + and rely on gs-esp instead for its functionality. + * Enabled SSL support and updated copyright file to reflect license + change. Closes: #150600. + * Applied patch from upstream that causes the cupsd foreground + process to wait until the daemon is ready before exiting. + Also, changed init script to wait on the daemon before continuing. + Closes: #150426. + * Moved /etc/cups/certs to /var/spool/cups/certs. Closes: #144887. + * Split out German and Portugese debconf templates into separate + files, and added French, Russian, and Spanish files. + Closes: #137630, #138068, #142904. + * Make cupsys Recommend smbclient, and handle symlinking smbspool + to /usr/lib/cups/backend/smb if it's available. Closes: #82690. + * Make cupsys Suggest foomatic-bin for cupsomatic, so that + linuxprinting.org PPDs work. Closes: #146655. + * Add examples/filters directory to cupsys and added the contributed + DVI filter to it. Users can copy the filter and config files into + place themselves to get the functionality. Closes: #55013, #136496. + * Fixed a bug where "-" filters are rejected in some cases. + + -- Jeff Licquia Mon, 29 Jul 2002 00:33:00 -0500 + +cupsys (1.1.14-3) unstable; urgency=low + + * Changed libpng dependency to "libpng2 | libpng" to accomodate the + current libpng policy. + * Changed adduser dep so that the proper adduser (that does root) is + available for the postinst. Closes: #133709. + * Removed spaces from init script output. Closes: #133262. + * Set TZ in init script to REALLY fix timezone problem. + Closes: #130676. + + -- Jeff Licquia Sat, 9 Mar 2002 23:48:41 -0500 + +cupsys (1.1.14-2) unstable; urgency=high + + * Remove all the stuff about setting the lpd backend setuid; per + upstream, we don't need it anymore, and it's a security hole. + + -- Jeff Licquia Sun, 17 Feb 2002 18:52:45 -0500 + +cupsys (1.1.14-1) unstable; urgency=high + + * New upstream version. + * Fixes more buffer overflows not covered in the previous patch; + thus the urgency. + + -- Jeff Licquia Wed, 13 Feb 2002 22:40:50 -0500 + +cupsys (1.1.13-2) unstable; urgency=high + + * Fix potentially exploitable buffer overflow in cups/ipp.c. + + -- Jeff Licquia Sat, 9 Feb 2002 21:27:41 -0500 + +cupsys (1.1.13-1) unstable; urgency=low + + * New upstream version. + * Silly me. fopen() returns NULL, not non-NULL, when it fails. :-) + Closes: #130532, #131433. + + -- Jeff Licquia Sat, 2 Feb 2002 16:10:20 -0500 + +cupsys (1.1.12-5) unstable; urgency=low + + * Fix man page references so, e.g., references go from backend(1) to + cups-backend(1). Closes: #126811. + * Oops! Debian has time_t->tm_gmtoff, which is defined to have the + opposite sign of timezone. Is it that way on BSD? Anyway, + reverse the sense of the sign for time_t->tm_gmtoff if we use + that. Closes: #126195. + * Add header for gs_malloc to pstoraster/gscrdp.c, to prevent + problems with implicit declaration on 64-bit systems. + Closes: #126002. + * cgi-bin/admin.c: Be a little bit more paranoid about one's ability + to write to tempfiles. Closes: #122324. + * Enabled OpenSLP support. + * Cleaned up Priorities and Sections. + + -- Jeff Licquia Sun, 20 Jan 2002 02:14:35 -0500 + +cupsys (1.1.12-4) unstable; urgency=low + + * Move cups-lpd man page to cupsys-bsd. Closes: #122311. + * Oops! Lost the patch to allow "cupsaccept", etc. commands. + Closes: #123280. + * Minor change to the init script output. Closes: #121938. + * Changed choose-uri.tmpl to be a little more clear. + Closes: #117376. + * Moved CUPS document root from /usr/share/doc/cupsys to + /usr/share/cups/doc-root, and created a symlink from + /u/s/d/cupsys/online-docs to it. It turns out that serving + files via CUPS from /usr/share/doc is a policy violation. + Closes: #120923. + * Fixed a small problem when upgrading from potato libcupsys1-dev + to current libcupsys2-dev. + + -- Jeff Licquia Mon, 17 Dec 2001 00:58:41 -0500 + +cupsys (1.1.12-3) unstable; urgency=low + + * Fix libcupsys2 shlibs file to provide the proper dependency + information. Closes: #121405. + * Oops! Make sure SSL support isn't built yet. + + -- Jeff Licquia Wed, 28 Nov 2001 11:41:17 -0500 + +cupsys (1.1.12-2) unstable; urgency=low + + * It helps to run autoconf after making a change to the configure + script. :-) CXX=$CC change wasn't propagated, making the build + fail on hppa. + + -- Jeff Licquia Mon, 26 Nov 2001 12:01:58 -0500 + +cupsys (1.1.12-1) unstable; urgency=low + + * New upstream version. Closes: #119162. + * Updated Standards-Version. + * Made cupsys depend on debconf. + * Removed -Wl,rpath from config-scripts/cups-sharedlibs.m4. + * Removed explicit libcupsys dep from cupsys. + * Removed "CXX=$CC" from config-scripts/cups-compiler.m4. + * Removed .SILENT from Makedefs so the build isn't silent anymore. + * On devfs, look in /dev/printers as well as /dev/parallel. + (Do we still need /dev/parallel?) Closes: #114063. + * Changed internal file: device URI type to test:, since (per + upstream) it's not intended for anything other than to test + filters. See bug #115252 or README.Debian for more info. + + -- Jeff Licquia Sun, 25 Nov 2001 11:21:32 -0500 + +cupsys (1.1.10-4) unstable; urgency=low + + * Switched cupsenable and cupsdisable symlinks to always point to + /usr/sbin/accept to prevent them from breaking when files move + around (as they did recently). Closes: #114006. + * It turns out that libcupsys needs to make temp files in + /var/spool/cups/tmp, so that dir needs to be in the package. + Closes: #115154. + * Related to the above, when creating temp files, don't loop when + the open fails unless the return value is EEXIST. Thanks to Brian + Ristuccia for the suggestion. + * Honor the DEB_BUILD_OPTTIONS "debug" setting. + * Per policy, make sure we build with -D_REENTRANT. + * Don't remove /var/spool/cups in the cupsys postrm when purging. + * Added German description to template. Closes: #113604. + * Added Portuguese description to cupsys-bsd template. + Closes: #106131. + + -- Jeff Licquia Thu, 18 Oct 2001 23:07:34 -0500 + +cupsys (1.1.10-3) unstable; urgency=low + + * Scale back a bit on aggressiveness on purging cupsys, as it can + cause us to remove the cupsys-client conffile. + * It turns out that client.conf is parsed by libcupsys2, not + cupsys-client, so it needs to switch packages. + * Changed PAM code so it attempts to open the "cupsys" PAM config + file, instead of the "cups" one. Not sure how this broke again. + Closes: #110651. + * Per request, implemented the "reload" option in the init script. + + -- Jeff Licquia Wed, 19 Sep 2001 21:53:48 -0500 + +cupsys (1.1.10-2) unstable; urgency=low + + * Added Conflicts: on cupsys-pstoraster with older cupsys packages + because of moved files. Closes: #106107. + * Fixed bug concerning update-inetd handling; it was removing the + inetd entry for the lpd server in cupsys-bsd with every upgrade. + Closes: #109298. + + -- Jeff Licquia Thu, 30 Aug 2001 23:14:08 -0500 + +cupsys (1.1.10-1) unstable; urgency=low + + * New upstream version - with Makefile oops fixed (1.1.10-1 + upstream). + * Fixed lpadmin group creation so NIS-style lpadmin group is + recognized. Closes: #78895, #107744. + * Replaced kups with kdelibs3-cups in Suggests: lines, and + reorganized Suggests line. Closes: #109695. + * Moved Suggests for all add-on clients to cupsys-client. + * Fixed purge so /etc/cups is completely cleaned out. + Closes: #108488. + * Moved filter and backend man pages to cups-filter and + cups-backend to avoid conflicts with other packages. + Closes: #107629. + * Made the lpd backend non-setuid, and created a low-priority + debconf question to handle the few who really need it setuid. + Closes: #77617. + * Altered cupsys-bsd postinst; always remove any inetd lines when + removing the package (we'll put it back later if we're just + upgrading). + + -- Jeff Licquia Tue, 28 Aug 2001 00:43:36 -0500 + +cupsys (1.1.9-1.1) unstable; urgency=low + + * NMU + * Fix gcc 3.0/hppa build problems. Closes: #104620, #105308. + + -- LaMont Jones Wed, 15 Aug 2001 19:28:23 -0600 + +cupsys (1.1.9-1) unstable; urgency=low + + * Return of the Maintainer. :-) + * New upstream version. + * Added dep on adduser (fixed bug #105382). + + -- Jeff Licquia Mon, 30 Jul 2001 00:28:47 -0500 + +cupsys (1.1.8-0.1) unstable; urgency=low + + * Non-maintainer upload. + * i think anyone who wants cupsys in woody will be happy by this nmu + * New upstream release (Closes: #80895, #100156, #94364) + * With the new upstream release the problem with cgi-bin + has been fixed + (Closes: #96055, #98264, #96530, #96055, #99914, #100707, #103095) + * Added cupsys-pstoraster package. + * Added the LOGDIR option to install rule (Closes: #94502) + * Suggests cupsys-driver-gimpprint | cupsomatic-ppd (Closes: #99146) + * Moved to DH_COMPAT=2 + * Added a pointer to http://localhost:631/admin to README.Debian + (Closes: #97964) + * Removed the extra from cupsd.conf (Closes: #96012) + * Not installing copyright for libcupsys2-dev, it will have a link + pointing to libcupsys2 anyways (Closes: #94504) + * Removed maintainer postinst and prerm scripts from cupsys-client + and libcupsys2-dev, by purging either of them you would have + removed your cups documentation. + * added German translation of debconf template to cupsys-bsd + by Sebastian Feltel (Closes: #101467, #100901) + * changed rm -f to rm -rf from cupsys-bsd prerm, and removed the link + handling for /usr/doc, let debhelper worry about that. + (Closes: #94539, #100501, #102669) + + -- Sami Haahtinen Thu, 5 Jul 2001 16:04:42 +0300 + +cupsys (1.1.6-0.1) unstable; urgency=low + + * Non-maintainer upload + * New upstream release, fixing multiple vulnerabilities (Closes: Bug#88932) + * cupsys removes only its own configuration files upon purge (Closes: Bug#84341) + * fixed postinst, so it does not fail when the lpadmin group + already exists (Closes: Bug#84443) + * added a helpful URL to README.Debian (Closes: Bug#63590) + * Suggests gtklp | kups | qtcups (Closes: Bug#82974) + + -- Gergely Nagy <8@free.bsd.hu> Sat, 14 Apr 2001 18:05:23 +0200 + +cupsys (1.1.4-3) unstable; urgency=low + + * Fixed PAM module name confusion (closes bugs #76457, #77114). + * Fixed broken deps w.r.t. cupsys-client Replacing older cupsys + versions (closes bug #75241). + * Fixed broken deps surrounding cupsys-dev (closes bug #75242). + * My shlibs file was badly broken; it referred to the cupsys package + instead of the libcupsys2 package (closes bug #78485). + * Fixed problem with upgrading; --oknodo wasn't passed to + start-stop-daemon, causing the prerm to fail if cupsd wasn't running + (closes bug #70698). + + -- Jeff Licquia Sun, 3 Dec 2000 22:45:29 -0500 + +cupsys (1.1.4-2) unstable; urgency=high + + * Fix misconfiguration in default config; cupsd now refuses connections + to printers and printer classes from all hosts except localhost by + default. The previous default was to allow all hosts to connect to + all printers - not a terribly secure default. :-) + + -- Jeff Licquia Sat, 18 Nov 2000 00:55:48 -0500 + +cupsys (1.1.4-1) unstable; urgency=low + + * New upstream version. + * Fixed SystemGroup to point to lpadmin again (closes bug #72155). + + -- Jeff Licquia Sun, 15 Oct 2000 20:36:01 -0500 + +cupsys (1.1.2-4) unstable; urgency=low + + * The scheduler will now accept up to 128 characters for a password + (closes bug #70946). + + -- Jeff Licquia Sun, 15 Oct 2000 14:54:31 -0500 + +cupsys (1.1.2-3) unstable; urgency=low + + * Re-add ppd directory to build (when did it drop out?) (closes bug + #70448). + + -- Jeff Licquia Mon, 28 Aug 2000 20:14:51 -0500 + +cupsys (1.1.2-2) unstable; urgency=low + + * Added debhelper to build deps (closes bug #69677). + * Fixed PAM configuration file (closes bug #69787). + + -- Jeff Licquia Thu, 24 Aug 2000 11:40:56 -0500 + +cupsys (1.1.2-1) unstable; urgency=low + + * Another new upstream version. + * More build fixes. + + -- Jeff Licquia Sat, 19 Aug 2000 17:15:34 -0500 + +cupsys (1.1.1-1) unstable; urgency=low + + * New upstream version - non-beta this time. + * Fixed up build process to reflect upstream changes. + * Removed lots of Debian-specific stuff that isn't needed anymore. + + -- Jeff Licquia Mon, 7 Aug 2000 20:27:29 -0500 + +cupsys (1.1.0-0b3d1) unstable; urgency=low + + * New upstream version. + * Daemon 'cups-lpd' (new to this version) added to cupsys-bsd, with + appropriate update-inetd calls, so cupsys-bsd is now a complete + replacement for lpr. + + -- Jeff Licquia Sun, 14 May 2000 00:08:23 -0500 + +cupsys (1.0.4-8) stable; urgency=high + + * Security fix: the default configuration now no longer allows people + to connect to printers except from localhost. The previous default + configuration allowed anyone to connect to any printer from any + location; not a smart security move. + + -- Jeff Licquia Sat, 18 Nov 2000 00:37:06 -0500 + +cupsys (1.0.4-7) frozen unstable; urgency=high + + * Additional DoS fixes, included in Easy Software Products' patch for + the bug below. As these are DoS bugs, I HIGHLY recommend including + this in potato. + + -- Jeff Licquia Sun, 18 Jun 2000 22:39:01 -0500 + +cupsys (1.0.4-6) frozen unstable; urgency=high + + * Fixed denial-of-service bug; POSTing non-IPP data would cause the + server to crash. Closes bug #65576 (severity: critical). + + -- Jeff Licquia Tue, 13 Jun 2000 22:04:40 -0500 + +cupsys (1.0.4-5) frozen unstable; urgency=low + + * Backported 1.0.5 bugfix: adding a printer would fail if + /usr/share/cups were mounted on a different partition than /etc/cups. + Closes bug #62267 (severity: grave). + + -- Jeff Licquia Thu, 13 Apr 2000 23:09:40 -0500 + +cupsys (1.0.4-4) frozen unstable; urgency=low + + * Makefile in conf was attempting to remove /etc/printcap during build, and + fails to build if this fails (which it will under fakeroot); disabled + this. Closes bug #60455 (severity: important). + + -- Jeff Licquia Wed, 15 Mar 2000 12:34:20 -0600 + +cupsys (1.0.4-3) frozen unstable; urgency=low + + * Oops - ppd directory move fails in preinst if /var/lib/cups/ppd is + empty. Reported as bug #59993, fixed. + * Missed the library Build-Depends. Closes bug #60090. + * Postrm during purge now removes /etc/cups properly. + * Documentation updates. + + -- Jeff Licquia Fri, 10 Mar 2000 22:59:07 -0600 + +cupsys (1.0.4-2) frozen unstable; urgency=low + + * Fixed documentation corruption in HTML docs (closes bug #59063). + * Moved /var/lib/cups/ppd/* config files (printer definitions) to + /etc/cups/ppd (closes bug #59263). + * Fixed shlibs for libcupsys1 (erroneous information) preventing + packages that link to it from depending properly. + * Changed default for browsing to Off to keep cupsd from probing the + local network continuously (closes bug #59277). + + -- Jeff Licquia Sat, 4 Mar 2000 18:23:01 -0600 + +cupsys (1.0.4-1) unstable; urgency=low + + * New upstream version. + * Changed policy version & tweaked for conformance. + * Fixed symlinks for cupsys-bsd, including /usr/doc symlinks. + * Reverted lp -h hack in favor of upstream fix. + + -- Jeff Licquia Sun, 9 Jan 2000 23:25:06 -0600 + +cupsys (1.0.2-2) unstable; urgency=low + + * Added quick hack to allow for -h option to lp (closes bug #52050). + * Set the lpd backend suid after quick audit; it doesn't appear to have + any egregious errors (closes part of bug #52381). + * Move /var/lib/cups/conf files to /etc/cups, with a symlink in place of + the old location (closes bug #52318). + * Added "Authentication failed" message when authorizing after the first + auth failure (which is likely before the first password request) + (closes rest of bug #50264). + * Made cupsys-bsd doc dir a symlink to the cupsys doc files, per policy + section 6.6 (closes bug #51958). + * Symlinked /var/lib/cups/logs to /var/log/cups (closes bug #51957). + + -- Jeff Licquia Mon, 13 Dec 1999 02:12:40 -0600 + +cupsys (1.0.2-1) unstable; urgency=low + + * New upstream version. + * Conflict with lprng, since lprng includes some SysV printing commands + (closes bug #50539). + * Added "cupsenable", "cupsdisable", "cupsaccept", and "cupsreject" + commands as part of an ongoing effort to reduce namespace pollution. + (addresses part of bug #50661 and #50384) + * Set both the default user and group to "lp" (for permissions fixes). + * Created "lpadmin" group and set SystemGroup to this. This will + fix problems with CUPS not being usable initially. As soon as + bug #50620 gets fixed, I'll set up to add root to the group, which + will make root able to configure CUPS immediately after installation. + + -- Jeff Licquia Mon, 29 Nov 1999 00:16:44 -0600 + +cupsys (1.0.1-3) unstable; urgency=low + + * Fixed wrong symlinks. (closes bug #50279) + * Stopped compression of .pdf files; they didn't gain much, broke + the links in the HTML, and generally caused confusion. (closes + part of bug #50264) + + -- Jeff Licquia Mon, 15 Nov 1999 22:28:56 -0600 + +cupsys (1.0.1-2) unstable; urgency=low + + * cupsys-bsd should conflict with lpr, not "lpd" (whatever that is) + (closes #50047) + + * Changed priority to "extra". + + -- Jeff Licquia Fri, 12 Nov 1999 22:24:15 -0600 + +cupsys (1.0.1-1) unstable; urgency=low + + * Initial Release. + + -- Jeff Licquia Sun, 6 Nov 1999 20:58:02 -0500 diff --git a/debian/client.conf b/debian/client.conf new file mode 100644 index 0000000..754c71a --- /dev/null +++ b/debian/client.conf @@ -0,0 +1,66 @@ +# Sample client configuration file for the Common UNIX Printing System +# (CUPS). +# +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# Kenshi Muto modified a bit for Debian distribution. +# +# These coded instructions, statements, and computer programs are the +# property of Easy Software Products and are protected by Federal +# copyright law. Distribution and use rights are outlined in the file +# "LICENSE.txt" which should have been included with this file. If this +# file is missing or damaged please contact Easy Software Products +# at: +# +# Attn: CUPS Licensing Information +# Easy Software Products +# 44141 Airport View Drive, Suite 204 +# Hollywood, Maryland 20636 USA +# +# Voice: (301) 373-9600 +# EMail: cups-info@cups.org +# WWW: http://www.cups.org +# + +######################################################################## +# # +# This is the CUPS client configuration file. This file is used to # +# define client-specific parameters, such as the default server or # +# default encryption settings. # +# # +# Put this file on /etc/cups/client.conf (system use) or # +# ~/.cups/client.conf (personal use). # +# # +######################################################################## + +# +# ServerName: the hostname of your server. By default CUPS will use the +# domain socket /var/run/cups/cups.sock or the value of the CUPS_SERVER +# environment variable. +# ONLY ONE SERVER NAME MAY BE SPECIFIED AT A TIME. To use +# more than one server you must use a local scheduler with browsing +# and possibly polling. +# + +#ServerName /domain/socket +#ServerName myhost.domain.com[:port] +#ServerName ip-address[:port] + +# +# Encryption: whether or not to use encryption; this depends on having +# the OpenSSL library linked into the CUPS library. +# +# Possible values: +# +# Always - Always use encryption (SSL) +# Never - Never use encryption +# Required - Use TLS encryption upgrade +# IfRequested - Use encryption if the server requests it +# +# The default value is "IfRequested". This parameter can also be set +# using the CUPS_ENCRYPTION environment variable. +# + +#Encryption Always +#Encryption Never +#Encryption Required +#Encryption IfRequested diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +8 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..e122de7 --- /dev/null +++ b/debian/control @@ -0,0 +1,386 @@ +Source: cups +Standards-Version: 3.9.3 +Priority: optional +Section: net +Maintainer: GangHeok Kim , Taeksu Shin , Dongwook Lee +Uploaders: GangHeok Kim , + Taeksu Shin , + Dongwook Lee +Build-Depends: + cdbs, + debhelper (>= 8), + patch, + autoconf, + automake, + libtool, + autotools-dev, + pkg-config, + libavahi-client-dev, + libavahi-common-dev, + libfontconfig1-dev, + libfreetype6-dev, + libgnutls-dev, + libijs-dev, + libjpeg-dev, + libpng-dev | libpng12-dev, + po4a (>= 0.31~), + po-debconf, + poppler-utils, + sharutils, + zlib1g-dev, + libusb-dev +# cdbs (>= 0.4.93~), +# libusb-1.0-0-dev [!hurd-any], +# libdbus-1-dev, +# libavahi-compat-libdnssd-dev, +# dpkg-dev (>= 1.16.1~), +# libslp-dev, +# ghostscript (>= 9.02~), +# libtiff5-dev | libtiff-dev, +# libpam0g-dev, +# libpaper-dev, +# debhelper (>= 8.1.3~), +# libldap2-dev, +# libkrb5-dev, +Homepage: http://www.cups.org +Vcs-Bzr: http://bzr.debian.org/pkg-cups/cups/debian-trunk/ +Vcs-Browser: http://bzr.debian.org/loggerhead/pkg-cups/cups/debian-trunk/ + +Package: libcups2 +Priority: optional +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Suggests: cups-common +Provides: libcupsys2 +Conflicts: libcupsys2 +Replaces: libcupsys2 +Breaks: cups (<< 1.5.0) +#Pre-Depends: ${misc:Pre-Depends} +#Multi-Arch: same +Description: Common UNIX Printing System(tm) - Core library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the base shared libraries for CUPS. + +Package: libcupsimage2 +Priority: optional +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: Common UNIX Printing System(tm) - Raster image library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the image libraries for handling the CUPS + raster format. + +Package: libcupscgi1 +Priority: optional +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: Common UNIX Printing System(tm) - CGI library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides a shared library for CGI programs in the + CUPS web interface + +Package: libcupsdriver1 +Priority: optional +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: Common UNIX Printing System(tm) - Driver library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides a shared library with useful functions for printer + drivers. + +Package: libcupsmime1 +Priority: optional +Section: libs +Architecture: any +Depends: libcups2 (>= 1.5~), ${shlibs:Depends}, ${misc:Depends} +Breaks: cups (<< 1.5.0) +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: Common UNIX Printing System(tm) - MIME library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides a shared library for file type detection and + file conversion filter chain building. + +Package: libcupsppdc1 +Priority: optional +Section: libs +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Description: Common UNIX Printing System(tm) - PPD manipulation library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the base shared library for generating and + manipulating PPD files. + +Package: cups +Priority: optional +Section: net +Architecture: any +Pre-Depends: dpkg (>= 1.15.7.2) +Depends: ${shlibs:Depends}, + ${misc:Depends}, + debconf (>= 1.2.9) | debconf-2.0, + poppler-utils (>= 0.12), + lsb-base (>= 3), + cups-common (>= ${source:Upstream-Version}), + cups-client (>= ${binary:Version}), + adduser, + cups-ppdc, +# cups-filters +# ssl-cert (>= 1.0.11), +# bc, +# procps, +# ghostscript (>= 9.02~), +Recommends: avahi-daemon, + colord, + foomatic-filters (>= 4.0), + printer-driver-gutenprint, + ghostscript-cups (>= 9.02~) +#Suggests: cups-bsd, +# foomatic-db-compressed-ppds | foomatic-db, +# printer-driver-hpcups, +# hplip, +# cups-pdf, +# udev, +# smbclient +Replaces: cupsddk-drivers (<< 1.4.0), ghostscript-cups (<< 9.02~) +Provides: cupsddk-drivers +Breaks: cupsddk-drivers (<< 1.4.0), foomatic-filters (<< 4.0), ghostscript-cups (<< 9.02~) +Description: Common UNIX Printing System(tm) - server + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the CUPS scheduler/daemon and related files. + +Package: cups-client +Priority: optional +Section: net +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + cups-common (>= ${source:Upstream-Version}), + adduser +Recommends: smbclient +Suggests: cups, xpp, cups-bsd +Conflicts: lprng +Description: Common UNIX Printing System(tm) - client programs (SysV) + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the System V style print client programs. + +Package: libcups2-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + libcups2 (= ${binary:Version}), + libgnutls-dev, +# libkrb5-dev +Provides: libcupsys2-dev +Description: Common UNIX Printing System(tm) - Development files CUPS library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing CUPS-aware + applications and CUPS drivers, as well as examples how to communicate + with cups from different programming languages (Perl, Java, and + PHP). + +Package: libcupsimage2-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + libcupsimage2 (= ${binary:Version}), + libcups2-dev (= ${binary:Version}), + libpng-dev, + libjpeg8-dev | libjpeg-dev, + zlib1g-dev +# libtiff5-dev | libtiff-dev, +Description: Common UNIX Printing System(tm) - Development files CUPS image library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing applications + that use the CUPS raster image format. + +Package: libcupscgi1-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libcupscgi1 (= ${binary:Version}), + libcups2-dev (= ${binary:Version}) +Description: Common UNIX Printing System(tm) - Development files for CGI library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing CGI programs + for the CUPS web interface using libcupscgi. + +Package: libcupsdriver1-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + libcupsdriver1 (= ${binary:Version}), + libcups2-dev (= ${binary:Version}), + libcupsimage2-dev (= ${binary:Version}) +Description: Common UNIX Printing System(tm) - Development files driver library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing printer drivers + using libcupsdriver. + +Package: libcupsmime1-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + libcupsmime1 (= ${binary:Version}), + libcups2-dev (= ${binary:Version}) +Description: Common UNIX Printing System(tm) - Development files MIME library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing programs + using libcupsmime. + +Package: libcupsppdc1-dev +Priority: optional +Section: libdevel +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, + libcupsppdc1 (= ${binary:Version}), + libcups2-dev (= ${binary:Version}) +Description: Common UNIX Printing System(tm) - Development files PPD library + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the files necessary for developing programs + using libcupsppdc. + +#Package: cups-bsd +#Priority: extra +#Section: net +#Architecture: any +#Depends: ${shlibs:Depends}, ${misc:Depends}, +# cups-client (= ${binary:Version}), +# debconf | debconf-2.0, +# update-inetd, +# cups-common +#Suggests: cups +#Conflicts: lpr, lprng +#Replaces: lpr +#Provides: lpr +#Description: Common UNIX Printing System(tm) - BSD commands +# The Common UNIX Printing System (or CUPS(tm)) is a printing system and +# general replacement for lpr, lpd and the like. It supports the +# Internet Printing Protocol (IPP), and has its own filtering driver +# model for handling various document types. +# . +# This package provides the BSD commands for interacting with CUPS. It +# is provided separately to allow CUPS to coexist with other printing +# systems (to a small degree). + +Package: cups-common +Priority: optional +Section: net +Architecture: all +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: Common UNIX Printing System(tm) - common files + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides common files for CUPS server and client packages. + +Package: cups-ppdc +Priority: optional +Section: utils +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, cups-common +Breaks: cupsddk (<< 1.4.0) +Replaces: cupsddk (<< 1.4.0) +Provides: cupsddk +Description: Common UNIX Printing System(tm) - PPD manipulation utilities + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides utilities to generate and manipulate PPD files. + +Package: cups-dbg +Priority: extra +Section: debug +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, cups (= ${binary:Version}) +Description: Common UNIX Printing System(tm) - debugging symbols + The Common UNIX Printing System (or CUPS(tm)) is a printing system and + general replacement for lpd and the like. It supports the Internet + Printing Protocol (IPP), and has its own filtering driver model for + handling various document types. + . + This package provides the debugging symbols of CUPS. + +Package: cupsddk +Priority: extra +Section: oldlibs +Architecture: all +Depends: ${misc:Depends}, cups-ppdc +Description: Common UNIX Printing System (transitional package) + This is a dummy package to ease transition to new package name. + diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..a3f5a6e --- /dev/null +++ b/debian/copyright @@ -0,0 +1,77 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: CUPS +Upstream-Contact: Michael Sweet +Source: ftp://ftp.easysw.com/pub/cups/ + +Files: * +Copyright: Copyright 2007-2011 by Apple Inc. +License: GPL-2 with exceptions + 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, version 2 of the License. + . + The full text of the GPL is distributed as in + /usr/share/common-licenses/GPL-2 on Debian systems. + . + In addition, as the copyright holder of CUPS, Apple Inc. grants + the following special exceptions: + . + 1. Apple Operating System Development License Exception; + . + a. Software that is developed by any person or entity + for an Apple Operating System ("Apple OS-Developed + Software"), including but not limited to Apple and + third party printer drivers, filters, and backends + for an Apple Operating System, that is linked to the + CUPS imaging library or based on any sample filters + or backends provided with CUPS shall not be + considered to be a derivative work or collective work + based on the CUPS program and is exempt from the + mandatory source code release clauses of the GNU GPL. + You may therefore distribute linked combinations of + the CUPS imaging library with Apple OS-Developed + Software without releasing the source code of the + Apple OS-Developed Software. You may also use sample + filters and backends provided with CUPS to develop + Apple OS-Developed Software without releasing the + source code of the Apple OS-Developed Software. + . + b. An Apple Operating System means any operating system + software developed and/or marketed by Apple Computer, + Inc., including but not limited to all existing + releases and versions of Apple's Darwin, Mac OS X, + and Mac OS X Server products and all follow-on + releases and future versions thereof. + . + c. This exception is only available for Apple + OS-Developed Software and does not apply to software + that is distributed for use on other operating + systems. + . + d. All CUPS software that falls under this license + exception have the following text at the top of each + source file: + . + This file is subject to the Apple OS-Developed + Software exception. + . + 2. OpenSSL Toolkit License Exception; + . + a. Apple Inc. explicitly allows the compilation and + distribution of the CUPS software with the OpenSSL + Toolkit. + . + No developer is required to provide these exceptions in a + derived work. + +Files: cups/* filters/* +Copyright: Copyright 2007-2011 by Apple Inc. +License: LGPL-2 with exceptions + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation, version 2 of the License. + . + The full text of the GPL is distributed as in + /usr/share/common-licenses/GPL-2 on Debian systems. + . + The same exceptions as above apply. diff --git a/debian/cups-bsd.config b/debian/cups-bsd.config new file mode 100644 index 0000000..f6fc829 --- /dev/null +++ b/debian/cups-bsd.config @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +# Debconf library +. /usr/share/debconf/confmodule + +db_input medium cups-bsd/setuplpd || true +db_go diff --git a/debian/cups-bsd.install b/debian/cups-bsd.install new file mode 100644 index 0000000..1ddd2d7 --- /dev/null +++ b/debian/cups-bsd.install @@ -0,0 +1,14 @@ +usr/sbin/lpc +usr/bin/lpq +usr/bin/lpr +usr/bin/lprm +#usr/share/man/man1/lpr.1.gz +#usr/share/man/*/man1/lpr.1.gz +#usr/share/man/man1/lprm.1.gz +#usr/share/man/*/man1/lprm.1.gz +#usr/share/man/man1/lpq.1.gz +#usr/share/man/*/man1/lpq.1.gz +#usr/share/man/man8/cups-lpd.8.gz +#usr/share/man/*/man8/cups-lpd.8.gz +#usr/share/man/man8/lpc.8.gz +#usr/share/man/*/man8/lpc.8.gz diff --git a/debian/cups-bsd.postinst b/debian/cups-bsd.postinst new file mode 100644 index 0000000..af94832 --- /dev/null +++ b/debian/cups-bsd.postinst @@ -0,0 +1,62 @@ +#! /bin/sh +# postinst script for cups +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/doc/packaging-manual/ +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +# Debconf +. /usr/share/debconf/confmodule + +case "$1" in + configure) + + # Set documentation symlinks + if [ -d /usr/share/doc/cups ]; then + if [ ! -e /usr/share/doc/cups-bsd ]; then + ln -sf cups-common /usr/share/doc/cups-bsd + fi + fi + + # Add cups-lpd to inetd.conf + db_get cups-bsd/setuplpd + if [ "$RET" = "true" ]; then + update-inetd --add 'printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd' + fi + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups-bsd.postrm b/debian/cups-bsd.postrm new file mode 100644 index 0000000..2f260fb --- /dev/null +++ b/debian/cups-bsd.postrm @@ -0,0 +1,41 @@ +#! /bin/sh +# postrm script for cups-bsd +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see /usr/doc/packaging-manual/ + +case "$1" in + purge) + # Remove inetd entry + update-inetd --pattern cups-lpd --remove printer 2>/dev/null || true + + ;; + + remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 0 + +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + + diff --git a/debian/cups-bsd.preinst b/debian/cups-bsd.preinst new file mode 100644 index 0000000..d886e14 --- /dev/null +++ b/debian/cups-bsd.preinst @@ -0,0 +1,40 @@ +#! /bin/sh +# preinst script for cups-bsd +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' + +case "$1" in + install) + ;; + + upgrade) + if [ ! -L /usr/share/doc/cups-bsd ]; then + rm -rf /usr/share/doc/cups-bsd + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups-bsd.prerm b/debian/cups-bsd.prerm new file mode 100644 index 0000000..095e939 --- /dev/null +++ b/debian/cups-bsd.prerm @@ -0,0 +1,45 @@ +#! /bin/sh +# prerm script for cups-bsd +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/doc/packaging-manual/ + +if [ -L /etc/printcap ]; then + rm -f /etc/printcap +fi + +case "$1" in + remove|upgrade|deconfigure) + # Remove documentation links + rm -rf /usr/share/doc/cups-bsd + + # Disable inetd entry + update-inetd --pattern cups-lpd --disable printer + ;; + failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups-bsd.templates b/debian/cups-bsd.templates new file mode 100644 index 0000000..d7206af --- /dev/null +++ b/debian/cups-bsd.templates @@ -0,0 +1,12 @@ +# These templates have been reviewed by debian-l10n-english +# Please do not modify them without asking for a review + +Template: cups-bsd/setuplpd +Type: boolean +Default: false +_Description: Do you want to set up the BSD lpd compatibility server? + The CUPS package contains a server that can accept BSD-style print + jobs and submit them to CUPS. It should only be set up if other + computers are likely to submit jobs over the network via the "BSD" or + "LPR" services, and these computers cannot be converted to use the + IPP protocol that CUPS uses. diff --git a/debian/cups-client.install b/debian/cups-client.install new file mode 100644 index 0000000..5be5396 --- /dev/null +++ b/debian/cups-client.install @@ -0,0 +1,58 @@ +usr/bin/cancel +usr/bin/cupstestppd +usr/bin/cupstestdsc +usr/bin/ipptool +usr/bin/lp +usr/bin/lpoptions +usr/bin/lppasswd +usr/bin/lpstat +usr/sbin/cupsaddsmb +usr/sbin/lpadmin +usr/sbin/lpinfo +usr/sbin/lpmove +usr/sbin/accept +usr/sbin/reject +usr/sbin/cupsaccept +usr/sbin/cupsreject +usr/sbin/cupsdisable +usr/sbin/cupsenable +usr/sbin/cupsctl +#usr/share/man/man1/cupstestppd.1.gz +#usr/share/man/*/man1/cupstestppd.1.gz +#usr/share/man/man1/cupstestdsc.1.gz +#usr/share/man/*/man1/cupstestdsc.1.gz +#usr/share/man/man1/ipptool.1.gz +##usr/share/man/*/man1/ipptool.1.gz +#usr/share/man/man1/lp.1.gz +#usr/share/man/*/man1/lp.1.gz +#usr/share/man/man1/lpoptions.1.gz +#usr/share/man/*/man1/lpoptions.1.gz +#usr/share/man/man1/lppasswd.1.gz +##usr/share/man/*/man1/lppasswd.1.gz +#usr/share/man/man1/lpstat.1.gz +#usr/share/man/*/man1/lpstat.1.gz +#usr/share/man/man1/cancel.1.gz +#usr/share/man/*/man1/cancel.1.gz +#usr/share/man/man5/client.conf.5.gz +#usr/share/man/*/man5/client.conf.5.gz +#usr/share/man/man5/ipptoolfile.5.gz +#usr/share/man/*/man5/ipptoolfile.5.gz +#usr/share/man/man8/cupsaddsmb.8.gz +#usr/share/man/*/man8/cupsaddsmb.8.gz +#usr/share/man/man8/cupsenable.8.gz +#usr/share/man/*/man8/cupsenable.8.gz +#usr/share/man/man8/lpadmin.8.gz +#usr/share/man/*/man8/lpadmin.8.gz +#usr/share/man/man8/lpinfo.8.gz +#usr/share/man/*/man8/lpinfo.8.gz +#usr/share/man/man8/lpmove.8.gz +#usr/share/man/*/man8/lpmove.8.gz +#usr/share/man/man8/cupsreject.8.gz +#usr/share/man/*/man8/cupsreject.8.gz +#usr/share/man/man8/cupsdisable.8.gz +#usr/share/man/*/man8/cupsdisable.8.gz +#usr/share/man/man8/cupsaccept.8.gz +#usr/share/man/*/man8/cupsaccept.8.gz +#usr/share/man/man8/cupsctl.8.gz +#usr/share/man/*/man8/cupsctl.8.gz +#usr/share/cups/ipptool/*.test diff --git a/debian/cups-client.postinst b/debian/cups-client.postinst new file mode 100644 index 0000000..108c9b8 --- /dev/null +++ b/debian/cups-client.postinst @@ -0,0 +1,52 @@ +#! /bin/sh +# postinst script for cups +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/doc/packaging-manual/ +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +case "$1" in + configure) + if [ -z "`getent group lpadmin`" ]; then + addgroup --system lpadmin + fi + + chown root:lpadmin /usr/bin/lppasswd + chmod u+s /usr/bin/lppasswd + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups-client.preinst b/debian/cups-client.preinst new file mode 100644 index 0000000..9b31b52 --- /dev/null +++ b/debian/cups-client.preinst @@ -0,0 +1,40 @@ +#! /bin/sh +# preinst script for cups-client +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' + +case "$1" in + install) + ;; + + upgrade) + if [ ! -L /usr/share/doc/cups-client ]; then + rm -rf /usr/share/doc/cups-client + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups-common.install b/debian/cups-common.install new file mode 100644 index 0000000..c45b063 --- /dev/null +++ b/debian/cups-common.install @@ -0,0 +1,5 @@ +usr/share/cups/charsets +usr/share/cups/drv +usr/share/cups/locale +usr/share/cups/profiles +usr/share/cups/ppdc/*.defs diff --git a/debian/cups-ppdc.install b/debian/cups-ppdc.install new file mode 100644 index 0000000..ca994d5 --- /dev/null +++ b/debian/cups-ppdc.install @@ -0,0 +1,4 @@ +usr/bin/ppd* +usr/share/cups/ppdc/*.h +usr/share/cups/examples/ +usr/share/man/man?/ppd*.?.gz diff --git a/debian/cups.config b/debian/cups.config new file mode 100644 index 0000000..500b41e --- /dev/null +++ b/debian/cups.config @@ -0,0 +1,29 @@ +#!/bin/sh + +set -e + +# Debconf library +. /usr/share/debconf/confmodule + +db_get cupsys/raw-print +OLD_RET=$RET + +db_input low cupsys/raw-print || true +db_go + +db_get cupsys/raw-print +if [ "$OLD_RET" != "$RET" ]; then + db_fset cupsys/raw-print changed true +fi + +# remove parallel from PPC default +ARCH=`dpkg --print-architecture` +if [ "$ARCH" = "ppc" -o "$ARCH" = "ppc-none" ]; then + db_fget cupsys/backend seen + if [ "$RET" = "false" ]; then + db_set cupsys/backend "ipp, ipp14, lpd, socket, usb" + fi +fi + +db_input low cupsys/backend || true +db_go diff --git a/debian/cups.default b/debian/cups.default new file mode 100644 index 0000000..ba8b3cc --- /dev/null +++ b/debian/cups.default @@ -0,0 +1,4 @@ +# Cups configure options + +# LOAD_LP_MODULE: enable/disable to load "lp" parallel printer driver module +LOAD_LP_MODULE=yes diff --git a/debian/cups.dirs b/debian/cups.dirs new file mode 100644 index 0000000..9f39be5 --- /dev/null +++ b/debian/cups.dirs @@ -0,0 +1,4 @@ +etc/cups/ssl +usr/lib/cups/backend +#usr/local/share/ppd +usr/share/ppd/custom diff --git a/debian/cups.doc-base b/debian/cups.doc-base new file mode 100644 index 0000000..21bdb8a --- /dev/null +++ b/debian/cups.doc-base @@ -0,0 +1,10 @@ +Document: cups +Title: CUPS Documentation +Author: Easy Software Products +Abstract: This documentation covers the use and administration of a CUPS + printing system, and the programming interface for the libcups API. +Section: System/Hardware + +Format: HTML +Index: /usr/share/doc/cups/online-docs/index.html +Files: /usr/share/doc/cups/online-docs/*.html diff --git a/debian/cups.docs b/debian/cups.docs new file mode 100644 index 0000000..f2f3c62 --- /dev/null +++ b/debian/cups.docs @@ -0,0 +1,3 @@ +CREDITS.txt +README.txt +debian/HOWTO_BUGREPORT.txt diff --git a/debian/cups.examples b/debian/cups.examples new file mode 100644 index 0000000..f384c94 --- /dev/null +++ b/debian/cups.examples @@ -0,0 +1,2 @@ +debian/filters/* +debian/printer.schema diff --git a/debian/cups.init.d b/debian/cups.init.d new file mode 100644 index 0000000..89ceebe --- /dev/null +++ b/debian/cups.init.d @@ -0,0 +1,115 @@ +#! /bin/sh +### BEGIN INIT INFO +# Provides: cups +# Required-Start: $syslog $remote_fs +# Required-Stop: $syslog $remote_fs +# Should-Start: $network avahi +# Should-Stop: $network +# X-Start-Before: samba +# X-Stop-After: samba +# Default-Start: 2 3 4 5 +# Default-Stop: 1 +# Short-Description: CUPS Printing spooler and server +### END INIT INFO + +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin +DAEMON=/usr/sbin/cupsd +NAME=cupsd +PIDFILE=/var/run/cups/$NAME.pid +DESC="Common Unix Printing System" + +unset TMPDIR + +test -x $DAEMON || exit 0 + +mkdir -p /var/run/cups/certs + +if [ -r /etc/default/cups ]; then + . /etc/default/cups +fi + +. /lib/lsb/init-functions + +# Get the timezone set. +if [ -z "$TZ" -a -e /etc/timezone ]; then + TZ=`cat /etc/timezone` + export TZ +fi + +restart_xprint() { + if [ -n "$success" ] && [ -x /etc/init.d/xprint ]; then + invoke-rc.d xprint force-reload || true + fi +} + +coldplug_usb_printers() { + if type udevadm > /dev/null 2>&1 && [ -x /lib/udev/udev-configure-printer ]; then + for printer in `udevadm trigger --verbose --dry-run --subsystem-match=usb \ + --attr-match=bInterfaceClass=07 --attr-match=bInterfaceSubClass=01 2>/dev/null || true; \ + udevadm trigger --verbose --dry-run --subsystem-match=usb \ + --sysname-match='lp[0-9]*' 2>/dev/null || true`; do + /lib/udev/udev-configure-printer add "${printer#/sys}" + done + fi +} + +case "$1" in + start) + log_begin_msg "Starting $DESC: $NAME" + + mkdir -p `dirname "$PIDFILE"` + if [ "$LOAD_LP_MODULE" = "yes" -a -f /usr/lib/cups/backend/parallel \ + -a -f /proc/devices -a -f /proc/modules -a -x /sbin/modprobe ]; then + modprobe -q -b lp || true + modprobe -q -b ppdev || true + modprobe -q -b parport_pc || true + fi + + start-stop-daemon --start --quiet --oknodo --pidfile "$PIDFILE" --exec $DAEMON && success=1 + + coldplug_usb_printers + log_end_msg $? + restart_xprint + ;; + stop) + log_begin_msg "Stopping $DESC: $NAME" + start-stop-daemon --stop --quiet --retry 5 --oknodo --pidfile $PIDFILE --name $NAME && success=1 + log_end_msg $? + restart_xprint + ;; + reload|force-reload) + log_begin_msg "Reloading $DESC: $NAME" + start-stop-daemon --stop --quiet --pidfile $PIDFILE --name $NAME --signal 1 && success=1 + log_end_msg $? + restart_xprint + ;; + restart) + log_begin_msg "Restarting $DESC: $NAME" + if start-stop-daemon --stop --quiet --retry 5 --oknodo --pidfile $PIDFILE --name $NAME; then + start-stop-daemon --start --quiet --pidfile "$PIDFILE" --exec $DAEMON && success=1 + fi + log_end_msg $? + restart_xprint + ;; + status) + echo -n "Status of $DESC: " + if [ ! -r "$PIDFILE" ]; then + echo "$NAME is not running." + exit 3 + fi + if read pid < "$PIDFILE" && ps -p "$pid" > /dev/null 2>&1; then + echo "$NAME is running." + exit 0 + else + echo "$NAME is not running but $PIDFILE exists." + exit 1 + fi + ;; + *) + N=/etc/init.d/${0##*/} + echo "Usage: $N {start|stop|restart|force-reload|status}" >&2 + exit 1 + ;; +esac + +exit 0 diff --git a/debian/cups.install b/debian/cups.install new file mode 100644 index 0000000..7825bde --- /dev/null +++ b/debian/cups.install @@ -0,0 +1,52 @@ +var/ +etc/cups/cupsd.conf +etc/cups/cupsd.conf.default +etc/cups/snmp.conf +etc/cups/ppd +usr/lib/cups/backend/* usr/lib/cups/backend-available +usr/lib/cups/cgi-bin +usr/lib/cups/monitor +usr/lib/cups/daemon/ +usr/lib/cups/filter/ +usr/lib/cups/notifier +usr/lib/cups/driver/ +usr/sbin/cupsd +usr/sbin/cupsfilter +usr/share/cups/banners +usr/share/cups/data +usr/share/cups/doc-root +usr/share/cups/fonts +usr/share/cups/mime +usr/share/cups/model +usr/share/cups/templates +usr/share/man/man7/backend.7.gz +usr/share/man/*/man7/backend.7.gz +usr/share/man/man7/filter.7.gz +usr/share/man/*/man7/filter.7.gz +usr/share/man/man5/classes.conf.5.gz +usr/share/man/*/man5/classes.conf.5.gz +usr/share/man/man5/cupsd.conf.5.gz +usr/share/man/*/man5/cupsd.conf.5.gz +usr/share/man/man5/cups-snmp.conf.5.gz +usr/share/man/*/man5/cups-snmp.conf.5.gz +usr/share/man/man5/mailto.conf.5.gz +usr/share/man/*/man5/mailto.conf.5.gz +usr/share/man/man5/subscriptions.conf.5.gz +usr/share/man/*/man5/subscriptions.conf.5.gz +usr/share/man/man5/mime.convs.5.gz +usr/share/man/*/man5/mime.convs.5.gz +usr/share/man/man5/mime.types.5.gz +usr/share/man/*/man5/mime.types.5.gz +usr/share/man/man5/printers.conf.5.gz +usr/share/man/*/man5/printers.conf.5.gz +usr/share/man/man8/cups-polld.8.gz +usr/share/man/*/man8/cups-polld.8.gz +usr/share/man/man8/cupsd.8.gz +#usr/share/man/*/man8/cupsd.8.gz +usr/share/man/man8/cups-deviced.8.gz +usr/share/man/*/man8/cups-deviced.8.gz +usr/share/man/man8/cups-driverd.8.gz +usr/share/man/*/man8/cups-driverd.8.gz +usr/share/man/man8/cupsfilter.8.gz +#usr/share/man/*/man8/cupsfilter.8.gz +../presubj usr/share/bug/cups/ diff --git a/debian/cups.lintian-overrides b/debian/cups.lintian-overrides new file mode 100644 index 0000000..b9343f9 --- /dev/null +++ b/debian/cups.lintian-overrides @@ -0,0 +1,10 @@ +cups: non-standard-executable-perm usr/lib/cups/backend-available/ipp 0744 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/ipp14 0744 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/lpd 0744 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/dnssd 0744 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/snmp 0555 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/socket 0555 != 0755 +cups: non-standard-executable-perm usr/lib/cups/backend-available/usb 0544 != 0755 +cups: package-contains-empty-directory usr/share/ppd/custom/ +cups: package-contains-empty-directory usr/lib/cups/backend/ +cups: init.d-script-possible-missing-stop etc/init.d/cups 0 6 diff --git a/debian/cups.logrotate b/debian/cups.logrotate new file mode 100644 index 0000000..d164546 --- /dev/null +++ b/debian/cups.logrotate @@ -0,0 +1,15 @@ +/var/log/cups/*log { + daily + missingok + rotate 7 + sharedscripts + postrotate + if [ -e /var/run/cups/cupsd.pid ]; then + invoke-rc.d --quiet cups force-reload > /dev/null + sleep 10 + fi + endscript + compress + notifempty + create 640 root lpadmin +} diff --git a/debian/cups.pam b/debian/cups.pam new file mode 100644 index 0000000..e2c7a99 --- /dev/null +++ b/debian/cups.pam @@ -0,0 +1,3 @@ +@include common-auth +@include common-account +@include common-session diff --git a/debian/cups.postinst b/debian/cups.postinst new file mode 100644 index 0000000..c5997f9 --- /dev/null +++ b/debian/cups.postinst @@ -0,0 +1,272 @@ +#! /bin/sh +# postinst script for cups +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see /usr/doc/packaging-manual/ +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +dpkg-maintscript-helper rm_conffile /etc/modprobe.d/blacklist-cups-usblp.conf 1.5.3-2 -- "$@" + +# Debconf +. /usr/share/debconf/confmodule + +# Default Configuration file +if [ -e /etc/default/cups ]; then + . /etc/default/cups +fi + +if [ "$1" = configure ]; then + # Set up lpadmin group. + if [ -z "`getent group lpadmin`" ]; then + addgroup --system lpadmin + fi + + # set up custom PPD directory + chown root:lpadmin /usr/share/ppd/custom 2>/dev/null || true + chmod 3775 /usr/share/ppd/custom 2>/dev/null || true + + # Generate raw MIME handling files if they don't already exist. + if [ ! -e /etc/cups/raw.types ]; then + cat >/etc/cups/raw.types </etc/cups/raw.convs < /etc/cups/raw.convs + else + sed 's/^application/#application/' \ + < /etc/cups/raw.convs-convert > /etc/cups/raw.convs + fi + rm -f /etc/cups/raw.convs-convert + db_fset cupsys/raw-print changed false + fi + # Set up backends + db_get cupsys/backend && SELECTED=$RET + # We remove the scsi backend from the output as it got removed in CUPS 1.5.0 + list=`echo $SELECTED | sed -e 's/, /,/g' | sed -e 's/scsi,*//g' | sed -e 's/parallel,*//g' | sed -e 's/serial,*//g'` + if dpkg --compare-versions "$2" lt-nl "1.5.3-3"; then + if ! echo $list | grep -q "\bipp14\b"; then + list=`echo $list | sed -e 's/\bipp\b/ipp,ipp14/g'` + fi + fi + save_IFS=$IFS + IFS=, + (cd /usr/lib/cups/backend && rm -f http https ipp ipp14 ipps lpd socket usb snmp dnssd mdns) + for module in $list; do + ln /usr/lib/cups/backend-available/$module /usr/lib/cups/backend/$module + if [ "$module" = "ipp" ]; then + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/http + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/https + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipps + fi + if [ "$module" = "dnssd" ]; then + ln /usr/lib/cups/backend/dnssd /usr/lib/cups/backend/mdns + fi + done + IFS=$save_IFS + + # activate new backends on upgrades + db_fset cupsys/backend changed false + + # Resync Debconf database with real state + list=`( cd /usr/lib/cups/backend && for f in ipp ipp14 lpd socket usb snmp dnssd; do [ -e $f ] && echo -n "$f, "; done ) | sed -e 's/, $//'` + db_set cupsys/backend $list; + + if [ -f /etc/cups/classes.conf ]; then + chown root:lp /etc/cups/classes.conf ; chmod 600 /etc/cups/classes.conf + fi + if [ -f /etc/cups/printers.conf ]; then + chown root:lp /etc/cups/printers.conf ; chmod 600 /etc/cups/printers.conf + fi + + # symlink snakeoil SSL certificate if present + if [ -e /etc/ssl/certs/ssl-cert-snakeoil.pem -a \ + -e /etc/ssl/private/ssl-cert-snakeoil.key -a \ + -n "`getent group ssl-cert`" -a ! -e /etc/cups/ssl/server.crt \ + -a ! -e /etc/cups/ssl/server.key -a ! -h /etc/cups/ssl/server.crt \ + -a ! -h /etc/cups/ssl/server.key ]; then + ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /etc/cups/ssl/server.crt + ln -s /etc/ssl/private/ssl-cert-snakeoil.key /etc/cups/ssl/server.key + fi + + APP_PROFILE=/etc/apparmor.d/usr.sbin.cupsd + if [ -f "$APP_PROFILE" ]; then + # Add the local/ include + LOCAL_APP_PROFILE=/etc/apparmor.d/local/usr.sbin.cupsd + + [ -e "$LOCAL_APP_PROFILE" ] || \ + [ -e /etc/apparmor.d/local -a ! -d /etc/apparmor.d/local ] || { + tmp=`mktemp` + cat < "$tmp" +# Site-specific additions and overrides for usr.sbin.cupsd. +# For more details, please see /etc/apparmor.d/local/README. +EOM + mkdir `dirname $LOCAL_APP_PROFILE` 2>/dev/null || true + mv -f "$tmp" "$LOCAL_APP_PROFILE" + chmod 644 "$LOCAL_APP_PROFILE" + } + + # Reload the profile, including any abstraction updates + if aa-status --enabled 2>/dev/null; then + apparmor_parser -r -T -W "$APP_PROFILE" || true + fi + fi + + # Clear cache if we upgrade to 1.4.x + if dpkg --compare-versions "$2" lt-nl "1.4.1-5"; then + rm /var/cache/cups/* 2> /dev/null || : + fi + + # Clear PPD cache if we upgrade to 1.5.x + if dpkg --compare-versions "$2" lt-nl "1.5.0-3"; then + rm /var/cache/cups/ppds.dat 2> /dev/null || : + fi + + # Manage printcap file and associated symlinks + if [ -e /etc/cups/cupsd.conf ]; then + if [ -e /etc/printcap.cups ]; then + rm -f /etc/printcap.cups + fi + if [ -L /etc/printcap -a ! -e /etc/printcap ]; then + rm -f /etc/printcap + fi + + printcap_file=`egrep '^Printcap ' /etc/cups/cupsd.conf | awk '{print $2}' | tail -n 1` + if [ -z "$printcap_file" ]; then + printcap_file=/var/run/cups/printcap + fi + if [ ! -e /etc/printcap -a -e $printcap_file ]; then + ln -s $printcap_file /etc/printcap + fi + fi + + if dpkg --compare-versions "$2" lt "1.5.3-3"; then + modprobe usblp >/dev/null 2>&1 || : + fi +fi + +#DEBHELPER# + +# ppd_updater is supposed to be launched only with a running CUPS. +ppd_updater () { + driverregexp="$1" + gennicknameregexp="$2" + + [ ! -z "$gennicknameregexp" ] && \ + gennicknameregexp="; $gennicknameregexp" + gennicknameregexp='s/\s*\(recommended\)//'"$gennicknameregexp" + tmpfile1=`mktemp -t updateppds.XXXXXX` + tempfiles="$tempfiles $tmpfile1" + grep -E $driverregexp $tmpfile0 > $tmpfile1 || : + cd /etc/cups/ppd + for ppd in *.ppd; do + [ -r "$ppd" ] || continue + queue=${ppd%.ppd} + lpstat -h /var/run/cups/cups.sock -p "$queue" >/dev/null 2>&1 || continue + nickname=`grep '\*NickName:' "$ppd" | cut -d '"' -f 2 | perl -p -e 's/\n$//' | perl -p -e "$gennicknameregexp" | perl -p -e 's/(\W)/\\\\$1/g'` + lang=`grep '\*LanguageVersion:' "$ppd" | cut -d ' ' -f 2 | perl -e 'print lc(<>)' | perl -p -e 's/[\r\n]//gs'` + ppdfound="0" + englishppduri="" + tmpfile2=`mktemp -t updateppds.XXXXXX` + tempfiles="$tempfiles $tmpfile2" + cat $tmpfile1 | perl -p -e "$gennicknameregexp; s/\n*$/\n/s" | grep -E '^\S+\s+.*'"$nickname"'$' | cut -d ' ' -f 1 > $tmpfile2 + while read newppduri; do + [ "$ppdfound" = "0" ] && lpadmin -h /var/run/cups/cups.sock -p "$queue" -m $newppduri 2>/dev/null || continue + newlang=`grep '\*LanguageVersion:' "$ppd" | cut -d ' ' -f 2 | perl -e 'print lc(<>)' | perl -p -e 's/[\r\n]//gs'` + [ "$newlang" = "$lang" ] && ppdfound="1" + [ "$newlang" = "english" ] && englishppduri="$newppduri" + done < $tmpfile2 + [ "$ppdfound" = "0" ] && [ ! -z "$englishppduri" ] && lpadmin -h /var/run/cups/cups.sock -p "$queue" -m $englishppduri 2>/dev/null && ppdfound="1" + [ "$ppdfound" = "1" ] && echo PPD for printer $queue updated >&2 + done + return 0 +} + +# Do the following only if CUPS is running and the needed CUPS tools +# are available +if which lpstat > /dev/null 2>&1 && \ + which lpinfo > /dev/null 2>&1 && \ + which lpadmin > /dev/null 2>&1 && \ + LC_ALL=C lpstat -h /var/run/cups/cups.sock -r | grep -v not > /dev/null 2>&1; then + + tempfiles= + trap 'rm -f $tempfiles; exit 0' 0 HUP INT QUIT ILL ABRT PIPE TERM + tmpfile0=`mktemp -t updateppds.XXXXXX` + tempfiles="$tempfiles $tmpfile0" + + lpinfo -h /var/run/cups/cups.sock -m > $tmpfile0 + + if [ "$1" = configure ] ; then + # Update CUPS included drivers' queues + echo "Updating PPD files for cups ..." + ppd_updater 'lsb/usr/cups-included/|drv:///sample.drv/' 's/,\s*\d+\.\d+[\d\.]*$//i' + fi + if [ "$1" = triggered ] || [ "$1" = configure ] ; then + # Update external drivers' queues. + # + # We log the modification dates of the file in + # /usr/share/cups/ppd-updaters/* after updating the PPDs + # according to them. These dates are more or less the creation + # dates of the driver packages. Then we only update the PPDs of + # packages, where the /usr/share/cups/ppd-updaters/* file has a + # modification date different to the logged date as this means + # that a fresh /usr/share/cups/ppd-updaters/* file and + # therefore a fresh package got installed. This avoids updating + # of PPDs when the corresponding package was not changed. + logfile=/var/cache/cups/ppd-updates + touch $logfile + for driverfile in `ls /usr/share/cups/ppd-updaters`; do + driver=`echo $driverfile | perl -p -e 's/\.ppd-updater$//' | perl -p -e 's/^printer-driver-//'` + modtime=`ls -l --time-style=+%s /usr/share/cups/ppd-updaters/$driverfile | perl -p -e 's/^\s*\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s+(\S+)\s*$/$1\n/'` + oldmodtime=`cat $logfile | grep " $driver$" | cut -d ' ' -f 1` + if [ "$modtime" != "$oldmodtime" ]; then + echo "Updating PPD files for $driver ..." + . /usr/share/cups/ppd-updaters/${driverfile} + ppd_updater "${DRIVER_REGEXP}" "${GENNICKNAME_REGEXP}" + cat $logfile | grep -v " $driver$" > $logfile.new || touch $logfile.new + echo "$modtime $driver" >> $logfile.new + mv $logfile.new $logfile + fi + done + fi +fi + +db_stop +exit 0 diff --git a/debian/cups.postrm b/debian/cups.postrm new file mode 100644 index 0000000..c531136 --- /dev/null +++ b/debian/cups.postrm @@ -0,0 +1,55 @@ +#! /bin/sh +# postrm script for cups +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' overwrit>r> +# for details, see /usr/doc/packaging-manual/ + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +dpkg-maintscript-helper rm_conffile /etc/modprobe.d/blacklist-cups-usblp.conf 1.5.3-2 -- "$@" + +case "$1" in + purge) + rm -rf /var/lib/cups + rm -rf /var/log/cups + rm -rf /var/run/cups + rm -rf /var/cache/cups + rm -rf /var/spool/cups + rm -f /etc/cups/ssl/server.crt + rm -f /etc/cups/ssl/server.key + rm -rf /etc/cups/ssl + rm -rf /etc/cups/interfaces + rm -rf /etc/cups/ppd + rm -rf /etc/cups/passwd.md5 + rm -rf /etc/cups/cups.d + rm -f /etc/cups/printers.conf* /etc/cups/classes.conf.* \ + /var/lib/cups/ppds.dat /etc/cups/raw.convs /etc/cups/raw.types + rmdir /etc/cups 2>/dev/null || true + rm -f /etc/apparmor.d/disable/usr.sbin.cupsd || true + rm -f /etc/apparmor.d/force-complain/usr.sbin.cupsd || true + rm -f /etc/apparmor.d/local/usr.sbin.cupsd || true + rmdir /etc/apparmor.d/local 2>/dev/null || true + ;; + remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 0 + +esac diff --git a/debian/cups.preinst b/debian/cups.preinst new file mode 100644 index 0000000..d09c0ae --- /dev/null +++ b/debian/cups.preinst @@ -0,0 +1,8 @@ +#! /bin/sh +set -e + +dpkg-maintscript-helper rm_conffile /etc/modprobe.d/blacklist-cups-usblp.conf 1.5.3-2 -- "$@" + +#DEBHELPER# + +exit 0 diff --git a/debian/cups.prerm b/debian/cups.prerm new file mode 100644 index 0000000..a087546 --- /dev/null +++ b/debian/cups.prerm @@ -0,0 +1,41 @@ +#! /bin/sh +# prerm script for cups +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove) + (cd /usr/lib/cups/backend && rm -f http https ipp ipp14 ipps lpd socket usb snmp dnssd mdns) + ;; + upgrade|deconfigure) + ;; + failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/cups.templates b/debian/cups.templates new file mode 100644 index 0000000..a33ed75 --- /dev/null +++ b/debian/cups.templates @@ -0,0 +1,31 @@ +# These templates have been reviewed by debian-l10n-english +# Please do not modify them without asking for a review + +Template: cupsys/raw-print +Type: boolean +Default: true +_Description: Do you want CUPS to print unknown jobs as raw jobs? + The Internet Printing Protocol (IPP) enforces a MIME type for all + print jobs. Since not all sources of print jobs can attach an + appropriate type, many jobs get submitted as the MIME type + application/octet-stream and could be rejected if CUPS cannot guess + the job's format. + . + CUPS can handle all such jobs as "raw" jobs, which causes them to be + sent directly to the printer without processing. + . + It is recommended to choose this option if the server will be + accepting print jobs from Windows computers or Samba servers. + +Template: cupsys/backend +Type: multiselect +__Choices: ipp, ipp14, lpd, socket, usb, snmp, dnssd +Default: ipp, ipp14, lpd, socket, usb, snmp, dnssd +_Description: Printer communication backends: + CUPS uses backend programs to communicate with the printer device or port. + . + Unfortunately, some backend programs are likely to cause some trouble. + For example, some PPC kernels crash with the parallel backend. + . + Please choose the backend program to be used by CUPS. The default choice + should fit the most common environments. diff --git a/debian/cups.triggers b/debian/cups.triggers new file mode 100644 index 0000000..7c73fe1 --- /dev/null +++ b/debian/cups.triggers @@ -0,0 +1,4 @@ +# Trigger is activated when a driver touches a file named after the binary +# package name containing proper DRIVER_REGEXP and GENNICKNAME_REGEXP shell +# variables in the /usr/share/cups/ppd-updaters/ directory +interest /usr/share/cups/ppd-updaters diff --git a/debian/libcups2-dev.examples b/debian/libcups2-dev.examples new file mode 100644 index 0000000..6c0e1e3 --- /dev/null +++ b/debian/libcups2-dev.examples @@ -0,0 +1 @@ +scripting diff --git a/debian/libcups2-dev.install b/debian/libcups2-dev.install new file mode 100644 index 0000000..f2d6cec --- /dev/null +++ b/debian/libcups2-dev.install @@ -0,0 +1,19 @@ +usr/bin/cups-config +usr/lib/libcups.so +usr/lib/libcups.a +usr/include/cups/adminutil.h +usr/include/cups/array.h +usr/include/cups/backend.h +usr/include/cups/cups.h +usr/include/cups/dir.h +usr/include/cups/file.h +usr/include/cups/http.h +usr/include/cups/ipp.h +usr/include/cups/language.h +usr/include/cups/ppd.h +usr/include/cups/sidechannel.h +usr/include/cups/transcode.h +usr/include/cups/versioning.h +#../../cups/language-private.h usr/include/cups/i18n.h +#usr/share/man/man1/cups-config.1.gz +#usr/share/man/*/man1/cups-config.1.gz diff --git a/debian/libcups2-dev.preinst b/debian/libcups2-dev.preinst new file mode 100644 index 0000000..7908b93 --- /dev/null +++ b/debian/libcups2-dev.preinst @@ -0,0 +1,40 @@ +#! /bin/sh +# preinst script for libcups2-dev +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' + +case "$1" in + install) + ;; + + upgrade) + if [ ! -L /usr/share/doc/libcups2-dev ]; then + rm -rf /usr/share/doc/libcups2-dev + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/libcups2.examples b/debian/libcups2.examples new file mode 100644 index 0000000..43a0cea --- /dev/null +++ b/debian/libcups2.examples @@ -0,0 +1 @@ +debian/client.conf diff --git a/debian/libcups2.install b/debian/libcups2.install new file mode 100644 index 0000000..ac5797f --- /dev/null +++ b/debian/libcups2.install @@ -0,0 +1 @@ +usr/lib/libcups.so.* diff --git a/debian/libcups2.symbols b/debian/libcups2.symbols new file mode 100644 index 0000000..1283355 --- /dev/null +++ b/debian/libcups2.symbols @@ -0,0 +1,310 @@ +libcups.so.2 libcups2 #MINVER# + (optional|regex)"^_pwg.*@Base$" 1.4.0 + (optional|regex)"^_cups.*@Base$" 1.4.0 + (optional|regex)"^_http.*@Base$" 1.4.0 + (optional|regex)"^_ipp.*@Base$" 1.4.0 + (optional|regex)"^_ppd.*@Base$" 1.4.0 + _httpReadGNUTLS@Base 1.4.4-3~ + _httpWriteGNUTLS@Base 1.4.4-3~ + cupsAddDest@Base 1.4.0 + cupsAddOption@Base 1.4.0 + cupsAdminCreateWindowsPPD@Base 1.4.0 + cupsAdminExportSamba@Base 1.4.0 + cupsAdminGetServerSettings@Base 1.4.0 + cupsAdminSetServerSettings@Base 1.4.0 + cupsArrayAdd@Base 1.4.0 + cupsArrayClear@Base 1.4.0 + cupsArrayCount@Base 1.4.0 + cupsArrayCurrent@Base 1.4.0 + cupsArrayDelete@Base 1.4.0 + cupsArrayDup@Base 1.4.0 + cupsArrayFind@Base 1.4.0 + cupsArrayFirst@Base 1.4.0 + cupsArrayGetIndex@Base 1.4.0 + cupsArrayGetInsert@Base 1.4.0 + cupsArrayIndex@Base 1.4.0 + cupsArrayInsert@Base 1.4.0 + cupsArrayLast@Base 1.4.0 + cupsArrayNew2@Base 1.4.0 + cupsArrayNew3@Base 1.5.0 + cupsArrayNew@Base 1.4.0 + cupsArrayNext@Base 1.4.0 + cupsArrayPrev@Base 1.4.0 + cupsArrayRemove@Base 1.4.0 + cupsArrayRestore@Base 1.4.0 + cupsArraySave@Base 1.4.0 + cupsArrayUserData@Base 1.4.0 + cupsBackChannelRead@Base 1.4.0 + cupsBackChannelWrite@Base 1.4.0 + cupsBackendDeviceURI@Base 1.4.0 + cupsBackendReport@Base 1.4.0 + cupsCancelJob2@Base 1.4.0 + cupsCancelJob@Base 1.4.0 + cupsCharsetToUTF8@Base 1.4.0 + cupsCreateJob@Base 1.4.0 + cupsDirClose@Base 1.4.0 + cupsDirOpen@Base 1.4.0 + cupsDirRead@Base 1.4.0 + cupsDirRewind@Base 1.4.0 + cupsDoAuthentication@Base 1.4.0 + cupsDoFileRequest@Base 1.4.0 + cupsDoIORequest@Base 1.4.0 + cupsDoRequest@Base 1.4.0 + cupsEncodeOptions2@Base 1.4.0 + cupsEncodeOptions@Base 1.4.0 + cupsEncryption@Base 1.4.0 + cupsFileClose@Base 1.4.0 + cupsFileCompression@Base 1.4.0 + cupsFileEOF@Base 1.4.0 + cupsFileFind@Base 1.4.0 + cupsFileFlush@Base 1.4.0 + cupsFileGetChar@Base 1.4.0 + cupsFileGetConf@Base 1.4.0 + cupsFileGetLine@Base 1.4.0 + cupsFileGets@Base 1.4.0 + cupsFileLock@Base 1.4.0 + cupsFileNumber@Base 1.4.0 + cupsFileOpen@Base 1.4.0 + cupsFileOpenFd@Base 1.4.0 + cupsFilePeekChar@Base 1.4.0 + cupsFilePrintf@Base 1.4.0 + cupsFilePutChar@Base 1.4.0 + cupsFilePutConf@Base 1.4.0 + cupsFilePuts@Base 1.4.0 + cupsFileRead@Base 1.4.0 + cupsFileRewind@Base 1.4.0 + cupsFileSeek@Base 1.4.0 + cupsFileStderr@Base 1.4.0 + cupsFileStdin@Base 1.4.0 + cupsFileStdout@Base 1.4.0 + cupsFileTell@Base 1.4.0 + cupsFileUnlock@Base 1.4.0 + cupsFileWrite@Base 1.4.0 + cupsFinishDocument@Base 1.4.0 + cupsFreeDests@Base 1.4.0 + cupsFreeJobs@Base 1.4.0 + cupsFreeOptions@Base 1.4.0 + cupsGetClasses@Base 1.4.0 + cupsGetConflicts@Base 1.4.0 + cupsGetDefault2@Base 1.4.0 + cupsGetDefault@Base 1.4.0 + cupsGetDest@Base 1.4.0 + cupsGetDests2@Base 1.4.0 + cupsGetDests@Base 1.4.0 + cupsGetDevices@Base 1.4.0 + cupsGetFd@Base 1.4.0 + cupsGetFile@Base 1.4.0 + cupsGetJobs2@Base 1.4.0 + cupsGetJobs@Base 1.4.0 + cupsGetNamedDest@Base 1.4.0 + cupsGetOption@Base 1.4.0 + cupsGetPPD2@Base 1.4.0 + cupsGetPPD3@Base 1.4.0 + cupsGetPPD@Base 1.4.0 + cupsGetPassword2@Base 1.4.0 + cupsGetPassword@Base 1.4.0 + cupsGetPrinters@Base 1.4.0 + cupsGetResponse@Base 1.4.0 + cupsGetServerPPD@Base 1.4.0 + cupsLangDefault@Base 1.4.0 + cupsLangEncoding@Base 1.4.0 + cupsLangFlush@Base 1.4.0 + cupsLangFree@Base 1.4.0 + cupsLangGet@Base 1.4.0 + cupsLastError@Base 1.4.0 + cupsLastErrorString@Base 1.4.0 + cupsMarkOptions@Base 1.4.0 + cupsNotifySubject@Base 1.4.0 + cupsNotifyText@Base 1.4.0 + cupsParseOptions@Base 1.4.0 + cupsPrintFile2@Base 1.4.0 + cupsPrintFile@Base 1.4.0 + cupsPrintFiles2@Base 1.4.0 + cupsPrintFiles@Base 1.4.0 + cupsPutFd@Base 1.4.0 + cupsPutFile@Base 1.4.0 + cupsReadResponseData@Base 1.4.0 + cupsRemoveDest@Base 1.4.0 + cupsRemoveOption@Base 1.4.0 + cupsResolveConflicts@Base 1.4.0 + cupsSendRequest@Base 1.4.0 + cupsServer@Base 1.4.0 + cupsSetClientCertCB@Base 1.5.0 + cupsSetCredentials@Base 1.5.0 + cupsSetDefaultDest@Base 1.4.0 + cupsSetDests2@Base 1.4.0 + cupsSetDests@Base 1.4.0 + cupsSetEncryption@Base 1.4.0 + cupsSetPasswordCB2@Base 1.4.0 + cupsSetPasswordCB@Base 1.4.0 + cupsSetServer@Base 1.4.0 + cupsSetServerCertCB@Base 1.5.0 + cupsSetUser@Base 1.4.0 + cupsSideChannelDoRequest@Base 1.4.0 + cupsSideChannelRead@Base 1.4.0 + cupsSideChannelSNMPGet@Base 1.4.0 + cupsSideChannelSNMPWalk@Base 1.4.0 + cupsSideChannelWrite@Base 1.4.0 + cupsStartDocument@Base 1.4.0 + cupsTempFd@Base 1.4.0 + cupsTempFile2@Base 1.4.0 + cupsTempFile@Base 1.4.0 + cupsUTF32ToUTF8@Base 1.4.0 + cupsUTF8ToCharset@Base 1.4.0 + cupsUTF8ToUTF32@Base 1.4.0 + cupsUser@Base 1.4.0 + cupsWriteRequestData@Base 1.4.0 + httpAddCredential@Base 1.5.0 + httpAddrAny@Base 1.4.0 + httpAddrConnect@Base 1.4.0 + httpAddrEqual@Base 1.4.0 + httpAddrFreeList@Base 1.4.0 + httpAddrGetList@Base 1.4.0 + httpAddrLength@Base 1.4.0 + httpAddrLocalhost@Base 1.4.0 + httpAddrLookup@Base 1.4.0 + httpAddrString@Base 1.4.0 + httpAssembleURI@Base 1.4.0 + httpAssembleURIf@Base 1.4.0 + httpBlocking@Base 1.4.0 + httpCheck@Base 1.4.0 + httpClearCookie@Base 1.4.0 + httpClearFields@Base 1.4.0 + httpClose@Base 1.4.0 + httpConnect@Base 1.4.0 + httpConnectEncrypt@Base 1.4.0 + httpCopyCredentials@Base 1.5.0 + httpDecode64@Base 1.4.0 + httpDecode64_2@Base 1.4.0 + httpDelete@Base 1.4.0 + httpEncode64@Base 1.4.0 + httpEncode64_2@Base 1.4.0 + httpEncryption@Base 1.4.0 + httpError@Base 1.4.0 + httpFlush@Base 1.4.0 + httpFlushWrite@Base 1.4.0 + httpFreeCredentials@Base 1.5.0 + httpGet@Base 1.4.0 + httpGetAuthString@Base 1.4.0 + httpGetBlocking@Base 1.4.0 + httpGetCookie@Base 1.4.0 + httpGetDateString2@Base 1.4.0 + httpGetDateString@Base 1.4.0 + httpGetDateTime@Base 1.4.0 + httpGetFd@Base 1.4.0 + httpGetField@Base 1.4.0 + httpGetHostByName@Base 1.4.0 + httpGetHostname@Base 1.4.0 + httpGetLength2@Base 1.4.0 + httpGetLength@Base 1.4.0 + httpGetStatus@Base 1.4.0 + httpGetSubField2@Base 1.4.0 + httpGetSubField@Base 1.4.0 + httpGets@Base 1.4.0 + httpHead@Base 1.4.0 + httpInitialize@Base 1.4.0 + httpMD5@Base 1.4.0 + httpMD5Final@Base 1.4.0 + httpMD5String@Base 1.4.0 + httpOptions@Base 1.4.0 + httpPost@Base 1.4.0 + httpPrintf@Base 1.4.0 + httpPut@Base 1.4.0 + httpRead2@Base 1.4.0 + httpRead@Base 1.4.0 + httpReconnect@Base 1.4.0 + httpSeparate2@Base 1.4.0 + httpSeparate@Base 1.4.0 + httpSeparateURI@Base 1.4.0 + httpSetAuthString@Base 1.4.0 + httpSetCookie@Base 1.4.0 + httpSetCredentials@Base 1.5.0 + httpSetExpect@Base 1.4.0 + httpSetField@Base 1.4.0 + httpSetLength@Base 1.4.0 + httpSetTimeout@Base 1.5.0 + httpStatus@Base 1.4.0 + httpTrace@Base 1.4.0 + httpUpdate@Base 1.4.0 + httpWait@Base 1.4.0 + httpWrite2@Base 1.4.0 + httpWrite@Base 1.4.0 + ippAddBoolean@Base 1.4.0 + ippAddBooleans@Base 1.4.0 + ippAddCollection@Base 1.4.0 + ippAddCollections@Base 1.4.0 + ippAddDate@Base 1.4.0 + ippAddInteger@Base 1.4.0 + ippAddIntegers@Base 1.4.0 + ippAddOctetString@Base 1.4.0 + ippAddRange@Base 1.4.0 + ippAddRanges@Base 1.4.0 + ippAddResolution@Base 1.4.0 + ippAddResolutions@Base 1.4.0 + ippAddSeparator@Base 1.4.0 + ippAddString@Base 1.4.0 + ippAddStrings@Base 1.4.0 + ippDateToTime@Base 1.4.0 + ippDelete@Base 1.4.0 + ippDeleteAttribute@Base 1.4.0 + ippErrorString@Base 1.4.0 + ippErrorValue@Base 1.4.0 + ippFilterPrinters@Base 1.4.0 + ippFindAttribute@Base 1.4.0 + ippFindNextAttribute@Base 1.4.0 + ippLength@Base 1.4.0 + ippNew@Base 1.4.0 + ippNewRequest@Base 1.4.0 + ippOpString@Base 1.4.0 + ippOpValue@Base 1.4.0 + ippPort@Base 1.4.0 + ippRead@Base 1.4.0 + ippReadFile@Base 1.4.0 + ippReadIO@Base 1.4.0 + ippSetPort@Base 1.4.0 + ippTagString@Base 1.4.0 + ippTagValue@Base 1.4.0 + ippTimeToDate@Base 1.4.0 + ippWrite@Base 1.4.0 + ippWriteFile@Base 1.4.0 + ippWriteIO@Base 1.4.0 + ppdClose@Base 1.4.0 + ppdCollect2@Base 1.4.0 + ppdCollect@Base 1.4.0 + ppdConflicts@Base 1.4.0 + ppdEmit@Base 1.4.0 + ppdEmitAfterOrder@Base 1.4.0 + ppdEmitFd@Base 1.4.0 + ppdEmitJCL@Base 1.4.0 + ppdEmitJCLEnd@Base 1.4.0 + ppdEmitString@Base 1.4.0 + ppdErrorString@Base 1.4.0 + ppdFindAttr@Base 1.4.0 + ppdFindChoice@Base 1.4.0 + ppdFindCustomOption@Base 1.4.0 + ppdFindCustomParam@Base 1.4.0 + ppdFindMarkedChoice@Base 1.4.0 + ppdFindNextAttr@Base 1.4.0 + ppdFindOption@Base 1.4.0 + ppdFirstCustomParam@Base 1.4.0 + ppdFirstOption@Base 1.4.0 + ppdInstallableConflict@Base 1.4.0 + ppdIsMarked@Base 1.4.0 + ppdLastError@Base 1.4.0 + ppdLocalize@Base 1.4.0 + ppdLocalizeAttr@Base 1.4.0 + ppdLocalizeIPPReason@Base 1.4.0 + ppdLocalizeMarkerName@Base 1.4.0 + ppdMarkDefaults@Base 1.4.0 + ppdMarkOption@Base 1.4.0 + ppdNextCustomParam@Base 1.4.0 + ppdNextOption@Base 1.4.0 + ppdOpen2@Base 1.4.0 + ppdOpen@Base 1.4.0 + ppdOpenFd@Base 1.4.0 + ppdOpenFile@Base 1.4.0 + ppdPageLength@Base 1.4.0 + ppdPageSize@Base 1.4.0 + ppdPageSizeLimits@Base 1.4.0 + ppdPageWidth@Base 1.4.0 + ppdSetConformance@Base 1.4.0 diff --git a/debian/libcupscgi1-dev.install b/debian/libcupscgi1-dev.install new file mode 100644 index 0000000..1562a9c --- /dev/null +++ b/debian/libcupscgi1-dev.install @@ -0,0 +1,4 @@ +usr/lib/libcupscgi.so +usr/lib/libcupscgi.a +usr/include/cups/cgi.h +usr/include/cups/help-index.h diff --git a/debian/libcupscgi1.install b/debian/libcupscgi1.install new file mode 100644 index 0000000..c010725 --- /dev/null +++ b/debian/libcupscgi1.install @@ -0,0 +1 @@ +usr/lib/libcupscgi.so.* diff --git a/debian/libcupscgi1.symbols b/debian/libcupscgi1.symbols new file mode 100644 index 0000000..b99c373 --- /dev/null +++ b/debian/libcupscgi1.symbols @@ -0,0 +1,43 @@ +libcupscgi.so.1 libcupscgi1 #MINVER# + cgiCheckVariables@Base 1.4.0 + cgiClearVariables@Base 1.4.2 + cgiCompileSearch@Base 1.4.0 + cgiCopyTemplateFile@Base 1.4.0 + cgiCopyTemplateLang@Base 1.4.0 + cgiDoSearch@Base 1.4.0 + cgiEndHTML@Base 1.4.0 + cgiEndMultipart@Base 1.4.0 + cgiFormEncode@Base 1.4.0 + cgiFreeSearch@Base 1.4.0 + cgiGetArray@Base 1.4.0 + cgiGetAttributes@Base 1.4.0 + cgiGetCookie@Base 1.4.4 + cgiGetFile@Base 1.4.0 + cgiGetIPPObjects@Base 1.4.0 + cgiGetSize@Base 1.4.0 + cgiGetTemplateDir@Base 1.4.0 + cgiGetVariable@Base 1.4.0 + cgiInitialize@Base 1.4.0 + cgiIsPOST@Base 1.4.0 + cgiMoveJobs@Base 1.4.0 + cgiPrintCommand@Base 1.4.0 + cgiPrintTestPage@Base 1.4.0 + cgiRewriteURL@Base 1.4.0 + cgiSetArray@Base 1.4.0 + cgiSetCookie@Base 1.4.4 + cgiSetIPPObjectVars@Base 1.4.0 + cgiSetIPPVars@Base 1.4.0 + cgiSetServerVersion@Base 1.4.0 + cgiSetSize@Base 1.4.0 + cgiSetVariable@Base 1.4.0 + cgiShowIPPError@Base 1.4.0 + cgiShowJobs@Base 1.4.0 + cgiStartHTML@Base 1.4.0 + cgiStartMultipart@Base 1.4.0 + cgiSupportsMultipart@Base 1.4.0 + cgiText@Base 1.4.0 + helpDeleteIndex@Base 1.4.0 + helpFindNode@Base 1.4.0 + helpLoadIndex@Base 1.4.0 + helpSaveIndex@Base 1.4.0 + helpSearchIndex@Base 1.4.0 diff --git a/debian/libcupsdriver1-dev.install b/debian/libcupsdriver1-dev.install new file mode 100644 index 0000000..1ae5bbd --- /dev/null +++ b/debian/libcupsdriver1-dev.install @@ -0,0 +1,3 @@ +usr/lib/libcupsdriver.so +usr/lib/libcupsdriver.a +usr/include/cups/driver.h diff --git a/debian/libcupsdriver1.install b/debian/libcupsdriver1.install new file mode 100644 index 0000000..0b2792b --- /dev/null +++ b/debian/libcupsdriver1.install @@ -0,0 +1 @@ +usr/lib/libcupsdriver.so.* diff --git a/debian/libcupsdriver1.symbols b/debian/libcupsdriver1.symbols new file mode 100644 index 0000000..361f781 --- /dev/null +++ b/debian/libcupsdriver1.symbols @@ -0,0 +1,33 @@ +libcupsdriver.so.1 libcupsdriver1 #MINVER# + cupsCMYKDelete@Base 1.4.0 + cupsCMYKDoBlack@Base 1.4.0 + cupsCMYKDoCMYK@Base 1.4.0 + cupsCMYKDoGray@Base 1.4.0 + cupsCMYKDoRGB@Base 1.4.0 + cupsCMYKLoad@Base 1.4.0 + cupsCMYKNew@Base 1.4.0 + cupsCMYKSetBlack@Base 1.4.0 + cupsCMYKSetCurve@Base 1.4.0 + cupsCMYKSetGamma@Base 1.4.0 + cupsCMYKSetInkLimit@Base 1.4.0 + cupsCMYKSetLtDk@Base 1.4.0 + cupsCheckBytes@Base 1.4.0 + cupsCheckValue@Base 1.4.0 + cupsDitherDelete@Base 1.4.0 + cupsDitherLine@Base 1.4.0 + cupsDitherNew@Base 1.4.0 + cupsFindAttr@Base 1.4.0 + cupsLutDelete@Base 1.4.0 + cupsLutLoad@Base 1.4.0 + cupsLutNew@Base 1.4.0 + cupsPackHorizontal2@Base 1.4.0 + cupsPackHorizontal@Base 1.4.0 + cupsPackHorizontalBit@Base 1.4.0 + cupsPackVertical@Base 1.4.0 + cupsRGBDelete@Base 1.4.0 + cupsRGBDoGray@Base 1.4.0 + cupsRGBDoRGB@Base 1.4.0 + cupsRGBLoad@Base 1.4.0 + cupsRGBNew@Base 1.4.0 + cups_scmy_lut@Base 1.4.0 + cups_srgb_lut@Base 1.4.0 diff --git a/debian/libcupsimage2-dev.install b/debian/libcupsimage2-dev.install new file mode 100644 index 0000000..c910994 --- /dev/null +++ b/debian/libcupsimage2-dev.install @@ -0,0 +1,4 @@ +usr/lib/libcupsimage.so +usr/lib/libcupsimage.a +usr/include/cups/image.h +usr/include/cups/raster.h diff --git a/debian/libcupsimage2-dev.preinst b/debian/libcupsimage2-dev.preinst new file mode 100644 index 0000000..718b7d3 --- /dev/null +++ b/debian/libcupsimage2-dev.preinst @@ -0,0 +1,40 @@ +#! /bin/sh +# preinst script for libcupsimage2-dev +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' + +case "$1" in + install) + ;; + + upgrade) + if [ ! -L /usr/share/doc/libcupsimage2-dev ]; then + rm -rf /usr/share/doc/libcupsimage2-dev + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/libcupsimage2.install b/debian/libcupsimage2.install new file mode 100644 index 0000000..2c8aa9b --- /dev/null +++ b/debian/libcupsimage2.install @@ -0,0 +1 @@ +usr/lib/libcupsimage.so.* diff --git a/debian/libcupsimage2.preinst b/debian/libcupsimage2.preinst new file mode 100644 index 0000000..df9374c --- /dev/null +++ b/debian/libcupsimage2.preinst @@ -0,0 +1,40 @@ +#! /bin/sh +# preinst script for libcupsimage2 +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' + +case "$1" in + install) + ;; + + upgrade) + if [ ! -L /usr/share/doc/libcupsimage2 ]; then + rm -rf /usr/share/doc/libcupsimage2 + fi + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/debian/libcupsimage2.symbols b/debian/libcupsimage2.symbols new file mode 100644 index 0000000..7482f6e --- /dev/null +++ b/debian/libcupsimage2.symbols @@ -0,0 +1,47 @@ +libcupsimage.so.2 libcupsimage2 #MINVER# + (optional|regex)|^_cups.*@Base$" 1.4.0 + cupsImageCMYKToBlack@Base 1.4.0 + cupsImageCMYKToCMY@Base 1.4.0 + cupsImageCMYKToCMYK@Base 1.4.0 + cupsImageCMYKToRGB@Base 1.4.0 + cupsImageCMYKToWhite@Base 1.4.0 + cupsImageClose@Base 1.4.0 + cupsImageGetCol@Base 1.4.0 + cupsImageGetColorSpace@Base 1.4.0 + cupsImageGetDepth@Base 1.4.0 + cupsImageGetHeight@Base 1.4.0 + cupsImageGetRow@Base 1.4.0 + cupsImageGetWidth@Base 1.4.0 + cupsImageGetXPPI@Base 1.4.0 + cupsImageGetYPPI@Base 1.4.0 + cupsImageLut@Base 1.4.0 + cupsImageOpen@Base 1.4.0 + cupsImageRGBAdjust@Base 1.4.0 + cupsImageRGBToBlack@Base 1.4.0 + cupsImageRGBToCMY@Base 1.4.0 + cupsImageRGBToCMYK@Base 1.4.0 + cupsImageRGBToRGB@Base 1.4.0 + cupsImageRGBToWhite@Base 1.4.0 + cupsImageSetMaxTiles@Base 1.4.0 + cupsImageSetProfile@Base 1.4.0 + cupsImageSetRasterColorSpace@Base 1.4.0 + cupsImageWhiteToBlack@Base 1.4.0 + cupsImageWhiteToCMY@Base 1.4.0 + cupsImageWhiteToCMYK@Base 1.4.0 + cupsImageWhiteToRGB@Base 1.4.0 + cupsImageWhiteToWhite@Base 1.4.0 + cupsRasterClose@Base 1.4.0 + cupsRasterErrorString@Base 1.4.0 + cupsRasterInterpretPPD@Base 1.4.0 + cupsRasterOpen@Base 1.4.0 + cupsRasterReadHeader2@Base 1.4.0 + cupsRasterReadHeader@Base 1.4.0 + cupsRasterReadPixels@Base 1.4.0 + cupsRasterWriteHeader2@Base 1.4.0 + cupsRasterWriteHeader@Base 1.4.0 + cupsRasterWritePixels@Base 1.4.0 + sgiClose@Base 1.4.0 + sgiGetRow@Base 1.4.0 + sgiOpen@Base 1.4.0 + sgiOpenFile@Base 1.4.0 + sgiPutRow@Base 1.4.0 diff --git a/debian/libcupsmime1-dev.install b/debian/libcupsmime1-dev.install new file mode 100644 index 0000000..b94c318 --- /dev/null +++ b/debian/libcupsmime1-dev.install @@ -0,0 +1,3 @@ +usr/lib/libcupsmime.so +usr/lib/libcupsmime.a +usr/include/cups/mime.h diff --git a/debian/libcupsmime1.install b/debian/libcupsmime1.install new file mode 100644 index 0000000..a55b45a --- /dev/null +++ b/debian/libcupsmime1.install @@ -0,0 +1 @@ +usr/lib/libcupsmime.so.* diff --git a/debian/libcupsmime1.symbols b/debian/libcupsmime1.symbols new file mode 100644 index 0000000..1161929 --- /dev/null +++ b/debian/libcupsmime1.symbols @@ -0,0 +1,24 @@ +libcupsmime.so.1 libcupsmime1 #MINVER# + _mimeError@Base 1.5.0 + mimeAddFilter@Base 1.4.0 + mimeAddType@Base 1.4.0 + mimeAddTypeRule@Base 1.4.0 + mimeDelete@Base 1.4.0 + mimeDeleteFilter@Base 1.4.0 + mimeDeleteType@Base 1.4.0 + mimeFileType@Base 1.4.0 + mimeFilter2@Base 1.5.0 + mimeFilter@Base 1.4.0 + mimeFilterLookup@Base 1.4.0 + mimeFirstFilter@Base 1.4.0 + mimeFirstType@Base 1.4.0 + mimeLoad@Base 1.4.0 + mimeLoadFilters@Base 1.4.0 + mimeLoadTypes@Base 1.4.0 + mimeNew@Base 1.5.0 + mimeNextFilter@Base 1.4.0 + mimeNextType@Base 1.4.0 + mimeNumFilters@Base 1.4.0 + mimeNumTypes@Base 1.4.0 + mimeSetErrorCallback@Base 1.5.0 + mimeType@Base 1.4.0 diff --git a/debian/libcupsppdc1-dev.install b/debian/libcupsppdc1-dev.install new file mode 100644 index 0000000..0122869 --- /dev/null +++ b/debian/libcupsppdc1-dev.install @@ -0,0 +1,3 @@ +usr/lib/libcupsppdc.so +usr/lib/libcupsppdc.a +usr/include/cups/ppdc.h diff --git a/debian/libcupsppdc1.install b/debian/libcupsppdc1.install new file mode 100644 index 0000000..f48c513 --- /dev/null +++ b/debian/libcupsppdc1.install @@ -0,0 +1 @@ +usr/lib/libcupsppdc.so.* diff --git a/debian/libcupsppdc1.symbols b/debian/libcupsppdc1.symbols new file mode 100644 index 0000000..05dcef4 --- /dev/null +++ b/debian/libcupsppdc1.symbols @@ -0,0 +1,232 @@ +libcupsppdc.so.1 libcupsppdc1 #MINVER# + _ZN10ppdcChoice10class_nameEv@Base 1.4.0 + _ZN10ppdcChoiceC1EPKcS1_S1_@Base 1.4.0 + _ZN10ppdcChoiceC2EPKcS1_S1_@Base 1.4.0 + _ZN10ppdcChoiceD0Ev@Base 1.4.0 + _ZN10ppdcChoiceD1Ev@Base 1.4.0 + _ZN10ppdcChoiceD2Ev@Base 1.4.0 + _ZN10ppdcDriver10class_nameEv@Base 1.4.0 + _ZN10ppdcDriver10find_groupEPKc@Base 1.4.0 + _ZN10ppdcDriver11find_optionEPKc@Base 1.4.0 + _ZN10ppdcDriver11set_versionEPKc@Base 1.4.0 + _ZN10ppdcDriver13set_file_nameEPKc@Base 1.4.0 + _ZN10ppdcDriver14set_model_nameEPKc@Base 1.4.0 + _ZN10ppdcDriver14write_ppd_fileEP12_cups_file_sP11ppdcCatalogP9ppdcArrayP10ppdcSource14ppdcLineEnding@Base 1.4.0 + _ZN10ppdcDriver16set_default_fontEP8ppdcFont@Base 1.4.0 + _ZN10ppdcDriver16set_default_sizeEP13ppdcMediaSize@Base 1.4.0 + _ZN10ppdcDriver16set_manufacturerEPKc@Base 1.4.0 + _ZN10ppdcDriver16set_pc_file_nameEPKc@Base 1.4.0 + _ZN10ppdcDriver17find_option_groupEPKcPP9ppdcGroup@Base 1.4.0 + _ZN10ppdcDriver20set_custom_size_codeEPKc@Base 1.4.0 + _ZN10ppdcDriver9find_attrEPKcS1_@Base 1.4.0 + _ZN10ppdcDriverC1EPS_@Base 1.4.0 + _ZN10ppdcDriverC2EPS_@Base 1.4.0 + _ZN10ppdcDriverD0Ev@Base 1.4.0 + _ZN10ppdcDriverD1Ev@Base 1.4.0 + _ZN10ppdcDriverD2Ev@Base 1.4.0 + _ZN10ppdcFilter10class_nameEv@Base 1.4.0 + _ZN10ppdcFilterC1EPKcS1_i@Base 1.4.0 + _ZN10ppdcFilterC2EPKcS1_i@Base 1.4.0 + _ZN10ppdcFilterD0Ev@Base 1.4.0 + _ZN10ppdcFilterD1Ev@Base 1.4.0 + _ZN10ppdcFilterD2Ev@Base 1.4.0 + (optional)_ZN10ppdcOption10add_choiceEP10ppdcChoice@Base 1.5.3 + _ZN10ppdcOption10class_nameEv@Base 1.4.0 + _ZN10ppdcOption11find_choiceEPKc@Base 1.4.0 + _ZN10ppdcOption13set_defchoiceEP10ppdcChoice@Base 1.4.0 + _ZN10ppdcOptionC1E11ppdcOptTypePKcS2_14ppdcOptSectionf@Base 1.4.0 + _ZN10ppdcOptionC1EPS_@Base 1.4.0 + _ZN10ppdcOptionC2E11ppdcOptTypePKcS2_14ppdcOptSectionf@Base 1.4.0 + _ZN10ppdcOptionC2EPS_@Base 1.4.0 + _ZN10ppdcOptionD0Ev@Base 1.4.0 + _ZN10ppdcOptionD1Ev@Base 1.4.0 + _ZN10ppdcOptionD2Ev@Base 1.4.0 + _ZN10ppdcShared6retainEv@Base 1.4.0 + _ZN10ppdcShared7releaseEv@Base 1.4.0 + _ZN10ppdcSharedC1Ev@Base 1.4.0 + _ZN10ppdcSharedC2Ev@Base 1.4.0 + _ZN10ppdcSharedD0Ev@Base 1.4.0 + _ZN10ppdcSharedD1Ev@Base 1.4.0 + _ZN10ppdcSharedD2Ev@Base 1.4.0 + _ZN10ppdcSource10class_nameEv@Base 1.4.0 + _ZN10ppdcSource10get_choiceEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource10get_duplexEP8ppdcFileP10ppdcDriver@Base 1.4.0 + _ZN10ppdcSource10get_filterEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource10get_optionEP8ppdcFileP10ppdcDriverP9ppdcGroup@Base 1.4.0 + _ZN10ppdcSource10import_ppdEPKc@Base 1.4.0 + _ZN10ppdcSource10write_fileEPKc@Base 1.4.0 + _ZN10ppdcSource11add_includeEPKc@Base 1.4.0 + _ZN10ppdcSource11find_driverEPKc@Base 1.4.0 + _ZN10ppdcSource11get_booleanEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource11get_genericEP8ppdcFilePKcS3_S3_@Base 1.4.0 + _ZN10ppdcSource11get_integerEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource11get_integerEPKc@Base 1.4.0 + _ZN10ppdcSource12driver_typesE@Base 1.4.0 + _ZN10ppdcSource12find_includeEPKcS1_Pci@Base 1.4.0 + _ZN10ppdcSource12get_variableEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource12set_variableEPKcS1_@Base 1.4.0 + _ZN10ppdcSource13find_variableEPKc@Base 1.4.0 + _ZN10ppdcSource14get_constraintEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource14get_resolutionEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource15get_color_modelEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource15get_color_orderEPKc@Base 1.4.0 + _ZN10ppdcSource15get_color_spaceEPKc@Base 1.4.0 + _ZN10ppdcSource15get_custom_sizeEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource15get_installableEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource15get_measurementEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource17get_color_profileEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource18get_simple_profileEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource6get_poEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource6quotefEP12_cups_file_sPKcz@Base 1.4.0 + _ZN10ppdcSource7find_poEPKc@Base 1.4.0 + _ZN10ppdcSource8get_attrEP8ppdcFileb@Base 1.4.0 + _ZN10ppdcSource8get_fontEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource8get_sizeEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource8includesE@Base 1.4.0 + _ZN10ppdcSource9find_sizeEPKc@Base 1.4.0 + _ZN10ppdcSource9get_floatEP8ppdcFile@Base 1.4.0 + _ZN10ppdcSource9get_groupEP8ppdcFileP10ppdcDriver@Base 1.4.0 + _ZN10ppdcSource9get_tokenEP8ppdcFilePci@Base 1.4.0 + _ZN10ppdcSource9read_fileEPKcP12_cups_file_s@Base 1.4.0 + _ZN10ppdcSource9scan_fileEP8ppdcFileP10ppdcDriverb@Base 1.4.0 + _ZN10ppdcSourceC1EPKcP12_cups_file_s@Base 1.4.0 + _ZN10ppdcSourceC2EPKcP12_cups_file_s@Base 1.4.0 + _ZN10ppdcSourceD0Ev@Base 1.4.0 + _ZN10ppdcSourceD1Ev@Base 1.4.0 + _ZN10ppdcSourceD2Ev@Base 1.4.0 + _ZN10ppdcString10class_nameEv@Base 1.4.0 + _ZN10ppdcStringC1EPKc@Base 1.4.0 + _ZN10ppdcStringC2EPKc@Base 1.4.0 + _ZN10ppdcStringD0Ev@Base 1.4.0 + _ZN10ppdcStringD1Ev@Base 1.4.0 + _ZN10ppdcStringD2Ev@Base 1.4.0 + _ZN11ppdcCatalog10class_nameEv@Base 1.4.0 + _ZN11ppdcCatalog11add_messageEPKcS1_@Base 1.4.0 + _ZN11ppdcCatalog12find_messageEPKc@Base 1.4.0 + _ZN11ppdcCatalog13load_messagesEPKc@Base 1.4.0 + _ZN11ppdcCatalog13save_messagesEPKc@Base 1.4.0 + _ZN11ppdcCatalogC1EPKcS1_@Base 1.4.0 + _ZN11ppdcCatalogC2EPKcS1_@Base 1.4.0 + _ZN11ppdcCatalogD0Ev@Base 1.4.0 + _ZN11ppdcCatalogD1Ev@Base 1.4.0 + _ZN11ppdcCatalogD2Ev@Base 1.4.0 + _ZN11ppdcMessage10class_nameEv@Base 1.4.0 + _ZN11ppdcMessageC1EPKcS1_@Base 1.4.0 + _ZN11ppdcMessageC2EPKcS1_@Base 1.4.0 + _ZN11ppdcMessageD0Ev@Base 1.4.0 + _ZN11ppdcMessageD1Ev@Base 1.4.0 + _ZN11ppdcMessageD2Ev@Base 1.4.0 + _ZN11ppdcProfile10class_nameEv@Base 1.4.0 + _ZN11ppdcProfileC1EPKcS1_ffPKf@Base 1.4.0 + _ZN11ppdcProfileC2EPKcS1_ffPKf@Base 1.4.0 + _ZN11ppdcProfileD0Ev@Base 1.4.0 + _ZN11ppdcProfileD1Ev@Base 1.4.0 + _ZN11ppdcProfileD2Ev@Base 1.4.0 + _ZN12ppdcVariable10class_nameEv@Base 1.4.0 + _ZN12ppdcVariable9set_valueEPKc@Base 1.4.0 + _ZN12ppdcVariableC1EPKcS1_@Base 1.4.0 + _ZN12ppdcVariableC2EPKcS1_@Base 1.4.0 + _ZN12ppdcVariableD0Ev@Base 1.4.0 + _ZN12ppdcVariableD1Ev@Base 1.4.0 + _ZN12ppdcVariableD2Ev@Base 1.4.0 + _ZN13ppdcMediaSize10class_nameEv@Base 1.4.0 + _ZN13ppdcMediaSizeC1EPKcS1_ffffffS1_S1_@Base 1.4.0 + _ZN13ppdcMediaSizeC2EPKcS1_ffffffS1_S1_@Base 1.4.0 + _ZN13ppdcMediaSizeD0Ev@Base 1.4.0 + _ZN13ppdcMediaSizeD1Ev@Base 1.4.0 + _ZN13ppdcMediaSizeD2Ev@Base 1.4.0 + _ZN14ppdcConstraint10class_nameEv@Base 1.4.0 + _ZN14ppdcConstraintC1EPKcS1_S1_S1_@Base 1.4.0 + _ZN14ppdcConstraintC2EPKcS1_S1_S1_@Base 1.4.0 + _ZN14ppdcConstraintD0Ev@Base 1.4.0 + _ZN14ppdcConstraintD1Ev@Base 1.4.0 + _ZN14ppdcConstraintD2Ev@Base 1.4.0 + _ZN8ppdcAttr10class_nameEv@Base 1.4.0 + _ZN8ppdcAttrC1EPKcS1_S1_S1_b@Base 1.4.0 + _ZN8ppdcAttrC2EPKcS1_S1_S1_b@Base 1.4.0 + _ZN8ppdcAttrD0Ev@Base 1.4.0 + _ZN8ppdcAttrD1Ev@Base 1.4.0 + _ZN8ppdcAttrD2Ev@Base 1.4.0 + _ZN8ppdcFile3getEv@Base 1.4.0 + _ZN8ppdcFile4peekEv@Base 1.4.0 + _ZN8ppdcFileC1EPKcP12_cups_file_s@Base 1.4.0 + _ZN8ppdcFileC2EPKcP12_cups_file_s@Base 1.4.0 + _ZN8ppdcFileD1Ev@Base 1.4.0 + _ZN8ppdcFileD2Ev@Base 1.4.0 + _ZN8ppdcFont10class_nameEv@Base 1.4.0 + _ZN8ppdcFontC1EPKcS1_S1_S1_14ppdcFontStatus@Base 1.4.0 + _ZN8ppdcFontC2EPKcS1_S1_S1_14ppdcFontStatus@Base 1.4.0 + _ZN8ppdcFontD0Ev@Base 1.4.0 + _ZN8ppdcFontD1Ev@Base 1.4.0 + _ZN8ppdcFontD2Ev@Base 1.4.0 + _ZN9ppdcArray10class_nameEv@Base 1.4.0 + _ZN9ppdcArray3addEP10ppdcShared@Base 1.4.0 + _ZN9ppdcArray4nextEv@Base 1.4.0 + _ZN9ppdcArray5firstEv@Base 1.4.0 + _ZN9ppdcArray6removeEP10ppdcShared@Base 1.4.0 + _ZN9ppdcArrayC1EPS_@Base 1.4.0 + _ZN9ppdcArrayC2EPS_@Base 1.4.0 + _ZN9ppdcArrayD0Ev@Base 1.4.0 + _ZN9ppdcArrayD1Ev@Base 1.4.0 + _ZN9ppdcArrayD2Ev@Base 1.4.0 + (optional)_ZN9ppdcGroup10add_optionEP10ppdcOption@Base 1.5.3 + _ZN9ppdcGroup10class_nameEv@Base 1.4.0 + _ZN9ppdcGroup11find_optionEPKc@Base 1.4.0 + _ZN9ppdcGroupC1EPKcS1_@Base 1.4.0 + _ZN9ppdcGroupC1EPS_@Base 1.4.0 + _ZN9ppdcGroupC2EPKcS1_@Base 1.4.0 + _ZN9ppdcGroupC2EPS_@Base 1.4.0 + _ZN9ppdcGroupD0Ev@Base 1.4.0 + _ZN9ppdcGroupD1Ev@Base 1.4.0 + _ZN9ppdcGroupD2Ev@Base 1.4.0 + _ZTI10ppdcChoice@Base 1.4.0 + _ZTI10ppdcDriver@Base 1.4.0 + _ZTI10ppdcFilter@Base 1.4.0 + _ZTI10ppdcOption@Base 1.4.0 + _ZTI10ppdcShared@Base 1.4.0 + _ZTI10ppdcSource@Base 1.4.0 + _ZTI10ppdcString@Base 1.4.0 + _ZTI11ppdcCatalog@Base 1.4.0 + _ZTI11ppdcMessage@Base 1.4.0 + _ZTI11ppdcProfile@Base 1.4.0 + _ZTI12ppdcVariable@Base 1.4.0 + _ZTI13ppdcMediaSize@Base 1.4.0 + _ZTI14ppdcConstraint@Base 1.4.0 + _ZTI8ppdcAttr@Base 1.4.0 + _ZTI8ppdcFont@Base 1.4.0 + _ZTI9ppdcArray@Base 1.4.0 + _ZTI9ppdcGroup@Base 1.4.0 + _ZTS10ppdcChoice@Base 1.4.0 + _ZTS10ppdcDriver@Base 1.4.0 + _ZTS10ppdcFilter@Base 1.4.0 + _ZTS10ppdcOption@Base 1.4.0 + _ZTS10ppdcShared@Base 1.4.0 + _ZTS10ppdcSource@Base 1.4.0 + _ZTS10ppdcString@Base 1.4.0 + _ZTS11ppdcCatalog@Base 1.4.0 + _ZTS11ppdcMessage@Base 1.4.0 + _ZTS11ppdcProfile@Base 1.4.0 + _ZTS12ppdcVariable@Base 1.4.0 + _ZTS13ppdcMediaSize@Base 1.4.0 + _ZTS14ppdcConstraint@Base 1.4.0 + _ZTS8ppdcAttr@Base 1.4.0 + _ZTS8ppdcFont@Base 1.4.0 + _ZTS9ppdcArray@Base 1.4.0 + _ZTS9ppdcGroup@Base 1.4.0 + _ZTV10ppdcChoice@Base 1.4.0 + _ZTV10ppdcDriver@Base 1.4.0 + _ZTV10ppdcFilter@Base 1.4.0 + _ZTV10ppdcOption@Base 1.4.0 + _ZTV10ppdcShared@Base 1.4.0 + _ZTV10ppdcSource@Base 1.4.0 + _ZTV10ppdcString@Base 1.4.0 + _ZTV11ppdcCatalog@Base 1.4.0 + _ZTV11ppdcMessage@Base 1.4.0 + _ZTV11ppdcProfile@Base 1.4.0 + _ZTV12ppdcVariable@Base 1.4.0 + _ZTV13ppdcMediaSize@Base 1.4.0 + _ZTV14ppdcConstraint@Base 1.4.0 + _ZTV8ppdcAttr@Base 1.4.0 + _ZTV8ppdcFont@Base 1.4.0 + _ZTV9ppdcArray@Base 1.4.0 + _ZTV9ppdcGroup@Base 1.4.0 diff --git a/debian/local/apparmor-profile b/debian/local/apparmor-profile new file mode 100644 index 0000000..ad5c84f --- /dev/null +++ b/debian/local/apparmor-profile @@ -0,0 +1,173 @@ +# vim:syntax=apparmor +# Last Modified: Thu Aug 2 12:54:46 2007 +# Author: Martin Pitt + +#include + +/usr/sbin/cupsd { + #include + #include + #include + #include + #include + #include + #include + #include + + capability chown, + capability fowner, + capability fsetid, + capability kill, + capability net_bind_service, + capability setgid, + capability setuid, + + # nasty, but we limit file access pretty tightly, and cups chowns a + # lot of files to 'lp' which it cannot read/write afterwards any + # more + capability dac_override, + + # the bluetooth backend needs this + network bluetooth, + + # the dnssd backend uses those + network x25 seqpacket, + network ax25 dgram, + network netrom seqpacket, + network rose dgram, + network ipx dgram, + network appletalk dgram, + network econet dgram, + network ash dgram, + + /bin/bash ixr, + /bin/dash ixr, + /bin/hostname ixr, + /dev/lp* rw, + deny /dev/tty rw, # silence noise + /dev/ttyS* rw, + /dev/ttyUSB* rw, + /dev/usb/lp* rw, + /dev/bus/usb/ r, + /dev/bus/usb/** rw, + /dev/parport* rw, + /etc/cups/ rw, + /etc/cups/** rw, + /etc/foomatic/* r, + /etc/gai.conf r, + /etc/papersize r, + /etc/pnm2ppa.conf r, + /etc/printcap rwl, + /etc/ssl/** r, + @{PROC}/net/ r, + @{PROC}/net/* r, + @{PROC}/sys/dev/parport/** r, + @{PROC}/*/net/ r, + @{PROC}/*/net/** r, + @{PROC}/*/auxv r, + @{PROC}/sys/crypto/** r, + /sys/** r, + /usr/bin/* ixr, + /usr/sbin/* ixr, + /bin/* ixr, + /sbin/* ixr, + /usr/lib/** rm, + + # backends which come with CUPS can be confined + /usr/lib/cups/backend/bluetooth ixr, + /usr/lib/cups/backend/dnssd ixr, + /usr/lib/cups/backend/http ixr, + /usr/lib/cups/backend/ipp ixr, + /usr/lib/cups/backend/lpd ixr, + /usr/lib/cups/backend/parallel ixr, + /usr/lib/cups/backend/serial ixr, + /usr/lib/cups/backend/snmp ixr, + /usr/lib/cups/backend/socket ixr, + /usr/lib/cups/backend/usb ixr, + # we treat cups-pdf specially, since it needs to write into /home + # and thus needs extra paranoia + /usr/lib/cups/backend/cups-pdf Px, + # third party backends get no restrictions as they often need high + # privileges and this is beyond our control + /usr/lib/cups/backend/* Ux, + + /usr/lib/cups/cgi-bin/* ixr, + /usr/lib/cups/daemon/* ixr, + /usr/lib/cups/monitor/* ixr, + /usr/lib/cups/notifier/* ixr, + # filters and drivers (PPD generators) are always run as non-root, + # and there are a lot of third-party drivers which we cannot predict + /usr/lib/cups/filter/** Uxr, + /usr/lib/cups/driver/* Uxr, + /usr/local/** rm, + /usr/local/lib/cups/** rix, + /usr/share/** r, + /{,var/}run/** rm, + /{,var/}run/avahi-daemon/socket rw, + deny /{,var/}run/samba/ rw, + /{,var/}run/samba/** rw, + /{,var/}run/cups/ rw, + /{,var/}run/cups/** rw, + /var/cache/cups/ rw, + /var/cache/cups/** rwk, + /var/log/cups/ rw, + /var/log/cups/* rw, + /var/spool/cups/ rw, + /var/spool/cups/** rw, + + # third-party printer drivers; no known structure here + /opt/** rix, + + # FIXME: no policy ATM for hplip and Brother drivers + /usr/bin/hpijs Ux, + /usr/Brother/** Ux, + + # Kerberos authentication + /etc/krb5.conf r, + deny /etc/krb5.conf w, + /etc/krb5.keytab rk, + /etc/cups/krb5.keytab rwk, + /tmp/krb5cc* k, + + # likewise authentication + /etc/likewise r, + /etc/likewise/* r, + + # Site-specific additions and overrides. See local/README for details. + #include +} + +# separate profile since this needs to write into /home +/usr/lib/cups/backend/cups-pdf { + #include + #include + #include + #include + + capability chown, + capability fowner, + capability fsetid, + capability setgid, + capability setuid, + + # unfortunate, but required for when $HOME is 700 + capability dac_override, + capability dac_read_search, + + @{PROC}/*/auxv r, + + /bin/dash ixr, + /bin/bash ixr, + /bin/cp ixr, + /etc/papersize r, + /etc/cups/cups-pdf.conf r, + @{HOME}/PDF/ rw, + @{HOME}/PDF/* rw, + /usr/bin/gs ixr, + /usr/lib/cups/backend/cups-pdf mr, + /usr/lib/ghostscript/** mr, + /usr/share/** r, + /var/log/cups/cups-pdf_log w, + /var/spool/cups/** r, + /var/spool/cups-pdf/** rw, +} diff --git a/debian/local/apport-hook.py b/debian/local/apport-hook.py new file mode 100644 index 0000000..3d633bf --- /dev/null +++ b/debian/local/apport-hook.py @@ -0,0 +1,11 @@ +'''apport package hook for cups + +(c) 2009 Canonical Ltd. +Author: Brian Murray +''' + +from apport.hookutils import * + +def add_info(report): + attach_hardware(report) + attach_printing(report) diff --git a/debian/local/cups.ufw.profile b/debian/local/cups.ufw.profile new file mode 100644 index 0000000..38ea041 --- /dev/null +++ b/debian/local/cups.ufw.profile @@ -0,0 +1,5 @@ +[CUPS] +title=Common UNIX Printing System server +description=CUPS is a printing system with support for IPP, samba, lpd, and other protocols. +ports=631 + diff --git a/debian/local/cups.upstart b/debian/local/cups.upstart new file mode 100755 index 0000000..aa433a1 --- /dev/null +++ b/debian/local/cups.upstart @@ -0,0 +1,58 @@ +# cups - CUPS Printing spooler and server + +description "CUPS printing spooler/server" +author "Michael Sweet " + +start on (filesystem + and (started dbus or runlevel [2345])) +stop on runlevel [016] + +respawn +respawn limit 3 12 + +pre-start script + [ -x /usr/sbin/cupsd ] + + # load modules for parallel port support + if [ -r /etc/default/cups ]; then + . /etc/default/cups + fi + if [ "$LOAD_LP_MODULE" = "yes" -a -f /usr/lib/cups/backend/parallel \ + -a -f /proc/modules -a -x /sbin/modprobe ]; then + modprobe -q -b lp || true + modprobe -q -b ppdev || true + modprobe -q -b parport_pc || true + fi + + mkdir -p /var/run/cups/certs + if [ -x /lib/init/apparmor-profile-load ]; then + /lib/init/apparmor-profile-load usr.sbin.cupsd + fi +end script + +exec /usr/sbin/cupsd -F + +post-start script + # wait until daemon is ready + timeout=6 + while [ ! -e /var/run/cups/cups.sock ]; do + sleep 0.5 + timeout=$((timeout-1)) + if [ "$timeout" -eq 0 ]; then + echo "cupsd failed to create /var/run/cups/cups.sock, skipping automatic printer configuration" >&2 + exit 0 + fi + done + + # coldplug USB printers + if ! /lib/udev/udev-configure-printer enumerate 2>/dev/null; then + if type udevadm > /dev/null 2>&1 && [ -x /lib/udev/udev-configure-printer ]; then + for printer in `udevadm trigger --verbose --dry-run --subsystem-match=usb \ + --attr-match=bInterfaceClass=07 --attr-match=bInterfaceSubClass=01 2>/dev/null || true; \ + udevadm trigger --verbose --dry-run --subsystem-match=usb \ + --sysname-match='lp[0-9]*' 2>/dev/null || true`; do + /lib/udev/udev-configure-printer add "${printer#/sys}" + done + fi + fi +end script diff --git a/debian/patches/add-ipp-backend-of-cups-1.4.patch b/debian/patches/add-ipp-backend-of-cups-1.4.patch new file mode 100644 index 0000000..2ffe20e --- /dev/null +++ b/debian/patches/add-ipp-backend-of-cups-1.4.patch @@ -0,0 +1,1991 @@ +--- a/backend/Makefile ++++ b/backend/Makefile +@@ -21,12 +21,12 @@ + # Object files... + # + +-RBACKENDS = ipp lpd $(DNSSD_BACKEND) ++RBACKENDS = ipp ipp14 lpd $(DNSSD_BACKEND) + UBACKENDS = $(LEGACY_BACKENDS) serial snmp socket usb + UNITTESTS = test1284 testbackend testsupplies + TARGETS = libbackend.a $(RBACKENDS) $(UBACKENDS) + LIBOBJS = ieee1284.o network.o runloop.o snmp-supplies.o +-OBJS = ipp.o lpd.o dnssd.o parallel.o serial.o snmp.o \ ++OBJS = ipp.o ipp14.o lpd.o dnssd.o parallel.o serial.o snmp.o \ + socket.o test1284.o testbackend.o testsupplies.o usb.o + + +@@ -218,6 +218,17 @@ + + + # ++# ipp14 ++# ++ ++ipp14: ipp14.o ../cups/$(LIBCUPS) libbackend.a ++ echo Linking $@... ++ $(CC) $(LDFLAGS) -o ipp14 ipp14.o libbackend.a $(LIBS) ++ #$(RM) http ++ #$(LN) ipp14 http ++ ++ ++# + # lpd + # + +--- /dev/null ++++ b/backend/ipp14.c +@@ -0,0 +1,1953 @@ ++/* ++ * "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $" ++ * ++ * IPP backend for the Common UNIX Printing System (CUPS). ++ * ++ * Copyright 2007-2010 by Apple Inc. ++ * Copyright 1997-2007 by Easy Software Products, all rights reserved. ++ * ++ * These coded instructions, statements, and computer programs are the ++ * property of Apple Inc. and are protected by Federal copyright ++ * law. Distribution and use rights are outlined in the file "LICENSE.txt" ++ * "LICENSE" which should have been included with this file. If this ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ * ++ * This file is subject to the Apple OS-Developed Software exception. ++ * ++ * Contents: ++ * ++ * main() - Send a file to the printer or server. ++ * cancel_job() - Cancel a print job. ++ * check_printer_state() - Check the printer state... ++ * compress_files() - Compress print files... ++ * password_cb() - Disable the password prompt for ++ * cupsDoFileRequest(). ++ * report_attr() - Report an IPP attribute value. ++ * report_printer_state() - Report the printer state. ++ * run_pictwps_filter() - Convert PICT files to PostScript when printing ++ * remotely. ++ * sigterm_handler() - Handle 'terminate' signals that stop the backend. ++ */ ++ ++/* ++ * Include necessary headers. ++ */ ++ ++#include ++#include "backend-private.h" ++#include ++#include ++#include ++ ++/* ++ * Globals... ++ */ ++ ++static char *password = NULL; /* Password for device URI */ ++static int password_tries = 0; /* Password tries */ ++static const char *auth_info_required = "none"; ++ /* New auth-info-required value */ ++#ifdef __APPLE__ ++static char pstmpname[1024] = ""; /* Temporary PostScript file name */ ++#endif /* __APPLE__ */ ++static char tmpfilename[1024] = ""; /* Temporary spool file name */ ++static int job_cancelled = 0; /* Job cancelled? */ ++ ++ ++/* ++ * Local functions... ++ */ ++ ++static void cancel_job(http_t *http, const char *uri, int id, ++ const char *resource, const char *user, int version); ++static void check_printer_state(http_t *http, const char *uri, ++ const char *resource, const char *user, ++ int version, int job_id); ++#ifdef HAVE_LIBZ ++static void compress_files(int num_files, char **files); ++#endif /* HAVE_LIBZ */ ++static const char *password_cb(const char *); ++static void report_attr(ipp_attribute_t *attr); ++static int report_printer_state(ipp_t *ipp, int job_id); ++ ++#ifdef __APPLE__ ++static int run_pictwps_filter(char **argv, const char *filename); ++#endif /* __APPLE__ */ ++static void sigterm_handler(int sig); ++ ++ ++/* ++ * 'main()' - Send a file to the printer or server. ++ * ++ * Usage: ++ * ++ * printer-uri job-id user title copies options [file] ++ */ ++ ++int /* O - Exit status */ ++main(int argc, /* I - Number of command-line args */ ++ char *argv[]) /* I - Command-line arguments */ ++{ ++ int i; /* Looping var */ ++ int send_options; /* Send job options? */ ++ int num_options; /* Number of printer options */ ++ cups_option_t *options; /* Printer options */ ++ const char *device_uri; /* Device URI */ ++ char scheme[255], /* Scheme in URI */ ++ hostname[1024], /* Hostname */ ++ username[255], /* Username info */ ++ resource[1024], /* Resource info (printer name) */ ++ addrname[256], /* Address name */ ++ *optptr, /* Pointer to URI options */ ++ *name, /* Name of option */ ++ *value, /* Value of option */ ++ sep; /* Separator character */ ++ int snmp_fd, /* SNMP socket */ ++ start_count, /* Page count via SNMP at start */ ++ page_count, /* Page count via SNMP */ ++ have_supplies; /* Printer supports supply levels? */ ++ int num_files; /* Number of files to print */ ++ char **files, /* Files to print */ ++ *filename; /* Pointer to single filename */ ++ int port; /* Port number (not used) */ ++ char uri[HTTP_MAX_URI]; /* Updated URI without user/pass */ ++ ipp_status_t ipp_status; /* Status of IPP request */ ++ http_t *http; /* HTTP connection */ ++ ipp_t *request, /* IPP request */ ++ *response, /* IPP response */ ++ *supported; /* get-printer-attributes response */ ++ time_t start_time; /* Time of first connect */ ++ int recoverable; /* Recoverable error shown? */ ++ int contimeout; /* Connection timeout */ ++ int delay; /* Delay for retries... */ ++ int compression, /* Do compression of the job data? */ ++ waitjob, /* Wait for job complete? */ ++ waitprinter; /* Wait for printer ready? */ ++ ipp_attribute_t *job_id_attr; /* job-id attribute */ ++ int job_id; /* job-id value */ ++ ipp_attribute_t *job_sheets; /* job-media-sheets-completed */ ++ ipp_attribute_t *job_state; /* job-state */ ++ ipp_attribute_t *copies_sup; /* copies-supported */ ++ ipp_attribute_t *format_sup; /* document-format-supported */ ++ ipp_attribute_t *printer_state; /* printer-state attribute */ ++ ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */ ++ int copies, /* Number of copies for job */ ++ copies_remaining; /* Number of copies remaining */ ++ const char *content_type, /* CONTENT_TYPE environment variable */ ++ *final_content_type; /* FINAL_CONTENT_TYPE environment var */ ++#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) ++ struct sigaction action; /* Actions for POSIX signals */ ++#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ ++ int version; /* IPP version */ ++ static const char * const pattrs[] = ++ { /* Printer attributes we want */ ++ "com.apple.print.recoverable-message", ++ "copies-supported", ++ "document-format-supported", ++ "marker-colors", ++ "marker-high-levels", ++ "marker-levels", ++ "marker-low-levels", ++ "marker-message", ++ "marker-names", ++ "marker-types", ++ "printer-is-accepting-jobs", ++ "printer-state", ++ "printer-state-message", ++ "printer-state-reasons", ++ }; ++ static const char * const jattrs[] = ++ { /* Job attributes we want */ ++ "job-media-sheets-completed", ++ "job-state" ++ }; ++ ++ ++ /* ++ * Make sure status messages are not buffered... ++ */ ++ ++ setbuf(stderr, NULL); ++ ++ /* ++ * Ignore SIGPIPE and catch SIGTERM signals... ++ */ ++ ++#ifdef HAVE_SIGSET ++ sigset(SIGPIPE, SIG_IGN); ++ sigset(SIGTERM, sigterm_handler); ++#elif defined(HAVE_SIGACTION) ++ memset(&action, 0, sizeof(action)); ++ action.sa_handler = SIG_IGN; ++ sigaction(SIGPIPE, &action, NULL); ++ ++ sigemptyset(&action.sa_mask); ++ sigaddset(&action.sa_mask, SIGTERM); ++ action.sa_handler = sigterm_handler; ++ sigaction(SIGTERM, &action, NULL); ++#else ++ signal(SIGPIPE, SIG_IGN); ++ signal(SIGTERM, sigterm_handler); ++#endif /* HAVE_SIGSET */ ++ ++ /* ++ * Check command-line... ++ */ ++ ++ if (argc == 1) ++ { ++ char *s; ++ ++ if ((s = strrchr(argv[0], '/')) != NULL) ++ s ++; ++ else ++ s = argv[0]; ++ ++ printf("network %s \"Unknown\" \"%s (%s)\"\n", ++ s, _cupsLangString(cupsLangDefault(), ++ _("Internet Printing Protocol")), s); ++ return (CUPS_BACKEND_OK); ++ } ++ else if (argc < 6) ++ { ++ _cupsLangPrintf(stderr, ++ _("Usage: %s job-id user title copies options [file]\n"), ++ argv[0]); ++ return (CUPS_BACKEND_STOP); ++ } ++ ++ /* ++ * Get the (final) content type... ++ */ ++ ++ if ((content_type = getenv("CONTENT_TYPE")) == NULL) ++ content_type = "application/octet-stream"; ++ ++ if ((final_content_type = getenv("FINAL_CONTENT_TYPE")) == NULL) ++ { ++ final_content_type = content_type; ++ ++ if (!strncmp(final_content_type, "printer/", 8)) ++ final_content_type = "application/vnd.cups-raw"; ++ } ++ ++ /* ++ * Extract the hostname and printer name from the URI... ++ */ ++ ++ if ((device_uri = cupsBackendDeviceURI(argv)) == NULL) ++ return (CUPS_BACKEND_FAILED); ++ ++ httpSeparateURI(HTTP_URI_CODING_ALL, device_uri, scheme, sizeof(scheme), ++ username, sizeof(username), hostname, sizeof(hostname), &port, ++ resource, sizeof(resource)); ++ ++ if (!port) ++ port = IPP_PORT; /* Default to port 631 */ ++ ++ if (!strcmp(scheme, "https")) ++ cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); ++ else ++ cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); ++ ++ /* ++ * See if there are any options... ++ */ ++ ++ compression = 0; ++ version = 11; ++ waitjob = 1; ++ waitprinter = 1; ++ contimeout = 7 * 24 * 60 * 60; ++ ++ if ((optptr = strchr(resource, '?')) != NULL) ++ { ++ /* ++ * Yup, terminate the device name string and move to the first ++ * character of the optptr... ++ */ ++ ++ *optptr++ = '\0'; ++ ++ /* ++ * Then parse the optptr... ++ */ ++ ++ while (*optptr) ++ { ++ /* ++ * Get the name... ++ */ ++ ++ name = optptr; ++ ++ while (*optptr && *optptr != '=' && *optptr != '+' && *optptr != '&') ++ optptr ++; ++ ++ if ((sep = *optptr) != '\0') ++ *optptr++ = '\0'; ++ ++ if (sep == '=') ++ { ++ /* ++ * Get the value... ++ */ ++ ++ value = optptr; ++ ++ while (*optptr && *optptr != '+' && *optptr != '&') ++ optptr ++; ++ ++ if (*optptr) ++ *optptr++ = '\0'; ++ } ++ else ++ value = (char *)""; ++ ++ /* ++ * Process the option... ++ */ ++ ++ if (!strcasecmp(name, "waitjob")) ++ { ++ /* ++ * Wait for job completion? ++ */ ++ ++ waitjob = !strcasecmp(value, "on") || ++ !strcasecmp(value, "yes") || ++ !strcasecmp(value, "true"); ++ } ++ else if (!strcasecmp(name, "waitprinter")) ++ { ++ /* ++ * Wait for printer idle? ++ */ ++ ++ waitprinter = !strcasecmp(value, "on") || ++ !strcasecmp(value, "yes") || ++ !strcasecmp(value, "true"); ++ } ++ else if (!strcasecmp(name, "encryption")) ++ { ++ /* ++ * Enable/disable encryption? ++ */ ++ ++ if (!strcasecmp(value, "always")) ++ cupsSetEncryption(HTTP_ENCRYPT_ALWAYS); ++ else if (!strcasecmp(value, "required")) ++ cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); ++ else if (!strcasecmp(value, "never")) ++ cupsSetEncryption(HTTP_ENCRYPT_NEVER); ++ else if (!strcasecmp(value, "ifrequested")) ++ cupsSetEncryption(HTTP_ENCRYPT_IF_REQUESTED); ++ else ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unknown encryption option value \"%s\"!\n"), ++ value); ++ } ++ } ++ else if (!strcasecmp(name, "version")) ++ { ++ if (!strcmp(value, "1.0")) ++ version = 10; ++ else if (!strcmp(value, "1.1")) ++ version = 11; ++ else if (!strcmp(value, "2.0")) ++ version = 20; ++ else if (!strcmp(value, "2.1")) ++ version = 21; ++ else ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unknown version option value \"%s\"!\n"), ++ value); ++ } ++ } ++#ifdef HAVE_LIBZ ++ else if (!strcasecmp(name, "compression")) ++ { ++ compression = !strcasecmp(value, "true") || ++ !strcasecmp(value, "yes") || ++ !strcasecmp(value, "on") || ++ !strcasecmp(value, "gzip"); ++ } ++#endif /* HAVE_LIBZ */ ++ else if (!strcasecmp(name, "contimeout")) ++ { ++ /* ++ * Set the connection timeout... ++ */ ++ ++ if (atoi(value) > 0) ++ contimeout = atoi(value); ++ } ++ else ++ { ++ /* ++ * Unknown option... ++ */ ++ ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unknown option \"%s\" with value \"%s\"!\n"), ++ name, value); ++ } ++ } ++ } ++ ++ /* ++ * If we have 7 arguments, print the file named on the command-line. ++ * Otherwise, copy stdin to a temporary file and print the temporary ++ * file. ++ */ ++ ++ if (argc == 6) ++ { ++ /* ++ * Copy stdin to a temporary file... ++ */ ++ ++ int fd; /* File descriptor */ ++ http_addrlist_t *addrlist; /* Address list */ ++ off_t tbytes; /* Total bytes copied */ ++ ++ ++ fputs("STATE: +connecting-to-device\n", stderr); ++ fprintf(stderr, "DEBUG: Looking up \"%s\"...\n", hostname); ++ ++ if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, "1")) == NULL) ++ { ++ _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), ++ hostname); ++ return (CUPS_BACKEND_STOP); ++ } ++ ++ snmp_fd = _cupsSNMPOpen(addrlist->addr.addr.sa_family); ++ ++ if ((fd = cupsTempFd(tmpfilename, sizeof(tmpfilename))) < 0) ++ { ++ _cupsLangPrintError("ERROR", _("Unable to create temporary file")); ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ _cupsLangPuts(stderr, _("INFO: Copying print data...\n")); ++ ++ tbytes = backendRunLoop(-1, fd, snmp_fd, &(addrlist->addr), 0, 0, ++ backendNetworkSideCB); ++ ++ if (snmp_fd >= 0) ++ _cupsSNMPClose(snmp_fd); ++ ++ httpAddrFreeList(addrlist); ++ ++ close(fd); ++ ++ /* ++ * Don't try printing files less than 2 bytes... ++ */ ++ ++ if (tbytes <= 1) ++ { ++ _cupsLangPuts(stderr, _("ERROR: Empty print file!\n")); ++ unlink(tmpfilename); ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ /* ++ * Point to the single file from stdin... ++ */ ++ ++ filename = tmpfilename; ++ num_files = 1; ++ files = &filename; ++ send_options = 0; ++ } ++ else ++ { ++ /* ++ * Point to the files on the command-line... ++ */ ++ ++ num_files = argc - 6; ++ files = argv + 6; ++ send_options = 1; ++ ++#ifdef HAVE_LIBZ ++ if (compression) ++ compress_files(num_files, files); ++#endif /* HAVE_LIBZ */ ++ } ++ ++ fprintf(stderr, "DEBUG: %d files to send in job...\n", num_files); ++ ++ /* ++ * Set the authentication info, if any... ++ */ ++ ++ cupsSetPasswordCB(password_cb); ++ ++ if (username[0]) ++ { ++ /* ++ * Use authenticaion information in the device URI... ++ */ ++ ++ if ((password = strchr(username, ':')) != NULL) ++ *password++ = '\0'; ++ ++ cupsSetUser(username); ++ } ++ else if (!getuid()) ++ { ++ /* ++ * Try loading authentication information from the environment. ++ */ ++ ++ const char *ptr = getenv("AUTH_USERNAME"); ++ ++ if (ptr) ++ cupsSetUser(ptr); ++ ++ password = getenv("AUTH_PASSWORD"); ++ } ++ ++ /* ++ * Try connecting to the remote server... ++ */ ++ ++ delay = 5; ++ recoverable = 0; ++ start_time = time(NULL); ++ ++ fputs("STATE: +connecting-to-device\n", stderr); ++ ++ do ++ { ++ fprintf(stderr, "DEBUG: Connecting to %s:%d\n", hostname, port); ++ _cupsLangPuts(stderr, _("INFO: Connecting to printer...\n")); ++ ++ if ((http = httpConnectEncrypt(hostname, port, cupsEncryption())) == NULL) ++ { ++ if (job_cancelled) ++ break; ++ ++ if (getenv("CLASS") != NULL) ++ { ++ /* ++ * If the CLASS environment variable is set, the job was submitted ++ * to a class and not to a specific queue. In this case, we want ++ * to abort immediately so that the job can be requeued on the next ++ * available printer in the class. ++ */ ++ ++ _cupsLangPuts(stderr, ++ _("INFO: Unable to contact printer, queuing on next " ++ "printer in class...\n")); ++ ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++ /* ++ * Sleep 5 seconds to keep the job from requeuing too rapidly... ++ */ ++ ++ sleep(5); ++ ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ if (errno == ECONNREFUSED || errno == EHOSTDOWN || ++ errno == EHOSTUNREACH) ++ { ++ if (contimeout && (time(NULL) - start_time) > contimeout) ++ { ++ _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ recoverable = 1; ++ ++ _cupsLangPrintf(stderr, ++ _("WARNING: recoverable: Network host \'%s\' is busy; " ++ "will retry in %d seconds...\n"), ++ hostname, delay); ++ ++ sleep(delay); ++ ++ if (delay < 30) ++ delay += 5; ++ } ++ else if (h_errno) ++ { ++ _cupsLangPrintf(stderr, _("ERROR: Unable to locate printer \'%s\'!\n"), ++ hostname); ++ return (CUPS_BACKEND_STOP); ++ } ++ else ++ { ++ recoverable = 1; ++ ++ fprintf(stderr, "DEBUG: Connection error: %s\n", strerror(errno)); ++ _cupsLangPuts(stderr, ++ _("ERROR: recoverable: Unable to connect to printer; will " ++ "retry in 30 seconds...\n")); ++ sleep(30); ++ } ++ ++ if (job_cancelled) ++ break; ++ } ++ } ++ while (http == NULL); ++ ++ if (job_cancelled || !http) ++ { ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ fputs("STATE: -connecting-to-device\n", stderr); ++ _cupsLangPuts(stderr, _("INFO: Connected to printer...\n")); ++ ++#ifdef AF_INET6 ++ if (http->hostaddr->addr.sa_family == AF_INET6) ++ fprintf(stderr, "DEBUG: Connected to [%s]:%d (IPv6)...\n", ++ httpAddrString(http->hostaddr, addrname, sizeof(addrname)), ++ ntohs(http->hostaddr->ipv6.sin6_port)); ++ else ++#endif /* AF_INET6 */ ++ if (http->hostaddr->addr.sa_family == AF_INET) ++ fprintf(stderr, "DEBUG: Connected to %s:%d (IPv4)...\n", ++ httpAddrString(http->hostaddr, addrname, sizeof(addrname)), ++ ntohs(http->hostaddr->ipv4.sin_port)); ++ ++ /* ++ * See if the printer supports SNMP... ++ */ ++ ++ if ((snmp_fd = _cupsSNMPOpen(http->hostaddr->addr.sa_family)) >= 0) ++ have_supplies = !backendSNMPSupplies(snmp_fd, http->hostaddr, &start_count, ++ NULL); ++ else ++ have_supplies = start_count = 0; ++ ++ /* ++ * Build a URI for the printer and fill the standard IPP attributes for ++ * an IPP_PRINT_FILE request. We can't use the URI in argv[0] because it ++ * might contain username:password information... ++ */ ++ ++ httpAssembleURI(HTTP_URI_CODING_ALL, uri, sizeof(uri), scheme, NULL, hostname, ++ port, resource); ++ ++ /* ++ * First validate the destination and see if the device supports multiple ++ * copies. We have to do this because some IPP servers (e.g. HP JetDirect) ++ * don't support the copies attribute... ++ */ ++ ++ copies_sup = NULL; ++ format_sup = NULL; ++ supported = NULL; ++ ++ do ++ { ++ /* ++ * Check for side-channel requests... ++ */ ++ ++ backendCheckSideChannel(snmp_fd, http->hostaddr); ++ ++ /* ++ * Build the IPP request... ++ */ ++ ++ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ++ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, ++ "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), ++ NULL, pattrs); ++ ++ /* ++ * Do the request... ++ */ ++ ++ fputs("DEBUG: Getting supported attributes...\n", stderr); ++ ++ if (http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ if ((supported = cupsDoRequest(http, request, resource)) == NULL) ++ ipp_status = cupsLastError(); ++ else ++ ipp_status = supported->request.status.status_code; ++ ++ if (ipp_status > IPP_OK_CONFLICT) ++ { ++ if (ipp_status == IPP_PRINTER_BUSY || ++ ipp_status == IPP_SERVICE_UNAVAILABLE) ++ { ++ if (contimeout && (time(NULL) - start_time) > contimeout) ++ { ++ _cupsLangPuts(stderr, _("ERROR: Printer not responding!\n")); ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ recoverable = 1; ++ ++ _cupsLangPrintf(stderr, ++ _("WARNING: recoverable: Network host \'%s\' is busy; " ++ "will retry in %d seconds...\n"), ++ hostname, delay); ++ ++ report_printer_state(supported, 0); ++ ++ sleep(delay); ++ ++ if (delay < 30) ++ delay += 5; ++ } ++ else if ((ipp_status == IPP_BAD_REQUEST || ++ ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) ++ { ++ /* ++ * Switch to IPP/1.0... ++ */ ++ ++ _cupsLangPrintf(stderr, ++ _("INFO: Printer does not support IPP/%d.%d, trying " ++ "IPP/1.0...\n"), version / 10, version % 10); ++ version = 10; ++ httpReconnect(http); ++ } ++ else if (ipp_status == IPP_NOT_FOUND) ++ { ++ _cupsLangPuts(stderr, _("ERROR: Destination printer does not exist!\n")); ++ ++ if (supported) ++ ippDelete(supported); ++ ++ return (CUPS_BACKEND_STOP); ++ } ++ else if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) ++ { ++ if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), ++ "Negotiate", 9)) ++ auth_info_required = "negotiate"; ++ ++ fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); ++ return (CUPS_BACKEND_AUTH_REQUIRED); ++ } ++ else ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to get printer status (%s)!\n"), ++ cupsLastErrorString()); ++ sleep(10); ++ } ++ ++ if (supported) ++ ippDelete(supported); ++ ++ continue; ++ } ++ else if ((copies_sup = ippFindAttribute(supported, "copies-supported", ++ IPP_TAG_RANGE)) != NULL) ++ { ++ /* ++ * Has the "copies-supported" attribute - does it have an upper ++ * bound > 1? ++ */ ++ ++ if (copies_sup->values[0].range.upper <= 1) ++ copies_sup = NULL; /* No */ ++ } ++ ++ format_sup = ippFindAttribute(supported, "document-format-supported", ++ IPP_TAG_MIMETYPE); ++ ++ if (format_sup) ++ { ++ fprintf(stderr, "DEBUG: document-format-supported (%d values)\n", ++ format_sup->num_values); ++ for (i = 0; i < format_sup->num_values; i ++) ++ fprintf(stderr, "DEBUG: [%d] = \"%s\"\n", i, ++ format_sup->values[i].string.text); ++ } ++ ++ report_printer_state(supported, 0); ++ } ++ while (ipp_status > IPP_OK_CONFLICT); ++ ++ /* ++ * See if the printer is accepting jobs and is not stopped; if either ++ * condition is true and we are printing to a class, requeue the job... ++ */ ++ ++ if (getenv("CLASS") != NULL) ++ { ++ printer_state = ippFindAttribute(supported, "printer-state", ++ IPP_TAG_ENUM); ++ printer_accepting = ippFindAttribute(supported, "printer-is-accepting-jobs", ++ IPP_TAG_BOOLEAN); ++ ++ if (printer_state == NULL || ++ (printer_state->values[0].integer > IPP_PRINTER_PROCESSING && ++ waitprinter) || ++ printer_accepting == NULL || ++ !printer_accepting->values[0].boolean) ++ { ++ /* ++ * If the CLASS environment variable is set, the job was submitted ++ * to a class and not to a specific queue. In this case, we want ++ * to abort immediately so that the job can be requeued on the next ++ * available printer in the class. ++ */ ++ ++ _cupsLangPuts(stderr, ++ _("INFO: Unable to contact printer, queuing on next " ++ "printer in class...\n")); ++ ++ ippDelete(supported); ++ httpClose(http); ++ ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++ /* ++ * Sleep 5 seconds to keep the job from requeuing too rapidly... ++ */ ++ ++ sleep(5); ++ ++ return (CUPS_BACKEND_FAILED); ++ } ++ } ++ ++ if (recoverable) ++ { ++ /* ++ * If we've shown a recoverable error make sure the printer proxies ++ * have a chance to see the recovered message. Not pretty but ++ * necessary for now... ++ */ ++ ++ fputs("INFO: recovered: \n", stderr); ++ sleep(5); ++ } ++ ++ /* ++ * See if the printer supports multiple copies... ++ */ ++ ++ copies = atoi(argv[4]); ++ ++ if (copies_sup || argc < 7) ++ { ++ copies_remaining = 1; ++ ++ if (argc < 7) ++ copies = 1; ++ } ++ else ++ copies_remaining = copies; ++ ++ /* ++ * Then issue the print-job request... ++ */ ++ ++ job_id = 0; ++ ++ while (copies_remaining > 0) ++ { ++ /* ++ * Check for side-channel requests... ++ */ ++ ++ backendCheckSideChannel(snmp_fd, http->hostaddr); ++ ++ /* ++ * Build the IPP request... ++ */ ++ ++ if (job_cancelled) ++ break; ++ ++ if (num_files > 1) ++ request = ippNewRequest(IPP_CREATE_JOB); ++ else ++ request = ippNewRequest(IPP_PRINT_JOB); ++ ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ++ fprintf(stderr, "DEBUG: printer-uri = \"%s\"\n", uri); ++ ++ if (argv[2][0]) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, ++ "requesting-user-name", NULL, argv[2]); ++ ++ fprintf(stderr, "DEBUG: requesting-user-name = \"%s\"\n", argv[2]); ++ ++ /* ++ * Only add a "job-name" attribute if the remote server supports ++ * copy generation - some IPP implementations like HP's don't seem ++ * to like UTF-8 job names (STR #1837)... ++ */ ++ ++ if (argv[3][0] && copies_sup) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, ++ argv[3]); ++ ++ fprintf(stderr, "DEBUG: job-name = \"%s\"\n", argv[3]); ++ ++#ifdef HAVE_LIBZ ++ if (compression) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, ++ "compression", NULL, "gzip"); ++#endif /* HAVE_LIBZ */ ++ ++ /* ++ * Handle options on the command-line... ++ */ ++ ++ options = NULL; ++ num_options = cupsParseOptions(argv[5], 0, &options); ++ ++#ifdef __APPLE__ ++ if (!strcasecmp(final_content_type, "application/pictwps") && ++ num_files == 1) ++ { ++ if (format_sup != NULL) ++ { ++ for (i = 0; i < format_sup->num_values; i ++) ++ if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) ++ break; ++ } ++ ++ if (format_sup == NULL || i >= format_sup->num_values) ++ { ++ /* ++ * Remote doesn't support "application/pictwps" (i.e. it's not MacOS X) ++ * so convert the document to PostScript... ++ */ ++ ++ if (run_pictwps_filter(argv, files[0])) ++ { ++ if (pstmpname[0]) ++ unlink(pstmpname); ++ ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++ return (CUPS_BACKEND_FAILED); ++ } ++ ++ files[0] = pstmpname; ++ ++ /* ++ * Change the MIME type to application/postscript and change the ++ * number of copies to 1... ++ */ ++ ++ final_content_type = "application/postscript"; ++ copies = 1; ++ copies_remaining = 1; ++ send_options = 0; ++ } ++ } ++#endif /* __APPLE__ */ ++ ++ if (format_sup != NULL) ++ { ++ for (i = 0; i < format_sup->num_values; i ++) ++ if (!strcasecmp(final_content_type, format_sup->values[i].string.text)) ++ break; ++ ++ if (i < format_sup->num_values) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, ++ "document-format", NULL, final_content_type); ++ } ++ ++ if (copies_sup && version > 10 && send_options) ++ { ++ /* ++ * Only send options if the destination printer supports the copies ++ * attribute and IPP/1.1. This is a hack for the HP and Lexmark ++ * implementations of IPP, which do not accept extension attributes ++ * and incorrectly report a client-error-bad-request error instead of ++ * the successful-ok-unsupported-attributes status. In short, at least ++ * some HP and Lexmark implementations of IPP are non-compliant. ++ */ ++ ++ cupsEncodeOptions(request, num_options, options); ++ ++ ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, "copies", ++ copies); ++ } ++ ++ cupsFreeOptions(num_options, options); ++ ++ /* ++ * If copies aren't supported, then we are likely dealing with an HP ++ * JetDirect. The HP IPP implementation seems to close the connection ++ * after every request - that is, it does *not* implement HTTP Keep- ++ * Alive, which is REQUIRED by HTTP/1.1... ++ */ ++ ++ if (!copies_sup) ++ httpReconnect(http); ++ ++ /* ++ * Do the request... ++ */ ++ ++ if (http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ if (num_files > 1) ++ response = cupsDoRequest(http, request, resource); ++ else ++ response = cupsDoFileRequest(http, request, resource, files[0]); ++ ++ ipp_status = cupsLastError(); ++ ++ if (ipp_status > IPP_OK_CONFLICT) ++ { ++ job_id = 0; ++ ++ if (job_cancelled) ++ break; ++ ++ if (ipp_status == IPP_SERVICE_UNAVAILABLE || ++ ipp_status == IPP_PRINTER_BUSY) ++ { ++ _cupsLangPuts(stderr, ++ _("INFO: Printer busy; will retry in 10 seconds...\n")); ++ sleep(10); ++ } ++ else if ((ipp_status == IPP_BAD_REQUEST || ++ ipp_status == IPP_VERSION_NOT_SUPPORTED) && version > 10) ++ { ++ /* ++ * Switch to IPP/1.0... ++ */ ++ ++ _cupsLangPrintf(stderr, ++ _("INFO: Printer does not support IPP/%d.%d, trying " ++ "IPP/1.0...\n"), version / 10, version % 10); ++ version = 10; ++ httpReconnect(http); ++ } ++ else ++ { ++ /* ++ * Update auth-info-required as needed... ++ */ ++ ++ _cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"), ++ cupsLastErrorString()); ++ ++ if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) ++ { ++ fprintf(stderr, "DEBUG: WWW-Authenticate=\"%s\"\n", ++ httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE)); ++ ++ /* ++ * Normal authentication goes through the password callback, which sets ++ * auth_info_required to "username,password". Kerberos goes directly ++ * through GSSAPI, so look for Negotiate in the WWW-Authenticate header ++ * here and set auth_info_required as needed... ++ */ ++ ++ if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), ++ "Negotiate", 9)) ++ auth_info_required = "negotiate"; ++ } ++ } ++ } ++ else if ((job_id_attr = ippFindAttribute(response, "job-id", ++ IPP_TAG_INTEGER)) == NULL) ++ { ++ _cupsLangPuts(stderr, ++ _("NOTICE: Print file accepted - job ID unknown.\n")); ++ job_id = 0; ++ } ++ else ++ { ++ job_id = job_id_attr->values[0].integer; ++ _cupsLangPrintf(stderr, _("NOTICE: Print file accepted - job ID %d.\n"), ++ job_id); ++ } ++ ++ ippDelete(response); ++ ++ if (job_cancelled) ++ break; ++ ++ if (job_id && num_files > 1) ++ { ++ for (i = 0; i < num_files; i ++) ++ { ++ /* ++ * Check for side-channel requests... ++ */ ++ ++ backendCheckSideChannel(snmp_fd, http->hostaddr); ++ ++ /* ++ * Send the next file in the job... ++ */ ++ ++ request = ippNewRequest(IPP_SEND_DOCUMENT); ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ++ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", ++ job_id); ++ ++ if (argv[2][0]) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, ++ "requesting-user-name", NULL, argv[2]); ++ ++ if ((i + 1) == num_files) ++ ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, ++ "document-format", NULL, content_type); ++ ++ if (http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ ippDelete(cupsDoFileRequest(http, request, resource, files[i])); ++ ++ if (cupsLastError() > IPP_OK_CONFLICT) ++ { ++ ipp_status = cupsLastError(); ++ ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to add file %d to job: %s\n"), ++ job_id, cupsLastErrorString()); ++ break; ++ } ++ } ++ } ++ ++ if (ipp_status <= IPP_OK_CONFLICT && argc > 6) ++ { ++ fprintf(stderr, "PAGE: 1 %d\n", copies_sup ? atoi(argv[4]) : 1); ++ copies_remaining --; ++ } ++ else if (ipp_status == IPP_SERVICE_UNAVAILABLE || ++ ipp_status == IPP_PRINTER_BUSY) ++ continue; ++ else ++ copies_remaining --; ++ ++ /* ++ * Wait for the job to complete... ++ */ ++ ++ if (!job_id || !waitjob) ++ continue; ++ ++ _cupsLangPuts(stderr, _("INFO: Waiting for job to complete...\n")); ++ ++ for (delay = 1; !job_cancelled;) ++ { ++ /* ++ * Check for side-channel requests... ++ */ ++ ++ backendCheckSideChannel(snmp_fd, http->hostaddr); ++ ++ /* ++ * Build an IPP_GET_JOB_ATTRIBUTES request... ++ */ ++ ++ request = ippNewRequest(IPP_GET_JOB_ATTRIBUTES); ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ++ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", ++ job_id); ++ ++ if (argv[2][0]) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, ++ "requesting-user-name", NULL, argv[2]); ++ ++ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, ++ "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]), ++ NULL, jattrs); ++ ++ /* ++ * Do the request... ++ */ ++ ++ if (!copies_sup || http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ response = cupsDoRequest(http, request, resource); ++ ipp_status = cupsLastError(); ++ ++ if (ipp_status == IPP_NOT_FOUND) ++ { ++ /* ++ * Job has gone away and/or the server has no job history... ++ */ ++ ++ ippDelete(response); ++ ++ ipp_status = IPP_OK; ++ break; ++ } ++ ++ if (ipp_status > IPP_OK_CONFLICT) ++ { ++ if (ipp_status != IPP_SERVICE_UNAVAILABLE && ++ ipp_status != IPP_PRINTER_BUSY) ++ { ++ ippDelete(response); ++ ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to get job %d attributes (%s)!\n"), ++ job_id, cupsLastErrorString()); ++ break; ++ } ++ } ++ ++ if (response) ++ { ++ if ((job_state = ippFindAttribute(response, "job-state", ++ IPP_TAG_ENUM)) != NULL) ++ { ++ /* ++ * Stop polling if the job is finished or pending-held... ++ */ ++ ++ if (job_state->values[0].integer > IPP_JOB_STOPPED) ++ { ++ if ((job_sheets = ippFindAttribute(response, ++ "job-media-sheets-completed", ++ IPP_TAG_INTEGER)) != NULL) ++ fprintf(stderr, "PAGE: total %d\n", ++ job_sheets->values[0].integer); ++ ++ ippDelete(response); ++ break; ++ } ++ } ++ else ++ { ++ /* ++ * If the printer does not return a job-state attribute, it does not ++ * conform to the IPP specification - break out immediately and fail ++ * the job... ++ */ ++ ++ fputs("DEBUG: No job-state available from printer - stopping queue.\n", ++ stderr); ++ ipp_status = IPP_INTERNAL_ERROR; ++ break; ++ } ++ } ++ ++ ippDelete(response); ++ ++ /* ++ * Check the printer state and report it if necessary... ++ */ ++ ++ check_printer_state(http, uri, resource, argv[2], version, job_id); ++ ++ /* ++ * Wait 1-10 seconds before polling again... ++ */ ++ ++ sleep(delay); ++ ++ delay ++; ++ if (delay > 10) ++ delay = 1; ++ } ++ } ++ ++ /* ++ * Cancel the job as needed... ++ */ ++ ++ if (job_cancelled && job_id) ++ cancel_job(http, uri, job_id, resource, argv[2], version); ++ ++ /* ++ * Check the printer state and report it if necessary... ++ */ ++ ++ check_printer_state(http, uri, resource, argv[2], version, job_id); ++ ++ /* ++ * Collect the final page count as needed... ++ */ ++ ++ if (have_supplies && ++ !backendSNMPSupplies(snmp_fd, http->hostaddr, &page_count, NULL) && ++ page_count > start_count) ++ fprintf(stderr, "PAGE: total %d\n", page_count - start_count); ++ ++#ifdef HAVE_GSSAPI ++ /* ++ * See if we used Kerberos at all... ++ */ ++ ++ if (http->gssctx) ++ auth_info_required = "negotiate"; ++#endif /* HAVE_GSSAPI */ ++ ++ /* ++ * Free memory... ++ */ ++ ++ httpClose(http); ++ ++ ippDelete(supported); ++ ++ /* ++ * Remove the temporary file(s) if necessary... ++ */ ++ ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++#ifdef HAVE_LIBZ ++ if (compression) ++ { ++ for (i = 0; i < num_files; i ++) ++ unlink(files[i]); ++ } ++#endif /* HAVE_LIBZ */ ++ ++#ifdef __APPLE__ ++ if (pstmpname[0]) ++ unlink(pstmpname); ++#endif /* __APPLE__ */ ++ ++ /* ++ * Return the queue status... ++ */ ++ ++ fprintf(stderr, "ATTR: auth-info-required=%s\n", auth_info_required); ++ ++ if (ipp_status == IPP_NOT_AUTHORIZED || ipp_status == IPP_FORBIDDEN) ++ return (CUPS_BACKEND_AUTH_REQUIRED); ++ else if (ipp_status == IPP_INTERNAL_ERROR) ++ return (CUPS_BACKEND_STOP); ++ else if (ipp_status > IPP_OK_CONFLICT) ++ return (CUPS_BACKEND_FAILED); ++ else ++ { ++ _cupsLangPuts(stderr, _("INFO: Ready to print.\n")); ++ return (CUPS_BACKEND_OK); ++ } ++} ++ ++ ++/* ++ * 'cancel_job()' - Cancel a print job. ++ */ ++ ++static void ++cancel_job(http_t *http, /* I - HTTP connection */ ++ const char *uri, /* I - printer-uri */ ++ int id, /* I - job-id */ ++ const char *resource, /* I - Resource path */ ++ const char *user, /* I - requesting-user-name */ ++ int version) /* I - IPP version */ ++{ ++ ipp_t *request; /* Cancel-Job request */ ++ ++ ++ _cupsLangPuts(stderr, _("INFO: Canceling print job...\n")); ++ ++ request = ippNewRequest(IPP_CANCEL_JOB); ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", id); ++ ++ if (user && user[0]) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, ++ "requesting-user-name", NULL, user); ++ ++ /* ++ * Do the request... ++ */ ++ ++ if (http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ ippDelete(cupsDoRequest(http, request, resource)); ++ ++ if (cupsLastError() > IPP_OK_CONFLICT) ++ _cupsLangPrintf(stderr, _("ERROR: Unable to cancel job %d: %s\n"), id, ++ cupsLastErrorString()); ++} ++ ++ ++/* ++ * 'check_printer_state()' - Check the printer state... ++ */ ++ ++static void ++check_printer_state( ++ http_t *http, /* I - HTTP connection */ ++ const char *uri, /* I - Printer URI */ ++ const char *resource, /* I - Resource path */ ++ const char *user, /* I - Username, if any */ ++ int version, /* I - IPP version */ ++ int job_id) /* I - Current job ID */ ++{ ++ ipp_t *request, /* IPP request */ ++ *response; /* IPP response */ ++ static const char * const attrs[] = /* Attributes we want */ ++ { ++ "com.apple.print.recoverable-message", ++ "marker-colors", ++ "marker-levels", ++ "marker-message", ++ "marker-names", ++ "marker-types", ++ "printer-state-message", ++ "printer-state-reasons" ++ }; ++ ++ ++ /* ++ * Check on the printer state... ++ */ ++ ++ request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); ++ request->request.op.version[0] = version / 10; ++ request->request.op.version[1] = version % 10; ++ ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", ++ NULL, uri); ++ ++ if (user && user[0]) ++ ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, ++ "requesting-user-name", NULL, user); ++ ++ ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, ++ "requested-attributes", ++ (int)(sizeof(attrs) / sizeof(attrs[0])), NULL, attrs); ++ ++ /* ++ * Do the request... ++ */ ++ ++ if (http->version < HTTP_1_1) ++ httpReconnect(http); ++ ++ if ((response = cupsDoRequest(http, request, resource)) != NULL) ++ { ++ report_printer_state(response, job_id); ++ ippDelete(response); ++ } ++} ++ ++ ++#ifdef HAVE_LIBZ ++/* ++ * 'compress_files()' - Compress print files... ++ */ ++ ++static void ++compress_files(int num_files, /* I - Number of files */ ++ char **files) /* I - Files */ ++{ ++ int i, /* Looping var */ ++ fd; /* Temporary file descriptor */ ++ ssize_t bytes; /* Bytes read/written */ ++ size_t total; /* Total bytes read */ ++ cups_file_t *in, /* Input file */ ++ *out; /* Output file */ ++ struct stat outinfo; /* Output file information */ ++ char filename[1024], /* Temporary filename */ ++ buffer[32768]; /* Copy buffer */ ++ ++ ++ fprintf(stderr, "DEBUG: Compressing %d job files...\n", num_files); ++ for (i = 0; i < num_files; i ++) ++ { ++ if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to create temporary compressed print " ++ "file: %s\n"), strerror(errno)); ++ exit(CUPS_BACKEND_FAILED); ++ } ++ ++ if ((out = cupsFileOpenFd(fd, "w9")) == NULL) ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to open temporary compressed print " ++ "file: %s\n"), strerror(errno)); ++ exit(CUPS_BACKEND_FAILED); ++ } ++ ++ if ((in = cupsFileOpen(files[i], "r")) == NULL) ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to open print file \"%s\": %s\n"), ++ files[i], strerror(errno)); ++ cupsFileClose(out); ++ exit(CUPS_BACKEND_FAILED); ++ } ++ ++ total = 0; ++ while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0) ++ if (cupsFileWrite(out, buffer, bytes) < bytes) ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to write %d bytes to \"%s\": %s\n"), ++ (int)bytes, filename, strerror(errno)); ++ cupsFileClose(in); ++ cupsFileClose(out); ++ exit(CUPS_BACKEND_FAILED); ++ } ++ else ++ total += bytes; ++ ++ cupsFileClose(out); ++ cupsFileClose(in); ++ ++ files[i] = strdup(filename); ++ ++ if (!stat(filename, &outinfo)) ++ fprintf(stderr, ++ "DEBUG: File %d compressed to %.1f%% of original size, " ++ CUPS_LLFMT " bytes...\n", ++ i + 1, 100.0 * outinfo.st_size / total, ++ CUPS_LLCAST outinfo.st_size); ++ } ++} ++#endif /* HAVE_LIBZ */ ++ ++ ++/* ++ * 'password_cb()' - Disable the password prompt for cupsDoFileRequest(). ++ */ ++ ++static const char * /* O - Password */ ++password_cb(const char *prompt) /* I - Prompt (not used) */ ++{ ++ (void)prompt; ++ ++ /* ++ * Remember that we need to authenticate... ++ */ ++ ++ auth_info_required = "username,password"; ++ ++ if (password && *password && password_tries < 3) ++ { ++ password_tries ++; ++ ++ return (password); ++ } ++ else ++ { ++ /* ++ * Give up after 3 tries or if we don't have a password to begin with... ++ */ ++ ++ return (NULL); ++ } ++} ++ ++ ++/* ++ * 'report_attr()' - Report an IPP attribute value. ++ */ ++ ++static void ++report_attr(ipp_attribute_t *attr) /* I - Attribute */ ++{ ++ int i; /* Looping var */ ++ char value[1024], /* Value string */ ++ *valptr, /* Pointer into value string */ ++ *attrptr; /* Pointer into attribute value */ ++ ++ ++ /* ++ * Convert the attribute values into quoted strings... ++ */ ++ ++ for (i = 0, valptr = value; ++ i < attr->num_values && valptr < (value + sizeof(value) - 10); ++ i ++) ++ { ++ if (i > 0) ++ *valptr++ = ','; ++ ++ switch (attr->value_tag) ++ { ++ case IPP_TAG_INTEGER : ++ case IPP_TAG_ENUM : ++ snprintf(valptr, sizeof(value) - (valptr - value), "%d", ++ attr->values[i].integer); ++ valptr += strlen(valptr); ++ break; ++ ++ case IPP_TAG_TEXT : ++ case IPP_TAG_NAME : ++ case IPP_TAG_KEYWORD : ++ *valptr++ = '\"'; ++ for (attrptr = attr->values[i].string.text; ++ *attrptr && valptr < (value + sizeof(value) - 10); ++ attrptr ++) ++ { ++ if (*attrptr == '\\' || *attrptr == '\"') ++ *valptr++ = '\\'; ++ ++ *valptr++ = *attrptr; ++ } ++ *valptr++ = '\"'; ++ break; ++ ++ default : ++ /* ++ * Unsupported value type... ++ */ ++ ++ return; ++ } ++ } ++ ++ *valptr = '\0'; ++ ++ /* ++ * Tell the scheduler about the new values... ++ */ ++ ++ fprintf(stderr, "ATTR: %s=%s\n", attr->name, value); ++} ++ ++ ++/* ++ * 'report_printer_state()' - Report the printer state. ++ */ ++ ++static int /* O - Number of reasons shown */ ++report_printer_state(ipp_t *ipp, /* I - IPP response */ ++ int job_id) /* I - Current job ID */ ++{ ++ int i; /* Looping var */ ++ int count; /* Count of reasons shown... */ ++ ipp_attribute_t *caprm, /* com.apple.print.recoverable-message */ ++ *psm, /* printer-state-message */ ++ *reasons, /* printer-state-reasons */ ++ *marker; /* marker-* attributes */ ++ const char *reason; /* Current reason */ ++ const char *prefix; /* Prefix for STATE: line */ ++ char state[1024]; /* State string */ ++ int saw_caprw; /* Saw com.apple.print.recoverable-warning state */ ++ ++ ++ if ((psm = ippFindAttribute(ipp, "printer-state-message", ++ IPP_TAG_TEXT)) != NULL) ++ fprintf(stderr, "INFO: %s\n", psm->values[0].string.text); ++ ++ if ((reasons = ippFindAttribute(ipp, "printer-state-reasons", ++ IPP_TAG_KEYWORD)) == NULL) ++ return (0); ++ ++ saw_caprw = 0; ++ state[0] = '\0'; ++ prefix = "STATE: "; ++ ++ for (i = 0, count = 0; i < reasons->num_values; i ++) ++ { ++ reason = reasons->values[i].string.text; ++ ++ if (!strcmp(reason, "com.apple.print.recoverable-warning")) ++ saw_caprw = 1; ++ else if (strcmp(reason, "paused")) ++ { ++ strlcat(state, prefix, sizeof(state)); ++ strlcat(state, reason, sizeof(state)); ++ ++ prefix = ","; ++ } ++ } ++ ++ if (state[0]) ++ fprintf(stderr, "%s\n", state); ++ ++ /* ++ * Relay com.apple.print.recoverable-message... ++ */ ++ ++ if ((caprm = ippFindAttribute(ipp, "com.apple.print.recoverable-message", ++ IPP_TAG_TEXT)) != NULL) ++ fprintf(stderr, "WARNING: %s: %s\n", ++ saw_caprw ? "recoverable" : "recovered", ++ caprm->values[0].string.text); ++ ++ /* ++ * Relay the current marker-* attribute values... ++ */ ++ ++ if ((marker = ippFindAttribute(ipp, "marker-colors", IPP_TAG_NAME)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-high-levels", ++ IPP_TAG_INTEGER)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-levels", ++ IPP_TAG_INTEGER)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-low-levels", ++ IPP_TAG_INTEGER)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-message", IPP_TAG_TEXT)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-names", IPP_TAG_NAME)) != NULL) ++ report_attr(marker); ++ if ((marker = ippFindAttribute(ipp, "marker-types", IPP_TAG_KEYWORD)) != NULL) ++ report_attr(marker); ++ ++ return (count); ++} ++ ++ ++#ifdef __APPLE__ ++/* ++ * 'run_pictwps_filter()' - Convert PICT files to PostScript when printing ++ * remotely. ++ * ++ * This step is required because the PICT format is not documented and ++ * subject to change, so developing a filter for other OS's is infeasible. ++ * Also, fonts required by the PICT file need to be embedded on the ++ * client side (which has the fonts), so we run the filter to get a ++ * PostScript file for printing... ++ */ ++ ++static int /* O - Exit status of filter */ ++run_pictwps_filter(char **argv, /* I - Command-line arguments */ ++ const char *filename)/* I - Filename */ ++{ ++ struct stat fileinfo; /* Print file information */ ++ const char *ppdfile; /* PPD file for destination printer */ ++ int pid; /* Child process ID */ ++ int fd; /* Temporary file descriptor */ ++ int status; /* Exit status of filter */ ++ const char *printer; /* PRINTER env var */ ++ static char ppdenv[1024]; /* PPD environment variable */ ++ ++ ++ /* ++ * First get the PPD file for the printer... ++ */ ++ ++ printer = getenv("PRINTER"); ++ if (!printer) ++ { ++ _cupsLangPuts(stderr, ++ _("ERROR: PRINTER environment variable not defined!\n")); ++ return (-1); ++ } ++ ++ if ((ppdfile = cupsGetPPD(printer)) == NULL) ++ { ++ _cupsLangPrintf(stderr, ++ _("ERROR: Unable to get PPD file for printer \"%s\" - " ++ "%s.\n"), printer, cupsLastErrorString()); ++ } ++ else ++ { ++ snprintf(ppdenv, sizeof(ppdenv), "PPD=%s", ppdfile); ++ putenv(ppdenv); ++ } ++ ++ /* ++ * Then create a temporary file for printing... ++ */ ++ ++ if ((fd = cupsTempFd(pstmpname, sizeof(pstmpname))) < 0) ++ { ++ _cupsLangPrintError("ERROR", _("Unable to create temporary file")); ++ if (ppdfile) ++ unlink(ppdfile); ++ return (-1); ++ } ++ ++ /* ++ * Get the owner of the spool file - it is owned by the user we want to run ++ * as... ++ */ ++ ++ if (argv[6]) ++ stat(argv[6], &fileinfo); ++ else ++ { ++ /* ++ * Use the OSX defaults, as an up-stream filter created the PICT ++ * file... ++ */ ++ ++ fileinfo.st_uid = 1; ++ fileinfo.st_gid = 80; ++ } ++ ++ if (ppdfile) ++ chown(ppdfile, fileinfo.st_uid, fileinfo.st_gid); ++ ++ fchown(fd, fileinfo.st_uid, fileinfo.st_gid); ++ ++ /* ++ * Finally, run the filter to convert the file... ++ */ ++ ++ if ((pid = fork()) == 0) ++ { ++ /* ++ * Child process for pictwpstops... Redirect output of pictwpstops to a ++ * file... ++ */ ++ ++ dup2(fd, 1); ++ close(fd); ++ ++ if (!getuid()) ++ { ++ /* ++ * Change to an unpriviledged user... ++ */ ++ ++ if (setgid(fileinfo.st_gid)) ++ return (errno); ++ ++ if (setuid(fileinfo.st_uid)) ++ return (errno); ++ } ++ ++ execlp("pictwpstops", printer, argv[1], argv[2], argv[3], argv[4], argv[5], ++ filename, NULL); ++ _cupsLangPrintf(stderr, _("ERROR: Unable to exec pictwpstops: %s\n"), ++ strerror(errno)); ++ return (errno); ++ } ++ ++ close(fd); ++ ++ if (pid < 0) ++ { ++ /* ++ * Error! ++ */ ++ ++ _cupsLangPrintf(stderr, _("ERROR: Unable to fork pictwpstops: %s\n"), ++ strerror(errno)); ++ if (ppdfile) ++ unlink(ppdfile); ++ return (-1); ++ } ++ ++ /* ++ * Now wait for the filter to complete... ++ */ ++ ++ if (wait(&status) < 0) ++ { ++ _cupsLangPrintf(stderr, _("ERROR: Unable to wait for pictwpstops: %s\n"), ++ strerror(errno)); ++ close(fd); ++ if (ppdfile) ++ unlink(ppdfile); ++ return (-1); ++ } ++ ++ if (ppdfile) ++ unlink(ppdfile); ++ ++ close(fd); ++ ++ if (status) ++ { ++ if (status >= 256) ++ _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited with status %d!\n"), ++ status / 256); ++ else ++ _cupsLangPrintf(stderr, _("ERROR: pictwpstops exited on signal %d!\n"), ++ status); ++ ++ return (status); ++ } ++ ++ /* ++ * Return with no errors.. ++ */ ++ ++ return (0); ++} ++#endif /* __APPLE__ */ ++ ++ ++/* ++ * 'sigterm_handler()' - Handle 'terminate' signals that stop the backend. ++ */ ++ ++static void ++sigterm_handler(int sig) /* I - Signal */ ++{ ++ (void)sig; /* remove compiler warnings... */ ++ ++ if (!job_cancelled) ++ { ++ /* ++ * Flag that the job should be cancelled... ++ */ ++ ++ job_cancelled = 1; ++ return; ++ } ++ ++ /* ++ * The scheduler already tried to cancel us once, now just terminate ++ * after removing our temp files! ++ */ ++ ++ if (tmpfilename[0]) ++ unlink(tmpfilename); ++ ++#ifdef __APPLE__ ++ if (pstmpname[0]) ++ unlink(pstmpname); ++#endif /* __APPLE__ */ ++ ++ exit(1); ++} ++ ++ ++/* ++ * End of "$Id: ipp.c 8950 2010-01-14 22:40:19Z mike $". ++ */ diff --git a/debian/patches/airprint-support.patch b/debian/patches/airprint-support.patch new file mode 100644 index 0000000..576da37 --- /dev/null +++ b/debian/patches/airprint-support.patch @@ -0,0 +1,27 @@ +Description: Add-on to cups-avahi.patch to support Apple AirPrint (printing from iPhone, iPad, iPod Touch to a CUPS server), patch is separate as this part is not in the upstream repository of cups-avahi.patch because it is not intencded to be submitted to CUPS upstream. +Author: Till Kamppeter +Bug: https://bugs.launchpad.net/bugs/711779 + +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -652,7 +652,7 @@ + DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; + + #if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +- cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups"); ++ cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups,_universal"); + #endif /* HAVE_DNSSD */ + + cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE); +--- a/scheduler/dirsvc.c ++++ b/scheduler/dirsvc.c +@@ -2522,6 +2522,9 @@ + keyvalue[i ][0] = "pdl"; + keyvalue[i++][1] = p->pdl ? p->pdl : "application/postscript"; + ++ keyvalue[i ][0] = "URF"; ++ keyvalue[i++][1] = "none"; ++ + if (get_auth_info_required(p, air_str, sizeof(air_str))) + { + keyvalue[i ][0] = "air"; diff --git a/debian/patches/colord-support.patch b/debian/patches/colord-support.patch new file mode 100644 index 0000000..cba91c9 --- /dev/null +++ b/debian/patches/colord-support.patch @@ -0,0 +1,900 @@ +Description: Added support for the colord Color Management system +Bug: http://www.cups.org/str.php?L3808 +Author: Richard Hughes + +--- a/scheduler/Makefile ++++ b/scheduler/Makefile +@@ -28,6 +28,7 @@ + file.o \ + main.o \ + ipp.o \ ++ colord.o \ + listen.o \ + job.o \ + log.o \ +--- /dev/null ++++ b/scheduler/colord.c +@@ -0,0 +1,692 @@ ++/* ++ * "$Id$" ++ * ++ * colord integration for the CUPS scheduler. ++ * ++ * Copyright 2011, Red Hat. ++ * ++ * These coded instructions, statements, and computer programs are the ++ * property of Apple Inc. and are protected by Federal copyright ++ * law. Distribution and use rights are outlined in the file "LICENSE.txt" ++ * which should have been included with this file. If this file is ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ * ++ * Contents: ++ * ++ * colordRegisterPrinter() - Register profiles for a printer. ++ * colordUnregisterPrinter() - Unregister profiles for a printer. ++ * colordStart() - Get a connection to the system bus. ++ * colordStop() - Release any connection to the system bus ++ * so that added profiles and devices are ++ * automatically removed. ++ */ ++ ++/* ++ * Include necessary headers... ++ */ ++ ++#include "cupsd.h" ++ ++#ifdef HAVE_DBUS ++ ++#include ++#include ++ ++/* ++ * Defines used by colord. See the reference docs for further details: ++ * http://colord.hughsie.com/api/ref-dbus.html ++ */ ++#define COLORD_SCOPE_NORMAL "normal" /* System scope */ ++#define COLORD_SCOPE_TEMP "temp" /* Process scope */ ++#define COLORD_SCOPE_DISK "disk" /* Lives forever, as stored in DB */ ++ ++#define COLORD_RELATION_SOFT "soft" /* Mapping is not default */ ++#define COLORD_RELATION_HARD "hard" /* Explicitly mapped profile */ ++ ++#define COLORD_SPACE_RGB "rgb" /* RGB colorspace */ ++#define COLORD_SPACE_CMYK "cmyk" /* CMYK colorspace */ ++#define COLORD_SPACE_GRAY "gray" /* Gray colorspace */ ++#define COLORD_SPACE_UNKNOWN "unknown" /* Unknown colorspace */ ++ ++#define COLORD_MODE_PHYSICAL "physical" /* Actual device */ ++#define COLORD_MODE_VIRTUAL "virtual" /* Virtual device with no hardware */ ++ ++#define COLORD_KIND_PRINTER "printer" /* printing output device */ ++ ++/* the timeout for connecting to colord */ ++#define COLORD_DBUS_TIMEOUT 5000 /* ms */ ++ ++/* This is static */ ++static DBusConnection *con = NULL; ++ ++/* ++ * 'colordStart()' - Get a connection to the system bus. ++ */ ++ ++void ++colordStart(void) ++{ ++ if (con) ++ return; ++ con = dbus_bus_get (DBUS_BUS_SYSTEM, NULL); ++} ++ ++/* ++ * 'colordStop()' - Release any connection to the system bus so that ++ * added profiles and devices are automatically removed. ++ */ ++ ++void ++colordStop(void) ++{ ++ if (con == NULL) ++ return; ++ dbus_connection_unref(con); ++ con = NULL; ++} ++ ++/* ++ * 'message_dict_add_strings()' - add two strings to a dictionary. ++ */ ++ ++static void ++message_dict_add_strings (DBusMessageIter *dict, ++ const char *key, ++ const char *value) ++{ ++ DBusMessageIter entry; ++ dbus_message_iter_open_container(dict, ++ DBUS_TYPE_DICT_ENTRY, ++ NULL, ++ &entry); ++ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); ++ dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &value); ++ dbus_message_iter_close_container(dict, &entry); ++} ++ ++/* ++ * 'colordCreateProfile()' - Create a color profile for a printer. ++ * ++ * Notes: When creating the device, we can create ++ */ ++ ++static void ++colordCreateProfile (cups_array_t *profiles, /* I - Profiles array */ ++ const char *printer_name, /* I - Printer name */ ++ const char *qualifier, /* I - Profile qualifier */ ++ const char *colorspace, /* I - Profile colorspace */ ++ const char **format, /* I - Profile qualifier format */ ++ const char *iccfile, /* I - ICC filename */ ++ const char *scope) /* I - The scope of the profile, e.g. ++ 'normal', 'temp' or 'disk' */ ++{ ++ DBusMessage *message = NULL; /* D-Bus request */ ++ DBusMessage *reply = NULL; /* D-Bus reply */ ++ DBusMessageIter args; /* D-Bus method arguments */ ++ DBusMessageIter dict; /* D-Bus method arguments */ ++ DBusError error; /* D-Bus error */ ++ char *idstr; /* Profile ID string */ ++ size_t idstrlen; /* Profile ID allocated length */ ++ const char *profile_path; /* Device object path */ ++ char format_str[1024]; /* Qualifier format as a string */ ++ ++ /* ++ * Create the profile... ++ */ ++ ++ message = dbus_message_new_method_call("org.freedesktop.ColorManager", ++ "/org/freedesktop/ColorManager", ++ "org.freedesktop.ColorManager", ++ "CreateProfile"); ++ ++ /* create a profile id */ ++ idstrlen = strlen (printer_name) + 1 + strlen (qualifier) + 1; ++ idstr = malloc (idstrlen); ++ if (!idstr) ++ goto out; ++ snprintf (idstr, idstrlen, "%s-%s", printer_name, qualifier); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Using profile id of %s", ++ idstr); ++ ++ dbus_message_iter_init_append(message, &args); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &idstr); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &scope); ++ ++ /* mush the qualifier format into a simple string */ ++ snprintf(format_str, sizeof(format_str), "%s.%s.%s", ++ format[0], ++ format[1], ++ format[2]); ++ ++ /* set initial properties */ ++ dbus_message_iter_open_container(&args, ++ DBUS_TYPE_ARRAY, ++ "{ss}", ++ &dict); ++ message_dict_add_strings(&dict, "Qualifier", qualifier); ++ message_dict_add_strings(&dict, "Format", format_str); ++ message_dict_add_strings(&dict, "Colorspace", colorspace); ++ if (iccfile != NULL) ++ message_dict_add_strings(&dict, "Filename", iccfile); ++ dbus_message_iter_close_container(&args, &dict); ++ ++ /* send syncronous */ ++ dbus_error_init(&error); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateProfile(%s,%s)", ++ idstr, scope); ++ reply = dbus_connection_send_with_reply_and_block(con, ++ message, ++ COLORD_DBUS_TIMEOUT, ++ &error); ++ if (reply == NULL) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "failed to CreateProfile: %s:%s", ++ error.name, error.message); ++ dbus_error_free(&error); ++ goto out; ++ } ++ ++ /* get reply data */ ++ dbus_message_iter_init(reply, &args); ++ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "incorrect reply type"); ++ goto out; ++ } ++ dbus_message_iter_get_basic(&args, &profile_path); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "created profile %s", ++ profile_path); ++ cupsArrayAdd(profiles, strdup(profile_path)); ++ ++out: ++ if (message != NULL) ++ dbus_message_unref(message); ++ if (reply != NULL) ++ dbus_message_unref(reply); ++ free (idstr); ++} ++ ++/* ++ * 'colordDeviceAddProfile()' - Assign a profile to a device. ++ */ ++ ++static void ++colordDeviceAddProfile (const char *device_path, /* I - Device object path */ ++ const char *profile_path, /* I - Profile object path */ ++ const char *relation) /* I - Device relation, either 'soft' or 'hard' */ ++{ ++ DBusMessage *message = NULL; /* D-Bus request */ ++ DBusMessage *reply = NULL; /* D-Bus reply */ ++ DBusMessageIter args; /* D-Bus method arguments */ ++ DBusError error; /* D-Bus error */ ++ ++ message = dbus_message_new_method_call("org.freedesktop.ColorManager", ++ device_path, ++ "org.freedesktop.ColorManager.Device", ++ "AddProfile"); ++ ++ /* send profile path as the argument */ ++ dbus_message_iter_init_append(message, &args); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &relation); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, &profile_path); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "Calling %s:AddProfile(%s) [%s]", ++ device_path, profile_path, relation); ++ ++ /* send syncronous */ ++ dbus_error_init(&error); ++ reply = dbus_connection_send_with_reply_and_block(con, ++ message, ++ COLORD_DBUS_TIMEOUT, ++ &error); ++ if (reply == NULL) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "failed to AddProfile: %s:%s", ++ error.name, error.message); ++ dbus_error_free(&error); ++ goto out; ++ } ++out: ++ if (message != NULL) ++ dbus_message_unref(message); ++ if (reply != NULL) ++ dbus_message_unref(reply); ++} ++ ++/* ++ * 'colordCreateDevice()' - Create a device and register profiles. ++ */ ++ ++static void ++colordCreateDevice (cupsd_printer_t *p, /* I - Printer */ ++ ppd_file_t *ppd, /* I - PPD file */ ++ cups_array_t *profiles, /* I - Profiles array */ ++ const char *colorspace, /* I - Device colorspace, e.g. 'rgb' */ ++ char **format, /* I - Device qualifier format */ ++ const char *relation, /* I - Profile relation, either 'soft' or 'hard' */ ++ const char *scope) /* I - The scope of the device, e.g. ++ 'normal', 'temp' or 'disk' */ ++{ ++ DBusMessage *message = NULL; /* D-Bus request */ ++ DBusMessage *reply = NULL; /* D-Bus reply */ ++ DBusMessageIter args; /* D-Bus method arguments */ ++ DBusMessageIter dict; /* D-Bus method arguments */ ++ DBusError error; /* D-Bus error */ ++ const char *device_path; /* Device object path */ ++ const char *profile_path; /* Profile path */ ++ char *default_profile_path = NULL; ++ /* Default profile path */ ++ char device_id[1024]; /* Device ID as understood by colord */ ++ char format_str[1024]; /* Qualifier format as a string */ ++ ++ /* ++ * Create the device... ++ */ ++ ++ snprintf(device_id, sizeof(device_id), "cups-%s", p->name); ++ device_path = device_id; ++ ++ message = dbus_message_new_method_call("org.freedesktop.ColorManager", ++ "/org/freedesktop/ColorManager", ++ "org.freedesktop.ColorManager", ++ "CreateDevice"); ++ ++ dbus_message_iter_init_append(message, &args); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &device_path); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &scope); ++ ++ /* mush the qualifier format into a simple string */ ++ snprintf(format_str, sizeof(format_str), "%s.%s.%s", ++ format[0], ++ format[1], ++ format[2]); ++ ++ /* set initial properties */ ++ dbus_message_iter_open_container(&args, ++ DBUS_TYPE_ARRAY, ++ "{ss}", ++ &dict); ++ message_dict_add_strings(&dict, "Colorspace", colorspace); ++ message_dict_add_strings(&dict, "Mode", COLORD_MODE_PHYSICAL); ++ if (ppd->manufacturer != NULL) ++ message_dict_add_strings(&dict, "Vendor", ppd->manufacturer); ++ if (ppd->modelname != NULL) ++ message_dict_add_strings(&dict, "Model", ppd->modelname); ++ if (p->sanitized_device_uri != NULL) ++ message_dict_add_strings(&dict, "Serial", p->sanitized_device_uri); ++ message_dict_add_strings(&dict, "Format", format_str); ++ message_dict_add_strings(&dict, "Kind", COLORD_KIND_PRINTER); ++ dbus_message_iter_close_container(&args, &dict); ++ ++ /* send syncronous */ ++ dbus_error_init(&error); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateDevice(%s,%s)", ++ device_id, scope); ++ reply = dbus_connection_send_with_reply_and_block(con, ++ message, ++ COLORD_DBUS_TIMEOUT, ++ &error); ++ if (reply == NULL) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "failed to CreateDevice: %s:%s", ++ error.name, error.message); ++ dbus_error_free(&error); ++ goto out; ++ } ++ ++ /* get reply data */ ++ dbus_message_iter_init(reply, &args); ++ if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "incorrect reply type"); ++ goto out; ++ } ++ dbus_message_iter_get_basic(&args, &device_path); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "created device %s", ++ device_path); ++ ++ /* add profiles */ ++ for (profile_path = cupsArrayFirst(profiles); ++ profile_path; ++ profile_path = cupsArrayNext(profiles)) ++ { ++ colordDeviceAddProfile (device_path, profile_path, relation); ++ } ++ ++out: ++ free(default_profile_path); ++ if (message != NULL) ++ dbus_message_unref(message); ++ if (reply != NULL) ++ dbus_message_unref(reply); ++} ++ ++/* ++ * 'colordDeleteDevice()' - Delete a device ++ */ ++ ++static void ++colordDeleteDevice (const char *device_id) /* I - Device ID string */ ++{ ++ DBusMessage *message = NULL; /* D-Bus request */ ++ DBusMessage *reply = NULL; /* D-Bus reply */ ++ DBusMessageIter args; /* D-Bus method arguments */ ++ DBusError error; /* D-Bus error */ ++ ++ /* ++ * Create the device... ++ */ ++ ++ message = dbus_message_new_method_call("org.freedesktop.ColorManager", ++ "/org/freedesktop/ColorManager", ++ "org.freedesktop.ColorManager", ++ "DeleteDevice"); ++ ++ dbus_message_iter_init_append(message, &args); ++ dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &device_id); ++ ++ /* send syncronous */ ++ dbus_error_init(&error); ++ cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling DeleteDevice(%s)", device_id); ++ reply = dbus_connection_send_with_reply_and_block(con, ++ message, ++ COLORD_DBUS_TIMEOUT, ++ &error); ++ if (reply == NULL) ++ { ++ /* this can happen normally on start-up */ ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "failed to DeleteDevice: %s:%s", ++ error.name, error.message); ++ dbus_error_free(&error); ++ goto out; ++ } ++out: ++ if (message != NULL) ++ dbus_message_unref(message); ++ if (reply != NULL) ++ dbus_message_unref(reply); ++} ++ ++/* ++ * 'colordGetQualifierFormat()' - Get the qualifier format. ++ * ++ * Notes: Returns a value of "ColorSpace.MediaType.Resolution" by default ++ */ ++ ++char ** ++colordGetQualifierFormat(ppd_file_t *ppd) ++{ ++ char **format; /* Qualifier format tuple */ ++ const char *tmp; /* Temporary string */ ++ ppd_attr_t *attr; /* Profile attributes */ ++ ++ /* create 3-tuple */ ++ format = calloc(3, sizeof(char*)); ++ ++ /* get 1st section */ ++ tmp = "cupsICCQualifier1"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ if (attr != NULL) ++ tmp = attr->value; ++ else ++ { ++ tmp = "DefaultColorSpace"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ } ++ if (attr == NULL) ++ { ++ tmp = "DefaultColorModel"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ } ++ if (attr == NULL) ++ { ++ tmp = ""; ++ } ++ if (strncmp(tmp, "Default", 7) == 0) ++ tmp += 7; ++ format[0] = strdup(tmp); ++ ++ /* get 2nd section */ ++ tmp = "cupsICCQualifier2"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ if (attr != NULL) ++ tmp = attr->value; ++ else ++ { ++ tmp = "DefaultMediaType"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ } ++ if (attr == NULL) ++ { ++ tmp = ""; ++ } ++ if (strncmp(tmp, "Default", 7) == 0) ++ tmp += 7; ++ format[1] = strdup(tmp); ++ ++ /* get 3rd section */ ++ tmp = "cupsICCQualifier3"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ if (attr != NULL) ++ tmp = attr->value; ++ else ++ { ++ tmp = "DefaultResolution"; ++ attr = ppdFindAttr(ppd, tmp, NULL); ++ } ++ if (attr == NULL) ++ { ++ tmp = ""; ++ } ++ if (strncmp(tmp, "Default", 7) == 0) ++ tmp += 7; ++ format[2] = strdup(tmp); ++ ++ return format; ++} ++ ++/* ++ * 'colordRegisterPrinter()' - Register profiles for a printer. ++ */ ++ ++void ++colordRegisterPrinter(cupsd_printer_t *p) /* I - printer */ ++{ ++ char ppdfile[1024], /* PPD filename */ ++ iccfile[1024]; /* ICC filename */ ++ ppd_file_t *ppd; /* PPD file */ ++ cups_array_t *profiles; /* Profile paths array */ ++ const char *profile_key; /* Profile keyword */ ++ ppd_attr_t *attr; /* Profile attributes */ ++ const char *device_colorspace; /* Device colorspace */ ++ char **format; /* Qualifier format tuple */ ++ int i; /* Loop counter */ ++ ++ /* ++ * Do nothing for discovered printers as they will have local color ++ * correction ++ */ ++ ++ if (p->type & CUPS_PRINTER_DISCOVERED) ++ return; ++ ++ /* ++ * Ensure we have a DBus connection ++ */ ++ ++ colordStart(); ++ if (con == NULL) ++ return; ++ ++ /* ++ * Try opening the PPD file for this printer... ++ */ ++ ++ snprintf(ppdfile, sizeof(ppdfile), "%s/ppd/%s.ppd", ServerRoot, p->name); ++ if ((ppd = ppdOpenFile(ppdfile)) == NULL) ++ { ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "cannot open %s", ++ ppdfile); ++ return; ++ } ++ ++ /* ++ * Find out the qualifier format ++ */ ++ ++ format = colordGetQualifierFormat(ppd); ++ ++ /* ++ * See if we have any embedded profiles... ++ */ ++ ++ profiles = cupsArrayNew3 (NULL, NULL, NULL, 0, NULL, ++ (cups_afree_func_t) free); ++ profile_key = "cupsICCProfile"; ++ attr = ppdFindAttr(ppd, profile_key, NULL); ++ for (; attr; attr = ppdFindNextAttr(ppd, profile_key, NULL)) ++ if (attr->spec[0] && attr->value && attr->value[0]) ++ { ++ if (attr->value[0] != '/') ++ snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir, ++ attr->value); ++ else ++ strlcpy(iccfile, attr->value, sizeof(iccfile)); ++ ++ if (access(iccfile, 0)) ++ { ++ cupsdLogMessage(CUPSD_LOG_WARN, ++ "no access to %s", ++ iccfile); ++ continue; ++ } ++ ++ colordCreateProfile(profiles, ++ p->name, ++ attr->spec, ++ COLORD_SPACE_UNKNOWN, ++ (const char **)format, ++ iccfile, ++ COLORD_SCOPE_TEMP); ++ } ++ ++ /* ++ * Add the grayscale profile first. We always have a grayscale profile. ++ */ ++ ++ colordCreateProfile(profiles, ++ p->name, ++ "Gray..", ++ COLORD_SPACE_GRAY, ++ (const char **)format, ++ NULL, ++ COLORD_SCOPE_TEMP); ++ ++ /* ++ * Then add the RGB/CMYK/DeviceN color profile... ++ */ ++ ++ device_colorspace = "unknown"; ++ switch (ppd->colorspace) ++ { ++ case PPD_CS_RGB : ++ case PPD_CS_CMY : ++ device_colorspace = COLORD_SPACE_RGB; ++ colordCreateProfile(profiles, ++ p->name, ++ "RGB..", ++ COLORD_SPACE_RGB, ++ (const char **)format, ++ NULL, ++ COLORD_SCOPE_TEMP); ++ break; ++ case PPD_CS_RGBK : ++ case PPD_CS_CMYK : ++ device_colorspace = COLORD_SPACE_CMYK; ++ colordCreateProfile(profiles, ++ p->name, ++ "CMYK..", ++ COLORD_SPACE_CMYK, ++ (const char **)format, ++ NULL, ++ COLORD_SCOPE_TEMP); ++ break; ++ case PPD_CS_GRAY : ++ device_colorspace = COLORD_SPACE_GRAY; ++ break; ++ case PPD_CS_N : ++ colordCreateProfile(profiles, ++ p->name, ++ "DeviceN..", ++ COLORD_SPACE_UNKNOWN, ++ (const char **)format, ++ NULL, ++ COLORD_SCOPE_TEMP); ++ break; ++ } ++ ++ /* ++ * Register the device with colord. ++ */ ++ ++ cupsdLogMessage(CUPSD_LOG_INFO, "Registering ICC color profiles for \"%s\"", ++ p->name); ++ colordCreateDevice (p, ++ ppd, ++ profiles, ++ device_colorspace, ++ format, ++ COLORD_RELATION_SOFT, ++ COLORD_SCOPE_TEMP); ++ ++ /* ++ * Free any memory we used... ++ */ ++ ++ cupsArrayDelete(profiles); ++ for (i=0; i<3; i++) ++ free(format[i]); ++ free(format); ++ ++ ppdClose(ppd); ++} ++ ++/* ++ * 'colordUnregisterPrinter()' - Unregister profiles for a printer. ++ */ ++ ++void ++colordUnregisterPrinter(cupsd_printer_t *p) /* I - printer */ ++{ ++ char device_id[1024]; /* Device ID as understood by colord */ ++ ++ /* ++ * Ensure we have a DBus connection ++ */ ++ ++ colordStart(); ++ if (con == NULL) ++ return; ++ ++ /* ++ * Just delete the device itself, and leave the profiles registered ++ */ ++ ++ snprintf(device_id, sizeof(device_id), "cups-%s", p->name); ++ colordDeleteDevice(device_id); ++} ++ ++#endif /* HAVE_DBUS */ ++ ++/* ++ * End of "$Id$". ++ */ +--- /dev/null ++++ b/scheduler/colord.h +@@ -0,0 +1,22 @@ ++/* ++ * "$Id$" ++ * ++ * colord integration for the CUPS scheduler. ++ * ++ * Copyright 2011, Red Hat. ++ * ++ * These coded instructions, statements, and computer programs are the ++ * property of Apple Inc. and are protected by Federal copyright ++ * law. Distribution and use rights are outlined in the file "LICENSE.txt" ++ * which should have been included with this file. If this file is ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ */ ++ ++void colordRegisterPrinter(cupsd_printer_t *p); ++void colordUnregisterPrinter(cupsd_printer_t *p); ++void colordStart(void); ++void colordStop(void); ++ ++/* ++ * End of "$Id$". ++ */ +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -2925,17 +2925,23 @@ + + cupsdSetPrinterReasons(printer, "none"); + +-#ifdef __APPLE__ + /* + * (Re)register color profiles... + */ + + if (!RunUser) + { ++ cupsdCmsRegisterPrinter(printer); ++#ifdef __APPLE__ ++ /* ++ * FIXME: ideally the ColorSync stuff would be moved to colorsync.c ++ * and the colorsyncRegisterProfiles() would be called from ++ * cupsdCmsRegisterPrinter() in printers.c ++ */ + apple_unregister_profiles(printer); + apple_register_profiles(printer); +- } + #endif /* __APPLE__ */ ++ } + } + + /* +@@ -7034,11 +7040,17 @@ + snprintf(filename, sizeof(filename), "%s/%s.data", CacheDir, printer->name); + unlink(filename); + +-#ifdef __APPLE__ + /* + * Unregister color profiles... + */ + ++ cupsdCmsUnregisterPrinter(printer); ++#ifdef __APPLE__ ++ /* ++ * FIXME: ideally the ColorSync stuff would be moved to colorsync.c ++ * and the colorsyncUnregisterPrinter() would be called from ++ * cupsdCmsUnregisterPrinter() in printers.c ++ */ + apple_unregister_profiles(printer); + #endif /* __APPLE__ */ + +--- a/scheduler/printers.c ++++ b/scheduler/printers.c +@@ -80,6 +80,9 @@ + # include + #endif /* __APPLE__ */ + ++#ifdef HAVE_DBUS ++# include "colord.h" ++#endif /* HAVE_DBUS */ + + /* + * Local functions... +@@ -712,6 +715,53 @@ + } + } + ++/* ++ * 'cupsdCmsRegisterPrinter()' - Registers a printer and profiles with the CMS ++ */ ++ ++void ++cupsdCmsRegisterPrinter(cupsd_printer_t *p) ++{ ++#if defined(HAVE_DBUS) ++ colordRegisterPrinter(p); ++#endif /* defined(HAVE_DBUS) */ ++} ++ ++/* ++ * 'cupsdCmsUnregisterPrinter()' - Unregisters a printer and profiles with the CMS ++ */ ++ ++void ++cupsdCmsUnregisterPrinter(cupsd_printer_t *p) ++{ ++#if defined(HAVE_DBUS) ++ colordUnregisterPrinter(p); ++#endif /* defined(HAVE_DBUS) */ ++} ++ ++/* ++ * 'cupsdCmsStart()' - Starts the CMS ++ */ ++ ++void ++cupsdCmsStart(void) ++{ ++#if defined(HAVE_DBUS) ++ colordStart(); ++#endif /* defined(HAVE_DBUS) */ ++} ++ ++/* ++ * 'cupsdCmsStop()' - Stops the CMS ++ */ ++ ++void ++cupsdCmsStop(void) ++{ ++#if defined(HAVE_DBUS) ++ colordStop(); ++#endif /* defined(HAVE_DBUS) */ ++} + + /* + * 'cupsdDeletePrinter()' - Delete a printer from the system. +@@ -752,6 +802,12 @@ + "Job stopped."); + + /* ++ * Unregister profiles... ++ */ ++ ++ cupsdCmsUnregisterPrinter(p); ++ ++ /* + * If this printer is the next for browsing, point to the next one... + */ + +@@ -1418,6 +1474,12 @@ + } + + /* ++ * Unregister profiles... ++ */ ++ ++ cupsdCmsUnregisterPrinter(p); ++ ++ /* + * Rename the printer... + */ + +@@ -2676,6 +2738,13 @@ + #endif /* __sgi */ + + /* ++ * Re-register profiles... ++ */ ++ ++ cupsdCmsUnregisterPrinter(p); ++ cupsdCmsRegisterPrinter(p); ++ ++ /* + * Let the browse protocols reflect the change + */ + +--- a/scheduler/printers.h ++++ b/scheduler/printers.h +@@ -180,6 +180,10 @@ + cups_ptype_t *dtype, + cupsd_printer_t **printer); + extern void cupsdWritePrintcap(void); ++extern void cupsdCmsRegisterPrinter(cupsd_printer_t *p); ++extern void cupsdCmsUnregisterPrinter(cupsd_printer_t *p); ++extern void cupsdCmsStart(void); ++extern void cupsdCmsStop(void); + + + /* diff --git a/debian/patches/confdirperms.patch b/debian/patches/confdirperms.patch new file mode 100644 index 0000000..f6a1325 --- /dev/null +++ b/debian/patches/confdirperms.patch @@ -0,0 +1,16 @@ +Description: Do not mess with the permissions of cupsd.conf. +Author: Martin Pitt + +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -1001,8 +1001,10 @@ + Group, 1, 1) < 0 || + cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser, + Group, 1, 0) < 0 || ++ /* Never alter permissions of central conffile + cupsdCheckPermissions(ServerRoot, "cupsd.conf", ConfigFilePerm, RunUser, + Group, 0, 0) < 0 || ++ */ + cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser, + Group, 0, 0) < 0 || + cupsdCheckPermissions(ServerRoot, "printers.conf", 0600, RunUser, diff --git a/debian/patches/configure-default-browse-protocols.patch b/debian/patches/configure-default-browse-protocols.patch new file mode 100644 index 0000000..65a5d92 --- /dev/null +++ b/debian/patches/configure-default-browse-protocols.patch @@ -0,0 +1,22 @@ +Author: till.kamppeter@gmail.com + +--- a/config-scripts/cups-defaults.m4 ++++ b/config-scripts/cups-defaults.m4 +@@ -95,7 +95,7 @@ + default_local_protocols="$withval", + default_local_protocols="default") + +-if test x$with_local_protocols != xno; then ++if test "x$with_local_protocols" != "xno"; then + if test "x$default_local_protocols" = "xdefault"; then + if test "x$DNSSDLIBS" != "x"; then + CUPS_BROWSE_LOCAL_PROTOCOLS="CUPS dnssd" +@@ -118,7 +118,7 @@ + default_remote_protocols="$withval", + default_remote_protocols="default") + +-if test x$with_remote_protocols != xno; then ++if test "x$with_remote_protocols" != "xno"; then + if test "x$default_remote_protocols" = "xdefault"; then + if test "$uname" = "Darwin" -a $uversion -ge 90; then + CUPS_BROWSE_REMOTE_PROTOCOLS="" diff --git a/debian/patches/cups-avahi.patch b/debian/patches/cups-avahi.patch new file mode 100644 index 0000000..7353e5d --- /dev/null +++ b/debian/patches/cups-avahi.patch @@ -0,0 +1,3193 @@ +Description: Avahi support +Bug: http://www.cups.org/str.php?L3066 +Author: Tim Waugh +Origin: git clone http://twaugh.fedorapeople.org/cups-avahi.git (Aug 11, 2011) + +--- a/backend/dnssd.c ++++ b/backend/dnssd.c +@@ -15,14 +15,21 @@ + * + * Contents: + * ++ * next_txt_record() - Get next TXT record from a cups_txt_records_t. ++ * parse_txt_record_pair() - Read key/value pair in cups_txt_records_t. + * main() - Browse for printers. + * browse_callback() - Browse devices. + * browse_local_callback() - Browse local devices. + * compare_devices() - Compare two devices. + * exec_backend() - Execute the backend that corresponds to the + * resolved service name. ++ * device_type() - Get DNS-SD type enumeration from string. + * get_device() - Create or update a device. + * query_callback() - Process query data. ++ * avahi_client_callback() - Avahi client callback function. ++ * avahi_query_callback() - Avahi query callback function. ++ * avahi_browse_callback() - Avahi browse callback function. ++ * find_device() - Find a device from its name and domain. + * sigterm_handler() - Handle termination signals... + * unquote() - Unquote a name string. + */ +@@ -33,7 +40,18 @@ + + #include "backend-private.h" + #include +-#include ++#ifdef HAVE_DNSSD ++# include ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++# include ++# include ++# include ++# include ++# include ++# include ++#define kDNSServiceMaxDomainName AVAHI_DOMAIN_NAME_MAX ++#endif /* HAVE_AVAHI */ + + + /* +@@ -53,7 +71,12 @@ + + typedef struct + { ++#ifdef HAVE_DNSSD + DNSServiceRef ref; /* Service reference for resolve */ ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ int resolved; /* Did we resolve the device? */ ++#endif /* HAVE_AVAHI */ + char *name, /* Service name */ + *domain, /* Domain name */ + *fullName, /* Full name */ +@@ -65,6 +88,20 @@ + sent; /* Did we list the device? */ + } cups_device_t; + ++typedef struct ++{ ++ char key[256]; ++ char value[256]; ++ ++#ifdef HAVE_DNSSD ++ const uint8_t *data; ++ const uint8_t *datanext; ++ const uint8_t *dataend; ++#else /* HAVE_AVAHI */ ++ AvahiStringList *txt; ++#endif /* HAVE_DNSSD */ ++} cups_txt_records_t; ++ + + /* + * Local globals... +@@ -78,6 +115,7 @@ + * Local functions... + */ + ++#ifdef HAVE_DNSSD + static void browse_callback(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, +@@ -95,13 +133,6 @@ + const char *replyDomain, + void *context) + __attribute__((nonnull(1,5,6,7,8))); +-static int compare_devices(cups_device_t *a, cups_device_t *b); +-static void exec_backend(char **argv); +-static cups_device_t *get_device(cups_array_t *devices, +- const char *serviceName, +- const char *regtype, +- const char *replyDomain) +- __attribute__((nonnull(1,2,3,4))); + static void query_callback(DNSServiceRef sdRef, + DNSServiceFlags flags, + uint32_t interfaceIndex, +@@ -111,10 +142,119 @@ + const void *rdata, uint32_t ttl, + void *context) + __attribute__((nonnull(1,5,9,11))); ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++static void avahi_client_callback (AvahiClient *client, ++ AvahiClientState state, ++ void *context); ++static void avahi_browse_callback (AvahiServiceBrowser *browser, ++ AvahiIfIndex interface, ++ AvahiProtocol protocol, ++ AvahiBrowserEvent event, ++ const char *serviceName, ++ const char *regtype, ++ const char *replyDomain, ++ AvahiLookupResultFlags flags, ++ void *context); ++#endif /* HAVE_AVAHI */ ++ ++static cups_device_t * find_device (cups_array_t *devices, ++ cups_txt_records_t *txt, ++ cups_device_t *dkey); ++static int compare_devices(cups_device_t *a, cups_device_t *b); ++static void exec_backend(char **argv); ++static cups_device_t *get_device(cups_array_t *devices, ++ const char *serviceName, ++ const char *regtype, ++ const char *replyDomain); + static void sigterm_handler(int sig); + static void unquote(char *dst, const char *src, size_t dstsize) + __attribute__((nonnull(1,2))); + ++#ifdef HAVE_AVAHI ++static AvahiSimplePoll *simple_poll = NULL; ++static int avahi_got_callback; ++#endif /* HAVE_AVAHI */ ++ ++ ++/* ++ * 'next_txt_record()' - Get next TXT record from a cups_txt_records_t. ++ */ ++ ++static cups_txt_records_t * ++next_txt_record (cups_txt_records_t *txt) ++{ ++#ifdef HAVE_DNSSD ++ txt->data = txt->datanext; ++#else /* HAVE_AVAHI */ ++ txt->txt = avahi_string_list_get_next (txt->txt); ++ if (txt->txt == NULL) ++ return NULL; ++#endif /* HAVE_DNSSD */ ++ ++ return txt; ++} ++ ++ ++/* ++ * 'parse_txt_record_pair()' - Read key/value pair in cups_txt_records_t. ++ */ ++ ++static int ++parse_txt_record_pair (cups_txt_records_t *txt) ++{ ++#ifdef HAVE_DNSSD ++ uint8_t datalen; ++ uint8_t *data = txt->data; ++ char *ptr; ++ ++ /* ++ * Read a key/value pair starting with an 8-bit length. Since the ++ * length is 8 bits and the size of the key/value buffers is 256, we ++ * don't need to check for overflow... ++ */ ++ ++ datalen = *data++; ++ if (!datalen || (data + datalen) > txt->dataend) ++ return NULL; ++ txt->datanext = data + datalen; ++ ++ for (ptr = txt->key; data < txt->datanext && *data != '='; data ++) ++ *ptr++ = *data; ++ *ptr = '\0'; ++ ++ if (data < txt->datanext && *data == '=') ++ { ++ data++; ++ ++ if (data < datanext) ++ memcpy (txt->value, data, txt->datanext - data); ++ value[txt->datanext - data] = '\0'; ++ } ++ else ++ return 1; ++#else /* HAVE_AVAHI */ ++ char *key, *value; ++ size_t len; ++ avahi_string_list_get_pair (txt->txt, &key, &value, &len); ++ if (len > sizeof (txt->value) - 1) ++ len = sizeof (txt->value) - 1; ++ ++ memcpy (txt->value, value, len); ++ txt->value[len] = '\0'; ++ len = strlen (key); ++ if (len > sizeof (txt->key) - 1) ++ len = sizeof (txt->key) - 1; ++ ++ memcpy (txt->key, key, len); ++ txt->key[len] = '\0'; ++ avahi_free (key); ++ avahi_free (value); ++#endif /* HAVE_AVAHI */ ++ ++ return 0; ++} ++ + + /* + * 'main()' - Browse for printers. +@@ -125,6 +265,13 @@ + char *argv[]) /* I - Command-line arguments */ + { + const char *name; /* Backend name */ ++ cups_array_t *devices; /* Device array */ ++ cups_device_t *device; /* Current device */ ++ char uriName[1024]; /* Unquoted fullName for URI */ ++#ifdef HAVE_DNSSD ++ int fd; /* Main file descriptor */ ++ fd_set input; /* Input set for select() */ ++ struct timeval timeout; /* Timeout for select() */ + DNSServiceRef main_ref, /* Main service reference */ + fax_ipp_ref, /* IPP fax service reference */ + ipp_ref, /* IPP service reference */ +@@ -138,12 +285,11 @@ + pdl_datastream_ref, /* AppSocket service reference */ + printer_ref, /* LPD service reference */ + riousbprint_ref; /* Remote IO service reference */ +- int fd; /* Main file descriptor */ +- fd_set input; /* Input set for select() */ +- struct timeval timeout; /* Timeout for select() */ +- cups_array_t *devices; /* Device array */ +- cups_device_t *device; /* Current device */ +- char uriName[1024]; /* Unquoted fullName for URI */ ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ AvahiClient *client; ++ int error; ++#endif /* HAVE_AVAHI */ + #if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ + #endif /* HAVE_SIGACTION && !HAVE_SIGSET */ +@@ -203,6 +349,49 @@ + * Browse for different kinds of printers... + */ + ++#ifdef HAVE_AVAHI ++ if ((simple_poll = avahi_simple_poll_new ()) == NULL) ++ { ++ perror ("ERROR: Unable to create avahi simple poll object"); ++ return (1); ++ } ++ ++ client = avahi_client_new (avahi_simple_poll_get (simple_poll), ++ 0, avahi_client_callback, NULL, &error); ++ if (!client) ++ { ++ perror ("DEBUG: Unable to create avahi client"); ++ return (0); ++ } ++ ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_fax-ipp._tcp", NULL, 0, ++ avahi_browse_callback, devices); ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_ipp._tcp", NULL, 0, ++ avahi_browse_callback, devices); ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_ipp-tls._tcp", NULL, 0, ++ avahi_browse_callback, devices); ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_pdl-datastream._tcp", ++ NULL, 0, ++ avahi_browse_callback, ++ devices); ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_printer._tcp", NULL, 0, ++ avahi_browse_callback, devices); ++ avahi_service_browser_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ "_riousbprint._tcp", NULL, 0, ++ avahi_browse_callback, devices); ++#endif /* HAVE_AVAHI */ ++#ifdef HAVE_DNSSD + if (DNSServiceCreateConnection(&main_ref) != kDNSServiceErr_NoError) + { + perror("ERROR: Unable to create service connection"); +@@ -263,6 +452,7 @@ + riousbprint_ref = main_ref; + DNSServiceBrowse(&riousbprint_ref, kDNSServiceFlagsShareConnection, 0, + "_riousbprint._tcp", NULL, browse_callback, devices); ++#endif /* HAVE_DNSSD */ + + /* + * Loop until we are killed... +@@ -270,6 +460,9 @@ + + while (!job_canceled) + { ++ int announce = 0; ++ ++#ifdef HAVE_DNSSD + FD_ZERO(&input); + FD_SET(fd, &input); + +@@ -289,11 +482,35 @@ + } + else + { ++ announce = 1; ++ } ++#else /* HAVE_AVAHI */ ++ int r; ++ avahi_got_callback = 0; ++ r = avahi_simple_poll_iterate (simple_poll, 1); ++ if (r != 0 && r != EINTR) ++ { ++ /* ++ * We've been told to exit the loop. Perhaps the connection to ++ * avahi failed. ++ */ ++ ++ break; ++ } ++ ++ if (avahi_got_callback) ++ announce = 1; ++#endif /* HAVE_DNSSD */ ++ ++ if (announce) ++ { + /* + * Announce any devices we've found... + */ + ++#ifdef HAVE_DNSSD + DNSServiceErrorType status; /* DNS query status */ ++#endif /* HAVE_DNSSD */ + cups_device_t *best; /* Best matching device */ + char device_uri[1024]; /* Device URI */ + int count; /* Number of queries */ +@@ -307,6 +524,7 @@ + if (device->sent) + sent ++; + ++#ifdef HAVE_DNSSD + if (device->ref) + count ++; + +@@ -338,14 +556,23 @@ + count ++; + } + } +- else if (!device->sent) ++ else ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ if (!device->resolved) ++ continue; ++ else ++#endif /* HAVE_AVAHI */ ++ if (!device->sent) + { ++#ifdef HAVE_DNSSD + /* + * Got the TXT records, now report the device... + */ + + DNSServiceRefDeallocate(device->ref); + device->ref = 0; ++#endif /* HAVE_DNSSD */ + + if (!best) + best = device; +@@ -406,6 +633,7 @@ + } + + ++#ifdef HAVE_DNSSD + /* + * 'browse_callback()' - Browse devices. + */ +@@ -494,6 +722,7 @@ + device->fullName); + device->sent = 1; + } ++#endif /* HAVE_DNSSD */ + + + /* +@@ -574,6 +803,41 @@ + + + /* ++ * 'device_type()' - Get DNS-SD type enumeration from string. ++ */ ++ ++static int ++device_type (const char *regtype) ++{ ++#ifdef HAVE_AVAHI ++ if (!strcmp(regtype, "_ipp._tcp")) ++ return (CUPS_DEVICE_IPP); ++ else if (!strcmp(regtype, "_ipps._tcp") || ++ !strcmp(regtype, "_ipp-tls._tcp")) ++ return (CUPS_DEVICE_IPPS); ++ else if (!strcmp(regtype, "_fax-ipp._tcp")) ++ return (CUPS_DEVICE_FAX_IPP); ++ else if (!strcmp(regtype, "_printer._tcp")) ++ return (CUPS_DEVICE_PDL_DATASTREAM); ++#else ++ if (!strcmp(regtype, "_ipp._tcp.")) ++ return (CUPS_DEVICE_IPP); ++ else if (!strcmp(regtype, "_ipps._tcp.") || ++ !strcmp(regtype, "_ipp-tls._tcp.")) ++ return (CUPS_DEVICE_IPPS); ++ else if (!strcmp(regtype, "_fax-ipp._tcp.")) ++ return (CUPS_DEVICE_FAX_IPP); ++ else if (!strcmp(regtype, "_printer._tcp.")) ++ return (CUPS_DEVICE_PRINTER); ++ else if (!strcmp(regtype, "_pdl-datastream._tcp.")) ++ return (CUPS_DEVICE_PDL_DATASTREAM); ++#endif /* HAVE_AVAHI */ ++ ++ return (CUPS_DEVICE_RIOUSBPRINT); ++} ++ ++ ++/* + * 'get_device()' - Create or update a device. + */ + +@@ -594,20 +858,7 @@ + */ + + key.name = (char *)serviceName; +- +- if (!strcmp(regtype, "_ipp._tcp.")) +- key.type = CUPS_DEVICE_IPP; +- else if (!strcmp(regtype, "_ipps._tcp.") || +- !strcmp(regtype, "_ipp-tls._tcp.")) +- key.type = CUPS_DEVICE_IPPS; +- else if (!strcmp(regtype, "_fax-ipp._tcp.")) +- key.type = CUPS_DEVICE_FAX_IPP; +- else if (!strcmp(regtype, "_printer._tcp.")) +- key.type = CUPS_DEVICE_PRINTER; +- else if (!strcmp(regtype, "_pdl-datastream._tcp.")) +- key.type = CUPS_DEVICE_PDL_DATASTREAM; +- else +- key.type = CUPS_DEVICE_RIOUSBPRINT; ++ key.type = device_type (regtype); + + for (device = cupsArrayFind(devices, &key); + device; +@@ -627,8 +878,14 @@ + free(device->domain); + device->domain = strdup(replyDomain); + ++#ifdef HAVE_DNSSD + DNSServiceConstructFullName(fullName, device->name, regtype, + replyDomain); ++#else /* HAVE_AVAHI */ ++ avahi_service_name_join (fullName, kDNSServiceMaxDomainName, ++ serviceName, regtype, replyDomain); ++#endif /* HAVE_DNSSD */ ++ + free(device->fullName); + device->fullName = strdup(fullName); + } +@@ -648,6 +905,9 @@ + device->domain = strdup(replyDomain); + device->type = key.type; + device->priority = 50; ++#ifdef HAVE_AVAHI ++ device->resolved = 0; ++#endif /* HAVE_AVAHI */ + + cupsArrayAdd(devices, device); + +@@ -655,13 +915,20 @@ + * Set the "full name" of this service, which is used for queries... + */ + ++#ifdef HAVE_DNSSD + DNSServiceConstructFullName(fullName, serviceName, regtype, replyDomain); ++#else /* HAVE_AVAHI */ ++ avahi_service_name_join (fullName, kDNSServiceMaxDomainName, ++ serviceName, regtype, replyDomain); ++#endif /* HAVE_DNSSD */ ++ + device->fullName = strdup(fullName); + + return (device); + } + + ++#ifdef HAVE_DNSSD + /* + * 'query_callback()' - Process query data. + */ +@@ -685,7 +952,7 @@ + *ptr; /* Pointer into string */ + cups_device_t dkey, /* Search key */ + *device; /* Device */ +- ++ cups_txt_records_t txt; + + fprintf(stderr, "DEBUG2: query_callback(sdRef=%p, flags=%x, " + "interfaceIndex=%d, errorCode=%d, fullName=\"%s\", " +@@ -719,94 +986,233 @@ + if ((ptr = strstr(name, "._")) != NULL) + *ptr = '\0'; + +- if (strstr(fullName, "_ipp._tcp.")) +- dkey.type = CUPS_DEVICE_IPP; +- else if (strstr(fullName, "_ipps._tcp.") || +- strstr(fullName, "_ipp-tls._tcp.")) +- dkey.type = CUPS_DEVICE_IPPS; +- else if (strstr(fullName, "_fax-ipp._tcp.")) +- dkey.type = CUPS_DEVICE_FAX_IPP; +- else if (strstr(fullName, "_printer._tcp.")) +- dkey.type = CUPS_DEVICE_PRINTER; +- else if (strstr(fullName, "_pdl-datastream._tcp.")) +- dkey.type = CUPS_DEVICE_PDL_DATASTREAM; ++ dkey.type = device_type (fullName); ++ ++ txt.data = rdata; ++ txt.dataend = rdata + rdlen; ++ device = find_device ((cups_array_t *) context, &txt, &dkey); ++ if (!device) ++ fprintf(stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", fullName); ++} ++#endif /* HAVE_DNSSD */ ++ ++ ++#ifdef HAVE_AVAHI ++/* ++ * 'avahi_client_callback()' - Avahi client callback function. ++ */ ++ ++static void ++avahi_client_callback(AvahiClient *client, ++ AvahiClientState state, ++ void *context) ++{ ++ /* ++ * If the connection drops, quit. ++ */ ++ ++ if (state == AVAHI_CLIENT_FAILURE) ++ { ++ fprintf (stderr, "ERROR: Avahi connection failed\n"); ++ avahi_simple_poll_quit (simple_poll); ++ } ++} ++ ++ ++/* ++ * 'avahi_query_callback()' - Avahi query callback function. ++ */ ++ ++static void ++avahi_query_callback(AvahiServiceResolver *resolver, ++ AvahiIfIndex interface, ++ AvahiProtocol protocol, ++ AvahiResolverEvent event, ++ const char *name, ++ const char *type, ++ const char *domain, ++ const char *host_name, ++ const AvahiAddress *address, ++ uint16_t port, ++ AvahiStringList *txt, ++ AvahiLookupResultFlags flags, ++ void *context) ++{ ++ AvahiClient *client; ++ cups_device_t key, ++ *device; ++ char uqname[1024], ++ *ptr; ++ cups_txt_records_t txtr; ++ ++ client = avahi_service_resolver_get_client (resolver); ++ if (event != AVAHI_RESOLVER_FOUND) ++ { ++ if (event == AVAHI_RESOLVER_FAILURE) ++ { ++ fprintf (stderr, "ERROR: %s\n", ++ avahi_strerror (avahi_client_errno (client))); ++ } ++ ++ avahi_service_resolver_free (resolver); ++ return; ++ } ++ ++ /* ++ * Set search key for device. ++ */ ++ ++ key.name = uqname; ++ unquote (uqname, name, sizeof (uqname)); ++ if ((ptr = strstr(name, "._")) != NULL) ++ *ptr = '\0'; ++ ++ key.domain = (char *) domain; ++ key.type = device_type (type); ++ ++ /* ++ * Find the device and the the TXT information. ++ */ ++ ++ txtr.txt = txt; ++ device = find_device ((cups_array_t *) context, &txtr, &key); ++ if (device) ++ { ++ /* ++ * Let the main loop know to announce the device. ++ */ ++ ++ device->resolved = 1; ++ avahi_got_callback = 1; ++ } + else +- dkey.type = CUPS_DEVICE_RIOUSBPRINT; ++ fprintf (stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", name); ++ ++ avahi_service_resolver_free (resolver); ++} + +- for (device = cupsArrayFind(devices, &dkey); ++ ++/* ++ * 'avahi_browse_callback()' - Avahi browse callback function. ++ */ ++ ++static void ++avahi_browse_callback(AvahiServiceBrowser *browser, ++ AvahiIfIndex interface, ++ AvahiProtocol protocol, ++ AvahiBrowserEvent event, ++ const char *name, ++ const char *type, ++ const char *domain, ++ AvahiLookupResultFlags flags, ++ void *context) ++{ ++ AvahiClient *client = avahi_service_browser_get_client (browser); ++ ++ switch (event) ++ { ++ case AVAHI_BROWSER_FAILURE: ++ fprintf (stderr, "ERROR: %s\n", ++ avahi_strerror (avahi_client_errno (client))); ++ avahi_simple_poll_quit (simple_poll); ++ return; ++ ++ case AVAHI_BROWSER_NEW: ++ /* ++ * This object is new on the network. ++ */ ++ ++ if (flags & AVAHI_LOOKUP_RESULT_LOCAL) ++ { ++ /* ++ * This comes from the local machine so ignore it. ++ */ ++ ++ fprintf (stderr, "DEBUG: ignoring local service %s\n", name); ++ } ++ else ++ { ++ /* ++ * Create a device entry for it if it doesn't yet exist. ++ */ ++ ++ get_device ((cups_array_t *)context, name, type, domain); ++ ++ /* ++ * Now look for a TXT entry. ++ */ ++ ++ if (avahi_service_resolver_new (client, interface, protocol, ++ name, type, domain, ++ AVAHI_PROTO_UNSPEC, 0, ++ avahi_query_callback, context) == NULL) ++ { ++ fprintf (stderr, "ERROR: failed to resolve service %s: %s\n", ++ name, avahi_strerror (avahi_client_errno (client))); ++ } ++ } ++ ++ break; ++ ++ case AVAHI_BROWSER_REMOVE: ++ case AVAHI_BROWSER_ALL_FOR_NOW: ++ case AVAHI_BROWSER_CACHE_EXHAUSTED: ++ break; ++ } ++} ++#endif /* HAVE_AVAHI */ ++ ++ ++/* ++ * 'find_device()' - Find a device from its name and domain. ++ */ ++ ++static cups_device_t * ++find_device (cups_array_t *devices, ++ cups_txt_records_t *txt, ++ cups_device_t *dkey) ++{ ++ cups_device_t *device; ++ char *ptr; ++ ++ for (device = cupsArrayFind(devices, dkey); + device; + device = cupsArrayNext(devices)) + { +- if (_cups_strcasecmp(device->name, dkey.name) || +- _cups_strcasecmp(device->domain, dkey.domain)) ++ if (_cups_strcasecmp(device->name, dkey->name) || ++ _cups_strcasecmp(device->domain, dkey->domain)) + { + device = NULL; + break; + } +- else if (device->type == dkey.type) ++ else if (device->type == dkey->type) + { + /* + * Found it, pull out the priority and make and model from the TXT + * record and save it... + */ + +- const uint8_t *data, /* Pointer into data */ +- *datanext, /* Next key/value pair */ +- *dataend; /* End of entire TXT record */ +- uint8_t datalen; /* Length of current key/value pair */ +- char key[256], /* Key string */ +- value[256], /* Value string */ +- make_and_model[512], ++ char make_and_model[512], + /* Manufacturer and model */ + model[256], /* Model */ +- device_id[2048];/* 1284 device ID */ +- ++ device_id[2048]; /* 1284 device ID */ + + device_id[0] = '\0'; + make_and_model[0] = '\0'; + + strcpy(model, "Unknown"); + +- for (data = rdata, dataend = data + rdlen; +- data < dataend; +- data = datanext) ++ for (;;) + { +- /* +- * Read a key/value pair starting with an 8-bit length. Since the +- * length is 8 bits and the size of the key/value buffers is 256, we +- * don't need to check for overflow... +- */ ++ char *key; ++ char *value; + +- datalen = *data++; ++ if (parse_txt_record_pair (txt)) ++ goto next; + +- if (!datalen || (data + datalen) > dataend) +- break; +- +- datanext = data + datalen; +- +- for (ptr = key; data < datanext && *data != '='; data ++) +- *ptr++ = *data; +- *ptr = '\0'; +- +- if (data < datanext && *data == '=') +- { +- data ++; +- +- if (data < datanext) +- memcpy(value, data, datanext - data); +- value[datanext - data] = '\0'; +- +- fprintf(stderr, "DEBUG2: query_callback: \"%s=%s\".\n", +- key, value); +- } +- else +- { +- fprintf(stderr, "DEBUG2: query_callback: \"%s\" with no value.\n", +- key); +- continue; +- } +- +- if (!_cups_strncasecmp(key, "usb_", 4)) ++ key = txt->key; ++ value = txt->value; ++ if (!strncasecmp(key, "usb_", 4)) + { + /* + * Add USB device ID information... +@@ -861,6 +1267,10 @@ + if (device->type == CUPS_DEVICE_PRINTER) + device->sent = 1; + } ++ ++ next: ++ if (next_txt_record (txt) == NULL) ++ break; + } + + if (device->device_id) +@@ -910,11 +1320,9 @@ + } + } + +- if (!device) +- fprintf(stderr, "DEBUG: Ignoring TXT record for \"%s\"...\n", fullName); ++ return device; + } + +- + /* + * 'sigterm_handler()' - Handle termination signals... + */ +--- a/config-scripts/cups-dnssd.m4 ++++ b/config-scripts/cups-dnssd.m4 +@@ -23,6 +23,21 @@ + DNSSDLIBS="" + DNSSD_BACKEND="" + ++AC_ARG_ENABLE(avahi, [ --enable-avahi turn on DNS Service Discovery support, default=no], ++ [if test x$enable_avahi = xyes; then ++ AC_MSG_CHECKING(for Avahi) ++ if $PKGCONFIG --exists avahi-client; then ++ AC_MSG_RESULT(yes) ++ CFLAGS="$CFLAGS `$PKGCONFIG --cflags avahi-client`" ++ DNSSDLIBS="`$PKGCONFIG --libs avahi-client`" ++ DNSSD_BACKEND="dnssd" ++ AC_DEFINE(HAVE_AVAHI) ++ enable_dnssd=no ++ else ++ AC_MSG_RESULT(no) ++ fi ++ fi]) ++ + if test x$enable_dnssd != xno; then + AC_CHECK_HEADER(dns_sd.h, [ + case "$uname" in +--- a/config.h.in ++++ b/config.h.in +@@ -397,6 +397,13 @@ + + + /* ++ * Do we have Avahi for DNS Service Discovery? ++ */ ++ ++#undef HAVE_AVAHI ++ ++ ++/* + * Do we have ? + */ + +--- a/cups/http-support.c ++++ b/cups/http-support.c +@@ -43,6 +43,10 @@ + * http_copy_decode() - Copy and decode a URI. + * http_copy_encode() - Copy and encode a URI. + * http_resolve_cb() - Build a device URI for the given service name. ++ * avahi_resolve_uri_client_cb() ++ * - Avahi client callback for resolving URI. ++ * avahi_resolve_uri_resolver_cb() ++ * - Avahi resolver callback for resolving URI. + */ + + /* +@@ -60,6 +64,11 @@ + # include + # endif /* WIN32 */ + #endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++# include ++# include ++# include ++#endif /* HAVE_AVAHI */ + + + /* +@@ -127,6 +136,24 @@ + void *context); + #endif /* HAVE_DNSSD */ + ++#ifdef HAVE_AVAHI ++static void avahi_resolve_uri_client_cb(AvahiClient *client, ++ AvahiClientState state, ++ void *simple_poll); ++static void avahi_resolve_uri_resolver_cb(AvahiServiceResolver *resolver, ++ AvahiIfIndex interface, ++ AvahiProtocol protocol, ++ AvahiResolverEvent event, ++ const char *name, ++ const char *type, ++ const char *domain, ++ const char *host_name, ++ const AvahiAddress *address, ++ uint16_t port, ++ AvahiStringList *txt, ++ AvahiLookupResultFlags flags, ++ void *context); ++#endif /* HAVE_AVAHI */ + + /* + * 'httpAssembleURI()' - Assemble a uniform resource identifier from its +@@ -1434,6 +1461,9 @@ + + if (strstr(hostname, "._tcp")) + { ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ++ char *regtype, /* Pointer to type in hostname */ ++ *domain; /* Pointer to domain in hostname */ + #ifdef HAVE_DNSSD + # ifdef WIN32 + # pragma comment(lib, "dnssd.lib") +@@ -1452,6 +1482,17 @@ + fd_set input_set; /* Input set for select() */ + struct timeval stimeout; /* Timeout value for select() */ + #endif /* HAVE_POLL */ ++#else /* HAVE_AVAHI */ ++ AvahiSimplePoll *simple_poll; ++ AvahiClient *client; ++ int error; ++ struct ++ { ++ AvahiSimplePoll *poll; ++ _http_uribuf_t uribuf; ++ } user_data; ++#endif /* HAVE_DNSSD */ ++ + + if (options & _HTTP_RESOLVE_STDERR) + fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname); +@@ -1488,9 +1529,16 @@ + if (domain) + *domain++ = '\0'; + ++#ifdef HAVE_DNSSD + uribuf.buffer = resolved_uri; + uribuf.bufsize = resolved_size; + uribuf.options = options; ++#else ++ user_data.uribuf.buffer = resolved_uri; ++ user_data.uribuf.bufsize = resolved_size; ++ user_data.uribuf.options = options; ++#endif ++ + resolved_uri[0] = '\0'; + + DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", " +@@ -1504,6 +1552,7 @@ + + uri = NULL; + ++#ifdef HAVE_DNSSD + if (DNSServiceCreateConnection(&ref) == kDNSServiceErr_NoError) + { + localref = ref; +@@ -1611,6 +1660,36 @@ + + DNSServiceRefDeallocate(ref); + } ++#else /* HAVE_AVAHI */ ++ if ((simple_poll = avahi_simple_poll_new ()) != NULL) ++ { ++ if ((client = avahi_client_new (avahi_simple_poll_get (simple_poll), ++ 0, avahi_resolve_uri_client_cb, ++ &simple_poll, &error)) != NULL) ++ { ++ user_data.poll = simple_poll; ++ if (avahi_service_resolver_new (client, AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, hostname, ++ regtype, domain, AVAHI_PROTO_UNSPEC, 0, ++ avahi_resolve_uri_resolver_cb, ++ &user_data) != NULL) ++ { ++ avahi_simple_poll_loop (simple_poll); ++ ++ /* ++ * Collect the result. ++ */ ++ ++ if (resolved_uri[0]) ++ uri = resolved_uri; ++ } ++ ++ avahi_client_free (client); ++ } ++ ++ avahi_simple_poll_free (simple_poll); ++ } ++#endif /* HAVE_DNSSD */ + + if (options & _HTTP_RESOLVE_STDERR) + { +@@ -1622,13 +1701,13 @@ + fputs("STATE: -connecting-to-device,offline-report\n", stderr); + } + +-#else ++#else /* HAVE_DNSSD || HAVE_AVAHI */ + /* + * No DNS-SD support... + */ + + uri = NULL; +-#endif /* HAVE_DNSSD */ ++#endif /* HAVE_DNSSD || HAVE_AVAHI */ + + if ((options & _HTTP_RESOLVE_STDERR) && !uri) + _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer.")); +@@ -1917,6 +1996,116 @@ + #endif /* HAVE_DNSSD */ + + ++#ifdef HAVE_AVAHI ++/* ++ * 'avahi_resolve_uri_client_cb()' - Avahi client callback for resolving URI. ++ */ ++ ++static void ++avahi_resolve_uri_client_cb (AvahiClient *client, ++ AvahiClientState state, ++ void *simple_poll) ++{ ++ DEBUG_printf(("avahi_resolve_uri_client_callback(client=%p, state=%d, " ++ "simple_poll=%p)\n", client, state, simple_poll)); ++ ++ /* ++ * If the connection drops, quit. ++ */ ++ ++ if (state == AVAHI_CLIENT_FAILURE) ++ avahi_simple_poll_quit (simple_poll); ++} ++ ++ ++/* ++ * 'avahi_resolve_uri_resolver_cb()' - Avahi resolver callback for resolving ++ * URI. ++ */ ++ ++static void ++avahi_resolve_uri_resolver_cb (AvahiServiceResolver *resolver, ++ AvahiIfIndex interface, ++ AvahiProtocol protocol, ++ AvahiResolverEvent event, ++ const char *name, ++ const char *type, ++ const char *domain, ++ const char *host_name, ++ const AvahiAddress *address, ++ uint16_t port, ++ AvahiStringList *txt, ++ AvahiLookupResultFlags flags, ++ void *context) ++{ ++ const char *scheme; /* URI scheme */ ++ char rp[256]; /* Remote printer */ ++ AvahiStringList *pair; ++ char *value; ++ size_t valueLen = 0; ++ char addr[AVAHI_ADDRESS_STR_MAX]; ++ struct ++ { ++ AvahiSimplePoll *poll; ++ _http_uribuf_t uribuf; ++ } *poll_uribuf = context; ++ ++ DEBUG_printf(("avahi_resolve_uri_resolver_callback(resolver=%p, " ++ "interface=%d, protocol=%d, event=%d, name=\"%s\", " ++ "type=\"%s\", domain=\"%s\", host_name=\"%s\", address=%p, " ++ "port=%d, txt=%p, flags=%d, context=%p)\n", ++ resolver, interface, protocol, event, name, type, domain, ++ host_name, address, port, txt, flags, context)); ++ ++ if (event != AVAHI_RESOLVER_FOUND) ++ { ++ avahi_service_resolver_free (resolver); ++ avahi_simple_poll_quit (poll_uribuf->poll); ++ return; ++ } ++ ++ /* ++ * Figure out the scheme from the full name... ++ */ ++ ++ if (strstr(type, "_ipp.")) ++ scheme = "ipp"; ++ else if (strstr(type, "_printer.")) ++ scheme = "lpd"; ++ else if (strstr(type, "_pdl-datastream.")) ++ scheme = "socket"; ++ else ++ scheme = "riousbprint"; ++ ++ /* ++ * Extract the "remote printer key from the TXT record... ++ */ ++ ++ if ((pair = avahi_string_list_find (txt, "rp")) != NULL) ++ { ++ avahi_string_list_get_pair (pair, NULL, &value, &valueLen); ++ rp[0] = '/'; ++ memcpy (rp + 1, value, valueLen); ++ rp[valueLen + 1] = '\0'; ++ } ++ else ++ rp[0] = '\0'; ++ ++ /* ++ * Assemble the final device URI... ++ */ ++ ++ avahi_address_snprint (addr, AVAHI_ADDRESS_STR_MAX, address); ++ httpAssembleURI(HTTP_URI_CODING_ALL, poll_uribuf->uribuf.buffer, ++ poll_uribuf->uribuf.bufsize, scheme, NULL, ++ addr, port, rp); ++ DEBUG_printf(("avahi_resolve_uri_resolver_callback: Resolved URI is \"%s\"\n", ++ poll_uribuf->uribuf.buffer)); ++ avahi_simple_poll_quit (poll_uribuf->poll); ++} ++#endif /* HAVE_AVAHI */ ++ ++ + /* + * End of "$Id: http-support.c 10284 2012-02-15 01:06:12Z mike $". + */ +--- a/scheduler/Makefile ++++ b/scheduler/Makefile +@@ -17,6 +17,7 @@ + + CUPSDOBJS = \ + auth.o \ ++ avahi.o \ + banners.o \ + cert.o \ + classes.o \ +@@ -39,7 +40,8 @@ + server.o \ + statbuf.o \ + subscriptions.o \ +- sysman.o ++ sysman.o \ ++ timeout.o + LIBOBJS = \ + filter.o \ + mime.o \ +--- /dev/null ++++ b/scheduler/avahi.c +@@ -0,0 +1,445 @@ ++/* ++ * "$Id$" ++ * ++ * Avahi poll implementation for the CUPS scheduler. ++ * ++ * Copyright (C) 2010 Red Hat, Inc. ++ * Authors: ++ * Tim Waugh ++ * ++ * Distribution and use rights are outlined in the file "LICENSE.txt" ++ * "LICENSE" which should have been included with this file. If this ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ * ++ * Contents: ++ * ++ * watch_read_cb - Read callback for file descriptor ++ * watch_write_cb - Write callback for file descriptor ++ * watched_fd_add_select() - Call cupsdAddSelect() as needed ++ * watch_new() - Create a new file descriptor watch ++ * watch_free() - Free a file descriptor watch ++ * watch_update() - Update watched events for a file descriptor ++ * watch_get_events() - Get events that happened for a file descriptor ++ * timeout_cb() - Run a timed Avahi callback ++ * timeout_new() - Set a wakeup time ++ * timeout_update() - Update the expiration time for a timeout ++ * timeout_free() - Free a timeout ++ * compare_watched_fds() - Compare watched file descriptors for array sorting ++ * compare_timeouts() - Compare timeouts for array sorting ++ * avahi_cups_poll_new() - Create a new Avahi main loop object for CUPS ++ * avahi_cups_poll_free() - Free an Avahi main loop object for CUPS ++ * avahi_cups_poll_get() - Get the abstract poll API structure ++ */ ++ ++#include ++ ++#ifdef HAVE_AVAHI /* Applies to entire file... */ ++ ++/* ++ * Include necessary headers... ++ */ ++ ++#include "cupsd.h" ++ ++#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) ++# include ++#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ ++ ++#ifdef HAVE_AVAHI ++# include ++#endif /* HAVE_AVAHI */ ++ ++ ++typedef struct ++{ ++ AvahiCupsPoll *cups_poll; ++ ++ int fd; ++ AvahiWatchEvent occurred; ++ cups_array_t *watches; ++} cupsd_watched_fd_t; ++ ++struct AvahiWatch ++{ ++ cupsd_watched_fd_t *watched_fd; ++ ++ AvahiWatchEvent events; ++ AvahiWatchCallback callback; ++ void *userdata; ++}; ++ ++struct AvahiTimeout ++{ ++ AvahiCupsPoll *cups_poll; ++ AvahiTimeoutCallback callback; ++ void *userdata; ++ cupsd_timeout_t *cupsd_timeout; ++}; ++ ++/* ++ * Local functions... ++ */ ++ ++static AvahiWatch * watch_new(const AvahiPoll *api, ++ int fd, ++ AvahiWatchEvent events, ++ AvahiWatchCallback callback, ++ void *userdata); ++static void watch_free(AvahiWatch *watch); ++static void watch_update(AvahiWatch *watch, ++ AvahiWatchEvent events); ++static AvahiWatchEvent watch_get_events(AvahiWatch *watch); ++static int compare_watches(AvahiWatch *p0, ++ AvahiWatch *p1); ++ ++ ++/* ++ * 'watch_read_cb' - Read callback for file descriptor ++ */ ++ ++static void ++watch_read_cb (void *userdata) ++{ ++ AvahiWatch *watch; ++ cupsd_watched_fd_t *watched_fd = userdata; ++ watched_fd->occurred |= AVAHI_WATCH_IN; ++ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); ++ watch; ++ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { ++ if (watch->events & watched_fd->occurred) { ++ (watch->callback) (watch, watched_fd->fd, ++ AVAHI_WATCH_IN, watch->userdata); ++ watched_fd->occurred &= ~AVAHI_WATCH_IN; ++ break; ++ } ++ } ++} ++ ++ ++/* ++ * 'watch_write_cb' - Write callback for file descriptor ++ */ ++ ++static void ++watch_write_cb (void *userdata) ++{ ++ AvahiWatch *watch; ++ cupsd_watched_fd_t *watched_fd = userdata; ++ watched_fd->occurred |= AVAHI_WATCH_OUT; ++ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); ++ watch; ++ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { ++ if (watch->events & watched_fd->occurred) { ++ (watch->callback) (watch, watched_fd->fd, ++ AVAHI_WATCH_OUT, watch->userdata); ++ watched_fd->occurred &= ~AVAHI_WATCH_OUT; ++ break; ++ } ++ } ++} ++ ++ ++/* ++ * 'watched_fd_add_select' - Call cupsdAddSelect() as needed ++ */ ++ ++static int /* O - Watches? */ ++watched_fd_add_select (cupsd_watched_fd_t *watched_fd) ++{ ++ AvahiWatch *watch; ++ cupsd_selfunc_t read_cb = NULL, write_cb = NULL; ++ ++ for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); ++ watch; ++ watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { ++ if (watch->events & (AVAHI_WATCH_IN | ++ AVAHI_WATCH_ERR | ++ AVAHI_WATCH_HUP)) { ++ read_cb = (cupsd_selfunc_t)watch_read_cb; ++ if (write_cb != NULL) ++ break; ++ } ++ ++ if (watch->events & AVAHI_WATCH_OUT) { ++ write_cb = (cupsd_selfunc_t)watch_write_cb; ++ if (read_cb != NULL) ++ break; ++ } ++ } ++ ++ if (read_cb || write_cb) ++ cupsdAddSelect (watched_fd->fd, read_cb, write_cb, watched_fd); ++ else ++ cupsdRemoveSelect (watched_fd->fd); ++ ++ return (read_cb || write_cb); ++} ++ ++/* ++ * 'watch_new' - Create a new file descriptor watch ++ */ ++ ++static AvahiWatch * ++watch_new (const AvahiPoll *api, ++ int fd, ++ AvahiWatchEvent events, ++ AvahiWatchCallback callback, ++ void *userdata) ++{ ++ cupsd_watched_fd_t key, *watched_fd; ++ AvahiCupsPoll *cups_poll = api->userdata; ++ AvahiWatch *watch = malloc(sizeof(AvahiWatch)); ++ if (watch == NULL) ++ return (NULL); ++ ++ watch->events = events; ++ watch->callback = callback; ++ watch->userdata = userdata; ++ ++ key.fd = fd; ++ watched_fd = cupsArrayFind (cups_poll->watched_fds, &key); ++ if (watched_fd == NULL) { ++ watched_fd = malloc(sizeof(cupsd_watched_fd_t)); ++ if (watched_fd == NULL) { ++ free (watch); ++ return (NULL); ++ } ++ ++ watched_fd->fd = fd; ++ watched_fd->occurred = 0; ++ watched_fd->cups_poll = cups_poll; ++ watched_fd->watches = cupsArrayNew ((cups_array_func_t)compare_watches, ++ NULL); ++ } ++ ++ watch->watched_fd = watched_fd; ++ cupsArrayAdd(watched_fd->watches, watch); ++ watched_fd_add_select (watched_fd); ++ return (watch); ++} ++ ++ ++/* ++ * 'watch_free' - Free a file descriptor watch ++ */ ++ ++static void ++watch_free (AvahiWatch *watch) ++{ ++ cupsd_watched_fd_t *watched_fd = watch->watched_fd; ++ AvahiCupsPoll *cups_poll = watched_fd->cups_poll; ++ ++ cupsArrayRemove (watched_fd->watches, watch); ++ free (watch); ++ ++ if (!watched_fd_add_select (watched_fd)) { ++ /* No more watches */ ++ cupsArrayRemove (cups_poll->watched_fds, watched_fd); ++ free (watched_fd); ++ } ++} ++ ++ ++/* ++ * 'watch_update' - Update watched events for a file descriptor ++ */ ++ ++static void ++watch_update (AvahiWatch *watch, ++ AvahiWatchEvent events) ++{ ++ watch->events = events; ++ watched_fd_add_select (watch->watched_fd); ++} ++ ++ ++/* ++ * 'watch_get_events' - Get events that happened for a file descriptor ++ */ ++ ++static AvahiWatchEvent ++watch_get_events (AvahiWatch *watch) ++{ ++ return (watch->watched_fd->occurred); ++} ++ ++ ++/* ++ * 'compare_watches' - Compare watches for array sorting ++ */ ++ ++static int ++compare_watches (AvahiWatch *p0, ++ AvahiWatch *p1) ++{ ++ if (p0->watched_fd->fd < p1->watched_fd->fd) ++ return (-1); ++ ++ return ((p0->watched_fd->fd == p1->watched_fd->fd) ? 0 : 1); ++} ++ ++ ++/* ++ * 'timeout_cb()' - Run a timed Avahi callback ++ */ ++ ++static void ++timeout_cb (cupsd_timeout_t *cupsd_timeout, void *userdata) ++{ ++ AvahiTimeout *timeout = userdata; ++ (timeout->callback) (timeout, timeout->userdata); ++} ++ ++ ++/* ++ * 'timeout_new' - Set a wakeup time ++ */ ++ ++static AvahiTimeout * ++timeout_new (const AvahiPoll *api, ++ const struct timeval *tv, ++ AvahiTimeoutCallback callback, ++ void *userdata) ++{ ++ AvahiTimeout *timeout; ++ AvahiCupsPoll *cups_poll = api->userdata; ++ ++ timeout = malloc(sizeof(AvahiTimeout)); ++ if (timeout == NULL) ++ return (NULL); ++ ++ timeout->cups_poll = cups_poll; ++ timeout->callback = callback; ++ timeout->userdata = userdata; ++ timeout->cupsd_timeout = cupsdAddTimeout (tv, ++ (cupsd_timeoutfunc_t)timeout_cb, ++ timeout); ++ cupsArrayAdd (cups_poll->timeouts, timeout); ++ return (timeout); ++} ++ ++ ++/* ++ * 'timeout_update' - Update the expiration time for a timeout ++ */ ++ ++static void ++timeout_update (AvahiTimeout *timeout, ++ const struct timeval *tv) ++{ ++ cupsdUpdateTimeout (timeout->cupsd_timeout, tv); ++} ++ ++ ++/* ++ * ' timeout_free' - Free a timeout ++ */ ++ ++static void ++timeout_free (AvahiTimeout *timeout) ++{ ++ cupsArrayRemove (timeout->cups_poll->timeouts, timeout); ++ cupsdRemoveTimeout (timeout->cupsd_timeout); ++ free (timeout); ++} ++ ++ ++/* ++ * 'compare_watched_fds' - Compare watched file descriptors for array sorting ++ */ ++static int ++compare_watched_fds(cupsd_watched_fd_t *p0, ++ cupsd_watched_fd_t *p1) ++{ ++ if (p0->fd != p1->fd) ++ return (p0->fd < p1->fd ? -1 : 1); ++ ++ if (p0 == p1) ++ return (0); ++ ++ return (p0 < p1 ? -1 : 1); ++} ++ ++ ++/* ++ * 'compare_timeouts' - Compare timeouts for array sorting ++ */ ++static int ++compare_timeouts(AvahiTimeout *p0, ++ AvahiTimeout *p1) ++{ ++ /* ++ * Just compare pointers to make it a stable sort. ++ */ ++ ++ if (p0->cupsd_timeout < p1->cupsd_timeout) ++ return (-1); ++ return ((p0->cupsd_timeout == p1->cupsd_timeout) ? 0 : 1); ++} ++ ++ ++/* ++ * 'avahi_cups_poll_new' - Create a new Avahi main loop object for CUPS ++ */ ++ ++AvahiCupsPoll * ++avahi_cups_poll_new (void) ++{ ++ AvahiCupsPoll *cups_poll = malloc(sizeof(AvahiCupsPoll)); ++ if (cups_poll == NULL) ++ return (NULL); ++ ++ cups_poll->watched_fds = cupsArrayNew ((cups_array_func_t)compare_watched_fds, ++ NULL); ++ cups_poll->timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, ++ NULL); ++ ++ cups_poll->api.userdata = cups_poll; ++ cups_poll->api.watch_new = watch_new; ++ cups_poll->api.watch_free = watch_free; ++ cups_poll->api.watch_update = watch_update; ++ cups_poll->api.watch_get_events = watch_get_events; ++ ++ cups_poll->api.timeout_new = timeout_new; ++ cups_poll->api.timeout_update = timeout_update; ++ cups_poll->api.timeout_free = timeout_free; ++ ++ return (cups_poll); ++} ++ ++ ++/* ++ * 'avahi_cups_poll_free' - Free an Avahi main loop object for CUPS ++ */ ++void ++avahi_cups_poll_free (AvahiCupsPoll *cups_poll) ++{ ++ cupsd_watched_fd_t *watched_fd; ++ ++ for (watched_fd = (cupsd_watched_fd_t*)cupsArrayFirst(cups_poll->watched_fds); ++ watched_fd; ++ watched_fd = (cupsd_watched_fd_t*)cupsArrayNext(cups_poll->watched_fds)){ ++ cupsArrayClear (watched_fd->watches); ++ } ++ ++ cupsArrayClear (cups_poll->watched_fds); ++ cupsArrayClear (cups_poll->timeouts); ++} ++ ++ ++/* ++ * 'avahi_cups_poll_get' - Get the abstract poll API structure ++ */ ++ ++const AvahiPoll * ++avahi_cups_poll_get (AvahiCupsPoll *cups_poll) ++{ ++ return (&cups_poll->api); ++} ++ ++ ++#endif /* HAVE_AVAHI ... from top of file */ ++ ++/* ++ * End of "$Id$". ++ */ +--- /dev/null ++++ b/scheduler/avahi.h +@@ -0,0 +1,49 @@ ++/* ++ * "$Id$" ++ * ++ * Avahi poll implementation for the CUPS scheduler. ++ * ++ * Copyright (C) 2010 Red Hat, Inc. ++ * Authors: ++ * Tim Waugh ++ * ++ * Distribution and use rights are outlined in the file "LICENSE.txt" ++ * which should have been included with this file. If this file is ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ */ ++ ++#include ++ ++#ifdef HAVE_AVAHI ++# include ++# include ++#endif /* HAVE_AVAHI */ ++ ++#ifdef HAVE_AUTHORIZATION_H ++# include ++#endif /* HAVE_AUTHORIZATION_H */ ++ ++ ++#ifdef HAVE_AVAHI ++typedef struct ++{ ++ AvahiPoll api; ++ cups_array_t *watched_fds; ++ cups_array_t *timeouts; ++} AvahiCupsPoll; ++#endif /* HAVE_AVAHI */ ++ ++/* ++ * Prototypes... ++ */ ++ ++#ifdef HAVE_AVAHI ++extern AvahiCupsPoll * avahi_cups_poll_new(void); ++extern void avahi_cups_poll_free(AvahiCupsPoll *cups_poll); ++extern const AvahiPoll *avahi_cups_poll_get(AvahiCupsPoll *cups_poll); ++#endif /* HAVE_AVAHI */ ++ ++ ++/* ++ * End of "$Id$". ++ */ +--- a/scheduler/cupsd.h ++++ b/scheduler/cupsd.h +@@ -140,6 +140,15 @@ + + typedef void (*cupsd_selfunc_t)(void *data); + ++#ifdef HAVE_AVAHI ++/* ++ * Timeout callback function type... ++ */ ++ ++typedef struct _cupsd_timeout_s cupsd_timeout_t; ++typedef void (*cupsd_timeoutfunc_t)(cupsd_timeout_t *timeout, void *data); ++#endif /* HAVE_AVAHI */ ++ + + /* + * Globals... +@@ -173,6 +182,11 @@ + /* Running from launchd */ + #endif /* HAVE_LAUNCH_H */ + ++#ifdef HAVE_AVAHI ++VAR cups_array_t *Timeouts; /* Timed callbacks for main loop */ ++#endif /* HAVE_AVAHI */ ++ ++ + + /* + * Prototypes... +@@ -242,6 +256,20 @@ + extern void cupsdStartServer(void); + extern void cupsdStopServer(void); + ++#ifdef HAVE_AVAHI ++extern void cupsdInitTimeouts(void); ++extern cupsd_timeout_t *cupsdAddTimeout (const struct timeval *tv, ++ cupsd_timeoutfunc_t cb, ++ void *data); ++extern cupsd_timeout_t *cupsdNextTimeout (long *delay); ++extern void cupsdRunTimeout (cupsd_timeout_t *timeout); ++extern void cupsdUpdateTimeout (cupsd_timeout_t *timeout, ++ const struct timeval *tv); ++extern void cupsdRemoveTimeout (cupsd_timeout_t *timeout); ++#endif /* HAVE_AVAHI */ ++ ++extern int cupsdRemoveFile(const char *filename); ++ + + /* + * End of "$Id: cupsd.h 9766 2011-05-11 22:17:34Z mike $". +--- a/scheduler/main.c ++++ b/scheduler/main.c +@@ -122,6 +122,10 @@ + cupsd_listener_t *lis; /* Current listener */ + time_t current_time, /* Current time */ + activity, /* Client activity timer */ ++#ifdef HAVE_AVAHI ++ avahi_client_time, /* Time for next Avahi client ++ check */ ++#endif /* HAVE_AVAHI */ + browse_time, /* Next browse send time */ + senddoc_time, /* Send-Document time */ + expire_time, /* Subscription expire time */ +@@ -148,6 +152,10 @@ + int launchd_idle_exit; + /* Idle exit on select timeout? */ + #endif /* HAVE_LAUNCHD */ ++#ifdef HAVE_AVAHI ++ cupsd_timeout_t *tmo; /* Next scheduled timed callback */ ++ long tmo_delay; /* Time before it must be called */ ++#endif /* HAVE_AVAHI */ + + + #ifdef HAVE_GETEUID +@@ -527,6 +535,14 @@ + + httpInitialize(); + ++#ifdef HAVE_AVAHI ++ /* ++ * Initialize timed callback structures. ++ */ ++ ++ cupsdInitTimeouts(); ++#endif /* HAVE_AVAHI */ ++ + cupsdStartServer(); + + /* +@@ -657,6 +673,9 @@ + */ + + current_time = time(NULL); ++#ifdef HAVE_AVAHI ++ avahi_client_time = current_time; ++#endif /* HAVE_AVAHI */ + browse_time = current_time; + event_time = current_time; + expire_time = current_time; +@@ -871,6 +890,26 @@ + } + #endif /* __APPLE__ */ + ++#ifdef HAVE_AVAHI ++ /* ++ * If a timed callback is due, run it. ++ */ ++ ++ tmo = cupsdNextTimeout (&tmo_delay); ++ if (tmo && tmo_delay == 0) ++ cupsdRunTimeout (tmo); ++ ++ /* ++ * Try to restart the Avahi client every 10 seconds if needed... ++ */ ++ ++ if ((current_time - avahi_client_time) >= 10) ++ { ++ avahi_client_time = current_time; ++ cupsdStartAvahiClient(); ++ } ++#endif /* HAVE_AVAHI */ ++ + #ifndef __APPLE__ + /* + * Update the network interfaces once a minute... +@@ -1815,6 +1854,10 @@ + cupsd_job_t *job; /* Job information */ + cupsd_subscription_t *sub; /* Subscription information */ + const char *why; /* Debugging aid */ ++#ifdef HAVE_AVAHI ++ cupsd_timeout_t *tmo; /* Timed callback */ ++ long tmo_delay; /* Seconds before calling it */ ++#endif /* HAVE_AVAHI */ + + + /* +@@ -1857,6 +1900,19 @@ + } + #endif /* __APPLE__ */ + ++#ifdef HAVE_AVAHI ++ /* ++ * See if there are any scheduled timed callbacks to run. ++ */ ++ ++ tmo = cupsdNextTimeout (&tmo_delay); ++ if (tmo) ++ { ++ timeout = tmo_delay; ++ why = "run a timed callback"; ++ } ++#endif /* HAVE_AVAHI */ ++ + /* + * Check whether we are accepting new connections... + */ +--- /dev/null ++++ b/scheduler/timeout.c +@@ -0,0 +1,215 @@ ++/* ++ * "$Id$" ++ * ++ * Timeout functions for the Common UNIX Printing System (CUPS). ++ * ++ * Copyright (C) 2010 Red Hat, Inc. ++ * Authors: ++ * Tim Waugh ++ * ++ * Distribution and use rights are outlined in the file "LICENSE.txt" ++ * which should have been included with this file. If this file is ++ * file is missing or damaged, see the license at "http://www.cups.org/". ++ * ++ * Contents: ++ * ++ * cupsdInitTimeouts() - Initialise timeout structure. ++ * cupsdAddTimeout() - Add a timed callback. ++ * cupsdNextTimeout() - Find the next enabled timed callback. ++ * cupsdUpdateTimeout() - Adjust the time of a timed callback or disable it. ++ * cupsdRemoveTimeout() - Discard a timed callback. ++ * compare_timeouts() - Compare timed callbacks for array sorting. ++ */ ++ ++#include ++ ++#ifdef HAVE_AVAHI /* Applies to entire file... */ ++ ++/* ++ * Include necessary headers... ++ */ ++ ++#include "cupsd.h" ++ ++#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) ++# include ++#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ ++ ++#ifdef HAVE_AVAHI ++# include ++#endif /* HAVE_AVAHI */ ++ ++ ++struct _cupsd_timeout_s ++{ ++ struct timeval when; ++ int enabled; ++ cupsd_timeoutfunc_t callback; ++ void *data; ++}; ++ ++/* ++ * Local functions... ++ */ ++ ++/* ++ * 'compare_timeouts()' - Compare timed callbacks for array sorting. ++ */ ++ ++static int ++compare_addrs (void *p0, void *p1) ++{ ++ if (p0 == p1) ++ return (0); ++ if (p0 < p1) ++ return (-1); ++ return (1); ++} ++ ++static int ++compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1) ++{ ++ int addrsdiff = compare_addrs (p0, p1); ++ int tvdiff; ++ ++ if (addrsdiff == 0) ++ return (0); ++ ++ if (!p0->enabled || !p1->enabled) ++ { ++ if (!p0->enabled && !p1->enabled) ++ return (addrsdiff); ++ ++ return (p0->enabled ? -1 : 1); ++ } ++ ++ tvdiff = avahi_timeval_compare (&p0->when, &p1->when); ++ if (tvdiff != 0) ++ return (tvdiff); ++ ++ return (addrsdiff); ++} ++ ++ ++/* ++ * 'cupsdInitTimeouts()' - Initialise timeout structures. ++ */ ++ ++void ++cupsdInitTimeouts(void) ++{ ++ Timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, NULL); ++} ++ ++ ++/* ++ * 'cupsdAddTimeout()' - Add a timed callback. ++ */ ++ ++cupsd_timeout_t * /* O - Timeout handle */ ++cupsdAddTimeout(const struct timeval *tv, /* I - Absolute time */ ++ cupsd_timeoutfunc_t cb, /* I - Callback function */ ++ void *data) /* I - User data */ ++{ ++ cupsd_timeout_t *timeout; ++ ++ timeout = malloc (sizeof(cupsd_timeout_t)); ++ if (timeout != NULL) ++ { ++ timeout->enabled = (tv != NULL); ++ if (tv) ++ { ++ timeout->when.tv_sec = tv->tv_sec; ++ timeout->when.tv_usec = tv->tv_usec; ++ } ++ ++ timeout->callback = cb; ++ timeout->data = data; ++ cupsArrayAdd (Timeouts, timeout); ++ } ++ ++ return timeout; ++} ++ ++ ++/* ++ * 'cupsdNextTimeout()' - Find the next enabled timed callback. ++ */ ++ ++cupsd_timeout_t * /* O - Next enabled timeout or NULL */ ++cupsdNextTimeout(long *delay) /* O - Seconds before scheduled */ ++{ ++ cupsd_timeout_t *first = cupsArrayFirst (Timeouts); ++ struct timeval curtime; ++ ++ if (first && !first->enabled) ++ first = NULL; ++ ++ if (first && delay) ++ { ++ gettimeofday (&curtime, NULL); ++ if (avahi_timeval_compare (&curtime, &first->when) > 0) ++ { ++ *delay = 0; ++ } else { ++ *delay = 1 + first->when.tv_sec - curtime.tv_sec; ++ if (first->when.tv_usec < curtime.tv_usec) ++ (*delay)--; ++ } ++ } ++ ++ return (first); ++} ++ ++ ++/* ++ * 'cupsdRunTimeout()' - Run a timed callback. ++ */ ++ ++void ++cupsdRunTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ ++{ ++ if (!timeout) ++ return; ++ timeout->enabled = 0; ++ if (!timeout->callback) ++ return; ++ timeout->callback (timeout, timeout->data); ++} ++ ++/* ++ * 'cupsdUpdateTimeout()' - Adjust the time of a timed callback or disable it. ++ */ ++ ++void ++cupsdUpdateTimeout(cupsd_timeout_t *timeout, /* I - Timeout */ ++ const struct timeval *tv) /* I - Absolute time or NULL */ ++{ ++ cupsArrayRemove (Timeouts, timeout); ++ timeout->enabled = (tv != NULL); ++ if (tv) ++ { ++ timeout->when.tv_sec = tv->tv_sec; ++ timeout->when.tv_usec = tv->tv_usec; ++ } ++ cupsArrayAdd (Timeouts, timeout); ++} ++ ++ ++/* ++ * 'cupsdRemoveTimeout()' - Discard a timed callback. ++ */ ++ ++void ++cupsdRemoveTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ ++{ ++ cupsArrayRemove (Timeouts, timeout); ++ free (timeout); ++} ++ ++ ++#endif /* HAVE_AVAHI ... from top of file */ ++ ++/* ++ * End of "$Id$". ++ */ +--- a/cgi-bin/admin.c ++++ b/cgi-bin/admin.c +@@ -1643,7 +1643,7 @@ + else + local_protocols[0] = '\0'; + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (cgiGetVariable("BROWSE_LOCAL_DNSSD")) + { + if (local_protocols[0]) +@@ -1651,7 +1651,7 @@ + else + strcat(local_protocols, "dnssd"); + } +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + #ifdef HAVE_LDAP + if (cgiGetVariable("BROWSE_LOCAL_LDAP")) +@@ -2718,9 +2718,9 @@ + #endif /* HAVE_GSSAPI */ + cgiSetVariable("KERBEROS", ""); + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cgiSetVariable("HAVE_DNSSD", "1"); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + #ifdef HAVE_LDAP + cgiSetVariable("HAVE_LDAP", "1"); +--- a/scheduler/client.c ++++ b/scheduler/client.c +@@ -5003,7 +5003,7 @@ + !strncmp(host, "[::1]:", 6)); + } + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + /* + * Check if the hostname is something.local (Bonjour); if so, allow it. + */ +@@ -5012,7 +5012,7 @@ + (!_cups_strcasecmp(end, ".local") || !_cups_strncasecmp(end, ".local:", 7) || + !_cups_strcasecmp(end, ".local.") || !_cups_strncasecmp(end, ".local.:", 8))) + return (1); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + /* + * Check if the hostname is an IP address... +--- a/scheduler/dirsvc.c ++++ b/scheduler/dirsvc.c +@@ -27,6 +27,7 @@ + * ldap_connect() - Start new LDAP connection + * ldap_reconnect() - Reconnect to LDAP Server + * ldap_disconnect() - Disconnect from LDAP Server ++ * cupsdStartAvahiClient() - Start an Avahi client if needed + * cupsdStartBrowsing() - Start sending and receiving broadcast + * information. + * cupsdStartPolling() - Start polling servers as needed. +@@ -45,6 +46,8 @@ + * printer. + * dnssdPackTxtRecord() - Pack an array of key/value pairs into the TXT + * record format. ++ * avahiPackTxtRecord() - Pack an array of key/value pairs into an ++ * AvahiStringList. + * dnssdRegisterCallback() - DNSServiceRegister callback. + * dnssdRegisterPrinter() - Start sending broadcast information for a + * printer or update the broadcast contents. +@@ -83,6 +86,7 @@ + */ + + #include "cupsd.h" ++#include + #include + + #ifdef HAVE_DNSSD +@@ -97,6 +101,17 @@ + # endif /* HAVE_SYSTEMCONFIGURATION */ + # endif /* __APPLE__ */ + #endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++# include ++#endif /* HAVE_AVAHI */ ++ ++ ++#ifdef HAVE_DNSSD ++typedef char *cupsd_txt_record_t; ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++typedef AvahiStringList *cupsd_txt_record_t; ++#endif /* HAVE_AVAHI */ + + + /* +@@ -159,27 +174,39 @@ + static void update_smb(int onoff); + + ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ++static cupsd_txt_record_t dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p, ++ int for_lpd); ++static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b); ++static void dnssdDeregisterPrinter(cupsd_printer_t *p); ++static void dnssdRegisterPrinter(cupsd_printer_t *p); ++static void dnssdStop(void); ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ ++ + #ifdef HAVE_DNSSD + # ifdef HAVE_COREFOUNDATION + static void dnssdAddAlias(const void *key, const void *value, + void *context); + # endif /* HAVE_COREFOUNDATION */ +-static char *dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p, +- int for_lpd); +-static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b); +-static void dnssdDeregisterPrinter(cupsd_printer_t *p); +-static char *dnssdPackTxtRecord(int *txt_len, char *keyvalue[][2], +- int count); + static void dnssdRegisterCallback(DNSServiceRef sdRef, + DNSServiceFlags flags, + DNSServiceErrorType errorCode, + const char *name, const char *regtype, + const char *domain, void *context); +-static void dnssdRegisterPrinter(cupsd_printer_t *p); +-static void dnssdStop(void); + static void dnssdUpdate(void); + #endif /* HAVE_DNSSD */ + ++#ifdef HAVE_AVAHI ++static AvahiStringList *avahiPackTxtRecord(char *keyvalue[][2], ++ int count); ++static void avahi_entry_group_cb (AvahiEntryGroup *group, ++ AvahiEntryGroupState state, ++ void *userdata); ++static void avahi_client_cb (AvahiClient *client, ++ AvahiClientState state, ++ void *userdata); ++#endif /* HAVE_AVAHI */ ++ + #ifdef HAVE_LDAP + static const char * const ldap_attrs[] =/* CUPS LDAP attributes */ + { +@@ -283,10 +310,10 @@ + ldap_dereg_printer(p); + #endif /* HAVE_LDAP */ + +-#ifdef HAVE_DNSSD +- if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ++ if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdDeregisterPrinter(p); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + } + + +@@ -702,10 +729,10 @@ + slpRegisterPrinter(p); */ + #endif /* HAVE_LIBSLP */ + +-#ifdef HAVE_DNSSD +- if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ++ if ((BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdRegisterPrinter(p); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + } + + +@@ -1419,6 +1446,36 @@ + #endif /* HAVE_LDAP */ + + ++#ifdef HAVE_AVAHI ++/* ++ * 'cupsdStartAvahiClient()' - Start an Avahi client if needed ++ */ ++ ++void ++cupsdStartAvahiClient(void) ++{ ++ int error = 0; ++ ++ if (!AvahiCupsClient && !AvahiCupsClientConnecting) ++ { ++ if (!AvahiCupsPollHandle) ++ AvahiCupsPollHandle = avahi_cups_poll_new (); ++ ++ if (AvahiCupsPollHandle) ++ { ++ if (avahi_client_new (avahi_cups_poll_get (AvahiCupsPollHandle), ++ AVAHI_CLIENT_NO_FAIL, ++ avahi_client_cb, NULL, ++ &error) != NULL) ++ AvahiCupsClientConnecting = 1; ++ else ++ cupsdLogMessage (CUPSD_LOG_WARN, "Avahi client failed: %d", error); ++ } ++ } ++} ++#endif /* HAVE_AVAHI */ ++ ++ + /* + * 'cupsdStartBrowsing()' - Start sending and receiving broadcast information. + */ +@@ -1542,13 +1599,16 @@ + else + BrowseSocket = -1; + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_DNSSD) + { ++#ifdef HAVE_DNSSD + DNSServiceErrorType error; /* Error from service creation */ ++#endif /* HAVE_DNSSD */ + cupsd_listener_t *lis; /* Current listening socket */ + + ++#ifdef HAVE_DNSSD + /* + * First create a "master" connection for all registrations... + */ +@@ -1573,6 +1633,7 @@ + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + + cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL); ++#endif /* HAVE_DNSSD */ + + /* + * Then get the port we use for registrations. If we are not listening +@@ -1606,9 +1667,16 @@ + */ + + cupsdUpdateDNSSDName(); ++ ++#ifdef HAVE_AVAHI ++ cupsdStartAvahiClient (); ++#endif /* HAVE_AVAHI */ ++ ++#ifdef HAVE_DNSSD + } +- } + #endif /* HAVE_DNSSD */ ++ } ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + #ifdef HAVE_LIBSLP + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) +@@ -1834,10 +1902,10 @@ + BrowseSocket = -1; + } + +-#ifdef HAVE_DNSSD +- if ((BrowseLocalProtocols & BROWSE_DNSSD) && DNSSDRef) ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) ++ if ((BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdStop(); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + #ifdef HAVE_LIBSLP + if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) && +@@ -1902,7 +1970,7 @@ + } + + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + /* + * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing... + */ +@@ -1910,8 +1978,14 @@ + void + cupsdUpdateDNSSDName(void) + { ++#ifdef HAVE_DNSSD + DNSServiceErrorType error; /* Error from service creation */ + char webif[1024]; /* Web interface share name */ ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ int ret; /* Error from service creation */ ++ char webif[AVAHI_LABEL_MAX]; /* Web interface share name */ ++#endif /* HAVE_AVAHI */ + # ifdef HAVE_SYSTEMCONFIGURATION + SCDynamicStoreRef sc; /* Context for dynamic store */ + CFDictionaryRef btmm; /* Back-to-My-Mac domains */ +@@ -2042,6 +2116,7 @@ + else + strlcpy(webif, "CUPS Web Interface", sizeof(webif)); + ++#ifdef HAVE_DNSSD + if (WebIFRef) + DNSServiceRefDeallocate(WebIFRef); + +@@ -2054,9 +2129,45 @@ + NULL)) != kDNSServiceErr_NoError) + cupsdLogMessage(CUPSD_LOG_ERROR, + "DNS-SD web interface registration failed: %d", error); ++#endif /* HAVE_DNSSD */ ++ ++#ifdef HAVE_AVAHI ++ if (!AvahiCupsClient) ++ /* ++ * Client not yet running. ++ */ ++ return; ++ ++ if (AvahiWebIFGroup) ++ avahi_entry_group_reset (AvahiWebIFGroup); ++ else ++ AvahiWebIFGroup = avahi_entry_group_new (AvahiCupsClient, ++ avahi_entry_group_cb, ++ NULL); ++ ++ if (AvahiWebIFGroup) ++ { ++ ret = avahi_entry_group_add_service (AvahiWebIFGroup, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, /* flags */ ++ webif, /* name */ ++ "_http._tcp", /* type */ ++ NULL, /* domain */ ++ NULL, /* host */ ++ DNSSDPort, /* port */ ++ "path=/", NULL); ++ if (ret == 0) ++ ret = avahi_entry_group_commit (AvahiWebIFGroup); ++ ++ if (ret != 0) ++ cupsdLogMessage (CUPSD_LOG_ERROR, ++ "Avahi web interface registration failed: %d", ret); ++ } ++#endif /* HAVE_AVAHI */ + } + } +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + + #ifdef HAVE_LDAP +@@ -2339,13 +2450,15 @@ + "Bad Back to My Mac domain in dynamic store!"); + } + # endif /* HAVE_COREFOUNDATION */ ++#endif /* HAVE_DNSSD */ + + ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + /* + * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info. + */ + +-static char * /* O - TXT record */ ++static cupsd_txt_record_t /* O - TXT record */ + dnssdBuildTxtRecord( + int *txt_len, /* O - TXT record length */ + cupsd_printer_t *p, /* I - Printer information */ +@@ -2384,7 +2497,12 @@ + keyvalue[i ][0] = "ty"; + keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown"; + +- snprintf(admin_hostname, sizeof(admin_hostname), "%s.local.", DNSSDHostName); ++ snprintf(admin_hostname, sizeof(admin_hostname), ++ "%s.local" ++#ifdef HAVE_DNSSD ++ "." /* terminating dot no good for Avahi */ ++#endif /* HAVE_DNSSD */ ++ , DNSSDHostName); + httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str), + "http", NULL, admin_hostname, DNSSDPort, "/%s/%s", + (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", +@@ -2467,7 +2585,12 @@ + * Then pack them into a proper txt record... + */ + ++#ifdef HAVE_DNSSD + return (dnssdPackTxtRecord(txt_len, keyvalue, i)); ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ return (avahiPackTxtRecord(keyvalue, i)); ++#endif /* HAVE_AVAHI */ + } + + +@@ -2479,7 +2602,16 @@ + dnssdComparePrinters(cupsd_printer_t *a,/* I - First printer */ + cupsd_printer_t *b)/* I - Second printer */ + { +- return (_cups_strcasecmp(a->reg_name, b->reg_name)); ++ if (!a->reg_name) ++ if (!b->reg_name) ++ return 0; ++ else ++ return -1; ++ else ++ if (!b->reg_name) ++ return 1; ++ else ++ return (_cups_strcasecmp(a->reg_name, b->reg_name)); + } + + +@@ -2494,6 +2626,10 @@ + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdDeregisterPrinter(%s)", p->name); + ++#ifdef HAVE_DNSSD ++ if (!DNSSDRef) ++ return; ++ + /* + * Closing the socket deregisters the service + */ +@@ -2529,6 +2665,24 @@ + free(p->printer_txt); + p->printer_txt = NULL; + } ++#endif /* HAVE_DNSSD */ ++ ++#ifdef HAVE_AVAHI ++ if (p->avahi_group) ++ { ++ avahi_entry_group_reset (p->avahi_group); ++ avahi_entry_group_free (p->avahi_group); ++ p->avahi_group = NULL; ++ ++ if (p->ipp_txt) ++ avahi_string_list_free (p->ipp_txt); ++ ++ if (p->printer_txt) ++ avahi_string_list_free (p->printer_txt); ++ ++ p->ipp_txt = p->printer_txt = NULL; ++ } ++#endif /* HAVE_AVAHI */ + + /* + * Remove the printer from the array of DNS-SD printers, then clear the +@@ -2538,8 +2692,10 @@ + cupsArrayRemove(DNSSDPrinters, p); + cupsdClearString(&p->reg_name); + } ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + ++#ifdef HAVE_DNSSD + /* + * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the + * TXT record format. +@@ -2649,8 +2805,10 @@ + LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED; + } + } ++#endif /* HAVE_DNSSD */ + + ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + /* + * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer + * or update the broadcast contents. +@@ -2659,20 +2817,40 @@ + static void + dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ + { ++#ifdef HAVE_DNSSD + DNSServiceErrorType se; /* dnssd errors */ + char *ipp_txt, /* IPP TXT record buffer */ + *printer_txt, /* LPD TXT record buffer */ +- name[1024], /* Service name */ +- *nameptr; /* Pointer into name */ ++ name[1024]; /* Service name */ + int ipp_len, /* IPP TXT record length */ + printer_len, /* LPD TXT record length */ + printer_port; /* LPD port number */ ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ int ret; /* Error code */ ++ AvahiStringList *ipp_txt, /* IPP TXT record */ ++ *printer_txt; /* LPD TXT record */ ++ char name[AVAHI_LABEL_MAX], /* Service name */ ++ fullsubtype[AVAHI_LABEL_MAX]; /* Full subtype */ ++ char *regtype_copy, /* Writeable copy of reg type */ ++ *subtype, /* Current service sub type */ ++ *nextsubtype; /* Next service sub type */ ++#endif /* HAVE_AVAHI */ ++ char *nameptr; /* Pointer into name */ + const char *regtype; /* Registration type */ + + ++#ifdef HAVE_DNSSD ++ if (!DNSSDRef) ++ return; ++ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, + !p->ipp_ref ? "new" : "update"); +- ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, ++ !p->avahi_group ? "new" : "update"); ++#endif /* HAVE_AVAHI */ + /* + * If per-printer sharing was just disabled make sure we're not + * registered before returning. +@@ -2691,12 +2869,36 @@ + if (p->info && strlen(p->info) > 0) + { + if (DNSSDComputerName) +- snprintf(name, sizeof(name), "%s @ %s", p->info, DNSSDComputerName); ++ { ++ /* ++ * Make sure there is room for at least 15 characters of ++ * DNSSDComputerName. ++ */ ++ ++ assert(sizeof(name) >= 15 + 4); ++ nameptr = name + strlcpy(name, p->info, ++ sizeof(name) - 4 - ++ strnlen(DNSSDComputerName, 15)); ++ nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); ++ strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); ++ } + else + strlcpy(name, p->info, sizeof(name)); + } + else if (DNSSDComputerName) +- snprintf(name, sizeof(name), "%s @ %s", p->name, DNSSDComputerName); ++ { ++ /* ++ * Make sure there is room for at least 15 characters of ++ * DNSSDComputerName. ++ */ ++ ++ assert(sizeof(name) >= 15 + 4); ++ nameptr = name + strlcpy(name, p->info, ++ sizeof(name) - 4 - ++ strnlen(DNSSDComputerName, 15)); ++ nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); ++ strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); ++ } + else + strlcpy(name, p->name, sizeof(name)); + +@@ -2717,6 +2919,7 @@ + * Register IPP and (optionally) LPD... + */ + ++#ifdef HAVE_DNSSD + ipp_len = 0; /* anti-compiler-warning-code */ + ipp_txt = dnssdBuildTxtRecord(&ipp_len, p, 0); + +@@ -2889,6 +3092,209 @@ + + if (printer_txt) + free(printer_txt); ++#endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ if (!AvahiCupsClient) ++ /* ++ * Client not running yet. The client callback will call us again later. ++ */ ++ return; ++ ++ ipp_txt = dnssdBuildTxtRecord(NULL, p, 0); ++ printer_txt = dnssdBuildTxtRecord(NULL, p, 1); ++ regtype = (p->type & CUPS_PRINTER_FAX) ? "_fax-ipp._tcp" : DNSSDRegType; ++ ++ if (p->avahi_group && p->ipp_txt && ipp_txt && ++ !avahi_string_list_equal (p->ipp_txt, ipp_txt)) ++ { ++ /* ++ * Update the existing registration... ++ */ ++ ++ avahi_string_list_free (p->ipp_txt); ++ ++ if (p->printer_txt) ++ avahi_string_list_free (p->printer_txt); ++ ++ /* ++ * Update the service group entry. ++ */ ++ ++ regtype_copy = strdup (regtype); ++ subtype = strchr (regtype_copy, ','); ++ if (subtype) ++ *subtype = '\0'; ++ ++ cupsdLogMessage (CUPSD_LOG_DEBUG, ++ "Updating TXT record for %s (%s)", name, regtype_copy); ++ ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, name, ++ regtype_copy, ++ NULL, ipp_txt); ++ free (regtype_copy); ++ ++ if (ret < 0) ++ goto update_failed; ++ ++ p->ipp_txt = ipp_txt; ++ ipp_txt = NULL; ++ ++ if (BrowseLocalProtocols & BROWSE_LPD) ++ { ++ ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, name, ++ "_printer._tcp", NULL, ++ printer_txt); ++ if (ret < 0) ++ goto update_failed; ++ ++ p->printer_txt = printer_txt; ++ printer_txt = NULL; ++ } ++ ++ ret = avahi_entry_group_commit (p->avahi_group); ++ if (ret < 0) ++ { ++ update_failed: ++ cupsdLogMessage (CUPSD_LOG_ERROR, ++ "Failed to update TXT record for %s: %d", ++ name, ret); ++ avahi_entry_group_reset (p->avahi_group); ++ avahi_entry_group_free (p->avahi_group); ++ p->avahi_group = NULL; ++ ipp_txt = p->ipp_txt; ++ p->ipp_txt = NULL; ++ } ++ } ++ ++ if (!p->avahi_group) ++ { ++ /* ++ * Initial registration. Use the _fax subtype for fax queues... ++ */ ++ ++ p->avahi_group = avahi_entry_group_new (AvahiCupsClient, ++ avahi_entry_group_cb, ++ p); ++ ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "Registering Avahi printer %s with name \"%s\" and " ++ "type \"%s\"", p->name, name, regtype); ++ ++ if (!p->avahi_group) ++ { ++ ret = 0; ++ goto add_failed; ++ } ++ ++ /* ++ * Add each service type (DNSSDRegType may contain several, ++ * separated by commas). ++ */ ++ ++ subtype = regtype_copy = strdup (regtype); ++ while (subtype && *subtype) ++ { ++ nextsubtype = strchr (subtype, ','); ++ if (nextsubtype) ++ *nextsubtype++ = '\0'; ++ ++ if (subtype == regtype_copy) ++ { ++ /* ++ * Main type entry. ++ */ ++ ++ cupsdLogMessage (CUPSD_LOG_DEBUG, ++ "Adding TXT record for %s (%s)", name, regtype_copy); ++ ret = avahi_entry_group_add_service_strlst (p->avahi_group, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, name, regtype_copy, ++ NULL, NULL, ++ DNSSDPort, ++ ipp_txt); ++ } ++ else ++ { ++ /* ++ * Sub-type entry. ++ */ ++ ++ snprintf (fullsubtype, sizeof(fullsubtype), ++ "%s._sub.%s", subtype, regtype_copy); ++ cupsdLogMessage (CUPSD_LOG_DEBUG, ++ "Adding TXT record for %s (%s)", name, fullsubtype); ++ ret = avahi_entry_group_add_service_subtype (p->avahi_group, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, name, ++ regtype_copy, ++ NULL, fullsubtype); ++ } ++ ++ if (ret < 0) ++ { ++ free (regtype_copy); ++ goto add_failed; ++ } ++ ++ subtype = nextsubtype; ++ } ++ ++ free (regtype_copy); ++ p->ipp_txt = ipp_txt; ++ ipp_txt = NULL; ++ ++ if (BrowseLocalProtocols & BROWSE_LPD) ++ { ++ cupsdLogMessage(CUPSD_LOG_DEBUG, ++ "Registering Avahi printer %s with name \"%s\" and " ++ "type \"_printer._tcp\"", p->name, name); ++ ++ ret = avahi_entry_group_add_service_strlst (p->avahi_group, ++ AVAHI_IF_UNSPEC, ++ AVAHI_PROTO_UNSPEC, ++ 0, name, ++ "_printer._tcp", NULL, NULL, ++ 515, ++ printer_txt); ++ if (ret < 0) ++ goto add_failed; ++ ++ p->printer_txt = printer_txt; ++ printer_txt = NULL; ++ } ++ ++ ret = avahi_entry_group_commit (p->avahi_group); ++ ++ if (ret < 0) ++ { ++ add_failed: ++ cupsdLogMessage (CUPSD_LOG_ERROR, ++ "Failed to add Avahi entry for %s: %d", ++ name, ret); ++ if (p->avahi_group) ++ { ++ avahi_entry_group_reset (p->avahi_group); ++ avahi_entry_group_free (p->avahi_group); ++ p->avahi_group = NULL; ++ } ++ ipp_txt = p->ipp_txt; ++ p->ipp_txt = NULL; ++ } ++ } ++ ++ if (ipp_txt) ++ avahi_string_list_free (ipp_txt); ++ ++ if (printer_txt) ++ avahi_string_list_free (printer_txt); ++#endif /* HAVE_AVAHI */ + } + + +@@ -2901,6 +3307,10 @@ + { + cupsd_printer_t *p; /* Current printer */ + ++#ifdef HAVE_DNSSD ++ if (!DNSSDRef) ++ return; ++#endif /* HAVE_DNSSD */ + + /* + * De-register the individual printers +@@ -2911,6 +3321,7 @@ + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + dnssdDeregisterPrinter(p); + ++#ifdef HAVE_DNSSD + /* + * Shutdown the rest of the service refs... + */ +@@ -2931,14 +3342,17 @@ + + DNSServiceRefDeallocate(DNSSDRef); + DNSSDRef = NULL; ++#endif /* HAVE_DNSSD */ + + cupsArrayDelete(DNSSDPrinters); + DNSSDPrinters = NULL; + + DNSSDPort = 0; + } ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + ++#ifdef HAVE_DNSSD + /* + * 'dnssdUpdate()' - Handle DNS-SD queries. + */ +@@ -2960,6 +3374,153 @@ + #endif /* HAVE_DNSSD */ + + ++#ifdef HAVE_AVAHI ++/* ++ * 'avahiPackTxtRecord()' - Pack an array of key/value pairs into an ++ * AvahiStringList. ++ */ ++ ++static AvahiStringList * /* O - new string list */ ++avahiPackTxtRecord(char *keyvalue[][2], /* I - Table of key value pairs */ ++ int count) /* I - Number of items in table */ ++{ ++ AvahiStringList *strlst = NULL; ++ char **elements; ++ size_t len; ++ int i = 0; ++ ++ elements = malloc ((1 + count) * sizeof (char *)); ++ if (!elements) ++ goto cleanup; ++ ++ for (i = 0; i < count; i++) ++ { ++ len = (1 + strlen (keyvalue[i][0]) + ++ (keyvalue[i][1] ? 1 + strlen (keyvalue[i][1]) : 1)); ++ elements[i] = malloc (len * sizeof (char)); ++ if (!elements[i]) ++ goto cleanup; ++ ++ snprintf (elements[i], len, "%s=%s", keyvalue[i][0], keyvalue[i][1]); ++ } ++ ++ strlst = avahi_string_list_new_from_array ((const char **) elements, count); ++ ++cleanup: ++ while (--i >= 0) ++ free (elements[i]); ++ ++ free (elements); ++ return (strlst); ++} ++ ++ ++/* ++ * 'avahi_entry_group_cb()' - Avahi entry group callback function. ++ */ ++static void ++avahi_entry_group_cb (AvahiEntryGroup *group, ++ AvahiEntryGroupState state, ++ void *userdata) ++{ ++ char *name; ++ ++ if (userdata) ++ name = ((cupsd_printer_t *) userdata)->reg_name; ++ else ++ name = "CUPS web interface"; ++ ++ switch (state) ++ { ++ case AVAHI_ENTRY_GROUP_UNCOMMITED: ++ case AVAHI_ENTRY_GROUP_REGISTERING: ++ break; ++ ++ case AVAHI_ENTRY_GROUP_ESTABLISHED: ++ cupsdLogMessage (CUPSD_LOG_DEBUG, ++ "Avahi entry group established for %s", name); ++ break; ++ ++ default: ++ cupsdLogMessage (CUPSD_LOG_DEBUG, ++ "Avahi entry group %s has state %d", ++ name, state); ++ break; ++ } ++} ++ ++ ++/* ++ * 'avahi_client_cb()' - Avahi client callback function. ++ */ ++static void ++avahi_client_cb (AvahiClient *client, ++ AvahiClientState state, ++ void *userdata) ++{ ++ cupsd_printer_t *printer; ++ switch (state) ++ { ++ case AVAHI_CLIENT_S_RUNNING: ++ /* ++ * Avahi client started successfully. ++ */ ++ AvahiCupsClient = client; ++ AvahiCupsClientConnecting = 0; ++ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client started"); ++ ++ cupsdUpdateDNSSDName (); ++ ++ for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); ++ printer; ++ printer = (cupsd_printer_t *)cupsArrayNext(Printers)) ++ if (Browsing && (BrowseLocalProtocols & BROWSE_DNSSD) && ++ (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | ++ CUPS_PRINTER_SCANNER))) && printer->shared) ++ dnssdRegisterPrinter (printer); ++ ++ break; ++ ++ case AVAHI_CLIENT_CONNECTING: ++ /* ++ * No Avahi daemon, client is waiting. ++ */ ++ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client connecting"); ++ break; ++ ++ case AVAHI_CLIENT_S_REGISTERING: ++ /* ++ * Not yet registered. ++ */ ++ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client registering"); ++ break; ++ ++ case AVAHI_CLIENT_FAILURE: ++ /* ++ * Avahi client failed, close it to allow a clean restart. ++ */ ++ cupsdLogMessage (CUPSD_LOG_ERROR, ++ "Avahi client failed, " ++ "closing client to allow a clean restart"); ++ ++ for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); ++ printer; ++ printer = (cupsd_printer_t *)cupsArrayNext(Printers)) ++ dnssdDeregisterPrinter (printer); ++ ++ avahi_client_free(client); ++ AvahiCupsClientConnecting = 0; ++ AvahiCupsClient = NULL; ++ ++ break; ++ ++ default: ++ cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client state: %d", state); ++ } ++} ++#endif /* HAVE_AVAHI */ ++ ++ + /* + * 'get_auth_info_required()' - Get the auth-info-required value to advertise. + */ +--- a/scheduler/dirsvc.h ++++ b/scheduler/dirsvc.h +@@ -31,6 +31,10 @@ + # endif /* HAVE_LDAP_SSL_H */ + #endif /* HAVE_LDAP */ + ++#ifdef HAVE_AVAHI ++# include ++#endif /* HAVE_AVAHI */ ++ + /* + * Browse protocols... + */ +@@ -131,19 +135,22 @@ + VAR cupsd_statbuf_t *PollStatusBuffer VALUE(NULL); + /* Status buffer for pollers */ + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + VAR char *DNSSDComputerName VALUE(NULL), + /* Computer/server name */ + *DNSSDHostName VALUE(NULL), + /* Hostname */ + *DNSSDRegType VALUE(NULL); + /* Bonjour registration type */ +-VAR cups_array_t *DNSSDAlias VALUE(NULL); +- /* List of dynamic ServerAlias's */ + VAR int DNSSDPort VALUE(0); + /* Port number to register */ + VAR cups_array_t *DNSSDPrinters VALUE(NULL); + /* Printers we have registered */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ ++ ++#ifdef HAVE_DNSSD ++VAR cups_array_t *DNSSDAlias VALUE(NULL); ++ /* List of dynamic ServerAlias's */ + VAR DNSServiceRef DNSSDRef VALUE(NULL), + /* Master DNS-SD service reference */ + WebIFRef VALUE(NULL), +@@ -152,6 +159,17 @@ + /* Remote printer browse reference */ + #endif /* HAVE_DNSSD */ + ++#ifdef HAVE_AVAHI ++VAR AvahiCupsPoll *AvahiCupsPollHandle VALUE(NULL); ++ /* AvahiCupsPoll object */ ++VAR AvahiClient *AvahiCupsClient VALUE(NULL); ++ /* AvahiClient object */ ++VAR int AvahiCupsClientConnecting VALUE(0); ++ /* Is AvahiClient object connecting? */ ++VAR AvahiEntryGroup *AvahiWebIFGroup VALUE(NULL); ++ /* Web interface entry group */ ++#endif /* HAVE_AVAHI */ ++ + #ifdef HAVE_LIBSLP + VAR SLPHandle BrowseSLPHandle VALUE(NULL); + /* SLP API handle */ +@@ -195,13 +213,14 @@ + extern void cupsdRestartPolling(void); + extern void cupsdSaveRemoteCache(void); + extern void cupsdSendBrowseList(void); ++extern void cupsdStartAvahiClient(void); + extern void cupsdStartBrowsing(void); + extern void cupsdStartPolling(void); + extern void cupsdStopBrowsing(void); + extern void cupsdStopPolling(void); +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + extern void cupsdUpdateDNSSDName(void); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + #ifdef HAVE_LDAP + extern void cupsdUpdateLDAPBrowse(void); + #endif /* HAVE_LDAP */ +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -6089,7 +6089,7 @@ + ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", + ippTimeToDate(curtime)); + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) + { + if (printer->reg_name) +@@ -6099,7 +6099,7 @@ + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, + "printer-dns-sd-name", 0); + } +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + if (!ra || cupsArrayFind(ra, "printer-error-policy")) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, +--- a/scheduler/printers.c ++++ b/scheduler/printers.c +@@ -883,9 +883,9 @@ + cupsdClearString(&p->alert); + cupsdClearString(&p->alert_description); + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cupsdClearString(&p->pdl); +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + cupsArrayDelete(p->filetypes); + +@@ -3797,7 +3797,7 @@ + attr->values[i].string.text = _cupsStrAlloc(mimetype); + } + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + { + char pdl[1024]; /* Buffer to build pdl list */ + mime_filter_t *filter; /* MIME filter looping var */ +@@ -3853,7 +3853,7 @@ + + cupsdSetString(&p->pdl, pdl); + } +-#endif /* HAVE_DNSSD */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + } + + +--- a/scheduler/printers.h ++++ b/scheduler/printers.h +@@ -16,6 +16,9 @@ + #ifdef HAVE_DNSSD + # include + #endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++# include "avahi.h" ++#endif /* HAVE_AVAHI */ + #include + + +@@ -95,16 +98,23 @@ + time_t marker_time; /* Last time marker attributes were updated */ + _ppd_cache_t *pc; /* PPD cache and mapping data */ + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + char *reg_name, /* Name used for service registration */ +- *pdl, /* pdl value for TXT record */ +- *ipp_txt, /* IPP TXT record contents */ ++ *pdl; /* pdl value for TXT record */ ++#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ ++#ifdef HAVE_DNSSD ++ char *ipp_txt, /* IPP TXT record contents */ + *printer_txt; /* LPD TXT record contents */ + int ipp_len, /* IPP TXT record length */ + printer_len; /* LPD TXT record length */ + DNSServiceRef ipp_ref, /* Reference for _ipp._tcp,_cups */ + printer_ref; /* Reference for _printer._tcp */ + #endif /* HAVE_DNSSD */ ++#ifdef HAVE_AVAHI ++ AvahiStringList *ipp_txt, /* IPP TXT record */ ++ *printer_txt; /* LPD TXT record */ ++ AvahiEntryGroup *avahi_group; /* Avahi entry group */ ++#endif /* HAVE_AVAHI */ + }; + + +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -651,7 +651,7 @@ + Browsing = CUPS_DEFAULT_BROWSING; + DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; + +-#ifdef HAVE_DNSSD ++#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups"); + #endif /* HAVE_DNSSD */ + diff --git a/debian/patches/cups-deviced-allow-device-ids-with-newline.patch b/debian/patches/cups-deviced-allow-device-ids-with-newline.patch new file mode 100644 index 0000000..69bcbe4 --- /dev/null +++ b/debian/patches/cups-deviced-allow-device-ids-with-newline.patch @@ -0,0 +1,39 @@ +Author: till.kamppeter@gmail.com + +--- cups-1.4.6~/scheduler/cups-deviced.c 2011-06-08 23:26:19.369984078 +0200 ++++ cups-1.4.6/scheduler/cups-deviced.c 2011-06-08 23:26:52.659835390 +0200 +@@ -577,15 +577,30 @@ + + if (*ptr == '\"') + { +- for (ptr ++, device_id = ptr; *ptr && *ptr != '\"'; ptr ++) ++ for (ptr ++, device_id = ptr; *ptr != '\"'; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); ++ if (!*ptr) ++ { ++ fprintf(stderr, "WARNING: [cups-deviced] Possible newline in device ID \"%s\": %s\n", ++ backend->name, line); ++ *ptr = ' '; ++ ptr ++; ++ *ptr = 0; ++ if (!cupsFileGets(backend->pipe, ptr, sizeof(line) - (ptr - temp))) ++ { ++ cupsFileClose(backend->pipe); ++ backend->pipe = NULL; ++ fprintf(stderr, "ERROR: [cups-deviced] Bad line from \"%s\": %s\n", ++ backend->name, line); ++ return (-1); ++ } ++ } ++ if (!*ptr) ++ goto error; + } + +- if (*ptr != '\"') +- goto error; +- + for (*ptr++ = '\0'; isspace(*ptr & 255); *ptr++ = '\0'); + + /* diff --git a/debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch b/debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch new file mode 100644 index 0000000..63f9dc7 --- /dev/null +++ b/debian/patches/cups-snmp-oids-device-id-hp-ricoh.patch @@ -0,0 +1,28 @@ +Author: till.kamppeter@gmail.com + +--- a/backend/snmp.c ++++ b/backend/snmp.c +@@ -187,6 +187,8 @@ + static const int LexmarkProductOID[] = { 1,3,6,1,4,1,641,2,1,2,1,2,1,-1 }; + static const int LexmarkProductOID2[] = { 1,3,6,1,4,1,674,10898,100,2,1,2,1,2,1,-1 }; + static const int LexmarkDeviceIdOID[] = { 1,3,6,1,4,1,641,2,1,2,1,3,1,-1 }; ++static const int HPDeviceIdOID[] = { 1,3,6,1,4,1,11,2,3,9,1,1,7,0,-1 }; ++static const int RicohDeviceIdOID[] = { 1,3,6,1,4,1,367,3,2,1,1,1,11,0,-1 }; + static const int XeroxProductOID[] = { 1,3,6,1,4,1,128,2,1,3,1,2,0,-1 }; + static cups_array_t *DeviceURIs = NULL; + static int HostNameLookups = 0; +@@ -1004,8 +1006,14 @@ + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_ID, LexmarkDeviceIdOID); + _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, ++ packet.community, CUPS_ASN1_GET_REQUEST, ++ DEVICE_ID, RicohDeviceIdOID); ++ _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, + packet.community, CUPS_ASN1_GET_REQUEST, + DEVICE_PRODUCT, XeroxProductOID); ++ _cupsSNMPWrite(fd, &(packet.address), CUPS_SNMP_VERSION_1, ++ packet.community, CUPS_ASN1_GET_REQUEST, ++ DEVICE_ID, HPDeviceIdOID); + break; + + case DEVICE_DESCRIPTION : diff --git a/debian/patches/default_log_settings.patch b/debian/patches/default_log_settings.patch new file mode 100644 index 0000000..c834e7d --- /dev/null +++ b/debian/patches/default_log_settings.patch @@ -0,0 +1,17 @@ +Description: Deactivate CUPS' own log rotating as the system already provides a more sophisticated log rotating + +Index: cups-1.4.6/conf/cupsd.conf.in +=================================================================== +--- cups-1.4.6.orig/conf/cupsd.conf.in 2011-07-14 13:02:00.199772002 +0200 ++++ cups-1.4.6/conf/cupsd.conf.in 2011-07-14 13:02:54.989772934 +0200 +@@ -9,6 +9,10 @@ + # for troubleshooting... + LogLevel @CUPS_LOG_LEVEL@ + ++# Deactivate CUPS' internal logrotating, as we provide a better one, especially ++# LogLevel debug2 gets usable now ++MaxLogSize 0 ++ + # Administrator user group... + SystemGroup @CUPS_SYSTEM_GROUPS@ + @CUPS_SYSTEM_AUTHKEY@ diff --git a/debian/patches/dnssd-reg-array-linear-search.patch b/debian/patches/dnssd-reg-array-linear-search.patch new file mode 100644 index 0000000..03ffd6c --- /dev/null +++ b/debian/patches/dnssd-reg-array-linear-search.patch @@ -0,0 +1,12 @@ +--- a/scheduler/dirsvc.c ++++ b/scheduler/dirsvc.c +@@ -1659,8 +1659,7 @@ + */ + + if (BrowseRemoteProtocols & BROWSE_DNSSD) +- DNSSDPrinters = cupsArrayNew((cups_array_func_t)dnssdComparePrinters, +- NULL); ++ DNSSDPrinters = cupsArrayNew(NULL, NULL); + + /* + * Set the computer name and register the web interface... diff --git a/debian/patches/do-not-broadcast-with-hostnames.patch b/debian/patches/do-not-broadcast-with-hostnames.patch new file mode 100644 index 0000000..4f8c2bd --- /dev/null +++ b/debian/patches/do-not-broadcast-with-hostnames.patch @@ -0,0 +1,24 @@ +Author: till.kamppeter@gmail.com + +--- a/scheduler/client.c ++++ b/scheduler/client.c +@@ -389,7 +389,7 @@ + { + if (httpAddrLocalhost(&temp)) + strlcpy(con->servername, "localhost", sizeof(con->servername)); +- else if (HostNameLookups || RemotePort) ++ else if (HostNameLookups) + httpAddrLookup(&temp, con->servername, sizeof(con->servername)); + else + httpAddrString(&temp, con->servername, sizeof(con->servername)); +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -759,7 +759,7 @@ + cupsdAddAlias(ServerAlias, temp); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp); + +- if (HostNameLookups || RemotePort) ++ if (HostNameLookups) + { + struct hostent *host; /* Host entry to get FQDN */ + diff --git a/debian/patches/drop_unnecessary_dependencies.patch b/debian/patches/drop_unnecessary_dependencies.patch new file mode 100644 index 0000000..f9eec6b --- /dev/null +++ b/debian/patches/drop_unnecessary_dependencies.patch @@ -0,0 +1,83 @@ +Description: Do not link libcups.so and libcupsimage.so against unnecessary libraries. This avoids unnecessary package dependencies for both libcups, as well as for packages using cups-config. +Author: Martin Pitt +Bug-Debian: http://bugs.debian.org/438067 + +--- a/Makedefs.in ++++ b/Makedefs.in +@@ -146,7 +146,7 @@ + DBUS_NOTIFIERLIBS = @DBUS_NOTIFIERLIBS@ + DNSSD_BACKEND = @DNSSD_BACKEND@ + DSOFLAGS = -L../cups @DSOFLAGS@ +-DSOLIBS = @DSOLIBS@ $(COMMONLIBS) ++DSOLIBS = @DSOLIBS@ + DNSSDLIBS = @DNSSDLIBS@ + FONTS = @FONTS@ + IMGLIBS = @IMGLIBS@ +@@ -156,9 +156,9 @@ + -L../scheduler @LDARCHFLAGS@ \ + @LDFLAGS@ @RELROFLAGS@ @PIEFLAGS@ $(OPTIM) + LEGACY_BACKENDS = @LEGACY_BACKENDS@ +-LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(LIBZ) ++LINKCUPS = @LINKCUPS@ $(LIBGSSAPI) $(DNSSDLIBS) $(LIBZ) + LINKCUPSIMAGE = @LINKCUPSIMAGE@ +-LIBS = $(LINKCUPS) $(COMMONLIBS) ++LIBS = $(LINKCUPS) $(SSLLIBS) $(COMMONLIBS) + OPTIM = @OPTIM@ + OPTIONS = + PAMLIBS = @PAMLIBS@ +--- a/cups/Makefile ++++ b/cups/Makefile +@@ -316,7 +316,7 @@ + libcups.so.2 libcups.sl.2: $(LIBOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBGSSAPI) \ +- $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) ++ $(SSLLIBS) $(DNSSDLIBS) -lpthread $(LIBZ) -lm + $(RM) `basename $@ .2` + $(LN) $@ `basename $@ .2` + +@@ -329,7 +329,7 @@ + echo Linking 32-bit $@... + -mkdir 32bit + $(DSO) $(ARCH32FLAGS) $(DSO32FLAGS) -o $@ $(LIB32OBJS) $(LIBGSSAPI) \ +- $(DNSSDLIBS) $(SSLLIBS) $(COMMONLIBS) $(LIBZ) ++ $(DNSSDLIBS) $(SSLLIBS) -lpthread $(LIBZ) -lm + $(RM) 32bit/libcups.so + $(LN) libcups.so.2 32bit/libcups.so + +@@ -342,7 +342,7 @@ + echo Linking 64-bit $@... + -mkdir 64bit + $(DSO) $(ARCH64FLAGS) $(DSO64FLAGS) -o $@ $(LIB64OBJS) $(LIBGSSAPI) \ +- $(DNSSDLIBS) $(SSLLIBS) $(COMMONLIBS) $(LIBZ) ++ $(DNSSDLIBS) $(SSLLIBS) -lpthread $(LIBZ) -lm + $(RM) 64bit/libcups.so + $(LN) libcups.so.2 64bit/libcups.so + +@@ -363,7 +363,7 @@ + -compatibility_version 2.0.0 \ + -exported_symbols_list t.exp \ + $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ +- $(COMMONLIBS) $(LIBZ) ++ -lpthread $(LIBZ) -lm + $(RM) libcups.dylib t.exp + $(LN) $@ libcups.dylib + +@@ -376,7 +376,7 @@ + echo Creating $@... + $(DSO) $(DSOFLAGS) -Wl,-bexport:libcups_s.exp -o libcups_s.o \ + $(LIBOBJS) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ +- $(COMMONLIBS) $(LIBZ) ++ -lpthread $(LIBZ) -lm + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcups_s.o + +@@ -389,7 +389,7 @@ + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) \ + -rpath $(LIBDIR) -version-info 2:9 $(LIBGSSAPI) $(SSLLIBS) \ +- $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) ++ $(DNSSDLIBS) -lpthread $(LIBZ) -lm + + + # diff --git a/debian/patches/install-sh-remove-bashism.patch b/debian/patches/install-sh-remove-bashism.patch new file mode 100644 index 0000000..a068365 --- /dev/null +++ b/debian/patches/install-sh-remove-bashism.patch @@ -0,0 +1,15 @@ +--- a/install-sh ++++ b/install-sh +@@ -61,10 +61,10 @@ + dst="" + dir_arg="" + +-function gzipcp { ++gzipcp () ( + # gzipcp from to + $gzipprog -9 <"$1" >"$2" +-} ++) + + while [ x"$1" != x ]; do + case $1 in diff --git a/debian/patches/ipp-backend-cups-1.5.4-fixes.patch b/debian/patches/ipp-backend-cups-1.5.4-fixes.patch new file mode 100644 index 0000000..28aa835 --- /dev/null +++ b/debian/patches/ipp-backend-cups-1.5.4-fixes.patch @@ -0,0 +1,187 @@ +--- a/backend/ipp.c ++++ b/backend/ipp.c +@@ -62,7 +62,8 @@ + *resource; /* Resource path */ + int port, /* Port number */ + version, /* IPP version */ +- job_id; /* Job ID for submitted job */ ++ job_id, /* Job ID for submitted job */ ++ get_job_attrs; /* Support Get-Job-Attributes? */ + const char *job_name; /* Job name for submitted job */ + http_encryption_t encryption; /* Use encryption? */ + ipp_jstate_t job_state; /* Current job state */ +@@ -237,6 +238,7 @@ + ipp_attribute_t *printer_state; /* printer-state attribute */ + ipp_attribute_t *printer_accepting; /* printer-is-accepting-jobs */ + int create_job = 0, /* Does printer support Create-Job? */ ++ get_job_attrs = 0, /* Does printer support Get-Job-Attributes? */ + send_document = 0, /* Does printer support Send-Document? */ + validate_job = 0; /* Does printer support Validate-Job? */ + int copies, /* Number of copies for job */ +@@ -1065,13 +1067,18 @@ + create_job = 1; + else if (operations_sup->values[i].integer == IPP_SEND_DOCUMENT) + send_document = 1; ++ else if (operations_sup->values[i].integer == IPP_GET_JOB_ATTRIBUTES) ++ get_job_attrs = 1; + } + +- if (!send_document) ++ if (create_job && !send_document) + { + fputs("DEBUG: Printer supports Create-Job but not Send-Document.\n", + stderr); + create_job = 0; ++ ++ update_reasons(NULL, "+cups-ipp-conformance-failure-report," ++ "cups-ipp-missing-send-document"); + } + + if (!validate_job) +@@ -1255,6 +1262,7 @@ + monitor.port = port; + monitor.version = version; + monitor.job_id = 0; ++ monitor.get_job_attrs = get_job_attrs; + monitor.encryption = cupsEncryption(); + monitor.job_state = IPP_JOB_PENDING; + monitor.printer_state = IPP_PRINTER_IDLE; +@@ -1298,6 +1306,8 @@ + _cupsLangPrintFilter(stderr, "INFO", _("The printer is busy.")); + sleep(10); + } ++ else if (ipp_status == IPP_DOCUMENT_FORMAT) ++ goto cleanup; + else if (ipp_status == IPP_FORBIDDEN || + ipp_status == IPP_AUTHENTICATION_CANCELED) + { +@@ -1652,7 +1662,7 @@ + * Wait for the job to complete... + */ + +- if (!job_id || !waitjob) ++ if (!job_id || !waitjob || !get_job_attrs) + continue; + + _cupsLangPrintFilter(stderr, "INFO", _("Waiting for job to complete.")); +@@ -1695,7 +1705,7 @@ + response = cupsDoRequest(http, request, resource); + ipp_status = cupsLastError(); + +- if (ipp_status == IPP_NOT_FOUND) ++ if (ipp_status == IPP_NOT_FOUND || ipp_status == IPP_NOT_POSSIBLE) + { + /* + * Job has gone away and/or the server has no job history... +@@ -1717,7 +1727,6 @@ + else + { + if (ipp_status != IPP_SERVICE_UNAVAILABLE && +- ipp_status != IPP_NOT_POSSIBLE && + ipp_status != IPP_PRINTER_BUSY) + { + ippDelete(response); +@@ -1865,12 +1874,18 @@ + return (CUPS_BACKEND_AUTH_REQUIRED); + else if (ipp_status == IPP_INTERNAL_ERROR) + return (CUPS_BACKEND_STOP); +- else if (ipp_status == IPP_DOCUMENT_FORMAT || +- ipp_status == IPP_CONFLICT) ++ else if (ipp_status == IPP_CONFLICT) + return (CUPS_BACKEND_FAILED); +- else if (ipp_status == IPP_REQUEST_VALUE) ++ else if (ipp_status == IPP_REQUEST_VALUE || ++ ipp_status == IPP_DOCUMENT_FORMAT || job_canceled < 0) + { +- _cupsLangPrintFilter(stderr, "ERROR", _("Print job too large.")); ++ if (ipp_status == IPP_REQUEST_VALUE) ++ _cupsLangPrintFilter(stderr, "ERROR", _("Print job too large.")); ++ else if (ipp_status == IPP_DOCUMENT_FORMAT) ++ _cupsLangPrintFilter(stderr, "ERROR", ++ _("Printer cannot print supplied content.")); ++ else ++ _cupsLangPrintFilter(stderr, "ERROR", _("Print job canceled at printer.")); + return (CUPS_BACKEND_CANCEL); + } + else if (ipp_status > IPP_OK_CONFLICT && ipp_status != IPP_ERROR_JOB_CANCELED) +@@ -2116,7 +2131,8 @@ + * Check the status of the job itself... + */ + +- job_op = monitor->job_id > 0 ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS; ++ job_op = (monitor->job_id > 0 && monitor->get_job_attrs) ? ++ IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS; + request = ippNewRequest(job_op); + request->request.op.version[0] = monitor->version / 10; + request->request.op.version[1] = monitor->version % 10; +@@ -2306,7 +2322,7 @@ + fprintf(stderr, "DEBUG: job-name=\"%s\"\n", title); + } + +- if (format) ++ if (format && op != IPP_CREATE_JOB) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, format); +@@ -2314,7 +2330,7 @@ + } + + #ifdef HAVE_LIBZ +- if (compression) ++ if (compression && op != IPP_CREATE_JOB) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "compression", NULL, compression); +--- a/scheduler/printers.c ++++ b/scheduler/printers.c +@@ -4233,6 +4233,41 @@ + } + + /* ++ * media-size-supported ++ */ ++ ++ num_media = p->pc->num_sizes; ++ if (p->pc->custom_min_keyword) ++ num_media ++; ++ ++ if ((attr = ippAddCollections(p->ppd_attrs, IPP_TAG_PRINTER, ++ "media-size-supported", num_media, ++ NULL)) != NULL) ++ { ++ val = attr->values; ++ ++ for (i = p->pc->num_sizes, pwgsize = p->pc->sizes; ++ i > 0; ++ i --, pwgsize ++, val ++) ++ { ++ val->collection = ippNew(); ++ ippAddInteger(val->collection, IPP_TAG_PRINTER, IPP_TAG_INTEGER, ++ "x-dimension", pwgsize->width); ++ ippAddInteger(val->collection, IPP_TAG_PRINTER, IPP_TAG_INTEGER, ++ "y-dimension", pwgsize->length); ++ } ++ ++ if (p->pc->custom_min_keyword) ++ { ++ val->collection = ippNew(); ++ ippAddRange(val->collection, IPP_TAG_PRINTER, "x-dimension", ++ p->pc->custom_min_width, p->pc->custom_max_width); ++ ippAddRange(val->collection, IPP_TAG_PRINTER, "y-dimension", ++ p->pc->custom_min_length, p->pc->custom_max_length); ++ } ++ } ++ ++ /* + * media-source-supported + */ + +@@ -5145,6 +5180,8 @@ + message = "Printer does not support REQUIRED Validate-Job operation."; + else if (!strcmp(reason, "missing-get-printer-attributes")) + message = "Printer does not support REQUIRED Get-Printer-Attributes operation."; ++ else if (!strcmp(reason, "missing-send-document")) ++ message = "Printer supports Create-Job but not Send-Document operation."; + else if (!strcmp(reason, "missing-job-history")) + message = "Printer does not provide REQUIRED job history."; + else if (!strcmp(reason, "missing-job-id")) diff --git a/debian/patches/log-debug-history-nearly-unlimited.patch b/debian/patches/log-debug-history-nearly-unlimited.patch new file mode 100644 index 0000000..e33e24a --- /dev/null +++ b/debian/patches/log-debug-history-nearly-unlimited.patch @@ -0,0 +1,24 @@ +Author: till.kamppeter@gmail.com + +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -626,7 +626,7 @@ + KeepAlive = TRUE; + KeepAliveTimeout = DEFAULT_KEEPALIVE; + ListenBackLog = SOMAXCONN; +- LogDebugHistory = 200; ++ LogDebugHistory = 99999; + LogFilePerm = CUPS_DEFAULT_LOG_FILE_PERM; + LogLevel = CUPSD_LOG_WARN; + LogTimeFormat = CUPSD_TIME_STANDARD; +--- a/scheduler/conf.h ++++ b/scheduler/conf.h +@@ -165,7 +165,7 @@ + /* Allow overrides? */ + ConfigFilePerm VALUE(0640), + /* Permissions for config files */ +- LogDebugHistory VALUE(200), ++ LogDebugHistory VALUE(99999), + /* Amount of automatic debug history */ + FatalErrors VALUE(CUPSD_FATAL_CONFIG), + /* Which errors are fatal? */ diff --git a/debian/patches/logfiles_adm_readable.patch b/debian/patches/logfiles_adm_readable.patch new file mode 100644 index 0000000..45f4974 --- /dev/null +++ b/debian/patches/logfiles_adm_readable.patch @@ -0,0 +1,52 @@ +Description: Make log files readable to group "adm", if present. +Author: Martin Pitt +Bug-Ubuntu: https://launchpad.net/bugs/345953 + +--- a/scheduler/log.c ++++ b/scheduler/log.c +@@ -32,6 +32,7 @@ + #include "cupsd.h" + #include + #include ++#include + + + /* +@@ -61,6 +62,7 @@ + filename[1024], /* Formatted log filename */ + *ptr; /* Pointer into filename */ + const char *logptr; /* Pointer into log filename */ ++ struct group *loggrp; /* Group entry of log filename */ + + + /* +@@ -71,6 +73,11 @@ + return (1); + + /* ++ * Use adm group if possible, fall back to Group ++ */ ++ loggrp = getgrnam("adm"); ++ ++ /* + * Format the filename as needed... + */ + +@@ -180,7 +187,7 @@ + * Change ownership and permissions of non-device logs... + */ + +- fchown(cupsFileNumber(*lf), RunUser, Group); ++ fchown(cupsFileNumber(*lf), RunUser, loggrp ? loggrp->gr_gid : Group); + fchmod(cupsFileNumber(*lf), LogFilePerm); + } + } +@@ -219,7 +226,7 @@ + * Change ownership and permissions of non-device logs... + */ + +- fchown(cupsFileNumber(*lf), RunUser, Group); ++ fchown(cupsFileNumber(*lf), RunUser, loggrp ? loggrp->gr_gid : Group); + fchmod(cupsFileNumber(*lf), LogFilePerm); + } + diff --git a/debian/patches/manpage-translations.patch b/debian/patches/manpage-translations.patch new file mode 100644 index 0000000..5c6a4b0 --- /dev/null +++ b/debian/patches/manpage-translations.patch @@ -0,0 +1,19253 @@ +Description: po4a infrastructure and translations for manpages. +Author: Nicolas François , Helge Kreutzmann +Bug-Debian: http://bugs.debian.org/478597 + +Index: cups-1.5.0/man/Makefile +=================================================================== +--- cups-1.5.0.orig/man/Makefile 2012-01-30 06:56:36.626113106 +0100 ++++ cups-1.5.0/man/Makefile 2012-01-30 06:57:22.490115325 +0100 +@@ -66,12 +66,18 @@ + lpmove.$(MAN8EXT) \ + lpc.$(MAN8EXT) + ++LANGUAGES=de fr + + # + # Make everything... + # + +-all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) html ++all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) html translations ++ ++translations: ++ # Update the translations and build the translated material ++ po4a --previous po4a/cups.cfg ++ for lang in $(LANGUAGES); do $(MAKE) -C $$lang; done + + + # +@@ -107,6 +113,11 @@ + for file in $(MAN8); do \ + $(RM) ../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \ + done ++ for lang in $(LANGUAGES); do $(MAKE) -C $$lang clean; done ++ # Make sure the PO files are updated and remove generated ++ # translations. ++ po4a --previous --rm-translations po4a/cups.cfg ++ $(RM) po4a/po/cups.pot + + + # +@@ -154,6 +165,7 @@ + done + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) ++ for lang in $(LANGUAGES); do $(MAKE) -C $$lang install; done + + + # +@@ -202,6 +214,7 @@ + $(RM) $(AMANDIR)/man$(MAN8DIR)/reject.$(MAN8EXT) + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + -$(RMDIR) $(AMANDIR)/man$(MAN8DIR) ++ for lang in $(LANGUAGES); do $(MAKE) -C $$lang uninstall; done + + + # +Index: cups-1.5.0/man/Makefile.l10n +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/Makefile.l10n 2012-01-30 06:57:22.490115325 +0100 +@@ -0,0 +1,209 @@ ++# ++# "$Id: $" ++# ++# Man page makefile for the Common UNIX Printing System (CUPS). ++# ++# Copyright 2007 by Apple Inc. ++# Copyright 1993-2006 by Easy Software Products. ++# ++# These coded instructions, statements, and computer programs are the ++# property of Apple Inc. and are protected by Federal copyright ++# law. Distribution and use rights are outlined in the file "LICENSE.txt" ++# which should have been included with this file. If this file is ++# file is missing or damaged, see the license at "http://www.cups.org/". ++# ++ ++include ../../Makedefs ++ ++ ++# ++# Man pages... ++# ++ ++MAN1 = cancel.$(MAN1EXT) \ ++ cups-config.$(MAN1EXT) \ ++ cupstestdsc.$(MAN1EXT) \ ++ cupstestppd.$(MAN1EXT) \ ++ lp.$(MAN1EXT) \ ++ lpoptions.$(MAN1EXT) \ ++ lppasswd.$(MAN1EXT) \ ++ lpq.$(MAN1EXT) \ ++ lprm.$(MAN1EXT) \ ++ lpr.$(MAN1EXT) \ ++ lpstat.$(MAN1EXT) ++MAN5 = classes.conf.$(MAN5EXT) \ ++ client.conf.$(MAN5EXT) \ ++ cups-snmp.conf.$(MAN5EXT) \ ++ cupsd.conf.$(MAN5EXT) \ ++ mailto.conf.$(MAN5EXT) \ ++ mime.convs.$(MAN5EXT) \ ++ mime.types.$(MAN5EXT) \ ++ printers.conf.$(MAN5EXT) \ ++ subscriptions.conf.$(MAN5EXT) ++MAN7 = backend.$(MAN7EXT) \ ++ filter.$(MAN7EXT) ++MAN8 = cupsaccept.$(MAN8EXT) \ ++ cupsaddsmb.$(MAN8EXT) \ ++ cupsctl.$(MAN8EXT) \ ++ cupsfilter.$(MAN8EXT) \ ++ cups-deviced.$(MAN8EXT) \ ++ cups-driverd.$(MAN8EXT) \ ++ cups-lpd.$(MAN8EXT) \ ++ cups-polld.$(MAN8EXT) \ ++ cupsd.$(MAN8EXT) \ ++ cupsenable.$(MAN8EXT) \ ++ lpadmin.$(MAN8EXT) \ ++ lpinfo.$(MAN8EXT) \ ++ lpmove.$(MAN8EXT) \ ++ lpc.$(MAN8EXT) ++ ++ ++# ++# Make everything... ++# ++ ++all: manpages.gz html ++ ++# Prepare all the existing manpages, and compress them. ++# But do not fail if a manpage was not generated. ++manpages.gz: manpages.gz-stamp ++manpages.gz-stamp: ++ for file in $(MAN1) $(MAN5) $(MAN7) $(MAN8); do \ ++ $(MAKE) $$file || true; \ ++ done ++ touch $@ ++ ++# ++# Clean all config and object files... ++# ++ ++clean: ++ $(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8) ++ for file in $(MAN1); do \ ++ $(RM) ../../doc/help/man-`basename $$file .$(MAN1EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(MAN5); do \ ++ $(RM) ../../doc/help/man-`basename $$file .$(MAN5EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(MAN7); do \ ++ $(RM) ../../doc/help/man-`basename $$file .$(MAN7EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(MAN8); do \ ++ $(RM) ../../doc/help/man-`basename $$file .$(MAN8EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in *.man.in; do \ ++ $(RM) `basename $$file .in`; \ ++ done ++ $(RM) manpages.gz-stamp ++ ++ ++# ++# Dummy depend target... ++# ++ ++depend: ++ ++ ++# ++# Install files... ++# ++ ++MANDIR := $(MANDIR)/$(LANGUAGE) ++AMANDIR := $(AMANDIR)/$(LANGUAGE) ++ ++install: all ++ $(INSTALL_DIR) -m 755 $(MANDIR)/man1 ++ for file in $(wildcard $(MAN1)); do \ ++ echo Installing $$file in $(MANDIR)/man1...; \ ++ $(INSTALL_MAN) $$file $(MANDIR)/man1; \ ++ done ++ $(INSTALL_DIR) -m 755 $(MANDIR)/man5 ++ for file in $(wildcard $(MAN5)); do \ ++ echo Installing $$file in $(MANDIR)/man5...; \ ++ $(INSTALL_MAN) $$file $(MANDIR)/man5; \ ++ done ++ $(INSTALL_DIR) -m 755 $(MANDIR)/man7 ++ for file in $(wildcard $(MAN7)); do \ ++ echo Installing $$file in $(MANDIR)/man7...; \ ++ $(INSTALL_MAN) $$file $(MANDIR)/man7; \ ++ done ++ $(INSTALL_DIR) -m 755 $(AMANDIR)/man$(MAN8DIR) ++ for file in $(wildcard $(MAN8)); do \ ++ echo Installing $$file in $(AMANDIR)/man$(MAN8DIR)...; \ ++ $(INSTALL_MAN) $$file $(AMANDIR)/man$(MAN8DIR); \ ++ done ++ if [ -f cupsreject.$(MAN8EXT) ]; then \ ++ $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT); \ ++ fi ++ if [ -f cupsaccept.$(MAN8EXT) ]; then \ ++ $(LN) cupsaccept.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT); \ ++ fi ++ if [ -f cupsdisable.$(MAN8EXT) ]; then \ ++ $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT); \ ++ fi ++ if [ -f cupsenable.$(MAN8EXT) ]; then \ ++ $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT); \ ++ fi ++ ++ ++# ++# Uninstall files... ++# ++ ++uninstall: ++ for file in $(MAN1); do \ ++ $(RM) $(MANDIR)/man1/$$file; \ ++ done ++ -$(RMDIR) $(MANDIR)/man1 ++ for file in $(MAN5); do \ ++ $(RM) $(MANDIR)/man5/$$file; \ ++ done ++ -$(RMDIR) $(MANDIR)/man5 ++ for file in $(MAN7); do \ ++ $(RM) $(MANDIR)/man7/$$file; \ ++ done ++ -$(RMDIR) $(MANDIR)/man7 ++ for file in $(MAN8); do \ ++ $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file; \ ++ done ++ $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT) ++ $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) ++ -$(RMDIR) $(AMANDIR)/man$(MAN8DIR) ++ ++ ++# ++# Make html versions of man pages... ++# ++ ++MANTOHTML = ../mantohtml ++html: manpages.gz $(MANTOHTML) ++ echo Converting man pages to HTML... ++ for file in $(wildcard $(MAN1)); do \ ++ echo " $$file..."; \ ++ $(MANTOHTML) `basename $$file .$(MAN1EXT)`.man >../../doc/help/man-`basename $$file .$(MAN1EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(wildcard $(MAN5)); do \ ++ echo " $$file..."; \ ++ $(MANTOHTML) `basename $$file .$(MAN5EXT)`.man >../../doc/help/man-`basename $$file .$(MAN5EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(wildcard $(MAN7)); do \ ++ echo " $$file..."; \ ++ $(MANTOHTML) `basename $$file .$(MAN7EXT)`.man >../../doc/help/man-`basename $$file .$(MAN7EXT)`.$(LANGUAGE).html; \ ++ done ++ for file in $(wildcard $(MAN8)); do \ ++ echo " $$file..."; \ ++ $(MANTOHTML) `basename $$file .$(MAN8EXT)`.man >../../doc/help/man-`basename $$file .$(MAN8EXT)`.$(LANGUAGE).html; \ ++ done ++ ++.SUFFIXES: .man.in .man ++# Keep the generated .man because they are needed for the html rule ++.PRECIOUS: %.man ++ ++.man.in.man: ++ sed -e 's:@CUPS_DATADIR@:$(DATADIR):' \ ++ -e 's:@CUPS_SERVERROOT@:$(SERVERROOT):' \ ++ -e 's:@CUPS_SERVERBIN@:$(SERVERBIN):' $< > $@ ++ ++# ++# End of "$Id: $". ++# +Index: cups-1.5.0/man/de/Makefile +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/de/Makefile 2012-01-30 06:57:22.490115325 +0100 +@@ -0,0 +1,13 @@ ++# ++# "$Id: $" ++# ++# Man page makefile for the Common UNIX Printing System (CUPS). ++# ++ ++LANGUAGE=de ++ ++include ../Makefile.l10n ++ ++# ++# End of "$Id: $". ++# +Index: cups-1.5.0/man/fr/Makefile +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/fr/Makefile 2012-01-30 06:57:22.490115325 +0100 +@@ -0,0 +1,13 @@ ++# ++# "$Id: $" ++# ++# Man page makefile for the Common UNIX Printing System (CUPS). ++# ++ ++LANGUAGE=fr ++ ++include ../Makefile.l10n ++ ++# ++# End of "$Id: $". ++# +Index: cups-1.5.0/man/po4a/cups.cfg +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/po4a/cups.cfg 2012-01-30 06:57:22.490115325 +0100 +@@ -0,0 +1,40 @@ ++[po4a_langs] fr de ++[po4a_paths] po4a/po/cups.pot $lang:po4a/po/$lang.po ++ ++[type: man] cupsaccept.man $lang:$lang/cupsaccept.man ++[type: man] backend.man $lang:$lang/backend.man ++[type: man] cancel.man $lang:$lang/cancel.man ++[type: man] classes.conf.man $lang:$lang/classes.conf.man ++[type: man] client.conf.man.in $lang:$lang/client.conf.man.in ++[type: man] cupsaddsmb.man.in $lang:$lang/cupsaddsmb.man.in ++[type: man] cups-config.man $lang:$lang/cups-config.man ++[type: man] cupsctl.man $lang:$lang/cupsctl.man ++[type: man] cupsd.conf.man.in $lang:$lang/cupsd.conf.man.in ++[type: man] cups-deviced.man.in $lang:$lang/cups-deviced.man.in ++[type: man] cupsd.man.in $lang:$lang/cupsd.man.in ++[type: man] cups-driverd.man.in $lang:$lang/cups-driverd.man.in ++[type: man] cupsenable.man $lang:$lang/cupsenable.man ++[type: man] cupsfilter.man $lang:$lang/cupsfilter.man ++[type: man] cups-lpd.man.in $lang:$lang/cups-lpd.man.in ++[type: man] cups-polld.man $lang:$lang/cups-polld.man ++[type: man] cups-snmp.conf.man $lang:$lang/cups-snmp.conf.man ++[type: man] cupstestdsc.man $lang:$lang/cupstestdsc.man ++[type: man] cupstestppd.man $lang:$lang/cupstestppd.man ++[type: man] filter.man $lang:$lang/filter.man ++[type: man] lpadmin.man $lang:$lang/lpadmin.man ++[type: man] lpc.man $lang:$lang/lpc.man ++[type: man] lpinfo.man $lang:$lang/lpinfo.man ++[type: man] lp.man $lang:$lang/lp.man ++[type: man] lpmove.man $lang:$lang/lpmove.man ++[type: man] lpoptions.man.in $lang:$lang/lpoptions.man.in ++[type: man] lppasswd.man $lang:$lang/lppasswd.man ++[type: man] lpq.man $lang:$lang/lpq.man ++[type: man] lpr.man $lang:$lang/lpr.man ++[type: man] lprm.man $lang:$lang/lprm.man ++[type: man] lpstat.man $lang:$lang/lpstat.man ++[type: man] mailto.conf.man $lang:$lang/mailto.conf.man ++[type: man] mime.convs.man $lang:$lang/mime.convs.man ++[type: man] mime.types.man $lang:$lang/mime.types.man ++[type: man] printers.conf.man $lang:$lang/printers.conf.man ++[type: man] subscriptions.conf.man $lang:$lang/subscriptions.conf.man ++ +Index: cups-1.5.0/man/po4a/po/de.po +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/po4a/po/de.po 2012-01-30 06:56:42.014113366 +0100 +@@ -0,0 +1,10478 @@ ++# Translation of cups man pages to German ++# Copyright (C) Helge Kreutzmann , 2008-2011 ++# Chris Leick , 2009. ++# This file is distributed under the same license as the cups package. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: cups man pages 1.4.2-3\n" ++"POT-Creation-Date: 2011-06-11 17:41+0000\n" ++"PO-Revision-Date: 2011-06-12 13:35+0200\n" ++"Last-Translator: Helge Kreutzmann \n" ++"Language-Team: de \n" ++"Language: \n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Plural-Forms: nplurals=2; plural=n != 1;\n" ++ ++# type: TH ++#. type: TH ++#: cupsaccept.man:15 ++#, no-wrap ++msgid "cupsaccept" ++msgstr "cupsaccept" ++ ++#. type: TH ++#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 ++#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 ++#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 ++#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 ++#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 ++#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 ++#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 ++#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 ++#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "CUPS" ++msgstr "CUPS" ++ ++# type: TH ++#. type: TH ++#: cupsaccept.man:15 cups-polld.man:15 lpmove.man:15 ++#, no-wrap ++msgid "12 February 2006" ++msgstr "12. Februar 2006" ++ ++# type: TH ++#. type: TH ++#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 ++#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 ++#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 ++#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 ++#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 ++#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 ++#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 ++#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 ++#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "Apple Inc." ++msgstr "Apple Inc." ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:16 backend.man:17 cancel.man:16 classes.conf.man:16 ++#: client.conf.man.in:16 cupsaddsmb.man.in:16 cups-config.man:16 ++#: cupsctl.man:16 cupsd.conf.man.in:16 cups-deviced.man.in:16 cupsd.man.in:16 ++#: cups-driverd.man.in:16 cupsenable.man:17 cupsfilter.man:15 ++#: cups-lpd.man.in:16 cups-polld.man:16 cups-snmp.conf.man:16 ++#: cupstestdsc.man:16 cupstestppd.man:16 filter.man:16 lpadmin.man:16 ++#: lpc.man:16 lpinfo.man:16 lp.man:16 lpmove.man:16 lpoptions.man.in:16 ++#: lppasswd.man:16 lpq.man:16 lpr.man:16 lprm.man:16 lpstat.man:16 ++#: mailto.conf.man:16 mime.convs.man:16 mime.types.man:16 printers.conf.man:16 ++#: subscriptions.conf.man:16 ++#, no-wrap ++msgid "NAME" ++msgstr "NAME" ++ ++#. type: Plain text ++#: cupsaccept.man:18 ++msgid "cupsaccept/cupsreject - accept/reject jobs sent to a destination" ++msgstr "" ++"cupsaccept/cupsreject - Druckaufträge für ein Ziel akzeptieren/ablehnen" ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:18 backend.man:20 cancel.man:18 cupsaddsmb.man.in:19 ++#: cups-config.man:18 cupsctl.man:18 cups-deviced.man.in:18 cupsd.man.in:18 ++#: cups-driverd.man.in:18 cupsenable.man:19 cupsfilter.man:17 ++#: cups-lpd.man.in:18 cups-polld.man:18 cupstestdsc.man:18 cupstestppd.man:18 ++#: filter.man:18 lpadmin.man:18 lpc.man:18 lpinfo.man:18 lp.man:18 ++#: lpmove.man:18 lpoptions.man.in:18 lppasswd.man:18 lpq.man:18 lpr.man:18 ++#: lprm.man:18 lpstat.man:18 ++#, no-wrap ++msgid "SYNOPSIS" ++msgstr "SYNOPSIS" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:25 ++msgid "" ++"B [ -E ] [ -U I ] [ -h I ] destination" ++"(s)" ++msgstr "" ++"B [ -E ] [ -U I ] [ -h I ] Ziel(e)" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:34 ++msgid "" ++"B [ -E ] [ -U I ] [ -h I ] [ -r " ++"I ] destination(s)" ++msgstr "" ++"B [ -E ] [ -U I ] [ -h I ] [ -r " ++"I ] Ziel(e)" ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:34 backend.man:28 cancel.man:33 classes.conf.man:18 ++#: client.conf.man.in:18 cupsaddsmb.man.in:38 cups-config.man:53 ++#: cupsctl.man:29 cupsd.conf.man.in:18 cups-deviced.man.in:21 cupsd.man.in:23 ++#: cups-driverd.man.in:26 cupsenable.man:35 cupsfilter.man:35 ++#: cups-lpd.man.in:25 cups-polld.man:21 cups-snmp.conf.man:18 ++#: cupstestdsc.man:26 cupstestppd.man:34 filter.man:23 lpadmin.man:42 ++#: lpc.man:25 lpinfo.man:50 lp.man:62 lpmove.man:34 lpoptions.man.in:62 ++#: lppasswd.man:33 lpq.man:29 lpr.man:35 lprm.man:29 lpstat.man:39 ++#: mailto.conf.man:18 mime.convs.man:18 mime.types.man:18 printers.conf.man:18 ++#: subscriptions.conf.man:18 ++#, no-wrap ++msgid "DESCRIPTION" ++msgstr "BESCHREIBUNG" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:37 ++msgid "" ++"I instructs the printing system to accept print jobs to the " ++"specified destinations." ++msgstr "" ++"I weist das Drucksystem an, Druckaufträge für die angegebenen " ++"Ziele zu akzeptieren." ++ ++#. type: Plain text ++#: cupsaccept.man:41 ++msgid "" ++"I instructs the printing system to reject print jobs to the " ++"specified destinations. The I<-r> option sets the reason for rejecting print " ++"jobs. If not specified the reason defaults to \"Reason Unknown\"." ++msgstr "" ++"I weist das Drucksystem an, Druckaufträge für die angegebenen " ++"Ziele abzuweisen. Die Option I<-r> setzt den Grund für das Abweisen der " ++"Druckaufträge. Falls nicht angegeben, wird der Grund auf »Reason Unknown« " ++"gesetzt." ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:41 cancel.man:36 cupsaddsmb.man.in:45 cups-config.man:58 ++#: cupsctl.man:33 cupsd.man.in:28 cupsfilter.man:39 cups-lpd.man.in:62 ++#: cupstestppd.man:44 filter.man:37 lpinfo.man:55 lp.man:70 lpmove.man:44 ++#: lppasswd.man:41 lpq.man:37 lpr.man:45 lprm.man:35 lpstat.man:43 ++#, no-wrap ++msgid "OPTIONS" ++msgstr "OPTIONEN" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:44 ++msgid "" ++"The following options are supported by both I and I:" ++msgstr "" ++"Die folgenden Optionen werden von I und I erkannt:" ++ ++# type: TP ++#. type: TP ++#: cupsaccept.man:44 cancel.man:38 cupsctl.man:35 cupsenable.man:40 ++#: lpadmin.man:173 lpinfo.man:57 lp.man:77 lpmove.man:46 lpoptions.man.in:66 ++#: lpq.man:39 lpr.man:47 lprm.man:37 lpstat.man:45 ++#, no-wrap ++msgid "-E" ++msgstr "-E" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:48 cancel.man:42 lpinfo.man:61 lp.man:81 lpmove.man:50 ++#: lpq.man:43 lpr.man:51 lprm.man:41 lpstat.man:49 ++msgid "Forces encryption when connecting to the server." ++msgstr "Erzwingt Verschlüsselung bei Verbindungen zum Server." ++ ++# type: TP ++#. type: TP ++#: cupsaccept.man:48 cancel.man:42 cupsenable.man:44 lpinfo.man:61 lp.man:81 ++#: lpmove.man:50 lpoptions.man.in:70 lpq.man:47 lpr.man:67 lprm.man:45 ++#: lpstat.man:57 ++#, no-wrap ++msgid "-U username" ++msgstr "-U Benutzername" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:52 ++msgid "Sets the username that is sent when connecting to the server." ++msgstr "" ++"Setzt den Benutzernamen, der bei Verbindungen zum Server gesandt werden wird." ++ ++# type: TP ++#. type: TP ++#: cupsaccept.man:52 cancel.man:51 cups-lpd.man.in:63 lp.man:97 ++#, no-wrap ++msgid "-h hostname[:port]" ++msgstr "-h Hostname[:Port]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:56 cancel.man:55 lp.man:101 ++msgid "Chooses an alternate server." ++msgstr "Wählt einen alternativen Server." ++ ++# type: TP ++#. type: TP ++#: cupsaccept.man:56 cupsenable.man:61 ++#, no-wrap ++msgid "-r \"reason\"" ++msgstr "-r \"Grund\"" ++ ++#. type: Plain text ++#: cupsaccept.man:61 ++msgid "" ++"Sets the reason string that is shown for a printer that is rejecting jobs." ++msgstr "" ++"Setzt die Begründungszeichenkette, die für einen Drucker angezeigt wird, der " ++"Druckaufträge abweist." ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:61 cancel.man:59 cupsd.man.in:57 cupsenable.man:71 ++#: cups-lpd.man.in:104 filter.man:243 lpadmin.man:188 lpc.man:59 ++#: lpinfo.man:105 lp.man:245 lpoptions.man.in:119 lpr.man:110 lprm.man:53 ++#: lpstat.man:127 ++#, no-wrap ++msgid "COMPATIBILITY" ++msgstr "KOMPATIBILITÄT" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:65 cancel.man:63 cupsenable.man:75 lp.man:249 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " ++"and class names are I case-sensitive." ++msgstr "" ++"Anders als das System V-Drucksystem erlaubt es CUPS, dass Druckernamen alle " ++"druckbaren Zeichen außer Leertaste, Tabulator, »/« und »#« enthalten. Auch " ++"sind Drucker- und Klassennamen I von der Groß-/Kleinschreibung." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:70 ++msgid "" ++"The CUPS versions of I and I may ask the user for an access " ++"password depending on the printing system configuration. This differs from " ++"the System V versions which require the root user to execute these commands." ++msgstr "" ++"Die CUPS-Versionen von I und I könnten den Benutzer, " ++"abhängig von der Konfiguration des Drucksystems, nach einem Zugriffspasswort " ++"fragen. Dies unterscheidet sich von der System-V-Version, die verlangt, dass " ++"der Benutzer root diese Befehle ausführt." ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:70 backend.man:174 cancel.man:67 classes.conf.man:101 ++#: client.conf.man.in:43 cupsaddsmb.man.in:204 cups-config.man:111 ++#: cupsctl.man:97 cupsd.conf.man.in:704 cups-deviced.man.in:36 cupsd.man.in:61 ++#: cups-driverd.man.in:97 cupsenable.man:84 cupsfilter.man:78 ++#: cups-lpd.man.in:115 cups-polld.man:30 cups-snmp.conf.man:67 ++#: cupstestdsc.man:41 cupstestppd.man:155 filter.man:248 lpadmin.man:199 ++#: lpc.man:62 lpinfo.man:107 lp.man:254 lpmove.man:58 lpoptions.man.in:127 ++#: lppasswd.man:60 lpq.man:63 lpr.man:113 lprm.man:56 lpstat.man:135 ++#: mailto.conf.man:51 mime.convs.man:37 mime.types.man:106 ++#: printers.conf.man:115 subscriptions.conf.man:80 ++#, no-wrap ++msgid "SEE ALSO" ++msgstr "SIEHE AUCH" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:73 ++msgid "I, I, I, I, I," ++msgstr "I, I, I, I, I," ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:75 backend.man:178 cancel.man:71 classes.conf.man:106 ++#: client.conf.man.in:45 cups-config.man:113 cupsctl.man:101 ++#: cupsd.conf.man.in:710 cups-deviced.man.in:40 cupsd.man.in:68 ++#: cups-driverd.man.in:101 cupsenable.man:89 cupsfilter.man:82 ++#: cups-lpd.man.in:120 cups-polld.man:34 cups-snmp.conf.man:69 ++#: cupstestdsc.man:43 cupstestppd.man:159 filter.man:252 lpadmin.man:204 ++#: lpc.man:67 lpinfo.man:111 lp.man:259 lpmove.man:62 lpoptions.man.in:131 ++#: lppasswd.man:64 lpq.man:68 lpr.man:118 lprm.man:61 lpstat.man:139 ++#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:111 ++#: printers.conf.man:120 subscriptions.conf.man:85 ++msgid "http://localhost:631/help" ++msgstr "http://localhost:631/help" ++ ++# type: SH ++#. type: SH ++#: cupsaccept.man:75 backend.man:179 cancel.man:71 classes.conf.man:106 ++#: client.conf.man.in:45 cupsaddsmb.man.in:210 cups-config.man:113 ++#: cupsctl.man:101 cupsd.conf.man.in:710 cups-deviced.man.in:40 ++#: cupsd.man.in:68 cups-driverd.man.in:101 cupsenable.man:89 cupsfilter.man:82 ++#: cups-lpd.man.in:120 cups-polld.man:34 cups-snmp.conf.man:69 ++#: cupstestdsc.man:46 cupstestppd.man:161 filter.man:252 lpadmin.man:204 ++#: lpc.man:67 lpinfo.man:111 lp.man:259 lpmove.man:62 lpoptions.man.in:131 ++#: lppasswd.man:64 lpq.man:68 lpr.man:118 lprm.man:61 lpstat.man:139 ++#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:111 ++#: printers.conf.man:120 subscriptions.conf.man:85 ++#, no-wrap ++msgid "COPYRIGHT" ++msgstr "COPYRIGHT" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaccept.man:76 backend.man:180 cancel.man:72 classes.conf.man:107 ++#: client.conf.man.in:46 cupsaddsmb.man.in:211 cups-config.man:114 ++#: cupsctl.man:102 cupsd.conf.man.in:711 cups-deviced.man.in:41 ++#: cupsd.man.in:69 cups-driverd.man.in:102 cupsenable.man:91 cupsfilter.man:83 ++#: cups-lpd.man.in:121 cups-polld.man:35 cups-snmp.conf.man:70 ++#: cupstestdsc.man:47 cupstestppd.man:162 filter.man:253 lpc.man:68 ++#: lpinfo.man:112 lpmove.man:63 lpoptions.man.in:132 lppasswd.man:65 ++#: lpq.man:69 lpr.man:119 lprm.man:62 lpstat.man:140 mailto.conf.man:57 ++#: mime.convs.man:43 mime.types.man:112 printers.conf.man:121 ++#: subscriptions.conf.man:86 ++msgid "Copyright 2007-2009 by Apple Inc." ++msgstr "Copyright 2007-2009 by Apple Inc." ++ ++# type: TH ++#. type: TH ++#: backend.man:15 ++#, no-wrap ++msgid "backend" ++msgstr "Backend" ++ ++# type: TH ++#. type: TH ++#: backend.man:15 ++#, no-wrap ++msgid "12 May 2009" ++msgstr "12. Mai 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:19 ++msgid "backend - cups backend transmission interfaces" ++msgstr "backend - CUPS Backend-Übertragungsschnittstellen" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:22 ++msgid "B" ++msgstr "B" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:27 ++msgid "B job user title num-copies options [ I ]" ++msgstr "" ++"B Auftrag Benutzer Titel Anzahl-Kopien Optionen [ I ]" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:31 ++msgid "" ++"Backends are a special type of I which is used to send print data " ++"to and discover different devices on the system." ++msgstr "" ++"Backends sind eine besondere Art von I, die verwendet werden, um " ++"Daten zu verschiedenen Geräten auf dem System zu senden und entsprechende " ++"Geräte zu ermitteln." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:37 ++msgid "" ++"Like filters, backends must be capable of reading from a filename on the " ++"command-line or from the standard input, copying the standard input to a " ++"temporary file as required by the physical interface." ++msgstr "" ++"Wie Filter müssen Backends in der Lage sein, aus Dateinamen auf der " ++"Befehlszeile oder von der Standardeingabe zu lesen, die Standardeingabe in " ++"eine temporäre Datei zu kopieren, wie dies von der physischen Schnittstelle " ++"gefordert wird." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:44 ++msgid "" ++"The command name (argv[0]) is set to the device URI of the destination " ++"printer. Starting with CUPS 1.1.22, any authentication information in argv" ++"[0] is removed, so backend developers are urged to use the DEVICE_URI " ++"environment variable whenever authentication information is required. The " ++"CUPS API includes a I function for retrieving the " ++"correct device URI." ++msgstr "" ++"Der Befehlsname (argv[0]) wird auf die Geräte-URI des Zieldruckers gesetzt. " ++"Beginnend mit CUPS 1.1.22 wird jede Authentifizierungsinformation aus argv" ++"[0] entfernt, daher wird Backend-Entwicklern empfohlen, die " ++"Umgebungsvariable DEVICE_URI zu verwenden, wennimmer " ++"Authentifizierungsinformationen benötigt werden. Das CUPS-API enthält eine " ++"Funktion I zum Ermitteln der korrekten Geräte-URI." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:49 ++msgid "" ++"Back-channel data from the device should be relayed to the job filters by " ++"writing to file descriptor 3. The CUPS API includes the " ++"I function for this purpose." ++msgstr "" ++"Rückgeleitete Daten vom Gerät sollten an die Filter für die Aufträge " ++"weitergeleitet werden, indem auf Dateideskriptor 3 geschrieben wird. Das " ++"CUPS-API enthält für diesen Zweck die Funktion I." ++ ++# type: SH ++#. type: SH ++#: backend.man:50 ++#, no-wrap ++msgid "DEVICE DISCOVERY" ++msgstr "GERÄTE-ERMITTLUNG" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:55 ++msgid "" ++"When run with no arguments, the backend should list the devices and schemes " ++"it supports or is advertising to stdout. The output consists of zero or more " ++"lines consisting of any of the following forms:" ++msgstr "" ++"Beim Aufruf ohne Argumente sollte das Backend die Geräte und unterstützten " ++"oder beworbenen Schemata auf Stdout aufführen. Die Ausgabe besteht aus null " ++"oder mehr Zeilen, die in einer der folgenden Formen vorliegen:" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:61 ++#, no-wrap ++msgid "" ++" device-class scheme \"Unknown\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\" \"device-location\"\n" ++msgstr "" ++" device-class scheme \"Unknown\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\" \"device-location\"\n" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:65 ++msgid "The I field is one of the following values:" ++msgstr "Das Feld I enthält einen der folgenden Werte:" ++ ++# type: TP ++#. type: TP ++#: backend.man:66 ++#, no-wrap ++msgid "direct" ++msgstr "direct" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:71 ++msgid "" ++"The device-uri refers to a specific direct-access device with no options, " ++"such as a parallel, USB, or SCSI device." ++msgstr "" ++"Die Geräte-URI bezieht sich auf spezielle Geräte mit direktem Zugriff ohne " ++"Optionen, wie z.B. parallele, USB- oder SCSI-Geräte." ++ ++# type: TP ++#. type: TP ++#: backend.man:72 ++#, no-wrap ++msgid "file" ++msgstr "file" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:76 ++msgid "The device-uri refers to a file on disk." ++msgstr "Die Geräte-URI bezieht sich auf eine Datei auf dem Speichermedium." ++ ++# type: TP ++#. type: TP ++#: backend.man:77 ++#, no-wrap ++msgid "network" ++msgstr "network" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:82 ++msgid "" ++"The device-uri refers to a networked device and conforms to the general form " ++"for network URIs." ++msgstr "" ++"Die Geräte-URI bezieht sich auf ein vernetztes Gerät und folgt der " ++"allgemeinen Form für vernetzte URIs." ++ ++# type: TP ++#. type: TP ++#: backend.man:83 ++#, no-wrap ++msgid "serial" ++msgstr "serial" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:89 ++msgid "" ++"The device-uri refers to a serial device with configurable baud rate and " ++"other options. If the device-uri contains a baud value, it represents the " ++"maximum baud rate supported by the device." ++msgstr "" ++"Die Geräte-URI bezieht sich auf ein serielles Gerät mit einer " ++"konfigurierbaren Baudrate und anderen Optionen. Falls die Geräte-URI einen " ++"Baud-Wert enthält, repräsentiert er die maximale vom Gerät unterstützte " ++"Baudrate." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:96 ++msgid "" ++"The I field provides the URI scheme that is supported by the " ++"backend. Backends should use this form only when the backend supports any " ++"URI using that scheme. The I field specifies the full URI to use " ++"when communicating with the device." ++msgstr "" ++"Das Feld I stellt das vom Backend unterstützte URI-Schemata bereit. " ++"Backends sollten diese Form nur verwenden, wenn das Backend jede dem " ++"Schemata folgende URI unterstützt. Das Feld I spezifiziert die " ++"komplette URI, die bei der Kommunikation mit dem Gerät verwandt werden soll." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:101 ++msgid "" ++"The I field specifies the make and model of the " ++"device, e.g. \"Acme Foojet 2000\". If the make and model is not known, you " ++"must report \"Unknown\"." ++msgstr "" ++"Das Feld I spezifiziert die Marke und das Modell des " ++"Gerätes, z.B. »Acme Foojet 2000«. Falls die Marke und das Modell nicht " ++"bekannt ist, müssen Sie »Unknown« melden." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:107 ++msgid "" ++"The I field specifies additional information about the device. " ++"Typically this includes the make and model along with the port number or " ++"network address, e.g. \"Acme Foojet 2000 USB #1\"." ++msgstr "" ++"Das Feld I spezifiziert zusätzliche Informationen über das " ++"Gerät. Typischerweise enthält es die Marke und das Modell zusammen mit der " ++"Port-Nummer oder der Netz-Adresse, z.B. »Acme Foojet 2000 USB #1«." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:112 ++msgid "" ++"The optional I field specifies the IEEE-1284 device ID string for " ++"the device, which is used to select a matching driver." ++msgstr "" ++"Das optionale Feld I spezifiziert die IEEE-1284-Geräte-ID-" ++"Zeichenkette für das Gerät, die zur Auswahl des passenden Treibers verwandt " ++"wird." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:117 ++msgid "" ++"The optional I field specifies the physical location of the " ++"device, which is often used to pre-populate the printer-location attribute " ++"when adding a printer." ++msgstr "" ++"Das optionale Feld I spezifiziert den physischen Standort " ++"des Geräts. Es wird oft dazu verwandt, die Drucker-Standort-Attribute vorab " ++"zu belegen, wenn ein Drucker hinzugefügt wird." ++ ++# type: SH ++#. type: SH ++#: backend.man:118 ++#, no-wrap ++msgid "PERMISSIONS" ++msgstr "RECHTE" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:122 ++msgid "" ++"Backends without world execute permissions are run as the root user. " ++"Otherwise, the backend is run using the unprivileged user account, typically " ++"\"lp\"." ++msgstr "" ++"Backends, denen die Ausführungsrechte für »world« (andere) fehlen, werden " ++"als Benutzer root ausgeführt. Andernfalls läuft das Backend unter dem " ++"unprivilegierten Benutzerkonto, typischerweise »lp«." ++ ++# type: SH ++#. type: SH ++#: backend.man:123 ++#, no-wrap ++msgid "EXIT CODES" ++msgstr "EXIT-CODES" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:127 ++msgid "" ++"The following exit codes are defined for backends; C API constants defined " ++"in the Ecups/backend.hE header file are defined in parenthesis:" ++msgstr "" ++"Die folgenden Exit-Codes sind für Backends definiert; C API-Konstanten, die " ++"in der Header-Datei Ecups/backend.hE definiert sind, sind in " ++"Klammern definiert:" ++ ++# type: TP ++#. type: TP ++#: backend.man:128 ++#, no-wrap ++msgid "0 (CUPS_BACKEND_OK)" ++msgstr "0 (CUPS_BACKEND_OK)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:133 ++msgid "" ++"The print file was successfully transmitted to the device or remote server." ++msgstr "" ++"Die Druckdatei wurde erfolgreich an das Gerät oder den entfernten Server " ++"übertragen." ++ ++# type: TP ++#. type: TP ++#: backend.man:134 ++#, no-wrap ++msgid "1 (CUPS_BACKEND_FAILED)" ++msgstr "1 (CUPS_BACKEND_FAILED)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:141 ++msgid "" ++"The print file was not successfully transmitted to the device or remote " ++"server. The scheduler will respond to this by canceling the job, retrying " ++"the job, or stopping the queue depending on the state of the error-policy " ++"attribute." ++msgstr "" ++"Die Druckdatei wurde nicht erfolgreich zum Gerät oder entfernten Server " ++"übertragen. Der Auftragsplaner (Scheduler) wird daraufhin den Auftrag " ++"abbrechen, den Auftrag erneut versuchen oder die Warteschlange anhalten, " ++"abhängig vom Zustand des Attributs »error-policy«." ++ ++# type: TP ++#. type: TP ++#: backend.man:142 ++#, no-wrap ++msgid "2 (CUPS_BACKEND_AUTH_REQUIRED)" ++msgstr "2 (CUPS_BACKEND_AUTH_REQUIRED)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:149 ++msgid "" ++"The print file was not successfully transmitted because valid authentication " ++"information is required. The scheduler will respond to this by holding the " ++"job and adding the authentication-required job-reasons keyword." ++msgstr "" ++"Die Druckdatei wurde nicht erfolgreich übertragen, da gültige " ++"Authentifizierungsinformationen benötigt werden. Der Auftragsplaner wird " ++"darauf durch Halten des Auftrags reagieren und das Schlüsselwort " ++"»authentication-required job-reasons« hinzufügen." ++ ++# type: TP ++#. type: TP ++#: backend.man:150 ++#, no-wrap ++msgid "3 (CUPS_BACKEND_HOLD)" ++msgstr "3 (CUPS_BACKEND_HOLD)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:156 ++msgid "" ++"The print file was not successfully transmitted because it cannot be printed " ++"at this time. The scheduler will respond to this by holding the job." ++msgstr "" ++"Die Druckdatei wurde nicht erfolgreich übertragen, da sie derzeit nicht " ++"gedruckt werden kann. Der Auftragsplaner wird darauf durch Halten des " ++"Auftrags reagieren." ++ ++# type: TP ++#. type: TP ++#: backend.man:157 ++#, no-wrap ++msgid "4 (CUPS_BACKEND_STOP)" ++msgstr "4 (CUPS_BACKEND_STOP)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:163 ++msgid "" ++"The print file was not successfully transmitted because it cannot be printed " ++"at this time. The scheduler will respond to this by stopping the queue." ++msgstr "" ++"Die Druckdatei wurde nicht erfolgreich übertragen, da sie derzeit nicht " ++"gedruckt werden kann. Der Auftragsplaner wird durch Anhalten der " ++"Warteschlange darauf reagieren." ++ ++# type: TP ++#. type: TP ++#: backend.man:164 ++#, no-wrap ++msgid "5 (CUPS_BACKEND_CANCEL)" ++msgstr "5 (CUPS_BACKEND_CANCEL)" ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:170 ++msgid "" ++"The print file was not successfully transmitted because one or more " ++"attributes are not supported. The scheduler will respond to this by " ++"canceling the job." ++msgstr "" ++"Die Druckdatei wurde nicht erfolgreich übertragen, da eine oder mehrere der " ++"Attribute nicht unterstützt werden. Der Auftragsplaner wird durch Abbruch " ++"des Auftrages darauf reagieren." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:173 ++msgid "All other exit code values are reserved." ++msgstr "Alle anderen Exit-Codes sind reserviert." ++ ++# type: Plain text ++#. type: Plain text ++#: backend.man:176 ++msgid "I, I, I," ++msgstr "I, I, I," ++ ++# type: TH ++#. type: TH ++#: cancel.man:15 ++#, no-wrap ++msgid "cancel" ++msgstr "cancel" ++ ++# type: TH ++#. type: TH ++#: cancel.man:15 cupstestdsc.man:15 mime.convs.man:15 ++#, no-wrap ++msgid "20 March 2006" ++msgstr "20. März 2006" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:18 ++msgid "cancel - cancel jobs" ++msgstr "cancel - Aufträge abbrechen" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:33 ++msgid "" ++"B [ -E ] [ -U I ] [ -a ] [ -h I ] [ -u " ++"I ] [ I ] [ I ] [ I ]" ++msgstr "" ++"B [ -E ] [ -U I ] [ -a ] [ -h I ] [ -" ++"u I ] [ I ] [ I ] [ I ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:36 ++msgid "" ++"I cancels existing print jobs. The I<-a> option will remove all jobs " ++"from the specified destination." ++msgstr "" ++"I bricht alle existierenden Druckaufträge ab. Die Option I<-a> " ++"entfernt alle Druckaufträge von dem angegebenen Ziel." ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:38 ++msgid "The following options are recognized by I:" ++msgstr "Die folgenden Optionen werden von I erkannt:" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:46 lp.man:85 ++msgid "Specifies the username to use when connecting to the server." ++msgstr "" ++"Spezifiziert den Benutzernamen, der zur Kommunikation mit dem Server " ++"verwandt wird." ++ ++# type: TP ++#. type: TP ++#: cancel.man:46 cupsaddsmb.man.in:58 lpq.man:51 ++#, no-wrap ++msgid "-a" ++msgstr "-a" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:51 ++msgid "" ++"Cancel all jobs on the named destination, or all jobs on all destinations if " ++"none is provided." ++msgstr "" ++"Bricht alle Aufträge auf dem benannten Ziel (oder alle Aufträge auf allen " ++"Zielen, falls kein Ziel angegeben ist) ab." ++ ++# type: TP ++#. type: TP ++#: cancel.man:55 lp.man:130 ++#, no-wrap ++msgid "-u username" ++msgstr "-u Benutzername" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:59 ++msgid "Cancels jobs owned by I." ++msgstr "Bricht den Auftrag von I ab." ++ ++# type: SH ++#. type: SH ++#: cancel.man:63 ++#, no-wrap ++msgid "NOTES" ++msgstr "HINWEISE" ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:67 ++msgid "" ++"Administrators wishing to prevent unauthorized cancellation of jobs via the " ++"I<-u> option should require authentication for Cancel-Jobs operations in " ++"I." ++msgstr "" ++"Administratoren, die das unautorisierte Abbrechen von Aufträgen über die " ++"Option I<-u> verhindern möchten, sollten in I eine " ++"Authentifizierung für Abbruch-Operationen einstellen." ++ ++# type: Plain text ++#. type: Plain text ++#: cancel.man:69 ++msgid "I, I, I," ++msgstr "I, I, I," ++ ++# type: TH ++#. type: TH ++#: classes.conf.man:15 ++#, no-wrap ++msgid "classes.conf" ++msgstr "classes.conf" ++ ++# type: TH ++#. type: TH ++#: classes.conf.man:15 printers.conf.man:15 ++#, no-wrap ++msgid "29 April 2009" ++msgstr "29. April 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:18 ++msgid "classes.conf - class configuration file for cups" ++msgstr "classes.conf - Klassenkonfigurationsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:23 ++msgid "" ++"The I file defines the local printer classes that are " ++"available. It is normally located in the I directory and is " ++"generated automatically by the I program when printer classes are " ++"added or deleted." ++msgstr "" ++"Die Datei I definiert lokal-verfügbare Druckerklassen. Sie " ++"befindet sich normalerweise im Verzeichnis I und wird automatisch " ++"vom Programm I erstellt, wenn Druckerklassen hinzugefügt oder " ++"gelöscht werden." ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:26 mailto.conf.man:24 printers.conf.man:26 ++#: subscriptions.conf.man:26 ++msgid "" ++"Each line in the file can be a configuration directive, a blank line, or a " ++"comment. Comment lines start with the # character." ++msgstr "" ++"Jede Zeile in der Datei kann eine Konfigurationsdirektive, eine Leerzeile " ++"oder ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." ++ ++# type: SH ++#. type: SH ++#: classes.conf.man:26 client.conf.man.in:24 cupsd.conf.man.in:26 ++#: cups-snmp.conf.man:30 mailto.conf.man:24 printers.conf.man:26 ++#: subscriptions.conf.man:26 ++#, no-wrap ++msgid "DIRECTIVES" ++msgstr "DIREKTIVEN" ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:27 ++#, no-wrap ++msgid "EClass nameE ... E/ClassE" ++msgstr "EClass NameE ... E/ClassE" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:31 ++msgid "Defines a specific printer class." ++msgstr "Definiert eine spezielle Druckerklasse." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:31 ++#, no-wrap ++msgid "EDefaultClass nameE ... E/ClassE" ++msgstr "EDefaultClass NameE ... E/ClassE" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:35 ++msgid "Defines a default printer class." ++msgstr "Definiert eine Standard-Druckerklasse." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:35 printers.conf.man:35 ++#, no-wrap ++msgid "Accepting Yes" ++msgstr "Accepting Yes" ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:37 printers.conf.man:37 ++#, no-wrap ++msgid "Accepting No" ++msgstr "Accepting No" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:41 printers.conf.man:41 ++msgid "Specifies whether the printer is accepting new jobs." ++msgstr "Spezifiziert, ob der Drucker neue Aufträge akzeptiert." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:41 printers.conf.man:41 ++#, no-wrap ++msgid "AllowUser [ user @group ... ]" ++msgstr "AllowUser [ Benutzer @Gruppe ... ]" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:45 printers.conf.man:45 ++msgid "Allows specific users and groups to print to the printer." ++msgstr "Erlaubt speziellen Benutzern und Gruppen, auf dem Drucker zu drucken." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:45 printers.conf.man:45 ++#, no-wrap ++msgid "DenyUser [ user @group ... ]" ++msgstr "DenyUser [ Benutzer @Gruppe ... ]" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:49 printers.conf.man:49 ++msgid "Prevents specific users and groups from printing to the printer." ++msgstr "" ++"Verhindert, dass bestimmte Benutzer und Gruppen auf dem Drucker drucken." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:49 printers.conf.man:63 ++#, no-wrap ++msgid "Info text" ++msgstr "Info Text" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:53 printers.conf.man:67 ++msgid "Specifies human-readable text describing the printer." ++msgstr "Spezifiziert menschenlesbaren Text, der den Drucker beschreibt." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:53 printers.conf.man:67 ++#, no-wrap ++msgid "JobSheets banner banner" ++msgstr "JobSheets Banner Banner" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:57 printers.conf.man:71 ++msgid "Specifies the banner pages to use for the printer." ++msgstr "Spezifiziert die Deckblätter, die für den Drucker zu verwenden sind." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:57 printers.conf.man:71 ++#, no-wrap ++msgid "KLimit number" ++msgstr "KLimit Nummer" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:61 printers.conf.man:75 ++msgid "Specifies the job-k-limit value for the printer." ++msgstr "Spezifiziert den job-k-limit-Wert für den Drucker." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:61 printers.conf.man:75 ++#, no-wrap ++msgid "Location text" ++msgstr "Location text" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:65 printers.conf.man:79 ++msgid "Specifies human-readable text describing the location of the printer." ++msgstr "" ++"Spezifiziert menschenlesbaren Text, der den Standort des Druckers beschreibt." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:65 printers.conf.man:79 ++#, no-wrap ++msgid "OpPolicy name" ++msgstr "OpPolicy Name" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:69 printers.conf.man:83 ++msgid "Specifies the operation policy for the printer." ++msgstr "Spezifiziert die Betriebsrichtlinien für den Drucker." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:69 printers.conf.man:83 ++#, no-wrap ++msgid "PageLimit number" ++msgstr "PageLimit Zahl" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:73 printers.conf.man:87 ++msgid "Specifies the job-page-limit value for the printer." ++msgstr "Spezifiziert den job-page-limit-Wert für den Drucker." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:73 ++#, no-wrap ++msgid "Printer" ++msgstr "Drucker" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:77 ++msgid "Specifies a printer that is a member of the printer class." ++msgstr "Spezifiziert einen Drucker, der ein Mitglied der Druckerklasse ist." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:77 printers.conf.man:91 ++#, no-wrap ++msgid "QuotaPeriod seconds" ++msgstr "QuotaPeriod Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:81 printers.conf.man:95 ++msgid "Specifies the job-quota-period value for the printer." ++msgstr "Spezifiziert den job-quota-period-Wert für den Drucker." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:81 printers.conf.man:95 ++#, no-wrap ++msgid "Shared Yes" ++msgstr "Shared Yes" ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:83 printers.conf.man:97 ++#, no-wrap ++msgid "Shared No" ++msgstr "Shared No" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:87 printers.conf.man:101 ++msgid "Specifies whether the printer is shared." ++msgstr "Spezifiziert, ob der Drucker für andere freigegeben ist." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:87 printers.conf.man:101 ++#, no-wrap ++msgid "State idle" ++msgstr "State idle" ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:89 printers.conf.man:103 ++#, no-wrap ++msgid "State stopped" ++msgstr "State stopped" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:93 printers.conf.man:107 ++msgid "Specifies the initial state of the printer (Idle or Stopped)" ++msgstr "" ++"Spezifiziert den Anfangszustand des Druckers (Idle (im Leerlauf) oder " ++"Stopped (angehalten))" ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:93 printers.conf.man:107 ++#, no-wrap ++msgid "StateMessage text" ++msgstr "StateMessage Text" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:97 printers.conf.man:111 ++msgid "Specifies the message associated with the state." ++msgstr "Spezifiziert die einem Status zugeordnete Nachricht." ++ ++# type: TP ++#. type: TP ++#: classes.conf.man:97 printers.conf.man:111 ++#, no-wrap ++msgid "StateTime seconds" ++msgstr "StateTime Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:101 printers.conf.man:115 ++msgid "Specifies the date/time associated with the state." ++msgstr "Spezifiziert das mit einem Status assoziierte Datum/Uhrzeit." ++ ++# type: Plain text ++#. type: Plain text ++#: classes.conf.man:104 ++msgid "" ++"I, I, I, I, " ++"I," ++msgstr "" ++"I, I, I, I, " ++"I," ++ ++# type: TH ++#. type: TH ++#: client.conf.man.in:15 ++#, no-wrap ++msgid "client.conf" ++msgstr "client.conf" ++ ++# type: TH ++#. type: TH ++#: client.conf.man.in:15 ++#, no-wrap ++msgid "25 February 2006" ++msgstr "25. Februar 2006" ++ ++# type: Plain text ++#. type: Plain text ++#: client.conf.man.in:18 ++msgid "client.conf - client configuration file for cups" ++msgstr "client.conf - Clientkonfigurationsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: client.conf.man.in:24 ++msgid "" ++"The I file configures the CUPS client and is normally located " ++"in the I<@CUPS_SERVERROOT@> or I<~/.cups> directory. Each line in the file " ++"can be a configuration directive, a blank line, or a comment. Comment lines " ++"start with the # character." ++msgstr "" ++"Die Datei I konfiguriert den CUPS-Client und befindet sich " ++"normalerweise im Verzeichnis I<@CUPS_SERVERROOT@> oder I<~/.cups>. Jede " ++"Zeile in der Datei kann eine Konfigurationsdirektive, eine leere Zeile oder " ++"ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." ++ ++# type: Plain text ++#. type: Plain text ++#: client.conf.man.in:27 ++msgid "" ++"The following directives are understood by the client. Consult the on-line " ++"help for detailed descriptions:" ++msgstr "" ++"Die folgenden Direktiven werden vom Client verstanden. Schauen Sie in die " ++"Online-Hilfe für detailliertere Beschreibungen:" ++ ++# type: TP ++#. type: TP ++#: client.conf.man.in:27 cupsd.conf.man.in:315 ++#, no-wrap ++msgid "Encryption IfRequested" ++msgstr "Encryption IfRequested" ++ ++# type: TP ++#. type: TP ++#: client.conf.man.in:29 cupsd.conf.man.in:317 ++#, no-wrap ++msgid "Encryption Never" ++msgstr "Encryption Never" ++ ++# type: TP ++#. type: TP ++#: client.conf.man.in:31 cupsd.conf.man.in:319 ++#, no-wrap ++msgid "Encryption Required" ++msgstr "Encryption Required" ++ ++# type: Plain text ++#. type: Plain text ++#: client.conf.man.in:36 cupsd.conf.man.in:324 ++msgid "" ++"Specifies the level of encryption that is required for a particular location." ++msgstr "" ++"Spezifiziert die Verschlüsselungsstufe, die für einen bestimmten Ort " ++"benötigt wird." ++ ++# type: TP ++#. type: TP ++#: client.conf.man.in:36 ++#, no-wrap ++msgid "ServerName hostname-or-ip-address[:port]" ++msgstr "ServerName Hostname-oder-IP-Adresse[:Port]" ++ ++# type: TP ++#. type: TP ++#: client.conf.man.in:38 ++#, no-wrap ++msgid "ServerName /domain/socket" ++msgstr "ServerName /Domäne/Socket" ++ ++# type: Plain text ++#. type: Plain text ++#: client.conf.man.in:43 ++msgid "" ++"Specifies the address and optionally the port to use when connecting to the " ++"server" ++msgstr "" ++"Spezifiziert die Adresse und optional den Port, die bei der Verbindung zum " ++"Server verwandt werden sollen." ++ ++# type: TH ++#. type: TH ++#: cupsaddsmb.man.in:15 ++#, no-wrap ++msgid "cupsaddsmb" ++msgstr "cupsaddsmb" ++ ++# type: TH ++#. type: TH ++#: cupsaddsmb.man.in:15 ++#, no-wrap ++msgid "25 July 2007" ++msgstr "25. Juli 2007" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:18 ++msgid "cupsaddsmb - export printers to samba for windows clients" ++msgstr "cupsaddsmb - exportiere Drucker an Samba für Windows-Clients" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:28 ++msgid "" ++"B [ -H I ] [ -U I ] " ++"[ -h I ] [ -v ] -a" ++msgstr "" ++"B [ -H I ] [ -U I ] [ -h I ] [ -v ] -a" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:37 ++msgid "" ++"B [ -H I ] [ -U I ] " ++"[ -h I ] [ -v ] printer [ ... printer ]" ++msgstr "" ++"B [ -H I ] [ -U I ] [ -h I ] [ -v ] Drucker [ ... Drucker ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:44 ++msgid "" ++"I exports printers to the SAMBA software (version 2.2.0 or " ++"higher) for use with Windows clients. Depending on the SAMBA configuration, " ++"you may need to provide a password to export the printers. This program " ++"requires the Windows printer driver files described below." ++msgstr "" ++"I exportiert Drucker an die Samba-Software (Version 2.2.0 oder " ++"höher) zur Verwendung mit Windows-Clients. Abhängig von der Samba-" ++"Konfiguration müssen Sie ein Passwort bereitstellen, um die Drucker zu " ++"exportieren. Dieses Programm benötigt die im folgenden beschriebenen Windows-" ++"Treiberdateien." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:47 ++msgid "I supports the following options:" ++msgstr "I unterstützt die folgenden Optionen:" ++ ++# type: TP ++#. type: TP ++#: cupsaddsmb.man.in:47 ++#, no-wrap ++msgid "-H samba-server" ++msgstr "-H Samba-Server" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:51 ++msgid "Specifies the SAMBA server which defaults to the CUPS server." ++msgstr "" ++"Spezifiziert den Samba-Server, der standardmäßig auf den CUPS-Server gesetzt " ++"wird." ++ ++# type: TP ++#. type: TP ++#: cupsaddsmb.man.in:51 ++#, no-wrap ++msgid "-U samba-user[%samba-password]" ++msgstr "-U Samba-Benutzer[%Samba-Passwort]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:58 ++msgid "" ++"Specifies the SAMBA print admin username which defaults to your current " ++"username. If the username contains a percent (%) character, then the text " ++"following the percent is treated as the SAMBA password to use." ++msgstr "" ++"Spezifiziert den Benutzernamen des Samba-Druck-Administrators, standardmäßig " ++"Ihr aktueller Benutzername. Falls der Benutzername ein Prozentzeichen (%) " ++"enthält, wird der Text, der dem Prozentzeichen folgt, als zu verwendendes " ++"Samba-Passwort behandelt." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:63 ++msgid "" ++"Exports all known printers. Otherwise only the named printers are exported." ++msgstr "" ++"Exportiert alle bekannten Drucker. Andernfalls werden nur die benannten " ++"Drucker exportiert." ++ ++# type: TP ++#. type: TP ++#: cupsaddsmb.man.in:63 ++#, no-wrap ++msgid "-h cups-server[:port]" ++msgstr "-h CUPS-Server[:Port]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:67 ++msgid "Specifies a different CUPS server to use." ++msgstr "Spezifiziert einen anderen zu verwendenden CUPS-Server." ++ ++# type: TP ++#. type: TP ++#: cupsaddsmb.man.in:67 cupstestppd.man:105 ++#, no-wrap ++msgid "-v" ++msgstr "-v" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:72 ++msgid "" ++"Specifies that verbose information should be shown. This is useful for " ++"debugging SAMBA configuration problems." ++msgstr "" ++"Spezifiziert, dass ausführliche Informationen angezeigt werden sollen. Dies " ++"ist für die Fehlersuche bei Samba-Konfigurationsproblemen nützlich." ++ ++# type: SH ++#. type: SH ++#: cupsaddsmb.man.in:73 ++#, no-wrap ++msgid "SAMBA CONFIGURATION" ++msgstr "SAMBA-KONFIGURATION" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:80 ++msgid "" ++"I uses the new RPC-based printing support in SAMBA 2.2.x to " ++"provide printer drivers and PPD files to Windows client machines. In order " ++"to use this functionality, you must first configure the SAMBA I " ++"file to support printing through CUPS and provide a printer driver download " ++"share, as follows:" ++msgstr "" ++"I verwendet die neue, RPC-basierte Druck-Unterstützung in SAMBA " ++"2.2.x, um Windows-Clientmaschinen Druckertreiber und PPD-Dateien " ++"bereitzustellen. Um diese Funktionalität zu benutzen, müssen Sie erst die " ++"Datei I von SAMBA so konfigurieren, dass das Drucken via CUPS " ++"erfolgt, und eine Freigabe für den Druckertreiber bereitstellt. Diese " ++"Konfiguration sieht wie folgt aus:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:86 ++#, no-wrap ++msgid "" ++" [global]\n" ++"\tload printers = yes\n" ++"\tprinting = cups\n" ++"\tprintcap name = cups\n" ++msgstr "" ++" [global]\n" ++"\tload printers = yes\n" ++"\tprinting = cups\n" ++"\tprintcap name = cups\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:95 ++#, no-wrap ++msgid "" ++" [printers]\n" ++"\tcomment = All Printers\n" ++"\tpath = /var/spool/samba\n" ++"\tbrowseable = no\n" ++"\tpublic = yes\n" ++"\tguest ok = yes\n" ++"\twritable = no\n" ++"\tprintable = yes\n" ++msgstr "" ++" [printers]\n" ++"\tcomment = Alle Drucker\n" ++"\tpath = /var/spool/samba\n" ++"\tbrowseable = no\n" ++"\tpublic = yes\n" ++"\tguest ok = yes\n" ++"\twritable = no\n" ++"\tprintable = yes\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:103 ++#, no-wrap ++msgid "" ++" [print$]\n" ++"\tcomment = Printer Drivers\n" ++"\tpath = /etc/samba/drivers\n" ++"\tbrowseable = yes\n" ++"\tguest ok = no\n" ++"\tread only = yes\n" ++"\twrite list = root\n" ++msgstr "" ++" [print$]\n" ++"\tcomment = Druckertreiber\n" ++"\tpath = /etc/samba/drivers\n" ++"\tbrowseable = yes\n" ++"\tguest ok = no\n" ++"\tread only = yes\n" ++"\twrite list = root\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:108 ++msgid "" ++"This configuration assumes a FHS-compliant installation of SAMBA; adjust the " ++"[printers] and [print$] share paths accordingly on your system as needed." ++msgstr "" ++"In dieser Konfiguration wird eine FHS-gemäße Installation von SAMBA " ++"angenommen; passen Sie die [printers]- und [print$]-Freigabepfade gemäß der " ++"Notwendigkeiten Ihres Systems an." ++ ++# type: SH ++#. type: SH ++#: cupsaddsmb.man.in:109 ++#, no-wrap ++msgid "MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS" ++msgstr "MICROSOFT-POSTSCRIPT-TREIBER FÜR WINDOWS" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:117 ++msgid "" ++"The base driver for Windows 2000 and higher is the Microsoft PostScript " ++"driver, which is available on any system running Windows 2000 or higher in " ++"the %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 folder for 32-bit " ++"drivers and %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 folder for 64-" ++"bit drivers." ++msgstr "" ++"Der Basis-Treiber für Windows 2000 und höher ist der Microsoft PostScript-" ++"Treiber, der auf jedem System, das unter Windows 2000 oder höher läuft, im " ++"Ordner %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 für 32-bit-Treiber " ++"und im Ordner %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 für 64-bit-" ++"Treiber verfügbar ist." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:125 ++msgid "" ++"The CUPS printer driver is preferred over the Microsoft driver since it " ++"supports the page-label, job-billing, and job-hold-until options fully on " ++"all printers. However, currently only Windows 2000 and higher is supported " ++"by the Microsoft driver, so you will also need to get the Adobe driver to " ++"support Windows 95, 98, and Me clients. The Adobe and Microsoft drivers for " ++"Windows 2000 are identical." ++msgstr "" ++"Es wird empfohlen, den CUPS-Druckertreiber dem Microsoft-Treiber " ++"vorzuziehen, da er auf allen Druckern die Optionen page-label, job-billing " ++"und job-hold-until komplett unterstützt. Von den Microsoft-Treibern wird " ++"allerdings nur Windows 2000 und höher unterstützt, daher müssen Sie sich die " ++"Adobe-Treiber besorgen, um Windows 95-, 98- und Me-Clients zu unterstützen. " ++"Die Adobe- und Microsoft-Treiber für Windows 2000 sind identisch." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:130 cupsaddsmb.man.in:159 ++msgid "" ++"Once you have extracted the driver files, copy the 32-bit drivers to the " ++"I<@CUPS_DATADIR@/drivers> directory and the 64-bit drivers to the " ++"I<@CUPS_DATADIR@/drivers/x64> directory exactly as named below:" ++msgstr "" ++"Nachdem Sie die Treiberdatei extrahiert haben, kopieren Sie die 32-Bit-" ++"Treiber in das Verzeichnis I<@CUPS_DATADIR@/drivers> und die 64-Bit-Treiber " ++"in das Verzeichnis I<@CUPS_DATADIR@/drivers/x64>, genau wie unten benannt:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:137 ++#, no-wrap ++msgid "" ++" [Windows 2000 and higher]\n" ++" ps5ui.dll\n" ++" pscript.hlp\n" ++" pscript.ntf\n" ++" pscript5.dll\n" ++msgstr "" ++" [Windows 2000 und höher]\n" ++" ps5ui.dll\n" ++" pscript.hlp\n" ++" pscript.ntf\n" ++" pscript5.dll\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:142 cupsaddsmb.man.in:175 ++msgid "" ++"B Unlike Windows, case is significant - make sure that you use the " ++"lowercase filenames shown above, otherwise I will fail to export " ++"the drivers." ++msgstr "" ++"B Anders als unter Windows ist die Groß-/Kleinschreibung relevant. " ++"Stellen Sie sicher, dass Sie die Dateinamen wie oben klein schreiben, " ++"andernfalls kann I die Treiber nicht exportieren." ++ ++# type: SH ++#. type: SH ++#: cupsaddsmb.man.in:143 ++#, no-wrap ++msgid "CUPS POSTSCRIPT DRIVERS FOR WINDOWS" ++msgstr "CUPS POSTSCRIPT-TREIBER FÜR WINDOWS" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:147 ++msgid "" ++"I can use the CUPS v6 PostScript printer driver for Windows, " ++"which is available for download from the CUPS web site." ++msgstr "" ++"I kann den CUPS-v6-PostScript-Druckertreiber für Windows " ++"verwenden. Dieser ist von der Website von CUPS zum Download erhältlich." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:154 ++msgid "" ++"The CUPS printer driver is preferred over the Adobe and Microsoft drivers " ++"since it supports the page-label, job-billing, and job-hold-until options " ++"fully on all printers. However, currently only Windows 2000 and higher is " ++"supported by the CUPS driver, so you will also need to get the Adobe driver " ++"to support Windows 95, 98, and Me clients." ++msgstr "" ++"Es wird empfohlen, den CUPS-Druckertreiber den Adobe- und Microsoft-Treibern " ++"vorzuziehen, da er auf allen Druckern die Optionen page-label, job-billing " ++"und job-hold-until komplett unterstützt. Von den CUPS-Treibern wird " ++"allerdings nur Windows 2000 und höher unterstützt, daher müssen Sie sich " ++"auch die Adobe-Treiber besorgen, um Windows 95-, 98- und Me-Clients zu " ++"unterstützen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:170 ++#, no-wrap ++msgid "" ++" [Windows 2000 and higher]\n" ++" cups6.inf (from www.cups.org)\n" ++" cups6.ini (from www.cups.org)\n" ++" cupsps6.dll (from www.cups.org)\n" ++" cupsui6.dll (from www.cups.org)\n" ++" ps5ui.dll (from your Windows system)\n" ++" pscript.hlp (from your Windows system)\n" ++" pscript.ntf (from your Windows system)\n" ++" pscript5.dll (from your Windows system)\n" ++msgstr "" ++" [Windows 2000 und höher]\n" ++" cups6.inf (von www.cups.org)\n" ++" cups6.ini (von www.cups.org)\n" ++" cupsps6.dll (von www.cups.org)\n" ++" cupsui6.dll (von www.cups.org)\n" ++" ps5ui.dll (aus Ihrem Windows-System)\n" ++" pscript.hlp (aus Ihrem Windows-System)\n" ++" pscript.ntf (aus Ihrem Windows-System)\n" ++" pscript5.dll (aus Ihrem Windows-System)\n" ++ ++# type: SH ++#. type: SH ++#: cupsaddsmb.man.in:176 ++#, no-wrap ++msgid "ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME" ++msgstr "ADOBE POSTSCRIPT-TREIBER FÜR WINDOWS 95, 98 UND ME" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:180 ++msgid "" ++"I can use the Adobe PostScript printer driver for Windows 95, " ++"98, and ME, which are available for download from the Adobe web site (http://" ++"www.adobe.com)." ++msgstr "" ++"I kann die Adobe-PostScript-Druckertreiber für Windows 95, 98 " ++"und ME verwenden, die von der Adobe-Website (http://www.adobe.com) " ++"heruntergeladen werden können." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:183 ++msgid "" ++"The Adobe driver does not support the page-label, job-billing, or job-hold-" ++"until options." ++msgstr "" ++"Der Adobe-Treiber unterstützt die Optionen page-label, job-billing oder job-" ++"hold-until nicht." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:187 ++msgid "" ++"Once you have installed the driver on a Windows system, copy the following " ++"files to the I<@CUPS_DATADIR@/drivers> directory exactly as named below:" ++msgstr "" ++"Sobald Sie die Treiber auf einem Windows-System installiert haben, kopieren " ++"Sie die folgenden Dateien in das Verzeichnis I<@CUPS_DATADIR@/drivers> exakt " ++"mit dem unten angegebenen Namen:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:195 ++#, no-wrap ++msgid "" ++" [Windows 95, 98, and Me]\n" ++" ADFONTS.MFM\n" ++" ADOBEPS4.DRV\n" ++" ADOBEPS4.HLP\n" ++" ICONLIB.DLL\n" ++" PSMON.DLL\n" ++msgstr "" ++" [Windows 95, 98 und Me]\n" ++" ADFONTS.MFM\n" ++" ADOBEPS4.DRV\n" ++" ADOBEPS4.HLP\n" ++" ICONLIB.DLL\n" ++" PSMON.DLL\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:200 ++msgid "" ++"B Unlike Windows, case is significant - make sure that you use the " ++"UPPERCASE filenames shown above, otherwise I will fail to export " ++"the drivers." ++msgstr "" ++"B Anders als unter Windows ist die Groß-/Kleinschreibung relevant. " ++"Stellen Sie sicher, dass Sie die Dateinamen wie oben GROSS schreiben, " ++"andernfalls kann I die Treiber nicht exportieren." ++ ++# type: SH ++#. type: SH ++#: cupsaddsmb.man.in:201 cupsfilter.man:75 ++#, no-wrap ++msgid "KNOWN ISSUES" ++msgstr "BEKANNTE PROBLEME" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:203 ++msgid "Getting the full set of Windows driver files should be easier." ++msgstr "" ++"Es sollte leichter sein, den kompletten Windows-Treibersatz zu bekommen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:207 ++msgid "I, I, http://localhost:631/help" ++msgstr "I, I, http://localhost:631/help" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsaddsmb.man.in:209 ++msgid "http://www.cups.org/windows/" ++msgstr "http://www.cups.org/windows/" ++ ++# type: TH ++#. type: TH ++#: cups-config.man:15 ++#, no-wrap ++msgid "cups-config" ++msgstr "cups-config" ++ ++# type: TH ++#. type: TH ++#: cups-config.man:15 ++#, no-wrap ++msgid "23 October 2008" ++msgstr "23. Oktober 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:18 ++msgid "cups-config - get cups api, compiler, directory, and link information." ++msgstr "" ++"cups-config - ermittelt CUPS-API-, -Compiler-, -Verzeichnis- und -Link-" ++"Informationen." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:21 ++msgid "B --api-version" ++msgstr "B --api-version" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:24 ++msgid "B --build" ++msgstr "B --build" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:27 ++msgid "B --cflags" ++msgstr "B --cflags" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:30 ++msgid "B --datadir" ++msgstr "B --datadir" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:33 ++msgid "B --help" ++msgstr "B --help" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:36 ++msgid "B --ldflags" ++msgstr "B --ldflags" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:43 ++msgid "B [ I<--image> ] [ I<--static> ] --libs" ++msgstr "B [ I<--image> ] [ I<--static> ] --libs" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:46 ++msgid "B --serverbin" ++msgstr "B --serverbin" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:49 ++msgid "B --serverroot" ++msgstr "B --serverroot" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:52 ++msgid "B --version" ++msgstr "B --version" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:58 ++msgid "" ++"B is the CUPS program configuration utility. It should be used " ++"by application developers to determine the necessary command-line options " ++"for the compiler and linker, as well as determining installation directories " ++"for filters, configuration files, and drivers." ++msgstr "" ++"B ist das Konfigurations-Hilfswerkzeug des Cups-Programms. Es " ++"sollte von Anwendungsentwicklern verwandt werden, um die notwendigen " ++"Befehlszeilen-Optionen für den Compiler und Linker zu bestimmen, sowie die " ++"Installationsverzeichnisse für Filter, Konfigurationsdateien und Treiber zu " ++"ermitteln." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:59 ++#, no-wrap ++msgid "--api-version" ++msgstr "--api-version" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:63 ++msgid "Displays the current API version (major.minor)." ++msgstr "Zeigt die aktuelle API-Version (Hauptversion.Unterversion) an." ++ ++#. type: TP ++#: cups-config.man:63 ++#, no-wrap ++msgid "--build" ++msgstr "--build" ++ ++#. type: Plain text ++#: cups-config.man:67 ++msgid "Displays a system-specific build number." ++msgstr "Zeigt eine systemabhängige Build-Nummer." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:67 ++#, no-wrap ++msgid "--cflags" ++msgstr "--cflags" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:71 ++msgid "Displays the necessary compiler options." ++msgstr "Zeigt die notwendigen Compiler-Optionen an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:71 ++#, no-wrap ++msgid "--datadir" ++msgstr "--datadir" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:75 ++msgid "Displays the default CUPS data directory." ++msgstr "Zeigt das Standard-CUPS-Datenverzeichnis an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:75 ++#, no-wrap ++msgid "--help" ++msgstr "--help" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:79 ++msgid "Displays the program usage message." ++msgstr "Zeigt die Programm-Verwendungshinweise an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:79 ++#, no-wrap ++msgid "--image" ++msgstr "--image" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:84 ++msgid "" ++"When used with I<--libs>, adds the CUPS imaging library to the list of " ++"displayed libraries." ++msgstr "" ++"Wird dies mit I<--libs> verwandt, wird die CUPS Imaging-Bibliothek zu der " ++"Liste der angezeigten Bibliotheken hinzugefügt." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:84 ++#, no-wrap ++msgid "--ldflags" ++msgstr "--ldflags" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:88 ++msgid "Displays the necessary linker options." ++msgstr "Zeigt die notwendigen Linker-Optionen an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:88 ++#, no-wrap ++msgid "--libs" ++msgstr "--libs" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:92 ++msgid "Displays the necessary librarys to link to." ++msgstr "Zeigt die zum Linken notwendigen Bibliotheken an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:92 ++#, no-wrap ++msgid "--serverbin" ++msgstr "--serverbin" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:97 ++msgid "" ++"Displays the default CUPS binary directory, where filters and backends are " ++"stored." ++msgstr "" ++"Zeigt das Standard-CUPS-Verzeichnis an, in dem Filter und Backends " ++"gespeichert werden." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:97 ++#, no-wrap ++msgid "--serverroot" ++msgstr "--serverroot" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:101 ++msgid "Displays the default CUPS configuration file directory." ++msgstr "Zeigt das Standard-CUPS-Konfigurationsverzeichnis an." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:101 ++#, no-wrap ++msgid "--static" ++msgstr "--static" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:106 ++msgid "" ++"When used with I<--libs>, shows the static libraries instead of the default " ++"(shared) libraries." ++msgstr "" ++"Zeigt die statischen Bibliotheken an, statt der Standard (Laufzeit-)" ++"Bibliotheken, wenn mit I<--libs> verwandt." ++ ++# type: TP ++#. type: TP ++#: cups-config.man:106 ++#, no-wrap ++msgid "--version" ++msgstr "--version" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-config.man:111 ++msgid "" ++"Displays the full version number of the CUPS installation (major.minor." ++"patch)." ++msgstr "" ++"Zeigt die vollständige Versionsnummer der CUPS-Installation an (Hauptversion." ++"Unterversion.Patch)." ++ ++# type: TH ++#. type: TH ++#: cupsctl.man:15 ++#, no-wrap ++msgid "cupsctl" ++msgstr "cupsctl" ++ ++# type: TH ++#. type: TH ++#: cupsctl.man:15 ++#, no-wrap ++msgid "5 July 2007" ++msgstr "5. Juli 2007" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:18 ++msgid "cupsctl - configure cupsd.conf options" ++msgstr "cupsctl - konfiguriere cupsd.conf-Optionen" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:29 ++msgid "" ++"B [ -E ] [-U I ] [ -h I ] [ --[no-]debug-" ++"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" ++"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " ++"[ I ]" ++msgstr "" ++"B [ -E ] [-U I ] [ -h I ] [ --[no-]debug-" ++"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" ++"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " ++"[ I ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:33 ++msgid "" ++"I updates or queries the B file for a server. When no " ++"changes are requested, the current configuration values are written to the " ++"standard output in the format \"name=value\", one per line." ++msgstr "" ++"I aktualisiert die Datei B oder ermittelt aus ihr einen " ++"Server. Falls keine Änderungen erbeten wurden, werden die aktuellen " ++"Konfigurationsoptionen, jeweils eine pro Zeile, im Format »Name=Wert« auf " ++"die Standardausgabe geschrieben." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:35 ++msgid "The following options are recognized:" ++msgstr "Die folgenden Optionen werden erkannt:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:39 ++msgid "Enables encryption on the connection to the scheduler." ++msgstr "" ++"Aktiviert Verschlüsselung bei der Verbindung mit dem Auftragsplaner " ++"(Scheduler)." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:39 ++#, no-wrap ++msgid "-U I" ++msgstr "-U I" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:43 ++msgid "" ++"Specifies an alternate username to use when authenticating with the " ++"scheduler." ++msgstr "" ++"Spezifiziert einen alternativen Benutzernamen, der bei Authentifizierung mit " ++"dem Auftragsplaner verwandt werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:43 ++#, no-wrap ++msgid "-h I" ++msgstr "-h I" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:47 ++msgid "Specifies the server address." ++msgstr "Spezifiziert die Server-Adresse." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:47 ++#, no-wrap ++msgid "--[no-]debug-logging" ++msgstr "--[no-]debug-logging" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:51 ++msgid "Enables or disables debug logging in the B file." ++msgstr "" ++"Aktiviert oder deaktiviert das Protokollieren von Fehlersuchemeldungen in " ++"der Datei B." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:51 ++#, no-wrap ++msgid "--[no-]remote-admin" ++msgstr "--[no-]remote-admin" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:55 ++msgid "Enables or disables remote administration." ++msgstr "Aktiviert oder deaktiviert Administration aus der Ferne." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:55 ++#, no-wrap ++msgid "--[no-]remote-any" ++msgstr "--[no-]remote-any" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:59 ++msgid "Enables or disables printing from any address, e.g. the Internet." ++msgstr "" ++"Aktiviert oder deaktiviert Drucken von beliebigen Adressen, z.B. aus dem " ++"Internet." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:59 ++#, no-wrap ++msgid "--[no-]remote-printers" ++msgstr "--[no-]remote-printers" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:64 ++msgid "" ++"Enables or disables the display of remote printers shared via the CUPS, " ++"LDAP, or SLP protocols." ++msgstr "" ++"Aktiviert oder deaktiviert die Anzeige von Druckern in der Ferne, die über " ++"die Protokolle CUPS, LDAP oder SLP freigegeben sind." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:64 ++#, no-wrap ++msgid "--[no-]share-printers" ++msgstr "--[no-]share-printers" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:68 ++msgid "Enables or disables sharing of local printers with other computers." ++msgstr "" ++"Aktiviert oder deaktiviert das gemeinsame Benutzen lokaler Drucker mit " ++"anderen Computern." ++ ++# type: TP ++#. type: TP ++#: cupsctl.man:68 ++#, no-wrap ++msgid "--[no-]user-cancel-any" ++msgstr "--[no-]user-cancel-any" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:72 ++msgid "Allows or prevents users from canceling jobs owned by others." ++msgstr "" ++"Ermöglicht Benutzern oder hindert sie daran, Aufträge anderer Benutzer " ++"abzubrechen." ++ ++# type: SH ++#. type: SH ++#: cupsctl.man:72 cupstestppd.man:137 lp.man:229 ++#, no-wrap ++msgid "EXAMPLES" ++msgstr "BEISPIELE" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:74 ++msgid "Display the current settings:" ++msgstr "Zeige die aktuellen Einstellungen an:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:76 ++#, no-wrap ++msgid " cupsctl\n" ++msgstr " cupsctl\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:79 ++msgid "Enable debug logging:" ++msgstr "Aktiviert Fehlersucheprotokollierung:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:81 ++#, no-wrap ++msgid " cupsctl --debug-logging\n" ++msgstr " cupsctl --debug-logging\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:84 ++msgid "Get the current debug logging state:" ++msgstr "Den aktuellen Fehlersucheprotokollierzustand abfragen:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:86 ++#, no-wrap ++msgid " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" ++msgstr " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:89 ++msgid "Disable printer sharing:" ++msgstr "Deaktiviere Druckerfreigabe:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:91 ++#, no-wrap ++msgid " cupsctl --no-shared-printers\n" ++msgstr " cupsctl --no-shared-printers\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:94 ++msgid "Enable printing using the file: pseudo-device:" ++msgstr "Aktiviere Druckerfreigabe unter Verwendung des file:-Pseudogeräts:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:96 ++#, no-wrap ++msgid " cupsctl FileDevice=Yes\n" ++msgstr " cupsctl FileDevice=Yes\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsctl.man:99 ++msgid "I, I," ++msgstr "I, I," ++ ++# type: TH ++#. type: TH ++#: cupsd.conf.man.in:15 ++#, no-wrap ++msgid "cupsd.conf" ++msgstr "cupsd.conf" ++ ++# type: TH ++#. type: TH ++#: cupsd.conf.man.in:15 ++#, no-wrap ++msgid "28 January 2010" ++msgstr "28. Januar 2010" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:18 ++msgid "cupsd.conf - server configuration file for cups" ++msgstr "cupsd.conf - Server-Konfigurationsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:21 ++msgid "" ++"The I file configures the CUPS scheduler, I. It is " ++"normally located in the I<@CUPS_SERVERROOT@> directory." ++msgstr "" ++"Die Datei I konfiguriert den CUPS-Auftragsplaner (Scheduler), " ++"I. Sie befindet sich normalerweise im Verzeichnis " ++"I<@CUPS_SERVERROOT@>." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:26 ++msgid "" ++"Each line in the file can be a configuration directive, a blank line, or a " ++"comment. Comment lines start with the # character. The configuration " ++"directives are intentionally similar to those used by the popular Apache web " ++"server software and are described below." ++msgstr "" ++"Jede Zeile in der Datei kann eine Konfigurationsdirektive, eine leere Zeile " ++"oder ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«. Die " ++"Konfigurationsdirektiven sind bewusst ähnlich zu denen des beliebten Apache-" ++"Webservers gehalten und werden unten beschrieben." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:29 ++msgid "" ++"The following directives are understood by I. Consult the on-line " ++"help for detailed descriptions:" ++msgstr "" ++"Die folgenden Direktiven werden von I verstanden. Schauen Sie in " ++"die Online-Hilfe für eine detailliertere Beschreibung:" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:29 ++#, no-wrap ++msgid "AccessLog filename" ++msgstr "AccessLog Dateiname" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:31 ++#, no-wrap ++msgid "AccessLog syslog" ++msgstr "AccessLog syslog" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:35 ++msgid "Defines the access log filename." ++msgstr "Definiert den Namen der Zugriffsprotokolldatei." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:35 ++#, no-wrap ++msgid "AccessLogLevel config" ++msgstr "AccessLogLevel config" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:37 ++#, no-wrap ++msgid "AccessLogLevel actions" ++msgstr "AccessLogLevel actions" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:39 ++#, no-wrap ++msgid "AccessLogLevel all" ++msgstr "AccessLogLevel all" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:43 ++msgid "Specifies the logging level for the AccessLog file." ++msgstr "Spezifiziert die Protokollierungsstufe für die AccessLog-Datei." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:43 ++#, no-wrap ++msgid "Allow all" ++msgstr "Allow all" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:45 ++#, no-wrap ++msgid "Allow none" ++msgstr "Allow none" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:47 ++#, no-wrap ++msgid "Allow host.domain.com" ++msgstr "Allow host.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:49 ++#, no-wrap ++msgid "Allow *.domain.com" ++msgstr "Allow *.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:51 ++#, no-wrap ++msgid "Allow ip-address" ++msgstr "Allow IP-Adresse" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:53 ++#, no-wrap ++msgid "Allow ip-address/netmask" ++msgstr "Allow IP-Adresse/Netzmaske" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:55 ++#, no-wrap ++msgid "Allow ip-address/mm" ++msgstr "Allow IP-Adresse/mm" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:57 ++#, no-wrap ++msgid "Allow @IF(name)" ++msgstr "Allow @IF(Name)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:59 ++#, no-wrap ++msgid "Allow @LOCAL" ++msgstr "Allow @LOCAL" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:63 ++msgid "Allows access from the named hosts or addresses." ++msgstr "Erlaubt Zugriff von den benannten Rechnern oder Adressen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:63 ++#, no-wrap ++msgid "AuthClass User" ++msgstr "AuthClass User" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:65 ++#, no-wrap ++msgid "AuthClass Group" ++msgstr "AuthClass Group" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:67 ++#, no-wrap ++msgid "AuthClass System" ++msgstr "AuthClass System" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:72 ++msgid "" ++"Specifies the authentication class (User, Group, System) - B." ++msgstr "" ++"Spezifiziert die Authentifizierungsklasse (Benutzer, Gruppe, System) - " ++"B." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:72 ++#, no-wrap ++msgid "AuthGroupName group-name" ++msgstr "AuthGroupName Gruppenname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:77 ++msgid "Specifies the authentication group - B." ++msgstr "" ++"Spezifiziert die Authentifizierungsgruppe - B." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:77 ++#, no-wrap ++msgid "AuthType None" ++msgstr "AuthType None" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:79 ++#, no-wrap ++msgid "AuthType Basic" ++msgstr "AuthType Basic" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:81 ++#, no-wrap ++msgid "AuthType BasicDigest" ++msgstr "AuthType BasicDigest" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:83 ++#, no-wrap ++msgid "AuthType Digest" ++msgstr "AuthType Digest" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:85 ++#, no-wrap ++msgid "AuthType Negotiate" ++msgstr "AuthType Negotiate" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:89 ++msgid "" ++"Specifies the authentication type (None, Basic, BasicDigest, Digest, " ++"Negotiate)" ++msgstr "" ++"Spezifiziert den Authentifizierungstyp (None, Basic, BasicDigest, Digest, " ++"Negotiate)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:89 ++#, no-wrap ++msgid "AutoPurgeJobs Yes" ++msgstr "AutoPurgeJobs Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:91 ++#, no-wrap ++msgid "AutoPurgeJobs No" ++msgstr "AutoPurgeJobs No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:96 ++msgid "" ++"Specifies whether to purge job history data automatically when it is no " ++"longer required for quotas." ++msgstr "" ++"Spezifiziert, ob die Verlaufsdaten des Auftrags automatisch bereinigt " ++"(gelöscht) werden sollen, wenn sie nicht mehr für Quotas benötigt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:96 ++#, no-wrap ++msgid "BrowseAddress ip-address" ++msgstr "BrowseAddress IP-Adresse" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:98 ++#, no-wrap ++msgid "BrowseAddress @IF(name)" ++msgstr "BrowseAddress @IF(Name)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:100 ++#, no-wrap ++msgid "BrowseAddress @LOCAL" ++msgstr "BrowseAddress @LOCAL" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:104 ++msgid "Specifies a broadcast address for outgoing printer information packets." ++msgstr "" ++"Spezifiziert eine Broadcast-Adresse für ausgehende Druckerinformationspakete." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:104 ++#, no-wrap ++msgid "BrowseAllow all" ++msgstr "BrowseAllow all" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:106 ++#, no-wrap ++msgid "BrowseAllow none" ++msgstr "BrowseAllow none" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:108 ++#, no-wrap ++msgid "BrowseAllow host.domain.com" ++msgstr "BrowseAllow host.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:110 ++#, no-wrap ++msgid "BrowseAllow *.domain.com" ++msgstr "BrowseAllow *.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:112 ++#, no-wrap ++msgid "BrowseAllow ip-address" ++msgstr "BrowseAllow IP-Adresse" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:114 ++#, no-wrap ++msgid "BrowseAllow ip-address/netmask" ++msgstr "BrowseAllow IP-Adresse/Netzmaske" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:116 ++#, no-wrap ++msgid "BrowseAllow ip-address/mm" ++msgstr "BrowseAllow IP-Adresse/mm" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:118 ++#, no-wrap ++msgid "BrowseAllow @IF(name)" ++msgstr "BrowseAllow @IF(Name)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:120 ++#, no-wrap ++msgid "BrowseAllow @LOCAL" ++msgstr "BrowseAllow @LOCAL" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:124 ++msgid "" ++"Allows incoming printer information packets from the named host or address." ++msgstr "" ++"Erlaubt eingehende Druckerinformationspakete von den benannten Rechnern oder " ++"Adressen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:124 ++#, no-wrap ++msgid "BrowseDeny all" ++msgstr "BrowseDeny all" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:126 ++#, no-wrap ++msgid "BrowseDeny none" ++msgstr "BrowseDeny none" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:128 ++#, no-wrap ++msgid "BrowseDeny host.domain.com" ++msgstr "BrowseDeny host.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:130 ++#, no-wrap ++msgid "BrowseDeny *.domain.com" ++msgstr "BrowseDeny *.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:132 ++#, no-wrap ++msgid "BrowseDeny ip-address" ++msgstr "BrowseDeny IP-Adresse" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:134 ++#, no-wrap ++msgid "BrowseDeny ip-address/netmask" ++msgstr "BrowseDeny IP-Adresse/Netzmaske" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:136 ++#, no-wrap ++msgid "BrowseDeny ip-address/mm" ++msgstr "BrowseDeny IP-Adresse/mm" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:138 ++#, no-wrap ++msgid "BrowseDeny @IF(name)" ++msgstr "BrowseDeny @IF(Name)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:140 ++#, no-wrap ++msgid "BrowseDeny @LOCAL" ++msgstr "BrowseDeny @LOCAL" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:144 ++msgid "" ++"Denies incoming printer information packets from the named host or address." ++msgstr "" ++"Verbietet eingehende Druckerinformationspakete von den benannten Rechnern " ++"oder Adressen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:144 ++#, no-wrap ++msgid "BrowseInterval seconds" ++msgstr "BrowseInterval Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:148 ++msgid "Specifies the maximum interval between printer information broadcasts." ++msgstr "" ++"Gibt das maximale Intervall zwischen Druckerinformationsübertragungen an." ++ ++#. type: TP ++#: cupsd.conf.man.in:148 ++#, no-wrap ++msgid "BrowseLDAPBindDN" ++msgstr "BrowseLDAPBindDN" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:152 ++msgid "Specifies the LDAP domain name to use when registering printers." ++msgstr "" ++"Gibt den LDAP-Domänenname an, der zum Registrieren von Druckern benutzt wird." ++ ++#. type: TP ++#: cupsd.conf.man.in:152 ++#, no-wrap ++msgid "BrowseLDAPCACertFile" ++msgstr "BrowseLDAPCACertFile" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:156 ++msgid "Specifies the SSL certificate authority file to use." ++msgstr "Gibt die SSL-Zertifizierungsautorität an, die benutzt werden soll." ++ ++#. type: TP ++#: cupsd.conf.man.in:156 ++#, no-wrap ++msgid "BrowseLDAPDN" ++msgstr "BrowseLDAPDN" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:160 ++msgid "Specifies the LDAP domain name to use when discovering printers." ++msgstr "Spezifiziert die LDAP-Domäne, die benutzt wird, um Drucker zu suchen." ++ ++#. type: TP ++#: cupsd.conf.man.in:160 ++#, no-wrap ++msgid "BrowseLDAPPassword" ++msgstr "BrowseLDAPPassword" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:164 ++msgid "Specifies the password to use when accessing the LDAP server." ++msgstr "" ++"Gibt das Passwort an, das zum Zugriff auf den LDAP-Server benutzt werden " ++"soll." ++ ++#. type: TP ++#: cupsd.conf.man.in:164 ++#, no-wrap ++msgid "BrowseLDAPServer" ++msgstr "BrowseLDAPServer" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:168 ++msgid "Specifies the LDAP server to use." ++msgstr "Spezifiziert den zu verwendenden LDAP-Server." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:168 ++#, no-wrap ++msgid "BrowseOrder allow,deny" ++msgstr "BrowseOrder allow,deny" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:170 ++#, no-wrap ++msgid "BrowseOrder deny,allow" ++msgstr "BrowseOrder deny,allow" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:174 ++msgid "" ++"Specifies the order of printer information access control (allow,deny or " ++"deny,allow)" ++msgstr "" ++"Spezifiziert die Reihenfolge der Druckerinformations-Zugriffssteuerung " ++"(allow,deny (erlauben,verbieten) oder andersherum)." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:174 ++#, no-wrap ++msgid "BrowsePoll host-or-ip-address" ++msgstr "BrowsePoll Rechner-oder-IP-Adresse" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:178 ++msgid "Specifies a server to poll for printer information." ++msgstr "" ++"Spezifiziert den Server, der nach Druckerinformationen befragt werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:178 ++#, no-wrap ++msgid "BrowsePort port" ++msgstr "BrowsePort port" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:182 ++msgid "Specifies the port to listen to for printer information packets." ++msgstr "" ++"Spezifiziert den Port, an dem auf Druckerinformationspakete gewartet werden " ++"soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:182 ++#, no-wrap ++msgid "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:186 ++msgid "Specifies the protocols to use for printer browsing." ++msgstr "" ++"Spezifiziert die für das Durchsuchen der Drucker zu verwendenden Protokolle." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:186 ++#, no-wrap ++msgid "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:190 ++msgid "Specifies the protocols to use for local printer browsing." ++msgstr "" ++"Spezifiziert die für das Durchsuchen der lokalen Drucker zu verwendenden " ++"Protokolle." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:190 ++#, no-wrap ++msgid "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:194 ++msgid "Specifies the protocols to use for remote printer browsing." ++msgstr "" ++"Spezifiziert die für das Durchsuchen der nicht-lokalen Drucker zu " ++"verwendende Protokolle." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:194 ++#, no-wrap ++msgid "BrowseRelay from-address to-address" ++msgstr "BrowseRelay von-Adresse zu-Adresse" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:199 ++msgid "" ++"Specifies that printer information packets should be relayed from one host " ++"or network to another." ++msgstr "" ++"Spezifiziert, dass Druckerinformationspakete von einem Rechner oder Netz zu " ++"einem anderen weitergeleitet werden sollen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:199 ++#, no-wrap ++msgid "BrowseShortNames Yes" ++msgstr "BrowseShortNames Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:201 ++#, no-wrap ++msgid "BrowseShortNames No" ++msgstr "BrowseShortNames No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:207 ++msgid "" ++"Specifies whether remote printers will use short names (\"printer\") or not " ++"(\"printer@server\"). This option is ignored if more than one remote printer " ++"exists with the same name." ++msgstr "" ++"Spezifiziert, ob nicht-lokale Drucker kurze Namen verwenden (»Drucker«) oder " ++"nicht (»Drucker@Server«). Diese Option wird ignoriert, falls es mehr als " ++"einen nicht-lokalen Drucker mit dem gleichen Namen gibt." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:207 ++#, no-wrap ++msgid "BrowseTimeout seconds" ++msgstr "BrowseTimeout Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:212 ++msgid "" ++"Specifies the maximum interval between printer information updates before " ++"remote printers will be removed from the list of available printers." ++msgstr "" ++"Spezifiziert das maximale Intervall zwischen " ++"Druckerinformationsaktualisierungen, bevor Drucker in der Ferne aus der " ++"Liste der verfügbaren Drucker entfernt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:212 ++#, no-wrap ++msgid "BrowseWebIF Yes" ++msgstr "BrowseWebIF Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:214 ++#, no-wrap ++msgid "BrowseWebIF No" ++msgstr "BrowseWebIF No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:218 ++msgid "Specifies whether the CUPS web interface is advertised via DNS-SD." ++msgstr "Gibt an, ob die CUPS-Web-Schnittstelle über DNS-SD angekündigt wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:218 ++#, no-wrap ++msgid "Browsing Yes" ++msgstr "Browsing Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:220 ++#, no-wrap ++msgid "Browsing No" ++msgstr "Browsing No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:224 ++msgid "Specifies whether or not remote printer browsing should be enabled." ++msgstr "" ++"Spezifiziert, ob das Durchsuchen von Druckern in der Ferne aktiviert werden " ++"soll oder nicht." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:224 ++#, no-wrap ++msgid "Classification banner" ++msgstr "Classification Deckblatt" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:228 ++msgid "Specifies the security classification of the server." ++msgstr "Spezifiziert die Sicherheitseinstufung des Servers." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:228 ++#, no-wrap ++msgid "ClassifyOverride Yes" ++msgstr "ClassifyOverride Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:230 ++#, no-wrap ++msgid "ClassifyOverride No" ++msgstr "ClassifyOverride No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:235 ++msgid "" ++"Specifies whether to allow users to override the classification of " ++"individual print jobs." ++msgstr "" ++"Spezifiziert, ob Benutzern erlaubt werden soll, die Einstufung individueller " ++"Druckaufträge zu ändern." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:235 ++#, no-wrap ++msgid "ConfigFilePerm mode" ++msgstr "ConfigFilePerm Modus" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:240 ++msgid "" ++"Specifies the permissions for all configuration files that the scheduler " ++"writes." ++msgstr "" ++"Spezifiziert die Rechte für alle vom Auftragsplaner (Scheduler) " ++"geschriebenen Konfigurationsdateien." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:240 ++#, no-wrap ++msgid "DataDir path" ++msgstr "DataDir Pfad" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:244 ++msgid "Specified the directory where data files can be found." ++msgstr "" ++"Spezifiziert das Verzeichnis, in dem Datendateien gefunden werden können." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:244 ++#, no-wrap ++msgid "DefaultAuthType Basic" ++msgstr "DefaultAuthType Basic" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:246 ++#, no-wrap ++msgid "DefaultAuthType BasicDigest" ++msgstr "DefaultAuthType BasicDigest" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:248 ++#, no-wrap ++msgid "DefaultAuthType Digest" ++msgstr "DefaultAuthType Digest" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:250 ++#, no-wrap ++msgid "DefaultAuthType Negotiate" ++msgstr "DefaultAuthType Negotiate" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:254 ++msgid "Specifies the default type of authentication to use." ++msgstr "Spezifiziert den standardmäßig zu verwendenden Authentifizierungstyp." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:254 ++#, no-wrap ++msgid "DefaultEncryption Never" ++msgstr "DefaultEncryption Never" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:256 ++#, no-wrap ++msgid "DefaultEncryption IfRequested" ++msgstr "DefaultEncryption IfRequested" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:258 ++#, no-wrap ++msgid "DefaultEncryption Required" ++msgstr "DefaultEncryption Required" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:262 ++msgid "Specifies the type of encryption to use for authenticated requests." ++msgstr "" ++"Gibt den Typ der Verschlüsselung an, der für authentifizierte Anfragen " ++"benutzt werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:262 ++#, no-wrap ++msgid "DefaultLanguage locale" ++msgstr "DefaultLanguage Locale (Standorteinstellung)" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:266 ++msgid "Specifies the default language to use for text and web content." ++msgstr "" ++"Spezifiziert die Standardsprache, die für Text und Webinhalte verwandt " ++"werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:266 ++#, no-wrap ++msgid "DefaultPaperSize Auto" ++msgstr "DefaultPaperSize Auto" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:268 ++#, no-wrap ++msgid "DefaultPaperSize None" ++msgstr "DefaultPaperSize None" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:270 ++#, no-wrap ++msgid "DefaultPaperSize sizename" ++msgstr "DefaultPaperSize Größenname" ++ ++#. type: Plain text ++#: cupsd.conf.man.in:275 ++msgid "" ++"Specifies the default paper size for new print queues. \"Auto\" uses a " ++"locale- specific default, while \"None\" specifies there is no default paper " ++"size." ++msgstr "" ++"Gibt die Standardpapiergröße für neue Druckerwarteschlangen an. »Auto« " ++"benutzt eine sprachabhängige Vorgabe, während »None« angibt, dass keine " ++"Papiergröße vorgegeben ist." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:275 ++#, no-wrap ++msgid "DefaultPolicy policy-name" ++msgstr "DefaultPolicy Richtlinienname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:279 ++msgid "Specifies the default access policy to use." ++msgstr "Spezifiziert die zu verwendende Standardzugriffsrichtlinie." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:279 ++#, no-wrap ++msgid "DefaultShared Yes" ++msgstr "DefaultShared Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:281 ++#, no-wrap ++msgid "DefaultShared No" ++msgstr "DefaultShared No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:285 ++msgid "Specifies whether local printers are shared by default." ++msgstr "Spezifiziert, ob lokale Drucker standardmäßig freigegeben sind." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:285 ++#, no-wrap ++msgid "Deny all" ++msgstr "Deny all" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:287 ++#, no-wrap ++msgid "Deny none" ++msgstr "Deny none" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:289 ++#, no-wrap ++msgid "Deny host.domain.com" ++msgstr "Deny Rechner.Domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:291 ++#, no-wrap ++msgid "Deny *.domain.com" ++msgstr "Deny *.domain.com" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:293 ++#, no-wrap ++msgid "Deny ip-address" ++msgstr "Deny IP-Adresse" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:295 ++#, no-wrap ++msgid "Deny ip-address/netmask" ++msgstr "Deny IP-Adresse/Netzmaske" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:297 ++#, no-wrap ++msgid "Deny ip-address/mm" ++msgstr "Deny IP-Adresse/mm" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:299 ++#, no-wrap ++msgid "Deny @IF(name)" ++msgstr "Deny @IF(Name)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:301 ++#, no-wrap ++msgid "Deny @LOCAL" ++msgstr "Deny @LOCAL" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:305 ++msgid "Denies access to the named host or address." ++msgstr "Verweigert Zugriff auf die benannten Rechner oder Adressen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:305 ++#, no-wrap ++msgid "DirtyCleanInterval seconds" ++msgstr "DirtyCleanInterval Sekunden" ++ ++#. type: Plain text ++#: cupsd.conf.man.in:311 ++msgid "" ++"Specifies the delay for updating of configuration and state files. A value " ++"of 0 causes the update to happen as soon as possible, typically within a few " ++"milliseconds." ++msgstr "" ++"Gibt die Verzögerungszeit für die Aktualisierung von Konfigurations- und " ++"Statusdateien an. Ein Wert von 0 veranlasst, dass die Aktualisierung so " ++"schnell wie möglich erfolgt, typischerweise innerhalb von wenigen " ++"Millisekunden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:311 ++#, no-wrap ++msgid "DocumentRoot directory" ++msgstr "DocumentRoot Verzeichnis" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:315 ++msgid "Specifies the root directory for the internal web server documents." ++msgstr "" ++"Spezifiziert das Wurzelverzeichnis für die internen Webserver-Dokumente." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:324 ++#, no-wrap ++msgid "ErrorLog filename" ++msgstr "ErrorLog Dateiname" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:326 ++#, no-wrap ++msgid "ErrorLog syslog" ++msgstr "ErrorLog syslog" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:330 ++msgid "Specifies the error log filename." ++msgstr "Spezifiziert den Dateinamen des Fehlerprotokolls." ++ ++#. type: TP ++#: cupsd.conf.man.in:330 ++#, no-wrap ++msgid "FatalErrors none" ++msgstr "FatalErrors none" ++ ++#. type: TP ++#: cupsd.conf.man.in:332 ++#, no-wrap ++msgid "FatalErrors all -kind [... -kind]" ++msgstr "FatalErrors all -kind [... -kind]" ++ ++#. type: TP ++#: cupsd.conf.man.in:334 ++#, no-wrap ++msgid "FatalErrors kind [... kind]" ++msgstr "FatalErrors kind [... kind]" ++ ++#. type: Plain text ++#: cupsd.conf.man.in:339 ++msgid "" ++"Specifies which errors are fatal, causing the scheduler to exit. \"Kind\" is " ++"\"browse\", \"config\", \"listen\", \"log\", or \"permissions\"." ++msgstr "" ++"Gibt an, welche Fehler fatal sind und den Zeitplaner zum Beenden " ++"veranlassen. »Art« ist »browse«, »config«, »log« oder »permissions«," ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:339 ++#, no-wrap ++msgid "FileDevice Yes" ++msgstr "FileDevice Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:341 ++#, no-wrap ++msgid "FileDevice No" ++msgstr "FileDevice No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:346 ++msgid "" ++"Specifies whether the file pseudo-device can be used for new printer queues." ++msgstr "" ++"Spezifiziert, ob das Pseudo-Gerät file für neue Druckerwarteschlangen " ++"benutzt werden kann." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:346 ++#, no-wrap ++msgid "FilterLimit limit" ++msgstr "FilterLimit Beschränkung" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:350 ++msgid "Specifies the maximum cost of filters that are run concurrently." ++msgstr "" ++"Spezifiziert die maximale Belastung der Filter, die gleichzeitig laufen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:350 ++#, no-wrap ++msgid "FilterNice nice-value" ++msgstr "FilterNice Nice-Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:355 ++msgid "" ++"Specifies the scheduling priority (\"nice\" value) of filters that are run " ++"to print a job." ++msgstr "" ++"Spezifiziert die Planungspriorität (»nice«-Wert) von Filtern, die laufen, um " ++"einen Druckauftrag auszudrucken." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:355 ++#, no-wrap ++msgid "FontPath directory[:directory:...]" ++msgstr "FontPath Verzeichnis[:Verzeichnis:...]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:359 ++msgid "Specifies the search path for fonts." ++msgstr "Spezifiziert den Suchpfad für Schriften." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:359 ++#, no-wrap ++msgid "Group group-name-or-number" ++msgstr "Group Gruppenname-oder-nummer" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:364 ++msgid "" ++"Specifies the group name or ID that will be used when executing external " ++"programs." ++msgstr "" ++"Spezifiziert den Gruppenname oder deren ID, die bei der Ausführung externer " ++"Programme verwandt wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:364 ++#, no-wrap ++msgid "HideImplicitMembers Yes" ++msgstr "HideImplicitMembers Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:366 ++#, no-wrap ++msgid "HideImplicitMembers No" ++msgstr "HideImplicitMembers No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:370 ++msgid "Specifies whether to hide members of implicit classes." ++msgstr "Spezifiziert, ob Mitglieder impliziter Klassen versteckt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:370 ++#, no-wrap ++msgid "HostNameLookups On" ++msgstr "HostNameLookups On" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:372 ++#, no-wrap ++msgid "HostNameLookups Off" ++msgstr "HostNameLookups Off" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:374 ++#, no-wrap ++msgid "HostNameLookups Double" ++msgstr "HostNameLookups Double" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:378 ++msgid "Specifies whether or not to do reverse lookups on client addresses." ++msgstr "" ++"Spezifiziert, ob inverse Client-Adressabfragen erfolgen sollen oder nicht." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:378 ++#, no-wrap ++msgid "ImplicitAnyClasses Yes" ++msgstr "ImplicitAnyClasses Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:380 ++#, no-wrap ++msgid "ImplicitAnyClasses No" ++msgstr "ImplicitAnyClasses No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:386 ++msgid "" ++"Specifies whether or not to create implicit classes for local and remote " ++"printers, e.g. \"AnyPrinter\" from \"Printer\", \"Printer@server1\", and " ++"\"Printer@server2\"." ++msgstr "" ++"Spezifiziert, ob implizite Klassen für lokale und nicht-lokale Drucker " ++"erstellt werden sollen oder nicht, z.B. »AnyPrinter« aus »Printer«, " ++"»Printer@server1 und »Printer@server2«." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:386 ++#, no-wrap ++msgid "ImplicitClasses Yes" ++msgstr "ImplicitClasses Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:388 ++#, no-wrap ++msgid "ImplicitClasses No" ++msgstr "ImplicitClasses No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:393 ++msgid "" ++"Specifies whether or not to create implicit classes from identical remote " ++"printers." ++msgstr "" ++"Spezifiziert, ob implizite Klassen aus identischen nicht-lokalen Druckern " ++"erstellt werden sollen oder nicht." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:393 ++#, no-wrap ++msgid "Include filename" ++msgstr "Include Dateiname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:397 ++msgid "Includes the named file." ++msgstr "Schließt die genannte Datei ein." ++ ++#. type: TP ++#: cupsd.conf.man.in:397 ++#, no-wrap ++msgid "JobKillDelay seconds" ++msgstr "JobKillDelay Sekunden" ++ ++#. type: Plain text ++#: cupsd.conf.man.in:402 ++msgid "" ++"Specifies the number of seconds to wait before killing the filters and " ++"backend associated with a canceled or held job." ++msgstr "" ++"Spezifiziert die Anzahl von Sekunden zum Warten, bevor die Filter und " ++"Backends beendet werden, die mit einem abgebrochenen oder angehaltenen " ++"Druckauftrag verbunden sind." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:402 ++#, no-wrap ++msgid "JobRetryInterval seconds" ++msgstr "JobRetryInterval Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:406 ++msgid "Specifies the interval between retries of jobs in seconds." ++msgstr "" ++"Spezifiziert das Intervall zwischen Neuversuchen von Aufträgen in Sekunden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:406 ++#, no-wrap ++msgid "JobRetryLimit count" ++msgstr "JobRetryLimit Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:410 ++msgid "Specifies the number of retries that are done for jobs." ++msgstr "" ++"Spezifiziert die Anzahl der Neuversuche, die für Auträge durchgeführt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:410 ++#, no-wrap ++msgid "KeepAlive Yes" ++msgstr "KeepAlive Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:412 ++#, no-wrap ++msgid "KeepAlive No" ++msgstr "KeepAlive No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:416 ++msgid "Specifies whether to support HTTP keep-alive connections." ++msgstr "Spezifiziert, ob HTTP-keep-alive-Verbindungen unterstützt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:416 ++#, no-wrap ++msgid "KeepAliveTimeout seconds" ++msgstr "KeepAliveTimeout Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:420 ++msgid "Specifies the amount of time that connections are kept alive." ++msgstr "Spezifiziert die Zeit, die Verbindungen am Leben erhalten werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:420 ++#, no-wrap ++msgid "ELimit operationsE ... E/LimitE" ++msgstr "ELimit operationsE ... E/LimitE" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:424 ++msgid "Specifies the IPP operations that are being limited inside a policy." ++msgstr "" ++"Spezifiziert die IPP-Operationen, die innerhalb einer Richtlinie begrenzt " ++"werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:424 ++#, no-wrap ++msgid "ELimit methodsE ... E/LimitE" ++msgstr "ELimit methodsE ... E/LimitE" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:426 ++#, no-wrap ++msgid "ELimitExcept methodsE ... E/LimitExceptE" ++msgstr "ELimitExcept methodsE ... E/LimitExceptE" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:430 ++msgid "Specifies the HTTP methods that are being limited inside a location." ++msgstr "" ++"Spezifiziert die HTTP-Methoden, die innerhalb eines Ortes begrenzt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:430 ++#, no-wrap ++msgid "LimitRequestBody" ++msgstr "LimitRequestBody" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:434 ++msgid "Specifies the maximum size of any print job request." ++msgstr "Spezifiziert die maximale Größe jedes Druckauftrags." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:434 ++#, no-wrap ++msgid "Listen ip-address:port" ++msgstr "Listen IP-Adresse:Port" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:436 ++#, no-wrap ++msgid "Listen *:port" ++msgstr "Listen *:Port" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:438 ++#, no-wrap ++msgid "Listen /path/to/domain/socket" ++msgstr "Listen /pfad/zu/Domain/Socket" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:442 ++msgid "Listens to the specified address and port or domain socket path." ++msgstr "" ++"Warten auf der angegebenen Adresse und Port oder Domain Socket-Pfad auf " ++"Anfragen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:442 ++#, no-wrap ++msgid "ELocation /pathE ... E/LocationE" ++msgstr "ELocation /pathE ... E/LocationE" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:446 ++msgid "Specifies access control for the named location." ++msgstr "Spezifiziert die Zugriffssteuerung für den benannten Ort." ++ ++# type: Plain text ++#. type: TP ++#: cupsd.conf.man.in:446 ++#, no-wrap ++msgid "LogDebugHistory #-messages" ++msgstr "LogDebugHistory #-messages" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:451 ++msgid "" ++"Specifies the number of debugging messages that are logged when an error " ++"occurs in a print job." ++msgstr "" ++"Spezifiziert die Anzahl der Fehlersuchnachrichten, die protokolliert werden, " ++"wenn ein Fehler in einem Druckauftrag auftritt." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:451 ++#, no-wrap ++msgid "LogFilePerm mode" ++msgstr "LogFilePerm Modus" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:455 ++msgid "Specifies the permissions for all log files that the scheduler writes." ++msgstr "" ++"Spezifiziert die Rechte für alle vom Auftragsplaner (Scheduler) " ++"geschriebenen Protokolldateien." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:455 ++#, no-wrap ++msgid "LogLevel alert" ++msgstr "LogLevel alert" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:457 ++#, no-wrap ++msgid "LogLevel crit" ++msgstr "LogLevel crit" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:459 ++#, no-wrap ++msgid "LogLevel debug2" ++msgstr "LogLevel debug2" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:461 ++#, no-wrap ++msgid "LogLevel debug" ++msgstr "LogLevel debug" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:463 ++#, no-wrap ++msgid "LogLevel emerg" ++msgstr "LogLevel emerg" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:465 ++#, no-wrap ++msgid "LogLevel error" ++msgstr "LogLevel error" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:467 ++#, no-wrap ++msgid "LogLevel info" ++msgstr "LogLevel info" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:469 ++#, no-wrap ++msgid "LogLevel none" ++msgstr "LogLevel none" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:471 ++#, no-wrap ++msgid "LogLevel notice" ++msgstr "LogLevel notice" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:473 ++#, no-wrap ++msgid "LogLevel warn" ++msgstr "LogLevel warn" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:477 ++msgid "Specifies the logging level for the ErrorLog file." ++msgstr "Spezifiziert die Protokollierungsstufe für die ErrorLog-Datei." ++ ++#. type: TP ++#: cupsd.conf.man.in:477 ++#, no-wrap ++msgid "LogTimeFormat standard" ++msgstr "LogTimeFormat standard" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:479 ++#, no-wrap ++msgid "LogTimeFormat usecs" ++msgstr "LogTimeFormat usecs" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:483 ++msgid "Specifies the format of the date and time in the log files." ++msgstr "Spezifiziert das Format von Datum und Zeit in den Protokolldateien." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:483 ++#, no-wrap ++msgid "MaxClients number" ++msgstr "MaxClients Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:487 ++msgid "Specifies the maximum number of simultaneous clients to support." ++msgstr "" ++"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Clients." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:487 ++#, no-wrap ++msgid "MaxClientsPerHost number" ++msgstr "MaxClientsPerHost Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:492 ++msgid "" ++"Specifies the maximum number of simultaneous clients to support from a " ++"single address." ++msgstr "" ++"Spezifiziert die maximale Anzahl an simulatan zu unterstützenden Clients von " ++"einer einzelnen Adresse." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:492 ++#, no-wrap ++msgid "MaxCopies number" ++msgstr "MaxCopies Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:496 ++msgid "" ++"Specifies the maximum number of copies that a user can print of each job." ++msgstr "" ++"Spezifiziert die maximale Anzahl an Kopien, die ein Benutzer bei jedem " ++"Auftrag drucken kann." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:496 ++#, no-wrap ++msgid "MaxJobs number" ++msgstr "MaxJobs Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:500 ++msgid "Specifies the maximum number of simultaneous jobs to support." ++msgstr "" ++"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:500 ++#, no-wrap ++msgid "MaxJobsPerPrinter number" ++msgstr "MaxJobsPerPrinter Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:504 ++msgid "" ++"Specifies the maximum number of simultaneous jobs per printer to support." ++msgstr "" ++"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen " ++"pro Drucker." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:504 ++#, no-wrap ++msgid "MaxJobsPerUser number" ++msgstr "MaxJobsPerUser Anzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:508 ++msgid "Specifies the maximum number of simultaneous jobs per user to support." ++msgstr "" ++"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen " ++"pro Benutzer." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:508 ++#, no-wrap ++msgid "MaxLogSize number-bytes" ++msgstr "MaxLogSize Byteanzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:513 ++msgid "" ++"Specifies the maximum size of the log files before they are rotated (0 to " ++"disable rotation)" ++msgstr "" ++"Spezifiziert die maximale Größe der Protokolldateien, bevor sie rotiert " ++"werden (0 für keine Rotation)." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:513 ++#, no-wrap ++msgid "MaxRequestSize number-bytes" ++msgstr "MaxRequestSize Byteanzahl" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:517 ++msgid "Specifies the maximum request/file size in bytes (0 for no limit)" ++msgstr "" ++"Spezifiziert die maximale Anfrage-/Dateigröße in Bytes (0 für keine " ++"Begrenzung)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:517 ++#, no-wrap ++msgid "MultipleOperationTimeout seconds" ++msgstr "MultipleOperationTimeout Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:522 ++msgid "" ++"Specifies the maximum amount of time to allow between files in a multiple " ++"file print job." ++msgstr "" ++"Spezifiziert die maximal erlaubte Zeit zwischen Dateien in einem " ++"Druckauftrag aus mehreren Dateien." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:522 ++#, no-wrap ++msgid "Order allow,deny" ++msgstr "Order allow,deny" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:524 ++#, no-wrap ++msgid "Order deny,allow" ++msgstr "Order deny,allow" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:528 ++msgid "Specifies the order of HTTP access control (allow,deny or deny,allow)" ++msgstr "" ++"Spezifiziert die Reihenfolge der HTTP-Zugriffssteuerung (allow, deny oder " ++"deny, allow)" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:528 ++#, no-wrap ++msgid "PageLog filename" ++msgstr "PageLog Dateiname" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:530 ++#, no-wrap ++msgid "PageLog syslog" ++msgstr "PageLog syslog" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:534 ++msgid "Specifies the page log filename." ++msgstr "Spezifiziert den Dateinamen des Seitenprotokolls." ++ ++#. type: TP ++#: cupsd.conf.man.in:534 ++#, no-wrap ++msgid "PageLogFormat format string" ++msgstr "PageLogFormat format string" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:538 ++msgid "Specifies the format of page log lines." ++msgstr "Spezifiziert das Format der Seitenprotokollzeilen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:538 ++#, no-wrap ++msgid "PassEnv variable [... variable]" ++msgstr "PassEnv Variable [... Variable]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:542 ++msgid "Passes the specified environment variable(s) to child processes." ++msgstr "Gibt die angegebene(n) Umgebungsvariable(n) an Kindprozesse weiter." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:542 ++#, no-wrap ++msgid "EPolicy nameE ... E/PolicyE" ++msgstr "EPolicy nameE ... E/PolicyE" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:546 ++msgid "Specifies access control for the named policy." ++msgstr "Spezifiziert die Zugriffskontrolle für die genannte Richtlinie." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:546 ++#, no-wrap ++msgid "Port number" ++msgstr "Port Nummer" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:550 ++msgid "Specifies a port number to listen to for HTTP requests." ++msgstr "" ++"Spezifiziert eine Portnummer, an der auf HTTP-Anfragen gewartet werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:550 ++#, no-wrap ++msgid "PreserveJobFiles Yes" ++msgstr "PreserveJobFiles Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:552 ++#, no-wrap ++msgid "PreserveJobFiles No" ++msgstr "PreserveJobFiles No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:556 ++msgid "Specifies whether or not to preserve job files after they are printed." ++msgstr "" ++"Spezifiziert, ob Druckauftragsdateien nach dem Druck aufgehoben werden " ++"sollen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:556 ++#, no-wrap ++msgid "PreserveJobHistory Yes" ++msgstr "PreserveJobHistory Yes" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:558 ++#, no-wrap ++msgid "PreserveJobHistory No" ++msgstr "PreserveJobHistory No" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:563 ++msgid "" ++"Specifies whether or not to preserve the job history after they are printed." ++msgstr "" ++"Spezifiziert, ob der Verlauf des Druckauftrags nach dem Druck aufgehoben " ++"werden soll." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:563 ++#, no-wrap ++msgid "Printcap" ++msgstr "Printcap" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:565 ++#, no-wrap ++msgid "Printcap filename" ++msgstr "Printcap Dateiname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:572 ++msgid "" ++"Specifies the filename for a printcap file that is updated automatically " ++"with a list of available printers (needed for legacy applications); " ++"specifying Printcap with no filename disables printcap generation." ++msgstr "" ++"Spezifiziert den Dateinnamen für eine Printcap-Datei, die automatisch mit " ++"einer Liste der verfügbaren Drucker aktualisiert wird (benötigt für alte " ++"Programme). Die Angabe von Printcap ohne Dateiname schaltet die Printcap-" ++"Generierung aus." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:572 ++#, no-wrap ++msgid "PrintcapFormat bsd" ++msgstr "PrintcapFormat bsd" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:574 ++#, no-wrap ++msgid "PrintcapFormat plist" ++msgstr "PrintcapFormat plist" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:576 ++#, no-wrap ++msgid "PrintcapFormat solaris" ++msgstr "PrintcapFormat solaris" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:580 ++msgid "Specifies the format of the printcap file." ++msgstr "Spezifiziert das Format der Printcap-Datei." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:580 ++#, no-wrap ++msgid "PrintcapGUI" ++msgstr "PrintcapGUI" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:582 ++#, no-wrap ++msgid "PrintcapGUI gui-program-filename" ++msgstr "PrintcapGUI GUI-Programmdateiname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:588 ++msgid "" ++"Specifies whether to generate option panel definition files on some " ++"operating systems. When provided with no program filename, disables option " ++"panel definition files." ++msgstr "" ++"Spezifiziert, ob Definitionsdateien für die Optionsleiste auf einigen " ++"Betriebssystemen generiert werden. Diese Option schaltet " ++"Optionsschaltflächendefinitionsdateien aus, wenn sie ohne Dateiname " ++"angegeben wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:588 ++#, no-wrap ++msgid "ReloadTimeout seconds" ++msgstr "ReloadTimeout Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:593 ++msgid "" ++"Specifies the amount of time to wait for job completion before restarting " ++"the scheduler." ++msgstr "" ++"Spezifiziert die Zeitspanne, während der auf die Beendigung von Aufträgen " ++"gewartet werden soll, bevor der Auftragsplaner (Scheduler) neu gestartet " ++"wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:593 ++#, no-wrap ++msgid "RemoteRoot user-name" ++msgstr "RemoteRoot Benutzername" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:598 ++msgid "" ++"Specifies the username that is associated with unauthenticated root accesses." ++msgstr "" ++"Spezifiziert den Benutzernamen, der mit nicht-authentifiziertem root-Zugang " ++"assoziiert ist." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:598 ++#, no-wrap ++msgid "RequestRoot directory" ++msgstr "RequestRoot Verzeichnis" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:603 ++msgid "" ++"Specifies the directory to store print jobs and other HTTP request data." ++msgstr "" ++"Spezifiziert das Verzeichnis, in dem Druckaufträge und andere HTTP-" ++"Anfragedaten gespeichert werden sollen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:603 ++#, no-wrap ++msgid "Require group group-name-list" ++msgstr "Require group group-name-list" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:605 ++#, no-wrap ++msgid "Require user user-name-list" ++msgstr "Benötigt Benutzer user-name-list" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:607 ++#, no-wrap ++msgid "Require valid-user" ++msgstr "Benötigt valid-user" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:611 ++msgid "Specifies that user or group authentication is required." ++msgstr "" ++"Spezifiziert, dass Benutzer- oder Gruppenauthentifizierung benötigt wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:611 ++#, no-wrap ++msgid "RIPCache bytes" ++msgstr "RIPCache Bytes" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:616 ++msgid "" ++"Specifies the maximum amount of memory to use when converting images and " ++"PostScript files to bitmaps for a printer." ++msgstr "" ++"Spezifiziert die maximale Menge an zu verwendendem Speicher beim " ++"Konvertieren von Bilder und PostScript-Dateien in Bitmaps für den Drucker." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:616 ++#, no-wrap ++msgid "Satisfy all" ++msgstr "Satisfy all" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:618 ++#, no-wrap ++msgid "Satisfy any" ++msgstr "Satisfy any" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:623 ++msgid "" ++"Specifies whether all or any limits set for a Location must be satisfied to " ++"allow access." ++msgstr "" ++"Spezifiziert, ob alle (alle) oder eine (any) Beschränkung für einen Standort " ++"erfüllt sein muss, um Zugriff zu erlauben." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:623 ++#, no-wrap ++msgid "ServerAdmin user@domain.com" ++msgstr "ServerAdmin Benutzer@domain.com" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:627 ++msgid "Specifies the email address of the server administrator." ++msgstr "Spezifiziert die E-Mail-Adresse des Server-Administrators." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:627 ++#, no-wrap ++msgid "ServerAlias hostname" ++msgstr "ServerAlias hostname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:632 ++msgid "" ++"Specifies an alternate name that the server is known by. The special name \"*" ++"\" allows any name to be used." ++msgstr "" ++"Spezifiziert einen alternativen Namen, unter dem der Server bekannt ist. Der " ++"besondere Name »*« erlaubt die Verwendung jedes Namens." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:632 ++#, no-wrap ++msgid "ServerBin directory" ++msgstr "ServerBin Verzeichnis" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:637 ++msgid "" ++"Specifies the directory where backends, CGIs, daemons, and filters may be " ++"found." ++msgstr "" ++"Spezifiziert das Verzeichnis, in dem Backends, CGIs, Daemons und Filter " ++"gefunden werden können." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:637 ++#, no-wrap ++msgid "ServerCertificate filename" ++msgstr "ServerCertificate Dateiname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:641 ++msgid "Specifies the encryption certificate to use." ++msgstr "Spezifiziert das zu verwendende Verschlüsselungszertifikat." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:641 ++#, no-wrap ++msgid "ServerKey filename" ++msgstr "ServerKey Dateiname" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:645 ++msgid "Specifies the encryption key to use." ++msgstr "Spezifiziert den zu verwendenden Schlüssel für die Verschlüsselung." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:645 ++#, no-wrap ++msgid "ServerName hostname-or-ip-address" ++msgstr "ServerName Rechnername-oder-IP-Adresse" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:649 ++msgid "Specifies the fully-qualified hostname of the server." ++msgstr "Spezifiziert den vollqualifizierten Rechnernamen des Servers." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:649 ++#, no-wrap ++msgid "ServerRoot directory" ++msgstr "ServerRoot Verzeichnis" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:653 ++msgid "" ++"Specifies the directory where the server configuration files can be found." ++msgstr "" ++"Spezifiziert das Verzeichnis, in dem die Serverkonfiguration gefunden werden " ++"kann." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:653 ++#, no-wrap ++msgid "ServerTokens Full" ++msgstr "ServerTokens Full" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:655 ++#, no-wrap ++msgid "ServerTokens Major" ++msgstr "ServerTokens Major" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:657 ++#, no-wrap ++msgid "ServerTokens Minimal" ++msgstr "ServerTokens Minimal" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:659 ++#, no-wrap ++msgid "ServerTokens Minor" ++msgstr "ServerTokens Minor" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:661 ++#, no-wrap ++msgid "ServerTokens None" ++msgstr "ServerTokens None" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:663 ++#, no-wrap ++msgid "ServerTokens OS" ++msgstr "ServerTokens OS" ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:665 ++#, no-wrap ++msgid "ServerTokens ProductOnly" ++msgstr "ServerTokens ProductOnly" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:670 ++msgid "" ++"Specifies what information is included in the Server header of HTTP " ++"responses." ++msgstr "" ++"Spezifiziert, welche Informationen im Server-Header von HTTP-Antworten " ++"enthalten sein sollen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:670 ++#, no-wrap ++msgid "SetEnv variable value" ++msgstr "SetEnv Variable Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:674 ++msgid "Set the specified environment variable to be passed to child processes." ++msgstr "Setzt die angegebene Umgebungsvariable zur Weitergabe an Kindprozesse." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:674 ++#, no-wrap ++msgid "SSLListen" ++msgstr "SSLListen" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:678 ++msgid "Listens on the specified address and port for encrypted connections." ++msgstr "" ++"Wartet auf der angegebenen Adresse und dem Port auf verschlüsselte " ++"Verbindungen." ++ ++#. type: TP ++#: cupsd.conf.man.in:678 ++#, no-wrap ++msgid "SSLOptions None" ++msgstr "SSLOptions None" ++ ++#. type: TP ++#: cupsd.conf.man.in:680 ++#, no-wrap ++msgid "SSLOptions NoEmptyFragments" ++msgstr "SSLOptions NoEmptyFragments" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:684 ++msgid "Sets SSL/TLS protocol options for encrypted connections." ++msgstr "Setzt SSL/TLS-Protokolloptionen für verschlüsselte Verbindungen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:684 ++#, no-wrap ++msgid "SSLPort" ++msgstr "SSLPort" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:688 ++msgid "Listens on the specified port for encrypted connections." ++msgstr "Wartet auf dem angegebenen Port auf verschlüsselte Verbindungen." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:688 ++#, no-wrap ++msgid "SystemGroup group-name [group-name ...]" ++msgstr "SystemGroup Gruppenname [Gruppenname ...]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:692 ++msgid "Specifies the group(s) to use for System class authentication." ++msgstr "" ++"Spezifiziert den/die Gruppe(n), die für Systemklassen-Authentifizierung " ++"verwandt werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:692 ++#, no-wrap ++msgid "TempDir directory" ++msgstr "TempDir Verzeichnis" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:696 ++msgid "Specifies the directory where temporary files are stored." ++msgstr "" ++"Spezifiziert das Verzeichnis, in dem temporäre Dateien gespeichert werden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:696 ++#, no-wrap ++msgid "Timeout seconds" ++msgstr "Timeout Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:700 ++msgid "Specifies the HTTP request timeout in seconds." ++msgstr "Spezifiziert die HTTP-Zeitüberschreitung in Sekunden." ++ ++# type: TP ++#. type: TP ++#: cupsd.conf.man.in:700 ++#, no-wrap ++msgid "User user-name" ++msgstr "User Benutzername" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:704 ++msgid "" ++"Specifies the user name or ID that is used when running external programs." ++msgstr "" ++"Spezifiziert den Benutzernamen oder die ID, die bei der Ausführung externer " ++"Programme verwandt wird." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.conf.man.in:708 ++msgid "" ++"I, I, I, I, " ++"I, I," ++msgstr "" ++"I, I, I, I, " ++"I, I," ++ ++# type: TH ++#. type: TH ++#: cups-deviced.man.in:15 ++#, no-wrap ++msgid "cups-deviced" ++msgstr "cups-deviced" ++ ++# type: TH ++#. type: TH ++#: cups-deviced.man.in:15 cups-driverd.man.in:15 lpq.man:15 ++#, no-wrap ++msgid "16 June 2008" ++msgstr "16. Juni 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-deviced.man.in:18 ++msgid "cups-deviced - cups device daemon" ++msgstr "cups-deviced - CUPS-Geräte-Daemon" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-deviced.man.in:21 ++msgid "B I" ++msgstr "B I" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-deviced.man.in:36 ++msgid "" ++"I polls the backends in I<@CUPS_SERVERBIN@/backend> for a list " ++"of available devices. It is run by I in response to a I request. The output format is an IPP response message. The " ++"I argument is the request ID from the original IPP request, " ++"typically 1. The I argument is the limit value from the original IPP " ++"request - 0 means no limit. The I argument is the requesting-user-" ++"name value from the original IPP request. Finally, the I argument " ++"is a space-delimited list of attributes (\"name=value name=value ...\") that " ++"were passed in with the request. Currently I looks for the " ++"I attribute and tailors the output accordingly." ++msgstr "" ++"I befragt die Backends in I<@CUPS_SERVERBIN@/backend> nach " ++"einer Liste verfügbarer Geräte. Es wird von I als Reaktion auf " ++"eine I-Anfrage ausgeführt. Die Ausgabe ist ein Nachricht " ++"im IPP-Antwort-Format. Das Argument I ist die Anfrage-ID der " ++"ursprünglichen IPP-Anfrage, typischerweise 1. Das Argument I ist der " ++"Wert der Grenze von der ursprünglichen IPP-Anfrage - 0 bedeutet keine " ++"Grenze. Das Argument I ist der Wert des anfragenden Benutzers " ++"aus der ursprünglichen IPP-Anfrage. Schließlich ist das Argument I " ++"eine leerzeichengetrennte Liste von Attributen (»Name=Wert Name=Wert«), die " ++"mit der Anfrage übergeben wurde. Derzeit prüft I auf die " ++"I und passt die Ausgabe entsprechend an." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-deviced.man.in:38 ++msgid "backend(7), cupsd(8), cupsd.conf(5)," ++msgstr "backend(7), cupsd(8), cupsd.conf(5)," ++ ++# type: TH ++#. type: TH ++#: cupsd.man.in:15 ++#, no-wrap ++msgid "cupsd" ++msgstr "cupsd" ++ ++# type: TH ++#. type: TH ++#: cupsd.man.in:15 ++#, no-wrap ++msgid "9 March 2009" ++msgstr "9. März 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:18 ++msgid "cupsd - cups scheduler" ++msgstr "cupsd - Cups-Autragsplaner" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:23 ++msgid "B [ -c I ] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]" ++msgstr "B [ -c I ] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:28 ++msgid "" ++"I is the scheduler for CUPS. It implements a printing system based " ++"upon the Internet Printing Protocol, version 2.1. If no options are " ++"specified on the command-line then the default configuration file " ++"I<@CUPS_SERVERROOT@/cupsd.conf> will be used." ++msgstr "" ++"I ist der Auftragsplaner (Scheduler) für das Common UNIX Printing " ++"System. Es implementiert ein Drucksystem, das auf dem Internet Printing " ++"Protocol Version 2.1 basiert. Falls auf der Befehlszeile keine Optionen " ++"angegeben werden, wird stattdessen die Standard-Konfigurationsdatei " ++"I<@CUPS_SERVERROOT@/cupsd.conf> verwandt." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:29 cupsfilter.man:40 ++#, no-wrap ++msgid "-c config-file" ++msgstr "-c Konfig-Datei" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:33 ++msgid "Uses the named configuration file." ++msgstr "Verwende die benannte Konfigurationsdatei." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:33 ++#, no-wrap ++msgid "-f" ++msgstr "-f" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:38 ++msgid "" ++"Run I in the foreground; the default is to run in the background as a " ++"\"daemon\"." ++msgstr "" ++"Führe I im Vordergrund aus; standardmäßig wird er im Hintergrund als " ++"»Daemon« ausgeführt." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:38 ++#, no-wrap ++msgid "-F" ++msgstr "-F" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:44 ++msgid "" ++"Run I in the foreground but detach the process from the controlling " ++"terminal and current directory. This is useful for running I from " ++"I." ++msgstr "" ++"Führe I im Vordergrund aus, aber kopple den Prozess von dem " ++"steuernden Terminal und dem aktuellen Verzeichnis ab. Dies ist nützlich, um " ++"I von I aus auszuführen." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:44 lpr.man:75 ++#, no-wrap ++msgid "-h" ++msgstr "-h" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:48 ++msgid "Shows the program usage." ++msgstr "Zeigt die Programm-Verwendung." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:48 lpinfo.man:69 lpoptions.man.in:84 lpq.man:59 lpr.man:80 ++#: lpstat.man:87 ++#, no-wrap ++msgid "-l" ++msgstr "-l" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:53 ++msgid "This option is passed to I when it is run from I." ++msgstr "" ++"Diese Option wird an I übergeben, wenn es von I " ++"ausgeführt wird." ++ ++# type: TP ++#. type: TP ++#: cupsd.man.in:53 lpstat.man:112 ++#, no-wrap ++msgid "-t" ++msgstr "-t" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:57 ++msgid "Test the configuration file for syntax errors." ++msgstr "Die Konfigurationsdatei auf Syntax-Fehler testen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:61 ++msgid "" ++"I implements all of the required IPP/2.1 attributes and operations. " ++"It also implements several CUPS-specific administration operations." ++msgstr "" ++"I implementiert alle benötigten IPP/2.1-Attribute und Operationen. Es " ++"implementiert auch mehrere CUPS-spezifische Administrationsoperationen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsd.man.in:66 ++msgid "" ++"I, I, I, I, " ++"I, I, I, I, I, I, I, I," ++msgstr "" ++"I, I, I, I, " ++"I, I, I, I, I, I, I, I," ++ ++# type: TH ++#. type: TH ++#: cups-driverd.man.in:15 ++#, no-wrap ++msgid "cups-driverd" ++msgstr "cups-driverd" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:18 ++msgid "cups-driverd - cups driver daemon" ++msgstr "cups-driverd - CUPS-Treiber-Daemon" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:22 ++msgid "B cat I" ++msgstr "B cat I" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:26 ++msgid "B list I" ++msgstr "B list I" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:31 ++msgid "" ++"I shows or lists PPD files. It is run in response to CUPS-Add-" ++"Modify-Printer or CUPS-Get-Devices requests. The first form (\"cups-driverd " ++"cat ppd-name\") writes the named PPD file to stdout. The output format is an " ++"uncompressed PPD file." ++msgstr "" ++"I zeigt PPD-Dateien an oder listet diese auf. Es wird als " ++"Reaktion auf »CUPS-Add-Modify-Printer«- oder »CUPS-Get-Devices«-Anfragen " ++"ausgeführt. Die erste Form (»cups-driverd cat PPD-Name«) schreibt die " ++"benannte PPD-Datei nach Stdout. Das Ausgabeformat ist eine unkomprimierte " ++"PPD-Datei." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:43 ++msgid "" ++"The second form lists the available manufacturers or PPD files to stdout as " ++"indicated by the I argument. The output format is an IPP response " ++"message. The I argument is the request ID from the original IPP " ++"request, typically 1. The I argument is the limit value from the " ++"original IPP request - 0 means no limit. Finally, the I argument is " ++"a space-delimited list of attributes (\"name=value name=value \\&...\") that " ++"were passed in with the request. Currently I looks for the " ++"I and I attributes and tailors the output " ++"accordingly." ++msgstr "" ++"Die zweite Form listet in der Standardausgabe die verfügbaren Hersteller " ++"oder PPD-Dateien auf, wie diese durch das Argument I angegeben " ++"sind. Die Ausgabe erfolgt im IPP-Antwortnachrichtenformat. Das Argument " ++"I ist die Anfrage-ID der ursprünglichen IPP-Anfrage, " ++"typischerweise 1. Das Argument I ist der Grenzwert aus der " ++"ursprünglichen IPP-Anfrage - 0 bedeutet keine Grenze. Das Argument " ++"I ist schließlich eine durch Leerzeichen getrennte Liste von " ++"Attributen (»Name=Wert Name=Wert \\&..«), die mit der Anfrage eingereicht " ++"wurden. Derzeit schaut I nach den Attributen I und " ++"I und passt die Ausgabe entsprechend an." ++ ++# type: SH ++#. type: SH ++#: cups-driverd.man.in:43 ++#, no-wrap ++msgid "DRIVERS" ++msgstr "TREIBER" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:51 ++msgid "" ++"Drivers can be static PPD files under the I<@CUPS_DATADIR@/model> directory " ++"or programs under the I<@CUPS_SERVERBIN@/driver> directory. Static PPD files " ++"must conform to the Adobe PPD File Format Specification version 4.3 and may " ++"be compressed using the I program. Driver programs must implement " ++"the command-line interface shown in the next section." ++msgstr "" ++"Treiber können statische PPD-Dateien unterhalb des Verzeichnisses " ++"I<@CUPS_DATADIR@/model> oder Programme unterhalb des Verzeichnisses " ++"I<@CUPS_SERVERBIN@/driver> sein. Statische PPD-Dateien müssen der Adobe PPD " ++"File Format Specification Version 4.3 folgen und können mittels I " ++"komprimiert sein. Treiberprogramme müssen die in dem nächsten Abschnitt " ++"beschriebene Befehlszeilenschnittstelle implementieren." ++ ++# type: SS ++#. type: SS ++#: cups-driverd.man.in:51 ++#, no-wrap ++msgid "DRIVER PROGRAMS" ++msgstr "TREIBER-PROGRAMME" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:54 ++msgid "" ++"Driver programs provide an interface to dynamically-generated PPD files. The " ++"following arguments are currently defined:" ++msgstr "" ++"Treiberprogramme stellen eine Schnittstelle für dynamisch-generierte PPD-" ++"Dateien bereit. Die folgenden Argumente sind aktuell definiert:" ++ ++# type: TP ++#. type: TP ++#: cups-driverd.man.in:54 ++#, no-wrap ++msgid "drivername list" ++msgstr "drivername list" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:58 ++msgid "Lists the supported PPD files to stdout." ++msgstr "Listet die unterstützten PPD-Dateien auf der Standardausgabe auf." ++ ++# type: TP ++#. type: TP ++#: cups-driverd.man.in:58 ++#, no-wrap ++msgid "drivername cat ppdname" ++msgstr "drivername cat PPD-Name" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:62 ++msgid "Writes the named PPD file to stdout." ++msgstr "Schreibt die benannte PPD-Datei auf die Standardausgabe." ++ ++# type: SS ++#. type: SS ++#: cups-driverd.man.in:62 ++#, no-wrap ++msgid "LISTING FILES (drivername list)" ++msgstr "DATEIEN AUFLISTEN (Treibernamenliste)" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:66 ++msgid "" ++"When run with the single argument \"list\", the program must list the " ++"available PPD files it can generate to stdout using the following format:" ++msgstr "" ++"Beim Aufruf mit dem einzelnen Argument »list« muss das Programm die " ++"verfügbaren PPD-Dateien, die es auf die Standardausgabe generieren kann, im " ++"folgenden Format auflisten:" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:68 ++#, no-wrap ++msgid " \"drivername:ppdname\" language \"make\" \"make and model\" \"1284 device id\"\n" ++msgstr " »Treibername:PPD-Name« Sprache »Marke« »Marke und Modell« »1284-Geräte-ID«\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:77 ++msgid "" ++"I is the name of the driver program. I is the name used " ++"to select the given driver. I is the locale associated with the " ++"default language of the PPD file, typically \"en\". I is the " ++"Manufacturer name from the PPD file. I is the NickName name " ++"from the PPD file. I<1284 device id> is the 1284DeviceId from the PPD file, " ++"if any." ++msgstr "" ++"I ist der Name des Treiberprogramms. I ist der Name, " ++"der zur Auswahl des gegebenen Treibers verwandt wird. I ist die mit " ++"der Standardsprache der PPD-Datei assoziierte Lokale (Standorteinstellung), " ++"typischerweise »en«. I ist der Herstellername aus der PPD-Datei. " ++"I ist der »NickName« aus der PPD-Datei. I<1284-Geräte-ID> " ++"ist die 1284DeviceId aus der PPD-Datei, falls vorhanden." ++ ++# type: SS ++#. type: SS ++#: cups-driverd.man.in:77 ++#, no-wrap ++msgid "WRITING FILES (drivername cat ppdname)" ++msgstr "DATEIEN SCHREIBEN (drivername cat PPD-Name)" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:82 ++msgid "" ++"When the driver program is run with the \"cat ppdname\" arguments, it must " ++"write the named PPD file to stdout, uncompressed. If the named PPD file does " ++"not exist, the driver program must not write any output to stdout and report " ++"the error to stderr instead." ++msgstr "" ++"Wenn das Treiberprogramm mit den Argumenten »cat PPD-Name« ausgeführt wird, " ++"muss es die benannte PPD-Datei unkomprimiert nach StdOut schreiben. Falls " ++"die benannte PPD-Datei nicht existiert, so darf das Treiberprogramm nichts " ++"auf die Standardausgabe schreiben und muss stattdessen alle Fehler auf " ++"Stderr melden." ++ ++# type: SS ++#. type: SS ++#: cups-driverd.man.in:82 ++#, no-wrap ++msgid "DRIVER ERROR MESSAGES" ++msgstr "TREIBERFEHLERMELDUNGEN" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:85 ++msgid "" ++"Error messages can be relayed back to I by writing them to stderr. " ++"The following prefixes are recognized:" ++msgstr "" ++"Fehlernachrichten können an I zurückgeleitet werden, indem Sie auf " ++"Stderr geschrieben werden. Die folgenden Präfixe werden erkannt:" ++ ++# type: TP ++#. type: TP ++#: cups-driverd.man.in:85 ++#, no-wrap ++msgid "DEBUG: [drivername]" ++msgstr "DEBUG: [Treibername]" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:89 ++msgid "Debugging messages" ++msgstr "Fehlersuchenachrichten" ++ ++# type: TP ++#. type: TP ++#: cups-driverd.man.in:89 ++#, no-wrap ++msgid "ERROR: [drivername]" ++msgstr "ERROR: [Treibername]" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:93 ++msgid "Error messages" ++msgstr "Fehlermeldungen" ++ ++# type: TP ++#. type: TP ++#: cups-driverd.man.in:93 ++#, no-wrap ++msgid "INFO: [drivername]" ++msgstr "INFO: [Treibername]" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:97 ++msgid "Informational messages" ++msgstr "Informative Nachrichten" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-driverd.man.in:99 ++msgid "cupsd(8), cupsd.conf(5), cupstestppd(1)," ++msgstr "cupsd(8), cupsd.conf(5), cupstestppd(1)," ++ ++# type: TH ++#. type: TH ++#: cupsenable.man:16 ++#, no-wrap ++msgid "cupsenable" ++msgstr "cupsenable" ++ ++# type: TH ++#. type: TH ++#: cupsenable.man:16 ++#, no-wrap ++msgid "9 October 2008" ++msgstr "9. Oktober 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:19 ++msgid "cupsdisable, cupsenable - stop/start printers and classes" ++msgstr "cupsdisable, cupsenable - beenden/starten von Druckern und Klassen" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:28 ++msgid "" ++"B [ -E ] [-U I ] [ -c ] [ -h I ] [ -r " ++"I ] [ --hold ] destination(s)" ++msgstr "" ++"B [ -E ] [-U I ] [ -c ] [ -h I ] " ++"[ -r I [ --hold ] ] Ziel(e)" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:35 ++msgid "" ++"B [ -E ] [-U I ] [ -c ] [ -h I ] [ --" ++"release ] destination(s)" ++msgstr "" ++"B [ -E ] [-U I ] [ -c ] [ -h I ] " ++"[ --release ] Ziel(e)" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:37 ++msgid "I starts the named printers or classes." ++msgstr "I startet den benannten Drucker oder die benannte Klasse." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:40 ++msgid "" ++"I stops the named printers or classes. The following options " ++"may be used:" ++msgstr "" ++"I beendet den benannten Drucker oder die benannte Klasse. Die " ++"folgenden Optionen dürfen verwandt werden:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:44 ++msgid "Forces encryption of the connection to the server." ++msgstr "Erzwingt Verschlüsselung der Verbindung zum Server." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:48 ++msgid "Uses the specified username when connecting to the server." ++msgstr "Verwendet den angegebenen Benutzernamen bei Verbindungen zum Server." ++ ++# type: TP ++#. type: TP ++#: cupsenable.man:48 lp.man:85 ++#, no-wrap ++msgid "-c" ++msgstr "-c" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:52 ++msgid "Cancels all jobs on the named destination." ++msgstr "Bricht alle Aufträge auf dem benannten Ziel ab." ++ ++# type: TP ++#. type: TP ++#: cupsenable.man:52 lpinfo.man:65 lpmove.man:54 lpoptions.man.in:80 ++#: lpq.man:55 lprm.man:49 lpstat.man:83 ++#, no-wrap ++msgid "-h server[:port]" ++msgstr "-h Server[:Port]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:56 ++msgid "Uses the specified server and port." ++msgstr "Verwendet den angegebenen Server und Port." ++ ++# type: TP ++#. type: TP ++#: cupsenable.man:56 ++#, no-wrap ++msgid "--hold" ++msgstr "--hold" ++ ++#. type: Plain text ++#: cupsenable.man:61 ++msgid "" ++"Holds remaining jobs on the named printer. Useful for allowing the current " ++"job to complete before performing maintenance." ++msgstr "" ++"Die verbleibenden Druckaufträge auf dem genannten Drucker anhalten. " ++"Nützlich, um dem aktuellen Druckauftrag die Fertigstellung zu erlauben, wenn " ++"danach Wartungsarbeiten durchgeführt werden sollen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:66 ++msgid "" ++"Sets the message associated with the stopped state. If no reason is " ++"specified then the message is set to \"Reason Unknown\"." ++msgstr "" ++"Setzt die dem Beendet-Zustand zugeordnete Nachricht. Falls kein Grund " ++"spezifiziert ist, wird die Nachricht auf »Reason Unknown« gesetzt." ++ ++#. type: TP ++#: cupsenable.man:66 ++#, no-wrap ++msgid "--release" ++msgstr "--release" ++ ++#. type: Plain text ++#: cupsenable.man:71 ++msgid "" ++"Releases pending jobs for printing. Use after running I with " ++"the I<--hold> option to resume printing." ++msgstr "" ++"Gibt wartende Aufträge zum Drucken frei. Benutzen Sie es nach der Ausführung " ++"von I mit der Option I<--hold>, um das Drucken fortzusetzen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:79 ++msgid "" ++"The System V versions of these commands are I and I. They " ++"have been renamed to avoid conflicts with the I build-in commands " ++"of the same name." ++msgstr "" ++"Die System-V-Versionen dieser Befehle sind I und I. Sie " ++"wurden umbenannt, um Konflikte mit den eingebauten Befehlen gleichen Namens " ++"der I zu vermeiden." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:84 ++msgid "" ++"The CUPS versions of I and I may ask the user for an access " ++"password depending on the printing system configuration. This differs from " ++"the System V versions which require the root user to execute these commands." ++msgstr "" ++"Die CUPS-Versionen von I und I könnten den Benutzer, " ++"abhängig von der Konfiguration des Drucksystems, nach einem Zugriffspasswort " ++"fragen. Dies unterscheidet sich von der System-V-Version, die verlangt, dass " ++"der Benutzer root diese Befehle ausführt." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsenable.man:87 ++msgid "" ++"I, I, I, I, I, " ++"I," ++msgstr "" ++"I, I, I, I, I, " ++"I," ++ ++# type: TH ++#. type: TH ++#: cupsfilter.man:14 ++#, no-wrap ++msgid "cupsfilter" ++msgstr "cupsfilter" ++ ++# type: TH ++#. type: TH ++#: cupsfilter.man:14 ++#, no-wrap ++msgid "26 February 2009" ++msgstr "26. Februar 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:17 ++msgid "cupsfilter - convert a file to another format using cups filters" ++msgstr "" ++"cupsfilter - konvertiere eine Datei in ein anderes Format mittels CUPS-Filter" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:35 ++msgid "" ++"B [ -c I ] [ -e ] -j I [ -m I ] [ -n I ] [ -o I ] [ -p I ] [ -t " ++"I ] I<filename>" ++msgstr "" ++"B<cupsfilter> [ -c I<Konfig-Datei> ] [ -e ] -j I<Auftrags-ID[,N]> [ -m " ++"I<MIME/Typ> ] [ -n I<Kopien> ] [ -o I<Name=Wert> ] [ -p I<Dateiname.ppd> ] " ++"[ -t I<Titel> ] I<Dateiname>" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:39 ++msgid "" ++"I<cupsfilter> is a front-end to the CUPS filter subsystem which allows you " ++"to convert a file to a specific format, just as if you had printed the file " ++"through CUPS. By default, I<cupsfilter> generates a PDF file." ++msgstr "" ++"I<cupsfilter> ist eine Oberfläche für das CUPS-Filter-Subsystem, das es " ++"erlaubt, eine Datei in ein spezielles Format umzuwandeln, als ob Sie diese " ++"Datei mittels CUPS gedruckt hätten. Standardmäßig erzeugt I<cupsfilter> eine " ++"PDF-Datei." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:44 ++msgid "Uses the named cupsd.conf configuration file." ++msgstr "Verwendet die benannte cupsd.conf-Konfigurationsdatei." ++ ++#. type: TP ++#: cupsfilter.man:44 ++#, no-wrap ++msgid "-e" ++msgstr "-e" ++ ++#. type: Plain text ++#: cupsfilter.man:48 ++msgid "Use every filter from the PPD file." ++msgstr "Verwende jeden Filter aus der PPD-Datei." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:48 ++#, no-wrap ++msgid "-j job-id[,N]" ++msgstr "-i Auftrags-ID[,N]" ++ ++#. type: Plain text ++#: cupsfilter.man:53 ++msgid "" ++"Converts document N from the specified job. If N is omitted, document 1 is " ++"converted." ++msgstr "" ++"Konvertiert Dokument aus dem spezifizierten Druckauftrag. Wenn N ausgelassen " ++"wird, wird Dokument 1 konvertiert." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:53 ++#, no-wrap ++msgid "-m mime/type" ++msgstr "-m MIME/Typ" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:59 ++msgid "" ++"Specifies the destination file type. The default file type is application/" ++"pdf. Use printer/foo to convert to the printer format defined by the " ++"filters in the PPD file." ++msgstr "" ++"Spezifiziert den Zieldateityp. Standardmäßig ist dies application/pdf. " ++"Verwenden Sie Drucker/foo, um zu dem Druckerformat, wie es von den Filtern " ++"in der PPD-Datei definiert ist, zu konvertieren." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:59 lp.man:109 ++#, no-wrap ++msgid "-n copies" ++msgstr "-n Kopien" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:63 ++msgid "Specifies the number of copies to generate." ++msgstr "Spezifiziert die Anzahl der zu erstellenden Kopien." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:63 cups-lpd.man.in:73 lpadmin.man:106 ++#, no-wrap ++msgid "-o name=value" ++msgstr "-o Name=Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:67 ++msgid "Specifies options to pass to the CUPS filters." ++msgstr "Spezifiziert die an die CUPS-Filter zu übergebenden Optionen." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:67 ++#, no-wrap ++msgid "-p filename.ppd" ++msgstr "-p Dateiname.ppd" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:71 ++msgid "Specifies the PPD file to use." ++msgstr "Spezifiziert die zu verwendende PPD-Datei." ++ ++# type: TP ++#. type: TP ++#: cupsfilter.man:71 ++#, no-wrap ++msgid "-t title" ++msgstr "-t Titel" ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:75 ++msgid "Specifies the document title." ++msgstr "Spezifiziert den Dokumententitel." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:78 ++msgid "" ++"I<cupsfilter> currently does not use the filters defined in the PPD file. " ++"This will be addressed in a future CUPS release." ++msgstr "" ++"I<cupsfilter> verwendet derzeit die in der PPD-Datei definierten Filter " ++"nicht. Dies wird in zukünftigen Veröffentlichungen von CUPS berücksichtigt." ++ ++# type: Plain text ++#. type: Plain text ++#: cupsfilter.man:80 ++msgid "I<cupsd.conf(5)>" ++msgstr "I<cupsd.conf(5)>" ++ ++# type: TH ++#. type: TH ++#: cups-lpd.man.in:15 ++#, no-wrap ++msgid "cups-lpd" ++msgstr "cups-lpd" ++ ++#. type: TH ++#: cups-lpd.man.in:15 ++#, no-wrap ++msgid "4 August 2008" ++msgstr "4. August 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:18 ++msgid "cups-lpd - receive print jobs and report printer status to lpd clients" ++msgstr "" ++"cups-lpd - empfange Druckaufträge und berichte Druckerstatus an lpd-Clients" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:25 ++msgid "B<cups-lpd> [ -h I<hostname[:port]> ] [ -n ] [ -o I<option=value> ]" ++msgstr "B<cups-lpd> [ -h I<Rechnername[:Port]> ] [ -n ] [ -o I<Option=Wert> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:33 ++msgid "" ++"I<cups-lpd> is the CUPS Line Printer Daemon (\"LPD\") mini-server that " ++"supports legacy client systems that use the LPD protocol. I<cups-lpd> does " ++"not act as a standalone network daemon but instead operates using the " ++"Internet \"super-server\" I<inetd(8)> or I<xinetd(8)>. If you are using " ++"I<inetd>, add the following line to the I<inetd.conf> file to enable the " ++"I<cups-lpd> mini-server:" ++msgstr "" ++"I<cups-lpd> ist der CUPS-Line-Printer-Daemon (»LPD«)-Mini-Server, der alte " ++"Client-Systeme unterstützt, die das LPD-Protokoll benutzen. I<cups-lpd> " ++"agiert nicht als selbstständiger Netzwerk-Daemon, aber stattdessen benutzt " ++"es den Internet-»Super-Server« I<inetd(8)> oder I<xinetd(8)>. Falls Sie " ++"I<inetd> benutzen, fügen Sie die folgende Zeile zur I<inetd.conf>-Datei " ++"hinzu, um den I<cups-lpd>-Mini-Server einzuschalten:" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:38 ++#, no-wrap ++msgid "" ++" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" ++" -o document-format=application/octet-stream\n" ++msgstr "" ++" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" ++" -o document-format=application/octet-stream\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:44 ++msgid "" ++"B<Note:> If you are using Solaris 10 or higher, you must run the I<inetdconv" ++"(1m)> program to register the changes to the inetd.conf file." ++msgstr "" ++"B<Hinweis:> Falls Sie Solaris 10 oder höher betreiben, müssen Sie das " ++"Programm I<inetdconv(1m)> ausführen, um die Änderungen an der Datei inetd." ++"conf zu registrieren." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:47 ++msgid "" ++"If you are using the newer I<xinetd(8)> daemon, create a file named I</etc/" ++"xinetd.d/cups> containing the following lines:" ++msgstr "" ++"Falls Sie den neueren Daemon I<xinetd(8)> verwenden, erstellen Sie eine " ++"Datei mit Namen I</etc/xinetd.d/cups> und dem folgenden Inhalt:" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:61 ++#, no-wrap ++msgid "" ++" service printer\n" ++" {\n" ++" socket_type = stream\n" ++" protocol = tcp\n" ++" wait = no\n" ++" user = lp\n" ++"\tgroup = sys\n" ++"\tpassenv =\n" ++" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" ++"\tserver_args = -o document-format=application/octet-stream\n" ++" }\n" ++msgstr "" ++" service printer\n" ++" {\n" ++" socket_type = stream\n" ++" protocol = tcp\n" ++" wait = no\n" ++" user = lp\n" ++"\tgroup = sys\n" ++"\tpassenv =\n" ++" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" ++"\tserver_args = -o document-format=application/octet-stream\n" ++" }\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:67 ++msgid "Sets the CUPS server (and port) to use." ++msgstr "Setzt den zu benutzenden CUPS-Server (und Port)." ++ ++# type: TP ++#. type: TP ++#: cups-lpd.man.in:67 ++#, no-wrap ++msgid "-n" ++msgstr "-n" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:73 ++msgid "" ++"Disables reverse address lookups; normally I<cups-lpd> will try to discover " ++"the hostname of the client via a reverse DNS lookup." ++msgstr "" ++"Deaktiviert inverse Adressabfragen, normalerweise wird I<cups-lpd> " ++"versuchen, den Rechnernamen eines Clients über inverse DNS-Abfragen zu " ++"ermitteln." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:81 ++msgid "" ++"Inserts options for all print queues. Most often this is used to disable the " ++"\"l\" filter so that remote print jobs are filtered as needed for printing; " ++"the examples in the previous section set the \"document-format\" option to " ++"\"application/octet-stream\" which forces autodetection of the print file " ++"format." ++msgstr "" ++"Fügt Optionen für alle Druckerwarteschlangen ein. Meistens wird dies zur " ++"Deaktivierung des Filters »l« verwandt, so dass nicht-lokale Druckaufträge " ++"wie für den Druck benötigt gefiltert werden. Die Beispiele im vorherigen " ++"Abschnitt setzten die Option »document-format« auf »application/octet-" ++"stream«, womit die automatische Erkennung des Druckdateiformats erzwungen " ++"wird." ++ ++# type: SH ++#. type: SH ++#: cups-lpd.man.in:81 ++#, no-wrap ++msgid "PERFORMANCE" ++msgstr "DURCHSATZ" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:88 ++msgid "" ++"I<cups-lpd> performs well with small numbers of clients and printers. " ++"However, since a new process is created for each connection and since each " ++"process must query the printing system before each job submission, it does " ++"not scale to larger configurations. We highly recommend that large " ++"configurations use the native IPP support provided by CUPS instead." ++msgstr "" ++"I<cups-lpd> läuft gut mit einer kleinen Anzahl an Clients und Druckern. Da " ++"allerdings für jede Verbindung ein Prozess erstellt wird und jeder Prozess " ++"das Drucksystem vor Einreichen jedes Auftrags abfragen muss, ist es schlecht " ++"an größere Konfigurationen angepasst. Wir empfehlen nachdrücklich, dass " ++"große Konfigurationen die von CUPS direkt bereitgestellte IPP-Unterstützung " ++"verwenden." ++ ++# type: SH ++#. type: SH ++#: cups-lpd.man.in:88 ++#, no-wrap ++msgid "SECURITY" ++msgstr "SICHERHEIT" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:95 ++msgid "" ++"I<cups-lpd> currently does not perform any access control based on the " ++"settings in I<cupsd.conf(5)> or in the I<hosts.allow(5)> or I<hosts.deny(5)> " ++"files used by TCP wrappers. Therefore, running I<cups-lpd> on your server " ++"will allow any computer on your network (and perhaps the entire Internet) to " ++"print to your server." ++msgstr "" ++"I<cups-lpd> führt derzeit keine auf den Einstellungen in I<cupsd.conf(5)> " ++"oder in den von TCP-Wrappers verwandten Dateien I<hosts.allow(5)> oder " ++"I<hosts.deny(5)> basierte Zugriffskontrolle durch. Daher wird die Ausführung " ++"von I<cups-lpd> auf Ihrem Server es allen Computern in Ihrem Netz (und " ++"möglicherweise allen im Internet) erlauben, auf Ihrem Server zu drucken." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:100 ++msgid "" ++"While I<xinetd> has built-in access control support, you should use the TCP " ++"wrappers package with I<inetd> to limit access to only those computers that " ++"should be able to print through your server." ++msgstr "" ++"Obwohl I<xinetd> über eingebaute Zugriffskontrolle verfügt, sollten Sie das " ++"Paket TCP-Wrappers mit I<inetd> verwenden, um den Zugriff auf solche " ++"Computer zu beschränken, denen es erlaubt sein soll, über Ihren Server zu " ++"drucken." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:104 ++msgid "" ++"I<cups-lpd> is not enabled by the standard CUPS distribution. Please " ++"consult with your operating system vendor to determine whether it is enabled " ++"on your system." ++msgstr "" ++"I<cups-lpd> wird von der Standard-CUPS-Distribution nicht aktiviert. Bitte " ++"fragen Sie beim Betriebssystem-Vertreiber nach, ob es auf Ihrem System " ++"aktiviert ist oder nicht." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:110 ++msgid "" ++"I<cups-lpd> does not enforce the restricted source port number specified in " ++"RFC 1179, as using restricted ports does not prevent users from submitting " ++"print jobs. While this behavior is different than standard Berkeley LPD " ++"implementations, it should not affect normal client operations." ++msgstr "" ++"I<cups-lpd> erzwingt die in RFC 1179 spezifizierte eingeschränkte " ++"Quellportnummer nicht, da eingeschränkte Ports Benutzer nicht vom Einreichen " ++"von Druckaufträgen abhalten. Obwohl dieses Verhalten sich von " ++"standardmäßigen Berkeley-LPD-Implementierungen unterscheidet, sollte es den " ++"normalen Betrieb von Clients nicht betreffen." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:115 ++msgid "" ++"The output of the status requests follows RFC 2569, Mapping between LPD and " ++"IPP Protocols. Since many LPD implementations stray from this definition, " ++"remote status reporting to LPD clients may be unreliable." ++msgstr "" ++"Die Ausgabe der Statusabfragen folgt RFC 2569 »Mapping between LPD and IPP " ++"Protocols«. Da viele LPD-Implementierungen von dieser Definition abweichen, " ++"könnte die nicht-lokale Statusberichterstattung an LDP-Clients unzuverlässig " ++"sein." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-lpd.man.in:118 ++msgid "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," ++msgstr "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," ++ ++# type: TH ++#. type: TH ++#: cups-polld.man:15 ++#, no-wrap ++msgid "cups-polld" ++msgstr "cups-polld" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-polld.man:18 ++msgid "cups-polld - cups printer polling daemon" ++msgstr "cups-polld - CUPS-Druckerabfrage-Daemon" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-polld.man:21 ++msgid "B<cups-polld> I<address ipp-port interval browse-port>" ++msgstr "B<cups-polld> I<Adresse IPP-Port Intervall Port-für-Durchsuchung>" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-polld.man:27 ++msgid "" ++"I<cups-polld> polls remote servers for a list of available printers and " ++"printer classes every I<interval> seconds. Printer and class information is " ++"then broadcast to the localhost interface (127.0.0.1) on the specified " ++"browse port for reception by I<cupsd(8)>." ++msgstr "" ++"I<cups-polld> fragt alle I<interval> Sekunden ferne Server ab, um eine Liste " ++"verfügbarer Drucker und Druckerklassen zu erhalten. Drucker- und " ++"Klasseninformationen werden dann an die Localhost-Schnittstelle (127.0.0.1) " ++"auf dem angegebenen Port für die Durchsuchung für den Empfang durch I<cupsd" ++"(8)> gesendet." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-polld.man:30 ++msgid "" ++"This program is started automatically by I<cupsd> for every I<BrowsePoll> " ++"directive found in the I<cupsd.conf(5)> file." ++msgstr "" ++"Dieses Programm wird von I<cupsd> für jede in der Datei I<cupsd.conf(5)> " ++"gefundene Direktive I<BrowsePoll> gestartet." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-polld.man:32 ++msgid "I<cupsd(8)>, I<cupsd.conf(5)>," ++msgstr "I<cupsd(8)>, I<cupsd.conf(5)>," ++ ++# type: TH ++#. type: TH ++#: cups-snmp.conf.man:15 ++#, no-wrap ++msgid "snmp.conf" ++msgstr "snmp.conf" ++ ++# type: TH ++#. type: TH ++#: cups-snmp.conf.man:15 ++#, no-wrap ++msgid "31 July 2006" ++msgstr "31. Juli 2006" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:18 ++msgid "snmp.conf - snmp configuration file for cups" ++msgstr "snmp.conf - SNMP-Konfigurationsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:24 ++msgid "" ++"The I<snmp.conf> file configures the CUPS SNMP printer discovery backend and " ++"is normally located in the I</etc/cups> directory. Each line in the file can " ++"be a configuration directive, a blank line, or a comment. Comment lines " ++"start with the # character." ++msgstr "" ++"Die Datei I<snmp.conf> konfiguriert das SNMP-Drucker-Ermittlungs-Backend von " ++"CUPS und befindet sich normalerweise im Verzeichnis I</etc/cups>. Jede Zeile " ++"in der Datei kann eine Konfigurationsdirektive, eine Leerzeile oder ein " ++"Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:30 ++msgid "" ++"The SNMP backend uses the SNMPv1 protocol to discover network printers, " ++"collecting information from the Host MIB along with intelligent port probes " ++"to determine the correct device URI and make and model for each printer. " ++"Future versions of CUPS will likely support the new Port Monitor MIB as well." ++msgstr "" ++"Das SNMP-Backend benutzt das SNMPv1-Protokoll, um Netzwerkdrucker zu suchen, " ++"Informationen vom MIB-Host zu sammeln, zusammen mit intelligenten Port-" ++"Untersuchungen, um für jeden Drucker die korrekte Geräte-URI, Hersteller und " ++"Modell zu bestimmen. Zukünftige Versionen von CUPS werden wahrscheinlich " ++"auch den neuen Port-Monitor MIB unterstützen." ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:33 ++msgid "" ++"The following directives are understood by the SNMP backend. Consult the on-" ++"line help for detailed descriptions:" ++msgstr "" ++"Die folgenden Direktiven werden vom SNMP-Backend verstanden. Für eine " ++"detaillierte Beschreibung schauen Sie bitte in die Online-Hilfe:" ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:33 ++#, no-wrap ++msgid "Address @IF(I<name>)" ++msgstr "Address @IF(I<Name>)" ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:35 ++#, no-wrap ++msgid "Address @LOCAL" ++msgstr "Address @LOCAL" ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:37 ++#, no-wrap ++msgid "Address I<address>" ++msgstr "Address I<Adresse>" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:43 ++msgid "" ++"Sends SNMP broadcast queries to the specified address(es). The default " ++"address is \"@LOCAL\" which broadcasts to all LAN interfaces." ++msgstr "" ++"Sendet SNMP-Übertragungsanfragen an die angegebene(n) Adresse(n). Die " ++"Vorgabeadresse ist »@LOCAL«, die an alle LAN-Schnittstellen überträgt." ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:43 ++#, no-wrap ++msgid "Community I<name>" ++msgstr "Community I<Name>" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:48 ++msgid "" ++"Specifies a SNMP community to query. The default community is \"public\"." ++msgstr "" ++"Spezifiziert die SNMP-Gemeinschaft zum Abfragen. Die Vorgabegemeinschaft ist " ++"»public«." ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:48 ++#, no-wrap ++msgid "DebugLevel I<N>" ++msgstr "DebugLevel I<N>" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:54 ++msgid "" ++"Sets the debug logging level to I<N>; 0 disables debug logging, 1 enables " ++"basic logging, 2 displays SNMP values, and 3 displays raw hex data." ++msgstr "" ++"Setzt die Fehlersucheprotokollierstufe auf I<N>; 0 deaktiviert das " ++"Fehlersucheprotokollieren, 1 aktiviert grundlegendes Protokollieren, 2 zeigt " ++"SNMP-Werte und 3 zeigt rohe hexadezimale Daten." ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:54 ++#, no-wrap ++msgid "HostNameLookups on" ++msgstr "HostNameLookups on" ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:56 ++#, no-wrap ++msgid "HostNameLookups off" ++msgstr "HostNameLookups off" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:62 ++msgid "" ++"Specifies whether the addresses of printers should be converted to hostnames " ++"or left as numeric IP addresses. The default is \"off\"." ++msgstr "" ++"Spezifiziert, ob die Druckeradressen in Rechnernamen konvertiert werden oder " ++"als numerische IP-Adressen verbleiben sollen. Der Vorgabewert ist »off«." ++ ++# type: TP ++#. type: TP ++#: cups-snmp.conf.man:62 ++#, no-wrap ++msgid "MaxRunTime I<seconds>" ++msgstr "MaxRunTime I<Sekunden>" ++ ++# type: Plain text ++#. type: Plain text ++#: cups-snmp.conf.man:67 ++msgid "" ++"Specifies the maximum number of seconds that the SNMP backend will scan the " ++"network for printers." ++msgstr "" ++"Spezifiziert die maximale Zeit in Sekunden, für die das SNMP-Backend das " ++"Netz nach Druckern durchsuchen wird." ++ ++# type: TH ++#. type: TH ++#: cupstestdsc.man:15 ++#, no-wrap ++msgid "cupstestdsc" ++msgstr "cupstestdsc" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:18 ++msgid "cupstestdsc - test conformance of postscript files" ++msgstr "cupstestdsc - überprüfe Konformität von PostScript-Dateien" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:23 ++msgid "B<cupstestdsc> [ -h ] filename.ps [ ... I<filenameN.ps> ]" ++msgstr "B<cupstestdsc> [ -h ] Dateiname.ps [ ... I<DateinameN.ps> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:26 ++msgid "B<cupstestdsc> [ -h ] -" ++msgstr "B<cupstestdsc> [ -h ] -" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:32 ++msgid "" ++"I<cupstestdsc> tests the conformance of PostScript files to the Adobe " ++"PostScript Language Document Structuring Conventions Specification version " ++"3.0. The results of testing and any other output are sent to the standard " ++"output. The second form of the command reads PostScript from the standard " ++"input." ++msgstr "" ++"I<cupstestdsc> überprüft die Konformität von PostScript-Dateien zu der Adobe " ++"PostScript Language Document Structuring Conventions Specification Version " ++"3.0. Das Ergebnis des Tests und alle anderen Ausgaben werden an die " ++"Standardausgabe gesandt. Die zweite Form des Befehls liest PostScript von " ++"der Standardeingabe." ++ ++# type: SH ++#. type: SH ++#: cupstestdsc.man:32 lpadmin.man:196 lpc.man:53 ++#, no-wrap ++msgid "LIMITATIONS" ++msgstr "EINSCHRÄNKUNGEN" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:41 ++msgid "" ++"I<cupstestdsc> only validates the DSC comments in a PostScript file and does " ++"not attempt to validate the PostScript code itself. Developers must ensure " ++"that the PostScript they generate follows the rules defined by Adobe. " ++"Specifically, all pages must be independent of each other, code outside page " ++"descriptions may not affect the graphics state (current font, color, " ++"transform matrix, etc.), and device-specific commands such as setpagedevice " ++"should not be used." ++msgstr "" ++"I<cupstestdsc> validiert nur die DSC-Kommentare in einer PostScript-Datei " ++"und versucht nicht, den PostScript-Code selbst zu validieren. Entwickler " ++"müssen sicherstellen, dass das von ihnen generierte PostScript den von Adobe " ++"definierten Regeln folgt. Insbesondere müssen alle Seiten voneinander " ++"unabhängig sein, Code außerhalb der Seitenbeschreibung sollte nicht den " ++"Graphikzustand betreffen (derzeit Schrift, Farbe, Transformationsmatrix " ++"usw.) und Geräte-spezifische Befehle wie setpagedevice sollten nicht " ++"verwandt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestdsc.man:46 ++msgid "" ++"Adobe PostScript Language Document Structuring Conventions Specification, " ++"Version 3.0." ++msgstr "" ++"Adobe PostScript Language Document Structuring Conventions Specification, " ++"Version 3.0." ++ ++# type: TH ++#. type: TH ++#: cupstestppd.man:15 ++#, no-wrap ++msgid "cupstestppd" ++msgstr "cupstestppd" ++ ++# type: TH ++#. type: TH ++#: cupstestppd.man:15 ++#, no-wrap ++msgid "19 November 2009" ++msgstr "19. November 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:18 ++msgid "cupstestppd - test conformance of ppd files" ++msgstr "cupstestppd - überprüfe Konformität von PPD-Dateien" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:27 ++msgid "" ++"B<cupstestppd> [ -I I<category> ] [ -R I<rootdir> ] [ -W I<category> ] [ -" ++"q ] [-r] [ -v[v] ] filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]" ++msgstr "" ++"B<cupstestppd> [ -I I<Kategorie> ] [ -R I<Wurzelverz> ] [ -W I<Kategorie> ] " ++"[ -q ] [-r] [ -v[v] ] Dateiname.ppd[.gz] [ ... DateinameN.ppd[.gz] ]" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:34 ++msgid "" ++"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] -" ++msgstr "" ++"B<cupstestppd> [ -R I<Wurzelverz> ] [ -W I<Kategorie> ] [ -q ] [-r] [ -v" ++"[v] ] -" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:40 ++msgid "" ++"I<cupstestppd> tests the conformance of PPD files to the Adobe PostScript " ++"Printer Description file format specification version 4.3. It can also be " ++"used to list the supported options and available fonts in a PPD file. The " ++"results of testing and any other output are sent to the standard output." ++msgstr "" ++"I<cupstestppd> überprüft die Konformität von PPD-Dateien zu der Adobe " ++"PostScript Printer Description-Dateiformatspezifikation Version 4.3. Es kann " ++"auch zur Auflistung der in einer PPD-Datei unterstützen Optionen und " ++"verfügbaren Schriften verwandt werden. Das Ergebnis des Tests und alle " ++"anderen Ausgaben werden an die Standardausgabe gesandt." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:44 ++msgid "" ++"The first form of I<cupstestppd> tests one or more PPD files on the command-" ++"line. The second form tests the PPD file provided on the standard input." ++msgstr "" ++"Die erste Form von I<cupstestppd> überprüft eine oder mehrere PPD-Dateien " ++"auf der Kommandozeile. Die zweite Form überprüft die auf der Standardeingabe " ++"übergebene PPD-Datei." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:46 ++msgid "I<cupstestppd> supports the following options:" ++msgstr "I<cupstestppd> unterstützt die folgenden Optionen:" ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:46 ++#, no-wrap ++msgid "-I filename" ++msgstr "-I filename" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:50 ++msgid "Ignores all PCFileName warnings." ++msgstr "Ignoriert alle PCFileName-Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:50 ++#, no-wrap ++msgid "-I filters" ++msgstr "-I filters" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:54 ++msgid "Ignores all filter errors." ++msgstr "Ignoriert alle Filter-Fehler." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:54 ++#, no-wrap ++msgid "-I profiles" ++msgstr "-I profiles" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:58 ++msgid "Ignores all profile errors." ++msgstr "Ignoriert alle Profile-Fehler." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:58 ++#, no-wrap ++msgid "-R rootdir" ++msgstr "-R Wurzelverz" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:63 ++msgid "" ++"Specifies an alternate root directory for the filter, pre-filter, and other " ++"support file checks." ++msgstr "" ++"Spezifiziert ein alternatives Wurzelverzeichnis für die filter-, pre-filter- " ++"und andere unterstützte Dateiüberprüfungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:63 ++#, no-wrap ++msgid "-W constraints" ++msgstr "-W constraints" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:67 ++msgid "Report all UIConstraint errors as warnings." ++msgstr "Berichtet alle UIConstraint-Fehler als Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:67 ++#, no-wrap ++msgid "-W defaults" ++msgstr "-W defaults" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:71 ++msgid "" ++"Except for size-related options, report all default option errors as " ++"warnings." ++msgstr "" ++"Berichtet alle Standard-Optionsfehler, außer größenbezogene Optionen, als " ++"Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:71 ++#, no-wrap ++msgid "-W filters" ++msgstr "-W filters" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:75 ++msgid "Report all filter errors as warnings." ++msgstr "Berichtet alle Filterfehler als Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:75 ++#, no-wrap ++msgid "-W profiles" ++msgstr "-W profiles" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:79 ++msgid "Report all profile errors as warnings." ++msgstr "Alle Profilfehler als Warnungen berichten." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:79 ++#, no-wrap ++msgid "-W sizes" ++msgstr "-W sizes" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:83 ++msgid "Report all media size errors as warnings." ++msgstr "Alle Mediengrößenfehler als Warnungen berichten." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:83 ++#, no-wrap ++msgid "-W translations" ++msgstr "-W translations" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:87 ++msgid "Report all translation errors as warnings." ++msgstr "Berichtet alle Übersetzungsfehler als Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:87 ++#, no-wrap ++msgid "-W all" ++msgstr "-W all" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:91 ++msgid "Report all of the previous errors as warnings." ++msgstr "Berichtet alle vorhergehenden Fehler als Warnungen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:91 ++#, no-wrap ++msgid "-W none" ++msgstr "-W none" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:95 ++msgid "Report all of the previous errors as errors." ++msgstr "Berichtet alle bisherigen Fehler als Fehler" ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:95 lpr.man:101 ++#, no-wrap ++msgid "-q" ++msgstr "-q" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:99 ++msgid "Specifies that no information should be displayed." ++msgstr "Spezifiziert, dass keine Information angezeigt werden soll." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:99 lpr.man:105 lpstat.man:101 ++#, no-wrap ++msgid "-r" ++msgstr "-r" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:105 ++msgid "" ++"Relaxes the PPD conformance requirements so that common whitespace, control " ++"character, and formatting problems are not treated as hard errors." ++msgstr "" ++"Weicht die PPD-Konformitätsanforderungen auf, so dass typische Leerzeichen-, " ++"Steuerzeichen und Formatierungsprobleme nicht als schwere Fehler behandelt " ++"werden." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:110 ++msgid "" ++"Specifies that detailed conformance testing results should be displayed " ++"rather than the concise PASS/FAIL/ERROR status." ++msgstr "" ++"Spezifiziert, dass detaillierte Konformitätstestergebnisse anstatt des " ++"knappen »PASS/FAIL/ERROR« Statusses angezeigt werden sollen." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:110 ++#, no-wrap ++msgid "-vv" ++msgstr "-vv" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:116 ++msgid "" ++"Specifies that all information in the PPD file should be displayed in " ++"addition to the detailed conformance testing results." ++msgstr "" ++"Spezifiziert, dass alle Informationen in der PPD-Datei zusätzlich zu den " ++"detaillierten Konformitätstestergebnissen angezeigt werden sollen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:118 ++msgid "The I<-q>, I<-v>, and I<-vv> options are mutually exclusive." ++msgstr "" ++"Die Optionen I<-q>, I<-v> und I<-vv> schließen sich gegenseitig paarweise " ++"aus." ++ ++# type: SH ++#. type: SH ++#: cupstestppd.man:118 ++#, no-wrap ++msgid "EXIT STATUS" ++msgstr "EXIT-STATUS" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:121 ++msgid "" ++"I<cupstestppd> returns zero on success and non-zero on error. The error " ++"codes are as follows:" ++msgstr "" ++"I<cupstestppd> liefert Null bei Erfolg und nicht-Null im Fehlerfall. Die " ++"Fehlercodes lauten wie folgt:" ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:121 ++#, no-wrap ++msgid "1" ++msgstr "1" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:125 ++msgid "Bad command-line arguments or missing PPD filename." ++msgstr "Fehlerhafte Kommandozeilen-Argumente oder fehlender PPD-Dateiname." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:125 ++#, no-wrap ++msgid "2" ++msgstr "2" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:129 ++msgid "Unable to open or read PPD file." ++msgstr "PPD-Datei kann nicht geöffnet oder gelesen werden." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:129 ++#, no-wrap ++msgid "3" ++msgstr "3" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:133 ++msgid "The PPD file contains format errors that cannot be skipped." ++msgstr "" ++"Die PPD-Datei enthält Formatfehler, die nicht übersprungen werden können." ++ ++# type: TP ++#. type: TP ++#: cupstestppd.man:133 ++#, no-wrap ++msgid "4" ++msgstr "4" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:137 ++msgid "The PPD file does not conform to the Adobe PPD specification." ++msgstr "Die PPD-Datei folgt nicht der Adobe PPD-Spezifikation." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:141 ++msgid "" ++"The following command will test all PPD files under the current directory " ++"and print the names of each file that does not conform:" ++msgstr "" ++"Der folgende Befehl überprüft alle PPD-Dateien unterhalb des aktuellen " ++"Verzeichnisses und gibt die Namen aller Dateien aus, die nicht der " ++"Spezifikation folgen:" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:144 ++#, no-wrap ++msgid " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" ++msgstr " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:149 ++msgid "" ++"The next command tests all PPD files under the current directory and print " ++"detailed conformance testing results for the files that do not conform:" ++msgstr "" ++"Der nächste Befehl überprüft alle PPD-Dateien unterhalb des aktuellen " ++"Verzeichnisse und gibt detaillierte Konformitätstestergebnisse für die " ++"Dateien aus, die keine Konformität aufweisen." ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:153 ++#, no-wrap ++msgid "" ++" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" ++" -exec cupstestppd -v '{}' \\e;\n" ++msgstr "" ++" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" ++" -exec cupstestppd -v '{}' \\e;\n" ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:157 lpinfo.man:109 ++msgid "I<lpadmin(8)>," ++msgstr "I<lpadmin(8)>," ++ ++# type: Plain text ++#. type: Plain text ++#: cupstestppd.man:161 ++msgid "" ++"Adobe PostScript Printer Description File Format Specification, Version 4.3." ++msgstr "" ++"Adobe PostScript Printer Description File Format Specification, Version 4.3." ++ ++# type: TH ++#. type: TH ++#: filter.man:15 ++#, no-wrap ++msgid "filter" ++msgstr "filter" ++ ++# type: TH ++#. type: TH ++#: filter.man:15 ++#, no-wrap ++msgid "13 May 2009" ++msgstr "13. Mai 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:18 ++msgid "filter - cups file conversion filter interface" ++msgstr "filter - CUPS-Datei-Umwandlungsfilter-Schnittstelle" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:23 ++msgid "B<filter> job user title num-copies options [ I<filename> ]" ++msgstr "B<filter> Auftrag Benutzer Titel Anz-Kopien Optionen [ I<Dateiname> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:28 ++msgid "" ++"The CUPS filter interface provides a standard method for adding support for " ++"new document types to CUPS. Each filter is capable of converting from one or " ++"more input formats to another format that can either be printed directly or " ++"piped into another filter to get it to a printable format." ++msgstr "" ++"Die CUPS-Filterschnittstelle stellt eine Standardmethode zum Hinzufügen von " ++"Unterstützungen für neue Dokumententypen zu CUPS bereit. Jeder Filter ist in " ++"der Lage, von einem oder mehreren Eingabeformaten in andere Ausgabeformate " ++"zu konvertieren, die entweder direkt gedruckt oder an einen weiteren Filter " ++"weitergeleitet werden können, der es dann in ein druckbares Format wandelt." ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:33 ++msgid "" ++"Filters B<must> be capable of reading from a filename on the command-line or " ++"from the standard input, copying the standard input to a temporary file as " ++"required by the file format. All output B<must> be sent to the standard " ++"output." ++msgstr "" ++"Filter B<müssen> in der Lage sein, aus einem Dateinamen auf der " ++"Kommandozeile oder der Standardeingabe zu lesen und in letzterem Fall die " ++"Standardeingabe in eine temporäre Datei zu kopieren, wie dies vom " ++"Dateiformat benötigt wird. Die gesamte Ausgabe B<muss> an die " ++"Standardausgabe gesandt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:36 ++msgid "" ++"The command name (argv[0]) is set to the name of the destination printer but " ++"is also available in the PRINTER environment variable." ++msgstr "" ++"Der Befehlsname (argv[0]) wird auf den Namen des Zieldruckers gesetzt. Er " ++"ist aber auch über die Umgebungsvariable PRINTER verfügbar." ++ ++#. type: Plain text ++#: filter.man:46 ++msgid "" ++"Options passed on the command-line typically do not include the default " ++"choices the printer's PPD file. In addition, some options may be specified " ++"in multiple ways - \"landscape\" is a synonym for \"orientation-" ++"requested=4\", \"media\" is a synonym for \"PageSize\", \"PageRegion\", " ++"\"InputSlot\", and \"MediaType\", and \"sides\" is a synonym for the various " ++"\"Duplex\" options. Non-raster filters B<must> support both explicit and " ++"implicit specification of PPD options - use the ppdMarkDefaults and " ++"cupsMarkOptions functions in the CUPS library to use the correct mapping, " ++"and ppdFindMarkedChoice to get the user-selected choice." ++msgstr "" ++"Optionen, die über die Befehlszeile eingegeben wurden, enthalten " ++"normalerweise die Vorgabeauswahl der PPD-Datei des Druckers. Zusätzlich " ++"könnten einige Optionen auf mehreren Wegen angegeben werden. »landscape« ist " ++"ein Synonym für »orientation-requested=4«, »media« ist ein Synonym für " ++"»PageSize«, »PageRegion«, »InputSlot« und »MediaType« und »sides« ist ein " ++"Synonym für verschiedene »Duplex«-Optionen. Nicht-Raster-Filter B<müssen> " ++"beide Spezifikationen von PPD-Optionen explizit und implizit unterstützen. " ++"Benutzen Sie die Funktionen ppdMarkDefaults und cupsMarkOptions in der CUPS-" ++"Bibliothek, um das korrekte Abbilden zu benutzen und ppdFindMarkedChoice, um " ++"die Auswahl des Benutzers zu erhalten. " ++ ++#. type: Plain text ++#: filter.man:51 ++msgid "" ++"Raster filters should use option choices set through the raster page header, " ++"as those reflect the options in effect for a given page. Options specified " ++"on the command-line determine the default values for the entire job, which " ++"can be overridden on a per-page basis." ++msgstr "" ++"Rasterfilter sollten ausgewählte Optionen benutzen, die durch die " ++"Rasterseitenkopfzeilen gesetzt wurden, da jene die tatsächlichen Optionen " ++"für eine angegebene Seite wiedergeben. Auf der Befehlszeile angegebene " ++"Optionen spezifizieren die Vorgabewerte für den ganzen Druckauftrag, die auf " ++"seitenweiser Basis überschrieben werden können." ++ ++# type: SH ++#. type: SH ++#: filter.man:52 ++#, no-wrap ++msgid "LOG MESSAGES" ++msgstr "PROTOKOLLNACHRICHTEN" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:56 ++msgid "" ++"Messages sent to stderr are generally logged to printer-state-message " ++"attribute and the current I<ErrorLog>. Each line begins with a standard " ++"prefix:" ++msgstr "" ++"Nachrichten, die an stderr gesendet werden, werden generell zum Printer-" ++"state-message-Attribut und das aktuelle I<ErrorLog> protokolliert werden. " ++"Jede Zeile beginnt mit einer Standard-Vorsilbe:" ++ ++# type: TP ++#. type: TP ++#: filter.man:57 ++#, no-wrap ++msgid "ALERT: message" ++msgstr "ALERT: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:62 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"alert\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »alter« hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:63 ++#, no-wrap ++msgid "ATTR: attribute=value [attribute=value]" ++msgstr "ATTR: Attribut=Wert [Attribut=Wert]" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:68 ++msgid "" ++"Sets the named job attribute(s). Typically this will be used to set the job-" ++"remote-id attribute." ++msgstr "" ++"Setzt das/die beannte(n) Attribut(e). Typischerweise wird dies zum Setzen " ++"des job-remote-id-Attributs benutzt." ++ ++# type: TP ++#. type: TP ++#: filter.man:69 ++#, no-wrap ++msgid "CRIT: message" ++msgstr "CRIT: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:74 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"critical\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »critical« " ++"hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:75 ++#, no-wrap ++msgid "DEBUG: message" ++msgstr "DEBUG: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:80 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"debug\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »debug« hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:81 ++#, no-wrap ++msgid "DEBUG2: message" ++msgstr "DEBUG2: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:86 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"debug2\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »debug2« hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:87 ++#, no-wrap ++msgid "EMERG: message" ++msgstr "EMERG: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:92 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"emergency\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »emergency« " ++"hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:93 ++#, no-wrap ++msgid "ERROR: message" ++msgstr "ERROR: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:98 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"error\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »error« hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:99 ++#, no-wrap ++msgid "INFO: message" ++msgstr "INFO: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:105 ++msgid "" ++"Sets the printer-state-message attribute. If the current I<LogLevel> is set " ++"to \"debug2\", also adds the specified message to the current I<ErrorLog> " ++"using the \"info\" log level." ++msgstr "" ++"Setzt das Printer-state-message-Attribut. Wenn der aktuelle I<LogLevel> auf " ++"»debug2« gesetzt ist, wird die angegebene Nachricht außerdem dem aktuellen " ++"I<ErrorLog> unter Benutzung der »info«-Protokollstufe hinzugefügt." ++ ++# type: TP ++#. type: TP ++#: filter.man:106 ++#, no-wrap ++msgid "NOTICE: message" ++msgstr "NOTICE: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:111 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"notice\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »notice« hinzu." ++ ++# type: TP ++#. type: TP ++#: filter.man:112 ++#, no-wrap ++msgid "PAGE: page-number #-copies" ++msgstr "PAGE: Seitenzahl #-Kopien" ++ ++# type: TP ++#. type: TP ++#: filter.man:114 ++#, no-wrap ++msgid "PAGE: total #-pages" ++msgstr "PAGE: Gesamt #-Seiten" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:120 ++msgid "" ++"Adds an entry to the current I<PageLog>. The first form adds #-copies to the " ++"job-media-sheets-completed attribute. The second form sets the job-media-" ++"sheets-completed attribute to #-pages." ++msgstr "" ++"Fügt einen Eintrag zum aktuellen I<PageLog> hinzu. Die erste Form fügt #-" ++"Kopien zum Attribut job-media-sheets-completed hinzu. Die zweite Form setzt " ++"das Attribut job-media-sheets-completed auf #-Seiten." ++ ++#. type: TP ++#: filter.man:121 ++#, no-wrap ++msgid "PPD: Keyword=Value ... KeywordN=Value" ++msgstr "PPD: Schlüsselwort=Wert ... SchlüsselwortN=Wert" ++ ++#. type: Plain text ++#: filter.man:127 ++msgid "" ++"Sets the named keywords in the printer's PPD file. This is typically used to " ++"update default option keywords such as DefaultPageSize and the various " ++"installable options in the PPD file." ++msgstr "" ++"Setzt die genannten Schlüsselworte in die PPD-Datei des Druckers. Dies wird " ++"normalerweise benutzt, um Standardschlüsselwortoptionen zu aktualisieren, " ++"wie DefaultPageSize und verschiedene installierbare Optionen in der PPD-" ++"Datei." ++ ++# type: TP ++#. type: TP ++#: filter.man:128 ++#, no-wrap ++msgid "STATE: printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: printer-state-reason [printer-state-reason ...]" ++ ++# type: TP ++#. type: TP ++#: filter.man:130 ++#, no-wrap ++msgid "STATE: + printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: + printer-state-reason [printer-state-reason ...]" ++ ++# type: TP ++#. type: TP ++#: filter.man:132 ++#, no-wrap ++msgid "STATE: - printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: - printer-state-reason [printer-state-reason ...]" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:138 ++msgid "" ++"Sets, adds, or removes printer-state-reason keywords to the current queue. " ++"Typically this is used to indicate media, ink, and toner conditions on a " ++"printer." ++msgstr "" ++"Setzt, enfernt oder fügt Printer-state-reason-Schlüsselwörter zu der " ++"aktuellen Druckschlange hinzu. Typischerweise wird dies benutzt, um Medien-, " ++"Tinten- und Toner-Bedingungen auf einem Drucker anzuzeigen." ++ ++# type: TP ++#. type: TP ++#: filter.man:139 ++#, no-wrap ++msgid "WARNING: message" ++msgstr "WARNING: Nachricht" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:144 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"warning\" log level." ++msgstr "" ++"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " ++"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »warning« " ++"hinzu." ++ ++# type: SH ++#. type: SH ++#: filter.man:145 ++#, no-wrap ++msgid "ENVIRONMENT VARIABLES" ++msgstr "UMGEBUNGSVARIABLEN" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:148 ++msgid "" ++"The following environment variables are defined by the CUPS server when " ++"executing the filter:" ++msgstr "" ++"Die folgenden Umgebungsvariablen sind vom CUPS-Server beim Ausführen von " ++"Filtern gesetzt:" ++ ++# type: TP ++#. type: TP ++#: filter.man:149 ++#, no-wrap ++msgid "CHARSET" ++msgstr "CHARSET" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:153 ++msgid "The default text character set, typically utf-8." ++msgstr "Der standard Textzeichensatz, typischerweise UTF-8." ++ ++# type: TP ++#. type: TP ++#: filter.man:154 ++#, no-wrap ++msgid "CLASS" ++msgstr "CLASS" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:160 ++msgid "" ++"When a job is submitted to a printer class, contains the name of the " ++"destination printer class. Otherwise this environment variable will not be " ++"set." ++msgstr "" ++"Wenn ein Druckauftrag an eine Druckerklasse gesandt wird, enthält er den " ++"Namen der Bestimmungsdruckerklasse. Ansonsten wird diese Umgebungsvariable " ++"nicht gesetzt." ++ ++# type: TP ++#. type: TP ++#: filter.man:161 ++#, no-wrap ++msgid "CONTENT_TYPE" ++msgstr "CONTENT_TYPE" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:166 ++msgid "The MIME type associated with the file (e.g. application/postscript)." ++msgstr "" ++"Der MIME-Typ, der der Datei zugeordnet ist (z.B. application/postscript)." ++ ++# type: TP ++#. type: TP ++#: filter.man:167 ++#, no-wrap ++msgid "CUPS_CACHEDIR" ++msgstr "CUPS_CACHEDIR" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:171 ++msgid "The directory for semi-persistent cache files can be found." ++msgstr "" ++"Das Verzeichnis für halb-beständige Zwischenspeicherdateien kann gefunden " ++"werden." ++ ++# type: TP ++#. type: TP ++#: filter.man:172 ++#, no-wrap ++msgid "CUPS_DATADIR" ++msgstr "CUPS_DATADIR" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:176 ++msgid "The directory where data files can be found." ++msgstr "Das Verzeichnis, in dem Datendateien gefunden werden können." ++ ++#. type: TP ++#: filter.man:177 ++#, no-wrap ++msgid "CUPS_FILETYPE" ++msgstr "CUPS_FILETYPE" ++ ++#. type: Plain text ++#: filter.man:182 ++msgid "" ++"The type of file being printed: \"job-sheet\" for a banner page and " ++"\"document\" for a regular print file." ++msgstr "" ++"Der Typ der Datei, die gedruckt wird: »job-sheet« für ein Deckblatt und " ++"»document« für eine reguläre Druckdatei." ++ ++# type: TP ++#. type: TP ++#: filter.man:183 ++#, no-wrap ++msgid "CUPS_SERVERROOT" ++msgstr "CUPS_SERVERROOT" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:187 ++msgid "The root directory of the server." ++msgstr "Das Wurzelverzeichnis des Servers." ++ ++# type: TP ++#. type: TP ++#: filter.man:188 ++#, no-wrap ++msgid "DEVICE_URI" ++msgstr "DEVICE_URI" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:192 ++msgid "The device-uri associated with the printer." ++msgstr "Die mit dem Drucker verbundene Geräte-URI." ++ ++# type: TP ++#. type: TP ++#: filter.man:193 ++#, no-wrap ++msgid "FINAL_CONTENT_TYPE" ++msgstr "FINAL_CONTENT_TYPE" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:198 ++msgid "" ++"The MIME type associated with the printer (e.g. application/vnd.cups-" ++"postscript)." ++msgstr "" ++"Der MIME-Typ, der dem Drucker zugeordnet ist (z.B. application/vnd.cups-" ++"postscript)." ++ ++# type: TP ++#. type: TP ++#: filter.man:199 ++#, no-wrap ++msgid "LANG" ++msgstr "LANG" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:203 ++msgid "The default language locale (typically C or en)." ++msgstr "Die Standardsprach-Locale (normalerweise C oder en)." ++ ++# type: TP ++#. type: TP ++#: filter.man:204 ++#, no-wrap ++msgid "PATH" ++msgstr "PATH" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:209 ++msgid "" ++"The standard execution path for external programs that may be run by the " ++"filter." ++msgstr "" ++"Der Standard-Ausführungspfad für externe Programme, die vom Filter " ++"ausgeführt werden dürfen." ++ ++# type: TP ++#. type: TP ++#: filter.man:210 ++#, no-wrap ++msgid "PPD" ++msgstr "PPD" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:215 ++msgid "" ++"The full pathname of the PostScript Printer Description (PPD) file for this " ++"printer." ++msgstr "" ++"Der komplette Pfadname zu der PostScript Printer Description (PPD)-Datei für " ++"diesen Drucker." ++ ++# type: TP ++#. type: TP ++#: filter.man:216 ++#, no-wrap ++msgid "PRINTER" ++msgstr "PRINTER" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:220 ++msgid "The name of the printer." ++msgstr "Der Name des Druckers." ++ ++# type: TP ++#. type: TP ++#: filter.man:221 ++#, no-wrap ++msgid "RIP_CACHE" ++msgstr "RIP_CACHE" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:226 ++msgid "" ++"The recommended amount of memory to use for Raster Image Processors (RIPs)." ++msgstr "" ++"Die empfohlene Speichermenge zum Einsatz für Raster Image Processors (RIPs)." ++ ++# type: TP ++#. type: TP ++#: filter.man:227 ++#, no-wrap ++msgid "SOFTWARE" ++msgstr "SOFTWARE" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:231 ++msgid "The name and version number of the server (typically CUPS/1.2)." ++msgstr "Der Name und die Versionsnummer des Servers (typischerweise CUPS/1.2)." ++ ++# type: TP ++#. type: TP ++#: filter.man:232 ++#, no-wrap ++msgid "TZ" ++msgstr "TZ" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:236 ++msgid "The timezone of the server." ++msgstr "Die Zeitzone des Servers." ++ ++# type: TP ++#. type: TP ++#: filter.man:237 ++#, no-wrap ++msgid "USER" ++msgstr "USER" ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:242 ++msgid "" ++"The user executing the filter, typically \"lp\" or \"root\"; consult the " ++"I<cupsd.conf(5)> file for the current setting." ++msgstr "" ++"Der Benutzer, der den Filter ausführt, typischerweise »lp« oder »root«; " ++"schauen Sie in die Datei I<cupsd.conf(5)> für die aktuellen Einstellungen." ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:248 ++msgid "" ++"While the filter interface is compatible with System V interface scripts, it " ++"will only work with the System V interface script as the only filter. " ++"Typically the interface script will be provided via the I<lpadmin(8)> " ++"command using the I<-i> option." ++msgstr "" ++"Während die Filterschnittstelle kompatibel mit System-V-" ++"Schnittstellenskripten ist, wird sie mit dem System-V-Schnittstellenskript " ++"nur als einziger Filter funktionieren. Normalerweise wird das " ++"Schnittstellenskript über den I<lpadmin(8)>-Befehl unter Benutzung der " ++"Option I<-i> bereitgestellt." ++ ++# type: Plain text ++#. type: Plain text ++#: filter.man:250 ++msgid "I<backend(7)>, I<cupsd(8)>," ++msgstr "I<backend(7)>, I<cupsd(8)>," ++ ++# type: TH ++#. type: TH ++#: lpadmin.man:15 ++#, no-wrap ++msgid "lpadmin" ++msgstr "lpadmin" ++ ++# type: TH ++#. type: TH ++#: lpadmin.man:15 ++#, no-wrap ++msgid "1 September 2010" ++msgstr "1. September 2010" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:18 ++msgid "lpadmin - configure cups printers and classes" ++msgstr "lpadmin - CUPS-Treiber und -Klassen konfigurieren" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:26 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -d I<destination>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -d I<Ziel>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:34 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -p I<destination " ++"option(s)>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -p " ++"I<Zieloption(en)>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:42 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -x I<destination>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -x I<Ziel>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:46 ++msgid "" ++"I<lpadmin> configures printer and class queues provided by CUPS. It can also " ++"be used to set the server default printer or class." ++msgstr "" ++"I<lpadmin> konfiguriert von CUPS bereitgestellte Warteschlangen für Drucker " ++"und Druckerklassen. Es kann auch zur Einstellung des Standarddruckers oder " ++"der Standardklasse verwandt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:50 ++msgid "" ++"When specified before the I<-d>, I<-p>, or I<-x> options, the I<-E> option " ++"forces encryption when connecting to the server." ++msgstr "" ++"Wird die Option I<-E> vor den Optionen I<-d>, I<-p> oder I<-x> verwandt, so " ++"erzwingt sie die Verschlüsselung bei Verbindungen zum Server." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:56 ++msgid "" ++"The first form of the command (I<-d>) sets the default printer or class to " ++"I<destination>. Subsequent print jobs submitted via the I<lp(1)> or I<lpr(1)" ++"> commands will use this destination unless the user specifies otherwise " ++"with the I<lpoptions(1)> command." ++msgstr "" ++"Die erste Form des Befehls (I<-d>) setzt den Standarddrucker oder Klasse auf " ++"I<Ziel>. Folgende Druckaufträge, die mit den Befehlen I<lp(1)> oder I<lpr(1)" ++"> eingereicht werden, verwenden dieses Ziel solange der Benutzer nichts " ++"anderes mit dem Befehl I<lpoptions(1)> spezifiziert hat." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:59 ++msgid "" ++"The second form of the command (I<-p>) configures the named printer or " ++"class. The additional options are described below." ++msgstr "" ++"Die zweite Form des Befehls (I<-p>) konfiguriert den benannten Drucker oder " ++"Klasse. Die zusätzlichen Optionen sind unten beschrieben." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:64 ++msgid "" ++"The third form of the command (I<-x>) deletes the printer or class " ++"I<destination>. Any jobs that are pending for the destination will be " ++"removed and any job that is currently printed will be aborted." ++msgstr "" ++"Die dritte Form des Befehls (I<-x>) löscht den Drucker oder Klasse I<Ziel>. " ++"Alle Aufträge, die für dieses Ziel noch warten, werden entfernt und im Druck " ++"befindliche Aufträge werden abgebrochen." ++ ++# type: SH ++#. type: SH ++#: lpadmin.man:64 ++#, no-wrap ++msgid "CONFIGURATION OPTIONS" ++msgstr "KONFIGURATIONSOPTIONEN" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:67 ++msgid "The following options are recognized when configuring a printer queue:" ++msgstr "" ++"Die folgenden Optionen werden bei der Konfiguration einer " ++"Druckerwarteschlange verstanden:" ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:67 ++#, no-wrap ++msgid "-c class" ++msgstr "-c Klasse" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:72 ++msgid "" ++"Adds the named I<printer> to I<class>. If I<class> does not exist it is " ++"created automatically." ++msgstr "" ++"Fügt den benannten I<Drucker> zu der I<Klasse> hinzu. Falls I<Klasse> nicht " ++"existiert, so wird sie automatisch erstellt." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:72 ++#, no-wrap ++msgid "-i interface" ++msgstr "-i Schnittstelle" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:78 ++msgid "" ++"Sets a System V style interface script for the printer. This option cannot " ++"be specified with the I<-P> option (PPD file) and is intended for providing " ++"support for legacy printer drivers." ++msgstr "" ++"Setzt ein Schnittstellenskript im System-V-Stil für den Drucker. Diese " ++"Option kann nicht mit der Option I<-P> (PPD-Datei) angegeben werden und ist " ++"gedacht, um Unterstützung für alte Druckertreiber anzubieten." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:78 ++#, no-wrap ++msgid "-m model" ++msgstr "-m Modell" ++ ++#. type: Plain text ++#: lpadmin.man:84 ++msgid "" ++"Sets a standard System V interface script or PPD file for the printer from " ++"the I<model> directory or using one of the driver interfaces. Use the I<-m> " ++"option with the I<lpinfo(8)> command to get a list of supported models." ++msgstr "" ++"Setzt ein Standard-System-V-Schnittstellenskript oder eine PPD-Datei für den " ++"Drucker aus dem Verzeichnis I<Model> oder verwendet eine der " ++"Druckerschnittstellen. Verwenden Sie die Option I<-m> mit dem Befehl " ++"I<lpinfo(8)>, um eine Liste der unterstützten Modelle zu erhalten." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:84 ++#, no-wrap ++msgid "-o job-k-limit=value" ++msgstr "-o job-k-limit=Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:89 ++msgid "" ++"Sets the kilobyte limit for per-user quotas. The value is an integer number " ++"of kilobytes; one kilobyte is 1024 bytes." ++msgstr "" ++"Setzt die Begrenzung in Kilobyte für pro-Benutzer-Quotas. Der Wert ist eine " ++"Ganzzahl von Kilobytes, ein Kilobyte ist 1024 Bytes." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:89 ++#, no-wrap ++msgid "-o job-page-limit=value" ++msgstr "-o job-page-limit=Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:95 ++msgid "" ++"Sets the page limit for per-user quotas. The value is the integer number of " ++"pages that can be printed; double-sided pages are counted as two pages." ++msgstr "" ++"Setzt eine Seitenbegrenzung für pro-Benutzer-Quotas. Der Wert ist eine " ++"Ganzzahl von Seiten, die gedruckt werden können. Doppelseitige Seiten werden " ++"als zwei Seiten gezählt." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:95 ++#, no-wrap ++msgid "-o job-quota-period=value" ++msgstr "-o job-quota-period=Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:100 ++msgid "" ++"Sets the accounting period for per-user quotas. The value is an integer " ++"number of seconds; 86,400 seconds are in one day." ++msgstr "" ++"Setzt die Berechnungsperiode für Quotas je Benutzer. Der Wert ist eine " ++"Ganzzahl von Sekunden; 86,400 Sekunden sind ein Tag." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:100 ++#, no-wrap ++msgid "-o job-sheets-default=banner" ++msgstr "-o job-sheets-default=Banner" ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:102 ++#, no-wrap ++msgid "-o job-sheets-default=banner,banner" ++msgstr "-o job-sheets-default=Banner,Banner" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:106 ++msgid "Sets the default banner page(s) to use for print jobs." ++msgstr "Spezifiziert die Standarddeckblätter für das Drucken von Aufträgen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:111 ++msgid "" ++"Sets a PPD option for the printer. PPD options can be listed using the I<-l> " ++"option with the I<lpoptions(1)> command." ++msgstr "" ++"Setzt eine PPD-Option für den Drucker. PPD-Optionen können mittels der " ++"Option I<-l> des Befehls I<lpoptions(1)> aufgelistet werden." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:111 ++#, no-wrap ++msgid "-o name-default=value" ++msgstr "-o name-default=Wert" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:117 ++msgid "" ++"Sets a default server-side option for the destination. Any print-time option " ++"can be defaulted, e.g. \"-o cpi-default=17\" to set the default \"cpi\" " ++"option value to 17." ++msgstr "" ++"Setzt eine Standard serverseitige Option für das Ziel. Jede Option zur " ++"Druckzeit kann mit einem Standardwert belegt werden, z.B. »-o cpi-" ++"default=17«, um den Standard-»cpi«-Optionswert auf 17 zu setzen." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:117 ++#, no-wrap ++msgid "-o port-monitor=name" ++msgstr "-o port-monitor=Name" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:123 ++msgid "" ++"Sets the binary communications program to use when printing, \"none\", \"bcp" ++"\", or \"tbcp\". The default program is \"none\". The specified port monitor " ++"must be listed in the printer's PPD file." ++msgstr "" ++"Setzt das binäre Kommunikationsprogramm, das benutzt wird, um »none«, »bcp« " ++"oder »tbcp« zu drucken. Das Standardprogramm ist »none«. Der angegebene " ++"Monitorport muss in der PPD-Datei des Druckers aufgelistet sein." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:123 ++#, no-wrap ++msgid "-o printer-error-policy=name" ++msgstr "-o printer-error-policy=Name" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:131 ++msgid "" ++"Sets the error policy to be used when the printer backend is unable to send " ++"the job to the printer. The name must be one of \"abort-job\", \"retry-job" ++"\", \"retry-current-job\", or \"stop-printer\". The default error policy is " ++"\"stop-printer\" for printers and \"retry-current-job\" for classes." ++msgstr "" ++"Setzt die Fehlerrichtlinie, die benutzt wird, wenn das Drucker-Backend den " ++"Druckauftrag nicht an den Drucker senden kann. Der Name muss entweder »abort-" ++"job«, »retry-job«, »retry-current-job« oder »stop-printer« sein. Die " ++"Standardfehlerrichtlinie ist »stop-printer« für Drucker und " ++"»retry-current-job« für Klassen." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:131 ++#, no-wrap ++msgid "-o printer-is-shared=true/false" ++msgstr "-o printer-is-shared=true/false" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:139 ++msgid "" ++"Sets the destination to shared/published or unshared/unpublished. Shared/" ++"published destinations are publically announced by the server on the LAN " ++"based on the browsing configuration in B<cupsd.conf>, while unshared/" ++"unpublished destinations are not announced. The default value is \"true\"." ++msgstr "" ++"Setzt, ob das Ziel freigegeben/veröffentlicht oder nicht freigegeben/" ++"unveröffentlicht ist. Freigegebene/Veröffentlichte Ziele werden öffentlich " ++"angezeigt durch den Server im LAN, der auf der Suchkonfiguration in B<cupsd." ++"conf> basiert, während nicht freigegebene/unveröffentlichte Ziele nicht " ++"angezeigt werden. Vorgabewert ist »true«." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:139 ++#, no-wrap ++msgid "-o printer-op-policy=name" ++msgstr "-o printer-op-policy=Name" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:145 ++msgid "" ++"Sets the IPP operation policy associated with the destination. The name must " ++"be defined in the B<cupsd.conf> in a Policy section. The default operation " ++"policy is \"default\"." ++msgstr "" ++"Setzt die mit dem Ziel verbundene IPP-Operationsrichtlinie. Der Name muss " ++"in einem Richtlinienabschnitt der B<cupsd.conf> definiert sein. Die " ++"Standardoperationsrichtlinie ist »default«." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:145 ++#, no-wrap ++msgid "-r class" ++msgstr "-r Klasse" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:150 ++msgid "" ++"Removes the named I<printer> from I<class>. If the resulting class becomes " ++"empty it is removed." ++msgstr "" ++"Entfernt den benannten I<Drucker> aus der I<Klasse>. Falls die entstehende " ++"Klasse dadurch leer wird, wird sie entfernt." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:150 ++#, no-wrap ++msgid "-u allow:user,user,@group" ++msgstr "-u allow:user,user,@group" ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:152 ++#, no-wrap ++msgid "-u deny:user,user,@group" ++msgstr "-u deny:user,user,@group" ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:154 ++#, no-wrap ++msgid "-u allow:all" ++msgstr "-u allow:all" ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:156 ++#, no-wrap ++msgid "-u deny:none" ++msgstr "-u deny:none" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:162 ++msgid "" ++"Sets user-level access control on a destination. Names starting with \"@\" " ++"are interpreted as UNIX groups. The latter two forms turn user-level access " ++"control off." ++msgstr "" ++"Setzt die Zugriffsteuerung auf Benutzerebene für ein Ziel. Namen, die " ++"mit »@« beginnen werden als UNIX-Gruppen interpretiert. Die beiden letzten " ++"Formen schalten die Zugriffsteuerung auf Benutzerebene aus." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:162 ++#, no-wrap ++msgid "-v \"device-uri\"" ++msgstr "-v \"device-uri\"" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:169 ++msgid "" ++"Sets the I<device-uri> attribute of the printer queue. If I<device-uri> is " ++"a filename it is automatically converted to the form I<file:///file/name>. " ++"Use the I<-v> option with the I<lpinfo(8)> command to get a list of " ++"supported device URIs and schemes." ++msgstr "" ++"Setzt das I<device-uri>-Attribut der Druckerwarteschlange. Falls " ++"I<device-uri> ein Dateiname ist, wird er automatisch in das Format I<file:///" ++"file/name> konvertiert. Benutzen Sie den Befehl I<lpinfo(8)> mit der Option " ++"I<-v>, um eine Liste der unterstützten Geräte-URIs und -Schemen zu erhalten." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:169 ++#, no-wrap ++msgid "-D \"info\"" ++msgstr "-D »info«" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:173 ++msgid "Provides a textual description of the destination." ++msgstr "Stellt eine textuelle Beschreibung des Ziels bereit." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:178 ++msgid "" ++"Enables the destination and accepts jobs; this is the same as running the " ++"I<cupsaccept(8)> and I<cupsenable(8)> programs on the destination." ++msgstr "" ++"Aktiviert das Ziel und akzeptiert Aufträge. Dies ist identisch zur Ausführung " ++"der Programme I<cupsaccept(8)> und I<cupsenable(8)> für das Ziel." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:178 ++#, no-wrap ++msgid "-L \"location\"" ++msgstr "-L »Ort«" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:182 ++msgid "Provides a textual location of the destination." ++msgstr "Stellt den Ort des Ziel textuell bereit." ++ ++# type: TP ++#. type: TP ++#: lpadmin.man:182 ++#, no-wrap ++msgid "-P ppd-file" ++msgstr "-P PPD-Datei" ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:188 ++msgid "" ++"Specifies a PostScript Printer Description file to use with the printer. If " ++"specified, this option overrides the I<-i> option (interface script)." ++msgstr "" ++"Spezifiziert eine PostScript Printer Description-Datei für die Verwendung " ++"mit dem Drucker. Falls angegeben überschreibt diese Option die Option I<-i> " ++"(Schnittstellenskript)." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:196 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " ++"and class names are I<not> case-sensitive. Finally, the CUPS version of " ++"I<lpadmin> may ask the user for an access password depending on the printing " ++"system configuration. This differs from the System V version which requires " ++"the root user to execute this command." ++msgstr "" ++"Anders als in einem System-V-Drucksystem erlaubt CUPS, dass Druckernamen " ++"jedes druckbare Zeichen außer LEERZEICHEN, TABULATOR, »/« oder »#« " ++"enthalten. Außerdem wird bei Drucker- und Klassennamen Groß- und " ++"Kleinschreibung nicht unterschieden. Zu guter Letzt könnte die CUPS-Version " ++"von I<lpadmin> den Benutzer abhängig von der Drucksystemkonfiguration nach " ++"einem Passwort fragen. Das unterscheidet es von der System-V-Version, die " ++"zur Ausführung dieses Befehls den Root-Benutzer benötigt." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:199 ++msgid "" ++"The CUPS version of I<lpadmin> does not support all of the System V or " ++"Solaris printing system configuration options." ++msgstr "" ++"Die CUPS-Version von I<lpadmin> unterstützt nicht alle Optionen der System " ++"V- oder Solaris-Drucksystemkonfiguration." ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:202 ++msgid "I<cupsaccept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," ++msgstr "I<cupsaccept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," ++ ++# type: Plain text ++#. type: Plain text ++#: lpadmin.man:205 lp.man:260 ++msgid "Copyright 2007-2010 by Apple Inc." ++msgstr "Copyright 2007-2010 by Apple Inc." ++ ++# type: TH ++#. type: TH ++#: lpc.man:15 ++#, no-wrap ++msgid "lpc" ++msgstr "lpc" ++ ++# type: TH ++#. type: TH ++#: lpc.man:15 ++#, no-wrap ++msgid "3 November 2008" ++msgstr "3. November 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:18 ++msgid "lpc - line printer control program" ++msgstr "lpc - Zeilendrucker-Steuerprogramm (line printer control program)" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:25 ++msgid "B<lpc> [ I<command> [ I<parameter(s)> ] ]" ++msgstr "B<lpc> [ I<Befehl> [ I<Parameter> ] ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:29 ++msgid "" ++"I<lpc> provides limited control over printer and class queues provided by " ++"CUPS. It can also be used to query the state of queues." ++msgstr "" ++"I<lpc> stellt eine eingeschränkte Steuerung von durch CUPS bereitgestellten " ++"Drucker- und Druckerklassen-Warteschlangen bereit. Es kann auch zur Abfrage " ++"der Zustände von Warteschlangen verwandt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:32 ++msgid "" ++"If no command is specified on the command-line, lpc will display a prompt " ++"and accept commands from the standard input." ++msgstr "" ++"Falls auf der Kommandozeile kein Befehl angegeben ist, wird Lpc eine " ++"Eingabeaufforderung anzeigen und Befehle von der Standardeingabe akzeptieren." ++ ++# type: SH ++#. type: SH ++#: lpc.man:32 ++#, no-wrap ++msgid "COMMANDS" ++msgstr "BEFEHLE" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:35 ++msgid "" ++"The I<lpc> program accepts a subset of commands accepted by the Berkeley " ++"I<lpc> program of the same name:" ++msgstr "" ++"Das Programm I<lpc> akzeptiert eine Teilmenge der Befehle, die vom Berkeley " ++"I<lpc>-Programm gleichen Namens akzeptiert werden:" ++ ++# type: TP ++#. type: TP ++#: lpc.man:35 ++#, no-wrap ++msgid "exit" ++msgstr "exit" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:39 lpc.man:49 ++msgid "Exits the command interpreter." ++msgstr "Beendet den Befehlsinterpreter." ++ ++# type: TP ++#. type: TP ++#: lpc.man:39 ++#, no-wrap ++msgid "help [command]" ++msgstr "help [Befehl]" ++ ++# type: TP ++#. type: TP ++#: lpc.man:41 ++#, no-wrap ++msgid "? [command]" ++msgstr "? [Befehl]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:45 ++msgid "Displays a short help message." ++msgstr "Zeigt eine kurze Hilfenachricht an." ++ ++# type: TP ++#. type: TP ++#: lpc.man:45 ++#, no-wrap ++msgid "quit" ++msgstr "quit" ++ ++# type: TP ++#. type: TP ++#: lpc.man:49 ++#, no-wrap ++msgid "status [queue]" ++msgstr "status [Druckwarteschlange]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:53 ++msgid "Displays the status of one or more printer or class queues." ++msgstr "" ++"Zeigt den Status von einer oder mehreren Drucker- oder Druckerklassen-" ++"Warteschlangen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:59 ++msgid "" ++"Since I<lpc> is geared towards the Berkeley printing system, it is " ++"impossible to use I<lpc> to configure printer or class queues provided by " ++"CUPS. To configure printer or class queues you must use the I<lpadmin(8)> " ++"command or another CUPS-compatible client with that functionality." ++msgstr "" ++"Seit I<lpc> auf das Berkeley-Drucksystems abzielt, ist es unmöglich, I<lpc> " ++"zu benutzen, um durch CUPS bereitgestellte Drucker- oder Druckerklassen-" ++"Warteschlangen zu konfigurieren. Um Drucker- oder Druckerklassen-" ++"Warteschlangen zu konfigurieren, müssen Sie den Befehl I<lpadmin(8)> oder " ++"einen anderen CUPS-kompatiblen Client mit dieser Funktionalität benutzen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:62 ++msgid "" ++"The CUPS version of I<lpc> does not implement all of the standard Berkeley " ++"or LPRng commands." ++msgstr "" ++"Die CUPS-Version von I<lpc> implementiert nicht alle Standardbefehle der " ++"Berkeley- oder LPRng-Version." ++ ++# type: Plain text ++#. type: Plain text ++#: lpc.man:65 ++msgid "" ++"I<cancel(1)>, I<cupsaccept(8)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm" ++"(1)>, I<lpstat(1)>," ++msgstr "" ++"I<cancel(1)>, I<cupsaccept(8)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm" ++"(1)>, I<lpstat(1)>," ++ ++# type: TH ++#. type: TH ++#: lpinfo.man:15 ++#, no-wrap ++msgid "lpinfo" ++msgstr "lpinfo" ++ ++# type: TH ++#. type: TH ++#: lpinfo.man:15 ++#, no-wrap ++msgid "5 December 2008" ++msgstr "5. Dezember 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:18 ++msgid "lpinfo - show available devices or drivers" ++msgstr "lpinfo - zeige verfügbare Geräte oder Drucker" ++ ++#. type: Plain text ++#: lpinfo.man:37 ++msgid "" ++"B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] [ --" ++"device-id I<device-id-string> ] [ --exclude-schemes I<scheme-list> ] [ --" ++"include-schemes I<scheme-list> ] [ --language I<locale> ] [ --make-and-model " ++"I<name> ] [ --product I<name> ] -m" ++msgstr "" ++"B<lpinfo> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -l ] [ --" ++"device-id I<Geräte-ID-Zeichenkette> ] [ --exclude-schemes I<Schemenliste> ] " ++"[ --include-schemes I<Schemenliste> ] [ --language I<Locale> ] [ --make-and-" ++"model I<Name> ] [ --product I<Name> ] -m" ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:50 ++msgid "" ++"B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] [ --" ++"exclude-schemes I<scheme-list> ] [ --include-schemes I<scheme-list> ] [ --" ++"timeout I<seconds> ] -v" ++msgstr "" ++"B<lpinfo> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -l ] [ --" ++"exclude-schemes I<Schemenliste> ] [ --include-schemes I<Schemenliste> ] [ --" ++"timeout I<Sekunden> ] -v" ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:55 ++msgid "" ++"I<lpinfo> lists the available devices or drivers known to the CUPS server. " ++"The first form (I<-m>) lists the available drivers, while the second form " ++"(I<-v>) lists the available devices." ++msgstr "" ++"I<lpinfo> listet die dem CUPS-Server bekannten verfügbaren Geräte oder " ++"Treiber auf. Die erste Form (I<-m>) listet alle verfügbaren Treiber, während " ++"die zweite Form (I<-v>) alle verfügbaren Geräte auflistet." ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:57 ++msgid "I<lpinfo> accepts the following options:" ++msgstr "I<lpinfo> akzeptiert die folgenden Optionen:" ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:65 ++msgid "Sets the username to use when connecting to the server." ++msgstr "" ++"Setzt den Benutzernamen, der bei Verbindungen zum Server verwandt werden " ++"soll." ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:69 ++msgid "Selects an alternate server." ++msgstr "Wählt einen alternativen Server aus." ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:73 ++msgid "Shows a \"long\" listing of devices or drivers." ++msgstr "Zeigt eine »lange« Auflistung von Geräten oder Treibern." ++ ++#. type: TP ++#: lpinfo.man:73 ++#, no-wrap ++msgid "--device-id device-id-string" ++msgstr "--device-id Geräte-ID-Zeichenkette" ++ ++#. type: Plain text ++#: lpinfo.man:78 ++msgid "" ++"Specifies the IEEE-1284 device ID to match when listing drivers with the I<-" ++"m> option." ++msgstr "" ++"Spezifiziert die IEEE-1284-Geräte-ID, die übereinstimmen muss, wenn " ++"Gerätetreiber mit der Option I<-m> aufgelistet werden." ++ ++#. type: TP ++#: lpinfo.man:78 ++#, no-wrap ++msgid "--exclude-schemes scheme-list" ++msgstr "--exclude-schemes Schemenliste" ++ ++#. type: Plain text ++#: lpinfo.man:83 ++msgid "" ++"Specifies a comma-separated list of device or PPD schemes that should be " ++"excluded from the results. Static PPD files use the \"file\" scheme." ++msgstr "" ++"Gibt eine kommagetrennte Liste von Geräte- oder PPD-Schemen an, die aus den " ++"Ergebnissen ausgeschlossen werden sollten. Statische PPD-Dateien benutzen " ++"das »file«-Schema." ++ ++#. type: TP ++#: lpinfo.man:83 ++#, no-wrap ++msgid "--include-schemes scheme-list" ++msgstr "--include-schemes Schemenliste" ++ ++#. type: Plain text ++#: lpinfo.man:88 ++msgid "" ++"Specifies a comma-separated list of device or PPD schemes that should be " ++"included in the results. Static PPD files use the \"file\" scheme." ++msgstr "" ++"Spezifiziert eine kommagetrennte Liste von PPD-Schemen, die in den " ++"Ergebnissen enthalten sein sollen. Statische PPD-Dateien benutzen das »file«-" ++"Schema." ++ ++# type: TP ++#. type: TP ++#: lpinfo.man:88 ++#, no-wrap ++msgid "--language locale" ++msgstr "--language Locale" ++ ++#. type: Plain text ++#: lpinfo.man:92 ++msgid "" ++"Specifies the language to match when listing drivers with the I<-m> option." ++msgstr "" ++"Spezifiziert die Sprache, die übereinstimmen muss, wenn Treiber mit der " ++"Option I<-m> aufgelistet werden." ++ ++#. type: TP ++#: lpinfo.man:92 ++#, no-wrap ++msgid "--make-and-model name" ++msgstr "--make-and-model Name" ++ ++#. type: Plain text ++#: lpinfo.man:97 ++msgid "" ++"Specifies the make and model to match when listing drivers with the I<-m> " ++"option." ++msgstr "" ++"Spezifiziert die Marke und Modell, die übereinstimmen müssen, wenn Treiber " ++"mit der Option I<-m> aufgelistet werden." ++ ++# type: TP ++#. type: TP ++#: lpinfo.man:97 ++#, no-wrap ++msgid "--product name" ++msgstr "--product Name" ++ ++#. type: Plain text ++#: lpinfo.man:101 ++msgid "" ++"Specifies the product to match when listing drivers with the I<-m> option." ++msgstr "" ++"Spezifiziert das Produkt, das übereinstimmen muss, wenn Treiber mit der " ++"Option I<-m> aufgelistet werden." ++ ++# type: TP ++#. type: TP ++#: lpinfo.man:101 ++#, no-wrap ++msgid "--timeout seconds" ++msgstr "--timeout Sekunden" ++ ++#. type: Plain text ++#: lpinfo.man:105 ++msgid "Specifies the timeout when listing devices with the I<-v> option." ++msgstr "" ++"Spezifiziert die Zeitüberschreitung, wenn Geräte mit der Option -v " ++"aufgelistet werden." ++ ++# type: Plain text ++#. type: Plain text ++#: lpinfo.man:107 ++msgid "The I<lpinfo> command is unique to CUPS." ++msgstr "Der Befehl I<lpinfo> ist eine Besonderheit von CUPS." ++ ++# type: TH ++#. type: TH ++#: lp.man:15 ++#, no-wrap ++msgid "lp" ++msgstr "lp" ++ ++#. type: TH ++#: lp.man:15 ++#, no-wrap ++msgid "31 August 2010" ++msgstr "31. August 2010" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:18 ++msgid "lp - print files" ++msgstr "lp - Dateien drucken" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:41 ++msgid "" ++"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -d I<destination[/instance]> ] [ -h " ++"I<hostname[:port]> ] [ -m ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -" ++"q I<priority> ] [ -s ] [ -t I<title> ] [ -H I<handling> ] [ -P I<page-" ++"list> ] [ -- ] [ I<file(s)> ]" ++msgstr "" ++"B<lp> [ -E ] [ -U I<Benutzername> ] [ -c ] [ -d I<Ziel[/Instanz]> ] [ -h " ++"I<Rechnername[:Port]> ] [ -m ] [ -n I<Anz-Kopien> ] [ -o I<Option[=Wert]> ] " ++"[ -q I<Priorität> ] [ -s ] [ -t I<Titel> ] [ -H I<Handhabung> ] [ -P " ++"I<Seitenliste> ] [ -- ] [ I<Datei(en)> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:62 ++msgid "" ++"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -h I<hostname[:port]> ] [ -i I<job-" ++"id> ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -q I<priority> ] [ -t " ++"I<title> ] [ -H I<handling> ] [ -P I<page-list> ]" ++msgstr "" ++"B<lp> [ -E ] [ -U I<Benutzername> ] [ -c ] [ -h I<Rechnername[:Port]> ] [ -i " ++"I<Auftrags-ID> ] [ -n I<Anz-Kopien> ] [ -o I<Option[=Wert]> ] [ -q " ++"I<Priorität> ] [ -t I<Titel> ] [ -H I<Handhabung> ] [ -P I<Seitenliste> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:65 ++msgid "" ++"I<lp> submits files for printing or alters a pending job. Use a filename of " ++"\"-\" to force printing from the standard input." ++msgstr "" ++"I<lp> reicht Dateien zum Druck ein oder ändert einen anhängenden " ++"Druckauftrag. Verwenden Sie als Dateinamen »-«, um das Drucken von der " ++"Standardeingabe zu erzwingen." ++ ++# type: SH ++#. type: SH ++#: lp.man:65 lpr.man:40 ++#, no-wrap ++msgid "THE DEFAULT DESTINATION" ++msgstr "DAS VORGABEZIEL" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:70 lpr.man:45 ++msgid "" ++"CUPS provides many ways to set the default destination. The \"LPDEST\" and " ++"\"PRINTER\" environment variables are consulted first. If neither are set, " ++"the current default set using the I<lpoptions(1)> command is used, followed " ++"by the default set using the I<lpadmin(8)> command." ++msgstr "" ++"CUPS stellt viele Möglichkeiten bereit, den Vorgabebeziele zu setzen. Die " ++"Umgebungsvariablen »LPDEST« und »PRINTER« werden zuerst herangezogen. Wenn " ++"keine von beiden gesetzt ist, wird der aktuell unter Benutzung des Befehls " ++"I<lpoptions(1)> gesetzte benutzt, gefolgt von der durch den Befehl I<lpadmin" ++"(8)> gesetzten Vorgabe." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:72 ++msgid "The following options are recognized by I<lp>:" ++msgstr "Die folgenden Optionen werden von I<lp> erkannt:" ++ ++# type: TP ++#. type: TP ++#: lp.man:72 ++#, no-wrap ++msgid "--" ++msgstr "--" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:77 ++msgid "" ++"Marks the end of options; use this to print a file whose name begins with a " ++"dash (-)." ++msgstr "" ++"Markiert das Ende der Optionen; verwenden Sie dies, um eine Datei zu " ++"drucken, deren Namen mit einem Bindestrich (-) beginnt." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:93 ++msgid "" ++"This option is provided for backwards-compatibility only. On systems that " ++"support it, this option forces the print file to be copied to the spool " ++"directory before printing. In CUPS, print files are always sent to the " ++"scheduler via IPP which has the same effect." ++msgstr "" ++"Diese Option wird nur zur Rückwärtskompatibilität bereitgestellt. Auf " ++"Systemen, die sie unterstützen, erzwingt die Option, dass die Druckdatei vor " ++"dem Drucken in das Spool-Verzeichnis kopiert wird. In CUPS werden die " ++"Dateien immer via IPP zum Auftragsplaner (Scheduler) geschickt, was den " ++"gleichen Effekt bewirkt." ++ ++# type: TP ++#. type: TP ++#: lp.man:93 ++#, no-wrap ++msgid "-d destination" ++msgstr "-d Ziel" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:97 lpr.man:67 ++msgid "Prints files to the named printer." ++msgstr "Druckt Dateien auf den benannten Drucker." ++ ++# type: TP ++#. type: TP ++#: lp.man:101 ++#, no-wrap ++msgid "-i job-id" ++msgstr "-i Auftrags-ID" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:105 ++msgid "Specifies an existing job to modify." ++msgstr "Spezifiziert einen existierenden Auftrag, der geändert werden soll" ++ ++# type: TP ++#. type: TP ++#: lp.man:105 lpr.man:86 ++#, no-wrap ++msgid "-m" ++msgstr "-m" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:109 ++msgid "Sends an email when the job is completed." ++msgstr "Schickt eine E-Mail, wenn der Auftrag ausgeführt ist." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:113 lpr.man:75 ++msgid "Sets the number of copies to print from 1 to 100." ++msgstr "Setzt die Anzahl der zu druckenden Kopien zwischen 1 und 100." ++ ++# type: TP ++#. type: TP ++#: lp.man:113 ++#, no-wrap ++msgid "-o \"name=value [name=value ...]\"" ++msgstr "-o \"Name=Wert [Name=Wert ...]\"" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:117 ++msgid "Sets one or more job options." ++msgstr "Setzt eine oder mehrere Optionen für den Auftrag." ++ ++# type: TP ++#. type: TP ++#: lp.man:117 ++#, no-wrap ++msgid "-q priority" ++msgstr "-q Priorität" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:122 ++msgid "" ++"Sets the job priority from 1 (lowest) to 100 (highest). The default priority " ++"is 50." ++msgstr "" ++"Setzt die Auftragspriorität von 1 (am niedrigsten) bis 100 (am höchsten). " ++"Die Standardpriorität beträgt 50." ++ ++# type: TP ++#. type: TP ++#: lp.man:122 lpstat.man:105 ++#, no-wrap ++msgid "-s" ++msgstr "-s" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:126 ++msgid "Do not report the resulting job IDs (silent mode.)" ++msgstr "Die sich ergebenden Druckauftrags-IDs nicht berichten (stiller Modus)." ++ ++# type: TP ++#. type: TP ++#: lp.man:126 ++#, no-wrap ++msgid "-t \"name\"" ++msgstr "-t \"Name\"" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:130 lpr.man:63 ++msgid "Sets the job name." ++msgstr "Setzt den Namen des Auftrags." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:134 ++msgid "Submits jobs as I<username>." ++msgstr "Reicht Aufträge als I<Benutzername> ein." ++ ++# type: TP ++#. type: TP ++#: lp.man:134 ++#, no-wrap ++msgid "-H hh:mm" ++msgstr "-H hh:mm" ++ ++# type: TP ++#. type: TP ++#: lp.man:136 ++#, no-wrap ++msgid "-H hold" ++msgstr "-H hold" ++ ++# type: TP ++#. type: TP ++#: lp.man:138 ++#, no-wrap ++msgid "-H immediate" ++msgstr "-H immediate" ++ ++# type: TP ++#. type: TP ++#: lp.man:140 ++#, no-wrap ++msgid "-H restart" ++msgstr "-H restart" ++ ++# type: TP ++#. type: TP ++#: lp.man:142 ++#, no-wrap ++msgid "-H resume" ++msgstr "-H resume" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:152 ++msgid "" ++"Specifies when the job should be printed. A value of I<immediate> will print " ++"the file immediately, a value of I<hold> will hold the job indefinitely, and " ++"a time value (HH:MM) will hold the job until the specified time. Use a value " ++"of I<resume> with the I<-i> option to resume a held job. Use a value of " ++"I<restart> with the I<-i> option to restart a completed job." ++msgstr "" ++"Spezifiziert, wann der Druckauftrag gedruckt werden soll. Der Wert " ++"I<immediate> führt zum sofortigen Druck. Der Wert I<hold> hält den " ++"Druckauftrag auf unbestimmte Zeit an und ein Zeitwert (HH:MM) hält den " ++"Druckauftrag bis zur angegebenen Uhrzeit an. Verwenden Sie den Wert " ++"I<resume> mit der Option I<-i>, um einen gehaltenen Druckauftrag wieder " ++"aufzunehmen. Verwenden Sie den Wert I<restart> mit der Option I<-i>, um " ++"einen abgeschlossenen Druckauftrag neu zu starten." ++ ++# type: TP ++#. type: TP ++#: lp.man:152 ++#, no-wrap ++msgid "-P page-list" ++msgstr "-P Seitenliste" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:160 ++msgid "" ++"Specifies which pages to print in the document. The list can contain a list " ++"of numbers and ranges (#-#) separated by commas (e.g. 1,3-5,16). The page " ++"numbers refer to the output pages and not the document's original pages - " ++"options like \"number-up\" can affect the numbering of the pages." ++msgstr "" ++"Spezifiziert, welche Seiten im Dokument gedruckt werden. Die Liste kann eine " ++"durch Kommata getrennte Liste von Nummern und Bereichen (#-#) enthalten (z.B. " ++"1,3-5,16). Die Seitennummern beziehen sich auf die Ausgabeseiten und nicht " ++"auf die Originalseiten des Dokuments – Optionen wie »number-up« können die " ++"Nummerierung der Seiten beeinflussen." ++ ++# type: SH ++#. type: SH ++#: lp.man:160 ++#, no-wrap ++msgid "COMMON JOB OPTIONS" ++msgstr "HÄUFIGE DRUCKAUFTRAGSOPTIONEN" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:164 ++msgid "" ++"Aside from the printer-specific options reported by the I<lpoptions(1)> " ++"command, the following generic options are available:" ++msgstr "" ++"Abgesehen von druckerspezifischen Optionen, die vom Befehl I<lpoptions(1)> " ++"berichtet werden, sind die folgenden allgemeinen Optionen verfügbar:" ++ ++# type: TP ++#. type: TP ++#: lp.man:164 ++#, no-wrap ++msgid "-o media=size" ++msgstr "-o media=Größe" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:169 ++msgid "" ++"Sets the page size to I<size>. Most printers support at least the size names " ++"\"a4\", \"letter\", and \"legal\"." ++msgstr "" ++"Setzt die Seitengröße auf I<Größe>. Die meisten Drucker unterstützen " ++"mindestens die Seitennamen »a4«, »letter« und »legal«." ++ ++# type: TP ++#. type: TP ++#: lp.man:169 ++#, no-wrap ++msgid "-o landscape" ++msgstr "-o landscape" ++ ++# type: TP ++#. type: TP ++#: lp.man:171 ++#, no-wrap ++msgid "-o orientation-requested=4" ++msgstr "-o orientation-requested=4" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:175 ++msgid "Prints the job in landscape (rotated 90 degrees)." ++msgstr "Druckt den Druckauftrag im Querformat (gedreht um 90 Grad)." ++ ++# type: TP ++#. type: TP ++#: lp.man:175 ++#, no-wrap ++msgid "-o sides=one-sided" ++msgstr "-o sides=one-sided" ++ ++# type: TP ++#. type: TP ++#: lp.man:177 ++#, no-wrap ++msgid "-o sides=two-sided-long-edge" ++msgstr "-o sides=two-sided-long-edge" ++ ++# type: TP ++#. type: TP ++#: lp.man:179 ++#, no-wrap ++msgid "-o sides=two-sided-short-edge" ++msgstr "-o sides=two-sided-short-edge" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:186 ++msgid "" ++"Prints on one or two sides of the paper. The value \"two-sided-long-edge\" " ++"is normally used when printing portrait (unrotated) pages, while \"two-sided-" ++"short-edge\" is used for landscape pages." ++msgstr "" ++"Druckt auf einer oder zwei Seiten des Papiers. Der Wert »two-sided-long-" ++"edge« wird normalerweise für den Druck im Hochformat (unrotiert) verwandt, " ++"während »two-sided-short-edge« für Querformatseiten eingesetzt wird." ++ ++# type: TP ++#. type: TP ++#: lp.man:186 ++#, no-wrap ++msgid "-o fitplot" ++msgstr "-o fitplot" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:190 ++msgid "Scales the print file to fit on the page." ++msgstr "Skaliert die Druckdatei auf Seitengröße." ++ ++# type: TP ++#. type: TP ++#: lp.man:190 ++#, no-wrap ++msgid "-o number-up=2" ++msgstr "-o number-up=2" ++ ++# type: TP ++#. type: TP ++#: lp.man:192 ++#, no-wrap ++msgid "-o number-up=4" ++msgstr "-o number-up=4" ++ ++# type: TP ++#. type: TP ++#: lp.man:194 ++#, no-wrap ++msgid "-o number-up=6" ++msgstr "-o number-up=6" ++ ++# type: TP ++#. type: TP ++#: lp.man:196 ++#, no-wrap ++msgid "-o number-up=9" ++msgstr "-o number-up=9" ++ ++# type: TP ++#. type: TP ++#: lp.man:198 ++#, no-wrap ++msgid "-o number-up=16" ++msgstr "-o number-up=16" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:202 ++msgid "Prints multiple document pages on each output page." ++msgstr "Druckt mehrere Dokumentenseiten auf jede Ausgabeseite." ++ ++# type: TP ++#. type: TP ++#: lp.man:202 ++#, no-wrap ++msgid "-o scaling=number" ++msgstr "-o scaling=Nummer" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:208 ++msgid "" ++"Scales image files to use up to I<number> percent of the page. Values " ++"greater than 100 cause the image file to be printed across multiple pages." ++msgstr "" ++"Skaliert Bilddateien, um bis zu I<Zahl> Prozent der Seite zu benutzen. Werte " ++"größer 100 veranlassen, dass das Bild über mehrere Seiten gedruckt wird." ++ ++# type: TP ++#. type: TP ++#: lp.man:208 ++#, no-wrap ++msgid "-o cpi=N" ++msgstr "-o cpi=N" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:213 ++msgid "" ++"Sets the number of characters per inch to use when printing a text file. The " ++"default is 10." ++msgstr "" ++"Setzt die Anzahl von Zeichen pro Zoll beim Ausdruck einer Textdatei, " ++"standardmäßig 10." ++ ++# type: TP ++#. type: TP ++#: lp.man:213 ++#, no-wrap ++msgid "-o lpi=N" ++msgstr "-o lpi=N" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:218 ++msgid "" ++"Sets the number of lines per inch to use when printing a text file. The " ++"default is 6." ++msgstr "" ++"Setzt die Anzahl der Zeilen pro Zoll beim Ausdruck einer Textdatei, " ++"standardmäßig 6." ++ ++# type: TP ++#. type: TP ++#: lp.man:218 ++#, no-wrap ++msgid "-o page-bottom=N" ++msgstr "-o page-bottom=N" ++ ++# type: TP ++#. type: TP ++#: lp.man:220 ++#, no-wrap ++msgid "-o page-left=N" ++msgstr "-o page-left=N" ++ ++# type: TP ++#. type: TP ++#: lp.man:222 ++#, no-wrap ++msgid "-o page-right=N" ++msgstr "-o page-right=N" ++ ++# type: TP ++#. type: TP ++#: lp.man:224 ++#, no-wrap ++msgid "-o page-top=N" ++msgstr "-o page-top=N" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:229 ++msgid "" ++"Sets the page margins when printing text files. The values are in points - " ++"there are 72 points to the inch." ++msgstr "" ++"Setzt die Seitenränder beim Ausdruck von Textdateien. Die Einheit der Werte " ++"sind Punkte - es gibt 72 Punkte pro Zoll." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:231 ++msgid "Print a double-sided legal document to a printer called \"foo\":" ++msgstr "" ++"Drucke ein doppelseitiges Dokument im Format legal auf dem Drucker mit Namen " ++"»foo«:" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:233 ++#, no-wrap ++msgid " lp -d foo -o media=legal -o sides=two-sided-long-edge filename\n" ++msgstr " lp -d foo -o media=legal -o sides=two-sided-long-edge Dateiname\n" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:236 ++msgid "Print an image across 4 pages:" ++msgstr "Drucke ein Bild über 4 Seiten:" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:238 ++#, no-wrap ++msgid " lp -d bar -o scaling=200 filename\n" ++msgstr " lp -d bar -o scaling=200 Dateiname\n" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:242 ++msgid "" ++"Print a text file with 12 characters per inch, 8 lines per inch, and a 1 " ++"inch left margin:" ++msgstr "" ++"Drucke eine Textdatei mit 12 Zeichen pro Zoll, 8 Zeilen pro Zoll und einem " ++"Rand von einem Zoll:" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:244 ++#, no-wrap ++msgid " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename\n" ++msgstr " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 Dateiname\n" ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:254 ++msgid "" ++"The \"q\" option accepts a different range of values than the Solaris lp " ++"command, matching the IPP job priority values (1-100, 100 is highest " ++"priority) instead of the Solaris values (0-39, 0 is highest priority)." ++msgstr "" ++"Die Option »q« akzeptiert einen anderen Bereich von Werten als der Solaris-" ++"lp-Befehl, der den IPP-Druckauftragsprioritätswerten (1-100, 100 ist der " ++"höchste) anstelle der Solaris-Werte (0-39, 0 ist die höchste Priorität) " ++"entspricht." ++ ++# type: Plain text ++#. type: Plain text ++#: lp.man:257 ++msgid "" ++"I<cancel(1)>, I<lpadmin(8)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," ++msgstr "" ++"I<cancel(1)>, I<lpadmin(8)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," ++ ++# type: TH ++#. type: TH ++#: lpmove.man:15 ++#, no-wrap ++msgid "lpmove" ++msgstr "lpmove" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:18 ++msgid "lpmove - move a job or all jobs to a new destination" ++msgstr "lpmove - verschiebe einen oder alle Aufträge zu einem neuen Ziel" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:26 ++msgid "" ++"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<job " ++"destination>" ++msgstr "" ++"B<lpmove> [ -E ] [ -h I<Server[:Port]> ] [ -U I<Benutzername> ] I<Auftrag " ++"Ziel>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:34 ++msgid "" ++"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<source " ++"destination>" ++msgstr "" ++"B<lpmove> [ -E ] [ -h I<Server[:Port]> ] [ -U I<Benutzername> ] I<Quelle " ++"Ziel>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:38 ++msgid "" ++"B<lpmove> moves the specified I<job> or all jobs from I<source> to " ++"I<destination>. I<job> can be the job ID number or the old destination and " ++"job ID:" ++msgstr "" ++"B<lpmove> verschiebt den spezifizierten I<Auftrag> oder alle Aufträge von " ++"der I<Quelle> zum I<Ziel>. I<Auftrag> kann die Auftrags-ID-Nummer oder das " ++"alte Ziel und die Auftrags-ID sein:" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:43 ++#, no-wrap ++msgid "" ++" lpmove 123 newprinter\n" ++" lpmove oldprinter-123 newprinter\n" ++msgstr "" ++" lpmove 123 Neuerdrucker\n" ++" lpmove Alterdrucker-123 Neuerdrucker\n" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:46 ++msgid "The I<lpmove> command supports the following options:" ++msgstr "Der Befehl I<lpmove> unterstützt die folgenden Optionen:" ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:54 lpq.man:51 lpr.man:71 lprm.man:49 lpstat.man:61 ++msgid "Specifies an alternate username." ++msgstr "Spezifiziert einen alternativen Benutzernamen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:58 lpq.man:59 lpr.man:55 lprm.man:53 lpstat.man:87 ++msgid "Specifies an alternate server." ++msgstr "Spezifiziert einen alternativen Server." ++ ++# type: Plain text ++#. type: Plain text ++#: lpmove.man:60 lpstat.man:137 ++msgid "I<cancel(1)>, I<lp(1)>," ++msgstr "I<cancel(1)>, I<lp(1)>," ++ ++# type: TH ++#. type: TH ++#: lpoptions.man.in:15 ++#, no-wrap ++msgid "lpoptions" ++msgstr "lpoptions" ++ ++#. type: TH ++#: lpoptions.man.in:15 lpr.man:15 ++#, no-wrap ++msgid "29 August 2008" ++msgstr "29. August 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:18 ++msgid "lpoptions - display or set printer options and defaults" ++msgstr "lpoptions - zeigt oder setzt Druckeroptionen und -voreinstellungen" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:31 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -d " ++"I<destination[/instance]> [ -o I<option[=value]> ] ... [ -o I<option[=value]" ++"> ]" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] -d I<Ziel" ++"[/Instanz]> [ -o I<Option[=Wert]> ] ... [ -o I<Option[=Wert]> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:40 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -p " ++"I<destination[/instance]> ] -l" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -p " ++"I<Ziel[/Instanz]> ] -l" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:54 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -o I<option" ++"[=value]> ] ... [ -o I<option[=value]> ] [ -p I<destination[/instance]> ] -r " ++"I<option>" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -o " ++"I<Option[=Wert]> ] ... [ -o I<Option[=Wert]> ] [ -p I<Ziel[/Instanz]> ] -r " ++"I<Option>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:62 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -x " ++"I<destination[/instance]>" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] -x I<Ziel" ++"[/Instanz]>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:66 ++msgid "" ++"I<lpoptions> displays or sets printer options and defaults. I<lpoptions> " ++"shows the default printer options when run with no arguments. Other options " ++"include:" ++msgstr "" ++"I<lpoptions> zeigt oder setzt die Druckeroptionen und Vorgaben. I<lpoptions> " ++"zeigt die Optionen des Standarddruckers, wenn es ohne Argumente aufgerufen " ++"wird. Andere Optionen sind:" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:70 ++msgid "Enables encryption when communicating with the CUPS server." ++msgstr "Aktiviert Verschlüsselung für die Kommunikation mit dem CUPS-Server." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:74 ++msgid "Uses an alternate username." ++msgstr "Benutzt einen alternativen Benutzernamen." ++ ++# type: TP ++#. type: TP ++#: lpoptions.man.in:74 ++#, no-wrap ++msgid "-d destination[/instance]" ++msgstr "-d Ziel[/Instanz]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:80 ++msgid "" ++"Sets the user default printer to I<destination>. If I<instance> is supplied " ++"then that particular instance is used. This option overrides the system " ++"default printer for the current user." ++msgstr "" ++"Setzt den Benutzer-Standarddrucker auf I<Ziel>. Falls I<Instanz> angegeben " ++"ist, wird diese benutzt. Diese Option überschreibt den System-" ++"Standarddrucker für den aktuellen Benutzer." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:84 ++msgid "Uses an alternate server." ++msgstr "Verwendet einen alternativen Server." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:88 ++msgid "Lists the printer specific options and their current settings." ++msgstr "" ++"Listet die Drucker-spezifischen Optionen und ihre aktuellen Einstellungen " ++"auf." ++ ++# type: TP ++#. type: TP ++#: lpoptions.man.in:88 lpr.man:90 ++#, no-wrap ++msgid "-o option[=value]" ++msgstr "-o Option[=Wert]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:92 ++msgid "Specifies a new option for the named destination." ++msgstr "Spezifiziert eine neue Option für das benannte Ziel." ++ ++# type: TP ++#. type: TP ++#: lpoptions.man.in:92 ++#, no-wrap ++msgid "-p destination[/instance]" ++msgstr "-p Ziel[/Instanz]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:98 ++msgid "" ++"Sets the destination and instance, if specified, for any options that " ++"follow. If the named instance does not exist then it is created." ++msgstr "" ++"Setzt das Ziel und die Instanz, falls angegeben, für jede folgende Option. " ++"Falls die benannte Instanz nicht existiert, wird sie erstellt." ++ ++# type: TP ++#. type: TP ++#: lpoptions.man.in:98 ++#, no-wrap ++msgid "-r option" ++msgstr "-r Option" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:102 ++msgid "Removes the specified option for the named destination." ++msgstr "Entfernt die spezifizierte Option für das benannte Ziel." ++ ++# type: TP ++#. type: TP ++#: lpoptions.man.in:102 ++#, no-wrap ++msgid "-x destination[/instance]" ++msgstr "-x Ziel[/Instanz]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:108 ++msgid "" ++"Removes the options for the named destination and instance, if specified. If " ++"the named instance does not exist then this does nothing." ++msgstr "" ++"Entfernt die Optionen für die benannten Ziele und Instanzen, falls " ++"angegeben. Falls die benannte Instanz nicht existiert, passiert nichts." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:112 ++msgid "" ++"If no options are specified using the I<-o> option, then the current options " ++"for the named printer are reported on the standard output." ++msgstr "" ++"Falls nicht mittels der Option I<-o> Optionen angegeben sind, werden die " ++"aktuellen Optionen für die benannten Drucker auf der Standardausgabe " ++"berichtet." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:115 ++msgid "" ++"Options set with the I<lpoptions> command are used by the I<lp(1)> and I<lpr" ++"(1)> commands when submitting jobs." ++msgstr "" ++"Optionen, die mit dem Befehl I<lpoptions> gesetzt werden, werden von den " ++"Befehlen I<lp(1)> und I<lpr(1)> bein Einreichen von Druckaufträgen verwandt." ++ ++# type: SH ++#. type: SH ++#: lpoptions.man.in:115 ++#, no-wrap ++msgid "ROOT ACCOUNT OPTIONS" ++msgstr "ROOT-KONTOOPTIONEN" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:119 ++msgid "" ++"When run by the root user, I<lpoptions> gets and sets default options and " ++"instances for I<all users> in the @CUPS_SERVERROOT@/lpoptions file." ++msgstr "" ++"Wenn I<lpoptions> vom Benutzer root ausgeführt wird, erhält und setzt es " ++"Optionen und Instanzen für I<alle Benutzer> in der Datei @CUPS_SERVERROOT@/" ++"lpoptions." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:121 ++msgid "The I<lpoptions> command is unique to CUPS." ++msgstr "Der Befehl I<lpoptions> ist eine Besonderheit von CUPS." ++ ++# type: SH ++#. type: SH ++#: lpoptions.man.in:121 ++#, no-wrap ++msgid "FILES" ++msgstr "DATEIEN" ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:124 ++msgid "" ++"~/.cups/lpoptions - user defaults and instances created by non-root users." ++msgstr "" ++"~/.cups/lpoptions - Benutzervorgaben und von Nicht-Root-Benutzern erstellte " ++"Instanzen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:127 ++msgid "" ++"@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances created by " ++"the root user." ++msgstr "" ++"@CUPS_SERVERROOT@/lpoptions - systemweite Vorgaben und Instanzen, die vom " ++"Root-Benutzer erstellt wurden." ++ ++# type: Plain text ++#. type: Plain text ++#: lpoptions.man.in:129 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpr(1)>," ++msgstr "I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpr(1)>," ++ ++# type: TH ++#. type: TH ++#: lppasswd.man:15 ++#, no-wrap ++msgid "lppasswd" ++msgstr "lppasswd" ++ ++# type: TH ++#. type: TH ++#: lppasswd.man:15 ++#, no-wrap ++msgid "22 February 2008" ++msgstr "22. Februar 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:18 ++msgid "lppasswd - add, change, or delete digest passwords." ++msgstr "lppasswd - ändert, löscht oder fügt Auszugspasswörter hinzu." ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:23 ++msgid "B<lppasswd> [ I<username> ]" ++msgstr "B<lppasswd> [ I<Benutzername> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:29 ++msgid "B<lppasswd> -a [ -g I<groupname> ] I<username>" ++msgstr "B<lppasswd> -a [ -g I<Gruppenname> ] I<Benutzername>" ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:33 ++msgid "B<lppasswd> -x I<username>" ++msgstr "B<lppasswd> -x I<Benutzername>" ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:41 ++msgid "" ++"I<lppasswd> adds, changes, or deletes passwords in the CUPS digest password " ++"file, I<passwd.md5>. When run by a normal user, I<lppasswd> will prompt for " ++"the old and new passwords. When run by the super-user, I<lppasswd> can add " ++"new accounts (I<-a username>), change existing accounts (I<username>), or " ++"delete accounts (I<-x username>) in the digest password file. Digest " ++"usernames do not have to match local UNIX usernames." ++msgstr "" ++"I<lppasswd> ändert, löscht oder fügt Passwörter in der CUPS-" ++"Passwortauszugsdatei I<passwd.md5> hinzu. Wenn es von einem normalen " ++"Benutzer ausgeführt wird, wird I<lppasswd> nach den alten und neuen " ++"Passwörtern fragen. Wenn es von einem Super-user ausgeführt wird, kann " ++"I<lppasswd> neue Konten hinzufügen (I<-a Benutzername>), existierende Konten " ++"ändern (I<Benutzername>) oder Konten in der Passwortauszugsdatei löschen " ++"(I<-x Benutzername>). Auszüge von Benutzernamen müssen nicht lokalen UNIX-" ++"Benutzernamen entsprechen." ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:43 ++msgid "I<lppasswd> supports the following options:" ++msgstr "I<lppasswd> unterstützt die folgenden Optionen:" ++ ++# type: TP ++#. type: TP ++#: lppasswd.man:43 ++#, no-wrap ++msgid "-g groupname" ++msgstr "-g Gruppenname" ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:47 ++msgid "Specifies a group other than the default system group." ++msgstr "Spezifiziert eine von der Standardsystemgruppe verschiedene Gruppe" ++ ++# type: SH ++#. type: SH ++#: lppasswd.man:47 ++#, no-wrap ++msgid "SECURITY ISSUES" ++msgstr "SICHERHEITSPROBLEME" ++ ++# FIXME s/program is not installed to allow ordinary users to change their ++# passwords/program, which allows ordinary users to change their ++# passwords, is not installed/ ++#. type: Plain text ++#: lppasswd.man:51 ++msgid "" ++"By default, the I<lppasswd> program is not installed to allow ordinary users " ++"to change their passwords. To enable this, the I<lppasswd> command must be " ++"made setuid to root with the command:" ++msgstr "" ++"Standardmäßig ist das Programm I<lppasswd> nicht installiert, um normalen " ++"Benutzern zu erlauben, ihre Passwörter zu ändern. Um dies einzuschalten, " ++"muss der I<lppasswd>-Befehl setuid auf Root gemacht werden mit dem Befehl:" ++ ++#. type: Plain text ++#: lppasswd.man:54 ++#, no-wrap ++msgid "chmod u+s lppasswd\n" ++msgstr "chmod u+s lppasswd\n" ++ ++#. type: Plain text ++#: lppasswd.man:60 ++msgid "" ++"While every attempt has been made to make I<lppasswd> secure against " ++"exploits that could grant super-user privileges to unprivileged users, " ++"paranoid system administrators may wish to use Basic authentication with " ++"accounts managed by PAM instead." ++msgstr "" ++"Obwohl jeglicher Versuch unternommen wurde, I<lppasswd> gegen Exploits zu " ++"sichern, die unprivilegierten Benutzern Superuser-Rechte gewähren, könnten " ++"paranoide Systemadministratoren wünschen, die grundlegende Authenifizierung " ++"stattdessen mit Konten zu benutzen, die von PAM verwaltet werden." ++ ++# type: Plain text ++#. type: Plain text ++#: lppasswd.man:62 ++msgid "I<lp(1)>, I<lpr(1)>," ++msgstr "I<lp(1)>, I<lpr(1)>," ++ ++# type: TH ++#. type: TH ++#: lpq.man:15 ++#, no-wrap ++msgid "lpq" ++msgstr "lpq" ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:18 ++msgid "lpq - show printer queue status" ++msgstr "lpq - zeigt den Status von Druckerwarteschlangen" ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:29 ++msgid "" ++"B<lpq> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination[/" ++"instance]> ] [ -a ] [ -l ] [ I<+interval> ]" ++msgstr "" ++"B<lpq> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -P I<Ziel[/" ++"Instanz]> ] [ -a ] [ -l ] [ I<+Intervall> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:33 ++msgid "" ++"I<lpq> shows the current print queue status on the named printer. Jobs " ++"queued on the default destination will be shown if no printer or class is " ++"specified on the command-line." ++msgstr "" ++"I<lpq> zeigt den aktuellen Druckerwarteschlangenstatus auf dem benannten " ++"Drucker. Aufträge, die auf dem Standardziel auf den Druck warten, werden " ++"angezeigt, falls kein Drucker oder keine Druckerklasse auf der Kommandozeile " ++"angegeben ist." ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:37 ++msgid "" ++"The I<+interval> option allows you to continuously report the jobs in the " ++"queue until the queue is empty; the list of jobs is shown once every " ++"I<interval> seconds." ++msgstr "" ++"Die Option I<+Intervall> erlaubt es Ihnen, kontinuierlich die Aufträge in " ++"der Warteschlange zu berichten, bis diese leer ist; die Liste der Aufträge " ++"wird einmal alle I<Intervall> Sekunden angezeigt." ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:39 ++msgid "I<lpq> supports the following options:" ++msgstr "I<lpq> unterstützt die folgenden Optionen:" ++ ++# type: TP ++#. type: TP ++#: lpq.man:43 lpr.man:63 lprm.man:41 ++#, no-wrap ++msgid "-P destination[/instance]" ++msgstr "-P Ziel[/Instanz]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:47 ++msgid "Specifies an alternate printer or class name." ++msgstr "Spezifiziert einen alternativen Drucker- oder Klassennamen." ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:55 ++msgid "Reports jobs on all printers." ++msgstr "Berichtet Aufträge auf allen Druckern." ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:63 ++msgid "Requests a more verbose (long) reporting format." ++msgstr "Erbittet ein ausführlicheres (langes) Berichtsformat." ++ ++# type: Plain text ++#. type: Plain text ++#: lpq.man:66 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," ++msgstr "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," ++ ++# type: TH ++#. type: TH ++#: lpr.man:15 ++#, no-wrap ++msgid "lpr" ++msgstr "lpr" ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:18 ++msgid "lpr - print files" ++msgstr "lpr - druckt Dateien" ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:35 ++msgid "" ++"B<lpr> [ -E ] [ -H I<server[:port]> ] [ -U I<username> ] [ -P I<destination[/" ++"instance]> ] [ -# I<num-copies> [ -h ] [ -l ] [ -m ] [ -o I<option[=value]" ++"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<title> ] [ I<file(s)> ]" ++msgstr "" ++"B<lpr> [ -E ] [ -H I<Server[:Port]> ] [ -U I<Benutzername> ] [ -P I<Ziel[/" ++"Instanz]> ] [ -# I<Anzahl-Kopien> [ -h ] [ -l ] [ -m ] [ -o I<Option[=Wert]" ++"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<Titel> ] [ I<Datei(en)> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:40 ++msgid "" ++"I<lpr> submits files for printing. Files named on the command line are sent " ++"to the named printer (or the default destination if no destination is " ++"specified). If no files are listed on the command-line, I<lpr> reads the " ++"print file from the standard input." ++msgstr "" ++"I<lpr> reicht Dateien zum Drucken ein. Auf der Kommandozeile benannte " ++"Dateien werden zum benannten Drucker (oder zum Standardziel falls kein Ziel " ++"angegeben ist) gesandt. Falls auf der Kommandozeile keine Dateien aufgeführt " ++"sind, liest I<lpr> die zu druckenden Dateien von der Standardeingabe." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:47 ++msgid "The following options are recognized by I<lpr>:" ++msgstr "Die folgenden Optionen werden von I<lpr> erkannt:" ++ ++# type: TP ++#. type: TP ++#: lpr.man:51 ++#, no-wrap ++msgid "-H server[:port]" ++msgstr "-H Server[:Port]" ++ ++# type: TP ++#. type: TP ++#: lpr.man:55 ++#, no-wrap ++msgid "-C \"name\"" ++msgstr "-C \"Name\"" ++ ++# type: TP ++#. type: TP ++#: lpr.man:57 ++#, no-wrap ++msgid "-J \"name\"" ++msgstr "-J \"Name\"" ++ ++# type: TP ++#. type: TP ++#: lpr.man:59 ++#, no-wrap ++msgid "-T \"name\"" ++msgstr "-T \"Name\"" ++ ++# type: TP ++#. type: TP ++#: lpr.man:71 ++#, no-wrap ++msgid "-# I<copies>" ++msgstr "-# I<Kopien>" ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:80 ++msgid "" ++"Disables banner printing. This option is equivalent to \"-o job-sheets=none" ++"\"." ++msgstr "" ++"Deaktiviert das Drucken von Deckblättern. Diese Option ist äquivalent zu »-o " ++"job-sheets=none«." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:86 ++msgid "" ++"Specifies that the print file is already formatted for the destination and " ++"should be sent without filtering. This option is equivalent to \"-o raw\"." ++msgstr "" ++"Spezifiziert, dass die Druckdatei bereits für das Ziel formatiert ist und " ++"ohne Filtern gesendet werden soll. Diese Option ist äquivalent zu »-o raw«." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:90 ++msgid "Send an email on job completion." ++msgstr "Schickt eine E-Mail nach Erledigung des Auftrags." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:94 ++msgid "Sets a job option." ++msgstr "Setzt eine Auftrags-Option." ++ ++# type: TP ++#. type: TP ++#: lpr.man:94 ++#, no-wrap ++msgid "-p" ++msgstr "-p" ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:101 ++msgid "" ++"Specifies that the print file should be formatted with a shaded header with " ++"the date, time, job name, and page number. This option is equivalent to \"-o " ++"prettyprint\" and is only useful when printing text files." ++msgstr "" ++"Spezifiziert, dass die Druckdatei mit einem schattierten Kopf mit Datum, " ++"Uhrzeit, Auftragsname und Seitennummer formatiert werden soll. Diese Option " ++"Ist äquivalent zu »-o prettyprint« und ist nur beim Druck von Textdateien " ++"nützlich." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:105 ++msgid "Hold job for printing." ++msgstr "Druckauftrag zum Drucken anhalten." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:110 ++msgid "" ++"Specifies that the named print files should be deleted after printing them." ++msgstr "" ++"Spezifiziert, dass die benannte Druckdatei nach dem Druck gelöscht werden " ++"soll." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:113 ++msgid "" ++"The \"c\", \"d\", \"f\", \"g\", \"i\", \"n\", \"t\", \"v\", and \"w\" " ++"options are not supported by CUPS and produce a warning message if used." ++msgstr "" ++"Die Optionen »c«, »d«, »f«, »g«, »i«, »n«, »t«, »v« und »w« werden von CUPS " ++"nicht unterstützt und führen bei Benutzung zu einer Warnmeldung." ++ ++# type: Plain text ++#. type: Plain text ++#: lpr.man:116 ++msgid "" ++"I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpoptions(1)>, I<lpq(1)>, I<lprm(1)" ++">, I<lpstat(1)>," ++msgstr "" ++"I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpoptions(1)>, I<lpq(1)>, I<lprm(1)" ++">, I<lpstat(1)>," ++ ++# type: TH ++#. type: TH ++#: lprm.man:15 ++#, no-wrap ++msgid "lprm" ++msgstr "lprm" ++ ++#. type: TH ++#: lprm.man:15 ++#, no-wrap ++msgid "28 August 2009" ++msgstr "28. August 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:18 ++msgid "lprm - cancel print jobs" ++msgstr "lprm - Druckaufträge abbrechen" ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:29 ++msgid "" ++"B<lprm> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination" ++"[/instance]> ] [ - ] [ I<job ID(s)> ]" ++msgstr "" ++"B<lprm> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -P I<Ziel[/" ++"Instanz]> ] [ - ] [ I<Auftrags-ID(s)> ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:35 ++msgid "" ++"I<lprm> cancels print jobs that have been queued for printing. If no " ++"arguments are supplied, the current job on the default destination is " ++"cancelled. You can specify one or more job ID numbers to cancel those jobs " ++"or use the I<-> option to cancel all jobs." ++msgstr "" ++"I<lprm> bricht Druckaufträge ab, die zum Drucken eingereicht wurden. Falls " ++"keine Argumente angegeben werden, wird der aktuelle Auftrag auf dem " ++"Standardziel abgebrochen. Sie können eine oder mehrere Aufrags-ID-Nummern " ++"angeben, um diese Aufträge abzubrechen, oder die Option I<-> verwenden, um " ++"alle Aufträge abzubrechen." ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:37 ++msgid "The I<lprm> command supports the following options:" ++msgstr "Der Befehl I<lprm> unterstützt die folgenden Optionen:" ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:45 ++msgid "Specifies the destination printer or class." ++msgstr "Spezifiziert den Zieldrucker oder die Zielklasse." ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:56 ++msgid "" ++"The CUPS version of I<lprm> is compatible with the standard Berkeley I<lprm> " ++"command." ++msgstr "" ++"Die CUPS-Version von I<lprm> ist zum Standard-Berkeley-Befehl I<lprm> " ++"kompatibel." ++ ++# type: Plain text ++#. type: Plain text ++#: lprm.man:59 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," ++msgstr "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," ++ ++# type: TH ++#. type: TH ++#: lpstat.man:15 ++#, no-wrap ++msgid "lpstat" ++msgstr "lpstat" ++ ++# type: TH ++#. type: TH ++#: lpstat.man:15 ++#, no-wrap ++msgid "10 September 2008" ++msgstr "10. September 2008" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:18 ++msgid "lpstat - print cups status information" ++msgstr "lpstat - gibt CUPS-Statusinformationen aus" ++ ++#. type: Plain text ++#: lpstat.man:39 ++msgid "" ++"B<lpstat> [ -E ] [ -H ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -l ] " ++"[ -W I<which-jobs> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -" ++"d ] [ -o [ I<destination(s)> ] ] [ -p [ I<printer(s)> ] ] [ -r ] [ -R ] [ -" ++"s ] [ -t ] [ -u [ I<user(s)> ] ] [ -v [ I<printer(s)> ] ]" ++msgstr "" ++"B<lpstat> [ -E ] [ -H ] [ -U I<Benutzername> ] [ -h I<Rechnername[:Port]> ] " ++"[ -l ] [ -W I<welche-Druckaufträge> ] [ -a [ I<Ziel(e)> ] ] [ -c [ I<Klasse" ++"(n)> ] ] [ -d ] [ -o [ I<Ziel(e)> ] ] [ -p [ I<Drucker> ] ] [ -r ] [ -R ] [ -" ++"s ] [ -t ] [ -u [ I<Benutzer> ] ] [ -v [ I<Drucker> ] ]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:43 ++msgid "" ++"I<lpstat> displays status information about the current classes, jobs, and " ++"printers. When run with no arguments, I<lpstat> will list jobs queued by the " ++"current user." ++msgstr "" ++"I<lpstat> zeigt Statusinformationen über die aktuellen Klassen, Aufträge und " ++"Drucker an. Falls I<lpstat> ohne Argumente aufgerufen wird, führt es die vom " ++"aktuellen Benutzer eingereichten Druckaufträge auf." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:45 ++msgid "The I<lpstat> command supports the following options:" ++msgstr "Der Befehl I<lpstat> unterstützt die folgenden Optionen:" ++ ++#. type: TP ++#: lpstat.man:49 ++#, no-wrap ++msgid "-H" ++msgstr "-H" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:53 ++msgid "Shows the server hostname and port." ++msgstr "Zeigt den Rechnernamen und Port des Servers." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:53 ++#, no-wrap ++msgid "-R" ++msgstr "-R" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:57 ++msgid "Shows the ranking of print jobs." ++msgstr "Zeigt die Rangordnung der Druckaufträge." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:61 ++#, no-wrap ++msgid "-W which-jobs" ++msgstr "-W welche-Aufträge" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:69 ++msgid "" ++"Specifies which jobs to show, I<completed> or I<not-completed> (the " ++"default). This option I<must> appear before the I<-o> option and/or any " ++"printer names, otherwise the default (not-completed) value will be used in " ++"the request to the scheduler." ++msgstr "" ++"Spezifiziert welche Druckaufträge angezeigt werden sollen, die " ++"»I<completed>« (abgeschlossenen) oder (standardmäßig) die »I<not-" ++"completed>« (nicht-abgeschlossenen). Diese Option I<muss> vor der Option I<-" ++"o> und/oder allen Druckernamen aufgeführt werden, da ansonsten der " ++"Vorgabewert (not-completed) für alle Anfragen am Auftragsplaner (Scheduler) " ++"verwandt wird." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:69 ++#, no-wrap ++msgid "-a [printer(s)]" ++msgstr "-a [Drucker]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:74 ++msgid "" ++"Shows the accepting state of printer queues. If no printers are specified " ++"then all printers are listed." ++msgstr "" ++"Zeigt den Akzeptierzustand der Druckerwarteschlangen. Falls keine Drucker " ++"angegeben sind, werden alle Drucker aufgeführt." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:74 ++#, no-wrap ++msgid "-c [class(es)]" ++msgstr "-c [Klasse(n)]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:79 ++msgid "" ++"Shows the printer classes and the printers that belong to them. If no " ++"classes are specified then all classes are listed." ++msgstr "" ++"Zeigt die Druckerklassen und die zugehörigen Drucker. Falls keine Klassen " ++"angegeben sind, werden alle Klassen aufgeführt." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:79 ++#, no-wrap ++msgid "-d" ++msgstr "-d" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:83 ++msgid "Shows the current default destination." ++msgstr "Zeigt das aktuelle Standardziel." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:91 ++msgid "Shows a long listing of printers, classes, or jobs." ++msgstr "Zeigt eine lange Auflistung von Druckern, Klassen oder Aufträgen." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:91 ++#, no-wrap ++msgid "-o [destination(s)]" ++msgstr "-o [Ziel(e)]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:96 ++msgid "" ++"Shows the jobs queue on the specified destinations. If no destinations are " ++"specified all jobs are shown." ++msgstr "" ++"Zeigt die Auftragswarteschlangen der angegebenen Ziele. Falls keine Ziele " ++"angegeben sind, werden alle Aufträge gezeigt." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:96 ++#, no-wrap ++msgid "-p [printer(s)]" ++msgstr "-p [Drucker]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:101 ++msgid "" ++"Shows the printers and whether or not they are enabled for printing. If no " ++"printers are specified then all printers are listed." ++msgstr "" ++"Zeigt die Drucker und ob sie zum Druck aktiviert wurden. Falls keine Drucker " ++"angegeben wurden, werden alle Drucker aufgeführt." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:105 ++msgid "Shows whether the CUPS server is running." ++msgstr "Zeigt, ob der CUPS-Server läuft." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:112 ++msgid "" ++"Shows a status summary, including the default destination, a list of classes " ++"and their member printers, and a list of printers and their associated " ++"devices. This is equivalent to using the \"-d\", \"-c\", and \"-v\" options." ++msgstr "" ++"Zeigt eine Statuszusammenfassung, darunter das Standardziel, eine Liste der " ++"Klassen und ihrer zugehörigen Drucker und eine Liste der Drucker und der " ++"zugehörigen Geräte. Dies ist äquivalent zur Verwendung der Optionen »-d«, »-" ++"c« und »-v«." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:117 ++msgid "" ++"Shows all status information. This is equivalent to using the \"-r\", \"-d" ++"\", \"-c\", \"-v\", \"-a\", \"-p\", and \"-o\" options." ++msgstr "" ++"Zeigt alle Statusinformationen. Dies ist äquivalent zur Verwendung der " ++"Optionen »-r«, »-d«, »-c«, »-v«, »-a«, »-p«, and »-o«." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:117 ++#, no-wrap ++msgid "-u [user(s)]" ++msgstr "-u [Benutzer]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:122 ++msgid "" ++"Shows a list of print jobs queued by the specified users. If no users are " ++"specified, lists the jobs queued by the current user." ++msgstr "" ++"Zeigt eine Liste von Druckaufträgen, die von den angegebenen Benutzern " ++"anstehen. Wenn keine Benutzer angegeben wurden, werden die Druckaufträge des " ++"aktuellen Benutzers aufgelistet." ++ ++# type: TP ++#. type: TP ++#: lpstat.man:122 ++#, no-wrap ++msgid "-v [printer(s)]" ++msgstr "-v [Drucker]" ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:127 ++msgid "" ++"Shows the printers and what device they are attached to. If no printers are " ++"specified then all printers are listed." ++msgstr "" ++"Zeigt die Drucker und welchem Gerät sie zugeordnet sind. Wenn keine Drucker " ++"angegeben sind, werden alle Drucker aufgelistet." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:131 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", and \"#\". Also, printer " ++"and class names are I<not> case-sensitive." ++msgstr "" ++"Anders als in einem System-V-Drucksystem erlaubt CUPS, dass Druckernamen " ++"jedes druckbare Zeichen außer LEERZEICHEN, TABULATOR, »/« oder »#« " ++"enthalten. Außerdem wird bei Drucker- und Klassennamen Groß- und " ++"Kleinschreibung nicht unterschieden." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:133 ++msgid "The \"-h\", \"-E\", \"-U\", and \"-W\" options are unique to CUPS." ++msgstr "" ++"Die Optionen »-h«, »-E«, »-U« und »-W« sind eine Besonderheit von CUPS." ++ ++# type: Plain text ++#. type: Plain text ++#: lpstat.man:135 ++msgid "The Solaris \"-f\", \"-P\", and \"-S\" options are silently ignored." ++msgstr "" ++"Die Solaris-Optionen »-f«, »-P« und »-S« werden stillschweigend ignoriert." ++ ++# type: TH ++#. type: TH ++#: mailto.conf.man:15 ++#, no-wrap ++msgid "mailto.conf" ++msgstr "mailto.conf" ++ ++# type: TH ++#. type: TH ++#: mailto.conf.man:15 ++#, no-wrap ++msgid "12 July 2006" ++msgstr "12. Juli 2006" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:18 ++msgid "mailto.conf - configuration file for cups email notifier" ++msgstr "" ++"mailto.conf - Konfigurationsdatei für Versender von CUPS-E-Mail-" ++"Benachrichtigungen" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:21 ++msgid "" ++"The I<mailto.conf> file defines the local mail server and email notification " ++"preferences for CUPS." ++msgstr "" ++"Die Datei I<mailto.conf> definiert den lokalen Mail-Server und die E-Mail-" ++"Benachrichtigungseinstellungen für CUPS." ++ ++# type: TP ++#. type: TP ++#: mailto.conf.man:25 ++#, no-wrap ++msgid "Cc I<cc-address@domain.com>" ++msgstr "Cc I<cc-address@domain.com>" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:29 ++msgid "Specifies an additional recipient for all email notifications." ++msgstr "" ++"Spezifiziert einen zusätzlichen Empfänger für alle E-Mail-Benachrichtigungen." ++ ++# type: TP ++#. type: TP ++#: mailto.conf.man:29 ++#, no-wrap ++msgid "From I<from-address@domain.com>" ++msgstr "Von I<from-address@domain.com>" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:33 ++msgid "Specifies the sender of email notifications." ++msgstr "Spezifiziert den Sender von E-Mail-Benachrichtigungen." ++ ++# type: TP ++#. type: TP ++#: mailto.conf.man:33 ++#, no-wrap ++msgid "Sendmail I<sendmail command and options>" ++msgstr "Sendmail I<Sendmail-Befehl und Optionen>" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:40 ++msgid "" ++"Specifies the sendmail command to use when sending email notifications. Only " ++"one I<Sendmail> or I<SMTPServer> line may be present in the I<mailto.conf> " ++"file. If multiple lines are present, only the last one is used." ++msgstr "" ++"Spezifiziert den Sendmail-Befehl, der benutzt wird, wenn E-Mail-" ++"Benachrichtigungen versandt werden. Nur eine I<Sendmail>- oder I<SMTPServer>-" ++"Zeile kann in der I<mailto.conf>-Datei vorhanden sein. Wenn mehrere Zeilen " ++"vorhanden sind, wird nur die letzte benutzt." ++ ++# type: TP ++#. type: TP ++#: mailto.conf.man:40 ++#, no-wrap ++msgid "SMTPServer I<servername>" ++msgstr "SMTPServer I<Servername>" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:47 ++msgid "" ++"Specifies a SMTP server to send email notifications to. Only one I<Sendmail> " ++"or I<SMTPServer> line may be present in the I<mailto.conf> file. If multiple " ++"lines are present, only the last one is used." ++msgstr "" ++"Spezifiziert den SMTP-Server, der benutzt wird, um E-Mail-Benachrichtigungen " ++"zu versenden. Nur eine I<Sendmail>- oder I<SMTPServer>-Zeile kann in der " ++"I<mailto.conf>-Datei vorhanden sein. Wenn mehrere Zeilen vorhanden sind, " ++"wird nur die letzte benutzt." ++ ++# type: TP ++#. type: TP ++#: mailto.conf.man:47 ++#, no-wrap ++msgid "Subject I<subject-prefix>" ++msgstr "Betreff I<Betreff-Vorsilbe>" ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:51 ++msgid "" ++"Specifies a prefix string for the subject line of an email notification." ++msgstr "" ++"Spezifiziert eine Vorsilbenzeichenkette für die Betreffzeile einer E-Mail-" ++"Benachrichtigung." ++ ++# type: Plain text ++#. type: Plain text ++#: mailto.conf.man:54 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, I<printers.conf(5)>," ++msgstr "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, I<printers.conf(5)>," ++ ++# type: TH ++#. type: TH ++#: mime.convs.man:15 ++#, no-wrap ++msgid "mime.convs" ++msgstr "mime.convs" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:18 ++msgid "mime.convs - mime type conversion file for cups" ++msgstr "mime.convs - MIME-Typ-Konvertierungsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:23 ++msgid "" ++"The I<mime.convs> file defines the filters that are available for converting " ++"files from one format to another. The standard filters support text, PDF, " ++"PostScript, HP-GL/2, and many types of image files." ++msgstr "" ++"Die Datei I<mime.convs> definiert die Filter, die für das Konvertieren von " ++"einem Format in ein anderes verfügbar sind. Der Standardfilter unterstützt " ++"text, PDF, PostScript, HP-GL/2 und viele Bilddateitypen." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:26 ++msgid "" ++"Additional filters can be added to the I<mime.convs> file or (preferably) to " ++"other files in the CUPS configuration directory." ++msgstr "" ++"Zusätzliche Filter können zu der Datei I<mime.convs> oder (bevorzugt) zu " ++"anderen Dateien im CUPS-Konfigurationsverzeichnis hinzugefügt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:31 ++msgid "" ++"Each line in the I<mime.convs> file is a comment, blank, or filter line. " ++"Comment lines start with the # character. Filter lines specify the source " ++"and destination MIME types along with a relative cost associated with the " ++"filter and the filter to run:" ++msgstr "" ++"Jede Zeile in der Datei I<mime.convs> ist ein Kommentar, leer oder eine " ++"Filterzeile. Kommentardateien beginnen mit dem »#«-Zeichen. Filterzeilen " ++"spezifizieren den Quell- und Ziel-MIME-Typ zusammen mit den relativen " ++"Belastungen, die mit dem Filter assoziiert sind, und den auszuführenden " ++"Filter:" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:36 ++#, no-wrap ++msgid "" ++"super/type super/type cost filter\n" ++"application/postscript application/vnd.cups-raster 50 pstoraster\n" ++msgstr "" ++"super/type super/type cost filter\n" ++"application/postscript application/vnd.cups-raster 50 pstoraster\n" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.convs.man:40 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " ++"I<printers.conf(5)>," ++msgstr "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " ++"I<printers.conf(5)>," ++ ++# type: TH ++#. type: TH ++#: mime.types.man:15 ++#, no-wrap ++msgid "mime.types" ++msgstr "mime.types" ++ ++# type: TH ++#. type: TH ++#: mime.types.man:15 ++#, no-wrap ++msgid "16 May 2009" ++msgstr "16. Mai 2009" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:18 ++msgid "mime.types - mime type description file for cups" ++msgstr "mime.types - MIME-Typ-Beschreibungsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:20 ++msgid "The I<mime.types> file defines the recognized file types." ++msgstr "Die Datei I<mime.types> beschreibt die erkannten Dateitypen." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:24 ++msgid "" ++"Additional file types can be added to I<mime.types> or (preferably) in " ++"additional files in the CUPS configuration directory with the extension \"." ++"types\"." ++msgstr "" ++"Zusätzliche Dateitypen können zu den I<mime.types> oder (vorzugsweise) in " ++"zusätzlichen Dateien im CUPS-Konfigurationsverzeichnis mit der Endung »." ++"types« hinzugefügt werden." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:30 ++msgid "" ++"Each line in the I<mime.types> file is a comment, blank, or rule line. " ++"Comment lines start with the # character. Rule lines start with the MIME " ++"type name and are optionally followed by a series of file recognition rules " ++"that are used to automatically identify print and web files:" ++msgstr "" ++"Jede Zeile in der Datei I<mime.types> ist ein Kommentar, leer oder eine " ++"Regelzeile. Kommentarzeilen beginnen mit dem #-Zeichen. Regelzeilen beginnen " ++"mit dem MIME-Typnamen und werden optional von einer Serie von " ++"Dateierkennungsregeln gefolgt, die benutzt werden, um Druck- und Web-Dateien " ++"automatisch zu erkennen:" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:34 ++#, no-wrap ++msgid " super/type rule [ ... ruleN]\n" ++msgstr " super/type Regel [ ... RegelN]\n" ++ ++#. type: Plain text ++#: mime.types.man:38 ++msgid "" ++"MIME type names are case-insensitive and are sorted in ascending " ++"alphanumeric order for the purposes of matching. See the \"TYPE MATCHING AND " ++"PRIORITY\" section for more information." ++msgstr "" ++"Bei MIME-Typnamen wird Groß- und Kleinschreibung nicht berücksichtigt. Sie " ++"sind in absteigender alphanumerischer Reihenfolge für Suchzwecke sortiert. " ++"Siehe den Abschnitt »TYP-ÜBEREINSTIMMUNG UND PRIORITÄT«, um weitere " ++"Informationen zu erhalten." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:42 ++msgid "" ++"The rules may be grouped using parenthesis, joined using \"+\" for a logical " ++"AND and \",\" or whitespace for a logical OR, and negated using \"!\"." ++msgstr "" ++"Die Regeln könnten durch Benutzung von Klammern gruppiert werden, zum " ++"Aneinanderhängen wird »+« für ein logisches UND und »,« oder Leerzeichen für " ++"ein logisches ODER und für Negation »!« benutzt." ++ ++# type: SH ++#. type: SH ++#: mime.types.man:42 ++#, no-wrap ++msgid "RULES" ++msgstr "REGELN" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:45 ++msgid "" ++"Rules take two forms - a filename extension by itself and functions with " ++"test values inside parenthesis. The following functions are available:" ++msgstr "" ++"Regeln nehmen zwei Formen an - eine eigenständige Dateinamenerweiterung und " ++"Funktionen mit Testwerten innerhalb von Klammern. Die folgenden Funktionen " ++"sind verfügbar:" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:45 ++#, no-wrap ++msgid "match(\"pattern\")" ++msgstr "match(\"Muster\")" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:49 ++msgid "Pattern match on filename" ++msgstr "Muster passt zu Dateiname" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:49 ++#, no-wrap ++msgid "ascii(offset,length)" ++msgstr "ascii(Versatz,Länge)" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:53 ++msgid "True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)" ++msgstr "" ++"Wahr, wenn Bytes gültiges druckbares ASCII sind (CR, NL, TAB, BS, 32-126)" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:53 ++#, no-wrap ++msgid "printable(offset,length)" ++msgstr "printable(Versatz,Länge)" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:57 ++msgid "" ++"True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)" ++msgstr "" ++"Wahr, wenn Bytes gültige druckbare 8-Bit-Zeichen sind (CR, NL, TAB, BS, " ++"32-126, 128-254)" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:57 ++#, no-wrap ++msgid "priority(number)" ++msgstr "priority(Zahl)" ++ ++#. type: Plain text ++#: mime.types.man:62 ++msgid "" ++"Specifies the relative priority of this MIME type. The default priority is " ++"100. Larger values have higher priority while smaller values have lower " ++"priority." ++msgstr "" ++"Spezifiziert die relative Priorität dieses MIME-Typs. Die Vorgabepriorität " ++"ist 100. Größere Werte haben höhere Priorität, während kleinere Werte eine " ++"niedrigere Priorität haben." ++ ++# type: TP ++#. type: TP ++#: mime.types.man:62 ++#, no-wrap ++msgid "string(offset,\"string\")" ++msgstr "string(Versatz,\"Zeichenkette\")" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:66 ++msgid "True if bytes are identical to string" ++msgstr "Wahr, wenn Bytes der Zeichenkette entsprechen" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:66 ++#, no-wrap ++msgid "istring(offset,\"string\")" ++msgstr "istring(Versatz,\"Zeichenkette\")" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:70 ++msgid "True if a case-insensitive comparison of the bytes is identical" ++msgstr "" ++"Wahr, wenn ein Vergleich, der Groß-/Kleinschreibung ignoriert, identisch ist" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:70 ++#, no-wrap ++msgid "char(offset,value)" ++msgstr "char(Versatz,Wert)" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:74 ++msgid "True if byte is identical" ++msgstr "Wahr, wenn Byte identisch ist" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:74 ++#, no-wrap ++msgid "short(offset,value)" ++msgstr "short(Versatz,Wert)" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:78 ++msgid "True if 16-bit integer is identical" ++msgstr "Wahr, wenn 16-Bit-Ganzzahl identisch ist" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:78 ++#, no-wrap ++msgid "int(offset,value)" ++msgstr "int(Versatz,Wert)" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:82 ++msgid "True if 32-bit integer is identical" ++msgstr "Wahr, wenn 32-Bit-Ganzzahl identisch ist" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:82 ++#, no-wrap ++msgid "locale(\"string\")" ++msgstr "locale(\"Zeichenkette\")" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:86 ++msgid "True if current locale matches string" ++msgstr "Wahr, wenn aktuelle Locale zu Zeichenkette passt" ++ ++# type: TP ++#. type: TP ++#: mime.types.man:86 ++#, no-wrap ++msgid "contains(offset,range,\"string\")" ++msgstr "contains(Versatz,Bereich,\"Zeichenkette\")" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:90 ++msgid "True if the range contains the string" ++msgstr "Wahr, wenn der Bereich die Zeichenkette enthält" ++ ++# type: SH ++#. type: SH ++#: mime.types.man:90 ++#, no-wrap ++msgid "STRING CONSTANTS" ++msgstr "ZEICHENKETTENKONSTANTEN" ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:94 ++msgid "" ++"String constants can be specified inside quotes (\"\") for strings " ++"containing whitespace and angle brackets (E<lt>E<gt>) for hexadecimal " ++"strings." ++msgstr "" ++"Zeichenkettenkonstanten können für Zeichenketten, die Leerzeichen und spitze " ++"Klammern (E<lt>E<gt>) für hexadezimale Zeichenketten enthalten, innerhalb " ++"von Anführungszeichen (\"\") angegeben werden." ++ ++#. type: SH ++#: mime.types.man:94 ++#, no-wrap ++msgid "TYPE MATCHING AND PRIORITY" ++msgstr "TYP-ÜBEREINSTIMMUNG UND PRIORITÄT" ++ ++#. type: Plain text ++#: mime.types.man:101 ++msgid "" ++"When CUPS needs to determine the MIME type of a given file, it checks every " ++"MIME type defined in the .types files. When two types have the same matching " ++"rules, the type chosen will depend on the type name and priority, with " ++"higher- priority types being used over lower-priority ones. If the types " ++"have the same priority, the type names are sorted alphanumerically in " ++"ascending order and the first type is chosen." ++msgstr "" ++"Wenn CUPS den MIME-Typ einer gegebenen Datei bestimmt, wird jeder MIME-Typ, " ++"der in den .types-Dateien definiert ist, geprüft. Wenn zwei Typen die " ++"gleichen passenden Regeln aufweisen, dann hängt der ausgewählte Typ von " ++"Typname und der Priorität ab, wobei Typen höherer Priorität denen mit " ++"niedriger Priorität vorgezogen werden. Wenn die Typen die gleiche Priorität " ++"haben, werden die Typnamen in alphanumerischer Reihenfolge sortiert und der " ++"erste ausgewählt." ++ ++#. type: Plain text ++#: mime.types.man:106 ++msgid "" ++"For example, if two types \"text/bar\" and \"text/foo\" are defined as " ++"matching the extension \"doc\", normally the type \"text/bar\" will be " ++"chosen since its name is alphanumerically smaller than \"text/foo\". " ++"However, if \"text/foo\" also defines a higher priority than \"text/bar\", " ++"\"text/foo\" will be chosen instead." ++msgstr "" ++"Wenn zum Beispiel zwei Typen »text/bar« und »text/foo« als passend zur " ++"Erweiterung »doc« definiert sind, wird normalerweise »text/bar« ausgewählt, " ++"weil der Name alphanumerisch kleiner ist als »text/foo«. Wenn jedoch für " ++"»text/foo« außerdem eine höhere Priorität als für »text/bar« definiert ist, " ++"wird stattdessen »text/foo« ausgewählt." ++ ++# type: Plain text ++#. type: Plain text ++#: mime.types.man:109 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " ++"I<printers.conf(5)>," ++msgstr "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " ++"I<printers.conf(5)>," ++ ++# type: TH ++#. type: TH ++#: printers.conf.man:15 ++#, no-wrap ++msgid "printers.conf" ++msgstr "printers.conf" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:18 ++msgid "printers.conf - printer configuration file for cups" ++msgstr "printers.conf - Druckerkonfigurationsdatei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:23 ++msgid "" ++"The I<printers.conf> file defines the local printers that are available. It " ++"is normally located in the I</etc/cups> directory and is generated " ++"automatically by the I<cupsd(8)> program when printers are added or deleted." ++msgstr "" ++"Die Datei I<printers.conf> definiert die verfügbaren lokalen Drucker. Sie " ++"befindet sich normalerweise im Verzeichnis I</etc/cups> und wird vom " ++"Programm I<cupsd(8)> automatisch beim Löschen oder Hinzufügen von Druckern " ++"generiert." ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:27 ++#, no-wrap ++msgid "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" ++msgstr "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:31 ++msgid "Defines a specific printer." ++msgstr "Definiert einen speziellen Drucker." ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:31 ++#, no-wrap ++msgid "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" ++msgstr "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:35 ++msgid "Defines a default printer." ++msgstr "Definiert einen Standarddrucker." ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:49 ++#, no-wrap ++msgid "DeviceURI uri" ++msgstr "DeviceURI uri" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:53 ++msgid "Specifies the device URI for a printer." ++msgstr "Spezifiziert die Geräte-URI eines Druckers." ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:53 ++#, no-wrap ++msgid "ErrorPolicy abort-job" ++msgstr "ErrorPolicy abort-job" ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:55 ++#, no-wrap ++msgid "ErrorPolicy retry-current-job" ++msgstr "ErrorPolicy retry-current-job" ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:57 ++#, no-wrap ++msgid "ErrorPolicy retry-job" ++msgstr "ErrorPolicy retry-job" ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:59 ++#, no-wrap ++msgid "ErrorPolicy stop-printer" ++msgstr "ErrorPolicy stop-printer" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:63 ++msgid "Specifies the error policy for the printer." ++msgstr "Spezifiziert die Fehler-Richtlinien für den Drucker." ++ ++# type: TP ++#. type: TP ++#: printers.conf.man:87 ++#, no-wrap ++msgid "PortMonitor monitor" ++msgstr "PortMonitor Monitor" ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:91 ++msgid "Specifies the port monitor for a printer." ++msgstr "Spezifiziert den Port-Monitor eines Druckers." ++ ++# type: Plain text ++#. type: Plain text ++#: printers.conf.man:118 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>," ++msgstr "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>," ++ ++# type: TH ++#. type: TH ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "subscriptions.conf" ++msgstr "subscriptions.conf" ++ ++# type: TH ++#. type: TH ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "30 April 2006" ++msgstr "30. April 2006" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:18 ++msgid "subscriptions.conf - subscriptions file for cups" ++msgstr "subscriptions.conf - Abonnement-Datei für CUPS" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:23 ++msgid "" ++"The I<subscriptions.conf> file defines the local subscriptions that are " ++"active. It is normally located in the I</etc/cups> directory and is " ++"generated automatically by the I<cupsd(8)> program when subscriptions are " ++"created, renewed, or cancelled." ++msgstr "" ++"Die Datei I<subscriptions.conf> definiert die Abonnements, die lokal aktiv " ++"sind. Sie liegt normalerweise im Verzeichnis I</etc/cups> und wird " ++"automatisch vom I<cupsd(8)>-Programm generiert, wenn Abonnements erstellt, " ++"erneuert oder beendet werden." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:27 ++#, no-wrap ++msgid "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" ++msgstr "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:31 ++msgid "Defines a subscription." ++msgstr "Definiert ein Abonnement." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:31 ++#, no-wrap ++msgid "Events name [ ... name ]" ++msgstr "Ereignisse Name [ ... Name ]" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:35 ++msgid "Specifies the events that are subscribed." ++msgstr "Gibt die Ereignisse an, die abonniert werden." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:35 ++#, no-wrap ++msgid "ExpirationTime unix-time" ++msgstr "ExpirationTime unix-time" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:40 ++msgid "" ++"Specifies the expiration time of a subscription as a UNIX time value in " ++"seconds since January 1st, 1970." ++msgstr "" ++"Spezifiziert die Ablaufzeit eines Abonnements als UNIX-Zeitwert in Sekunden " ++"seit dem 1. Januar 1970." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:40 ++#, no-wrap ++msgid "Interval seconds" ++msgstr "Intervallsekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:45 ++msgid "" ++"Specifies the preferred time interval for event notifications in seconds." ++msgstr "" ++"Spezifiziert das bevorzugte Zeitintervall für Ereignisbenachrichtigungen in " ++"Sekunden." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:45 ++#, no-wrap ++msgid "JobId job-id" ++msgstr "JobId job-id" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:49 ++msgid "Specifies the job ID associated with the subscription." ++msgstr "Spezifiziert die mit einem Abonnement verbundene Job-ID." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:49 ++#, no-wrap ++msgid "LeaseDuration seconds" ++msgstr "LeaseDuration Sekunden" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:54 ++msgid "" ++"Specifies the number of seconds that the subscription is valid for. If 0, " ++"the subscription does not expire." ++msgstr "" ++"Gibt die Anzahl der Sekunden an, für die ein Abonnement gültig ist. Falls " ++"der Wert 0 ist, läuft das Abonnement nicht ab." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:54 ++#, no-wrap ++msgid "NextEventId number" ++msgstr "NextEventId Zahl" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:59 ++msgid "Specifies the next notify-sequence-number to use for the subscription." ++msgstr "" ++"Spezifiziert die nächste Notify-sequence-number, die für ein Abonnement " ++"benutzt wird." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:59 ++#, no-wrap ++msgid "NextSubscriptionId number" ++msgstr "NextSubscriptionId Zahl" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:63 ++msgid "Specifies the next subscription-id to use." ++msgstr "Spezifiziert die nächste zu benutzende Subscription-ID." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:63 ++#, no-wrap ++msgid "Owner username" ++msgstr "Owner Benutzername" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:67 ++msgid "Specifies the user that owns the subscription." ++msgstr "Spezifiziert den Benutzer, dem das Abonnement gehört." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:67 ++#, no-wrap ++msgid "PrinterName printername" ++msgstr "PrinterName Druckername" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:71 ++msgid "Specifies the printer or class associated with the subscription." ++msgstr "" ++"Gibt den Drucker oder die Klasse an, die mit dem Abonnement verbunden ist." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:71 ++#, no-wrap ++msgid "Recipient uri" ++msgstr "Recipient URI" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:75 ++msgid "Specifies the notify-recipient-uri value for push-type notifications." ++msgstr "" ++"Spezifiziert den Notify-recipient-uri-Wert für Push-type-Benachrichtigungen." ++ ++# type: TP ++#. type: TP ++#: subscriptions.conf.man:75 ++#, no-wrap ++msgid "UserData hex-escaped-data" ++msgstr "UserData hex-escaped-data" ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:80 ++msgid "" ++"Specifies user data to be included in event notifications. This is typically " ++"the \"from\" address in mailto: notifications." ++msgstr "" ++"Spezifiziert Benutzerdaten, die in Ereignisbenachrichtigungen eingefügt " ++"werden. Dies ist normalerweise die »Von«-Adresse in mailto:-" ++"Benachrichtigungen." ++ ++# type: Plain text ++#. type: Plain text ++#: subscriptions.conf.man:83 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, printers.conf(5)" ++msgstr "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, printers.conf(5)" ++ ++# type: Plain text ++#~ msgid "" ++#~ "Sets a standard System V interface script or PPD file from the I<model> " ++#~ "directory." ++#~ msgstr "" ++#~ "Setzt ein Standard-System-V-Schnittstellenskript oder eine PPD-Datei aus " ++#~ "dem Verzeichnis I<Modell>." ++ ++# type: TH ++#~ msgid "17 November 2008" ++#~ msgstr "17. November 2008" ++ ++# type: TH ++#~ msgid "14 July 2009" ++#~ msgstr "14. Juli 2009" ++ ++# type: TP ++#~ msgid "DefaultCharset charset" ++#~ msgstr "DefaultCharset Zeichensatz" ++ ++# type: Plain text ++#~ msgid "Specifies the default character set to use for text." ++#~ msgstr "" ++#~ "Spezifiziert den standardmäßig für Text zu verwendenden Zeichensatz." ++ ++# type: TH ++#~ msgid "2 March 2009" ++#~ msgstr "2. März 2009" +Index: cups-1.5.0/man/po4a/po/fr.po +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ cups-1.5.0/man/po4a/po/fr.po 2012-01-30 06:57:22.510115326 +0100 +@@ -0,0 +1,8414 @@ ++# Translation of the cups manpages into French. ++# ++# Original translations from: ++#  Gilles QUERRET <gilles.querret@nerim.net>, 2003, 2005. ++# Vérifier cupsd.8 ++# Nicolas François <nicolas.francois@centraliens.net>, 2007. ++# ++msgid "" ++msgstr "" ++"Project-Id-Version: cups\n" ++"POT-Creation-Date: 2008-09-11 12:06+0200\n" ++"PO-Revision-Date: 2008-05-02 02:50+0200\n" ++"Last-Translator: Nicolas François <nicolas.francois@centraliens.net>\n" ++"Language-Team: French <debian-l10n-french@lists.debian.org>\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++ ++# type: TH ++#: cupsaccept.man:15 ++#, no-wrap ++msgid "accept" ++msgstr "accept" ++ ++# type: TH ++#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 ++#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 ++#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 ++#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 ++#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 ++#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 ++#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 ++#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 ++#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "Common UNIX Printing System" ++msgstr "Common UNIX Printing System" ++ ++# type: TH ++#: cupsaccept.man:15 classes.conf.man:15 cupsd.man.in:15 cupsenable.man:16 ++#: cups-polld.man:15 lpc.man:15 lpinfo.man:15 lpmove.man:15 lpr.man:15 ++#: lprm.man:15 mime.types.man:15 printers.conf.man:15 ++#, no-wrap ++msgid "12 February 2006" ++msgstr "12 février 2006" ++ ++# type: TH ++#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 ++#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 ++#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 ++#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 ++#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 ++#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 ++#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 ++#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 ++#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "Apple Inc." ++msgstr "Apple Inc." ++ ++# type: SH ++#: cupsaccept.man:16 backend.man:17 cancel.man:16 classes.conf.man:16 ++#: client.conf.man.in:16 cupsaddsmb.man.in:16 cups-config.man:16 ++#: cupsctl.man:16 cupsd.conf.man.in:16 cups-deviced.man.in:16 cupsd.man.in:16 ++#: cups-driverd.man.in:16 cupsenable.man:17 cupsfilter.man:15 ++#: cups-lpd.man.in:16 cups-polld.man:16 cups-snmp.conf.man:16 ++#: cupstestdsc.man:16 cupstestppd.man:16 filter.man:16 lpadmin.man:16 ++#: lpc.man:16 lpinfo.man:16 lp.man:16 lpmove.man:16 lpoptions.man.in:16 ++#: lppasswd.man:16 lpq.man:16 lpr.man:16 lprm.man:16 lpstat.man:16 ++#: mailto.conf.man:16 mime.convs.man:16 mime.types.man:16 printers.conf.man:16 ++#: subscriptions.conf.man:16 ++#, no-wrap ++msgid "NAME" ++msgstr "NOM" ++ ++# type: Plain text ++#: cupsaccept.man:18 ++msgid "accept/reject - accept/reject jobs sent to a destination" ++msgstr "" ++"accept/reject - Accepter/refuser les travaux d'impression envoyés à une " ++"destination." ++ ++# type: SH ++#: cupsaccept.man:18 backend.man:20 cancel.man:18 cupsaddsmb.man.in:19 ++#: cups-config.man:18 cupsctl.man:18 cups-deviced.man.in:18 cupsd.man.in:18 ++#: cups-driverd.man.in:18 cupsenable.man:19 cupsfilter.man:17 ++#: cups-lpd.man.in:18 cups-polld.man:18 cupstestdsc.man:18 cupstestppd.man:18 ++#: filter.man:18 lpadmin.man:18 lpc.man:18 lpinfo.man:18 lp.man:18 ++#: lpmove.man:18 lpoptions.man.in:18 lppasswd.man:18 lpq.man:18 lpr.man:18 ++#: lprm.man:18 lpstat.man:18 ++#, no-wrap ++msgid "SYNOPSIS" ++msgstr "SYNOPSIS" ++ ++# type: Plain text ++#: cupsaccept.man:25 ++msgid "" ++"B<accept> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] destination(s)" ++msgstr "" ++"B<accept> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] destination" ++"(s)" ++ ++# type: Plain text ++#: cupsaccept.man:34 ++msgid "" ++"B<reject> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -r " ++"I<reason> ] destination(s)" ++msgstr "" ++"B<reject> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -r " ++"I<raison> ] destination(s)" ++ ++# type: SH ++#: cupsaccept.man:34 backend.man:28 cancel.man:33 classes.conf.man:18 ++#: client.conf.man.in:18 cupsaddsmb.man.in:38 cups-config.man:50 ++#: cupsctl.man:29 cupsd.conf.man.in:18 cups-deviced.man.in:21 cupsd.man.in:23 ++#: cups-driverd.man.in:26 cupsenable.man:35 cupsfilter.man:33 ++#: cups-lpd.man.in:23 cups-polld.man:21 cups-snmp.conf.man:18 ++#: cupstestdsc.man:26 cupstestppd.man:32 filter.man:23 lpadmin.man:42 ++#: lpc.man:25 lpinfo.man:32 lp.man:62 lpmove.man:34 lpoptions.man.in:62 ++#: lppasswd.man:33 lpq.man:29 lpr.man:35 lprm.man:29 lpstat.man:39 ++#: mailto.conf.man:18 mime.convs.man:18 mime.types.man:18 printers.conf.man:18 ++#: subscriptions.conf.man:18 ++#, no-wrap ++msgid "DESCRIPTION" ++msgstr "DESCRIPTION" ++ ++# type: Plain text ++#: cupsaccept.man:37 ++msgid "" ++"I<accept> instructs the printing system to accept print jobs to the " ++"specified destinations." ++msgstr "" ++"B<accept> envoie l'ordre au système d'impression d'accepter les travaux " ++"d'impression vers les destinations spécifiées." ++ ++# type: Plain text ++#: cupsaccept.man:41 ++msgid "" ++"I<reject> instructs the printing system to reject print jobs to the " ++"specified destinations. The I<-r> option sets the reason for rejecting print " ++"jobs. If not specified the reason defaults to \"Reason Unknown\"." ++msgstr "" ++"B<reject> envoie l'ordre au système d'impression de refuser les travaux " ++"d'impression vers les destinations spécifiées. L'option B<-r> permet de " ++"spécifier la raison du rejet des travaux d'impression. Si cette raison n'est " ++"pas fournie, la raison par défaut est « Reason Unknown » (« Raison inconnue »)." ++ ++# type: SH ++#: cupsaccept.man:41 cancel.man:36 cupsaddsmb.man.in:45 cups-config.man:55 ++#: cupsctl.man:33 cupsd.man.in:29 cupsfilter.man:37 cups-lpd.man.in:60 ++#: cupstestppd.man:42 lpinfo.man:37 lp.man:65 lpmove.man:44 lppasswd.man:41 ++#: lpq.man:37 lpr.man:41 lprm.man:35 lpstat.man:43 ++#, no-wrap ++msgid "OPTIONS" ++msgstr "OPTIONS" ++ ++# type: Plain text ++#: cupsaccept.man:44 ++msgid "The following options are supported by both I<accept> and I<reject>:" ++msgstr "Les options suivantes sont reconnues par B<accept> et B<reject> :" ++ ++# type: TP ++#: cupsaccept.man:44 cancel.man:38 cupsctl.man:35 cupsenable.man:40 ++#: lpadmin.man:172 lpinfo.man:39 lp.man:72 lpmove.man:46 lpoptions.man.in:66 ++#: lpq.man:39 lpr.man:43 lprm.man:37 lpstat.man:45 ++#, no-wrap ++msgid "-E" ++msgstr "B<-E>" ++ ++# type: Plain text ++#: cupsaccept.man:48 cancel.man:42 lpinfo.man:43 lp.man:76 lpmove.man:50 ++#: lpq.man:43 lpr.man:47 lprm.man:41 lpstat.man:49 ++msgid "Forces encryption when connecting to the server." ++msgstr "Forcer le chiffrement lors de la connexion au serveur." ++ ++# type: TP ++#: cupsaccept.man:48 cancel.man:42 cupsenable.man:44 lpinfo.man:43 lp.man:76 ++#: lpmove.man:50 lpoptions.man.in:70 lpq.man:47 lpr.man:63 lprm.man:45 ++#: lpstat.man:53 ++#, no-wrap ++msgid "-U username" ++msgstr "B<-U> I<utilisateur>" ++ ++# type: Plain text ++#: cupsaccept.man:52 ++msgid "Sets the username that is sent when connecting to the server." ++msgstr "Indiquer l'utilisateur utilisé pour se connecter au serveur." ++ ++# type: TP ++#: cupsaccept.man:52 cancel.man:51 lp.man:92 ++#, no-wrap ++msgid "-h hostname[:port]" ++msgstr "B<-h> I<serveur[:port]>" ++ ++# type: Plain text ++#: cupsaccept.man:56 cancel.man:55 lp.man:96 ++msgid "Chooses an alternate server." ++msgstr "Utiliser un autre serveur." ++ ++# type: TP ++#: cupsaccept.man:56 cupsenable.man:56 ++#, no-wrap ++msgid "-r \"reason\"" ++msgstr "B<-r> I<raison>" ++ ++# type: Plain text ++#: cupsaccept.man:61 ++msgid "" ++"Sets the reason string that is shown for a printer that is rejecting jobs." ++msgstr "" ++"Configurer la raison qui est affichée par l'imprimante lorsqu'elle refuse un " ++"travail." ++ ++# type: SH ++#: cupsaccept.man:61 cancel.man:59 cupsd.man.in:54 cupsenable.man:61 ++#: cups-lpd.man.in:98 filter.man:208 lpadmin.man:187 lpc.man:59 lpinfo.man:55 ++#: lp.man:226 lpoptions.man.in:119 lpr.man:106 lprm.man:53 lpstat.man:123 ++#, no-wrap ++msgid "COMPATIBILITY" ++msgstr "COMPATIBILITÉ" ++ ++# type: Plain text ++#: cupsaccept.man:65 cancel.man:63 cupsenable.man:65 lp.man:230 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " ++"and class names are I<not> case-sensitive." ++msgstr "" ++"Contrairement au système d'impression System V, les imprimantes CUPS peuvent " ++"contenir n'importe quel caractère imprimable sauf ESPACE, TABULATION, « / » " ++"ou « # ». De même, les noms d'imprimantes et de classes ne sont I<pas> " ++"sensibles à la casse." ++ ++# type: Plain text ++#: cupsaccept.man:70 ++msgid "" ++"The CUPS versions of I<accept> and I<reject> may ask the user for an access " ++"password depending on the printing system configuration. This differs from " ++"the System V versions which require the root user to execute these commands." ++msgstr "" ++"Les versions CUPS d'B<accept> et B<reject> peuvent demander à l'utilisateur " ++"de s'identifier suivant la configuration du système d'impression, à la " ++"différence des versions System V, qui demandent le mot de passe root." ++ ++# type: SH ++#: cupsaccept.man:70 backend.man:170 cancel.man:67 classes.conf.man:109 ++#: client.conf.man.in:43 cupsaddsmb.man.in:204 cups-config.man:104 ++#: cupsctl.man:97 cupsd.conf.man.in:608 cups-deviced.man.in:36 cupsd.man.in:58 ++#: cups-driverd.man.in:97 cupsenable.man:74 cupsfilter.man:65 ++#: cups-lpd.man.in:109 cups-polld.man:30 cups-snmp.conf.man:67 ++#: cupstestdsc.man:41 cupstestppd.man:133 filter.man:213 lpadmin.man:198 ++#: lpc.man:62 lpinfo.man:57 lp.man:235 lpmove.man:58 lpoptions.man.in:127 ++#: lppasswd.man:53 lpq.man:63 lpr.man:109 lprm.man:56 lpstat.man:131 ++#: mailto.conf.man:51 mime.convs.man:37 mime.types.man:85 ++#: printers.conf.man:113 subscriptions.conf.man:80 ++#, no-wrap ++msgid "SEE ALSO" ++msgstr "VOIR AUSSI" ++ ++# type: Plain text ++#: cupsaccept.man:73 ++msgid "I<cancel(1)>, I<cupsenable(8)>, I<lp(1)>, I<lpadmin(8)>, I<lpstat(1)>," ++msgstr "B<cancel>(1), B<cupsenable>(8), B<lp>(1), B<lpadmin>(8), B<lpstat>(1)," ++ ++# type: Plain text ++#: cupsaccept.man:75 backend.man:174 cancel.man:71 classes.conf.man:114 ++#: client.conf.man.in:45 cups-config.man:106 cupsctl.man:101 ++#: cupsd.conf.man.in:614 cups-deviced.man.in:40 cupsd.man.in:65 ++#: cups-driverd.man.in:101 cupsenable.man:79 cupsfilter.man:69 ++#: cups-lpd.man.in:114 cups-polld.man:34 cups-snmp.conf.man:69 ++#: cupstestdsc.man:43 cupstestppd.man:137 filter.man:217 lpadmin.man:203 ++#: lpc.man:67 lpinfo.man:61 lp.man:239 lpmove.man:62 lpoptions.man.in:131 ++#: lppasswd.man:57 lpq.man:68 lpr.man:114 lprm.man:61 lpstat.man:135 ++#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:90 ++#: printers.conf.man:118 subscriptions.conf.man:85 ++msgid "http://localhost:631/help" ++msgstr "http://localhost:631/help" ++ ++# type: SH ++#: cupsaccept.man:75 backend.man:175 cancel.man:71 classes.conf.man:114 ++#: client.conf.man.in:45 cupsaddsmb.man.in:210 cups-config.man:106 ++#: cupsctl.man:101 cupsd.conf.man.in:614 cups-deviced.man.in:40 ++#: cupsd.man.in:65 cups-driverd.man.in:101 cupsenable.man:79 cupsfilter.man:69 ++#: cups-lpd.man.in:114 cups-polld.man:34 cups-snmp.conf.man:69 ++#: cupstestdsc.man:46 cupstestppd.man:139 filter.man:217 lpadmin.man:203 ++#: lpc.man:67 lpinfo.man:61 lp.man:239 lpmove.man:62 lpoptions.man.in:131 ++#: lppasswd.man:57 lpq.man:68 lpr.man:114 lprm.man:61 lpstat.man:135 ++#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:90 ++#: printers.conf.man:118 subscriptions.conf.man:85 ++#, no-wrap ++msgid "COPYRIGHT" ++msgstr "COPYRIGHT" ++ ++# type: Plain text ++#: cupsaccept.man:76 backend.man:176 cancel.man:72 classes.conf.man:115 ++#: client.conf.man.in:46 cupsaddsmb.man.in:211 cupsctl.man:102 cupsd.man.in:66 ++#: cupsenable.man:81 cupsfilter.man:70 cups-lpd.man.in:115 cups-polld.man:35 ++#: cups-snmp.conf.man:70 cupstestdsc.man:47 cupstestppd.man:140 filter.man:218 ++#: lpc.man:68 lpinfo.man:62 lp.man:240 lpmove.man:63 lpoptions.man.in:132 ++#: lppasswd.man:58 lpr.man:115 lprm.man:62 lpstat.man:136 mailto.conf.man:57 ++#: mime.convs.man:43 mime.types.man:91 printers.conf.man:119 ++#: subscriptions.conf.man:86 ++msgid "Copyright 2007 by Apple Inc." ++msgstr "Copyright 2007 by Apple Inc." ++ ++# type: TH ++#: backend.man:15 ++#, no-wrap ++msgid "backend" ++msgstr "backend" ++ ++# type: TH ++#: backend.man:15 cancel.man:15 cupstestdsc.man:15 lpoptions.man.in:15 ++#: lppasswd.man:15 mime.convs.man:15 ++#, no-wrap ++msgid "20 March 2006" ++msgstr "20 mars 2006" ++ ++# type: Plain text ++#: backend.man:19 ++msgid "backend - cups backend transmission interfaces" ++msgstr "backend - Programme de transmission de CUPS." ++ ++# type: Plain text ++#: backend.man:22 ++msgid "B<backend>" ++msgstr "B<backend>" ++ ++# type: Plain text ++#: backend.man:27 ++msgid "B<backend> job user title num-copies options [ I<filename> ]" ++msgstr "B<backend> travail utilisateur titre copies options [ I<fichier> ]" ++ ++# type: Plain text ++#: backend.man:31 ++msgid "" ++"Backends are a special type of I<filter(7)> which is used to send print data " ++"to and discover different devices on the system." ++msgstr "" ++"Les programmes de transmission de CUPS sont des filtres particuliers " ++"(consultez B<filter>(7) qui sont utilisés pour envoyer les données à " ++"imprimer et découvrir les différents périphériques d'impression du système." ++ ++# type: Plain text ++#: backend.man:37 ++msgid "" ++"Like filters, backends must be capable of reading from a filename on the " ++"command-line or from the standard input, copying the standard input to a " ++"temporary file as required by the physical interface." ++msgstr "" ++"Comme les filtres, ils doivent être capables de lire depuis un fichier " ++"fournit sur la ligne de commande ou depuis l'entrée standard, en copiant " ++"l'entrée standard vers un fichier temporaire si nécessaire pour l'interface " ++"physique." ++ ++# type: Plain text ++#: backend.man:46 ++msgid "" ++"The command name (argv[0]) is set to the device URI of the destination " ++"printer. Starting with CUPS 1.1.22, any authentication information in argv" ++"[0] is removed, so backend developers are urged to use the DEVICE_URI " ++"environment variable whenever authentication information is required. The " ++"CUPS API includes a I<cupsBackendDeviceURI> function for retrieving the " ++"correct device URI." ++msgstr "" ++"Le nom de la commande (argv[0]) est fixé à la valeur de l'URI du " ++"périphérique de l'imprimante de destination. À partir de la version 1.1.22 " ++"de CUPS, les informations d'identification sont retirées de argv[0]. Il est " ++"donc demandé aux développeurs des dorsaux d'utiliser la variable " ++"d'environnement DEVICE_URI pour obtenir les informations d'identification " ++"quand cela est nécessaire. L'API CUPS propose la fonction " ++"B<cupsBackendDeviceURI> pour récupérer la valeur correcte de l'URI du " ++"périphérique." ++ ++# type: Plain text ++#: backend.man:51 ++msgid "" ++"Back-channel data from the device should be relayed to the job filters by " ++"writing to file descriptor 3. The CUPS API includes the " ++"I<cupsBackChannelWrite> function for this purpose." ++msgstr "" ++"Les données en retour du périphérique doivent être envoyées au filtres des " ++"travaux en écrivant sur le descripteur de fichiers 3. L'API CUPS propose la " ++"fonction I<cupsBackChannelWrite> pour cela." ++ ++# type: SH ++#: backend.man:52 ++#, no-wrap ++msgid "DEVICE DISCOVERY" ++msgstr "DÉCOUVERTE DES PÉRIPHÉRIQUES" ++ ++# type: Plain text ++#: backend.man:57 ++msgid "" ++"When run with no arguments, the backend should list the devices and schemes " ++"it supports or is advertising to stdout. The output consists of zero or more " ++"lines consisting of any of the following forms:" ++msgstr "" ++"Quand il est exécuté sans paramètre, le programme dorsal doit lister sur la " ++"sortie standard les périphériques et schémas qu'il gère ou qu'il annonce. La " ++"sortie consiste en zéro ou plus de lignes de la forme suivante :" ++ ++# type: Plain text ++#: backend.man:62 ++#, no-wrap ++msgid "" ++" device-class scheme \"Unknown\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\"\n" ++" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" ++msgstr "" ++" classe_périphérique schéma \"Unknown\" \"info_périphérique\"\n" ++" classe_périphérique uri_périphérique \"marque_et_modèle_périphérique\" \"info_périphérique\"\n" ++" classe_périphérique uri_périphérique \"marque_et_modèle_périphérique\" \"info_périphérique\" \"id_périphérique\"\n" ++ ++# type: Plain text ++#: backend.man:66 ++msgid "The I<device-class> field is one of the following values:" ++msgstr "Le champ I<classe_périphérique> peut prendre une de ces valeurs :" ++ ++# type: TP ++#: backend.man:67 ++#, no-wrap ++msgid "direct" ++msgstr "B<direct>" ++ ++# type: Plain text ++#: backend.man:72 ++msgid "" ++"The device-uri refers to a specific direct-access device with no options, " ++"such as a parallel, USB, or SCSI device." ++msgstr "" ++"L'uri du périphérique se réfère à un accès direct au périphérique, sans " ++"option, comme pour un périphérique sur port parallèle, USB ou SCSI." ++ ++# type: TP ++#: backend.man:73 ++#, no-wrap ++msgid "file" ++msgstr "B<file>" ++ ++# type: Plain text ++#: backend.man:77 ++msgid "The device-uri refers to a file on disk." ++msgstr "L'uri du périphérique se réfère à un fichier sur le disque." ++ ++# type: TP ++#: backend.man:78 ++#, no-wrap ++msgid "network" ++msgstr "B<network>" ++ ++# type: Plain text ++#: backend.man:83 ++msgid "" ++"The device-uri refers to a networked device and conforms to the general form " ++"for network URIs." ++msgstr "" ++"L'uri du périphérique se réfère à un périphérique réseau et respecte les " ++"formes générales des URI réseau." ++ ++# type: TP ++#: backend.man:84 ++#, no-wrap ++msgid "serial" ++msgstr "B<serial>" ++ ++# type: Plain text ++#: backend.man:90 ++msgid "" ++"The device-uri refers to a serial device with configurable baud rate and " ++"other options. If the device-uri contains a baud value, it represents the " ++"maximum baud rate supported by the device." ++msgstr "" ++"L'uri du périphérique se réfère à un périphérique série avec une vitesse " ++"configurable et d'autres options. Si l'uri du périphérique contient la " ++"vitesse, elle représente la vitesse maximale gérée par le périphérique." ++ ++# type: Plain text ++#: backend.man:97 ++msgid "" ++"The I<scheme> field provides the URI scheme that is supported by the " ++"backend. Backends should use this form only when the backend supports any " ++"URI using that scheme. The I<device-uri> field specifies the full URI to use " ++"when communicating with the device." ++msgstr "" ++"Le champ I<schéma> fournit le schéma d'URI géré par le dorsal. Les dorsaux " ++"ne doivent utiliser cette forme que s'ils supportent toute URI utilisant ce " ++"schéma. Le champ I<uri_périphérique> spécifie l'URI complète à utiliser pour " ++"la communication avec le périphérique." ++ ++# type: Plain text ++#: backend.man:102 ++msgid "" ++"The I<device-make-and-model> field specifies the make and model of the " ++"device, e.g. \"Acme Foojet 2000\". If the make and model is not known, you " ++"must report \"Unknown\"." ++msgstr "" ++"Le champ I<marque_et_modèle_périphérique> précise la marque et le modèle du " ++"périphérique, par exemple « Acme Foojet 2000 ». Si la marque et le modèle ne " ++"sont pas connus, vous devez indiquer « Unknown »." ++ ++# type: Plain text ++#: backend.man:108 ++msgid "" ++"The I<device-info> field specifies additional information about the device. " ++"Typically this includes the make and model along with the port number or " ++"network address, e.g. \"Acme Foojet 2000 USB #1\"." ++msgstr "" ++"Le champ I<info_périphérique> ajoute des informations à propos du " ++"périphérique. Typiquement cela comprend la marque et le modèle avec le " ++"numéro de port ou l'adresse réseau, par exemple « Acme Foojet 2000 USB #1 »." ++ ++# type: Plain text ++#: backend.man:113 ++msgid "" ++"The optional I<device-id> field specifies the IEEE-1284 device ID string for " ++"the device, which is used to select a matching driver." ++msgstr "" ++"Le champ optionnel I<id_périphérique> indique l'identifiant IEEE-1284 du " ++"périphérique, qui est utilisé pour sélectionner le pilote correspondant." ++ ++# type: SH ++#: backend.man:114 ++#, no-wrap ++msgid "PERMISSIONS" ++msgstr "PERMISSIONS" ++ ++# type: Plain text ++#: backend.man:118 ++msgid "" ++"Backends without world execute permissions are run as the root user. " ++"Otherwise, the backend is run using the unprivileged user account, typically " ++"\"lp\"." ++msgstr "" ++"Les dorsaux sans les droits d'exécution pour tout le monde sont exécuté en " ++"tant que root. Sinon, le dorsal est exécuté en utilisant le compte non " ++"privilégié, généralement « lp »." ++ ++# type: SH ++#: backend.man:119 ++#, no-wrap ++msgid "EXIT CODES" ++msgstr "CODES DE SORTIE" ++ ++# type: Plain text ++#: backend.man:123 ++msgid "" ++"The following exit codes are defined for backends; C API constants defined " ++"in the E<lt>cups/backend.hE<gt> header file are defined in parenthesis:" ++msgstr "" ++"Les dorsaux renvoient les codes de retour suivants ; les constantes définie " ++"par l'API C dans E<lt>cups/backend.hE<gt> sont indiquées entre parenthèses :" ++ ++# type: TP ++#: backend.man:124 ++#, no-wrap ++msgid "0 (CUPS_BACKEND_OK)" ++msgstr "0 (CUPS_BACKEND_OK)" ++ ++# type: Plain text ++#: backend.man:129 ++msgid "" ++"The print file was successfully transmitted to the device or remote server." ++msgstr "" ++"Le fichier à imprimer a été transmis avec succès au périphérique ou au " ++"serveur distant." ++ ++# type: TP ++#: backend.man:130 ++#, no-wrap ++msgid "1 (CUPS_BACKEND_FAILED)" ++msgstr "1 (CUPS_BACKEND_FAILED)" ++ ++# type: Plain text ++#: backend.man:137 ++msgid "" ++"The print file was not successfully transmitted to the device or remote " ++"server. The scheduler will respond to this by canceling the job, retrying " ++"the job, or stopping the queue depending on the state of the error-policy " ++"attribute." ++msgstr "" ++"Le fichier à imprimer n'a pas été transmis correctement au périphérique ou " ++"au serveur distant. L'ordonanceur annulera le travail, réessayera " ++"l'impression ou stoppera la queue en fonction de l'état de l'attribut error-" ++"policy." ++ ++# type: TP ++#: backend.man:138 ++#, no-wrap ++msgid "2 (CUPS_BACKEND_AUTH_REQUIRED)" ++msgstr "2 (CUPS_BACKEND_AUTH_REQUIRED)" ++ ++# type: Plain text ++#: backend.man:145 ++msgid "" ++"The print file was not successfully transmitted because valid authentication " ++"information is required. The scheduler will respond to this by holding the " ++"job and adding the authentication-required job-reasons keyword." ++msgstr "" ++"Le fichier à imprimer n'a pas été transmis correctement parce que des donnée " ++"d'identifications valables sont nécessaires. L'ordonanceur suspendra le " ++"travail et ajoutera le mot clé authentication-required à l'attribut job-" ++"reasons." ++ ++# type: TP ++#: backend.man:146 ++#, no-wrap ++msgid "3 (CUPS_BACKEND_HOLD)" ++msgstr "3 (CUPS_BACKEND_HOLD)" ++ ++# type: Plain text ++#: backend.man:152 ++msgid "" ++"The print file was not successfully transmitted because it cannot be printed " ++"at this time. The scheduler will respond to this by holding the job." ++msgstr "" ++"Le fichier à imprimer n'a pas pu être transmis parce qu'il ne pouvait pas " ++"être imprimé à ce moment. L'ordonnaceur concervera le travail d'impression." ++ ++# type: TP ++#: backend.man:153 ++#, no-wrap ++msgid "4 (CUPS_BACKEND_STOP)" ++msgstr "4 (CUPS_BACKEND_STOP)" ++ ++# type: Plain text ++#: backend.man:159 ++msgid "" ++"The print file was not successfully transmitted because it cannot be printed " ++"at this time. The scheduler will respond to this by stopping the queue." ++msgstr "" ++"Le fichier à imprimer n'a pas été transmis car il ne peut pas être imprimer " ++"en ce moment. L'ordonnanceur stopera la queue." ++ ++# type: TP ++#: backend.man:160 ++#, no-wrap ++msgid "5 (CUPS_BACKEND_CANCEL)" ++msgstr "5 (CUPS_BACKEND_CANCEL)" ++ ++# type: Plain text ++#: backend.man:166 ++msgid "" ++"The print file was not successfully transmitted because one or more " ++"attributes are not supported. The scheduler will respond to this by " ++"canceling the job." ++msgstr "" ++"Le fichier à imprimer n'a pas été transmis parce qu'un atribut n'est pas " ++"géré. L'ordonanceur répond à cela en annulant le travail d'impression." ++ ++# type: Plain text ++#: backend.man:169 ++msgid "All other exit code values are reserved." ++msgstr "Tous les autres codes de sortie sont réservés." ++ ++# type: Plain text ++#: backend.man:172 ++msgid "I<cupsd(8)>, I<cupsd.conf(5)>, I<filter(7)>" ++msgstr "B<cupsd>(8), B<cupsd.conf>(5), B<filter>(7)" ++ ++# type: TH ++#: cancel.man:15 ++#, no-wrap ++msgid "cancel" ++msgstr "cancel" ++ ++# type: Plain text ++#: cancel.man:18 ++msgid "cancel - cancel jobs" ++msgstr "cancel - Annuler des travaux d'impression." ++ ++# type: Plain text ++#: cancel.man:33 ++msgid "" ++"B<cancel> [ -E ] [ -U I<username> ] [ -a ] [ -h I<hostname[:port]> ] [ -u " ++"I<username> ] [ I<id> ] [ I<destination> ] [ I<destination-id> ]" ++msgstr "" ++"B<cancel> [ -E ] [ -U I<utilisateur> ] [ -a ] [ -h I<serveur[:port]> ] [ -u " ++"I<utilisateur> ] [ I<id> ] [ I<destination> ] [ I<id_destination> ]" ++ ++# type: Plain text ++#: cancel.man:36 ++msgid "" ++"I<cancel> cancels existing print jobs. The I<-a> option will remove all jobs " ++"from the specified destination." ++msgstr "" ++"B<cancel> annule un travail d'impression. L'option B<-a> supprime tous les " ++"travaux d'impression d'une destination." ++ ++# type: Plain text ++#: cancel.man:38 ++msgid "The following options are recognized by I<cancel>:" ++msgstr "Les options suivantes sont reconnues par B<cancel> :" ++ ++# type: Plain text ++#: cancel.man:46 lp.man:80 ++msgid "Specifies the username to use when connecting to the server." ++msgstr "Spécifier l'utilisateur à utiliser pour les connexions au serveur." ++ ++# type: TP ++#: cancel.man:46 cupsaddsmb.man.in:58 lpq.man:51 ++#, no-wrap ++msgid "-a" ++msgstr "B<-a>" ++ ++# type: Plain text ++#: cancel.man:51 ++msgid "" ++"Cancel all jobs on the named destination, or all jobs on all destinations if " ++"none is provided." ++msgstr "" ++"Annuler tous les travaux sur la destination donnée, ou tous les travaux sur " ++"toutes les destinations si aucune destination n'est fournie." ++ ++# type: TP ++#: cancel.man:55 lp.man:125 ++#, no-wrap ++msgid "-u username" ++msgstr "B<-u> I<utilisateur>" ++ ++# type: Plain text ++#: cancel.man:59 ++msgid "Cancels jobs owned by I<username>." ++msgstr "Annuler les travaux d'impression de l'I<utilisateur>." ++ ++# type: SH ++#: cancel.man:63 ++#, no-wrap ++msgid "NOTES" ++msgstr "NOTES" ++ ++# type: Plain text ++#: cancel.man:67 ++msgid "" ++"Administrators wishing to prevent unauthorized cancellation of jobs via the " ++"I<-u> option should require authentication for Cancel-Jobs operations in " ++"I<cupsd.conf(5)>." ++msgstr "" ++"Les administrateurs qui souhaitent empêcher des annulation non autorisée de " ++"travaux à l'aide de l'option B<-u> devraient forcer l'identification pour " ++"les opérations dans le fichier B<cupsd.conf>(5)." ++ ++# type: Plain text ++#: cancel.man:69 ++msgid "I<lp(1)>, I<lpmove(8)>, I<lpstat(1)>," ++msgstr "B<lp>(1), B<lpmove>(8), B<lpstat>(1)," ++ ++# type: TH ++#: classes.conf.man:15 ++#, no-wrap ++msgid "classes.conf" ++msgstr "classes.conf" ++ ++# type: Plain text ++#: classes.conf.man:18 ++msgid "classes.conf - class configuration file for cups" ++msgstr "classes.conf - Fichier de configuration des classes de CUPS." ++ ++# type: Plain text ++#: classes.conf.man:23 ++msgid "" ++"The I<classes.conf> file defines the local printer classes that are " ++"available. It is normally located in the I</etc/cups> directory and is " ++"generated automatically by the I<cupsd(8)> program when printer classes are " ++"added or deleted." ++msgstr "" ++"Le fichier I<classes.conf> définit les classes d'imprimantes disponibles. Il " ++"est habituellement situé dans le répertoire I</etc/cups> et est généré " ++"automatiquement par le programme B<cupsd>(8) lorsque des classes " ++"d'imprimantes sont créées ou supprimées." ++ ++# type: Plain text ++#: classes.conf.man:26 mailto.conf.man:24 printers.conf.man:26 ++#: subscriptions.conf.man:26 ++msgid "" ++"Each line in the file can be a configuration directive, a blank line, or a " ++"comment. Comment lines start with the # character." ++msgstr "" ++"Chaque ligne du fichier est une directive de configuration, une ligne vide " ++"ou un commentaire. Les commentaires commencent par le symbole #." ++ ++# type: SH ++#: classes.conf.man:26 client.conf.man.in:24 cupsd.conf.man.in:26 ++#: cups-snmp.conf.man:30 mailto.conf.man:24 printers.conf.man:26 ++#: subscriptions.conf.man:26 ++#, no-wrap ++msgid "DIRECTIVES" ++msgstr "DIRECTIVES" ++ ++# type: TP ++#: classes.conf.man:27 ++#, no-wrap ++msgid "E<lt>Class nameE<gt> ... E<lt>/ClassE<gt>" ++msgstr "E<lt>Class nomE<gt> ... E<lt>/ClassE<gt>" ++ ++# type: Plain text ++#: classes.conf.man:31 ++msgid "Defines a specific printer class." ++msgstr "Définir une classe d'imprimantes." ++ ++# type: TP ++#: classes.conf.man:31 ++#, no-wrap ++msgid "E<lt>DefaultClass nameE<gt> ... E<lt>/ClassE<gt>" ++msgstr "E<lt>DefaultClass nomE<gt> ... E<lt>/ClassE<gt>" ++ ++# type: Plain text ++#: classes.conf.man:35 ++msgid "Defines a default printer class." ++msgstr "Définir une classe d'imprimantes par défaut." ++ ++# type: TP ++#: classes.conf.man:35 printers.conf.man:35 ++#, no-wrap ++msgid "Accepting Yes" ++msgstr "Accepting Yes" ++ ++# type: TP ++#: classes.conf.man:37 printers.conf.man:37 ++#, no-wrap ++msgid "Accepting No" ++msgstr "Accepting No" ++ ++# type: Plain text ++#: classes.conf.man:41 printers.conf.man:41 ++msgid "Specifies whether the printer is accepting new jobs." ++msgstr "Définir si l'imprimante accepte de nouveaux travaux d'impression." ++ ++# type: TP ++#: classes.conf.man:41 printers.conf.man:41 ++#, no-wrap ++msgid "AllowUser [ user @group ... ]" ++msgstr "AllowUser [ utilisateur @groupe ... ]" ++ ++# type: Plain text ++#: classes.conf.man:45 printers.conf.man:45 ++msgid "Allows specific users and groups to print to the printer." ++msgstr "" ++"Permettre à certains utilisateurs ou groupes d'imprimer sur l'imprimante." ++ ++# type: TP ++#: classes.conf.man:45 printers.conf.man:45 ++#, no-wrap ++msgid "DenyUser [ user @group ... ]" ++msgstr "DenyUser [ utilisateur @groupe ... ]" ++ ++# type: Plain text ++#: classes.conf.man:49 printers.conf.man:49 ++msgid "Prevents specific users and groups from printing to the printer." ++msgstr "Empêcher certains utilisateurs ou groupes d'imprimer sur l'imprimante." ++ ++# type: TP ++#: classes.conf.man:49 printers.conf.man:53 ++#, no-wrap ++msgid "ErrorPolicy abort-job" ++msgstr "ErrorPolicy abort-job" ++ ++# type: TP ++#: classes.conf.man:51 printers.conf.man:55 ++#, no-wrap ++msgid "ErrorPolicy retry-job" ++msgstr "ErrorPolicy retry-job" ++ ++# type: TP ++#: classes.conf.man:53 printers.conf.man:57 ++#, no-wrap ++msgid "ErrorPolicy stop-printer" ++msgstr "ErrorPolicy stop-printer" ++ ++# type: Plain text ++#: classes.conf.man:57 printers.conf.man:61 ++msgid "Specifies the error policy for the printer." ++msgstr "Définir la politique à appliquer en cas d'erreur pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:57 printers.conf.man:61 ++#, no-wrap ++msgid "Info text" ++msgstr "Info texte" ++ ++# type: Plain text ++#: classes.conf.man:61 printers.conf.man:65 ++msgid "Specifies human-readable text describing the printer." ++msgstr "" ++"Définir des informations à destination des utilisateurs pour décrir " ++"l'imprimante." ++ ++# type: TP ++#: classes.conf.man:61 printers.conf.man:65 ++#, no-wrap ++msgid "JobSheets banner banner" ++msgstr "JobSheets banner banner" ++ ++# type: Plain text ++#: classes.conf.man:65 printers.conf.man:69 ++msgid "Specifies the banner pages to use for the printer." ++msgstr "Définir les pages de banière à utiliser pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:65 printers.conf.man:69 ++#, no-wrap ++msgid "KLimit number" ++msgstr "KLimit nombre" ++ ++# type: Plain text ++#: classes.conf.man:69 printers.conf.man:73 ++msgid "Specifies the job-k-limit value for the printer." ++msgstr "Définir la valeur job-k-limit pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:69 printers.conf.man:73 ++#, no-wrap ++msgid "Location text" ++msgstr "Location texte" ++ ++# type: Plain text ++#: classes.conf.man:73 printers.conf.man:77 ++msgid "Specifies human-readable text describing the location of the printer." ++msgstr "" ++"Définir des informations à destination des utilisateurs concernant la " ++"localisation physique de l'imprimante." ++ ++# type: TP ++#: classes.conf.man:73 printers.conf.man:77 ++#, no-wrap ++msgid "OpPolicy name" ++msgstr "OpPolicy nom" ++ ++# type: Plain text ++#: classes.conf.man:77 printers.conf.man:81 ++msgid "Specifies the operation policy for the printer." ++msgstr "Indiquer la politiques des opérations pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:77 printers.conf.man:81 ++#, no-wrap ++msgid "PageLimit number" ++msgstr "PageLimit nombre" ++ ++# type: Plain text ++#: classes.conf.man:81 printers.conf.man:85 ++msgid "Specifies the job-page-limit value for the printer." ++msgstr "Définir la valeur job-page-limit pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:81 ++#, no-wrap ++msgid "Printer" ++msgstr "Printer" ++ ++# type: Plain text ++#: classes.conf.man:85 ++msgid "Specifies a printer that is a member of the printer class." ++msgstr "Indiquer une imprimante qui est membre de la classe d'imprimantes." ++ ++# type: TP ++#: classes.conf.man:85 printers.conf.man:89 ++#, no-wrap ++msgid "QuotaPeriod seconds" ++msgstr "QuotaPeriod secondes" ++ ++# type: Plain text ++#: classes.conf.man:89 printers.conf.man:93 ++msgid "Specifies the job-quota-period value for the printer." ++msgstr "Définir la valeur job-quota-period pour l'imprimante." ++ ++# type: TP ++#: classes.conf.man:89 printers.conf.man:93 ++#, no-wrap ++msgid "Shared Yes" ++msgstr "Shared Yes" ++ ++# type: TP ++#: classes.conf.man:91 printers.conf.man:95 ++#, no-wrap ++msgid "Shared No" ++msgstr "Shared No" ++ ++# type: Plain text ++#: classes.conf.man:95 printers.conf.man:99 ++msgid "Specifies whether the printer is shared." ++msgstr "Définir si l'imprimante est partagée." ++ ++# type: TP ++#: classes.conf.man:95 printers.conf.man:99 ++#, no-wrap ++msgid "State idle" ++msgstr "State idle" ++ ++# type: TP ++#: classes.conf.man:97 printers.conf.man:101 ++#, no-wrap ++msgid "State stopped" ++msgstr "State stopped" ++ ++# type: Plain text ++#: classes.conf.man:101 printers.conf.man:105 ++msgid "Specifies the initial state of the printer (Idle or Stopped)" ++msgstr "Définir l'état initial de l'imprimante (Idle ou Stopped)." ++ ++# type: TP ++#: classes.conf.man:101 printers.conf.man:105 ++#, no-wrap ++msgid "StateMessage text" ++msgstr "StateMessage texte" ++ ++# type: Plain text ++#: classes.conf.man:105 printers.conf.man:109 ++msgid "Specifies the message associated with the state." ++msgstr "Définir le message associé à l'état." ++ ++# type: TP ++#: classes.conf.man:105 printers.conf.man:109 ++#, no-wrap ++msgid "StateTime seconds" ++msgstr "StateTime secondes" ++ ++# type: Plain text ++#: classes.conf.man:109 printers.conf.man:113 ++msgid "Specifies the date/time associated with the state." ++msgstr "Indiquer la date/l'heure associée à l'état." ++ ++# type: Plain text ++#: classes.conf.man:112 ++msgid "" ++"I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime.types(5)>, " ++"I<printers.conf(5)>," ++msgstr "" ++"B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime.types>(5), " ++"B<printers.conf>(5)," ++ ++# type: TH ++#: client.conf.man.in:15 ++#, no-wrap ++msgid "client.conf" ++msgstr "client.conf" ++ ++# type: TH ++#: client.conf.man.in:15 ++#, no-wrap ++msgid "25 February 2006" ++msgstr "25 février 2006" ++ ++# type: Plain text ++#: client.conf.man.in:18 ++msgid "client.conf - client configuration file for cups" ++msgstr "client.conf - Fichier de configuration de CUPS." ++ ++# type: Plain text ++#: client.conf.man.in:24 ++msgid "" ++"The I<client.conf> file configures the CUPS client and is normally located " ++"in the I<@CUPS_SERVERROOT@> or I<~/.cups> directory. Each line in the file " ++"can be a configuration directive, a blank line, or a comment. Comment lines " ++"start with the # character." ++msgstr "" ++"Le fichier I<client.conf> configure le client CUPS et est normalement situé " ++"dans le répertoire I<@CUPS_SERVERROOT@> ou I<~/.cups>. Chaque ligne du " ++"fichier est une directive de configuration, une ligne vide ou un " ++"commentaire. Les commentaires commencent par le symbole #." ++ ++# type: Plain text ++#: client.conf.man.in:27 ++msgid "" ++"The following directives are understood by the client. Consult the on-line " ++"help for detailed descriptions:" ++msgstr "" ++"Les directives suivantes sont comprises par le client. Veuillez vous " ++"reporter à l'aide en ligne pour une description plus détaillée." ++ ++# type: TP ++#: client.conf.man.in:27 cupsd.conf.man.in:262 ++#, no-wrap ++msgid "Encryption IfRequested" ++msgstr "Encryption IfRequested" ++ ++# type: TP ++#: client.conf.man.in:29 cupsd.conf.man.in:264 ++#, no-wrap ++msgid "Encryption Never" ++msgstr "Encryption Never" ++ ++# type: TP ++#: client.conf.man.in:31 cupsd.conf.man.in:266 ++#, no-wrap ++msgid "Encryption Required" ++msgstr "Encryption Required" ++ ++# type: Plain text ++#: client.conf.man.in:36 cupsd.conf.man.in:271 ++msgid "" ++"Specifies the level of encryption that is required for a particular location." ++msgstr "Définir le niveau de chiffrement nécessaire pour un emplacement donné." ++ ++# type: TP ++#: client.conf.man.in:36 ++#, no-wrap ++msgid "ServerName hostname-or-ip-address[:port]" ++msgstr "ServerName serveur-ou-adresse_ip[:port]" ++ ++# type: TP ++#: client.conf.man.in:38 ++#, no-wrap ++msgid "ServerName /domain/socket" ++msgstr "ServerName /domaine/socket" ++ ++# type: Plain text ++#: client.conf.man.in:43 ++msgid "" ++"Specifies the address and optionally the port to use when connecting to the " ++"server" ++msgstr "" ++"Définir l'adresse et éventuellement le port à utiliser pour se connecter au " ++"serveur." ++ ++# type: TH ++#: cupsaddsmb.man.in:15 ++#, no-wrap ++msgid "cupsaddsmb" ++msgstr "cupsaddsmb" ++ ++# type: TH ++#: cupsaddsmb.man.in:15 ++#, no-wrap ++msgid "25 July 2007" ++msgstr "25 juillet 2007" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:18 ++msgid "cupsaddsmb - export printers to samba for windows clients" ++msgstr "" ++"cupsaddsmb - Exporter des imprimantes vers Samba pour les clients Windows." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:28 ++msgid "" ++"B<cupsaddsmb> [ -H I<samba-server> ] [ -U I<samba-user[%samba-password]> ] " ++"[ -h I<cups-server[:port]> ] [ -v ] -a" ++msgstr "" ++"B<cupsaddsmb> [ -H I<serveur_samba> ] [ -U I<utilisateur_samba[%mot-de-" ++"passe_samba]> ] [ -h I<serveur_cups[:port]> ] [ -v ] -a" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:37 ++msgid "" ++"B<cupsaddsmb> [ -H I<samba-server> ] [ -U I<samba-user[%samba-password]> ] " ++"[ -h I<cups-server[:port]> ] [ -v ] printer [ ... printer ]" ++msgstr "" ++"B<cupsaddsmb> [ -H I<serveur_samba> ] [ -U I<utilisateur_samba[%mot-de-" ++"passe_samba]> ] [ -h I<serveur_cups[:port]> ] [ -v ] imprimante [ ... " ++"imprimante ]" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:44 ++msgid "" ++"I<cupsaddsmb> exports printers to the SAMBA software (version 2.2.0 or " ++"higher) for use with Windows clients. Depending on the SAMBA configuration, " ++"you may need to provide a password to export the printers. This program " ++"requires the Windows printer driver files described below." ++msgstr "" ++"B<cupsaddsmb> permet l'export d'imprimantes vers SAMBA (version 2.2.0 ou " ++"supérieure) pour l'utilisation par des clients Windows. Suivant la " ++"configuration de SAMBA, il est possible qu'un mot de passe soit demandé pour " ++"l'export. Ce programme requiert les fichiers du driver Windows, comme " ++"indiqué plus bas." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:47 ++msgid "I<cupsaddsmb> supports the following options:" ++msgstr "B<cupsaddsmb> gère les options suivantes :" ++ ++# type: TP ++#: cupsaddsmb.man.in:47 ++#, no-wrap ++msgid "-H samba-server" ++msgstr "B<-H> I<serveur_samba>" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:51 ++msgid "Specifies the SAMBA server which defaults to the CUPS server." ++msgstr "Préciser le serveur SAMBA par défaut pour le serveur CUPS." ++ ++# type: TP ++#: cupsaddsmb.man.in:51 ++#, no-wrap ++msgid "-U samba-user[%samba-password]" ++msgstr "B<-U> I<utilisateur_samba[%mot-de-passe_samba]>" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:58 ++msgid "" ++"Specifies the SAMBA print admin username which defaults to your current " ++"username. If the username contains a percent (%) character, then the text " ++"following the percent is treated as the SAMBA password to use." ++msgstr "" ++"Spécifier le nom d'utilisateur de l'administrateur d'impression SAMBA, qui " ++"est par défaut l'utilisateur courant. Si l'utilisateur contient un caractère " ++"« % », ce qui suite le pourcent est considéré comme le mot de passe SAMBA à " ++"utiliser." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:63 ++msgid "" ++"Exports all known printers. Otherwise only the named printers are exported." ++msgstr "" ++"Exporter toutes les imprimantes connues. Sinon, seules les imprimantes " ++"fournies sur la ligne de commande sont exportées." ++ ++# type: TP ++#: cupsaddsmb.man.in:63 ++#, no-wrap ++msgid "-h cups-server[:port]" ++msgstr "B<-h> I<serveur_cups[:port]>" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:67 ++msgid "Specifies a different CUPS server to use." ++msgstr "Définir un autre serveur CUPS à utiliser." ++ ++# type: TP ++#: cupsaddsmb.man.in:67 cupstestppd.man:83 ++#, no-wrap ++msgid "-v" ++msgstr "B<-v>" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:72 ++msgid "" ++"Specifies that verbose information should be shown. This is useful for " ++"debugging SAMBA configuration problems." ++msgstr "" ++"Spécifier que des informations détaillées doivent être affichées. Ceci peut " ++"être utile pour le débogage des configurations de SAMBA." ++ ++# type: SH ++#: cupsaddsmb.man.in:73 ++#, no-wrap ++msgid "SAMBA CONFIGURATION" ++msgstr "CONFIGURATION DE SAMBA" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:80 ++msgid "" ++"I<cupsaddsmb> uses the new RPC-based printing support in SAMBA 2.2.x to " ++"provide printer drivers and PPD files to Windows client machines. In order " ++"to use this functionality, you must first configure the SAMBA I<smb.conf(5)> " ++"file to support printing through CUPS and provide a printer driver download " ++"share, as follows:" ++msgstr "" ++"B<cupsaddsmb> utilise le nouveau mode d'impression RPC de SAMBA 2.2.x pour " ++"fournir aux clients Windows les drivers d'impression et les fichiers PPD. " ++"Pour utiliser cette fonctionnalité, vous devez configurer SAMBA (via le " ++"fichier I<smb.conf>(5)) pour qu'il utilise l'impression via CUPS, et fournir " ++"un driver à télécharger. Ceci est fait de la manière suivante :" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:86 ++#, no-wrap ++msgid "" ++" [global]\n" ++"\tload printers = yes\n" ++"\tprinting = cups\n" ++"\tprintcap name = cups\n" ++msgstr "" ++" [global]\n" ++"\tload printers = yes\n" ++"\tprinting = cups\n" ++"\tprintcap name = cups\n" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:95 ++#, no-wrap ++msgid "" ++" [printers]\n" ++"\tcomment = All Printers\n" ++"\tpath = /var/spool/samba\n" ++"\tbrowseable = no\n" ++"\tpublic = yes\n" ++"\tguest ok = yes\n" ++"\twritable = no\n" ++"\tprintable = yes\n" ++msgstr "" ++" [printers]\n" ++"\tcomment = All Printers\n" ++"\tpath = /var/spool/samba\n" ++"\tbrowseable = no\n" ++"\tpublic = yes\n" ++"\tguest ok = yes\n" ++"\twritable = no\n" ++"\tprintable = yes\n" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:103 ++#, no-wrap ++msgid "" ++" [print$]\n" ++"\tcomment = Printer Drivers\n" ++"\tpath = /etc/samba/drivers\n" ++"\tbrowseable = yes\n" ++"\tguest ok = no\n" ++"\tread only = yes\n" ++"\twrite list = root\n" ++msgstr "" ++" [print$]\n" ++"\tcomment = Printer Drivers\n" ++"\tpath = /etc/samba/drivers\n" ++"\tbrowseable = yes\n" ++"\tguest ok = no\n" ++"\tread only = yes\n" ++"\twrite list = root\n" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:108 ++msgid "" ++"This configuration assumes a FHS-compliant installation of SAMBA; adjust the " ++"[printers] and [print$] share paths accordingly on your system as needed." ++msgstr "" ++"Cette configuration suppose une installation de SAMBA conforme au standard " ++"FHS. Modifiez les chemins des partages [printers] et [print$] suivant votre " ++"installation." ++ ++# type: SH ++#: cupsaddsmb.man.in:109 ++#, no-wrap ++msgid "MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS" ++msgstr "PILOTES POSTSCRIPT MICROSOFT POUR WINDOWS" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:117 ++msgid "" ++"The base driver for Windows 2000 and higher is the Microsoft PostScript " ++"driver, which is available on any system running Windows 2000 or higher in " ++"the %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 folder for 32-bit " ++"drivers and %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 folder for 64-" ++"bit drivers." ++msgstr "" ++"Le pilote de base de Windows 2000 et des versions ultérieures est le pilote " ++"PostScript Microsoft, qui est disponible sur tous les systèmes avec " ++"Windows 2000 ou une version ultérieure dans le répertoire %WINDIR%\\eSYSTEM32" ++"\\eSPOOL\\eDRIVERS\\eW32X86\\e3 pour les pilotes 32 bits et dans le " ++"répertoire %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 pour les pilotes " ++"64 bits." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:125 ++msgid "" ++"The CUPS printer driver is preferred over the Microsoft driver since it " ++"supports the page-label, job-billing, and job-hold-until options fully on " ++"all printers. However, currently only Windows 2000 and higher is supported " ++"by the Microsoft driver, so you will also need to get the Adobe driver to " ++"support Windows 95, 98, and Me clients. The Adobe and Microsoft drivers for " ++"Windows 2000 are identical." ++msgstr "" ++"Il est recommandé d'utiliser le pilote CUPS plutôt que celui de Microsoft " ++"puisqu'il permet, pour toutes les imprimantes, l'étiquetage des pages, la " ++"facturation des travaux et l'interruption. Cependant, seuls Windows 2000 et " ++"les versions ultérieures sont supportés par le pilote Microsoft, donc vous " ++"devrez utiliser le pilote Adobe pour les clients Windows 95, 98 et Me. Les " ++"pilotes Adobe et Microsoft pour Windows 2000 sont identiques." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:130 cupsaddsmb.man.in:159 ++msgid "" ++"Once you have extracted the driver files, copy the 32-bit drivers to the " ++"I<@CUPS_DATADIR@/drivers> directory and the 64-bit drivers to the " ++"I<@CUPS_DATADIR@/drivers/x64> directory exactly as named below:" ++msgstr "" ++"Après avoir extrait les fichiers du pilote, copier les pilotes 32 bits dans " ++"le répertoire I<@CUPS_DATADIR@/drivers> et les pilotes 64 bits dans le " ++"répertoire I<@CUPS_DATADIR@/drivers/x64>, en les nommant exactement comme " ++"ceci :" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:137 ++#, no-wrap ++msgid "" ++" [Windows 2000 and higher]\n" ++" ps5ui.dll\n" ++" pscript.hlp\n" ++" pscript.ntf\n" ++" pscript5.dll\n" ++msgstr "" ++" [Windows 2000 et supérieurs]\n" ++" ps5ui.dll\n" ++" pscript.hlp\n" ++" pscript.ntf\n" ++" pscript5.dll\n" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:142 cupsaddsmb.man.in:175 ++msgid "" ++"B<Note:> Unlike Windows, case is significant - make sure that you use the " ++"lowercase filenames shown above, otherwise I<cupsaddsmb> will fail to export " ++"the drivers." ++msgstr "" ++"B<Remarque :> Contrairement à Windows, la casse est importante. Assurez vous " ++"d'utiliser des noms de fichiers en minuscule, comme ci-dessus. Sinon, " ++"B<cupsaddsmb> échouera lors de l'export des pilotes." ++ ++# type: SH ++#: cupsaddsmb.man.in:143 ++#, no-wrap ++msgid "CUPS POSTSCRIPT DRIVERS FOR WINDOWS" ++msgstr "PILOTES POSTSCRIPT CUPS POUR WINDOWS" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:147 ++msgid "" ++"I<cupsaddsmb> can use the CUPS v6 PostScript printer driver for Windows, " ++"which is available for download from the CUPS web site." ++msgstr "" ++"B<cupsaddsmb> peut utiliser les pilotes PostScript CUPS V6 pour Windows, " ++"disponibles en téléchargement sur le site web de CUPS." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:154 ++msgid "" ++"The CUPS printer driver is preferred over the Adobe and Microsoft drivers " ++"since it supports the page-label, job-billing, and job-hold-until options " ++"fully on all printers. However, currently only Windows 2000 and higher is " ++"supported by the CUPS driver, so you will also need to get the Adobe driver " ++"to support Windows 95, 98, and Me clients." ++msgstr "" ++"Il est recommandé d'utiliser le pilote CUPS plutôt que ceux d'Adobe et de " ++"Microsoft puisqu'il permet, pour toutes les imprimantes, l'étiquetage des " ++"pages, la facturation des travaux et l'interruption des travaux. Cependant, " ++"seuls Windows 2000 et les versions ultérieures sont supportés le pilote " ++"CUPS, donc vous devrez utiliser le pilote Adobe pour les clients Windows 95, " ++"98 et Me." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:170 ++#, no-wrap ++msgid "" ++" [Windows 2000 and higher]\n" ++" cups6.inf (from www.cups.org)\n" ++" cups6.ini (from www.cups.org)\n" ++" cupsps6.dll (from www.cups.org)\n" ++" cupsui6.dll (from www.cups.org)\n" ++" ps5ui.dll (from your Windows system)\n" ++" pscript.hlp (from your Windows system)\n" ++" pscript.ntf (from your Windows system)\n" ++" pscript5.dll (from your Windows system)\n" ++msgstr "" ++" [Windows 2000 et supérieurs]\n" ++" cups6.inf (from www.cups.org)\n" ++" cups6.ini (from www.cups.org)\n" ++" cupsps6.dll (from www.cups.org)\n" ++" cupsui6.dll (from www.cups.org)\n" ++" ps5ui.dll (from your Windows system)\n" ++" pscript.hlp (from your Windows system)\n" ++" pscript.ntf (from your Windows system)\n" ++" pscript5.dll (from your Windows system)\n" ++ ++# type: SH ++#: cupsaddsmb.man.in:176 ++#, no-wrap ++msgid "ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME" ++msgstr "PILOTES POSTSCRIPT ADOBE POUR WINDOWS 95, 98 et ME" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:180 ++msgid "" ++"I<cupsaddsmb> can use the Adobe PostScript printer driver for Windows 95, " ++"98, and ME, which are available for download from the Adobe web site (http://" ++"www.adobe.com)." ++msgstr "" ++"B<cupsaddsmb> peut utiliser le pilote des imprimantes PostScript d'Adobe " ++"pour Windows 95, 98 et ME, qui sont disponibles en téléchargement sur le " ++"site d'Adobe (http://www.adobe.com)." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:183 ++msgid "" ++"The Adobe driver does not support the page-label, job-billing, or job-hold-" ++"until options." ++msgstr "" ++"Le pilote Adobe ne permet pas l'étiquetage des pages, la facturation des " ++"travaux et l'interruption des travaux." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:187 ++msgid "" ++"Once you have installed the driver on a Windows system, copy the following " ++"files to the I<@CUPS_DATADIR@/drivers> directory exactly as named below:" ++msgstr "" ++"Une fois que vous avec les pilotes sur un système Windows, copiez les " ++"fichiers suivants dans le répertoire I<@CUPS_DATADIR@/drivers>, en " ++"respectant les noms indiqués :" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:195 ++#, no-wrap ++msgid "" ++" [Windows 95, 98, and Me]\n" ++" ADFONTS.MFM\n" ++" ADOBEPS4.DRV\n" ++" ADOBEPS4.HLP\n" ++" ICONLIB.DLL\n" ++" PSMON.DLL\n" ++msgstr "" ++" [Windows 95, 98 et Me]\n" ++" ADFONTS.MFM\n" ++" ADOBEPS4.DRV\n" ++" ADOBEPS4.HLP\n" ++" ICONLIB.DLL\n" ++" PSMON.DLL\n" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:200 ++msgid "" ++"B<Note:> Unlike Windows, case is significant - make sure that you use the " ++"UPPERCASE filenames shown above, otherwise I<cupsaddsmb> will fail to export " ++"the drivers." ++msgstr "" ++"B<Remarque :> Contrairement à Windows, la casse est importante. Assurez vous " ++"d'utiliser des noms de fichiers en MAJUSCULE, comme ci-dessus. Sinon, " ++"B<cupsaddsmb> échouera lors de l'export des pilotes." ++ ++# type: SH ++#: cupsaddsmb.man.in:201 cupsfilter.man:62 ++#, no-wrap ++msgid "KNOWN ISSUES" ++msgstr "PROBLÈMES CONNUS" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:203 ++msgid "Getting the full set of Windows driver files should be easier." ++msgstr "" ++"Récupérer l'ensemble complet des pilotes Windows devrait être plus simple." ++ ++# type: Plain text ++#: cupsaddsmb.man.in:207 ++msgid "I<smbd(8)>, I<smb.conf(5)>, http://localhost:631/help" ++msgstr "B<smbd>(8), B<smb.conf>(5), http://localhost:631/help" ++ ++# type: Plain text ++#: cupsaddsmb.man.in:209 ++msgid "http://www.cups.org/windows/" ++msgstr "http://www.cups.org/windows/" ++ ++# type: TH ++#: cups-config.man:15 ++#, no-wrap ++msgid "cups-config" ++msgstr "cups-config" ++ ++# type: TH ++#: cups-config.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 ++#: cups-driverd.man.in:15 lpq.man:15 ++#, no-wrap ++msgid "16 June 2008" ++msgstr "16 juin 2008" ++ ++# type: Plain text ++#: cups-config.man:18 ++msgid "cups-config - get cups api, compiler, directory, and link information." ++msgstr "" ++"cups-config - Obtenir les informations sur l'API, les répertoires, la " ++"compilation et l'édition des liens pour CUPS." ++ ++# type: Plain text ++#: cups-config.man:21 ++msgid "B<cups-config> --api-version" ++msgstr "B<cups-config> --api-version" ++ ++# type: Plain text ++#: cups-config.man:24 ++msgid "B<cups-config> --cflags" ++msgstr "B<cups-config> --cflags" ++ ++# type: Plain text ++#: cups-config.man:27 ++msgid "B<cups-config> --datadir" ++msgstr "B<cups-config> --datadir" ++ ++# type: Plain text ++#: cups-config.man:30 ++msgid "B<cups-config> --help" ++msgstr "B<cups-config> --help" ++ ++# type: Plain text ++#: cups-config.man:33 ++msgid "B<cups-config> --ldflags" ++msgstr "B<cups-config> --ldflags" ++ ++# type: Plain text ++#: cups-config.man:40 ++msgid "B<cups-config> [ I<--image> ] [ I<--static> ] --libs" ++msgstr "B<cups-config> [ --image ] [ --static ] --libs" ++ ++# type: Plain text ++#: cups-config.man:43 ++msgid "B<cups-config> --serverbin" ++msgstr "B<cups-config> --serverbin" ++ ++# type: Plain text ++#: cups-config.man:46 ++msgid "B<cups-config> --serverroot" ++msgstr "B<cups-config> --serverroot" ++ ++# type: Plain text ++#: cups-config.man:49 ++msgid "B<cups-config> --version" ++msgstr "B<cups-config> --version" ++ ++# type: Plain text ++#: cups-config.man:55 ++msgid "" ++"B<cups-config> is the CUPS program configuration utility. It should be used " ++"by application developers to determine the necessary command-line options " ++"for the compiler and linker, as well as determining installation directories " ++"for filters, configuration files, and drivers." ++msgstr "" ++"B<cups-config> est l'utilitaire de configuration pour les programmes CUPS. " ++"Il devrait être utilisé par les développeurs d'application pour déterminer " ++"les options en ligne de commande pour le compilateur ou l'éditeur de liens, " ++"comme pour déterminer les répertoires des filtres, fichiers de " ++"configurations et pilotes." ++ ++# type: TP ++#: cups-config.man:56 ++#, no-wrap ++msgid "--api-version" ++msgstr "B<--api-version>" ++ ++# type: Plain text ++#: cups-config.man:60 ++msgid "Displays the current API version (major.minor)." ++msgstr "Afficher la version d'API actuelle (majeur.mineur)." ++ ++# type: TP ++#: cups-config.man:60 ++#, no-wrap ++msgid "--cflags" ++msgstr "B<--cflags>" ++ ++# type: Plain text ++#: cups-config.man:64 ++msgid "Displays the necessary compiler options." ++msgstr "Afficher les options de compilations nécessaires." ++ ++# type: TP ++#: cups-config.man:64 ++#, no-wrap ++msgid "--datadir" ++msgstr "B<--datadir>" ++ ++# type: Plain text ++#: cups-config.man:68 ++msgid "Displays the default CUPS data directory." ++msgstr "Afficher le répertoire de données par défaut de CUPS." ++ ++# type: TP ++#: cups-config.man:68 ++#, no-wrap ++msgid "--help" ++msgstr "B<--help>" ++ ++# type: Plain text ++#: cups-config.man:72 ++msgid "Displays the program usage message." ++msgstr "Afficher un message d'aide." ++ ++# type: TP ++#: cups-config.man:72 ++#, no-wrap ++msgid "--image" ++msgstr "B<--image>" ++ ++# type: Plain text ++#: cups-config.man:77 ++msgid "" ++"When used with I<--libs>, adds the CUPS imaging library to the list of " ++"displayed libraries." ++msgstr "" ++"Lorsqu'elle est utilisée avec B<--libs>, cette option ajoute la bibliothèque " ++"de gestion des images CUPS des bibliothèques affichées." ++ ++# type: TP ++#: cups-config.man:77 ++#, no-wrap ++msgid "--ldflags" ++msgstr "B<--ldflags>" ++ ++# type: Plain text ++#: cups-config.man:81 ++msgid "Displays the necessary linker options." ++msgstr "Afficher les options nécessaires pour l'édition des liens." ++ ++# type: TP ++#: cups-config.man:81 ++#, no-wrap ++msgid "--libs" ++msgstr "B<--libs>" ++ ++# type: Plain text ++#: cups-config.man:85 ++msgid "Displays the necessary librarys to link to." ++msgstr "Afficher les bibliothèques nécessaires pour l'édition des liens." ++ ++# type: TP ++#: cups-config.man:85 ++#, no-wrap ++msgid "--serverbin" ++msgstr "B<--serverbin>" ++ ++# type: Plain text ++#: cups-config.man:90 ++msgid "" ++"Displays the default CUPS binary directory, where filters and backends are " ++"stored." ++msgstr "" ++"Afficher le répertoires par défaut des binaires, où se trouvent les filtres " ++"et dorsaux." ++ ++# type: TP ++#: cups-config.man:90 ++#, no-wrap ++msgid "--serverroot" ++msgstr "B<--serverroot>" ++ ++# type: Plain text ++#: cups-config.man:94 ++msgid "Displays the default CUPS configuration file directory." ++msgstr "Afficher le répertoire de configuration par défaut d eCUPS." ++ ++# type: TP ++#: cups-config.man:94 ++#, no-wrap ++msgid "--static" ++msgstr "B<--static>" ++ ++# type: Plain text ++#: cups-config.man:99 ++msgid "" ++"When used with I<--libs>, shows the static libraries instead of the default " ++"(shared) libraries." ++msgstr "" ++"Lorsqu'elle est utilisée avec B<--libs>, les bibliothèques statiques seront " ++"affichées au lieu des bibliothèques partagées qui sont affichées par défaut." ++ ++# type: TP ++#: cups-config.man:99 ++#, no-wrap ++msgid "--version" ++msgstr "B<--version>" ++ ++# type: Plain text ++#: cups-config.man:104 ++msgid "" ++"Displays the full version number of the CUPS installation (major.minor." ++"patch)." ++msgstr "" ++"Afficher la version complète de l'installation CUPS (majeur.mineur.patch)." ++ ++# type: Plain text ++#: cups-config.man:107 cupsd.conf.man.in:615 cups-deviced.man.in:41 ++#: cups-driverd.man.in:102 lpadmin.man:204 lpq.man:69 ++msgid "Copyright 2007-2008 by Apple Inc." ++msgstr "Copyright 2007-2008 par Apple Inc." ++ ++# type: TH ++#: cupsctl.man:15 ++#, no-wrap ++msgid "cupsctl" ++msgstr "cupsctl" ++ ++# type: TH ++#: cupsctl.man:15 ++#, no-wrap ++msgid "5 July 2007" ++msgstr "5 juillet 2007" ++ ++# type: Plain text ++#: cupsctl.man:18 ++msgid "cupsctl - configure cupsd.conf options" ++msgstr "cupsctl - Configurer les options de cupsd.conf" ++ ++# type: Plain text ++#: cupsctl.man:29 ++msgid "" ++"B<cupsctl> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] [ --[no-]debug-" ++"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" ++"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " ++"[ I<name=value> ]" ++msgstr "" ++"B<cupsctl> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] [ --[no-]" ++"debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]" ++"remote-printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " ++"[ I<nom=valeur> ]" ++ ++# type: Plain text ++#: cupsctl.man:33 ++msgid "" ++"I<cupsctl> updates or queries the B<cupsd.conf> file for a server. When no " ++"changes are requested, the current configuration values are written to the " ++"standard output in the format \"name=value\", one per line." ++msgstr "" ++"I<cupsctl> met à jour ou interroge le fichier B<cupsd.conf> d'un serveur. " ++"Quand aucun changement n'est demandé, les valeurs de configuration actuelles " ++"sont affichées sur la sortie standard sous la forme « nom=valeur », une par " ++"ligne." ++ ++# type: Plain text ++#: cupsctl.man:35 ++msgid "The following options are recognized:" ++msgstr "Les options suivantes sont reconnues :" ++ ++# type: Plain text ++#: cupsctl.man:39 ++msgid "Enables encryption on the connection to the scheduler." ++msgstr "Activer le chiffrement de la connexion à l'ordonnanceur." ++ ++# type: TP ++#: cupsctl.man:39 ++#, no-wrap ++msgid "-U I<username>" ++msgstr "B<-U> I<utilisateur>" ++ ++# type: Plain text ++#: cupsctl.man:43 ++msgid "" ++"Specifies an alternate username to use when authenticating with the " ++"scheduler." ++msgstr "" ++"Spécifier un autre utilisateur à utiliser pour l'identification auprès de " ++"l'ordonnanceur." ++ ++# type: TP ++#: cupsctl.man:43 ++#, no-wrap ++msgid "-h I<server[:port]>" ++msgstr "B<-h> I<serveur[:port]>" ++ ++# type: Plain text ++#: cupsctl.man:47 ++msgid "Specifies the server address." ++msgstr "Définir l'adresse du serveur." ++ ++# type: TP ++#: cupsctl.man:47 ++#, no-wrap ++msgid "--[no-]debug-logging" ++msgstr "B<--[no-]debug-logging>" ++ ++# type: Plain text ++#: cupsctl.man:51 ++msgid "Enables or disables debug logging in the B<error_log> file." ++msgstr "" ++"Activer ou désactiver la journalisation d'informations de débogage dans le " ++"fichier B<error_log>." ++ ++# type: TP ++#: cupsctl.man:51 ++#, no-wrap ++msgid "--[no-]remote-admin" ++msgstr "B<--[no-]remote-admin>" ++ ++# type: Plain text ++#: cupsctl.man:55 ++msgid "Enables or disables remote administration." ++msgstr "Activer ou désactiver l'administration à distance." ++ ++# type: TP ++#: cupsctl.man:55 ++#, no-wrap ++msgid "--[no-]remote-any" ++msgstr "B<--[no-]remote-any>" ++ ++# type: Plain text ++#: cupsctl.man:59 ++msgid "Enables or disables printing from any address, e.g. the Internet." ++msgstr "" ++"Activer ou désactiver l'impression depuis n'importe quelle adresse, comme " ++"par exemple depuis Internet." ++ ++# type: TP ++#: cupsctl.man:59 ++#, no-wrap ++msgid "--[no-]remote-printers" ++msgstr "B<--[no-]remote-printers>" ++ ++# type: Plain text ++#: cupsctl.man:64 ++msgid "" ++"Enables or disables the display of remote printers shared via the CUPS, " ++"LDAP, or SLP protocols." ++msgstr "" ++"Activer ou désactiver l'affichage d'imprimantes distantes partagées par les " ++"protocoles CUPS, LDAP ou SLP." ++ ++# type: TP ++#: cupsctl.man:64 ++#, no-wrap ++msgid "--[no-]share-printers" ++msgstr "B<--[no-]share-printers>" ++ ++# type: Plain text ++#: cupsctl.man:68 ++msgid "Enables or disables sharing of local printers with other computers." ++msgstr "" ++"Activer ou désactiver le partage d'imprimantes locales avec d'autres " ++"ordinateurs." ++ ++# type: TP ++#: cupsctl.man:68 ++#, no-wrap ++msgid "--[no-]user-cancel-any" ++msgstr "B<--[no-]user-cancel-any>" ++ ++# type: Plain text ++#: cupsctl.man:72 ++msgid "Allows or prevents users from canceling jobs owned by others." ++msgstr "" ++"Permettre ou interdire aux utilisateurs d'annuler les travaux d'autres " ++"utilisateurs." ++ ++# type: SH ++#: cupsctl.man:72 cupstestppd.man:115 lp.man:210 ++#, no-wrap ++msgid "EXAMPLES" ++msgstr "EXEMPLES" ++ ++# type: Plain text ++#: cupsctl.man:74 ++msgid "Display the current settings:" ++msgstr "Afficher la configuration actuelle :" ++ ++# type: Plain text ++#: cupsctl.man:76 ++#, no-wrap ++msgid " cupsctl\n" ++msgstr " cupsctl\n" ++ ++# type: Plain text ++#: cupsctl.man:79 ++msgid "Enable debug logging:" ++msgstr "Activer la journalisation d'informations de débogage." ++ ++# type: Plain text ++#: cupsctl.man:81 ++#, no-wrap ++msgid " cupsctl --debug-logging\n" ++msgstr " cupsctl --debug-logging\n" ++ ++# type: Plain text ++#: cupsctl.man:84 ++msgid "Get the current debug logging state:" ++msgstr "Récupérer l'état de la journalisation d'informations de débogage :" ++ ++# type: Plain text ++#: cupsctl.man:86 ++#, no-wrap ++msgid " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" ++msgstr " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" ++ ++# type: Plain text ++#: cupsctl.man:89 ++msgid "Disable printer sharing:" ++msgstr "Désactiver le partage d'imprimantes :" ++ ++# type: Plain text ++#: cupsctl.man:91 ++#, no-wrap ++msgid " cupsctl --no-shared-printers\n" ++msgstr " cupsctl --no-shared-printers\n" ++ ++# type: Plain text ++#: cupsctl.man:94 ++msgid "Enable printing using the file: pseudo-device:" ++msgstr "Activer l'impression dans le fichier « pseudo-périphérique » :" ++ ++# type: TP ++#: cupsctl.man:96 ++#, no-wrap ++msgid " cupsctl FileDevice=Yes\n" ++msgstr " cupsctl FileDevice=Yes\n" ++ ++# type: Plain text ++#: cupsctl.man:99 ++msgid "I<cupsd.conf(5)>, I<cupsd(8)>," ++msgstr "B<cupsd.conf>(5), B<cupsd>(8)," ++ ++# type: TH ++#: cupsd.conf.man.in:15 ++#, no-wrap ++msgid "cupsd.conf" ++msgstr "cupsd.conf" ++ ++# type: Plain text ++#: cupsd.conf.man.in:18 ++msgid "cupsd.conf - server configuration file for cups" ++msgstr "cupsd.conf - Fichier de configuration du serveur CUPS." ++ ++# type: Plain text ++#: cupsd.conf.man.in:21 ++msgid "" ++"The I<cupsd.conf> file configures the CUPS scheduler, I<cupsd(8)>. It is " ++"normally located in the I<@CUPS_SERVERROOT@> directory." ++msgstr "" ++"Le fichier I<cupsd.conf> configure l'ordonnanceur CUPS, B<cupsd>(8). Il est " ++"généralement situé dans le répertoire I<@CUPS_SERVERROOT@>." ++ ++# type: Plain text ++#: cupsd.conf.man.in:26 ++msgid "" ++"Each line in the file can be a configuration directive, a blank line, or a " ++"comment. Comment lines start with the # character. The configuration " ++"directives are intentionally similar to those used by the popular Apache web " ++"server software and are described below." ++msgstr "" ++"Chaque ligne de ce fichier est soit une directive de configuration, une " ++"ligne vide, ou un commentaire. Les lignes de commentaire commencent par le " ++"caractère #. Les directives de configuration sont volontairement similaires " ++"à celles utilisées par le serveur web Apache, et sont décrites ci-dessous." ++ ++# type: Plain text ++#: cupsd.conf.man.in:29 ++msgid "" ++"The following directives are understood by I<cupsd(8)>. Consult the on-line " ++"help for detailed descriptions:" ++msgstr "" ++"Les directives suivantes sont comprises par B<cupsd>(8). Veuillez vous " ++"reporter à l'aide en ligne pour une description plus détaillée." ++ ++# type: TP ++#: cupsd.conf.man.in:29 ++#, no-wrap ++msgid "AccessLog filename" ++msgstr "AccessLog fichier" ++ ++# type: TP ++#: cupsd.conf.man.in:31 ++#, no-wrap ++msgid "AccessLog syslog" ++msgstr "AccessLog syslog" ++ ++# type: Plain text ++#: cupsd.conf.man.in:35 ++msgid "Defines the access log filename." ++msgstr "Définir le fichier traçant les accès." ++ ++# type: TP ++#: cupsd.conf.man.in:35 ++#, no-wrap ++msgid "Allow all" ++msgstr "Allow all" ++ ++# type: TP ++#: cupsd.conf.man.in:37 ++#, no-wrap ++msgid "Allow none" ++msgstr "Allow none" ++ ++# type: TP ++#: cupsd.conf.man.in:39 ++#, no-wrap ++msgid "Allow host.domain.com" ++msgstr "Allow serveur.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:41 ++#, no-wrap ++msgid "Allow *.domain.com" ++msgstr "Allow *.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:43 ++#, no-wrap ++msgid "Allow ip-address" ++msgstr "Allow adresse_ip" ++ ++# type: TP ++#: cupsd.conf.man.in:45 ++#, no-wrap ++msgid "Allow ip-address/netmask" ++msgstr "Allow adresse_ip/masque_sous_réseau" ++ ++# type: TP ++#: cupsd.conf.man.in:47 ++#, no-wrap ++msgid "Allow ip-address/mm" ++msgstr "Allow adresse_ip/mm" ++ ++# type: TP ++#: cupsd.conf.man.in:49 ++#, no-wrap ++msgid "Allow @IF(name)" ++msgstr "Allow @IF(nom)" ++ ++# type: TP ++#: cupsd.conf.man.in:51 ++#, no-wrap ++msgid "Allow @LOCAL" ++msgstr "Allow @LOCAL" ++ ++# type: Plain text ++#: cupsd.conf.man.in:55 ++msgid "Allows access from the named hosts or addresses." ++msgstr "Permettre l'accès depuis des machines nommées ou des adresses IP." ++ ++# type: TP ++#: cupsd.conf.man.in:55 ++#, no-wrap ++msgid "AuthClass User" ++msgstr "AuthClass User" ++ ++# type: TP ++#: cupsd.conf.man.in:57 ++#, no-wrap ++msgid "AuthClass Group" ++msgstr "AuthClass Group" ++ ++# type: TP ++#: cupsd.conf.man.in:59 ++#, no-wrap ++msgid "AuthClass System" ++msgstr "AuthClass System" ++ ++# type: Plain text ++#: cupsd.conf.man.in:64 ++msgid "" ++"Specifies the authentication class (User, Group, System) - B<this directive " ++"is deprecated>." ++msgstr "" ++"Définir la classe d'identification (User, Group, System). B<Cette directive " ++"est obsolète.>" ++ ++# type: TP ++#: cupsd.conf.man.in:64 ++#, no-wrap ++msgid "AuthGroupName group-name" ++msgstr "AuthGroupName groupe" ++ ++# type: Plain text ++#: cupsd.conf.man.in:69 ++msgid "Specifies the authentication group - B<this directive is deprecated>." ++msgstr "Définir le groupe d'identification. B<Cette directive est obsolète.>" ++ ++# type: TP ++#: cupsd.conf.man.in:69 ++#, no-wrap ++msgid "AuthType None" ++msgstr "AuthType None" ++ ++# type: TP ++#: cupsd.conf.man.in:71 ++#, no-wrap ++msgid "AuthType Basic" ++msgstr "AuthType Basic" ++ ++# type: TP ++#: cupsd.conf.man.in:73 ++#, no-wrap ++msgid "AuthType BasicDigest" ++msgstr "AuthType BasicDigest" ++ ++# type: TP ++#: cupsd.conf.man.in:75 ++#, no-wrap ++msgid "AuthType Digest" ++msgstr "AuthType Digest" ++ ++# type: TP ++#: cupsd.conf.man.in:77 ++#, no-wrap ++msgid "AuthType Negotiate" ++msgstr "AuthType Negotiate" ++ ++# type: Plain text ++#: cupsd.conf.man.in:81 ++msgid "" ++"Specifies the authentication type (None, Basic, BasicDigest, Digest, " ++"Negotiate)" ++msgstr "" ++"Définir le type d'identification (None, Basic, BasicDigest, Digest, " ++"Negotiate)." ++ ++# type: TP ++#: cupsd.conf.man.in:81 ++#, no-wrap ++msgid "AutoPurgeJobs Yes" ++msgstr "AutoPurgeJobs Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:83 ++#, no-wrap ++msgid "AutoPurgeJobs No" ++msgstr "AutoPurgeJobs No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:88 ++msgid "" ++"Specifies whether to purge job history data automatically when it is no " ++"longer required for quotas." ++msgstr "" ++"Définir s'il faut purger automatiquement l'historique des travaux lorsque " ++"les données ne sont plus nécessaires pour l'application des quotas." ++ ++# type: TP ++#: cupsd.conf.man.in:88 ++#, no-wrap ++msgid "BrowseAddress ip-address" ++msgstr "BrowseAddress adresse_ip" ++ ++# type: TP ++#: cupsd.conf.man.in:90 ++#, no-wrap ++msgid "BrowseAddress @IF(name)" ++msgstr "BrowseAddress @IF(nom)" ++ ++# type: TP ++#: cupsd.conf.man.in:92 ++#, no-wrap ++msgid "BrowseAddress @LOCAL" ++msgstr "BrowseAddress @LOCAL" ++ ++# type: Plain text ++#: cupsd.conf.man.in:96 ++msgid "Specifies a broadcast address for outgoing printer information packets." ++msgstr "" ++"Définir une adresse où broadcaster les informations sur les imprimantes." ++ ++# type: TP ++#: cupsd.conf.man.in:96 ++#, no-wrap ++msgid "BrowseAllow all" ++msgstr "BrowseAllow all" ++ ++# type: TP ++#: cupsd.conf.man.in:98 ++#, no-wrap ++msgid "BrowseAllow none" ++msgstr "BrowseAllow none" ++ ++# type: TP ++#: cupsd.conf.man.in:100 ++#, no-wrap ++msgid "BrowseAllow host.domain.com" ++msgstr "BrowseAllow serveur.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:102 ++#, no-wrap ++msgid "BrowseAllow *.domain.com" ++msgstr "BrowseAllow *.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:104 ++#, no-wrap ++msgid "BrowseAllow ip-address" ++msgstr "BrowseAllow adresse_ip" ++ ++# type: TP ++#: cupsd.conf.man.in:106 ++#, no-wrap ++msgid "BrowseAllow ip-address/netmask" ++msgstr "BrowseAllow adresse_ip/masque_sous_réseau" ++ ++# type: TP ++#: cupsd.conf.man.in:108 ++#, no-wrap ++msgid "BrowseAllow ip-address/mm" ++msgstr "BrowseAllow adresse_ip/mm" ++ ++# type: TP ++#: cupsd.conf.man.in:110 ++#, no-wrap ++msgid "BrowseAllow @IF(name)" ++msgstr "BrowseAllow @IF(nom)" ++ ++# type: TP ++#: cupsd.conf.man.in:112 ++#, no-wrap ++msgid "BrowseAllow @LOCAL" ++msgstr "BrowseAllow @LOCAL" ++ ++# type: Plain text ++#: cupsd.conf.man.in:116 ++msgid "" ++"Allows incoming printer information packets from the named host or address." ++msgstr "Accepter les paquets arrivant des machines ou adresses IP indiquées." ++ ++# type: TP ++#: cupsd.conf.man.in:116 ++#, no-wrap ++msgid "BrowseDeny all" ++msgstr "BrowseDeny all" ++ ++# type: TP ++#: cupsd.conf.man.in:118 ++#, no-wrap ++msgid "BrowseDeny none" ++msgstr "BrowseDeny none" ++ ++# type: TP ++#: cupsd.conf.man.in:120 ++#, no-wrap ++msgid "BrowseDeny host.domain.com" ++msgstr "BrowseDeny serveur.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:122 ++#, no-wrap ++msgid "BrowseDeny *.domain.com" ++msgstr "BrowseDeny *.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:124 ++#, no-wrap ++msgid "BrowseDeny ip-address" ++msgstr "BrowseDeny adresse_ip" ++ ++# type: TP ++#: cupsd.conf.man.in:126 ++#, no-wrap ++msgid "BrowseDeny ip-address/netmask" ++msgstr "BrowseDeny adresse_ip/masque_sous_réseau" ++ ++# type: TP ++#: cupsd.conf.man.in:128 ++#, no-wrap ++msgid "BrowseDeny ip-address/mm" ++msgstr "BrowseDeny addresse_ip/mm" ++ ++# type: TP ++#: cupsd.conf.man.in:130 ++#, no-wrap ++msgid "BrowseDeny @IF(name)" ++msgstr "BrowseDeny @IF(nom)" ++ ++# type: TP ++#: cupsd.conf.man.in:132 ++#, no-wrap ++msgid "BrowseDeny @LOCAL" ++msgstr "BrowseDeny @LOCAL" ++ ++# type: Plain text ++#: cupsd.conf.man.in:136 ++msgid "" ++"Denies incoming printer information packets from the named host or address." ++msgstr "" ++"Refuser les paquets d'informations sur les imprimantes arrivant de machines " ++"ou d'adresses IP données." ++ ++# type: TP ++#: cupsd.conf.man.in:136 ++#, no-wrap ++msgid "BrowseInterval seconds" ++msgstr "BrowseInterval secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:140 ++msgid "Specifies the maximum interval between printer information broadcasts." ++msgstr "" ++"Définir l'intervalle maximum entre les envois d'information sur les " ++"imprimantes." ++ ++# type: TP ++#: cupsd.conf.man.in:140 ++#, no-wrap ++msgid "BrowseOrder allow,deny" ++msgstr "BrowseOrder allow,deny" ++ ++# type: TP ++#: cupsd.conf.man.in:142 ++#, no-wrap ++msgid "BrowseOrder deny,allow" ++msgstr "BrowseOrder deny,allow" ++ ++# type: Plain text ++#: cupsd.conf.man.in:146 ++msgid "" ++"Specifies the order of printer information access control (allow,deny or " ++"deny,allow)" ++msgstr "" ++"Définir l'ordre du contrôle d'accès aux informations des imprimantes (allow," ++"deny ou deny,allow)." ++ ++# type: TP ++#: cupsd.conf.man.in:146 ++#, no-wrap ++msgid "BrowsePoll host-or-ip-address" ++msgstr "BrowsePoll serveur-ou-adresse_ip" ++ ++# type: Plain text ++#: cupsd.conf.man.in:150 ++msgid "Specifies a server to poll for printer information." ++msgstr "" ++"Définir un serveur à interroger régulièrement pour les informations sur les " ++"imprimantes." ++ ++# type: TP ++#: cupsd.conf.man.in:150 ++#, no-wrap ++msgid "BrowsePort port" ++msgstr "BrowsePort port" ++ ++# type: Plain text ++#: cupsd.conf.man.in:154 ++msgid "Specifies the port to listen to for printer information packets." ++msgstr "" ++"Définir le port utilisé pour écouter les informations sur les imprimantes." ++ ++# type: TP ++#: cupsd.conf.man.in:154 ++#, no-wrap ++msgid "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:158 ++msgid "Specifies the protocols to use for printer browsing." ++msgstr "" ++"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes." ++ ++# type: TP ++#: cupsd.conf.man.in:158 ++#, no-wrap ++msgid "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:162 ++msgid "Specifies the protocols to use for local printer browsing." ++msgstr "" ++"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes " ++"locales." ++ ++# type: TP ++#: cupsd.conf.man.in:162 ++#, no-wrap ++msgid "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++msgstr "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:166 ++msgid "Specifies the protocols to use for remote printer browsing." ++msgstr "" ++"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes " ++"distantes." ++ ++# type: TP ++#: cupsd.conf.man.in:166 ++#, no-wrap ++msgid "BrowseRelay from-address to-address" ++msgstr "BrowseRelay depuis_adresse vers_adresse" ++ ++# type: Plain text ++#: cupsd.conf.man.in:171 ++msgid "" ++"Specifies that printer information packets should be relayed from one host " ++"or network to another." ++msgstr "" ++"Indiquer que les informations sur les imprimantes doivent être relayés " ++"depuis une machine ou un réseau vers un autre." ++ ++# type: TP ++#: cupsd.conf.man.in:171 ++#, no-wrap ++msgid "BrowseShortNames Yes" ++msgstr "BrowseShortNames Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:173 ++#, no-wrap ++msgid "BrowseShortNames No" ++msgstr "BrowseShortNames No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:179 ++msgid "" ++"Specifies whether remote printers will use short names (\"printer\") or not " ++"(\"printer@server\"). This option is ignored if more than one remote printer " ++"exists with the same name." ++msgstr "" ++"Définir si les imprimantes distantes utilisent les noms abrégés " ++"(« imprimante ») ou non (« imprimante@serveur »). Cette option est ignorée si " ++"plus d'une imprimante distante a le même nom." ++ ++# type: TP ++#: cupsd.conf.man.in:179 ++#, no-wrap ++msgid "BrowseTimeout seconds" ++msgstr "BrowseTimeout secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:184 ++msgid "" ++"Specifies the maximum interval between printer information updates before " ++"remote printers will be removed from the list of available printers." ++msgstr "" ++"Définir l'intervalle maximum de temps entre deux mises à jour d'informations " ++"des imprimantes distantes avant que celles-ci ne soient supprimées de la " ++"liste des imprimantes disponibles." ++ ++# type: TP ++#: cupsd.conf.man.in:184 ++#, no-wrap ++msgid "Browsing Yes" ++msgstr "Browsing Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:186 ++#, no-wrap ++msgid "Browsing No" ++msgstr "Browsing No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:190 ++msgid "Specifies whether or not remote printer browsing should be enabled." ++msgstr "Définir si la recherche des imprimantes distantes doit être activée." ++ ++# NOTE: bannière à traduire ? ++# type: TP ++#: cupsd.conf.man.in:190 ++#, no-wrap ++msgid "Classification banner" ++msgstr "Classification bannière" ++ ++# type: Plain text ++#: cupsd.conf.man.in:194 ++msgid "Specifies the security classification of the server." ++msgstr "Définir le niveau de classification du serveur." ++ ++# type: TP ++#: cupsd.conf.man.in:194 ++#, no-wrap ++msgid "ClassifyOverride Yes" ++msgstr "ClassifyOverride Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:196 ++#, no-wrap ++msgid "ClassifyOverride No" ++msgstr "ClassifyOverride No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:201 ++msgid "" ++"Specifies whether to allow users to override the classification of " ++"individual print jobs." ++msgstr "" ++"Définir si les utilisateurs sont autorisés à modifier la classification de " ++"leurs travaux d'impression." ++ ++# type: TP ++#: cupsd.conf.man.in:201 ++#, no-wrap ++msgid "ConfigFilePerm mode" ++msgstr "ConfigFilePerm mode" ++ ++# type: Plain text ++#: cupsd.conf.man.in:206 ++msgid "" ++"Specifies the permissions for all configuration files that the scheduler " ++"writes." ++msgstr "" ++"Définir les permissions à utiliser pour les fichiers de configuration écrits " ++"par l'ordonnanceur." ++ ++# type: TP ++#: cupsd.conf.man.in:206 ++#, no-wrap ++msgid "DataDir path" ++msgstr "DataDir path" ++ ++# type: Plain text ++#: cupsd.conf.man.in:210 ++msgid "Specified the directory where data files can be found." ++msgstr "Définir le répertoire où se trouvent les fichiers de données." ++ ++# type: TP ++#: cupsd.conf.man.in:210 ++#, no-wrap ++msgid "DefaultAuthType Basic" ++msgstr "DefaultAuthType Basic" ++ ++# type: TP ++#: cupsd.conf.man.in:212 ++#, no-wrap ++msgid "DefaultAuthType BasicDigest" ++msgstr "DefaultAuthType BasicDigest" ++ ++# type: TP ++#: cupsd.conf.man.in:214 ++#, no-wrap ++msgid "DefaultAuthType Digest" ++msgstr "DefaultAuthType Digest" ++ ++# type: TP ++#: cupsd.conf.man.in:216 ++#, no-wrap ++msgid "DefaultAuthType Negotiate" ++msgstr "DefaultAuthType Negotiate" ++ ++# type: Plain text ++#: cupsd.conf.man.in:220 ++msgid "Specifies the default type of authentication to use." ++msgstr "Définir le type d'identification à utiliser par défaut." ++ ++# type: TP ++#: cupsd.conf.man.in:220 ++#, no-wrap ++msgid "DefaultCharset charset" ++msgstr "DefaultCharset jeux_de_caractères" ++ ++# type: Plain text ++#: cupsd.conf.man.in:224 ++msgid "Specifies the default character set to use for text." ++msgstr "Définir le jeu de caractères par défaut à utiliser pour le texte." ++ ++# type: TP ++#: cupsd.conf.man.in:224 ++#, no-wrap ++msgid "DefaultLanguage locale" ++msgstr "DefaultLanguage locale" ++ ++# type: Plain text ++#: cupsd.conf.man.in:228 ++msgid "Specifies the default language to use for text and web content." ++msgstr "" ++"Définir la langue par défaut à utiliser pour les textes et le site web." ++ ++# type: TP ++#: cupsd.conf.man.in:228 ++#, no-wrap ++msgid "DefaultPolicy policy-name" ++msgstr "DefaultPolicy nom" ++ ++# type: Plain text ++#: cupsd.conf.man.in:232 ++msgid "Specifies the default access policy to use." ++msgstr "Indiquer la politique d'accès par défaut." ++ ++# type: TP ++#: cupsd.conf.man.in:232 ++#, no-wrap ++msgid "DefaultShared Yes" ++msgstr "DefaultShared Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:234 ++#, no-wrap ++msgid "DefaultShared No" ++msgstr "DefaultShared No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:238 ++msgid "Specifies whether local printers are shared by default." ++msgstr "Définir si les imprimantes locales sont partagées par défaut." ++ ++# type: TP ++#: cupsd.conf.man.in:238 ++#, no-wrap ++msgid "Deny all" ++msgstr "Deny all" ++ ++# type: TP ++#: cupsd.conf.man.in:240 ++#, no-wrap ++msgid "Deny none" ++msgstr "Deny none" ++ ++# type: TP ++#: cupsd.conf.man.in:242 ++#, no-wrap ++msgid "Deny host.domain.com" ++msgstr "Deny serveur.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:244 ++#, no-wrap ++msgid "Deny *.domain.com" ++msgstr "Deny *.domaine.com" ++ ++# type: TP ++#: cupsd.conf.man.in:246 ++#, no-wrap ++msgid "Deny ip-address" ++msgstr "Deny adresse_ip" ++ ++# type: TP ++#: cupsd.conf.man.in:248 ++#, no-wrap ++msgid "Deny ip-address/netmask" ++msgstr "Deny adresse_ip/masque_sous_réseau" ++ ++# type: TP ++#: cupsd.conf.man.in:250 ++#, no-wrap ++msgid "Deny ip-address/mm" ++msgstr "Deny adresse_ip/mm" ++ ++# type: TP ++#: cupsd.conf.man.in:252 ++#, no-wrap ++msgid "Deny @IF(name)" ++msgstr "Deny @IF(nom)" ++ ++# type: TP ++#: cupsd.conf.man.in:254 ++#, no-wrap ++msgid "Deny @LOCAL" ++msgstr "Deny @LOCAL" ++ ++# type: Plain text ++#: cupsd.conf.man.in:258 ++msgid "Denies access to the named host or address." ++msgstr "Interdire l'accès à une machine ou à une adresse IP donnée." ++ ++# type: TP ++#: cupsd.conf.man.in:258 ++#, no-wrap ++msgid "DocumentRoot directory" ++msgstr "DocumentRoot répertoire" ++ ++# type: Plain text ++#: cupsd.conf.man.in:262 ++msgid "Specifies the root directory for the internal web server documents." ++msgstr "Définir le répertoire racine des documents du serveur web interne." ++ ++# type: TP ++#: cupsd.conf.man.in:271 ++#, no-wrap ++msgid "ErrorLog filename" ++msgstr "ErrorLog fichier" ++ ++# type: TP ++#: cupsd.conf.man.in:273 ++#, no-wrap ++msgid "ErrorLog syslog" ++msgstr "ErrorLog syslog" ++ ++# type: Plain text ++#: cupsd.conf.man.in:277 ++msgid "Specifies the error log filename." ++msgstr "Définir le nom du fichier traçant les erreurs." ++ ++# type: TP ++#: cupsd.conf.man.in:277 ++#, no-wrap ++msgid "FileDevice Yes" ++msgstr "FileDevice Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:279 ++#, no-wrap ++msgid "FileDevice No" ++msgstr "FileDevice No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:284 ++msgid "" ++"Specifies whether the file pseudo-device can be used for new printer queues." ++msgstr "" ++"Indiquer si un fichier de pseudo-périphérique peut être utilisé pour les " ++"queues d'impression." ++ ++# type: TP ++#: cupsd.conf.man.in:284 ++#, no-wrap ++msgid "FilterLimit limit" ++msgstr "FilterLimit limite" ++ ++# type: Plain text ++#: cupsd.conf.man.in:288 ++msgid "Specifies the maximum cost of filters that are run concurrently." ++msgstr "Définir le coût maximum des filtres lancés simultanément." ++ ++# type: TP ++#: cupsd.conf.man.in:288 ++#, no-wrap ++msgid "FilterNice nice-value" ++msgstr "FilterNice priorité" ++ ++# type: Plain text ++#: cupsd.conf.man.in:293 ++msgid "" ++"Specifies the scheduling priority (\"nice\" value) of filters that are run " ++"to print a job." ++msgstr "" ++"Définir la priorité (valeur «\\ nice\\ ») des filtres exécutés pour une " ++"impression." ++ ++# type: TP ++#: cupsd.conf.man.in:293 ++#, no-wrap ++msgid "FontPath directory[:directory:...]" ++msgstr "FontPath répertoire[:répertoire:...]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:297 ++msgid "Specifies the search path for fonts." ++msgstr "Définir le chemin de recherche des polices." ++ ++# type: TP ++#: cupsd.conf.man.in:297 ++#, no-wrap ++msgid "Group group-name-or-number" ++msgstr "Group nom_groupe-ou-identifiant_numérique" ++ ++# type: Plain text ++#: cupsd.conf.man.in:302 ++msgid "" ++"Specifies the group name or ID that will be used when executing external " ++"programs." ++msgstr "" ++"Définir le nom du groupe ou l'identifiant numérique du groupe qui sera " ++"utilisé lors de l'exécution de programmes externes." ++ ++# type: TP ++#: cupsd.conf.man.in:302 ++#, no-wrap ++msgid "HideImplicitMembers Yes" ++msgstr "HideImplicitMembers Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:304 ++#, no-wrap ++msgid "HideImplicitMembers No" ++msgstr "HideImplicitMembers No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:308 ++msgid "Specifies whether to hide members of implicit classes." ++msgstr "Définir s'il faut cacher ou non les membres des classes implicites." ++ ++# type: TP ++#: cupsd.conf.man.in:308 ++#, no-wrap ++msgid "HostNameLookups On" ++msgstr "HostNameLookups On" ++ ++# type: TP ++#: cupsd.conf.man.in:310 ++#, no-wrap ++msgid "HostNameLookups Off" ++msgstr "HostNameLookups Off" ++ ++# type: TP ++#: cupsd.conf.man.in:312 ++#, no-wrap ++msgid "HostNameLookups Double" ++msgstr "HostNameLookups Double" ++ ++# type: Plain text ++#: cupsd.conf.man.in:316 ++msgid "Specifies whether or not to do reverse lookups on client addresses." ++msgstr "" ++"Définir s'il faut effectuer des recherches de noms à partir des adresses des " ++"clients." ++ ++# type: TP ++#: cupsd.conf.man.in:316 ++#, no-wrap ++msgid "ImplicitAnyClasses Yes" ++msgstr "ImplicitAnyClasses Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:318 ++#, no-wrap ++msgid "ImplicitAnyClasses No" ++msgstr "ImplicitAnyClasses No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:324 ++msgid "" ++"Specifies whether or not to create implicit classes for local and remote " ++"printers, e.g. \"AnyPrinter\" from \"Printer\", \"Printer@server1\", and " ++"\"Printer@server2\"." ++msgstr "" ++"Indiquer s'il faut créer des classes implicites pour les imprimantes locales " ++"et distantes (par exemple « UneImprimante » pour « Imprimante », " ++"« Imprimante@serveur1 » et « Imprimante@serveur2 »)." ++ ++# type: TP ++#: cupsd.conf.man.in:324 ++#, no-wrap ++msgid "ImplicitClasses Yes" ++msgstr "ImplicitClasses Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:326 ++#, no-wrap ++msgid "ImplicitClasses No" ++msgstr "ImplicitClasses No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:331 ++msgid "" ++"Specifies whether or not to create implicit classes from identical remote " ++"printers." ++msgstr "" ++"Indiquer s'il faut créer une classe implicite pour les imprimantes distantes " ++"identiques." ++ ++# type: TP ++#: cupsd.conf.man.in:331 ++#, no-wrap ++msgid "Include filename" ++msgstr "Include fichier" ++ ++# type: Plain text ++#: cupsd.conf.man.in:335 ++msgid "Includes the named file." ++msgstr "Inclure le fichier donné." ++ ++# type: TP ++#: cupsd.conf.man.in:335 ++#, no-wrap ++msgid "JobRetryInterval seconds" ++msgstr "JobRetryInterval secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:339 ++msgid "Specifies the interval between retries of jobs in seconds." ++msgstr "" ++"Indiquer l'intervalle entre deux essais d'impression d'un travail, en " ++"secondes." ++ ++# type: TP ++#: cupsd.conf.man.in:339 ++#, no-wrap ++msgid "JobRetryLimit count" ++msgstr "JobRetryLimit nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:343 ++msgid "Specifies the number of retries that are done for jobs." ++msgstr "Indiquer le nombre d'essais maximum pour les travaux." ++ ++# type: TP ++#: cupsd.conf.man.in:343 ++#, no-wrap ++msgid "KeepAlive Yes" ++msgstr "KeepAlive Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:345 ++#, no-wrap ++msgid "KeepAlive No" ++msgstr "KeepAlive No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:349 ++msgid "Specifies whether to support HTTP keep-alive connections." ++msgstr "Définir s'il faut utiliser HTTP-Keep-Alive." ++ ++# type: TP ++#: cupsd.conf.man.in:349 ++#, no-wrap ++msgid "KeepAliveTimeout seconds" ++msgstr "KeepAliveTimeout secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:353 ++msgid "Specifies the amount of time that connections are kept alive." ++msgstr "Définir la durée pendant laquelle les connexion sont conservées." ++ ++# type: TP ++#: cupsd.conf.man.in:353 ++#, no-wrap ++msgid "Krb5Keytab filename" ++msgstr "Krb5Keytab fichier" ++ ++# type: Plain text ++#: cupsd.conf.man.in:357 ++msgid "Overrides the Kerberos key tab location." ++msgstr "Changer l'emplacement du fichier de clés (« key tab ») Kerberos." ++ ++# type: TP ++#: cupsd.conf.man.in:357 ++#, no-wrap ++msgid "E<lt>Limit operationsE<gt> ... E<lt>/LimitE<gt>" ++msgstr "E<lt>Limit operationsE<gt> ... E<lt>/LimitE<gt>" ++ ++# type: Plain text ++#: cupsd.conf.man.in:361 ++msgid "Specifies the IPP operations that are being limited inside a policy." ++msgstr "Indiquer les opérations IPP non autorisés dans une certaine politique." ++ ++# type: TP ++#: cupsd.conf.man.in:361 ++#, no-wrap ++msgid "E<lt>Limit methodsE<gt> ... E<lt>/LimitE<gt>" ++msgstr "E<lt>Limit methodesE<gt> ... E<lt>/LimitE<gt>" ++ ++# type: TP ++#: cupsd.conf.man.in:363 ++#, no-wrap ++msgid "E<lt>LimitExcept methodsE<gt> ... E<lt>/LimitExceptE<gt>" ++msgstr "E<lt>LimitExcept methodesE<gt> ... E<lt>/LimitExceptE<gt>" ++ ++# type: Plain text ++#: cupsd.conf.man.in:367 ++msgid "Specifies the HTTP methods that are being limited inside a location." ++msgstr "Définir les méthodes HTTP interdites pour un lieu donné." ++ ++# type: TP ++#: cupsd.conf.man.in:367 ++#, no-wrap ++msgid "LimitRequestBody" ++msgstr "LimitRequestBody" ++ ++# type: Plain text ++#: cupsd.conf.man.in:371 ++msgid "Specifies the maximum size of any print job request." ++msgstr "Définir la taille maximale des demandes de travaux d'impression." ++ ++# type: TP ++#: cupsd.conf.man.in:371 ++#, no-wrap ++msgid "Listen ip-address:port" ++msgstr "Listen adress_ip:port" ++ ++# type: TP ++#: cupsd.conf.man.in:373 ++#, no-wrap ++msgid "Listen *:port" ++msgstr "Listen *:port" ++ ++# type: TP ++#: cupsd.conf.man.in:375 ++#, no-wrap ++msgid "Listen /path/to/domain/socket" ++msgstr "Listen /chemin/socket/domaine" ++ ++# type: Plain text ++#: cupsd.conf.man.in:379 ++msgid "Listens to the specified address and port or domain socket path." ++msgstr "" ++"Écouter à l'adresse et au port indiqué ou sur la socket de domaine dont le " ++"chemin est indiqué." ++ ++# type: TP ++#: cupsd.conf.man.in:379 ++#, no-wrap ++msgid "E<lt>Location /pathE<gt> ... E<lt>/LocationE<gt>" ++msgstr "E<lt>Location /cheminE<gt> ... E<lt>/LocationE<gt>" ++ ++# type: Plain text ++#: cupsd.conf.man.in:383 ++msgid "Specifies access control for the named location." ++msgstr "Définir les contrôles d'accès pour un lieu donné." ++ ++# type: TP ++#: cupsd.conf.man.in:383 ++#, no-wrap ++msgid "LogFilePerm mode" ++msgstr "LogFilePerm mode" ++ ++# type: Plain text ++#: cupsd.conf.man.in:387 ++msgid "Specifies the permissions for all log files that the scheduler writes." ++msgstr "" ++"Définir les permissions des fichiers journaux écrits par l'ordonnanceur." ++ ++# type: TP ++#: cupsd.conf.man.in:387 ++#, no-wrap ++msgid "LogLevel alert" ++msgstr "LogLevel alert" ++ ++# type: TP ++#: cupsd.conf.man.in:389 ++#, no-wrap ++msgid "LogLevel crit" ++msgstr "LogLevel crit" ++ ++# type: TP ++#: cupsd.conf.man.in:391 ++#, no-wrap ++msgid "LogLevel debug2" ++msgstr "LogLevel debug2" ++ ++# type: TP ++#: cupsd.conf.man.in:393 ++#, no-wrap ++msgid "LogLevel debug" ++msgstr "LogLevel debug" ++ ++# type: TP ++#: cupsd.conf.man.in:395 ++#, no-wrap ++msgid "LogLevel emerg" ++msgstr "LogLevel emerg" ++ ++# type: TP ++#: cupsd.conf.man.in:397 ++#, no-wrap ++msgid "LogLevel error" ++msgstr "LogLevel error" ++ ++# type: TP ++#: cupsd.conf.man.in:399 ++#, no-wrap ++msgid "LogLevel info" ++msgstr "LogLevel info" ++ ++# type: TP ++#: cupsd.conf.man.in:401 ++#, no-wrap ++msgid "LogLevel none" ++msgstr "LogLevel none" ++ ++# type: TP ++#: cupsd.conf.man.in:403 ++#, no-wrap ++msgid "LogLevel notice" ++msgstr "LogLevel notice" ++ ++# type: TP ++#: cupsd.conf.man.in:405 ++#, no-wrap ++msgid "LogLevel warn" ++msgstr "LogLevel warn" ++ ++# type: Plain text ++#: cupsd.conf.man.in:409 ++msgid "Specifies the logging level for the ErrorLog file." ++msgstr "Définir le niveau de trace pour le journal des erreurs." ++ ++# type: TP ++#: cupsd.conf.man.in:409 ++#, no-wrap ++msgid "MaxClients number" ++msgstr "MaxClients nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:413 ++msgid "Specifies the maximum number of simultaneous clients to support." ++msgstr "Définir le nombre maximum de clients simultanés." ++ ++# type: TP ++#: cupsd.conf.man.in:413 ++#, no-wrap ++msgid "MaxClientsPerHost number" ++msgstr "MaxClientsPerHost nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:418 ++msgid "" ++"Specifies the maximum number of simultaneous clients to support from a " ++"single address." ++msgstr "" ++"Définir le nombre maximum de clients simultanés provenant de la même adresse." ++ ++# type: TP ++#: cupsd.conf.man.in:418 ++#, no-wrap ++msgid "MaxCopies number" ++msgstr "MaxCopies nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:422 ++msgid "" ++"Specifies the maximum number of copies that a user can print of each job." ++msgstr "" ++"Définir le nombre maximum de copies qu'un utilisateur peut effectuer pour un " ++"travail d'impression." ++ ++# type: TP ++#: cupsd.conf.man.in:422 ++#, no-wrap ++msgid "MaxJobs number" ++msgstr "MaxJobs nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:426 ++msgid "Specifies the maximum number of simultaneous jobs to support." ++msgstr "Définir le nombre maximum de travaux simultanés." ++ ++# type: TP ++#: cupsd.conf.man.in:426 ++#, no-wrap ++msgid "MaxJobsPerPrinter number" ++msgstr "MaxJobsPerPrinter nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:430 ++msgid "" ++"Specifies the maximum number of simultaneous jobs per printer to support." ++msgstr "Définir le nombre maximum de travaux simultanés par imprimante." ++ ++# type: TP ++#: cupsd.conf.man.in:430 ++#, no-wrap ++msgid "MaxJobsPerUser number" ++msgstr "MaxJobsPerUser nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:434 ++msgid "Specifies the maximum number of simultaneous jobs per user to support." ++msgstr "Définir le nombre maximum de travaux simultanés par utilisateur." ++ ++# type: TP ++#: cupsd.conf.man.in:434 ++#, no-wrap ++msgid "MaxLogSize number-bytes" ++msgstr "MaxLogSize nombre_octets" ++ ++# type: Plain text ++#: cupsd.conf.man.in:439 ++msgid "" ++"Specifies the maximum size of the log files before they are rotated (0 to " ++"disable rotation)" ++msgstr "" ++"Définir la taille maximale des fichiers de trace. Au-delà de cette taille, " ++"les fichiers sont recyclés (0 pour supprimer la rotation des fichiers." ++ ++# type: TP ++#: cupsd.conf.man.in:439 ++#, no-wrap ++msgid "MaxRequestSize number-bytes" ++msgstr "MaxRequestSize nombre_octets" ++ ++# type: Plain text ++#: cupsd.conf.man.in:443 ++msgid "Specifies the maximum request/file size in bytes (0 for no limit)" ++msgstr "" ++"Définir la taille maximale des fichiers et des requêtes à imprimer. La " ++"taille est exprimée en octets (0 indique qu'il n'y a pas de limite)." ++ ++# type: TP ++#: cupsd.conf.man.in:443 ++#, no-wrap ++msgid "Order allow,deny" ++msgstr "Order allow,deny" ++ ++# type: TP ++#: cupsd.conf.man.in:445 ++#, no-wrap ++msgid "Order deny,allow" ++msgstr "Order deny,allow" ++ ++# type: Plain text ++#: cupsd.conf.man.in:449 ++msgid "Specifies the order of HTTP access control (allow,deny or deny,allow)" ++msgstr "" ++"Définir l'ordre pour le contrôle d'accès HTTP (allow,deny ou deny,allow)." ++ ++# type: TP ++#: cupsd.conf.man.in:449 ++#, no-wrap ++msgid "PageLog filename" ++msgstr "PageLog fichier" ++ ++# type: TP ++#: cupsd.conf.man.in:451 ++#, no-wrap ++msgid "PageLog syslog" ++msgstr "PageLog syslog" ++ ++# type: Plain text ++#: cupsd.conf.man.in:455 ++msgid "Specifies the page log filename." ++msgstr "Définir le fichier de trace des pages web visitées." ++ ++# type: TP ++#: cupsd.conf.man.in:455 ++#, no-wrap ++msgid "PassEnv variable [... variable]" ++msgstr "PassEnv variable [... variable]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:459 ++msgid "Passes the specified environment variable(s) to child processes." ++msgstr "Passer les variables d'environnement spécifiées aux processus fils." ++ ++# type: TP ++#: cupsd.conf.man.in:459 ++#, no-wrap ++msgid "E<lt>Policy nameE<gt> ... E<lt>/PolicyE<gt>" ++msgstr "E<lt>Policy nomE<gt> ... E<lt>/PolicyE<gt>" ++ ++# type: Plain text ++#: cupsd.conf.man.in:463 ++msgid "Specifies access control for the named policy." ++msgstr "Définir les contrôles d'accès pour la politique donnée." ++ ++# type: TP ++#: cupsd.conf.man.in:463 ++#, no-wrap ++msgid "Port number" ++msgstr "Port nombre" ++ ++# type: Plain text ++#: cupsd.conf.man.in:467 ++msgid "Specifies a port number to listen to for HTTP requests." ++msgstr "Définir le numéro du port où écouter les requêtes HTTP." ++ ++# type: TP ++#: cupsd.conf.man.in:467 ++#, no-wrap ++msgid "PreserveJobFiles Yes" ++msgstr "PreserveJobFiles Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:469 ++#, no-wrap ++msgid "PreserveJobFiles No" ++msgstr "PreserveJobFiles No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:473 ++msgid "Specifies whether or not to preserve job files after they are printed." ++msgstr "" ++"Définir s'il faut conserver ou non les fichiers de travail après impression." ++ ++# type: TP ++#: cupsd.conf.man.in:473 ++#, no-wrap ++msgid "PreserveJobHistory Yes" ++msgstr "PreserveJobHistory Yes" ++ ++# type: TP ++#: cupsd.conf.man.in:475 ++#, no-wrap ++msgid "PreserveJobHistory No" ++msgstr "PreserveJobHistory No" ++ ++# type: Plain text ++#: cupsd.conf.man.in:480 ++msgid "" ++"Specifies whether or not to preserve the job history after they are printed." ++msgstr "" ++"Définir s'il faut conserver ou non l'historique des demandes d'impression " ++"une fois qu'elles sont terminées." ++ ++# type: TP ++#: cupsd.conf.man.in:480 ++#, no-wrap ++msgid "Printcap" ++msgstr "Printcap" ++ ++# type: TP ++#: cupsd.conf.man.in:482 ++#, no-wrap ++msgid "Printcap filename" ++msgstr "Printcap fichier" ++ ++# type: Plain text ++#: cupsd.conf.man.in:489 ++msgid "" ++"Specifies the filename for a printcap file that is updated automatically " ++"with a list of available printers (needed for legacy applications); " ++"specifying Printcap with no filename disables printcap generation." ++msgstr "" ++"Définir l'emplacement du fichier printcap, contenant la liste des " ++"imprimantes disponibles, et qui est mis à jour automatiquement. Ce fichier " ++"est indispensable aux applications classiques. Si aucun fichier printcap " ++"n'est précisé, la génération du fichier printcap sera désactivée." ++ ++# type: TP ++#: cupsd.conf.man.in:489 ++#, no-wrap ++msgid "PrintcapFormat bsd" ++msgstr "PrintcapFormat bsd" ++ ++# type: TP ++#: cupsd.conf.man.in:491 ++#, no-wrap ++msgid "PrintcapFormat solaris" ++msgstr "PrintcapFormat solaris" ++ ++# type: Plain text ++#: cupsd.conf.man.in:495 ++msgid "Specifies the format of the printcap file." ++msgstr "Définir le format du fichier printcap." ++ ++# type: TP ++#: cupsd.conf.man.in:495 ++#, no-wrap ++msgid "PrintcapGUI" ++msgstr "PrintcapGUI" ++ ++# type: TP ++#: cupsd.conf.man.in:497 ++#, no-wrap ++msgid "PrintcapGUI gui-program-filename" ++msgstr "PrintcapGUI fichier_interface_graphique" ++ ++# type: Plain text ++#: cupsd.conf.man.in:503 ++msgid "" ++"Specifies whether to generate option panel definition files on some " ++"operating systems. When provided with no program filename, disables option " ++"panel definition files." ++msgstr "" ++"Définir s'il faut générer des fichiers de définition d'options pour des " ++"systèmes d'exploitation. Quand c'est fournit sans nom de fichier d'un " ++"programme, il n'y a pas de fichier de définition d'options." ++ ++# type: TP ++#: cupsd.conf.man.in:503 ++#, no-wrap ++msgid "ReloadTimeout seconds" ++msgstr "ReloadTimeout secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:508 ++msgid "" ++"Specifies the amount of time to wait for job completion before restarting " ++"the scheduler." ++msgstr "" ++"Définir le temps maximum à attendre pour la fin d'un travail avant de " ++"redémarrer l'ordonnanceur." ++ ++# type: TP ++#: cupsd.conf.man.in:508 ++#, no-wrap ++msgid "RemoteRoot user-name" ++msgstr "RemoteRoot utilisateur" ++ ++# type: Plain text ++#: cupsd.conf.man.in:513 ++msgid "" ++"Specifies the username that is associated with unauthenticated root accesses." ++msgstr "Définir l'utilisateur associé aux accès root non identifié." ++ ++# type: TP ++#: cupsd.conf.man.in:513 ++#, no-wrap ++msgid "RequestRoot directory" ++msgstr "RequestRoot répertoire" ++ ++# type: Plain text ++#: cupsd.conf.man.in:518 ++msgid "" ++"Specifies the directory to store print jobs and other HTTP request data." ++msgstr "" ++"Définir le répertoire où sont stockés les travaux et les données des " ++"requêtes HTTP." ++ ++# type: TP ++#: cupsd.conf.man.in:518 ++#, no-wrap ++msgid "Require group group-name-list" ++msgstr "Require group liste_groupes" ++ ++# type: TP ++#: cupsd.conf.man.in:520 ++#, no-wrap ++msgid "Require user user-name-list" ++msgstr "Require user liste_utilisateurs" ++ ++# type: TP ++#: cupsd.conf.man.in:522 ++#, no-wrap ++msgid "Require valid-user" ++msgstr "Require valid-user" ++ ++# type: Plain text ++#: cupsd.conf.man.in:526 ++msgid "Specifies that user or group authentication is required." ++msgstr "" ++"Indiquer qu'une identification par utilisateur ou par groupe est nécessaire." ++ ++# type: TP ++#: cupsd.conf.man.in:526 ++#, no-wrap ++msgid "RIPCache bytes" ++msgstr "RIPCache octets" ++ ++# type: Plain text ++#: cupsd.conf.man.in:531 ++msgid "" ++"Specifies the maximum amount of memory to use when converting images and " ++"PostScript files to bitmaps for a printer." ++msgstr "" ++"Définir la taille maximale de mémoire à utiliser lors de la conversion " ++"d'images ou de fichiers PostScript en fichier bitmap pour une imprimante." ++ ++# type: TP ++#: cupsd.conf.man.in:531 ++#, no-wrap ++msgid "Satisfy all" ++msgstr "Satisfy all" ++ ++# type: TP ++#: cupsd.conf.man.in:533 ++#, no-wrap ++msgid "Satisfy any" ++msgstr "Satisfy any" ++ ++# type: Plain text ++#: cupsd.conf.man.in:538 ++msgid "" ++"Specifies whether all or any limits set for a Location must be satisfied to " ++"allow access." ++msgstr "" ++"Définir si toutes les limites (« all »), ou seulement une des limites " ++"(« any ») définies pour un lieu donné doivent être satisfaites pour permettre " ++"l'accès." ++ ++# type: TP ++#: cupsd.conf.man.in:538 ++#, no-wrap ++msgid "ServerAdmin user@domain.com" ++msgstr "ServerAdmin utilisateur@domaine.com" ++ ++# type: Plain text ++#: cupsd.conf.man.in:542 ++msgid "Specifies the email address of the server administrator." ++msgstr "Définir l'adresse électronique de l'administrateur du serveur." ++ ++# type: TP ++#: cupsd.conf.man.in:542 ++#, no-wrap ++msgid "ServerBin directory" ++msgstr "ServerBin répertoire" ++ ++# type: Plain text ++#: cupsd.conf.man.in:547 ++msgid "" ++"Specifies the directory where backends, CGIs, daemons, and filters may be " ++"found." ++msgstr "" ++"Définir le répertoire où les applications dorsales, les CGI, les démons et " ++"les filtres sont stockés." ++ ++# type: TP ++#: cupsd.conf.man.in:547 ++#, no-wrap ++msgid "ServerCertificate filename" ++msgstr "ServerCertificate fichier" ++ ++# type: Plain text ++#: cupsd.conf.man.in:551 ++msgid "Specifies the encryption certificate to use." ++msgstr "Définir le certificat à utiliser pour le chiffrement." ++ ++# type: TP ++#: cupsd.conf.man.in:551 ++#, no-wrap ++msgid "ServerKey filename" ++msgstr "ServerKey fichier" ++ ++# type: Plain text ++#: cupsd.conf.man.in:555 ++msgid "Specifies the encryption key to use." ++msgstr "Définir la clé de chiffrement à utiliser." ++ ++# type: TP ++#: cupsd.conf.man.in:555 ++#, no-wrap ++msgid "ServerName hostname-or-ip-address" ++msgstr "ServerName hôte-ou-adresse_ip" ++ ++# type: Plain text ++#: cupsd.conf.man.in:559 ++msgid "Specifies the fully-qualified hostname of the server." ++msgstr "Définir le nom complet du serveur." ++ ++# type: TP ++#: cupsd.conf.man.in:559 ++#, no-wrap ++msgid "ServerRoot directory" ++msgstr "ServerRoot répertoire" ++ ++# type: Plain text ++#: cupsd.conf.man.in:563 ++msgid "" ++"Specifies the directory where the server configuration files can be found." ++msgstr "" ++"Définir le répertoire où les fichiers de configuration du serveur sont " ++"stockés." ++ ++# type: TP ++#: cupsd.conf.man.in:563 ++#, no-wrap ++msgid "ServerTokens Full" ++msgstr "ServerTokens Full" ++ ++# type: TP ++#: cupsd.conf.man.in:565 ++#, no-wrap ++msgid "ServerTokens Major" ++msgstr "ServerTokens Major" ++ ++# type: TP ++#: cupsd.conf.man.in:567 ++#, no-wrap ++msgid "ServerTokens Minimal" ++msgstr "ServerTokens Minimal" ++ ++# type: TP ++#: cupsd.conf.man.in:569 ++#, no-wrap ++msgid "ServerTokens Minor" ++msgstr "ServerTokens Minor" ++ ++# type: TP ++#: cupsd.conf.man.in:571 ++#, no-wrap ++msgid "ServerTokens None" ++msgstr "ServerTokens None" ++ ++# type: TP ++#: cupsd.conf.man.in:573 ++#, no-wrap ++msgid "ServerTokens OS" ++msgstr "ServerTokens OS" ++ ++# type: TP ++#: cupsd.conf.man.in:575 ++#, no-wrap ++msgid "ServerTokens ProductOnly" ++msgstr "ServerTokens ProductOnly" ++ ++# type: Plain text ++#: cupsd.conf.man.in:580 ++msgid "" ++"Specifies what information is included in the Server header of HTTP " ++"responses." ++msgstr "" ++"Indiquer quelles informations sont disponibles dans l'entête des réponses du " ++"serveur HTTP." ++ ++# type: TP ++#: cupsd.conf.man.in:580 ++#, no-wrap ++msgid "SetEnv variable value" ++msgstr "SetEnv variable valeur" ++ ++# type: Plain text ++#: cupsd.conf.man.in:584 ++msgid "Set the specified environment variable to be passed to child processes." ++msgstr "Fixer les varaibles d'environnement à passer aux processus fils." ++ ++# type: TP ++#: cupsd.conf.man.in:584 ++#, no-wrap ++msgid "SSLListen" ++msgstr "SSLListen" ++ ++# type: Plain text ++#: cupsd.conf.man.in:588 ++msgid "Listens on the specified address and port for encrypted connections." ++msgstr "" ++"Écouter à l'adresse et au port indiqués pour les connexions sécurisées." ++ ++# type: TP ++#: cupsd.conf.man.in:588 ++#, no-wrap ++msgid "SSLPort" ++msgstr "SSLPort" ++ ++# type: Plain text ++#: cupsd.conf.man.in:592 ++msgid "Listens on the specified port for encrypted connections." ++msgstr "Écouter sur le port indiqué pour les connexions sécurisées." ++ ++# type: TP ++#: cupsd.conf.man.in:592 ++#, no-wrap ++msgid "SystemGroup group-name [group-name ...]" ++msgstr "SystemGroup groupe [groupe ...]" ++ ++# type: Plain text ++#: cupsd.conf.man.in:596 ++msgid "Specifies the group(s) to use for System class authentication." ++msgstr "Définir le(s) groupe(s) à utiliser pour les identifications système." ++ ++# type: TP ++#: cupsd.conf.man.in:596 ++#, no-wrap ++msgid "TempDir directory" ++msgstr "TempDir répertoire" ++ ++# type: Plain text ++#: cupsd.conf.man.in:600 ++msgid "Specifies the directory where temporary files are stored." ++msgstr "Définir le répertoire où les fichiers temporaires sont stockés." ++ ++# type: TP ++#: cupsd.conf.man.in:600 ++#, no-wrap ++msgid "Timeout seconds" ++msgstr "Timeout secondes" ++ ++# type: Plain text ++#: cupsd.conf.man.in:604 ++msgid "Specifies the HTTP request timeout in seconds." ++msgstr "Définir le timeout des requêtes HTTP (en secondes)." ++ ++# type: TP ++#: cupsd.conf.man.in:604 ++#, no-wrap ++msgid "User user-name" ++msgstr "User utilisateur" ++ ++# type: Plain text ++#: cupsd.conf.man.in:608 ++msgid "" ++"Specifies the user name or ID that is used when running external programs." ++msgstr "" ++"Définir le nom ou l'identifiant de l'utilisateur utilisé lors du lancement " ++"de programmes externes." ++ ++# type: Plain text ++#: cupsd.conf.man.in:612 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<mime.convs(5)>, I<mime.types(5)>, " ++"I<printers.conf(5)>, I<subscriptions.conf(5)>," ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<mime.convs>(5), B<mime.types>(5), " ++"B<printers.conf>(5), B<subscriptions.conf>(5)," ++ ++# type: TH ++#: cups-deviced.man.in:15 ++#, no-wrap ++msgid "cups-deviced" ++msgstr "cups-deviced" ++ ++# type: Plain text ++#: cups-deviced.man.in:18 ++msgid "cups-deviced - cups device daemon" ++msgstr "cups-deviced - Démon de périphériques CUPS." ++ ++# type: Plain text ++#: cups-deviced.man.in:21 ++msgid "B<cups-deviced> I<request-id limit user-id options>" ++msgstr "B<cups-deviced> I<id_requête limite id_utilisateur options>" ++ ++# type: Plain text ++#: cups-deviced.man.in:36 ++msgid "" ++"I<cups-deviced> polls the backends in I<@CUPS_SERVERBIN@/backend> for a list " ++"of available devices. It is run by I<cupsd(8)> in response to a I<CUPS-Get-" ++"Devices> request. The output format is an IPP response message. The " ++"I<request-id> argument is the request ID from the original IPP request, " ++"typically 1. The I<limit> argument is the limit value from the original IPP " ++"request - 0 means no limit. The I<user-id> argument is the requesting-user-" ++"name value from the original IPP request. Finally, the I<options> argument " ++"is a space-delimited list of attributes (\"name=value name=value ...\") that " ++"were passed in with the request. Currently I<cups-deviced> looks for the " ++"I<requested-attributes> attribute and tailors the output accordingly." ++msgstr "" ++"B<cups-deviced> interroge régulièrement les dorsaux de I<@CUPS_SERVERBIN@/" ++"backend> pour avoir la liste des périphériques disponibles. Il est exécuté " ++"par B<cups>(8) suite à une requête I<CUPS-Get-Devices>. Le format de sortie " ++"est un message de réponse IPP. Le paramètre I<request-id> correspond à " ++"l'identifiant de la requête IPP initiale, typiquement 1. Le paramètre " ++"I<limite> est la valeur limite de la requête initiale, 0 signifiant qu'il " ++"n'y a pas de limite. Le paramètre I<user-id> est la valeur requesting-user-" ++"name (utilisateur demandeur) de la requête initiale. Enfin, le paramètre " ++"I<options> est une liste d'attributs séparés par des espaces (« nom=valeur " ++"nom=valeur ») qui étaient passés à la requête. Actuellement, B<cups-deviced> " ++"utilise les attributs I<requested-attributes> pour construire la sortie en " ++"conséquence." ++ ++# type: Plain text ++#: cups-deviced.man.in:38 ++msgid "backend(7), cupsd(8), cupsd.conf(5)," ++msgstr "B<backend>(7), B<cupsd>(8), B<cupsd.conf>(5)," ++ ++# type: TH ++#: cupsd.man.in:15 ++#, no-wrap ++msgid "cupsd" ++msgstr "cupsd" ++ ++# type: Plain text ++#: cupsd.man.in:18 ++msgid "cupsd - common unix printing system daemon" ++msgstr "cupsd - démon Common Unix Printing System." ++ ++# type: Plain text ++#: cupsd.man.in:23 ++msgid "B<cupsd> [ -c I<config-file> ] [ -f ] [ -F ] [ -h ] [ -l ]" ++msgstr "B<cupsd> [ -c I<fichier_configuration> ] [ -f ] [ -F ] [ -h ] [ -l ]" ++ ++# type: Plain text ++#: cupsd.man.in:29 ++msgid "" ++"I<cupsd> is the scheduler for the Common UNIX Printing System. It implements " ++"a printing system based upon the Internet Printing Protocol, version 1.1. " ++"If no options are specified on the command-line then the default " ++"configuration file I<@CUPS_SERVERROOT@/cupsd.conf> will be used." ++msgstr "" ++"B<cupsd> est un ordonanceur pour le système Common UNIX Printing System. Il " ++"fournit des outils pour un système d'impression de base sur le Internet " ++"Printing Protocol, version 1.1. Si aucune option n'est spécifiée sur la " ++"ligne de commande, alors le fichier de configuration par défaut " ++"I<@CUPS_SERVERROOT@/cupsd.conf> sera utilisé." ++ ++# type: TP ++#: cupsd.man.in:30 cupsfilter.man:38 ++#, no-wrap ++msgid "-c config-file" ++msgstr "B<-c> I<fichier_configuration>" ++ ++# type: Plain text ++#: cupsd.man.in:34 ++msgid "Uses the named configuration file." ++msgstr "Utiliser le fichier de configuration donné." ++ ++# type: TP ++#: cupsd.man.in:34 ++#, no-wrap ++msgid "-f" ++msgstr "B<-f>" ++ ++# type: Plain text ++#: cupsd.man.in:39 ++msgid "" ++"Run I<cupsd> in the foreground; the default is to run in the background as a " ++"\"daemon\"." ++msgstr "" ++"Forcer B<cupsd> à tourner au premier plan ; par défaut, cupsd tourne en " ++"arrière-plan comme « démon »." ++ ++# type: TP ++#: cupsd.man.in:39 ++#, no-wrap ++msgid "-F" ++msgstr "B<-F>" ++ ++# type: Plain text ++#: cupsd.man.in:45 ++msgid "" ++"Run I<cupsd> in the foreground but detach the process from the controlling " ++"terminal and current directory. This is useful for running I<cupsd> from " ++"I<init(8)>." ++msgstr "" ++"Forcer B<cupsd> à tourner en avant-plan, mais détache le processus du " ++"terminal et du répertoire de travail. Cette option est utile pour lancer " ++"B<cupsd> depuis B<init>(8)." ++ ++# type: TP ++#: cupsd.man.in:45 lpr.man:71 ++#, no-wrap ++msgid "-h" ++msgstr "B<-h>" ++ ++# type: Plain text ++#: cupsd.man.in:49 ++msgid "Shows the program usage." ++msgstr "Afficher un message d'aide." ++ ++# type: TP ++#: cupsd.man.in:49 lpinfo.man:51 lpoptions.man.in:84 lpq.man:59 lpr.man:76 ++#: lpstat.man:83 ++#, no-wrap ++msgid "-l" ++msgstr "B<-l>" ++ ++# type: Plain text ++#: cupsd.man.in:54 ++msgid "This option is passed to I<cupsd> when it is run from I<launchd(8)>." ++msgstr "" ++"Cette option est passée à B<cupsd> losqu'il est lancé par B<launchd>(8)." ++ ++# type: Plain text ++#: cupsd.man.in:58 ++msgid "" ++"I<cupsd> implements all of the required IPP/1.1 attributes and operations. " ++"It also implements several CUPS-specific administration operations." ++msgstr "" ++"B<cupsd> fournit tous les attributs et opération de IPP/1.1. Il implémente " ++"aussi plusieurs opérations d'administration spécifiques à CUPS." ++ ++# type: Plain text ++#: cupsd.man.in:63 ++msgid "" ++"I<backend(7)>, I<classes.conf(5)>, I<cups-deviced(8)>, I<cups-driverd(8)>, " ++"I<cups-lpd(8)>, I<cups-polld(8)>, I<cupsd.conf(5)>, I<filter(7)>, I<launchd" ++"(8)>, I<mime.convs(5)>, I<mime.types(5)>, I<printers.conf(5)>," ++msgstr "" ++"B<backend>(7), B<classes.conf>(5), B<cups-deviced>(8), B<cups-driverd>(8), " ++"B<cups-lpd>(8), B<cups-polld>(8), B<cupsd.conf>(5), B<filter>(7), B<launchd>" ++"(8), B<mime.convs>(5), B<mime.types>(5), B<printers.conf>(5)," ++ ++# type: TH ++#: cups-driverd.man.in:15 ++#, no-wrap ++msgid "cups-driverd" ++msgstr "cups-driverd" ++ ++# type: Plain text ++#: cups-driverd.man.in:18 ++msgid "cups-driverd - cups driver daemon" ++msgstr "cups-driverd - Démon de pilotes CUPS." ++ ++# type: Plain text ++#: cups-driverd.man.in:22 ++msgid "B<cups-driverd> cat I<ppd-name>" ++msgstr "B<cups-driverd> cat I<nom_ppd>" ++ ++# type: Plain text ++#: cups-driverd.man.in:26 ++msgid "B<cups-driverd> list I<request_id limit options>" ++msgstr "B<cups-driverd> list I<id_requête limite options>" ++ ++# type: Plain text ++#: cups-driverd.man.in:31 ++msgid "" ++"I<cups-driverd> shows or lists PPD files. It is run in response to CUPS-Add-" ++"Modify-Printer or CUPS-Get-Devices requests. The first form (\"cups-driverd " ++"cat ppd-name\") writes the named PPD file to stdout. The output format is an " ++"uncompressed PPD file." ++msgstr "" ++"B<cups-driverd> affiche ou liste les fichiers PPD. Il est exécuté en réponse " ++"à des requêtes CUPS-Add-Modify-Printer ou CUPS-Get-Devices. La première " ++"forme (« cups-driverd cat nom_ppd ») écrit le fichier PPD sur la sortie " ++"standard. Le format de sortie est un fichier PPD non compressé." ++ ++# type: Plain text ++#: cups-driverd.man.in:43 ++msgid "" ++"The second form lists the available manufacturers or PPD files to stdout as " ++"indicated by the I<options> argument. The output format is an IPP response " ++"message. The I<request_id> argument is the request ID from the original IPP " ++"request, typically 1. The I<limit> argument is the limit value from the " ++"original IPP request - 0 means no limit. Finally, the I<options> argument is " ++"a space-delimited list of attributes (\"name=value name=value \\&...\") that " ++"were passed in with the request. Currently I<cups-driverd> looks for the " ++"I<ppd-make> and I<requested-attributes> attributes and tailors the output " ++"accordingly." ++msgstr "" ++"La seconde forme liste les fabricants ou les fichiers PPD disponibles sur la " ++"sortie standard, comme demandé par le paramètre I<options>. Le format de " ++"sortie est un message de réponse IPP. Le paramètre I<request-id> correspond " ++"à l'identifiant de la requête IPP initiale, typiquement 1. Le paramètre " ++"I<limite> est la valeur limite de la requête initiale, 0 signifiant qu'il " ++"n'y a pas de limite. Enfin, le paramètre I<options> est une liste " ++"d'attributs séparés par des espaces (« nom=valeur nom=valeur \\&... ») qui " ++"étaient passés à la requête. Actuellement, B<cups-deviced> utilise les " ++"attributs I<ppd-make> et I<requested-attributes> pour construire la sortie " ++"en conséquence." ++ ++# type: SH ++#: cups-driverd.man.in:43 ++#, no-wrap ++msgid "DRIVERS" ++msgstr "PILOTES" ++ ++# type: Plain text ++#: cups-driverd.man.in:51 ++msgid "" ++"Drivers can be static PPD files under the I<@CUPS_DATADIR@/model> directory " ++"or programs under the I<@CUPS_SERVERBIN@/driver> directory. Static PPD files " ++"must conform to the Adobe PPD File Format Specification version 4.3 and may " ++"be compressed using the I<gzip(1)> program. Driver programs must implement " ++"the command-line interface shown in the next section." ++msgstr "" ++"Les pilotes peuvent être des fichiers PPD dans le répertoire " ++"I<@CUPS_DATADIR@/model> ou des programmes dans le répertoire " ++"I<@CUPS_SERVERBIN@/driver>. Les fichiers PPD statiques doivent se conformer " ++"aux spécifications Adobe du format de fichier PPD, version 4.3, et peuvent " ++"être compressés avec le programme B<gzip>(1). Les programmes de pilotes " ++"doivent gérer l'interface en ligne de commande définie dans la section " ++"suivante." ++ ++# type: SS ++#: cups-driverd.man.in:51 ++#, no-wrap ++msgid "DRIVER PROGRAMS" ++msgstr "PROGRAMMES DE PILOTES" ++ ++# type: Plain text ++#: cups-driverd.man.in:54 ++msgid "" ++"Driver programs provide an interface to dynamically-generated PPD files. The " ++"following arguments are currently defined:" ++msgstr "" ++"Les programmes de pilotes fournissent une interface pour générer " ++"dynamiquement des fichiers PPD. Pour l'instant, les paramètres suivants sont " ++"définis :" ++ ++# type: TP ++#: cups-driverd.man.in:54 ++#, no-wrap ++msgid "drivername list" ++msgstr "drivername list" ++ ++# type: Plain text ++#: cups-driverd.man.in:58 ++msgid "Lists the supported PPD files to stdout." ++msgstr "Liste, sur la sortie standard, les fichiers PPD gérés." ++ ++# type: TP ++#: cups-driverd.man.in:58 ++#, no-wrap ++msgid "drivername cat ppdname" ++msgstr "drivername cat nom_ppd" ++ ++# type: Plain text ++#: cups-driverd.man.in:62 ++msgid "Writes the named PPD file to stdout." ++msgstr "Écrire le fichier PPD indiqué sur la sortie standard." ++ ++# type: SS ++#: cups-driverd.man.in:62 ++#, no-wrap ++msgid "LISTING FILES (drivername list)" ++msgstr "LISTER LES FICHIER (nom_pilote list)" ++ ++# type: Plain text ++#: cups-driverd.man.in:66 ++msgid "" ++"When run with the single argument \"list\", the program must list the " ++"available PPD files it can generate to stdout using the following format:" ++msgstr "" ++"Lorsqu'il est lancé avec l'unique paramètre « list », le programme doit " ++"lister sur la sortie standard les fichiers PPD disponibles qu'il peut " ++"générer, en utilisant le format suivant :" ++ ++# type: Plain text ++#: cups-driverd.man.in:68 ++#, no-wrap ++msgid " \"drivername:ppdname\" language \"make\" \"make and model\" \"1284 device id\"\n" ++msgstr " \"nom_pilote:nom_ppd\" langue \"marque\" \"marque et modèle\" \"1284 id_périphérique\"\n" ++ ++# type: Plain text ++#: cups-driverd.man.in:77 ++msgid "" ++"I<Drivername> is the name of the driver program. I<Ppdname> is the name used " ++"to select the given driver. I<Language> is the locale associated with the " ++"default language of the PPD file, typically \"en\". I<Make> is the " ++"Manufacturer name from the PPD file. I<Make and model> is the NickName name " ++"from the PPD file. I<1284 device id> is the 1284DeviceId from the PPD file, " ++"if any." ++msgstr "" ++"I<nom_pilote> est le nom du programme pilote. I<nom_ppd> est le nom utilisé " ++"pour sélectionner le pilote. I<langue> est la locale associée avec la langue " ++"par défaut du fichier PPD, généralement « en ». I<marque> est le nom du " ++"fabriquant dans le fichier PPD. I<marque et modèle> est le nom du fichier " ++"PPD. I<id_1284_périphérique> est l'identifiant 1284DeviceID du fichier PPD, " ++"s'il y en a un." ++ ++# type: SS ++#: cups-driverd.man.in:77 ++#, no-wrap ++msgid "WRITING FILES (drivername cat ppdname)" ++msgstr "ÉCRIRE LES FICHIER (nom_pilote cat nom_ppd)" ++ ++# type: Plain text ++#: cups-driverd.man.in:82 ++msgid "" ++"When the driver program is run with the \"cat ppdname\" arguments, it must " ++"write the named PPD file to stdout, uncompressed. If the named PPD file does " ++"not exist, the driver program must not write any output to stdout and report " ++"the error to stderr instead." ++msgstr "" ++"QUand le programme pilote est lancé avec les paramètre « cat nom_ppd », il " ++"écrit le fichier PPD demandé, non compressé, sur la sortie standard. Si le " ++"fichier PPD demandé n'existe pas, le programme pilote ne doit rien écrire " ++"sur la sortie standard, mais doit utiliser la sortie d'erreur à la place." ++ ++# type: SS ++#: cups-driverd.man.in:82 ++#, no-wrap ++msgid "DRIVER ERROR MESSAGES" ++msgstr "MESSAGES D'ERREUR DES PILOTES" ++ ++# type: Plain text ++#: cups-driverd.man.in:85 ++msgid "" ++"Error messages can be relayed back to I<cupsd> by writing them to stderr. " ++"The following prefixes are recognized:" ++msgstr "" ++"Les messages d'erreur peuvent être renvoyés à I<cupsd> en les écrivant sur " ++"la sortie standard d'erreur. Les préfix suivants sont reconnus :" ++ ++# type: TP ++#: cups-driverd.man.in:85 ++#, no-wrap ++msgid "DEBUG: [drivername]" ++msgstr "DEBUG: [drivername]" ++ ++# type: Plain text ++#: cups-driverd.man.in:89 ++msgid "Debugging messages" ++msgstr "Mesages de débogage." ++ ++# type: TP ++#: cups-driverd.man.in:89 ++#, no-wrap ++msgid "ERROR: [drivername]" ++msgstr "ERROR: [nom_pilote]" ++ ++# type: Plain text ++#: cups-driverd.man.in:93 ++msgid "Error messages" ++msgstr "Messages d'erreur." ++ ++# type: TP ++#: cups-driverd.man.in:93 ++#, no-wrap ++msgid "INFO: [drivername]" ++msgstr "INFO: [nom_pilote]" ++ ++# type: Plain text ++#: cups-driverd.man.in:97 ++msgid "Informational messages" ++msgstr "Messages d'information." ++ ++# type: Plain text ++#: cups-driverd.man.in:99 ++msgid "cupsd(8), cupsd.conf(5), cupstestppd(1)," ++msgstr "B<cupsd>(8), B<cupsd.conf>(5), B<cupstestppd>(1)," ++ ++# type: TH ++#: cupsenable.man:16 ++#, no-wrap ++msgid "cupsenable" ++msgstr "cupsenable" ++ ++# type: Plain text ++#: cupsenable.man:19 ++msgid "cupsdisable, cupsenable - stop/start printers and classes" ++msgstr "" ++"cupsdisable, cupsenable - Arrêter/démarrer des imprimantes ou classes " ++"d'imprimantes." ++ ++# type: Plain text ++#: cupsenable.man:28 ++msgid "" ++"B<cupsdisable> [ -E ] [-U I<username> ] [ -c ] [ -h I<server[:port]> ] [ -r " ++"I<reason> ] destination(s)" ++msgstr "" ++"B<cupsdisable> [ -E ] [-U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] " ++"[ -r I<raison> ] destination(s)" ++ ++# type: Plain text ++#: cupsenable.man:35 ++msgid "" ++"B<cupsenable> [ -E ] [-U I<username> ] [ -c ] [ -h I<server[:port]> ] " ++"destination(s)" ++msgstr "" ++"B<cupsenable> [ -E ] [-U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] " ++"destination(s)" ++ ++# type: Plain text ++#: cupsenable.man:37 ++msgid "I<cupsenable> starts the named printers or classes." ++msgstr "B<cupsenable> démarre l'imprimante ou la classe d'imprimante indiquée." ++ ++# type: Plain text ++#: cupsenable.man:40 ++msgid "" ++"I<cupsdisable> stops the named printers or classes. The following options " ++"may be used:" ++msgstr "" ++"B<cupsdisable> arrête l'imprimante ou la classe d'imprimante indiquée. Les " ++"options suivantes peuvent être utilisées :" ++ ++# type: Plain text ++#: cupsenable.man:44 ++msgid "Forces encryption of the connection to the server." ++msgstr "Forcer le chiffrement de la connexion au serveur." ++ ++# type: Plain text ++#: cupsenable.man:48 ++msgid "Uses the specified username when connecting to the server." ++msgstr "utiliser l'utilisateur indiqué pour les connexions au serveur." ++ ++# type: TP ++#: cupsenable.man:48 lp.man:80 ++#, no-wrap ++msgid "-c" ++msgstr "B<-c>" ++ ++# type: Plain text ++#: cupsenable.man:52 ++msgid "Cancels all jobs on the named destination." ++msgstr "Annuler tous les travaux sur la destination donnée." ++ ++# type: TP ++#: cupsenable.man:52 lpinfo.man:47 lpmove.man:54 lpoptions.man.in:80 ++#: lpq.man:55 lprm.man:49 lpstat.man:79 ++#, no-wrap ++msgid "-h server[:port]" ++msgstr "B<-h> I<serveur[:port]>" ++ ++# type: Plain text ++#: cupsenable.man:56 ++msgid "Uses the specified server and port." ++msgstr "Utiliser le serveur et le port indiqués." ++ ++# type: Plain text ++#: cupsenable.man:61 ++msgid "" ++"Sets the message associated with the stopped state. If no reason is " ++"specified then the message is set to \"Reason Unknown\"." ++msgstr "" ++"Configurer le message associé avec l'état arrêté. Si aucune raison n'est " ++"spécifiée, alors le message sera « Reason Unknown » (« Raison Inconnue »)." ++ ++# type: Plain text ++#: cupsenable.man:69 ++msgid "" ++"The System V versions of these commands are I<disable> and I<enable>. They " ++"have been renamed to avoid conflicts with the I<bash(1)> build-in command of " ++"the same name." ++msgstr "" ++"Les version System V de ces commandes sont B<disable> et B<enable>. Elles " ++"ont été renommées pour éviter les conflits avec les commandes internes de " ++"B<bash>(1) du même nom." ++ ++# type: Plain text ++#: cupsenable.man:74 ++msgid "" ++"The CUPS versions of I<disable> and I<enable> may ask the user for an access " ++"password depending on the printing system configuration. This differs from " ++"the System V versions which require the root user to execute these commands." ++msgstr "" ++"Les versions CUPS de B<disable> et B<enable> peuvent demander à " ++"l'utilisateur de s'identifier suivant la configuration du système " ++"d'impression, à la différence des versions System V, qui demandent le mot de " ++"passe root pour exécuter ces commande." ++ ++# type: Plain text ++#: cupsenable.man:77 ++msgid "I<accept(8)>, I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpstat(1)>," ++msgstr "B<accept>(8), B<cancel>(1), B<lp>(1), B<lpadmin>(8), B<lpstat>(1)," ++ ++# type: TP ++#: cupsfilter.man:14 ++#, no-wrap ++msgid "cupsfilter" ++msgstr "cupsfilter" ++ ++# type: TH ++#: cupsfilter.man:14 ++#, no-wrap ++msgid "19 October 2007" ++msgstr "19 octobre 2007" ++ ++# type: Plain text ++#: cupsfilter.man:17 ++msgid "cupsfilter - convert a file to another format using cups filters" ++msgstr "" ++"cupsfilter - Convertir un fichier vers un autre format en utilisant les " ++"filtres CUPS" ++ ++# type: Plain text ++#: cupsfilter.man:33 ++msgid "" ++"B<cupsfilter> [ -c I<config-file> ] [ -m I<mime/type> ] [ -n I<copies> ] [ -" ++"o I<name=value> ] [ -p I<filename.ppd> ] [ -t I<title> ] I<filename>" ++msgstr "" ++"B<cupsfilter> [ -c I<fichier_configuration> ] [ -m I<type/mime> ] [ -n " ++"I<copies> ] [ -o I<nom=valeur> ] [ -p I<fichier.ppd> ] [ -t I<titre> ] " ++"I<fichier>" ++ ++# type: Plain text ++#: cupsfilter.man:37 ++msgid "" ++"I<cupsfilter> is a front-end to the CUPS filter subsystem which allows you " ++"to convert a file to a specific format, just as if you had printed the file " ++"through CUPS. By default, I<cupsfilter> generates a PDF file." ++msgstr "" ++"B<cupsfilter> est une interface pour le système de filtres de CUPS qui vous " ++"permet de convertir un fichier dans un format spécific, comme si vous aviez " ++"imprimé le fichier avec CUPS. Par défaut, B<cupsfilter> génère un fichier " ++"PDF." ++ ++# type: Plain text ++#: cupsfilter.man:42 ++msgid "Uses the named cupsd.conf configuration file." ++msgstr "Utiliser le fichier de configuration cupsd.conf donné." ++ ++# type: TH ++#: cupsfilter.man:42 ++#, no-wrap ++msgid "-m mime/type" ++msgstr "B<-m> I<type/mime>" ++ ++# type: Plain text ++#: cupsfilter.man:46 ++msgid "" ++"Specifies the destination file type. The default file type is application/" ++"pdf." ++msgstr "" ++"Indiquer le type du fichier de destination. La valeur par défaut est " ++"application/pdf." ++ ++# type: TP ++#: cupsfilter.man:46 lp.man:104 ++#, no-wrap ++msgid "-n copies" ++msgstr "B<-n> I<copies>" ++ ++# type: Plain text ++#: cupsfilter.man:50 ++msgid "Specifies the number of copies to generate." ++msgstr "Indiquer le nombre de copies à créer." ++ ++# type: TP ++#: cupsfilter.man:50 cups-lpd.man.in:67 lpadmin.man:105 ++#, no-wrap ++msgid "-o name=value" ++msgstr "B<-o> I<nom=valeur>" ++ ++# type: Plain text ++#: cupsfilter.man:54 ++msgid "Specifies options to pass to the CUPS filters." ++msgstr "Indiquer les options à fournir aux filtres CUPS." ++ ++# type: TP ++#: cupsfilter.man:54 ++#, no-wrap ++msgid "-p filename.ppd" ++msgstr "B<-p> I<fichier.ppd>" ++ ++# type: Plain text ++#: cupsfilter.man:58 ++msgid "Specifies the PPD file to use." ++msgstr "Définir le fichier PPD à utiliser." ++ ++# type: TP ++#: cupsfilter.man:58 ++#, no-wrap ++msgid "-t title" ++msgstr "B<-t> I<titre>" ++ ++# type: Plain text ++#: cupsfilter.man:62 ++msgid "Specifies the document title." ++msgstr "Définir le titre du document." ++ ++# type: Plain text ++#: cupsfilter.man:65 ++msgid "" ++"I<cupsfilter> currently does not use the filters defined in the PPD file. " ++"This will be addressed in a future CUPS release." ++msgstr "" ++"B<cupsaddsmb> n'utilise pas pour l'instant les filtres définis dans le " ++"fichier PPD. Ces filtres eronts gérés dans une version future de CUPS." ++ ++# type: TH ++#: cupsfilter.man:67 ++msgid "I<cupsd.conf(5)>" ++msgstr "B<cupsd.conf>(5)" ++ ++# type: TH ++#: cups-lpd.man.in:15 ++#, no-wrap ++msgid "cups-lpd" ++msgstr "cups-lpd" ++ ++# type: TH ++#: cups-lpd.man.in:15 ++#, no-wrap ++msgid "24 April 2006" ++msgstr "24 avril 2006" ++ ++# type: Plain text ++#: cups-lpd.man.in:18 ++msgid "cups-lpd - receive print jobs and report printer status to lpd clients" ++msgstr "" ++"cups-lpd - Recevoir les travaux d'impression et renvoyer l'état des " ++"imprimantes aux clients lpd." ++ ++# type: Plain text ++#: cups-lpd.man.in:23 ++msgid "B<cups-lpd> [ -n ] [ -o I<option=value> ]" ++msgstr "B<cups-lpd> [ -n ] [ -o I<option=valeur> ]" ++ ++# type: Plain text ++#: cups-lpd.man.in:31 ++msgid "" ++"I<cups-lpd> is the CUPS Line Printer Daemon (\"LPD\") mini-server that " ++"supports legacy client systems that use the LPD protocol. I<cups-lpd> does " ++"not act as a standalone network daemon but instead operates using the " ++"Internet \"super-server\" I<inetd(8)> or I<xinetd(8)>. If you are using " ++"I<inetd>, add the following line to the I<inetd.conf> file to enable the " ++"I<cups-lpd> mini-server:" ++msgstr "" ++"B<cups-lpd> est le mini serveur Line Printer Daemon (« LPD ») de CUPS, qui " ++"gère les client classiques utilisant le protocole LPD. B<cups-lpd> ne " ++"fonctionne pas lui-même comme un démon réseau, mais utilise le super-serveur " ++"B<inetd>(8). Si vous utilisez B<inetd>, ajoutez la ligne suivante au fichier " ++"I<inetd.conf> pour activer le démon B<cups-lpd> :" ++ ++# type: Plain text ++#: cups-lpd.man.in:36 ++#, no-wrap ++msgid "" ++" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" ++" -o document-format=application/octet-stream\n" ++msgstr "" ++" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" ++" -o document-format=application/octet-stream\n" ++ ++# type: Plain text ++#: cups-lpd.man.in:42 ++msgid "" ++"B<Note:> If you are using Solaris 10 or higher, you must run the I<inetdconv" ++"(1m)> program to register the changes to the inetd.conf file." ++msgstr "" ++"B<Remarque :> si vous utilisez Solaris 10 ou une version ultérieure, vous " ++"devez exécuter B<inetdconv>(1m) pour enregistrer les changements apportés au " ++"fichier I<inetd.conf>." ++ ++# type: Plain text ++#: cups-lpd.man.in:45 ++msgid "" ++"If you are using the newer I<xinetd(8)> daemon, create a file named I</etc/" ++"xinetd.d/cups> containing the following lines:" ++msgstr "" ++"Si vous utilisez le démon plus récent I<xinetd>(8), créez le fichier I</etc/" ++"xinetd.d/cups> contenant les lignes suivantes :" ++ ++# type: Plain text ++#: cups-lpd.man.in:59 ++#, no-wrap ++msgid "" ++" service printer\n" ++" {\n" ++" socket_type = stream\n" ++" protocol = tcp\n" ++" wait = no\n" ++" user = lp\n" ++"\tgroup = sys\n" ++"\tpassenv =\n" ++" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" ++"\tserver_args = -o document-format=application/octet-stream\n" ++" }\n" ++msgstr "" ++" service printer\n" ++" {\n" ++" socket_type = stream\n" ++" protocol = tcp\n" ++" wait = no\n" ++" user = lp\n" ++"\tgroup = sys\n" ++"\tpassenv =\n" ++" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" ++"\tserver_args = -o document-format=application/octet-stream\n" ++" }\n" ++ ++# type: TP ++#: cups-lpd.man.in:61 ++#, no-wrap ++msgid "-n" ++msgstr "B<-n>" ++ ++# type: Plain text ++#: cups-lpd.man.in:67 ++msgid "" ++"Disables reverse address lookups; normally I<cups-lpd> will try to discover " ++"the hostname of the client via a reverse DNS lookup." ++msgstr "" ++"Désactiver la résolution inverse des noms d'hôte ; normalement, B<cups-lpd> " ++"essaie de récupérer le nom d'hôte à l'aide d'une requête DNS inverse." ++ ++# type: Plain text ++#: cups-lpd.man.in:75 ++msgid "" ++"Inserts options for all print queues. Most often this is used to disable the " ++"\"l\" filter so that remote print jobs are filtered as needed for printing; " ++"the examples in the previous section set the \"document-format\" option to " ++"\"application/octet-stream\" which forces autodetection of the print file " ++"format." ++msgstr "" ++"Insérer des options pour toutes les queues d'impression. Le plus souvent, " ++"c'est utilisé pour désactiver le filtre « l » pour que les travaux distants " ++"soient également filtrés correctement ; les exemples des sections " ++"précédentes fixent l'option « document-format » à « application/octet-" ++"stream », ce qui force l'autodétection du format des fichiers à imprimer." ++ ++# type: SH ++#: cups-lpd.man.in:75 ++#, no-wrap ++msgid "PERFORMANCE" ++msgstr "PERFORMANCE" ++ ++# type: Plain text ++#: cups-lpd.man.in:82 ++msgid "" ++"I<cups-lpd> performs well with small numbers of clients and printers. " ++"However, since a new process is created for each connection and since each " ++"process must query the printing system before each job submission, it does " ++"not scale to larger configurations. We highly recommend that large " ++"configurations use the native IPP support provided by CUPS instead." ++msgstr "" ++"Les performances de B<cups-lpd> sont correctes avec un petit nombre de " ++"clients et d'imprimantes. Cependant, comme un nouveau processus est créé " ++"pour chaque connexion et comme chaque processus doit interroger le système " ++"d'impression avant chaque soumission d'un travail d'impression, ça ne " ++"s'étend pas facilement à des configurations plus importantes. Nous " ++"recommandons d'utiliser la gestion du protocole IPP native dans CUPS pour " ++"les configurations importantes." ++ ++# type: SH ++#: cups-lpd.man.in:82 ++#, no-wrap ++msgid "SECURITY" ++msgstr "SÉCURITÉ" ++ ++# type: Plain text ++#: cups-lpd.man.in:89 ++msgid "" ++"I<cups-lpd> currently does not perform any access control based on the " ++"settings in I<cupsd.conf(5)> or in the I<hosts.allow(5)> or I<hosts.deny(5)> " ++"files used by TCP wrappers. Therefore, running I<cups-lpd> on your server " ++"will allow any computer on your network (and perhaps the entire Internet) to " ++"print to your server." ++msgstr "" ++"B<cups-lpd> n'applique pour le moment aucun des contrôles d'accès définis " ++"dans les fichiers B<cupsd.conf>(5), B<hosts.allow>(5) ou B<hosts.deny>(5) " ++"utilisés par les wrappers TCP. L'exécution de B<cups-lpd> sur un serveur " ++"permet donc le lancement d'impressions depuis n'importe quel ordinateur de " ++"votre réseau, voire même de n'importe quel ordinateur sur Internet." ++ ++# type: Plain text ++#: cups-lpd.man.in:94 ++msgid "" ++"While I<xinetd> has built-in access control support, you should use the TCP " ++"wrappers package with I<inetd> to limit access to only those computers that " ++"should be able to print through your server." ++msgstr "" ++"Bien que I<xinetd> possède un contrôle d'accès intégré, il est recommandé " ++"d'utiliser le wrapper TCP fourni avec I<inetd> pour limiter les accès aux " ++"seuls ordinateurs autorisés à lancer des impressions sur le serveur." ++ ++# type: Plain text ++#: cups-lpd.man.in:98 ++msgid "" ++"I<cups-lpd> is not enabled by the standard CUPS distribution. Please " ++"consult with your operating system vendor to determine whether it is enabled " ++"on your system." ++msgstr "" ++"B<cups-lpd> n'est pas activé dans la distribution standard de CUPS. Veuillez " ++"consulter votre distributeur de système d'exploitation pour savoir s'il est " ++"activé sur votre système." ++ ++# type: Plain text ++#: cups-lpd.man.in:104 ++msgid "" ++"I<cups-lpd> does not enforce the restricted source port number specified in " ++"RFC 1179, as using restricted ports does not prevent users from submitting " ++"print jobs. While this behavior is different than standard Berkeley LPD " ++"implementations, it should not affect normal client operations." ++msgstr "" ++"B<cups-lpd> ne se conforme pas à la RFC 1179 concernant l'utilisation des " ++"ports systèmes (1 à 1\\|024), car l'utilisation de ces ports n'empêche pas " ++"un utilisateur d'envoyer un travail d'impression. Bien que ce comportement " ++"soit différent de celui des implémentations LPD Berkeley, il ne devrait pas " ++"affecter le déroulement correct des impressions." ++ ++# type: Plain text ++#: cups-lpd.man.in:109 ++msgid "" ++"The output of the status requests follows RFC 2569, Mapping between LPD and " ++"IPP Protocols. Since many LPD implementations stray from this definition, " ++"remote status reporting to LPD clients may be unreliable." ++msgstr "" ++"Le format de sortie des demandes d'état se conforme à la RFC 2569, Mapping " ++"between LPD and IPP Protocols. Comme bon nombre d'implémentations LPD ne " ++"suivent pas cette définition, la récupération d'état par un client LPD peut " ++"être erronée." ++ ++# type: Plain text ++#: cups-lpd.man.in:112 ++msgid "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," ++msgstr "B<cups>(1), B<cupsd>(8), B<inetconv>(1m), B<inetd>(8), B<xinetd>(8)," ++ ++# type: TH ++#: cups-polld.man:15 ++#, no-wrap ++msgid "cups-polld" ++msgstr "cups-polld" ++ ++# type: Plain text ++#: cups-polld.man:18 ++msgid "cups-polld - cups printer polling daemon" ++msgstr "cups-polld - Démon d'interrogation des imprimantes CUPS." ++ ++# type: Plain text ++#: cups-polld.man:21 ++msgid "B<cups-polld> I<address ipp-port interval browse-port>" ++msgstr "B<cups-polld> I<adresse port-ipp intervalle port-de-navigation>" ++ ++# type: Plain text ++#: cups-polld.man:27 ++msgid "" ++"I<cups-polld> polls remote servers for a list of available printers and " ++"printer classes every I<interval> seconds. Printer and class information is " ++"then broadcast to the localhost interface (127.0.0.1) on the specified " ++"browse port for reception by I<cupsd(8)>." ++msgstr "" ++"B<cups-polld> interroge des serveurs distants afin d'obtenir la liste des " ++"imprimantes et classes d'imprimantes disponibles toutes les I<intervalle> " ++"secondes. Les informations sont alors renvoyées vers l'interface locale " ++"(127.0.0.1) et le port de navigation spécifié pour être récupérées par " ++"B<cupsd>(8)." ++ ++# type: Plain text ++#: cups-polld.man:30 ++msgid "" ++"This program is started automatically by I<cupsd> for every I<BrowsePoll> " ++"directive found in the I<cupsd.conf(5)> file." ++msgstr "" ++"Ce programme est démarré automatiquement par B<cupsd> pour chaque directive " ++"« BrowsePoll » trouvée dans le fichier B<cupsd.conf>(5)." ++ ++# type: Plain text ++#: cups-polld.man:32 ++msgid "I<cupsd(8)>, I<cupsd.conf(5)>," ++msgstr "B<cupsd>(8), B<cupsd.conf>(5)," ++ ++# type: TH ++#: cups-snmp.conf.man:15 ++#, no-wrap ++msgid "snmp.conf" ++msgstr "snmp.conf" ++ ++# type: TH ++#: cups-snmp.conf.man:15 ++#, no-wrap ++msgid "31 July 2006" ++msgstr "31 juillet 2006" ++ ++# type: Plain text ++#: cups-snmp.conf.man:18 ++msgid "snmp.conf - snmp configuration file for cups" ++msgstr "snmp.conf - Fichier de configuration SNMP pour CUPS" ++ ++# type: Plain text ++#: cups-snmp.conf.man:24 ++msgid "" ++"The I<snmp.conf> file configures the CUPS SNMP printer discovery backend and " ++"is normally located in the I</etc/cups> directory. Each line in the file can " ++"be a configuration directive, a blank line, or a comment. Comment lines " ++"start with the # character." ++msgstr "" ++"Le fichier I<snmp.conf> configure le service SNMP de découverte des " ++"imprimantes de CUPS et se trouve normalement dans le répertoire I</etc/" ++"cups>. Chaque ligne du fichier est une directive de configuration, une ligne " ++"vide ou un commentaire. Les commentaires commencent par le symbole #." ++ ++# type: Plain text ++#: cups-snmp.conf.man:30 ++msgid "" ++"The SNMP backend uses the SNMPv1 protocol to discover network printers, " ++"collecting information from the Host MIB along with intelligent port probes " ++"to determine the correct device URI and make and model for each printer. " ++"Future versions of CUPS will likely support the new Port Monitor MIB as well." ++msgstr "" ++"La gestion du SNMP utilise le protocol SNMPv1 pour découvrir les imprimantes " ++"réseau, récupérer les information à partir de la MIB de l'hôte en plus de " ++"sondes de ports pour déterminer l'URI correcte du périphérique, la marque et " ++"le modèle pour chacune des imprimantes. Les versions futures de CUPS " ++"géreront probablement également la nouvelle MIB « Port Monitor »." ++ ++# type: Plain text ++#: cups-snmp.conf.man:33 ++msgid "" ++"The following directives are understood by the SNMP backend. Consult the on-" ++"line help for detailed descriptions:" ++msgstr "" ++"Les directives suivantes sont comprises par le service SNMP. Veuillez vous " ++"reporter à l'aide en ligne pour une description plus détaillée." ++ ++# type: TP ++#: cups-snmp.conf.man:33 ++#, no-wrap ++msgid "Address @IF(I<name>)" ++msgstr "Address @IF(I<nom>)" ++ ++# type: TP ++#: cups-snmp.conf.man:35 ++#, no-wrap ++msgid "Address @LOCAL" ++msgstr "Address @LOCAL" ++ ++# type: TP ++#: cups-snmp.conf.man:37 ++#, no-wrap ++msgid "Address I<address>" ++msgstr "Address I<adresse>" ++ ++# type: Plain text ++#: cups-snmp.conf.man:43 ++msgid "" ++"Sends SNMP broadcast queries to the specified address(es). The default " ++"address is \"@LOCAL\" which broadcasts to all LAN interfaces." ++msgstr "" ++"Envoyer les reqête SNMP de broadcast à (aux) adresse(s) indiquée(s). Par " ++"défaut, l'adresse est « @LOCAL », ce qui signifie que les requêtes sont " ++"envoyées sur les interfaces LAN." ++ ++# type: TP ++#: cups-snmp.conf.man:43 ++#, no-wrap ++msgid "Community I<name>" ++msgstr "Community I<nom>" ++ ++# type: Plain text ++#: cups-snmp.conf.man:48 ++msgid "" ++"Specifies a SNMP community to query. The default community is \"public\"." ++msgstr "" ++"Spécifier la communauté SNMP à interroger. La communauté par défaut est " ++"« public »." ++ ++# type: TP ++#: cups-snmp.conf.man:48 ++#, no-wrap ++msgid "DebugLevel I<N>" ++msgstr "DebugLevel I<N>" ++ ++# type: Plain text ++#: cups-snmp.conf.man:54 ++msgid "" ++"Sets the debug logging level to I<N>; 0 disables debug logging, 1 enables " ++"basic logging, 2 displays SNMP values, and 3 displays raw hex data." ++msgstr "" ++"Fixer le niveau de débogage enregistré dans les journaux à I<N> ; 0 désative " ++"l'enregistrement des informations pour le débogage, 1 active un " ++"enregistrement basique, 2 affiche les valeurs SNMP et 3 affiche les données " ++"brutes hexadécimales." ++ ++# type: TP ++#: cups-snmp.conf.man:54 ++#, no-wrap ++msgid "HostNameLookups on" ++msgstr "HostNameLookups on" ++ ++# type: TP ++#: cups-snmp.conf.man:56 ++#, no-wrap ++msgid "HostNameLookups off" ++msgstr "HostNameLookups off" ++ ++# type: Plain text ++#: cups-snmp.conf.man:62 ++msgid "" ++"Specifies whether the addresses of printers should be converted to hostnames " ++"or left as numeric IP addresses. The default is \"off\"." ++msgstr "" ++"Définir si les adresses des imprimantes doivent être convertie en nom " ++"d'hôtes ou doivent être laissées en adresses IP numérique. La valeur par " ++"défaut est « off »." ++ ++# type: TP ++#: cups-snmp.conf.man:62 ++#, no-wrap ++msgid "MaxRunTime I<seconds>" ++msgstr "MaxRunTime I<secondes>" ++ ++# type: Plain text ++#: cups-snmp.conf.man:67 ++msgid "" ++"Specifies the maximum number of seconds that the SNMP backend will scan the " ++"network for printers." ++msgstr "" ++"Spécifier le nombre maximal de secondes entre les requêtes du dorsal SNMP " ++"pour la découverte des imprimantes réseau." ++ ++# type: TH ++#: cupstestdsc.man:15 ++#, no-wrap ++msgid "cupstestdsc" ++msgstr "cupstestdsc" ++ ++# type: Plain text ++#: cupstestdsc.man:18 ++msgid "cupstestdsc - test conformance of postscript files" ++msgstr "cupstestppd - Tester la conformité des fichiers postscript." ++ ++# type: Plain text ++#: cupstestdsc.man:23 ++msgid "B<cupstestdsc> [ -h ] filename.ps [ ... I<filenameN.ps> ]" ++msgstr "B<cupstestdsc> [ -h ] I<fichier.ps> [ ... I<fichierN.ps> ]" ++ ++# type: Plain text ++#: cupstestdsc.man:26 ++msgid "B<cupstestdsc> [ -h ] -" ++msgstr "B<cupstestdsc> [ -h ] -" ++ ++# type: Plain text ++#: cupstestdsc.man:32 ++msgid "" ++"I<cupstestdsc> tests the conformance of PostScript files to the Adobe " ++"PostScript Language Document Structuring Conventions Specification version " ++"3.0. The results of testing and any other output are sent to the standard " ++"output. The second form of the command reads PostScript from the standard " ++"input." ++msgstr "" ++"B<cupstestdsc> teste la conformité de fichiers PostScript envers la " ++"spécification de format de fichier édictée par Adobe, « Adobe PostScript " ++"Language Document Structuring Conventions Specification » dans sa version " ++"3.0. Les résultats des tests et autres sorties sont envoyés sur la sortie " ++"standard. La seconde forme de la commande lit l'entrée PostScript depuis " ++"l'entrée standard." ++ ++# type: SH ++#: cupstestdsc.man:32 lpadmin.man:195 lpc.man:53 ++#, no-wrap ++msgid "LIMITATIONS" ++msgstr "LIMITATIONS" ++ ++# type: Plain text ++#: cupstestdsc.man:41 ++msgid "" ++"I<cupstestdsc> only validates the DSC comments in a PostScript file and does " ++"not attempt to validate the PostScript code itself. Developers must ensure " ++"that the PostScript they generate follows the rules defined by Adobe. " ++"Specifically, all pages must be independent of each other, code outside page " ++"descriptions may not affect the graphics state (current font, color, " ++"transform matrix, etc.), and device-specific commands such as setpagedevice " ++"should not be used." ++msgstr "" ++"B<cupstestdsc> ne valide que les commentaires DSC du fichier PostScript et " ++"ne cherche pas à valider le code PostScript lui-même. Les développeurs " ++"doivent s'assurer que le PostScript qu'ils génèrent est conforme aux règles " ++"définies par Adobe. En particulier, toutes les pages doivent être " ++"indépendantes les unes des autres, le code en dehors des descriptions des " ++"pages ne doit pas affecter l'état des graphiques (police, couleur, matrices " ++"de transformations en cours, etc.) et les commandes spécifiques à certains " ++"périphériques ne doivent pas être utilisées." ++ ++# type: Plain text ++#: cupstestdsc.man:46 ++msgid "" ++"Adobe PostScript Language Document Structuring Conventions Specification, " ++"Version 3.0." ++msgstr "" ++"Adobe PostScript Language Document Structuring Conventions Specification, " ++"Version 3.0." ++ ++# type: TH ++#: cupstestppd.man:15 ++#, no-wrap ++msgid "cupstestppd" ++msgstr "cupstestppd" ++ ++# type: TH ++#: cupstestppd.man:15 ++#, no-wrap ++msgid "3 May 2007" ++msgstr "3 mai 2007" ++ ++# type: Plain text ++#: cupstestppd.man:18 ++msgid "cupstestppd - test conformance of ppd files" ++msgstr "cupstestppd - Tester la conformité des fichiers PPD." ++ ++# type: Plain text ++#: cupstestppd.man:25 ++msgid "" ++"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] " ++"filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]" ++msgstr "" ++"B<cupstestppd> [ -R I<rép_racine> ] [ -W I<catégorie> ] [ -q ] [-r] [ -v" ++"[v] ] fichier.ppd[.gz] [ ... fichierN.ppd[.gz] ]" ++ ++# type: Plain text ++#: cupstestppd.man:32 ++msgid "" ++"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] -" ++msgstr "" ++"B<cupstestppd> [ -R I<rép_racine> ] [ -W I<catégorie> ] [ -q ] [-r] [ -v" ++"[v] ] -" ++ ++# type: Plain text ++#: cupstestppd.man:38 ++msgid "" ++"I<cupstestppd> tests the conformance of PPD files to the Adobe PostScript " ++"Printer Description file format specification version 4.3. It can also be " ++"used to list the supported options and available fonts in a PPD file. The " ++"results of testing and any other output are sent to the standard output." ++msgstr "" ++"B<cupstestppd> teste la conformité des fichiers PPD envers la spécification " ++"de format de fichier édictée par Adobe, « Adobe PostScript Printer " ++"Description » dans sa version 4.3. Cette commande peut également être " ++"utilisée pour voir la liste des options reconnues et des polices disponibles " ++"d'un fichier PPD. Toutes les sorties sont effectuées sur la sortie standard." ++ ++# type: Plain text ++#: cupstestppd.man:42 ++msgid "" ++"The first form of I<cupstestppd> tests one or more PPD files on the command-" ++"line. The second form tests the PPD file provided on the standard input." ++msgstr "" ++"Le premier mode d'appel de B<cupstestppd> teste un ou plusieurs fichiers PPD " ++"fournis sur la ligne de ommande Le second mode d'appel teste le fichier PPD " ++"fourni sur l'entrée standard." ++ ++# type: Plain text ++#: cupstestppd.man:44 ++msgid "I<cupstestppd> supports the following options:" ++msgstr "B<cupstestppd> gère les options suivantes :" ++ ++# type: TP ++#: cupstestppd.man:44 ++#, no-wrap ++msgid "-R rootdir" ++msgstr "B<-R> I<rép_racine>" ++ ++# NOTE: support file checks? ++# type: Plain text ++#: cupstestppd.man:49 ++msgid "" ++"Specifies an alternate root directory for the filter, pre-filter, and other " ++"support file checks." ++msgstr "" ++"Définir un autre répertoire racine pour les filtres, pré-filtres et autres " ++"fichiers de vérification." ++ ++# type: TP ++#: cupstestppd.man:49 ++#, no-wrap ++msgid "-W constraints" ++msgstr "B<-W> I<constraints>" ++ ++# type: Plain text ++#: cupstestppd.man:53 ++msgid "Report all UIConstraint errors as warnings." ++msgstr "Remonter toutes les erreurs UIConstraint comme des avertissements." ++ ++# type: TP ++#: cupstestppd.man:53 ++#, no-wrap ++msgid "-W defaults" ++msgstr "B<-W> I<defaults>" ++ ++# type: Plain text ++#: cupstestppd.man:57 ++msgid "" ++"Except for size-related options, report all default option errors as " ++"warnings." ++msgstr "" ++"À l'exception des options liées à la taille, remonter toutes les erreurs sur " ++"les valeurs par défaut comme des avertissements." ++ ++# type: TP ++#: cupstestppd.man:57 ++#, no-wrap ++msgid "-W filters" ++msgstr "B<-W> I<filters>" ++ ++# type: Plain text ++#: cupstestppd.man:61 ++msgid "Report all filter errors as warnings." ++msgstr "Remonter toutes les erreurs sur les filtres comme des avertissements." ++ ++# type: TP ++#: cupstestppd.man:61 ++#, no-wrap ++msgid "-W translations" ++msgstr "B<-W> I<translations>" ++ ++# type: Plain text ++#: cupstestppd.man:65 ++msgid "Report all translation errors as warnings." ++msgstr "Remonter toutes les erreurs de conversion comme des avertissements." ++ ++# type: TP ++#: cupstestppd.man:65 ++#, no-wrap ++msgid "-W all" ++msgstr "B<-W> I<all>" ++ ++# type: Plain text ++#: cupstestppd.man:69 ++msgid "Report all of the previous errors as warnings." ++msgstr "Remonter toutes les erreurs précédentes comme des avertissements." ++ ++# type: TP ++#: cupstestppd.man:69 ++#, no-wrap ++msgid "-W none" ++msgstr "B<-W> I<none>" ++ ++# type: Plain text ++#: cupstestppd.man:73 ++msgid "Report all of the previous errors as errors." ++msgstr "Remonter toutes les erreurs précédentes comme des erreurs." ++ ++# type: TP ++#: cupstestppd.man:73 lpr.man:97 ++#, no-wrap ++msgid "-q" ++msgstr "B<-q>" ++ ++# type: Plain text ++#: cupstestppd.man:77 ++msgid "Specifies that no information should be displayed." ++msgstr "N'afficher aucune information." ++ ++# type: TP ++#: cupstestppd.man:77 lpr.man:101 lpstat.man:97 ++#, no-wrap ++msgid "-r" ++msgstr "B<-r>" ++ ++# type: Plain text ++#: cupstestppd.man:83 ++msgid "" ++"Relaxes the PPD conformance requirements so that common whitespace, control " ++"character, and formatting problems are not treated as hard errors." ++msgstr "" ++"Réduire les exigences de conformité des PPD de telle sorte que les espaces " ++"communes, les caractères de contrôle et les problèmes de format ne soient " ++"pas traités comme des erreurs fatales." ++ ++# type: Plain text ++#: cupstestppd.man:88 ++msgid "" ++"Specifies that detailed conformance testing results should be displayed " ++"rather than the concise PASS/FAIL/ERROR status." ++msgstr "" ++"Demander l'affichage des résultats détaillés des tests de conformité au lieu " ++"des états concis PASS/FAIL/ERROR." ++ ++# type: TP ++#: cupstestppd.man:88 ++#, no-wrap ++msgid "-vv" ++msgstr "B<-vv>" ++ ++# type: Plain text ++#: cupstestppd.man:94 ++msgid "" ++"Specifies that all information in the PPD file should be displayed in " ++"addition to the detailed conformance testing results." ++msgstr "" ++"Afficher toutes les informations d'un fichier PPD en plus des résultats " ++"détaillés des tests de conformité." ++ ++# type: Plain text ++#: cupstestppd.man:96 ++msgid "The I<-q>, I<-v>, and I<-vv> options are mutually exclusive." ++msgstr "Les options B<-q>, B<-v> et B<-vv> sont mutuellement exclusives." ++ ++# type: SH ++#: cupstestppd.man:96 ++#, no-wrap ++msgid "EXIT STATUS" ++msgstr "CODE DE RETOUR" ++ ++# type: Plain text ++#: cupstestppd.man:99 ++msgid "" ++"I<cupstestppd> returns zero on success and non-zero on error. The error " ++"codes are as follows:" ++msgstr "" ++"B<cupstestppd> renvoie 0 en cas de réussite aux tests et une valeur " ++"différente de 0 en cas d'échec. Les codes d'erreur sont les suivants :" ++ ++# type: TP ++#: cupstestppd.man:99 ++#, no-wrap ++msgid "1" ++msgstr "1" ++ ++# type: Plain text ++#: cupstestppd.man:103 ++msgid "Bad command-line arguments or missing PPD filename." ++msgstr "" ++"Paramètres de la ligne de commandes incorrects ou fichier PPD non trouvé." ++ ++# type: TP ++#: cupstestppd.man:103 ++#, no-wrap ++msgid "2" ++msgstr "2" ++ ++# type: Plain text ++#: cupstestppd.man:107 ++msgid "Unable to open or read PPD file." ++msgstr "Impossible d'ouvrir ou de lire le fichier PPD." ++ ++# type: TP ++#: cupstestppd.man:107 ++#, no-wrap ++msgid "3" ++msgstr "3" ++ ++# type: Plain text ++#: cupstestppd.man:111 ++msgid "The PPD file contains format errors that cannot be skipped." ++msgstr "" ++"Le fichier PPD contient des erreurs de format ne pouvant être ignorées." ++ ++# type: TP ++#: cupstestppd.man:111 ++#, no-wrap ++msgid "4" ++msgstr "4" ++ ++# type: Plain text ++#: cupstestppd.man:115 ++msgid "The PPD file does not conform to the Adobe PPD specification." ++msgstr "Le fichier PPD n'est pas conforme à la spécification Adobe." ++ ++# type: Plain text ++#: cupstestppd.man:119 ++msgid "" ++"The following command will test all PPD files under the current directory " ++"and print the names of each file that does not conform:" ++msgstr "" ++"La commande suivante teste tous les fichiers PPD du répertoire courant et " ++"affiche le nom de ceux qui ne sont pas conformes :" ++ ++# type: Plain text ++#: cupstestppd.man:122 ++#, no-wrap ++msgid " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" ++msgstr " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" ++ ++# type: Plain text ++#: cupstestppd.man:127 ++msgid "" ++"The next command tests all PPD files under the current directory and print " ++"detailed conformance testing results for the files that do not conform:" ++msgstr "" ++"La commande suivante teste tous les fichiers PPD du répertoire courant et " ++"affiche les résultats détaillés des tests de conformité pour les fichiers " ++"qui ne sont pas conformes :" ++ ++# type: Plain text ++#: cupstestppd.man:131 ++#, no-wrap ++msgid "" ++" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" ++" -exec cupstestppd -v '{}' \\e;\n" ++msgstr "" ++" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" ++" -exec cupstestppd -v '{}' \\e;\n" ++ ++# type: Plain text ++#: cupstestppd.man:135 lpinfo.man:59 ++msgid "I<lpadmin(8)>," ++msgstr "B<lpadmin>(8)," ++ ++# type: Plain text ++#: cupstestppd.man:139 ++msgid "" ++"Adobe PostScript Printer Description File Format Specification, Version 4.3." ++msgstr "" ++"Adobe PostScript Printer Description File Format Specification, Version 4.3." ++ ++# type: TP ++#: filter.man:15 ++#, no-wrap ++msgid "filter" ++msgstr "filter" ++ ++# type: TH ++#: filter.man:15 ++#, no-wrap ++msgid "6 July 2007" ++msgstr "6 juillet 2007" ++ ++# type: Plain text ++#: filter.man:18 ++msgid "filter - cups file conversion filter interface" ++msgstr "" ++"filter - Interface pour des filtres de conversion de fichiers pour CUPS." ++ ++# type: Plain text ++#: filter.man:23 ++msgid "B<filter> job user title num-copies options [ I<filename> ]" ++msgstr "B<filter> travail utilisateur titre copies options [ I<fichier> ]" ++ ++# type: Plain text ++#: filter.man:28 ++msgid "" ++"The CUPS filter interface provides a standard method for adding support for " ++"new document types to CUPS. Each filter is capable of converting from one or " ++"more input formats to another format that can either be printed directly or " ++"piped into another filter to get it to a printable format." ++msgstr "" ++"Les filtres CUPS offrent la possibilité de gérer avec CUPS des nouveaux " ++"types de documents. Chaque filtre est capable de convertir des fichiers de " ++"différents formats dans un format qui est soit géré directement par CUPS ou " ++"qui peut être envoyé à un autre filtre afin d'être imprimable." ++ ++# type: Plain text ++#: filter.man:33 ++msgid "" ++"Filters B<must> be capable of reading from a filename on the command-line or " ++"from the standard input, copying the standard input to a temporary file as " ++"required by the file format. All output B<must> be sent to the standard " ++"output." ++msgstr "" ++"Les filtres B<doivent> être capables de lire depuis un fichier fournit sur " ++"la ligne de commande ou depuis l'entrée standard, en copiant l'entrée " ++"standard vers un fichier temporaire si nécessaire pour ce format de fichier. " ++"Toutes les sorties B<doivent> être envoyées sur la sortie standard." ++ ++# type: Plain text ++#: filter.man:35 ++msgid "" ++"The command name (argv[0]) is set to the name of the destination printer." ++msgstr "" ++"Le nom de la commande (argv[0]) vaut le nom de l'imprimante de destination." ++ ++# type: SH ++#: filter.man:35 ++#, no-wrap ++msgid "LOG MESSAGES" ++msgstr "MESSAGES JOURNALISÉS" ++ ++# type: Plain text ++#: filter.man:39 ++msgid "" ++"Messages sent to stderr are generally logged to printer-state-message " ++"attribute and the current I<ErrorLog>. Each line begins with a standard " ++"prefix:" ++msgstr "" ++"Les messages envoyés à la sortie d'erreur sont généralement enregistrés dans " ++"l'attribut printer-state-message et dans le journal I<ErrorLog> actuel. " ++"Chaque ligne commence par un préfixe standard :" ++ ++# type: TP ++#: filter.man:40 ++#, no-wrap ++msgid "ALERT: message" ++msgstr "ALERT: message" ++ ++# type: Plain text ++#: filter.man:45 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"alert\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « alert »." ++ ++# type: TP ++#: filter.man:46 ++#, no-wrap ++msgid "ATTR: attribute=value [attribute=value]" ++msgstr "ATTR: attribut=valeur [attribut=valeur]" ++ ++# type: Plain text ++#: filter.man:51 ++msgid "" ++"Sets the named job attribute(s). Typically this will be used to set the job-" ++"remote-id attribute." ++msgstr "" ++"Définir l'attribut (les attributs) donné(s) du travail d'impression. " ++"Typiquement, c'est utilisé pour fixer l'attribut job-remote-id." ++ ++# type: TP ++#: filter.man:52 ++#, no-wrap ++msgid "CRIT: message" ++msgstr "CRIT: message" ++ ++# type: Plain text ++#: filter.man:57 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"critical\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " ++"« critical »." ++ ++# type: TP ++#: filter.man:58 ++#, no-wrap ++msgid "DEBUG: message" ++msgstr "DEBUG: message" ++ ++# type: Plain text ++#: filter.man:63 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"debug\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « debug »." ++ ++# type: TP ++#: filter.man:64 ++#, no-wrap ++msgid "DEBUG2: message" ++msgstr "DEBUG2: message" ++ ++# type: Plain text ++#: filter.man:69 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"debug2\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " ++"« debug2 »." ++ ++# type: TP ++#: filter.man:70 ++#, no-wrap ++msgid "EMERG: message" ++msgstr "EMERG: message" ++ ++# type: Plain text ++#: filter.man:75 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"emergency\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " ++"« emergency »." ++ ++# type: TP ++#: filter.man:76 ++#, no-wrap ++msgid "ERROR: message" ++msgstr "ERROR: message" ++ ++# type: Plain text ++#: filter.man:81 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"error\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « error »." ++ ++# type: TP ++#: filter.man:82 ++#, no-wrap ++msgid "INFO: message" ++msgstr "INFO: message" ++ ++# type: Plain text ++#: filter.man:88 ++msgid "" ++"Sets the printer-state-message attribute. If the current I<LogLevel> is set " ++"to \"debug2\", also adds the specified message to the current I<ErrorLog> " ++"using the \"info\" log level." ++msgstr "" ++"Fixer l'attribut printer-state-message. Si I<LogLevel> vaut « debug2 », le " ++"message est également ajouté au journal I<ErrorLog> en utilisant le niveau " ++"« info »." ++ ++# type: TP ++#: filter.man:89 ++#, no-wrap ++msgid "NOTICE: message" ++msgstr "NOTICE: message" ++ ++# type: Plain text ++#: filter.man:94 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"notice\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " ++"« notice »." ++ ++# type: TP ++#: filter.man:95 ++#, no-wrap ++msgid "PAGE: page-number #-copies" ++msgstr "PAGE: numéro_page #-copies" ++ ++# type: TP ++#: filter.man:97 ++#, no-wrap ++msgid "PAGE: total #-pages" ++msgstr "PAGE: total #-pages" ++ ++# type: Plain text ++#: filter.man:103 ++msgid "" ++"Adds an entry to the current I<PageLog>. The first form adds #-copies to the " ++"job-media-sheets-completed attribute. The second form sets the job-media-" ++"sheets-completed attribute to #-pages." ++msgstr "" ++"Ajouter une entrée au fichier I<PageLog> actuel. La première forme ajoute le " ++"nombre de copies à l'attribut job-media-sheets-completed. La seconde forme " ++"définie l'attribut job-media-sheets-completed au nombre de pages." ++ ++# type: TP ++#: filter.man:104 ++#, no-wrap ++msgid "STATE: printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: raison-état-impimante [raison-état-impimante ...]" ++ ++# type: TP ++#: filter.man:106 ++#, no-wrap ++msgid "STATE: + printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: + raison-état-impimante [raison-état-impimante ...]" ++ ++# type: TP ++#: filter.man:108 ++#, no-wrap ++msgid "STATE: - printer-state-reason [printer-state-reason ...]" ++msgstr "STATE: - raison-état-impimante [raison-état-impimante ...]" ++ ++# type: Plain text ++#: filter.man:114 ++msgid "" ++"Sets, adds, or removes printer-state-reason keywords to the current queue. " ++"Typically this is used to indicate media, ink, and toner conditions on a " ++"printer." ++msgstr "" ++"Définir, ajouter ou retirer des mots clé raison-état-impimante de la file " ++"d'attente en cours. Typiquement c'est utilisé pour indiquer l'état du média, " ++"de l'encre et du toner d'une imprimante." ++ ++# type: TP ++#: filter.man:115 ++#, no-wrap ++msgid "WARNING: message" ++msgstr "WARNING: message" ++ ++# type: Plain text ++#: filter.man:120 ++msgid "" ++"Sets the printer-state-message attribute and adds the specified message to " ++"the current I<ErrorLog> using the \"warning\" log level." ++msgstr "" ++"Définir l'attribut printer-state-message et ajouter le message donné au " ++"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " ++"« warning »." ++ ++# type: SH ++#: filter.man:121 ++#, no-wrap ++msgid "ENVIRONMENT VARIABLES" ++msgstr "VARIABLES D'ENVIRONNEMENT" ++ ++# type: Plain text ++#: filter.man:124 ++msgid "" ++"The following environment variables are defined by the CUPS server when " ++"executing the filter:" ++msgstr "" ++"Les variables d'environnement suivantes sont définies par le serveur CUPS " ++"pour l'exécution des filtres :" ++ ++# type: TP ++#: filter.man:125 ++#, no-wrap ++msgid "CHARSET" ++msgstr "CHARSET" ++ ++# type: Plain text ++#: filter.man:129 ++msgid "The default text character set, typically utf-8." ++msgstr "" ++"Définir le jeu de caractères par défaut à utiliser pour les textes, " ++"typiquement utf-8." ++ ++# type: TP ++#: filter.man:130 ++#, no-wrap ++msgid "CLASS" ++msgstr "CLASS" ++ ++# type: Plain text ++#: filter.man:136 ++msgid "" ++"When a job is submitted to a printer class, contains the name of the " ++"destination printer class. Otherwise this environment variable will not be " ++"set." ++msgstr "" ++"Quand un travail est soumis à une classe d'imprimantes, elle contient le nom " ++"de la classe d'imprimante. Sinon, cette variable d'environnement n'est pas " ++"définie." ++ ++# type: TP ++#: filter.man:137 ++#, no-wrap ++msgid "CONTENT_TYPE" ++msgstr "CONTENT_TYPE" ++ ++# type: Plain text ++#: filter.man:142 ++msgid "The MIME type associated with the file (e.g. application/postscript)." ++msgstr "Le type MIME associé au fichier (par exemple application/postscript)." ++ ++# type: TP ++#: filter.man:143 ++#, no-wrap ++msgid "CUPS_DATADIR" ++msgstr "CUPS_DATADIR" ++ ++# type: Plain text ++#: filter.man:147 ++msgid "The directory where data files can be found." ++msgstr "Le répertoire où se trouvent les fichiers de données." ++ ++# type: TP ++#: filter.man:148 ++#, no-wrap ++msgid "CUPS_SERVERROOT" ++msgstr "CUPS_SERVERROOT" ++ ++# type: Plain text ++#: filter.man:152 ++msgid "The root directory of the server." ++msgstr "Le répertoire racine du serveur." ++ ++# type: TP ++#: filter.man:153 ++#, no-wrap ++msgid "DEVICE_URI" ++msgstr "DEVICE_URI" ++ ++# type: Plain text ++#: filter.man:157 ++msgid "The device-uri associated with the printer." ++msgstr "L'uri du périphérique associé à l'imprimante." ++ ++# type: TP ++#: filter.man:158 ++#, no-wrap ++msgid "FINAL_CONTENT_TYPE" ++msgstr "FINAL_CONTENT_TYPE" ++ ++# type: Plain text ++#: filter.man:163 ++msgid "" ++"The MIME type associated with the printer (e.g. application/vnd.cups-" ++"postscript)." ++msgstr "" ++"Le type MIME associé à l'imprimante (par exemple application/vnd.cups-" ++"postscript)." ++ ++# type: TP ++#: filter.man:164 ++#, no-wrap ++msgid "LANG" ++msgstr "LANG" ++ ++# type: Plain text ++#: filter.man:168 ++msgid "The default language locale (typically C or en)." ++msgstr "La locale de la langue par défaut (généralement C ou en)." ++ ++# type: TP ++#: filter.man:169 ++#, no-wrap ++msgid "PATH" ++msgstr "PATH" ++ ++# type: Plain text ++#: filter.man:174 ++msgid "" ++"The standard execution path for external programs that may be run by the " ++"filter." ++msgstr "" ++"Le chemin d'exécution par défaut pour les programmes externes qui peuvent " ++"être exécutés par le filtre." ++ ++# type: TP ++#: filter.man:175 ++#, no-wrap ++msgid "PPD" ++msgstr "PPD" ++ ++# type: Plain text ++#: filter.man:180 ++msgid "" ++"The full pathname of the PostScript Printer Description (PPD) file for this " ++"printer." ++msgstr "" ++"Le chemin complet vers le fichier PPD (PostScript Printer Description) de " ++"cette imprimante." ++ ++# type: TP ++#: filter.man:181 ++#, no-wrap ++msgid "PRINTER" ++msgstr "PRINTER" ++ ++# type: Plain text ++#: filter.man:185 ++msgid "The name of the printer." ++msgstr "Le nom de l'imprimante." ++ ++# type: TP ++#: filter.man:186 ++#, no-wrap ++msgid "RIP_CACHE" ++msgstr "RIP_CACHE" ++ ++# type: Plain text ++#: filter.man:191 ++msgid "" ++"The recommended amount of memory to use for Raster Image Processors (RIPs)." ++msgstr "" ++"La quantité de mémoire recommandée pour les RIP (Raster Image Processors)." ++ ++# type: TP ++#: filter.man:192 ++#, no-wrap ++msgid "SOFTWARE" ++msgstr "SOFTWARE" ++ ++# type: Plain text ++#: filter.man:196 ++msgid "The name and version number of the server (typically CUPS/1.2)." ++msgstr "Le nom et la version du serveur (par exemple CUPS/1.2)." ++ ++# type: TP ++#: filter.man:197 ++#, no-wrap ++msgid "TZ" ++msgstr "TZ" ++ ++# type: Plain text ++#: filter.man:201 ++msgid "The timezone of the server." ++msgstr "Le fuseau horaire du serveur" ++ ++# type: TP ++#: filter.man:202 ++#, no-wrap ++msgid "USER" ++msgstr "USER" ++ ++# type: Plain text ++#: filter.man:207 ++msgid "" ++"The user executing the filter, typically \"lp\" or \"root\"; consult the " ++"I<cupsd.conf(5)> file for the current setting." ++msgstr "" ++"L'utilisateur qui exécute le filtre, typiquement « lp » ou « root » ; " ++"consultez le fichier B<cupsd.conf>(5) pour le paramétrage courant." ++ ++# type: Plain text ++#: filter.man:213 ++msgid "" ++"While the filter interface is compatible with System V interface scripts, it " ++"will only work with the System V interface script as the only filter. " ++"Typically the interface script will be provided via the I<lpadmin(8)> " ++"command using the I<-i> option." ++msgstr "" ++"Alors que l'interface des filtres est compatible avec l'interface des " ++"scripts Système V, elle ne fonctionnera avec le script d'interface " ++"Système V que comme unique filtre. Typiquement le script d'interface sera " ++"fournit par la commande B<lpadmin>(8) en utilisant l'option B<-i>." ++ ++# type: Plain text ++#: filter.man:215 ++msgid "I<backend(1)>, I<cupsd(8)>," ++msgstr "B<backend>(1), B<cupsd>(8)," ++ ++# type: TH ++#: lpadmin.man:15 ++#, no-wrap ++msgid "lpadmin" ++msgstr "lpadmin" ++ ++# type: TH ++#: lpadmin.man:15 ++#, no-wrap ++msgid "2 January 2008" ++msgstr "2 janvier 2008" ++ ++# type: Plain text ++#: lpadmin.man:18 ++msgid "lpadmin - configure cups printers and classes" ++msgstr "lpadmin - Configurer les imprimantes et classes d'imprimantes CUPS." ++ ++# type: Plain text ++#: lpadmin.man:26 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -d I<destination>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -d " ++"I<destination>" ++ ++# type: Plain text ++#: lpadmin.man:34 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -p I<printer " ++"option(s)>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -p " ++"I<imprimante option(s)>" ++ ++# type: Plain text ++#: lpadmin.man:42 ++msgid "" ++"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -x I<destination>" ++msgstr "" ++"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -x " ++"I<destination>" ++ ++# type: Plain text ++#: lpadmin.man:46 ++msgid "" ++"I<lpadmin> configures printer and class queues provided by CUPS. It can also " ++"be used to set the server default printer or class." ++msgstr "" ++"B<lpadmin> configure les imprimantes et classes d'imprimantes CUPS. Il est " ++"également utilisé pour définir l'imprimante ou classe d'imprimante par " ++"défaut." ++ ++# type: Plain text ++#: lpadmin.man:50 ++msgid "" ++"When specified before the I<-d>, I<-p>, or I<-x> options, the I<-E> option " ++"forces encryption when connecting to the server." ++msgstr "" ++"Lorsque l'option B<-E> est spécifiée avant les options B<-d>, B<-p> ou B<-" ++"x>, la communication avec le serveur est chiffrée." ++ ++# type: Plain text ++#: lpadmin.man:56 ++msgid "" ++"The first form of the command (I<-d>) sets the default printer or class to " ++"I<destination>. Subsequent print jobs submitted via the I<lp(1)> or I<lpr(1)" ++"> commands will use this destination unless the user specifies otherwise " ++"with the I<lpoptions(1)> command." ++msgstr "" ++"La première méthode d'utilisation de la commande (avec B<-d>) définit " ++"l'imprimante ou la classe par défaut. Les impressions futures demandées par " ++"les commandes B<lp>(1) ou B<lpr>(1) utiliseront cette destination sauf avis " ++"contraire de l'utilisateur par l'utilisation de la commande B<lpoptions>(1)." ++ ++# type: Plain text ++#: lpadmin.man:59 ++msgid "" ++"The second form of the command (I<-p>) configures the named printer. The " ++"additional options are described below." ++msgstr "" ++"La seconde forme de la commande (avec B<-p>) configure l'imprimante " ++"spécifiée. Les options supplémentaires sont décrites plus loin." ++ ++# type: Plain text ++#: lpadmin.man:64 ++msgid "" ++"The third form of the command (I<-x>) deletes the printer or class " ++"I<destination>. Any jobs that are pending for the destination will be " ++"removed and any job that is currently printed will be aborted." ++msgstr "" ++"La troisième forme de la commande (avec B<-x>) supprime l'imprimante ou " ++"classe I<destination>. Tous les travaux d'impression en attente sur cette " ++"destination sont supprimés, et les travaux en cours d'impression sont " ++"arrêtés." ++ ++# type: SH ++#: lpadmin.man:64 ++#, no-wrap ++msgid "CONFIGURATION OPTIONS" ++msgstr "OPTIONS DE CONFIGURATION" ++ ++# type: Plain text ++#: lpadmin.man:67 ++msgid "The following options are recognized when configuring a printer queue:" ++msgstr "" ++"Les options suivantes sont reconnues pour la configuration d'une liste " ++"d'attente :" ++ ++# type: TP ++#: lpadmin.man:67 ++#, no-wrap ++msgid "-c class" ++msgstr "B<-c> I<classe>" ++ ++# type: Plain text ++#: lpadmin.man:72 ++msgid "" ++"Adds the named I<printer> to I<class>. If I<class> does not exist it is " ++"created automatically." ++msgstr "" ++"Ajouter l'imprimante I<imprimante> à la classe I<classe>. Si la I<classe> " ++"n'existe pas encore, elle est créée automatiquement." ++ ++# type: TP ++#: lpadmin.man:72 ++#, no-wrap ++msgid "-i interface" ++msgstr "B<-i> I<interface>" ++ ++# type: Plain text ++#: lpadmin.man:78 ++msgid "" ++"Sets a System V style interface script for the printer. This option cannot " ++"be specified with the I<-P> option (PPD file) and is intended for providing " ++"support for legacy printer drivers." ++msgstr "" ++"Créer un script d'interface System V pour l'imprimante. Cette option ne peut " ++"être utilisée en même temps que l'option B<-P> (fichier PPD) et est destinée " ++"au support des imprimantes de base." ++ ++# type: TP ++#: lpadmin.man:78 ++#, no-wrap ++msgid "-m model" ++msgstr "B<-m> I<modèle>" ++ ++# type: Plain text ++#: lpadmin.man:83 ++msgid "" ++"Sets a standard System V interface script or PPD file from the I<model> " ++"directory." ++msgstr "" ++"Définir un script d'interface System V ou un fichier PPD du répertoire " ++"I<modèle>." ++ ++# type: TP ++#: lpadmin.man:83 ++#, no-wrap ++msgid "-o job-k-limit=value" ++msgstr "B<-o> B<job-k-limit>=I<valeur>" ++ ++# type: Plain text ++#: lpadmin.man:88 ++msgid "" ++"Sets the kilobyte limit for per-user quotas. The value is an integer number " ++"of kilobytes; one kilobyte is 1024 bytes." ++msgstr "" ++"Définir les quotas par utilisateur en kilo-octets. La valeur est un nombre " ++"entier de kilo-octets (valant 1 024 octets)." ++ ++# type: TP ++#: lpadmin.man:88 ++#, no-wrap ++msgid "-o job-page-limit=value" ++msgstr "B<-o> B<job-page-limit>=I<valeur>" ++ ++# type: Plain text ++#: lpadmin.man:94 ++msgid "" ++"Sets the page limit for per-user quotas. The value is the integer number of " ++"pages that can be printed; double-sided pages are counted as two pages." ++msgstr "" ++"Définir les quotas par utilisateur en nombre de pages. La valeur est un " ++"nombre entier de pages pouvant être imprimées. Les recto-verso comptent pour " ++"deux pages." ++ ++# type: TP ++#: lpadmin.man:94 ++#, no-wrap ++msgid "-o job-quota-period=value" ++msgstr "B<-o> B<job-quota-period>=I<valeur>" ++ ++# type: Plain text ++#: lpadmin.man:99 ++msgid "" ++"Sets the accounting period for per-user quotas. The value is an integer " ++"number of seconds; 86,400 seconds are in one day." ++msgstr "" ++"Définir les quotas par utilisateur en impressions par intervalle de temps. " ++"La valeur est un nombre entier définissant le nombre de secondes entre " ++"chaque impression. Une journée contient 86 400 secondes." ++ ++# type: TP ++#: lpadmin.man:99 ++#, no-wrap ++msgid "-o job-sheets-default=banner" ++msgstr "B<-o> B<job-sheets-default>=I<bannière>" ++ ++# type: TP ++#: lpadmin.man:101 ++#, no-wrap ++msgid "-o job-sheets-default=banner,banner" ++msgstr "B<-o> B<job-sheets-default>=I<bannière,bannière>" ++ ++# type: Plain text ++#: lpadmin.man:105 ++msgid "Sets the default banner page(s) to use for print jobs." ++msgstr "" ++"Fixer la (les) pages de bannière par défaut pour les travaux d'impression." ++ ++# type: Plain text ++#: lpadmin.man:111 ++msgid "" ++"Sets a PPD option for the printer. PPD options can be listed using the I<-l> " ++"option with the I<lpoptions(1)> command." ++msgstr "" ++"Définir une option PPD pour l'imprimante. La liste des options PPD peut être " ++"obtenue en utilisant l'option B<-l> de la commande B<lpoptions>(1)." ++ ++# type: TP ++#: lpadmin.man:111 ++#, no-wrap ++msgid "-o name-default=value" ++msgstr "B<-o> B<name-default>=I<valeur>" ++ ++# type: Plain text ++#: lpadmin.man:117 ++msgid "" ++"Sets a default server-side option for the printer. Any print-time option can " ++"be defaulted, e.g. \"-o cpi-default=17\" to set the default \"cpi\" option " ++"value to 17." ++msgstr "" ++"Définir au niveau du serveur une option par défaut pour l'imprimante. Toute " ++"option pouvant être définie au moment de l'impression peut avoir une valeur " ++"par défaut, par exemple \"-o cpi-default=17\" pour définir l'option \"cpi\" " ++"par défaut à la valeur 17." ++ ++# type: TP ++#: lpadmin.man:117 ++#, no-wrap ++msgid "-o port-monitor=name" ++msgstr "B<-o> B<port-monitor>=I<nom>" ++ ++# type: Plain text ++#: lpadmin.man:123 ++msgid "" ++"Sets the binary communications program to use when printing, \"none\", \"bcp" ++"\", or \"tbcp\". The default program is \"none\". The specified port monitor " ++"must be listed in the printer's PPD file." ++msgstr "" ++"Fixer le programme à utiliser pour les communications binaires lors de " ++"l'impression : « none », « bcp » ou « tbcp ». Le programme par défaut est " ++"« none ». Le moniteur de port indiqué doit être listé dans le fichier PPD de " ++"l'imprimante." ++ ++# type: TP ++#: lpadmin.man:123 ++#, no-wrap ++msgid "-o printer-error-policy=name" ++msgstr "B<-o> B<printer-error-policy>=I<nom>" ++ ++# type: Plain text ++#: lpadmin.man:130 ++msgid "" ++"Sets the error policy to be used when the printer backend is unable to send " ++"the job to the printer. The name must be one of \"abort-job\", \"retry-job\" " ++"or \"stop-printer\". The default error policy is \"stop-printer\"." ++msgstr "" ++"Fixer la politique à utiliser en cas d'erreur quand le dorsal responsable de " ++"l'impression n'arrive pas à envoyer le travail à l'imprimante. Le nom doit " ++"être soit « abort-job » (annuler l'impression), « retry-job » (réessayer) ou " ++"« stop-printer » (arrêter l'imprimante). La politique par défaut en cas " ++"d'erreur est « stop-printer »." ++ ++# type: TP ++#: lpadmin.man:130 ++#, no-wrap ++msgid "-o printer-is-shared=true/false" ++msgstr "B<-o> B<printer-is-shared>=I<true/false>" ++ ++# type: Plain text ++#: lpadmin.man:138 ++msgid "" ++"Sets the printer to shared/published or unshared/unpublished. Shared/" ++"published printers are publically announced by the server on the LAN based " ++"on the browsing configuration in B<cupsd.conf>, while unshared/unpublished " ++"printers are not announced. The default value is \"true\"." ++msgstr "" ++"Placer l'imprimante dans l'état partagée/publiée ou non partagée/non " ++"publiée. Les imprimantes partagées/publiées sont annoncées publiquement par " ++"le serveur sur le réseau local, en fonction de la configuration pour les " ++"recherches de I<cupsd.conf>, tandis que les imprimantes non partagées/non " ++"publiées ne sont pas annoncées. La valeur par défaut est « true »." ++ ++# type: TP ++#: lpadmin.man:138 ++#, no-wrap ++msgid "-o printer-op-policy=name" ++msgstr "B<-o> B<printer-op-policy>=I<nom>" ++ ++# type: Plain text ++#: lpadmin.man:144 ++msgid "" ++"Sets the IPP operation policy associated with the printer. The name must be " ++"defined in the B<cupsd.conf> in a Policy section. The default operation " ++"policy is \"default\"." ++msgstr "" ++"Fixer la politique des opérations IPP associée à l'imprimante. Le nom doit " ++"être définit dans I<cupsd.conf>, dans une section de type Policy. La " ++"politique des opérations est par défaut « default »." ++ ++# type: TP ++#: lpadmin.man:144 ++#, no-wrap ++msgid "-r class" ++msgstr "B<-r> I<classe>" ++ ++# type: Plain text ++#: lpadmin.man:149 ++msgid "" ++"Removes the named I<printer> from I<class>. If the resulting class becomes " ++"empty it is removed." ++msgstr "" ++"Supprimer l'I<imprimante> de la I<classe>. Si la classe d'imprimante devient " ++"vide, celle-ci est supprimée." ++ ++# type: TP ++#: lpadmin.man:149 ++#, no-wrap ++msgid "-u allow:user,user,@group" ++msgstr "B<-u> B<allow>:I<utilisateur,utilisateur,@groupe>" ++ ++# type: TP ++#: lpadmin.man:151 ++#, no-wrap ++msgid "-u deny:user,user,@group" ++msgstr "B<-u> B<deny>:I<utilisateur,utilisateur,@groupe>" ++ ++# type: TP ++#: lpadmin.man:153 ++#, no-wrap ++msgid "-u allow:all" ++msgstr "B<-u> B<allow>:B<all>" ++ ++# type: TP ++#: lpadmin.man:155 ++#, no-wrap ++msgid "-u deny:none" ++msgstr "B<-u> B<deny>:B<none>" ++ ++# type: Plain text ++#: lpadmin.man:161 ++msgid "" ++"Sets user-level access control on a printer. Names starting with \"@\" are " ++"interpreted as UNIX groups. The latter two forms turn user-level access " ++"control off." ++msgstr "" ++"Définir les accès par utilisateur sur une imprimante. Les noms commençant " ++"par un « @ » sont interprétés comme des groupes UNIX. Les deux dernières " ++"expressions suppriment les contrôles d'accès par utilisateur." ++ ++# type: TP ++#: lpadmin.man:161 ++#, no-wrap ++msgid "-v \"device-uri\"" ++msgstr "B<-v> I<uri_périphérique>" ++ ++# type: Plain text ++#: lpadmin.man:168 ++msgid "" ++"Sets the I<device-uri> attribute of the printer queue. If I<device-uri> is " ++"a filename it is automatically converted to the form I<file:///file/name>. " ++"Use the I<lpinfo(8)> command to get a list of supported device URIs and " ++"schemes." ++msgstr "" ++"Définir l'attribut B<device-uri> de la file d'attente de l'imprimante. Si " ++"I<uri_périphérique> est un nom de fichier, il est converti automatiquement " ++"en la forme B<file:/fichier/nom>. Utilisez la commande B<lpinfo>(8) pour " ++"avoir la liste des URI de périphériques gérés et leurs schémas." ++ ++# type: TP ++#: lpadmin.man:168 ++#, no-wrap ++msgid "-D \"info\"" ++msgstr "B<-D> I<info>" ++ ++# type: Plain text ++#: lpadmin.man:172 ++msgid "Provides a textual description of the printer." ++msgstr "Définir une description textuelle de l'imprimante." ++ ++# type: Plain text ++#: lpadmin.man:177 ++msgid "" ++"Enables the printer and accepts jobs; this is the same as running the " ++"I<accept(8)> and I<cupsenable(8)> programs on the printer." ++msgstr "" ++"Activer l'imprimante et lui fait accepter les travaux d'impression. Ceci " ++"peut également être effectué en lançant les commandes B<accept>(8) et " ++"B<cupsenable>(8) avec cette imprimante." ++ ++# type: TP ++#: lpadmin.man:177 ++#, no-wrap ++msgid "-L \"location\"" ++msgstr "B<-L> I<emplacement>" ++ ++# type: Plain text ++#: lpadmin.man:181 ++msgid "Provides a textual location of the printer." ++msgstr "Définir l'emplacement de l'imprimante." ++ ++# type: TP ++#: lpadmin.man:181 ++#, no-wrap ++msgid "-P ppd-file" ++msgstr "B<-P> I<fichier-ppd>" ++ ++# type: Plain text ++#: lpadmin.man:187 ++msgid "" ++"Specifies a PostScript Printer Description file to use with the printer. If " ++"specified, this option overrides the I<-i> option (interface script)." ++msgstr "" ++"Définir le fichier PPD (Postscript Printer Description) à utiliser avec " ++"cette imprimante. Si cette option est spécifiée, elle annule l'option B<-i> " ++"(script d'interface)." ++ ++# type: Plain text ++#: lpadmin.man:195 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " ++"and class names are I<not> case-sensitive. Finally, the CUPS version of " ++"I<lpadmin> may ask the user for an access password depending on the printing " ++"system configuration. This differs from the System V version which requires " ++"the root user to execute this command." ++msgstr "" ++"Contrairement au système d'impression System V, CUPS permet des noms " ++"d'imprimantes contenant tout caractère imprimable sauf ESPACE, TABULATION, " ++"w / » ou « # ». De plus, les noms d'imprimante et de classe ne sont I<pas> " ++"sensibles à la casse. Enfin, la version CUPS de B<lpadmin> peut demander un " ++"mot de passe, suivant la configuration du système, à la différence de la " ++"version System V qui demande le mot de passe root lors de l'exécution de " ++"cette commande." ++ ++# type: Plain text ++#: lpadmin.man:198 ++msgid "" ++"The CUPS version of I<lpadmin> does not support all of the System V or " ++"Solaris printing system configuration options." ++msgstr "" ++"La version CUPS de B<lpadmin> ne reconnaît pas toutes les options de " ++"configuration disponibles dans les versions System V ou Solaris." ++ ++# type: Plain text ++#: lpadmin.man:201 ++msgid "I<accept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," ++msgstr "B<accept>(8), B<cupsenable>(8), B<lpinfo>(8), B<lpoptions>(1)," ++ ++# type: TH ++#: lpc.man:15 ++#, no-wrap ++msgid "lpc" ++msgstr "lpc" ++ ++# type: Plain text ++#: lpc.man:18 ++msgid "lpc - line printer control program" ++msgstr "lpc - Programme de contrôle d'imprimantes par ligne." ++ ++# type: Plain text ++#: lpc.man:25 ++msgid "B<lpc> [ I<command> [ I<parameter(s)> ] ]" ++msgstr "B<lpc> [ I<commande> [ I<paramètre(s)> ] ]" ++ ++# type: Plain text ++#: lpc.man:29 ++msgid "" ++"I<lpc> provides limited control over printer and class queues provided by " ++"CUPS. It can also be used to query the state of queues." ++msgstr "" ++"B<lpc> permet de contrôler partiellement des imprimantes et classes " ++"d'imprimantes de CUPS. Il est également utilisé pour récupérer l'état des " ++"files d'attente." ++ ++# type: Plain text ++#: lpc.man:32 ++msgid "" ++"If no command is specified on the command-line, lpc will display a prompt " ++"and accept commands from the standard input." ++msgstr "" ++"Si aucune commande n'est donnée dans la ligne de commande, lpc affichera une " ++"invite et prendra ses commandes depuis l'entrée standard." ++ ++# type: SH ++#: lpc.man:32 ++#, no-wrap ++msgid "COMMANDS" ++msgstr "COMMANDES" ++ ++# type: Plain text ++#: lpc.man:35 ++msgid "" ++"The I<lpc> program accepts a subset of commands accepted by the Berkeley " ++"I<lpc> program of the same name:" ++msgstr "" ++"B<lpc> reconnaît un sous-ensemble des commandes reconnues le programme " ++"B<lpc> de Berkeley :" ++ ++# type: TP ++#: lpc.man:35 ++#, no-wrap ++msgid "exit" ++msgstr "B<exit>" ++ ++# type: Plain text ++#: lpc.man:39 lpc.man:49 ++msgid "Exits the command interpreter." ++msgstr "Quitte l'interpréteur de commandes." ++ ++# type: TP ++#: lpc.man:39 ++#, no-wrap ++msgid "help [command]" ++msgstr "B<help> I<[commande]>" ++ ++# type: TP ++#: lpc.man:41 ++#, no-wrap ++msgid "? [command]" ++msgstr "B<?> I<[commande]>" ++ ++# type: Plain text ++#: lpc.man:45 ++msgid "Displays a short help message." ++msgstr "Afficher un message d'aide." ++ ++# type: TP ++#: lpc.man:45 ++#, no-wrap ++msgid "quit" ++msgstr "B<quit>" ++ ++# type: TP ++#: lpc.man:49 ++#, no-wrap ++msgid "status [queue]" ++msgstr "B<status> [I<file-attente>]" ++ ++# type: Plain text ++#: lpc.man:53 ++msgid "Displays the status of one or more printer or class queues." ++msgstr "" ++"Afficher l'état des files d'attente d'une ou plusieurs imprimantes ou " ++"classes d'imprimantes." ++ ++# type: Plain text ++#: lpc.man:59 ++msgid "" ++"Since I<lpc> is geared towards the Berkeley printing system, it is " ++"impossible to use I<lpc> to configure printer or class queues provided by " ++"CUPS. To configure printer or class queues you must use the I<lpadmin(8)> " ++"command or another CUPS-compatible client with that functionality." ++msgstr "" ++"Étant donné que B<lpc> est spécifique au système d'impression de Berkeley, " ++"il est impossible de l'utiliser pour configurer les files d'attente de CUPS. " ++"Pour cela, vous devez utiliser le programme B<lpadmin>(8) ou tout autre " ++"client compatible avec CUPS remplissant ces fonctions." ++ ++# type: Plain text ++#: lpc.man:62 ++msgid "" ++"The CUPS version of I<lpc> does not implement all of the standard Berkeley " ++"or LPRng commands." ++msgstr "" ++"La version CUPS de B<lpc> n'implémente pas toutes les commandes des versions " ++"Berkeley ou LPRng." ++ ++# type: Plain text ++#: lpc.man:65 ++msgid "" ++"I<accept(8)>, I<cancel(1)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)" ++">, I<lpstat(1)>," ++msgstr "" ++"B<accept>(8), B<cancel>(1), B<cupsenable>(8), B<lp>(1), B<lpr>(1), B<lprm>" ++"(1), B<lpstat>(1)," ++ ++# type: TH ++#: lpinfo.man:15 ++#, no-wrap ++msgid "lpinfo" ++msgstr "lpinfo" ++ ++# type: Plain text ++#: lpinfo.man:18 ++msgid "lpinfo - show available devices or drivers" ++msgstr "lpinfo - Afficher les périphériques et pilotes disponibles." ++ ++# type: Plain text ++#: lpinfo.man:25 ++msgid "B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] -m" ++msgstr "" ++"B<lpinfo> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] -m" ++ ++# type: Plain text ++#: lpinfo.man:32 ++msgid "B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] -v" ++msgstr "" ++"B<lpinfo> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] -v" ++ ++# type: Plain text ++#: lpinfo.man:37 ++msgid "" ++"I<lpinfo> lists the available devices or drivers known to the CUPS server. " ++"The first form (I<-m>) lists the available drivers, while the second form " ++"(I<-v>) lists the available devices." ++msgstr "" ++"B<lpinfo> affiche la liste des périphériques ou pilotes connus par le " ++"serveur CUPS. La première forme (avec B<-m>) liste les pilotes disponibles, " ++"et la seconde forme (avec B<-v>) liste les périphériques disponibles." ++ ++# type: Plain text ++#: lpinfo.man:39 ++msgid "I<lpinfo> accepts the following options:" ++msgstr "B<lpinfo> gère les options suivantes :" ++ ++# type: Plain text ++#: lpinfo.man:47 ++msgid "Sets the username to use when connecting to the server." ++msgstr "Indiquer l'utilisateur utilisé pour se connecter au serveur." ++ ++# type: Plain text ++#: lpinfo.man:51 ++msgid "Selects an alternate server." ++msgstr "Sélectionner un autre serveur." ++ ++# type: Plain text ++#: lpinfo.man:55 ++msgid "Shows a \"long\" listing of devices or drivers." ++msgstr "Afficher une liste « longue » des périphériques ou pilotes." ++ ++# type: Plain text ++#: lpinfo.man:57 ++msgid "The I<lpinfo> command is unique to CUPS." ++msgstr "La commande B<lpinfo> est spécifique à CUPS." ++ ++# type: TH ++#: lp.man:15 ++#, no-wrap ++msgid "lp" ++msgstr "lp" ++ ++# type: TH ++#: lp.man:15 lpstat.man:15 ++#, no-wrap ++msgid "23 March 2006" ++msgstr "23 mars 2006" ++ ++# type: Plain text ++#: lp.man:18 ++msgid "lp - print files" ++msgstr "lp - Imprimer des fichiers." ++ ++# type: Plain text ++#: lp.man:41 ++msgid "" ++"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -d I<destination[/instance]> ] [ -h " ++"I<hostname[:port]> ] [ -m ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -" ++"q I<priority> ] [ -s ] [ -t I<title> ] [ -H I<handling> ] [ -P I<page-" ++"list> ] [ -- ] [ I<file(s)> ]" ++msgstr "" ++"B<lp> [ -E ] [ -U I<utilisateur> ] [ -c ] [ -d I<destination[/instance]> ] " ++"[ -h I<hostname[:port]> ] [ -m ] [ -n I<copies> ] [ -o I<option[=valeur]> ] " ++"[ -q I<priorité> ] [ -s ] [ -t I<titre> ] [ -H I<méthode> ] [ -P " ++"I<liste_de_pages> ] [ -- ] [ I<fichier(s)> ]" ++ ++# type: Plain text ++#: lp.man:62 ++msgid "" ++"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -h I<hostname[:port]> ] [ -i I<job-" ++"id> ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -q I<priority> ] [ -t " ++"I<title> ] [ -H I<handling> ] [ -P I<page-list> ]" ++msgstr "" ++"B<lp> [ -E ] [ -U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] [ -i " ++"I<id_travail> ] [ -n I<copies> ] [ -o I<option[=valeur]> ] [ -q " ++"I<priorité> ] [ -t I<titre> ] [ -H I<méthode> ] [ -P I<liste_de_pages> ]" ++ ++# type: Plain text ++#: lp.man:65 ++msgid "" ++"I<lp> submits files for printing or alters a pending job. Use a filename of " ++"\"-\" to force printing from the standard input." ++msgstr "" ++"B<lp> demande l'impression d'un fichier ou modifie un travail d'impression " ++"en attente. Utiliser « - » comme fichier pour forcer l'impression à partir de " ++"l'entrée standard." ++ ++# type: Plain text ++#: lp.man:67 ++msgid "The following options are recognized by I<lp>:" ++msgstr "Les options suivantes sont reconnues par B<lp> :" ++ ++# type: TP ++#: lp.man:67 ++#, no-wrap ++msgid "--" ++msgstr "B<-->" ++ ++# type: Plain text ++#: lp.man:72 ++msgid "" ++"Marks the end of options; use this to print a file whose name begins with a " ++"dash (-)." ++msgstr "" ++"Marquer la fin des options ; utilisez ceci pour imprimer un fichier dont le " ++"nom commence par un tiret (« - »)." ++ ++# type: Plain text ++#: lp.man:88 ++msgid "" ++"This option is provided for backwards-compatibility only. On systems that " ++"support it, this option forces the print file to be copied to the spool " ++"directory before printing. In CUPS, print files are always sent to the " ++"scheduler via IPP which has the same effect." ++msgstr "" ++"Cette option n'est fournie que pour des raisons de compatibilité avec les " ++"précédentes versions. Sur les systèmes le permettant, elle force la copie du " ++"fichier d'impression dans le répertoire spool avant impression. Avec CUPS, " ++"les fichiers d'impression sont envoyés à l'ordonnanceur via IPP. Le résultat " ++"est le même dans les deux cas." ++ ++# type: TP ++#: lp.man:88 ++#, no-wrap ++msgid "-d destination" ++msgstr "B<-d> I<destination>" ++ ++# type: Plain text ++#: lp.man:92 lpr.man:63 ++msgid "Prints files to the named printer." ++msgstr "Imprimer les fichiers sur l'imprimante donnée." ++ ++# type: TP ++#: lp.man:96 ++#, no-wrap ++msgid "-i job-id" ++msgstr "B<-i> I<id_travail>" ++ ++# type: Plain text ++#: lp.man:100 ++msgid "Specifies an existing job to modify." ++msgstr "Indiquer l'identifiant du travail d'impression à modifier." ++ ++# type: TP ++#: lp.man:100 lpr.man:82 ++#, no-wrap ++msgid "-m" ++msgstr "B<-m>" ++ ++# type: Plain text ++#: lp.man:104 ++msgid "Sends an email when the job is completed." ++msgstr "Envoyer un courrier électronique lorsque l'impression est terminée." ++ ++# type: Plain text ++#: lp.man:108 lpr.man:71 ++msgid "Sets the number of copies to print from 1 to 100." ++msgstr "Nombre de copies à effectuer (de 1 à 100)." ++ ++# type: TP ++#: lp.man:108 ++#, no-wrap ++msgid "-o \"name=value [name=value ...]\"" ++msgstr "B<-o> I<nom=valeur [nom=valeur ...]>" ++ ++# type: Plain text ++#: lp.man:112 ++msgid "Sets one or more job options." ++msgstr "Définir une ou plusieurs options pour le travail d'impression." ++ ++# type: TP ++#: lp.man:112 ++#, no-wrap ++msgid "-q priority" ++msgstr "B<-q> I<priorité>" ++ ++# type: Plain text ++#: lp.man:117 ++msgid "" ++"Sets the job priority from 1 (lowest) to 100 (highest). The default priority " ++"is 50." ++msgstr "" ++"Définir la priorité du travail d'impression, de 1 (minimale) à 100 " ++"(maximale). La priorité par défaut est 50." ++ ++# type: TP ++#: lp.man:117 lpstat.man:101 ++#, no-wrap ++msgid "-s" ++msgstr "B<-s>" ++ ++# type: Plain text ++#: lp.man:121 ++msgid "Do not report the resulting job IDs (silent mode.)" ++msgstr "Ne pas afficher le numéro du travail (mode silencieux)." ++ ++# type: TP ++#: lp.man:121 ++#, no-wrap ++msgid "-t \"name\"" ++msgstr "B<-t> I<nom>" ++ ++# type: Plain text ++#: lp.man:125 lpr.man:59 ++msgid "Sets the job name." ++msgstr "Définir le I<nom> du travail." ++ ++# type: Plain text ++#: lp.man:129 ++msgid "Submits jobs as I<username>." ++msgstr "Envoyer les travaux d'impression en tant que I<utilisateur>." ++ ++# type: TP ++#: lp.man:129 ++#, no-wrap ++msgid "-H hh:mm" ++msgstr "B<-H> I<hh:mm>" ++ ++# type: TP ++#: lp.man:131 ++#, no-wrap ++msgid "-H hold" ++msgstr "B<-H hold>" ++ ++# type: TP ++#: lp.man:133 ++#, no-wrap ++msgid "-H immediate" ++msgstr "B<-H immediate>" ++ ++# type: TP ++#: lp.man:135 ++#, no-wrap ++msgid "-H restart" ++msgstr "B<-H restart>" ++ ++# type: TP ++#: lp.man:137 ++#, no-wrap ++msgid "-H resume" ++msgstr "B<-H resume>" ++ ++# type: Plain text ++#: lp.man:147 ++msgid "" ++"Specifies when the job should be printed. A value of I<immediate> will print " ++"the file immediately, a value of I<hold> will hold the job indefinitely, and " ++"a time value (HH:MM) will hold the job until the specified time. Use a value " ++"of I<resume> with the I<-i> option to resume a held job. Use a value of " ++"I<restart> with the I<-i> option to restart a completed job." ++msgstr "" ++"Définir quand l'impression doit être effectuée. La valeur B<immediate> " ++"effectue l'impression immédiatement, la valeur B<hold> suspend l'impression " ++"indéfiniment, une heure suspend l'impression jusqu'à l'heure donnée. " ++"Utilisez la valeur B<resume> avec l'option B<-i> pour reprendre un travail " ++"suspendu. Utilisez la valeur B<restart> avec l'option B<-i> pour relancer un " ++"travail terminé." ++ ++# type: TP ++#: lp.man:147 ++#, no-wrap ++msgid "-P page-list" ++msgstr "B<-P> I<liste-de-pages>" ++ ++# type: Plain text ++#: lp.man:153 ++msgid "" ++"Specifies which pages to print in the document. The list can contain a list " ++"of numbers and ranges (#-#) separated by commas (e.g. 1,3-5,16)." ++msgstr "" ++"Définir quelles sont les pages à imprimer. Cette liste ne peut contenir que " ++"des numéros ou des portions (#-#), séparés par des virgules (par exemple : " ++"1,3-5,16)." ++ ++# type: SH ++#: lp.man:153 ++#, no-wrap ++msgid "COMMON JOB OPTIONS" ++msgstr "OPTIONS COMMUNES DES TRAVAUX" ++ ++# type: Plain text ++#: lp.man:157 ++msgid "" ++"Aside from the printer-specific options reported by the I<lpoptions(1)> " ++"command, the following generic options are available:" ++msgstr "" ++"En plus des options spécifiques des imprimantes, indiquées par B<lpoptions>" ++"(1), les options génériques suivantes sont disponibles :" ++ ++# type: TP ++#: lp.man:157 ++#, no-wrap ++msgid "-o media=size" ++msgstr "B<-o> B<media>=I<taille>" ++ ++# type: Plain text ++#: lp.man:162 ++msgid "" ++"Sets the page size to I<size>. Most printers support at least the size names " ++"\"a4\", \"letter\", and \"legal\"." ++msgstr "" ++"Fixer la taille du papier à I<taille>. La plupart des imprimantes gèrent au " ++"moins les tailles appelées « a4 », « letter » et « legal »." ++ ++# type: TP ++#: lp.man:162 ++#, no-wrap ++msgid "-o landscape" ++msgstr "B<-o landscape>" ++ ++# type: TP ++#: lp.man:164 ++#, no-wrap ++msgid "-o orientation-requested=4" ++msgstr "B<-o orientation-requested>=I<4>" ++ ++# type: Plain text ++#: lp.man:168 ++msgid "Prints the job in landscape (rotated 90 degrees)." ++msgstr "Imprimer en mode paysage (rotation de 90 degrés)." ++ ++# type: TP ++#: lp.man:168 ++#, no-wrap ++msgid "-o sides=one-sided" ++msgstr "B<-o sides>=B<one-sided>" ++ ++# type: TP ++#: lp.man:170 ++#, no-wrap ++msgid "-o sides=two-sided-long-edge" ++msgstr "B<-o sides>=B<two-sided-long-edge>" ++ ++# type: TP ++#: lp.man:172 ++#, no-wrap ++msgid "-o sides=two-sided-short-edge" ++msgstr "B<-o sides>=B<two-sided-short-edge>" ++ ++# type: Plain text ++#: lp.man:179 ++msgid "" ++"Prints on one or two sides of the paper. The value \"two-sided-long-edge\" " ++"is normally used when printing portrait (unrotated) pages, while \"two-sided-" ++"short-edge\" is used for landscape pages." ++msgstr "" ++"Imprimer sur une face ou en recto-verso. La valeur « B<two-sided-long-" ++"edge> » (double faces, côté long) est normalement utilisée pour l'impression " ++"en mode portrait (pas de rotation), et « B<two-sided-short-edge> » (double " ++"faces, petit côté) pour l'impression de pages en mode paysage." ++ ++# type: TP ++#: lp.man:179 ++#, no-wrap ++msgid "-o fitplot" ++msgstr "B<-o fitplot>" ++ ++# type: Plain text ++#: lp.man:183 ++msgid "Scales the print file to fit on the page." ++msgstr "Mettre le fichier à l'échelle pour qu'il prenne la taille de la page." ++ ++# type: TP ++#: lp.man:183 ++#, no-wrap ++msgid "-o scaling=number" ++msgstr "B<-o scaling>=I<nombre>" ++ ++# type: Plain text ++#: lp.man:189 ++msgid "" ++"Scales image files to use up to I<number> percent of the page. Values " ++"greater than 100 cause the image file to be printed across multiple pages." ++msgstr "" ++"Mettre les fichiers image à l'échelle de telle sorte qu'il utilise jusqu'à " ++"I<nombre> pourcents de la page. Les valeurs supérieures à 100 forceront " ++"l'impression des images sur plusieurs pages." ++ ++# type: TP ++#: lp.man:189 ++#, no-wrap ++msgid "-o cpi=N" ++msgstr "B<-o cpi>=I<N>" ++ ++# type: Plain text ++#: lp.man:194 ++msgid "" ++"Sets the number of characters per inch to use when printing a text file. The " ++"default is 10." ++msgstr "" ++"Fixer le nombre de caractères par pouces à utiliser pour l'impression de " ++"fichiers texte. La valeur par défaut est 10." ++ ++# type: TP ++#: lp.man:194 ++#, no-wrap ++msgid "-o lpi=N" ++msgstr "B<-o lpi>=I<N>" ++ ++# type: Plain text ++#: lp.man:199 ++msgid "" ++"Sets the number of lines per inch to use when printing a text file. The " ++"default is 6." ++msgstr "" ++"Fixer le nombre de lignes par pouces à utiliser pour l'impression de " ++"fichiers texte. La valeur par défaut est 6." ++ ++# type: TP ++#: lp.man:199 ++#, no-wrap ++msgid "-o page-bottom=N" ++msgstr "B<-o page-bottom>=I<N>" ++ ++# type: TP ++#: lp.man:201 ++#, no-wrap ++msgid "-o page-left=N" ++msgstr "B<-o page-left>=I<N>" ++ ++# type: TP ++#: lp.man:203 ++#, no-wrap ++msgid "-o page-right=N" ++msgstr "B<-o page-right>=I<N>" ++ ++# type: TP ++#: lp.man:205 ++#, no-wrap ++msgid "-o page-top=N" ++msgstr "B<-o page-top>=I<N>" ++ ++# type: Plain text ++#: lp.man:210 ++msgid "" ++"Sets the page margins when printing text files. The values are in points - " ++"there are 72 points to the inch." ++msgstr "" ++"Fixer les marges des pages pour l'impression de fichiers texte. Les valeurs " ++"sont exprimées en points ; il y a 72 points par pouces." ++ ++# type: Plain text ++#: lp.man:212 ++msgid "Print a double-sided legal document to a printer called \"foo\":" ++msgstr "Imprimer en recto-verso sur du papier a4 avec l'imprimante « toto »." ++ ++# type: Plain text ++#: lp.man:214 ++#, no-wrap ++msgid " lp -d foo -o media=legal -o sides=two-sided-long-edge filename\n" ++msgstr " lp -d toto -o media=a4 -o sides=two-sided-long-edge fichier\n" ++ ++# type: Plain text ++#: lp.man:217 ++msgid "Print an image across 4 pages:" ++msgstr "Imprimer une image sur 4 pages :" ++ ++# type: Plain text ++#: lp.man:219 ++#, no-wrap ++msgid " lp -d bar -o scaling=200 filename\n" ++msgstr " lp -d titi -o scaling=200 fichier\n" ++ ++# type: Plain text ++#: lp.man:223 ++msgid "" ++"Print a text file with 12 characters per inch, 8 lines per inch, and a 1 " ++"inch left margin:" ++msgstr "" ++"Imprimer un fichier texte avec 12 caractères par pouces, 8 lignes par pouces " ++"et une marge de gauche de 1 pouce :" ++ ++# type: Plain text ++#: lp.man:225 ++#, no-wrap ++msgid " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename\n" ++msgstr " lp -d titi -o cpi=12 -o lpi=8 -o page-left=72 fichier\n" ++ ++# type: Plain text ++#: lp.man:235 ++msgid "" ++"The \"q\" option accepts a different range of values than the Solaris lp " ++"command, matching the IPP job priority values (1-100, 100 is highest " ++"priority) instead of the Solaris values (0-39, 0 is highest priority)." ++msgstr "" ++"L'option « B<-q> » accepte des valeurs différentes de celles utilisées par la " ++"commande lp de Solaris (qui utilise les valeurs de 0 à 39, 0 étant la " ++"priorité la plus élevée), correspondant aux priorités des travaux IPP (de 1 " ++"à 100, 100 étant la priorité la plus élevée)." ++ ++# type: Plain text ++#: lp.man:237 ++msgid "I<cancel(1)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," ++msgstr "B<cancel>(1), B<lpmove>(8), B<lpoptions>(1), B<lpstat>(1)," ++ ++# type: TH ++#: lpmove.man:15 ++#, no-wrap ++msgid "lpmove" ++msgstr "lpmove" ++ ++# type: Plain text ++#: lpmove.man:18 ++msgid "lpmove - move a job or all jobs to a new destination" ++msgstr "" ++"lpmove - Déplacer un travail d'impression (ou tous) vers une nouvelle " ++"destination." ++ ++# type: Plain text ++#: lpmove.man:26 ++msgid "" ++"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<job " ++"destination>" ++msgstr "" ++"B<lpmove> [ -E ] [ -h I<serveur[:port]> ] [ -U I<utilisateur> ] I<travail " ++"destination>" ++ ++# type: Plain text ++#: lpmove.man:34 ++msgid "" ++"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<source " ++"destination>" ++msgstr "" ++"B<lpmove> [ -E ] [ -h I<serveur[:port]> ] [ -U I<utilisateur> ] I<source " ++"destination>" ++ ++# type: Plain text ++#: lpmove.man:38 ++msgid "" ++"B<lpmove> moves the specified I<job> or all jobs from I<source> to " ++"I<destination>. I<job> can be the job ID number or the old destination and " ++"job ID:" ++msgstr "" ++"B<lpmove> déplace le I<travail d'impression> ou tous les travaux de " ++"I<source> vers I<destination>. On peut spécifier le I<travail> sous deux " ++"formes : soit l'identifiant du travail d'impression, soit l'ancienne " ++"destination et l'identifiant du travail. Par exemple :" ++ ++# type: Plain text ++#: lpmove.man:43 ++#, no-wrap ++msgid "" ++" lpmove 123 newprinter\n" ++" lpmove oldprinter-123 newprinter\n" ++msgstr "" ++" lpmove 123 NouvelleImprimante\n" ++" lpmove AncienneImprimante-123 NouvelleImprimante\n" ++ ++# type: Plain text ++#: lpmove.man:46 ++msgid "The I<lpmove> command supports the following options:" ++msgstr "B<lpmove> gère les options suivantes :" ++ ++# type: Plain text ++#: lpmove.man:54 lpq.man:51 lpr.man:67 lprm.man:49 lpstat.man:57 ++msgid "Specifies an alternate username." ++msgstr "Utiliser l'I<utilisateur> donné." ++ ++# type: Plain text ++#: lpmove.man:58 lpq.man:59 lpr.man:51 lpstat.man:83 ++msgid "Specifies an alternate server." ++msgstr "Utiliser le serveur donné." ++ ++# type: Plain text ++#: lpmove.man:60 lpstat.man:133 ++msgid "I<cancel(1)>, I<lp(1)>," ++msgstr "B<cancel>(1), B<lp>(1)," ++ ++# type: TH ++#: lpoptions.man.in:15 ++#, no-wrap ++msgid "lpoptions" ++msgstr "lpoptions" ++ ++# type: Plain text ++#: lpoptions.man.in:18 ++msgid "lpoptions - display or set printer options and defaults" ++msgstr "" ++"lpoptions - Afficher et définir les options et paramètres par défaut d'une " ++"imprimante." ++ ++# type: Plain text ++#: lpoptions.man.in:31 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -d " ++"I<destination[/instance]> [ -o I<option[=value]> ] ... [ -o I<option[=value]" ++"> ]" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] -d " ++"I<destination[/instance]> [ -o I<option[=valeur]> ] ... [ -o I<option" ++"[=valeur]> ]" ++ ++# type: Plain text ++#: lpoptions.man.in:40 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -p " ++"I<destination[/instance]> ] -l" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -p " ++"I<destination[/instance]> ] -l" ++ ++# type: Plain text ++#: lpoptions.man.in:54 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -o I<option" ++"[=value]> ] ... [ -o I<option[=value]> ] [ -p I<destination[/instance]> ] -r " ++"I<option>" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -o " ++"I<option[=value]> ] ... [ -o I<option[=valeur]> ] [ -p I<destination[/" ++"instance]> ] -r I<option>" ++ ++# type: Plain text ++#: lpoptions.man.in:62 ++msgid "" ++"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -x " ++"I<destination[/instance]>" ++msgstr "" ++"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] -x " ++"I<destination[/instance]>" ++ ++# type: Plain text ++#: lpoptions.man.in:66 ++msgid "" ++"I<lpoptions> displays or sets printer options and defaults. I<lpoptions> " ++"shows the default printer options when run with no arguments. Other options " ++"include:" ++msgstr "" ++"B<lpoptions> affiche et définit les options et valeurs par défaut d'une " ++"imprimante. Lorsqu'il est lancé sans arguments, B<lpoptions> affiche les " ++"options. Les otpions pouvant être fournis sont :" ++ ++# type: Plain text ++#: lpoptions.man.in:70 ++msgid "Enables encryption when communicating with the CUPS server." ++msgstr "Activer le chiffrement pour la communication avec le serveur CUPS." ++ ++# type: Plain text ++#: lpoptions.man.in:74 ++msgid "Uses an alternate username." ++msgstr "Utilise un autre utilisateur." ++ ++# type: TP ++#: lpoptions.man.in:74 ++#, no-wrap ++msgid "-d destination[/instance]" ++msgstr "B<-d> I<destination[/instance]>" ++ ++# type: Plain text ++#: lpoptions.man.in:80 ++msgid "" ++"Sets the default printer to I<destination>. If I<instance> is supplied then " ++"that particular instance is used. This option overrides the system default " ++"printer for the current user." ++msgstr "" ++"Définir I<destination> comme imprimante par défaut. Il est également " ++"possible de fournir une I<instance>. Cette option redéfinit l'imprimante par " ++"défaut de l'utilisateur en cours." ++ ++# type: Plain text ++#: lpoptions.man.in:84 ++msgid "Uses an alternate server." ++msgstr "Utiliser un autre serveur." ++ ++# type: Plain text ++#: lpoptions.man.in:88 ++msgid "Lists the printer specific options and their current settings." ++msgstr "Affiche les options spécifiques d'une imprimante et leur valeur." ++ ++# type: TP ++#: lpoptions.man.in:88 lpr.man:86 ++#, no-wrap ++msgid "-o option[=value]" ++msgstr "B<-o> I<option[=valeur]>" ++ ++# type: Plain text ++#: lpoptions.man.in:92 ++msgid "Specifies a new option for the named destination." ++msgstr "Définir une nouvelle option pour la destination donnée." ++ ++# type: TP ++#: lpoptions.man.in:92 ++#, no-wrap ++msgid "-p destination[/instance]" ++msgstr "B<-p> I<destination[/instance]>" ++ ++# type: Plain text ++#: lpoptions.man.in:98 ++msgid "" ++"Sets the destination and instance, if specified, for any options that " ++"follow. If the named instance does not exist then it is created." ++msgstr "" ++"Définir la destination et l'instance, si elle est indiquée. Si l'instance " ++"n'existe pas, celle-ci est créée." ++ ++# type: TP ++#: lpoptions.man.in:98 ++#, no-wrap ++msgid "-r option" ++msgstr "B<-r> I<option>" ++ ++# type: Plain text ++#: lpoptions.man.in:102 ++msgid "Removes the specified option for the named destination." ++msgstr "Supprimer une option de la destination fournie en paramètre." ++ ++# type: TP ++#: lpoptions.man.in:102 ++#, no-wrap ++msgid "-x destination[/instance]" ++msgstr "B<-x> I<destination[/instance]>" ++ ++# type: Plain text ++#: lpoptions.man.in:108 ++msgid "" ++"Removes the options for the named destination and instance, if specified. If " ++"the named instance does not exist then this does nothing." ++msgstr "" ++"Supprimer toutes les options de la destination, et de l'instance si elle est " ++"indiquée, fournie en paramètre. Si l'instance n'existe pas, la commande n'a " ++"pas d'effet." ++ ++# type: Plain text ++#: lpoptions.man.in:112 ++msgid "" ++"If no options are specified using the I<-o> option, then the current options " ++"for the named printer are reported on the standard output." ++msgstr "" ++"Si aucune option n'est fournie avec l'option B<-o>, les options actuelles de " ++"l'imprimante fournie en paramètre sont affichées sur la sortie standard." ++ ++# type: Plain text ++#: lpoptions.man.in:115 ++msgid "" ++"Options set with the I<lpoptions> command are used by the I<lp(1)> and I<lpr" ++"(1)> commands when submitting jobs." ++msgstr "" ++"Les options définies par la commande B<lpoptions> sont utilisées par les " ++"commandes B<lp>(1) et B<lpr>(1) lors de l'envoi de travaux d'impression." ++ ++# type: SH ++#: lpoptions.man.in:115 ++#, no-wrap ++msgid "ROOT ACCOUNT OPTIONS" ++msgstr "OPTION DU COMPTE ROOT" ++ ++# type: Plain text ++#: lpoptions.man.in:119 ++msgid "" ++"When run by the root user, I<lpoptions> gets and sets default options and " ++"instances for I<all users> in the @CUPS_SERVERROOT@/lpoptions file." ++msgstr "" ++"Lorsque la commande B<lpoptions> est lancée par l'utilisateur root, les " ++"options sont lues et sauvegardées pour I<tous les utilisateurs> dans le " ++"fichier @CUPS_SERVERROOT@/lpoptions." ++ ++# type: Plain text ++#: lpoptions.man.in:121 ++msgid "The I<lpoptions> command is unique to CUPS." ++msgstr "La commande B<lpoptions> est spécifique à CUPS." ++ ++# type: SH ++#: lpoptions.man.in:121 ++#, no-wrap ++msgid "FILES" ++msgstr "FICHIERS" ++ ++# type: Plain text ++#: lpoptions.man.in:124 ++msgid "" ++"~/.cups/lpoptions - user defaults and instances created by non-root users." ++msgstr "" ++"~/.cups/lpoptions - Fichier des valeurs par défaut et instance de " ++"l'utilisateur." ++ ++# type: Plain text ++#: lpoptions.man.in:127 ++msgid "" ++"@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances created by " ++"the root user." ++msgstr "" ++"@CUPS_SERVERROOT@/lpoptions - Fichier global des instance et valeurs par " ++"défaut, créé par l'utilisateur root." ++ ++# type: Plain text ++#: lpoptions.man.in:129 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>," ++msgstr "B<cancel>(1), B<lp>(1), B<lpr>(1)," ++ ++# type: TH ++#: lppasswd.man:15 ++#, no-wrap ++msgid "lppasswd" ++msgstr "lppasswd" ++ ++# type: Plain text ++#: lppasswd.man:18 ++msgid "lppasswd - add, change, or delete digest passwords." ++msgstr "lppasswd - Ajouter, modifier ou supprimer des mots de passe." ++ ++# type: Plain text ++#: lppasswd.man:23 ++msgid "B<lppasswd> [ I<username> ]" ++msgstr "B<lppasswd> [ I<utilisateur> ]" ++ ++# type: Plain text ++#: lppasswd.man:29 ++msgid "B<lppasswd> -a [ -g I<groupname> ] I<username>" ++msgstr "B<lppasswd> -a [ -g I<groupe> ] I<utilisateur>" ++ ++# type: Plain text ++#: lppasswd.man:33 ++msgid "B<lppasswd> -x I<username>" ++msgstr "B<lppasswd> -x I<utilisateur>" ++ ++# type: Plain text ++#: lppasswd.man:41 ++msgid "" ++"I<lppasswd> adds, changes, or deletes passwords in the CUPS digest password " ++"file, I<passwd.md5>. When run by a normal user, I<lppasswd> will prompt for " ++"the old and new passwords. When run by the super-user, I<lppasswd> can add " ++"new accounts (I<-a username>), change existing accounts (I<username>), or " ++"delete accounts (I<-x username>) in the digest password file. Digest " ++"usernames do not have to match local UNIX usernames." ++msgstr "" ++"B<lppasswd> ajoute, modifie ou supprime des mots de passe du fichier CUPS de " ++"hachés de mots de passe, I<passwd.md5>. Lorsque ce programme est lancé par " ++"un utlisateur non privilégié, B<lppasswd> demande l'ancien et le nouveau mot " ++"de passe. Lorsque ce programme est lancé par un superutilisateur, il peut " ++"créer de nouveaux comptes utilisateurs (B<-a> I<utilisateur>), modifier des " ++"comptes existants (I<utilisateur>) ou supprimer des comptes (B<-x> " ++"I<utilisateur>). Les noms d'utilisateurs ne doivent pas forcément " ++"correspondre à des noms d'utilisateurs UNIX." ++ ++# type: Plain text ++#: lppasswd.man:43 ++msgid "I<lppasswd> supports the following options:" ++msgstr "B<lppasswd> gère les options suivantes :" ++ ++# type: TP ++#: lppasswd.man:43 ++#, no-wrap ++msgid "-g groupname" ++msgstr "B<-g> I<groupe>" ++ ++# type: Plain text ++#: lppasswd.man:47 ++msgid "Specifies a group other than the default system group." ++msgstr "Définir un groupe autre que le groupe système par défaut." ++ ++# type: SH ++#: lppasswd.man:47 ++#, no-wrap ++msgid "SECURITY ISSUES" ++msgstr "PROBLÈMES DE SÉCURITÉ" ++ ++# type: Plain text ++#: lppasswd.man:53 ++#, fuzzy ++#| msgid "" ++#| "The I<lppasswd> command is installed setuid to root. While every attempt " ++#| "has been made to make it secure against exploits that could grant super-" ++#| "user privileges to unprivileged users, paranoid system administrators may " ++#| "wish to disable or change the ownership of the program to an unprivileged " ++#| "account. " ++msgid "" ++"The I<lppasswd> command is installed setuid to root. While every attempt has " ++"been made to make it secure against exploits that could grant super-user " ++"privileges to unprivileged users, paranoid system administrators may wish to " ++"disable or change the ownership of the program to an unprivileged account." ++msgstr "" ++"La commande B<lppasswd> est installée avec le bit setuid activé. Toutes les " ++"précautions ont été prises pour empêcher les failles permettant l'accès aux " ++"privilèges du super-utilisateur par un utilisateur non privilégié. " ++"Cependant, certains administrateurs systèmes paranoïaques peuvent vouloir " ++"désactiver ce programme ou en modifier le propriétaire en un utilisateur non " ++"privilégié." ++ ++# type: Plain text ++#: lppasswd.man:55 ++msgid "I<lp(1)>, I<lpr(1)>," ++msgstr "B<lp>(1), B<lpr>(1)," ++ ++# type: TH ++#: lpq.man:15 ++#, no-wrap ++msgid "lpq" ++msgstr "lpq" ++ ++# type: Plain text ++#: lpq.man:18 ++msgid "lpq - show printer queue status" ++msgstr "lpq - Afficher l'état d'une file d'attente d'impression." ++ ++# type: Plain text ++#: lpq.man:29 ++msgid "" ++"B<lpq> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination[/" ++"instance]> ] [ -a ] [ -l ] [ I<+interval> ]" ++msgstr "" ++"B<lpq> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -P " ++"I<destination[/instance]> ] [ -a ] [ -l ] [ I<+intervalle> ]" ++ ++# type: Plain text ++#: lpq.man:33 ++msgid "" ++"I<lpq> shows the current print queue status on the named printer. Jobs " ++"queued on the default destination will be shown if no printer or class is " ++"specified on the command-line." ++msgstr "" ++"B<lpq> affiche l'état actuel de la file d'attente d'une imprimante donnée. " ++"Si aucune imprimante ou classe d'imprimante n'est donnée dans la ligne de " ++"commande, les travaux en attente sur la destination par défaut seront " ++"affichés." ++ ++# type: Plain text ++#: lpq.man:37 ++msgid "" ++"The I<+interval> option allows you to continuously report the jobs in the " ++"queue until the queue is empty; the list of jobs is shown once every " ++"I<interval> seconds." ++msgstr "" ++"L'option I<+intervalle> permet d'afficher les travaux en attente en continu " ++"jusqu'à ce qu'il n'y en ait plus. La liste est réaffichée toutes les " ++"I<intervalle> secondes." ++ ++# type: Plain text ++#: lpq.man:39 ++msgid "I<lpq> supports the following options:" ++msgstr "B<lpq> gère les options suivantes :" ++ ++# type: TP ++#: lpq.man:43 lpr.man:59 lprm.man:41 ++#, no-wrap ++msgid "-P destination[/instance]" ++msgstr "B<-P> I<destination[/instance]>" ++ ++# type: Plain text ++#: lpq.man:47 ++msgid "Specifies an alternate printer or class name." ++msgstr "Utiliser l'imprimante ou classe d'imprimante donnée." ++ ++# type: Plain text ++#: lpq.man:55 ++msgid "Reports jobs on all printers." ++msgstr "Afficher les travaux de toutes les imprimantes." ++ ++# type: Plain text ++#: lpq.man:63 ++msgid "Requests a more verbose (long) reporting format." ++msgstr "Demander un format de rapport plus bavard." ++ ++# type: Plain text ++#: lpq.man:66 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," ++msgstr "B<cancel>(1), B<lp>(1), B<lpr>(1), B<lprm>(1), B<lpstat>(1)," ++ ++# type: TH ++#: lpr.man:15 ++#, no-wrap ++msgid "lpr" ++msgstr "lpr" ++ ++# type: Plain text ++#: lpr.man:18 ++msgid "lpr - print files" ++msgstr "lpr - Imprimer des fichiers." ++ ++# type: Plain text ++#: lpr.man:35 ++msgid "" ++"B<lpr> [ -E ] [ -H I<server[:port]> ] [ -U I<username> ] [ -P I<destination[/" ++"instance]> ] [ -# I<num-copies> [ -h ] [ -l ] [ -m ] [ -o I<option[=value]" ++"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<title> ] [ I<file(s)> ]" ++msgstr "" ++"B<lpr> [ -E ] [ -H I<serveur[:port]> ] [ -U I<utilisateur> ] [ -P " ++"I<destination[/instance]> ] [ -# I<copies> [ -h ] [ -l ] [ -m ] [ -o I<option" ++"[=valeur]> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<titre> ] [ I<fichier(s)> ]" ++ ++# type: Plain text ++#: lpr.man:41 ++msgid "" ++"I<lpr> submits files for printing. Files named on the command line are sent " ++"to the named printer (or the system default destination if no destination is " ++"specified). If no files are listed on the command-line, I<lpr> reads the " ++"print file from the standard input." ++msgstr "" ++"B<lpr> demande l'impression de fichiers. Si des fichiers sont donnés dans la " ++"ligne de commande, ceux-ci sont envoyés à la destination donnée (ou la " ++"destination par défaut si aucune n'est fournie). Si aucun fichier n'est " ++"donné dans la ligne de commande, B<lpr> lit le fichier sur l'entrée standard." ++ ++# type: Plain text ++#: lpr.man:43 ++msgid "The following options are recognized by I<lpr>:" ++msgstr "Les options suivantes sont gérées par B<lpr>\\ :" ++ ++# type: TP ++#: lpr.man:47 ++#, no-wrap ++msgid "-H server[:port]" ++msgstr "B<-H> I<serveur[:port]>" ++ ++# type: TP ++#: lpr.man:51 ++#, no-wrap ++msgid "-C \"name\"" ++msgstr "B<-C> I<nom>" ++ ++# type: TP ++#: lpr.man:53 ++#, no-wrap ++msgid "-J \"name\"" ++msgstr "B<-J> I<nom>" ++ ++# type: TP ++#: lpr.man:55 ++#, no-wrap ++msgid "-T \"name\"" ++msgstr "B<-T> I<nom>" ++ ++# type: TP ++#: lpr.man:67 ++#, no-wrap ++msgid "-# I<copies>" ++msgstr "B<-#> I<copies>" ++ ++# type: Plain text ++#: lpr.man:76 ++msgid "" ++"Disables banner printing. This option is equivalent to \"-o job-sheets=none" ++"\"." ++msgstr "" ++"Désasctiver l'impression de la bannière. Cette option est équivalente à « B<-" ++"o job-sheets=none> »." ++ ++# type: Plain text ++#: lpr.man:82 ++msgid "" ++"Specifies that the print file is already formatted for the destination and " ++"should be sent without filtering. This option is equivalent to \"-o raw\"." ++msgstr "" ++"Indiquer que le fichier est déjà formaté pour la destination et qu'aucun " ++"filtre n'a besoin d'être appliqué. Cette option est équivalente à « B<-o " ++"raw> »." ++ ++# type: Plain text ++#: lpr.man:86 ++msgid "Send an email on job completion." ++msgstr "Envoyer un courier électronique à la fin du travail d'impression." ++ ++# type: Plain text ++#: lpr.man:90 ++msgid "Sets a job option." ++msgstr "Définir une option pour le travail d'impression." ++ ++# type: TP ++#: lpr.man:90 ++#, no-wrap ++msgid "-p" ++msgstr "B<-p>" ++ ++# type: Plain text ++#: lpr.man:97 ++msgid "" ++"Specifies that the print file should be formatted with a shaded header with " ++"the date, time, job name, and page number. This option is equivalent to \"-o " ++"prettyprint\" and is only useful when printing text files." ++msgstr "" ++"Spécifier que chaque page du fichier à imprimer doit avoir un en-tête ombré " ++"contenant la date, l'heure, le nom du travail d'impression et le numéro de " ++"page. Cette option est équivalente à « -oprettyprint » et n'est utile que " ++"dans le cas de fichiers texte." ++ ++# type: Plain text ++#: lpr.man:101 ++msgid "Hold job for printing." ++msgstr "Suspendre l'impression d'un travail." ++ ++# type: Plain text ++#: lpr.man:106 ++msgid "" ++"Specifies that the named print files should be deleted after printing them." ++msgstr "" ++"Spécifier que les fichiers indiqués doivent être effacés après impression." ++ ++# type: Plain text ++#: lpr.man:109 ++msgid "" ++"The \"c\", \"d\", \"f\", \"g\", \"i\", \"n\", \"t\", \"v\", and \"w\" " ++"options are not supported by CUPS and produce a warning message if used." ++msgstr "" ++"Les options « B<-c> », « B<-d> », « B<-f> », « B<-g> », « B<-i> », « B<-n> », « B<-" ++"t> », « B<-v> » et « B<-w> » ne sont pas gérées par CUPS et donnent un message " ++"d'avertissement lorsqu'elles sont utilisées." ++ ++# type: Plain text ++#: lpr.man:112 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lprm(1)>, I<lpstat(1)>," ++msgstr "B<cancel>(1), B<lp>(1), B<lpq>(1), B<lprm>(1), B<lpstat>(1)," ++ ++# type: TH ++#: lprm.man:15 ++#, no-wrap ++msgid "lprm" ++msgstr "lprm" ++ ++# type: Plain text ++#: lprm.man:18 ++msgid "lprm - cancel print jobs" ++msgstr "lprm - Annuler des travaux d'impression." ++ ++# type: Plain text ++#: lprm.man:29 ++msgid "" ++"B<lprm> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination" ++"[/instance]> ] [ - ] [ I<job ID(s)> ]" ++msgstr "" ++"B<lprm> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -P " ++"I<destination[/instance]> ] [ - ] [ I<identifiant(s) des travaux " ++"d'impression> ]" ++ ++# type: Plain text ++#: lprm.man:35 ++msgid "" ++"I<lprm> cancels print jobs that have been queued for printing. If no " ++"arguments are supplied, the current job on the default destination is " ++"cancelled. You can specify one or more job ID numbers to cancel those jobs " ++"or use the I<-> option to cancel all jobs." ++msgstr "" ++"B<lprm> annule des travaux d'impression en attente. Si aucun paramètre n'est " ++"fourni, c'est le travail en cours sur la destination par défaut qui est " ++"annulé. Il est possible de fournir un ou plusieurs identifiants de travaux " ++"d'impression à annuler ou d'utiliser l'option B<-> pour annuler tous les " ++"travaux." ++ ++# type: Plain text ++#: lprm.man:37 ++msgid "The I<lprm> command supports the following options:" ++msgstr "B<lprm> gère les options suivantes :" ++ ++# type: Plain text ++#: lprm.man:45 ++msgid "Specifies the destination printer or class." ++msgstr "Spécifier l'imprimante, ou la classe d'imprimante, de destination." ++ ++# type: Plain text ++#: lprm.man:53 ++msgid "Specifies and alternate server." ++msgstr "Définir un autre serveur." ++ ++# type: Plain text ++#: lprm.man:56 ++msgid "" ++"The CUPS version of I<lprm> is compatible with the standard Berkeley I<lprm> " ++"command." ++msgstr "" ++"La version CUPS de B<lprm> est compatible avec la version standard Berkeley." ++ ++# type: Plain text ++#: lprm.man:59 ++msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," ++msgstr "B<cancel>(1), B<lp>(1), B<lpq>(1), B<lpr>(1), B<lpstat>(1)," ++ ++# type: TH ++#: lpstat.man:15 ++#, no-wrap ++msgid "lpstat" ++msgstr "lpstat" ++ ++# type: Plain text ++#: lpstat.man:18 ++msgid "lpstat - print cups status information" ++msgstr "lpstat - Afficher l'état de CUPS." ++ ++# type: Plain text ++#: lpstat.man:39 ++msgid "" ++"B<lpstat> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -l ] [ -W " ++"I<which-jobs> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -d ] " ++"[ -o [ I<destination(s)> ] ] [ -p [ I<printer(s)> ] ] [ -r ] [ -R ] [ -s ] " ++"[ -t ] [ -u [ I<user(s)> ] ] [ -v [ I<printer(s)> ] ]" ++msgstr "" ++"B<lpstat> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] [ -W " ++"I<travaux> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -d ] [ -" ++"o [ I<destination(s)> ] ] [ -p [ I<imprimante(s)> ] ] [ -r ] [ -R ] [ -s ] " ++"[ -t ] [ -u [ I<utilisateur(s)> ] ] [ -v [ I<imprimante(s)> ] ]" ++ ++# type: Plain text ++#: lpstat.man:43 ++msgid "" ++"I<lpstat> displays status information about the current classes, jobs, and " ++"printers. When run with no arguments, I<lpstat> will list jobs queued by the " ++"current user." ++msgstr "" ++"B<lpstat> affiche l'état des classes, travaux et imprimantes. Quand " ++"B<lpstat> est lancé sans arguments, la liste des travaux en attente de " ++"l'utilisateur est affichée." ++ ++# type: Plain text ++#: lpstat.man:45 ++msgid "The I<lpstat> command supports the following options:" ++msgstr "B<lpstat> gère les options suivantes :" ++ ++# type: TP ++#: lpstat.man:49 ++#, no-wrap ++msgid "-R" ++msgstr "B<-R>" ++ ++# type: Plain text ++#: lpstat.man:53 ++msgid "Shows the ranking of print jobs." ++msgstr "Afficher le rang des travaux d'impression." ++ ++# type: TP ++#: lpstat.man:57 ++#, no-wrap ++msgid "-W which-jobs" ++msgstr "B<-W> I<travaux>" ++ ++# type: Plain text ++#: lpstat.man:65 ++msgid "" ++"Specifies which jobs to show, I<completed> or I<not-completed> (the " ++"default). This option I<must> appear before the I<-o> option and/or any " ++"printer names, otherwise the default (not-completed) value will be used in " ++"the request to the scheduler." ++msgstr "" ++"Indiquer quels travaux afficher : B<completed> (les travaux terminés) ou " ++"B<not-completed> (les travaux non terminés, par défaut). Cette option " ++"I<doit> être précisée avant l'option B<-o> et/ou des noms d'imprimantes, " ++"sinon la valeur par défaut (« B<not-completed> ») sera utilisée pour la " ++"requête à l'ordonnanceur." ++ ++# type: TP ++#: lpstat.man:65 ++#, no-wrap ++msgid "-a [printer(s)]" ++msgstr "B<-a> [I<imprimante(s)>]" ++ ++# type: Plain text ++#: lpstat.man:70 ++msgid "" ++"Shows the accepting state of printer queues. If no printers are specified " ++"then all printers are listed." ++msgstr "" ++"Afficher si les files d'attente des imprimantes acceptent les travaux " ++"d'impression. Si aucune imprimante n'est fournie dans la ligne de commande, " ++"toutes les imprimantes sont affichées." ++ ++# type: TP ++#: lpstat.man:70 ++#, no-wrap ++msgid "-c [class(es)]" ++msgstr "B<-c> [I<classe(s)>]" ++ ++# type: Plain text ++#: lpstat.man:75 ++msgid "" ++"Shows the printer classes and the printers that belong to them. If no " ++"classes are specified then all classes are listed." ++msgstr "" ++"Afficher la classe d'imprimantes et ses imprimantes associées. Si aucune " ++"classe n'est fournie dans la ligne de commande, toutes les classes sont " ++"affichées." ++ ++# type: TP ++#: lpstat.man:75 ++#, no-wrap ++msgid "-d" ++msgstr "B<-d>" ++ ++# type: Plain text ++#: lpstat.man:79 ++msgid "Shows the current default destination." ++msgstr "Affiche la destination par défaut." ++ ++# type: Plain text ++#: lpstat.man:87 ++msgid "Shows a long listing of printers, classes, or jobs." ++msgstr "" ++"Afficher une liste détaillée des imprimantes, classes et travaux " ++"d'impression." ++ ++# type: TP ++#: lpstat.man:87 ++#, no-wrap ++msgid "-o [destination(s)]" ++msgstr "B<-o> [I<destination(s)>]" ++ ++# type: Plain text ++#: lpstat.man:92 ++msgid "" ++"Shows the jobs queue on the specified destinations. If no destinations are " ++"specified all jobs are shown." ++msgstr "" ++"Afficher la file d'attente des travaux des destinations spécifiées. Si " ++"aucune destination n'est fournie dans la ligne de commande, tous les travaux " ++"sont affichés." ++ ++# type: TP ++#: lpstat.man:92 ++#, no-wrap ++msgid "-p [printer(s)]" ++msgstr "B<-p> [I<imprimante(s)>]" ++ ++# type: Plain text ++#: lpstat.man:97 ++msgid "" ++"Shows the printers and whether or not they are enabled for printing. If no " ++"printers are specified then all printers are listed." ++msgstr "" ++"Afficher les imprimantes et indiquer si elles sont prêtes ou non à " ++"l'impression. Si aucune imprimante n'est fournie dans la ligne de commande, " ++"toutes les imprimantes sont listées." ++ ++# type: Plain text ++#: lpstat.man:101 ++msgid "Shows whether the CUPS server is running." ++msgstr "Afficher si le serveur CUPS est actif." ++ ++# type: Plain text ++#: lpstat.man:108 ++msgid "" ++"Shows a status summary, including the default destination, a list of classes " ++"and their member printers, and a list of printers and their associated " ++"devices. This is equivalent to using the \"-d\", \"-c\", and \"-v\" options." ++msgstr "" ++"Afficher un résumé de l'état, comprenant la destination par défaut, la liste " ++"des classes et leurs imprimantes associées, la liste des imprimantes et leur " ++"périphérique. Ceci est équivalent à utiliser les options « B<-d> », « B<-c> » " ++"et « B<-p> »." ++ ++# type: TP ++#: lpstat.man:108 ++#, no-wrap ++msgid "-t" ++msgstr "B<-t>" ++ ++# type: Plain text ++#: lpstat.man:113 ++msgid "" ++"Shows all status information. This is equivalent to using the \"-r\", \"-d" ++"\", \"-c\", \"-v\", \"-a\", \"-p\", and \"-o\" options." ++msgstr "" ++"Affiche toutes les informations. Ceci peut être effectué en utilisant les " ++"options « B<-r> », « B<-d> », « B<-c> », « B<-d> », « B<-v> », « B<-a> », « B<-p> » " ++"et « B<-o> »." ++ ++# type: TP ++#: lpstat.man:113 ++#, no-wrap ++msgid "-u [user(s)]" ++msgstr "B<-u> [I<utilisateur(s)>]" ++ ++# type: Plain text ++#: lpstat.man:118 ++msgid "" ++"Shows a list of print jobs queued by the specified users. If no users are " ++"specified, lists the jobs queued by the current user." ++msgstr "" ++"Afficher les travaux d'impression en attente pour un utilisateur. Si aucun " ++"utilisateur n'est fourni dans la ligne de commande, afficher les travaux de " ++"l'utilisateur qui lance la commande." ++ ++# type: TP ++#: lpstat.man:118 ++#, no-wrap ++msgid "-v [printer(s)]" ++msgstr "B<-v> [I<imprimante(s)>]" ++ ++# type: Plain text ++#: lpstat.man:123 ++msgid "" ++"Shows the printers and what device they are attached to. If no printers are " ++"specified then all printers are listed." ++msgstr "" ++"Afficher les imprimantes et à quel matériel elles sont rattachées. Si aucune " ++"imprimante n'est fournie sur la ligne de commande, toutes les imprimantes " ++"sont affichées." ++ ++# type: Plain text ++#: lpstat.man:127 ++msgid "" ++"Unlike the System V printing system, CUPS allows printer names to contain " ++"any printable character except SPACE, TAB, \"/\", and \"#\". Also, printer " ++"and class names are I<not> case-sensitive." ++msgstr "" ++"Contrairement au système d'impression System V, CUPS permet des noms " ++"d'imprimantes contenant tout caractère imprimable sauf ESPACE, TABULATION, " ++"« / » et « # ». De plus, les noms d'imprimante et de classe d'imprimante ne " ++"sont pas sensibles à la casse." ++ ++# type: Plain text ++#: lpstat.man:129 ++msgid "The \"-h\", \"-E\", \"-U\", and \"-W\" options are unique to CUPS." ++msgstr "" ++"Les options « B<-h> », « B<-E> », « B<-U> » et « B<-W> » sont spécifiques à CUPS." ++ ++# type: Plain text ++#: lpstat.man:131 ++msgid "The Solaris \"-f\", \"-P\", and \"-S\" options are silently ignored." ++msgstr "Les options « B<-f> », « B<-P> » et « B<-S> » de Solaris sont ignorées." ++ ++# type: TH ++#: mailto.conf.man:15 ++#, no-wrap ++msgid "mailto.conf" ++msgstr "mailto.conf" ++ ++# type: TH ++#: mailto.conf.man:15 ++#, no-wrap ++msgid "12 July 2006" ++msgstr "12 juillet 2006" ++ ++# type: Plain text ++#: mailto.conf.man:18 ++msgid "mailto.conf - configuration file for cups email notifier" ++msgstr "" ++"mailto.conf - Fichier de configuration pour les notifications par courier " ++"électronique de CUPS" ++ ++# type: Plain text ++#: mailto.conf.man:21 ++msgid "" ++"The I<mailto.conf> file defines the local mail server and email notification " ++"preferences for CUPS." ++msgstr "" ++"Le fichier I<mailto.conf> configure le serveur de courriers et les " ++"notifications par courrier électronique pour CUPS." ++ ++# type: TP ++#: mailto.conf.man:25 ++#, no-wrap ++msgid "Cc I<cc-address@domain.com>" ++msgstr "Cc I<adresse_copie@domaine.com>" ++ ++# type: Plain text ++#: mailto.conf.man:29 ++msgid "Specifies an additional recipient for all email notifications." ++msgstr "" ++"Spécifier une adresse supplémentaire à laquelle les notifications par " ++"courier électronique seront envoyées." ++ ++# type: TP ++#: mailto.conf.man:29 ++#, no-wrap ++msgid "From I<from-address@domain.com>" ++msgstr "From I<adresse_émetteur@domaine.com>" ++ ++# type: Plain text ++#: mailto.conf.man:33 ++msgid "Specifies the sender of email notifications." ++msgstr "Spécifier l'émetteur des notifications par courier électronique." ++ ++# type: Plain text ++#: mailto.conf.man:33 ++#, no-wrap ++msgid "Sendmail I<sendmail command and options>" ++msgstr "Sendmail I<commande sendmail et options>" ++ ++# type: Plain text ++#: mailto.conf.man:40 ++msgid "" ++"Specifies the sendmail command to use when sending email notifications. Only " ++"one I<Sendmail> or I<SMTPServer> line may be present in the I<mailto.conf> " ++"file. If multiple lines are present, only the last one is used." ++msgstr "" ++"Spécifier la commande sendmail à utiliser pour l'envoie des courriers de " ++"notifications. Seule une ligne B<Sendmail> ou B<SMTPServer> peut être " ++"présente dans le fichier I<mailto.conf>. Si plusieurs lignes sont présentes, " ++"seule la dernière est prise en compte." ++ ++# type: TP ++#: mailto.conf.man:40 ++#, no-wrap ++msgid "SMTPServer I<servername>" ++msgstr "SMTPServer I<nom_serveur>" ++ ++# type: Plain text ++#: mailto.conf.man:47 ++msgid "" ++"Specifies a SMTP server to send email notifications to. Only one I<Sendmail> " ++"or I<SMTPServer> line may be present in the I<mailto.conf> file. If multiple " ++"lines are present, only the last one is used." ++msgstr "" ++"Spécifier le serveur SMTP à utiliser pour l'envoie des courriers de " ++"notifications. Seule une ligne B<Sendmail> ou B<SMTPServer> peut être " ++"présente dans le fichier I<mailto.conf>. Si plusieurs lignes sont présentes, " ++"seule la dernière est prise en compte." ++ ++# type: TP ++#: mailto.conf.man:47 ++#, no-wrap ++msgid "Subject I<subject-prefix>" ++msgstr "Subject I<préfix_sujet>" ++ ++# type: Plain text ++#: mailto.conf.man:51 ++msgid "" ++"Specifies a prefix string for the subject line of an email notification." ++msgstr "Utiliser un préfixe dans les sujets des courriers de notification." ++ ++# type: Plain text ++#: mailto.conf.man:54 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, I<printers.conf(5)>," ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." ++"types>(5), B<printers.conf>(5)," ++ ++# type: TH ++#: mime.convs.man:15 ++#, no-wrap ++msgid "mime.convs" ++msgstr "mime.convs" ++ ++# type: Plain text ++#: mime.convs.man:18 ++msgid "mime.convs - mime type conversion file for cups" ++msgstr "mime.convs - Fichier de conversion des types MIME pour CUPS." ++ ++# type: Plain text ++#: mime.convs.man:23 ++msgid "" ++"The I<mime.convs> file defines the filters that are available for converting " ++"files from one format to another. The standard filters support text, PDF, " ++"PostScript, HP-GL/2, and many types of image files." ++msgstr "" ++"Le fichier I<mime.convs> définit les filtres disponibles pour convertir des " ++"fichiers d'un format vers un autre. Les filtres standards concernent les " ++"fichiers textes, PDF, PostScript, HP-GL/2 ainsi que de nombreux formats " ++"graphiques." ++ ++# type: Plain text ++#: mime.convs.man:26 ++msgid "" ++"Additional filters can be added to the I<mime.convs> file or (preferably) to " ++"other files in the CUPS configuration directory." ++msgstr "" ++"Des filtres supplémentaires peuvent être ajoutés dans le fichier I<mime." ++"convs> ou (de préférence) dans d'autres fichiers du répertoire de " ++"configuration de CUPS." ++ ++# type: Plain text ++#: mime.convs.man:31 ++msgid "" ++"Each line in the I<mime.convs> file is a comment, blank, or filter line. " ++"Comment lines start with the # character. Filter lines specify the source " ++"and destination MIME types along with a relative cost associated with the " ++"filter and the filter to run:" ++msgstr "" ++"Chaque ligne du fichier I<mime.convs> est un commentaire, une ligne vide ou " ++"une définition de filtre. Les commentaires commencent par le caractère #. " ++"Les lignes contenant un filtre spécifient les types MIME source et cible, le " ++"coût du filtre, puis le filtre lui-même :" ++ ++# type: Plain text ++#: mime.convs.man:36 ++#, no-wrap ++msgid "" ++"super/type super/type cost filter\n" ++"application/postscript application/vnd.cups-raster 50 pstoraster\n" ++msgstr "" ++"super/type super/type coût filtre\n" ++"application/postscript application/vnd.cups-raster 50 pstoraster\n" ++ ++# type: Plain text ++#: mime.convs.man:40 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " ++"I<printers.conf(5)>," ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.types>(5), " ++"B<printers.conf>(5)," ++ ++# type: TH ++#: mime.types.man:15 ++#, no-wrap ++msgid "mime.types" ++msgstr "mime.types" ++ ++# type: Plain text ++#: mime.types.man:18 ++msgid "mime.types - mime type description file for cups" ++msgstr "mime.types - Fichier de description des types MIME de CUPS." ++ ++# type: Plain text ++#: mime.types.man:20 ++msgid "The I<mime.types> file defines the recognized file types." ++msgstr "" ++"Le fichier I<mime.types> définit les types de fichier reconnus par CUPS." ++ ++# type: Plain text ++#: mime.types.man:24 ++msgid "" ++"Additional file types can be added to I<mime.types> or (preferably) in " ++"additional files in the CUPS configuration directory with the extension \"." ++"types\"." ++msgstr "" ++"D'autres types de fichiers peuvent être ajoutés au fichier I<mime.types> ou " ++"(de préférence) à d'autres fichier dans le répertoire de configuration de " ++"CUPS, avec l'extension « .types »." ++ ++# type: Plain text ++#: mime.types.man:30 ++msgid "" ++"Each line in the I<mime.types> file is a comment, blank, or rule line. " ++"Comment lines start with the # character. Rule lines start with the MIME " ++"type name and are optionally followed by a series of file recognition rules " ++"that are used to automatically identify print and web files:" ++msgstr "" ++"Chaque ligne du fichier I<mime.types> est soit un commentaire, soit une " ++"ligne vide, soit une règle. Les lignes définissant une règle commencent par " ++"le nom du type MIME et peuvent être suivies par une liste de règles de " ++"reconnaissance utilisées pour déterminer automatiquement le type du fichier :" ++ ++# type: Plain text ++#: mime.types.man:34 ++#, no-wrap ++msgid " super/type rule [ ... ruleN]\n" ++msgstr " super/type règle [ ... règleN]\n" ++ ++# type: Plain text ++#: mime.types.man:38 ++msgid "" ++"The rules may be grouped using parenthesis, joined using \"+\" for a logical " ++"AND and \",\" or whitespace for a logical OR, and negated using \"!\"." ++msgstr "" ++"Ces règles doivent être mises entre parenthèses, liées par un « + » pour " ++"exprimer un ET logique, « , » ou une espace pour exprimer un OU logique. " ++"Elles sont précédées de « ! » pour exprimer un NON logique." ++ ++# type: SH ++#: mime.types.man:38 ++#, no-wrap ++msgid "RULES" ++msgstr "RÈGLES" ++ ++# type: Plain text ++#: mime.types.man:41 ++msgid "" ++"Rules take two forms - a filename extension by itself and functions with " ++"test values inside parenthesis. The following functions are available:" ++msgstr "" ++"Les règles sont composées de deux parties : une extension de fichier et des " ++"fonctions de test entre parenthèses. Les fonctions suivantes peuvent être " ++"utilisées :" ++ ++# type: TP ++#: mime.types.man:41 ++#, no-wrap ++msgid "match(\"pattern\")" ++msgstr "match(\"motif\")" ++ ++# type: Plain text ++#: mime.types.man:45 ++msgid "Pattern match on filename" ++msgstr "Reconnaissance d'un motif sur le nom du fichier" ++ ++# type: TP ++#: mime.types.man:45 ++#, no-wrap ++msgid "ascii(offset,length)" ++msgstr "ascii(début, longueur)" ++ ++# type: Plain text ++#: mime.types.man:49 ++msgid "True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)" ++msgstr "" ++"Vrai si tous les octets sont des caractères ASCII valables (CR, NL, TAB, BS, " ++"32-126)." ++ ++# type: TP ++#: mime.types.man:49 ++#, no-wrap ++msgid "printable(offset,length)" ++msgstr "printable(début, longueur)" ++ ++# type: Plain text ++#: mime.types.man:53 ++msgid "" ++"True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)" ++msgstr "" ++"Vrai si tous les octets sont des caractères 8 bits imprimables (CR, NL, TAB, " ++"BS, 32-126, 128-254)." ++ ++# type: TP ++#: mime.types.man:53 ++#, no-wrap ++msgid "string(offset,\"string\")" ++msgstr "string(début, \"chaîne\")" ++ ++# type: Plain text ++#: mime.types.man:57 ++msgid "True if bytes are identical to string" ++msgstr "Vrai si les octets sont identiques à « chaîne »" ++ ++# type: TP ++#: mime.types.man:57 ++#, no-wrap ++msgid "istring(offset,\"string\")" ++msgstr "istring(début, \"chaîne\")" ++ ++# type: Plain text ++#: mime.types.man:61 ++msgid "True if a case-insensitive comparison of the bytes is identical" ++msgstr "Vrai si les octets sont identiques, sans prendre en compte la casse." ++ ++# type: TP ++#: mime.types.man:61 ++#, no-wrap ++msgid "char(offset,value)" ++msgstr "char(début, valeur)" ++ ++# type: Plain text ++#: mime.types.man:65 ++msgid "True if byte is identical" ++msgstr "Vrai si les octets sont identiques." ++ ++# type: TP ++#: mime.types.man:65 ++#, no-wrap ++msgid "short(offset,value)" ++msgstr "short(début, valeur)" ++ ++# type: Plain text ++#: mime.types.man:69 ++msgid "True if 16-bit integer is identical" ++msgstr "Vrai si les nombres entiers (16 bits) sont identiques." ++ ++# type: TP ++#: mime.types.man:69 ++#, no-wrap ++msgid "int(offset,value)" ++msgstr "int(début, valeur)" ++ ++# type: Plain text ++#: mime.types.man:73 ++msgid "True if 32-bit integer is identical" ++msgstr "Vrai si les nombres entiers (32 bits) sont identiques." ++ ++# type: TP ++#: mime.types.man:73 ++#, no-wrap ++msgid "locale(\"string\")" ++msgstr "locale(\"chaîne\")" ++ ++# type: Plain text ++#: mime.types.man:77 ++msgid "True if current locale matches string" ++msgstr "Vrai si les définitions de langage sont identiques." ++ ++# type: TP ++#: mime.types.man:77 ++#, no-wrap ++msgid "contains(offset,range,\"string\")" ++msgstr "contains(début, portée, \"chaîne\")" ++ ++# type: Plain text ++#: mime.types.man:81 ++msgid "True if the range contains the string" ++msgstr "Vrai si la chaîne est trouvée dans la portion précisée." ++ ++# type: SH ++#: mime.types.man:81 ++#, no-wrap ++msgid "STRING CONSTANTS" ++msgstr "CHAÎNES DE CARACTÈRES" ++ ++# type: Plain text ++#: mime.types.man:85 ++msgid "" ++"String constants can be specified inside quotes (\"\") for strings " ++"containing whitespace and angle brackets (E<lt>E<gt>) for hexadecimal " ++"strings." ++msgstr "" ++"Les chaînes de caractères peuvent être définies entre guillemets (\"\") pour " ++"des chaînes contenant des espaces ou entre crochets (E<lt>E<gt>) pour des " ++"chaînes en hexadécimal." ++ ++# type: Plain text ++#: mime.types.man:88 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " ++"I<printers.conf(5)>," ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), " ++"B<printers.conf>(5)," ++ ++# type: TH ++#: printers.conf.man:15 ++#, no-wrap ++msgid "printers.conf" ++msgstr "printers.conf" ++ ++# type: Plain text ++#: printers.conf.man:18 ++msgid "printers.conf - printer configuration file for cups" ++msgstr "printers.conf - Fichier de configuration des imprimantes CUPS." ++ ++# type: Plain text ++#: printers.conf.man:23 ++msgid "" ++"The I<printers.conf> file defines the local printers that are available. It " ++"is normally located in the I</etc/cups> directory and is generated " ++"automatically by the I<cupsd(8)> program when printers are added or deleted." ++msgstr "" ++"Le fichier I<printers.conf> définit les imprimantes locales disponibles. Il " ++"est habituellement situé dans le répertoire I</etc/cups> et est généré " ++"automatiquement par le programme B<cupsd>(8) lors de l'ajout ou de la " ++"suppression d'imprimantes." ++ ++# type: TP ++#: printers.conf.man:27 ++#, no-wrap ++msgid "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" ++msgstr "E<lt>Printer nomE<gt> ... E<lt>/PrinterE<gt>" ++ ++# type: Plain text ++#: printers.conf.man:31 ++msgid "Defines a specific printer." ++msgstr "Définir une certaine imprimante." ++ ++# type: TP ++#: printers.conf.man:31 ++#, no-wrap ++msgid "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" ++msgstr "E<lt>DefaultPrinter nomE<gt> ... E<lt>/PrinterE<gt>" ++ ++# type: Plain text ++#: printers.conf.man:35 ++msgid "Defines a default printer." ++msgstr "Définir une imprimante par défaut." ++ ++# type: TP ++#: printers.conf.man:49 ++#, no-wrap ++msgid "DeviceURI uri" ++msgstr "DeviceURI uri" ++ ++# type: Plain text ++#: printers.conf.man:53 ++msgid "Specifies the device URI for a printer." ++msgstr "Spécifier l'URI de périphérique d'une imprimante." ++ ++# type: TP ++#: printers.conf.man:85 ++#, no-wrap ++msgid "PortMonitor monitor" ++msgstr "PortMonitor moniteur" ++ ++# type: Plain text ++#: printers.conf.man:89 ++msgid "Specifies the port monitor for a printer." ++msgstr "Spécifier le moniteur de port pour l'imprimante." ++ ++# type: Plain text ++#: printers.conf.man:116 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>," ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." ++"types>(5)," ++ ++# type: TH ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "subscriptions.conf" ++msgstr "subscriptions.conf" ++ ++# type: TH ++#: subscriptions.conf.man:15 ++#, no-wrap ++msgid "30 April 2006" ++msgstr "30 avril 2006" ++ ++# type: Plain text ++#: subscriptions.conf.man:18 ++msgid "subscriptions.conf - subscriptions file for cups" ++msgstr "subscriptions.conf - Fichier des abonnements pour CUPS" ++ ++# type: Plain text ++#: subscriptions.conf.man:23 ++msgid "" ++"The I<subscriptions.conf> file defines the local subscriptions that are " ++"active. It is normally located in the I</etc/cups> directory and is " ++"generated automatically by the I<cupsd(8)> program when subscriptions are " ++"created, renewed, or cancelled." ++msgstr "" ++"Le fichier I<subscriptions.conf> définit les abonnements locaux actifs. Il " ++"est habituellement situé dans le répertoire I</etc/cups> et est généré " ++"automatiquement par le programme B<cupsd>(8) lors de l'ajout, le " ++"renouvellement ou l'annulation d'abonnements." ++ ++# type: TP ++#: subscriptions.conf.man:27 ++#, no-wrap ++msgid "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" ++msgstr "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" ++ ++# type: Plain text ++#: subscriptions.conf.man:31 ++msgid "Defines a subscription." ++msgstr "Définir un abonnement." ++ ++# type: TP ++#: subscriptions.conf.man:31 ++#, no-wrap ++msgid "Events name [ ... name ]" ++msgstr "Events nom [ ... nom ]" ++ ++# type: Plain text ++#: subscriptions.conf.man:35 ++msgid "Specifies the events that are subscribed." ++msgstr "Définir les événements auquels on s'abonne." ++ ++# type: TP ++#: subscriptions.conf.man:35 ++#, no-wrap ++msgid "ExpirationTime unix-time" ++msgstr "ExpirationTime temps_UNIX" ++ ++# type: Plain text ++#: subscriptions.conf.man:40 ++msgid "" ++"Specifies the expiration time of a subscription as a UNIX time value in " ++"seconds since January 1st, 1970." ++msgstr "" ++"Définir la date d'expiration d'un abonnement. La date est indiquée en " ++"utilisant le temps UNIX, c'est-à-dire en exprimée en secondes depuis le 1er " ++"janvier 1970." ++ ++# type: TP ++#: subscriptions.conf.man:40 ++#, no-wrap ++msgid "Interval seconds" ++msgstr "Interval secondes" ++ ++# type: Plain text ++#: subscriptions.conf.man:45 ++msgid "" ++"Specifies the preferred time interval for event notifications in seconds." ++msgstr "Définir l'intervalle voulu entre les notifications, en secondes." ++ ++# type: TP ++#: subscriptions.conf.man:45 ++#, no-wrap ++msgid "JobId job-id" ++msgstr "JobId id_travail" ++ ++# type: Plain text ++#: subscriptions.conf.man:49 ++msgid "Specifies the job ID associated with the subscription." ++msgstr "Indiquer l'identifiant de travail associé avec l'abonnement." ++ ++# type: TP ++#: subscriptions.conf.man:49 ++#, no-wrap ++msgid "LeaseDuration seconds" ++msgstr "LeaseDuration secondes" ++ ++# type: Plain text ++#: subscriptions.conf.man:54 ++msgid "" ++"Specifies the number of seconds that the subscription is valid for. If 0, " ++"the subscription does not expire." ++msgstr "" ++"Indiquer le nombre de secondes pendants lesquelles l'abonnement sera " ++"valable. 0 permet aux abonnement de ne pas expirer." ++ ++# type: TP ++#: subscriptions.conf.man:54 ++#, no-wrap ++msgid "NextEventId number" ++msgstr "NextEventId numéro" ++ ++# type: Plain text ++#: subscriptions.conf.man:59 ++msgid "Specifies the next notify-sequence-number to use for the subscription." ++msgstr "Spécifier le prochain numéro de séquence à utiliser pour l'abonnement." ++ ++# type: TP ++#: subscriptions.conf.man:59 ++#, no-wrap ++msgid "NextSubscriptionId number" ++msgstr "NextSubscriptionId nombre" ++ ++# type: Plain text ++#: subscriptions.conf.man:63 ++msgid "Specifies the next subscription-id to use." ++msgstr "Indiquer le prochain identifiant d'abonnement à utiliser." ++ ++# type: TP ++#: subscriptions.conf.man:63 ++#, no-wrap ++msgid "Owner username" ++msgstr "Owner utilisateur" ++ ++# type: Plain text ++#: subscriptions.conf.man:67 ++msgid "Specifies the user that owns the subscription." ++msgstr "Indiquer le propriétaire de l'abonnement." ++ ++# type: TP ++#: subscriptions.conf.man:67 ++#, no-wrap ++msgid "PrinterName printername" ++msgstr "PrinterName imprimante" ++ ++# type: Plain text ++#: subscriptions.conf.man:71 ++msgid "Specifies the printer or class associated with the subscription." ++msgstr "Indiquer l'imprimante ou la classe associée à l'abonnement." ++ ++# type: TP ++#: subscriptions.conf.man:71 ++#, no-wrap ++msgid "Recipient uri" ++msgstr "Recipient uri" ++ ++# type: Plain text ++#: subscriptions.conf.man:75 ++msgid "Specifies the notify-recipient-uri value for push-type notifications." ++msgstr "" ++"Spécifier l'uri recevant les notifications pour les notifications de type " ++"push (envoi)." ++ ++# type: TP ++#: subscriptions.conf.man:75 ++#, no-wrap ++msgid "UserData hex-escaped-data" ++msgstr "UserData donnée_hexa_protégées" ++ ++# type: Plain text ++#: subscriptions.conf.man:80 ++msgid "" ++"Specifies user data to be included in event notifications. This is typically " ++"the \"from\" address in mailto: notifications." ++msgstr "" ++"Spécifier des données utilisateur à inclure dans les notifications " ++"d'événement. C'est typiquement l'adresse émettrice des mails de " ++"notifications." ++ ++# type: Plain text ++#: subscriptions.conf.man:83 ++msgid "" ++"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." ++"types(5)>, printers.conf(5)" ++msgstr "" ++"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." ++"types>(5), B<printers.conf>(5)" ++ ++# type: TH ++#~ msgid "11 February 2006" ++#~ msgstr "11 février 2006" ++ ++# type: TP ++#~ msgid "HostNameLookups Yes" ++#~ msgstr "HostNameLookups Yes" ++ ++# type: TP ++#~ msgid "HostNameLookups No" ++#~ msgstr "HostNameLookups No" ++ ++# type: TH ++#~ msgid "Easy Software Products" ++#~ msgstr "Easy Software Products" ++ ++# type: Plain text ++#~ msgid "Copyright 1997-2006 by Easy Software Products, All Rights Reserved." ++#~ msgstr "Copyright 1997-2006 Easy Software Products, Tous droits réservés." ++ ++# type: Plain text ++#~ msgid "Copyright 2006 by Easy Software Products, All Rights Reserved." ++#~ msgstr "Copyright 2006 Easy Software Products, Tous droits réservés." ++ ++# type: TH ++#~ msgid "13 July 2006" ++#~ msgstr "13 juillet 2006" ++ ++# #-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-# ++# type: TP ++# #-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-# ++# type: Plain text ++# #-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-# ++# type: TP ++#, fuzzy ++#~ msgid "TBD1" ++#~ msgstr "" ++#~ "#-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "RunAsUser\n" ++#~ "#-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "/path/to/cups/daemon est habituellement /usr/lib/cups/daemon ou /usr/" ++#~ "libexec/cups/daemon, suivant votre système d'exploitation. Vous pouvez " ++#~ "trouver cette information dans le fichier cupsd.conf.\n" ++#~ "#-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "-W [I<quels-travaux>]" ++ ++# type: Plain text ++#, fuzzy ++#~ msgid "TBD2" ++#~ msgstr "" ++#~ "#-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "Définit si l'ordonnanceur doit être lancé en tant qu'utilisateur, dont le " ++#~ "nom doit être défini par la directive «\\ User\\ ».\n" ++#~ "#-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "Définit quels sont les travaux à afficher, terminés («\\ I<completed>\\ ») " ++#~ "ou en cours («\\ I<not-completed>\\ »), qui est l'option par défaut. Cette " ++#~ "option B<doit> doit se trouver dans la ligne de commandes avant l'option " ++#~ "I<-o> et tout nom d'imprimante. Dans le cas contraire, la valeur par " ++#~ "défaut («\\ I<not-completed>\\ ») sera envoyée à l'ordonnanceur." ++ ++# type: Plain text ++#, fuzzy ++#~ msgid "TBD10" ++#~ msgstr "" ++#~ "#-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "Dans cet exemple, le format du document est réinitialisé à la valeur " ++#~ "I<application/octet-stream>, ce qui force l'auto-détection du type de " ++#~ "fichier.\n" ++#~ "#-#-#-#-# lpq.1.po (PACKAGE VERSION) #-#-#-#-#\n" ++#~ "Pour chaque job soumis (à la suite d'un appel à lpr(1)) B<lpq> affiche le " ++#~ "nom de l'utilisateur, le rang actuel dans la file d'attente, le nom des " ++#~ "fichiers constituant le job, l'identificateur du job (un nombre qui doit " ++#~ "être fourni à lprm(1) pour annuler le job), et la taille totale en " ++#~ "octets. L'ordre de classement des jobs dépend de l'algorithme utilisé " ++#~ "pour consulter le répertoire de spool, il est supposé que c'est un ordre " ++#~ "FIFO (First In First Out). Les noms des fichiers constituant un job " ++#~ "peuvent être indisponibles (quand lpr(1) est utilisé comme puits dans un " ++#~ "pipeline) auquel cas le fichier est désigné par ``(standard input)''." ++ ++# type: Plain text ++#, fuzzy ++#~ msgid "TBD11" ++#~ msgstr "" ++#~ "Si B<lpq> prévient s'il n'y a pas de démon présent (ceci indique un " ++#~ "défaut de fonctionnement de la chaîne d'impression), la commande lpc(8) " ++#~ "permet de relancer le démon d'impression." diff --git a/debian/patches/no-conffile-timestamp.patch b/debian/patches/no-conffile-timestamp.patch new file mode 100644 index 0000000..8336376 --- /dev/null +++ b/debian/patches/no-conffile-timestamp.patch @@ -0,0 +1,60 @@ +Description: Disable time stamps in conffiles, to avoid ever-changing files in /etc. +Author: Joey Hess <joeyh@debian.org> +Bug: http://www.cups.org/str.php?L3067 +Bug-Debian: http://bugs.debian.org/549673 + +--- a/scheduler/classes.c ++++ b/scheduler/classes.c +@@ -717,7 +717,7 @@ + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n"); +- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); ++ cupsFilePrintf(fp, "# Written by cupsd\n"); + cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); + + /* +--- a/scheduler/dirsvc.c ++++ b/scheduler/dirsvc.c +@@ -792,7 +792,7 @@ + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Remote cache file for " CUPS_SVERSION "\n"); +- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); ++ cupsFilePrintf(fp, "# Written by cupsd\n"); + + /* + * Write each local printer known to the system... +--- a/scheduler/job.c ++++ b/scheduler/job.c +@@ -2033,7 +2033,7 @@ + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); +- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); ++ cupsFilePrintf(fp, "# Written by cupsd\n", temp); + cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); + + /* +--- a/scheduler/printers.c ++++ b/scheduler/printers.c +@@ -1551,7 +1551,7 @@ + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n"); +- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); ++ cupsFilePrintf(fp, "# Written by cupsd\n"); + cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); + + /* +--- a/scheduler/subscriptions.c ++++ b/scheduler/subscriptions.c +@@ -1108,7 +1108,7 @@ + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n"); +- cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); ++ cupsFilePrintf(fp, "# Written by cupsd\n"); + + cupsFilePrintf(fp, "NextSubscriptionId %d\n", NextSubscriptionId); + diff --git a/debian/patches/pidfile.patch b/debian/patches/pidfile.patch new file mode 100644 index 0000000..a5fd28c --- /dev/null +++ b/debian/patches/pidfile.patch @@ -0,0 +1,110 @@ +Description: Add support for creating pid files. +Author: Maritn Pitt <mpitt@debian.org> +Bug: http://www.cups.org/str.php?L2465 + +--- a/scheduler/conf.c ++++ b/scheduler/conf.c +@@ -184,7 +184,8 @@ + { "TempDir", &TempDir, CUPSD_VARTYPE_PATHNAME }, + { "Timeout", &Timeout, CUPSD_VARTYPE_INTEGER }, + { "UseNetworkDefault", &UseNetworkDefault, CUPSD_VARTYPE_BOOLEAN }, +- { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN } ++ { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }, ++ { "PidFile", &PidFile, CUPSD_VARTYPE_STRING } + }; + #define NUM_VARS (sizeof(variables) / sizeof(variables[0])) + +@@ -508,6 +509,7 @@ + cupsdSetStringf(&ServerHeader, "CUPS/%d.%d", CUPS_VERSION_MAJOR, + CUPS_VERSION_MINOR); + cupsdSetString(&StateDir, CUPS_STATEDIR); ++ cupsdSetString(&PidFile, "/opt/var/run/cups/cupsd.pid"); + + if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf")) + PrintcapFormat = PRINTCAP_SOLARIS; +--- a/scheduler/conf.h ++++ b/scheduler/conf.h +@@ -246,6 +246,8 @@ + VAR int SSLOptions VALUE(CUPSD_SSL_NONE); + /* SSL/TLS options */ + #endif /* HAVE_SSL */ ++VAR char *PidFile VALUE(NULL); ++ /* Debian CUPS pid file */ + + #ifdef HAVE_LAUNCHD + VAR int LaunchdTimeout VALUE(DEFAULT_KEEPALIVE); +--- a/scheduler/main.c ++++ b/scheduler/main.c +@@ -85,6 +85,8 @@ + static void sigterm_handler(int sig); + static long select_timeout(int fds); + static void usage(int status); ++int write_pid(void); ++int remove_pid(void); + + + /* +@@ -588,6 +590,11 @@ + } + #endif /* __sgi */ + ++ if (write_pid() == 0) { ++ cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write pid file"); ++ return (1); ++ } ++ + /* + * Initialize authentication certificates... + */ +@@ -1172,10 +1179,41 @@ + + cupsdStopSelect(); + ++ remove_pid(); ++ + return (!stop_scheduler); + } + + ++/* 'write_pid()' - Write PID file. ++ 'remove_pid()' - Delete PID file. ++*/ ++int ++write_pid() ++{ ++ FILE *f; ++ int fd; ++ int pid; ++ if (((fd = open(PidFile, O_RDWR|O_CREAT, 0644)) == -1) ++ || ((f = fdopen(fd, "r+")) == NULL) ) { ++ return 0; ++ } ++ pid = getpid(); ++ if (!fprintf(f, "%d\n", pid)) { ++ close(fd); ++ return 0; ++ } ++ fflush(f); ++ close(fd); ++ ++ return pid; ++} ++ ++int ++remove_pid() { ++ return unlink(PidFile); ++} ++ + /* + * 'cupsdAddString()' - Copy and add a string to an array. + */ +--- a/test/run-stp-tests.sh ++++ b/test/run-stp-tests.sh +@@ -351,6 +351,7 @@ + DocumentRoot $root/doc + RequestRoot /tmp/cups-$user/spool + TempDir /tmp/cups-$user/spool/temp ++PidFile /tmp/cups-$user/cupsd.pid + MaxSubscriptions 3 + MaxLogSize 0 + AccessLog /tmp/cups-$user/log/access_log diff --git a/debian/patches/ppd-poll-with-client-conf.patch b/debian/patches/ppd-poll-with-client-conf.patch new file mode 100644 index 0000000..c324e2b --- /dev/null +++ b/debian/patches/ppd-poll-with-client-conf.patch @@ -0,0 +1,23 @@ +Description: If an external server is used via client.conf and the DNS is inconsistent (ex: DNS gives "noname" for many IPs, reverse DNS gives one of these IPs for "noname") local PPDs can get polled for print queues instead of the PPDs of the external server +Bug: http://www.cups.org/str.php?L2763 + +--- a/cups/util.c ++++ b/cups/util.c +@@ -1078,11 +1078,13 @@ + http2 = http; + else if ((http2 = httpConnectEncrypt(hostname, port, + cupsEncryption())) == NULL) +- { +- DEBUG_puts("1cupsGetPPD3: Unable to connect to server"); ++ if ((http2 = httpConnectEncrypt(http_hostname, http_port, ++ cupsEncryption())) == NULL) ++ { ++ DEBUG_puts("1cupsGetPPD3: Unable to connect to server"); + +- return (HTTP_SERVICE_UNAVAILABLE); +- } ++ return (HTTP_SERVICE_UNAVAILABLE); ++ } + + /* + * Get a temp file... diff --git a/debian/patches/ppdc-dynamic-linking.patch b/debian/patches/ppdc-dynamic-linking.patch new file mode 100644 index 0000000..1b358f6 --- /dev/null +++ b/debian/patches/ppdc-dynamic-linking.patch @@ -0,0 +1,68 @@ +Description: Dynamically link ppdc, to work around segfault on mipsen. +Author: Sune Vuorela <debian@pusling.com> +Bug-Debian: http://bugs.debian.org/548246 + +--- a/ppdc/Makefile ++++ b/ppdc/Makefile +@@ -237,14 +237,14 @@ + # genstrings - generate GNU gettext strings. + # + +-genstrings: genstrings.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) \ ++genstrings: genstrings.o libcupsppdc.so ../cups/$(LIBCUPSSTATIC) \ + sample.drv ../data/media.defs + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o genstrings genstrings.o \ +- libcupsppdc.a ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \ ++ -lcupsppdc ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \ + $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Generating localization strings... +- ./genstrings >sample.c ++ LD_LIBRARY_PATH=.:../cups/ ./genstrings >sample.c + + + # +@@ -258,12 +258,12 @@ + + ppdc-static: ppdc.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) foo.drv foo-fr.po + echo Linking $@... +- $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdc-static ppdc.o libcupsppdc.a \ ++ $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdc-static ppdc.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Testing PPD compiler... +- ./ppdc-static -l en,fr -I ../data foo.drv +- ./ppdc-static -l en,fr -z -I ../data foo.drv ++ LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -l en,fr -I ../data foo.drv ++ LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -l en,fr -z -I ../data foo.drv + + + # +@@ -286,14 +286,14 @@ + + ppdi-static: ppdc-static ppdi.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... +- $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdi-static ppdi.o libcupsppdc.a \ ++ $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdi-static ppdi.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Testing PPD importer... + $(RM) -r ppd ppd2 sample-import.drv +- ./ppdc-static -I ../data sample.drv +- ./ppdi-static -I ../data -o sample-import.drv ppd/* +- ./ppdc-static -I ../data -d ppd2 sample-import.drv ++ LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -I ../data sample.drv ++ LD_LIBRARY_PATH=.:../cups/ ./ppdi-static -I ../data -o sample-import.drv ppd/* ++ LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -I ../data -d ppd2 sample-import.drv + if diff -r ppd ppd2 >/dev/null; then \ + echo PPD import OK; \ + else \ +@@ -326,7 +326,7 @@ + + testcatalog: testcatalog.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... +- $(CXX) $(LDFLAGS) -o $@ testcatalog.o libcupsppdc.a \ ++ $(CXX) $(LDFLAGS) -o $@ testcatalog.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + diff --git a/debian/patches/printer-filtering.patch b/debian/patches/printer-filtering.patch new file mode 100644 index 0000000..c9ff4e1 --- /dev/null +++ b/debian/patches/printer-filtering.patch @@ -0,0 +1,144 @@ +Description: Filter printers based on PRINTER_LIST +Author: Julien Desfossez at Revolution Linux + +=== modified file 'cups-1.3.9/cups/ipp.c' +--- a/cups/ipp.c ++++ b/cups/ipp.c +@@ -40,6 +40,7 @@ + * ippNewRequest() - Allocate a new IPP message. + * ippRead() - Read data for an IPP message from a HTTP + * connection. ++ * ippFilterPrinters() - Filter printer list based on an environment variable + * ippReadFile() - Read data for an IPP message from a file. + * ippReadIO() - Read data for an IPP message. + * ippTimeToDate() - Convert from UNIX time to RFC 1903 format. +@@ -987,6 +988,120 @@ + return (temp); + } + ++/* ++ * 'ippFilterPrinters()' - Filter printer list based on environment variables ++ */ ++ipp_state_t /* O - Current state */ ++ippFilterPrinters(ipp_t *ipp) /* I - IPP data */ ++{ ++ char *env_printer_list = NULL; ++ char *result_printer_list; ++ char delim_printers[] = ","; ++ char **printer_list_array; ++ char *default_printer_env; ++ int printer_list_size = 0; ++ ipp_attribute_t *filtertmpattr; ++ ipp_attribute_t *filtertmpattr2; ++ int i = 0; ++ int j = 0; ++ int found = 0; ++ int printer_name_found = 0; ++ int len = 0; ++ int last_null = 0; ++ ++ /* ++ * First we create an array from PRINTER and PRINTER_LIST ++ */ ++ if(getenv("PRINTER") != NULL) { ++ default_printer_env = getenv("PRINTER"); ++ printer_list_size++; ++ } else { ++ default_printer_env = (char *)malloc(sizeof(char)); ++ default_printer_env = ""; ++ } ++ ++ env_printer_list = strdup(getenv("PRINTER_LIST")); ++ result_printer_list = strtok(env_printer_list, delim_printers); ++ while(result_printer_list) { ++ if(default_printer_env && strcasecmp(result_printer_list, default_printer_env) != 0) ++ printer_list_size++; ++ result_printer_list = strtok( NULL, delim_printers); ++ } ++ ++ printer_list_array = (char **)malloc(printer_list_size * sizeof(char *)); ++ ++ env_printer_list = strdup(getenv("PRINTER_LIST")); ++ ++ result_printer_list = strtok(env_printer_list, delim_printers); ++ while(result_printer_list) { ++ /* ++ * Don't add the default printer if it's defined ++ */ ++ if(strcasecmp(result_printer_list, default_printer_env) != 0) { ++ printer_list_array[i] = (char *)malloc(sizeof(result_printer_list)); ++ printer_list_array[i++] = result_printer_list; ++ } ++ result_printer_list = strtok( NULL, delim_printers); ++ } ++ ++ if(strcasecmp(default_printer_env, "") != 0) ++ printer_list_array[printer_list_size-1] = default_printer_env; ++ ++ // number of attributes ++ for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next) { ++ len++; ++ } ++ ipp_attribute_t* array[len]; ++ ++ for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next) { ++ array[j++] = filtertmpattr; ++ } ++ ++ for (j=0; j<len; j++) { ++ filtertmpattr = array[j]; ++ // if the current attribute is a printer_name, find it in the list ++ if ((filtertmpattr->value_tag == IPP_TAG_NAME) && ++ (strcasecmp(filtertmpattr->name, "printer-name") == 0)) { ++ printer_name_found = 1; ++ ++ // compare the current printer with the values in the list ++ for(i = 0; i < printer_list_size; i++) { ++ if (printer_list_array[i] && filtertmpattr->values[0].string.text && ++ (strcasecmp(filtertmpattr->values[0].string.text, printer_list_array[i]) == 0)) { ++ found = 1; ++ } ++ } ++ } ++ ++ // last attribute of a printer (separator) or last attribute ++ if (filtertmpattr->value_tag == IPP_TAG_ZERO || filtertmpattr->next == NULL) { ++ if(found == 0 && printer_name_found == 1) { // not found so we remove it ++ // First printer ++ if(last_null == 0) { ++ ipp->attrs = filtertmpattr->next; ++ } else { ++ // Printer in the middle ++ (array[last_null])->next = filtertmpattr->next; ++ } ++ } else { ++ // the last known good printer ++ last_null = j; ++ } ++ printer_name_found = 0; ++ found = 0; ++ } ++ } ++ ++ // remove the last IPP_TAG_ZERO if the last element in the list ++ for (filtertmpattr = ipp->attrs; filtertmpattr != NULL; filtertmpattr = filtertmpattr->next){ ++ if (filtertmpattr->value_tag == IPP_TAG_ZERO && filtertmpattr->next == NULL){ ++ filtertmpattr2->next = NULL; ++ } ++ filtertmpattr2 = filtertmpattr; ++ } ++ return 0; ++} ++ + + /* + * 'ippNewRequest()' - Allocate a new IPP request message. +@@ -1194,6 +1309,8 @@ + */ + + DEBUG_puts("2ippReadIO: IPP_TAG_END."); ++ if(getenv("PRINTER_LIST")) ++ ippFilterPrinters(ipp); + + ipp->state = IPP_DATA; + break; diff --git a/debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch b/debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch new file mode 100644 index 0000000..d88eec3 --- /dev/null +++ b/debian/patches/pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch @@ -0,0 +1,13 @@ +Author: till.kamppeter@gmail.com + +--- a/conf/mime.convs.in ++++ b/conf/mime.convs.in +@@ -39,7 +39,7 @@ + # + + @DEFAULT_PDFTOPS@application/pdf application/vnd.cups-postscript 66 pdftops +-application/postscript application/vnd.cups-postscript 66 pstops ++application/postscript application/vnd.cups-postscript 65 pstops + @DEFAULT_TEXTTOPS@application/x-cshell application/postscript 33 texttops + @DEFAULT_TEXTTOPS@application/x-csource application/postscript 33 texttops + @DEFAULT_TEXTTOPS@application/x-perl application/postscript 33 texttops diff --git a/debian/patches/reactivate_recommended_driver.patch b/debian/patches/reactivate_recommended_driver.patch new file mode 100644 index 0000000..4926382 --- /dev/null +++ b/debian/patches/reactivate_recommended_driver.patch @@ -0,0 +1,29 @@ +Description: CUPS removes the "(recommended)" comments of the NickNames of Foomatic PPDs when listing available PPDs. This patch removes this remocval action. +Author: till.kamppeter@gmail.com + +--- cups-1.4.0~svn8773~/scheduler/cups-driverd.cxx 2009-08-23 12:16:58.000000000 +0200 ++++ cups-1.4.0~svn8773/scheduler/cups-driverd.cxx 2009-08-23 18:33:34.000000000 +0200 +@@ -211,7 +211,6 @@ + const char *scheme) /* I - PPD scheme */ + { + ppd_info_t *ppd; /* PPD */ +- char *recommended; /* Foomatic driver string */ + + + /* +@@ -250,15 +249,6 @@ + strlcpy(ppd->record.scheme, scheme, sizeof(ppd->record.scheme)); + + /* +- * Strip confusing (and often wrong) "recommended" suffix added by +- * Foomatic drivers... +- */ +- +- if ((recommended = strstr(ppd->record.make_and_model, +- " (recommended)")) != NULL) +- *recommended = '\0'; +- +- /* + * Add the PPD to the PPD arrays... + */ + diff --git a/debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch b/debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch new file mode 100644 index 0000000..1cb8cc2 --- /dev/null +++ b/debian/patches/read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch @@ -0,0 +1,102 @@ +Author: till.kamppeter@gmail.com + +--- a/scheduler/ipp.c ++++ b/scheduler/ipp.c +@@ -9639,6 +9639,11 @@ + ipp_attribute_t *attr, /* Current attribute */ + *attr2, /* Job attribute */ + *prev2; /* Previous job attribute */ ++ int foundfirstpage; /* Did we find the first page already ++ in the PostScript input? */ ++ int num_copies; /* Number of copies according to ++ PostScript command in input file */ ++ char *s, *t, buffer[10]; + + + /* +@@ -9700,6 +9705,85 @@ + } + + /* ++ * Read option settings embedded in the file... ++ */ ++ ++ foundfirstpage = 0; ++ ++ while (cupsFileGets(fp, line, sizeof(line))) ++ { ++ /* ++ * Stop at the second page, we read also the settings of the first PageSetup ++ * to work around a bug in OpenOffice.org. This app puts options intended ++ * for the whole document into the page setup of the first page ++ */ ++ ++ if (!strncmp(line, "%%Page:", 7)) ++ { ++ if (foundfirstpage == 1) ++ break; ++ foundfirstpage = 1; ++ } ++ ++ /* ++ * Add the embedded option settings to the option array... ++ */ ++ ++ s = NULL; ++ if (!strncmp(line, "%%BeginFeature:", 15)) ++ s = line + 15; ++ else if (!strncmp(line, "%%IncludeFeature:", 17)) ++ s = line + 17; ++ else if (!strncmp(line, "%%BeginNonPPDFeature:", 21)) ++ s = line + 21; ++ ++ if (s && (t = strstr(s, "NumCopies")) != NULL) ++ { ++ t += 9; ++ while ((*t == ' ') || (*t == '\t')) t++; ++ if (sscanf(t, "%9d", &num_copies) == 1) ++ { ++ sprintf(buffer, "%d", num_copies); ++ num_options = cupsAddOption("copies", buffer, num_options, &options); ++ } ++ } ++ else if (s) ++ { ++ while ((*s == ' ') || (*s == '\t')) s++; ++ if (*s == '*') s++; ++ t = s; ++ while (*t && (*t != ' ') && (*t != '\t')) t++; ++ if ((*t == ' ') || (*t == '\t')) *t = '='; ++ num_options = cupsParseOptions(s, num_options, &options); ++ } ++ ++ /* ++ * Read out "/#copies XXX def" and "/NumCopies XXX def" expressions from ++ * PostScript input. Some apps insert these expressions to set the ++ * number of copies. ++ */ ++ ++ s = NULL; ++ if ((s = strstr(line, "/#copies")) != NULL) ++ s += 8; ++ else if ((s = strstr(line, "/NumCopies")) != NULL) ++ s += 10; ++ if (s) ++ { ++ while ((*s == ' ') || (*s == '\t')) s++; ++ if (sscanf(s, "%9d %as ", &num_copies, &t) == 2) ++ { ++ if (!strncmp(t, "def", 3)) ++ { ++ sprintf(buffer, "%d", num_copies); ++ num_options = cupsAddOption("copies", buffer, num_options, &options); ++ } ++ free(t); ++ } ++ } ++ } ++ ++ /* + * Done with the file; see if we have any options... + */ + diff --git a/debian/patches/removecvstag.patch b/debian/patches/removecvstag.patch new file mode 100644 index 0000000..8131e1f --- /dev/null +++ b/debian/patches/removecvstag.patch @@ -0,0 +1,15 @@ +Description: Do not write VCS tags into installed conffiles +Bug: http://www.cups.org/str.php?L2369 +Author: Kenshi Muto <kmuto@debian.org> + +--- cups-1.4.0~svn8773~/conf/Makefile 2009-08-23 12:15:52.000000000 +0200 ++++ cups-1.4.0~svn8773/conf/Makefile 2009-08-23 17:11:44.000000000 +0200 +@@ -75,6 +75,8 @@ + $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT)/$$file.N ; \ + else \ + $(INSTALL_CONFIG) -g $(CUPS_GROUP) $$file $(SERVERROOT) ; \ ++ grep -v "\$$Id:" $(SERVERROOT)/$$file > $(SERVERROOT)/$$file.n ; \ ++ mv $(SERVERROOT)/$$file.n $(SERVERROOT)/$$file ; \ + fi ; \ + done + $(INSTALL_CONFIG) -g $(CUPS_GROUP) cupsd.conf $(SERVERROOT)/cupsd.conf.default diff --git a/debian/patches/rootbackends-worldreadable.patch b/debian/patches/rootbackends-worldreadable.patch new file mode 100644 index 0000000..26a2029 --- /dev/null +++ b/debian/patches/rootbackends-worldreadable.patch @@ -0,0 +1,38 @@ +Description: Install root backends world-readable, to comply to Debian Policy and because it is both nonsensical to to not do so, and also breaks system checkers, bug reporting, etc. +Author: Martin Pitt <mpitt@debian.org> +Bug: http://www.cups.org/str.php?L2935 +Bug-Debian: http://bugs.debian.org/410171 + +--- a/backend/Makefile ++++ b/backend/Makefile +@@ -89,7 +89,7 @@ + echo Installing backends in $(SERVERBIN)/backend + $(INSTALL_DIR) -m 755 $(SERVERBIN)/backend + for file in $(RBACKENDS); do \ +- $(LIBTOOL) $(INSTALL_BIN) -m 700 $$file $(SERVERBIN)/backend; \ ++ $(LIBTOOL) $(INSTALL_BIN) -m 744 $$file $(SERVERBIN)/backend; \ + done + for file in $(UBACKENDS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/backend; \ +--- a/scheduler/cups-deviced.c ++++ b/scheduler/cups-deviced.c +@@ -282,7 +282,7 @@ + */ + + start_backend(dent->filename, +- !(dent->fileinfo.st_mode & (S_IRWXG | S_IRWXO))); ++ !(dent->fileinfo.st_mode & (S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH))); + } + + cupsDirClose(dir); +--- a/scheduler/job.c ++++ b/scheduler/job.c +@@ -1172,7 +1172,7 @@ + else if (stat(command, &backinfo)) + backroot = 0; + else +- backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO)); ++ backroot = !(backinfo.st_mode & (S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH)); + + argv[0] = job->printer->sanitized_device_uri; + diff --git a/debian/patches/series b/debian/patches/series new file mode 100644 index 0000000..751cc3a --- /dev/null +++ b/debian/patches/series @@ -0,0 +1,44 @@ +# patches accepted and committed upstream: +ipp-backend-cups-1.5.4-fixes.patch +install-sh-remove-bashism.patch +usb-backend-busy-loop-fix.patch +usb-backend-detach-usblp-earlier-crash-guards.patch +usb-backend-initialize-usblp-attached-state.patch + +# patches sent upstream +usb-backend-further-enhancements.patch +pidfile.patch +ppd-poll-with-client-conf.patch +# no answer yet, po4a might not be appropriate +manpage-translations.patch +rootbackends-worldreadable.patch +cups-avahi.patch +colord-support.patch + +# patches which should go upstream +airprint-support.patch +removecvstag.patch +no-conffile-timestamp.patch +drop_unnecessary_dependencies.patch +reactivate_recommended_driver.patch +read-embedded-options-from-incoming-postscript-and-add-to-ipp-attrs.patch +do-not-broadcast-with-hostnames.patch +cups-deviced-allow-device-ids-with-newline.patch +cups-snmp-oids-device-id-hp-ricoh.patch +configure-default-browse-protocols.patch + +# Debian patches +add-ipp-backend-of-cups-1.4.patch +logfiles_adm_readable.patch +default_log_settings.patch +confdirperms.patch +printer-filtering.patch +show-compile-command-lines.patch +ppdc-dynamic-linking.patch +log-debug-history-nearly-unlimited.patch +pstops-based-workflow-only-for-printing-ps-on-a-ps-printer.patch +dnssd-reg-array-linear-search.patch +tests-ignore-warnings.patch +tests-ignore-usb-crash.patch +test-i18n-nonlinux.patch +tests-slow-lpstat.patch diff --git a/debian/patches/show-compile-command-lines.patch b/debian/patches/show-compile-command-lines.patch new file mode 100644 index 0000000..5a9de7f --- /dev/null +++ b/debian/patches/show-compile-command-lines.patch @@ -0,0 +1,12 @@ +Author: till.kamppeter@gmail.com + +--- a/Makedefs.in ++++ b/Makedefs.in +@@ -274,7 +274,6 @@ + # Rules... + # + +-.SILENT: + .SUFFIXES: .1 .1.gz .1m .1m.gz .3 .3.gz .5 .5.gz .7 .7.gz .8 .8.gz .a .c .cxx .h .man .o .32.o .64.o .gz + + .c.o: diff --git a/debian/patches/test-i18n-nonlinux.patch b/debian/patches/test-i18n-nonlinux.patch new file mode 100644 index 0000000..27c9a58 --- /dev/null +++ b/debian/patches/test-i18n-nonlinux.patch @@ -0,0 +1,16 @@ +Description: Do not run the CUPS_EUC_JP test case on BSD/Hurd either, as glibc's iconv behavior is different than what the test expects. +Bug-Debian: http://bugs.debian.org/662996 + +Index: cups-1.5.2/cups/testi18n.c +=================================================================== +--- cups-1.5.2.orig/cups/testi18n.c 2011-05-20 05:49:49.000000000 +0200 ++++ cups-1.5.2/cups/testi18n.c 2012-03-13 10:37:12.457017877 +0100 +@@ -423,7 +423,7 @@ + puts("PASS"); + } + +-#ifndef __linux ++#if !defined(__linux__) && !defined(__GLIBC__) + fputs("cupsCharsetToUTF8(CUPS_EUC_JP): ", stdout); + + strcpy(legsrc, legdest); diff --git a/debian/patches/tests-ignore-usb-crash.patch b/debian/patches/tests-ignore-usb-crash.patch new file mode 100644 index 0000000..5fb80fc --- /dev/null +++ b/debian/patches/tests-ignore-usb-crash.patch @@ -0,0 +1,16 @@ +Description: Ignore "[cups-deviced] PID 17962 (usb) crashed on signal 11!" errors in the log during the test suite. This seems to regularly happen on Debian/Ubuntu buildds. +Author: Martin Pitt <mpitt@debian.org> + +Index: cups-1.5.2/test/run-stp-tests.sh +=================================================================== +--- cups-1.5.2.orig/test/run-stp-tests.sh 2012-03-05 07:44:00.785158922 +0100 ++++ cups-1.5.2/test/run-stp-tests.sh 2012-03-05 07:44:38.637160753 +0100 +@@ -749,7 +749,7 @@ + fi + + # Error log messages +-count=`$GREP '^E ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'` ++count=`$GREP '^E ' /tmp/cups-$user/log/error_log | grep -v '(usb) crashed on signal 11' | wc -l | awk '{print $1}'` + if test $count != 18; then + echo "FAIL: $count error messages, expected 18." + $GREP '^E ' /tmp/cups-$user/log/error_log diff --git a/debian/patches/tests-ignore-warnings.patch b/debian/patches/tests-ignore-warnings.patch new file mode 100644 index 0000000..222202d --- /dev/null +++ b/debian/patches/tests-ignore-warnings.patch @@ -0,0 +1,16 @@ +Description: Ignore warnings from colord and Avahi in the tests, as they change the expected number of warnings. +Author: Martin Pitt <mpitt@debian.org> + +Index: cups-1.5.2/test/run-stp-tests.sh +=================================================================== +--- cups-1.5.2.orig/test/run-stp-tests.sh 2012-03-01 07:16:41.180825081 +0100 ++++ cups-1.5.2/test/run-stp-tests.sh 2012-03-01 07:17:29.660827422 +0100 +@@ -764,7 +764,7 @@ + fi + + # Warning log messages +-count=`$GREP '^W ' /tmp/cups-$user/log/error_log | wc -l | awk '{print $1}'` ++count=`$GREP '^W ' /tmp/cups-$user/log/error_log | grep -v 'org.freedesktop.ColorManager' | grep -v 'Avahi client failed: -26' | wc -l | awk '{print $1}'` + if test $count != 9; then + echo "FAIL: $count warning messages, expected 9." + $GREP '^W ' /tmp/cups-$user/log/error_log diff --git a/debian/patches/tests-slow-lpstat.patch b/debian/patches/tests-slow-lpstat.patch new file mode 100644 index 0000000..44563d5 --- /dev/null +++ b/debian/patches/tests-slow-lpstat.patch @@ -0,0 +1,15 @@ +Description: Wait a bit for the scheduler to catch up in the lpstat test. Fixes failures on slow architectures like armel. +Bug-Debian: http://bugs.debian.org/670878 + +Index: cups-1.5.2/test/5.4-lpstat.sh +=================================================================== +--- cups-1.5.2.orig/test/5.4-lpstat.sh 2009-04-13 19:03:15.000000000 +0200 ++++ cups-1.5.2/test/5.4-lpstat.sh 2012-05-14 10:31:21.364668698 +0200 +@@ -15,6 +15,7 @@ + # + + echo "LPSTAT Test" ++sleep 10 + echo "" + echo " lpstat -t" + ../systemv/lpstat -t 2>&1 diff --git a/debian/patches/ubuntu/ubuntu-default-error-policy-retry-job.patch b/debian/patches/ubuntu/ubuntu-default-error-policy-retry-job.patch new file mode 100644 index 0000000..5830454 --- /dev/null +++ b/debian/patches/ubuntu/ubuntu-default-error-policy-retry-job.patch @@ -0,0 +1,16 @@ +Description: Set default job error policy to "Retry", since it is less confusing and a better default on desktop machines. This patch is only applied when building on Ubuntu. +Author: Martin Pitt <martin.pitt@ubuntu.com> + +Index: cups-1.4.6/scheduler/conf.c +=================================================================== +--- cups-1.4.6.orig/scheduler/conf.c 2011-07-14 13:03:03.479773075 +0200 ++++ cups-1.4.6/scheduler/conf.c 2011-07-14 13:03:08.829773167 +0200 +@@ -653,7 +653,7 @@ + cupsdClearString(&BrowseLocalOptions); + cupsdClearString(&BrowseRemoteOptions); + +- cupsdSetString(&ErrorPolicy, "stop-printer"); ++ cupsdSetString(&ErrorPolicy, "retry-job"); + + #ifdef HAVE_LDAP + cupsdClearString(&BrowseLDAPBindDN); diff --git a/debian/patches/ubuntu/ubuntu-disable-browsing.patch b/debian/patches/ubuntu/ubuntu-disable-browsing.patch new file mode 100644 index 0000000..b43fc7b --- /dev/null +++ b/debian/patches/ubuntu/ubuntu-disable-browsing.patch @@ -0,0 +1,20 @@ +Description: Disable Browsing by default on Ubuntu (not sanctioned yet by https://wiki.ubuntu.com/DefaultNetworkServices). This is only applied when building on Ubuntu. +Author: Martin Pitt <martin.pitt@ubuntu.com> + +Index: cups-1.4.6/conf/cupsd.conf.in +=================================================================== +--- cups-1.4.6.orig/conf/cupsd.conf.in 2011-07-14 13:02:54.989772934 +0200 ++++ cups-1.4.6/conf/cupsd.conf.in 2011-07-14 13:03:06.939773135 +0200 +@@ -22,10 +22,11 @@ + @CUPS_LISTEN_DOMAINSOCKET@ + + # Show shared printers on the local network. +-Browsing On ++Browsing Off + BrowseOrder allow,deny + BrowseAllow all + BrowseLocalProtocols @CUPS_BROWSE_LOCAL_PROTOCOLS@ ++BrowseAddress @LOCAL + + # Default authentication type, when authentication is required... + DefaultAuthType Basic diff --git a/debian/patches/usb-backend-busy-loop-fix.patch b/debian/patches/usb-backend-busy-loop-fix.patch new file mode 100644 index 0000000..abe01c6 --- /dev/null +++ b/debian/patches/usb-backend-busy-loop-fix.patch @@ -0,0 +1,33 @@ +--- a/backend/usb-libusb.c ++++ b/backend/usb-libusb.c +@@ -1163,11 +1163,13 @@ + while ((errcode = libusb_claim_interface(printer->handle, number1)) < 0) + { + if (errcode != LIBUSB_ERROR_BUSY) ++ { + fprintf(stderr, + "DEBUG: Failed to claim interface %d for %04x:%04x: %s\n", + number1, devdesc.idVendor, devdesc.idProduct, strerror(errno)); + +- goto error; ++ goto error; ++ } + } + + /* +@@ -1187,12 +1189,14 @@ + < 0) + { + if (errcode != LIBUSB_ERROR_BUSY) ++ { + fprintf(stderr, + "DEBUG: Failed to set alternate interface %d for %04x:%04x: " + "%s\n", + number2, devdesc.idVendor, devdesc.idProduct, strerror(errno)); + +- goto error; ++ goto error; ++ } + } + } + diff --git a/debian/patches/usb-backend-detach-usblp-earlier-crash-guards.patch b/debian/patches/usb-backend-detach-usblp-earlier-crash-guards.patch new file mode 100644 index 0000000..46d7088 --- /dev/null +++ b/debian/patches/usb-backend-detach-usblp-earlier-crash-guards.patch @@ -0,0 +1,163 @@ +--- a/backend/usb-libusb.c ++++ b/backend/usb-libusb.c +@@ -600,31 +600,39 @@ + * to the device... + */ + ++ int errcode; /* Return value of libusb function */ + int number; /* Interface number */ + +- libusb_get_device_descriptor (printer->device, &devdesc); +- libusb_get_config_descriptor (printer->device, printer->conf, &confptr); +- number = confptr->interface[printer->iface]. +- altsetting[printer->altset].bInterfaceNumber; +- libusb_release_interface(printer->handle, number); +- if (number != 0) +- libusb_release_interface(printer->handle, 0); ++ errcode = ++ libusb_get_config_descriptor (printer->device, printer->conf, &confptr); ++ if (errcode >= 0) ++ { ++ number = confptr->interface[printer->iface]. ++ altsetting[printer->altset].bInterfaceNumber; ++ libusb_release_interface(printer->handle, number); ++ if (number != 0) ++ libusb_release_interface(printer->handle, 0); + +- /* +- * Re-attach "usblp" kernel module if it was attached before using this +- * device +- */ ++ /* ++ * Re-attach "usblp" kernel module if it was attached before using this ++ * device ++ */ ++ if (printer->usblp_attached == 1) ++ if (libusb_attach_kernel_driver(printer->handle, printer->iface) < 0) ++ { ++ errcode = libusb_get_device_descriptor (printer->device, &devdesc); ++ if (errcode < 0) ++ fprintf(stderr, ++ "DEBUG: Failed to re-attach \"usblp\" kernel module\n"); ++ else ++ fprintf(stderr, ++ "DEBUG: Failed to re-attach \"usblp\" kernel module to " ++ "%04x:%04x\n", devdesc.idVendor, devdesc.idProduct); ++ } + +- if (printer->usblp_attached == 1) +- { +- if (libusb_attach_kernel_driver(printer->handle, printer->iface) < 0) +- fprintf(stderr, +- "DEBUG: Failed to re-attach \"usblp\" kernel module to " +- "%04x:%04x\n", devdesc.idVendor, devdesc.idProduct); ++ libusb_free_config_descriptor(confptr); + } + +- libusb_free_config_descriptor(confptr); +- + /* + * Close the interface and return... + */ +@@ -694,7 +702,8 @@ + * a printer... + */ + +- libusb_get_device_descriptor (device, &devdesc); ++ if (libusb_get_device_descriptor (device, &devdesc) < 0) ++ continue; + + if (!devdesc.bNumConfigurations || !devdesc.idVendor || + !devdesc.idProduct) +@@ -1092,6 +1101,40 @@ + if (verbose) + fputs("STATE: +connecting-to-device\n", stderr); + ++ if ((errcode = libusb_get_device_descriptor (printer->device, &devdesc)) < 0) ++ { ++ fprintf(stderr, "DEBUG: Failed to get device descriptor, code: %d\n", ++ errcode); ++ goto error; ++ } ++ ++ /* ++ * Get the "usblp" kernel module out of the way. This backend only ++ * works without the module attached. ++ */ ++ ++ errcode = libusb_kernel_driver_active(printer->handle, printer->iface); ++ if (errcode == 0) ++ printer->usblp_attached = 0; ++ else if (errcode == 1) ++ { ++ printer->usblp_attached = 1; ++ if ((errcode = ++ libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0) ++ { ++ fprintf(stderr, "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n", ++ devdesc.idVendor, devdesc.idProduct); ++ goto error; ++ } ++ } ++ else ++ { ++ printer->usblp_attached = 0; ++ fprintf(stderr, "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" kernel module attached\n", ++ devdesc.idVendor, devdesc.idProduct); ++ goto error; ++ } ++ + /* + * Set the desired configuration, but only if it needs changing. Some + * printers (e.g., Samsung) don't like libusb_set_configuration. It will +@@ -1106,8 +1149,14 @@ + 0, 0, (unsigned char *)¤t, 1, 5000) < 0) + current = 0; /* Assume not configured */ + +- libusb_get_device_descriptor (printer->device, &devdesc); +- libusb_get_config_descriptor (printer->device, printer->conf, &confptr); ++ if ((errcode = ++ libusb_get_config_descriptor (printer->device, printer->conf, &confptr)) ++ < 0) ++ { ++ fprintf(stderr, "DEBUG: Failed to get config descriptor for %04x:%04x\n", ++ devdesc.idVendor, devdesc.idProduct); ++ goto error; ++ } + number1 = confptr->bConfigurationValue; + + if (number1 != current) +@@ -1127,33 +1176,6 @@ + } + + /* +- * Get the "usblp" kernel module out of the way. This backend only +- * works without the module attached. +- */ +- +- errcode = libusb_kernel_driver_active(printer->handle, printer->iface); +- if (errcode == 0) +- printer->usblp_attached = 0; +- else if (errcode == 1) +- { +- printer->usblp_attached = 1; +- if ((errcode = +- libusb_detach_kernel_driver(printer->handle, printer->iface)) < 0) +- { +- fprintf(stderr, "DEBUG: Failed to detach \"usblp\" module from %04x:%04x\n", +- devdesc.idVendor, devdesc.idProduct); +- goto error; +- } +- } +- else +- { +- printer->usblp_attached = 0; +- fprintf(stderr, "DEBUG: Failed to check whether %04x:%04x has the \"usblp\" kernel module attached\n", +- devdesc.idVendor, devdesc.idProduct); +- goto error; +- } +- +- /* + * Claim interfaces as needed... + */ + diff --git a/debian/patches/usb-backend-further-enhancements.patch b/debian/patches/usb-backend-further-enhancements.patch new file mode 100644 index 0000000..9a1e82b --- /dev/null +++ b/debian/patches/usb-backend-further-enhancements.patch @@ -0,0 +1,591 @@ +--- a/backend/usb-libusb.c ++++ b/backend/usb-libusb.c +@@ -13,7 +13,7 @@ + * + * Contents: + * +- * list_devices() - List the available printers. ++ * list_devices() - List the available printers. + * print_device() - Print a file to a USB device. + * close_device() - Close the connection to the USB printer. + * find_device() - Find or enumerate USB printers. +@@ -22,6 +22,9 @@ + * make_device_uri() - Create a device URI for a USB printer. + * open_device() - Open a connection to the USB printer. + * print_cb() - Find a USB printer for printing. ++ * printer_class_soft_reset()' - Do the soft reset request specific to ++ * printers ++ * quirks() - Get the known quirks of a given printer model + * read_thread() - Thread to read the backchannel data on. + * sidechannel_thread() - Handle side-channel requests. + * soft_reset() - Send a soft reset to the device. +@@ -60,13 +63,14 @@ + { + struct libusb_device *device; /* Device info */ + int conf, /* Configuration */ ++ origconf, /* Original configuration */ + iface, /* Interface */ + altset, /* Alternate setting */ + write_endp, /* Write endpoint */ +- read_endp, /* Read endpoint */ ++ read_endp, /* Read endpoint */ + protocol, /* Protocol: 1 = Uni-di, 2 = Bi-di. */ +- usblp_attached; /* Is the "usblp" kernel module +- attached? */ ++ usblp_attached; /* "usblp" kernel module attached? */ ++ unsigned int quirks; /* Quirks flags */ + struct libusb_device_handle *handle; /* Open handle to device */ + } usb_printer_t; + +@@ -99,6 +103,55 @@ + int sidechannel_thread_done; + } usb_globals_t; + ++/* ++ * Quirks: various printer quirks are handled by this table & its flags. ++ * ++ * This is copied from the usblp kernel module. So we can easily copy and paste ++ * new quirks from the module. ++ */ ++ ++struct quirk_printer_struct { ++ int vendorId; ++ int productId; ++ unsigned int quirks; ++}; ++ ++#define USBLP_QUIRK_BIDIR 0x1 /* reports bidir but requires ++ unidirectional mode (no INs/reads) */ ++#define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ ++#define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific ++ Class or SubClass */ ++#define USBLP_QUIRK_NO_REATTACH 0x8000 /* After printing we cannot re-attach ++ the usblp kernel module */ ++ ++static const struct quirk_printer_struct quirk_printers[] = { ++ { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */ ++ { 0x03f0, 0x0104, USBLP_QUIRK_BIDIR }, /* HP DeskJet 880C */ ++ { 0x03f0, 0x0204, USBLP_QUIRK_BIDIR }, /* HP DeskJet 815C */ ++ { 0x03f0, 0x0304, USBLP_QUIRK_BIDIR }, /* HP DeskJet 810C/812C */ ++ { 0x03f0, 0x0404, USBLP_QUIRK_BIDIR }, /* HP DeskJet 830C */ ++ { 0x03f0, 0x0504, USBLP_QUIRK_BIDIR }, /* HP DeskJet 885C */ ++ { 0x03f0, 0x0604, USBLP_QUIRK_BIDIR }, /* HP DeskJet 840C */ ++ { 0x03f0, 0x0804, USBLP_QUIRK_BIDIR }, /* HP DeskJet 816C */ ++ { 0x03f0, 0x1104, USBLP_QUIRK_BIDIR }, /* HP Deskjet 959C */ ++ { 0x0409, 0xefbe, USBLP_QUIRK_BIDIR }, /* NEC Picty900 (HP OEM) */ ++ { 0x0409, 0xbef4, USBLP_QUIRK_BIDIR }, /* NEC Picty760 (HP OEM) */ ++ { 0x0409, 0xf0be, USBLP_QUIRK_BIDIR }, /* NEC Picty920 (HP OEM) */ ++ { 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */ ++ { 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820, ++ by zut <kernel@zut.de> */ ++ { 0x04f9, 0x000d, USBLP_QUIRK_BIDIR | ++ USBLP_QUIRK_NO_REATTACH }, /* Brother Industries, Ltd ++ HL-1440 Laser Printer */ ++ { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt ++ Printer M129C */ ++ { 0x067b, 0x2305, USBLP_QUIRK_BIDIR | ++ USBLP_QUIRK_NO_REATTACH }, ++ /* Prolific Technology, Inc. PL2305 Parallel Port ++ (USB -> Parallel adapter) */ ++ { 0, 0 } ++}; ++ + + /* + * Globals... +@@ -124,6 +177,8 @@ + static int open_device(usb_printer_t *printer, int verbose); + static int print_cb(usb_printer_t *printer, const char *device_uri, + const char *device_id, const void *data); ++static int printer_class_soft_reset(usb_printer_t *printer); ++static unsigned int quirks(int vendor, int product); + static void *read_thread(void *reference); + static void *sidechannel_thread(void *reference); + static void soft_reset(void); +@@ -163,7 +218,8 @@ + iostatus; /* Current IO status */ + pthread_t read_thread_id, /* Read thread */ + sidechannel_thread_id; /* Side-channel thread */ +- int have_sidechannel = 0; /* Was the side-channel thread started? */ ++ int have_sidechannel = 0, /* Was the side-channel thread started? */ ++ have_backchannel = 0; /* Do we have a back channel? */ + struct stat sidechannel_info; /* Side-channel file descriptor info */ + unsigned char print_buffer[8192], /* Print data buffer */ + *print_ptr; /* Pointer into print data buffer */ +@@ -172,6 +228,9 @@ + struct timeval *timeout, /* Timeout pointer */ + tv; /* Time value */ + struct timespec cond_timeout; /* pthread condition timeout */ ++ int num_opts; /* Number of options */ ++ cups_option_t *opts; /* Options */ ++ const char *val; /* Option value */ + + + /* +@@ -187,6 +246,7 @@ + * Connect to the printer... + */ + ++ fprintf(stderr, "DEBUG: Printing on printer with URI: %s\n", uri); + while ((g.printer = find_device(print_cb, uri)) == NULL) + { + _cupsLangPrintFilter(stderr, "INFO", +@@ -240,26 +300,63 @@ + } + + /* +- * Get the read thread going... ++ * Debug mode: If option "usb-unidir" is given, always deactivate ++ * backchannel + */ + +- g.read_thread_stop = 0; +- g.read_thread_done = 0; ++ num_opts = cupsParseOptions(argv[5], 0, &opts); ++ val = cupsGetOption("usb-unidir", num_opts, opts); ++ if (val && strcasecmp(val, "no") && strcasecmp(val, "off") && ++ strcasecmp(val, "false")) ++ { ++ g.printer->read_endp = -1; ++ fprintf(stderr, "DEBUG: Forced uni-directional communication " ++ "via \"usb-unidir\" option.\n"); ++ } + +- pthread_cond_init(&g.read_thread_cond, NULL); +- pthread_mutex_init(&g.read_thread_mutex, NULL); ++ /* ++ * Debug mode: If option "usb-no-reattach" is given, do not re-attach ++ * the usblp kernel module after the job has completed. ++ */ + +- if (pthread_create(&read_thread_id, NULL, read_thread, NULL)) ++ val = cupsGetOption("usb-no-reattach", num_opts, opts); ++ if (val && strcasecmp(val, "no") && strcasecmp(val, "off") && ++ strcasecmp(val, "false")) + { +- fprintf(stderr, "DEBUG: Fatal USB error.\n"); +- _cupsLangPrintFilter(stderr, "ERROR", +- _("There was an unrecoverable USB error.")); +- fputs("DEBUG: Couldn't create read thread.\n", stderr); +- close_device(g.printer); +- return (CUPS_BACKEND_STOP); ++ g.printer->usblp_attached = 0; ++ fprintf(stderr, "DEBUG: Forced not re-attaching the usblp kernel module " ++ "after the job via \"usb-no-reattach\" option.\n"); + } + + /* ++ * Get the read thread going... ++ */ ++ ++ if (g.printer->read_endp != -1) ++ { ++ have_backchannel = 1; ++ ++ g.read_thread_stop = 0; ++ g.read_thread_done = 0; ++ ++ pthread_cond_init(&g.read_thread_cond, NULL); ++ pthread_mutex_init(&g.read_thread_mutex, NULL); ++ ++ if (pthread_create(&read_thread_id, NULL, read_thread, NULL)) ++ { ++ fprintf(stderr, "DEBUG: Fatal USB error.\n"); ++ _cupsLangPrintFilter(stderr, "ERROR", ++ _("There was an unrecoverable USB error.")); ++ fputs("DEBUG: Couldn't create read thread.\n", stderr); ++ close_device(g.printer); ++ return (CUPS_BACKEND_STOP); ++ } ++ } ++ else ++ fprintf(stderr, "DEBUG: Uni-directional device/mode, back channel " ++ "deactivated.\n"); ++ ++ /* + * The main thread sends the print file... + */ + +@@ -515,50 +612,54 @@ + * Signal the read thread to exit then wait 7 seconds for it to complete... + */ + +- g.read_thread_stop = 1; +- +- pthread_mutex_lock(&g.read_thread_mutex); +- +- if (!g.read_thread_done) ++ if (have_backchannel) + { +- fputs("DEBUG: Waiting for read thread to exit...\n", stderr); ++ g.read_thread_stop = 1; + +- gettimeofday(&tv, NULL); +- cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY; +- cond_timeout.tv_nsec = tv.tv_usec * 1000; ++ pthread_mutex_lock(&g.read_thread_mutex); + +- while (!g.read_thread_done) +- { +- if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, +- &cond_timeout) != 0) +- break; +- } +- +- /* +- * If it didn't exit abort the pending read and wait an additional second... +- */ +- + if (!g.read_thread_done) + { +- fputs("DEBUG: Read thread still active, aborting the pending read...\n", +- stderr); +- +- g.wait_eof = 0; ++ fputs("DEBUG: Waiting for read thread to exit...\n", stderr); + + gettimeofday(&tv, NULL); +- cond_timeout.tv_sec = tv.tv_sec + 1; ++ cond_timeout.tv_sec = tv.tv_sec + WAIT_EOF_DELAY; + cond_timeout.tv_nsec = tv.tv_usec * 1000; +- ++ + while (!g.read_thread_done) + { + if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, + &cond_timeout) != 0) + break; + } ++ ++ /* ++ * If it didn't exit abort the pending read and wait an additional ++ * second... ++ */ ++ ++ if (!g.read_thread_done) ++ { ++ fputs("DEBUG: Read thread still active, aborting the pending read...\n", ++ stderr); ++ ++ g.wait_eof = 0; ++ ++ gettimeofday(&tv, NULL); ++ cond_timeout.tv_sec = tv.tv_sec + 1; ++ cond_timeout.tv_nsec = tv.tv_usec * 1000; ++ ++ while (!g.read_thread_done) ++ { ++ if (pthread_cond_timedwait(&g.read_thread_cond, &g.read_thread_mutex, ++ &cond_timeout) != 0) ++ break; ++ } ++ } + } +- } + +- pthread_mutex_unlock(&g.read_thread_mutex); ++ pthread_mutex_unlock(&g.read_thread_mutex); ++ } + + if (print_fd) + close(print_fd); +@@ -601,24 +702,54 @@ + */ + + int errcode; /* Return value of libusb function */ +- int number; /* Interface number */ ++ int number1, /* Interface number */ ++ number2; /* Configuration number */ + +- errcode = +- libusb_get_config_descriptor (printer->device, printer->conf, &confptr); ++ errcode = ++ libusb_get_config_descriptor(printer->device, printer->conf, &confptr); + if (errcode >= 0) + { +- number = confptr->interface[printer->iface]. ++ number1 = confptr->interface[printer->iface]. + altsetting[printer->altset].bInterfaceNumber; +- libusb_release_interface(printer->handle, number); +- if (number != 0) +- libusb_release_interface(printer->handle, 0); ++ libusb_release_interface(printer->handle, number1); ++ ++ number2 = confptr->bConfigurationValue; ++ ++ libusb_free_config_descriptor(confptr); ++ ++ /* ++ * If we have changed the configuration from one valid configuration ++ * to another, restore the old one ++ */ ++ if (printer->origconf > 0 && printer->origconf != number2) ++ { ++ fprintf(stderr, "DEBUG: Restoring USB device configuration: %d -> %d\n", ++ number2, printer->origconf); ++ if ((errcode = libusb_set_configuration(printer->handle, ++ printer->origconf)) < 0) ++ { ++ if (errcode != LIBUSB_ERROR_BUSY) ++ { ++ errcode = ++ libusb_get_device_descriptor (printer->device, &devdesc); ++ if (errcode < 0) ++ fprintf(stderr, ++ "DEBUG: Failed to set configuration %d\n", ++ printer->origconf); ++ else ++ fprintf(stderr, ++ "DEBUG: Failed to set configuration %d for %04x:%04x\n", ++ printer->origconf, devdesc.idVendor, devdesc.idProduct); ++ } ++ } ++ } + + /* + * Re-attach "usblp" kernel module if it was attached before using this + * device + */ + if (printer->usblp_attached == 1) +- if (libusb_attach_kernel_driver(printer->handle, printer->iface) < 0) ++ if (libusb_attach_kernel_driver(printer->handle, number1) < 0) + { + errcode = libusb_get_device_descriptor (printer->device, &devdesc); + if (errcode < 0) +@@ -629,9 +760,11 @@ + "DEBUG: Failed to re-attach \"usblp\" kernel module to " + "%04x:%04x\n", devdesc.idVendor, devdesc.idProduct); + } +- +- libusb_free_config_descriptor(confptr); + } ++ else ++ fprintf(stderr, ++ "DEBUG: Failed to get configuration descriptor %d\n", ++ printer->conf); + + /* + * Close the interface and return... +@@ -702,16 +835,18 @@ + * a printer... + */ + +- if (libusb_get_device_descriptor (device, &devdesc) < 0) ++ if (libusb_get_device_descriptor(device, &devdesc) < 0) + continue; + + if (!devdesc.bNumConfigurations || !devdesc.idVendor || + !devdesc.idProduct) + continue; + ++ printer.quirks = quirks(devdesc.idVendor, devdesc.idProduct); ++ + for (conf = 0; conf < devdesc.bNumConfigurations; conf ++) + { +- if (libusb_get_config_descriptor (device, conf, &confptr) < 0) ++ if (libusb_get_config_descriptor(device, conf, &confptr) < 0) + continue; + for (iface = 0, ifaceptr = confptr->interface; + iface < confptr->bNumInterfaces; +@@ -733,13 +868,18 @@ + * 1284.4 (packet mode) protocol as well. + */ + +- if (altptr->bInterfaceClass != LIBUSB_CLASS_PRINTER || +- altptr->bInterfaceSubClass != 1 || ++ if (((altptr->bInterfaceClass != LIBUSB_CLASS_PRINTER || ++ altptr->bInterfaceSubClass != 1) && ++ ((printer.quirks & USBLP_QUIRK_BAD_CLASS) == 0)) || + (altptr->bInterfaceProtocol != 1 && /* Unidirectional */ + altptr->bInterfaceProtocol != 2) || /* Bidirectional */ + altptr->bInterfaceProtocol < protocol) + continue; + ++ if (printer.quirks & USBLP_QUIRK_BAD_CLASS) ++ fprintf(stderr, "DEBUG: Printer does not report class 7 and/or " ++ "subclass 1 but works as a printer anyway\n"); ++ + read_endp = -1; + write_endp = -1; + +@@ -764,7 +904,10 @@ + protocol = altptr->bInterfaceProtocol; + printer.altset = altset; + printer.write_endp = write_endp; +- printer.read_endp = read_endp; ++ if (protocol > 1) ++ printer.read_endp = read_endp; ++ else ++ printer.read_endp = -1; + } + } + +@@ -782,16 +925,41 @@ + make_device_uri(&printer, device_id, device_uri, + sizeof(device_uri)); + ++ fprintf(stderr, "DEBUG2: Printer found with device ID: %s " ++ "Device URI: %s\n", ++ device_id, device_uri); ++ + if ((*cb)(&printer, device_uri, device_id, data)) + { +- printer.read_endp = confptr->interface[printer.iface]. +- altsetting[printer.altset]. +- endpoint[printer.read_endp]. +- bEndpointAddress; ++ fprintf(stderr, "DEBUG: Device protocol: %d\n", ++ printer.protocol); ++ if (printer.quirks & USBLP_QUIRK_BIDIR) ++ { ++ printer.read_endp = -1; ++ fprintf(stderr, "DEBUG: Printer reports bi-di support " ++ "but in reality works only uni-directionally\n"); ++ } ++ if (printer.read_endp != -1) ++ { ++ printer.read_endp = confptr->interface[printer.iface]. ++ altsetting[printer.altset]. ++ endpoint[printer.read_endp]. ++ bEndpointAddress; ++ } ++ else ++ fprintf(stderr, "DEBUG: Uni-directional USB communication " ++ "only!\n"); + printer.write_endp = confptr->interface[printer.iface]. + altsetting[printer.altset]. + endpoint[printer.write_endp]. + bEndpointAddress; ++ if (printer.quirks & USBLP_QUIRK_NO_REATTACH) ++ { ++ printer.usblp_attached = 0; ++ fprintf(stderr, "DEBUG: Printer does not like usblp " ++ "kernel module to be re-attached after job\n"); ++ } ++ libusb_free_config_descriptor(confptr); + return (&printer); + } + +@@ -959,7 +1127,7 @@ + if ((sern = cupsGetOption("SERIALNUMBER", num_values, values)) == NULL) + if ((sern = cupsGetOption("SERN", num_values, values)) == NULL) + if ((sern = cupsGetOption("SN", num_values, values)) == NULL && +- ((libusb_get_device_descriptor (printer->device, &devdesc) >= 0) && ++ ((libusb_get_device_descriptor(printer->device, &devdesc) >= 0) && + devdesc.iSerialNumber)) + { + /* +@@ -1095,15 +1263,19 @@ + * Try opening the printer... + */ + +- if (libusb_open(printer->device, &printer->handle) < 0) ++ if ((errcode = libusb_open(printer->device, &printer->handle)) < 0) ++ { ++ fprintf(stderr, "DEBUG: Failed to open device, code: %d\n", ++ errcode); + return (-1); ++ } + + printer->usblp_attached = 0; + + if (verbose) + fputs("STATE: +connecting-to-device\n", stderr); + +- if ((errcode = libusb_get_device_descriptor (printer->device, &devdesc)) < 0) ++ if ((errcode = libusb_get_device_descriptor(printer->device, &devdesc)) < 0) + { + fprintf(stderr, "DEBUG: Failed to get device descriptor, code: %d\n", + errcode); +@@ -1151,6 +1323,8 @@ + 0, 0, (unsigned char *)¤t, 1, 5000) < 0) + current = 0; /* Assume not configured */ + ++ printer->origconf = current; ++ + if ((errcode = + libusb_get_config_descriptor (printer->device, printer->conf, &confptr)) + < 0) +@@ -1163,6 +1337,8 @@ + + if (number1 != current) + { ++ fprintf(stderr, "DEBUG: Switching USB device configuration: %d -> %d\n", ++ current, number1); + if ((errcode = libusb_set_configuration(printer->handle, number1)) < 0) + { + /* +@@ -1342,6 +1518,64 @@ + + + /* ++ * 'printer_class_soft_reset()' - Do the soft reset request specific to printers ++ * ++ * This soft reset is specific to the printer device class and is much less ++ * invasive than the general USB reset libusb_reset_device(). Especially it ++ * does never happen that the USB addressing and configuration changes. What ++ * is actually done is that all buffers get flushed and the bulk IN and OUT ++ * pipes get reset to their default states. This clears all stall conditions. ++ * See http://cholla.mmto.org/computers/linux/usb/usbprint11.pdf ++ */ ++ ++static int /* O - 0 on success, < 0 on error */ ++printer_class_soft_reset(usb_printer_t *printer) /* I - Printer */ ++{ ++ struct libusb_config_descriptor *confptr = NULL; ++ /* Pointer to current configuration */ ++ int interface, ++ errcode; ++ ++ if (libusb_get_config_descriptor(printer->device, printer->conf, &confptr) ++ < 0) ++ interface = printer->iface; ++ else ++ interface = confptr->interface[printer->iface]. ++ altsetting[printer->altset].bInterfaceNumber; ++ libusb_free_config_descriptor(confptr); ++ if ((errcode = libusb_control_transfer(printer->handle, ++ LIBUSB_REQUEST_TYPE_CLASS | ++ LIBUSB_ENDPOINT_OUT | ++ LIBUSB_RECIPIENT_OTHER, ++ 2, 0, interface, NULL, 0, 5000)) < 0) ++ errcode = libusb_control_transfer(printer->handle, ++ LIBUSB_REQUEST_TYPE_CLASS | ++ LIBUSB_ENDPOINT_OUT | ++ LIBUSB_RECIPIENT_INTERFACE, ++ 2, 0, interface, NULL, 0, 5000); ++ return errcode; ++} ++ ++ ++/* ++ * 'quirks()' - Get the known quirks of a given printer model ++ */ ++ ++static unsigned int quirks(int vendor, int product) ++{ ++ int i; ++ ++ for (i = 0; quirk_printers[i].vendorId; i++) ++ { ++ if (vendor == quirk_printers[i].vendorId && ++ product == quirk_printers[i].productId) ++ return quirk_printers[i].quirks; ++ } ++ return 0; ++} ++ ++ ++/* + * 'read_thread()' - Thread to read the backchannel data on. + */ + +@@ -1615,7 +1849,7 @@ + * Send the reset... + */ + +- libusb_reset_device (g.printer->handle); ++ printer_class_soft_reset(g.printer); + + /* + * Release the I/O lock... diff --git a/debian/patches/usb-backend-initialize-usblp-attached-state.patch b/debian/patches/usb-backend-initialize-usblp-attached-state.patch new file mode 100644 index 0000000..3093cc1 --- /dev/null +++ b/debian/patches/usb-backend-initialize-usblp-attached-state.patch @@ -0,0 +1,11 @@ +--- a/backend/usb-libusb.c ++++ b/backend/usb-libusb.c +@@ -1098,6 +1098,8 @@ + if (libusb_open(printer->device, &printer->handle) < 0) + return (-1); + ++ printer->usblp_attached = 0; ++ + if (verbose) + fputs("STATE: +connecting-to-device\n", stderr); + diff --git a/debian/po/POTFILES.in b/debian/po/POTFILES.in new file mode 100644 index 0000000..f4ab6cd --- /dev/null +++ b/debian/po/POTFILES.in @@ -0,0 +1,2 @@ +[type: gettext/rfc822deb] cups-bsd.templates +[type: gettext/rfc822deb] cups.templates diff --git a/debian/po/ca.po b/debian/po/ca.po new file mode 100644 index 0000000..e8140e5 --- /dev/null +++ b/debian/po/ca.po @@ -0,0 +1,165 @@ +# Catalan translation of cups debconf templates. +# Copyright © 2007, 2010 Software in the Public Interest, Inc. +# This file is distributed under the same license as the cups debian packaging. +# Jordà Polo <jorda@ettin.org>, 2007, 2010. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.2.7-4\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2010-10-23 20:28+0200\n" +"Last-Translator: Jordà Polo <jorda@ettin.org>\n" +"Language-Team: Catalan <debian-l10n-catalan@lists.debian.org>\n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Voleu configurar el servidor de compatibilitat amb l'lpd de BSD?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"El paquet CUPS inclou un servidor que pot acceptar tasques d'impressió de " +"tipus BSD, i enviar-les a CUPS. Només s'hauria d'utilitzar si teniu altres " +"ordinadors que enviïn tasques mitjançant els serveis «BSD» o «LPR», i no " +"podeu convertir-los al protocol IPP que utilitza CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Voleu que CUPS imprimeixi les tasques desconegudes com tasques en brut?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"El protocol d'impressió d'Internet (IPP, «Internet Printing Protocol») força " +"l'existència d'un tipus MIME en totes les tasques d'impressió. Com no sempre " +"s'indica un tipus adequat, moltes d'aquestes tasques s'envien amb el MIME " +"«application/octet-stream» i poden ser rebutjades si CUPS no és capaç de " +"trobar quin és el seu format." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS pot tractar totes aquestes tasques com tasques en brut, que fa que " +"s'enviïn directament a la impressora sense cap mena de processament." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"És recomanable que trieu aquesta opció si el servidor ha d'acceptar tasques " +"d'impressió d'ordinadors Windows o servidors Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paraŀlel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "sèrie" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "sòcol" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Mecanisme de comunicació amb la impressora:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS utilitza programes externs per comunicar-se amb el dispositiu o port " +"d'impressora." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Malauradament, alguns d'aquests programes poden ser problemàtics. (Per " +"exemple, algun nucli PPC falla si s'utilitza el port paraŀlel.)" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Si us plau, trieu el programa que CUPS hauria d'utilitzar per comunicar-se " +"amb la impressora. L'opció predeterminada és vàlida en la majoria d'entorns." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/cs.po b/debian/po/cs.po new file mode 100644 index 0000000..22d1d76 --- /dev/null +++ b/debian/po/cs.po @@ -0,0 +1,242 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-12-16 15:37+0900\n" +"Last-Translator: Miroslav Kure <kurem@debian.cz>\n" +"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Chcete spustit server kompatibilní s BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Tento CUPS balík obsahuje server, který umí přijímat tiskové úlohy ve stylu " +"BSD a přeposílat je systému CUPS. Měli byste jej povolit pouze v případě, že " +"máte na síti počítače, které posílají úlohy přes služby \"BSD\" nebo \"LPR\" " +"a nedají se přemluvit, aby používaly protokol IPP." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Chcete, aby CUPS tisknul neznámé úlohy jako typ \"raw\"?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"VÅ¡echny tiskové úlohy IPP (Internet Printing Protocol) mají přiřazen typ " +"MIME, podle kterého CUPS pozná, v jakém formátu je úloha zaslána. Protože ne " +"vÅ¡echny zdroje tiskových úloh umí nastavit správný typ, je mnoho úloh " +"zasíláno s MIME typem application/octet-stream a CUPS pak musí hádat, o jaký " +"formát dat se jedná. Pokud CUPS formát neuhodne, implicitně úlohu odmítne." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"Zde můžete nastavit, aby CUPS považoval vÅ¡echny nerozpoznané úlohy jako " +"úlohy typu \"raw\". Takové úlohy se nijak nezpracovávají a jsou odesílány " +"rovnou na tiskárnu." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Jestliže bude server akceptovat tiskové úlohy z Windows počítačů nebo ze " +"Samba serverů, je doporučeno tuto možnost povolit." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelní" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "sériový" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Ovladače pro komunikaci s tiskárnou:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "CUPS používá ovladače pro komunikaci s tiskárnou nebo jejím portem." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Bohužel, některé ovladače nejsou zcela stabilní. Například některá PPC jádra " +"v kombinaci s paralelním ovladačem spadnou." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Vyberte ovladač, který má CUPS použít. Implicitní volba se hodí do větÅ¡iny " +"běžných prostředí." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Pokud budete přijímat tisky z windowsových počítačů, pravděpodobně budete " +#~ "chtít tuto volbu zapnout, protože Windows nastavují vÅ¡em tiskům přes IPP " +#~ "(zpracovaných lokálním ovladačem) MIME typ application/octet-stream. " +#~ "Stejně pracuje i Samba." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Port a/nebo jméno počítače, na kterém má CUPS naslouchat:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Zadejte prosím port nebo jméno počítače, na kterém má daemon CUPS " +#~ "naslouchat příchozím spojením. Povoleny jsou následující formáty:" + +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Číslo portu (631);\n" +#~ " - Jméno počítače (debian.priklad.cz);\n" +#~ " - Počítač:Port (debian.priklad.cz:631). - Socket (/var/run/" +#~ "cups/cups.sock)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "Můžete jich zadat libovolný počet, stačí je oddělit mezerami." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Výchozí port 631 je rezervovaný právě pro Internet Printing Protocol " +#~ "(IPP). Pro samostatný počítač se z bezpečnostních důvodů doporučuje " +#~ "nastavení \"localhost:631\"." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "Vysílat a/nebo poslouchat na síti informace o CUPS tiskárnách?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "Daemon CUPS může do sítě vysílat své informace o tiskárnách a také umí na " +#~ "síti zjiÅ¡Å¥ovat tiskárny nové." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Povolíte-li tuto volbu, daemon CUPS bude periodicky vysílat celoploÅ¡né " +#~ "UDP dotazy, kterými bude zjiÅ¡Å¥ovat nové tiskárny." + +#~ msgid "Incorrect value entered" +#~ msgstr "Zadána chybná hodnota" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "Při zpracovávání čísla portu nebo názvu počítače se vyskytla chyba." + +#~ msgid "Please correct your input." +#~ msgstr "Opravte prosím svou odpověď." diff --git a/debian/po/da.po b/debian/po/da.po new file mode 100644 index 0000000..87d08b6 --- /dev/null +++ b/debian/po/da.po @@ -0,0 +1,244 @@ +# translation of cups_1.1.20final+cvs20040317-3_da.po to Danish +# translation of da.po to Danish +# translation of Debian cups debconf to Danish +# +# Claus Hindsgaul <claus_h@image.dk>, 2004. +# Claus Hindsgaul <claus.hindsgaul@gmail.com>, 2006, 2007. +msgid "" +msgstr "" +"Project-Id-Version: da\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-27 20:59+0200\n" +"Last-Translator: Claus Hindsgaul <claus.hindsgaul@gmail.com>\n" +"Language-Team: Danish\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Ønsker du at sætte BSD lpd-kompatibilitetsserveren op?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS-pakken indeholder en server, der kan modtage print-jobs på BSD-form og " +"sende dem videre til CUPS. Den bør kun sættes op, hvis det er muligt, at " +"andre computere sender jobs over netværket via servicerne \"BSD\" eller \"LPR" +"\", og disse computere ikke kan overgå til at benytte den IPP-protokol, som " +"CUPS benytter." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Ønsker du at CUPS skal udskrive ukendte jobs som rå jobs?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol IPP kræver, at der angives MIME-type for alle " +"printjobs. Da ikke alle printjob-kilder kan medsende den relevante type, vil " +"mange jobs blive sendt med MIME-typen \"application/octet-stream\", og kunne " +"blive afvist, såfremt CUPS ikke kan gætte jobbets format." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS kan håndtere sådanne jobs som \"rå\" jobs, hvilket betyder, at de " +"sendes direkte til printeren uden yderligere behandling." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Det anbefales at vælge denne indstilling, hvis serveren kommer til at " +"modtage printjobs fra Windows-computere eller Samba-servere." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "sokkel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Printer-kommunikationsveje:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS bruger bagvedliggende programmer til at kommunikere med printerenheden " +"eller -porten." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Desværre giver nogle af disse bagvedliggende programmer ofte visse problemer " +"(f.eks. bryder kernen sammen på nogle PPC-maskiner med parallel-programmet)." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Vælg det bagvedliggende program, CUPS skal bruge. Det forvalgte burde være " +"passende under de mest almindelige forhold." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Hvis du vil acceptere printjobs fra Windows-computere, bør du acceptere " +#~ "denne funktion, da Windows giver alle IPP-printjobs, som håndteres af en " +#~ "lokal driver MIME-typen \"application/octet-stream\". Samba sender sine " +#~ "jobs på samme måde." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Port og/eller værtsnavn, CUPS skal lytte på:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Angiv port eller værtsnavn, CUPS-dæmonen skal lytte på. Følgende formater " +#~ "er gyldige:" + +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Portnummer (631);\n" +#~ " - værtsnavn (debian.eksempel.dk);\n" +#~ " - Vært:Port (debian.eksempel.dk:631);\n" +#~ " - Fildomænesokkel (/var/run/cups/cups.sock)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "Du kan kombinere disse i en liste adskilt med mellemrum." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Standardporten 631 er reserveret til Internet-PrinterProtokollen (IPP). " +#~ "\"localhost:631\" anbefales af sikkerhedsgrunde for at sætte et " +#~ "selvstændigt miljø op." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "Rundsend og/eller lyt efter CUPS-printeroplysninger på netværket?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "CUPS-dæmonen kan rundsende printeroplysninger til klienter på netværket " +#~ "og detektere printere på netværket automatisk." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Hvis du vælger denne indstilling, vil CUPS-dæmonen periodisk sende UDP-" +#~ "rundsendinger for at detektere printere." + +#~ msgid "Incorrect value entered" +#~ msgstr "Ugyldig værdi indtastet" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "der opstod en fejl under tolkningaf portnummer eller værtsnavn." + +#~ msgid "Please correct your input." +#~ msgstr "Ret venligst din indtastning." + +#~ msgid "ipp, lpd, parallel, scsi, serial, socket, usb" +#~ msgstr "ipp, lpd, parallel, scsi, seriel, sokkel, usb" + +#~ msgid "Select the backends you want." +#~ msgstr "Vælg det bagvedliggende program, du ønsker." diff --git a/debian/po/de.po b/debian/po/de.po new file mode 100644 index 0000000..ef0106e --- /dev/null +++ b/debian/po/de.po @@ -0,0 +1,176 @@ +# translation of po-debconf template to German +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans# +# Developers do not need to manually edit POT or PO files. +# +# Jens Nachtigall <nachtigall@web.de>, 2004, 2005. +# Matthias Julius <mdeb@julius-net.net>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: de\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-31 11:14-0400\n" +"Last-Translator: Matthias Julius <mdeb@julius-net.net>\n" +"Language-Team: German <debian-l10n-german@lists.debian.org>\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Möchten Sie den Kompatibilitäts-Server für BSD lpd einrichten?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Dieses Paket enthält einen Server, der BSD-artige Druckaufträge " +"entgegennimmt und diese an CUPS weiterleitet. Sie sollten diesen Server nur " +"einsetzen, wenn andere Rechner über Ihren Rechner Druckaufträge via »bsd« " +"oder »lpr« absetzen und diese Rechner nicht auf das von CUPS verwendete IPP-" +"Protokoll umgestellt werden können." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Möchten Sie, dass CUPS unbekannte Druckaufträge unbearbeitet (raw) druckt?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Das Internet Printing Protokoll (IPP) erfordert einen MIME-Typ für alle " +"Druckaufträge. Da nicht jeder Erzeuger von Druckaufträgen den geeigneten Typ " +"einfügen kann, werden viele Aufträge mit dem MIME-Typ »application/octet-" +"stream« abgesendet. Diese Druckaufträge können abgewiesen werden, falls CUPS " +"dessen Format nicht ermitteln kann." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS kann all diese Aufträge als »rohe« (engl.: »raw«) Aufträge behandeln. " +"Das bewirkt, dass sie ohne Bearbeitung direkt an den Drucker gesendet werden." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Es wird empfohlen, diese Option zu wählen, falls der Server Druckaufträge " +"von Windows-Rechnern oder Samba-Servern akzeptieren wird." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "IPP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriell" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "Socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "USB" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "SNMP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Backends für die Kommunikation mit dem Drucker:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS verwendet Backend-Programme zur Kommunikation mit dem Drucker oder Port." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Leider verursachen manche Backend-Programme Probleme. Zum Beispiel stürzen " +"einige PPC-Kernel mit dem Parallel-Backend ab." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Bitte wählen Sie das Backend-Programm zur Verwendung mit CUPS. Die " +"Voreinstellung sollte den meisten Umgebungen gerecht werden." + +#~ msgid "scsi" +#~ msgstr "SCSI" diff --git a/debian/po/es.po b/debian/po/es.po new file mode 100644 index 0000000..dbafa89 --- /dev/null +++ b/debian/po/es.po @@ -0,0 +1,194 @@ +# cups debconf translation to spanish +# Copyright (C) 2003, 2004, 2006, 2007 Software in the Public Interest +# This file is distributed under the same license as the cups package. +# +# Changes: +# - Initial translation +# Carlos Valdivia Yagüe <valyag@dat.etsit.upm.es>, 2003, 2004, 2006 +# - Translation update +# Javier Fernandez-Sanguino <jfs@debian.org>, 2007 +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: cups 1.2.2-1\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-06-21 18:51+0200\n" +"Last-Translator: Carlos Valdivia Yagüe <valyag@dat.etsit.upm.es>\n" +"Language-Team: Debian L10n Spanish Team <debian-l10n-spanish@lists.debian." +"org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "¿Desea configurar el servidor de compatibilidad lpd de BSD?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Este paquete incluye un servidor que acepta trabajos de impresión al estilo " +"BSD y se los envía a CUPS. Configúrelo únicamente en el caso de que haya " +"otras máquinas que envíen trabajos de impresión mediante la red, usando los " +"servicios \"BSD\" o \"LPR\" y no se puede hacer que estos utilice el " +"protocolo IPP que utiliza CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "¿Quiere que CUPS imprima en bruto los trabajos desconocidos?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"En IPP todos los trabajos de impresión tienen un tipo MIME. Puesto que no " +"todas las fuentes de trabajos de impresión asignan correctamente algún tipo " +"MIME, muchos llegan con el tipo «application/octet-stream» y podrían " +"rechazarse si CUPS no puede adivinar el formato del trabajo." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"Es posible hacer que CUPS trate todos estos trabajos como trabajos «en " +"crudo», con lo que se mandan directamente a la impresora sin procesar." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Se recomienda que escoga esta opción si el servidor va a aceptar trabajos de " +"impresión de ordenadores con Windows o servidores Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelo" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serie" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Motores de comunicación con la impresora:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS utiliza diversos motores para comunicarse con el puerto o dispositivo " +"de la impresora." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Desafortunadamente, ciertos motores pueden causar problemas. Por ejemplo, " +"con el motor del puerto paralelo se producen algunas caídas del núcleo en la " +"arquitectura PPC." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Por favor, elija el motor que utilizará CUPS. La opción predeterminada " +"debería ser apta para los entornos más comunes." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Si va a recibir trabajos de impresión desde sistemas Windows es muy " +#~ "probable que desee activar esta opción, ya que Windows da a los trabajos " +#~ "de impresión IPP que procesa localmente el tipo application/octet-stream. " +#~ "Samba también envía los trabajos de impresión de esta manera." diff --git a/debian/po/eu.po b/debian/po/eu.po new file mode 100644 index 0000000..45c2315 --- /dev/null +++ b/debian/po/eu.po @@ -0,0 +1,164 @@ +# translation of cups-eu.po to librezale +# Piarres Beobide <pi@beobide.net>, 2005, 2007. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +msgid "" +msgstr "" +"Project-Id-Version: cups-eu\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-27 15:56+0200\n" +"Last-Translator: Piarres Beobide <pi@beobide.net>\n" +"Language-Team: librezale <librezale@librezale.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1)\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "BSD lpd bateragarritasun zerbitzaria konfiguratu nahi al duzu?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS paketeak BSD-moduko inprimatze lanak onartu eta CUPS-era bidaltzen " +"dituen zerbitzari bat du. Berau \"BSD\" edo \"LPR\" zerbitzuen bidez sare " +"bidez lanak bidaltzen dituzten eta CUPS-ek erabiltzen duen IPP protokoloa " +"erabili ezin duten ordenagailuak badituzu bakarrik konfiguratu behar da." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "CUPS-ek lan ezezagunak lan gordinak bezala inprimatzea nahi duzu?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Inprimatze Protokoloak (IPP) MIME mota bat indartzen du inprimatze " +"lan guztientzat. Inprimatze lan jatorri guztiek ezin dutenez mota zuzena " +"ezarri, lan asko application/octet-stream MIME mota bezala bidaltzen dira " +"eta ukatu egin daitezke CUPS ez bada lan formatu bezeroa ezagutzeko gauza." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"Posible da CUPS-ek lan hauek guztiak lan \"gordinak\" bezala kudea ditzan, " +"honela lan hauek prozesatu gabe bidaliko dira inprimagailura." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Gomendagarria da aukera hau hautatzea zerbitzariak windows duten ordenagailu " +"edo Samba zerbitzarietatik lanak jasoko baditu." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lds" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paraleloa" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriea" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Inprimagailu komunikazio motorea:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS-ek inprimagailu gailu edo atakarekin komunikazioa lortzeko interfaze " +"programakerabiltzen ditu." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Zoritxarrez, zenbait interaze programek arazoak zor ditzakete. (Adibidez " +"zenbait PPC kernel haustura motore paraleloaz)" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Mesedez hautatu CUPS-ek erabiliko duen komunikazio motorea. Aukera " +"lehenetsiak ingurune arruntenetan funtzionatu beharko luke." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/fi.po b/debian/po/fi.po new file mode 100644 index 0000000..fb1f07d --- /dev/null +++ b/debian/po/fi.po @@ -0,0 +1,168 @@ +# translation of cups_1.3.2-1_templates.po to Finnish +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Esko Arajärvi <edu@iki.fi>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: cups_1.3.2-1_templates\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-10-15 13:13+0200\n" +"Last-Translator: Esko Arajärvi <edu@iki.fi>\n" +"Language-Team: Finnish <debian-l10n-finnish@lists.debian.org>\n" +"Language: fi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Finnish\n" +"X-Poedit-Country: FINLAND\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Haluatko pystyttää ”BSD lpd”-yhteensopivuuspalvelimen?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS-paketti sisältää palvelimen, joka voi vastaanottaa BSD-tyylisiä " +"tulostustöitä ja lähettää ne CUPSille. Palvelinta tulisi käyttää vain, jos " +"on todennäköistä, että muut tietokoneet lähettävät töitä verkon yli käyttäen " +"BSD- tai LPR-palveluita, eikä näitä tietokoneita voida asettaa käyttämään " +"CUPSin IPP-protokollaa." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Tuleeko CUPSin tulostaa tuntemattomat työt raakatöinä?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol (IPP) vaatii, että tulostustöille on määritelty " +"MIME-tyyppi. Koska kaikki tulostustöitä lähettävät tahot eivät pysty " +"asettamaan sopivaa tyyppiä, monet työt tulevat lähetetyiksi MIME-tyypillä " +"application/octet-stream ja saattavat tulla hylätyiksi, jos CUPS ei pysty " +"arvaamaan niiden tyyppiä." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS pystyy käsittelemään kaikki tällaiset työt ”raakatöinä”. Tällöin ne " +"lähetetään suoraan tulostimelle ilman käsittelyä." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"On suositeltavaa käyttää tätä optiota, jos palvelin ottaa vastaa töitä " +"Windows-tietokoneilta tai Samba-palvelimilta." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "rinnakkainen" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "sarjallinen" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "pistoke" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Tulostusviestinnän taustaliitännät:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS käyttää taustaliitäntäohjelmia viestiessään tulostinlaitteelle tai " +"tulostusporttiin." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Ikävä kyllä jotkin taustaliitäntäohjelmat aiheuttavat usein ongelmia. " +"Esimerkiksi jotkin PPC-ytimet kaatuvat käytettäessä " +"rinnakkaistaustaliitäntää." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Valitse taustaliitäntäohjelma, jota CUPSin tulisi käyttää. Oletusvalinnan " +"pitäisi toimia yleisimmissä ympäristöissä." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/fr.po b/debian/po/fr.po new file mode 100644 index 0000000..74b8018 --- /dev/null +++ b/debian/po/fr.po @@ -0,0 +1,168 @@ +# Translation of cups debconf templates to French +# Copyright (C) 2004-2007 Christian Perrier <bubulle@debian.org> +# This file is distributed under the same license as the cups package. +# +# +# Christian Perrier <bubulle@debian.org>, 2004, 2005, 2006, 2007. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-12-14 11:57+0530\n" +"Last-Translator: Christian Perrier <bubulle@debian.org>\n" +"Language-Team: French <debian-l10n-french@lists.debian.org>\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: Plural-Forms: nplurals=2; plural=n>1;\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Faut-il installer le serveur compatible avec le démon lpd de BSD ?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Le paquet de CUPS fournit un serveur capable d'accepter des demandes " +"d'impression au style BSD et de les donner à CUPS. Ne le configurez que si " +"des postes du réseau ne sont capable de communiquer avec le serveur qu'avec " +"les services « BSD » ou « LPR » et ne gèrent pas le protocole IPP utilisé " +"par CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "CUPS doit-il imprimer les demandes sans type MIME sous forme brute ?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Selon le protocole IPP (« Internet Printing Protocol »), chaque demande " +"d'impression doit comporter un type MIME. Comme certaines sources de " +"demandes d'impression ne peuvent pas affecter un type MIME adapté, de " +"nombreuses demandes sont soumises avec le type MIME application/octet-" +"stream. Elles peuvent alors être rejetées si CUPS ne peut en déterminer le " +"format." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS peut traiter toutes ces demandes sans type reconnu comme des demandes " +"au format brut et les envoyer sans aucun traitement à l'imprimante." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Il est recommandé de choisir cette option si le serveur est amené à traiter " +"des demandes d'impression d'ordinateurs Windows ou de serveurs Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "IPP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallèle" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "série" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "USB" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "SNMP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Mode de communication avec les imprimantes :" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS utilise différentes méthodes de communication pour ses échanges avec " +"les imprimantes ou les ports d'impression." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Malheureusement, certaines de ces méthodes sont connues pour provoquer des " +"difficultés comme le gel de certains noyaux PowerPC avec la communication " +"parallèle." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "Le choix par défaut est adapté à la majorité des environnements." + +#~ msgid "scsi" +#~ msgstr "SCSI" diff --git a/debian/po/gl.po b/debian/po/gl.po new file mode 100644 index 0000000..862d768 --- /dev/null +++ b/debian/po/gl.po @@ -0,0 +1,241 @@ +# Galician translation of cups' debconf templates. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the cups package. +# Jacobo Tarrio <jtarrio@debian.org>, 2006, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-12-16 15:35+0900\n" +"Last-Translator: Jacobo Tarrio <jtarrio@debian.org>\n" +"Language-Team: Galician <proxecto@trasno.net>\n" +"Language: gl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "" +"causan problemas (por exemplo, algúns núcleos para PPC fallan co adaptador " +"paralelo).<" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"O paquete CUPS contén un servidor que pode aceptar traballos de impresión " +"estilo BSD e envialos a CUPS. Só se debería activar se ten outros " +"ordenadores que poidan enviar traballos pola rede mediante os servizos \"BSD" +"\" ou \"LPR\", e se eses ordenadores non se poden configurar para que " +"empreguen o protocolo IPP que emprega CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"¿Quere que CUPS imprima os traballos descoñecidos coma traballos en cru?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"O protocolo de impresión por Internet (IPP) obriga a que tódolos traballos " +"de impresión teñan un tipo MIME. Como non todas as fontes de traballos de " +"impresión poden indicar un tipo axeitado, moitos traballos envíanse co tipo " +"MIME application/octet-stream, e poden quedar rexeitados se CUPS non pode " +"determinar o formato do traballo." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS pode tratar todos eses traballos coma traballos \"en cru\", o que fai " +"que se envíen directamente á impresora sen os procesar." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Recoméndase que escolla esta opción se o servidor ha aceptar traballos de " +"impresión de ordenadores Windows ou servidores Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelo" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serie" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Sistemas de comunicación coa impresora:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS emprega programas \"motor\" para se comunicar co dispositivo ou porto " +"da impresora." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Por desgracia, algúns destes programas \"motor\" poden causar problemas. Por " +"exemplo, algúns núcleos para PPC fallan co motor de porto paralelo." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Escolla o programa que debe empregar CUPS. A opción por defecto debería " +"axustarse aos ambientes máis habituais." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Se vai aceptar traballos de impresión de ordenadores con Windows, " +#~ "probablemente sexa mellor activar esta opción, xa que Windows envía os " +#~ "traballos de impresión IPP procesados cun controlador local co tipo MIME " +#~ "application/octet-stream. Samba tamén envía os seus traballos de " +#~ "impresión do mesmo xeito." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Porto e/ou nome de servidor no que CUPS ha escoitar:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Especifique o porto ou nome de servidor no que ha escoitar o servizo de " +#~ "CUPS. Admítense os seguintes formatos:" + +#, fuzzy +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Número de porto (631);\n" +#~ " - Nome de servidor (debian.exemplo.com);\n" +#~ " - Servidor:Porto (debian.exemplo.com:631)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "" +#~ "Pode combinalos facendo unha lista de elementos separados por comas." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "O porto por defecto, 631, está reservado para o Protocolo de Impresión de " +#~ "Internet (IPP). Recoméndase que empregue \"localhost:631\" para crear un " +#~ "sistema aillado por motivos de seguridade." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "¿Emitir e/ou escoitar información de impresoras de CUPS na rede?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "O servizo CUPS pode emitir información de impresoras para os clientes da " +#~ "rede, e pode detectar automaticamente as impresoras da rede." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Se escolle esta opción, o servizo CUPS ha enviar paquetes \"broadcast\" " +#~ "UDP para detectar as impresoras." + +#~ msgid "Incorrect value entered" +#~ msgstr "Introduciuse un valor incorrecto" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "houbo un erro ao analizar o número de porto ou o nome do servidor." + +#~ msgid "Please correct your input." +#~ msgstr "Corrixa o que introduciu." diff --git a/debian/po/it.po b/debian/po/it.po new file mode 100644 index 0000000..4a02037 --- /dev/null +++ b/debian/po/it.po @@ -0,0 +1,165 @@ +# Italian (it) translation of debconf templates for cups +# Copyright (C) 2006 Software in the Public Interest +# This file is distributed under the same license as the cups package. +# Luca Monducci <luca.mo@tiscali.it>, 2006, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cups 1.2.7 italian debconf templates\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-27 20:09+0200\n" +"Last-Translator: Luca Monducci <luca.mo@tiscali.it>\n" +"Language-Team: Italian <tp@lists.linux.it>\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Si vuole configurare il server di compatibilità con lpd di BSD?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Il pacchetto CUPS contiene un server che può accettare job di stampa in " +"formato BSD per poi girarli a CUPS. Questo server dovrebbe essere attivato " +"solo se in rete ci sono altri computer che potrebbero inviare job tramite i " +"servizi \"BSD\" o \"LPR\" e che non possono essere configurati per usare il " +"protocollo IPP, cioè quello usato da CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Si vuole che CUPS stampi i job sconosciuti come job \"raw\"?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Il protocollo IPP (Internet Printing Protocol) assegna un tipo MIME a tutti " +"i job di stampa. Dato che non tutte le sorgenti dichiarano il tipo corretto, " +"molti dei job inviati hanno tipo application/octect-stream e potrebbero " +"essere rifiutati se CUPS non riesce a indovinarne il giusto formato del job." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS può trattare tutti questi job come job \"raw\", ciò comporta l'invio " +"diretto alla stampante, senza ulteriori elaborazioni." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Si raccomanda di attivare questa opzione se il server deve accettare job di " +"stampa da computer con Windows oppure da server Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallela" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriale" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Backend di comunicazione con la stampante:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS usa dei programmi di backend per comunicare con il device o la porta " +"della stampante." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Sfortunatamente alcuni programmi di backend porebbero causare dei problemi. " +"Per esempio alcuni kernel per PPC si bloccano con il backend per la porta " +"parallela." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Scegliere quale programma di backend deve usare CUPS. La scelta predefinita " +"dovrebbe essere adatta per la maggioranza dei casi." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/ja.po b/debian/po/ja.po new file mode 100644 index 0000000..e145c18 --- /dev/null +++ b/debian/po/ja.po @@ -0,0 +1,172 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: cups 1.2\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-12-16 15:35+0900\n" +"Last-Translator: Kenshi Muto <kmuto@debian.org>\n" +"Language-Team: Japanese <debian-japanese@lists.debian.org>\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "BSD lpd 互換サーバをセットアップしますか?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS パッケージは BSD スタイルの印刷ジョブを受け付け、CUPS にそれを送るサーバ" +"を含んでいます。\"BSD\" または \"LPR\" サービス経由でネットワーク越しにジョブ" +"を送るほかのコンピュータがあり、かつそれらのコンピュータは CUPS の使っている " +"IPP プロトコルを使うよう変更できない、という場合にのみセットアップすべきで" +"す。" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "未知のジョブを生データ (raw) ジョブとして CUPS に印刷させますか?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol (IPP) でのすべての印刷ジョブは MIME 形式を持ちま" +"す。印刷ジョブのすべてのソースに適切な形式が付いているとは限らず、多くのジョ" +"ブは MIME 形式 application/octet-stream として送られ,CUPS がそのジョブの" +"フォーマットを推測できなかったときには拒否されます。" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"そのようなジョブを、すべて生データ (\"raw\") ジョブとして加工なしに直接プリン" +"タに送るように CUPS を設定できます。" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"サーバが Windows コンピュータあるいは Samba サーバからの印刷ジョブを受け付け" +"る場合は、この選択肢で「はい」と答えることをお勧めします。" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "IPP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "LPD" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "パラレル" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "シリアル" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "ソケット" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "USB" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "SNMP" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "プリンタ通信バックエンド:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS はプリンタデバイスまたはポートと会話するのにバックエンドプログラムを使い" +"ます。" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"困ったことに、いくつかのバックエンドプログラムは種々の問題を引き起こします。" +"たとえば、ある種の PPC カーネルは parallel バックエンドでクラッシュします。" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"CUPS で利用したいバックエンドプログラムを選択してください。デフォルトの選択は" +"たいていの一般的な環境に合っています。" + +#~ msgid "scsi" +#~ msgstr "SCSI" diff --git a/debian/po/ml.po b/debian/po/ml.po new file mode 100644 index 0000000..fd37621 --- /dev/null +++ b/debian/po/ml.po @@ -0,0 +1,168 @@ +# Malayalam translation of cups debconf template. +# Copyright (C) 2007 THE cups' COPYRIGHT HOLDER +# This file is distributed under the same license as the cups package. +# Praveen|പ്രവീണ്‍ A|എ <pravi.a@gmail.com>, 2007. +# +# +msgid "" +msgstr "" +"Project-Id-Version: cups 20070331\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-31 07:18+0530\n" +"Last-Translator: Praveen|പ്രവീണ്‍ A|എ <pravi.a@gmail.com>\n" +"Language-Team: Swathanthra|സ്വതന്ത്ര Malayalam|മലയാളം Computing|കമ്പ്യൂട്ടിങ്ങ് <smc-" +"discuss@googlegroups.com>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "BSD lpd പൊരുത്ത സേവകന്‍ സജ്ജീകരിയ്ക്കാന്‍ നിങ്ങളാഗ്രഹിയ്ക്കുന്നുണ്ടോ?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"BSD-സ്റ്റൈലിലുള്ള അച്ചടി ജോലികള്‍ സ്വീകരിയ്ക്കാനും CUPS ന് സമര്‍പ്പിയ്ക്കാനും കഴിവുള്ള ഒരു സേവകന്‍ " +"CUPS പാക്കേജ് ഉള്‍ക്കൊള്ളുന്നുണ്ട്. മറ്റ് കമ്പ്യൂട്ടറുകള്‍ \"BSD\" അല്ലെങ്കില്‍ \"LPR\" സേവനങ്ങള്‍ വഴി " +"നെറ്റ്‌വര്‍ക്കിലൂടെ ജോലികള്‍ സമര്‍പ്പിയ്ക്കാനുള്ള സാധ്യതയുണ്ട് എന്ന് മാത്രമല്ല ഈ കമ്പ്യൂട്ടറുകള്‍ CUPS " +"ഉപയോഗിയ്ക്കുന്ന IPP പെരുമാറ്റച്ചട്ടം ഉപയോഗിയ്ക്കാനായി പരിവര്‍ത്തനം ചെയ്യാന്‍ സാധ്യവുമല്ല എന്ന " +"അവസരത്തില്‍ മാത്രമേ ഇത് സജ്ജീകരിയ്ക്കേണ്ടതുള്ളൂ." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"മനസിലാവാത്ത ജോലികള്‍ അസംസ്കൃത ജോലികളായി CUPS അച്ചടിയ്ക്കണമെന്ന് നിങ്ങളാഗ്രഹിയ്ക്കുന്നുണ്ടോ?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"ഇന്റര്‍നെറ്റ് അച്ചടി പെരുമാറ്റച്ചട്ടം (IPP) എല്ലാ അച്ചടി ജോലികള്‍ക്കും ഒരു MIME തരം " +"നിര്‍ബന്ധമാക്കുന്നു. അച്ചടി ജോലികളുടെ എല്ലാ സ്രോതസ്സുകള്‍ക്കും അത്തരമൊരു അനുയോജ്യമായ തരത്തിലുള്ളത് " +"കൂട്ടിവയ്ക്കാന്‍ പറ്റാത്തതിനാല്‍ പല ജോലികളും application/octet-stream എന്ന തരത്തിലാണ് " +"സമര്‍പ്പിയ്ക്കപ്പെടുന്നത് എന്നതിനാല്‍ CUPS ന് ജോലിയുടെ ഫോര്‍മാറ്റ് ഊഹിയ്ക്കാന്‍ സാധിച്ചില്ലെങ്കില്‍ " +"തള്ളിക്കളയപ്പെട്ടേയ്ക്കാം." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"അത്തരത്തിലുള്ള ജോലികള്‍ CUPS ന് \"അസംസ്കൃത\" ജോലികള്‍ എന്ന രീതിയില്‍ കൈകാര്യം ചെയ്യാം, അത് " +"പരിശോധിയ്ക്കാതെ തന്നെ അച്ചടി യന്ത്രത്തിലേയ്ക്ക് നേരിട്ട് അയയ്ക്കാന്‍ കാരണമാകുന്നു." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"വിന്‍ഡോസ് കമ്പ്യൂട്ടറുകളില്‍ നിന്നോ സാംബ സേവകരില്‍ നിന്നോ അച്ചടി ജോലികള്‍ സ്വീകരിയ്ക്കുന്നതാണെങ്കില്‍ " +"ഇത് തിരഞ്ഞെടുക്കാന്‍ ശുപാര്‍ശ ചെയ്തിരിയ്ക്കുന്നു." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serial" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "അച്ചടി യന്ത്ര ആശയവിനിമയ ബാക്കെന്‍ഡുകള്‍:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"അച്ചടി ഉപകരണവുമായോ അല്ലെങ്കില്‍ പോര്‍ട്ടുമായോ ആശയവിനിമയം ചെയ്യാന്‍ ബാക്കെന്‍ഡ് പ്രോഗ്രാമുകളാണ് " +"CUPS ഉപയോഗിയ്ക്കുന്നത്." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"നിര്‍ഭാഗ്യവശാല്‍ ചില ബാക്കെന്‍ഡ് പ്രോഗ്രാമുകള്‍ ചില പ്രശ്നങ്ങളുണ്ടാക്കാന്‍ സാധ്യതയുണ്ട്. ഉദാഹരണത്തിന്, " +"ചില PPC കെര്‍ണലുകള്‍ parallel ബാക്കെന്‍ഡുമായി ക്രാഷ് ചെയ്യും." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"ദയവായി CUPS ഉപയോഗിയ്ക്കുന്ന ബാക്കെന്‍ഡ് പ്രോഗ്രാം തിരഞ്ഞെടുക്കുക. ഡിഫാള്‍ട്ടായി തിരഞ്ഞെടുത്ത വില " +"സാധാരണയായുള്ള അധിക പരിസ്ഥിതികളിലും ചേരും." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/nb.po b/debian/po/nb.po new file mode 100644 index 0000000..c562bbb --- /dev/null +++ b/debian/po/nb.po @@ -0,0 +1,165 @@ +# translation of nb.po_[sQSfZa].po to Norwegian BokmÃ¥l +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# +# Bjørn Steensrud <bjornst@powertech.no>, 2007. +msgid "" +msgstr "" +"Project-Id-Version: nb.po_[sQSfZa]\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-27 19:04+0200\n" +"Last-Translator: Bjørn Steensrud <bjornst@powertech.no>\n" +"Language-Team: Norwegian BokmÃ¥l <i18n-nb@lister.ping.uio.no>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Vil du sette opp en tjener kompatibel med BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS-pakka inneholder en tjener som kan ta imot utskriftsjobber som er i BSD-" +"stil og sende dem over til CUPS. Du bør bare sette den opp dersom du har " +"andre datamaskiner som sender utskrifter over nettverket via «BSD» eller " +"«LPR»-tjenester, og disse maskinene ikke kan endres til Ã¥ bruke IPP - " +"Internet Printing Protocol - som CUPS bruker." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Vil du at CUPS skal skrive ut ukjente jobber som rÃ¥ utskrift?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Alle utskriftsjobber i IPP fÃ¥r en MIME-type. Siden ikke alle kilder som " +"sender utskriftsjobber kan legge pÃ¥ en passende type, sÃ¥ blir mange jobber " +"levert som MIME-typen application/octet-stream og kan bli avvist hvis CUPS " +"ikke kan gjette seg til den rette typen." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS kan behandle alle slike jobber som «rå» utskrift, noe som gjør at de " +"sendes direkte til skriveren uten behandling." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Hvis tjeneren kommer til Ã¥ behandle utskriftsjobber fra Windows-maskiner " +"eller Samba-tjenere anbefales det at dette slÃ¥s pÃ¥." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallell" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriell" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "sokkel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Kommunikasjonsmotorer for skriver:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS bruker bakgrunns-«motorer» til Ã¥ kommunisere med skriverenheten eller " +"porten." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Dessverre lager noen motorer vanskeligheter. Noen PPD-kjerner, for eksempel, " +"krasjer med parallell-motoren." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Velg motor-program som CUPS skal bruke. Standardvalget passer antakelig i de " +"vanligste miljøene." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/nl.po b/debian/po/nl.po new file mode 100644 index 0000000..11b050d --- /dev/null +++ b/debian/po/nl.po @@ -0,0 +1,256 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: cups 1.1.20candidate6\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-30 17:47+0100\n" +"Last-Translator: Bart Cornelis <cobaco@skolelinux.no>\n" +"Language-Team: Debian Dutch <debian-l10n-dutch@lists.debian.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Dutch\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "" +"Wilt u de server die zorgt voor compatibiliteit met de BSD-lpd instellen?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Het pakket 'cups-bsd' bevat een server die BSD-stijl afdrukopdrachten " +"accepteert en naar CUPS doorstuurt. Deze server dient enkel ingesteld te " +"worden als er andere computers zijn die afdrukopdrachten over het netwerk " +"sturen via \"BSD\"- of \"LPR\"-diensten, EN deze computers niet kunnen " +"worden ingesteld om het IPP-protocol te gebruiken (CUPS gebruikt dit " +"protocol zelf ook)." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Wilt u dat CUPS onbekende opdrachten onbewerkt naar de printer stuurt?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Het 'Internet Printing Protocol' (IPP) vereist dat alle printtaken een MIME-" +"type hebben. Niet alle printtaken komen van een bron die in staat is om een " +"geschikt MIME-type aan de printtaak te hangen, in zo'n geval worden ze " +"aangeboden met het type application/octet-stream. Als CUPS niet in staat is " +"om het correcte formaat van de taak te raden worden deze printtaak-aanvragen " +"afgewezen." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS kan deze printtaken als 'raw'-taken afhandelen, wat inhoudt dat ze " +"zonder verdere bewerking direct naar de printer gestuurd worden." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Deze optie is aan te raden wanneer deze server printtaken dient te " +"aanvaarden van Windows-computers of Samba-servers." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serieel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Backends voor printercommunicatie:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS gebruikt backend-programma's voor de communicatie met de printer en de " +"printerpoort." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Helaas kunnen sommige backend-programma's problemen veroorzaken. (Bv. " +"sommige PPC-kernels kunnen vastlopen bij gebruik van het 'parallel'-backend.)" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Welk backend-programma wilt u CUPS laten gebruiken?. De standaardwaarde zou " +"voor de meeste omgevingen moeten voldoen." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Als u printopdrachten van Windows-computers wilt accepteren, dan kunt u " +#~ "deze optie het beste aanzetten. Windows geeft namelijk alle " +#~ "afdrukopdrachten die zijn verwerkt door een lokaal stuurprogramma het " +#~ "MIME-type application/octet-stream. Ook Samba verstuurt afdrukopdrachten " +#~ "op deze manier." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Poort en/of domeinnaam waarnaar CUPS moet luisteren:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Gelieve de poort of domeinnaam te specificeren waarnaar de CUPS-" +#~ "achtergronddienst moet luisteren. Volgende formaten zijn toegestaan:" + +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Poortnummer (631);\n" +#~ " - Domeinnaam (debian.example.com);\n" +#~ " - Domeinnaam:Poort (debian.example.com:631)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "" +#~ "U kunt om het even welk hiervan combineren door deze met een spatie te " +#~ "scheiden." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Standaardpoort 631 is gereserveerd voor het Internet Printing Protocol " +#~ "(IPP). Om veiligheidsredenen is \"localhost:631\" aangewezen om in een " +#~ "afzonderlijke omgeving te installeren." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "" +#~ "Uitzenden en/of luisteren naar CUPS-printerinformatie op het netwerk?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "De CUPS-achtergronddienst kan voor clients op het netwerk automatisch, " +#~ "printerinformatie uitzenden en printers detecteren." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Indien u deze optie kiest, zal de CUPS-achtergronddienst periodiek UDP-" +#~ "uitzendingen verzenden om printers te detecteren." + +#~ msgid "Incorrect value entered" +#~ msgstr "Ongeldige waarde ingevoerd" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "" +#~ "Er is een fout voorgekomen tijdens het inlezen van het poortnummer of de " +#~ "domeinnaam" + +#~ msgid "Please correct your input." +#~ msgstr "U dient uw ingevoerde gegevens te verbeteren." + +#~ msgid "Select the backends you want." +#~ msgstr "Selecteer de backends die u wilt." diff --git a/debian/po/pl.po b/debian/po/pl.po new file mode 100644 index 0000000..0e64312 --- /dev/null +++ b/debian/po/pl.po @@ -0,0 +1,165 @@ +# Copyright (C) 2011 +# This file is distributed under the same license as the cups package. +# +# Michał Kułach <michal.kulach@gmail.com>, 2012. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2012-01-27 21:29+0100\n" +"Last-Translator: Michał Kułach <michal.kulach@gmail.com>\n" +"Language-Team: Polish <debian-l10n-polish@lists.debian.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Lokalize 1.2\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " +"|| n%100>=20) ? 1 : 2);\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Czy zainstalować serwer kompatybilność z lpd BSD?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Pakiet CUPS zawiera serwer, który może akceptować zadania drukowania BSD i " +"przekazywać je do CUPS-a. Powinien być on instalowany tylko wtedy, jeśli " +"istnieje prawdopodobieństwo, że inne komputery będą wysyłać zadania " +"drukowania przez sieć, korzystając z usług \"BSD\" lub \"LPR\" i nie mogą " +"zostać przekonfigurowane na protokół IPP, który jest używany przez CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Czy CUPS powinien drukować nieznane zadania jako zadania \"surowe\"?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol (IPP), czyli internetowy protokół drukowania, " +"wymusza typ MIME na wszystkich zadaniach druku. Ponieważ nie każde źródło " +"może dołączyć odpowiedni typ, wiele zadań jest wysyłanych jako typ MIME " +"application/octet-stream i może zostać odrzuconych przez CUPS, jeśli nie uda " +"się mu odgadnąć właściwego formatu zadania." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS może obsługiwać wszystkie tego typu zadania jako zadania \"surowe\", " +"wysyłając je do drukarki bez żadnej obróbki." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Zaleca się wybranie tej opcji, jeśli serwer będzie akceptował zadania druku z " +"komputerów z Windowsem lub z serwerów Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "równoległy" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "szeregowy" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "gniazdo" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Backend komunikacji drukarki:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS używa programów typu \"backend\" do komunikacji z urządzeniem lub portem " +"drukarki." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Niestety, niektóre backendy mogą sprawiać problemy. Niektóre jądra PowerPC " +"przestają działać z backendem \"równoległym\"." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Proszę wybrać backend, który ma być używany przez CUPS. Domyślny wybór jest " +"odpowiedni w większości przypadków." + diff --git a/debian/po/pt.po b/debian/po/pt.po new file mode 100644 index 0000000..834cd80 --- /dev/null +++ b/debian/po/pt.po @@ -0,0 +1,179 @@ +# Portuguese translation for cups's debconf messages +# Copyright (C) 2007 Carlos Lisboa <carloslisboa@gmail.com> +# This file is distributed under the same license as the cups package. +# Carlos Lisboa <carloslisboa@gmail.com>, 2007. +# Miguel Figueiredo <elmig@debianpt.org>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-04-08 23:35+0100\n" +"Last-Translator: Miguel Figueiredo <elmig@debianpt.org>\n" +"Language-Team: Portuguese <traduz@debianpt.org>\n" +"Language: pt\n" +"MIME-Version: 1.0n\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Deseja configurar o servidor de compatibilidade lpd BSD?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"O pacote cups contém um servidor que pode aceitar trabalhos de impressão do " +"estilo BSD e submetê-los ao CUPS. Deve ser apenas configurado se possui " +"outros computadores que submetam trabalhos na rede através de serviços \"BSD" +"\" ou \"LPR\", e que esses computadores não possam ser convertidos para usar " +"o protocolo IPP que o CUPS usa." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Deseja que o CUPS imprima trabalhos desconhecidos como trabalhos 'raw'?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"O Internet Printing Protocol (IPP) adopta um tipo MIME para todos os " +"trabalhos de impressão. Como nem todas as fontes de trabalhos de impressão " +"podem anexar o tipo apropriado, muitos trabalhos são submetidos com do tipo " +"MIME application/octet-stream e podem ser rejeitados se o CUPS não puder " +"adivinhar o formato do trabalho." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"O CUPS pode lidar com tais trabalhos como trabalhos \"raw\", o que faz com " +"que sejam enviados directamente para a impressora sem que sejam processados." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"É recomendado escolher esta opção se o servidor irá aceitar trabalhos de " +"impressão a partir de computodores com Windows ou de servidores Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralela" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "série" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "'Backends' de comunicação com a impressora" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"O CUPS usa programas de 'backend' para comunicar com a porta ou dispositivo " +"da impressora." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Infelizmente, alguns programas de 'backend' podem causar alguns problemas. " +"Por exemplo, alguns kernels PPC bloqueiam' com o 'backend' paralelo." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Escolha qual o 'backend' a ser usado pelo CUPS. A escolha por omissão deve " +"servir a maioria dos ambientes mais comuns." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Se for aceitar trabalhos de impressão de computadores Windows, " +#~ "provavelmente quererá esta opção configurada, já que o Windows anexa a " +#~ "todos os trabalhos de impressão processados por uma impressora local o " +#~ "tipo MIME 'application/octet-stream'. Os trabalhos de impressão do samba " +#~ "também são submetidos desta forma." diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po new file mode 100644 index 0000000..dca3a00 --- /dev/null +++ b/debian/po/pt_BR.po @@ -0,0 +1,253 @@ +# Brazilian Portuguese translation of cups +# This file is distributed under the same license as the aiccu package. +# André Luis Lopes (andrelop) <andrelop@debian.org>, 2005-2006. +# Felipe Augusto van de Wiel (faw) <faw@debian.org>, 2006-2007. +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-12-16 15:36+0900\n" +"Last-Translator: Felipe Augusto van de Wiel (faw) <faw@debian.org>\n" +"Language-Team: l10n portuguese <debian-l10n-portuguese@lists.debian.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"pt_BR utf-8\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Você quer configurar o servidor de compatibilidade BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"O pacote CUPS contém um servidor que pode aceitar trabalhos de impressão no " +"estilo BSD e enviá-los ao CUPS. Isto deverá ser configurado somente se você " +"possui outros computadores enviando trabalhos de impressão pela rede via " +"serviços \"BSD\" ou \"LPR\" e estes computadores não puderem ser convertidos " +"para usar o protocolo IPP que o CUPS utiliza." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Você deseja que o CUPS imprima trabalhos desconhecidos como trabalhos \"raw" +"\"?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"O Internet Printing Protocol (IPP - Protocolo de Impressão da Internet) " +"força um tipo MIME para todos os trabalhos de impressão. Como nem todas as " +"fontes de trabalhos de impressão podem anexar um tipo apropriado, muitos " +"trabalhos são enviados como o tipo MIME application/octet-stream e podem " +"ser rejeitados se o CUPS não adivinhar o formato do trabalho." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"O CUPS pode manipular todos estes trabalhos como trabalhos \"raw\", o que " +"faz com que eles sejam enviados diretamente para a impressora sem " +"processamento." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"É recomendado escolher esta opção se o servidor vai aceitar trabalhos de " +"impressão de computadores Windows ou servidores Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelo" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serial" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "\"Backends\" de comunicação com impressoras:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"O CUPS utiliza um programa \"backend\" para comunicação com o dispositivo ou " +"porta de impressão." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Infelizmente, alguns programas \"backend\" causam alguns problemas. Por " +"exemplo, alguns núcleos (\"kernels\") PPC travam com o \"backend parallel" +"\" (paralelo)." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Por favor, selecione o programa \"backend\" a ser usado pelo CUPS. A escolha " +"padrão deve se encaixar na maiorias dos ambientes." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Caso você esteja planejando aceitar trabalhos de impressão de " +#~ "computadores Windows, você provavelmente irá precisar dessa opção " +#~ "habilitada, uma vez que o Windows atribui a todos os trabalhos de " +#~ "impressão IPP processados por um driver local o tipo MIME application/" +#~ "octet-stream. O Samba também envia seus trabalhos de impressão desta " +#~ "maneira." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Porta e/ou nome de host onde o CUPS irá ouvir :" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Por favor, especifique em qual porta ou nome de host o daemon CUPS irá " +#~ "ouvir. Os formatos a seguir são suportados :" + +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Número de porta (631);\n" +#~ " - Nome de host (debian.exemplo.com);\n" +#~ " - Host:Porta (debian.exemplo.com:631);\n" +#~ " - Socket de domínio em arquivo (/var/run/cups/cups.sock)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "" +#~ "Você pode combinar quaisquer um desses formatos especificando os mesmos " +#~ "em uma lista separada por espaços." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "A porta padrão 631 é reservada para o Protocolo de Impressão Internet " +#~ "(IPP). \"localhost:631\" é o recomendado para configuração de um ambiente " +#~ "de trabalho fora de uma rede por razões de segurança." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "" +#~ "Enviar broadcast e/ou ouvir por informações de impressoras CUPS na rede ?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "O daemon CUPS pode enviar informações sobre impressoras via broadcasts " +#~ "para clientes na rede e também detectar impressoras na rede " +#~ "automaticamente." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Caso você habilite esta opção, o daemon CUPS irá periodicamente enviar " +#~ "broadcasts UDP para detectar impressoras." + +#~ msgid "Incorrect value entered" +#~ msgstr "Valor incorreto informado" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "" +#~ "um erro ocorreu durante a leitura do número de porta ou do nome de host." + +#~ msgid "Please correct your input." +#~ msgstr "Por favor, corrija o que foi informado." + +#~ msgid "ipp, lpd, parallel, scsi, serial, socket, usb" +#~ msgstr "ipp, lpd, parallel, scsi, serial, socket, usb" + +#~ msgid "Select the backends you want." +#~ msgstr "Selecione o backend desejado." diff --git a/debian/po/ro.po b/debian/po/ro.po new file mode 100644 index 0000000..6d49dd1 --- /dev/null +++ b/debian/po/ro.po @@ -0,0 +1,184 @@ +# translation of ro.po to Romanian +# Romanian translation of cupsys. +# Copyright (C) 2006 THE cupsys'S COPYRIGHT HOLDER +# This file is distributed under the same license as the cupsys package. +# +# Stan Ioan-Eugen <stan.ieugen@gmail.com>, 2006. +# Eddy Petrișor <eddy.petrisor@gmail.com>, 2008. +msgid "" +msgstr "" +"Project-Id-Version: ro\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2008-06-30 03:23+0300\n" +"Last-Translator: Eddy Petrișor <eddy.petrisor@gmail.com>\n" +"Language-Team: Romanian <debian-l10n-romanian@lists.debian.org>\n" +"Language: ro\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " +"20)) ? 1 : 2;\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Vreți să instalați serverul de compatibilitate BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Acest pachet conține un server care poate să accepte și sarcini de imprimare " +"în stil BSD pe care să le transmită la CUPS. Ar trebui să fie instalat doar " +"dacă există calculatoare în rețea care trimit sarcini prin serviciile „BSD” " +"sau „LPR”,iar aceste calculatoare nu pot fi modificate să folosească " +"protocolul IPP folosit de CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Doriți ca sarcinile necunoscute să fie imprimate de CUPS folosind formatul " +"brut?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Protocolul de tipărire prin Internet (IPP) impune ca sarcinile de imprimare " +"să aibă un tip MIME. Deoarece nu toate sursele de sarcini de imprimare pot " +"atașa un tip potrivit, multe sarcini ajung să fie trimise cu tipul MIME " +"application/octet-stream și ar putea refuzate în cazul în care CUPS nu ar " +"reuși să ghicească formatul." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS poate trata toate sarcinile de acest fel ca sarcini cu format „brut”, " +"ceea ce va face să fie trimise direct la imprimantă, fără procesare." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Se recomandă alegerea acestei opțiuni, dacă serverul va accepta sarcini de " +"imprimare de la calculatoare Windows sau de la servere Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "portul paralel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "portul serial" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Module de comunicare cu imprimanta:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS folosește diverse module/aplicații-suport pentru comunicarea cu " +"imprimanta sau cu portul de imprimantă." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Din păcate, unele aplicații-suport pot cauza probleme. De exemplu, unele " +"nuclee pentru PPC se defectează atunci când este folosit modulul paralel." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Alegeți modulul pe care să-l folosească CUPS. Valoarea implicit selectată ar " +"trebui să fie potrivită pentru majoritatea mediilor obișnuite." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Dacă veți accepta lucrări de imprimare de la calculatoare cu Windows, " +#~ "veți doriprobabil să selectați această opțiune, deoarece Windows " +#~ "stabilește tuturor lucrărilor de imprimare IPP procesate de driverul " +#~ "local tipul MIME aplicație/sir-de-octeți. Și Samba trimite lucrările de " +#~ "imprimare în acest mod." diff --git a/debian/po/ru.po b/debian/po/ru.po new file mode 100644 index 0000000..458e897 --- /dev/null +++ b/debian/po/ru.po @@ -0,0 +1,251 @@ +# translation of cups-ru.po to Russian +# translation of cups_1.1.23-12_ru.po to Russian +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# Yuri Kozlov <kozlov.y@gmail.com>, 2005. +# +# Translator: Yuri Kozlov <kozlov.y@gmail.com>" +msgid "" +msgstr "" +"Project-Id-Version: cups_1.2.7-4_ru.po\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-04-05 11:27+0300\n" +"Last-Translator: Sergey Alyoshin <alyoshin.s@gmail.com>\n" +"Language-Team: Russian <debian-l10n-russian@lists.debian.org>\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: KBabel 1.9.1\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Хотите установить сервер совместимости с BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Этот пакет CUPS содержит сервер, который может принимать задания печати в " +"стиле BSD и посылать их в CUPS. Его рекомендуется устанавливать только в том " +"случае, если в сети есть другие компьютеры, которые отправляют задания по " +"сети с помощью \"BSD\" или \"LPR\" сервисов, и эти компьютеры не могут " +"работать с протоколом IPP, который используется в CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"Хотите чтобы CUPS печатал неизвестные задания как необработанные задания?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Все задания печати с помощью интернет протокола печати (IPP) имеют тип MIME. " +"Так как не все источники заданий печати могут назначать соответствующий тип, " +"многие задания посылаются с MIME типом приложение/поток-октетов и могут быть " +"отклонены, если CUPS не определит формат заданий." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS может обслуживать все такие задания как \"необработанные\", что ведет к " +"их посылке напрямую к устройству печати без обработки." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Рекомендуется выбрать этот параметр если сервер будет получать задания " +"печати от компьютеров с Windows или от серверов Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serial" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Интерфейсные программы для связи с принтером:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS использует интерфейсные программы для связи с устройством печати или " +"портом." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"К сожалению, некоторые интерфейсные программы могут вызывать проблемы. " +"Например, некоторые ядра PPC рушатся при использовании интерфейса parallel." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Выберите интерфейсную программу, которая будет использоваться CUPS. Выбор по " +"умолчанию должен работать с большинством оборудования." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Если вы получаете задания печати с компьютеров с Windows, то, вероятно, " +#~ "лучше установить этот параметр, так как Windows присваивает всем заданиям " +#~ "печати IPP, обработанным локальным драйверов MIME тип application/octet-" +#~ "stream. Samba также отправляет свои задания печати в таком виде." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "" +#~ "Порт или/и имя машины через который будет осуществляться подключение к " +#~ "CUPS:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Укажите порт или имя машины на котором будет работать демон CUPS. " +#~ "Допустимы следующие форматы:" + +#, fuzzy +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Номер порта (631);\n" +#~ " - Имя машины (debian.example.com);\n" +#~ " - Машина:Порт (debian.example.com:631)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "Можно использовать несколько любых типов, разделяя их пробелом." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Порт по умолчанию 631 зарезервирован для протокола печати в Интернет " +#~ "(Internet Printing Protocol, IPP). В целях безопасности для автономных " +#~ "систем рекомендуется использовать настройку \"localhost:631\"." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "Анонсировать и/или слушать CUPS информацию о принтере в сети?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "Демон CUPS может анонсировать информацию о принтере для сетевых клиентов, " +#~ "и обнаруживать другие принтеры в сети автоматически." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "При выборе этого параметра демон CUPS будет периодически посылать " +#~ "широковещательные UDP пакеты для обнаружения принтеров." + +#~ msgid "Incorrect value entered" +#~ msgstr "Введено недопустимое значение" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "при разборе номера порта или имени машины произошла ошибка." + +#~ msgid "Please correct your input." +#~ msgstr "Пожалуйста исправьте вводимые данные." diff --git a/debian/po/sk.po b/debian/po/sk.po new file mode 100644 index 0000000..ed50ad1 --- /dev/null +++ b/debian/po/sk.po @@ -0,0 +1,165 @@ +# Slovak translation of cups +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the cups package. +# Ivan Masár <helix84@centrum.sk>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: \n" +"Last-Translator: Ivan Masár <helix84@centrum.sk>\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Chcete nastaviÅ¥ server pre kompatibilitu s BSD lpd?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Balík CUPS obsahuje server, ktorý dokáže prijímaÅ¥ tlačové úlohy v Å¡týle BSD " +"a poslaÅ¥ ich systému CUPS. Mali by ste ho nastaviÅ¥ iba v prípade, že iné " +"počítače budú pravdepodobne posielaÅ¥ úlohy sieÅ¥ou pomocou služieb „BSD” " +"alebo „LPR” a nemožno ich nastaviÅ¥, aby používali protokol IPP, ktorý " +"používa CUPS." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Chcete, aby CUPS obsluhoval neznáme úlohy ako nespracované (raw)?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol (IPP) vyžaduje MIME typ pre vÅ¡etky tlačové úlohy. " +"Keďže nie vÅ¡etky zdroje tlačových úloh dokážu pripojiÅ¥ správny typ, mnohé " +"úlohy bývajú odoslané s MIME typom application/octet-stream a je možné, že " +"budú zamietnuté ak CUPS nedokáže uhádnuÅ¥ formát úlohy." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS dokáže s takými úlohami pracovaÅ¥ v „nespracovanom” (raw) formáte, čo " +"spôsobí ich odoslanie priamo na tlačiareň bez spracovania." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Odporúča sa túto voľbu zapnúť ak bude server prijímaÅ¥ tlačové úlohy od " +"počítačov s Windows alebo od Samba serverov." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelný" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "sériový" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "socket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Backendy pre komunikáciu s tlačiarňou:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS používa na komunikáciu so zariadením alebo portom tlačiarne pomocné " +"backend programy." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Bohužiaľ niektoré pomocné programy pravdepodobne spôsobia isté problémy. " +"Napríklad niektoré jadrá PPC havarujú pri použití programu pre paralelný " +"port." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Prosím, vyberte, ktorý pomocný program má CUPS používaÅ¥. Å tandardná voľba by " +"mala vyhovovaÅ¥ väčšine bežných prostredí." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/sr.po b/debian/po/sr.po new file mode 100644 index 0000000..77a4a88 --- /dev/null +++ b/debian/po/sr.po @@ -0,0 +1,163 @@ +# Copyright (C) 2011 +# This file is distributed under the same license as the cups package. +# Zlatan Todoric <zlatan.todoric@gmail.com>, 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: 1.4.6-9\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2011-07-22 19:03+0100\n" +"Last-Translator: Zlatan Todoric <zlatan.todoric@gmail.com>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Желите ли намјестити (BSD lpd) компатибилни сервер?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"(CUPS) пакети садрже сервер који може прихватити (BSD) стил штампања и " +"пребацити их (CUPS). Треба бити само намјештен ако остали рачунари " +"могунамјестити рад преко мреже помоћу \"BSD\" или \"LPR\" сервиса, те ови " +"рачунарине могу бити конвертовани кориштењем (IPP) протокола који (CUPS) " +"користи." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Желите ли да (CUPS) штампа непознате радње као (raw) радње?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"(Internet Printing Protocol (IPP)) примјењује (MIME) тип за сва штампања." +"Како сви извори штампања не могу придодати одговарајући тип, многе " +"радњепопримају (MIME) тип апликација и могу бити одбијене ако (CUPS) не " +"препознаформат радње." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"(CUPS) може да обавља све радње као (\"raw\") радње, што значи да их шаље " +"директно штампачу без провјере." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Препоручује се одабирање ове опције ако ће сервер примати захтеве за " +"штампање од (Windows) рачунара или Самба сервера." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "(ipp)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "(lpd)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "паралелно" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "серијски" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "(socket)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "(usb)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "(snmp)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "(dnssd)" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Комуникациона системска подршка за штампач:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"(CUPS) користи програме за системску подршку да би комуницирао са штампачем " +"или портом." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Нажалост, неки програми за системску подршку могу проузрочити проблеме. " +"Напримјер, нека (PPC) језгра крахирају на паралелној системској подршци." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Молимо вас одаберите програм за системску подршку који ће (CUPS) користити. " +"Подразумијевана опција подржава већину окружења." + +#~ msgid "scsi" +#~ msgstr "(scsi)" diff --git a/debian/po/sr@latin.po b/debian/po/sr@latin.po new file mode 100644 index 0000000..24e8d63 --- /dev/null +++ b/debian/po/sr@latin.po @@ -0,0 +1,163 @@ +# Copyright (C) 2011 +# This file is distributed under the same license as the PACKAGE package. +# Zlatan Todoric <EMAIL@ADDRESS>, YEAR. +# +# +msgid "" +msgstr "" +"Project-Id-Version: 1.4.6-9\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2011-07-22 20:31+0100\n" +"Last-Translator: Zlatan Todoric <zlatan.todoric@gmail.com>\n" +"Language-Team: Soon to come\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Želite li namjestiti BSD lpd kompatibilni server?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS paketi sadrže server koji može prihvatiti BSD stil Å¡tampanja iprebaciti " +"ih CUPS. Treba biti samo namjeÅ¡ten ako ostali računari mogunamjestiti rad " +"preko mreže pomoću \"BSD\" ili \"LPR\" servisa, te ovi računarine mogu biti " +"konvertovani koriÅ¡tenjem IPP protokola koji CUPS koristi." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "elite li da CUPS Å¡tampa nepoznate radnje kao raw radnje?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol IPP primjenjuje MIME tip za sva Å¡tampanja.Kako " +"svi izvori Å¡tampanja ne mogu pridodati odgovarajući tip, mnoge " +"radnjepoprimaju MIME tip aplikacija i mogu biti odbijene ako CUPS ne " +"prepoznaformat radnje." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS može da obavlja sve radnje kao \"raw\" radnje, Å¡to znači da ih " +"Å¡aljedirektno Å¡tampaču bez provjere." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Preporučuje se odabiranje ove opcije ako će server primati zahteve za " +"Å¡tampanjeod Windows računara ili Samba servera." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralelno" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "serijski" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "(socket)" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Komunikaciona sistemska podrÅ¡ka za Å¡tampač:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS koristi programe za sistemsku podrÅ¡ku da bi komunicirao sa Å¡tampačem " +"ili portom." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Nažalost, neki programi za sistemsku podrÅ¡ku mogu prouzrokovati probleme. " +"Naprimjer, neka (PPC) jezgra krahiraju na paralelnoj sistemskoj podrÅ¡ci." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Molimo vas odaberite program za sistemsku podrÅ¡ku koju će CUPS koristiti." +"Podrazumijevana opcija podržava većinu okruženja." + +#~ msgid "scsi" +#~ msgstr "scsi" diff --git a/debian/po/sv.po b/debian/po/sv.po new file mode 100644 index 0000000..5647539 --- /dev/null +++ b/debian/po/sv.po @@ -0,0 +1,279 @@ +# +# Translators, if you are not familiar with the PO format, gettext +# documentation is worth reading, especially sections dedicated to +# this format, e.g. by running: +# info -n '(gettext)PO Files' +# info -n '(gettext)Header Entry' +# +# Some information specific to po-debconf are available at +# /usr/share/doc/po-debconf/README-trans +# or http://www.debian.org/intl/l10n/po-debconf/README-trans +# +# Developers do not need to manually edit POT or PO files. +# +msgid "" +msgstr "" +"Project-Id-Version: cups 1.1.23-13\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-03-27 08:57+0100\n" +"Last-Translator: Daniel Nylander <po@danielnylander.se>\n" +"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Vill du konfigurera den BSD-kompatibla lpd-servern?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS-paketet innehåller en server som kan acceptera utskriftsjobb av BSD-" +"stil och skicka dem till CUPS. Den bör endast konfigureras om du har andra " +"datorer som kommer att skicka jobb över nätverket via \"BSD\" eller \"LPR\"-" +"tjänster och dessa datorer inte kan konverteras till att använda IPP-" +"protokollet som CUPS använder." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Vill du att CUPS ska skriva ut okända jobb som råjobb?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Printing Protocol (IPP) använder en MIME-typ för alla sorters " +"utskriftsjobb. Eftersom inte alla källor för utskriftsjobb kan skicka med en " +"lämplig typ blir många jobb skickade som MIME-typen \"application/octet-" +"stream\" och kan bli nekade om CUPS inte kan gissa jobbtypen." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS kan hantera alla sådan jobb som \"raw\"-jobb vilket orsakar att de " +"skickas direkt till skrivaren utan att först behandlas." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Det är rekommenderat att välja det här alternativet om servern ska acceptera " +"utskriftsjobb från Windows-datorer eller Samba-servrar." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "parallell" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seriell" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "uttag" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Bakändar för skrivarkommunikation:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS använder bakändesprogram för att kommunicera med skrivarenheten eller " +"porten." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Tyvärr kan vissa bakändesprogram orsaka en del problem. Till exempel kan " +"vissa PPC-kärnor krascha när den parallella bakänden används." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Välj det bakändesprogram som ska användas av CUPS. Standardvalet bör passa " +"de flesta vanliga miljöer." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Om du vill att utskriftsjobb ska accepteras från Windows-datorer bör du " +#~ "antagligen välja denna funktion eftersom Windows sätter alla IPP-" +#~ "utskriftsjobb som hanteras av en lokal drivare till MIME-typen " +#~ "\"application/octet-stream\". Samba skickar också sina utskriftsjobb på " +#~ "detta sätt." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Port och/eller värdnamn som CUPS lyssnar på:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Vänligen ange porten eller värdnamnet som CUPS-demonen ska lyssna på. " +#~ "Följande format är tillåtna:" + +#, fuzzy +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " - Portnummer (631);\n" +#~ " - Värdnamn (debian.exempel.se);\n" +#~ " - Värd:Port (debian.exempel.se:631)." + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "Du kan kombinera flera av dessa genom att avgränsa med mellanslag." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Standardport 631 är reserverad för Internet Printing Protocol (IPP). " +#~ "\"localhost:631\" är rekommenderad för att ställa in en fristående miljö " +#~ "av säkerhetsskäl." + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "" +#~ "Vill du sända ut och/eller lyssna efter skrivarinformation för CUPS på " +#~ "nätverket?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "CUPS-demonen kan sända ut skrivarinformation för klienter på nätverket " +#~ "och automatiskt identifiera skrivare på nätverket." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Om du valde detta alternativ kommer CUPS-demonen att med jämna mellanrum " +#~ "sända UDP-broadcast för att identifiera skrivare." + +#~ msgid "Incorrect value entered" +#~ msgstr "Felaktigt värde angivet" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "ett fel inträffade vid tolkning av portnumret eller värdnamnet." + +#~ msgid "Please correct your input." +#~ msgstr "Vänligen rätt till det." + +#~ msgid "ipp, lpd, parallel, scsi, serial, socket, usb" +#~ msgstr "ipp, lpd, parallell, scsi, seriell, socket, usb" + +#~ msgid "Select the backends you want." +#~ msgstr "Välj det baksystem du vill använda." + +#~ msgid "Specify the port or/and host name that wants to be listened." +#~ msgstr "Ange port och/eller värdnamn som ska lyssnas på." + +#~ msgid "- Port number (631)" +#~ msgstr "- Portnummer (631)" + +#~ msgid "- Host name (debian.example.com)" +#~ msgstr "- Värdnamn (debian.exempel.se)" + +#~ msgid "- Host:Port (debian.example.com:631)" +#~ msgstr "- Värd:Port (debian.exempel.se:631)" + +#~ msgid "It is possible to combine by delimiting two or more values in space." +#~ msgstr "" +#~ "Det är möjligt att kombinera genom att avgränsa två eller fler värden med " +#~ "mellanslag." + +#~ msgid "" +#~ "When this option is accepted, CUPS daemon will broadcast and detect by " +#~ "using UDP periodically." +#~ msgstr "" +#~ "När denna funktion accepteras kommer CUPS-demonen att sända ut och " +#~ "identifiera genom att använda UDP med jämna mellanrum." + +#~ msgid "The wrong value is found in the input." +#~ msgstr "Fel värde matades in." diff --git a/debian/po/templates.pot b/debian/po/templates.pot new file mode 100644 index 0000000..a669dba --- /dev/null +++ b/debian/po/templates.pot @@ -0,0 +1,143 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" diff --git a/debian/po/tr.po b/debian/po/tr.po new file mode 100644 index 0000000..1582d8c --- /dev/null +++ b/debian/po/tr.po @@ -0,0 +1,185 @@ +# Turkish translation of cups. +# This file is distributed under the same license as the cups package. +# Gürkan Aslan <gurkan@iaslan.com>, 2004. +# Mert Dirik <mertdirik@gmail.com>, 2008. +# +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2008-07-05 16:48+0200\n" +"Last-Translator: Mert Dirik <mertdirik@gmail.com>\n" +"Language-Team: Turkish <debian-l10n-turkish@lists.debian.org>\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "BSD lpd uyumlu sunucuyu ayarlamak ister misiniz?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"CUPS paketi BSD türü baskı görevlerini kabul edebilen ve onları CUPS'a " +"gönderen bir sunucu içerir. Bu sunucu yalnızca diğer bilgisayarlar \"BSD\" " +"veya \"LPR\" servisleri ile ağ üzerinden görevler gönderiyor ve bu " +"bilgisayarların CUPS'ın kullandığı IPP protokolünü kullanmalarını sağlamak " +"mümkün olmuyorsa kurulmalıdır." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "" +"CUPS'ın bilinmeyen görevleri ham (raw) görev olarak yazdırmasını istiyor " +"musunuz?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Internet Yazdırma Protokolü (IPP), tüm yazdırma görevlerine bir MIME türü " +"atamayı zorunlu tutar. Her yazdırma görevine uygun bir MIME türü " +"atanamayabileceğinden, bir çok görev application/octet-stream MIME tipiyle " +"gönderilir. CUPS bir görevin biçimini tahmin edemezse bu görev iptal edilir." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS bu tür görevlere \"ham\" görevler olarak muamele edebilir. Böylece bu " +"tür görevler herhangi bir işleme tâbî tutulmadan, doğrudan yazıcıya " +"gönderilecektir." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Eğer sunucu Windows kullanan bilgisayarlardan ya da Samba sunucularından " +"gelen yazdırma görevlerini kabul edecekse bu seçeneği seçmeniz önerilir." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "paralel" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "seri" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "soket" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Yazıcı bağlantı arka uçları:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"CUPS, yazıcı aygıtı veya portu ile iletişim kurmak için arka uç programları " +"kullanır." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Maalesef bazı arka uç programları sorun çıkarmaya meyillidir. (Örneğin, bazı " +"PPC çekirdekleri paralel arka uçla kullanıldığında çökebilir.)" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Lütfen CUPS tarafından kullanılacak arka uç programını seçin. Öntanımlı " +"seçim çoğu ortam için uygundur." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Eğer Windows bilgisayarlardan gelen yazıcı görevlerini kabul etmek " +#~ "istiyorsanız, muhtemelen bu seçeneği tercih edeceksiniz. Zira Windows " +#~ "yerel sürücüdeki tüm IPP yazıcı görevlerine application/octet-stream MIME " +#~ "tipini atar. Samba da görevleri bu şekilde gönderir." + +#~ msgid "ipp, lpd, parallel, scsi, serial, socket, usb" +#~ msgstr "ipp, lpd, paralel, scsi, seri, soket, usb" + +#~ msgid "Select the backends you want." +#~ msgstr "Ä°stediğiniz arkayüzü seçin." diff --git a/debian/po/vi.po b/debian/po/vi.po new file mode 100644 index 0000000..2fedf52 --- /dev/null +++ b/debian/po/vi.po @@ -0,0 +1,245 @@ +# Vietnamese Translation for CupSys. +# Copyright © 2007 Free Software Foundation, Inc. +# Clytie Siddall <clytie@riverland.net.au>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cups_1.2.11-2\n" +"Report-Msgid-Bugs-To: cups@packages.debian.org\n" +"POT-Creation-Date: 2011-09-15 12:02+0200\n" +"PO-Revision-Date: 2007-05-31 15:31+0930\n" +"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n" +"Language-Team: Vietnamese <vi-VN@googlegroups.com>\n" +"Language: vi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: LocFactoryEditor 1.6.3b1\n" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "Do you want to set up the BSD lpd compatibility server?" +msgstr "Bạn có muốn thiết lập trình phục vụ tÆ°Æ¡ng thích với lpd BSD không?" + +#. Type: boolean +#. Description +#: ../cups-bsd.templates:2001 +msgid "" +"The CUPS package contains a server that can accept BSD-style print jobs and " +"submit them to CUPS. It should only be set up if other computers are likely " +"to submit jobs over the network via the \"BSD\" or \"LPR\" services, and " +"these computers cannot be converted to use the IPP protocol that CUPS uses." +msgstr "" +"Gói CUPS chứa một trình phục vụ có khả năng chấp nhận việc in kiểu BSD, cÅ©ng " +"đệ trình nó vào CUPS. Chỉ nên đặt gói này nếu máy khác sẽ đệ trình việc in " +"qua mạng bằng dịch vụ « BSD » hay « LPR », và máy khác này không thể được " +"chuyển đổi để sá»­ dụng giao thức IPP mà CUPS dùng." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "Do you want CUPS to print unknown jobs as raw jobs?" +msgstr "Bạn có muốn CUPS in việc in lạ nhÆ° là việc thô không?" + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"The Internet Printing Protocol (IPP) enforces a MIME type for all print " +"jobs. Since not all sources of print jobs can attach an appropriate type, " +"many jobs get submitted as the MIME type application/octet-stream and could " +"be rejected if CUPS cannot guess the job's format." +msgstr "" +"Giao thức In Mạng (Internet Printing Protocol: IPP) ép buộc kiểu MIME cho " +"mọi việc in. Vì không phải tất cả các nguồn việc in có khả năng đính kèm " +"kiểu thích hợp, nhiều việc được đệ trình nhÆ° kiểu MIME « application/octet-" +"stream » và có thể bị từ chối nếu CUPS không thể đoán được định dạng của " +"việc in đó." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"CUPS can handle all such jobs as \"raw\" jobs, which causes them to be sent " +"directly to the printer without processing." +msgstr "" +"CUPS có khả năng quản lý các việc nhÆ° vậy nhÆ° là việc « thô », mà gây ra " +"chúng được gá»­i trá»±c tiếp cho máy in, không xá»­ lý gì." + +#. Type: boolean +#. Description +#: ../cups.templates:2001 +msgid "" +"It is recommended to choose this option if the server will be accepting " +"print jobs from Windows computers or Samba servers." +msgstr "" +"Khuyên bạn bật tùy chọn này nếu trình phục vụ sẽ chấp nhận việc in từ máy " +"Windows hay trình phục vụ Samba." + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "ipp" +msgstr "ipp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "lpd" +msgstr "lpd" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "parallel" +msgstr "song song" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "serial" +msgstr "nối tiếp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "socket" +msgstr "ổ cắm" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "usb" +msgstr "usb" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "snmp" +msgstr "snmp" + +#. Type: multiselect +#. Choices +#: ../cups.templates:3001 +msgid "dnssd" +msgstr "dnssd" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "Printer communication backends:" +msgstr "Hậu phÆ°Æ¡ng liên lạc với máy in:" + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"CUPS uses backend programs to communicate with the printer device or port." +msgstr "" +"Phần mềm CUPS dùng một số chÆ°Æ¡ng trình hậu phÆ°Æ¡ng để liên lạc với thiết bị/" +"cổng máy in." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Unfortunately, some backend programs are likely to cause some trouble. For " +"example, some PPC kernels crash with the parallel backend." +msgstr "" +"Rất tiếc là một số chÆ°Æ¡ng trình hậu phÆ°Æ¡ng có thể gây ra lỗi. Chẳng hạn, một " +"số hạt nhân PPC sẽ sụp đổ khi chạy cùng với hậu phÆ°Æ¡ng song song." + +#. Type: multiselect +#. Description +#: ../cups.templates:3002 +msgid "" +"Please choose the backend program to be used by CUPS. The default choice " +"should fit the most common environments." +msgstr "" +"Hãy chọn chÆ°Æ¡ng trình hậu phÆ°Æ¡ng CUPS cần dùng. Sá»± chọn mặc định nên thích " +"hợp với phần lớn môi trường thường dùng." + +#~ msgid "scsi" +#~ msgstr "scsi" + +#~ msgid "" +#~ "If you will be accepting print jobs from Windows computers, you probably " +#~ "want this option set, as Windows gives all IPP print jobs processed by a " +#~ "local driver the MIME type application/octet-stream. Samba also submits " +#~ "its print jobs this way." +#~ msgstr "" +#~ "Nếu bạn sẽ cần phải nhận việc in từ máy tính chạy hệ điều hành Windows " +#~ "thì rất có thể là bạn muốn lập tùy chọn này, vì phần mềm Windows gán mọi " +#~ "việc in IPP được xá»­ lý bởi trình điều khiển địa phÆ°Æ¡ng, kiểu MIME « " +#~ "application/octet-stream ». Phần mềm Samba cÅ©ng đệ trình các việc in bằng " +#~ "cách đó." + +#~ msgid "Port or/and host name where CUPS will listen to:" +#~ msgstr "Cổng và/hay tên máy nÆ¡i CUPS se lắng nghe:" + +#~ msgid "" +#~ "Please specify the port or the host name CUPS daemon will listen to. The " +#~ "following formats are allowed:" +#~ msgstr "" +#~ "Hãy gõ cổng hay tên máy trên mà trình nền CUPS sẽ lắng nghe. Cho phép " +#~ "những khuôn dạng theo đây:" + +#~ msgid "" +#~ " - Port number (631);\n" +#~ " - Host name (debian.example.com);\n" +#~ " - Host:Port (debian.example.com:631);\n" +#~ " - File domain socket (/var/run/cups/cups.sock)." +#~ msgstr "" +#~ " • sổ cổng (v.d. 631)\n" +#~ " • tên máy (v.d. ví_dụ.vnoss.org)\n" +#~ " • máy:cổng (v.d. ví_dụ.vnoss.org:631) • ổ cắm miền tập tin (v.d. /var/" +#~ "run/cups/cups.sock)" + +#~ msgid "" +#~ "You can combine any of these by delimiting in a space-separated list." +#~ msgstr "" +#~ "Bạn có thể kết hợp vài khuôn dạng phân cách bởi khoảng trắng trong danh " +#~ "sách." + +#~ msgid "" +#~ "The default port 631 is reserved for the Internet Printing Protocol " +#~ "(IPP). \"localhost:631\" is recommended to setup a standalone environment " +#~ "for security reasons." +#~ msgstr "" +#~ "Cổng mặc định 631 dành cho Giao thức In Mạng (Internet Printing Protocol: " +#~ "IPP). Khuyên bạn dùng « localhost:631 » để thiết lập môi trường độc lập " +#~ "vì lý do bảo mật. " + +#~ msgid "Broadcast and/or listen for CUPS printer information on the network?" +#~ msgstr "Phát thanh và/hay lắng nghe thông tin máy in CUPS trên mạng không?" + +#~ msgid "" +#~ "CUPS daemon can broadcast printer information for clients on the network, " +#~ "and detect printers on the network automatically." +#~ msgstr "" +#~ "Trình nền CUPS có thể phát thanh thông tin về máy in cho trình khách trên " +#~ "mạng nghe, và tá»± động phát hiện máy in nào trên mạng." + +#~ msgid "" +#~ "If you choose this option, the CUPS daemon will periodically send UDP " +#~ "broadcasts to detect printers." +#~ msgstr "" +#~ "Nếu bạn lập tùy chọn này, trình nền CUPS sẽ gởi định kỳ việc phát thanh " +#~ "UDP để phát hiện máy in." + +#~ msgid "Incorrect value entered" +#~ msgstr "Gõ sai giá trị" + +#~ msgid "an error occurred while parsing the port number or the host name." +#~ msgstr "gặp lỗi khi phân tách số cổng hay tên máy." + +#~ msgid "Please correct your input." +#~ msgstr "Hãy sá»­a dữ liệu gõ." + +#~ msgid "ipp, lpd, parallel, scsi, serial, socket, usb" +#~ msgstr "ipp, lpd, song song, scsi, nối tiếp, ổ cắm, usb" + +#~ msgid "Select the backends you want." +#~ msgstr "Hãy chọn hậu phÆ°Æ¡ng nào bạn muốn." diff --git a/debian/presubj b/debian/presubj new file mode 100644 index 0000000..2acc07d --- /dev/null +++ b/debian/presubj @@ -0,0 +1,3 @@ +Please note that CUPS is never affected by Poppler or XPDF bugs, because +the Debian package relies upon external tools to generate PostScript. +Therefore, avoid filing bugs related to PDF security issues against CUPS. diff --git a/debian/printer.schema b/debian/printer.schema new file mode 100644 index 0000000..0abcae4 --- /dev/null +++ b/debian/printer.schema @@ -0,0 +1,47 @@ +# Definitions for a schema to store CUPS printer information in LDAP +# OID Base is iso(1) org(3) dod(6) internet(1) private(4) enterprise(1) me(5323) cupsSchema(22) + +# Syntaxes are under 1.3.6.1.4.1.5323.22.0 +# Attributes are under 1.3.6.1.4.1.5323.22.1 +# Object Classes are under 1.3.6.1.4.1.5323.22.2 + +attributetype ( 1.3.6.1.4.1.5323.22.1.1 + NAME 'printerDescription' + DESC 'Description of Printer' + EQUALITY caseExactIA5Match + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.5323.22.1.2 + NAME 'printerURI' + DESC 'CUPS style URI for printer' + EQUALITY caseExactIA5Match + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.5323.22.1.3 + NAME 'printerLocation' + DESC 'Identifier string for Printer Location' + EQUALITY caseExactIA5Match + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.5323.22.1.4 + NAME 'printerMakeAndModel' + DESC 'String CUPS uses to figure out driver' + EQUALITY caseExactIA5Match + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.5323.22.1.5 + NAME 'printerType' + DESC 'Integer CUPS uses to figure out type' + EQUALITY integerMatch + SINGLE-VALUE + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ) + +objectclass ( 1.3.6.1.4.1.5323.22.2.1 + NAME 'cupsPrinter' + SUP top + AUXILIARY + MUST ( printerDescription $ printerURI $ printerLocation $ printerMakeAndModel $ printerType ) ) diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..1025d7a --- /dev/null +++ b/debian/rules @@ -0,0 +1,190 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. +# +# Modified to make a template file for a multi-binary package with separated +# build-arch and build-indep targets by Bill Allombert 2001 + +# Uncomment this to turn on verbose mode. +export DH_VERBOSE=1 + +# work around libpng crash on our test PNGs with 8 bit colormaps (LP #710881) +export NO_PNG_PKG_MANGLE=1 + +#export DEB_BUILD_MAINT_OPTIONS=hardening +#DPKG_EXPORT_BUILDFLAGS=1 +#include /usr/share/dpkg/buildflags.mk +LDFLAGS+= -Wl,--as-needed + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/autotools.mk + +DEB_CONFIGURE_EXTRA_FLAGS := --with-optim=$(DEB_OPTFLAGS) --libdir=/usr/lib/$(DEB_HOST_MULTIARCH) \ + --mandir=/usr/share/man \ + --with-docdir=/usr/share/cups/doc-root \ + --localedir=/usr/share/cups/locale \ + --sysconfdir=/opt/etc \ + --localstatedir=/opt/var \ + --disable-mallinfo \ + --disable-libpaper \ + --disable-libusb \ + --disable-tcp-wrappers \ + --disable-acl \ + --disable-dbus \ + --disable-unit-tests \ + --disable-relro \ + --enable-image \ + --enable-jpeg \ + --enable-png \ + --disable-tiff \ + --disable-slp \ + --disable-ldap \ + --enable-gssapi \ + --enable-threads \ + --enable-debug \ + --disable-cdsassl \ + --enable-gnutls \ + --disable-openssl \ + --enable-ssl \ + --enable-avahi \ + --disable-pam \ + --enable-largefile \ + --disable-launchd \ + --enable-raw-printing \ + --enable-bannertops \ + --enable-texttops \ + --disable-pap \ + --without-java --without-php --without-python --without-perl --enable-webif \ + --with-languages=en --without-smfmanifestdir --withou-printcap \ + --with-local_protocols='CUPS dnssd' \ + --with-remote_protocols='CUPS dnssd' + +#ifeq ($(DEB_HOST_ARCH_OS),hurd) +#DEB_CONFIGURE_EXTRA_FLAGS += --disable-libusb +#else +#DEB_CONFIGURE_EXTRA_FLAGS += --enable-libusb +#endif + +DEB_MAKE_INSTALL_TARGET := install BUILDROOT=$(DEB_DESTDIR) +DEB_INSTALL_CHANGELOGS_ALL := CHANGES.txt + +ifeq ($(shell dpkg-vendor --query vendor), Ubuntu) +DEB_DH_INSTALLINIT_ARGS := --upstart-only +else +DEB_DH_INSTALLINIT_ARGS := -u'start 50 2 3 4 5 . stop 80 1 .' +endif + +DEB_DH_STRIP_ARGS := --dbg-package=cups-dbg +DEB_DH_FIXPERMS_ARGS := -Xusr/lib/cups/backend-available +DEB_DH_COMPRESS_ARGS := -Xusr/share/doc/libcups2-dev/examples/scripting +DEB_DH_INSTALL_SOURCEDIR := debian/tmp +ifneq ($(findstring $(DEB_BUILD_ARCH), arm m68k),) +DEB_MAKE_CHECK_TARGET := check || true +else +DEB_MAKE_CHECK_TARGET := check +endif +DPKG_GENSYMBOLS_CHECK_LEVEL=4 +export DPKG_GENSYMBOLS_CHECK_LEVEL + +post-patches:: + set -e; if dpkg-vendor --is ubuntu && ! [ -e debian/patches/ubuntu/stamp-applied ]; then \ + echo '---- Applying Ubuntu specific patches'; \ + for p in debian/patches/ubuntu/*; do \ + patch -p1 --no-backup-if-mismatch < $$p; \ + done; \ + touch debian/patches/ubuntu/stamp-applied; \ + fi + # Rebuild ./configure to get build system patches working + aclocal + autoconf + +clean:: + if [ -e debian/patches/ubuntu/stamp-applied ]; then \ + echo '---- Unapplying Ubuntu specific patches'; \ + for p in debian/patches/ubuntu/*; do \ + patch -Rp1 --no-backup-if-mismatch < $$p; \ + done; \ + rm debian/patches/ubuntu/stamp-applied; \ + fi + +cleanbuilddir:: + rm -f man/client.conf.man packaging/cups.list + rm -f conf/mime.convs conf/snmp.conf init/org.cups.cups-lpd.plist + [ ! -f Makedefs ] || make distclean + rm -f debian/*.upstart # master copy is in debian/local + +common-install-prehook-impl:: + (cd fonts && $(MAKE) install BUILDROOT=$(DEB_DESTDIR)) + + # Use upstart script on Ubuntu; we need to hide it away for Debian + # builds, as dh_installinit does not have a --sysvinit-only + if dpkg-vendor --is ubuntu; then \ + cp debian/local/*.upstart debian; \ + fi + +binary-post-install/cups:: + (cd $(DEB_DESTDIR)/../cups/usr/share/doc/cups && ln -sf ../../cups/doc-root online-docs) + + # Remove all files which get replaced by the ones in the cups-filters + # package + rm debian/$(cdbs_curpkg)/usr/lib/cups/backend*/serial + rm debian/$(cdbs_curpkg)/usr/lib/cups/backend*/parallel + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/bannertops + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/commandtoescpx + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/commandtopclx + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/imagetops + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/imagetoraster + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/pdftops + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/rastertoescpx + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/rastertopclx + rm debian/$(cdbs_curpkg)/usr/lib/cups/filter/texttops + rm -rf debian/$(cdbs_curpkg)/usr/share/cups/banners + rm debian/$(cdbs_curpkg)/usr/share/cups/data/testprint + rm debian/$(cdbs_curpkg)/usr/share/cups/data/psglyphs + rm debian/$(cdbs_curpkg)/usr/share/cups/fonts/* + + # Comment out conversion rules for removed filters + perl -p -i -e 's:^(.*\s+(pdftops|texttops|imagetops|bannertops|imagetoraster)\s*)$$:#\1:' debian/$(cdbs_curpkg)/usr/share/cups/mime/mime.convs + + # Ensure that we don't ship anything in /var/run + rm -rf $(DEB_DESTDIR)/../cups/var/run + + # PPD directories + #mkdir -p "$(DEB_DESTDIR)/../cups/usr/share/ppd/cups-included/" + + # PPD-updating triggers directory + mkdir -p "$(DEB_DESTDIR)/../cups/usr/share/cups/ppd-updaters/" + + #dh_usrlocal + + # Install AppArmor, ufw profile, and Apport hook on Ubuntu + if dpkg-vendor --is ubuntu; then \ + install -D -m 644 debian/local/apparmor-profile debian/$(cdbs_curpkg)/etc/apparmor.d/usr.sbin.cupsd; \ + install -D -m 644 debian/local/cups.ufw.profile debian/$(cdbs_curpkg)/etc/ufw/applications.d/cups; \ + install -D -m 644 debian/local/apport-hook.py debian/$(cdbs_curpkg)/usr/share/apport/package-hooks/source_cups.py; \ + fi + + # Make the usb backend run as root, since /dev/bus/usb/* are + # root:root in udev < 147, and cups does not use the usblp kernel + # module any more; udev 147 makes most of those printers accessible to + # lp, but apparently not all of them + chmod go-x debian/$(cdbs_curpkg)/usr/lib/cups/backend-available/usb; \ + +binary-post-install/cups-common:: + rm debian/$(cdbs_curpkg)/usr/share/cups/charsets/utf-8 + +binary-post-install/libcupsimage2-dev:: + rm -r debian/libcupsimage2-dev/usr/share/doc/libcupsimage2-dev + ln -s libcupsimage2 debian/libcupsimage2-dev/usr/share/doc/libcupsimage2-dev +binary-post-install/cups-bsd:: + rm -r debian/cups-bsd/usr/share/doc/cups-bsd + ln -s libcups2 debian/cups-bsd/usr/share/doc/cups-bsd +binary-post-install/libcups2-dev:: + rm -f debian/$(cdbs_curpkg)/usr/share/doc/$(cdbs_curpkg)/examples/scripting/php/*.o + rm -f debian/$(cdbs_curpkg)/usr/share/doc/$(cdbs_curpkg)/examples/scripting/php/*.so + # debian/libcups2-dev.install entry cannot rename files on-the-fly + cp cups/language-private.h debian/$(cdbs_curpkg)/usr/include/cups/i18n.h +binary-post-install/cups-client:: + rm -r debian/cups-client/usr/share/doc/cups-client + ln -s libcups2 debian/cups-client/usr/share/doc/cups-client diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/source/options b/debian/source/options new file mode 100644 index 0000000..fea21bd --- /dev/null +++ b/debian/source/options @@ -0,0 +1 @@ +extend-diff-ignore '(^|/)\.bzr.*' diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..0064833 --- /dev/null +++ b/debian/watch @@ -0,0 +1,3 @@ +version=3 +http://ftp.easysw.com/pub/cups/([\d\.]+)/cups-(.*)-source\.tar\.bz2 \ + debian uupdate --no-symlink diff --git a/desktop/Makefile b/desktop/Makefile new file mode 100644 index 0000000..ed43bce --- /dev/null +++ b/desktop/Makefile @@ -0,0 +1,135 @@ +# +# "$Id: Makefile 8844 2009-10-14 16:53:45Z mike $" +# +# Desktop makefile for CUPS. +# +# Copyright 2007-2009 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + if test "x$(DBUSDIR)" != x; then \ + echo Installing cups.conf in $(DBUSDIR)...;\ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(DBUSDIR)/system.d; \ + $(INSTALL_DATA) cups.conf $(BUILDROOT)$(DBUSDIR)/system.d/cups.conf; \ + fi + if test "x$(MENUDIR)" != x; then \ + echo Installing desktop menu...; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(MENUDIR); \ + $(INSTALL_DATA) cups.desktop $(BUILDROOT)$(MENUDIR); \ + fi + if test "x$(ICONDIR)" != x; then \ + echo Installing desktop icons...; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(ICONDIR)/hicolor/16x16/apps; \ + $(INSTALL_DATA) cups-16.png $(BUILDROOT)$(ICONDIR)/hicolor/16x16/apps/cups.png; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(ICONDIR)/hicolor/32x32/apps; \ + $(INSTALL_DATA) cups-32.png $(BUILDROOT)$(ICONDIR)/hicolor/32x32/apps/cups.png; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(ICONDIR)/hicolor/64x64/apps; \ + $(INSTALL_DATA) cups-64.png $(BUILDROOT)$(ICONDIR)/hicolor/64x64/apps/cups.png; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(ICONDIR)/hicolor/128x128/apps; \ + $(INSTALL_DATA) cups-128.png $(BUILDROOT)$(ICONDIR)/hicolor/128x128/apps/cups.png; \ + fi + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + if test "x$(DBUSDIR)" != x; then \ + echo Uninstalling cups.conf in $(DBUSDIR)...;\ + $(RM) $(BUILDROOT)$(DBUSDIR)/cups.conf; \ + $(RMDIR) $(BUILDROOT)$(DBUSDIR); \ + fi + if test "x$(MENUDIR)" != x; then \ + echo Uninstalling desktop menu...; \ + $(RM) $(BUILDROOT)$(MENUDIR)/cups.desktop; \ + fi + if test "x$(ICONDIR)" != x; then \ + echo Uninstalling desktop icons...; \ + $(RM) $(BUILDROOT)$(ICONDIR)/hicolor/16x16/apps/cups.png; \ + $(RM) $(BUILDROOT)$(ICONDIR)/hicolor/32x32/apps/cups.png; \ + $(RM) $(BUILDROOT)$(ICONDIR)/hicolor/64x64/apps/cups.png; \ + $(RM) $(BUILDROOT)$(ICONDIR)/hicolor/128x128/apps/cups.png; \ + fi + + +# +# End of "$Id: Makefile 8844 2009-10-14 16:53:45Z mike $". +# diff --git a/desktop/cups-128.png b/desktop/cups-128.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0f6ff20b6a79d23874eb72563f4fdc32b6ae1e GIT binary patch literal 4888 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 KMNUMnLSTYhF$a_Y literal 0 HcmV?d00001 diff --git a/desktop/cups-16.png b/desktop/cups-16.png new file mode 100644 index 0000000000000000000000000000000000000000..90614fed15610ddc90b1f286be6a4e1b2cd5ff05 GIT binary patch literal 503 zcmV<T0SNwyP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004b3#c}2nYxW zd<bNS00009a7bBm0006v0006v0rv((!T<mO8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10dz@3K~y-6ebc>aR8bTK;BT8469vHxB0*C~6iFe1je?DZjW1v! z>I+PY_y{&hz(()|^Z|STEiA+$1QA0lg=i2G?50Q}7~K}LCrqw)JaD-8p1aoCKWm@J zOrusrOkx(_GjqQcl$l31PGAY2@C%7Q_>4ywJA!YJFX3a6-eVbEyh5+eUn2eyKvdM< zSR9er>k?UL6L?TRpW_A|;vVkfR$*pvfDZ%S_)t5#75ynX*u_33s~0kJJ0fo5R76B( z=CHsOY-Z+Gf#$J;^H`6Fn>dHP!X^3{L_`N?s)4Xp`&f|@Tb0Sl0ngCO@y7SHs&~A~ z>ftJWqL-N~1A!O}Qbg=xCo|_F;zHFA)A)hQ^}L8FyvxkJVHY;4!?R5b8+L9~A10bM zKCW7y{f9hXCB12zg9&U_7Tp%|G*<P;`p&3PzK*Yz$y+?pAE*^<*ZI=OyHFw>yug== tmSx{M?l$p<F0`$PIE}OTmYD}_n7?&vK9=Por#%1w002ovPDHLkV1hPQ&tU)n literal 0 HcmV?d00001 diff --git a/desktop/cups-256.png b/desktop/cups-256.png new file mode 100644 index 0000000000000000000000000000000000000000..755dc2f37397d90500426df51444858f9a906f38 GIT binary patch literal 10147 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 JjV8$3{{udT=RW`d literal 0 HcmV?d00001 diff --git a/desktop/cups-32.png b/desktop/cups-32.png new file mode 100644 index 0000000000000000000000000000000000000000..823c6d4aac8d6d3b93ce1d8f8829d52c00e64e68 GIT binary patch literal 1042 zcmV+t1nv8YP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004b3#c}2nYxW zd<bNS00009a7bBm000DT000DT0nnqeXaE2J8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11CL2WK~z|U#nw%TmQ@r7@ZWVTrWr@`10ACBqfFaG7Dd7cfe<Z< za5j-GLW<h7sCGhaTC^!5sLWOpg+&FmsR$z?BIwgTF&Uk*4>1!nlAN6Mw77Tjc^{wG zdEP1Lz=iWX_ul{cpO1U)O%dV$l-V=clv0|Di!qGFID|2bN5o`LU=h)3pdXv?I*ub6 z#$ScV1DMwex25qLu(ylRZsQ0ZoQ}wJh7%s|V&EV?!5jD(zjj&oAqIOUfLYkq0Jt3^ zNDX^dU<;1b_PmDKy%M;$266)Tv`pDjjMw&WX-xpDYF_+-4Q&gyU@XHA6^uzNY)jyU z8v8piuMoQumt$ekuf{rDge5hcjWwJ*>$Xz85v7!t6y|4@Uq6-HuE4d$vk45AwDgxk zyAiiW#K{U)KlWpO`So^0tgqT@YD60=#^KS3IG$2Eh}9U9kK`WQR0uAWd&3ZZo7xx= z6Dg&;aas9wBBj(95hqj@)x%${{NFLBGIxR8`OZV19QLIpI_F|hFLe?TjS;w{qVI}` zqa~ad;y!#Y*F(amh0t=jC!CW~T90?i{$=<MUt<HtB4S(B*sKNut19|<MIR`hFDM?* zm+yiVa#7xf9dZZ!tQa4`&1LS{62T7XAdpg8AXoR4?5*e%crhaG#}{}^F2MbGPL9l^ zTocD|09)}3o|o^Dxu>~X%l}%P$L99h{OXG5gGFCcfLF_@SYGrcm?NiXpluEG*S-fT z(OD_qay#U+-zTSNs6=E`Zqu9O8W@&O#5z3eR9$pPy#~f>-^(ld1m2VL`ji~%kFZaE z8+?Oz<tzEHd@L8sU9_vzBk-e~$EiNBtTK0?fIcHv_ABy3<WjkFE-1!cmQ(YVQ$68O zHv&zaaIAO)J0s$XGkGwbq?Fdmr(jB+jEFD)`D$oHZ#q?kM={iEbE)AyqO-7vtMg5L zV637K$`{eUk!vdYu826$G26g+q{eukE{};8-p|u{tv}KBI{v&y;+7c_*jmFGZA)OZ zw(&65_h@_sCo33Vp}!S@0`O9e#3b%&Y5aP*MNjQLjx~*I&j7MWzQyW~(rvh^Vf`%m z_&(jRXLDCO(|EE7I~xE)Zd&i-ReT^H*`{^d(KjOkg~R|J!k=9XbQ`;I-L&{U6xGT? zq$w>^<4B3dW}Mvy_q0~rMp8=W%a4m;`6~VvyCdS~p0Q>^;J=i=0UucMa*88~Q~&?~ M07*qoM6N<$f~`{K-T(jq literal 0 HcmV?d00001 diff --git a/desktop/cups-512.png b/desktop/cups-512.png new file mode 100644 index 0000000000000000000000000000000000000000..54a1b3bdcf22b97a1c286199f221c056f9f44452 GIT binary patch literal 21029 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 literal 0 HcmV?d00001 diff --git a/desktop/cups-64.png b/desktop/cups-64.png new file mode 100644 index 0000000000000000000000000000000000000000..21d19cc2806dbd8f46e5a080fa4593e556e96037 GIT binary patch literal 2234 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 IM6N<$g7CZ{0RR91 literal 0 HcmV?d00001 diff --git a/desktop/cups.conf b/desktop/cups.conf new file mode 100644 index 0000000..537ac77 --- /dev/null +++ b/desktop/cups.conf @@ -0,0 +1,13 @@ +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <!-- Only root can send this message --> + <policy user="root"> + <allow send_interface="com.redhat.PrinterSpooler"/> + </policy> + + <!-- Allow any connection to receive the message --> + <policy context="default"> + <allow receive_interface="com.redhat.PrinterSpooler"/> + </policy> +</busconfig> diff --git a/desktop/cups.desktop.in b/desktop/cups.desktop.in new file mode 100644 index 0000000..ef200ce --- /dev/null +++ b/desktop/cups.desktop.in @@ -0,0 +1,41 @@ +[Desktop Entry] +Categories=System;Printing;HardwareSettings;X-Red-Hat-Base; +Exec=@CUPS_HTMLVIEW@ http://localhost:631/ +Icon=cups +StartupNotify=false +Terminal=false +Type=Application +Name=Manage Printing +Comment=CUPS Web Interface +Name[de]=Druckerverwaltung +Comment[de]=CUPS Webinterface +Name[en_US]=Manage Printing +Comment[en_US]=CUPS Web Interface +Name[es]=Administrar impresión +Comment[es]=Interfaz Web de CUPS +Name[et]=Trükkimise haldur +Comment[et]=CUPS-i veebiliides +Name[eu]=Kudeatu inprimaketak +Comment[eu]=CUPSen web interfazea +Name[fr]=Gestionnaire d'impression +Comment[fr]=Interface Web de CUPS +Name[he]=נהל הדפסות +Comment[he]=ממשק דפדפן של CUPS +Name[hu]=Nyomtatás kezelése +Comment[hu]=A CUPS webes felülete +Name[id]=Manajemen Pencetakan +Comment[id]=Antarmuka Web CUPS +Name[it]=Gestione stampa +Comment[it]=Interfaccia web di CUPS +Name[ja]=印刷の管理 +Comment[ja]=CUPS Web インタフェース +Name[pl]=Zarządzanie drukowaniem +Comment[pl]=Interfejs WWW CUPS +Name[ru]=Настройка печати +Comment[ru]=Настройка CUPS +Name[sv]=Hantera skrivare +Comment[sv]=CUPS webb-gränssnitt +Name[zh]=打印机管理 +Comment[zh]=CUPS网页界面 +Name[zh_TW]=印表管理 +Comment[zh_TW]=CUPS 網頁介面 diff --git a/desktop/cups.icns b/desktop/cups.icns new file mode 100644 index 0000000000000000000000000000000000000000..0fd7a35d57afe1926e4b58fcc874e133f345c8c3 GIT binary patch literal 107501 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 VLx0Y6|Ji9{ZdL#Q01QIz0034?VZHzW literal 0 HcmV?d00001 diff --git a/desktop/cups.svg b/desktop/cups.svg new file mode 100644 index 0000000..8d19c35 --- /dev/null +++ b/desktop/cups.svg @@ -0,0 +1,533 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="100" + height="100" + id="svg2" + sodipodi:version="0.32" + inkscape:version="0.46" + version="1.0" + sodipodi:docbase="/home/mike/c/cups-trunk/desktop" + sodipodi:docname="cups.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape" + inkscape:export-filename="/Users/msweet/c/cups-trunk/desktop/cups-512.png" + inkscape:export-xdpi="460.79999" + inkscape:export-ydpi="460.79999"> + <defs + id="defs4"> + <linearGradient + id="linearGradient3645"> + <stop + id="stop3647" + offset="0" + style="stop-color:#ffffff;stop-opacity:1;" /> + <stop + id="stop3649" + offset="1" + style="stop-color:#ffffff;stop-opacity:0;" /> + </linearGradient> + <linearGradient + id="linearGradient3515"> + <stop + style="stop-color:#ccff66;stop-opacity:1;" + offset="0" + id="stop3517" /> + <stop + style="stop-color:#00cc00;stop-opacity:1;" + offset="1" + id="stop3519" /> + </linearGradient> + <linearGradient + id="linearGradient3377"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3379" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3381" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3280"> + <stop + style="stop-color:#ffffbf;stop-opacity:1;" + offset="0" + id="stop3282" /> + <stop + style="stop-color:#ffffbf;stop-opacity:0;" + offset="1" + id="stop3284" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + id="linearGradient3270"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3272" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3274" /> + </linearGradient> + <linearGradient + id="linearGradient3251"> + <stop + style="stop-color:#ccff66;stop-opacity:1;" + offset="0" + id="stop3253" /> + <stop + style="stop-color:#007700;stop-opacity:1;" + offset="1" + id="stop3255" /> + </linearGradient> + <linearGradient + id="linearGradient3416"> + <stop + style="stop-color:#7fff00;stop-opacity:1;" + offset="0" + id="stop3418" /> + <stop + style="stop-color:#1f7f00;stop-opacity:1;" + offset="1" + id="stop3420" /> + </linearGradient> + <linearGradient + id="linearGradient3530"> + <stop + style="stop-color:#000000;stop-opacity:0.74901962;" + offset="0" + id="stop3532" /> + <stop + style="stop-color:#333333;stop-opacity:0;" + offset="1" + id="stop3534" /> + </linearGradient> + <linearGradient + id="linearGradient3690"> + <stop + style="stop-color:#ffffff;stop-opacity:0.49803922;" + offset="0" + id="stop3692" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3694" /> + </linearGradient> + <linearGradient + id="linearGradient3680"> + <stop + style="stop-color:#000000;stop-opacity:0.49803922" + offset="0" + id="stop3682" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop3684" /> + </linearGradient> + <linearGradient + id="linearGradient3658"> + <stop + style="stop-color:#cccc99;stop-opacity:1;" + offset="0" + id="stop3660" /> + <stop + style="stop-color:#cccc99;stop-opacity:0;" + offset="1" + id="stop3662" /> + </linearGradient> + <inkscape:perspective + sodipodi:type="inkscape:persp3d" + inkscape:vp_x="0 : 50 : 1" + inkscape:vp_y="0 : 1000 : 0" + inkscape:vp_z="100 : 50 : 1" + inkscape:persp3d-origin="50 : 33.333333 : 1" + id="perspective2838" /> + <linearGradient + id="linearGradient3269"> + <stop + style="stop-color:#00ff00;stop-opacity:1;" + offset="0" + id="stop3271" /> + <stop + style="stop-color:#007f00;stop-opacity:1;" + offset="1" + id="stop3273" /> + </linearGradient> + <linearGradient + id="linearGradient3226"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop3228" /> + <stop + style="stop-color:#333333;stop-opacity:1;" + offset="1" + id="stop3230" /> + </linearGradient> + <linearGradient + id="linearGradient3214"> + <stop + style="stop-color:#00ff00;stop-opacity:1;" + offset="0" + id="stop3216" /> + <stop + style="stop-color:#007f00;stop-opacity:1;" + offset="1" + id="stop3218" /> + </linearGradient> + <linearGradient + id="linearGradient5228"> + <stop + style="stop-color:#cccc99;stop-opacity:0" + offset="0" + id="stop5230" /> + <stop + id="stop5236" + offset="0.89999998" + style="stop-color:#cccc99;stop-opacity:0;" /> + <stop + style="stop-color:#cccc99;stop-opacity:1" + offset="1" + id="stop5232" /> + </linearGradient> + <linearGradient + id="linearGradient5198"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop5200" /> + <stop + style="stop-color:#333333;stop-opacity:0.94117647;" + offset="1" + id="stop5202" /> + </linearGradient> + <linearGradient + id="linearGradient5177"> + <stop + style="stop-color:#cccc99;stop-opacity:1;" + offset="0" + id="stop5179" /> + <stop + style="stop-color:#cccc99;stop-opacity:0.49803922" + offset="1" + id="stop5181" /> + </linearGradient> + <linearGradient + id="linearGradient4768"> + <stop + id="stop4770" + offset="0" + style="stop-color:#e8e8e8;stop-opacity:0.90980393;" /> + <stop + id="stop4772" + offset="1" + style="stop-color:#ffffff;stop-opacity:0" /> + </linearGradient> + <linearGradient + id="linearGradient3598"> + <stop + id="stop3600" + offset="0" + style="stop-color:#ffffff;stop-opacity:1" /> + <stop + id="stop3602" + offset="1" + style="stop-color:#ffffff;stop-opacity:0" /> + </linearGradient> + <linearGradient + id="linearGradient2165"> + <stop + style="stop-color:#350000;stop-opacity:1;" + offset="0" + id="stop2167" /> + <stop + style="stop-color:#ff3333;stop-opacity:1;" + offset="1" + id="stop2169" /> + </linearGradient> + <linearGradient + id="linearGradient3196"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3198" /> + <stop + style="stop-color:#ffffff;stop-opacity:0;" + offset="1" + id="stop3200" /> + </linearGradient> + <linearGradient + id="linearGradient3160"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3162" /> + <stop + id="stop3192" + offset="0.75" + style="stop-color:#ffffff;stop-opacity:0.24705882;" /> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="1" + id="stop3164" /> + </linearGradient> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3257"> + <path + transform="matrix(1,0,0,0.9882639,0,5.8678726e-2)" + d="M 95 50.534397 A 45 45.534397 0 1 1 5,50.534397 A 45 45.534397 0 1 1 95 50.534397 z" + sodipodi:ry="45.534397" + sodipodi:rx="45" + sodipodi:cy="50.534397" + sodipodi:cx="50" + id="path3259" + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:type="arc" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3704"> + <path + sodipodi:type="arc" + style="opacity:1;fill:#000000;fill-opacity:0.49803922;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3706" + sodipodi:cx="51.104416" + sodipodi:cy="48.192772" + sodipodi:rx="39.658634" + sodipodi:ry="43.574299" + d="M 90.76305,48.192772 A 39.658634,43.574299 0 1 1 11.445782,48.192772 A 39.658634,43.574299 0 1 1 90.76305,48.192772 z" + transform="matrix(1.003038,0,0,1.0232718,-1.4805538,0.2740483)" /> + </clipPath> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3270" + id="linearGradient3276" + x1="50.200802" + y1="91.967865" + x2="50.200802" + y2="67.948906" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3280" + id="linearGradient3286" + x1="47.690762" + y1="6.6265068" + x2="47.690762" + y2="53.815262" + gradientUnits="userSpaceOnUse" /> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3295"> + <path + transform="matrix(0.8148984,0,0,0.6256338,5.5549494,4.4908095)" + d="M 96.184742,26.706827 A 44.477913,23.293173 0 1 1 7.2289162,26.706827 A 44.477913,23.293173 0 1 1 96.184742,26.706827 z" + sodipodi:ry="23.293173" + sodipodi:rx="44.477913" + sodipodi:cy="26.706827" + sodipodi:cx="51.706829" + id="path3297" + style="opacity:1;fill:#ffffbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3371"> + <path + sodipodi:type="arc" + style="opacity:1;fill:#ffffbf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path3373" + sodipodi:cx="48.895584" + sodipodi:cy="47.188755" + sodipodi:rx="42.269077" + sodipodi:ry="41.767067" + d="M 91.164661,47.188755 A 42.269077,41.767067 0 1 1 6.6265068,47.188755 A 42.269077,41.767067 0 1 1 91.164661,47.188755 z" + transform="matrix(0.9784331,0,0,0.9984421,2.7613512,2.0815482)" /> + </clipPath> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3515" + id="radialGradient3521" + cx="51.405624" + cy="71.446022" + fx="51.405624" + fy="71.446022" + r="41.566265" + gradientTransform="matrix(1,0,0,1.5633645,0,-39.484036)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3587" + x="-0.12220446" + width="1.2444089" + y="-0.11793158" + height="1.2358632"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="4.2329858" + id="feGaussianBlur3589" /> + </filter> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3591"> + <path + transform="translate(2.9340892e-7,-2.3929013)" + d="M 92.971889,50.301205 A 41.566265,43.072289 0 1 1 9.8393593,50.301205 A 41.566265,43.072289 0 1 1 92.971889,50.301205 z" + sodipodi:ry="43.072289" + sodipodi:rx="41.566265" + sodipodi:cy="50.301205" + sodipodi:cx="51.405624" + id="path3593" + style="opacity:1;fill:#ff0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + sodipodi:type="arc" /> + </clipPath> + <filter + inkscape:collect="always" + id="filter3611"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="2.1711472" + id="feGaussianBlur3613" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3645" + id="radialGradient3695" + cx="-6.7269073" + cy="27.94368" + fx="-6.7269073" + fy="27.94368" + r="12.5502" + gradientTransform="matrix(-1.9906652,-2.2927541e-8,1.4386067e-8,-1.5156153,-20.117928,50.98641)" + gradientUnits="userSpaceOnUse" /> + <filter + inkscape:collect="always" + id="filter3797" + x="-0.098526749" + width="1.1970535" + y="-0.15589675" + height="1.3117935"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="1.030442" + id="feGaussianBlur3799" /> + </filter> + <filter + inkscape:collect="always" + id="filter3807"> + <feGaussianBlur + inkscape:collect="always" + stdDeviation="0.1030442" + id="feGaussianBlur3809" /> + </filter> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3645" + id="radialGradient3815" + cx="-6.7269082" + cy="29.116467" + fx="-6.7269082" + fy="29.116467" + r="12.5502" + gradientTransform="matrix(-1,-6.831379e-8,3.8912925e-8,-0.6320001,-13.453817,27.036147)" + gradientUnits="userSpaceOnUse" /> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + gridtolerance="1" + guidetolerance="10" + objecttolerance="10" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="4.98" + inkscape:cx="50" + inkscape:cy="50" + inkscape:document-units="px" + inkscape:current-layer="layer1" + width="100px" + height="100px" + showgrid="true" + inkscape:grid-points="true" + inkscape:window-width="872" + inkscape:window-height="713" + inkscape:window-x="2458" + inkscape:window-y="22" + showguides="true" + inkscape:guide-bbox="true" + inkscape:snap-global="false"> + <inkscape:grid + type="xygrid" + id="grid2840" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <cc:license + rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /> + <dc:title>CUPS Icon</dc:title> + <dc:creator> + <cc:Agent> + <dc:title>Michael Sweet</dc:title> + </cc:Agent> + </dc:creator> + <dc:publisher> + <cc:Agent> + <dc:title>Apple Inc.</dc:title> + </cc:Agent> + </dc:publisher> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/GPL/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/SourceCode" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2882" + transform="matrix(1.1282649,0,0,1.1259993,-5.472226,-6.4135954)"> + <path + id="text2870" + d="M 72.501767,34.960416 L 82.666767,34.960416 C 82.096028,30.894474 80.883363,27.327811 79.028767,24.260416 C 77.174033,21.121817 74.855702,18.518153 72.073767,16.449416 C 69.291708,14.380824 66.117378,12.811492 62.550767,11.741416 C 58.984052,10.671494 55.203389,10.136495 51.208767,10.136416 C 45.359398,10.136495 40.15207,11.206494 35.586767,13.346416 C 31.092746,15.415156 27.312083,18.268487 24.244767,21.906416 C 21.248756,25.544479 18.966092,29.824475 17.396767,34.746416 C 15.827428,39.597132 15.042762,44.80446 15.042767,50.368416 C 15.042762,55.932449 15.756095,61.139777 17.182767,65.990416 C 18.680758,70.841101 20.89209,75.049763 23.816767,78.616416 C 26.741417,82.183089 30.41508,85.000753 34.837767,87.069416 C 39.260405,89.066749 44.432066,90.065415 50.352767,90.065416 C 60.125384,90.065415 67.829376,87.390417 73.464767,82.040416 C 79.100031,76.690428 82.417028,69.200436 83.415767,59.570416 L 73.250767,59.570416 C 73.036704,62.709109 72.394705,65.633772 71.324767,68.344416 C 70.254707,71.0551 68.756708,73.409098 66.830767,75.406416 C 64.976046,77.332427 62.729048,78.866093 60.089767,80.007416 C 57.52172,81.077424 54.561389,81.612423 51.208767,81.612416 C 46.643397,81.612423 42.720068,80.756424 39.438767,79.044416 C 36.157408,77.332427 33.446744,75.049763 31.306767,72.196416 C 29.238081,69.271769 27.704416,65.883439 26.705767,62.031416 C 25.707085,58.108113 25.207752,53.970784 25.207767,49.619416 C 25.207752,45.624793 25.707085,41.772796 26.705767,38.063416 C 27.704416,34.354137 29.238081,31.072807 31.306767,28.219416 C 33.446744,25.294813 36.121741,22.976482 39.331767,21.264416 C 42.613068,19.552485 46.536397,18.696486 51.101767,18.696416 C 56.451721,18.696486 61.052716,20.051818 64.904767,22.762416 C 68.828042,25.473146 71.360372,29.539142 72.501767,34.960416" + style="font-size:107px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Neue;-inkscape-font-specification:Helvetica Neue" /> + <path + id="text2862" + d="M 40.964993,34.10077 L 40.964993,29.66077 L 39.394993,29.66077 L 39.394993,34.10077 C 39.394987,34.634105 39.288321,35.027438 39.074993,35.28077 C 38.861655,35.527438 38.474988,35.650771 37.914993,35.65077 C 37.594989,35.650771 37.338323,35.607438 37.144993,35.52077 C 36.958323,35.427438 36.811657,35.310771 36.704993,35.17077 C 36.598323,35.024105 36.528324,34.857438 36.494993,34.67077 C 36.461657,34.484105 36.44499,34.294106 36.444993,34.10077 L 36.444993,29.66077 L 34.874993,29.66077 L 34.874993,34.10077 C 34.874992,35.074105 35.138325,35.794104 35.664993,36.26077 C 36.198324,36.727437 36.948323,36.96077 37.914993,36.96077 C 38.868321,36.96077 39.614987,36.727437 40.154993,36.26077 C 40.694986,35.787437 40.964986,35.067438 40.964993,34.10077 M 42.326868,29.66077 L 42.326868,36.80077 L 43.796868,36.80077 L 43.796868,32.02077 L 43.816868,32.02077 L 46.786868,36.80077 L 48.356868,36.80077 L 48.356868,29.66077 L 46.886868,29.66077 L 46.886868,34.45077 L 46.866868,34.45077 L 43.886868,29.66077 L 42.326868,29.66077 M 49.729211,29.66077 L 49.729211,36.80077 L 51.299211,36.80077 L 51.299211,29.66077 L 49.729211,29.66077 M 54.408899,33.06077 L 51.918899,36.80077 L 53.678899,36.80077 L 55.268899,34.33077 L 56.828899,36.80077 L 58.698899,36.80077 L 56.208899,33.07077 L 58.498899,29.66077 L 56.778899,29.66077 L 55.328899,31.94077 L 53.928899,29.66077 L 52.108899,29.66077 L 54.408899,33.06077 M 36.474993,43.02077 L 36.474993,40.88077 L 37.694993,40.88077 C 37.874989,40.880776 38.048322,40.894109 38.214993,40.92077 C 38.381655,40.947442 38.528322,41.000776 38.654993,41.08077 C 38.781655,41.154109 38.881655,41.260775 38.954993,41.40077 C 39.034988,41.540775 39.074988,41.724108 39.074993,41.95077 C 39.074988,42.177441 39.034988,42.360774 38.954993,42.50077 C 38.881655,42.640774 38.781655,42.750774 38.654993,42.83077 C 38.528322,42.904107 38.381655,42.954107 38.214993,42.98077 C 38.048322,43.00744 37.874989,43.020774 37.694993,43.02077 L 36.474993,43.02077 M 34.904993,39.66077 L 34.904993,46.80077 L 36.474993,46.80077 L 36.474993,44.24077 L 38.124993,44.24077 C 38.571655,44.240772 38.951654,44.177439 39.264993,44.05077 C 39.57832,43.917439 39.831654,43.744106 40.024993,43.53077 C 40.224987,43.31744 40.36832,43.074107 40.454993,42.80077 C 40.54832,42.520774 40.594986,42.237441 40.594993,41.95077 C 40.594986,41.657442 40.54832,41.374109 40.454993,41.10077 C 40.36832,40.827442 40.224987,40.584109 40.024993,40.37077 C 39.831654,40.157443 39.57832,39.987443 39.264993,39.86077 C 38.951654,39.727444 38.571655,39.660777 38.124993,39.66077 L 34.904993,39.66077 M 43.135149,42.89077 L 43.135149,40.88077 L 44.855149,40.88077 C 45.215144,40.880776 45.485144,40.960776 45.665149,41.12077 C 45.845144,41.274109 45.935144,41.524108 45.935149,41.87077 C 45.935144,42.230774 45.845144,42.490774 45.665149,42.65077 C 45.485144,42.810774 45.215144,42.890774 44.855149,42.89077 L 43.135149,42.89077 M 41.565149,39.66077 L 41.565149,46.80077 L 43.135149,46.80077 L 43.135149,44.01077 L 44.705149,44.01077 C 45.098478,44.010773 45.381811,44.097439 45.555149,44.27077 C 45.728477,44.444105 45.84181,44.717439 45.895149,45.09077 C 45.935144,45.377438 45.965144,45.677438 45.985149,45.99077 C 46.005144,46.304104 46.058477,46.574103 46.145149,46.80077 L 47.715149,46.80077 C 47.641809,46.70077 47.585142,46.58077 47.545149,46.44077 C 47.511809,46.294104 47.485142,46.14077 47.465149,45.98077 C 47.451809,45.820771 47.441809,45.664104 47.435149,45.51077 C 47.428476,45.357438 47.421809,45.224105 47.415149,45.11077 C 47.401809,44.930772 47.375142,44.750772 47.335149,44.57077 C 47.301809,44.390772 47.245142,44.227439 47.165149,44.08077 C 47.085143,43.927439 46.981809,43.797439 46.855149,43.69077 C 46.728476,43.57744 46.568476,43.494106 46.375149,43.44077 L 46.375149,43.42077 C 46.775143,43.260773 47.061809,43.02744 47.235149,42.72077 C 47.415142,42.414108 47.505142,42.050775 47.505149,41.63077 C 47.505142,41.357442 47.455142,41.104109 47.355149,40.87077 C 47.261809,40.630776 47.121809,40.420776 46.935149,40.24077 C 46.755143,40.060777 46.535143,39.920777 46.275149,39.82077 C 46.02181,39.71411 45.735144,39.660777 45.415149,39.66077 L 41.565149,39.66077 M 48.77218,39.66077 L 48.77218,46.80077 L 50.34218,46.80077 L 50.34218,39.66077 L 48.77218,39.66077 M 51.701868,39.66077 L 51.701868,46.80077 L 53.171868,46.80077 L 53.171868,42.02077 L 53.191868,42.02077 L 56.161868,46.80077 L 57.731868,46.80077 L 57.731868,39.66077 L 56.261868,39.66077 L 56.261868,44.45077 L 56.241868,44.45077 L 53.261868,39.66077 L 51.701868,39.66077 M 60.684211,40.98077 L 60.684211,46.80077 L 62.254211,46.80077 L 62.254211,40.98077 L 64.394211,40.98077 L 64.394211,39.66077 L 58.544211,39.66077 L 58.544211,40.98077 L 60.684211,40.98077 M 65.237024,39.66077 L 65.237024,46.80077 L 66.807024,46.80077 L 66.807024,39.66077 L 65.237024,39.66077 M 68.166711,39.66077 L 68.166711,46.80077 L 69.636711,46.80077 L 69.636711,42.02077 L 69.656711,42.02077 L 72.626711,46.80077 L 74.196711,46.80077 L 74.196711,39.66077 L 72.726711,39.66077 L 72.726711,44.45077 L 72.706711,44.45077 L 69.726711,39.66077 L 68.166711,39.66077 M 80.729055,45.99077 L 80.889055,46.80077 L 81.889055,46.80077 L 81.889055,42.94077 L 78.889055,42.94077 L 78.889055,44.11077 L 80.469055,44.11077 C 80.422383,44.610772 80.255716,44.994105 79.969055,45.26077 C 79.68905,45.520771 79.289051,45.650771 78.769055,45.65077 C 78.415718,45.650771 78.115718,45.584104 77.869055,45.45077 C 77.622386,45.310771 77.422386,45.127438 77.269055,44.90077 C 77.115719,44.674105 77.002386,44.420772 76.929055,44.14077 C 76.862386,43.854106 76.829053,43.560773 76.829055,43.26077 C 76.829053,42.94744 76.862386,42.644107 76.929055,42.35077 C 77.002386,42.057441 77.115719,41.797441 77.269055,41.57077 C 77.422386,41.337442 77.622386,41.154109 77.869055,41.02077 C 78.115718,40.880776 78.415718,40.810776 78.769055,40.81077 C 79.149051,40.810776 79.472384,40.910776 79.739055,41.11077 C 80.005717,41.310775 80.185716,41.610775 80.279055,42.01077 L 81.779055,42.01077 C 81.739048,41.604108 81.629048,41.244109 81.449055,40.93077 C 81.269049,40.617443 81.039049,40.35411 80.759055,40.14077 C 80.485716,39.927443 80.175716,39.767444 79.829055,39.66077 C 79.48905,39.547444 79.135717,39.490777 78.769055,39.49077 C 78.222385,39.490777 77.729052,39.587444 77.289055,39.78077 C 76.85572,39.97411 76.489053,40.240776 76.189055,40.58077 C 75.889054,40.920776 75.659054,41.320775 75.499055,41.78077 C 75.339055,42.234108 75.259055,42.727441 75.259055,43.26077 C 75.259055,43.780773 75.339055,44.267439 75.499055,44.72077 C 75.659054,45.167438 75.889054,45.557438 76.189055,45.89077 C 76.489053,46.224104 76.85572,46.487437 77.289055,46.68077 C 77.729052,46.867436 78.222385,46.96077 78.769055,46.96077 C 79.115717,46.96077 79.45905,46.89077 79.799055,46.75077 C 80.13905,46.604103 80.449049,46.35077 80.729055,45.99077 M 35.974993,54.43077 L 34.454993,54.43077 C 34.448326,54.870772 34.528326,55.250771 34.694993,55.57077 C 34.861659,55.890771 35.084992,56.154104 35.364993,56.36077 C 35.651658,56.567437 35.978324,56.717437 36.344993,56.81077 C 36.718323,56.91077 37.101656,56.96077 37.494993,56.96077 C 37.981655,56.96077 38.408322,56.904103 38.774993,56.79077 C 39.148321,56.677437 39.458321,56.52077 39.704993,56.32077 C 39.95832,56.114104 40.14832,55.870771 40.274993,55.59077 C 40.401653,55.310771 40.464986,55.007438 40.464993,54.68077 C 40.464986,54.280772 40.37832,53.954106 40.204993,53.70077 C 40.03832,53.440773 39.83832,53.234107 39.604993,53.08077 C 39.371654,52.92744 39.134988,52.81744 38.894993,52.75077 C 38.661655,52.677441 38.478322,52.627441 38.344993,52.60077 C 37.898322,52.487441 37.534989,52.394108 37.254993,52.32077 C 36.981656,52.247441 36.76499,52.174108 36.604993,52.10077 C 36.451657,52.027441 36.348324,51.947441 36.294993,51.86077 C 36.241657,51.774108 36.214991,51.660775 36.214993,51.52077 C 36.214991,51.367442 36.248324,51.240775 36.314993,51.14077 C 36.381657,51.040776 36.46499,50.957442 36.564993,50.89077 C 36.671657,50.824109 36.788323,50.777442 36.914993,50.75077 C 37.041656,50.724109 37.168323,50.710776 37.294993,50.71077 C 37.488323,50.710776 37.664989,50.727443 37.824993,50.76077 C 37.991655,50.794109 38.138322,50.850776 38.264993,50.93077 C 38.391655,51.010776 38.491655,51.120775 38.564993,51.26077 C 38.644988,51.400775 38.691655,51.577442 38.704993,51.79077 L 40.224993,51.79077 C 40.224987,51.377442 40.144987,51.027442 39.984993,50.74077 C 39.831654,50.447443 39.621654,50.207443 39.354993,50.02077 C 39.088321,49.83411 38.781655,49.700777 38.434993,49.62077 C 38.094989,49.53411 37.738322,49.490777 37.364993,49.49077 C 37.04499,49.490777 36.72499,49.53411 36.404993,49.62077 C 36.084991,49.707444 35.798324,49.840777 35.544993,50.02077 C 35.291658,50.200776 35.084992,50.427443 34.924993,50.70077 C 34.771659,50.967442 34.694992,51.284109 34.694993,51.65077 C 34.694992,51.977441 34.754992,52.257441 34.874993,52.49077 C 35.001658,52.717441 35.164992,52.90744 35.364993,53.06077 C 35.564991,53.214107 35.791658,53.340773 36.044993,53.44077 C 36.298324,53.534106 36.558324,53.614106 36.824993,53.68077 C 37.08499,53.754106 37.341656,53.820773 37.594993,53.88077 C 37.848322,53.940773 38.074989,54.010773 38.274993,54.09077 C 38.474988,54.170772 38.634988,54.270772 38.754993,54.39077 C 38.881655,54.510772 38.944988,54.667439 38.944993,54.86077 C 38.944988,55.040772 38.898321,55.190771 38.804993,55.31077 C 38.711655,55.424105 38.594988,55.514104 38.454993,55.58077 C 38.314988,55.647438 38.164989,55.694104 38.004993,55.72077 C 37.844989,55.740771 37.694989,55.750771 37.554993,55.75077 C 37.348323,55.750771 37.148323,55.727438 36.954993,55.68077 C 36.761657,55.627438 36.591657,55.550771 36.444993,55.45077 C 36.30499,55.344105 36.191657,55.207438 36.104993,55.04077 C 36.018324,54.874105 35.974991,54.670772 35.974993,54.43077 M 43.239368,54.02077 L 43.239368,56.80077 L 44.809368,56.80077 L 44.809368,54.06077 L 47.459368,49.66077 L 45.709368,49.66077 L 44.049368,52.48077 L 42.379368,49.66077 L 40.619368,49.66077 L 43.239368,54.02077 M 49.119524,54.43077 L 47.599524,54.43077 C 47.592857,54.870772 47.672857,55.250771 47.839524,55.57077 C 48.00619,55.890771 48.229523,56.154104 48.509524,56.36077 C 48.796189,56.567437 49.122855,56.717437 49.489524,56.81077 C 49.862855,56.91077 50.246188,56.96077 50.639524,56.96077 C 51.126187,56.96077 51.552853,56.904103 51.919524,56.79077 C 52.292852,56.677437 52.602852,56.52077 52.849524,56.32077 C 53.102851,56.114104 53.292851,55.870771 53.419524,55.59077 C 53.546184,55.310771 53.609518,55.007438 53.609524,54.68077 C 53.609518,54.280772 53.522851,53.954106 53.349524,53.70077 C 53.182851,53.440773 52.982851,53.234107 52.749524,53.08077 C 52.516185,52.92744 52.279519,52.81744 52.039524,52.75077 C 51.806186,52.677441 51.622853,52.627441 51.489524,52.60077 C 51.042853,52.487441 50.67952,52.394108 50.399524,52.32077 C 50.126188,52.247441 49.909521,52.174108 49.749524,52.10077 C 49.596188,52.027441 49.492855,51.947441 49.439524,51.86077 C 49.386188,51.774108 49.359522,51.660775 49.359524,51.52077 C 49.359522,51.367442 49.392855,51.240775 49.459524,51.14077 C 49.526188,51.040776 49.609522,50.957442 49.709524,50.89077 C 49.816188,50.824109 49.932855,50.777442 50.059524,50.75077 C 50.186188,50.724109 50.312854,50.710776 50.439524,50.71077 C 50.632854,50.710776 50.80952,50.727443 50.969524,50.76077 C 51.136187,50.794109 51.282853,50.850776 51.409524,50.93077 C 51.536186,51.010776 51.636186,51.120775 51.709524,51.26077 C 51.789519,51.400775 51.836186,51.577442 51.849524,51.79077 L 53.369524,51.79077 C 53.369518,51.377442 53.289518,51.027442 53.129524,50.74077 C 52.976185,50.447443 52.766185,50.207443 52.499524,50.02077 C 52.232852,49.83411 51.926186,49.700777 51.579524,49.62077 C 51.23952,49.53411 50.882854,49.490777 50.509524,49.49077 C 50.189521,49.490777 49.869521,49.53411 49.549524,49.62077 C 49.229522,49.707444 48.942856,49.840777 48.689524,50.02077 C 48.436189,50.200776 48.229523,50.427443 48.069524,50.70077 C 47.91619,50.967442 47.839523,51.284109 47.839524,51.65077 C 47.839523,51.977441 47.899523,52.257441 48.019524,52.49077 C 48.14619,52.717441 48.309523,52.90744 48.509524,53.06077 C 48.709522,53.214107 48.936189,53.340773 49.189524,53.44077 C 49.442855,53.534106 49.702855,53.614106 49.969524,53.68077 C 50.229521,53.754106 50.486187,53.820773 50.739524,53.88077 C 50.992853,53.940773 51.21952,54.010773 51.419524,54.09077 C 51.61952,54.170772 51.779519,54.270772 51.899524,54.39077 C 52.026186,54.510772 52.089519,54.667439 52.089524,54.86077 C 52.089519,55.040772 52.042852,55.190771 51.949524,55.31077 C 51.856186,55.424105 51.739519,55.514104 51.599524,55.58077 C 51.45952,55.647438 51.30952,55.694104 51.149524,55.72077 C 50.98952,55.740771 50.83952,55.750771 50.699524,55.75077 C 50.492854,55.750771 50.292854,55.727438 50.099524,55.68077 C 49.906188,55.627438 49.736188,55.550771 49.589524,55.45077 C 49.449522,55.344105 49.336188,55.207438 49.249524,55.04077 C 49.162855,54.874105 49.119522,54.670772 49.119524,54.43077 M 56.113899,50.98077 L 56.113899,56.80077 L 57.683899,56.80077 L 57.683899,50.98077 L 59.823899,50.98077 L 59.823899,49.66077 L 53.973899,49.66077 L 53.973899,50.98077 L 56.113899,50.98077 M 60.666711,49.66077 L 60.666711,56.80077 L 66.086711,56.80077 L 66.086711,55.48077 L 62.236711,55.48077 L 62.236711,53.73077 L 65.696711,53.73077 L 65.696711,52.51077 L 62.236711,52.51077 L 62.236711,50.98077 L 66.006711,50.98077 L 66.006711,49.66077 L 60.666711,49.66077 M 67.131555,49.66077 L 67.131555,56.80077 L 68.601555,56.80077 L 68.601555,51.79077 L 68.621555,51.79077 L 70.371555,56.80077 L 71.581555,56.80077 L 73.331555,51.74077 L 73.351555,51.74077 L 73.351555,56.80077 L 74.821555,56.80077 L 74.821555,49.66077 L 72.611555,49.66077 L 71.031555,54.57077 L 71.011555,54.57077 L 69.341555,49.66077 L 67.131555,49.66077" + style="font-size:10px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Helvetica Neue;-inkscape-font-specification:Helvetica Neue Bold" /> + </g> + </g> +</svg> diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 0000000..014074a --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,266 @@ +# +# "$Id: Makefile 9483 2011-01-17 05:40:28Z mike $" +# +# Documentation makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Document files... +# + +WEBPAGES = \ + cups.css \ + cups-printable.css \ + index.html \ + robots.txt +WEBIMAGES = \ + images/color-wheel.png \ + images/cups.png \ + images/cups-icon.png \ + images/generic.png \ + images/left.gif \ + images/right.gif \ + images/sel.gif \ + images/unsel.gif \ + images/wait.gif +HELPIMAGES = \ + images/cups-block-diagram.png \ + images/cups-command-chain.png \ + images/cups-postscript-chain.png \ + images/cups-raster-chain.png \ + images/raster.png \ + images/raster-organization.png \ + images/sample-image.png \ + images/smiley.jpg +HELPFILES = \ + help/accounting.html \ + help/api-array.html \ + help/api-cgi.html \ + help/api-cups.html \ + help/api-driver.html \ + help/api-filedir.html \ + help/api-filter.html \ + help/api-httpipp.html \ + help/api-mime.html \ + help/api-overview.html \ + help/api-ppd.html \ + help/api-ppdc.html \ + help/api-raster.html \ + help/cgi.html \ + help/glossary.html \ + help/kerberos.html \ + help/license.html \ + help/man-cupsaccept.html \ + help/man-backend.html \ + help/man-cancel.html \ + help/man-cups-config.html \ + help/man-cups-lpd.html \ + help/man-cups-polld.html \ + help/man-cupsaddsmb.html \ + help/man-cupsd.html \ + help/man-cupsenable.html \ + help/man-cupstestdsc.html \ + help/man-cupstestppd.html \ + help/man-filter.html \ + help/man-ipptool.html \ + help/man-ipptoolfile.html \ + help/man-lp.html \ + help/man-lpadmin.html \ + help/man-lpc.html \ + help/man-lpinfo.html \ + help/man-lpmove.html \ + help/man-lpoptions.html \ + help/man-lppasswd.html \ + help/man-lpq.html \ + help/man-lpr.html \ + help/man-lprm.html \ + help/man-lpstat.html \ + help/man-mime.convs.html \ + help/man-mime.types.html \ + help/man-notifier.html \ + help/man-ppdc.html \ + help/man-ppdhtml.html \ + help/man-ppdi.html \ + help/man-ppdmerge.html \ + help/man-ppdpo.html \ + help/network.html \ + help/options.html \ + help/overview.html \ + help/policies.html \ + help/postscript-driver.html \ + help/ppd-compiler.html \ + help/raster-driver.html \ + help/ref-access_log.html \ + help/ref-classes-conf.html \ + help/ref-client-conf.html \ + help/ref-cupsd-conf.html \ + help/ref-error_log.html \ + help/ref-mailto-conf.html \ + help/ref-page_log.html \ + help/ref-ppdcfile.html \ + help/ref-printers-conf.html \ + help/ref-snmp-conf.html \ + help/ref-subscriptions-conf.html \ + help/security.html \ + help/sharing.html \ + help/spec-banner.html \ + help/spec-browsing.html \ + help/spec-cmp.html \ + help/spec-command.html \ + help/spec-design.html \ + help/spec-ipp.html \ + help/spec-pdf.html \ + help/spec-postscript.html \ + help/spec-ppd.html \ + help/spec-raster.html \ + help/spec-stp.html \ + help/standard.html \ + help/translation.html \ + help/whatsnew.html + + +# +# Make all documents... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Remove all generated files... +# + +clean: + + +# +# Dummy depend target... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: $(INSTALL_LANGUAGES) + $(INSTALL_DIR) -m 755 $(DOCDIR) + for file in $(WEBPAGES); do \ + $(INSTALL_MAN) $$file $(DOCDIR); \ + done + $(INSTALL_DIR) -m 755 $(DOCDIR)/help + for file in $(HELPFILES); do \ + $(INSTALL_MAN) $$file $(DOCDIR)/help; \ + done + $(INSTALL_DIR) -m 755 $(DOCDIR)/images + for file in $(WEBIMAGES) $(HELPIMAGES); do \ + $(INSTALL_MAN) $$file $(DOCDIR)/images; \ + done + +install-languages: + for lang in $(LANGUAGES); do \ + if test -d $$lang; then \ + $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang; \ + $(INSTALL_DATA) $$lang/index.html $(DOCDIR)/$$lang; \ + $(INSTALL_DATA) $$lang/cups.css $(DOCDIR)/$$lang >/dev/null 2>&1 || true; \ + fi; \ + done + +install-langbundle: + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all documentation files... +# + +uninstall: $(UNINSTALL_LANGUAGES) + for file in $(WEBPAGES); do \ + $(RM) $(DOCDIR)/$$file; \ + done + for file in $(HELPFILES); do \ + $(RM) $(DOCDIR)/$$file; \ + done + for file in $(WEBIMAGES); do \ + $(RM) $(DOCDIR)/$$file; \ + done + -$(RMDIR) $(DOCDIR)/images + -$(RMDIR) $(DOCDIR)/help + -$(RMDIR) $(DOCDIR) + +uninstall-languages: + -for lang in $(LANGUAGES); do \ + $(RM) $(DOCDIR)/$$lang/index.html; \ + $(RM) $(DOCDIR)/$$lang/cups.css; \ + $(RMDIR) $(DOCDIR)/$$lang; \ + done + +install-langbundle: + + +# +# Install the docset bits locally... +# + +docset: + cp $(HELPFILES) ../org.cups.docset/Contents/Resources/Documentation/help + cp cups-printable.css ../org.cups.docset/Contents/Resources/Documentation + cp $(HELPIMAGES) ../org.cups.docset/Contents/Resources/Documentation/images + + +# +# End of Makefile. +# diff --git a/doc/cups-printable.css b/doc/cups-printable.css new file mode 100644 index 0000000..42ea2be --- /dev/null +++ b/doc/cups-printable.css @@ -0,0 +1,329 @@ +BODY { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +H1, H2, H3, H4, H5, H6, P, TD, TH { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +KBD { + font-family: monaco, courier, monospace; + font-weight: bold; +} + +PRE { + font-family: monaco, courier, monospace; +} + +PRE.command { + border: dotted thin #7f7f7f; + margin-left: 36pt; + padding: 10px; +} + +P.compact { + margin: 0; +} + +P.example { + font-style: italic; + margin-left: 36pt; +} + +PRE.example { + background: #eeeeee; + border: dotted thin #999999; + margin-left: 36pt; + padding: 10pt; +} + +PRE.command EM, PRE.example EM { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +P.command { + font-family: monaco, courier, monospace; + margin-left: 36pt; +} + +P.formula { + font-style: italic; + margin-left: 36pt; +} + +BLOCKQUOTE { + background: #eeeeee; + border: solid thin #999999; + padding: 10pt; +} + +A IMG { + border: none; +} + +A:link:hover IMG { + background: #f0f0f0; + border-radius: 10px; + -moz-border-radius: 10px; +} + +A:link, A:visited { + font-weight: normal; + text-decoration: none; +} + +A:link:hover, A:visited:hover, A:active { + text-decoration: underline; +} + +SUB, SUP { + font-size: 50%; +} + +TR.data, TD.data, TR.data TD { + margin-top: 10pt; + padding: 5pt; + border-bottom: solid 1pt #999999; +} + +TR.data TH { + border-bottom: solid 1pt #999999; + padding-top: 10pt; + padding-left: 5pt; + text-align: left; +} + +DIV.table TABLE { + border: solid thin #999999; + border-collapse: collapse; + border-spacing: 0; + margin-left: auto; + margin-right: auto; +} + +DIV.table CAPTION { + caption-side: top; + font-size: 120%; + font-style: italic; + font-weight: bold; + margin-left: auto; + margin-right: auto; +} + +DIV.table TABLE TD { + border: solid thin #cccccc; + padding-top: 5pt; +} + +DIV.table TABLE TH { + background: #cccccc; + border: none; + border-bottom: solid thin #999999; +} + +DIV.figure TABLE { + margin-left: auto; + margin-right: auto; +} + +DIV.figure CAPTION { + caption-side: bottom; + font-size: 120%; + font-style: italic; + font-weight: bold; + margin-left: auto; + margin-right: auto; +} + +TH.label { + text-align: right; + vertical-align: top; +} + +TH.sublabel { + text-align: right; + font-weight: normal; +} + +HR { + border: solid thin; +} + +SPAN.info { + background: black; + border: thin solid black; + color: white; + font-size: 80%; + font-style: italic; + font-weight: bold; + white-space: nowrap; +} + +H2 SPAN.info, H3 SPAN.info, H4 SPAN.info { + float: right; + font-size: 100%; +} + +H1.title { +} + +H2.title, H3.title { + border-bottom: solid 2pt #000000; +} + +DIV.indent, TABLE.indent { + margin-top: 2em; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +TABLE.indent { + border-collapse: collapse; +} + +TABLE.indent TD, TABLE.indent TH { + padding: 0; +} + +TABLE.list { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +TABLE.list TH { + background: white; + border-bottom: solid thin #cccccc; + color: #444444; + padding-top: 10pt; + padding-left: 5pt; + text-align: left; + vertical-align: bottom; + white-space: nowrap; +} + +TABLE.list TH A { + color: #4444cc; +} + +TABLE.list TD { + border-bottom: solid thin #eeeeee; + padding-top: 5pt; + padding-left: 5pt; +} + +TABLE.list TR:nth-child(even) { + background: #f8f8f8; +} + +TABLE.list TR:nth-child(odd) { + background: #f4f4f4; +} + +DT { + margin-left: 36pt; + margin-top: 12pt; +} + +DD { + margin-left: 54pt; +} + +DL.category DT { + font-weight: bold; +} + +P.summary { + margin-left: 36pt; + font-family: monaco, courier, monospace; +} + +DIV.summary TABLE { + border: solid thin #999999; + border-collapse: collapse; + border-spacing: 0; + margin: 10px; +} + +DIV.summary TABLE TD, DIV.summary TABLE TH { + border: solid thin #999999; + padding: 5px; + text-align: left; + vertical-align: top; +} + +DIV.summary TABLE THEAD TH { + background: #eeeeee; +} + +/* API documentation styles... */ +div.body h1 { + margin: 0; +} +div.body h2 { + margin-top: 1.5em; +} +div.body h3, div.body h4, div.body h5 { + margin-bottom: 0.5em; + margin-top: 1.5em; +} +.class, .enumeration, .function, .struct, .typedef, .union { + border-bottom: solid thin #999999; + margin-bottom: 0; + margin-top: 2em; +} +.description { + margin-top: 0.5em; +} +code, p.code, pre, ul.code li { + font-family: monaco, courier, monospace; + font-size: 90%; +} +ul.code, ul.contents, ul.subcontents { + list-style-type: none; + margin: 0; + padding-left: 0; +} +ul.code li { + margin: 0; +} +ul.contents > li { + margin-top: 1em; +} +ul.contents li ul.code, ul.contents li ul.subcontents { + padding-left: 2em; +} +div.body dl { + margin-left: 0; + margin-top: 0; +} +div.body dt { + font-style: italic; + margin-left: 0; + margin-top: 0; +} +div.body dd { + margin-bottom: 0.5em; +} + +/* This is just for the HTML files generated with the framedhelp target */ +div.contents { + background: #e8e8e8; + border: solid thin black; + padding: 10px; +} +div.contents h1 { + font-size: 110%; +} +div.contents h2 { + font-size: 100%; +} +div.contents ul.contents { + font-size: 80%; +} +div.contents ul.subcontents li { + margin-left: 1em; + text-indent: -1em; +} diff --git a/doc/cups.css b/doc/cups.css new file mode 100644 index 0000000..815c193 --- /dev/null +++ b/doc/cups.css @@ -0,0 +1,462 @@ +BODY { + background: white; + color: black; + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +H1, H2, H3, H4, H5, H6, P, TD, TH { + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +KBD { + color: #006600; + font-family: monaco, courier, monospace; + font-weight: bold; +} + +PRE { + font-family: monaco, courier, monospace; +} + +PRE.command { + background: #f0f0f0; + border: dotted thin #7f7f7f; + color: #7f0000; + margin-left: 36pt; + padding: 10px; +} + +P.example { + font-style: italic; + margin-left: 36pt; +} + +PRE.example { + background: white; + border: dotted thin #999999; + margin-left: 36pt; + padding: 10px; +} + +PRE.command EM, PRE.example EM { + color: #3f0000; + font-family: lucida grande, geneva, helvetica, arial, sans-serif; +} + +P.command { + color: #7f0000; + font-family: monaco, courier, monospace; + margin-left: 36pt; +} + +P.formula { + font-style: italic; + margin-left: 36pt; +} + +BLOCKQUOTE { + background: #f0f0f0; + border: inset 1px #eeeeee; + padding: 10px; + /* These are not implemented by all browsers, but that's OK */ + border-radius: 5px; + -moz-border-radius: 5px; +} + +A IMG { + border: none; +} + +A:link:hover IMG { + background: #f0f0f0; + border-radius: 10px; + -moz-border-radius: 10px; +} + +A:link, A:visited { + font-weight: inherit; + text-decoration: none; + color: #000099; +} + +A:link:hover, A:visited:hover, A:active { + text-decoration: underline; + color: #990099; +} + +TABLE.page { + border: none; + border-collapse: collapse; + height: 100%; + margin: 0; + padding: 0; + width: 100%; +} + +TD.body { + height: 100%; + vertical-align: top; +} + +TD.sel, TD.unsel { + border-left: thin solid #cccccc; + padding: 0px 5px; + text-align: center; + vertical-align: middle; + width: 14%; +} + +TD.sel { + background: url(images/sel.gif); +} + +TD.unsel { + background: url(images/unsel.gif); +} + +TD.sel A, TD.sel A:hover, TD.unsel A:link:hover, TD.unsel A:visited:hover, +TD.unsel A:active, TD.unsel A, TD.unsel A:visited { + color: #666666; + display: block; + font-weight: normal; + padding: 8px; + text-decoration: none; +} + +TD.trailer { + background: #f0f0f0; + border: solid thin #e0e0e0; + color: #666666; + font-size: 80%; + padding: 5px; +} + +TD.trailer A { + color: #666699; +} + +FORM { + display: inline; +} + +INPUT[TYPE="TEXT"], TEXTAREA { + font-family: monaco, courier, monospace; +} + +INPUT[TYPE="IMAGE"] { + border: none; + padding: 2pt; + vertical-align: bottom; +} + +SUB, SUP { + font-size: 50%; +} + +TR.data, TD.data, TR.data TD { + margin-top: 10pt; + padding: 5pt; + border-bottom: solid 1pt #999999; +} + +TR.data TH { + border-bottom: solid 1pt #999999; + padding-top: 10pt; + padding-left: 5pt; + text-align: left; +} + +DIV.table TABLE { + border: solid thin #999999; + border-collapse: collapse; + border-spacing: 0; + margin-left: auto; + margin-right: auto; +} + +DIV.table CAPTION { + caption-side: top; + font-size: 120%; + font-style: italic; + font-weight: bold; + margin-left: auto; + margin-right: auto; +} + +DIV.table TABLE TD { + background: white; + border: solid thin #bbbbbb; + padding-top: 5pt; +} + +DIV.table TABLE TH { + background: #f0f0f0; + border: none; + border-bottom: solid thin #999999; +} + +DIV.figure TABLE { + margin-left: auto; + margin-right: auto; +} + +DIV.figure CAPTION { + caption-side: bottom; + font-size: 120%; + font-style: italic; + font-weight: bold; + margin-left: auto; + margin-right: auto; +} + +TH.label { + text-align: right; + vertical-align: top; +} + +TH.sublabel { + text-align: right; + font-weight: normal; +} + +HR { + border: solid thin; +} + +SPAN.info { + background: black; + border: thin solid black; + color: white; + font-size: 80%; + font-style: italic; + font-weight: bold; + white-space: nowrap; +} + +H2 SPAN.info, H3 SPAN.info, H4 SPAN.info { + float: right; + font-size: 100%; +} + +.conflict { + background: red; + color: white; +} + +TH.conflict { + text-align: right; +} + +H1.title { + display: none; +} + +H2.title, H3.title { + border-bottom: solid 1pt #999999; +} + +DIV.indent, TABLE.indent { + margin-top: 2em; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +TABLE.indent { + border-collapse: collapse; +} + +TABLE.indent TD, TABLE.indent TH { + padding: 0; +} + +TABLE.list { + border-collapse: collapse; + margin-left: auto; + margin-right: auto; + width: 90%; +} + +TABLE.list TH { + background: white; + border-bottom: solid thin #cccccc; + color: #444444; + padding-top: 10pt; + padding-left: 5pt; + text-align: left; + vertical-align: bottom; + white-space: nowrap; +} + +TABLE.list TH A { + color: #4444cc; +} + +TABLE.list TD { + border-bottom: solid thin #eeeeee; + padding-top: 5pt; + padding-left: 5pt; +} + +TABLE.list TR:nth-child(even) { + background: #f8f8f8; +} + +TABLE.list TR:nth-child(odd) { + background: #f4f4f4; +} + +DIV.sidebar { + float: right; + min-width: 25%; + margin-left: 10px; + max-width: 33%; +} + +DIV.sidebar P.l0 { + margin-bottom: 0; + margin-left: 0; + margin-right: 0; + margin-top: 12pt; +} + +DIV.sidebar P.l1 { + margin-bottom: 0; + margin-left: 36pt; + margin-right: 0; + margin-top: 0; + text-indent: -18pt; +} + +DIV.sidebar P.l2 { + font-style: italic; + margin-bottom: 0; + margin-left: 54pt; + margin-right: 0; + margin-top: 0; + text-indent: -18pt; +} + +TABLE.inset { + background: #f0f0f0; + border: thin solid #e0e0e0; + margin-top: 1em; + padding: 0; + width: 100%; + /* These are not implemented by all browsers, but that's OK */ + border-radius: 5px; + -moz-border-radius: 5px; +} + +TABLE.inset CAPTION { + caption-side: top; + color: #666666; + font-size: 80%; + margin-left: 10px; + margin-bottom: 2px; + text-align: left; +} + +TABLE.inset TD { + padding: 2px; +} + +DT { + margin-left: 36pt; + margin-top: 12pt; +} + +DD { + margin-left: 54pt; +} + +DL.category DT { + font-weight: bold; +} + +P.summary { + margin-left: 36pt; + font-family: monaco, courier, monospace; +} + +DIV.summary TABLE { + border: solid thin #999999; + border-collapse: collapse; + border-spacing: 0; + margin: 10px; +} + +DIV.summary TABLE TD, DIV.summary TABLE TH { + background: white; + border: solid thin #999999; + border-spacing: 0; + padding: 5px; + text-align: left; + vertical-align: top; +} + +DIV.summary TABLE THEAD TH { + background: #f0f0f0; +} + +DIV.tabs { + height: 480px; + overflow: hidden; +} + +DIV.tab { + float: left; + height: 100%; + overflow-y: auto; + width: 100%; +} + +/* API documentation styles... */ +div.body h1 { + margin: 0; +} +div.body h2 { + margin-top: 1.5em; +} +div.body h3, div.body h4, div.body h5 { + margin-bottom: 0.5em; + margin-top: 1.5em; +} +.class, .enumeration, .function, .struct, .typedef, .union { + border-bottom: solid thin #999999; + margin-bottom: 0; + margin-top: 2em; +} +.description { + margin-top: 0.5em; +} +code, p.code, pre, ul.code li { + font-family: monaco, courier, monospace; + font-size: 90%; +} +ul.code, ul.contents, ul.subcontents { + list-style-type: none; + margin: 0; + padding-left: 0; +} +ul.code li { + margin: 0; +} +ul.contents > li { + margin-top: 1em; +} +ul.contents li ul.code, ul.contents li ul.subcontents { + padding-left: 2em; +} +div.body dl { + margin-left: 0; + margin-top: 0; +} +div.body dt { + font-style: italic; + margin-left: 0; + margin-top: 0; +} +div.body dd { + margin-bottom: 0.5em; +} diff --git a/doc/de/index.html.in b/doc/de/index.html.in new file mode 100644 index 0000000..37af841 --- /dev/null +++ b/doc/de/index.html.in @@ -0,0 +1,107 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> +<HEAD> + <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> + <TITLE>Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Startseite    Verwaltung    Klassen    Online- Hilfe    Aufträge    Drucker  
+ + + + + +
+ +

Common UNIX Printing System @CUPS_VERSION@

+ +

CUPS ist das auf Standards basierte, Opensource-Drucksystem, welches von +Apple Inc. für Mac OS® X und +andere UNIX®-ähnliche Betriebssysteme entwickelt wird.

+ +
CUPS
+ + + +
+ +

CUPS für Benutzer

+ +

CUPS.Übersicht

+ +

Kommandozeilendruck und Einstellungen

+ +

Neues in CUPS 1.5

+ +

Benutzerforum

+ +
+ +

CUPS für Administratoren

+ +

Drucker und Klassen hinzufügen

+ +

Betriebsrichtlinien verwalten

+ +

Basiswissen Druckabrechnung

+ +

Sicherheit des Servers

+ +

Verwenden der Kerberos Authentifizierung

+ +

Benutzen von Netzwerkdruckern

+ +

cupsd.conf Referenz

+ +

Druckertreiber finden

+ +
+ +

CUPS für Entwickler

+ +

Einführung in die CUPS-Programmierung

+ +

CUPS-API

+ +

Filter- und Backend-Programmierung

+ +

HTTP- und IPP-APIs

+ +

PPD-API

+ +

Raster-API

+ +

PPD Compiler Driver Information File Reference

+ +

Entwicklerforum

+ +
+ +
 
CUPS und das CUPS Logo sind +eingetragene Warenzeichen der Apple Inc. +CUPS ist urheberrechtlich geschützt 2007-2012 von Apple Inc, alle Rechte vorbehalten.
+ + diff --git a/doc/es/index.html.in b/doc/es/index.html.in new file mode 100644 index 0000000..d40bf55 --- /dev/null +++ b/doc/es/index.html.in @@ -0,0 +1,107 @@ + + + + + Inicio - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Inicio    Administración    Clases    Ayuda en línea    Trabajos    Impresoras  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS es el sistema de impresión de código abierto basado en +estándares desarrollado por Apple Inc. para Mac +OS® X y otros sistemas operativos tipo UNIX®.

+ +
CUPS
+ + + +
+ +

CUPS para usuarios

+ +

Descripción de CUPS

+ +

Impresión desde la línea de comandos y opciones

+ +

Qué hay de nuevo en CUPS 1.5

+ +

Foro de usuarios

+ +
+ +

CUPS para administradores

+ +

Añadiendo impresoras y clases

+ +

Gestionando políticas de funcionamiento

+ +

Contabilidad básica de impresora

+ +

Seguridad del servidor

+ +

Usando autentificación Kerberos

+ +

Usando impresoras de red

+ +

Referencia de cupsd.conf

+ +

Encontrar controladores de impresora

+ +
+ +

CUPS para desarrolladores

+ +

Introducción a la programación de CUPS

+ +

La API de CUPS

+ +

Programación de filtros y programas de conexión

+ +

Las APIs HTTP e IPP

+ +

La API PPD

+ +

La API Raster

+ +

Referencia del archivo de información del compilador de controladores PPD

+ +

Foro de desarrollo

+ +
+ +
 
CUPS y el logo de CUPS son +marcas registradas de Apple Inc. Los derechos +de copia de CUPS 2007-2012 son de Apple Inc. Todos los derechos reservados.
+ + diff --git a/doc/eu/index.html.in b/doc/eu/index.html.in new file mode 100644 index 0000000..339e524 --- /dev/null +++ b/doc/eu/index.html.in @@ -0,0 +1,106 @@ + + + + + Hasiera - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Hasiera    Administrazioa    Klaseak    Lineako laguntza    Lanak    Inprimagailuak  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

Apple Inc.-ek Mac OS® X eta +beste UNIX® bezalako sistema eragileentzako iturburu irekiko +inprimatzeko sisteman oinarrituta dago.

+ +
CUPS
+ + + +
+ +

CUPS erabiltzaileentzako

+ +

CUPSen gainbegiraketa

+ +

Komando-lerroaren bidez inprimatzea eta aukerak

+ +

CUPS 1.5 bertsioak dakartzan berrikuntza.

+ +

Erabiltzaileen foroa

+ +
+ +

CUPS administratzaileentzako

+ +

Inprimagailuak eta klaseak gehitzea

+ +

Kudeaketako eragiketen politikak

+ +

Inprimagailuaren oinarrizko kontabilitatea

+ +

Zerbitzariaren segurtasuna

+ +

Kerberos autentifikazioa erabiltzea

+ +

Sareko inprimagailuak erabiltzea

+ +

cupsd.conf erreferentzia

+ +

Bilatu inprimagailuaren kontrolatzaileak

+ +
+ +

CUPS garatzaileentzako

+ +

Sarrera CUPSen programaziora

+ +

CUPSen APIa

+ +

Iragazkien eta atzeko planoan programatzeea

+ +

HTTP eta IPP APIak

+ +

PPD APIa

+ +

Bilbearen APIa

+ +

PPD kontrolatzaileen konpilatzailearen informazioaren fitxategiaren erreferentzia

+ +

Garatzaileen forua

+ +
+ +
 
CUPS eta CUPSen logotipoa Apple Inc. en marka erregistratuak dira. +CUPSen copyright-a 2007-2012 Apple Inc. Eskubide guztiak gordeta.
+ + diff --git a/doc/fr/index.html.in b/doc/fr/index.html.in new file mode 100644 index 0000000..86f2435 --- /dev/null +++ b/doc/fr/index.html.in @@ -0,0 +1,107 @@ + + + + + Accueil - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Accueil    Administration    Classes    Aide En Ligne    Tâches    Imprimantes  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS est le système d'impression Open Source, basé sur des standards, développé par +Apple Inc. pour Mac OS® X et +les autres OS UNIX®-like.

+ +
CUPS
+ + + +
+ +

CUPS pour les utilisateurs

+ +

Présentation de CUPS

+ +

Impression en ligne de commande et options

+ +

Quoi de neuf dans CUPS 1.5

+ +

Forum utilisateur

+ +
+ +

CUPS pour les administrateurs

+ +

Ajout d'imprimantes et de classes

+ +

Gérer les politiques

+ +

Printer Accounting Basics

+ +

Sécurité du serveur

+ +

Utiliser l'authentification Kerberos

+ +

Utiliser des imprimantes réseaux

+ +

Références sur cupsd.conf

+ +

Trouver des pilotes d'imprimantes

+ +
+ +

CUPS pour les développeurs

+ +

Introduction à la programmation CUPS

+ +

L'API CUPS

+ +

Programmation de filtres et de backends

+ +

Les API HTTP et IPP

+ +

L'API PPD

+ +

L'API Raster

+ +

PPD Compiler Driver Information File Reference

+ +

Forum développeurs

+ +
+ +
 
CUPS et le logo CUPS sont des marques déposées de +Apple Inc. CUPS est sous copyright 2007-2012 Apple +Inc. Tous droits réservés.
+ + diff --git a/doc/help/accounting.html b/doc/help/accounting.html new file mode 100644 index 0000000..66c34ec --- /dev/null +++ b/doc/help/accounting.html @@ -0,0 +1,62 @@ + + + + Printer Accounting Basics + + + + +

Printer Accounting Basics

+ +

CUPS supports a variety of printer accounting schemes. Aside from the +built-in quota and page logging +support, there are several third-party solutions that can be found on +www.cups.org.

+ + +

Quota Support

+ +

CUPS supports page and size-based quotas for each printer. +The quotas are tracked individually for each user, but a single set of +limits applies to all users for a particular printer. For example, you +can limit every user to 5 pages per day on an expensive printer, but +you cannot limit every user except Johnny.

+ +

The job-k-limit, job-page-limit, and job-quota-period +options determine whether and how quotas are enforced for a printer. +The job-quota-period option determines the time interval for +quota tracking. The interval is expressed in seconds, so a day is +86,400, a week is 604,800, and a month is 2,592,000 seconds. The +job-k-limit option specifies the job size limit in killobytes. The +job-page-limit option specifies the number of pages limit.

+ +

For quotas to be enforced, the period and at least one of the limits +must be set to a non-zero value. The following options will enable +weekly quotas with the given size and page count limits:

+ +
+/usr/sbin/lpadmin -p printer -o job-quota-period=604800 \
+    -o job-k-limit=1024 ENTER
+/usr/sbin/lpadmin -p printer -o job-quota-period=604800 \
+    -o job-page-limit=100 ENTER
+
+ +

Or, you can combine all three options on the same line.

+ +

While there is no way to query the current quota state for a particular +user, any application can request a list of jobs for a user and printer that +can be used to easily determine that information.

+ + +

Page Logging

+ +

CUPS logs every page that is printed on a system to the +page_log file. Page logging +is only available for drivers that provide page accounting information, +typically all PostScript and CUPS raster devices. Raw queues and queues +using third-party solutions such as Foomatic generally do not have +useful page accounting information available.

+ + + + diff --git a/doc/help/api-array.html b/doc/help/api-array.html new file mode 100644 index 0000000..7f22251 --- /dev/null +++ b/doc/help/api-array.html @@ -0,0 +1,1062 @@ + + + + + Array API + + + + + + +
+ + +

Array API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/array.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+

Contents

+ + + +

Overview

+ +

The CUPS array API provides a high-performance generic array container. +The contents of the array container can be sorted and the container itself is +designed for optimal speed and memory usage under a wide variety of conditions. +Sorted arrays use a binary search algorithm from the last found or inserted +element to quickly find matching elements in the array. Arrays created with the +optional hash function can often find elements with a single lookup. The +cups_array_t type is used when +referring to a CUPS array.

+ +

The CUPS scheduler (cupsd) and many of the CUPS API +functions use the array API to efficiently manage large lists of +data.

+ +

Managing Arrays

+ +

Arrays are created using either the +cupsArrayNew, +cupsArrayNew2, or +cupsArrayNew3 functions. The +first function creates a new array with the specified callback function +and user data pointer:

+ +
+#include <cups/array.h>
+
+static int compare_func(void *first, void *second, void *user_data);
+
+void *user_data;
+cups_array_t *array = cupsArrayNew(compare_func, user_data);
+
+ +

The comparison function (type +cups_arrayfunc_t) is called +whenever an element is added to the array and can be NULL to +create an unsorted array. The function returns -1 if the first element should +come before the second, 0 if the first and second elements should have the same +ordering, and 1 if the first element should come after the second.

+ +

The "user_data" pointer is passed to your comparison function. Pass +NULL if you do not need to associate the elements in your array +with additional information.

+ +

The cupsArrayNew2 function adds +two more arguments to support hashed lookups, which can potentially provide +instantaneous ("O(1)") lookups in your array:

+ +
+#include <cups/array.h>
+
+#define HASH_SIZE 512 /* Size of hash table */
+
+static int compare_func(void *first, void *second, void *user_data);
+static int hash_func(void *element, void *user_data);
+
+void *user_data;
+cups_array_t *hash_array = cupsArrayNew2(compare_func, user_data, hash_func, HASH_SIZE);
+
+ +

The hash function (type +cups_ahash_func_t) should return a +number from 0 to (hash_size-1) that (hopefully) uniquely identifies the +element and is called whenever you look up an element in the array with +cupsArrayFind. The hash size is +only limited by available memory, but generally should not be larger than +16384 to realize any performance improvement.

+ +

The cupsArrayNew3 function adds +copy and free callbacks to support basic memory management of elements:

+ +
+#include <cups/array.h>
+
+#define HASH_SIZE 512 /* Size of hash table */
+
+static int compare_func(void *first, void *second, void *user_data);
+static void *copy_func(void *element, void *user_data);
+static void free_func(void *element, void *user_data);
+static int hash_func(void *element, void *user_data);
+
+void *user_data;
+cups_array_t *array = cupsArrayNew3(compare_func, user_data, NULL, 0, copy_func, free_func);
+
+cups_array_t *hash_array = cupsArrayNew3(compare_func, user_data, hash_func, HASH_SIZE, copy_func, free_func);
+
+ +

Once you have created the array, you add elements using the +cupsArrayAdd +cupsArrayInsert functions. +The first function adds an element to the array, adding the new element +after any elements that have the same order, while the second inserts the +element before others with the same order. For unsorted arrays, +cupsArrayAdd appends the element to +the end of the array while +cupsArrayInsert inserts the +element at the beginning of the array. For example, the following code +creates a sorted array of character strings:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+ +

Elements are removed using the +cupsArrayRemove function, for +example:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+/* Remove "Red Fish" */
+cupsArrayRemove(array, "Red Fish");
+
+ +

Finally, you free the memory used by the array using the +cupsArrayDelete function. All +of the memory for the array and hash table (if any) is freed, however CUPS +does not free the elements unless you provide copy and free functions.

+ +

Finding and Enumerating Elements

+ +

CUPS provides several functions to find and enumerate elements in an +array. Each one sets or updates a "current index" into the array, such that +future lookups will start where the last one left off:

+ +
+
cupsArrayFind
+
Returns the first matching element.
+
cupsArrayFirst
+
Returns the first element in the array.
+
cupsArrayIndex
+
Returns the Nth element in the array, starting at 0.
+
cupsArrayLast
+
Returns the last element in the array.
+
cupsArrayNext
+
Returns the next element in the array.
+
cupsArrayPrev
+
Returns the previous element in the array.
+
+ +

Each of these functions returns NULL when there is no +corresponding element. For example, a simple for loop using the +cupsArrayFirst and +cupsArrayNext functions will +enumerate all of the strings in our previous example:

+ +
+#include <cups/array.h>
+
+/* Use strcmp() to compare strings - it will ignore the user_data pointer */
+cups_array_t *array = cupsArrayNew((cups_array_func_t)strcmp, NULL);
+
+/* Add four strings to the array */
+cupsArrayAdd(array, "One Fish");
+cupsArrayAdd(array, "Two Fish");
+cupsArrayAdd(array, "Red Fish");
+cupsArrayAdd(array, "Blue Fish");
+
+/* Show all of the strings in the array */
+char *s;
+for (s = (char *)cupsArrayFirst(array); s != NULL; s = (char *)cupsArrayNext(array))
+  puts(s);
+
+

Functions

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayAdd

+

Add an element to the array.

+

+int cupsArrayAdd (
+    cups_array_t *a,
+    void *e
+);

+

Parameters

+
+
a
+
Array
+
e
+
Element
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

When adding an element to a sorted array, non-unique elements are +appended at the end of the run of identical elements. For unsorted arrays, +the element is appended to the end of the array. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayClear

+

Clear the array.

+

+void cupsArrayClear (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Discussion

+

This function is equivalent to removing all elements in the array. +The caller is responsible for freeing the memory used by the +elements themselves. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayCount

+

Get the number of elements in the array.

+

+int cupsArrayCount (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Number of elements

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayCurrent

+

Return the current element in the array.

+

+void *cupsArrayCurrent (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Element

+

Discussion

+

The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayDelete

+

Free all memory used by the array.

+

+void cupsArrayDelete (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Discussion

+

The caller is responsible for freeing the memory used by the +elements themselves. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayDup

+

Duplicate the array.

+

+cups_array_t *cupsArrayDup (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Duplicate array

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayFind

+

Find an element in the array.

+

+void *cupsArrayFind (
+    cups_array_t *a,
+    void *e
+);

+

Parameters

+
+
a
+
Array
+
e
+
Element
+
+

Return Value

+

Element found or NULL

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayFirst

+

Get the first element in the array.

+

+void *cupsArrayFirst (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

First element or NULL if the array is empty

+

 CUPS 1.3/Mac OS X 10.5 cupsArrayGetIndex

+

Get the index of the current element.

+

+int cupsArrayGetIndex (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Index of the current element, starting at 0

+

Discussion

+

The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsArrayGetInsert

+

Get the index of the last inserted element.

+

+int cupsArrayGetInsert (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Index of the last inserted element, starting at 0

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayIndex

+

Get the N-th element in the array.

+

+void *cupsArrayIndex (
+    cups_array_t *a,
+    int n
+);

+

Parameters

+
+
a
+
Array
+
n
+
Index into array, starting at 0
+
+

Return Value

+

N-th element or NULL

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayInsert

+

Insert an element in the array.

+

+int cupsArrayInsert (
+    cups_array_t *a,
+    void *e
+);

+

Parameters

+
+
a
+
Array
+
e
+
Element
+
+

Return Value

+

0 on failure, 1 on success

+

Discussion

+

When inserting an element in a sorted array, non-unique elements are +inserted at the beginning of the run of identical elements. For unsorted +arrays, the element is inserted at the beginning of the array. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayLast

+

Get the last element in the array.

+

+void *cupsArrayLast (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Last element or NULL if the array is empty

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayNew

+

Create a new array.

+

+cups_array_t *cupsArrayNew (
+    cups_array_func_t f,
+    void *d
+);

+

Parameters

+
+
f
+
Comparison function or NULL for an unsorted array
+
d
+
User data pointer or NULL
+
+

Return Value

+

Array

+

Discussion

+

The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsArrayNew2

+

Create a new array with hash.

+

+cups_array_t *cupsArrayNew2 (
+    cups_array_func_t f,
+    void *d,
+    cups_ahash_func_t h,
+    int hsize
+);

+

Parameters

+
+
f
+
Comparison function or NULL for an unsorted array
+
d
+
User data or NULL
+
h
+
Hash function or NULL for unhashed lookups
+
hsize
+
Hash size (>= 0)
+
+

Return Value

+

Array

+

Discussion

+

The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays.
+
+The hash function ("h") is used to implement cached lookups with the +specified hash size ("hsize"). + +

+

 CUPS 1.5/Mac OS X 10.7 cupsArrayNew3

+

Create a new array with hash and/or free function.

+

+cups_array_t *cupsArrayNew3 (
+    cups_array_func_t f,
+    void *d,
+    cups_ahash_func_t h,
+    int hsize,
+    cups_acopy_func_t cf,
+    cups_afree_func_t ff
+);

+

Parameters

+
+
f
+
Comparison function or NULL for an unsorted array
+
d
+
User data or NULL
+
h
+
Hash function or NULL for unhashed lookups
+
hsize
+
Hash size (>= 0)
+
cf
+
Copy function
+
ff
+
Free function
+
+

Return Value

+

Array

+

Discussion

+

The comparison function ("f") is used to create a sorted array. The function +receives pointers to two elements and the user data pointer ("d") - the user +data pointer argument can safely be omitted when not required so functions +like strcmp can be used for sorted string arrays.
+
+The hash function ("h") is used to implement cached lookups with the +specified hash size ("hsize").
+
+The copy function ("cf") is used to automatically copy/retain elements when +added or the array is copied.
+
+The free function ("cf") is used to automatically free/release elements when +removed or the array is deleted. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayNext

+

Get the next element in the array.

+

+void *cupsArrayNext (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Next element or NULL

+

Discussion

+

This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) + 1)".
+
+The next element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayPrev

+

Get the previous element in the array.

+

+void *cupsArrayPrev (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

Previous element or NULL

+

Discussion

+

This function is equivalent to "cupsArrayIndex(a, cupsArrayGetIndex(a) - 1)".
+
+The previous element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayRemove

+

Remove an element from the array.

+

+int cupsArrayRemove (
+    cups_array_t *a,
+    void *e
+);

+

Parameters

+
+
a
+
Array
+
e
+
Element
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

If more than one element matches "e", only the first matching element is +removed.
+
+The caller is responsible for freeing the memory used by the +removed element. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayRestore

+

Reset the current element to the last cupsArraySave.

+

+void *cupsArrayRestore (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

New current element

+

 CUPS 1.2/Mac OS X 10.5 cupsArraySave

+

Mark the current element for a later cupsArrayRestore.

+

+int cupsArraySave (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

The current element is undefined until you call cupsArrayFind, +cupsArrayFirst, or cupsArrayIndex, or cupsArrayLast +to set the current element.
+
+The save/restore stack is guaranteed to be at least 32 elements deep. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsArrayUserData

+

Return the user data for an array.

+

+void *cupsArrayUserData (
+    cups_array_t *a
+);

+

Parameters

+
+
a
+
Array
+
+

Return Value

+

User data

+

Data Types

+

cups_acopy_func_t

+

Array element copy function

+

+typedef void *(*cups_acopy_func_t)(void *element, void *data); +

+

cups_afree_func_t

+

Array element free function

+

+typedef void (*cups_afree_func_t)(void *element, void *data); +

+

cups_ahash_func_t

+

Array hash function

+

+typedef int (*cups_ahash_func_t)(void *element, void *data); +

+

cups_array_func_t

+

Array comparison function

+

+typedef int (*cups_array_func_t)(void *first, void *second, void *data); +

+

cups_array_t

+

CUPS array type

+

+typedef struct _cups_array_s cups_array_t; +

+
+ + diff --git a/doc/help/api-cgi.html b/doc/help/api-cgi.html new file mode 100644 index 0000000..5c07e58 --- /dev/null +++ b/doc/help/api-cgi.html @@ -0,0 +1,1126 @@ + + + + + CGI API + + + + + + +
+ + +

CGI API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cgi.h
Library-lcupscgi
See AlsoProgramming: Introduction to CUPS Programming
+

Contents

+ + + +

Overview

+ +

The CGI API provides Common Gateway Interface functions for CUPS.

+

Functions

+

cgiCheckVariables

+

Check for the presence of "required" variables.

+

+int cgiCheckVariables (
+    const char *names
+);

+

Parameters

+
+
names
+
Variables to look for
+
+

Return Value

+

1 if all variables present, 0 otherwise

+

Discussion

+

Names may be separated by spaces and/or commas.

+

cgiClearVariables

+

Clear all form variables.

+

+void cgiClearVariables (void);

+

cgiCompileSearch

+

Compile a search string.

+

+void *cgiCompileSearch (
+    const char *query
+);

+

Parameters

+
+
query
+
Query string
+
+

Return Value

+

Search context

+

cgiCopyTemplateFile

+

Copy a template file and replace all the +'{variable}' strings with the variable value.

+

+void cgiCopyTemplateFile (
+    FILE *out,
+    const char *tmpl
+);

+

Parameters

+
+
out
+
Output file
+
tmpl
+
Template file to read
+
+

cgiCopyTemplateLang

+

Copy a template file using a language...

+

+void cgiCopyTemplateLang (
+    const char *tmpl
+);

+

Parameters

+
+
tmpl
+
Base filename
+
+

cgiDoSearch

+

Do a search of some text.

+

+int cgiDoSearch (
+    void *search,
+    const char *text
+);

+

Parameters

+
+
search
+
Search context
+
text
+
Text to search
+
+

Return Value

+

Number of matches

+

cgiEndHTML

+

End a HTML page.

+

+void cgiEndHTML (void);

+

cgiEndMultipart

+

End the delivery of a multipart web page.

+

+void cgiEndMultipart (void);

+

cgiFormEncode

+

Encode a string as a form variable.

+

+char *cgiFormEncode (
+    char *dst,
+    const char *src,
+    size_t dstsize
+);

+

Parameters

+
+
dst
+
Destination string
+
src
+
Source string
+
dstsize
+
Size of destination string
+
+

Return Value

+

Destination string

+

cgiFreeSearch

+

Free a compiled search context.

+

+void cgiFreeSearch (
+    void *search
+);

+

Parameters

+
+
search
+
Search context
+
+

cgiGetArray

+

Get an element from a form array.

+

+const char *cgiGetArray (
+    const char *name,
+    int element
+);

+

Parameters

+
+
name
+
Name of array variable
+
element
+
Element number (0 to N)
+
+

Return Value

+

Element value or NULL

+

cgiGetAttributes

+

Get the list of attributes that are needed +by the template file.

+

+void cgiGetAttributes (
+    ipp_t *request,
+    const char *tmpl
+);

+

Parameters

+
+
request
+
IPP request
+
tmpl
+
Base filename
+
+

cgiGetCookie

+

Get a cookie value.

+

+const char *cgiGetCookie (
+    const char *name
+);

+

Parameters

+
+
name
+
Name of cookie
+
+

Return Value

+

Value or NULL

+

cgiGetFile

+

Get the file (if any) that was submitted in the form.

+

+const cgi_file_t *cgiGetFile (void);

+

Return Value

+

Attached file or NULL

+

cgiGetIPPObjects

+

Get the objects in an IPP response.

+

+cups_array_t *cgiGetIPPObjects (
+    ipp_t *response,
+    void *search
+);

+

Parameters

+
+
response
+
IPP response
+
search
+
Search filter
+
+

Return Value

+

Array of objects

+

cgiGetSize

+

Get the size of a form array value.

+

+int cgiGetSize (
+    const char *name
+);

+

Parameters

+
+
name
+
Name of variable
+
+

Return Value

+

Number of elements

+

cgiGetTemplateDir

+

Get the templates directory...

+

+char *cgiGetTemplateDir (void);

+

Return Value

+

Template directory

+

cgiGetVariable

+

Get a CGI variable from the database.

+

+const char *cgiGetVariable (
+    const char *name
+);

+

Parameters

+
+
name
+
Name of variable
+
+

Return Value

+

Value of variable

+

Discussion

+

Returns NULL if the variable doesn't exist. If the variable is an +array of values, returns the last element.

+

cgiInitialize

+

Initialize the CGI variable "database".

+

+int cgiInitialize (void);

+

Return Value

+

Non-zero if there was form data

+

cgiIsPOST

+

Determine whether this page was POSTed.

+

+int cgiIsPOST (void);

+

Return Value

+

1 if POST, 0 if GET

+

cgiMoveJobs

+

Move one or more jobs.

+

+void cgiMoveJobs (
+    http_t *http,
+    const char *dest,
+    int job_id
+);

+

Parameters

+
+
http
+
Connection to server
+
dest
+
Destination or NULL
+
job_id
+
Job ID or 0 for all
+
+

Discussion

+

At least one of dest or job_id must be non-zero/NULL.

+

cgiPrintCommand

+

Print a CUPS command job.

+

+void cgiPrintCommand (
+    http_t *http,
+    const char *dest,
+    const char *command,
+    const char *title
+);

+

Parameters

+
+
http
+
Connection to server
+
dest
+
Destination printer
+
command
+
Command to send
+
title
+
Page/job title
+
+

cgiPrintTestPage

+

Print a test page.

+

+void cgiPrintTestPage (
+    http_t *http,
+    const char *dest
+);

+

Parameters

+
+
http
+
Connection to server
+
dest
+
Destination printer/class
+
+

cgiRewriteURL

+

Rewrite a printer URI into a web browser URL...

+

+char *cgiRewriteURL (
+    const char *uri,
+    char *url,
+    int urlsize,
+    const char *newresource
+);

+

Parameters

+
+
uri
+
Current URI
+
url
+
New URL
+
urlsize
+
Size of URL buffer
+
newresource
+
Replacement resource
+
+

Return Value

+

New URL

+

cgiSetArray

+

Set array element N to the specified string.

+

+void cgiSetArray (
+    const char *name,
+    int element,
+    const char *value
+);

+

Parameters

+
+
name
+
Name of variable
+
element
+
Element number (0 to N)
+
value
+
Value of variable
+
+

Discussion

+

If the variable array is smaller than (element + 1), the intervening +elements are set to NULL.

+

cgiSetCookie

+

Set a cookie value.

+

+void cgiSetCookie (
+    const char *name,
+    const char *value,
+    const char *path,
+    const char *domain,
+    time_t expires,
+    int secure
+);

+

Parameters

+
+
name
+
Name
+
value
+
Value
+
path
+
Path (typically "/")
+
domain
+
Domain name
+
expires
+
Expiration date (0 for session)
+
secure
+
Require SSL
+
+

cgiSetIPPObjectVars

+

Set CGI variables from an IPP object.

+

+ipp_attribute_t *cgiSetIPPObjectVars (
+    ipp_attribute_t *obj,
+    const char *prefix,
+    int element
+);

+

Parameters

+
+
obj
+
Response data to be copied...
+
prefix
+
Prefix for name or NULL
+
element
+
Parent element number
+
+

Return Value

+

Next object

+

cgiSetIPPVars

+

Set CGI variables from an IPP response.

+

+int cgiSetIPPVars (
+    ipp_t *response,
+    const char *filter_name,
+    const char *filter_value,
+    const char *prefix,
+    int parent_el
+);

+

Parameters

+
+
response
+
Response data to be copied...
+
filter_name
+
Filter name
+
filter_value
+
Filter value
+
prefix
+
Prefix for name or NULL
+
parent_el
+
Parent element number
+
+

Return Value

+

Maximum number of elements

+

cgiSetServerVersion

+

Set the server name and CUPS version...

+

+void cgiSetServerVersion (void);

+

cgiSetSize

+

Set the array size.

+

+void cgiSetSize (
+    const char *name,
+    int size
+);

+

Parameters

+
+
name
+
Name of variable
+
size
+
Number of elements (0 to N)
+
+

cgiSetVariable

+

Set a CGI variable in the database.

+

+void cgiSetVariable (
+    const char *name,
+    const char *value
+);

+

Parameters

+
+
name
+
Name of variable
+
value
+
Value of variable
+
+

Discussion

+

If the variable is an array, this truncates the array to a single element.

+

cgiShowIPPError

+

Show the last IPP error message.

+

+void cgiShowIPPError (
+    const char *message
+);

+

Parameters

+
+
message
+
Contextual message
+
+

Discussion

+

The caller must still call cgiStartHTML() and cgiEndHTML().

+

cgiShowJobs

+

Show print jobs.

+

+void cgiShowJobs (
+    http_t *http,
+    const char *dest
+);

+

Parameters

+
+
http
+
Connection to server
+
dest
+
Destination name or NULL
+
+

cgiStartHTML

+

Start a HTML page.

+

+void cgiStartHTML (
+    const char *title
+);

+

Parameters

+
+
title
+
Title of page
+
+

cgiStartMultipart

+

Start a multipart delivery of a web page.

+

+void cgiStartMultipart (void);

+

cgiSupportsMultipart

+

Does the browser support multi-part documents?

+

+int cgiSupportsMultipart (void);

+

Return Value

+

1 if multi-part supported, 0 otherwise

+

cgiText

+

Return localized text.

+

+const char *cgiText (
+    const char *message
+);

+

Parameters

+
+
message
+
Message
+
+

Return Value

+

Localized message

+

helpDeleteIndex

+

Delete an index, freeing all memory used.

+

+void helpDeleteIndex (
+    help_index_t *hi
+);

+

Parameters

+
+
hi
+
Help index
+
+

helpFindNode

+

Find a node in an index.

+

+help_node_t *helpFindNode (
+    help_index_t *hi,
+    const char *filename,
+    const char *anchor
+);

+

Parameters

+
+
hi
+
Index
+
filename
+
Filename
+
anchor
+
Anchor
+
+

Return Value

+

Node pointer or NULL

+

helpLoadIndex

+

Load a help index from disk.

+

+help_index_t *helpLoadIndex (
+    const char *hifile,
+    const char *directory
+);

+

Parameters

+
+
hifile
+
Index filename
+
directory
+
Directory that is indexed
+
+

Return Value

+

Index pointer or NULL

+

helpSaveIndex

+

Save a help index to disk.

+

+int helpSaveIndex (
+    help_index_t *hi,
+    const char *hifile
+);

+

Parameters

+
+
hi
+
Index
+
hifile
+
Index filename
+
+

Return Value

+

0 on success, -1 on error

+

helpSearchIndex

+

Search an index.

+

+help_index_t *helpSearchIndex (
+    help_index_t *hi,
+    const char *query,
+    const char *section,
+    const char *filename
+);

+

Parameters

+
+
hi
+
Index
+
query
+
Query string
+
section
+
Limit search to this section
+
filename
+
Limit search to this file
+
+

Return Value

+

Search index

+

Data Types

+

cgi_file_t

+

Uploaded file data

+

+typedef struct cgi_file_s cgi_file_t; +

+

help_index_t

+

Help index structure

+

+typedef struct help_index_s help_index_t; +

+

help_node_t

+

Help node structure...

+

+typedef struct help_node_s help_node_t; +

+

help_word_t

+

Help word structure...

+

+typedef struct help_word_s help_word_t; +

+

Structures

+

cgi_file_s

+

Uploaded file data

+

struct cgi_file_s {
+    size_t filesize;
+    char tempfile[1024], *name, *filename, *mimetype;
+};

+

Members

+
+
filesize
+
Size of uploaded file
+
mimetype
+
MIME media type
+
+

help_index_s

+

Help index structure

+

struct help_index_s {
+    cups_array_t *nodes;
+    int search;
+    cups_array_t *sorted;
+};

+

Members

+
+
nodes
+
Nodes sorted by filename
+
search
+
1 = search index, 0 = normal
+
sorted
+
Nodes sorted by score + text
+
+

help_node_s

+

Help node structure...

+

struct help_node_s {
+    char *anchor;
+    char *filename;
+    size_t length;
+    time_t mtime;
+    off_t offset;
+    int score;
+    char *section;
+    char *text;
+    cups_array_t *words;
+};

+

Members

+
+
anchor
+
Anchor name (NULL if none)
+
filename
+
Filename, relative to help dir
+
length
+
Length in bytes
+
mtime
+
Last modification time
+
offset
+
Offset in file
+
score
+
Search score
+
section
+
Section name (NULL if none)
+
text
+
Text in anchor
+
words
+
Words after this node
+
+

help_word_s

+

Help word structure...

+

struct help_word_s {
+    int count;
+    char *text;
+};

+

Members

+
+
count
+
Number of occurrences
+
text
+
Word text
+
+
+ + diff --git a/doc/help/api-cups.html b/doc/help/api-cups.html new file mode 100644 index 0000000..2dd4083 --- /dev/null +++ b/doc/help/api-cups.html @@ -0,0 +1,2521 @@ + + + + + CUPS API + + + + + + +
+ + +

CUPS API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cups.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: Array API
+ Programming: File and Directory APIs
+ Programming: Filter and Backend Programming
+ Programming: HTTP and IPP APIs
+ Programming: PPD API
+ Programming: Raster API
+

Contents

+ + + +

Overview

+ +

The CUPS API provides the convenience functions needed to support +applications, filters, printer drivers, and backends that need to interface +with the CUPS scheduler.

+ +

Clients and Servers

+ +

CUPS is based on the Internet Printing Protocol ("IPP"), which allows +clients (applications) to communicate with a server (the scheduler) to get a +list of printers, send print jobs, and so forth. You identify which server +you want to communicate with using a pointer to the opaque structure +http_t. All of the examples in this document use the +CUPS_HTTP_DEFAULT constant, referring to the default connection +to the scheduler. The HTTP and IPP +APIs document provides more information on server connections.

+ +

Printers and Classes

+ +

Printers and classes (collections of printers) are accessed through +the cups_dest_t structure which +includes the name (name), instance (instance - +a way of selecting certain saved options/settings), and the options and +attributes associated with that destination (num_options and +options). Destinations are created using the +cupsGetDests function and freed +using the cupsFreeDests function. +The cupsGetDest function finds a +specific destination for printing:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dests;
+int num_dests = cupsGetDests(&dests);
+cups_dest_t *dest = cupsGetDest("name", NULL, num_dests, dests);
+
+/* do something with dest */
+
+cupsFreeDests(num_dests, dests);
+
+ +

Passing NULL to +cupsGetDest for the destination name +will return the default destination. Similarly, passing a NULL +instance will return the default instance for that destination.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Printer Attributes
Attribute NameDescription
"auth-info-required"The type of authentication required for printing to this + destination: "none", "username,password", "domain,username,password", + or "negotiate" (Kerberos)
"printer-info"The human-readable description of the destination such as "My + Laser Printer".
"printer-is-accepting-jobs""true" if the destination is accepting new jobs, "false" if + not.
"printer-is-shared""true" if the destination is being shared with other computers, + "false" if not.
"printer-location"The human-readable location of the destination such as "Lab 4".
"printer-make-and-model"The human-readable make and model of the destination such as "HP + LaserJet 4000 Series".
"printer-state""3" if the destination is idle, "4" if the destination is printing + a job, and "5" if the destination is stopped.
"printer-state-change-time"The UNIX time when the destination entered the current state.
"printer-state-reasons"Additional comma-delimited state keywords for the destination + such as "media-tray-empty-error" and "toner-low-warning".
"printer-type"The cups_printer_t + value associated with the destination.
+ +

Options

+ +

Options are stored in arrays of +cups_option_t structures. Each +option has a name (name) and value (value) +associated with it. The cups_dest_t +num_options and options members contain the +default options for a particular destination, along with several informational +attributes about the destination as shown in Table 1. +The cupsGetOption function gets +the value for the named option. For example, the following code lists the +available destinations and their human-readable descriptions:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dests;
+int num_dests = cupsGetDests(&dests);
+cups_dest_t *dest;
+int i;
+const char *value;
+
+for (i = num_dests, dest = dests; i > 0; i --, dest ++)
+  if (dest->instance == NULL)
+  {
+    value = cupsGetOption("printer-info", dest->num_options, dest->options);
+    printf("%s (%s)\n", dest->name, value ? value : "no description");
+  }
+
+cupsFreeDests(num_dests, dests);
+
+ +

You can create your own option arrays using the +cupsAddOption function, which +adds a single named option to an array:

+ +
+#include <cups/cups.h>
+
+int num_options = 0;
+cups_option_t *options = NULL;
+
+/* The returned num_options value is updated as needed */
+num_options = cupsAddOption("first", "value", num_options, &options);
+
+/* This adds a second option value */
+num_options = cupsAddOption("second", "value", num_options, &options);
+
+/* This replaces the first option we added */
+num_options = cupsAddOption("first", "new value", num_options, &options);
+
+ +

Use a for loop to copy the options from a destination:

+ +
+#include <cups/cups.h>
+
+int i;
+int num_options = 0;
+cups_option_t *options = NULL;
+cups_dest_t *dest;
+
+for (i = 0; i < dest->num_options; i ++)
+  num_options = cupsAddOption(dest->options[i].name, dest->options[i].value,
+                              num_options, &options);
+
+ +

Use the cupsFreeOptions +function to free the options array when you are done using it:

+ +
+cupsFreeOptions(num_options, options);
+
+ +

Print Jobs

+ +

Print jobs are identified by a locally-unique job ID number from 1 to +231-1 and have options and one or more files for printing to a +single destination. The cupsPrintFile +function creates a new job with one file. The following code prints the CUPS +test page file:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+
+/* Print a single file */
+job_id = cupsPrintFile(dest->name, "/usr/share/cups/data/testprint.ps",
+                        "Test Print", num_options, options);
+
+ +

The cupsPrintFiles function +creates a job with multiple files. The files are provided in a +char * array:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+char *files[3] = { "file1.pdf", "file2.pdf", "file3.pdf" };
+
+/* Print three files */
+job_id = cupsPrintFiles(dest->name, 3, files, "Test Print", num_options, options);
+
+ +

Finally, the cupsCreateJob +function creates a new job with no files in it. Files are added using the +cupsStartDocument, +cupsWriteRequestData, +and cupsFinishDocument functions. +The following example creates a job with 10 text files for printing:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int num_options;
+cups_option_t *options;
+int job_id;
+int i;
+char buffer[1024];
+
+/* Create the job */
+job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, dest->name, "10 Text Files",
+                       num_options, options);
+
+/* If the job is created, add 10 files */
+if (job_id > 0)
+{
+  for (i = 1; i <= 10; i ++)
+  {
+    snprintf(buffer, sizeof(buffer), "file%d.txt", i);
+
+    cupsStartDocument(CUPS_HTTP_DEFAULT, dest->name, job_id, buffer,
+                      CUPS_FORMAT_TEXT, i == 10);
+
+    snprintf(buffer, sizeof(buffer),
+             "File %d\n"
+             "\n"
+             "One fish,\n"
+             "Two fish,\n
+             "Red fish,\n
+             "Blue fish\n", i);
+
+    /* cupsWriteRequestData can be called as many times as needed */
+    cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, strlen(buffer));
+
+    cupsFinishDocument(CUPS_HTTP_DEFAULT, dest->name);
+  }
+}
+
+ +

Once you have created a job, you can monitor its status using the +cupsGetJobs function, which returns +an array of cups_job_t structures. +Each contains the job ID (id), destination name +(dest), title (title), and other information +associated with the job. The job array is freed using the +cupsFreeJobs function. The following +example monitors a specific job ID, showing the current job state once every +5 seconds until the job is completed:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int job_id;
+int num_jobs;
+cups_job_t *jobs;
+int i;
+ipp_jstate_t job_state = IPP_JOB_PENDING;
+ 
+while (job_state < IPP_JOB_STOPPED)
+{
+  /* Get my jobs (1) with any state (-1) */
+  num_jobs = cupsGetJobs(&jobs, dest->name, 1, -1);
+
+  /* Loop to find my job */
+  job_state = IPP_JOB_COMPLETED;
+
+  for (i = 0; i < num_jobs; i ++)
+    if (jobs[i].id == job_id)
+    {
+      job_state = jobs[i].state;
+      break;
+    }
+
+  /* Free the job array */
+  cupsFreeJobs(num_jobs, jobs);
+
+  /* Show the current state */
+  switch (job_state)
+  {
+    case IPP_JOB_PENDING :
+        printf("Job %d is pending.\n", job_id);
+        break;
+    case IPP_JOB_HELD :
+        printf("Job %d is held.\n", job_id);
+        break;
+    case IPP_JOB_PROCESSING :
+        printf("Job %d is processing.\n", job_id);
+        break;
+    case IPP_JOB_STOPPED :
+        printf("Job %d is stopped.\n", job_id);
+        break;
+    case IPP_JOB_CANCELED :
+        printf("Job %d is canceled.\n", job_id);
+        break;
+    case IPP_JOB_ABORTED :
+        printf("Job %d is aborted.\n", job_id);
+        break;
+    case IPP_JOB_COMPLETED :
+        printf("Job %d is completed.\n", job_id);
+        break;
+  }
+
+  /* Sleep if the job is not finished */
+  if (job_state < IPP_JOB_STOPPED)
+    sleep(5);
+}
+
+ +

To cancel a job, use the +cupsCancelJob function with the +job ID:

+ +
+#include <cups/cups.h>
+
+cups_dest_t *dest;
+int job_id;
+
+cupsCancelJob(dest->name, job_id);
+
+ +

Error Handling

+ +

If any of the CUPS API printing functions returns an error, the reason for +that error can be found by calling the +cupsLastError and +cupsLastErrorString functions. +cupsLastError returns the last IPP +error code +(ipp_status_t) +that was encountered, while +cupsLastErrorString returns +a (localized) human-readable string that can be shown to the user. For example, +if any of the job creation functions returns a job ID of 0, you can use +cupsLastErrorString to show +the reason why the job could not be created:

+ +
+#include <cups/cups.h>
+
+int job_id;
+
+if (job_id == 0)
+  puts(cupsLastErrorString());
+
+ +

Passwords and Authentication

+ +

CUPS supports authentication of any request, including submission of print +jobs. The default mechanism for getting the username and password is to use the +login user and a password from the console.

+ +

To support other types of applications, in particular Graphical User +Interfaces ("GUIs"), the CUPS API provides functions to set the default +username and to register a callback function that returns a password string.

+ +

The cupsSetPasswordCB +function is used to set a password callback in your program. Only one +function can be used at any time.

+ +

The cupsSetUser function sets the +current username for authentication. This function can be called by your +password callback function to change the current username as needed.

+ +

The following example shows a simple password callback that gets a +username and password from the user:

+ +
+#include <cups/cups.h>
+
+const char *
+my_password_cb(const char *prompt)
+{
+  char	user[65];
+
+
+  puts(prompt);
+
+  /* Get a username from the user */
+  printf("Username: ");
+  if (fgets(user, sizeof(user), stdin) == NULL)
+    return (NULL);
+
+  /* Strip the newline from the string and set the user */
+  user[strlen(user) - 1] = '\0';
+
+  cupsSetUser(user);
+
+  /* Use getpass() to ask for the password... */
+  return (getpass("Password: "));
+}
+
+cupsSetPasswordCB(my_password_cb);
+
+ +

Similarly, a GUI could display the prompt string in a window with input +fields for the username and password. The username should default to the +string returned by the cupsUser +function.

+

Functions

+

appleGetPaperSize

+

Get the default paper size.

+

+char *appleGetPaperSize (
+    char *name,
+    int namesize
+);

+

Parameters

+
+
name
+
Paper size name buffer
+
namesize
+
Size of buffer
+
+

Return Value

+

Default paper size

+

cupsAddDest

+

Add a destination to the list of destinations.

+

+int cupsAddDest (
+    const char *name,
+    const char *instance,
+    int num_dests,
+    cups_dest_t **dests
+);

+

Parameters

+
+
name
+
Destination name
+
instance
+
Instance name or NULL for none/primary
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

Return Value

+

New number of destinations

+

Discussion

+

This function cannot be used to add a new class or printer queue, +it only adds a new container of saved options for the named +destination or instance.
+
+If the named destination already exists, the destination list is +returned unchanged. Adding a new instance of a destination creates +a copy of that destination's options.
+
+Use the cupsSaveDests function to save the updated list of +destinations to the user's lpoptions file.

+

cupsAddOption

+

Add an option to an option array.

+

+int cupsAddOption (
+    const char *name,
+    const char *value,
+    int num_options,
+    cups_option_t **options
+);

+

Parameters

+
+
name
+
Name of option
+
value
+
Value of option
+
num_options
+
Number of options
+
options
+
Pointer to options
+
+

Return Value

+

Number of options

+

Discussion

+

New option arrays can be initialized simply by passing 0 for the +"num_options" parameter.

+

 CUPS 1.2/Mac OS X 10.5 cupsAdminCreateWindowsPPD

+

Create the Windows PPD file for a printer.

+

+char *cupsAdminCreateWindowsPPD (
+    http_t *http,
+    const char *dest,
+    char *buffer,
+    int bufsize
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
dest
+
Printer or class
+
buffer
+
Filename buffer
+
bufsize
+
Size of filename buffer
+
+

Return Value

+

PPD file or NULL

+

 CUPS 1.2/Mac OS X 10.5 cupsAdminExportSamba

+

Export a printer to Samba.

+

+int cupsAdminExportSamba (
+    const char *dest,
+    const char *ppd,
+    const char *samba_server,
+    const char *samba_user,
+    const char *samba_password,
+    FILE *logfile
+);

+

Parameters

+
+
dest
+
Destination to export
+
ppd
+
PPD file
+
samba_server
+
Samba server
+
samba_user
+
Samba username
+
samba_password
+
Samba password
+
logfile
+
Log file, if any
+
+

Return Value

+

1 on success, 0 on failure

+

 CUPS 1.3/Mac OS X 10.5 cupsAdminGetServerSettings

+

Get settings from the server.

+

+int cupsAdminGetServerSettings (
+    http_t *http,
+    int *num_settings,
+    cups_option_t **settings
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
num_settings
+
Number of settings
+
settings
+
Settings
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

The returned settings should be freed with cupsFreeOptions() when +you are done with them. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsAdminSetServerSettings

+

Set settings on the server.

+

+int cupsAdminSetServerSettings (
+    http_t *http,
+    int num_settings,
+    cups_option_t *settings
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
num_settings
+
Number of settings
+
settings
+
Settings
+
+

Return Value

+

1 on success, 0 on failure

+

cupsCancelJob

+

Cancel a print job on the default server.

+

+int cupsCancelJob (
+    const char *name,
+    int job_id
+);

+

Parameters

+
+
name
+
Name of printer or class
+
job_id
+
Job ID, CUPS_JOBID_CURRENT for the current job, or CUPS_JOBID_ALL for all jobs
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

Pass CUPS_JOBID_ALL to cancel all jobs or CUPS_JOBID_CURRENT +to cancel the current job on the named destination.
+
+Use the cupsLastError and cupsLastErrorString functions to get +the cause of any failure.

+

 CUPS 1.4/Mac OS X 10.6 cupsCancelJob2

+

Cancel or purge a print job.

+

+ipp_status_t cupsCancelJob2 (
+    http_t *http,
+    const char *name,
+    int job_id,
+    int purge
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Name of printer or class
+
job_id
+
Job ID, CUPS_JOBID_CURRENT for the current job, or CUPS_JOBID_ALL for all jobs
+
purge
+
1 to purge, 0 to cancel
+
+

Return Value

+

IPP status

+

Discussion

+

Canceled jobs remain in the job history while purged jobs are removed +from the job history.
+
+Pass CUPS_JOBID_ALL to cancel all jobs or CUPS_JOBID_CURRENT +to cancel the current job on the named destination.
+
+Use the cupsLastError and cupsLastErrorString functions to get +the cause of any failure. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsCreateJob

+

Create an empty job for streaming.

+

+int cupsCreateJob (
+    http_t *http,
+    const char *name,
+    const char *title,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
title
+
Title of job
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Job ID or 0 on error

+

Discussion

+

Use this function when you want to stream print data using the +cupsStartDocument, cupsWriteRequestData, and +cupsFinishDocument functions. If you have one or more files to +print, use the cupsPrintFile2 or cupsPrintFiles2 function +instead. + +

+

cupsEncryption

+

Get the current encryption settings.

+

+http_encryption_t cupsEncryption (void);

+

Return Value

+

Encryption settings

+

Discussion

+

The default encryption setting comes from the CUPS_ENCRYPTION +environment variable, then the ~/.cups/client.conf file, and finally the +/etc/cups/client.conf file. If not set, the default is +HTTP_ENCRYPT_IF_REQUESTED.
+
+Note: The current encryption setting is tracked separately for each thread +in a program. Multi-threaded programs that override the setting via the +cupsSetEncryption function need to do so in each thread for the same +setting to be used.

+

 CUPS 1.4/Mac OS X 10.6 cupsFinishDocument

+

Finish sending a document.

+

+ipp_status_t cupsFinishDocument (
+    http_t *http,
+    const char *name
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
+

Return Value

+

Status of document submission

+

Discussion

+

The document must have been started using cupsStartDocument. + +

+

cupsFreeDests

+

Free the memory used by the list of destinations.

+

+void cupsFreeDests (
+    int num_dests,
+    cups_dest_t *dests
+);

+

Parameters

+
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

cupsFreeJobs

+

Free memory used by job data.

+

+void cupsFreeJobs (
+    int num_jobs,
+    cups_job_t *jobs
+);

+

Parameters

+
+
num_jobs
+
Number of jobs
+
jobs
+
Jobs
+
+

cupsFreeOptions

+

Free all memory used by options.

+

+void cupsFreeOptions (
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
num_options
+
Number of options
+
options
+
Pointer to options
+
+

 DEPRECATED cupsGetClasses

+

Get a list of printer classes from the default server.

+

+int cupsGetClasses (
+    char ***classes
+);

+

Parameters

+
+
classes
+
Classes
+
+

Return Value

+

Number of classes

+

Discussion

+

This function is deprecated - use cupsGetDests instead. + +

+

cupsGetDefault

+

Get the default printer or class for the default server.

+

+const char *cupsGetDefault (void);

+

Return Value

+

Default printer or NULL

+

Discussion

+

This function returns the default printer or class as defined by +the LPDEST or PRINTER environment variables. If these environment +variables are not set, the server default destination is returned. +Applications should use the cupsGetDests and cupsGetDest +functions to get the user-defined default printer, as this function does +not support the lpoptions-defined default printer.

+

 CUPS 1.1.21/Mac OS X 10.4 cupsGetDefault2

+

Get the default printer or class for the specified server.

+

+const char *cupsGetDefault2 (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
+

Return Value

+

Default printer or NULL

+

Discussion

+

This function returns the default printer or class as defined by +the LPDEST or PRINTER environment variables. If these environment +variables are not set, the server default destination is returned. +Applications should use the cupsGetDests and cupsGetDest +functions to get the user-defined default printer, as this function does +not support the lpoptions-defined default printer. + +

+

cupsGetDest

+

Get the named destination from the list.

+

+cups_dest_t *cupsGetDest (
+    const char *name,
+    const char *instance,
+    int num_dests,
+    cups_dest_t *dests
+);

+

Parameters

+
+
name
+
Destination name or NULL for the default destination
+
instance
+
Instance name or NULL
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

Return Value

+

Destination pointer or NULL

+

Discussion

+

Use the cupsGetDests or cupsGetDests2 functions to get a +list of supported destinations for the current user.

+

cupsGetDests

+

Get the list of destinations from the default server.

+

+int cupsGetDests (
+    cups_dest_t **dests
+);

+

Parameters

+
+
dests
+
Destinations
+
+

Return Value

+

Number of destinations

+

Discussion

+

Starting with CUPS 1.2, the returned list of destinations include the +printer-info, printer-is-accepting-jobs, printer-is-shared, +printer-make-and-model, printer-state, printer-state-change-time, +printer-state-reasons, and printer-type attributes as options. CUPS 1.4 +adds the marker-change-time, marker-colors, marker-high-levels, +marker-levels, marker-low-levels, marker-message, marker-names, +marker-types, and printer-commands attributes as well.
+
+Use the cupsFreeDests function to free the destination list and +the cupsGetDest function to find a particular destination.

+

 CUPS 1.1.21/Mac OS X 10.4 cupsGetDests2

+

Get the list of destinations from the specified server.

+

+int cupsGetDests2 (
+    http_t *http,
+    cups_dest_t **dests
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
dests
+
Destinations
+
+

Return Value

+

Number of destinations

+

Discussion

+

Starting with CUPS 1.2, the returned list of destinations include the +printer-info, printer-is-accepting-jobs, printer-is-shared, +printer-make-and-model, printer-state, printer-state-change-time, +printer-state-reasons, and printer-type attributes as options. CUPS 1.4 +adds the marker-change-time, marker-colors, marker-high-levels, +marker-levels, marker-low-levels, marker-message, marker-names, +marker-types, and printer-commands attributes as well.
+
+Use the cupsFreeDests function to free the destination list and +the cupsGetDest function to find a particular destination. + +

+

cupsGetJobs

+

Get the jobs from the default server.

+

+int cupsGetJobs (
+    cups_job_t **jobs,
+    const char *name,
+    int myjobs,
+    int whichjobs
+);

+

Parameters

+
+
jobs
+
Job data
+
name
+
NULL = all destinations, otherwise show jobs for named destination
+
myjobs
+
0 = all users, 1 = mine
+
whichjobs
+
CUPS_WHICHJOBS_ALL, CUPS_WHICHJOBS_ACTIVE, or CUPS_WHICHJOBS_COMPLETED
+
+

Return Value

+

Number of jobs

+

Discussion

+

A "whichjobs" value of CUPS_WHICHJOBS_ALL returns all jobs regardless +of state, while CUPS_WHICHJOBS_ACTIVE returns jobs that are +pending, processing, or held and CUPS_WHICHJOBS_COMPLETED returns +jobs that are stopped, canceled, aborted, or completed.

+

 CUPS 1.1.21/Mac OS X 10.4 cupsGetJobs2

+

Get the jobs from the specified server.

+

+int cupsGetJobs2 (
+    http_t *http,
+    cups_job_t **jobs,
+    const char *name,
+    int myjobs,
+    int whichjobs
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
jobs
+
Job data
+
name
+
NULL = all destinations, otherwise show jobs for named destination
+
myjobs
+
0 = all users, 1 = mine
+
whichjobs
+
CUPS_WHICHJOBS_ALL, CUPS_WHICHJOBS_ACTIVE, or CUPS_WHICHJOBS_COMPLETED
+
+

Return Value

+

Number of jobs

+

Discussion

+

A "whichjobs" value of CUPS_WHICHJOBS_ALL returns all jobs regardless +of state, while CUPS_WHICHJOBS_ACTIVE returns jobs that are +pending, processing, or held and CUPS_WHICHJOBS_COMPLETED returns +jobs that are stopped, canceled, aborted, or completed. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsGetNamedDest

+

Get options for the named destination.

+

+cups_dest_t *cupsGetNamedDest (
+    http_t *http,
+    const char *name,
+    const char *instance
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name or NULL for the default destination
+
instance
+
Instance name or NULL
+
+

Return Value

+

Destination or NULL

+

Discussion

+

This function is optimized for retrieving a single destination and should +be used instead of cupsGetDests and cupsGetDest when you either +know the name of the destination or want to print to the default destination. +If NULL is returned, the destination does not exist or there is no +default destination.
+
+If "http" is CUPS_HTTP_DEFAULT, the connection to the default print +server will be used.
+
+If "name" is NULL, the default printer for the current user will be +returned.
+
+The returned destination must be freed using cupsFreeDests with a +"num_dests" value of 1. + +

+

cupsGetOption

+

Get an option value.

+

+const char *cupsGetOption (
+    const char *name,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
name
+
Name of option
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Option value or NULL

+

cupsGetPPD

+

Get the PPD file for a printer on the default server.

+

+const char *cupsGetPPD (
+    const char *name
+);

+

Parameters

+
+
name
+
Destination name
+
+

Return Value

+

Filename for PPD file

+

Discussion

+

For classes, cupsGetPPD returns the PPD file for the first printer +in the class.
+
+The returned filename is stored in a static buffer and is overwritten with +each call to cupsGetPPD or cupsGetPPD2. The caller "owns" the +file that is created and must unlink the returned filename.

+

 CUPS 1.1.21/Mac OS X 10.4 cupsGetPPD2

+

Get the PPD file for a printer from the specified server.

+

+const char *cupsGetPPD2 (
+    http_t *http,
+    const char *name
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
+

Return Value

+

Filename for PPD file

+

Discussion

+

For classes, cupsGetPPD2 returns the PPD file for the first printer +in the class.
+
+The returned filename is stored in a static buffer and is overwritten with +each call to cupsGetPPD or cupsGetPPD2. The caller "owns" the +file that is created and must unlink the returned filename. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsGetPPD3

+

Get the PPD file for a printer on the specified +server if it has changed.

+

+http_status_t cupsGetPPD3 (
+    http_t *http,
+    const char *name,
+    time_t *modtime,
+    char *buffer,
+    size_t bufsize
+);

+

Parameters

+
+
http
+
HTTP connection or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
modtime
+
Modification time
+
buffer
+
Filename buffer
+
bufsize
+
Size of filename buffer
+
+

Return Value

+

HTTP status

+

Discussion

+

The "modtime" parameter contains the modification time of any +locally-cached content and is updated with the time from the PPD file on +the server.
+
+The "buffer" parameter contains the local PPD filename. If it contains +the empty string, a new temporary file is created, otherwise the existing +file will be overwritten as needed. The caller "owns" the file that is +created and must unlink the returned filename.
+
+On success, HTTP_OK is returned for a new PPD file and +HTTP_NOT_MODIFIED if the existing PPD file is up-to-date. Any other +status is an error.
+
+For classes, cupsGetPPD3 returns the PPD file for the first printer +in the class. + +

+

cupsGetPassword

+

Get a password from the user.

+

+const char *cupsGetPassword (
+    const char *prompt
+);

+

Parameters

+
+
prompt
+
Prompt string
+
+

Return Value

+

Password

+

Discussion

+

Uses the current password callback function. Returns NULL if the +user does not provide a password.
+
+Note: The current password callback function is tracked separately for each +thread in a program. Multi-threaded programs that override the setting via +the cupsSetPasswordCB or cupsSetPasswordCB2 functions need to +do so in each thread for the same function to be used.

+

 CUPS 1.4/Mac OS X 10.6 cupsGetPassword2

+

Get a password from the user using the advanced +password callback.

+

+const char *cupsGetPassword2 (
+    const char *prompt,
+    http_t *http,
+    const char *method,
+    const char *resource
+);

+

Parameters

+
+
prompt
+
Prompt string
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
method
+
Request method ("GET", "POST", "PUT")
+
resource
+
Resource path
+
+

Return Value

+

Password

+

Discussion

+

Uses the current password callback function. Returns NULL if the +user does not provide a password.
+
+Note: The current password callback function is tracked separately for each +thread in a program. Multi-threaded programs that override the setting via +the cupsSetPasswordCB or cupsSetPasswordCB2 functions need to +do so in each thread for the same function to be used. + +

+

 DEPRECATED cupsGetPrinters

+

Get a list of printers from the default server.

+

+int cupsGetPrinters (
+    char ***printers
+);

+

Parameters

+
+
printers
+
Printers
+
+

Return Value

+

Number of printers

+

Discussion

+

This function is deprecated - use cupsGetDests instead. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsGetServerPPD

+

Get an available PPD file from the server.

+

+char *cupsGetServerPPD (
+    http_t *http,
+    const char *name
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Name of PPD file ("ppd-name")
+
+

Return Value

+

Name of PPD file or NULL on error

+

Discussion

+

This function returns the named PPD file from the server. The +list of available PPDs is provided by the IPP CUPS_GET_PPDS +operation.
+
+You must remove (unlink) the PPD file when you are finished with +it. The PPD filename is stored in a static location that will be +overwritten on the next call to cupsGetPPD, cupsGetPPD2, +or cupsGetServerPPD. + +

+

cupsLangDefault

+

Return the default language.

+

+cups_lang_t *cupsLangDefault (void);

+

Return Value

+

Language data

+

cupsLangEncoding

+

Return the character encoding (us-ascii, etc.) +for the given language.

+

+const char *cupsLangEncoding (
+    cups_lang_t *lang
+);

+

Parameters

+
+
lang
+
Language data
+
+

Return Value

+

Character encoding

+

cupsLangFlush

+

Flush all language data out of the cache.

+

+void cupsLangFlush (void);

+

cupsLangFree

+

Free language data.

+

+void cupsLangFree (
+    cups_lang_t *lang
+);

+

Parameters

+
+
lang
+
Language to free
+
+

Discussion

+

This does not actually free anything; use cupsLangFlush for that.

+

cupsLangGet

+

Get a language.

+

+cups_lang_t *cupsLangGet (
+    const char *language
+);

+

Parameters

+
+
language
+
Language or locale
+
+

Return Value

+

Language data

+

 CUPS 1.2/Mac OS X 10.5 cupsNotifySubject

+

Return the subject for the given notification message.

+

+char *cupsNotifySubject (
+    cups_lang_t *lang,
+    ipp_t *event
+);

+

Parameters

+
+
lang
+
Language data
+
event
+
Event data
+
+

Return Value

+

Subject string or NULL

+

Discussion

+

The returned string must be freed by the caller using free. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsNotifyText

+

Return the text for the given notification message.

+

+char *cupsNotifyText (
+    cups_lang_t *lang,
+    ipp_t *event
+);

+

Parameters

+
+
lang
+
Language data
+
event
+
Event data
+
+

Return Value

+

Message text or NULL

+

Discussion

+

The returned string must be freed by the caller using free. + +

+

cupsParseOptions

+

Parse options from a command-line argument.

+

+int cupsParseOptions (
+    const char *arg,
+    int num_options,
+    cups_option_t **options
+);

+

Parameters

+
+
arg
+
Argument to parse
+
num_options
+
Number of options
+
options
+
Options found
+
+

Return Value

+

Number of options found

+

Discussion

+

This function converts space-delimited name/value pairs according +to the PAPI text option ABNF specification. Collection values +("name={a=... b=... c=...}") are stored with the curley brackets +intact - use cupsParseOptions on the value to extract the +collection attributes.

+

cupsPrintFile

+

Print a file to a printer or class on the default server.

+

+int cupsPrintFile (
+    const char *name,
+    const char *filename,
+    const char *title,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
name
+
Destination name
+
filename
+
File to print
+
title
+
Title of job
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Job ID or 0 on error

+

 CUPS 1.1.21/Mac OS X 10.4 cupsPrintFile2

+

Print a file to a printer or class on the specified +server.

+

+int cupsPrintFile2 (
+    http_t *http,
+    const char *name,
+    const char *filename,
+    const char *title,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
http
+
Connection to server
+
name
+
Destination name
+
filename
+
File to print
+
title
+
Title of job
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Job ID or 0 on error

+

cupsPrintFiles

+

Print one or more files to a printer or class on the +default server.

+

+int cupsPrintFiles (
+    const char *name,
+    int num_files,
+    const char **files,
+    const char *title,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
name
+
Destination name
+
num_files
+
Number of files
+
files
+
File(s) to print
+
title
+
Title of job
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Job ID or 0 on error

+

 CUPS 1.1.21/Mac OS X 10.4 cupsPrintFiles2

+

Print one or more files to a printer or class on the +specified server.

+

+int cupsPrintFiles2 (
+    http_t *http,
+    const char *name,
+    int num_files,
+    const char **files,
+    const char *title,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
num_files
+
Number of files
+
files
+
File(s) to print
+
title
+
Title of job
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

Job ID or 0 on error

+

 CUPS 1.3/Mac OS X 10.5 cupsRemoveDest

+

Remove a destination from the destination list.

+

+int cupsRemoveDest (
+    const char *name,
+    const char *instance,
+    int num_dests,
+    cups_dest_t **dests
+);

+

Parameters

+
+
name
+
Destination name
+
instance
+
Instance name or NULL
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

Return Value

+

New number of destinations

+

Discussion

+

Removing a destination/instance does not delete the class or printer +queue, merely the lpoptions for that destination/instance. Use the +cupsSetDests or cupsSetDests2 functions to save the new +options for the user. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsRemoveOption

+

Remove an option from an option array.

+

+int cupsRemoveOption (
+    const char *name,
+    int num_options,
+    cups_option_t **options
+);

+

Parameters

+
+
name
+
Option name
+
num_options
+
Current number of options
+
options
+
Options
+
+

Return Value

+

New number of options

+

cupsServer

+

Return the hostname/address of the current server.

+

+const char *cupsServer (void);

+

Return Value

+

Server name

+

Discussion

+

The default server comes from the CUPS_SERVER environment variable, then the +~/.cups/client.conf file, and finally the /etc/cups/client.conf file. If not +set, the default is the local system - either "localhost" or a domain socket +path.
+
+The returned value can be a fully-qualified hostname, a numeric IPv4 or IPv6 +address, or a domain socket pathname.
+
+Note: The current server is tracked separately for each thread in a program. +Multi-threaded programs that override the server via the +cupsSetServer function need to do so in each thread for the same +server to be used.

+

 CUPS 1.5/Mac OS X 10.7 cupsSetClientCertCB

+

Set the client certificate callback.

+

+void cupsSetClientCertCB (
+    cups_client_cert_cb_t cb,
+    void *user_data
+);

+

Parameters

+
+
cb
+
Callback function
+
user_data
+
User data pointer
+
+

Discussion

+

Pass NULL to restore the default callback.
+
+Note: The current certificate callback is tracked separately for each thread +in a program. Multi-threaded programs that override the callback need to do +so in each thread for the same callback to be used. + +

+

 CUPS 1.5/Mac OS X 10.7 cupsSetCredentials

+

Set the default credentials to be used for SSL/TLS +connections.

+

+int cupsSetCredentials (
+    cups_array_t *credentials
+);

+

Parameters

+
+
credentials
+
Array of credentials
+
+

Return Value

+

Status of call (0 = success)

+

Discussion

+

Note: The default credentials are tracked separately for each thread in a +program. Multi-threaded programs that override the setting need to do so in +each thread for the same setting to be used. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsSetDefaultDest

+

Set the default destination.

+

+void cupsSetDefaultDest (
+    const char *name,
+    const char *instance,
+    int num_dests,
+    cups_dest_t *dests
+);

+

Parameters

+
+
name
+
Destination name
+
instance
+
Instance name or NULL
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

cupsSetDests

+

Save the list of destinations for the default server.

+

+void cupsSetDests (
+    int num_dests,
+    cups_dest_t *dests
+);

+

Parameters

+
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

Discussion

+

This function saves the destinations to /etc/cups/lpoptions when run +as root and ~/.cups/lpoptions when run as a normal user.

+

 CUPS 1.1.21/Mac OS X 10.4 cupsSetDests2

+

Save the list of destinations for the specified server.

+

+int cupsSetDests2 (
+    http_t *http,
+    int num_dests,
+    cups_dest_t *dests
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
num_dests
+
Number of destinations
+
dests
+
Destinations
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

This function saves the destinations to /etc/cups/lpoptions when run +as root and ~/.cups/lpoptions when run as a normal user. + +

+

cupsSetEncryption

+

Set the encryption preference.

+

+void cupsSetEncryption (
+    http_encryption_t e
+);

+

Parameters

+
+
e
+
New encryption preference
+
+

Discussion

+

The default encryption setting comes from the CUPS_ENCRYPTION +environment variable, then the ~/.cups/client.conf file, and finally the +/etc/cups/client.conf file. If not set, the default is +HTTP_ENCRYPT_IF_REQUESTED.
+
+Note: The current encryption setting is tracked separately for each thread +in a program. Multi-threaded programs that override the setting need to do +so in each thread for the same setting to be used.

+

cupsSetPasswordCB

+

Set the password callback for CUPS.

+

+void cupsSetPasswordCB (
+    cups_password_cb_t cb
+);

+

Parameters

+
+
cb
+
Callback function
+
+

Discussion

+

Pass NULL to restore the default (console) password callback, which +reads the password from the console. Programs should call either this +function or cupsSetPasswordCB2, as only one callback can be registered +by a program per thread.
+
+Note: The current password callback is tracked separately for each thread +in a program. Multi-threaded programs that override the callback need to do +so in each thread for the same callback to be used.

+

 CUPS 1.4/Mac OS X 10.6 cupsSetPasswordCB2

+

Set the advanced password callback for CUPS.

+

+void cupsSetPasswordCB2 (
+    cups_password_cb2_t cb,
+    void *user_data
+);

+

Parameters

+
+
cb
+
Callback function
+
user_data
+
User data pointer
+
+

Discussion

+

Pass NULL to restore the default (console) password callback, which +reads the password from the console. Programs should call either this +function or cupsSetPasswordCB2, as only one callback can be registered +by a program per thread.
+
+Note: The current password callback is tracked separately for each thread +in a program. Multi-threaded programs that override the callback need to do +so in each thread for the same callback to be used. + +

+

cupsSetServer

+

Set the default server name and port.

+

+void cupsSetServer (
+    const char *server
+);

+

Parameters

+
+
server
+
Server name
+
+

Discussion

+

The "server" string can be a fully-qualified hostname, a numeric +IPv4 or IPv6 address, or a domain socket pathname. Hostnames and numeric IP +addresses can be optionally followed by a colon and port number to override +the default port 631, e.g. "hostname:8631". Pass NULL to restore the +default server name and port.
+
+Note: The current server is tracked separately for each thread in a program. +Multi-threaded programs that override the server need to do so in each +thread for the same server to be used.

+

 CUPS 1.5/Mac OS X 10.7 cupsSetServerCertCB

+

Set the server certificate callback.

+

+void cupsSetServerCertCB (
+    cups_server_cert_cb_t cb,
+    void *user_data
+);

+

Parameters

+
+
cb
+
Callback function
+
user_data
+
User data pointer
+
+

Discussion

+

Pass NULL to restore the default callback.
+
+Note: The current credentials callback is tracked separately for each thread +in a program. Multi-threaded programs that override the callback need to do +so in each thread for the same callback to be used. + +

+

cupsSetUser

+

Set the default user name.

+

+void cupsSetUser (
+    const char *user
+);

+

Parameters

+
+
user
+
User name
+
+

Discussion

+

Pass NULL to restore the default user name.
+
+Note: The current user name is tracked separately for each thread in a +program. Multi-threaded programs that override the user name need to do so +in each thread for the same user name to be used.

+

 CUPS 1.4/Mac OS X 10.6 cupsStartDocument

+

Add a document to a job created with cupsCreateJob().

+

+http_status_t cupsStartDocument (
+    http_t *http,
+    const char *name,
+    int job_id,
+    const char *docname,
+    const char *format,
+    int last_document
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
name
+
Destination name
+
job_id
+
Job ID from cupsCreateJob
+
docname
+
Name of document
+
format
+
MIME type or CUPS_FORMAT_foo
+
last_document
+
1 for last document in job, 0 otherwise
+
+

Return Value

+

HTTP status of request

+

Discussion

+

Use cupsWriteRequestData to write data for the document and +cupsFinishDocument to finish the document and get the submission status.
+
+The MIME type constants CUPS_FORMAT_AUTO, CUPS_FORMAT_PDF, +CUPS_FORMAT_POSTSCRIPT, CUPS_FORMAT_RAW, and +CUPS_FORMAT_TEXT are provided for the "format" argument, although +any supported MIME type string can be supplied. + +

+

cupsTempFd

+

Creates a temporary file.

+

+int cupsTempFd (
+    char *filename,
+    int len
+);

+

Parameters

+
+
filename
+
Pointer to buffer
+
len
+
Size of buffer
+
+

Return Value

+

New file descriptor or -1 on error

+

Discussion

+

The temporary filename is returned in the filename buffer. +The temporary file is opened for reading and writing.

+

 DEPRECATED cupsTempFile

+

Generates a temporary filename.

+

+char *cupsTempFile (
+    char *filename,
+    int len
+);

+

Parameters

+
+
filename
+
Pointer to buffer
+
len
+
Size of buffer
+
+

Return Value

+

Filename or NULL on error

+

Discussion

+

The temporary filename is returned in the filename buffer. +This function is deprecated - use cupsTempFd or +cupsTempFile2 instead. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsTempFile2

+

Creates a temporary CUPS file.

+

+cups_file_t *cupsTempFile2 (
+    char *filename,
+    int len
+);

+

Parameters

+
+
filename
+
Pointer to buffer
+
len
+
Size of buffer
+
+

Return Value

+

CUPS file or NULL on error

+

Discussion

+

The temporary filename is returned in the filename buffer. +The temporary file is opened for writing. + +

+

cupsUser

+

Return the current user's name.

+

+const char *cupsUser (void);

+

Return Value

+

User name

+

Discussion

+

Note: The current user name is tracked separately for each thread in a +program. Multi-threaded programs that override the user name with the +cupsSetUser function need to do so in each thread for the same user +name to be used.

+

Data Types

+

 CUPS 1.5/Mac OS X 10.7 cups_client_cert_cb_t

+

Client credentials callback

+

+typedef int (*cups_client_cert_cb_t)(http_t *http, void *tls, cups_array_t *distinguished_names, void *user_data); +

+

cups_dest_t

+

Destination

+

+typedef struct cups_dest_s cups_dest_t; +

+

 CUPS 1.4/Mac OS X 10.6 cups_device_cb_t

+

Device callback

+

+typedef void (*cups_device_cb_t)(const char *device_class, const char *device_id, const char *device_info, const char *device_make_and_model, const char *device_uri, const char *device_location, void *user_data); +

+

cups_job_t

+

Job

+

+typedef struct cups_job_s cups_job_t; +

+

cups_option_t

+

Printer Options

+

+typedef struct cups_option_s cups_option_t; +

+

 CUPS 1.4/Mac OS X 10.6 cups_password_cb2_t

+

New password callback

+

+typedef const char *(*cups_password_cb2_t)(const char *prompt, http_t *http, const char *method, const char *resource, void *user_data); +

+

cups_password_cb_t

+

Password callback

+

+typedef const char *(*cups_password_cb_t)(const char *prompt); +

+

cups_ptype_t

+

Printer type/capability bits

+

+typedef unsigned cups_ptype_t; +

+

 CUPS 1.5/Mac OS X 10.7 cups_server_cert_cb_t

+

Server credentials callback

+

+typedef int (*cups_server_cert_cb_t)(http_t *http, void *tls, cups_array_t *certs, void *user_data); +

+

Structures

+

cups_dest_s

+

Destination

+

struct cups_dest_s {
+    char *name, *instance;
+    int is_default;
+    int num_options;
+    cups_option_t *options;
+};

+

Members

+
+
instance
+
Local instance name or NULL
+
is_default
+
Is this printer the default?
+
num_options
+
Number of options
+
options
+
Options
+
+

cups_job_s

+

Job

+

struct cups_job_s {
+    time_t completed_time;
+    time_t creation_time;
+    char *dest;
+    char *format;
+    int id;
+    int priority;
+    time_t processing_time;
+    int size;
+    ipp_jstate_t state;
+    char *title;
+    char *user;
+};

+

Members

+
+
completed_time
+
Time the job was completed
+
creation_time
+
Time the job was created
+
dest
+
Printer or class name
+
format
+
Document format
+
id
+
The job ID
+
priority
+
Priority (1-100)
+
processing_time
+
Time the job was processed
+
size
+
Size in kilobytes
+
state
+
Job state
+
title
+
Title/job name
+
user
+
User the submitted the job
+
+

cups_option_s

+

Printer Options

+

struct cups_option_s {
+    char *name;
+    char *value;
+};

+

Members

+
+
name
+
Name of option
+
value
+
Value of option
+
+

Variables

+

CF_RETURNS_RETAINED

+

Get the Apple language identifier associated with a +locale ID.

+

const char *locale) CF_RETURNS_RETAINED;

+

Constants

+

cups_ptype_e

+

Printer type/capability bit constants

+

Constants

+
+
CUPS_PRINTER_AUTHENTICATED  CUPS 1.2/Mac OS X 10.5 
+
Printer requires authentication
+
CUPS_PRINTER_BIND
+
Can bind output
+
CUPS_PRINTER_BW
+
Can do B&W printing
+
CUPS_PRINTER_CLASS
+
Printer class
+
CUPS_PRINTER_COLLATE
+
Can collage copies
+
CUPS_PRINTER_COLOR
+
Can do color printing
+
CUPS_PRINTER_COMMANDS  CUPS 1.2/Mac OS X 10.5 
+
Printer supports maintenance commands
+
CUPS_PRINTER_COPIES
+
Can do copies
+
CUPS_PRINTER_COVER
+
Can cover output
+
CUPS_PRINTER_DEFAULT
+
Default printer on network
+
CUPS_PRINTER_DELETE  CUPS 1.2/Mac OS X 10.5 
+
Delete printer
+
CUPS_PRINTER_DISCOVERED  CUPS 1.3/Mac OS X 10.5 
+
Printer was automatically discovered and added
+
CUPS_PRINTER_DUPLEX
+
Can do duplexing
+
CUPS_PRINTER_FAX
+
Fax queue
+
CUPS_PRINTER_IMPLICIT
+
Implicit class
+
CUPS_PRINTER_LARGE
+
Can do D/E/A1/A0
+
CUPS_PRINTER_LOCAL
+
Local printer or class
+
CUPS_PRINTER_MEDIUM
+
Can do Tabloid/B/C/A3/A2
+
CUPS_PRINTER_MFP  CUPS 1.4/Mac OS X 10.6 
+
Printer with scanning capabilities
+
CUPS_PRINTER_NOT_SHARED  CUPS 1.2/Mac OS X 10.5 
+
Printer is not shared
+
CUPS_PRINTER_PUNCH
+
Can punch output
+
CUPS_PRINTER_REJECTING
+
Printer is rejecting jobs
+
CUPS_PRINTER_REMOTE
+
Remote printer or class
+
CUPS_PRINTER_SCANNER  CUPS 1.4/Mac OS X 10.6 
+
Scanner-only device
+
CUPS_PRINTER_SMALL
+
Can do Letter/Legal/A4
+
CUPS_PRINTER_SORT
+
Can sort output
+
CUPS_PRINTER_STAPLE
+
Can staple output
+
CUPS_PRINTER_VARIABLE
+
Can do variable sizes
+
+
+ + diff --git a/doc/help/api-driver.html b/doc/help/api-driver.html new file mode 100644 index 0000000..1a3ee3a --- /dev/null +++ b/doc/help/api-driver.html @@ -0,0 +1,1156 @@ + + + + + Printer Driver API + + + + + + +
+ + +

Driver API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/driver.h
Library-lcupsdriver
See AlsoProgramming: Introduction to CUPS Programming
+

Contents

+ + + +

Overview

+ +

The driver API provides common dithering, color conversion, and utility +functions for CUPS drivers.

+

Functions

+

cupsCMYKDelete

+

Delete a color separation.

+

+void cupsCMYKDelete (
+    cups_cmyk_t *cmyk
+);

+

Parameters

+
+
cmyk
+
Color separation
+
+

cupsCMYKDoBlack

+

Do a black separation...

+

+void cupsCMYKDoBlack (
+    const cups_cmyk_t *cmyk,
+    const unsigned char *input,
+    short *output,
+    int num_pixels
+);

+

Parameters

+
+
cmyk
+
Color separation
+
input
+
Input grayscale pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsCMYKDoCMYK

+

Do a CMYK separation...

+

+void cupsCMYKDoCMYK (
+    const cups_cmyk_t *cmyk,
+    const unsigned char *input,
+    short *output,
+    int num_pixels
+);

+

Parameters

+
+
cmyk
+
Color separation
+
input
+
Input grayscale pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsCMYKDoGray

+

Do a grayscale separation...

+

+void cupsCMYKDoGray (
+    const cups_cmyk_t *cmyk,
+    const unsigned char *input,
+    short *output,
+    int num_pixels
+);

+

Parameters

+
+
cmyk
+
Color separation
+
input
+
Input grayscale pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsCMYKDoRGB

+

Do an sRGB separation...

+

+void cupsCMYKDoRGB (
+    const cups_cmyk_t *cmyk,
+    const unsigned char *input,
+    short *output,
+    int num_pixels
+);

+

Parameters

+
+
cmyk
+
Color separation
+
input
+
Input grayscale pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsCMYKLoad

+

Load a CMYK color profile from PPD attributes.

+

+cups_cmyk_t *cupsCMYKLoad (
+    ppd_file_t *ppd,
+    const char *colormodel,
+    const char *media,
+    const char *resolution
+);

+

Parameters

+
+
ppd
+
PPD file
+
colormodel
+
ColorModel value
+
media
+
MediaType value
+
resolution
+
Resolution value
+
+

Return Value

+

CMYK color separation

+

cupsCMYKNew

+

Create a new CMYK color separation.

+

+cups_cmyk_t *cupsCMYKNew (
+    int num_channels
+);

+

Parameters

+
+
num_channels
+
Number of color components
+
+

Return Value

+

New CMYK separation or NULL

+

cupsCMYKSetBlack

+

Set the transition range for CMY to black.

+

+void cupsCMYKSetBlack (
+    cups_cmyk_t *cmyk,
+    float lower,
+    float upper
+);

+

Parameters

+
+
cmyk
+
CMYK color separation
+
lower
+
No black ink
+
upper
+
Only black ink
+
+

cupsCMYKSetCurve

+

Set a color transform curve using points.

+

+void cupsCMYKSetCurve (
+    cups_cmyk_t *cmyk,
+    int channel,
+    int num_xypoints,
+    const float *xypoints
+);

+

Parameters

+
+
cmyk
+
CMYK color separation
+
channel
+
Color channel
+
num_xypoints
+
Number of X,Y points
+
xypoints
+
X,Y points
+
+

cupsCMYKSetGamma

+

Set a color transform curve using gamma and density.

+

+void cupsCMYKSetGamma (
+    cups_cmyk_t *cmyk,
+    int channel,
+    float gamval,
+    float density
+);

+

Parameters

+
+
cmyk
+
CMYK color separation
+
channel
+
Ink channel
+
gamval
+
Gamma correction
+
density
+
Maximum density
+
+

cupsCMYKSetInkLimit

+

Set the limit on the amount of ink.

+

+void cupsCMYKSetInkLimit (
+    cups_cmyk_t *cmyk,
+    float limit
+);

+

Parameters

+
+
cmyk
+
CMYK color separation
+
limit
+
Limit of ink
+
+

cupsCMYKSetLtDk

+

Set light/dark ink transforms.

+

+void cupsCMYKSetLtDk (
+    cups_cmyk_t *cmyk,
+    int channel,
+    float light,
+    float dark
+);

+

Parameters

+
+
cmyk
+
CMYK color separation
+
channel
+
Dark ink channel (+1 for light)
+
light
+
Light ink only level
+
dark
+
Dark ink only level
+
+

cupsCheckBytes

+

Check to see if all bytes are zero.

+

+int cupsCheckBytes (
+    const unsigned char *bytes,
+    int length
+);

+

Parameters

+
+
bytes
+
Bytes to check
+
length
+
Number of bytes to check
+
+

Return Value

+

1 if they match

+

cupsCheckValue

+

Check to see if all bytes match the given value.

+

+int cupsCheckValue (
+    const unsigned char *bytes,
+    int length,
+    const unsigned char value
+);

+

Parameters

+
+
bytes
+
Bytes to check
+
length
+
Number of bytes to check
+
value
+
Value to check
+
+

Return Value

+

1 if they match

+

cupsDitherDelete

+

Free a dithering buffer.

+

+void cupsDitherDelete (
+    cups_dither_t *d
+);

+

Parameters

+
+
d
+
Dithering buffer
+
+

Discussion

+

Returns 0 on success, -1 on failure.

+

cupsDitherLine

+

Dither a line of pixels...

+

+void cupsDitherLine (
+    cups_dither_t *d,
+    const cups_lut_t *lut,
+    const short *data,
+    int num_channels,
+    unsigned char *p
+);

+

Parameters

+
+
d
+
Dither data
+
lut
+
Lookup table
+
data
+
Separation data
+
num_channels
+
Number of components
+
p
+
Pixels
+
+

cupsDitherNew

+

Create an error-diffusion dithering buffer.

+

+cups_dither_t *cupsDitherNew (
+    int width
+);

+

Parameters

+
+
width
+
Width of output in pixels
+
+

Return Value

+

New state array

+

cupsFindAttr

+

Find a PPD attribute based on the colormodel, +media, and resolution.

+

+ppd_attr_t *cupsFindAttr (
+    ppd_file_t *ppd,
+    const char *name,
+    const char *colormodel,
+    const char *media,
+    const char *resolution,
+    char *spec,
+    int specsize
+);

+

Parameters

+
+
ppd
+
PPD file
+
name
+
Attribute name
+
colormodel
+
Color model
+
media
+
Media type
+
resolution
+
Resolution
+
spec
+
Final selection string
+
specsize
+
Size of string buffer
+
+

Return Value

+

Matching attribute or NULL

+

cupsLutDelete

+

Free the memory used by a lookup table.

+

+void cupsLutDelete (
+    cups_lut_t *lut
+);

+

Parameters

+
+
lut
+
Lookup table to free
+
+

cupsLutLoad

+

Load a LUT from a PPD file.

+

+cups_lut_t *cupsLutLoad (
+    ppd_file_t *ppd,
+    const char *colormodel,
+    const char *media,
+    const char *resolution,
+    const char *ink
+);

+

Parameters

+
+
ppd
+
PPD file
+
colormodel
+
Color model
+
media
+
Media type
+
resolution
+
Resolution
+
ink
+
Ink name
+
+

Return Value

+

New lookup table

+

cupsLutNew

+

Make a lookup table from a list of pixel values.

+

+cups_lut_t *cupsLutNew (
+    int num_values,
+    const float *values
+);

+

Parameters

+
+
num_values
+
Number of values
+
values
+
Lookup table values
+
+

Return Value

+

New lookup table

+

Discussion

+

Returns a pointer to the lookup table on success, NULL on failure.

+

cupsPackHorizontal

+

Pack pixels horizontally...

+

+void cupsPackHorizontal (
+    const unsigned char *ipixels,
+    unsigned char *obytes,
+    int width,
+    const unsigned char clearto,
+    const int step
+);

+

Parameters

+
+
ipixels
+
Input pixels
+
obytes
+
Output bytes
+
width
+
Number of pixels
+
clearto
+
Initial value of bytes
+
step
+
Step value between pixels
+
+

cupsPackHorizontal2

+

Pack 2-bit pixels horizontally...

+

+void cupsPackHorizontal2 (
+    const unsigned char *ipixels,
+    unsigned char *obytes,
+    int width,
+    const int step
+);

+

Parameters

+
+
ipixels
+
Input pixels
+
obytes
+
Output bytes
+
width
+
Number of pixels
+
step
+
Stepping value
+
+

cupsPackHorizontalBit

+

Pack pixels horizontally by bit...

+

+void cupsPackHorizontalBit (
+    const unsigned char *ipixels,
+    unsigned char *obytes,
+    int width,
+    const unsigned char clearto,
+    const unsigned char bit
+);

+

Parameters

+
+
ipixels
+
Input pixels
+
obytes
+
Output bytes
+
width
+
Number of pixels
+
clearto
+
Initial value of bytes
+
bit
+
Bit to check
+
+

cupsPackVertical

+

Pack pixels vertically...

+

+void cupsPackVertical (
+    const unsigned char *ipixels,
+    unsigned char *obytes,
+    int width,
+    const unsigned char bit,
+    const int step
+);

+

Parameters

+
+
ipixels
+
Input pixels
+
obytes
+
Output bytes
+
width
+
Number of input pixels
+
bit
+
Output bit
+
step
+
Number of bytes between columns
+
+

cupsRGBDelete

+

Delete a color separation.

+

+void cupsRGBDelete (
+    cups_rgb_t *rgbptr
+);

+

Parameters

+
+
rgbptr
+
Color separation
+
+

cupsRGBDoGray

+

Do a grayscale separation...

+

+void cupsRGBDoGray (
+    cups_rgb_t *rgbptr,
+    const unsigned char *input,
+    unsigned char *output,
+    int num_pixels
+);

+

Parameters

+
+
rgbptr
+
Color separation
+
input
+
Input grayscale pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsRGBDoRGB

+

Do a RGB separation...

+

+void cupsRGBDoRGB (
+    cups_rgb_t *rgbptr,
+    const unsigned char *input,
+    unsigned char *output,
+    int num_pixels
+);

+

Parameters

+
+
rgbptr
+
Color separation
+
input
+
Input RGB pixels
+
output
+
Output Device-N pixels
+
num_pixels
+
Number of pixels
+
+

cupsRGBLoad

+

Load a RGB color profile from a PPD file.

+

+cups_rgb_t *cupsRGBLoad (
+    ppd_file_t *ppd,
+    const char *colormodel,
+    const char *media,
+    const char *resolution
+);

+

Parameters

+
+
ppd
+
PPD file
+
colormodel
+
Color model
+
media
+
Media type
+
resolution
+
Resolution
+
+

Return Value

+

New color profile

+

cupsRGBNew

+

Create a new RGB color separation.

+

+cups_rgb_t *cupsRGBNew (
+    int num_samples,
+    cups_sample_t *samples,
+    int cube_size,
+    int num_channels
+);

+

Parameters

+
+
num_samples
+
Number of samples
+
samples
+
Samples
+
cube_size
+
Size of LUT cube
+
num_channels
+
Number of color components
+
+

Return Value

+

New color separation or NULL

+

Data Types

+

cups_cmyk_t

+

Simple CMYK lookup table

+

+typedef struct cups_cmyk_s cups_cmyk_t; +

+

cups_dither_t

+

Dithering State

+

+typedef struct cups_dither_s cups_dither_t; +

+

cups_lut_t

+

Lookup Table for Dithering

+

+typedef struct cups_lut_s cups_lut_t; +

+

cups_rgb_t

+

Color separation lookup table

+

+typedef struct cups_rgb_s cups_rgb_t; +

+

cups_sample_t

+

Color sample point

+

+typedef struct cups_sample_s cups_sample_t; +

+

Structures

+

cups_cmyk_s

+

Simple CMYK lookup table

+

struct cups_cmyk_s {
+    unsigned char black_lut[256];
+    short *channels[CUPS_MAX_CHAN];
+    unsigned char color_lut[256];
+    int ink_limit;
+    int num_channels;
+};

+

Members

+
+
black_lut[256]
+
Black generation LUT
+
channels[CUPS_MAX_CHAN]
+
Lookup tables
+
color_lut[256]
+
Color removal LUT
+
ink_limit
+
Ink limit
+
num_channels
+
Number of components
+
+

cups_dither_s

+

Dithering State

+

struct cups_dither_s {
+    int errors[96];
+    int row;
+    int width;
+};

+

Members

+
+
errors[96]
+
Error values
+
row
+
Current row
+
width
+
Width of buffer
+
+

cups_lut_s

+

Lookup Table for Dithering

+

struct cups_lut_s {
+    int error;
+    short intensity;
+    short pixel;
+};

+

Members

+
+
error
+
Error from desired value
+
intensity
+
Adjusted intensity
+
pixel
+
Output pixel value
+
+

cups_rgb_s

+

Color separation lookup table

+

struct cups_rgb_s {
+    unsigned char black[CUPS_MAX_RGB];
+    int cache_init;
+    unsigned char ****colors;
+    int cube_index[256];
+    int cube_mult[256];
+    int cube_size;
+    int num_channels;
+    unsigned char white[CUPS_MAX_RGB];
+};

+

Members

+
+
black[CUPS_MAX_RGB]
+
Cached black (sRGB = 0,0,0)
+
cache_init
+
Are cached values initialized?
+
colors
+
4-D array of sample values
+
cube_index[256]
+
Index into cube for a given sRGB value
+
cube_mult[256]
+
Multiplier value for a given sRGB value
+
cube_size
+
Size of color cube (2-N) on a side
+
num_channels
+
Number of colors per sample
+
white[CUPS_MAX_RGB]
+
Cached white (sRGB = 255,255,255)
+
+

cups_sample_s

+

Color sample point

+

struct cups_sample_s {
+    unsigned char colors[CUPS_MAX_RGB];
+    unsigned char rgb[3];
+};

+

Members

+
+
colors[CUPS_MAX_RGB]
+
Color values
+
rgb[3]
+
sRGB values
+
+

Variables

+

cups_scmy_lut[256]

+

sRGB gamma lookup table (inverted)

+

extern const unsigned char cups_scmy_lut[256];

+

cups_srgb_lut[256]

+

sRGB gamma lookup table

+

extern const unsigned char cups_srgb_lut[256];

+
+ + diff --git a/doc/help/api-filedir.html b/doc/help/api-filedir.html new file mode 100644 index 0000000..430494a --- /dev/null +++ b/doc/help/api-filedir.html @@ -0,0 +1,995 @@ + + + + + File and Directory APIs + + + + + + +
+ + +

File and Directory APIs

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/file.h
+ cups/dir.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+

Contents

+ + + +

Overview

+ +

The CUPS file and directory APIs provide portable interfaces +for manipulating files and listing files and directories. Unlike +stdio FILE streams, the cupsFile functions +allow you to open more than 256 files at any given time. They +also manage the platform-specific details of locking, large file +support, line endings (CR, LF, or CR LF), and reading and writing +files using Flate ("gzip") compression. Finally, you can also +connect, read from, and write to network connections using the +cupsFile functions.

+ +

The cupsDir functions manage the platform-specific +details of directory access/listing and provide a convenient way +to get both a list of files and the information (permissions, +size, timestamp, etc.) for each of those files.

+

Functions

+

 CUPS 1.2/Mac OS X 10.5 cupsDirClose

+

Close a directory.

+

+void cupsDirClose (
+    cups_dir_t *dp
+);

+

Parameters

+
+
dp
+
Directory pointer
+
+

 CUPS 1.2/Mac OS X 10.5 cupsDirOpen

+

Open a directory.

+

+cups_dir_t *cupsDirOpen (
+    const char *directory
+);

+

Parameters

+
+
directory
+
Directory name
+
+

Return Value

+

Directory pointer or NULL if the directory could not be opened.

+

 CUPS 1.2/Mac OS X 10.5 cupsDirRead

+

Read the next directory entry.

+

+cups_dentry_t *cupsDirRead (
+    cups_dir_t *dp
+);

+

Parameters

+
+
dp
+
Directory pointer
+
+

Return Value

+

Directory entry or NULL when there are no more

+

 CUPS 1.2/Mac OS X 10.5 cupsDirRewind

+

Rewind to the start of the directory.

+

+void cupsDirRewind (
+    cups_dir_t *dp
+);

+

Parameters

+
+
dp
+
Directory pointer
+
+

 CUPS 1.2/Mac OS X 10.5 cupsFileClose

+

Close a CUPS file.

+

+int cupsFileClose (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

0 on success, -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileCompression

+

Return whether a file is compressed.

+

+int cupsFileCompression (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

CUPS_FILE_NONE or CUPS_FILE_GZIP

+

 CUPS 1.2/Mac OS X 10.5 cupsFileEOF

+

Return the end-of-file status.

+

+int cupsFileEOF (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

1 on end of file, 0 otherwise

+

 CUPS 1.2/Mac OS X 10.5 cupsFileFind

+

Find a file using the specified path.

+

+const char *cupsFileFind (
+    const char *filename,
+    const char *path,
+    int executable,
+    char *buffer,
+    int bufsize
+);

+

Parameters

+
+
filename
+
File to find
+
path
+
Colon/semicolon-separated path
+
executable
+
1 = executable files, 0 = any file/dir
+
buffer
+
Filename buffer
+
bufsize
+
Size of filename buffer
+
+

Return Value

+

Full path to file or NULL if not found

+

Discussion

+

This function allows the paths in the path string to be separated by +colons (UNIX standard) or semicolons (Windows standard) and stores the +result in the buffer supplied. If the file cannot be found in any of +the supplied paths, NULL is returned. A NULL path only +matches the current directory. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFileFlush

+

Flush pending output.

+

+int cupsFileFlush (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

0 on success, -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileGetChar

+

Get a single character from a file.

+

+int cupsFileGetChar (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

Character or -1 on end of file

+

 CUPS 1.2/Mac OS X 10.5 cupsFileGetConf

+

Get a line from a configuration file.

+

+char *cupsFileGetConf (
+    cups_file_t *fp,
+    char *buf,
+    size_t buflen,
+    char **value,
+    int *linenum
+);

+

Parameters

+
+
fp
+
CUPS file
+
buf
+
String buffer
+
buflen
+
Size of string buffer
+
value
+
Pointer to value
+
linenum
+
Current line number
+
+

Return Value

+

Line read or NULL on end of file or error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileGetLine

+

Get a CR and/or LF-terminated line that may +contain binary data.

+

+size_t cupsFileGetLine (
+    cups_file_t *fp,
+    char *buf,
+    size_t buflen
+);

+

Parameters

+
+
fp
+
File to read from
+
buf
+
Buffer
+
buflen
+
Size of buffer
+
+

Return Value

+

Number of bytes on line or 0 on end of file

+

Discussion

+

This function differs from cupsFileGets in that the trailing CR +and LF are preserved, as is any binary data on the line. The buffer is +nul-terminated, however you should use the returned length to determine +the number of bytes on the line. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFileGets

+

Get a CR and/or LF-terminated line.

+

+char *cupsFileGets (
+    cups_file_t *fp,
+    char *buf,
+    size_t buflen
+);

+

Parameters

+
+
fp
+
CUPS file
+
buf
+
String buffer
+
buflen
+
Size of string buffer
+
+

Return Value

+

Line read or NULL on end of file or error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileLock

+

Temporarily lock access to a file.

+

+int cupsFileLock (
+    cups_file_t *fp,
+    int block
+);

+

Parameters

+
+
fp
+
CUPS file
+
block
+
1 to wait for the lock, 0 to fail right away
+
+

Return Value

+

0 on success, -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileNumber

+

Return the file descriptor associated with a CUPS file.

+

+int cupsFileNumber (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

File descriptor

+

 CUPS 1.2/Mac OS X 10.5 cupsFileOpen

+

Open a CUPS file.

+

+cups_file_t *cupsFileOpen (
+    const char *filename,
+    const char *mode
+);

+

Parameters

+
+
filename
+
Name of file
+
mode
+
Open mode
+
+

Return Value

+

CUPS file or NULL if the file or socket cannot be opened

+

Discussion

+

The "mode" parameter can be "r" to read, "w" to write, overwriting any +existing file, "a" to append to an existing file or create a new file, +or "s" to open a socket connection.
+
+When opening for writing ("w"), an optional number from 1 to 9 can be +supplied which enables Flate compression of the file. Compression is +not supported for the "a" (append) mode.
+
+When opening a socket connection, the filename is a string of the form +"address:port" or "hostname:port". The socket will make an IPv4 or IPv6 +connection as needed, generally preferring IPv6 connections when there is +a choice. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFileOpenFd

+

Open a CUPS file using a file descriptor.

+

+cups_file_t *cupsFileOpenFd (
+    int fd,
+    const char *mode
+);

+

Parameters

+
+
fd
+
File descriptor
+
mode
+
Open mode
+
+

Return Value

+

CUPS file or NULL if the file could not be opened

+

Discussion

+

The "mode" parameter can be "r" to read, "w" to write, "a" to append, +or "s" to treat the file descriptor as a bidirectional socket connection.
+
+When opening for writing ("w"), an optional number from 1 to 9 can be +supplied which enables Flate compression of the file. Compression is +not supported for the "a" (append) mode. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFilePeekChar

+

Peek at the next character from a file.

+

+int cupsFilePeekChar (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

Character or -1 on end of file

+

 CUPS 1.2/Mac OS X 10.5 cupsFilePrintf

+

Write a formatted string.

+

+int cupsFilePrintf (
+    cups_file_t *fp,
+    const char *format,
+    ...
+);

+

Parameters

+
+
fp
+
CUPS file
+
format
+
Printf-style format string
+
...
+
Additional args as necessary
+
+

Return Value

+

Number of bytes written or -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFilePutChar

+

Write a character.

+

+int cupsFilePutChar (
+    cups_file_t *fp,
+    int c
+);

+

Parameters

+
+
fp
+
CUPS file
+
c
+
Character to write
+
+

Return Value

+

0 on success, -1 on error

+

 CUPS 1.4/Mac OS X 10.6 cupsFilePutConf

+

Write a configuration line.

+

+ssize_t cupsFilePutConf (
+    cups_file_t *fp,
+    const char *directive,
+    const char *value
+);

+

Parameters

+
+
fp
+
CUPS file
+
directive
+
Directive
+
value
+
Value
+
+

Return Value

+

Number of bytes written or -1 on error

+

Discussion

+

This function handles any comment escaping of the value. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFilePuts

+

Write a string.

+

+int cupsFilePuts (
+    cups_file_t *fp,
+    const char *s
+);

+

Parameters

+
+
fp
+
CUPS file
+
s
+
String to write
+
+

Return Value

+

Number of bytes written or -1 on error

+

Discussion

+

Like the fputs function, no newline is appended to the string. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsFileRead

+

Read from a file.

+

+ssize_t cupsFileRead (
+    cups_file_t *fp,
+    char *buf,
+    size_t bytes
+);

+

Parameters

+
+
fp
+
CUPS file
+
buf
+
Buffer
+
bytes
+
Number of bytes to read
+
+

Return Value

+

Number of bytes read or -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileRewind

+

Set the current file position to the beginning of the +file.

+

+off_t cupsFileRewind (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

New file position or -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileSeek

+

Seek in a file.

+

+off_t cupsFileSeek (
+    cups_file_t *fp,
+    off_t pos
+);

+

Parameters

+
+
fp
+
CUPS file
+
pos
+
Position in file
+
+

Return Value

+

New file position or -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileStderr

+

Return a CUPS file associated with stderr.

+

+cups_file_t *cupsFileStderr (void);

+

Return Value

+

CUPS file

+

 CUPS 1.2/Mac OS X 10.5 cupsFileStdin

+

Return a CUPS file associated with stdin.

+

+cups_file_t *cupsFileStdin (void);

+

Return Value

+

CUPS file

+

 CUPS 1.2/Mac OS X 10.5 cupsFileStdout

+

Return a CUPS file associated with stdout.

+

+cups_file_t *cupsFileStdout (void);

+

Return Value

+

CUPS file

+

 CUPS 1.2/Mac OS X 10.5 cupsFileTell

+

Return the current file position.

+

+off_t cupsFileTell (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

File position

+

 CUPS 1.2/Mac OS X 10.5 cupsFileUnlock

+

Unlock access to a file.

+

+int cupsFileUnlock (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
CUPS file
+
+

Return Value

+

0 on success, -1 on error

+

 CUPS 1.2/Mac OS X 10.5 cupsFileWrite

+

Write to a file.

+

+ssize_t cupsFileWrite (
+    cups_file_t *fp,
+    const char *buf,
+    size_t bytes
+);

+

Parameters

+
+
fp
+
CUPS file
+
buf
+
Buffer
+
bytes
+
Number of bytes to write
+
+

Return Value

+

Number of bytes written or -1 on error

+

Data Types

+

cups_dentry_t

+

Directory entry type

+

+typedef struct cups_dentry_s cups_dentry_t; +

+

cups_dir_t

+

Directory type

+

+typedef struct _cups_dir_s cups_dir_t; +

+

cups_file_t

+

CUPS file type

+

+typedef struct _cups_file_s cups_file_t; +

+

Structures

+

cups_dentry_s

+

Directory entry type

+

struct cups_dentry_s {
+    struct stat fileinfo;
+    char filename[260];
+};

+

Members

+
+
fileinfo
+
File information
+
filename[260]
+
File name
+
+
+ + diff --git a/doc/help/api-filter.html b/doc/help/api-filter.html new file mode 100644 index 0000000..3a9d128 --- /dev/null +++ b/doc/help/api-filter.html @@ -0,0 +1,1625 @@ + + + + + Filter and Backend Programming + + + + + + +
+ + +

Filter and Backend Programming

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/backend.h
+ cups/sidechannel.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Programming: PPD API
+ Programming: Raster API
+ Programming: Developing PostScript Printer Drivers
+ Programming: Developing Raster Printer Drivers
+ Specifications: CUPS Design Description
+

Contents

+ + + +

Overview

+ +

Filters (which include printer drivers and port monitors) and backends +are used to convert job files to a printable format and send that data to the +printer itself. All of these programs use a common interface for processing +print jobs and communicating status information to the scheduler. Each is run +with a standard set of command-line arguments:

+ +

+ +
argv[1]
+
The job ID
+ +
argv[2]
+
The user printing the job
+ +
argv[3]
+
The job name/title
+ +
argv[4]
+
The number of copies to print
+ +
argv[5]
+
The options that were provided when the job was submitted
+ +
argv[6]
+
The file to print (first program only)
+
+ +

The scheduler runs one or more of these programs to print any given job. The +first filter reads from the print file and writes to the standard output, while +the remaining filters read from the standard input and write to the standard +output. The backend is the last filter in the chain and writes to the +device.

+ +

Filters are always run as a non-privileged user, typically "lp", with no +connection to the user's desktop. Backends are run either as a non-privileged +user or as root if the file permissions do not allow user or group execution. +The file permissions section talks about this in +more detail.

+ +

Security Considerations

+ +

It is always important to use security programming practices. Filters and +most backends are run as a non-privileged user, so the major security +consideration is resource utilization - filters should not depend on unlimited +amounts of CPU, memory, or disk space, and should protect against conditions +that could lead to excess usage of any resource like infinite loops and +unbounded recursion. In addition, filters must never allow the user to +specify an arbitrary file path to a separator page, template, or other file +used by the filter since that can lead to an unauthorized disclosure of +information. Always treat input as suspect and validate it!

+ +

If you are developing a backend that runs as root, make sure to check for +potential buffer overflows, integer under/overflow conditions, and file +accesses since these can lead to privilege escalations. When writing files, +always validate the file path and never allow a user to determine +where to store a file.

+ +
Note: + +

Never write files to a user's home directory. Aside from the +security implications, CUPS is a network print service and as such the network +user may not be the same as the local user and/or there may not be a local home +directory to write to.

+ +

In addition, some operating systems provide additional security mechanisms +that further limit file system access, even for backends running as root. On +Mac OS X, for example, no backend may write to a user's home directory.

+
+ +

Canceled Jobs and Signal Handling

+ +

The scheduler sends SIGTERM when a printing job is canceled or +held. Filters, backends, and port monitors must catch +SIGTERM and perform any cleanup necessary to produce a valid output +file or return the printer to a known good state. The recommended behavior is to +end the output on the current page, preferably on the current line or object +being printed.

+ +

Filters and backends may also receive SIGPIPE when an upstream or downstream filter/backend exits with a non-zero status. Developers should generally ignore SIGPIPE at the beginning of main() with the following function call:

+ +
+#include <signal.h>>
+
+...
+
+int
+main(int argc, char *argv[])
+{
+  signal(SIGPIPE, SIG_IGN);
+
+  ...
+}
+
+ +

File Permissions

+ +

For security reasons, CUPS will only run filters and backends that are owned +by root and do not have world or group write permissions. The recommended +permissions for filters and backends are 0555 - read and execute but no write. +Backends that must run as root should use permissions of 0500 - read and execute +by root, no access for other users. Write permissions can be enabled for the +root user only.

+ +

To avoid a warning message, the directory containing your filter(s) must also +be owned by root and have world and group write disabled - permissions of 0755 +or 0555 are strongly encouraged.

+ +

Temporary Files

+ +

Temporary files should be created in the directory specified by the +"TMPDIR" environment variable. The +cupsTempFile2 function can be +used to safely create temporary files in this directory.

+ +

Copy Generation

+ +

The argv[4] argument specifies the number of copies to produce +of the input file. In general, you should only generate copies if the +filename argument is supplied. The only exception to this are +filters that produce device-independent PostScript output, since the PostScript +filter pstops is responsible for generating copies of PostScript +files.

+ +

Exit Codes

+ +

Filters must exit with status 0 when they successfully generate print data +or 1 when they encounter an error. Backends can return any of the +cups_backend_t constants.

+ +

Environment Variables

+ +

The following environment variables are defined by the printing system +when running print filters and backends:

+ +
+ +
APPLE_LANGUAGE
+
The Apple language identifier associated with the job + (Mac OS X only).
+ +
CHARSET
+
The job character set, typically "utf-8".
+ +
CLASS
+
When a job is submitted to a printer class, contains the name of + the destination printer class. Otherwise this environment + variable will not be set.
+ +
CONTENT_TYPE
+
The MIME type associated with the file (e.g. + application/postscript).
+ +
CUPS_CACHEDIR
+
The directory where cache files can be stored. Cache files can be + used to retain information between jobs or files in a job.
+ +
CUPS_DATADIR
+
The directory where (read-only) CUPS data files can be found.
+ +
CUPS_FILETYPE
+
The type of file being printed: "job-sheet" for a banner page and + "document" for a regular print file.
+ +
CUPS_SERVERROOT
+
The root directory of the server.
+ +
DEVICE_URI
+
The device-uri associated with the printer.
+ +
FINAL_CONTENT_TYPE
+
The MIME type associated with the printer (e.g. + application/vnd.cups-postscript).
+ +
LANG
+
The language locale associated with the job.
+ +
PPD
+
The full pathname of the PostScript Printer Description (PPD) + file for this printer.
+ +
PRINTER
+
The queue name of the class or printer.
+ +
RIP_CACHE
+
The recommended amount of memory to use for Raster Image + Processors (RIPs).
+ +
TMPDIR
+
The directory where temporary files should be created.
+ +
+ +

Communicating with the Scheduler

+ +

Filters and backends communicate with the scheduler by writing messages +to the standard error file. The scheduler reads messages from all filters in +a job and processes the message based on its prefix. For example, the following +code sets the current printer state message to "Printing page 5":

+ +
+int page = 5;
+
+fprintf(stderr, "INFO: Printing page %d\n", page);
+
+ +

Each message is a single line of text starting with one of the following +prefix strings:

+ +
+ +
ALERT: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "alert" log level.
+ +
ATTR: attribute=value [attribute=value]
+
Sets the named printer or job attribute(s). Typically this is used + to set the marker-colors, marker-high-levels, + marker-levels, marker-low-levels, + marker-message, marker-names, + marker-types, printer-alert, and + printer-alert-description printer attributes. Standard + marker-types values are listed in Table + 1.
+ +
CRIT: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "critical" log + level.
+ +
DEBUG: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "debug" log level.
+ +
DEBUG2: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "debug2" log level.
+ +
EMERG: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "emergency" log + level.
+ +
ERROR: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "error" log level. + Use "ERROR:" messages for non-persistent processing errors.
+ +
INFO: message
+
Sets the printer-state-message attribute. If the current log level + is set to "debug2", also adds the specified message to the current error + log file using the "info" log level.
+ +
NOTICE: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "notice" log level.
+ +
PAGE: page-number #-copies
+
PAGE: total #-pages
+
Adds an entry to the current page log file. The first form adds + #-copies to the job-media-sheets-completed attribute. The second + form sets the job-media-sheets-completed attribute to #-pages.
+ +
PPD: keyword=value [keyword=value ...]
+
Changes or adds keywords to the printer's PPD file. Typically + this is used to update installable options or default media settings + based on the printer configuration.
+ +
STATE: + printer-state-reason [printer-state-reason ...]
+
STATE: - printer-state-reason [printer-state-reason ...]
+
Sets or clears printer-state-reason keywords for the current queue. + Typically this is used to indicate persistent media, ink, toner, and + configuration conditions or errors on a printer. + Table 2 lists the standard state keywords - + use vendor-prefixed ("com.example.foo") keywords for custom states. See + Managing Printer State in a Filter for more + information. + +
WARNING: message
+
Sets the printer-state-message attribute and adds the specified + message to the current error log file using the "warning" log + level.
+ +
+ +

Messages without one of these prefixes are treated as if they began with +the "DEBUG:" prefix string.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Standard marker-types Values
marker-typeDescription
developerDeveloper unit
fuserFuser unit
fuserCleaningPadFuser cleaning pad
fuserOilFuser oil
inkInk supply
opcPhoto conductor
solidWaxWax supply
staplesStaple supply
tonerToner supply
transferUnitTransfer unit
wasteInkWaste ink tank
wasteTonerWaste toner tank
wasteWaxWaste wax tank
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Standard State Keywords
KeywordDescription
connecting-to-deviceConnecting to printer but not printing yet.
cover-openThe printer's cover is open.
input-tray-missingThe paper tray is missing.
marker-supply-emptyThe printer is out of ink.
marker-supply-lowThe printer is almost out of ink.
marker-waste-almost-fullThe printer's waste bin is almost full.
marker-waste-fullThe printer's waste bin is full.
media-emptyThe paper tray (any paper tray) is empty.
media-jamThere is a paper jam.
media-lowThe paper tray (any paper tray) is almost empty.
media-neededThe paper tray needs to be filled (for a job that is printing).
pausedStop the printer.
timed-outUnable to connect to printer.
toner-emptyThe printer is out of toner.
toner-lowThe printer is low on toner.
+ +

Managing Printer State in a Filter

+ +

Filters are responsible for managing the state keywords they set using +"STATE:" messages. Typically you will update all of the keywords that +are used by the filter at startup, for example:

+ +
+if (foo_condition != 0)
+  fputs("STATE: +com.example.foo\n", stderr);
+else
+  fputs("STATE: -com.example.foo\n", stderr);
+
+if (bar_condition != 0)
+  fputs("STATE: +com.example.bar\n", stderr);
+else
+  fputs("STATE: -com.example.bar\n", stderr);
+
+ +

Then as conditions change, your filter sends "STATE: +keyword" or "STATE: +-keyword" messages as necessary to set or clear the corresponding keyword, +respectively.

+ +

State keywords are often used to notify the user of issues that span across +jobs, for example "media-empty-warning" that indicates one or more paper trays +are empty. These keywords should not be cleared unless the corresponding issue +no longer exists.

+ +

Filters should clear job-related keywords on startup and exit so that they +do not remain set between jobs. For example, "connecting-to-device" is a job +sub-state and not an issue that applies when a job is not printing.

+ +
Note: + +

"STATE:" messages often provide visible alerts to the user. For example, +on Mac OS X setting a printer-state-reason value with an "-error" or +"-warning" suffix will cause the printer's dock item to bounce if the +corresponding reason is localized with a cupsIPPReason keyword in the +printer's PPD file.

+ +

When providing a vendor-prefixed keyword, always provide the +corresponding standard keyword (if any) to allow clients to respond to the +condition correctly. For example, if you provide a vendor-prefixed keyword +for a low cyan ink condition ("com.example.cyan-ink-low") you must also set the +"marker-supply-low-warning" keyword. In such cases you should also refrain +from localizing the vendor-prefixed keyword in the PPD file - otherwise both +the generic and vendor-specific keyword will be shown in the user +interface.

+ +
+ +

Reporting Supply Levels

+ +

CUPS tracks several "marker-*" attributes for ink/toner supply level +reporting. These attributes allow applications to display the current supply +levels for a printer without printer-specific software. Table 3 lists the marker attributes and what they represent.

+ +

Filters set marker attributes by sending "ATTR:" messages to stderr. For +example, a filter supporting an inkjet printer with black and tri-color ink +cartridges would use the following to initialize the supply attributes:

+ +
+fputs("ATTR: marker-colors=#000000,#00FFFF#FF00FF#FFFF00\n", stderr);
+fputs("ATTR: marker-low-levels=5,10\n", stderr);
+fputs("ATTR: marker-names=Black,Tri-Color\n", stderr);
+fputs("ATTR: marker-types=ink,ink\n", stderr);
+
+ +

Then periodically the filter queries the printer for its current supply +levels and updates them with a separate "ATTR:" message:

+ +
+int black_level, tri_level;
+...
+fprintf(stderr, "ATTR: marker-levels=%d,%d\n", black_level, tri_level);
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: Supply Level Attributes
AttributeDescription
marker-colorsA list of comma-separated colors; each color is either "none" or one or + more hex-encoded sRGB colors of the form "#RRGGBB".
marker-high-levelsA list of comma-separated "almost full" level values from 0 to 100; a + value of 100 should be used for supplies that are consumed/emptied like ink + cartridges.
marker-levelsA list of comma-separated level values for each supply. A value of -1 + indicates the level is unavailable, -2 indicates unknown, and -3 indicates + the level is unknown but has not yet reached capacity. Values from 0 to 100 + indicate the corresponding percentage.
marker-low-levelsA list of comma-separated "almost empty" level values from 0 to 100; a + value of 0 should be used for supplies that are filled like waste ink + tanks.
marker-messageA human-readable supply status message for the user like "12 pages of + ink remaining."
marker-namesA list of comma-separated supply names like "Cyan Ink", "Fuser", + etc.
marker-typesA list of comma-separated supply types; the types are listed in + Table 1.
+ +

Communicating with the Backend

+ +

Filters can communicate with the backend via the +cupsBackChannelRead and +cupsSideChannelDoRequest +functions. The +cupsBackChannelRead function +reads data that has been sent back from the device and is typically used to +obtain status and configuration information. For example, the following code +polls the backend for back-channel data:

+ +
+#include <cups/cups.h>
+
+char buffer[8192];
+ssize_t bytes;
+
+/* Use a timeout of 0.0 seconds to poll for back-channel data */
+bytes = cupsBackChannelRead(buffer, sizeof(buffer), 0.0);
+
+ +

Filters can also use select() or poll() on the +back-channel file descriptor (3 or CUPS_BC_FD) to read data only +when it is available.

+ +

The +cupsSideChannelDoRequest +function allows you to get out-of-band status information and do synchronization +with the device. For example, the following code gets the current IEEE-1284 +device ID string from the backend:

+ +
+#include <cups/sidechannel.h>
+
+char data[2049];
+int datalen;
+cups_sc_status_t status;
+
+/* Tell cupsSideChannelDoRequest() how big our buffer is, less 1 byte for
+   nul-termination... */
+datalen = sizeof(data) - 1;
+
+/* Get the IEEE-1284 device ID, waiting for up to 1 second */
+status = cupsSideChannelDoRequest(CUPS_SC_CMD_GET_DEVICE_ID, data, &datalen, 1.0);
+
+/* Use the returned value if OK was returned and the length is non-zero */
+if (status == CUPS_SC_STATUS_OK && datalen > 0)
+  data[datalen] = '\0';
+else
+  data[0] = '\0';
+
+ +

Forcing All Output to a Printer

+ +

The +cupsSideChannelDoRequest +function allows you to tell the backend to send all pending data to the printer. +This is most often needed when sending query commands to the printer. For example:

+ +
+#include <cups/cups.h>
+#include <cups/sidechannel.h>
+
+char data[1024];
+int datalen = sizeof(data);
+cups_sc_status_t status;
+
+/* Flush pending output to stdout */
+fflush(stdout);
+
+/* Drain output to backend, waiting for up to 30 seconds */
+status = cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, data, &datalen, 30.0);
+
+/* Read the response if the output was sent */
+if (status == CUPS_SC_STATUS_OK)
+{
+  ssize_t bytes;
+
+  /* Wait up to 10.0 seconds for back-channel data */
+  bytes = cupsBackChannelRead(data, sizeof(data), 10.0);
+  /* do something with the data from the printer */
+}
+
+ +

Communicating with Filters

+ +

Backends communicate with filters using the reciprocal functions +cupsBackChannelWrite, +cupsSideChannelRead, and +cupsSideChannelWrite. We +recommend writing back-channel data using a timeout of 1.0 seconds:

+ +
+#include <cups/cups.h>
+
+char buffer[8192];
+ssize_t bytes;
+
+/* Obtain data from printer/device */
+...
+
+/* Use a timeout of 1.0 seconds to give filters a chance to read */
+cupsBackChannelWrite(buffer, bytes, 1.0);
+
+ +

The cupsSideChannelRead +function reads a side-channel command from a filter, driver, or port monitor. +Backends can either poll for commands using a timeout of 0.0, wait +indefinitely for commands using a timeout of -1.0 (probably in a +separate thread for that purpose), or use select or +poll on the CUPS_SC_FD file descriptor (4) to handle +input and output on several file descriptors at the same time.

+ +

Once a command is processed, the backend uses the +cupsSideChannelWrite function +to send its response. For example, the following code shows how to poll for a +side-channel command and respond to it:

+ +
+#include <cups/sidechannel.h>
+
+cups_sc_command_t command;
+cups_sc_status_t status;
+char data[2048];
+int datalen = sizeof(data);
+
+/* Poll for a command... */
+if (!cupsSideChannelRead(&command, &status, data, &datalen, 0.0))
+{
+  switch (command)
+  {
+    /* handle supported commands, fill data/datalen/status with values as needed */
+
+    default :
+        status  = CUPS_SC_STATUS_NOT_IMPLEMENTED;
+	datalen = 0;
+	break;
+  }
+
+  /* Send a response... */
+  cupsSideChannelWrite(command, status, data, datalen, 1.0);
+}
+
+ +

Doing SNMP Queries with Network Printers

+ +

The Simple Network Management Protocol (SNMP) allows you to get the current +status, page counter, and supply levels from most network printers. Every +piece of information is associated with an Object Identifier (OID), and +every printer has a community name associated with it. OIDs can be +queried directly or by "walking" over a range of OIDs with a common prefix.

+ +

The two CUPS SNMP functions provide a simple API for querying network +printers through the side-channel interface. Each accepts a string containing +an OID like ".1.3.6.1.2.1.43.10.2.1.4.1.1" (the standard page counter OID) +along with a timeout for the query.

+ +

The cupsSideChannelSNMPGet +function queries a single OID and returns the value as a string in a buffer +you supply:

+ +
+#include <cups/sidechannel.h>
+
+char data[512];
+int datalen = sizeof(data);
+
+if (cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", data, &datalen, 5.0)
+        == CUPS_SC_STATUS_OK)
+{
+  /* Do something with the value */
+  printf("Page counter is: %s\n", data);
+}
+
+ +

The +cupsSideChannelSNMPWalk +function allows you to query a whole group of OIDs, calling a function of your +choice for each OID that is found:

+ +
+#include <cups/sidechannel.h>
+
+void
+my_callback(const char *oid, const char *data, int datalen, void *context)
+{
+  /* Do something with the value */
+  printf("%s=%s\n", oid, data);
+}
+
+...
+
+void *my_data;
+
+cupsSNMPSideChannelWalk(".1.3.6.1.2.1.43", 5.0, my_callback, my_data);
+
+

Functions

+

 CUPS 1.2/Mac OS X 10.5 cupsBackChannelRead

+

Read data from the backchannel.

+

+ssize_t cupsBackChannelRead (
+    char *buffer,
+    size_t bytes,
+    double timeout
+);

+

Parameters

+
+
buffer
+
Buffer to read into
+
bytes
+
Bytes to read
+
timeout
+
Timeout in seconds, typically 0.0 to poll
+
+

Return Value

+

Bytes read or -1 on error

+

Discussion

+

Reads up to "bytes" bytes from the backchannel/backend. The "timeout" +parameter controls how many seconds to wait for the data - use 0.0 to +return immediately if there is no data, -1.0 to wait for data indefinitely. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsBackChannelWrite

+

Write data to the backchannel.

+

+ssize_t cupsBackChannelWrite (
+    const char *buffer,
+    size_t bytes,
+    double timeout
+);

+

Parameters

+
+
buffer
+
Buffer to write
+
bytes
+
Bytes to write
+
timeout
+
Timeout in seconds, typically 1.0
+
+

Return Value

+

Bytes written or -1 on error

+

Discussion

+

Writes "bytes" bytes to the backchannel/filter. The "timeout" parameter +controls how many seconds to wait for the data to be written - use +0.0 to return immediately if the data cannot be written, -1.0 to wait +indefinitely. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsBackendDeviceURI

+

Get the device URI for a backend.

+

+const char *cupsBackendDeviceURI (
+    char **argv
+);

+

Parameters

+
+
argv
+
Command-line arguments
+
+

Return Value

+

Device URI or NULL

+

Discussion

+

The "argv" argument is the argv argument passed to main(). This +function returns the device URI passed in the DEVICE_URI environment +variable or the device URI passed in argv[0], whichever is found +first. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsBackendReport

+

Write a device line from a backend.

+

+void cupsBackendReport (
+    const char *device_scheme,
+    const char *device_uri,
+    const char *device_make_and_model,
+    const char *device_info,
+    const char *device_id,
+    const char *device_location
+);

+

Parameters

+
+
device_scheme
+
device-scheme string
+
device_uri
+
device-uri string
+
device_make_and_model
+
device-make-and-model string or NULL
+
device_info
+
device-info string or NULL
+
device_id
+
device-id string or NULL
+
device_location
+
device-location string or NULL
+
+

Discussion

+

This function writes a single device line to stdout for a backend. +It handles quoting of special characters in the device-make-and-model, +device-info, device-id, and device-location strings. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsSideChannelDoRequest

+

Send a side-channel command to a backend and wait for a response.

+

+cups_sc_status_t cupsSideChannelDoRequest (
+    cups_sc_command_t command,
+    char *data,
+    int *datalen,
+    double timeout
+);

+

Parameters

+
+
command
+
Command to send
+
data
+
Response data buffer pointer
+
datalen
+
Size of data buffer on entry, number of bytes in buffer on return
+
timeout
+
Timeout in seconds
+
+

Return Value

+

Status of command

+

Discussion

+

This function is normally only called by filters, drivers, or port +monitors in order to communicate with the backend used by the current +printer. Programs must be prepared to handle timeout or "not +implemented" status codes, which indicate that the backend or device +do not support the specified side-channel command.
+
+The "datalen" parameter must be initialized to the size of the buffer +pointed to by the "data" parameter. cupsSideChannelDoRequest() will +update the value to contain the number of data bytes in the buffer. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsSideChannelRead

+

Read a side-channel message.

+

+int cupsSideChannelRead (
+    cups_sc_command_t *command,
+    cups_sc_status_t *status,
+    char *data,
+    int *datalen,
+    double timeout
+);

+

Parameters

+
+
command
+
Command code
+
status
+
Status code
+
data
+
Data buffer pointer
+
datalen
+
Size of data buffer on entry, number of bytes in buffer on return
+
timeout
+
Timeout in seconds
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

This function is normally only called by backend programs to read +commands from a filter, driver, or port monitor program. The +caller must be prepared to handle incomplete or invalid messages +and return the corresponding status codes.
+
+The "datalen" parameter must be initialized to the size of the buffer +pointed to by the "data" parameter. cupsSideChannelDoRequest() will +update the value to contain the number of data bytes in the buffer. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsSideChannelSNMPGet

+

Query a SNMP OID's value.

+

+cups_sc_status_t cupsSideChannelSNMPGet (
+    const char *oid,
+    char *data,
+    int *datalen,
+    double timeout
+);

+

Parameters

+
+
oid
+
OID to query
+
data
+
Buffer for OID value
+
datalen
+
Size of OID buffer on entry, size of value on return
+
timeout
+
Timeout in seconds
+
+

Return Value

+

Query status

+

Discussion

+

This function asks the backend to do a SNMP OID query on behalf of the +filter, port monitor, or backend using the default community name.
+
+"oid" contains a numeric OID consisting of integers separated by periods, +for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not +supported and must be converted to their numeric forms.
+
+On input, "data" and "datalen" provide the location and size of the +buffer to hold the OID value as a string. HEX-String (binary) values are +converted to hexadecimal strings representing the binary data, while +NULL-Value and unknown OID types are returned as the empty string. +The returned "datalen" does not include the trailing nul. + +CUPS_SC_STATUS_NOT_IMPLEMENTED is returned by backends that do not +support SNMP queries. CUPS_SC_STATUS_NO_RESPONSE is returned when +the printer does not respond to the SNMP query. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsSideChannelSNMPWalk

+

Query multiple SNMP OID values.

+

+cups_sc_status_t cupsSideChannelSNMPWalk (
+    const char *oid,
+    double timeout,
+    cups_sc_walk_func_t cb,
+    void *context
+);

+

Parameters

+
+
oid
+
First numeric OID to query
+
timeout
+
Timeout for each query in seconds
+
cb
+
Function to call with each value
+
context
+
Application-defined pointer to send to callback
+
+

Return Value

+

Status of first query of CUPS_SC_STATUS_OK on success

+

Discussion

+

This function asks the backend to do multiple SNMP OID queries on behalf +of the filter, port monitor, or backend using the default community name. +All OIDs under the "parent" OID are queried and the results are sent to +the callback function you provide.
+
+"oid" contains a numeric OID consisting of integers separated by periods, +for example ".1.3.6.1.2.1.43". Symbolic names from SNMP MIBs are not +supported and must be converted to their numeric forms.
+
+"timeout" specifies the timeout for each OID query. The total amount of +time will depend on the number of OID values found and the time required +for each query.
+
+"cb" provides a function to call for every value that is found. "context" +is an application-defined pointer that is sent to the callback function +along with the OID and current data. The data passed to the callback is the +same as returned by cupsSideChannelSNMPGet. + +CUPS_SC_STATUS_NOT_IMPLEMENTED is returned by backends that do not +support SNMP queries. CUPS_SC_STATUS_NO_RESPONSE is returned when +the printer does not respond to the first SNMP query. + +

+

 CUPS 1.3/Mac OS X 10.5 cupsSideChannelWrite

+

Write a side-channel message.

+

+int cupsSideChannelWrite (
+    cups_sc_command_t command,
+    cups_sc_status_t status,
+    const char *data,
+    int datalen,
+    double timeout
+);

+

Parameters

+
+
command
+
Command code
+
status
+
Status code
+
data
+
Data buffer pointer
+
datalen
+
Number of bytes of data
+
timeout
+
Timeout in seconds
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

This function is normally only called by backend programs to send +responses to a filter, driver, or port monitor program. + +

+

Data Types

+

cups_backend_t

+

Backend exit codes

+

+typedef enum cups_backend_e cups_backend_t; +

+

cups_sc_bidi_t

+

Bidirectional capabilities

+

+typedef enum cups_sc_bidi_e cups_sc_bidi_t; +

+

cups_sc_command_t

+

Request command codes

+

+typedef enum cups_sc_command_e cups_sc_command_t; +

+

cups_sc_connected_t

+

Connectivity values

+

+typedef enum cups_sc_connected_e cups_sc_connected_t; +

+

cups_sc_state_t

+

Printer state bits

+

+typedef enum cups_sc_state_e cups_sc_state_t; +

+

cups_sc_status_t

+

Response status codes

+

+typedef enum cups_sc_status_e cups_sc_status_t; +

+

cups_sc_walk_func_t

+

SNMP walk callback

+

+typedef void (*cups_sc_walk_func_t)(const char *oid, const char *data, int datalen, void *context); +

+

Constants

+

cups_backend_e

+

Backend exit codes

+

Constants

+
+
CUPS_BACKEND_AUTH_REQUIRED
+
Job failed, authentication required
+
CUPS_BACKEND_CANCEL
+
Job failed, cancel job
+
CUPS_BACKEND_FAILED
+
Job failed, use error-policy
+
CUPS_BACKEND_HOLD
+
Job failed, hold job
+
CUPS_BACKEND_OK
+
Job completed successfully
+
CUPS_BACKEND_RETRY
+
Job failed, retry this job later
+
CUPS_BACKEND_RETRY_CURRENT
+
Job failed, retry this job immediately
+
CUPS_BACKEND_STOP
+
Job failed, stop queue
+
+

cups_sc_bidi_e

+

Bidirectional capability values

+

Constants

+
+
CUPS_SC_BIDI_NOT_SUPPORTED
+
Bidirectional I/O is not supported
+
CUPS_SC_BIDI_SUPPORTED
+
Bidirectional I/O is supported
+
+

cups_sc_command_e

+

Request command codes

+

Constants

+
+
CUPS_SC_CMD_DRAIN_OUTPUT
+
Drain all pending output
+
CUPS_SC_CMD_GET_BIDI
+
Return bidirectional capabilities
+
CUPS_SC_CMD_GET_CONNECTED  CUPS 1.5/Mac OS X 10.7 
+
Return whether the backend is "connected" to the printer
+
CUPS_SC_CMD_GET_DEVICE_ID
+
Return the IEEE-1284 device ID
+
CUPS_SC_CMD_GET_STATE
+
Return the device state
+
CUPS_SC_CMD_SNMP_GET  CUPS 1.4/Mac OS X 10.6 
+
Query an SNMP OID
+
CUPS_SC_CMD_SNMP_GET_NEXT  CUPS 1.4/Mac OS X 10.6 
+
Query the next SNMP OID
+
CUPS_SC_CMD_SOFT_RESET
+
Do a soft reset
+
+

cups_sc_connected_e

+

Connectivity values

+

Constants

+
+
CUPS_SC_CONNECTED
+
Backend is "connected" to printer
+
CUPS_SC_NOT_CONNECTED
+
Backend is not "connected" to printer
+
+

cups_sc_state_e

+

Printer state bits

+

Constants

+
+
CUPS_SC_STATE_BUSY
+
Device is busy
+
CUPS_SC_STATE_ERROR
+
Other error condition
+
CUPS_SC_STATE_MARKER_EMPTY
+
Toner/ink out condition
+
CUPS_SC_STATE_MARKER_LOW
+
Toner/ink low condition
+
CUPS_SC_STATE_MEDIA_EMPTY
+
Paper out condition
+
CUPS_SC_STATE_MEDIA_LOW
+
Paper low condition
+
CUPS_SC_STATE_OFFLINE
+
Device is offline
+
CUPS_SC_STATE_ONLINE
+
Device is online
+
+

cups_sc_status_e

+

Response status codes

+

Constants

+
+
CUPS_SC_STATUS_BAD_MESSAGE
+
The command/response message was invalid
+
CUPS_SC_STATUS_IO_ERROR
+
An I/O error occurred
+
CUPS_SC_STATUS_NONE
+
No status
+
CUPS_SC_STATUS_NOT_IMPLEMENTED
+
Command not implemented
+
CUPS_SC_STATUS_NO_RESPONSE
+
The device did not respond
+
CUPS_SC_STATUS_OK
+
Operation succeeded
+
CUPS_SC_STATUS_TIMEOUT
+
The backend did not respond
+
CUPS_SC_STATUS_TOO_BIG
+
Response too big
+
+
+ + diff --git a/doc/help/api-httpipp.html b/doc/help/api-httpipp.html new file mode 100644 index 0000000..38a3e3f --- /dev/null +++ b/doc/help/api-httpipp.html @@ -0,0 +1,4377 @@ + + + + + HTTP and IPP APIs + + + + + + +
+ + +

HTTP and IPP APIs

+ +
+ + + + + + + + + + + + + + + + +
Headercups/cups.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ References: CUPS Implementation of IPP
+

Contents

+ + + +

Overview

+ +

The CUPS HTTP and IPP APIs provide low-level access to the HTTP and IPP +protocols and CUPS scheduler. They are typically used by monitoring and +administration programs to perform specific functions not supported by the +high-level CUPS API functions.

+ +

The HTTP APIs use an opaque structure called +http_t to manage connections to +a particular HTTP or IPP server. The +httpConnectEncrypt function is +used to create an instance of this structure for a particular server. +The constant CUPS_HTTP_DEFAULT can be used with all of the +cups functions to refer to the default CUPS server - the functions +create a per-thread http_t as needed.

+ +

The IPP APIs use two structures for requests (messages sent to the CUPS +scheduler) and responses (messages sent back to your application from the +scheduler). The ipp_t structure holds a +complete request or response and is allocated using the +ippNew or +ippNewRequest functions and +freed using the ippDelete function.

+ +

The second structure is called +ipp_attribute_t and holds a +single IPP attribute which consists of a group tag (group_tag), a +value type tag (value_tag), the attribute name (name), +and 1 or more values (values[]). Attributes are added to an +ipp_t structure using one of the +ippAdd functions. For example, use +ippAddString to add a +"requesting-user-name" string attribute to a request:

+ +
+ipp_t *request = ippNewRequest(IPP_GET_JOBS);
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+             NULL, cupsUser());
+
+ +

Once you have created an IPP request, use the cups +functions to send the request to and read the response from the server. +For example, the cupsDoRequest +function can be used for simple query operations that do not involve files:

+ +
+#include <cups/cups.h>
+
+
+ipp_t *get_jobs(void)
+{
+  ipp_t *request = ippNewRequest(IPP_GET_JOBS);
+
+  ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+               NULL, cupsUser());
+
+  return (cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/"));
+}
+
+ +

The cupsDoRequest function frees +the request structure and returns an IPP response structure or NULL pointer if +the request could not be sent to the server. Once you have a response from +the server, you can either use the +ippFindAttribute and +ippFindNextAttribute functions +to find specific attributes, for example:

+ +
+ipp_t *response;
+ipp_attribute_t *attr;
+
+attr = ippFindAttribute(response, "printer-state", IPP_TAG_ENUM);
+
+ +

You can also walk the list of attributes with a simple for loop +like this:

+ +
+ipp_t *response;
+ipp_attribute_t *attr;
+
+for (attr = response->attrs; attr != NULL; attr = attr->next)
+  if (attr->name == NULL)
+    puts("--SEPARATOR--");
+  else
+    puts(attr->name);
+
+ +

The for loop approach is normally used when collecting +attributes for multiple objects (jobs, printers, etc.) in a response. Attributes +with NULL names indicate a separator between the attributes of +each object. For example, the following code will list the jobs returned from +our previous get_jobs example code:

+ +
+ipp_t *response = get_jobs();
+
+if (response != NULL)
+{
+  ipp_attribute_t *attr;
+  int job_id = 0;
+  char *job_name = NULL;
+  char *job_originating_user_name = NULL;
+
+  puts("Job ID  Owner             Title");
+  puts("------  ----------------  ---------------------------------");
+
+  for (attr = response->attrs; attr != NULL; attr = attr->next)
+  {
+   /* Attributes without names are separators between jobs */
+    if (attr->name == NULL)
+    {
+      if (job_id > 0 && job_name != NULL && job_originating_user_name != NULL)
+        printf("%5d  %-16s  %s\n", job_id, job_originating_user_name, job_name);
+
+      job_id = 0;
+      job_name = NULL;
+      job_originating_user_name = NULL;
+      continue;
+    }
+    else if (!strcmp(attr->name, "job-id") && attr->value_tag == IPP_TAG_INTEGER)
+      job_id = attr->values[0].integer;
+    else if (!strcmp(attr->name, "job-name") && attr->value_tag == IPP_TAG_NAME)
+      job_name = attr->values[0].string.text;
+    else if (!strcmp(attr->name, "job-originating-user-name") &&
+             attr->value_tag == IPP_TAG_NAME)
+      job_originating_user_name = attr->values[0].string.text;
+  }
+
+  if (job_id > 0 && job_name != NULL && job_originating_user_name != NULL)
+    printf("%5d  %-16s  %s\n", job_id, job_originating_user_name, job_name);
+}
+
+ +

Creating URI Strings

+ +

To ensure proper encoding, the +httpAssembleURIf function must be +used to format a "printer-uri" string for all printer-based requests:

+ +
+const char *name = "Foo";
+char uri[1024];
+ipp_t *request;
+
+httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
+                 ippPort(), "/printers/%s", name);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+
+ +

Sending Requests with Files

+ +

The cupsDoFileRequest and +cupsDoIORequest functions are +used for requests involving files. The +cupsDoFileRequest function +attaches the named file to a request and is typically used when sending a print +file or changing a printer's PPD file:

+ +
+const char *filename = "/usr/share/cups/data/testprint.ps";
+const char *name = "Foo";
+char uri[1024];
+char resource[1024];
+ipp_t *request = ippNewRequest(IPP_PRINT_JOB);
+ipp_t *response;
+
+/* Use httpAssembleURIf for the printer-uri string */
+httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, cupsServer(),
+                 ippPort(), "/printers/%s", name);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, uri);
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
+             NULL, cupsUser());
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name",
+             NULL, "testprint.ps");
+
+/* Use snprintf for the resource path */
+snprintf(resource, sizeof(resource), "/printers/%s", name);
+
+response = cupsDoFileRequest(CUPS_HTTP_DEFAULT, request, resource, filename);
+
+ +

The cupsDoIORequest function +optionally attaches a file to the request and optionally saves a file in the +response from the server. It is used when using a pipe for the request +attachment or when using a request that returns a file, currently only +CUPS_GET_DOCUMENT and CUPS_GET_PPD. For example, +the following code will download the PPD file for the sample HP LaserJet +printer driver:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+response = cupsDoIORequest(CUPS_HTTP_DEFAULT, request, "/", -1, tempfd);
+
+ +

The example passes -1 for the input file descriptor to specify +that no file is to be attached to the request. The PPD file attached to the +response is written to the temporary file descriptor we created using the +cupsTempFd function.

+ +

Asynchronous Request Processing

+ +

The cupsSendRequest and +cupsGetResponse support +asynchronous communications with the server. Unlike the other request +functions, the IPP request is not automatically freed, so remember to +free your request with the ippDelete +function.

+ +

File data is attached to the request using the +cupsWriteRequestData +function, while file data returned from the server is read using the +cupsReadResponseData +function. We can rewrite the previous CUPS_GET_PPD example +to use the asynchronous functions quite easily:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+if (cupsSendRequest(CUPS_HTTP_DEFAULT, request, "/") == HTTP_CONTINUE)
+{
+  response = cupsGetResponse(CUPS_HTTP_DEFAULT, "/");
+
+  if (response != NULL)
+  {
+    ssize_t bytes;
+    char buffer[8192];
+
+    while ((bytes = cupsReadResponseData(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
+      write(tempfd, buffer, bytes);
+  }
+}
+
+/* Free the request! */
+ippDelete(request);
+
+ +

The cupsSendRequest function +returns the initial HTTP request status, typically either +HTTP_CONTINUE or HTTP_UNAUTHORIZED. The latter status +is returned when the request requires authentication of some sort. The +cupsDoAuthentication function +must be called when your see HTTP_UNAUTHORIZED and the request +re-sent. We can add authentication support to our example code by using a +do ... while loop:

+ +
+char tempfile[1024];
+int tempfd;
+ipp_t *request = ippNewRequest(CUPS_GET_PPD);
+ipp_t *response;
+http_status_t status;
+
+ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "ppd-name",
+             NULL, "laserjet.ppd");
+
+tempfd = cupsTempFd(tempfile, sizeof(tempfile));
+
+/* Loop for authentication */
+do
+{
+  status = cupsSendRequest(CUPS_HTTP_DEFAULT, request, "/");
+
+  if (status == HTTP_UNAUTHORIZED)
+  {
+    /* Try to authenticate, break out of the loop if that fails */
+    if (cupsDoAuthentication(CUPS_HTTP_DEFAULT, "POST", "/"))
+      break;
+  }
+}
+while (status != HTTP_CONTINUE && status != HTTP_UNAUTHORIZED);
+
+if (status == HTTP_CONTINUE)
+{
+  response = cupsGetResponse(CUPS_HTTP_DEFAULT, "/");
+
+  if (response != NULL)
+  {
+    ssize_t bytes;
+    char buffer[8192];
+
+    while ((bytes = cupsReadResponseData(CUPS_HTTP_DEFAULT, buffer, sizeof(buffer))) > 0)
+      write(tempfd, buffer, bytes);
+  }
+}
+
+/* Free the request! */
+ippDelete(request);
+
+

Functions

+

 CUPS 1.1.20/Mac OS X 10.4 cupsDoAuthentication

+

Authenticate a request.

+

+int cupsDoAuthentication (
+    http_t *http,
+    const char *method,
+    const char *resource
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
method
+
Request method ("GET", "POST", "PUT")
+
resource
+
Resource path
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

This function should be called in response to a HTTP_UNAUTHORIZED +status, prior to resubmitting your request. + +

+

cupsDoFileRequest

+

Do an IPP request with a file.

+

+ipp_t *cupsDoFileRequest (
+    http_t *http,
+    ipp_t *request,
+    const char *resource,
+    const char *filename
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
request
+
IPP request
+
resource
+
HTTP resource for POST
+
filename
+
File to send or NULL for none
+
+

Return Value

+

Response data

+

Discussion

+

This function sends the IPP request to the specified server, retrying +and authenticating as necessary. The request is freed with ippDelete +after receiving a valid IPP response.

+

 CUPS 1.3/Mac OS X 10.5 cupsDoIORequest

+

Do an IPP request with file descriptors.

+

+ipp_t *cupsDoIORequest (
+    http_t *http,
+    ipp_t *request,
+    const char *resource,
+    int infile,
+    int outfile
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
request
+
IPP request
+
resource
+
HTTP resource for POST
+
infile
+
File to read from or -1 for none
+
outfile
+
File to write to or -1 for none
+
+

Return Value

+

Response data

+

Discussion

+

This function sends the IPP request to the specified server, retrying +and authenticating as necessary. The request is freed with ippDelete() +after receiving a valid IPP response.
+
+If "infile" is a valid file descriptor, cupsDoIORequest() copies +all of the data from the file after the IPP request message.
+
+If "outfile" is a valid file descriptor, cupsDoIORequest() copies +all of the data after the IPP response message to the file. + +

+

cupsDoRequest

+

Do an IPP request.

+

+ipp_t *cupsDoRequest (
+    http_t *http,
+    ipp_t *request,
+    const char *resource
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
request
+
IPP request
+
resource
+
HTTP resource for POST
+
+

Return Value

+

Response data

+

Discussion

+

This function sends the IPP request to the specified server, retrying +and authenticating as necessary. The request is freed with ippDelete() +after receiving a valid IPP response.

+

cupsEncodeOptions

+

Encode printer options into IPP attributes.

+

+void cupsEncodeOptions (
+    ipp_t *ipp,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
ipp
+
Request to add to
+
num_options
+
Number of options
+
options
+
Options
+
+

Discussion

+

This function adds operation, job, and then subscription attributes, +in that order. Use the cupsEncodeOptions2() function to add attributes +for a single group.

+

 CUPS 1.2/Mac OS X 10.5 cupsEncodeOptions2

+

Encode printer options into IPP attributes for a group.

+

+void cupsEncodeOptions2 (
+    ipp_t *ipp,
+    int num_options,
+    cups_option_t *options,
+    ipp_tag_t group_tag
+);

+

Parameters

+
+
ipp
+
Request to add to
+
num_options
+
Number of options
+
options
+
Options
+
group_tag
+
Group to encode
+
+

Discussion

+

This function only adds attributes for a single group. Call this +function multiple times for each group, or use cupsEncodeOptions() +to add the standard groups. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsGetDevices

+

Get available printer devices.

+

+ipp_status_t cupsGetDevices (
+    http_t *http,
+    int timeout,
+    const char *include_schemes,
+    const char *exclude_schemes,
+    cups_device_cb_t callback,
+    void *user_data
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
timeout
+
Timeout in seconds or CUPS_TIMEOUT_DEFAULT
+
include_schemes
+
Comma-separated URI schemes to include or CUPS_INCLUDE_ALL
+
exclude_schemes
+
Comma-separated URI schemes to exclude or CUPS_EXCLUDE_NONE
+
callback
+
Callback function
+
user_data
+
User data pointer
+
+

Return Value

+

Request status - IPP_OK on success.

+

Discussion

+

This function sends a CUPS-Get-Devices request and streams the discovered +devices to the specified callback function. The "timeout" parameter controls +how long the request lasts, while the "include_schemes" and "exclude_schemes" +parameters provide comma-delimited lists of backends to include or omit from +the request respectively. + +

+

 CUPS 1.1.20/Mac OS X 10.4 cupsGetFd

+

Get a file from the server.

+

+http_status_t cupsGetFd (
+    http_t *http,
+    const char *resource,
+    int fd
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
resource
+
Resource name
+
fd
+
File descriptor
+
+

Return Value

+

HTTP status

+

Discussion

+

This function returns HTTP_OK when the file is successfully retrieved. + +

+

 CUPS 1.1.20/Mac OS X 10.4 cupsGetFile

+

Get a file from the server.

+

+http_status_t cupsGetFile (
+    http_t *http,
+    const char *resource,
+    const char *filename
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
resource
+
Resource name
+
filename
+
Filename
+
+

Return Value

+

HTTP status

+

Discussion

+

This function returns HTTP_OK when the file is successfully retrieved. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsGetResponse

+

Get a response to an IPP request.

+

+ipp_t *cupsGetResponse (
+    http_t *http,
+    const char *resource
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
resource
+
HTTP resource for POST
+
+

Return Value

+

Response or NULL on HTTP error

+

Discussion

+

Use this function to get the response for an IPP request sent using +cupsSendDocument() or cupsSendRequest(). For requests that return +additional data, use httpRead() after getting a successful response. + +

+

cupsLastError

+

Return the last IPP status code.

+

+ipp_status_t cupsLastError (void);

+

Return Value

+

IPP status code from last request

+

 CUPS 1.2/Mac OS X 10.5 cupsLastErrorString

+

Return the last IPP status-message.

+

+const char *cupsLastErrorString (void);

+

Return Value

+

status-message text from last request

+

 CUPS 1.1.20/Mac OS X 10.4 cupsPutFd

+

Put a file on the server.

+

+http_status_t cupsPutFd (
+    http_t *http,
+    const char *resource,
+    int fd
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
resource
+
Resource name
+
fd
+
File descriptor
+
+

Return Value

+

HTTP status

+

Discussion

+

This function returns HTTP_CREATED when the file is stored +successfully. + +

+

 CUPS 1.1.20/Mac OS X 10.4 cupsPutFile

+

Put a file on the server.

+

+http_status_t cupsPutFile (
+    http_t *http,
+    const char *resource,
+    const char *filename
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
resource
+
Resource name
+
filename
+
Filename
+
+

Return Value

+

HTTP status

+

Discussion

+

This function returns HTTP_CREATED when the file is stored +successfully. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsReadResponseData

+

Read additional data after the IPP response.

+

+ssize_t cupsReadResponseData (
+    http_t *http,
+    char *buffer,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
buffer
+
Buffer to use
+
length
+
Number of bytes to read
+
+

Return Value

+

Bytes read, 0 on EOF, -1 on error

+

Discussion

+

This function is used after cupsGetResponse() to read the PPD or document +files for CUPS_GET_PPD and CUPS_GET_DOCUMENT requests, respectively. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsSendRequest

+

Send an IPP request.

+

+http_status_t cupsSendRequest (
+    http_t *http,
+    ipp_t *request,
+    const char *resource,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
request
+
IPP request
+
resource
+
Resource path
+
length
+
Length of data to follow or CUPS_LENGTH_VARIABLE
+
+

Return Value

+

Initial HTTP status

+

Discussion

+

Use httpWrite() to write any additional data (document, PPD file, etc.) +for the request, cupsGetResponse() to get the IPP response, and httpRead() +to read any additional data following the response. Only one request can be +sent/queued at a time.
+
+Unlike cupsDoFileRequest(), cupsDoIORequest(), and cupsDoRequest(), the +request is not freed. + +

+

 CUPS 1.4/Mac OS X 10.6 cupsWriteRequestData

+

Write additional data after an IPP request.

+

+http_status_t cupsWriteRequestData (
+    http_t *http,
+    const char *buffer,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server or CUPS_HTTP_DEFAULT
+
buffer
+
Bytes to write
+
length
+
Number of bytes to write
+
+

Return Value

+

HTTP_CONTINUE if OK or HTTP status on error

+

Discussion

+

This function is used after cupsSendRequest to provide a PPD and +after cupsStartDocument to provide a document file. + +

+

 CUPS 1.5/Mac OS X 10.7 httpAddCredential

+

Allocates and adds a single credential to an array.

+

+int httpAddCredential (
+    cups_array_t *credentials,
+    const void *data,
+    size_t datalen
+);

+

Parameters

+
+
credentials
+
Credentials array
+
data
+
PEM-encoded X.509 data
+
datalen
+
Length of data
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

Use cupsArrayNew(NULL, NULL) to create a credentials array. + +

+

 CUPS 1.2/Mac OS X 10.5 httpAddrAny

+

Check for the "any" address.

+

+int httpAddrAny (
+    const http_addr_t *addr
+);

+

Parameters

+
+
addr
+
Address to check
+
+

Return Value

+

1 if "any", 0 otherwise

+

 CUPS 1.2/Mac OS X 10.5 httpAddrEqual

+

Compare two addresses.

+

+int httpAddrEqual (
+    const http_addr_t *addr1,
+    const http_addr_t *addr2
+);

+

Parameters

+
+
addr1
+
First address
+
addr2
+
Second address
+
+

Return Value

+

1 if equal, 0 if not

+

 CUPS 1.2/Mac OS X 10.5 httpAddrLength

+

Return the length of the address in bytes.

+

+int httpAddrLength (
+    const http_addr_t *addr
+);

+

Parameters

+
+
addr
+
Address
+
+

Return Value

+

Length in bytes

+

 CUPS 1.2/Mac OS X 10.5 httpAddrLocalhost

+

Check for the local loopback address.

+

+int httpAddrLocalhost (
+    const http_addr_t *addr
+);

+

Parameters

+
+
addr
+
Address to check
+
+

Return Value

+

1 if local host, 0 otherwise

+

 CUPS 1.2/Mac OS X 10.5 httpAddrLookup

+

Lookup the hostname associated with the address.

+

+char *httpAddrLookup (
+    const http_addr_t *addr,
+    char *name,
+    int namelen
+);

+

Parameters

+
+
addr
+
Address to lookup
+
name
+
Host name buffer
+
namelen
+
Size of name buffer
+
+

Return Value

+

Host name

+

 CUPS 1.2/Mac OS X 10.5 httpAddrString

+

Convert an address to a numeric string.

+

+char *httpAddrString (
+    const http_addr_t *addr,
+    char *s,
+    int slen
+);

+

Parameters

+
+
addr
+
Address to convert
+
s
+
String buffer
+
slen
+
Length of string
+
+

Return Value

+

Numeric address string

+

 CUPS 1.2/Mac OS X 10.5 httpAssembleURI

+

Assemble a uniform resource identifier from its +components.

+

+http_uri_status_t httpAssembleURI (
+    http_uri_coding_t encoding,
+    char *uri,
+    int urilen,
+    const char *scheme,
+    const char *username,
+    const char *host,
+    int port,
+    const char *resource
+);

+

Parameters

+
+
encoding
+
Encoding flags
+
uri
+
URI buffer
+
urilen
+
Size of URI buffer
+
scheme
+
Scheme name
+
username
+
Username
+
host
+
Hostname or address
+
port
+
Port number
+
resource
+
Resource
+
+

Return Value

+

URI status

+

Discussion

+

This function escapes reserved characters in the URI depending on the +value of the "encoding" argument. You should use this function in +place of traditional string functions whenever you need to create a +URI string. + +

+

 CUPS 1.2/Mac OS X 10.5 httpAssembleURIf

+

Assemble a uniform resource identifier from its +components with a formatted resource.

+

+http_uri_status_t httpAssembleURIf (
+    http_uri_coding_t encoding,
+    char *uri,
+    int urilen,
+    const char *scheme,
+    const char *username,
+    const char *host,
+    int port,
+    const char *resourcef,
+    ...
+);

+

Parameters

+
+
encoding
+
Encoding flags
+
uri
+
URI buffer
+
urilen
+
Size of URI buffer
+
scheme
+
Scheme name
+
username
+
Username
+
host
+
Hostname or address
+
port
+
Port number
+
resourcef
+
Printf-style resource
+
...
+
Additional arguments as needed
+
+

Return Value

+

URI status

+

Discussion

+

This function creates a formatted version of the resource string +argument "resourcef" and escapes reserved characters in the URI +depending on the value of the "encoding" argument. You should use +this function in place of traditional string functions whenever +you need to create a URI string. + +

+

httpBlocking

+

Set blocking/non-blocking behavior on a connection.

+

+void httpBlocking (
+    http_t *http,
+    int b
+);

+

Parameters

+
+
http
+
Connection to server
+
b
+
1 = blocking, 0 = non-blocking
+
+

httpCheck

+

Check to see if there is a pending response from the server.

+

+int httpCheck (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

0 = no data, 1 = data available

+

 CUPS 1.1.19/Mac OS X 10.3 httpClearCookie

+

Clear the cookie value(s).

+

+void httpClearCookie (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

httpClearFields

+

Clear HTTP request fields.

+

+void httpClearFields (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

httpClose

+

Close an HTTP connection.

+

+void httpClose (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

 DEPRECATED httpConnect

+

Connect to a HTTP server.

+

+http_t *httpConnect (
+    const char *host,
+    int port
+);

+

Parameters

+
+
host
+
Host to connect to
+
port
+
Port number
+
+

Return Value

+

New HTTP connection

+

Discussion

+

This function is deprecated - use httpConnectEncrypt instead. + +

+

httpConnectEncrypt

+

Connect to a HTTP server using encryption.

+

+http_t *httpConnectEncrypt (
+    const char *host,
+    int port,
+    http_encryption_t encryption
+);

+

Parameters

+
+
host
+
Host to connect to
+
port
+
Port number
+
encryption
+
Type of encryption to use
+
+

Return Value

+

New HTTP connection

+

 CUPS 1.5/Mac OS X 10.7 httpCopyCredentials

+

Copy the credentials associated with an encrypted +connection.

+

+int httpCopyCredentials (
+    http_t *http,
+    cups_array_t **credentials
+);

+

Parameters

+
+
http
+
Connection to server
+
credentials
+
Array of credentials
+
+

Return Value

+

Status of call (0 = success)

+

 DEPRECATED httpDecode64

+

Base64-decode a string.

+

+char *httpDecode64 (
+    char *out,
+    const char *in
+);

+

Parameters

+
+
out
+
String to write to
+
in
+
String to read from
+
+

Return Value

+

Decoded string

+

Discussion

+

This function is deprecated. Use the httpDecode64_2() function instead +which provides buffer length arguments. + +

+

 CUPS 1.1.21/Mac OS X 10.4 httpDecode64_2

+

Base64-decode a string.

+

+char *httpDecode64_2 (
+    char *out,
+    int *outlen,
+    const char *in
+);

+

Parameters

+
+
out
+
String to write to
+
outlen
+
Size of output string
+
in
+
String to read from
+
+

Return Value

+

Decoded string

+

httpDelete

+

Send a DELETE request to the server.

+

+int httpDelete (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI to delete
+
+

Return Value

+

Status of call (0 = success)

+

 DEPRECATED httpEncode64

+

Base64-encode a string.

+

+char *httpEncode64 (
+    char *out,
+    const char *in
+);

+

Parameters

+
+
out
+
String to write to
+
in
+
String to read from
+
+

Return Value

+

Encoded string

+

Discussion

+

This function is deprecated. Use the httpEncode64_2() function instead +which provides buffer length arguments. + +

+

 CUPS 1.1.21/Mac OS X 10.4 httpEncode64_2

+

Base64-encode a string.

+

+char *httpEncode64_2 (
+    char *out,
+    int outlen,
+    const char *in,
+    int inlen
+);

+

Parameters

+
+
out
+
String to write to
+
outlen
+
Size of output string
+
in
+
String to read from
+
inlen
+
Size of input string
+
+

Return Value

+

Encoded string

+

httpEncryption

+

Set the required encryption on the link.

+

+int httpEncryption (
+    http_t *http,
+    http_encryption_t e
+);

+

Parameters

+
+
http
+
Connection to server
+
e
+
New encryption preference
+
+

Return Value

+

-1 on error, 0 on success

+

httpError

+

Get the last error on a connection.

+

+int httpError (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

Error code (errno) value

+

httpFlush

+

Flush data from a HTTP connection.

+

+void httpFlush (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

 CUPS 1.2/Mac OS X 10.5 httpFlushWrite

+

Flush data in write buffer.

+

+int httpFlushWrite (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

Bytes written or -1 on error

+

httpFreeCredentials

+

Free an array of credentials.

+

+void httpFreeCredentials (
+    cups_array_t *credentials
+);

+

Parameters

+
+
credentials
+
Array of credentials
+
+

httpGet

+

Send a GET request to the server.

+

+int httpGet (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI to get
+
+

Return Value

+

Status of call (0 = success)

+

 CUPS 1.3/Mac OS X 10.5 httpGetAuthString

+

Get the current authorization string.

+

+char *httpGetAuthString (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

Authorization string

+

Discussion

+

The authorization string is set by cupsDoAuthentication() and +httpSetAuthString(). Use httpGetAuthString() to retrieve the +string to use with httpSetField() for the HTTP_FIELD_AUTHORIZATION +value. + +

+

 CUPS 1.2/Mac OS X 10.5 httpGetBlocking

+

Get the blocking/non-block state of a connection.

+

+int httpGetBlocking (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

1 if blocking, 0 if non-blocking

+

 CUPS 1.1.19/Mac OS X 10.3 httpGetCookie

+

Get any cookie data from the response.

+

+const char *httpGetCookie (
+    http_t *http
+);

+

Parameters

+
+
http
+
HTTP connecion
+
+

Return Value

+

Cookie data or NULL

+

 DEPRECATED httpGetDateString

+

Get a formatted date/time string from a time value.

+

+const char *httpGetDateString (
+    time_t t
+);

+

Parameters

+
+
t
+
UNIX time
+
+

Return Value

+

Date/time string

+

 CUPS 1.2/Mac OS X 10.5 httpGetDateString2

+

Get a formatted date/time string from a time value.

+

+const char *httpGetDateString2 (
+    time_t t,
+    char *s,
+    int slen
+);

+

Parameters

+
+
t
+
UNIX time
+
s
+
String buffer
+
slen
+
Size of string buffer
+
+

Return Value

+

Date/time string

+

httpGetDateTime

+

Get a time value from a formatted date/time string.

+

+time_t httpGetDateTime (
+    const char *s
+);

+

Parameters

+
+
s
+
Date/time string
+
+

Return Value

+

UNIX time

+

 CUPS 1.2/Mac OS X 10.5 httpGetFd

+

Get the file descriptor associated with a connection.

+

+int httpGetFd (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

File descriptor or -1 if none

+

httpGetField

+

Get a field value from a request/response.

+

+const char *httpGetField (
+    http_t *http,
+    http_field_t field
+);

+

Parameters

+
+
http
+
Connection to server
+
field
+
Field to get
+
+

Return Value

+

Field value

+

 DEPRECATED httpGetHostByName

+

Lookup a hostname or IPv4 address, and return +address records for the specified name.

+

+struct hostent *httpGetHostByName (
+    const char *name
+);

+

Parameters

+
+
name
+
Hostname or IP address
+
+

Return Value

+

Host entry

+

 CUPS 1.2/Mac OS X 10.5 httpGetHostname

+

Get the FQDN for the connection or local system.

+

+const char *httpGetHostname (
+    http_t *http,
+    char *s,
+    int slen
+);

+

Parameters

+
+
http
+
HTTP connection or NULL
+
s
+
String buffer for name
+
slen
+
Size of buffer
+
+

Return Value

+

FQDN for connection or system

+

Discussion

+

When "http" points to a connected socket, return the hostname or +address that was used in the call to httpConnect() or httpConnectEncrypt(). +Otherwise, return the FQDN for the local system using both gethostname() +and gethostbyname() to get the local hostname with domain. + +

+

 DEPRECATED httpGetLength

+

Get the amount of data remaining from the +content-length or transfer-encoding fields.

+

+int httpGetLength (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

Content length

+

Discussion

+

This function is deprecated and will not return lengths larger than +2^31 - 1; use httpGetLength2() instead. + +

+

 CUPS 1.2/Mac OS X 10.5 httpGetLength2

+

Get the amount of data remaining from the +content-length or transfer-encoding fields.

+

+off_t httpGetLength2 (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

Content length

+

Discussion

+

This function returns the complete content length, even for +content larger than 2^31 - 1. + +

+

 CUPS 1.2/Mac OS X 10.5 httpGetStatus

+

Get the status of the last HTTP request.

+

+http_status_t httpGetStatus (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

HTTP status

+

 DEPRECATED httpGetSubField

+

Get a sub-field value.

+

+char *httpGetSubField (
+    http_t *http,
+    http_field_t field,
+    const char *name,
+    char *value
+);

+

Parameters

+
+
http
+
Connection to server
+
field
+
Field index
+
name
+
Name of sub-field
+
value
+
Value string
+
+

Return Value

+

Value or NULL

+

 CUPS 1.2/Mac OS X 10.5 httpGetSubField2

+

Get a sub-field value.

+

+char *httpGetSubField2 (
+    http_t *http,
+    http_field_t field,
+    const char *name,
+    char *value,
+    int valuelen
+);

+

Parameters

+
+
http
+
Connection to server
+
field
+
Field index
+
name
+
Name of sub-field
+
value
+
Value string
+
valuelen
+
Size of value buffer
+
+

Return Value

+

Value or NULL

+

httpGets

+

Get a line of text from a HTTP connection.

+

+char *httpGets (
+    char *line,
+    int length,
+    http_t *http
+);

+

Parameters

+
+
line
+
Line to read into
+
length
+
Max length of buffer
+
http
+
Connection to server
+
+

Return Value

+

Line or NULL

+

httpHead

+

Send a HEAD request to the server.

+

+int httpHead (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI for head
+
+

Return Value

+

Status of call (0 = success)

+

httpInitialize

+

Initialize the HTTP interface library and set the +default HTTP proxy (if any).

+

+void httpInitialize (void);

+

httpMD5

+

Compute the MD5 sum of the username:group:password.

+

+char *httpMD5 (
+    const char *username,
+    const char *realm,
+    const char *passwd,
+    char md5[33]
+);

+

Parameters

+
+
username
+
User name
+
realm
+
Realm name
+
passwd
+
Password string
+
md5[33]
+
MD5 string
+
+

Return Value

+

MD5 sum

+

httpMD5Final

+

Combine the MD5 sum of the username, group, and password +with the server-supplied nonce value, method, and +request-uri.

+

+char *httpMD5Final (
+    const char *nonce,
+    const char *method,
+    const char *resource,
+    char md5[33]
+);

+

Parameters

+
+
nonce
+
Server nonce value
+
method
+
METHOD (GET, POST, etc.)
+
resource
+
Resource path
+
md5[33]
+
MD5 sum
+
+

Return Value

+

New sum

+

httpMD5String

+

Convert an MD5 sum to a character string.

+

+char *httpMD5String (
+    const unsigned char *sum,
+    char md5[33]
+);

+

Parameters

+
+
sum
+
MD5 sum data
+
md5[33]
+
MD5 sum in hex
+
+

Return Value

+

MD5 sum in hex

+

httpOptions

+

Send an OPTIONS request to the server.

+

+int httpOptions (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI for options
+
+

Return Value

+

Status of call (0 = success)

+

httpPost

+

Send a POST request to the server.

+

+int httpPost (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI for post
+
+

Return Value

+

Status of call (0 = success)

+

httpPut

+

Send a PUT request to the server.

+

+int httpPut (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI to put
+
+

Return Value

+

Status of call (0 = success)

+

 DEPRECATED httpRead

+

Read data from a HTTP connection.

+

+int httpRead (
+    http_t *http,
+    char *buffer,
+    int length
+);

+

Parameters

+
+
http
+
Connection to server
+
buffer
+
Buffer for data
+
length
+
Maximum number of bytes
+
+

Return Value

+

Number of bytes read

+

Discussion

+

This function is deprecated. Use the httpRead2() function which can +read more than 2GB of data. + +

+

 CUPS 1.2/Mac OS X 10.5 httpRead2

+

Read data from a HTTP connection.

+

+ssize_t httpRead2 (
+    http_t *http,
+    char *buffer,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server
+
buffer
+
Buffer for data
+
length
+
Maximum number of bytes
+
+

Return Value

+

Number of bytes read

+

httpReconnect

+

Reconnect to a HTTP server.

+

+int httpReconnect (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

0 on success, non-zero on failure

+

 DEPRECATED httpSeparate

+

Separate a Universal Resource Identifier into its +components.

+

+void httpSeparate (
+    const char *uri,
+    char *scheme,
+    char *username,
+    char *host,
+    int *port,
+    char *resource
+);

+

Parameters

+
+
uri
+
Universal Resource Identifier
+
scheme
+
Scheme [32] (http, https, etc.)
+
username
+
Username [1024]
+
host
+
Hostname [1024]
+
port
+
Port number to use
+
resource
+
Resource/filename [1024]
+
+

Discussion

+

This function is deprecated; use the httpSeparateURI() function instead. + +

+

 CUPS 1.1.21/Mac OS X 10.4 httpSeparate2

+

Separate a Universal Resource Identifier into its +components.

+

+void httpSeparate2 (
+    const char *uri,
+    char *scheme,
+    int schemelen,
+    char *username,
+    int usernamelen,
+    char *host,
+    int hostlen,
+    int *port,
+    char *resource,
+    int resourcelen
+);

+

Parameters

+
+
uri
+
Universal Resource Identifier
+
scheme
+
Scheme (http, https, etc.)
+
schemelen
+
Size of scheme buffer
+
username
+
Username
+
usernamelen
+
Size of username buffer
+
host
+
Hostname
+
hostlen
+
Size of hostname buffer
+
port
+
Port number to use
+
resource
+
Resource/filename
+
resourcelen
+
Size of resource buffer
+
+

Discussion

+

This function is deprecated; use the httpSeparateURI() function instead. + + +

+

 CUPS 1.2/Mac OS X 10.5 httpSeparateURI

+

Separate a Universal Resource Identifier into its +components.

+

+http_uri_status_t httpSeparateURI (
+    http_uri_coding_t decoding,
+    const char *uri,
+    char *scheme,
+    int schemelen,
+    char *username,
+    int usernamelen,
+    char *host,
+    int hostlen,
+    int *port,
+    char *resource,
+    int resourcelen
+);

+

Parameters

+
+
decoding
+
Decoding flags
+
uri
+
Universal Resource Identifier
+
scheme
+
Scheme (http, https, etc.)
+
schemelen
+
Size of scheme buffer
+
username
+
Username
+
usernamelen
+
Size of username buffer
+
host
+
Hostname
+
hostlen
+
Size of hostname buffer
+
port
+
Port number to use
+
resource
+
Resource/filename
+
resourcelen
+
Size of resource buffer
+
+

Return Value

+

Result of separation

+

 CUPS 1.3/Mac OS X 10.5 httpSetAuthString

+

Set the current authorization string.

+

+void httpSetAuthString (
+    http_t *http,
+    const char *scheme,
+    const char *data
+);

+

Parameters

+
+
http
+
Connection to server
+
scheme
+
Auth scheme (NULL to clear it)
+
data
+
Auth data (NULL for none)
+
+

Discussion

+

This function just stores a copy of the current authorization string in +the HTTP connection object. You must still call httpSetField() to set +HTTP_FIELD_AUTHORIZATION prior to issuing a HTTP request using httpGet(), +httpHead(), httpOptions(), httpPost, or httpPut(). + +

+

 CUPS 1.1.19/Mac OS X 10.3 httpSetCookie

+

Set the cookie value(s).

+

+void httpSetCookie (
+    http_t *http,
+    const char *cookie
+);

+

Parameters

+
+
http
+
Connection
+
cookie
+
Cookie string
+
+

 CUPS 1.5/Mac OS X 10.7 httpSetCredentials

+

Set the credentials associated with an encrypted +connection.

+

+int httpSetCredentials (
+    http_t *http,
+    cups_array_t *credentials
+);

+

Parameters

+
+
http
+
Connection to server
+
credentials
+
Array of credentials
+
+

Return Value

+

Status of call (0 = success)

+

 CUPS 1.2/Mac OS X 10.5 httpSetExpect

+

Set the Expect: header in a request.

+

+void httpSetExpect (
+    http_t *http,
+    http_status_t expect
+);

+

Parameters

+
+
http
+
Connection to server
+
expect
+
HTTP status to expect (HTTP_CONTINUE)
+
+

Discussion

+

Currently only HTTP_CONTINUE is supported for the "expect" argument. + +

+

httpSetField

+

Set the value of an HTTP header.

+

+void httpSetField (
+    http_t *http,
+    http_field_t field,
+    const char *value
+);

+

Parameters

+
+
http
+
Connection to server
+
field
+
Field index
+
value
+
Value
+
+

 CUPS 1.2/Mac OS X 10.5 httpSetLength

+

Set the content-length and content-encoding.

+

+void httpSetLength (
+    http_t *http,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server
+
length
+
Length (0 for chunked)
+
+

 CUPS 1.5/Mac OS X 10.7 httpSetTimeout

+

Set read/write timeouts and an optional callback.

+

+void httpSetTimeout (
+    http_t *http,
+    double timeout,
+    http_timeout_cb_t cb,
+    void *user_data
+);

+

Parameters

+
+
http
+
Connection to server
+
timeout
+
Number of seconds for timeout, +must be greater than 0
+
cb
+
Callback function or NULL
+
user_data
+
User data pointer
+
+

Discussion

+

The optional timeout callback receives both the HTTP connection and a user +data pointer and must return 1 to continue or 0 to error (time) out. + +

+

httpStatus

+

Return a short string describing a HTTP status code.

+

+const char *httpStatus (
+    http_status_t status
+);

+

Parameters

+
+
status
+
HTTP status code
+
+

Return Value

+

Localized status string

+

Discussion

+

The returned string is localized to the current POSIX locale and is based +on the status strings defined in RFC 2616.

+

httpTrace

+

Send an TRACE request to the server.

+

+int httpTrace (
+    http_t *http,
+    const char *uri
+);

+

Parameters

+
+
http
+
Connection to server
+
uri
+
URI for trace
+
+

Return Value

+

Status of call (0 = success)

+

httpUpdate

+

Update the current HTTP state for incoming data.

+

+http_status_t httpUpdate (
+    http_t *http
+);

+

Parameters

+
+
http
+
Connection to server
+
+

Return Value

+

HTTP status

+

 CUPS 1.1.19/Mac OS X 10.3 httpWait

+

Wait for data available on a connection.

+

+int httpWait (
+    http_t *http,
+    int msec
+);

+

Parameters

+
+
http
+
Connection to server
+
msec
+
Milliseconds to wait
+
+

Return Value

+

1 if data is available, 0 otherwise

+

 DEPRECATED httpWrite

+

Write data to a HTTP connection.

+

+int httpWrite (
+    http_t *http,
+    const char *buffer,
+    int length
+);

+

Parameters

+
+
http
+
Connection to server
+
buffer
+
Buffer for data
+
length
+
Number of bytes to write
+
+

Return Value

+

Number of bytes written

+

Discussion

+

This function is deprecated. Use the httpWrite2() function which can +write more than 2GB of data. + +

+

 CUPS 1.2/Mac OS X 10.5 httpWrite2

+

Write data to a HTTP connection.

+

+ssize_t httpWrite2 (
+    http_t *http,
+    const char *buffer,
+    size_t length
+);

+

Parameters

+
+
http
+
Connection to server
+
buffer
+
Buffer for data
+
length
+
Number of bytes to write
+
+

Return Value

+

Number of bytes written

+

ippAddBoolean

+

Add a boolean attribute to an IPP message.

+

+ipp_attribute_t *ippAddBoolean (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    char value
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
value
+
Value of attribute
+
+

Return Value

+

New attribute

+

ippAddBooleans

+

Add an array of boolean values.

+

+ipp_attribute_t *ippAddBooleans (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    int num_values,
+    const char *values
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
num_values
+
Number of values
+
values
+
Values
+
+

Return Value

+

New attribute

+

 CUPS 1.1.19/Mac OS X 10.3 ippAddCollection

+

Add a collection value.

+

+ipp_attribute_t *ippAddCollection (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    ipp_t *value
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
value
+
Value
+
+

Return Value

+

New attribute

+

 CUPS 1.1.19/Mac OS X 10.3 ippAddCollections

+

Add an array of collection values.

+

+ipp_attribute_t *ippAddCollections (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    int num_values,
+    const ipp_t **values
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
num_values
+
Number of values
+
values
+
Values
+
+

Return Value

+

New attribute

+

ippAddDate

+

Add a date attribute to an IPP message.

+

+ipp_attribute_t *ippAddDate (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    const ipp_uchar_t *value
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
value
+
Value
+
+

Return Value

+

New attribute

+

ippAddInteger

+

Add a integer attribute to an IPP message.

+

+ipp_attribute_t *ippAddInteger (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    ipp_tag_t type,
+    const char *name,
+    int value
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
type
+
Type of attribute
+
name
+
Name of attribute
+
value
+
Value of attribute
+
+

Return Value

+

New attribute

+

ippAddIntegers

+

Add an array of integer values.

+

+ipp_attribute_t *ippAddIntegers (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    ipp_tag_t type,
+    const char *name,
+    int num_values,
+    const int *values
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
type
+
Type of attribute
+
name
+
Name of attribute
+
num_values
+
Number of values
+
values
+
Values
+
+

Return Value

+

New attribute

+

 CUPS 1.2/Mac OS X 10.5 ippAddOctetString

+

Add an octetString value to an IPP message.

+

+ipp_attribute_t *ippAddOctetString (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    const void *data,
+    int datalen
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
data
+
octetString data
+
datalen
+
Length of data in bytes
+
+

Return Value

+

New attribute

+

ippAddRange

+

Add a range of values to an IPP message.

+

+ipp_attribute_t *ippAddRange (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    int lower,
+    int upper
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
lower
+
Lower value
+
upper
+
Upper value
+
+

Return Value

+

New attribute

+

ippAddRanges

+

Add ranges of values to an IPP message.

+

+ipp_attribute_t *ippAddRanges (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    int num_values,
+    const int *lower,
+    const int *upper
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
num_values
+
Number of values
+
lower
+
Lower values
+
upper
+
Upper values
+
+

Return Value

+

New attribute

+

ippAddResolution

+

Add a resolution value to an IPP message.

+

+ipp_attribute_t *ippAddResolution (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    ipp_res_t units,
+    int xres,
+    int yres
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
units
+
Units for resolution
+
xres
+
X resolution
+
yres
+
Y resolution
+
+

Return Value

+

New attribute

+

ippAddResolutions

+

Add resolution values to an IPP message.

+

+ipp_attribute_t *ippAddResolutions (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    const char *name,
+    int num_values,
+    ipp_res_t units,
+    const int *xres,
+    const int *yres
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
name
+
Name of attribute
+
num_values
+
Number of values
+
units
+
Units for resolution
+
xres
+
X resolutions
+
yres
+
Y resolutions
+
+

Return Value

+

New attribute

+

ippAddSeparator

+

Add a group separator to an IPP message.

+

+ipp_attribute_t *ippAddSeparator (
+    ipp_t *ipp
+);

+

Parameters

+
+
ipp
+
IPP message
+
+

Return Value

+

New attribute

+

ippAddString

+

Add a language-encoded string to an IPP message.

+

+ipp_attribute_t *ippAddString (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    ipp_tag_t type,
+    const char *name,
+    const char *charset,
+    const char *value
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
type
+
Type of attribute
+
name
+
Name of attribute
+
charset
+
Character set
+
value
+
Value
+
+

Return Value

+

New attribute

+

ippAddStrings

+

Add language-encoded strings to an IPP message.

+

+ipp_attribute_t *ippAddStrings (
+    ipp_t *ipp,
+    ipp_tag_t group,
+    ipp_tag_t type,
+    const char *name,
+    int num_values,
+    const char *charset,
+    const char *const *values
+);

+

Parameters

+
+
ipp
+
IPP message
+
group
+
IPP group
+
type
+
Type of attribute
+
name
+
Name of attribute
+
num_values
+
Number of values
+
charset
+
Character set
+
values
+
Values
+
+

Return Value

+

New attribute

+

ippDateToTime

+

Convert from RFC 1903 Date/Time format to UNIX time +in seconds.

+

+time_t ippDateToTime (
+    const ipp_uchar_t *date
+);

+

Parameters

+
+
date
+
RFC 1903 date info
+
+

Return Value

+

UNIX time value

+

ippDelete

+

Delete an IPP message.

+

+void ippDelete (
+    ipp_t *ipp
+);

+

Parameters

+
+
ipp
+
IPP message
+
+

 CUPS 1.1.19/Mac OS X 10.3 ippDeleteAttribute

+

Delete a single attribute in an IPP message.

+

+void ippDeleteAttribute (
+    ipp_t *ipp,
+    ipp_attribute_t *attr
+);

+

Parameters

+
+
ipp
+
IPP message
+
attr
+
Attribute to delete
+
+

ippErrorString

+

Return a name for the given status code.

+

+const char *ippErrorString (
+    ipp_status_t error
+);

+

Parameters

+
+
error
+
Error status
+
+

Return Value

+

Text string

+

 CUPS 1.2/Mac OS X 10.5 ippErrorValue

+

Return a status code for the given name.

+

+ipp_status_t ippErrorValue (
+    const char *name
+);

+

Parameters

+
+
name
+
Name
+
+

Return Value

+

IPP status code

+

ippFindAttribute

+

Find a named attribute in a request...

+

+ipp_attribute_t *ippFindAttribute (
+    ipp_t *ipp,
+    const char *name,
+    ipp_tag_t type
+);

+

Parameters

+
+
ipp
+
IPP message
+
name
+
Name of attribute
+
type
+
Type of attribute
+
+

Return Value

+

Matching attribute

+

ippFindNextAttribute

+

Find the next named attribute in a request...

+

+ipp_attribute_t *ippFindNextAttribute (
+    ipp_t *ipp,
+    const char *name,
+    ipp_tag_t type
+);

+

Parameters

+
+
ipp
+
IPP message
+
name
+
Name of attribute
+
type
+
Type of attribute
+
+

Return Value

+

Matching attribute

+

ippLength

+

Compute the length of an IPP message.

+

+size_t ippLength (
+    ipp_t *ipp
+);

+

Parameters

+
+
ipp
+
IPP message
+
+

Return Value

+

Size of IPP message

+

ippNew

+

Allocate a new IPP message.

+

+ipp_t *ippNew (void);

+

Return Value

+

New IPP message

+

 CUPS 1.2/Mac OS X 10.5 ippNewRequest

+

Allocate a new IPP request message.

+

+ipp_t *ippNewRequest (
+    ipp_op_t op
+);

+

Parameters

+
+
op
+
Operation code
+
+

Return Value

+

IPP request message

+

Discussion

+

The new request message is initialized with the attributes-charset and +attributes-natural-language attributes added. The +attributes-natural-language value is derived from the current locale. + +

+

 CUPS 1.2/Mac OS X 10.5 ippOpString

+

Return a name for the given operation id.

+

+const char *ippOpString (
+    ipp_op_t op
+);

+

Parameters

+
+
op
+
Operation ID
+
+

Return Value

+

Name

+

 CUPS 1.2/Mac OS X 10.5 ippOpValue

+

Return an operation id for the given name.

+

+ipp_op_t ippOpValue (
+    const char *name
+);

+

Parameters

+
+
name
+
Textual name
+
+

Return Value

+

Operation ID

+

ippPort

+

Return the default IPP port number.

+

+int ippPort (void);

+

Return Value

+

Port number

+

ippRead

+

Read data for an IPP message from a HTTP connection.

+

+ipp_state_t ippRead (
+    http_t *http,
+    ipp_t *ipp
+);

+

Parameters

+
+
http
+
HTTP connection
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

 CUPS 1.1.19/Mac OS X 10.3 ippReadFile

+

Read data for an IPP message from a file.

+

+ipp_state_t ippReadFile (
+    int fd,
+    ipp_t *ipp
+);

+

Parameters

+
+
fd
+
HTTP data
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

 CUPS 1.2/Mac OS X 10.5 ippReadIO

+

Read data for an IPP message.

+

+ipp_state_t ippReadIO (
+    void *src,
+    ipp_iocb_t cb,
+    int blocking,
+    ipp_t *parent,
+    ipp_t *ipp
+);

+

Parameters

+
+
src
+
Data source
+
cb
+
Read callback function
+
blocking
+
Use blocking IO?
+
parent
+
Parent request, if any
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

ippSetPort

+

Set the default port number.

+

+void ippSetPort (
+    int p
+);

+

Parameters

+
+
p
+
Port number to use
+
+

 CUPS 1.4/Mac OS X 10.6 ippTagString

+

Return the tag name corresponding to a tag value.

+

+const char *ippTagString (
+    ipp_tag_t tag
+);

+

Parameters

+
+
tag
+
Tag value
+
+

Return Value

+

Tag name

+

Discussion

+

The returned names are defined in RFC 2911 and 3382. + +

+

 CUPS 1.4/Mac OS X 10.6 ippTagValue

+

Return the tag value corresponding to a tag name.

+

+ipp_tag_t ippTagValue (
+    const char *name
+);

+

Parameters

+
+
name
+
Tag name
+
+

Return Value

+

Tag value

+

Discussion

+

The tag names are defined in RFC 2911 and 3382. + +

+

ippTimeToDate

+

Convert from UNIX time to RFC 1903 format.

+

+const ipp_uchar_t *ippTimeToDate (
+    time_t t
+);

+

Parameters

+
+
t
+
UNIX time value
+
+

Return Value

+

RFC-1903 date/time data

+

ippWrite

+

Write data for an IPP message to a HTTP connection.

+

+ipp_state_t ippWrite (
+    http_t *http,
+    ipp_t *ipp
+);

+

Parameters

+
+
http
+
HTTP connection
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

 CUPS 1.1.19/Mac OS X 10.3 ippWriteFile

+

Write data for an IPP message to a file.

+

+ipp_state_t ippWriteFile (
+    int fd,
+    ipp_t *ipp
+);

+

Parameters

+
+
fd
+
HTTP data
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

 CUPS 1.2/Mac OS X 10.5 ippWriteIO

+

Write data for an IPP message.

+

+ipp_state_t ippWriteIO (
+    void *dst,
+    ipp_iocb_t cb,
+    int blocking,
+    ipp_t *parent,
+    ipp_t *ipp
+);

+

Parameters

+
+
dst
+
Destination
+
cb
+
Write callback function
+
blocking
+
Use blocking IO?
+
parent
+
Parent IPP message
+
ipp
+
IPP data
+
+

Return Value

+

Current state

+

Data Types

+

gss_auth_identity_desc

+

Local functions...

+

+typedef struct gss_auth_identity gss_auth_identity_desc; +

+

 CUPS 1.2/Mac OS X 10.5 http_addr_t

+

Socket address union, which +makes using IPv6 and other +address types easier and +more portable.

+

+typedef union _http_addr_u / http_addr_t; +

+

 CUPS 1.2/Mac OS X 10.5 http_addrlist_t

+

Socket address list, which is +used to enumerate all of the +addresses that are associated +with a hostname.

+

+typedef struct http_addrlist_s / http_addrlist_t; +

+

http_auth_t

+

HTTP authentication types

+

+typedef enum http_auth_e http_auth_t; +

+

 CUPS 1.5/Mac OS X 10.7 http_credential_t

+

HTTP credential data

+

+typedef struct http_credential_s http_credential_t; +

+

http_encoding_t

+

HTTP transfer encoding values

+

+typedef enum http_encoding_e http_encoding_t; +

+

http_encryption_t

+

HTTP encryption values

+

+typedef enum http_encryption_e http_encryption_t; +

+

http_field_t

+

HTTP field names

+

+typedef enum http_field_e http_field_t; +

+

http_keepalive_t

+

HTTP keep-alive values

+

+typedef enum http_keepalive_e http_keepalive_t; +

+

http_state_t

+

HTTP state values; states +are server-oriented...

+

+typedef enum http_state_e / http_state_t; +

+

http_status_t

+

HTTP status codes

+

+typedef enum http_status_e http_status_t; +

+

http_t

+

HTTP connection type

+

+typedef struct _http_s http_t; +

+

 CUPS 1.5/Mac OS X 10.7 http_timeout_cb_t

+

HTTP timeout callback

+

+typedef int (*http_timeout_cb_t)(http_t *http, void *user_data); +

+

http_uri_coding_t

+

URI en/decode flags

+

+typedef enum http_uri_coding_e http_uri_coding_t; +

+

 CUPS 1.2 http_uri_status_t

+

URI separation status

+

+typedef enum http_uri_status_e http_uri_status_t; +

+

http_version_t

+

HTTP version numbers

+

+typedef enum http_version_e http_version_t; +

+

ipp_attribute_t

+

Attribute

+

+typedef struct ipp_attribute_s ipp_attribute_t; +

+

ipp_finish_t

+

Finishings

+

+typedef enum ipp_finish_e ipp_finish_t; +

+

 CUPS 1.2/Mac OS X 10.5 ipp_iocb_t

+

IPP IO Callback Function

+

+typedef ssize_t (*ipp_iocb_t)(void *, ipp_uchar_t *, size_t); +

+

ipp_jstate_t

+

Job states

+

+typedef enum ipp_jstate_e ipp_jstate_t; +

+

ipp_op_t

+

IPP operations

+

+typedef enum ipp_op_e ipp_op_t; +

+

ipp_orient_t

+

Orientation values

+

+typedef enum ipp_orient_e ipp_orient_t; +

+

ipp_pstate_t

+

Printer states

+

+typedef enum ipp_pstate_e ipp_pstate_t; +

+

ipp_quality_t

+

Qualities

+

+typedef enum ipp_quality_e ipp_quality_t; +

+

ipp_request_t

+

Request Header

+

+typedef union ipp_request_u ipp_request_t; +

+

ipp_res_t

+

Resolution units

+

+typedef enum ipp_res_e ipp_res_t; +

+

ipp_state_t

+

IPP states

+

+typedef enum ipp_state_e ipp_state_t; +

+

ipp_t

+

Attribute Value

+

+typedef struct ipp_s ipp_t; +

+

ipp_uchar_t

+

IPP status codes

+

+typedef typedef unsigned char ipp_uchar_t; +

+

ipp_tag_t

+

Format tags for attributes

+

+typedef enum ipp_tag_e ipp_tag_t; +

+

ipp_value_t

+

Attribute Value

+

+typedef union ipp_value_u ipp_value_t; +

+

Structures

+

gss_auth_identity

+

Local functions...

+

struct gss_auth_identity {
+    gss_buffer_t *credentialsRef;
+    uint32_t flags;
+    char *password;
+    char *realm;
+    uint32_t type;
+    char *username;
+};

+

Members

+
+
credentialsRef
+
flags
+
password
+
realm
+
type
+
username
+
+

 CUPS 1.2/Mac OS X 10.5 http_addrlist_s

+

Socket address list, which is +used to enumerate all of the +addresses that are associated +with a hostname.

+

struct http_addrlist_s {
+    http_addr_t addr;
+    struct http_addrlist_s *next;
+};

+

Members

+
+
addr
+
Address
+
next
+
Pointer to next address in list
+
+

 CUPS 1.5/Mac OS X 10.7 http_credential_s

+

HTTP credential data

+

struct http_credential_s {
+    void *data;
+    size_t datalen;
+};

+

Members

+
+
data
+
Pointer to credential data
+
datalen
+
Credential length
+
+

ipp_attribute_s

+

Attribute

+

struct ipp_attribute_s {
+    char *name;
+    struct ipp_attribute_s *next;
+    int num_values;
+    ipp_tag_t group_tag, value_tag;
+    ipp_value_t values[1];
+};

+

Members

+
+
name
+
Name of attribute
+
next
+
Next attribute in list
+
num_values
+
Number of values
+
value_tag
+
What type of value is it?
+
values[1]
+
Values
+
+

ipp_s

+

IPP Request/Response/Notification

+

struct ipp_s {
+    ipp_attribute_t *attrs;
+    ipp_attribute_t *current;
+    ipp_tag_t curtag;
+    ipp_attribute_t *last;
+    ipp_attribute_t *prev;
+    ipp_request_t request;
+    ipp_state_t state;
+    int use;
+};

+

Members

+
+
attrs
+
Attributes
+
current
+
Current attribute (for read/write)
+
curtag
+
Current attribute group tag
+
last
+
Last attribute in list
+
prev  CUPS 1.2/Mac OS X 10.5 
+
Previous attribute (for read)
+
request
+
Request header
+
state
+
State of request
+
use  CUPS 1.4.4/Mac OS X 10.6.? 
+
Use count
+
+

Unions

+

ipp_request_u

+

Request Header

+

union ipp_request_u {
+};

+

Members

+
+
+

ipp_value_u

+

Attribute Value

+

union ipp_value_u {
+    char boolean;
+    ipp_t *collection;
+    ipp_uchar_t date[11];
+    int integer;
+};

+

Members

+
+
boolean
+
Boolean value
+
collection  CUPS 1.1.19/Mac OS X 10.3 
+
Collection value
+
date[11]
+
Date/time value
+
integer
+
Integer/enumerated value
+
+

Constants

+

http_auth_e

+

HTTP authentication types

+

Constants

+
+
HTTP_AUTH_BASIC
+
Basic authentication in use
+
HTTP_AUTH_MD5
+
Digest authentication in use
+
HTTP_AUTH_MD5_INT
+
Digest authentication in use for body
+
HTTP_AUTH_MD5_SESS
+
MD5-session authentication in use
+
HTTP_AUTH_MD5_SESS_INT
+
MD5-session authentication in use for body
+
HTTP_AUTH_NEGOTIATE  CUPS 1.3/Mac OS X 10.5 
+
GSSAPI authentication in use
+
HTTP_AUTH_NONE
+
No authentication in use
+
+

http_encoding_e

+

HTTP transfer encoding values

+

Constants

+
+
HTTP_ENCODE_CHUNKED
+
Data is chunked
+
HTTP_ENCODE_FIELDS
+
Sending HTTP fields
+
HTTP_ENCODE_LENGTH
+
Data is sent with Content-Length
+
+

http_encryption_e

+

HTTP encryption values

+

Constants

+
+
HTTP_ENCRYPT_ALWAYS
+
Always encrypt (SSL)
+
HTTP_ENCRYPT_IF_REQUESTED
+
Encrypt if requested (TLS upgrade)
+
HTTP_ENCRYPT_NEVER
+
Never encrypt
+
HTTP_ENCRYPT_REQUIRED
+
Encryption is required (TLS upgrade)
+
+

http_field_e

+

HTTP field names

+

Constants

+
+
HTTP_FIELD_ACCEPT_LANGUAGE
+
Accept-Language field
+
HTTP_FIELD_ACCEPT_RANGES
+
Accept-Ranges field
+
HTTP_FIELD_AUTHORIZATION
+
Authorization field
+
HTTP_FIELD_CONNECTION
+
Connection field
+
HTTP_FIELD_CONTENT_ENCODING
+
Content-Encoding field
+
HTTP_FIELD_CONTENT_LANGUAGE
+
Content-Language field
+
HTTP_FIELD_CONTENT_LENGTH
+
Content-Length field
+
HTTP_FIELD_CONTENT_LOCATION
+
Content-Location field
+
HTTP_FIELD_CONTENT_MD5
+
Content-MD5 field
+
HTTP_FIELD_CONTENT_RANGE
+
Content-Range field
+
HTTP_FIELD_CONTENT_TYPE
+
Content-Type field
+
HTTP_FIELD_CONTENT_VERSION
+
Content-Version field
+
HTTP_FIELD_DATE
+
Date field
+
HTTP_FIELD_HOST
+
Host field
+
HTTP_FIELD_IF_MODIFIED_SINCE
+
If-Modified-Since field
+
HTTP_FIELD_IF_UNMODIFIED_SINCE
+
If-Unmodified-Since field
+
HTTP_FIELD_KEEP_ALIVE
+
Keep-Alive field
+
HTTP_FIELD_LAST_MODIFIED
+
Last-Modified field
+
HTTP_FIELD_LINK
+
Link field
+
HTTP_FIELD_LOCATION
+
Location field
+
HTTP_FIELD_MAX
+
Maximum field index
+
HTTP_FIELD_RANGE
+
Range field
+
HTTP_FIELD_REFERER
+
Referer field
+
HTTP_FIELD_RETRY_AFTER
+
Retry-After field
+
HTTP_FIELD_TRANSFER_ENCODING
+
Transfer-Encoding field
+
HTTP_FIELD_UNKNOWN
+
Unknown field
+
HTTP_FIELD_UPGRADE
+
Upgrade field
+
HTTP_FIELD_USER_AGENT
+
User-Agent field
+
HTTP_FIELD_WWW_AUTHENTICATE
+
WWW-Authenticate field
+
+

http_keepalive_e

+

HTTP keep-alive values

+

Constants

+
+
HTTP_KEEPALIVE_OFF
+
No keep alive support
+
HTTP_KEEPALIVE_ON
+
Use keep alive
+
+

http_state_e

+

HTTP state values; states +are server-oriented...

+

Constants

+
+
HTTP_CLOSE
+
CLOSE command, waiting for blank line
+
HTTP_DELETE
+
DELETE command, waiting for blank line
+
HTTP_GET
+
GET command, waiting for blank line
+
HTTP_GET_SEND
+
GET command, sending data
+
HTTP_HEAD
+
HEAD command, waiting for blank line
+
HTTP_OPTIONS
+
OPTIONS command, waiting for blank line
+
HTTP_POST
+
POST command, waiting for blank line
+
HTTP_POST_RECV
+
POST command, receiving data
+
HTTP_POST_SEND
+
POST command, sending data
+
HTTP_PUT
+
PUT command, waiting for blank line
+
HTTP_PUT_RECV
+
PUT command, receiving data
+
HTTP_STATUS
+
Command complete, sending status
+
HTTP_TRACE
+
TRACE command, waiting for blank line
+
HTTP_WAITING
+
Waiting for command
+
+

http_status_e

+

HTTP status codes

+

Constants

+
+
HTTP_ACCEPTED
+
DELETE command was successful
+
HTTP_AUTHORIZATION_CANCELED  CUPS 1.4 
+
User canceled authorization
+
HTTP_BAD_GATEWAY
+
Bad gateway
+
HTTP_BAD_REQUEST
+
Bad request
+
HTTP_CONFLICT
+
Request is self-conflicting
+
HTTP_CONTINUE
+
Everything OK, keep going...
+
HTTP_CREATED
+
PUT command was successful
+
HTTP_ERROR
+
An error response from httpXxxx()
+
HTTP_EXPECTATION_FAILED
+
The expectation given in an Expect header field was not met
+
HTTP_FORBIDDEN
+
Forbidden to access this URI
+
HTTP_GATEWAY_TIMEOUT
+
Gateway connection timed out
+
HTTP_GONE
+
Server has gone away
+
HTTP_LENGTH_REQUIRED
+
A content length or encoding is required
+
HTTP_METHOD_NOT_ALLOWED
+
Method is not allowed
+
HTTP_MOVED_PERMANENTLY
+
Document has moved permanently
+
HTTP_MOVED_TEMPORARILY
+
Document has moved temporarily
+
HTTP_MULTIPLE_CHOICES
+
Multiple files match request
+
HTTP_NOT_ACCEPTABLE
+
Not Acceptable
+
HTTP_NOT_AUTHORITATIVE
+
Information isn't authoritative
+
HTTP_NOT_FOUND
+
URI was not found
+
HTTP_NOT_IMPLEMENTED
+
Feature not implemented
+
HTTP_NOT_MODIFIED
+
File not modified
+
HTTP_NOT_SUPPORTED
+
HTTP version not supported
+
HTTP_NO_CONTENT
+
Successful command, no new data
+
HTTP_OK
+
OPTIONS/GET/HEAD/POST/TRACE command was successful
+
HTTP_PARTIAL_CONTENT
+
Only a partial file was recieved/sent
+
HTTP_PAYMENT_REQUIRED
+
Payment required
+
HTTP_PKI_ERROR  CUPS 1.5/Mac OS X 10.7 
+
Error negotiating a secure connection
+
HTTP_PRECONDITION
+
Precondition failed
+
HTTP_PROXY_AUTHENTICATION
+
Proxy Authentication is Required
+
HTTP_REQUESTED_RANGE
+
The requested range is not satisfiable
+
HTTP_REQUEST_TIMEOUT
+
Request timed out
+
HTTP_REQUEST_TOO_LARGE
+
Request entity too large
+
HTTP_RESET_CONTENT
+
Content was reset/recreated
+
HTTP_SEE_OTHER
+
See this other link...
+
HTTP_SERVER_ERROR
+
Internal server error
+
HTTP_SERVICE_UNAVAILABLE
+
Service is unavailable
+
HTTP_SWITCHING_PROTOCOLS
+
HTTP upgrade to TLS/SSL
+
HTTP_UNAUTHORIZED
+
Unauthorized to access host
+
HTTP_UNSUPPORTED_MEDIATYPE
+
The requested media type is unsupported
+
HTTP_UPGRADE_REQUIRED
+
Upgrade to SSL/TLS required
+
HTTP_URI_TOO_LONG
+
URI too long
+
HTTP_USE_PROXY
+
Must use a proxy to access this URI
+
+

http_uri_coding_e

+

URI en/decode flags

+

Constants

+
+
HTTP_URI_CODING_ALL
+
En/decode everything
+
HTTP_URI_CODING_HOSTNAME
+
En/decode the hostname portion
+
HTTP_URI_CODING_MOST
+
En/decode all but the query
+
HTTP_URI_CODING_NONE
+
Don't en/decode anything
+
HTTP_URI_CODING_QUERY
+
En/decode the query portion
+
HTTP_URI_CODING_RESOURCE
+
En/decode the resource portion
+
HTTP_URI_CODING_USERNAME
+
En/decode the username portion
+
+

 CUPS 1.2 http_uri_status_e

+

URI separation status

+

Constants

+
+
HTTP_URI_BAD_ARGUMENTS
+
Bad arguments to function (error)
+
HTTP_URI_BAD_HOSTNAME
+
Bad hostname in URI (error)
+
HTTP_URI_BAD_PORT
+
Bad port number in URI (error)
+
HTTP_URI_BAD_RESOURCE
+
Bad resource in URI (error)
+
HTTP_URI_BAD_SCHEME
+
Bad scheme in URI (error)
+
HTTP_URI_BAD_URI
+
Bad/empty URI (error)
+
HTTP_URI_BAD_USERNAME
+
Bad username in URI (error)
+
HTTP_URI_MISSING_RESOURCE
+
Missing resource in URI (warning)
+
HTTP_URI_MISSING_SCHEME
+
Missing scheme in URI (warning)
+
HTTP_URI_OK
+
URI decoded OK
+
HTTP_URI_OVERFLOW
+
URI buffer for httpAssembleURI is too small
+
HTTP_URI_UNKNOWN_SCHEME
+
Unknown scheme in URI (warning)
+
+

http_version_e

+

HTTP version numbers

+

Constants

+
+
HTTP_0_9
+
HTTP/0.9
+
HTTP_1_0
+
HTTP/1.0
+
HTTP_1_1
+
HTTP/1.1
+
+

ipp_finish_e

+

Finishings

+

Constants

+
+
IPP_FINISHINGS_BALE
+
Bale (any type)
+
IPP_FINISHINGS_BIND
+
Bind
+
IPP_FINISHINGS_BIND_BOTTOM
+
Bind on bottom
+
IPP_FINISHINGS_BIND_LEFT
+
Bind on left
+
IPP_FINISHINGS_BIND_RIGHT
+
Bind on right
+
IPP_FINISHINGS_BIND_TOP
+
Bind on top
+
IPP_FINISHINGS_BOOKLET_MAKER
+
Fold to make booklet
+
IPP_FINISHINGS_COVER
+
Add cover
+
IPP_FINISHINGS_EDGE_STITCH
+
Stitch along any side
+
IPP_FINISHINGS_EDGE_STITCH_BOTTOM
+
Stitch along bottom edge
+
IPP_FINISHINGS_EDGE_STITCH_LEFT
+
Stitch along left side
+
IPP_FINISHINGS_EDGE_STITCH_RIGHT
+
Stitch along right side
+
IPP_FINISHINGS_EDGE_STITCH_TOP
+
Stitch along top edge
+
IPP_FINISHINGS_FOLD
+
Fold (any type)
+
IPP_FINISHINGS_JOB_OFFSET
+
Offset for binding (any type)
+
IPP_FINISHINGS_NONE
+
No finishing
+
IPP_FINISHINGS_PUNCH
+
Punch (any location/count)
+
IPP_FINISHINGS_SADDLE_STITCH
+
Staple interior
+
IPP_FINISHINGS_STAPLE
+
Staple (any location)
+
IPP_FINISHINGS_STAPLE_BOTTOM_LEFT
+
Staple bottom left corner
+
IPP_FINISHINGS_STAPLE_BOTTOM_RIGHT
+
Staple bottom right corner
+
IPP_FINISHINGS_STAPLE_DUAL_BOTTOM
+
Two staples on bottom
+
IPP_FINISHINGS_STAPLE_DUAL_LEFT
+
Two staples on left
+
IPP_FINISHINGS_STAPLE_DUAL_RIGHT
+
Two staples on right
+
IPP_FINISHINGS_STAPLE_DUAL_TOP
+
Two staples on top
+
IPP_FINISHINGS_STAPLE_TOP_LEFT
+
Staple top left corner
+
IPP_FINISHINGS_STAPLE_TOP_RIGHT
+
Staple top right corner
+
IPP_FINISHINGS_TRIM
+
Trim (any type)
+
+

ipp_jstate_e

+

Job states

+

Constants

+
+
IPP_JOB_ABORTED
+
Job has aborted due to error
+
IPP_JOB_CANCELED
+
Job has been canceled
+
IPP_JOB_COMPLETED
+
Job has completed successfully
+
IPP_JOB_HELD
+
Job is held for printing
+
IPP_JOB_PENDING
+
Job is waiting to be printed
+
IPP_JOB_PROCESSING
+
Job is currently printing
+
IPP_JOB_STOPPED
+
Job has been stopped
+
+

ipp_op_e

+

IPP operations

+

Constants

+
+
CUPS_ACCEPT_JOBS
+
Accept new jobs on a printer
+
CUPS_ADD_MODIFY_CLASS
+
Add or modify a class
+
CUPS_ADD_MODIFY_PRINTER
+
Add or modify a printer
+
CUPS_AUTHENTICATE_JOB  CUPS 1.2/Mac OS X 10.5 
+
Authenticate a job
+
CUPS_DELETE_CLASS
+
Delete a class
+
CUPS_DELETE_PRINTER
+
Delete a printer
+
CUPS_GET_CLASSES  DEPRECATED 
+
Get a list of classes
+
CUPS_GET_DEFAULT
+
Get the default printer
+
CUPS_GET_DEVICES
+
Get a list of supported devices
+
CUPS_GET_DOCUMENT  CUPS 1.4/Mac OS X 10.6 
+
Get a document file
+
CUPS_GET_PPD  CUPS 1.3/Mac OS X 10.5 
+
Get a PPD file
+
CUPS_GET_PPDS
+
Get a list of supported drivers
+
CUPS_GET_PRINTERS
+
Get a list of printers and/or classes
+
CUPS_MOVE_JOB
+
Move a job to a different printer
+
CUPS_REJECT_JOBS
+
Reject new jobs on a printer
+
CUPS_SET_DEFAULT
+
Set the default printer
+
IPP_CANCEL_JOB
+
Cancel a job
+
IPP_CANCEL_JOBS
+
Cancel-Jobs
+
IPP_CANCEL_MY_JOBS
+
Cancel-My-Jobs
+
IPP_CANCEL_SUBSCRIPTION  CUPS 1.2/Mac OS X 10.5 
+
Cancel a subscription
+
IPP_CLOSE_JOB
+
Close-Job
+
IPP_CREATE_JOB
+
Create an empty print job
+
IPP_CREATE_JOB_SUBSCRIPTION  CUPS 1.2/Mac OS X 10.5 
+
Create a job subscription
+
IPP_CREATE_PRINTER_SUBSCRIPTION  CUPS 1.2/Mac OS X 10.5 
+
Create a printer subscription
+
IPP_DISABLE_PRINTER
+
Stop a printer
+
IPP_ENABLE_PRINTER
+
Start a printer
+
IPP_GET_JOBS
+
Get a list of jobs
+
IPP_GET_JOB_ATTRIBUTES
+
Get job attributes
+
IPP_GET_NOTIFICATIONS  CUPS 1.2/Mac OS X 10.5 
+
Get notification events
+
IPP_GET_PRINTER_ATTRIBUTES
+
Get printer attributes
+
IPP_GET_PRINTER_SUPPORTED_VALUES
+
Get supported attribute values
+
IPP_GET_SUBSCRIPTIONS  CUPS 1.2/Mac OS X 10.5 
+
Get list of subscriptions
+
IPP_GET_SUBSCRIPTION_ATTRIBUTES  CUPS 1.2/Mac OS X 10.5 
+
Get subscription attributes
+
IPP_HOLD_JOB
+
Hold a job for printing
+
IPP_PAUSE_PRINTER
+
Stop a printer
+
IPP_PRINT_JOB
+
Print a single file
+
IPP_PURGE_JOBS
+
Cancel all jobs
+
IPP_RELEASE_JOB
+
Release a job for printing
+
IPP_RENEW_SUBSCRIPTION  CUPS 1.2/Mac OS X 10.5 
+
Renew a printer subscription
+
IPP_RESTART_JOB
+
Reprint a job
+
IPP_RESUBMIT_JOB
+
Resubmit-Job
+
IPP_RESUME_PRINTER
+
Start a printer
+
IPP_SEND_DOCUMENT
+
Add a file to a job
+
IPP_SET_JOB_ATTRIBUTES
+
Set job attributes
+
IPP_VALIDATE_JOB
+
Validate job options
+
+

ipp_orient_e

+

Orientation values

+

Constants

+
+
IPP_LANDSCAPE
+
90 degrees counter-clockwise
+
IPP_PORTRAIT
+
No rotation
+
IPP_REVERSE_LANDSCAPE
+
90 degrees clockwise
+
IPP_REVERSE_PORTRAIT
+
180 degrees
+
+

ipp_pstate_e

+

Printer states

+

Constants

+
+
IPP_PRINTER_IDLE
+
Printer is idle
+
IPP_PRINTER_PROCESSING
+
Printer is working
+
IPP_PRINTER_STOPPED
+
Printer is stopped
+
+

ipp_quality_e

+

Qualities

+

Constants

+
+
IPP_QUALITY_DRAFT
+
Draft quality
+
IPP_QUALITY_HIGH
+
High quality
+
IPP_QUALITY_NORMAL
+
Normal quality
+
+

ipp_res_e

+

Resolution units

+

Constants

+
+
IPP_RES_PER_CM
+
Pixels per centimeter
+
IPP_RES_PER_INCH
+
Pixels per inch
+
+

ipp_state_e

+

IPP states

+

Constants

+
+
IPP_ATTRIBUTE
+
One or more attributes need to be sent/received
+
IPP_DATA
+
IPP request data needs to be sent/received
+
IPP_ERROR
+
An error occurred
+
IPP_HEADER
+
The request header needs to be sent/received
+
IPP_IDLE
+
Nothing is happening/request completed
+
+

ipp_status_e

+

IPP status codes

+

Constants

+
+
CUPS_SEE_OTHER
+
cups-see-other
+
IPP_ATTRIBUTES
+
client-error-attributes-or-values-not-supported
+
IPP_ATTRIBUTES_NOT_SETTABLE
+
client-error-attributes-not-settable
+
IPP_AUTHENTICATION_CANCELED  CUPS 1.5/Mac OS X 10.7 
+
Authentication canceled by user
+
IPP_BAD_REQUEST
+
client-error-bad-request
+
IPP_CHARSET
+
client-error-charset-not-supported
+
IPP_COMPRESSION_ERROR
+
client-error-compression-error
+
IPP_COMPRESSION_NOT_SUPPORTED
+
client-error-compression-not-supported
+
IPP_CONFLICT
+
client-error-conflicting-attributes
+
IPP_DEVICE_ERROR
+
server-error-device-error
+
IPP_DOCUMENT_ACCESS_ERROR
+
client-error-document-access-error
+
IPP_DOCUMENT_FORMAT
+
client-error-document-format-not-supported
+
IPP_DOCUMENT_FORMAT_ERROR
+
client-error-document-format-error
+
IPP_ERROR_JOB_CANCELED
+
server-error-job-canceled
+
IPP_FORBIDDEN
+
client-error-forbidden
+
IPP_GONE
+
client-error-gone
+
IPP_IGNORED_ALL_NOTIFICATIONS
+
client-error-ignored-all-notifications
+
IPP_IGNORED_ALL_SUBSCRIPTIONS
+
client-error-ignored-all-subscriptions
+
IPP_INTERNAL_ERROR
+
server-error-internal-error
+
IPP_MULTIPLE_JOBS_NOT_SUPPORTED
+
server-error-multiple-document-jobs-not-supported
+
IPP_NOT_ACCEPTING
+
server-error-not-accepting-jobs
+
IPP_NOT_AUTHENTICATED
+
client-error-not-authenticated
+
IPP_NOT_AUTHORIZED
+
client-error-not-authorized
+
IPP_NOT_FOUND
+
client-error-not-found
+
IPP_NOT_POSSIBLE
+
client-error-not-possible
+
IPP_OK
+
successful-ok
+
IPP_OK_BUT_CANCEL_SUBSCRIPTION
+
successful-ok-but-cancel-subscription
+
IPP_OK_CONFLICT
+
successful-ok-conflicting-attributes
+
IPP_OK_EVENTS_COMPLETE
+
successful-ok-events-complete
+
IPP_OK_IGNORED_NOTIFICATIONS
+
successful-ok-ignored-notifications
+
IPP_OK_IGNORED_SUBSCRIPTIONS
+
successful-ok-ignored-subscriptions
+
IPP_OK_SUBST
+
successful-ok-ignored-or-substituted-attributes
+
IPP_OK_TOO_MANY_EVENTS
+
successful-ok-too-many-events
+
IPP_OPERATION_NOT_SUPPORTED
+
server-error-operation-not-supported
+
IPP_PKI_ERROR  CUPS 1.5/Mac OS X 10.7 
+
Error negotiating a secure connection
+
IPP_PRINTER_BUSY
+
server-error-busy
+
IPP_PRINTER_IS_DEACTIVATED
+
server-error-printer-is-deactivated
+
IPP_PRINT_SUPPORT_FILE_NOT_FOUND
+
client-error-print-support-file-not-found
+
IPP_REQUEST_ENTITY
+
client-error-request-entity-too-large
+
IPP_REQUEST_VALUE
+
client-error-request-value-too-long
+
IPP_SERVICE_UNAVAILABLE
+
server-error-service-unavailable
+
IPP_TEMPORARY_ERROR
+
server-error-temporary-error
+
IPP_TIMEOUT
+
client-error-timeout
+
IPP_TOO_MANY_SUBSCRIPTIONS
+
client-error-too-many-subscriptions
+
IPP_UPGRADE_REQUIRED
+
TLS upgrade required
+
IPP_URI_SCHEME
+
client-error-uri-scheme-not-supported
+
IPP_VERSION_NOT_SUPPORTED
+
server-error-version-not-supported
+
+

ipp_tag_e

+

Format tags for attributes

+

Constants

+
+
IPP_TAG_ADMINDEFINE
+
Admin-defined value
+
IPP_TAG_BEGIN_COLLECTION
+
Beginning of collection value
+
IPP_TAG_BOOLEAN
+
Boolean value
+
IPP_TAG_CHARSET
+
Character set value
+
IPP_TAG_COPY
+
Bitflag for copied attribute values
+
IPP_TAG_DATE
+
Date/time value
+
IPP_TAG_DEFAULT
+
Default value
+
IPP_TAG_DELETEATTR
+
Delete-attribute value
+
IPP_TAG_END
+
End-of-attributes
+
IPP_TAG_END_COLLECTION
+
End of collection value
+
IPP_TAG_ENUM
+
Enumeration value
+
IPP_TAG_EVENT_NOTIFICATION
+
Event group
+
IPP_TAG_INTEGER
+
Integer value
+
IPP_TAG_JOB
+
Job group
+
IPP_TAG_KEYWORD
+
Keyword value
+
IPP_TAG_LANGUAGE
+
Language value
+
IPP_TAG_MASK
+
Mask for copied attribute values
+
IPP_TAG_MEMBERNAME
+
Collection member name value
+
IPP_TAG_MIMETYPE
+
MIME media type value
+
IPP_TAG_NAME
+
Name value
+
IPP_TAG_NAMELANG
+
Name-with-language value
+
IPP_TAG_NOTSETTABLE
+
Not-settable value
+
IPP_TAG_NOVALUE
+
No-value value
+
IPP_TAG_OPERATION
+
Operation group
+
IPP_TAG_PRINTER
+
Printer group
+
IPP_TAG_RANGE
+
Range value
+
IPP_TAG_RESOLUTION
+
Resolution value
+
IPP_TAG_STRING
+
Octet string value
+
IPP_TAG_SUBSCRIPTION
+
Subscription group
+
IPP_TAG_TEXT
+
Text value
+
IPP_TAG_TEXTLANG
+
Text-with-language value
+
IPP_TAG_UNKNOWN
+
Unknown value
+
IPP_TAG_UNSUPPORTED_GROUP
+
Unsupported attributes group
+
IPP_TAG_UNSUPPORTED_VALUE
+
Unsupported value
+
IPP_TAG_URI
+
URI value
+
IPP_TAG_URISCHEME
+
URI scheme value
+
IPP_TAG_ZERO
+
Zero tag - used for separators
+
+
+ + diff --git a/doc/help/api-mime.html b/doc/help/api-mime.html new file mode 100644 index 0000000..c273376 --- /dev/null +++ b/doc/help/api-mime.html @@ -0,0 +1,833 @@ + + + + + MIME API + + + + + + +
+ + +

MIME API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/mime.h
Library-lcupsmime
See AlsoProgramming: Introduction to CUPS Programming
+

Contents

+ + + +

Overview

+ +

The MIME API provides file typing and conversion services for CUPS.

+

Functions

+

mimeAddFilter

+

Add a filter to the current MIME database.

+

+mime_filter_t *mimeAddFilter (
+    mime_t *mime,
+    mime_type_t *src,
+    mime_type_t *dst,
+    int cost,
+    const char *filter
+);

+

Parameters

+
+
mime
+
MIME database
+
src
+
Source type
+
dst
+
Destination type
+
cost
+
Relative time/resource cost
+
filter
+
Filter program to run
+
+

Return Value

+

New filter

+

mimeAddType

+

Add a MIME type to a database.

+

+mime_type_t *mimeAddType (
+    mime_t *mime,
+    const char *super,
+    const char *type
+);

+

Parameters

+
+
mime
+
MIME database
+
super
+
Super-type name
+
type
+
Type name
+
+

Return Value

+

New (or existing) MIME type

+

mimeAddTypeRule

+

Add a detection rule for a file type.

+

+int mimeAddTypeRule (
+    mime_type_t *mt,
+    const char *rule
+);

+

Parameters

+
+
mt
+
Type to add to
+
rule
+
Rule to add
+
+

Return Value

+

0 on success, -1 on failure

+

mimeDelete

+

Delete (free) a MIME database.

+

+void mimeDelete (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

mimeDeleteFilter

+

Delete a filter from the MIME database.

+

+void mimeDeleteFilter (
+    mime_t *mime,
+    mime_filter_t *filter
+);

+

Parameters

+
+
mime
+
MIME database
+
filter
+
Filter
+
+

mimeDeleteType

+

Delete a type from the MIME database.

+

+void mimeDeleteType (
+    mime_t *mime,
+    mime_type_t *mt
+);

+

Parameters

+
+
mime
+
MIME database
+
mt
+
Type
+
+

mimeFileType

+

Determine the type of a file.

+

+mime_type_t *mimeFileType (
+    mime_t *mime,
+    const char *pathname,
+    const char *filename,
+    int *compression
+);

+

Parameters

+
+
mime
+
MIME database
+
pathname
+
Name of file to check on disk
+
filename
+
Original filename or NULL
+
compression
+
Is the file compressed?
+
+

Return Value

+

Type of file

+

mimeFilter

+

Find the fastest way to convert from one type to another.

+

+cups_array_t *mimeFilter (
+    mime_t *mime,
+    mime_type_t *src,
+    mime_type_t *dst,
+    int *cost
+);

+

Parameters

+
+
mime
+
MIME database
+
src
+
Source file type
+
dst
+
Destination file type
+
cost
+
Cost of filters
+
+

Return Value

+

Array of filters to run

+

mimeFilter2

+

Find the fastest way to convert from one type to another, +including file size.

+

+cups_array_t *mimeFilter2 (
+    mime_t *mime,
+    mime_type_t *src,
+    size_t srcsize,
+    mime_type_t *dst,
+    int *cost
+);

+

Parameters

+
+
mime
+
MIME database
+
src
+
Source file type
+
srcsize
+
Size of source file
+
dst
+
Destination file type
+
cost
+
Cost of filters
+
+

Return Value

+

Array of filters to run

+

mimeFilterLookup

+

Lookup a filter.

+

+mime_filter_t *mimeFilterLookup (
+    mime_t *mime,
+    mime_type_t *src,
+    mime_type_t *dst
+);

+

Parameters

+
+
mime
+
MIME database
+
src
+
Source type
+
dst
+
Destination type
+
+

Return Value

+

Filter for src->dst

+

mimeFirstFilter

+

Get the first filter in the MIME database.

+

+mime_filter_t *mimeFirstFilter (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Filter or NULL

+

mimeFirstType

+

Get the first type in the MIME database.

+

+mime_type_t *mimeFirstType (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Type or NULL

+

mimeLoad

+

Create a new MIME database from disk.

+

+mime_t *mimeLoad (
+    const char *pathname,
+    const char *filterpath
+);

+

Parameters

+
+
pathname
+
Directory to load
+
filterpath
+
Directory to load
+
+

Return Value

+

New MIME database

+

Discussion

+

This function uses mimeLoadFilters and mimeLoadTypes to +create a MIME database from a single directory.

+

mimeLoadFilters

+

Load filter definitions from disk.

+

+mime_t *mimeLoadFilters (
+    mime_t *mime,
+    const char *pathname,
+    const char *filterpath
+);

+

Parameters

+
+
mime
+
MIME database
+
pathname
+
Directory to load from
+
filterpath
+
Default filter program directory
+
+

Return Value

+

MIME database

+

Discussion

+

This function loads all of the .convs files from the specified directory. +Use mimeLoadTypes to load all types before you load the filters.

+

mimeLoadTypes

+

Load type definitions from disk.

+

+mime_t *mimeLoadTypes (
+    mime_t *mime,
+    const char *pathname
+);

+

Parameters

+
+
mime
+
MIME database or NULL to create a new one
+
pathname
+
Directory to load from
+
+

Return Value

+

MIME database

+

Discussion

+

This function loads all of the .types files from the specified directory. +Use mimeLoadFilters to load all filters after you load the types.

+

mimeNew

+

Create a new, empty MIME database.

+

+mime_t *mimeNew (void);

+

Return Value

+

MIME database

+

mimeNextFilter

+

Get the next filter in the MIME database.

+

+mime_filter_t *mimeNextFilter (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Filter or NULL

+

mimeNextType

+

Get the next type in the MIME database.

+

+mime_type_t *mimeNextType (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Type or NULL

+

mimeNumFilters

+

Next type

+

+int mimeNumFilters (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Get the number of filters in a MIME database.

+

mimeNumTypes

+

MIME database

+

+int mimeNumTypes (
+    mime_t *mime
+);

+

Parameters

+
+
mime
+
MIME database
+
+

Return Value

+

Get the number of types in a MIME database.

+

mimeSetErrorCallback

+

Set the callback for error messages.

+

+void mimeSetErrorCallback (
+    mime_t *mime,
+    mime_error_cb_t cb,
+    void *ctx
+);

+

Parameters

+
+
mime
+
MIME database
+
cb
+
Callback function
+
ctx
+
Context pointer for callback
+
+

mimeType

+

Lookup a file type.

+

+mime_type_t *mimeType (
+    mime_t *mime,
+    const char *super,
+    const char *type
+);

+

Parameters

+
+
mime
+
MIME database
+
super
+
Super-type name
+
type
+
Type name
+
+

Return Value

+

Matching file type definition

+

Data Types

+

const

+

MIME Database

+

+typedef void (*constmime_error_cb_t)(void *; +

+

mime_filter_t

+

MIME Conversion Filter Data

+

+typedef struct _mime_filter_s mime_filter_t; +

+

mime_magic_t

+

MIME Magic Data

+

+typedef struct _mime_magic_s mime_magic_t; +

+

mime_op_t

+

Types/structures...

+

+typedef enum mime_op_t; +

+

mime_t

+

MIME Database

+

+typedef struct _mime_s mime_t; +

+

mime_type_t

+

MIME Type Data

+

+typedef struct _mime_type_s mime_type_t; +

+
+ + diff --git a/doc/help/api-overview.html b/doc/help/api-overview.html new file mode 100644 index 0000000..278df7c --- /dev/null +++ b/doc/help/api-overview.html @@ -0,0 +1,501 @@ + + + + + Introduction to CUPS Programming + + + + + + +
+ + +

Introduction to CUPS Programming

+ +
+ + + + + + + + + + + + + + + + +
Headerscups/cups.h
+ cups/array.h
+ cups/backend.h
+ cups/dir.h
+ cups/file.h
+ cups/ppd.h
+ cups/raster.h
+ cups/sidechannel.h
Libraries-lcups
+ -lcupsimage
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Array API
+ Programming: CUPS API
+ Programming: File and Directory APIs
+ Programming: HTTP and IPP APIs
+ Programming: PPD API
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
+

Contents

+ + + +

Overview

+ +

CUPS provides two libraries that interface with the different parts of the +printing system. The "cups" library provides all of the common application and +filter functions while the "cupsimage" library provides all of the imaging +functions used in raster printer drivers. The "cups" library functions are +accessed by including the <cups/cups.h> header, while +"cupsimage" functions are found in the <cups/raster.h> +header.

+ +

Compiling Programs

+ +

The CUPS libraries can be used from any C, C++, or Objective C program. +The method of compiling against the libraries varies depending on the +operating system and installation of CUPS. The following sections show how +to compile a simple program (shown below) in two common environments.

+ +

The following simple program lists the available printers on the system:

+ +
+#include <stdio.h>
+#include <cups/cups.h>
+
+int main(void)
+{
+  int i;
+  cups_dest_t *dests, *dest;
+  int num_dests = cupsGetDests(&dests);
+
+  for (i = num_dests, dest = dests; i > 0; i --, dest ++)
+  {
+    if (dest->instance)
+      printf("%s/%s\n", dest->name, dest->instance);
+    else
+      puts(dest->name);
+  }
+
+  return (0);
+}
+
+ +

Compiling with Xcode

+ +

In Xcode, choose New Project... from the File menu, +then select the Standard Tool project type under Command Line +Utility. Click Next and choose a project directory. Click +Next to create the project.

+ +

In the project window, double-click on the Targets group and +control-click on the simple target to show the context menu. Choose +Existing Framework... from the Add submenu. When the file +chooser sheet appears, press the / key and enter "/usr/lib". Scroll +down the file list and select the libcups.dylib file. Click the +Add button in the file chooser and attributes sheets.

+ +

In the project window, double-click on the main.c source file. +Replace the template source code with the listing above and save it. Click the +Build and Go button to build the sample program and run it.

+ +

Compiling with GCC

+ +

From the command-line, create a file called sample.c using your +favorite editor and then run the following command to compile it with GCC and +run it:

+ +
+gcc -o simple `cups-config --cflags` simple.c `cups-config --libs`
+./simple
+
+ +

The cups-config command provides the compiler flags +("cups-config --cflags") and libraries ("cups-config --libs") needed for the +local system.

+ +

Where to Go Next

+ +

If you are developing a print filter, driver, or backend, see the +Filter and Backend Programming +guide. Raster printer driver developers should also read the +Raster API reference.

+
+ + diff --git a/doc/help/api-ppd.html b/doc/help/api-ppd.html new file mode 100644 index 0000000..ae32165 --- /dev/null +++ b/doc/help/api-ppd.html @@ -0,0 +1,2189 @@ + + + + + PPD API + + + + + + +
+ + +

PPD API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/ppd.h
Library-lcups
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Specifications: CUPS PPD Extensions
+

Contents

+ + + +

Overview

+ +

The CUPS PPD API provides read-only access the data in PostScript Printer +Description ("PPD") files which are used for all printers with a driver. With +it you can obtain the data necessary to display printer options to users, mark +option choices and check for conflicting choices, and output marked choices in +PostScript output. The ppd_file_t +structure contains all of the information in a PPD file.

+ +
Note: + +

The CUPS PPD API uses the terms "option" and "choice" instead of the Adobe +terms "MainKeyword" and "OptionKeyword" to refer to specific printer options and +features. CUPS also treats option ("MainKeyword") and choice ("OptionKeyword") +values as case-insensitive strings, so option "InputSlot" and choice "Upper" +are equivalent to "inputslot" and "upper", respectively.

+
+ +

Loading a PPD File

+ +

The ppdOpenFile function "opens" a +PPD file and loads it into memory. For example, the following code opens the +current printer's PPD file in a CUPS filter:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+
+ +

The return value is a pointer to a new +ppd_file_t structure or NULL +if the PPD file does not exist or cannot be loaded. The +ppdClose function frees the memory used +by the structure:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdClose(ppd);
+
+ +

Once closed, pointers to the ppd_file_t +structure and any data in it will no longer be valid.

+ +

Options and Groups

+ +

PPD files support multiple options, which are stored in arrays of +ppd_option_t and +ppd_choice_t structures.

+ +

Each option in turn is associated with a group stored in a +ppd_group_t structure. Groups can be +specified in the PPD file; if an option is not associated with a group +then it is put in an automatically-generated "General" group. Groups can also +have sub-groups, however CUPS currently ignores sub-groups because of past +abuses of this functionality.

+ +

Option choices are selected by marking them using one of three functions. The +first is ppdMarkDefaults which +selects all of the default options in the PPD file:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdMarkDefaults(ppd);
+
+ +

The second is ppdMarkOption +which selects a single option choice in the PPD file. For example, the following +code selects the upper paper tray:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+ppdMarkOption(ppd, "InputSlot", "Upper");
+
+ +

The last function is +cupsMarkOptions which selects +multiple option choices in the PPD file from an array of CUPS options, mapping +IPP attributes like "media" and "sides" to their corresponding PPD options. You +typically use this function in a print filter with +cupsParseOptions and +ppdMarkDefaults to select all of +the option choices needed for the job, for example:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd = ppdOpenFile(getenv("PPD"));
+cups_option_t *options = NULL;
+int num_options = cupsParseOptions(argv[5], 0, &options);
+
+ppdMarkDefaults(ppd);
+cupsMarkOptions(ppd, num_options, options);
+cupsFreeOptions(num_options, options);
+
+ +

Constraints

+ +

PPD files support specification of conflict conditions, called +constraints, between different options. Constraints are stored in an array of +ppd_const_t structures which specify +the options and choices that conflict with each other. The +ppdConflicts function tells you +how many of the selected options are incompatible. Since constraints are +normally specified in pairs, the returned value is typically an even number.

+ +

Page Sizes

+ +

Page sizes are special options which have physical dimensions and margins +associated with them. The size information is stored in +ppd_size_t structures and is available +by looking up the named size with the +ppdPageSize function. The page size and +margins are returned in units called points; there are 72 points per inch. If +you pass NULL for the size, the currently selected size is +returned:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+ppd_size_t *size = ppdPageSize(ppd, NULL);
+
+ +

Besides the standard page sizes listed in a PPD file, some printers +support variable or custom page sizes. Custom page sizes are supported if the +variables_sizes member of the +ppd_file_t structure is non-zero. +The custom_min, custom_max, and +custom_margins members of the +ppd_file_t structure define the limits +of the printable area. To get the resulting media size, use a page size string +of the form "Custom.widthxlength", where "width" and "length" are +in points. Custom page size names can also be specified in inches +("Custom.widthxheightin"), centimeters +("Custom.widthxheightcm"), or millimeters +("Custom.widthxheightmm"):

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+
+/* Get an 576x720 point custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.576x720");
+
+/* Get an 8x10 inch custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.8x10in");
+
+/* Get a 100x200 millimeter custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.100x200mm");
+
+/* Get a 12.7x34.5 centimeter custom page size */
+ppd_size_t *size = ppdPageSize(ppd, "Custom.12.7x34.5cm");
+
+ +

If the PPD does not support variable page sizes, the +ppdPageSize function will return +NULL.

+ +

Attributes

+ +

Every PPD file is composed of one or more attributes. Most of these +attributes are used to define groups, options, choices, and page sizes, +however several informational attributes may be present which you can access +in your program or filter. Attributes normally look like one of the following +examples in a PPD file:

+ +
+*name: "value"
+*name spec: "value"
+*name spec/text: "value"
+
+ +

The ppdFindAttr and +ppdFindNextAttr functions find the +first and next instances, respectively, of the named attribute with the given +"spec" string and return a ppd_attr_t +structure. If you provide a NULL specifier string, all attributes with the +given name will be returned. For example, the following code lists all of the +Product attributes in a PPD file:

+ +
+#include <cups/ppd.h>
+
+ppd_file_t *ppd;
+ppd_attr_t *attr;
+
+for (attr = ppdFindAttr(ppd, "Product", NULL);
+     attr != NULL;
+     attr = ppdFindNextAttr(ppd, "Product", NULL))
+  puts(attr->value);
+
+

Functions

+

 CUPS 1.4/Mac OS X 10.6 cupsGetConflicts

+

Get a list of conflicting options in a marked PPD.

+

+int cupsGetConflicts (
+    ppd_file_t *ppd,
+    const char *option,
+    const char *choice,
+    cups_option_t **options
+);

+

Parameters

+
+
ppd
+
PPD file
+
option
+
Option to test
+
choice
+
Choice to test
+
options
+
Conflicting options
+
+

Return Value

+

Number of conflicting options

+

Discussion

+

This function gets a list of options that would conflict if "option" and +"choice" were marked in the PPD. You would typically call this function +after marking the currently selected options in the PPD in order to +determine whether a new option selection would cause a conflict.
+
+The number of conflicting options are returned with "options" pointing to +the conflicting options. The returned option array must be freed using +cupsFreeOptions. + +

+

cupsMarkOptions

+

Mark command-line options in a PPD file.

+

+int cupsMarkOptions (
+    ppd_file_t *ppd,
+    int num_options,
+    cups_option_t *options
+);

+

Parameters

+
+
ppd
+
PPD file
+
num_options
+
Number of options
+
options
+
Options
+
+

Return Value

+

1 if conflicts exist, 0 otherwise

+

Discussion

+

This function maps the IPP "finishings", "media", "mirror", +"multiple-document-handling", "output-bin", "print-color-mode", +"print-quality", "printer-resolution", and "sides" attributes to their +corresponding PPD options and choices.

+

 CUPS 1.4/Mac OS X 10.6 cupsResolveConflicts

+

Resolve conflicts in a marked PPD.

+

+int cupsResolveConflicts (
+    ppd_file_t *ppd,
+    const char *option,
+    const char *choice,
+    int *num_options,
+    cups_option_t **options
+);

+

Parameters

+
+
ppd
+
PPD file
+
option
+
Newly selected option or NULL for none
+
choice
+
Newly selected choice or NULL for none
+
num_options
+
Number of additional selected options
+
options
+
Additional selected options
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

This function attempts to resolve any conflicts in a marked PPD, returning +a list of option changes that are required to resolve them. On input, +"num_options" and "options" contain any pending option changes that have +not yet been marked, while "option" and "choice" contain the most recent +selection which may or may not be in "num_options" or "options".
+
+On successful return, "num_options" and "options" are updated to contain +"option" and "choice" along with any changes required to resolve conflicts +specified in the PPD file and 1 is returned.
+
+If option conflicts cannot be resolved, "num_options" and "options" are not +changed and 0 is returned.
+
+When resolving conflicts, cupsResolveConflicts does not consider +changes to the current page size (media, PageSize, and +PageRegion) or to the most recent option specified in "option". +Thus, if the only way to resolve a conflict is to change the page size +or the option the user most recently changed, cupsResolveConflicts +will return 0 to indicate it was unable to resolve the conflicts.
+
+The cupsResolveConflicts function uses one of two sources of option +constraint information. The preferred constraint information is defined by +cupsUIConstraints and cupsUIResolver attributes - in this +case, the PPD file provides constraint resolution actions.
+
+The backup constraint information is defined by the +UIConstraints and NonUIConstraints attributes. These +constraints are resolved algorithmically by first selecting the default +choice for the conflicting option, then iterating over all possible choices +until a non-conflicting option choice is found. + +

+

ppdClose

+

Free all memory used by the PPD file.

+

+void ppdClose (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD file record
+
+

ppdCollect

+

Collect all marked options that reside in the specified +section.

+

+int ppdCollect (
+    ppd_file_t *ppd,
+    ppd_section_t section,
+    ppd_choice_t ***choices
+);

+

Parameters

+
+
ppd
+
PPD file data
+
section
+
Section to collect
+
choices
+
Pointers to choices
+
+

Return Value

+

Number of options marked

+

Discussion

+

The choices array should be freed using free when you are +finished with it.

+

 CUPS 1.2/Mac OS X 10.5 ppdCollect2

+

Collect all marked options that reside in the +specified section and minimum order.

+

+int ppdCollect2 (
+    ppd_file_t *ppd,
+    ppd_section_t section,
+    float min_order,
+    ppd_choice_t ***choices
+);

+

Parameters

+
+
ppd
+
PPD file data
+
section
+
Section to collect
+
min_order
+
Minimum OrderDependency value
+
choices
+
Pointers to choices
+
+

Return Value

+

Number of options marked

+

Discussion

+

The choices array should be freed using free when you are +finished with it. + +

+

ppdConflicts

+

Check to see if there are any conflicts among the +marked option choices.

+

+int ppdConflicts (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD to check
+
+

Return Value

+

Number of conflicts found

+

Discussion

+

The returned value is the same as returned by ppdMarkOption.

+

ppdEmit

+

Emit code for marked options to a file.

+

+int ppdEmit (
+    ppd_file_t *ppd,
+    FILE *fp,
+    ppd_section_t section
+);

+

Parameters

+
+
ppd
+
PPD file record
+
fp
+
File to write to
+
section
+
Section to write
+
+

Return Value

+

0 on success, -1 on failure

+

 CUPS 1.2/Mac OS X 10.5 ppdEmitAfterOrder

+

Emit a subset of the code for marked options to a file.

+

+int ppdEmitAfterOrder (
+    ppd_file_t *ppd,
+    FILE *fp,
+    ppd_section_t section,
+    int limit,
+    float min_order
+);

+

Parameters

+
+
ppd
+
PPD file record
+
fp
+
File to write to
+
section
+
Section to write
+
limit
+
Non-zero to use min_order
+
min_order
+
Lowest OrderDependency
+
+

Return Value

+

0 on success, -1 on failure

+

Discussion

+

When "limit" is non-zero, this function only emits options whose +OrderDependency value is greater than or equal to "min_order".
+
+When "limit" is zero, this function is identical to ppdEmit(). + +

+

ppdEmitFd

+

Emit code for marked options to a file.

+

+int ppdEmitFd (
+    ppd_file_t *ppd,
+    int fd,
+    ppd_section_t section
+);

+

Parameters

+
+
ppd
+
PPD file record
+
fd
+
File to write to
+
section
+
Section to write
+
+

Return Value

+

0 on success, -1 on failure

+

ppdEmitJCL

+

Emit code for JCL options to a file.

+

+int ppdEmitJCL (
+    ppd_file_t *ppd,
+    FILE *fp,
+    int job_id,
+    const char *user,
+    const char *title
+);

+

Parameters

+
+
ppd
+
PPD file record
+
fp
+
File to write to
+
job_id
+
Job ID
+
user
+
Username
+
title
+
Title
+
+

Return Value

+

0 on success, -1 on failure

+

 CUPS 1.2/Mac OS X 10.5 ppdEmitJCLEnd

+

Emit JCLEnd code to a file.

+

+int ppdEmitJCLEnd (
+    ppd_file_t *ppd,
+    FILE *fp
+);

+

Parameters

+
+
ppd
+
PPD file record
+
fp
+
File to write to
+
+

Return Value

+

0 on success, -1 on failure

+

 CUPS 1.2/Mac OS X 10.5 ppdEmitString

+

Get a string containing the code for marked options.

+

+char *ppdEmitString (
+    ppd_file_t *ppd,
+    ppd_section_t section,
+    float min_order
+);

+

Parameters

+
+
ppd
+
PPD file record
+
section
+
Section to write
+
min_order
+
Lowest OrderDependency
+
+

Return Value

+

String containing option code or NULL if there is no option code

+

Discussion

+

When "min_order" is greater than zero, this function only includes options +whose OrderDependency value is greater than or equal to "min_order". +Otherwise, all options in the specified section are included in the +returned string.
+
+The return string is allocated on the heap and should be freed using +free when you are done with it. + +

+

 CUPS 1.1.19/Mac OS X 10.3 ppdErrorString

+

Returns the text assocated with a status.

+

+const char *ppdErrorString (
+    ppd_status_t status
+);

+

Parameters

+
+
status
+
PPD status
+
+

Return Value

+

Status string

+

 CUPS 1.1.19/Mac OS X 10.3 ppdFindAttr

+

Find the first matching attribute.

+

+ppd_attr_t *ppdFindAttr (
+    ppd_file_t *ppd,
+    const char *name,
+    const char *spec
+);

+

Parameters

+
+
ppd
+
PPD file data
+
name
+
Attribute name
+
spec
+
Specifier string or NULL
+
+

Return Value

+

Attribute or NULL if not found

+

ppdFindChoice

+

Return a pointer to an option choice.

+

+ppd_choice_t *ppdFindChoice (
+    ppd_option_t *o,
+    const char *choice
+);

+

Parameters

+
+
o
+
Pointer to option
+
choice
+
Name of choice
+
+

Return Value

+

Choice pointer or NULL

+

 CUPS 1.2/Mac OS X 10.5 ppdFindCustomOption

+

Find a custom option.

+

+ppd_coption_t *ppdFindCustomOption (
+    ppd_file_t *ppd,
+    const char *keyword
+);

+

Parameters

+
+
ppd
+
PPD file
+
keyword
+
Custom option name
+
+

Return Value

+

Custom option or NULL

+

 CUPS 1.2/Mac OS X 10.5 ppdFindCustomParam

+

Find a parameter for a custom option.

+

+ppd_cparam_t *ppdFindCustomParam (
+    ppd_coption_t *opt,
+    const char *name
+);

+

Parameters

+
+
opt
+
Custom option
+
name
+
Parameter name
+
+

Return Value

+

Custom parameter or NULL

+

ppdFindMarkedChoice

+

Return the marked choice for the specified option.

+

+ppd_choice_t *ppdFindMarkedChoice (
+    ppd_file_t *ppd,
+    const char *option
+);

+

Parameters

+
+
ppd
+
PPD file
+
option
+
Keyword/option name
+
+

Return Value

+

Pointer to choice or NULL

+

 CUPS 1.1.19/Mac OS X 10.3 ppdFindNextAttr

+

Find the next matching attribute.

+

+ppd_attr_t *ppdFindNextAttr (
+    ppd_file_t *ppd,
+    const char *name,
+    const char *spec
+);

+

Parameters

+
+
ppd
+
PPD file data
+
name
+
Attribute name
+
spec
+
Specifier string or NULL
+
+

Return Value

+

Attribute or NULL if not found

+

ppdFindOption

+

Return a pointer to the specified option.

+

+ppd_option_t *ppdFindOption (
+    ppd_file_t *ppd,
+    const char *option
+);

+

Parameters

+
+
ppd
+
PPD file data
+
option
+
Option/Keyword name
+
+

Return Value

+

Pointer to option or NULL

+

 CUPS 1.2/Mac OS X 10.5 ppdFirstCustomParam

+

Return the first parameter for a custom option.

+

+ppd_cparam_t *ppdFirstCustomParam (
+    ppd_coption_t *opt
+);

+

Parameters

+
+
opt
+
Custom option
+
+

Return Value

+

Custom parameter or NULL

+

 CUPS 1.2/Mac OS X 10.5 ppdFirstOption

+

Return the first option in the PPD file.

+

+ppd_option_t *ppdFirstOption (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD file
+
+

Return Value

+

First option or NULL

+

Discussion

+

Options are returned from all groups in ascending alphanumeric order. + +

+

 CUPS 1.4/Mac OS X 10.6 ppdInstallableConflict

+

Test whether an option choice conflicts with +an installable option.

+

+int ppdInstallableConflict (
+    ppd_file_t *ppd,
+    const char *option,
+    const char *choice
+);

+

Parameters

+
+
ppd
+
PPD file
+
option
+
Option
+
choice
+
Choice
+
+

Return Value

+

1 if conflicting, 0 if not conflicting

+

Discussion

+

This function tests whether a particular option choice is available based +on constraints against options in the "InstallableOptions" group. + +

+

ppdIsMarked

+

Check to see if an option is marked.

+

+int ppdIsMarked (
+    ppd_file_t *ppd,
+    const char *option,
+    const char *choice
+);

+

Parameters

+
+
ppd
+
PPD file data
+
option
+
Option/Keyword name
+
choice
+
Choice name
+
+

Return Value

+

Non-zero if option is marked

+

 CUPS 1.1.19/Mac OS X 10.3 ppdLastError

+

Return the status from the last ppdOpen*().

+

+ppd_status_t ppdLastError (
+    int *line
+);

+

Parameters

+
+
line
+
Line number
+
+

Return Value

+

Status code

+

 CUPS 1.2/Mac OS X 10.5 ppdLocalize

+

Localize the PPD file to the current locale.

+

+int ppdLocalize (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD file
+
+

Return Value

+

0 on success, -1 on error

+

Discussion

+

All groups, options, and choices are localized, as are ICC profile +descriptions, printer presets, and custom option parameters. Each +localized string uses the UTF-8 character encoding. + +

+

ppdLocalizeAttr

+

Localize an attribute.

+

+ppd_attr_t *ppdLocalizeAttr (
+    ppd_file_t *ppd,
+    const char *keyword,
+    const char *spec
+);

+

Parameters

+
+
ppd
+
PPD file
+
keyword
+
Main keyword
+
spec
+
Option keyword or NULL for none
+
+

Return Value

+

Localized attribute or NULL if none exists

+

Discussion

+

This function uses the current locale to find the localized attribute for +the given main and option keywords. If no localized version of the +attribute exists for the current locale, the unlocalized version is returned.

+

 CUPS 1.3/Mac OS X 10.5 ppdLocalizeIPPReason

+

Get the localized version of a cupsIPPReason +attribute.

+

+const char *ppdLocalizeIPPReason (
+    ppd_file_t *ppd,
+    const char *reason,
+    const char *scheme,
+    char *buffer,
+    size_t bufsize
+);

+

Parameters

+
+
ppd
+
PPD file
+
reason
+
IPP reason keyword to look up
+
scheme
+
URI scheme or NULL for text
+
buffer
+
Value buffer
+
bufsize
+
Size of value buffer
+
+

Return Value

+

Value or NULL if not found

+

Discussion

+

This function uses the current locale to find the corresponding reason +text or URI from the attribute value. If "scheme" is NULL or "text", +the returned value contains human-readable (UTF-8) text from the translation +string or attribute value. Otherwise the corresponding URI is returned.
+
+If no value of the requested scheme can be found, NULL is returned. + +

+

 CUPS 1.4/Mac OS X 10.6 ppdLocalizeMarkerName

+

Get the localized version of a marker-names +attribute value.

+

+const char *ppdLocalizeMarkerName (
+    ppd_file_t *ppd,
+    const char *name
+);

+

Parameters

+
+
ppd
+
PPD file
+
name
+
Marker name to look up
+
+

Return Value

+

Value or NULL if not found

+

Discussion

+

This function uses the current locale to find the corresponding name +text from the attribute value. If no localized text for the requested +name can be found, NULL is returned. + +

+

ppdMarkDefaults

+

Mark all default options in the PPD file.

+

+void ppdMarkDefaults (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD file record
+
+

ppdMarkOption

+

Mark an option in a PPD file and return the number of +conflicts.

+

+int ppdMarkOption (
+    ppd_file_t *ppd,
+    const char *option,
+    const char *choice
+);

+

Parameters

+
+
ppd
+
PPD file record
+
option
+
Keyword
+
choice
+
Option name
+
+

Return Value

+

Number of conflicts

+

 CUPS 1.2/Mac OS X 10.5 ppdNextCustomParam

+

Return the next parameter for a custom option.

+

+ppd_cparam_t *ppdNextCustomParam (
+    ppd_coption_t *opt
+);

+

Parameters

+
+
opt
+
Custom option
+
+

Return Value

+

Custom parameter or NULL

+

 CUPS 1.2/Mac OS X 10.5 ppdNextOption

+

Return the next option in the PPD file.

+

+ppd_option_t *ppdNextOption (
+    ppd_file_t *ppd
+);

+

Parameters

+
+
ppd
+
PPD file
+
+

Return Value

+

Next option or NULL

+

Discussion

+

Options are returned from all groups in ascending alphanumeric order. + +

+

ppdOpen

+

Read a PPD file into memory.

+

+ppd_file_t *ppdOpen (
+    FILE *fp
+);

+

Parameters

+
+
fp
+
File to read from
+
+

Return Value

+

PPD file record

+

 CUPS 1.2/Mac OS X 10.5 ppdOpen2

+

Read a PPD file into memory.

+

+ppd_file_t *ppdOpen2 (
+    cups_file_t *fp
+);

+

Parameters

+
+
fp
+
File to read from
+
+

Return Value

+

PPD file record or NULL if the PPD file could not be opened.

+

ppdOpenFd

+

Read a PPD file into memory.

+

+ppd_file_t *ppdOpenFd (
+    int fd
+);

+

Parameters

+
+
fd
+
File to read from
+
+

Return Value

+

PPD file record or NULL if the PPD file could not be opened.

+

ppdOpenFile

+

Read a PPD file into memory.

+

+ppd_file_t *ppdOpenFile (
+    const char *filename
+);

+

Parameters

+
+
filename
+
File to read from
+
+

Return Value

+

PPD file record or NULL if the PPD file could not be opened.

+

ppdPageLength

+

Get the page length for the given size.

+

+float ppdPageLength (
+    ppd_file_t *ppd,
+    const char *name
+);

+

Parameters

+
+
ppd
+
PPD file
+
name
+
Size name
+
+

Return Value

+

Length of page in points or 0.0

+

ppdPageSize

+

Get the page size record for the given size.

+

+ppd_size_t *ppdPageSize (
+    ppd_file_t *ppd,
+    const char *name
+);

+

Parameters

+
+
ppd
+
PPD file record
+
name
+
Size name
+
+

Return Value

+

Size record for page or NULL

+

 CUPS 1.4/Mac OS X 10.6 ppdPageSizeLimits

+

Return the custom page size limits.

+

+int ppdPageSizeLimits (
+    ppd_file_t *ppd,
+    ppd_size_t *minimum,
+    ppd_size_t *maximum
+);

+

Parameters

+
+
ppd
+
PPD file record
+
minimum
+
Minimum custom size
+
maximum
+
Maximum custom size
+
+

Return Value

+

1 if custom sizes are supported, 0 otherwise

+

Discussion

+

This function returns the minimum and maximum custom page sizes and printable +areas based on the currently-marked (selected) options.
+
+If the specified PPD file does not support custom page sizes, both +"minimum" and "maximum" are filled with zeroes. + +

+

ppdPageWidth

+

Get the page width for the given size.

+

+float ppdPageWidth (
+    ppd_file_t *ppd,
+    const char *name
+);

+

Parameters

+
+
ppd
+
PPD file record
+
name
+
Size name
+
+

Return Value

+

Width of page in points or 0.0

+

 CUPS 1.1.20/Mac OS X 10.4 ppdSetConformance

+

Set the conformance level for PPD files.

+

+void ppdSetConformance (
+    ppd_conform_t c
+);

+

Parameters

+
+
c
+
Conformance level
+
+

Data Types

+

 CUPS 1.1.19/Mac OS X 10.3 ppd_attr_t

+

PPD Attribute Structure

+

+typedef struct ppd_attr_s ppd_attr_t; +

+

ppd_choice_t

+

Option choices

+

+typedef struct ppd_choice_s ppd_choice_t; +

+

 CUPS 1.1.19/Mac OS X 10.3 ppd_conform_t

+

Conformance Levels

+

+typedef enum ppd_conform_e ppd_conform_t; +

+

ppd_const_t

+

Constraints

+

+typedef struct ppd_const_s ppd_const_t; +

+

 CUPS 1.2/Mac OS X 10.5 ppd_coption_t

+

Custom Option

+

+typedef struct ppd_coption_s ppd_coption_t; +

+

 CUPS 1.2/Mac OS X 10.5 ppd_cparam_t

+

Custom Parameter

+

+typedef struct ppd_cparam_s ppd_cparam_t; +

+

 CUPS 1.2/Mac OS X 10.5 ppd_cplimit_t

+

Custom Parameter Limit

+

+typedef union ppd_cplimit_u ppd_cplimit_t; +

+

 CUPS 1.2/Mac OS X 10.5 ppd_cptype_t

+

Custom Parameter Type

+

+typedef enum ppd_cptype_e ppd_cptype_t; +

+

 CUPS 1.2/Mac OS X 10.5 ppd_cpvalue_t

+

Custom Parameter Value

+

+typedef union ppd_cpvalue_u ppd_cpvalue_t; +

+

ppd_cs_t

+

Colorspaces

+

+typedef enum ppd_cs_e ppd_cs_t; +

+

ppd_emul_t

+

Emulators

+

+typedef struct ppd_emul_s ppd_emul_t; +

+

ppd_file_t

+

PPD File

+

+typedef struct ppd_file_s ppd_file_t; +

+

ppd_group_t

+

Groups

+

+typedef struct ppd_group_s ppd_group_t; +

+

ppd_option_t

+

Options

+

+typedef struct ppd_option_s ppd_option_t; +

+

ppd_profile_t

+

sRGB Color Profiles

+

+typedef struct ppd_profile_s ppd_profile_t; +

+

ppd_section_t

+

Order dependency sections

+

+typedef enum ppd_section_e ppd_section_t; +

+

ppd_size_t

+

Page Sizes

+

+typedef struct ppd_size_s ppd_size_t; +

+

 CUPS 1.1.19/Mac OS X 10.3 ppd_status_t

+

Status Codes

+

+typedef enum ppd_status_e ppd_status_t; +

+

ppd_ui_t

+

UI Types

+

+typedef enum ppd_ui_e ppd_ui_t; +

+

Structures

+

 CUPS 1.1.19/Mac OS X 10.3 ppd_attr_s

+

PPD Attribute Structure

+

struct ppd_attr_s {
+    char name[PPD_MAX_NAME];
+    char spec[PPD_MAX_NAME];
+    char text[PPD_MAX_TEXT];
+    char *value;
+};

+

Members

+
+
name[PPD_MAX_NAME]
+
Name of attribute (cupsXYZ)
+
spec[PPD_MAX_NAME]
+
Specifier string, if any
+
text[PPD_MAX_TEXT]
+
Human-readable text, if any
+
value
+
Value string
+
+

ppd_choice_s

+

Option choices

+

struct ppd_choice_s {
+    char choice[PPD_MAX_NAME];
+    char *code;
+    char marked;
+    ppd_option_t *option;
+    char text[PPD_MAX_TEXT];
+};

+

Members

+
+
choice[PPD_MAX_NAME]
+
Computer-readable option name
+
code
+
Code to send for this option
+
marked
+
0 if not selected, 1 otherwise
+
option
+
Pointer to parent option structure
+
text[PPD_MAX_TEXT]
+
Human-readable option name
+
+

ppd_const_s

+

Constraints

+

struct ppd_const_s {
+    char choice1[PPD_MAX_NAME];
+    char choice2[PPD_MAX_NAME];
+    char option1[PPD_MAX_NAME];
+    char option2[PPD_MAX_NAME];
+};

+

Members

+
+
choice1[PPD_MAX_NAME]
+
First option/choice (blank for all)
+
choice2[PPD_MAX_NAME]
+
Second option/choice (blank for all)
+
option1[PPD_MAX_NAME]
+
First keyword
+
option2[PPD_MAX_NAME]
+
Second keyword
+
+

 CUPS 1.2/Mac OS X 10.5 ppd_coption_s

+

Custom Option

+

struct ppd_coption_s {
+    char keyword[PPD_MAX_NAME];
+    int marked;
+    ppd_option_t *option;
+    cups_array_t *params;
+};

+

Members

+
+
keyword[PPD_MAX_NAME]
+
Name of option that is being extended...
+
marked
+
Extended option is marked
+
option
+
Option that is being extended...
+
params
+
Parameters
+
+

 CUPS 1.2/Mac OS X 10.5 ppd_cparam_s

+

Custom Parameter

+

struct ppd_cparam_s {
+    ppd_cpvalue_t current;
+    ppd_cplimit_t minimum, maximum;
+    char name[PPD_MAX_NAME];
+    int order;
+    char text[PPD_MAX_TEXT];
+    ppd_cptype_t type;
+};

+

Members

+
+
current
+
Current value
+
maximum
+
Maximum value
+
name[PPD_MAX_NAME]
+
Parameter name
+
order
+
Order (0 to N)
+
text[PPD_MAX_TEXT]
+
Human-readable text
+
type
+
Parameter type
+
+

ppd_emul_s

+

Emulators

+

struct ppd_emul_s {
+    char name[PPD_MAX_NAME];
+    char *start;
+    char *stop;
+};

+

Members

+
+
name[PPD_MAX_NAME]
+
Emulator name
+
start
+
Code to switch to this emulation
+
stop
+
Code to stop this emulation
+
+

ppd_file_s

+

PPD File

+

struct ppd_file_s {
+    int accurate_screens;
+    int color_device;
+    ppd_cs_t colorspace;
+    ppd_const_t *consts;
+    int contone_only;
+    float custom_margins[4];
+    float custom_max[2];
+    float custom_min[2];
+    ppd_emul_t *emulations;
+    char **filters;
+    int flip_duplex;
+    char **fonts;
+    ppd_group_t *groups;
+    char *jcl_begin;
+    char *jcl_end;
+    char *jcl_ps;
+    int landscape;
+    char *lang_encoding;
+    char *lang_version;
+    int language_level;
+    int manual_copies;
+    char *manufacturer;
+    int model_number;
+    char *modelname;
+    char *nickname;
+    int num_consts;
+    int num_emulations;
+    int num_filters;
+    int num_fonts;
+    int num_groups;
+    int num_profiles;
+    int num_sizes;
+    char *patches;
+    char *pcfilename;
+    char *product;
+    ppd_profile_t *profiles;
+    char *protocols;
+    char *shortnickname;
+    ppd_size_t *sizes;
+    int throughput;
+    char *ttrasterizer;
+    int variable_sizes;
+};

+

Members

+
+
accurate_screens
+
1 = supports accurate screens, 0 = not
+
color_device
+
1 = color device, 0 = grayscale
+
colorspace
+
Default colorspace
+
consts
+
UI/Non-UI constraints
+
contone_only
+
1 = continuous tone only, 0 = not
+
custom_margins[4]
+
Margins around page
+
custom_max[2]
+
Maximum variable page size
+
custom_min[2]
+
Minimum variable page size
+
emulations
+
Emulations and the code to invoke them
+
filters
+
Filter strings...
+
flip_duplex  DEPRECATED 
+
1 = Flip page for back sides
+
fonts
+
Pre-loaded fonts
+
groups
+
UI groups
+
jcl_begin
+
Start JCL commands
+
jcl_end
+
End JCL commands
+
jcl_ps
+
Enter PostScript interpreter
+
landscape
+
-90 or 90
+
lang_encoding
+
Language encoding
+
lang_version
+
Language version (English, Spanish, etc.)
+
language_level
+
Language level of device
+
manual_copies
+
1 = Copies done manually, 0 = hardware
+
manufacturer
+
Manufacturer name
+
model_number
+
Device-specific model number
+
modelname
+
Model name (general)
+
nickname
+
Nickname (specific)
+
num_consts
+
Number of UI/Non-UI constraints
+
num_emulations
+
Number of emulations supported
+
num_filters
+
Number of filters
+
num_fonts
+
Number of pre-loaded fonts
+
num_groups
+
Number of UI groups
+
num_profiles  DEPRECATED 
+
Number of sRGB color profiles
+
num_sizes
+
Number of page sizes
+
patches
+
Patch commands to be sent to printer
+
pcfilename  CUPS 1.1.19/Mac OS X 10.3 
+
PCFileName string
+
product
+
Product name (from PS RIP/interpreter)
+
profiles  DEPRECATED 
+
sRGB color profiles
+
protocols  CUPS 1.1.19/Mac OS X 10.3 
+
Protocols (BCP, TBCP) string
+
shortnickname
+
Short version of nickname
+
sizes
+
Page sizes
+
throughput
+
Pages per minute
+
ttrasterizer
+
Truetype rasterizer
+
variable_sizes
+
1 = supports variable sizes, 0 = doesn't
+
+

ppd_group_s

+

Groups

+

struct ppd_group_s {
+    char text[PPD_MAX_TEXT - PPD_MAX_NAME];
+    char name[PPD_MAX_NAME];
+    int num_options;
+    int num_subgroups;
+    ppd_option_t *options;
+    struct ppd_group_s *subgroups;
+};

+

Members

+
+
PPD_MAX_NAME]
+
Human-readable group name
+
name[PPD_MAX_NAME]  CUPS 1.1.18/Mac OS X 10.3 
+
Group name
+
num_options
+
Number of options
+
num_subgroups
+
Number of sub-groups
+
options
+
Options
+
subgroups
+
Sub-groups (max depth = 1)
+
+

ppd_option_s

+

Options

+

struct ppd_option_s {
+    ppd_choice_t *choices;
+    char conflicted;
+    char defchoice[PPD_MAX_NAME];
+    char keyword[PPD_MAX_NAME];
+    int num_choices;
+    float order;
+    ppd_section_t section;
+    char text[PPD_MAX_TEXT];
+    ppd_ui_t ui;
+};

+

Members

+
+
choices
+
Option choices
+
conflicted
+
0 if no conflicts exist, 1 otherwise
+
defchoice[PPD_MAX_NAME]
+
Default option choice
+
keyword[PPD_MAX_NAME]
+
Option keyword name ("PageSize", etc.)
+
num_choices
+
Number of option choices
+
order
+
Order number
+
section
+
Section for command
+
text[PPD_MAX_TEXT]
+
Human-readable text
+
ui
+
Type of UI option
+
+

ppd_profile_s

+

sRGB Color Profiles

+

struct ppd_profile_s {
+    float density;
+    float gamma;
+    float matrix[3][3];
+    char media_type[PPD_MAX_NAME];
+    char resolution[PPD_MAX_NAME];
+};

+

Members

+
+
density
+
Ink density to use
+
gamma
+
Gamma correction to use
+
matrix[3][3]
+
Transform matrix
+
media_type[PPD_MAX_NAME]
+
Media type or "-"
+
resolution[PPD_MAX_NAME]
+
Resolution or "-"
+
+

ppd_size_s

+

Page Sizes

+

struct ppd_size_s {
+    float bottom;
+    float left;
+    float length;
+    int marked;
+    char name[PPD_MAX_NAME];
+    float right;
+    float top;
+    float width;
+};

+

Members

+
+
bottom
+
Bottom printable margin in points
+
left
+
Left printable margin in points
+
length
+
Length of media in points
+
marked
+
Page size selected?
+
name[PPD_MAX_NAME]
+
Media size option
+
right
+
Right printable margin in points
+
top
+
Top printable margin in points
+
width
+
Width of media in points
+
+

Unions

+

 CUPS 1.2/Mac OS X 10.5 ppd_cplimit_u

+

Custom Parameter Limit

+

union ppd_cplimit_u {
+    float custom_curve;
+    int custom_int;
+    float custom_invcurve;
+    int custom_passcode;
+    int custom_password;
+    float custom_points;
+    float custom_real;
+    int custom_string;
+};

+

Members

+
+
custom_curve
+
Gamma value
+
custom_int
+
Integer value
+
custom_invcurve
+
Gamma value
+
custom_passcode
+
Passcode length
+
custom_password
+
Password length
+
custom_points
+
Measurement value
+
custom_real
+
Real value
+
custom_string
+
String length
+
+

 CUPS 1.2/Mac OS X 10.5 ppd_cpvalue_u

+

Custom Parameter Value

+

union ppd_cpvalue_u {
+    float custom_curve;
+    int custom_int;
+    float custom_invcurve;
+    char *custom_passcode;
+    char *custom_password;
+    float custom_points;
+    float custom_real;
+    char *custom_string;
+};

+

Members

+
+
custom_curve
+
Gamma value
+
custom_int
+
Integer value
+
custom_invcurve
+
Gamma value
+
custom_passcode
+
Passcode value
+
custom_password
+
Password value
+
custom_points
+
Measurement value
+
custom_real
+
Real value
+
custom_string
+
String value
+
+

Constants

+

 CUPS 1.1.19/Mac OS X 10.3 ppd_conform_e

+

Conformance Levels

+

Constants

+
+
PPD_CONFORM_RELAXED
+
Relax whitespace and control char
+
PPD_CONFORM_STRICT
+
Require strict conformance
+
+

ppd_cs_e

+

Colorspaces

+

Constants

+
+
PPD_CS_CMY
+
CMY colorspace
+
PPD_CS_CMYK
+
CMYK colorspace
+
PPD_CS_GRAY
+
Grayscale colorspace
+
PPD_CS_N
+
DeviceN colorspace
+
PPD_CS_RGB
+
RGB colorspace
+
PPD_CS_RGBK
+
RGBK (K = gray) colorspace
+
+

ppd_section_e

+

Order dependency sections

+

Constants

+
+
PPD_ORDER_ANY
+
Option code can be anywhere in the file
+
PPD_ORDER_DOCUMENT
+
... must be in the DocumentSetup section
+
PPD_ORDER_EXIT
+
... must be sent prior to the document
+
PPD_ORDER_JCL
+
... must be sent as a JCL command
+
PPD_ORDER_PAGE
+
... must be in the PageSetup section
+
PPD_ORDER_PROLOG
+
... must be in the Prolog section
+
+

 CUPS 1.1.19/Mac OS X 10.3 ppd_status_e

+

Status Codes

+

Constants

+
+
PPD_ALLOC_ERROR
+
Memory allocation error
+
PPD_BAD_CUSTOM_PARAM
+
Bad custom parameter
+
PPD_BAD_OPEN_GROUP
+
Bad OpenGroup
+
PPD_BAD_OPEN_UI
+
Bad OpenUI/JCLOpenUI
+
PPD_BAD_ORDER_DEPENDENCY
+
Bad OrderDependency
+
PPD_BAD_UI_CONSTRAINTS
+
Bad UIConstraints
+
PPD_BAD_VALUE
+
Bad value string
+
PPD_FILE_OPEN_ERROR
+
Unable to open PPD file
+
PPD_ILLEGAL_CHARACTER
+
Illegal control character
+
PPD_ILLEGAL_MAIN_KEYWORD
+
Illegal main keyword string
+
PPD_ILLEGAL_OPTION_KEYWORD
+
Illegal option keyword string
+
PPD_ILLEGAL_TRANSLATION
+
Illegal translation string
+
PPD_ILLEGAL_WHITESPACE
+
Illegal whitespace character
+
PPD_INTERNAL_ERROR
+
Internal error
+
PPD_LINE_TOO_LONG
+
Line longer than 255 chars
+
PPD_MISSING_ASTERISK
+
Missing asterisk in column 0
+
PPD_MISSING_CLOSE_GROUP
+
Missing CloseGroup
+
PPD_MISSING_OPTION_KEYWORD
+
Missing option keyword
+
PPD_MISSING_PPDADOBE4
+
Missing PPD-Adobe-4.x header
+
PPD_MISSING_VALUE
+
Missing value string
+
PPD_NESTED_OPEN_GROUP
+
OpenGroup without a CloseGroup first
+
PPD_NESTED_OPEN_UI
+
OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first
+
PPD_NULL_FILE
+
NULL PPD file pointer
+
PPD_OK
+
OK
+
+

ppd_ui_e

+

UI Types

+

Constants

+
+
PPD_UI_BOOLEAN
+
True or False option
+
PPD_UI_PICKMANY
+
Pick zero or more from a list
+
PPD_UI_PICKONE
+
Pick one from a list
+
+
+ + diff --git a/doc/help/api-ppdc.html b/doc/help/api-ppdc.html new file mode 100644 index 0000000..cb15f61 --- /dev/null +++ b/doc/help/api-ppdc.html @@ -0,0 +1,2197 @@ + + + + + PPD Compiler API + + + + + + +
+ + +

PPD Compiler API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/ppdc.h
Library-lcupsppdc
See AlsoProgramming: Introduction to CUPS Programming
+

Contents

+ + + +

Overview

+ +

The PPD Compiler API provides access to CUPS driver information files and +methods for generating and importing PPD files.

+

Classes

+

ppdcArray

+

// Shared Array

+

class ppdcArray : public ppdcShared {
+  public:
+    int count, alloc, current;
+    ppdcShared **data;
+};

+

Members

+
+
current
+
Current element
+
data
+
Elements
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void add(ppdcShared *d
+);

+
Parameters
+
+
d
+
+

add

+

+

+void add (
+    ppdcShared *d
+);

+
Parameters
+
+
d
+
+

first

+

Return the first element in the array.

+

+ppdcShared *first (void);

+
Return Value
+

+

next

+

Return the next element in the array.

+

+ppdcShared *next (void);

+
Return Value
+

+

ppdcArray

+

+

+void ppdcArray (
+    ppdcArray *a
+);

+
Parameters
+
+
a
+
+

remove

+

+

+void remove (
+    ppdcShared *d
+);

+
Parameters
+
+
d
+
Data element
+
+

~ppdcArray

+

+

+void ~ppdcArray (void);

+

ppdcAttr

+

// Attribute

+

class ppdcAttr : public ppdcShared {
+  public:
+    bool localizable;
+    ppdcString *name, *selector, *text, *value;
+};

+

Members

+
+
localizable
+
Should this attribute be localized?
+
value
+
Value string
+
+

ppdcAttr

+

+

+void ppdcAttr (
+    const char *n,
+    const char *s,
+    const char *t,
+    const char *v,
+    bool loc
+);

+
Parameters
+
+
n
+
Name
+
s
+
Spec string
+
t
+
Human-readable text
+
v
+
Value
+
loc
+
Localize this attribute?
+
+

~ppdcAttr

+

+

+void ~ppdcAttr (void);

+

ppdcCatalog

+

// Translation catalog

+

class ppdcCatalog : public ppdcShared {
+  public:
+    ppdcString *filename;
+    ppdcString *locale;
+    ppdcArray *messages;
+};

+

Members

+
+
filename
+
Name of translation file
+
locale
+
Name of locale
+
messages
+
Array of translation messages
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void add_message(const char *id,
+    const char *string = NULL
+);

+
Parameters
+
+
id
+
string
+
+

add_message

+

+

+void add_message (
+    const char *id,
+    const char *string
+);

+
Parameters
+
+
id
+
Message ID to add
+
string
+
Translation string
+
+

find_message

+

+

+const char *find_message (
+    const char *id
+);

+
Parameters
+
+
id
+
Message ID
+
+
Return Value
+

Message text

+

load_messages

+

+

+int load_messages (
+    const char *f
+);

+
Parameters
+
+
f
+
Message catalog file
+
+
Return Value
+

0 on success, -1 on failure

+

ppdcCatalog

+

+

+void ppdcCatalog (
+    const char *l,
+    const char *f
+);

+
Parameters
+
+
l
+
Locale
+
f
+
Message catalog file
+
+

save_messages

+

+

+int save_messages (
+    const char *f
+);

+
Parameters
+
+
f
+
File to save to
+
+
Return Value
+

0 on success, -1 on error

+

~ppdcCatalog

+

+

+void ~ppdcCatalog (void);

+

ppdcChoice

+

// Option Choice

+

class ppdcChoice : public ppdcShared {
+  public:
+    ppdcString *name, *text, *code;
+};

+

Members

+
+
code
+
PS code of choice
+
+

ppdcChoice

+

+

+void ppdcChoice (
+    const char *n,
+    const char *t,
+    const char *c
+);

+
Parameters
+
+
n
+
Name of choice
+
t
+
Text of choice
+
c
+
Code of choice
+
+

~ppdcChoice

+

+

+void ~ppdcChoice (void);

+

ppdcConstraint

+

// Constraint

+

class ppdcConstraint : public ppdcShared {
+  public:
+    ppdcString *option1, *choice1, *option2, *choice2;
+};

+

Members

+
+
choice2
+
Second choice
+
+

ppdcConstraint

+

+

+void ppdcConstraint (
+    const char *o1,
+    const char *c1,
+    const char *o2,
+    const char *c2
+);

+
Parameters
+
+
o1
+
First option
+
c1
+
First choice
+
o2
+
Second option
+
c2
+
Second choice
+
+

~ppdcConstraint

+

+

+void ~ppdcConstraint (void);

+

ppdcDriver

+

// Printer Driver Data

+

class ppdcDriver : public ppdcShared {
+  public:
+    ppdcArray *copyright;
+    ppdcString *custom_size_code;
+    ppdcString *default_font, *default_size;
+    float left_margin, bottom_margin, right_margin, top_margin, max_width, max_length, min_width, min_length;
+    ppdcArray *attrs, *constraints, *filters, *fonts, *groups, *profiles, *sizes;
+    int model_number, manual_copies, color_device, throughput;
+    ppdcDrvType type;
+    int variable_paper_size;
+    ppdcString *manufacturer, *model_name, *file_name, *pc_file_name, *version;
+};

+

Members

+
+
copyright
+
Copyright strings
+
custom_size_code
+
Custom page size code, if any
+
default_size
+
Default size option
+
min_length
+
Minimum length (points)
+
sizes
+
Fixed sizes
+
throughput
+
Throughput in pages per minute
+
type
+
Driver type
+
variable_paper_size
+
Support variable sizes?
+
version
+
Version number
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void add_attr(ppdcAttr *a
+);

+
Parameters
+
+
a
+
+

add_constraint

+

+

+void add_constraint (
+    ppdcConstraint *c
+);

+
Parameters
+
+
c
+
+

add_copyright

+

+

+void add_copyright (
+    const char *c
+);

+
Parameters
+
+
c
+
+

add_filter

+

+

+void add_filter (
+    ppdcFilter *f
+);

+
Parameters
+
+
f
+
+

add_font

+

+

+void add_font (
+    ppdcFont *f
+);

+
Parameters
+
+
f
+
+

add_group

+

+

+void add_group (
+    ppdcGroup *g
+);

+
Parameters
+
+
g
+
+

add_profile

+

+

+void add_profile (
+    ppdcProfile *p
+);

+
Parameters
+
+
p
+
+

add_size

+

+

+void add_size (
+    ppdcMediaSize *m
+);

+
Parameters
+
+
m
+
+

find_attr

+

+

+ppdcAttr *find_attr (
+    const char *k,
+    const char *s
+);

+
Parameters
+
+
k
+
Keyword string
+
s
+
Spec string
+
+
Return Value
+

Attribute or NULL

+

find_group

+

+

+ppdcGroup *find_group (
+    const char *n
+);

+
Parameters
+
+
n
+
Group name
+
+
Return Value
+

Matching group or NULL

+

find_option

+

+

+ppdcOption *find_option (
+    const char *n
+);

+
Parameters
+
+
n
+
Option name
+
+
Return Value
+

Matching option or NULL

+

find_option_group

+

+

+ppdcOption *find_option_group (
+    const char *n,
+    ppdcGroup **mg
+);

+
Parameters
+
+
n
+
Option name
+
mg
+
Matching group or NULL
+
+
Return Value
+

Matching option or NULL

+

ppdcDriver

+

+

+void ppdcDriver (
+    ppdcDriver *d
+);

+
Parameters
+
+
d
+
Printer driver template
+
+

set_custom_size_code

+

+

+void set_custom_size_code (
+    const char *c
+);

+
Parameters
+
+
c
+
CustomPageSize code
+
+

set_default_font

+

+

+void set_default_font (
+    ppdcFont *f
+);

+
Parameters
+
+
f
+
Font
+
+

set_default_size

+

+

+void set_default_size (
+    ppdcMediaSize *m
+);

+
Parameters
+
+
m
+
Media size
+
+

set_file_name

+

+

+void set_file_name (
+    const char *f
+);

+
Parameters
+
+
f
+
Filename
+
+

set_manufacturer

+

+

+void set_manufacturer (
+    const char *m
+);

+
Parameters
+
+
m
+
Model name
+
+

set_model_name

+

+

+void set_model_name (
+    const char *m
+);

+
Parameters
+
+
m
+
Model name
+
+

set_pc_file_name

+

+

+void set_pc_file_name (
+    const char *f
+);

+
Parameters
+
+
f
+
Filename
+
+

set_version

+

+

+void set_version (
+    const char *v
+);

+
Parameters
+
+
v
+
Version
+
+

write_ppd_file

+

+

+int write_ppd_file (
+    cups_file_t *fp,
+    ppdcCatalog *catalog,
+    ppdcArray *locales,
+    ppdcSource *src,
+    ppdcLineEnding le
+);

+
Parameters
+
+
fp
+
PPD file
+
catalog
+
Message catalog
+
locales
+
Additional languages to add
+
src
+
Driver source
+
le
+
Line endings to use
+
+
Return Value
+

0 on success, -1 on failure

+

~ppdcDriver

+

+

+void ~ppdcDriver (void);

+

ppdcFile

+

// File

+

class ppdcFile {
+  public:
+    const char *filename;
+    cups_file_t *fp;
+    int line;
+};

+

Members

+
+
filename
+
Filename
+
fp
+
File pointer
+
line
+
Line in file
+
+

get

+

Get a character from a file.

+

+int get (void);

+
Return Value
+

+

peek

+

+

+int peek (void);

+
Return Value
+

Next character in file

+

ppdcFile

+

+

+void ppdcFile (
+    const char *f,
+    cups_file_t *ffp
+);

+
Parameters
+
+
f
+
File to open
+
ffp
+
File pointer to use
+
+

~ppdcFile

+

+

+void ~ppdcFile (void);

+

ppdcFilter

+

// Filter Program

+

class ppdcFilter : public ppdcShared {
+  public:
+    int cost;
+    ppdcString *mime_type, *program;
+};

+

Members

+
+
cost
+
Relative cost of filter
+
program
+
Filter program
+
+

ppdcFilter

+

+

+void ppdcFilter (
+    const char *t,
+    const char *p,
+    int c
+);

+
Parameters
+
+
t
+
MIME type
+
p
+
Filter program
+
c
+
Relative cost
+
+

~ppdcFilter

+

+

+void ~ppdcFilter (void);

+

ppdcFont

+

// Shared Font

+

class ppdcFont : public ppdcShared {
+  public:
+    ppdcString *name, *encoding, *version, *charset;
+    ppdcFontStatus status;
+};

+

Members

+
+
charset
+
Font charset
+
status
+
Font status (ROM or Disk)
+
+

ppdcFont

+

+

+void ppdcFont (
+    const char *n,
+    const char *e,
+    const char *v,
+    const char *c,
+    ppdcFontStatus s
+);

+
Parameters
+
+
n
+
Name of font
+
e
+
Font encoding
+
v
+
Font version
+
c
+
Font charset
+
s
+
Font status
+
+

~ppdcFont

+

+

+void ~ppdcFont (void);

+

ppdcGroup

+

// Group of Options

+

class ppdcGroup : public ppdcShared {
+  public:
+    ppdcArray *options;
+    ppdcString *name, *text;
+};

+

Members

+
+
options
+
Options
+
text
+
Human-readable text of option
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void add_option(ppdcOption *o
+);

+
Parameters
+
+
o
+
+

find_option

+

Find an option in a group.

+

+ppdcOption *find_option (
+    const char *n
+);

+
Parameters
+
+
n
+
Name of option
+
+
Return Value
+

+

ppdcGroup

+

+

+void ppdcGroup (
+    ppdcGroup *g
+);

+
Parameters
+
+
g
+
Group template
+
+

~ppdcGroup

+

+

+void ~ppdcGroup (void);

+

ppdcInteger

+

// Shared integer

+

class ppdcInteger : public ppdcShared {
+  public:
+    int *value;
+};

+

Members

+
+
value
+
Integer value
+
+

ppdcInteger

+

Integer value

+

+void ppdcInteger (
+    int *v
+);

+
Parameters
+
+
v
+
+

ppdcMediaSize

+

// Media Size

+

class ppdcMediaSize : public ppdcShared {
+  public:
+    ppdcString *size_code, *region_code;
+    ppdcString *name, *text;
+    float width, length, left, bottom, right, top;
+};

+

Members

+
+
region_code
+
PageRegion code, if any
+
text
+
Human-readable text
+
top
+
Top limit in points
+
+

ppdcMediaSize

+

+

+void ppdcMediaSize (
+    const char *n,
+    const char *t,
+    float w,
+    float l,
+    float lm,
+    float bm,
+    float rm,
+    float tm,
+    const char *sc,
+    const char *rc
+);

+
Parameters
+
+
n
+
Name of media size
+
t
+
Text of media size
+
w
+
Width in points
+
l
+
Length in points
+
lm
+
Left margin in points
+
bm
+
Bottom margin in points
+
rm
+
Right margin in points
+
tm
+
Top margin in points
+
sc
+
PageSize code, if any
+
rc
+
PageRegion code, if any
+
+

~ppdcMediaSize

+

+

+void ~ppdcMediaSize (void);

+

ppdcMessage

+

// Translation message

+

class ppdcMessage : public ppdcShared {
+  public:
+    ppdcString *id, *string;
+};

+

Members

+
+
string
+
Translation string
+
+

ppdcMessage

+

+

+void ppdcMessage (
+    const char *i,
+    const char *s
+);

+
Parameters
+
+
i
+
ID
+
s
+
Text
+
+

~ppdcMessage

+

+

+void ~ppdcMessage (void);

+

ppdcOption

+

// Option

+

class ppdcOption : public ppdcShared {
+  public:
+    ppdcArray *choices;
+    ppdcString *defchoice;
+    float order;
+    ppdcOptSection section;
+    ppdcString *name, *text;
+    ppdcOptType type;
+};

+

Members

+
+
choices
+
Choices
+
defchoice
+
Default choice
+
order
+
Order number
+
section
+
Section for option code
+
text
+
Human-readable text of option
+
type
+
Type of option
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void add_choice(ppdcChoice *c
+);

+
Parameters
+
+
c
+
+

find_choice

+

+

+ppdcChoice *find_choice (
+    const char *n
+);

+
Parameters
+
+
n
+
Name of choice
+
+
Return Value
+

Choice or NULL

+

ppdcOption

+

+

+void ppdcOption (
+    ppdcOption *o
+);

+
Parameters
+
+
o
+
Template option
+
+

set_defchoice

+

+

+void set_defchoice (
+    ppdcChoice *c
+);

+
Parameters
+
+
c
+
Choice
+
+

~ppdcOption

+

+

+void ~ppdcOption (void);

+

ppdcProfile

+

// Color Profile

+

class ppdcProfile : public ppdcShared {
+  public:
+    ppdcString *resolution, *media_type;
+    float density, gamma, profile[9];
+};

+

Members

+
+
media_type
+
Media type name
+
profile[9]
+
Color profile matrix
+
+

ppdcProfile

+

+

+void ppdcProfile (
+    const char *r,
+    const char *m,
+    float d,
+    float g,
+    const float *p
+);

+
Parameters
+
+
r
+
Resolution name
+
m
+
Media type name
+
d
+
Density
+
g
+
Gamma
+
p
+
3x3 transform matrix
+
+

~ppdcProfile

+

+

+void ~ppdcProfile (void);

+

ppdcShared

+

// Shared Data Value

+

class ppdcShared {
+  private:
+    int use;
+};

+

Members

+
+
use
+
Use count (delete when 0)
+
+

class_name

+

+

+virtual const char *class_name (void);

+
Return Value
+

+

ppdcShared

+

+

+void ppdcShared (void);

+

release

+

+

+void release (void);

+

retain

+

+

+void retain (void);

+

~ppdcShared

+

+

+void ~ppdcShared (void);

+

ppdcSource

+

// Source File

+

class ppdcSource : public ppdcShared {
+  public:
+    int cond_state, *cond_current, cond_stack[101];
+    static const char *driver_types[];
+    ppdcString *filename;
+    static ppdcArray *includes;
+    ppdcArray *base_fonts, *drivers, *po_files, *sizes, *vars;
+};

+

Members

+
+
cond_stack[101]
+
#if state stack
+
driver_types[]
+
Driver types
+
filename
+
Filename
+
includes
+
Include directories
+
vars
+
Defined variables
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    static void add_include(const char *d
+);

+
Parameters
+
+
d
+
+

add_include

+

+

+void add_include (
+    const char *d
+);

+
Parameters
+
+
d
+
Include directory
+
+

find_driver

+

+

+ppdcDriver *find_driver (
+    const char *f
+);

+
Parameters
+
+
f
+
Driver file name
+
+
Return Value
+

Driver

+

find_include

+

+

+char *find_include (
+    const char *f,
+    const char *base,
+    char *n,
+    int nlen
+);

+
Parameters
+
+
f
+
Include filename
+
base
+
Current directory
+
n
+
Path buffer
+
nlen
+
Path buffer length
+
+
Return Value
+

Found path or NULL

+

find_po

+

+

+ppdcCatalog *find_po (
+    const char *l
+);

+
Parameters
+
+
l
+
Locale name
+
+
Return Value
+

Message catalog or NULL

+

find_size

+

+

+ppdcMediaSize *find_size (
+    const char *s
+);

+
Parameters
+
+
s
+
Size name
+
+
Return Value
+

Size

+

find_variable

+

+

+ppdcVariable *find_variable (
+    const char *n
+);

+
Parameters
+
+
n
+
Variable name
+
+
Return Value
+

Variable

+

get_attr

+

+

+ppdcAttr *get_attr (
+    ppdcFile *fp,
+    bool loc
+);

+
Parameters
+
+
fp
+
File to read
+
loc
+
Localize this attribute?
+
+
Return Value
+

Attribute

+

get_boolean

+

+

+int get_boolean (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Boolean value

+

get_choice

+

+

+ppdcChoice *get_choice (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Choice data

+

get_color_model

+

+

+ppdcChoice *get_color_model (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Choice data

+

get_color_order

+

+

+int get_color_order (
+    const char *co
+);

+
Parameters
+
+
co
+
Color order string
+
+
Return Value
+

Color order value

+

get_color_profile

+

+

+ppdcProfile *get_color_profile (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Color profile

+

get_color_space

+

+

+int get_color_space (
+    const char *cs
+);

+
Parameters
+
+
cs
+
Colorspace string
+
+
Return Value
+

Colorspace value

+

get_constraint

+

+

+ppdcConstraint *get_constraint (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Constraint

+

get_custom_size

+

+

+ppdcMediaSize *get_custom_size (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Media size

+

get_duplex

+

+

+void get_duplex (
+    ppdcFile *fp,
+    ppdcDriver *d
+);

+
Parameters
+
+
fp
+
File to read from
+
d
+
Current driver
+
+

get_filter

+

+

+ppdcFilter *get_filter (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Filter

+

get_float

+

+

+float get_float (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Number

+

get_font

+

+

+ppdcFont *get_font (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Font data

+

get_generic

+

+

+ppdcChoice *get_generic (
+    ppdcFile *fp,
+    const char *keyword,
+    const char *tattr,
+    const char *nattr
+);

+
Parameters
+
+
fp
+
File to read
+
keyword
+
Keyword name
+
tattr
+
Text attribute
+
nattr
+
Numeric attribute
+
+
Return Value
+

Choice data

+

get_group

+

+

+ppdcGroup *get_group (
+    ppdcFile *fp,
+    ppdcDriver *d
+);

+
Parameters
+
+
fp
+
File to read
+
d
+
Printer driver
+
+
Return Value
+

Group

+

get_installable

+

+

+ppdcOption *get_installable (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Option

+

get_integer

+

+

+int get_integer (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Integer value

+

get_measurement

+

+

+float get_measurement (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Measurement value in points

+

get_option

+

+

+ppdcOption *get_option (
+    ppdcFile *fp,
+    ppdcDriver *d,
+    ppdcGroup *g
+);

+
Parameters
+
+
fp
+
File to read
+
d
+
Printer driver
+
g
+
Current group
+
+
Return Value
+

Option

+

get_po

+

+

+ppdcCatalog *get_po (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Message catalog

+

get_resolution

+

+

+ppdcChoice *get_resolution (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Choice data

+

get_simple_profile

+

+

+ppdcProfile *get_simple_profile (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Color profile

+

get_size

+

+

+ppdcMediaSize *get_size (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Media size

+

get_token

+

+

+char *get_token (
+    ppdcFile *fp,
+    char *buffer,
+    int buflen
+);

+
Parameters
+
+
fp
+
File to read
+
buffer
+
Buffer
+
buflen
+
Length of buffer
+
+
Return Value
+

Token string or NULL

+

get_variable

+

+

+ppdcVariable *get_variable (
+    ppdcFile *fp
+);

+
Parameters
+
+
fp
+
File to read
+
+
Return Value
+

Variable

+

import_ppd

+

+

+int import_ppd (
+    const char *f
+);

+
Parameters
+
+
f
+
Filename
+
+
Return Value
+

1 on success, 0 on failure

+

ppdcSource

+

+

+void ppdcSource (
+    const char *f,
+    cups_file_t *ffp
+);

+
Parameters
+
+
f
+
File to read
+
ffp
+
File pointer to use
+
+

quotef

+

+

+int quotef (
+    cups_file_t *fp,
+    const char *format,
+    ...
+);

+
Parameters
+
+
fp
+
File to write to
+
format
+
Printf-style format string
+
...
+
Additional args as needed
+
+
Return Value
+

Number bytes on success, -1 on failure

+

read_file

+

+

+void read_file (
+    const char *f,
+    cups_file_t *ffp
+);

+
Parameters
+
+
f
+
File to read
+
ffp
+
File pointer to use
+
+

scan_file

+

+

+void scan_file (
+    ppdcFile *fp,
+    ppdcDriver *td,
+    bool inc
+);

+
Parameters
+
+
fp
+
File to read
+
td
+
Driver template
+
inc
+
Including?
+
+

set_variable

+

+

+ppdcVariable *set_variable (
+    const char *name,
+    const char *value
+);

+
Parameters
+
+
name
+
Name
+
value
+
Value
+
+
Return Value
+

Variable

+

write_file

+

+

+int write_file (
+    const char *f
+);

+
Parameters
+
+
f
+
File to write
+
+
Return Value
+

0 on success, -1 on error

+

~ppdcSource

+

+

+void ~ppdcSource (void);

+

ppdcString

+

// Shared String

+

class ppdcString : public ppdcShared {
+  public:
+    char *value;
+};

+

Members

+
+
value
+
String value
+
+

ppdcString

+

+

+void ppdcString (
+    const char *v
+);

+
Parameters
+
+
v
+
String
+
+

~ppdcString

+

+

+void ~ppdcString (void);

+

ppdcVariable

+

// Variable Definition

+

class ppdcVariable : public ppdcShared {
+  public:
+    ppdcString *name, *value;
+};

+

Members

+
+
value
+
Value of variable
+
+

PPDC_NAME

+

+

+void PPDC_NAME (
+    void set_value(const char *v
+);

+
Parameters
+
+
v
+
+

ppdcVariable

+

+

+void ppdcVariable (
+    const char *n,
+    const char *v
+);

+
Parameters
+
+
n
+
Name of variable
+
v
+
Value of variable
+
+

set_value

+

+

+void set_value (
+    const char *v
+);

+
Parameters
+
+
v
+
+

~ppdcVariable

+

+

+void ~ppdcVariable (void);

+

Data Types

+

ppdc_cs_t

+

+

+typedef enum ppdc_cs_t; +

+

Variables

+

ppdcSource

+

// Printer Driver Data

+

class ppdcSource;

+

Constants

+

ppdcCondFlags

+

// Condition flags

+

Constants

+
+
PPDC_COND_NORMAL
+
Normal state
+
PPDC_COND_SATISFIED
+
At least one condition satisfied
+
PPDC_COND_SKIP
+
Skip state
+
+

ppdcDrvType

+

// Driver type

+

Constants

+
+
PPDC_DRIVER_CUSTOM
+
Custom driver
+
PPDC_DRIVER_EPSON
+
rastertoepson driver
+
PPDC_DRIVER_ESCP
+
rastertoescpx driver
+
PPDC_DRIVER_HP
+
rastertohp driver
+
PPDC_DRIVER_LABEL
+
rastertolabel/rastertodymo driver
+
PPDC_DRIVER_MAX
+
Number of driver types defined
+
PPDC_DRIVER_PCL
+
rastertopclx driver
+
PPDC_DRIVER_PS
+
PostScript driver
+
+

ppdcFontStatus

+

// Load status of font

+

Constants

+
+
PPDC_FONT_DISK
+
Font is on disk
+
PPDC_FONT_ROM
+
Font is in ROM
+
+

ppdcLineEnding

+

// Line endings

+

Constants

+
+
PPDC_CRLF
+
CR + LF
+
PPDC_CRONLY
+
CR only
+
PPDC_LFONLY
+
LF only
+
+

ppdcOptSection

+

// Option section

+

Constants

+
+
PPDC_SECTION_ANY
+
AnySetup
+
PPDC_SECTION_DOCUMENT
+
DocumentSetup
+
PPDC_SECTION_EXIT
+
ExitServer
+
PPDC_SECTION_JCL
+
JCLSetup
+
PPDC_SECTION_PAGE
+
PageSetup
+
PPDC_SECTION_PROLOG
+
Prolog
+
+

ppdcOptType

+

// Option type

+

Constants

+
+
PPDC_BOOLEAN
+
True/false option
+
PPDC_PICKMANY
+
Multiple choices from list
+
PPDC_PICKONE
+
Single choice from list
+
+
+ + diff --git a/doc/help/api-raster.html b/doc/help/api-raster.html new file mode 100644 index 0000000..f193d07 --- /dev/null +++ b/doc/help/api-raster.html @@ -0,0 +1,1416 @@ + + + + + Raster API + + + + + + +
+ + +

Raster API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/raster.h
Library-lcupsimage
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Programming: PPD API
+ References: CUPS PPD Specification
+

Contents

+ + + +

Overview

+ +

The CUPS raster API provides a standard interface for reading and writing +CUPS raster streams which are used for printing to raster printers. Because the +raster format is updated from time to time, it is important to use this API to +avoid incompatibilities with newer versions of CUPS.

+ +

Two kinds of CUPS filters use the CUPS raster API - raster image processor +(RIP) filters such as pstoraster and cgpdftoraster +(Mac OS X) that produce CUPS raster files and printer driver filters that +convert CUPS raster files into a format usable by the printer. Printer +driver filters are by far the most common.

+ +

CUPS raster files (application/vnd.cups-raster) consists of +a stream of raster page descriptions produced by one of the RIP filters such as +pstoraster, imagetoraster, or +cgpdftoraster. CUPS raster files are referred to using the +cups_raster_t type and are +opened using the cupsRasterOpen +function. For example, to read raster data from the standard input, open +file descriptor 0:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+
+ +

Each page of data begins with a page dictionary structure called +cups_page_header2_t. This +structure contains the colorspace, bits per color, media size, media type, +hardware resolution, and so forth used for the page.

+ +
Note: + +

Do not confuse the colorspace in the page header with the PPD + ColorModel keyword. ColorModel refers to the general type of + color used for a device (Gray, RGB, CMYK, DeviceN) and is often used to + select a particular colorspace for the page header along with the associate + color profile. The page header colorspace (cupsColorSpace) describes + both the type and organization of the color data, for example KCMY (black + first) instead of CMYK and RGBA (RGB + alpha) instead of RGB.

+ +
+ +

You read the page header using the +cupsRasterReadHeader2 +function:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+cups_page_header2_t header;
+
+while (cupsRasterReadHeader2(ras, &header))
+{
+  /* setup this page */
+
+  /* read raster data */
+
+  /* finish this page */
+}
+
+ +

After the page dictionary comes the page data which is a full-resolution, +possibly compressed bitmap representing the page in the printer's output +colorspace. You read uncompressed raster data using the +cupsRasterReadPixels +function. A for loop is normally used to read the page one line +at a time:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+cups_page_header2_t header;
+int page = 0;
+int y;
+char *buffer;
+
+while (cupsRasterReadHeader2(ras, &header))
+{
+  /* setup this page */
+  page ++;
+  fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies);
+
+  /* allocate memory for 1 line */
+  buffer = malloc(header.cupsBytesPerLine);
+
+  /* read raster data */
+  for (y = 0; y < header.cupsHeight; y ++)
+  {
+    if (cupsRasterReadPixels(ras, buffer, header.cupsBytesPerLine) == 0)
+      break;
+
+    /* write raster data to printer on stdout */
+  }
+
+  /* finish this page */
+}
+
+ +

When you are done reading the raster data, call the +cupsRasterClose function to free +the memory used to read the raster file:

+ +
+cups_raster_t *ras;
+
+cupsRasterClose(ras);
+
+ + +

Functions by Task

+ +

Opening and Closing Raster Streams

+ + + +

Reading Raster Streams

+ + + +

Writing Raster Streams

+ + +

Functions

+

cupsRasterClose

+

Close a raster stream.

+

+void cupsRasterClose (
+    cups_raster_t *r
+);

+

Parameters

+
+
r
+
Stream to close
+
+

Discussion

+

The file descriptor associated with the raster stream must be closed +separately as needed.

+

 CUPS 1.2/Mac OS X 10.5 cupsRasterInterpretPPD

+

Interpret PPD commands to create a page header.

+

+int cupsRasterInterpretPPD (
+    cups_page_header2_t *h,
+    ppd_file_t *ppd,
+    int num_options,
+    cups_option_t *options,
+    cups_interpret_cb_t func
+);

+

Parameters

+
+
h
+
Page header to create
+
ppd
+
PPD file
+
num_options
+
Number of options
+
options
+
Options
+
func
+
Optional page header callback (NULL for none)
+
+

Return Value

+

0 on success, -1 on failure

+

Discussion

+

This function is used by raster image processing (RIP) filters like +cgpdftoraster and imagetoraster when writing CUPS raster data for a page. +It is not used by raster printer driver filters which only read CUPS +raster data.
+
+ +cupsRasterInterpretPPD does not mark the options in the PPD using +the "num_options" and "options" arguments. Instead, mark the options with +cupsMarkOptions and ppdMarkOption prior to calling it - +this allows for per-page options without manipulating the options array.
+
+The "func" argument specifies an optional callback function that is +called prior to the computation of the final raster data. The function +can make changes to the cups_page_header2_t data as needed to use a +supported raster format and then returns 0 on success and -1 if the +requested attributes cannot be supported.
+
+ +cupsRasterInterpretPPD supports a subset of the PostScript language. +Currently only the [, ], <<, >>, {, +}, cleartomark, copy, dup, index, +pop, roll, setpagedevice, and stopped operators +are supported. + +

+

cupsRasterOpen

+

Open a raster stream using a file descriptor.

+

+cups_raster_t *cupsRasterOpen (
+    int fd,
+    cups_mode_t mode
+);

+

Parameters

+
+
fd
+
File descriptor
+
mode
+
Mode - CUPS_RASTER_READ, +CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESSED, +or CUPS_RASTER_WRITE_PWG
+
+

Return Value

+

New stream

+

Discussion

+

This function associates a raster stream with the given file descriptor. +For most printer driver filters, "fd" will be 0 (stdin). For most raster +image processor (RIP) filters that generate raster data, "fd" will be 1 +(stdout).
+
+When writing raster data, the CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can +be used - compressed and PWG output is generally 25-50% smaller but adds a +100-300% execution time overhead.

+

cupsRasterOpenIO

+

Open a raster stream using a callback function.

+

+cups_raster_t *cupsRasterOpenIO (
+    cups_raster_iocb_t iocb,
+    void *ctx,
+    cups_mode_t mode
+);

+

Parameters

+
+
iocb
+
Read/write callback
+
ctx
+
Context pointer for callback
+
mode
+
Mode - CUPS_RASTER_READ, +CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESSED, +or CUPS_RASTER_WRITE_PWG
+
+

Return Value

+

New stream

+

Discussion

+

This function associates a raster stream with the given callback function and +context pointer.
+
+When writing raster data, the CUPS_RASTER_WRITE, +CUPS_RASTER_WRITE_COMPRESS, or CUPS_RASTER_WRITE_PWG mode can +be used - compressed and PWG output is generally 25-50% smaller but adds a +100-300% execution time overhead.

+

 DEPRECATED cupsRasterReadHeader

+

Read a raster page header and store it in a +version 1 page header structure.

+

+unsigned cupsRasterReadHeader (
+    cups_raster_t *r,
+    cups_page_header_t *h
+);

+

Parameters

+
+
r
+
Raster stream
+
h
+
Pointer to header data
+
+

Return Value

+

1 on success, 0 on failure/end-of-file

+

Discussion

+

This function is deprecated. Use cupsRasterReadHeader2 instead.
+
+Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset +of the version 2 page header data. This function handles reading version 2 +page headers and copying only the version 1 data into the provided buffer. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsRasterReadHeader2

+

Read a raster page header and store it in a +version 2 page header structure.

+

+unsigned cupsRasterReadHeader2 (
+    cups_raster_t *r,
+    cups_page_header2_t *h
+);

+

Parameters

+
+
r
+
Raster stream
+
h
+
Pointer to header data
+
+

Return Value

+

1 on success, 0 on failure/end-of-file

+

cupsRasterReadPixels

+

Read raster pixels.

+

+unsigned cupsRasterReadPixels (
+    cups_raster_t *r,
+    unsigned char *p,
+    unsigned len
+);

+

Parameters

+
+
r
+
Raster stream
+
p
+
Pointer to pixel buffer
+
len
+
Number of bytes to read
+
+

Return Value

+

Number of bytes read

+

Discussion

+

For best performance, filters should read one or more whole lines. +The "cupsBytesPerLine" value from the page header can be used to allocate +the line buffer and as the number of bytes to read.

+

 DEPRECATED cupsRasterWriteHeader

+

Write a raster page header from a version 1 page +header structure.

+

+unsigned cupsRasterWriteHeader (
+    cups_raster_t *r,
+    cups_page_header_t *h
+);

+

Parameters

+
+
r
+
Raster stream
+
h
+
Raster page header
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

This function is deprecated. Use cupsRasterWriteHeader2 instead. + +

+

 CUPS 1.2/Mac OS X 10.5 cupsRasterWriteHeader2

+

Write a raster page header from a version 2 +page header structure.

+

+unsigned cupsRasterWriteHeader2 (
+    cups_raster_t *r,
+    cups_page_header2_t *h
+);

+

Parameters

+
+
r
+
Raster stream
+
h
+
Raster page header
+
+

Return Value

+

1 on success, 0 on failure

+

Discussion

+

The page header can be initialized using cupsRasterInterpretPPD. + +

+

cupsRasterWritePixels

+

Write raster pixels.

+

+unsigned cupsRasterWritePixels (
+    cups_raster_t *r,
+    unsigned char *p,
+    unsigned len
+);

+

Parameters

+
+
r
+
Raster stream
+
p
+
Bytes to write
+
len
+
Number of bytes to write
+
+

Return Value

+

Number of bytes written

+

Discussion

+

For best performance, filters should write one or more whole lines. +The "cupsBytesPerLine" value from the page header can be used to allocate +the line buffer and as the number of bytes to write.

+

Data Types

+

cups_adv_t

+

AdvanceMedia attribute values

+

+typedef enum cups_adv_e cups_adv_t; +

+

cups_bool_t

+

Boolean type

+

+typedef enum cups_bool_e cups_bool_t; +

+

cups_cspace_t

+

cupsColorSpace attribute values

+

+typedef enum cups_cspace_e cups_cspace_t; +

+

cups_cut_t

+

CutMedia attribute values

+

+typedef enum cups_cut_e cups_cut_t; +

+

cups_edge_t

+

LeadingEdge attribute values

+

+typedef enum cups_edge_e cups_edge_t; +

+

cups_interpret_cb_t

+

cupsRasterInterpretPPD callback function

+

+typedef int (*cups_interpret_cb_t)(cups_page_header2_t *header, int preferred_bits); +

+

cups_jog_t

+

Jog attribute values

+

+typedef enum cups_jog_e cups_jog_t; +

+

cups_mode_t

+

cupsRasterOpen modes

+

+typedef enum cups_mode_e cups_mode_t; +

+

cups_order_t

+

cupsColorOrder attribute values

+

+typedef enum cups_order_e cups_order_t; +

+

cups_orient_t

+

Orientation attribute values

+

+typedef enum cups_orient_e cups_orient_t; +

+

 CUPS 1.2/Mac OS X 10.5 cups_page_header2_t

+

Version 2 page header

+

+typedef struct cups_page_header2_s cups_page_header2_t; +

+

 DEPRECATED cups_page_header_t

+

Version 1 page header

+

+typedef struct cups_page_header_s cups_page_header_t; +

+

cups_raster_iocb_t

+

cupsRasterOpenIO callback function

+

+typedef ssize_t (*cups_raster_iocb_t)(void *ctx, unsigned char *buffer, size_t length); +

+

cups_raster_t

+

Raster stream data

+

+typedef struct _cups_raster_s cups_raster_t; +

+

Structures

+

 CUPS 1.2/Mac OS X 10.5 cups_page_header2_s

+

Version 2 page header

+

struct cups_page_header2_s {
+    unsigned AdvanceDistance;
+    cups_adv_t AdvanceMedia;
+    cups_bool_t Collate;
+    cups_cut_t CutMedia;
+    cups_bool_t Duplex;
+    unsigned HWResolution[2];
+    unsigned ImagingBoundingBox[4];
+    cups_bool_t InsertSheet;
+    cups_jog_t Jog;
+    cups_edge_t LeadingEdge;
+    cups_bool_t ManualFeed;
+    unsigned Margins[2];
+    char MediaClass[64];
+    char MediaColor[64];
+    unsigned MediaPosition;
+    char MediaType[64];
+    unsigned MediaWeight;
+    cups_bool_t MirrorPrint;
+    cups_bool_t NegativePrint;
+    unsigned NumCopies;
+    cups_orient_t Orientation;
+    cups_bool_t OutputFaceUp;
+    char OutputType[64];
+    unsigned PageSize[2];
+    cups_bool_t Separations;
+    cups_bool_t TraySwitch;
+    cups_bool_t Tumble;
+    unsigned cupsBitsPerColor;
+    unsigned cupsBitsPerPixel;
+    float cupsBorderlessScalingFactor;
+    unsigned cupsBytesPerLine;
+    cups_order_t cupsColorOrder;
+    cups_cspace_t cupsColorSpace;
+    unsigned cupsCompression;
+    unsigned cupsHeight;
+    float cupsImagingBBox[4];
+    unsigned cupsInteger[16];
+    char cupsMarkerType[64];
+    unsigned cupsMediaType;
+    unsigned cupsNumColors;
+    char cupsPageSizeName[64];
+    float cupsPageSize[2];
+    float cupsReal[16];
+    char cupsRenderingIntent[64];
+    unsigned cupsRowCount;
+    unsigned cupsRowFeed;
+    unsigned cupsRowStep;
+    char cupsString[16][64];
+    unsigned cupsWidth;
+};

+

Members

+
+
AdvanceDistance
+
AdvanceDistance value in points
+
AdvanceMedia
+
AdvanceMedia value (cups_adv_t)
+
Collate
+
Collated copies value
+
CutMedia
+
CutMedia value (cups_cut_t)
+
Duplex
+
Duplexed (double-sided) value
+
HWResolution[2]
+
Resolution in dots-per-inch
+
ImagingBoundingBox[4]
+
Pixel region that is painted (points, left, bottom, right, top)
+
InsertSheet
+
InsertSheet value
+
Jog
+
Jog value (cups_jog_t)
+
LeadingEdge
+
LeadingEdge value (cups_edge_t)
+
ManualFeed
+
ManualFeed value
+
Margins[2]
+
Lower-lefthand margins in points
+
MediaClass[64]
+
MediaClass string
+
MediaColor[64]
+
MediaColor string
+
MediaPosition
+
MediaPosition value
+
MediaType[64]
+
MediaType string
+
MediaWeight
+
MediaWeight value in grams/m^2
+
MirrorPrint
+
MirrorPrint value
+
NegativePrint
+
NegativePrint value
+
NumCopies
+
Number of copies to produce
+
Orientation
+
Orientation value (cups_orient_t)
+
OutputFaceUp
+
OutputFaceUp value
+
OutputType[64]
+
OutputType string
+
PageSize[2]
+
Width and length of page in points
+
Separations
+
Separations value
+
TraySwitch
+
TraySwitch value
+
Tumble
+
Tumble value
+
cupsBitsPerColor
+
Number of bits for each color
+
cupsBitsPerPixel
+
Number of bits for each pixel
+
cupsBorderlessScalingFactor  CUPS 1.2/Mac OS X 10.5 
+
Scaling that was applied to page data
+
cupsBytesPerLine
+
Number of bytes per line
+
cupsColorOrder
+
Order of colors
+
cupsColorSpace
+
True colorspace
+
cupsCompression
+
Device compression to use
+
cupsHeight
+
Height of page image in pixels
+
cupsImagingBBox[4]  CUPS 1.2/Mac OS X 10.5 
+
Floating point ImagingBoundingBox +(scaling factor not applied, left, +bottom, right, top)
+
cupsInteger[16]  CUPS 1.2/Mac OS X 10.5 
+
User-defined integer values
+
cupsMarkerType[64]  CUPS 1.2/Mac OS X 10.5 
+
Ink/toner type
+
cupsMediaType
+
Media type code
+
cupsNumColors  CUPS 1.2/Mac OS X 10.5 
+
Number of color compoents
+
cupsPageSizeName[64]  CUPS 1.2/Mac OS X 10.5 
+
PageSize name
+
cupsPageSize[2]  CUPS 1.2/Mac OS X 10.5 
+
Floating point PageSize (scaling * +factor not applied)
+
cupsReal[16]  CUPS 1.2/Mac OS X 10.5 
+
User-defined floating-point values
+
cupsRenderingIntent[64]  CUPS 1.2/Mac OS X 10.5 
+
Color rendering intent
+
cupsRowCount
+
Rows per band
+
cupsRowFeed
+
Feed between bands
+
cupsRowStep
+
Spacing between lines
+
cupsString[16][64]  CUPS 1.2/Mac OS X 10.5 
+
User-defined string values
+
cupsWidth
+
Width of page image in pixels
+
+

 DEPRECATED cups_page_header_s

+

Version 1 page header

+

struct cups_page_header_s {
+    unsigned AdvanceDistance;
+    cups_adv_t AdvanceMedia;
+    cups_bool_t Collate;
+    cups_cut_t CutMedia;
+    cups_bool_t Duplex;
+    unsigned HWResolution[2];
+    unsigned ImagingBoundingBox[4];
+    cups_bool_t InsertSheet;
+    cups_jog_t Jog;
+    cups_edge_t LeadingEdge;
+    cups_bool_t ManualFeed;
+    unsigned Margins[2];
+    char MediaClass[64];
+    char MediaColor[64];
+    unsigned MediaPosition;
+    char MediaType[64];
+    unsigned MediaWeight;
+    cups_bool_t MirrorPrint;
+    cups_bool_t NegativePrint;
+    unsigned NumCopies;
+    cups_orient_t Orientation;
+    cups_bool_t OutputFaceUp;
+    char OutputType[64];
+    unsigned PageSize[2];
+    cups_bool_t Separations;
+    cups_bool_t TraySwitch;
+    cups_bool_t Tumble;
+    unsigned cupsBitsPerColor;
+    unsigned cupsBitsPerPixel;
+    unsigned cupsBytesPerLine;
+    cups_order_t cupsColorOrder;
+    cups_cspace_t cupsColorSpace;
+    unsigned cupsCompression;
+    unsigned cupsHeight;
+    unsigned cupsMediaType;
+    unsigned cupsRowCount;
+    unsigned cupsRowFeed;
+    unsigned cupsRowStep;
+    unsigned cupsWidth;
+};

+

Members

+
+
AdvanceDistance
+
AdvanceDistance value in points
+
AdvanceMedia
+
AdvanceMedia value (cups_adv_t)
+
Collate
+
Collated copies value
+
CutMedia
+
CutMedia value (cups_cut_t)
+
Duplex
+
Duplexed (double-sided) value
+
HWResolution[2]
+
Resolution in dots-per-inch
+
ImagingBoundingBox[4]
+
Pixel region that is painted (points, left, bottom, right, top)
+
InsertSheet
+
InsertSheet value
+
Jog
+
Jog value (cups_jog_t)
+
LeadingEdge
+
LeadingEdge value (cups_edge_t)
+
ManualFeed
+
ManualFeed value
+
Margins[2]
+
Lower-lefthand margins in points
+
MediaClass[64]
+
MediaClass string
+
MediaColor[64]
+
MediaColor string
+
MediaPosition
+
MediaPosition value
+
MediaType[64]
+
MediaType string
+
MediaWeight
+
MediaWeight value in grams/m^2
+
MirrorPrint
+
MirrorPrint value
+
NegativePrint
+
NegativePrint value
+
NumCopies
+
Number of copies to produce
+
Orientation
+
Orientation value (cups_orient_t)
+
OutputFaceUp
+
OutputFaceUp value
+
OutputType[64]
+
OutputType string
+
PageSize[2]
+
Width and length of page in points
+
Separations
+
Separations value
+
TraySwitch
+
TraySwitch value
+
Tumble
+
Tumble value
+
cupsBitsPerColor
+
Number of bits for each color
+
cupsBitsPerPixel
+
Number of bits for each pixel
+
cupsBytesPerLine
+
Number of bytes per line
+
cupsColorOrder
+
Order of colors
+
cupsColorSpace
+
True colorspace
+
cupsCompression
+
Device compression to use
+
cupsHeight
+
Height of page image in pixels
+
cupsMediaType
+
Media type code
+
cupsRowCount
+
Rows per band
+
cupsRowFeed
+
Feed between bands
+
cupsRowStep
+
Spacing between lines
+
cupsWidth
+
Width of page image in pixels
+
+

Constants

+

cups_adv_e

+

AdvanceMedia attribute values

+

Constants

+
+
CUPS_ADVANCE_FILE
+
Advance the roll after this file
+
CUPS_ADVANCE_JOB
+
Advance the roll after this job
+
CUPS_ADVANCE_NONE
+
Never advance the roll
+
CUPS_ADVANCE_PAGE
+
Advance the roll after this page
+
CUPS_ADVANCE_SET
+
Advance the roll after this set
+
+

cups_bool_e

+

Boolean type

+

Constants

+
+
CUPS_FALSE
+
Logical false
+
CUPS_TRUE
+
Logical true
+
+

cups_cspace_e

+

cupsColorSpace attribute values

+

Constants

+
+
CUPS_CSPACE_ADOBERGB  CUPS 1.4.5 
+
Red, green, blue (Adobe RGB)
+
CUPS_CSPACE_CIELab  CUPS 1.1.19/Mac OS X 10.3 
+
CIE Lab
+
CUPS_CSPACE_CIEXYZ  CUPS 1.1.19/Mac OS X 10.3 
+
CIE XYZ
+
CUPS_CSPACE_CMY
+
Cyan, magenta, yellow (DeviceCMY)
+
CUPS_CSPACE_CMYK
+
Cyan, magenta, yellow, black (DeviceCMYK)
+
CUPS_CSPACE_DEVICE1  CUPS 1.4.5 
+
DeviceN, 1 color
+
CUPS_CSPACE_DEVICE2  CUPS 1.4.5 
+
DeviceN, 2 colors
+
CUPS_CSPACE_DEVICE3  CUPS 1.4.5 
+
DeviceN, 3 colors
+
CUPS_CSPACE_DEVICE4  CUPS 1.4.5 
+
DeviceN, 4 colors
+
CUPS_CSPACE_DEVICE5  CUPS 1.4.5 
+
DeviceN, 5 colors
+
CUPS_CSPACE_DEVICE6  CUPS 1.4.5 
+
DeviceN, 6 colors
+
CUPS_CSPACE_DEVICE7  CUPS 1.4.5 
+
DeviceN, 7 colors
+
CUPS_CSPACE_DEVICE8  CUPS 1.4.5 
+
DeviceN, 8 colors
+
CUPS_CSPACE_DEVICE9  CUPS 1.4.5 
+
DeviceN, 9 colors
+
CUPS_CSPACE_DEVICEA  CUPS 1.4.5 
+
DeviceN, 10 colors
+
CUPS_CSPACE_DEVICEB  CUPS 1.4.5 
+
DeviceN, 11 colors
+
CUPS_CSPACE_DEVICEC  CUPS 1.4.5 
+
DeviceN, 12 colors
+
CUPS_CSPACE_DEVICED  CUPS 1.4.5 
+
DeviceN, 13 colors
+
CUPS_CSPACE_DEVICEE  CUPS 1.4.5 
+
DeviceN, 14 colors
+
CUPS_CSPACE_DEVICEF  CUPS 1.4.5 
+
DeviceN, 15 colors
+
CUPS_CSPACE_GMCK  DEPRECATED 
+
Gold, magenta, yellow, black
+
CUPS_CSPACE_GMCS  DEPRECATED 
+
Gold, magenta, yellow, silver
+
CUPS_CSPACE_GOLD  DEPRECATED 
+
Gold foil
+
CUPS_CSPACE_ICC1  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 1 color
+
CUPS_CSPACE_ICC2  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 2 colors
+
CUPS_CSPACE_ICC3  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 3 colors
+
CUPS_CSPACE_ICC4  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 4 colors
+
CUPS_CSPACE_ICC5  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 5 colors
+
CUPS_CSPACE_ICC6  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 6 colors
+
CUPS_CSPACE_ICC7  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 7 colors
+
CUPS_CSPACE_ICC8  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 8 colors
+
CUPS_CSPACE_ICC9  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 9 colors
+
CUPS_CSPACE_ICCA  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 10 colors
+
CUPS_CSPACE_ICCB  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 11 colors
+
CUPS_CSPACE_ICCC  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 12 colors
+
CUPS_CSPACE_ICCD  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 13 colors
+
CUPS_CSPACE_ICCE  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 14 colors
+
CUPS_CSPACE_ICCF  CUPS 1.1.19/Mac OS X 10.3 
+
ICC-based, 15 colors
+
CUPS_CSPACE_K
+
Black (DeviceK)
+
CUPS_CSPACE_KCMY  DEPRECATED 
+
Black, cyan, magenta, yellow
+
CUPS_CSPACE_KCMYcm  DEPRECATED 
+
Black, cyan, magenta, yellow, light-cyan, light-magenta
+
CUPS_CSPACE_RGB
+
Red, green, blue (DeviceRGB, sRGB by default)
+
CUPS_CSPACE_RGBA
+
Red, green, blue, alpha (DeviceRGB, sRGB by default)
+
CUPS_CSPACE_RGBW  CUPS 1.2/Mac OS X 10.5 
+
Red, green, blue, white (DeviceRGB, sRGB by default)
+
CUPS_CSPACE_SILVER  DEPRECATED 
+
Silver foil
+
CUPS_CSPACE_SRGB  CUPS 1.4.5 
+
Red, green, blue (sRGB)
+
CUPS_CSPACE_SW  CUPS 1.4.5 
+
Luminance (gamma 2.2)
+
CUPS_CSPACE_W
+
Luminance (DeviceGray, gamma 2.2 by default)
+
CUPS_CSPACE_WHITE  DEPRECATED 
+
White ink (as black)
+
CUPS_CSPACE_YMC  DEPRECATED 
+
Yellow, magenta, cyan
+
CUPS_CSPACE_YMCK  DEPRECATED 
+
Yellow, magenta, cyan, black
+
+

cups_cut_e

+

CutMedia attribute values

+

Constants

+
+
CUPS_CUT_FILE
+
Cut the roll after this file
+
CUPS_CUT_JOB
+
Cut the roll after this job
+
CUPS_CUT_NONE
+
Never cut the roll
+
CUPS_CUT_PAGE
+
Cut the roll after this page
+
CUPS_CUT_SET
+
Cut the roll after this set
+
+

cups_edge_e

+

LeadingEdge attribute values

+

Constants

+
+
CUPS_EDGE_BOTTOM
+
Leading edge is the bottom of the page
+
CUPS_EDGE_LEFT
+
Leading edge is the left of the page
+
CUPS_EDGE_RIGHT
+
Leading edge is the right of the page
+
CUPS_EDGE_TOP
+
Leading edge is the top of the page
+
+

cups_jog_e

+

Jog attribute values

+

Constants

+
+
CUPS_JOG_FILE
+
Move pages after this file
+
CUPS_JOG_JOB
+
Move pages after this job
+
CUPS_JOG_NONE
+
Never move pages
+
CUPS_JOG_SET
+
Move pages after this set
+
+

cups_mode_e

+

cupsRasterOpen modes

+

Constants

+
+
CUPS_RASTER_READ
+
Open stream for reading
+
CUPS_RASTER_WRITE
+
Open stream for writing
+
CUPS_RASTER_WRITE_COMPRESSED  CUPS 1.3/Mac OS X 10.5 
+
Open stream for compressed writing
+
CUPS_RASTER_WRITE_PWG  CUPS 1.5/Mac OS X 10.7 
+
Open stream for compressed writing in PWG mode
+
+

cups_order_e

+

cupsColorOrder attribute values

+

Constants

+
+
CUPS_ORDER_BANDED
+
CCC MMM YYY KKK ...
+
CUPS_ORDER_CHUNKED
+
CMYK CMYK CMYK ...
+
CUPS_ORDER_PLANAR
+
CCC ... MMM ... YYY ... KKK ...
+
+

cups_orient_e

+

Orientation attribute values

+

Constants

+
+
CUPS_ORIENT_0
+
Don't rotate the page
+
CUPS_ORIENT_180
+
Turn the page upside down
+
CUPS_ORIENT_270
+
Rotate the page clockwise
+
CUPS_ORIENT_90
+
Rotate the page counter-clockwise
+
+
+ + diff --git a/doc/help/cgi.html b/doc/help/cgi.html new file mode 100644 index 0000000..c50a2a5 --- /dev/null +++ b/doc/help/cgi.html @@ -0,0 +1,86 @@ + + + + Using CGI Programs + + + + +

Using CGI Programs

+ +

CUPS provides a dynamic web interface through dedicated CGI programs that +are executed when users open special directories on the CUPS server. Each CGI +performs administration, class, help, job, and printer functions as directed by +the user, but the actual programs that are run and functions that are available +are limited to those that were originally designed into the scheduler.

+ +

CUPS also supports CGI programs and specific scripting languages (Java, Perl, +PHP, and Python) for pages you want to provide. The interpreters for these +languages are currently configured at compile time and are associated with +MIME media types. Table 1 shows the MIME media types that +are reserved for each type of page and are the same as those used by the Apache +web server.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: CGI MIME Media Types
MIME Media TypeDescription
application/x-httpd-cgiCGI script/program
application/x-httpd-javaJava program
application/x-httpd-perlPerl script
application/x-httpd-phpPHP script
application/x-httpd-pythonPython script
+ +

Configuring the Server

+ +

In order to enable the corresponding type, you must create a +new /etc/cups/cgi.types file which maps the filename +extensions to the appropriate MIME types, for example:

+ +
+application/x-httpd-cgi cgi
+application/x-httpd-java class
+application/x-httpd-perl pl
+application/x-httpd-php php
+application/x-httpd-python py
+
+ +

CGI scripts/programs (application/x-httpd-cgi) also must have execution +permissions to be treated as a CGI script or program.

+ +

Limitations

+ +

CUPS implements most of the CGI/1.1 specification, with the +following exceptions:

+ +
    + +
  • No PATH_INFO or PATH_TRANSLATED support
  • + +
  • Limited HTTP field support; only the Content-Length + (CONTENT_LENGTH), Cookie (HTTP_COOKIE), and User-Agent + (HTTP_USER_AGENT) fields are placed in environment + variables at this time
  • + +
+ + + diff --git a/doc/help/glossary.html b/doc/help/glossary.html new file mode 100644 index 0000000..c6898dc --- /dev/null +++ b/doc/help/glossary.html @@ -0,0 +1,219 @@ + + + + Glossary + + + + +

Glossary

+ +

A

+ +
+ +
ASCII +
American Standard Code for Information Interchange + +
+ + +

C

+ +
+ +
C +
A computer language + +
Character Set +
The association of numbers with specific printed or + displayed characters or symbols + +
+ + +

E

+ +
+ +
ESC/P +
EPSON Standard Code for Printers + +
+ + +

F

+ +
+ +
FTP +
File Transfer Protocol + +
+ + +

G

+ +
+ +
GIF +
Graphics Interchange Format + +
+ + +

H

+ +
+ +
HP-GL +
Hewlett-Packard Graphics Language + +
HP-PCL +
Hewlett-Packard Page Control Language + +
HP-PJL +
Hewlett-Packard Printer Job Language + +
+ + +

I

+ +
+ +
IETF +
Internet Engineering Task Force + +
IP +
Internet Protocol + +
IPv4 +
Internet Protocol, version 4; IPv4 addresses are 32-bits in + length and often look like "nnn.nnn.nnn.nnn" and "127.0.0.1" + +
IPv6 +
Internet Protocol, version 6: IPv6 addresses are 128-bits in + length and look like "xxxx::xxxx:xxxx:xxxx:xxxx" and "::1" + +
IPP +
Internet Printing Protocol + +
ISO +
International Standards Organization + +
+ + +

J

+ +
+ +
JFIF +
JPEG File Interchange Format + +
JPEG +
Joint Photographic Experts Group + +
+ + +

L

+ +
+ +
LPD +
Line Printer Daemon + +
+ + +

M

+ +
+ +
MIME +
Multimedia Internet Mail Exchange + +
+ + +

P

+ +
+ +
parallel +
Sending or receiving data more than 1 bit at a time + +
PDF +
Portable Document Format + +
pipe +
A one-way communications channel between two programs + +
PNG +
Portable Network Graphics + +
PostScript +
A page description language that is most often used + for printing + +
PPD +
PostScript Printer Description + +
+ + +

S

+ +
+ +
SCSI +
Small Computer Systems Interface + +
serial +
Sending or receiving data 1 bit at a time + +
SMB +
Server Message Block + +
socket +
A two-way network communications channel + +
+ + +

T

+ +
+ +
TCP +
Transmission Control Protocol + +
TFTP +
Trivial File Transfer Protocol + +
TIFF +
Tagged Image File Format + +
+ + +

U

+ +
+ +
UDP +
Unicast Datagram Protocol + +
Unicode +
A universal character set for all languages of the + world + +
UTF-8 +
Unicode Transfer Format 8-Bit + +
+ + + diff --git a/doc/help/kerberos.html b/doc/help/kerberos.html new file mode 100644 index 0000000..cb8b88c --- /dev/null +++ b/doc/help/kerberos.html @@ -0,0 +1,89 @@ + + + + Using Kerberos Authentication + + + + +

Using Kerberos Authentication

+ +

CUPS allows you to use a Key Distribution Center (KDC) for authentication on your local CUPS server and when printing to a remote authenticated queue. This document describes how to configure CUPS to use Kerberos authentication and provides links to the MIT help pages for configuring Kerberos on your systems and network.

+ + +

System Requirements

+ +

The following are required to use Kerberos with CUPS:

+ +
    + +
  1. Heimdal Kerberos (any version) or MIT Kerberos (1.6.3 or newer)
  2. + +
  3. Properly configured Domain Name System (DNS) infrastructure (for your servers):
      +
    1. DNS server(s) with static IP addresses for all CUPS servers or configured to allow DHCP updates to the host addresses and
    2. +
    3. All CUPS clients and servers configured to use the same +DNS server(s).
    4. +
  4. + +
  5. Properly configured Kerberos infrastructure:
      +
    1. KDC configured to allow CUPS servers to obtain Service Granting Tickets (SGTs) for the "host" service,
    2. +
    3. LDAP-based user accounts - both OpenDirectory and ActiveDirectory provide this with the KDC, and
    4. +
    5. CUPS clients and servers bound to the same KDC and LDAP + server(s).
    6. +
  6. + +
  7. A "host" Service Granting Ticket (SGT) for every CUPS server
  8. + +
+ + +

Configuring Kerberos on Your System

+ +

Before you can use Kerberos with CUPS, you will need to configure Kerberos on your system and setup a system as a KDC. Because this configuration is highly system and site-specific, please consult the following on-line resources provided by the creators of Kerberos at the Massachusetts Institute of Technology (MIT):

+ + + +

The Linux Documentation Project also has a HOWTO on Kerberos:

+ + + + +

Configuring CUPS to Use Kerberos

+ +

Once youhave configured Kerberos on your system(s), you can then enable Kerberos authentication by selecting the Negotiate authentication type. The simplest way to do this is using the cupsctl(8) command on your server(s):

+ +
+cupsctl DefaultAuthType=Negotiate
+
+ +

You can also enable Kerberos from the web interface by checking the Use Kerberos Authentication box and clicking Change Settings:

+ +
+http://server.example.com:631/admin
+
+ +

After you have enabled Kerberos authentication, use the built-in "authenticated" policy or your own custom policies with the printers you will be sharing. See Managing Operation Policies for more information.

+ + +

Implementation Information

+ +

CUPS implements Kerberos over HTTP using GSSAPI and the service name "host". Because of limitations in the HTTP GSSAPI protocol extension, only a single domain/KDC is supported for authentication. The HTTP extension is described in RFC 4559.

+ +

When doing printing tasks that require authentication, CUPS requests single-use "tickets" from your login session to authenticate who you are. These tickets give CUPS a username of the form "user@REALM", which is then converted to just "user" for purposes of user and group checks.

+ +

In order to support printing to a shared printer, CUPS runs the IPP backend as the owner of the print job so it can obtain the necessary credentials.

+ + + diff --git a/doc/help/license.html b/doc/help/license.html new file mode 100644 index 0000000..2b7c246 --- /dev/null +++ b/doc/help/license.html @@ -0,0 +1,1076 @@ + + + + Software License Agreement + + + + +

Software License Agreement

+ +

Copyright 2007-2011 by Apple Inc.
+1 Infinite Loop
+Cupertino, CA 95014 USA
+
+WWW: http://www.cups.org/ + +

Introduction

+ +

CUPSTM is provided under the GNU General Public License ("GPL") +and GNU Library General Public License ("LGPL"), Version 2, with exceptions for +Apple operating systems and the OpenSSL toolkit. A copy of the exceptions and +licenses follow this introduction.

+ +

The GNU LGPL applies to the CUPS and CUPS Imaging libraries located in the +"cups" and "filter" subdirectories of the CUPS source distribution and the files +in the "test" subdirectory. The GNU GPL applies to the remainder of the CUPS +distribution.

+ +

For those not familiar with the GNU GPL, the license basically +allows you to:

+ +
    + +
  • Use the CUPS software at no charge.
  • + +
  • Distribute verbatim copies of the software in source + or binary form.
  • + +
  • Sell verbatim copies of the software for a media + fee, or sell support for the software.
  • + +
+ +

What this license does not allow you to do is make +changes or add features to CUPS and then sell a binary +distribution without source code. You must provide source for any +changes or additions to the software, and all code must be +provided under the GPL or LGPL as appropriate. The only +exceptions to this are the portions of the CUPS software covered +by the Apple operating system license exceptions outlined later +in this license agreement.

+ +

The GNU LGPL relaxes the "link-to" restriction, allowing you +to develop applications that use the CUPS and CUPS Imaging +libraries under other licenses and/or conditions as appropriate +for your application, driver, or filter.

+ + +

License Exceptions

+ +

In addition, as the copyright holder of CUPS, Apple Inc. grants +the following special exceptions:

+ +
    + +
  1. Apple Operating System Development License + Exception; + +
      + +
    1. Software that is developed by any person or + entity for an Apple Operating System ("Apple + OS-Developed Software"), including but not + limited to Apple and third party printer + drivers, filters, and backends for an Apple + Operating System, that is linked to the CUPS + imaging library or based on any sample filters + or backends provided with CUPS shall not be + considered to be a derivative work or collective + work based on the CUPS program and is exempt + from the mandatory source code release clauses + of the GNU GPL. You may therefore distribute + linked combinations of the CUPS imaging library + with Apple OS-Developed Software without + releasing the source code of the Apple + OS-Developed Software. You may also use sample + filters and backends provided with CUPS to + develop Apple OS-Developed Software without + releasing the source code of the Apple + OS-Developed Software.
    2. + +
    3. An Apple Operating System means any + operating system software developed and/or + marketed by Apple Computer, Inc., including but + not limited to all existing releases and + versions of Apple's Darwin, Mac OS X, and Mac OS + X Server products and all follow-on releases and + future versions thereof.
    4. + +
    5. This exception is only available for Apple + OS-Developed Software and does not apply to + software that is distributed for use on other + operating systems.
    6. + +
    7. All CUPS software that falls under this + license exception have the following text at the + top of each source file: + +
      This file is subject to the Apple + OS-Developed Software + exception.
    8. + +
    + +
  2. OpenSSL Toolkit License Exception; + +
      + +
    1. Apple Inc. explicitly allows the + compilation and distribution of the CUPS + software with the OpenSSL Toolkit.
    2. + +
    + +
+ +

No developer is required to provide these exceptions in a +derived work.

+ + +

Kerberos Support Code

+ +

The Kerberos support code ("KSC") is copyright 2006 by Jelmer +Vernooij and is provided 'as-is', without any express or implied +warranty. In no event will the author or Apple Inc. be held liable +for any damages arising from the use of the KSC.

+ +

Sources files containing KSC have the following text at the top +of each source file:

+ +
This file contains Kerberos support code, copyright +2006 by Jelmer Vernooij.
+ +

The KSC copyright and license apply only to +Kerberos-related feature code in CUPS. Such code is typically +conditionally compiled based on the present of the +HAVE_GSSAPI preprocessor definition.

+ +

Permission is granted to anyone to use the KSC for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following +restrictions:

+ +
    + +
  1. The origin of the KSC must not be misrepresented; you + must not claim that you wrote the original software. If + you use the KSC in a product, an acknowledgment in the + product documentation would be appreciated but is not + required.
  2. + +
  3. Altered source versions must be plainly marked as + such, and must not be misrepresented as being the + original software.
  4. + +
  5. This notice may not be removed or altered from any + source distribution.
  6. + +
+ + +

Trademarks

+ +

CUPS and the CUPS logo (the "CUPS Marks") are trademarks of Apple Inc. Apple +grants you a non-exclusive and non-transferable right to use the CUPS Marks in +any direct port or binary distribution incorporating CUPS software and in any +promotional material therefor. You agree that your products will meet the +highest levels of quality and integrity for similar goods, not be unlawful, and +be developed, manufactured, and distributed in compliance with this license. +You will not interfere with Apple's rights in the CUPS Marks, and all use of the +CUPS Marks shall inure to the benefit of Apple. This license does not apply to +use of the CUPS Marks in a derivative products, which requires prior written +permission from Apple Inc.

+ + +

GNU GENERAL PUBLIC LICENSE

+ +

Version 2, June 1991 + +

+Copyright 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim
+copies of this license document, but changing it is not allowed.
+
+ +

Preamble

+ +

The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + +

When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +

To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + +

For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +

We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +

Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + +

Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + +

The precise terms and conditions for copying, distribution and +modification follow. + +

GNU GENERAL PUBLIC LICENSE
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+ +
    + +
  1. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +

    Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +

  2. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +

    You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +

  3. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +
      + +
    1. You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +
    2. You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +
    3. if the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) + +
    + +

    These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +

    Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +

    In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +

  4. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +
      + +
    1. Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +
    2. Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +
    3. Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) + +
    + +

    The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +

    If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +

  5. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +
  6. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +
  7. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +
  8. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +

    If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +

    It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +

    This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +

  9. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +
  10. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +

    Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +

  11. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +
+ +

NO WARRANTY

+ +
    + +
  1. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +
  2. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +
+ +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Programs

+ +

If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + +

To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + +

+one line to give the program's name and an idea of what it does.
+Copyright (C) yyyy  name of author
+
+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.
+
+ +

Also add information on how to contact you by electronic and paper mail. + +

If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +

+Gnomovision version 69, Copyright (C) year name of author
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'.  This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+
+ +

The hypothetical commands `show w' and `show c' should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and +`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + +

You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + +

+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+ +

GNU LIBRARY GENERAL PUBLIC LICENSE

+ +

Version 2, June 1991 + +

+Copyright (C) 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+ +

Preamble

+ +

The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + +

This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + +

When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +

To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + +

For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + +

Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + +

Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + +

Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + +

Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + +

The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + +

Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + +

However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + +

The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + +

Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + +

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+ +

0. +This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + +

A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + +

The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + +

"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + +

Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + +

1. +You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + +

You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + +

2. +You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +

    + +
  1. The modified work must itself be a software library. + +

    +

  2. You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + +

    +

  3. You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + +

    +

  4. If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + +

    (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +

+ +

These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +

Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +

In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +

3. +You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + +

Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + +

This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + +

4. +You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + +

If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + +

5. +A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + +

However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + +

When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + +

If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + +

Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + +

6. +As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + +

You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + +

    + +
  1. Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + +

    +

  2. Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + +

    +

  3. If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + +

    +

  4. Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + +
+ +

For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + +

It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + +

7. +You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + +

    + +
  1. Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + +

    +

  2. Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + +
+ +

8. +You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + +

9. +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + +

10. +Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +

11. +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +

If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +

It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +

This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +

12. +If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + +

13. +The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +

Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + +

14. +If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + +

NO WARRANTY + +

15. +BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +

16. +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +

END OF TERMS AND CONDITIONS

+ +

How to Apply These Terms to Your New Libraries

+ +

If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + +

To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + +

+one line to give the library's name and an idea of what it does.
+Copyright (C) year  name of author
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library 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
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+ +

Also add information on how to contact you by electronic and paper mail. + +

You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + +

+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the library `Frob' (a library for tweaking knobs) written
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+Ty Coon, President of Vice
+
+ +

That's all there is to it! + + + diff --git a/doc/help/network.html b/doc/help/network.html new file mode 100644 index 0000000..d02d4f4 --- /dev/null +++ b/doc/help/network.html @@ -0,0 +1,684 @@ + + + + Using Network Printers + + + + +

Using Network Printers

+ +

This help document describes how to discover, configure, and use TCP/IP network printers with CUPS.

+ +

Getting the IP Address

+ +

Every network printer or print server has a unique Internet Protocol (IP) address associated with it. This address is either configured manually or set using an automatic network protocol such as the Boot Protocol (BOOTP), Dynamic Host Control Protocol (DHCP), Reverse Address Resolution Protocol (RARP), or ZeroConf.

+ +

You can normally find the IP address of a printer on the printer's control panel or by printing the configuration or status page. The Simple Network Management Protocol (SNMP) can also be used to get the IP address remotely, which happens automatically when you visit the CUPS administration web page or choose an available CUPS device when adding a printer.

+ + +

Configuring the IP Address

+ +

When you first install a network printer or print server on your LAN, you need to set the Internet Protocol ("IP") address. Most higher-end "workgroup" printers allow you to set the address through the printer control panel. However, if you have many printers you will want to assign the addresses remotely - this makes administration a bit easier and avoids assigning duplicate addresses accidentally.

+ +

To setup your printer or print server for remote address assignment, you'll need the Ethernet Media Access Control ("MAC") address, also sometimes called a node address, and the IP address you want to use for the device. The Ethernet MAC address can often be found on the printer test page or bottom of the print server.

+ +

Configuring the IP Address Using DHCP

+ +

The DHCP protocol is the usual way of setting the IP address of a printer on a managed network. Using the standard dhcpd(8) program supplied with UNIX you simply need to add a line to the /etc/dhcpd.conf file:

+ +
+host hostname {
+  hardware ethernet mac-address;
+  fixed-address ip-address;
+}
+
+ +

Make sure that the hostname you use is also listed in the /etc/hosts file or is registered with your DNS server.

+ +

Configuring the IP Address Using BOOTP

+ +

The BOOTP protocol is used when you need to provide additional information such as the location of a configuration file to the network interface. Using the standard bootpd(8) program supplied with UNIX you simply need to add a line to the /etc/bootptab file; for IRIX:

+ +
+myprinter 08:00:69:00:12:34 192.0.2.2 myprinter.boot
+
+ +

Newer versions of bootpd use a different format:

+ +
+myprinter:ha=080069001234:ip=192.0.2.2:t144=myprinter.boot
+
+ +

The myprinter.boot file resides in the /usr/local/boot directory by default. If you do not need to provide a boot file you may leave the last part of the line blank.

+ +
Note: Some versions of UNIX do not enable the BOOTP service by default. The /etc/inetd.conf or /etc/xinetd.d/bootp file usually contains a line for the BOOTP service that can be uncommented if needed.
+ + +

Verifying the Printer Connection

+ +

To test that the IP address has been successfully assigned and +that the printer is properly connected to your LAN, type:

+ +
+ping ip-address
+
+ +

If the connection is working properly you will see something +like:

+ +
+ping myprinter
+PING myprinter (192.0.2.2): 56 data bytes
+64 bytes from 192.0.2.2: icmp_seq=0 ttl=15 time=5 ms
+64 bytes from 192.0.2.2: icmp_seq=1 ttl=15 time=3 ms
+64 bytes from 192.0.2.2: icmp_seq=2 ttl=15 time=3 ms
+64 bytes from 192.0.2.2: icmp_seq=3 ttl=15 time=3 ms
+
+ +

If not, verify that the printer or print server is connected +to the LAN, it is powered on, the LAN cabling is good, and the IP +address is set correctly. You can usually see the current IP +address and network status by printing a configuration or test +page on the device.

+ + +

Network Protocols Supported by CUPS

+ +

CUPS supports most network printers using one of three TCP/IP-based protocols. Printer discovery is currently accomplished using the SNMP protocol, however future versions of CUPS will also include support for multicast DNS service discovery as well.

+ +

AppSocket Protocol

+ +

The AppSocket protocol (sometimes also called the JetDirect protocol, owing to its origins with the HP JetDirect network interfaces) is the simplest, fastest, and generally the most reliable network protocol used for printers. AppSocket printing normally happens over port 9100 and uses the socket URI scheme:

+ +
+socket://ip-address-or-hostname
+socket://ip-address-or-hostname/?waiteof=false
+socket://ip-address-or-hostname:port-number
+socket://ip-address-or-hostname:port-number/?waiteof=false
+
+ +

The "waiteof" option controls whether the socket backend waits for the printer to complete the printing of the job. The default is to wait.

+ +

Internet Printing Protocol (IPP)

+ +

IPP is the only protocol that CUPS supports natively and is supported by some network printers and print servers. However, since many printers do not implement IPP properly, only use IPP when the vendor actually documents official support for it. IPP printing normally happens over port 631 and uses the http and ipp URI schemes:

+ +
+http://ip-address-or-hostname:port-number/resource
+http://ip-address-or-hostname:port-number/resource?option=value
+http://ip-address-or-hostname:port-number/resource?option=value&option=value
+ipp://ip-address-or-hostname/resource
+ipp://ip-address-or-hostname/resource?option=value
+ipp://ip-address-or-hostname/resource?option=value&option=value
+ipp://ip-address-or-hostname:port-number/resource
+ipp://ip-address-or-hostname:port-number/resource?option=value
+ipp://ip-address-or-hostname:port-number/resource?option=value&option=value
+
+ +

The ipp backend supports many options, which are summarized in Table 2.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: IPP URI Options
OptionDescription
compression=gzipSpecifies that print data should be compressed before sending.
encryption=alwaysSpecifies that the connection to the IPP server should be encrypted using SSL.
encryption=ifrequestedSpecifies that the connection to the IPP server should only be encrypted if the server requests it.
encryption=neverSpecifies that the connection to the IPP server should not be encrypted.
encryption=requiredSpecifies that the connection to the IPP server should be encrypted using TLS.
version=1.0Specifies that version 1.0 of the IPP protocol should be used instead of the default version 1.1.
version=2.0Specifies that version 2.0 of the IPP protocol should be used instead of the default version 1.1.
version=2.1Specifies that version 2.1 of the IPP protocol should be used instead of the default version 1.1.
waitjob=falseSpecifies that the IPP backend should not wait for the job to complete.
waitprinter=falseSpecifies that the IPP backend should not wait for the printer to become idle before sending the print job.
+ +

Line Printer Daemon (LPD) Protocol

+ +

LPD is the original network printing protocol and is supported by many network printers. Due to limitations in the LPD protocol, we do not recommend using it if the printer or server supports one of the other protocols. LPD printing normally happens over port 515 and uses the lpd URI scheme:

+ +
+lpd://ip-address-or-hostname/queue
+lpd://username@ip-address-or-hostname/queue
+lpd://ip-address-or-hostname/queue?option=value
+lpd://username@ip-address-or-hostname/queue?option=value
+lpd://ip-address-or-hostname/queue?option=value&option=value
+lpd://username@ip-address-or-hostname/queue?option=value&option=value
+
+ +

Table 3 summarizes the options supported by the lpd backend.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: LPD URI Options
OptionDescription
banner=onSpecifies that a banner page should be printed by the server.
contimeout=secondsSpecifies the number of seconds to wait for the connection to the server to complete.
format=cSpecifies that the print data is a CIF file.
format=dSpecifies that the print data is a DVI file.
format=fSpecifies that the print data is a plain text file.
format=gSpecifies that the print data is a Berkeley plot file.
format=lSpecifies that the print data is a raw (preformatted) print file.
format=nSpecifies that the print data is a ditroff file.
format=oSpecifies that the print data is a PostScript file.
format=pSpecifies that the print data is a plain text file that should be "pretty" printed with a header and footer.
format=rSpecifies that the print data is a FORTRAN carriage control file.
format=tSpecifies that the print data is a troff Graphic Systems C/A/T phototypesetter file.
format=vSpecifies that the print data is a Sun raster file.
order=data,controlSpecifies that the print data files should be sent before the control file.
reserve=noneSpecifies that the backend should not reserve a source port.
reserve=rfc1179Specifies that the backend should reserve a source port from 721 to 731 as required by RFC 1179.
sanitize_title=noSpecifies that the job title string should not be restricted to ASCII characters.
sanitize_title=yesSpecifies that the job title string should be restricted to ASCII characters.
timeout=secondsSpecifies the number of seconds to wait for LPD commands to complete.
+ + +

Common Network Printer URIs

+ +

Once you have set the IP address you can access the printer or print server using the ipp, lpd, or socket backends. Table 1 shows a list of common network interfaces and printer servers and the settings you should use with CUPS:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Common Device URIs
Model/ManufacturerDevice URI(s)
Apple LaserWriterlpd://address/PASSTHRU
Axis w/o IPP
+ Axis OfficeBasic
+ (see directions)
socket://address:9100
+ socket://address:9101
+ socket://address:9102
Axis w/IPPipp://address/LPT1
+ ipp://address/LPT2
+ ipp://address/COM1
Castelle LANpressTMlpd://address/pr1
+ lpd://address/pr2
+ lpd://address/pr3
DPI NETPrintlpd://address/pr1
+ lpd://address/pr2
+ lpd://address/pr3
DLink DP-301P+socket://address
EFI® Fiery® RIPlpd://address/print
EPSON® Multiprotocol Ethernet Interface Boardsocket://address
Extended System ExtendNETlpd://address/pr1
+ lpd://address/pr2
+ lpd://address/pr3
Hewlett Packard JetDirectsocket://address:9100
+ socket://address:9101
+ socket://address:9102
Intel® NetportExpress XL, PRO/100lpd://address/LPT1_PASSTHRU
+ lpd://address/LPT2_PASSTHRU
+ lpd://address/COM1_PASSTHRU
LexmarkTM MarkNetlpd://address/ps
Linksys EtherFast®
+ (see directions)
socket://address:4010
+ socket://address:4020
+ socket://address:4030
Linksys PSUS4lpd://address/lp
Kodak®lpd://address/ps
Netgear WGPS606lpd://address/L1
+ lpd://address/L2
QMS® CrownNetTMlpd://address/ps
Tektronix® PhaserShareTMsocket://address:9100
XEROX® 4512 NIClpd://address/PORT1
XEROX® XNIClpd://address/PASSTHRU
XEROX® (most others)socket://address:5503
+ + +

Troubleshooting SNMP Discovery Problems

+ +

Whenever you view the administration web page or a list of supported device URIs, the snmp backend will probe the local network(s) using Simple Network Management Protocol (SNMP) broadcasts. Printers that respond to these broadcasts are then interrogated for the make and model and supported protocols, yielding a device URI that can be used to add the printer.

+ +

That said, the SNMP requests sometimes expose problems in vendor SNMP or IPP implementations. If you are experiencing long delays in loading the CUPS web interface administration page, or if you don't see your printer listed, the following instructions will help you to diagnose those problems and/or provide important feedback to the CUPS developers so that we can correct problems and improve the SNMP backend in future releases.

+ +

Quick Fixes

+ +

If you don't use "public" as your community name, create a text file called /etc/cups/snmp.conf and put the following line in it:

+ +
+Community your community name
+
+ +

If you have more than one community name, list them all on separate lines.

+ +

If you don't support SNMP v1 on your network, you are currently "out of luck". That said, we will be adding v2, v2c, and v3 support in future CUPS releases once we have a handle on the actual requirements people have for such things. Please file or update an SNMP enhancement request with specific requirements you have - what you need supported, why you need it supported, and how you would like to see the functionality provided/exposed - so that we can do it "right" the first time.

+ +

Basic Debugging

+ +

The SNMP backend supports a debugging mode that is activated by running it from a shell prompt. If you are using Bash (/bin/bash), Bourne shell (/bin/sh), Korn shell (/bin/ksh), or Z shell (/bin/zsh), you can run the following command to get a verbose log of the SNMP backend:

+ +
+CUPS_DEBUG_LEVEL=2 /usr/lib/cups/backend/snmp 2>&1 | tee snmp.log
+
+ +

For C shell (/bin/csh) and TCsh (/bin/tcsh), use the following command instead:

+ +
+(setenv CUPS_DEBUG_LEVEL 2; /usr/lib/cups/backend/snmp) |& tee snmp.log
+
+ +

On MacOS X you'll find the SNMP backend in /usr/libexec/cups/backend instead:

+ +
+CUPS_DEBUG_LEVEL=2 /usr/libexec/cups/backend/snmp 2>&1 | tee snmp.log
+
+ +

The output will look something like this:

+ +
+ 1  INFO: Using default SNMP Address @LOCAL
+ 2  INFO: Using default SNMP Community public
+ 3  DEBUG: Scanning for devices in "public" via "@LOCAL"...
+ 4  DEBUG: 0.000 Sending 46 bytes to 192.168.2.255...
+ 5  DEBUG: SEQUENCE 44 bytes
+ 6  DEBUG:     INTEGER 1 bytes 0
+ 7  DEBUG:     OCTET STRING 6 bytes "public"
+ 8  DEBUG:     Get-Request-PDU 31 bytes
+ 9  DEBUG:         INTEGER 4 bytes 1149539174
+10  DEBUG:         INTEGER 1 bytes 0
+11  DEBUG:         INTEGER 1 bytes 0
+12  DEBUG:         SEQUENCE 17 bytes
+13  DEBUG:             SEQUENCE 15 bytes
+14  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.2.1
+15  DEBUG:                 NULL VALUE 0 bytes
+16  DEBUG: 0.001 Received 55 bytes from 192.168.2.229...
+17  DEBUG: community="public"
+18  DEBUG: request-id=1149539174
+19  DEBUG: error-status=0
+20  DEBUG: SEQUENCE 53 bytes
+21  DEBUG:     INTEGER 1 bytes 0
+22  DEBUG:     OCTET STRING 6 bytes "public"
+23  DEBUG:     Get-Response-PDU 40 bytes
+24  DEBUG:         INTEGER 4 bytes 1149539174
+25  DEBUG:         INTEGER 1 bytes 0
+26  DEBUG:         INTEGER 1 bytes 0
+27  DEBUG:         SEQUENCE 26 bytes
+28  DEBUG:             SEQUENCE 24 bytes
+29  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.2.1
+30  DEBUG:                 OID 9 bytes .1.3.6.1.2.1.25.3.1.5
+31  DEBUG: add_cache(addr=0xbfffe170, addrname="192.168.2.229",
+    uri="(null)", id="(null)", make_and_model="(null)")
+32  DEBUG: 0.002 Sending 46 bytes to 192.168.2.229...
+33  DEBUG: SEQUENCE 44 bytes
+34  DEBUG:     INTEGER 1 bytes 0
+35  DEBUG:     OCTET STRING 6 bytes "public"
+36  DEBUG:     Get-Request-PDU 31 bytes
+37  DEBUG:         INTEGER 4 bytes 1149539175
+38  DEBUG:         INTEGER 1 bytes 0
+39  DEBUG:         INTEGER 1 bytes 0
+40  DEBUG:         SEQUENCE 17 bytes
+41  DEBUG:             SEQUENCE 15 bytes
+42  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.3.1
+43  DEBUG:                 NULL VALUE 0 bytes
+44  DEBUG: 0.003 Received 69 bytes from 192.168.2.229...
+45  DEBUG: community="public"
+46  DEBUG: request-id=1149539175
+47  DEBUG: error-status=0
+48  DEBUG: SEQUENCE 67 bytes
+49  DEBUG:     INTEGER 1 bytes 0
+50  DEBUG:     OCTET STRING 6 bytes "public"
+51  DEBUG:     Get-Response-PDU 54 bytes
+52  DEBUG:         INTEGER 4 bytes 1149539175
+53  DEBUG:         INTEGER 1 bytes 0
+54  DEBUG:         INTEGER 1 bytes 0
+55  DEBUG:         SEQUENCE 40 bytes
+56  DEBUG:             SEQUENCE 38 bytes
+57  DEBUG:                 OID 11 bytes .1.3.6.1.2.1.25.3.2.1.3.1
+58  DEBUG:                 OCTET STRING 23 bytes "HP LaserJet 4000
+    Series"
+59  DEBUG: 1.001 Probing 192.168.2.229...
+60  DEBUG: 1.001 Trying socket://192.168.2.229:9100...
+61  DEBUG: 192.168.2.229 supports AppSocket!
+62  DEBUG: 1.002 Scan complete!
+63  network socket://192.168.2.229 "HP LaserJet 4000 Series"
+    "HP LaserJet 4000 Series 192.168.2.229" ""
+
+ +

Dissecting the Output

+ +

The first two lines are just informational and let you know that the default community name and address are being used. Lines 3-15 contain the initial SNMP query for the device type OID (.1.3.6.1.2.1.25.3.2.1.2.1) from the Host MIB.

+ +

Lines 16-31 show the response we got from an HP LaserJet 4000 network printer. At this point we discover that it is a printer device and then send another SNMP query (lines 32-43) for the device description OID (.1.3.6.1.2.1.25.3.2.1.3.1) from the Host MIB as well.

+ +

Lines 44-58 show the response to the device description query, which tells us that this is an HP LaserJet 4000 Series printer.

+ +

On line 59 we start our active connection probe and discover that this print server supports the AppSocket (JetDirect) protocol on port 9100.

+ +

Finally, line 63 shows the device information line for the print server that is sent to CUPS.

+ +

Reporting Problems

+ +If you don't see your printer listed, or the wrong information is listed, then you need to gather more information on the printer. The easiest way to do this is to run the snmpwalk command: + +
+snmpwalk -Cc -v 1 -c public ip-address | tee snmpwalk.log
+
+ +

where "ip-address" is the IP address of the printer or print server. You should see a lot of values stream by - the ones you want to see are:

+ +
+HOST-RESOURCES-MIB::hrDeviceType.1 = OID: HOST-RESOURCES-TYPES::hrDevicePrinter
+HOST-RESOURCES-MIB::hrDeviceDescr.1 = STRING: HP LaserJet 4000 Series
+
+ +

The hrDeviceType line should show hrDevicePrinter; if not, then your printer or print server doesn't identify itself as a printer. The hrDeviceDescr line should provide a human-readable string for the make and model of the printer, although in some cases you'll just see something less useful like "Axis OfficeBASIC Parallel Print Server".

+ +

Once you have collected the snmpwalk output, you should go to the CUPS Bugs & Features page to submit a feature request to support your printer or print server. Be sure to attach those two log files you created - they will help us to identify the SNMP values we need to look for.

+ + +

Configuring Print Servers

+ +

Configuring Axis Print Servers

+ +

The Axis print servers can be configured using BOOTP or DHCP. However, on models that do not provide IPP support an additional step must be performed to configure the TCP/IP portion of the print server for use with CUPS.

+ +

Each print server contains a configuration file named config that contains a list of network parameters used by the server. To modify this file you must first download it from the print server using the ftp(1) program:

+ +
+ftp ip-address
+Connected to ip-address.
+220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
+ftp> user root
+331 User name ok, need password
+Password: pass (this is not echoed)
+230 User logged in
+ftp> get config
+local: config remote: config
+200 PORT command successful.
+150 Opening data connection for config (192,0,2,2),
+(mode ascii).
+226 Transfer complete.
+##### bytes received in #.## seconds (##### Kbytes/s)
+ftp> quit
+221 Goodbye.
+
+ +

Next, edit the file with your favorite text editor and locate the lines beginning with:

+ +
+RTN_OPT.     : YES
+RTEL_PR1.    : 0
+RTEL_PR2.    : 0
+RTEL_PR3.    : 0
+RTEL_PR4.    : 0
+RTEL_PR5.    : 0
+RTEL_PR6.    : 0
+RTEL_PR7.    : 0
+RTEL_PR8.    : 0
+
+ +

Change the RTN_OPT line to read:

+ +
+RTN_OPT.     : NO
+
+ +

This disables the Reverse TELNET protocol and enables the standard TELNET protocol on the print server. Next, assign a port number for each parallel and serial port on the server as follows:

+ +
+RTEL_PR1.    : 9100
+RTEL_PR2.    : 9101
+RTEL_PR3.    : 9102
+RTEL_PR4.    : 9103
+RTEL_PR5.    : 9104
+RTEL_PR6.    : 9105
+RTEL_PR7.    : 9106
+RTEL_PR8.    : 9107
+
+ +

This essentially makes the Axis print server look like a Hewlett Packard JetDirect EX print server. Save the file and then upload the new config file using the ftp command:

+ +
+ftp ip-address
+Connected to ip-address.
+220 Axis NPS ### FTP Printer Server V#.## MON DD YEAR ready.
+ftp> user root
+331 User name ok, need password
+Password: pass (this is not echoed)
+230 User logged in
+ftp> put config CONFIG
+local: config remote: CONFIG
+200 PORT command successful.
+150 Opening data connection for config (192,0,2,2), (mode ascii).
+226 Transfer complete.
+##### bytes received in #.## seconds (##### Kbytes/s)
+ftp> get hardreset
+local: hardreset remote: hardreset
+200 PORT command successful.
+421 Axis NPS ### hard reset, closing connection.
+ftp> quit
+221 Goodbye.
+
+ +

Your Axis print server is now ready for use!

+ +

Configuring Linksys Print Servers

+ +

The Linksys print servers can be configured using BOOTP or DHCP. Like older Axis print servers, an additional step must be performed to configure the TCP/IP portion of the print server for use with CUPS.

+ +

Each print server contains a configuration file named CONFIG that contains a list of network parameters used by the server. To modify this file you must first download it from the print server using the ftp(1) program:

+ +
+ftp -n ip-address
+Connected to ip-address.
+220 Print Server Ready.
+Remote system type is Print.
+ftp> get CONFIG
+local: CONFIG remote: CONFIG
+200 Command OK.
+150 Open ASCII Mode Connection.
+WARNING! 68 bare linefeeds received in ASCII mode
+File may not have transferred correctly.
+226 Transfer complete.
+##### bytes received in #.## seconds (##### Kbytes/s)
+ftp> quit
+221 Goodbye.
+
+ +

Next, edit the file with your favorite text editor and locate the lines beginning with:

+ +
+0100 L1_PROUT:P1
+0120 L2_PROUT:P1
+0140 L3_PROUT:P1
+
+ +

Change the port number for each parallel and serial port on the server as follows:

+ +
+0100 L1_PROUT:P1
+0120 L2_PROUT:P2
+0140 L3_PROUT:P3
+
+ +

This maps each virtual printer with a physical port. Save the file and then upload the new CONFIG file using the ftp command:

+ +
+ftp -n ip-address
+Connected to ip-address.
+220 Print Server Ready.
+Remote system type is Print.
+ftp> put CONFIG
+local: CONFIG remote: CONFIG
+200 Command OK.
+150 Open ASCII Mode Connection.
+226 Transfer complete.
+##### bytes received in #.## seconds (##### Kbytes/s)
+ftp> quit
+221 Goodbye.
+
+ +

Your Linksys print server is now ready for use!

+ + + diff --git a/doc/help/options.html b/doc/help/options.html new file mode 100644 index 0000000..0cfa741 --- /dev/null +++ b/doc/help/options.html @@ -0,0 +1,778 @@ + + + + Command-Line Printing and Options + + + + +

Command-Line Printing and Options

+ +

CUPS provides both the System V (lp(1)) and Berkeley (lpr(1)) printing commands for printing +files. In addition, it supported a large number of standard and +printer-specific options that allow you to control how and where +files are printed.

+ + +

Printing Files

+ +

CUPS understands many different types of files directly, +including text, PostScript, PDF, and image files. This allows you +to print from inside your applications or at the command-line, +whichever is most convenient! Type either of the following +commands to print a file to the default (or only) printer on the +system:

+ +
+lp filename
+lpr filename
+
+ +

Choosing a Printer

+ +

Many systems will have more than one printer available to the +user. These printers can be attached to the local system via a +parallel, serial, or USB port, or available over the network. Use +the lpstat(1) command to see a list +of available printers:

+ +
+lpstat -p -d
+
+ +

The -p option specifies that you want to see a +list of printers, and the -d option reports the +current default printer or class.

+ +

Use the -d option with the lp command to +print to a specific printer:

+ +
+lp -d printer filename
+
+ +

or the -P option with the lpr command:

+ +
+lpr -P printer filename
+
+ +

Setting the Default Printer

+ +

If you normally use a particular printer, you can tell CUPS to +use it by default using the lpoptions(1) command:

+ +
+lpoptions -d printer
+
+ +

Printing the Output of a Program

+ +

Both the lp and lpr commands support printing +from the standard input:

+ +
+program | lp
+program | lp -d printer
+program | lpr
+program | lpr -P printer
+
+ +

If the program does not provide any output, then nothing will +be queued for printing.

+ +

Specifying Printer Options

+ +

For many types of files, the default printer options may be +sufficient for your needs. However, there may be times when you +need to change the options for a particular file you are +printing.

+ +

The lp and lpr commands allow you to pass +printer options using the -o option:

+ +
+lp -o landscape -o scaling=75 -o media=A4 filename.jpg
+lpr -o landscape -o scaling=75 -o media=A4 filename.jpg
+
+ +

The available printer options vary depending on the printer. +The standard options are described in the "Standard Printing Options" section +below. Printer-specific options are also available and can be +listed using the lpoptions command:

+ +
+lpoptions -p printer -l
+
+ +

Creating Saved Options

+ +

Saved options are supported in CUPS through printer +instances. Printer instances are, as their name implies, copies +of a printer that have certain options associated with them. Use the +lpoptions command to create a printer instance:

+ +
+lpoptions -p printer/instance -o name=value ...
+
+ +

The -p printer/instance option provides the name of +the instance, which is always the printer name, a slash, and the +instance name which can contain any printable characters except +space and slash. The remaining options are then associated with the +instance instead of the main queue. For example, the following +command creates a duplex instance of the LaserJet queue:

+ +
+lpoptions -p LaserJet/duplex -o sides=two-sided-long-edge
+
+ +

Instances do not inherit lpoptions from the main +queue.

+ +

Printing Multiple Copies

+ +

Both the lp and lpr commands have options for +printing more than one copy of a file:

+ +
+lp -n num-copies filename
+lpr -#num-copies filename
+
+ +

Copies are normally not collated for you. Use the +-o Collate=True option to get collated copies:

+ +
+lp -n num-copies -o Collate=True filename
+lpr -#num-copies -o Collate=True filename
+
+ + +

Canceling a Print Job

+ +

The cancel(1) and lprm(1) commands cancel a print job:

+ +
+cancel job-id
+lprm job-id
+
+ +

The job-id is the number that was reported to you by +the lp command. You can also get the job ID using the lpq(1) or lpstat commands:

+ +
+lpq
+lpstat
+
+ + +

Moving a Print Job

+ +

The lpmove(8) command moves a print +job to a new printer or class:

+ +
+lpmove job-id destination
+
+ +

The job-id is the number that was reported to you by +the lp or lpstat commands. Destination is the +name of a printer or class that you want to actually print the job. + +

Note: + +

The lpmove command is located in the system command +directory (typically /usr/sbin or /usr/local/sbin), +and so may not be in your command path. Specify the full path to the +command if you get a "command not found" error, for example: + +

+/usr/sbin/lpmove foo-123 bar
+
+ +
+ + +

Standard Printing Options

+ +

The following options apply when printing all types of +files.

+ +

Selecting the Media Size, Type, and Source

+ +

The -o media=xyz option sets the media size, +type, and/or source:

+ +
+lp -o media=Letter filename
+lp -o media=Letter,MultiPurpose filename
+lpr -o media=Letter,Transparency filename
+lpr -o media=Letter,MultiPurpose,Transparency filename
+
+ +

The available media sizes, types, and sources depend on the +printer, but most support the following options (case is not +significant):

+ +
    + +
  • Letter - US Letter (8.5x11 inches, or 216x279mm) + +
  • Legal - US Legal (8.5x14 inches, or 216x356mm) + +
  • A4 - ISO A4 (8.27x11.69 inches, or 210x297mm) + +
  • COM10 - US #10 Envelope (9.5x4.125 inches, or + 241x105mm) + +
  • DL - ISO DL Envelope (8.66x4.33 inches, or 220x110mm) + +
  • Transparency - Transparency media type or source + +
  • Upper - Upper paper tray + +
  • Lower - Lower paper tray + +
  • MultiPurpose - Multi-purpose paper tray + +
  • LargeCapacity - Large capacity paper tray + +
+ +

The actual options supported are defined in the printer's PPD +file in the PageSize, InputSlot, and +MediaType options. You can list them using the +lpoptions(1) command:

+ +
+lpoptions -p printer -l
+
+ +

When Custom is listed for the PageSize option, you can specify custom media sizes using one of the following forms:

+ +
+lp -o media=Custom.WIDTHxLENGTH filename
+lp -o media=Custom.WIDTHxLENGTHin filename
+lp -o media=Custom.WIDTHxLENGTHcm filename
+lp -o media=Custom.WIDTHxLENGTHmm filename
+
+ +

where "WIDTH" and "LENGTH" are the width and length of the media in points, inches, centimeters, or millimeters, respectively.

+ + +

Setting the Orientation

+ +

The -o landscape option will rotate the page 90 +degrees to print in landscape orientation:

+ +
+lp -o landscape filename
+lpr -o landscape filename
+
+ +

The -o orientation-requested=N option rotates the +page depending on the value of N:

+ +
    + +
  • -o orientation-requested=3 - portrait + orientation (no rotation)
  • + +
  • -o orientation-requested=4 - landscape + orientation (90 degrees)
  • + +
  • -o orientation-requested=5 - reverse + landscape or seascape orientation (270 degrees)
  • + +
  • -o orientation-requested=6 - reverse + portrait or upside-down orientation (180 degrees)
  • + +
+ + +

Printing On Both Sides of the Paper

+ +

The -o sides=two-sided-short-edge and -o +sides=two-sided-long-edge options will enable two-sided +printing on the printer if the printer supports it. The -o +sides=two-sided-short-edge option is suitable for +landscape pages, while the -o +sides=two-sided-long-edge option is suitable for portrait +pages:

+ +
+lp -o sides=two-sided-short-edge filename
+lp -o sides=two-sided-long-edge filename
+lpr -o sides=two-sided-long-edge filename
+
+ +

The default is to print single-sided:

+ +
+lp -o sides=one-sided filename
+lpr -o sides=one-sided filename
+
+ + +

Selecting the Banner Page(s)

+ +

The -o job-sheets=start,end option sets the banner +page(s) to use for a job:

+ +
+lp -o job-sheets=none filename
+lp -o job-sheets=standard filename
+lpr -o job-sheets=classified,classified filename
+
+ +

If only one banner file is specified, it will be printed +before the files in the job. If a second banner file is +specified, it is printed after the files in the job.

+ +

The available banner pages depend on the local system +configuration; CUPS includes the following banner files:

+ +
    + +
  • none - Do not produce a banner page. + +
  • classified - A banner page with a "classified" + label at the top and bottom. + +
  • confidential - A banner page with a + "confidential" label at the top and bottom. + +
  • secret - A banner page with a "secret" label + at the top and bottom. + +
  • standard - A banner page with no label at the + top and bottom. + +
  • topsecret - A banner page with a "top secret" + label at the top and bottom. + +
  • unclassified - A banner page with an + "unclassified" label at the top and bottom. + +
+ + +

Holding Jobs for Later Printing

+ +

The -o job-hold-until=when option tells CUPS to +delay printing until the "when" time, which can be one of the +following:

+ +
    + +
  • -o job-hold-until=indefinite; print only + after released by the user or an administrator
  • + +
  • -o job-hold-until=day-time; print from + 6am to 6pm local time
  • + +
  • -o job-hold-until=night; print from + 6pm to 6am local time
  • + +
  • -o job-hold-until=second-shift; print from + 4pm to 12am local time
  • + +
  • -o job-hold-until=third-shift; print from + 12am to 8am local time
  • + +
  • -o job-hold-until=weekend; print on Saturday + or Sunday
  • + +
  • -o job-hold-until=HH:MM; print at the specified + UTC time
  • + +
+ +

Releasing Held Jobs

+ +

Aside from the web interface, you can use the lp command +to release a held job:

+ +
+lp -i job-id -H resume
+
+ +

where "job-id" is the job ID reported by the lpstat +command.

+ + +

Setting the Job Priority

+ +

The -o job-priority=NNN option tells CUPS to +assign a priority to your job from 1 (lowest) to 100 (highest), +which influences where the job appears in the print queue. Higher +priority jobs are printed before lower priority jobs, however +submitting a new job with a high priority will not interrupt an +already printing job.

+ + +

Specifying the Output Order

+ +

The -o outputorder=normal and -o outputorder=reverse options specify the order of the pages. Normal order prints page 1 first, page 2 second, and so forth. Reverse order prints page 1 last.

+ + +

Selecting a Range of Pages

+ +

The -o page-ranges=pages option selects a range +of pages for printing:

+ +
+lp -o page-ranges=1 filename
+lp -o page-ranges=1-4 filename
+lp -o page-ranges=1-4,7,9-12 filename
+lpr -o page-ranges=1-4,7,9-12 filename
+
+ +

As shown above, the pages value can be a single page, a +range of pages, or a collection of page numbers and ranges separated by +commas. The pages will always be printed in ascending order, regardless +of the order of the pages in the page-ranges option. + +

The default is to print all pages. + +

Note: + +

The page numbers used by page-ranges refer to the output +pages and not the document's page numbers. Options like number-up +can make the output page numbering not match the document page numbers.

+ +
+ + +

Selecting Even or Odd Pages

+ +

Use the -o page-set=set option to select the even or odd pages:

+ +
+lp -o page-set=odd filename
+lp -o page-set=even filename
+lpr -o page-set=even filename
+
+ +

The default is to print all pages. + +

N-Up Printing

+ +

The -o number-up=value option selects N-Up +printing. N-Up printing places multiple document pages on a +single printed page. CUPS supports 1, 2, 4, 6, 9, and 16-Up +formats; the default format is 1-Up:

+ +
+lp -o number-up=1 filename
+lp -o number-up=2 filename
+lp -o number-up=4 filename
+lpr -o number-up=16 filename
+
+ +

The -o page-border=value option chooses the +border to draw around each page:

+ +
    +
  • -o page-border=double; draw two hairline borders around each page
  • +
  • -o page-border=double-thick; draw two 1pt borders around each page
  • +
  • -o page-border=none; do not draw a border (default)
  • +
  • -o page-border=single; draw one hairline border around each page
  • +
  • -o page-border=single-thick; draw one 1pt border around each page
  • +
+ +

The -o number-up-layout=value option chooses the +layout of the pages on each output page:

+ +
    +
  • -o number-up-layout=btlr; Bottom to top, left to right
  • +
  • -o number-up-layout=btrl; Bottom to top, right to left
  • +
  • -o number-up-layout=lrbt; Left to right, bottom to top
  • +
  • -o number-up-layout=lrtb; Left to right, top to bottom (default)
  • +
  • -o number-up-layout=rlbt; Right to left, bottom to top
  • +
  • -o number-up-layout=rltb; Right to left, top to bottom
  • +
  • -o number-up-layout=tblr; Top to bottom, left to right
  • +
  • -o number-up-layout=tbrl; Top to bottom, right to left
  • +
+ +

Scaling to Fit

+ +

The -o fit-to-page option specifies that the document +should be scaled to fit on the page:

+ +
+lp -o fit-to-page filename
+lpr -o fit-to-page filename
+
+ +

The default is to use the size specified in the file.

+ +
Note: + +

This feature depends upon an accurate size in +the print file. If no size is given in the file, the page may be +scaled incorrectly! + +

+ +

Printing in Reverse Order

+ +

The -o outputorder=reverse option will print the +pages in reverse order:

+ +
+lp -o outputorder=reverse filename
+lpr -o outputorder=reverse filename
+
+ +

Similarly, the -o outputorder=normal option will +print starting with page 1:

+ +
+lp -o outputorder=normal filename
+lpr -o outputorder=normal filename
+
+ +

The default is -o outputorder=normal for +printers that print face down and -o outputorder=reverse +for printers that print face up. + +

Printing Mirrored Pages

+ +

The -o mirror option flips each page along the +vertical axis to produce a mirrored image:

+ +
+lp -o mirror filename
+lpr -o mirror filename
+
+ +

This is typically used when printing on T-shirt transfer +media or sometimes on transparencies.

+ +

Raw or Unfiltered Output

+ +

The -o raw option allows you to send files +directly to a printer without filtering. This is sometimes +required when printing from applications that provide their own +"printer drivers" for your printer:

+ +
+lp -o raw filename
+lpr -o raw filename
+
+ +

The -l option can also be used with the +lpr command to send files directly to a printer:

+ +
+lpr -l filename
+
+ + +

Text Options

+ +

CUPS supports several options that are only used when printing +plain text files. These options have absolutely no effect on +PostScript, PDF, HP-GL/2, or image files.

+ +

Setting the Number of Characters Per Inch

+ +

The -o cpi=value option sets the number of +characters per inch:

+ +
+lp -o cpi=10 filename
+lp -o cpi=12 filename
+lpr -o cpi=17 filename
+
+ +

The default characters per inch is 10.

+ +

Setting the Number of Lines Per Inch

+ +

The -o lpi=value option sets the number of lines +per inch:

+ +
+lp -o lpi=6 filename
+lpr -o lpi=8 filename
+
+ +

The default lines per inch is 6.

+ +

Setting the Number of Columns

+ +

The -o columns=value option sets the number of +text columns:

+ +
+lp -o columns=2 filename
+lpr -o columns=3 filename
+
+ +

The default number of columns is 1.

+ +

Setting the Page Margins

+ +

Normally the page margins are set to the hard limits of the +printer. Use the -o page-left=value, -o +page-right=value, -o page-top=value, and +-o page-bottom=value options to adjust the page +margins:

+ +
+lp -o page-left=value filename
+lp -o page-right=value filename
+lp -o page-top=value filename
+lp -o page-bottom=value filename
+lpr -o page-left=value -o page-right=value -o page-top=value -o page-bottom=value filename
+
+ +

The value argument is the margin in points; each +point is 1/72 inch or 0.35mm.

+ +

Pretty Printing

+ +

The -o prettyprint option puts a header at the +top of each page with the page number, job title (usually the +filename), and the date. Also, C and C++ keywords are +highlighted, and comment lines are italicized:

+ +
+lp -o prettyprint filename
+lpr -o prettyprint filename
+
+ +

Turning Off Text Wrapping

+ +

The -o nowrap option disables wrapping of long lines:

+ +
+lp -o nowrap filename
+lpr -o nowrap filename
+
+ + +

Not Supported on Mac OS XImage Options

+ +

CUPS supports several options that are only used when printing +image files. These options have absolutely no effect on PostScript, PDF, +HP-GL/2, or text files.

+ +

Positioning Images

+ +

The -o position=name option specifies the position of the +image on the page: + +

    + +
  • center - Center the image on the page (default) + +
  • top - Print the image centered at the top of the page + +
  • left - Print the image centered on the left of page + +
  • right - Print the image centered on the right of the page + +
  • top-left - Print the image at the top left corner of + the page + +
  • top-right - Print the image at the top right corner of + the page + +
  • bottom - Print the image centered at the bottom of + the page + +
  • bottom-left - Print the image at the bottom left + corner of the page + +
  • bottom-right - Print the image at the bottom right + corner of the page + +
+ +

Scaling Images

+ +

The -o scaling=percent, -o +ppi=value, and -o natural-scaling=percent +options change the size of a printed image: + +

+lp -o scaling=percent filename 
+lp -o ppi=value filename
+lpr -o natural-scaling=percent filename
+
+ +

The scaling=percent value is a number from 1 to 800 +specifying the size in relation to the page (not the image.) A +scaling of 100 percent will fill the page as completely as the image +aspect ratio allows. A scaling of 200 percent will print on up to 4 +pages. + +

The ppi=value value is a number from 1 to 1200 specifying the +resolution of the image in pixels per inch. An image that is 3000x2400 +pixels will print 10x8 inches at 300 pixels per inch, for example. If +the specified resolution makes the image larger than the page, multiple +pages will be printed to satisfy the request. + +

The natural-scaling=percent value is a number +from 1 to 800 specifying the size in relation to the natural +image size. A scaling of 100 percent will print the image at its +natural size, while a scaling of 50 percent will print the image +at half its natural size. If the specified scaling makes the +image larger than the page, multiple pages will be printed to +satisfy the request. + + +

HP-GL/2 Options

+ +

CUPS supports several options that are only used when printing +HP-GL/2 files. These options have absolutely no effect on PostScript, PDF, +image, or text files.

+ +

Printing in Black

+ +

The -o blackplot option specifies that all pens should +plot in black:

+ +
+lp -o blackplot filename
+lpr -o blackplot filename
+
+ +

The default is to use the colors defined in the plot file or the +standard pen colors defined in the HP-GL/2 reference manual from +Hewlett Packard. + +

Setting the Default Pen Width

+ +

The -o penwidth=value option specifies the default pen +width for HP-GL/2 files:

+ +
+lp -o penwidth=value filename
+lpr -o penwidth=value filename
+
+ +

The pen width value specifies the pen width in micrometers. +The default value of 1000 produces lines that are 1 millimeter in width. +Specifying a pen width of 0 produces lines that are exactly 1 pixel wide.

+ +
Note: + +

This option is ignored when the pen widths are set in the plot +file. + +

+ + + diff --git a/doc/help/overview.html b/doc/help/overview.html new file mode 100644 index 0000000..59a2ac0 --- /dev/null +++ b/doc/help/overview.html @@ -0,0 +1,70 @@ + + + + Overview of CUPS + + + + +

Overview of CUPS

+ +

CUPS is the software you use to print from applications like the web browser +you are using to read this page. It converts the page descriptions +produced by your application (put a paragraph here, draw a line there, and so +forth) into something your printer can understand and then sends the information +to the printer for printing.

+ +

Now, since every printer manufacturer does things differently, printing can +be very complicated. CUPS does its best to hide this from you and your +application so that you can concentrate on printing and less on how to +print. Generally, the only time you need to know anything about your printer is +when you use it for the first time, and even then CUPS can often figure things +out on its own.

+ +

How Does It Work?

+ +

The first time you print to a printer, CUPS creates a queue to keep +track of the current status of the printer (everything OK, out of paper, etc.) +and any pages you have printed. Most of the time the queue points to a printer +connected directly to your computer via a USB or parallel port, however it can +also point to a printer on your network, a printer on the Internet, or multiple +printers depending on the configuration. Regardless of where the queue +points, it will look like any other printer to you and your applications.

+ +

Every time you print something, CUPS creates a job which contains +the queue you are sending the print to, the name of the document you are +printing, and the page descriptions. Job are numbered (queue-1, queue-2, and so +forth) so you can monitor the job as it is printed or cancel it if you see a +mistake. When CUPS gets a job for printing, it determines the best programs +(filters, printer drivers, port monitors, and +backends) to convert the pages into a printable format and then runs +them to actually print the job.

+ +

When the print job is completely printed, CUPS removes the job from the queue +and moves on to any other jobs you have submitted. You can also be notified when +the job is finished, or if there are any errors during printing, in several +different ways.

+ +

Where Do I Begin?

+ +

Click on the Administration tab at +the top of this page. Click on the Add Printer button and follow the +prompts.

+ +
When you are asked for a username and password, enter your login +username and password or the "root" username and password. On MacOS X, the login +username (or "short name") is typically your first and last name in +lowercase.
+ +

After the printer is added, CUPS will ask you to set the default printer +options (paper size, output mode, etc.) for the printer. Make any changes as +needed and then click on the Set Default Options button to save +them. Some printers also support auto-configuration - click on the Query +Printer for Default Options button to update the options automatically.

+ +

Once you have added the printer, you can print to it from any application. +You can also choose Print Test Page from the maintenance menu to print +a simple test page and verify that everything is working properly.

+ + + diff --git a/doc/help/policies.html b/doc/help/policies.html new file mode 100644 index 0000000..14a5b4b --- /dev/null +++ b/doc/help/policies.html @@ -0,0 +1,601 @@ + + + + Managing Operation Policies + + + + +

Managing Operation Policies

+ +

Operation policies are the rules used for each IPP operation in CUPS. These rules include things like "user must provide a password", "user must be in the system group", "allow only from the local system", and so forth. Until CUPS 1.2, these rules were largely hardcoded and could only be customized at a very basic level.

+ +

CUPS 1.2 and later provides a fine-grained policy layer which allows you to completely redefine the rules for each operation and/or printer. Each policy is named and defines access control rules for each IPP operation. This document describes how to manage policies and their rules.

+ +

The Basics

+ +

Operation policies are used for all IPP requests sent to the scheduler and are evaluated after the Location based access control rules. This means that operation policies can only add additional security restrictions to a request, never relax them. Use Location based access control rules for server-wide limits and operation policies for limits on individual printers, tasks, or services.

+ +

Policies are stored in the cupsd.conf file in Policy sections. Each policy has an alphanumeric name that is used to select it. Inside the policy section are one or more Limit subsections which list the operations that are affected by the rules inside it. Listing 1 shows the default operation policy, appropriately called "default", that is shipped with CUPS.

+ +

The easiest way to add a policy to the cupsd.conf file is to use the web interface. Click on the Administration tab and then the Edit Configuration File button to edit the current cupsd.conf file. Click on the Save Changes button to save the changes and restart the scheduler. If you edit the cupsd.conf file from the console, make sure to restart the cupsd process before trying to use the new policy.

+ +
+Listing 1: Default Operation Policy
+
+ 1    <Policy default>
+ 2      # Job-related operations must be done by the owner or an
+      administrator...
+ 3      <Limit Send-Document Send-URI Hold-Job Release-Job
+      Restart-Job Purge-Jobs Set-Job-Attributes
+      Create-Job-Subscription Renew-Subscription
+      Cancel-Subscription Get-Notifications Reprocess-Job
+      Cancel-Current-Job Suspend-Current-Job Resume-Job
+      CUPS-Move-Job CUPS-Get-Document>
+ 4        Require user @OWNER @SYSTEM
+ 5        Order deny,allow
+ 6      </Limit>
+ 7    
+ 8      # All administration operations require an administrator
+      to authenticate...
+ 9      <Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+      CUPS-Delete-Class CUPS-Set-Default>
+10        AuthType Default
+11        Require user @SYSTEM
+12        Order deny,allow
+13      </Limit>
+14    
+15      # All printer operations require a printer operator
+      to authenticate...
+16      <Limit Pause-Printer Resume-Printer
+      Set-Printer-Attributes Enable-Printer Disable-Printer
+      Pause-Printer-After-Current-Job Hold-New-Jobs
+      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
+      Restart-Printer Shutdown-Printer Startup-Printer
+      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
+      CUPS-Reject-Jobs>
+17        AuthType Default
+18        Require user varies by OS
+19        Order deny,allow
+20      </Limit>
+21    
+22      # Only the owner or an administrator can cancel or
+      authenticate a job...
+23      <Limit Cancel-Job CUPS-Authenticate-Job>
+24        Require user @OWNER @SYSTEM
+25        Order deny,allow
+26      </Limit>
+27    
+28      <Limit All>
+29        Order deny,allow
+30      </Limit>
+31    </Policy>
+
+ +

The Default CUPS Operation Policy

+ +

The policy definition starts with an opening Policy directive:

+ +
+ 1    <Policy default>
+
+ +

The first Limit subsection defines the rules for IPP job operations:

+ +
+ 3      <Limit Send-Document Send-URI Hold-Job Release-Job
+      Restart-Job Purge-Jobs Set-Job-Attributes
+      Create-Job-Subscription Renew-Subscription
+      Cancel-Subscription Get-Notifications Reprocess-Job
+      Cancel-Current-Job Suspend-Current-Job Resume-Job
+      CUPS-Move-Job CUPS-Get-Document>
+ 4        Require user @OWNER @SYSTEM
+ 5        Order deny,allow
+ 6      </Limit>
+
+ +

The operation names are listed on a single line with spaces separating them. Each name corresponds to the IPP operation described in any of the IETF or PWG standards documents for the Internet Printing Protocol. Table 1 lists all of the operations that have been defined along with their usage in CUPS.

+ +

The access control rules are listed after the Limit line and are the same as those used for Location sections. In this case, we require the owner of the job ("@OWNER") or a member of the SystemGroup ("@SYSTEM") to do the operation. Because we do not include an AuthType directive here, the user information can come from the IPP request itself or the authenticated username from the HTTP request. The administrative operations starting on line 9, however, do use the AuthType directive, and so administrative operations need to be authenticated:

+ +
+ 9      <Limit CUPS-Add-Printer CUPS-Delete-Printer CUPS-Add-Class
+      CUPS-Delete-Class CUPS-Set-Default>
+10        AuthType Default
+11        Require user @SYSTEM
+12        Order deny,allow
+13      </Limit>
+14    
+15      # All printer operations require a printer operator
+      to authenticate...
+16      <Limit Pause-Printer Resume-Printer
+      Set-Printer-Attributes Enable-Printer Disable-Printer
+      Pause-Printer-After-Current-Job Hold-New-Jobs
+      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
+      Restart-Printer Shutdown-Printer Startup-Printer
+      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
+      CUPS-Reject-Jobs>
+17        AuthType Default
+18        Require user varies by OS
+19        Order deny,allow
+20      </Limit>
+
+ +

The "Order deny,allow" line at the end of both Limit subsections allows the request to come from any system allowed by the Location sections elsewhere in the cupsd.conf file.

+ +

The Cancel-Job and CUPS-Authenticate-Job operations are listed separately to allow the web interface to more easily edit their policy without disturbing the rest. Like the rest of the job operations, we want the job's owner ("@OWNER") or an administrator ("@SYSTEM") to do it:

+ +
+16      <Limit Cancel-Job CUPS-Authenticate-Job>
+17        Require user @OWNER @SYSTEM
+18        Order deny,allow
+19      </Limit>
+
+ +

The last Limit subsection in any policy uses the special operation name All. CUPS will use the rules in this subsection for any operation you don't list specifically in the policy. In this case, all other operations are allowed without a username or authentication:

+ +
+21      <Limit All>
+22        Order deny,allow
+23      </Limit>
+24    </Policy>
+
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: IPP Operation Names
NameUsed by CUPS?Description
Print-JobYesCreates a print job with a single file.
Print-URINoCreate a print job with a single URI.
Validate-JobYesValidates a print request before printing.
Create-JobYesCreates a print job with no files or URIs.
Send-DocumentYesAdds a file to a print job.
Send-URINoAdds a URI to a print job.
Cancel-JobYesCancels a print job.
Get-Job-AttributesYesGets information and options associated with a job.
Get-JobsYesGets a list of jobs.
Get-Printer-AttributesYesGets information and options associated with a printer or class.
Hold-JobYesHolds a print job for printing.
Release-JobYesReleases a print job for printing.
Restart-JobYesReprints a print job.
Pause-PrinterYesStops a printer or class.
Resume-PrinterYesStarts a printer or class.
Purge-JobsYesCancels all jobs on the server or a printer or class + and removes the job history information.
Set-Printer-AttributesNoSets printer or class information; CUPS uses + CUPS-Add-Modify-Printer and CUPS-Add-Modify-Class + instead.
Set-Job-AttributesYesChanges job options.
Get-Printer-Supported-ValuesNoGets -supported attributes for a printer based on job + options.
Create-Printer-SubscriptionYesCreates an event subscription for a printer or the server.
Create-Job-SubscriptionYesCreates an event subscription for a job.
Get-Subscription-AttributesYesGets information for an event subscription.
Get-SubscriptionsYesGets a list of event subscriptions.
Renew-SubscriptionYesRenews an event subscription that is about to expire.
Cancel-SubscriptionYesCancels an event subscription.
Get-NotificationsYesGets (pending) events for an event subscription.
Send-NotificationsNoSends events for an event subscription.
Get-Printer-Support-FilesNoGets printer driver files for a Novell client.
Enable-PrinterYesStarts a printer or class.
Disable-PrinterYesStops a printer or class.
Pause-Printer-After-Current-JobNoStops a printer or class after the current job is finished.
Hold-New-JobsNoHolds new jobs submitted to a printer or class.
Release-Held-New-JobsNoReleases jobs that were held because of the + Hold-New-Jobs operation.
Deactivate-PrinterNoDeactivates a printer or class.
Activate-PrinterNoActivates a printer or class.
Restart-PrinterNoRestarts a printer or class, resuming print jobs as needed.
Shutdown-PrinterNoPowers a printer or class off.
Startup-PrinterNoPowers a printer or class on.
Reprocess-JobNoReprints a job on a different printer or class; CUPS has the + CUPS-Move-Job operation instead.
Cancel-Current-JobNoCancels the current job on a printer or class.
Suspend-Current-JobNoStops the current job on a printer or class.
Resume-JobNoResumes printing of a stopped job.
Promote-JobNoPrints a job before others.
Schedule-Job-AfterNoPrints a job after others.
CUPS-Get-DefaultYesGets the server/network default printer or class.
CUPS-Get-PrintersYesGets a list of printers and/or classes.
CUPS-Add-Modify-PrinterYesAdds or modifies a printer.
CUPS-Delete-PrinterYesRemoves a printer.
CUPS-Get-ClassesYesGets a list of classes.
CUPS-Add-Modify-ClassYesAdds or modifies a class.
CUPS-Delete-ClassYesRemoves a class.
CUPS-Accept-JobsYesSets a printer's or class' printer-is-accepting-jobs + attribute to true.
CUPS-Reject-JobsYesSets a printer's or class' printer-is-accepting-jobs + attribute to false.
CUPS-Set-DefaultYesSets the server/network default printer or class.
CUPS-Get-DevicesYesGets a list of printer devices.
CUPS-Get-PPDsYesGets a list of printer drivers or manufacturers.
CUPS-Move-JobYesMoves a job to a different printer or class.
CUPS-Authenticate-JobYesAuthenticates a job for printing.
CUPS-Get-DocumentYesRetrieves a document file from a job.
+ + +

Creating Your Own Policies

+ +

The easiest way to create a new policy is to start with the default policy and then make changes to the copy. The first change you'll make is to give the policy a new name. Policy names can use the same characters as a printer name, specifically all printable characters except space, slash (/), and pound (#):

+ +
+<Policy mypolicy>
+
+ +

Then you need to decide exactly what limits you want for the policy. For example, if you want to allow any user to cancel any other users' jobs, you can change the Cancel-Job limits to:

+ +
+<Limit Cancel-Job>
+  Order deny,allow
+</Limit>
+
+ +

The directives inside the Limit subsection can use any of the normal limiting directives: Allow, AuthType, Deny, Encryption, Require, and Satisfy. Table 2 lists some basic "recipes" for different access control rules.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Access Control Recipes
Access LevelDirectives to Use
Allow Everyone
Order deny,allow
+Allow from all
Allow Everyone on the Local Network
Order deny,allow
+Allow from @LOCAL
Deny Everyone/Disable Operation(s)
Order deny,allow
Require Login (System) Password
AuthType Basic
Require CUPS (lppasswd) Password
AuthType BasicDigest
Require Kerberos
AuthType Negotiate
Require the Owner of a Job or Subscription
Require user @OWNER
Require an Administrative User
Require user @SYSTEM
Require Member of Group "foogroup"
Require user @foogroup
Require "john" or "mary"
Require user john mary
Require Encryption
Encryption Required
+ + +

Creating a Policy for a Computer Lab

+ +

One common operating scenario is a computer lab. The lab is managed by one or more technicians that assist the users of the lab and handle the basic administration tasks. Listing 2 shows an operation policy that only allows access from the lab's subnet, 10.0.2.x, and allows the lab technicians, who are members of a special UNIX group for that lab called "lab999", to do job, printer, and subscription management operations.

+ +
+Listing 2: Operation Policy for a Lab
+
+ 1    <Policy lab999>
+ 2      # Job- and subscription-related operations must be done
+      by the owner, a lab technician, or an administrator...
+ 3      <Limit Send-Document Send-URI Hold-Job Release-Job
+      Restart-Job Purge-Jobs Set-Job-Attributes
+      Create-Job-Subscription Renew-Subscription
+      Cancel-Subscription Get-Notifications Reprocess-Job
+      Cancel-Current-Job Suspend-Current-Job Resume-Job
+      CUPS-Move-Job Cancel-Job CUPS-Authenticate-Job CUPS-Get-Document>
+ 4        Require user @OWNER @lab999 @SYSTEM
+ 5        Order allow,deny
+ 6        Allow from 10.0.2.0/24
+ 7      </Limit>
+ 8    
+ 9      # All administration operations require a lab technician
+      or an administrator to authenticate...
+10      <Limit Pause-Printer Resume-Printer
+      Set-Printer-Attributes Enable-Printer Disable-Printer
+      Pause-Printer-After-Current-Job Hold-New-Jobs
+      Release-Held-New-Jobs Deactivate-Printer Activate-Printer
+      Restart-Printer Shutdown-Printer Startup-Printer
+      Promote-Job Schedule-Job-After CUPS-Accept-Jobs
+      CUPS-Reject-Jobs CUPS-Set-Default>
+11        AuthType Default
+12        Require user @lab999 @SYSTEM
+13        Order allow,deny
+14        Allow from 10.0.2.0/24
+15      </Limit>
+16
+17      # All other operations are allowed from the lab network...
+18      <Limit All>
+19        Order allow,deny
+20        Allow from 10.0.2.0/24
+21      </Limit>
+22    </Policy>
+
+ + +

Using Policies

+ +

Once you have created a policy, you can use it in two ways. The first way is to assign it as the default policy for the system using the DefaultPolicy directive in the cupsd.conf file. For example, add the following line to the cupsd.conf file to use the "lab999" policy from the previous section:

+ +
+DefaultPolicy lab999
+
+ +

To associate the policy with one or more printers, use either the lpadmin(8) command or the web interface to change the operation policy for each printer. When using the lpadmin command, the -o printer-op-policy=name option sets the operation policy for a printer. For example, enter the following command to use the "lab999" policy from the previous section with a printer named "LaserJet4000":

+ +
+lpadmin -p LaserJet4000 -o printer-op-policy=lab999
+
+ +

To make the same change in the web interface, go to the printer's web page, for example "http://localhost:631/printers/LaserJet4000", and choose Set Default Options from the Administration menu button. Click on the Policies link and choose the desired policy from the pull-down list. Click on Set Default Options to change the policy for the printer.

+ + + diff --git a/doc/help/postscript-driver.html b/doc/help/postscript-driver.html new file mode 100644 index 0000000..501043c --- /dev/null +++ b/doc/help/postscript-driver.html @@ -0,0 +1,663 @@ + + + + + Developing PostScript Printer Drivers + + + + + + +
+ + +

Developing PostScript Printer Drivers

+ +

This document describes how to develop printer drivers for PostScript printers. Topics include: printer driver basics, creating new PPD files, importing existing PPD files, using custom filters, implementing color management, and adding Mac OS X features.

+ +
+ + + + + + +
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
+

Contents

+ +

Printer Driver Basics

+ +

A CUPS PostScript printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, zero or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

+ +

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into device-independent PostScript, and then from device-independent PostScript to device-dependent PostScript. Figure 1 shows the data flow of a typical print job.

+ +
+ + +
Figure 1: PostScript Filter Chain
PostScript Filter Chain
+ +

The optional PostScript filter can be provided to add printer-specific commands to the PostScript output that cannot be represented in the PPD file or to reorganize the output for special printer features. Typically this is used to support advanced job management or finishing functions on the printer. CUPS includes a generic PostScript filter that handles all PPD-defined commands.

+ +

The optional port monitor handles interface-specific protocol or encoding issues. For example, many PostScript printers support the Binary Communications Protocol (BCP) and Tagged Binary Communications Protocol (TBCP) to allow applications to print 8-bit ("binary") PostScript jobs. CUPS includes port monitors for BCP and TBCP, and you can supply your own port monitors as needed.

+ +

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

+ +

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

+ +
+ + +
Figure 2: Command Filter Chain
Command Filter Chain
+ +

PostScript printer drivers typically do not require their own command filter since CUPS includes a generic PostScript command filter that supports all of the standard functions using PPD-defined commands.

+ + +

Creating New PPD Files

+ +

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for a black-and-white PostScript printer.

+ +

Listing 1: "examples/postscript.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// Specify this is a PostScript printer driver
+DriverType ps
+
+// List the fonts that are supported, in this case all standard fonts
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "Foo LaserProofer 2000"
+Version 1.0
+
+// PostScript printer attributes
+Attribute DefaultColorSpace "" Gray
+Attribute LandscapeOrientation "" Minus90
+Attribute LanguageLevel "" "3"
+Attribute Product "" "(Foo LaserProofer 2000)"
+Attribute PSVersion "" "(3010) 0"
+Attribute TTRasterizer "" Type42
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize Legal
+MediaSize A4
+
+// Query command for page size
+Attribute "?PageSize" "" "
+      save
+      currentpagedevice /PageSize get aload pop
+      2 copy gt {exch} if (Unknown)
+      23 dict
+              dup [612 792] (Letter) put
+              dup [612 1008] (Legal) put
+              dup [595 842] (A4) put
+              {exch aload pop 4 index sub abs 5 le exch 
+               5 index sub abs 5 le and
+              {exch pop exit} {pop} ifelse
+      } bind forall = flush pop pop
+      restore"
+
+// Specify the name of the PPD file we want to generate
+PCFileName "fooproof.ppd"
+
+ +

Required Attributes

+ +

PostScript drivers require the attributes listed in Table 1. If not specified, the defaults for CUPS drivers are used. A typical PostScript driver information file would include the following attributes:

+ +
+Attribute DefaultColorSpace "" Gray
+Attribute LandscapeOrientation "" Minus90
+Attribute LanguageLevel "" "3"
+Attribute Product "" "(Foo LaserProofer 2000)"
+Attribute PSVersion "" "(3010) 0"
+Attribute TTRasterizer "" Type42
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Required PostScript Printer Driver Attributes
AttributeDescription
DefaultColorSpaceThe default colorspace: + Gray, RGB, CMY, or + CMYK. If not specified, then RGB is + assumed.
LandscapeOrientationThe preferred landscape + orientation: Plus90, Minus90, or + Any. If not specified, Plus90 is + assumed.
LanguageLevelThe PostScript language + level supported by the device: 1, 2, or 3. If not + specified, 2 is assumed.
ProductThe string returned by + the PostScript product operator, which + must include parenthesis to conform with + PostScript syntax rules for strings. Multiple + Product attributes may be specified to support + multiple products with the same PPD file. If not + specified, "(ESP Ghostscript)" and "(GNU Ghostscript)" + are assumed.
PSVersionThe PostScript + interpreter version numbers as returned by the + version and revision operators. The + required format is "(version) revision". Multiple + PSVersion attributes may be specified to + support multiple interpreter version numbers. If not + specified, "(3010) 705" and "(3010) 707" are + assumed.
TTRasterizerThe type of TrueType + font rasterizer supported by the device, if any. The + supported values are None, Accept68k, + Type42, and TrueImage. If not + specified, None is assumed.
+ +

Query Commands

+ +

Most PostScript printer PPD files include query commands (?PageSize, etc.) that allow applications to query the printer for its current settings and configuration. Query commands are included in driver information files as attributes. For example, the example in Listing 1 uses the following definition for the PageSize query command:

+ +
+Attribute "?PageSize" "" "
+      save
+      currentpagedevice /PageSize get aload pop
+      2 copy gt {exch} if (Unknown)
+      23 dict
+              dup [612 792] (Letter) put
+              dup [612 1008] (Legal) put
+              dup [595 842] (A4) put
+              {exch aload pop 4 index sub abs 5 le exch 
+               5 index sub abs 5 le and
+              {exch pop exit} {pop} ifelse
+      } bind forall = flush pop pop
+      restore"
+
+ +

Query commands can span multiple lines, however no single line may contain more than 255 characters.

+ +

Importing Existing PPD Files

+ +

CUPS includes a utility called ppdi(1) +which allows you to import existing PPD files into the driver information file +format used by the PPD compiler ppdc(1). Once +imported, you can modify, localize, and regenerate the PPD files easily. Type +the following command to import the PPD file mydevice.ppd into the +driver information file mydevice.drv:

+ +
+ppdi -o mydevice.drv mydevice.ppd
+
+ +

If you have a whole directory of PPD files that you would like to import, +you can list multiple filenames or use shell wildcards to import more than one +PPD file on the command-line:

+ +
+ppdi -o mydevice.drv mydevice1.ppd mydevice2.ppd
+ppdi -o mydevice.drv *.ppd
+
+ +

If the driver information file already exists, the new PPD +file entries are appended to the end of the file. Each PPD file +is placed in its own group of curly braces within the driver +information file.

+ + +

Using Custom Filters

+ +

Normally a PostScript printer driver will not utilize any additional print filters. For drivers that provide additional filters such as a CUPS command file filter for doing printer maintenance, you must also list the following Filter directive to handle printing PostScript files:

+ +
+Filter application/vnd.cups-postscript 0 -
+
+ +

Custom Command Filters

+ +

The application/vnd.cups-command file type is used for CUPS command files. Use the following Filter directive to handle CUPS command files:

+ +
+Filter application/vnd.cups-command 100 /path/to/command/filter
+
+ +

To use the standard PostScript command filter, specify commandtops as the path to the command filter.

+ +

Custom PDF Filters

+ +

The application/pdf file type is used for unfiltered PDF files while the application/vnd.cups-pdf file type is used for filtered PDF files. Use the following Filter directive to handle filtered PDF files:

+ +
+Filter application/vnd.cups-pdf 100 /path/to/pdf/filter
+
+ +

For unfiltered PDF files, use:

+ +
+Filter application/pdf 100 /path/to/pdf/filter
+
+ +

Custom PDF filters that accept filtered data do not need to perform number-up processing and other types of page imposition, while those that accept unfiltered data MUST do the number-up processing themselves.

+ +

Custom PostScript Filters

+ +

The application/vnd.cups-postscript file type is used for filtered PostScript files. Use the following Filter directive to handle PostScript files:

+ +
+Filter application/vnd.cups-postscript 100 /path/to/postscript/filter
+
+ + +

Implementing Color Management

+ +

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

+ +
+Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
+
+ +

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

+ +
+Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
+Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
+
+ +

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

+ + +

Adding Mac OS X Features

+ +

Mac OS X printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

+ +
+Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
+Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
+Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
+Attribute APPrinterPreset "name/text" "*option choice ..."
+
+
+ + diff --git a/doc/help/ppd-compiler.html b/doc/help/ppd-compiler.html new file mode 100644 index 0000000..db891f1 --- /dev/null +++ b/doc/help/ppd-compiler.html @@ -0,0 +1,1279 @@ + + + + + Introduction to the PPD Compiler + + + + + + +
+ + +

Introduction to the PPD Compiler

+ +

This document describes how to use the CUPS PostScript Printer Description +(PPD) file compiler. The PPD compiler generates PPD files from simple text files +that describe the features and capabilities of one or more printers.

+ +
+ + + + + + +
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
+

Contents

+ +

The Basics

+ +

The PPD compiler, ppdc(1), is a +simple command-line tool that takes a single driver information file, +which by convention uses the extension .drv, and produces one or more +PPD files that may be distributed with your printer drivers for use with CUPS. +For example, you would run the following command to create the English language +PPD files defined by the driver information file mydrivers.drv:

+ +
+ppdc mydrivers.drv
+
+ +

The PPD files are placed in a subdirectory called +ppd. The -d option is used to put the PPD +files in a different location, for example:

+ +
+ppdc -d myppds mydrivers.drv
+
+ +

places the PPD files in a subdirectory named +myppds. Finally, use the -l option to +specify the language localization for the PPD files that are +created, for example:

+ +
+ppdc -d myppds/de -l de mydrivers.drv
+ppdc -d myppds/en -l en mydrivers.drv
+ppdc -d myppds/es -l es mydrivers.drv
+ppdc -d myppds/fr -l fr mydrivers.drv
+ppdc -d myppds/it -l it mydrivers.drv
+
+ +

creates PPD files in German (de), English (en), Spanish (es), +French (fr), and Italian (it) in the corresponding +subdirectories. Specify multiple languages (separated by commas) to produce +"globalized" PPD files:

+ +
+ppdc -d myppds -l de,en,es,fr,it mydrivers.drv
+
+ + +

Driver Information Files

+ +

The driver information files accepted by the PPD compiler are +plain text files that define the various attributes and options +that are included in the PPD files that are generated. A driver +information file can define the information for one or more printers and +their corresponding PPD files.

+ +

Listing 1: "examples/minimum.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ + +

A Simple Example

+ +

The example in Listing 1 shows a driver information +file which defines the minimum required attributes to provide a valid PPD file. +The first part of the file includes standard definition files for fonts and +media sizes:

+ +
+#include <font.defs>
+#include <media.defs>
+
+ +

The #include directive works just like the C/C++ include directive; +files included using the angle brackets (<filename>) are found +in any of the standard include directories and files included using quotes +("filename") are found in the same directory as the source or include +file. The <font.defs> include file defines the standard fonts +which are included with GPL Ghostscript and the Apple PDF RIP, while the +<media.defs> include file defines the standard media sizes +listed in Appendix B of the Adobe PostScript Printer Description File Format +Specification.

+ +

CUPS provides several other standard include files:

+ +
    + +
  • <epson.h> - Defines all of the rastertoepson driver + constants.
  • + +
  • <escp.h> - Defines all of the rastertoescpx driver + constants.
  • + +
  • <hp.h> - Defines all of the rastertohp driver + constants.
  • + +
  • <label.h> - Defines all of the rastertolabel driver + constants.
  • + +
  • <pcl.h> - Defines all of the rastertopclx driver + constants.
  • + +
  • <raster.defs> - Defines all of the CUPS raster format + constants.
  • + +
+ +

Next we list all of the fonts that are available in the driver; for CUPS +raster drivers, the following line is all that is usually supplied:

+ +
+Font *
+
+ +

The Font directive specifies the name of a single font or the +asterisk to specify all fonts. For example, you would use the following line to +define an additional bar code font that you are supplying with your printer +driver:

+ +
+//   name         encoding  version  charset  status
+Font Barcode-Foo  Special   "(1.0)"  Special  ROM
+
+ +

The name of the font is Barcode-Foo. Since it is not a standard +text font, the encoding and charset name Special is used. The version +number is 1.0 and the status (where the font is located) is +ROM to indicate that the font does not need to be embedded in +documents that use the font for this printer.

+ +

Third comes the manufacturer, model name, and version number information +strings:

+ +
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+ +

These strings are used when the user (or auto-configuration program) selects +the printer driver for a newly connected device.

+ +

The list of filters comes after the information strings; for the example in +Listing 1, we have a single filter that takes CUPS +raster data:

+ +
+Filter application/vnd.cups-raster 100 rastertofoo
+
+ +

Each filter specified in the driver information file is the equivalent of a +printer driver for that format; if a user submits a print job in a different +format, CUPS figures out the sequence of commands that will produce a supported +format for the least relative cost.

+ +

Once we have defined the driver information we specify the supported options. +For the example driver we support a single resolution of 600 dots per inch and +two media sizes, A4 and Letter:

+ +
+*MediaSize Letter
+MediaSize A4
+
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+ +

The asterisk in front of the MediaSize and Resolution +directives specify that those option choices are the default. The +MediaSize directive is followed by a media size name which is normally +defined in the <media.defs> file and corresponds to a standard +Adobe media size name. If the default media size is Letter, the PPD +compiler will override it to be A4 for non-English localizations for +you automatically.

+ +

The Resolution directive accepts several values after it as +follows:

+ +
    + +
  1. Colorspace for this resolution, if any. In the example file, the + colorspace k is used which corresponds to black. For printer + drivers that support color printing, this field is usually specified as + "-" for "no change".
  2. + +
  3. Bits per color. In the example file, we define 8 bits per color, for + a continuous-tone grayscale output. All versions of CUPS support 1 and + 8 bits per color. CUPS 1.2 and higher (Mac OS X 10.5 and higher) also + supports 16 bits per color.
  4. + +
  5. Rows per band. In the example file, we define 0 rows per band to + indicate that our printer driver does not process the page in + bands.
  6. + +
  7. Row feed. In the example, we define the feed value to be 0 to + indicate that our printer driver does not interleave the output.
  8. + +
  9. Row step. In the example, we define the step value to be 0 to + indicate that our printer driver does not interleave the output. This + value normally indicates the spacing between the nozzles of an inkjet + printer - when combined with the previous two values, it informs the + driver how to stagger the output on the page to produce interleaved + lines on the page for higher-resolution output.
  10. + +
  11. Choice name and text. In the example, we define the choice name and + text to be "600dpi/600 DPI". The name and text are separated by + slash (/) character; if no text is specified, then the name is + used as the text. The PPD compiler parses the name to determine the + actual resolution; the name can be of the form + RESOLUTIONdpi for resolutions that are equal + horizontally and vertically or HRESxVRESdpi for + isometric resolutions. Only integer resolution values are supported, so + a resolution name of 300dpi is valid while 300.1dpi is + not.
  12. + +
+ +

Finally, the PCFileName directive specifies that the named PPD file +should be written for the current driver definitions:

+ +
+PCFileName "foojet2k.ppd"
+
+ +

The filename follows the directive and must conform to the Adobe +filename requirements in the Adobe Postscript Printer Description File Format +Specification. Specifically, the filename may not exceed 8 characters followed +by the extension .ppd. The FileName directive can be used to +specify longer filenames:

+ +
+FileName "FooJet 2000"
+
+ + +

Grouping and Inheritance

+ +

The previous example created a single PPD file. Driver information files can +also define multiple printers by using the PPD compiler grouping functionality. +Directives are grouped using the curly braces ({ and }) and +every group that uses the PCFileName or FileName directives +produces a PPD file with that name. Listing 2 shows a +variation of the original example that uses two groups to define two printers +that share the same printer driver filter but provide two different resolution +options.

+ +

Listing 2: "examples/grouping.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and version
+Manufacturer "Foo"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "1200dpi/1200 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2001"
+  PCFileName "foojt2k1.ppd"
+}
+
+ +

The second example is essentially the same as the first, except that each +printer model is defined inside of a pair of curly braces. For example, the +first printer is defined using:

+ +
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+ +

The printer inherits all of the definitions from the parent group (the +top part of the file) and adds the additional definitions inside the curly +braces for that printer driver. When we define the second group, it also +inherits the same definitions from the parent group but none of the +definitions from the first driver. Groups can be nested to any number of levels +to support variations of similar models without duplication of information.

+ + +

Color Support

+ +

For printer drivers that support color printing, the +ColorDevice and ColorModel directives should be +used to tell the printing system that color output is desired +and in what formats. Listing 3 shows a +variation of the previous example which includes a color printer +that supports printing at 300 and 600 DPI.

+ +

The key changes are the addition of the ColorDevice +directive:

+ +
+ColorDevice true
+
+ +

which tells the printing system that the printer supports +color printing, and the ColorModel directives:

+ +
+ColorModel Gray/Grayscale w chunky 0
+*ColorModel RGB/Color rgb chunky 0
+
+ +

which tell the printing system which colorspaces are supported by the printer +driver for color printing. Each of the ColorModel directives is +followed by the option name and text (Gray/Grayscale and +RGB/Color), the colorspace name (w and rgb), the +color organization (chunky), and the compression mode number +(0) to be passed to the driver. The option name can be any of the +standard Adobe ColorModel names:

+ +
    + +
  • Gray - Grayscale output. + +
  • RGB - Color output, typically using the RGB + colorspace, but without a separate black channel. + +
  • CMYK - Color output with a separate black + channel. + +
+ +

Custom names can be used, however it is recommended that you use your vendor +prefix for any custom names, for example "fooName".

+ +

The colorspace name can be any of the following universally supported +colorspaces:

+ +
    +
  • w - Luminance
  • + +
  • rgb - Red, green, blue
  • + +
  • k - Black
  • + +
  • cmy - Cyan, magenta, yellow
  • + +
  • cmyk - Cyan, magenta, yellow, black
  • + +
+ +

The color organization can be any of the following values:

+ +
    + +
  • chunky - Color values are passed together on a line + as RGB RGB RGB RGB
  • + +
  • banded - Color values are passed separately + on a line as RRRR GGGG BBBB; not supported by the Apple + RIP filters
  • + +
  • planar - Color values are passed separately + on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB + BBBB BBBB; not supported by the Apple RIP filters
  • + +
+ +

The compression mode value is passed to the driver in the +cupsCompression attribute. It is traditionally used to select an +appropriate compression mode for the color model but can be used for any +purpose, such as specifying a photo mode vs. standard mode.

+ +

Listing 3: "examples/color.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and version
+Manufacturer "Foo"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+{
+  // Supports color printing
+  ColorDevice true
+
+  // Supported colorspaces
+  ColorModel Gray/Grayscale w chunky 0
+  *ColorModel RGB/Color rgb chunky 0
+
+  // Supported resolutions
+  *Resolution - 8 0 0 0 "300dpi/300 DPI"
+  Resolution - 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet Color"
+  PCFileName "foojetco.ppd"
+}
+
+ + +

Defining Custom Options and Option Groups

+ +

The Group, Option, and Choice +directives are used to define or select a group, option, or +choice. Listing 4 shows a variation of +the first example that provides two custom options in a group +named "Footasm".

+ +

Listing 4: "examples/custom.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Option Group
+Group "Footasm"
+
+  // Boolean option
+  Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
+    *Choice True/Yes "<</cupsCompression 1>>setpagedevice"
+    Choice False/No "<</cupsCompression 0>>setpagedevice"
+
+  // Multiple choice option
+  Option "fooOutputType/Output Quality" PickOne AnySetup 10
+    *Choice "Auto/Automatic Selection"
+            "<</OutputType(Auto)>>setpagedevice""
+    Choice "Text/Optimize for Text"
+            "<</OutputType(Text)>>setpagedevice""
+    Choice "Graph/Optimize for Graphics"
+            "<</OutputType(Graph)>>setpagedevice""
+    Choice "Photo/Optimize for Photos"
+            "<</OutputType(Photo)>>setpagedevice""
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ +

The custom group is introduced by the Group +directive which is followed by the name and optionally text for +the user:

+ +
+Group "Footasm/Footastic Options"
+
+ +

The group name must conform to the PPD specification and +cannot exceed 40 characters in length. If you specify user text, +it cannot exceed 80 characters in length. The groups +General, Extra, and +InstallableOptions are predefined by CUPS; the general +and extra groups are filled by the UI options defined by the PPD +specification. The InstallableOptions group is reserved +for options that define whether accessories for the printer +(duplexer unit, finisher, stapler, etc.) are installed.

+ +

Once the group is specified, the Option directive is +used to introduce a new option:

+ +
+Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
+
+ +

The directive is followed by the name of the option and any +optional user text, the option type, the PostScript document group, and +the sort order number. The option name must conform to the PPD specification +and cannot exceed 40 characters in length. If you specify user text, it +cannot exceed 80 characters in length.

+ +

The option type can be Boolean for true/false +selections, PickOne for picking one of many choices, or +PickMany for picking zero or more choices. Boolean +options can have at most two choices with the names +False and True. Pick options can have any +number of choices, although for Windows compatibility reasons +the number of choices should not exceed 255.

+ +

The PostScript document group is typically AnySetup, +meaning that the option can be introduced at any point in the +PostScript document. Other values include PageSetup to +include the option before each page and DocumentSetup +to include the option once at the beginning of the document.

+ +

The sort order number is used to sort the printer commands +associated with each option choice within the PostScript +document. This allows you to setup certain options before others +as required by the printer. For most CUPS raster printer +drivers, the value 10 can be used for all options.

+ +

Once the option is specified, each option choice can be +listed using the Choice directive:

+ +
+*Choice True/Yes "<</cupsCompression 1>>setpagedevice"
+Choice False/No "<</cupsCompression 0>>setpagedevice"
+
+ +

The directive is followed by the choice name and optionally +user text, and the PostScript commands that should be inserted +when printing a file to this printer. The option name must +conform to the PPD specification and cannot exceed 40 characters +in length. If you specify user text, it cannot exceed 80 +characters in length.

+ +

The PostScript commands are also interpreted by any RIP +filters, so these commands typically must be present for all +option choices. Most commands take the form:

+ +
+<</name value>>setpagedevice
+
+ +

where name is the name of the PostScript page device +attribute and value is the numeric or string value for +that attribute.

+ + +

Defining Constants

+ +

Sometimes you will want to define constants for your drivers +so that you can share values in different groups within the same +driver information file, or to share values between different +driver information files using the #include directive. +The #define directive is used to define constants for +use in your printer definitions:

+ +
+#define NAME value
+
+ +

The NAME is any sequence of letters, numbers, and +the underscore. The value is a number or string; if the +value contains spaces you must put double quotes around it, for +example:

+ +
+#define FOO "My String Value"
+
+ +

Constants can also be defined on the command-line using the -D +option:

+ +
+ppdc -DNAME="value" filename.drv
+
+ +

Once defined, you use the notation $NAME to substitute the value of +the constant in the file, for example:

+ +
+#define MANUFACTURER "Foo"
+#define FOO_600      0
+#define FOO_1200     1
+
+{
+  Manufacturer "$MANUFACTURER"
+  ModelNumber $FOO_600
+  ModelName "FooJet 2000"
+  ...
+}
+
+{
+  Manufacturer "$MANUFACTURER"
+  ModelNumber $FOO_1200
+  ModelName "FooJet 2001"
+  ...
+}
+
+ +

Numeric constants can be bitwise OR'd together by placing the constants +inside parenthesis, for example:

+ +
+// ModelNumber capability bits
+#define DUPLEX 1
+#define COLOR  2
+
+...
+
+{
+  // Define a model number specifying the capabilities of the printer...
+  ModelNumber ($DUPLEX $COLOR)
+  ...
+}
+
+ + +

Conditional Statements

+ +

The PPD compiler supports conditional compilation using the #if, +#elif, #else, and #endif directives. The #if +and #elif directives are followed by a constant name or an expression. +For example, to include a group of options when "ADVANCED" is defined:

+ +
+#if ADVANCED
+Group "Advanced/Advanced Options"
+  Option "fooCyanAdjust/Cyan Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooMagentaAdjust/Magenta Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooYellowAdjust/Yellow Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooBlackAdjust/Black Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+#endif
+
+ + +

Defining Constraints

+ +

Constraints are strings that are used to specify that one or more option +choices are incompatible, for example two-sided printing on transparency media. +Constraints are also used to prevent the use of uninstalled features such as the +duplexer unit, additional media trays, and so forth.

+ +

The UIConstraints directive is used to specify a constraint that is +placed in the PPD file. The directive is followed by a string using one of the +following formats:

+ +
+UIConstraints "*Option1 *Option2"
+UIConstraints "*Option1 Choice1 *Option2"
+UIConstraints "*Option1 *Option2 Choice2"
+UIConstraints "*Option1 Choice1 *Option2 Choice2"
+
+ +

Each option name is preceded by the asterisk (*). If no choice is +given for an option, then all choices except False and +None will conflict with the other option and choice(s). Since the PPD +compiler automatically adds reciprocal constraints (option A conflicts with +option B, so therefore option B conflicts with option A), you need only specify +the constraint once.

+ +

Listing 5: "examples/constraint.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Installable Option Group
+Group "InstallableOptions/Options Installed"
+
+  // Duplexing unit option
+  Option "OptionDuplexer/Duplexing Unit" Boolean AnySetup 10
+    Choice True/Installed ""
+    *Choice "False/Not Installed" ""
+
+// General Option Group
+Group General
+
+  // Duplexing option
+  Option "Duplex/Two-Sided Printing" PickOne AnySetup 10
+    *Choice "None/No" "<</Duplex false>>setpagedevice""
+    Choice "DuplexNoTumble/Long Edge Binding"
+           "<</Duplex true/Tumble false>>setpagedevice""
+    Choice "DuplexTumble/Short Edge Binding"
+           "<</Duplex true/Tumble true>>setpagedevice""
+
+// Only allow duplexing if the duplexer is installed
+UIConstraints "*Duplex *OptionDuplexer False"
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ +

Listing 5 shows a variation of the first example with +an added Duplex option and installable option for the duplexer, +OptionDuplex. A constraint is added at the end to specify that any +choice of the Duplex option that is not None is incompatible +with the "Duplexer Installed" option set to "Not Installed" +(False):

+ +
+UIConstraints "*Duplex *OptionDuplexer False"
+
+ +

Enhanced Constraints

+ +

CUPS 1.4 supports constraints between 2 or more options using the +Attribute directive. cupsUIConstraints attributes define +the constraints, while cupsUIResolver attributes define option changes +to resolve constraints. For example, we can specify the previous duplex +constraint with a resolver that turns off duplexing with the following two +lines:

+ +
+Attribute cupsUIConstraints DuplexOff "*Duplex *OptionDuplexer False"
+Attribute cupsUIResolver DuplexOff "*Duplex None"
+
+ +

Localization

+ +

The PPD compiler provides localization of PPD files in different languages +through message catalog files in the GNU gettext or Apple .strings +formats. Each user text string and several key PPD attribute values such as +LanguageVersion and LanguageEncoding are looked up in the +corresponding message catalog and the translated text is substituted in the +generated PPD files. One message catalog file can be used by multiple driver +information files, and each file contains a single language translation.

+ +

The ppdpo Utility

+ +

While CUPS includes localizations of all standard media sizes and options in +several languages, your driver information files may provide their own media +sizes and options that need to be localized. CUPS provides a utility program to +aid in the localization of drivers called ppdpo(1). The ppdpo program creates +or updates a message catalog file based upon one or more driver information +files. New messages are added with the word "TRANSLATE" added to the front of +the translation string to make locating new strings for translation easier. The +program accepts the message catalog filename and one or more driver information +files.

+ +

For example, run the following command to create a new German message catalog +called de.po for all of the driver information files in the current +directory:

+ +
+ppdpo -o de.po *.drv
+
+ +

If the file de.po already exists, ppdpo will update the +contents of the file with any new messages that need to be translated. To create +an Apple .strings file instead, specify the output filename with a .strings +extension, for example:

+ +
+ppdpo -o de.strings *.drv
+
+ +

Using Message Catalogs with the PPD Compiler

+ +

Once you have created a message catalog, use the #po directive to declare it in each +driver information file. For example, to declare the German message catalog for +a driver use:

+ +
+#po de "de.po"  // German
+
+ +

In fact, you can use the #po directive as many times as needed:

+ +
+#po de "de.po"  // German
+#po es "es.po"  // Spanish
+#po fr "fr.po"  // French
+#po it "it.po"  // Italian
+#po ja "ja.po"  // Japanese
+
+ +

The filename ("de.po", etc.) can be relative to the location of the driver +information file or an absolute path. Once defined, the PPD compiler will +automatically generate a globalized PPD for every language declared in your +driver information file. To generate a single-language PPD file, simply use the +-l option to list the corresponding locale, for example:

+ +
+ppdc -l de -d ppd/de mydrivers.drv
+
+ +

to generate German PPD files.

+
+ + diff --git a/doc/help/raster-driver.html b/doc/help/raster-driver.html new file mode 100644 index 0000000..2ec3f4e --- /dev/null +++ b/doc/help/raster-driver.html @@ -0,0 +1,579 @@ + + + + + Developing Raster Printer Drivers + + + + + + +
+ + +

Developing Raster Printer Drivers

+ +

This document describes how to develop printer drivers for raster printers. Topics include: printer driver basics, creating new PPD files, using filters, implementing color management, and adding Mac OS X features.

+ +
+ + + + + + +
See AlsoProgramming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
+

Contents

+ +

Printer Driver Basics

+ +

A CUPS raster printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, one or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

+ +

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into CUPS raster data. Figure 1 shows the data flow of a typical print job.

+ +
+ + +
Figure 1: Raster Filter Chain
Raster Filter Chain
+ +

The raster filter converts CUPS raster data into a format the printer understands, for example HP-PCL. CUPS includes several sample raster filters supporting standard page description languages (PDLs). Table 1 shows the raster filters that are bundled with CUPS and the languages they support.

+ +
+ + + + + + + + + + + +
Table 1: Standard CUPS Raster Filters
FilterPDLsppdc DriverTypeppdc #include file
rastertoepsonESC/P, ESC/P2epsonepson.h
rastertoescpxESC/P, ESC/P2, EPSON Remote Modeescpescp.h
rastertohpHP-PCL3, HP-PCL5hphp.h
rastertolabelCPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPLlabellabel.h
rastertopclxHP-RTL, HP-PCL3, HP-PCL3GUI, HP-PCL5, HP-PCL5c, HP-PCL5epclpcl.h
+ +

The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.

+ +

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

+ +

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

+ +
+ + +
Figure 2: Command Filter Chain
Command Filter Chain
+ +

Raster printer drivers must provide their own command filter.

+ + +

Creating New PPD Files

+ +

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for several similar black-and-white HP-PCL5 laser printers.

+ +

Listing 1: "examples/laserjet-basic.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// Include HP-PCL driver definitions
+#include <pcl.h>
+
+// Specify that this driver uses the HP-PCL driver...
+DriverType pcl
+
+// Specify the driver options via the model number...
+ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and driver version
+Manufacturer "HP"
+Version 1.0
+
+// Supported page sizes and their margins
+HWMargins 18 12 18 12
+*MediaSize Letter
+MediaSize Legal
+MediaSize Executive
+MediaSize Monarch
+MediaSize Statement
+MediaSize FanFoldGermanLegal
+
+HWMargins 18 12.72 18 12.72
+MediaSize Env10
+
+HWMargins 9.72 12 9.72 12
+MediaSize A4
+MediaSize A5
+MediaSize B5
+MediaSize EnvC5
+MediaSize EnvDL
+MediaSize EnvISOB5
+MediaSize Postcard
+MediaSize DoublePostcard
+
+// Only black-and-white output with mode 3 compression...
+ColorModel Gray k chunky 3
+
+// Supported resolutions
+Resolution - 1 0 0 0 "300dpi/300 DPI"
+*Resolution - 8 0 0 0 "600dpi/600 DPI"
+
+// Supported input slots
+*InputSlot 7 "Auto/Automatic Selection"
+InputSlot 2 "Manual/Tray 1 - Manual Feed"
+InputSlot 4 "Upper/Tray 1"
+InputSlot 1 "Lower/Tray 2"
+InputSlot 5 "LargeCapacity/Tray 3"
+
+// Tray 3 is an option...
+Installable "OptionLargeCapacity/Tray 3 Installed"
+UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity"
+
+{
+  // HP LaserJet 2100 Series
+  Throughput 10
+  ModelName "LaserJet 2100 Series"
+  PCFileName "hpljt211.ppd"
+}
+
+{
+  // LaserJet 2200 and 2300 series have duplexer option...
+  Duplex normal
+  Installable "OptionDuplex/Duplexer Installed"
+  UIConstraints "*OptionDuplex False *Duplex"
+
+  {
+    // HP LaserJet 2200 Series
+    Throughput 19
+    ModelName "LaserJet 2200 Series"
+    PCFileName "hpljt221.ppd"
+  }
+
+  {
+    // HP LaserJet 2300 Series
+    Throughput 25
+    ModelName "LaserJet 2300 Series"
+    PCFileName "hpljt231.ppd"
+  }
+}
+
+ + +

Using Filters

+ +

The standard CUPS raster filters can be specified using the +DriverType directive, for example:

+ +
+// Specify that this driver uses the HP-PCL driver...
+DriverType pcl
+
+ +

Table 1 shows the driver types for each of the standard CUPS raster filters. For drivers that do not use the standard raster filters, the "custom" type is used with Filter directives:

+ +
+DriverType custom
+Filter application/vnd.cups-raster 100 /path/to/raster/filter
+Filter application/vnd.cups-command 100 /path/to/command/filter
+
+ + +

Implementing Color Management

+ +

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

+ +
+Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
+
+ +

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

+ +
+Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
+Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
+
+ +

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

+ +

Since Mac OS X 10.5Custom Color Matching Support

+ +

Mac OS X printer drivers that are based on an existing standard RGB colorspace can tell the system to use the corresponding colorspace instead of an arbitrary ICC color profile when doing color management. The APSupportsCustomColorMatching and APDefaultCustomColorMatchingProfile attributes can be used to enable this mode:

+ +
+Attribute APSupportsCustomColorMatching "" true
+Attribute APDefaultCustomColorMatchingProfile "" sRGB
+
+ + +

Adding Mac OS X Features

+ +

Mac OS X printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

+ +
+Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
+Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
+Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
+Attribute APPrinterPreset "name/text" "*option choice ..."
+
+
+ + diff --git a/doc/help/ref-access_log.html b/doc/help/ref-access_log.html new file mode 100644 index 0000000..015ea17 --- /dev/null +++ b/doc/help/ref-access_log.html @@ -0,0 +1,140 @@ + + + + access_log + + + + +

access_log

+ +

The access_log file lists each HTTP resource that +is accessed by a web browser or client. Each line is in an +extended version of the so-called "Common Log Format" used by +many web servers and web reporting tools:

+ +

+ +host group user date-time \"method resource version\" status +bytes ipp-operation ipp-status
+ +
+ +10.0.1.2 - - [01/Dec/2005:21:50:28 +0000] "POST / HTTP/1.1" 200 +317 CUPS-Get-Printers +successful-ok-ignored-or-substituted-attributes
+ +localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1" +200 0 - -
+ +localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200 +157 CUPS-Get-Printers +successful-ok-ignored-or-substituted-attributes
+ +localhost - - [01/Dec/2005:21:50:32 +0000] "POST / HTTP/1.1" 200 +1411 CUPS-Get-Devices -
+ +localhost - - [01/Dec/2005:21:50:32 +0000] "GET /admin HTTP/1.1" +200 6667 - -
+ +

+ +

The host field will normally only be an IP address +unless you have enabled the HostNameLookups +directive in the cupsd.conf file or if the IP address +corresponds to your local machine.

+ +

The group field always contains "-".

+ +

The user field is the authenticated username of the +requesting user. If no username and password is supplied for the +request then this field contains "-".

+ +

The date-time field is the date and time of the request +in local time and is in the format:

+ +

+[DD/MON/YYYY:HH:MM:SS +ZZZZ] +

+ +

The method field is the HTTP method used: "GET", +"OPTIONS", "PUT", or "POST". "GET" requests are used to get files +from the server, both for the web interface and to get +configuration and log files. "OPTIONS" requests are used to +upgrade connections to TLS encryption. "PUT" requests are used to +upload configuration files. "POST" requests are used for web +interface forms and IPP requests.

+ +

The resource field is the filename of the requested +resource.

+ +

The version field is the HTTP specification version used by the +client. For CUPS clients this will always be "HTTP/1.1".

+ +

The status field contains the HTTP result status of the +request, as follows:

+ +
    + +
  • 200 - Successful operation.
  • + +
  • 201 - File created/modified successfully.
  • + +
  • 304 - The requested file has not changed.
  • + +
  • 400 - Bad HTTP request; typically this + means that you have a malicious program trying to access + your server.
  • + +
  • 401 - Unauthorized, authentication + (username + password) is required.
  • + +
  • 403 - Access is forbidden; typically + this means that a client tried to access a file or + resource they do not have permission to access.
  • + +
  • 404 - The file or resource does not + exist.
  • + +
  • 405 - URL access method is not allowed; + typically this means you have a web browser using your + server as a proxy.
  • + +
  • 413 - Request too large; typically this + means that a client tried to print a file larger than the + MaxRequestSize + allows.
  • + +
  • 426 - Upgrading to TLS-encrypted + connection.
  • + +
  • 500 - Server error; typically this + happens when the server is unable to open/create a file - + consult the error_log file for details.
  • + +
  • 501 - The client requested encryption + but encryption support is not enabled/compiled in.
  • + +
  • 505 - HTTP version number not supported; + typically this means that you have a malicious program + trying to access your server.
  • + +
+ +

The bytes field contains the number of bytes in the +request. For POST requests the bytes field contains the +number of bytes of non-IPP data that is received from the +client.

+ +

The ipp-operation field contains either "-" for non-IPP +requests or the IPP operation name for POST requests containing +an IPP request.

+ +

The ipp-status field contains either "-" for non-IPP +requests or the IPP status code name for POST requests containing +an IPP response.

+ + + diff --git a/doc/help/ref-classes-conf.html b/doc/help/ref-classes-conf.html new file mode 100644 index 0000000..40bc3d5 --- /dev/null +++ b/doc/help/ref-classes-conf.html @@ -0,0 +1,566 @@ + + + + classes.conf + + + + +

classes.conf

+ +

The CUPS scheduler (cupsd) uses the +/etc/cups/classes.conf file to store the list of +available classes. This file contains only locally defined +classes, not remote classes that are created automatically via +browsing. Each directive is listed on a line by itself followed +by its value. Comments are introduced using the number sign ("#") +character at the beginning of a line.

+ +

While the class configuration file consists of plain text and +can be modified using your favorite text editor, you should +normally use the lpadmin(8) +command, web interface, or any of the available GUIs to manage +your classes instead. If you do choose to edit this file +manually, you will need to stop the scheduler first, make your +changes, and then start the scheduler to make them active.

+ + +

Accepting

+ +

Examples

+ +
+<Class name>
+  ...
+  Accepting yes
+</Class>
+
+ +

Description

+ +

The Accepting directive defines the initial state +of the printer-is-accepting-jobs attribute. This state +is also set by the accept(8) and +reject(8) commands:

+ +
+/usr/sbin/accept classname
+/usr/sbin/reject classname
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

AllowUser

+ +

Examples

+ +
+<Class name>
+  ...
+  AllowUser foo_user
+  AllowUser @bar_group
+</Class>
+
+ +

Description

+ +

The AllowUser directive adds a username or group +name to the requesting-user-name-allowed attribute +which can be set by the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -u allow:foo_user,@bar_group
+
+ +

This directive must appear inside a Class or DefaultClass directive. +This directive cannot be used with DenyUser.

+ + +

Class

+ +

Examples

+ +
+<Class name>
+  ...
+</Class>
+
+ +

Description

+ +

The Class directive begins a class definition. +Classes are added using the lpadmin(8) command: + +

+/usr/sbin/lpadmin -p printername -c classname
+
+ + +

DefaultClass

+ +

Examples

+ +
+<DefaultClass name>
+  ...
+</Class>
+
+ +

Description

+ +

The DefaultClass directive begins a class +definition as the default server destination. The default server +destination can be set using the lpadmin(8) +command:

+ +
+/usr/sbin/lpadmin -d classname
+
+ +

Note that the server default destination settings can be +overridden by the user's default destination settings which are +normally set using the lpoptions(1) command.

+ + +

DenyUser

+ +

Examples

+ +
+<Class name>
+  ...
+  DenyUser foo_user
+  DenyUser @bar_group
+</Class>
+
+ +

Description

+ +

The DenyUser directive adds a username or group +name to the requesting-user-name-denied attribute +which can be set by the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -u deny:foo_user,@bar_group
+
+ +

This directive must appear inside a Class or DefaultClass directive. +This directive cannot be used with AllowUser

+ + +

Info

+ +

Examples

+ +
+<Class name>
+  ...
+  Info My Class
+</Class>
+
+ +

Description

+ +

The Info directive defines the string for the +printer-info attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -D "My Class"
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

JobSheets

+ +

Examples

+ +
+<Class name>
+  ...
+  JobSheets none,standard
+</Class>
+
+ +

Description

+ +

The JobSheets directive specifies the default +banner pages to print before and after a print job. In the above +example, only a standard banner will print after each +job. The lpadmin(8) command is normally used to set +the default banners: + +

+/usr/sbin/lpadmin -p classname -o job-sheets-default=none,standard
+
+ +

If only one banner file is specified, it will be printed +before the files in the job. If a second banner file is +specified, it is printed after the files in the job.

+ +

The available banner pages depend on the local system +configuration; CUPS includes the following standard banner +files:

+ +
    + +
  • none - Do not produce a banner + page.
  • + +
  • classified - A banner page with a + "classified" label at the top and bottom.
  • + +
  • confidential - A banner page with a + "confidential" label at the top and bottom.
  • + +
  • secret - A banner page with a + "secret" label at the top and bottom.
  • + +
  • standard - A banner page with no label + at the top and bottom.
  • + +
  • topsecret - A banner page with a + "top secret" label at the top and bottom.
  • + +
  • unclassified - A banner page with an + "unclassified" label at the top and bottom.
  • + +
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

KLimit

+ +

Examples

+ +
+<Class name>
+  ...
+  KLimit 1234
+</Class>
+
+ +

Description

+ +

The KLimit directive defines the value of the +job-k-limit attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -o job-k-limit=1234
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

Location

+ +

Examples

+ +
+<Class name>
+  ...
+  Location Building 3321
+</Class>
+
+ +

Description

+ +

The Location directive defines the string for the +printer-location attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -L "Building 3321"
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

CUPS 1.2OpPolicy

+ +

Examples

+ +
+<Class name>
+  ...
+  OpPolicy default
+</Class>
+
+ +

Description

+ +

The OpPolicy directive sets the operation policy +that is used for the printer. The lpadmin(8) command +sets the current operation policy:

+ +
+/usr/sbin/lpadmin -p classname -o printer-op-policy=default
+
+ +

The default policy is named "default". All policies correspond +to those defined using the cupsd.conf Policy +section.

+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

CUPS 1.2Option

+ +

Examples

+ +
+<Class name>
+  ...
+  Option name value
+  Option scaling 100
+  Option page-left 72
+</Class>
+
+ +

Description

+ +

The Option directive specifies a default job +template attribute value. It is mapped to +name-default in the printer attributes and applied +to jobs as name.

+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

PageLimit

+ +

Examples

+ +
+<Class name>
+  ...
+  PageLimit 1234
+</Class>
+
+ +

Description

+ +

The PageLimit directive defines the value of the +job-page-limit attribute. It can be set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p classname -o job-page-limit=1234
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

Printer

+ +

Examples

+ +
+<Class name>
+  ...
+  Printer foo
+  Printer bar
+  Printer bleep
+</Class>
+
+ +

Description

+ +

The Printer directive adds a printer to a class. +Printers are added to a class using the lpadmin(8) +command:

+ +
+/usr/sbin/lpadmin -p printername -c classname
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

QuotaPeriod

+ +

Examples

+ +
+<Class name>
+  ...
+  QuotaPeriod 604800
+</Class>
+
+ +

Description

+ +

The QuotaPeriod directive defines the value of +the job-quota-period attribute. Typical values are +86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000 +(1 year). It is set using the lpadmin(8) +command:

+ +
+/usr/sbin/lpadmin -p classname -o job-quota-period=604800
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

CUPS 1.2Shared

+ +

Examples

+ +
+<Class name>
+  ...
+  Shared yes
+</Class>
+
+ +

Description

+ +

The Shared directive defines the initial value of +the printer-is-shared attribute. The strings +yes and no correspond to the true and false +values, respectively. The lpadmin(8) command sets +the current state:

+ +
+/usr/sbin/lpadmin -p classname -o printer-is-shared=true
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

State

+ +

Examples

+ +
+<Class name>
+  ...
+  State idle
+</Class>
+
+ +

Description

+ +

The State directive defines the initial value of +the printer-state attribute. The strings +idle and stopped correspond to the IPP +enumeration values 3 and 5, respectively. The +cupsenable(8) and cupsdisable(8) +commands set the current state:

+ +
+/usr/sbin/cupsenable classname
+/usr/sbin/cupsdisable classname
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

StateMessage

+ +

Examples

+ +
+<Class name>
+  ...
+  StateMessage Ready to print.
+</Class>
+
+ +

Description

+ +

The StateMessage directive defines the initial +string for the printer-state-message attribute. The +following are some example messages:

+ +
+StateMessage Connected to host_name...
+StateMessage Connecting to printer_queue on port port_number...
+StateMessage Network host host_name is busy; will retry in 30 seconds...
+StateMessage Class busy; will retry in 10 seconds...
+StateMessage Class is busy; retrying print job...
+StateMessage Print file accepted - job ID id_number.
+StateMessage Ready to print.
+StateMessage Waiting for job to complete
+
+ +

This directive must appear inside a Class or DefaultClass +section.

+ + +

CUPS 1.2StateTime

+ +

Examples

+ +
+<Class name>
+  ...
+  StateTime 1133542425
+</Class>
+
+ +

Description

+ +

The StateTime directive defines the UNIX time +(seconds since Jan 1, 1970) for the last state change of the +queue. It is mapped to the printer-state-change-time +attribute.

+ +

This directive must appear inside a Class or DefaultClass +section.

+ + + + diff --git a/doc/help/ref-client-conf.html b/doc/help/ref-client-conf.html new file mode 100644 index 0000000..0229b00 --- /dev/null +++ b/doc/help/ref-client-conf.html @@ -0,0 +1,56 @@ + + + + client.conf + + + + +

client.conf

+ +

The /etc/cups/client.conf and +~/.cups/client.conf files contain up to two directives +that determine how the client behaves. Each directive is listed +on a line by itself followed by its value. Comments are +introduced using the number sign ("#") character at the beginning +of a line.

+ +

Encryption

+ +

Examples

+ +
+Encryption Never
+Encryption IfRequested
+Encryption Required
+Encryption Always
+
+ +

Description

+ +

The Encryption directive specifies the default +encryption settings for the client.

+ +

The default setting is IfRequested.

+ + +

ServerName

+ +

Examples

+ +
+ServerName foo.bar.com
+ServerName 11.22.33.44
+ServerName foo.bar.com:8631
+
+ +

Description

+ +

The ServerName directive specifies sets the remote server that is to be used for all client operations. That is, it redirects all client requests to the remote server.

+ +

The default port number is 631 but can be overridden by adding a colon followed by the desired port number to the value.

+ +

The default is to use the local server ("localhost") or domain socket, if so configured.

+ + + diff --git a/doc/help/ref-cupsd-conf.html.in b/doc/help/ref-cupsd-conf.html.in new file mode 100644 index 0000000..ce0ec8f --- /dev/null +++ b/doc/help/ref-cupsd-conf.html.in @@ -0,0 +1,3202 @@ + + + + cupsd.conf + + + + +

cupsd.conf

+ +

The /etc/cups/cupsd.conf file contains +configuration directives that control how the server +functions. Each directive is listed on a line by itself followed +by its value. Comments are introduced using the number sign ("#") +character at the beginning of a line.

+ +

Since the server configuration file consists of plain text, +you can use your favorite text editor to make changes to it. +After making any changes, restart the cupsd(8) +process using the startup script for your operating system:

+ +
    + +
  • AIX, IRIX, Linux, Solaris: +
    +/etc/init.d/cups restart
    +	
  • + +
  • HP-UX: +
    +/sbin/init.d/cups restart
    +	
  • + +
  • MacOS X: +
    +sudo launchctl unload /System/Library/LaunchDaemons/org.cups.cupsd.plist
    +sudo launchctl load /System/Library/LaunchDaemons/org.cups.cupsd.plist
    +	
  • + +
+ +

You can also edit this file from the CUPS web interface, which +automatically handles restarting the scheduler.

+ + +

AccessLog

+ +

Examples

+ +
+AccessLog /var/log/cups/access_log
+AccessLog /var/log/cups/access_log-%s
+AccessLog syslog
+
+ +

Description

+ +

The AccessLog directive sets the name of the +access log file. If the filename is not absolute then it is +assumed to be relative to the ServerRoot directory. The +access log file is stored in "common log format" and can be used +by any web access reporting tool to generate a report on CUPS +server activity.

+ +

The server name can be included in the filename by using +%s in the name.

+ +

The special name "syslog" can be used to send the access +information to the system log instead of a plain file.

+ +

The default access log file is +@CUPS_LOGDIR@/access_log.

+ + +

AccessLogLevel

+ +

Examples

+ +
+AccessLogLevel config
+AccessLogLevel actions
+AccessLogLevel all
+
+ +

Description

+ +

The AccessLogLevel directive controls which requests are logged +to the access log file. The following levels are defined:

+ +
    + +
  • config; Log when printers and classes are added, + deleted, or modified and when configuration files are accessed or + updated.
  • + +
  • actions; Log when print jobs are submitted, + held, released, modified, or canceled, and any of the conditions + for config.
  • + +
  • all; Log all requests.
  • + +
+ +

The default access log level is @CUPS_ACCESS_LOG_LEVEL@.

+ + +

Allow

+ +

Examples

+ +
+<Location /path>
+  ...
+  Allow from All
+  Allow from None
+  Allow from *.example.com
+  Allow from .example.com
+  Allow from host.example.com
+  Allow from nnn.*
+  Allow from nnn.nnn.*
+  Allow from nnn.nnn.nnn.*
+  Allow from nnn.nnn.nnn.nnn
+  Allow from nnn.nnn.nnn.nnn/mm
+  Allow from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+  Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
+  Allow from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
+  Allow from @LOCAL
+  Allow from @IF(name)
+</Location>
+
+ +

Description

+ +

The Allow directive specifies a hostname, IP +address, or network that is allowed access to the server. +Allow directives are cumulative, so multiple +Allow directives can be used to allow access for +multiple hosts or networks.

+ +

Host and domain name matching require that you enable the HostNameLookups +directive.

+ +

The /mm notation specifies a CIDR netmask, as shown in +Table 1.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: CIDR Netmasks
mmnetmaskmmnetmask
00.0.0.08255.0.0.0
1128.0.0.016255.255.0.0
2192.0.0.024255.255.255.0
......32255.255.255.255
+ +

The @LOCAL name will allow access from all local +interfaces. The @IF(name) name will allow access +from the named interface. In both cases, CUPS only allows access +from the network that the interface(s) are configured for - +requests arriving on the interface from a foreign network will +not be accepted.

+ +

The Allow directive must appear inside a Location or Limit section.

+ + +

DeprecatedAuthClass

+ +

Examples

+ +
+<Location /path>
+  ...
+  AuthClass Anonymous
+  AuthClass User
+  AuthClass System
+  AuthClass Group
+</Location>
+
+ +

Description

+ +

The AuthClass directive defines what level of +authentication is required:

+ +
    + +
  • Anonymous - No authentication should be + performed (default)
  • + +
  • User - A valid username and password is + required
  • + +
  • System - A valid username and password + is required, and the username must belong to the "sys" + group; this can be changed using the SystemGroup + directive
  • + +
  • Group - A valid username and password is + required, and the username must belong to the group named + by the AuthGroupName + directive
  • + +
+ +

The AuthClass directive must appear inside a Location or Limit section.

+ +

This directive is deprecated and will be removed from a +future release of CUPS. Consider using the more flexible Require directive instead.

+ + +

DeprecatedAuthGroupName

+ +

Examples

+ +
+<Location /path>
+  ...
+  AuthGroupName mygroup
+  AuthGroupName lp
+</Location>
+
+ +

Description

+ +

The AuthGroupName directive sets the group to use +for Group authentication.

+ +

The AuthGroupName directive must appear inside a +Location or Limit section.

+ +

This directive is deprecated and will be removed from a +future release of CUPS. Consider using the more flexible Require directive instead.

+ + +

AuthType

+ +

Examples

+ +
+<Location /path>
+  ...
+  AuthType None
+  AuthType Basic
+  AuthType Digest
+  AuthType BasicDigest
+  AuthType Negotiate
+</Location>
+
+ +

Description

+ +

The AuthType directive defines the type of +authentication to perform:

+ +
    + +
  • None - No authentication should be + performed (default)
  • + +
  • Basic - Basic authentication should be + performed using the UNIX password and group files
  • + +
  • Digest - Digest authentication should be + performed using the /etc/cups/passwd.md5 + file
  • + +
  • BasicDigest - Basic authentication + should be performed using the + /etc/cups/passwd.md5 file
  • + +
  • Negotiate - Kerberos authentication + should be performed
  • + +
+ +

When using Basic, Digest, +BasicDigest, or Negotiate authentication, +clients connecting through the localhost interface can +also authenticate using certificates.

+ +

The AuthType directive must appear inside a Location or Limit section.

+ + +

AutoPurgeJobs

+ +

Examples

+ +
+AutoPurgeJobs Yes
+AutoPurgeJobs No
+
+ +

Description

+ +

The AutoPurgeJobs directive specifies whether or +not to purge completed jobs once they are no longer required for +quotas. This option has no effect if quotas are not enabled. The +default setting is No.

+ + +

BrowseAddress

+ +

Examples

+ +
+BrowseAddress 255.255.255.255:631
+BrowseAddress 192.0.2.255:631
+BrowseAddress host.example.com:631
+BrowseAddress @LOCAL
+BrowseAddress @IF(name)
+
+ +

Description

+ +

The BrowseAddress directive specifies an address +to send browsing information to. Multiple +BrowseAddress directives can be specified to send +browsing information to different networks or systems.

+ +

The @LOCAL name will broadcast printer +information to all local interfaces. The @IF(name) +name will broadcast to the named interface.

+ +

There is no default browse address.

+ +
Note: + +

If you are using HP-UX 10.20 and a subnet that is not 24, +16, or 8 bits, printer browsing (and in fact all broadcast +reception) will not work. This problem appears to be fixed in +HP-UX 11.0.

+ +
+ + +

BrowseAllow

+ +

Examples

+ +
+BrowseAllow from all
+BrowseAllow from none
+BrowseAllow from 192.0.2
+BrowseAllow from 192.0.2.0/24
+BrowseAllow from 192.0.2.0/255.255.255.0
+BrowseAllow from *.example.com
+BrowseAllow from @LOCAL
+BrowseAllow from @IF(name)
+
+ +

Description

+ +

The BrowseAllow directive specifies a system or +network to accept browse packets from. The default is to accept +browse packets from all hosts.

+ +

Host and domain name matching require that you enable the HostNameLookups +directive.

+ +

IP address matching supports exact matches, partial addresses that match +networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, or network +addresses using the specified netmask or bit count. The /mm +notation specifies a CIDR netmask, a shown in Table 1.

+ +

The @LOCAL name will allow browse data from all +local interfaces. The @IF(name) name will allow +browse data from the named interface. In both cases, CUPS only +allows data from the network that the interface(s) are configured +for - data arriving on the interface from a foreign network will +not be allowed.

+ + +

BrowseDeny

+ +

Examples

+ +
+BrowseDeny from all
+BrowseDeny from none
+BrowseDeny from 192.0.2
+BrowseDeny from 192.0.2.0/24
+BrowseDeny from 192.0.2.0/255.255.255.0
+BrowseDeny from *.example.com
+BrowseDeny from @LOCAL
+BrowseDeny from @IF(name)
+
+ +

Description

+ +

The BrowseDeny directive specifies a system or +network to reject browse packets from. The default is to not deny +browse packets from any hosts.

+ +

Host and domain name matching require that you enable the HostNameLookups +directive.

+ +

IP address matching supports exact matches, partial addresses that match +networks using netmasks of 255.0.0.0, 255.255.0.0, and 255.255.255.0, or network +addresses using the specified netmask or bit count. The /mm +notation specifies a CIDR netmask, a shown in Table 1.

+ +

The @LOCAL name will block browse data from all +local interfaces. The @IF(name) name will block +browse data from the named interface. In both cases, CUPS only +blocks data from the network that the interface(s) are configured +for - data arriving on the interface from a foreign network will +not be blocked.

+ + +

BrowseInterval

+ +

Examples

+ +
+BrowseInterval 0
+BrowseInterval 30
+
+ +

Description

+ +

The BrowseInterval directive specifies the +maximum amount of time between browsing updates. Specifying a +value of 0 seconds disables outgoing browse updates but allows a +server to receive printer information from other hosts.

+ +

The BrowseInterval value should always be less +than the BrowseTimeout +value. Otherwise printers and classes will disappear from client +systems between updates.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseLDAPBindDN

+ +

Examples

+ +
+BrowseLDAPBindDN foo
+
+ +

Description

+ +

The BrowseLDAPBindDN directive specifies the LDAP +domain name to use when listening for printer registrations. The +default is undefined.

+ + +

CUPS 1.4/Mac OS X 10.6BrowseLDAPCACertFile

+ +

Examples

+ +
+BrowseLDAPCACertFile /etc/cups/ssl/certs
+
+ +

Description

+ +

The BrowseLDAPCACertFile directive specifies the SSL certificate +authority file to use for LDAP + SSL. The default is undefined.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseLDAPDN

+ +

Examples

+ +
+BrowseLDAPDN bar
+
+ +

Description

+ +

The BrowseLDAPDN directive specifies the LDAP +domain name to use when registering local shared printers. The +default is undefined.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseLDAPPassword

+ +

Examples

+ +
+BrowseLDAPPassword foo123
+
+ +

Description

+ +

The BrowseLDAPPassword directive specifies the +access password to use when connecting to the LDAP server. The +default is undefined.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseLDAPServer

+ +

Examples

+ +
+BrowseLDAPServer localhost
+
+ +

Description

+ +

The BrowseLDAPServer directive specifies the name +of the LDAP server to connect to. The default is undefined.

+ + +

BrowseLocalOptions

+ +

Examples

+ +
+BrowseLocalOptions compression=yes
+BrowseLocalOptions encryption=required
+BrowseLocalOptions compression=yes&encryption=required
+
+ +

Description

+ +

The BrowseLocalOptions directive specifies +additional IPP backend options to advertise with local shared +printers. The default is to not include any options.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseLocalProtocols

+ +

Examples

+ +
+BrowseLocalProtocols all
+BrowseLocalProtocols none
+BrowseLocalProtocols cups
+BrowseLocalProtocols dnssd
+BrowseLocalProtocols ldap
+BrowseLocalProtocols lpd
+BrowseLocalProtocols slp
+BrowseLocalProtocols smb
+BrowseLocalProtocols cups dnssd
+
+ +

Description

+ +

The BrowseLocalProtocols directive specifies the +protocols to use when advertising local shared printers on the +network. Multiple protocols can be specified by separating them +with spaces. The default is "@CUPS_BROWSE_LOCAL_PROTOCOLS@".

+ + +

BrowseOrder

+ +

Examples

+ +
+BrowseOrder allow,deny
+BrowseOrder deny,allow
+
+ +

Description

+ +

The BrowseOrder directive specifies the order of +allow/deny processing. The default order is +deny,allow:

+ +
    + +
  • allow,deny - Deny browse packets by + default, then check BrowseAllow lines + followed by BrowseDeny lines.
  • + +
  • deny,allow - Allow browse packets by + default, then check BrowseDeny lines + followed by BrowseAllow lines.
  • + +
+ + +

BrowsePoll

+ +

Examples

+ +
+BrowsePoll 192.0.2.2:631
+BrowsePoll host.example.com:631
+
+ +

Description

+ +

The BrowsePoll directive polls a server for +available printers once every BrowseInterval seconds. +Multiple BrowsePoll directives can be specified to +poll multiple servers.

+ +

If BrowseInterval is set to 0 then the server is +polled once every 30 seconds.

+ + +

BrowsePort

+ +

Examples

+ +
+BrowsePort 631
+BrowsePort 9999
+
+ +

Description

+ +

The BrowsePort directive specifies the UDP port number +used for browse packets. The default port number is 631.

+ +
Note: + +

You must set the BrowsePort to the same value +on all of the systems that you want to see. + +

+ + +

CUPS 1.1.10BrowseProtocols

+ +

Examples

+ +
+BrowseProtocols all
+BrowseProtocols none
+BrowseProtocols cups
+BrowseProtocols dnssd
+BrowseProtocols ldap
+BrowseProtocols lpd
+BrowseProtocols slp
+BrowseProtocols smb
+BrowseProtocols cups dnssd
+
+ +

Description

+ +

The BrowseProtocols directive specifies the +protocols to use when showing and advertising shared printers on +the local network. Multiple protocols can be specified by +separating them with spaces. The default protocol is +"@CUPS_BROWSE_LOCAL_PROTOCOLS@" for +BrowseLocalProtocols and +"@CUPS_BROWSE_REMOTE_PROTOCOLS@" for +BrowseRemoteProtocols.

+ +
Note: + +

When using the SLP protocol, you must have at least +one Directory Agent (DA) server on your network. Otherwise the +CUPS scheduler (cupsd) will not respond to client +requests for several seconds while polling the network.

+ +
+ + +

BrowseRelay

+ +

Examples

+ +
+BrowseRelay 193.0.2.1 192.0.2.255
+BrowseRelay 193.0.2.0/255.255.255.0 192.0.2.255
+BrowseRelay 193.0.2.0/24 192.0.2.255
+BrowseRelay *.example.com 192.0.2.255
+BrowseRelay host.example.com 192.0.2.255
+
+ +

Description

+ +

The BrowseRelay directive specifies source and +destination addresses for relaying browsing information from one +host or network to another. Multiple BrowseRelay +directives can be specified as needed.

+ +

BrowseRelay is typically used on systems that +bridge multiple subnets using one or more network interfaces. It +can also be used to relay printer information from polled servers +with the line:

+ +
+BrowseRelay 127.0.0.1 192.0.2.255
+
+ +

This effectively provides access to printers on a WAN for all +clients on the LAN. Use multiple BrowseRelay lines to +relay information to multiple subnets.

+ + +

BrowseRemoteOptions

+ +

Examples

+ +
+BrowseRemoteOptions compression=yes
+BrowseRemoteOptions encryption=required
+BrowseRemoteOptions ?compression=yes&encryption=required
+
+ +

Description

+ +

The BrowseRemoteOptions directive specifies +additional IPP backend options to include with remote shared +printers. If the options string begins with a question mark (?), +the options replace any options specified by the remote server. +The default is to not include any options.

+ + +

CUPS 1.2/Mac OS X 10.5BrowseRemoteProtocols

+ +

Examples

+ +
+BrowseRemoteProtocols all
+BrowseRemoteProtocols none
+BrowseRemoteProtocols cups
+BrowseRemoteProtocols ldap
+BrowseRemoteProtocols slp
+
+ +

Description

+ +

The BrowseRemoteProtocols directive specifies the +protocols to use when finding remote shared printers on the +network. Multiple protocols can be specified by separating them +with spaces. The default is "@CUPS_BROWSE_REMOTE_PROTOCOLS@".

+ + +

BrowseShortNames

+ +

Examples

+ +
+BrowseShortNames Yes
+BrowseShortNames No
+
+ +

Description

+ +

The BrowseShortNames directive specifies whether +or not short names are used for remote printers when possible. +Short names are just the remote printer name, without the server +("printer"). If more than one remote printer is detected with the +same name, the printers will have long names ("printer@server1", +"printer@server2".)

+ +

The default value for this option is @CUPS_BROWSE_SHORT_NAMES@.

+ + +

BrowseTimeout

+ +

Examples

+ +
+BrowseTimeout 300
+BrowseTimeout 60
+
+ +

Description

+ +

The BrowseTimeout directive sets the timeout for +printer or class information that is received in browse packets. +Once a printer or class times out it is removed from the list of +available destinations.

+ +

The BrowseTimeout value should always be greater +than the BrowseInterval value. +Otherwise printers and classes will disappear from client systems +between updates.

+ + +

BrowseWebIF

+ +

Examples

+ +
+BrowseWebIF On
+BrowseWebIF Off
+
+ +

Description

+ +

The BrowseWebIF directive controls whether the CUPS web +interface is advertised via DNS-SD. The default setting is +Off.

+ + +

Browsing

+ +

Examples

+ +
+Browsing On
+Browsing Off
+
+ +

Description

+ +

The Browsing directive controls whether or not +network printer browsing is enabled. The default setting is +@CUPS_BROWSING@.

+ +

This directive does not enable sharing of local printers by +itself; you must also use the BrowseAddress or BrowseProtocols +directives to advertise local printers to other systems.

+ +
Note: + +

If you are using HP-UX 10.20 and a subnet that is not 24, +16, or 8 bits, printer browsing (and in fact all broadcast +reception) will not work. This problem appears to be fixed in +HP-UX 11.0.

+ +
+ + +

CUPS 1.1.7Classification

+ +

Examples

+ +
+Classification
+Classification classified
+Classification confidential
+Classification secret
+Classification topsecret
+Classification unclassified
+
+ +

Description

+ +

The Classification directive sets the +classification level on the server. When this option is set, at +least one of the banner pages is forced to the classification +level, and the classification is placed on each page of output. +The default is no classification level.

+ + +

CUPS 1.1.10ClassifyOverride

+ +

Examples

+ +
+ClassifyOverride Yes
+ClassifyOverride No
+
+ +

Description

+ +

The ClassifyOverride directive specifies whether +users can override the default classification level on the +server. When the server classification is set, users can change +the classification using the job-sheets option and +can choose to only print one security banner before or after the +job. If the job-sheets option is set to +none then the server default classification is +used.

+ +

The default is to not allow classification overrides.

+ + +

CUPS 1.1.15ConfigFilePerm

+ +

Examples

+ +
+ConfigFilePerm 0644
+ConfigFilePerm 0640
+
+ +

Description

+ +

The ConfigFilePerm directive specifies the permissions to use when the scheduler writes configuration and cache files, typically in response to IPP or HTTP requests. The default is @CUPS_CONFIG_FILE_PERM@.

+ +
Note: + +

The permissions for the printers.conf file are always masked to only allow access from the scheduler user (typically root). This is done because printer device URIs sometimes contain sensitive authentication information that should not be generally known on the system. There is no way to disable this security feature.

+ +
+ + +

DataDir

+ +

Examples

+ +
+DataDir /usr/share/cups
+
+ +

Description

+ +

The DataDir directive sets the directory to use +for data files.

+ + +

CUPS 1.2/Mac OS X 10.5DefaultAuthType

+ +

Examples

+ +
+DefaultAuthType Basic
+DefaultAuthType BasicDigest
+DefaultAuthType Digest
+DefaultAuthType Negotiate
+
+ +

Description

+ +

The DefaultAuthType directive specifies the type +of authentication to use for IPP operations that require a +username. The default is Basic.

+ + +

CUPS 1.2/Mac OS X 10.5DefaultEncryption

+ +

Examples

+ +
+DefaultEncryption Never
+DefaultEncryption IfRequested
+DefaultEncryption Required
+
+ +

Description

+ +

The DefaultEncryption directive specifies the +type of encryption to use when performing authentication. The +default is Required.

+ + +

DefaultLanguage

+ +

Examples

+ +
+DefaultLanguage de
+DefaultLanguage en
+DefaultLanguage es
+DefaultLanguage fr
+DefaultLanguage it
+
+ +

Description

+ +

The DefaultLanguage directive specifies the +default language to use for client connections. Setting the +default language also sets the default character set if a +language localization file exists for it. The default language +is "en" for English.

+ + +

CUPS 1.4/Mac OS X 10.6DefaultPaperSize

+ +

Examples

+ +
+DefaultPaperSize Letter
+DefaultPaperSize A4
+DefaultPaperSize Auto
+DefaultPaperSize None
+
+ +

Description

+ +

The DefaultPaperSize directive specifies the default paper +size to use when creating new printers. The default is Auto +which uses a paper size appropriate for the system default locale. A value +of None tells the scheduler to not set the default paper +size.

+ + +

CUPS 1.2/Mac OS X 10.5DefaultPolicy

+ +

Examples

+ +
+DefaultPolicy default
+DefaultPolicy authenticated
+DefaultPolicy foo
+
+ +

Description

+ +

The DefaultPolicy directive specifies the default +policy to use for IPP operation. The default is +default. CUPS also includes a policy called +authenticated that requires a username and password for printing +and other job operations.

+ + +

CUPS 1.2/Mac OS X 10.5DefaultShared

+ +

Examples

+ +
+DefaultShared yes
+DefaultShared no
+
+ +

Description

+ +

The DefaultShared directive specifies whether +printers are shared (published) by default. The default is +@CUPS_DEFAULT_SHARED@.

+ + +

Deny

+ +

Examples

+ +
+<Location /path>
+  ..
+  Deny from All
+  Deny from None
+  Deny from *.example.com
+  Deny from .example.com
+  Deny from host.example.com
+  Deny from nnn.*
+  Deny from nnn.nnn.*
+  Deny from nnn.nnn.nnn.*
+  Deny from nnn.nnn.nnn.nnn
+  Deny from nnn.nnn.nnn.nnn/mm
+  Deny from nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
+  Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
+  Deny from [xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]/mmm
+  Deny from @LOCAL
+  Deny from @IF(name)
+</Location>
+
+ +

Description

+ +

The Deny directive specifies a hostname, IP +address, or network that is denied access to the server. +Deny directives are cumulative, so multiple +Deny directives can be used to deny access for +multiple hosts or networks.

+ +

Host and domain name matching require that you enable the HostNameLookups +directive.

+ +

The /mm notation specifies a CIDR netmask, a shown in +Table 1.

+ +

The @LOCAL name will deny access from all local +interfaces. The @IF(name) name will deny access from +the named interface. In both cases, CUPS only denies access from +the network that the interface(s) are configured for - requests +arriving on the interface from a foreign network will +not be denied.

+ +

The Deny directive must appear inside a Location or Limit section.

+ + +

CUPS 1.4/Mac OS X 10.6DirtyCleanInterval

+ +

Examples

+ +
+DirtyCleanInterval 30
+DirtyCleanInterval 0
+
+ +

Description

+ +

The DirtyCleanInterval directive specifies the number of +seconds to wait before updating configuration and state files for printers, +classes, subscriptions, and jobs. The default is 30 seconds. A value of 0 +causes the update to occur as soon as possible, typically within a few +milliseconds.

+ + +

DocumentRoot

+ +

Examples

+ +
+DocumentRoot /usr/share/doc/cups
+DocumentRoot /foo/bar/doc/cups
+
+ +

Description

+ +

The DocumentRoot directive specifies the location +of web content for the HTTP server in CUPS. If an absolute path +is not specified then it is assumed to be relative to the ServerRoot directory. The +default directory is @CUPS_DOCROOT@.

+ +

Documents are first looked up in a sub-directory for the +primary language requested by the client (e.g. +@CUPS_DOCROOT@/fr/...) and then directly under +the DocumentRoot directory (e.g. +@CUPS_DOCROOT@/...), so it is possible to +localize the web content by providing subdirectories for each +language needed.

+ + +

Encryption

+ +

Examples

+ +
+<Location /path>
+  ...
+  Encryption Never
+  Encryption IfRequested
+  Encryption Required
+</Location>
+
+ +

Description

+ +

The Encryption directive must appear instead a Location or Limit section and specifies the +encryption settings for that location. The default setting is +IfRequested for all locations.

+ + +

ErrorLog

+ +

Examples

+ +
+ErrorLog /var/log/cups/error_log
+ErrorLog /var/log/cups/error_log-%s
+ErrorLog syslog
+
+ +

Description

+ +

The ErrorLog directive sets the name of the error +log file. If the filename is not absolute then it is assumed to +be relative to the ServerRoot directory. The +default error log file is @CUPS_LOGDIR@/error_log.

+ +

The server name can be included in the filename by using +%s in the name.

+ +

The special name "syslog" can be used to send the error +information to the system log instead of a plain file.

+ + +

CUPS 1.3/Mac OS X 10.5ErrorPolicy

+ +

Examples

+ +
+ErrorPolicy abort-job
+ErrorPolicy retry-job
+ErrorPolicy stop-printer
+
+ +

Description

+ +

The ErrorPolicy directive defines the default policy that +is used when a backend is unable to send a print job to the +printer.

+ +

The following values are supported:

+ +
    + +
  • abort-job - Abort the job and proceed + with the next job in the queue
  • + +
  • retry-job - Retry the job after waiting + for N seconds; the cupsd.conf JobRetryInterval + directive controls the value of N
  • + +
  • retry-this-job - Retry the current job immediately + and indefinitely.
  • + +
  • stop-printer - Stop the printer and keep + the job for future printing; this is the default + value
  • + +
+ + + +

CUPS 1.4/Mac OS X 10.6FatalErrors

+ +

Examples

+ +
+FatalErrors none
+FatalErrors all
+FatalErrors browse
+FatalErrors config
+FatalErrors listen
+FatalErrors log
+FatalErrors permissions
+FatalErrors all -permissions
+FatalErrors config permissions log
+
+ +

Description

+ +

The FatalErrors directive determines whether certain kinds of +errors are fatal. The following kinds of errors are currently recognized:

+ +
    + +
  • none - No errors are fatal
  • + +
  • all - All of the errors below are fatal
  • + +
  • browse - Browsing initialization errors are fatal, + for example failed binding to the CUPS browse port or failed connections + to LDAP servers
  • + +
  • config - Configuration file syntax errors are + fatal
  • + +
  • listen - Listen or Port errors are fatal, except for + IPv6 failures on the loopback or "any" addresses
  • + +
  • log - Log file creation or write errors are fatal
  • + +
  • permissions - Bad startup file permissions are + fatal, for example shared SSL certificate and key files with world- + read permissions
  • + +
+ +

Multiple errors can be listed, and the form "-kind" can be used with +all to remove specific kinds of errors. The default setting is +@CUPS_FATAL_ERRORS@.

+ + +

CUPS 1.1.18FileDevice

+ +

Examples

+ +
+FileDevice Yes
+FileDevice No
+
+ +

Description

+ +

The FileDevice directive determines whether the +scheduler allows new printers to be added using device URIs of +the form file:/filename. File devices are most often +used to test new printer drivers and do not support raw file +printing.

+ +

The default setting is No.

+ +
Note: + +

File devices are managed by the scheduler. Since the +scheduler normally runs as the root user, file devices +can be used to overwrite system files and potentially +gain unauthorized access to the system. If you must +create printers using file devices, we recommend that +you set the FileDevice directive to +Yes for only as long as you need to add the +printers to the system, and then reset the directive to +No.

+ +
+ + +

CUPS 1.1.3FilterLimit

+ +

Examples

+ +
+FilterLimit 0
+FilterLimit 200
+FilterLimit 1000
+
+ +

Description

+ +

The FilterLimit directive sets the maximum cost +of all running job filters. It can be used to limit the number of +filter programs that are run on a server to minimize disk, +memory, and CPU resource problems. A limit of 0 disables filter +limiting.

+ +

An average print to a non-PostScript printer needs a filter +limit of about 200. A PostScript printer needs about half that +(100). Setting the limit below these thresholds will effectively +limit the scheduler to printing a single job at any time.

+ +

The default limit is 0.

+ + +

CUPS 1.1.16FilterNice

+ +

Examples

+ +
+FilterNice 0
+FilterNice 10
+FilterNice 19
+
+ +

Description

+ +

The FilterNice directive sets the nice(1) +value to assign to filter processes. The nice value ranges from +0, the highest priority, to 19, the lowest priority. The default +is 0.

+ + +

CUPS 1.1.3FontPath

+ +

Examples

+ +
+FontPath /foo/bar/fonts
+FontPath /usr/share/cups/fonts:/foo/bar/fonts
+
+ +

Description

+ +

The FontPath directive specifies the font path to +use when searching for fonts. The default font path is +/usr/share/cups/fonts.

+ + +

Group

+ +

Examples

+ +
+Group lp
+Group nobody
+
+ +

Description

+ +

The Group directive specifies the UNIX group that +filter and CGI programs run as. The default group is +system-specific but is usually lp or +nobody.

+ + +

CUPS 1.1.10HideImplicitMembers

+ +

Examples

+ +
+HideImplicitMembers Yes
+HideImplicitMembers No
+
+ +

Description

+ +

The HideImplicitMembers directive controls +whether the individual printers in an implicit class are hidden +from the user. The default is Yes.

+ +

ImplicitClasses +must be enabled for this directive to have any effect.

+ + +

HostNameLookups

+ +

Examples

+ +
+HostNameLookups On
+HostNameLookups Off
+HostNameLookups Double
+
+ +

Description

+ +

The HostNameLookups directive controls whether or +not CUPS looks up the hostname for connecting clients. The +Double setting causes CUPS to verify that the +hostname resolved from the address matches one of the addresses +returned for that hostname. Double lookups also +prevent clients with unregistered addresses from connecting to +your server.

+ +

The default is Off to avoid the potential server +performance problems with hostname lookups. Set this option to +On or Double only if absolutely +required.

+ + +

CUPS 1.1.10ImplicitAnyClasses

+ +

Examples

+ +
+ImplicitAnyClasses On
+ImplicitAnyClasses Off
+
+ +

Description

+ +

The ImplicitAnyClasses directive controls +whether implicit classes for local and remote printers are +created with the name AnyPrinter. The default +setting is Off.

+ +

ImplicitClasses +must be enabled for this directive to have any effect.

+ + +

ImplicitClasses

+ +

Examples

+ +
+ImplicitClasses On
+ImplicitClasses Off
+
+ +

Description

+ +

The ImplicitClasses directive controls whether +implicit classes are created based upon the available network +printers and classes. The default setting is +@CUPS_IMPLICIT_CLASSES@ but is automatically turned +Off if Browsing is turned +Off.

+ + +

CUPS 1.1.9Include

+ +

Examples

+ +
+Include filename
+Include /foo/bar/filename
+
+ +

Description

+ +

The Include directive includes the named file in +the cupsd.conf file. If no leading path is provided, +the file is assumed to be relative to the ServerRoot directory.

+ + +

CUPS 1.5JobPrivateAccess

+ +

Examples

+ +
+JobPrivateAccess all
+JobPrivateAccess default
+JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
+
+ +

Description

+ +

The JobPrivateAccess directive specifies the access list for a +job's private values. The "default" access list is "@OWNER @SYSTEM". "@ACL" maps +to the printer's requesting-user-name-allowed or requesting-user-name-denied +values.

+ +

The JobPrivateAccess directive must appear inside a Policy section.

+ + +

CUPS 1.5JobPrivateValues

+ +

Examples

+ +
+JobPrivateValues all
+JobPrivateValues default
+JobPrivateValues none
+JobPrivateValues attribute-name-1 [ ... attribute-name-N ]
+
+ +

Description

+ +

The JobPrivateValues directive specifies the list of job values +to make private. The "default" values are "job-name", +"job-originating-host-name", and "job-originating-user-name".

+ +

The JobPrivateValues directive must appear inside a Policy section.

+ + +

CUPS 1.2/Mac OS X 10.5JobRetryInterval

+ +

Examples

+ +
+JobRetryInterval 30
+JobRetryInterval 120
+
+ +

Description

+ +

The JobRetryInterval directive specifies the +number of seconds to wait before retrying a job. This is +typically used for fax queues but can also be used with normal +print queues whose error policy is retry-job. The +default is 30 seconds.

+ + +

CUPS 1.4/Mac OS X 10.6JobKillDelay

+ +

Examples

+ +
+JobKillDelay 30
+JobKillDelay 120
+
+ +

Description

+ +

The JobKillDelay directive specifies the number of seconds to +wait before killing the filters and backend associated with a canceled or held +job. The default is 30 seconds.

+ + +

CUPS 1.2/Mac OS X 10.5JobRetryLimit

+ +

Examples

+ +
+JobRetryLimit 5
+JobRetryLimit 50
+
+ +

Description

+ +

The JobRetryLimit directive specifies the maximum +number of times the scheduler will try to print a job. This is +typically used for fax queues but can also be used with normal +print queues whose error policy is retry-job. The +default is 5 times.

+ + +

KeepAlive

+ +

Examples

+ +
+KeepAlive On
+KeepAlive Off
+
+ +

Description

+ +

The KeepAlive directive controls whether or not +to support persistent HTTP connections. The default is +On.

+ +

HTTP/1.1 clients automatically support persistent connections, +while HTTP/1.0 clients must specifically request them using the +Keep-Alive attribute in the Connection: +field of each request.

+ + +

KeepAliveTimeout

+ +

Examples

+ +
+KeepAliveTimeout 60
+KeepAliveTimeout 30
+
+ +

Description

+ +

The KeepAliveTimeout directive controls how long +a persistent HTTP connection will remain open after the last +request. The default is 30 seconds.

+ + +

CUPS 1.1.7Limit (Location)

+ +

Examples

+ +
+<Location /path>
+  <Limit GET POST>
+  ...
+  </Limit>
+
+  <Limit ALL>
+  ...
+  </Limit>
+</Location>
+
+ +

Description

+ +

The Limit directive groups access control +directives for specific types of HTTP requests and must appear +inside a Location section. +Access can be limited for individual request types +(DELETE, GET, HEAD, +OPTIONS, POST, PUT, and +TRACE) or for all request types (ALL). +The request type names are case-sensitive for compatibility with +Apache.

+ + +

CUPS 1.2/Mac OS X 10.5Limit (Policy)

+ +

Examples

+ +
+<Policy name>
+  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer>
+  ...
+  </Limit>
+
+  <Limit All>
+  ...
+  </Limit>
+</Policy>
+
+ +

Description

+ +

When included in Policy +sections, the Limit directive groups access control +directives for specific IPP operations. Multiple operations can +be listed, separated by spaces. Table 2 lists the supported +operations.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Supported IPP Operations
Operation NameDescription
AllAll operations - used as the default limit for + operations that are not listed
Cancel-JobCancel a job
Cancel-SubscriptionCancel a subscription
Create-JobCreate a new, empty job
Create-Job-SubscriptionCreates a notification subscription on a job
Create-Printer-SubscriptionCreates a notification subscription on a printer
CUPS-Accept-JobsSets the printer-is-accepting-jobs value for a printer to true
CUPS-Add-Modify-ClassAdds or modifies a class
CUPS-Add-Modify-PrinterAdds or modifies a printer
CUPS-Authenticate-JobAuthenticates a job for printing
CUPS-Delete-ClassDeletes a class
CUPS-Delete-PrinterDeletes a printer
CUPS-Get-ClassesGets a list of classes
CUPS-Get-DefaultGets the (network/server) default printer or class
CUPS-Get-DevicesGets a list of available devices
CUPS-Get-PPDsGets a list of available manufacturers or drivers
CUPS-Get-PrintersGets a list of printers and/or classes
CUPS-Move-JobMoves a job to a new destination
CUPS-Reject-JobsSets the printer-is-accepting-jobs value for a printer to false
CUPS-Set-DefaultSets the network/server default printer or class
Disable-PrinterSets the printer-state value for a printer to stopped
Enable-PrinterSets the printer-state value for a printer to idle/processing
Get-Job-AttributesGets information about a job
Get-JobsGets a list of jobs
Get-NotificationsGets a list of events
Get-Printer-AttributesGets information about a printer or class
Get-Subscription-AttributesGets information about a notification subscription
Get-SubscriptionsGets a list of notification subscriptions
Hold-JobHolds a job for printing
Pause-PrinterSets the printer-state value for a printer to stopped
Print-JobCreates a job with a single file for printing
Purge-JobsRemoves all jobs from a printer
Release-JobReleases a previously held job for printing
Renew-SubscriptionRenews a notification subscription
Restart-JobReprints a job
Resume-PrinterSets the printer-state value for a printer to idle/processing
Send-DocumentAdds a file to an job created with Create-Job
Set-Job-AttributesChanges job options
Validate-JobValidates job options prior to printing
+ + +

CUPS 1.1.7LimitExcept

+ +

Examples

+ +
+<Location /path>
+  <LimitExcept GET POST>
+  ...
+  </LimitExcept>
+</Location>
+
+ +

Description

+ +

The LimitExcept directive groups access control +directives for specific types of HTTP requests and must appear +inside a Location section. +Unlike the Limit directive, +LimitExcept restricts access for all requests +except those listed on the LimitExcept +line.

+ + +

LimitRequestBody

+ +

Examples

+ +
+LimitRequestBody 10485760
+LimitRequestBody 10m
+LimitRequestBody 0
+
+ +

Description

+ +

The LimitRequestBody directive controls the +maximum size of print files, IPP requests, and HTML form data in +HTTP POST requests. The default limit is 0 which disables the +limit check.

+ + +

Listen

+ +

Examples

+ +
+Listen 127.0.0.1:631
+Listen 192.0.2.1:631
+Listen [::1]:631
+Listen *:631
+
+ +

Description

+ +

The Listen directive specifies a network address +and port to listen for connections. Multiple Listen +directives can be provided to listen on multiple addresses.

+ +

The Listen directive is similar to the Port directive but allows you to +restrict access to specific interfaces or networks.

+ + +

CUPS 1.1.7ListenBackLog

+ +

Examples

+ +
+ListenBackLog 5
+ListenBackLog 10
+
+ +

Description

+ +

The ListenBackLog directive sets the maximum +number of pending connections the scheduler will allow. This +normally only affects very busy servers that have reached the MaxClients limit, but can +also be triggered by large numbers of simultaneous connections. +When the limit is reached, the operating system will refuse +additional connections until the scheduler can accept the pending +ones. The default is the OS-defined default limit, typically +either 5 for older operating systems or 128 for newer operating +systems.

+ + +

Location

+ +

Examples

+ +
+<Location />
+...
+</Location>
+
+<Location /admin>
+...
+</Location>
+
+<Location /admin/conf>
+...
+</Location>
+
+<Location /admin/log>
+...
+</Location>
+
+<Location /classes>
+...
+</Location>
+
+<Location /classes/name>
+...
+</Location>
+
+<Location /jobs>
+...
+</Location>
+
+<Location /printers>
+...
+</Location>
+
+<Location /printers/name>
+...
+</Location>
+
+
+ +

Description

+ +

The Location directive specifies access control +and authentication options for the specified HTTP resource or +path. The Allow, AuthType, Deny, Encryption, Limit, LimitExcept, Order, Require, and Satisfy directives may all +appear inside a location.

+ +

Note that more specific resources override the less specific +ones. So the directives inside the /printers/name +location will override ones from /printers. +Directives inside /printers will override ones from +/. None of the directives are inherited.

+ +
+ + + + + + + + + + + + + + + + + +
Table 3: Common Locations on the Server
LocationDescription
/The path for all get operations (get-printers, get-jobs, etc.)
/adminThe path for all administration operations (add-printer, delete-printer, start-printer, etc.)
/admin/confThe path for access to the CUPS configuration files (cupsd.conf, client.conf, etc.)
/admin/logThe path for access to the CUPS log files (access_log, error_log, page_log)
/classesThe path for all classes
/classes/nameThe resource for class name
/jobsThe path for all jobs (hold-job, release-job, etc.)
/jobs/idThe resource for job id
/printersThe path for all printers
/printers/nameThe path for printer name
/printers/name.ppdThe PPD file path for printer name
+ + +

LogDebugHistory

+ +

Examples

+ +
+LogDebugHistory 0
+LogDebugHistory 200
+
+ +

Description

+ +

When LogLevel is not set to +debug or debug2, the LogDebugHistory +directive specifies the number of debugging messages that are logged when an +error occurs during printing. The default is 200 messages. A value of 0 +disables debugging history entirely and is not recommended.

+ + +

CUPS 1.1.15LogFilePerm

+ +

Examples

+ +
+LogFilePerm 0644
+LogFilePerm 0600
+
+ +

Description

+ +

The LogFilePerm directive specifies the +permissions to use when writing log files. The default +is @CUPS_LOG_FILE_PERM@.

+ + +

LogLevel

+ +

Examples

+ +
+LogLevel none
+LogLevel emerg
+LogLevel alert
+LogLevel crit
+LogLevel error
+LogLevel warn
+LogLevel notice
+LogLevel info
+LogLevel debug
+LogLevel debug2
+
+ +

Description

+ +

The LogLevel directive specifies the level of +logging for the ErrorLog +file. The following values are recognized (each level logs +everything under the preceding levels):

+ +
    + +
  • none - Log nothing
  • + +
  • emerg - Log emergency conditions that + prevent the server from running
  • + +
  • alert - Log alerts that must be handled + immediately
  • + +
  • crit - Log critical errors that don't + prevent the server from running
  • + +
  • error - Log general errors
  • + +
  • warn - Log errors and warnings
  • + +
  • notice - Log temporary error conditions
  • + +
  • info - Log all requests and state + changes
  • + +
  • debug - Log basic debugging + information
  • + +
  • debug2 - Log all debugging + information
  • + +
+ +

The default LogLevel is @CUPS_LOG_LEVEL@.

+ + +

LogTimeFormat

+ +

Examples

+ +
+LogTimeFormat standard
+LogTimeFormat usecs
+
+ +

Description

+ +

The LogTimeFormat directive specifies the format used for the +date and time in the log files. Standard uses the standard Apache +Common Log Format date and time while usecs adds microseconds. +The default is standard.

+ + +

MaxClients

+ +

Examples

+ +
+MaxClients 100
+MaxClients 1024
+
+ +

Description

+ +

The MaxClients directive controls the maximum +number of simultaneous clients that will be allowed by the +server. The default is 100 clients.

+ +
Note: + +

Since each print job requires a file descriptor for the status +pipe, the scheduler internally limits the MaxClients +value to 1/3 of the available file descriptors to avoid possible +problems when printing large numbers of jobs.

+ +
+ + +

CUPS 1.1.18MaxClientsPerHost

+ +

Examples

+ +
+MaxClientsPerHost 10
+
+ +

Description

+ +

The MaxClientsPerHost directive controls the +maximum number of simultaneous clients that will be allowed from +a single host by the server. The default is the +MaxClients value.

+ +

This directive provides a small measure of protection against +Denial of Service attacks from a single host.

+ + +

CUPS 1.1.16MaxCopies

+ +

Examples

+ +
+MaxCopies 100
+MaxCopies 65535
+
+ +

Description

+ +

The MaxCopies directive controls the maximum +number of copies that a user can print of a job. The default is +@CUPS_MAX_COPIES@ copies.

+ +
Note: + +

Most HP PCL laser printers internally limit the number of +copies to 100.

+ +
+ + + +

MaxJobs

+ +

Examples

+ +
+MaxJobs 100
+MaxJobs 9999
+MaxJobs 0
+
+ +

Description

+ +

The MaxJobs directive controls the maximum number +of jobs that are kept in memory. Once the number of jobs reaches +the limit, the oldest completed job is automatically purged from +the system to make room for the new one. If all of the known jobs +are still pending or active then the new job will be +rejected.

+ +

Setting the maximum size to 0 disables this functionality. The +default setting is 500.

+ + +

CUPS 1.1.7MaxJobsPerPrinter

+ +

Examples

+ +
+MaxJobsPerPrinter 100
+MaxJobsPerPrinter 9999
+MaxJobsPerPrinter 0
+
+ +

Description

+ +

The MaxJobsPerPrinter directive controls the +maximum number of active jobs that are allowed for each printer +or class. Once a printer or class reaches the limit, new jobs +will be rejected until one of the active jobs is completed, +stopped, aborted, or canceled.

+ +

Setting the maximum to 0 disables this functionality. The +default setting is 0.

+ + +

CUPS 1.1.7MaxJobsPerUser

+ +

Examples

+ +
+MaxJobsPerUser 100
+MaxJobsPerUser 9999
+MaxJobsPerUser 0
+
+ +

Description

+ +

The MaxJobsPerUser directive controls the maximum +number of active jobs that are allowed for each user. Once a user +reaches the limit, new jobs will be rejected until one of the +active jobs is completed, stopped, aborted, or canceled.

+ +

Setting the maximum to 0 disables this functionality. The +default setting is 0.

+ + +

MaxLogSize

+ +

Examples

+ +
+MaxLogSize 1048576
+MaxLogSize 1m
+MaxLogSize 0
+
+ +

Description

+ +

The MaxLogSize directive controls the maximum +size of each log file. Once a log file reaches or exceeds the +maximum size it is closed and renamed to filename.O. +This allows you to rotate the logs automatically. The default +size is 1048576 bytes (1MB).

+ +

Setting the maximum size to 0 disables log rotation.

+ + +

DeprecatedMaxRequestSize

+ +

Examples

+ +
+MaxRequestSize 10485760
+MaxRequestSize 10m
+MaxRequestSize 0
+
+ +

Description

+ +

The MaxRequestSize directive controls the maximum +size of print files, IPP requests, and HTML form data in HTTP +POST requests. The default limit is 0 which disables the limit +check.

+ +

This directive is deprecated and will be removed in a +future CUPS release. Use the LimitRequestBody +directive instead.

+ + +

CUPS 1.4/Mac OS X 10.6MultipleOperationTimeout

+ +

Examples

+ +
+MultipleOperationTimeout 60
+MultipleOperationTimeout 300
+MultipleOperationTimeout 86400
+
+ +

Description

+ +

The MultipleOperationTimeout directive sets the maximum amount +of time between files in a multi-file print job. The default is 300 seconds.

+ + +

Order

+ +

Examples

+ +
+<Location /path>
+  ...
+  Order Allow,Deny
+  Order Deny,Allow
+</Location>
+
+ +

Description

+ +

The Order directive defines the default access +control. The following values are supported:

+ +
    + +
  • allow,deny - Deny requests by default, + then check the Allow + lines followed by the Deny lines
  • + +
  • deny,allow - Allow requests by default, + then check the Deny + lines followed by the Allow lines
  • + +
+ +

The Order directive must appear inside a Location or Limit section.

+ + +

PageLog

+ +

Examples

+ +
+PageLog /var/log/cups/page_log
+PageLog /var/log/cups/page_log-%s
+PageLog syslog
+
+ +

Description

+ +

The PageLog directive sets the name of the page +log file. If the filename is not absolute then it is assumed to +be relative to the ServerRoot directory. The +default page log file is @CUPS_LOGDIR@/page_log.

+ +

The server name can be included in the filename by using +%s in the name.

+ +

The special name "syslog" can be used to send the page +information to the system log instead of a plain file.

+ + +

PageLogFormat

+ +

Examples

+ +
+PageLogFormat %p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}
+PageLogFormat PAGE %p %u %j %P %C %{job-billing} %{job-originating-host-name}
+
+ +

Description

+ +

The PageLogFormat directive sets the format of lines +that are logged to the page log file. Sequences beginning with percent (%) +characters are replaced with the corresponding information, while all other +characters are copied literally. The following percent sequences are +recognized:

+ +
    + +
  • %%: Inserts a single percent character.
  • + +
  • %{name}: Inserts the value of the specified IPP + attribute.
  • + +
  • %C: Inserts the number of copies for the current page.
  • + +
  • %P: Inserts the current page number.
  • + +
  • %T: Inserts the current date and time in common log + format.
  • + +
  • %j: Inserts the job ID.
  • + +
  • %p: Inserts the printer name.
  • + +
  • %u: Inserts the username.
  • + +
+ +

The default is "%p %u %j %T %P %C %{job-billing} %{job-originating-host-name} %{job-name} %{media} %{sides}".

+ + +

CUPS 1.2/Mac OS X 10.5PassEnv

+ +

Examples

+ +
+PassEnv MY_ENV_VARIABLE
+
+ +

Description

+ +

The PassEnv directive specifies an environment +variable that should be passed to child processes. Normally, the +scheduler only passes the DYLD_LIBRARY_PATH, +LD_ASSUME_KERNEL, LD_LIBRARY_PATH, +LD_PRELOAD, NLSPATH, +SHLIB_PATH, TZ, and VGARGS +environment variables to child processes.

+ + +

CUPS 1.2/Mac OS X 10.5Policy

+ +

Examples

+ +
+<Policy name>
+  <Limit operation ... operation>
+  ...
+  </Limit>
+  <Limit operation ... operation>
+  ...
+  </Limit>
+  <Limit All>
+  ...
+  </Limit>
+</Policy>
+
+ +

Description

+ +

The Policy directive specifies IPP operation +access control limits. Each policy contains 1 or more Limit sections to set the +access control limits for specific operations - user limits, +authentication, encryption, and allowed/denied addresses, +domains, or hosts. The <Limit All> section +specifies the default access control limits for operations that +are not listed.

+ +

Policies are named and associated with printers via the +printer's operation policy setting +(printer-op-policy). The default policy for the +scheduler is specified using the DefaultPolicy +directive.

+ + +

Port

+ +

Examples

+ +
+Port 631
+Port 80
+
+ +

Description

+ +

The Port directive specifies a port to listen on. +Multiple Port lines can be specified to listen on +multiple ports. The Port directive is equivalent to +"Listen *:nnn". The default port is 631.

+ +
Note: + +

On systems that support IPv6, this directive will bind to both +the IPv4 and IPv6 wildcard address.

+ +
+ + +

PreserveJobHistory

+ +

Examples

+ +
+PreserveJobHistory On
+PreserveJobHistory Off
+
+ +

Description

+ +

The PreserveJobHistory directive controls whether +the history of completed, canceled, or aborted print jobs is +stored on disk.

+ +

A value of On (the default) preserves job +information until the administrator purges it with the +cancel command.

+ +

A value of Off removes the job information as +soon as each job is completed, canceled, or aborted.

+ + +

PreserveJobFiles

+ +

Examples

+ +
+PreserveJobFiles On
+PreserveJobFiles Off
+
+ +

Description

+ +

The PreserveJobFiles directive controls whether +the document files of completed, canceled, or aborted print jobs +are stored on disk.

+ +

A value of On preserves job files until the +administrator purges them with the cancel command. +Jobs can be restarted (and reprinted) as desired until they are +purged.

+ +

A value of Off (the default) removes the job +files as soon as each job is completed, canceled, or aborted.

+ + +

Printcap

+ +

Examples

+ +
+Printcap
+Printcap /etc/printcap
+Printcap /etc/printers.conf
+Printcap /Library/Preferences/org.cups.printers.plist
+
+ +

Description

+ +

The Printcap directive controls whether or not a +printcap file is automatically generated and updated with a list +of available printers. If specified with no value, then no +printcap file will be generated. The default is to generate a +file named @CUPS_DEFAUL_PRINTCAP@.

+ +

When a filename is specified (e.g. @CUPS_DEFAULT_PRINTCAP@), +the printcap file is written whenever a printer is added or +removed. The printcap file can then be used by applications that +are hardcoded to look at the printcap file for the available +printers.

+ + +

PrintcapFormat

+ +

Examples

+ +
+PrintcapFormat BSD
+PrintcapFormat Solaris
+PrintcapFormat plist
+
+ +

Description

+ +

The PrintcapFormat directive controls the output format of the +printcap file. The default is to generate the plist format on Mac OS X, the +Solaris format on Solaris, and the BSD format on other operating systems.

+ + +

CUPS 1.1.13PrintcapGUI

+ +

Examples

+ +
+PrintGUI /usr/bin/glpoptions
+
+ +

Description

+ +

The PrintcapGUI directive sets the program to +associate with the IRIX printer GUI interface script which is +used by IRIX applications to display printer-specific options. +There is no default program.

+ + +

CUPS 1.1.21ReloadTimeout

+ +

Examples

+ +
+ReloadTimeout 0
+ReloadTimeout 30
+
+ +

Description

+ +

The ReloadTimeout directive specifies the number +of seconds the scheduler will wait for active jobs to complete +before doing a restart. The default is 30 seconds.

+ + +

CUPS 1.1.3RemoteRoot

+ +

Examples

+ +
+RemoteRoot remroot
+RemoteRoot root
+
+ +

Description

+ +

The RemoteRoot directive sets the username for +unauthenticated root requests from remote hosts. The default +username is remroot. Setting RemoteRoot +to root effectively disables this security +mechanism.

+ + +

RequestRoot

+ +

Examples

+ +
+RequestRoot /var/spool/cups
+RequestRoot /foo/bar/spool/cups
+
+ +

Description

+ +

The RequestRoot directive sets the directory for +incoming IPP requests and HTML forms. If an absolute path is not +provided then it is assumed to be relative to the ServerRoot directory. The +default request directory is @CUPS_REQUESTS@.

+ + +

CUPS 1.1.7Require

+ +

Examples

+ +
+<Location /path>
+  ...
+  Require group foo bar
+  Require user john mary
+  Require valid-user
+  Require user @groupname
+  Require user @SYSTEM
+  Require user @OWNER
+</Location>
+
+ +

Description

+ +

The Require directive specifies that +authentication is required for the resource. The +group keyword specifies that the authenticated user +must be a member of one or more of the named groups that +follow.

+ +

The user keyword specifies that the +authenticated user must be one of the named users or groups that +follow. Group names are specified using the "@" prefix.

+ +

The valid-user keyword specifies that any +authenticated user may access the resource.

+ +

The default is to do no authentication. This directive must +appear inside a Location or +Limit section.

+ + +

RIPCache

+ +

Examples

+ +
+RIPCache 128m
+RIPCache 1g
+RIPCache 2048k
+
+ +

Description

+ +

The RIPCache directive sets the size of the +memory cache used by Raster Image Processor ("RIP") filters such +as imagetoraster and pstoraster. The +size can be suffixed with a "k" for kilobytes, "m" for megabytes, +or "g" for gigabytes. The default cache size is "128m", or 128 +megabytes.

+ + +

CUPS 1.1.16RootCertDuration

+ +

Examples

+ +
+RootCertDuration 0
+RootCertDuration 300
+
+ +

Description

+ +

The RootCertDuration directive specifies the +number of seconds the root certificate remains valid. +The scheduler will generate a new certificate as needed when the +number of seconds has expired. If set to 0, the root certificate +is generated only once on startup or on a restart. The default is +300 seconds.

+ + +

CUPS 1.1.7Satisfy

+ +

Examples

+ +
+<Location /path>
+  ...
+  Satisfy all
+  Satisfy any
+</Location>
+
+ +

Description

+ +

The Satisfy directive specifies whether all +conditions must be satisfied to allow access to the resource. If +set to all, then all authentication and access +control conditions must be satisfied to allow access.

+ +

Setting Satisfy to any allows a user +to gain access if the authentication or access control +requirements are satisfied. For example, you might require +authentication for remote access, but allow local access without +authentication.

+ +

The default is all. This directive must appear +inside a Location or Limit section.

+ + +

ServerAdmin

+ +

Examples

+ +
+ServerAdmin user@host
+ServerAdmin root@foo.bar.com
+
+ +

Description

+ +

The ServerAdmin directive identifies the email +address for the administrator on the system. By default the +administrator email address is root@server, where +server is the ServerName.

+ + +

CUPS 1.3.10ServerAlias

+ +

Examples

+ +
+ServerAlias althost
+ServerAlias foo.example.com
+ServerAlias bar.example.com
+ServerAlias one.example.com two.example.com
+ServerAlias *
+
+ +

Description

+ +

The ServerAlias directive specifies alternate names that the server is known by. By default it contains a list of all aliases associated with the ServerName. The special name "*" can be used to allow any hostname when accessing CUPS via an external network interfaces.

+ +
Note + +

The ServerAlias directive is used for HTTP Host header +validation when clients connect to the scheduler from external interfaces. +Using the special name "*" can expose your system to known browser-based +DNS rebinding attacks, even when accessing sites through a firewall. If the +auto-discovery of alternate names does not work, we recommend listing each +alternate name with a ServerAlias directive instead of using "*".

+ +
+ + +

ServerBin

+ +

Examples

+ +
+ServerBin /usr/lib/cups
+ServerBin /foo/bar/lib/cups
+
+ +

Description

+ +

The ServerBin directive sets the directory for +server-run executables. If an absolute path is not provided then +it is assumed to be relative to the ServerRoot directory. The +default executable directory is /usr/lib/cups, +/usr/lib32/cups, or /usr/libexec/cups +depending on the operating system.

+ + +

ServerCertificate

+ +

Examples

+ +
+ServerCertificate /etc/cups/ssl/server.crt
+
+ +

Description

+ +

The ServerCertificate directive specifies the +location of the SSL certificate file used by the server when +negotiating encrypted connections. The certificate must not be +encrypted (password protected) since the scheduler normally runs +in the background and will be unable to ask for a password.

+ +

The default certificate file is +/etc/cups/ssl/server.crt.

+ + +

ServerKey

+ +

Examples

+ +
+ServerKey /etc/cups/ssl/server.key
+
+ +

Description

+ +

The ServerKey directive specifies the location of +the SSL private key file used by the server when negotiating +encrypted connections.

+ +

The default key file is +/etc/cups/ssl/server.crt.

+ + +

ServerName

+ +

Examples

+ +
+ServerName foo.example.com
+ServerName myserver.example.com
+
+ +

Description

+ +

The ServerName directive specifies the hostname +that is reported to clients. By default the server name is the +hostname.

+ + +

ServerRoot

+ +

Examples

+ +
+ServerRoot /etc/cups
+ServerRoot /foo/bar/cups
+
+ +

Description

+ +

The ServerRoot directive specifies the absolute +path to the server configuration and state files. It is also used +to resolve relative paths in the cupsd.conf file. The +default server directory is /etc/cups.

+ + +

CUPS 1.1.21ServerTokens

+ +

Examples

+ +
+ServerTokens None
+ServerTokens ProductOnly
+ServerTokens Major
+ServerTokens Minor
+ServerTokens Minimal
+ServerTokens OS
+ServerTokens Full
+
+ +

Description

+ +

The ServerTokens directive specifies the +information that is included in the Server: header +of all HTTP responses. Table 4 lists the token name along with +the text that is returned. The default is +Minimal.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4: ServerToken Names and Values
NameValue
NoneNo Server: header is returned
ProductOnly"CUPS"
Major"CUPS 1"
Minor"CUPS 1.2"
Minimal"CUPS 1.2.N" where N is the patch release
OS"CUPS 1.2.N (UNAME)" where N is the patch release and + UNAME is the output of the uname(1) command
Full"CUPS 1.2.N (UNAME) IPP/1.1" where N is the patch + release and UNAME is the output of the uname(1) + command
+ + +

CUPS 1.2/Mac OS X 10.5SetEnv

+ +

Examples

+ +
+SetEnv PATH /usr/lib/cups/filter:/bin:/usr/bin:/usr/local/bin
+SetEnv MY_ENV_VAR foo
+
+ +

Description

+ +

The SetEnv directive specifies an environment +variable that should be passed to child processes.

+ + +

SSLListen

+ +

Examples

+ +
+SSLListen 127.0.0.1:443
+SSLListen 192.0.2.1:443
+
+ +

Description

+ +

The SSLListen directive specifies a network +address and port to listen for secure connections. Multiple +SSLListen directives can be provided to listen on +multiple addresses.

+ +

The SSLListen directive is similar to the SSLPort directive but allows you +to restrict access to specific interfaces or networks.

+ + +

SSLOptions

+ +

Examples

+ +
+SSLOptions None
+SSLOptions NoEmptyFragments
+
+ +

Description

+ +

The SSLOptions directive specifies additional SSL/TLS +protocol options to use for encrypted connected. Currently only two +options are supported - None (the default) for the most +secure mode and NoEmptyFragments to allow CUPS to work with +Microsoft Windows with the FIPS conformance mode enabled.

+ + +

SSLPort

+ +

Examples

+ +
+SSLPort 443
+
+ +

Description

+ +

The SSLPort directive specifies a port to listen +on for secure connections. Multiple SSLPort lines +can be specified to listen on multiple ports.

+ + +

CUPS 1.5SubscriptionPrivateAccess

+ +

Examples

+ +
+SubscriptionPrivateAccess all
+SubscriptionPrivateAccess default
+SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+
+
+ +

Description

+ +

The SubscriptionPrivateAccess directive specifies the access list for a +subscription's private values. The "default" access list is "@OWNER @SYSTEM". +"@ACL" maps to the printer's requesting-user-name-allowed or +requesting-user-name-denied values.

+ +

The SubscriptionPrivateAccess directive must appear inside a Policy section.

+ + +

CUPS 1.5SubscriptionPrivateValues

+ +

Examples

+ +
+SubscriptionPrivateValues all
+SubscriptionPrivateValues default
+SubscriptionPrivateValues none
+SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ]
+
+ +

Description

+ +

The SubscriptionPrivateValues directive specifies the list of +subscription values to make private. The "default" values are "notify-events", +"notify-pull-method", "notify-recipient-uri", "notify-subscriber-user-name", and +"notify-user-data".

+ +

The SubscriptionPrivateValues directive must appear inside a Policy section.

+ + +

SystemGroup

+ +

Examples

+ +
+SystemGroup lpadmin
+SystemGroup sys
+SystemGroup system
+SystemGroup root
+SystemGroup root lpadmin
+
+ +

Description

+ +

The SystemGroup directive specifies the system +administration group for System authentication. +Multiple groups can be listed, separated with spaces. The default +group list is @CUPS_SYSTEM_GROUPS@.

+ + +

TempDir

+ +

Examples

+ +
+TempDir /var/tmp
+TempDir /foo/bar/tmp
+
+ +

Description

+ +

The TempDir directive specifies an absolute path +for the directory to use for temporary files. The default +directory is @CUPS_REQUESTS@/tmp.

+ +

Temporary directories must be world-writable and should have +the "sticky" permission bit enabled so that other users cannot +delete filter temporary files. The following commands will create +an appropriate temporary directory called +/foo/bar/tmp:

+ +
+mkdir /foo/bar/tmp
+chmod a+rwxt /foo/bar/tmp
+
+ + +

Timeout

+ +

Examples

+ +
+Timeout 300
+Timeout 90
+
+ +

Description

+ +

The Timeout directive controls the amount of time +to wait before an active HTTP or IPP request times out. The +default timeout is 300 seconds.

+ + +

CUPS 1.2/Mac OS X 10.5UseNetworkDefault

+ +

Examples

+ +
+UseNetworkDefault yes
+UseNetworkDefault no
+
+ +

Description

+ +

The UseNetworkDefault directive controls whether +the client will use a network/remote printer as a default +printer. If enabled, the default printer of a server is used as +the default printer on a client. When multiple servers are +advertising a default printer, the client's default printer is +set to the first discovered printer, or to the implicit class for +the same printer available from multiple servers.

+ +

The default is @CUPS_USE_NETWORK_DEFAULT@.

+ + +

User

+ +

Examples

+ +
+User lp
+User guest
+
+ +

Description

+ +

The User directive specifies the UNIX user that +filter and CGI programs run as. The default user is +@CUPS_USER@.

+ +
Note: + +

You may not use user root, as that would expose +the system to unacceptable security risks. The scheduler will +automatically choose user nobody if you specify a +user whose ID is 0.

+ +
+ + +

CUPS 1.5WebInterface

+ +

Examples

+ +
+WebInterface yes
+WebInterface no
+
+ +

Description

+ +

The WebInterface directive specifies whether the web interface is enabled. The default value is @CUPS_WEBIF@.

+ + + diff --git a/doc/help/ref-error_log.html b/doc/help/ref-error_log.html new file mode 100644 index 0000000..0109278 --- /dev/null +++ b/doc/help/ref-error_log.html @@ -0,0 +1,55 @@ + + + + error_log + + + + +

error_log

+ +

The error_log file lists messages from the +scheduler - errors, warnings, etc. The LogLevel +directive controls which messages are logged:

+ +

+ +level date-time message
+ +
+ +I [20/May/1999:19:18:28 +0000] Job 1 queued on 'DeskJet' by 'mike'.
+ +I [20/May/1999:19:21:02 +0000] Job 2 queued on 'DeskJet' by 'mike'.
+ +I [20/May/1999:19:22:24 +0000] Job 2 was cancelled by 'mike'.
+ +

+ +

The level field contains the type of message:

+ +
    + +
  • A - Alert message (LogLevel alert) +
  • C - Critical error message (LogLevel crit) +
  • D - Debugging message (LogLevel debug) +
  • d - Detailed debugging message (LogLevel debug2) +
  • E - Normal error message (LogLevel error) +
  • I - Informational message (LogLevel info) +
  • N - Notice message (LogLevel notice) +
  • W - Warning message (LogLevel warn) +
  • X - Emergency error message (LogLevel emerg) + +
+ +

The date-time field contains the date and time of when +the page started printing. The format of this field is identical +to the data-time field in the access_log file.

+ +

The message fields contains a free-form textual +message. Messages from job filters are prefixed with "[Job +NNN]".

+ + + diff --git a/doc/help/ref-mailto-conf.html b/doc/help/ref-mailto-conf.html new file mode 100644 index 0000000..0b95132 --- /dev/null +++ b/doc/help/ref-mailto-conf.html @@ -0,0 +1,108 @@ + + + + mailto.conf + + + + +

mailto.conf

+ +

The /etc/cups/mailto.conf file contains several +directives that defines the local mail server and email +notification preferences for CUPS. Each directive is listed on a +line by itself followed by its value. Comments are introduced +using the number sign ("#") character at the beginning of a +line.

+ + +

Cc

+ +

Examples

+ +
+Cc bigbrother@example.com
+Cc John Doe <jd@example.com>
+
+ +

Description

+ +

The Cc directive specifies an additional +recipient ("carbon copy") for all email notifications. The +default is to not send a copy to anyone but the subscriber.

+ + +

From

+ +

Examples

+ +
+From printserver@example.com
+From Your Happy Printer <printserver@example.com>
+
+ +

Description

+ +

The From directive specifies the sender of email +notifications. The default is the ServerAdmin +address defined in the cupsd.conf file.

+ + +

Sendmail

+ +

Examples

+ +
+Sendmail /usr/sbin/sendmail
+Sendmail /usr/lib/sendmail -bm -i
+
+ +

Description

+ +

The Sendmail directive specifies the command to +run to deliver an email locally. This directive cannot be used +with the SMTPServer directive, and if both +Sendmail and SMTPServer lines appear in the +mailto.conf file, only the last line is used. The +default is /usr/sbin/sendmail.

+ + +

SMTPServer

+ +

Examples

+ +
+SMTPServer mail.example.com
+SMTPServer 192.168.2.1
+
+ +

Description

+ +

The SMTPServer directive specifies a hostname or +IP address of a (possibly remote) SMTP mail server. This +directive cannot be used with the Sendmail directive, +and if both Sendmail and SMTPServer lines +appear in the mailto.conf file, only the last line is +used. The default is to use the Sendmail command +instead.

+ + +

Subject

+ +

Examples

+ +
+Subject [CUPS]
+Subject URGENT EMAIL NOTIFICATION
+
+ +

Description

+ +

The Subject directive specifies a prefix string to +add to the subject of each email notification. The default is to +not add a prefix string.

+ + + + diff --git a/doc/help/ref-page_log.html b/doc/help/ref-page_log.html new file mode 100644 index 0000000..46453eb --- /dev/null +++ b/doc/help/ref-page_log.html @@ -0,0 +1,77 @@ + + + + page_log + + + + +

page_log

+ +

The page_log file lists each page that is sent to a +printer. By default, each line contains the following information:

+ +

+ +printer user job-id date-time page-number num-copies job-billing job-originating-host-name job-name media sides
+ +
+ +DeskJet root 2 [20/May/1999:19:21:05 +0000] 1 1 acme-123 localhost myjob letter one-sided
+ +DeskJet root 2 [20/May/1999:19:21:05 +0000] 2 1 acme-123 localhost myjob letter one-sided
+ +

+ +

The PageLogFormat +directive can be used to change this information.

+ +

The printer field contains the name of the printer that +printed the page. If you send a job to a printer class, this +field will contain the name of the printer that was assigned the +job.

+ +

The user field contains the name of the user (the IPP +requesting-user-name attribute) that submitted this +file for printing.

+ +

The job-id field contains the job number of the page +being printed. Job numbers are reset to 1 whenever the spool +directory (/var/spool/cups) is cleared, so don't +depend on this number being unique!

+ +

The date-time field contains the date and time of when +the page started printing. The format of this field is identical +to the data-time field in the access_log +file.

+ +

The page-number and num-copies fields contain the +page number and number of copies being printed of that page. For +printers that cannot produce copies on their own, the +num-copies field will always be 1.

+ +

The job-billing field contains a copy of the +job-billing attribute provided with the IPP +Create-Job or Print-Job requests or "-" +if none was provided. + +

The job-originating-host-name field contains the hostname or IP +address of the client that printed the job.

+ +

The job-name field contains a copy of the +job-name attribute provided with the IPP +Create-Job or Print-Job requests or "-" +if none was provided. + +

The media field contains a copy of the +media attribute provided with the IPP +Create-Job or Print-Job requests or "-" +if none was provided. + +

The sides field contains a copy of the +sides attribute provided with the IPP +Create-Job or Print-Job requests or "-" +if none was provided. + + + diff --git a/doc/help/ref-ppdcfile.html b/doc/help/ref-ppdcfile.html new file mode 100644 index 0000000..c3967f1 --- /dev/null +++ b/doc/help/ref-ppdcfile.html @@ -0,0 +1,2449 @@ + + + + PPD Compiler Driver Information File Reference + + + + +

PPD Compiler Driver Information File Reference

+ +

The CUPS PPD compiler reads meta files that contain descriptions +of one or more PPD files to be generated by +ppdc(1) or the corresponding driver interface +program drv(1). The source file format is plain +ASCII text that can be edited using your favorite text editor.

+ +

Directives may be placed anywhere on a line and are followed by +zero or more values.

+ +

Comments are supported using the C (/* ... */) and C++ (// ...) comment +mechanisms.

+ +

Directives that accept expressions look for sequences of the form:

+ +
+ +
NAME
+
Evaluates to 1 if NAME is defined, otherwise 0.
+ +
number
+ +
Evaluates to the specified integer; the number can be preceded by + a leading sign (+/-) followed by a decimal number (1234), octal number + (01234), or hexadecimal number (0x1234) using the same rules as C and + C++.
+ +
(NAME NAME ... number number ...)
+
Evaluates to the bitwise OR of each named #define constant or + number.
+ +
(NAME == OTHERNAME)
+
(NAME == number)
+
Evaluates to 1 if NAME is equal to the other named constant or + number, otherwise 0.
+ +
(NAME != OTHERNAME)
+
(NAME != number)
+
Evaluates to 1 if NAME is not equal to the other named constant or + number, otherwise 0.
+ +
(NAME < OTHERNAME)
+
(NAME < number)
+
Evaluates to 1 if NAME is less than to the other named constant or + number, otherwise 0.
+ +
(NAME <= OTHERNAME)
+
(NAME <= number)
+
Evaluates to 1 if NAME is less than or equal to the other named + constant or number, otherwise 0.
+ +
(NAME > OTHERNAME)
+
(NAME > number)
+
Evaluates to 1 if NAME is greater than to the other named constant + or number, otherwise 0.
+ +
(NAME >= OTHERNAME)
+
(NAME >= number)
+
Evaluates to 1 if NAME is greater than or equal to the other named + constant or number, otherwise 0.
+ +
+ +

Printer driver information can be grouped and shared using +curly braces ({ ... }); PPD files are written when a close +brace or end-of-file is seen and a PCFileName +directive has been defined.

+ + +

#define

+ +

Syntax

+ +
+#define name expression
+
+ +

Examples

+ +
+#define FOO 100
+#define BAR "Bar, Inc."
+
+ +

Description

+ +

The #define directive assigns a value to a name +which can be later referenced using $name. The name is +case-insensitive and can be any sequence of letters, numbers, +and the underscore. The value can be any valid expression.

+ +

Predefined Names

+ +

The following #define names are set by the PPD compiler:

+ +
    + +
  • CUPS_VERSION - The full CUPS version string, e.g. + "1.4.0"
  • + +
  • CUPS_VERSION_MAJOR - The major version number, e.g. + "1"
  • + +
  • CUPS_VERSION_MINOR - The minor version number, e.g. + "4"
  • + +
  • CUPS_VERSION_PATCH - The patch version number, e.g. + "0"
  • + +
  • PLATFORM_NAME - The operating system name used by the + current system as reported by "uname" ("Windows" on Microsoft + Windows)
  • + +
  • PLATFORM_ARCH - The processor architecture used by the + current system as reported by "uname -m" ("X86" or "X64" on Microsoft + Windows)
  • + +
+ +

See Also

+ +

#include

+ + +

#elif

+ +

Syntax

+ +
+#elif expression
+
+ +

Examples

+ +
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif 
+
+ +

Description

+ +

The #elif directive allows portions of a driver information file +to be used conditionally. #elif directives must appear after a +corresponding #if directive.

+ +

See Also

+ +

#else, +#endif, +#if

+ + +

#else

+ +

Syntax

+ +
+#else
+
+ +

Examples

+ +
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif 
+
+ +

Description

+ +

The #else directive allows portions of a driver information file +to be used conditionally when the corresponding +#if and #elif +expressions are non-zero.

+ +

See Also

+ +

#elif, +#endif, +#if

+ + +

#endif

+ +

Syntax

+ +
+#endif
+
+ +

Examples

+ +
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif 
+
+ +

Description

+ +

The #endif directive ends a conditional block of a driver +information file. It must appear after all of the +#if, #elif, +and #else directives for the current +conditional block.

+ +

See Also

+ +

#elif, +#else, +#if

+ + +

#font

+ +

Syntax

+ +
+#font name encoding "version" charset status
+
+ +

Examples

+ +
+#font Courier Standard "(1.05)" Standard ROM
+#font Symbol Special "(001.005)" Special ROM
+#font Barcode-Foo Special "(1.0)" Special Disk
+#font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM
+
+ +

Description

+ +

The #font directive defines a "base font" for all +printer drivers. The name is the PostScript font name.

+ +

The encoding is the default encoding of the font, usually +Standard, Expert, or Special, as +defined in the Adobe PPD file specification.

+ +

The version is the PostScript string definition that +corresponds to the font version number.

+ +

The charset defines the available characters in the font, +usually Standard or Special, as defined in the +Adobe PPD file specification.

+ +

The status is the installation status of the font and must be +either the word ROM or Disk. + +

Base fonts differ from fonts defined using the Font directive in that they are not +automatically associated with all drivers - you must use the +special Font * directive to include them in a +driver.

+ +

Currently the #font directive is used mainly for +defining the standard raster fonts in the +<font.defs> include file.

+ +

See Also

+ +

#include, +Font

+ + +

#if

+ +

Syntax

+ +
+#if name or expression
+
+ +

Examples

+ +
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif 
+
+ +

Description

+ +

The #if directive allows portions of a driver information file +to be used conditionally. When followed by a name, the data that follows is +used only when the name is defined, otherwise the data is ignored. +#if directives can be nested up to 100 times.

+ +

See Also

+ +

#elif, +#else, +#endif

+ + +

#include

+ +

Syntax

+ +
+#include <filename>
+#include "filename"
+
+ +

Examples

+ +
+#include <font.defs>
+#include "myfile.h"
+
+ +

Description

+ +

The #include directive reads the named driver +information file. If the filename is included inside angle +brackets (<filename>), then the PPD compiler will +look for the file in all of the include directories it knows +about. Otherwise, the file is opened in the current directory +relative to the current driver information file, and if that +fails then it looks in the include directories for the file.

+ +

The #include directive can be nested to as many +files as are allowed by the host operating system, typically at +least 100 files.

+ +

See Also

+ +

#define, +#font, +#media

+ + +

#media

+ +

Syntax

+ +
+#media name width length
+#media "name/text" width length
+
+ +

Examples

+ +
+#media "Letter/Letter - 8.5x11in" 8.5in 11in
+#media "A4/A4 - 210x297mm" 210mm 297mm
+#media "w936h1368/Super B/A3 - 13x19in" 936 1368
+#media Photo 4in 6in
+
+ +

Description

+ +

The #media directive defines a named media size for +inclusion in a driver. The name with optional user text defines +the name for the media size and is used with the MediaSize directive to associate +the media size with the driver. The name may contain up to 40 ASCII +characters within the range of decimal 33 to decimal 126 inclusive, +except for the characters comma (44), slash (47) and colon (58). +The user text, if supplied, may not exceed 80 bytes in length.

+ +

The width and length define the dimensions of the media. Each +number is optionally followed by one of the following unit +suffixes:

+ +
    + +
  • cm - centimeters
  • + +
  • ft - feet
  • + +
  • in - inches
  • + +
  • m - meters
  • + +
  • mm - millimeters
  • + +
  • pt - points (72 points = 1 inch)
  • + +
+ +

Points are assumed if no units are specified. + +

See Also

+ +

#include, +CustomMedia, +MediaSize

+ + +

#po

+ +

Syntax

+ +
+#po locale filename
+
+ +

Examples

+ +
+#po es "es.po"
+#po fr_CA "mydriver-fr_CA.po"
+
+ +

Description

+ +

The #po directive defines a message catalog to use for the +given POSIX language abbreviation. Multiple #po directives can be +specified to list multiple catalogs. The filename can be an absolute path or +relative to the driver information file. GNU gettext and Mac OS X .strings +files are supported.

+ + +

Attribute

+ +

Syntax

+ +
+Attribute name "" value
+Attribute name keyword value
+Attribute name "keyword/text" value
+
+ +

Examples

+ +
+Attribute cupsInkChannels "" 1
+Attribute cupsAllDither 600dpi "1.0"
+Attribute fooProfile "Photo/Photographic Profile" "photopro.icc"
+
+ +

Description

+ +

The Attribute directive creates a PPD attribute. The +name may contain up to 40 ASCII characters within the range of decimal +33 to decimal 126 inclusive, except for the characters comma (44), +slash (47) and colon (58).

+ +

The selector can be the empty string ("") or text of up +to 80 bytes.

+ +

The value is any string or number; the string may contain multiple +lines, however no one line may exceed 255 bytes.

+ +

See Also

+ +

LocAttribute

+ + +

Choice

+ +

Syntax

+ +
+Choice name "code"
+Choice "name/text" "code"
+
+ +

Examples

+ +
+Choice None "<</MediaType (None)>>setpagedevice"
+Choice "False/No" "<</cupsCompression 0>>setpagedevice"
+
+ +

Description

+ +

The Choice directive adds a single choice to the +current option. The name may contain up to 40 ASCII characters within +the range of decimal 33 to decimal 126 inclusive, except for the +characters comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes +in length. If no text is provided, the name is used.

+ +

The code is any string and may contain multiple lines, +however no one line may exceed 255 bytes.

+ +

See Also

+ +

ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

ColorDevice

+ +

Syntax

+ +
+ColorDevice boolean-value
+
+ +

Examples

+ +
+ColorDevice no
+ColorDevice yes
+
+ +

Description

+ +

The ColorDevice directive tells the application if +the printer supports color. It is typically used in conjunction +with the ColorModel directive +to provide color printing support.

+ +

See Also

+ +

ColorModel

+ + +

DeprecatedColorModel

+ +

Syntax

+ +
+ColorModel name colorspace colororder compression
+ColorModel "name/text" colorspace colororder compression
+
+ +

Examples

+ +
+ColorModel Gray/Grayscale w chunky 0
+ColorModel RGB/Color rgb chunky 0
+ColorModel CMYK cmyk chunky 0
+
+ +

Description

+ +

The ColorModel directive is a convenience directive +which creates a ColorModel option and choice for the current +printer driver. The name may contain up to 40 ASCII characters within +the range of decimal 33 to decimal 126 inclusive, except for the +characters comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

The colorspace argument is one of the standard colorspace +keywords defined later in this appendix in the section titled, +"Colorspace Keywords".

+ +

The colororder argument is one of the standard color order +keywords defined later in this appendix in the section titled, +"Color Order Keywords".

+ +

The compression argument is any number and is assigned to the +cupsCompression attribute in the PostScript page device +dictionary.

+ +

See Also

+ +

Choice, +ColorDevice, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

DeprecatedColorProfile

+ +

Syntax

+ +
+ColorProfile resolution/mediatype gamma density matrix
+
+ +

Examples

+ +
+ColorProfile -/- 1.7 1.0
+     1.0    0.0    0.0
+     0.0    1.0    0.0
+     0.0    0.0    1.0
+
+ColorProfile 360dpi/- 1.6 1.0
+     1.0   -0.05  -0.3
+    -0.35   1.0   -0.15
+    -0.095 -0.238  0.95
+
+ColorProfile 720dpi/Special 1.5 1.0
+     1.0    0.0   -0.38
+    -0.4    1.0    0.0
+     0.0   -0.38   0.9
+
+ +

Description

+ +

The ColorProfile directive defines a CMY +transform-based color profile. The resolution and mediatype +arguments specify the Resolution and MediaType +choices which use the profile; the hyphen (-) is used to +specify that any resolution or mediatype can be used with the +profile.

+ +

The gamma argument specifies the gamma correction to apply to +the color values (P = pg) and is a real number +greater than 0. Values larger than 1 cause a general lightening +of the print while values smaller than 1 cause a general +darkening of the print. A value of 1 disables gamma +correction.

+ +

The density argument specifies the linear density correction +to apply to the color values (P = d * pg) and is a +real number greater than 0 and less than or equal to 1. A value +1 of disables density correction while lower values produce +proportionately lighter output.

+ +

The matrix argument specifies a 3x3 linear transformation +matrix in row-major order. The matrix is applied only to the CMY +component of a RGB to CMYK transformation and is not used when +printing in grayscale or CMYK mode unless the printer only +supports printing with 3 colors.

+ +

See Also

+ +

SimpleColorProfile

+ + +

Copyright

+ +

Syntax

+ +
+Copyright "text"
+
+ +

Examples

+ +
+Copyright "Copyright 2008 by Foo Enterprises"
+
+Copyright
+"This software 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 software 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 software; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA 02111 USA"
+
+ +

Description

+ +

The Copyright directive adds text comments to the +top of a PPD file, typically for use in copyright notices. The +text argument can contain multiple lines of text, but no line +may exceed 255 bytes.

+ + +

CustomMedia

+ +

Syntax

+ +
+CustomMedia name width length left bottom right top
+    "size-code" "region-code"
+
+CustomMedia "name/text" width length left bottom right top
+    "size-code" "region-code"
+
+ +

Examples

+ +
+CustomMedia Letter 8.5in 11in 0.25in 0.46in 0.25in 0.04in
+    "<</PageSize[612 792]/ImagingBBox null/ManualFeed false>>
+     setpagedevice"
+    "<</PageSize[612 792]/ImagingBBox null/ManualFeed true>>
+     setpagedevice"
+
+CustomMedia "A4/A4 - 210x297mm" 210mm 297mm 12 12 12 12
+    "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
+    "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
+
+ +

Description

+ +

The CustomMedia directive adds a custom media size to +the driver. The name may contain up to 40 ASCII characters within the +range of decimal 33 to decimal 126 inclusive, except for the characters +comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

The width and length arguments specify the dimensions of the +media as defined for the #media +directive.

+ +

The left, bottom, right, and top arguments specify the +printable margins of the media.

+ +

The size-code and region-code arguments specify the +PostScript commands to run for the PageSize and +PageRegion options, respectively. The commands can +contain multiple lines, however no line may be more than 255 +bytes in length.

+ +

See Also

+ +

#media, +MediaSize

+ + +

Cutter

+ +

Syntax

+ +
+Cutter boolean-value
+
+ +

Examples

+ +
+Cutter yes
+Cutter no
+
+ +

Description

+ +

The Cutter directive specifies whether the printer +has a built-in media cutter. When a cutter is present, the +printer's PPD file will contain a CutMedia option that +allows the user to control whether the media is cut at the end +of the job.

+ +

See Also

+ +

Choice, +ColorModel, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

DeprecatedDarkness

+ +

Syntax

+ +
+Darkness temperature name
+Darkness temperature "name/text"
+
+ +

Examples

+ +
+Darkness 0 Light
+Darkness 2 "Normal/Standard"
+
+ +

Description

+ +

The Darkness directive defines a choice for the +cupsDarkness option which sets the +cupsCompression attribute in the PostScript page device +dictionary. It is used with the CUPS rastertolabel +sample driver to control the print head temperature and +therefore the darkness of the print.

+ +

The temperature argument specifies a temperature value for +the Dymo driver from 0 (lowest) to 3 (highest), with 2 +representing the normal setting.

+ +

The name may contain up to 40 ASCII characters within the range of +decimal 33 to decimal 126 inclusive, except for the characters comma +(44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

DriverType

+ +

Syntax

+ +
+DriverType type
+
+ +

Examples

+ +
+DriverType custom
+DriverType escp
+DriverType pcl
+DriverType ps
+
+ +

Description

+ +

The DriverType directive tells the PPD compiler +which DDK filters to include in the PPD file. The following +types are supported:

+ +
    + +
  • custom - Use only those filters that are + defined in the driver information file
  • + +
  • epson - Use the CUPS sample Epson driver filter + rastertoepson
  • + +
  • escp - Use the ESC/P DDK driver filters + commandtoescpx and + rastertoescpx
  • + +
  • hp - Use the CUPS sample HP driver filter + rastertohp
  • + +
  • label - Use the CUPS sample label driver filter rastertolabel
  • + +
  • pcl - Use the HP-PCL DDK driver filters + commandtopclx and + rastertopclx
  • + +
  • ps - Use no filters; this driver is for a + standard PostScript device
  • + +
+ +

See Also

+ +

Filter, +ModelNumber

+ + +

Duplex

+ +

Syntax

+ +
+Duplex type
+
+ +

Examples

+ +
+Duplex none
+Duplex normal
+Duplex flip
+Duplex rotated
+Duplex manualtumble
+
+ +

Description

+ +

The Duplex directive determines whether double-sided printing +is supported in the current driver. The type argument specifies the type +of duplexing that is supported:

+ +
    + +
  • none - double-sided printing is not + supported
  • + +
  • normal - double-sided printing is + supported
  • + +
  • flip - double-sided printing is supported, + but the back side image needs to be flipped vertically + (used primarily with inkjet printers)
  • + +
  • rotated - double-sided printing is supported, + but the back side image needs to be rotated 180 degrees for + DuplexNoTumble
  • + +
  • manualtumble - double-sided printing is supported, + but the back side image needs to be rotated 180 degrees for + DuplexTumble
  • + +
+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

FileName

+ +

Syntax

+ +
+FileName "filename"
+
+ +

Examples

+ +
+FileName "Acme Laser Printer 2000"
+FileName "Acme Ink Waster 1000"
+
+ +

Description

+ +

The FileName attribute specifies the "long" name of the +PPD file for the current driver.

+ +

See Also

+ +

Manufacturer, +ModelName, +PCFileName, +Version

+ + +

Filter

+ +

Syntax

+ +
+Filter mime-type cost program
+
+ +

Examples

+ +
+Filter application/vnd.cups-raster 50 rastertofoo
+Filter application/vnd.hp-HPGL 25 /usr/foo/filter/hpgltofoo
+
+ +

Description

+ +

The Filter directive adds a filter for the current +driver. The mime-type argument is a valid MIME media type name +as defined in a CUPS mime.types file.

+ +

The cost argument specifies the relative cost of the filter. +In general, use a number representing the average percentage of +CPU time that is used when printing the specified MIME media +type.

+ +

The program argument specifies the program to run; if the +program is not an absolute filename, then CUPS will look for the +program in the CUPS filter directory.

+ +

See Also

+ +

DriverType

+ + +

DeprecatedFinishing

+ +

Syntax

+ +
+Finishing name
+Finishing "name/text"
+
+ +

Examples

+ +
+Finishing None
+Finishing "Glossy/Photo Overcoat"
+
+ +

Description

+ +

The Finishing directive adds a choice to the +cupsFinishing option. The name may contain up to 40 ASCII +characters within the range of decimal 33 to decimal 126 inclusive, +except for the characters comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

The name is stored in the OutputType attribute in the +PostScript page device dictionary.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

Font

+ +

Syntax

+ +
+Font name encoding "version" charset status
+Font *
+
+ +

Examples

+ +
+Font *
+Font Courier Standard "(1.05)" Standard ROM
+Font Symbol Special "(001.005)" Special ROM
+Font Barcode-Foo Special "(1.0)" Special Disk
+Font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM
+
+ +

Description

+ +

The Font directive defines a "device font" for the +current printer driver. The name is the PostScript font name.

+ +

The encoding is the default encoding of the font, usually +Standard, Expert, or Special, as +defined in the Adobe PPD file specification.

+ +

The version is the PostScript string definition that +corresponds to the font version number.

+ +

The charset defines the available characters in the font, +usually Standard or Special, as defined in the +Adobe PPD file specification.

+ +

The status is the installation status of the font and must be +either the word ROM or Disk.

+ +

Device fonts differ from fonts defined using the #font directive in that they are +automatically associated with the current driver. Fonts defined +using #font may be imported into the current driver +using the Font * form of this directive.

+ +

See Also

+ +

#font

+ + +

Group

+ +

Syntax

+ +
+Group name
+Group "name/text"
+
+ +

Examples

+ +
+Group General
+Group "InstallableOptions/Options Installed"
+Group "Special/Vendor Options"
+
+ +

Description

+ +

The Group directive specifies the group for new +Option directives. The name may contain up to 40 ASCII +characters within the range of decimal 33 to decimal 126 inclusive, +except for the characters comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 40 bytes in length. +If no text is provided, the name is used.

+ +

The names General and InstallableOptions +are predefined for the standard Adobe UI keywords and for installable +options, respectively.

+ +
+ + + +
Note: + +

Because of certain API binary compatibility issues, + CUPS limits the length of PPD group translation strings + (text) to 40 bytes, while the PPD specification + allows for up to 80 bytes.

+ +
+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +InputSlot, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

HWMargins

+ +

Syntax

+ +
+HWMargins left bottom right top
+
+ +

Examples

+ +
+HWMargins 18 36 18 36
+HWMargins 0.25in 0.5in 0.25in 0.5in
+HWMargins 0.6cm 1.2cm 0.6cm 1.2cm
+
+ +

Description

+ +

The HWMargins directive specifies the current +margins for MediaSize that +follow. The left, bottom, right, and top margin values specify +the printable margins.

+ +

See Also

+ +

MediaSize

+ + +

InputSlot

+ +

Syntax

+ +
+InputSlot position name
+InputSlot position "name/text"
+
+ +

Examples

+ +
+InputSlot 0 Auto
+InputSlot 1 "Upper/Tray 1"
+
+ +

Description

+ +

The InputSlot directive adds a new choice to the +InputSlot option. The position argument is a number +from 0 to 232-1 specifying the value that is placed +in the MediaPosition attribute in the PostScript page +device dictionary.

+ +

The name may contain up to 40 ASCII characters within the range of +decimal 33 to decimal 126 inclusive, except for the characters comma +(44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +Installable, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

Installable

+ +

Syntax

+ +
+Installable name
+Installable "name/text"
+
+ +

Examples

+ +
+Installable EnvTray
+Installable "Option1/Duplexer Installed"
+
+ +

Description

+ +

The Installable directive adds a new boolean option +to the InstallableOptions group with a default value of +False. The name may contain up to 40 ASCII characters +within the range of decimal 33 to decimal 126 inclusive, except for +the characters comma (44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ + +

LocAttribute

+ +

Syntax

+ +
+LocAttribute name "keyword/text" value
+
+ +

Examples

+ +
+LocAttribute fooProfile "Photo/Photographic Profile" "photopro.icc"
+
+ +

Description

+ +

The LocAttribute directive creates a localized PPD +attribute. The name may contain up to 40 ASCII characters within the +range of decimal 33 to decimal 126 inclusive, except for the characters +comma (44), slash (47) and colon (58).

+ +

The selector can be the empty string ("") or text of up +to 80 bytes.

+ +

The value is any string or number; the string may contain multiple +lines, however no one line may exceed 255 bytes.

+ +

See Also

+ +

Attribute

+ + +

ManualCopies

+ +

Syntax

+ +
+ManualCopies boolean-value
+
+ +

Examples

+ +
+ManualCopies no
+ManualCopies yes
+
+ +

Description

+ +

The ManualCopies directive specifies whether copies +need to be produced by the RIP filters. The default is +no.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +MediaType, +Option, +Resolution, +UIConstraints

+ + +

Manufacturer

+ +

Syntax

+ +
+Manufacturer "name"
+
+ +

Examples

+ +
+Manufacturer "Foo"
+Manufacturer "HP"
+
+ +

Description

+ +

The Manufacturer directive specifies the +manufacturer name for the current driver. The name argument must +conform to the manufacturer name requirements in the Adobe PPD +file specification.

+ +

See Also

+ +

FileName, +ModelName, +PCFileName, +Version

+ + +

MaxSize

+ +

Syntax

+ +
+MaxSize width length
+
+ +

Examples

+ +
+MaxSize 36in 100ft
+MaxSize 300cm 30m
+
+ +

Description

+ +

The MaxSize directive specifies the maximum width +and length that is supported for custom page sizes.

+ +

See Also

+ +

MinSize, +VariablePaperSize

+ + +

MediaSize

+ +

Syntax

+ +
+MediaSize name
+
+ +

Examples

+ +
+MediaSize Letter
+MediaSize A4
+
+ +

Description

+ +

The MediaSize directive adds the named size to the +current printer driver using the current margins defined with +the HWMargins directive. The +name argument must match a media size defined using the #media directive.

+ +

See Also

+ +

#media, +HWMargins

+ + +

MediaType

+ +

Syntax

+ +
+MediaType type name
+MediaType type "name/text"
+
+ +

Examples

+ +
+MediaType 0 Auto
+MediaType 1 "Plain/Plain Paper"
+
+ +

Description

+ +

The MediaType directive adds a new choice to the +MediaType option. The type argument is a number +from 0 to 232-1 specifying the value that is placed +in the cupsMediaType attribute in the PostScript page +device dictionary.

+ +

The name may contain up to 40 ASCII characters within the range of +decimal 33 to decimal 126 inclusive, except for the characters comma +(44), slash (47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

The name is placed in the MediaType attribute in the +PostScript page device dictionary.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +Option, +Resolution, +UIConstraints

+ + +

MinSize

+ +

Syntax

+ +
+MinSize width length
+
+ +

Examples

+ +
+MinSize 4in 8in
+MinSize 10cm 20cm
+
+ +

Description

+ +

The MinSize directive specifies the minimum width +and length that is supported for custom page sizes.

+ +

See Also

+ +

MaxSize, +VariablePaperSize

+ + +

ModelName

+ +

Syntax

+ +
+ModelName "name"
+
+ +

Examples

+ +
+ModelName "Foo Laser Printer 2000"
+ModelName "Colorific 123"
+
+ +

Description

+ +

The ModelName directive sets the printer name for +the ModelName, NickName, and +ShortNickName attributes for the printer driver. The +name is any string of letters, numbers, spaces, and the +characters ".", "/", "-", and "+" and should not begin with the +manufacturer name since the PPD compiler will add this +automatically for you. The maximum length of the name string is +31 bytes to conform to the Adobe limits on the length of +ShortNickName.

+ +

See Also

+ +

FileName, +Manufacturer, +PCFileName, +Version

+ + +

ModelNumber

+ +

Syntax

+ +
+ModelNumber expression
+
+ +

Examples

+ +
+ModelNumber 123
+ModelNumber ($PCL_PAPER_SIZE $PCL_PJL)
+
+ +

Description

+ +

The ModelNumber directive sets the +cupsModelNumber attribute for the printer driver, which +is often used by the printer driver filter to tailor its output +for the current device. The number is any integer or bitwise OR +of integers and constants that is appropriate for the printer +driver filters.

+ +

A complete list of printer driver model number constants is +available later in this appendix in the section titled, "Printer Driver ModelNumber +Constants".

+ +

See Also

+ +

DriverType, +Filter

+ + +

Option

+ +

Syntax

+ +
+Option name type section order
+Option "name/text" type section order
+
+ +

Examples

+ +
+Option Punch Boolean AnySetup 10
+Option "fooFinish/Finishing Option" PickOne DocumentSetup 10 
+
+ +

Description

+ +

The Option directive creates a new option in the +current group, by default the General group. The name +may contain up to 40 ASCII characters within the range of decimal 33 +to decimal 126 inclusive, except for the characters comma (44), slash +(47) and colon (58).

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

The type argument is one of the following keywords:

+ +
    + +
  • Boolean - a true/false option
  • + +
  • PickOne - allows the user to pick one + choice from a list
  • + +
  • PickMany - allows the user to pick zero or + more choices from a list
  • + +
+ +

The section argument is one of the following keywords:

+ +
    + +
  • AnySetup - The option can be placed in + either the DocumentSetup or PageSetup sections of the + PostScript document
  • + +
  • DocumentSetup - The option must be placed + in the DocumentSetup section of the PostScript document; + this does not allow the option to be overridden on + individual pages
  • + +
  • ExitServer - The option must be placed in a + separate initialization job prior to the document (not + used for raster printer drivers)
  • + +
  • JCLSetup - The option contains job control + language commands and must be sent prior to the document + using the JCLBegin and + JCLToPSInterpreter attributes (not used for + raster printer drivers)
  • + +
  • PageSetup - The option must be placed at the + beginning of each page in the PostScript document
  • + +
  • Prolog - The option must be placed in the + prolog section of the PostScript document; this is + typically used to add special comments for high-end + typesetters, but can also be used to add CUPS PostScript + job ticket comments.
  • + +
+ +

The order argument is a real number greater than or equal to +0.0 and is used to sort the printer commands from many options +before sending them to the printer or RIP filter.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Resolution, +UIConstraints

+ + +

PCFileName

+ +

Syntax

+ +
+PCFileName "filename.ppd"
+
+ +

Examples

+ +
+PCFileName "foljt2k1.ppd"
+PCFileName "deskjet.ppd"
+
+ +

Description

+ +

The PCFileName attribute specifies the name of the +PPD file for the current driver. The filename argument must +conform to the Adobe PPD file specification and can be no more +than 8 filename characters plus the extension ".ppd".

+ +

See Also

+ +

FileName, +Manufacturer, +ModelName, +Version

+ + +

DeprecatedResolution

+ +

Syntax

+ +
+Resolution colorspace bits-per-color row-count row-feed row-step name
+Resolution colorspace bits-per-color row-count row-feed row-step "name/text"
+
+ +

Examples

+ +
+Resolution - 8 0 0 0 300dpi
+Resolution k 8 0 0 0 "600x300dpi/600 DPI Grayscale"
+
+ +

Description

+ +

The Resolution directive creates a new +Resolution option choice which sets the +HWResolution, cupsBitsPerColor, +cupsRowCount, cupsRowFeed, +cupsRowStep, and optionally the cupsColorSpace +page device dictionary attributes. The colorspace argument +specifies a colorspace to use for the specified resolution and +can be the hyphen (-) character to make no change to +the selected color model or any keyword listed in the section +titled, "Colorspace Keywords", to +force the named colorspace.

+ +

The bits-per-color argument specifies the number of bits per +color to generate when RIP'ing a job. The values 1, 2, 4, and 8 +are currently supported by CUPS.

+ +

The row-count, row-feed, and row-step argument specify the +driver-dependent values for the cupsRowCount, +cupsRowFeed, and cupsRowStep attributes, +respectively. Most drivers leave these attributes set to 0, but +any number from 0 to 232-1 is allowed.

+ +

The name argument must conform to the resolution naming +conventions in the Adobe PPD file specification, either +HHHdpi for symmetric resolutions or HHHxVVVdpi +for asymmetric resolutions. The HHH and VVV in +the examples represent the horizontal and vertical resolutions +which must be positive integer values.

+ +

If provided, the text can be any string up to 80 bytes in length. +If no text is provided, the name is used.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +UIConstraints

+ + +

DeprecatedSimpleColorProfile

+ +

Syntax

+ +
+SimpleColorProfile resolution/mediatype density
+    yellow-density red-density gamma
+    red-adjust green-adjust blue-adjust
+
+ +

Examples

+ +
+SimpleColorProfile -/- 100 100 200 1.0 0 0 0
+
+SimpleColorProfile 360dpi/- 100 95 150 1.2 5 10 15
+
+SimpleColorProfile 720dpi/Glossy 100 90 120 1.5 -5 5 10
+
+ +

Description

+ +

The SimpleColorProfile directive creates a +matrix-based ColorProfile. +The resolution and mediatype arguments specify the +Resolution and MediaType choices which use the +profile; the hyphen (-) is used to specify that any +resolution or mediatype can be used with the profile.

+ +

The density argument specifies the linear density correction +to apply to the color values (P = d * 0.01 * pg) and +is an integer greater than 0 and less than or equal to 100. A +value 100 of disables density correction while lower values +produce proportionately lighter output. The density value +adjusts all color channels equally in all color modes.

+ +

The yellow-density argument specifies the density of the +yellow channel when printing in grayscale or RGB mode and is an +integer greater than 0 and less then or equal to 100. A value of +100 disables yellow density correction while lower values +produce proportionately lighter output.

+ +

The red-density argument specifies the two-color density +limit (e.g. C + M, C + Y, M + Y) when printing in grayscale or +RGB mode and is an integer greater than 0 and less then or equal +to 200. A value of 200 disables two-color density correction +while lower values produce proportionately lighter output.

+ +

The gamma argument specifies the gamma correction to apply to +the color values (P = pg) and is a real number +greater than 0. Values larger than 1 cause a general lightening +of the print while values smaller than 1 cause a general +darkening of the print. A value of 1 disables gamma +correction.

+ +

The red-adjust, green-adjust, blue-adjust arguments specify +the percentage of color to add or remove. Positive red-adjust +values add magenta and negative values add yellow. Positive +green-adjust values add cyan and negative values add yellow. +Positive blue-adjust values add cyan and negative values add +magenta. Values of 0 disable color adjustments.

+ +

See Also

+ +

ColorProfile

+ + +

Throughput

+ +

Syntax

+ +
+Throughput pages-per-minute
+
+ +

Examples

+ +
+Throughput 1
+Throughput 10
+
+ +

Description

+ +

The Throughput directive sets the Throughput +attribute for the current printer driver. The pages-per-minute +argument is a positive integer representing the peak number of +pages per minute that the printer is capable of producing. Use a +value of 1 for printers that produce less than 1 page per +minute.

+ + +

UIConstraints

+ +

Syntax

+ +
+UIConstraints "*Option1 *Option2"
+UIConstraints "*Option1 Choice1 *Option2"
+UIConstraints "*Option1 *Option2 Choice2"
+UIConstraints "*Option1 Choice1 *Option2 Choice2"
+
+ +

Examples

+ +
+UIConstraints "*Finishing *MediaType"
+UIConstraints "*Option1 False *Duplex"
+UIConstraints "*Duplex *MediaType Transparency"
+UIConstraints "*Resolution 600dpi *ColorModel RGB"
+
+ +

Description

+ +

The UIConstraints directive adds a constraint +between two options. Constraints inform the application when a +user has chosen incompatible options. Each option name is +preceded by the asterisk (*). If no choice is given for +an option, then all choices except False and +None will conflict with the other option and choice(s). +Since the PPD compiler automatically adds reciprocal constraints +(option A conflicts with option B, so therefore option B +conflicts with option A), you need only specify the constraint +once.

+ +

See Also

+ +

Choice, +ColorModel, +Cutter, +Darkness, +Duplex, +Finishing, +Group, +InputSlot, +Installable, +MediaType, +Option, +Resolution

+ + +

VariablePaperSize

+ +

Syntax

+ +
+VariablePaperSize boolean-value
+
+ +

Examples

+ +
+VariablePaperSize yes
+VariablePaperSize no
+
+ +

Description

+ +

The VariablePaperSize directive specifies whether +the current printer supports variable (custom) page sizes. When +yes is specified, the PPD compiler will include the +standard PPD attributes required to support custom page +sizes.

+ +

See Also

+ +

MaxSize, +MinSize

+ + +

Version

+ +

Syntax

+ +
+Version number
+
+ +

Examples

+ +
+Version 1.0
+Version 3.7
+
+ +

Description

+ +

The Version directive sets the FileVersion +attribute in the PPD file and is also used for the +NickName attribute. The number argument is a positive +real number.

+ +

See Also

+ +

Manufacturer, +ModelName, +PCFileName

+ + +

Standard Include Files

+ +

Table B-1 shows the standard include +files which are provided with the DDK.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table B-1, +Standard Include Files
Include FileDescription
<font.defs>Defines all of the + standard fonts which are included with ESP Ghostscript + and the Apple PDF RIP.
<epson.h>Defines all of the + CUPS ESC/P sample driver constants.
<escp.h>Defines all of the + DDK ESC/P driver constants.
<hp.h>Defines all of the + CUPS HP-PCL sample driver constants.
<label.h>Defines all of the + CUPS label sample driver constants.
<media.defs>Defines all of the + standard media sizes listed in Appendix B of the Adobe + PostScript Printer Description File Format + Specification.
<pcl.h>Defines all of the + DDK HP-PCL driver constants.
<raster.defs>Defines all of the CUPS + raster format constants.
+ +

Printer Driver ModelNumber Constants

+ +

The CUPS DDK and sample drivers use the +cupsModelNumber attribute in the PPD file to tailor +their output to the printer. The following sections describe the +constants for each driver.

+ +

The CUPS ESC/P Sample Driver (epson)

+ +

The epson driver supports Epson and Okidata +dot-matrix, Epson Stylus Color, and Epson Stylus Photo printers. +Table B-2 lists the constants for the ModelNumber directive. +ModelNumber values should be inserted by referencing +only one of these constants.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table B-2, epson driver +constants
ConstantDescription
EPSON_9PINEpson and Okidata 9-pin + dot-matrix printers
EPSON_24PINEpson and Okidata 24-pin + dot-matrix printers
EPSON_COLOROlder Epson Stylus Color + printers that use the ESC . graphics command
EPSON_PHOTOOlder Epson Stylus Photo + printers that use the ESC . graphics command
EPSON_ICOLORNewer Epson Stylus Color + printers that use the ESC i graphics command
EPSON_IPHOTONewer Epson Stylus Photo + printers that use the ESC i graphics command
+ +

The CUPS HP-PCL Sample Driver (hp)

+ +

The hp driver supports HP LaserJet and DeskJet +printers. Table B-3 lists the constants +for the ModelNumber +directive. ModelNumber values should be inserted by +referencing only one of these constants.

+ +
+ + + + + + + + + + + + + + + + + +
Table B-3, hp driver +constants
ConstantDescription
HP_LASERJETHP LaserJet printers supporting + PCL 3, 4, or 5
HP_DESKJETHP DeskJet printers + supporting PCL 3 and using the simple color graphics + command (ESC * r # U)
HP_DESKJET2HP DeskJet printers + supporting PCL3GUI and using the configure raster graphics + command (ESC * g # W)
+ +

The CUPS Label Sample Driver (label)

+ +

The label driver supports the Dymo Labelwriter, Zebra CPCL, Zebra EPL, and Zebra ZPL, and Intellitech PCL label printers. Table B-4 +lists the constants for the ModelNumber directive. +ModelNumber values should be inserted by referencing +only one of these constants.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table B-4, label driver +constants
ConstantDescription
DYMO_3x0Format output for the + Dymo Labelwriter 300, 330, or 330 Turbo.
INTELLITECH_PCLFormat output for the Intellitech PCL printers.
ZEBRA_CPCLFormat output for the Zebra CPCL printers.
ZEBRA_EPL_LINEFormat output for the Zebra EPL line mode (EPL 1) printers.
ZEBRA_EPL_PAGEFormat output for the Zebra EPL page mode (EPL 2) printers.
ZEBRA_ZPLFormat output for the Zebra ZPL printers.
+ +

The DDK ESC/P Driver (escp)

+ +

The escp driver supports all Epson inkjet printers. +Table B-6 lists the constants for the ModelNumber directive. +ModelNumber values should be specified as the bitwise +OR of one or more of these constants.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table B-6, escp driver +constants
ConstantDescription
ESCP_MICROWEAVEUse microweave command?
ESCP_STAGGERAre color jets staggered?
ESCP_ESCKUse print mode command?
ESCP_EXT_UNITSUse extended unit commands?
ESCP_EXT_MARGINSUse extended margin command?
ESCP_USBSend USB packet mode escape
ESCP_PAGE_SIZEUse page size command
ESCP_RASTER_ESCIUse ESC i graphics command
ESCP_REMOTEUse remote mode commands
ESCP_REMOTE_ACUse auto-cutter command
ESCP_REMOTE_COUse cutter-operation command
ESCP_REMOTE_EXUse media-position command
ESCP_REMOTE_MSUse media-size command
ESCP_REMOTE_MTUse media-type command
ESCP_REMOTE_PCUse paper-check command
ESCP_REMOTE_PHUse paper-thickness command
ESCP_REMOTE_PPUse paper-path command
ESCP_REMOTE_SN0Use feed-sequence-0 command
ESCP_REMOTE_SN1Use platten-gap command
ESCP_REMOTE_SN2Use feed-sequence-2 command
ESCP_REMOTE_SN6Use eject-delay command
ESCP_REMOTE_FPUse print-position command
+ +

The DDK HP-PCL Driver (pcl)

+ +

The pcl driver supports all HP LaserJet, DeskJet, +and DesignJet printers. Table B-5 lists +the constants for the ModelNumber directive. +ModelNumber values should be specified as the bitwise +OR of one or more of these constants.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table B-5, pcl driver +constants
ConstantDescription
PCL_PAPER_SIZEUse paper size command (ESC & l # A)
PCL_INKJETUse inkjet commands
PCL_RASTER_END_COLORUse new end-raster command (ESC * r C)
PCL_RASTER_CIDUse configure-image-data command (ESC * v # W)
PCL_RASTER_CRDUse configure-raster-data command (ESC * g # W)
PCL_RASTER_SIMPLEUse simple-raster-color command (ESC * r # U)
PCL_RASTER_RGB24Use 24-bit RGB mode
PCL_PJLUse PJL commands
PCL_PJL_PAPERWIDTHUse PJL PAPERWIDTH/LENGTH commands
PCL_PJL_HPGL2Use PJL ENTER HPGL2 command
PCL_PJL_PCL3GUIUse PJL ENTER PCL3GUI command
PCL_PJL_RESOLUTIONUse PJL SET RESOLUTION command
+ +

Color Keywords

+ +

The PPD compiler defines two types of color keywords: +colorspace and color order. The following sections list the +supported keywords for each type.

+ +

Colorspace Keywords

+ +

The following colorspace keywords are recognized:

+ +
    + +
  • cielab - CIE Lab **
  • + +
  • ciexyz - CIE XYZ **
  • + +
  • cmy - Cyan, magenta, yellow
  • + +
  • cmyk - Cyan, magenta, yellow, black
  • + +
  • gmck - Gold, magenta, yellow, black **
  • + +
  • gmcs - Gold, magenta, yellow, silver **
  • + +
  • gold - Gold foil **
  • + +
  • icc1 - ICC-based, 1 color **
  • + +
  • icc2 - ICC-based, 2 colors **
  • + +
  • icc3 - ICC-based, 3 colors **
  • + +
  • icc4 - ICC-based, 4 colors **
  • + +
  • icc5 - ICC-based, 5 colors **
  • + +
  • icc6 - ICC-based, 6 colors **
  • + +
  • icc7 - ICC-based, 7 colors **
  • + +
  • icc8 - ICC-based, 8 colors **
  • + +
  • icc9 - ICC-based, 9 colors **
  • + +
  • icca - ICC-based, 10 colors **
  • + +
  • iccb - ICC-based, 11 colors **
  • + +
  • iccc - ICC-based, 12 colors **
  • + +
  • iccd - ICC-based, 13 colors **
  • + +
  • icce - ICC-based, 14 colors **
  • + +
  • iccf - ICC-based, 15 colors **
  • + +
  • k - Black
  • + +
  • kcmy - Black, cyan, magenta, yellow *
  • + +
  • kcmycm - Black, cyan, magenta, yellow, light-cyan, light-magenta *
  • + +
  • rgb - Red, green, blue
  • + +
  • rgba - Red, green, blue, alpha
  • + +
  • rgbw - Red, green, blue, luminance *
  • + +
  • silver - Silver foil **
  • + +
  • w - Luminance
  • + +
  • white - White ink (as black) **
  • + +
  • ymc - Yellow, magenta, cyan *
  • + +
  • ymck - Yellow, magenta, cyan, black * + +
      + +
    * = This colorspace is not supported on Mac OS X prior to 10.4. +
    ** = This colorspace is not supported on Mac OS X.
  • + +
+ +

Color Order Keywords

+ +

The following color order keywords are recognized:

+ +
    + +
  • chunked or chunky - Color values + are passed together on a line as RGB RGB RGB RGB
  • + +
  • banded - Color values are passed separately + on a line as RRRR GGGG BBBB *
  • + +
  • planar - Color values are passed separately + on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB + BBBB BBBB * + +
      + +
    * = This color order + is not supported by the current Apple RIP filters and + should not be used when developing printer drivers for + Mac OS X.
  • + +
+ + + diff --git a/doc/help/ref-printers-conf.html b/doc/help/ref-printers-conf.html new file mode 100644 index 0000000..9568fc7 --- /dev/null +++ b/doc/help/ref-printers-conf.html @@ -0,0 +1,720 @@ + + + + printers.conf + + + + +

printers.conf

+ +

The CUPS scheduler (cupsd) uses the +/etc/cups/printers.conf file to store the list of +available printers. This file contains only locally defined +printers, not remote printers that are created automatically via +browsing. Each directive is listed on a line by itself followed +by its value. Comments are introduced using the number sign ("#") +character at the beginning of a line.

+ +

While the printer configuration file consists of plain text +and can be modified using your favorite text editor, you should +normally use the lpadmin(8) +command, web interface, or any of the available GUIs to manage +your printers instead. If you do choose to edit this file +manually, you will need to stop the scheduler first, make your +changes, and then start the scheduler to make them active.

+ + +

Accepting

+ +

Examples

+ +
+<Printer name>
+  ...
+  Accepting yes
+</Printer>
+
+ +

Description

+ +

The Accepting directive defines the initial state +of the printer-is-accepting-jobs attribute. This state +is also set by the cupsaccept(8) and +cupsreject(8) commands:

+ +
+/usr/sbin/cupsaccept printername
+/usr/sbin/cupsreject printername
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

AllowUser

+ +

Examples

+ +
+<Printer name>
+  ...
+  AllowUser foo_user
+  AllowUser @bar_group
+</Printer>
+
+ +

Description

+ +

The AllowUser directive adds a username or group +name to the requesting-user-name-allowed attribute +which can be set by the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -u allow:foo_user,@bar_group
+
+ +

This directive must appear inside a Printer or DefaultPrinter directive. +This directive cannot be used with DenyUser.

+ + +

DefaultPrinter

+ +

Examples

+ +
+<DefaultPrinter name>
+  ...
+</Printer>
+
+ +

Description

+ +

The DefaultPrinter directive begins a printer +definition as the default server destination. The default server +destination can be set using the lpadmin(8) +command:

+ +
+/usr/sbin/lpadmin -d printername
+
+ +

Note that the server default destination settings can be +overridden by the user's default destination settings which are +normally set using the lpoptions(1) command.

+ + +

DenyUser

+ +

Examples

+ +
+<Printer name>
+  ...
+  DenyUser foo_user
+  DenyUser @bar_group
+</Printer>
+
+ +

Description

+ +

The DenyUser directive adds a username or group +name to the requesting-user-name-denied attribute +which can be set by the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -u deny:foo_user,@bar_group
+
+ +

This directive must appear inside a Printer or DefaultPrinter directive. +This directive cannot be used with AllowUser

+ + +

DeviceURI

+ +

Examples

+ +
+<Printer name>
+  ...
+  DeviceURI socket://foo.bar.com:9100
+</Printer>
+
+ +

Description

+ +

The DeviceURI directive defines the value of the +device-uri-attribute attribute. It is normally set +using the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -v device-uri
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2ErrorPolicy

+ +

Examples

+ +
+<Printer name>
+  ...
+  ErrorPolicy abort-job
+</Printer>
+
+ +

Description

+ +

The ErrorPolicy directive defines the policy that +is used when a backend is unable to send a print job to the +printer. The lpadmin(8) command sets the current +error policy:

+ +
+/usr/sbin/lpadmin -p printername -o printer-error-policy=stop-printer
+
+ +

The following values are supported:

+ +
    + +
  • abort-job - Abort the job and proceed + with the next job in the queue
  • + +
  • retry-current-job - Retry the current job + immediately
  • + +
  • retry-job - Retry the job after waiting + for N seconds; the cupsd.conf JobRetryInterval + directive controls the value of N
  • + +
  • stop-printer - Stop the printer and keep + the job for future printing; this is the default + value
  • + +
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.4Filter

+ +

Examples

+ +
+<Printer name>
+  ...
+  Filter mime/type 100 program
+</Printer>
+
+ +

Description

+ +

The Filter directive lists a single filter program as defined +in the printer's PPD file.

+ +

This directive must appear inside a +Printer or +DefaultPrinter section.

+ + +

Info

+ +

Examples

+ +
+<Printer name>
+  ...
+  Info My Printer
+</Printer>
+
+ +

Description

+ +

The Info directive defines the string for the +printer-info attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -D "My Printer"
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

JobSheets

+ +

Examples

+ +
+<Printer name>
+  ...
+  JobSheets none,standard
+</Printer>
+
+ +

Description

+ +

The JobSheets directive specifies the default +banner pages to print before and after a print job. In the above +example, only a standard banner will print after each +job. The lpadmin(8) command is normally used to set +the default banners: + +

+/usr/sbin/lpadmin -p printername -o job-sheets-default=none,standard
+
+ +

If only one banner file is specified, it will be printed +before the files in the job. If a second banner file is +specified, it is printed after the files in the job.

+ +

The available banner pages depend on the local system +configuration; CUPS includes the following standard banner +files:

+ +
    + +
  • none - Do not produce a banner + page.
  • + +
  • classified - A banner page with a + "classified" label at the top and bottom.
  • + +
  • confidential - A banner page with a + "confidential" label at the top and bottom.
  • + +
  • secret - A banner page with a + "secret" label at the top and bottom.
  • + +
  • standard - A banner page with no label + at the top and bottom.
  • + +
  • topsecret - A banner page with a + "top secret" label at the top and bottom.
  • + +
  • unclassified - A banner page with an + "unclassified" label at the top and bottom.
  • + +
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

KLimit

+ +

Examples

+ +
+<Printer name>
+  ...
+  KLimit 1234
+</Printer>
+
+ +

Description

+ +

The KLimit directive defines the value of the +job-k-limit attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -o job-k-limit=1234
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

Location

+ +

Examples

+ +
+<Printer name>
+  ...
+  Location Building 3321
+</Printer>
+
+ +

Description

+ +

The Location directive defines the string for the +printer-location attribute. It is normally set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -L "Building 3321"
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2OpPolicy

+ +

Examples

+ +
+<Printer name>
+  ...
+  OpPolicy default
+</Printer>
+
+ +

Description

+ +

The OpPolicy directive sets the operation policy +that is used for the printer. The lpadmin(8) command +sets the current operation policy:

+ +
+/usr/sbin/lpadmin -p printername -o printer-op-policy=default
+
+ +

The default policy is named "default". All policies correspond +to those defined using the cupsd.conf Policy +section.

+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2Option

+ +

Examples

+ +
+<Printer name>
+  ...
+  Option name value
+  Option scaling 100
+  Option page-left 72
+</Printer>
+
+ +

Description

+ +

The Option directive specifies a default job +template attribute value. It is mapped to +name-default in the printer attributes and applied +to jobs as name.

+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

PageLimit

+ +

Examples

+ +
+<Printer name>
+  ...
+  PageLimit 1234
+</Printer>
+
+ +

Description

+ +

The PageLimit directive defines the value of the +job-page-limit attribute. It can be set using the +lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -o job-page-limit=1234
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2PortMonitor

+ +

Examples

+ +
+<Printer name>
+  ...
+  PortMonitor bcp
+</Printer>
+
+ +

Description

+ +

The PortMonitor directive sets the filter program that +is used for every print job, typically to encode or package the print +data in a format acceptable for a particular printer interface. It is +set using the lpadmin(8) command:

+ +
+/usr/sbin/lpadmin -p printername -o port-monitor=tbcp
+
+ +

The following standard port monitors are included with CUPS:

+ +
    + +
  • bcp - Encode PostScript print data using + the Adobe Binary Control Protocol (BCP)
  • + +
  • none - Do not use a port monitor
  • + +
  • tbcp - Encode PostScript print data + using the Adobe Tagged Binary Control Protocol + (TBCP)
  • + +
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.4PreFilter

+ +

Examples

+ +
+<Printer name>
+  ...
+  PreFilter mime/type 100 program
+</Printer>
+
+ +

Description

+ +

The PreFilter directive lists a single pre-filter program as +defined in the printer's PPD file.

+ +

This directive must appear inside a +Printer or +DefaultPrinter section.

+ + +

Printer

+ +

Examples

+ +
+<Printer name>
+  ...
+</Printer>
+
+ +

Description

+ +

The Printer directive begins a printer +definition. Printers are added using the lpadmin(8) +command: + +

+/usr/sbin/lpadmin -p printername ...
+
+ + +

CUPS 1.4Product

+ +

Examples

+ +
+<Printer name>
+  ...
+  Product Acme PaperWriter
+</Printer>
+
+ +

Description

+ +

The Product directive defines the main product string from the +printer's PPD file and is used when advertising the queue via DNS-SD.

+ +

This directive must appear inside a +Printer or +DefaultPrinter section.

+ + +

QuotaPeriod

+ +

Examples

+ +
+<Printer name>
+  ...
+  QuotaPeriod 604800
+</Printer>
+
+ +

Description

+ +

The QuotaPeriod directive defines the value of +the job-quota-period attribute. Typical values are +86400 (1 day), 604800 (1 week), 2592000 (1 month), and 31536000 +(1 year). It is set using the lpadmin(8) +command:

+ +
+/usr/sbin/lpadmin -p printername -o job-quota-period=604800
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2Shared

+ +

Examples

+ +
+<Printer name>
+  ...
+  Shared yes
+</Printer>
+
+ +

Description

+ +

The Shared directive defines the initial value of +the printer-is-shared attribute. The strings +yes and no correspond to the true and false +values, respectively. The lpadmin(8) command sets +the current state:

+ +
+/usr/sbin/lpadmin -p printername -o printer-is-shared=true
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

State

+ +

Examples

+ +
+<Printer name>
+  ...
+  State idle
+</Printer>
+
+ +

Description

+ +

The State directive defines the initial value of +the printer-state attribute. The strings +idle and stopped correspond to the IPP +enumeration values 3 and 5, respectively. The +cupsenable(8) and cupsdisable(8) +commands set the current state:

+ +
+/usr/sbin/cupsenable printername
+/usr/sbin/cupsdisable printername
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

StateMessage

+ +

Examples

+ +
+<Printer name>
+  ...
+  StateMessage Ready to print.
+</Printer>
+
+ +

Description

+ +

The StateMessage directive defines the initial +string for the printer-state-message attribute. The +following are some example messages:

+ +
+StateMessage Connected to host_name...
+StateMessage Connecting to printer_queue on port port_number...
+StateMessage Network host host_name is busy; will retry in 30 seconds...
+StateMessage Printer busy; will retry in 10 seconds...
+StateMessage Printer is busy; retrying print job...
+StateMessage Print file accepted - job ID id_number.
+StateMessage Ready to print.
+StateMessage Waiting for job to complete
+
+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + +

CUPS 1.2StateTime

+ +

Examples

+ +
+<Printer name>
+  ...
+  StateTime 1133542425
+</Printer>
+
+ +

Description

+ +

The StateTime directive defines the UNIX time +(seconds since Jan 1, 1970) for the last state change of the +queue. It is mapped to the printer-state-change-time +attribute.

+ +

This directive must appear inside a Printer or DefaultPrinter +section.

+ + + + diff --git a/doc/help/ref-snmp-conf.html b/doc/help/ref-snmp-conf.html new file mode 100644 index 0000000..db4aace --- /dev/null +++ b/doc/help/ref-snmp-conf.html @@ -0,0 +1,146 @@ + + + + snmp.conf + + + + +

snmp.conf

+ +

The /etc/cups/snmp.conf file contains several +directives that determine how the SNMP printer discovery backend +behaves. Each directive is listed on a line by itself followed +by its value. Comments are introduced using the number sign ("#") +character at the beginning of a line.

+ +

The SNMP backend uses the SNMPv1 protocol to discover network +printers, collecting information from the Host MIB along with +intelligent port probes to determine the correct device URI and +make and model for each printer. Future versions of CUPS will +likely support the new Port Monitor MIB as well.

+ +

Address

+ +

Examples

+ +
+Address @LOCAL
+Address @IF(name)
+Address 255.255.255.255
+Address 192.168.2.255
+
+ +

Description

+ +

The Address directive specifies a broadcast +address to use when discovering printers. Multiple +Address lines can be provided to scan different +subnets.

+ +

The default address is @LOCAL, which broadcasts to +all LANs.

+ + +

Community

+ +

Examples

+ +
+Community public
+Community easysw
+Community BigCorp
+
+ +

Description

+ +

The Community directive specifies a community +name to use when discovering printers. Multiple +Community lines can be provided to scan different +SNMP communities.

+ +

The default community is "public".

+ + +

DebugLevel

+ +

Examples

+ +
+DebugLevel 0
+DebugLevel 1
+DebugLevel 2
+DebugLevel 3
+
+ +

Description

+ +

The DebugLevel directive specifies the debugging +level to use when searching for network printers. Level 0 +produces no debugging information. Level 1 produces basic +debugging information. Level 2 adds printing of the SNMP +messages. Level 3 adds a hex dump of the network data.

+ +

The default setting is 0.

+ +

DeviceURI

+ +

Examples

+ +
+DeviceURI "HP.*JetDirect.*" socket://%s:9100 socket://%s:9101 socket://%s:9102
+DeviceURI "HP.*" socket://%s
+DeviceURI "Acme.*Laser.*" lpd://%s/print
+DeviceURI "Xerox.*"
+
+ +

Description

+ +

The DeviceURI directive specifies a regular expression +(enclosed in double quotes) that is matched against the SNMP device +description OID returned by a printer. If the description matches the +regular expression, each device URI that follows the regular expression +is listed by the backend, with any occurrences of %s +replaced by the device's hostname or IP address. If no URIs are listed, +the device is ignored.

+ +

The DeviceURI directives are processed serially in +the order specified in the snmp.conf file until a match +is found.

+ + +

HostNameLookups

+ +

Examples

+ +
+HostNameLookups on
+HostNameLookups off
+
+ +

Description

+ +

The HostNameLookups directive specifies whether printer +addresses are converted to hostnames or left as numeric IP addresses.

+ +

The default setting is off.

+ +

MaxRunTime

+ +

Examples

+ +
+MaxRunTime 10
+MaxRunTime 300
+
+ +

Description

+ +

The MaxRunTime directive specifies the maximum +number of seconds that the SNMP backend will spend looking for +printer devices on the network.

+ +

The default setting is 10.

+ + + diff --git a/doc/help/ref-subscriptions-conf.html b/doc/help/ref-subscriptions-conf.html new file mode 100644 index 0000000..d4f4def --- /dev/null +++ b/doc/help/ref-subscriptions-conf.html @@ -0,0 +1,354 @@ + + + + subscriptions.conf + + + + +

subscriptions.conf

+ +

The CUPS scheduler (cupsd) uses the +/etc/cups/subscriptions.conf file to store the list +of active subscriptions. Each directive is listed on a line by +itself followed by its value. Comments are introduced using the +number sign ("#") character at the beginning of a line. + +

While the subscriptions configuration file consists of plain +text and can be modified using your favorite text editor, you +should normally use the command-line programs (lp(1) and lpr(1)) or specific applications via IPP +requests to manage your subscriptions.

+ +

Events

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  Events job-completed
+</Subscription>
+
+ +

Description

+ +

The Events directive lists the events, separated +by spaces, that the subscriber is interested in. Table 1 lists +the supported event names.

+ +

The Events directive must appear inside a Subscription section.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Event Names
NameDescription
allAll events
job-completedSend notification when the job is completed
job-config-changedSend notification when the job is changed
job-createdSend notification when a job is created
job-progressSend notification for job progress
job-state-changedSend notification when the job-state changes
job-stoppedSend notification when the job is stopped
printer-addedSend notification when a printer is added
printer-changedSend notification when a printer is changed
printer-config-changedSend notification when a printer's configuration is changed
printer-deletedSend notification when a printer is deleted
printer-modifiedSend notification when a printer is modified
printer-state-changedSend notification when the printer-state changes
printer-stoppedSend notification when a printer is stopped
server-auditSend notification when a bad request, security error, or + authentication error occurs
server-restartedSend notification when the server is restarted
server-startedSend notification when the server is initially started
server-stoppedSend notification when the server is shutdown
+ + +

ExpirationTime

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  ExpirationTime 1012563145
+</Subscription>
+
+ +

Description

+ +

The ExpirationTime directive specifies the +expiration time of the subscription as a UNIX time value. It is 0 +for subscriptions with no predefined expiration time.

+ +

The ExpirationTime directive must appear inside a +Subscription +section.

+ + +

Interval

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  Interval 30
+</Subscription>
+
+ +

Description

+ +

The Interval directive specifies the preferred +time interval for event notifications in seconds.

+ +

The Interval directive must appear inside a Subscription section.

+ + +

JobId

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  JobId 123
+</Subscription>
+
+ +

Description

+ +

The JobId directive specifies the +job-id for job subscriptions.

+ +

The JobId directive must appear inside a Subscription section.

+ + +

LeaseDuration

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  LeaseDuration 
+</Subscription>
+
+ +

Description

+ +

The LeaseDuration directive specifies the number +of seconds that the subscription is valid. A value of 0 means +that the subscription will last forever or the life of the print +job the subscription is attached to.

+ +

The LeaseDuration directive must appear inside a Subscription section.

+ + +

NextEventId

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  NextEventId 999
+</Subscription>
+
+ +

Description

+ +

The NextEventId directive specifies the +notify-sequence-number value for the next +notification event. It starts at 1 and increases for every event +that is delivered for the subscription.

+ +

The NextEventId directive must appear inside a Subscription section.

+ + +

NextSubscriptionId

+ +

Examples

+ +
+NextSubscriptionId 999
+
+ +

Description

+ +

The NextSubscriptionId directive specifies the +next subscription ID to use. It defaults to 1 more than the +highest subscription number seen.

+ + +

Owner

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  Owner username
+</Subscription>
+
+ +

Description

+ +

The Owner directive specifies the user that owns +this subscription.

+ +

The Owner directive must appear inside a Subscription section.

+ + +

PrinterName

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  PrinterName name
+</Subscription>
+
+ +

Description

+ +

The PrinterName directive specifies the name of +the printer or class that is associated with this +subscription.

+ +

The PrinterName directive must appear inside a Subscription section.

+ + +

Recipient

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  Recipient mailto:foo@domain.com
+</Subscription>
+
+ +

Description

+ +

The Recipient directive specifies the +notify-recipient-uri value for push-type +notifications. The URI scheme name determines which notifier +program is used to send the event(s).

+ +

The Recipient directive must appear inside a Subscription section.

+ + +

Subscription

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+</Subscription>
+
+ +

Description

+ +

The Subscription section defines a single +subscription in the system. Each subscription is assigned a +unique (to the server) number starting at 1.

+ + +

UserData

+ +

Examples

+ +
+<Subscription NNN>
+  ...
+  UserData mailto:bar<40>domain.com
+</Subscription>
+
+ +

Description

+ +

The UserData directive specifies the +notify-user-data value, which is normally the "from" +address used in mailto notifications. Binary values +are introduced by encoding the bytes as hexadecimal values inside +angle brackets, e.g. "<1234>".

+ +

The UserData directive must appear inside a Subscription section.

+ + + diff --git a/doc/help/security.html b/doc/help/security.html new file mode 100644 index 0000000..c86151d --- /dev/null +++ b/doc/help/security.html @@ -0,0 +1,172 @@ + + + + Server Security + + + + +

Server Security

+ +

In the default "standalone" configuration, there are few +potential security risks - the CUPS server does not accept remote +connections, and only accepts shared printer information from the +local subnet. When you share printers and/or enable remote +administration, you expose your system to potential unauthorized +access. This help page provides an analysis of possible CUPS +security concerns and describes how to better secure your +server.

+ +

Authentication Issues

+ +

When you enable remote administration, the server will use +Basic authentication for administration tasks. The current CUPS +server supports Basic, Digest, Kerberos, and local certificate +authentication:

+ +
    + +
  1. Basic authentication essentially places the clear + text of the username and password on the network. + +

    Since CUPS uses the system username and password + account information, the authentication information could + be used to gain access to possibly privileged accounts on + the server.

    + +

    Recommendation: Enable encryption to hide the + username and password information - this is the default on + MacOS X and systems with GNU TLS or OpenSSL installed.

  2. + +
  3. Digest authentication uses an MD5 checksum of the + username, password, and domain ("CUPS"), so the original + username and password is not sent over the network. + +

    The current implementation does not authenticate the + entire message and uses the client's IP address for the + nonce value, making it possible to launch "man in the + middle" and replay attacks from the same client.

    + +

    Recommendation: Enable encryption to hide the + username and password information.

  4. + +
  5. Local certificate authentication passes 128-bit + "certificates" that identify an authenticated user. + Certificates are created on-the-fly from random data and + stored in files under /var/run/cups/certs. + They have restricted read permissions: root + + system-group(s) for the root certificate, and lp + lp + for CGI certificates. + +

    Because certificates are only available on the local + system, the CUPS server does not accept local + authentication unless the client is connected to the + loopback interface (127.0.0.1 or ::1) or domain + socket.

    + +

    Recommendation: Ensure that unauthorized users + are not added to the system group(s).

  6. + +
+ +

Denial of Service Attacks

+ +

When printer sharing or remote administration is enabled, the +CUPS server, like all Internet services, is vulnerable to a +variety of denial of service attacks:

+ +
    + +
  1. Establishing multiple connections to the server until + the server will accept no more. + +

    This cannot be protected against by any known + software. The MaxClientsPerHost directive + can be used to configure CUPS to limit the number of + connections allowed from a single host, however that does + not prevent a distributed attack.

    + +

    Recommendation: Limit access to trusted systems + and networks.

  2. + +
  3. Repeatedly opening and closing connections to the + server as fast as possible. + +

    There is no easy way of protecting against this in the + CUPS software. If the attack is coming from outside the + local network, it may be possible to filter such an + attack. However, once the connection request has been + received by the server it must at least accept the + connection to find out who is connecting.

    + +

    Recommendation: None.

  4. + +
  5. Flooding the network with broadcast packets on port + 631. + +

    It might be possible to disable browsing if this + condition is detected by the CUPS software, however if + there are large numbers of printers available on the + network such an algorithm might think that an attack was + occurring when instead a valid update was being + received.

    + +

    Recommendation: Block browse packets from + foreign or untrusted networks using a router or + firewall.

  6. + +
  7. Sending partial IPP requests; specifically, sending + part of an attribute value and then stopping + transmission. + +

    The current code will wait up to 1 second before + timing out the partial value and closing the connection. + This will slow the server responses to valid requests and + may lead to dropped browsing packets, but will otherwise + not affect the operation of the server.

    + +

    Recommendation: Block IPP packets from foreign + or untrusted networks using a router or + firewall.

  8. + +
  9. Sending large/long print jobs to printers, preventing + other users from printing. + +

    There are limited facilities for protecting against + large print jobs (the MaxRequestSize + attribute), however this will not protect printers from + malicious users and print files that generate hundreds or + thousands of pages.

    + +

    Recommendation: Restrict printer access to + known hosts or networks, and add user-level access + controls as needed for expensive printers.

  10. + +
+ +

Encryption Issues

+ +

CUPS supports 128-bit SSL 3.0 and TLS 1.0 encryption of +network connections via the OpenSSL, GNU TLS, and CDSA encryption +libraries. In additional to the potential security issues posed +by the SSL and TLS protocols, CUPS currently has the following +additional issue:

+ +
    + +
  1. Certification validation/revocation; currently CUPS + does not validate or revoke server or client certificates + when establishing a secure connection. This can + potentially lead to "man in the middle" and + impersonation/spoofing attacks over unsecured networks. + Future versions of CUPS will support both validation and + revocation of server certificates. + +

    Recommendation: Do not depend on encryption for + security when connecting to servers over the Internet or + untrusted WAN links.

  2. + +
+ + + diff --git a/doc/help/sharing.html b/doc/help/sharing.html new file mode 100644 index 0000000..00ccb6f --- /dev/null +++ b/doc/help/sharing.html @@ -0,0 +1,184 @@ + + + + Printer Sharing + + + + +

Printer Sharing

+ +

This document discusses several ways to configure printer sharing.

+ +

The Basics

+ +

A "server" is any machine that communicates directly to a printer. A "client" +is any machine that sends print jobs to a server for final printing. Clients can +also be servers if they communicate directly with any printers of their own.

+ +

By default, CUPS uses the Internet Printing Protocol (IPP) to send jobs from +a client to a server. When printing to legacy print servers you may also use the +Line Printer Daemon (LPD) when printing to older UNIX-based servers or Server +Message Block (SMB) when printing to Windows® servers.

+ +

Clients can automatically discover and access shared printers via CUPS +browsing, IPP, Service Location Protocol (SLP), and Lightweight Directory Access +Protocol (LDAP). DNS Service Discovery (DNS-SD a.k.a. Bonjour®) +and SMB browsing can also be used to manually discover and access shared +printers.

+ + +

Configuring the Server

+ +

You must enable printer sharing on the server before clients can print +through it. The simplest way to do this is to use the +cupsctl(8) command on the server:

+ +
+cupsctl --share-printers
+
+ +

By default, the above command will allow printing from other clients on the +same subnet as your server. To allow printing from any subnet, use the following +command instead:

+ +
+cupsctl --share-printers --remote-any
+
+ +

Next, you need to choose which protocols to use for printer sharing. The +default is CUPS browsing and DNS-SD on Mac OS X and CUPS browsing alone on +other platforms. To set the sharing protocols, run the cupsctl command +to set the +BrowseLocalProtocols +value. For example, run the following command to allow shared printing via +CUPS, DNS-SD, LPD, and SMB:

+ +
+cupsctl 'BrowseLocalProtocols="cups dnssd lpd smb"'
+
+ + +

Automatic Configuration using CUPS Browsing

+ +

CUPS browsing works by periodically broadcasting information about printers +that are being shared to client systems on the same subnet. Each client +maintains its own list of shared printers, and when more than one server shares +the same printer (or the same kind of printer) the client uses all of the +servers and printers to provide high-availability and failsafe printing.

+ +

To configure printers on the same subnet, do nothing. Each client +should see the available printers within 30 seconds automatically. The printer +and class lists are updated automatically as printers and servers are added or +removed.

+ +
Note: + +

Due to user interface changes in Mac OS X 10.5, CUPS shared printers will not +automatically appear in the print dialog. Instead, you must first run the +following command to enable CUPS browsing on your system:

+ +
+cupsctl BrowseRemoteProtocols=cups
+
+ +

Then choose each of the CUPS shared printers you want to see in the print +dialog by adding them, either from the Add Printer... item in the +print dialog or from the Print & Fax preference pane in the +System Preferences window.

+ +
+ +

Seeing Printers on Other Subnets

+ +

You can automatically access printers on other subnets by adding +BrowsePoll lines +to the cupsd.conf file on your local system. For a single +server you can use the cupsctl command:

+ +
+cupsctl BrowsePoll=server:port
+
+ +

For multiple servers, use the CUPS web interface (http://localhost:631/admin) +to edit the configuration file instead. Enter one BrowsePoll line +per server at the bottom of the file, as follows:

+ +
+BrowsePoll server1:port
+BrowsePoll server2:port
+BrowsePoll server3:port
+
+ +

If you have more than one client on your subnet that wants to see the +printers on those servers, add a +BrowseRely line +to the cupsd.conf file on your local system using the cupsctl +command:

+ +
+cupsctl 'BrowseRelay="127.0.0.1 @LOCAL"'
+
+ +

or CUPS web interface (again, at the bottom of the file):

+ +
+BrowseRelay 127.0.0.1 @LOCAL
+
+ + +

Automatic Configuration using IPP

+ +

CUPS can be configured to run without a local spooler and send all jobs to a +single server. However, if that server goes down then all printing will be +disabled. Use this configuration only as absolutely necessary.

+ +

The default server is normally the local system ("localhost"). To override +the default server create a file named /etc/cups/client.conf with a +line as follows:

+ +
+ServerName server
+
+ +

The server name can be the hostname or IP address of the default +server. If the server is not using the default IPP port (631), you can add the +port number at the end like this:

+ +
+ServerName server:port
+
+ +

The default server can also be customized on a per-user basis. To set a +user-specific server create a file named ~/.cups/client.conf instead. +The user client.conf file takes precedence over the system one.

+ +

Finally, you can set the CUPS_SERVER environment variable to +override the default server for a single process, for example:

+ +
+CUPS_SERVER=server:port firefox http://www.cups.org
+
+ +

will run the Firefox web browser pointed to the specified server and +port. The environment variable overrides both the user and system +client.conf files, if any.

+ + +

Manual Configuration of Print Queues

+ +

The most tedious method of configuring client machines is to configure +each remote queue by hand using the lpadmin(8) +command:

+ +
+lpadmin -p printer -E -v ipp://server/printers/printer
+
+ +

The printer name is the name of the printer on the server machine. +The server name is the hostname or IP address of the server machine. +Repeat the lpadmin command for each remote printer you wish to use.

+ + + + diff --git a/doc/help/spec-banner.html b/doc/help/spec-banner.html new file mode 100644 index 0000000..2d22d9e --- /dev/null +++ b/doc/help/spec-banner.html @@ -0,0 +1,156 @@ + + + + + CUPS Banner File Format + + + + + + +

CUPS Banner File Format

+ +

Introduction

+ +

This specification describes the CUPS banner file format +(application/vnd.cups-banner) which is used to generate print job cover pages +and the CUPS test page. The format itself consists of a header followed by +lines of UTF-8 text containing comments or keywords and values:

+ +
+#CUPS-BANNER
+
+# What to show on the cover page
+Show job-id job-name job-originating-user-name time-at-creation
+
+# The header and footer text
+Header Cover Page
+Footer Cover Page
+
+# Arbitrary "notice" text
+Notice All work and no play makes Johnny a dull boy.
+Notice All work and no play makes Johnny a dull boy.
+Notice All work and no play makes Johnny a dull boy.
+Notice All work and no play makes Johnny a dull boy.
+
+# Images to place below the rest
+Image /usr/share/doc/cups/images/cups-icon.png
+Image /usr/share/doc/cups/images/smiley.jpg
+
+ + +

Standard Keywords

+ +

Footer

+ +

+Footer text for footer +

+ +

The Footer key defines the text that is centered at the bottom +of the page. Only one Footer key can be specified.

+ + +

Header

+ +

+Header text for Header +

+ +

The Header key defines the text that is centered at the top +of the page. Only one Header key can be specified.

+ + +

Image

+ +

+Image /path/to/image/filename
+Image relative/path/in/DocumentRoot/filename +

+ +

The Image key defines images that are centered above the footer +text. Multiple images are centered as a group from left to right. Images are +scaled as needed to fit on the page with a nominal size of 1"/25cm.

+ + +

Notice

+ +

+Notice Text to display below the job information.
+Notice More text to display below the job information. +

+ +

The Notice key defines lines of text that are centered below +the job information.

+ + +

Show

+ +

+Show value value ... value +

+ +

The Show key lists the job information that is shown. The +following values are supported:

+ +
    + +
  • imageable-area: The imageable area of the current + page size
  • + +
  • job-billing: Billing information for the job
  • + +
  • job-id: The job ID
  • + +
  • job-name: The title of the job
  • + +
  • job-originating-host-name: The computer that printed + the job
  • + +
  • job-originating-user-name: The user that printed the + job
  • + +
  • job-uuid: The job UUID
  • + +
  • options: The options that were provided with the + job
  • + +
  • paper-name: The name of the paper size used
  • + +
  • paper-size: The dimensions of the paper size used.
  • + +
  • printer-driver-name: The printer driver used
  • + +
  • printer-driver-version: The driver version
  • + +
  • printer-info: The printer description
  • + +
  • printer-location: The location of the printer
  • + +
  • printer-make-and-model: The make and model strings + reported by the printer driver
  • + +
  • printer-name: The printer used
  • + +
  • time-at-creation: When the job was submitted
  • + +
  • time-at-processing: The current date and time
  • + +
+ + + + diff --git a/doc/help/spec-browsing.html b/doc/help/spec-browsing.html new file mode 100644 index 0000000..4583731 --- /dev/null +++ b/doc/help/spec-browsing.html @@ -0,0 +1,118 @@ + + + + + CUPS Browse Protocol + + + + + + +
Note: + +

The CUPS Browse Protocol is deprecated and will no longer be used in a future release of CUPS.

+ +
+ +

CUPS Browse Protocol

+ +

Introduction

+ +

This specification describes the CUPS browsing protocol which is used for +printer sharing. The protocol is a UDP/IP-based broadcast service that +operates on IP service port 631 by default. Each broadcast packet describes +a single printer or class being shared.

+ +

For simple networks with a single subnet, a CUPS system sharing a printer +(the server) will periodically broadcast that printer's availability +and status information to the subnet. Every other CUPS system on the subnet +(the clients) will receive the broadcast and make that printer +available to local users. If a client stops receiving broadcasts from the +server, or if the server sends a special "deleted" broadcast message, the +client will remove its copy of the printer.

+ +

For larger networks with multiple subnets, a relay configuration can be used +where one or more client systems poll the server and then broadcast the +availability and status information for the server's shared printers to the +clients' local subnets.

+ +

A key feature of CUPS printer sharing is support for implicit +classes, which are automatically-created classes for printers that are +shared by multiple servers. These implicit classes provide automatic load +balancing and fail-safe printing functionality transparently to the user.

+ + +

Security Considerations

+ +

Like most discovery protocols, CUPS browse packets are not encrypted or +signed, so it is possible for malicious systems on a network to advertise +or remove printers on that network to cause denial of service or information +disclosure. In order to combat this, CUPS logs incoming browse packets and +provides access controls to limit browse packet reception to known hosts.

+ + +

Browse Packet Format

+ +

Each broadcast packet is an ASCII text string of up to 1450 bytes ending +with a line feed (0x0a). The general format is:

+ +

+printer-type printer-state printer-uri "printer-location" "printer-info" +"printer-make-and-model" name=value name2=value2 ... +

+ +

Each of the fields contains the value of the corresponding IPP attribute. +The trailing "name=value" information is used to convey default job template +attribute values (job-sheets-default, media-default, etc.), authentication +requirements (auth-info-required), and additional IPP URI options that are +requested by the server (ipp-options).

+ +

ABNF Definition

+ +

The following ABNF definition [RFC4234, RFC3986] defines the format of each +browse packet:

+ +
+PACKET         = TYPE WSP STATE WSP URI WSP LOCATION WSP INFO WSP
+                 MAKE-AND-MODEL WSP *[ WSP ATTR-NAME "=" ATTR-VALUE ] LF
+
+TYPE           = 1*HEXDIG
+
+STATE          = "3" / "4" / "5"
+
+URI            = "ipp://" ( 1*NAMECHAR / IP-literal / IPv4address )
+                 [ ":" 1*DIGIT ] ( "/printers/" / "/classes/" ) 1*NAMECHAR
+NAMECHAR       = %x21.22.24.26-2E.30-7E / %x25 HEXDIG HEXDIG
+IP-literal     = See RFC 3986
+IPv4address    = See RFC 3986
+
+LOCATION       = QUOTED-STRING
+INFO           = QUOTED-STRING
+MAKE-AND-MODEL = QUOTED-STRING
+
+ATTR-NAME      = 1*( ALPHA / DIGIT / "-" / "." )
+ATTR-VALUE     = QUOTED-STRING / 1*UNQUOTE-CHAR
+
+QUOTED-STRING  = DQUOTE *QUOTED-CHAR DQUOTE
+QUOTED-CHAR    = %x20.21.23-5B.5D-7E / UTF8-CHAR / %x5C %x5C / %x5C %x22
+UNQUOTE-CHAR   = %x21.23-26.28-5B.5D-7E / UTF8-CHAR
+UTF8-CHAR      = %xC0.DF %x80.BF / %xE0.EF %x80.BF %x80.BF /
+                 %xF0.F7 %x80.BF %x80.BF %x80.BF
+
+ + + diff --git a/doc/help/spec-cmp.html b/doc/help/spec-cmp.html new file mode 100644 index 0000000..47f56d3 --- /dev/null +++ b/doc/help/spec-cmp.html @@ -0,0 +1,1218 @@ + + + + + CUPS Developer Guide + + + + +

CUPS Developer Guide

+ +

This developer guide documents the guidelines and processes we use when developing and maintaining CUPS and related software. Our goal is to provide reliable and efficient software and documentation that addresses the needs of our users.

+ +

Communication

+ +

How to Contact the Developers

+ +

The CUPS +Forums are the primary means of asking questions and +informally discussing issues and feature requests with the CUPS +developers. Table 1 shows the available forums and their +focus:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: CUPS Forums
ForumFocus/Purpose
cups.bugsDiscussion of bugs and issues in the CUPS + software
cups.commitReport of all commits to the Subversion repository + (read-only)
cups.ddkUsage and development questions for the CUPS Driver + Development Kit
cups.developmentDevelopment questions and discussion of new features + in the CUPS software
cups.generalUsage questions for the CUPS software
+ +

How to Submit a Bug Report or Feature Request

+ +

The CUPS "Bugs & +Features" page provides access to the CUPS software +trouble report database and is the formal way to submit a +bug report or feature request to the CUPS developers. Please +note, however, that we do not provide answers to usage +questions or resolve problems in third-party software on this +page - use the CUPS Forums for that instead.

+ +

Unlike discussions that occur on the CUPS Forums, formal bug +reports and feature requests must be acted on by the CUPS +developers. This does not mean that every bug report is resolved +or every feature request is implemented, but we do respond and +keep track of them all for posterity.

+ +
Please use the search feature of the Bugs & +Features page before submitting a new bug report or feature +request. If you see an existing report that matches your issue, +please post a message to that report ("I have this issue as +well", "I would also like to see", etc.) rather than submitting a +new report. This helps speed the resolution of your issue by +reducing the CUPS developers' work load.
+ +

How to Prepare a Patch

+ +

When submitting a bug report or feature request, you can +include patch files that resolve the bug or implement the feature +to speed the inclusion of that bug fix or feature in a new CUPS +release. For changes to existing files, we prefer a unified diff +against the current Subversion trunk branch, which can +be generated easily using the following Subversion command:

+ +
+svn diff >filename.patch
+
+ +

If you produce a patch using a released source archive, use +one of the following commands instead:

+ +
+diff -u oldfilename filename >filename.patch
+
+diff -urN olddirectory directory >filename.patch
+
+ +

New files and files with significant changes can be submitted +in their entirety, however that may delay the adoption of your +changes.

+ +
Patches and files must conform to the standards outlined in the +"Coding Guidelines" and "Makefile +Guidelines" sections in this document. In addition, since Apple Inc. +provides CUPS under multiple licenses, we require that you assign the copyright +for your changes and files to us for inclusion in CUPS.
+ + +

Software Development Practices

+ +

Version Numbering

+ +

CUPS uses a three-part version number separated by periods to +represent the major, minor, and patch release numbers. Major +release numbers indicate large design changes or +backwards-incompatible changes to the CUPS API or CUPS Imaging +API. Minor release numbers indicate new features and other +smaller changes which are backwards-compatible with previous CUPS +releases. Patch numbers indicate bug fixes to the previous +release.

+ +
When we talk about compatibility, we are talking +about binary compatibility for public APIs and output format +compatibility for program interfaces. Changes to configuration +file formats or the default behavior of programs are not +generally considered incompatible as the upgrade process can +normally address such changes gracefully.
+ +

Production releases use the plain version numbers:

+ +
+MAJOR.MINOR.PATCH
+1.0.0
+1.0.1
+1.0.2
+...
+1.1.0
+...
+1.1.23
+1.2.0
+1.2.1
+...
+1.3.0
+...
+2.0.0
+
+ +

The first production release in a MAJOR.MINOR series (MAJOR.MINOR.0) is +called a feature release. Feature releases are the only releases that may +contain new features. Subsequent production releases in a MAJOR.MINOR series may +only contain bug fixes.

+ +
We did not hold to this limitation in the CUPS 1.1 series for a +variety of reasons. Starting with CUPS 1.2, the "no new features in a patch +release" policy has been strictly enforced. The policy has also resulted in +fewer new features (and interactions!) to validate/test in the subsequence +feature releases.
+ +

Beta-test releases are identified by appending the letter B to the major and +minor version numbers followed by the beta release number:

+ +
+MAJOR.MINORbNUMBER
+1.2b1
+
+ +

Release candidates are identified by appending the letters RC to the major +and minor version numbers followed by the release candidate number:

+ +
+MAJOR.MINORrcNUMBER
+1.2rc1
+
+ +

Developer snapshots are identified by appending the letters SVN-R to the +major and minor version numbers followed by the revision number:

+ +
+MAJOR.MINORsvn-rREV
+1.2svn-r1234
+
+ +

Beta-test releases, release candidates, and developer snapshots are only +created for new minor releases. Once a production release has been made +(MAJOR.MINOR.0), subsequent patch releases are issues without preliminary beta +or release testing.

+ +

Version Control (Subversion)

+ +

The CUPS source files are managed by the Subversion ("SVN") +software, available at:

+ +
+subversion.tigris.org
+
+ +

Source files are "checked in" with each change so that +modifications can be tracked, and each checkin must reference any +applicable STRs. The following format must be used for +commit log messages:

+ +
+Summary of the change on one line followed by bug number (STR #NNNN)
+
+Detailed list of changes.
+
+ +

Primary development occurs on the trunk branch, +with changes merged back to release branches as needed. Table 2 +shows the URLs developers use for the various CUPS sub-projects +and branches:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: CUPS Subversion URLs
URLPurpose
https://svn.easysw.com/public/cups/trunk/Primary CUPS development branch
https://svn.easysw.com/public/cups/branches/CUPS maintenance branches (merge-only)
https://svn.easysw.com/public/cups/tags/CUPS release tags (read-only)
https://svn.easysw.com/public/windows/trunk/Primary CUPS Windows Driver development branch
https://svn.easysw.com/public/windows/branches/CUPS Windows Driver maintenance branches (merge-only)
https://svn.easysw.com/public/windows/tags/CUPS Windows Driver release tags (read-only)
+ +

The branch for a MAJOR.MINOR release are created when the +first production release (MAJOR.MINOR.0) is made using the name +"branch-MAJOR.MINOR". Release tags are created for every beta, +candidate, and production release using the name +"release-MAJOR.MINOR.PATCHbNUMBER", +"release-MAJOR.MINOR.PATCHrcNUMBER", or +"release-MAJOR.MINOR.PATCH", respectively. No release tags are +created for developer snapshots.

+ + +

Files and Directories

+ +

File and directory names may not exceed 16 characters in +length to ensure compatibility with older UNIX filesystems. In +addition, to avoid problems with case-insensitive filesystems, +you may not use names which differ only by case, for example +"ReadMe" and "README" are not allowed in the same directory.

+ +

Source files must be documented and formatted as described in +"Coding Requirements". Make files must +follow the guidelines in "Makefile +Guidelines".

+ + +

Build System

+ +

The CUPS build system uses GNU autoconf to +tailor the library to the local operating system. Project files +for major IDEs are also provided for Microsoft +Windows®. To improve portability, makefiles must +not make use of the unique features offered by GNU make. See the Makefile Guidelines section for a +description of the allowed make features and makefile +guidelines.

+ +

Additional GNU build programs such as GNU automake and +GNU libtool +must not be used. GNU automake produces non-portable makefiles +which depend on GNU-specific extensions, and GNU libtool is not +portable or reliable enough for CUPS.

+ + +

Packaging

+ +

Source packages are created using the +tools/makesrcdist script in the Subversion repository. +The script optionally uses a version number argument:

+ +
+tools/makesrcdist
+tools/makesrcdist version
+
+ +

When run with no arguments, the script creates a snapshot of +the current working copy and names it using the highest revision +number in the WC, for example +"/tmp/cups-1.3svn-r1234-source.tar.bz2" and +"/tmp/cups-1.3svn-r1234-source.tar.gz". When run with two +arguments, the script creates a release tag in the repository and +exports that tag, creating the files +"/tmp/cups-version-source.tar.bz2" and +"/tmp/cups-version-source.tar.gz".

+ +

Binary packages are not generally distributed by the CUPS +team, however the packaging/cups.spec and +packaging/cups.list files may be used to create binary +packages on Linux, Mac OS X, and UNIX. The +packaging/cups.spec file produces a binary package +using the rpmbuild(8) software:

+ +
+rpmbuild -ta cups-version-source.tar.gz
+
+ +

The cups.list file is generated by the +configure script and produces binary packages for many +platforms using the EPM software. Table 3 shows the targets that +are available for each type of binary package:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: Binary Package Targets
TargetType of Package
aixAIX installp
bsd*BSD pkg_install
debDebian dpkg
depotHP-UX swinstall
epmPortable tarball with install script
instIRIX inst/tardist
osxMac OS X Install
pkgSolaris pkgadd
rpmRPM binary
setldTru64 UNIX setld
slackwareSlackware install
swinstallHP-UX swinstall
tardistIRIX inst/tardist
+ +

Finally, the tools/testrpm and +tools/testosx scripts can be used to create binary +packages from the current working copy for testing on Linux and +Mac OS X, respectively:

+ +
+tools/testrpm
+sudo rpm -U /usr/src/redhat/RPMS/i386/cups*.rpm
+
+sudo tools/testosx
+open cups.pkg
+
+ + +

Testing

+ +

Software testing is conducted according to the CUPS Software Test Plan. This testing is +automated via the top-level makefile test target:

+ +
+make test
+
+ +

The test environment allows for both short-term automated +testing and long-term testing and development without the +automated test script.

+ + +

Trouble Report Processing

+ +

A Software Trouble Report ("STR") must be submitted every time +a user or vendor experiences a problem with the CUPS software. +Trouble reports are maintained on the Bugs & +Features page with one of the following states:

+ +
    + +
  1. STR is closed with complete resolution
  2. + +
  3. STR is closed without resolution
  4. + +
  5. STR is active, waiting on information from submitter
  6. + +
  7. STR is pending with additional information from submitter
  8. + +
  9. STR is newly submitted
  10. + +
+ +

Trouble reports are processed using the following steps.

+ +
    + +
  1. Classification + +

    When a trouble report is received it must be classified at one +of the following priority levels:

    + +
      + +
    1. Request for enhancement, e.g. asking for a + feature + +
    2. Low, e.g. a documentation error or undocumented + side-effect + +
    3. Moderate, e.g. unable to print a file or unable to + compile the software + +
    4. High, e.g. unable to print to a printer or key + functionality not working + +
    5. Critical, e.g. unable to print at all + +
    + +

    Level 4 and 5 trouble reports must be resolved in the next +software release. Level 2 and 3 trouble reports are scheduled for +resolution in a specific release at the discretion of the release +coordinator. Level 1 trouble reports are scheduled for resolution +in a future feature release.

    + +

    The scope of the problem is also determined as:

    + +
      + +
    1. Specific to a machine or printer + +
    2. Specific to an operating system + +
    3. Applies to all machines, printers, and operating systems + +
    + +
  2. Identification + +

    Once the level and scope of the trouble report is determined +the software sub-system(s) involved with the problem are +determined. This may involve additional communication with the +user or vendor to isolate the problem to a specific cause.

    + +

    When the sub-system(s) involved have been identified, an +engineer will then determine the change(s) needed and estimate +the time required for the change(s).

    + +
  3. Correction + +

    Corrections are scheduled based upon the severity and +complexity of the problem. Once all changes have been made, +documented, and tested successfully a new software release +snapshot is generated. Additional tests are added as necessary +for proper testing of the changes.

    + +
  4. Notification + +

    The user or vendor is notified when the fix is available or if +the problem was caused by user error.

    + +
+ + +

Release Management

+ +

When testing has been completed successfully, a new source +package is created using the tools/makesrcdist script. +Three types of releases, beta, candidate, and production, are +created and released to the public using the basic schedule in +Table 4. At least one beta and one release candidate must be +created prior to a production release, and there must be at least +two weeks between the last beta and first candidate and last +candidate and first production release.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table: CUPS Basic Release Schedule
WeekVersionDescription
T-6 weeks1.2b1First beta release
T-5 weeks1.2b2Second beta release
T-3 weeks1.2rc1First release candidate
T-2 weeks1.2rc2Second release candidate
T-0 weeks1.2.0Production (feature) release
+ + +

Coding Guidelines

+ +

These coding guidelines provide detailed information on source +file formatting and documentation content and must be applied to +all C and C++ source files provided with CUPS. Source code for +other languages should conform to these guidelines as allowed by +the language.

+ +

Source Files

+ +

All source files names shall be 16 characters or less in +length to ensure compatibility with older UNIX filesystems. +Source files containing functions shall have an extension of ".c" +for ANSI C and ".cxx" for C++ source files. All other "include" +files shall have an extension of ".h".

+ +

The top of each source file shall contain a header giving the +name of the file, the purpose or nature of the source file, the +copyright and licensing notice, and the functions contained in +the file. The file name and revision information is provided by +the Subversion "$Id$" tag:

+ +
+/*
+ * "$Id$"
+ *
+ *   Description of file contents.
+ *
+ *   Copyright 2010 by Apple Inc.
+ *
+ *   These coded instructions, statements, and computer programs are the
+ *   property of Apple Inc. and are protected by Federal copyright
+ *   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+ *   which should have been included with this file.  If this file is
+ *   file is missing or damaged, see the license at "http://www.cups.org/".
+ *
+ * Contents:
+ *
+ *   function1() - Description 1.
+ *   function2() - Description 2.
+ *   function3() - Description 3.
+ */
+
+ +

For source files that are subject to the Apple OS-Developed +Software exception, the following additional comment should +appear after the contact information:

+ +
+ *   This file is subject to the Apple OS-Developed Software exception.
+
+ +

The bottom of each source file shall contain a trailer giving +the name of the file using the Subversion "$Id$" tag. The +primary purpose of this is to mark the end of a source file; if +the trailer is missing it is possible that code has been lost +near the end of the file:

+ +
+/*
+ * End of "$Id$".
+ */
+
+ +

Functions

+ +

Functions with a global scope shall have a lowercase prefix +followed by capitalized words ("cupsDoThis", "cupsDoThat", +"cupsDoSomethingElse", etc.) Private global functions shall begin +with a leading underscore ("_cupsDoThis", "_cupsDoThat", +etc.)

+ +

Functions with a local scope shall be declared "static" and be +lowercase with underscores between words ("do_this", "do_that", +"do_something_else", etc.)

+ +

Each function shall begin with a comment header describing +what the function does, the possible input limits (if any), and +the possible output values (if any), and any special information +needed:

+ +
+/*
+ * 'do_this()' - Compute y = this(x).
+ *
+ * Notes: none.
+ */
+
+static float                            /* O - Inverse power value, 0.0 <= y <= 1.1 */
+do_this(float x)                        /* I - Power value (0.0 <= x <= 1.1) */
+{
+  ...
+  return (y);
+}
+
+ +

Return/output values are indicated using an "O" prefix, input +values are indicated using the "I" prefix, and values that are +both input and output use the "IO" prefix for the corresponding +in-line comment.

+ +

The Mini-XML documentation generator also understands the following +special text in the function description comment:

+ +
    + +
  • @deprecated@ - Marks the function as + deprecated (not recommended for new development and + scheduled for removal)
  • + +
  • @since CUPS version@ - Marks the + function as new in the specified version of CUPS.
  • + +
  • @private@ - Marks the function as private.
  • + +
+ +

Variables

+ +

Variables with a global scope shall be capitalized +("ThisVariable", "ThatVariable", "ThisStateVariable", etc.) The +only exception to this rule shall be the CUPS interface library +global variables which must begin with the prefix "cups" +("cupsThisVariable", "cupsThatVariable", etc.) Global variables +shall be replaced by function arguments whenever possible.

+ +

Variables with a local scope shall be lowercase with +underscores between words ("this_variable", "that_variable", +etc.) Any local variables shared by functions within a source +file shall be declared "static".

+ +

Each variable shall be declared on a separate line and shall +be immediately followed by a comment block describing the +variable:

+ +
+int this_variable;   /* The current state of this */
+int that_variable;   /* The current state of that */
+
+ +

Types

+ +

All type names shall be lowercase with underscores between +words and "_t" appended to the end of the name +("cups_this_type_t", "cups_that_type_t", etc.) Type names must +start with a prefix, typically "cups" or the name of the program, +to avoid conflicts with system types. Private type names must +start with an underscore ("_cups_this_t", "_cups_that_t", +etc.)

+ +

Each type shall have a comment block immediately after the +typedef:

+ +
+typedef int cups_this_type_t;           /* This type is for CUPS foobar options. */
+
+ +

Structures

+ +

All structure names shall be lowercase with underscores +between words and "_s" appended to the end of the name +("cups_this_s", "cups_that_s", etc.) Structure names must start +with a prefix, typically "cups" or the name of the program, to +avoid conflicts with system types. Private structure names must +start with an underscore ("_cups_this_s", "_cups_that_s", +etc.)

+ +

Each structure shall have a comment block immediately after +the struct and each member shall be documented in accordance with +the variable naming policy above:

+ +
+struct cups_this_struct_s               /* This structure is for CUPS foobar options. */
+{
+  int this_member;                      /* Current state for this */
+  int that_member;                      /* Current state for that */
+};
+
+ +

Constants

+ +

All constant names shall be uppercase with underscored between +words ("CUPS_THIS_CONSTANT", "CUPS_THAT_CONSTANT", etc.) +Constants must begin with an uppercase prefix, typically "CUPS" +or the program name.

+ +

Typed enumerations shall be used whenever possible to allow +for type checking by the compiler.

+ +

Comment blocks shall immediately follow each constant:

+ +
+enum
+{
+  CUPS_THIS_TRAY,                       /* This tray */
+  CUPS_THAT_TRAY                        /* That tray */
+};
+
+ +

Code

+ +

All source code shall utilize block comments within functions +to describe the operations being performed by a group of +statements; avoid putting a comment per line unless absolutely +necessary, and then consider refactoring the code so that it is +not necessary:

+ +
+/*
+ * Clear the state array before we begin...
+ */
+
+for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
+  array[i] = STATE_IDLE;
+
+/*
+ * Wait for state changes...
+ */
+
+do
+{
+  for (i = 0; i < (sizeof(array) / sizeof(sizeof(array[0])); i ++)
+    if (array[i] != STATE_IDLE)
+      break;
+
+  if (i == (sizeof(array) / sizeof(array[0])))
+    sleep(1);
+} while (i == (sizeof(array) / sizeof(array[0])));
+
+ +

Indentation

+ +

All code blocks enclosed by brackets shall begin with the +opening brace on a new line. The code then follows starting on a +new line after the brace and is indented 2 spaces. The closing +brace is then placed on a new line following the code at the +original indentation:

+ +
+{
+  int i; /* Looping var */
+
+ /*
+  * Process foobar values from 0 to 999...
+  */
+
+  for (i = 0; i < 1000; i ++)
+  {
+    do_this(i);
+    do_that(i);
+  }
+}
+
+ +

Single-line statements following "do", "else", "for", "if", +and "while" shall be indented 2 spaces as well. Blocks of code +in a "switch" block shall be indented 4 spaces after each "case" +and "default" case:

+ +
+switch (array[i])
+{
+  case STATE_IDLE :
+      do_this(i);
+      do_that(i);
+      break;
+  default :
+      do_nothing(i);
+      break;
+}
+
+ +

Spacing

+ +

A space shall follow each reserved word ("if", "while", etc.) +Spaces shall not be inserted between a function name and the +arguments in parenthesis.

+ +

Return Values

+ +

Parenthesis shall surround values returned from a function +using "return":

+ +
+return (CUPS_STATE_IDLE);
+
+ +

Loops

+ +

Whenever convenient loops should count downward to zero to +improve program performance:

+ +
+for (i = sizeof(array) / sizeof(array[0]) - 1; i >= 0; i --)
+  array[i] = CUPS_STATE_IDLE;
+
+ +

Makefile Guidelines

+ +

The following is a guide to the makefile-based build system +used by CUPS. These standards have been developed over the years +to allow CUPS to be built on as many systems and environments as +possible.

+ +

General Organization

+ +

The CUPS source code is organized functionally into a +top-level makefile, include file, and subdirectories each with +their own makefile and dependencies files. The ".in" files are +template files for the autoconf software and are +used to generate a static version of the corresponding file.

+ +

Makefile Documentation

+ +

Each make file must start with the standard CUPS header +containing the Subversion "$Id$" keyword, description of the +file, and CUPS copyright and license notice:

+ +
+#
+# "$Id$"
+#
+#   Makefile for ...
+#
+#   Copyright 2007 by Apple Inc.
+#
+#   These coded instructions, statements, and computer programs are the
+#   property of Apple Inc. and are protected by Federal copyright
+#   law.  Distribution and use rights are outlined in the file "LICENSE.txt"
+#   which should have been included with this file.  If this file is
+#   file is missing or damaged, see the license at "http://www.cups.org/".
+#
+
+ +

The end of each makefile must have a comment saying:

+ +
+#
+# End of "$Id$".
+#
+
+ +

The purpose of the trailer is to indicate the end of the +makefile so that truncations are immediately obvious.

+ +

Portable Makefile Construction

+ +

CUPS uses a common subset of make program syntax to ensure +that the software can be compiled "out of the box" on as many +systems as possible. The following is a list of assumptions we +follow when constructing makefiles:

+ +
    + +
  • Targets; we assume that the make program + supports the notion of simple targets of the form + "name:" that perform tab-indented commands that follow + the target, e.g.: +
    +target:
    +→ target commands
  • + +
  • Dependencies; we assume that the make program + supports recursive dependencies on targets, e.g.: +
    +target: foo bar
    +→ target commands
    +
    +foo: bla
    +→ foo commands
    +
    +bar:
    +→ bar commands
    +
    +bla:
    +→ bla commands
  • + +
  • Variable Definition; we assume that the make program + supports variable definition on the command-line or in the makefile + using the following form: +
    +name=value
    + +
  • Variable Substitution; we assume that the make program + supports variable substitution using the following forms: +
      +
    • $(name); substitutes the value of "name",
    • +
    • ($name:.old=.new); substitutes the value of "name" + with the filename extensions ".old" changed to ".new",
    • +
    • $(MAKEFLAGS); substitutes the + command-line options passed to the program + without the leading hyphen (-),
    • +
    • $$; substitutes a single $ character,
    • +
    • $<; substitutes the current source file or dependency, and
    • +
    • $@; substitutes the current target name.
    • +
  • + +
  • Suffixes; we assume that the make program + supports filename suffixes with assumed dependencies, e.g.: +
    +.SUFFIXES: .c .o
    +.c.o:
    +→ $(CC) $(CFLAGS) -o $@ -c $<
  • + +
  • Include Files; we assume that the make program + supports the include directive, e.g.: +
    +include ../Makedefs
    +include Dependencies
  • + +
  • Comments; we assume that comments begin with + a # character and proceed to the end of the + current line.
  • + +
  • Line Length; we assume that there is no + practical limit to the length of lines.
  • + +
  • Continuation of long lines; we assume that + the \ character may be placed at the end of a + line to concatenate two or more lines in a + makefile to form a single long line.
  • + +
  • Shell; we assume a POSIX-compatible shell is + present on the build system.
  • + +
+ +

Standard Variables

+ +

The following variables are defined in the "Makedefs" file +generated by the autoconf software:

+ +
    + +
  • AR; the library archiver command,
  • + +
  • ARFLAGS; options for the library archiver command,
  • + +
  • BUILDROOT; optional installation prefix,
  • + +
  • MAN1EXT; extension for man pages in section 1,
  • + +
  • MAN3EXT; extension for man pages in section 3,
  • + +
  • MAN5EXT; extension for man pages in section 5,
  • + +
  • MAN7EXT; extension for man pages in section 7,
  • + +
  • MAN8DIR; subdirectory for man pages in section 8,
  • + +
  • MAN8EXT; extension for man pages in section 8,
  • + +
  • CC; the C compiler command,
  • + +
  • CFLAGS; options for the C compiler command,
  • + +
  • CXX; the C++ compiler command,
  • + +
  • CXXFLAGS; options for the C++ compiler command,
  • + +
  • DSOCOMMAND; the shared library building command,
  • + +
  • DSOFLAGS; options for the shared library building command,
  • + +
  • INSTALL; the install command,
  • + +
  • INSTALL_BIN; the program installation command,
  • + +
  • INSTALL_DATA; the data file installation command,
  • + +
  • INSTALL_DIR; the directory installation command,
  • + +
  • INSTALL_LIB; the library installation command,
  • + +
  • INSTALL_MAN; the documentation installation command,
  • + +
  • INSTALL_SCRIPT; the shell script installation command,
  • + +
  • LDFLAGS; options for the linker,
  • + +
  • LIBS; libraries for all programs,
  • + +
  • LN; the ln command,
  • + +
  • OPTIM; common compiler optimization options,
  • + +
  • RM; the rm command,
  • + +
  • SHELL; the sh (POSIX shell) command,
  • + +
  • STRIP; the strip command,
  • + +
  • bindir; the binary installation directory,
  • + +
  • datadir; the data file installation directory,
  • + +
  • exec_prefix; the installation prefix for executable files,
  • + +
  • libdir; the library installation directory,
  • + +
  • mandir; the man page installation directory,
  • + +
  • prefix; the installation prefix for non-executable files, and
  • + +
  • srcdir; the source directory.
  • + +
+ +

Standard Targets

+ +

The following standard targets must be defined in each +makefile:

+ +
    + +
  • all; creates all target programs, + libraries, and documentation files,
  • + +
  • clean; removes all target programs, + libraries, documentation files, and object files,
  • + +
  • depend; generates automatic dependencies + for any C or C++ source files (also see "Dependencies"),
  • + +
  • distclean; removes autoconf-generated files + in addition to those removed by the "clean" target,
  • + +
  • install; installs all distribution files in + their corresponding locations (also see "Install/Uninstall Support"),
  • + +
  • uninstall; removes all distribution files from + their corresponding locations (also see "Install/Uninstall Support"), and
  • + +
+ + +

Object Files

+ +

Object files (the result of compiling a C or C++ source file) +have the extension ".o".

+ +

Programs

+ +

Program files are the result of linking object files and +libraries together to form an executable file. A typical +program target looks like:

+ +
+program: $(OBJS)
+→ echo Linking $@...
+→ $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
+
+ +

Static Libraries

+ +

Static libraries have a prefix of "lib" and the extension +".a". A typical static library target looks like:

+ +
+libname.a: $(OBJECTS)
+→ echo Creating $@...
+→ $(RM) $@
+→ $(AR) $(ARFLAGS) $@ $(OBJECTS)
+→ $(RANLIB) $@
+
+ +

Shared Libraries

+ +

Shared libraries have a prefix of "lib" and the extension +".dylib", ".sl", ".so", or "_s.a" depending on the operating +system. A typical shared library is composed of several targets +that look like:

+ +
+libname.so: $(OBJECTS)
+→ echo $(DSOCOMMAND) libname.so.$(DSOVERSION) ...
+→ $(DSOCOMMAND) libname.so.$(DSOVERSION) $(OBJECTS)
+→ $(RM) libname.so libname.so.$(DSOMAJOR)
+→ $(LN) libname.so.$(DSOVERSION) libname.so.$(DSOMAJOR)
+→ $(LN) libname.so.$(DSOVERSION) libname.so
+
+libname.sl: $(OBJECTS)
+→ echo $(DSOCOMMAND) libname.sl.$(DSOVERSION) ...
+→ $(DSOCOMMAND) libname.sl.$(DSOVERSION) $(OBJECTS)
+→ $(RM) libname.sl libname.sl.$(DSOMAJOR)
+→ $(LN) libname.sl.$(DSOVERSION) libname.sl.$(DSOMAJOR)
+→ $(LN) libname.sl.$(DSOVERSION) libname.sl
+
+libname.dylib: $(OBJECTS)
+→ echo $(DSOCOMMAND) libname.$(DSOVERSION).dylib ...
+→ $(DSOCOMMAND) libname.$(DSOVERSION).dylib \
+→ → -install_name $(libdir)/libname.$(DSOMAJOR).dylib \
+→ → -current_version libname.$(DSOVERSION).dylib \
+→ → -compatibility_version $(DSOMAJOR).0 \
+→ → $(OBJECTS) $(LIBS)
+→ $(RM) libname.dylib
+→ $(RM) libname.$(DSOMAJOR).dylib
+→ $(LN) libname.$(DSOVERSION).dylib libname.$(DSOMAJOR).dylib
+→ $(LN) libname.$(DSOVERSION).dylib libname.dylib
+
+libname_s.a: $(OBJECTS)
+→ echo $(DSOCOMMAND) libname_s.o ...
+→ $(DSOCOMMAND) libname_s.o $(OBJECTS) $(LIBS)
+→ echo $(LIBCOMMAND) libname_s.a libname_s.o
+→ $(RM) $@
+→ $(LIBCOMMAND) libname_s.a libname_s.o
+→ $(CHMOD) +x libname_s.a
+
+ + +

Dependencies

+ +

Static dependencies are expressed in each makefile following the +target, for example:

+ +
+foo: bar
+
+ +

Static dependencies shall only be used when it is not +possible to automatically generate them. Automatic dependencies +are stored in a file named "Dependencies" and included at the +end of the makefile. The following "depend" target rule shall be +used to create the automatic dependencies: + +

+depend:
+→ $(MAKEDEPEND) -Y -I.. -f Dependencies $(OBJS:.o=.c)
+
+ +

We only regenerate the automatic dependencies on a Linux +system and express any non-Linux dependencies statically in the +makefile.

+ +

Install/Uninstall Support

+ +

All makefiles must contain install and uninstall rules which +install or remove the corresponding software. These rules must +use the $(BUILDROOT) variable as a prefix to any +installation directory so that CUPS can be installed in a +temporary location for packaging by programs like +rpmbuild.

+ +

The $(INSTALL_BIN), $(INSTALL_DATA), +$(INSTALL_DIR), $(INSTALL_LIB), +$(INSTALL_MAN), and $(INSTALL_SCRIPT) +variables must be used when installing files so that the proper +ownership and permissions are set on the installed files.

+ +

The $(RANLIB) command must be run on any static +libraries after installation since the symbol table is +invalidated when the library is copied on some platforms.

+ + + diff --git a/doc/help/spec-command.html b/doc/help/spec-command.html new file mode 100644 index 0000000..af201cb --- /dev/null +++ b/doc/help/spec-command.html @@ -0,0 +1,218 @@ + + + + + CUPS Command File Format + + + + + + +

CUPS Command File Format

+ +

Introduction

+ +

This specification describes the CUPS command file format +(application/vnd.cups-command) which is used to send printer +maintenance commands to a printer in a device-independent way. +The current specification supports basic maintenance functions +such as head cleaning and self-test pages and query functions +such as auto-configure, report supply levels, and report status.

+ +

Printer drivers advertise support for the CUPS command file +format by providing a filter for the +application/vnd.cups-command file type. Applications +can determine if a printer supports printing of CUPS command +files by checking the printer-type attribute for the +CUPS_PRINTER_COMMANDS capability bit.

+ +

In addition, the PPD file for a printer can contain a +cupsCommands keyword that provides a list of supported +commands separated by spaces, for example:

+ +
+*cupsCommand: "AutoConfigure Clean PrintSelfTestPage ReportLevels ReportStatus"
+
+ +

If no cupsCommands keyword is provided, the command filter +must support AutoConfigure, +Clean, +PrintSelfTestPage, +and ReportLevels. The scheduler also +provides the printer-commands attribute containing the list of +supported commands.

+ + +

File Syntax

+ +

CUPS command files are ASCII text files. The first line of a +CUPS command file MUST contain:

+ +
+#CUPS-COMMAND
+
+ +

After that, each line is either a command or a comment. +Comments begin with the # character, e.g.:

+ +
+# This is a comment
+
+ +

Commands are any sequence of letters, numbers, and punctuation characters +optionally followed by parameters separated by whitespace, e.g.:

+ +
+Clean all
+PrintSelfTestPage
+
+ +

Command names are case-insensitive, so "PRINTSELFTESTPAGE", +"printselftestpage", and "PrintSelfTestPage" are equivalent. Vendor-specific +commands should use a domain name prefix, e.g.:

+ +
+com.vendor.foo
+com.vendor.bar param param2 ... paramN
+
+ + +

Standard Commands

+ +

The following are the standard commands supported by the format. The only +required command is +PrintSelfTestPage.

+ + +

AutoConfigure

+ +

AutoConfigure

+ +

The AutoConfigure command updates the printer's PPD file +and driver state information to reflect the current configuration of the +printer. There are no arguments for this command.

+ +

Example:

+ +
+#CUPS-COMMAND
+AutoConfigure
+
+ + +

Clean

+ +

Clean colorname

+ +

The Clean command performs a standard print head cleaning. The +"colorname" parameter specifies which color or head to clean. If a printer does +not support cleaning of individual colors or cartridges, then all colors are +cleaned. Command filters MUST support the "all" colorname. Other standard color +names include "black", "color", "photo", "cyan", "magenta", "yellow", +"light-cyan", "light-magenta", "light-black", "light-gray", and "dark-gray".

+ +

Example:

+ +
+#CUPS-COMMAND
+Clean all
+
+ + +

PrintAlignmentPage

+ +

PrintAlignmentPage pass

+ +

The PrintAlignmentPage command prints a head alignment page on +the printer. The "pass" parameter provides a pass number from 1 to N. The number +of passes is device-dependent.

+ +

Example:

+ +
+#CUPS-COMMAND
+PrintAlignmentPage 1
+
+ + +

PrintSelfTestPage

+ +

PrintSelfTestPage

+ +

The PrintSelfTestPage command prints a self-test page on the +printer. Typically this page shows whether all jets on a print head are +functioning and that the print feed mechanisms are working properly.

+ +

Example:

+ +
+#CUPS-COMMAND
+PrintSelfTestPage
+
+ + +

ReportLevels

+ +

ReportLevels

+ +

The ReportLevels command queries the supply levels on a printer +and reports "marker-colors", "marker-levels", "marker-names", and +"marker-types" attributes using "ATTR:" messages sent to the scheduler. This +command should also report the current printer status using "STATE:" messages +like the ReportStatus command.

+ +

Example:

+ +
+#CUPS-COMMAND
+ReportLevels
+
+ + +

ReportStatus

+ +

ReportStatus

+ +

The ReportStatus command queries the printer for its current +status and reports it using "STATE:" messages sent to the scheduler.

+ +

Example:

+ +
+#CUPS-COMMAND
+ReportLevels
+
+ + +

SetAlignment

+ +

SetAlignment pass value ... valueN

+ +

The SetAlignment command sets print head alignment values. The +"pass" parameter is a number from 1 to N. All parameters are +device-dependent.

+ +

Example:

+ +
+#CUPS-COMMAND
+SetAlignment 1 14
+
+ + + + diff --git a/doc/help/spec-design.html b/doc/help/spec-design.html new file mode 100644 index 0000000..28a14eb --- /dev/null +++ b/doc/help/spec-design.html @@ -0,0 +1,184 @@ + + + + + CUPS Design Description + + + + +

CUPS Design Description

+ +

This design description documents the overall organization of CUPS. The purpose is not to provide a line-by-line description of the CUPS source code, but rather to describe the overall architecture and location of key pieces so that developers can more easily understand the underlying operation of CUPS.

+ +

Introduction

+ +

Like most printing systems, CUPS is designed around a central print scheduling process that dispatches print jobs, processes administrative commands, provides printer status information to local and remote programs, and informs users as needed. Figure 1 shows the basic organization of CUPS.

+ +

Scheduler

+ +

The scheduler is a HTTP/1.1 and IPP/2.1 server application that manages HTTP and IPP requests, printers, classes, jobs, subscriptions, and notifications on the system. HTTP is used for normal web browser services as well as IPP operation messages passed via HTTP POST requests with the application/ipp content type. The scheduler uses a series of helper applications based on the Common Gateway Interface ("CGI") to provide dynamic web interfaces and can be configured to run additional site-specific programs or scripts for the web interface.

+ +

The scheduler is designed as a traditional single-threaded server process which runs external processes to do longer-term operations such as printing, notification, device/driver enumeration, and remote printer monitoring. External processes are normally run as a non-privileged account ("lp") and, on some platforms, with additional restrictions that limit what the processes are allowed to do.

+ +

The maximum number of simultaneous clients and print jobs that can be supported is primarily limited by the available server memory, file descriptors, and CPU - the scheduler itself imposes no hard limits.

+ +
+ + +
Figure 1: CUPS Block Diagram
CUPS Block Diagram
+ +

Config Files

+ +

The scheduler uses several configuration files to store the server settings (cupsd.conf), available classes (classes.conf), available printers (printers.conf), current notification subscriptions (subscriptions.conf), and supported file types and filters (mime.types, mime.convs). In addition, PostScript Printer Description ("PPD") files or interface scripts are associated with each printer, and the scheduler has cache files for remote printers, PPD files, and current jobs to optimize the scheduler's startup speed and availability.

+ +

Job Files

+ +

The scheduler stores job files in a spool directory, typically /var/spool/cups. Two types of files will be found in the spool directory: control files starting with the letter "c" ("c00001", "c99999", "c100000", etc.) and data files starting with the letter "d" ("d00001-001", "d99999-001", "d100000-001", etc.) Control files are IPP messages based on the original IPP Print-Job or Create-Job messages, while data files are the original print files that were submitted for printing. There is one control file for every job known to the system and 0 or more data files for each job. + +

Control files are normally cleaned out after the 500th job is submitted, while data files are removed immediately after a job has successfully printed. Both behaviors can be configured.

+ +

Log Files

+ +

The scheduler keeps three kinds of log files which are normally stored in the /var/log/cups directory. The access_log file lists every HTTP and IPP request that is processed by the scheduler. The error_log file contains messages from the scheduler and its helper applications that can be used +to track down problems. The page_log file lists every page that is printed, allowing for simple print accounting.

+ +

Log files are rotated automatically by the scheduler when they reach the configured size limit, by default 1MB. If the limit is set to 0 then no rotation is performed in the scheduler - this mode is often used by Linux distributions so they can use the logrotated(8) program to rotate them instead.

+ +

Berkeley Commands

+ +

CUPS provides the Berkeley lpc(8), lpq(1), lpr(1), and lprm(1) commands. In general, they function identically to the original Berkeley commands with the following exceptions:

+ +
    + +
  1. The lpc command currently only supports the "status" sub-command.
  2. + +
  3. The lpr command does not support the format modifier options "1" (TROFF font set 1), "2" (TROFF font set 2), "3" (TROFF font set 3), "4" (TROFF font set 4), "c" (CIFPLOT), "d" (DVI), "f" (FORTRAN), "g" (GNU plot), "i" (indentation), "n" (Ditroff), "r" (Sun raster), "t" (Troff), or "w" (width), as they do not map to the IPP MIME media type based document formats.
  4. + +
+ +

System V Commands

+ +

CUPS provides the System V cancel(1), lp(1), lpadmin(8), lpmove(8), and lpstat(1) commands. In general, they function identically to the original System V commands with the following exceptions:

+ +
    + +
  1. All commands may ask for a password; the System V print spooler requires root access to perform administration tasks, while CUPS allows for more flexible configurations.
  2. + +
  3. The lpadmin command does not implement the Solaris "-A" (alert), "-F" (fault recovery), "-M" (mount form/wheel), "-P" (paper list), "-S" (print wheels), "-T" (type list), "-U" (dialer info), "-W" (wait), "-f" (form name), "-l" (content-type list), "-s" (remote printer), or "-t" (number of trays) options.
  4. + +
+ +

CUPS Commands

+ +

CUPS provides the cupsaccept(8), cupsaddsmb(8), cupsdisable(8), cupsenable(8), cupsreject(8), cupstestppd(1), lpinfo(8), and lppasswd(1) commands. The cupsaccept, cupsdisable, cupsenable, and cupsreject commands correspond to the System V accept, disable, enable, and reject commands but have been renamed to avoid confusion and conflicts with the bash(1) internal enable command of the same name.

+ +

LPD Support

+ +

LPD client support is provided via the cups-lpd(8) program. Incoming LPD requests are accepted on TCP port 515 by the local inetd(8), launchd(8), or xinetd(8) process and forwarded to the cups-lpd program for conversion to the corresponding IPP request(s).

+ +

The cups-lpd program conforms, for the most part, to RFC 1179: Line Printer Daemon Protocol, but does not enforce the privileged source port restriction specified in that document. In addition, the banner page and output format options are usually overridden via command-line options to the cups-lpd program when it is invoked by the corresponding super-daemon program.

+ +

Web Interface

+ +

The web interface is supported by five CGI programs. Table 1 describes the purpose of each of the programs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: CGI Programs
ProgramLocationDescription
admin.cgi/adminProvides all of the administrative functions
classes.cgi/classesLists classes and provides class management functions
help.cgi/helpProvides access to online help documents
jobs.cgi/jobsLists jobs and provides job management functions
printers.cgi/printersLists printers and provides printer management functions
+ +

Notifiers

+ +

Notifiers (notifier(7)) provide the means for sending asynchronous event notifications from the scheduler. Notifiers are executed with the recipient information on the command-line and the event data on the standard input. For example:

+ +
+CUPS_SERVERBIN/notifier/foo recipient user-data
+
+ +

CUPS includes two notifiers: mailto to provide SMTP-based email notifications and rss to provide Really Simple Syndication ("RSS") notifications from the scheduler. Additional notifiers can be installed in the notifier directory as needed to support other methods.

+ +

Filters

+ +

Filters (filter(7)) convert job files into a printable format. Multiple filters are run, as needed, to convert from the job file format to the printable format. A filter program reads from the standard input or from a file if a filename is supplied. All filters must support a common set of options including printer name, job ID, username, job title, number of copies, and job options. All output is sent to the standard output.

+ +

CUPS provides filters for printing text, PostScript, PDF, HP-GL/2, and many types of image files. CUPS also provides printer driver filters for HP-PCL, ESC/P, and several types of label printers. Additional filters can be registered with CUPS via mime.convs and PPD files.

+ +

Port Monitors

+ +

Port monitors handle the device- and channel-specific data formatting for a printer. Port monitors use the same interface as filters.

+ +

CUPS includes two port monitors: the bcp port monitor which supports the PostScript Binary Communications Protocol ("BCP") and the tbcp port monitor which supports the PostScript Tagged Binary Communications Protocol ("TBCP"). Additional port monitors can be registered in PPD files.

+ +

Backends

+ +

Backends (backend(7)) send print data to the printer and enumerate available printers/devices as needed. Backends use the same interface as filters.

+ +

CUPS includes backends for AppSocket (JetDirect), IPP, LPD, parallel, SCSI, serial, and USB connections. Additional backends can be added as needed without additional configuration.

+ + +

Programming Interfaces

+ +

CUPS makes use of several general-purpose libraries to provide its printing services. Unlike the rest of CUPS, the libraries are provided under the terms of the GNU LGPL so they may be used by non-GPL applications.

+ +

CUPS Library (libcups)

+ +

The CUPS library contains all of the core HTTP and IPP communications code as well as convenience functions for queuing print jobs, getting printer information, accessing resources via HTTP and IPP, and manipulating PPD files. The scheduler and all commands, filters, and backends use this library.

+ +

CUPS CGI Library (libcupscgi)

+ +

The CUPS CGI library provides all of the web interface support functions. It is used by the CGI programs to provide the CUPS web interface.

+ +

CUPS Driver Library (libcupsdriver)

+ +

The CUPS driver library provides access to the dithering, color conversion, and helper functions used by the CUPS sample printer drivers.

+ +

CUPS Imaging Library (libcupsimage)

+ +

The CUPS imaging library provides functions for managing large images, doing colorspace conversion and color management, scaling images for printing, and managing raster page streams. It is used by the CUPS image file filters, the PostScript RIP, and all raster printers drivers.

+ +

CUPS MIME Library (libcupsmime)

+ +

The CUPS MIME library provides file typing and conversion functions and is used by the scheduler and cupsfilter(8) command to auto-type and convert print files to a printable format.

+ +

CUPS PPD Compiler Library (libcupsppdc)

+ +

The CUPS PPD compiler library provides access to driver information files and is used by the PPD compiler tools as well as the cups-driverd(8) helper program to generate PPD files and message catalogs for localization.

+ + + + diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html new file mode 100644 index 0000000..98bc057 --- /dev/null +++ b/doc/help/spec-ipp.html @@ -0,0 +1,2879 @@ + + + + + CUPS Implementation of IPP + + + + + + +

CUPS Implementation of IPP

+ +

Introduction

+ +

CUPS implements IPP/2.1 and the operations and attributes +defined in the "IPP: Job and Printer Set Operations", "IPP/1.1: +Output-bin Attribute Extension", and "IPP/1.1: finishings +'fold',' trim', and 'bale' attribute values extension" +specifications.

+ +

CUPS also provides 16 new operations and many new attributes +to support multiple IPP printers and printer classes on a single +host.

+ +

IPP URIs

+ +

CUPS supports the "http", "https", and "ipp" schemes. The +following resource names are used:

+ +
+ +
scheme://hostname:port/
+ +
Can be used for all "get" operations and for server + subscriptions.
+ +
scheme://hostname:port/admin/
+ +
Used for all administrative operations.
+ +
scheme://hostname:port/classes/name
+ +
Specifies a printer class.
+ +
scheme://hostname:port/jobs/id
+ +
Specifies a job.
+ +
scheme://hostname:port/printers/name
+ +
Specifies a printer.
+ +
+ +

So a typical printer URI would be +"ipp://foo.bar.com/printers/LaserJet". In addition, the CUPS +server also supports normal browser access via +"http://hostname:port/" and "https://hostname:port/".

+ +

CUPS IPP Operations

+ +

CUPS provides 16 extension operations in addition to most of the +standard IPP and registered extension operations: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Operation NameCUPSCodeBrief Description
Print-Job1.00x0002Print a file.
Validate-Job1.00x0004Validate job attributes.
Create-Job1.10x0005Create a print job.
Send-Document1.10x0006Send a file for a print job.
Cancel-Job1.00x0008Cancel a print job.
Get-Job-Attributes1.00x0009Get job attributes.
Get-Jobs1.00x000AGet all jobs.
Get-Printer-Attributes1.00x000BGet printer attributes.
Hold-Job1.10x000CHold a job for printing.
Release-Job1.10x000DRelease a job for printing.
Restart-Job1.10x000ERestarts a print job.
Pause-Printer1.00x0010Pause printing on a printer.
Resume-Printer1.00x0011Resume printing on a printer.
Purge-Jobs1.00x0012Purge all jobs.
Set-Job-Attributes1.10x0014Set attributes for a pending or held job.
Create-Printer-Subscription1.20x0016Creates a subscription associated with a printer or the server.
Create-Job-Subscription1.20x0017Creates a subscription associated with a job.
Get-Subscription-Attributes1.20x0018Gets the attributes for a subscription.
Get-Subscriptions1.20x0019Gets the attributes for zero or more subscriptions.
Renew-Subscription1.20x001ARenews a subscription.
Cancel-Subscription1.20x001BCancels a subscription.
Get-Notifications1.20x001CGet notification events for ippget subscriptions.
Enable-Printer1.20x0022Accepts jobs on a printer.
Disable-Printer1.20x0023Rejects jobs on a printer.
CUPS-Get-Default1.00x4001Get the default destination.
CUPS-Get-Printers1.00x4002Get all of the available printers.
CUPS-Add-Modify-Printer1.00x4003Add or modify a printer.
CUPS-Delete-Printer1.00x4004Delete a printer.
CUPS-Get-Classes1.00x4005Get all of the available printer classes.
CUPS-Add-Modify-Class1.00x4006Add or modify a printer class.
CUPS-Delete-Class1.00x4007Delete a printer class.
CUPS-Accept-Jobs1.00x4008Accept jobs on a printer or printer class.
CUPS-Reject-Jobs1.00x4009Reject jobs on a printer or printer class.
CUPS-Set-Default1.00x400ASet the default destination.
CUPS-Get-Devices1.10x400BGet all of the available devices.
CUPS-Get-PPDs1.10x400CGet all of the available PPDs.
CUPS-Move-Job1.10x400DMove a job to a different printer.
CUPS-Authenticate-Job1.20x400EAuthenticate a job for printing.
CUPS-Get-PPD1.30x400FGet a PPD file.
CUPS-Get-Document1.40x4027Get a document file from a job.
+ +

Operations

+ +

The following sections describe the operations supported by CUPS. +In the interest of brevity, operations which use only the standard +IPP attributes are not described. + +

Print-Job Operation

+ +

The Print-Job operation (0x0002) prints a file. + +

Print-Job Request

+ +

The following groups of attributes are supplied as part of the +Print-Job request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer. + +
+ +

Group 2: Job Template Attributes + +

+ +
"auth-info" (1setOf text(MAX)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute. + +
"job-billing" (text(MAX)):CUPS 1.1 + +
The client OPTIONALLY supplies a billing string that is logged + with the page accounting information. + +
"job-sheets" (1setof type3 keyword | name(MAX)):CUPS 1.1 + +
The client OPTIONALLY supplies one or two banner pages that + are printed before and after any files in the print job. The + name of "none" is reserved to indicate that no banner page + should be printed. If the client does not specify this + attribute then the value of the "job-sheets-default" printer + object attribute is used. + +
Note: Standard IPP only allows + specification of a single job-sheets attribute + value.
+ +
"media" (1setof type3 keyword | name(MAX)): + +
The client OPTIONALLY supplies one or more media attributes + specifying the size, type, source, and color of the output + media. If the client does not specify this attribute then the + value of the "media-default" printer object attribute is used. + +
Note: Standard IPP only allows + specification of a single media attribute + value.
+ +
Other Job Template Attributes + +
+ +

The Print-Job request is followed by a file to be printed. + +

Print-Job Response

+ +

The following groups of attributes are send as part of the Print-Job +Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Job Attributes + +

+ +
Standard Job Attributes + +
+ +

Group 3: Unsupported Attributes (status=client-eror-attributes-or-values-not-supported) + +

+ +
auth-info-required (1setOf Type2 keyword) + +
The required authentication information. + +
+ +

CUPS 1.1Create-Job Operation

+ +

The Create-Job operation (0x0005) creates a new, empty print job. + +

Create-Job Request

+ +

The following groups of attributes are supplied as part of the +Create-Job request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer. + +
+ +

Group 2: Job Template Attributes + +

+ +
"auth-info" (1setOf text(MAX)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute. + +
"job-billing" (text(MAX)):CUPS 1.1 + +
The client OPTIONALLY supplies a billing string that is logged + with the page accounting information. + +
"job-sheets" (1setof type3 keyword | name(MAX)):CUPS 1.1 + +
The client OPTIONALLY supplies one or two banner pages that + are printed before and after any files in the print job. The + name of "none" is reserved to indicate that no banner page + should be printed. If the client does not specify this + attribute then the value of the "job-sheets-default" printer + object attribute is used. + +
Note: Standard IPP only allows + specification of a single job-sheets attribute + value.
+ +
"media" (1setof type3 keyword | name(MAX)): + +
The client OPTIONALLY supplies one or more media attributes + specifying the size, type, source, and color of the output + media. If the client does not specify this attribute then the + value of the "media-default" printer object attribute is used. + +
Note: Standard IPP only allows + specification of a single media attribute + value.
+ +
Standard Job Template Attributes + +
+ +

Create-Job Response

+ +

The following groups of attributes are send as part of the +Create-Job Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Job Attributes + +

+ +
Standard Job Attributes + +
+ +

Group 3: Unsupported Attributes (status=client-eror-attributes-or-values-not-supported) + +

+ +
auth-info-required (1setOf Type2 keyword) + +
The required authentication information. + +
+ +

Cancel Job Operation

+ +

The Cancel-Job operation (0x0008) cancels the specified job. CUPS 1.4 adds +a new purge-job (boolean) attribute that allows you to purge both +active and completed jobs, removing all history and document files for the +job as well. + +

Cancel-Job Request

+ +

The following groups of attributes are supplied as part of the +Cancel-Job request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) and "job-id" (integer) +
OR +
"job-uri": + +
The client MUST supply a URI for the specified printer and + a job ID number, or the job URI. + +
CUPS 1.4/Mac OS X 10.6"purge-job" (boolean): + +
The client OPTIONALLY supplies this attribute. When true, + all job files (history and document) are purged. The default + is false, leading to the standard IPP behavior. + +
+ +

Cancel-Job Response

+ +

The following groups of attributes are send as part of the Cancel-Job +Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Purge-Jobs Operation

+ +

The Purge-Jobs operation (0x0012) cancels all of the jobs on a +given destination and optionally removes all history and document +files for the jobs as well. + +

Purge-Jobs Request

+ +

The following groups of attributes are supplied as part of the +Purge-Jobs request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer or + "ipp://.../printers" for all printers and classes. + +
CUPS 1.2/Mac OS X 10.5"requesting-user-name" (name(MAX)): + +
The client OPTIONALLY supplies this attribute to specify whose jobs + jobs are purged or canceled. + +
CUPS 1.2/Mac OS X 10.5"my-jobs" (boolean): + +
The client OPTIONALLY supplies this attribute to specify that only + the jobs owned by the requesting user are purged or canceled. The + default is false. + +
CUPS 1.2/Mac OS X 10.5"purge-jobs" (boolean): + +
The client OPTIONALLY supplies this attribute to specify + whether the jobs are purged (true) or just canceled (false). + The default is true. + +
+ +

Purge-Jobs Response

+ +

The following groups of attributes are send as part of the Purge-Jobs +Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS 1.1Set-Job-Attributes Operation

+ +

The Set-Job-Attributes operation (0x0014) changes the attributes of +an active (not completed) job. + +

Set-Job-Attributes Request

+ +

The following groups of attributes are supplied as part of the +Set-Job-Attributes request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) and "job-id" (integer) +
OR +
"job-uri": + +
The client MUST supply a URI for the specified printer and + a job ID number, or the job URI. + +
+ +

Group 2: Job Template Attributes + +

+ +
"job-sheets" (1setof type3 keyword | name(MAX)):CUPS 1.1 + +
The client OPTIONALLY supplies one or two banner pages that + are printed before and after any files in the print job. The + name of "none" is reserved to indicate that no banner page + should be printed. If the client does not specify this + attribute then the value of the "job-sheets-default" printer + object attribute is used. + +
Note: Standard IPP only allows + specification of a single job-sheets attribute + value.
+ +
"media" (1setof type3 keyword | name(MAX)): + +
The client OPTIONALLY supplies one or more media attributes + specifying the size, type, source, and color of the output + media. If the client does not specify this attribute then the + value of the "media-default" printer object attribute is used. + +
Note: Standard IPP only allows + specification of a single media attribute + value.
+ +
Other Job Template Attributes + +
+ +

Set-Job-Attributes Response

+ +

The following groups of attributes are send as part of the Set-Job-Attributes +Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS 1.2/Mac OS X 10.5Create-Printer-Subscription

+ +

The Create-Printer-Subscription operation (0x0016) creates a +subscription for printer or server event notifications. CUPS +provides several additional events in addition to the standard +events in the IPP notifications specification.

+ +

Create-Printer-Subscription Request

+ +

The following groups of attributes are supplied as part of the +request:

+ +

Group 1: Operation Attributes

+ +
+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The printer + (ipp://server/printers/printername), class + (ipp://server/classes/classname), or server + (ipp://server/) URI for event notifications. + +
"notify-events" (1setOf keyword): + +
The events to monitor. In addition to the standard + events, CUPS adds the following keywords: +
    + +
  • printer-added - Get notified + whenever a printer or class is added
  • + +
  • printer-deleted - Get notified + whenever a printer or class is deleted
  • + +
  • printer-modified - Get notified + whenever a printer or class is modified
  • + +
  • server-audit - Get notified when a + security condition occurs
  • + +
  • server-restarted - Get notified when + the server is restarted
  • + +
  • server-started - Get notified when + the server is started
  • + +
  • server-stopped - Get notified when + the server is stopped
  • + +
+ +
+ +

Create-Printer-Subscription Response

+ +

The following groups of attributes are send as part of the +response:

+ +

Group 1: Operation Attributes

+ +
+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Subscription Object Attributes

+ +
+ +
"subscription-id" (integer): + +
The subscription number. + +
+ +

CUPS-Get-Default Operation

+ +

The CUPS-Get-Default operation (0x4001) returns the default printer +URI and attributes. + +

CUPS-Get-Default Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Get-Default request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"requested-attributes" (1setOf keyword) : + +
The client OPTIONALLY supplies a set of attribute names + and/or attribute group names in whose values the requester is + interested. If the client omits this attribute, the server + responds as if this attribute had been supplied with a value of + 'all'. + +
+ +

CUPS-Get-Default Response

+ +

The following groups of attributes are send as part of the +CUPS-Get-Default Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Printer Object Attributes + +

+ +
The set of requested attributes and their current values. + +
+ +

CUPS-Get-Printers Operation

+ +

The CUPS-Get-Printers operation (0x4002) returns the printer +attributes for every printer known to the system. This may include +printers that are not served directly by the server. + +

CUPS-Get-Printers Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Get-Printers request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"first-printer-name" (name(127)):CUPS 1.2/Mac OS X 10.5 + +
The client OPTIONALLY supplies this attribute to + select the first printer that is returned. + +
"limit" (integer (1:MAX)): + +
The client OPTIONALLY supplies this attribute limiting the + number of printers that are returned. + +
"printer-location" (text(127)): CUPS 1.1.7 + +
The client OPTIONALLY supplies this attribute to + select which printers are returned. + +
"printer-type" (type2 enum): CUPS 1.1.7 + +
The client OPTIONALLY supplies a printer type enumeration to + select which printers are returned. + +
"printer-type-mask" (type2 enum): CUPS 1.1.7 + +
The client OPTIONALLY supplies a printer type mask + enumeration to select which bits are used in the "printer-type" + attribute. + +
"requested-attributes" (1setOf keyword) : + +
The client OPTIONALLY supplies a set of attribute names + and/or attribute group names in whose values the requester is + interested. If the client omits this attribute, the server + responds as if this attribute had been supplied with a value of + 'all'. + +
"requested-user-name" (name(127)) : CUPS 1.2/Mac OS X 10.5 + +
The client OPTIONALLY supplies a user name that is used to filter + the returned printers. + +
+ +

CUPS-Get-Printers Response

+ +

The following groups of attributes are send as part of the +CUPS-Get-Printers Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Printer Object Attributes + +

+ +
The set of requested attributes and their current values for + each printer. + +
+ +

CUPS-Add-Modify-Printer Operation

+ +

The CUPS-Add-Modify-Printer operation (0x4003) adds a new printer or +modifies an existing printer on the system. + +

CUPS-Add-Modify-Printer Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Add-Modify-Printer request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer. + +
+ +

Group 2: Printer Object Attributes + +

+ +
"auth-info-required" (1setOf type2 keyword):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies one or more authentication keywords that are required to communicate with the printer/remote queue. + +
"job-sheets-default" (1setOf name(127)): CUPS 1.1.7 + +
The client OPTIONALLY supplies one or two banner page + names that are printed before and after files in a job. + The reserved name "none" is used to specify that no + banner page should be printed. + +
"device-uri" (uri): + +
The client OPTIONALLY supplies a device URI for the + specified printer. + +
"port-monitor" (name(127)): + +
The client OPTIONALLY supplies a port monitor name for the + specified printer. + +
"ppd-name" (name(127)): + +
The client OPTIONALLY supplies a PPD name for the specified + printer. + +
"printer-is-accepting-jobs" (boolean): + +
The client OPTIONALLY supplies this boolean attribute + indicating whether or not the printer object should accept new jobs. + +
"printer-info" (text(127)): + +
The client OPTIONALLY supplies this attribute indicating the + printer information string. + +
"printer-location" (text(127)): + +
The client OPTIONALLY supplies this attribute indicating a + textual location of the printer. + +
"printer-more-info" (uri): + +
The client OPTIONALLY supplies this attribute indicating a + URI for additional printer information. + +
"printer-state" (type2 enum): + +
The client OPTIONALLY supplies this attribute indicating the + initial/current state of the printer. Only the "idle" and "stopped" + enumerations are recognized. + +
"printer-state-message" (text(MAX)): + +
The client OPTIONALLY supplies this attribute indicating a + textual reason for the current printer state. + +
"requesting-user-name-allowed" (1setof name(127) | delete) +
OR +
"requesting-user-name-denied" (1setof name(127) | delete): + +
The client OPTIONALLY supplies one of these attributes to + specify an access control list for incoming print jobs. To allow + all users access to a printer, use the delete tag for the + attribute value. + +
+ +

The CUPS-Add-Modify-Printer request can optionally be followed by a PPD +file or System V interface script to be used for the printer. The +"ppd-name" attribute overrides any file that is attached to the end of +the request with a local CUPS PPD file. + +

CUPS-Add-Modify-Printer Response

+ +

The following groups of attributes are send as part of the +CUPS-Add-Modify-Printer Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Delete-Printer Operation

+ +

The CUPS-Delete-Printer operation (0x4004) removes an existing +printer from the system. + +

CUPS-Delete-Printer Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Delete-Printer request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer. + +
+ +

CUPS-Delete-Printer Response

+ +

The following groups of attributes are send as part of the +CUPS-Delete-Printer Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Get-Classes Operation

+ +

The CUPS-Get-Classes operation (0x4005) returns the printer +attributes for every printer class known to the system. This may +include printer classes that are not served directly by the server. + +

CUPS-Get-Classes Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Get-Classes request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"first-printer-name" (name(127)):CUPS 1.2/Mac OS X 10.5 + +
The client OPTIONALLY supplies this attribute to + select the first printer that is returned. + +
"limit" (integer (1:MAX)): + +
The client OPTIONALLY supplies this attribute limiting the + number of printer classes that are returned. + +
"printer-location" (text(127)): CUPS 1.1.7 +
The client OPTIONALLY supplies this attribute to + select which printer classes are returned. + +
"printer-type" (type2 enum): CUPS 1.1.7 +
The client OPTIONALLY supplies a printer type enumeration to + select which printer classes are returned. + +
"printer-type-mask" (type2 enum): CUPS 1.1.7 +
The client OPTIONALLY supplies a printer type mask + enumeration to select which bits are used in the "printer-type" + attribute. + +
"requested-attributes" (1setOf keyword) : + +
The client OPTIONALLY supplies a set of attribute names + and/or attribute group names in whose values the requester is + interested. If the client omits this attribute, the server responds as + if this attribute had been supplied with a value of 'all'. + +
"requested-user-name" (name(127)) : CUPS 1.2/Mac OS X 10.5 + +
The client OPTIONALLY supplies a user name that is used to filter + the returned printers. + +
+ +

CUPS-Get-Classes Response

+ +

The following groups of attributes are send as part of the +CUPS-Get-Classes Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Printer Class Object Attributes + +

+ +
The set of requested attributes and their current values for + each printer class. + +
+ +

CUPS-Add-Modify-Class Operation

+ +

The CUPS-Add-Modify-Class operation (0x4006) adds a new printer class or +modifies and existing printer class on the system. + +

CUPS-Add-Modify-Class Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Add-Modify-Class request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer class. + +
+ +

Group 2: Printer Object Attributes + +

+ +
"auth-info-required" (1setOf type2 keyword):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies one or more authentication keywords that are required to communicate with the printer/remote queue. + +
"member-uris" (1setof uri): + +
The client OPTIONALLY supplies the "member-uris" set + specifying the printers and printer classes that are part of the class. + +
"printer-is-accepting-jobs" (boolean): + +
The client OPTIONALLY supplies this boolean attribute + indicating whether or not the class object should accept new jobs. + +
"printer-info" (text(127)): + +
The client OPTIONALLY supplies this attribute indicating the + printer information string. + +
"printer-location" (text(127)): + +
The client OPTIONALLY supplies this attribute indicating a + textual location of the class. + +
"printer-more-info" (uri): + +
The client OPTIONALLY supplies this attribute indicating a + URI for additional class information. + +
"printer-state" (type2 enum): + +
The client OPTIONALLY supplies this attribute indicating the + initial/current state of the class. Only the "idle" and "stopped" + enumerations are recognized. + +
"printer-state-message" (text(MAX)): + +
The client OPTIONALLY supplies this attribute indicating a + textual reason for the current class state. + +
"requesting-user-name-allowed" (1setof name(127)) +
OR +
"requesting-user-name-denied" (1setof name(127)): + +
The client OPTIONALLY supplies one of these attributes to + specify an access control list for incoming print jobs. To allow + all users access to a class, use the delete tag for the + attribute value. + +
+ +

CUPS-Add-Modify-Class Response

+ +

The following groups of attributes are send as part of the CUPS-Add-Modify-Class Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Delete-Class Operation

+ +

The CUPS-Delete-Class operation (0x4007) removes an existing printer +class from the system. + +

CUPS-Delete-Class Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Delete-Class request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer class. + +
+ +

CUPS-Delete-Class Response

+ +

The following groups of attributes are send as part of the +CUPS-Delete-Class Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Accept-Jobs Operation

+ +

The CUPS-Accept-Jobs operation (0x4008) sets the +"printer-is-accepting-jobs" attribute to true for the specified printer +or printer class. + +

CUPS-Accept-Jobs Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Accept-Jobs request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer or printer class. + +
+ +

CUPS-Accept-Jobs Response

+ +

The following groups of attributes are send as part of the +CUPS-Accept-Jobs Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Reject-Jobs Operation

+ +

The CUPS-Reject-Jobs operation (0x4009) sets +the"printer-is-accepting-jobs" attribute to false for the specified +printer or printer class. + +

CUPS-Reject-Jobs Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Reject-Jobs request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer or printer class. + +
+ +

Group 2: Printer Object Attributes + +

+ +
"printer-state-message" (text(MAX)): + +
The client OPTIONALLY supplies this attribute indicating a + textual reason for the current printer state. + +
+ +

CUPS-Reject-Jobs Response

+ +

The following groups of attributes are send as part of the +CUPS-Reject-Jobs Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS-Set-Default Operation

+ +

The CUPS-Set-Default operation (0x400A) sets the default printer +destination for all clients when a resource name of "/printers" is +specified. + +

CUPS-Set-Default Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Set-Default request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The client MUST supply a URI for the specified printer or + printer class. + +
+ +

CUPS-Set-Default Response

+ +

The following groups of attributes are send as part of the +CUPS-Set-Default Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS 1.1CUPS-Get-Devices Operation

+ +

The CUPS-Get-Devices operation (0x400B) returns all of the +supported device-uri's for the server.

+ +

CUPS-Get-Devices Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Get-Devices request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"device-class" (type1 keyword): + +
The client OPTIONALLY supplies a device class keyword to select + which devices are returned. + +
"exclude-schemes" (1setOf name) :CUPS 1.4/Mac OS X 10.6 + +
The client OPTIONALLY supplies a set of scheme names that the + requestor does not want to discover. If the client omits this attribute, + the server responds with devices of all schemes specified by + the "include-schemes" attribute. + +
"include-schemes" (1setOf name) :CUPS 1.4/Mac OS X 10.6 + +
The client OPTIONALLY supplies a set of scheme names that the + requestor wants to discover. If the client omits this attribute, + the server responds with devices of all schemes except those specified + by the "exclude-schemes" attribute. + +
"limit" (integer (1:MAX)): + +
The client OPTIONALLY supplies this attribute limiting the number of + devices that are returned. + +
"requested-attributes" (1setOf keyword) : + +
The client OPTIONALLY supplies a set of attribute names and/or + attribute group names in whose values the requester is interested. If + the client omits this attribute, the server responds as if this + attribute had been supplied with a value of 'all'. + +
"timeout" (integer (1:MAX)) :CUPS 1.4/Mac OS X 10.6 + +
The client OPTIONALLY supplies this attribute to limit the duration + of the lookup. The default timeout is 15 seconds. + +
+ +

CUPS-Get-Devices Response

+ +

The following groups of attributes are send as part of the +CUPS-Get-Devices Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Device Object Attributes + +

+ +
The set of requested attributes and their current values for + each device. + +
+ +

CUPS 1.1CUPS-Get-PPDs Operation

+ +

The CUPS-Get-PPDs operation (0x400C) returns all of the +locally available PPD files on the system.

+ +

CUPS-Get-PPDs Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Get-PPDs request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"exclude-schemes" (1setOf name) :CUPS 1.4/Mac OS X 10.6 + +
The client OPTIONALLY supplies a set of scheme names that the + requestor does not want to list. If the client omits this attribute, + the server responds with PPDs of all schemes specified by the + "include-schemes" attribute. + +
"include-schemes" (1setOf name) :CUPS 1.4/Mac OS X 10.6 + +
The client OPTIONALLY supplies a set of scheme names that the + requestor wants to list. If the client omits this attribute, the server + responds with PPDs of all schemes except those specified by the + "exclude-schemes" attribute. + +
"limit" (integer (1:MAX)): + +
The client OPTIONALLY supplies this attribute limiting the number of PPDs that are returned. + +
"ppd-make" (text(127)): + +
The client OPTIONALLY supplies a printer manufacturer to select which PPDs are returned. + +
"ppd-make-and-model" (text(127)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a make and model to select which PPDs are returned. + +
"ppd-model-number" (integer):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a model number to select which PPDs are returned. + +
"ppd-natural-language" (naturalLanguage):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a language to select which PPDs are returned. + +
"ppd-product" (text(127)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a PostScript product string to select which PPDs are returned. + +
"ppd-psversion" (text(127)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a PostScript version string to select which PPDs are returned. + +
"ppd-type" (type1 keyword):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a driver type to select which PPDs are returned. + +
"requested-attributes" (1setOf keyword) : + +
The client OPTIONALLY supplies a set of attribute names and/or attribute group names in whose values the requester is interested. If the client omits this attribute, the server responds as if this attribute had been supplied with a value of 'all'. Specify "ppd-make" to get a list of manufacturers. + +
+ +

CUPS-Get-PPDs Response

+ +

The following groups of attributes are send as part of the +CUPS-Get-PPDs Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: PPD Attributes + +

+ +
The set of requested attributes and their current values for each + PPD file. + +
+ +

CUPS 1.1CUPS-Move-Job Operation

+ +

The CUPS-Move-Job operation (0x400D) moves an active print job or all print +jobs for a printer to a different printer.

+ +

CUPS-Move-Job Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Move-Job request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) +
OR +
"printer-uri" (uri) and "job-id" (integer) +
OR +
"job-uri": + +
The client MUST supply a URI for the specified printer, the URI for + the specified printer and a job ID number, or the job URI. + +
+ +

Group 2: Job Template Attributes + +

+ +
"job-printer-uri" (uri) + +
The client MUST supply a URI for a printer on the same server. + +
+ +

CUPS-Move-Job Response

+ +

The following groups of attributes are send as part of the +CUPS-Move-Job Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

CUPS 1.2/Mac OS X 10.5CUPS-Authenticate-Job Operation

+ +

The CUPS-Authenticate-Job operation (0x400E) authenticates a print job for +printing, releasing the job if it is held. Typically this is used when printing +to a remote server. The authentication information is passed in the HTTP +request; the HTTP connection is normally encrypted for this type of request.

+ +

CUPS-Authenticate-Job Request

+ +

The following groups of attributes are supplied as part of the +CUPS-Authenticate-Job request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) and "job-id" (integer) +
OR +
"job-uri": + +
The client MUST supply a URI for the specified printer and + a job ID number, or the job URI. + +
+ +

Group 2: Job Attributes + +

+ +
"auth-info" (1setOf text(MAX)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies one or more authentication values as specified by the "auth-info-required" attribute. + +
"job-hold-until" (keyword | name(MAX)):CUPS 1.3/Mac OS X 10.5 + +
The client OPTIONALLY supplies a new job-hold-until value for the + job. If specified and not the "no-hold" value, the job is held instead + of released for printing. + +
+ +

CUPS-Authenticate-Job Response

+ +

The following groups of attributes are send as part of the +CUPS-Authenticate-Job Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
+ +

Group 2: Unsupported Attributes (status=client-eror-attributes-or-values-not-supported) + +

+ +
auth-info-required (1setOf Type2 keyword) + +
The required authentication information. + +
+ +

CUPS 1.3/Mac OS X 10.5CUPS-Get-PPD Operation

+ +

The CUPS-Get-PPD operation (0x400F) gets a PPD file from the +server. The PPD file can be specified using a ppd-name +returned by CUPS-Get-PPDs +or using the printer-uri for a queue.

+ +

If the PPD file is found, successful-ok is returned with +the PPD file following the response data.

+ +

If the PPD file cannot be served by the local server because +the printer-uri attribute points to an external printer, +a cups-see-other status is returned with the correct +URI to use.

+ +

If the PPD file does not exist, client-error-not-found is +returned.

+ +

CUPS-Get-PPD Request

+ +

The following group of attributes is supplied as part of the +CUPS-Get-PPD request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) +
OR +
"ppd-name" (name(255)): + +
The client MUST supply a printer URI or PPD name. + +
+ +

CUPS-Get-PPD Response

+ +

The following group of attributes is sent as part of the +CUPS-Get-PPD Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
"printer-uri" (uri): + +
The printer that provides the actual PPD file when + the status code is cups-see-other (0x280) + +
+ +

If the status code is successful-ok, the PPD file follows +the end of the IPP response.

+ +

CUPS 1.4/Mac OS X 10.6CUPS-Get-Document Operation

+ +

The CUPS-Get-Document operation (0x4027) gets a document file from a +job on the server. The document file is specified using the +document-number and either the job-uri or printer-uri +and job-id identifying the job.

+ +

If the document file is found, successful-ok is returned with +the document file following the response data.

+ +

If the document file does not exist, client-error-not-found is +returned.

+ +

If the requesting user does not have access to the document file, +client-error-not-authorized is returned. + +

CUPS-Get-Document Request

+ +

The following group of attributes is supplied as part of the +CUPS-Get-Document request: + +

Group 1: Operation Attributes + +

+ +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.1 of the IPP Model and + Semantics document. + +
"printer-uri" (uri) and "job-id" (integer) +
OR +
"job-uri" (uri): + +
The client MUST supply a printer URI and job ID or job URI. + +
"document-number" (integer(1:MAX)): + +
The client MUST supply a document number to retrieve. The + document-count attribute for the job defines the maximum + document number that can be specified. In the case of jobs with + banners (job-sheets is not "none"), document number 1 + will typically contain the start banner and document number N + will typically contain the end banner. + +
+ +

CUPS-Get-Document Response

+ +

The following group of attributes is sent as part of the +CUPS-Get-Document Response: + +

Group 1: Operation Attributes + +

+ +
Status Message: + +
The standard response status message. + +
Natural Language and Character Set: + +
The "attributes-charset" and "attributes-natural-language" + attributes as described in section 3.1.4.2 of the IPP Model and + Semantics document. + +
"document-format" (mimeType): + +
The format of the document file. + +
"document-number" (integer(1:MAX)): + +
The requested document number. + +
"document-name" (name(MAX)): + +
The name that was supplied with the document, if any. + +
+ +

If the status code is successful-ok, the document file follows +the end of the IPP response.

+ + +

Attributes

+ +

CUPS provides many extension attributes to support multiple +devices, PPD files, standard job filters, printers, and printer +classes.

+ +

Device Attributes

+ +

Device attributes are returned by the CUPS-Get-Devices +operation and enumerate all of the available hardware devices and +network protocols that are supported by the server.

+ +

device-class (type2 keyword)

+ +

The device-class attribute specifies the class of device and can be +one of the following: + +

    + +
  • "file" - a disk file. + +
  • "direct" - a parallel or fixed-rate serial data port, + currently used for Centronics, IEEE-1284, and USB printer + ports. + +
  • "serial" - a variable-rate serial port. + +
  • "network" - a network connection, typically via AppSocket, + HTTP, IPP, LPD, or SMB/CIFS protocols. + +
+ +

device-id (text(127))CUPS 1.2/Mac OS X 10.5

+ +

The device-id attribute specifies the IEEE-1284 device ID +string for the device.

+ +

device-info (text(127))

+ +

The device-info attribute specifies a human-readable string describing +the device, e.g. "Parallel Port #1". + +

device-location (text(127))CUPS 1.4/Mac OS X 10.6

+ +

The device-location attribute specifies the physical location of the +printer. + +

device-make-and-model (text(127))

+ +

The device-make-and-model attribute specifies a device +identification string provided by the printer connected to the device. +If the device or printer does not support identification then this +attribute contains the string "unknown". + +

device-uri (uri)

+ +

The device-uri attribute specifies a unique identifier for the +device. The actual format of the device-uri string depends on the value +of the device-class attribute: + +

    + +
  • "file" - The device-uri will be of the form + "file:///path/to/filename". + +
  • "direct" - The device-uri will be of the form + "scheme:/dev/filename" or "scheme://vendor/identifier", + where scheme may be "parallel" or "usb" in the current + implementation. + +
  • "serial" - The device-uri will be of the form + "serial:/dev/filename?baud=value+parity=value+flow=value". + The baud value is the data rate in bits per second; the + supported values depend on the underlying hardware. + The parity value can be one of "none", "even", or "odd". + The flow value can be one of "none", "soft" (XON/XOFF + handshaking), "hard" or "rts/cts" (RTS/CTS handshaking), + or "dtrdsr" (DTR/DSR handshaking). + +

    The URI returned by CUPS-Get-Devices will contain the + maximum baud rate supported by the device and the best + type of flow control available ("soft" or "hard"). + +

  • "network" - The device-uri will be of the form + "scheme://[username:password@]hostname[:port]/[resource]", + where scheme may be "http", "https", "ipp", "lpd", "smb", or + "socket" in the current implementation. + +

    The URI returned by CUPS-Get-Devices will only contain + the scheme name ("scheme"). It is up to the client + application to add the appropriate host and other + information when adding a new printer. + +

    The URI returned by Get-Printer-Attributes and + CUPS-Get-Printers has any username and password information + stripped; the information is still stored and used by the + server internally to perform any needed authentication. + +

+ +

Job Template Attributes

+ +

auth-info (1setOf text(MAX))CUPS 1.3/Mac OS X 10.5

+ +

The auth-info attribute specifies the authentication information to use when printing to a remote device. The order and content of each text value is specifed by the auth-info-required printer attribute. + +

blackplot (boolean)

+ +

The blackplot attribute specifies whether HP-GL/2 plot files should be +rendered entirely in black ink (blackplot=true) or using the colors and shades +specified in the file (blackplot=false). The default value is false. + +

brightness (integer(0:200))Deprecated

+ +

The brightness attribute specifies the overall brightness of the printed +output in percent. A brightness of 100 is normal, while 200 is twice as +bright and 50 is half as bright. The default value is 100. + +

Brightness is applied to the Cyan, Magenta, Yellow, and Black values using +the function "f(x) = brightness / 100 * x". + +

Note: + +

This attribute is deprecated and will be removed from a future CUPS +release.

+ +
+ +

columns (integer(1:4)) Deprecated

+ +

The columns attribute specifies the number of columns to generate when +printing text files. The default value is 1. + +

cpi (type2 enum)

+ +

The cpi attribute specifies the number of characters per inch when +printing text files. Only the values 10, 12, and 17 are currently +supported. The default value is 10. + +

document-count (integer(1:MAX))

+ +

The document-count attribute specifies the number of documents that +are present in the job. + +

fit-to-page (boolean)CUPS 1.4/Mac OS X 10.6

+ +

The fit-to-page attribute specifies whether to scale documents to fit on the +selected media (fit-to-page=true) or use the physical size specified in the +document (fit-to-page=false). The default value is false. + +

fitplot (boolean)Deprecated

+ +

The fitplot attribute specifies whether to scale HP-GL/2 plot files to +fit on the selected media (fitplot=true) or use the physical scale specified +in the plot file (fitplot=false). The default value is false. + +

gamma (integer(1:10000))Deprecated

+ +

The gamma attribute specifies the luminance correction for the output. +A value of 1000 specifies no correction, while values of 2000 and 500 will +generate lighter and darker output, respectively. The default value is +1000. + +

Gamma is applied to the Red, Green, and Blue values (or luminance for +grayscale output) using the function "f(x) = x(1000/gamma)". + +

Note: + +

This attribute is deprecated and will be removed from a future CUPS +release.

+ +
+ +

hue (integer(-180:180))Deprecated

+ +

The hue attribute specifies a color hue rotation when printing image +files. The default value is 0. + +

Note: + +

This attribute is deprecated and will be removed from a future CUPS +release.

+ +
+ +

job-billing (text(MAX))CUPS 1.1

+ +

The job-billing attribute provides a text value to associate with a job +for billing purposes. + +

job-hold-until (keyword | name(MAX))CUPS 1.1

+ +

The job-hold-until attribute specifies a hold time. In addition to the +standard IPP/1.1 keyword names, CUPS supports name values of the form +"HH:MM" and "HH:MM:SS" that specify a hold time. The hold time is in +Universal Coordinated Time (UTC) and not in the local time zone. If the +specified time is less than the current time, the job is held until the +next day. + +

job-media-progress (integer(0:100))CUPS 1.4/Mac OS X 10.6

+ +

The job-media-progress attribute specifies the percentage of completion of +the current page. It is only valid when the job-state attribute has the +"processing" value (5).

+ +

job-printer-state-message (text(MAX))CUPS 1.3/Mac OS X 10.5

+ +

The job-printer-state-message attribute provides the last known value of the printer-state-message attribute for the printer that processed (or is processing) the job.

+ +

job-printer-state-reasons (1setOf type2 keyword)CUPS 1.3/Mac OS X 10.5

+ +

The job-printer-state-reasons attribute provides the last known value of the printer-state-reasons attribute for the printer that processed (or is processing) the job.

+ +

job-sheets (1setof type3 keyword | name(MAX))CUPS 1.1

+ +

The job-sheets attribute specifies one or two banner files that are printed +before and after a job. The reserved value of "none" disables banner printing. +The default value is stored in the job-sheets-default attribute. + +

If only one value is supplied, the banner file is printed before the job. +If two values are supplied, the first value is used as the starting banner +file and the second as the ending banner file. + +

job-originating-host-name (name(MAX))

+ +

(CUPS 1.1.5 and higher) + +

The job-originating-host-name attribute specifies the host +from which the job was queued. The value will be the hostname or +IP address of the client depending on whether hostname +resolution is enabled. The localhost address (127.0.0.1) is +always resolved to the name "localhost". + +

This attribute is read-only. + +

lpi (type2 enum)

+ +

The lpi attribute specifies the number of lines per inch when +printing text files. Only the values 6 and 8 are currently supported. +The default value is 6. + +

mirror (boolean)

+ +

The mirror attribute specifies whether pages are mirrored on +their X axis, which is useful for printing transfer images on +special media. The default value is false. + +

natural-scaling (integer(1:1000))CUPS 1.1.9

+

The natural-scaling attribute specifies the scaling of image files with +respect to the natural image size. A value of 100 specifies that the image +file should exactly the natural size, while 50 is half the natural size +and 200 is twice the natural size. The default value is 100. + +

The ppi option can be used to override the natural resolution of the +image, which controls the natural size. + +

number-up-layout (type2 keyword)CUPS 1.1.15

+

The number-up-layout attribute specifies the order each input +page is placed on each output page. The following keywords are +presently defined: + +

    + +
  • btlr - Bottom to top, left to right
  • + +
  • btrl - Bottom to top, right to left
  • + +
  • lrbt - Left to right, bottom to top
  • + +
  • lrtb - Left to right, top to bottom (default)
  • + +
  • rlbt - Right to left, bottom to top
  • + +
  • rltb - Right to left, top to bottom
  • + +
  • tblr - Top to bottom, left to right
  • + +
  • tbrl - Top to bottom, right to left
  • + +
+ +

page-border (type2 keyword)CUPS 1.1.15

+

The page-border attribute specifies whether a border is +draw around each page. The following keywords are presently +defined: + +

    + +
  • double - Two hairline borders are drawn
  • + +
  • double-thick - Two 1pt borders are drawn
  • + +
  • none - No border is drawn (default)
  • + +
  • single - A single hairline border is drawn
  • + +
  • single-thick - A single 1pt border is drawn
  • + +
+ +

page-bottom (integer(0:MAX))

+ +

The page-bottom attribute specifies the bottom margin in points (72 points +equals 1 inch). The default value is the device physical margin. + +

page-label (text(MAX))CUPS 1.1.7

+

The page-label attribute provides a text value to place in +the header and footer on each page. If a classification level is +set on the server, then this classification is printed before +the page label. + +

page-left (integer(0:MAX))

+ +

The page-left attribute specifies the left margin in points (72 points +equals 1 inch). The default value is the device physical margin. + +

page-right (integer(0:MAX))

+ +

The page-right attribute specifies the right margin in points (72 points +equals 1 inch). The default value is the device physical margin. + +

page-set (type2 keyword)

+ +

The page-set attribute specifies which pages to print in a file. The +supported keywords are "all", "even", and "odd". The default value is +"all". + +

page-top (integer(0:MAX))

+ +

The page-top attribute specifies the top margin in points (72 points +equals 1 inch). The default value is the device physical margin. + +

penwidth (integer(0:MAX))

+ +

The penwidth attribute specifies the default pen width in micrometers +when printing HP-GL/2 plot files. The default value is 1000 (1 millimeter). + +

position (type2 keyword)

+ +

The position attribute specifies the location of image files on the +media. The following keyword values are recognized: + +

    + +
  • center - Center the image on the page (default) + +
  • top - Print the image centered at the top of the page + +
  • left - Print the image centered on the left of page + +
  • right - Print the image centered on the right of the page + +
  • top-left - Print the image at the top left corner of + the page + +
  • top-right - Print the image at the top right corner of + the page + +
  • bottom - Print the image centered at the bottom of + the page + +
  • bottom-left - Print the image at the bottom left + corner of the page + +
  • bottom-right - Print the image at the bottom right + corner of the page + +
+ +

ppi (integer(1:MAX))

+ +

The ppi attribute specifies the resolution of an image file in pixels +per inch. The default value is the resolution included with the file or +128 if no resolution information is available. + +

prettyprint (boolean)

+ +

The prettyprint attribute specifies whether text files should be printed +with a shaded header and keyword highlighting (prettyprint=true) or without +additional formatting (prettyprint=false). The default value is false. + +

saturation (integer(0:200))Deprecated

+ +

The saturation attribute specifies the color saturation when +printing image files. A saturation of 100 is normal, while values of 50 +and 200 will be half and twice as colorful, respectively. The default +value is 100. + +

Note: + +

This attribute is deprecated and will be removed from a future CUPS +release.

+ +
+ +

scaling (integer(1:1000))

+ +

The scaling attribute specifies the scaling of image files with +respect to the selected media. A value of 100 specifies that the image +file should fit 100% of the page, or as much as possible given the +image dimensions. The default value is unspecified. + +

The scaling attribute overrides the ppi attribute if specified. + +

wrap (boolean)

+ +

The wrap attribute specifies whether long lines should be wrapped +(wrap=true) or not (wrap=false) when printing text files. The default +value is true. + +

PPD Attributes

+ +

ppd-device-id (text(127))

+ +

The ppd-device-id attribute specifies the IEEE-1284 device ID +string for the device described by the PPD file.

+ +

ppd-make (text(127))

+ +

The ppd-make attribute specifies the manufacturer of the printer +(the Manufacturer attribute in the PPD file). If the manufacturer +is not specified in the PPD file then an educated guess is made using +the NickName attribute in the PPD file. + +

ppd-make-and-model (text(127))

+ +

The ppd-make-and-model attribute specifies the manufacturer and model +name of the PPD file (the NickName attribute in the PPD file). If the +make and model is not specified in the PPD file then the ModelName or +ShortNickName attributes are used instead. + +

ppd-model-number (integer)CUPS 1.3/Mac OS X 10.5

+ +

The ppd-model-number attribute provides the cupsModelNumber value from the PPD file. + +

ppd-name (name(255))

+ +

The ppd-name attribute specifies either the PPD filename on the server relative to the model directory or a URI that maps to a specific driver interface in the driver directory. The forward slash (/) is used to delineate directories. + +

ppd-natural-language (1setOf naturalLanguage)

+ +

The ppd-natural-language attribute specifies the language encoding +of the PPD file (the LanguageVersion attribute in the PPD file). If the +language is unknown or undefined then "en" (English) is assumed. + +

ppd-product (1setOf text(127))

+ +

The ppd-product attribute specifies the Product attribute values in the PPD file. + +

ppd-psversion (1setOf text(127))CUPS 1.3/Mac OS X 10.5

+ +

The ppd-product attribute specifies the PSVersion attribute values in the PPD file. + +

ppd-type (type1 keyword)CUPS 1.3/Mac OS X 10.5

+ +

The ppd-type attribute specifies the type of driver described by the PPD file:

+ +
    + +
  • fax - A facsimile or multi-function device
  • + +
  • pdf - A PDF printer
  • + +
  • postscript - A PostScript printer (no filters)
  • + +
  • raster - A CUPS raster driver
  • + +
  • unknown - An unknown or hybrid driver
  • + +
+ + +

Printer Attributes

+ +

auth-info-required (1setOf type2 keyword)CUPS 1.3/Mac OS X 10.5

+ +

The auth-info-required attribute specifies the authentication information that is required for printing a job. The following keywords are recognized:

+ +
    + +
  • domain - A domain name is required.
  • + +
  • none - No authentication is required - this keyword can only appear by itself.
  • + +
  • password - A password is required.
  • + +
  • username - A username is required.
  • + +
+ +

job-k-limit (integer)CUPS 1.1

+ +

The job-k-limit attribute specifies the maximum number of kilobytes that +may be printed by a user, including banner files. The default value of 0 +specifies that there is no limit. + +

job-page-limit (integer)CUPS 1.1

+ +

The job-page-limit attribute specifies the maximum number of pages that +may be printed by a user, including banner files. The default value of 0 +specifies that there is no limit. + +

job-quota-period (integer)CUPS 1.1

+ +

The job-quota-period attribute specifies the time period used for quota +calculations, in seconds. The default value of 0 specifies that the limits +apply to all jobs that have been printed by a user that are still known to +the system. + +

job-sheets-supported (1setof type3 keyword | name(MAX))CUPS 1.1

+ +

The job-sheets-supported attribute specifies the available banner files. +There will always be at least one banner file available called "none". + +

marker-change-time (integer)CUPS 1.3/Mac OS X 10.5

+ +

The marker-change-time attribute specifies the printer-up-time value when +the last change to the marker-colors, marker-levels, marker-message, +marker-names, or marker-types attributes was made.

+ +

marker-colors (1setof name(MAX))CUPS 1.3/Mac OS X 10.5

+ +

The marker-colors attribute specifies the color(s) for each supply in the +printer. It is only available when the driver provides supply levels. The +color is either "none" or one or more hex-encoded sRGB colors of the form +"#RRGGBB".

+ +

marker-high-levels (1setof integer(0:100))CUPS 1.4/Mac OS X 10.6

+ +

The marker-high-levels attribute specifies the supply levels that indicate +a near-full condition. A value of 100 should be used for supplies that are +consumed/emptied, e.g. ink cartridges.

+ +

marker-levels (1setof integer(-3:100))CUPS 1.3/Mac OS X 10.5

+ +

The marker-levels attribute specifies the current supply levels for the +printer. It is only available when the driver provides supply levels. A +value of -1 indicates the level is unavailable, -2 indicates unknown, and -3 +indicates the level is unknown but has not yet reached capacity. Values from 0 +to 100 indicate the corresponding percentage.

+ +

marker-low-levels (1setof integer(0:100))CUPS 1.4/Mac OS X 10.6

+ +

The marker-low-levels attribute specifies the supply levels that indicate +a near-empty condition. A value of 0 should be used for supplies that are +filled, e.g. waste ink tanks.

+ +

marker-message (text(MAX))CUPS 1.4/Mac OS X 10.6

+ +

The marker-message attribute provides a human-readable status message +for the current supply levels, e.g. "12 pages of ink remaining." It is only +available when the driver provides supply levels.

+ +

marker-names (1setof name(MAX))CUPS 1.3/Mac OS X 10.5

+ +

The marker-names attribute specifies the name(s) for each supply in the +printer. It is only available when the driver provides supply levels.

+ +

marker-types (1setof type3 keyword)CUPS 1.3/Mac OS X 10.5

+ +

The marker-types attribute specifies the type(s) of each supply in the +printer. It is only available when the driver provides supply levels. The +following (RFC 3805) types are currently supported:

+ +
    + +
  • toner
  • + +
  • wasteToner
  • + +
  • ink
  • + +
  • inkCartridge
  • + +
  • inkRibbon
  • + +
  • wasteInk
  • + +
  • opc
  • + +
  • developer
  • + +
  • fuserOil
  • + +
  • solidWax
  • + +
  • ribbonWax
  • + +
  • wasteWax
  • + +
  • fuser
  • + +
  • coronaWire
  • + +
  • fuserOilWick
  • + +
  • cleanerUnit
  • + +
  • fuserCleaningPad
  • + +
  • transferUnit
  • + +
  • tonerCartridge
  • + +
  • fuserOiler
  • + +
  • water
  • + +
  • wasteWater
  • + +
  • bindingSupply
  • + +
  • bandingSupply
  • + +
  • stichingWire
  • + +
  • shrinkWrap
  • + +
  • paperWrap
  • + +
  • staples
  • + +
  • inserts
  • + +
  • covers
  • + +
+ +

port-monitor" (name(127))

+ +

The port-monitor attribute specifies the port monitor to use when printing +to this printer. The default port monitor is "none". + +

port-monitor-supported" (1setOf name(127))

+ +

The port-monitor-supported attribute specifies the available port monitors. + +

printer-commands (1setOf Type3 keyword)CUPS 1.4/Mac OS X 10.6

+ +

The printer-commands attribute specifies the commands that are supported +by the CUPS command file filter. The keyword "none" indicates that no commands +are supported.

+ +

printer-dns-sd-name (name(MAX) | noValue)CUPS 1.4/Mac OS X 10.6

+ +

The printer-dns-sd-name attribute specifies the registered DNS-SD service +name for the printer. If the printer is not being shared using this protocol, +printer-dns-sd-name will have the noValue value.

+ +

printer-state-reasons (1setOf type2 keyword)

+ +

The printer-state-reasons attribute provides additional persistent state +information for a printer. In addition to the keywords defined in RFC 2911, +CUPS supports vendor-specific keywords with a domain prefix ("com.vendor.foo") +and the following CUPS-specific keywords:

+ +
    + +
  • cups-insecure-filter-warning - a filter or backend (or the + directory containing the filter or backend) has insecure file + permissions. CUPS will not execute programs with world write permissions + or setuid programs. When run as root (the default), CUPS also does not + execute programs that are not owned by root. + CUPS 1.4/Mac OS X 10.6
  • + +
  • cups-missing-filter-warning - a filter or backend is not + installed. CUPS 1.4/Mac OS X 10.6
  • + +
+ +

printer-type (type2 enum)

+ +

The printer-type attribute specifies printer type and +capability bits for the printer or class. The default value is +computed from internal state information and the PPD file for the +printer. The following bits are defined:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BitDescription
0x00000001Is a printer class.
0x00000002Is a remote destination.
0x00000004Can print in black.
0x00000008Can print in color.
0x00000010Can print on both sides of the page in hardware.
0x00000020Can staple output.
0x00000040Can do fast copies in hardware.
0x00000080Can do fast copy collation in hardware.
0x00000100Can punch output.
0x00000200Can cover output.
0x00000400Can bind output.
0x00000800Can sort output.
0x00001000Can handle media up to US-Legal/A4.
0x00002000Can handle media from US-Legal/A4 to ISO-C/A2.
0x00004000Can handle media larger than ISO-C/A2.
0x00008000Can handle user-defined media sizes.
0x00010000Is an implicit (server-generated) class.
0x00020000Is the a default printer on the network.
0x00040000Is a facsimile device.
0x00080000Is rejecting jobs.
0x00100000Delete this queue.
0x00200000Queue is not shared.
0x00400000Queue requires authentication.
0x00800000Queue supports CUPS command files.
0x01000000Queue was automatically discovered and added.
0x02000000Queue is a scanner with no printing capabilities.
0x04000000Queue is a printer with scanning capabilities.
+ +

printer-type-mask (type2 enum)CUPS 1.1

+ +

The printer-type-mask attribute is used to choose printers or classes with +the CUPS-Get-Printers and CUPS-Get-Classes operations. The bits are defined +identically to the printer-type attribute and default to all 1's. + +

requesting-user-name-allowed (1setof name(127))CUPS 1.1

+ +

The requesting-user-name-allowed attribute lists all of the users that are +allowed to access a printer or class. Either this attribute or the +requesting-user-name-denied attribute will be defined, but not both. + +

requesting-user-name-denied (1setof name(127))CUPS 1.1

+ +

The requesting-user-name-denied attribute lists all of the users that are +not allowed to access a printer or class. Either this attribute or the +requesting-user-name-allowed attribute will be defined, but not both. + +

Printer Class Attributes

+ +

member-names (1setof name(127))

+ +

The member-names attribute specifies each of the printer-name attributes of +the member printers and classes. Each name corresponds to the same element of +the member-uris attribute. + +

member-uris (1setof uri)

+ +

The member-uris attribute specifies each of the printer-uri attributes of +the member printers and classes. Each URI corresponds to the same element of +the member-names attribute. + + + diff --git a/doc/help/spec-pdf.html b/doc/help/spec-pdf.html new file mode 100644 index 0000000..407f478 --- /dev/null +++ b/doc/help/spec-pdf.html @@ -0,0 +1,24 @@ + + + + + CUPS PDF Format + + + + +

CUPS PDF Format

+ +

CUPS PDF files (application/vnd.cups-pdf) are device-dependent +PDF/A files that contain a job ticket information. These files +are typically produced by the CUPS pdftopdf filter +which handles job ticket generation, imposition, page labeling, +scaling, and other formatting options requested by the user. CUPS +PDF files are intended for direct consumption by a PDF-capable +printer, PDF RIP, or the pdftops filter.

+ +

More information will be posted here as the PDF workflow +filters are added to CUPS.

+ + + diff --git a/doc/help/spec-postscript.html b/doc/help/spec-postscript.html new file mode 100644 index 0000000..3aa99c4 --- /dev/null +++ b/doc/help/spec-postscript.html @@ -0,0 +1,148 @@ + + + + + Generating PostScript for CUPS + + + + + + +

Generating PostScript for CUPS

+ +

Introduction

+ +

This document describes how to generate PostScript output for +CUPS and is largely based on the +Adobe TechNote #5001: PostScript Language Document Structuring +Conventions Specification Version 3.0. While CUPS can +generally print any PostScript file, following the rules in the +Adobe TechNote and this document will ensure that your PostScript +output will work reliably.

+ +
Note: While PostScript is currently the +de-facto standard print job file format/language for UNIX-based +applications, it is slowly being phased out in favor of Adobe's +Portable Document Format ("PDF") which offers many advantages +over PostScript. Mac OS X uses PDF as the primary print job file +format and Linux is making the transition. Both PostScript and +PDF are complex formats, and we highly recommend using high-level +toolkits whenever possible to create your print jobs.
+ +

Anatomy of a PostScript File

+ +

PostScript files are ASCII text files starting with a header +line (%!PS-Adobe-3.0) followed by a combination of +comment lines starting with the percent sign (%) and +PostScript code lines. The lines themselves should not exceed 255 +characters to conform to the DSC. The following short PostScript +file produces a box with a smiley face in it:

+ +
+%!PS-Adobe-3.0
+%%BoundingBox: 36 36 576 756
+%%Pages: 1
+%%LanguageLevel: 2
+%%EndComments
+%%BeginSetup
+% this is where fonts would be embedded
+%%EndSetup
+%%Page: (1) 1
+%%BeginPageSetup
+% this is where page-specific features would be specified
+%%EndPageSetup
+% Draw a black box around the page
+0 setgray
+1 setlinewidth
+36 36 540 720 rectstroke
+
+% Draw a two inch blue circle in the middle of the page
+0 0 1 setrgbcolor
+306 396 144 0 360 arc closepath fill
+
+% Draw two half inch yellow circles for eyes
+1 1 0 setrgbcolor
+252 432 36 0 360 arc closepath fill
+360 432 36 0 360 arc closepath fill
+
+% Draw the smile
+1 setlinecap
+18 setlinewidth
+306 396 99 200 340 arc stroke
+
+% Print it!
+showpage
+%%EOF
+
+ + + + +

Embedding Printer Options

+ +

There are two main strategies for embedding printer options in PostScript +files. The first is to list CUPS options using the %cupsJobTicket +comment:

+ +
+%!PS-Adobe-3.0
+%cupsJobTicket: media=A4 sides=two-sided-long-edge
+%cupsJobTicket: PrinterOption=foo PrinterOption2=bar
+...
+%%EndComments
+
+ +

CUPS options apply to the entire job. To apply options to individual pages, +use the %%IncludeFeature comment instead:

+ +
+%%Page: label 123
+%%BeginPageSetup
+%%IncludeFeature: *PageSize A4
+%%IncludeFeature: *PrinterOption Foo
+%%IncludeFeature: *PrinterOption2 Bar
+%%EndPageSetup
+...
+
+ + +

Embedding Fonts and Text

+ +

Always embed the fonts used by your print job, and for best performance +embed the fonts and character encodings in the setup section of the PostScript +file. Type 1 and Type 3 fonts are supported by all PostScript printers, while +Type 42 (TrueType) and CID fonts are supported by most level 2 and all level 3 +PostScript printers. Binary font files should always be converted to the +corresponding ASCII (hex) encoding to avoid problems when printing over +interfaces that do not support binary PostScript.

+ + +

Embedding Images

+ +

The image operator should be used to embed images in PostScript +files. Always use ASCII hex or Base-85 encoding for the image data to avoid +problems when printing over interfaces that do not support binary PostScript. +In most cases, the Base-85 encoding and compression filters can be used to +embed images with very little, if any, increase in data size.

+ + + diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html new file mode 100644 index 0000000..f92725d --- /dev/null +++ b/doc/help/spec-ppd.html @@ -0,0 +1,2340 @@ + + + + + CUPS PPD Extensions + + + + + + +
+ + +

CUPS PPD Extensions

+ +

This specification describes the attributes and extensions that CUPS adds to Adobe TechNote #5003: PostScript Printer Description File Format Specification Version 4.3. PostScript Printer Description ("PPD") files describe the capabilities of each printer and are used by CUPS to support printer-specific features and intelligent filtering.

+ + +

Contents

+ +

PPD File Syntax

+ +

The PPD format is text-based and uses lines of up to 255 characters terminated by a carriage return, linefeed, or combination of carriage return and line feed. The following ABNF definition [RFC5234] defines the general format of lines in a PPD file:

+ +
+PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)
+
+HEADER   = "*PPD-Adobe:" *WSP DQUOTE VERSION DQUOTE LINE-END
+
+VERSION  = "4.0" / "4.1" / "4.2" / "4.3"
+
+COMMENT  = "*%" *TCHAR LINE-END
+
+DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
+           1*(*WSP VALUE) LINE-END
+
+VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE
+
+KCHAR    = ALPHA / DIGIT / "_" / "." / "-"
+
+SCHAR    = LINE-END / WSP / %x21.23-7E.A0-FF
+
+TCHAR    = %x20-7E.A0-FF
+
+LINE-END = CR / LF / CR LF
+
+ + +

Auto-Configuration

+ +

CUPS supports several methods of auto-configuration via PPD keywords.

+ +

Mac OS X 10.5APAutoSetupTool

+ +

*APAutoSetupTool: "/LibraryPrinters/vendor/filename"

+ +

This Mac OS X keyword defines a program that sets the default option choices. It is run when a printer is added from the Add Printer window or the Nearby Printers list in the Print dialog.

+ +

The program is provided with two arguments: the printer's device URI and the PPD file to be used for the printer. The program must write an updated PPD file to stdout.

+ +

Examples:

+ +
+*% Use our setup tool when adding a printer
+*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"
+
+ +

Mac OS X 10.2/CUPS 1.4?MainKeyword

+ +

*?MainKeyword: "
+ PostScript query code that writes a message using the = operator...
+"
+*End

+ +

The ?MainKeyword keyword defines PostScript code that determines the currently selected/enabled option keyword (choice) for the main keyword (option). It is typically used when communicating with USB, serial, Appletalk, and AppSocket (port 9100) printers.

+ +

The PostScript code typically sends its response back using the = operator.

+ +

Example:

+ +
+*OpenUI OptionDuplex/Duplexer Installed: Boolean
+*DuplexOptionDuplex: False
+*OptionDuplex False/Not Installed: ""
+*OptionDuplex True/Installed: ""
+
+*% Query the printer for the presence of the duplexer option...
+*?OptionDuplex: "
+  currentpagedevice /Duplex known
+  {(True)} {(False)} ifelse
+  = flush
+"
+*End
+*CloseUI: OptionDuplex
+
+ +

Mac OS X 10.4/CUPS 1.5OIDMainKeyword

+ +

*?OIDMainKeyword: ".n.n.n..."
+*OIDMainKeyword OptionKeyword1: "value"
+...
+*OIDMainKeyword OptionKeywordN: "value"

+ +

The OIDMainKeyword keyword is used to define SNMP OIDs that map to installable options. The first (query) line defines the OID to lookup on the network device. The second and subsequent keywords define a mapping from OID value to option keyword. Since SNMP is an IP-based network protocol, this method is typically only used to configure AppSocket, IPP, and LPD network printers.

+ +

Examples:

+ +
+*% Get the installed memory on the printer...
+*?OIDInstalledMemory: ".1.3.6.1.2.1.25.2.2.0"
+*OIDInstalledMemory 16MB: "16384 KBytes"
+*OIDInstalledMemory 32MB: "32768 KBytes"
+*OIDInstalledMemory 48MB: "49152 KBytes"
+*OIDInstalledMemory 72MB: "73728 KBytes"
+
+ + +

Color Profiles

+ +

CUPS supports three types of color profiles. The first type is based on sRGB and is used by the standard CUPS raster filters and GPL Ghostscript. The second type is based on ICC profiles and is used by the Quartz-based filters on MacOS X. The final type is based on well-known colorspaces such as sRGB and Adobe RGB.

+ +
Note: + +

At this time, none of the CUPS raster filters support ICC profiles. This will be addressed as time and resources permit.

+ +
+ +

DeprecatedcupsColorProfile

+ +

*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"

+ +

This string keyword specifies an sRGB-based color profile consisting of gamma and density controls and a 3x3 CMY color transform matrix. This keyword is not supported on Mac OS X.

+ +

The Resolution and MediaType values may be "-" to act as a wildcard. Otherwise they must match one of the Resolution or MediaType option keywords defined in the PPD file.

+ +

The density and gamma values define gamma and +density adjustment function such that:

+ +
+f(x) = density * x gamma
+
+ +

The m00 through m22 values define a 3x3 transformation matrix for the CMY color values. The density function is applied after the CMY transformation:

+ +
+| m00 m01 m02 |
+| m10 m11 m12 |
+| m20 m21 m22 |
+
+ +

Examples:

+ +
+*% Specify a profile for printing at 360dpi on all media types
+*cupsColorProfile 360dpi/-: "1.0 1.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+*% Specify a profile for printing at 720dpi on Glossy media
+*cupsColorProfile 720dpi/Glossy: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+*% Specify a default profile for printing at all other resolutions and media types
+*cupsColorProfile -/-: "0.9 2.0 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+ + +

Mac OS X 10.3/CUPS 1.2cupsICCProfile

+ +

*cupsICCProfile ColorModel.MediaType.Resolution/Description: "filename"

+ +

This keyword specifies an ICC color profile that is used to convert the document colors to the device colorspace. The ColorModel, MediaType, and Resolution option keywords specify a selector for color profiles. If omitted, the color profile will match any option keyword for the corresponding main keyword.

+ +

The Description specifies human-readable text that is associated with the color profile. The filename portion specifies the ICC color profile to use; if the filename is not absolute, it is loaded relative to the /usr/share/cups/profiles directory.

+ +

Examples:

+ +
+*% Specify a profile for CMYK printing at 360dpi on all media types
+*cupsICCProfile CMYK..360dpi/360dpi CMYK: "/Library/Printers/vendor/Profiles/foo-360-cmyk.icc"
+
+*% Specify a profile for RGB printing at 720dpi on Glossy media
+*cupsColorProfile RGB.Glossy.720dpi/720dpi Glossy: "/Library/Printers/vendor/Profiles/foo-720-glossy-rgb.icc"
+
+*% Specify a default profile for printing at all other resolutions and media types
+*cupsICCProfile ../Default: "/Library/Printers/vendor/Profiles/foo-default.icc"
+
+ +

Customizing the Profile Selection Keywords

+ +

The ColorModel, MediaType, and Resolution main keywords can be reassigned to different main keywords, allowing drivers to do color profile selection based on different parameters. The cupsICCQualifier1, cupsICCQualifier2, and cupsICCQualifier3 keywords define the mapping from selector to main keyword:

+ +
+*cupsICCQualifier1: MainKeyword1
+*cupsICCQualifier2: MainKeyword2
+*cupsICCQualifier3: MainKeyword3
+
+ +

The default mapping is as follows:

+ +
+*cupsICCQualifier1: ColorModel
+*cupsICCQualifier2: MediaType
+*cupsICCQualifier3: Resolution
+
+ +

Mac OS X 10.4Custom Color Matching Support

+ +

*APSupportsCustomColorMatching: true
+*APCustomColorMatchingName name/text: ""
+*APCustomColorMatchingProfile: profile
+*APDefaultCustomColorMatchingProfile: profile

+ +

These keywords tell the Mac OS X raster filters that the printer driver provides its own custom color matching and that generic color profiles should be used when generating 1-, 3-, and 4-component raster data as requested by the driver. The APCustomColorMatchingProfile and APDefaultColorMatchingProfile keywords specify alternate color profiles (sRGB or AdobeRGB) to use for 3-color (RGB) raster data.

+ +
Note: + +

Prior to Mac OS X 10.6, the default RGB color space was Apple's "GenericRGB". The new default in Mac OS X 10.6 and later is "sRGB". For more information, see "Mac OS X v10.6: About gamma 2.2" on Apple's support site.

+ +
+ +

Mac OS X 10.5APCustomColorMatchingName

+ +

*APCustomColorMatchingName name/text: ""

+ +

This keyword defines an alternate name for the color matching provided by a driver in the Color Matching print panel. The default is to use the name "Vendor Matching" or its localized equivalent.

+ +

Examples:

+ +
+*% Define the names for our color matching...
+*APCustomColorMatchingName name/AcmeColor(tm): ""
+*fr.APCustomColorMatchingName name/La AcmeColor(tm): ""
+
+ +

Mac OS X 10.5APCustomColorMatchingProfile

+ +

*APCustomColorMatchingProfile: name

+ +

This keyword defines a supported RGB color profile that can be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported. If not specified, RGB data will use the GenericRGB colorspace.

+ +
Note: + +

If you provide multiple APCustomColorMatchingProfile keywords, you are responsible for providing the necessary user interface controls to select the profile in a print dialog pane. Add the named profile to the print settings using the key kPMCustomColorMatchingProfileKey.

+ +
+ +

Examples:

+ +
+*% Use sRGB for RGB color by default, but support both sRGB and AdobeRGB
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+*APCustomColorMatchingProfile: sRGB
+*APCustomColorMatchingProfile: AdobeRGB
+
+ +

Mac OS X 10.5APDefaultCustomColorMatchingProfile

+ +

*APDefaultCustomColorMatchingProfile: name

+ +

This keyword defines the default RGB color profile that will be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported.

+ +

Examples:

+ +
+*% Use sRGB for RGB color by default
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+
+ +

Mac OS X 10.4APSupportsCustomColorMatching

+ +

*APSupportsCustomColorMatching: boolean

+ +

This keyword specifies that the driver provides its own custom color matching. When true, the default hand-off colorspace will be GenericGray, GenericRGB, or GenericCMYK depending on the number of components the driver requests. The APDefaultCustomColorMatchingProfile keyword can be used to override the default 3-component (RGB) colorspace.

+ +

The default for APSupportsCustomColorMatching is false.

+ +

Examples:

+ +
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+
+ + +

Constraints

+ +

Constraints are option choices that are not allowed by the driver or device, for example printing 2-sided transparencies. All versions of CUPS support constraints defined by the legacy Adobe UIConstraints and NonUIConstraints keywords which support conflicts between any two option choices, for example:

+ +
+*% Do not allow 2-sided printing on transparency media
+*UIConstraints: "*Duplex *MediaType Transparency"
+*UIConstraints: "*MediaType Transparency *Duplex"
+
+ +

While nearly all constraints can be expressed using these keywords, there are valid scenarios requiring constraints between more than two option choices. In addition, resolution of constraints is problematic since users and software have to guess how a particular constraint is best resolved.

+ +

CUPS 1.4 and higher define two new keywords for constraints, cupsUIConstraints and cupsUIResolver. Each cupsUIConstraints keyword points to a cupsUIResolver keyword which specifies alternate options that resolve the conflict condition. The same cupsUIResolver can be used by multiple cupsUIConstraints.

+ +
Note: + +

When developing PPD files that contain constraints, it is very important to use the cupstestppd(1) program to verify that your constraints are accurate and cannot result in unresolvable option selections.

+ +
+ +

CUPS 1.4/Mac OS X 10.6cupsUIConstraints

+ +

*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 *Keyword2 OptionKeyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
+*cupsUIConstraints: "*InstallableKeyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

+ +

Lists two or more options which conflict. The "resolver" string is a (possibly unique) keyword which specifies which options to change when the constraint exists. When no resolver is provided, CUPS first tries the default choice followed by testing each option choice to resolve the conflict.

+ +

Examples:

+ +
+*% Specify that 2-sided printing cannot happen on transparencies
+*cupsUIConstraints transparency: "*Duplex *MediaType Transparency"
+
+*% Specify that envelope printing cannot happen from the paper trays
+*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
+*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
+*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
+*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
+
+*% Specify an installable option constraint for the envelope feeder
+*cupsUIConstraints: "*InputSlot EnvFeeder *InstalledEnvFeeder"
+
+*% Specify that photo printing cannot happen on plain paper or transparencies at 1200dpi
+*cupsUIConstraints photo: "*OutputMode Photo *MediaType Plain *Resolution 1200dpi"
+*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsUIResolver

+ +

*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

+ +

Specifies two or more options to mark/select to resolve a constraint. The "resolver" string identifies a particular action to take for one or more cupsUIConstraints. The same action can be used for multiple constraints. The option keyword pairs are treated as an ordered list of option selections to try - only the first N selections will be used, where N is the minimum number of selections required. Because cupsResolveConflicts() will not change the most recent option selection passed to it, at least two options from the constraints must be listed to avoid situations where conflicts cannot be resolved.

+ +

Examples:

+ +
+*% Specify the options to change for the 2-sided transparency constraint
+*cupsUIResolver transparency: "*Duplex None *MediaType Plain"
+
+*% Specify the options to change for the envelope printing constraints.  Notice
+*% that we try to change the InputSlot to either the envelope feeder or the
+*% manual feed first, then we change the page size...
+*cupsUIResolver envelope: "*InputSlot EnvFeeder *InputSlot ManualFeed *PageSize Letter"
+
+*% Specify the options to change for the photo printing constraints
+*cupsUIResolver photo: "*OutputMode Best *Resolution 600dpi"
+
+ + +

Globalized PPD Support

+ +

CUPS 1.2 and higher adds support for PPD files containing multiple languages by following the following additional rules:

+ +
    + +
  1. The LanguageVersion MUST be English
  2. + +
  3. The LanguageEncoding MUST be ISOLatin1
  4. + +
  5. The cupsLanguages keyword MUST be provided and list each of the supported locales in the PPD file
  6. + +
  7. Main and option keywords MUST NOT exceed 34 (instead of 40) characters to allow room for the locale prefixes in translation keywords
  8. + +
  9. The main keyword "Translation" MUST NOT be used
  10. + +
  11. Translation strings included with the main and option keywords MUST NOT contain characters outside the ASCII subset of ISOLatin1 and UTF-8; developers wishing to use characters outside ASCII MUST provide a separate set of English localization keywords for the affected keywords.
  12. + +
  13. Localizations are specified using a locale prefix of the form "ll" or "ll_CC." where "ll" is the 2-letter ISO language code and "CC" is the 2-letter ISO country code
      +
    • A generic language translation ("ll") SHOULD be provided with country-specific differences ("ll_CC") provided only as needed
    • +
    • For historical reasons, the "zh" and "zh_CN" locales map to Simplified Chinese while the "zh_TW" locale maps to Traditional Chinese
    • +
  14. + +
  15. Locale-specific translation strings MUST be encoded using UTF-8.
  16. + +
  17. Main keywords MUST be localized using one of the following forms: +

    *ll.Translation MainKeyword/translation text: ""
    + *ll_CC.Translation MainKeyword/translation text: ""

  18. + +
  19. Option keywords MUST be localized using one of the following forms: +

    *ll.MainKeyword OptionKeyword/translation text: ""
    + *ll_CC.MainKeyword OptionKeyword/translation text: ""

  20. + +
  21. Localization keywords MAY appear anywhere after the first line of the PPD file
  22. + +
+ +
Note: + +

We use a LanguageEncoding value of ISOLatin1 and limit the allowed base translation strings to ASCII to avoid character coding issues that would otherwise occur. In addition, requiring the base translation strings to be in English allows for easier fallback translation when no localization is provided in the PPD file for a given locale.

+ +
+ +

Examples:

+ +
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*cupsLanguages: "de fr_CA"
+*ModelName: "Foobar Laser 9999"
+
+*% Localize ModelName for French and German
+*fr_CA.Translation ModelName/La Foobar Laser 9999: ""
+*de.Translation ModelName/Foobar LaserDrucken 9999: ""
+
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+*% Localize printer-state-reason for French and German
+*fr_CA.cupsIPPReason com.vendor-error/Une erreur sèrieuse s'est produite: "/help/com.vendor/error.html"
+*de.cupsIPPReason com.vendor-error/Eine ernste Störung trat: "/help/com.vendor/error.html"
+
+...
+
+*OpenUI *InputSlot/Paper Source: PickOne
+*OrderDependency: 10 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*% Localize InputSlot for French and German
+*fr_CA.Translation InputSlot/Papier source: ""
+*de.Translation InputSlot/Papiereinzug: ""
+*InputSlot Auto/Default: "<</ManualFeed false>>setpagedevice"
+*% Localize InputSlot=Auto for French and German
+*fr_CA.InputSlot Auto/Par Defaut: ""
+*de.InputSlot Auto/Standard: ""
+*InputSlot Manual/Manual Feed: "<</ManualFeed true>>setpagedevice"
+*% Localize InputSlot=Manual for French and German
+*fr_CA.InputSlot Manual/Manuel mecanisme de alimentation: ""
+*de.InputSlot Manual/Manueller Einzug: ""
+*CloseUI: *InputSlot
+
+ + +

CUPS 1.3/Mac OS X 10.6Custom Options

+ +

CUPS supports custom options using an extension of the CustomPageSize and ParamCustomPageSize syntax:

+ +
+*CustomFoo True: "command"
+*ParamCustomFoo Name1/Text 1: order type minimum maximum
+*ParamCustomFoo Name2/Text 2: order type minimum maximum
+...
+*ParamCustomFoo NameN/Text N: order type minimum maximum
+
+ +

When the base option is part of the JCLSetup section, the "command" string contains JCL commands with "\order" placeholders for each numbered parameter. The CUPS API handles any necessary value quoting for HP-PJL commands. For example, if the JCL command string is "@PJL SET PASSCODE=\1" and the first +option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234".

+ +

For non-JCLSetup options, the "order" value is a number from 1 to N and specifies the order of values as they are placed on the stack before the command. For example, if the PostScript command string is "<</cupsReal1 2 1 roll>>setpagedevice" and the option value is "2.0" then CUPS will output the string "2.0 <</cupsReal1 2 1 roll>>setpagedevice".

+ +

The "type" is one of the following keywords:

+ +
    + +
  • curve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x value
  • + +
  • int - an integer value from "minimum" to "maximum"
  • + +
  • invcurve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x 1 / value
  • + +
  • passcode - a string of numbers value with a minimum of "minimum" numbers and a maximum of "maximum" numbers ("minimum" and "maximum" are numbers and passcode strings are not displayed in the user interface)
  • + +
  • password - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers and password strings are not displayed in the user interface)
  • + +
  • points - a measurement value in points from "minimum" to "maximum"
  • + +
  • real - a real value from "minimum" to "maximum"
  • + +
  • string - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers)
  • + +
+ +

Examples:

+ +
+*% Base JCL key code option
+*JCLOpenUI JCLPasscode/Key Code: PickOne
+*OrderDependency: 10 JCLSetup *JCLPasscode
+*DefaultJCLPasscode: None
+*JCLPasscode None/No Code: ""
+*JCLPasscode 1111: "@PJL SET PASSCODE = 1111<0A>"
+*JCLPasscode 2222: "@PJL SET PASSCODE = 2222<0A>"
+*JCLPasscode 3333: "@PJL SET PASSCODE = 3333<0A>"
+*JCLCloseUI: *JCLPasscode
+
+*% Custom JCL key code option
+*CustomJCLPasscode True: "@PJL SET PASSCODE = \1<0A>"
+*ParamCustomJCLPasscode Code/Key Code: 1 passcode 4 4
+
+
+*% Base PostScript watermark option
+*OpenUI WatermarkText/Watermark Text: PickOne
+*OrderDependency: 10 AnySetup *WatermarkText
+*DefaultWatermarkText: None
+*WatermarkText None: ""
+*WatermarkText Draft: "<</cupsString1(Draft)>>setpagedevice"
+*CloseUI: *WatermarkText
+
+*% Custom PostScript watermark option
+*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
+*ParamCustomWatermarkText Text: 1 string 0 32
+
+
+*% Base PostScript gamma/density option
+*OpenUI GammaDensity/Gamma and Density: PickOne
+*OrderDependency: 10 AnySetup *GammaDensity
+*DefaultGammaDensity: Normal
+*GammaDensity Normal/Normal: "<</cupsReal1 1.0/cupsReal2 1.0>>setpagedevice"
+*GammaDensity Light/Lighter: "<</cupsReal1 0.9/cupsReal2 0.67>>setpagedevice"
+*GammaDensity Dark/Darker: "<</cupsReal1 1.1/cupsReal2 1.5>>setpagedevice"
+*CloseUI: *GammaDensity
+
+*% Custom PostScript gamma/density option
+*CustomGammaDensity True: "<</cupsReal1 3 -1 roll/cupsReal2 5 -1>>setpagedevice"
+*ParamCustomGammaDensity Gamma: 1 curve 0.1 10
+*ParamCustomGammaDensity Density: 2 real 0 2
+
+ + +

Writing PostScript Option Commands for Raster Drivers

+ +

PPD files are used for both PostScript and non-PostScript printers. For CUPS raster drivers, you use a subset of the PostScript language to set page device keywords such as page size, resolution, and so forth. For example, the following code sets the page size to A4 size:

+ +
+*PageSize A4: "<</PageSize[595 842]>>setpagedevice"
+
+ +

Custom options typically use other operators to organize the values into a key/value dictionary for setpagedevice. For example, our previous CustomWatermarkText option code uses the roll operator to move the custom string value into the dictionary for setpagedevice:

+ +
+*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
+
+ +

For a custom string value of "My Watermark", CUPS will produce the following PostScript code for the option:

+ +
+(My Watermark)
+<</cupsString1 3 -1 roll>>setpagedevice
+
+ +

The code moves the string value ("My Watermark") from the bottom of the stack to the top, creating a dictionary that looks like:

+ +
+<</cupsString1(My Watermark)>>setpagedevice
+
+ +

The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.

+ +

Custom Page Size Code

+ +

There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:

+ +
+*ParamCustomPageSize Width:        1 points min-width max-width
+*ParamCustomPageSize Height:       2 points min-height max-height
+*ParamCustomPageSize WidthOffset:  3 points 0 0
+*ParamCustomPageSize HeightOffset: 4 points 0 0
+*ParamCustomPageSize Orientation:  5 int 0 0
+*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"
+
+ +

Supported PostScript Operators

+ +

CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:

+ +
    + +
  • << - Start a dictionary.
  • + +
  • >> - End a dictionary.
  • + +
  • [ - Start an array.
  • + +
  • ] - End an array.
  • + +
  • copy - Copy the top N objects on the stack.
  • + +
  • dup - Copy the top object on the stack.
  • + +
  • index - Copy the Nth from the top object on the stack.
  • + +
  • pop - Pop the top object on the stack.
  • + +
  • roll - Shift the top N objects on the stack.
  • + +
  • setpagedevice - Set the page header values according to the key/value dictionary on the stack.
  • + +
+ +
Note: + +

Never use the unsupported dict or put +operators in your option code. These operators are typically used in +option code dating back to Level 1 PostScript printers, which did not +support the simpler << or >> operators. +If you have old option code using dict or put, you can +rewrite it very easily to use the newer << and +>> operators instead. For example, the following code +to set the page size:

+ + + +
+1 dict dup /PageSize [612 792] put setpagedevice
+
+ +

can be rewritten as:

+ +
+<< /PageSize [612 792] >> setpagedevice
+
+ +
+ +

Supported Page Device Attributes

+ +

Table 2 shows the supported page device attributes along with PostScript code examples.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Supported Page Device Attributes
Name(s)TypeDescriptionExample(s)
AdvanceDistanceIntegerSpecifies the number of points to advance roll media after printing.<</AdvanceDistance 18>>setpagedevice
AdvanceMediaIntegerSpecifies when to advance the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</AdvanceMedia 4>>setpagedevice
CollateBooleanSpecifies whether collated copies are required.<</Collate true>>setpagedevice
CutMediaIntegerSpecifies when to cut the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</CutMedia 1>>setpagedevice
DuplexBooleanSpecifies whether 2-sided printing is required.<</Duplex true>>setpagedevice
HWResolutionInteger ArraySpecifies the resolution of the page image in pixels per inch.<</HWResolution[1200 1200]>>setpagedevice
InsertSheetBooleanSpecifies whether to insert a blank sheet before the job.<</InsertSheet true>>setpagedevice
JogIntegerSpecifies when to shift the media in the output bin: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</Jog 2>>setpagedevice
LeadingEdgeIntegerSpecifies the leading edge of the media: 0 = top, 1 = right, 2 = bottom, 3 = left.<</LeadingEdge 0>>setpagedevice
ManualFeedBooleanSpecifies whether media should be drawn from the manual feed tray. Note: The MediaPosition attribute is preferred over the ManualFeed attribute.<</ManualFeed true>>setpagedevice
MediaClassStringSpecifies a named media.<</MediaClass (Invoices)>>setpagedevice
MediaColorStringSpecifies the color of the media.<</MediaColor >>setpagedevice
MediaPositionIntegerSpecifies the tray or source of the media.<</MediaPosition 12>>setpagedevice
MediaTypeStringSpecifies the general media type.<</MediaType (Glossy)>>setpagedevice
MediaWeightIntegerSpecifies the media weight in grams per meter2.<</MediaWeight 100>>setpagedevice
MirrorPrintBooleanSpecifies whether to flip the output image horizontally.<</MirrorPrint true>>setpagedevice
NegativePrintBooleanSpecifies whether to invert the output image.<</NegativePrint true>>setpagedevice
NumCopiesIntegerSpecifies the number of copies to produce of each page.<</NumCopies 100>>setpagedevice
OrientationIntegerSpecifies the orientation of the output: 0 = portrait, 1 = landscape rotated counter-clockwise, 2 = upside-down, 3 = landscape rotated clockwise.<</Orientation 3>>setpagedevice
OutputFaceUpBooleanSpecifies whether to place the media face-up in the output bin/tray.<</OutputFaceUp true>>setpagedevice
OutputTypeStringSpecifies the output type name.<</OutputType (Photo)>>setpagedevice
PageSizeInteger/Real ArraySpecifies the width and length/height of the page in points.<</PageSize[595 842]>>setpagedevice
SeparationsBooleanSpecifies whether to produce color separations.<</Separations true>>setpagedevice
TraySwitchBooleanSpecifies whether to switch trays automatically.<</TraySwitch true>>setpagedevice
TumbleBooleanSpecifies whether the back sides of pages are rotated 180 degrees.<</Tumble true>>setpagedevice
cupsBorderlessScalingFactorRealSpecifies the amount to scale the page image dimensions.<</cupsBorderlessScalingFactor 1.01>>setpagedevice
cupsColorOrderIntegerSpecifies the order of colors: 0 = chunked, 1 = banded, 2 = planar.<</cupsColorOrder 0>>setpagedevice
cupsColorSpaceIntegerSpecifies the page image colorspace: 0 = W, 1 = RGB, 2 = RGBA, 3 = K, 4 = CMY, 5 = YMC, 6 = CMYK, 7 = YMCK, 8 = KCMY, 9 = KCMYcm, 10 = GMCK, 11 = GMCS, 12 = White, 13 = Gold, 14 = Silver, 15 = CIE XYZ, 16 = CIE Lab, 17 = RGBW, 32 to 46 = CIE Lab (1 to 15 inks)<</cupsColorSpace 1 >>setpagedevice
cupsCompressionIntegerSpecifies a driver compression type/mode.<</cupsCompression 2>>setpagedevice
cupsInteger0
+ ...
+ cupsInteger15
IntegerSpecifies driver integer values.<</cupsInteger11 1234>>setpagedevice
cupsMarkerTypeStringSpecifies the type of ink/toner to use.<</cupsMarkerType (Black+Color)>>setpagedevice
cupsMediaTypeIntegerSpecifies a numeric media type.<</cupsMediaType 999>>setpagedevice
cupsPageSizeNameStringSpecifies the name of the page size.<</cupsPageSizeName (A4.Full)>>setpagedevice
cupsPreferredBitsPerColorIntegerSpecifies the preferred number of bits per color, typically 8 or 16.<</cupsPreferredBitsPerColor 16>>setpagedevice
cupsReal0
+ ...
+ cupsReal15
RealSpecifies driver real number values.<</cupsReal15 1.234>>setpagedevice
cupsRenderingIntentStringSpecifies the color rendering intent.<</cupsRenderingIntent (AbsoluteColorimetric)>>setpagedevice
cupsRowCountIntegerSpecifies the number of rows of raster data to print on each line for some drivers.<</cupsRowCount 24>>setpagedevice
cupsRowFeedIntegerSpecifies the number of rows to feed between passes for some drivers.<</cupsRowFeed 17>>setpagedevice
cupsRowStepIntegerSpecifies the number of lines between columns/rows on the print head for some drivers.<</cupsRowStep 2>>setpagedevice
cupsString0
+ ...
+ cupsString15
StringSpecifies driver string values.<</cupsString0(String Value)>>setpagedevice
+ + +

Media Keywords

+ +

The CUPS media keywords allow drivers to specify alternate custom page +size limits based on up to two options.

+ +

CUPS 1.4/Mac OS X 10.6cupsMediaQualifier2

+ +

*cupsMediaQualifier2: MainKeyword

+ +

This keyword specifies the second option to use for overriding the +custom page size limits.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMediaQualifier3

+ +

*cupsMediaQualifier3: MainKeyword

+ +

This keyword specifies the third option to use for overriding the +custom page size limits.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMinSize

+ +

*cupsMinSize .Qualifier2.Qualifier3: "width length"
+*cupsMinSize .Qualifier2.: "width length"
+*cupsMinSize ..Qualifier3: "width length"

+ +

This keyword specifies alternate minimum custom page sizes in points. +The cupsMediaQualifier2 and +cupsMediaQualifier3 keywords +are used to identify options to use for matching.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMaxSize

+ +

*cupsMaxSize .Qualifier2.Qualifier3: "width length"
+*cupsMaxSize .Qualifier2.: "width length"
+*cupsMaxSize ..Qualifier3: "width length"

+ +

This keyword specifies alternate maximum custom page sizes in points. +The cupsMediaQualifier2 and +cupsMediaQualifier3 keywords +are used to identify options to use for matching.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ + +

General Attributes

+ +

CUPS 1.3/Mac OS X 10.5cupsBackSide

+ +

*cupsBackSide: keyword

+ +

This keyword requests special handling of the back side of pages +when doing duplexed (2-sided) output. Table 1 +shows the supported keyword values for this keyword and their effect +on the raster data sent to your driver. For example, when cupsBackSide +is Rotated and Tumble is false, your driver +will receive print data starting at the bottom right corner of the page, with +each line going right-to-left instead of left-to-right. The default value is +Normal.

+ +
Note: + +

cupsBackSide replaces the older cupsFlipDuplex +keyword - if cupsBackSide is specified, cupsFlipDuplex +will be ignored.

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Back Side Raster Coordinate System
cupsBackSideTumble ValueImage Presentation
NormalfalseLeft-to-right, top-to-bottom
NormaltrueLeft-to-right, top-to-bottom
ManualTumblefalseLeft-to-right, top-to-bottom
ManualTumbletrueRight-to-left, bottom-to-top
RotatedfalseRight-to-left, bottom-to-top
RotatedtrueRight-to-left, top-to-bottom
Flipped *falseLeft-to-right, bottom-to-top
Flipped *trueRight-to-left, top-to-bottom
+
+ +

* - Not supported in Mac OS X 10.5.x and earlier

+ +
+ + +
Figure 1: Back side images
Back side images
+ +

Examples:

+ +
+*% Flip the page image for the back side of duplexed output
+*cupsBackSide: Flipped
+
+*% Rotate the page image for the back side of duplexed output
+*cupsBackSide: Rotated
+
+ +

Also see the related APDuplexRequiresFlippedMargin +keyword.

+ +

CUPS 1.4/Mac OS X 10.6cupsCommands

+ +

*cupsCommands: "name name2 ... nameN"

+ +

This string keyword specifies the commands that are supported by the +CUPS command file filter for this device. The command names are separated +by whitespace.

+ +

Example:

+ +
+*% Specify the list of commands we support
+*cupsCommands: "AutoConfigure Clean PrintSelfTestPage ReportLevels com.vendor.foo"
+
+ + +

CUPS 1.3/Mac OS X 10.5cupsEvenDuplex

+ +

*cupsEvenDuplex: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer requires an even number of pages when 2-sided +printing is selected. The default value is false.

+ +

Example:

+ +
+*% Always send an even number of pages when duplexing
+*cupsEvenDuplex: true
+
+ +

cupsFax

+ +

*cupsFax: boolean

+ +

This boolean keyword specifies whether the PPD defines a facsimile device. The default is false.

+ +

Examples:

+ +
+*cupsFax: true
+
+ +

cupsFilter

+ +

*cupsFilter: "source/type cost program"

+ +

This string keyword provides a conversion rule from the +given source type to the printer's native format using the +filter "program". If a printer supports the source type directly, +the special filter program "-" may be specified.

+ +

Examples:

+ +
+*% Standard raster printer driver filter
+*cupsFilter: "application/vnd.cups-raster 100 rastertofoo"
+
+*% Plain text filter
+*cupsFilter: "text/plain 10 texttofoo"
+
+*% Pass-through filter for PostScript printers
+*cupsFilter: "application/vnd.cups-postscript 0 -"
+
+ +

CUPS 1.5cupsFilter2

+ +

*cupsFilter2: "source/type destination/type cost program"

+ +

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified. The destination type is automatically created as needed and is passed to the filters and backend as the FINAL_CONTENT_TYPE value.

+ +
Note: + +

The presence of a single cupsFilter2 keyword in the PPD file will hide any cupsFilter keywords from the CUPS scheduler. When using cupsFilter2 to provide filters specific for CUPS 1.5 and later, provide a cupsFilter2 line for every filter and a cupsFilter line for each filter that is compatible with older versions of CUPS.

+ +
+ +

Examples:

+ +
+*% Standard raster printer driver filter
+*cupsFilter2: "application/vnd.cups-raster application/vnd.foo 100 rastertofoo"
+
+*% Plain text filter
+*cupsFilter2: "text/plain application/vnd.foo 10 texttofoo"
+
+*% Pass-through filter for PostScript printers
+*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"
+
+ +

DeprecatedcupsFlipDuplex

+ +

*cupsFlipDuplex: boolean

+ +

Due to implementation differences between Mac OS X and Ghostscript, +the cupsFlipDuplex keyword is deprecated. Instead, use +the cupsBackSide keyword to specify +the coordinate system (pixel layout) of the page data on the back side of +duplex pages.

+ +

The value true maps to a cupsBackSide value +of Rotated on Mac OS X and Flipped with +Ghostscript.

+ +

The default value is false.

+ +
Note: + +

Mac OS X drivers that previously used +cupsFlipDuplex may wish to provide both the old and +new keywords for maximum compatibility, for example:

+ +
+*cupsBackSide: Rotated
+*cupsFlipDuplex: true
+
+ +

Similarly, drivers written for other operating systems using +Ghostscript can use:

+ +
+*cupsBackSide: Flipped
+*cupsFlipDuplex: true
+
+ +

CUPS 1.3/Mac OS X 10.5cupsIPPFinishings

+ +

*cupsIPPFinishings number/text: "*Option Choice ..."

+ +

This keyword defines a mapping from IPP finishings +values to PPD options and choices.

+ +

Examples:

+ +
+*cupsIPPFinishings 4/staple: "*StapleLocation SinglePortrait"
+*cupsIPPFinishings 5/punch: "*PunchMedia Yes *PunchLocation LeftSide"
+*cupsIPPFinishings 20/staple-top-left: "*StapleLocation SinglePortrait"
+*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"
+
+ +

CUPS 1.3/Mac OS X 10.5cupsIPPReason

+ +

*cupsIPPReason reason/Reason Text: "optional URIs"

+ +

This optional keyword maps custom +printer-state-reasons keywords that are generated by +the driver to human readable text. The optional URIs string +contains zero or more URIs separated by a newline. Each URI can +be a CUPS server absolute path to a help file under the +scheduler's DocumentRoot directory, a full HTTP URL +("http://www.domain.com/path/to/help/page.html"), or any other +valid URI which directs the user at additional information +concerning the condition that is being reported.

+ +

Since the reason text is limited to 80 characters by the PPD specification, longer text strings can be included by URI-encoding the text with the "text" scheme, for example "text:some%20text". Multiple text URIs are combined by the ppdLocalizeIPPReason into a single string that can be displayed to the user.

+ +

Examples:

+ +
+*% Map com.vendor-error to text but no page
+*cupsIPPReason com.vendor-error/A serious error occurred: ""
+
+*% Map com.vendor-error to more than 80 characters of text but no page
+*cupsIPPReason com.vendor-error/A serious error occurred: "text:Now%20is%20the%20time
+text:for%20all%20good%20men%20to%20come%20to%20the%20aid%20of%20their%20country."
+
+*% Map com.vendor-error to text and a local page
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+
+*% Map com.vendor-error to text and a remote page
+*cupsIPPReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"
+
+*% Map com.vendor-error to text and a local, Apple help book, and remote page
+*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html
+help:anchor='com.vendor-error'%20bookID=Vendor%20Help
+http://www.vendor.com/help"
+*End
+
+ +

CUPS 1.5cupsIPPSupplies

+ +

*cupsIPPSupplies: boolean

+ +

This keyword tells the IPP backend whether it should report the current marker-xxx supply attribute values. The default value is True. + +

Example:

+ +
+*% Do not use IPP marker-xxx attributes to report supply levels
+*cupsIPPSupplies: False
+
+ +

CUPS 1.2/Mac OS X 10.5cupsLanguages

+ +

*cupsLanguages: "locale list"

+ +

This keyword describes which language localizations are +included in the PPD. The "locale list" string is a space-delimited +list of locale names ("en", "en_US", "fr_CA", etc.)

+ +

Example:

+ +
+*% Specify Canadian, UK, and US English, and Canadian and French French
+*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
+
+ +

cupsManualCopies

+ +

*cupsManualCopies: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer does not support copy generation in +hardware. The default value is false.

+ +

Example:

+ +
+*% Tell the RIP filters to generate the copies for us
+*cupsManualCopies: true
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMarkerName

+ +

*cupsMarkerName/Name Text: ""

+ +

This optional keyword maps marker-names strings that are +generated by the driver to human readable text.

+ +

Examples:

+ +
+*% Map cyanToner to "Cyan Toner"
+*cupsMarkerName cyanToner/Cyan Toner: ""
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMarkerNotice

+ +

*cupsMarkerNotice: "disclaimer text"

+ +

This optional keyword provides disclaimer text for the supply level +information provided by the driver, typically something like "supply levels +are approximate".

+ +

Examples:

+ +
+*cupsMarkerNotice: "Supply levels are approximate."
+
+ +

cupsModelNumber

+ +

*cupsModelNumber: number

+ +

This integer keyword specifies a printer-specific model +number. This number can be used by a filter program to adjust +the output for a specific model of printer.

+ +

Example:

+ +
+*% Specify an integer for a driver-specific model number
+*cupsModelNumber: 1234
+
+ +

CUPS 1.3/Mac OS X 10.5cupsPJLCharset

+ +

*cupsPJLCharset: "ISO character set name"

+ +

This string keyword specifies the character set that is used +for strings in PJL commands. If not specified, US-ASCII is +assumed.

+ +

Example:

+ +
+*% Specify UTF-8 is used in PJL strings
+*cupsPJLCharset: "UTF-8"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsPJLDisplay

+ +

*cupsPJLDisplay: "what"

+ +

This optional keyword specifies which command is used to display the +job ID, name, and user on the printer's control panel. "What" is either "none" +to disable this functionality, "job" to use "@PJL JOB DISPLAY", or "rdymsg" +to use "@PJL RDYMSG DISPLAY". The default is "job".

+ +

Examples:

+ +
+*% Display job information using @PJL SET RDYMSG DISPLAY="foo"
+*cupsPJLDisplay: "rdymsg"
+
+*% Display job information display
+*cupsPJLDisplay: "none"
+
+ +

CUPS 1.2/Mac OS X 10.5cupsPortMonitor

+ +

*cupsPortMonitor urischeme/Descriptive Text: "port monitor"

+ +

This string keyword specifies printer-specific "port +monitor" filters that may be used with the printer. The CUPS +scheduler also looks for the Protocols keyword to see +if the BCP or TBCP protocols are supported. If +so, the corresponding port monitor ("bcp" and "tbcp", +respectively) is listed in the printer's +port-monitor-supported keyword.

+ +

The "urischeme" portion of the keyword specifies the URI scheme +that this port monitor should be used for. Typically this is used to +pre-select a particular port monitor for each type of connection that +is supported by the printer. The "port monitor" string can be "none" +to disable the port monitor for the given URI scheme.

+ +

Examples:

+ +
+*% Specify a PostScript printer that supports the TBCP protocol
+*Protocols: TBCP PJL
+
+*% Specify that TBCP should be used for socket connections but not USB
+*cupsPortMonitor socket/AppSocket Printing: "tbcp"
+*cupsPortMonitor usb/USB Printing: "none"
+
+*% Specify a printer-specific port monitor for an Epson USB printer
+*cupsPortMonitor usb/USB Status Monitor: "epson-usb"
+
+ +

CUPS 1.3/Mac OS X 10.5cupsPreFilter

+ +

*cupsPreFilter: "source/type cost program"

+ +

This string keyword provides a pre-filter rule. The pre-filter +program will be inserted in the conversion chain immediately +before the filter that accepts the given MIME type.

+ +

Examples:

+ +
+*% PDF pre-filter
+*cupsPreFilter: "application/pdf 100 mypdfprefilter"
+
+*% PNG pre-filter
+*cupsPreFilter: "image/png 0 mypngprefilter"
+
+ + +

CUPS 1.5cupsPrintQuality

+ +

*cupsPrintQuality keyword/text: "code"

+ +

This UI keyword defines standard print qualities that directly map from the IPP "print-quality" job template keyword. Standard keyword values are "Draft", "Normal", and "High" which are mapped from the IPP "print-quality" values 3, 4, and 5 respectively. Each cupsPrintQuality option typically sets output mode and resolution parameters in the page device dictionary, eliminating the need for separate (and sometimes confusing) output mode and resolution options.

+ +
Note: + +

Unlike all of the other keywords defined in this document, cupsPrintQuality is a UI keyword that MUST be enclosed inside the PPD OpenUI and CloseUI keywords.

+ +
+ +

Examples:

+ +
+*OpenUI *cupsPrintQuality/Print Quality: PickOne
+*OrderDependency: 10 AnySetup *cupsPrintQuality
+*DefaultcupsPrintQuality: Normal
+*cupsPrintQuality Draft/Draft: "code"
+*cupsPrintQuality Normal/Normal: "code"
+*cupsPrintQuality High/Photo: "code"
+*CloseUI: *cupsPrintQuality
+
+ +

CUPS 1.5cupsSingleFile

+ +

*cupsSingleFile: Boolean

+ +

This boolean keyword tells the scheduler whether to print multiple files in a job together or singly. The default is "False" which uses a single instance of the backend for all files in the print job. Setting this keyword to "True" will result in separate instances of the backend for each file in the print job.

+ +

Examples:

+ +
+*% Send all print data to a single backend
+*cupsSingleFile: False
+
+*% Send each file using a separate backend
+*cupsSingleFile: True
+
+ +

CUPS 1.4/Mac OS X 10.6cupsSNMPSupplies

+ +

*cupsSNMPSupplies: boolean

+ +

This keyword tells the standard network backends whether they should query +the standard SNMP Printer MIB OIDs for supply levels. The default value is +True. + +

Example:

+ +
+*% Do not use SNMP queries to report supply levels
+*cupsSNMPSupplies: False
+
+ +

cupsVersion

+ +

*cupsVersion: major.minor

+ +

This required keyword describes which version of the CUPS +PPD file extensions was used. Currently it must be the string +"1.0", "1.1", "1.2", or "1.3".

+ +

Example:

+ +
+*% Specify a CUPS 1.2 driver
+*cupsVersion: "1.2"
+
+ + +

Mac OS X Attributes

+ +

Mac OS X 10.3APDialogExtension

+ +

*APDialogExtension: "/Library/Printers/vendor/filename.plugin"

+ +

This keyword defines additional option panes that are displayed in the +print dialog. Each keyword adds one or more option panes. See the "OutputBinsPDE" +example and Apple +Technical Q&A QA1352 for information on writing your own print dialog +plug-ins.

+ +
Note: + +

Starting with Mac OS X 10.5, each plug-in must be compiled "4-way fat" +(32-bit and 64-bit for both PowerPC and Intel) with garbage collection enabled +in order to be usable with all applications.

+ +
+ +

Examples:

+ +
+*% Add two panes for finishing and driver options
+*APDialogExtension: "/Library/Printers/vendor/finishing.plugin"
+*APDialogExtension: "/Library/Printers/vendor/options.plugin"
+
+ +

Mac OS X 10.4APDuplexRequiresFlippedMargin

+ +

*APDuplexRequiresFlippedMargin: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer requires the top and bottom margins of the +ImageableArea to be swapped for the back page. The +default is true when cupsBackSide is Flipped +and false otherwise. Table 2 shows how +APDuplexRequiresFlippedMargin interacts with cupsBackSide +and the Tumble page attribute.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Margin Flipping Modes
APDuplexRequiresFlippedMargincupsBackSideTumble ValueMargins
falseanyanyNormal
anyNormalanyNormal
trueManualDuplexfalseNormal
trueManualDuplextrueFlipped
trueRotatedfalseFlipped
trueRotatedtrueNormal
true or unspecifiedFlippedanyFlipped
+ +

Example:

+ +
+*% Rotate the back side images
+*cupsBackSide: Rotated
+
+*% Don't swap the top and bottom margins for the back side
+*APDuplexRequiresFlippedMargin: false
+
+ +

Also see the related cupsBackSide +keyword.

+ +

APHelpBook

+ +

*APHelpBook: "bundle URL"

+ +

This string keyword specifies the Apple help book bundle to use when +looking up IPP reason codes for this printer driver. The +cupsIPPReason keyword maps +"help" URIs to this file.

+ +

Example:

+ +
+*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+
+ +

Mac OS X 10.6APICADriver

+ +

*APICADriver: boolean

+ +

This keyword specifies whether the device has a matching Image Capture +Architecture (ICA) driver for scanning. The default is False.

+ +

Examples:

+ +
+*APICADriver: True
+*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
+ +

Mac OS X 10.3APPrinterIconPath

+ +

*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"

+ +

This keyword defines the location of a printer icon file to use when +displaying the printer. The file must be in the Apple icon format.

+ +

Examples:

+ +
+*% Apple icon file
+*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"
+
+ +

Mac OS X 10.4APPrinterLowInkTool

+ +

*APPrinterLowInkTool: "/Library/Printers/vendor/program"

+ +

This keyword defines an program that checks the ink/toner/marker levels +on a printer, returning an XML document with those levels. See the "InkTool" +example and +Apple +Technical Note TN2144 for more information.

+ +

Examples:

+ +
+*% Use a vendor monitoring program
+*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"
+
+ +

Mac OS X 10.5APPrinterPreset

+ +

*APPrinterPreset name/text: "*Option Choice ..."

+ +

This keyword defines presets for multiple options that show up +in the print dialog of applications (such as iPhoto) that set the job +style hint to NSPrintPhotoJobStyleHint. Each preset maps to one or +more pairs of PPD options and choices as well as providing key/value data for +the application. The following standard preset names are currently defined:

+ +
    + +
  • General_with_Paper_Auto-Detect; Normal quality general printing with auto-detected media.
  • + +
  • General_with_Paper_Auto-Detect_-_Draft; Draft quality general printing with auto-detected media.
  • + +
  • General_on_Plain_Paper; Normal quality general printing on plain paper.
  • + +
  • General_on_Plain_Paper_-_Draft; Draft quality general printing on plain paper.
  • + +
  • Photo_with_Paper_Auto-Detect; Normal quality photo printing with auto-detected media.
  • + +
  • Photo_with_Paper_Auto-Detect_-_Fine; High quality photo printing with auto-detected media.
  • + +
  • Photo_on_Plain_Paper; Normal quality photo printing on plain paper.
  • + +
  • Photo_on_Plain_Paper_-_Fine; High quality photo printing on plain paper.
  • + +
  • Photo_on_Photo_Paper; Normal quality photo printing on glossy photo paper.
  • + +
  • Photo_on_Photo_Paper_-_Fine; High quality photo printing on glossy photo paper.
  • + +
  • Photo_on_Matte_Paper; Normal quality photo printing on matte paper.
  • + +
  • Photo_on_Matte_Paper_-_Fine; High quality photo printing on matte paper.
  • + +
+ +

The value string consists of pairs of keywords, either an option name and +choice (*MainKeyword OptionKeyword) or a preset identifier and value +(com.apple.print.preset.foo value). The following preset identifiers are currently used:

+ +
    + +
  • com.apple.print.preset.graphicsType; specifies the type of printing used for this printing - "General" for general purpose printing and "Photo" for photo printing.
  • + +
  • com.apple.print.preset.media-front-coating; specifies the media type selected by this preset - "none" (plain paper), "glossy", "high-gloss", "semi-gloss", "satin", "matte", and "autodetect".
  • + +
  • com.apple.print.preset.output-mode; specifies the output mode for this preset - "color" (default for color printers) or "monochrome" (grayscale, default for B&W printers).
  • + +
  • com.apple.print.preset.quality; specifies the overall print quality selected by this preset - "low" (draft), "mid" (normal), or "high".
  • + +
+ +

Presets, like options, can also be localized in multiple languages.

+ +

Examples:

+ +
+*APPrinterPreset Photo_on_Photo_Paper/Photo on Photo Paper: "
+  *MediaType Glossy
+  *ColorModel RGB
+  *Resolution 300dpi
+  com.apple.print.preset.graphicsType Photo
+  com.apple.print.preset.quality mid
+  com.apple.print.preset.media-front-coating glossy"
+*End
+*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""
+
+ +

Mac OS X 10.3APPrinterUtilityPath

+ +

*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"

+ +

This keyword defines a GUI application that can be used to do printer +maintenance functions such as cleaning the print head(s). See ... for more +information.

+ +

Examples:

+ +
+*% Define the printer utility application
+*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"
+
+ +

Mac OS X 10.6APScannerOnly

+ +

*APScannerOnly: boolean

+ +

This keyword specifies whether the device has scanning but no printing +capabilities. The default is False.

+ +

Examples:

+ +
+*APICADriver: True
+*APScannerOnly: True
+
+ +

Mac OS X 10.3APScanAppBundleID

+ +

*APScanAppBundleID: "bundle ID"

+ +

This keyword defines the application to use when scanning pages from +the device.

+ +

Examples:

+ +
+*APICADriver: True
+*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
+ + +

Change History

+ +

Changes in CUPS 1.5

+ +
    + +
  • Changes all instances of PPD attributes to PPD keywords, to be consistent with the parent specification from Adobe.
  • + +
+ + +

Changes in CUPS 1.4.5

+ + + + +

Changes in CUPS 1.4

+ + + + +

Changes in CUPS 1.3.1

+ +
    + +
  • Added missing Mac OS X AP keywords.
  • + +
  • Added section on auto-configuration including the + OIDMainKeyword and ?MainKeyword + keywords.
  • + +
  • Minor reorganization.
  • + +
+ + +

Changes in CUPS 1.3

+ + + +

Changes in CUPS 1.2.8

+ +
    + +
  • Added section on supported PostScript commands for raster + drivers
  • + +
+ +

Changes in CUPS 1.2

+ + + +

Changes in CUPS 1.1

+ + +
+ + diff --git a/doc/help/spec-raster.html b/doc/help/spec-raster.html new file mode 100644 index 0000000..50fca22 --- /dev/null +++ b/doc/help/spec-raster.html @@ -0,0 +1,720 @@ + + + + + CUPS Raster Format + + + + +

CUPS Raster Format

+ +

CUPS Raster files are device-dependent raster image files that contain a PostScript page device dictionary and device-dependent raster imagery for each page in the document. These files are used to transfer raster data from the PostScript and image file RIPs to device-dependent filters that convert the raster data to a printable format.

+ +

CUPS 1.0 and 1.1 used version 1 of the raster format. CUPS 1.2 and later use version 2 (compressed) and version 3 (uncompressed) that are a superset of the version 1 raster format. All three versions of CUPS Raster are streamable formats, and applications using the CUPS Imaging API (the cupsRaster* functions) can read all formats without code changes.

+ +

The registered MIME media type for CUPS Raster files is application/vnd.cups-raster.

+ + +

Organization of a CUPS Raster File

+ +

Figure 1, "Raster Organization", shows the general organization of all CUPS Raster files. Each file begins with a 32-bit synchronization word followed by zero or more pages. Each page consists of a header (the PostScript page device dictionary and raster-specific values) followed by the bitmap image for the page.

+ + + +

Each page bitmap is stored as described by the cupsBitsPerColor, cupsBytesPerLine, cupsColorOrder, cupsColorSpace, cupsHeight, and cupsWidth values in the page header. Pixels for the front side of a sheet are always stored left-to-right, top-to-bottom. When doing duplex printing, pixels for the back side of a sheet may be stored differently depending on the value of the cupsBackSide keyword ("Normal", "ManualTumble", "Rotated", or "Flipped") in the PPD file and the Tumble value ("true" or "false") in the page header. Figure 2, "Page Bitmaps", shows the pixel order for each combination.

+ + + + +

Version 1 Raster File Format

+ +

A version 1 raster file begins with a 32-bit synchronization word: 0x52615374 ("RaSt") for big-endian architectures or 0x74536152 ("tSaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

+ +

Following the synchronization word are a series of raster pages. Each page starts with a page device dictionary header and is followed immediately by the (uncompressed/raw) raster data for that page.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: CUPS Version 1 Raster Page Device Dictionary
BytesTypeDescriptionValues
0-63C StringMediaClassMedia class string
64-127C StringMediaColorMedia color string
128-191C StringMediaTypeMedia type string
192-255C StringOutputTypeOutput type string
256-259Unsigned IntegerAdvanceDistance0 to 232 - 1 points
260-263Unsigned IntegerAdvanceMedia0 = Never advance roll
+ 1 = Advance roll after file
+ 2 = Advance roll after job
+ 3 = Advance roll after set
+ 4 = Advance roll after page
264-267Unsigned IntegerCollate0 = do not collate copies
+ 1 = collate copies
268-271Unsigned IntegerCutMedia0 = Never cut media
+ 1 = Cut roll after file
+ 2 = Cut roll after job
+ 3 = Cut roll after set
+ 4 = Cut roll after page
272-275Unsigned IntegerDuplex0 = Print single-sided
+ 1 = Print double-sided
276-283Unsigned Integers (2)HWResolutionHorizontal and vertical resolution in dots-per-inch.
284-299Unsigned Integers (4)ImagingBoundingBoxFour integers giving the left, bottom, right, and top positions + of the page bounding box in points
300-303Unsigned IntegerInsertSheet0 = Do not insert separator sheets
+ 1 = Insert separator sheets
304-307Unsigned IntegerJog0 = Do no jog pages
+ 1 = Jog pages after file
+ 2 = Jog pages after job
+ 3 = Jog pages after set
308-311Unsigned IntegerLeadingEdge0 = Top edge is first
+ 1 = Right edge is first
+ 2 = Bottom edge is first
+ 3 = Left edge is first
312-319Unsigned Integers (2)MarginsLeft and bottom origin of image in points
320-323Unsigned IntegerManualFeed0 = Do not manually feed media
+ 1 = Manually feed media
324-327Unsigned IntegerMediaPositionInput slot position from 0 to N
328-331Unsigned IntegerMediaWeightMedia weight in grams per meter squared, 0 = printer default
332-335Unsigned IntegerMirrorPrint0 = Do not mirror prints
+ 1 = Mirror prints
336-339Unsigned IntegerNegativePrint0 = Do not invert prints
+ 1 = Invert prints
340-343Unsigned IntegerNumCopies0 to 232 - 1, 0 = printer default
344-347Unsigned IntegerOrientation0 = Do not rotate page
+ 1 = Rotate page counter-clockwise
+ 2 = Turn page upside down
+ 3 = Rotate page clockwise
348-351Unsigned IntegerOutputFaceUp0 = Output face down
+ 1 = Output face up
352-359Unsigned Integers (2)PageSizeWidth and length in points
360-363Unsigned IntegerSeparations0 = Print composite image
+ 1 = Print color separations
364-367Unsigned IntegerTraySwitch0 = Do not change trays if selected tray is empty
+ 1 = Change trays if selected tray is empty
368-371Unsigned IntegerTumble0 = Do not rotate even pages when duplexing
+ 1 = Rotate even pages when duplexing
372-375Unsigned IntegercupsWidthWidth of page image in pixels
376-379Unsigned IntegercupsHeightHeight of page image in pixels
380-383Unsigned IntegercupsMediaTypeDriver-specific 0 to 232 - 1
384-387Unsigned IntegercupsBitsPerColor1, 2, 4, 8 bits for version 1 raster files
+ 1, 2, 4, 8, and 16 bits for version 2/3 raster files
388-391Unsigned IntegercupsBitsPerPixel1 to 32 bits for version 1 raster files
+ 1 to 240 bits for version 2/3 raster files
392-395Unsigned IntegercupsBytesPerLine1 to 232 - 1 bytes
396-399Unsigned IntegercupsColorOrder0 = chunky pixels (CMYK CMYK CMYK)
+ 1 = banded pixels (CCC MMM YYY KKK)
+ 2 = planar pixels (CCC... MMM... YYY... KKK...)
400-403Unsigned IntegercupsColorSpace0 = gray (device, typically sRGB-based)
+ 1 = RGB (device, typically sRGB)
+ 2 = RGBA (device, typically sRGB)
+ 3 = black
+ 4 = CMY
+ 5 = YMC
+ 6 = CMYK
+ 7 = YMCK
+ 8 = KCMY
+ 9 = KCMYcm
+ 10 = GMCK
+ 11 = GMCS
+ 12 = WHITE
+ 13 = GOLD
+ 14 = SILVER
+ 15 = CIE XYZ
+ 16 = CIE Lab
+ 17 = RGBW (sRGB)
+ 18 = sGray (gray using sRGB gamma/white point)
+ 19 = sRGB
+ 20 = AdobeRGB
+ 32 = ICC1 (CIE Lab with hint for 1 color)
+ 33 = ICC2 (CIE Lab with hint for 2 colors)
+ 34 = ICC3 (CIE Lab with hint for 3 colors)
+ 35 = ICC4 (CIE Lab with hint for 4 colors)
+ 36 = ICC5 (CIE Lab with hint for 5 colors)
+ 37 = ICC6 (CIE Lab with hint for 6 colors)
+ 38 = ICC7 (CIE Lab with hint for 7 colors)
+ 39 = ICC8 (CIE Lab with hint for 8 colors)
+ 40 = ICC9 (CIE Lab with hint for 9 colors)
+ 41 = ICCA (CIE Lab with hint for 10 colors)
+ 42 = ICCB (CIE Lab with hint for 11 colors)
+ 43 = ICCC (CIE Lab with hint for 12 colors)
+ 44 = ICCD (CIE Lab with hint for 13 colors)
+ 45 = ICCE (CIE Lab with hint for 14 colors)
+ 46 = ICCF (CIE Lab with hint for 15 colors)
+ 48 = Device1 (DeviceN for 1 color)
+ 49 = Device2 (DeviceN for 2 colors)
+ 50 = Device3 (DeviceN for 3 colors)
+ 51 = Device4 (DeviceN for 4 colors)
+ 52 = Device5 (DeviceN for 5 colors)
+ 53 = Device6 (DeviceN for 6 colors)
+ 54 = Device7 (DeviceN for 7 colors)
+ 55 = Device8 (DeviceN for 8 colors)
+ 56 = Device9 (DeviceN for 9 colors)
+ 57 = DeviceA (DeviceN for 10 colors)
+ 58 = DeviceB (DeviceN for 11 colors)
+ 59 = DeviceC (DeviceN for 12 colors)
+ 60 = DeviceD (DeviceN for 13 colors)
+ 61 = DeviceE (DeviceN for 14 colors)
+ 62 = DeviceF (DeviceN for 15 colors) +
404-407Unsigned IntegercupsCompressionDriver-specific 0 to 232 - 1
408-411Unsigned IntegercupsRowCountDriver-specific 0 to 232 - 1
412-415Unsigned IntegercupsRowFeedDriver-specific 0 to 232 - 1
416-419Unsigned IntegercupsRowStepDriver-specific 0 to 232 - 1
+ + +

Version 2 Raster File Format

+ +

A version 2 raster file begins with a 32-bit synchronization word: 0x52615332 ("RaS2") for big-endian architectures or 0x32536152 ("2SaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

+ +

Following the synchronization word are a series of raster pages. Each page starts with a version 2 page device dictionary header and is followed immediately by the compressed raster data for that page.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: CUPS Version 2 Raster Page Device Dictionary
BytesTypeDescriptionValues
0-419Version 1 header dataSee Table 1
420-423Unsigned IntegercupsNumColors1 to 15 colors
424-427IEEE Single PrecisioncupsBorderlessScalingFactor0.0 or 1.0 or greater
428-435IEEE Single Precision (2)cupsPageSizeWidth and length in points
436-451IEEE Single Precision (4)cupsImagingBBoxFour floating point numbers giving the left, bottom, right, and top positions of the page bounding box in points
452-515Unsigned Integers (16)cupsInteger16 driver-defined integer values
516-579IEEE Single Precision (16)cupsReal16 driver-defined floating point values
580-1603C Strings (16x64)cupsString16 driver-defined strings
1604-1667C StringcupsMarkerTypeInk/toner type string
1668-1731C StringcupsRenderingIntentColor rendering intent string
1732-1795C StringcupsPageSizeNamePage size name/keyword string from PPD
+ +

Compressed Raster Data Format

+ +

The version 2 raster data is compressed using a PackBits-like algorithm. Lines are grouped into an integral number of color values based upon the cupsColorOrder setting:

+ +
+ + + + + + + + + + + + + + + + + +
Table 3: Color Value Sizes
cupsColorOrderBytes per color value
0 (chunky)(cupsBitsPerPixel + 7) / 8
1 (banded)(cupsBitsPerColor + 7) / 8
2 (planar)(cupsBitsPerColor + 7) / 8
+ +

Each line of raster data begins with a repetition count from 1 to 256 that is encoded using a single byte of "count - 1".

+ +

After the repetition count, whole color values for that line are run-length encoded using a PackBits-like run-length encoding algorithm: 1 to 128 repeated colors are encoded using an initial byte of "count - 1" followed by the color value byte(s) while 2 to 128 non-repeating colors are encoded using an initial byte of "257 - count" followed by the color value bytes.

+ +

For example, the 8x8 24-bit sRGB image shown in Figure 3, "Sample Image", would be encoded as the following 89 octets:

+ +
+%x00 %x00.FF.FF.FF %x02.FF.FF.00 %x03.FF.FF.FF
+%x00 %xFE.FF.FF.00.00.00.FF.FF.FF.00 %x02.FF.FF.FF %x00.00.FF.00 %x00.FF.FF.FF
+%x00 %x01.FF.FF.00 %x02.FF.FF.FF %x02.00.FF.00
+%x00 %x02.FF.FF.00 %x02.FF.FF.FF %x00.00.FF.00 %x00.FF.FF.FF
+%x00 %x00.FF.FF.FF %x02.FF.FF.00 %x03.FF.FF.FF
+%x00 %x07.FF.FF.FF
+%x01 %x07.FF.00.00
+
+ +

The first line (%x00) contains 1 white pixel (%x00.FF.FF.FF), 3 yellow pixels (%x02.FF.FF.00), and 4 white pixels (%x03.FF.FF.FF).

+ +

The second line (%x00) contains a sequence of yellow + blue + yellow pixels (%xFE.FF.FF.00.00.00.FF.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), 1 green pixel (%x00.00.FF.00), and 1 white pixel (%x00.FF.FF.FF).

+ +

The third line (%x00) contains 2 yellow pixels (%x01.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), and 3 green pixels (%x02.00.FF.00)

+ +

The fourth line (%x00) contains 3 yellow pixels (%x02.FF.FF.00), 3 white pixels (%x02.FF.FF.FF), 1 green pixel (%x00.00.FF.00), and 1 white pixel (%x00.FF.FF.FF).

+ +

The fifth line (%x00) contains 1 white pixel (%x00.FF.FF.FF), 3 yellow pixels (%x02.FF.FF.00), and 4 white pixels (%x03.FF.FF.FF).

+ +

The sixth line (%x00) contains 8 white pixels (%x07.FF.FF.FF).

+ +

The seventh and eighth lines (%x01) contain 8 red pixels (%x07.FF.00.00).

+ + + + +

Version 3 Raster File Format

+ +

A version 3 raster file begins with a 32-bit synchronization word: 0x52615333 ("RaS3") for big-endian architectures and 0x33536152 ("3SaR") for little-endian architectures. The writer of the raster file will use the native word order, and the reader is responsible for detecting a reversed word order file and swapping bytes as needed. The CUPS Imaging API raster functions perform this function automatically.

+ +

Following the synchronization word are a series of raster pages. Each page starts with a version 2 page device dictionary header and is followed immediately by the uncompressed/raw raster data for that page.

+ + +

Pixel Value Coding

+ +

The following sections describe the encoding and decoding of the color values in a CUPS Raster file. In general, colors are packed into the minimum number of bytes, with special consideration provided for efficiency of encoding and access. Multi-byte values are stored in the native byte order and automatically swapped as needed when reading them using the CUPS imaging API.

+ +

CUPS_ORDER_CHUNKED

+ +

The chunked order provides the pixel value packed in a single place. Pixel values with 8 or more bits per color are stored as an array of colors in order, e.g. for CUPS_CSPACE_RGB you will see 8/16-bits of red, then blue, then green, then red, green, blue, etc. Pixel values with less than 8 bits per color are packed together as shown in Table 4. Multi-byte pixel values are stored in the native word order, just as for 16-bit color values.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4: Chunked Color Values
Bits1-color3-color4-color6-color
1W/W/W/W/W/W/W/W0RGB/0RGBCMYK/CMYK00KCMYcm
2WW/WW/WW/WW00RRGGBBCCMMYYKKN/A
4WWWW/WWWW0000RRRRGGGGBBBB
+ (multi-byte)
CCCCMMMMYYYYKKKK
+ (multi-byte)
N/A
+ +

CUPS_ORDER_BANDED

+ +

The banded order provides each color as a separate line of data. Each color plane for a line is written in sequence, e.g. for the CUPS_CSPACE_CMYK color space you would see all of the cyan pixels for a line followed by the magenta, yellow, and black pixels for that line. This is repeated for all of the lines on the page. Color values are packed starting with the most-significant bit (MSB) first.

+ +

CUPS_ORDER_PLANAR

+ +

The planar order provides each color as a separate page of data using a shared page header. Each color plane for a page is written in sequence, e.g. for the CUPS_CSPACE_CMYK color space you would see all of the cyan pixels for a page followed by the magenta, yellow, and black pixels for that page. Color values are packed starting with the most-significant bit (MSB) first. Each line starts on an 8-bit boundary.

+ +

CUPS_CSPACE_RGBW

+ +

This color space provides a dedicated black text channel and uses the sRGB color space definition and white point for the RGB color channels. The white channel is 0 for text (or "true") black, otherwise it must contain the maximum color value: 1 for 1-bit, 3 for 2-bit, 15 for 4-bit, 255 for 8-bit, or 65535 for 16-bit.

+ +

CUPS_CSPACE_KCMYcm

+ +

When cupsBitsPerColor is 1, 6 color planes are provided - black, cyan, magenta, yellow, light cyan, and light magenta. When cupsBitsPerColor is greater than 1, 4 color planes are provided using the CUPS_CSPACE_KCMY color space instead.

+ +

When cupsColorOrder is CUPS_ORDER_CHUNKED, bit 5 corresponds to black and bit 0 corresponds to light magenta. For CUPS_ORDER_BANDED and CUPS_ORDER_PLANAR, each color plane is encoded separately.

+ +

CUPS_CSPACE_CIELab and CUPS_CSPACE_ICCn

+ +

These color spaces map a CIE Lab color value with a D65 white point to either a 8- or 16-bit per color chunked (CUPS_ORDER_CHUNKED) format; the banded (CUPS_ORDER_BANDED) and planar (CUPS_ORDER_PLANAR) color orders are not supported.

+ +

The values are encoded and decoded using the following formulas:

+ +
    + +
  • 8-bit Encoding:
    + L8 = 2.55 * L + 0.5
    + a8 = a + 128.5
    + b8 = b + 128.5
    +  
  • + +
  • 8-bit Decoding:
    + L = L8 / 2.55
    + a = a8 - 128
    + b = b8 - 128
    +  
  • + +
  • 16-bit Encoding:
    + L16 = 655.35 * L + 0.5
    + a16 = 256 * (a + 128) + 0.5
    + b16 = 256 * (b + 128) + 0.5
    +  
  • + +
  • 16-bit Decoding:
    + L = L16 / 655.35
    + a = a16 / 256 - 128
    + b = b16 / 256 - 128
    +  
  • + +
+ +

CUPS_CSPACE_CIEXYZ

+ +

These color spaces map a CIE XYZ color value with a D65 white point to either a 8- or 16-bit per color chunked (CUPS_ORDER_CHUNKED) format; the banded (CUPS_ORDER_BANDED) and planar (CUPS_ORDER_PLANAR) color orders are not supported.

+ +

The values are encoded and decoded using the following formulas:

+ +
    + +
  • 8-bit Encoding:
    + X8 = 231.8181 * X + 0.5
    + Y8 = 231.8181 * Y + 0.5
    + Z8 = 231.8181 * Z + 0.5
    +  
  • + +
  • 8-bit Decoding:
    + X = X8 / 231.8181
    + Y = Y8 / 231.8181
    + Z = Z8 / 231.8181
    +  
  • + +
  • 16-bit Encoding:
    + X16 = 59577.2727 * X + 0.5
    + Y16 = 59577.2727 * Y + 0.5
    + Z16 = 59577.2727 * Z + 0.5
    +  
  • + +
  • 16-bit Decoding:
    + X = X16 / 59577.2727
    + Y = Y16 / 59577.2727
    + Z = Z16 / 59577.2727
    +  
  • + +
+ +

The scaling factor for XYZ values is 1/1.1, or 231.8181 for 8-bit values and 59577.2727 for 16-bit values. This allows for a slight overflow of XYZ values when converting from RGB, improving accuracy.

+ + +

Change History

+ +

Changes in CUPS 1.4.7

+ +
    + +
  • Greatly improved the detail and now include an example of the bitmap compression.
  • +
  • Added all missing cupsColorSpace values and a separate description of CUPS_CSPACE_RGBW.
  • + +
+ + +

Changes in CUPS 1.2.2

+ +
    + +
  • Added version 3 (uncompressed) format.
  • + +
+ + +

Changes in CUPS 1.2.1

+ +
    + +
  • Added new sections on coding pixel values.
  • + +
  • Clarified definitions of color spaces.
  • + +
+ + +

Changes in CUPS 1.2

+ +
    + +
  • Bumped raster version to 2
  • + +
  • Added RGBW color space
  • + +
  • Added 16 bit per color support
  • + +
  • Added cupsNumColors, cupsBorderlessScalingFactor, cupsPageSize, cupsImagingBBox, cupsInteger, cupsReal, cupsString, cupsMarkerType, cupsRenderingIntent, and cupsPageSizeName attributes to the page device dictionary
  • + +
  • Added raster data compression
  • + +
  • Added data type column to device dictionary documentation.
  • + +
+ +

Changes in CUPS 1.1.19

+ +
    + +
  • Added ICC and CIE color spaces.
  • + +
+ + + diff --git a/doc/help/spec-stp.html b/doc/help/spec-stp.html new file mode 100644 index 0000000..06c099b --- /dev/null +++ b/doc/help/spec-stp.html @@ -0,0 +1,133 @@ + + + + + CUPS Software Test Plan + + + + +

CUPS Software Test Plan

+ +

This software test plan provides detailed tests that are used +to evaluate the stability and compliance of CUPS.

+ + +

Test Procedure

+ +

The test software and data files are located in the +test subdirectory of the source distribution. A script +is provided to compile the ipptool program and run +all of the tests that follow, producing a success/fail +report.

+ +

The test target of the top-level makefile can be +used to run this script:

+ +
+make test
+
+ +

or you can run the test script directly:

+ +
+cd test
+./run-stp-tests
+
+ +

A Software Test Report is stored in a HTML file in the +test subdirectory at the conclusion of the test.

+ + +

IPP Compliance Tests

+ +

This section describes the tests used to validate the IPP +standards compliance of the CUPS server.

+ +

Request Tests

+ +

These tests verify that the CUPS scheduler only accepts valid +IPP requests that start with the attributes-charset +and attributes-natural-language attributes and also +contain a printer-uri or job-uri +attribute.

+ +

It also verifies that the CUPS scheduler always responds with +attributes-charset and +attributes-natural-language attributes, using +default values if they are not provided by the client.

+ +

CUPS Printer Operation Tests

+ +

These tests verify that the CUPS printer operations are +supported and function properly. Two printers called +Test1 and Test2 are created, one as a +PostScript printer and one as a raster printer.

+ +

Job Operation Tests

+ +

These test verify that the CUPS scheduler accepts print jobs +for all supported file formats and that the +cancel-job, hold-job, and +resume-job operations work.

+ +

Subscription Operation Tests

+ +

These test verify that the CUPS scheduler accepts +subscriptions with print jobs and that all subscription +operations work as required by the IPP notification and mailto +specifications.

+ + +

Command Tests

+ +

This section describes the tests used to validate the Berkeley +and System V commands included with CUPS.

+ +

lpadmin

+ +

This test verifies that printers can be added, modified, and +defaulted using the lpadmin command.

+ +

lpc

+ +

This test verifies that the lpc command can show +the current status of all print queues.

+ +

lpq

+ +

This test verifies that the lpq command lists +any jobs in the queue.

+ +

lpstat

+ +

This test verifies that the lpstat command works +with all reports using the "-t" option.

+ +

lp

+ +

This test verifies that the lp command works with +both the default destination and a specific destination.

+ +

lpr

+ +

This test verifies that the lpr command works +with both the default destination and a specific destination.

+ +

lprm

+ +

This test verifies that the lprm command can +properly cancel a job.

+ +

cancel

+ +

This test verifies that the cancel command can +properly cancel a job or all jobs.

+ +

lpinfo

+ +

This test verifies that the lpinfo command +returns a list of available printer drivers and devices.

+ + + diff --git a/doc/help/standard.html.in b/doc/help/standard.html.in new file mode 100644 index 0000000..f957fe2 --- /dev/null +++ b/doc/help/standard.html.in @@ -0,0 +1,181 @@ + + + + Standard Configuration + + + + +

Standard Configuration

+ +

This document describes the standard configuration for this CUPS +server.

+ +
Note: + + +

This file reflects the standard CUPS configuration as distributed +by Apple Inc, the developer of CUPS.

+ +
+ + +

cupsd Configuration

+ +

cupsd(8) is configured by default to show +printers shared by other systems and only allow local access to +the system and its printers. Administration operations require +Basic authentication with membership in the group +"@CUPS_GROUP@".

+ +

Connections are accepted via domain socket +(@CUPS_DEFAULT_DOMAINSOCKET@) or "localhost" +(127.0.0.1).

+ +

Settings

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Default Values
DirectiveValue
Browsing@CUPS_BROWSING@
BrowseLocalProtocols@CUPS_BROWSE_LOCAL_PROTOCOLS@
BrowseRemoteProtocols@CUPS_BROWSE_REMOTE_PROTOCOLS@
BrowseShortNames@CUPS_BROWSE_SHORT_NAMES@
ConfigFilePerm@CUPS_CONFIG_FILE_PERM@
DefaultShared@CUPS_DEFAULT_SHARED@
ImplicitClasses@CUPS_IMPLICIT_CLASSES@
LogFilePerm@CUPS_LOG_FILE_PERM@
MaxCopies@CUPS_MAX_COPIES@
UseNetworkDefault@CUPS_USE_NETWORK_DEFAULT@
+ + +

Directories

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Directories
DirectoryPurpose
@CUPS_SERVERROOT@The location of configuration files such as + printers.conf. Overridden by the ServerRoot + directive in cupsd.conf.
@bindir@The location of user programs.
@includedir@The location of CUPS include files.
@libdir@The location of CUPS library files.
@CUPS_SERVERBIN@The location of server programs such as backends and + filters. Overridden by the ServerBin + directive in cupsd.conf.
@sbindir@The location of administrator programs.
@CUPS_DATADIR@The location of data files such as fonts. Overridden + by the DataDir + directive in cupsd.conf.
@CUPS_DOCROOT@The location of documentation files. Overridden by + the DocumentRoot + directive in cupsd.conf.
@CUPS_LOCALEDIR@The location of localization files.
@CUPS_CACHEDIR@The location of cache files such as + ppds.dat and remote.cache. + Overridden by the CacheDir + directive in cupsd.conf.
@CUPS_LOGDIR@The location of the access_log, + error_log, and page_log files. + Overridden by the AccessLog, + ErrorLog, + PageLog, + directive in cupsd.conf.
@CUPS_STATEDIR@The location of the domain socket file and state data + such as authentication certificates. Overridden by the StateDir + directive in cupsd.conf.
@CUPS_REQUESTS@The location of spooled print jobs. Overridden by the + RequestRoot + directive in cupsd.conf.
+ + + diff --git a/doc/help/translation.html b/doc/help/translation.html new file mode 100644 index 0000000..a4ada4a --- /dev/null +++ b/doc/help/translation.html @@ -0,0 +1,852 @@ + + + + Translating and Customizing CUPS + + + + +

Translating and Customizing CUPS

+ +

Thanks to its extensive use of templates, images, and message +catalogs, CUPS can be easily translated (or customized!) to suit +your needs. This help file will guide you through the CUPS +localization files so you can get the most out of it.

+ + +

Getting Started

+ +

Start by downloading the CUPS source code from www.cups.org. After you extract the files +from the source archive, you will want to copy the following +files and directories:

+ +
    + +
  • desktop/cups.desktop - the GNOME/KDE + desktop file pointing to the CUPS web interface
  • + +
  • doc/index.html - the web interface home + page
  • + +
  • locale/cups.pot - the message catalog
  • + +
  • templates/*.tmpl - the web interface + template files
  • + +
+ +

With the exception of the message catalogs and desktop file, +localization files are placed in subdirectories under the +doc and templates using the locale name. +Locale names are either ll or ll_CC, where +"ll" is the 2-letter language code and "CC" is the 2-letter +country code. CUPS does not currently use or support the newer +ll-region syntax for locale names.

+ +

All non-image files must be encoded using the UTF-8 character +set.

+ + +

Submitting a Translation for CUPS

+ +

To submit a translation for inclusion in CUPS, translate the +desktop file, all of the template files, the index.html.in +file, and the message catalog. Place these files in the correct +subdirectories in the CUPS source code archive and run the following +command to create an archive with your files:

+ +
+tar cvf ll_CC.tar.gz desktop/cups.desktop doc/ll_CC \
+    locale/cups_ll_CC.po templates/ll_CC
+
+ +

Replace "ll_CC" with the locale name for your translation. +Once you have created the archive, go to the CUPS Bugs +& Features page and submit a bug report, attaching the +translation to the report.

+ + +

The Desktop File

+ +

The desktop/cups.desktop file provides a link to +the CUPS web interface from desktop environments such as +GNOME and KDE. To translate this file, add two lines to the +bottom with the Name and Comment keys:

+ +
+Name[ll_CC]=Translation of "Manage Printing"
+Comment[ll_CC]=Translation of "CUPS Web Interface"
+
+ + +

The Home Page

+ +

The index.html file is a complete HTML file that is +displayed when the user visits "http://localhost:631/". Edit the +existing doc/index.html and save it in the +doc/ll_CC subdirectory so that the makefile can +install it. Run "make install" in the doc subdirectory +to test the new home page.

+ + +

Message Catalogs

+ +

CUPS message catalogs are GNU gettext ".po" text files that +provide a list of localized message strings for the CUPS +software. Message catalogs are named cups_ll.po or +cups_ll_CC.po, where "ll" is the standard 2-letter +abbreviation for the language and "CC" is the standard 2-letter +abbreviation for the country.

+ +

When translating a new message catalog, copy the +cups.pot message catalog file in the locale +subdirectory of the CUPS source code. For example, to start +translating the message catalog to Canadian French, you would +type the following commands:

+ +
+cd locale
+cp cups.pot cups_fr_CA.po
+
+ +

Alternatively, you can copy the existing cups_fr.po +message catalog and then make any necessary changes.

+ +

Once you have make your copy of the file, edit it using your +favorite text editor or translation program to translate the text +to the desired language.

+ +

Then validate your translation using the locale/checkpo utility:

+ +
+cd locale
+./checkpo cups_ll_CC.po
+
+ +

After fixing any errors in your translation, add your locale to the LANGUAGES +variable in the Makedefs file and run the "make +install" command in the locale subdirectory to test +the translation.

+ + +

Template Files

+ +

The CUPS scheduler provides a web interface that can be used +to do many common printing and administration tasks. The built-in +web server supports localization of web pages through the use of +subdirectories for each locale, e.g. "fr" for French, "de" for +German, "fr_ca" for French in Canada, and so forth.

+ +

Template files are HTML files with special formatting +characters in them that allow substitution of variables and arrays. +The CUPS CGI programs (admin.cgi, +classes.cgi, help.cgi, +jobs.cgi, and printers.cgi) use these +template file to provide dynamic content for the web interface. +Template files are installed in the +/usr/share/cups/templates directory by default. Table +2 lists the various template files and their purpose.

+ +

Translated versions of the template files should be saved in +the templates/ll_CC subdirectory. For example, +Canadian French template files should be saved in the +templates/fr_CA subdirectory. After you have +translated all of the templates, add the locale to the +LANGUAGES variable in the +Makedefs file and run "make install" in the +templates subdirectory to test the translation.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Web Interface Template Files
FilenamePurpose
add-class.tmplThis is the initial form that is shown to add a new + printer class.
add-printer.tmplThis is the initial form that is shown to add a new + printer.
add-rss-subscription.tmplThis is the form that is shown to add a new RSS subscription.
admin.tmplThis is the main administration page.
choose-device.tmplThis is the form that shows the list of available + devices.
choose-make.tmplThis is the form that shows the list of available + manufacturers.
choose-model.tmplThis is the form that shows the list of available + printer models/drivers.
choose-serial.tmplThis is the form that allows the user to choose + a serial port and any options.
choose-uri.tmplThis is the form that allows the user to enter + a device URI for network printers.
class-added.tmplThis template shows the "class added" message.
class-confirm.tmplThis is the template used to confirm the + deletion of a class.
class-deleted.tmplThis template shows the "class deleted" message.
class-jobs-header.tmplThis template shows the "jobs" header for jobs in a + class.
class-modified.tmplThis template shows the "class modified" message.
classes.tmplThis template shows one or more printer classes.
classes-header.tmplThis template shows the "showing N of M classes" header in + the class list.
edit-config.tmplThis is the cupsd.conf editor page.
error.tmplThis template displays a generic error message.
error-op.tmplThis is the "unknown operation" error page.
header.tmplThis template is used as the standard header on all dynamic + content.
help-header.tmplThis is the top part of the help page.
help-printable.tmplThis is the standard page header for the printable + version of help files.
job-cancel.tmplThis template shows "job canceled".
job-hold.tmplThis template shows "job held".
job-move.tmplThis template shows the move-job form.
job-moved.tmplThis template shows "job moved".
job-release.tmplThis template shows "job released".
job-restart.tmplThis template shows "job reprinted".
jobs.tmplThis template is used to list the print jobs on a server, + class, or printer.
jobs-header.tmplThis template shows the "showing N or M jobs" header in the + jobs list.
list-available-printers.tmplThis template shows a list of new printers that have been found.
maintenance.tmplThis template shows "maintenance commands sent".
modify-class.tmplThis template is used as the first form when modifying a + class.
modify-printer.tmplThis template is used as the first form when modifying a + printer.
norestart.tmplThis template shows "server not restarted because no + changes were made to the configuration".
option-boolean.tmplThis template is used to select a boolean PPD option.
option-conflict.tmplThis template shows the conflicting options.
option-header.tmplThis template is used to start a PPD option group.
option-pickmany.tmplThis template is used to select a multi-valued PPD option.
option-pickone.tmplThis template is used to select a single-valued PPD option.
option-trailer.tmplThis template is used to end a PPD option group.
pager.tmplThis template shows the previous/next pager bar.
printer-accept.tmplThis template shows "printer now accepting jobs".
printer-added.tmplThis template shows "printer added".
printer-configured.tmplThis template shows "printer configured".
printer-confirm.tmplThis template asks the user to confirm the deletion + of a printer.
printer-default.tmplThis template shows "default printer set".
printer-deleted.tmplThis template shows "printer deleted".
printer-jobs-header.tmplThis templates shows the "jobs" header for jobs on a + printer.
printer-modified.tmplThis template shows "printer modified".
printer-purge.tmplThis template shows "printer has been purged of all jobs".
printer-reject.tmplThis template shows "printer now rejecting jobs".
printer-start.tmplThis template shows "printer started".
printer-stop.tmplThis template shows "printer stopped".
printers.tmplThis template is used to list information on one or more + printers.
printers-header.tmplThis template shows the "showing printer N of M" header in + the printers list.
restart.tmplThis template shows "server restarting".
samba-export.tmplThis template shows the export printers to Samba form.
samba-exported.tmplThis template shows "printers exported to Samba".
search.tmplThis template shows the search form.
set-printer-options-header.tmplThis template shows the first part of the set printer options + form.
set-printer-options-trailer.tmplThis template shows the last part of the set printer options + form.
subscription-added.tmplThis template shows "subscription ... added".
subscription-canceled.tmplThis template shows "subscription #NNN canceled".
test-page.tmplThis template shows "test page printed".
trailer.tmplThis template is used as the standard trailer on all dynamic + content.
users.tmplThis template shows the set allowed users form.
+ +

Inserting Attributes and Values

+ +

Template files consist of HTML with variable substitutions for +named inside curly braces "{name}". Variable names are generally +the IPP attribute names with the hyphen ("-") replaced by the +underscore ("_") character. For example, the +job-printer-uri attribute is renamed to +job_printer_uri.

+ +

Curley braces ("{" and "}") to indicate substitutions, and the +backslash ("\") character for quoting. To insert any of these +special characters as-is you need to use the HTML +&name; mechanism or prefix each special +character with the backslash ("\".)

+ +

You substitute the value of a variable using +{NAME} in your template file. If the variable is +undefined then the {NAME} string is output +as-is.

+ +

To substitute an empty string if the variable is undefined, +use {?NAME} instead.

+ +

Array Substitutions

+ +

The number of array elements can be inserted using +{#NAME}. If the array is undefined then 0 is output. +The current array element (starting at 1) is inserted with +{#}.

+ +

Arrays are handled using {[NAME] at the beginning +of a section and } at the end. The information +between the closing bracket ("]") and closing brace ("}") is +repeated for as many elements as are in the named array. For +example, the following template will display a list of each job +in the job_id array:

+ +
+<TABLE>
+<TR>
+	<TH>Job ID</TH>
+	<TH>Destination</TH>
+	<TH>Title</TH>
+</TR>
+
+{[job_id]
+<TR>
+	<TD>{?job_id}</TD>
+	<TD>{?job_printer_name}</TD>
+	<TD>{?job_name}</TD>
+</TR>
+}
+</TABLE>
+
+ +

Arrays can be nested, however all elements within the curly +braces ("{" and "}") are indexed using the innermost array.

+ +

Conditional Tests

+ +

Templates can also test variables against specific values and +conditionally include text in the template. The format is:

+ +
+{variable?true:false}
+{variable=value?true:false}
+{variable!value?true:false}
+{variable<value?true:false}
+{variable>value?true:false}
+
+ +

where true is the text that is included if the +condition is true and false is the text that is +included if the condition is false. A value of # is +replaced with the current element number (starting at 1.) The +character after the variable name specifies the condition to +test. Table 3 shows the available test conditions.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3: Template Substitution Conditions
CharCondition
?True if variable exists.
=True if variable is equal to value.
!True if variable is not equal to value.
<True if variable is less than value.
>True if variable is greater than value.
+ +

CGI Programs

+ +

CUPS uses five CGI programs to manage the dynamic web +interfaces:

+ +
    + +
  • admin.cgi
  • +
  • classes.cgi
  • +
  • help.cgi
  • +
  • jobs.cgi
  • +
  • printers.cgi
  • + +
+ +

Each CGI program accepts standard form variables such as +OP for the operation to perform, +PRINTER_NAME for the printer or class name to +operate on, QUERY for any search words, +FIRST for the first class, job, or printer to +display, and ORDER to control the order that +classes, jobs, or printers are displayed.

+ +

In addition, the classes.cgi, +jobs.cgi, and printers.cgi programs +support a WHICH_JOBS variable to control which jobs +are displayed. Table 4 lists the supported values.

+ +
+ + + + + + + + + + + + + + + + + + + +
Table 4: WHICH_JOBS Values
WHICH_JOBS ValueDescription
allShow all jobs
completedShow completed jobs
not-completedShow active jobs
+ +

admin.cgi

+ +

The admin.cgi program handles all of the printer +and class administration functions and is run for all direct +accesses to the /admin resource. For most operations +it uses the PRINTER_NAME and OP form +variables to specify the action requested. Table 5 shows the +supported OP values.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 5: admin.cgi OP Values
OP ValueDescription
accept-jobsAccepts jobs on the named destination.
add-classAdds a new printer class.
add-printerAdds a new printer.
config-serverConfigures the server.
delete-classDeletes a printer class. The form variable CONFIRM + may be set to any value to bypass the confirmation page.
delete-printerDeletes a printer. The form variable CONFIRM + may be set to any value to bypass the confirmation page.
export-sambaExports printers to Samba.
find-new-printersFind new printers that have not yet been added.
modify-classModifies a printer class.
modify-printerModifies a printer.
purge-jobsPurges all jobs on the named destination.
redirectRedirects the web browser to the location referenced by + the URL form variable.
reject-jobsRejects new jobs on the named destination.
set-allowed-usersSets the allowed users for a destination.
set-as-defaultSets the default destination.
set-printer-optionsSets the default options for a printer.
set-sharingSets the printer-is-shared attribute for a destination.
start-classStarts the named class.
start-printerStarts the named printer.
stop-classStops the named class.
stop-printerStops the named printer.
+ +

classes.cgi

+ +

The classes.cgi program is responsible for +listing class information, including jobs destined for that +class. It is for all direct accesses to the /classes +resource and supports the optional form variables OP +and WHICH_JOBS. If no form variables are supplied +then the CGI lists all or a specific class and the active jobs on +each class. Table 6 shows the supported OP +values.

+ +
+ + + + + + + + + + + + + + + + + +
Table 6: classes.cgi OP Values
OP ValueDescription
move-jobsMoves the jobs on this class to another destination.
print-test-pagePrints the standard PostScript test page.
+ + +

help.cgi

+ +

The help.cgi program handles all of the on-line +help functions and is run for all direct accesses to the +/help resource.

+ + +

jobs.cgi

+ +

The jobs.cgi program handles all of the job +functions and is run for all direct accesses to the +/jobs resource. For most operations it uses the +JOB_ID, OP, and WHICH_JOBS +form variables to specify the action requested. Table 7 shows the +supported OP values.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 7: jobs.cgi OP Values
OP ValueDescription
cancel-jobCancels a job.
hold-jobHolds a job indefinitely.
move-jobMoves a job to another destination.
release-jobReleases a job for printing.
restart-jobRestarts/reprints a stopped, canceled, completed, or aborted + print job.
+ + +

printers.cgi

+ +

The printers.cgi program is responsible for +listing printer information, including jobs destined for that +printer. It is for all direct accesses to the +/printers resource and supports the optional form +variables OP and WHICH_JOBS. If no form +variables are supplied then the CGI lists all printers or a +specific printer and the active jobs on that printer. Table 8 +shows the supported OP values.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 8: printers.cgi OP Values
OP ValueDescription
clean-print-headsClean the print heads.
move-jobsMove all jobs to a different destination.
print-self-test-pagePrint a printer self-test page.
print-test-pagePrint a PostScript test page.
+ + + diff --git a/doc/help/whatsnew.html b/doc/help/whatsnew.html new file mode 100644 index 0000000..856f30a --- /dev/null +++ b/doc/help/whatsnew.html @@ -0,0 +1,61 @@ + + + + What's New in CUPS 1.5 + + + + +

What's New in CUPS 1.5

+ +

CUPS 1.5 many changes and new features to CUPS 1.4.x. This page provides a high-level outline of these changes. If you have never used CUPS before, read the "Overview of CUPS" document instead.

+ +

Commands

+ +
    + +
  1. User defaults; Starting in CUPS 1.2, user defaults were stored in the ~/.cups directory, and the old ~/.cupsrc and ~/.lpoptions files were deprecated. Support for ~/.cupsrc and ~/.lpoptions have been removed in CUPS 1.5.
  2. + +
  3. IPP test tool; The ipptool IPP test tool is now a first-class user program.
  4. + +
  5. lpadmin; The lpadmin command now supports setting the cupsIPPSupplies and cupsSNMPSupplies keywords in PPDs and deleting options.
  6. +
+ +

Scheduler

+ +
    + +
  1. Filter security; Filters and backends must now have group write permissions disabled.
  2. + +
+ + +

Print Filters

+ +
    + +
  1. HP-GL/2 filter; The HP-GL/2 filter is no longer provided with CUPS.
  2. + +
  3. PDF filter; The PDF filter now supports new Poppler and Ghostscript options.
  4. + +
  5. PWG Raster driver; Added a new PWG Raster printer driver filter.
  6. + +
  7. SCSI backend; The SCSI backend is no longer provided with CUPS.
  8. + +
+ + +

CUPS API

+ +
    + +
  1. CUPS headers; Changes to the main CUPS header may require code changes to applications and toolkits. Users of PPD functions must now include the <cups/ppd.h> header file explicitly since the <cups/cups.h> header no longer does so.
  2. + +
  3. HTTP support: Applications can now set a per-connection timeout interval and callback for HTTP operations as well as query and set SSL/TLS X.509 certificates.
  4. + +
  5. Raster support; The CUPS raster functions now support the creation of PWG Raster files and streams, and a new callback-based context function allows reading and writing from objects other than file descriptors.
  6. + +
+ + + diff --git a/doc/hu/index.html.in b/doc/hu/index.html.in new file mode 100755 index 0000000..ae0039d --- /dev/null +++ b/doc/hu/index.html.in @@ -0,0 +1,113 @@ + + + + + Kezdőlap - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Kezdőoldal    Adminisztráció    Osztályok    Online súgó    Feladatok    Nyomtatók  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

A CUPS az Apple Inc. által a Mac +OS® X és más UNIX®-szerű operációs +rendszerekhez kifejlesztett, szabványokra épülő, nyílt forrású +nyomtatórendszer.

+ +
CUPS
+ + + +
+ +

CUPS felhasználóknak

+ +

A CUPS bemutatása

+ +

Parancssori nyomtatás és kapcsolók

+ +

A CUPS 1.5 újdonságai

+ +

Felhasználói fórum

+ +
+ +

CUPS rendszergazdáknak

+ +

Nyomtatók és osztályok hozzáadása

+ +

Műveletházirendek kezelése

+ +

Nyomtatási számlázás alapjai

+ +

Kiszolgáló biztonsága

+ +

Kerberos hitelesítés használata

+ +

Hálózati nyomtatók használata

+ +

cupsd.conf referencia

+ +

Nyomtató-illesztőprogramok +keresése

+ +
+ +

A CUPS fejlesztőknek

+ +

A CUPS programozásának bemutatása

+ +

CUPS API

+ +

Szűrők és háttérprogramok +programozása

+ +

HTTP és IPP API-k

+ +

PPD API

+ +

Raszter API

+ +

PPD fordító illesztőprogram-információs fájljának referenciája

+ +

Fejlesztői fórum

+ +
+ +
 
A CUPS és a CUPS logó az Apple Inc. védjegyei. CUPS copyright +2007-2012 Apple Inc. Minden jog fenntartva.
+ + diff --git a/doc/id/index.html.in b/doc/id/index.html.in new file mode 100644 index 0000000..032cff9 --- /dev/null +++ b/doc/id/index.html.in @@ -0,0 +1,107 @@ + + + + + Beranda - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Beranda    Administrasi    Kelas    Bantuan Langsung    Tugas    Pencetak  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS adalah sistem pencetakan berstandar dan berkode sumber terbuka, dikembangkan oleh +Apple Inc. untuk Mac OS® X dan sistem +operasi serupa UNIX® lainnya.

+ +
CUPS
+ + + +
+ +

CUPS bagi Pengguna

+ +

Ikhtisar CUPS

+ +

Opsi dan Pencetakan dari Baris Perintah

+ +

Apa yang Baru di CUPS 1.5

+ +

Forum Pengguna

+ +
+ +

CUPS bagi Administrator

+ +

Menambah Pencetak dan Kelas

+ +

Mengatur Kebijakan Operasi

+ +

Dasar Akunting Pencetak

+ +

Keamanan Server

+ +

Menggunakan Otentikasi Kerberos

+ +

Menggunakan Pencetak di Jaringan

+ +

Referensi cupsd.conf

+ +

Mencari Penggerak Pencetak

+ +
+ +

CUPS bagi Pengembang

+ +

Pengenalan untuk Pemrograman CUPS

+ +

API di CUPS

+ +

Penyaring dan Pemrograman Balik (Backend Programming)

+ +

API di HTTP dan IPP

+ +

API di PPD

+ +

API di Raster

+ +

Referensi Kompiler Berkas Penggerak PPD

+ +

Forum Pengembang

+ +
+ +
 
CUPS dan logo CUPS logo adalah merek dagang dari +Apple Inc. Hak cipta CUPS pada 2007-2012 Apple +Inc. Semua hak terpelihara.
+ + diff --git a/doc/images/color-wheel.png b/doc/images/color-wheel.png new file mode 100644 index 0000000000000000000000000000000000000000..301e3fd59adceacf495738adc24618e7f8a20b51 GIT binary patch literal 13148 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 z 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 qU-{oZ{O7^^?|J;YQ2u|G!<HV+n+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + Scheduler (cupsd) + + + + + Filter + PPD Filter + Backend + PortMonitor + + + + + + + JobFiles + Web Interface(CGI) + + + + + BerkeleyCommands + CUPSCommands + System VCommands + + + + + + + ConfigFiles + + + + + + + LogFiles + + Notifiers + EmailRSS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LPD Support(cups-lpd) + + + + Printer + + + + + + + + + + + + diff --git a/doc/images/cups-command-chain.png b/doc/images/cups-command-chain.png new file mode 100644 index 0000000000000000000000000000000000000000..a7218e5ce45e57783db68fb655cdd0de11d91749 GIT binary patch literal 14902 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + PPD + + + + OptionalCommandFilter + + + + + + + + + CommandFile + + + + + + Printer + + + + + OptionalPortMonitor + + + + + Backend + + + diff --git a/doc/images/cups-icon.png b/doc/images/cups-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0f6ff20b6a79d23874eb72563f4fdc32b6ae1e GIT binary patch literal 4888 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%0D`(`1N-in9De0)>vYsSEBW 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%0D2g-FUfoW%hNrl3;Ih< zPv53vQ|%A*i;RqH$Xp*RmlT&T*MVCk7>#Cmz1WMj_(?xr+K{xj=K~)VBfPD=vT_T$ z!(-0J5GBxX@9gXh>&~~IK~UY%l!Q#iDg}Up4FQ3PZ3VwbH(#HqlkHQdmb#ip%Wr~Z zP|x#Tw1d~m&e>TAl@|vNK(Meu7TzBgy@VCb1k+v?a*zV23y5$N>ATo|>GI`=j*bG* zmHrD!c@tVI)6>(I#3RAsjO&po84IatEjzS;0J8fn5I~xeHLwSRc;B|m+~07s=uk~| zuQ(-ACn8|8wX-u6z#^|{2R-a^Td)k3dHi^4YRX6x^LKIaLuKWCz+2E$RjYP;O;1mc zQ_ZO_E58`{TOb5@qN&BT(F~QFTzaili$_V%d!-0Rv6QfQ6jDD*&`SGbXkVsU^ZMky zM?e%-E4g8$udP<*0qW1uj&R6y;pgYaa%=1Zmbo7w9oyR3C4*UPh^i41d&PI|4#(}- z$(@~@b|>1qMjOAXUm6(|6c@KWH}l$GpSUjj9n~MQ ziwz&D(zSkn_y(UBiqQio7M2qC0b63r5-j47fj2}&W1y`7n($#)%FbTvetZVVLBLCI!s5`%0kucmDJV(i}fe2jc58vlC=zx(0y!>Fd{GONL`Vf_0 z`0BqApMESUiG%gB0Z=Qp9*w~UGqg#jrl+ML41}Fm=>g^pJ(woyX^ry7Exb?#4Z2j= z!CM7>F|2zD8=qJr^_bE1mOicx6zXUZhudHyh6G^@rs4I2q@$pwZib7j@H+Yal?S}s zitm9%Qvl8fok$6Q16D_d?b6GCN`ipIUCo$HZ(IM+oduZ@10Kt%@qrALRFc;eke!xt zkKMp72G-h1s3$29*RTgH6i8fw+m1Qd!u`|J)03O5fe*M&hd=&s$d2==+m_qg`;5MJ z59_F{e|s_DEKj@S1I%5a@h__HAVGyOyZO}=74dh9@5LG32c`$Sm%s-)>>$G36WeWJ zO}qr#CZQ*knVDI&-7OFPwKxA-+PZ^Pu0@m1$myTq>M##-2}PHra59da1l19W;-F_c zf^jxg`4I9j36&xnLN~NJUg?~dY_$NsJF~H>ipg%%CWHjE%0VDm<9rdP4-C)`JQ5L1@TC~uz}qwPR_g)sPk?)Hsdw5v2OHeNXqS< zrphMIRva9>TI}}%gj}nfHD&tTwmvpo!}UlupZJhtH3u{rS;LyaUnF^Kxrmq8y|RQV zpJ+b^$GU+0`%{YP3GZ-`sj?VsPDCXC&FX$iMKkPz-IFu)QUO!x0&M#-=vmIho&t@p zV8Yp9RkZL?{f#3@Xh@%l-5YQh+~~?I(Ea{*O|Ut?3ieen_%)vPsk&;DCB-Ms4EKNV3?QL5e- zs)cWX3^3=+WMuCG-1}UY274d)4Q(93lSCIv!&~1xFi>XDXcr{;^5qRcDe?$2Gc#!z znOWGzQ=N|dL#h@kPiXW6@o4M`?CO+8+Ji003Y^JJ&V3vNV1@+8X*bisXlI6x5Xg^} zKG0Vs@;=^ZHjt30#f3enHLx?o1$@QL*zJl#q83*JK|QhCoPMGdCmikuqIxzcglpko z;d6%Bj4Y#KfiFOKq)G?7?OPxlS;6R6ytBP+i8|_^QInSb!410&4g_kCDA^|3laPO` zCWt49(Wr{-YzuLH{qYWHe&xo;#fbqE8;y^T9|il|a<+P=-~aQq1cnwCvFS;gJp$I_ zHP{`=ur&b2{t^YnBZzb8$A1WgO+Oxx%=55ggwVlZYXxl0Csr_Z6?;`zQ&8a?q!0jt z)v#-+tY-gj&;;xyc7>H@K|3y_2Js#CLRSK*+1~||dfw~#F6QwgY6K=WA`O{|8DA(1 z{{+G)0Tdes`?~9Wb3_ij#8(E?#7I% z>BH B#y9`~ literal 0 HcmV?d00001 diff --git a/doc/images/cups-postscript-chain.svg b/doc/images/cups-postscript-chain.svg new file mode 100644 index 0000000..d1e2d3e --- /dev/null +++ b/doc/images/cups-postscript-chain.svg @@ -0,0 +1,531 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + PPD + + + + + Printer + + + + + OptionalPortMonitor + + + + + Backend + + + + OptionalPostScriptFilter + + OptionalPostScriptFilter + + + + + + + + + + + + PrintFile + + + + + + + CUPSFilters + + + CUPSFilters + + + + + diff --git a/doc/images/cups-raster-chain.png b/doc/images/cups-raster-chain.png new file mode 100644 index 0000000000000000000000000000000000000000..5349bd9f573c0ffd8e630deb29a1c24f593da68c GIT binary patch literal 16916 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 literal 0 HcmV?d00001 diff --git a/doc/images/cups-raster-chain.svg b/doc/images/cups-raster-chain.svg new file mode 100644 index 0000000..5130c81 --- /dev/null +++ b/doc/images/cups-raster-chain.svg @@ -0,0 +1,534 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + PPD + + + + + Printer + + + + + OptionalPortMonitor + + + + + Backend + + + + OptionalPostScriptFilter + + + RequiredRasterFilter + + + + + + + + + + + + + PrintFile + + + + + + + CUPSFilters + + + CUPSFilters + + + + + diff --git a/doc/images/cups.png b/doc/images/cups.png new file mode 100644 index 0000000000000000000000000000000000000000..5c0f6ff20b6a79d23874eb72563f4fdc32b6ae1e GIT binary patch literal 4888 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + CUPS Icon + + + Michael Sweet + + + + + Apple Inc. + + + + + + + + + + + + + + + + + + + + diff --git a/doc/images/generic.png b/doc/images/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..2abe9de9ec6a3f00e2ebb2649aa3e3b0ade4037c GIT binary patch literal 16913 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 literal 0 HcmV?d00001 diff --git a/doc/images/left.gif b/doc/images/left.gif new file mode 100644 index 0000000000000000000000000000000000000000..e82004257b70460672d89924f77a284f09ea1e28 GIT binary patch literal 1492 zcmdth{a2D_90u@*gEqvbX4JH4gN8G!vsrUHwyc?%l34??vX1Mh#6*N~5Jo;bkbKT$T`U~#R6CwTwV*&v@ zU~L6rVq#)rV<{90l}e3^i=)wK@$vC=Iz1sFfx%!TB_$;%C#R&Oq^71anas4bv@2Jx zT)lcVJw2VxW@lt%WM*b&Wo2FMq5 zefI2GUteE;fB(S1fC(~a8XO!P8X6iN9)1BCc`-6F@)9!oa&&ZbYalIB{HXB^d4kQJ(-t51ER-sm(@h-4oSW zBX8%iE;WEF3%G3#$OCkfNfCHZQbDE;Gs;BY>b|F+uNqLDDZkXy+%P+=UhEcniK>H6$3O4ZjJf=xjwm<0QA#x&S3b@E zaQ9A^-frD{&`r+En^r?Px z4tUu0Z}(WH+#=l9IAam{8g^4eYU1-y5I@bj>8Y9l9TNjL`Aj9S*vC(%5||razm%wnPC@&!M*_EjE7$s{{D<#n7#Y2 z#xHj&IJE_lf3kf6B*V`JIvy<~wxbK&OejbE+Z%r{SWHW8-`#Sc!L4zl2 m!p&v`^(4WLq++pcPZ1ux=HWM-xYXlstyt;}c;(>&9QqHfB_qxN literal 0 HcmV?d00001 diff --git a/doc/images/left.xcf.gz b/doc/images/left.xcf.gz new file mode 100644 index 0000000000000000000000000000000000000000..d403e78e5c6d3de6210c8328276b57fb2ce0d355 GIT binary patch literal 1194 zcmV;b1XcSViwFP!000001GQ9bXj@enJ~uY@YsKoiAy#MFZqiQsv91$IoYc+r1C=?& z5BwTwnxvU+Qqz>RqO>aW*Ay*Y#!gJo8an2+e!3wE1DqS&sMam1Md^U z3|9kM1=wS6 zkyy#fmdl_G;@BBWHOg7|1)vk_kz)X}mdD)Bd5*epyu$z=k(;n9Z2byoW9@q%9Q$Nu z0cWe3|9leD0*SU|;Y(88ySM4yea*XDwl|PF>TySS0AQN5e0FN_#gFHP-X1&m*6=gD zKkNc{mfSrs@aW6_cRC*FpMBlw#fQOzCIJRXUC*wL2X^msJlu6pTcv;pDX#(?A-2=A zCxfq@99f(>JBOE#90l-@T31)|{ZDt^6*$t@%^uJ~@(%$lAXX7=^4s}3^t6^J{Di#a zw_bruyhl3=+9B-7_W+#14_HX6KoV9}mS|+U~ zRfk%LNmRDWT7)L^IeShM)!aWEv)PPlS2dc==$KA3EYh@)c3_xFr+JtXQVs-lKju_C z(Y}U7nh+AKHIdNMiFll+<3gNmQ3S;yYgCCT?E5sP#5hJ{I!2;V#3GFd5!M!tgn2p~ zj_4?}xPYyB}WFleaCC)>{xWdy0 zAu&bagU5sz4-FooLe#-&(dUnZOK9SuNag*QlVpk4WJ%&%C7ll{ZQ?^@UE-B%oR66J z=kH7QB`pbOk<>>|l#ojU z#b6*(!Y5D+QRtlf2N{M&iZm>Q9h<0-WfKK!Oh}XybY0{MK`N+NP8tRkGt~tC1zFMU I?_CH00G^a!ApigX literal 0 HcmV?d00001 diff --git a/doc/images/raster-organization.png b/doc/images/raster-organization.png new file mode 100644 index 0000000000000000000000000000000000000000..c390f4144deee31bf5abb3c7f9a1c47a06ba4091 GIT binary patch literal 20974 zcmeFZd03MB-|tJSRjyUbT&zaRp-^+mp`21vD@_G+$Q;VKObrpuoKgf^O;VZ`PB}M# zW{R_*D9~VBRB3Mp@ilic_h;CZzx6ku?_Os9P+vhreoNMp%bX|Pa&wcadzPZ2C z=ly zPV5H&4g$b7r`&E7%(CKJ6x<6%^ZXpuBftK7YR{=HZ~w5raK-31^vz#txwoIEA50rR zc1x@=j@H&NOGVEdRC)Q);JDV8dk1z*f7o;Jr(ecSUr|?mQXO$6GDwBk{@4 zX4n)_BD>0yYUb-+Ivvf*Ul*FjO#9f~$qPWFVSNt_nF0ciFpq*N;h~)I{NYHUF_;>< zybo}*X586P`6>4cLLW32_9Jlgt&m=lUIXcs0RWyB|DFiA`TRdG43V47s}-2#_QS4p z17KvYJ%iI!O)kR5sInA+qV#Cwt1#zm!D+CZUF+M&m9z^Xh*wxyRg2$&aSx-BpX7BY z=Uxl53F!?Ie?n4__$<@E7I}xa_hGc;-c=oNQdabPdrz#4C05{E_1e!7!NlvQmi-8D&#vqyk?;f@Jd7;A*MM!j?TnJ`VyFG zph_jegG;SLe*W|<%-jR?XEXV=G>oM#R|cb7Ras9aVXGXx9O<_Sv*f<9-5O*hrkRdn$&exXMZNz~^_lw8vSDw*rW~mB)2Bv4!-^V^A zg+<+Ul{hJ8@0Vr0Ux}~UF|*;MDJaS`bf*jZWy8{Q1oX9q=SmE@z+E~N%Pen%9VaIu z1syf)VRew}0p5U#_r*YEpPM#iv4}c6bfY63uHu`ntD7aL$8wlO^1vi~#i+Sel6RST zd;~b@WmsJb7K~Bq9sFk5u77ZOl@SewLAHT8F~b_5qOc^m_!=&vonzao7!wp00pgwn zi_WylE!N`Ic$!=idbyCNsLE4;%77QuBw8R{uE!;&UWVWgut653Z1fQKC-B}gt-Xq! z6?)JlFhT=aNA;q|fyQ$4;G@q3=3@MslK(S-iL(Det^^nv!4AKLW!NXwU>&n4s%z)y z&gQcs0Jt}^XHgL&%n}^K4fOedLu^}bHT@Ez%wKLNHRWwBv`kWW%E|hemFN7kZz+y1T6om3VzYz)HKoQ`4a9*iE z{SxXApmTp1wF;}FDyedPI`=|gUI(t688Qu%Q3GWUu9IE6!u4=7fjl8bkc!=@MpmJ& zL%NMI(eXAX&Xw_Fo6?wCTV{*ZBxa!SviJymG4m~YxrwKc~d!k*d=?_w9`AT2f! zQ0Bb!^R6UI@Y>wjP9ZPdnFw!=^^2vtp46=vT6YC!z|t14`dL|XHmc-}lWL6^k z`^R0uy`e&JO3S(n*y@#L92JWU?JRu4NW#L0ihO&l#p9FkAWKG2GZj2cy*`qp957lw z#oIxvqD_An$AFU;JR!r+OFoJgS5;Jz#F7!~{cri9ljLIGixQ4gFG;gAy$`<{C%kEh2M0vk4@h`g@ zcN4p$2FC}TxkdCbiow2-9EbTu@c45(Hgw#xdnQa_Y0NdQ-){7MKzO zoJz??x{MYkP4VP7ywKauW&MdrzqlqWYcYPp!avHv*eXEb%LU9AJfRf6@}}t|R`b)-H&(?G0lR8IhlaqPbZ`%V;n{ zS;&go#CI);mvU+gZ}ENOS7g18jvSs?+>5bvyU5r^kx|8aUNmtkb7&HZN*xp#eYM#` z9`LU8uC5&&RijV*lb*u!FM0{jJn!!;d}a7WTb2B3>INT<;Eyx2iMRArC9q@?!K-P* zuWn8aKKUz!^Zk?l&&n@0i7(i!o#k5fMP&VS?E$^vF3o=RHm`}WQCV^owrlj9(TrCY z<@48SYC3uYe{ns3ttB#O#e88g1avtv85z6Klov#GU;RF)A@{v3>T;h?`T5nSIj$!B z>x`Em-;EV%JAZXvW$X>4NnOqNiND9F_~{_~By@ta3*6qiusLh%!s6PAsGu~~sToO< zsTSk?LcG{j`kr2uu_8!QNd2rC@LUl~f@ z4Ob(T9g8x22}CEI6Qd#K?C2tXpi%kN>z!*Y@ySbtY%y!4X_YN=1@YW9<$55v^o$L! zdxAi$MLysS5jaDr*TUNnD+kROt`IVF!ngkt61L((J6}5b_)nkAVo|m#vs^32U|nq? z^*C_e1h;3hh)_rzEqA4mdm5;lO}}kq`iGyZ>$ru!@iKU&4MNR`v+F)tS`lHld^!H- zQ4Jta&bHMQI3J1IsIGFIzI8yIJJCsS)lzzdJQZ*3ZzW9H~W+NzC%xyE>Lpu9xC@`Qw<`Y}mjGsNo! zJiaRor#VLG(y1QUOGz0fK#`}u8K3cnvFh_;wAaFe@B`}s!W2up?+;G{YYaiCGQ*$F zV`8hx!9jHqTFBqY{lZrSb#Ow4t7o?f!YwN~vyx_C=pEwta{EWSOxrOq)T`bM|Hw}v zi+OVYbqqbA*b1Cr?JEjXvfWUIsO<9x0`t$bt^*@&Y+Bs4cZ?=EE$l7w$cZjp?DJa3 z(&OR7Y7lC<-Uo|actFK=%gH5ktr$g5{%Es_m9u*YUKHowO>**Y^NOm8H4E8{w^ly1 zY)kZ?2r2*LM3ebc4#XE*b&lj`aE2bCGB)6+aDq;bH{s-X3ojSbp6NO?RLs;@Zg=n+ zkd2K>Ua|-j7eb=qbu*){<;)b22#{?0wM~89l zY=e~%pA7#wd=O(U*weVsx2`)VOYi7rGEo>~y<%}y5>BqRj`%Zk?ry8b$?r>=%<`BO zxq$`D+FF23UyKo9Ym-7*5UZeYYePlFK=Kk*aD%EnUc0uIwqs`W+)yQuAo3(xT)I#H z@OJqA&$UYni`#r3tay2_0BV{I9@!8ts}1*?&%UKBx<#Htv7NcXj2V@&IiW0wb%Wx< zC8Xzgb~b!Gx9VCQQS|bXY5eI~e3tDkKl8!P$y3LZTvsu*Z|@8d7#^Xlz+FEUOH-IB zrX^c=eetN7sSQ16@wwBBpOf&02Lt?Zk6O;tX$d|wX^Z_u`KlNjdVyI~6tZ7_N3r{K z5yHA?5=T~2b|G0zoa;|N%=?we)N&-XJfQPb`!xx#rlvTa!>HKIOO!pL-Tmn&!eTD= zc!u(*xRUbb{G{_{a>;{!bELrVGNqDeB`fngNK4PXlN{@;$`B84gic-7+{y^m)d{l; zI$X!sWQ~h_nKa>@LADz`X)4G6A(~X#6KsmG|eln_p%kXr82E zC`xHE?k=w@>!;aL2xC`ewqTv~_HpP!=1@$l5Sx{SaG1( z3-{;#s@ch-&3!>d^zJSPHKg|F+X1$#AwH8re&C!Byvz@Vb#jR)221P3AZS(lOGpZ;CeF2yNhUF+#}{19&>^C zhQYLv`ow&^VL7;c#tAqd!}QeZzPE50chKt~*9Qm1Pm_r26^5JbO830hY3k{}G)tVC zy%NLVln}yP0`24DaLWJA?`Wgb=bon{`h zly*%=*Xoo|l*czceA&YUY9Jzw{;cjA|U~ zlRM0W*{@zf4fS4{X9;?f-&_^zE0?XN5f%-1IU+aBl#WLICi})@>k#U$D}(VBlA+|^ ze`)_QfX0qDCdP%&4Ff5e!9SZ`{(0sn0P^ma1NoLEh8F^zY@+v9`~)}yT5dbIb=Rho zAtUWF0F7;L{$&B_HK|VeAp9z;ycwV$ThTArwEtI2rn#166aCNiRYL%Pw+CW&lKyh7 z&L#+0=(Xrv4Q?xVVnNBPx<*4z*A+TV~y{HW&|Si@~AXn?h+;th~W$S93M`P zSku9>yaUpTc`980{1X7*LTS2uO<5W6RKwAC9MQllHmr#NydDgaCabh?!9K_6m|;IV z`c`11FD-5dU|(HWl{%D+e!?6)+Sn$&7w~!CLi6GEfSuy4fK*>X$Pmguqdnl-c4>Xl zF+Twwy#1&HxJh~QqonIcZ3h6ztzY&4PM&+xv<2|V!@;;A#86MQ$p+DBt;y zxIp&D(ad|f-T=TiwXHNHmp;2Q{0oMJ% zun8bwHuQwmx9Oh&yYBv|2YLHPiMuql2LMR8|Ks;FKYl+s8t|k1>(Xv21^!zE`s31W z`d$7jvM(*yyUnD2)Iyca5Ly}5OTYcWXf$@SDw$BW*>IpA`XAH_$A;x$i90>x-8BWk z>u-cyY=@)rmE*VgPti|Ierw+ZNWDx*QiE=kq`&j|@i6{#?c)D0M^C;9D-IKfF=rk| z``-L|`uio^kY%rMJgZ$osH#C`^Kw$76%pOS*)_|J$eTP$7SSBqI8DI#>2USI8MY)4 z<_aQ@7dL3xEp#U+cW~zKJgz*@mNu{AyD2ra93quWkeIpdu7OAOWUQi^Vz77_eH?XX znsH|Uq4aH|=S~ajP8-aSprFYeH|jD?|0eI1`0eg_mCLrMFc9<=wpaBcJ(3W2U}*Z% zu3U9)G?<@l=s*|Q)*J83_{CD-V{;^1;0I1Rx2lM6j5)xB4YJ<~w^|PodHrx_@7#nT zKON<${w&SWT}-`N^7`+D;xL2*bLO}C;~8PptKW<=!>XW&DCW4w^VzKglLH?KzV&PqR3^H1wpGJwcQusB78iQuPIK?_$_Tpqpcsf2+1|r&p=+UJ0UB3G{}M!c3GO zW6)9qq#LSjtjmDb(3>pvl^0Kg56Dg`Y;puGfBJ=)p~lPcUpKO%Wz@rLd@c^fwqUEk z2|3uEs^k~7&3YPl*=17I!8@bV7s&xn8zu-WAkULOB3Y-IFiqcgd8*tPV5Ae1WR!JlHLGcEgY6;M1~yO`TkTvw3|W2b`XSMU z&S4JVLEJ02Pv({&OBNx#gr0L>*1T`S0P;+v0*-iyR)YtPg1End{p-lqHYd(&Hs5vq zWzGk$_h~Qa`Qv1)Ddsf2z9j8U;1y+v@`Go)&YoWkv<8dqNrqL38~W7EkQb+lG0~nu zD-|up2vx@lO%c7tQkBObB-UbOR4r7Xy*t`ZnC6II|IS`4AdJgS&1XSYb}lYtn9nBV zVR4u}zdds@ShUnDJCfwk8qo);_0u6ow?!_PX#KaE-ItvR6FSnAxD=qC)yC*d?E)+KZ|{Amy)Z?A*b zsIV1%H6}g0xR?g>7FM7e`-Fw@Ry>0HwlNrJjId*g;!>7>Enk<9&+yldITw5VTBUV= z*TSOn^tLmtCzwR=@JC@L`bHxXNy!#n#zhf}TumZiuRBVzSiFK_TG|Mt^7whWrcqa1 zm-qxVVa<52R!m*E3O7k>rs%PtcgN&SpxyUpd&51a+cN1(E%A`sdOc`#@~}z0g@HDeC2OZ(^({Q1d%#N0+uN7Hu&;J2 zrDRs7$3*o4W)L7b!bNRri`!U}Wog6*5tY5IMX{G!-kkL@}Ve`=<|MMmN3p2)A)#1J{ zm-lbc#}n-v!lXh(p!hHjc3u5U>*Q_CoaTG!uG`*{L1UE8)zG~m4&^CCA)7q%paK?8 z>|q%J=Lg>O0rxpJrpvtpr7ske^sT;xotb^!$@^ufcyaMh0^{WnzY;S&w;^^wu_Ira zB$!mVS0R&Kf=gVxL<6DUf|}zr;-XOO7w=YC4VSggd3m&x!wlT_wJF?^dlz)ymBF^b zohznw5)Be5l`b|uC4D-L6ztBhX8g!5u>YJ(IEDVQ*GRRnz&lgB+TzgYWqlvY^FAZ- zIi`2a@CP9YuE(d*m>wbc4u1_x)+Lh=%|emq5WCDZya4MQs}c7Y3(KUuRAAuJGNvi1 z07=@Hchw(WY@>DQQG>-6gpi5+rVwpe%u86eJv}*-w33z`{g@XBPdWwt(w^sKtZl#K zH7f0E8r)yNo`a|ip5o%!!^u;~k!R7?!s-vK{8BCCrp7kmJVDf8(JRyrqcVl>y-F1zDASX&6`AKQmK=}i!oW1fvkN9o9TJ583~0+=b) zSI9hG7_Aohgx8ySc=NtKw=1`U5Iak$AFp{?+QMQBJqdbMiAMqVO5TW%Hl|0UTGh{5 zQfND_i)FJ&y5%Agt3}PvQ&*A}dQqKsfPS z_>5q~jZ3&6F4FN+=bnKxiF4!PnW*K$1aQuHgO%|C?r4${IqB+?x$!8=3$&r47lw=P zO3pQiMc03M7vDN&b^f(%aEms*k%B;)uIxS7F0u?)*-KTHm9{@T} z1&JVDcJvAK4XkyOVy4$|Z*YQZ8BUapet95k5WjA&>6jC1ZF6M0mh~IX`^X-fRvksc zMNjT+)IC?vxzo6Vq?dEZ!6H?z3vOV(5W<;D2hL~qp1`F|mi`XYYsS0IKrL|k`8$E> z6EG}nf|1V1^gaXq*^MJ~@eGd!E32_h(PR{cu`HW)L*j@7rULX2N~?Nv8dpXVx|1kG0{xo!fU4vm zs7JZ!)uw%L>9U4=0{vC62Dr(&1N+w|+yC(k)l}tsfdv7Gd3^;LfIbOsp&%ol_Qm}2 zzO+q%*G~=Q6N!-Px5YAmR7Z#Wk@$=^#9Zt}**Rr^zOj+n`kgn@eCYXa?M9Sl(B<2g zj_&{jWY!{|W7B_YuemzE3Gm?b_x~#X>pS?LwS#x9LUC9zT#Qrk-TU;)&&nQoJOj9u zU;IdfRL_#8-yQah8b%ncGM<(`L}3Zv6VhueaMtrIRmH>5j84nAdWi>9FMLf_aFi(? zTED}K3Zq4sQ}y<7NteRpt?0X7za+fE_Nz))TI`lES%UqRg>u@8S3v$qLx_tAH=YDM-WUpl69!CDRJO0U7J_qmYmZWr6< zxz&xl^982D>z6-mFSTt=T^qEayMaqJkpYS!2;yVBpNeI_u&C5QI`AHXd?h@?R=IDt zX_ZmA>}9hS_GHG)Ypn{Klp!z!Gt;j5>fe*Dbehl?j&RAC_2&X}VcxVcfl*Dq%agrV z8^J7R77>mu)snp|r(S8Fr{tq==z~zYT<`eLT?xokEhcQpue575CalWj1M(q}{Fvtm zPxro0stA?ljalJ^XIfz@V>^M7X|7%SuKxTc+194j6Cx|SO#z2zEGP>7`-Y^$IRtK6M0=>%6$Z0^5QCDVf8>5 z-^cSJQ<;ct!nUhPjl6QK9o+vi!Xx=u`xL3AUFbweDqV|u99_jbpSOH{lVICFC0+F7 zHK~CO_BsfKgY|Nv8?h2NEfw879EY*0r~PL+7f$zsSglY8`V1?N*^wPx!z0?YCW+>B zW)xReL_lCx%=st_&j|0>8mwX_MPZ~QI@~M#s#rv7nq{gYUAT#Bx;e-)tN}ct)bPfX z0faLdhY`AvrV?s+jz6raLQ8x!QWyfkSIlE#d&Dgx!c)Nc8AxtNlWw!aYK3b+5oUDs z4FoUY!TCF-E_sn!fa)0=6*+K}>RqgPzS-9F$4L9tbL;X+gkaVcaNNXFaZi`uL8wPJ zVO*^+k7z*-mTZY5nyMnh6g1(zFH7bRnFPb zCs7JVxQ#wE9OSlNY`LbG>?1^XF3_eXi)XKoSWUu<9tj?Fk~Tifgl9&VVtK;@4>O|u za*BJ))gD$|To*NcToT!#2r*`7(sFTu8O4jM^1y?$wW<= z8^#|YnSI_aZKZk22Zq^p(!7)GLcffYvpduJ7Ts9ubsSWbEudkFJXQ~)Jm$g?O|In= z{-Bs=gicmz5bMsX%>0VJg^OBT$8%7wP3sxR=4%64g6ymtG`{Dy%th5gZSJxU%}Vnw zds4fG_U5<|Nb0`AWU;xr+)>aN4Zj;Wf0nsQEuT9ALOrG>#jM1sNuBQUmQk}5HRM6% z7w+MYvFTGe%F4?;z`OKHC&63lgk3)pllA}|&)W{Ks_Z*Mtij6G&w4Fh2G1~y_5ty8 zpLvUm@$jyq-N2k-iUGfrMS%E5Fl<`kiqptvt~cSmljNA|mDqBopOrH`MUAHhP2;J6 z#&Wc4M*mzR1YZ=3o1X?tbXMZWNs3dj$4qeEVeT2PfuNBDse|ATd$8_obHc4|Z7;;C z>mj`A08lg#wmEg*EjjYFW^DY*X!=yr=s|Akw9E@$x>my+>7nt6OP6JZNf&K9Da^`W zd+VsjN_@UTYRusYj+0Jac+W$0gxlU>6d9`wS*_vWLC+a4c6uI{1J2*!m1eS?S@B*4 z#f*x|YDrRN_@Qrm)(^y9@DsB^pfEibQg~BtHf#J>!4~Pqe=kHIkA3s`)xIwRdU}kPj z7q}7^^`9)!YRToU_Q_a1P1z?+=ehfXG<>_n)aeteh`W1kbdz?!-Lnt+v+})Ot4Ypg z&=^U$o8WnFzvhMh&=q)J5H)6|l1AIEGWPvY|3XuurZ+|PviS_X{`qH)S_s%GV9dj&G(w0^-|snZ-9%dw08k>G#~2v_|t#oDc3t?oJwl4Zd!p5y(aSi4@WV(!hDyoYe*ix(HmVFSps&{mj`VLkHp5$KE0L2Y(!ZGWo=;msYXmkWumJmW9`#EU-;`J;p)@JR>Bk^h>wp5iD zE>-~NXduruT7qi5SDTG$M8%-78S5dv>RVeQY$vt~kFLAq92hhYqds$G1i2{@ zH6N}wAEg%gosWg#ZhGet*RY?&*ByijI}ViK6E1G2N)E$uDq9WAKq-K4$s(;gQo53tI8Ey?Yf!S7ds zQOGMepP8*fIfqp@#}#u`Udta;=TXHkBlocWsRF)5da%;|wgZEOa)VI>js_CZtPQ$n z2s~;l!(?i(vi0?}MAI>v27YBYLIc(=vr^Aj5tu%i->(iKfj~+#E~r60x&&VgLs?%NP^EiJ+=cZwJ)r8%&{z+iwiTo^4;aYdCJ_9Ri~g3Enjio0ie`O zDt>CHF|h@rQ*;IxY3)Z$q5slR4tl;C^6(168Fx_Z>qgqU*pl1qkN^q|ub@R0^tev% zkxGD%+RwmPck?_EF(6WBskflvo%3KM0@H%$p{H@UMQut5b__vVnM;o^wX~M-t ze}xOBwQIlQpzT=psGdwf>g8+OZEu4ij4Y>mvJ2F3tOT<2k^|SP@1lyE3E;(VZ<0R; zJfmNIgUqVrO!mxhsDH_W;$k9=_ge zt5*46DZzhbME_qWgvU_((rU7K2KT-m2i*J&<9s#ybnWNSX$%P@`s*xB&oLY=ef{cJ}177L|5-4P}&L(qb5Y^n(~1SSFi zf^yr+`62du;Zeug9|q+RyIW{w5}#VKm3Tsv`}m$v7O<~*KTVEgwh3?s`l>t%$uu|m z+p9!uW=a=SsU;+{xUA?f>%Xi>g#GH(44J3@myx&&R|ZQ=9$XLlhf^t6hje<;{+HuN z{ZRrEQvc`P;QuSP@UQy+*+2YGjZc^Te_5e9|7L~$bL4NM^lwA-ZzJ>D(I4mkdyDjc z9{FeE^Dna#kWf)p*`o+gs{V&*S|>$N|1wP{<#EmYO@Mt5+7@qDI{kaA_Mfirf9Yy) z(npeBBcUJu>*0kZy%mlc#itf+Ddv?C+BrFgpov7@CcqV{bjQKk#{0N?~z~$y?oBV{U<=`8Oe2Un2WSR zYfMi%8V0Z02^1Om8v$Nl4H3V9<(t`{asI6&l?Icb1|M=6kmQ z4tBg)qot$E;Z?hVau1^m%`Uzd<`L963^{ND1oMjp;G{{G!(};*?z%G64hzkt=5-gk zl-Nb1Wo#QQ0XNUR6-xO-AG+MC#q6-u^TA^(-M3kRF+Ay_E(WW$1+Z`TjvT4jpW?MW zj6WJ%73ZHI++WNy0!j5v7=+|Qp99tm3cXc*+x*YV0Q#U^=^QZW0^I>L7RlVu;7XH@ zm^7Wp=L?Zo(WvV%Lce4uBSib|)1=W>Ovj1S*{qR44N!1pP^ccv> zd?qi)Ub--F*l&)K+c@%BN`0)a@rN*J_tB;V(PM#Bx@To<-UMjNgrIyhxi3$gnbKBc z?FJ^zPR=I?ldpPb^=z;WKvNSrOvtbgCX5dizayI+1_TJoC)z6rT`;}u`dn2h<-wB^ zjNP!Y+Icdx{_5{YG4AfTGBia zYu%k*Bt-$;De%i8^s*xgS&H?vZ7mLqc-GhAI})P~xH&fQM!ya;Mr@jouEMfFV_TWM zYC6-#ZC6@vRcXmRYElOk)kxqtgbei(!W&FWK@X|;oB^Cvu9f_RtKQBW%@J4u=iyAI zL!NX+twTgofA&`=$YmKCfSjr&r@_jZf_(JyD6n!r;A#4ho_!XeP&8AhvTnH?ns}7r_-P<#&3YOYoYM?3UJ_rEd#cf`L zDht~OTb@-u7m?`3>8!Ts5ON8Ok0wXMA>TFuwqiEi=-l}APsyr|Fgc4d+AW&!FedZe zTrjx2fxH#))I-}UGd#c9y=!6o^KJq!N7_Zp!FlRX=k-5+1_V?usMW+vyIZ&vRRhB3 zhl&Ek`2?vnB;BxZPyhgIuCb_*_S4~j)6V;!ed&4!*$s5obaXO1L@jaH3HT%xZEzvY z`Wsr%{4S#VA+#p%k8B zcL_bEefzb`Ae$xxJ5Jf1XDrV>YApu-1o*8#5u9Tff0L5?gD?5|NlLMl5ah!DVs^Ag zWv`vgXum3*=K{fEg9@fA9z0QfpDkU6Y==D0|sW9T4!1 zeS~Y`sPy!4WlthQ5(=ER{~O)84vXkNymyBDMnQCKZm`NzD*4-`vTDqCrA4>+&)6J--1kTI(2J2bKBKR`$FWCP-0 zkuKC##ay~P3Nn$JPL8~mjxYHtP=;-+6tL=wO+~}1r*fxxGEfhR^1j;Ir zJErhPl>I+KL%n@co(iz~$G-;4{ukJ@|LsrN^-RIh^ z81|!o#Yjb=vd6D{tiAa0YXGL>2d3lI7TZ9FnYGHp-17wW*ulyel+3CrKwHY`{Ik>z zuEmar@r`Ty-)RW2(oJQ^0Ic?{n&dCmv@@-j!BQH0FK)Dk;YO?>-{a|oMd)WDnSLx` zeO6fxuYcjFr*H0pV~unknvuIC?jR8B$vwZP8*~U$?)h1FNY@f3M2m2>&hP+4-Jv~V zTa;y+aM;@7@F&@SC12}(tG8nI!u>(qOJL#<#YC?238t7|Pxef%wHqqZhJr1pFo}u_ zI5MK$IuK#Nu!!nU-VrDWX_9TW78Go}gQ@4G%L+FlC!qmSO zDiWM)SPl7~gg2P&LliaT#b8`i++&`+5!0Dwl|0lmt4WB+skf*1-?lQxNP!g8t3Jf{ z$A_}Fke(+gIEMNb#~WHj9O7ODN2wL!1bf~s;J6kKzv_Gfnv)(KdAw)>|ka?mtcCb>s{!-fn^*>gF>dt7!@JPmI)U3V<_s- z{|DfZx>ozJC!Myiu9p#gAG;TlQ0MA-nHO@CSB62UK|OKBy+k#ZI#eB3%rGLzJwT@n zKX}*`<5dw|Dfh9x#f5HbZE829t}0OmZ(I>ipf5E3AqIGy{Qe9`P zufes099ldDE{^afKEP&Vo#rp2m!p}aT!{Z+<5`ytnv`HlS0x*Pvg@;uDOdwlWVdjK zR6EAa?tvU?jB21*1A$TSBs;pds-iZRrQNI-U<&;F!Mdy*BwY|p?>k{Dd?t9d5Aw#) z$jUggJ{{|@NJ^GjG(QNH1v`UD<+X_(Y?=k;@IWR4>Zgnm!n`dn(l=v@9@j&Y1B(i} zkO9B&6t<(%kss9Jg$$t{(LqUCU^a&Geu_;a#N; z31-EMnu=-he!6ik%vyQ47$JeIJ2jvp(mqs~JQmojvj(5ToB5MGOH2BO+zr9pv%aq1 zF|k({j{k6`HZaQWBCwejXsSW)#|}%W`+w%Z)uD!|_m}~q#ZizK>jjg;Ssc!`&<5!? zAVb*B&G4*S%X#QVyfsM2vP%W;CRGfwf>st5TwN--WO$nD(p1oum-y zW(|uFU}Q6|S5=aMr9lz`^@J(4KX4yr7U?K1+9INe{w2i#H1tc{tQV!#!Ea)W*qeP)&Ae%g$8|4kra^$DmcjH zVRqC>R?y#scQ^0*{Y|ppvXhO1`6pXKdbYq69B04!#Fh9J3DL38eE1W~zAN20ydl`^ z?ww4M?JKXZQr>>`f{BT2HAQ_PAirUu%OQ*OofQ8!hSU~QNO#$QW%aOLKsYmda0C9$ z17SzB>ob`rN_O9_ikS;{-;eI=R)%HklwBmyL1W=e|Lo`jY|{DteLq(iN+}<1@xtOJ zDZ?y&aN_sz6{8?89cuWCpJoOcwz?llMZZgS>$+#tYCwo^B^{1)wehiha=i(*tbsc? zq79lWuc(TRB-E2`!1$~#{0CBY+{}pYPGE%MS;gcxIhkA66s{s@k1Kz(HJKa#0rs3I z)oiew_5wD)yl#G4$XQE#$}0Un8>4(UX+35rnQBrS5+qZ8h@+mmE`-77na3Y5h2TozR%E& zXUn{=A;Ic{vEEIZ7|O`Akwo0NQkcD&DN(~S0CAe~KA0Nk_s~NwlmV6#JavWSd>oNxdGo%`~X{CdrdOuPg`iYTMxinYV$^Tt{ zm-GV8D7oM8LrKXTevO67=tm20=p!3nm@UQ<+t(dek4*_vhKaXBHd_t!)m}XHim_^W zkb4Sjr{VZSa+qm8m3wwax46-odvEsA<7N|Q_tl@SJ>-qU`7lHYPf9isc_|HRFKH`Y z#u8>OVdGG7^E*|EpJL_LGo*<5atQv#_Auq#^tvi+RF>_P%4-{!vEqd^SJK@t83bCL zB!S5sDhd);pP*lVmM!}f>SJ?4m%F@HTj{N^Z&&5~rQ>8f?$i`qO=8Dfh{p)sNXa30 z!#mK8pg1VXjvIT^Ld~MmaHeBa8;N$H`(|C=4v#2KU(y1P;>&t@5aloLxDv>1H_Ou1 zJ^ec|l%WJ5@RFFXCOOUZxGe-zld25I9ZL0N+cje{Q1!@S%$(b{wZ+VE@dYOvA2=e% zXX@tK%e->=$iyQTg2idmJYppGB)>EU1Q?Se_ zexi+Z<9B5mx;>2M8v3g*5SSjLVdY-7J^UZC`mQG#Dr1j#OiF3UuVFaD#SKNw`tQJ) z7k@POC#mDO^l&u#j4vVoS#-+#Tj)mIJL4IxZZiYxGVQo$^qZL})9hp(7_-AYRB^N{ zdTxCm(Al*6{PYFXwi;nAQ;RiAEuvo?mhOhLUq4;*>Nh(nDi1vWploC7%;%1=pIy5Y9MrbC=A~|`N;Ppg-*orjojWfz5?99; zEoQ$GsiQ-zIz-QPq2$KLwJGVJA`)kIy@-RbkQAKp&(EqKNb5PixRgQ`b?r%wy4rS^ z*KvH#RCHa|xM*OwOy25)A~`z;|BLbgFBtEr{9cD7oCrlLBwN0o#(OR+jE@IbHN=Vs zh8==wJq6E21n#8Nc6xtPw&SR!@hv2#;K{_DfnhcI5L2Z*$Gv{Vn8>XvulM|_eBh0m zJaIbVYTG@JsnE?wgJGe;p5wFyoFD_HGVnKHesCQuFQqL9gbjcgLKd zc;Dt7U7G>|%@Zv4)GB>7k5$ax1n>^hc^4On(X05nwrS9aRh@0%-}POwVB&*Offb;+ z#K>afibZS;`_aTg%!M6*0}KjScrkqo-fmf!Pgbt~QQz%QeBq;spqZK@IR*fi2j4gS z*Xw_i@1S$e9I<7v(F>NW*2MeBWE@_xUu)FBVV$(y^U$nAt}iT5wRmKq%Q?BK#5`LCc%l1B1#%! zp%^R3byvPbW`^Veo1tZ_&EC4iAPzV=EXa^W&L8C|{urkE5NstM-_WkMlBK%w39(VC z*i?Jq136=jA>b$z26pht8=``Fp|>%c0;V)8X}4FNSsnyh7ETm!X^4g+M`pQva|soF{?=G9m4xpqv8 zamV>M;e%?}AC|Fq(go~v|8-j!PZP{8oB-k*)R)+!%~2lk?v_%~x^Ob0en9B3a6k2X z@uP{o*>c5g)DFY2DFis&eqmx@_&!+_6(`(QGXu07u;EKA@C_lV@%FZW@ZbDlyfpA! z#>694hN`Jm$6i9cLw!T+OsY<~x%x_lQ&vYJKp+Kx0CPrmJWINlm#hre!FeSwd3 zR08*O9{-la_0oA4$g#w%Ndy)s)~&A*h4+fh$P~LanZV-3{m3ghq)Z*w;Cs5ZojuNWw`dh^c~wm7SUNNLN$Jw`JB-b zHFSgH#Am5@6bFax)_Ewpt=jH9&dZ&6XYj7dVWDEn3}V_)GFw{(UU;tB+?_ks3N6S{ zjbAm~nCwOAcK8zJXA-E;;VuKz@y5#ulAF2nJ1!6kkg>vzP3elF4}%W10lNTYR(VlepPqmQ&qtE^0CdS_>>up0zo#3gG*wR2Cv;oINc^Ake6>S zO~BM;D4Ylx?j|gki2O~+8?Sa}H`l+9i^tp!zGo4)UnqgLAonCHvMoa>GDj}3ANPv* zou-T4!(-AG-wKNXKTkHLyi(t$|4eQLfkRc?65VT%$5_*u_+eB@>NhE5fvc4!_uFnkJJ zlm&dT*J)h0SXiqX(Q*9tcd)m_gf(#q>}PD@R}d+j_LKLn)te#vw>*dsf4EZ|Jra?d zR8S=PxP0h}aMy;&k!JU?r$X;|&ro~z*LDNK2Yy3vc( zH=IyO2`j4uUf$h_0ZPqgL%Dz{t3-sF z6tFF%4e!ZAPmF*~{p{7OAGmk=x?OO=;QV{lIIr(bP4x%nzQ=DSe$i>-;$(;&$Jd1| zsv-3Q>`#cKNv)}7wc?^hHcr0z&xo3UumnpUJ%h?3iw2rmFpe{wy z-LH!Uqlk^cj|kJZPd9iTm(Vs>9kp89%l3xtRc-41Xy|ZmB;@YOoH>V#b8K-A9)Sm`jSj#4 zjvqi+MVNI=d0&v6x;2f7IJ}t?HPQnb#HK?t3~&!jYD{Opk=5 zwz&!M;rJ=RenQIknxeF>LClS@THjo7_z9JTFQ&bT@B|98Mc%3X(cH0+PxPS_gpfT- zAocq;Y!nvpt9!aw9_@}ay>H}=#e%O<)TyqI>yK(j=;8hGL`7yOS;Y22oN2rGqN?Y3 zlESx@_F*)$9!8&6Tg1cjq$j20hnL92q~`n_hY1{lo0EKUql)A*U+o zbe2yMVXa#;SUqGacsNSoNzHCT;xN*nlI+mt*cq4Ud6q_F|G9|OXg0g(9O1k`SB-$- zEzHJ;iSLeC-k^0KU%AZAP1d6wuj8Kr>t4kdW<+ihp98P!20C!x46WUu&lvP5Npe;F zrNe^B_z_xmKCd3k@v8B5H>-QGP*^ewa0yhvN# z%EiR5V&fTdale;1pzZy7weOwuCBby6T;FJCiNirkaU|yvZW%7^*pV>ax_sPh(zQ0- zMrX%G^P?RhCFk@Ca_7YOhGK_>x2YM>B2$AIZOq!_^U3fxhnk?+s-ER)E0d1=RpSw# zCJ`zI#*;QvTFL15YD63S-N2DVvM9ZNpeQ5q>-Wv2?XvPAI7_WSZ5Zx5@`y?}|3e8P zRG2z`&ABkj;;S$rsI4lZw)6pyKIOB&AuxDk_@ew?m85bJ>Qmm4JF-yHCBavDX5Z%DVS|*L;mtO;{{sm-nseeSH2}*=bJ}N~R~j zoBwfj-?`I2RM$*@f8^@w7n3E`S!?Uk*K@3C`>;_FSiH`9vf8@Z)}!kE`_s$r|6q{r zyWGU6;rfGN6p!FANc~FG Xb3bk=ZD<3Y&B);C>gTe~DWM4fM-DCK literal 0 HcmV?d00001 diff --git a/doc/images/raster-organization.svg b/doc/images/raster-organization.svg new file mode 100644 index 0000000..442032f --- /dev/null +++ b/doc/images/raster-organization.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + Synchronization Word + + + Page Header 1 Page Bitmap 1 + + + + Page Header N Page Bitmap N + + + + + + diff --git a/doc/images/raster.png b/doc/images/raster.png new file mode 100644 index 0000000000000000000000000000000000000000..17ba3b230885d209f95cf1b36a6e03e296af8fd8 GIT binary patch literal 37656 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 literal 0 HcmV?d00001 diff --git a/doc/images/raster.svg b/doc/images/raster.svg new file mode 100644 index 0000000..58277e7 --- /dev/null +++ b/doc/images/raster.svg @@ -0,0 +1,386 @@ + + + + + + + + + image/svg+xml + + + + + + + + BackSide + + + BackSide + + + BackSide + + + BackSide + + + BackSide + + + BackSide + + + BackSide + + + BackSide + Normalfalse + Normaltrue + ManualTumblefalse + ManualTumbletrue + Rotatedfalse + Rotatedtrue + Flippedfalse + Flippedtrue + + diff --git a/doc/images/right.gif b/doc/images/right.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ebe464332e62bea0ed1ac92853bcbf479a094db GIT binary patch literal 341 zcmY+s9 zNkk;3s&G=hd++Yv&wKCAS*X!x{BGY|erZ0v5z&UVv#bUoa$O;%q?8(_p`_xRyERgp z&?J-?hM|;XjMkEa9n&;}@4$rc?fnf|2oq9zDODyI$Fh(R zoHC|==$_{b&IzT}YPI}YmadC2K@jP>E`(5?60UHi>-#<-1Y>O5HbRIoW?7cwI7%r9 z;m?2LTFu|fLc`u|=fm0kR5LhP$!%FX2la=sL$rQzv|T)hiOb{U>Hg>Abu3)8<1OHM zp?Fs+T-~&3PmALnksdJHJQ?qfHYJm*nfeR}w}nA86ao_iBl)>5&|B9Eri*K-RAF}} ZJp=mFo3mrf%k7<`Lx~9J8*E(EvcD`S-G~4H literal 0 HcmV?d00001 diff --git a/doc/images/sample-image.png b/doc/images/sample-image.png new file mode 100644 index 0000000000000000000000000000000000000000..f78760e071d5b75a28ca417ba47fea8d91671d25 GIT binary patch literal 3541 zcmdUyZBSEJ8po4MNC|>rQx!_939b=bwgg=lu)HJ|R9;-nf?CU@BYw3x>madR2b z5J+iI+GU3O^5gZln;d9$SC?#9vg-@8sxL8_Rdy1ahz!V1sd`TDvO`uZL)?Kvs8 zH*v0q$M_Yih%G*jlvMIZbmBjuZ#^D)GsLu$R#J-(kPcMnmxN2-D(-9{?(^LI-3Ep@ zBEh~bo@_u)+%4;v|Cna~YdbqT`_@9_!p^^p+#Ng9J-E+a+c1HYoj}T3&U7zR#O1-9 zn{Ffz$ITv>_WoHYJWpA1aW(OySMpNicFm*hUShIG&X-3?FHIYp4!Ew@0Hn>(VT`;Uj@zk0QI`g&Yt|4c1E+1&Nc7(`u_*|*!sUwItu zhKtypu&8#Rrv8}mdOT3wclFH`rz|C=v9YqErbFVv702RB85kT7%#{zRk#$30N#~`a zCheFpNJerfq;Y|ZJ$v1NG$OOWzbIT$m__rdS*meqTjC{as0#xwk_tJOkGkb>;yILw zPA1KZsUSsGYJ5p^KqN!t^H)9g*3>qD&Rs>kJ{)L^W~gs9PI6v8AD6kEu>;`cW!xpunz zP6nmpU~5u};r=rwI0tpWxf)mSu;)1p>D$7RUFKtl{1Rga%jxW;RlBcU@$WKK=_WH&L1C(x@Sk1y-cOZqxbn$czSA3R5tEi!Nx#Z!*0_r$G z4Nk05TAah-aVRZ!>}eG^v4k1TM$#BgEZV1l^CnI#k$%a;1t*r0DkCM}#NuFIXW5M` zTHdEi)^MXZl@1HVi^GZaglrFG_$WwY6EF4(Hewh$J{t10OJaeb-eB`| zd&Uf04olE#(bpOJxuFLalwch%I#r%ouN!JW?X=jWs$KlV3q!z#aWnfq+M0cBy!W0- zssqj01X=d7NjWK*y4YtZhu}xl9Qe_dMP+|C6sybSD|@XQE$0ox?&s9K!*|#qovIy{ zxFcLMW?d8w@G}>cJy8O`z~obb_^+-S=>iTzE3dh=?^hUKfCS)VeR#_a!D(|JAk)WFK1STq8plJ$}c{?nPyXJ1$}vXfyc8UjN*7W<6vMVF{~OCdM_ z71z&v9;+)?p26;A6wOTi5yf?EH5j?(*6geQgVCsskqKvH8W+xmYT27M3C&OtN~r3c z&UCkaV-`7Uv1#Lk9Lvu&fI**x*c_I4%s7;!A|0$AzkcIWH5FWc{EgS5IH)ZIB@`Zy zH%}|>TpIXaMA+=OWe*SwiTq090o2zGoTmJL3;w6;|6JQ!84s;+{y?T2mj@k}TJRLq ze9iaC?N#Tqz-O^2Gl26$2kO%cL6i+Ygyd~tPx~+=+ha|B`8{edIAv{T+fc=G>UCA}wMM4zed+w{cw0h^`{QbQ?X6No zYB@C;g6sk2-cR~!PYeBDn30bzLv5`ni|urqE`7;j=;x=RpsxuI3`~TrA*&j7$nhg^me~H()k(j0N?bjG#!Pd$S8Z>APUO+VeyVs zy5{$bz*5jk52{P1%CD`Js|_p+g(vEJGQp#|bjo1*XhmsbA$`nj@Mki-Ezx0BZwpTR8~&g&1^@s6 literal 0 HcmV?d00001 diff --git a/doc/images/sel.gif b/doc/images/sel.gif new file mode 100644 index 0000000000000000000000000000000000000000..36b16bf69c82311944f29eb457db67bada16d82c GIT binary patch literal 362 zcmV-w0hRtoNk%v~VITk`0E8L<($dn|+1cRW;O6G$>FMd}>gwz3>+J08?d|RE?(XmJ z@9^;O@$vEU^78ZZ^Yrxe_4W1k_V)Mp_xSku`T6TbqLDK%+1cv%nH)e)YaD4)L7cvRSn+X;Njxq;1A~K z=;`X~=wR;eT@v#1^!4`l^c4F0{Qds_{D24?*yDo1g9sBUT!;{j!-r*1Nt{@UmBot~ IF@^vDJGY4K7XSbN literal 0 HcmV?d00001 diff --git a/doc/images/smiley.jpg b/doc/images/smiley.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0076fae2d11978f27ec632236d0c3ce2de771b2f GIT binary patch literal 14120 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 literal 0 HcmV?d00001 diff --git a/doc/images/unsel.gif b/doc/images/unsel.gif new file mode 100644 index 0000000000000000000000000000000000000000..10477fe55faa5da33d2f7a87dd3f18515139a98a GIT binary patch literal 127 zcmZ?wbh9u|RA5kHIK;|u_1e{E&!4|~_3HEI&p&_u{0{><3_t)<Y!WP|}gDqy7xUj+>%l_z+oxe^_a!x+^ ze$Ov;V~SyI8AKrBM39Ar1q4Cn=H}dP_sq;pN=iy&W25h+prAl5mye8$csw4lSUfN= z007YI^_7*CzAOKKg)Puo$(x={G-fA9uhC%vzNf<;0t81E5VddbLqG(<>!nf@<%j(^ zgeIBDE5@GTv{2W~Rqu%C?4`0%>_n2?3xDFI&tDK5?-V@f$sXk9- zutiG%jy&;i%g#lMg{xTGm1HD8F~W{<_tgBPAW%CTY_?X)C7p?75u6n7xN^suc8Vkq z!_kI`6x8Oed)6g}j(~>nR-6UEyXN9e=bq=pTe|{5CR!@PaLP)>m>l^w00G@z(v-<# zi}m|nYic}XI2>OT@0ZfBNco2GQ9u%zEF-(e-A>13bgg>$v12vaQ{pzX1rbZOo%5RK z43J0sBJy&OG;9e<6RD-D=^u0w%?Wm{IwfCnZ+7iOX7*rmOe9J{g&j4?SRTE#^R;%B zDZfA@hr7hstk)mY`^}|lsUpc@E;91U{7N6CZ3WFtco0nUl|h#V zME0?kC$kccGuJ;2+~iEYdmT;$y}SHg&2kuWd+^t>iX+U=n_td|F3m6e{bom=>s-{f z7xO^{_ex!wR$Fg=s@1i%Ieee%fWB{kxL-i?BH#nH4`7#(j`@%&6}2aUvF4tQK%JxE zI^N(R^Kt29$m+}G{ffaLtS_D8LRVgV?9zFWI7AzD$%4hgcCUFN?@WjbV5T2Dc|ge4 z?Q+V>2?8(6vS=BigkY4)P7OgKnH5#L`2<~U*@Xatt*$7F^h!D4?hf)GS1&3xHACa^&^E!DRf$^Fa_1!X1j5w zizI9A*Qu5T5k&5)avtOpWkVIJ8RX-?Eg9 za$t7o$ZF$2#;JYp&3xObe(Sa44hh(5GU=NfpMZF*Hmze?)J*FG4`?% zokp~GdCz%Gs9^f>%9Sv^{W5wX-T8b=uG_D9MwY^Q%s-QurV(o_|lmfxbr(_u}~+uj-`rr(@X^gs}|%=Tbiu)zKL9N1V8 zrkkuaCK)75;?CioPsI55Y1vyXfu30llG6ve9mZ_Vx&kKh*oY*A&E`QM%!$=AxDUfx z$}K1)v$pB#S*OzfNd42&8m7iGM5$9z`rUMh)GFQ!P46)iWj_nN2Ge5UQd{XvQP?gk8nyab9htMmgv`xSFlmE~mIfO~T(MO);JT literal 0 HcmV?d00001 diff --git a/doc/images/webinterface.png b/doc/images/webinterface.png new file mode 100644 index 0000000000000000000000000000000000000000..feca5d66abd4e70a33567b88f9491a2558b04628 GIT binary patch literal 150003 zcmdSA;v&ps+(?n>kR}7{F!JH{6~;T>TkTf98!s34+7-WYZ*qM^ za}2%CaD~4FQJ@v&gT;?cp}}~z*Y@>MXzi^DLqX?5z<(#QZSVCs*AwF3BV9ct^bZex zmKV1IiA@WQvWj|(fqi2nAxmQ(bs&$;*|SDx0-$}{X0Z~VP}tiBN^<~)`nH8NvunVV z@!&D#yC`>;;Zr@xO;DuL!SY{G;w&7v;khfMl^iR>Cnd566?&I6(Q|%hlco&}d+-37 z9Xg#E0WsXvgT+p&;A$(6zQObJ?5{{ao?EM@u;H%SeiXD>&ur`%cA8m2a3ewHTfHrk z2ZO{;L6weR98VO+i?vHX51g{l{JOM>*4@(N?Zv+?ieOr{g zC=d-tj0CIq2ThRUGL(8P;(aeTHpv?b(eOR!=s#ypcD5gK%Pm$lifpS3#X4r8PM5fF@dd%drW^! z2u|3Oww`rPiSHxCCG7EMLiBB<}bT{JqO~{d5TbS{)9n}SO9@RrU zX+jt+RwUhE^sXp;@n_X*TI}SmWOG^6eU^R16p@7jK>qVr)3S{DuRl2MpqjFHg+cPB z(~Xv{jbH?EsZtgB#Q9A#wzHeF5za2{92;qXVy2&(vnR*Iw;i`}NH9T@_C~?1kJ03k z$b}g*!|oI!iAFNZa!_)Yl#!IKa*fjK$?i;}@$*T}3E4~;U$kjg$W|zyRs!1>f7qo>r2fp#$w0H$9cxS#M8&GeQ`55FXz|Z6yDSnRPWY% zEA#Go#f8R(h7G|B5e@M{&_}St&WN1D?#E7}JJ;wed;BURJE}vgXIcKW>TBsNp_#Us z?*8}vlrfjFuCYAzd38PYMD;Os#d3aS%JR%In2Lk)#b2%!zG|xKPU>#a7^E(xNiAI}Tq<%XnDx8ag1WAymZ@IoxZWkm1<@t$7)8-k z(J6x}TZ6Ak33aYv5qNB~*irPLzNIYm)vxMJ8{`JF3iAm@0!9I*2AKmH5?K?Ulc1Y* zmKlLv$7bI8c2R4Md%ktPb-{gkp!f4?(QMJ&URZgGW#X~o+=;m}n?=K*dDuj5dPOE| zW?Fh4+xrh=+XSP!@!gW**;vphp;v3>A-q^`p0k4%)PHKBcSDhW_&5WbdW4+V${XY9E zx0UVL!(ZD32kn!00a>YpQ#L(oR&GuYNDq<^DyY

LmKPiMb-Vx&ox`$L^FK9PU2X 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®dNL$T~- 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

Yn{YbR|U_eZdXpp_jh&muD>2eu)p-8R33;$ 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 R={La3{#V2=v_k=@{{wd=_$vSa literal 0 HcmV?d00001 diff --git a/doc/index.html.in b/doc/index.html.in new file mode 100644 index 0000000..da77fa9 --- /dev/null +++ b/doc/index.html.in @@ -0,0 +1,107 @@ + + + + + Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Home    Administration    Classes    Online Help    Jobs    Printers  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS is the standards-based, open source printing system developed by +Apple Inc. for Mac OS® X and +other UNIX®-like operating systems.

+ +
CUPS
+ + + +
+ +

CUPS for Users

+ +

Overview of CUPS

+ +

Command-Line Printing and Options

+ +

What's New in CUPS 1.5

+ +

User Forum

+ +
+ +

CUPS for Administrators

+ +

Adding Printers and Classes

+ +

Managing Operation Policies

+ +

Printer Accounting Basics

+ +

Server Security

+ +

Using Kerberos Authentication

+ +

Using Network Printers

+ +

cupsd.conf Reference

+ +

Find Printer Drivers

+ +
+ +

CUPS for Developers

+ +

Introduction to CUPS Programming

+ +

CUPS API

+ +

Filter and Backend Programming

+ +

HTTP and IPP APIs

+ +

PPD API

+ +

Raster API

+ +

PPD Compiler Driver Information File Reference

+ +

Developer Forum

+ +
+ +
 
CUPS and the CUPS logo are trademarks of +Apple Inc. CUPS is copyright 2007-2012 Apple +Inc. All rights reserved.
+ + diff --git a/doc/it/index.html.in b/doc/it/index.html.in new file mode 100644 index 0000000..b7a43fb --- /dev/null +++ b/doc/it/index.html.in @@ -0,0 +1,107 @@ + + + + + Home - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Home    Amministrazione    Classi    Guida    Stampe    Stampanti  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS è un sistema di stampa basato su standard, open source sviluppato da +Apple Inc. per Mac OS® X e +altri sistemi UNIX® e derivati.

+ +
CUPS
+ + + +
+ +

CUPS per utenti

+ +

Panoramica di CUPS

+ +

Stampa e opzioni da riga di comando

+ +

Cosa c'è di nuovo in CUPS 1.5

+ +

Forum degli utenti

+ +
+ +

CUPS per amministratori

+ +

Aggiungere stampanti e classi

+ +

Gestire i criteri di funzionamento

+ +

Basi di controllo di accesso alle stampanti

+ +

Sicurezza del server

+ +

Utilizzare l'autenticazione Kerberos

+ +

Utilizzare stampanti di rete

+ +

Riferimenti al cupsd.conf

+ +

Trovare driver per le stampanti

+ +
+ +

CUPS per sviluppatori

+ +

Introduzione alla programmazione di CUPS

+ +

API di CUPS

+ +

Programmazione di filtri e motori

+ +

API HTTP e IPP

+ +

API PPD

+ +

API Raster

+ +

Riferimenti al file del compilatore di driver PPD

+ +

Forum degli sviluppatori

+ +
+ +
 
CUPS e il logo CUPS sono marchi di +Apple Inc. CUPS è un copyright 2007-2012 di Apple +Inc. Tutti i diritti sono riservati.
+ + diff --git a/doc/ja/index.html.in b/doc/ja/index.html.in new file mode 100644 index 0000000..3c28c4c --- /dev/null +++ b/doc/ja/index.html.in @@ -0,0 +1,107 @@ + + + + + ホーム - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  ãƒ›ãƒ¼ãƒ     ç®¡ç†    ã‚¯ãƒ©ã‚¹    ãƒ˜ãƒ«ãƒ—    ã‚¸ãƒ§ãƒ–   ãƒ—リンター 
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS は、Mac OS® X およびその他の UNIX ç³» OS のために、 +Apple Inc. +によって開発された標準ベースのオープンソース印刷システムです。

+ +
CUPS
+ + + +
+ +

ユーザー向け

+ +

CUPS の概要

+ +

コマンドラインからの印刷とオプション

+ +

CUPS 1.5 の新機能

+ +

ユーザーフォーラム

+ +
+ +

管理者向け

+ +

プリンターとクラスの追加

+ +

操作ポリシーの管理について

+ +

プリンターアカウンティングの基本

+ +

サーバーのセキュリティー

+ +

Kerberos 認証の使い方

+ +

ネットワークプリンターの使い方

+ +

cupsd.conf リファレンス

+ +

プリンタードライバーの検索

+ +
+ +

開発者向け

+ +

イントロダクション

+ +

CUPS API

+ +

フィルタとバックエンドのプログラミング

+ +

HTTP と IPP の API

+ +

PPD API

+ +

ラスター API

+ +

PPD コンパイラー用ドライバー情報ファイル リファレンス

+ +

開発者フォーラム

+ +
+ +
 
CUPS and the CUPS logo are trademarks of +Apple Inc. CUPS is copyright 2007-2012 Apple +Inc. All rights reserved.
+ + diff --git a/doc/pl/index.html.in b/doc/pl/index.html.in new file mode 100644 index 0000000..98db4f4 --- /dev/null +++ b/doc/pl/index.html.in @@ -0,0 +1,107 @@ + + + + + Strona domowa - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Strona domowa    Administracja    Klasy    Pomoc online    Zadania    Drukowanie  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS jest opartym na standardach systemem drukowania na licencji open source, tworzonym przez +Apple Inc. dla Mac OS® X i +innych systemów operacyjnych podobnych do Uniksa®.

+ +
CUPS
+ + + +
+ +

CUPS dla użytkowników

+ +

Przegląd CUPS

+ +

Drukowanie i opcje w wierszu poleceń

+ +

Co nowego w CUPS 1.5

+ +

Forum użytkowników

+ +
+ +

CUPS dla administratorów

+ +

Dodawanie drukarek i klas

+ +

Zarządzanie politykami operacji

+ +

Podstawy kont drukowania

+ +

Bezpieczeństwo systemu

+ +

Używanie uwierzytelniania Kerberosa

+ +

Używanie drukarek sieciowych

+ +

Informacje o cupsd.conf

+ +

Wyszukiwanie sterowników drukarek

+ +
+ +

CUPS dla programistów

+ +

Wprowadzenie do programowania CUPS

+ +

API CUPS

+ +

Programowanie filtrów i modułów przetwarzających

+ +

API HTTP i IPP

+ +

API PPD

+ +

API rastrowe

+ +

Informacje o kompilatorze plików informacji o sterownikach PPD

+ +

Forum programistów

+ +
+ +
 
CUPS i logo CUPS +są znakami handlowymi Apple Inc. CUPS +copyright 2007-2012 Apple Inc. Wszystkie prawa zastrzeżone.
+ + diff --git a/doc/robots.txt b/doc/robots.txt new file mode 100644 index 0000000..45dcdc2 --- /dev/null +++ b/doc/robots.txt @@ -0,0 +1,31 @@ +# +# "$Id: robots.txt 3494 2003-03-19 15:37:44Z mike $" +# +# This file tells search engines not to index your CUPS server. +# +# Copyright 1993-2003 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Easy Software Products and are protected by Federal +# copyright law. Distribution and use rights are outlined in the file +# "LICENSE.txt" which should have been included with this file. If this +# file is missing or damaged please contact Easy Software Products +# at: +# +# Attn: CUPS Licensing Information +# Easy Software Products +# 44141 Airport View Drive, Suite 204 +# Hollywood, Maryland 20636-3111 USA +# +# Voice: (301) 373-9600 +# EMail: cups-info@cups.org +# WWW: http://www.cups.org +# + +User-agent: * +Disallow: / + +# +# End of "$Id: robots.txt 3494 2003-03-19 15:37:44Z mike $". +# + diff --git a/doc/ru/index.html.in b/doc/ru/index.html.in new file mode 100644 index 0000000..c81ec29 --- /dev/null +++ b/doc/ru/index.html.in @@ -0,0 +1,103 @@ + + + + + Начало — CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  ÐÐ°Ñ‡Ð°Ð»Ð¾    ÐÐ´Ð¼Ð¸Ð½Ð¸ÑÑ‚рирование    Ð“руппы    Ð¡Ð¿Ñ€Ð°Ð²ÐºÐ°    Ð—адания    ÐŸÑ€Ð¸Ð½Ñ‚еры  
+ + + + + +
+ +

CUPS @CUPS_VERSION@

+ +

CUPS — поддерживающая большинство стандартов, свободная подсистема печати, разрабатываемая компанией Apple Inc. для операционной системы Mac OS® X и других UNIX®-подобных операционных систем.

+ +
CUPS
+ + + +
+ +

CUPS for Users

+ +

Введение в CUPS

+ +

Печать из командной строки

+ +

Что нового в CUPS 1.5

+ +

Форум пользователей

+ +
+ +

CUPS для администраторов

+ +

Добавление принтеров и групп

+ +

Управление доступом

+ +

Использование ресурсов

+ +

Безопасность системы

+ +

Использование аутентификации Kerberos

+ +

Использование сетевых принтеров

+ +

Справочник по cupsd.conf

+ +

Поиск драйверов принтера

+ +
+ +

CUPS для разработчиков

+ +

Введение в разработку CUPS

+ +

CUPS API

+ +

Разработка фильтров и модулей

+ +

API доступа по HTTP и IPP

+ +

PPD API

+ +

Raster API

+ +

Справочник по компилятору PPD

+ +

Форум разработчиков

+ +
+ +
 
CUPS а также логотип CUPS являются зарегистрированными торговыми марками Apple Inc. Авторские права на CUPS принадлежат (2007-2012) компании Apple Inc. Все права защищены.
+ + diff --git a/driver/Dependencies b/driver/Dependencies new file mode 100644 index 0000000..475ee80 --- /dev/null +++ b/driver/Dependencies @@ -0,0 +1,75 @@ +# DO NOT DELETE + +commandtoescpx.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +commandtoescpx.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +commandtoescpx.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +commandtoescpx.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +commandtoescpx.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +commandtoescpx.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +commandtoescpx.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +commandtoescpx.o: ../cups/language-private.h ../cups/transcode.h +commandtoescpx.o: ../cups/thread-private.h driver.h ../cups/raster.h +commandtoescpx.o: ../cups/ppd.h ../data/escp.h +commandtopclx.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +commandtopclx.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +commandtopclx.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +commandtopclx.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +commandtopclx.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +commandtopclx.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +commandtopclx.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +commandtopclx.o: ../cups/language-private.h ../cups/transcode.h +commandtopclx.o: ../cups/thread-private.h driver.h ../cups/raster.h +commandtopclx.o: ../cups/ppd.h ../data/pcl.h +rastertoescpx.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +rastertoescpx.o: ../cups/ipp.h ../cups/http.h ../cups/array.h +rastertoescpx.o: ../cups/language.h ../cups/raster.h ../cups/cups.h +rastertoescpx.o: ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h +rastertoescpx.o: ../cups/string-private.h ../config.h ../data/escp.h +rastertopclx.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +rastertopclx.o: ../cups/ipp.h ../cups/http.h ../cups/array.h +rastertopclx.o: ../cups/language.h ../cups/raster.h ../cups/cups.h +rastertopclx.o: ../cups/ppd.h ../cups/language-private.h ../cups/transcode.h +rastertopclx.o: ../cups/string-private.h ../config.h pcl-common.h +rastertopclx.o: ../data/pcl.h +pcl-common.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +pcl-common.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pcl-common.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h pcl-common.h +pcl-common.o: ../cups/string-private.h ../config.h ../data/pcl.h +testcmyk.o: ../cups/string-private.h ../config.h driver.h ../cups/cups.h +testcmyk.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testcmyk.o: ../cups/array.h ../cups/language.h ../cups/raster.h +testcmyk.o: ../cups/cups.h ../cups/ppd.h +testdither.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +testdither.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +testdither.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +testdither.o: ../cups/string-private.h ../config.h +testrgb.o: ../cups/string-private.h ../config.h driver.h ../cups/cups.h +testrgb.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testrgb.o: ../cups/array.h ../cups/language.h ../cups/raster.h ../cups/cups.h +testrgb.o: ../cups/ppd.h +attr.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +attr.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +attr.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +attr.o: ../cups/string-private.h ../config.h +check.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +check.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +check.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +cmyk.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +cmyk.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +cmyk.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +cmyk.o: ../cups/string-private.h ../config.h +dither.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +dither.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +dither.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h ../config.h +lut.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +lut.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +lut.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +pack.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +pack.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pack.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +rgb.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +rgb.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +rgb.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h +srgb.o: driver.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +srgb.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +srgb.o: ../cups/raster.h ../cups/cups.h ../cups/ppd.h diff --git a/driver/Makefile b/driver/Makefile new file mode 100644 index 0000000..7269e9e --- /dev/null +++ b/driver/Makefile @@ -0,0 +1,382 @@ +# +# "$Id: Makefile 9099 2010-04-11 07:16:05Z mike $" +# +# Makefile for the CUPS base drivers. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 2002-2005 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Include standard definitions... +# + +include ../Makedefs + + +# +# Object files... +# + +LIBOBJS = \ + attr.o \ + check.o \ + cmyk.o \ + dither.o \ + lut.o \ + pack.o \ + rgb.o \ + srgb.o +OBJS = \ + commandtoescpx.o \ + commandtopclx.o \ + rastertoescpx.o \ + rastertopclx.o \ + pcl-common.o \ + testcmyk.o \ + testdither.o \ + testrgb.o \ + $(LIBOBJS) + +LIBTARGETS = \ + $(LIBCUPSDRIVER) \ + libcupsdriver.a +UNITTARGETS = \ + testcmyk \ + testdither \ + testrgb +FILTERS = \ + commandtoescpx \ + commandtopclx \ + rastertoescpx \ + rastertopclx +TARGETS = \ + $(LIBTARGETS) \ + $(FILTERS) + + +# +# Make everything... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: $(LIBTARGETS) + + +# +# Make unit tests... +# + +unittests: $(UNITTARGETS) + + +# +# Clean everything... +# + +clean: + $(RM) $(OBJS) core + $(RM) *.bck core.* + $(RM) $(TARGETS) $(UNITTARGETS) + $(RM) -r test + $(RM) libcupsdriver.so libcupsdriver.sl libcupsdriver.dylib + + +# +# Update dependencies... +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + $(INSTALL_DIR) $(SERVERBIN)/filter + for file in $(FILTERS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/filter; \ + done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(FILTERS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + echo Installing header files in $(INCLUDEDIR)/cups... + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + $(INSTALL_DATA) driver.h $(INCLUDEDIR)/cups + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) + echo Installing libraries in $(LIBDIR)... + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPSDRIVER) $(LIBDIR) + if test $(LIBCUPSDRIVER) = "libcupsdriver.so.1" -o $(LIBCUPSDRIVER) = "libcupsdriver.sl.1"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPSDRIVER) .1`; \ + $(LN) $(LIBCUPSDRIVER) $(LIBDIR)/`basename $(LIBCUPSDRIVER) .1`; \ + fi + if test $(LIBCUPSDRIVER) = "libcupsdriver.1.dylib"; then \ + $(RM) $(LIBDIR)/libcupsdriver.dylib; \ + $(LN) $(LIBCUPSDRIVER) $(LIBDIR)/libcupsdriver.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPSDRIVER) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 libcupsdriver.a $(LIBDIR) + $(RANLIB) $(LIBDIR)/libcupsdriver.a + $(CHMOD) 555 $(LIBDIR)/libcupsdriver.a + + +# +# Uninstall... +# + +uninstall: + for file in commandtoescpx commandtopclx rastertoescpx rastertopclx; do \ + $(RM) $(SERVERBIN)/filter/$$file; \ + done + $(RM) $(LIBDIR)/libcupsdriver.1.dylib + $(RM) $(LIBDIR)/libcupsdriver.a + $(RM) $(LIBDIR)/libcupsdriver.dylib + $(RM) $(LIBDIR)/libcupsdriver_s.a + $(RM) $(LIBDIR)/libcupsdriver.sl + $(RM) $(LIBDIR)/libcupsdriver.sl.1 + $(RM) $(LIBDIR)/libcupsdriver.so + $(RM) $(LIBDIR)/libcupsdriver.so.1 + -$(RMDIR) $(LIBDIR) + $(RM) $(INCLUDEDIR)/cups/driver.h + -$(RMDIR) $(INCLUDEDIR)/cups + + +# +# Automatic API help files... +# + +apihelp: + mxmldoc --section "Programming" \ + --title "Printer Driver API" \ + --css ../doc/cups-printable.css \ + --header api-driver.header --intro api-driver.shtml \ + api-driver.xml \ + driver.h $(LIBOBJS:.o=.c) >../doc/help/api-driver.html + mxmldoc --tokens help/api-driver.html >../doc/help/api-driver.tokens + $(RM) api-driver.xml + +framedhelp: + mxmldoc --framed api-driver \ + --section "Programming" \ + --title "Printer Driver API" \ + --css ../doc/cups-printable.css \ + --header api-driver.header --intro api-driver.shtml \ + driver.h $(LIBOBJS:.o=.c) + + +# +# commandtopclx, the PCL command printer driver. +# + +commandtopclx: commandtopclx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ commandtopclx.o -L. -lcupsdriver $(LIBS) + + +# +# commandtoescpx, the ESC/P command printer driver. +# + +commandtoescpx: commandtoescpx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ commandtoescpx.o -L. -lcupsdriver $(LIBS) + + +# +# rastertoescpx, the ESC/P raster printer driver. +# + +rastertoescpx: rastertoescpx.o $(LIBCUPSDRIVER) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertoescpx.o -L. -lcupsdriver \ + $(LINKCUPSIMAGE) $(LIBS) + + +# +# rastertopclx, the ESC/P raster printer driver. +# + +rastertopclx: rastertopclx.o pcl-common.o $(LIBCUPSDRIVER) \ + ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertopclx.o pcl-common.o -L. -lcupsdriver \ + $(LINKCUPSIMAGE) $(LIBS) + + +# +# test, make a common test subdirectory for the other test programs. +# + +test: + if test ! -d test; then \ + rm -rf test; \ + mkdir test; \ + fi + + +# +# testcmyk, test cmyk separation functions. +# + +testcmyk: test testcmyk.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testcmyk.o libcupsdriver.a \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Running CMYK API tests... + ./testcmyk > test/testcmyk.log + + +# +# testdither, test dithering functions. +# + +testdither: test testdither.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testdither.o libcupsdriver.a \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Running dither API tests... + ./testdither > test/0-255.pgm 2>test/0-255.log + ./testdither 0 127 255 > test/0-127-255.pgm 2>test/0-127-255.log + ./testdither 0 85 170 255 > test/0-85-170-255.pgm 2>test/0-85-170-255.log + ./testdither 0 63 127 170 198 227 255 > test/0-63-127-170-198-227-255.pgm 2>test/0-63-127-170-198-227-255.log + ./testdither 0 210 383 > test/0-210-383.pgm 2>test/0-210-383.log + ./testdither 0 82 255 > test/0-82-255.pgm 2>test/0-82-255.log + ./testdither 0 510 > test/0-510.pgm 2>test/0-510.log + ./testdither 0 1020 > test/0-1020.pgm 2>test/0-1020.log + + +# +# testrgb, test RGB separation functions. +# + +testrgb: test testrgb.o libcupsdriver.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testrgb.o libcupsdriver.a \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Running RGB API tests... + ./testrgb > test/testrgb.log 2>&1 || echo "RGB tests failed!" + + +# +# libcupsdriver.so.1, libcupsdriver.sl.1 +# + +libcupsdriver.so.1 libcupsdriver.sl.1: $(LIBOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) + $(RM) `basename $@ .1` + $(LN) $@ `basename $@ .1` + + +# +# libcupsdriver.1.dylib +# + +libcupsdriver.1.dylib: $(LIBOBJS) libcupsdriver.exp + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.0.0 \ + -compatibility_version 1.0.0 \ + -exported_symbols_list libcupsdriver.exp \ + $(LIBOBJS) $(LIBS) + $(RM) libcupsdriver.dylib + $(LN) $@ libcupsdriver.dylib + + +# +# libcupsdriver_s.a +# + +libcupsdriver_s.a: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o libcupsdriver_s.o $(LIBOBJS) $(LIBS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcupsdriver_s.o + + +# +# libcupsdriver.la +# + +libcupsdriver.la: $(LIBOBJS) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \ + -version-info 1:0 $(LIBS) + + +# +# libcupsdriver.a +# + +libcupsdriver.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# Include dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9099 2010-04-11 07:16:05Z mike $". +# diff --git a/driver/api-driver.header b/driver/api-driver.header new file mode 100644 index 0000000..0f3937b --- /dev/null +++ b/driver/api-driver.header @@ -0,0 +1,34 @@ + + +

Driver API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/driver.h
Library-lcupsdriver
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/driver/api-driver.shtml b/driver/api-driver.shtml new file mode 100644 index 0000000..0e8bcff --- /dev/null +++ b/driver/api-driver.shtml @@ -0,0 +1,18 @@ + + +

Overview

+ +

The driver API provides common dithering, color conversion, and utility +functions for CUPS drivers.

diff --git a/driver/attr.c b/driver/attr.c new file mode 100644 index 0000000..fff68bf --- /dev/null +++ b/driver/attr.c @@ -0,0 +1,109 @@ +/* + * "$Id: attr.c 9042 2010-03-24 00:45:34Z mike $" + * + * PPD attribute lookup routine for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsFindAttr() - Find a PPD attribute based on the colormodel, + * media, and resolution. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" +#include + + +/* + * 'cupsFindAttr()' - Find a PPD attribute based on the colormodel, + * media, and resolution. + */ + +ppd_attr_t * /* O - Matching attribute or NULL */ +cupsFindAttr(ppd_file_t *ppd, /* I - PPD file */ + const char *name, /* I - Attribute name */ + const char *colormodel, /* I - Color model */ + const char *media, /* I - Media type */ + const char *resolution, /* I - Resolution */ + char *spec, /* O - Final selection string */ + int specsize) /* I - Size of string buffer */ +{ + ppd_attr_t *attr; /* Attribute */ + + + /* + * Range check input... + */ + + if (!ppd || !name || !colormodel || !media || !resolution || !spec || + specsize < PPD_MAX_NAME) + return (NULL); + + /* + * Look for the attribute with the following keywords: + * + * ColorModel.MediaType.Resolution + * ColorModel.Resolution + * ColorModel + * MediaType.Resolution + * MediaType + * Resolution + * "" + */ + + snprintf(spec, specsize, "%s.%s.%s", colormodel, media, resolution); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + snprintf(spec, specsize, "%s.%s", colormodel, resolution); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + strlcpy(spec, colormodel, specsize); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + snprintf(spec, specsize, "%s.%s", media, resolution); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + strlcpy(spec, media, specsize); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + strlcpy(spec, resolution, specsize); + fprintf(stderr, "DEBUG2: Looking for \"*%s %s\"...\n", name, spec); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + spec[0] = '\0'; + fprintf(stderr, "DEBUG2: Looking for \"*%s\"...\n", name); + if ((attr = ppdFindAttr(ppd, name, spec)) != NULL && attr->value != NULL) + return (attr); + + fprintf(stderr, "DEBUG2: No instance of \"*%s\" found...\n", name); + + return (NULL); +} + + +/* + * End of "$Id: attr.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/driver/check.c b/driver/check.c new file mode 100644 index 0000000..613530c --- /dev/null +++ b/driver/check.c @@ -0,0 +1,111 @@ +/* + * "$Id: check.c 7306 2008-02-15 00:52:38Z mike $" + * + * Byte checking routines for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsCheckBytes() - Check to see if all bytes are zero. + * cupsCheckValue() - Check to see if all bytes match the given value. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" + + +/* + * 'cupsCheckBytes()' - Check to see if all bytes are zero. + */ + +int /* O - 1 if they match */ +cupsCheckBytes(const unsigned char *bytes, /* I - Bytes to check */ + int length) /* I - Number of bytes to check */ +{ + while (length > 7) + { + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + if (*bytes++) + return (0); + + length -= 8; + } + + while (length > 0) + if (*bytes++) + return (0); + else + length --; + + return (1); +} + + +/* + * 'cupsCheckValue()' - Check to see if all bytes match the given value. + */ + +int /* O - 1 if they match */ +cupsCheckValue(const unsigned char *bytes, /* I - Bytes to check */ + int length, /* I - Number of bytes to check */ + const unsigned char value) /* I - Value to check */ +{ + while (length > 7) + { + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + if (*bytes++ != value) + return (0); + + length -= 8; + } + + while (length > 0) + if (*bytes++ != value) + return (0); + else + length --; + + return (1); +} + + +/* + * End of "$Id: check.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/cmyk.c b/driver/cmyk.c new file mode 100644 index 0000000..757584b --- /dev/null +++ b/driver/cmyk.c @@ -0,0 +1,1955 @@ +/* + * "$Id: cmyk.c 9042 2010-03-24 00:45:34Z mike $" + * + * CMYK color separation code for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsCMYKDelete() - Delete a color separation. + * cupsCMYKDoBlack() - Do a black separation... + * cupsCMYKDoCMYK() - Do a CMYK separation... + * cupsCMYKDoGray() - Do a grayscale separation... + * cupsCMYKDoRGB() - Do an sRGB separation... + * cupsCMYKLoad() - Load a CMYK color profile from PPD attributes. + * cupsCMYKNew() - Create a new CMYK color separation. + * cupsCMYKSetBlack() - Set the transition range for CMY to black. + * cupsCMYKSetCurve() - Set a color transform curve using points. + * cupsCMYKSetGamma() - Set a color transform curve using gamma and + * density. + * cupsCMYKSetInkLimit() - Set the limit on the amount of ink. + * cupsCMYKSetLtDk() - Set light/dark ink transforms. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" +#include + + +/* + * 'cupsCMYKDelete()' - Delete a color separation. + */ + +void +cupsCMYKDelete(cups_cmyk_t *cmyk) /* I - Color separation */ +{ + /* + * Range check input... + */ + + if (cmyk == NULL) + return; + + /* + * Free memory used... + */ + + free(cmyk->channels[0]); + free(cmyk); +} + + +/* + * 'cupsCMYKDoBlack()' - Do a black separation... + */ + +void +cupsCMYKDoBlack(const cups_cmyk_t *cmyk, + /* I - Color separation */ + const unsigned char *input, + /* I - Input grayscale pixels */ + short *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int k; /* Current black value */ + const short **channels; /* Copy of channel LUTs */ + int ink, /* Amount of ink */ + ink_limit; /* Ink limit from separation */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) + return; + + /* + * Loop through it all... + */ + + channels = (const short **)cmyk->channels; + ink_limit = cmyk->ink_limit; + + switch (cmyk->num_channels) + { + case 1 : /* Black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + *output++ = channels[0][k]; + + num_pixels --; + } + break; + + case 2 : /* Black, light black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + output[0] = channels[0][k]; + output[1] = channels[1][k]; + + if (ink_limit) + { + ink = output[0] + output[1]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + } + } + + output += 2; + num_pixels --; + } + break; + + case 3 : /* CMY */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + output[0] = channels[0][k]; + output[1] = channels[1][k]; + output[2] = channels[2][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + } + } + + output += 3; + num_pixels --; + } + break; + + case 4 : /* CMYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + *output++ = 0; + *output++ = 0; + *output++ = 0; + *output++ = channels[3][k]; + + num_pixels --; + } + break; + + case 6 : /* CcMmYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + *output++ = 0; + *output++ = 0; + *output++ = 0; + *output++ = 0; + *output++ = 0; + *output++ = channels[5][k]; + + num_pixels --; + } + break; + + case 7 : /* CcMmYKk */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = *input++; + output[0] = 0; + output[1] = 0; + output[2] = 0; + output[3] = 0; + output[4] = 0; + output[5] = channels[5][k]; + output[6] = channels[6][k]; + + if (ink_limit) + { + ink = output[5] + output[6]; + + if (ink > ink_limit) + { + output[5] = ink_limit * output[5] / ink; + output[6] = ink_limit * output[6] / ink; + } + } + + output += 7; + num_pixels --; + } + break; + } +} + + +/* + * 'cupsCMYKDoCMYK()' - Do a CMYK separation... + */ + +void +cupsCMYKDoCMYK(const cups_cmyk_t *cmyk, + /* I - Color separation */ + const unsigned char *input, + /* I - Input grayscale pixels */ + short *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int c, /* Current cyan value */ + m, /* Current magenta value */ + y, /* Current yellow value */ + k; /* Current black value */ + const short **channels; /* Copy of channel LUTs */ + int ink, /* Amount of ink */ + ink_limit; /* Ink limit from separation */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) + return; + + /* + * Loop through it all... + */ + + channels = (const short **)cmyk->channels; + ink_limit = cmyk->ink_limit; + + switch (cmyk->num_channels) + { + case 1 : /* Black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++ + (c * 31 + m * 61 + y * 8) / 100; + + if (k < 255) + *output++ = channels[0][k]; + else + *output++ = channels[0][255]; + + num_pixels --; + } + break; + + case 2 : /* Black, light black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++ + (c * 31 + m * 61 + y * 8) / 100; + + if (k < 255) + { + output[0] = channels[0][k]; + output[1] = channels[1][k]; + } + else + { + output[0] = channels[0][255]; + output[1] = channels[1][255]; + } + + if (ink_limit) + { + ink = output[0] + output[1]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + } + } + + output += 2; + num_pixels --; + } + break; + + case 3 : /* CMY */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++; + c += k; + m += k; + y += k; + + if (c < 255) + output[0] = channels[0][c]; + else + output[0] = channels[0][255]; + + if (m < 255) + output[1] = channels[1][m]; + else + output[1] = channels[1][255]; + + if (y < 255) + output[2] = channels[2][y]; + else + output[2] = channels[2][255]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + } + } + + output += 3; + num_pixels --; + } + break; + + case 4 : /* CMYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++; + + output[0] = channels[0][c]; + output[1] = channels[1][m]; + output[2] = channels[2][y]; + output[3] = channels[3][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + } + } + + output += 4; + num_pixels --; + } + break; + + case 6 : /* CcMmYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++; + + output[0] = channels[0][c]; + output[1] = channels[1][c]; + output[2] = channels[2][m]; + output[3] = channels[3][m]; + output[4] = channels[4][y]; + output[5] = channels[5][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + } + } + + output += 6; + num_pixels --; + } + break; + + case 7 : /* CcMmYKk */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = *input++; + m = *input++; + y = *input++; + k = *input++; + + output[0] = channels[0][c]; + output[1] = channels[1][c]; + output[2] = channels[2][m]; + output[3] = channels[3][m]; + output[4] = channels[4][y]; + output[5] = channels[5][k]; + output[6] = channels[6][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5] + output[6]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + output[6] = ink_limit * output[6] / ink; + } + } + + output += 7; + num_pixels --; + } + break; + } +} + + +/* + * 'cupsCMYKDoGray()' - Do a grayscale separation... + */ + +void +cupsCMYKDoGray(const cups_cmyk_t *cmyk, + /* I - Color separation */ + const unsigned char *input, + /* I - Input grayscale pixels */ + short *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int k, /* Current black value */ + kc; /* Current black color value */ + const short **channels; /* Copy of channel LUTs */ + int ink, /* Amount of ink */ + ink_limit; /* Ink limit from separation */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) + return; + + /* + * Loop through it all... + */ + + channels = (const short **)cmyk->channels; + ink_limit = cmyk->ink_limit; + + switch (cmyk->num_channels) + { + case 1 : /* Black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + *output++ = channels[0][k]; + + num_pixels --; + } + break; + + case 2 : /* Black, light black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + output[0] = channels[0][k]; + output[1] = channels[1][k]; + + if (ink_limit) + { + ink = output[0] + output[1]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + } + } + + output += 2; + num_pixels --; + } + break; + + case 3 : /* CMY */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + output[0] = channels[0][k]; + output[1] = channels[1][k]; + output[2] = channels[2][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + } + } + + output += 3; + num_pixels --; + } + break; + + case 4 : /* CMYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + kc = cmyk->color_lut[k]; + k = cmyk->black_lut[k]; + output[0] = channels[0][kc]; + output[1] = channels[1][kc]; + output[2] = channels[2][kc]; + output[3] = channels[3][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + } + } + + output += 4; + num_pixels --; + } + break; + + case 6 : /* CcMmYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + kc = cmyk->color_lut[k]; + k = cmyk->black_lut[k]; + output[0] = channels[0][kc]; + output[1] = channels[1][kc]; + output[2] = channels[2][kc]; + output[3] = channels[3][kc]; + output[4] = channels[4][kc]; + output[5] = channels[5][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + } + } + + output += 6; + num_pixels --; + } + break; + + case 7 : /* CcMmYKk */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + k = cups_scmy_lut[*input++]; + kc = cmyk->color_lut[k]; + k = cmyk->black_lut[k]; + output[0] = channels[0][kc]; + output[1] = channels[1][kc]; + output[2] = channels[2][kc]; + output[3] = channels[3][kc]; + output[4] = channels[4][kc]; + output[5] = channels[5][k]; + output[6] = channels[6][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5] + output[6]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + output[6] = ink_limit * output[6] / ink; + } + } + + output += 7; + num_pixels --; + } + break; + } +} + + +/* + * 'cupsCMYKDoRGB()' - Do an sRGB separation... + */ + +void +cupsCMYKDoRGB(const cups_cmyk_t *cmyk, + /* I - Color separation */ + const unsigned char *input, + /* I - Input grayscale pixels */ + short *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int c, /* Current cyan value */ + m, /* Current magenta value */ + y, /* Current yellow value */ + k, /* Current black value */ + kc, /* Current black color value */ + km; /* Maximum black value */ + const short **channels; /* Copy of channel LUTs */ + int ink, /* Amount of ink */ + ink_limit; /* Ink limit from separation */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || input == NULL || output == NULL || num_pixels <= 0) + return; + + /* + * Loop through it all... + */ + + channels = (const short **)cmyk->channels; + ink_limit = cmyk->ink_limit; + + switch (cmyk->num_channels) + { + case 1 : /* Black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + k = (c * 31 + m * 61 + y * 8) / 100; + + *output++ = channels[0][k]; + + num_pixels --; + } + break; + + case 2 : /* Black, light black */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + k = (c * 31 + m * 61 + y * 8) / 100; + + output[0] = channels[0][k]; + output[1] = channels[1][k]; + + if (ink_limit) + { + ink = output[0] + output[1]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + } + } + + output += 2; + num_pixels --; + } + break; + + case 3 : /* CMY */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + + output[0] = channels[0][c]; + output[1] = channels[1][m]; + output[2] = channels[2][y]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + } + } + + output += 3; + num_pixels --; + } + break; + + case 4 : /* CMYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + k = min(c, min(m, y)); + + if ((km = max(c, max(m, y))) > k) + k = k * k * k / (km * km); + + kc = cmyk->color_lut[k] - k; + k = cmyk->black_lut[k]; + c += kc; + m += kc; + y += kc; + + output[0] = channels[0][c]; + output[1] = channels[1][m]; + output[2] = channels[2][y]; + output[3] = channels[3][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + } + } + + output += 4; + num_pixels --; + } + break; + + case 6 : /* CcMmYK */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + k = min(c, min(m, y)); + + if ((km = max(c, max(m, y))) > k) + k = k * k * k / (km * km); + + kc = cmyk->color_lut[k] - k; + k = cmyk->black_lut[k]; + c += kc; + m += kc; + y += kc; + + output[0] = channels[0][c]; + output[1] = channels[1][c]; + output[2] = channels[2][m]; + output[3] = channels[3][m]; + output[4] = channels[4][y]; + output[5] = channels[5][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + } + } + + output += 6; + num_pixels --; + } + break; + + case 7 : /* CcMmYKk */ + while (num_pixels > 0) + { + /* + * Get the input black value and then set the corresponding color + * channel values... + */ + + c = cups_scmy_lut[*input++]; + m = cups_scmy_lut[*input++]; + y = cups_scmy_lut[*input++]; + k = min(c, min(m, y)); + + if ((km = max(c, max(m, y))) > k) + k = k * k * k / (km * km); + + kc = cmyk->color_lut[k] - k; + k = cmyk->black_lut[k]; + c += kc; + m += kc; + y += kc; + + output[0] = channels[0][c]; + output[1] = channels[1][c]; + output[2] = channels[2][m]; + output[3] = channels[3][m]; + output[4] = channels[4][y]; + output[5] = channels[5][k]; + output[6] = channels[6][k]; + + if (ink_limit) + { + ink = output[0] + output[1] + output[2] + output[3] + + output[4] + output[5] + output[6]; + + if (ink > ink_limit) + { + output[0] = ink_limit * output[0] / ink; + output[1] = ink_limit * output[1] / ink; + output[2] = ink_limit * output[2] / ink; + output[3] = ink_limit * output[3] / ink; + output[4] = ink_limit * output[4] / ink; + output[5] = ink_limit * output[5] / ink; + output[6] = ink_limit * output[6] / ink; + } + } + + output += 7; + num_pixels --; + } + break; + } +} + + +/* + * 'cupsCMYKLoad()' - Load a CMYK color profile from PPD attributes. + */ + +cups_cmyk_t * /* O - CMYK color separation */ +cupsCMYKLoad(ppd_file_t *ppd, /* I - PPD file */ + const char *colormodel, /* I - ColorModel value */ + const char *media, /* I - MediaType value */ + const char *resolution) /* I - Resolution value */ +{ + cups_cmyk_t *cmyk; /* CMYK color separation */ + char spec[PPD_MAX_NAME]; /* Profile name */ + ppd_attr_t *attr; /* Attribute from PPD file */ + int num_channels; /* Number of color components */ + float gamval, /* Gamma correction value */ + density, /* Density value */ + light, /* Light ink limit */ + dark, /* Light ink cut-off */ + lower, /* Start of black ink */ + upper; /* End of color ink */ + int num_xypoints; /* Number of X,Y points */ + float xypoints[100 * 2], /* X,Y points */ + *xyptr; /* Current X,Y point */ + + + /* + * Range check input... + */ + + if (ppd == NULL || colormodel == NULL || resolution == NULL || media == NULL) + return (NULL); + + /* + * Find the following attributes: + * + * cupsAllGamma - Set default curve using gamma + density + * cupsAllXY - Set default curve using XY points + * cupsBlackGamma - Set black curve using gamma + density + * cupsBlackGeneration - Set black generation + * cupsBlackLightDark - Set black light/dark transition + * cupsBlackXY - Set black curve using XY points + * cupsCyanGamma - Set cyan curve using gamma + density + * cupsCyanLightDark - Set cyan light/dark transition + * cupsCyanXY - Set cyan curve using XY points + * cupsInkChannels - Set number of color channels + * cupsInkLimit - Set total ink limit + * cupsLightBlackGamma - Set light black curve using gamma + density + * cupsLightBlackXY - Set light black curve using XY points + * cupsLightCyanGamma - Set light cyan curve using gamma + density + * cupsLightCyanXY - Set light cyan curve using XY points + * cupsLightMagentaGamma - Set light magenta curve using gamma + density + * cupsLightMagentaXY - Set light magenta curve using XY points + * cupsMagentaGamma - Set magenta curve using gamma + density + * cupsMagentaLightDark - Set magenta light/dark transition + * cupsMagentaXY - Set magenta curve using XY points + * cupsYellowGamma - Set yellow curve using gamma + density + * cupsYellowXY - Set yellow curve using XY points + * + * The only required attribute is cupsInkChannels. + * + * The *XY attributes have precedence over the *Gamma attributes, and + * the *Light* attributes have precedence over the corresponding + * *LightDark* attributes. + */ + + /* + * Get the required cupsInkChannels attribute... + */ + + if ((attr = cupsFindAttr(ppd, "cupsInkChannels", colormodel, media, + resolution, spec, sizeof(spec))) == NULL) + return (NULL); + + num_channels = atoi(attr->value); + + if (num_channels < 1 || num_channels > 7 || num_channels == 5) + return (NULL); + + if ((cmyk = cupsCMYKNew(num_channels)) == NULL) + return (NULL); + + /* + * Get the optional cupsInkLimit attribute... + */ + + if ((attr = cupsFindAttr(ppd, "cupsInkLimit", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + cupsCMYKSetInkLimit(cmyk, atof(attr->value)); + + /* + * Get the optional cupsBlackGeneration attribute... + */ + + if ((attr = cupsFindAttr(ppd, "cupsBlackGeneration", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &lower, &upper) == 2) + cupsCMYKSetBlack(cmyk, lower, upper); + } + + /* + * Get the optional cupsBlackXY or cupsBlackGamma attributes... + */ + + if (num_channels != 3) + { + if ((attr = cupsFindAttr(ppd, "cupsBlackXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsBlackXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 1 : + case 2 : + cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); + break; + case 4 : + cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 5, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsBlackGamma", colormodel, + media, resolution, spec, + sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 1 : + case 2 : + cupsCMYKSetGamma(cmyk, 0, gamval, density); + break; + case 4 : + cupsCMYKSetGamma(cmyk, 3, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 5, gamval, density); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 1 : + case 2 : + cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); + break; + case 4 : + cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 5, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, + media, resolution, spec, + sizeof(spec))) != NULL && + num_channels != 3) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 1 : + case 2 : + cupsCMYKSetGamma(cmyk, 0, gamval, density); + break; + case 4 : + cupsCMYKSetGamma(cmyk, 3, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 5, gamval, density); + break; + } + } + } + + if (num_channels > 2) + { + /* + * Get the optional cupsCyanXY or cupsCyanGamma attributes... + */ + + if ((attr = cupsFindAttr(ppd, "cupsCyanXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsCyanXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); + } + else if ((attr = cupsFindAttr(ppd, "cupsCyanGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + cupsCMYKSetGamma(cmyk, 0, gamval, density); + } + else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + cupsCMYKSetCurve(cmyk, 0, num_xypoints, xypoints); + } + else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + cupsCMYKSetGamma(cmyk, 0, gamval, density); + } + + /* + * Get the optional cupsMagentaXY or cupsMagentaGamma attributes... + */ + + if ((attr = cupsFindAttr(ppd, "cupsMagentaXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsMagentaXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsMagentaGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetGamma(cmyk, 1, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 2, gamval, density); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetGamma(cmyk, 1, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 2, gamval, density); + break; + } + } + + /* + * Get the optional cupsYellowXY or cupsYellowGamma attributes... + */ + + if ((attr = cupsFindAttr(ppd, "cupsYellowXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsYellowXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 4, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsYellowGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetGamma(cmyk, 2, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 4, gamval, density); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsAllXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetCurve(cmyk, 2, num_xypoints, xypoints); + break; + case 6 : + case 7 : + cupsCMYKSetCurve(cmyk, 4, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsAllGamma", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 3 : + case 4 : + cupsCMYKSetGamma(cmyk, 2, gamval, density); + break; + case 6 : + case 7 : + cupsCMYKSetGamma(cmyk, 4, gamval, density); + break; + } + } + } + + /* + * Get the optional cupsLightBlackXY, cupsLightBlackGamma, or + * cupsBlackLtDk attributes... + */ + + if (num_channels == 2 || num_channels == 7) + { + if ((attr = cupsFindAttr(ppd, "cupsLightBlackXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsLightBlackXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + switch (num_channels) + { + case 2 : + cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); + break; + case 7 : + cupsCMYKSetCurve(cmyk, 6, num_xypoints, xypoints); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsLightBlackGamma", colormodel, + media, resolution, spec, + sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + switch (num_channels) + { + case 2 : + cupsCMYKSetGamma(cmyk, 1, gamval, density); + break; + case 7 : + cupsCMYKSetGamma(cmyk, 6, gamval, density); + break; + } + } + else if ((attr = cupsFindAttr(ppd, "cupsBlackLtDk", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &light, &dark) == 2) + switch (num_channels) + { + case 2 : + cupsCMYKSetLtDk(cmyk, 0, light, dark); + break; + case 7 : + cupsCMYKSetLtDk(cmyk, 5, light, dark); + break; + } + else + fprintf(stderr, "ERROR: Bad cupsBlackLtDk value \"%s\"!\n", + attr->value); + } + else + fprintf(stderr, "WARNING: No light black attribute found for %s!\n", + spec); + } + + if (num_channels >= 6) + { + /* + * Get the optional cupsLightCyanXY, cupsLightCyanGamma, or + * cupsCyanLtDk attributes... + */ + + if ((attr = cupsFindAttr(ppd, "cupsLightCyanXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsLightCyanXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + cupsCMYKSetCurve(cmyk, 1, num_xypoints, xypoints); + } + else if ((attr = cupsFindAttr(ppd, "cupsLightCyanGamma", colormodel, + media, resolution, spec, + sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + cupsCMYKSetGamma(cmyk, 1, gamval, density); + } + else if ((attr = cupsFindAttr(ppd, "cupsCyanLtDk", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &light, &dark) == 2) + cupsCMYKSetLtDk(cmyk, 0, light, dark); + else + fprintf(stderr, "ERROR: Bad cupsCyanLtDk value \"%s\"!\n", + attr->value); + } + else + fprintf(stderr, "WARNING: No light cyan attribute found for %s!\n", + spec); + + /* + * Get the optional cupsLightMagentaXY, cupsLightMagentaGamma, or + * cupsMagentaLtDk attributes... + */ + + if ((attr = cupsFindAttr(ppd, "cupsLightMagentaXY", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + for (num_xypoints = 0, xyptr = xypoints; + attr != NULL && attr->value != NULL && num_xypoints < 100; + attr = ppdFindNextAttr(ppd, "cupsLightMagentaXY", spec)) + if (sscanf(attr->value, "%f%f", xyptr, xyptr + 1) == 2) + { + num_xypoints ++; + xyptr += 2; + } + + cupsCMYKSetCurve(cmyk, 3, num_xypoints, xypoints); + } + else if ((attr = cupsFindAttr(ppd, "cupsLightMagentaGamma", colormodel, + media, resolution, spec, + sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &gamval, &density) == 2) + cupsCMYKSetGamma(cmyk, 3, gamval, density); + } + else if ((attr = cupsFindAttr(ppd, "cupsMagentaLtDk", colormodel, media, + resolution, spec, sizeof(spec))) != NULL) + { + if (sscanf(attr->value, "%f%f", &light, &dark) == 2) + cupsCMYKSetLtDk(cmyk, 2, light, dark); + else + fprintf(stderr, "ERROR: Bad cupsMagentaLtDk value \"%s\"!\n", + attr->value); + } + else + fprintf(stderr, "WARNING: No light magenta attribute found for %s!\n", + spec); + } + + /* + * Return the new profile... + */ + + return (cmyk); +} + + +/* + * 'cupsCMYKNew()' - Create a new CMYK color separation. + */ + +cups_cmyk_t * /* O - New CMYK separation or NULL */ +cupsCMYKNew(int num_channels) /* I - Number of color components */ +{ + cups_cmyk_t *cmyk; /* New color separation */ + int i; /* Looping var */ + + + /* + * Range-check the input... + */ + + if (num_channels < 1) + return (NULL); + + /* + * Allocate memory for the separation... + */ + + if ((cmyk = calloc(1, sizeof(cups_cmyk_t))) == NULL) + return (NULL); + + /* + * Allocate memory for the LUTs... + */ + + cmyk->num_channels = num_channels; + + if ((cmyk->channels[0] = calloc(num_channels * 256, sizeof(short))) == NULL) + { + free(cmyk); + return (NULL); + } + + for (i = 1; i < num_channels; i ++) + cmyk->channels[i] = cmyk->channels[0] + i * 256; + + /* + * Fill in the LUTs with unity transitions... + */ + + for (i = 0; i < 256; i ++) + cmyk->black_lut[i] = i; + + switch (num_channels) + { + case 1 : /* K */ + case 2 : /* Kk */ + for (i = 0; i < 256; i ++) + { + cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; + } + break; + case 3 : /* CMY */ + for (i = 0; i < 256; i ++) + { + cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[1][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; + } + break; + case 4 : /* CMYK */ + for (i = 0; i < 256; i ++) + { + cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[1][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[3][i] = CUPS_MAX_LUT * i / 255; + } + break; + case 6 : /* CcMmYK */ + case 7 : /* CcMmYKk */ + for (i = 0; i < 256; i ++) + { + cmyk->channels[0][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[2][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[4][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[5][i] = CUPS_MAX_LUT * i / 255; + } + break; + } + + /* + * Return the separation... + */ + + return (cmyk); +} + + +/* + * 'cupsCMYKSetBlack()' - Set the transition range for CMY to black. + */ + +void +cupsCMYKSetBlack(cups_cmyk_t *cmyk, /* I - CMYK color separation */ + float lower, /* I - No black ink */ + float upper) /* I - Only black ink */ +{ + int i, /* Looping var */ + delta, /* Difference between lower and upper */ + ilower, /* Lower level from 0 to 255 */ + iupper; /* Upper level from 0 to 255 */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || lower < 0.0 || lower > 1.0 || upper < 0.0 || upper > 1.0 || + lower > upper) + return; + + /* + * Convert lower and upper to integers from 0 to 255... + */ + + ilower = (int)(255.0 * lower + 0.5); + iupper = (int)(255.0 * upper + 0.5); + delta = iupper - ilower; + + /* + * Generate the CMY-only data... + */ + + for (i = 0; i < ilower; i ++) + { + cmyk->black_lut[i] = 0; + cmyk->color_lut[i] = i; + } + + /* + * Then the transition data... + */ + + for (; i < iupper; i ++) + { + cmyk->black_lut[i] = iupper * (i - ilower) / delta; + cmyk->color_lut[i] = ilower - ilower * (i - ilower) / delta; + } + + /* + * Then the K-only data... + */ + + for (; i < 256; i ++) + { + cmyk->black_lut[i] = i; + cmyk->color_lut[i] = 0; + } + + fprintf(stderr, "DEBUG: cupsCMYKSetBlack(cmyk, lower=%.3f, upper=%.3f)\n", lower, upper); + + for (i = 0; i < 256; i += 17) + fprintf(stderr, "DEBUG: %3d = %3dk + %3dc\n", i, + cmyk->black_lut[i], cmyk->color_lut[i]); +} + + +/* + * 'cupsCMYKSetCurve()' - Set a color transform curve using points. + */ + +void +cupsCMYKSetCurve(cups_cmyk_t *cmyk, /* I - CMYK color separation */ + int channel, /* I - Color channel */ + int num_xypoints, + /* I - Number of X,Y points */ + const float *xypoints) /* I - X,Y points */ +{ + int i; /* Looping var */ + int xstart; /* Start position */ + int xend; /* End position */ + int xdelta; /* Difference in position */ + int ystart; /* Start value */ + int yend; /* End value */ + int ydelta; /* Difference in value */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || channel < 0 || channel >= cmyk->num_channels || + num_xypoints < 1 || xypoints == NULL) + return; + + /* + * Initialize the lookup table for the specified channel... + */ + + for (xstart = xend = 0, ystart = yend = 0; + num_xypoints > 0; + num_xypoints --, xypoints += 2, xstart = xend, ystart = yend) + { + xend = (int)(255.0 * xypoints[1] + 0.5); + yend = (int)(CUPS_MAX_LUT * xypoints[0] + 0.5); + xdelta = xend - xstart; + ydelta = yend - ystart; + + for (i = xstart; i < xend; i ++) + cmyk->channels[channel][i] = ystart + ydelta * (i - xstart) / xdelta; + } + + /* + * Initialize any trailing values to the maximum of the last data point... + */ + + for (i = xend; i < 256; i ++) + cmyk->channels[channel][i] = yend; + + fprintf(stderr, "DEBUG: cupsCMYKSetXY(cmyk, channel=%d, num_xypoints=%d, " + "xypoints=[%.3f %.3f %.3f %.3f ...])\n", channel, + num_xypoints, xypoints[0], xypoints[1], xypoints[2], xypoints[3]); + + for (i = 0; i < 256; i += 17) + fprintf(stderr, "DEBUG: %3d = %4d\n", i, + cmyk->channels[channel + 0][i]); +} + + +/* + * 'cupsCMYKSetGamma()' - Set a color transform curve using gamma and density. + */ + +void +cupsCMYKSetGamma(cups_cmyk_t *cmyk, /* I - CMYK color separation */ + int channel, /* I - Ink channel */ + float gamval, /* I - Gamma correction */ + float density) /* I - Maximum density */ +{ + int i; /* Looping var */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || channel < 0 || channel >= cmyk->num_channels || + gamval <= 0.0 || density <= 0.0 || density > 1.0) + return; + + /* + * Initialize the lookup table for the specified channel... + */ + + for (i = 0; i < 256; i ++) + cmyk->channels[channel][i] = (int)(density * CUPS_MAX_LUT * + pow((float)i / 255.0, gamval) + 0.5); + + fprintf(stderr, "DEBUG: cupsCMYKSetGamma(cmyk, channel=%d, gamval=%.3f, " + "density=%.3f)\n", channel, gamval, density); + + for (i = 0; i < 256; i += 17) + fprintf(stderr, "DEBUG: %3d = %4d\n", i, + cmyk->channels[channel + 0][i]); +} + + +/* + * 'cupsCMYKSetInkLimit()' - Set the limit on the amount of ink. + */ + +void +cupsCMYKSetInkLimit(cups_cmyk_t *cmyk, /* I - CMYK color separation */ + float limit) /* I - Limit of ink */ +{ + if (!cmyk || limit < 0.0) + return; + + cmyk->ink_limit = limit * CUPS_MAX_LUT; +} + + +/* + * 'cupsCMYKSetLtDk()' - Set light/dark ink transforms. + */ + +void +cupsCMYKSetLtDk(cups_cmyk_t *cmyk, /* I - CMYK color separation */ + int channel, /* I - Dark ink channel (+1 for light) */ + float light, /* I - Light ink only level */ + float dark) /* I - Dark ink only level */ +{ + int i, /* Looping var */ + delta, /* Difference between lower and upper */ + ilight, /* Light level from 0 to 255 */ + idark; /* Dark level from 0 to 255 */ + short lut[256]; /* Original LUT data */ + + + /* + * Range check input... + */ + + if (cmyk == NULL || light < 0.0 || light > 1.0 || dark < 0.0 || dark > 1.0 || + light > dark || channel < 0 || channel > (cmyk->num_channels - 2)) + return; + + /* + * Convert lower and upper to integers from 0 to 255... + */ + + ilight = (int)(255.0 * light + 0.5); + idark = (int)(255.0 * dark + 0.5); + delta = idark - ilight; + + /* + * Copy the dark ink LUT... + */ + + memcpy(lut, cmyk->channels[channel], sizeof(lut)); + + /* + * Generate the light-only data... + */ + + for (i = 0; i < ilight; i ++) + { + cmyk->channels[channel + 0][i] = 0; + cmyk->channels[channel + 1][i] = CUPS_MAX_LUT * i / ilight; + } + + /* + * Then the transition data... + */ + + for (; i < idark; i ++) + { + cmyk->channels[channel + 0][i] = CUPS_MAX_LUT * idark * (i - ilight) / + delta / 255; + cmyk->channels[channel + 1][i] = CUPS_MAX_LUT - CUPS_MAX_LUT * + (i - ilight) / delta; + } + + /* + * Then the K-only data... + */ + + for (; i < 256; i ++) + { + cmyk->channels[channel + 0][i] = CUPS_MAX_LUT * i / 255; + cmyk->channels[channel + 1][i] = 0; + } + + fprintf(stderr, "DEBUG: cupsCMYKSetLtDk(cmyk, channel=%d, light=%.3f, " + "dark=%.3f)\n", channel, light, dark); + + for (i = 0; i < 256; i += 17) + fprintf(stderr, "DEBUG: %3d = %4dlt + %4ddk\n", i, + cmyk->channels[channel + 0][i], cmyk->channels[channel + 1][i]); +} + + +/* + * End of "$Id: cmyk.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/driver/commandtoescpx.c b/driver/commandtoescpx.c new file mode 100644 index 0000000..ebd95b4 --- /dev/null +++ b/driver/commandtoescpx.c @@ -0,0 +1,245 @@ +/* + * "$Id: commandtoescpx.c 9793 2011-05-20 03:49:49Z mike $" + * + * Advanced EPSON ESC/P command filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * + * Contents: + * + * main() - Main entry and command processing. + */ + +/* + * Include necessary headers... + */ + +#include +#include "driver.h" +#include "data/escp.h" + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* Command file */ + char line[1024], /* Line from file */ + *lineptr; /* Pointer into line */ + int feedpage; /* Feed the page */ + ppd_file_t *ppd; /* PPD file */ + + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (1); + } + + /* + * Open the PPD file... + */ + + if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) + { + fputs("ERROR: Unable to open PPD file!\n", stderr); + return (1); + } + + /* + * Open the command file as needed... + */ + + if (argc == 7) + { + if ((fp = fopen(argv[6], "r")) == NULL) + { + perror("ERROR: Unable to open command file - "); + return (1); + } + } + else + fp = stdin; + + /* + * Some EPSON printers need an additional command issued at the + * beginning of each job to exit from USB "packet" mode... + */ + + if (ppd->model_number & ESCP_USB) + cupsWritePrintData("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); + + /* + * Reset the printer... + */ + + cupsWritePrintData("\033@", 2); + + /* + * Enter remote mode... + */ + + cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); + feedpage = 0; + + /* + * Read the commands from the file and send the appropriate commands... + */ + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Drop trailing newline... + */ + + lineptr = line + strlen(line) - 1; + if (*lineptr == '\n') + *lineptr = '\0'; + + /* + * Skip leading whitespace... + */ + + for (lineptr = line; isspace(*lineptr); lineptr ++); + + /* + * Skip comments and blank lines... + */ + + if (*lineptr == '#' || !*lineptr) + continue; + + /* + * Parse the command... + */ + + if (_cups_strncasecmp(lineptr, "Clean", 5) == 0) + { + /* + * Clean heads... + */ + + cupsWritePrintData("CH\002\000\000\000", 6); + } + else if (_cups_strncasecmp(lineptr, "PrintAlignmentPage", 18) == 0) + { + /* + * Print alignment page... + */ + + int phase; + + phase = atoi(lineptr + 18); + + cupsWritePrintData("DT\003\000\000", 5); + putchar(phase & 255); + putchar(phase >> 8); + feedpage = 1; + } + else if (_cups_strncasecmp(lineptr, "PrintSelfTestPage", 17) == 0) + { + /* + * Print version info and nozzle check... + */ + + cupsWritePrintData("VI\002\000\000\000", 6); + cupsWritePrintData("NC\002\000\000\000", 6); + feedpage = 1; + } + else if (_cups_strncasecmp(lineptr, "ReportLevels", 12) == 0) + { + /* + * Report ink levels... + */ + + cupsWritePrintData("IQ\001\000\001", 5); + } + else if (_cups_strncasecmp(lineptr, "SetAlignment", 12) == 0) + { + /* + * Set head alignment... + */ + + int phase, x; + + if (sscanf(lineptr + 12, "%d%d", &phase, &x) != 2) + { + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + continue; + } + + cupsWritePrintData("DA\004\000", 4); + putchar(0); + putchar(phase); + putchar(0); + putchar(x); + cupsWritePrintData("SV\000\000", 4); + } + else + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + } + + /* + * Exit remote mode... + */ + + cupsWritePrintData("\033\000\000\000", 4); + + /* + * Eject the page as needed... + */ + + if (feedpage) + { + fputs("PAGE: 1 1\n", stderr); + + putchar(13); + putchar(10); + putchar(12); + } + + /* + * Reset the printer... + */ + + cupsWritePrintData("\033@", 2); + + /* + * Close the command file and return... + */ + + ppdClose(ppd); + + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + * End of "$Id: commandtoescpx.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/driver/commandtopclx.c b/driver/commandtopclx.c new file mode 100644 index 0000000..4e3ec22 --- /dev/null +++ b/driver/commandtopclx.c @@ -0,0 +1,172 @@ +/* + * "$Id: commandtopclx.c 9793 2011-05-20 03:49:49Z mike $" + * + * Advanced PCL command filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * + * Contents: + * + * main() - Main entry and command processing. + */ + +/* + * Include necessary headers... + */ + +#include +#include "driver.h" +#include "data/pcl.h" + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* Command file */ + char line[1024], /* Line from file */ + *lineptr; /* Pointer into line */ + int feedpage; /* Feed the page */ + ppd_file_t *ppd; /* PPD file */ + + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (1); + } + + /* + * Open the PPD file... + */ + + if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) + { + fputs("ERROR: Unable to open PPD file!\n", stderr); + return (1); + } + + /* + * Open the command file as needed... + */ + + if (argc == 7) + { + if ((fp = fopen(argv[6], "r")) == NULL) + { + perror("ERROR: Unable to open command file - "); + return (1); + } + } + else + fp = stdin; + + /* + * Reset the printer... + */ + + cupsWritePrintData("\033E", 2); + + /* + * Read the commands from the file and send the appropriate commands... + */ + + feedpage = 0; + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Drop trailing newline... + */ + + lineptr = line + strlen(line) - 1; + if (*lineptr == '\n') + *lineptr = '\0'; + + /* + * Skip leading whitespace... + */ + + for (lineptr = line; isspace(*lineptr); lineptr ++); + + /* + * Skip comments and blank lines... + */ + + if (*lineptr == '#' || !*lineptr) + continue; + + /* + * Parse the command... + */ + + if (_cups_strncasecmp(lineptr, "Clean", 5) == 0 && + (ppd->model_number & PCL_INKJET)) + { + /* + * Clean heads... + */ + + cupsWritePrintData("\033&b16WPML \004\000\006\001\004\001\005\001" + "\001\004\001\144", 22); + } + else + fprintf(stderr, "ERROR: Invalid printer command \"%s\"!\n", lineptr); + } + + /* + * Eject the page as needed... + */ + + if (feedpage) + { + fputs("PAGE: 1 1\n", stderr); + + putchar(12); + } + + /* + * Reset the printer... + */ + + cupsWritePrintData("\033E", 2); + + /* + * Close the command file and return... + */ + + ppdClose(ppd); + + if (fp != stdin) + fclose(fp); + + return (0); +} + + +/* + * End of "$Id: commandtopclx.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/driver/dither.c b/driver/dither.c new file mode 100644 index 0000000..bebaaec --- /dev/null +++ b/driver/dither.c @@ -0,0 +1,306 @@ +/* + * "$Id: dither.c 8937 2009-12-18 23:50:23Z mike $" + * + * Dithering routines for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsDitherDelete() - Free a dithering buffer. + * cupsDitherLine() - Dither a line of pixels... + * cupsDitherNew() - Create a dithering buffer. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" +#include + + +/* + * 'cupsDitherDelete()' - Free a dithering buffer. + * + * Returns 0 on success, -1 on failure. + */ + +void +cupsDitherDelete(cups_dither_t *d) /* I - Dithering buffer */ +{ + if (d != NULL) + free(d); +} + + +/* + * 'cupsDitherLine()' - Dither a line of pixels... + */ + +void +cupsDitherLine(cups_dither_t *d, /* I - Dither data */ + const cups_lut_t *lut, /* I - Lookup table */ + const short *data, /* I - Separation data */ + int num_channels, + /* I - Number of components */ + unsigned char *p) /* O - Pixels */ +{ + register int x, /* Horizontal position in line... */ + pixel, /* Current adjusted pixel... */ + e, /* Current error */ + e0,e1,e2; /* Error values */ + register int errval0, /* First half of error value */ + errval1, /* Second half of error value */ + errbase, /* Base multiplier */ + errbase0, /* Base multiplier for large values */ + errbase1, /* Base multiplier for small values */ + errrange; /* Range of random multiplier */ + register int *p0, /* Error buffer pointers... */ + *p1; + static char logtable[16384]; /* Error magnitude for randomness */ + static char loginit = 0; /* Has the table been initialized? */ + + + if (!loginit) + { + /* + * Initialize a logarithmic table for the magnitude of randomness + * that is introduced. + */ + + loginit = 1; + + logtable[0] = 0; + for (x = 1; x < 2049; x ++) + logtable[x] = (int)(log(x / 16.0) / log(2.0) + 1.0); + for (; x < 16384; x ++) + logtable[x] = logtable[2049]; + } + + if (d->row == 0) + { + /* + * Dither from left to right: + * + * e0 == p0[0] + * e1 e2 == p1[-1] p1[0] + */ + + p0 = d->errors + 2; + p1 = d->errors + 2 + d->width + 4; + e0 = p0[0]; + e1 = 0; + e2 = 0; + + /* + * Error diffuse each output pixel... + */ + + for (x = d->width; + x > 0; + x --, p0 ++, p1 ++, p ++, data += num_channels) + { + /* + * Skip blank pixels... + */ + + if (*data == 0) + { + *p = 0; + e0 = p0[1]; + p1[-1] = e1; + e1 = e2; + e2 = 0; + continue; + } + + /* + * Compute the net pixel brightness and brightness error. Set a dot + * if necessary... + */ + + pixel = lut[*data].intensity + e0 / 128; + + if (pixel > CUPS_MAX_LUT) + pixel = CUPS_MAX_LUT; + else if (pixel < 0) + pixel = 0; + + *p = lut[pixel].pixel; + e = lut[pixel].error; + + /* + * Set the randomness factor... + */ + + if (e > 0) + errrange = logtable[e]; + else + errrange = logtable[-e]; + + errbase = 8 - errrange; + errrange = errrange * 2 + 1; + + /* + * Randomize the error value. + */ + + if (errrange > 1) + { + errbase0 = errbase + (CUPS_RAND() % errrange); + errbase1 = errbase + (CUPS_RAND() % errrange); + } + else + errbase0 = errbase1 = errbase; + + /* + * X 7/16 = X e0 + * 3/16 5/16 1/16 = e1 e2 + */ + + errval0 = errbase0 * e; + errval1 = (16 - errbase0) * e; + e0 = p0[1] + 7 * errval0; + e1 = e2 + 5 * errval1; + + errval0 = errbase1 * e; + errval1 = (16 - errbase1) * e; + e2 = errval0; + p1[-1] = e1 + 3 * errval1; + } + } + else + { + /* + * Dither from right to left: + * + * e0 == p0[0] + * e2 e1 == p1[0] p1[1] + */ + + p0 = d->errors + d->width + 1 + d->width + 4; + p1 = d->errors + d->width + 1; + p += d->width - 1; + data += num_channels * (d->width - 1); + e0 = p0[0]; + e1 = 0; + e2 = 0; + + /* + * Error diffuse each output pixel... + */ + + for (x = d->width; + x > 0; + x --, p0 --, p1 --, p --, data -= num_channels) + { + /* + * Skip blank pixels... + */ + + if (*data == 0) + { + *p = 0; + e0 = p0[-1]; + p1[1] = e1; + e1 = e2; + e2 = 0; + continue; + } + + /* + * Compute the net pixel brightness and brightness error. Set a dot + * if necessary... + */ + + pixel = lut[*data].intensity + e0 / 128; + + if (pixel > CUPS_MAX_LUT) + pixel = CUPS_MAX_LUT; + else if (pixel < 0) + pixel = 0; + + *p = lut[pixel].pixel; + e = lut[pixel].error; + + /* + * Set the randomness factor... + */ + + if (e > 0) + errrange = logtable[e]; + else + errrange = logtable[-e]; + + errbase = 8 - errrange; + errrange = errrange * 2 + 1; + + /* + * Randomize the error value. + */ + + if (errrange > 1) + { + errbase0 = errbase + (CUPS_RAND() % errrange); + errbase1 = errbase + (CUPS_RAND() % errrange); + } + else + errbase0 = errbase1 = errbase; + + /* + * X 7/16 = X e0 + * 3/16 5/16 1/16 = e1 e2 + */ + + errval0 = errbase0 * e; + errval1 = (16 - errbase0) * e; + e0 = p0[-1] + 7 * errval0; + e1 = e2 + 5 * errval1; + + errval0 = errbase1 * e; + errval1 = (16 - errbase1) * e; + e2 = errval0; + p1[1] = e1 + 3 * errval1; + } + } + + /* + * Update to the next row... + */ + + d->row = 1 - d->row; +} + + +/* + * 'cupsDitherNew()' - Create an error-diffusion dithering buffer. + */ + +cups_dither_t * /* O - New state array */ +cupsDitherNew(int width) /* I - Width of output in pixels */ +{ + cups_dither_t *d; /* New dithering buffer */ + + + if ((d = (cups_dither_t *)calloc(1, sizeof(cups_dither_t) + + 2 * (width + 4) * + sizeof(int))) == NULL) + return (NULL); + + d->width = width; + + return (d); +} + + +/* + * End of "$Id: dither.c 8937 2009-12-18 23:50:23Z mike $". + */ diff --git a/driver/driver.h b/driver/driver.h new file mode 100644 index 0000000..8cff244 --- /dev/null +++ b/driver/driver.h @@ -0,0 +1,249 @@ +/* + * "$Id: driver.h 7306 2008-02-15 00:52:38Z mike $" + * + * Printer driver utilities header file for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_DRIVER_H_ +# define _CUPS_DRIVER_H_ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include + +# if defined(WIN32) || defined(__EMX__) +# include +# else +# include +# include +# endif /* WIN32 || __EMX__ */ + +# include +# include + + +/* + * Common macros... + */ + +# ifndef min +# define min(a,b) ((a) < (b) ? (a) : (b)) +# define max(a,b) ((a) > (b) ? (a) : (b)) +# endif /* !min */ + + +/* + * Constants... + */ + +#define CUPS_MAX_CHAN 15 /* Maximum number of color components */ +#define CUPS_MAX_LUT 4095 /* Maximum LUT value */ +#define CUPS_MAX_RGB 4 /* Maximum number of sRGB components */ + + +/* + * Types/structures for the various routines. + */ + +typedef struct cups_lut_s /**** Lookup Table for Dithering ****/ +{ + short intensity; /* Adjusted intensity */ + short pixel; /* Output pixel value */ + int error; /* Error from desired value */ +} cups_lut_t; + +typedef struct cups_dither_s /**** Dithering State ****/ +{ + int width; /* Width of buffer */ + int row; /* Current row */ + int errors[96]; /* Error values */ +} cups_dither_t; + +typedef struct cups_sample_s /**** Color sample point ****/ +{ + unsigned char rgb[3]; /* sRGB values */ + unsigned char colors[CUPS_MAX_RGB]; /* Color values */ +} cups_sample_t; + +typedef struct cups_rgb_s /**** Color separation lookup table ****/ +{ + int cube_size; /* Size of color cube (2-N) on a side */ + int num_channels; /* Number of colors per sample */ + unsigned char ****colors; /* 4-D array of sample values */ + int cube_index[256]; /* Index into cube for a given sRGB value */ + int cube_mult[256]; /* Multiplier value for a given sRGB value */ + int cache_init; /* Are cached values initialized? */ + unsigned char black[CUPS_MAX_RGB]; /* Cached black (sRGB = 0,0,0) */ + unsigned char white[CUPS_MAX_RGB]; /* Cached white (sRGB = 255,255,255) */ +} cups_rgb_t; + +typedef struct cups_cmyk_s /**** Simple CMYK lookup table ****/ +{ + unsigned char black_lut[256]; /* Black generation LUT */ + unsigned char color_lut[256]; /* Color removal LUT */ + int ink_limit; /* Ink limit */ + int num_channels; /* Number of components */ + short *channels[CUPS_MAX_CHAN]; + /* Lookup tables */ +} cups_cmyk_t; + + +/* + * Globals... + */ + +extern const unsigned char + cups_srgb_lut[256]; + /* sRGB gamma lookup table */ +extern const unsigned char + cups_scmy_lut[256]; + /* sRGB gamma lookup table (inverted) */ + + +/* + * Prototypes... + */ + +/* + * Attribute function... + */ + +extern ppd_attr_t *cupsFindAttr(ppd_file_t *ppd, const char *name, + const char *colormodel, + const char *media, + const char *resolution, + char *spec, int specsize); + +/* + * Byte checking functions... + */ + +extern int cupsCheckBytes(const unsigned char *, int); +extern int cupsCheckValue(const unsigned char *, int, + const unsigned char); + +/* + * Dithering functions... + */ + +extern void cupsDitherLine(cups_dither_t *d, const cups_lut_t *lut, + const short *data, int num_channels, + unsigned char *p); +extern cups_dither_t *cupsDitherNew(int width); +extern void cupsDitherDelete(cups_dither_t *); + +/* + * Lookup table functions for dithering... + */ + +extern cups_lut_t *cupsLutNew(int num_vals, const float *vals); +extern void cupsLutDelete(cups_lut_t *lut); +extern cups_lut_t *cupsLutLoad(ppd_file_t *ppd, + const char *colormodel, + const char *media, + const char *resolution, + const char *ink); + + +/* + * Bit packing functions... + */ + +extern void cupsPackHorizontal(const unsigned char *, + unsigned char *, int, + const unsigned char, const int); +extern void cupsPackHorizontal2(const unsigned char *, + unsigned char *, int, const int); +extern void cupsPackHorizontalBit(const unsigned char *, + unsigned char *, int, + const unsigned char, + const unsigned char); +extern void cupsPackVertical(const unsigned char *, unsigned char *, + int, const unsigned char, const int); + +/* + * Color separation functions... + */ + +extern void cupsRGBDelete(cups_rgb_t *rgb); +extern void cupsRGBDoGray(cups_rgb_t *rgb, + const unsigned char *input, + unsigned char *output, int num_pixels); +extern void cupsRGBDoRGB(cups_rgb_t *rgb, + const unsigned char *input, + unsigned char *output, int num_pixels); +extern cups_rgb_t *cupsRGBLoad(ppd_file_t *ppd, + const char *colormodel, + const char *media, + const char *resolution); +extern cups_rgb_t *cupsRGBNew(int num_samples, cups_sample_t *samples, + int cube_size, int num_channels); + +/* + * CMYK separation functions... + */ + +extern cups_cmyk_t *cupsCMYKNew(int num_channels); +extern void cupsCMYKDelete(cups_cmyk_t *cmyk); +extern void cupsCMYKDoBlack(const cups_cmyk_t *cmyk, + const unsigned char *input, + short *output, int num_pixels); +extern void cupsCMYKDoCMYK(const cups_cmyk_t *cmyk, + const unsigned char *input, + short *output, int num_pixels); +extern void cupsCMYKDoGray(const cups_cmyk_t *cmyk, + const unsigned char *input, + short *output, int num_pixels); +extern void cupsCMYKDoRGB(const cups_cmyk_t *cmyk, + const unsigned char *input, + short *output, int num_pixels); +extern cups_cmyk_t *cupsCMYKLoad(ppd_file_t *ppd, + const char *colormodel, + const char *media, + const char *resolution); +extern void cupsCMYKSetBlack(cups_cmyk_t *cmyk, + float lower, float upper); +extern void cupsCMYKSetCurve(cups_cmyk_t *cmyk, int channel, + int num_xypoints, + const float *xypoints); +extern void cupsCMYKSetGamma(cups_cmyk_t *cmyk, int channel, + float gamval, float density); +extern void cupsCMYKSetInkLimit(cups_cmyk_t *cmyk, float limit); +extern void cupsCMYKSetLtDk(cups_cmyk_t *cmyk, int channel, + float light, float dark); + + +/* + * Convenience macro for writing print data... + */ + +# define cupsWritePrintData(s,n) fwrite((s), 1, (n), stdout) + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_DRIVER_H_ */ + +/* + * End of "$Id: driver.h 7306 2008-02-15 00:52:38Z mike $". + */ + diff --git a/driver/image.pgm b/driver/image.pgm new file mode 100644 index 0000000000000000000000000000000000000000..c0b7a22f7feb992bb441fb93b9a88a7da6341857 GIT binary patch literal 152380 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 literal 0 HcmV?d00001 diff --git a/driver/image.ppm b/driver/image.ppm new file mode 100644 index 0000000000000000000000000000000000000000..3823fe48b0ef0e6342cd8c3c13e7bb1d26e79ff1 GIT binary patch literal 457020 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 <&v~q0P!@g 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 z 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%0A{^-uxIny_` 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 QPTKBKqklWS`04il0o%0>5&!@I literal 0 HcmV?d00001 diff --git a/driver/libcupsdriver.exp b/driver/libcupsdriver.exp new file mode 100644 index 0000000..fff6506 --- /dev/null +++ b/driver/libcupsdriver.exp @@ -0,0 +1,30 @@ +_cupsCMYKDelete +_cupsCMYKDoBlack +_cupsCMYKDoCMYK +_cupsCMYKDoGray +_cupsCMYKDoRGB +_cupsCMYKLoad +_cupsCMYKNew +_cupsCMYKSetBlack +_cupsCMYKSetCurve +_cupsCMYKSetGamma +_cupsCMYKSetInkLimit +_cupsCMYKSetLtDk +_cupsCheckBytes +_cupsCheckValue +_cupsDitherDelete +_cupsDitherLine +_cupsDitherNew +_cupsFindAttr +_cupsLutDelete +_cupsLutLoad +_cupsLutNew +_cupsPackHorizontal +_cupsPackHorizontal2 +_cupsPackHorizontalBit +_cupsPackVertical +_cupsRGBDelete +_cupsRGBDoGray +_cupsRGBDoRGB +_cupsRGBLoad +_cupsRGBNew diff --git a/driver/lut.c b/driver/lut.c new file mode 100644 index 0000000..76684ca --- /dev/null +++ b/driver/lut.c @@ -0,0 +1,202 @@ +/* + * "$Id: lut.c 7306 2008-02-15 00:52:38Z mike $" + * + * Lookup table routines for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsLutDelete() - Free the memory used by a lookup table. + * cupsLutLoad() - Load a LUT from a PPD file. + * cupsLutNew() - Make a lookup table from a list of pixel values. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" +#include + + +/* + * 'cupsLutDelete()' - Free the memory used by a lookup table. + */ + +void +cupsLutDelete(cups_lut_t *lut) /* I - Lookup table to free */ +{ + if (lut != NULL) + free(lut); +} + + +/* + * 'cupsLutLoad()' - Load a LUT from a PPD file. + */ + +cups_lut_t * /* O - New lookup table */ +cupsLutLoad(ppd_file_t *ppd, /* I - PPD file */ + const char *colormodel, /* I - Color model */ + const char *media, /* I - Media type */ + const char *resolution, /* I - Resolution */ + const char *ink) /* I - Ink name */ +{ + char name[PPD_MAX_NAME], /* Attribute name */ + spec[PPD_MAX_NAME]; /* Attribute spec */ + ppd_attr_t *attr; /* Attribute */ + int nvals; /* Number of values */ + float vals[4]; /* Values */ + + + /* + * Range check input... + */ + + if (!ppd || !colormodel || !media || !resolution || !ink) + return (NULL); + + /* + * Try to find the LUT values... + */ + + snprintf(name, sizeof(name), "cups%sDither", ink); + + if ((attr = cupsFindAttr(ppd, name, colormodel, media, resolution, spec, + sizeof(spec))) == NULL) + attr = cupsFindAttr(ppd, "cupsAllDither", colormodel, media, + resolution, spec, sizeof(spec)); + + if (!attr) + return (NULL); + + vals[0] = 0.0; + vals[1] = 0.0; + vals[2] = 0.0; + vals[3] = 0.0; + nvals = sscanf(attr->value, "%f%f%f", vals + 1, vals + 2, vals + 3) + 1; + + fprintf(stderr, "DEBUG: Loaded LUT %s from PPD with values [%.3f %.3f %.3f %.3f]\n", + name, vals[0], vals[1], vals[2], vals[3]); + + return (cupsLutNew(nvals, vals)); +} + + +/* + * 'cupsLutNew()' - Make a lookup table from a list of pixel values. + * + * Returns a pointer to the lookup table on success, NULL on failure. + */ + +cups_lut_t * /* O - New lookup table */ +cupsLutNew(int num_values, /* I - Number of values */ + const float *values) /* I - Lookup table values */ +{ + int pixel; /* Pixel value */ + cups_lut_t *lut; /* Lookup table */ + int start, /* Start value */ + end, /* End value */ + maxval; /* Maximum value */ + + + /* + * Range check... + */ + + if (!num_values || !values) + return (NULL); + + /* + * Allocate memory for the lookup table... + */ + + if ((lut = (cups_lut_t *)calloc((CUPS_MAX_LUT + 1), + sizeof(cups_lut_t))) == NULL) + return (NULL); + + /* + * Generate the dither lookup table. The pixel values are roughly + * defined by a piecewise linear curve that has an intensity value + * at each output pixel. This isn't perfectly accurate, but it's + * close enough for jazz. + */ + + maxval = CUPS_MAX_LUT / values[num_values - 1]; + + for (start = 0; start <= CUPS_MAX_LUT; start ++) + lut[start].intensity = start * maxval / CUPS_MAX_LUT; + + for (pixel = 0; pixel < num_values; pixel ++) + { + /* + * Select start and end values for this pixel... + */ + + if (pixel == 0) + start = 0; + else + start = (int)(0.5 * maxval * (values[pixel - 1] + + values[pixel])) + 1; + + if (start < 0) + start = 0; + else if (start > CUPS_MAX_LUT) + start = CUPS_MAX_LUT; + + if (pixel == (num_values - 1)) + end = CUPS_MAX_LUT; + else + end = (int)(0.5 * maxval * (values[pixel] + values[pixel + 1])); + + if (end < 0) + end = 0; + else if (end > CUPS_MAX_LUT) + end = CUPS_MAX_LUT; + + if (start == end) + break; + + /* + * Generate lookup values and errors for each pixel. + */ + + while (start <= end) + { + lut[start].pixel = pixel; + if (start == 0) + lut[0].error = 0; + else + lut[start].error = start - maxval * values[pixel]; + + start ++; + } + } + + /* + * Show the lookup table... + */ + + for (start = 0; start <= CUPS_MAX_LUT; start += CUPS_MAX_LUT / 15) + fprintf(stderr, "DEBUG: %d = %d/%d/%d\n", start, lut[start].intensity, + lut[start].pixel, lut[start].error); + + /* + * Return the lookup table... + */ + + return (lut); +} + + +/* + * End of "$Id: lut.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/pack.c b/driver/pack.c new file mode 100644 index 0000000..db9e5de --- /dev/null +++ b/driver/pack.c @@ -0,0 +1,307 @@ +/* + * "$Id: pack.c 7306 2008-02-15 00:52:38Z mike $" + * + * Bit packing routines for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsPackHorizontal() - Pack pixels horizontally... + * cupsPackHorizontal2() - Pack 2-bit pixels horizontally... + * cupsPackHorizontalBit() - Pack pixels horizontally by bit... + * cupsPackVertical() - Pack pixels vertically... + */ + +/* + * Include necessary headers... + */ + +#include "driver.h" + + +/* + * 'cupsPackHorizontal()' - Pack pixels horizontally... + */ + +void +cupsPackHorizontal(const unsigned char *ipixels,/* I - Input pixels */ + unsigned char *obytes, /* O - Output bytes */ + int width, /* I - Number of pixels */ + const unsigned char clearto, /* I - Initial value of bytes */ + const int step) /* I - Step value between pixels */ +{ + register unsigned char b; /* Current byte */ + + + /* + * Do whole bytes first... + */ + + while (width > 7) + { + b = clearto; + + if (*ipixels) + b ^= 0x80; + ipixels += step; + if (*ipixels) + b ^= 0x40; + ipixels += step; + if (*ipixels) + b ^= 0x20; + ipixels += step; + if (*ipixels) + b ^= 0x10; + ipixels += step; + if (*ipixels) + b ^= 0x08; + ipixels += step; + if (*ipixels) + b ^= 0x04; + ipixels += step; + if (*ipixels) + b ^= 0x02; + ipixels += step; + if (*ipixels) + b ^= 0x01; + ipixels += step; + + *obytes++ = b; + + width -= 8; + } + + /* + * Then do the last N bytes (N < 8)... + */ + + b = clearto; + + switch (width) + { + case 7 : + if (ipixels[6 * step]) + b ^= 0x02; + case 6 : + if (ipixels[5 * step]) + b ^= 0x04; + case 5 : + if (ipixels[4 * step]) + b ^= 0x08; + case 4 : + if (ipixels[3 * step]) + b ^= 0x10; + case 3 : + if (ipixels[2 * step]) + b ^= 0x20; + case 2 : + if (ipixels[1 * step]) + b ^= 0x40; + case 1 : + if (ipixels[0]) + b ^= 0x80; + *obytes = b; + break; + } +} + + +/* + * 'cupsPackHorizontal2()' - Pack 2-bit pixels horizontally... + */ + +void +cupsPackHorizontal2(const unsigned char *ipixels, /* I - Input pixels */ + unsigned char *obytes, /* O - Output bytes */ + int width, /* I - Number of pixels */ + const int step) /* I - Stepping value */ +{ + register unsigned char b; /* Current byte */ + + + /* + * Do whole bytes first... + */ + + while (width > 3) + { + b = *ipixels; + ipixels += step; + b = (b << 2) | *ipixels; + ipixels += step; + b = (b << 2) | *ipixels; + ipixels += step; + b = (b << 2) | *ipixels; + ipixels += step; + + *obytes++ = b; + + width -= 4; + } + + /* + * Then do the last N bytes (N < 4)... + */ + + b = 0; + + switch (width) + { + case 3 : + b = ipixels[2 * step]; + case 2 : + b = (b << 2) | ipixels[step]; + case 1 : + b = (b << 2) | ipixels[0]; + *obytes = b << (8 - 2 * width); + break; + } +} + + +/* + * 'cupsPackHorizontalBit()' - Pack pixels horizontally by bit... + */ + +void +cupsPackHorizontalBit(const unsigned char *ipixels, /* I - Input pixels */ + unsigned char *obytes, /* O - Output bytes */ + int width, /* I - Number of pixels */ + const unsigned char clearto, /* I - Initial value of bytes */ + const unsigned char bit) /* I - Bit to check */ +{ + register unsigned char b; /* Current byte */ + + + /* + * Do whole bytes first... + */ + + while (width > 7) + { + b = clearto; + + if (*ipixels++ & bit) + b ^= 0x80; + if (*ipixels++ & bit) + b ^= 0x40; + if (*ipixels++ & bit) + b ^= 0x20; + if (*ipixels++ & bit) + b ^= 0x10; + if (*ipixels++ & bit) + b ^= 0x08; + if (*ipixels++ & bit) + b ^= 0x04; + if (*ipixels++ & bit) + b ^= 0x02; + if (*ipixels++ & bit) + b ^= 0x01; + + *obytes++ = b; + + width -= 8; + } + + /* + * Then do the last N bytes (N < 8)... + */ + + b = clearto; + + switch (width) + { + case 7 : + if (ipixels[6] & bit) + b ^= 0x02; + case 6 : + if (ipixels[5] & bit) + b ^= 0x04; + case 5 : + if (ipixels[4] & bit) + b ^= 0x08; + case 4 : + if (ipixels[3] & bit) + b ^= 0x10; + case 3 : + if (ipixels[2] & bit) + b ^= 0x20; + case 2 : + if (ipixels[1] & bit) + b ^= 0x40; + case 1 : + if (ipixels[0] & bit) + b ^= 0x80; + *obytes = b; + break; + } +} + + +/* + * 'cupsPackVertical()' - Pack pixels vertically... + */ + +void +cupsPackVertical(const unsigned char *ipixels, /* I - Input pixels */ + unsigned char *obytes, /* O - Output bytes */ + int width, /* I - Number of input pixels */ + const unsigned char bit, /* I - Output bit */ + const int step) /* I - Number of bytes between columns */ +{ + /* + * Loop through the entire array... + */ + + while (width > 7) + { + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + if (*ipixels++) + *obytes ^= bit; + obytes += step; + + width -= 8; + } + + while (width > 0) + { + if (*ipixels++) + *obytes ^= bit; + + obytes += step; + width --; + } +} + + +/* + * End of "$Id: pack.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/pcl-common.c b/driver/pcl-common.c new file mode 100644 index 0000000..f5aa244 --- /dev/null +++ b/driver/pcl-common.c @@ -0,0 +1,272 @@ +/* + * "$Id: pcl-common.c 7306 2008-02-15 00:52:38Z mike $" + * + * Common PCL functions for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * pcl_set_media_size() - Set media size using the page size command. + * pjl_write() - Write a PJL command string, performing + * substitutions as needed. + */ + +/* + * Include necessary headers... + */ + +#include "driver.h" +#include "pcl-common.h" +#include + + +/* + * 'pcl_set_media_size()' - Set media size using the page size command. + */ + +void +pcl_set_media_size(ppd_file_t *ppd, /* I - PPD file */ + float width, /* I - Width of page */ + float length) /* I - Length of page */ +{ + (void)width; + + printf("\033&l0O"); /* Set portrait orientation */ + + if (ppd->model_number & PCL_PAPER_SIZE) + switch ((int)(length + 0.5f)) + { + case 419 : /* Postcard */ + printf("\033&l71A"); /* Set page size */ + break; + + case 540 : /* Monarch Envelope */ + printf("\033&l80A"); /* Set page size */ + break; + + case 567 : /* Double Postcard */ + printf("\033&l72A"); /* Set page size */ + break; + + case 595 : /* A5 */ + printf("\033&l25A"); /* Set page size */ + break; + + case 612 : /* Statement */ + printf("\033&l5A"); /* Set page size */ + break; + + case 624 : /* DL Envelope */ + printf("\033&l90A"); /* Set page size */ + break; + + case 649 : /* C5 Envelope */ + printf("\033&l91A"); /* Set page size */ + break; + + case 684 : /* COM-10 Envelope */ + printf("\033&l81A"); /* Set page size */ + break; + + case 709 : /* B5 Envelope */ + printf("\033&l100A"); /* Set page size */ + break; + + case 729 : /* B5 */ + printf("\033&l45A"); /* Set page size */ + break; + + case 756 : /* Executive */ + printf("\033&l1A"); /* Set page size */ + break; + + case 792 : /* Letter */ + printf("\033&l2A"); /* Set page size */ + break; + + case 842 : /* A4 */ + printf("\033&l26A"); /* Set page size */ + break; + + case 936 : /* Foolscap */ + printf("\033&l23A"); /* Set page size */ + break; + + case 1008 : /* Legal */ + printf("\033&l3A"); /* Set page size */ + break; + + case 1032 : /* B4 */ + printf("\033&l46A"); /* Set page size */ + break; + + case 1191 : /* A3 */ + printf("\033&l27A"); /* Set page size */ + break; + + case 1224 : /* Tabloid */ + printf("\033&l6A"); /* Set page size */ + break; + + default : + printf("\033&l101A"); /* Set page size */ + printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ + printf("\033&l%.2fP", length / 12.0); + /* Set page length */ + printf("\033&l%.0fF", length / 12.0); + /* Set text length to page */ + break; + } + else + { + printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ + printf("\033&l%.2fP", length / 12.0); + /* Set page length */ + printf("\033&l%.0fF", length / 12.0); + /* Set text length to page */ + } + + printf("\033&l0L"); /* Turn off perforation skip */ + printf("\033&l0E"); /* Reset top margin to 0 */ +} + + +/* + * 'pjl_write()' - Write a PJL command string, performing substitutions as needed. + */ + +void +pjl_write(ppd_file_t *ppd, /* I - PPD file */ + const char *format, /* I - Format string */ + const char *value, /* I - Value for %s */ + int job_id, /* I - Job ID */ + const char *user, /* I - Username */ + const char *title, /* I - Title */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + const char *optval; /* Option value */ + char match[255], /* Match string */ + *mptr; /* Pointer into match string */ + + + if (!format) + return; + + while (*format) + { + if (*format == '%') + { + /* + * Perform substitution... + */ + + format ++; + switch (*format) + { + case 'b' : /* job-billing */ + if ((optval = cupsGetOption("job-billing", num_options, + options)) != NULL) + fputs(optval, stdout); + break; + + case 'h' : /* job-originating-host-name */ + if ((optval = cupsGetOption("job-originating-host-name", + num_options, options)) != NULL) + fputs(optval, stdout); + break; + + case 'j' : /* job-id */ + printf("%d", job_id); + break; + + case 'n' : /* CR + LF */ + putchar('\r'); + putchar('\n'); + break; + + case 'q' : /* double quote (") */ + putchar('\"'); + break; + + case 's' : /* "value" */ + if (value) + fputs(value, stdout); + break; + + case 't' : /* job-name */ + fputs(title, stdout); + break; + + case 'u' : /* job-originating-user-name */ + fputs(user, stdout); + break; + + case '?' : /* ?value:string; */ + /* + * Get the match value... + */ + + for (format ++, mptr = match; *format && *format != ':'; format ++) + if (mptr < (match + sizeof(match) - 1)) + *mptr++ = *format; + + if (!*format) + return; + + /* + * See if we have a match... + */ + + format ++; + *mptr = '\0'; + + if (!value || strcmp(match, value)) + { + /* + * Value doesn't match; skip the string that follows... + */ + + while (*format && *format != ';') + format ++; + } + else + { + /* + * Value matches; copy the string that follows... + */ + + while (*format && *format != ';') + putchar(*format++); + } + + if (!*format) + return; + break; + + default : /* Anything else */ + putchar('%'); + case '%' : /* %% = single % */ + putchar(*format); + break; + } + } + else + putchar(*format); + + format ++; + } +} + + +/* + * End of "$Id: pcl-common.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/pcl-common.h b/driver/pcl-common.h new file mode 100644 index 0000000..0b34950 --- /dev/null +++ b/driver/pcl-common.h @@ -0,0 +1,71 @@ +/* + * "$Id: pcl-common.h 9042 2010-03-24 00:45:34Z mike $" + * + * Common HP-PCL definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products, All Rights Reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Include necessary headers... + */ + +#include +#include "data/pcl.h" + + +/* + * Functions/macros... + */ + +#define pcl_reset()\ + printf("\033E") +#define pcl_set_copies(copies)\ + printf("\033&l%dX", (copies)) +#define pcl_set_pcl_mode(m)\ + printf("\033%%%dA", (m)) +#define pcl_set_hpgl_mode(m)\ + printf("\033%%%dB", (m)) +#define pcl_set_negative_motion()\ + printf("\033&a1N") +#define pcl_set_media_source(source)\ + printf("\033&l%dH", source) +#define pcl_set_media_type(type)\ + printf("\033&l%dM", type) +#define pcl_set_duplex(duplex,landscape)\ + if (duplex) printf("\033&l%dS", (duplex) + (landscape)) +#define pcl_set_simple_black()\ + printf("\033*r-1U") +#define pcl_set_simple_color()\ + printf("\033*r3U") +#define pcl_set_simple_cmy()\ + printf("\033*r-3U") +#define pcl_set_simple_kcmy()\ + printf("\033*r-4U") +#define pcl_set_simple_resolution(r)\ + printf("\033*t%dR", (r)) + +#define pjl_escape()\ + printf("\033%%-12345X@PJL\r\n") +#define pjl_set_job(job_id,user,title)\ + printf("@PJL JOB NAME = \"%s\" DISPLAY = \"%d %s %s\"\r\n", \ + (title), (job_id), (user), (title)) +#define pjl_enter_language(lang)\ + printf("@PJL ENTER LANGUAGE=%s\r\n", (lang)) + +extern void pcl_set_media_size(ppd_file_t *ppd, float width, float length); +extern void pjl_write(ppd_file_t *ppd, const char *format, + const char *value, int job_id, + const char *user, const char *title, + int num_options, cups_option_t *options); + +/* + * End of "$Id: pcl-common.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/driver/rastertoescpx.c b/driver/rastertoescpx.c new file mode 100644 index 0000000..6e4dd4e --- /dev/null +++ b/driver/rastertoescpx.c @@ -0,0 +1,1931 @@ +/* + * "$Id: rastertoescpx.c 9382 2010-11-20 01:03:46Z mike $" + * + * Advanced EPSON ESC/P raster driver for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * Setup() - Prepare the printer for graphics output. + * StartPage() - Start a page of graphics. + * EndPage() - Finish a page of graphics. + * Shutdown() - Shutdown a printer. + * CancelJob() - Cancel the current job... + * CompressData() - Compress a line of graphics. + * OutputBand() - Output a band of graphics. + * ProcessLine() - Read graphics from the page stream and output + * as needed. + * main() - Main entry and processing of driver. + */ + +/* + * Include necessary headers... + */ + +#include "driver.h" +#include +#include +#include "data/escp.h" +#include + + +/* + * Softweave data... + */ + +typedef struct cups_weave_str +{ + struct cups_weave_str *prev, /* Previous band */ + *next; /* Next band */ + int x, y, /* Column/Line on the page */ + plane, /* Color plane */ + dirty, /* Is this buffer dirty? */ + row, /* Row in the buffer */ + count; /* Max rows this pass */ + unsigned char *buffer; /* Data buffer */ +} cups_weave_t; + + +/* + * Globals... + */ + +cups_rgb_t *RGB; /* RGB color separation data */ +cups_cmyk_t *CMYK; /* CMYK color separation data */ +unsigned char *PixelBuffer, /* Pixel buffer */ + *CMYKBuffer, /* CMYK buffer */ + *OutputBuffers[7], /* Output buffers */ + *DotBuffers[7], /* Dot buffers */ + *CompBuffer; /* Compression buffer */ +short *InputBuffer; /* Color separation buffer */ +cups_weave_t *DotAvailList, /* Available buffers */ + *DotUsedList, /* Used buffers */ + *DotBands[128][7]; /* Buffers in use */ +int DotBufferSize, /* Size of dot buffers */ + DotRowMax, /* Maximum row number in buffer */ + DotColStep, /* Step for each output column */ + DotRowStep, /* Step for each output line */ + DotRowFeed, /* Amount to feed for interleave */ + DotRowCount, /* Number of rows to output */ + DotRowOffset[7], /* Offset for each color on print head */ + DotRowCurrent, /* Current row */ + DotSize; /* Dot size (Pro 5000 only) */ +int PrinterPlanes, /* # of color planes */ + BitPlanes, /* # of bit planes per color */ + PrinterTop, /* Top of page */ + PrinterLength; /* Length of page */ +cups_lut_t *DitherLuts[7]; /* Lookup tables for dithering */ +cups_dither_t *DitherStates[7]; /* Dither state tables */ +int OutputFeed; /* Number of lines to skip */ +int Canceled; /* Is the job canceled? */ + + +/* + * Prototypes... + */ + +void Setup(ppd_file_t *); +void StartPage(ppd_file_t *, cups_page_header2_t *); +void EndPage(ppd_file_t *, cups_page_header2_t *); +void Shutdown(ppd_file_t *); + +void AddBand(cups_weave_t *band); +void CancelJob(int sig); +void CompressData(ppd_file_t *, const unsigned char *, const int, + int, int, const int, const int, const int, + const int); +void OutputBand(ppd_file_t *, cups_page_header2_t *, + cups_weave_t *band); +void ProcessLine(ppd_file_t *, cups_raster_t *, + cups_page_header2_t *, const int y); + + +/* + * 'Setup()' - Prepare a printer for graphics output. + */ + +void +Setup(ppd_file_t *ppd) /* I - PPD file */ +{ + /* + * Some EPSON printers need an additional command issued at the + * beginning of each job to exit from USB "packet" mode... + */ + + if (ppd->model_number & ESCP_USB) + cupsWritePrintData("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); +} + + +/* + * 'StartPage()' - Start a page of graphics. + */ + +void +StartPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int i, y; /* Looping vars */ + int subrow, /* Current subrow */ + modrow, /* Subrow modulus */ + plane; /* Current color plane */ + unsigned char *ptr; /* Pointer into dot buffer */ + int bands; /* Number of bands to allocate */ + int units; /* Units for resolution */ + cups_weave_t *band; /* Current band */ + const char *colormodel; /* Color model string */ + char resolution[PPD_MAX_NAME], + /* Resolution string */ + spec[PPD_MAX_NAME]; /* PPD attribute name */ + ppd_attr_t *attr; /* Attribute from PPD file */ + const float default_lut[2] = /* Default dithering lookup table */ + { + 0.0, + 1.0 + }; + + + fprintf(stderr, "DEBUG: StartPage...\n"); + fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); + fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); + fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); + fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); + + fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); + fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); + fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); + fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); + fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); + fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], + header->HWResolution[1]); + fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", + header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], + header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); + fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); + fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); + fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); + fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], + header->Margins[1]); + fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); + fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); + fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); + fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); + fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); + fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); + fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); + fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); + fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], + header->PageSize[1]); + fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); + fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); + fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); + fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); + fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); + fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); + fprintf(stderr, "DEBUG: cupsRowCount = %d\n", header->cupsRowCount); + fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed); + fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep); + + /* + * Figure out the color model and spec strings... + */ + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_K : + colormodel = "Black"; + break; + case CUPS_CSPACE_W : + colormodel = "Gray"; + break; + default : + case CUPS_CSPACE_RGB : + colormodel = "RGB"; + break; + case CUPS_CSPACE_CMYK : + colormodel = "CMYK"; + break; + } + + if (header->HWResolution[0] != header->HWResolution[1]) + snprintf(resolution, sizeof(resolution), "%dx%ddpi", + header->HWResolution[0], header->HWResolution[1]); + else + snprintf(resolution, sizeof(resolution), "%ddpi", + header->HWResolution[0]); + + if (!header->MediaType[0]) + strcpy(header->MediaType, "Plain"); + + /* + * Load the appropriate color profiles... + */ + + RGB = NULL; + CMYK = NULL; + + fputs("DEBUG: Attempting to load color profiles using the following values:\n", stderr); + fprintf(stderr, "DEBUG: ColorModel = %s\n", colormodel); + fprintf(stderr, "DEBUG: MediaType = %s\n", header->MediaType); + fprintf(stderr, "DEBUG: Resolution = %s\n", resolution); + + if (header->cupsColorSpace == CUPS_CSPACE_RGB || + header->cupsColorSpace == CUPS_CSPACE_W) + RGB = cupsRGBLoad(ppd, colormodel, header->MediaType, resolution); + else + RGB = NULL; + + CMYK = cupsCMYKLoad(ppd, colormodel, header->MediaType, resolution); + + if (RGB) + fputs("DEBUG: Loaded RGB separation from PPD.\n", stderr); + + if (CMYK) + fputs("DEBUG: Loaded CMYK separation from PPD.\n", stderr); + else + { + fputs("DEBUG: Loading default CMYK separation.\n", stderr); + CMYK = cupsCMYKNew(4); + } + + PrinterPlanes = CMYK->num_channels; + + fprintf(stderr, "DEBUG: PrinterPlanes = %d\n", PrinterPlanes); + + /* + * Get the dithering parameters... + */ + + switch (PrinterPlanes) + { + case 1 : /* K */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + + case 2 : /* Kk */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightBlack"); + break; + + case 3 : /* CMY */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + break; + + case 4 : /* CMYK */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + + case 6 : /* CcMmYK */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightCyan"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightMagenta"); + DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + + case 7 : /* CcMmYKk */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightCyan"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightMagenta"); + DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + DitherLuts[6] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightBlack"); + break; + } + + for (plane = 0; plane < PrinterPlanes; plane ++) + { + DitherStates[plane] = cupsDitherNew(header->cupsWidth); + + if (!DitherLuts[plane]) + DitherLuts[plane] = cupsLutNew(2, default_lut); + } + + if (DitherLuts[0][4095].pixel > 1) + BitPlanes = 2; + else + BitPlanes = 1; + + /* + * Initialize the printer... + */ + + printf("\033@"); + + if (ppd->model_number & ESCP_REMOTE) + { + /* + * Go into remote mode... + */ + + cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); + + /* + * Disable status reporting... + */ + + cupsWritePrintData("ST\002\000\000\000", 6); + + /* + * Enable borderless printing... + */ + + if ((attr = ppdFindAttr(ppd, "cupsESCPFP", NULL)) != NULL && attr->value) + { + /* + * Set horizontal offset... + */ + + i = atoi(attr->value); + + cupsWritePrintData("FP\003\000\000", 5); + putchar(i & 255); + putchar(i >> 8); + } + + /* + * Set media type... + */ + + if (header->cupsMediaType) + { + sprintf(spec, "%d", header->cupsMediaType); + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN0", spec)) != NULL && attr->value) + { + /* + * Set feed sequence... + */ + + cupsWritePrintData("SN\003\000\000\000", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN1", spec)) != NULL && attr->value) + { + /* + * Set platten gap... + */ + + cupsWritePrintData("SN\003\000\000\001", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN2", spec)) != NULL && attr->value) + { + /* + * Paper feeding/ejecting sequence... + */ + + cupsWritePrintData("SN\003\000\000\002", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN6", spec)) != NULL && attr->value) + { + /* + * Eject delay... + */ + + cupsWritePrintData("SN\003\000\000\006", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPMT", spec)) != NULL && attr->value) + { + /* + * Set media type. + */ + + cupsWritePrintData("MT\003\000\000\000", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPPH", spec)) != NULL && attr->value) + { + /* + * Set paper thickness. + */ + + cupsWritePrintData("PH\002\000\000", 5); + putchar(atoi(attr->value)); + } + } + + sprintf(spec, "%d", header->MediaPosition); + + if (header->MediaPosition) + { + if ((attr = ppdFindAttr(ppd, "cupsESCPPC", spec)) != NULL && attr->value) + { + /* + * Paper check. + */ + + cupsWritePrintData("PC\002\000\000", 5); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPPP", spec)) != NULL && attr->value) + { + /* + * Paper path. + */ + + int a, b; + + a = b = 0; + sscanf(attr->value, "%d%d", &a, &b); + + cupsWritePrintData("PP\003\000\000", 5); + putchar(a); + putchar(b); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPEX", spec)) != NULL && attr->value) + { + /* + * Set media position. + */ + + cupsWritePrintData("EX\006\000\000\000\000\000\005", 9); + putchar(atoi(attr->value)); + } + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPMS", spec)) != NULL && attr->value) + { + /* + * Set media size... + */ + + cupsWritePrintData("MS\010\000\000", 5); + putchar(atoi(attr->value)); + + switch (header->PageSize[1]) + { + case 1191 : /* A3 */ + putchar(0x01); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 1032 : /* B4 */ + putchar(0x02); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 842 : /* A4 */ + putchar(0x03); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 595 : /* A4.Transverse */ + putchar(0x03); + putchar(0x01); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 729 : /* B5 */ + putchar(0x04); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 516 : /* B5.Transverse */ + putchar(0x04); + putchar(0x01); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 1369 : /* Super A3/B */ + putchar(0x20); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 792 : /* Letter */ + putchar(0x08); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 612 : /* Letter.Transverse */ + putchar(0x08); + putchar(0x01); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 1004 : /* Legal */ + putchar(0x0a); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + case 1224 : /* Tabloid */ + putchar(0x2d); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + putchar(0x00); + break; + default : /* Custom size */ + putchar(0xff); + putchar(0xff); + i = 360 * header->PageSize[0] / 72; + putchar(i); + putchar(i >> 8); + i = 360 * header->PageSize[1] / 72; + putchar(i); + putchar(i >> 8); + break; + } + } + + sprintf(spec, "%d", header->CutMedia); + + if ((attr = ppdFindAttr(ppd, "cupsESCPAC", spec)) != NULL && attr->value) + { + /* + * Enable/disable cutter. + */ + + cupsWritePrintData("AC\002\000\000", 5); + putchar(atoi(attr->value)); + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN80", header->MediaType)) != NULL && attr->value) + { + /* + * Cutting method... + */ + + cupsWritePrintData("SN\003\000\000\200", 6); + putchar(atoi(attr->value)); + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPSN81", header->MediaType)) != NULL && attr->value) + { + /* + * Cutting pressure... + */ + + cupsWritePrintData("SN\003\000\000\201", 6); + putchar(atoi(attr->value)); + } + } + + if ((attr = ppdFindAttr(ppd, "cupsESCPCO", spec)) != NULL && attr->value) + { + /* + * Enable/disable cutter. + */ + + cupsWritePrintData("CO\010\000\000\000", 6); + putchar(atoi(attr->value)); + cupsWritePrintData("\000\000\000\000\000", 5); + } + + /* + * Exit remote mode... + */ + + cupsWritePrintData("\033\000\000\000", 4); + } + + /* + * Enter graphics mode... + */ + + cupsWritePrintData("\033(G\001\000\001", 6); + + /* + * Set the line feed increment... + */ + + /* TODO: get this from the PPD file... */ + for (units = 1440; units < header->HWResolution[0]; units *= 2); + + if (ppd->model_number & ESCP_EXT_UNITS) + { + cupsWritePrintData("\033(U\005\000", 5); + putchar(units / header->HWResolution[1]); + putchar(units / header->HWResolution[1]); + putchar(units / header->HWResolution[0]); + putchar(units); + putchar(units >> 8); + } + else + { + cupsWritePrintData("\033(U\001\000", 5); + putchar(3600 / header->HWResolution[1]); + } + + /* + * Set the page length... + */ + + PrinterLength = header->PageSize[1] * header->HWResolution[1] / 72; + + if (ppd->model_number & ESCP_PAGE_SIZE) + { + /* + * Set page size (expands bottom margin)... + */ + + cupsWritePrintData("\033(S\010\000", 5); + + i = header->PageSize[0] * header->HWResolution[1] / 72; + putchar(i); + putchar(i >> 8); + putchar(i >> 16); + putchar(i >> 24); + + i = header->PageSize[1] * header->HWResolution[1] / 72; + putchar(i); + putchar(i >> 8); + putchar(i >> 16); + putchar(i >> 24); + } + else + { + cupsWritePrintData("\033(C\002\000", 5); + putchar(PrinterLength & 255); + putchar(PrinterLength >> 8); + } + + /* + * Set the top and bottom margins... + */ + + PrinterTop = (int)((ppd->sizes[1].length - ppd->sizes[1].top) * + header->HWResolution[1] / 72.0); + + if (ppd->model_number & ESCP_EXT_MARGINS) + { + cupsWritePrintData("\033(c\010\000", 5); + + putchar(PrinterTop); + putchar(PrinterTop >> 8); + putchar(PrinterTop >> 16); + putchar(PrinterTop >> 24); + + putchar(PrinterLength); + putchar(PrinterLength >> 8); + putchar(PrinterLength >> 16); + putchar(PrinterLength >> 24); + } + else + { + cupsWritePrintData("\033(c\004\000", 5); + + putchar(PrinterTop & 255); + putchar(PrinterTop >> 8); + + putchar(PrinterLength & 255); + putchar(PrinterLength >> 8); + } + + /* + * Set the top position... + */ + + cupsWritePrintData("\033(V\002\000\000\000", 7); + + /* + * Enable unidirectional printing depending on the mode... + */ + + if ((attr = cupsFindAttr(ppd, "cupsESCPDirection", colormodel, + header->MediaType, resolution, spec, + sizeof(spec))) != NULL) + printf("\033U%c", atoi(attr->value)); + + /* + * Enable/disable microweaving as needed... + */ + + if ((attr = cupsFindAttr(ppd, "cupsESCPMicroWeave", colormodel, + header->MediaType, resolution, spec, + sizeof(spec))) != NULL) + printf("\033(i\001%c%c", 0, atoi(attr->value)); + + /* + * Set the dot size and print speed as needed... + */ + + if ((attr = cupsFindAttr(ppd, "cupsESCPDotSize", colormodel, + header->MediaType, resolution, spec, + sizeof(spec))) != NULL) + printf("\033(e\002%c%c%c", 0, 0, atoi(attr->value)); + + if (ppd->model_number & ESCP_ESCK) + { + /* + * Set the print mode... + */ + + if (PrinterPlanes == 1) + { + /* + * Fast black printing. + */ + + cupsWritePrintData("\033(K\002\000\000\001", 7); + } + else + { + /* + * Color printing. + */ + + cupsWritePrintData("\033(K\002\000\000\002", 7); + } + } + + /* + * Get softweave settings from header... + */ + + if (header->cupsRowCount <= 1) + { + DotRowCount = 1; + DotColStep = 1; + DotRowStep = 1; + DotRowFeed = 1; + } + else + { + DotRowCount = header->cupsRowCount; + DotRowFeed = header->cupsRowFeed; + DotRowStep = header->cupsRowStep % 100; + DotColStep = header->cupsRowStep / 100; + + if (DotColStep == 0) + DotColStep ++; + } + + /* + * Setup softweave parameters... + */ + + DotRowCurrent = 0; + DotRowMax = DotRowCount * DotRowStep; + DotBufferSize = (header->cupsWidth / DotColStep * BitPlanes + 7) / 8; + + fprintf(stderr, "DEBUG: DotBufferSize = %d\n", DotBufferSize); + fprintf(stderr, "DEBUG: DotColStep = %d\n", DotColStep); + fprintf(stderr, "DEBUG: DotRowMax = %d\n", DotRowMax); + fprintf(stderr, "DEBUG: DotRowStep = %d\n", DotRowStep); + fprintf(stderr, "DEBUG: DotRowFeed = %d\n", DotRowFeed); + fprintf(stderr, "DEBUG: DotRowCount = %d\n", DotRowCount); + + DotAvailList = NULL; + DotUsedList = NULL; + DotBuffers[0] = NULL; + + fprintf(stderr, "DEBUG: model_number = %x\n", ppd->model_number); + + if (DotRowMax > 1) + { + /* + * Compute offsets for the color jets on the print head... + */ + + bands = DotRowStep * DotColStep * PrinterPlanes * 4; + + memset(DotRowOffset, 0, sizeof(DotRowOffset)); + + if (PrinterPlanes == 1) + { + /* + * Use full height of print head... + */ + + if ((attr = ppdFindAttr(ppd, "cupsESCPBlack", resolution)) != NULL && + attr->value) + { + /* + * Use custom black head data... + */ + + sscanf(attr->value, "%d%d", &DotRowCount, &DotRowStep); + } + } + else if (ppd->model_number & ESCP_STAGGER) + { + /* + * Use staggered print head... + */ + + fputs("DEBUG: Offset head detected...\n", stderr); + + if ((attr = ppdFindAttr(ppd, "cupsESCPOffsets", resolution)) != NULL && + attr->value) + { + /* + * Use only 1/3 of the print head when printing color... + */ + + sscanf(attr->value, "%d%d%d%d", DotRowOffset + 0, + DotRowOffset + 1, DotRowOffset + 2, DotRowOffset + 3); + } + } + + for (i = 0; i < PrinterPlanes; i ++) + fprintf(stderr, "DEBUG: DotRowOffset[%d] = %d\n", i, DotRowOffset[i]); + + /* + * Allocate bands... + */ + + for (i = 0; i < bands; i ++) + { + band = (cups_weave_t *)calloc(1, sizeof(cups_weave_t)); + band->next = DotAvailList; + DotAvailList = band; + + band->buffer = calloc(DotRowCount, DotBufferSize); + } + + if (!DotAvailList) + { + fputs("ERROR: Unable to allocate band list\n", stderr); + exit(1); + } + + fputs("DEBUG: Pointer list at start of page...\n", stderr); + + for (band = DotAvailList; band != NULL; band = band->next) + fprintf(stderr, "DEBUG: %p\n", band); + + fputs("DEBUG: ----END----\n", stderr); + + /* + * Fill the initial bands... + */ + + modrow = DotColStep * DotRowStep; + + if (DotRowFeed == 0) + { + /* + * Automatically compute the optimal feed value... + */ + + DotRowFeed = DotRowCount / DotColStep - DotRowStep; + + while ((((DotRowFeed % 2) == 0) == ((DotRowCount % 2) == 0) || + ((DotRowFeed % 3) == 0) == ((DotRowCount % 3) == 0) || + ((DotRowFeed % 5) == 0) == ((DotRowCount % 5) == 0)) && + DotRowFeed > 1) + DotRowFeed --; + + if (DotRowFeed < 1) + DotRowFeed = 1; + + fprintf(stderr, "DEBUG: Auto DotRowFeed = %d, modrow=%d...\n", + DotRowFeed, modrow); + } + + memset(DotBands, 0, sizeof(DotBands)); + + for (i = modrow, subrow = modrow - 1, y = DotRowFeed; + i > 0; + i --, y += DotRowFeed) + { + while (DotBands[subrow][0]) + { + /* + * This subrow is already used, move to another one... + */ + + subrow = (subrow + 1) % modrow; + } + + for (plane = 0; plane < PrinterPlanes; plane ++) + { + /* + * Pull the next available band from the list... + */ + + band = DotAvailList; + DotAvailList = DotAvailList->next; + DotBands[subrow][plane] = band; + + /* + * Start the band in the first few passes, with the number of rows + * varying to allow for a nice interleaved pattern... + */ + + band->x = subrow / DotRowStep; + band->y = (subrow % DotRowStep) + DotRowOffset[plane]; + band->plane = plane; + band->row = 0; + band->count = DotRowCount - y / DotRowStep; + + if (band->count < 1) + band->count = 1; + else if (band->count > DotRowCount) + band->count = DotRowCount; + + fprintf(stderr, "DEBUG: DotBands[%d][%d] = %p, x = %d, y = %d, plane = %d, count = %d\n", + subrow, plane, band, band->x, band->y, band->plane, band->count); + } + + subrow = (subrow + DotRowFeed) % modrow; + } + } + else + { + /* + * Allocate memory for a single line of graphics... + */ + + ptr = calloc(PrinterPlanes, DotBufferSize); + + for (plane = 0; plane < PrinterPlanes; plane ++, ptr += DotBufferSize) + DotBuffers[plane] = ptr; + } + + /* + * Set the output resolution... + */ + + cupsWritePrintData("\033(D\004\000", 5); + putchar(units); + putchar(units >> 8); + putchar(units * DotRowStep / header->HWResolution[1]); + putchar(units * DotColStep / header->HWResolution[0]); + + /* + * Set the top of form... + */ + + OutputFeed = 0; + + /* + * Allocate buffers as needed... + */ + + PixelBuffer = malloc(header->cupsBytesPerLine); + InputBuffer = malloc(header->cupsWidth * PrinterPlanes * 2); + OutputBuffers[0] = malloc(PrinterPlanes * header->cupsWidth); + + for (i = 1; i < PrinterPlanes; i ++) + OutputBuffers[i] = OutputBuffers[0] + i * header->cupsWidth; + + if (RGB) + CMYKBuffer = malloc(header->cupsWidth * PrinterPlanes); + + CompBuffer = malloc(10 * DotBufferSize * DotRowMax); +} + + +/* + * 'EndPage()' - Finish a page of graphics. + */ + +void +EndPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int i; /* Looping var */ + cups_weave_t *band, /* Current band */ + *next; /* Next band in list */ + int plane; /* Current plane */ + int subrow; /* Current subrow */ + int subrows; /* Number of subrows */ + + + /* + * Output the last bands of print data as necessary... + */ + + if (DotRowMax > 1) + { + /* + * Move the remaining bands to the used or avail lists... + */ + + subrows = DotRowStep * DotColStep; + + for (subrow = 0; subrow < subrows; subrow ++) + for (plane = 0; plane < PrinterPlanes; plane ++) + { + if (DotBands[subrow][plane]->dirty) + { + /* + * Insert into the used list... + */ + + DotBands[subrow][plane]->count = DotBands[subrow][plane]->row; + + AddBand(DotBands[subrow][plane]); + } + else + { + /* + * Nothing here, so move it to the available list... + */ + + DotBands[subrow][plane]->next = DotAvailList; + DotAvailList = DotBands[subrow][plane]; + } + + DotBands[subrow][plane] = NULL; + } + + /* + * Loop until all bands are written... + */ + + fputs("DEBUG: Pointer list at end of page...\n", stderr); + + for (band = DotUsedList; band != NULL; band = band->next) + fprintf(stderr, "DEBUG: %p (used)\n", band); + for (band = DotAvailList; band != NULL; band = band->next) + fprintf(stderr, "DEBUG: %p (avail)\n", band); + + fputs("DEBUG: ----END----\n", stderr); + + for (band = DotUsedList; band != NULL; band = next) + { + next = band->next; + + OutputBand(ppd, header, band); + + fprintf(stderr, "DEBUG: freeing used band %p, prev = %p, next = %p\n", + band, band->prev, band->next); + + free(band->buffer); + free(band); + } + + /* + * Free memory for the available bands, if any... + */ + + for (band = DotAvailList; band != NULL; band = next) + { + next = band->next; + + fprintf(stderr, "DEBUG: freeing avail band %p, prev = %p, next = %p\n", + band, band->prev, band->next); + + free(band->buffer); + free(band); + } + } + else + free(DotBuffers[0]); + + /* + * Output a page eject sequence... + */ + + putchar(12); + + /* + * Free memory for the page... + */ + + for (i = 0; i < PrinterPlanes; i ++) + { + cupsDitherDelete(DitherStates[i]); + cupsLutDelete(DitherLuts[i]); + } + + free(OutputBuffers[0]); + + free(PixelBuffer); + free(InputBuffer); + free(CompBuffer); + + cupsCMYKDelete(CMYK); + + if (RGB) + { + cupsRGBDelete(RGB); + free(CMYKBuffer); + } +} + + +/* + * 'Shutdown()' - Shutdown a printer. + */ + +void +Shutdown(ppd_file_t *ppd) /* I - PPD file */ +{ + /* + * Reset the printer... + */ + + printf("\033@"); + + if (ppd->model_number & ESCP_REMOTE) + { + /* + * Go into remote mode... + */ + + cupsWritePrintData("\033(R\010\000\000REMOTE1", 13); + + /* + * Load defaults... + */ + + cupsWritePrintData("LD\000\000", 4); + + /* + * Exit remote mode... + */ + + cupsWritePrintData("\033\000\000\000", 4); + } +} + + +/* + * 'AddBand()' - Add a band of data to the used list. + */ + +void +AddBand(cups_weave_t *band) /* I - Band to add */ +{ + cups_weave_t *current, /* Current band */ + *prev; /* Previous band */ + + + if (band->count < 1) + return; + + for (current = DotUsedList, prev = NULL; + current != NULL; + prev = current, current = current->next) + if (band->y < current->y || + (band->y == current->y && band->x < current->x) || + (band->y == current->y && band->x == current->x && + band->plane < current->plane)) + break; + + if (current != NULL) + { + /* + * Insert the band... + */ + + band->next = current; + band->prev = prev; + current->prev = band; + + if (prev != NULL) + prev->next = band; + else + DotUsedList = band; + } + else if (prev != NULL) + { + /* + * Append the band to the end... + */ + + band->prev = prev; + prev->next = band; + band->next = NULL; + } + else + { + /* + * First band in list... + */ + + DotUsedList = band; + band->prev = NULL; + band->next = NULL; + } +} + + +/* + * 'CancelJob()' - Cancel the current job... + */ + +void +CancelJob(int sig) /* I - Signal */ +{ + (void)sig; + + Canceled = 1; +} + + +/* + * 'CompressData()' - Compress a line of graphics. + */ + +void +CompressData(ppd_file_t *ppd, /* I - PPD file information */ + const unsigned char *line, /* I - Data to compress */ + const int length,/* I - Number of bytes */ + int plane, /* I - Color plane */ + int type, /* I - Type of compression */ + const int rows, /* I - Number of lines to write */ + const int xstep, /* I - Spacing between columns */ + const int ystep, /* I - Spacing between lines */ + const int offset)/* I - Head offset */ +{ + register const unsigned char *line_ptr, + /* Current byte pointer */ + *line_end, /* End-of-line byte pointer */ + *start; /* Start of compression sequence */ + register unsigned char *comp_ptr; /* Pointer into compression buffer */ + register int count; /* Count of bytes for output */ + register int bytes; /* Number of bytes per row */ + static int ctable[7][7] = /* Colors */ + { + { 0, 0, 0, 0, 0, 0, 0 }, /* K */ + { 0, 16, 0, 0, 0, 0, 0 }, /* Kk */ + { 2, 1, 4, 0, 0, 0, 0 }, /* CMY */ + { 2, 1, 4, 0, 0, 0, 0 }, /* CMYK */ + { 0, 0, 0, 0, 0, 0, 0 }, + { 2, 18, 1, 17, 4, 0, 0 }, /* CcMmYK */ + { 2, 18, 1, 17, 4, 0, 16 }, /* CcMmYKk */ + }; + + + switch (type) + { + case 0 : + /* + * Do no compression... + */ + + line_ptr = (const unsigned char *)line; + line_end = (const unsigned char *)line + length; + break; + + default : + /* + * Do TIFF pack-bits encoding... + */ + + line_ptr = (const unsigned char *)line; + line_end = (const unsigned char *)line + length; + comp_ptr = CompBuffer; + + while (line_ptr < line_end && (comp_ptr - CompBuffer) < length) + { + if ((line_ptr + 1) >= line_end) + { + /* + * Single byte on the end... + */ + + *comp_ptr++ = 0x00; + *comp_ptr++ = *line_ptr++; + } + else if (line_ptr[0] == line_ptr[1]) + { + /* + * Repeated sequence... + */ + + line_ptr ++; + count = 2; + + while (line_ptr < (line_end - 1) && + line_ptr[0] == line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = 257 - count; + *comp_ptr++ = *line_ptr++; + } + else + { + /* + * Non-repeated sequence... + */ + + start = line_ptr; + line_ptr ++; + count = 1; + + while (line_ptr < (line_end - 1) && + line_ptr[0] != line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = count - 1; + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + } + + if ((comp_ptr - CompBuffer) < length) + { + line_ptr = (const unsigned char *)CompBuffer; + line_end = (const unsigned char *)comp_ptr; + } + else + { + type = 0; + line_ptr = (const unsigned char *)line; + line_end = (const unsigned char *)line + length; + } + break; + } + + /* + * Position the print head... + */ + + putchar(0x0d); + + if (offset) + { + if (BitPlanes == 1) + cupsWritePrintData("\033(\\\004\000\240\005", 7); + else + printf("\033\\"); + + putchar(offset); + putchar(offset >> 8); + } + + /* + * Send the graphics... + */ + + bytes = length / rows; + + if (ppd->model_number & ESCP_RASTER_ESCI) + { + /* + * Send graphics with ESC i command. + */ + + printf("\033i"); + putchar(ctable[PrinterPlanes - 1][plane]); + putchar(type != 0); + putchar(BitPlanes); + putchar(bytes & 255); + putchar(bytes >> 8); + putchar(rows & 255); + putchar(rows >> 8); + } + else + { + /* + * Set the color if necessary... + */ + + if (PrinterPlanes > 1) + { + plane = ctable[PrinterPlanes - 1][plane]; + + if (plane & 0x10) + printf("\033(r%c%c%c%c", 2, 0, 1, plane & 0x0f); + else + printf("\033r%c", plane); + } + + /* + * Send graphics with ESC . command. + */ + + bytes *= 8; + + printf("\033."); + putchar(type != 0); + putchar(ystep); + putchar(xstep); + putchar(rows); + putchar(bytes & 255); + putchar(bytes >> 8); + } + + cupsWritePrintData(line_ptr, line_end - line_ptr); +} + + +/* + * 'OutputBand()' - Output a band of graphics. + */ + +void +OutputBand(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header, /* I - Page header */ + cups_weave_t *band) /* I - Current band */ +{ + int xstep, /* Spacing between columns */ + ystep; /* Spacing between rows */ + + + /* + * Interleaved ESC/P2 graphics... + */ + + OutputFeed = band->y - DotRowCurrent; + DotRowCurrent = band->y; + + fprintf(stderr, "DEBUG: Printing band %p, x = %d, y = %d, plane = %d, count = %d, OutputFeed = %d\n", + band, band->x, band->y, band->plane, band->count, OutputFeed); + + /* + * Compute step values... + */ + + xstep = 3600 * DotColStep / header->HWResolution[0]; + ystep = 3600 * DotRowStep / header->HWResolution[1]; + + /* + * Output the band... + */ + + if (OutputFeed > 0) + { + cupsWritePrintData("\033(v\002\000", 5); + putchar(OutputFeed & 255); + putchar(OutputFeed >> 8); + + OutputFeed = 0; + } + + CompressData(ppd, band->buffer, band->count * DotBufferSize, band->plane, + header->cupsCompression, band->count, xstep, ystep, band->x); + + /* + * Clear the band... + */ + + memset(band->buffer, 0, band->count * DotBufferSize); + band->dirty = 0; + + /* + * Flush the output buffers... + */ + + fflush(stdout); +} + + +/* + * 'ProcessLine()' - Read graphics from the page stream and output as needed. + */ + +void +ProcessLine(ppd_file_t *ppd, /* I - PPD file */ + cups_raster_t *ras, /* I - Raster stream */ + cups_page_header2_t *header, /* I - Page header */ + const int y) /* I - Current scanline */ +{ + int plane, /* Current color plane */ + width, /* Width of line */ + subwidth, /* Width of interleaved row */ + subrow, /* Subrow for interleaved output */ + offset, /* Offset to current line */ + pass, /* Pass number */ + xstep, /* X step value */ + ystep; /* Y step value */ + cups_weave_t *band; /* Current band */ + + + /* + * Read a row of graphics... + */ + + if (!cupsRasterReadPixels(ras, PixelBuffer, header->cupsBytesPerLine)) + return; + + /* + * Perform the color separation... + */ + + width = header->cupsWidth; + subwidth = header->cupsWidth / DotColStep; + xstep = 3600 / header->HWResolution[0]; + ystep = 3600 / header->HWResolution[1]; + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_W : + if (RGB) + { + cupsRGBDoGray(RGB, PixelBuffer, CMYKBuffer, width); + cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); + } + else + cupsCMYKDoGray(CMYK, PixelBuffer, InputBuffer, width); + break; + + case CUPS_CSPACE_K : + cupsCMYKDoBlack(CMYK, PixelBuffer, InputBuffer, width); + break; + + default : + case CUPS_CSPACE_RGB : + if (RGB) + { + cupsRGBDoRGB(RGB, PixelBuffer, CMYKBuffer, width); + cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); + } + else + cupsCMYKDoRGB(CMYK, PixelBuffer, InputBuffer, width); + break; + + case CUPS_CSPACE_CMYK : + cupsCMYKDoCMYK(CMYK, PixelBuffer, InputBuffer, width); + break; + } + + /* + * Dither the pixels... + */ + + for (plane = 0; plane < PrinterPlanes; plane ++) + { + cupsDitherLine(DitherStates[plane], DitherLuts[plane], InputBuffer + plane, + PrinterPlanes, OutputBuffers[plane]); + + if (DotRowMax == 1) + { + /* + * Handle microweaved output... + */ + + if (cupsCheckBytes(OutputBuffers[plane], width)) + continue; + + if (BitPlanes == 1) + cupsPackHorizontal(OutputBuffers[plane], DotBuffers[plane], + width, 0, 1); + else + cupsPackHorizontal2(OutputBuffers[plane], DotBuffers[plane], + width, 1); + + if (OutputFeed > 0) + { + cupsWritePrintData("\033(v\002\000", 5); + putchar(OutputFeed & 255); + putchar(OutputFeed >> 8); + OutputFeed = 0; + } + + CompressData(ppd, DotBuffers[plane], DotBufferSize, plane, 1, 1, + xstep, ystep, 0); + fflush(stdout); + } + else + { + /* + * Handle softweaved output... + */ + + for (pass = 0, subrow = y % DotRowStep; + pass < DotColStep; + pass ++, subrow += DotRowStep) + { + /* + * See if we need to output the band... + */ + + band = DotBands[subrow][plane]; + offset = band->row * DotBufferSize; + + if (BitPlanes == 1) + cupsPackHorizontal(OutputBuffers[plane] + pass, + band->buffer + offset, subwidth, 0, DotColStep); + else + cupsPackHorizontal2(OutputBuffers[plane] + pass, + band->buffer + offset, subwidth, DotColStep); + + band->row ++; + band->dirty |= !cupsCheckBytes(band->buffer + offset, DotBufferSize); + if (band->row >= band->count) + { + if (band->dirty) + { + /* + * Dirty band needs to be added to the used list... + */ + + AddBand(band); + + /* + * Then find a new band... + */ + + if (DotAvailList == NULL) + { + OutputBand(ppd, header, DotUsedList); + + DotBands[subrow][plane] = DotUsedList; + DotUsedList->x = band->x; + DotUsedList->y = band->y + band->count * DotRowStep; + DotUsedList->plane = band->plane; + DotUsedList->row = 0; + DotUsedList->count = DotRowCount; + DotUsedList = DotUsedList->next; + } + else + { + DotBands[subrow][plane] = DotAvailList; + DotAvailList->x = band->x; + DotAvailList->y = band->y + band->count * DotRowStep; + DotAvailList->plane = band->plane; + DotAvailList->row = 0; + DotAvailList->count = DotRowCount; + DotAvailList = DotAvailList->next; + } + } + else + { + /* + * This band isn't dirty, so reuse it... + */ + + fprintf(stderr, "DEBUG: Blank band %p, x = %d, y = %d, plane = %d, count = %d\n", + band, band->x, band->y, band->plane, band->count); + + band->y += band->count * DotRowStep; + band->row = 0; + band->count = DotRowCount; + } + } + } + } + } + + if (DotRowMax == 1) + OutputFeed ++; +} + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int page; /* Current page */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("%s job-id user title copies options [file]"), + "rastertoescpx"); + return (1); + } + + num_options = cupsParseOptions(argv[5], 0, &options); + + /* + * Open the PPD file... + */ + + ppd = ppdOpenFile(getenv("PPD")); + + if (!ppd) + { + ppd_status_t status; /* PPD error */ + int linenum; /* Line number */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("The PPD file could not be opened.")); + + status = ppdLastError(&linenum); + + fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); + + return (1); + } + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open raster file")); + return (1); + } + } + else + fd = 0; + + ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* + * Initialize the print device... + */ + + Setup(ppd); + + /* + * Process pages as needed... + */ + + page = 0; + + while (cupsRasterReadHeader2(ras, &header)) + { + /* + * Write a status message with the page number and number of copies. + */ + + if (Canceled) + break; + + page ++; + + fprintf(stderr, "PAGE: %d 1\n", page); + _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), page); + + StartPage(ppd, &header); + + for (y = 0; y < header.cupsHeight; y ++) + { + /* + * Let the user know how far we have progressed... + */ + + if (Canceled) + break; + + if ((y & 127) == 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printing page %d, %d%% complete."), + page, 100 * y / header.cupsHeight); + fprintf(stderr, "ATTR: job-media-progress=%d\n", + 100 * y / header.cupsHeight); + } + + /* + * Read and write a line of graphics or whitespace... + */ + + ProcessLine(ppd, ras, &header, y); + } + + /* + * Eject the page... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), page); + + EndPage(ppd, &header); + + if (Canceled) + break; + } + + Shutdown(ppd); + + cupsFreeOptions(num_options, options); + + cupsRasterClose(ras); + + if (fd != 0) + close(fd); + + if (page == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); + return (1); + } + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (0); + } +} + + +/* + * End of "$Id: rastertoescpx.c 9382 2010-11-20 01:03:46Z mike $". + */ diff --git a/driver/rastertopclx.c b/driver/rastertopclx.c new file mode 100644 index 0000000..3c1075b --- /dev/null +++ b/driver/rastertopclx.c @@ -0,0 +1,1956 @@ +/* + * "$Id: rastertopclx.c 9382 2010-11-20 01:03:46Z mike $" + * + * Advanced HP Page Control Language and Raster Transfer Language + * filter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * StartPage() - Start a page of graphics. + * EndPage() - Finish a page of graphics. + * Shutdown() - Shutdown a printer. + * CancelJob() - Cancel the current job... + * CompressData() - Compress a line of graphics. + * OutputLine() - Output the specified number of lines of graphics. + * ReadLine() - Read graphics from the page stream. + * main() - Main entry and processing of driver. + */ + +/* + * Include necessary headers... + */ + +#include "driver.h" +#include +#include +#include "pcl-common.h" +#include + + +/* + * Output modes... + */ + +typedef enum +{ + OUTPUT_BITMAP, /* Output bitmap data from RIP */ + OUTPUT_INVERBIT, /* Output inverted bitmap data */ + OUTPUT_RGB, /* Output 24-bit RGB data from RIP */ + OUTPUT_DITHERED /* Output dithered data */ +} pcl_output_t; + + +/* + * Globals... + */ + +cups_rgb_t *RGB; /* RGB color separation data */ +cups_cmyk_t *CMYK; /* CMYK color separation data */ +unsigned char *PixelBuffer, /* Pixel buffer */ + *CMYKBuffer, /* CMYK buffer */ + *OutputBuffers[6], /* Output buffers */ + *DotBuffers[6], /* Bit buffers */ + *CompBuffer, /* Compression buffer */ + *SeedBuffer, /* Mode 3 seed buffers */ + BlankValue; /* The blank value */ +short *InputBuffer; /* Color separation buffer */ +cups_lut_t *DitherLuts[6]; /* Lookup tables for dithering */ +cups_dither_t *DitherStates[6]; /* Dither state tables */ +int PrinterPlanes, /* Number of color planes */ + SeedInvalid, /* Contents of seed buffer invalid? */ + DotBits[6], /* Number of bits per color */ + DotBufferSizes[6], /* Size of one row of color dots */ + DotBufferSize, /* Size of complete line */ + OutputFeed, /* Number of lines to skip */ + Page; /* Current page number */ +pcl_output_t OutputMode; /* Output mode - see OUTPUT_ consts */ +const int ColorOrders[7][7] = /* Order of color planes */ + { + { 0, 0, 0, 0, 0, 0, 0 }, /* Black */ + { 0, 0, 0, 0, 0, 0, 0 }, + { 0, 1, 2, 0, 0, 0, 0 }, /* CMY */ + { 3, 0, 1, 2, 0, 0, 0 }, /* KCMY */ + { 0, 0, 0, 0, 0, 0, 0 }, + { 5, 0, 1, 2, 3, 4, 0 }, /* KCMYcm */ + { 5, 0, 1, 2, 3, 4, 6 } /* KCMYcmk */ + }; +int Canceled; /* Is the job canceled? */ + + +/* + * Prototypes... + */ + +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header, int job_id, + const char *user, const char *title, int num_options, + cups_option_t *options); +void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); +void Shutdown(ppd_file_t *ppd, int job_id, const char *user, + const char *title, int num_options, cups_option_t *options); + +void CancelJob(int sig); +void CompressData(unsigned char *line, int length, int plane, int pend, + int type); +void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header); +int ReadLine(cups_raster_t *ras, cups_page_header2_t *header); + + +/* + * 'StartPage()' - Start a page of graphics. + */ + +void +StartPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header, /* I - Page header */ + int job_id, /* I - Job ID */ + const char *user, /* I - User printing job */ + const char *title, /* I - Title of job */ + int num_options, + /* I - Number of command-line options */ + cups_option_t *options) /* I - Command-line options */ +{ + int i; /* Temporary/looping var */ + int plane; /* Current plane */ + char s[255]; /* Temporary value */ + const char *colormodel; /* Color model string */ + char resolution[PPD_MAX_NAME], + /* Resolution string */ + spec[PPD_MAX_NAME]; /* PPD attribute name */ + ppd_attr_t *attr; /* Attribute from PPD file */ + ppd_choice_t *choice; /* Selected option */ + const int *order; /* Order to use */ + int xorigin, /* X origin of page */ + yorigin; /* Y origin of page */ + static const float default_lut[2] = /* Default dithering lookup table */ + { + 0.0, + 1.0 + }; + + + /* + * Debug info... + */ + + fprintf(stderr, "DEBUG: StartPage...\n"); + fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); + fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); + fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); + fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); + + fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); + fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); + fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); + fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); + fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); + fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], + header->HWResolution[1]); + fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", + header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], + header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); + fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); + fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); + fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); + fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], + header->Margins[1]); + fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); + fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); + fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); + fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); + fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); + fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); + fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); + fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); + fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], + header->PageSize[1]); + fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); + fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); + fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); + fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); + fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); + fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); + +#ifdef __APPLE__ + /* + * MacOS X 10.2.x doesn't set most of the page device attributes, so check + * the options and set them accordingly... + */ + + if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble")) + { + header->Duplex = CUPS_TRUE; + header->Tumble = CUPS_FALSE; + } + else if (ppdIsMarked(ppd, "Duplex", "DuplexTumble")) + { + header->Duplex = CUPS_TRUE; + header->Tumble = CUPS_TRUE; + } + + fprintf(stderr, "DEBUG: num_options=%d\n", num_options); + + for (i = 0; i < num_options; i ++) + fprintf(stderr, "DEBUG: options[%d]=[\"%s\" \"%s\"]\n", i, + options[i].name, options[i].value); +#endif /* __APPLE__ */ + + /* + * Figure out the color model and spec strings... + */ + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_K : + colormodel = "Black"; + break; + case CUPS_CSPACE_W : + colormodel = "Gray"; + break; + default : + case CUPS_CSPACE_RGB : + colormodel = "RGB"; + break; + case CUPS_CSPACE_CMY : + colormodel = "CMY"; + break; + case CUPS_CSPACE_CMYK : + colormodel = "CMYK"; + break; + } + + if (header->HWResolution[0] != header->HWResolution[1]) + snprintf(resolution, sizeof(resolution), "%dx%ddpi", + header->HWResolution[0], header->HWResolution[1]); + else + snprintf(resolution, sizeof(resolution), "%ddpi", + header->HWResolution[0]); + + if (!header->MediaType[0]) + strcpy(header->MediaType, "PLAIN"); + + /* + * Get the dithering parameters... + */ + + BlankValue = 0x00; + + if (header->cupsBitsPerColor == 1) + { + /* + * Use raw bitmap mode... + */ + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_K : + OutputMode = OUTPUT_BITMAP; + PrinterPlanes = 1; + break; + case CUPS_CSPACE_W : + OutputMode = OUTPUT_INVERBIT; + PrinterPlanes = 1; + break; + default : + case CUPS_CSPACE_RGB : + OutputMode = OUTPUT_INVERBIT; + PrinterPlanes = 3; + break; + case CUPS_CSPACE_CMY : + OutputMode = OUTPUT_BITMAP; + PrinterPlanes = 3; + break; + case CUPS_CSPACE_CMYK : + OutputMode = OUTPUT_BITMAP; + PrinterPlanes = 4; + break; + } + + if (OutputMode == OUTPUT_INVERBIT) + BlankValue = 0xff; + + DotBufferSize = header->cupsBytesPerLine; + + memset(DitherLuts, 0, sizeof(DitherLuts)); + memset(DitherStates, 0, sizeof(DitherStates)); + } + else if (header->cupsColorSpace == CUPS_CSPACE_RGB && + (ppd->model_number & PCL_RASTER_RGB24)) + { + /* + * Use 24-bit RGB output mode... + */ + + OutputMode = OUTPUT_RGB; + PrinterPlanes = 3; + DotBufferSize = header->cupsBytesPerLine; + + if (header->cupsCompression == 10) + BlankValue = 0xff; + + memset(DitherLuts, 0, sizeof(DitherLuts)); + memset(DitherStates, 0, sizeof(DitherStates)); + } + else if ((header->cupsColorSpace == CUPS_CSPACE_K || + header->cupsColorSpace == CUPS_CSPACE_W) && + (ppd->model_number & PCL_RASTER_RGB24) && + header->cupsCompression == 10) + { + /* + * Use 24-bit RGB output mode for grayscale/black output... + */ + + OutputMode = OUTPUT_RGB; + PrinterPlanes = 1; + DotBufferSize = header->cupsBytesPerLine; + + if (header->cupsColorSpace == CUPS_CSPACE_W) + BlankValue = 0xff; + + memset(DitherLuts, 0, sizeof(DitherLuts)); + memset(DitherStates, 0, sizeof(DitherStates)); + } + else + { + /* + * Use dithered output mode... + */ + + OutputMode = OUTPUT_DITHERED; + + /* + * Load the appropriate color profiles... + */ + + RGB = NULL; + CMYK = NULL; + + fputs("DEBUG: Attempting to load color profiles using the following values:\n", stderr); + fprintf(stderr, "DEBUG: ColorModel = %s\n", colormodel); + fprintf(stderr, "DEBUG: MediaType = %s\n", header->MediaType); + fprintf(stderr, "DEBUG: Resolution = %s\n", resolution); + + if (header->cupsColorSpace == CUPS_CSPACE_RGB || + header->cupsColorSpace == CUPS_CSPACE_W) + RGB = cupsRGBLoad(ppd, colormodel, header->MediaType, resolution); + + CMYK = cupsCMYKLoad(ppd, colormodel, header->MediaType, resolution); + + if (RGB) + fputs("DEBUG: Loaded RGB separation from PPD.\n", stderr); + + if (CMYK) + fputs("DEBUG: Loaded CMYK separation from PPD.\n", stderr); + else + { + fputs("DEBUG: Loading default K separation.\n", stderr); + CMYK = cupsCMYKNew(1); + } + + PrinterPlanes = CMYK->num_channels; + + /* + * Use dithered mode... + */ + + switch (PrinterPlanes) + { + case 1 : /* K */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + + case 3 : /* CMY */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + break; + + case 4 : /* CMYK */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + + case 6 : /* CcMmYK */ + DitherLuts[0] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Cyan"); + DitherLuts[1] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightCyan"); + DitherLuts[2] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Magenta"); + DitherLuts[3] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "LightMagenta"); + DitherLuts[4] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Yellow"); + DitherLuts[5] = cupsLutLoad(ppd, colormodel, header->MediaType, + resolution, "Black"); + break; + } + + for (plane = 0; plane < PrinterPlanes; plane ++) + { + if (!DitherLuts[plane]) + DitherLuts[plane] = cupsLutNew(2, default_lut); + + if (DitherLuts[plane][4095].pixel > 1) + DotBits[plane] = 2; + else + DotBits[plane] = 1; + + DitherStates[plane] = cupsDitherNew(header->cupsWidth); + + if (!DitherLuts[plane]) + DitherLuts[plane] = cupsLutNew(2, default_lut); + } + } + + fprintf(stderr, "DEBUG: PrinterPlanes = %d\n", PrinterPlanes); + + /* + * Initialize the printer... + */ + + if ((attr = ppdFindAttr(ppd, "cupsInitialNulls", NULL)) != NULL) + for (i = atoi(attr->value); i > 0; i --) + putchar(0); + + if (Page == 1 && (ppd->model_number & PCL_PJL)) + { + pjl_escape(); + + /* + * PJL job setup... + */ + + pjl_set_job(job_id, user, title); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "StartJob")) != NULL) + pjl_write(ppd, attr->value, NULL, job_id, user, title, num_options, + options); + + snprintf(spec, sizeof(spec), "RENDERMODE.%s", colormodel); + if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) + printf("@PJL SET RENDERMODE=%s\r\n", attr->value); + + snprintf(spec, sizeof(spec), "COLORSPACE.%s", colormodel); + if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) + printf("@PJL SET COLORSPACE=%s\r\n", attr->value); + + snprintf(spec, sizeof(spec), "RENDERINTENT.%s", colormodel); + if ((attr = ppdFindAttr(ppd, "cupsPJL", spec)) != NULL) + printf("@PJL SET RENDERINTENT=%s\r\n", attr->value); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "Duplex")) != NULL) + { + sprintf(s, "%d", header->Duplex); + pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); + } + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "Tumble")) != NULL) + { + sprintf(s, "%d", header->Tumble); + pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); + } + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaClass")) != NULL) + pjl_write(ppd, attr->value, header->MediaClass, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaColor")) != NULL) + pjl_write(ppd, attr->value, header->MediaColor, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "MediaType")) != NULL) + pjl_write(ppd, attr->value, header->MediaType, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "OutputType")) != NULL) + pjl_write(ppd, attr->value, header->OutputType, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsBooklet")) != NULL && + (choice = ppdFindMarkedChoice(ppd, "cupsBooklet")) != NULL) + pjl_write(ppd, attr->value, choice->choice, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "Jog")) != NULL) + { + sprintf(s, "%d", header->Jog); + pjl_write(ppd, attr->value, s, job_id, user, title, num_options, options); + } + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsPunch")) != NULL && + (choice = ppdFindMarkedChoice(ppd, "cupsPunch")) != NULL) + pjl_write(ppd, attr->value, choice->choice, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsStaple")) != NULL && + (choice = ppdFindMarkedChoice(ppd, "cupsStaple")) != NULL) + pjl_write(ppd, attr->value, choice->choice, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsRET")) != NULL && + (choice = ppdFindMarkedChoice(ppd, "cupsRET")) != NULL) + pjl_write(ppd, attr->value, choice->choice, job_id, user, title, + num_options, options); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "cupsTonerSave")) != NULL && + (choice = ppdFindMarkedChoice(ppd, "cupsTonerSave")) != NULL) + pjl_write(ppd, attr->value, choice->choice, job_id, user, title, + num_options, options); + + if (ppd->model_number & PCL_PJL_PAPERWIDTH) + { + printf("@PJL SET PAPERLENGTH=%d\r\n", header->PageSize[1] * 10); + printf("@PJL SET PAPERWIDTH=%d\r\n", header->PageSize[0] * 10); + } + + if (ppd->model_number & PCL_PJL_RESOLUTION) + printf("@PJL SET RESOLUTION=%d\r\n", header->HWResolution[0]); + + if (ppd->model_number & PCL_PJL_HPGL2) + pjl_enter_language("HPGL2"); + else if (ppd->model_number & PCL_PJL_PCL3GUI) + pjl_enter_language("PCL3GUI"); + else + pjl_enter_language("PCL"); + } + + if (Page == 1) + { + pcl_reset(); + } + + if (ppd->model_number & PCL_PJL_HPGL2) + { + if (Page == 1) + { + /* + * HP-GL/2 initialization... + */ + + printf("IN;"); + printf("MG\"%d %s %s\";", job_id, user, title); + } + + /* + * Set media size, position, type, etc... + */ + + printf("BP5,0;"); + printf("PS%.0f,%.0f;", + header->cupsHeight * 1016.0 / header->HWResolution[1], + header->cupsWidth * 1016.0 / header->HWResolution[0]); + printf("PU;"); + printf("PA0,0"); + + printf("MT%d;", header->cupsMediaType); + + if (header->CutMedia == CUPS_CUT_PAGE) + printf("EC;"); + else + printf("EC0;"); + + /* + * Set graphics mode... + */ + + pcl_set_pcl_mode(0); + pcl_set_negative_motion(); + } + else + { + /* + * Set media size, position, type, etc... + */ + + if (!header->Duplex || (Page & 1)) + { + pcl_set_media_size(ppd, header->PageSize[0], header->PageSize[1]); + + if (header->MediaPosition) + pcl_set_media_source(header->MediaPosition); + + pcl_set_media_type(header->cupsMediaType); + + if (ppdFindAttr(ppd, "cupsPJL", "Duplex") == NULL) + pcl_set_duplex(header->Duplex, header->Tumble); + + /* + * Set the number of copies... + */ + + if (!ppd->manual_copies) + pcl_set_copies(header->NumCopies); + + /* + * Set the output order/bin... + */ + + if (ppdFindAttr(ppd, "cupsPJL", "Jog") == NULL && header->Jog) + printf("\033&l%dG", header->Jog); + } + else + { + /* + * Print on the back side... + */ + + printf("\033&a2G"); + } + + if (header->Duplex && (ppd->model_number & PCL_RASTER_CRD)) + { + /* + * Reload the media... + */ + + pcl_set_media_source(-2); + } + + /* + * Set the units for cursor positioning and go to the top of the form. + */ + + printf("\033&u%dD", header->HWResolution[0]); + printf("\033*p0Y\033*p0X"); + } + + if ((attr = cupsFindAttr(ppd, "cupsPCLQuality", colormodel, + header->MediaType, resolution, spec, + sizeof(spec))) != NULL) + { + /* + * Set the print quality... + */ + + if (ppd->model_number & PCL_PJL_HPGL2) + printf("QM%d", atoi(attr->value)); + else + printf("\033*o%dM", atoi(attr->value)); + } + + /* + * Enter graphics mode... + */ + + if (ppd->model_number & PCL_RASTER_CRD) + { + /* + * Use configure raster data command... + */ + + if (OutputMode == OUTPUT_RGB) + { + /* + * Send 12-byte configure raster data command with horizontal and + * vertical resolutions as well as a color count... + */ + + if ((attr = cupsFindAttr(ppd, "cupsPCLCRDMode", colormodel, + header->MediaType, resolution, spec, + sizeof(spec))) != NULL) + i = atoi(attr->value); + else + i = 31; + + printf("\033*g12W"); + putchar(6); /* Format 6 */ + putchar(i); /* Set pen mode */ + putchar(0x00); /* Number components */ + putchar(0x01); /* (1 for RGB) */ + + putchar(header->HWResolution[0] >> 8); + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + + putchar(header->cupsCompression); /* Compression mode 3 or 10 */ + putchar(0x01); /* Portrait orientation */ + putchar(0x20); /* Bits per pixel (32 = RGB) */ + putchar(0x01); /* Planes per pixel (1 = chunky RGB) */ + } + else + { + /* + * Send the configure raster data command with horizontal and + * vertical resolutions as well as a color count... + */ + + printf("\033*g%dW", PrinterPlanes * 6 + 2); + putchar(2); /* Format 2 */ + putchar(PrinterPlanes); /* Output planes */ + + order = ColorOrders[PrinterPlanes - 1]; + + for (i = 0; i < PrinterPlanes; i ++) + { + plane = order[i]; + + putchar(header->HWResolution[0] >> 8); + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + putchar(0); + putchar(1 << DotBits[plane]); + } + } + } + else if ((ppd->model_number & PCL_RASTER_CID) && OutputMode == OUTPUT_RGB) + { + /* + * Use configure image data command... + */ + + pcl_set_simple_resolution(header->HWResolution[0]); + /* Set output resolution */ + + cupsWritePrintData("\033*v6W\0\3\0\10\10\10", 11); + /* 24-bit RGB */ + } + else + { + /* + * Use simple raster commands... + */ + + pcl_set_simple_resolution(header->HWResolution[0]); + /* Set output resolution */ + + if (PrinterPlanes == 3) + pcl_set_simple_cmy(); + else if (PrinterPlanes == 4) + pcl_set_simple_kcmy(); + } + + if ((attr = ppdFindAttr(ppd, "cupsPCLOrigin", "X")) != NULL) + xorigin = atoi(attr->value); + else + xorigin = 0; + + if ((attr = ppdFindAttr(ppd, "cupsPCLOrigin", "Y")) != NULL) + yorigin = atoi(attr->value); + else + yorigin = 120; + + printf("\033&a%dH\033&a%dV", xorigin, yorigin); + printf("\033*r%dS", header->cupsWidth); + printf("\033*r%dT", header->cupsHeight); + printf("\033*r1A"); + + if (header->cupsCompression && header->cupsCompression != 10) + printf("\033*b%dM", header->cupsCompression); + + OutputFeed = 0; + + /* + * Allocate memory for the page... + */ + + PixelBuffer = malloc(header->cupsBytesPerLine); + + if (OutputMode == OUTPUT_DITHERED) + { + InputBuffer = malloc(header->cupsWidth * PrinterPlanes * 2); + OutputBuffers[0] = malloc(PrinterPlanes * header->cupsWidth); + + for (i = 1; i < PrinterPlanes; i ++) + OutputBuffers[i] = OutputBuffers[0] + i * header->cupsWidth; + + if (RGB) + CMYKBuffer = malloc(header->cupsWidth * PrinterPlanes); + + for (plane = 0, DotBufferSize = 0; plane < PrinterPlanes; plane ++) + { + DotBufferSizes[plane] = (header->cupsWidth + 7) / 8 * DotBits[plane]; + DotBufferSize += DotBufferSizes[plane]; + } + + DotBuffers[0] = malloc(DotBufferSize); + for (plane = 1; plane < PrinterPlanes; plane ++) + DotBuffers[plane] = DotBuffers[plane - 1] + DotBufferSizes[plane - 1]; + } + + if (header->cupsCompression) + CompBuffer = malloc(DotBufferSize * 4); + + if (header->cupsCompression >= 3) + SeedBuffer = malloc(DotBufferSize); + + SeedInvalid = 1; + + fprintf(stderr, "BlankValue=%d\n", BlankValue); +} + + +/* + * 'EndPage()' - Finish a page of graphics. + */ + +void +EndPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int plane; /* Current plane */ + + + /* + * End graphics mode... + */ + + if (ppd->model_number & PCL_RASTER_END_COLOR) + printf("\033*rC"); /* End color GFX */ + else + printf("\033*r0B"); /* End B&W GFX */ + + /* + * Output a page eject sequence... + */ + + if (ppd->model_number & PCL_PJL_HPGL2) + { + pcl_set_hpgl_mode(0); /* Back to HP-GL/2 mode */ + printf("PG;"); /* Eject the current page */ + } + else if (!(header->Duplex && (Page & 1))) + printf("\014"); /* Eject current page */ + + /* + * Free memory for the page... + */ + + free(PixelBuffer); + + if (OutputMode == OUTPUT_DITHERED) + { + for (plane = 0; plane < PrinterPlanes; plane ++) + { + cupsDitherDelete(DitherStates[plane]); + cupsLutDelete(DitherLuts[plane]); + } + + free(DotBuffers[0]); + free(InputBuffer); + free(OutputBuffers[0]); + + cupsCMYKDelete(CMYK); + + if (RGB) + { + cupsRGBDelete(RGB); + free(CMYKBuffer); + } + } + + if (header->cupsCompression) + free(CompBuffer); + + if (header->cupsCompression >= 3) + free(SeedBuffer); +} + + +/* + * 'Shutdown()' - Shutdown a printer. + */ + +void +Shutdown(ppd_file_t *ppd, /* I - PPD file */ + int job_id, /* I - Job ID */ + const char *user, /* I - User printing job */ + const char *title, /* I - Title of job */ + int num_options,/* I - Number of command-line options */ + cups_option_t *options) /* I - Command-line options */ +{ + ppd_attr_t *attr; /* Attribute from PPD file */ + + + if ((attr = ppdFindAttr(ppd, "cupsPCL", "EndJob")) != NULL) + { + /* + * Tell the printer how many pages were in the job... + */ + + putchar(0x1b); + printf(attr->value, Page); + } + else + { + /* + * Return the printer to the default state... + */ + + pcl_reset(); + } + + if (ppd->model_number & PCL_PJL) + { + pjl_escape(); + + if ((attr = ppdFindAttr(ppd, "cupsPJL", "EndJob")) != NULL) + pjl_write(ppd, attr->value, NULL, job_id, user, title, num_options, + options); + else + printf("@PJL EOJ\r\n"); + + pjl_escape(); + } +} + + +/* + * 'CancelJob()' - Cancel the current job... + */ + +void +CancelJob(int sig) /* I - Signal */ +{ + (void)sig; + + Canceled = 1; +} + + +/* + * 'CompressData()' - Compress a line of graphics. + */ + +void +CompressData(unsigned char *line, /* I - Data to compress */ + int length, /* I - Number of bytes */ + int plane, /* I - Color plane */ + int pend, /* I - End character for data */ + int type) /* I - Type of compression */ +{ + unsigned char *line_ptr, /* Current byte pointer */ + *line_end, /* End-of-line byte pointer */ + *comp_ptr, /* Pointer into compression buffer */ + *start, /* Start of compression sequence */ + *seed; /* Seed buffer pointer */ + int count, /* Count of bytes for output */ + offset, /* Offset of bytes for output */ + temp; /* Temporary count */ + int r, g, b; /* RGB deltas for mode 10 compression */ + + + switch (type) + { + default : + /* + * Do no compression; with a mode-0 only printer, we can compress blank + * lines... + */ + + line_ptr = line; + + if (cupsCheckBytes(line, length)) + line_end = line; /* Blank line */ + else + line_end = line + length; /* Non-blank line */ + break; + + case 1 : + /* + * Do run-length encoding... + */ + + line_end = line + length; + for (line_ptr = line, comp_ptr = CompBuffer; + line_ptr < line_end; + comp_ptr += 2, line_ptr += count) + { + for (count = 1; + (line_ptr + count) < line_end && + line_ptr[0] == line_ptr[count] && + count < 256; + count ++); + + comp_ptr[0] = count - 1; + comp_ptr[1] = line_ptr[0]; + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + break; + + case 2 : + /* + * Do TIFF pack-bits encoding... + */ + + line_ptr = line; + line_end = line + length; + comp_ptr = CompBuffer; + + while (line_ptr < line_end) + { + if ((line_ptr + 1) >= line_end) + { + /* + * Single byte on the end... + */ + + *comp_ptr++ = 0x00; + *comp_ptr++ = *line_ptr++; + } + else if (line_ptr[0] == line_ptr[1]) + { + /* + * Repeated sequence... + */ + + line_ptr ++; + count = 2; + + while (line_ptr < (line_end - 1) && + line_ptr[0] == line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = 257 - count; + *comp_ptr++ = *line_ptr++; + } + else + { + /* + * Non-repeated sequence... + */ + + start = line_ptr; + line_ptr ++; + count = 1; + + while (line_ptr < (line_end - 1) && + line_ptr[0] != line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = count - 1; + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + break; + + case 3 : + /* + * Do delta-row compression... + */ + + line_ptr = line; + line_end = line + length; + + comp_ptr = CompBuffer; + seed = SeedBuffer + plane * length; + + while (line_ptr < line_end) + { + /* + * Find the next non-matching sequence... + */ + + start = line_ptr; + + if (SeedInvalid) + { + /* + * The seed buffer is invalid, so do the next 8 bytes, max... + */ + + offset = 0; + + if ((count = line_end - line_ptr) > 8) + count = 8; + + line_ptr += count; + } + else + { + /* + * The seed buffer is valid, so compare against it... + */ + + while (*line_ptr == *seed && + line_ptr < line_end) + { + line_ptr ++; + seed ++; + } + + if (line_ptr == line_end) + break; + + offset = line_ptr - start; + + /* + * Find up to 8 non-matching bytes... + */ + + start = line_ptr; + count = 0; + while (*line_ptr != *seed && + line_ptr < line_end && + count < 8) + { + line_ptr ++; + seed ++; + count ++; + } + } + + /* + * Place mode 3 compression data in the buffer; see HP manuals + * for details... + */ + + if (offset >= 31) + { + /* + * Output multi-byte offset... + */ + + *comp_ptr++ = ((count - 1) << 5) | 31; + + offset -= 31; + while (offset >= 255) + { + *comp_ptr++ = 255; + offset -= 255; + } + + *comp_ptr++ = offset; + } + else + { + /* + * Output single-byte offset... + */ + + *comp_ptr++ = ((count - 1) << 5) | offset; + } + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + + memcpy(SeedBuffer + plane * length, line, length); + break; + + case 10 : + /* + * Mode 10 "near lossless" RGB compression... + */ + + line_ptr = line; + line_end = line + length; + + comp_ptr = CompBuffer; + seed = SeedBuffer; + + if (PrinterPlanes == 1) + { + /* + * Do grayscale compression to RGB... + */ + + while (line_ptr < line_end) + { + /* + * Find the next non-matching sequence... + */ + + start = line_ptr; + while (line_ptr < line_end && + *line_ptr == *seed) + { + line_ptr ++; + seed ++; + } + + if (line_ptr == line_end) + break; + + offset = line_ptr - start; + + /* + * Find non-matching grayscale pixels... + */ + + start = line_ptr; + while (line_ptr < line_end && + *line_ptr != *seed) + { + line_ptr ++; + seed ++; + } + + count = line_ptr - start; + +#if 0 + fprintf(stderr, "DEBUG: offset=%d, count=%d, comp_ptr=%p(%d of %d)...\n", + offset, count, comp_ptr, comp_ptr - CompBuffer, + BytesPerLine * 5); +#endif /* 0 */ + + /* + * Place mode 10 compression data in the buffer; each sequence + * starts with a command byte that looks like: + * + * CMD SRC SRC OFF OFF CNT CNT CNT + * + * For the purpose of this driver, CMD and SRC are always 0. + * + * If the offset >= 3 then additional offset bytes follow the + * first command byte, each byte == 255 until the last one. + * + * If the count >= 7, then additional count bytes follow each + * group of pixels, each byte == 255 until the last one. + * + * The offset and count are in RGB tuples (not bytes, as for + * Mode 3 and 9)... + */ + + if (offset >= 3) + { + /* + * Output multi-byte offset... + */ + + if (count > 7) + *comp_ptr++ = 0x1f; + else + *comp_ptr++ = 0x18 | (count - 1); + + offset -= 3; + while (offset >= 255) + { + *comp_ptr++ = 255; + offset -= 255; + } + + *comp_ptr++ = offset; + } + else + { + /* + * Output single-byte offset... + */ + + if (count > 7) + *comp_ptr++ = (offset << 3) | 0x07; + else + *comp_ptr++ = (offset << 3) | (count - 1); + } + + temp = count - 8; + seed -= count; + + while (count > 0) + { + if (count <= temp) + { + /* + * This is exceedingly lame... The replacement counts + * are intermingled with the data... + */ + + if (temp >= 255) + *comp_ptr++ = 255; + else + *comp_ptr++ = temp; + + temp -= 255; + } + + /* + * Get difference between current and see pixels... + */ + + r = *start - *seed; + g = r; + b = ((*start & 0xfe) - (*seed & 0xfe)) / 2; + + if (r < -16 || r > 15 || g < -16 || g > 15 || b < -16 || b > 15) + { + /* + * Pack 24-bit RGB into 23 bits... Lame... + */ + + g = *start; + + *comp_ptr++ = g >> 1; + + if (g & 1) + *comp_ptr++ = 0x80 | (g >> 1); + else + *comp_ptr++ = g >> 1; + + if (g & 1) + *comp_ptr++ = 0x80 | (g >> 1); + else + *comp_ptr++ = g >> 1; + } + else + { + /* + * Pack 15-bit RGB difference... + */ + + *comp_ptr++ = 0x80 | ((r << 2) & 0x7c) | ((g >> 3) & 0x03); + *comp_ptr++ = ((g << 5) & 0xe0) | (b & 0x1f); + } + + count --; + start ++; + seed ++; + } + + /* + * Make sure we have the ending count if the replacement count + * was exactly 8 + 255n... + */ + + if (temp == 0) + *comp_ptr++ = 0; + } + } + else + { + /* + * Do RGB compression... + */ + + while (line_ptr < line_end) + { + /* + * Find the next non-matching sequence... + */ + + start = line_ptr; + while (line_ptr[0] == seed[0] && + line_ptr[1] == seed[1] && + line_ptr[2] == seed[2] && + (line_ptr + 2) < line_end) + { + line_ptr += 3; + seed += 3; + } + + if (line_ptr == line_end) + break; + + offset = (line_ptr - start) / 3; + + /* + * Find non-matching RGB tuples... + */ + + start = line_ptr; + while ((line_ptr[0] != seed[0] || + line_ptr[1] != seed[1] || + line_ptr[2] != seed[2]) && + (line_ptr + 2) < line_end) + { + line_ptr += 3; + seed += 3; + } + + count = (line_ptr - start) / 3; + + /* + * Place mode 10 compression data in the buffer; each sequence + * starts with a command byte that looks like: + * + * CMD SRC SRC OFF OFF CNT CNT CNT + * + * For the purpose of this driver, CMD and SRC are always 0. + * + * If the offset >= 3 then additional offset bytes follow the + * first command byte, each byte == 255 until the last one. + * + * If the count >= 7, then additional count bytes follow each + * group of pixels, each byte == 255 until the last one. + * + * The offset and count are in RGB tuples (not bytes, as for + * Mode 3 and 9)... + */ + + if (offset >= 3) + { + /* + * Output multi-byte offset... + */ + + if (count > 7) + *comp_ptr++ = 0x1f; + else + *comp_ptr++ = 0x18 | (count - 1); + + offset -= 3; + while (offset >= 255) + { + *comp_ptr++ = 255; + offset -= 255; + } + + *comp_ptr++ = offset; + } + else + { + /* + * Output single-byte offset... + */ + + if (count > 7) + *comp_ptr++ = (offset << 3) | 0x07; + else + *comp_ptr++ = (offset << 3) | (count - 1); + } + + temp = count - 8; + seed -= count * 3; + + while (count > 0) + { + if (count <= temp) + { + /* + * This is exceedingly lame... The replacement counts + * are intermingled with the data... + */ + + if (temp >= 255) + *comp_ptr++ = 255; + else + *comp_ptr++ = temp; + + temp -= 255; + } + + /* + * Get difference between current and see pixels... + */ + + r = start[0] - seed[0]; + g = start[1] - seed[1]; + b = ((start[2] & 0xfe) - (seed[2] & 0xfe)) / 2; + + if (r < -16 || r > 15 || g < -16 || g > 15 || b < -16 || b > 15) + { + /* + * Pack 24-bit RGB into 23 bits... Lame... + */ + + *comp_ptr++ = start[0] >> 1; + + if (start[0] & 1) + *comp_ptr++ = 0x80 | (start[1] >> 1); + else + *comp_ptr++ = start[1] >> 1; + + if (start[1] & 1) + *comp_ptr++ = 0x80 | (start[2] >> 1); + else + *comp_ptr++ = start[2] >> 1; + } + else + { + /* + * Pack 15-bit RGB difference... + */ + + *comp_ptr++ = 0x80 | ((r << 2) & 0x7c) | ((g >> 3) & 0x03); + *comp_ptr++ = ((g << 5) & 0xe0) | (b & 0x1f); + } + + count --; + start += 3; + seed += 3; + } + + /* + * Make sure we have the ending count if the replacement count + * was exactly 8 + 255n... + */ + + if (temp == 0) + *comp_ptr++ = 0; + } + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + + memcpy(SeedBuffer, line, length); + break; + } + + /* + * Set the length of the data and write a raster plane... + */ + + printf("\033*b%d%c", (int)(line_end - line_ptr), pend); + cupsWritePrintData(line_ptr, line_end - line_ptr); +} + + +/* + * 'OutputLine()' - Output the specified number of lines of graphics. + */ + +void +OutputLine(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int i, j; /* Looping vars */ + int plane; /* Current plane */ + unsigned char bit; /* Current bit */ + int bytes; /* Number of bytes/plane */ + int width; /* Width of line in pixels */ + const int *order; /* Order to use */ + unsigned char *ptr; /* Pointer into buffer */ + + + /* + * Output whitespace as needed... + */ + + if (OutputFeed > 0) + { + if (header->cupsCompression < 3) + { + /* + * Send blank raster lines... + */ + + while (OutputFeed > 0) + { + printf("\033*b0W"); + OutputFeed --; + } + } + else + { + /* + * Send Y offset command and invalidate the seed buffer... + */ + + printf("\033*b%dY", OutputFeed); + OutputFeed = 0; + SeedInvalid = 1; + } + } + + /* + * Write bitmap data as needed... + */ + + switch (OutputMode) + { + case OUTPUT_BITMAP : /* Send 1-bit bitmap data... */ + order = ColorOrders[PrinterPlanes - 1]; + bytes = header->cupsBytesPerLine / PrinterPlanes; + + for (i = 0; i < PrinterPlanes; i ++) + { + plane = order[i]; + + CompressData(PixelBuffer + i * bytes, bytes, plane, + (i < (PrinterPlanes - 1)) ? 'V' : 'W', + header->cupsCompression); + } + break; + + case OUTPUT_INVERBIT : /* Send inverted 1-bit bitmap data... */ + order = ColorOrders[PrinterPlanes - 1]; + bytes = header->cupsBytesPerLine / PrinterPlanes; + + for (i = header->cupsBytesPerLine, ptr = PixelBuffer; + i > 0; + i --, ptr ++) + *ptr = ~*ptr; + + for (i = 0; i < PrinterPlanes; i ++) + { + plane = order[i]; + + CompressData(PixelBuffer + i * bytes, bytes, plane, + (i < (PrinterPlanes - 1)) ? 'V' : 'W', + header->cupsCompression); + } + break; + + case OUTPUT_RGB : /* Send 24-bit RGB data... */ + if (PrinterPlanes == 1 && !BlankValue) + { + /* + * Invert black to grayscale... + */ + + for (i = header->cupsBytesPerLine, ptr = PixelBuffer; + i > 0; + i --, ptr ++) + *ptr = ~*ptr; + } + + /* + * Compress the output... + */ + + CompressData(PixelBuffer, header->cupsBytesPerLine, 0, 'W', + header->cupsCompression); + break; + + default : + order = ColorOrders[PrinterPlanes - 1]; + width = header->cupsWidth; + + for (i = 0, j = 0; i < PrinterPlanes; i ++) + { + plane = order[i]; + bytes = DotBufferSizes[plane] / DotBits[plane]; + + for (bit = 1, ptr = DotBuffers[plane]; + bit <= DotBits[plane]; + bit <<= 1, ptr += bytes, j ++) + { + cupsPackHorizontalBit(OutputBuffers[plane], DotBuffers[plane], + width, 0, bit); + CompressData(ptr, bytes, j, + i == (PrinterPlanes - 1) && + bit == DotBits[plane] ? 'W' : 'V', + header->cupsCompression); + } + } + break; + } + + /* + * The seed buffer, if any, now should contain valid data... + */ + + SeedInvalid = 0; +} + + +/* + * 'ReadLine()' - Read graphics from the page stream. + */ + +int /* O - Number of lines (0 if blank) */ +ReadLine(cups_raster_t *ras, /* I - Raster stream */ + cups_page_header2_t *header) /* I - Page header */ +{ + int plane, /* Current color plane */ + width; /* Width of line */ + + + /* + * Read raster data... + */ + + cupsRasterReadPixels(ras, PixelBuffer, header->cupsBytesPerLine); + + /* + * See if it is blank; if so, return right away... + */ + + if (cupsCheckValue(PixelBuffer, header->cupsBytesPerLine, BlankValue)) + return (0); + + /* + * If we aren't dithering, return immediately... + */ + + if (OutputMode != OUTPUT_DITHERED) + return (1); + + /* + * Perform the color separation... + */ + + width = header->cupsWidth; + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_W : + if (RGB) + { + cupsRGBDoGray(RGB, PixelBuffer, CMYKBuffer, width); + + if (RGB->num_channels == 1) + cupsCMYKDoBlack(CMYK, CMYKBuffer, InputBuffer, width); + else + cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); + } + else + cupsCMYKDoGray(CMYK, PixelBuffer, InputBuffer, width); + break; + + case CUPS_CSPACE_K : + cupsCMYKDoBlack(CMYK, PixelBuffer, InputBuffer, width); + break; + + default : + case CUPS_CSPACE_RGB : + if (RGB) + { + cupsRGBDoRGB(RGB, PixelBuffer, CMYKBuffer, width); + + if (RGB->num_channels == 1) + cupsCMYKDoBlack(CMYK, CMYKBuffer, InputBuffer, width); + else + cupsCMYKDoCMYK(CMYK, CMYKBuffer, InputBuffer, width); + } + else + cupsCMYKDoRGB(CMYK, PixelBuffer, InputBuffer, width); + break; + + case CUPS_CSPACE_CMYK : + cupsCMYKDoCMYK(CMYK, PixelBuffer, InputBuffer, width); + break; + } + + /* + * Dither the pixels... + */ + + for (plane = 0; plane < PrinterPlanes; plane ++) + cupsDitherLine(DitherStates[plane], DitherLuts[plane], InputBuffer + plane, + PrinterPlanes, OutputBuffers[plane]); + + /* + * Return 1 to indicate that we have non-blank output... + */ + + return (1); +} + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ + int job_id; /* Job ID */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("%s job-id user title copies options [file]"), + "rastertopclx"); + return (1); + } + + num_options = cupsParseOptions(argv[5], 0, &options); + + /* + * Open the PPD file... + */ + + ppd = ppdOpenFile(getenv("PPD")); + + if (!ppd) + { + ppd_status_t status; /* PPD error */ + int linenum; /* Line number */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("The PPD file could not be opened.")); + + status = ppdLastError(&linenum); + + fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); + + return (1); + } + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open raster file")); + return (1); + } + } + else + fd = 0; + + ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* + * Process pages as needed... + */ + + job_id = atoi(argv[1]); + + Page = 0; + + while (cupsRasterReadHeader2(ras, &header)) + { + /* + * Write a status message with the page number and number of copies. + */ + + if (Canceled) + break; + + Page ++; + + fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies); + _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); + + StartPage(ppd, &header, atoi(argv[1]), argv[2], argv[3], + num_options, options); + + for (y = 0; y < (int)header.cupsHeight; y ++) + { + /* + * Let the user know how far we have progressed... + */ + + if (Canceled) + break; + + if ((y & 127) == 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printing page %d, %d%% complete."), + Page, 100 * y / header.cupsHeight); + fprintf(stderr, "ATTR: job-media-progress=%d\n", + 100 * y / header.cupsHeight); + } + + /* + * Read and write a line of graphics or whitespace... + */ + + if (ReadLine(ras, &header)) + OutputLine(ppd, &header); + else + OutputFeed ++; + } + + /* + * Eject the page... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); + + EndPage(ppd, &header); + + if (Canceled) + break; + } + + Shutdown(ppd, job_id, argv[2], argv[3], num_options, options); + + cupsFreeOptions(num_options, options); + + cupsRasterClose(ras); + + if (fd != 0) + close(fd); + + if (Page == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); + return (1); + } + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (0); + } +} + + +/* + * End of "$Id: rastertopclx.c 9382 2010-11-20 01:03:46Z mike $". + */ diff --git a/driver/rgb.c b/driver/rgb.c new file mode 100644 index 0000000..b1fe9fe --- /dev/null +++ b/driver/rgb.c @@ -0,0 +1,558 @@ +/* + * "$Id: rgb.c 7306 2008-02-15 00:52:38Z mike $" + * + * RGB color separation code for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsRGBDelete() - Delete a color separation. + * cupsRGBDoGray() - Do a grayscale separation... + * cupsRGBDoRGB() - Do a RGB separation... + * cupsRGBLoad() - Load a RGB color profile from a PPD file. + * cupsRGBNew() - Create a new RGB color separation. + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" + + +/* + * 'cupsRGBDelete()' - Delete a color separation. + */ + +void +cupsRGBDelete(cups_rgb_t *rgbptr) /* I - Color separation */ +{ + if (rgbptr == NULL) + return; + + free(rgbptr->colors[0][0][0]); + free(rgbptr->colors[0][0]); + free(rgbptr->colors[0]); + free(rgbptr->colors); + free(rgbptr); +} + + +/* + * 'cupsRGBDoGray()' - Do a grayscale separation... + */ + +void +cupsRGBDoGray(cups_rgb_t *rgbptr, + /* I - Color separation */ + const unsigned char *input, + /* I - Input grayscale pixels */ + unsigned char *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int i; /* Looping var */ + int lastgray; /* Previous grayscale */ + int xs, ys, zs, /* Current RGB row offsets */ + g, gi, gm0, gm1;/* Current gray index and multipliers ... */ + const unsigned char *color; /* Current color data */ + int tempg; /* Current separation color */ + int rgbsize; /* Separation data size */ + + + /* + * Range check input... + */ + + if (!rgbptr || !input || !output || num_pixels <= 0) + return; + + /* + * Initialize variables used for the duration of the separation... + */ + + lastgray = -1; + rgbsize = rgbptr->num_channels; + xs = rgbptr->cube_size * rgbptr->cube_size * rgbptr->num_channels; + ys = rgbptr->cube_size * rgbptr->num_channels; + zs = rgbptr->num_channels; + + /* + * Loop through it all... + */ + + while (num_pixels > 0) + { + /* + * See if the next pixel is a cached value... + */ + + num_pixels --; + + g = cups_srgb_lut[*input++]; + + if (g == lastgray) + { + /* + * Copy previous color and continue... + */ + + memcpy(output, output - rgbptr->num_channels, rgbsize); + + output += rgbptr->num_channels; + continue; + } + else if (g == 0x00 && rgbptr->cache_init) + { + /* + * Copy black color and continue... + */ + + memcpy(output, rgbptr->black, rgbsize); + + output += rgbptr->num_channels; + continue; + } + else if (g == 0xff && rgbptr->cache_init) + { + /* + * Copy white color and continue... + */ + + memcpy(output, rgbptr->white, rgbsize); + + output += rgbptr->num_channels; + continue; + } + + /* + * Nope, figure this one out on our own... + */ + + gi = rgbptr->cube_index[g]; + gm0 = rgbptr->cube_mult[g]; + gm1 = 256 - gm0; + + color = rgbptr->colors[gi][gi][gi]; + + for (i = 0; i < rgbptr->num_channels; i ++, color ++) + { + tempg = (color[0] * gm0 + color[xs + ys + zs] * gm1) / 256; + + if (tempg > 255) + *output++ = 255; + else if (tempg < 0) + *output++ = 0; + else + *output++ = tempg; + } + } +} + + +/* + * 'cupsRGBDoRGB()' - Do a RGB separation... + */ + +void +cupsRGBDoRGB(cups_rgb_t *rgbptr, + /* I - Color separation */ + const unsigned char *input, + /* I - Input RGB pixels */ + unsigned char *output, + /* O - Output Device-N pixels */ + int num_pixels) + /* I - Number of pixels */ +{ + int i; /* Looping var */ + int rgb, /* Current RGB color */ + lastrgb; /* Previous RGB color */ + int r, ri, rm0, rm1, rs, + /* Current red index, multipliexs, and row offset */ + g, gi, gm0, gm1, gs, + /* Current green ... */ + b, bi, bm0, bm1, bs; + /* Current blue ... */ + const unsigned char *color; /* Current color data */ + int tempr, /* Current separation colors */ + tempg, /* ... */ + tempb ; /* ... */ + int rgbsize; /* Separation data size */ + + + /* + * Range check input... + */ + + if (!rgbptr || !input || !output || num_pixels <= 0) + return; + + /* + * Initialize variables used for the duration of the separation... + */ + + lastrgb = -1; + rgbsize = rgbptr->num_channels; + rs = rgbptr->cube_size * rgbptr->cube_size * rgbptr->num_channels; + gs = rgbptr->cube_size * rgbptr->num_channels; + bs = rgbptr->num_channels; + + /* + * Loop through it all... + */ + + while (num_pixels > 0) + { + /* + * See if the next pixel is a cached value... + */ + + num_pixels --; + + r = cups_srgb_lut[*input++]; + g = cups_srgb_lut[*input++]; + b = cups_srgb_lut[*input++]; + rgb = (((r << 8) | g) << 8) | b; + + if (rgb == lastrgb) + { + /* + * Copy previous color and continue... + */ + + memcpy(output, output - rgbptr->num_channels, rgbsize); + + output += rgbptr->num_channels; + continue; + } + else if (rgb == 0x000000 && rgbptr->cache_init) + { + /* + * Copy black color and continue... + */ + + memcpy(output, rgbptr->black, rgbsize); + + output += rgbptr->num_channels; + continue; + } + else if (rgb == 0xffffff && rgbptr->cache_init) + { + /* + * Copy white color and continue... + */ + + memcpy(output, rgbptr->white, rgbsize); + + output += rgbptr->num_channels; + continue; + } + + /* + * Nope, figure this one out on our own... + */ + + ri = rgbptr->cube_index[r]; + rm0 = rgbptr->cube_mult[r]; + rm1 = 256 - rm0; + + gi = rgbptr->cube_index[g]; + gm0 = rgbptr->cube_mult[g]; + gm1 = 256 - gm0; + + bi = rgbptr->cube_index[b]; + bm0 = rgbptr->cube_mult[b]; + bm1 = 256 - bm0; + + color = rgbptr->colors[ri][gi][bi]; + + for (i = rgbptr->num_channels; i > 0; i --, color ++) + { + tempb = (color[0] * bm0 + color[bs] * bm1) / 256; + tempg = tempb * gm0; + tempb = (color[gs] * gm0 + color[gs + bs] * bm1) / 256; + tempg = (tempg + tempb * gm1) / 256; + + tempr = tempg * rm0; + + tempb = (color[rs] * bm0 + color[rs + bs] * bm1) / 256; + tempg = tempb * gm0; + tempb = (color[rs + gs] * bm0 + color[rs + gs + bs] * bm1) / 256; + tempg = (tempg + tempb * gm1) / 256; + + tempr = (tempr + tempg * rm1) / 256; + + if (tempr > 255) + *output++ = 255; + else if (tempr < 0) + *output++ = 0; + else + *output++ = tempr; + } + } +} + + +/* + * 'cupsRGBLoad()' - Load a RGB color profile from a PPD file. + */ + +cups_rgb_t * /* O - New color profile */ +cupsRGBLoad(ppd_file_t *ppd, /* I - PPD file */ + const char *colormodel, /* I - Color model */ + const char *media, /* I - Media type */ + const char *resolution) /* I - Resolution */ +{ + int i, /* Looping var */ + cube_size, /* Size of color lookup cube */ + num_channels, /* Number of color channels */ + num_samples; /* Number of color samples */ + cups_sample_t *samples; /* Color samples */ + float values[7]; /* Color sample values */ + char spec[PPD_MAX_NAME]; /* Profile name */ + ppd_attr_t *attr; /* Attribute from PPD file */ + cups_rgb_t *rgbptr; /* RGB color profile */ + + + /* + * Find the following attributes: + * + * cupsRGBProfile - Specifies the cube size, number of channels, and + * number of samples + * cupsRGBSample - Specifies an RGB to CMYK color sample + */ + + if ((attr = cupsFindAttr(ppd, "cupsRGBProfile", colormodel, media, + resolution, spec, sizeof(spec))) == NULL) + { + fputs("DEBUG2: No cupsRGBProfile attribute found for the current settings!\n", stderr); + return (NULL); + } + + if (!attr->value || sscanf(attr->value, "%d%d%d", &cube_size, &num_channels, + &num_samples) != 3) + { + fprintf(stderr, "ERROR: Bad cupsRGBProfile attribute \'%s\'!\n", + attr->value ? attr->value : "(null)"); + return (NULL); + } + + if (cube_size < 2 || cube_size > 16 || + num_channels < 1 || num_channels > CUPS_MAX_RGB || + num_samples != (cube_size * cube_size * cube_size)) + { + fprintf(stderr, "ERROR: Bad cupsRGBProfile attribute \'%s\'!\n", + attr->value); + return (NULL); + } + + /* + * Allocate memory for the samples and read them... + */ + + if ((samples = calloc(num_samples, sizeof(cups_sample_t))) == NULL) + { + fputs("ERROR: Unable to allocate memory for RGB profile!\n", stderr); + return (NULL); + } + + /* + * Read all of the samples... + */ + + for (i = 0; i < num_samples; i ++) + if ((attr = ppdFindNextAttr(ppd, "cupsRGBSample", spec)) == NULL) + break; + else if (!attr->value) + { + fputs("ERROR: Bad cupsRGBSample value!\n", stderr); + break; + } + else if (sscanf(attr->value, "%f%f%f%f%f%f%f", values + 0, + values + 1, values + 2, values + 3, values + 4, values + 5, + values + 6) != (3 + num_channels)) + { + fputs("ERROR: Bad cupsRGBSample value!\n", stderr); + break; + } + else + { + samples[i].rgb[0] = (int)(255.0 * values[0] + 0.5); + samples[i].rgb[1] = (int)(255.0 * values[1] + 0.5); + samples[i].rgb[2] = (int)(255.0 * values[2] + 0.5); + samples[i].colors[0] = (int)(255.0 * values[3] + 0.5); + if (num_channels > 1) + samples[i].colors[1] = (int)(255.0 * values[4] + 0.5); + if (num_channels > 2) + samples[i].colors[2] = (int)(255.0 * values[5] + 0.5); + if (num_channels > 3) + samples[i].colors[3] = (int)(255.0 * values[6] + 0.5); + } + + /* + * If everything went OK, create the color profile... + */ + + if (i == num_samples) + rgbptr = cupsRGBNew(num_samples, samples, cube_size, num_channels); + else + rgbptr = NULL; + + /* + * Free the temporary sample array and return... + */ + + free(samples); + + return (rgbptr); +} + + +/* + * 'cupsRGBNew()' - Create a new RGB color separation. + */ + +cups_rgb_t * /* O - New color separation or NULL */ +cupsRGBNew(int num_samples, /* I - Number of samples */ + cups_sample_t *samples, /* I - Samples */ + int cube_size, /* I - Size of LUT cube */ + int num_channels) /* I - Number of color components */ +{ + cups_rgb_t *rgbptr; /* New color separation */ + int i; /* Looping var */ + int r, g, b; /* Current RGB */ + int tempsize; /* Sibe of main arrays */ + unsigned char *tempc; /* Pointer for C arrays */ + unsigned char **tempb ; /* Pointer for Z arrays */ + unsigned char ***tempg; /* Pointer for Y arrays */ + unsigned char ****tempr; /* Pointer for X array */ + unsigned char rgb[3]; /* Temporary RGB value */ + + + /* + * Range-check the input... + */ + + if (!samples || num_samples != (cube_size * cube_size * cube_size) || + num_channels <= 0 || num_channels > CUPS_MAX_RGB) + return (NULL); + + /* + * Allocate memory for the separation... + */ + + if ((rgbptr = calloc(1, sizeof(cups_rgb_t))) == NULL) + return (NULL); + + /* + * Allocate memory for the samples and the LUT cube... + */ + + tempsize = cube_size * cube_size * cube_size; /* FUTURE: num_samples < cs^3 */ + + tempc = calloc(tempsize, num_channels); + tempb = calloc(tempsize, sizeof(unsigned char *)); + tempg = calloc(cube_size * cube_size, sizeof(unsigned char **)); + tempr = calloc(cube_size, sizeof(unsigned char ***)); + + if (tempc == NULL || tempb == NULL || tempg == NULL || tempr == NULL) + { + free(rgbptr); + + if (tempc) + free(tempc); + + if (tempb) + free(tempb); + + if (tempg) + free(tempg); + + if (tempr) + free(tempr); + + return (NULL); + } + + /* + * Fill in the arrays... + */ + + for (i = 0, r = 0; r < cube_size; r ++) + { + tempr[r] = tempg + r * cube_size; + + for (g = 0; g < cube_size; g ++) + { + tempr[r][g] = tempb + i; + + for (b = 0; b < cube_size; b ++, i ++) + tempr[r][g][b] = tempc + i * num_channels; + } + } + + for (i = 0; i < num_samples; i ++) + { + r = samples[i].rgb[0] * (cube_size - 1) / 255; + g = samples[i].rgb[1] * (cube_size - 1) / 255; + b = samples[i].rgb[2] * (cube_size - 1) / 255; + + memcpy(tempr[r][g][b], samples[i].colors, num_channels); + } + + rgbptr->cube_size = cube_size; + rgbptr->num_channels = num_channels; + rgbptr->colors = tempr; + + /* + * Generate the lookup tables for the cube indices and multipliers... + */ + + for (i = 0; i < 256; i ++) + { + rgbptr->cube_index[i] = i * (cube_size - 1) / 256; + + if (i == 0) + rgbptr->cube_mult[i] = 256; + else + rgbptr->cube_mult[i] = 255 - ((i * (cube_size - 1)) & 255); + } + + /* + * Generate the black and white cache values for the separation... + */ + + rgb[0] = 0; + rgb[1] = 0; + rgb[2] = 0; + + cupsRGBDoRGB(rgbptr, rgb, rgbptr->black, 1); + + rgb[0] = 255; + rgb[1] = 255; + rgb[2] = 255; + + cupsRGBDoRGB(rgbptr, rgb, rgbptr->white, 1); + + rgbptr->cache_init = 1; + + /* + * Return the separation... + */ + + return (rgbptr); +} + + +/* + * End of "$Id: rgb.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/srgb.c b/driver/srgb.c new file mode 100644 index 0000000..0a01ec4 --- /dev/null +++ b/driver/srgb.c @@ -0,0 +1,79 @@ +/* + * "$Id: srgb.c 7306 2008-02-15 00:52:38Z mike $" + * + * sRGB lookup tables for CUPS. + * + * Copyright 2007 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" + + +/* + * sRGB gamma lookup table. + */ + +const unsigned char cups_srgb_lut[256] = +{ + 0, 20, 28, 33, 38, 42, 46, 49, 52, 55, 58, 61, 63, 65, 68, + 70, 72, 74, 76, 78, 80, 81, 83, 85, 87, 88, 90, 91, 93, 94, + 96, 97, 99, 100, 102, 103, 104, 106, 107, 108, 109, 111, 112, 113, 114, + 115, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, + 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, + 146, 147, 147, 148, 149, 150, 151, 152, 153, 153, 154, 155, 156, 157, 158, + 158, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 168, 168, 169, + 170, 171, 171, 172, 173, 174, 174, 175, 176, 176, 177, 178, 178, 179, 180, + 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, + 190, 191, 192, 192, 193, 194, 194, 195, 196, 196, 197, 197, 198, 199, 199, + 200, 200, 201, 202, 202, 203, 203, 204, 205, 205, 206, 206, 207, 208, 208, + 209, 209, 210, 210, 211, 212, 212, 213, 213, 214, 214, 215, 216, 216, 217, + 217, 218, 218, 219, 219, 220, 220, 221, 222, 222, 223, 223, 224, 224, 225, + 225, 226, 226, 227, 227, 228, 228, 229, 229, 230, 230, 231, 231, 232, 232, + 233, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 239, 240, + 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, + 248, 248, 249, 249, 249, 250, 250, 251, 251, 252, 252, 253, 253, 254, 254, + 255 +}; + + +/* + * sRGB gamma lookup table (inverted output to map to CMYK...) + */ + +const unsigned char cups_scmy_lut[256] = +{ + 255, 235, 227, 222, 217, 213, 209, 206, 203, 200, 197, 194, 192, 190, 187, + 185, 183, 181, 179, 177, 175, 174, 172, 170, 168, 167, 165, 164, 162, 161, + 159, 158, 156, 155, 153, 152, 151, 149, 148, 147, 146, 144, 143, 142, 141, + 140, 138, 137, 136, 135, 134, 133, 132, 131, 130, 129, 127, 126, 125, 124, + 123, 122, 121, 120, 119, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, + 109, 108, 108, 107, 106, 105, 104, 103, 102, 102, 101, 100, 99, 98, 97, + 97, 96, 95, 94, 93, 93, 92, 91, 90, 90, 89, 88, 87, 87, 86, + 85, 84, 84, 83, 82, 81, 81, 80, 79, 79, 78, 77, 77, 76, 75, + 74, 74, 73, 72, 72, 71, 70, 70, 69, 68, 68, 67, 66, 66, 65, + 65, 64, 63, 63, 62, 61, 61, 60, 59, 59, 58, 58, 57, 56, 56, + 55, 55, 54, 53, 53, 52, 52, 51, 50, 50, 49, 49, 48, 47, 47, + 46, 46, 45, 45, 44, 43, 43, 42, 42, 41, 41, 40, 39, 39, 38, + 38, 37, 37, 36, 36, 35, 35, 34, 33, 33, 32, 32, 31, 31, 30, + 30, 29, 29, 28, 28, 27, 27, 26, 26, 25, 25, 24, 24, 23, 23, + 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16, 15, + 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, 8, 8, + 7, 7, 6, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, + 0 +}; + + +/* + * End of "$Id: srgb.c 7306 2008-02-15 00:52:38Z mike $". + */ diff --git a/driver/testcmyk.c b/driver/testcmyk.c new file mode 100644 index 0000000..21dc1a4 --- /dev/null +++ b/driver/testcmyk.c @@ -0,0 +1,437 @@ +/* + * "$Id: testcmyk.c 9982 2011-09-09 17:32:52Z mike $" + * + * Test the CMYK color separation code for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products, All Rights Reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * test_gray() - Test grayscale separations... + * test_rgb() - Test color separations... + * main() - Do color separation tests. + */ + +/* + * Include necessary headers. + */ + +#include +#include "driver.h" +#include + + +void test_gray(int num_comps, const char *base); +void test_rgb(int num_comps, const char *base); + + +/* + * 'main()' - Do color separation tests. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + /* + * Make the test directory... + */ + + mkdir("test", 0755); + + /* + * Run tests for K, Kk, CMY, CMYK, CcMmYK, and CcMmYKk separations... + */ + + test_rgb(1, "test/K-rgb"); + test_rgb(2, "test/Kk-rgb"); + test_rgb(3, "test/CMY-rgb"); + test_rgb(4, "test/CMYK-rgb"); + test_rgb(6, "test/CcMmYK-rgb"); + test_rgb(7, "test/CcMmYKk-rgb"); + + test_gray(1, "test/K-gray"); + test_gray(2, "test/Kk-gray"); + test_gray(3, "test/CMY-gray"); + test_gray(4, "test/CMYK-gray"); + test_gray(6, "test/CcMmYK-gray"); + test_gray(7, "test/CcMmYKk-gray"); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'test_gray()' - Test grayscale separations... + */ + +void +test_gray(int num_comps, /* I - Number of components */ + const char *base) /* I - Base filename of output */ +{ + int i; /* Looping var */ + char filename[255]; /* Output filename */ + char line[255]; /* Line from PGM file */ + int width, height; /* Width and height of test image */ + int x, y; /* Current coordinate in image */ + int r, g, b; /* Current RGB color */ + unsigned char input[7000]; /* Line to separate */ + short output[48000], /* Output separation data */ + *outptr; /* Pointer in output */ + FILE *in; /* Input PPM file */ + FILE *out[CUPS_MAX_CHAN]; + /* Output PGM files */ + FILE *comp; /* Composite output */ + cups_cmyk_t *cmyk; /* Color separation */ + + + /* + * Open the test image... + */ + + in = fopen("image.pgm", "rb"); + while (fgets(line, sizeof(line), in) != NULL) + if (isdigit(line[0])) + break; + + sscanf(line, "%d%d", &width, &height); + + fgets(line, sizeof(line), in); + + /* + * Create the color separation... + */ + + cmyk = cupsCMYKNew(num_comps); + + switch (num_comps) + { + case 2 : /* Kk */ + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + break; + + case 4 : + cupsCMYKSetGamma(cmyk, 2, 1.0, 0.9); + cupsCMYKSetBlack(cmyk, 0.5, 1.0); + break; + + case 6 : /* CcMmYK */ + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); + cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9); + cupsCMYKSetBlack(cmyk, 0.5, 1.0); + break; + + case 7 : /* CcMmYKk */ + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); + cupsCMYKSetGamma(cmyk, 4, 1.0, 0.9); + cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0); + break; + } + + /* + * Open the color separation files... + */ + + for (i = 0; i < num_comps; i ++) + { + sprintf(filename, "%s%d.pgm", base, i); + out[i] = fopen(filename, "wb"); + + fprintf(out[i], "P5\n%d %d 255\n", width, height); + } + + sprintf(filename, "%s.ppm", base); + comp = fopen(filename, "wb"); + + fprintf(comp, "P6\n%d %d 255\n", width, height); + + /* + * Read the image and do the separations... + */ + + for (y = 0; y < height; y ++) + { + fread(input, width, 1, in); + + cupsCMYKDoGray(cmyk, input, output, width); + + for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) + { + for (i = 0; i < num_comps; i ++) + putc(255 - 255 * outptr[i] / 4095, out[i]); + + r = 4095; + g = 4095; + b = 4095; + + switch (num_comps) + { + case 1 : + r -= outptr[0]; + g -= outptr[0]; + b -= outptr[0]; + break; + case 2 : + r -= outptr[0]; + g -= outptr[0]; + b -= outptr[0]; + + r -= outptr[1] / 2; + g -= outptr[1] / 2; + b -= outptr[1] / 2; + break; + case 3 : + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + break; + case 4 : + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + + r -= outptr[3]; + g -= outptr[3]; + b -= outptr[3]; + break; + case 6 : + r -= outptr[0] + outptr[1] / 2; + g -= outptr[2] + outptr[3] / 3; + b -= outptr[4]; + + r -= outptr[5]; + g -= outptr[5]; + b -= outptr[5]; + break; + case 7 : + r -= outptr[0] + outptr[1] / 2; + g -= outptr[2] + outptr[3] / 3; + b -= outptr[4]; + + r -= outptr[5] + outptr[6] / 2; + g -= outptr[5] + outptr[6] / 2; + b -= outptr[5] + outptr[6] / 2; + break; + } + + if (r < 0) + putc(0, comp); + else + putc(255 * r / 4095, comp); + + if (g < 0) + putc(0, comp); + else + putc(255 * g / 4095, comp); + + if (b < 0) + putc(0, comp); + else + putc(255 * b / 4095, comp); + } + } + + for (i = 0; i < num_comps; i ++) + fclose(out[i]); + + fclose(comp); + fclose(in); + + cupsCMYKDelete(cmyk); +} + + +/* + * 'test_rgb()' - Test color separations... + */ + +void +test_rgb(int num_comps, /* I - Number of components */ + const char *base) /* I - Base filename of output */ +{ + int i; /* Looping var */ + char filename[255]; /* Output filename */ + char line[255]; /* Line from PPM file */ + int width, height; /* Width and height of test image */ + int x, y; /* Current coordinate in image */ + int r, g, b; /* Current RGB color */ + unsigned char input[7000]; /* Line to separate */ + short output[48000], /* Output separation data */ + *outptr; /* Pointer in output */ + FILE *in; /* Input PPM file */ + FILE *out[CUPS_MAX_CHAN]; + /* Output PGM files */ + FILE *comp; /* Composite output */ + cups_cmyk_t *cmyk; /* Color separation */ + + + /* + * Open the test image... + */ + + in = fopen("image.ppm", "rb"); + while (fgets(line, sizeof(line), in) != NULL) + if (isdigit(line[0])) + break; + + sscanf(line, "%d%d", &width, &height); + + fgets(line, sizeof(line), in); + + /* + * Create the color separation... + */ + + cmyk = cupsCMYKNew(num_comps); + + cupsCMYKSetBlack(cmyk, 0.5, 1.0); + + switch (num_comps) + { + case 2 : /* Kk */ + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + break; + case 6 : /* CcMmYK */ + cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8); + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8); + cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); + break; + case 7 : /* CcMmYKk */ + cupsCMYKSetGamma(cmyk, 0, 1.0, 0.8); + cupsCMYKSetLtDk(cmyk, 0, 0.5, 1.0); + cupsCMYKSetGamma(cmyk, 2, 1.0, 0.8); + cupsCMYKSetLtDk(cmyk, 2, 0.5, 1.0); + cupsCMYKSetLtDk(cmyk, 5, 0.5, 1.0); + break; + } + + /* + * Open the color separation files... + */ + + for (i = 0; i < num_comps; i ++) + { + sprintf(filename, "%s%d.pgm", base, i); + out[i] = fopen(filename, "wb"); + + fprintf(out[i], "P5\n%d %d 255\n", width, height); + } + + sprintf(filename, "%s.ppm", base); + comp = fopen(filename, "wb"); + + fprintf(comp, "P6\n%d %d 255\n", width, height); + + /* + * Read the image and do the separations... + */ + + for (y = 0; y < height; y ++) + { + fread(input, width, 3, in); + + cupsCMYKDoRGB(cmyk, input, output, width); + + for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) + { + for (i = 0; i < num_comps; i ++) + putc(255 - 255 * outptr[i] / 4095, out[i]); + + r = 4095; + g = 4095; + b = 4095; + + switch (num_comps) + { + case 1 : + r -= outptr[0]; + g -= outptr[0]; + b -= outptr[0]; + break; + case 2 : + r -= outptr[0]; + g -= outptr[0]; + b -= outptr[0]; + + r -= outptr[1] / 2; + g -= outptr[1] / 2; + b -= outptr[1] / 2; + break; + case 3 : + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + break; + case 4 : + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + + r -= outptr[3]; + g -= outptr[3]; + b -= outptr[3]; + break; + case 6 : + r -= outptr[0] + outptr[1] / 2; + g -= outptr[2] + outptr[3] / 3; + b -= outptr[4]; + + r -= outptr[5]; + g -= outptr[5]; + b -= outptr[5]; + break; + case 7 : + r -= outptr[0] + outptr[1] / 2; + g -= outptr[2] + outptr[3] / 3; + b -= outptr[4]; + + r -= outptr[5] + outptr[6] / 2; + g -= outptr[5] + outptr[6] / 2; + b -= outptr[5] + outptr[6] / 2; + break; + } + + if (r < 0) + putc(0, comp); + else + putc(255 * r / 4095, comp); + + if (g < 0) + putc(0, comp); + else + putc(255 * g / 4095, comp); + + if (b < 0) + putc(0, comp); + else + putc(255 * b / 4095, comp); + } + } + + for (i = 0; i < num_comps; i ++) + fclose(out[i]); + + fclose(comp); + fclose(in); + + cupsCMYKDelete(cmyk); +} + + +/* + * End of "$Id: testcmyk.c 9982 2011-09-09 17:32:52Z mike $". + */ diff --git a/driver/testdither.c b/driver/testdither.c new file mode 100644 index 0000000..e9dc047 --- /dev/null +++ b/driver/testdither.c @@ -0,0 +1,191 @@ +/* + * "$Id: testdither.c 9042 2010-03-24 00:45:34Z mike $" + * + * Dither test program for CUPS. + * + * Try the following: + * + * testdither 0 255 > filename.ppm + * testdither 0 127 255 > filename.ppm + * testdither 0 85 170 255 > filename.ppm + * testdither 0 63 127 170 198 227 255 > filename.ppm + * testdither 0 210 383 > filename.ppm + * testdither 0 82 255 > filename.ppm + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Test dithering and output a PPM file. + * usage() - Show program usage... + */ + +/* + * Include necessary headers. + */ + +#include "driver.h" +#include + + +/* + * Local functions... + */ + +void usage(void); + + +/* + * 'main()' - Test dithering and output a PPM file. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int x, y; /* Current coordinate in image */ + short line[512]; /* Line to dither */ + unsigned char pixels[512], /* Dither pixels */ + *pixptr; /* Pointer in line */ + int output; /* Output pixel */ + cups_lut_t *lut; /* Dither lookup table */ + cups_dither_t *dither; /* Dither state */ + int nlutvals; /* Number of lookup values */ + float lutvals[16]; /* Lookup values */ + int pixvals[16]; /* Pixel values */ + + + /* + * See if we have lookup table values on the command-line... + */ + + if (argc > 1) + { + /* + * Yes, collect them... + */ + + nlutvals = 0; + + for (x = 1; x < argc; x ++) + if (isdigit(argv[x][0]) && nlutvals < 16) + { + pixvals[nlutvals] = atoi(argv[x]); + lutvals[nlutvals] = atof(argv[x]) / 255.0; + nlutvals ++; + } + else + usage(); + + /* + * See if we have at least 2 values... + */ + + if (nlutvals < 2) + usage(); + } + else + { + /* + * Otherwise use the default 2-entry LUT with values of 0 and 255... + */ + + nlutvals = 2; + lutvals[0] = 0.0; + lutvals[1] = 1.0; + pixvals[0] = 0; + pixvals[1] = 255; + } + + /* + * Create the lookup table and dither state... + */ + + lut = cupsLutNew(nlutvals, lutvals); + dither = cupsDitherNew(512); + + /* + * Put out the PGM header for a raw 256x256x8-bit grayscale file... + */ + + puts("P5\n512\n512\n255"); + + /* + * Dither 512 lines, which are written out in 256 image lines... + */ + + for (y = 0; y < 512; y ++) + { + /* + * Create the grayscale data for the current line... + */ + + for (x = 0; x < 512; x ++) + line[x] = 4095 * ((y / 32) * 16 + x / 32) / 255; + + /* + * Dither the line... + */ + + cupsDitherLine(dither, lut, line, 1, pixels); + + if (y == 0) + { + fputs("DEBUG: pixels =", stderr); + for (x = 0; x < 512; x ++) + fprintf(stderr, " %d", pixels[x]); + fputs("\n", stderr); + } + + /* + * Add or set the output pixel values... + */ + + for (x = 0, pixptr = pixels; x < 512; x ++, pixptr ++) + { + output = 255 - pixvals[*pixptr]; + + if (output < 0) + putchar(0); + else + putchar(output); + } + } + + /* + * Free the dither state and lookup table... + */ + + cupsDitherDelete(dither); + cupsLutDelete(lut); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'usage()' - Show program usage... + */ + +void +usage(void) +{ + puts("Usage: testdither [val1 val2 [... val16]] >filename.ppm"); + exit(1); +} + + +/* + * End of "$Id: testdither.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/driver/testdriver.c b/driver/testdriver.c new file mode 100644 index 0000000..413ea42 --- /dev/null +++ b/driver/testdriver.c @@ -0,0 +1,176 @@ +/* + * "$Id: testdriver.c 9042 2010-03-24 00:45:34Z mike $" + * + * Sample/test driver interface program for CUPS. + * + * This program handles listing and installing both static PPD files + * in CUPS_DATADIR/model and dynamically generated PPD files using + * the driver helper programs in CUPS_SERVERBIN/driver. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Enumerate or display PPD files. + * cat_ppd() - Display a PPD file. + * list_ppds() - List PPDs. + */ + +/* + * Include necessary headers... + */ + +#include +#include + + +/* + * Local functions... + */ + +static int cat_ppd(const char *uri); +static int list_ppds(const char *name); + + +/* + * Sample data... + */ + +static const char *models[][2] = + { + { "foojet.ppd", "Foo Printer" }, + { "barjet.ppd", "Bar Printer" }, + { "foobar.ppd", "Foo/Bar Multifunction Printer" } + }; + + +/* + * 'main()' - Enumerate or display PPD files. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + if (argc == 2 && !strcmp(argv[1], "list")) + return (list_ppds(argv[0])); + else if (argc == 3 && !strcmp(argv[1], "cat")) + return (cat_ppd(argv[2])); + + fprintf(stderr, "ERROR: Usage: %s cat URI\n", argv[0]); + fprintf(stderr, "ERROR: Usage: %s list\n", argv[0]); + return (1); +} + + +/* + * 'cat_ppd()' - Display a PPD file. + */ + +static int /* O - Exit status */ +cat_ppd(const char *uri) /* I - PPD URI */ +{ + int i; /* Looping var */ + char scheme[255], /* URI scheme */ + userpass[255], /* Username/password (unused) */ + hostname[255], /* Hostname (unused) */ + resource[1024]; /* Resource name */ + int port; /* Port (unused) */ + const char *name; /* Pointer to name in URI */ + + + if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + userpass, sizeof(userpass), hostname, sizeof(hostname), + &port, resource, sizeof(resource)) < HTTP_URI_OK) + { + fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", uri); + return (1); + } + + name = resource + 1; + + for (i = 0 ; i < (int)(sizeof(models) / sizeof(models[0])); i ++) + if (!strcmp(name, models[i][0])) + { + /* + * Actually display the PPD file... + */ + puts("*PPD-Adobe: \"4.3\""); + + puts("*LanguageEncoding: ISOLatin1"); + puts("*LanguageVersion: English"); + puts("*Manufacturer: \"Test\""); + puts("*FileVersion: \"1.0\""); + puts("*FormatVersion: \"4.3\""); + puts("*PSVersion: \"(3010) 1\""); + printf("*PCFileName: \"%s\"\n", models[i][0]); + + printf("*Product: \"(%s)\"\n", models[i][1]); + printf("*ModelName: \"Test %s\"\n", models[i][1]); + printf("*NickName: \"Test %s\"\n", models[i][1]); + printf("*ShortNickName: \"Test %s\"\n", models[i][1]); + + puts("*OpenUI PageSize: PickOne"); + puts("*OrderDependency: 10 AnySetup *PageSetup"); + puts("*DefaultPageSize: Letter"); + puts("*PageSize Letter: \"<>setpagedevice\""); + puts("*PageSize A4: \"<>setpagedevice\""); + puts("*CloseUI: *PageSize"); + + puts("*OpenUI PageRegion: PickOne"); + puts("*OrderDependency: 10 AnySetup *PageRegion"); + puts("*DefaultPageRegion: Letter"); + puts("*PageRegion Letter: \"<>setpagedevice\""); + puts("*PageRegion A4: \"<>setpagedevice\""); + puts("*CloseUI: *PageRegion"); + + puts("*DefaultImageableArea: Letter"); + puts("*ImageableArea Letter: \"0 0 612 792\""); + puts("*ImageableArea A4: \"0 0 595 842\""); + + puts("*DefaultPaperDimension: Letter"); + puts("*PaperDimension Letter: \"612 792\""); + puts("*PaperDimension A4: \"595 842\""); + + return (0); + } + + fprintf(stderr, "ERROR: Unknown URI \"%s\"!\n", uri); + return (1); +} + + +/* + * 'list_ppds()' - List PPDs. + */ + +static int /* O - Exit status */ +list_ppds(const char *name) /* I - Program name */ +{ + int i; /* Looping var */ + const char *base; /* Base name of program */ + + + if ((base = strrchr(name, '/')) != NULL) + base ++; + else + base = name; + + for (i = 0; i < (int)(sizeof(models) / sizeof(models[0])); i ++) + printf("\"%s:///%s\" en \"Test\" \"Test %s\" \"1284 device id\"\n", + base, models[i][0], models[i][1]); + + return (0); +} + + +/* + * End of "$Id: testdriver.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/driver/testrgb.c b/driver/testrgb.c new file mode 100644 index 0000000..f2079d9 --- /dev/null +++ b/driver/testrgb.c @@ -0,0 +1,347 @@ +/* + * "$Id: testrgb.c 9982 2011-09-09 17:32:52Z mike $" + * + * Test the new RGB color separation code for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products, All Rights Reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Do color rgb tests. + * test_gray() - Test grayscale rgbs... + * test_rgb() - Test color rgbs... + */ + +/* + * Include necessary headers. + */ + +#include +#include "driver.h" +#include + +#ifdef HAVE_LIBLCMS +# include +#endif /* HAVE_LIBLCMS */ + + +void test_gray(cups_sample_t *samples, int num_samples, + int cube_size, int num_comps, const char *base); +void test_rgb(cups_sample_t *samples, int num_samples, + int cube_size, int num_comps, const char *base); + + +/* + * 'main()' - Do color rgb tests. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + static cups_sample_t CMYK[] = /* Basic 4-color sep */ + { + /*{ r, g, b }, { C, M, Y, K }*/ + { { 0, 0, 0 }, { 0, 0, 0, 255 } }, + { { 255, 0, 0 }, { 0, 255, 240, 0 } }, + { { 0, 255, 0 }, { 200, 0, 200, 0 } }, + { { 255, 255, 0 }, { 0, 0, 240, 0 } }, + { { 0, 0, 255 }, { 200, 200, 0, 0 } }, + { { 255, 0, 255 }, { 0, 200, 0, 0 } }, + { { 0, 255, 255 }, { 200, 0, 0, 0 } }, + { { 255, 255, 255 }, { 0, 0, 0, 0 } } + }; + + + /* + * Make the test directory... + */ + + mkdir("test", 0755); + + /* + * Run tests for CMYK and CMYK separations... + */ + + test_rgb(CMYK, 8, 2, 4, "test/rgb-cmyk"); + + test_gray(CMYK, 8, 2, 4, "test/gray-cmyk"); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'test_gray()' - Test grayscale rgbs... + */ + +void +test_gray(cups_sample_t *samples, /* I - Sample values */ + int num_samples, /* I - Number of samples */ + int cube_size, /* I - Cube size */ + int num_comps, /* I - Number of components */ + const char *base) /* I - Base filename of output */ +{ + int i; /* Looping var */ + char filename[255]; /* Output filename */ + char line[255]; /* Line from PPM file */ + int width, height; /* Width and height of test image */ + int x, y; /* Current coordinate in image */ + int r, g, b; /* Current RGB color */ + unsigned char input[7000]; /* Line to rgbarate */ + unsigned char output[48000], /* Output rgb data */ + *outptr; /* Pointer in output */ + FILE *in; /* Input PPM file */ + FILE *out[CUPS_MAX_CHAN]; + /* Output PGM files */ + FILE *comp; /* Composite output */ + cups_rgb_t *rgb; /* Color separation */ + + + /* + * Open the test image... + */ + + in = fopen("image.pgm", "rb"); + while (fgets(line, sizeof(line), in) != NULL) + if (isdigit(line[0])) + break; + + sscanf(line, "%d%d", &width, &height); + + fgets(line, sizeof(line), in); + + /* + * Create the color rgb... + */ + + rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps); + + /* + * Open the color rgb files... + */ + + for (i = 0; i < num_comps; i ++) + { + sprintf(filename, "%s%d.pgm", base, i); + out[i] = fopen(filename, "wb"); + + fprintf(out[i], "P5\n%d %d 255\n", width, height); + } + + sprintf(filename, "%s.ppm", base); + comp = fopen(filename, "wb"); + + fprintf(comp, "P6\n%d %d 255\n", width, height); + + /* + * Read the image and do the rgbs... + */ + + for (y = 0; y < height; y ++) + { + fread(input, width, 1, in); + + cupsRGBDoGray(rgb, input, output, width); + + for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) + { + for (i = 0; i < num_comps; i ++) + putc(255 - outptr[i], out[i]); + + r = 255; + g = 255; + b = 255; + + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + + r -= outptr[3]; + g -= outptr[3]; + b -= outptr[3]; + + if (num_comps > 4) + { + r -= outptr[4] / 2; + g -= outptr[5] / 2; + } + + if (num_comps > 6) + { + r -= outptr[6] / 2; + g -= outptr[6] / 2; + b -= outptr[6] / 2; + } + + if (r < 0) + putc(0, comp); + else + putc(r, comp); + + if (g < 0) + putc(0, comp); + else + putc(g, comp); + + if (b < 0) + putc(0, comp); + else + putc(b, comp); + } + } + + for (i = 0; i < num_comps; i ++) + fclose(out[i]); + + fclose(comp); + fclose(in); + + cupsRGBDelete(rgb); +} + + +/* + * 'test_rgb()' - Test color rgbs... + */ + +void +test_rgb(cups_sample_t *samples, /* I - Sample values */ + int num_samples, /* I - Number of samples */ + int cube_size, /* I - Cube size */ + int num_comps, /* I - Number of components */ + const char *base) /* I - Base filename of output */ +{ + int i; /* Looping var */ + char filename[255]; /* Output filename */ + char line[255]; /* Line from PPM file */ + int width, height; /* Width and height of test image */ + int x, y; /* Current coordinate in image */ + int r, g, b; /* Current RGB color */ + unsigned char input[7000]; /* Line to rgbarate */ + unsigned char output[48000], /* Output rgb data */ + *outptr; /* Pointer in output */ + FILE *in; /* Input PPM file */ + FILE *out[CUPS_MAX_CHAN]; + /* Output PGM files */ + FILE *comp; /* Composite output */ + cups_rgb_t *rgb; /* Color separation */ + + + /* + * Open the test image... + */ + + in = fopen("image.ppm", "rb"); + while (fgets(line, sizeof(line), in) != NULL) + if (isdigit(line[0])) + break; + + sscanf(line, "%d%d", &width, &height); + + fgets(line, sizeof(line), in); + + /* + * Create the color rgb... + */ + + rgb = cupsRGBNew(num_samples, samples, cube_size, num_comps); + + /* + * Open the color rgb files... + */ + + for (i = 0; i < num_comps; i ++) + { + sprintf(filename, "%s%d.pgm", base, i); + out[i] = fopen(filename, "wb"); + + fprintf(out[i], "P5\n%d %d 255\n", width, height); + } + + sprintf(filename, "%s.ppm", base); + comp = fopen(filename, "wb"); + + fprintf(comp, "P6\n%d %d 255\n", width, height); + + /* + * Read the image and do the rgbs... + */ + + for (y = 0; y < height; y ++) + { + fread(input, width, 3, in); + + cupsRGBDoRGB(rgb, input, output, width); + + for (x = 0, outptr = output; x < width; x ++, outptr += num_comps) + { + for (i = 0; i < num_comps; i ++) + putc(255 - outptr[i], out[i]); + + r = 255; + g = 255; + b = 255; + + r -= outptr[0]; + g -= outptr[1]; + b -= outptr[2]; + + r -= outptr[3]; + g -= outptr[3]; + b -= outptr[3]; + + if (num_comps > 4) + { + r -= outptr[4] / 2; + g -= outptr[5] / 2; + } + + if (num_comps > 6) + { + r -= outptr[6] / 2; + g -= outptr[6] / 2; + b -= outptr[6] / 2; + } + + if (r < 0) + putc(0, comp); + else + putc(r, comp); + + if (g < 0) + putc(0, comp); + else + putc(g, comp); + + if (b < 0) + putc(0, comp); + else + putc(b, comp); + } + } + + for (i = 0; i < num_comps; i ++) + fclose(out[i]); + + fclose(comp); + fclose(in); + + cupsRGBDelete(rgb); +} + + +/* + * End of "$Id: testrgb.c 9982 2011-09-09 17:32:52Z mike $". + */ diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..da9b597 --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,128 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# PPD compiler example makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2002-2005 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Include standard definitions... +# + +include ../Makedefs + + +# +# Examples... +# + +EXAMPLES = \ + color.drv \ + constraint.drv \ + custom.drv \ + grouping.drv \ + laserjet-basic.drv \ + laserjet-pjl.drv \ + minimum.drv \ + postscript.drv \ + r300-basic.drv \ + r300-colorman.drv \ + r300-remote.drv + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean everything... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + $(INSTALL_DIR) $(DATADIR)/examples + for file in $(EXAMPLES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/examples; \ + done + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + for file in $(EXAMPLES); do \ + $(RM) $(DATADIR)/examples/$$file; \ + done + -$(RMDIR) $(DATADIR)/examples + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/examples/color.drv b/examples/color.drv new file mode 100644 index 0000000..69984c4 --- /dev/null +++ b/examples/color.drv @@ -0,0 +1,44 @@ +// Include standard font and media definitions +#include +#include + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and version +Manufacturer "Foo" +Version 1.0 + +// Each filter provided by the driver... +Filter application/vnd.cups-raster 100 rastertofoo + +// Supported page sizes +*MediaSize Letter +MediaSize A4 + +{ + // Supported resolutions + *Resolution k 8 0 0 0 "600dpi/600 DPI" + + // Specify the model name and filename... + ModelName "FooJet 2000" + PCFileName "foojet2k.ppd" +} + +{ + // Supports color printing + ColorDevice true + + // Supported colorspaces + ColorModel Gray/Grayscale w chunky 0 + *ColorModel RGB/Color rgb chunky 0 + + // Supported resolutions + *Resolution - 8 0 0 0 "300dpi/300 DPI" + Resolution - 8 0 0 0 "600dpi/600 DPI" + + // Specify the model name and filename... + ModelName "FooJet Color" + PCFileName "foojetco.ppd" +} diff --git a/examples/constraint.drv b/examples/constraint.drv new file mode 100644 index 0000000..6acb7f1 --- /dev/null +++ b/examples/constraint.drv @@ -0,0 +1,48 @@ +// Include standard font and media definitions +#include +#include + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer, model name, and version +Manufacturer "Foo" +ModelName "FooJet 2000" +Version 1.0 + +// Each filter provided by the driver... +Filter application/vnd.cups-raster 100 rastertofoo + +// Supported page sizes +*MediaSize Letter +MediaSize A4 + +// Supported resolutions +*Resolution k 8 0 0 0 "600dpi/600 DPI" + +// Installable Option Group +Group "InstallableOptions/Options Installed" + + // Duplexing unit option + Option "Option1/Duplexing Unit" Boolean AnySetup 10 + Choice True/Installed "" + *Choice "False/Not Installed" "" + +// General Option Group +Group General + + // Duplexing option + Option "Duplex/Two-Sided Printing" PickOne AnySetup 10 + *Choice "None/No" "<>setpagedevice" + Choice "DuplexNoTumble/Long Edge Binding" + "<>setpagedevice" + Choice "DuplexTumble/Short Edge Binding" + "<>setpagedevice" + +// Only allow duplexing if the duplexer is installed +UIConstraints "*Duplex *Option1 False" + +// Specify the name of the PPD file we want to generate... +PCFileName "foojet2k.ppd" + diff --git a/examples/custom.drv b/examples/custom.drv new file mode 100644 index 0000000..1001c4f --- /dev/null +++ b/examples/custom.drv @@ -0,0 +1,41 @@ +// Include standard font and media definitions +#include +#include + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer, model name, and version +Manufacturer "Foo" +ModelName "FooJet 2000" +Version 1.0 + +// Each filter provided by the driver... +Filter application/vnd.cups-raster 100 rastertofoo + +// Supported page sizes +*MediaSize Letter +MediaSize A4 + +// Supported resolutions +*Resolution k 8 0 0 0 "600dpi/600 DPI" + +// Option Group +Group "Footasm" + + // Boolean option + Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10 + *Choice True/Yes "<>setpagedevice" + Choice False/No "<>setpagedevice" + + // Multiple choice option + Option "fooOutputType/Output Quality" PickOne AnySetup 10 + *Choice "Auto/Automatic Selection" "<>setpagedevice" + Choice "Text/Optimize for Text" "<>setpagedevice" + Choice "Graph/Optimize for Graphics" "<>setpagedevice" + Choice "Photo/Optimize for Photos" "<>setpagedevice" + +// Specify the name of the PPD file we want to generate... +PCFileName "foojet2k.ppd" + diff --git a/examples/grouping.drv b/examples/grouping.drv new file mode 100644 index 0000000..da66d74 --- /dev/null +++ b/examples/grouping.drv @@ -0,0 +1,36 @@ +// Include standard font and media definitions +#include +#include + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and version +Manufacturer "Foo" +Version 1.0 + +// Each filter provided by the driver... +Filter application/vnd.cups-raster 100 rastertofoo + +// Supported page sizes +*MediaSize Letter +MediaSize A4 + +{ + // Supported resolutions + *Resolution k 8 0 0 0 "600dpi/600 DPI" + + // Specify the model name and filename... + ModelName "FooJet 2000" + PCFileName "foojet2k.ppd" +} + +{ + // Supported resolutions + *Resolution k 8 0 0 0 "1200dpi/1200 DPI" + + // Specify the model name and filename... + ModelName "FooJet 2001" + PCFileName "foojt2k1.ppd" +} diff --git a/examples/laserjet-basic.drv b/examples/laserjet-basic.drv new file mode 100644 index 0000000..6924ed7 --- /dev/null +++ b/examples/laserjet-basic.drv @@ -0,0 +1,88 @@ +// Include standard font and media definitions +#include +#include + +// Include HP-PCL driver definitions +#include + +// Specify that this driver uses the HP-PCL driver... +DriverType pcl + +// Specify the driver options via the model number... +ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION) + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and driver version +Manufacturer "HP" +Version 1.0 + +// Supported page sizes and their margins +HWMargins 18 12 18 12 +*MediaSize Letter +MediaSize Legal +MediaSize Executive +MediaSize Monarch +MediaSize Statement +MediaSize FanFoldGermanLegal + +HWMargins 18 12.72 18 12.72 +MediaSize Env10 + +HWMargins 9.72 12 9.72 12 +MediaSize A4 +MediaSize A5 +MediaSize B5 +MediaSize EnvC5 +MediaSize EnvDL +MediaSize EnvISOB5 +MediaSize Postcard +MediaSize DoublePostcard + +// Only black-and-white output with mode 3 compression... +ColorModel Gray k chunky 3 + +// Supported resolutions +Resolution - 1 0 0 0 "300dpi/300 DPI" +*Resolution - 8 0 0 0 "600dpi/600 DPI" + +// Supported input slots +*InputSlot 7 "Auto/Automatic Selection" +InputSlot 2 "Manual/Tray 1 - Manual Feed" +InputSlot 4 "Upper/Tray 1" +InputSlot 1 "Lower/Tray 2" +InputSlot 5 "LargeCapacity/Tray 3" + +// Tray 3 is an option... +Installable "OptionLargeCapacity/Tray 3 Installed" +UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity" + +{ + // HP LaserJet 2100 Series + Throughput 10 + ModelName "LaserJet 2100 Series" + PCFileName "hpljt211.ppd" +} + +{ + // LaserJet 2200 and 2300 series have duplexer option... + Duplex normal + Installable "OptionDuplex/Duplexer Installed" + UIConstraints "*OptionDuplex False *Duplex" + + { + // HP LaserJet 2200 Series + Throughput 19 + ModelName "LaserJet 2200 Series" + PCFileName "hpljt221.ppd" + } + + { + // HP LaserJet 2300 Series + Throughput 25 + ModelName "LaserJet 2300 Series" + PCFileName "hpljt231.ppd" + } +} diff --git a/examples/laserjet-pjl.drv b/examples/laserjet-pjl.drv new file mode 100644 index 0000000..32a0bc4 --- /dev/null +++ b/examples/laserjet-pjl.drv @@ -0,0 +1,101 @@ +// Include standard font and media definitions +#include +#include + +// Include HP-PCL driver definitions +#include + +// Specify that this driver uses the HP-PCL driver... +DriverType pcl + +// Specify the driver options via the model number... +ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION) + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and driver version +Manufacturer "HP" +Version 2.0 + +// Supported page sizes and their margins +HWMargins 18 12 18 12 +*MediaSize Letter +MediaSize Legal +MediaSize Executive +MediaSize Monarch +MediaSize Statement +MediaSize FanFoldGermanLegal + +HWMargins 18 12.72 18 12.72 +MediaSize Env10 + +HWMargins 9.72 12 9.72 12 +MediaSize A4 +MediaSize A5 +MediaSize B5 +MediaSize EnvC5 +MediaSize EnvDL +MediaSize EnvISOB5 +MediaSize Postcard +MediaSize DoublePostcard + +// Only black-and-white output with mode 3 compression... +ColorModel Gray k chunky 3 + +// Supported resolutions +Resolution - 1 0 0 0 "300dpi/300 DPI" +*Resolution - 8 0 0 0 "600dpi/600 DPI" + +// Supported input slots +*InputSlot 7 "Auto/Automatic Selection" +InputSlot 2 "Manual/Tray 1 - Manual Feed" +InputSlot 4 "Upper/Tray 1" +InputSlot 1 "Lower/Tray 2" +InputSlot 5 "LargeCapacity/Tray 3" + +// Tray 3 is an option... +Installable "OptionLargeCapacity/Tray 3 Installed" +UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity" + +// PJL options +Attribute cupsPJL cupsRET "@PJL SET SMOOTHING=%?False:OFF;%?True:ON;%n" + +Option "cupsRET/Smoothing" Boolean DocumentSetup 10 + Choice "False/Off" "" + *Choice "True/On" "" + +Attribute cupsPJL cupsTonerSave "@PJL SET ECONOMODE=%?False:OFF;%?True:ON;%n" + +Option "cupsTonerSave/Save Toner" Boolean DocumentSetup 10 + *Choice "False/No" "" + Choice "True/Yes" "" + +{ + // HP LaserJet 2100 Series + Throughput 10 + ModelName "LaserJet 2100 Series PJL" + PCFileName "hpljt212.ppd" +} + +{ + // LaserJet 2200 and 2300 series have duplexer option... + Duplex normal + Installable "OptionDuplex/Duplexer Installed" + UIConstraints "*OptionDuplex False *Duplex" + + { + // HP LaserJet 2200 Series + Throughput 19 + ModelName "LaserJet 2200 Series PJL" + PCFileName "hpljt222.ppd" + } + + { + // HP LaserJet 2300 Series + Throughput 25 + ModelName "LaserJet 2300 Series PJL" + PCFileName "hpljt232.ppd" + } +} diff --git a/examples/minimum.drv b/examples/minimum.drv new file mode 100644 index 0000000..ac6e38d --- /dev/null +++ b/examples/minimum.drv @@ -0,0 +1,26 @@ +// Include standard font and media definitions +#include +#include + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer, model name, and version +Manufacturer "Foo" +ModelName "FooJet 2000" +Version 1.0 + +// Each filter provided by the driver... +Filter application/vnd.cups-raster 100 rastertofoo + +// Supported page sizes +*MediaSize Letter +MediaSize A4 + +// Supported resolutions +*Resolution k 8 0 0 0 "600dpi/600 DPI" + +// Specify the name of the PPD file we want to generate... +PCFileName "foojet2k.ppd" + diff --git a/examples/postscript.drv b/examples/postscript.drv new file mode 100644 index 0000000..ebb02f8 --- /dev/null +++ b/examples/postscript.drv @@ -0,0 +1,46 @@ +// Include standard font and media definitions +#include +#include + +// Specify this is a PostScript printer driver +DriverType ps + +// List the fonts that are supported, in this case all standard fonts +Font * + +// Manufacturer, model name, and version +Manufacturer "Foo" +ModelName "Foo LaserProofer 2000" +Version 1.0 + +// PostScript printer attributes +Attribute DefaultColorSpace "" Gray +Attribute LandscapeOrientation "" Minus90 +Attribute LanguageLevel "" "3" +Attribute Product "" "(Foo LaserProofer 2000)" +Attribute PSVersion "" "(3010) 0" +Attribute TTRasterizer "" Type42 + +// Supported page sizes +*MediaSize Letter +MediaSize Legal +MediaSize A4 + +// Query command for page size +Attribute "?PageSize" "" " + save + currentpagedevice /PageSize get aload pop + 2 copy gt {exch} if (Unknown) + 23 dict + dup [612 792] (Letter) put + dup [612 1008] (Legal) put + dup [595 842] (A4) put + {exch aload pop 4 index sub abs 5 le exch + 5 index sub abs 5 le and + {exch pop exit} {pop} ifelse + } bind forall = flush pop pop + restore" + +// Specify the name of the PPD file we want to generate +PCFileName "fooproof.ppd" + diff --git a/examples/r300-basic.drv b/examples/r300-basic.drv new file mode 100644 index 0000000..e203d51 --- /dev/null +++ b/examples/r300-basic.drv @@ -0,0 +1,75 @@ +// Include standard font and media definitions +#include +#include + +// Include ESC/P driver definitions +#include + +// Specify that this driver uses the ESC/P driver... +DriverType escp + +// Specify the driver options via the model number... +ModelNumber ($ESCP_ESCK $ESCP_EXT_UNITS $ESCP_EXT_MARGINS $ESCP_USB + $ESCP_PAGE_SIZE $ESCP_RASTER_ESCI) + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and driver version +Manufacturer "Epson" +Version 1.0 + +// Supported page sizes and their margins +HWMargins 8.4 0 8.4 0 +*MediaSize Letter +MediaSize Legal +MediaSize Executive +MediaSize Statement +MediaSize A4 +MediaSize A5 +MediaSize A6 +MediaSize B5 +MediaSize Env10 +MediaSize EnvC5 +MediaSize EnvDL +MediaSize EnvISOB5 +MediaSize Postcard +MediaSize DoublePostcard + +VariablePaperSize Yes +MinSize 1in 4in +MaxSize 8.5in 44in + +// Four color modes are supported... +ColorModel Gray/Grayscale w chunky 1 +ColorModel Black k chunky 1 +*ColorModel RGB/Color rgb chunky 1 +ColorModel CMYK cmyk chunky 1 + +// Supported resolutions +Resolution - 8 90 0 103 "360dpi/360 DPI" +*Resolution - 8 90 0 206 "720dpi/720 DPI" +Resolution - 8 90 0 412 "1440dpi/1440 DPI" + +// Very basic dithering settings +Attribute cupsInkChannels "" 6 +Attribute cupsInkLimit "" 2.0 + +Attribute cupsCyanLtDk "" "0.5 1.0" +Attribute cupsMagentaLtDk "" "0.5 1.0" + +Attribute cupsAllDither 360dpi "0.5 0.75 1.0" +Attribute cupsAllDither 720dpi "0.6 0.9 1.2" +Attribute cupsAllDither 1440dpi "0.9 1.35" + +Attribute cupsESCPDotSize 360dpi 16 +Attribute cupsESCPDotSize 720dpi 17 +Attribute cupsESCPDotSize 1440dpi 18 + +{ + // EPSON Stylus Photo R300 Series + Throughput 1 + ModelName "Stylus Photo R300" + PCFileName "epspr301.ppd" +} diff --git a/examples/r300-colorman.drv b/examples/r300-colorman.drv new file mode 100644 index 0000000..ddaf58e --- /dev/null +++ b/examples/r300-colorman.drv @@ -0,0 +1,85 @@ +// Include standard font and media definitions +#include +#include + +// Include ESC/P driver definitions +#include + +// Specify that this driver uses the ESC/P driver... +DriverType escp + +// Specify the driver options via the model number... +ModelNumber ($ESCP_ESCK $ESCP_EXT_UNITS $ESCP_EXT_MARGINS $ESCP_USB + $ESCP_PAGE_SIZE $ESCP_RASTER_ESCI $ESCP_REMOTE) + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and driver version +Manufacturer "Epson" +Version 3.0 + +// Supported page sizes and their margins +HWMargins 0 0 0 0 +*MediaSize Letter +MediaSize Legal +MediaSize Executive +MediaSize Statement +MediaSize A4 +MediaSize A5 +MediaSize A6 +MediaSize B5 +MediaSize Env10 +MediaSize EnvC5 +MediaSize EnvDL +MediaSize EnvISOB5 +MediaSize Postcard +MediaSize DoublePostcard + +VariablePaperSize Yes +MinSize 1in 4in +MaxSize 8.5in 44in + +// Borderless printing offset... +Attribute cupsESCPFP "" 0 + +// Four color modes are supported... +ColorModel Gray/Grayscale w chunky 1 +ColorModel Black k chunky 1 +*ColorModel RGB/Color rgb chunky 1 +ColorModel CMYK cmyk chunky 1 + +// Supported resolutions +Resolution - 8 90 0 103 "360dpi/360 DPI" +*Resolution - 8 90 0 206 "720dpi/720 DPI" +Resolution - 8 90 0 412 "1440dpi/1440 DPI" + +// Paper trays... +*InputSlot 0 "Auto/Auto Select" +InputSlot 1 "Manual/Manual Feed" + +Attribute cupsESCPPP 0 "1 255" +Attribute cupsESCPPP 1 "2 1" + +// Very basic dithering settings +Attribute cupsInkChannels "" 6 +Attribute cupsInkLimit "" 3.0 + +Attribute cupsCyanLtDk "" "0.5 1.0" +Attribute cupsMagentaLtDk "" "0.5 1.0" + +Attribute cupsAllDither 360dpi "0.5 0.75 1.0" +Attribute cupsAllDither 720dpi "0.6 0.9 1.2" +Attribute cupsAllDither 1440dpi "0.9 1.35" + +Attribute cupsESCPDotSize 360dpi 16 +Attribute cupsESCPDotSize 720dpi 17 +Attribute cupsESCPDotSize 1440dpi 18 + +{ + // EPSON Stylus Photo R300 Series + Throughput 1 + ModelName "Epson Stylus Photo R300" + PCFileName "epspr303.ppd" +} diff --git a/examples/r300-remote.drv b/examples/r300-remote.drv new file mode 100644 index 0000000..c3065d0 --- /dev/null +++ b/examples/r300-remote.drv @@ -0,0 +1,85 @@ +// Include standard font and media definitions +#include +#include + +// Include ESC/P driver definitions +#include + +// Specify that this driver uses the ESC/P driver... +DriverType escp + +// Specify the driver options via the model number... +ModelNumber ($ESCP_ESCK $ESCP_EXT_UNITS $ESCP_EXT_MARGINS $ESCP_USB + $ESCP_PAGE_SIZE $ESCP_RASTER_ESCI $ESCP_REMOTE) + +// List the fonts that are supported, in this case all standard +// fonts... +Font * + +// Manufacturer and driver version +Manufacturer "Epson" +Version 2.0 + +// Supported page sizes and their margins +HWMargins 0 0 0 0 +*MediaSize Letter +MediaSize Legal +MediaSize Executive +MediaSize Statement +MediaSize A4 +MediaSize A5 +MediaSize A6 +MediaSize B5 +MediaSize Env10 +MediaSize EnvC5 +MediaSize EnvDL +MediaSize EnvISOB5 +MediaSize Postcard +MediaSize DoublePostcard + +VariablePaperSize Yes +MinSize 1in 4in +MaxSize 8.5in 44in + +// Borderless printing offset... +Attribute cupsESCPFP "" -80 + +// Four color modes are supported... +ColorModel Gray/Grayscale w chunky 1 +ColorModel Black k chunky 1 +*ColorModel RGB/Color rgb chunky 1 +ColorModel CMYK cmyk chunky 1 + +// Supported resolutions +Resolution - 8 90 0 103 "360dpi/360 DPI" +*Resolution - 8 90 0 206 "720dpi/720 DPI" +Resolution - 8 90 0 412 "1440dpi/1440 DPI" + +// Paper trays... +*InputSlot 0 "Auto/Auto Select" +InputSlot 1 "Manual/Manual Feed" + +Attribute cupsESCPPP 0 "1 255" +Attribute cupsESCPPP 1 "2 1" + +// Very basic dithering settings +Attribute cupsInkChannels "" 6 +Attribute cupsInkLimit "" 2.0 + +Attribute cupsCyanLtDk "" "0.5 1.0" +Attribute cupsMagentaLtDk "" "0.5 1.0" + +Attribute cupsAllDither 360dpi "0.5 0.75 1.0" +Attribute cupsAllDither 720dpi "0.6 0.9 1.2" +Attribute cupsAllDither 1440dpi "0.9 1.35" + +Attribute cupsESCPDotSize 360dpi 16 +Attribute cupsESCPDotSize 720dpi 17 +Attribute cupsESCPDotSize 1440dpi 18 + +{ + // EPSON Stylus Photo R300 Series + Throughput 1 + ModelName "Epson Stylus Photo R300" + PCFileName "epspr302.ppd" +} diff --git a/filter/Dependencies b/filter/Dependencies new file mode 100644 index 0000000..9b49d85 --- /dev/null +++ b/filter/Dependencies @@ -0,0 +1,531 @@ +# DO NOT DELETE + +image-bmp.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-bmp.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-bmp.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-bmp.o: ../cups/debug-private.h ../cups/versioning.h +image-bmp.o: ../cups/string-private.h ../config.h +image-colorspace.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-colorspace.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-colorspace.o: ../cups/http.h ../cups/array.h ../cups/language.h +image-colorspace.o: ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-colorspace.o: ../cups/versioning.h ../cups/string-private.h ../config.h +image-gif.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-gif.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-gif.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-gif.o: ../cups/debug-private.h ../cups/versioning.h +image-gif.o: ../cups/string-private.h ../config.h +image-jpeg.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-jpeg.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-jpeg.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-jpeg.o: ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-jpeg.o: ../cups/string-private.h ../config.h +image-photocd.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-photocd.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-photocd.o: ../cups/http.h ../cups/array.h ../cups/language.h +image-photocd.o: ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-photocd.o: ../cups/versioning.h ../cups/string-private.h ../config.h +image-pix.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pix.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pix.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pix.o: ../cups/debug-private.h ../cups/versioning.h +image-pix.o: ../cups/string-private.h ../config.h +image-png.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-png.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-png.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-png.o: ../cups/debug-private.h ../cups/versioning.h +image-png.o: ../cups/string-private.h ../config.h +image-pnm.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pnm.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pnm.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pnm.o: ../cups/debug-private.h ../cups/versioning.h +image-pnm.o: ../cups/string-private.h ../config.h +image-sgi.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sgi.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sgi.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sgi.o: ../cups/debug-private.h ../cups/versioning.h +image-sgi.o: ../cups/string-private.h ../config.h image-sgi.h +image-sgilib.o: image-sgi.h +image-sun.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sun.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sun.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sun.o: ../cups/debug-private.h ../cups/versioning.h +image-sun.o: ../cups/string-private.h ../config.h +image-tiff.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-tiff.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-tiff.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-tiff.o: ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-tiff.o: ../cups/string-private.h ../config.h +image-zoom.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image-zoom.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-zoom.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-zoom.o: ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-zoom.o: ../cups/string-private.h ../config.h +image.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +image.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image.o: ../cups/debug-private.h ../cups/versioning.h +image.o: ../cups/string-private.h ../config.h +error.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +error.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +error.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +error.o: ../cups/debug-private.h ../cups/versioning.h +error.o: ../cups/string-private.h ../config.h +interpret.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +interpret.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +interpret.o: ../cups/debug-private.h ../cups/versioning.h +interpret.o: ../cups/string-private.h ../config.h +raster.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +raster.o: ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +raster.o: ../cups/debug-private.h ../cups/versioning.h +raster.o: ../cups/string-private.h ../config.h +bannertops.o: pstext.h common.h ../cups/string-private.h ../config.h +bannertops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +bannertops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +bannertops.o: ../cups/array.h ../cups/language.h ../cups/transcode.h image.h +bannertops.o: ../cups/raster.h ../cups/ppd.h ../cups/language-private.h +commandtops.o: ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +commandtops.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +commandtops.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +commandtops.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +commandtops.o: ../cups/http.h ../cups/array.h ../cups/language.h +commandtops.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +commandtops.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +commandtops.o: ../cups/language-private.h ../cups/transcode.h +commandtops.o: ../cups/thread-private.h ../cups/sidechannel.h +gziptoany.o: ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +gziptoany.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +gziptoany.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +gziptoany.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +gziptoany.o: ../cups/array.h ../cups/language.h ../cups/pwg-private.h +gziptoany.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +gziptoany.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +gziptoany.o: ../cups/transcode.h ../cups/thread-private.h +imagetops.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetops.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +imagetops.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +imagetops.o: image.h ../cups/raster.h ../cups/ppd.h +imagetops.o: ../cups/language-private.h ../cups/transcode.h +imagetoraster.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetoraster.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h +imagetoraster.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +imagetoraster.o: ../cups/array.h ../cups/language.h image-private.h image.h +imagetoraster.o: ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h +imagetoraster.o: ../cups/versioning.h ../cups/language-private.h +imagetoraster.o: ../cups/transcode.h +common.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h +common.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +common.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pdftops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pdftops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pdftops.o: ../cups/language.h ../cups/string-private.h ../config.h +pdftops.o: ../cups/language-private.h ../cups/transcode.h +pstext.o: pstext.h common.h ../cups/string-private.h ../config.h +pstext.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pstext.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pstext.o: ../cups/language.h ../cups/transcode.h ../cups/language-private.h +pstops.o: common.h ../cups/string-private.h ../config.h ../cups/cups.h +pstops.o: ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +pstops.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pstops.o: ../cups/file.h ../cups/array.h ../cups/language-private.h +pstops.o: ../cups/transcode.h +rasterbench.o: ../config.h ../cups/raster.h ../cups/cups.h ../cups/file.h +rasterbench.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rasterbench.o: ../cups/array.h ../cups/language.h ../cups/ppd.h +rastertoepson.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertoepson.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertoepson.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertoepson.o: ../config.h ../cups/language-private.h ../cups/transcode.h +rastertoepson.o: ../cups/raster.h ../cups/ppd.h +rastertohp.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertohp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertohp.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertohp.o: ../config.h ../cups/language-private.h ../cups/transcode.h +rastertohp.o: ../cups/raster.h ../cups/ppd.h +rastertolabel.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertolabel.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertolabel.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertolabel.o: ../config.h ../cups/language-private.h ../cups/transcode.h +rastertolabel.o: ../cups/raster.h ../cups/ppd.h +rastertopwg.o: ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +rastertopwg.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +rastertopwg.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +rastertopwg.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +rastertopwg.o: ../cups/http.h ../cups/array.h ../cups/language.h +rastertopwg.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +rastertopwg.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +rastertopwg.o: ../cups/language-private.h ../cups/transcode.h +rastertopwg.o: ../cups/thread-private.h ../cups/raster.h ../cups/ppd.h +testimage.o: image.h ../cups/raster.h ../cups/cups.h ../cups/file.h +testimage.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testimage.o: ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.o: image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testraster.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.o: ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +testraster.o: ../cups/string-private.h ../config.h +textcommon.o: textcommon.h common.h ../cups/string-private.h ../config.h +textcommon.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +textcommon.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +textcommon.o: ../cups/array.h ../cups/language.h ../cups/language-private.h +textcommon.o: ../cups/transcode.h +texttops.o: textcommon.h common.h ../cups/string-private.h ../config.h +texttops.o: ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +texttops.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +texttops.o: ../cups/language.h ../cups/language-private.h ../cups/transcode.h +# DO NOT DELETE + +image-bmp.32.o: image-bmp.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-bmp.32.o: image-bmp.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-bmp.32.o: image-bmp.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-bmp.32.o: image-bmp.c ../cups/debug-private.h ../cups/versioning.h +image-bmp.32.o: image-bmp.c ../cups/string-private.h ../config.h +image-colorspace.32.o: image-colorspace.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-colorspace.32.o: image-colorspace.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-colorspace.32.o: image-colorspace.c ../cups/http.h ../cups/array.h ../cups/language.h +image-colorspace.32.o: image-colorspace.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-colorspace.32.o: image-colorspace.c ../cups/versioning.h ../cups/string-private.h ../config.h +image-gif.32.o: image-gif.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-gif.32.o: image-gif.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-gif.32.o: image-gif.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-gif.32.o: image-gif.c ../cups/debug-private.h ../cups/versioning.h +image-gif.32.o: image-gif.c ../cups/string-private.h ../config.h +image-jpeg.32.o: image-jpeg.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-jpeg.32.o: image-jpeg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-jpeg.32.o: image-jpeg.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-jpeg.32.o: image-jpeg.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-jpeg.32.o: image-jpeg.c ../cups/string-private.h ../config.h +image-photocd.32.o: image-photocd.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-photocd.32.o: image-photocd.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-photocd.32.o: image-photocd.c ../cups/http.h ../cups/array.h ../cups/language.h +image-photocd.32.o: image-photocd.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-photocd.32.o: image-photocd.c ../cups/versioning.h ../cups/string-private.h ../config.h +image-pix.32.o: image-pix.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pix.32.o: image-pix.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pix.32.o: image-pix.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pix.32.o: image-pix.c ../cups/debug-private.h ../cups/versioning.h +image-pix.32.o: image-pix.c ../cups/string-private.h ../config.h +image-png.32.o: image-png.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-png.32.o: image-png.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-png.32.o: image-png.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-png.32.o: image-png.c ../cups/debug-private.h ../cups/versioning.h +image-png.32.o: image-png.c ../cups/string-private.h ../config.h +image-pnm.32.o: image-pnm.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pnm.32.o: image-pnm.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pnm.32.o: image-pnm.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pnm.32.o: image-pnm.c ../cups/debug-private.h ../cups/versioning.h +image-pnm.32.o: image-pnm.c ../cups/string-private.h ../config.h +image-sgi.32.o: image-sgi.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sgi.32.o: image-sgi.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sgi.32.o: image-sgi.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sgi.32.o: image-sgi.c ../cups/debug-private.h ../cups/versioning.h +image-sgi.32.o: image-sgi.c ../cups/string-private.h ../config.h image-sgi.h +image-sgilib.32.o: image-sgilib.c image-sgi.h +image-sun.32.o: image-sun.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sun.32.o: image-sun.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sun.32.o: image-sun.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sun.32.o: image-sun.c ../cups/debug-private.h ../cups/versioning.h +image-sun.32.o: image-sun.c ../cups/string-private.h ../config.h +image-tiff.32.o: image-tiff.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-tiff.32.o: image-tiff.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-tiff.32.o: image-tiff.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-tiff.32.o: image-tiff.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-tiff.32.o: image-tiff.c ../cups/string-private.h ../config.h +image-zoom.32.o: image-zoom.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-zoom.32.o: image-zoom.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-zoom.32.o: image-zoom.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-zoom.32.o: image-zoom.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-zoom.32.o: image-zoom.c ../cups/string-private.h ../config.h +image.32.o: image.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image.32.o: image.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image.32.o: image.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image.32.o: image.c ../cups/debug-private.h ../cups/versioning.h +image.32.o: image.c ../cups/string-private.h ../config.h +error.32.o: error.c image-private.h image.h ../cups/raster.h ../cups/cups.h +error.32.o: error.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +error.32.o: error.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +error.32.o: error.c ../cups/debug-private.h ../cups/versioning.h +error.32.o: error.c ../cups/string-private.h ../config.h +interpret.32.o: interpret.c image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.32.o: interpret.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +interpret.32.o: interpret.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +interpret.32.o: interpret.c ../cups/debug-private.h ../cups/versioning.h +interpret.32.o: interpret.c ../cups/string-private.h ../config.h +raster.32.o: raster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.32.o: raster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +raster.32.o: raster.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +raster.32.o: raster.c ../cups/debug-private.h ../cups/versioning.h +raster.32.o: raster.c ../cups/string-private.h ../config.h +bannertops.32.o: bannertops.c pstext.h common.h ../cups/string-private.h ../config.h +bannertops.32.o: bannertops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +bannertops.32.o: bannertops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +bannertops.32.o: bannertops.c ../cups/array.h ../cups/language.h ../cups/transcode.h image.h +bannertops.32.o: bannertops.c ../cups/raster.h ../cups/ppd.h ../cups/language-private.h +commandtops.32.o: commandtops.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +commandtops.32.o: commandtops.c ../config.h ../cups/debug-private.h ../cups/versioning.h +commandtops.32.o: commandtops.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +commandtops.32.o: commandtops.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +commandtops.32.o: commandtops.c ../cups/http.h ../cups/array.h ../cups/language.h +commandtops.32.o: commandtops.c ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +commandtops.32.o: commandtops.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +commandtops.32.o: commandtops.c ../cups/language-private.h ../cups/transcode.h +commandtops.32.o: commandtops.c ../cups/thread-private.h ../cups/sidechannel.h +gziptoany.32.o: gziptoany.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +gziptoany.32.o: gziptoany.c ../config.h ../cups/debug-private.h ../cups/versioning.h +gziptoany.32.o: gziptoany.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +gziptoany.32.o: gziptoany.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +gziptoany.32.o: gziptoany.c ../cups/array.h ../cups/language.h ../cups/pwg-private.h +gziptoany.32.o: gziptoany.c ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +gziptoany.32.o: gziptoany.c ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +gziptoany.32.o: gziptoany.c ../cups/transcode.h ../cups/thread-private.h +imagetops.32.o: imagetops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetops.32.o: imagetops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +imagetops.32.o: imagetops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +imagetops.32.o: imagetops.c image.h ../cups/raster.h ../cups/ppd.h +imagetops.32.o: imagetops.c ../cups/language-private.h ../cups/transcode.h +imagetoraster.32.o: imagetoraster.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetoraster.32.o: imagetoraster.c ../cups/ppd.h ../cups/cups.h ../cups/file.h +imagetoraster.32.o: imagetoraster.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +imagetoraster.32.o: imagetoraster.c ../cups/array.h ../cups/language.h image-private.h image.h +imagetoraster.32.o: imagetoraster.c ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h +imagetoraster.32.o: imagetoraster.c ../cups/versioning.h ../cups/language-private.h +imagetoraster.32.o: imagetoraster.c ../cups/transcode.h +common.32.o: common.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +common.32.o: common.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +common.32.o: common.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pdftops.32.o: pdftops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pdftops.32.o: pdftops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pdftops.32.o: pdftops.c ../cups/language.h ../cups/string-private.h ../config.h +pdftops.32.o: pdftops.c ../cups/language-private.h ../cups/transcode.h +pstext.32.o: pstext.c pstext.h common.h ../cups/string-private.h ../config.h +pstext.32.o: pstext.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pstext.32.o: pstext.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pstext.32.o: pstext.c ../cups/language.h ../cups/transcode.h ../cups/language-private.h +pstops.32.o: pstops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +pstops.32.o: pstops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +pstops.32.o: pstops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pstops.32.o: pstops.c ../cups/file.h ../cups/array.h ../cups/language-private.h +pstops.32.o: pstops.c ../cups/transcode.h +rasterbench.32.o: rasterbench.c ../config.h ../cups/raster.h ../cups/cups.h ../cups/file.h +rasterbench.32.o: rasterbench.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rasterbench.32.o: rasterbench.c ../cups/array.h ../cups/language.h ../cups/ppd.h +rastertoepson.32.o: rastertoepson.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertoepson.32.o: rastertoepson.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertoepson.32.o: rastertoepson.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertoepson.32.o: rastertoepson.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertoepson.32.o: rastertoepson.c ../cups/raster.h ../cups/ppd.h +rastertohp.32.o: rastertohp.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertohp.32.o: rastertohp.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertohp.32.o: rastertohp.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertohp.32.o: rastertohp.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertohp.32.o: rastertohp.c ../cups/raster.h ../cups/ppd.h +rastertolabel.32.o: rastertolabel.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertolabel.32.o: rastertolabel.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertolabel.32.o: rastertolabel.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertolabel.32.o: rastertolabel.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertolabel.32.o: rastertolabel.c ../cups/raster.h ../cups/ppd.h +rastertopwg.32.o: rastertopwg.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +rastertopwg.32.o: rastertopwg.c ../config.h ../cups/debug-private.h ../cups/versioning.h +rastertopwg.32.o: rastertopwg.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +rastertopwg.32.o: rastertopwg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +rastertopwg.32.o: rastertopwg.c ../cups/http.h ../cups/array.h ../cups/language.h +rastertopwg.32.o: rastertopwg.c ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +rastertopwg.32.o: rastertopwg.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +rastertopwg.32.o: rastertopwg.c ../cups/language-private.h ../cups/transcode.h +rastertopwg.32.o: rastertopwg.c ../cups/thread-private.h ../cups/raster.h ../cups/ppd.h +testimage.32.o: testimage.c image.h ../cups/raster.h ../cups/cups.h ../cups/file.h +testimage.32.o: testimage.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testimage.32.o: testimage.c ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.32.o: testraster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.32.o: testraster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testraster.32.o: testraster.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.32.o: testraster.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +testraster.32.o: testraster.c ../cups/string-private.h ../config.h +textcommon.32.o: textcommon.c textcommon.h common.h ../cups/string-private.h ../config.h +textcommon.32.o: textcommon.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +textcommon.32.o: textcommon.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +textcommon.32.o: textcommon.c ../cups/array.h ../cups/language.h ../cups/language-private.h +textcommon.32.o: textcommon.c ../cups/transcode.h +texttops.32.o: texttops.c textcommon.h common.h ../cups/string-private.h ../config.h +texttops.32.o: texttops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +texttops.32.o: texttops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +texttops.32.o: texttops.c ../cups/language.h ../cups/language-private.h ../cups/transcode.h +# DO NOT DELETE + +image-bmp.64.o: image-bmp.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-bmp.64.o: image-bmp.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-bmp.64.o: image-bmp.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-bmp.64.o: image-bmp.c ../cups/debug-private.h ../cups/versioning.h +image-bmp.64.o: image-bmp.c ../cups/string-private.h ../config.h +image-colorspace.64.o: image-colorspace.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-colorspace.64.o: image-colorspace.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-colorspace.64.o: image-colorspace.c ../cups/http.h ../cups/array.h ../cups/language.h +image-colorspace.64.o: image-colorspace.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-colorspace.64.o: image-colorspace.c ../cups/versioning.h ../cups/string-private.h ../config.h +image-gif.64.o: image-gif.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-gif.64.o: image-gif.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-gif.64.o: image-gif.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-gif.64.o: image-gif.c ../cups/debug-private.h ../cups/versioning.h +image-gif.64.o: image-gif.c ../cups/string-private.h ../config.h +image-jpeg.64.o: image-jpeg.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-jpeg.64.o: image-jpeg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-jpeg.64.o: image-jpeg.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-jpeg.64.o: image-jpeg.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-jpeg.64.o: image-jpeg.c ../cups/string-private.h ../config.h +image-photocd.64.o: image-photocd.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-photocd.64.o: image-photocd.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-photocd.64.o: image-photocd.c ../cups/http.h ../cups/array.h ../cups/language.h +image-photocd.64.o: image-photocd.c ../cups/ppd.h ../cups/cups.h ../cups/debug-private.h +image-photocd.64.o: image-photocd.c ../cups/versioning.h ../cups/string-private.h ../config.h +image-pix.64.o: image-pix.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pix.64.o: image-pix.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pix.64.o: image-pix.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pix.64.o: image-pix.c ../cups/debug-private.h ../cups/versioning.h +image-pix.64.o: image-pix.c ../cups/string-private.h ../config.h +image-png.64.o: image-png.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-png.64.o: image-png.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-png.64.o: image-png.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-png.64.o: image-png.c ../cups/debug-private.h ../cups/versioning.h +image-png.64.o: image-png.c ../cups/string-private.h ../config.h +image-pnm.64.o: image-pnm.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-pnm.64.o: image-pnm.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-pnm.64.o: image-pnm.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-pnm.64.o: image-pnm.c ../cups/debug-private.h ../cups/versioning.h +image-pnm.64.o: image-pnm.c ../cups/string-private.h ../config.h +image-sgi.64.o: image-sgi.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sgi.64.o: image-sgi.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sgi.64.o: image-sgi.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sgi.64.o: image-sgi.c ../cups/debug-private.h ../cups/versioning.h +image-sgi.64.o: image-sgi.c ../cups/string-private.h ../config.h image-sgi.h +image-sgilib.64.o: image-sgilib.c image-sgi.h +image-sun.64.o: image-sun.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-sun.64.o: image-sun.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image-sun.64.o: image-sun.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image-sun.64.o: image-sun.c ../cups/debug-private.h ../cups/versioning.h +image-sun.64.o: image-sun.c ../cups/string-private.h ../config.h +image-tiff.64.o: image-tiff.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-tiff.64.o: image-tiff.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-tiff.64.o: image-tiff.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-tiff.64.o: image-tiff.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-tiff.64.o: image-tiff.c ../cups/string-private.h ../config.h +image-zoom.64.o: image-zoom.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image-zoom.64.o: image-zoom.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +image-zoom.64.o: image-zoom.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +image-zoom.64.o: image-zoom.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +image-zoom.64.o: image-zoom.c ../cups/string-private.h ../config.h +image.64.o: image.c image-private.h image.h ../cups/raster.h ../cups/cups.h +image.64.o: image.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +image.64.o: image.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +image.64.o: image.c ../cups/debug-private.h ../cups/versioning.h +image.64.o: image.c ../cups/string-private.h ../config.h +error.64.o: error.c image-private.h image.h ../cups/raster.h ../cups/cups.h +error.64.o: error.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +error.64.o: error.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +error.64.o: error.c ../cups/debug-private.h ../cups/versioning.h +error.64.o: error.c ../cups/string-private.h ../config.h +interpret.64.o: interpret.c image-private.h image.h ../cups/raster.h ../cups/cups.h +interpret.64.o: interpret.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +interpret.64.o: interpret.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +interpret.64.o: interpret.c ../cups/debug-private.h ../cups/versioning.h +interpret.64.o: interpret.c ../cups/string-private.h ../config.h +raster.64.o: raster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +raster.64.o: raster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +raster.64.o: raster.c ../cups/array.h ../cups/language.h ../cups/ppd.h ../cups/cups.h +raster.64.o: raster.c ../cups/debug-private.h ../cups/versioning.h +raster.64.o: raster.c ../cups/string-private.h ../config.h +bannertops.64.o: bannertops.c pstext.h common.h ../cups/string-private.h ../config.h +bannertops.64.o: bannertops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +bannertops.64.o: bannertops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +bannertops.64.o: bannertops.c ../cups/array.h ../cups/language.h ../cups/transcode.h image.h +bannertops.64.o: bannertops.c ../cups/raster.h ../cups/ppd.h ../cups/language-private.h +commandtops.64.o: commandtops.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +commandtops.64.o: commandtops.c ../config.h ../cups/debug-private.h ../cups/versioning.h +commandtops.64.o: commandtops.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +commandtops.64.o: commandtops.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +commandtops.64.o: commandtops.c ../cups/http.h ../cups/array.h ../cups/language.h +commandtops.64.o: commandtops.c ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +commandtops.64.o: commandtops.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +commandtops.64.o: commandtops.c ../cups/language-private.h ../cups/transcode.h +commandtops.64.o: commandtops.c ../cups/thread-private.h ../cups/sidechannel.h +gziptoany.64.o: gziptoany.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +gziptoany.64.o: gziptoany.c ../config.h ../cups/debug-private.h ../cups/versioning.h +gziptoany.64.o: gziptoany.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +gziptoany.64.o: gziptoany.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +gziptoany.64.o: gziptoany.c ../cups/array.h ../cups/language.h ../cups/pwg-private.h +gziptoany.64.o: gziptoany.c ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +gziptoany.64.o: gziptoany.c ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +gziptoany.64.o: gziptoany.c ../cups/transcode.h ../cups/thread-private.h +imagetops.64.o: imagetops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetops.64.o: imagetops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +imagetops.64.o: imagetops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +imagetops.64.o: imagetops.c image.h ../cups/raster.h ../cups/ppd.h +imagetops.64.o: imagetops.c ../cups/language-private.h ../cups/transcode.h +imagetoraster.64.o: imagetoraster.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +imagetoraster.64.o: imagetoraster.c ../cups/ppd.h ../cups/cups.h ../cups/file.h +imagetoraster.64.o: imagetoraster.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +imagetoraster.64.o: imagetoraster.c ../cups/array.h ../cups/language.h image-private.h image.h +imagetoraster.64.o: imagetoraster.c ../cups/raster.h ../cups/ppd.h ../cups/debug-private.h +imagetoraster.64.o: imagetoraster.c ../cups/versioning.h ../cups/language-private.h +imagetoraster.64.o: imagetoraster.c ../cups/transcode.h +common.64.o: common.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +common.64.o: common.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +common.64.o: common.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pdftops.64.o: pdftops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pdftops.64.o: pdftops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pdftops.64.o: pdftops.c ../cups/language.h ../cups/string-private.h ../config.h +pdftops.64.o: pdftops.c ../cups/language-private.h ../cups/transcode.h +pstext.64.o: pstext.c pstext.h common.h ../cups/string-private.h ../config.h +pstext.64.o: pstext.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +pstext.64.o: pstext.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +pstext.64.o: pstext.c ../cups/language.h ../cups/transcode.h ../cups/language-private.h +pstops.64.o: pstops.c common.h ../cups/string-private.h ../config.h ../cups/cups.h +pstops.64.o: pstops.c ../cups/ppd.h ../cups/cups.h ../cups/file.h ../cups/versioning.h +pstops.64.o: pstops.c ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +pstops.64.o: pstops.c ../cups/file.h ../cups/array.h ../cups/language-private.h +pstops.64.o: pstops.c ../cups/transcode.h +rasterbench.64.o: rasterbench.c ../config.h ../cups/raster.h ../cups/cups.h ../cups/file.h +rasterbench.64.o: rasterbench.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rasterbench.64.o: rasterbench.c ../cups/array.h ../cups/language.h ../cups/ppd.h +rastertoepson.64.o: rastertoepson.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertoepson.64.o: rastertoepson.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertoepson.64.o: rastertoepson.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertoepson.64.o: rastertoepson.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertoepson.64.o: rastertoepson.c ../cups/raster.h ../cups/ppd.h +rastertohp.64.o: rastertohp.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertohp.64.o: rastertohp.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertohp.64.o: rastertohp.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertohp.64.o: rastertohp.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertohp.64.o: rastertohp.c ../cups/raster.h ../cups/ppd.h +rastertolabel.64.o: rastertolabel.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +rastertolabel.64.o: rastertolabel.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +rastertolabel.64.o: rastertolabel.c ../cups/array.h ../cups/language.h ../cups/string-private.h +rastertolabel.64.o: rastertolabel.c ../config.h ../cups/language-private.h ../cups/transcode.h +rastertolabel.64.o: rastertolabel.c ../cups/raster.h ../cups/ppd.h +rastertopwg.64.o: rastertopwg.c ../cups/cups-private.h ../cups/cups.h ../cups/string-private.h +rastertopwg.64.o: rastertopwg.c ../config.h ../cups/debug-private.h ../cups/versioning.h +rastertopwg.64.o: rastertopwg.c ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +rastertopwg.64.o: rastertopwg.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +rastertopwg.64.o: rastertopwg.c ../cups/http.h ../cups/array.h ../cups/language.h +rastertopwg.64.o: rastertopwg.c ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +rastertopwg.64.o: rastertopwg.c ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +rastertopwg.64.o: rastertopwg.c ../cups/language-private.h ../cups/transcode.h +rastertopwg.64.o: rastertopwg.c ../cups/thread-private.h ../cups/raster.h ../cups/ppd.h +testimage.64.o: testimage.c image.h ../cups/raster.h ../cups/cups.h ../cups/file.h +testimage.64.o: testimage.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testimage.64.o: testimage.c ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.64.o: testraster.c image-private.h image.h ../cups/raster.h ../cups/cups.h +testraster.64.o: testraster.c ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testraster.64.o: testraster.c ../cups/http.h ../cups/array.h ../cups/language.h ../cups/ppd.h +testraster.64.o: testraster.c ../cups/cups.h ../cups/debug-private.h ../cups/versioning.h +testraster.64.o: testraster.c ../cups/string-private.h ../config.h +textcommon.64.o: textcommon.c textcommon.h common.h ../cups/string-private.h ../config.h +textcommon.64.o: textcommon.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +textcommon.64.o: textcommon.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h +textcommon.64.o: textcommon.c ../cups/array.h ../cups/language.h ../cups/language-private.h +textcommon.64.o: textcommon.c ../cups/transcode.h +texttops.64.o: texttops.c textcommon.h common.h ../cups/string-private.h ../config.h +texttops.64.o: texttops.c ../cups/cups.h ../cups/ppd.h ../cups/cups.h ../cups/file.h +texttops.64.o: texttops.c ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +texttops.64.o: texttops.c ../cups/language.h ../cups/language-private.h ../cups/transcode.h diff --git a/filter/Makefile b/filter/Makefile new file mode 100644 index 0000000..af99f1e --- /dev/null +++ b/filter/Makefile @@ -0,0 +1,527 @@ +# +# "$Id: Makefile 9979 2011-09-09 16:34:29Z mike $" +# +# Filter makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# This file is subject to the Apple OS-Developed Software exception. +# + +include ../Makedefs + + +FILTERS = \ + $(BANNERTOPS) \ + commandtops \ + gziptoany \ + $(TEXTTOPS) \ + pstops \ + $(IMGFILTERS) \ + $(PDFTOPS) \ + rastertoepson \ + rastertohp \ + rastertolabel \ + rastertopwg +LIBTARGETS = \ + $(LIBCUPSIMAGE) \ + libcupsimage.a \ + $(LIB32CUPSIMAGE) \ + $(LIB64CUPSIMAGE) +UNITTARGETS = \ + rasterbench \ + testimage \ + testraster +TARGETS = \ + $(LIBTARGETS) \ + $(FILTERS) + +IMAGEOBJS = image-bmp.o image-colorspace.o image-gif.o image-jpeg.o \ + image-photocd.o image-pix.o image-png.o image-pnm.o \ + image-sgi.o image-sgilib.o image-sun.o image-tiff.o \ + image-zoom.o image.o error.o interpret.o raster.o +IMAGE32OBJS = $(IMAGEOBJS:.o=.32.o) +IMAGE64OBJS = $(IMAGEOBJS:.o=.64.o) +OBJS = $(IMAGEOBJS) \ + bannertops.o commandtops.o gziptoany.o imagetops.o \ + imagetoraster.o common.o pdftops.o pstext.o pstops.o \ + rasterbench.o rastertoepson.o rastertohp.o rastertolabel.o \ + rastertopwg.o testimage.o testraster.o textcommon.o texttops.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: $(LIBTARGETS) + + +# +# Make unit tests... +# + +unittests: $(UNITTARGETS) + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) $(UNITTARGETS) + $(RM) libcupsimage.so libcupsimage.sl libcupsimage.dylib + $(RM) -r 32bit 64bit + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + touch Dependencies.tmp + makedepend -Y -I.. -fDependencies.tmp $(OBJS:.o=.c) >/dev/null 2>&1 + $(RM) Dependencies + cp Dependencies.tmp Dependencies + sed -E -e '1,$$s/^([^.]+)\.o:/\1\.32.o: \1\.c /' Dependencies.tmp >>Dependencies + sed -E -e '1,$$s/^([^.]+)\.o:/\1\.64.o: \1\.c /' Dependencies.tmp >>Dependencies + $(RM) Dependencies.tmp + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + $(INSTALL_DIR) -m 755 $(SERVERBIN)/filter + for file in $(FILTERS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/filter; \ + done + $(RM) $(SERVERBIN)/filter/rastertodymo + $(LN) rastertolabel $(SERVERBIN)/filter/rastertodymo + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(FILTERS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + $(INSTALL_DATA) image.h $(INCLUDEDIR)/cups + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) $(INSTALL32) $(INSTALL64) + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPSIMAGE) $(LIBDIR) + -if test $(LIBCUPSIMAGE) = "libcupsimage.so.2" -o $(LIBCUPSIMAGE) = "libcupsimage.sl.2"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPSIMAGE) .2`; \ + $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/`basename $(LIBCUPSIMAGE) .2`; \ + fi + -if test $(LIBCUPSIMAGE) = "libcupsimage.2.dylib"; then \ + $(RM) $(LIBDIR)/libcupsimage.dylib; \ + $(LN) $(LIBCUPSIMAGE) $(LIBDIR)/libcupsimage.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPSIMAGE) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 libcupsimage.a $(LIBDIR) + $(RANLIB) $(LIBDIR)/libcupsimage.a + $(CHMOD) 555 $(LIBDIR)/libcupsimage.a + +install32bit: + $(INSTALL_DIR) -m 755 $(LIB32DIR) + $(INSTALL_LIB) 32bit/libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so.2 + $(LN) libcupsimage.so.2 $(LIB32DIR)/libcupsimage.so + +install64bit: + $(INSTALL_DIR) -m 755 $(LIB64DIR) + $(INSTALL_LIB) 64bit/libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so.2 + $(LN) libcupsimage.so.2 $(LIB64DIR)/libcupsimage.so + + +# +# Uninstall all targets... +# + +uninstall: $(UNINSTALL32) $(UNINSTALL64) + for file in $(FILTERS); do \ + $(RM) $(SERVERBIN)/filter/$$file; \ + done + $(RM) $(SERVERBIN)/filter/rastertodymo + -$(RMDIR) $(SERVERBIN)/filter + -$(RMDIR) $(SERVERBIN) + $(RM) $(LIBDIR)/libcupsimage.2.dylib + $(RM) $(LIBDIR)/libcupsimage.a + $(RM) $(LIBDIR)/libcupsimage.dylib + $(RM) $(LIBDIR)/libcupsimage_s.a + $(RM) $(LIBDIR)/libcupsimage.sl + $(RM) $(LIBDIR)/libcupsimage.sl.2 + $(RM) $(LIBDIR)/libcupsimage.so + $(RM) $(LIBDIR)/libcupsimage.so.2 + -$(RMDIR) $(LIBDIR) + $(RM) $(INCLUDEDIR)/cups/image.h + -$(RMDIR) $(INCLUDEDIR)/cups + +uninstall32bit: + $(RM) $(LIB32DIR)/libcupsimage.so + $(RM) $(LIB32DIR)/libcupsimage.so.2 + -$(RMDIR) $(LIB32DIR) + +uninstall64bit: + $(RM) $(LIB64DIR)/libcupsimage.so + $(RM) $(LIB64DIR)/libcupsimage.so.2 + -$(RMDIR) $(LIB64DIR) + + +# +# Automatic API help files... +# + +apihelp: + echo Generating CUPS API help files... + mxmldoc --section "Programming" --title "Raster API" \ + --css ../doc/cups-printable.css \ + --header api-raster.header --intro api-raster.shtml \ + api-raster.xml \ + ../cups/raster.h interpret.c raster.c \ + >../doc/help/api-raster.html + mxmldoc --tokens help/api-raster.html api-raster.xml >../doc/help/api-raster.tokens + $(RM) api-raster.xml + mxmldoc --section "Programming" \ + --title "Developing PostScript Printer Drivers" \ + --css ../doc/cups-printable.css \ + --header postscript-driver.header \ + --intro postscript-driver.shtml \ + >../doc/help/postscript-driver.html + mxmldoc --section "Programming" \ + --title "Introduction to the PPD Compiler" \ + --css ../doc/cups-printable.css \ + --header ppd-compiler.header \ + --intro ppd-compiler.shtml \ + >../doc/help/ppd-compiler.html + mxmldoc --section "Programming" \ + --title "Developing Raster Printer Drivers" \ + --css ../doc/cups-printable.css \ + --header raster-driver.header \ + --intro raster-driver.shtml \ + >../doc/help/raster-driver.html + mxmldoc --section "Specifications" \ + --title "CUPS PPD Extensions" \ + --css ../doc/cups-printable.css \ + --header spec-ppd.header \ + --intro spec-ppd.shtml \ + >../doc/help/spec-ppd.html + +framedhelp: + echo Generating CUPS API help files... + mxmldoc --section "Programming" --title "Raster API" \ + --framed ../cups/api-raster \ + --css ../doc/cups-printable.css \ + --header api-raster.header --intro api-raster.shtml \ + ../cups/raster.h interpret.c raster.c + mxmldoc --section "Programming" \ + --title "Developing PostScript Printer Drivers" \ + --framed ../cups/postscript-driver \ + --css ../doc/cups-printable.css \ + --header postscript-driver.header \ + --intro postscript-driver.shtml + mxmldoc --section "Programming" \ + --title "Introduction to the PPD Compiler" \ + --framed ../cups/ppd-compiler \ + --css ../doc/cups-printable.css \ + --header ppd-compiler.header \ + --intro ppd-compiler.shtml + mxmldoc --section "Programming" \ + --title "Developing Raster Printer Drivers" \ + --framed ../cups/raster-driver \ + --css ../doc/cups-printable.css \ + --header raster-driver.header \ + --intro raster-driver.shtml + mxmldoc --section "Specifications" \ + --title "CUPS PPD Extensions" \ + --framed ../cups/spec-ppd \ + --css ../doc/cups-printable.css \ + --header spec-ppd.header \ + --intro spec-ppd.shtml \ + + +# +# bannertops +# + +bannertops: bannertops.o pstext.o common.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ bannertops.o pstext.o common.o $(LINKCUPSIMAGE) \ + $(IMGLIBS) $(LIBS) + + +# +# commandtops +# + +commandtops: commandtops.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ commandtops.o $(LIBS) + + +# +# gziptoany +# + +gziptoany: gziptoany.o ../Makedefs ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ gziptoany.o $(LIBZ) $(LIBS) + + +# +# libcupsimage.so.2, libcupsimage.sl.2 +# + +libcupsimage.so.2 libcupsimage.sl.2: $(IMAGEOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(IMAGEOBJS) $(DSOLIBS) \ + -L../cups $(LINKCUPS) + $(RM) `basename $@ .2` + $(LN) $@ `basename $@ .2` + + +# +# 32bit/libcupsimage.so.2 +# + +32bit/libcupsimage.so.2: $(IMAGE32OBJS) + echo Linking 32-bit $@... + -mkdir 32bit + $(DSO) $(ARCH32FLAGS) $(DSO32FLAGS) -o $@ $(IMAGE32OBJS) $(DSOLIBS) \ + -L../cups/32bit $(LINKCUPS) + + +# +# 64bit/libcupsimage.so.2 +# + +64bit/libcupsimage.so.2: $(IMAGE64OBJS) + echo Linking 64-bit $@... + -mkdir 64bit + $(DSO) $(ARCH64FLAGS) $(DSO64FLAGS) -o $@ $(IMAGE64OBJS) $(DSOLIBS) \ + -L../cups/64bit $(LINKCUPS) + + +# +# libcupsimage.2.dylib +# + +libcupsimage.2.dylib: $(IMAGEOBJS) $(LIBCUPSIMAGEORDER) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 2.3.0 \ + -compatibility_version 2.0.0 \ + $(IMAGEOBJS) $(DSOLIBS) -L../cups $(LINKCUPS) + $(RM) libcupsimage.dylib + $(LN) $@ libcupsimage.dylib + + +# +# libcupsimage_s.a +# + +libcupsimage_s.a: $(IMAGEOBJS) libcupsimage_s.exp + echo Linking $@... + $(DSO) $(DSOFLAGS) -Wl,-berok,-bexport:libcupsimage_s.exp \ + -o libcupsimage_s.o $(IMAGEOBJS) $(DSOLIBS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcupsimage_s.o + + +# +# libcupsimage.la +# + +libcupsimage.la: $(IMAGEOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(IMAGEOBJS:.o=.lo) $(DSOLIBS) \ + -L../cups $(LINKCUPS) \ + -rpath $(LIBDIR) -version-info 2:3 + + +# +# libcupsimage.a +# + +libcupsimage.a: $(IMAGEOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(IMAGEOBJS) + $(RANLIB) $@ + + +# +# testimage +# + +testimage: testimage.o libcupsimage.a ../Makedefs + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ testimage.o libcupsimage.a \ + $(IMGLIBS) $(DSOLIBS) $(LIBS) + + +# +# imagetops +# + +imagetops: imagetops.o common.o $(LIBCUPSIMAGE) \ + ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ imagetops.o common.o $(LINKCUPSIMAGE) \ + $(IMGLIBS) $(LIBS) + + +# +# imagetoraster +# + +imagetoraster: imagetoraster.o common.o $(LIBCUPSIMAGE) \ + ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ imagetoraster.o common.o $(LINKCUPSIMAGE) \ + $(IMGLIBS) $(LIBS) + + +# +# pstops +# + +pstops: pstops.o common.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ pstops.o common.o $(LIBS) + + +# +# pdftops +# + +pdftops: pdftops.o common.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ pdftops.o common.o $(LIBS) + + +# +# rastertoepson +# + +rastertoepson: rastertoepson.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertoepson.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) + + +# +# rastertohp +# + +rastertohp: rastertohp.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertohp.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) + + +# +# rastertolabel +# + +rastertolabel: rastertolabel.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertolabel.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) + + +# +# rastertopwg +# + +rastertopwg: rastertopwg.o ../cups/$(LIBCUPS) $(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rastertopwg.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) + + +# +# testraster +# + +testraster: testraster.o ../cups/$(LIBCUPSSTATIC) libcupsimage.a + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testraster.o libcupsimage.a \ + ../cups/$(LIBCUPSSTATIC) $(IMGLIBS) $(DSOLIBS) $(COMMONLIBS) \ + $(SSLLIBS) $(DNSSDLIBS) $(LIBGSSAPI) + echo Running raster API tests... + ./testraster + + +# +# rasterbench +# + +rasterbench: rasterbench.o libcupsimage.a + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ rasterbench.o libcupsimage.a $(LIBS) + + +# +# texttops +# + +texttops: texttops.o textcommon.o common.o \ + ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ texttops.o textcommon.o common.o $(LIBS) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9979 2011-09-09 16:34:29Z mike $". +# diff --git a/filter/api-raster.header b/filter/api-raster.header new file mode 100644 index 0000000..201c799 --- /dev/null +++ b/filter/api-raster.header @@ -0,0 +1,37 @@ + + +

Raster API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/raster.h
Library-lcupsimage
See AlsoProgramming: Introduction to CUPS Programming
+ Programming: CUPS API
+ Programming: PPD API
+ References: CUPS PPD Specification
diff --git a/filter/api-raster.shtml b/filter/api-raster.shtml new file mode 100644 index 0000000..a309022 --- /dev/null +++ b/filter/api-raster.shtml @@ -0,0 +1,160 @@ + + +
+ +

The CUPS raster API provides a standard interface for reading and writing +CUPS raster streams which are used for printing to raster printers. Because the +raster format is updated from time to time, it is important to use this API to +avoid incompatibilities with newer versions of CUPS.

+ +

Two kinds of CUPS filters use the CUPS raster API - raster image processor +(RIP) filters such as pstoraster and cgpdftoraster +(Mac OS X) that produce CUPS raster files and printer driver filters that +convert CUPS raster files into a format usable by the printer. Printer +driver filters are by far the most common.

+ +

CUPS raster files (application/vnd.cups-raster) consists of +a stream of raster page descriptions produced by one of the RIP filters such as +pstoraster, imagetoraster, or +cgpdftoraster. CUPS raster files are referred to using the +cups_raster_t type and are +opened using the cupsRasterOpen +function. For example, to read raster data from the standard input, open +file descriptor 0:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+
+ +

Each page of data begins with a page dictionary structure called +cups_page_header2_t. This +structure contains the colorspace, bits per color, media size, media type, +hardware resolution, and so forth used for the page.

+ +
Note: + +

Do not confuse the colorspace in the page header with the PPD + ColorModel keyword. ColorModel refers to the general type of + color used for a device (Gray, RGB, CMYK, DeviceN) and is often used to + select a particular colorspace for the page header along with the associate + color profile. The page header colorspace (cupsColorSpace) describes + both the type and organization of the color data, for example KCMY (black + first) instead of CMYK and RGBA (RGB + alpha) instead of RGB.

+ +
+ +

You read the page header using the +cupsRasterReadHeader2 +function:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+cups_page_header2_t header;
+
+while (cupsRasterReadHeader2(ras, &header))
+{
+  /* setup this page */
+
+  /* read raster data */
+
+  /* finish this page */
+}
+
+ +

After the page dictionary comes the page data which is a full-resolution, +possibly compressed bitmap representing the page in the printer's output +colorspace. You read uncompressed raster data using the +cupsRasterReadPixels +function. A for loop is normally used to read the page one line +at a time:

+ +
+#include <cups/raster.h>>
+
+cups_raster_t *ras = cupsRasterOpen(0, CUPS_RASTER_READ);
+cups_page_header2_t header;
+int page = 0;
+int y;
+char *buffer;
+
+while (cupsRasterReadHeader2(ras, &header))
+{
+  /* setup this page */
+  page ++;
+  fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies);
+
+  /* allocate memory for 1 line */
+  buffer = malloc(header.cupsBytesPerLine);
+
+  /* read raster data */
+  for (y = 0; y < header.cupsHeight; y ++)
+  {
+    if (cupsRasterReadPixels(ras, buffer, header.cupsBytesPerLine) == 0)
+      break;
+
+    /* write raster data to printer on stdout */
+  }
+
+  /* finish this page */
+}
+
+ +

When you are done reading the raster data, call the +cupsRasterClose function to free +the memory used to read the raster file:

+ +
+cups_raster_t *ras;
+
+cupsRasterClose(ras);
+
+ + +

Functions by Task

+ +

Opening and Closing Raster Streams

+ + + +

Reading Raster Streams

+ + + +

Writing Raster Streams

+ + diff --git a/filter/bannertops.c b/filter/bannertops.c new file mode 100644 index 0000000..c017c5f --- /dev/null +++ b/filter/bannertops.c @@ -0,0 +1,1094 @@ +/* + * "$Id: bannertops.c 9793 2011-05-20 03:49:49Z mike $" + * + * Banner to PostScript filter for CUPS. + * + * Copyright 2008-2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Generate PostScript cover pages. + * load_banner() - Load the banner file. + * ps_ascii85() - Print binary data as a series of base-85 numbers. + * write_banner() - Write a banner page... + * write_epilogue() - Write the PostScript file epilogue. + * write_prolog() - Write the PostScript file prolog with options. + */ + +/* + * Include necessary headers... + */ + +#include "pstext.h" +#include "image.h" +#include + + +/* + * Constants... + */ + +#define SHOW_IMAGEABLE_AREA 1 /* Show imageable area */ +#define SHOW_JOB_BILLING 2 /* Show billing string */ +#define SHOW_JOB_ID 4 /* Show job ID */ +#define SHOW_JOB_NAME 8 /* Show job title */ +#define SHOW_JOB_ORIGINATING_USER_NAME 16 /* Show owner of job */ +#define SHOW_JOB_ORIGINATING_HOST_NAME 32 /* Show submitting system */ +#define SHOW_JOB_UUID 64 /* Show job UUID */ +#define SHOW_OPTIONS 128 /* Show print options */ +#define SHOW_PAPER_NAME 256 /* Show paper size name */ +#define SHOW_PAPER_SIZE 512 /* Show paper dimensions */ +#define SHOW_PRINTER_DRIVER_NAME 1024 /* Show printer driver name */ +#define SHOW_PRINTER_DRIVER_VERSION 2048 /* Show printer driver version */ +#define SHOW_PRINTER_INFO 4096 /* Show printer description */ +#define SHOW_PRINTER_LOCATION 8192 /* Show printer location */ +#define SHOW_PRINTER_MAKE_AND_MODEL 16384 /* Show printer make and model */ +#define SHOW_PRINTER_NAME 32768 /* Show printer queue ID */ +#define SHOW_TIME_AT_CREATION 65536 /* Show date/time when submitted */ +#define SHOW_TIME_AT_PROCESSING 131072 /* Show date/time when printed */ + + +/* + * Structures... + */ + +typedef struct banner_file_s /**** Banner file data ****/ +{ + int show; /* What to show */ + char *header, /* Header text */ + *footer; /* Footer text */ + cups_array_t *notices, /* Notices to show */ + *images; /* Images to show */ +} banner_file_t; + + +/* + * Local functions... + */ + +static banner_file_t *load_banner(const char *filename); +static int write_banner(banner_file_t *banner, ppd_file_t *ppd, + ps_text_t *fonts, int job_id, + const char *title, const char *username, + int num_options, cups_option_t *options); +static void write_epilogue(int num_pages); +static ps_text_t *write_prolog(const char *title, const char *user); + + +/* + * 'main()' - Generate PostScript cover pages. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + banner_file_t *banner; /* Banner file data */ + int num_options; /* Number of print options */ + cups_option_t *options; /* Print options */ + ppd_file_t *ppd; /* PPD file */ + ps_text_t *fonts; /* Fonts for output */ + int job_id; /* Job ID from command-line */ + const char *title, /* Title from command-line */ + *username; /* Username from command-line */ + int num_pages; /* Number of pages printed */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * Get stuff from command-line... + */ + + job_id = atoi(argv[1]); + username = argv[2]; + title = argv[3]; + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + banner = load_banner(argv[6]); + + /* + * Set standard options and get the PPD file for this printer... + */ + + ppd = SetCommonOptions(num_options, options, 1); + + /* + * Write a PostScript banner document and return... + */ + + fonts = write_prolog(title, username); + num_pages = write_banner(banner, ppd, fonts, job_id, title, username, + num_options, options); + + write_epilogue(num_pages); + + return (0); +} + + +/* + * 'load_banner()' - Load the banner file. + */ + +static banner_file_t * /* O - Banner file data */ +load_banner(const char *filename) /* I - Filename or NULL for stdin */ +{ + cups_file_t *fp; /* File */ + char line[2048], /* Line buffer */ + *ptr; /* Pointer into line */ + int linenum; /* Current line number */ + banner_file_t *banner; /* Banner file data */ + const char *cups_docroot; /* CUPS_DOCROOT environment variable */ + + + fprintf(stderr, "DEBUG: load_banner(filename=\"%s\")\n", + filename ? filename : "(stdin)"); + + /* + * Open the banner file... + */ + + if (filename) + fp = cupsFileOpen(filename, "r"); + else + fp = cupsFileStdin(); + + if (!fp) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + exit(1); + } + + /* + * Read the banner file... + */ + + if ((cups_docroot = getenv("CUPS_DOCROOT")) == NULL) + cups_docroot = CUPS_DOCROOT; + + banner = calloc(1, sizeof(banner_file_t)); + linenum = 0; + + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Skip blank and comment lines... + */ + + linenum ++; + + fprintf(stderr, "DEBUG: %4d %s\n", linenum, line); + + if (line[0] == '#' || !line[0]) + continue; + + /* + * Break the line into keyword and value parts... + */ + + for (ptr = line; *ptr && !isspace(*ptr & 255); ptr ++); + + while (isspace(*ptr & 255)) + *ptr++ = '\0'; + + if (!*ptr) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Missing value on line %d of banner file."), + linenum); + continue; + } + + /* + * Save keyword values in the appropriate places... + */ + + if (!_cups_strcasecmp(line, "Footer")) + { + if (banner->footer) + fprintf(stderr, "DEBUG: Extra \"Footer\" on line %d of banner file\n", + linenum); + else + banner->footer = strdup(ptr); + } + else if (!_cups_strcasecmp(line, "Header")) + { + if (banner->header) + fprintf(stderr, "DEBUG: Extra \"Header\" on line %d of banner file\n", + linenum); + else + banner->header = strdup(ptr); + } + else if (!_cups_strcasecmp(line, "Image")) + { + char imagefile[1024]; /* Image filename */ + + + if (ptr[0] == '/') + strlcpy(imagefile, ptr, sizeof(imagefile)); + else + snprintf(imagefile, sizeof(imagefile), "%s/%s", cups_docroot, ptr); + + if (access(imagefile, R_OK)) + { + fprintf(stderr, "DEBUG: Image \"%s\" on line %d of banner file: %s\n", + ptr, linenum, strerror(errno)); + } + else + { + if (!banner->images) + banner->images = cupsArrayNew(NULL, NULL); + + cupsArrayAdd(banner->images, strdup(imagefile)); + } + } + else if (!_cups_strcasecmp(line, "Notice")) + { + if (!banner->notices) + banner->notices = cupsArrayNew(NULL, NULL); + + cupsArrayAdd(banner->notices, strdup(ptr)); + } + else if (!_cups_strcasecmp(line, "Show")) + { + char *value; /* Current value */ + + + for (value = ptr; *value; value = ptr) + { + /* + * Find the end of the current value + */ + + while (*ptr && !isspace(*ptr & 255)) + ptr ++; + + while (*ptr && isspace(*ptr & 255)) + *ptr++ = '\0'; + + /* + * Add the value to the show flags... + */ + if (!_cups_strcasecmp(value, "imageable-area")) + banner->show |= SHOW_IMAGEABLE_AREA; + else if (!_cups_strcasecmp(value, "job-billing")) + banner->show |= SHOW_JOB_BILLING; + else if (!_cups_strcasecmp(value, "job-id")) + banner->show |= SHOW_JOB_ID; + else if (!_cups_strcasecmp(value, "job-name")) + banner->show |= SHOW_JOB_NAME; + else if (!_cups_strcasecmp(value, "job-originating-host-name")) + banner->show |= SHOW_JOB_ORIGINATING_HOST_NAME; + else if (!_cups_strcasecmp(value, "job-originating-user-name")) + banner->show |= SHOW_JOB_ORIGINATING_USER_NAME; + else if (!_cups_strcasecmp(value, "job-uuid")) + banner->show |= SHOW_JOB_UUID; + else if (!_cups_strcasecmp(value, "options")) + banner->show |= SHOW_OPTIONS; + else if (!_cups_strcasecmp(value, "paper-name")) + banner->show |= SHOW_PAPER_NAME; + else if (!_cups_strcasecmp(value, "paper-size")) + banner->show |= SHOW_PAPER_SIZE; + else if (!_cups_strcasecmp(value, "printer-driver-name")) + banner->show |= SHOW_PRINTER_DRIVER_NAME; + else if (!_cups_strcasecmp(value, "printer-driver-version")) + banner->show |= SHOW_PRINTER_DRIVER_VERSION; + else if (!_cups_strcasecmp(value, "printer-info")) + banner->show |= SHOW_PRINTER_INFO; + else if (!_cups_strcasecmp(value, "printer-location")) + banner->show |= SHOW_PRINTER_LOCATION; + else if (!_cups_strcasecmp(value, "printer-make-and-model")) + banner->show |= SHOW_PRINTER_MAKE_AND_MODEL; + else if (!_cups_strcasecmp(value, "printer-name")) + banner->show |= SHOW_PRINTER_NAME; + else if (!_cups_strcasecmp(value, "time-at-creation")) + banner->show |= SHOW_TIME_AT_CREATION; + else if (!_cups_strcasecmp(value, "time-at-processing")) + banner->show |= SHOW_TIME_AT_PROCESSING; + else + { + fprintf(stderr, + "DEBUG: Unknown \"Show\" value \"%s\" on line %d of banner " + "file\n", value, linenum); + } + } + } + else + fprintf(stderr, "DEBUG: Unknown key \"%s\" on line %d of banner file\n", + line, linenum); + } + + if (filename) + cupsFileClose(fp); + + return (banner); +} + + +/* + * 'ps_ascii85()' - Print binary data as a series of base-85 numbers. + */ + +static void +ps_ascii85(cups_ib_t *data, /* I - Data to print */ + int length, /* I - Number of bytes to print */ + int last_line) /* I - Last line of raster data? */ +{ + unsigned b; /* Binary data word */ + unsigned char c[5]; /* ASCII85 encoded chars */ + static int col = 0; /* Current column */ + + + while (length > 3) + { + b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; + + if (b == 0) + { + putchar('z'); + col ++; + } + else + { + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + fwrite(c, 5, 1, stdout); + col += 5; + } + + data += 4; + length -= 4; + + if (col >= 75) + { + putchar('\n'); + col = 0; + } + } + + if (last_line) + { + if (length > 0) + { + memset(data + length, 0, 4 - length); + b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; + + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + fwrite(c, length + 1, 1, stdout); + } + + puts("~>"); + col = 0; + } +} + + +/* + * 'write_banner()' - Write a banner page... + */ + +static int /* O - Number of pages */ +write_banner(banner_file_t *banner, /* I - Banner file */ + ppd_file_t *ppd, /* I - PPD file */ + ps_text_t *fonts, /* I - Fonts */ + int job_id, /* I - Job ID */ + const char *title, /* I - Title of job */ + const char *username, /* I - Owner of job */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + char *notice; /* Current notice */ + char *imagefile; /* Current image file */ + cups_array_t *images; /* Images */ + cups_image_t *image; /* Current image */ + const char *option; /* Option value */ + int i, j; /* Looping vars */ + float x, /* Current X position */ + y; /* Current Y position */ + cups_lang_t *language; /* Default language */ + int showlines; /* Number of lines to show */ + float fontsize; /* Font size to use */ + int num_pages; /* Number of pages */ + float print_width, /* Printable width of page */ + print_height, /* Printable height of page */ + info_top, /* Top of info fields */ + info_height, /* Height of info fields */ + line_height, /* Height of info lines */ + notices_height, /* Height of all notices */ + images_width, /* Width of all images */ + images_height, /* Height of all images */ + total_height; /* Height of all content */ + char text[1024]; /* Formatted field text */ + + + /* + * Figure out how many lines of text will be shown... + */ + + showlines = 0; + if (banner->show & SHOW_IMAGEABLE_AREA) + showlines += 2; + if (banner->show & SHOW_JOB_BILLING) + showlines ++; + if (banner->show & SHOW_JOB_ID) + showlines ++; + if (banner->show & SHOW_JOB_NAME) + showlines ++; + if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME) + showlines ++; + if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME) + showlines ++; + if (banner->show & SHOW_JOB_UUID) + showlines ++; + if (banner->show & SHOW_OPTIONS) + { + for (j = 0; j < num_options; j ++) + { + if (_cups_strcasecmp("media", options[j].name) && + _cups_strcasecmp("PageSize", options[j].name) && + _cups_strcasecmp("PageRegion", options[j].name) && + _cups_strcasecmp("InputSlot", options[j].name) && + _cups_strcasecmp("MediaType", options[j].name) && + _cups_strcasecmp("finishings", options[j].name) && + _cups_strcasecmp("sides", options[j].name) && + _cups_strcasecmp("Duplex", options[j].name) && + _cups_strcasecmp("orientation-requested", options[j].name) && + _cups_strcasecmp("landscape", options[j].name) && + _cups_strcasecmp("number-up", options[j].name) && + _cups_strcasecmp("OutputOrder", options[j].name)) + continue; + + showlines ++; + } + } + if (banner->show & SHOW_PAPER_NAME) + showlines ++; + if (banner->show & SHOW_PAPER_SIZE) + showlines += 2; + if (banner->show & SHOW_PRINTER_DRIVER_NAME) + showlines ++; + if (banner->show & SHOW_PRINTER_DRIVER_VERSION) + showlines ++; + if (banner->show & SHOW_PRINTER_INFO) + showlines ++; + if (banner->show & SHOW_PRINTER_LOCATION) + showlines ++; + if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL) + showlines ++; + if (banner->show & SHOW_PRINTER_NAME) + showlines ++; + if (banner->show & SHOW_TIME_AT_CREATION) + showlines ++; + if (banner->show & SHOW_TIME_AT_PROCESSING) + showlines ++; + + /* + * Figure out the dimensions and positions of everything... + */ + + print_width = PageRight - PageLeft; + print_height = PageTop - PageBottom; + fontsize = print_height / 60; /* Nominally 12pts */ + line_height = 1.2 * fontsize; + info_height = showlines * line_height; + notices_height = cupsArrayCount(banner->notices) * line_height; + + if (cupsArrayCount(banner->images)) + { + images = cupsArrayNew(NULL, NULL); + images_height = print_height / 10; /* Nominally 1" */ + + for (imagefile = (char *)cupsArrayFirst(banner->images), images_width = 0.0; + imagefile; + imagefile = (char *)cupsArrayNext(banner->images)) + { + if ((image = cupsImageOpen(imagefile, ColorDevice ? CUPS_IMAGE_RGB_CMYK : + CUPS_IMAGE_WHITE, + CUPS_IMAGE_WHITE, 100, 0, NULL)) == NULL) + { + fprintf(stderr, "DEBUG: Unable to open image file \"%s\"\n", + imagefile); + continue; + } + + images_width += cupsImageGetWidth(image) * images_height / + cupsImageGetHeight(image); + cupsArrayAdd(images, image); + } + } + else + { + images = NULL; + images_height = 0; + images_width = 0; + } + + total_height = info_height + notices_height + images_height; + if (cupsArrayCount(banner->notices) && showlines) + total_height += 2 * line_height; + if (cupsArrayCount(banner->images) && + (showlines || cupsArrayCount(banner->notices))) + total_height += 2 * line_height; + + info_top = 0.5 * (print_height + total_height); + + /* + * Write the page(s)... + */ + + language = cupsLangDefault(); + num_pages = Duplex ? 2 : 1; + + for (i = 1; i <= num_pages; i ++) + { + /* + * Start the page... + */ + + printf("%%%%Page: %s %d\n", i == 1 ? "coverpage" : "coverback", i); + puts("gsave"); + if (i == 1) + printf("%.1f %.1f translate\n", PageLeft, PageBottom); + else + printf("%.1f %.1f translate\n", PageWidth - PageRight, + PageLength - PageTop); + puts("0 setgray"); + + y = info_top; + + /* + * Information... + */ + + if (banner->show) + { + x = 0.33 * print_width; + + if (banner->show & SHOW_PRINTER_NAME) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Printer Name: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, getenv("PRINTER")); + } + if (banner->show & SHOW_JOB_ID) + { + snprintf(text, sizeof(text), "%s-%d", getenv("PRINTER"), job_id); + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Job ID: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + } + if (banner->show & SHOW_JOB_UUID) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Job UUID: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + cupsGetOption("job-uuid", num_options, options)); + } + if (banner->show & SHOW_JOB_NAME) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Title: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, title); + } + if (banner->show & SHOW_JOB_ORIGINATING_USER_NAME) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Printed For: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, username); + } + if (banner->show & SHOW_JOB_ORIGINATING_HOST_NAME) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Printed From: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + cupsGetOption("job-originating-host-name", num_options, + options)); + } + if (banner->show & SHOW_JOB_BILLING) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Billing Information: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + cupsGetOption("job-billing", num_options, options)); + } + if (banner->show & SHOW_OPTIONS) + { + printf("%.1f %.1f moveto", x, y); + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Options: "))); + + for (j = 0; j < num_options; j ++) + { + if (_cups_strcasecmp("media", options[j].name) && + _cups_strcasecmp("PageSize", options[j].name) && + _cups_strcasecmp("PageRegion", options[j].name) && + _cups_strcasecmp("InputSlot", options[j].name) && + _cups_strcasecmp("MediaType", options[j].name) && + _cups_strcasecmp("finishings", options[j].name) && + _cups_strcasecmp("sides", options[j].name) && + _cups_strcasecmp("Duplex", options[j].name) && + _cups_strcasecmp("orientation-requested", options[j].name) && + _cups_strcasecmp("landscape", options[j].name) && + _cups_strcasecmp("number-up", options[j].name) && + _cups_strcasecmp("OutputOrder", options[j].name)) + continue; + + if (!_cups_strcasecmp("landscape", options[j].name)) + strlcpy(text, "orientation-requested=landscape", sizeof(text)); + else if (!_cups_strcasecmp("orientation-requested", options[j].name)) + { + switch (atoi(options[j].value)) + { + default : + case IPP_PORTRAIT : + strlcpy(text, "orientation-requested=portrait", + sizeof(text)); + break; + + case IPP_LANDSCAPE : + strlcpy(text, "orientation-requested=landscape", + sizeof(text)); + break; + + case IPP_REVERSE_PORTRAIT : + strlcpy(text, "orientation-requested=reverse-portrait", + sizeof(text)); + break; + + case IPP_REVERSE_LANDSCAPE : + strlcpy(text, "orientation-requested=reverse-landscape", + sizeof(text)); + break; + } + } + else + snprintf(text, sizeof(text), "%s=%s", options[j].name, + options[j].value); + + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + } + } + + if (banner->show & SHOW_PRINTER_INFO) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Description: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + getenv("PRINTER_INFO")); + } + if (banner->show & SHOW_PRINTER_LOCATION) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Location: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + getenv("PRINTER_LOCATION")); + } + if (banner->show & SHOW_PRINTER_MAKE_AND_MODEL) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Make and Model: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + ppd ? ppd->nickname : NULL); + } + + if (banner->show & SHOW_PAPER_NAME) + { + if ((option = cupsGetOption("media", num_options, options)) == NULL) + if ((option = cupsGetOption("PageSize", num_options, options)) == NULL) + if ((option = cupsGetOption("PageRegion", num_options, + options)) == NULL) + option = "Default"; + + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Media Name: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, option); + } + if (banner->show & SHOW_PAPER_SIZE) + { + snprintf(text, sizeof(text), + _cupsLangString(language, _("%.2f x %.2f inches")), + PageWidth / 72.0, PageLength / 72.0); + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Media Dimensions: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + + snprintf(text, sizeof(text), + _cupsLangString(language, _("%.0f x %.0f millimeters")), + PageWidth * 25.4 / 72.0, PageLength * 25.4 / 72.0); + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + } + if (banner->show & SHOW_IMAGEABLE_AREA) + { + snprintf(text, sizeof(text), + _cupsLangString(language, + _("%.2f x %.2f to %.2f x %.2f inches")), + PageLeft / 72.0, PageBottom / 72.0, + PageRight / 72.0, PageTop / 72.0); + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Media Limits: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + + snprintf(text, sizeof(text), + _cupsLangString(language, + _("%.0f x %.0f to %.0f x %.0f millimeters")), + PageLeft * 25.4 / 72.0, PageBottom * 25.4 / 72.0, + PageRight * 25.4 / 72.0, PageTop * 25.4 / 72.0); + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + + printf("gsave 2 setlinewidth 1 1 %.1f %.1f rectstroke grestore\n", + print_width - 2.0, print_height - 2.0); + } + if (banner->show & SHOW_PRINTER_DRIVER_NAME) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Driver Name: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + ppd ? ppd->pcfilename : NULL); + } + if (banner->show & SHOW_PRINTER_DRIVER_VERSION) + { + ppd_attr_t *file_version = ppdFindAttr(ppd, "FileVersion", NULL); + + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Driver Version: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, + file_version ? file_version->value : NULL); + } + if (banner->show & SHOW_TIME_AT_CREATION) + { + if ((option = cupsGetOption("time-at-creation", num_options, + options)) != NULL) + { + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + + curtime = (time_t)atoi(option); + curdate = localtime(&curtime); + + strftime(text, sizeof(text), "%c", curdate); + } + else + strlcpy(text, "?", sizeof(text)); + + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Created On: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + } + if (banner->show & SHOW_TIME_AT_PROCESSING) + { + if ((option = cupsGetOption("time-at-processing", num_options, + options)) != NULL) + { + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + + curtime = (time_t)atoi(option); + curdate = localtime(&curtime); + + strftime(text, sizeof(text), "%c", curdate); + } + else + strlcpy(text, "?", sizeof(text)); + + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_BOLD, PS_RIGHT, + _cupsLangString(language, _("Printed On: "))); + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_LEFT, text); + } + } + + /* + * Notices... + */ + + if (cupsArrayCount(banner->notices)) + { + if (banner->show) + y -= 2 * line_height; + + x = 0.5 * print_width; + + for (notice = (char *)cupsArrayFirst(banner->notices); + notice; + notice = (char *)cupsArrayNext(banner->notices)) + { + printf("%.1f %.1f moveto", x, y); + y -= line_height; + psTextUTF8(fonts, fontsize, PS_NORMAL, PS_CENTER, notice); + } + } + + /* + * Images... + */ + + if (cupsArrayCount(images)) + { + if (banner->show || cupsArrayCount(banner->notices)) + y -= 2 * line_height; + + x = 0.5 * (print_width - images_width); + + for (image = (cups_image_t *)cupsArrayFirst(images); + image; + image = (cups_image_t *)cupsArrayNext(images)) + { + float temp_width; /* Width of this image */ + int depth, /* Bytes per pixel */ + num_cols, /* Number of columns */ + row, /* Current row */ + num_rows, /* Number of rows */ + out_length, /* Length of data to write */ + out_offset; /* Offset in line buffer */ + unsigned char *line; /* Data for current row */ + + + depth = cupsImageGetDepth(image); + num_cols = cupsImageGetWidth(image); + num_rows = cupsImageGetHeight(image); + line = malloc(depth * num_cols + 3); + temp_width = num_cols * images_height / num_rows; + + printf("gsave %.1f %.1f translate %.3f %.3f scale\n", x, y, + temp_width / num_cols, images_height / num_rows); + x += temp_width; + + switch (cupsImageGetColorSpace(image)) + { + default : + case CUPS_IMAGE_WHITE : + printf("/DeviceGray setcolorspace" + "<<" + "/ImageType 1" + "/Width %d" + "/Height %d" + "/BitsPerComponent 8" + "/Decode[0 1]\n", + num_cols, num_rows); + break; + + case CUPS_IMAGE_RGB : + printf("/DeviceRGB setcolorspace" + "<<" + "/ImageType 1" + "/Width %d" + "/Height %d" + "/BitsPerComponent 8" + "/Decode[0 1 0 1 0 1]\n", + num_cols, num_rows); + break; + + case CUPS_IMAGE_CMYK : + printf("/DeviceCMYK setcolorspace" + "<<" + "/ImageType 1" + "/Width %d" + "/Height %d" + "/BitsPerComponent 8" + "/Decode[0 1 0 1 0 1 0 1]\n", + num_cols, num_rows); + break; + } + + puts("/DataSource currentfile" + "/ASCII85Decode filter" + "/ImageMatrix[1 0 0 -1 0 1]>>image"); + + for (row = 0, out_offset = 0; row < num_rows; row ++) + { + cupsImageGetRow(image, 0, row, num_cols, line + out_offset); + + out_length = num_cols * depth + out_offset; + out_offset = out_length & 3; + + ps_ascii85(line, out_length, row == (num_rows - 1)); + + if (out_offset > 0) + memcpy(line, line + out_length - out_offset, out_offset); + } + + puts("grestore"); + + if (i == num_pages) + cupsImageClose(image); + + free(line); + } + } + + /* + * Header and footer... + */ + + x = 0.5 * print_width; + + if (banner->header) + { + printf("%.1f %.1f moveto", x, print_height - 2 * fontsize); + psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->header); + } + + if (banner->footer) + { + printf("%.1f %.1f moveto", x, fontsize); + psTextUTF8(fonts, 2 * fontsize, PS_BOLD, PS_CENTER, banner->footer); + } + + /* + * Show the page... + */ + + puts("grestore"); + puts("showpage"); + } + + return (num_pages); +} + + +/* + * 'write_epilogue()' - Write the PostScript file epilogue. + */ + +static void +write_epilogue(int num_pages) /* I - Number of pages */ +{ + puts("%%Trailer"); + printf("%%%%Pages: %d\n", num_pages); + puts("%%EOF"); +} + + +/* + * 'write_prolog()' - Write the PostScript file prolog with options. + */ + +ps_text_t * /* O - Fonts */ +write_prolog(const char *title, /* I - Title of job */ + const char *username) /* I - Username */ +{ + time_t curtime; /* Current time */ + struct tm *curtm; /* Current date */ + char curdate[255]; /* Current date (text format) */ + ps_text_t *fonts; /* Fonts */ + + + /* + * Get the fonts we'll need... + */ + + fonts = psTextInitialize(); + + /* + * Output the DSC header... + */ + + curtime = time(NULL); + curtm = localtime(&curtime); + strftime(curdate, sizeof(curdate), "%c", curtm); + + puts("%!PS-Adobe-3.0"); + printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, + PageRight, PageTop); + printf("%%cupsRotation: %d\n", (Orientation & 3) * 90); + puts("%%Creator: bannertops/" CUPS_SVERSION); + printf("%%%%CreationDate: %s\n", curdate); + puts("%%LanguageLevel: 2"); + puts("%%DocumentData: Clean7Bit"); + WriteTextComment("Title", title); + WriteTextComment("For", username); + printf("%%%%Pages: %d\n", Duplex ? 2 : 1); + psTextListFonts(fonts); + puts("%%EndComments"); + puts("%%BeginProlog"); + psTextEmbedFonts(fonts); + puts("%%EndProlog"); + + return (fonts); +} + + +/* + * End of "$Id: bannertops.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/filter/commandtops.c b/filter/commandtops.c new file mode 100644 index 0000000..745359e --- /dev/null +++ b/filter/commandtops.c @@ -0,0 +1,538 @@ +/* + * "$Id: commandtops.c 10373 2012-03-21 23:00:05Z mike $" + * + * PostScript command filter for CUPS. + * + * Copyright 2008-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * + * Contents: + * + * main() - Process a CUPS command file. + * auto_configure() - Automatically configure the printer using + * PostScript query commands and/or SNMP lookups. + * begin_ps() - Send the standard PostScript prolog. + * end_ps() - Send the standard PostScript trailer. + * print_self_test_page() - Print a self-test page. + * report_levels() - Report supply levels. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include + + +/* + * Local functions... + */ + +static int auto_configure(ppd_file_t *ppd, const char *user); +static void begin_ps(ppd_file_t *ppd, const char *user); +static void end_ps(ppd_file_t *ppd); +static void print_self_test_page(ppd_file_t *ppd, const char *user); +static void report_levels(ppd_file_t *ppd, const char *user); + + +/* + * 'main()' - Process a CUPS command file. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int status = 0; /* Exit status */ + cups_file_t *fp; /* Command file */ + char line[1024], /* Line from file */ + *value; /* Value on line */ + int linenum; /* Line number in file */ + ppd_file_t *ppd; /* PPD file */ + + + /* + * Check for valid arguments... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * Open the PPD file... + */ + + if ((ppd = ppdOpenFile(getenv("PPD"))) == NULL) + { + fputs("ERROR: Unable to open PPD file!\n", stderr); + return (1); + } + + /* + * Open the command file as needed... + */ + + if (argc == 7) + { + if ((fp = cupsFileOpen(argv[6], "r")) == NULL) + { + perror("ERROR: Unable to open command file - "); + return (1); + } + } + else + fp = cupsFileStdin(); + + /* + * Read the commands from the file and send the appropriate commands... + */ + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Parse the command... + */ + + if (!_cups_strcasecmp(line, "AutoConfigure")) + status |= auto_configure(ppd, argv[2]); + else if (!_cups_strcasecmp(line, "PrintSelfTestPage")) + print_self_test_page(ppd, argv[2]); + else if (!_cups_strcasecmp(line, "ReportLevels")) + report_levels(ppd, argv[2]); + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Invalid printer command \"%s\"."), line); + status = 1; + } + } + + return (status); +} + + +/* + * 'auto_configure()' - Automatically configure the printer using PostScript + * query commands and/or SNMP lookups. + */ + +static int /* O - Exit status */ +auto_configure(ppd_file_t *ppd, /* I - PPD file */ + const char *user) /* I - Printing user */ +{ + int status = 0; /* Exit status */ + ppd_option_t *option; /* Current option in PPD */ + ppd_attr_t *attr; /* Query command attribute */ + const char *valptr; /* Pointer into attribute value */ + char buffer[1024], /* String buffer */ + *bufptr; /* Pointer into buffer */ + ssize_t bytes; /* Number of bytes read */ + int datalen; /* Side-channel data length */ + + + /* + * See if the backend supports bidirectional I/O... + */ + + datalen = 1; + if (cupsSideChannelDoRequest(CUPS_SC_CMD_GET_BIDI, buffer, &datalen, + 30.0) != CUPS_SC_STATUS_OK || + buffer[0] != CUPS_SC_BIDI_SUPPORTED) + { + fputs("DEBUG: Unable to auto-configure PostScript Printer - no " + "bidirectional I/O available!\n", stderr); + return (1); + } + + /* + * Put the printer in PostScript mode... + */ + + begin_ps(ppd, user); + + /* + * (STR #4028) + * + * As a lot of PPDs contain bad PostScript query code, we need to prevent one + * bad query sequence from affecting all auto-configuration. The following + * error handler allows us to log PostScript errors to cupsd. + */ + + puts("/cups_handleerror {\n" + " $error /newerror false put\n" + " (:PostScript error in \") print cups_query_keyword print (\": ) " + "print\n" + " $error /errorname get 128 string cvs print\n" + " (; offending command:) print $error /command get 128 string cvs " + "print (\n) print flush\n" + "} bind def\n" + "errordict /timeout {} put\n" + "/cups_query_keyword (?Unknown) def\n"); + fflush(stdout); + + /* + * Wait for the printer to become connected... + */ + + do + { + sleep(1); + datalen = 1; + } + while (cupsSideChannelDoRequest(CUPS_SC_CMD_GET_CONNECTED, buffer, &datalen, + 5.0) == CUPS_SC_STATUS_OK && !buffer[0]); + + /* + * Then loop through every option in the PPD file and ask for the current + * value... + */ + + fputs("DEBUG: Auto-configuring PostScript printer...\n", stderr); + + for (option = ppdFirstOption(ppd); option; option = ppdNextOption(ppd)) + { + /* + * See if we have a query command for this option... + */ + + snprintf(buffer, sizeof(buffer), "?%s", option->keyword); + + if ((attr = ppdFindAttr(ppd, buffer, NULL)) == NULL || !attr->value) + { + fprintf(stderr, "DEBUG: Skipping %s option...\n", option->keyword); + continue; + } + + /* + * Send the query code to the printer... + */ + + fprintf(stderr, "DEBUG: Querying %s...\n", option->keyword); + + for (bufptr = buffer, valptr = attr->value; *valptr; valptr ++) + { + /* + * Log the query code, breaking at newlines... + */ + + if (*valptr == '\n') + { + *bufptr = '\0'; + fprintf(stderr, "DEBUG: %s\\n\n", buffer); + bufptr = buffer; + } + else if (*valptr < ' ') + { + if (bufptr >= (buffer + sizeof(buffer) - 4)) + { + *bufptr = '\0'; + fprintf(stderr, "DEBUG: %s\n", buffer); + bufptr = buffer; + } + + if (*valptr == '\r') + { + *bufptr++ = '\\'; + *bufptr++ = 'r'; + } + else if (*valptr == '\t') + { + *bufptr++ = '\\'; + *bufptr++ = 't'; + } + else + { + *bufptr++ = '\\'; + *bufptr++ = '0' + ((*valptr / 64) & 7); + *bufptr++ = '0' + ((*valptr / 8) & 7); + *bufptr++ = '0' + (*valptr & 7); + } + } + else + { + if (bufptr >= (buffer + sizeof(buffer) - 1)) + { + *bufptr = '\0'; + fprintf(stderr, "DEBUG: %s\n", buffer); + bufptr = buffer; + } + + *bufptr++ = *valptr; + } + } + + if (bufptr > buffer) + { + *bufptr = '\0'; + fprintf(stderr, "DEBUG: %s\n", buffer); + } + + printf("/cups_query_keyword (?%s) def\n", option->keyword); + /* Set keyword for error reporting */ + fputs("{ (", stdout); + for (valptr = attr->value; *valptr; valptr ++) + { + if (*valptr == '(' || *valptr == ')' || *valptr == '\\') + putchar('\\'); + putchar(*valptr); + } + fputs(") cvx exec } stopped { cups_handleerror } if clear\n", stdout); + /* Send query code */ + fflush(stdout); + + datalen = 0; + cupsSideChannelDoRequest(CUPS_SC_CMD_DRAIN_OUTPUT, buffer, &datalen, 5.0); + + /* + * Read the response data... + */ + + bufptr = buffer; + buffer[0] = '\0'; + while ((bytes = cupsBackChannelRead(bufptr, + sizeof(buffer) - (bufptr - buffer) - 1, + 10.0)) > 0) + { + /* + * No newline at the end? Go on reading ... + */ + + bufptr += bytes; + *bufptr = '\0'; + + if (bytes == 0 || + (bufptr > buffer && bufptr[-1] != '\r' && bufptr[-1] != '\n')) + continue; + + /* + * Trim whitespace and control characters from both ends... + */ + + bytes = bufptr - buffer; + + for (bufptr --; bufptr >= buffer; bufptr --) + if (isspace(*bufptr & 255) || iscntrl(*bufptr & 255)) + *bufptr = '\0'; + else + break; + + for (bufptr = buffer; isspace(*bufptr & 255) || iscntrl(*bufptr & 255); + bufptr ++); + + if (bufptr > buffer) + { + _cups_strcpy(buffer, bufptr); + bufptr = buffer; + } + + fprintf(stderr, "DEBUG: Got %d bytes.\n", (int)bytes); + + /* + * Skip blank lines... + */ + + if (!buffer[0]) + continue; + + /* + * Check the response... + */ + + if ((bufptr = strchr(buffer, ':')) != NULL) + { + /* + * PostScript code for this option in the PPD is broken; show the + * interpreter's error message that came back... + */ + + fprintf(stderr, "DEBUG%s\n", bufptr); + break; + } + + /* + * Verify the result is a valid option choice... + */ + + if (!ppdFindChoice(option, buffer)) + { + if (!strcasecmp(buffer, "Unknown")) + break; + + bufptr = buffer; + buffer[0] = '\0'; + continue; + } + + /* + * Write out the result and move on to the next option... + */ + + fprintf(stderr, "PPD: Default%s=%s\n", option->keyword, buffer); + break; + } + + /* + * Printer did not answer this option's query + */ + + if (bytes <= 0) + { + fprintf(stderr, + "DEBUG: No answer to query for option %s within 10 seconds.\n", + option->keyword); + status = 1; + } + } + + /* + * Finish the job... + */ + + fflush(stdout); + end_ps(ppd); + + /* + * Return... + */ + + if (status) + _cupsLangPrintFilter(stderr, "WARNING", + _("Unable to configure printer options.")); + + return (0); +} + + +/* + * 'begin_ps()' - Send the standard PostScript prolog. + */ + +static void +begin_ps(ppd_file_t *ppd, /* I - PPD file */ + const char *user) /* I - Username */ +{ + (void)user; + + if (ppd->jcl_begin) + { + fputs(ppd->jcl_begin, stdout); + fputs(ppd->jcl_ps, stdout); + } + + puts("%!"); + puts("userdict dup(\\004)cvn{}put (\\004\\004)cvn{}put\n"); + + fflush(stdout); +} + + +/* + * 'end_ps()' - Send the standard PostScript trailer. + */ + +static void +end_ps(ppd_file_t *ppd) /* I - PPD file */ +{ + if (ppd->jcl_end) + fputs(ppd->jcl_end, stdout); + else + putchar(0x04); + + fflush(stdout); +} + + +/* + * 'print_self_test_page()' - Print a self-test page. + */ + +static void +print_self_test_page(ppd_file_t *ppd, /* I - PPD file */ + const char *user) /* I - Printing user */ +{ + /* + * Put the printer in PostScript mode... + */ + + begin_ps(ppd, user); + + /* + * Send a simple file the draws a box around the imageable area and shows + * the product/interpreter information... + */ + + puts("\r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" + "%%%%%%%%%%%%%\n" + "\r%%%% If you can read this, you are using the wrong driver for your " + "printer. %%%%\n" + "\r%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" + "%%%%%%%%%%%%%\n" + "0 setgray\n" + "2 setlinewidth\n" + "initclip newpath clippath gsave stroke grestore pathbbox\n" + "exch pop exch pop exch 9 add exch 9 sub moveto\n" + "/Courier findfont 12 scalefont setfont\n" + "0 -12 rmoveto gsave product show grestore\n" + "0 -12 rmoveto gsave version show ( ) show revision 20 string cvs show " + "grestore\n" + "0 -12 rmoveto gsave serialnumber 20 string cvs show grestore\n" + "showpage"); + + /* + * Finish the job... + */ + + end_ps(ppd); +} + + +/* + * 'report_levels()' - Report supply levels. + */ + +static void +report_levels(ppd_file_t *ppd, /* I - PPD file */ + const char *user) /* I - Printing user */ +{ + /* + * Put the printer in PostScript mode... + */ + + begin_ps(ppd, user); + + /* + * Don't bother sending any additional PostScript commands, since we just + * want the backend to have enough time to collect the supply info. + */ + + /* + * Finish the job... + */ + + end_ps(ppd); +} + + +/* + * End of "$Id: commandtops.c 10373 2012-03-21 23:00:05Z mike $". + */ diff --git a/filter/common.c b/filter/common.c new file mode 100644 index 0000000..67e440e --- /dev/null +++ b/filter/common.c @@ -0,0 +1,535 @@ +/* + * "$Id: common.c 9793 2011-05-20 03:49:49Z mike $" + * + * Common filter routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * SetCommonOptions() - Set common filter options for media size, + * etc. + * UpdatePageVars() - Update the page variables for the orientation. + * WriteComment() - Write a DSC comment. + * WriteCommon() - Write common procedures... + * WriteLabelProlog() - Write the prolog with the classification + * and page label. + * WriteLabels() - Write the actual page labels. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" +#include + + +/* + * Globals... + */ + +int Orientation = 0, /* 0 = portrait, 1 = landscape, etc. */ + Duplex = 0, /* Duplexed? */ + LanguageLevel = 1, /* Language level of printer */ + ColorDevice = 1; /* Do color text? */ +float PageLeft = 18.0f, /* Left margin */ + PageRight = 594.0f, /* Right margin */ + PageBottom = 36.0f, /* Bottom margin */ + PageTop = 756.0f, /* Top margin */ + PageWidth = 612.0f, /* Total page width */ + PageLength = 792.0f; /* Total page length */ + + +/* + * 'SetCommonOptions()' - Set common filter options for media size, etc. + */ + +ppd_file_t * /* O - PPD file */ +SetCommonOptions( + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + int change_size) /* I - Change page size? */ +{ + ppd_file_t *ppd; /* PPD file */ + ppd_size_t *pagesize; /* Current page size */ + const char *val; /* Option value */ + + +#ifdef LC_TIME + setlocale(LC_TIME, ""); +#endif /* LC_TIME */ + + ppd = ppdOpenFile(getenv("PPD")); + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + if ((pagesize = ppdPageSize(ppd, NULL)) != NULL) + { + PageWidth = pagesize->width; + PageLength = pagesize->length; + PageTop = pagesize->top; + PageBottom = pagesize->bottom; + PageLeft = pagesize->left; + PageRight = pagesize->right; + + fprintf(stderr, "DEBUG: Page = %.0fx%.0f; %.0f,%.0f to %.0f,%.0f\n", + PageWidth, PageLength, PageLeft, PageBottom, PageRight, PageTop); + } + + if (ppd != NULL) + { + ColorDevice = ppd->color_device; + LanguageLevel = ppd->language_level; + } + + if ((val = cupsGetOption("landscape", num_options, options)) != NULL) + { + if (_cups_strcasecmp(val, "no") != 0 && _cups_strcasecmp(val, "off") != 0 && + _cups_strcasecmp(val, "false") != 0) + { + if (ppd && ppd->landscape > 0) + Orientation = 1; + else + Orientation = 3; + } + } + else if ((val = cupsGetOption("orientation-requested", num_options, options)) != NULL) + { + /* + * Map IPP orientation values to 0 to 3: + * + * 3 = 0 degrees = 0 + * 4 = 90 degrees = 1 + * 5 = -90 degrees = 3 + * 6 = 180 degrees = 2 + */ + + Orientation = atoi(val) - 3; + if (Orientation >= 2) + Orientation ^= 1; + } + + if ((val = cupsGetOption("page-left", num_options, options)) != NULL) + { + switch (Orientation & 3) + { + case 0 : + PageLeft = (float)atof(val); + break; + case 1 : + PageBottom = (float)atof(val); + break; + case 2 : + PageRight = PageWidth - (float)atof(val); + break; + case 3 : + PageTop = PageLength - (float)atof(val); + break; + } + } + + if ((val = cupsGetOption("page-right", num_options, options)) != NULL) + { + switch (Orientation & 3) + { + case 0 : + PageRight = PageWidth - (float)atof(val); + break; + case 1 : + PageTop = PageLength - (float)atof(val); + break; + case 2 : + PageLeft = (float)atof(val); + break; + case 3 : + PageBottom = (float)atof(val); + break; + } + } + + if ((val = cupsGetOption("page-bottom", num_options, options)) != NULL) + { + switch (Orientation & 3) + { + case 0 : + PageBottom = (float)atof(val); + break; + case 1 : + PageLeft = (float)atof(val); + break; + case 2 : + PageTop = PageLength - (float)atof(val); + break; + case 3 : + PageRight = PageWidth - (float)atof(val); + break; + } + } + + if ((val = cupsGetOption("page-top", num_options, options)) != NULL) + { + switch (Orientation & 3) + { + case 0 : + PageTop = PageLength - (float)atof(val); + break; + case 1 : + PageRight = PageWidth - (float)atof(val); + break; + case 2 : + PageBottom = (float)atof(val); + break; + case 3 : + PageLeft = (float)atof(val); + break; + } + } + + if (change_size) + UpdatePageVars(); + + if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "Duplex", "DuplexTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "JCLDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "EFDuplex", "DuplexTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexNoTumble") || + ppdIsMarked(ppd, "KD03Duplex", "DuplexTumble")) + Duplex = 1; + + return (ppd); +} + + +/* + * 'UpdatePageVars()' - Update the page variables for the orientation. + */ + +void +UpdatePageVars(void) +{ + float temp; /* Swapping variable */ + + + switch (Orientation & 3) + { + case 0 : /* Portait */ + break; + + case 1 : /* Landscape */ + temp = PageLeft; + PageLeft = PageBottom; + PageBottom = temp; + + temp = PageRight; + PageRight = PageTop; + PageTop = temp; + + temp = PageWidth; + PageWidth = PageLength; + PageLength = temp; + break; + + case 2 : /* Reverse Portrait */ + temp = PageWidth - PageLeft; + PageLeft = PageWidth - PageRight; + PageRight = temp; + + temp = PageLength - PageBottom; + PageBottom = PageLength - PageTop; + PageTop = temp; + break; + + case 3 : /* Reverse Landscape */ + temp = PageWidth - PageLeft; + PageLeft = PageWidth - PageRight; + PageRight = temp; + + temp = PageLength - PageBottom; + PageBottom = PageLength - PageTop; + PageTop = temp; + + temp = PageLeft; + PageLeft = PageBottom; + PageBottom = temp; + + temp = PageRight; + PageRight = PageTop; + PageTop = temp; + + temp = PageWidth; + PageWidth = PageLength; + PageLength = temp; + break; + } +} + + +/* + * 'WriteCommon()' - Write common procedures... + */ + +void +WriteCommon(void) +{ + puts("% x y w h ESPrc - Clip to a rectangle.\n" + "userdict/ESPrc/rectclip where{pop/rectclip load}\n" + "{{newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath clip newpath}bind}ifelse put"); + puts("% x y w h ESPrf - Fill a rectangle.\n" + "userdict/ESPrf/rectfill where{pop/rectfill load}\n" + "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath fill grestore}bind}ifelse put"); + puts("% x y w h ESPrs - Stroke a rectangle.\n" + "userdict/ESPrs/rectstroke where{pop/rectstroke load}\n" + "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath stroke grestore}bind}ifelse put"); +} + + +/* + * 'WriteLabelProlog()' - Write the prolog with the classification + * and page label. + */ + +void +WriteLabelProlog(const char *label, /* I - Page label */ + float bottom, /* I - Bottom position in points */ + float top, /* I - Top position in points */ + float width) /* I - Width in points */ +{ + const char *classification; /* CLASSIFICATION environment variable */ + const char *ptr; /* Temporary string pointer */ + + + /* + * First get the current classification... + */ + + if ((classification = getenv("CLASSIFICATION")) == NULL) + classification = ""; + if (strcmp(classification, "none") == 0) + classification = ""; + + /* + * If there is nothing to show, bind an empty 'write labels' procedure + * and return... + */ + + if (!classification[0] && (label == NULL || !label[0])) + { + puts("userdict/ESPwl{}bind put"); + return; + } + + /* + * Set the classification + page label string... + */ + + printf("userdict"); + if (strcmp(classification, "confidential") == 0) + printf("/ESPpl(CONFIDENTIAL"); + else if (strcmp(classification, "classified") == 0) + printf("/ESPpl(CLASSIFIED"); + else if (strcmp(classification, "secret") == 0) + printf("/ESPpl(SECRET"); + else if (strcmp(classification, "topsecret") == 0) + printf("/ESPpl(TOP SECRET"); + else if (strcmp(classification, "unclassified") == 0) + printf("/ESPpl(UNCLASSIFIED"); + else + { + printf("/ESPpl("); + + for (ptr = classification; *ptr; ptr ++) + if (*ptr < 32 || *ptr > 126) + printf("\\%03o", *ptr); + else if (*ptr == '_') + putchar(' '); + else + { + if (*ptr == '(' || *ptr == ')' || *ptr == '\\') + putchar('\\'); + + putchar(*ptr); + } + } + + if (label) + { + if (classification[0]) + printf(" - "); + + /* + * Quote the label string as needed... + */ + + for (ptr = label; *ptr; ptr ++) + if (*ptr < 32 || *ptr > 126) + printf("\\%03o", *ptr); + else + { + if (*ptr == '(' || *ptr == ')' || *ptr == '\\') + putchar('\\'); + + putchar(*ptr); + } + } + + puts(")put"); + + /* + * Then get a 14 point Helvetica-Bold font... + */ + + puts("userdict/ESPpf /Helvetica-Bold findfont 14 scalefont put"); + + /* + * Finally, the procedure to write the labels on the page... + */ + + puts("userdict/ESPwl{"); + puts(" ESPpf setfont"); + printf(" ESPpl stringwidth pop dup 12 add exch -0.5 mul %.0f add\n", + width * 0.5f); + puts(" 1 setgray"); + printf(" dup 6 sub %.0f 3 index 20 ESPrf\n", bottom - 2.0); + printf(" dup 6 sub %.0f 3 index 20 ESPrf\n", top - 18.0); + puts(" 0 setgray"); + printf(" dup 6 sub %.0f 3 index 20 ESPrs\n", bottom - 2.0); + printf(" dup 6 sub %.0f 3 index 20 ESPrs\n", top - 18.0); + printf(" dup %.0f moveto ESPpl show\n", bottom + 2.0); + printf(" %.0f moveto ESPpl show\n", top - 14.0); + puts("pop"); + puts("}bind put"); +} + + +/* + * 'WriteLabels()' - Write the actual page labels. + */ + +void +WriteLabels(int orient) /* I - Orientation of the page */ +{ + float width, /* Width of page */ + length; /* Length of page */ + + + puts("gsave"); + + if ((orient ^ Orientation) & 1) + { + width = PageLength; + length = PageWidth; + } + else + { + width = PageWidth; + length = PageLength; + } + + switch (orient & 3) + { + case 1 : /* Landscape */ + printf("%.1f 0.0 translate 90 rotate\n", length); + break; + case 2 : /* Reverse Portrait */ + printf("%.1f %.1f translate 180 rotate\n", width, length); + break; + case 3 : /* Reverse Landscape */ + printf("0.0 %.1f translate -90 rotate\n", width); + break; + } + + puts("ESPwl"); + puts("grestore"); +} + + +/* + * 'WriteTextComment()' - Write a DSC text comment. + */ + +void +WriteTextComment(const char *name, /* I - Comment name ("Title", etc.) */ + const char *value) /* I - Comment value */ +{ + int len; /* Current line length */ + + + /* + * DSC comments are of the form: + * + * %%name: value + * + * The name and value must be limited to 7-bit ASCII for most printers, + * so we escape all non-ASCII and ASCII control characters as described + * in the Adobe Document Structuring Conventions specification. + */ + + printf("%%%%%s: (", name); + len = 5 + strlen(name); + + while (*value) + { + if (*value < ' ' || *value >= 127) + { + /* + * Escape this character value... + */ + + if (len >= 251) /* Keep line < 254 chars */ + break; + + printf("\\%03o", *value & 255); + len += 4; + } + else if (*value == '\\') + { + /* + * Escape the backslash... + */ + + if (len >= 253) /* Keep line < 254 chars */ + break; + + putchar('\\'); + putchar('\\'); + len += 2; + } + else + { + /* + * Put this character literally... + */ + + if (len >= 254) /* Keep line < 254 chars */ + break; + + putchar(*value); + len ++; + } + + value ++; + } + + puts(")"); +} + + +/* + * End of "$Id: common.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/filter/common.h b/filter/common.h new file mode 100644 index 0000000..ffb782c --- /dev/null +++ b/filter/common.h @@ -0,0 +1,78 @@ +/* + * "$Id: common.h 9063 2010-04-01 17:01:09Z mike $" + * + * Common filter definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include + + +/* + * C++ magic... + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* + * Globals... + */ + +extern int Orientation, /* 0 = portrait, 1 = landscape, etc. */ + Duplex, /* Duplexed? */ + LanguageLevel, /* Language level of printer */ + ColorDevice; /* Do color text? */ +extern float PageLeft, /* Left margin */ + PageRight, /* Right margin */ + PageBottom, /* Bottom margin */ + PageTop, /* Top margin */ + PageWidth, /* Total page width */ + PageLength; /* Total page length */ + + +/* + * Prototypes... + */ + +extern ppd_file_t *SetCommonOptions(int num_options, cups_option_t *options, + int change_size); +extern void UpdatePageVars(void); +extern void WriteCommon(void); +extern void WriteLabelProlog(const char *label, float bottom, + float top, float width); +extern void WriteLabels(int orient); +extern void WriteTextComment(const char *name, const char *value); + + +/* + * C++ magic... + */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/* + * End of "$Id: common.h 9063 2010-04-01 17:01:09Z mike $". + */ diff --git a/filter/error.c b/filter/error.c new file mode 100644 index 0000000..e74e012 --- /dev/null +++ b/filter/error.c @@ -0,0 +1,287 @@ +/* + * "$Id: error.c 9771 2011-05-12 05:21:56Z mike $" + * + * Raster error handling for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsRasterAddError() - Add an error message to the error buffer. + * _cupsRasterClearError() - Clear the error buffer. + * cupsRasterErrorString() - Return the last error from a raster function. + * get_error_buffer() - Return a pointer to thread local storage. + * raster_init() - Initialize error buffer once. + * raster_destructor() - Free memory allocated by get_error_buffer(). + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" +#include + + +/* + * Local structures... + */ + +typedef struct _cups_raster_error_s /**** Error buffer structure ****/ +{ + char *start, /* Start of buffer */ + *current, /* Current position in buffer */ + *end; /* End of buffer */ +} _cups_raster_error_t; + + +/* + * Local functions... + */ + +static _cups_raster_error_t *get_error_buffer(void); + + +/* + * '_cupsRasterAddError()' - Add an error message to the error buffer. + */ + +void +_cupsRasterAddError(const char *f, /* I - Printf-style error message */ + ...) /* I - Additional arguments as needed */ +{ + _cups_raster_error_t *buf = get_error_buffer(); + /* Error buffer */ + va_list ap; /* Pointer to additional arguments */ + char s[2048]; /* Message string */ + size_t bytes; /* Bytes in message string */ + + + va_start(ap, f); + bytes = vsnprintf(s, sizeof(s), f, ap); + va_end(ap); + + if (bytes <= 0) + return; + + bytes ++; + + if (bytes >= sizeof(s)) + return; + + if (bytes > (size_t)(buf->end - buf->current)) + { + /* + * Allocate more memory... + */ + + char *temp; /* New buffer */ + size_t size; /* Size of buffer */ + + + size = buf->end - buf->start + 2 * bytes + 1024; + + if (buf->start) + temp = realloc(buf->start, size); + else + temp = malloc(size); + + if (!temp) + return; + + /* + * Update pointers... + */ + + buf->end = temp + size; + buf->current = temp + (buf->current - buf->start); + buf->start = temp; + } + + /* + * Append the message to the end of the current string... + */ + + memcpy(buf->current, s, bytes); + buf->current += bytes - 1; +} + + +/* + * '_cupsRasterClearError()' - Clear the error buffer. + */ + +void +_cupsRasterClearError(void) +{ + _cups_raster_error_t *buf = get_error_buffer(); + /* Error buffer */ + + + buf->current = buf->start; + + if (buf->start) + *(buf->start) = '\0'; +} + + +/* + * 'cupsRasterErrorString()' - Return the last error from a raster function. + * + * If there are no recent errors, NULL is returned. + * + * @since CUPS 1.3/Mac OS X 10.5@ + */ + +const char * /* O - Last error */ +cupsRasterErrorString(void) +{ + _cups_raster_error_t *buf = get_error_buffer(); + /* Error buffer */ + + + if (buf->current == buf->start) + return (NULL); + else + return (buf->start); +} + + +#ifdef HAVE_PTHREAD_H +/* + * Implement per-thread globals... + */ + +# include + + +/* + * Local globals... + */ + +static pthread_key_t raster_key = -1; + /* Thread local storage key */ +static pthread_once_t raster_key_once = PTHREAD_ONCE_INIT; + /* One-time initialization object */ + + +/* + * Local functions... + */ + +static void raster_init(void); +static void raster_destructor(void *value); + + +/* + * 'get_error_buffer()' - Return a pointer to thread local storage. + */ + +_cups_raster_error_t * /* O - Pointer to error buffer */ +get_error_buffer(void) +{ + _cups_raster_error_t *buf; /* Pointer to error buffer */ + + + /* + * Initialize the global data exactly once... + */ + + DEBUG_puts("get_error_buffer()"); + + pthread_once(&raster_key_once, raster_init); + + /* + * See if we have allocated the data yet... + */ + + if ((buf = (_cups_raster_error_t *)pthread_getspecific(raster_key)) + == NULL) + { + DEBUG_puts("get_error_buffer: allocating memory for thread..."); + + /* + * No, allocate memory as set the pointer for the key... + */ + + buf = calloc(1, sizeof(_cups_raster_error_t)); + pthread_setspecific(raster_key, buf); + + DEBUG_printf((" buf=%p\n", buf)); + } + + /* + * Return the pointer to the data... + */ + + return (buf); +} + + +/* + * 'raster_init()' - Initialize error buffer once. + */ + +static void +raster_init(void) +{ + pthread_key_create(&raster_key, raster_destructor); + + DEBUG_printf(("raster_init(): raster_key=%x(%u)\n", (unsigned)raster_key, + (unsigned)raster_key)); +} + + +/* + * 'raster_destructor()' - Free memory allocated by get_error_buffer(). + */ + +static void +raster_destructor(void *value) /* I - Data to free */ +{ + _cups_raster_error_t *buf = (_cups_raster_error_t *)value; + /* Error buffer */ + + + DEBUG_printf(("raster_destructor(value=%p)\n", value)); + + if (buf->start) + free(buf->start); + + free(value); +} + + +#else +/* + * Implement static globals... + */ + +/* + * 'get_error_buffer()' - Return a pointer to thread local storage. + */ + +_cups_raster_error_t * /* O - Pointer to error buffer */ +get_error_buffer(void) +{ + static _cups_raster_error_t buf = { 0, 0, 0 }; + /* Error buffer */ + + + return (&buf); +} +#endif /* HAVE_PTHREAD_H */ + + +/* + * End of "$Id: error.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/gziptoany.c b/filter/gziptoany.c new file mode 100644 index 0000000..3689b7c --- /dev/null +++ b/filter/gziptoany.c @@ -0,0 +1,112 @@ +/* + * "$Id: gziptoany.c 9557 2011-02-21 16:51:43Z mike $" + * + * GZIP/raw pre-filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Copy (and uncompress) files to stdout. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * 'main()' - Copy (and uncompress) files to stdout. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + cups_file_t *fp; /* File */ + char buffer[8192]; /* Data buffer */ + int bytes; /* Number of bytes read/written */ + int copies; /* Number of copies */ + + + /* + * Check command-line... + */ + + if (argc != 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * Get the copy count; if we have no final content type, this is a + * raw queue or raw print file, so we need to make copies... + */ + + if (!getenv("FINAL_CONTENT_TYPE")) + copies = atoi(argv[4]); + else + copies = 1; + + /* + * Open the file... + */ + + if ((fp = cupsFileOpen(argv[6], "r")) == NULL) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (1); + } + + /* + * Copy the file to stdout... + */ + + while (copies > 0) + { + if (!getenv("FINAL_CONTENT_TYPE")) + fputs("PAGE: 1 1\n", stderr); + + cupsFileRewind(fp); + + while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) + if (write(1, buffer, bytes) < bytes) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to write uncompressed print data: %s"), + strerror(errno)); + cupsFileClose(fp); + + return (1); + } + + copies --; + } + + /* + * Close the file and return... + */ + + cupsFileClose(fp); + + return (0); +} + + +/* + * End of "$Id: gziptoany.c 9557 2011-02-21 16:51:43Z mike $". + */ diff --git a/filter/image-bmp.c b/filter/image-bmp.c new file mode 100644 index 0000000..dde040b --- /dev/null +++ b/filter/image-bmp.c @@ -0,0 +1,545 @@ +/* + * "$Id: image-bmp.c 9771 2011-05-12 05:21:56Z mike $" + * + * BMP image routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadBMP() - Read a BMP image file. + * read_word() - Read a 16-bit unsigned integer. + * read_dword() - Read a 32-bit unsigned integer. + * read_long() - Read a 32-bit signed integer. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Constants for the bitmap compression... + */ + +# define BI_RGB 0 /* No compression - straight BGR data */ +# define BI_RLE8 1 /* 8-bit run-length compression */ +# define BI_RLE4 2 /* 4-bit run-length compression */ +# define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */ + + +/* + * Local functions... + */ + +static unsigned short read_word(FILE *fp); +static unsigned int read_dword(FILE *fp); +static int read_long(FILE *fp); + + +/* + * '_cupsImageReadBMP()' - Read a BMP image file. + */ + +int /* O - Read status */ +_cupsImageReadBMP( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int offset, /* Offset to bitmap data */ + info_size, /* Size of info header */ + planes, /* Number of planes (always 1) */ + depth, /* Depth of image (bits) */ + compression, /* Type of compression */ + image_size, /* Size of image in bytes */ + colors_used, /* Number of colors used */ + colors_important, /* Number of important colors */ + bpp, /* Bytes per pixel */ + x, y, /* Looping vars */ + color, /* Color of RLE pixel */ + count, /* Number of times to repeat */ + temp, /* Temporary color */ + align; /* Alignment bytes */ + cups_ib_t bit, /* Bit in image */ + byte; /* Byte in image */ + cups_ib_t *in, /* Input pixels */ + *out, /* Output pixels */ + *ptr; /* Pointer into pixels */ + cups_ib_t colormap[256][4]; /* Colormap */ + + + (void)secondary; + + /* + * Get the header... + */ + + getc(fp); /* Skip "BM" sync chars */ + getc(fp); + read_dword(fp); /* Skip size */ + read_word(fp); /* Skip reserved stuff */ + read_word(fp); + offset = read_dword(fp); + + fprintf(stderr, "DEBUG: offset = %d\n", offset); + + if (offset < 0) + { + fprintf(stderr, "DEBUG: Bad BMP offset %d\n", offset); + fclose(fp); + return (1); + } + + /* + * Then the bitmap information... + */ + + info_size = read_dword(fp); + img->xsize = read_long(fp); + img->ysize = read_long(fp); + planes = read_word(fp); + depth = read_word(fp); + compression = read_dword(fp); + image_size = read_dword(fp); + img->xppi = read_long(fp) * 0.0254 + 0.5; + img->yppi = read_long(fp) * 0.0254 + 0.5; + colors_used = read_dword(fp); + colors_important = read_dword(fp); + + if (img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || + img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT || + (depth != 1 && depth != 4 && depth != 8 && depth != 24)) + { + fprintf(stderr, "DEBUG: Bad BMP dimensions %ux%ux%d\n", + img->xsize, img->ysize, depth); + fclose(fp); + return (1); + } + + if (colors_used < 0 || colors_used > 256) + { + fprintf(stderr, "DEBUG: Bad BMP colormap size %d\n", colors_used); + fclose(fp); + return (1); + } + + if (img->xppi == 0 || img->yppi == 0) + { + fprintf(stderr, "DEBUG: Bad BMP resolution %dx%d PPI.\n", + img->xppi, img->yppi); + img->xppi = img->yppi = 128; + } + + /* + * Make sure the resolution info is valid... + */ + + fprintf(stderr, "info_size = %d, xsize = %d, ysize = %d, planes = %d, depth = %d\n", + info_size, img->xsize, img->ysize, planes, depth); + fprintf(stderr, "compression = %d, image_size = %d, xppi = %d, yppi = %d\n", + compression, image_size, img->xppi, img->yppi); + fprintf(stderr, "colors_used = %d, colors_important = %d\n", colors_used, + colors_important); + + if (info_size > 40) + for (info_size -= 40; info_size > 0; info_size --) + getc(fp); + + /* + * Get colormap... + */ + + if (colors_used == 0 && depth <= 8) + colors_used = 1 << depth; + + if (colors_used > 0) + fread(colormap, colors_used, 4, fp); + else + memset(colormap, 0, sizeof(colormap)); + + /* + * Setup image and buffers... + */ + + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + + cupsImageSetMaxTiles(img, 0); + + bpp = cupsImageGetDepth(img); + + if ((in = malloc(img->xsize * 3)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + return (1); + } + + if ((out = malloc(img->xsize * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + free(in); + fclose(fp); + return (1); + } + + /* + * Read the image data... + */ + + color = 0; + count = 0; + align = 0; + + for (y = img->ysize - 1; y >= 0; y --) + { + ptr = in; + + switch (depth) + { + case 1 : /* Bitmap */ + for (x = img->xsize, bit = 128, byte = 0; x > 0; x --) + { + if (bit == 128) + byte = getc(fp); + + if (byte & bit) + { + *ptr++ = colormap[1][2]; + *ptr++ = colormap[1][1]; + *ptr++ = colormap[1][0]; + } + else + { + *ptr++ = colormap[0][2]; + *ptr++ = colormap[0][1]; + *ptr++ = colormap[0][0]; + } + + if (bit > 1) + bit >>= 1; + else + bit = 128; + } + + /* + * Read remaining bytes to align to 32 bits... + */ + + for (temp = (img->xsize + 7) / 8; temp & 3; temp ++) + getc(fp); + break; + + case 4 : /* 16-color */ + for (x = img->xsize, bit = 0xf0, temp = 0; x > 0; x --) + { + /* + * Get a new count as needed... + */ + + if (compression != BI_RLE4 && count == 0) + { + count = 2; + color = -1; + } + + if (count == 0) + { + while (align > 0) + { + align --; + getc(fp); + } + + if ((count = getc(fp)) == 0) + { + if ((count = getc(fp)) == 0) + { + /* + * End of line... + */ + + x ++; + continue; + } + else if (count == 1) + { + /* + * End of image... + */ + + break; + } + else if (count == 2) + { + /* + * Delta... + */ + + count = getc(fp) * getc(fp) * img->xsize; + color = 0; + } + else + { + /* + * Absolute... + */ + + color = -1; + align = ((4 - (count & 3)) / 2) & 1; + } + } + else + color = getc(fp); + } + + /* + * Get a new color as needed... + */ + + count --; + + if (bit == 0xf0) + { + if (color < 0) + temp = getc(fp); + else + temp = color; + + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp >> 4][2]; + *ptr++ = colormap[temp >> 4][1]; + *ptr++ = colormap[temp >> 4][0]; + bit = 0x0f; + } + else + { + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp & 15][2]; + *ptr++ = colormap[temp & 15][1]; + *ptr++ = colormap[temp & 15][0]; + bit = 0xf0; + } + } + break; + + case 8 : /* 256-color */ + for (x = img->xsize; x > 0; x --) + { + /* + * Get a new count as needed... + */ + + if (compression != BI_RLE8) + { + count = 1; + color = -1; + } + + if (count == 0) + { + while (align > 0) + { + align --; + getc(fp); + } + + if ((count = getc(fp)) == 0) + { + if ((count = getc(fp)) == 0) + { + /* + * End of line... + */ + + x ++; + continue; + } + else if (count == 1) + { + /* + * End of image... + */ + + break; + } + else if (count == 2) + { + /* + * Delta... + */ + + count = getc(fp) * getc(fp) * img->xsize; + color = 0; + } + else + { + /* + * Absolute... + */ + + color = -1; + align = (2 - (count & 1)) & 1; + } + } + else + color = getc(fp); + } + + /* + * Get a new color as needed... + */ + + if (color < 0) + temp = getc(fp); + else + temp = color; + + count --; + + /* + * Copy the color value... + */ + + *ptr++ = colormap[temp][2]; + *ptr++ = colormap[temp][1]; + *ptr++ = colormap[temp][0]; + } + break; + + case 24 : /* 24-bit RGB */ + for (x = img->xsize; x > 0; x --, ptr += 3) + { + ptr[2] = getc(fp); + ptr[1] = getc(fp); + ptr[0] = getc(fp); + } + + /* + * Read remaining bytes to align to 32 bits... + */ + + for (temp = img->xsize * 3; temp & 3; temp ++) + getc(fp); + break; + } + + if (saturation != 100 || hue != 0) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + + fclose(fp); + free(in); + free(out); + + return (0); +} + + +/* + * 'read_word()' - Read a 16-bit unsigned integer. + */ + +static unsigned short /* O - 16-bit unsigned integer */ +read_word(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + + return ((b1 << 8) | b0); +} + + +/* + * 'read_dword()' - Read a 32-bit unsigned integer. + */ + +static unsigned int /* O - 32-bit unsigned integer */ +read_dword(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1, b2, b3; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + b2 = getc(fp); + b3 = getc(fp); + + return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +/* + * 'read_long()' - Read a 32-bit signed integer. + */ + +static int /* O - 32-bit signed integer */ +read_long(FILE *fp) /* I - File to read from */ +{ + unsigned char b0, b1, b2, b3; /* Bytes from file */ + + b0 = getc(fp); + b1 = getc(fp); + b2 = getc(fp); + b3 = getc(fp); + + return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +/* + * End of "$Id: image-bmp.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-colorspace.c b/filter/image-colorspace.c new file mode 100644 index 0000000..605e927 --- /dev/null +++ b/filter/image-colorspace.c @@ -0,0 +1,1567 @@ +/* + * "$Id: image-colorspace.c 9748 2011-05-06 21:02:44Z mike $" + * + * Colorspace conversions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * The color saturation/hue matrix stuff is provided thanks to Mr. Paul + * Haeberli at "http://www.sgi.com/grafica/matrix/index.html". + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsImageCMYKToBlack() - Convert CMYK data to black. + * cupsImageCMYKToCMY() - Convert CMYK colors to CMY. + * cupsImageCMYKToCMYK() - Convert CMYK colors to CMYK. + * cupsImageCMYKToRGB() - Convert CMYK colors to device-dependent + * RGB. + * cupsImageCMYKToWhite() - Convert CMYK colors to luminance. + * cupsImageLut() - Adjust all pixel values with the given + * LUT. + * cupsImageRGBAdjust() - Adjust the hue and saturation of the + * given RGB colors. + * cupsImageRGBToBlack() - Convert RGB data to black. + * cupsImageRGBToCMY() - Convert RGB colors to CMY. + * cupsImageRGBToCMYK() - Convert RGB colors to CMYK. + * cupsImageRGBToRGB() - Convert RGB colors to device-dependent + * RGB. + * cupsImageRGBToWhite() - Convert RGB colors to luminance. + * cupsImageSetProfile() - Set the device color profile. + * cupsImageSetRasterColorSpace() - Set the destination colorspace. + * cupsImageWhiteToBlack() - Convert luminance colors to black. + * cupsImageWhiteToCMY() - Convert luminance colors to CMY. + * cupsImageWhiteToCMYK() - Convert luminance colors to CMYK. + * cupsImageWhiteToRGB() - Convert luminance data to RGB. + * cupsImageWhiteToWhite() - Convert luminance colors to device- + * dependent luminance. + * cielab() - Map CIE Lab transformation... + * huerotate() - Rotate the hue, maintaining luminance. + * ident() - Make an identity matrix. + * mult() - Multiply two matrices. + * rgb_to_lab() - Convert an RGB color to CIE Lab. + * rgb_to_xyz() - Convert an RGB color to CIE XYZ. + * saturate() - Make a saturation matrix. + * xform() - Transform a 3D point using a matrix... + * xrotate() - Rotate about the x (red) axis... + * yrotate() - Rotate about the y (green) axis... + * zrotate() - Rotate about the z (blue) axis... + * zshear() - Shear z using x and y... + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Define some math constants that are required... + */ + +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif /* !M_PI */ + +#ifndef M_SQRT2 +# define M_SQRT2 1.41421356237309504880 +#endif /* !M_SQRT2 */ + +#ifndef M_SQRT1_2 +# define M_SQRT1_2 0.70710678118654752440 +#endif /* !M_SQRT1_2 */ + +/* + * CIE XYZ whitepoint... + */ + +#define D65_X (0.412453 + 0.357580 + 0.180423) +#define D65_Y (0.212671 + 0.715160 + 0.072169) +#define D65_Z (0.019334 + 0.119193 + 0.950227) + + +/* + * Lookup table structure... + */ + +typedef int cups_clut_t[3][256]; + + +/* + * Local globals... + */ + +static int cupsImageHaveProfile = 0; + /* Do we have a color profile? */ +static int *cupsImageDensity; + /* Ink/marker density LUT */ +static cups_clut_t *cupsImageMatrix; + /* Color transform matrix LUT */ +static cups_cspace_t cupsImageColorSpace = CUPS_CSPACE_RGB; + /* Destination colorspace */ + + +/* + * Local functions... + */ + +static float cielab(float x, float xn); +static void huerotate(float [3][3], float); +static void ident(float [3][3]); +static void mult(float [3][3], float [3][3], float [3][3]); +static void rgb_to_lab(cups_ib_t *val); +static void rgb_to_xyz(cups_ib_t *val); +static void saturate(float [3][3], float); +static void xform(float [3][3], float, float, float, float *, float *, float *); +static void xrotate(float [3][3], float, float); +static void yrotate(float [3][3], float, float); +static void zrotate(float [3][3], float, float); +static void zshear(float [3][3], float, float); + + +/* + * 'cupsImageCMYKToBlack()' - Convert CMYK data to black. + */ + +void +cupsImageCMYKToBlack( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int k; /* Black value */ + + + if (cupsImageHaveProfile) + while (count > 0) + { + k = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 + in[3]; + + if (k < 255) + *out++ = cupsImageDensity[k]; + else + *out++ = cupsImageDensity[255]; + + in += 4; + count --; + } + else + while (count > 0) + { + k = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 + in[3]; + + if (k < 255) + *out++ = k; + else + *out++ = 255; + + in += 4; + count --; + } +} + + +/* + * 'cupsImageCMYKToCMY()' - Convert CMYK colors to CMY. + */ + +void +cupsImageCMYKToCMY( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k; /* CMYK values */ + int cc, cm, cy; /* Calibrated CMY values */ + + + if (cupsImageHaveProfile) + while (count > 0) + { + c = *in++; + m = *in++; + y = *in++; + k = *in++; + + cc = cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y] + k; + cm = cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y] + k; + cy = cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y] + k; + + if (cc < 0) + *out++ = 0; + else if (cc > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cc]; + + if (cm < 0) + *out++ = 0; + else if (cm > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cm]; + + if (cy < 0) + *out++ = 0; + else if (cy > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cy]; + + count --; + } + else + while (count > 0) + { + c = *in++; + m = *in++; + y = *in++; + k = *in++; + + c += k; + m += k; + y += k; + + if (c < 255) + *out++ = c; + else + *out++ = 255; + + if (m < 255) + *out++ = y; + else + *out++ = 255; + + if (y < 255) + *out++ = y; + else + *out++ = 255; + + count --; + } +} + + +/* + * 'cupsImageCMYKToCMYK()' - Convert CMYK colors to CMYK. + */ + +void +cupsImageCMYKToCMYK( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k; /* CMYK values */ + int cc, cm, cy; /* Calibrated CMY values */ + + + if (cupsImageHaveProfile) + while (count > 0) + { + c = *in++; + m = *in++; + y = *in++; + k = *in++; + + cc = (cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y]); + cm = (cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y]); + cy = (cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y]); + + if (cc < 0) + *out++ = 0; + else if (cc > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cc]; + + if (cm < 0) + *out++ = 0; + else if (cm > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cm]; + + if (cy < 0) + *out++ = 0; + else if (cy > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cy]; + + *out++ = cupsImageDensity[k]; + + count --; + } + else if (in != out) + { + while (count > 0) + { + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + *out++ = *in++; + + count --; + } + } +} + + +/* + * 'cupsImageCMYKToRGB()' - Convert CMYK colors to device-dependent RGB. + */ + +void +cupsImageCMYKToRGB( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k; /* CMYK values */ + int cr, cg, cb; /* Calibrated RGB values */ + + + if (cupsImageHaveProfile) + { + while (count > 0) + { + c = *in++; + m = *in++; + y = *in++; + k = *in++; + + cr = cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y] + k; + cg = cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y] + k; + cb = cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y] + k; + + if (cr < 0) + *out++ = 255; + else if (cr > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cr]; + + if (cg < 0) + *out++ = 255; + else if (cg > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cg]; + + if (cb < 0) + *out++ = 255; + else if (cb > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cb]; + + count --; + } + } + else + { + while (count > 0) + { + c = 255 - *in++; + m = 255 - *in++; + y = 255 - *in++; + k = *in++; + + c -= k; + m -= k; + y -= k; + + if (c > 0) + *out++ = c; + else + *out++ = 0; + + if (m > 0) + *out++ = m; + else + *out++ = 0; + + if (y > 0) + *out++ = y; + else + *out++ = 0; + + if (cupsImageColorSpace == CUPS_CSPACE_CIELab || + cupsImageColorSpace >= CUPS_CSPACE_ICC1) + rgb_to_lab(out - 3); + else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) + rgb_to_xyz(out - 3); + + count --; + } + } +} + + +/* + * 'cupsImageCMYKToWhite()' - Convert CMYK colors to luminance. + */ + +void +cupsImageCMYKToWhite( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int w; /* White value */ + + + if (cupsImageHaveProfile) + { + while (count > 0) + { + w = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 - in[3]; + + if (w > 0) + *out++ = cupsImageDensity[w]; + else + *out++ = cupsImageDensity[0]; + + in += 4; + count --; + } + } + else + { + while (count > 0) + { + w = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100 - in[3]; + + if (w > 0) + *out++ = w; + else + *out++ = 0; + + in += 4; + count --; + } + } +} + + +/* + * 'cupsImageLut()' - Adjust all pixel values with the given LUT. + */ + +void +cupsImageLut(cups_ib_t *pixels, /* IO - Input/output pixels */ + int count, /* I - Number of pixels/bytes to adjust */ + const cups_ib_t *lut) /* I - Lookup table */ +{ + while (count > 0) + { + *pixels = lut[*pixels]; + pixels ++; + count --; + } +} + + +/* + * 'cupsImageRGBAdjust()' - Adjust the hue and saturation of the given RGB colors. + */ + +void +cupsImageRGBAdjust(cups_ib_t *pixels, /* IO - Input/output pixels */ + int count, /* I - Number of pixels to adjust */ + int saturation,/* I - Color saturation (%) */ + int hue) /* I - Color hue (degrees) */ +{ + int i, j, k; /* Looping vars */ + float mat[3][3]; /* Color adjustment matrix */ + static int last_sat = 100, /* Last saturation used */ + last_hue = 0; /* Last hue used */ + static cups_clut_t *lut = NULL; /* Lookup table for matrix */ + + + if (saturation != last_sat || hue != last_hue || !lut) + { + /* + * Build the color adjustment matrix... + */ + + ident(mat); + saturate(mat, saturation * 0.01); + huerotate(mat, (float)hue); + + /* + * Allocate memory for the lookup table... + */ + + if (lut == NULL) + lut = calloc(3, sizeof(cups_clut_t)); + + if (lut == NULL) + return; + + /* + * Convert the matrix into a 3x3 array of lookup tables... + */ + + for (i = 0; i < 3; i ++) + for (j = 0; j < 3; j ++) + for (k = 0; k < 256; k ++) + lut[i][j][k] = mat[i][j] * k + 0.5; + + /* + * Save the saturation and hue to compare later... + */ + + last_sat = saturation; + last_hue = hue; + } + + /* + * Adjust each pixel in the given buffer. + */ + + while (count > 0) + { + i = lut[0][0][pixels[0]] + + lut[1][0][pixels[1]] + + lut[2][0][pixels[2]]; + if (i < 0) + pixels[0] = 0; + else if (i > 255) + pixels[0] = 255; + else + pixels[0] = i; + + i = lut[0][1][pixels[0]] + + lut[1][1][pixels[1]] + + lut[2][1][pixels[2]]; + if (i < 0) + pixels[1] = 0; + else if (i > 255) + pixels[1] = 255; + else + pixels[1] = i; + + i = lut[0][2][pixels[0]] + + lut[1][2][pixels[1]] + + lut[2][2][pixels[2]]; + if (i < 0) + pixels[2] = 0; + else if (i > 255) + pixels[2] = 255; + else + pixels[2] = i; + + count --; + pixels += 3; + } +} + + +/* + * 'cupsImageRGBToBlack()' - Convert RGB data to black. + */ + +void +cupsImageRGBToBlack( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + while (count > 0) + { + *out++ = cupsImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100]; + in += 3; + count --; + } + else + while (count > 0) + { + *out++ = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100; + in += 3; + count --; + } +} + + +/* + * 'cupsImageRGBToCMY()' - Convert RGB colors to CMY. + */ + +void +cupsImageRGBToCMY( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k; /* CMYK values */ + int cc, cm, cy; /* Calibrated CMY values */ + + + if (cupsImageHaveProfile) + while (count > 0) + { + c = 255 - *in++; + m = 255 - *in++; + y = 255 - *in++; + k = min(c, min(m, y)); + c -= k; + m -= k; + y -= k; + + cc = cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y] + k; + cm = cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y] + k; + cy = cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y] + k; + + if (cc < 0) + *out++ = 0; + else if (cc > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cc]; + + if (cm < 0) + *out++ = 0; + else if (cm > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cm]; + + if (cy < 0) + *out++ = 0; + else if (cy > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cy]; + + count --; + } + else + while (count > 0) + { + c = 255 - in[0]; + m = 255 - in[1]; + y = 255 - in[2]; + k = min(c, min(m, y)); + + *out++ = (255 - in[1] / 4) * (c - k) / 255 + k; + *out++ = (255 - in[2] / 4) * (m - k) / 255 + k; + *out++ = (255 - in[0] / 4) * (y - k) / 255 + k; + in += 3; + count --; + } +} + + +/* + * 'cupsImageRGBToCMYK()' - Convert RGB colors to CMYK. + */ + +void +cupsImageRGBToCMYK( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k, /* CMYK values */ + km; /* Maximum K value */ + int cc, cm, cy; /* Calibrated CMY values */ + + + if (cupsImageHaveProfile) + while (count > 0) + { + c = 255 - *in++; + m = 255 - *in++; + y = 255 - *in++; + k = min(c, min(m, y)); + + if ((km = max(c, max(m, y))) > k) + k = k * k * k / (km * km); + + c -= k; + m -= k; + y -= k; + + cc = (cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y]); + cm = (cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y]); + cy = (cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y]); + + if (cc < 0) + *out++ = 0; + else if (cc > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cc]; + + if (cm < 0) + *out++ = 0; + else if (cm > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cm]; + + if (cy < 0) + *out++ = 0; + else if (cy > 255) + *out++ = cupsImageDensity[255]; + else + *out++ = cupsImageDensity[cy]; + + *out++ = cupsImageDensity[k]; + + count --; + } + else + while (count > 0) + { + c = 255 - *in++; + m = 255 - *in++; + y = 255 - *in++; + k = min(c, min(m, y)); + + if ((km = max(c, max(m, y))) > k) + k = k * k * k / (km * km); + + c -= k; + m -= k; + y -= k; + + *out++ = c; + *out++ = m; + *out++ = y; + *out++ = k; + + count --; + } +} + + +/* + * 'cupsImageRGBToRGB()' - Convert RGB colors to device-dependent RGB. + */ + +void +cupsImageRGBToRGB( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + int c, m, y, k; /* CMYK values */ + int cr, cg, cb; /* Calibrated RGB values */ + + + if (cupsImageHaveProfile) + { + while (count > 0) + { + c = 255 - *in++; + m = 255 - *in++; + y = 255 - *in++; + k = min(c, min(m, y)); + c -= k; + m -= k; + y -= k; + + cr = cupsImageMatrix[0][0][c] + + cupsImageMatrix[0][1][m] + + cupsImageMatrix[0][2][y] + k; + cg = cupsImageMatrix[1][0][c] + + cupsImageMatrix[1][1][m] + + cupsImageMatrix[1][2][y] + k; + cb = cupsImageMatrix[2][0][c] + + cupsImageMatrix[2][1][m] + + cupsImageMatrix[2][2][y] + k; + + if (cr < 0) + *out++ = 255; + else if (cr > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cr]; + + if (cg < 0) + *out++ = 255; + else if (cg > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cg]; + + if (cb < 0) + *out++ = 255; + else if (cb > 255) + *out++ = 255 - cupsImageDensity[255]; + else + *out++ = 255 - cupsImageDensity[cb]; + + count --; + } + } + else + { + if (in != out) + memcpy(out, in, count * 3); + + if (cupsImageColorSpace == CUPS_CSPACE_CIELab || + cupsImageColorSpace >= CUPS_CSPACE_ICC1) + { + while (count > 0) + { + rgb_to_lab(out); + + out += 3; + count --; + } + } + else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) + { + while (count > 0) + { + rgb_to_xyz(out); + + out += 3; + count --; + } + } + } +} + + +/* + * 'cupsImageRGBToWhite()' - Convert RGB colors to luminance. + */ + +void +cupsImageRGBToWhite( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + { + while (count > 0) + { + *out++ = 255 - cupsImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100]; + in += 3; + count --; + } + } + else + { + while (count > 0) + { + *out++ = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100; + in += 3; + count --; + } + } +} + + +/* + * 'cupsImageSetProfile()' - Set the device color profile. + */ + +void +cupsImageSetProfile(float d, /* I - Ink/marker density */ + float g, /* I - Ink/marker gamma */ + float matrix[3][3]) /* I - Color transform matrix */ +{ + int i, j, k; /* Looping vars */ + float m; /* Current matrix value */ + int *im; /* Pointer into cupsImageMatrix */ + + + /* + * Allocate memory for the profile data... + */ + + if (cupsImageMatrix == NULL) + cupsImageMatrix = calloc(3, sizeof(cups_clut_t)); + + if (cupsImageMatrix == NULL) + return; + + if (cupsImageDensity == NULL) + cupsImageDensity = calloc(256, sizeof(int)); + + if (cupsImageDensity == NULL) + return; + + /* + * Populate the profile lookup tables... + */ + + cupsImageHaveProfile = 1; + + for (i = 0, im = cupsImageMatrix[0][0]; i < 3; i ++) + for (j = 0; j < 3; j ++) + for (k = 0, m = matrix[i][j]; k < 256; k ++) + *im++ = (int)(k * m + 0.5); + + for (k = 0, im = cupsImageDensity; k < 256; k ++) + *im++ = 255.0 * d * pow((float)k / 255.0, g) + 0.5; +} + + +/* + * 'cupsImageSetRasterColorSpace()' - Set the destination colorspace. + */ + +void +cupsImageSetRasterColorSpace( + cups_cspace_t cs) /* I - Destination colorspace */ +{ + /* + * Set the destination colorspace... + */ + + cupsImageColorSpace = cs; + + /* + * Don't use color profiles in colorimetric colorspaces... + */ + + if (cs == CUPS_CSPACE_CIEXYZ || + cs == CUPS_CSPACE_CIELab || + cs >= CUPS_CSPACE_ICC1) + cupsImageHaveProfile = 0; +} + + +/* + * 'cupsImageWhiteToBlack()' - Convert luminance colors to black. + */ + +void +cupsImageWhiteToBlack( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + while (count > 0) + { + *out++ = cupsImageDensity[255 - *in++]; + count --; + } + else + while (count > 0) + { + *out++ = 255 - *in++; + count --; + } +} + + +/* + * 'cupsImageWhiteToCMY()' - Convert luminance colors to CMY. + */ + +void +cupsImageWhiteToCMY( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + while (count > 0) + { + out[0] = cupsImageDensity[255 - *in++]; + out[1] = out[0]; + out[2] = out[0]; + out += 3; + count --; + } + else + while (count > 0) + { + *out++ = 255 - *in; + *out++ = 255 - *in; + *out++ = 255 - *in++; + count --; + } +} + + +/* + * 'cupsImageWhiteToCMYK()' - Convert luminance colors to CMYK. + */ + +void +cupsImageWhiteToCMYK( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + while (count > 0) + { + *out++ = 0; + *out++ = 0; + *out++ = 0; + *out++ = cupsImageDensity[255 - *in++]; + count --; + } + else + while (count > 0) + { + *out++ = 0; + *out++ = 0; + *out++ = 0; + *out++ = 255 - *in++; + count --; + } +} + + +/* + * 'cupsImageWhiteToRGB()' - Convert luminance data to RGB. + */ + +void +cupsImageWhiteToRGB( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + { + while (count > 0) + { + out[0] = 255 - cupsImageDensity[255 - *in++]; + out[1] = out[0]; + out[2] = out[0]; + out += 3; + count --; + } + } + else + { + while (count > 0) + { + *out++ = *in; + *out++ = *in; + *out++ = *in++; + + if (cupsImageColorSpace == CUPS_CSPACE_CIELab || + cupsImageColorSpace >= CUPS_CSPACE_ICC1) + rgb_to_lab(out - 3); + else if (cupsImageColorSpace == CUPS_CSPACE_CIEXYZ) + rgb_to_xyz(out - 3); + + count --; + } + } +} + + +/* + * 'cupsImageWhiteToWhite()' - Convert luminance colors to device-dependent + * luminance. + */ + +void +cupsImageWhiteToWhite( + const cups_ib_t *in, /* I - Input pixels */ + cups_ib_t *out, /* I - Output pixels */ + int count) /* I - Number of pixels */ +{ + if (cupsImageHaveProfile) + while (count > 0) + { + *out++ = 255 - cupsImageDensity[255 - *in++]; + count --; + } + else if (in != out) + memcpy(out, in, count); +} + + +/* + * 'cielab()' - Map CIE Lab transformation... + */ + +static float /* O - Adjusted color value */ +cielab(float x, /* I - Raw color value */ + float xn) /* I - Whitepoint color value */ +{ + float x_xn; /* Fraction of whitepoint */ + + + x_xn = x / xn; + + if (x_xn > 0.008856) + return (cbrt(x_xn)); + else + return (7.787 * x_xn + 16.0 / 116.0); +} + + +/* + * 'huerotate()' - Rotate the hue, maintaining luminance. + */ + +static void +huerotate(float mat[3][3], /* I - Matrix to append to */ + float rot) /* I - Hue rotation in degrees */ +{ + float hmat[3][3]; /* Hue matrix */ + float lx, ly, lz; /* Luminance vector */ + float xrs, xrc; /* X rotation sine/cosine */ + float yrs, yrc; /* Y rotation sine/cosine */ + float zrs, zrc; /* Z rotation sine/cosine */ + float zsx, zsy; /* Z shear x/y */ + + + /* + * Load the identity matrix... + */ + + ident(hmat); + + /* + * Rotate the grey vector into positive Z... + */ + + xrs = M_SQRT1_2; + xrc = M_SQRT1_2; + xrotate(hmat,xrs,xrc); + + yrs = -1.0 / sqrt(3.0); + yrc = -M_SQRT2 * yrs; + yrotate(hmat,yrs,yrc); + + /* + * Shear the space to make the luminance plane horizontal... + */ + + xform(hmat, 0.3086, 0.6094, 0.0820, &lx, &ly, &lz); + zsx = lx / lz; + zsy = ly / lz; + zshear(hmat, zsx, zsy); + + /* + * Rotate the hue... + */ + + zrs = sin(rot * M_PI / 180.0); + zrc = cos(rot * M_PI / 180.0); + + zrotate(hmat, zrs, zrc); + + /* + * Unshear the space to put the luminance plane back... + */ + + zshear(hmat, -zsx, -zsy); + + /* + * Rotate the grey vector back into place... + */ + + yrotate(hmat, -yrs, yrc); + xrotate(hmat, -xrs, xrc); + + /* + * Append it to the current matrix... + */ + + mult(hmat, mat, mat); +} + + +/* + * 'ident()' - Make an identity matrix. + */ + +static void +ident(float mat[3][3]) /* I - Matrix to identify */ +{ + mat[0][0] = 1.0; + mat[0][1] = 0.0; + mat[0][2] = 0.0; + mat[1][0] = 0.0; + mat[1][1] = 1.0; + mat[1][2] = 0.0; + mat[2][0] = 0.0; + mat[2][1] = 0.0; + mat[2][2] = 1.0; +} + + +/* + * 'mult()' - Multiply two matrices. + */ + +static void +mult(float a[3][3], /* I - First matrix */ + float b[3][3], /* I - Second matrix */ + float c[3][3]) /* I - Destination matrix */ +{ + int x, y; /* Looping vars */ + float temp[3][3]; /* Temporary matrix */ + + + /* + * Multiply a and b, putting the result in temp... + */ + + for (y = 0; y < 3; y ++) + for (x = 0; x < 3; x ++) + temp[y][x] = b[y][0] * a[0][x] + + b[y][1] * a[1][x] + + b[y][2] * a[2][x]; + + /* + * Copy temp to c (that way c can be a pointer to a or b). + */ + + memcpy(c, temp, sizeof(temp)); +} + + +/* + * 'rgb_to_lab()' - Convert an RGB color to CIE Lab. + */ + +static void +rgb_to_lab(cups_ib_t *val) /* IO - Color value */ +{ + float r, /* Red value */ + g, /* Green value */ + b, /* Blue value */ + ciex, /* CIE X value */ + ciey, /* CIE Y value */ + ciez, /* CIE Z value */ + ciey_yn, /* Normalized luminance */ + ciel, /* CIE L value */ + ciea, /* CIE a value */ + cieb; /* CIE b value */ + + + /* + * Convert sRGB to linear RGB... + */ + + r = pow((val[0] / 255.0 + 0.055) / 1.055, 2.4); + g = pow((val[1] / 255.0 + 0.055) / 1.055, 2.4); + b = pow((val[2] / 255.0 + 0.055) / 1.055, 2.4); + + /* + * Convert to CIE XYZ... + */ + + ciex = 0.412453 * r + 0.357580 * g + 0.180423 * b; + ciey = 0.212671 * r + 0.715160 * g + 0.072169 * b; + ciez = 0.019334 * r + 0.119193 * g + 0.950227 * b; + + /* + * Normalize and convert to CIE Lab... + */ + + ciey_yn = ciey / D65_Y; + + if (ciey_yn > 0.008856) + ciel = 116 * cbrt(ciey_yn) - 16; + else + ciel = 903.3 * ciey_yn; + +/*ciel = ciel;*/ + ciea = 500 * (cielab(ciex, D65_X) - cielab(ciey, D65_Y)); + cieb = 200 * (cielab(ciey, D65_Y) - cielab(ciez, D65_Z)); + + /* + * Scale the L value and bias the a and b values by 128 so that all + * numbers are from 0 to 255. + */ + + ciel = ciel * 2.55 + 0.5; + ciea += 128.5; + cieb += 128.5; + + /* + * Output 8-bit values... + */ + + if (ciel < 0.0) + val[0] = 0; + else if (ciel < 255.0) + val[0] = (int)ciel; + else + val[0] = 255; + + if (ciea < 0.0) + val[1] = 0; + else if (ciea < 255.0) + val[1] = (int)ciea; + else + val[1] = 255; + + if (cieb < 0.0) + val[2] = 0; + else if (cieb < 255.0) + val[2] = (int)cieb; + else + val[2] = 255; +} + + +/* + * 'rgb_to_xyz()' - Convert an RGB color to CIE XYZ. + */ + +static void +rgb_to_xyz(cups_ib_t *val) /* IO - Color value */ +{ + float r, /* Red value */ + g, /* Green value */ + b, /* Blue value */ + ciex, /* CIE X value */ + ciey, /* CIE Y value */ + ciez; /* CIE Z value */ + + + /* + * Convert sRGB to linear RGB... + */ + + r = pow((val[0] / 255.0 + 0.055) / 1.055, 2.4); + g = pow((val[1] / 255.0 + 0.055) / 1.055, 2.4); + b = pow((val[2] / 255.0 + 0.055) / 1.055, 2.4); + + /* + * Convert to CIE XYZ... + */ + + ciex = 0.412453 * r + 0.357580 * g + 0.180423 * b; + ciey = 0.212671 * r + 0.715160 * g + 0.072169 * b; + ciez = 0.019334 * r + 0.119193 * g + 0.950227 * b; + + /* + * Encode as 8-bit XYZ... + */ + + if (ciex < 0.0f) + val[0] = 0; + else if (ciex < 1.1f) + val[0] = (int)(231.8181f * ciex + 0.5); + else + val[0] = 255; + + if (ciey < 0.0f) + val[1] = 0; + else if (ciey < 1.1f) + val[1] = (int)(231.8181f * ciey + 0.5); + else + val[1] = 255; + + if (ciez < 0.0f) + val[2] = 0; + else if (ciez < 1.1f) + val[2] = (int)(231.8181f * ciez + 0.5); + else + val[2] = 255; +} + + +/* + * 'saturate()' - Make a saturation matrix. + */ + +static void +saturate(float mat[3][3], /* I - Matrix to append to */ + float sat) /* I - Desired color saturation */ +{ + float smat[3][3]; /* Saturation matrix */ + + + smat[0][0] = (1.0 - sat) * 0.3086 + sat; + smat[0][1] = (1.0 - sat) * 0.3086; + smat[0][2] = (1.0 - sat) * 0.3086; + smat[1][0] = (1.0 - sat) * 0.6094; + smat[1][1] = (1.0 - sat) * 0.6094 + sat; + smat[1][2] = (1.0 - sat) * 0.6094; + smat[2][0] = (1.0 - sat) * 0.0820; + smat[2][1] = (1.0 - sat) * 0.0820; + smat[2][2] = (1.0 - sat) * 0.0820 + sat; + + mult(smat, mat, mat); +} + + +/* + * 'xform()' - Transform a 3D point using a matrix... + */ + +static void +xform(float mat[3][3], /* I - Matrix */ + float x, /* I - Input X coordinate */ + float y, /* I - Input Y coordinate */ + float z, /* I - Input Z coordinate */ + float *tx, /* O - Output X coordinate */ + float *ty, /* O - Output Y coordinate */ + float *tz) /* O - Output Z coordinate */ +{ + *tx = x * mat[0][0] + y * mat[1][0] + z * mat[2][0]; + *ty = x * mat[0][1] + y * mat[1][1] + z * mat[2][1]; + *tz = x * mat[0][2] + y * mat[1][2] + z * mat[2][2]; +} + + +/* + * 'xrotate()' - Rotate about the x (red) axis... + */ + +static void +xrotate(float mat[3][3], /* I - Matrix */ + float rs, /* I - Rotation angle sine */ + float rc) /* I - Rotation angle cosine */ +{ + float rmat[3][3]; /* I - Rotation matrix */ + + + rmat[0][0] = 1.0; + rmat[0][1] = 0.0; + rmat[0][2] = 0.0; + + rmat[1][0] = 0.0; + rmat[1][1] = rc; + rmat[1][2] = rs; + + rmat[2][0] = 0.0; + rmat[2][1] = -rs; + rmat[2][2] = rc; + + mult(rmat, mat, mat); +} + + +/* + * 'yrotate()' - Rotate about the y (green) axis... + */ + +static void +yrotate(float mat[3][3], /* I - Matrix */ + float rs, /* I - Rotation angle sine */ + float rc) /* I - Rotation angle cosine */ +{ + float rmat[3][3]; /* I - Rotation matrix */ + + + rmat[0][0] = rc; + rmat[0][1] = 0.0; + rmat[0][2] = -rs; + + rmat[1][0] = 0.0; + rmat[1][1] = 1.0; + rmat[1][2] = 0.0; + + rmat[2][0] = rs; + rmat[2][1] = 0.0; + rmat[2][2] = rc; + + mult(rmat,mat,mat); +} + + +/* + * 'zrotate()' - Rotate about the z (blue) axis... + */ + +static void +zrotate(float mat[3][3], /* I - Matrix */ + float rs, /* I - Rotation angle sine */ + float rc) /* I - Rotation angle cosine */ +{ + float rmat[3][3]; /* I - Rotation matrix */ + + + rmat[0][0] = rc; + rmat[0][1] = rs; + rmat[0][2] = 0.0; + + rmat[1][0] = -rs; + rmat[1][1] = rc; + rmat[1][2] = 0.0; + + rmat[2][0] = 0.0; + rmat[2][1] = 0.0; + rmat[2][2] = 1.0; + + mult(rmat,mat,mat); +} + + +/* + * 'zshear()' - Shear z using x and y... + */ + +static void +zshear(float mat[3][3], /* I - Matrix */ + float dx, /* I - X shear */ + float dy) /* I - Y shear */ +{ + float smat[3][3]; /* Shear matrix */ + + + smat[0][0] = 1.0; + smat[0][1] = 0.0; + smat[0][2] = dx; + + smat[1][0] = 0.0; + smat[1][1] = 1.0; + smat[1][2] = dy; + + smat[2][0] = 0.0; + smat[2][1] = 0.0; + smat[2][2] = 1.0; + + mult(smat, mat, mat); +} + + +/* + * End of "$Id: image-colorspace.c 9748 2011-05-06 21:02:44Z mike $". + */ diff --git a/filter/image-gif.c b/filter/image-gif.c new file mode 100644 index 0000000..7477c0c --- /dev/null +++ b/filter/image-gif.c @@ -0,0 +1,696 @@ +/* + * "$Id: image-gif.c 9865 2011-08-06 04:38:04Z mike $" + * + * GIF image routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadGIF() - Read a GIF image file. + * gif_get_block() - Read a GIF data block... + * gif_get_code() - Get a LZW code from the file... + * gif_read_cmap() - Read the colormap from a GIF file... + * gif_read_image() - Read a GIF image stream... + * gif_read_lzw() - Read a byte from the LZW stream... + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * GIF definitions... + */ + +#define GIF_INTERLACE 0x40 +#define GIF_COLORMAP 0x80 +#define GIF_MAX_BITS 12 + +typedef cups_ib_t gif_cmap_t[256][4]; +typedef short gif_table_t[4096]; + + +/* + * Local globals... + */ + +static int gif_eof = 0; /* Did we hit EOF? */ + + +/* + * Local functions... + */ + +static int gif_get_block(FILE *fp, unsigned char *buffer); +static int gif_get_code (FILE *fp, int code_size, int first_time); +static int gif_read_cmap(FILE *fp, int ncolors, gif_cmap_t cmap, + int *gray); +static int gif_read_image(FILE *fp, cups_image_t *img, gif_cmap_t cmap, + int interlace); +static int gif_read_lzw(FILE *fp, int first_time, int input_code_size); + + +/* + * '_cupsImageReadGIF()' - Read a GIF image file. + */ + +int /* O - Read status */ +_cupsImageReadGIF( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + unsigned char buf[1024]; /* Input buffer */ + gif_cmap_t cmap; /* Colormap */ + int i, /* Looping var */ + bpp, /* Bytes per pixel */ + gray, /* Grayscale image? */ + ncolors, /* Bits per pixel */ + transparent; /* Transparent color index */ + + + /* + * GIF files are either grayscale or RGB - no CMYK... + */ + + if (primary == CUPS_IMAGE_RGB_CMYK) + primary = CUPS_IMAGE_RGB; + + /* + * Read the header; we already know it is a GIF file... + */ + + fread(buf, 13, 1, fp); + + img->xsize = (buf[7] << 8) | buf[6]; + img->ysize = (buf[9] << 8) | buf[8]; + ncolors = 2 << (buf[10] & 0x07); + gray = primary == CUPS_IMAGE_BLACK || primary == CUPS_IMAGE_WHITE; + + if (buf[10] & GIF_COLORMAP) + if (gif_read_cmap(fp, ncolors, cmap, &gray)) + { + fclose(fp); + return (-1); + } + + transparent = -1; + + for (;;) + { + switch (getc(fp)) + { + case ';' : /* End of image */ + fclose(fp); + return (-1); /* Early end of file */ + + case '!' : /* Extension record */ + buf[0] = getc(fp); + if (buf[0] == 0xf9) /* Graphic Control Extension */ + { + gif_get_block(fp, buf); + if (buf[0] & 1) /* Get transparent color index */ + transparent = buf[3]; + } + + while (gif_get_block(fp, buf) != 0); + break; + + case ',' : /* cupsImage data */ + fread(buf, 9, 1, fp); + + if (buf[8] & GIF_COLORMAP) + { + ncolors = 2 << (buf[8] & 0x07); + gray = primary == CUPS_IMAGE_BLACK || primary == CUPS_IMAGE_WHITE; + + if (gif_read_cmap(fp, ncolors, cmap, &gray)) + { + fclose(fp); + return (-1); + } + } + + if (transparent >= 0) + { + /* + * Make transparent color white... + */ + + cmap[transparent][0] = 255; + cmap[transparent][1] = 255; + cmap[transparent][2] = 255; + } + + if (gray) + { + switch (secondary) + { + case CUPS_IMAGE_CMYK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageWhiteToCMYK(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_CMY : + for (i = ncolors - 1; i >= 0; i --) + cupsImageWhiteToCMY(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_BLACK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageWhiteToBlack(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_WHITE : + break; + case CUPS_IMAGE_RGB : + case CUPS_IMAGE_RGB_CMYK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageWhiteToRGB(cmap[i], cmap[i], 1); + break; + } + + img->colorspace = secondary; + } + else + { + if (hue != 0 || saturation != 100) + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBAdjust(cmap[i], 1, saturation, hue); + + switch (primary) + { + case CUPS_IMAGE_CMYK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBToCMYK(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_CMY : + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBToCMY(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_BLACK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBToBlack(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_WHITE : + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBToWhite(cmap[i], cmap[i], 1); + break; + case CUPS_IMAGE_RGB : + case CUPS_IMAGE_RGB_CMYK : + for (i = ncolors - 1; i >= 0; i --) + cupsImageRGBToRGB(cmap[i], cmap[i], 1); + break; + } + + img->colorspace = primary; + } + + if (lut) + { + bpp = cupsImageGetDepth(img); + + for (i = ncolors - 1; i >= 0; i --) + cupsImageLut(cmap[i], bpp, lut); + } + + img->xsize = (buf[5] << 8) | buf[4]; + img->ysize = (buf[7] << 8) | buf[6]; + + /* + * Check the dimensions of the image; since the dimensions are + * a 16-bit integer we just need to check for 0... + */ + + if (img->xsize == 0 || img->ysize == 0) + { + fprintf(stderr, "DEBUG: Bad GIF image dimensions: %dx%d\n", + img->xsize, img->ysize); + fclose(fp); + return (1); + } + + i = gif_read_image(fp, img, cmap, buf[8] & GIF_INTERLACE); + fclose(fp); + return (i); + } + } +} + + +/* + * 'gif_get_block()' - Read a GIF data block... + */ + +static int /* O - Number characters read */ +gif_get_block(FILE *fp, /* I - File to read from */ + unsigned char *buf) /* I - Input buffer */ +{ + int count; /* Number of character to read */ + + + /* + * Read the count byte followed by the data from the file... + */ + + if ((count = getc(fp)) == EOF) + { + gif_eof = 1; + return (-1); + } + else if (count == 0) + gif_eof = 1; + else if (fread(buf, 1, count, fp) < count) + { + gif_eof = 1; + return (-1); + } + else + gif_eof = 0; + + return (count); +} + + +/* + * 'gif_get_code()' - Get a LZW code from the file... + */ + +static int /* O - LZW code */ +gif_get_code(FILE *fp, /* I - File to read from */ + int code_size, /* I - Size of code in bits */ + int first_time) /* I - 1 = first time, 0 = not first time */ +{ + unsigned i, j, /* Looping vars */ + ret; /* Return value */ + int count; /* Number of bytes read */ + static unsigned char buf[280]; /* Input buffer */ + static unsigned curbit, /* Current bit */ + lastbit, /* Last bit in buffer */ + done, /* Done with this buffer? */ + last_byte; /* Last byte in buffer */ + static const unsigned char bits[8] = /* Bit masks for codes */ + { + 0x01, 0x02, 0x04, 0x08, + 0x10, 0x20, 0x40, 0x80 + }; + + + if (first_time) + { + /* + * Just initialize the input buffer... + */ + + curbit = 0; + lastbit = 0; + last_byte = 0; + done = 0; + + return (0); + } + + if ((curbit + code_size) >= lastbit) + { + /* + * Don't have enough bits to hold the code... + */ + + if (done) + return (-1); /* Sorry, no more... */ + + /* + * Move last two bytes to front of buffer... + */ + + if (last_byte > 1) + { + buf[0] = buf[last_byte - 2]; + buf[1] = buf[last_byte - 1]; + last_byte = 2; + } + else if (last_byte == 1) + { + buf[0] = buf[last_byte - 1]; + last_byte = 1; + } + + /* + * Read in another buffer... + */ + + if ((count = gif_get_block(fp, buf + last_byte)) <= 0) + { + /* + * Whoops, no more data! + */ + + done = 1; + return (-1); + } + + /* + * Update buffer state... + */ + + curbit = (curbit - lastbit) + 8 * last_byte; + last_byte += count; + lastbit = last_byte * 8; + } + + for (ret = 0, i = curbit + code_size - 1, j = code_size; + j > 0; + i --, j --) + ret = (ret << 1) | ((buf[i / 8] & bits[i & 7]) != 0); + + curbit += code_size; + + return ret; +} + + +/* + * 'gif_read_cmap()' - Read the colormap from a GIF file... + */ + +static int /* O - -1 on error, 0 on success */ +gif_read_cmap(FILE *fp, /* I - File to read from */ + int ncolors, /* I - Number of colors in file */ + gif_cmap_t cmap, /* O - Colormap information */ + int *gray) /* IO - Is the image grayscale? */ +{ + int i; /* Looping var */ + + + /* + * Read the colormap... + */ + + for (i = 0; i < ncolors; i ++) + if (fread(cmap[i], 3, 1, fp) < 1) + return (-1); + + /* + * Check to see if the colormap is a grayscale ramp... + */ + + for (i = 0; i < ncolors; i ++) + if (cmap[i][0] != cmap[i][1] || cmap[i][1] != cmap[i][2]) + break; + + if (i == ncolors) + { + *gray = 1; + return (0); + } + + /* + * If this needs to be a grayscale image, convert the RGB values to + * luminance values... + */ + + if (*gray) + for (i = 0; i < ncolors; i ++) + cmap[i][0] = (cmap[i][0] * 31 + cmap[i][1] * 61 + cmap[i][2] * 8) / 100; + + return (0); +} + + +/* + * 'gif_read_image()' - Read a GIF image stream... + */ + +static int /* I - 0 = success, -1 = failure */ +gif_read_image(FILE *fp, /* I - Input file */ + cups_image_t *img, /* I - cupsImage pointer */ + gif_cmap_t cmap, /* I - Colormap */ + int interlace) /* I - Non-zero = interlaced image */ +{ + unsigned char code_size; /* Code size */ + cups_ib_t *pixels, /* Pixel buffer */ + *temp; /* Current pixel */ + int xpos, /* Current X position */ + ypos, /* Current Y position */ + pass; /* Current pass */ + int pixel; /* Current pixel */ + int bpp; /* Bytes per pixel */ + static const int xpasses[4] = /* X interleaving */ + { 8, 8, 4, 2 }, + ypasses[5] = /* Y interleaving */ + { 0, 4, 2, 1, 999999 }; + + + bpp = cupsImageGetDepth(img); + pixels = calloc(bpp, img->xsize); + xpos = 0; + ypos = 0; + pass = 0; + code_size = getc(fp); + + if (!pixels) + return (-1); + + if (code_size > GIF_MAX_BITS || gif_read_lzw(fp, 1, code_size) < 0) + { + free(pixels); + return (-1); + } + + temp = pixels; + while ((pixel = gif_read_lzw(fp, 0, code_size)) >= 0) + { + switch (bpp) + { + case 4 : + temp[3] = cmap[pixel][3]; + case 3 : + temp[2] = cmap[pixel][2]; + case 2 : + temp[1] = cmap[pixel][1]; + default : + temp[0] = cmap[pixel][0]; + } + + xpos ++; + temp += bpp; + if (xpos == img->xsize) + { + _cupsImagePutRow(img, 0, ypos, img->xsize, pixels); + + xpos = 0; + temp = pixels; + + if (interlace) + { + ypos += xpasses[pass]; + + if (ypos >= img->ysize) + { + pass ++; + + ypos = ypasses[pass]; + } + } + else + ypos ++; + } + + if (ypos >= img->ysize) + break; + } + + free(pixels); + + return (0); +} + + +/* + * 'gif_read_lzw()' - Read a byte from the LZW stream... + */ + +static int /* I - Byte from stream */ +gif_read_lzw(FILE *fp, /* I - File to read from */ + int first_time, /* I - 1 = first time, 0 = not first time */ + int input_code_size) /* I - Code size in bits */ +{ + int i, /* Looping var */ + code, /* Current code */ + incode; /* Input code */ + static short fresh = 0, /* 1 = empty buffers */ + code_size, /* Current code size */ + set_code_size, /* Initial code size set */ + max_code, /* Maximum code used */ + max_code_size, /* Maximum code size */ + firstcode, /* First code read */ + oldcode, /* Last code read */ + clear_code, /* Clear code for LZW input */ + end_code, /* End code for LZW input */ + *stack = NULL, /* Output stack */ + *sp; /* Current stack pointer */ + static gif_table_t *table = NULL; /* String table */ + + + if (first_time) + { + /* + * Setup LZW state... + */ + + set_code_size = input_code_size; + code_size = set_code_size + 1; + clear_code = 1 << set_code_size; + end_code = clear_code + 1; + max_code_size = 2 * clear_code; + max_code = clear_code + 2; + + /* + * Allocate memory for buffers... + */ + + if (table == NULL) + table = calloc(2, sizeof(gif_table_t)); + + if (table == NULL) + return (-1); + + if (stack == NULL) + stack = calloc(8192, sizeof(short)); + + if (stack == NULL) + return (-1); + + /* + * Initialize input buffers... + */ + + gif_get_code(fp, 0, 1); + + /* + * Wipe the decompressor table (already mostly 0 due to the calloc above...) + */ + + fresh = 1; + + for (i = 1; i < clear_code; i ++) + table[1][i] = i; + + sp = stack; + + return (0); + } + else if (fresh) + { + fresh = 0; + + do + { + firstcode = oldcode = gif_get_code(fp, code_size, 0); + } + while (firstcode == clear_code); + + return (firstcode & 255); + } + else if (!table) + return (0); + + if (sp > stack) + return ((*--sp) & 255); + + while ((code = gif_get_code(fp, code_size, 0)) >= 0) + { + if (code == clear_code) + { + /* + * Clear/reset the compression table... + */ + + memset(table, 0, 2 * sizeof(gif_table_t)); + for (i = 1; i < clear_code; i ++) + table[1][i] = i; + + code_size = set_code_size + 1; + max_code_size = 2 * clear_code; + max_code = clear_code + 2; + + sp = stack; + + firstcode = oldcode = gif_get_code(fp, code_size, 0); + + return (firstcode & 255); + } + else if (code == end_code || code > max_code) + { + unsigned char buf[260]; /* Block buffer */ + + if (!gif_eof) + while (gif_get_block(fp, buf) > 0); + + return (-2); + } + + incode = code; + + if (code == max_code) + { + if (sp < (stack + 8192)) + *sp++ = firstcode; + + code = oldcode; + } + + while (code >= clear_code && sp < (stack + 8192)) + { + *sp++ = table[1][code]; + if (code == table[0][code]) + return (255); + + code = table[0][code]; + } + + if (sp < (stack + 8192)) + *sp++ = firstcode = table[1][code]; + + code = max_code; + + if (code < 4096) + { + table[0][code] = oldcode; + table[1][code] = firstcode; + max_code ++; + + if (max_code >= max_code_size && max_code_size < 4096) + { + max_code_size *= 2; + code_size ++; + } + } + + oldcode = incode; + + if (sp > stack) + return ((*--sp) & 255); + } + + return (code & 255); +} + + +/* + * End of "$Id: image-gif.c 9865 2011-08-06 04:38:04Z mike $". + */ diff --git a/filter/image-jpeg.c b/filter/image-jpeg.c new file mode 100644 index 0000000..b892a0e --- /dev/null +++ b/filter/image-jpeg.c @@ -0,0 +1,322 @@ +/* + * "$Id: image-jpeg.c 9771 2011-05-12 05:21:56Z mike $" + * + * JPEG image routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadJPEG() - Read a JPEG image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + +#ifdef HAVE_LIBJPEG +# include /* JPEG/JFIF image definitions */ + + +/* + * '_cupsImageReadJPEG()' - Read a JPEG image file. + */ + +int /* O - Read status */ +_cupsImageReadJPEG( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + struct jpeg_decompress_struct cinfo; /* Decompressor info */ + struct jpeg_error_mgr jerr; /* Error handler info */ + cups_ib_t *in, /* Input pixels */ + *out; /* Output pixels */ + jpeg_saved_marker_ptr marker; /* Pointer to marker data */ + int psjpeg = 0; /* Non-zero if Photoshop CMYK JPEG */ + static const char *cspaces[] = + { /* JPEG colorspaces... */ + "JCS_UNKNOWN", + "JCS_GRAYSCALE", + "JCS_RGB", + "JCS_YCbCr", + "JCS_CMYK", + "JCS_YCCK" + }; + + + /* + * Read the JPEG header... + */ + + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_save_markers(&cinfo, JPEG_APP0 + 14, 0xffff); /* Adobe JPEG */ + jpeg_stdio_src(&cinfo, fp); + jpeg_read_header(&cinfo, 1); + + /* + * Parse any Adobe APPE data embedded in the JPEG file. Since Adobe doesn't + * bother following standards, we have to invert the CMYK JPEG data written by + * Adobe apps... + */ + + for (marker = cinfo.marker_list; marker; marker = marker->next) + if (marker->marker == (JPEG_APP0 + 14) && marker->data_length >= 12 && + !memcmp(marker->data, "Adobe", 5) && marker->data[11] == 2) + { + fputs("DEBUG: Adobe CMYK JPEG detected (inverting color values)\n", + stderr); + psjpeg = 1; + } + + cinfo.quantize_colors = 0; + + fprintf(stderr, "DEBUG: num_components = %d\n", cinfo.num_components); + fprintf(stderr, "DEBUG: jpeg_color_space = %s\n", + cspaces[cinfo.jpeg_color_space]); + + if (cinfo.num_components == 1) + { + fputs("DEBUG: Converting image to grayscale...\n", stderr); + + cinfo.out_color_space = JCS_GRAYSCALE; + cinfo.out_color_components = 1; + cinfo.output_components = 1; + + img->colorspace = secondary; + } + else if (cinfo.num_components == 4) + { + fputs("DEBUG: Converting image to CMYK...\n", stderr); + + cinfo.out_color_space = JCS_CMYK; + cinfo.out_color_components = 4; + cinfo.output_components = 4; + + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_CMYK : primary; + } + else + { + fputs("DEBUG: Converting image to RGB...\n", stderr); + + cinfo.out_color_space = JCS_RGB; + cinfo.out_color_components = 3; + cinfo.output_components = 3; + + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + } + + jpeg_calc_output_dimensions(&cinfo); + + if (cinfo.output_width <= 0 || cinfo.output_width > CUPS_IMAGE_MAX_WIDTH || + cinfo.output_height <= 0 || cinfo.output_height > CUPS_IMAGE_MAX_HEIGHT) + { + fprintf(stderr, "DEBUG: Bad JPEG dimensions %dx%d!\n", + cinfo.output_width, cinfo.output_height); + + jpeg_destroy_decompress(&cinfo); + + fclose(fp); + return (1); + } + + img->xsize = cinfo.output_width; + img->ysize = cinfo.output_height; + + if (cinfo.X_density > 0 && cinfo.Y_density > 0 && cinfo.density_unit > 0) + { + if (cinfo.density_unit == 1) + { + img->xppi = cinfo.X_density; + img->yppi = cinfo.Y_density; + } + else + { + img->xppi = (int)((float)cinfo.X_density * 2.54); + img->yppi = (int)((float)cinfo.Y_density * 2.54); + } + + if (img->xppi == 0 || img->yppi == 0) + { + fprintf(stderr, "DEBUG: Bad JPEG image resolution %dx%d PPI.\n", + img->xppi, img->yppi); + img->xppi = img->yppi = 128; + } + } + + fprintf(stderr, "DEBUG: JPEG image %dx%dx%d, %dx%d PPI\n", + img->xsize, img->ysize, cinfo.output_components, + img->xppi, img->yppi); + + cupsImageSetMaxTiles(img, 0); + + in = malloc(img->xsize * cinfo.output_components); + out = malloc(img->xsize * cupsImageGetDepth(img)); + + jpeg_start_decompress(&cinfo); + + while (cinfo.output_scanline < cinfo.output_height) + { + jpeg_read_scanlines(&cinfo, (JSAMPROW *)&in, (JDIMENSION)1); + + if (psjpeg && cinfo.output_components == 4) + { + /* + * Invert CMYK data from Photoshop... + */ + + cups_ib_t *ptr; /* Pointer into buffer */ + int i; /* Looping var */ + + + for (ptr = in, i = img->xsize * 4; i > 0; i --, ptr ++) + *ptr = 255 - *ptr; + } + + if ((saturation != 100 || hue != 0) && cinfo.output_components == 3) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + if ((img->colorspace == CUPS_IMAGE_WHITE && cinfo.out_color_space == JCS_GRAYSCALE) || + (img->colorspace == CUPS_IMAGE_CMYK && cinfo.out_color_space == JCS_CMYK)) + { +#ifdef DEBUG + int i, j; + cups_ib_t *ptr; + + + fputs("DEBUG: Direct Data...\n", stderr); + + fputs("DEBUG:", stderr); + + for (i = 0, ptr = in; i < img->xsize; i ++) + { + putc(' ', stderr); + for (j = 0; j < cinfo.output_components; j ++, ptr ++) + fprintf(stderr, "%02X", *ptr & 255); + } + + putc('\n', stderr); +#endif /* DEBUG */ + + if (lut) + cupsImageLut(in, img->xsize * cupsImageGetDepth(img), lut); + + _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, in); + } + else if (cinfo.out_color_space == JCS_GRAYSCALE) + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); + + _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); + } + else if (cinfo.out_color_space == JCS_RGB) + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); + + _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); + } + else /* JCS_CMYK */ + { + fputs("DEBUG: JCS_CMYK\n", stderr); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageCMYKToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageCMYKToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageCMYKToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageCMYKToRGB(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * cupsImageGetDepth(img), lut); + + _cupsImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out); + } + } + + free(in); + free(out); + + jpeg_finish_decompress(&cinfo); + jpeg_destroy_decompress(&cinfo); + + fclose(fp); + + return (0); +} +#endif /* HAVE_LIBJPEG */ + + +/* + * End of "$Id: image-jpeg.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-photocd.c b/filter/image-photocd.c new file mode 100644 index 0000000..625b0a2 --- /dev/null +++ b/filter/image-photocd.c @@ -0,0 +1,333 @@ +/* + * "$Id: image-photocd.c 9771 2011-05-12 05:21:56Z mike $" + * + * PhotoCD routines for CUPS. + * + * PhotoCD support is currently limited to the 768x512 base image, which + * is only YCC encoded. Support for the higher resolution images will + * require a lot of extra code... + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadPhotoCD() - Read a PhotoCD image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * '_cupsImageReadPhotoCD()' - Read a PhotoCD image file. + */ + +int /* O - Read status */ +_cupsImageReadPhotoCD( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int x, y; /* Looping vars */ + int xdir, /* X direction */ + xstart; /* X starting point */ + int bpp; /* Bytes per pixel */ + int pass; /* Pass number */ + int rotation; /* 0 for 768x512, 1 for 512x768 */ + int temp, /* Adjusted luminance */ + temp2, /* Red, green, and blue values */ + cb, cr; /* Adjusted chroma values */ + cups_ib_t *in, /* Input (YCC) pixels */ + *iy, /* Luminance */ + *icb, /* Blue chroma */ + *icr, /* Red chroma */ + *rgb, /* RGB */ + *rgbptr, /* Pointer into RGB data */ + *out; /* Output pixels */ + + + (void)secondary; + + /* + * Get the image orientation... + */ + + fseek(fp, 72, SEEK_SET); + rotation = (getc(fp) & 63) != 8; + + /* + * Seek to the start of the base image... + */ + + fseek(fp, 0x30000, SEEK_SET); + + /* + * Allocate and initialize... + */ + + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + img->xppi = 128; + img->yppi = 128; + + if (rotation) + { + img->xsize = 512; + img->ysize = 768; + } + else + { + img->xsize = 768; + img->ysize = 512; + } + + cupsImageSetMaxTiles(img, 0); + + bpp = cupsImageGetDepth(img); + + if ((in = malloc(768 * 3)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + return (1); + } + + if ((out = malloc(768 * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + return (1); + } + + if (bpp > 1) + { + if ((rgb = malloc(768 * 3)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + free(out); + return (1); + } + } + else + rgb = NULL; + + if (rotation) + { + xstart = 767 * bpp; + xdir = -2 * bpp; + } + else + { + xstart = 0; + xdir = 0; + } + + /* + * Read the image file... + */ + + for (y = 0; y < 512; y += 2) + { + /* + * Grab the next two scanlines: + * + * YYYYYYYYYYYYYYY... + * YYYYYYYYYYYYYYY... + * CbCbCb...CrCrCr... + */ + + if (fread(in, 1, 768 * 3, fp) < (768 * 3)) + { + /* + * Couldn't read a row of data - return an error! + */ + + free(in); + free(out); + + if (bpp > 1) + free(rgb); + + return (-1); + } + + /* + * Process the two scanlines... + */ + + for (pass = 0, iy = in; pass < 2; pass ++) + { + if (bpp == 1) + { + /* + * Just extract the luminance channel from the line and put it + * in the image... + */ + + if (primary == CUPS_IMAGE_BLACK) + { + if (rotation) + { + for (rgbptr = out + xstart, x = 0; x < 768; x ++) + *rgbptr-- = 255 - *iy++; + + if (lut) + cupsImageLut(out, 768, lut); + + _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); + } + else + { + cupsImageWhiteToBlack(iy, out, 768); + + if (lut) + cupsImageLut(out, 768, lut); + + _cupsImagePutRow(img, 0, y + pass, 768, out); + iy += 768; + } + } + else if (rotation) + { + for (rgbptr = out + xstart, x = 0; x < 768; x ++) + *rgbptr-- = 255 - *iy++; + + if (lut) + cupsImageLut(out, 768, lut); + + _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); + } + else + { + if (lut) + cupsImageLut(iy, 768, lut); + + _cupsImagePutRow(img, 0, y + pass, 768, iy); + iy += 768; + } + } + else + { + /* + * Convert YCbCr to RGB... While every pixel gets a luminance + * value, adjacent pixels share chroma information. + */ + + cb = cr = 0.0f; + + for (x = 0, rgbptr = rgb + xstart, icb = in + 1536, icr = in + 1920; + x < 768; + x ++, iy ++, rgbptr += xdir) + { + if (!(x & 1)) + { + cb = (float)(*icb - 156); + cr = (float)(*icr - 137); + } + + temp = 92241 * (*iy); + + temp2 = (temp + 86706 * cr) / 65536; + if (temp2 < 0) + *rgbptr++ = 0; + else if (temp2 > 255) + *rgbptr++ = 255; + else + *rgbptr++ = temp2; + + temp2 = (temp - 25914 * cb - 44166 * cr) / 65536; + if (temp2 < 0) + *rgbptr++ = 0; + else if (temp2 > 255) + *rgbptr++ = 255; + else + *rgbptr++ = temp2; + + temp2 = (temp + 133434 * cb) / 65536; + if (temp2 < 0) + *rgbptr++ = 0; + else if (temp2 > 255) + *rgbptr++ = 255; + else + *rgbptr++ = temp2; + + if (x & 1) + { + icb ++; + icr ++; + } + } + + /* + * Adjust the hue and saturation if needed... + */ + + if (saturation != 100 || hue != 0) + cupsImageRGBAdjust(rgb, 768, saturation, hue); + + /* + * Then convert the RGB data to the appropriate colorspace and + * put it in the image... + */ + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(rgb, out, 768); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(rgb, out, 768); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(rgb, out, 768); + break; + } + + if (lut) + cupsImageLut(out, 768 * bpp, lut); + + if (rotation) + _cupsImagePutCol(img, 511 - y - pass, 0, 768, out); + else + _cupsImagePutRow(img, 0, y + pass, 768, out); + } + } + } + + /* + * Free memory and return... + */ + + free(in); + free(out); + if (bpp > 1) + free(rgb); + + return (0); +} + + +/* + * End of "$Id: image-photocd.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-pix.c b/filter/image-pix.c new file mode 100644 index 0000000..e7b75b0 --- /dev/null +++ b/filter/image-pix.c @@ -0,0 +1,240 @@ +/* + * "$Id: image-pix.c 9771 2011-05-12 05:21:56Z mike $" + * + * Alias PIX image routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadPIX() - Read a PIX image file. + * read_short() - Read a 16-bit integer. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Local functions... + */ + +static short read_short(FILE *fp); + + +/* + * '_cupsImageReadPIX()' - Read a PIX image file. + */ + +int /* O - Read status */ +_cupsImageReadPIX( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + short width, /* Width of image */ + height, /* Height of image */ + depth; /* Depth of image (bits) */ + int count, /* Repetition count */ + bpp, /* Bytes per pixel */ + x, y; /* Looping vars */ + cups_ib_t r, g, b; /* Red, green/gray, blue values */ + cups_ib_t *in, /* Input pixels */ + *out, /* Output pixels */ + *ptr; /* Pointer into pixels */ + + + /* + * Get the image dimensions and setup the image... + */ + + width = read_short(fp); + height = read_short(fp); + read_short(fp); + read_short(fp); + depth = read_short(fp); + + /* + * Check the dimensions of the image. Since the short values used for the + * width and height cannot exceed CUPS_IMAGE_MAX_WIDTH or + * CUPS_IMAGE_MAX_HEIGHT, we just need to verify they are positive integers. + */ + + if (width <= 0 || height <= 0 || + (depth != 8 && depth != 24)) + { + fprintf(stderr, "DEBUG: Bad PIX image dimensions %dx%dx%d\n", + width, height, depth); + fclose(fp); + return (1); + } + + if (depth == 8) + img->colorspace = secondary; + else + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + + img->xsize = width; + img->ysize = height; + + cupsImageSetMaxTiles(img, 0); + + bpp = cupsImageGetDepth(img); + + if ((in = malloc(img->xsize * (depth / 8))) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + return (1); + } + + if ((out = malloc(img->xsize * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + return (1); + } + + /* + * Read the image data... + */ + + if (depth == 8) + { + for (count = 0, y = 0, g = 0; y < img->ysize; y ++) + { + if (img->colorspace == CUPS_IMAGE_WHITE) + ptr = out; + else + ptr = in; + + for (x = img->xsize; x > 0; x --, count --) + { + if (count == 0) + { + count = getc(fp); + g = getc(fp); + } + + *ptr++ = g; + } + + if (img->colorspace != CUPS_IMAGE_WHITE) + switch (img->colorspace) + { + default : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + for (count = 0, y = 0, r = 0, g = 0, b = 0; y < img->ysize; y ++) + { + ptr = in; + + for (x = img->xsize; x > 0; x --, count --) + { + if (count == 0) + { + count = getc(fp); + b = getc(fp); + g = getc(fp); + r = getc(fp); + } + + *ptr++ = r; + *ptr++ = g; + *ptr++ = b; + } + + if (saturation != 100 || hue != 0) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + + fclose(fp); + free(in); + free(out); + + return (0); +} + + +/* + * 'read_short()' - Read a 16-bit integer. + */ + +static short /* O - Value from file */ +read_short(FILE *fp) /* I - File to read from */ +{ + int ch; /* Character from file */ + + + ch = getc(fp); + return ((ch << 8) | getc(fp)); +} + + +/* + * End of "$Id: image-pix.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-png.c b/filter/image-png.c new file mode 100644 index 0000000..e8208b4 --- /dev/null +++ b/filter/image-png.c @@ -0,0 +1,315 @@ +/* + * "$Id: image-png.c 9771 2011-05-12 05:21:56Z mike $" + * + * PNG image routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadPNG() - Read a PNG image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) +# include /* Portable Network Graphics (PNG) definitions */ + + +/* + * '_cupsImageReadPNG()' - Read a PNG image file. + */ + +int /* O - Read status */ +_cupsImageReadPNG( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int y; /* Looping var */ + png_structp pp; /* PNG read pointer */ + png_infop info; /* PNG info pointers */ + png_uint_32 width, /* Width of image */ + height; /* Height of image */ + int bit_depth, /* Bit depth */ + color_type, /* Color type */ + interlace_type, /* Interlace type */ + compression_type, /* Compression type */ + filter_type; /* Filter type */ + png_uint_32 xppm, /* X pixels per meter */ + yppm; /* Y pixels per meter */ + int bpp; /* Bytes per pixel */ + int pass, /* Current pass */ + passes; /* Number of passes required */ + cups_ib_t *in, /* Input pixels */ + *inptr, /* Pointer into pixels */ + *out; /* Output pixels */ + png_color_16 bg; /* Background color */ + + + /* + * Setup the PNG data structures... + */ + + pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + info = png_create_info_struct(pp); + + /* + * Initialize the PNG read "engine"... + */ + + png_init_io(pp, fp); + + /* + * Get the image dimensions and load the output image... + */ + + png_read_info(pp, info); + + png_get_IHDR(pp, info, &width, &height, &bit_depth, &color_type, + &interlace_type, &compression_type, &filter_type); + + fprintf(stderr, "DEBUG: PNG image: %dx%dx%d, color_type=%x (%s%s%s)\n", + (int)width, (int)height, bit_depth, color_type, + (color_type & PNG_COLOR_MASK_COLOR) ? "RGB" : "GRAYSCALE", + (color_type & PNG_COLOR_MASK_ALPHA) ? "+ALPHA" : "", + (color_type & PNG_COLOR_MASK_PALETTE) ? "+PALETTE" : ""); + + if (color_type & PNG_COLOR_MASK_PALETTE) + png_set_expand(pp); + else if (bit_depth < 8) + { + png_set_packing(pp); + png_set_expand(pp); + } + else if (bit_depth == 16) + png_set_strip_16(pp); + + if (color_type & PNG_COLOR_MASK_COLOR) + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : + primary; + else + img->colorspace = secondary; + + if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH || + height == 0 || height > CUPS_IMAGE_MAX_HEIGHT) + { + fprintf(stderr, "DEBUG: PNG image has invalid dimensions %ux%u!\n", + (unsigned)width, (unsigned)height); + fclose(fp); + return (1); + } + + img->xsize = width; + img->ysize = height; + + if ((xppm = png_get_x_pixels_per_meter(pp, info)) != 0 && + (yppm = png_get_y_pixels_per_meter(pp, info)) != 0) + { + img->xppi = (int)((float)xppm * 0.0254); + img->yppi = (int)((float)yppm * 0.0254); + + if (img->xppi == 0 || img->yppi == 0) + { + fprintf(stderr, "DEBUG: PNG image has invalid resolution %dx%d PPI\n", + img->xppi, img->yppi); + + img->xppi = img->yppi = 128; + } + } + + cupsImageSetMaxTiles(img, 0); + + passes = png_set_interlace_handling(pp); + + /* + * Handle transparency... + */ + + if (png_get_valid(pp, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(pp); + + bg.red = 65535; + bg.green = 65535; + bg.blue = 65535; + + png_set_background(pp, &bg, PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + + if (passes == 1) + { + /* + * Load one row at a time... + */ + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + in = malloc(img->xsize); + else + in = malloc(img->xsize * 3); + } + else + { + /* + * Interlaced images must be loaded all at once... + */ + + size_t bufsize; /* Size of buffer */ + + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + bufsize = img->xsize * img->ysize; + + if ((bufsize / img->xsize) != img->ysize) + { + fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", + (unsigned)width, (unsigned)height); + fclose(fp); + return (1); + } + } + else + { + bufsize = img->xsize * img->ysize * 3; + + if ((bufsize / (img->xsize * 3)) != img->ysize) + { + fprintf(stderr, "DEBUG: PNG image dimensions (%ux%u) too large!\n", + (unsigned)width, (unsigned)height); + fclose(fp); + return (1); + } + } + + in = malloc(bufsize); + } + + bpp = cupsImageGetDepth(img); + out = malloc(img->xsize * bpp); + + if (!in || !out) + { + fputs("DEBUG: Unable to allocate memory for PNG image!\n", stderr); + + if (in) + free(in); + + if (out) + free(out); + + fclose(fp); + + return (1); + } + + /* + * Read the image, interlacing as needed... + */ + + for (pass = 1; pass <= passes; pass ++) + for (inptr = in, y = 0; y < img->ysize; y ++) + { + png_read_row(pp, (png_bytep)inptr, NULL); + + if (pass == passes) + { + /* + * Output this row... + */ + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(inptr, img->xsize, saturation, hue); + + switch (img->colorspace) + { + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(inptr, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + case CUPS_IMAGE_RGB_CMYK : + cupsImageRGBToRGB(inptr, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(inptr, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(inptr, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(inptr, out, img->xsize); + break; + } + } + else + { + switch (img->colorspace) + { + case CUPS_IMAGE_WHITE : + memcpy(out, inptr, img->xsize); + break; + case CUPS_IMAGE_RGB : + case CUPS_IMAGE_RGB_CMYK : + cupsImageWhiteToRGB(inptr, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(inptr, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(inptr, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(inptr, out, img->xsize); + break; + } + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + + if (passes > 1) + { + if (color_type & PNG_COLOR_MASK_COLOR) + inptr += img->xsize * 3; + else + inptr += img->xsize; + } + } + + png_read_end(pp, info); + png_destroy_read_struct(&pp, &info, NULL); + + fclose(fp); + free(in); + free(out); + + return (0); +} +#endif /* HAVE_LIBPNG && HAVE_LIBZ */ + + +/* + * End of "$Id: image-png.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-pnm.c b/filter/image-pnm.c new file mode 100644 index 0000000..3a25d8f --- /dev/null +++ b/filter/image-pnm.c @@ -0,0 +1,320 @@ +/* + * "$Id: image-pnm.c 9771 2011-05-12 05:21:56Z mike $" + * + * Portable Any Map file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadPNM() - Read a PNM image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * '_cupsImageReadPNM()' - Read a PNM image file. + */ + +int /* O - Read status */ +_cupsImageReadPNM( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int x, y; /* Looping vars */ + int bpp; /* Bytes per pixel */ + cups_ib_t *in, /* Input pixels */ + *inptr, /* Current input pixel */ + *out, /* Output pixels */ + *outptr, /* Current output pixel */ + bit; /* Bit in input line */ + char line[255], /* Input line */ + *lineptr; /* Pointer in line */ + int format, /* Format of PNM file */ + val, /* Pixel value */ + maxval; /* Maximum pixel value */ + + + /* + * Read the file header in the format: + * + * Pformat + * # comment1 + * # comment2 + * ... + * # commentN + * width + * height + * max sample + */ + + if ((lineptr = fgets(line, sizeof(line), fp)) == NULL) + { + fputs("DEBUG: Bad PNM header!\n", stderr); + fclose(fp); + return (1); + } + + lineptr ++; + + format = atoi(lineptr); + while (isdigit(*lineptr & 255)) + lineptr ++; + + while (lineptr != NULL && img->xsize == 0) + { + if (*lineptr == '\0' || *lineptr == '#') + lineptr = fgets(line, sizeof(line), fp); + else if (isdigit(*lineptr & 255)) + { + img->xsize = atoi(lineptr); + while (isdigit(*lineptr & 255)) + lineptr ++; + } + else + lineptr ++; + } + + while (lineptr != NULL && img->ysize == 0) + { + if (*lineptr == '\0' || *lineptr == '#') + lineptr = fgets(line, sizeof(line), fp); + else if (isdigit(*lineptr & 255)) + { + img->ysize = atoi(lineptr); + while (isdigit(*lineptr & 255)) + lineptr ++; + } + else + lineptr ++; + } + + if (format != 1 && format != 4) + { + maxval = 0; + + while (lineptr != NULL && maxval == 0) + { + if (*lineptr == '\0' || *lineptr == '#') + lineptr = fgets(line, sizeof(line), fp); + else if (isdigit(*lineptr & 255)) + { + maxval = atoi(lineptr); + while (isdigit(*lineptr & 255)) + lineptr ++; + } + else + lineptr ++; + } + } + else + maxval = 1; + + if (img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || + img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT) + { + fprintf(stderr, "DEBUG: Bad PNM dimensions %dx%d!\n", + img->xsize, img->ysize); + fclose(fp); + return (1); + } + + if (maxval == 0) + { + fprintf(stderr, "DEBUG: Bad PNM max value %d!\n", maxval); + fclose(fp); + return (1); + } + + if (format == 1 || format == 2 || format == 4 || format == 5) + img->colorspace = secondary; + else + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + + cupsImageSetMaxTiles(img, 0); + + bpp = cupsImageGetDepth(img); + + if ((in = malloc(img->xsize * 3)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + return (1); + } + + if ((out = malloc(img->xsize * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + return (1); + } + + /* + * Read the image file... + */ + + for (y = 0; y < img->ysize; y ++) + { + switch (format) + { + case 1 : + for (x = img->xsize, inptr = in; x > 0; x --, inptr ++) + if (fscanf(fp, "%d", &val) == 1) + *inptr = val ? 0 : 255; + break; + + case 2 : + for (x = img->xsize, inptr = in; x > 0; x --, inptr ++) + if (fscanf(fp, "%d", &val) == 1) + *inptr = 255 * val / maxval; + break; + + case 3 : + for (x = img->xsize, inptr = in; x > 0; x --, inptr += 3) + { + if (fscanf(fp, "%d", &val) == 1) + inptr[0] = 255 * val / maxval; + if (fscanf(fp, "%d", &val) == 1) + inptr[1] = 255 * val / maxval; + if (fscanf(fp, "%d", &val) == 1) + inptr[2] = 255 * val / maxval; + } + break; + + case 4 : + fread(out, (img->xsize + 7) / 8, 1, fp); + for (x = img->xsize, inptr = in, outptr = out, bit = 128; + x > 0; + x --, inptr ++) + { + if (*outptr & bit) + *inptr = 0; + else + *inptr = 255; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + outptr ++; + } + } + break; + + case 5 : + fread(in, img->xsize, 1, fp); + break; + + case 6 : + fread(in, img->xsize, 3, fp); + break; + } + + switch (format) + { + case 1 : + case 2 : + case 4 : + case 5 : + if (img->colorspace == CUPS_IMAGE_WHITE) + { + if (lut) + cupsImageLut(in, img->xsize, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, in); + } + else + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + break; + + default : + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + break; + } + } + + free(in); + free(out); + + fclose(fp); + + return (0); +} + + +/* + * End of "$Id: image-pnm.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-private.h b/filter/image-private.h new file mode 100644 index 0000000..70a8f5c --- /dev/null +++ b/filter/image-private.h @@ -0,0 +1,220 @@ +/* + * "$Id: image-private.h 9042 2010-03-24 00:45:34Z mike $" + * + * Private image library definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_IMAGE_PRIVATE_H_ +# define _CUPS_IMAGE_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include "image.h" +# include +# include +# include +# include +# include +# ifdef WIN32 +# include +# else +# include +# endif /* WIN32 */ +# include +# include + + +/* + * Constants... + */ + +# define CUPS_IMAGE_MAX_WIDTH 0x07ffffff + /* 2^27-1 to allow for 15-channel data */ +# define CUPS_IMAGE_MAX_HEIGHT 0x3fffffff + /* 2^30-1 */ + +# define CUPS_TILE_SIZE 256 /* 256x256 pixel tiles */ +# define CUPS_TILE_MINIMUM 10 /* Minimum number of tiles */ + + +/* + * min/max/abs macros... + */ + +# ifndef max +# define max(a,b) ((a) > (b) ? (a) : (b)) +# endif /* !max */ +# ifndef min +# define min(a,b) ((a) < (b) ? (a) : (b)) +# endif /* !min */ +# ifndef abs +# define abs(a) ((a) < 0 ? -(a) : (a)) +# endif /* !abs */ + + +/* + * Types and structures... + */ + +typedef enum cups_iztype_e /**** Image zoom type ****/ +{ + CUPS_IZOOM_FAST, /* Use nearest-neighbor sampling */ + CUPS_IZOOM_NORMAL, /* Use bilinear interpolation */ + CUPS_IZOOM_BEST /* Use bicubic interpolation */ +} cups_iztype_t; + +struct cups_ic_s; + +typedef struct cups_itile_s /**** Image tile ****/ +{ + int dirty; /* True if tile is dirty */ + off_t pos; /* Position of tile on disk (-1 if not written) */ + struct cups_ic_s *ic; /* Pixel data */ +} cups_itile_t; + +typedef struct cups_ic_s /**** Image tile cache ****/ +{ + struct cups_ic_s *prev, /* Previous tile in cache */ + *next; /* Next tile in cache */ + cups_itile_t *tile; /* Tile this is attached to */ + cups_ib_t *pixels; /* Pixel data */ +} cups_ic_t; + +struct cups_image_s /**** Image file data ****/ +{ + cups_icspace_t colorspace; /* Colorspace of image */ + unsigned xsize, /* Width of image in pixels */ + ysize, /* Height of image in pixels */ + xppi, /* X resolution in pixels-per-inch */ + yppi, /* Y resolution in pixels-per-inch */ + num_ics, /* Number of cached tiles */ + max_ics; /* Maximum number of cached tiles */ + cups_itile_t **tiles; /* Tiles in image */ + cups_ic_t *first, /* First cached tile in image */ + *last; /* Last cached tile in image */ + int cachefile; /* Tile cache file */ + char cachename[256]; /* Tile cache filename */ +}; + +struct cups_izoom_s /**** Image zoom data ****/ +{ + cups_image_t *img; /* Image to zoom */ + cups_iztype_t type; /* Type of zooming */ + unsigned xorig, /* X origin */ + yorig, /* Y origin */ + width, /* Width of input area */ + height, /* Height of input area */ + depth, /* Number of bytes per pixel */ + rotated, /* Non-zero if image needs to be rotated */ + xsize, /* Width of output image */ + ysize, /* Height of output image */ + xmax, /* Maximum input image X position */ + ymax, /* Maximum input image Y position */ + xmod, /* Threshold for Bresenheim rounding */ + ymod; /* ... */ + int xstep, /* Amount to step for each pixel along X */ + xincr, + instep, /* Amount to step pixel pointer along X */ + inincr, + ystep, /* Amount to step for each pixel along Y */ + yincr, + row; /* Current row */ + cups_ib_t *rows[2], /* Horizontally scaled pixel data */ + *in; /* Unscaled input pixel data */ +}; + + +/* + * Prototypes... + */ + +extern int _cupsImagePutCol(cups_image_t *img, int x, int y, + int height, const cups_ib_t *pixels); +extern int _cupsImagePutRow(cups_image_t *img, int x, int y, + int width, const cups_ib_t *pixels); +extern int _cupsImageReadBMP(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadFPX(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadGIF(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadJPEG(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadPIX(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadPNG(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadPNM(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadPhotoCD(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadSGI(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadSunRaster(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern int _cupsImageReadTIFF(cups_image_t *img, FILE *fp, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut); +extern void _cupsImageZoomDelete(cups_izoom_t *z); +extern void _cupsImageZoomFill(cups_izoom_t *z, int iy); +extern cups_izoom_t *_cupsImageZoomNew(cups_image_t *img, int xc0, int yc0, + int xc1, int yc1, int xsize, + int ysize, int rotated, + cups_iztype_t type); + +extern int _cupsRasterExecPS(cups_page_header2_t *h, + int *preferred_bits, + const char *code); +extern void _cupsRasterAddError(const char *f, ...); +extern void _cupsRasterClearError(void); + +#endif /* !_CUPS_IMAGE_PRIVATE_H_ */ + +/* + * End of "$Id: image-private.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/filter/image-sgi.c b/filter/image-sgi.c new file mode 100644 index 0000000..b9e7fa5 --- /dev/null +++ b/filter/image-sgi.c @@ -0,0 +1,295 @@ +/* + * "$Id: image-sgi.c 9771 2011-05-12 05:21:56Z mike $" + * + * SGI image file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadSGI() - Read a SGI image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" +#include "image-sgi.h" + + +/* + * '_cupsImageReadSGI()' - Read a SGI image file. + */ + +int /* O - Read status */ +_cupsImageReadSGI( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int i, y; /* Looping vars */ + int bpp; /* Bytes per pixel */ + sgi_t *sgip; /* SGI image file */ + cups_ib_t *in, /* Input pixels */ + *inptr, /* Current input pixel */ + *out; /* Output pixels */ + unsigned short *rows[4], /* Row pointers for image data */ + *red, + *green, + *blue, + *gray, + *alpha; + + + /* + * Setup the SGI file... + */ + + sgip = sgiOpenFile(fp, SGI_READ, 0, 0, 0, 0, 0); + + /* + * Get the image dimensions and load the output image... + */ + + /* + * Check the image dimensions; since xsize and ysize are unsigned shorts, + * just check if they are 0 since they can't exceed CUPS_IMAGE_MAX_WIDTH or + * CUPS_IMAGE_MAX_HEIGHT... + */ + + if (sgip->xsize == 0 || sgip->ysize == 0 || + sgip->zsize == 0 || sgip->zsize > 4) + { + fprintf(stderr, "DEBUG: Bad SGI image dimensions %ux%ux%u!\n", + sgip->xsize, sgip->ysize, sgip->zsize); + sgiClose(sgip); + return (1); + } + + if (sgip->zsize < 3) + img->colorspace = secondary; + else + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + + img->xsize = sgip->xsize; + img->ysize = sgip->ysize; + + cupsImageSetMaxTiles(img, 0); + + bpp = cupsImageGetDepth(img); + + if ((in = malloc(img->xsize * sgip->zsize)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + sgiClose(sgip); + return (1); + } + + if ((out = malloc(img->xsize * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + sgiClose(sgip); + free(in); + return (1); + } + + if ((rows[0] = calloc(img->xsize * sgip->zsize, + sizeof(unsigned short))) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + sgiClose(sgip); + free(in); + free(out); + return (1); + } + + for (i = 1; i < sgip->zsize; i ++) + rows[i] = rows[0] + i * img->xsize; + + /* + * Read the SGI image file... + */ + + for (y = 0; y < img->ysize; y ++) + { + for (i = 0; i < sgip->zsize; i ++) + sgiGetRow(sgip, rows[i], img->ysize - 1 - y, i); + + switch (sgip->zsize) + { + case 1 : + if (sgip->bpp == 1) + for (i = img->xsize - 1, gray = rows[0], inptr = in; + i >= 0; + i --) + { + *inptr++ = *gray++; + } + else + for (i = img->xsize - 1, gray = rows[0], inptr = in; + i >= 0; + i --) + { + *inptr++ = (*gray++) / 256 + 128; + } + break; + case 2 : + if (sgip->bpp == 1) + for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in; + i >= 0; + i --) + { + *inptr++ = (*gray++) * (*alpha++) / 255; + } + else + for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in; + i >= 0; + i --) + { + *inptr++ = ((*gray++) / 256 + 128) * (*alpha++) / 32767; + } + break; + case 3 : + if (sgip->bpp == 1) + for (i = img->xsize - 1, red = rows[0], green = rows[1], + blue = rows[2], inptr = in; + i >= 0; + i --) + { + *inptr++ = *red++; + *inptr++ = *green++; + *inptr++ = *blue++; + } + else + for (i = img->xsize - 1, red = rows[0], green = rows[1], + blue = rows[2], inptr = in; + i >= 0; + i --) + { + *inptr++ = (*red++) / 256 + 128; + *inptr++ = (*green++) / 256 + 128; + *inptr++ = (*blue++) / 256 + 128; + } + break; + case 4 : + if (sgip->bpp == 1) + for (i = img->xsize - 1, red = rows[0], green = rows[1], + blue = rows[2], alpha = rows[3], inptr = in; + i >= 0; + i --) + { + *inptr++ = (*red++) * (*alpha) / 255; + *inptr++ = (*green++) * (*alpha) / 255; + *inptr++ = (*blue++) * (*alpha++) / 255; + } + else + for (i = img->xsize - 1, red = rows[0], green = rows[1], + blue = rows[2], alpha = rows[3], inptr = in; + i >= 0; + i --) + { + *inptr++ = ((*red++) / 256 + 128) * (*alpha) / 32767; + *inptr++ = ((*green++) / 256 + 128) * (*alpha) / 32767; + *inptr++ = ((*blue++) / 256 + 128) * (*alpha++) / 32767; + } + break; + } + + if (sgip->zsize < 3) + { + if (img->colorspace == CUPS_IMAGE_WHITE) + { + if (lut) + cupsImageLut(in, img->xsize, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, in); + } + else + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + case CUPS_IMAGE_RGB_CMYK : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + + free(in); + free(out); + free(rows[0]); + + sgiClose(sgip); + + return (0); +} + + +/* + * End of "$Id: image-sgi.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-sgi.h b/filter/image-sgi.h new file mode 100644 index 0000000..1637326 --- /dev/null +++ b/filter/image-sgi.h @@ -0,0 +1,86 @@ +/* + * "$Id: image-sgi.h 9771 2011-05-12 05:21:56Z mike $" + * + * SGI image file format library definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _SGI_H_ +# define _SGI_H_ + +# include +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif + + +/* + * Constants... + */ + +# define SGI_MAGIC 474 /* Magic number in image file */ + +# define SGI_READ 0 /* Read from an SGI image file */ +# define SGI_WRITE 1 /* Write to an SGI image file */ + +# define SGI_COMP_NONE 0 /* No compression */ +# define SGI_COMP_RLE 1 /* Run-length encoding */ +# define SGI_COMP_ARLE 2 /* Agressive run-length encoding */ + + +/* + * Image structure... + */ + +typedef struct +{ + FILE *file; /* Image file */ + int mode, /* File open mode */ + bpp, /* Bytes per pixel/channel */ + comp; /* Compression */ + unsigned short xsize, /* Width in pixels */ + ysize, /* Height in pixels */ + zsize; /* Number of channels */ + long firstrow, /* File offset for first row */ + nextrow, /* File offset for next row */ + **table, /* Offset table for compression */ + **length; /* Length table for compression */ + unsigned short *arle_row; /* Advanced RLE compression buffer */ + long arle_offset, /* Advanced RLE buffer offset */ + arle_length; /* Advanced RLE buffer length */ +} sgi_t; + + +/* + * Prototypes... + */ + +extern int sgiClose(sgi_t *sgip); +extern int sgiGetRow(sgi_t *sgip, unsigned short *row, int y, int z); +extern sgi_t *sgiOpen(const char *filename, int mode, int comp, int bpp, + int xsize, int ysize, int zsize); +extern sgi_t *sgiOpenFile(FILE *file, int mode, int comp, int bpp, + int xsize, int ysize, int zsize); +extern int sgiPutRow(sgi_t *sgip, unsigned short *row, int y, int z); + +# ifdef __cplusplus +} +# endif +#endif /* !_SGI_H_ */ + +/* + * End of "$Id: image-sgi.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-sgilib.c b/filter/image-sgilib.c new file mode 100644 index 0000000..826cdf2 --- /dev/null +++ b/filter/image-sgilib.c @@ -0,0 +1,890 @@ +/* + * "$Id: image-sgilib.c 9771 2011-05-12 05:21:56Z mike $" + * + * SGI image file format library routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * sgiClose() - Close an SGI image file. + * sgiGetRow() - Get a row of image data from a file. + * sgiOpen() - Open an SGI image file for reading or writing. + * sgiOpenFile() - Open an SGI image file for reading or writing. + * sgiPutRow() - Put a row of image data to a file. + * getlong() - Get a 32-bit big-endian integer. + * getshort() - Get a 16-bit big-endian integer. + * putlong() - Put a 32-bit big-endian integer. + * putshort() - Put a 16-bit big-endian integer. + * read_rle8() - Read 8-bit RLE data. + * read_rle16() - Read 16-bit RLE data. + * write_rle8() - Write 8-bit RLE data. + * write_rle16() - Write 16-bit RLE data. + */ + +#include "image-sgi.h" + + +/* + * Local functions... + */ + +static int getlong(FILE *); +static int getshort(FILE *); +static int putlong(long, FILE *); +static int putshort(unsigned short, FILE *); +static int read_rle8(FILE *, unsigned short *, int); +static int read_rle16(FILE *, unsigned short *, int); +static int write_rle8(FILE *, unsigned short *, int); +static int write_rle16(FILE *, unsigned short *, int); + + +/* + * 'sgiClose()' - Close an SGI image file. + */ + +int /* O - 0 on success, -1 on error */ +sgiClose(sgi_t *sgip) /* I - SGI image */ +{ + int i; /* Return status */ + long *offset; /* Looping var for offset table */ + + + if (sgip == NULL) + return (-1); + + if (sgip->mode == SGI_WRITE && sgip->comp != SGI_COMP_NONE) + { + /* + * Write the scanline offset table to the file... + */ + + fseek(sgip->file, 512, SEEK_SET); + + for (i = sgip->ysize * sgip->zsize, offset = sgip->table[0]; + i > 0; + i --, offset ++) + if (putlong(offset[0], sgip->file) < 0) + return (-1); + + for (i = sgip->ysize * sgip->zsize, offset = sgip->length[0]; + i > 0; + i --, offset ++) + if (putlong(offset[0], sgip->file) < 0) + return (-1); + } + + if (sgip->table != NULL) + { + free(sgip->table[0]); + free(sgip->table); + } + + if (sgip->length != NULL) + { + free(sgip->length[0]); + free(sgip->length); + } + + if (sgip->comp == SGI_COMP_ARLE) + free(sgip->arle_row); + + i = fclose(sgip->file); + free(sgip); + + return (i); +} + + +/* + * 'sgiGetRow()' - Get a row of image data from a file. + */ + +int /* O - 0 on success, -1 on error */ +sgiGetRow(sgi_t *sgip, /* I - SGI image */ + unsigned short *row, /* O - Row to read */ + int y, /* I - Line to read */ + int z) /* I - Channel to read */ +{ + int x; /* X coordinate */ + long offset; /* File offset */ + + + if (sgip == NULL || + row == NULL || + y < 0 || y >= sgip->ysize || + z < 0 || z >= sgip->zsize) + return (-1); + + switch (sgip->comp) + { + case SGI_COMP_NONE : + /* + * Seek to the image row - optimize buffering by only seeking if + * necessary... + */ + + offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp; + if (offset != ftell(sgip->file)) + fseek(sgip->file, offset, SEEK_SET); + + if (sgip->bpp == 1) + { + for (x = sgip->xsize; x > 0; x --, row ++) + *row = getc(sgip->file); + } + else + { + for (x = sgip->xsize; x > 0; x --, row ++) + *row = getshort(sgip->file); + } + break; + + case SGI_COMP_RLE : + offset = sgip->table[z][y]; + if (offset != ftell(sgip->file)) + fseek(sgip->file, offset, SEEK_SET); + + if (sgip->bpp == 1) + return (read_rle8(sgip->file, row, sgip->xsize)); + else + return (read_rle16(sgip->file, row, sgip->xsize)); + } + + return (0); +} + + +/* + * 'sgiOpen()' - Open an SGI image file for reading or writing. + */ + +sgi_t * /* O - New image */ +sgiOpen(const char *filename, /* I - File to open */ + int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */ + int comp, /* I - Type of compression */ + int bpp, /* I - Bytes per pixel */ + int xsize, /* I - Width of image in pixels */ + int ysize, /* I - Height of image in pixels */ + int zsize) /* I - Number of channels */ +{ + sgi_t *sgip; /* New SGI image file */ + FILE *file; /* Image file pointer */ + + + if (mode == SGI_READ) + file = fopen(filename, "rb"); + else + file = fopen(filename, "wb+"); + + if (file == NULL) + return (NULL); + + if ((sgip = sgiOpenFile(file, mode, comp, bpp, xsize, ysize, zsize)) == NULL) + fclose(file); + + return (sgip); +} + + +/* + * 'sgiOpenFile()' - Open an SGI image file for reading or writing. + */ + +sgi_t * /* O - New image */ +sgiOpenFile(FILE *file, /* I - File to open */ + int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */ + int comp, /* I - Type of compression */ + int bpp, /* I - Bytes per pixel */ + int xsize, /* I - Width of image in pixels */ + int ysize, /* I - Height of image in pixels */ + int zsize) /* I - Number of channels */ +{ + int i, j; /* Looping var */ + char name[80]; /* Name of file in image header */ + short magic; /* Magic number */ + sgi_t *sgip; /* New image pointer */ + + + if ((sgip = calloc(sizeof(sgi_t), 1)) == NULL) + return (NULL); + + sgip->file = file; + + switch (mode) + { + case SGI_READ : + sgip->mode = SGI_READ; + + magic = getshort(sgip->file); + if (magic != SGI_MAGIC) + { + free(sgip); + return (NULL); + } + + sgip->comp = getc(sgip->file); + sgip->bpp = getc(sgip->file); + getshort(sgip->file); /* Dimensions */ + sgip->xsize = getshort(sgip->file); + sgip->ysize = getshort(sgip->file); + sgip->zsize = getshort(sgip->file); + getlong(sgip->file); /* Minimum pixel */ + getlong(sgip->file); /* Maximum pixel */ + + if (sgip->comp) + { + /* + * This file is compressed; read the scanline tables... + */ + + fseek(sgip->file, 512, SEEK_SET); + + if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL) + { + free(sgip); + return (NULL); + } + + if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize, + sizeof(long))) == NULL) + { + free(sgip->table); + free(sgip); + return (NULL); + } + + for (i = 1; i < sgip->zsize; i ++) + sgip->table[i] = sgip->table[0] + i * sgip->ysize; + + for (i = 0; i < sgip->zsize; i ++) + for (j = 0; j < sgip->ysize; j ++) + sgip->table[i][j] = getlong(sgip->file); + } + break; + + case SGI_WRITE : + if (xsize < 1 || + ysize < 1 || + zsize < 1 || + bpp < 1 || bpp > 2 || + comp < SGI_COMP_NONE || comp > SGI_COMP_ARLE) + { + free(sgip); + return (NULL); + } + + sgip->mode = SGI_WRITE; + + putshort(SGI_MAGIC, sgip->file); + putc((sgip->comp = comp) != 0, sgip->file); + putc(sgip->bpp = bpp, sgip->file); + putshort(3, sgip->file); /* Dimensions */ + putshort(sgip->xsize = xsize, sgip->file); + putshort(sgip->ysize = ysize, sgip->file); + putshort(sgip->zsize = zsize, sgip->file); + if (bpp == 1) + { + putlong(0, sgip->file); /* Minimum pixel */ + putlong(255, sgip->file); /* Maximum pixel */ + } + else + { + putlong(-32768, sgip->file); /* Minimum pixel */ + putlong(32767, sgip->file); /* Maximum pixel */ + } + putlong(0, sgip->file); /* Reserved */ + + memset(name, 0, sizeof(name)); + fwrite(name, sizeof(name), 1, sgip->file); + + for (i = 0; i < 102; i ++) + putlong(0, sgip->file); + + switch (comp) + { + case SGI_COMP_NONE : /* No compression */ + /* + * This file is uncompressed. To avoid problems with sparse files, + * we need to write blank pixels for the entire image... + */ + + if (bpp == 1) + { + for (i = xsize * ysize * zsize; i > 0; i --) + putc(0, sgip->file); + } + else + { + for (i = xsize * ysize * zsize; i > 0; i --) + putshort(0, sgip->file); + } + break; + + case SGI_COMP_ARLE : /* Aggressive RLE */ + sgip->arle_row = calloc(xsize, sizeof(unsigned short)); + sgip->arle_offset = 0; + + case SGI_COMP_RLE : /* Run-Length Encoding */ + /* + * This file is compressed; write the (blank) scanline tables... + */ + + for (i = 2 * ysize * zsize; i > 0; i --) + putlong(0, sgip->file); + + sgip->firstrow = ftell(sgip->file); + sgip->nextrow = ftell(sgip->file); + if ((sgip->table = calloc(sgip->zsize, sizeof(long *))) == NULL) + { + free(sgip); + return (NULL); + } + + if ((sgip->table[0] = calloc(sgip->ysize * sgip->zsize, + sizeof(long))) == NULL) + { + free(sgip->table); + free(sgip); + return (NULL); + } + + for (i = 1; i < sgip->zsize; i ++) + sgip->table[i] = sgip->table[0] + i * sgip->ysize; + + if ((sgip->length = calloc(sgip->zsize, sizeof(long *))) == NULL) + { + free(sgip->table); + free(sgip); + return (NULL); + } + + if ((sgip->length[0] = calloc(sgip->ysize * sgip->zsize, + sizeof(long))) == NULL) + { + free(sgip->length); + free(sgip->table); + free(sgip); + return (NULL); + } + + for (i = 1; i < sgip->zsize; i ++) + sgip->length[i] = sgip->length[0] + i * sgip->ysize; + break; + } + break; + + default : + free(sgip); + return (NULL); + } + + return (sgip); +} + + +/* + * 'sgiPutRow()' - Put a row of image data to a file. + */ + +int /* O - 0 on success, -1 on error */ +sgiPutRow(sgi_t *sgip, /* I - SGI image */ + unsigned short *row, /* I - Row to write */ + int y, /* I - Line to write */ + int z) /* I - Channel to write */ +{ + int x; /* X coordinate */ + long offset; /* File offset */ + + + if (sgip == NULL || + row == NULL || + y < 0 || y >= sgip->ysize || + z < 0 || z >= sgip->zsize) + return (-1); + + switch (sgip->comp) + { + case SGI_COMP_NONE : + /* + * Seek to the image row - optimize buffering by only seeking if + * necessary... + */ + + offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp; + if (offset != ftell(sgip->file)) + fseek(sgip->file, offset, SEEK_SET); + + if (sgip->bpp == 1) + { + for (x = sgip->xsize; x > 0; x --, row ++) + putc(*row, sgip->file); + } + else + { + for (x = sgip->xsize; x > 0; x --, row ++) + putshort(*row, sgip->file); + } + break; + + case SGI_COMP_ARLE : + if (sgip->table[z][y] != 0) + return (-1); + + /* + * First check the last row written... + */ + + if (sgip->arle_offset > 0) + { + for (x = 0; x < sgip->xsize; x ++) + if (row[x] != sgip->arle_row[x]) + break; + + if (x == sgip->xsize) + { + sgip->table[z][y] = sgip->arle_offset; + sgip->length[z][y] = sgip->arle_length; + return (0); + } + } + + /* + * If that didn't match, search all the previous rows... + */ + + fseek(sgip->file, sgip->firstrow, SEEK_SET); + + if (sgip->bpp == 1) + { + for (;;) + { + sgip->arle_offset = ftell(sgip->file); + if ((sgip->arle_length = read_rle8(sgip->file, sgip->arle_row, sgip->xsize)) < 0) + { + x = 0; + break; + } + + if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0) + { + x = sgip->xsize; + break; + } + } + } + else + { + for (;;) + { + sgip->arle_offset = ftell(sgip->file); + if ((sgip->arle_length = read_rle16(sgip->file, sgip->arle_row, sgip->xsize)) < 0) + { + x = 0; + break; + } + + if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0) + { + x = sgip->xsize; + break; + } + } + } + + if (x == sgip->xsize) + { + sgip->table[z][y] = sgip->arle_offset; + sgip->length[z][y] = sgip->arle_length; + return (0); + } + else + fseek(sgip->file, 0, SEEK_END); /* Clear EOF */ + + case SGI_COMP_RLE : + if (sgip->table[z][y] != 0) + return (-1); + + offset = sgip->table[z][y] = sgip->nextrow; + + if (offset != ftell(sgip->file)) + fseek(sgip->file, offset, SEEK_SET); + + if (sgip->bpp == 1) + x = write_rle8(sgip->file, row, sgip->xsize); + else + x = write_rle16(sgip->file, row, sgip->xsize); + + if (sgip->comp == SGI_COMP_ARLE) + { + sgip->arle_offset = offset; + sgip->arle_length = x; + memcpy(sgip->arle_row, row, sgip->xsize * sizeof(unsigned short)); + } + + sgip->nextrow = ftell(sgip->file); + sgip->length[z][y] = x; + + return (x); + } + + return (0); +} + + +/* + * 'getlong()' - Get a 32-bit big-endian integer. + */ + +static int /* O - Long value */ +getlong(FILE *fp) /* I - File to read from */ +{ + unsigned char b[4]; /* Bytes from file */ + + + fread(b, 4, 1, fp); + return ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]); +} + + +/* + * 'getshort()' - Get a 16-bit big-endian integer. + */ + +static int /* O - Short value */ +getshort(FILE *fp) /* I - File to read from */ +{ + unsigned char b[2]; /* Bytes from file */ + + + fread(b, 2, 1, fp); + return ((b[0] << 8) | b[1]); +} + + +/* + * 'putlong()' - Put a 32-bit big-endian integer. + */ + +static int /* O - 0 on success, -1 on error */ +putlong(long n, /* I - Long to write */ + FILE *fp) /* I - File to write to */ +{ + if (putc(n >> 24, fp) == EOF) + return (EOF); + if (putc(n >> 16, fp) == EOF) + return (EOF); + if (putc(n >> 8, fp) == EOF) + return (EOF); + if (putc(n, fp) == EOF) + return (EOF); + else + return (0); +} + + +/* + * 'putshort()' - Put a 16-bit big-endian integer. + */ + +static int /* O - 0 on success, -1 on error */ +putshort(unsigned short n, /* I - Short to write */ + FILE *fp) /* I - File to write to */ +{ + if (putc(n >> 8, fp) == EOF) + return (EOF); + if (putc(n, fp) == EOF) + return (EOF); + else + return (0); +} + + +/* + * 'read_rle8()' - Read 8-bit RLE data. + */ + +static int /* O - Value on success, -1 on error */ +read_rle8(FILE *fp, /* I - File to read from */ + unsigned short *row, /* O - Data */ + int xsize) /* I - Width of data in pixels */ +{ + int i, /* Looping var */ + ch, /* Current character */ + count, /* RLE count */ + length; /* Number of bytes read... */ + + + length = 0; + + while (xsize > 0) + { + if ((ch = getc(fp)) == EOF) + return (-1); + length ++; + + count = ch & 127; + if (count == 0) + break; + + if (ch & 128) + { + for (i = 0; i < count; i ++, row ++, xsize --, length ++) + if (xsize > 0) + *row = getc(fp); + } + else + { + ch = getc(fp); + length ++; + for (i = 0; i < count && xsize > 0; i ++, row ++, xsize --) + *row = ch; + } + } + + return (xsize > 0 ? -1 : length); +} + + +/* + * 'read_rle16()' - Read 16-bit RLE data. + */ + +static int /* O - Value on success, -1 on error */ +read_rle16(FILE *fp, /* I - File to read from */ + unsigned short *row, /* O - Data */ + int xsize) /* I - Width of data in pixels */ +{ + int i, /* Looping var */ + ch, /* Current character */ + count, /* RLE count */ + length; /* Number of bytes read... */ + + + length = 0; + + while (xsize > 0) + { + if ((ch = getshort(fp)) == EOF) + return (-1); + length ++; + + count = ch & 127; + if (count == 0) + break; + + if (ch & 128) + { + for (i = 0; i < count; i ++, row ++, xsize --, length ++) + if (xsize > 0) + *row = getshort(fp); + } + else + { + ch = getshort(fp); + length ++; + for (i = 0; i < count && xsize > 0; i ++, row ++, xsize --) + *row = ch; + } + } + + return (xsize > 0 ? -1 : length * 2); +} + + +/* + * 'write_rle8()' - Write 8-bit RLE data. + */ + +static int /* O - Length on success, -1 on error */ +write_rle8(FILE *fp, /* I - File to write to */ + unsigned short *row, /* I - Data */ + int xsize) /* I - Width of data in pixels */ +{ + int length, /* Length in bytes */ + count, /* Number of repeating pixels */ + i, /* Looping var */ + x; /* Current column */ + unsigned short *start, /* Start of current sequence */ + repeat; /* Repeated pixel */ + + + for (x = xsize, length = 0; x > 0;) + { + start = row; + row += 2; + x -= 2; + + while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0])) + { + row ++; + x --; + } + + row -= 2; + x += 2; + + count = row - start; + while (count > 0) + { + i = count > 126 ? 126 : count; + count -= i; + + if (putc(128 | i, fp) == EOF) + return (-1); + length ++; + + while (i > 0) + { + if (putc(*start, fp) == EOF) + return (-1); + start ++; + i --; + length ++; + } + } + + if (x <= 0) + break; + + start = row; + repeat = row[0]; + + row ++; + x --; + + while (x > 0 && *row == repeat) + { + row ++; + x --; + } + + count = row - start; + while (count > 0) + { + i = count > 126 ? 126 : count; + count -= i; + + if (putc(i, fp) == EOF) + return (-1); + length ++; + + if (putc(repeat, fp) == EOF) + return (-1); + length ++; + } + } + + length ++; + + if (putc(0, fp) == EOF) + return (-1); + else + return (length); +} + + +/* + * 'write_rle16()' - Write 16-bit RLE data. + */ + +static int /* O - Length in words */ +write_rle16(FILE *fp, /* I - File to write to */ + unsigned short *row, /* I - Data */ + int xsize) /* I - Width of data in pixels */ +{ + int length, /* Length in words */ + count, /* Number of repeating pixels */ + i, /* Looping var */ + x; /* Current column */ + unsigned short *start, /* Start of current sequence */ + repeat; /* Repeated pixel */ + + + for (x = xsize, length = 0; x > 0;) + { + start = row; + row += 2; + x -= 2; + + while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0])) + { + row ++; + x --; + } + + row -= 2; + x += 2; + + count = row - start; + while (count > 0) + { + i = count > 126 ? 126 : count; + count -= i; + + if (putshort(128 | i, fp) == EOF) + return (-1); + length ++; + + while (i > 0) + { + if (putshort(*start, fp) == EOF) + return (-1); + start ++; + i --; + length ++; + } + } + + if (x <= 0) + break; + + start = row; + repeat = row[0]; + + row ++; + x --; + + while (x > 0 && *row == repeat) + { + row ++; + x --; + } + + count = row - start; + while (count > 0) + { + i = count > 126 ? 126 : count; + count -= i; + + if (putshort(i, fp) == EOF) + return (-1); + length ++; + + if (putshort(repeat, fp) == EOF) + return (-1); + length ++; + } + } + + length ++; + + if (putshort(0, fp) == EOF) + return (-1); + else + return (2 * length); +} + + +/* + * End of "$Id: image-sgilib.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-sun.c b/filter/image-sun.c new file mode 100644 index 0000000..9b7db48 --- /dev/null +++ b/filter/image-sun.c @@ -0,0 +1,407 @@ +/* + * "$Id: image-sun.c 9771 2011-05-12 05:21:56Z mike $" + * + * Sun Raster image file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadSunRaster() - Read a SunRaster image file. + * read_unsigned() - Read a 32-bit unsigned integer. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +#define RAS_MAGIC 0x59a66a95 + + /* Sun supported ras_type's */ +#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */ +#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */ +#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */ +#define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */ +#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */ + + /* Sun registered ras_maptype's */ +#define RMT_RAW 2 + /* Sun supported ras_maptype's */ +#define RMT_NONE 0 /* ras_maplength is expected to be 0 */ +#define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */ + +#define RAS_RLE 0x80 + +/* + * NOTES: + * Each line of the image is rounded out to a multiple of 16 bits. + * This corresponds to the rounding convention used by the memory pixrect + * package (/usr/include/pixrect/memvar.h) of the SunWindows system. + * The ras_encoding field (always set to 0 by Sun's supported software) + * was renamed to ras_length in release 2.0. As a result, rasterfiles + * of type 0 generated by the old software claim to have 0 length; for + * compatibility, code reading rasterfiles must be prepared to compute the + * true length from the width, height, and depth fields. + */ + +/* + * Local functions... + */ + +static unsigned read_unsigned(FILE *fp); + + +/* + * '_cupsImageReadSunRaster()' - Read a SunRaster image file. + */ + +int /* O - Read status */ +_cupsImageReadSunRaster( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + int i, x, y, + bpp, /* Bytes per pixel */ + scanwidth, + run_count, + run_value; + cups_ib_t *in, + *out, + *scanline, + *scanptr, + *p, + bit; + unsigned ras_depth, /* depth (1, 8, or 24 bits) of pixel */ + ras_type, /* type of file; see RT_* below */ + ras_maplength; /* length (bytes) of following map */ + unsigned char cmap[3][256]; /* colormap */ + + + /* + * Read the header; we already know that this is a raster file (cupsImageOpen + * checks this) so we don't need to check the magic number again. + */ + + fputs("DEBUG: Reading Sun Raster image...\n", stderr); + + read_unsigned(fp); /* Skip magic */ + img->xsize = read_unsigned(fp); + img->ysize = read_unsigned(fp); + ras_depth = read_unsigned(fp); + /* ras_length */read_unsigned(fp); + ras_type = read_unsigned(fp); + /* ras_maptype*/read_unsigned(fp); + ras_maplength = read_unsigned(fp); + + fprintf(stderr, "DEBUG: ras_width=%d, ras_height=%d, ras_depth=%d, ras_type=%d, ras_maplength=%d\n", + img->xsize, img->ysize, ras_depth, ras_type, ras_maplength); + + if (ras_maplength > 768 || + img->xsize == 0 || img->xsize > CUPS_IMAGE_MAX_WIDTH || + img->ysize == 0 || img->ysize > CUPS_IMAGE_MAX_HEIGHT || + ras_depth == 0 || ras_depth > 32) + { + fputs("DEBUG: Raster image cannot be loaded!\n", stderr); + return (1); + } + + if (ras_maplength > 0) + { + memset(cmap[0], 255, sizeof(cmap[0])); + memset(cmap[1], 0, sizeof(cmap[1])); + memset(cmap[2], 0, sizeof(cmap[2])); + + fread(cmap[0], 1, ras_maplength / 3, fp); + fread(cmap[1], 1, ras_maplength / 3, fp); + fread(cmap[2], 1, ras_maplength / 3, fp); + } + + /* + * Compute the width of each line and allocate memory as needed... + */ + + scanwidth = (img->xsize * ras_depth + 7) / 8; + if (scanwidth & 1) + scanwidth ++; + + if (ras_depth < 24 && ras_maplength == 0) + { + img->colorspace = secondary; + in = malloc(img->xsize + 1); + } + else + { + img->colorspace = (primary == CUPS_IMAGE_RGB_CMYK) ? CUPS_IMAGE_RGB : primary; + in = malloc(img->xsize * 3 + 1); + } + + if (!in) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + return (1); + } + + bpp = cupsImageGetDepth(img); + + if ((out = malloc(img->xsize * bpp)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + return (1); + } + + if ((scanline = malloc(scanwidth)) == NULL) + { + fputs("DEBUG: Unable to allocate memory!\n", stderr); + fclose(fp); + free(in); + free(out); + return (1); + } + + run_count = 0; + run_value = 0; + + fprintf(stderr, "DEBUG: bpp=%d, scanwidth=%d\n", bpp, scanwidth); + + for (y = 0; y < img->ysize; y ++) + { + if ((ras_depth != 8 && ras_depth != 24) || ras_maplength > 0) + p = scanline; + else + p = in; + + if (ras_type != RT_BYTE_ENCODED) + fread(p, scanwidth, 1, fp); + else + { + for (i = scanwidth; i > 0; i --, p ++) + { + if (run_count > 0) + { + *p = run_value; + run_count --; + } + else + { + run_value = getc(fp); + + if (run_value == RAS_RLE) + { + run_count = getc(fp); + if (run_count == 0) + *p = RAS_RLE; + else + run_value = *p = getc(fp); + } + else + *p = run_value; + } + } + } + + if (ras_depth == 1 && ras_maplength == 0) + { + /* + * 1-bit B&W image... + */ + + for (x = img->xsize, bit = 128, scanptr = scanline, p = in; + x > 0; + x --, p ++) + { + if (*scanptr & bit) + *p = 255; + else + *p = 0; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (ras_depth == 1) + { + /* + * 1-bit colormapped image... + */ + + for (x = img->xsize, bit = 128, scanptr = scanline, p = in; + x > 0; + x --) + { + if (*scanptr & bit) + { + *p++ = cmap[0][1]; + *p++ = cmap[1][1]; + *p++ = cmap[2][1]; + } + else + { + *p++ = cmap[0][0]; + *p++ = cmap[1][0]; + *p++ = cmap[2][0]; + } + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (ras_depth == 8 && ras_maplength > 0) + { + /* + * 8-bit colormapped image. + */ + + for (x = img->xsize, scanptr = scanline, p = in; + x > 0; + x --) + { + *p++ = cmap[0][*scanptr]; + *p++ = cmap[1][*scanptr]; + *p++ = cmap[2][*scanptr++]; + } + } + else if (ras_depth == 24 && ras_type != RT_FORMAT_RGB) + { + /* + * Convert BGR to RGB... + */ + + for (x = img->xsize, scanptr = scanline, p = in; + x > 0; + x --, scanptr += 3) + { + *p++ = scanptr[2]; + *p++ = scanptr[1]; + *p++ = scanptr[0]; + } + } + + if (ras_depth <= 8 && ras_maplength == 0) + { + if (img->colorspace == CUPS_IMAGE_WHITE) + { + if (lut) + cupsImageLut(in, img->xsize, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, in); + } + else + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + + free(scanline); + free(in); + free(out); + + fclose(fp); + + return (0); +} + + +/* + * 'read_unsigned()' - Read a 32-bit unsigned integer. + */ + +static unsigned /* O - Integer from file */ +read_unsigned(FILE *fp) /* I - File to read from */ +{ + unsigned v; /* Integer from file */ + + + v = getc(fp); + v = (v << 8) | getc(fp); + v = (v << 8) | getc(fp); + v = (v << 8) | getc(fp); + + return (v); +} + + +/* + * End of "$Id: image-sun.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-tiff.c b/filter/image-tiff.c new file mode 100644 index 0000000..e8893d2 --- /dev/null +++ b/filter/image-tiff.c @@ -0,0 +1,1715 @@ +/* + * "$Id: image-tiff.c 9771 2011-05-12 05:21:56Z mike $" + * + * TIFF file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageReadTIFF() - Read a TIFF image file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + +#ifdef HAVE_LIBTIFF +# include /* TIFF image definitions */ +# include +# include + + +/* + * '_cupsImageReadTIFF()' - Read a TIFF image file. + */ + +int /* O - Read status */ +_cupsImageReadTIFF( + cups_image_t *img, /* IO - cupsImage */ + FILE *fp, /* I - cupsImage file */ + cups_icspace_t primary, /* I - Primary choice for colorspace */ + cups_icspace_t secondary, /* I - Secondary choice for colorspace */ + int saturation, /* I - Color saturation (%) */ + int hue, /* I - Color hue (degrees) */ + const cups_ib_t *lut) /* I - Lookup table for gamma/brightness */ +{ + TIFF *tif; /* TIFF file */ + uint32 width, height; /* Size of image */ + uint16 photometric, /* Colorspace */ + compression, /* Type of compression */ + orientation, /* Orientation */ + resunit, /* Units for resolution */ + samples, /* Number of samples/pixel */ + bits, /* Number of bits/pixel */ + inkset, /* Ink set for color separations */ + numinks; /* Number of inks in set */ + float xres, /* Horizontal resolution */ + yres; /* Vertical resolution */ + uint16 *redcmap, /* Red colormap information */ + *greencmap, /* Green colormap information */ + *bluecmap; /* Blue colormap information */ + int c, /* Color index */ + num_colors, /* Number of colors */ + bpp, /* Bytes per pixel */ + x, y, /* Current x & y */ + row, /* Current row in image */ + xstart, ystart, /* Starting x & y */ + xdir, ydir, /* X & y direction */ + xcount, ycount, /* X & Y counters */ + pstep, /* Pixel step (= bpp or -2 * bpp) */ + scanwidth, /* Width of scanline */ + r, g, b, k, /* Red, green, blue, and black values */ + alpha; /* cupsImage includes alpha? */ + cups_ib_t *in, /* Input buffer */ + *out, /* Output buffer */ + *p, /* Pointer into buffer */ + *scanline, /* Scanline buffer */ + *scanptr, /* Pointer into scanline buffer */ + bit, /* Current bit */ + pixel, /* Current pixel */ + zero, /* Zero value (bitmaps) */ + one; /* One value (bitmaps) */ + + + /* + * Open the TIFF file and get the required parameters... + */ + + lseek(fileno(fp), 0, SEEK_SET); /* Work around "feature" in some stdio's */ + + if ((tif = TIFFFdOpen(fileno(fp), "", "r")) == NULL) + { + fputs("DEBUG: TIFFFdOpen() failed!\n", stderr); + fclose(fp); + return (-1); + } + + if (!TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width)) + { + fputs("DEBUG: No image width tag in the file!\n", stderr); + TIFFClose(tif); + fclose(fp); + return (-1); + } + + if (!TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height)) + { + fputs("DEBUG: No image height tag in the file!\n", stderr); + TIFFClose(tif); + fclose(fp); + return (-1); + } + + if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) + { + fputs("DEBUG: No photometric tag in the file!\n", stderr); + TIFFClose(tif); + fclose(fp); + return (-1); + } + + if (!TIFFGetField(tif, TIFFTAG_COMPRESSION, &compression)) + { + fputs("DEBUG: No compression tag in the file!\n", stderr); + TIFFClose(tif); + fclose(fp); + return (-1); + } + + if (!TIFFGetField(tif, TIFFTAG_SAMPLESPERPIXEL, &samples)) + samples = 1; + + if (!TIFFGetField(tif, TIFFTAG_BITSPERSAMPLE, &bits)) + bits = 1; + + /* + * Get the image orientation... + */ + + if (!TIFFGetField(tif, TIFFTAG_ORIENTATION, &orientation)) + orientation = 0; + + /* + * Get the image resolution... + */ + + if (TIFFGetField(tif, TIFFTAG_XRESOLUTION, &xres) && + TIFFGetField(tif, TIFFTAG_YRESOLUTION, &yres) && + TIFFGetField(tif, TIFFTAG_RESOLUTIONUNIT, &resunit)) + { + if (resunit == RESUNIT_INCH) + { + img->xppi = xres; + img->yppi = yres; + } + else if (resunit == RESUNIT_CENTIMETER) + { + img->xppi = xres * 2.54; + img->yppi = yres * 2.54; + } + else + { + img->xppi = 128; + img->yppi = 128; + } + + if (img->xppi == 0 || img->yppi == 0) + { + fputs("DEBUG: Bad TIFF resolution.\n", stderr); + img->xppi = img->yppi = 128; + } + + fprintf(stderr, "DEBUG: TIFF resolution = %fx%f, units=%d\n", + xres, yres, resunit); + fprintf(stderr, "DEBUG: Stored resolution = %dx%d PPI\n", + img->xppi, img->yppi); + } + + /* + * See if the image has an alpha channel... + */ + + if (samples == 2 || (samples == 4 && photometric == PHOTOMETRIC_RGB)) + alpha = 1; + else + alpha = 0; + + /* + * Check the size of the image... + */ + + if (width == 0 || width > CUPS_IMAGE_MAX_WIDTH || + height == 0 || height > CUPS_IMAGE_MAX_HEIGHT || + (bits != 1 && bits != 2 && bits != 4 && bits != 8) || + samples < 1 || samples > 4) + { + fprintf(stderr, "DEBUG: Bad TIFF dimensions %ux%ux%ux%u!\n", + (unsigned)width, (unsigned)height, (unsigned)bits, + (unsigned)samples); + TIFFClose(tif); + fclose(fp); + return (1); + } + + /* + * Setup the image size and colorspace... + */ + + img->xsize = width; + img->ysize = height; + if (photometric == PHOTOMETRIC_MINISBLACK || + photometric == PHOTOMETRIC_MINISWHITE) + img->colorspace = secondary; + else if (photometric == PHOTOMETRIC_SEPARATED && primary == CUPS_IMAGE_RGB_CMYK) + img->colorspace = CUPS_IMAGE_CMYK; + else if (primary == CUPS_IMAGE_RGB_CMYK) + img->colorspace = CUPS_IMAGE_RGB; + else + img->colorspace = primary; + + fprintf(stderr, "DEBUG: img->colorspace = %d\n", img->colorspace); + + bpp = cupsImageGetDepth(img); + + cupsImageSetMaxTiles(img, 0); + + /* + * Set the X & Y start and direction according to the image orientation... + */ + + switch (orientation) + { + case ORIENTATION_TOPRIGHT : + fputs("DEBUG: orientation = top-right\n", stderr); + break; + case ORIENTATION_RIGHTTOP : + fputs("DEBUG: orientation = right-top\n", stderr); + break; + default : + case ORIENTATION_TOPLEFT : + fputs("DEBUG: orientation = top-left\n", stderr); + break; + case ORIENTATION_LEFTTOP : + fputs("DEBUG: orientation = left-top\n", stderr); + break; + case ORIENTATION_BOTLEFT : + fputs("DEBUG: orientation = bottom-left\n", stderr); + break; + case ORIENTATION_LEFTBOT : + fputs("DEBUG: orientation = left-bottom\n", stderr); + break; + case ORIENTATION_BOTRIGHT : + fputs("DEBUG: orientation = bottom-right\n", stderr); + break; + case ORIENTATION_RIGHTBOT : + fputs("DEBUG: orientation = right-bottom\n", stderr); + break; + } + + switch (orientation) + { + case ORIENTATION_TOPRIGHT : + case ORIENTATION_RIGHTTOP : + xstart = img->xsize - 1; + xdir = -1; + ystart = 0; + ydir = 1; + break; + default : + case ORIENTATION_TOPLEFT : + case ORIENTATION_LEFTTOP : + xstart = 0; + xdir = 1; + ystart = 0; + ydir = 1; + break; + case ORIENTATION_BOTLEFT : + case ORIENTATION_LEFTBOT : + xstart = 0; + xdir = 1; + ystart = img->ysize - 1; + ydir = -1; + break; + case ORIENTATION_BOTRIGHT : + case ORIENTATION_RIGHTBOT : + xstart = img->xsize - 1; + xdir = -1; + ystart = img->ysize - 1; + ydir = -1; + break; + } + + /* + * Allocate a scanline buffer... + */ + + scanwidth = TIFFScanlineSize(tif); + scanline = _TIFFmalloc(scanwidth); + + /* + * Allocate input and output buffers... + */ + + if (orientation < ORIENTATION_LEFTTOP) + { + if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) + pstep = xdir * 3; + else + pstep = xdir; + + in = malloc(img->xsize * 3 + 3); + out = malloc(img->xsize * bpp); + } + else + { + if (samples > 1 || photometric == PHOTOMETRIC_PALETTE) + pstep = ydir * 3; + else + pstep = ydir; + + in = malloc(img->ysize * 3 + 3); + out = malloc(img->ysize * bpp); + } + + /* + * Read the image. This is greatly complicated by the fact that TIFF + * supports literally hundreds of different colorspaces and orientations, + * each which must be handled separately... + */ + + fprintf(stderr, "DEBUG: photometric = %d\n", photometric); + fprintf(stderr, "DEBUG: compression = %d\n", compression); + + switch (photometric) + { + case PHOTOMETRIC_MINISWHITE : + case PHOTOMETRIC_MINISBLACK : + if (photometric == PHOTOMETRIC_MINISWHITE) + { + zero = 255; + one = 0; + } + else + { + zero = 0; + one = 255; + } + + if (orientation < ORIENTATION_LEFTTOP) + { + /* + * Row major order... + */ + + for (y = ystart, ycount = img->ysize, row = 0; + ycount > 0; + ycount --, y += ydir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 128; + xcount > 0; + xcount --, p += pstep) + { + if (*scanptr & bit) + *p = one; + else + *p = zero; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xc0; + xcount > 0; + xcount --, p += pstep) + { + pixel = *scanptr & bit; + while (pixel > 3) + pixel >>= 2; + *p = (255 * pixel / 3) ^ zero; + + if (bit > 3) + bit >>= 2; + else + { + bit = 0xc0; + scanptr ++; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart, bit = 0xf0; + xcount > 0; + xcount --, p += pstep) + { + if (bit == 0xf0) + { + *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; + bit = 0x0f; + } + else + { + *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; + bit = 0xf0; + scanptr ++; + } + } + } + else if (xdir < 0 || zero || alpha) + { + TIFFReadScanline(tif, scanline, row, 0); + + if (alpha) + { + if (zero) + { + for (xcount = img->xsize, p = in + xstart, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr += 2) + *p = (scanptr[1] * (255 - scanptr[0]) + + (255 - scanptr[1]) * 255) / 255; + } + else + { + for (xcount = img->xsize, p = in + xstart, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr += 2) + *p = (scanptr[1] * scanptr[0] + + (255 - scanptr[1]) * 255) / 255; + } + } + else + { + if (zero) + { + for (xcount = img->xsize, p = in + xstart, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr ++) + *p = 255 - *scanptr; + } + else + { + for (xcount = img->xsize, p = in + xstart, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr ++) + *p = *scanptr; + } + } + } + else + TIFFReadScanline(tif, in, row, 0); + + if (img->colorspace == CUPS_IMAGE_WHITE) + { + if (lut) + cupsImageLut(in, img->xsize, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, in); + } + else + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageWhiteToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + } + else + { + /* + * Column major order... + */ + + for (x = xstart, xcount = img->xsize, row = 0; + xcount > 0; + xcount --, x += xdir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 128; + ycount > 0; + ycount --, p += ydir) + { + if (*scanptr & bit) + *p = one; + else + *p = zero; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xc0; + ycount > 0; + ycount --, p += ydir) + { + pixel = *scanptr & 0xc0; + while (pixel > 3) + pixel >>= 2; + + *p = (255 * pixel / 3) ^ zero; + + if (bit > 3) + bit >>= 2; + else + { + bit = 0xc0; + scanptr ++; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart, bit = 0xf0; + ycount > 0; + ycount --, p += ydir) + { + if (bit == 0xf0) + { + *p = (255 * ((*scanptr & 0xf0) >> 4) / 15) ^ zero; + bit = 0x0f; + } + else + { + *p = (255 * (*scanptr & 0x0f) / 15) ^ zero; + bit = 0xf0; + scanptr ++; + } + } + } + else if (ydir < 0 || zero || alpha) + { + TIFFReadScanline(tif, scanline, row, 0); + + if (alpha) + { + if (zero) + { + for (ycount = img->ysize, p = in + ystart, scanptr = scanline; + ycount > 0; + ycount --, p += ydir, scanptr += 2) + *p = (scanptr[1] * (255 - scanptr[0]) + + (255 - scanptr[1]) * 255) / 255; + } + else + { + for (ycount = img->ysize, p = in + ystart, scanptr = scanline; + ycount > 0; + ycount --, p += ydir, scanptr += 2) + *p = (scanptr[1] * scanptr[0] + + (255 - scanptr[1]) * 255) / 255; + } + } + else + { + if (zero) + { + for (ycount = img->ysize, p = in + ystart, scanptr = scanline; + ycount > 0; + ycount --, p += ydir, scanptr ++) + *p = 255 - *scanptr; + } + else + { + for (ycount = img->ysize, p = in + ystart, scanptr = scanline; + ycount > 0; + ycount --, p += ydir, scanptr ++) + *p = *scanptr; + } + } + } + else + TIFFReadScanline(tif, in, row, 0); + + if (img->colorspace == CUPS_IMAGE_WHITE) + { + if (lut) + cupsImageLut(in, img->ysize, lut); + + _cupsImagePutCol(img, x, 0, img->ysize, in); + } + else + { + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_RGB : + cupsImageWhiteToRGB(in, out, img->ysize); + break; + case CUPS_IMAGE_BLACK : + cupsImageWhiteToBlack(in, out, img->ysize); + break; + case CUPS_IMAGE_CMY : + cupsImageWhiteToCMY(in, out, img->ysize); + break; + case CUPS_IMAGE_CMYK : + cupsImageWhiteToCMYK(in, out, img->ysize); + break; + } + + if (lut) + cupsImageLut(out, img->ysize * bpp, lut); + + _cupsImagePutCol(img, x, 0, img->ysize, out); + } + } + } + break; + + case PHOTOMETRIC_PALETTE : + if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &redcmap, &greencmap, &bluecmap)) + { + fputs("DEBUG: No colormap tag in the file!\n", stderr); + fclose(fp); + return (-1); + } + + num_colors = 1 << bits; + + for (c = 0; c < num_colors; c ++) + { + redcmap[c] >>= 8; + greencmap[c] >>= 8; + bluecmap[c] >>= 8; + } + + if (orientation < ORIENTATION_LEFTTOP) + { + /* + * Row major order... + */ + + for (y = ystart, ycount = img->ysize, row = 0; + ycount > 0; + ycount --, y += ydir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, + p = in + xstart * 3, bit = 128; + xcount > 0; + xcount --, p += pstep) + { + if (*scanptr & bit) + { + p[0] = redcmap[1]; + p[1] = greencmap[1]; + p[2] = bluecmap[1]; + } + else + { + p[0] = redcmap[0]; + p[1] = greencmap[0]; + p[2] = bluecmap[0]; + } + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, + p = in + xstart * 3, bit = 0xc0; + xcount > 0; + xcount --, p += pstep) + { + pixel = *scanptr & bit; + while (pixel > 3) + pixel >>= 2; + + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + + if (bit > 3) + bit >>= 2; + else + { + bit = 0xc0; + scanptr ++; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, + p = in + 3 * xstart, bit = 0xf0; + xcount > 0; + xcount --, p += pstep) + { + if (bit == 0xf0) + { + pixel = (*scanptr & 0xf0) >> 4; + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + bit = 0x0f; + } + else + { + pixel = *scanptr++ & 0x0f; + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + bit = 0xf0; + } + } + } + else + { + TIFFReadScanline(tif, scanline, row, 0); + + for (xcount = img->xsize, p = in + 3 * xstart, scanptr = scanline; + xcount > 0; + xcount --, p += pstep) + { + p[0] = redcmap[*scanptr]; + p[1] = greencmap[*scanptr]; + p[2] = bluecmap[*scanptr++]; + } + } + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + /* + * Column major order... + */ + + for (x = xstart, xcount = img->xsize, row = 0; + xcount > 0; + xcount --, x += xdir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, + p = in + 3 * ystart, bit = 128; + ycount > 0; + ycount --, p += ydir) + { + if (*scanptr & bit) + { + p[0] = redcmap[1]; + p[1] = greencmap[1]; + p[2] = bluecmap[1]; + } + else + { + p[0] = redcmap[0]; + p[1] = greencmap[0]; + p[2] = bluecmap[0]; + } + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, + p = in + 3 * ystart, bit = 0xc0; + ycount > 0; + ycount --, p += ydir) + { + pixel = *scanptr & 0xc0; + while (pixel > 3) + pixel >>= 2; + + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + + if (bit > 3) + bit >>= 2; + else + { + bit = 0xc0; + scanptr ++; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, + p = in + 3 * ystart, bit = 0xf0; + ycount > 0; + ycount --, p += ydir) + { + if (bit == 0xf0) + { + pixel = (*scanptr & 0xf0) >> 4; + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + bit = 0x0f; + } + else + { + pixel = *scanptr++ & 0x0f; + p[0] = redcmap[pixel]; + p[1] = greencmap[pixel]; + p[2] = bluecmap[pixel]; + bit = 0xf0; + } + } + } + else + { + TIFFReadScanline(tif, scanline, row, 0); + + for (ycount = img->ysize, p = in + 3 * ystart, scanptr = scanline; + ycount > 0; + ycount --, p += ydir) + { + p[0] = redcmap[*scanptr]; + p[1] = greencmap[*scanptr]; + p[2] = bluecmap[*scanptr++]; + } + } + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->ysize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->ysize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->ysize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->ysize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->ysize); + break; + } + + if (lut) + cupsImageLut(out, img->ysize * bpp, lut); + + _cupsImagePutCol(img, x, 0, img->ysize, out); + } + } + break; + + case PHOTOMETRIC_RGB : + if (orientation < ORIENTATION_LEFTTOP) + { + /* + * Row major order... + */ + + for (y = ystart, ycount = img->ysize, row = 0; + ycount > 0; + ycount --, y += ydir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; + xcount > 0; + xcount --, p += pstep) + { + if (*scanptr & bit & 0x88) + p[0] = 255; + else + p[0] = 0; + + if (*scanptr & bit & 0x44) + p[1] = 255; + else + p[1] = 0; + + if (*scanptr & bit & 0x22) + p[2] = 255; + else + p[2] = 0; + + if (bit == 0xf0) + bit = 0x0f; + else + { + bit = 0xf0; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; + xcount > 0; + xcount --, p += pstep, scanptr ++) + { + pixel = *scanptr >> 2; + p[0] = 255 * (pixel & 3) / 3; + pixel >>= 2; + p[1] = 255 * (pixel & 3) / 3; + pixel >>= 2; + p[2] = 255 * (pixel & 3) / 3; + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; + xcount > 0; + xcount -= 2, p += 2 * pstep, scanptr += 3) + { + pixel = scanptr[0]; + p[1] = 255 * (pixel & 15) / 15; + pixel >>= 4; + p[0] = 255 * (pixel & 15) / 15; + pixel = scanptr[1]; + p[2] = 255 * ((pixel >> 4) & 15) / 15; + + if (xcount > 1) + { + p[pstep + 0] = 255 * (pixel & 15) / 15; + pixel = scanptr[2]; + p[pstep + 2] = 255 * (pixel & 15) / 15; + pixel >>= 4; + p[pstep + 1] = 255 * (pixel & 15) / 15; + } + } + } + else if (xdir < 0 || alpha) + { + TIFFReadScanline(tif, scanline, row, 0); + + if (alpha) + { + for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr += 4) + { + p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + } + } + else + { + for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr += 3) + { + p[0] = scanptr[0]; + p[1] = scanptr[1]; + p[2] = scanptr[2]; + } + } + } + else + TIFFReadScanline(tif, in, row, 0); + + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * bpp, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + /* + * Column major order... + */ + + for (x = xstart, xcount = img->xsize, row = 0; + xcount > 0; + xcount --, x += xdir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3, bit = 0xf0; + ycount > 0; + ycount --, p += pstep) + { + if (*scanptr & bit & 0x88) + p[0] = 255; + else + p[0] = 0; + + if (*scanptr & bit & 0x44) + p[1] = 255; + else + p[1] = 0; + + if (*scanptr & bit & 0x22) + p[2] = 255; + else + p[2] = 0; + + if (bit == 0xf0) + bit = 0x0f; + else + { + bit = 0xf0; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; + ycount > 0; + ycount --, p += pstep, scanptr ++) + { + pixel = *scanptr >> 2; + p[0] = 255 * (pixel & 3) / 3; + pixel >>= 2; + p[1] = 255 * (pixel & 3) / 3; + pixel >>= 2; + p[2] = 255 * (pixel & 3) / 3; + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + ystart * 3; + ycount > 0; + ycount -= 2, p += 2 * pstep, scanptr += 3) + { + pixel = scanptr[0]; + p[1] = 255 * (pixel & 15) / 15; + pixel >>= 4; + p[0] = 255 * (pixel & 15) / 15; + pixel = scanptr[1]; + p[2] = 255 * ((pixel >> 4) & 15) / 15; + + if (ycount > 1) + { + p[pstep + 0] = 255 * (pixel & 15) / 15; + pixel = scanptr[2]; + p[pstep + 2] = 255 * (pixel & 15) / 15; + pixel >>= 4; + p[pstep + 1] = 255 * (pixel & 15) / 15; + } + } + } + else if (ydir < 0 || alpha) + { + TIFFReadScanline(tif, scanline, row, 0); + + if (alpha) + { + for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; + ycount > 0; + ycount --, p += pstep, scanptr += 4) + { + p[0] = (scanptr[0] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + p[1] = (scanptr[1] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + p[2] = (scanptr[2] * scanptr[3] + 255 * (255 - scanptr[3])) / 255; + } + } + else + { + for (ycount = img->ysize, p = in + ystart * 3, scanptr = scanline; + ycount > 0; + ycount --, p += pstep, scanptr += 3) + { + p[0] = scanptr[0]; + p[1] = scanptr[1]; + p[2] = scanptr[2]; + } + } + } + else + TIFFReadScanline(tif, in, row, 0); + + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->ysize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->ysize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->ysize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->ysize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->ysize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->ysize); + break; + } + + if (lut) + cupsImageLut(out, img->ysize * bpp, lut); + + _cupsImagePutCol(img, x, 0, img->ysize, out); + } + } + break; + + case PHOTOMETRIC_SEPARATED : + inkset = INKSET_CMYK; + numinks = 4; + +#ifdef TIFFTAG_NUMBEROFINKS + if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset) && + !TIFFGetField(tif, TIFFTAG_NUMBEROFINKS, &numinks)) +#else + if (!TIFFGetField(tif, TIFFTAG_INKSET, &inkset)) +#endif /* TIFFTAG_NUMBEROFINKS */ + { + fputs("WARNING: No inkset or number-of-inks tag in the file!\n", stderr); + } + + if (inkset == INKSET_CMYK || numinks == 4) + { + if (orientation < ORIENTATION_LEFTTOP) + { + /* + * Row major order... + */ + + for (y = ystart, ycount = img->ysize, row = 0; + ycount > 0; + ycount --, y += ydir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; + xcount > 0; + xcount --, p += pstep) + { + if (*scanptr & bit & 0x11) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + if (*scanptr & bit & 0x88) + p[0] = 0; + else + p[0] = 255; + + if (*scanptr & bit & 0x44) + p[1] = 0; + else + p[1] = 255; + + if (*scanptr & bit & 0x22) + p[2] = 0; + else + p[2] = 255; + } + + if (bit == 0xf0) + bit = 0x0f; + else + { + bit = 0xf0; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; + xcount > 0; + xcount --, p += pstep, scanptr ++) + { + pixel = *scanptr; + k = 255 * (pixel & 3) / 3; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + pixel >>= 2; + b = 255 - 255 * (pixel & 3) / 3 - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + + pixel >>= 2; + g = 255 - 255 * (pixel & 3) / 3 - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + pixel >>= 2; + r = 255 - 255 * (pixel & 3) / 3 - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (xcount = img->xsize, scanptr = scanline, p = in + xstart * 3; + xcount > 0; + xcount --, p += pstep, scanptr += 2) + { + pixel = scanptr[1]; + k = 255 * (pixel & 15) / 15; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + pixel >>= 4; + b = 255 - 255 * (pixel & 15) / 15 - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + + pixel = scanptr[0]; + g = 255 - 255 * (pixel & 15) / 15 - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + pixel >>= 4; + r = 255 - 255 * (pixel & 15) / 15 - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + } + } + } + else if (img->colorspace == CUPS_IMAGE_CMYK) + { + TIFFReadScanline(tif, scanline, row, 0); + _cupsImagePutRow(img, 0, y, img->xsize, scanline); + } + else + { + TIFFReadScanline(tif, scanline, row, 0); + + for (xcount = img->xsize, p = in + xstart * 3, scanptr = scanline; + xcount > 0; + xcount --, p += pstep, scanptr += 4) + { + k = scanptr[3]; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + r = 255 - scanptr[0] - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + + g = 255 - scanptr[1] - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + b = 255 - scanptr[2] - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + } + } + } + + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->xsize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->xsize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->xsize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->xsize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->xsize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->xsize); + break; + } + + if (lut) + cupsImageLut(out, img->xsize * 3, lut); + + _cupsImagePutRow(img, 0, y, img->xsize, out); + } + } + else + { + /* + * Column major order... + */ + + for (x = xstart, xcount = img->xsize, row = 0; + xcount > 0; + xcount --, x += xdir, row ++) + { + if (bits == 1) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3, bit = 0xf0; + ycount > 0; + ycount --, p += pstep) + { + if (*scanptr & bit & 0x11) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + if (*scanptr & bit & 0x88) + p[0] = 0; + else + p[0] = 255; + + if (*scanptr & bit & 0x44) + p[1] = 0; + else + p[1] = 255; + + if (*scanptr & bit & 0x22) + p[2] = 0; + else + p[2] = 255; + } + + if (bit == 0xf0) + bit = 0x0f; + else + { + bit = 0xf0; + scanptr ++; + } + } + } + else if (bits == 2) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; + ycount > 0; + ycount --, p += pstep, scanptr ++) + { + pixel = *scanptr; + k = 255 * (pixel & 3) / 3; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + pixel >>= 2; + b = 255 - 255 * (pixel & 3) / 3 - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + + pixel >>= 2; + g = 255 - 255 * (pixel & 3) / 3 - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + pixel >>= 2; + r = 255 - 255 * (pixel & 3) / 3 - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + } + } + } + else if (bits == 4) + { + TIFFReadScanline(tif, scanline, row, 0); + for (ycount = img->ysize, scanptr = scanline, p = in + xstart * 3; + ycount > 0; + ycount --, p += pstep, scanptr += 2) + { + pixel = scanptr[1]; + k = 255 * (pixel & 15) / 15; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + pixel >>= 4; + b = 255 - 255 * (pixel & 15) / 15 - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + + pixel = scanptr[0]; + g = 255 - 255 * (pixel & 15) / 15 - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + pixel >>= 4; + r = 255 - 255 * (pixel & 15) / 15 - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + } + } + } + else if (img->colorspace == CUPS_IMAGE_CMYK) + { + TIFFReadScanline(tif, scanline, row, 0); + _cupsImagePutCol(img, x, 0, img->ysize, scanline); + } + else + { + TIFFReadScanline(tif, scanline, row, 0); + + for (ycount = img->ysize, p = in + xstart * 3, scanptr = scanline; + ycount > 0; + ycount --, p += pstep, scanptr += 4) + { + k = scanptr[3]; + if (k == 255) + { + p[0] = 0; + p[1] = 0; + p[2] = 0; + } + else + { + r = 255 - scanptr[0] - k; + if (r < 0) + p[0] = 0; + else if (r < 256) + p[0] = r; + else + p[0] = 255; + + g = 255 - scanptr[1] - k; + if (g < 0) + p[1] = 0; + else if (g < 256) + p[1] = g; + else + p[1] = 255; + + b = 255 - scanptr[2] - k; + if (b < 0) + p[2] = 0; + else if (b < 256) + p[2] = b; + else + p[2] = 255; + } + } + } + + if ((saturation != 100 || hue != 0) && bpp > 1) + cupsImageRGBAdjust(in, img->ysize, saturation, hue); + + switch (img->colorspace) + { + default : + break; + + case CUPS_IMAGE_WHITE : + cupsImageRGBToWhite(in, out, img->ysize); + break; + case CUPS_IMAGE_RGB : + cupsImageRGBToRGB(in, out, img->ysize); + break; + case CUPS_IMAGE_BLACK : + cupsImageRGBToBlack(in, out, img->ysize); + break; + case CUPS_IMAGE_CMY : + cupsImageRGBToCMY(in, out, img->ysize); + break; + case CUPS_IMAGE_CMYK : + cupsImageRGBToCMYK(in, out, img->ysize); + break; + } + + if (lut) + cupsImageLut(out, img->ysize * bpp, lut); + + _cupsImagePutCol(img, x, 0, img->ysize, out); + } + } + + break; + } + + default : + _TIFFfree(scanline); + free(in); + free(out); + + TIFFClose(tif); + fputs("DEBUG: Unknown TIFF photometric value!\n", stderr); + return (-1); + } + + /* + * Free temporary buffers, close the TIFF file, and return. + */ + + _TIFFfree(scanline); + free(in); + free(out); + + TIFFClose(tif); + return (0); +} +#endif /* HAVE_LIBTIFF */ + + +/* + * End of "$Id: image-tiff.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/image-zoom.c b/filter/image-zoom.c new file mode 100644 index 0000000..823bc4e --- /dev/null +++ b/filter/image-zoom.c @@ -0,0 +1,361 @@ +/* + * "$Id: image-zoom.c 9502 2011-01-21 23:56:14Z mike $" + * + * cupsImage zoom routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * _cupsImageZoomDelete() - Free a zoom record... + * _cupsImageZoomFill() - Fill a zoom record... + * _cupsImageZoomNew() - Allocate a pixel zoom record... + * zoom_bilinear() - Fill a zoom record with image data utilizing + * bilinear interpolation. + * zoom_nearest() - Fill a zoom record quickly using nearest-neighbor + * sampling. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Local functions... + */ + +static void zoom_bilinear(cups_izoom_t *z, int iy); +static void zoom_nearest(cups_izoom_t *z, int iy); + + +/* + * '_cupsImageZoomDelete()' - Free a zoom record... + */ + +void +_cupsImageZoomDelete(cups_izoom_t *z) /* I - Zoom record to free */ +{ + free(z->rows[0]); + free(z->rows[1]); + free(z->in); + free(z); +} + + +/* + * '_cupsImageZoomFill()' - Fill a zoom record with image data utilizing bilinear + * interpolation. + */ + +void +_cupsImageZoomFill(cups_izoom_t *z, /* I - Zoom record to fill */ + int iy) /* I - Zoom image row */ +{ + switch (z->type) + { + case CUPS_IZOOM_FAST : + zoom_nearest(z, iy); + break; + + default : + zoom_bilinear(z, iy); + break; + } +} + + +/* + * '_cupsImageZoomNew()' - Allocate a pixel zoom record... + */ + +cups_izoom_t * +_cupsImageZoomNew( + cups_image_t *img, /* I - cupsImage to zoom */ + int xc0, /* I - Upper-lefthand corner */ + int yc0, /* I - ... */ + int xc1, /* I - Lower-righthand corner */ + int yc1, /* I - ... */ + int xsize, /* I - Final width of image */ + int ysize, /* I - Final height of image */ + int rotated, /* I - Non-zero if image is rotated 90 degs */ + cups_iztype_t type) /* I - Zoom type */ +{ + cups_izoom_t *z; /* New zoom record */ + int flip; /* Flip on X axis? */ + + + if (xsize > CUPS_IMAGE_MAX_WIDTH || + ysize > CUPS_IMAGE_MAX_HEIGHT || + (xc1 - xc0) > CUPS_IMAGE_MAX_WIDTH || + (yc1 - yc0) > CUPS_IMAGE_MAX_HEIGHT) + return (NULL); /* Protect against integer overflow */ + + if ((z = (cups_izoom_t *)calloc(1, sizeof(cups_izoom_t))) == NULL) + return (NULL); + + z->img = img; + z->row = 0; + z->depth = cupsImageGetDepth(img); + z->rotated = rotated; + z->type = type; + + if (xsize < 0) + { + flip = 1; + xsize = -xsize; + } + else + { + flip = 0; + } + + if (rotated) + { + z->xorig = xc1; + z->yorig = yc0; + z->width = yc1 - yc0 + 1; + z->height = xc1 - xc0 + 1; + z->xsize = xsize; + z->ysize = ysize; + z->xmod = z->width % z->xsize; + z->xstep = z->width / z->xsize; + z->xincr = 1; + z->ymod = z->height % z->ysize; + z->ystep = z->height / z->ysize; + z->yincr = 1; + z->instep = z->xstep * z->depth; + z->inincr = /* z->xincr * */ z->depth; /* z->xincr is always 1 */ + + if (z->width < img->ysize) + z->xmax = z->width; + else + z->xmax = z->width - 1; + + if (z->height < img->xsize) + z->ymax = z->height; + else + z->ymax = z->height - 1; + } + else + { + z->xorig = xc0; + z->yorig = yc0; + z->width = xc1 - xc0 + 1; + z->height = yc1 - yc0 + 1; + z->xsize = xsize; + z->ysize = ysize; + z->xmod = z->width % z->xsize; + z->xstep = z->width / z->xsize; + z->xincr = 1; + z->ymod = z->height % z->ysize; + z->ystep = z->height / z->ysize; + z->yincr = 1; + z->instep = z->xstep * z->depth; + z->inincr = /* z->xincr * */ z->depth; /* z->xincr is always 1 */ + + if (z->width < img->xsize) + z->xmax = z->width; + else + z->xmax = z->width - 1; + + if (z->height < img->ysize) + z->ymax = z->height; + else + z->ymax = z->height - 1; + } + + if (flip) + { + z->instep = -z->instep; + z->inincr = -z->inincr; + } + + if ((z->rows[0] = (cups_ib_t *)malloc(z->xsize * z->depth)) == NULL) + { + free(z); + return (NULL); + } + + if ((z->rows[1] = (cups_ib_t *)malloc(z->xsize * z->depth)) == NULL) + { + free(z->rows[0]); + free(z); + return (NULL); + } + + if ((z->in = (cups_ib_t *)malloc(z->width * z->depth)) == NULL) + { + free(z->rows[0]); + free(z->rows[1]); + free(z); + return (NULL); + } + + return (z); +} + + +/* + * 'zoom_bilinear()' - Fill a zoom record with image data utilizing bilinear + * interpolation. + */ + +static void +zoom_bilinear(cups_izoom_t *z, /* I - Zoom record to fill */ + int iy) /* I - Zoom image row */ +{ + cups_ib_t *r, /* Row pointer */ + *inptr; /* Pixel pointer */ + int xerr0, /* X error counter */ + xerr1; /* ... */ + int ix, + x, + count, + z_depth, + z_xstep, + z_xincr, + z_instep, + z_inincr, + z_xmax, + z_xmod, + z_xsize; + + + if (iy > z->ymax) + iy = z->ymax; + + z->row ^= 1; + + z_depth = z->depth; + z_xsize = z->xsize; + z_xmax = z->xmax; + z_xmod = z->xmod; + z_xstep = z->xstep; + z_xincr = z->xincr; + z_instep = z->instep; + z_inincr = z->inincr; + + if (z->rotated) + cupsImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in); + else + cupsImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in); + + if (z_inincr < 0) + inptr = z->in + (z->width - 1) * z_depth; + else + inptr = z->in; + + for (x = z_xsize, xerr0 = z_xsize, xerr1 = 0, ix = 0, r = z->rows[z->row]; + x > 0; + x --) + { + if (ix < z_xmax) + { + for (count = 0; count < z_depth; count ++) + *r++ = (inptr[count] * xerr0 + inptr[z_depth + count] * xerr1) / z_xsize; + } + else + { + for (count = 0; count < z_depth; count ++) + *r++ = inptr[count]; + } + + ix += z_xstep; + inptr += z_instep; + xerr0 -= z_xmod; + xerr1 += z_xmod; + + if (xerr0 <= 0) + { + xerr0 += z_xsize; + xerr1 -= z_xsize; + ix += z_xincr; + inptr += z_inincr; + } + } +} + + +/* + * 'zoom_nearest()' - Fill a zoom record quickly using nearest-neighbor + * sampling. + */ + +static void +zoom_nearest(cups_izoom_t *z, /* I - Zoom record to fill */ + int iy) /* I - Zoom image row */ +{ + cups_ib_t *r, /* Row pointer */ + *inptr; /* Pixel pointer */ + int xerr0; /* X error counter */ + int ix, + x, + count, + z_depth, + z_xstep, + z_xincr, + z_instep, + z_inincr, + z_xmod, + z_xsize; + + + if (iy > z->ymax) + iy = z->ymax; + + z->row ^= 1; + + z_depth = z->depth; + z_xsize = z->xsize; + z_xmod = z->xmod; + z_xstep = z->xstep; + z_xincr = z->xincr; + z_instep = z->instep; + z_inincr = z->inincr; + + if (z->rotated) + cupsImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in); + else + cupsImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in); + + if (z_inincr < 0) + inptr = z->in + (z->width - 1) * z_depth; + else + inptr = z->in; + + for (x = z_xsize, xerr0 = z_xsize, ix = 0, r = z->rows[z->row]; + x > 0; + x --) + { + for (count = 0; count < z_depth; count ++) + *r++ = inptr[count]; + + ix += z_xstep; + inptr += z_instep; + xerr0 -= z_xmod; + + if (xerr0 <= 0) + { + xerr0 += z_xsize; + ix += z_xincr; + inptr += z_inincr; + } + } +} + + +/* + * End of "$Id: image-zoom.c 9502 2011-01-21 23:56:14Z mike $". + */ diff --git a/filter/image.c b/filter/image.c new file mode 100644 index 0000000..3cb11ac --- /dev/null +++ b/filter/image.c @@ -0,0 +1,813 @@ +/* + * "$Id: image.c 9873 2011-08-06 06:47:46Z mike $" + * + * Base image support for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsImageClose() - Close an image file. + * cupsImageGetCol() - Get a column of pixels from an image. + * cupsImageGetColorSpace() - Get the image colorspace. + * cupsImageGetDepth() - Get the number of bytes per pixel. + * cupsImageGetHeight() - Get the height of an image. + * cupsImageGetRow() - Get a row of pixels from an image. + * cupsImageGetWidth() - Get the width of an image. + * cupsImageGetXPPI() - Get the horizontal resolution of an image. + * cupsImageGetYPPI() - Get the vertical resolution of an image. + * cupsImageOpen() - Open an image file and read it into memory. + * _cupsImagePutCol() - Put a column of pixels to an image. + * _cupsImagePutRow() - Put a row of pixels to an image. + * cupsImageSetMaxTiles() - Set the maximum number of tiles to cache. + * flush_tile() - Flush the least-recently-used tile in the cache. + * get_tile() - Get a cached tile. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Local functions... + */ + +static void flush_tile(cups_image_t *img); +static cups_ib_t *get_tile(cups_image_t *img, int x, int y); + + +/* + * 'cupsImageClose()' - Close an image file. + */ + +void +cupsImageClose(cups_image_t *img) /* I - Image to close */ +{ + cups_ic_t *current, /* Current cached tile */ + *next; /* Next cached tile */ + + + /* + * Wipe the tile cache file (if any)... + */ + + if (img->cachefile >= 0) + { + DEBUG_printf(("Closing/removing swap file \"%s\"...\n", img->cachename)); + + close(img->cachefile); + unlink(img->cachename); + } + + /* + * Free the image cache... + */ + + DEBUG_puts("Freeing memory..."); + + for (current = img->first, next = NULL; current != NULL; current = next) + { + DEBUG_printf(("Freeing cache (%p, next = %p)...\n", current, next)); + + next = current->next; + free(current); + } + + /* + * Free the rest of memory... + */ + + if (img->tiles != NULL) + { + DEBUG_printf(("Freeing tiles (%p)...\n", img->tiles[0])); + + free(img->tiles[0]); + + DEBUG_printf(("Freeing tile pointers (%p)...\n", img->tiles)); + + free(img->tiles); + } + + free(img); +} + + +/* + * 'cupsImageGetCol()' - Get a column of pixels from an image. + */ + +int /* O - -1 on error, 0 on success */ +cupsImageGetCol(cups_image_t *img, /* I - Image */ + int x, /* I - Column */ + int y, /* I - Start row */ + int height, /* I - Column height */ + cups_ib_t *pixels) /* O - Pixel data */ +{ + int bpp, /* Bytes per pixel */ + twidth, /* Tile width */ + count; /* Number of pixels to get */ + const cups_ib_t *ib; /* Pointer into tile */ + + + if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize) + return (-1); + + if (y < 0) + { + height += y; + y = 0; + } + + if ((y + height) > img->ysize) + height = img->ysize - y; + + if (height < 1) + return (-1); + + bpp = cupsImageGetDepth(img); + twidth = bpp * (CUPS_TILE_SIZE - 1); + + while (height > 0) + { + ib = get_tile(img, x, y); + + if (ib == NULL) + return (-1); + + count = CUPS_TILE_SIZE - (y & (CUPS_TILE_SIZE - 1)); + if (count > height) + count = height; + + y += count; + height -= count; + + for (; count > 0; count --, ib += twidth) + switch (bpp) + { + case 4 : + *pixels++ = *ib++; + case 3 : + *pixels++ = *ib++; + *pixels++ = *ib++; + case 1 : + *pixels++ = *ib++; + break; + } + } + + return (0); +} + + +/* + * 'cupsImageGetColorSpace()' - Get the image colorspace. + */ + +cups_icspace_t /* O - Colorspace */ +cupsImageGetColorSpace( + cups_image_t *img) /* I - Image */ +{ + return (img->colorspace); +} + + +/* + * 'cupsImageGetDepth()' - Get the number of bytes per pixel. + */ + +int /* O - Bytes per pixel */ +cupsImageGetDepth(cups_image_t *img) /* I - Image */ +{ + return (abs(img->colorspace)); +} + + +/* + * 'cupsImageGetHeight()' - Get the height of an image. + */ + +unsigned /* O - Height in pixels */ +cupsImageGetHeight(cups_image_t *img) /* I - Image */ +{ + return (img->ysize); +} + + +/* + * 'cupsImageGetRow()' - Get a row of pixels from an image. + */ + +int /* O - -1 on error, 0 on success */ +cupsImageGetRow(cups_image_t *img, /* I - Image */ + int x, /* I - Start column */ + int y, /* I - Row */ + int width, /* I - Width of row */ + cups_ib_t *pixels) /* O - Pixel data */ +{ + int bpp, /* Bytes per pixel */ + count; /* Number of pixels to get */ + const cups_ib_t *ib; /* Pointer to pixels */ + + + if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize) + return (-1); + + if (x < 0) + { + width += x; + x = 0; + } + + if ((x + width) > img->xsize) + width = img->xsize - x; + + if (width < 1) + return (-1); + + bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace; + + while (width > 0) + { + ib = get_tile(img, x, y); + + if (ib == NULL) + return (-1); + + count = CUPS_TILE_SIZE - (x & (CUPS_TILE_SIZE - 1)); + if (count > width) + count = width; + memcpy(pixels, ib, count * bpp); + pixels += count * bpp; + x += count; + width -= count; + } + + return (0); +} + + +/* + * 'cupsImageGetWidth()' - Get the width of an image. + */ + +unsigned /* O - Width in pixels */ +cupsImageGetWidth(cups_image_t *img) /* I - Image */ +{ + return (img->xsize); +} + + +/* + * 'cupsImageGetXPPI()' - Get the horizontal resolution of an image. + */ + +unsigned /* O - Horizontal PPI */ +cupsImageGetXPPI(cups_image_t *img) /* I - Image */ +{ + return (img->xppi); +} + + +/* + * 'cupsImageGetYPPI()' - Get the vertical resolution of an image. + */ + +unsigned /* O - Vertical PPI */ +cupsImageGetYPPI(cups_image_t *img) /* I - Image */ +{ + return (img->yppi); +} + + +/* + * 'cupsImageOpen()' - Open an image file and read it into memory. + */ + +cups_image_t * /* O - New image */ +cupsImageOpen( + const char *filename, /* I - Filename of image */ + cups_icspace_t primary, /* I - Primary colorspace needed */ + cups_icspace_t secondary, /* I - Secondary colorspace if primary no good */ + int saturation, /* I - Color saturation level */ + int hue, /* I - Color hue adjustment */ + const cups_ib_t *lut) /* I - RGB gamma/brightness LUT */ +{ + FILE *fp; /* File pointer */ + unsigned char header[16], /* First 16 bytes of file */ + header2[16]; /* Bytes 2048-2064 (PhotoCD) */ + cups_image_t *img; /* New image buffer */ + int status; /* Status of load... */ + + + DEBUG_printf(("cupsImageOpen(\"%s\", %d, %d, %d, %d, %p)\n", + filename ? filename : "(null)", primary, secondary, + saturation, hue, lut)); + + /* + * Figure out the file type... + */ + + if ((fp = fopen(filename, "r")) == NULL) + return (NULL); + + if (fread(header, 1, sizeof(header), fp) == 0) + { + fclose(fp); + return (NULL); + } + + fseek(fp, 2048, SEEK_SET); + memset(header2, 0, sizeof(header2)); + fread(header2, 1, sizeof(header2), fp); + fseek(fp, 0, SEEK_SET); + + /* + * Allocate memory... + */ + + img = calloc(sizeof(cups_image_t), 1); + + if (img == NULL) + { + fclose(fp); + return (NULL); + } + + /* + * Load the image as appropriate... + */ + + img->cachefile = -1; + img->max_ics = CUPS_TILE_MINIMUM; + img->xppi = 128; + img->yppi = 128; + + if (!memcmp(header, "GIF87a", 6) || !memcmp(header, "GIF89a", 6)) + status = _cupsImageReadGIF(img, fp, primary, secondary, saturation, hue, + lut); + else if (!memcmp(header, "BM", 2)) + status = _cupsImageReadBMP(img, fp, primary, secondary, saturation, hue, + lut); + else if (header[0] == 0x01 && header[1] == 0xda) + status = _cupsImageReadSGI(img, fp, primary, secondary, saturation, hue, + lut); + else if (header[0] == 0x59 && header[1] == 0xa6 && + header[2] == 0x6a && header[3] == 0x95) + status = _cupsImageReadSunRaster(img, fp, primary, secondary, saturation, + hue, lut); + else if (header[0] == 'P' && header[1] >= '1' && header[1] <= '6') + status = _cupsImageReadPNM(img, fp, primary, secondary, saturation, hue, + lut); + else if (!memcmp(header2, "PCD_IPI", 7)) + status = _cupsImageReadPhotoCD(img, fp, primary, secondary, saturation, + hue, lut); + else if (!memcmp(header + 8, "\000\010", 2) || + !memcmp(header + 8, "\000\030", 2)) + status = _cupsImageReadPIX(img, fp, primary, secondary, saturation, hue, + lut); +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) + else if (!memcmp(header, "\211PNG", 4)) + status = _cupsImageReadPNG(img, fp, primary, secondary, saturation, hue, + lut); +#endif /* HAVE_LIBPNG && HAVE_LIBZ */ +#ifdef HAVE_LIBJPEG + else if (!memcmp(header, "\377\330\377", 3) && /* Start-of-Image */ + header[3] >= 0xe0 && header[3] <= 0xef) /* APPn */ + status = _cupsImageReadJPEG(img, fp, primary, secondary, saturation, hue, + lut); +#endif /* HAVE_LIBJPEG */ +#ifdef HAVE_LIBTIFF + else if (!memcmp(header, "MM\000\052", 4) || + !memcmp(header, "II\052\000", 4)) + status = _cupsImageReadTIFF(img, fp, primary, secondary, saturation, hue, + lut); +#endif /* HAVE_LIBTIFF */ + else + { + fclose(fp); + status = -1; + } + + if (status) + { + free(img); + return (NULL); + } + else + return (img); +} + + +/* + * '_cupsImagePutCol()' - Put a column of pixels to an image. + */ + +int /* O - -1 on error, 0 on success */ +_cupsImagePutCol( + cups_image_t *img, /* I - Image */ + int x, /* I - Column */ + int y, /* I - Start row */ + int height, /* I - Column height */ + const cups_ib_t *pixels) /* I - Pixels to put */ +{ + int bpp, /* Bytes per pixel */ + twidth, /* Width of tile */ + count; /* Number of pixels to put */ + int tilex, /* Column within tile */ + tiley; /* Row within tile */ + cups_ib_t *ib; /* Pointer to pixels in tile */ + + + if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize) + return (-1); + + if (y < 0) + { + height += y; + y = 0; + } + + if ((y + height) > img->ysize) + height = img->ysize - y; + + if (height < 1) + return (-1); + + bpp = cupsImageGetDepth(img); + twidth = bpp * (CUPS_TILE_SIZE - 1); + tilex = x / CUPS_TILE_SIZE; + tiley = y / CUPS_TILE_SIZE; + + while (height > 0) + { + ib = get_tile(img, x, y); + + if (ib == NULL) + return (-1); + + img->tiles[tiley][tilex].dirty = 1; + tiley ++; + + count = CUPS_TILE_SIZE - (y & (CUPS_TILE_SIZE - 1)); + if (count > height) + count = height; + + y += count; + height -= count; + + for (; count > 0; count --, ib += twidth) + switch (bpp) + { + case 4 : + *ib++ = *pixels++; + case 3 : + *ib++ = *pixels++; + *ib++ = *pixels++; + case 1 : + *ib++ = *pixels++; + break; + } + } + + return (0); +} + + +/* + * '_cupsImagePutRow()' - Put a row of pixels to an image. + */ + +int /* O - -1 on error, 0 on success */ +_cupsImagePutRow( + cups_image_t *img, /* I - Image */ + int x, /* I - Start column */ + int y, /* I - Row */ + int width, /* I - Row width */ + const cups_ib_t *pixels) /* I - Pixel data */ +{ + int bpp, /* Bytes per pixel */ + count; /* Number of pixels to put */ + int tilex, /* Column within tile */ + tiley; /* Row within tile */ + cups_ib_t *ib; /* Pointer to pixels in tile */ + + + if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize) + return (-1); + + if (x < 0) + { + width += x; + x = 0; + } + + if ((x + width) > img->xsize) + width = img->xsize - x; + + if (width < 1) + return (-1); + + bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace; + tilex = x / CUPS_TILE_SIZE; + tiley = y / CUPS_TILE_SIZE; + + while (width > 0) + { + ib = get_tile(img, x, y); + + if (ib == NULL) + return (-1); + + img->tiles[tiley][tilex].dirty = 1; + + count = CUPS_TILE_SIZE - (x & (CUPS_TILE_SIZE - 1)); + if (count > width) + count = width; + memcpy(ib, pixels, count * bpp); + pixels += count * bpp; + x += count; + width -= count; + tilex ++; + } + + return (0); +} + + +/* + * 'cupsImageSetMaxTiles()' - Set the maximum number of tiles to cache. + * + * If the "max_tiles" argument is 0 then the maximum number of tiles is + * computed from the image size or the RIP_CACHE environment variable. + */ + +void +cupsImageSetMaxTiles( + cups_image_t *img, /* I - Image to set */ + int max_tiles) /* I - Number of tiles to cache */ +{ + int cache_size, /* Size of tile cache in bytes */ + min_tiles, /* Minimum number of tiles to cache */ + max_size; /* Maximum cache size in bytes */ + char *cache_env, /* Cache size environment variable */ + cache_units[255]; /* Cache size units */ + + + min_tiles = max(CUPS_TILE_MINIMUM, + 1 + max((img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE, + (img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE)); + + if (max_tiles == 0) + max_tiles = ((img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE) * + ((img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE); + + cache_size = max_tiles * CUPS_TILE_SIZE * CUPS_TILE_SIZE * + cupsImageGetDepth(img); + + if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL) + { + switch (sscanf(cache_env, "%d%254s", &max_size, cache_units)) + { + case 0 : + max_size = 32 * 1024 * 1024; + break; + case 1 : + max_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; + break; + case 2 : + if (tolower(cache_units[0] & 255) == 'g') + max_size *= 1024 * 1024 * 1024; + else if (tolower(cache_units[0] & 255) == 'm') + max_size *= 1024 * 1024; + else if (tolower(cache_units[0] & 255) == 'k') + max_size *= 1024; + else if (tolower(cache_units[0] & 255) == 't') + max_size *= 4 * CUPS_TILE_SIZE * CUPS_TILE_SIZE; + break; + } + } + else + max_size = 32 * 1024 * 1024; + + if (cache_size > max_size) + max_tiles = max_size / CUPS_TILE_SIZE / CUPS_TILE_SIZE / + cupsImageGetDepth(img); + + if (max_tiles < min_tiles) + max_tiles = min_tiles; + + img->max_ics = max_tiles; + + DEBUG_printf(("max_ics=%d...\n", img->max_ics)); +} + + +/* + * 'flush_tile()' - Flush the least-recently-used tile in the cache. + */ + +static void +flush_tile(cups_image_t *img) /* I - Image */ +{ + int bpp; /* Bytes per pixel */ + cups_itile_t *tile; /* Pointer to tile */ + + + bpp = cupsImageGetDepth(img); + tile = img->first->tile; + + if (!tile->dirty) + { + tile->ic = NULL; + return; + } + + if (img->cachefile < 0) + { + if ((img->cachefile = cupsTempFd(img->cachename, + sizeof(img->cachename))) < 0) + { + tile->ic = NULL; + tile->dirty = 0; + return; + } + + DEBUG_printf(("Created swap file \"%s\"...\n", img->cachename)); + } + + if (tile->pos >= 0) + { + if (lseek(img->cachefile, tile->pos, SEEK_SET) != tile->pos) + { + tile->ic = NULL; + tile->dirty = 0; + return; + } + } + else + { + if ((tile->pos = lseek(img->cachefile, 0, SEEK_END)) < 0) + { + tile->ic = NULL; + tile->dirty = 0; + return; + } + } + + write(img->cachefile, tile->ic->pixels, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); + + tile->ic = NULL; + tile->dirty = 0; +} + + +/* + * 'get_tile()' - Get a cached tile. + */ + +static cups_ib_t * /* O - Pointer to tile or NULL */ +get_tile(cups_image_t *img, /* I - Image */ + int x, /* I - Column in image */ + int y) /* I - Row in image */ +{ + int bpp, /* Bytes per pixel */ + tilex, /* Column within tile */ + tiley, /* Row within tile */ + xtiles, /* Number of tiles horizontally */ + ytiles; /* Number of tiles vertically */ + cups_ic_t *ic; /* Cache pointer */ + cups_itile_t *tile; /* Tile pointer */ + + + if (img->tiles == NULL) + { + xtiles = (img->xsize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE; + ytiles = (img->ysize + CUPS_TILE_SIZE - 1) / CUPS_TILE_SIZE; + + DEBUG_printf(("Creating tile array (%dx%d)\n", xtiles, ytiles)); + + if ((img->tiles = calloc(sizeof(cups_itile_t *), ytiles)) == NULL) + return (NULL); + + if ((tile = calloc(xtiles * sizeof(cups_itile_t), ytiles)) == NULL) + return (NULL); + + for (tiley = 0; tiley < ytiles; tiley ++) + { + img->tiles[tiley] = tile; + for (tilex = xtiles; tilex > 0; tilex --, tile ++) + tile->pos = -1; + } + } + + bpp = cupsImageGetDepth(img); + tilex = x / CUPS_TILE_SIZE; + tiley = y / CUPS_TILE_SIZE; + tile = img->tiles[tiley] + tilex; + x &= (CUPS_TILE_SIZE - 1); + y &= (CUPS_TILE_SIZE - 1); + + if ((ic = tile->ic) == NULL) + { + if (img->num_ics < img->max_ics) + { + if ((ic = calloc(sizeof(cups_ic_t) + + bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE, 1)) == NULL) + { + if (img->num_ics == 0) + return (NULL); + + flush_tile(img); + ic = img->first; + } + else + { + ic->pixels = ((cups_ib_t *)ic) + sizeof(cups_ic_t); + + img->num_ics ++; + + DEBUG_printf(("Allocated cache tile %d (%p)...\n", img->num_ics, ic)); + } + } + else + { + DEBUG_printf(("Flushing old cache tile (%p)...\n", img->first)); + + flush_tile(img); + ic = img->first; + } + + ic->tile = tile; + tile->ic = ic; + + if (tile->pos >= 0) + { + DEBUG_printf(("Loading cache tile from file position " CUPS_LLFMT "...\n", + CUPS_LLCAST tile->pos)); + + lseek(img->cachefile, tile->pos, SEEK_SET); + read(img->cachefile, ic->pixels, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); + } + else + { + DEBUG_puts("Clearing cache tile..."); + + memset(ic->pixels, 0, bpp * CUPS_TILE_SIZE * CUPS_TILE_SIZE); + } + } + + if (ic == img->first) + { + if (ic->next != NULL) + ic->next->prev = NULL; + + img->first = ic->next; + ic->next = NULL; + ic->prev = NULL; + } + else if (img->first == NULL) + img->first = ic; + + if (ic != img->last) + { + /* + * Remove the cache entry from the list... + */ + + if (ic->prev != NULL) + ic->prev->next = ic->next; + if (ic->next != NULL) + ic->next->prev = ic->prev; + + /* + * And add it to the end... + */ + + if (img->last != NULL) + img->last->next = ic; + + ic->prev = img->last; + img->last = ic; + } + + ic->next = NULL; + + return (ic->pixels + bpp * (y * CUPS_TILE_SIZE + x)); +} + + +/* + * End of "$Id: image.c 9873 2011-08-06 06:47:46Z mike $". + */ diff --git a/filter/image.h b/filter/image.h new file mode 100644 index 0000000..6b322e1 --- /dev/null +++ b/filter/image.h @@ -0,0 +1,130 @@ +/* + * "$Id: image.h 9771 2011-05-12 05:21:56Z mike $" + * + * Image library definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +#ifndef _CUPS_IMAGE_H_ +# define _CUPS_IMAGE_H_ + +/* + * Include necessary headers... + */ + +# include +# include + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * Constants... + */ + +typedef enum cups_icspace_e /**** Image colorspaces ****/ +{ + CUPS_IMAGE_CMYK = -4, /* Cyan, magenta, yellow, and black */ + CUPS_IMAGE_CMY = -3, /* Cyan, magenta, and yellow */ + CUPS_IMAGE_BLACK = -1, /* Black */ + CUPS_IMAGE_WHITE = 1, /* White (luminance) */ + CUPS_IMAGE_RGB = 3, /* Red, green, and blue */ + CUPS_IMAGE_RGB_CMYK = 4 /* Use RGB or CMYK */ +} cups_icspace_t; + + +/* + * Types and structures... + */ + +typedef unsigned char cups_ib_t; /**** Image byte ****/ + +struct cups_image_s; +typedef struct cups_image_s cups_image_t; + /**** Image file data ****/ + +struct cups_izoom_s; +typedef struct cups_izoom_s cups_izoom_t; + /**** Image zoom data ****/ + + +/* + * Prototypes... + */ + +extern void cupsImageClose(cups_image_t *img) _CUPS_API_1_2; +extern void cupsImageCMYKToBlack(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageCMYKToCMY(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageCMYKToCMYK(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageCMYKToRGB(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageCMYKToWhite(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern int cupsImageGetCol(cups_image_t *img, int x, int y, + int height, cups_ib_t *pixels) _CUPS_API_1_2; +extern cups_icspace_t cupsImageGetColorSpace(cups_image_t *img) _CUPS_API_1_2; +extern int cupsImageGetDepth(cups_image_t *img) _CUPS_API_1_2; +extern unsigned cupsImageGetHeight(cups_image_t *img) _CUPS_API_1_2; +extern int cupsImageGetRow(cups_image_t *img, int x, int y, + int width, cups_ib_t *pixels) _CUPS_API_1_2; +extern unsigned cupsImageGetWidth(cups_image_t *img) _CUPS_API_1_2; +extern unsigned cupsImageGetXPPI(cups_image_t *img) _CUPS_API_1_2; +extern unsigned cupsImageGetYPPI(cups_image_t *img) _CUPS_API_1_2; +extern void cupsImageLut(cups_ib_t *pixels, int count, + const cups_ib_t *lut) _CUPS_API_1_2; +extern cups_image_t *cupsImageOpen(const char *filename, + cups_icspace_t primary, + cups_icspace_t secondary, + int saturation, int hue, + const cups_ib_t *lut) _CUPS_API_1_2; +extern void cupsImageRGBAdjust(cups_ib_t *pixels, int count, + int saturation, int hue) _CUPS_API_1_2; +extern void cupsImageRGBToBlack(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageRGBToCMY(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageRGBToCMYK(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageRGBToRGB(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageRGBToWhite(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageSetMaxTiles(cups_image_t *img, int max_tiles) _CUPS_API_1_2; +extern void cupsImageSetProfile(float d, float g, + float matrix[3][3]) _CUPS_API_1_2; +extern void cupsImageSetRasterColorSpace(cups_cspace_t cs) _CUPS_API_1_2; +extern void cupsImageWhiteToBlack(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageWhiteToCMY(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageWhiteToCMYK(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageWhiteToRGB(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; +extern void cupsImageWhiteToWhite(const cups_ib_t *in, + cups_ib_t *out, int count) _CUPS_API_1_2; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPS_IMAGE_H_ */ + +/* + * End of "$Id: image.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/imagetops.c b/filter/imagetops.c new file mode 100644 index 0000000..8751f95 --- /dev/null +++ b/filter/imagetops.c @@ -0,0 +1,1078 @@ +/* + * "$Id: imagetops.c 9901 2011-08-17 21:01:53Z mike $" + * + * Image file to PostScript filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry... + * ps_hex() - Print binary data as a series of hexadecimal numbers. + * ps_ascii85() - Print binary data as a series of base-85 numbers. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" +#include "image.h" +#include +#include +#include + + +/* + * Globals... + */ + +int Flip = 0, /* Flip/mirror pages */ + XPosition = 0, /* Horizontal position on page */ + YPosition = 0, /* Vertical position on page */ + Collate = 0, /* Collate copies? */ + Copies = 1; /* Number of copies */ + + +/* + * Local functions... + */ + +static void ps_hex(cups_ib_t *, int, int); +static void ps_ascii85(cups_ib_t *, int, int); + + +/* + * 'main()' - Main entry... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + cups_image_t *img; /* Image to print */ + float xprint, /* Printable area */ + yprint, + xinches, /* Total size in inches */ + yinches; + float xsize, /* Total size in points */ + ysize, + xsize2, + ysize2; + float aspect; /* Aspect ratio */ + int xpages, /* # x pages */ + ypages, /* # y pages */ + xpage, /* Current x page */ + ypage, /* Current y page */ + page; /* Current page number */ + int xc0, yc0, /* Corners of the page in image coords */ + xc1, yc1; + cups_ib_t *row; /* Current row */ + int y; /* Current Y coordinate in image */ + int colorspace; /* Output colorspace */ + int out_offset, /* Offset into output buffer */ + out_length; /* Length of output buffer */ + ppd_file_t *ppd; /* PPD file */ + ppd_choice_t *choice; /* PPD option choice */ + int num_options; /* Number of print options */ + cups_option_t *options; /* Print options */ + const char *val; /* Option value */ + int slowcollate; /* Collate copies the slow way */ + float g; /* Gamma correction value */ + float b; /* Brightness factor */ + float zoom; /* Zoom facter */ + int xppi, yppi; /* Pixels-per-inch */ + int hue, sat; /* Hue and saturation adjustment */ + int realcopies, /* Real copies being printed */ + emit_jcl; /* Emit JCL? */ + float left, top; /* Left and top of image */ + char filename[1024]; /* Name of file to print */ + time_t curtime; /* Current time */ + struct tm *curtm; /* Current date */ + char curdate[255]; /* Current date string */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore broken pipe signals... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * Copy stdin as needed... + */ + + if (argc == 6) + { + int fd; /* File to write to */ + char buffer[8192]; /* Buffer to read into */ + int bytes; /* # of bytes to read */ + + + if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to copy print file")); + return (1); + } + + fprintf(stderr, "DEBUG: imagetops - copying to temp print file \"%s\".\n", + filename); + + while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) + write(fd, buffer, bytes); + + close(fd); + } + else + strlcpy(filename, argv[6], sizeof(filename)); + + /* + * Process command-line options and write the prolog... + */ + + zoom = 0.0; + xppi = 0; + yppi = 0; + hue = 0; + sat = 100; + g = 1.0; + b = 1.0; + + Copies = atoi(argv[4]); + + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + + ppd = SetCommonOptions(num_options, options, 0); + + if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) + { + /* + * This IPP attribute is unnecessarily complicated... + * + * single-document, separate-documents-collated-copies, and + * single-document-new-sheet all require collated copies. + * + * separate-documents-uncollated-copies allows for uncollated copies. + */ + + Collate = _cups_strcasecmp(val, "separate-documents-uncollated-copies") != 0; + } + + if ((val = cupsGetOption("Collate", num_options, options)) != NULL && + _cups_strcasecmp(val, "True") == 0) + Collate = 1; + + if ((val = cupsGetOption("gamma", num_options, options)) != NULL) + { + /* + * Get gamma value from 1 to 10000... + */ + + g = atoi(val) * 0.001f; + + if (g < 0.001f) + g = 0.001f; + else if (g > 10.0f) + g = 10.0f; + } + + if ((val = cupsGetOption("brightness", num_options, options)) != NULL) + { + /* + * Get brightness value from 10 to 1000. + */ + + b = atoi(val) * 0.01f; + + if (b < 0.1f) + b = 0.1f; + else if (b > 10.0f) + b = 10.0f; + } + + if ((val = cupsGetOption("scaling", num_options, options)) != NULL) + zoom = atoi(val) * 0.01; + else if ((val = cupsGetOption("fitplot", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + zoom = 1.0; + else if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + zoom = 1.0; + + if ((val = cupsGetOption("ppi", num_options, options)) != NULL) + if (sscanf(val, "%dx%d", &xppi, &yppi) < 2) + yppi = xppi; + + if ((val = cupsGetOption("position", num_options, options)) != NULL) + { + if (_cups_strcasecmp(val, "center") == 0) + { + XPosition = 0; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "top") == 0) + { + XPosition = 0; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "left") == 0) + { + XPosition = -1; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "right") == 0) + { + XPosition = 1; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "top-left") == 0) + { + XPosition = -1; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "top-right") == 0) + { + XPosition = 1; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "bottom") == 0) + { + XPosition = 0; + YPosition = -1; + } + else if (_cups_strcasecmp(val, "bottom-left") == 0) + { + XPosition = -1; + YPosition = -1; + } + else if (_cups_strcasecmp(val, "bottom-right") == 0) + { + XPosition = 1; + YPosition = -1; + } + } + + if ((val = cupsGetOption("saturation", num_options, options)) != NULL) + sat = atoi(val); + + if ((val = cupsGetOption("hue", num_options, options)) != NULL) + hue = atoi(val); + + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes"))) + Flip = 1; + + if ((val = cupsGetOption("emit-jcl", num_options, options)) != NULL && + (!_cups_strcasecmp(val, "false") || !_cups_strcasecmp(val, "off") || + !_cups_strcasecmp(val, "no") || !strcmp(val, "0"))) + emit_jcl = 0; + else + emit_jcl = 1; + + /* + * Open the input image to print... + */ + + colorspace = ColorDevice ? CUPS_IMAGE_RGB_CMYK : CUPS_IMAGE_WHITE; + + img = cupsImageOpen(filename, colorspace, CUPS_IMAGE_WHITE, sat, hue, NULL); + + if (argc == 6) + unlink(filename); + + if (img == NULL) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The print file could not be opened.")); + ppdClose(ppd); + return (1); + } + + colorspace = cupsImageGetColorSpace(img); + + /* + * Scale as necessary... + */ + + if (zoom == 0.0 && xppi == 0) + { + xppi = cupsImageGetXPPI(img); + yppi = cupsImageGetYPPI(img); + } + + if (yppi == 0) + yppi = xppi; + + fprintf(stderr, "DEBUG: Before scaling: xppi=%d, yppi=%d, zoom=%.2f\n", + xppi, yppi, zoom); + + if (xppi > 0) + { + /* + * Scale the image as neccesary to match the desired pixels-per-inch. + */ + + if (Orientation & 1) + { + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + } + + fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", + xprint, yprint); + + xinches = (float)cupsImageGetWidth(img) / (float)xppi; + yinches = (float)cupsImageGetHeight(img) / (float)yppi; + + fprintf(stderr, "DEBUG: Image size is %.1f x %.1f inches...\n", + xinches, yinches); + + if ((val = cupsGetOption("natural-scaling", num_options, options)) != NULL) + { + xinches = xinches * atoi(val) / 100; + yinches = yinches * atoi(val) / 100; + } + + if (cupsGetOption("orientation-requested", num_options, options) == NULL && + cupsGetOption("landscape", num_options, options) == NULL) + { + /* + * Rotate the image if it will fit landscape but not portrait... + */ + + fputs("DEBUG: Auto orientation...\n", stderr); + + if ((xinches > xprint || yinches > yprint) && + xinches <= yprint && yinches <= xprint) + { + /* + * Rotate the image as needed... + */ + + fputs("DEBUG: Using landscape orientation...\n", stderr); + + Orientation = (Orientation + 1) & 3; + xsize = yprint; + yprint = xprint; + xprint = xsize; + } + } + } + else + { + /* + * Scale percentage of page size... + */ + + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + aspect = (float)cupsImageGetYPPI(img) / (float)cupsImageGetXPPI(img); + + fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", + xprint, yprint); + + fprintf(stderr, "DEBUG: cupsImageGetXPPI(img) = %d, cupsImageGetYPPI(img) = %d, aspect = %f\n", + cupsImageGetXPPI(img), cupsImageGetYPPI(img), aspect); + + xsize = xprint * zoom; + ysize = xsize * cupsImageGetHeight(img) / cupsImageGetWidth(img) / aspect; + + if (ysize > (yprint * zoom)) + { + ysize = yprint * zoom; + xsize = ysize * cupsImageGetWidth(img) * aspect / cupsImageGetHeight(img); + } + + xsize2 = yprint * zoom; + ysize2 = xsize2 * cupsImageGetHeight(img) / cupsImageGetWidth(img) / aspect; + + if (ysize2 > (xprint * zoom)) + { + ysize2 = xprint * zoom; + xsize2 = ysize2 * cupsImageGetWidth(img) * aspect / cupsImageGetHeight(img); + } + + fprintf(stderr, "DEBUG: Portrait size is %.2f x %.2f inches\n", xsize, ysize); + fprintf(stderr, "DEBUG: Landscape size is %.2f x %.2f inches\n", xsize2, ysize2); + + if (cupsGetOption("orientation-requested", num_options, options) == NULL && + cupsGetOption("landscape", num_options, options) == NULL) + { + /* + * Choose the rotation with the largest area, but prefer + * portrait if they are equal... + */ + + fputs("DEBUG: Auto orientation...\n", stderr); + + if ((xsize * ysize) < (xsize2 * xsize2)) + { + /* + * Do landscape orientation... + */ + + fputs("DEBUG: Using landscape orientation...\n", stderr); + + Orientation = 1; + xinches = xsize2; + yinches = ysize2; + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + /* + * Do portrait orientation... + */ + + fputs("DEBUG: Using portrait orientation...\n", stderr); + + Orientation = 0; + xinches = xsize; + yinches = ysize; + } + } + else if (Orientation & 1) + { + fputs("DEBUG: Using landscape orientation...\n", stderr); + + xinches = xsize2; + yinches = ysize2; + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + fputs("DEBUG: Using portrait orientation...\n", stderr); + + xinches = xsize; + yinches = ysize; + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + } + } + + /* + * Compute the number of pages to print and the size of the image on each + * page... + */ + + xpages = ceil(xinches / xprint); + ypages = ceil(yinches / yprint); + + xprint = xinches / xpages; + yprint = yinches / ypages; + + fprintf(stderr, "DEBUG: xpages = %dx%.2fin, ypages = %dx%.2fin\n", + xpages, xprint, ypages, yprint); + + /* + * Update the page size for custom sizes... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL && + _cups_strcasecmp(choice->choice, "Custom") == 0) + { + float width, /* New width in points */ + length; /* New length in points */ + char s[255]; /* New custom page size... */ + + + /* + * Use the correct width and length for the current orientation... + */ + + if (Orientation & 1) + { + width = yprint * 72.0; + length = xprint * 72.0; + } + else + { + width = xprint * 72.0; + length = yprint * 72.0; + } + + /* + * Add margins to page size... + */ + + width += ppd->custom_margins[0] + ppd->custom_margins[2]; + length += ppd->custom_margins[1] + ppd->custom_margins[3]; + + /* + * Enforce minimums... + */ + + if (width < ppd->custom_min[0]) + width = ppd->custom_min[0]; + + if (length < ppd->custom_min[1]) + length = ppd->custom_min[1]; + + fprintf(stderr, "DEBUG: Updated custom page size to %.2f x %.2f inches...\n", + width / 72.0, length / 72.0); + + /* + * Set the new custom size... + */ + + sprintf(s, "Custom.%.0fx%.0f", width, length); + ppdMarkOption(ppd, "PageSize", s); + + /* + * Update page variables... + */ + + PageWidth = width; + PageLength = length; + PageLeft = ppd->custom_margins[0]; + PageRight = width - ppd->custom_margins[2]; + PageBottom = ppd->custom_margins[1]; + PageTop = length - ppd->custom_margins[3]; + } + + /* + * See if we need to collate, and if so how we need to do it... + */ + + if (xpages == 1 && ypages == 1) + Collate = 0; + + slowcollate = Collate && ppdFindOption(ppd, "Collate") == NULL; + + if (Copies > 1 && !slowcollate) + { + realcopies = Copies; + Copies = 1; + } + else + realcopies = 1; + + /* + * Write any "exit server" options that have been selected... + */ + + ppdEmit(ppd, stdout, PPD_ORDER_EXIT); + + /* + * Write any JCL commands that are needed to print PostScript code... + */ + + if (emit_jcl) + ppdEmitJCL(ppd, stdout, atoi(argv[1]), argv[2], argv[3]); + + /* + * Start sending the document with any commands needed... + */ + + curtime = time(NULL); + curtm = localtime(&curtime); + + puts("%!PS-Adobe-3.0"); + printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, + PageRight, PageTop); + printf("%%%%LanguageLevel: %d\n", LanguageLevel); + printf("%%%%Pages: %d\n", xpages * ypages * Copies); + puts("%%DocumentData: Clean7Bit"); + puts("%%DocumentNeededResources: font Helvetica-Bold"); + puts("%%Creator: imagetops/" CUPS_SVERSION); + strftime(curdate, sizeof(curdate), "%c", curtm); + printf("%%%%CreationDate: %s\n", curdate); + WriteTextComment("Title", argv[3]); + WriteTextComment("For", argv[2]); + if (Orientation & 1) + puts("%%Orientation: Landscape"); + else + puts("%%Orientation: Portrait"); + puts("%%EndComments"); + puts("%%BeginProlog"); + + if (ppd != NULL && ppd->patches != NULL) + puts(ppd->patches); + + ppdEmit(ppd, stdout, PPD_ORDER_DOCUMENT); + ppdEmit(ppd, stdout, PPD_ORDER_ANY); + ppdEmit(ppd, stdout, PPD_ORDER_PROLOG); + + if (g != 1.0 || b != 1.0) + printf("{ neg 1 add dup 0 lt { pop 1 } { %.3f exp neg 1 add } " + "ifelse %.3f mul } bind settransfer\n", g, b); + + WriteCommon(); + switch (Orientation) + { + case 0 : + WriteLabelProlog(cupsGetOption("page-label", num_options, options), + PageBottom, PageTop, PageWidth); + break; + + case 1 : + WriteLabelProlog(cupsGetOption("page-label", num_options, options), + PageLeft, PageRight, PageLength); + break; + + case 2 : + WriteLabelProlog(cupsGetOption("page-label", num_options, options), + PageLength - PageTop, PageLength - PageBottom, + PageWidth); + break; + + case 3 : + WriteLabelProlog(cupsGetOption("page-label", num_options, options), + PageWidth - PageRight, PageWidth - PageLeft, + PageLength); + break; + } + + if (realcopies > 1) + { + if (ppd == NULL || ppd->language_level == 1) + printf("/#copies %d def\n", realcopies); + else + printf("<>setpagedevice\n", realcopies); + } + + puts("%%EndProlog"); + + /* + * Output the pages... + */ + + row = malloc(cupsImageGetWidth(img) * abs(colorspace) + 3); + + fprintf(stderr, "DEBUG: XPosition=%d, YPosition=%d, Orientation=%d\n", + XPosition, YPosition, Orientation); + fprintf(stderr, "DEBUG: xprint=%.0f, yprint=%.0f\n", xprint, yprint); + fprintf(stderr, "DEBUG: PageLeft=%.0f, PageRight=%.0f, PageWidth=%.0f\n", + PageLeft, PageRight, PageWidth); + fprintf(stderr, "DEBUG: PageBottom=%.0f, PageTop=%.0f, PageLength=%.0f\n", + PageBottom, PageTop, PageLength); + + switch (Orientation) + { + default : + switch (XPosition) + { + case -1 : + left = PageLeft; + break; + default : + left = (PageRight + PageLeft - xprint * 72) / 2; + break; + case 1 : + left = PageRight - xprint * 72; + break; + } + + switch (YPosition) + { + case -1 : + top = PageBottom + yprint * 72; + break; + default : + top = (PageTop + PageBottom + yprint * 72) / 2; + break; + case 1 : + top = PageTop; + break; + } + break; + + case 1 : + switch (XPosition) + { + case -1 : + left = PageBottom; + break; + default : + left = (PageTop + PageBottom - xprint * 72) / 2; + break; + case 1 : + left = PageTop - xprint * 72; + break; + } + + switch (YPosition) + { + case -1 : + top = PageLeft + yprint * 72; + break; + default : + top = (PageRight + PageLeft + yprint * 72) / 2; + break; + case 1 : + top = PageRight; + break; + } + break; + + case 2 : + switch (XPosition) + { + case 1 : + left = PageLeft; + break; + default : + left = (PageRight + PageLeft - xprint * 72) / 2; + break; + case -1 : + left = PageRight - xprint * 72; + break; + } + + switch (YPosition) + { + case 1 : + top = PageBottom + yprint * 72; + break; + default : + top = (PageTop + PageBottom + yprint * 72) / 2; + break; + case -1 : + top = PageTop; + break; + } + break; + + case 3 : + switch (XPosition) + { + case 1 : + left = PageBottom; + break; + default : + left = (PageTop + PageBottom - xprint * 72) / 2; + break; + case -1 : + left = PageTop - xprint * 72; + break; + } + + switch (YPosition) + { + case 1 : + top = PageLeft + yprint * 72; + break; + default : + top = (PageRight + PageLeft + yprint * 72) / 2; + break; + case -1 : + top = PageRight; + break; + } + break; + } + + fprintf(stderr, "DEBUG: left=%.2f, top=%.2f\n", left, top); + + for (page = 1; Copies > 0; Copies --) + for (xpage = 0; xpage < xpages; xpage ++) + for (ypage = 0; ypage < ypages; ypage ++, page ++) + { + if (ppd && ppd->num_filters == 0) + fprintf(stderr, "PAGE: %d %d\n", page, realcopies); + + _cupsLangPrintFilter(stderr, "INFO", _("Printing page %d."), page); + + printf("%%%%Page: %d %d\n", page, page); + + ppdEmit(ppd, stdout, PPD_ORDER_PAGE); + + puts("gsave"); + + if (Flip) + printf("%.0f 0 translate -1 1 scale\n", PageWidth); + + switch (Orientation) + { + case 1 : /* Landscape */ + printf("%.0f 0 translate 90 rotate\n", PageWidth); + break; + case 2 : /* Reverse Portrait */ + printf("%.0f %.0f translate 180 rotate\n", PageWidth, PageLength); + break; + case 3 : /* Reverse Landscape */ + printf("0 %.0f translate -90 rotate\n", PageLength); + break; + } + + puts("gsave"); + + xc0 = cupsImageGetWidth(img) * xpage / xpages; + xc1 = cupsImageGetWidth(img) * (xpage + 1) / xpages - 1; + yc0 = cupsImageGetHeight(img) * ypage / ypages; + yc1 = cupsImageGetHeight(img) * (ypage + 1) / ypages - 1; + + printf("%.1f %.1f translate\n", left, top); + + printf("%.3f %.3f scale\n\n", + xprint * 72.0 / (xc1 - xc0 + 1), + yprint * 72.0 / (yc1 - yc0 + 1)); + + if (LanguageLevel == 1) + { + printf("/picture %d string def\n", (xc1 - xc0 + 1) * abs(colorspace)); + printf("%d %d 8[1 0 0 -1 0 1]", (xc1 - xc0 + 1), (yc1 - yc0 + 1)); + + if (colorspace == CUPS_IMAGE_WHITE) + puts("{currentfile picture readhexstring pop} image"); + else + printf("{currentfile picture readhexstring pop} false %d colorimage\n", + abs(colorspace)); + + for (y = yc0; y <= yc1; y ++) + { + cupsImageGetRow(img, xc0, y, xc1 - xc0 + 1, row); + ps_hex(row, (xc1 - xc0 + 1) * abs(colorspace), y == yc1); + } + } + else + { + switch (colorspace) + { + case CUPS_IMAGE_WHITE : + puts("/DeviceGray setcolorspace"); + break; + case CUPS_IMAGE_RGB : + puts("/DeviceRGB setcolorspace"); + break; + case CUPS_IMAGE_CMYK : + puts("/DeviceCMYK setcolorspace"); + break; + } + + printf("<<" + "/ImageType 1" + "/Width %d" + "/Height %d" + "/BitsPerComponent 8", + xc1 - xc0 + 1, yc1 - yc0 + 1); + + switch (colorspace) + { + case CUPS_IMAGE_WHITE : + fputs("/Decode[0 1]", stdout); + break; + case CUPS_IMAGE_RGB : + fputs("/Decode[0 1 0 1 0 1]", stdout); + break; + case CUPS_IMAGE_CMYK : + fputs("/Decode[0 1 0 1 0 1 0 1]", stdout); + break; + } + + fputs("\n/DataSource currentfile/ASCII85Decode filter", stdout); + + if (((xc1 - xc0 + 1) / xprint) < 100.0) + fputs("/Interpolate true", stdout); + + puts("/ImageMatrix[1 0 0 -1 0 1]>>image"); + + for (y = yc0, out_offset = 0; y <= yc1; y ++) + { + cupsImageGetRow(img, xc0, y, xc1 - xc0 + 1, row + out_offset); + + out_length = (xc1 - xc0 + 1) * abs(colorspace) + out_offset; + out_offset = out_length & 3; + + ps_ascii85(row, out_length, y == yc1); + + if (out_offset > 0) + memcpy(row, row + out_length - out_offset, out_offset); + } + } + + puts("grestore"); + WriteLabels(0); + puts("grestore"); + puts("showpage"); + } + + puts("%%EOF"); + + /* + * End the job with the appropriate JCL command or CTRL-D otherwise. + */ + + if (emit_jcl) + { + if (ppd && ppd->jcl_end) + ppdEmitJCLEnd(ppd, stdout); + else + putchar(0x04); + } + + /* + * Close files... + */ + + cupsImageClose(img); + ppdClose(ppd); + + return (0); +} + + +/* + * 'ps_hex()' - Print binary data as a series of hexadecimal numbers. + */ + +static void +ps_hex(cups_ib_t *data, /* I - Data to print */ + int length, /* I - Number of bytes to print */ + int last_line) /* I - Last line of raster data? */ +{ + static int col = 0; /* Current column */ + static char *hex = "0123456789ABCDEF"; + /* Hex digits */ + + + while (length > 0) + { + /* + * Put the hex chars out to the file; note that we don't use printf() + * for speed reasons... + */ + + putchar(hex[*data >> 4]); + putchar(hex[*data & 15]); + + data ++; + length --; + + col += 2; + if (col > 78) + { + putchar('\n'); + col = 0; + } + } + + if (last_line && col) + { + putchar('\n'); + col = 0; + } +} + + +/* + * 'ps_ascii85()' - Print binary data as a series of base-85 numbers. + */ + +static void +ps_ascii85(cups_ib_t *data, /* I - Data to print */ + int length, /* I - Number of bytes to print */ + int last_line) /* I - Last line of raster data? */ +{ + unsigned b; /* Binary data word */ + unsigned char c[5]; /* ASCII85 encoded chars */ + static int col = 0; /* Current column */ + + + while (length > 3) + { + b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; + + if (b == 0) + { + putchar('z'); + col ++; + } + else + { + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + fwrite(c, 5, 1, stdout); + col += 5; + } + + data += 4; + length -= 4; + + if (col >= 75) + { + putchar('\n'); + col = 0; + } + } + + if (last_line) + { + if (length > 0) + { + memset(data + length, 0, 4 - length); + b = (((((data[0] << 8) | data[1]) << 8) | data[2]) << 8) | data[3]; + + c[4] = (b % 85) + '!'; + b /= 85; + c[3] = (b % 85) + '!'; + b /= 85; + c[2] = (b % 85) + '!'; + b /= 85; + c[1] = (b % 85) + '!'; + b /= 85; + c[0] = b + '!'; + + fwrite(c, length + 1, 1, stdout); + } + + puts("~>"); + col = 0; + } +} + + +/* + * End of "$Id: imagetops.c 9901 2011-08-17 21:01:53Z mike $". + */ diff --git a/filter/imagetoraster.c b/filter/imagetoraster.c new file mode 100644 index 0000000..0d09ce2 --- /dev/null +++ b/filter/imagetoraster.c @@ -0,0 +1,4368 @@ +/* + * "$Id: imagetoraster.c 9808 2011-05-26 12:03:28Z mike $" + * + * Image file to raster filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry... + * blank_line() - Clear a line buffer to the blank value... + * format_CMY() - Convert image data to CMY. + * format_CMYK() - Convert image data to CMYK. + * format_K() - Convert image data to black. + * format_KCMY() - Convert image data to KCMY. + * format_KCMYcm() - Convert image data to KCMYcm. + * format_RGBA() - Convert image data to RGBA/RGBW. + * format_W() - Convert image data to luminance. + * format_YMC() - Convert image data to YMC. + * format_YMCK() - Convert image data to YMCK. + * make_lut() - Make a lookup table given gamma and brightness values. + * raster_cb() - Validate the page header. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" +#include "image-private.h" +#include +#include +#include +#include + + +/* + * Globals... + */ + +int Flip = 0, /* Flip/mirror pages */ + XPosition = 0, /* Horizontal position on page */ + YPosition = 0, /* Vertical position on page */ + Collate = 0, /* Collate copies? */ + Copies = 1; /* Number of copies */ +int Floyd16x16[16][16] = /* Traditional Floyd ordered dither */ + { + { 0, 128, 32, 160, 8, 136, 40, 168, + 2, 130, 34, 162, 10, 138, 42, 170 }, + { 192, 64, 224, 96, 200, 72, 232, 104, + 194, 66, 226, 98, 202, 74, 234, 106 }, + { 48, 176, 16, 144, 56, 184, 24, 152, + 50, 178, 18, 146, 58, 186, 26, 154 }, + { 240, 112, 208, 80, 248, 120, 216, 88, + 242, 114, 210, 82, 250, 122, 218, 90 }, + { 12, 140, 44, 172, 4, 132, 36, 164, + 14, 142, 46, 174, 6, 134, 38, 166 }, + { 204, 76, 236, 108, 196, 68, 228, 100, + 206, 78, 238, 110, 198, 70, 230, 102 }, + { 60, 188, 28, 156, 52, 180, 20, 148, + 62, 190, 30, 158, 54, 182, 22, 150 }, + { 252, 124, 220, 92, 244, 116, 212, 84, + 254, 126, 222, 94, 246, 118, 214, 86 }, + { 3, 131, 35, 163, 11, 139, 43, 171, + 1, 129, 33, 161, 9, 137, 41, 169 }, + { 195, 67, 227, 99, 203, 75, 235, 107, + 193, 65, 225, 97, 201, 73, 233, 105 }, + { 51, 179, 19, 147, 59, 187, 27, 155, + 49, 177, 17, 145, 57, 185, 25, 153 }, + { 243, 115, 211, 83, 251, 123, 219, 91, + 241, 113, 209, 81, 249, 121, 217, 89 }, + { 15, 143, 47, 175, 7, 135, 39, 167, + 13, 141, 45, 173, 5, 133, 37, 165 }, + { 207, 79, 239, 111, 199, 71, 231, 103, + 205, 77, 237, 109, 197, 69, 229, 101 }, + { 63, 191, 31, 159, 55, 183, 23, 151, + 61, 189, 29, 157, 53, 181, 21, 149 }, + { 254, 127, 223, 95, 247, 119, 215, 87, + 253, 125, 221, 93, 245, 117, 213, 85 } + }; +int Floyd8x8[8][8] = + { + { 0, 32, 8, 40, 2, 34, 10, 42 }, + { 48, 16, 56, 24, 50, 18, 58, 26 }, + { 12, 44, 4, 36, 14, 46, 6, 38 }, + { 60, 28, 52, 20, 62, 30, 54, 22 }, + { 3, 35, 11, 43, 1, 33, 9, 41 }, + { 51, 19, 59, 27, 49, 17, 57, 25 }, + { 15, 47, 7, 39, 13, 45, 5, 37 }, + { 63, 31, 55, 23, 61, 29, 53, 21 } + }; +int Floyd4x4[4][4] = + { + { 0, 8, 2, 10 }, + { 12, 4, 14, 6 }, + { 3, 11, 1, 9 }, + { 15, 7, 13, 5 } + }; + +cups_ib_t OnPixels[256], /* On-pixel LUT */ + OffPixels[256]; /* Off-pixel LUT */ + + +/* + * Local functions... + */ + +static void blank_line(cups_page_header2_t *header, unsigned char *row); +static void format_CMY(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_CMYK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_K(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_KCMYcm(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_KCMY(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +#define format_RGB format_CMY +static void format_RGBA(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_W(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_YMC(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void format_YMCK(cups_page_header2_t *header, unsigned char *row, int y, int z, int xsize, int ysize, int yerr0, int yerr1, cups_ib_t *r0, cups_ib_t *r1); +static void make_lut(cups_ib_t *, int, float, float); +static int raster_cb(cups_page_header2_t *header, int preferred_bits); + + +/* + * 'main()' - Main entry... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + cups_image_t *img; /* Image to print */ + float xprint, /* Printable area */ + yprint, + xinches, /* Total size in inches */ + yinches; + float xsize, /* Total size in points */ + ysize, + xsize2, + ysize2; + float aspect; /* Aspect ratio */ + int xpages, /* # x pages */ + ypages, /* # y pages */ + xpage, /* Current x page */ + ypage, /* Current y page */ + xtemp, /* Bitmap width in pixels */ + ytemp, /* Bitmap height in pixels */ + page; /* Current page number */ + int xc0, yc0, /* Corners of the page in image coords */ + xc1, yc1; + ppd_file_t *ppd; /* PPD file */ + ppd_choice_t *choice; /* PPD option choice */ + char *resolution, /* Output resolution */ + *media_type; /* Media type */ + ppd_profile_t *profile; /* Color profile */ + ppd_profile_t userprofile; /* User-specified profile */ + cups_raster_t *ras; /* Raster stream */ + cups_page_header2_t header; /* Page header */ + int num_options; /* Number of print options */ + cups_option_t *options; /* Print options */ + const char *val; /* Option value */ + int slowcollate, /* Collate copies the slow way */ + slowcopies; /* Make copies the "slow" way? */ + float g; /* Gamma correction value */ + float b; /* Brightness factor */ + float zoom; /* Zoom facter */ + int xppi, yppi; /* Pixels-per-inch */ + int hue, sat; /* Hue and saturation adjustment */ + cups_izoom_t *z; /* Image zoom buffer */ + cups_iztype_t zoom_type; /* Image zoom type */ + int primary, /* Primary image colorspace */ + secondary; /* Secondary image colorspace */ + cups_ib_t *row, /* Current row */ + *r0, /* Top row */ + *r1; /* Bottom row */ + int y, /* Current Y coordinate on page */ + iy, /* Current Y coordinate in image */ + last_iy, /* Previous Y coordinate in image */ + yerr0, /* Top Y error value */ + yerr1; /* Bottom Y error value */ + cups_ib_t lut[256]; /* Gamma/brightness LUT */ + int plane, /* Current color plane */ + num_planes; /* Number of color planes */ + char filename[1024]; /* Name of file to print */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore broken pipe signals... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * See if we need to use the imagetops and pstoraster filters instead... + */ + + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + + if (getenv("CLASSIFICATION") || + cupsGetOption("page-label", num_options, options)) + { + /* + * Yes, fork a copy of pstoraster and then transfer control to imagetops... + */ + + int mypipes[2]; /* New pipes for imagetops | pstoraster */ + int pid; /* PID of pstoraster */ + + + cupsFreeOptions(num_options, options); + + if (pipe(mypipes)) + { + _cupsLangPrintError("ERROR", _("Unable to create pipes for filters")); + return (errno); + } + + if ((pid = fork()) == 0) + { + /* + * Child process for pstoraster... Assign new pipe input to pstoraster... + */ + + dup2(mypipes[0], 0); + close(mypipes[0]); + close(mypipes[1]); + + execlp("pstoraster", argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], + NULL); + return (errno); + } + else if (pid < 0) + { + /* + * Error! + */ + + _cupsLangPrintError("ERROR", _("Unable to fork filter")); + return (errno); + } + + /* + * Update stdout so it points at the new pstoraster... + */ + + dup2(mypipes[1], 1); + close(mypipes[0]); + close(mypipes[1]); + + /* + * Run imagetops to get the classification or page labeling that was + * requested... + */ + + execlp("imagetops", argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], + argv[6], NULL); + return (errno); + } + + /* + * Copy stdin as needed... + */ + + if (argc == 6) + { + int fd; /* File to write to */ + char buffer[8192]; /* Buffer to read into */ + int bytes; /* # of bytes to read */ + + + if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to copy print file")); + return (1); + } + + fprintf(stderr, + "DEBUG: imagetoraster - copying to temp print file \"%s\".\n", + filename); + + while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) + write(fd, buffer, bytes); + + close(fd); + } + else + strlcpy(filename, argv[6], sizeof(filename)); + + /* + * Process command-line options and write the prolog... + */ + + zoom = 0.0; + xppi = 0; + yppi = 0; + hue = 0; + sat = 100; + g = 1.0; + b = 1.0; + + Copies = atoi(argv[4]); + + ppd = SetCommonOptions(num_options, options, 0); + + if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) + { + /* + * This IPP attribute is unnecessarily complicated... + * + * single-document, separate-documents-collated-copies, and + * single-document-new-sheet all require collated copies. + * + * separate-documents-collated-copies allows for uncollated copies. + */ + + Collate = _cups_strcasecmp(val, "separate-documents-collated-copies") != 0; + } + + if ((val = cupsGetOption("Collate", num_options, options)) != NULL && + _cups_strcasecmp(val, "True") == 0) + Collate = 1; + + if ((val = cupsGetOption("gamma", num_options, options)) != NULL) + { + /* + * Get gamma value from 1 to 10000... + */ + + g = atoi(val) * 0.001f; + + if (g < 0.001f) + g = 0.001f; + else if (g > 10.0f) + g = 10.0f; + } + + if ((val = cupsGetOption("brightness", num_options, options)) != NULL) + { + /* + * Get brightness value from 10 to 1000. + */ + + b = atoi(val) * 0.01f; + + if (b < 0.1f) + b = 0.1f; + else if (b > 10.0f) + b = 10.0f; + } + + if ((val = cupsGetOption("scaling", num_options, options)) != NULL) + zoom = atoi(val) * 0.01; + else if ((val = cupsGetOption("fitplot", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + zoom = 1.0; + else if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + zoom = 1.0; + + if ((val = cupsGetOption("ppi", num_options, options)) != NULL) + if (sscanf(val, "%dx%d", &xppi, &yppi) < 2) + yppi = xppi; + + if ((val = cupsGetOption("position", num_options, options)) != NULL) + { + if (_cups_strcasecmp(val, "center") == 0) + { + XPosition = 0; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "top") == 0) + { + XPosition = 0; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "left") == 0) + { + XPosition = -1; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "right") == 0) + { + XPosition = 1; + YPosition = 0; + } + else if (_cups_strcasecmp(val, "top-left") == 0) + { + XPosition = -1; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "top-right") == 0) + { + XPosition = 1; + YPosition = 1; + } + else if (_cups_strcasecmp(val, "bottom") == 0) + { + XPosition = 0; + YPosition = -1; + } + else if (_cups_strcasecmp(val, "bottom-left") == 0) + { + XPosition = -1; + YPosition = -1; + } + else if (_cups_strcasecmp(val, "bottom-right") == 0) + { + XPosition = 1; + YPosition = -1; + } + } + + if ((val = cupsGetOption("saturation", num_options, options)) != NULL) + sat = atoi(val); + + if ((val = cupsGetOption("hue", num_options, options)) != NULL) + hue = atoi(val); + + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes"))) + Flip = 1; + + /* + * Set the needed options in the page header... + */ + + if (cupsRasterInterpretPPD(&header, ppd, num_options, options, raster_cb)) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The page setup information was not valid.")); + fprintf(stderr, "DEBUG: %s\n", cupsRasterErrorString()); + return (1); + } + + /* + * Get the media type and resolution that have been chosen... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) + media_type = choice->choice; + else + media_type = ""; + + if ((choice = ppdFindMarkedChoice(ppd, "Resolution")) != NULL) + resolution = choice->choice; + else + resolution = ""; + + /* + * Choose the appropriate colorspace... + */ + + switch (header.cupsColorSpace) + { + case CUPS_CSPACE_W : + case CUPS_CSPACE_SW : + if (header.cupsBitsPerColor >= 8) + { + primary = CUPS_IMAGE_WHITE; + secondary = CUPS_IMAGE_WHITE; + } + else + { + primary = CUPS_IMAGE_BLACK; + secondary = CUPS_IMAGE_BLACK; + } + break; + + default : + case CUPS_CSPACE_RGB : + case CUPS_CSPACE_RGBA : + case CUPS_CSPACE_RGBW : + case CUPS_CSPACE_SRGB : + case CUPS_CSPACE_ADOBERGB : + if (header.cupsBitsPerColor >= 8) + { + primary = CUPS_IMAGE_RGB; + secondary = CUPS_IMAGE_RGB; + } + else + { + primary = CUPS_IMAGE_CMY; + secondary = CUPS_IMAGE_CMY; + } + break; + + case CUPS_CSPACE_K : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + primary = CUPS_IMAGE_BLACK; + secondary = CUPS_IMAGE_BLACK; + break; + + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_KCMY : + case CUPS_CSPACE_KCMYcm : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + if (header.cupsBitsPerColor == 1) + { + primary = CUPS_IMAGE_CMY; + secondary = CUPS_IMAGE_CMY; + } + else + { + primary = CUPS_IMAGE_CMYK; + secondary = CUPS_IMAGE_CMYK; + } + break; + + case CUPS_CSPACE_CMY : + case CUPS_CSPACE_YMC : + primary = CUPS_IMAGE_CMY; + secondary = CUPS_IMAGE_CMY; + break; + + case CUPS_CSPACE_CIEXYZ : + case CUPS_CSPACE_CIELab : + case CUPS_CSPACE_ICC1 : + case CUPS_CSPACE_ICC2 : + case CUPS_CSPACE_ICC3 : + case CUPS_CSPACE_ICC4 : + case CUPS_CSPACE_ICC5 : + case CUPS_CSPACE_ICC6 : + case CUPS_CSPACE_ICC7 : + case CUPS_CSPACE_ICC8 : + case CUPS_CSPACE_ICC9 : + case CUPS_CSPACE_ICCA : + case CUPS_CSPACE_ICCB : + case CUPS_CSPACE_ICCC : + case CUPS_CSPACE_ICCD : + case CUPS_CSPACE_ICCE : + case CUPS_CSPACE_ICCF : + case CUPS_CSPACE_DEVICE1 : + case CUPS_CSPACE_DEVICE2 : + case CUPS_CSPACE_DEVICE3 : + case CUPS_CSPACE_DEVICE4 : + case CUPS_CSPACE_DEVICE5 : + case CUPS_CSPACE_DEVICE6 : + case CUPS_CSPACE_DEVICE7 : + case CUPS_CSPACE_DEVICE8 : + case CUPS_CSPACE_DEVICE9 : + case CUPS_CSPACE_DEVICEA : + case CUPS_CSPACE_DEVICEB : + case CUPS_CSPACE_DEVICEC : + case CUPS_CSPACE_DEVICED : + case CUPS_CSPACE_DEVICEE : + case CUPS_CSPACE_DEVICEF : + fprintf(stderr, "DEBUG: Colorspace %d not supported.\n", + header.cupsColorSpace); + exit(1); + break; + } + + /* + * Find a color profile matching the current options... + */ + + if ((val = cupsGetOption("profile", num_options, options)) != NULL) + { + profile = &userprofile; + sscanf(val, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f", + &(userprofile.density), &(userprofile.gamma), + userprofile.matrix[0] + 0, userprofile.matrix[0] + 1, + userprofile.matrix[0] + 2, + userprofile.matrix[1] + 0, userprofile.matrix[1] + 1, + userprofile.matrix[1] + 2, + userprofile.matrix[2] + 0, userprofile.matrix[2] + 1, + userprofile.matrix[2] + 2); + + userprofile.density *= 0.001f; + userprofile.gamma *= 0.001f; + userprofile.matrix[0][0] *= 0.001f; + userprofile.matrix[0][1] *= 0.001f; + userprofile.matrix[0][2] *= 0.001f; + userprofile.matrix[1][0] *= 0.001f; + userprofile.matrix[1][1] *= 0.001f; + userprofile.matrix[1][2] *= 0.001f; + userprofile.matrix[2][0] *= 0.001f; + userprofile.matrix[2][1] *= 0.001f; + userprofile.matrix[2][2] *= 0.001f; + } + else if (ppd != NULL) + { + fprintf(stderr, "DEBUG: Searching for profile \"%s/%s\"...\n", + resolution, media_type); + + for (i = 0, profile = ppd->profiles; i < ppd->num_profiles; i ++, profile ++) + { + fprintf(stderr, "DEBUG: \"%s/%s\" = ", profile->resolution, + profile->media_type); + + if ((strcmp(profile->resolution, resolution) == 0 || + profile->resolution[0] == '-') && + (strcmp(profile->media_type, media_type) == 0 || + profile->media_type[0] == '-')) + { + fputs("MATCH\n", stderr); + break; + } + else + fputs("no.\n", stderr); + } + + /* + * If we found a color profile, use it! + */ + + if (i >= ppd->num_profiles) + profile = NULL; + } + else + profile = NULL; + + if (profile) + cupsImageSetProfile(profile->density, profile->gamma, profile->matrix); + + cupsImageSetRasterColorSpace(header.cupsColorSpace); + + /* + * Create a gamma/brightness LUT... + */ + + make_lut(lut, primary, g, b); + + /* + * Open the input image to print... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Loading print file.")); + + if (header.cupsColorSpace == CUPS_CSPACE_CIEXYZ || + header.cupsColorSpace == CUPS_CSPACE_CIELab || + header.cupsColorSpace >= CUPS_CSPACE_ICC1) + img = cupsImageOpen(filename, primary, secondary, sat, hue, NULL); + else + img = cupsImageOpen(filename, primary, secondary, sat, hue, lut); + + if (argc == 6) + unlink(filename); + + if (img == NULL) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("The print file could not be opened.")); + ppdClose(ppd); + return (1); + } + + /* + * Scale as necessary... + */ + + if (zoom == 0.0 && xppi == 0) + { + xppi = img->xppi; + yppi = img->yppi; + } + + if (yppi == 0) + yppi = xppi; + + fprintf(stderr, "DEBUG: Before scaling: xppi=%d, yppi=%d, zoom=%.2f\n", + xppi, yppi, zoom); + + if (xppi > 0) + { + /* + * Scale the image as neccesary to match the desired pixels-per-inch. + */ + + if (Orientation & 1) + { + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + } + + fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", + xprint, yprint); + + xinches = (float)img->xsize / (float)xppi; + yinches = (float)img->ysize / (float)yppi; + + fprintf(stderr, "DEBUG: Image size is %.1f x %.1f inches...\n", + xinches, yinches); + + if ((val = cupsGetOption("natural-scaling", num_options, options)) != NULL) + { + xinches = xinches * atoi(val) / 100; + yinches = yinches * atoi(val) / 100; + } + + if (cupsGetOption("orientation-requested", num_options, options) == NULL && + cupsGetOption("landscape", num_options, options) == NULL) + { + /* + * Rotate the image if it will fit landscape but not portrait... + */ + + fputs("DEBUG: Auto orientation...\n", stderr); + + if ((xinches > xprint || yinches > yprint) && + xinches <= yprint && yinches <= xprint) + { + /* + * Rotate the image as needed... + */ + + fputs("DEBUG: Using landscape orientation...\n", stderr); + + Orientation = (Orientation + 1) & 3; + xsize = yprint; + yprint = xprint; + xprint = xsize; + } + } + } + else + { + /* + * Scale percentage of page size... + */ + + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + aspect = (float)img->yppi / (float)img->xppi; + + fprintf(stderr, "DEBUG: Before scaling: xprint=%.1f, yprint=%.1f\n", + xprint, yprint); + + fprintf(stderr, "DEBUG: img->xppi = %d, img->yppi = %d, aspect = %f\n", + img->xppi, img->yppi, aspect); + + xsize = xprint * zoom; + ysize = xsize * img->ysize / img->xsize / aspect; + + if (ysize > (yprint * zoom)) + { + ysize = yprint * zoom; + xsize = ysize * img->xsize * aspect / img->ysize; + } + + xsize2 = yprint * zoom; + ysize2 = xsize2 * img->ysize / img->xsize / aspect; + + if (ysize2 > (xprint * zoom)) + { + ysize2 = xprint * zoom; + xsize2 = ysize2 * img->xsize * aspect / img->ysize; + } + + fprintf(stderr, "DEBUG: Portrait size is %.2f x %.2f inches\n", xsize, ysize); + fprintf(stderr, "DEBUG: Landscape size is %.2f x %.2f inches\n", xsize2, ysize2); + + if (cupsGetOption("orientation-requested", num_options, options) == NULL && + cupsGetOption("landscape", num_options, options) == NULL) + { + /* + * Choose the rotation with the largest area, but prefer + * portrait if they are equal... + */ + + fputs("DEBUG: Auto orientation...\n", stderr); + + if ((xsize * ysize) < (xsize2 * xsize2)) + { + /* + * Do landscape orientation... + */ + + fputs("DEBUG: Using landscape orientation...\n", stderr); + + Orientation = 1; + xinches = xsize2; + yinches = ysize2; + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + /* + * Do portrait orientation... + */ + + fputs("DEBUG: Using portrait orientation...\n", stderr); + + Orientation = 0; + xinches = xsize; + yinches = ysize; + } + } + else if (Orientation & 1) + { + fputs("DEBUG: Using landscape orientation...\n", stderr); + + xinches = xsize2; + yinches = ysize2; + xprint = (PageTop - PageBottom) / 72.0; + yprint = (PageRight - PageLeft) / 72.0; + } + else + { + fputs("DEBUG: Using portrait orientation...\n", stderr); + + xinches = xsize; + yinches = ysize; + xprint = (PageRight - PageLeft) / 72.0; + yprint = (PageTop - PageBottom) / 72.0; + } + } + + /* + * Compute the number of pages to print and the size of the image on each + * page... + */ + + xpages = ceil(xinches / xprint); + ypages = ceil(yinches / yprint); + + xprint = xinches / xpages; + yprint = yinches / ypages; + + fprintf(stderr, "DEBUG: xpages = %dx%.2fin, ypages = %dx%.2fin\n", + xpages, xprint, ypages, yprint); + + /* + * Compute the bitmap size... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL && + _cups_strcasecmp(choice->choice, "Custom") == 0) + { + float width, /* New width in points */ + length; /* New length in points */ + + + /* + * Use the correct width and length for the current orientation... + */ + + if (Orientation & 1) + { + width = yprint * 72.0; + length = xprint * 72.0; + } + else + { + width = xprint * 72.0; + length = yprint * 72.0; + } + + /* + * Add margins to page size... + */ + + width += ppd->custom_margins[0] + ppd->custom_margins[2]; + length += ppd->custom_margins[1] + ppd->custom_margins[3]; + + /* + * Enforce minimums... + */ + + if (width < ppd->custom_min[0]) + width = ppd->custom_min[0]; + + if (length < ppd->custom_min[1]) + length = ppd->custom_min[1]; + + fprintf(stderr, "DEBUG: Updated custom page size to %.2f x %.2f inches...\n", + width / 72.0, length / 72.0); + + /* + * Set the new custom size... + */ + + strcpy(header.cupsPageSizeName, "Custom"); + + header.cupsPageSize[0] = width + 0.5; + header.cupsPageSize[1] = length + 0.5; + header.PageSize[0] = width + 0.5; + header.PageSize[1] = length + 0.5; + + /* + * Update page variables... + */ + + PageWidth = width; + PageLength = length; + PageLeft = ppd->custom_margins[0]; + PageRight = width - ppd->custom_margins[2]; + PageBottom = ppd->custom_margins[1]; + PageTop = length - ppd->custom_margins[3]; + + /* + * Remove margins from page size... + */ + + width -= ppd->custom_margins[0] + ppd->custom_margins[2]; + length -= ppd->custom_margins[1] + ppd->custom_margins[3]; + + /* + * Set the bitmap size... + */ + + header.cupsWidth = width * header.HWResolution[0] / 72.0; + header.cupsHeight = length * header.HWResolution[1] / 72.0; + + header.cupsBytesPerLine = (header.cupsBitsPerPixel * + header.cupsWidth + 7) / 8; + + if (header.cupsColorOrder == CUPS_ORDER_BANDED) + header.cupsBytesPerLine *= header.cupsNumColors; + } + + header.Margins[0] = PageLeft; + header.Margins[1] = PageBottom; + + fprintf(stderr, "DEBUG: PageSize = [%d %d]\n", header.PageSize[0], + header.PageSize[1]); + + switch (Orientation) + { + default : + switch (XPosition) + { + case -1 : + header.cupsImagingBBox[0] = PageLeft; + header.cupsImagingBBox[2] = PageLeft + xprint * 72; + break; + default : + header.cupsImagingBBox[0] = (PageRight + PageLeft - xprint * 72) / 2; + header.cupsImagingBBox[2] = (PageRight + PageLeft + xprint * 72) / 2; + break; + case 1 : + header.cupsImagingBBox[0] = PageRight - xprint * 72; + header.cupsImagingBBox[2] = PageRight; + break; + } + + switch (YPosition) + { + case -1 : + header.cupsImagingBBox[1] = PageBottom; + header.cupsImagingBBox[3] = PageBottom + yprint * 72; + break; + default : + header.cupsImagingBBox[1] = (PageTop + PageBottom - yprint * 72) / 2; + header.cupsImagingBBox[3] = (PageTop + PageBottom + yprint * 72) / 2; + break; + case 1 : + header.cupsImagingBBox[1] = PageTop - yprint * 72; + header.cupsImagingBBox[3] = PageTop; + break; + } + break; + + case 1 : + switch (XPosition) + { + case -1 : + header.cupsImagingBBox[0] = PageBottom; + header.cupsImagingBBox[2] = PageBottom + yprint * 72; + break; + default : + header.cupsImagingBBox[0] = (PageTop + PageBottom - yprint * 72) / 2; + header.cupsImagingBBox[2] = (PageTop + PageBottom + yprint * 72) / 2; + break; + case 1 : + header.cupsImagingBBox[0] = PageTop - yprint * 72; + header.cupsImagingBBox[2] = PageTop; + break; + } + + switch (YPosition) + { + case -1 : + header.cupsImagingBBox[1] = PageLeft; + header.cupsImagingBBox[3] = PageLeft + xprint * 72; + break; + default : + header.cupsImagingBBox[1] = (PageRight + PageLeft - xprint * 72) / 2; + header.cupsImagingBBox[3] = (PageRight + PageLeft + xprint * 72) / 2; + break; + case 1 : + header.cupsImagingBBox[1] = PageRight - xprint * 72; + header.cupsImagingBBox[3] = PageRight; + break; + } + break; + + case 2 : + switch (XPosition) + { + case 1 : + header.cupsImagingBBox[0] = PageLeft; + header.cupsImagingBBox[2] = PageLeft + xprint * 72; + break; + default : + header.cupsImagingBBox[0] = (PageRight + PageLeft - xprint * 72) / 2; + header.cupsImagingBBox[2] = (PageRight + PageLeft + xprint * 72) / 2; + break; + case -1 : + header.cupsImagingBBox[0] = PageRight - xprint * 72; + header.cupsImagingBBox[2] = PageRight; + break; + } + + switch (YPosition) + { + case 1 : + header.cupsImagingBBox[1] = PageBottom; + header.cupsImagingBBox[3] = PageBottom + yprint * 72; + break; + default : + header.cupsImagingBBox[1] = (PageTop + PageBottom - yprint * 72) / 2; + header.cupsImagingBBox[3] = (PageTop + PageBottom + yprint * 72) / 2; + break; + case -1 : + header.cupsImagingBBox[1] = PageTop - yprint * 72; + header.cupsImagingBBox[3] = PageTop; + break; + } + break; + + case 3 : + switch (XPosition) + { + case 1 : + header.cupsImagingBBox[0] = PageBottom; + header.cupsImagingBBox[2] = PageBottom + yprint * 72; + break; + default : + header.cupsImagingBBox[0] = (PageTop + PageBottom - yprint * 72) / 2; + header.cupsImagingBBox[2] = (PageTop + PageBottom + yprint * 72) / 2; + break; + case -1 : + header.cupsImagingBBox[0] = PageTop - yprint * 72; + header.cupsImagingBBox[2] = PageTop; + break; + } + + switch (YPosition) + { + case 1 : + header.cupsImagingBBox[1] = PageLeft; + header.cupsImagingBBox[3] = PageLeft + xprint * 72; + break; + default : + header.cupsImagingBBox[1] = (PageRight + PageLeft - xprint * 72) / 2; + header.cupsImagingBBox[3] = (PageRight + PageLeft + xprint * 72) / 2; + break; + case -1 : + header.cupsImagingBBox[1] = PageRight - xprint * 72; + header.cupsImagingBBox[3] = PageRight; + break; + } + break; + } + + header.ImagingBoundingBox[0] = header.cupsImagingBBox[0]; + header.ImagingBoundingBox[1] = header.cupsImagingBBox[1]; + header.ImagingBoundingBox[2] = header.cupsImagingBBox[2]; + header.ImagingBoundingBox[3] = header.cupsImagingBBox[3]; + + if (header.cupsColorOrder == CUPS_ORDER_PLANAR) + num_planes = header.cupsNumColors; + else + num_planes = 1; + + if (header.cupsBitsPerColor >= 8) + zoom_type = CUPS_IZOOM_NORMAL; + else + zoom_type = CUPS_IZOOM_FAST; + + /* + * See if we need to collate, and if so how we need to do it... + */ + + if (xpages == 1 && ypages == 1) + Collate = 0; + + slowcollate = Collate && ppdFindOption(ppd, "Collate") == NULL; + if (ppd != NULL) + slowcopies = ppd->manual_copies; + else + slowcopies = 1; + + if (Copies > 1 && !slowcollate && !slowcopies) + { + header.Collate = (cups_bool_t)Collate; + header.NumCopies = Copies; + + Copies = 1; + } + else + header.NumCopies = 1; + + /* + * Create the dithering lookup tables... + */ + + OnPixels[0] = 0x00; + OnPixels[255] = 0xff; + OffPixels[0] = 0x00; + OffPixels[255] = 0xff; + + switch (header.cupsBitsPerColor) + { + case 2 : + for (i = 1; i < 255; i ++) + { + OnPixels[i] = 0x55 * (i / 85 + 1); + OffPixels[i] = 0x55 * (i / 64); + } + break; + case 4 : + for (i = 1; i < 255; i ++) + { + OnPixels[i] = 17 * (i / 17 + 1); + OffPixels[i] = 17 * (i / 16); + } + break; + } + + /* + * Output the pages... + */ + + fprintf(stderr, "DEBUG: cupsWidth = %d\n", header.cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", header.cupsHeight); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header.cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header.cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header.cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header.cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header.cupsColorSpace); + fprintf(stderr, "DEBUG: img->colorspace = %d\n", img->colorspace); + + row = malloc(2 * header.cupsBytesPerLine); + ras = cupsRasterOpen(1, CUPS_RASTER_WRITE); + + for (i = 0, page = 1; i < Copies; i ++) + for (xpage = 0; xpage < xpages; xpage ++) + for (ypage = 0; ypage < ypages; ypage ++, page ++) + { + _cupsLangPrintFilter(stderr, "INFO", _("Formatting page %d."), page); + + if (Orientation & 1) + { + xc0 = img->xsize * ypage / ypages; + xc1 = img->xsize * (ypage + 1) / ypages - 1; + yc0 = img->ysize * xpage / xpages; + yc1 = img->ysize * (xpage + 1) / xpages - 1; + + xtemp = header.HWResolution[0] * yprint; + ytemp = header.HWResolution[1] * xprint; + } + else + { + xc0 = img->xsize * xpage / xpages; + xc1 = img->xsize * (xpage + 1) / xpages - 1; + yc0 = img->ysize * ypage / ypages; + yc1 = img->ysize * (ypage + 1) / ypages - 1; + + xtemp = header.HWResolution[0] * xprint; + ytemp = header.HWResolution[1] * yprint; + } + + cupsRasterWriteHeader2(ras, &header); + + for (plane = 0; plane < num_planes; plane ++) + { + /* + * Initialize the image "zoom" engine... + */ + + if (Flip) + z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, -xtemp, ytemp, + Orientation & 1, zoom_type); + else + z = _cupsImageZoomNew(img, xc0, yc0, xc1, yc1, xtemp, ytemp, + Orientation & 1, zoom_type); + + /* + * Write leading blank space as needed... + */ + + if (header.cupsHeight > z->ysize && YPosition <= 0) + { + blank_line(&header, row); + + y = header.cupsHeight - z->ysize; + if (YPosition == 0) + y /= 2; + + fprintf(stderr, "DEBUG: Writing %d leading blank lines...\n", y); + + for (; y > 0; y --) + { + if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < + header.cupsBytesPerLine) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to send raster data to the " + "driver.")); + cupsImageClose(img); + exit(1); + } + } + } + + /* + * Then write image data... + */ + + for (y = z->ysize, yerr0 = 0, yerr1 = z->ysize, iy = 0, last_iy = -2; + y > 0; + y --) + { + if (iy != last_iy) + { + if (zoom_type != CUPS_IZOOM_FAST && (iy - last_iy) > 1) + _cupsImageZoomFill(z, iy); + + _cupsImageZoomFill(z, iy + z->yincr); + + last_iy = iy; + } + + /* + * Format this line of raster data for the printer... + */ + + blank_line(&header, row); + + r0 = z->rows[z->row]; + r1 = z->rows[1 - z->row]; + + switch (header.cupsColorSpace) + { + case CUPS_CSPACE_W : + format_W(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + default : + case CUPS_CSPACE_RGB : + format_RGB(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_RGBA : + case CUPS_CSPACE_RGBW : + format_RGBA(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_K : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + format_K(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_CMY : + format_CMY(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_YMC : + format_YMC(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_CMYK : + format_CMYK(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + format_YMCK(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + case CUPS_CSPACE_KCMYcm : + if (header.cupsBitsPerColor == 1) + { + format_KCMYcm(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + } + case CUPS_CSPACE_KCMY : + format_KCMY(&header, row, y, plane, z->xsize, z->ysize, + yerr0, yerr1, r0, r1); + break; + } + + /* + * Write the raster data to the driver... + */ + + if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < + header.cupsBytesPerLine) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to send raster data to the " + "driver.")); + cupsImageClose(img); + exit(1); + } + + /* + * Compute the next scanline in the image... + */ + + iy += z->ystep; + yerr0 += z->ymod; + yerr1 -= z->ymod; + if (yerr1 <= 0) + { + yerr0 -= z->ysize; + yerr1 += z->ysize; + iy += z->yincr; + } + } + + /* + * Write trailing blank space as needed... + */ + + if (header.cupsHeight > z->ysize && YPosition >= 0) + { + blank_line(&header, row); + + y = header.cupsHeight - z->ysize; + if (YPosition == 0) + y = y - y / 2; + + fprintf(stderr, "DEBUG: Writing %d trailing blank lines...\n", y); + + for (; y > 0; y --) + { + if (cupsRasterWritePixels(ras, row, header.cupsBytesPerLine) < + header.cupsBytesPerLine) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to send raster data to the " + "driver.")); + cupsImageClose(img); + exit(1); + } + } + } + + /* + * Free memory used for the "zoom" engine... + */ + + _cupsImageZoomDelete(z); + } + } + + /* + * Close files... + */ + + free(row); + cupsRasterClose(ras); + cupsImageClose(img); + ppdClose(ppd); + + return (0); +} + + +/* + * 'blank_line()' - Clear a line buffer to the blank value... + */ + +static void +blank_line(cups_page_header2_t *header, /* I - Page header */ + unsigned char *row) /* I - Row buffer */ +{ + int count; /* Remaining bytes */ + + + count = header->cupsBytesPerLine; + + switch (header->cupsColorSpace) + { + case CUPS_CSPACE_CIEXYZ : + while (count > 2) + { + *row++ = 242; + *row++ = 255; + *row++ = 255; + count -= 3; + } + break; + + case CUPS_CSPACE_CIELab : + case CUPS_CSPACE_ICC1 : + case CUPS_CSPACE_ICC2 : + case CUPS_CSPACE_ICC3 : + case CUPS_CSPACE_ICC4 : + case CUPS_CSPACE_ICC5 : + case CUPS_CSPACE_ICC6 : + case CUPS_CSPACE_ICC7 : + case CUPS_CSPACE_ICC8 : + case CUPS_CSPACE_ICC9 : + case CUPS_CSPACE_ICCA : + case CUPS_CSPACE_ICCB : + case CUPS_CSPACE_ICCC : + case CUPS_CSPACE_ICCD : + case CUPS_CSPACE_ICCE : + case CUPS_CSPACE_ICCF : + while (count > 2) + { + *row++ = 255; + *row++ = 128; + *row++ = 128; + count -= 3; + } + break; + + case CUPS_CSPACE_K : + case CUPS_CSPACE_CMY : + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_YMC : + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_KCMY : + case CUPS_CSPACE_KCMYcm : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + memset(row, 0, count); + break; + + default : + memset(row, 255, count); + break; + } +} + + +/* + * 'format_CMY()' - Convert image data to CMY. + */ + +static void +format_CMY(cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 3; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 64 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 2; + else + { + bitmask = 64; + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[0] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[0]]); + else + *ptr ^= (0x30 & OffPixels[r0[0]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[1]]); + else + *ptr ^= (0x0c & OffPixels[r0[1]]); + + if ((r0[2] & 63) > dither[x & 7]) + *ptr++ ^= (0x03 & OnPixels[r0[2]]); + else + *ptr++ ^= (0x03 & OffPixels[r0[2]]); + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[0] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[0]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[0]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[1]]); + else + *ptr ^= (0xf0 & OffPixels[r0[1]]); + + if ((r0[2] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[2]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[2]]); + } + break; + + case 8 : + for (x = xsize * 3; x > 0; x --, r0 ++, r1 ++) + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + break; + } + break; + + case CUPS_ORDER_BANDED : + cptr = ptr; + mptr = ptr + bandwidth; + yptr = ptr + 2 * bandwidth; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *cptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *mptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *yptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + switch (z) + { + case 0 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[0] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 1 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[1] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[2] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + r0 += z; + r1 += z; + + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'format_CMYK()' - Convert image data to CMYK. + */ + +static void +format_CMYK(cups_page_header2_t *header,/* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + int pc, pm, py; /* CMY pixels */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 4; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 128 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + { + bitmask >>= 3; + *ptr ^= bitmask; + } + else + { + if (pc) + *ptr ^= bitmask; + bitmask >>= 1; + + if (pm) + *ptr ^= bitmask; + bitmask >>= 1; + + if (py) + *ptr ^= bitmask; + bitmask >>= 1; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 128; + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[0] & 63) > dither[x & 7]) + *ptr ^= (0xc0 & OnPixels[r0[0]]); + else + *ptr ^= (0xc0 & OffPixels[r0[0]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[1]]); + else + *ptr ^= (0x30 & OffPixels[r0[1]]); + + if ((r0[2] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[2]]); + else + *ptr ^= (0x0c & OffPixels[r0[2]]); + + if ((r0[3] & 63) > dither[x & 7]) + *ptr++ ^= (0x03 & OnPixels[r0[3]]); + else + *ptr++ ^= (0x03 & OffPixels[r0[3]]); + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[0] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[0]]); + else + *ptr ^= (0xf0 & OffPixels[r0[0]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[1]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[1]]); + + if ((r0[2] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[2]]); + else + *ptr ^= (0xf0 & OffPixels[r0[2]]); + + if ((r0[3] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[3]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[3]]); + } + break; + + case 8 : + for (x = xsize * 4; x > 0; x --, r0 ++, r1 ++) + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + break; + } + break; + + case CUPS_ORDER_BANDED : + cptr = ptr; + mptr = ptr + bandwidth; + yptr = ptr + 2 * bandwidth; + kptr = ptr + 3 * bandwidth; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + *kptr ^= bitmask; + else + { + if (pc) + *cptr ^= bitmask; + if (pm) + *mptr ^= bitmask; + if (py) + *yptr ^= bitmask; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + if (r0[3] == r1[3]) + *kptr++ = r0[3]; + else + *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if ((pc && pm && py && z == 3) || + (pc && z == 0) || (pm && z == 1) || (py && z == 2)) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + r0 += z; + r1 += z; + + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'format_K()' - Convert image data to black. + */ + +static void +format_K(cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + (void)z; + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0++]); + else + *ptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0++]); + else + *ptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 ++, r1 ++) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } +} + + +/* + * 'format_KCMY()' - Convert image data to KCMY. + */ + +static void +format_KCMY(cups_page_header2_t *header,/* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + int pc, pm, py; /* CMY pixels */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 4; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 128 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + { + *ptr ^= bitmask; + bitmask >>= 3; + } + else + { + bitmask >>= 1; + if (pc) + *ptr ^= bitmask; + + bitmask >>= 1; + if (pm) + *ptr ^= bitmask; + + bitmask >>= 1; + if (py) + *ptr ^= bitmask; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 128; + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[3] & 63) > dither[x & 7]) + *ptr ^= (0xc0 & OnPixels[r0[3]]); + else + *ptr ^= (0xc0 & OffPixels[r0[3]]); + + if ((r0[0] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[0]]); + else + *ptr ^= (0x30 & OffPixels[r0[0]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[1]]); + else + *ptr ^= (0x0c & OffPixels[r0[1]]); + + if ((r0[2] & 63) > dither[x & 7]) + *ptr++ ^= (0x03 & OnPixels[r0[2]]); + else + *ptr++ ^= (0x03 & OffPixels[r0[2]]); + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[3] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[3]]); + else + *ptr ^= (0xf0 & OffPixels[r0[3]]); + + if ((r0[0] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[0]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[0]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[1]]); + else + *ptr ^= (0xf0 & OffPixels[r0[1]]); + + if ((r0[2] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[2]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[2]]); + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (r0[3] == r1[3]) + *ptr++ = r0[3]; + else + *ptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; + + if (r0[0] == r1[0]) + *ptr++ = r0[0]; + else + *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *ptr++ = r0[1]; + else + *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *ptr++ = r0[2]; + else + *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_BANDED : + kptr = ptr; + cptr = ptr + bandwidth; + mptr = ptr + 2 * bandwidth; + yptr = ptr + 3 * bandwidth; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + *kptr ^= bitmask; + else + { + if (pc) + *cptr ^= bitmask; + if (pm) + *mptr ^= bitmask; + if (py) + *yptr ^= bitmask; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + if (r0[3] == r1[3]) + *kptr++ = r0[3]; + else + *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if ((pc && pm && py && z == 0) || + (pc && z == 1) || (pm && z == 2) || (py && z == 3)) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + if (z == 0) + r0 += 3; + else + r0 += z - 1; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + if (z == 0) + r0 += 3; + else + r0 += z - 1; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + if (z == 0) + { + r0 += 3; + r1 += 3; + } + else + { + r0 += z - 1; + r1 += z - 1; + } + + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'format_KCMYcm()' - Convert image data to KCMYcm. + */ + +static void +format_KCMYcm( + cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + int pc, pm, py, pk; /* Cyan, magenta, yellow, and black values */ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + *lcptr, /* Pointer into light cyan */ + *lmptr, /* Pointer into light magenta */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 6; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + pk = pc && pm && py; + + if (pk) + *ptr++ ^= 32; /* Black */ + else if (pc && pm) + *ptr++ ^= 17; /* Blue (cyan + light magenta) */ + else if (pc && py) + *ptr++ ^= 6; /* Green (light cyan + yellow) */ + else if (pm && py) + *ptr++ ^= 12; /* Red (magenta + yellow) */ + else if (pc) + *ptr++ ^= 16; + else if (pm) + *ptr++ ^= 8; + else if (py) + *ptr++ ^= 4; + else + ptr ++; + } + break; + + case CUPS_ORDER_BANDED : + kptr = ptr; + cptr = ptr + bandwidth; + mptr = ptr + 2 * bandwidth; + yptr = ptr + 3 * bandwidth; + lcptr = ptr + 4 * bandwidth; + lmptr = ptr + 5 * bandwidth; + + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + pk = pc && pm && py; + + if (pk) + *kptr ^= bitmask; /* Black */ + else if (pc && pm) + { + *cptr ^= bitmask; /* Blue (cyan + light magenta) */ + *lmptr ^= bitmask; + } + else if (pc && py) + { + *lcptr ^= bitmask; /* Green (light cyan + yellow) */ + *yptr ^= bitmask; + } + else if (pm && py) + { + *mptr ^= bitmask; /* Red (magenta + yellow) */ + *yptr ^= bitmask; + } + else if (pc) + *cptr ^= bitmask; + else if (pm) + *mptr ^= bitmask; + else if (py) + *yptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + kptr ++; + lcptr ++; + lmptr ++; + } + } + break; + + case CUPS_ORDER_PLANAR : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + pk = pc && pm && py; + + if (pk && z == 0) + *ptr ^= bitmask; + else if (pc && pm && (z == 1 || z == 5)) + *ptr ^= bitmask; /* Blue (cyan + light magenta) */ + else if (pc && py && (z == 3 || z == 4)) + *ptr ^= bitmask; /* Green (light cyan + yellow) */ + else if (pm && py && (z == 2 || z == 3)) + *ptr ^= bitmask; /* Red (magenta + yellow) */ + else if (pc && z == 1) + *ptr ^= bitmask; + else if (pm && z == 2) + *ptr ^= bitmask; + else if (py && z == 3) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + } +} + + +/* + * 'format_RGBA()' - Convert image data to RGBA/RGBW. + */ + +static void +format_RGBA(cups_page_header2_t *header,/* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 4; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 128 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 2) + bitmask >>= 2; + else + { + bitmask = 128; + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[0] & 63) > dither[x & 7]) + *ptr ^= (0xc0 & OnPixels[r0[0]]); + else + *ptr ^= (0xc0 & OffPixels[r0[0]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[1]]); + else + *ptr ^= (0x30 & OffPixels[r0[1]]); + + if ((r0[2] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[2]]); + else + *ptr ^= (0x0c & OffPixels[r0[2]]); + + ptr ++; + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[0] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[0]]); + else + *ptr ^= (0xf0 & OffPixels[r0[0]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[1]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[1]]); + + if ((r0[2] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[2]]); + else + *ptr ^= (0xf0 & OffPixels[r0[2]]); + + ptr ++; + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (r0[0] == r1[0]) + *ptr++ = r0[0]; + else + *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *ptr++ = r0[1]; + else + *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *ptr++ = r0[2]; + else + *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + ptr ++; + } + break; + } + break; + + case CUPS_ORDER_BANDED : + cptr = ptr; + mptr = ptr + bandwidth; + yptr = ptr + 2 * bandwidth; + + memset(ptr + 3 * bandwidth, 255, bandwidth); + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *cptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *mptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *yptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + if (z == 3) + { + memset(row, 255, header->cupsBytesPerLine); + break; + } + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + switch (z) + { + case 0 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[0] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 1 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[1] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[2] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + r0 += z; + r1 += z; + + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'format_W()' - Convert image data to luminance. + */ + +static void +format_W(cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + (void)z; + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0++]); + else + *ptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0++]); + else + *ptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 ++, r1 ++) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } +} + + +/* + * 'format_YMC()' - Convert image data to YMC. + */ + +static void +format_YMC(cups_page_header2_t *header, /* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 3; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 64 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if (r0[2] > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (r0[1] > dither[x & 15]) + *ptr ^= bitmask; + bitmask >>= 1; + + if (r0[0] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 2; + else + { + bitmask = 64; + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[2] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[2]]); + else + *ptr ^= (0x30 & OffPixels[r0[2]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[1]]); + else + *ptr ^= (0x0c & OffPixels[r0[1]]); + + if ((r0[0] & 63) > dither[x & 7]) + *ptr++ ^= (0x03 & OnPixels[r0[0]]); + else + *ptr++ ^= (0x03 & OffPixels[r0[0]]); + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 3) + { + if ((r0[2] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[2]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[2]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[1]]); + else + *ptr ^= (0xf0 & OffPixels[r0[1]]); + + if ((r0[0] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[0]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[0]]); + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (r0[2] == r1[2]) + *ptr++ = r0[2]; + else + *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *ptr++ = r0[1]; + else + *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[0] == r1[0]) + *ptr++ = r0[0]; + else + *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_BANDED : + yptr = ptr; + mptr = ptr + bandwidth; + cptr = ptr + 2 * bandwidth; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + if (*r0++ > dither[x & 15]) + *cptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *mptr ^= bitmask; + if (*r0++ > dither[x & 15]) + *yptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + switch (z) + { + case 2 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[0] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 1 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[1] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 0 : + for (x = xsize; x > 0; x --, r0 += 3) + { + if (r0[2] > dither[x & 15]) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + z = 2 - z; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + z = 2 - z; + r0 += z; + + for (x = xsize; x > 0; x --, r0 += 3) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + z = 2 - z; + r0 += z; + r1 += z; + + for (x = xsize; x > 0; x --, r0 += 3, r1 += 3) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'format_YMCK()' - Convert image data to YMCK. + */ + +static void +format_YMCK(cups_page_header2_t *header,/* I - Page header */ + unsigned char *row, /* IO - Bitmap data for device */ + int y, /* I - Current row */ + int z, /* I - Current plane */ + int xsize, /* I - Width of image data */ + int ysize, /* I - Height of image data */ + int yerr0, /* I - Top Y error */ + int yerr1, /* I - Bottom Y error */ + cups_ib_t *r0, /* I - Primary image data */ + cups_ib_t *r1) /* I - Image data for interpolation */ +{ + cups_ib_t *ptr, /* Pointer into row */ + *cptr, /* Pointer into cyan */ + *mptr, /* Pointer into magenta */ + *yptr, /* Pointer into yellow */ + *kptr, /* Pointer into black */ + bitmask; /* Current mask for pixel */ + int bitoffset; /* Current offset in line */ + int bandwidth; /* Width of a color band */ + int x, /* Current X coordinate on page */ + *dither; /* Pointer into dither array */ + int pc, pm, py; /* CMY pixels */ + + + switch (XPosition) + { + case -1 : + bitoffset = 0; + break; + default : + bitoffset = header->cupsBitsPerPixel * ((header->cupsWidth - xsize) / 2); + break; + case 1 : + bitoffset = header->cupsBitsPerPixel * (header->cupsWidth - xsize); + break; + } + + ptr = row + bitoffset / 8; + bandwidth = header->cupsBytesPerLine / 4; + + switch (header->cupsColorOrder) + { + case CUPS_ORDER_CHUNKED : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 128 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize ; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + { + bitmask >>= 3; + *ptr ^= bitmask; + } + else + { + if (py) + *ptr ^= bitmask; + bitmask >>= 1; + + if (pm) + *ptr ^= bitmask; + bitmask >>= 1; + + if (pc) + *ptr ^= bitmask; + bitmask >>= 1; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 128; + + ptr ++; + } + } + break; + + case 2 : + dither = Floyd8x8[y & 7]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[2] & 63) > dither[x & 7]) + *ptr ^= (0xc0 & OnPixels[r0[2]]); + else + *ptr ^= (0xc0 & OffPixels[r0[2]]); + + if ((r0[1] & 63) > dither[x & 7]) + *ptr ^= (0x30 & OnPixels[r0[1]]); + else + *ptr ^= (0x30 & OffPixels[r0[1]]); + + if ((r0[0] & 63) > dither[x & 7]) + *ptr ^= (0x0c & OnPixels[r0[0]]); + else + *ptr ^= (0x0c & OffPixels[r0[0]]); + + if ((r0[3] & 63) > dither[x & 7]) + *ptr++ ^= (0x03 & OnPixels[r0[3]]); + else + *ptr++ ^= (0x03 & OffPixels[r0[3]]); + } + break; + + case 4 : + dither = Floyd4x4[y & 3]; + + for (x = xsize ; x > 0; x --, r0 += 4) + { + if ((r0[2] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[2]]); + else + *ptr ^= (0xf0 & OffPixels[r0[2]]); + + if ((r0[1] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[1]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[1]]); + + if ((r0[0] & 15) > dither[x & 3]) + *ptr ^= (0xf0 & OnPixels[r0[0]]); + else + *ptr ^= (0xf0 & OffPixels[r0[0]]); + + if ((r0[3] & 15) > dither[x & 3]) + *ptr++ ^= (0x0f & OnPixels[r0[3]]); + else + *ptr++ ^= (0x0f & OffPixels[r0[3]]); + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (r0[2] == r1[2]) + *ptr++ = r0[2]; + else + *ptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *ptr++ = r0[1]; + else + *ptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[0] == r1[0]) + *ptr++ = r0[0]; + else + *ptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[3] == r1[3]) + *ptr++ = r0[3]; + else + *ptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_BANDED : + yptr = ptr; + mptr = ptr + bandwidth; + cptr = ptr + 2 * bandwidth; + kptr = ptr + 3 * bandwidth; + + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if (pc && pm && py) + *kptr ^= bitmask; + else + { + if (pc) + *cptr ^= bitmask; + if (pm) + *mptr ^= bitmask; + if (py) + *yptr ^= bitmask; + } + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 63) > dither[x & 7]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 63) > dither[x & 7]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + + for (x = xsize; x > 0; x --) + { + if ((*r0 & 15) > dither[x & 3]) + *cptr ^= (bitmask & OnPixels[*r0++]); + else + *cptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *mptr ^= (bitmask & OnPixels[*r0++]); + else + *mptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *yptr ^= (bitmask & OnPixels[*r0++]); + else + *yptr ^= (bitmask & OffPixels[*r0++]); + + if ((*r0 & 15) > dither[x & 3]) + *kptr ^= (bitmask & OnPixels[*r0++]); + else + *kptr ^= (bitmask & OffPixels[*r0++]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + cptr ++; + mptr ++; + yptr ++; + kptr ++; + } + } + break; + + case 8 : + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (r0[0] == r1[0]) + *cptr++ = r0[0]; + else + *cptr++ = (r0[0] * yerr0 + r1[0] * yerr1) / ysize; + + if (r0[1] == r1[1]) + *mptr++ = r0[1]; + else + *mptr++ = (r0[1] * yerr0 + r1[1] * yerr1) / ysize; + + if (r0[2] == r1[2]) + *yptr++ = r0[2]; + else + *yptr++ = (r0[2] * yerr0 + r1[2] * yerr1) / ysize; + + if (r0[3] == r1[3]) + *kptr++ = r0[3]; + else + *kptr++ = (r0[3] * yerr0 + r1[3] * yerr1) / ysize; + } + break; + } + break; + + case CUPS_ORDER_PLANAR : + switch (header->cupsBitsPerColor) + { + case 1 : + bitmask = 0x80 >> (bitoffset & 7); + dither = Floyd16x16[y & 15]; + + for (x = xsize; x > 0; x --) + { + pc = *r0++ > dither[x & 15]; + pm = *r0++ > dither[x & 15]; + py = *r0++ > dither[x & 15]; + + if ((pc && pm && py && z == 3) || + (pc && z == 2) || (pm && z == 1) || (py && z == 0)) + *ptr ^= bitmask; + + if (bitmask > 1) + bitmask >>= 1; + else + { + bitmask = 0x80; + ptr ++; + } + } + break; + + case 2 : + bitmask = 0xc0 >> (bitoffset & 7); + dither = Floyd8x8[y & 7]; + if (z == 3) + r0 += 3; + else + r0 += 2 - z; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 63) > dither[x & 7]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask > 3) + bitmask >>= 2; + else + { + bitmask = 0xc0; + + ptr ++; + } + } + break; + + case 4 : + bitmask = 0xf0 >> (bitoffset & 7); + dither = Floyd4x4[y & 3]; + if (z == 3) + r0 += 3; + else + r0 += 2 - z; + + for (x = xsize; x > 0; x --, r0 += 4) + { + if ((*r0 & 15) > dither[x & 3]) + *ptr ^= (bitmask & OnPixels[*r0]); + else + *ptr ^= (bitmask & OffPixels[*r0]); + + if (bitmask == 0xf0) + bitmask = 0x0f; + else + { + bitmask = 0xf0; + + ptr ++; + } + } + break; + + case 8 : + if (z == 3) + { + r0 += 3; + r1 += 3; + } + else + { + r0 += 2 - z; + r1 += 2 - z; + } + + for (x = xsize; x > 0; x --, r0 += 4, r1 += 4) + { + if (*r0 == *r1) + *ptr++ = *r0; + else + *ptr++ = (*r0 * yerr0 + *r1 * yerr1) / ysize; + } + break; + } + break; + } +} + + +/* + * 'make_lut()' - Make a lookup table given gamma and brightness values. + */ + +static void +make_lut(cups_ib_t *lut, /* I - Lookup table */ + int colorspace, /* I - Colorspace */ + float g, /* I - Image gamma */ + float b) /* I - Image brightness */ +{ + int i; /* Looping var */ + int v; /* Current value */ + + + g = 1.0 / g; + b = 1.0 / b; + + for (i = 0; i < 256; i ++) + { + if (colorspace < 0) + v = 255.0 * b * (1.0 - pow(1.0 - (float)i / 255.0, g)) + 0.5; + else + v = 255.0 * (1.0 - b * (1.0 - pow((float)i / 255.0, g))) + 0.5; + + if (v < 0) + *lut++ = 0; + else if (v > 255) + *lut++ = 255; + else + *lut++ = v; + } +} + + +/* + * 'raster_cb()' - Validate the page header. + */ + +static int /* O - 0 if OK, -1 if not */ +raster_cb( + cups_page_header2_t *header, /* IO - Raster header */ + int preferred_bits) /* I - Preferred bits per color */ +{ + /* + * Ensure that colorimetric colorspaces use at least 8 bits per + * component... + */ + + if ((header->cupsColorSpace == CUPS_CSPACE_CIEXYZ || + header->cupsColorSpace == CUPS_CSPACE_CIELab || + header->cupsColorSpace >= CUPS_CSPACE_ICC1) && + header->cupsBitsPerColor < 8) + header->cupsBitsPerColor = 8; + + return (0); +} + + +/* + * End of "$Id: imagetoraster.c 9808 2011-05-26 12:03:28Z mike $". + */ diff --git a/filter/interpret.c b/filter/interpret.c new file mode 100644 index 0000000..81774dd --- /dev/null +++ b/filter/interpret.c @@ -0,0 +1,1688 @@ +/* + * "$Id: interpret.c 9955 2011-09-02 18:14:34Z mike $" + * + * PPD command interpreter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsRasterInterpretPPD() - Interpret PPD commands to create a page header. + * _cupsRasterExecPS() - Execute PostScript code to initialize a page + * header. + * cleartomark_stack() - Clear to the last mark ([) on the stack. + * copy_stack() - Copy the top N stack objects. + * delete_stack() - Free memory used by a stack. + * error_object() - Add an object's value to the current error + * message. + * error_stack() - Add a stack to the current error message. + * index_stack() - Copy the Nth value on the stack. + * new_stack() - Create a new stack. + * pop_stock() - Pop the top object off the stack. + * push_stack() - Push an object on the stack. + * roll_stack() - Rotate stack objects. + * scan_ps() - Scan a string for the next PS object. + * setpagedevice() - Simulate the PostScript setpagedevice operator. + * DEBUG_object() - Print an object value. + * DEBUG_stack() - Print a stack. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" + + +/* + * Stack values for the PostScript mini-interpreter... + */ + +typedef enum +{ + CUPS_PS_NAME, + CUPS_PS_NUMBER, + CUPS_PS_STRING, + CUPS_PS_BOOLEAN, + CUPS_PS_NULL, + CUPS_PS_START_ARRAY, + CUPS_PS_END_ARRAY, + CUPS_PS_START_DICT, + CUPS_PS_END_DICT, + CUPS_PS_START_PROC, + CUPS_PS_END_PROC, + CUPS_PS_CLEARTOMARK, + CUPS_PS_COPY, + CUPS_PS_DUP, + CUPS_PS_INDEX, + CUPS_PS_POP, + CUPS_PS_ROLL, + CUPS_PS_SETPAGEDEVICE, + CUPS_PS_STOPPED, + CUPS_PS_OTHER +} _cups_ps_type_t; + +typedef struct +{ + _cups_ps_type_t type; /* Object type */ + union + { + int boolean; /* Boolean value */ + char name[64]; /* Name value */ + double number; /* Number value */ + char other[64]; /* Other operator */ + char string[64]; /* Sring value */ + } value; /* Value */ +} _cups_ps_obj_t; + +typedef struct +{ + int num_objs, /* Number of objects on stack */ + alloc_objs; /* Number of allocated objects */ + _cups_ps_obj_t *objs; /* Objects in stack */ +} _cups_ps_stack_t; + + +/* + * Local functions... + */ + +static int cleartomark_stack(_cups_ps_stack_t *st); +static int copy_stack(_cups_ps_stack_t *st, int count); +static void delete_stack(_cups_ps_stack_t *st); +static void error_object(_cups_ps_obj_t *obj); +static void error_stack(_cups_ps_stack_t *st, const char *title); +static _cups_ps_obj_t *index_stack(_cups_ps_stack_t *st, int n); +static _cups_ps_stack_t *new_stack(void); +static _cups_ps_obj_t *pop_stack(_cups_ps_stack_t *st); +static _cups_ps_obj_t *push_stack(_cups_ps_stack_t *st, + _cups_ps_obj_t *obj); +static int roll_stack(_cups_ps_stack_t *st, int c, int s); +static _cups_ps_obj_t *scan_ps(_cups_ps_stack_t *st, char **ptr); +static int setpagedevice(_cups_ps_stack_t *st, + cups_page_header2_t *h, + int *preferred_bits); +#ifdef DEBUG +static void DEBUG_object(_cups_ps_obj_t *obj); +static void DEBUG_stack(_cups_ps_stack_t *st); +#endif /* DEBUG */ + + +/* + * 'cupsRasterInterpretPPD()' - Interpret PPD commands to create a page header. + * + * This function is used by raster image processing (RIP) filters like + * cgpdftoraster and imagetoraster when writing CUPS raster data for a page. + * It is not used by raster printer driver filters which only read CUPS + * raster data. + * + * + * @code cupsRasterInterpretPPD@ does not mark the options in the PPD using + * the "num_options" and "options" arguments. Instead, mark the options with + * @code cupsMarkOptions@ and @code ppdMarkOption@ prior to calling it - + * this allows for per-page options without manipulating the options array. + * + * The "func" argument specifies an optional callback function that is + * called prior to the computation of the final raster data. The function + * can make changes to the @link cups_page_header2_t@ data as needed to use a + * supported raster format and then returns 0 on success and -1 if the + * requested attributes cannot be supported. + * + * + * @code cupsRasterInterpretPPD@ supports a subset of the PostScript language. + * Currently only the @code [@, @code ]@, @code <<@, @code >>@, @code {@, + * @code }@, @code cleartomark@, @code copy@, @code dup@, @code index@, + * @code pop@, @code roll@, @code setpagedevice@, and @code stopped@ operators + * are supported. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +int /* O - 0 on success, -1 on failure */ +cupsRasterInterpretPPD( + cups_page_header2_t *h, /* O - Page header to create */ + ppd_file_t *ppd, /* I - PPD file */ + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + cups_interpret_cb_t func) /* I - Optional page header callback (@code NULL@ for none) */ +{ + int status; /* Cummulative status */ + char *code; /* Code to run */ + const char *val; /* Option value */ + ppd_size_t *size; /* Current size */ + float left, /* Left position */ + bottom, /* Bottom position */ + right, /* Right position */ + top; /* Top position */ + int preferred_bits; /* Preferred bits per color */ + + + /* + * Range check input... + */ + + _cupsRasterClearError(); + + if (!h) + { + _cupsRasterAddError("Page header cannot be NULL!\n"); + return (-1); + } + + /* + * Reset the page header to the defaults... + */ + + memset(h, 0, sizeof(cups_page_header2_t)); + + h->NumCopies = 1; + h->PageSize[0] = 612; + h->PageSize[1] = 792; + h->HWResolution[0] = 100; + h->HWResolution[1] = 100; + h->cupsBitsPerColor = 1; + h->cupsColorOrder = CUPS_ORDER_CHUNKED; + h->cupsColorSpace = CUPS_CSPACE_K; + h->cupsBorderlessScalingFactor = 1.0f; + h->cupsPageSize[0] = 612.0f; + h->cupsPageSize[1] = 792.0f; + h->cupsImagingBBox[0] = 0.0f; + h->cupsImagingBBox[1] = 0.0f; + h->cupsImagingBBox[2] = 612.0f; + h->cupsImagingBBox[3] = 792.0f; + + strcpy(h->cupsPageSizeName, "Letter"); + +#ifdef __APPLE__ + /* + * cupsInteger0 is also used for the total page count on Mac OS X; set an + * uncommon default value so we can tell if the driver is using cupsInteger0. + */ + + h->cupsInteger[0] = 0x80000000; +#endif /* __APPLE__ */ + + /* + * Apply patches and options to the page header... + */ + + status = 0; + preferred_bits = 0; + + if (ppd) + { + /* + * Apply any patch code (used to override the defaults...) + */ + + if (ppd->patches) + status |= _cupsRasterExecPS(h, &preferred_bits, ppd->patches); + + /* + * Then apply printer options in the proper order... + */ + + if ((code = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, 0.0)) != NULL) + { + status |= _cupsRasterExecPS(h, &preferred_bits, code); + free(code); + } + + if ((code = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL) + { + status |= _cupsRasterExecPS(h, &preferred_bits, code); + free(code); + } + + if ((code = ppdEmitString(ppd, PPD_ORDER_PROLOG, 0.0)) != NULL) + { + status |= _cupsRasterExecPS(h, &preferred_bits, code); + free(code); + } + + if ((code = ppdEmitString(ppd, PPD_ORDER_PAGE, 0.0)) != NULL) + { + status |= _cupsRasterExecPS(h, &preferred_bits, code); + free(code); + } + } + + /* + * Allow option override for page scaling... + */ + + if ((val = cupsGetOption("cupsBorderlessScalingFactor", num_options, + options)) != NULL) + { + double sc = atof(val); /* Scale factor */ + + if (sc >= 0.1 && sc <= 2.0) + h->cupsBorderlessScalingFactor = (float)sc; + } + + /* + * Get the margins for the current size... + */ + + if ((size = ppdPageSize(ppd, NULL)) != NULL) + { + /* + * Use the margins from the PPD file... + */ + + left = size->left; + bottom = size->bottom; + right = size->right; + top = size->top; + + strlcpy(h->cupsPageSizeName, size->name, sizeof(h->cupsPageSizeName)); + + h->cupsPageSize[0] = size->width; + h->cupsPageSize[1] = size->length; + } + else + { + /* + * Use the default margins... + */ + + left = 0.0f; + bottom = 0.0f; + right = 612.0f; + top = 792.0f; + } + + h->PageSize[0] = (unsigned)(h->cupsPageSize[0] * + h->cupsBorderlessScalingFactor); + h->PageSize[1] = (unsigned)(h->cupsPageSize[1] * + h->cupsBorderlessScalingFactor); + h->Margins[0] = (unsigned)(left * + h->cupsBorderlessScalingFactor); + h->Margins[1] = (unsigned)(bottom * + h->cupsBorderlessScalingFactor); + h->ImagingBoundingBox[0] = (unsigned)(left * + h->cupsBorderlessScalingFactor); + h->ImagingBoundingBox[1] = (unsigned)(bottom * + h->cupsBorderlessScalingFactor); + h->ImagingBoundingBox[2] = (unsigned)(right * + h->cupsBorderlessScalingFactor); + h->ImagingBoundingBox[3] = (unsigned)(top * + h->cupsBorderlessScalingFactor); + h->cupsImagingBBox[0] = (float)left; + h->cupsImagingBBox[1] = (float)bottom; + h->cupsImagingBBox[2] = (float)right; + h->cupsImagingBBox[3] = (float)top; + + /* + * Use the callback to validate the page header... + */ + + if (func && (*func)(h, preferred_bits)) + { + _cupsRasterAddError("Page header callback returned error.\n"); + return (-1); + } + + /* + * Check parameters... + */ + + if (!h->HWResolution[0] || !h->HWResolution[1] || + !h->PageSize[0] || !h->PageSize[1] || + (h->cupsBitsPerColor != 1 && h->cupsBitsPerColor != 2 && + h->cupsBitsPerColor != 4 && h->cupsBitsPerColor != 8 && + h->cupsBitsPerColor != 16) || + h->cupsBorderlessScalingFactor < 0.1 || + h->cupsBorderlessScalingFactor > 2.0) + { + _cupsRasterAddError("Page header uses unsupported values.\n"); + return (-1); + } + + /* + * Compute the bitmap parameters... + */ + + h->cupsWidth = (int)((right - left) * h->cupsBorderlessScalingFactor * + h->HWResolution[0] / 72.0f + 0.5f); + h->cupsHeight = (int)((top - bottom) * h->cupsBorderlessScalingFactor * + h->HWResolution[1] / 72.0f + 0.5f); + + switch (h->cupsColorSpace) + { + case CUPS_CSPACE_W : + case CUPS_CSPACE_K : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + case CUPS_CSPACE_SW : + h->cupsNumColors = 1; + h->cupsBitsPerPixel = h->cupsBitsPerColor; + break; + + default : + /* + * Ensure that colorimetric colorspaces use at least 8 bits per + * component... + */ + + if (h->cupsColorSpace >= CUPS_CSPACE_CIEXYZ && + h->cupsBitsPerColor < 8) + h->cupsBitsPerColor = 8; + + /* + * Figure out the number of bits per pixel... + */ + + if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) + { + if (h->cupsBitsPerColor >= 8) + h->cupsBitsPerPixel = h->cupsBitsPerColor * 3; + else + h->cupsBitsPerPixel = h->cupsBitsPerColor * 4; + } + else + h->cupsBitsPerPixel = h->cupsBitsPerColor; + + h->cupsNumColors = 3; + break; + + case CUPS_CSPACE_KCMYcm : + if (h->cupsBitsPerColor == 1) + { + if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) + h->cupsBitsPerPixel = 8; + else + h->cupsBitsPerPixel = 1; + + h->cupsNumColors = 6; + break; + } + + /* + * Fall through to CMYK code... + */ + + case CUPS_CSPACE_RGBA : + case CUPS_CSPACE_RGBW : + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_KCMY : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) + h->cupsBitsPerPixel = h->cupsBitsPerColor * 4; + else + h->cupsBitsPerPixel = h->cupsBitsPerColor; + + h->cupsNumColors = 4; + break; + + case CUPS_CSPACE_DEVICE1 : + case CUPS_CSPACE_DEVICE2 : + case CUPS_CSPACE_DEVICE3 : + case CUPS_CSPACE_DEVICE4 : + case CUPS_CSPACE_DEVICE5 : + case CUPS_CSPACE_DEVICE6 : + case CUPS_CSPACE_DEVICE7 : + case CUPS_CSPACE_DEVICE8 : + case CUPS_CSPACE_DEVICE9 : + case CUPS_CSPACE_DEVICEA : + case CUPS_CSPACE_DEVICEB : + case CUPS_CSPACE_DEVICEC : + case CUPS_CSPACE_DEVICED : + case CUPS_CSPACE_DEVICEE : + case CUPS_CSPACE_DEVICEF : + h->cupsNumColors = h->cupsColorSpace - CUPS_CSPACE_DEVICE1 + 1; + + if (h->cupsColorOrder == CUPS_ORDER_CHUNKED) + h->cupsBitsPerPixel = h->cupsBitsPerColor * h->cupsNumColors; + else + h->cupsBitsPerPixel = h->cupsBitsPerColor; + break; + } + + h->cupsBytesPerLine = (h->cupsBitsPerPixel * h->cupsWidth + 7) / 8; + + if (h->cupsColorOrder == CUPS_ORDER_BANDED) + h->cupsBytesPerLine *= h->cupsNumColors; + + return (status); +} + + +/* + * '_cupsRasterExecPS()' - Execute PostScript code to initialize a page header. + */ + +int /* O - 0 on success, -1 on error */ +_cupsRasterExecPS( + cups_page_header2_t *h, /* O - Page header */ + int *preferred_bits,/* O - Preferred bits per color */ + const char *code) /* I - PS code to execute */ +{ + _cups_ps_stack_t *st; /* PostScript value stack */ + _cups_ps_obj_t *obj; /* Object from top of stack */ + char *codecopy, /* Copy of code */ + *codeptr; /* Pointer into copy of code */ + + + DEBUG_printf(("_cupsRasterExecPS(h=%p, preferred_bits=%p, code=\"%s\")\n", + h, preferred_bits, code ? code : "(null)")); + + /* + * Copy the PostScript code and create a stack... + */ + + if ((codecopy = strdup(code)) == NULL) + { + _cupsRasterAddError("Unable to duplicate code string.\n"); + return (-1); + } + + if ((st = new_stack()) == NULL) + { + _cupsRasterAddError("Unable to create stack.\n"); + free(codecopy); + return (-1); + } + + /* + * Parse the PS string until we run out of data... + */ + + codeptr = codecopy; + + while ((obj = scan_ps(st, &codeptr)) != NULL) + { +#ifdef DEBUG + DEBUG_printf(("_cupsRasterExecPS: Stack (%d objects)\n", st->num_objs)); + DEBUG_object(obj); +#endif /* DEBUG */ + + switch (obj->type) + { + default : + /* Do nothing for regular values */ + break; + + case CUPS_PS_CLEARTOMARK : + pop_stack(st); + + if (cleartomark_stack(st)) + _cupsRasterAddError("cleartomark: Stack underflow!\n"); + +#ifdef DEBUG + DEBUG_puts(" dup: "); + DEBUG_stack(st); +#endif /* DEBUG */ + break; + + case CUPS_PS_COPY : + pop_stack(st); + if ((obj = pop_stack(st)) != NULL) + { + copy_stack(st, (int)obj->value.number); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: copy"); + DEBUG_stack(st); +#endif /* DEBUG */ + } + break; + + case CUPS_PS_DUP : + pop_stack(st); + copy_stack(st, 1); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: dup"); + DEBUG_stack(st); +#endif /* DEBUG */ + break; + + case CUPS_PS_INDEX : + pop_stack(st); + if ((obj = pop_stack(st)) != NULL) + { + index_stack(st, (int)obj->value.number); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: index"); + DEBUG_stack(st); +#endif /* DEBUG */ + } + break; + + case CUPS_PS_POP : + pop_stack(st); + pop_stack(st); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: pop"); + DEBUG_stack(st); +#endif /* DEBUG */ + break; + + case CUPS_PS_ROLL : + pop_stack(st); + if ((obj = pop_stack(st)) != NULL) + { + int c; /* Count */ + + + c = (int)obj->value.number; + + if ((obj = pop_stack(st)) != NULL) + { + roll_stack(st, (int)obj->value.number, c); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: roll"); + DEBUG_stack(st); +#endif /* DEBUG */ + } + } + break; + + case CUPS_PS_SETPAGEDEVICE : + pop_stack(st); + setpagedevice(st, h, preferred_bits); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: setpagedevice"); + DEBUG_stack(st); +#endif /* DEBUG */ + break; + + case CUPS_PS_START_PROC : + case CUPS_PS_END_PROC : + case CUPS_PS_STOPPED : + pop_stack(st); + break; + + case CUPS_PS_OTHER : + _cupsRasterAddError("Unknown operator \"%s\"!\n", obj->value.other); + DEBUG_printf(("_cupsRasterExecPS: Unknown operator \"%s\"!\n", + obj->value.other)); + break; + } + + if (obj && obj->type == CUPS_PS_OTHER) + break; + } + + /* + * Cleanup... + */ + + free(codecopy); + + if (st->num_objs > 0) + { + error_stack(st, "Stack not empty:"); + +#ifdef DEBUG + DEBUG_puts("_cupsRasterExecPS: Stack not empty:"); + DEBUG_stack(st); +#endif /* DEBUG */ + + delete_stack(st); + + return (-1); + } + + delete_stack(st); + + /* + * Return success... + */ + + return (0); +} + + +/* + * 'cleartomark_stack()' - Clear to the last mark ([) on the stack. + */ + +static int /* O - 0 on success, -1 on error */ +cleartomark_stack(_cups_ps_stack_t *st) /* I - Stack */ +{ + _cups_ps_obj_t *obj; /* Current object on stack */ + + + while ((obj = pop_stack(st)) != NULL) + if (obj->type == CUPS_PS_START_ARRAY) + break; + + return (obj ? 0 : -1); +} + + +/* + * 'copy_stack()' - Copy the top N stack objects. + */ + +static int /* O - 0 on success, -1 on error */ +copy_stack(_cups_ps_stack_t *st, /* I - Stack */ + int c) /* I - Number of objects to copy */ +{ + int n; /* Index */ + + + if (c < 0) + return (-1); + else if (c == 0) + return (0); + + if ((n = st->num_objs - c) < 0) + return (-1); + + while (c > 0) + { + if (!push_stack(st, st->objs + n)) + return (-1); + + n ++; + c --; + } + + return (0); +} + + +/* + * 'delete_stack()' - Free memory used by a stack. + */ + +static void +delete_stack(_cups_ps_stack_t *st) /* I - Stack */ +{ + free(st->objs); + free(st); +} + + +/* + * 'error_object()' - Add an object's value to the current error message. + */ + +static void +error_object(_cups_ps_obj_t *obj) /* I - Object to add */ +{ + switch (obj->type) + { + case CUPS_PS_NAME : + _cupsRasterAddError(" /%s", obj->value.name); + break; + + case CUPS_PS_NUMBER : + _cupsRasterAddError(" %g", obj->value.number); + break; + + case CUPS_PS_STRING : + _cupsRasterAddError(" (%s)", obj->value.string); + break; + + case CUPS_PS_BOOLEAN : + if (obj->value.boolean) + _cupsRasterAddError(" true"); + else + _cupsRasterAddError(" false"); + break; + + case CUPS_PS_NULL : + _cupsRasterAddError(" null"); + break; + + case CUPS_PS_START_ARRAY : + _cupsRasterAddError(" ["); + break; + + case CUPS_PS_END_ARRAY : + _cupsRasterAddError(" ]"); + break; + + case CUPS_PS_START_DICT : + _cupsRasterAddError(" <<"); + break; + + case CUPS_PS_END_DICT : + _cupsRasterAddError(" >>"); + break; + + case CUPS_PS_START_PROC : + _cupsRasterAddError(" {"); + break; + + case CUPS_PS_END_PROC : + _cupsRasterAddError(" }"); + break; + + case CUPS_PS_COPY : + _cupsRasterAddError(" --copy--"); + break; + + case CUPS_PS_CLEARTOMARK : + _cupsRasterAddError(" --cleartomark--"); + break; + + case CUPS_PS_DUP : + _cupsRasterAddError(" --dup--"); + break; + + case CUPS_PS_INDEX : + _cupsRasterAddError(" --index--"); + break; + + case CUPS_PS_POP : + _cupsRasterAddError(" --pop--"); + break; + + case CUPS_PS_ROLL : + _cupsRasterAddError(" --roll--"); + break; + + case CUPS_PS_SETPAGEDEVICE : + _cupsRasterAddError(" --setpagedevice--"); + break; + + case CUPS_PS_STOPPED : + _cupsRasterAddError(" --stopped--"); + break; + + case CUPS_PS_OTHER : + _cupsRasterAddError(" --%s--", obj->value.other); + break; + } +} + + +/* + * 'error_stack()' - Add a stack to the current error message... + */ + +static void +error_stack(_cups_ps_stack_t *st, /* I - Stack */ + const char *title) /* I - Title string */ +{ + int c; /* Looping var */ + _cups_ps_obj_t *obj; /* Current object on stack */ + + + _cupsRasterAddError("%s", title); + + for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++) + error_object(obj); + + _cupsRasterAddError("\n"); +} + + +/* + * 'index_stack()' - Copy the Nth value on the stack. + */ + +static _cups_ps_obj_t * /* O - New object */ +index_stack(_cups_ps_stack_t *st, /* I - Stack */ + int n) /* I - Object index */ +{ + if (n < 0 || (n = st->num_objs - n - 1) < 0) + return (NULL); + + return (push_stack(st, st->objs + n)); +} + + +/* + * 'new_stack()' - Create a new stack. + */ + +static _cups_ps_stack_t * /* O - New stack */ +new_stack(void) +{ + _cups_ps_stack_t *st; /* New stack */ + + + if ((st = calloc(1, sizeof(_cups_ps_stack_t))) == NULL) + return (NULL); + + st->alloc_objs = 32; + + if ((st->objs = calloc(32, sizeof(_cups_ps_obj_t))) == NULL) + { + free(st); + return (NULL); + } + else + return (st); +} + + +/* + * 'pop_stock()' - Pop the top object off the stack. + */ + +static _cups_ps_obj_t * /* O - Object */ +pop_stack(_cups_ps_stack_t *st) /* I - Stack */ +{ + if (st->num_objs > 0) + { + st->num_objs --; + + return (st->objs + st->num_objs); + } + else + return (NULL); +} + + +/* + * 'push_stack()' - Push an object on the stack. + */ + +static _cups_ps_obj_t * /* O - New object */ +push_stack(_cups_ps_stack_t *st, /* I - Stack */ + _cups_ps_obj_t *obj) /* I - Object */ +{ + _cups_ps_obj_t *temp; /* New object */ + + + if (st->num_objs >= st->alloc_objs) + { + + + st->alloc_objs += 32; + + if ((temp = realloc(st->objs, st->alloc_objs * + sizeof(_cups_ps_obj_t))) == NULL) + return (NULL); + + st->objs = temp; + memset(temp + st->num_objs, 0, 32 * sizeof(_cups_ps_obj_t)); + } + + temp = st->objs + st->num_objs; + st->num_objs ++; + + memcpy(temp, obj, sizeof(_cups_ps_obj_t)); + + return (temp); +} + + +/* + * 'roll_stack()' - Rotate stack objects. + */ + +static int /* O - 0 on success, -1 on error */ +roll_stack(_cups_ps_stack_t *st, /* I - Stack */ + int c, /* I - Number of objects */ + int s) /* I - Amount to shift */ +{ + _cups_ps_obj_t *temp; /* Temporary array of objects */ + int n; /* Index into array */ + + + DEBUG_printf((" roll_stack(st=%p, s=%d, c=%d)\n", st, s, c)); + + /* + * Range check input... + */ + + if (c < 0) + return (-1); + else if (c == 0) + return (0); + + if ((n = st->num_objs - c) < 0) + return (-1); + + s %= c; + + if (s == 0) + return (0); + + /* + * Copy N objects and move things around... + */ + + if (s < 0) + { + /* + * Shift down... + */ + + s = -s; + + if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL) + return (-1); + + memcpy(temp, st->objs + n, s * sizeof(_cups_ps_obj_t)); + memmove(st->objs + n, st->objs + n + s, (c - s) * sizeof(_cups_ps_obj_t)); + memcpy(st->objs + n + c - s, temp, s * sizeof(_cups_ps_obj_t)); + } + else + { + /* + * Shift up... + */ + + if ((temp = calloc(s, sizeof(_cups_ps_obj_t))) == NULL) + return (-1); + + memcpy(temp, st->objs + n + c - s, s * sizeof(_cups_ps_obj_t)); + memmove(st->objs + n + s, st->objs + n, + (c - s) * sizeof(_cups_ps_obj_t)); + memcpy(st->objs + n, temp, s * sizeof(_cups_ps_obj_t)); + } + + free(temp); + + return (0); +} + + +/* + * 'scan_ps()' - Scan a string for the next PS object. + */ + +static _cups_ps_obj_t * /* O - New object or NULL on EOF */ +scan_ps(_cups_ps_stack_t *st, /* I - Stack */ + char **ptr) /* IO - String pointer */ +{ + _cups_ps_obj_t obj; /* Current object */ + char *start, /* Start of object */ + *cur, /* Current position */ + *valptr, /* Pointer into value string */ + *valend; /* End of value string */ + int parens; /* Parenthesis nesting level */ + + + /* + * Skip leading whitespace... + */ + + for (cur = *ptr; *cur; cur ++) + { + if (*cur == '%') + { + /* + * Comment, skip to end of line... + */ + + for (cur ++; *cur && *cur != '\n' && *cur != '\r'; cur ++); + + if (!*cur) + cur --; + } + else if (!isspace(*cur & 255)) + break; + } + + if (!*cur) + { + *ptr = NULL; + + return (NULL); + } + + /* + * See what we have... + */ + + memset(&obj, 0, sizeof(obj)); + + switch (*cur) + { + case '(' : /* (string) */ + obj.type = CUPS_PS_STRING; + start = cur; + + for (cur ++, parens = 1, valptr = obj.value.string, + valend = obj.value.string + sizeof(obj.value.string) - 1; + *cur; + cur ++) + { + if (*cur == ')' && parens == 1) + break; + + if (*cur == '(') + parens ++; + else if (*cur == ')') + parens --; + + if (valptr >= valend) + { + *ptr = start; + + return (NULL); + } + + if (*cur == '\\') + { + /* + * Decode escaped character... + */ + + cur ++; + + if (*cur == 'b') + *valptr++ = '\b'; + else if (*cur == 'f') + *valptr++ = '\f'; + else if (*cur == 'n') + *valptr++ = '\n'; + else if (*cur == 'r') + *valptr++ = '\r'; + else if (*cur == 't') + *valptr++ = '\t'; + else if (*cur >= '0' && *cur <= '7') + { + int ch = *cur - '0'; + + if (cur[1] >= '0' && cur[1] <= '7') + { + cur ++; + ch = (ch << 3) + *cur - '0'; + } + + if (cur[1] >= '0' && cur[1] <= '7') + { + cur ++; + ch = (ch << 3) + *cur - '0'; + } + + *valptr++ = ch; + } + else if (*cur == '\r') + { + if (cur[1] == '\n') + cur ++; + } + else if (*cur != '\n') + *valptr++ = *cur; + } + else + *valptr++ = *cur; + } + + if (*cur != ')') + { + *ptr = start; + + return (NULL); + } + + cur ++; + break; + + case '[' : /* Start array */ + obj.type = CUPS_PS_START_ARRAY; + cur ++; + break; + + case ']' : /* End array */ + obj.type = CUPS_PS_END_ARRAY; + cur ++; + break; + + case '<' : /* Start dictionary or hex string */ + if (cur[1] == '<') + { + obj.type = CUPS_PS_START_DICT; + cur += 2; + } + else + { + obj.type = CUPS_PS_STRING; + start = cur; + + for (cur ++, valptr = obj.value.string, + valend = obj.value.string + sizeof(obj.value.string) - 1; + *cur; + cur ++) + { + int ch; /* Current character */ + + + + if (*cur == '>') + break; + else if (valptr >= valend || !isxdigit(*cur & 255)) + { + *ptr = start; + return (NULL); + } + + if (*cur >= '0' && *cur <= '9') + ch = (*cur - '0') << 4; + else + ch = (tolower(*cur) - 'a' + 10) << 4; + + if (isxdigit(cur[1] & 255)) + { + cur ++; + + if (*cur >= '0' && *cur <= '9') + ch |= *cur - '0'; + else + ch |= tolower(*cur) - 'a' + 10; + } + + *valptr++ = ch; + } + + if (*cur != '>') + { + *ptr = start; + return (NULL); + } + + cur ++; + } + break; + + case '>' : /* End dictionary? */ + if (cur[1] == '>') + { + obj.type = CUPS_PS_END_DICT; + cur += 2; + } + else + { + obj.type = CUPS_PS_OTHER; + obj.value.other[0] = *cur; + + cur ++; + } + break; + + case '{' : /* Start procedure */ + obj.type = CUPS_PS_START_PROC; + cur ++; + break; + + case '}' : /* End procedure */ + obj.type = CUPS_PS_END_PROC; + cur ++; + break; + + case '-' : /* Possible number */ + case '+' : + if (!isdigit(cur[1] & 255) && cur[1] != '.') + { + obj.type = CUPS_PS_OTHER; + obj.value.other[0] = *cur; + + cur ++; + break; + } + + case '0' : /* Number */ + case '1' : + case '2' : + case '3' : + case '4' : + case '5' : + case '6' : + case '7' : + case '8' : + case '9' : + case '.' : + obj.type = CUPS_PS_NUMBER; + + start = cur; + for (cur ++; *cur; cur ++) + if (!isdigit(*cur & 255)) + break; + + if (*cur == '#') + { + /* + * Integer with radix... + */ + + obj.value.number = strtol(cur + 1, &cur, atoi(start)); + break; + } + else if (strchr(".Ee()<>[]{}/%", *cur) || isspace(*cur & 255)) + { + /* + * Integer or real number... + */ + + obj.value.number = _cupsStrScand(start, &cur, localeconv()); + break; + } + else + cur = start; + + default : /* Operator/variable name */ + start = cur; + + if (*cur == '/') + { + obj.type = CUPS_PS_NAME; + valptr = obj.value.name; + valend = obj.value.name + sizeof(obj.value.name) - 1; + cur ++; + } + else + { + obj.type = CUPS_PS_OTHER; + valptr = obj.value.other; + valend = obj.value.other + sizeof(obj.value.other) - 1; + } + + while (*cur) + { + if (strchr("()<>[]{}/%", *cur) || isspace(*cur & 255)) + break; + else if (valptr < valend) + *valptr++ = *cur++; + else + { + *ptr = start; + return (NULL); + } + } + + if (obj.type == CUPS_PS_OTHER) + { + if (!strcmp(obj.value.other, "true")) + { + obj.type = CUPS_PS_BOOLEAN; + obj.value.boolean = 1; + } + else if (!strcmp(obj.value.other, "false")) + { + obj.type = CUPS_PS_BOOLEAN; + obj.value.boolean = 0; + } + else if (!strcmp(obj.value.other, "null")) + obj.type = CUPS_PS_NULL; + else if (!strcmp(obj.value.other, "cleartomark")) + obj.type = CUPS_PS_CLEARTOMARK; + else if (!strcmp(obj.value.other, "copy")) + obj.type = CUPS_PS_COPY; + else if (!strcmp(obj.value.other, "dup")) + obj.type = CUPS_PS_DUP; + else if (!strcmp(obj.value.other, "index")) + obj.type = CUPS_PS_INDEX; + else if (!strcmp(obj.value.other, "pop")) + obj.type = CUPS_PS_POP; + else if (!strcmp(obj.value.other, "roll")) + obj.type = CUPS_PS_ROLL; + else if (!strcmp(obj.value.other, "setpagedevice")) + obj.type = CUPS_PS_SETPAGEDEVICE; + else if (!strcmp(obj.value.other, "stopped")) + obj.type = CUPS_PS_STOPPED; + } + break; + } + + /* + * Save the current position in the string and return the new object... + */ + + *ptr = cur; + + return (push_stack(st, &obj)); +} + + +/* + * 'setpagedevice()' - Simulate the PostScript setpagedevice operator. + */ + +static int /* O - 0 on success, -1 on error */ +setpagedevice( + _cups_ps_stack_t *st, /* I - Stack */ + cups_page_header2_t *h, /* O - Page header */ + int *preferred_bits)/* O - Preferred bits per color */ +{ + int i; /* Index into array */ + _cups_ps_obj_t *obj, /* Current object */ + *end; /* End of dictionary */ + const char *name; /* Attribute name */ + + + /* + * Make sure we have a dictionary on the stack... + */ + + if (st->num_objs == 0) + return (-1); + + obj = end = st->objs + st->num_objs - 1; + + if (obj->type != CUPS_PS_END_DICT) + return (-1); + + obj --; + + while (obj > st->objs) + { + if (obj->type == CUPS_PS_START_DICT) + break; + + obj --; + } + + if (obj < st->objs) + return (-1); + + /* + * Found the start of the dictionary, empty the stack to this point... + */ + + st->num_objs = obj - st->objs; + + /* + * Now pull /name and value pairs from the dictionary... + */ + + DEBUG_puts("setpagedevice: Dictionary:"); + + for (obj ++; obj < end; obj ++) + { + /* + * Grab the name... + */ + + if (obj->type != CUPS_PS_NAME) + return (-1); + + name = obj->value.name; + obj ++; + +#ifdef DEBUG + DEBUG_printf(("setpagedevice: /%s ", name)); + DEBUG_object(obj); +#endif /* DEBUG */ + + /* + * Then grab the value... + */ + + if (!strcmp(name, "MediaClass") && obj->type == CUPS_PS_STRING) + strlcpy(h->MediaClass, obj->value.string, sizeof(h->MediaClass)); + else if (!strcmp(name, "MediaColor") && obj->type == CUPS_PS_STRING) + strlcpy(h->MediaColor, obj->value.string, sizeof(h->MediaColor)); + else if (!strcmp(name, "MediaType") && obj->type == CUPS_PS_STRING) + strlcpy(h->MediaType, obj->value.string, sizeof(h->MediaType)); + else if (!strcmp(name, "OutputType") && obj->type == CUPS_PS_STRING) + strlcpy(h->OutputType, obj->value.string, sizeof(h->OutputType)); + else if (!strcmp(name, "AdvanceDistance") && obj->type == CUPS_PS_NUMBER) + h->AdvanceDistance = (unsigned)obj->value.number; + else if (!strcmp(name, "AdvanceMedia") && obj->type == CUPS_PS_NUMBER) + h->AdvanceMedia = (unsigned)obj->value.number; + else if (!strcmp(name, "Collate") && obj->type == CUPS_PS_BOOLEAN) + h->Collate = (unsigned)obj->value.boolean; + else if (!strcmp(name, "CutMedia") && obj->type == CUPS_PS_NUMBER) + h->CutMedia = (cups_cut_t)(unsigned)obj->value.number; + else if (!strcmp(name, "Duplex") && obj->type == CUPS_PS_BOOLEAN) + h->Duplex = (unsigned)obj->value.boolean; + else if (!strcmp(name, "HWResolution") && obj->type == CUPS_PS_START_ARRAY) + { + if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER && + obj[3].type == CUPS_PS_END_ARRAY) + { + h->HWResolution[0] = (unsigned)obj[1].value.number; + h->HWResolution[1] = (unsigned)obj[2].value.number; + obj += 3; + } + else + return (-1); + } + else if (!strcmp(name, "InsertSheet") && obj->type == CUPS_PS_BOOLEAN) + h->InsertSheet = (unsigned)obj->value.boolean; + else if (!strcmp(name, "Jog") && obj->type == CUPS_PS_NUMBER) + h->Jog = (unsigned)obj->value.number; + else if (!strcmp(name, "LeadingEdge") && obj->type == CUPS_PS_NUMBER) + h->LeadingEdge = (unsigned)obj->value.number; + else if (!strcmp(name, "ManualFeed") && obj->type == CUPS_PS_BOOLEAN) + h->ManualFeed = (unsigned)obj->value.boolean; + else if ((!strcmp(name, "cupsMediaPosition") || + !strcmp(name, "MediaPosition")) && obj->type == CUPS_PS_NUMBER) + { + /* + * cupsMediaPosition is supported for backwards compatibility only. + * We added it back in the Ghostscript 5.50 days to work around a + * bug in Ghostscript WRT handling of MediaPosition and setpagedevice. + * + * All new development should set MediaPosition... + */ + + h->MediaPosition = (unsigned)obj->value.number; + } + else if (!strcmp(name, "MediaWeight") && obj->type == CUPS_PS_NUMBER) + h->MediaWeight = (unsigned)obj->value.number; + else if (!strcmp(name, "MirrorPrint") && obj->type == CUPS_PS_BOOLEAN) + h->MirrorPrint = (unsigned)obj->value.boolean; + else if (!strcmp(name, "NegativePrint") && obj->type == CUPS_PS_BOOLEAN) + h->NegativePrint = (unsigned)obj->value.boolean; + else if (!strcmp(name, "NumCopies") && obj->type == CUPS_PS_NUMBER) + h->NumCopies = (unsigned)obj->value.number; + else if (!strcmp(name, "Orientation") && obj->type == CUPS_PS_NUMBER) + h->Orientation = (unsigned)obj->value.number; + else if (!strcmp(name, "OutputFaceUp") && obj->type == CUPS_PS_BOOLEAN) + h->OutputFaceUp = (unsigned)obj->value.boolean; + else if (!strcmp(name, "PageSize") && obj->type == CUPS_PS_START_ARRAY) + { + if (obj[1].type == CUPS_PS_NUMBER && obj[2].type == CUPS_PS_NUMBER && + obj[3].type == CUPS_PS_END_ARRAY) + { + h->cupsPageSize[0] = (float)obj[1].value.number; + h->cupsPageSize[1] = (float)obj[2].value.number; + + h->PageSize[0] = (unsigned)obj[1].value.number; + h->PageSize[1] = (unsigned)obj[2].value.number; + + obj += 3; + } + else + return (-1); + } + else if (!strcmp(name, "Separations") && obj->type == CUPS_PS_BOOLEAN) + h->Separations = (unsigned)obj->value.boolean; + else if (!strcmp(name, "TraySwitch") && obj->type == CUPS_PS_BOOLEAN) + h->TraySwitch = (unsigned)obj->value.boolean; + else if (!strcmp(name, "Tumble") && obj->type == CUPS_PS_BOOLEAN) + h->Tumble = (unsigned)obj->value.boolean; + else if (!strcmp(name, "cupsMediaType") && obj->type == CUPS_PS_NUMBER) + h->cupsMediaType = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsBitsPerColor") && obj->type == CUPS_PS_NUMBER) + h->cupsBitsPerColor = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsPreferredBitsPerColor") && + obj->type == CUPS_PS_NUMBER) + *preferred_bits = (int)obj->value.number; + else if (!strcmp(name, "cupsColorOrder") && obj->type == CUPS_PS_NUMBER) + h->cupsColorOrder = (cups_order_t)(unsigned)obj->value.number; + else if (!strcmp(name, "cupsColorSpace") && obj->type == CUPS_PS_NUMBER) + h->cupsColorSpace = (cups_cspace_t)(unsigned)obj->value.number; + else if (!strcmp(name, "cupsCompression") && obj->type == CUPS_PS_NUMBER) + h->cupsCompression = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsRowCount") && obj->type == CUPS_PS_NUMBER) + h->cupsRowCount = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsRowFeed") && obj->type == CUPS_PS_NUMBER) + h->cupsRowFeed = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsRowStep") && obj->type == CUPS_PS_NUMBER) + h->cupsRowStep = (unsigned)obj->value.number; + else if (!strcmp(name, "cupsBorderlessScalingFactor") && + obj->type == CUPS_PS_NUMBER) + h->cupsBorderlessScalingFactor = (float)obj->value.number; + else if (!strncmp(name, "cupsInteger", 11) && obj->type == CUPS_PS_NUMBER) + { + if ((i = atoi(name + 11)) < 0 || i > 15) + return (-1); + + h->cupsInteger[i] = (unsigned)obj->value.number; + } + else if (!strncmp(name, "cupsReal", 8) && obj->type == CUPS_PS_NUMBER) + { + if ((i = atoi(name + 8)) < 0 || i > 15) + return (-1); + + h->cupsReal[i] = (float)obj->value.number; + } + else if (!strncmp(name, "cupsString", 10) && obj->type == CUPS_PS_STRING) + { + if ((i = atoi(name + 10)) < 0 || i > 15) + return (-1); + + strlcpy(h->cupsString[i], obj->value.string, sizeof(h->cupsString[i])); + } + else if (!strcmp(name, "cupsMarkerType") && obj->type == CUPS_PS_STRING) + strlcpy(h->cupsMarkerType, obj->value.string, sizeof(h->cupsMarkerType)); + else if (!strcmp(name, "cupsPageSizeName") && obj->type == CUPS_PS_STRING) + strlcpy(h->cupsPageSizeName, obj->value.string, + sizeof(h->cupsPageSizeName)); + else if (!strcmp(name, "cupsRenderingIntent") && + obj->type == CUPS_PS_STRING) + strlcpy(h->cupsRenderingIntent, obj->value.string, + sizeof(h->cupsRenderingIntent)); + else + { + /* + * Ignore unknown name+value... + */ + + DEBUG_printf((" Unknown name (\"%s\") or value...\n", name)); + + while (obj[1].type != CUPS_PS_NAME && obj < end) + obj ++; + } + } + + return (0); +} + + +#ifdef DEBUG +/* + * 'DEBUG_object()' - Print an object's value... + */ + +static void +DEBUG_object(_cups_ps_obj_t *obj) /* I - Object to print */ +{ + switch (obj->type) + { + case CUPS_PS_NAME : + DEBUG_printf(("/%s\n", obj->value.name)); + break; + + case CUPS_PS_NUMBER : + DEBUG_printf(("%g\n", obj->value.number)); + break; + + case CUPS_PS_STRING : + DEBUG_printf(("(%s)\n", obj->value.string)); + break; + + case CUPS_PS_BOOLEAN : + if (obj->value.boolean) + DEBUG_puts("true"); + else + DEBUG_puts("false"); + break; + + case CUPS_PS_NULL : + DEBUG_puts("null"); + break; + + case CUPS_PS_START_ARRAY : + DEBUG_puts("["); + break; + + case CUPS_PS_END_ARRAY : + DEBUG_puts("]"); + break; + + case CUPS_PS_START_DICT : + DEBUG_puts("<<"); + break; + + case CUPS_PS_END_DICT : + DEBUG_puts(">>"); + break; + + case CUPS_PS_START_PROC : + DEBUG_puts("{"); + break; + + case CUPS_PS_END_PROC : + DEBUG_puts("}"); + break; + + case CUPS_PS_CLEARTOMARK : + DEBUG_puts("--cleartomark--"); + break; + + case CUPS_PS_COPY : + DEBUG_puts("--copy--"); + break; + + case CUPS_PS_DUP : + DEBUG_puts("--dup--"); + break; + + case CUPS_PS_INDEX : + DEBUG_puts("--index--"); + break; + + case CUPS_PS_POP : + DEBUG_puts("--pop--"); + break; + + case CUPS_PS_ROLL : + DEBUG_puts("--roll--"); + break; + + case CUPS_PS_SETPAGEDEVICE : + DEBUG_puts("--setpagedevice--"); + break; + + case CUPS_PS_STOPPED : + DEBUG_puts("--stopped--"); + break; + + case CUPS_PS_OTHER : + DEBUG_printf(("--%s--\n", obj->value.other)); + break; + } +} + + +/* + * 'DEBUG_stack()' - Print a stack... + */ + +static void +DEBUG_stack(_cups_ps_stack_t *st) /* I - Stack */ +{ + int c; /* Looping var */ + _cups_ps_obj_t *obj; /* Current object on stack */ + + + for (obj = st->objs, c = st->num_objs; c > 0; c --, obj ++) + DEBUG_object(obj); +} +#endif /* DEBUG */ + + +/* + * End of "$Id: interpret.c 9955 2011-09-02 18:14:34Z mike $". + */ diff --git a/filter/libcupsimage2.def b/filter/libcupsimage2.def new file mode 100644 index 0000000..3c20284 --- /dev/null +++ b/filter/libcupsimage2.def @@ -0,0 +1,14 @@ +LIBRARY libcupsimage2 +VERSION 2.3 +EXPORTS +cupsRasterClose +cupsRasterErrorString +cupsRasterInterpretPPD +cupsRasterOpen +cupsRasterOpenIO +cupsRasterReadHeader +cupsRasterReadHeader2 +cupsRasterReadPixels +cupsRasterWriteHeader +cupsRasterWriteHeader2 +cupsRasterWritePixels diff --git a/filter/libcupsimage_s.exp b/filter/libcupsimage_s.exp new file mode 100644 index 0000000..57f4259 --- /dev/null +++ b/filter/libcupsimage_s.exp @@ -0,0 +1,16 @@ +_cupsImagePutCol +_cupsImagePutRow +_cupsImageReadBMP +_cupsImageReadGIF +_cupsImageReadJPEG +_cupsImageReadPIX +_cupsImageReadPNG +_cupsImageReadPNM +_cupsImageReadPhotoCD +_cupsImageReadSGI +_cupsImageReadSunRaster +_cupsImageReadTIFF +_cupsImageZoomDelete +_cupsImageZoomFill +_cupsImageZoomNew +_cupsRasterExecPS diff --git a/filter/pdftops.c b/filter/pdftops.c new file mode 100644 index 0000000..b35e7ff --- /dev/null +++ b/filter/pdftops.c @@ -0,0 +1,621 @@ +/* + * "$Id: pdftops.c 9793 2011-05-20 03:49:49Z mike $" + * + * PDF to PostScript filter front-end for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for filter... + * cancel_job() - Flag the job as canceled. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Local functions... + */ + +static void cancel_job(int sig); + + +/* + * Local globals... + */ + +static int job_canceled = 0; + + +/* + * 'main()' - Main entry for filter... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* Copy file descriptor */ + char *filename, /* PDF file to convert */ + tempfile[1024]; /* Temporary file */ + char buffer[8192]; /* Copy buffer */ + int bytes; /* Bytes copied */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + const char *val; /* Option value */ + int orientation, /* Output orientation */ + fit; /* Fit output to default page size? */ + ppd_file_t *ppd; /* PPD file */ + ppd_size_t *size; /* Current page size */ + int pdf_pid, /* Process ID for pdftops */ + pdf_argc, /* Number of args for pdftops */ + pstops_pid, /* Process ID of pstops filter */ + pstops_pipe[2], /* Pipe to pstops filter */ + wait_children, /* Number of child processes left */ + wait_pid, /* Process ID from wait() */ + wait_status, /* Status from child */ + exit_status = 0; /* Exit status */ + char *pdf_argv[100], /* Arguments for pdftops/gs */ + pdf_width[255], /* Paper width */ + pdf_height[255], /* Paper height */ + pstops_path[1024], /* Path to pstops program */ + *pstops_argv[7], /* Arguments for pstops filter */ + *pstops_options, /* Options for pstops filter */ + *pstops_start, /* Start of pstops filter option */ + *pstops_end; /* End of pstops filter option */ + const char *cups_serverbin; /* CUPS_SERVERBIN environment variable */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore broken pipe signals... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Make sure we have the right number of arguments for CUPS! + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job user title copies options [filename]"), + argv[0]); + return (1); + } + + /* + * Register a signal handler to cleanly cancel a job. + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, cancel_job); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = cancel_job; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, cancel_job); +#endif /* HAVE_SIGSET */ + + /* + * Copy stdin if needed... + */ + + if (argc == 6) + { + /* + * Copy stdin to a temp file... + */ + + if ((fd = cupsTempFd(tempfile, sizeof(tempfile))) < 0) + { + perror("DEBUG: Unable to copy PDF file"); + return (1); + } + + fprintf(stderr, "DEBUG: pdftops - copying to temp print file \"%s\"\n", + tempfile); + + while ((bytes = fread(buffer, 1, sizeof(buffer), stdin)) > 0) + write(fd, buffer, bytes); + + close(fd); + + filename = tempfile; + } + else + { + /* + * Use the filename on the command-line... + */ + + filename = argv[6]; + tempfile[0] = '\0'; + } + + /* + * Load the PPD file and mark options... + */ + + ppd = ppdOpenFile(getenv("PPD")); + num_options = cupsParseOptions(argv[5], 0, &options); + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + /* + * Build the pstops command-line... + */ + + if ((cups_serverbin = getenv("CUPS_SERVERBIN")) == NULL) + cups_serverbin = CUPS_SERVERBIN; + + snprintf(pstops_path, sizeof(pstops_path), "%s/filter/pstops", + cups_serverbin); + + pstops_options = strdup(argv[5]); + + if ((pstops_start = strstr(pstops_options, "fitplot")) != NULL && + (!pstops_start[7] || isspace(pstops_start[7] & 255))) + { + /* + * Strip [no]fitplot option... + */ + + pstops_end = pstops_start + 7; + + if ((pstops_start - pstops_options) >= 2 && + !strncmp(pstops_start - 2, "no", 2)) + pstops_start -= 2; + + while (*pstops_end && isspace(*pstops_end & 255)) + pstops_end ++; + + _cups_strcpy(pstops_start, pstops_end); + } + + if ((pstops_start = strstr(pstops_options, "fit-to-page")) != NULL && + (!pstops_start[11] || isspace(pstops_start[11] & 255))) + { + /* + * Strip [no]fit-to-page option... + */ + + pstops_end = pstops_start + 11; + + if ((pstops_start - pstops_options) >= 2 && + !strncmp(pstops_start - 2, "no", 2)) + pstops_start -= 2; + + while (*pstops_end && isspace(*pstops_end & 255)) + pstops_end ++; + + _cups_strcpy(pstops_start, pstops_end); + } + + if ((pstops_start = strstr(pstops_options, "landscape")) != NULL && + (!pstops_start[9] || isspace(pstops_start[9] & 255))) + { + /* + * Strip [no]landscape option... + */ + + pstops_end = pstops_start + 9; + + if ((pstops_start - pstops_options) >= 2 && + !strncmp(pstops_start - 2, "no", 2)) + pstops_start -= 2; + + while (*pstops_end && isspace(*pstops_end & 255)) + pstops_end ++; + + _cups_strcpy(pstops_start, pstops_end); + } + + if ((pstops_start = strstr(pstops_options, "orientation-requested=")) != NULL) + { + /* + * Strip [no]fitplot option... + */ + + pstops_end = pstops_start + 22; + while (*pstops_end && !isspace(*pstops_end & 255)) + pstops_end ++; + + _cups_strcpy(pstops_start, pstops_end); + } + + pstops_argv[0] = argv[0]; /* Printer */ + pstops_argv[1] = argv[1]; /* Job */ + pstops_argv[2] = argv[2]; /* User */ + pstops_argv[3] = argv[3]; /* Title */ + pstops_argv[4] = argv[4]; /* Copies */ + pstops_argv[5] = pstops_options; /* Options */ + pstops_argv[6] = NULL; + + /* + * Build the command-line for the pdftops or gs filter... + */ + +#ifdef HAVE_PDFTOPS + pdf_argv[0] = (char *)"pdftops"; + pdf_argc = 1; +#else + pdf_argv[0] = (char *)"gs"; + pdf_argv[1] = (char *)"-q"; + pdf_argv[2] = (char *)"-dNOPAUSE"; + pdf_argv[3] = (char *)"-dBATCH"; + pdf_argv[4] = (char *)"-dSAFER"; +# ifdef HAVE_GHOSTSCRIPT_PS2WRITE + pdf_argv[5] = (char *)"-sDEVICE=ps2write"; +# else + pdf_argv[5] = (char *)"-sDEVICE=pswrite"; +# endif /* HAVE_GHOSTSCRIPT_PS2WRITE */ + pdf_argv[6] = (char *)"-sOUTPUTFILE=%stdout"; + pdf_argc = 7; +#endif /* HAVE_PDFTOPS */ + + if (ppd) + { + /* + * Set language level and TrueType font handling... + */ + + if (ppd->language_level == 1) + { +#ifdef HAVE_PDFTOPS + pdf_argv[pdf_argc++] = (char *)"-level1"; + pdf_argv[pdf_argc++] = (char *)"-noembtt"; +#else + pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=1"; +#endif /* HAVE_PDFTOPS */ + } + else if (ppd->language_level == 2) + { +#ifdef HAVE_PDFTOPS + pdf_argv[pdf_argc++] = (char *)"-level2"; + if (!ppd->ttrasterizer) + pdf_argv[pdf_argc++] = (char *)"-noembtt"; +#else + pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=2"; +#endif /* HAVE_PDFTOPS */ + } + else +#ifdef HAVE_PDFTOPS + pdf_argv[pdf_argc++] = (char *)"-level3"; +#else + pdf_argv[pdf_argc++] = (char *)"-dLanguageLevel=3"; +#endif /* HAVE_PDFTOPS */ + + if ((val = cupsGetOption("fitplot", num_options, options)) == NULL) + val = cupsGetOption("fit-to-page", num_options, options); + + if (val && _cups_strcasecmp(val, "no") && _cups_strcasecmp(val, "off") && + _cups_strcasecmp(val, "false")) + fit = 1; + else + fit = 0; + + /* + * Set output page size... + */ + + size = ppdPageSize(ppd, NULL); + if (size && fit) + { + /* + * Got the size, now get the orientation... + */ + + orientation = 0; + + if ((val = cupsGetOption("landscape", num_options, options)) != NULL) + { + if (_cups_strcasecmp(val, "no") != 0 && _cups_strcasecmp(val, "off") != 0 && + _cups_strcasecmp(val, "false") != 0) + orientation = 1; + } + else if ((val = cupsGetOption("orientation-requested", num_options, + options)) != NULL) + { + /* + * Map IPP orientation values to 0 to 3: + * + * 3 = 0 degrees = 0 + * 4 = 90 degrees = 1 + * 5 = -90 degrees = 3 + * 6 = 180 degrees = 2 + */ + + orientation = atoi(val) - 3; + if (orientation >= 2) + orientation ^= 1; + } + +#ifdef HAVE_PDFTOPS + if (orientation & 1) + { + snprintf(pdf_width, sizeof(pdf_width), "%.0f", size->length); + snprintf(pdf_height, sizeof(pdf_height), "%.0f", size->width); + } + else + { + snprintf(pdf_width, sizeof(pdf_width), "%.0f", size->width); + snprintf(pdf_height, sizeof(pdf_height), "%.0f", size->length); + } + + pdf_argv[pdf_argc++] = (char *)"-paperw"; + pdf_argv[pdf_argc++] = pdf_width; + pdf_argv[pdf_argc++] = (char *)"-paperh"; + pdf_argv[pdf_argc++] = pdf_height; + pdf_argv[pdf_argc++] = (char *)"-expand"; + +#else + if (orientation & 1) + { + snprintf(pdf_width, sizeof(pdf_width), "-dDEVICEWIDTHPOINTS=%.0f", + size->length); + snprintf(pdf_height, sizeof(pdf_height), "-dDEVICEHEIGHTPOINTS=%.0f", + size->width); + } + else + { + snprintf(pdf_width, sizeof(pdf_width), "-dDEVICEWIDTHPOINTS=%.0f", + size->width); + snprintf(pdf_height, sizeof(pdf_height), "-dDEVICEHEIGHTPOINTS=%.0f", + size->length); + } + + pdf_argv[pdf_argc++] = pdf_width; + pdf_argv[pdf_argc++] = pdf_height; +#endif /* HAVE_PDFTOPS */ + } +#if defined(HAVE_PDFTOPS) && defined(HAVE_PDFTOPS_WITH_ORIGPAGESIZES) + else + { + /* + * Use the page sizes of the original PDF document, this way documents + * which contain pages of different sizes can be printed correctly + */ + + pdf_argv[pdf_argc++] = (char *)"-origpagesizes"; + } +#endif /* HAVE_PDFTOPS && HAVE_PDFTOPS_WITH_ORIGPAGESIZES */ + } + +#ifdef HAVE_PDFTOPS + pdf_argv[pdf_argc++] = filename; + pdf_argv[pdf_argc++] = (char *)"-"; +#else + pdf_argv[pdf_argc++] = (char *)"-c"; + pdf_argv[pdf_argc++] = (char *)"save pop"; + pdf_argv[pdf_argc++] = (char *)"-f"; + pdf_argv[pdf_argc++] = filename; +#endif /* HAVE_PDFTOPS */ + + pdf_argv[pdf_argc] = NULL; + + /* + * Execute "pdftops/gs | pstops"... + */ + + if (pipe(pstops_pipe)) + { + perror("DEBUG: Unable to create pipe"); + + exit_status = 1; + goto error; + } + + if ((pdf_pid = fork()) == 0) + { + /* + * Child comes here... + */ + + dup2(pstops_pipe[1], 1); + close(pstops_pipe[0]); + close(pstops_pipe[1]); + +#ifdef HAVE_PDFTOPS + execv(CUPS_PDFTOPS, pdf_argv); + perror("DEBUG: Unable to execute pdftops program"); +#else + execv(CUPS_GHOSTSCRIPT, pdf_argv); + perror("DEBUG: Unable to execute gs program"); +#endif /* HAVE_PDFTOPS */ + + exit(1); + } + else if (pdf_pid < 0) + { + /* + * Unable to fork! + */ + +#ifdef HAVE_PDFTOPS + perror("DEBUG: Unable to execute pdftops program"); +#else + perror("DEBUG: Unable to execute gs program"); +#endif /* HAVE_PDFTOPS */ + + exit_status = 1; + goto error; + } + + fprintf(stderr, "DEBUG: Started filter %s (PID %d)\n", pdf_argv[0], pdf_pid); + + if ((pstops_pid = fork()) == 0) + { + /* + * Child comes here... + */ + + dup2(pstops_pipe[0], 0); + close(pstops_pipe[0]); + close(pstops_pipe[1]); + + execv(pstops_path, pstops_argv); + perror("DEBUG: Unable to execute pstops program"); + + exit(1); + } + else if (pstops_pid < 0) + { + /* + * Unable to fork! + */ + + perror("DEBUG: Unable to execute pstops program"); + + exit_status = 1; + goto error; + } + + fprintf(stderr, "DEBUG: Started filter pstops (PID %d)\n", pstops_pid); + + close(pstops_pipe[0]); + close(pstops_pipe[1]); + + /* + * Wait for the child processes to exit... + */ + + wait_children = 2; + + while (wait_children > 0) + { + /* + * Wait until we get a valid process ID or the job is canceled... + */ + + while ((wait_pid = wait(&wait_status)) < 0 && errno == EINTR) + { + if (job_canceled) + { + kill(pdf_pid, SIGTERM); + kill(pstops_pid, SIGTERM); + + job_canceled = 0; + } + } + + if (wait_pid < 0) + break; + + wait_children --; + + /* + * Report child status... + */ + + if (wait_status) + { + if (WIFEXITED(wait_status)) + { + exit_status = WEXITSTATUS(wait_status); + + fprintf(stderr, "DEBUG: PID %d (%s) stopped with status %d!\n", + wait_pid, +#ifdef HAVE_PDFTOPS + wait_pid == pdf_pid ? "pdftops" : "pstops", +#else + wait_pid == pdf_pid ? "gs" : "pstops", +#endif /* HAVE_PDFTOPS */ + exit_status); + } + else if (WTERMSIG(wait_status) == SIGTERM) + { + fprintf(stderr, + "DEBUG: PID %d (%s) was terminated normally with signal %d!\n", + wait_pid, +#ifdef HAVE_PDFTOPS + wait_pid == pdf_pid ? "pdftops" : "pstops", +#else + wait_pid == pdf_pid ? "gs" : "pstops", +#endif /* HAVE_PDFTOPS */ + exit_status); + } + else + { + exit_status = WTERMSIG(wait_status); + + fprintf(stderr, "DEBUG: PID %d (%s) crashed on signal %d!\n", wait_pid, +#ifdef HAVE_PDFTOPS + wait_pid == pdf_pid ? "pdftops" : "pstops", +#else + wait_pid == pdf_pid ? "gs" : "pstops", +#endif /* HAVE_PDFTOPS */ + exit_status); + } + } + else + { + fprintf(stderr, "DEBUG: PID %d (%s) exited with no errors.\n", wait_pid, +#ifdef HAVE_PDFTOPS + wait_pid == pdf_pid ? "pdftops" : "pstops"); +#else + wait_pid == pdf_pid ? "gs" : "pstops"); +#endif /* HAVE_PDFTOPS */ + } + } + + /* + * Cleanup and exit... + */ + + error: + + if (tempfile[0]) + unlink(tempfile); + + return (exit_status); +} + + +/* + * 'cancel_job()' - Flag the job as canceled. + */ + +static void +cancel_job(int sig) /* I - Signal number (unused) */ +{ + (void)sig; + + job_canceled = 1; +} + + +/* + * End of "$Id: pdftops.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/filter/postscript-driver.header b/filter/postscript-driver.header new file mode 100644 index 0000000..a0fedcf --- /dev/null +++ b/filter/postscript-driver.header @@ -0,0 +1,32 @@ + + +

Developing PostScript Printer Drivers

+ +

This document describes how to develop printer drivers for PostScript printers. Topics include: printer driver basics, creating new PPD files, importing existing PPD files, using custom filters, implementing color management, and adding Mac OS X features.

+ +
+ + + + + + +
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
diff --git a/filter/postscript-driver.shtml b/filter/postscript-driver.shtml new file mode 100644 index 0000000..439744f --- /dev/null +++ b/filter/postscript-driver.shtml @@ -0,0 +1,276 @@ +

Printer Driver Basics

+ +

A CUPS PostScript printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, zero or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

+ +

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into device-independent PostScript, and then from device-independent PostScript to device-dependent PostScript. Figure 1 shows the data flow of a typical print job.

+ +
+ + +
Figure 1: PostScript Filter Chain
PostScript Filter Chain
+ +

The optional PostScript filter can be provided to add printer-specific commands to the PostScript output that cannot be represented in the PPD file or to reorganize the output for special printer features. Typically this is used to support advanced job management or finishing functions on the printer. CUPS includes a generic PostScript filter that handles all PPD-defined commands.

+ +

The optional port monitor handles interface-specific protocol or encoding issues. For example, many PostScript printers support the Binary Communications Protocol (BCP) and Tagged Binary Communications Protocol (TBCP) to allow applications to print 8-bit ("binary") PostScript jobs. CUPS includes port monitors for BCP and TBCP, and you can supply your own port monitors as needed.

+ +

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

+ +

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

+ +
+ + +
Figure 2: Command Filter Chain
Command Filter Chain
+ +

PostScript printer drivers typically do not require their own command filter since CUPS includes a generic PostScript command filter that supports all of the standard functions using PPD-defined commands.

+ + +

Creating New PPD Files

+ +

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for a black-and-white PostScript printer.

+ +

Listing 1: "examples/postscript.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// Specify this is a PostScript printer driver
+DriverType ps
+
+// List the fonts that are supported, in this case all standard fonts
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "Foo LaserProofer 2000"
+Version 1.0
+
+// PostScript printer attributes
+Attribute DefaultColorSpace "" Gray
+Attribute LandscapeOrientation "" Minus90
+Attribute LanguageLevel "" "3"
+Attribute Product "" "(Foo LaserProofer 2000)"
+Attribute PSVersion "" "(3010) 0"
+Attribute TTRasterizer "" Type42
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize Legal
+MediaSize A4
+
+// Query command for page size
+Attribute "?PageSize" "" "
+      save
+      currentpagedevice /PageSize get aload pop
+      2 copy gt {exch} if (Unknown)
+      23 dict
+              dup [612 792] (Letter) put
+              dup [612 1008] (Legal) put
+              dup [595 842] (A4) put
+              {exch aload pop 4 index sub abs 5 le exch 
+               5 index sub abs 5 le and
+              {exch pop exit} {pop} ifelse
+      } bind forall = flush pop pop
+      restore"
+
+// Specify the name of the PPD file we want to generate
+PCFileName "fooproof.ppd"
+
+ +

Required Attributes

+ +

PostScript drivers require the attributes listed in Table 1. If not specified, the defaults for CUPS drivers are used. A typical PostScript driver information file would include the following attributes:

+ +
+Attribute DefaultColorSpace "" Gray
+Attribute LandscapeOrientation "" Minus90
+Attribute LanguageLevel "" "3"
+Attribute Product "" "(Foo LaserProofer 2000)"
+Attribute PSVersion "" "(3010) 0"
+Attribute TTRasterizer "" Type42
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Required PostScript Printer Driver Attributes
AttributeDescription
DefaultColorSpaceThe default colorspace: + Gray, RGB, CMY, or + CMYK. If not specified, then RGB is + assumed.
LandscapeOrientationThe preferred landscape + orientation: Plus90, Minus90, or + Any. If not specified, Plus90 is + assumed.
LanguageLevelThe PostScript language + level supported by the device: 1, 2, or 3. If not + specified, 2 is assumed.
ProductThe string returned by + the PostScript product operator, which + must include parenthesis to conform with + PostScript syntax rules for strings. Multiple + Product attributes may be specified to support + multiple products with the same PPD file. If not + specified, "(ESP Ghostscript)" and "(GNU Ghostscript)" + are assumed.
PSVersionThe PostScript + interpreter version numbers as returned by the + version and revision operators. The + required format is "(version) revision". Multiple + PSVersion attributes may be specified to + support multiple interpreter version numbers. If not + specified, "(3010) 705" and "(3010) 707" are + assumed.
TTRasterizerThe type of TrueType + font rasterizer supported by the device, if any. The + supported values are None, Accept68k, + Type42, and TrueImage. If not + specified, None is assumed.
+ +

Query Commands

+ +

Most PostScript printer PPD files include query commands (?PageSize, etc.) that allow applications to query the printer for its current settings and configuration. Query commands are included in driver information files as attributes. For example, the example in Listing 1 uses the following definition for the PageSize query command:

+ +
+Attribute "?PageSize" "" "
+      save
+      currentpagedevice /PageSize get aload pop
+      2 copy gt {exch} if (Unknown)
+      23 dict
+              dup [612 792] (Letter) put
+              dup [612 1008] (Legal) put
+              dup [595 842] (A4) put
+              {exch aload pop 4 index sub abs 5 le exch 
+               5 index sub abs 5 le and
+              {exch pop exit} {pop} ifelse
+      } bind forall = flush pop pop
+      restore"
+
+ +

Query commands can span multiple lines, however no single line may contain more than 255 characters.

+ +

Importing Existing PPD Files

+ +

CUPS includes a utility called ppdi(1) +which allows you to import existing PPD files into the driver information file +format used by the PPD compiler ppdc(1). Once +imported, you can modify, localize, and regenerate the PPD files easily. Type +the following command to import the PPD file mydevice.ppd into the +driver information file mydevice.drv:

+ +
+ppdi -o mydevice.drv mydevice.ppd
+
+ +

If you have a whole directory of PPD files that you would like to import, +you can list multiple filenames or use shell wildcards to import more than one +PPD file on the command-line:

+ +
+ppdi -o mydevice.drv mydevice1.ppd mydevice2.ppd
+ppdi -o mydevice.drv *.ppd
+
+ +

If the driver information file already exists, the new PPD +file entries are appended to the end of the file. Each PPD file +is placed in its own group of curly braces within the driver +information file.

+ + +

Using Custom Filters

+ +

Normally a PostScript printer driver will not utilize any additional print filters. For drivers that provide additional filters such as a CUPS command file filter for doing printer maintenance, you must also list the following Filter directive to handle printing PostScript files:

+ +
+Filter application/vnd.cups-postscript 0 -
+
+ +

Custom Command Filters

+ +

The application/vnd.cups-command file type is used for CUPS command files. Use the following Filter directive to handle CUPS command files:

+ +
+Filter application/vnd.cups-command 100 /path/to/command/filter
+
+ +

To use the standard PostScript command filter, specify commandtops as the path to the command filter.

+ +

Custom PDF Filters

+ +

The application/pdf file type is used for unfiltered PDF files while the application/vnd.cups-pdf file type is used for filtered PDF files. Use the following Filter directive to handle filtered PDF files:

+ +
+Filter application/vnd.cups-pdf 100 /path/to/pdf/filter
+
+ +

For unfiltered PDF files, use:

+ +
+Filter application/pdf 100 /path/to/pdf/filter
+
+ +

Custom PDF filters that accept filtered data do not need to perform number-up processing and other types of page imposition, while those that accept unfiltered data MUST do the number-up processing themselves.

+ +

Custom PostScript Filters

+ +

The application/vnd.cups-postscript file type is used for filtered PostScript files. Use the following Filter directive to handle PostScript files:

+ +
+Filter application/vnd.cups-postscript 100 /path/to/postscript/filter
+
+ + +

Implementing Color Management

+ +

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

+ +
+Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
+
+ +

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

+ +
+Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
+Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
+
+ +

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

+ + +

Adding Mac OS X Features

+ +

Mac OS X printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

+ +
+Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
+Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
+Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
+Attribute APPrinterPreset "name/text" "*option choice ..."
+
diff --git a/filter/ppd-compiler.header b/filter/ppd-compiler.header new file mode 100644 index 0000000..5a36477 --- /dev/null +++ b/filter/ppd-compiler.header @@ -0,0 +1,34 @@ + + +

Introduction to the PPD Compiler

+ +

This document describes how to use the CUPS PostScript Printer Description +(PPD) file compiler. The PPD compiler generates PPD files from simple text files +that describe the features and capabilities of one or more printers.

+ +
+ + + + + + +
See AlsoProgramming: Developing Raster Printer Drivers
+ Programming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
diff --git a/filter/ppd-compiler.shtml b/filter/ppd-compiler.shtml new file mode 100644 index 0000000..c98b95c --- /dev/null +++ b/filter/ppd-compiler.shtml @@ -0,0 +1,883 @@ +

The Basics

+ +

The PPD compiler, ppdc(1), is a +simple command-line tool that takes a single driver information file, +which by convention uses the extension .drv, and produces one or more +PPD files that may be distributed with your printer drivers for use with CUPS. +For example, you would run the following command to create the English language +PPD files defined by the driver information file mydrivers.drv:

+ +
+ppdc mydrivers.drv
+
+ +

The PPD files are placed in a subdirectory called +ppd. The -d option is used to put the PPD +files in a different location, for example:

+ +
+ppdc -d myppds mydrivers.drv
+
+ +

places the PPD files in a subdirectory named +myppds. Finally, use the -l option to +specify the language localization for the PPD files that are +created, for example:

+ +
+ppdc -d myppds/de -l de mydrivers.drv
+ppdc -d myppds/en -l en mydrivers.drv
+ppdc -d myppds/es -l es mydrivers.drv
+ppdc -d myppds/fr -l fr mydrivers.drv
+ppdc -d myppds/it -l it mydrivers.drv
+
+ +

creates PPD files in German (de), English (en), Spanish (es), +French (fr), and Italian (it) in the corresponding +subdirectories. Specify multiple languages (separated by commas) to produce +"globalized" PPD files:

+ +
+ppdc -d myppds -l de,en,es,fr,it mydrivers.drv
+
+ + +

Driver Information Files

+ +

The driver information files accepted by the PPD compiler are +plain text files that define the various attributes and options +that are included in the PPD files that are generated. A driver +information file can define the information for one or more printers and +their corresponding PPD files.

+ +

Listing 1: "examples/minimum.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ + +

A Simple Example

+ +

The example in Listing 1 shows a driver information +file which defines the minimum required attributes to provide a valid PPD file. +The first part of the file includes standard definition files for fonts and +media sizes:

+ +
+#include <font.defs>
+#include <media.defs>
+
+ +

The #include directive works just like the C/C++ include directive; +files included using the angle brackets (<filename>) are found +in any of the standard include directories and files included using quotes +("filename") are found in the same directory as the source or include +file. The <font.defs> include file defines the standard fonts +which are included with GPL Ghostscript and the Apple PDF RIP, while the +<media.defs> include file defines the standard media sizes +listed in Appendix B of the Adobe PostScript Printer Description File Format +Specification.

+ +

CUPS provides several other standard include files:

+ +
    + +
  • <epson.h> - Defines all of the rastertoepson driver + constants.
  • + +
  • <escp.h> - Defines all of the rastertoescpx driver + constants.
  • + +
  • <hp.h> - Defines all of the rastertohp driver + constants.
  • + +
  • <label.h> - Defines all of the rastertolabel driver + constants.
  • + +
  • <pcl.h> - Defines all of the rastertopclx driver + constants.
  • + +
  • <raster.defs> - Defines all of the CUPS raster format + constants.
  • + +
+ +

Next we list all of the fonts that are available in the driver; for CUPS +raster drivers, the following line is all that is usually supplied:

+ +
+Font *
+
+ +

The Font directive specifies the name of a single font or the +asterisk to specify all fonts. For example, you would use the following line to +define an additional bar code font that you are supplying with your printer +driver:

+ +
+//   name         encoding  version  charset  status
+Font Barcode-Foo  Special   "(1.0)"  Special  ROM
+
+ +

The name of the font is Barcode-Foo. Since it is not a standard +text font, the encoding and charset name Special is used. The version +number is 1.0 and the status (where the font is located) is +ROM to indicate that the font does not need to be embedded in +documents that use the font for this printer.

+ +

Third comes the manufacturer, model name, and version number information +strings:

+ +
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+ +

These strings are used when the user (or auto-configuration program) selects +the printer driver for a newly connected device.

+ +

The list of filters comes after the information strings; for the example in +Listing 1, we have a single filter that takes CUPS +raster data:

+ +
+Filter application/vnd.cups-raster 100 rastertofoo
+
+ +

Each filter specified in the driver information file is the equivalent of a +printer driver for that format; if a user submits a print job in a different +format, CUPS figures out the sequence of commands that will produce a supported +format for the least relative cost.

+ +

Once we have defined the driver information we specify the supported options. +For the example driver we support a single resolution of 600 dots per inch and +two media sizes, A4 and Letter:

+ +
+*MediaSize Letter
+MediaSize A4
+
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+ +

The asterisk in front of the MediaSize and Resolution +directives specify that those option choices are the default. The +MediaSize directive is followed by a media size name which is normally +defined in the <media.defs> file and corresponds to a standard +Adobe media size name. If the default media size is Letter, the PPD +compiler will override it to be A4 for non-English localizations for +you automatically.

+ +

The Resolution directive accepts several values after it as +follows:

+ +
    + +
  1. Colorspace for this resolution, if any. In the example file, the + colorspace k is used which corresponds to black. For printer + drivers that support color printing, this field is usually specified as + "-" for "no change".
  2. + +
  3. Bits per color. In the example file, we define 8 bits per color, for + a continuous-tone grayscale output. All versions of CUPS support 1 and + 8 bits per color. CUPS 1.2 and higher (Mac OS X 10.5 and higher) also + supports 16 bits per color.
  4. + +
  5. Rows per band. In the example file, we define 0 rows per band to + indicate that our printer driver does not process the page in + bands.
  6. + +
  7. Row feed. In the example, we define the feed value to be 0 to + indicate that our printer driver does not interleave the output.
  8. + +
  9. Row step. In the example, we define the step value to be 0 to + indicate that our printer driver does not interleave the output. This + value normally indicates the spacing between the nozzles of an inkjet + printer - when combined with the previous two values, it informs the + driver how to stagger the output on the page to produce interleaved + lines on the page for higher-resolution output.
  10. + +
  11. Choice name and text. In the example, we define the choice name and + text to be "600dpi/600 DPI". The name and text are separated by + slash (/) character; if no text is specified, then the name is + used as the text. The PPD compiler parses the name to determine the + actual resolution; the name can be of the form + RESOLUTIONdpi for resolutions that are equal + horizontally and vertically or HRESxVRESdpi for + isometric resolutions. Only integer resolution values are supported, so + a resolution name of 300dpi is valid while 300.1dpi is + not.
  12. + +
+ +

Finally, the PCFileName directive specifies that the named PPD file +should be written for the current driver definitions:

+ +
+PCFileName "foojet2k.ppd"
+
+ +

The filename follows the directive and must conform to the Adobe +filename requirements in the Adobe Postscript Printer Description File Format +Specification. Specifically, the filename may not exceed 8 characters followed +by the extension .ppd. The FileName directive can be used to +specify longer filenames:

+ +
+FileName "FooJet 2000"
+
+ + +

Grouping and Inheritance

+ +

The previous example created a single PPD file. Driver information files can +also define multiple printers by using the PPD compiler grouping functionality. +Directives are grouped using the curly braces ({ and }) and +every group that uses the PCFileName or FileName directives +produces a PPD file with that name. Listing 2 shows a +variation of the original example that uses two groups to define two printers +that share the same printer driver filter but provide two different resolution +options.

+ +

Listing 2: "examples/grouping.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and version
+Manufacturer "Foo"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "1200dpi/1200 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2001"
+  PCFileName "foojt2k1.ppd"
+}
+
+ +

The second example is essentially the same as the first, except that each +printer model is defined inside of a pair of curly braces. For example, the +first printer is defined using:

+ +
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+ +

The printer inherits all of the definitions from the parent group (the +top part of the file) and adds the additional definitions inside the curly +braces for that printer driver. When we define the second group, it also +inherits the same definitions from the parent group but none of the +definitions from the first driver. Groups can be nested to any number of levels +to support variations of similar models without duplication of information.

+ + +

Color Support

+ +

For printer drivers that support color printing, the +ColorDevice and ColorModel directives should be +used to tell the printing system that color output is desired +and in what formats. Listing 3 shows a +variation of the previous example which includes a color printer +that supports printing at 300 and 600 DPI.

+ +

The key changes are the addition of the ColorDevice +directive:

+ +
+ColorDevice true
+
+ +

which tells the printing system that the printer supports +color printing, and the ColorModel directives:

+ +
+ColorModel Gray/Grayscale w chunky 0
+*ColorModel RGB/Color rgb chunky 0
+
+ +

which tell the printing system which colorspaces are supported by the printer +driver for color printing. Each of the ColorModel directives is +followed by the option name and text (Gray/Grayscale and +RGB/Color), the colorspace name (w and rgb), the +color organization (chunky), and the compression mode number +(0) to be passed to the driver. The option name can be any of the +standard Adobe ColorModel names:

+ +
    + +
  • Gray - Grayscale output. + +
  • RGB - Color output, typically using the RGB + colorspace, but without a separate black channel. + +
  • CMYK - Color output with a separate black + channel. + +
+ +

Custom names can be used, however it is recommended that you use your vendor +prefix for any custom names, for example "fooName".

+ +

The colorspace name can be any of the following universally supported +colorspaces:

+ +
    +
  • w - Luminance
  • + +
  • rgb - Red, green, blue
  • + +
  • k - Black
  • + +
  • cmy - Cyan, magenta, yellow
  • + +
  • cmyk - Cyan, magenta, yellow, black
  • + +
+ +

The color organization can be any of the following values:

+ +
    + +
  • chunky - Color values are passed together on a line + as RGB RGB RGB RGB
  • + +
  • banded - Color values are passed separately + on a line as RRRR GGGG BBBB; not supported by the Apple + RIP filters
  • + +
  • planar - Color values are passed separately + on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB + BBBB BBBB; not supported by the Apple RIP filters
  • + +
+ +

The compression mode value is passed to the driver in the +cupsCompression attribute. It is traditionally used to select an +appropriate compression mode for the color model but can be used for any +purpose, such as specifying a photo mode vs. standard mode.

+ +

Listing 3: "examples/color.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and version
+Manufacturer "Foo"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+{
+  // Supported resolutions
+  *Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet 2000"
+  PCFileName "foojet2k.ppd"
+}
+
+{
+  // Supports color printing
+  ColorDevice true
+
+  // Supported colorspaces
+  ColorModel Gray/Grayscale w chunky 0
+  *ColorModel RGB/Color rgb chunky 0
+
+  // Supported resolutions
+  *Resolution - 8 0 0 0 "300dpi/300 DPI"
+  Resolution - 8 0 0 0 "600dpi/600 DPI"
+
+  // Specify the model name and filename...
+  ModelName "FooJet Color"
+  PCFileName "foojetco.ppd"
+}
+
+ + +

Defining Custom Options and Option Groups

+ +

The Group, Option, and Choice +directives are used to define or select a group, option, or +choice. Listing 4 shows a variation of +the first example that provides two custom options in a group +named "Footasm".

+ +

Listing 4: "examples/custom.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Option Group
+Group "Footasm"
+
+  // Boolean option
+  Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
+    *Choice True/Yes "<</cupsCompression 1>>setpagedevice"
+    Choice False/No "<</cupsCompression 0>>setpagedevice"
+
+  // Multiple choice option
+  Option "fooOutputType/Output Quality" PickOne AnySetup 10
+    *Choice "Auto/Automatic Selection"
+            "<</OutputType(Auto)>>setpagedevice""
+    Choice "Text/Optimize for Text"
+            "<</OutputType(Text)>>setpagedevice""
+    Choice "Graph/Optimize for Graphics"
+            "<</OutputType(Graph)>>setpagedevice""
+    Choice "Photo/Optimize for Photos"
+            "<</OutputType(Photo)>>setpagedevice""
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ +

The custom group is introduced by the Group +directive which is followed by the name and optionally text for +the user:

+ +
+Group "Footasm/Footastic Options"
+
+ +

The group name must conform to the PPD specification and +cannot exceed 40 characters in length. If you specify user text, +it cannot exceed 80 characters in length. The groups +General, Extra, and +InstallableOptions are predefined by CUPS; the general +and extra groups are filled by the UI options defined by the PPD +specification. The InstallableOptions group is reserved +for options that define whether accessories for the printer +(duplexer unit, finisher, stapler, etc.) are installed.

+ +

Once the group is specified, the Option directive is +used to introduce a new option:

+ +
+Option "fooEnhance/Resolution Enhancement" Boolean AnySetup 10
+
+ +

The directive is followed by the name of the option and any +optional user text, the option type, the PostScript document group, and +the sort order number. The option name must conform to the PPD specification +and cannot exceed 40 characters in length. If you specify user text, it +cannot exceed 80 characters in length.

+ +

The option type can be Boolean for true/false +selections, PickOne for picking one of many choices, or +PickMany for picking zero or more choices. Boolean +options can have at most two choices with the names +False and True. Pick options can have any +number of choices, although for Windows compatibility reasons +the number of choices should not exceed 255.

+ +

The PostScript document group is typically AnySetup, +meaning that the option can be introduced at any point in the +PostScript document. Other values include PageSetup to +include the option before each page and DocumentSetup +to include the option once at the beginning of the document.

+ +

The sort order number is used to sort the printer commands +associated with each option choice within the PostScript +document. This allows you to setup certain options before others +as required by the printer. For most CUPS raster printer +drivers, the value 10 can be used for all options.

+ +

Once the option is specified, each option choice can be +listed using the Choice directive:

+ +
+*Choice True/Yes "<</cupsCompression 1>>setpagedevice"
+Choice False/No "<</cupsCompression 0>>setpagedevice"
+
+ +

The directive is followed by the choice name and optionally +user text, and the PostScript commands that should be inserted +when printing a file to this printer. The option name must +conform to the PPD specification and cannot exceed 40 characters +in length. If you specify user text, it cannot exceed 80 +characters in length.

+ +

The PostScript commands are also interpreted by any RIP +filters, so these commands typically must be present for all +option choices. Most commands take the form:

+ +
+<</name value>>setpagedevice
+
+ +

where name is the name of the PostScript page device +attribute and value is the numeric or string value for +that attribute.

+ + +

Defining Constants

+ +

Sometimes you will want to define constants for your drivers +so that you can share values in different groups within the same +driver information file, or to share values between different +driver information files using the #include directive. +The #define directive is used to define constants for +use in your printer definitions:

+ +
+#define NAME value
+
+ +

The NAME is any sequence of letters, numbers, and +the underscore. The value is a number or string; if the +value contains spaces you must put double quotes around it, for +example:

+ +
+#define FOO "My String Value"
+
+ +

Constants can also be defined on the command-line using the -D +option:

+ +
+ppdc -DNAME="value" filename.drv
+
+ +

Once defined, you use the notation $NAME to substitute the value of +the constant in the file, for example:

+ +
+#define MANUFACTURER "Foo"
+#define FOO_600      0
+#define FOO_1200     1
+
+{
+  Manufacturer "$MANUFACTURER"
+  ModelNumber $FOO_600
+  ModelName "FooJet 2000"
+  ...
+}
+
+{
+  Manufacturer "$MANUFACTURER"
+  ModelNumber $FOO_1200
+  ModelName "FooJet 2001"
+  ...
+}
+
+ +

Numeric constants can be bitwise OR'd together by placing the constants +inside parenthesis, for example:

+ +
+// ModelNumber capability bits
+#define DUPLEX 1
+#define COLOR  2
+
+...
+
+{
+  // Define a model number specifying the capabilities of the printer...
+  ModelNumber ($DUPLEX $COLOR)
+  ...
+}
+
+ + +

Conditional Statements

+ +

The PPD compiler supports conditional compilation using the #if, +#elif, #else, and #endif directives. The #if +and #elif directives are followed by a constant name or an expression. +For example, to include a group of options when "ADVANCED" is defined:

+ +
+#if ADVANCED
+Group "Advanced/Advanced Options"
+  Option "fooCyanAdjust/Cyan Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooMagentaAdjust/Magenta Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooYellowAdjust/Yellow Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+  Option "fooBlackAdjust/Black Adjustment"
+    Choice "plus10/+10%" ""
+    Choice "plus5/+5%" ""
+    *Choice "none/No Adjustment" ""
+    Choice "minus5/-5%" ""
+    Choice "minus10/-10%" ""
+#endif
+
+ + +

Defining Constraints

+ +

Constraints are strings that are used to specify that one or more option +choices are incompatible, for example two-sided printing on transparency media. +Constraints are also used to prevent the use of uninstalled features such as the +duplexer unit, additional media trays, and so forth.

+ +

The UIConstraints directive is used to specify a constraint that is +placed in the PPD file. The directive is followed by a string using one of the +following formats:

+ +
+UIConstraints "*Option1 *Option2"
+UIConstraints "*Option1 Choice1 *Option2"
+UIConstraints "*Option1 *Option2 Choice2"
+UIConstraints "*Option1 Choice1 *Option2 Choice2"
+
+ +

Each option name is preceded by the asterisk (*). If no choice is +given for an option, then all choices except False and +None will conflict with the other option and choice(s). Since the PPD +compiler automatically adds reciprocal constraints (option A conflicts with +option B, so therefore option B conflicts with option A), you need only specify +the constraint once.

+ +

Listing 5: "examples/constraint.drv"

+ +
+
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer, model name, and version
+Manufacturer "Foo"
+ModelName "FooJet 2000"
+Version 1.0
+
+// Each filter provided by the driver...
+Filter application/vnd.cups-raster 100 rastertofoo
+
+// Supported page sizes
+*MediaSize Letter
+MediaSize A4
+
+// Supported resolutions
+*Resolution k 8 0 0 0 "600dpi/600 DPI"
+
+// Installable Option Group
+Group "InstallableOptions/Options Installed"
+
+  // Duplexing unit option
+  Option "OptionDuplexer/Duplexing Unit" Boolean AnySetup 10
+    Choice True/Installed ""
+    *Choice "False/Not Installed" ""
+
+// General Option Group
+Group General
+
+  // Duplexing option
+  Option "Duplex/Two-Sided Printing" PickOne AnySetup 10
+    *Choice "None/No" "<</Duplex false>>setpagedevice""
+    Choice "DuplexNoTumble/Long Edge Binding"
+           "<</Duplex true/Tumble false>>setpagedevice""
+    Choice "DuplexTumble/Short Edge Binding"
+           "<</Duplex true/Tumble true>>setpagedevice""
+
+// Only allow duplexing if the duplexer is installed
+UIConstraints "*Duplex *OptionDuplexer False"
+
+// Specify the name of the PPD file we want to generate...
+PCFileName "foojet2k.ppd"
+
+ +

Listing 5 shows a variation of the first example with +an added Duplex option and installable option for the duplexer, +OptionDuplex. A constraint is added at the end to specify that any +choice of the Duplex option that is not None is incompatible +with the "Duplexer Installed" option set to "Not Installed" +(False):

+ +
+UIConstraints "*Duplex *OptionDuplexer False"
+
+ +

Enhanced Constraints

+ +

CUPS 1.4 supports constraints between 2 or more options using the +Attribute directive. cupsUIConstraints attributes define +the constraints, while cupsUIResolver attributes define option changes +to resolve constraints. For example, we can specify the previous duplex +constraint with a resolver that turns off duplexing with the following two +lines:

+ +
+Attribute cupsUIConstraints DuplexOff "*Duplex *OptionDuplexer False"
+Attribute cupsUIResolver DuplexOff "*Duplex None"
+
+ +

Localization

+ +

The PPD compiler provides localization of PPD files in different languages +through message catalog files in the GNU gettext or Apple .strings +formats. Each user text string and several key PPD attribute values such as +LanguageVersion and LanguageEncoding are looked up in the +corresponding message catalog and the translated text is substituted in the +generated PPD files. One message catalog file can be used by multiple driver +information files, and each file contains a single language translation.

+ +

The ppdpo Utility

+ +

While CUPS includes localizations of all standard media sizes and options in +several languages, your driver information files may provide their own media +sizes and options that need to be localized. CUPS provides a utility program to +aid in the localization of drivers called ppdpo(1). The ppdpo program creates +or updates a message catalog file based upon one or more driver information +files. New messages are added with the word "TRANSLATE" added to the front of +the translation string to make locating new strings for translation easier. The +program accepts the message catalog filename and one or more driver information +files.

+ +

For example, run the following command to create a new German message catalog +called de.po for all of the driver information files in the current +directory:

+ +
+ppdpo -o de.po *.drv
+
+ +

If the file de.po already exists, ppdpo will update the +contents of the file with any new messages that need to be translated. To create +an Apple .strings file instead, specify the output filename with a .strings +extension, for example:

+ +
+ppdpo -o de.strings *.drv
+
+ +

Using Message Catalogs with the PPD Compiler

+ +

Once you have created a message catalog, use the #po directive to declare it in each +driver information file. For example, to declare the German message catalog for +a driver use:

+ +
+#po de "de.po"  // German
+
+ +

In fact, you can use the #po directive as many times as needed:

+ +
+#po de "de.po"  // German
+#po es "es.po"  // Spanish
+#po fr "fr.po"  // French
+#po it "it.po"  // Italian
+#po ja "ja.po"  // Japanese
+
+ +

The filename ("de.po", etc.) can be relative to the location of the driver +information file or an absolute path. Once defined, the PPD compiler will +automatically generate a globalized PPD for every language declared in your +driver information file. To generate a single-language PPD file, simply use the +-l option to list the corresponding locale, for example:

+ +
+ppdc -l de -d ppd/de mydrivers.drv
+
+ +

to generate German PPD files.

diff --git a/filter/pstext.c b/filter/pstext.c new file mode 100644 index 0000000..536c394 --- /dev/null +++ b/filter/pstext.c @@ -0,0 +1,511 @@ +/* + * "$Id: pstext.c 9533 2011-02-16 21:33:17Z mike $" + * + * Common PostScript text code for CUPS. + * + * Copyright 2008-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * psTextEmbedFonts() - Embed PostScript fonts. + * psTextListFonts() - List PostScript fonts. + * psTextInitialize() - Load and embed font data for UTF-8 text. + * psTextUTF8() - Output UTF-8 text at the current position. + * psTextUTF32() - Output UTF-32 text at the current position. + */ + +/* + * Include necessary headers... + */ + +#include "pstext.h" +#include + + +/* + * Composite font names... + */ + +static const char * const ps_font_names[] = +{ + "cupsNormal", + "cupsBold", + "cupsItalic", + "cupsBoldItalic" +}; + + +/* + * 'psTextEmbedFonts()'- Embed PostScript fonts. + */ + +void +psTextEmbedFonts(ps_text_t *fonts) /* I - Font data */ +{ + int i, j; /* Looping vars */ + const char *cups_datadir; /* CUPS_DATADIR environment variable */ + char *font; /* Current font */ + char filename[1024]; /* Current filename */ + FILE *fp; /* Current file */ + char line[1024]; /* Line from file */ + int ch; /* Character value */ + + + /* + * Get the data directory... + */ + + if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL) + cups_datadir = CUPS_DATADIR; + + /* + * Embed each font... + */ + + for (font = (char *)cupsArrayFirst(fonts->unique); + font; + font = (char *)cupsArrayNext(fonts->unique)) + { + printf("%%%%BeginResource: font %s\n", font); + + snprintf(filename, sizeof(filename), "%s/fonts/%s", cups_datadir, font); + if ((fp = fopen(filename, "rb")) != NULL) + { + while ((j = fread(line, 1, sizeof(line), fp)) > 0) + fwrite(line, 1, j, stdout); + + fclose(fp); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); + } + + puts("\n%%EndResource"); + } + + /* + * Write the encoding arrays... + */ + + puts("% Character encodings"); + + for (i = 0; i < fonts->num_fonts; i ++) + { + printf("/cupsEncoding%02x [\n", i); + + for (ch = 0; ch < 256; ch ++) + { + if (fonts->glyphs[fonts->codes[i * 256 + ch]]) + printf("/%s", fonts->glyphs[fonts->codes[i * 256 + ch]]); + else if (fonts->codes[i * 256 + ch] > 255) + printf("/uni%04X", fonts->codes[i * 256 + ch]); + else + printf("/.notdef"); + + if ((ch & 7) == 7) + putchar('\n'); + } + + puts("] def"); + } + + /* + * Construct composite fonts... Start by reencoding the base fonts... + */ + + puts("% Reencode base fonts"); + + for (i = 0; i < 4; i ++) + for (j = 0; j < fonts->num_fonts; j ++) + { + printf("/%s findfont\n", fonts->fonts[j][i]); + printf("dup length 1 add dict begin\n" + " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" + " /Encoding cupsEncoding%02x def\n" + " currentdict\n" + "end\n", j); + printf("/%s%02x exch definefont /%s%02x exch def\n", ps_font_names[i], j, + ps_font_names[i], j); + } + + /* + * Then merge them into composite fonts... + */ + + puts("% Create composite fonts"); + + for (i = 0; i < 4; i ++) + { + puts("8 dict begin"); + puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def" + "/Encoding["); + for (j = 0; j < fonts->num_fonts; j ++) + if (j == (fonts->num_fonts - 1)) + printf("%d", j); + else if ((j & 15) == 15) + printf("%d\n", j); + else + printf("%d ", j); + puts("]def/FDepVector["); + for (j = 0; j < fonts->num_fonts; j ++) + if (j == (fonts->num_fonts - 1)) + printf("%s%02x", ps_font_names[i], j); + else if ((j & 3) == 3) + printf("%s%02x\n", ps_font_names[i], j); + else + printf("%s%02x ", ps_font_names[i], j); + puts("]def currentdict end"); + printf("/%s exch definefont pop\n", ps_font_names[i]); + } + + /* + * Procedures... + */ + + puts("% Procedures to justify text...\n" + "/showcenter{dup stringwidth pop -0.5 mul 0 rmoveto show}bind def\n" + "/showleft{show}bind def\n" + "/showright{dup stringwidth pop neg 0 rmoveto show}bind def"); +} + + +/* + * 'psTextListFonts()' - List PostScript fonts. + */ + +void +psTextListFonts(ps_text_t *fonts) /* I - Font data */ +{ + char *font; /* Current font */ + + + font = (char *)cupsArrayFirst(fonts->unique); + printf("%%%%DocumentSuppliedResources: font %s\n", font); + while ((font = (char *)cupsArrayNext(fonts->unique)) != NULL) + printf("%%%%+ font %s\n", font); +} + + +/* + * 'psTextInitialize()' - Load and embed font data for UTF-8 text. + */ + +ps_text_t * /* O - Font data */ +psTextInitialize(void) +{ + ps_text_t *fonts; /* Font data */ + int i, j; /* Looping vars */ + char filename[1024]; /* Current filename */ + FILE *fp; /* Current file */ + const char *cups_datadir; /* CUPS_DATADIR environment variable */ + char line[1024], /* Line from file */ + *lineptr, /* Pointer into line */ + *valptr; /* Pointer to value in line */ + int unicode; /* Character value */ + int start, end; /* Start and end values for range */ + char glyph[64]; /* Glyph name */ + + + /* + * Get the data directory... + */ + + if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL) + cups_datadir = CUPS_DATADIR; + + /* + * Initialize the PostScript text data... + */ + + fonts = (ps_text_t *)calloc(1, sizeof(ps_text_t)); + fonts->size = -1.0; + fonts->style = -1; + + /* + * Load the PostScript glyph names... + */ + + snprintf(filename, sizeof(filename), "%s/data/psglyphs", cups_datadir); + + if ((fp = fopen(filename, "r")) != NULL) + { + while (fscanf(fp, "%x%63s", &unicode, glyph) == 2) + fonts->glyphs[unicode] = _cupsStrAlloc(glyph); + + fclose(fp); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); + exit(1); + } + + /* + * Open the UTF-8 character set definition... + */ + + snprintf(filename, sizeof(filename), "%s/charsets/utf-8", cups_datadir); + + if ((fp = fopen(filename, "r")) == NULL) + { + /* + * Can't open charset file! + */ + + _cupsLangPrintError("ERROR", _("Unable to open print file")); + fprintf(stderr, "DEBUG: Unable to open \"%s\".\n", filename); + exit(1); + } + + if (!fgets(line, sizeof(line), fp) || strncmp(line, "charset utf8", 12)) + { + /* + * Bad/empty charset file! + */ + + fclose(fp); + _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), + filename); + exit(1); + } + + /* + * Read the font descriptions... + */ + + fonts->unique = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Skip comment and blank lines... + */ + + if (line[0] == '#' || line[0] == '\n') + continue; + + /* + * Read the font descriptions that should look like: + * + * start end direction width normal [bold italic bold-italic] + */ + + lineptr = line; + + start = strtol(lineptr, &lineptr, 16); + end = strtol(lineptr, &lineptr, 16); + + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (!*lineptr) + { + /* + * Can't have a font without all required values... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Bad font description line \"%s\"."), valptr); + fclose(fp); + exit(1); + } + + *lineptr++ = '\0'; + + if (!strcmp(valptr, "ltor")) + fonts->directions[fonts->num_fonts] = 1; + else if (!strcmp(valptr, "rtol")) + fonts->directions[fonts->num_fonts] = -1; + else + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad text direction \"%s\"."), + valptr); + fclose(fp); + exit(1); + } + + /* + * Got the direction, now get the width... + */ + + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (!*lineptr) + { + /* + * Can't have a font without all required values... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Bad font description line \"%s\"."), valptr); + fclose(fp); + exit(1); + } + + *lineptr++ = '\0'; + + if (!strcmp(valptr, "single")) + fonts->widths[fonts->num_fonts] = 1; + else if (!strcmp(valptr, "double")) + fonts->widths[fonts->num_fonts] = 2; + else + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad text width \"%s\"."), + valptr); + fclose(fp); + exit(1); + } + + /* + * Get the fonts... + */ + + for (i = 0; *lineptr && i < 4; i ++) + { + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (*lineptr) + *lineptr++ = '\0'; + + if (lineptr > valptr) + { + if (!cupsArrayFind(fonts->unique, valptr)) + cupsArrayAdd(fonts->unique, _cupsStrAlloc(valptr)); + + fonts->fonts[fonts->num_fonts][i] = _cupsStrAlloc(valptr); + } + } + + /* + * Fill in remaining fonts as needed... + */ + + for (j = i; j < 4; j ++) + fonts->fonts[fonts->num_fonts][j] = + _cupsStrAlloc(fonts->fonts[fonts->num_fonts][0]); + + /* + * Define the character mappings... + */ + + for (i = start, j = fonts->num_fonts * 256; i <= end; i ++, j ++) + { + fonts->chars[i] = j; + fonts->codes[j] = i; + } + + /* + * Move to the next font, stopping if needed... + */ + + fonts->num_fonts ++; + if (fonts->num_fonts >= 256) + break; + } + + fclose(fp); + + if (cupsArrayCount(fonts->unique) == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No fonts in charset file.")); + exit(1); + } + + return (fonts); +} + + +/* + * 'psTextUTF8()' - Output UTF-8 text at the current position. + */ + +void +psTextUTF8(ps_text_t *fonts, /* I - Font data */ + float size, /* I - Size in points */ + int style, /* I - Style */ + int align, /* I - Alignment */ + const char *text) /* I - UTF-8 text */ +{ + cups_utf32_t utf32[2048]; /* Temporary buffer */ + int utf32len; /* Number of characters */ + + + if (!text) + { + puts(""); + return; + } + + if ((utf32len = cupsUTF8ToUTF32(utf32, (cups_utf8_t *)text, + (int)(sizeof(utf32) / sizeof(utf32[0])))) > 0) + psTextUTF32(fonts, size, style, align, utf32, utf32len); +} + + +/* + * 'psTextUTF32()' - Output UTF-32 text at the current position. + */ + +void +psTextUTF32(ps_text_t *fonts, /* I - Font data */ + float size, /* I - Size in points */ + int style, /* I - Font style */ + int align, /* I - Alignment */ + const cups_utf32_t *text, /* I - UTF-32 text */ + int textlen) /* I - Length of text */ +{ + if (size != fonts->size || style != fonts->style) + { + printf("/%s findfont %g scalefont setfont\n", ps_font_names[style], size); + fonts->size = size; + fonts->style = style; + } + + putchar('<'); + while (textlen > 0) + { + printf("%04x", fonts->chars[*text]); + text ++; + textlen --; + } + + if (align == PS_CENTER) + puts(">showcenter"); + else if (align == PS_RIGHT) + puts(">showright"); + else + puts(">showleft"); +} + + +/* + * End of "$Id: pstext.c 9533 2011-02-16 21:33:17Z mike $". + */ diff --git a/filter/pstext.h b/filter/pstext.h new file mode 100644 index 0000000..a8ff4cb --- /dev/null +++ b/filter/pstext.h @@ -0,0 +1,74 @@ +/* + * "$Id: pstext.h 9042 2010-03-24 00:45:34Z mike $" + * + * Common PostScript text definitions for CUPS. + * + * Copyright 2008-2010 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" +#include + + +/* + * Constants... + */ + +#define PS_NORMAL 0 /* Normal text */ +#define PS_BOLD 1 /* Bold text */ +#define PS_ITALIC 2 /* Italic text */ +#define PS_BOLDITALIC 3 /* Bold italic text */ + +#define PS_LEFT 1 /* Left-justified text */ +#define PS_CENTER 0 /* Center-justified text */ +#define PS_RIGHT -1 /* Right-justified text */ + + +/* + * Structures... + */ + +typedef struct ps_text_s /**** PostScript font data ****/ +{ + char *glyphs[65536]; /* PostScript glyphs for Unicode */ + int num_fonts; /* Number of fonts to use */ + char *fonts[256][4]; /* Fonts to use */ + cups_array_t *unique; /* Unique fonts */ + unsigned short chars[65536], /* 0xffcc (ff = font, cc = char) */ + codes[65536]; /* Unicode glyph mapping to fonts */ + int widths[256], /* Widths of each font */ + directions[256];/* Text directions for each font */ + float size; /* Current text size */ + int style; /* Current text style */ +} ps_text_t; + + +/* + * Functions... + */ + +extern void psTextEmbedFonts(ps_text_t *fonts); +extern void psTextListFonts(ps_text_t *fonts); +extern ps_text_t *psTextInitialize(void); +extern void psTextUTF8(ps_text_t *fonts, float size, int style, + int align, const char *text); +extern void psTextUTF32(ps_text_t *fonts, float size, int style, + int align, const cups_utf32_t *text, + int textlen); + + +/* + * End of "$Id: pstext.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/filter/pstops.c b/filter/pstops.c new file mode 100644 index 0000000..a7bcc07 --- /dev/null +++ b/filter/pstops.c @@ -0,0 +1,3490 @@ +/* + * "$Id: pstops.c 9955 2011-09-02 18:14:34Z mike $" + * + * PostScript filter for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry. + * add_page() - Add a page to the pages array. + * cancel_job() - Flag the job as canceled. + * check_range() - Check to see if the current page is selected for + * printing. + * copy_bytes() - Copy bytes from the input file to stdout. + * copy_comments() - Copy all of the comments section. + * copy_dsc() - Copy a DSC-conforming document. + * copy_non_dsc() - Copy a document that does not conform to the DSC. + * copy_page() - Copy a page description. + * copy_prolog() - Copy the document prolog section. + * copy_setup() - Copy the document setup section. + * copy_trailer() - Copy the document trailer. + * do_prolog() - Send the necessary document prolog commands. + * do_setup() - Send the necessary document setup commands. + * doc_printf() - Send a formatted string to stdout and/or the temp + * file. + * doc_puts() - Send a nul-terminated string to stdout and/or the + * temp file. + * doc_write() - Send data to stdout and/or the temp file. + * end_nup() - End processing for N-up printing. + * include_feature() - Include a printer option/feature command. + * parse_text() - Parse a text value in a comment. + * set_pstops_options() - Set pstops options. + * skip_page() - Skip past a page that won't be printed. + * start_nup() - Start processing for N-up printing. + * write_label_prolog() - Write the prolog with the classification and page + * label. + * write_labels() - Write the actual page labels. + * write_options() - Write options provided via %%IncludeFeature. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" +#include +#include +#include +#include +#include +#include + + +/* + * Constants... + */ + +#define PSTOPS_BORDERNONE 0 /* No border or hairline border */ +#define PSTOPS_BORDERTHICK 1 /* Think border */ +#define PSTOPS_BORDERSINGLE 2 /* Single-line hairline border */ +#define PSTOPS_BORDERSINGLE2 3 /* Single-line thick border */ +#define PSTOPS_BORDERDOUBLE 4 /* Double-line hairline border */ +#define PSTOPS_BORDERDOUBLE2 5 /* Double-line thick border */ + +#define PSTOPS_LAYOUT_LRBT 0 /* Left to right, bottom to top */ +#define PSTOPS_LAYOUT_LRTB 1 /* Left to right, top to bottom */ +#define PSTOPS_LAYOUT_RLBT 2 /* Right to left, bottom to top */ +#define PSTOPS_LAYOUT_RLTB 3 /* Right to left, top to bottom */ +#define PSTOPS_LAYOUT_BTLR 4 /* Bottom to top, left to right */ +#define PSTOPS_LAYOUT_TBLR 5 /* Top to bottom, left to right */ +#define PSTOPS_LAYOUT_BTRL 6 /* Bottom to top, right to left */ +#define PSTOPS_LAYOUT_TBRL 7 /* Top to bottom, right to left */ + +#define PSTOPS_LAYOUT_NEGATEY 1 /* The bits for the layout */ +#define PSTOPS_LAYOUT_NEGATEX 2 /* definitions above... */ +#define PSTOPS_LAYOUT_VERTICAL 4 + + +/* + * Types... + */ + +typedef struct /**** Page information ****/ +{ + char *label; /* Page label */ + int bounding_box[4]; /* PageBoundingBox */ + off_t offset; /* Offset to start of page */ + ssize_t length; /* Number of bytes for page */ + int num_options; /* Number of options for this page */ + cups_option_t *options; /* Options for this page */ +} pstops_page_t; + +typedef struct /**** Document information ****/ +{ + int page; /* Current page */ + int bounding_box[4]; /* BoundingBox from header */ + int new_bounding_box[4]; /* New composite bounding box */ + int num_options; /* Number of document-wide options */ + cups_option_t *options; /* Document-wide options */ + int normal_landscape, /* Normal rotation for landscape? */ + saw_eof, /* Saw the %%EOF comment? */ + slow_collate, /* Collate copies by hand? */ + slow_duplex, /* Duplex pages slowly? */ + slow_order, /* Reverse pages slowly? */ + use_ESPshowpage; /* Use ESPshowpage? */ + cups_array_t *pages; /* Pages in document */ + cups_file_t *temp; /* Temporary file, if any */ + char tempfile[1024]; /* Temporary filename */ + int job_id; /* Job ID */ + const char *user, /* User name */ + *title; /* Job name */ + int copies; /* Number of copies */ + const char *ap_input_slot, /* AP_FIRSTPAGE_InputSlot value */ + *ap_manual_feed, /* AP_FIRSTPAGE_ManualFeed value */ + *ap_media_color, /* AP_FIRSTPAGE_MediaColor value */ + *ap_media_type, /* AP_FIRSTPAGE_MediaType value */ + *ap_page_region, /* AP_FIRSTPAGE_PageRegion value */ + *ap_page_size; /* AP_FIRSTPAGE_PageSize value */ + float brightness; /* brightness value */ + int collate, /* Collate copies? */ + emit_jcl, /* Emit JCL commands? */ + fitplot; /* Fit pages to media */ + float gamma; /* gamma value */ + const char *input_slot, /* InputSlot value */ + *manual_feed, /* ManualFeed value */ + *media_color, /* MediaColor value */ + *media_type, /* MediaType value */ + *page_region, /* PageRegion value */ + *page_size; /* PageSize value */ + int mirror, /* doc->mirror/mirror pages */ + number_up, /* Number of pages on each sheet */ + number_up_layout, /* doc->number_up_layout of N-up pages */ + output_order, /* Requested reverse output order? */ + page_border; /* doc->page_border around pages */ + const char *page_label, /* page-label option, if any */ + *page_ranges, /* page-ranges option, if any */ + *page_set; /* page-set option, if any */ +} pstops_doc_t; + + +/* + * Convenience macros... + */ + +#define is_first_page(p) (doc->number_up == 1 || \ + ((p) % doc->number_up) == 1) +#define is_last_page(p) (doc->number_up == 1 || \ + ((p) % doc->number_up) == 0) +#define is_not_last_page(p) (doc->number_up > 1 && \ + ((p) % doc->number_up) != 0) + + +/* + * Local globals... + */ + +static int JobCanceled = 0;/* Set to 1 on SIGTERM */ + + +/* + * Local functions... + */ + +static pstops_page_t *add_page(pstops_doc_t *doc, const char *label); +static void cancel_job(int sig); +static int check_range(pstops_doc_t *doc, int page); +static void copy_bytes(cups_file_t *fp, off_t offset, + size_t length); +static ssize_t copy_comments(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, char *line, + ssize_t linelen, size_t linesize); +static void copy_dsc(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, char *line, ssize_t linelen, + size_t linesize); +static void copy_non_dsc(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, char *line, + ssize_t linelen, size_t linesize); +static ssize_t copy_page(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, int number, char *line, + ssize_t linelen, size_t linesize); +static ssize_t copy_prolog(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, char *line, + ssize_t linelen, size_t linesize); +static ssize_t copy_setup(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, char *line, + ssize_t linelen, size_t linesize); +static ssize_t copy_trailer(cups_file_t *fp, pstops_doc_t *doc, + ppd_file_t *ppd, int number, char *line, + ssize_t linelen, size_t linesize); +static void do_prolog(pstops_doc_t *doc, ppd_file_t *ppd); +static void do_setup(pstops_doc_t *doc, ppd_file_t *ppd); +static void doc_printf(pstops_doc_t *doc, const char *format, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +; +static void doc_puts(pstops_doc_t *doc, const char *s); +static void doc_write(pstops_doc_t *doc, const char *s, size_t len); +static void end_nup(pstops_doc_t *doc, int number); +static int include_feature(ppd_file_t *ppd, const char *line, + int num_options, + cups_option_t **options); +static char *parse_text(const char *start, char **end, char *buffer, + size_t bufsize); +static void set_pstops_options(pstops_doc_t *doc, ppd_file_t *ppd, + char *argv[], int num_options, + cups_option_t *options); +static ssize_t skip_page(cups_file_t *fp, char *line, ssize_t linelen, + size_t linesize); +static void start_nup(pstops_doc_t *doc, int number, + int show_border, const int *bounding_box); +static void write_label_prolog(pstops_doc_t *doc, const char *label, + float bottom, float top, + float width); +static void write_labels(pstops_doc_t *doc, int orient); +static void write_options(pstops_doc_t *doc, ppd_file_t *ppd, + int num_options, cups_option_t *options); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + pstops_doc_t doc; /* Document information */ + cups_file_t *fp; /* Print file */ + ppd_file_t *ppd; /* PPD file */ + int num_options; /* Number of print options */ + cups_option_t *options; /* Print options */ + char line[8192]; /* Line buffer */ + size_t len; /* Length of line buffer */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Ignore broken pipe signals... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options file"), + argv[0]); + return (1); + } + + /* + * Register a signal handler to cleanly cancel a job. + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, cancel_job); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = cancel_job; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, cancel_job); +#endif /* HAVE_SIGSET */ + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + fp = cupsFileStdin(); + else + { + /* + * Try to open the print file... + */ + + if ((fp = cupsFileOpen(argv[6], "r")) == NULL) + { + _cupsLangPrintError("ERROR", _("Unable to open print file")); + return (1); + } + } + + /* + * Read the first line to see if we have DSC comments... + */ + + if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0) + { + fputs("DEBUG: The print file is empty.\n", stderr); + return (1); + } + + /* + * Process command-line options... + */ + + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + ppd = SetCommonOptions(num_options, options, 1); + + set_pstops_options(&doc, ppd, argv, num_options, options); + + /* + * Write any "exit server" options that have been selected... + */ + + ppdEmit(ppd, stdout, PPD_ORDER_EXIT); + + /* + * Write any JCL commands that are needed to print PostScript code... + */ + + if (doc.emit_jcl) + ppdEmitJCL(ppd, stdout, doc.job_id, doc.user, doc.title); + + /* + * Start with a DSC header... + */ + + puts("%!PS-Adobe-3.0"); + + /* + * Skip leading PJL in the document... + */ + + while (!strncmp(line, "\033%-12345X", 9) || !strncmp(line, "@PJL ", 5)) + { + /* + * Yup, we have leading PJL fun, so skip it until we hit the line + * with "ENTER LANGUAGE"... + */ + + fputs("DEBUG: Skipping PJL header...\n", stderr); + + while (strstr(line, "ENTER LANGUAGE") == NULL && strncmp(line, "%!", 2)) + if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0) + break; + + if (!strncmp(line, "%!", 2)) + break; + + if ((len = cupsFileGetLine(fp, line, sizeof(line))) == 0) + break; + } + + /* + * Now see if the document conforms to the Adobe Document Structuring + * Conventions... + */ + + if (!strncmp(line, "%!PS-Adobe-", 11)) + { + /* + * Yes, filter the document... + */ + + copy_dsc(fp, &doc, ppd, line, len, sizeof(line)); + } + else + { + /* + * No, display an error message and treat the file as if it contains + * a single page... + */ + + copy_non_dsc(fp, &doc, ppd, line, len, sizeof(line)); + } + + /* + * Send %%EOF as needed... + */ + + if (!doc.saw_eof) + puts("%%EOF"); + + /* + * End the job with the appropriate JCL command or CTRL-D... + */ + + if (doc.emit_jcl) + { + if (ppd && ppd->jcl_end) + ppdEmitJCLEnd(ppd, stdout); + else + putchar(0x04); + } + + /* + * Close files and remove the temporary file if needed... + */ + + if (doc.temp) + { + cupsFileClose(doc.temp); + unlink(doc.tempfile); + } + + ppdClose(ppd); + cupsFreeOptions(num_options, options); + + cupsFileClose(fp); + + return (0); +} + + +/* + * 'add_page()' - Add a page to the pages array. + */ + +static pstops_page_t * /* O - New page info object */ +add_page(pstops_doc_t *doc, /* I - Document information */ + const char *label) /* I - Page label */ +{ + pstops_page_t *pageinfo; /* New page info object */ + + + if (!doc->pages) + doc->pages = cupsArrayNew(NULL, NULL); + + if (!doc->pages) + { + _cupsLangPrintError("EMERG", _("Unable to allocate memory for pages array")); + exit(1); + } + + if ((pageinfo = calloc(1, sizeof(pstops_page_t))) == NULL) + { + _cupsLangPrintError("EMERG", _("Unable to allocate memory for page info")); + exit(1); + } + + pageinfo->label = strdup(label); + pageinfo->offset = cupsFileTell(doc->temp); + + cupsArrayAdd(doc->pages, pageinfo); + + doc->page ++; + + return (pageinfo); +} + + +/* + * 'cancel_job()' - Flag the job as canceled. + */ + +static void +cancel_job(int sig) /* I - Signal number (unused) */ +{ + (void)sig; + + JobCanceled = 1; +} + + +/* + * 'check_range()' - Check to see if the current page is selected for + * printing. + */ + +static int /* O - 1 if selected, 0 otherwise */ +check_range(pstops_doc_t *doc, /* I - Document information */ + int page) /* I - Page number */ +{ + const char *range; /* Pointer into range string */ + int lower, upper; /* Lower and upper page numbers */ + + + if (doc->page_set) + { + /* + * See if we only print even or odd pages... + */ + + if (!_cups_strcasecmp(doc->page_set, "even") && (page & 1)) + return (0); + + if (!_cups_strcasecmp(doc->page_set, "odd") && !(page & 1)) + return (0); + } + + if (!doc->page_ranges) + return (1); /* No range, print all pages... */ + + for (range = doc->page_ranges; *range != '\0';) + { + if (*range == '-') + { + lower = 1; + range ++; + upper = strtol(range, (char **)&range, 10); + } + else + { + lower = strtol(range, (char **)&range, 10); + + if (*range == '-') + { + range ++; + if (!isdigit(*range & 255)) + upper = 65535; + else + upper = strtol(range, (char **)&range, 10); + } + else + upper = lower; + } + + if (page >= lower && page <= upper) + return (1); + + if (*range == ',') + range ++; + else + break; + } + + return (0); +} + + +/* + * 'copy_bytes()' - Copy bytes from the input file to stdout. + */ + +static void +copy_bytes(cups_file_t *fp, /* I - File to read from */ + off_t offset, /* I - Offset to page data */ + size_t length) /* I - Length of page data */ +{ + char buffer[8192]; /* Data buffer */ + ssize_t nbytes; /* Number of bytes read */ + size_t nleft; /* Number of bytes left/remaining */ + + + nleft = length; + + if (cupsFileSeek(fp, offset) < 0) + { + _cupsLangPrintError("ERROR", _("Unable to see in file")); + return; + } + + while (nleft > 0 || length == 0) + { + if (nleft > sizeof(buffer) || length == 0) + nbytes = sizeof(buffer); + else + nbytes = nleft; + + if ((nbytes = cupsFileRead(fp, buffer, nbytes)) < 1) + return; + + nleft -= nbytes; + + fwrite(buffer, 1, nbytes, stdout); + } +} + + +/* + * 'copy_comments()' - Copy all of the comments section. + * + * This function expects "line" to be filled with a comment line. + * On return, "line" will contain the next line in the file, if any. + */ + +static ssize_t /* O - Length of next line */ +copy_comments(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + int saw_bounding_box, /* Saw %%BoundingBox: comment? */ + saw_for, /* Saw %%For: comment? */ + saw_pages, /* Saw %%Pages: comment? */ + saw_title; /* Saw %%Title: comment? */ + + + /* + * Loop until we see %%EndComments or a non-comment line... + */ + + saw_bounding_box = 0; + saw_for = 0; + saw_pages = 0; + saw_title = 0; + + while (line[0] == '%') + { + /* + * Strip trailing whitespace... + */ + + while (linelen > 0) + { + linelen --; + + if (!isspace(line[linelen] & 255)) + break; + else + line[linelen] = '\0'; + } + + /* + * Log the header... + */ + + fprintf(stderr, "DEBUG: %s\n", line); + + /* + * Pull the headers out... + */ + + if (!strncmp(line, "%%Pages:", 8)) + { + int pages; /* Number of pages */ + + if (saw_pages) + fputs("DEBUG: A duplicate %%Pages: comment was seen.\n", stderr); + + saw_pages = 1; + + if (Duplex && (pages = atoi(line + 8)) > 0 && pages <= doc->number_up) + { + /* + * Since we will only be printing on a single page, disable duplexing. + */ + + Duplex = 0; + doc->slow_duplex = 0; + + if (cupsGetOption("sides", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("sides", "one-sided", + doc->num_options, &(doc->options)); + + if (cupsGetOption("Duplex", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("Duplex", "None", + doc->num_options, &(doc->options)); + + if (cupsGetOption("EFDuplex", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("EFDuplex", "None", + doc->num_options, &(doc->options)); + + if (cupsGetOption("EFDuplexing", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("EFDuplexing", "False", + doc->num_options, &(doc->options)); + + if (cupsGetOption("KD03Duplex", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("KD03Duplex", "None", + doc->num_options, &(doc->options)); + + if (cupsGetOption("JCLDuplex", doc->num_options, doc->options)) + doc->num_options = cupsAddOption("JCLDuplex", "None", + doc->num_options, &(doc->options)); + + ppdMarkOption(ppd, "Duplex", "None"); + ppdMarkOption(ppd, "EFDuplex", "None"); + ppdMarkOption(ppd, "EFDuplexing", "False"); + ppdMarkOption(ppd, "KD03Duplex", "None"); + ppdMarkOption(ppd, "JCLDuplex", "None"); + } + } + else if (!strncmp(line, "%%BoundingBox:", 14)) + { + if (saw_bounding_box) + fputs("DEBUG: A duplicate %%BoundingBox: comment was seen.\n", stderr); + else if (strstr(line + 14, "(atend)")) + { + /* + * Do nothing for now but use the default imageable area... + */ + } + else if (sscanf(line + 14, "%d%d%d%d", doc->bounding_box + 0, + doc->bounding_box + 1, doc->bounding_box + 2, + doc->bounding_box + 3) != 4) + { + fputs("DEBUG: A bad %%BoundingBox: comment was seen.\n", stderr); + + doc->bounding_box[0] = (int)PageLeft; + doc->bounding_box[1] = (int)PageBottom; + doc->bounding_box[2] = (int)PageRight; + doc->bounding_box[3] = (int)PageTop; + } + + saw_bounding_box = 1; + } + else if (!strncmp(line, "%%For:", 6)) + { + saw_for = 1; + doc_printf(doc, "%s\n", line); + } + else if (!strncmp(line, "%%Title:", 8)) + { + saw_title = 1; + doc_printf(doc, "%s\n", line); + } + else if (!strncmp(line, "%cupsRotation:", 14)) + { + /* + * Reset orientation of document? + */ + + int orient = (atoi(line + 14) / 90) & 3; + + if (orient != Orientation) + { + /* + * Yes, update things so that the pages come out right... + */ + + Orientation = (4 - Orientation + orient) & 3; + UpdatePageVars(); + Orientation = orient; + } + } + else if (!strcmp(line, "%%EndComments")) + { + linelen = cupsFileGetLine(fp, line, linesize); + break; + } + else if (strncmp(line, "%!", 2) && strncmp(line, "%cups", 5)) + doc_printf(doc, "%s\n", line); + + if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0) + break; + } + + if (!saw_bounding_box) + fputs("DEBUG: There wasn't a %%BoundingBox: comment in the header.\n", + stderr); + + if (!saw_pages) + fputs("DEBUG: There wasn't a %%Pages: comment in the header.\n", stderr); + + if (!saw_for) + WriteTextComment("For", doc->user); + + if (!saw_title) + WriteTextComment("Title", doc->title); + + if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) + { + /* + * Tell the document processor the copy and duplex options + * that are required... + */ + + doc_printf(doc, "%%%%Requirements: numcopies(%d)%s%s\n", doc->copies, + doc->collate ? " collate" : "", + Duplex ? " duplex" : ""); + + /* + * Apple uses RBI comments for various non-PPD options... + */ + + doc_printf(doc, "%%RBINumCopies: %d\n", doc->copies); + } + else + { + /* + * Tell the document processor the duplex option that is required... + */ + + if (Duplex) + doc_puts(doc, "%%Requirements: duplex\n"); + + /* + * Apple uses RBI comments for various non-PPD options... + */ + + doc_puts(doc, "%RBINumCopies: 1\n"); + } + + doc_puts(doc, "%%Pages: (atend)\n"); + doc_puts(doc, "%%BoundingBox: (atend)\n"); + doc_puts(doc, "%%EndComments\n"); + + return (linelen); +} + + +/* + * 'copy_dsc()' - Copy a DSC-conforming document. + * + * This function expects "line" to be filled with the %!PS-Adobe comment line. + */ + +static void +copy_dsc(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + int number; /* Page number */ + pstops_page_t *pageinfo; /* Page information */ + + + /* + * Make sure we use ESPshowpage for EPS files... + */ + + if (strstr(line, "EPSF")) + { + doc->use_ESPshowpage = 1; + doc->number_up = 1; + } + + /* + * Start sending the document with any commands needed... + */ + + fprintf(stderr, "DEBUG: Before copy_comments - %s", line); + linelen = copy_comments(fp, doc, ppd, line, linelen, linesize); + + /* + * Now find the prolog section, if any... + */ + + fprintf(stderr, "DEBUG: Before copy_prolog - %s", line); + linelen = copy_prolog(fp, doc, ppd, line, linelen, linesize); + + /* + * Then the document setup section... + */ + + fprintf(stderr, "DEBUG: Before copy_setup - %s", line); + linelen = copy_setup(fp, doc, ppd, line, linelen, linesize); + + /* + * Copy until we see %%Page:... + */ + + while (strncmp(line, "%%Page:", 7) && strncmp(line, "%%Trailer", 9)) + { + doc_write(doc, line, linelen); + + if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0) + break; + } + + /* + * Then process pages until we have no more... + */ + + number = 0; + + fprintf(stderr, "DEBUG: Before page loop - %s", line); + while (!strncmp(line, "%%Page:", 7)) + { + if (JobCanceled) + break; + + number ++; + + if (check_range(doc, (number - 1) / doc->number_up + 1)) + { + fprintf(stderr, "DEBUG: Copying page %d...\n", number); + linelen = copy_page(fp, doc, ppd, number, line, linelen, linesize); + } + else + { + fprintf(stderr, "DEBUG: Skipping page %d...\n", number); + linelen = skip_page(fp, line, linelen, linesize); + } + } + + /* + * Finish up the last page(s)... + */ + + if (number && is_not_last_page(number) && cupsArrayLast(doc->pages) && + check_range(doc, (number - 1) / doc->number_up + 1)) + { + pageinfo = (pstops_page_t *)cupsArrayLast(doc->pages); + + start_nup(doc, doc->number_up, 0, doc->bounding_box); + doc_puts(doc, "showpage\n"); + end_nup(doc, doc->number_up); + + pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset; + } + + if (doc->slow_duplex && (doc->page & 1)) + { + /* + * Make sure we have an even number of pages... + */ + + pageinfo = add_page(doc, "(filler)"); + + if (!doc->slow_order) + { + if (!ppd || !ppd->num_filters) + fprintf(stderr, "PAGE: %d %d\n", doc->page, + doc->slow_collate ? 1 : doc->copies); + + printf("%%%%Page: (filler) %d\n", doc->page); + } + + start_nup(doc, doc->number_up, 0, doc->bounding_box); + doc_puts(doc, "showpage\n"); + end_nup(doc, doc->number_up); + + pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset; + } + + /* + * Make additional copies as necessary... + */ + + number = doc->slow_order ? 0 : doc->page; + + if (doc->temp && !JobCanceled && cupsArrayCount(doc->pages) > 0) + { + int copy; /* Current copy */ + + + /* + * Reopen the temporary file for reading... + */ + + cupsFileClose(doc->temp); + + doc->temp = cupsFileOpen(doc->tempfile, "r"); + + /* + * Make the copies... + */ + + if (doc->slow_collate) + copy = !doc->slow_order; + else + copy = doc->copies - 1; + + for (; copy < doc->copies; copy ++) + { + if (JobCanceled) + break; + + /* + * Send end-of-job stuff followed by any start-of-job stuff required + * for the JCL options... + */ + + if (number && doc->emit_jcl && ppd && ppd->jcl_end) + { + /* + * Send the trailer... + */ + + puts("%%Trailer"); + printf("%%%%Pages: %d\n", cupsArrayCount(doc->pages)); + if (doc->number_up > 1 || doc->fitplot) + printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", + PageLeft, PageBottom, PageRight, PageTop); + else + printf("%%%%BoundingBox: %d %d %d %d\n", + doc->new_bounding_box[0], doc->new_bounding_box[1], + doc->new_bounding_box[2], doc->new_bounding_box[3]); + puts("%%EOF"); + + /* + * Start a new document... + */ + + ppdEmitJCLEnd(ppd, stdout); + ppdEmitJCL(ppd, stdout, doc->job_id, doc->user, doc->title); + + puts("%!PS-Adobe-3.0"); + + number = 0; + } + + /* + * Copy the prolog as needed... + */ + + if (!number) + { + pageinfo = (pstops_page_t *)cupsArrayFirst(doc->pages); + copy_bytes(doc->temp, 0, pageinfo->offset); + } + + /* + * Then copy all of the pages... + */ + + pageinfo = doc->slow_order ? (pstops_page_t *)cupsArrayLast(doc->pages) : + (pstops_page_t *)cupsArrayFirst(doc->pages); + + while (pageinfo) + { + if (JobCanceled) + break; + + number ++; + + if (!ppd || !ppd->num_filters) + fprintf(stderr, "PAGE: %d %d\n", number, + doc->slow_collate ? 1 : doc->copies); + + if (doc->number_up > 1) + { + printf("%%%%Page: (%d) %d\n", number, number); + printf("%%%%PageBoundingBox: %.0f %.0f %.0f %.0f\n", + PageLeft, PageBottom, PageRight, PageTop); + } + else + { + printf("%%%%Page: %s %d\n", pageinfo->label, number); + printf("%%%%PageBoundingBox: %d %d %d %d\n", + pageinfo->bounding_box[0], pageinfo->bounding_box[1], + pageinfo->bounding_box[2], pageinfo->bounding_box[3]); + } + + copy_bytes(doc->temp, pageinfo->offset, pageinfo->length); + + pageinfo = doc->slow_order ? (pstops_page_t *)cupsArrayPrev(doc->pages) : + (pstops_page_t *)cupsArrayNext(doc->pages); + } + } + } + + /* + * Restore the old showpage operator as needed... + */ + + if (doc->use_ESPshowpage) + puts("userdict/showpage/ESPshowpage load put\n"); + + /* + * Write/copy the trailer... + */ + + if (!JobCanceled) + copy_trailer(fp, doc, ppd, number, line, linelen, linesize); +} + + +/* + * 'copy_non_dsc()' - Copy a document that does not conform to the DSC. + * + * This function expects "line" to be filled with the %! comment line. + */ + +static void +copy_non_dsc(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + int copy; /* Current copy */ + char buffer[8192]; /* Copy buffer */ + int bytes; /* Number of bytes copied */ + + + /* + * First let the user know that they are attempting to print a file + * that may not print correctly... + */ + + fputs("DEBUG: This document does not conform to the Adobe Document " + "Structuring Conventions and may not print correctly.\n", stderr); + + /* + * Then write a standard DSC comment section... + */ + + printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", PageLeft, PageBottom, + PageRight, PageTop); + + if (doc->slow_collate && doc->copies > 1) + printf("%%%%Pages: %d\n", doc->copies); + else + puts("%%Pages: 1"); + + WriteTextComment("For", doc->user); + WriteTextComment("Title", doc->title); + + if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) + { + /* + * Tell the document processor the copy and duplex options + * that are required... + */ + + printf("%%%%Requirements: numcopies(%d)%s%s\n", doc->copies, + doc->collate ? " collate" : "", + Duplex ? " duplex" : ""); + + /* + * Apple uses RBI comments for various non-PPD options... + */ + + printf("%%RBINumCopies: %d\n", doc->copies); + } + else + { + /* + * Tell the document processor the duplex option that is required... + */ + + if (Duplex) + puts("%%Requirements: duplex"); + + /* + * Apple uses RBI comments for various non-PPD options... + */ + + puts("%RBINumCopies: 1"); + } + + puts("%%EndComments"); + + /* + * Then the prolog... + */ + + puts("%%BeginProlog"); + + do_prolog(doc, ppd); + + puts("%%EndProlog"); + + /* + * Then the setup section... + */ + + puts("%%BeginSetup"); + + do_setup(doc, ppd); + + puts("%%EndSetup"); + + /* + * Finally, embed a copy of the file inside a %%Page... + */ + + if (!ppd || !ppd->num_filters) + fprintf(stderr, "PAGE: 1 %d\n", doc->temp ? 1 : doc->copies); + + puts("%%Page: 1 1"); + puts("%%BeginPageSetup"); + ppdEmit(ppd, stdout, PPD_ORDER_PAGE); + puts("%%EndPageSetup"); + puts("%%BeginDocument: nondsc"); + + fwrite(line, linelen, 1, stdout); + + if (doc->temp) + cupsFileWrite(doc->temp, line, linelen); + + while ((bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) + { + fwrite(buffer, 1, bytes, stdout); + + if (doc->temp) + cupsFileWrite(doc->temp, buffer, bytes); + } + + puts("%%EndDocument"); + + if (doc->use_ESPshowpage) + { + WriteLabels(Orientation); + puts("ESPshowpage"); + } + + if (doc->temp && !JobCanceled) + { + /* + * Reopen the temporary file for reading... + */ + + cupsFileClose(doc->temp); + + doc->temp = cupsFileOpen(doc->tempfile, "r"); + + /* + * Make the additional copies as needed... + */ + + for (copy = 1; copy < doc->copies; copy ++) + { + if (JobCanceled) + break; + + if (!ppd || !ppd->num_filters) + fputs("PAGE: 1 1\n", stderr); + + printf("%%%%Page: %d %d\n", copy + 1, copy + 1); + puts("%%BeginPageSetup"); + ppdEmit(ppd, stdout, PPD_ORDER_PAGE); + puts("%%EndPageSetup"); + puts("%%BeginDocument: nondsc"); + + copy_bytes(doc->temp, 0, 0); + + puts("%%EndDocument"); + + if (doc->use_ESPshowpage) + { + WriteLabels(Orientation); + puts("ESPshowpage"); + } + } + } + + /* + * Restore the old showpage operator as needed... + */ + + if (doc->use_ESPshowpage) + puts("userdict/showpage/ESPshowpage load put\n"); +} + + +/* + * 'copy_page()' - Copy a page description. + * + * This function expects "line" to be filled with a %%Page comment line. + * On return, "line" will contain the next line in the file, if any. + */ + +static ssize_t /* O - Length of next line */ +copy_page(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + int number, /* I - Current page number */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + char label[256], /* Page label string */ + *ptr; /* Pointer into line */ + int level; /* Embedded document level */ + pstops_page_t *pageinfo; /* Page information */ + int first_page; /* First page on N-up output? */ + int has_page_setup = 0; /* Does the page have %%Begin/EndPageSetup? */ + int bounding_box[4]; /* PageBoundingBox */ + + + /* + * Get the page label for this page... + */ + + first_page = is_first_page(number); + + if (!parse_text(line + 7, &ptr, label, sizeof(label))) + { + fputs("DEBUG: There was a bad %%Page: comment in the file.\n", stderr); + label[0] = '\0'; + number = doc->page; + } + else if (strtol(ptr, &ptr, 10) == LONG_MAX || !isspace(*ptr & 255)) + { + fputs("DEBUG: There was a bad %%Page: comment in the file.\n", stderr); + number = doc->page; + } + + /* + * Create or update the current output page... + */ + + if (first_page) + pageinfo = add_page(doc, label); + else + pageinfo = (pstops_page_t *)cupsArrayLast(doc->pages); + + /* + * Handle first page override... + */ + + if (doc->ap_input_slot || doc->ap_manual_feed) + { + if (doc->page == 1) + { + /* + * First page/sheet gets AP_FIRSTPAGE_* options... + */ + + pageinfo->num_options = cupsAddOption("InputSlot", doc->ap_input_slot, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("ManualFeed", + doc->ap_input_slot ? "False" : + doc->ap_manual_feed, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("MediaColor", doc->ap_media_color, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("MediaType", doc->ap_media_type, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("PageRegion", doc->ap_page_region, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("PageSize", doc->ap_page_size, + pageinfo->num_options, + &(pageinfo->options)); + } + else if (doc->page == (Duplex + 2)) + { + /* + * Second page/sheet gets default options... + */ + + pageinfo->num_options = cupsAddOption("InputSlot", doc->input_slot, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("ManualFeed", + doc->input_slot ? "False" : + doc->manual_feed, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("MediaColor", doc->media_color, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("MediaType", doc->media_type, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("PageRegion", doc->page_region, + pageinfo->num_options, + &(pageinfo->options)); + pageinfo->num_options = cupsAddOption("PageSize", doc->page_size, + pageinfo->num_options, + &(pageinfo->options)); + } + } + + /* + * Scan comments until we see something other than %%Page*: or + * %%Include*... + */ + + memcpy(bounding_box, doc->bounding_box, sizeof(bounding_box)); + + while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0) + { + if (!strncmp(line, "%%PageBoundingBox:", 18)) + { + /* + * %%PageBoundingBox: llx lly urx ury + */ + + if (sscanf(line + 18, "%d%d%d%d", bounding_box + 0, + bounding_box + 1, bounding_box + 2, + bounding_box + 3) != 4) + { + fputs("DEBUG: There was a bad %%PageBoundingBox: comment in the file.\n", stderr); + memcpy(bounding_box, doc->bounding_box, + sizeof(bounding_box)); + } + else if (doc->number_up == 1 && !doc->fitplot && Orientation) + { + int temp_bbox[4]; /* Temporary bounding box */ + + + memcpy(temp_bbox, bounding_box, sizeof(temp_bbox)); + + fprintf(stderr, "DEBUG: Orientation = %d\n", Orientation); + fprintf(stderr, "DEBUG: original bounding_box = [ %d %d %d %d ]\n", + bounding_box[0], bounding_box[1], + bounding_box[2], bounding_box[3]); + fprintf(stderr, "DEBUG: PageWidth = %.1f, PageLength = %.1f\n", + PageWidth, PageLength); + + switch (Orientation) + { + case 1 : /* Landscape */ + bounding_box[0] = PageLength - temp_bbox[3]; + bounding_box[1] = temp_bbox[0]; + bounding_box[2] = PageLength - temp_bbox[1]; + bounding_box[3] = temp_bbox[2]; + break; + + case 2 : /* Reverse Portrait */ + bounding_box[0] = PageWidth - temp_bbox[2]; + bounding_box[1] = PageLength - temp_bbox[3]; + bounding_box[2] = PageWidth - temp_bbox[0]; + bounding_box[3] = PageLength - temp_bbox[1]; + break; + + case 3 : /* Reverse Landscape */ + bounding_box[0] = temp_bbox[1]; + bounding_box[1] = PageWidth - temp_bbox[2]; + bounding_box[2] = temp_bbox[3]; + bounding_box[3] = PageWidth - temp_bbox[0]; + break; + } + + fprintf(stderr, "DEBUG: updated bounding_box = [ %d %d %d %d ]\n", + bounding_box[0], bounding_box[1], + bounding_box[2], bounding_box[3]); + } + } +#if 0 + else if (!strncmp(line, "%%PageCustomColors:", 19) || + !strncmp(line, "%%PageMedia:", 12) || + !strncmp(line, "%%PageOrientation:", 18) || + !strncmp(line, "%%PageProcessColors:", 20) || + !strncmp(line, "%%PageRequirements:", 18) || + !strncmp(line, "%%PageResources:", 16)) + { + /* + * Copy literal... + */ + } +#endif /* 0 */ + else if (!strncmp(line, "%%PageCustomColors:", 19)) + { + /* + * %%PageCustomColors: ... + */ + } + else if (!strncmp(line, "%%PageMedia:", 12)) + { + /* + * %%PageMedia: ... + */ + } + else if (!strncmp(line, "%%PageOrientation:", 18)) + { + /* + * %%PageOrientation: ... + */ + } + else if (!strncmp(line, "%%PageProcessColors:", 20)) + { + /* + * %%PageProcessColors: ... + */ + } + else if (!strncmp(line, "%%PageRequirements:", 18)) + { + /* + * %%PageRequirements: ... + */ + } + else if (!strncmp(line, "%%PageResources:", 16)) + { + /* + * %%PageResources: ... + */ + } + else if (!strncmp(line, "%%IncludeFeature:", 17)) + { + /* + * %%IncludeFeature: *MainKeyword OptionKeyword + */ + + if (doc->number_up == 1 &&!doc->fitplot) + pageinfo->num_options = include_feature(ppd, line, + pageinfo->num_options, + &(pageinfo->options)); + } + else if (!strncmp(line, "%%BeginPageSetup", 16)) + { + has_page_setup = 1; + break; + } + else + break; + } + + if (doc->number_up == 1) + { + /* + * Update the document's composite and page bounding box... + */ + + memcpy(pageinfo->bounding_box, bounding_box, + sizeof(pageinfo->bounding_box)); + + if (bounding_box[0] < doc->new_bounding_box[0]) + doc->new_bounding_box[0] = bounding_box[0]; + if (bounding_box[1] < doc->new_bounding_box[1]) + doc->new_bounding_box[1] = bounding_box[1]; + if (bounding_box[2] > doc->new_bounding_box[2]) + doc->new_bounding_box[2] = bounding_box[2]; + if (bounding_box[3] > doc->new_bounding_box[3]) + doc->new_bounding_box[3] = bounding_box[3]; + } + + /* + * Output the page header as needed... + */ + + if (!doc->slow_order && first_page) + { + if (!ppd || !ppd->num_filters) + fprintf(stderr, "PAGE: %d %d\n", doc->page, + doc->slow_collate ? 1 : doc->copies); + + if (doc->number_up > 1) + { + printf("%%%%Page: (%d) %d\n", doc->page, doc->page); + printf("%%%%PageBoundingBox: %.0f %.0f %.0f %.0f\n", + PageLeft, PageBottom, PageRight, PageTop); + } + else + { + printf("%%%%Page: %s %d\n", pageinfo->label, doc->page); + printf("%%%%PageBoundingBox: %d %d %d %d\n", + pageinfo->bounding_box[0], pageinfo->bounding_box[1], + pageinfo->bounding_box[2], pageinfo->bounding_box[3]); + } + } + + /* + * Copy any page setup commands... + */ + + if (first_page) + doc_puts(doc, "%%BeginPageSetup\n"); + + if (has_page_setup) + { + int feature = 0; /* In a Begin/EndFeature block? */ + + while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0) + { + if (!strncmp(line, "%%EndPageSetup", 14)) + break; + else if (!strncmp(line, "%%BeginFeature:", 15)) + { + feature = 1; + + if (doc->number_up > 1 || doc->fitplot) + continue; + } + else if (!strncmp(line, "%%EndFeature", 12)) + { + feature = 0; + + if (doc->number_up > 1 || doc->fitplot) + continue; + } + else if (!strncmp(line, "%%IncludeFeature:", 17)) + { + pageinfo->num_options = include_feature(ppd, line, + pageinfo->num_options, + &(pageinfo->options)); + continue; + } + else if (!strncmp(line, "%%Include", 9)) + continue; + + if (line[0] != '%' && !feature) + break; + + if (!feature || (doc->number_up == 1 && !doc->fitplot)) + doc_write(doc, line, linelen); + } + + /* + * Skip %%EndPageSetup... + */ + + if (linelen > 0 && !strncmp(line, "%%EndPageSetup", 14)) + linelen = cupsFileGetLine(fp, line, linesize); + } + + if (first_page) + { + char *page_setup; /* PageSetup commands to send */ + + + if (pageinfo->num_options > 0) + write_options(doc, ppd, pageinfo->num_options, pageinfo->options); + + /* + * Output commands for the current page... + */ + + page_setup = ppdEmitString(ppd, PPD_ORDER_PAGE, 0); + + if (page_setup) + { + doc_puts(doc, page_setup); + free(page_setup); + } + } + + /* + * Prep for the start of the page description... + */ + + start_nup(doc, number, 1, bounding_box); + + if (first_page) + doc_puts(doc, "%%EndPageSetup\n"); + + /* + * Read the rest of the page description... + */ + + level = 0; + + do + { + if (level == 0 && + (!strncmp(line, "%%Page:", 7) || + !strncmp(line, "%%Trailer", 9) || + !strncmp(line, "%%EOF", 5))) + break; + else if (!strncmp(line, "%%BeginDocument", 15) || + !strncmp(line, "%ADO_BeginApplication", 21)) + { + doc_write(doc, line, linelen); + + level ++; + } + else if ((!strncmp(line, "%%EndDocument", 13) || + !strncmp(line, "%ADO_EndApplication", 19)) && level > 0) + { + doc_write(doc, line, linelen); + + level --; + } + else if (!strncmp(line, "%%BeginBinary:", 14) || + (!strncmp(line, "%%BeginData:", 12) && + !strstr(line, "ASCII") && !strstr(line, "Hex"))) + { + /* + * Copy binary data... + */ + + int bytes; /* Bytes of data */ + + + doc_write(doc, line, linelen); + + bytes = atoi(strchr(line, ':') + 1); + + while (bytes > 0) + { + if (bytes > linesize) + linelen = cupsFileRead(fp, line, linesize); + else + linelen = cupsFileRead(fp, line, bytes); + + if (linelen < 1) + { + line[0] = '\0'; + perror("ERROR: Early end-of-file while reading binary data"); + return (0); + } + + doc_write(doc, line, linelen); + + bytes -= linelen; + } + } + else + doc_write(doc, line, linelen); + } + while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0); + + /* + * Finish up this page and return... + */ + + end_nup(doc, number); + + pageinfo->length = cupsFileTell(doc->temp) - pageinfo->offset; + + return (linelen); +} + + +/* + * 'copy_prolog()' - Copy the document prolog section. + * + * This function expects "line" to be filled with a %%BeginProlog comment line. + * On return, "line" will contain the next line in the file, if any. + */ + +static ssize_t /* O - Length of next line */ +copy_prolog(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + while (strncmp(line, "%%BeginProlog", 13)) + { + if (!strncmp(line, "%%BeginSetup", 12) || !strncmp(line, "%%Page:", 7)) + break; + + doc_write(doc, line, linelen); + + if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0) + break; + } + + doc_puts(doc, "%%BeginProlog\n"); + + do_prolog(doc, ppd); + + if (!strncmp(line, "%%BeginProlog", 13)) + { + while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0) + { + if (!strncmp(line, "%%EndProlog", 11) || + !strncmp(line, "%%BeginSetup", 12) || + !strncmp(line, "%%Page:", 7)) + break; + + doc_write(doc, line, linelen); + } + + if (!strncmp(line, "%%EndProlog", 11)) + linelen = cupsFileGetLine(fp, line, linesize); + else + fputs("DEBUG: The %%EndProlog comment is missing.\n", stderr); + } + + doc_puts(doc, "%%EndProlog\n"); + + return (linelen); +} + + +/* + * 'copy_setup()' - Copy the document setup section. + * + * This function expects "line" to be filled with a %%BeginSetup comment line. + * On return, "line" will contain the next line in the file, if any. + */ + +static ssize_t /* O - Length of next line */ +copy_setup(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + + + while (strncmp(line, "%%BeginSetup", 12)) + { + if (!strncmp(line, "%%Page:", 7)) + break; + + doc_write(doc, line, linelen); + + if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0) + break; + } + + doc_puts(doc, "%%BeginSetup\n"); + + do_setup(doc, ppd); + + num_options = 0; + options = NULL; + + if (!strncmp(line, "%%BeginSetup", 12)) + { + while (strncmp(line, "%%EndSetup", 10)) + { + if (!strncmp(line, "%%Page:", 7)) + break; + else if (!strncmp(line, "%%IncludeFeature:", 17)) + { + /* + * %%IncludeFeature: *MainKeyword OptionKeyword + */ + + if (doc->number_up == 1 && !doc->fitplot) + num_options = include_feature(ppd, line, num_options, &options); + } + else if (strncmp(line, "%%BeginSetup", 12)) + doc_write(doc, line, linelen); + + if ((linelen = cupsFileGetLine(fp, line, linesize)) == 0) + break; + } + + if (!strncmp(line, "%%EndSetup", 10)) + linelen = cupsFileGetLine(fp, line, linesize); + else + fputs("DEBUG: The %%EndSetup comment is missing.\n", stderr); + } + + if (num_options > 0) + { + write_options(doc, ppd, num_options, options); + cupsFreeOptions(num_options, options); + } + + doc_puts(doc, "%%EndSetup\n"); + + return (linelen); +} + + +/* + * 'copy_trailer()' - Copy the document trailer. + * + * This function expects "line" to be filled with a %%Trailer comment line. + * On return, "line" will contain the next line in the file, if any. + */ + +static ssize_t /* O - Length of next line */ +copy_trailer(cups_file_t *fp, /* I - File to read from */ + pstops_doc_t *doc, /* I - Document info */ + ppd_file_t *ppd, /* I - PPD file */ + int number, /* I - Number of pages */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + /* + * Write the trailer comments... + */ + + puts("%%Trailer"); + + while (linelen > 0) + { + if (!strncmp(line, "%%EOF", 5)) + break; + else if (strncmp(line, "%%Trailer", 9) && + strncmp(line, "%%Pages:", 8) && + strncmp(line, "%%BoundingBox:", 14)) + fwrite(line, 1, linelen, stdout); + + linelen = cupsFileGetLine(fp, line, linesize); + } + + fprintf(stderr, "DEBUG: Wrote %d pages...\n", number); + + printf("%%%%Pages: %d\n", number); + if (doc->number_up > 1 || doc->fitplot) + printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n", + PageLeft, PageBottom, PageRight, PageTop); + else + printf("%%%%BoundingBox: %d %d %d %d\n", + doc->new_bounding_box[0], doc->new_bounding_box[1], + doc->new_bounding_box[2], doc->new_bounding_box[3]); + + return (linelen); +} + + +/* + * 'do_prolog()' - Send the necessary document prolog commands. + */ + +static void +do_prolog(pstops_doc_t *doc, /* I - Document information */ + ppd_file_t *ppd) /* I - PPD file */ +{ + char *ps; /* PS commands */ + + + /* + * Send the document prolog commands... + */ + + if (ppd && ppd->patches) + { + doc_puts(doc, "%%BeginFeature: *JobPatchFile 1\n"); + doc_puts(doc, ppd->patches); + doc_puts(doc, "\n%%EndFeature\n"); + } + + if ((ps = ppdEmitString(ppd, PPD_ORDER_PROLOG, 0.0)) != NULL) + { + doc_puts(doc, ps); + free(ps); + } + + /* + * Define ESPshowpage here so that applications that define their + * own procedure to do a showpage pick it up... + */ + + if (doc->use_ESPshowpage) + doc_puts(doc, "userdict/ESPshowpage/showpage load put\n" + "userdict/showpage{}put\n"); +} + + +/* + * 'do_setup()' - Send the necessary document setup commands. + */ + +static void +do_setup(pstops_doc_t *doc, /* I - Document information */ + ppd_file_t *ppd) /* I - PPD file */ +{ + char *ps; /* PS commands */ + + + /* + * Disable CTRL-D so that embedded files don't cause printing + * errors... + */ + + doc_puts(doc, "% Disable CTRL-D as an end-of-file marker...\n"); + doc_puts(doc, "userdict dup(\\004)cvn{}put (\\004\\004)cvn{}put\n"); + + /* + * Mark job options... + */ + + cupsMarkOptions(ppd, doc->num_options, doc->options); + + /* + * Send all the printer-specific setup commands... + */ + + if ((ps = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, 0.0)) != NULL) + { + doc_puts(doc, ps); + free(ps); + } + + if ((ps = ppdEmitString(ppd, PPD_ORDER_ANY, 0.0)) != NULL) + { + doc_puts(doc, ps); + free(ps); + } + + /* + * Set the number of copies for the job... + */ + + if (doc->copies != 1 && (!doc->collate || !doc->slow_collate)) + { + doc_printf(doc, "%%RBIBeginNonPPDFeature: *NumCopies %d\n", doc->copies); + doc_printf(doc, + "%d/languagelevel where{pop languagelevel 2 ge}{false}ifelse\n" + "{1 dict begin/NumCopies exch def currentdict end " + "setpagedevice}\n" + "{userdict/#copies 3 -1 roll put}ifelse\n", doc->copies); + doc_puts(doc, "%RBIEndNonPPDFeature\n"); + } + + /* + * If we are doing N-up printing, disable setpagedevice... + */ + + if (doc->number_up > 1) + { + doc_puts(doc, "userdict/CUPSsetpagedevice/setpagedevice load put\n"); + doc_puts(doc, "userdict/setpagedevice{pop}bind put\n"); + } + + /* + * Changes to the transfer function must be made AFTER any + * setpagedevice code... + */ + + if (doc->gamma != 1.0f || doc->brightness != 1.0f) + doc_printf(doc, "{ neg 1 add dup 0 lt { pop 1 } { %.3f exp neg 1 add } " + "ifelse %.3f mul } bind settransfer\n", + doc->gamma, doc->brightness); + + /* + * Make sure we have rectclip and rectstroke procedures of some sort... + */ + + doc_puts(doc, + "% x y w h ESPrc - Clip to a rectangle.\n" + "userdict/ESPrc/rectclip where{pop/rectclip load}\n" + "{{newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath clip newpath}bind}ifelse put\n"); + + doc_puts(doc, + "% x y w h ESPrf - Fill a rectangle.\n" + "userdict/ESPrf/rectfill where{pop/rectfill load}\n" + "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath fill grestore}bind}ifelse put\n"); + + doc_puts(doc, + "% x y w h ESPrs - Stroke a rectangle.\n" + "userdict/ESPrs/rectstroke where{pop/rectstroke load}\n" + "{{gsave newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n" + "neg 0 rlineto closepath stroke grestore}bind}ifelse put\n"); + + /* + * Write the page and label prologs... + */ + + if (doc->number_up == 2 || doc->number_up == 6) + { + /* + * For 2- and 6-up output, rotate the labels to match the orientation + * of the pages... + */ + + if (Orientation & 1) + write_label_prolog(doc, doc->page_label, PageBottom, + PageWidth - PageLength + PageTop, PageLength); + else + write_label_prolog(doc, doc->page_label, PageLeft, PageRight, + PageLength); + } + else + write_label_prolog(doc, doc->page_label, PageBottom, PageTop, PageWidth); +} + + +/* + * 'doc_printf()' - Send a formatted string to stdout and/or the temp file. + * + * This function should be used for all page-level output that is affected + * by ordering, collation, etc. + */ + +static void +doc_printf(pstops_doc_t *doc, /* I - Document information */ + const char *format, /* I - Printf-style format string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to arguments */ + char buffer[1024]; /* Output buffer */ + size_t bytes; /* Number of bytes to write */ + + + va_start(ap, format); + bytes = vsnprintf(buffer, sizeof(buffer), format, ap); + va_end(ap); + + if (bytes > sizeof(buffer)) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Buffer overflow detected, aborting.")); + exit(1); + } + + doc_write(doc, buffer, bytes); +} + + +/* + * 'doc_puts()' - Send a nul-terminated string to stdout and/or the temp file. + * + * This function should be used for all page-level output that is affected + * by ordering, collation, etc. + */ + +static void +doc_puts(pstops_doc_t *doc, /* I - Document information */ + const char *s) /* I - String to send */ +{ + doc_write(doc, s, strlen(s)); +} + + +/* + * 'doc_write()' - Send data to stdout and/or the temp file. + */ + +static void +doc_write(pstops_doc_t *doc, /* I - Document information */ + const char *s, /* I - Data to send */ + size_t len) /* I - Number of bytes to send */ +{ + if (!doc->slow_order) + fwrite(s, 1, len, stdout); + + if (doc->temp) + cupsFileWrite(doc->temp, s, len); +} + + +/* + * 'end_nup()' - End processing for N-up printing. + */ + +static void +end_nup(pstops_doc_t *doc, /* I - Document information */ + int number) /* I - Page number */ +{ + if (doc->number_up > 1) + doc_puts(doc, "userdict/ESPsave get restore\n"); + + switch (doc->number_up) + { + case 1 : + if (doc->use_ESPshowpage) + { + write_labels(doc, Orientation); + doc_puts(doc, "ESPshowpage\n"); + } + break; + + case 2 : + case 6 : + if (is_last_page(number) && doc->use_ESPshowpage) + { + if (Orientation & 1) + { + /* + * Rotate the labels back to portrait... + */ + + write_labels(doc, Orientation - 1); + } + else if (Orientation == 0) + { + /* + * Rotate the labels to landscape... + */ + + write_labels(doc, doc->normal_landscape ? 1 : 3); + } + else + { + /* + * Rotate the labels to landscape... + */ + + write_labels(doc, doc->normal_landscape ? 3 : 1); + } + + doc_puts(doc, "ESPshowpage\n"); + } + break; + + default : + if (is_last_page(number) && doc->use_ESPshowpage) + { + write_labels(doc, Orientation); + doc_puts(doc, "ESPshowpage\n"); + } + break; + } + + fflush(stdout); +} + + +/* + * 'include_feature()' - Include a printer option/feature command. + */ + +static int /* O - New number of options */ +include_feature( + ppd_file_t *ppd, /* I - PPD file */ + const char *line, /* I - DSC line */ + int num_options, /* I - Number of options */ + cups_option_t **options) /* IO - Options */ +{ + char name[255], /* Option name */ + value[255]; /* Option value */ + ppd_option_t *option; /* Option in file */ + + + /* + * Get the "%%IncludeFeature: *Keyword OptionKeyword" values... + */ + + if (sscanf(line + 17, "%254s%254s", name, value) != 2) + { + fputs("DEBUG: The %%IncludeFeature: comment is not valid.\n", stderr); + return (num_options); + } + + /* + * Find the option and choice... + */ + + if ((option = ppdFindOption(ppd, name + 1)) == NULL) + { + _cupsLangPrintFilter(stderr, "WARNING", _("Unknown option \"%s\"."), + name + 1); + return (num_options); + } + + if (option->section == PPD_ORDER_EXIT || + option->section == PPD_ORDER_JCL) + { + _cupsLangPrintFilter(stderr, "WARNING", + _("Option \"%s\" cannot be included via " + "%%%%IncludeFeature."), name + 1); + return (num_options); + } + + if (!ppdFindChoice(option, value)) + { + _cupsLangPrintFilter(stderr, "WARNING", + _("Unknown choice \"%s\" for option \"%s\"."), + value, name + 1); + return (num_options); + } + + /* + * Add the option to the option array and return... + */ + + return (cupsAddOption(name + 1, value, num_options, options)); +} + + +/* + * 'parse_text()' - Parse a text value in a comment. + * + * This function parses a DSC text value as defined on page 36 of the + * DSC specification. Text values are either surrounded by parenthesis + * or whitespace-delimited. + * + * The value returned is the literal characters for the entire text + * string, including any parenthesis and escape characters. + */ + +static char * /* O - Value or NULL on error */ +parse_text(const char *start, /* I - Start of text value */ + char **end, /* O - End of text value */ + char *buffer, /* I - Buffer */ + size_t bufsize) /* I - Size of buffer */ +{ + char *bufptr, /* Pointer in buffer */ + *bufend; /* End of buffer */ + int level; /* Parenthesis level */ + + + /* + * Skip leading whitespace... + */ + + while (isspace(*start & 255)) + start ++; + + /* + * Then copy the value... + */ + + level = 0; + bufptr = buffer; + bufend = buffer + bufsize - 1; + + while (bufptr < bufend) + { + if (isspace(*start & 255) && !level) + break; + + *bufptr++ = *start; + + if (*start == '(') + level ++; + else if (*start == ')') + { + if (!level) + { + start ++; + break; + } + else + level --; + } + else if (*start == '\\') + { + /* + * Copy escaped character... + */ + + int i; /* Looping var */ + + + for (i = 1; + i <= 3 && isdigit(start[i] & 255) && bufptr < bufend; + *bufptr++ = start[i], i ++); + } + + start ++; + } + + *bufptr = '\0'; + + /* + * Return the value and new pointer into the line... + */ + + if (end) + *end = (char *)start; + + if (bufptr == bufend) + return (NULL); + else + return (buffer); +} + + +/* + * 'set_pstops_options()' - Set pstops options. + */ + +static void +set_pstops_options( + pstops_doc_t *doc, /* I - Document information */ + ppd_file_t *ppd, /* I - PPD file */ + char *argv[], /* I - Command-line arguments */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + const char *val; /* Option value */ + int intval; /* Integer option value */ + ppd_attr_t *attr; /* PPD attribute */ + ppd_option_t *option; /* PPD option */ + ppd_choice_t *choice; /* PPD choice */ + const char *content_type; /* Original content type */ + + + /* + * Initialize document information structure... + */ + + memset(doc, 0, sizeof(pstops_doc_t)); + + doc->job_id = atoi(argv[1]); + doc->user = argv[2]; + doc->title = argv[3]; + doc->copies = atoi(argv[4]); + + if (ppd && ppd->landscape > 0) + doc->normal_landscape = 1; + + doc->bounding_box[0] = (int)PageLeft; + doc->bounding_box[1] = (int)PageBottom; + doc->bounding_box[2] = (int)PageRight; + doc->bounding_box[3] = (int)PageTop; + + doc->new_bounding_box[0] = INT_MAX; + doc->new_bounding_box[1] = INT_MAX; + doc->new_bounding_box[2] = INT_MIN; + doc->new_bounding_box[3] = INT_MIN; + + /* + * AP_FIRSTPAGE_* and the corresponding non-first-page options. + */ + + doc->ap_input_slot = cupsGetOption("AP_FIRSTPAGE_InputSlot", num_options, + options); + doc->ap_manual_feed = cupsGetOption("AP_FIRSTPAGE_ManualFeed", num_options, + options); + doc->ap_media_color = cupsGetOption("AP_FIRSTPAGE_MediaColor", num_options, + options); + doc->ap_media_type = cupsGetOption("AP_FIRSTPAGE_MediaType", num_options, + options); + doc->ap_page_region = cupsGetOption("AP_FIRSTPAGE_PageRegion", num_options, + options); + doc->ap_page_size = cupsGetOption("AP_FIRSTPAGE_PageSize", num_options, + options); + + if ((choice = ppdFindMarkedChoice(ppd, "InputSlot")) != NULL) + doc->input_slot = choice->choice; + if ((choice = ppdFindMarkedChoice(ppd, "ManualFeed")) != NULL) + doc->manual_feed = choice->choice; + if ((choice = ppdFindMarkedChoice(ppd, "MediaColor")) != NULL) + doc->media_color = choice->choice; + if ((choice = ppdFindMarkedChoice(ppd, "MediaType")) != NULL) + doc->media_type = choice->choice; + if ((choice = ppdFindMarkedChoice(ppd, "PageRegion")) != NULL) + doc->page_region = choice->choice; + if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) != NULL) + doc->page_size = choice->choice; + + /* + * brightness + */ + + if ((val = cupsGetOption("brightness", num_options, options)) != NULL) + { + /* + * Get brightness value from 10 to 1000. + */ + + intval = atoi(val); + + if (intval < 10 || intval > 1000) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unsupported brightness value %s, using " + "brightness=100."), val); + doc->brightness = 1.0f; + } + else + doc->brightness = intval * 0.01f; + } + else + doc->brightness = 1.0f; + + /* + * collate, multiple-document-handling + */ + + if ((val = cupsGetOption("multiple-document-handling", num_options, options)) != NULL) + { + /* + * This IPP attribute is unnecessarily complicated... + * + * single-document, separate-documents-collated-copies, and + * single-document-new-sheet all require collated copies. + * + * separate-documents-uncollated-copies allows for uncollated copies. + */ + + doc->collate = _cups_strcasecmp(val, "separate-documents-uncollated-copies") != 0; + } + + if ((val = cupsGetOption("Collate", num_options, options)) != NULL && + (!_cups_strcasecmp(val, "true") ||!_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes"))) + doc->collate = 1; + + /* + * emit-jcl + */ + + if ((val = cupsGetOption("emit-jcl", num_options, options)) != NULL && + (!_cups_strcasecmp(val, "false") || !_cups_strcasecmp(val, "off") || + !_cups_strcasecmp(val, "no") || !strcmp(val, "0"))) + doc->emit_jcl = 0; + else + doc->emit_jcl = 1; + + /* + * fitplot/fit-to-page/ipp-attribute-fidelity + * + * (Only for original PostScript content) + */ + + if ((content_type = getenv("CONTENT_TYPE")) == NULL) + content_type = "application/postscript"; + + if (!_cups_strcasecmp(content_type, "application/postscript")) + { + if ((val = cupsGetOption("fitplot", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + doc->fitplot = 1; + else if ((val = cupsGetOption("fit-to-page", num_options, options)) != NULL && + !_cups_strcasecmp(val, "true")) + doc->fitplot = 1; + else if ((val = cupsGetOption("ipp-attribute-fidelity", num_options, + options)) != NULL && + !_cups_strcasecmp(val, "true")) + doc->fitplot = 1; + } + + /* + * gamma + */ + + if ((val = cupsGetOption("gamma", num_options, options)) != NULL) + { + /* + * Get gamma value from 1 to 10000... + */ + + intval = atoi(val); + + if (intval < 1 || intval > 10000) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unsupported gamma value %s, using gamma=1000."), + val); + doc->gamma = 1.0f; + } + else + doc->gamma = intval * 0.001f; + } + else + doc->gamma = 1.0f; + + /* + * mirror/MirrorPrint + */ + + if ((choice = ppdFindMarkedChoice(ppd, "MirrorPrint")) != NULL) + { + val = choice->choice; + choice->marked = 0; + } + else + val = cupsGetOption("mirror", num_options, options); + + if (val && (!_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes"))) + doc->mirror = 1; + + /* + * number-up + */ + + if ((val = cupsGetOption("number-up", num_options, options)) != NULL) + { + switch (intval = atoi(val)) + { + case 1 : + case 2 : + case 4 : + case 6 : + case 9 : + case 16 : + doc->number_up = intval; + break; + default : + _cupsLangPrintFilter(stderr, "ERROR", + _("Unsupported number-up value %d, using " + "number-up=1."), intval); + doc->number_up = 1; + break; + } + } + else + doc->number_up = 1; + + /* + * number-up-layout + */ + + if ((val = cupsGetOption("number-up-layout", num_options, options)) != NULL) + { + if (!_cups_strcasecmp(val, "lrtb")) + doc->number_up_layout = PSTOPS_LAYOUT_LRTB; + else if (!_cups_strcasecmp(val, "lrbt")) + doc->number_up_layout = PSTOPS_LAYOUT_LRBT; + else if (!_cups_strcasecmp(val, "rltb")) + doc->number_up_layout = PSTOPS_LAYOUT_RLTB; + else if (!_cups_strcasecmp(val, "rlbt")) + doc->number_up_layout = PSTOPS_LAYOUT_RLBT; + else if (!_cups_strcasecmp(val, "tblr")) + doc->number_up_layout = PSTOPS_LAYOUT_TBLR; + else if (!_cups_strcasecmp(val, "tbrl")) + doc->number_up_layout = PSTOPS_LAYOUT_TBRL; + else if (!_cups_strcasecmp(val, "btlr")) + doc->number_up_layout = PSTOPS_LAYOUT_BTLR; + else if (!_cups_strcasecmp(val, "btrl")) + doc->number_up_layout = PSTOPS_LAYOUT_BTRL; + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unsupported number-up-layout value %s, using " + "number-up-layout=lrtb."), val); + doc->number_up_layout = PSTOPS_LAYOUT_LRTB; + } + } + else + doc->number_up_layout = PSTOPS_LAYOUT_LRTB; + + /* + * OutputOrder + */ + + if ((val = cupsGetOption("OutputOrder", num_options, options)) != NULL) + { + if (!_cups_strcasecmp(val, "Reverse")) + doc->output_order = 1; + } + else if (ppd) + { + /* + * Figure out the right default output order from the PPD file... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "OutputBin")) != NULL && + (attr = ppdFindAttr(ppd, "PageStackOrder", choice->choice)) != NULL && + attr->value) + doc->output_order = !_cups_strcasecmp(attr->value, "Reverse"); + else if ((attr = ppdFindAttr(ppd, "DefaultOutputOrder", NULL)) != NULL && + attr->value) + doc->output_order = !_cups_strcasecmp(attr->value, "Reverse"); + } + + /* + * page-border + */ + + if ((val = cupsGetOption("page-border", num_options, options)) != NULL) + { + if (!_cups_strcasecmp(val, "none")) + doc->page_border = PSTOPS_BORDERNONE; + else if (!_cups_strcasecmp(val, "single")) + doc->page_border = PSTOPS_BORDERSINGLE; + else if (!_cups_strcasecmp(val, "single-thick")) + doc->page_border = PSTOPS_BORDERSINGLE2; + else if (!_cups_strcasecmp(val, "double")) + doc->page_border = PSTOPS_BORDERDOUBLE; + else if (!_cups_strcasecmp(val, "double-thick")) + doc->page_border = PSTOPS_BORDERDOUBLE2; + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unsupported page-border value %s, using " + "page-border=none."), val); + doc->page_border = PSTOPS_BORDERNONE; + } + } + else + doc->page_border = PSTOPS_BORDERNONE; + + /* + * page-label + */ + + doc->page_label = cupsGetOption("page-label", num_options, options); + + /* + * page-ranges + */ + + doc->page_ranges = cupsGetOption("page-ranges", num_options, options); + + /* + * page-set + */ + + doc->page_set = cupsGetOption("page-set", num_options, options); + + /* + * Now figure out if we have to force collated copies, etc. + */ + + if (ppd && ppd->manual_copies && Duplex && doc->copies > 1) + { + /* + * Force collated copies when printing a duplexed document to + * a non-PS printer that doesn't do hardware copy generation. + * Otherwise the copies will end up on the front/back side of + * each page. + */ + + doc->collate = 1; + } + + /* + * See if we have to filter the fast or slow way... + */ + + if (doc->collate && doc->copies > 1) + { + /* + * See if we need to manually collate the pages... + */ + + doc->slow_collate = 1; + + if ((choice = ppdFindMarkedChoice(ppd, "Collate")) != NULL && + !_cups_strcasecmp(choice->choice, "True")) + { + /* + * Hardware collate option is selected, see if the option is + * conflicting - if not, collate in hardware. Otherwise, + * turn the hardware collate option off... + */ + + if ((option = ppdFindOption(ppd, "Collate")) != NULL && + !option->conflicted) + doc->slow_collate = 0; + else + ppdMarkOption(ppd, "Collate", "False"); + } + } + else + doc->slow_collate = 0; + + if (!ppdFindOption(ppd, "OutputOrder") && doc->output_order) + doc->slow_order = 1; + else + doc->slow_order = 0; + + if (Duplex && + (doc->slow_collate || doc->slow_order || + ((attr = ppdFindAttr(ppd, "cupsEvenDuplex", NULL)) != NULL && + attr->value && !_cups_strcasecmp(attr->value, "true")))) + doc->slow_duplex = 1; + else + doc->slow_duplex = 0; + + /* + * Create a temporary file for page data if we need to filter slowly... + */ + + if (doc->slow_order || doc->slow_collate) + { + if ((doc->temp = cupsTempFile2(doc->tempfile, + sizeof(doc->tempfile))) == NULL) + { + perror("DEBUG: Unable to create temporary file"); + exit(1); + } + } + + /* + * Figure out if we should use ESPshowpage or not... + */ + + if (doc->page_label || getenv("CLASSIFICATION") || doc->number_up > 1 || + doc->page_border) + { + /* + * Yes, use ESPshowpage... + */ + + doc->use_ESPshowpage = 1; + } + + fprintf(stderr, "DEBUG: slow_collate=%d, slow_duplex=%d, slow_order=%d\n", + doc->slow_collate, doc->slow_duplex, doc->slow_order); +} + + +/* + * 'skip_page()' - Skip past a page that won't be printed. + */ + +static ssize_t /* O - Length of next line */ +skip_page(cups_file_t *fp, /* I - File to read from */ + char *line, /* I - Line buffer */ + ssize_t linelen, /* I - Length of initial line */ + size_t linesize) /* I - Size of line buffer */ +{ + int level; /* Embedded document level */ + + + level = 0; + + while ((linelen = cupsFileGetLine(fp, line, linesize)) > 0) + { + if (level == 0 && + (!strncmp(line, "%%Page:", 7) || !strncmp(line, "%%Trailer", 9))) + break; + else if (!strncmp(line, "%%BeginDocument", 15) || + !strncmp(line, "%ADO_BeginApplication", 21)) + level ++; + else if ((!strncmp(line, "%%EndDocument", 13) || + !strncmp(line, "%ADO_EndApplication", 19)) && level > 0) + level --; + else if (!strncmp(line, "%%BeginBinary:", 14) || + (!strncmp(line, "%%BeginData:", 12) && + !strstr(line, "ASCII") && !strstr(line, "Hex"))) + { + /* + * Skip binary data... + */ + + int bytes; /* Bytes of data */ + + + bytes = atoi(strchr(line, ':') + 1); + + while (bytes > 0) + { + if (bytes > linesize) + linelen = cupsFileRead(fp, line, linesize); + else + linelen = cupsFileRead(fp, line, bytes); + + if (linelen < 1) + { + line[0] = '\0'; + perror("ERROR: Early end-of-file while reading binary data"); + return (0); + } + + bytes -= linelen; + } + } + } + + return (linelen); +} + + +/* + * 'start_nup()' - Start processing for N-up printing. + */ + +static void +start_nup(pstops_doc_t *doc, /* I - Document information */ + int number, /* I - Page number */ + int show_border, /* I - Show the border? */ + const int *bounding_box) /* I - BoundingBox value */ +{ + int pos; /* Position on page */ + int x, y; /* Relative position of subpage */ + float w, l, /* Width and length of subpage */ + tx, ty; /* Translation values for subpage */ + float pagew, /* Printable width of page */ + pagel; /* Printable height of page */ + int bboxx, /* BoundingBox X origin */ + bboxy, /* BoundingBox Y origin */ + bboxw, /* BoundingBox width */ + bboxl; /* BoundingBox height */ + float margin = 0; /* Current margin for border */ + + + if (doc->number_up > 1) + doc_puts(doc, "userdict/ESPsave save put\n"); + + pos = (number - 1) % doc->number_up; + pagew = PageRight - PageLeft; + pagel = PageTop - PageBottom; + + if (doc->fitplot) + { + bboxx = bounding_box[0]; + bboxy = bounding_box[1]; + bboxw = bounding_box[2] - bounding_box[0]; + bboxl = bounding_box[3] - bounding_box[1]; + } + else + { + bboxx = 0; + bboxy = 0; + bboxw = PageWidth; + bboxl = PageLength; + } + + fprintf(stderr, "DEBUG: pagew = %.1f, pagel = %.1f\n", pagew, pagel); + fprintf(stderr, "DEBUG: bboxx = %d, bboxy = %d, bboxw = %d, bboxl = %d\n", + bboxx, bboxy, bboxw, bboxl); + fprintf(stderr, "DEBUG: PageLeft = %.1f, PageRight = %.1f\n", + PageLeft, PageRight); + fprintf(stderr, "DEBUG: PageTop = %.1f, PageBottom = %.1f\n", + PageTop, PageBottom); + fprintf(stderr, "DEBUG: PageWidth = %.1f, PageLength = %.1f\n", + PageWidth, PageLength); + + switch (Orientation) + { + case 1 : /* Landscape */ + doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", PageLength); + break; + case 2 : /* Reverse Portrait */ + doc_printf(doc, "%.1f %.1f translate 180 rotate\n", PageWidth, + PageLength); + break; + case 3 : /* Reverse Landscape */ + doc_printf(doc, "0.0 %.1f translate -90 rotate\n", PageWidth); + break; + } + + /* + * Mirror the page as needed... + */ + + if (doc->mirror) + doc_printf(doc, "%.1f 0.0 translate -1 1 scale\n", PageWidth); + + /* + * Offset and scale as necessary for fitplot/fit-to-page/number-up... + */ + + if (Duplex && doc->number_up > 1 && ((number / doc->number_up) & 1)) + doc_printf(doc, "%.1f %.1f translate\n", PageWidth - PageRight, PageBottom); + else if (doc->number_up > 1 || doc->fitplot) + doc_printf(doc, "%.1f %.1f translate\n", PageLeft, PageBottom); + + switch (doc->number_up) + { + default : + if (doc->fitplot) + { + w = pagew; + l = w * bboxl / bboxw; + + if (l > pagel) + { + l = pagel; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagew - w); + ty = 0.5 * (pagel - l); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", tx, ty, + w / bboxw, l / bboxl); + } + else + w = PageWidth; + break; + + case 2 : + if (Orientation & 1) + { + x = pos & 1; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + x = 1 - x; + + w = pagel; + l = w * bboxl / bboxw; + + if (l > (pagew * 0.5)) + { + l = pagew * 0.5; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagew * 0.5 - l); + ty = 0.5 * (pagel - w); + + if (doc->normal_landscape) + doc_printf(doc, "0.0 %.1f translate -90 rotate\n", pagel); + else + doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", pagew); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + ty, tx + pagew * 0.5 * x, w / bboxw, l / bboxl); + } + else + { + x = pos & 1; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 1 - x; + + l = pagew; + w = l * bboxw / bboxl; + + if (w > (pagel * 0.5)) + { + w = pagel * 0.5; + l = w * bboxl / bboxw; + } + + tx = 0.5 * (pagel * 0.5 - w); + ty = 0.5 * (pagew - l); + + if (doc->normal_landscape) + doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", pagew); + else + doc_printf(doc, "0.0 %.1f translate -90 rotate\n", pagel); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + pagel * 0.5 * x, ty, w / bboxw, l / bboxl); + } + break; + + case 4 : + if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) + { + x = (pos / 2) & 1; + y = pos & 1; + } + else + { + x = pos & 1; + y = (pos / 2) & 1; + } + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 1 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 1 - y; + + w = pagew * 0.5; + l = w * bboxl / bboxw; + + if (l > (pagel * 0.5)) + { + l = pagel * 0.5; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagew * 0.5 - w); + ty = 0.5 * (pagel * 0.5 - l); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + x * pagew * 0.5, ty + y * pagel * 0.5, + w / bboxw, l / bboxl); + break; + + case 6 : + if (Orientation & 1) + { + if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) + { + x = pos / 3; + y = pos % 3; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 1 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 2 - y; + } + else + { + x = pos & 1; + y = pos / 2; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 1 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 2 - y; + } + + w = pagel * 0.5; + l = w * bboxl / bboxw; + + if (l > (pagew * 0.333)) + { + l = pagew * 0.333; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagel - 2 * w); + ty = 0.5 * (pagew - 3 * l); + + if (doc->normal_landscape) + doc_printf(doc, "0 %.1f translate -90 rotate\n", pagel); + else + doc_printf(doc, "%.1f 0 translate 90 rotate\n", pagew); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + x * w, ty + y * l, l / bboxl, w / bboxw); + } + else + { + if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) + { + x = pos / 2; + y = pos & 1; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 2 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 1 - y; + } + else + { + x = pos % 3; + y = pos / 3; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 2 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 1 - y; + } + + l = pagew * 0.5; + w = l * bboxw / bboxl; + + if (w > (pagel * 0.333)) + { + w = pagel * 0.333; + l = w * bboxl / bboxw; + } + + tx = 0.5 * (pagel - 3 * w); + ty = 0.5 * (pagew - 2 * l); + + if (doc->normal_landscape) + doc_printf(doc, "%.1f 0 translate 90 rotate\n", pagew); + else + doc_printf(doc, "0 %.1f translate -90 rotate\n", pagel); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + w * x, ty + l * y, w / bboxw, l / bboxl); + + } + break; + + case 9 : + if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) + { + x = (pos / 3) % 3; + y = pos % 3; + } + else + { + x = pos % 3; + y = (pos / 3) % 3; + } + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 2 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 2 - y; + + w = pagew * 0.333; + l = w * bboxl / bboxw; + + if (l > (pagel * 0.333)) + { + l = pagel * 0.333; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagew * 0.333 - w); + ty = 0.5 * (pagel * 0.333 - l); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + x * pagew * 0.333, ty + y * pagel * 0.333, + w / bboxw, l / bboxl); + break; + + case 16 : + if (doc->number_up_layout & PSTOPS_LAYOUT_VERTICAL) + { + x = (pos / 4) & 3; + y = pos & 3; + } + else + { + x = pos & 3; + y = (pos / 4) & 3; + } + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEX) + x = 3 - x; + + if (doc->number_up_layout & PSTOPS_LAYOUT_NEGATEY) + y = 3 - y; + + w = pagew * 0.25; + l = w * bboxl / bboxw; + + if (l > (pagel * 0.25)) + { + l = pagel * 0.25; + w = l * bboxw / bboxl; + } + + tx = 0.5 * (pagew * 0.25 - w); + ty = 0.5 * (pagel * 0.25 - l); + + doc_printf(doc, "%.1f %.1f translate %.3f %.3f scale\n", + tx + x * pagew * 0.25, ty + y * pagel * 0.25, + w / bboxw, l / bboxl); + break; + } + + /* + * Draw borders as necessary... + */ + + if (doc->page_border && show_border) + { + int rects; /* Number of border rectangles */ + float fscale; /* Scaling value for points */ + + + rects = (doc->page_border & PSTOPS_BORDERDOUBLE) ? 2 : 1; + fscale = PageWidth / w; + margin = 2.25 * fscale; + + /* + * Set the line width and color... + */ + + doc_puts(doc, "gsave\n"); + doc_printf(doc, "%.3f setlinewidth 0 setgray newpath\n", + (doc->page_border & PSTOPS_BORDERTHICK) ? 0.5 * fscale : + 0.24 * fscale); + + /* + * Draw border boxes... + */ + + for (; rects > 0; rects --, margin += 2 * fscale) + if (doc->number_up > 1) + doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrs\n", + margin, + margin, + bboxw - 2 * margin, + bboxl - 2 * margin); + else + doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrs\n", + PageLeft + margin, + PageBottom + margin, + PageRight - PageLeft - 2 * margin, + PageTop - PageBottom - 2 * margin); + + /* + * Restore pen settings... + */ + + doc_puts(doc, "grestore\n"); + } + + if (doc->fitplot) + { + /* + * Offset the page by its bounding box... + */ + + doc_printf(doc, "%d %d translate\n", -bounding_box[0], + -bounding_box[1]); + } + + if (doc->fitplot || doc->number_up > 1) + { + /* + * Clip the page to the page's bounding box... + */ + + doc_printf(doc, "%.1f %.1f %.1f %.1f ESPrc\n", + bboxx + margin, bboxy + margin, + bboxw - 2 * margin, bboxl - 2 * margin); + } +} + + +/* + * 'write_label_prolog()' - Write the prolog with the classification + * and page label. + */ + +static void +write_label_prolog(pstops_doc_t *doc, /* I - Document info */ + const char *label, /* I - Page label */ + float bottom, /* I - Bottom position in points */ + float top, /* I - Top position in points */ + float width) /* I - Width in points */ +{ + const char *classification; /* CLASSIFICATION environment variable */ + const char *ptr; /* Temporary string pointer */ + + + /* + * First get the current classification... + */ + + if ((classification = getenv("CLASSIFICATION")) == NULL) + classification = ""; + if (strcmp(classification, "none") == 0) + classification = ""; + + /* + * If there is nothing to show, bind an empty 'write labels' procedure + * and return... + */ + + if (!classification[0] && (label == NULL || !label[0])) + { + doc_puts(doc, "userdict/ESPwl{}bind put\n"); + return; + } + + /* + * Set the classification + page label string... + */ + + doc_puts(doc, "userdict"); + if (!strcmp(classification, "confidential")) + doc_puts(doc, "/ESPpl(CONFIDENTIAL"); + else if (!strcmp(classification, "classified")) + doc_puts(doc, "/ESPpl(CLASSIFIED"); + else if (!strcmp(classification, "secret")) + doc_puts(doc, "/ESPpl(SECRET"); + else if (!strcmp(classification, "topsecret")) + doc_puts(doc, "/ESPpl(TOP SECRET"); + else if (!strcmp(classification, "unclassified")) + doc_puts(doc, "/ESPpl(UNCLASSIFIED"); + else + { + doc_puts(doc, "/ESPpl("); + + for (ptr = classification; *ptr; ptr ++) + { + if (*ptr < 32 || *ptr > 126) + doc_printf(doc, "\\%03o", *ptr); + else if (*ptr == '_') + doc_puts(doc, " "); + else if (*ptr == '(' || *ptr == ')' || *ptr == '\\') + doc_printf(doc, "\\%c", *ptr); + else + doc_printf(doc, "%c", *ptr); + } + } + + if (label) + { + if (classification[0]) + doc_puts(doc, " - "); + + /* + * Quote the label string as needed... + */ + + for (ptr = label; *ptr; ptr ++) + { + if (*ptr < 32 || *ptr > 126) + doc_printf(doc, "\\%03o", *ptr); + else if (*ptr == '(' || *ptr == ')' || *ptr == '\\') + doc_printf(doc, "\\%c", *ptr); + else + doc_printf(doc, "%c", *ptr); + } + } + + doc_puts(doc, ")put\n"); + + /* + * Then get a 14 point Helvetica-Bold font... + */ + + doc_puts(doc, "userdict/ESPpf /Helvetica-Bold findfont 14 scalefont put\n"); + + /* + * Finally, the procedure to write the labels on the page... + */ + + doc_puts(doc, "userdict/ESPwl{\n"); + doc_puts(doc, " ESPpf setfont\n"); + doc_printf(doc, " ESPpl stringwidth pop dup 12 add exch -0.5 mul %.0f add\n", + width * 0.5f); + doc_puts(doc, " 1 setgray\n"); + doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrf\n", bottom - 2.0); + doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrf\n", top - 18.0); + doc_puts(doc, " 0 setgray\n"); + doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrs\n", bottom - 2.0); + doc_printf(doc, " dup 6 sub %.0f 3 index 20 ESPrs\n", top - 18.0); + doc_printf(doc, " dup %.0f moveto ESPpl show\n", bottom + 2.0); + doc_printf(doc, " %.0f moveto ESPpl show\n", top - 14.0); + doc_puts(doc, "pop\n"); + doc_puts(doc, "}bind put\n"); +} + + +/* + * 'write_labels()' - Write the actual page labels. + * + * This function is a copy of the one in common.c since we need to + * use doc_puts/doc_printf instead of puts/printf... + */ + +static void +write_labels(pstops_doc_t *doc, /* I - Document information */ + int orient) /* I - Orientation of the page */ +{ + float width, /* Width of page */ + length; /* Length of page */ + + + doc_puts(doc, "gsave\n"); + + if ((orient ^ Orientation) & 1) + { + width = PageLength; + length = PageWidth; + } + else + { + width = PageWidth; + length = PageLength; + } + + switch (orient & 3) + { + case 1 : /* Landscape */ + doc_printf(doc, "%.1f 0.0 translate 90 rotate\n", length); + break; + case 2 : /* Reverse Portrait */ + doc_printf(doc, "%.1f %.1f translate 180 rotate\n", width, length); + break; + case 3 : /* Reverse Landscape */ + doc_printf(doc, "0.0 %.1f translate -90 rotate\n", width); + break; + } + + doc_puts(doc, "ESPwl\n"); + doc_puts(doc, "grestore\n"); +} + + +/* + * 'write_options()' - Write options provided via %%IncludeFeature. + */ + +static void +write_options( + pstops_doc_t *doc, /* I - Document */ + ppd_file_t *ppd, /* I - PPD file */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + int i; /* Looping var */ + ppd_option_t *option; /* PPD option */ + int min_order; /* Minimum OrderDependency value */ + char *doc_setup, /* DocumentSetup commands to send */ + *any_setup; /* AnySetup commands to send */ + + + /* + * Figure out the minimum OrderDependency value... + */ + + if ((option = ppdFindOption(ppd, "PageRegion")) != NULL) + min_order = option->order; + else + min_order = 999.0f; + + for (i = 0; i < num_options; i ++) + if ((option = ppdFindOption(ppd, options[i].name)) != NULL && + option->order < min_order) + min_order = option->order; + + /* + * Mark and extract them... + */ + + cupsMarkOptions(ppd, num_options, options); + + doc_setup = ppdEmitString(ppd, PPD_ORDER_DOCUMENT, min_order); + any_setup = ppdEmitString(ppd, PPD_ORDER_ANY, min_order); + + /* + * Then send them out... + */ + + if (doc->number_up > 1) + { + /* + * Temporarily restore setpagedevice so we can set the options... + */ + + doc_puts(doc, "userdict/setpagedevice/CUPSsetpagedevice load put\n"); + } + + if (doc_setup) + { + doc_puts(doc, doc_setup); + free(doc_setup); + } + + if (any_setup) + { + doc_puts(doc, any_setup); + free(any_setup); + } + + if (doc->number_up > 1) + { + /* + * Disable setpagedevice again... + */ + + doc_puts(doc, "userdict/setpagedevice{pop}bind put\n"); + } +} + + +/* + * End of "$Id: pstops.c 9955 2011-09-02 18:14:34Z mike $". + */ diff --git a/filter/raster-driver.header b/filter/raster-driver.header new file mode 100644 index 0000000..e85c2a9 --- /dev/null +++ b/filter/raster-driver.header @@ -0,0 +1,32 @@ + + +

Developing Raster Printer Drivers

+ +

This document describes how to develop printer drivers for raster printers. Topics include: printer driver basics, creating new PPD files, using filters, implementing color management, and adding Mac OS X features.

+ +
+ + + + + + +
See AlsoProgramming: Developing PostScript Printer Drivers
+ Programming: Filter and Backend Programming
+ Programming: Introduction to the PPD Compiler
+ Programming: Raster API
+ References: PPD Compiler Driver Information File Reference
+ Specifications: CUPS PPD Extensions
diff --git a/filter/raster-driver.shtml b/filter/raster-driver.shtml new file mode 100644 index 0000000..1c0c32a --- /dev/null +++ b/filter/raster-driver.shtml @@ -0,0 +1,194 @@ +

Printer Driver Basics

+ +

A CUPS raster printer driver consists of a PostScript Printer Description (PPD) file that describes the features and capabilities of the device, one or more filter programs that prepare print data for the device, and zero or more support files for color management, online help, and so forth. The PPD file includes references to all of the filters and support files used by the driver.

+ +

Every time a user prints something the scheduler program, cupsd(8), determines the format of the print job and the programs required to convert that job into something the printer understands. CUPS includes filter programs for many common formats, for example to convert Portable Document Format (PDF) files into CUPS raster data. Figure 1 shows the data flow of a typical print job.

+ +
+ + +
Figure 1: Raster Filter Chain
Raster Filter Chain
+ +

The raster filter converts CUPS raster data into a format the printer understands, for example HP-PCL. CUPS includes several sample raster filters supporting standard page description languages (PDLs). Table 1 shows the raster filters that are bundled with CUPS and the languages they support.

+ +
+ + + + + + + + + + + +
Table 1: Standard CUPS Raster Filters
FilterPDLsppdc DriverTypeppdc #include file
rastertoepsonESC/P, ESC/P2epsonepson.h
rastertoescpxESC/P, ESC/P2, EPSON Remote Modeescpescp.h
rastertohpHP-PCL3, HP-PCL5hphp.h
rastertolabelCPCL, Dymo, EPL1, EPL2, Intellitech PCL, ZPLlabellabel.h
rastertopclxHP-RTL, HP-PCL3, HP-PCL3GUI, HP-PCL5, HP-PCL5c, HP-PCL5epclpcl.h
+ +

The optional port monitor handles interface-specific protocol or encoding issues. For example, some raster printers use the 1284.4 communications protocol.

+ +

The backend handles communications with the printer, sending print data from the last filter to the printer and relaying back-channel data from the printer to the upstream filters. CUPS includes backend programs for common direct-connect interfaces and network protocols, and you can provide your own backend to support custom interfaces and protocols.

+ +

The scheduler also supports a special "command" file format for sending maintenance commands and status queries to a printer or printer driver. Command print jobs typically use a single command filter program defined in the PPD file to generate the appropriate printer commands and handle any responses from the printer. Figure 2 shows the data flow of a typical command job.

+ +
+ + +
Figure 2: Command Filter Chain
Command Filter Chain
+ +

Raster printer drivers must provide their own command filter.

+ + +

Creating New PPD Files

+ +

We recommend using the CUPS PPD compiler, ppdc(1), to create new PPD files since it manages many of the tedious (and error-prone!) details of paper sizes and localization for you. It also allows you to easily support multiple devices from a single source file. For more information see the "Introduction to the PPD Compiler" document. Listing 1 shows a driver information file for several similar black-and-white HP-PCL5 laser printers.

+ +

Listing 1: "examples/laserjet-basic.drv"

+ +
+// Include standard font and media definitions
+#include <font.defs>
+#include <media.defs>
+
+// Include HP-PCL driver definitions
+#include <pcl.h>
+
+// Specify that this driver uses the HP-PCL driver...
+DriverType pcl
+
+// Specify the driver options via the model number...
+ModelNumber ($PCL_PAPER_SIZE $PCL_PJL $PCL_PJL_RESOLUTION)
+
+// List the fonts that are supported, in this case all standard fonts...
+Font *
+
+// Manufacturer and driver version
+Manufacturer "HP"
+Version 1.0
+
+// Supported page sizes and their margins
+HWMargins 18 12 18 12
+*MediaSize Letter
+MediaSize Legal
+MediaSize Executive
+MediaSize Monarch
+MediaSize Statement
+MediaSize FanFoldGermanLegal
+
+HWMargins 18 12.72 18 12.72
+MediaSize Env10
+
+HWMargins 9.72 12 9.72 12
+MediaSize A4
+MediaSize A5
+MediaSize B5
+MediaSize EnvC5
+MediaSize EnvDL
+MediaSize EnvISOB5
+MediaSize Postcard
+MediaSize DoublePostcard
+
+// Only black-and-white output with mode 3 compression...
+ColorModel Gray k chunky 3
+
+// Supported resolutions
+Resolution - 1 0 0 0 "300dpi/300 DPI"
+*Resolution - 8 0 0 0 "600dpi/600 DPI"
+
+// Supported input slots
+*InputSlot 7 "Auto/Automatic Selection"
+InputSlot 2 "Manual/Tray 1 - Manual Feed"
+InputSlot 4 "Upper/Tray 1"
+InputSlot 1 "Lower/Tray 2"
+InputSlot 5 "LargeCapacity/Tray 3"
+
+// Tray 3 is an option...
+Installable "OptionLargeCapacity/Tray 3 Installed"
+UIConstraints "*OptionLargeCapacity False *InputSlot LargeCapacity"
+
+{
+  // HP LaserJet 2100 Series
+  Throughput 10
+  ModelName "LaserJet 2100 Series"
+  PCFileName "hpljt211.ppd"
+}
+
+{
+  // LaserJet 2200 and 2300 series have duplexer option...
+  Duplex normal
+  Installable "OptionDuplex/Duplexer Installed"
+  UIConstraints "*OptionDuplex False *Duplex"
+
+  {
+    // HP LaserJet 2200 Series
+    Throughput 19
+    ModelName "LaserJet 2200 Series"
+    PCFileName "hpljt221.ppd"
+  }
+
+  {
+    // HP LaserJet 2300 Series
+    Throughput 25
+    ModelName "LaserJet 2300 Series"
+    PCFileName "hpljt231.ppd"
+  }
+}
+
+ + +

Using Filters

+ +

The standard CUPS raster filters can be specified using the +DriverType directive, for example:

+ +
+// Specify that this driver uses the HP-PCL driver...
+DriverType pcl
+
+ +

Table 1 shows the driver types for each of the standard CUPS raster filters. For drivers that do not use the standard raster filters, the "custom" type is used with Filter directives:

+ +
+DriverType custom
+Filter application/vnd.cups-raster 100 /path/to/raster/filter
+Filter application/vnd.cups-command 100 /path/to/command/filter
+
+ + +

Implementing Color Management

+ +

CUPS uses ICC color profiles to provide more accurate color reproduction. The cupsICCProfile attribute defines the color profiles that are available for a given printer, for example:

+ +
+Attribute cupsICCProfile "ColorModel.MediaType.Resolution/Description" /path/to/ICC/profile
+
+ +

where "ColorModel.MediaType.Resolution" defines a selector based on the corresponding option selections. A simple driver might only define profiles for the color models that are supported, for example a printer supporting Gray and RGB might use:

+ +
+Attribute cupsICCProfile "Gray../Grayscale Profile" /path/to/ICC/gray-profile
+Attribute cupsICCProfile "RGB../Full Color Profile" /path/to/ICC/rgb-profile
+
+ +

The options used for profile selection can be customized using the cupsICCQualifier2 and cupsICCQualifier3 attributes.

+ +

Since Mac OS X 10.5Custom Color Matching Support

+ +

Mac OS X printer drivers that are based on an existing standard RGB colorspace can tell the system to use the corresponding colorspace instead of an arbitrary ICC color profile when doing color management. The APSupportsCustomColorMatching and APDefaultCustomColorMatchingProfile attributes can be used to enable this mode:

+ +
+Attribute APSupportsCustomColorMatching "" true
+Attribute APDefaultCustomColorMatchingProfile "" sRGB
+
+ + +

Adding Mac OS X Features

+ +

Mac OS X printer drivers can provide additional attributes to specify additional option panes in the print dialog, an image of the printer, a help book, and option presets for the driver software:

+ +
+Attribute APDialogExtension "" /Library/Printers/Vendor/filename.plugin
+Attribute APHelpBook "" /Library/Printers/Vendor/filename.bundle
+Attribute APPrinterIconPath "" /Library/Printers/Vendor/filename.icns
+Attribute APPrinterPreset "name/text" "*option choice ..."
+
diff --git a/filter/raster.c b/filter/raster.c new file mode 100644 index 0000000..4ab189b --- /dev/null +++ b/filter/raster.c @@ -0,0 +1,1472 @@ +/* + * "$Id: raster.c 10006 2011-09-20 18:36:33Z mike $" + * + * Raster file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * This file is part of the CUPS Imaging library. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * cupsRasterClose() - Close a raster stream. + * cupsRasterOpen() - Open a raster stream using a file descriptor. + * cupsRasterOpenIO() - Open a raster stream using a callback function. + * cupsRasterReadHeader() - Read a raster page header and store it in a + * version 1 page header structure. + * cupsRasterReadHeader2() - Read a raster page header and store it in a + * version 2 page header structure. + * cupsRasterReadPixels() - Read raster pixels. + * cupsRasterWriteHeader() - Write a raster page header from a version 1 + * page header structure. + * cupsRasterWriteHeader2() - Write a raster page header from a version 2 + * page header structure. + * cupsRasterWritePixels() - Write raster pixels. + * cups_raster_read_header() - Read a raster page header. + * cups_raster_read() - Read through the raster buffer. + * cups_raster_update() - Update the raster header and row count for the + * current page. + * cups_raster_write() - Write a row of compressed raster data... + * cups_read_fd() - Read bytes from a file. + * cups_swap() - Swap bytes in raster data... + * cups_write_fd() - Write bytes to a file. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" +#if defined(WIN32) || defined(__EMX__) +# include +# include /* for htonl() definition */ +#else +# include +#endif /* WIN32 || __EMX__ */ + + +/* + * Private structures... + */ + +struct _cups_raster_s /**** Raster stream data ****/ +{ + unsigned sync; /* Sync word from start of stream */ + void *ctx; /* File descriptor */ + cups_raster_iocb_t iocb; /* IO callback */ + cups_mode_t mode; /* Read/write mode */ + cups_page_header2_t header; /* Raster header for current page */ + int count, /* Current row run-length count */ + remaining, /* Remaining rows in page image */ + bpp; /* Bytes per pixel/color */ + unsigned char *pixels, /* Pixels for current row */ + *pend, /* End of pixel buffer */ + *pcurrent; /* Current byte in pixel buffer */ + int compressed, /* Non-zero if data is compressed */ + swapped; /* Non-zero if data is byte-swapped */ + unsigned char *buffer, /* Read/write buffer */ + *bufptr, /* Current (read) position in buffer */ + *bufend; /* End of current (read) buffer */ + size_t bufsize; /* Buffer size */ +}; + + +/* + * Local functions... + */ + +static int cups_raster_io(cups_raster_t *r, unsigned char *buf, int bytes); +static unsigned cups_raster_read_header(cups_raster_t *r); +static int cups_raster_read(cups_raster_t *r, unsigned char *buf, + int bytes); +static void cups_raster_update(cups_raster_t *r); +static int cups_raster_write(cups_raster_t *r, + const unsigned char *pixels); +static ssize_t cups_read_fd(void *ctx, unsigned char *buf, size_t bytes); +static void cups_swap(unsigned char *buf, int bytes); +static ssize_t cups_write_fd(void *ctx, unsigned char *buf, size_t bytes); + + +/* + * 'cupsRasterClose()' - Close a raster stream. + * + * The file descriptor associated with the raster stream must be closed + * separately as needed. + */ + +void +cupsRasterClose(cups_raster_t *r) /* I - Stream to close */ +{ + if (r != NULL) + { + if (r->buffer) + free(r->buffer); + + if (r->pixels) + free(r->pixels); + + free(r); + } +} + + +/* + * 'cupsRasterOpen()' - Open a raster stream using a file descriptor. + * + * This function associates a raster stream with the given file descriptor. + * For most printer driver filters, "fd" will be 0 (stdin). For most raster + * image processor (RIP) filters that generate raster data, "fd" will be 1 + * (stdout). + * + * When writing raster data, the @code CUPS_RASTER_WRITE@, + * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * be used - compressed and PWG output is generally 25-50% smaller but adds a + * 100-300% execution time overhead. + */ + +cups_raster_t * /* O - New stream */ +cupsRasterOpen(int fd, /* I - File descriptor */ + cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, + @code CUPS_RASTER_WRITE@, + @code CUPS_RASTER_WRITE_COMPRESSED@, + or @code CUPS_RASTER_WRITE_PWG@ */ +{ + if (mode == CUPS_RASTER_READ) + return (cupsRasterOpenIO(cups_read_fd, (void *)((intptr_t)fd), mode)); + else + return (cupsRasterOpenIO(cups_write_fd, (void *)((intptr_t)fd), mode)); +} + + +/* + * 'cupsRasterOpenIO()' - Open a raster stream using a callback function. + * + * This function associates a raster stream with the given callback function and + * context pointer. + * + * When writing raster data, the @code CUPS_RASTER_WRITE@, + * @code CUPS_RASTER_WRITE_COMPRESS@, or @code CUPS_RASTER_WRITE_PWG@ mode can + * be used - compressed and PWG output is generally 25-50% smaller but adds a + * 100-300% execution time overhead. + */ + +cups_raster_t * /* O - New stream */ +cupsRasterOpenIO( + cups_raster_iocb_t iocb, /* I - Read/write callback */ + void *ctx, /* I - Context pointer for callback */ + cups_mode_t mode) /* I - Mode - @code CUPS_RASTER_READ@, + @code CUPS_RASTER_WRITE@, + @code CUPS_RASTER_WRITE_COMPRESSED@, + or @code CUPS_RASTER_WRITE_PWG@ */ +{ + cups_raster_t *r; /* New stream */ + + + _cupsRasterClearError(); + + if ((r = calloc(sizeof(cups_raster_t), 1)) == NULL) + { + _cupsRasterAddError("Unable to allocate memory for raster stream: %s\n", + strerror(errno)); + return (NULL); + } + + r->ctx = ctx; + r->iocb = iocb; + r->mode = mode; + + if (mode == CUPS_RASTER_READ) + { + /* + * Open for read - get sync word... + */ + + if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) != + sizeof(r->sync)) + { + _cupsRasterAddError("Unable to read header from raster stream: %s\n", + strerror(errno)); + free(r); + return (NULL); + } + + if (r->sync != CUPS_RASTER_SYNC && + r->sync != CUPS_RASTER_REVSYNC && + r->sync != CUPS_RASTER_SYNCv1 && + r->sync != CUPS_RASTER_REVSYNCv1 && + r->sync != CUPS_RASTER_SYNCv2 && + r->sync != CUPS_RASTER_REVSYNCv2) + { + _cupsRasterAddError("Unknown raster format %08x!\n", r->sync); + free(r); + return (NULL); + } + + if (r->sync == CUPS_RASTER_SYNCv2 || + r->sync == CUPS_RASTER_REVSYNCv2) + r->compressed = 1; + + if (r->sync == CUPS_RASTER_REVSYNC || + r->sync == CUPS_RASTER_REVSYNCv1 || + r->sync == CUPS_RASTER_REVSYNCv2) + r->swapped = 1; + + DEBUG_printf(("r->swapped=%d, r->sync=%08x\n", r->swapped, r->sync)); + } + else + { + /* + * Open for write - put sync word... + */ + + switch (mode) + { + default : + case CUPS_RASTER_WRITE : + r->sync = CUPS_RASTER_SYNC; + break; + + case CUPS_RASTER_WRITE_COMPRESSED : + r->compressed = 1; + r->sync = CUPS_RASTER_SYNCv2; + break; + + case CUPS_RASTER_WRITE_PWG : + r->compressed = 1; + r->sync = htonl(CUPS_RASTER_SYNC_PWG); + r->swapped = r->sync != CUPS_RASTER_SYNC_PWG; + break; + } + + if (cups_raster_io(r, (unsigned char *)&(r->sync), sizeof(r->sync)) + < sizeof(r->sync)) + { + _cupsRasterAddError("Unable to write raster stream header: %s\n", + strerror(errno)); + free(r); + return (NULL); + } + } + + return (r); +} + + +/* + * 'cupsRasterReadHeader()' - Read a raster page header and store it in a + * version 1 page header structure. + * + * This function is deprecated. Use @link cupsRasterReadHeader2@ instead. + * + * Version 1 page headers were used in CUPS 1.0 and 1.1 and contain a subset + * of the version 2 page header data. This function handles reading version 2 + * page headers and copying only the version 1 data into the provided buffer. + * + * @deprecated@ + */ + +unsigned /* O - 1 on success, 0 on failure/end-of-file */ +cupsRasterReadHeader( + cups_raster_t *r, /* I - Raster stream */ + cups_page_header_t *h) /* I - Pointer to header data */ +{ + /* + * Get the raster header... + */ + + if (!cups_raster_read_header(r)) + return (0); + + /* + * Copy the header to the user-supplied buffer... + */ + + memcpy(h, &(r->header), sizeof(cups_page_header_t)); + + return (1); +} + + +/* + * 'cupsRasterReadHeader2()' - Read a raster page header and store it in a + * version 2 page header structure. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +unsigned /* O - 1 on success, 0 on failure/end-of-file */ +cupsRasterReadHeader2( + cups_raster_t *r, /* I - Raster stream */ + cups_page_header2_t *h) /* I - Pointer to header data */ +{ + /* + * Get the raster header... + */ + + if (!cups_raster_read_header(r)) + return (0); + + /* + * Copy the header to the user-supplied buffer... + */ + + memcpy(h, &(r->header), sizeof(cups_page_header2_t)); + + return (1); +} + + +/* + * 'cupsRasterReadPixels()' - Read raster pixels. + * + * For best performance, filters should read one or more whole lines. + * The "cupsBytesPerLine" value from the page header can be used to allocate + * the line buffer and as the number of bytes to read. + */ + +unsigned /* O - Number of bytes read */ +cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */ + unsigned char *p, /* I - Pointer to pixel buffer */ + unsigned len) /* I - Number of bytes to read */ +{ + int bytes; /* Bytes read */ + unsigned cupsBytesPerLine; /* cupsBytesPerLine value */ + unsigned remaining; /* Bytes remaining */ + unsigned char *ptr, /* Pointer to read buffer */ + byte, /* Byte from file */ + *temp; /* Pointer into buffer */ + int count; /* Repetition count */ + + + if (r == NULL || r->mode != CUPS_RASTER_READ || r->remaining == 0 || + r->header.cupsBytesPerLine == 0) + return (0); + + if (!r->compressed) + { + /* + * Read without compression... + */ + + r->remaining -= len / r->header.cupsBytesPerLine; + + if (cups_raster_io(r, p, len) < (ssize_t)len) + return (0); + + /* + * Swap bytes as needed... + */ + + if (r->swapped && + (r->header.cupsBitsPerColor == 16 || + r->header.cupsBitsPerPixel == 12 || + r->header.cupsBitsPerPixel == 16)) + cups_swap(p, len); + + /* + * Return... + */ + + return (len); + } + + /* + * Read compressed data... + */ + + remaining = len; + cupsBytesPerLine = r->header.cupsBytesPerLine; + + while (remaining > 0 && r->remaining > 0) + { + if (r->count == 0) + { + /* + * Need to read a new row... + */ + + if (remaining == cupsBytesPerLine) + ptr = p; + else + ptr = r->pixels; + + /* + * Read using a modified PackBits compression... + */ + + if (!cups_raster_read(r, &byte, 1)) + return (0); + + r->count = byte + 1; + + if (r->count > 1) + ptr = r->pixels; + + temp = ptr; + bytes = cupsBytesPerLine; + + while (bytes > 0) + { + /* + * Get a new repeat count... + */ + + if (!cups_raster_read(r, &byte, 1)) + return (0); + + if (byte & 128) + { + /* + * Copy N literal pixels... + */ + + count = (257 - byte) * r->bpp; + + if (count > bytes) + count = bytes; + + if (!cups_raster_read(r, temp, count)) + return (0); + + temp += count; + bytes -= count; + } + else + { + /* + * Repeat the next N bytes... + */ + + count = (byte + 1) * r->bpp; + if (count > bytes) + count = bytes; + + if (count < r->bpp) + break; + + bytes -= count; + + if (!cups_raster_read(r, temp, r->bpp)) + return (0); + + temp += r->bpp; + count -= r->bpp; + + while (count > 0) + { + memcpy(temp, temp - r->bpp, r->bpp); + temp += r->bpp; + count -= r->bpp; + } + } + } + + /* + * Swap bytes as needed... + */ + + if ((r->header.cupsBitsPerColor == 16 || + r->header.cupsBitsPerPixel == 12 || + r->header.cupsBitsPerPixel == 16) && + r->swapped) + cups_swap(ptr, bytes); + + /* + * Update pointers... + */ + + if (remaining >= cupsBytesPerLine) + { + bytes = cupsBytesPerLine; + r->pcurrent = r->pixels; + r->count --; + r->remaining --; + } + else + { + bytes = remaining; + r->pcurrent = r->pixels + bytes; + } + + /* + * Copy data as needed... + */ + + if (ptr != p) + memcpy(p, ptr, bytes); + } + else + { + /* + * Copy fragment from buffer... + */ + + if ((unsigned)(bytes = r->pend - r->pcurrent) > remaining) + bytes = remaining; + + memcpy(p, r->pcurrent, bytes); + r->pcurrent += bytes; + + if (r->pcurrent >= r->pend) + { + r->pcurrent = r->pixels; + r->count --; + r->remaining --; + } + } + + remaining -= bytes; + p += bytes; + } + + return (len); +} + + +/* + * 'cupsRasterWriteHeader()' - Write a raster page header from a version 1 page + * header structure. + * + * This function is deprecated. Use @link cupsRasterWriteHeader2@ instead. + * + * @deprecated@ + */ + +unsigned /* O - 1 on success, 0 on failure */ +cupsRasterWriteHeader( + cups_raster_t *r, /* I - Raster stream */ + cups_page_header_t *h) /* I - Raster page header */ +{ + if (r == NULL || r->mode == CUPS_RASTER_READ) + return (0); + + /* + * Make a copy of the header, and compute the number of raster + * lines in the page image... + */ + + memset(&(r->header), 0, sizeof(r->header)); + memcpy(&(r->header), h, sizeof(cups_page_header_t)); + + cups_raster_update(r); + + /* + * Write the raster header... + */ + + if (r->mode == CUPS_RASTER_WRITE_PWG) + { + /* + * PWG raster data is always network byte order with much of the page header + * zeroed. + */ + + cups_page_header2_t fh; /* File page header */ + + memset(&fh, 0, sizeof(fh)); + + strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); + /* PwgRaster */ + strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); + strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); + strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); + /* PrintContentType */ + + fh.CutMedia = htonl(r->header.CutMedia); + fh.Duplex = htonl(r->header.Duplex); + fh.HWResolution[0] = htonl(r->header.HWResolution[0]); + fh.HWResolution[1] = htonl(r->header.HWResolution[1]); + fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); + fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); + fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); + fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); + fh.InsertSheet = htonl(r->header.InsertSheet); + fh.Jog = htonl(r->header.Jog); + fh.LeadingEdge = htonl(r->header.LeadingEdge); + fh.ManualFeed = htonl(r->header.ManualFeed); + fh.MediaPosition = htonl(r->header.MediaPosition); + fh.MediaWeight = htonl(r->header.MediaWeight); + fh.NumCopies = htonl(r->header.NumCopies); + fh.Orientation = htonl(r->header.Orientation); + fh.PageSize[0] = htonl(r->header.PageSize[0]); + fh.PageSize[1] = htonl(r->header.PageSize[1]); + fh.Tumble = htonl(r->header.Tumble); + fh.cupsWidth = htonl(r->header.cupsWidth); + fh.cupsHeight = htonl(r->header.cupsHeight); + fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); + fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); + fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); + fh.cupsColorOrder = htonl(r->header.cupsColorOrder); + fh.cupsColorSpace = htonl(r->header.cupsColorSpace); + fh.cupsNumColors = htonl(r->header.cupsNumColors); + fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); + /* TotalPageCount */ + fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); + /* CrossFeedTransform */ + fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); + /* FeedTransform */ + fh.cupsInteger[3] = htonl(r->header.cupsInteger[3]); + /* ImageBoxLeft */ + fh.cupsInteger[4] = htonl(r->header.cupsInteger[4]); + /* ImageBoxTop */ + fh.cupsInteger[5] = htonl(r->header.cupsInteger[5]); + /* ImageBoxRight */ + fh.cupsInteger[6] = htonl(r->header.cupsInteger[6]); + /* ImageBoxBottom */ + fh.cupsInteger[7] = htonl(r->header.cupsInteger[7]); + /* BlackPrimary */ + fh.cupsInteger[8] = htonl(r->header.cupsInteger[8]); + /* PrintQuality */ + fh.cupsInteger[14] = htonl(r->header.cupsInteger[14]); + /* VendorIdentifier */ + fh.cupsInteger[15] = htonl(r->header.cupsInteger[15]); + /* VendorLength */ + + memcpy(fh.cupsReal, r->header.cupsReal, + sizeof(fh.cupsReal) + sizeof(fh.cupsString)); + /* VendorData */ + + strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, + sizeof(fh.cupsRenderingIntent)); + strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, + sizeof(fh.cupsPageSizeName)); + + return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); + } + else + return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) + == sizeof(r->header)); +} + + +/* + * 'cupsRasterWriteHeader2()' - Write a raster page header from a version 2 + * page header structure. + * + * The page header can be initialized using @link cupsRasterInterpretPPD@. + * + * @since CUPS 1.2/Mac OS X 10.5@ + */ + +unsigned /* O - 1 on success, 0 on failure */ +cupsRasterWriteHeader2( + cups_raster_t *r, /* I - Raster stream */ + cups_page_header2_t *h) /* I - Raster page header */ +{ + if (r == NULL || r->mode == CUPS_RASTER_READ) + return (0); + + /* + * Make a copy of the header, and compute the number of raster + * lines in the page image... + */ + + memcpy(&(r->header), h, sizeof(cups_page_header2_t)); + + cups_raster_update(r); + + /* + * Write the raster header... + */ + + if (r->mode == CUPS_RASTER_WRITE_PWG) + { + /* + * PWG raster data is always network byte order with most of the page header + * zeroed. + */ + + cups_page_header2_t fh; /* File page header */ + + memset(&fh, 0, sizeof(fh)); + strlcpy(fh.MediaClass, "PwgRaster", sizeof(fh.MediaClass)); + strlcpy(fh.MediaColor, r->header.MediaColor, sizeof(fh.MediaColor)); + strlcpy(fh.MediaType, r->header.MediaType, sizeof(fh.MediaType)); + strlcpy(fh.OutputType, r->header.OutputType, sizeof(fh.OutputType)); + strlcpy(fh.cupsRenderingIntent, r->header.cupsRenderingIntent, + sizeof(fh.cupsRenderingIntent)); + strlcpy(fh.cupsPageSizeName, r->header.cupsPageSizeName, + sizeof(fh.cupsPageSizeName)); + + fh.CutMedia = htonl(r->header.CutMedia); + fh.Duplex = htonl(r->header.Duplex); + fh.HWResolution[0] = htonl(r->header.HWResolution[0]); + fh.HWResolution[1] = htonl(r->header.HWResolution[1]); + fh.ImagingBoundingBox[0] = htonl(r->header.ImagingBoundingBox[0]); + fh.ImagingBoundingBox[1] = htonl(r->header.ImagingBoundingBox[1]); + fh.ImagingBoundingBox[2] = htonl(r->header.ImagingBoundingBox[2]); + fh.ImagingBoundingBox[3] = htonl(r->header.ImagingBoundingBox[3]); + fh.InsertSheet = htonl(r->header.InsertSheet); + fh.Jog = htonl(r->header.Jog); + fh.LeadingEdge = htonl(r->header.LeadingEdge); + fh.ManualFeed = htonl(r->header.ManualFeed); + fh.MediaPosition = htonl(r->header.MediaPosition); + fh.MediaWeight = htonl(r->header.MediaWeight); + fh.NumCopies = htonl(r->header.NumCopies); + fh.Orientation = htonl(r->header.Orientation); + fh.PageSize[0] = htonl(r->header.PageSize[0]); + fh.PageSize[1] = htonl(r->header.PageSize[1]); + fh.Tumble = htonl(r->header.Tumble); + fh.cupsWidth = htonl(r->header.cupsWidth); + fh.cupsHeight = htonl(r->header.cupsHeight); + fh.cupsBitsPerColor = htonl(r->header.cupsBitsPerColor); + fh.cupsBitsPerPixel = htonl(r->header.cupsBitsPerPixel); + fh.cupsBytesPerLine = htonl(r->header.cupsBytesPerLine); + fh.cupsColorOrder = htonl(r->header.cupsColorOrder); + fh.cupsColorSpace = htonl(r->header.cupsColorSpace); + fh.cupsNumColors = htonl(r->header.cupsNumColors); + fh.cupsInteger[0] = htonl(r->header.cupsInteger[0]); + fh.cupsInteger[1] = htonl(r->header.cupsInteger[1]); + fh.cupsInteger[2] = htonl(r->header.cupsInteger[2]); + fh.cupsInteger[3] = htonl((unsigned)(r->header.cupsImagingBBox[0] * + r->header.HWResolution[0])); + fh.cupsInteger[4] = htonl((unsigned)(r->header.cupsImagingBBox[1] * + r->header.HWResolution[1])); + fh.cupsInteger[5] = htonl((unsigned)(r->header.cupsImagingBBox[2] * + r->header.HWResolution[0])); + fh.cupsInteger[6] = htonl((unsigned)(r->header.cupsImagingBBox[3] * + r->header.HWResolution[1])); + fh.cupsInteger[7] = htonl(0xffffff); + + return (cups_raster_io(r, (unsigned char *)&fh, sizeof(fh)) == sizeof(fh)); + } + else + return (cups_raster_io(r, (unsigned char *)&(r->header), sizeof(r->header)) + == sizeof(r->header)); +} + + +/* + * 'cupsRasterWritePixels()' - Write raster pixels. + * + * For best performance, filters should write one or more whole lines. + * The "cupsBytesPerLine" value from the page header can be used to allocate + * the line buffer and as the number of bytes to write. + */ + +unsigned /* O - Number of bytes written */ +cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */ + unsigned char *p, /* I - Bytes to write */ + unsigned len)/* I - Number of bytes to write */ +{ + int bytes; /* Bytes read */ + unsigned remaining; /* Bytes remaining */ + + + DEBUG_printf(("cupsRasterWritePixels(r=%p, p=%p, len=%u), remaining=%u\n", + r, p, len, r->remaining)); + + if (r == NULL || r->mode == CUPS_RASTER_READ || r->remaining == 0) + return (0); + + if (!r->compressed) + { + /* + * Without compression, just write the raster data raw unless the data needs + * to be swapped... + */ + + r->remaining -= len / r->header.cupsBytesPerLine; + + if (r->swapped && + (r->header.cupsBitsPerColor == 16 || + r->header.cupsBitsPerPixel == 12 || + r->header.cupsBitsPerPixel == 16)) + { + unsigned char *bufptr; /* Pointer into write buffer */ + unsigned count; /* Remaining count */ + + /* + * Allocate a write buffer as needed... + */ + + if ((size_t)len > r->bufsize) + { + if (r->buffer) + bufptr = realloc(r->buffer, len); + else + bufptr = malloc(len); + + if (!bufptr) + return (0); + + r->buffer = bufptr; + r->bufsize = len; + } + + /* + * Byte swap the pixels... + */ + + for (bufptr = r->buffer, count = len; count > 1; count -= 2, bufptr += 2) + { + bufptr[1] = *p++; + bufptr[0] = *p++; + } + + if (count) /* This should never happen... */ + *bufptr = *p; + + /* + * Write the byte-swapped buffer... + */ + + return (cups_raster_io(r, r->buffer, len)); + } + else + return (cups_raster_io(r, p, len)); + } + + /* + * Otherwise, compress each line... + */ + + for (remaining = len; remaining > 0; remaining -= bytes, p += bytes) + { + /* + * Figure out the number of remaining bytes on the current line... + */ + + if ((bytes = remaining) > (r->pend - r->pcurrent)) + bytes = r->pend - r->pcurrent; + + if (r->count > 0) + { + /* + * Check to see if this line is the same as the previous line... + */ + + if (memcmp(p, r->pcurrent, bytes)) + { + if (!cups_raster_write(r, r->pixels)) + return (0); + + r->count = 0; + } + else + { + /* + * Mark more bytes as the same... + */ + + r->pcurrent += bytes; + + if (r->pcurrent >= r->pend) + { + /* + * Increase the repeat count... + */ + + r->count ++; + r->pcurrent = r->pixels; + + /* + * Flush out this line if it is the last one... + */ + + r->remaining --; + + if (r->remaining == 0) + return (cups_raster_write(r, r->pixels)); + else if (r->count == 256) + { + if (cups_raster_write(r, r->pixels) == 0) + return (0); + + r->count = 0; + } + } + + continue; + } + } + + if (r->count == 0) + { + /* + * Copy the raster data to the buffer... + */ + + memcpy(r->pcurrent, p, bytes); + + r->pcurrent += bytes; + + if (r->pcurrent >= r->pend) + { + /* + * Increase the repeat count... + */ + + r->count ++; + r->pcurrent = r->pixels; + + /* + * Flush out this line if it is the last one... + */ + + r->remaining --; + + if (r->remaining == 0) + return (cups_raster_write(r, r->pixels)); + } + } + } + + return (len); +} + + +/* + * 'cups_raster_read_header()' - Read a raster page header. + */ + +static unsigned /* O - 1 on success, 0 on fail */ +cups_raster_read_header( + cups_raster_t *r) /* I - Raster stream */ +{ + int len; /* Length for read/swap */ + + + if (r == NULL || r->mode != CUPS_RASTER_READ) + return (0); + + /* + * Get the length of the raster header... + */ + + if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1) + len = sizeof(cups_page_header_t); + else + len = sizeof(cups_page_header2_t); + + /* + * Read the header... + */ + + memset(&(r->header), 0, sizeof(r->header)); + + if (cups_raster_read(r, (unsigned char *)&(r->header), len) < len) + return (0); + + /* + * Swap bytes as needed... + */ + + if (r->swapped) + { + unsigned *s, /* Current word */ + temp; /* Temporary copy */ + + + DEBUG_puts("Swapping header bytes..."); + + for (len = 81, s = &(r->header.AdvanceDistance); + len > 0; + len --, s ++) + { + DEBUG_printf(("%08x =>", *s)); + + temp = *s; + *s = ((temp & 0xff) << 24) | + ((temp & 0xff00) << 8) | + ((temp & 0xff0000) >> 8) | + ((temp & 0xff000000) >> 24); + + DEBUG_printf((" %08x\n", *s)); + } + } + + /* + * Update the header and row count... + */ + + cups_raster_update(r); + + return (r->header.cupsBytesPerLine != 0 && r->header.cupsHeight != 0); +} + + +/* + * 'cups_raster_io()' - Read/write bytes from a context, handling interruptions. + */ + +static int /* O - Bytes read or -1 */ +cups_raster_io(cups_raster_t *r, /* I - Raster stream */ + unsigned char *buf, /* I - Buffer for read/write */ + int bytes) /* I - Number of bytes to read/write */ +{ + ssize_t count; /* Number of bytes read/written */ + size_t total; /* Total bytes read/written */ + + + DEBUG_printf(("4cups_raster_io(r=%p, buf=%p, bytes=%d)", r, buf, bytes)); + + for (total = 0; total < (size_t)bytes; total += count, buf += count) + { + count = (*r->iocb)(r->ctx, buf, bytes - total); + + DEBUG_printf(("5cups_raster_io: count=%d, total=%d", (int)count, + (int)total)); + if (count == 0) + return (0); + else if (count < 0) + return (-1); + } + + return ((int)total); +} + + +/* + * 'cups_raster_read()' - Read through the raster buffer. + */ + +static int /* O - Number of bytes read */ +cups_raster_read(cups_raster_t *r, /* I - Raster stream */ + unsigned char *buf, /* I - Buffer */ + int bytes) /* I - Number of bytes to read */ +{ + int count, /* Number of bytes read */ + remaining, /* Remaining bytes in buffer */ + total; /* Total bytes read */ + + + DEBUG_printf(("cups_raster_read(r=%p, buf=%p, bytes=%d)\n", r, buf, bytes)); + + if (!r->compressed) + return (cups_raster_io(r, buf, bytes)); + + /* + * Allocate a read buffer as needed... + */ + + count = 2 * r->header.cupsBytesPerLine; + + if ((size_t)count > r->bufsize) + { + int offset = r->bufptr - r->buffer; /* Offset to current start of buffer */ + int end = r->bufend - r->buffer; /* Offset to current end of buffer */ + unsigned char *rptr; /* Pointer in read buffer */ + + if (r->buffer) + rptr = realloc(r->buffer, count); + else + rptr = malloc(count); + + if (!rptr) + return (0); + + r->buffer = rptr; + r->bufptr = rptr + offset; + r->bufend = rptr + end; + r->bufsize = count; + } + + /* + * Loop until we have read everything... + */ + + for (total = 0, remaining = r->bufend - r->bufptr; + total < bytes; + total += count, buf += count) + { + count = bytes - total; + + DEBUG_printf(("count=%d, remaining=%d, buf=%p, bufptr=%p, bufend=%p...\n", + count, remaining, buf, r->bufptr, r->bufend)); + + if (remaining == 0) + { + if (count < 16) + { + /* + * Read into the raster buffer and then copy... + */ + + remaining = (*r->iocb)(r->ctx, r->buffer, r->bufsize); + if (remaining <= 0) + return (0); + + r->bufptr = r->buffer; + r->bufend = r->buffer + remaining; + } + else + { + /* + * Read directly into "buf"... + */ + + count = (*r->iocb)(r->ctx, buf, count); + + if (count <= 0) + return (0); + + continue; + } + } + + /* + * Copy bytes from raster buffer to "buf"... + */ + + if (count > remaining) + count = remaining; + + if (count == 1) + { + /* + * Copy 1 byte... + */ + + *buf = *(r->bufptr)++; + remaining --; + } + else if (count < 128) + { + /* + * Copy up to 127 bytes without using memcpy(); this is + * faster because it avoids an extra function call and is + * often further optimized by the compiler... + */ + + unsigned char *bufptr; /* Temporary buffer pointer */ + + remaining -= count; + + for (bufptr = r->bufptr; count > 0; count --, total ++) + *buf++ = *bufptr++; + + r->bufptr = bufptr; + } + else + { + /* + * Use memcpy() for a large read... + */ + + memcpy(buf, r->bufptr, count); + r->bufptr += count; + remaining -= count; + } + } + + return (total); +} + + +/* + * 'cups_raster_update()' - Update the raster header and row count for the + * current page. + */ + +static void +cups_raster_update(cups_raster_t *r) /* I - Raster stream */ +{ + if (r->sync == CUPS_RASTER_SYNCv1 || r->sync == CUPS_RASTER_REVSYNCv1 || + r->header.cupsNumColors == 0) + { + /* + * Set the "cupsNumColors" field according to the colorspace... + */ + + switch (r->header.cupsColorSpace) + { + case CUPS_CSPACE_W : + case CUPS_CSPACE_K : + case CUPS_CSPACE_WHITE : + case CUPS_CSPACE_GOLD : + case CUPS_CSPACE_SILVER : + case CUPS_CSPACE_SW : + r->header.cupsNumColors = 1; + break; + + case CUPS_CSPACE_RGB : + case CUPS_CSPACE_CMY : + case CUPS_CSPACE_YMC : + case CUPS_CSPACE_CIEXYZ : + case CUPS_CSPACE_CIELab : + case CUPS_CSPACE_SRGB : + case CUPS_CSPACE_ADOBERGB : + case CUPS_CSPACE_ICC1 : + case CUPS_CSPACE_ICC2 : + case CUPS_CSPACE_ICC3 : + case CUPS_CSPACE_ICC4 : + case CUPS_CSPACE_ICC5 : + case CUPS_CSPACE_ICC6 : + case CUPS_CSPACE_ICC7 : + case CUPS_CSPACE_ICC8 : + case CUPS_CSPACE_ICC9 : + case CUPS_CSPACE_ICCA : + case CUPS_CSPACE_ICCB : + case CUPS_CSPACE_ICCC : + case CUPS_CSPACE_ICCD : + case CUPS_CSPACE_ICCE : + case CUPS_CSPACE_ICCF : + r->header.cupsNumColors = 3; + break; + + case CUPS_CSPACE_RGBA : + case CUPS_CSPACE_RGBW : + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_YMCK : + case CUPS_CSPACE_KCMY : + case CUPS_CSPACE_GMCK : + case CUPS_CSPACE_GMCS : + r->header.cupsNumColors = 4; + break; + + case CUPS_CSPACE_KCMYcm : + if (r->header.cupsBitsPerPixel < 8) + r->header.cupsNumColors = 6; + else + r->header.cupsNumColors = 4; + break; + + case CUPS_CSPACE_DEVICE1 : + case CUPS_CSPACE_DEVICE2 : + case CUPS_CSPACE_DEVICE3 : + case CUPS_CSPACE_DEVICE4 : + case CUPS_CSPACE_DEVICE5 : + case CUPS_CSPACE_DEVICE6 : + case CUPS_CSPACE_DEVICE7 : + case CUPS_CSPACE_DEVICE8 : + case CUPS_CSPACE_DEVICE9 : + case CUPS_CSPACE_DEVICEA : + case CUPS_CSPACE_DEVICEB : + case CUPS_CSPACE_DEVICEC : + case CUPS_CSPACE_DEVICED : + case CUPS_CSPACE_DEVICEE : + case CUPS_CSPACE_DEVICEF : + r->header.cupsNumColors = r->header.cupsColorSpace - + CUPS_CSPACE_DEVICE1 + 1; + break; + } + } + + /* + * Set the number of bytes per pixel/color... + */ + + if (r->header.cupsColorOrder == CUPS_ORDER_CHUNKED) + r->bpp = (r->header.cupsBitsPerPixel + 7) / 8; + else + r->bpp = (r->header.cupsBitsPerColor + 7) / 8; + + /* + * Set the number of remaining rows... + */ + + if (r->header.cupsColorOrder == CUPS_ORDER_PLANAR) + r->remaining = r->header.cupsHeight * r->header.cupsNumColors; + else + r->remaining = r->header.cupsHeight; + + /* + * Allocate the compression buffer... + */ + + if (r->compressed) + { + if (r->pixels != NULL) + free(r->pixels); + + r->pixels = calloc(r->header.cupsBytesPerLine, 1); + r->pcurrent = r->pixels; + r->pend = r->pixels + r->header.cupsBytesPerLine; + r->count = 0; + } +} + + +/* + * 'cups_raster_write()' - Write a row of compressed raster data... + */ + +static int /* O - Number of bytes written */ +cups_raster_write( + cups_raster_t *r, /* I - Raster stream */ + const unsigned char *pixels) /* I - Pixel data to write */ +{ + const unsigned char *start, /* Start of sequence */ + *ptr, /* Current pointer in sequence */ + *pend, /* End of raster buffer */ + *plast; /* Pointer to last pixel */ + unsigned char *wptr; /* Pointer into write buffer */ + int bpp, /* Bytes per pixel */ + count; /* Count */ + + + DEBUG_printf(("cups_raster_write(r=%p, pixels=%p)\n", r, pixels)); + + /* + * Allocate a write buffer as needed... + */ + + count = r->header.cupsBytesPerLine * 2; + if ((size_t)count > r->bufsize) + { + if (r->buffer) + wptr = realloc(r->buffer, count); + else + wptr = malloc(count); + + if (!wptr) + return (-1); + + r->buffer = wptr; + r->bufsize = count; + } + + /* + * Write the row repeat count... + */ + + bpp = r->bpp; + pend = pixels + r->header.cupsBytesPerLine; + plast = pend - bpp; + wptr = r->buffer; + *wptr++ = r->count - 1; + + /* + * Write using a modified PackBits compression... + */ + + for (ptr = pixels; ptr < pend;) + { + start = ptr; + ptr += bpp; + + if (ptr == pend) + { + /* + * Encode a single pixel at the end... + */ + + *wptr++ = 0; + for (count = bpp; count > 0; count --) + *wptr++ = *start++; + } + else if (!memcmp(start, ptr, bpp)) + { + /* + * Encode a sequence of repeating pixels... + */ + + for (count = 2; count < 128 && ptr < plast; count ++, ptr += bpp) + if (memcmp(ptr, ptr + bpp, bpp)) + break; + + *wptr++ = count - 1; + for (count = bpp; count > 0; count --) + *wptr++ = *ptr++; + } + else + { + /* + * Encode a sequence of non-repeating pixels... + */ + + for (count = 1; count < 128 && ptr < plast; count ++, ptr += bpp) + if (!memcmp(ptr, ptr + bpp, bpp)) + break; + + if (ptr >= plast && count < 128) + { + count ++; + ptr += bpp; + } + + *wptr++ = 257 - count; + + count *= bpp; + memcpy(wptr, start, count); + wptr += count; + } + } + + return (cups_raster_io(r, r->buffer, wptr - r->buffer)); +} + + +/* + * 'cups_read_fd()' - Read bytes from a file. + */ + +static ssize_t /* O - Bytes read or -1 */ +cups_read_fd(void *ctx, /* I - File descriptor as pointer */ + unsigned char *buf, /* I - Buffer for read */ + size_t bytes) /* I - Maximum number of bytes to read */ +{ + int fd = (int)((intptr_t)ctx); + /* File descriptor */ + ssize_t count; /* Number of bytes read */ + + + while ((count = read(fd, buf, bytes)) < 0) + if (errno != EINTR && errno != EAGAIN) + return (-1); + + return (count); +} + + +/* + * 'cups_swap()' - Swap bytes in raster data... + */ + +static void +cups_swap(unsigned char *buf, /* I - Buffer to swap */ + int bytes) /* I - Number of bytes to swap */ +{ + unsigned char even, odd; /* Temporary variables */ + + + bytes /= 2; + + while (bytes > 0) + { + even = buf[0]; + odd = buf[1]; + buf[0] = odd; + buf[1] = even; + + buf += 2; + bytes --; + } +} + + +/* + * 'cups_write_fd()' - Write bytes to a file. + */ + +static ssize_t /* O - Bytes written or -1 */ +cups_write_fd(void *ctx, /* I - File descriptor pointer */ + unsigned char *buf, /* I - Bytes to write */ + size_t bytes) /* I - Number of bytes to write */ +{ + int fd = (int)((intptr_t)ctx); + /* File descriptor */ + ssize_t count; /* Number of bytes written */ + + + while ((count = write(fd, buf, bytes)) < 0) + if (errno != EINTR && errno != EAGAIN) + return (-1); + + return (count); +} + + +/* + * End of "$Id: raster.c 10006 2011-09-20 18:36:33Z mike $". + */ diff --git a/filter/rasterbench.c b/filter/rasterbench.c new file mode 100644 index 0000000..660f451 --- /dev/null +++ b/filter/rasterbench.c @@ -0,0 +1,355 @@ +/* + * "$Id: rasterbench.c 9771 2011-05-12 05:21:56Z mike $" + * + * Raster benchmark program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Benchmark the raster read/write functions. + * compute_median() - Compute the median time for a test. + * read_test() - Benchmark the raster read functions. + * write_test() - Benchmark the raster write functions. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Constants... + */ + +#define TEST_WIDTH 1024 +#define TEST_HEIGHT 1024 +#define TEST_PAGES 16 +#define TEST_PASSES 20 + + +/* + * Local functions... + */ + +static double compute_median(double *secs); +static double get_time(void); +static void read_test(int fd); +static int run_read_test(void); +static void write_test(int fd, cups_mode_t mode); + + +/* + * 'main()' - Benchmark the raster read/write functions. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int ras_fd, /* File descriptor for read process */ + status; /* Exit status of read process */ + double start_secs, /* Start time */ + write_secs, /* Write time */ + read_secs, /* Read time */ + pass_secs[TEST_PASSES]; /* Total test times */ + cups_mode_t mode; /* Write mode */ + + + /* + * See if we have anything on the command-line... + */ + + if (argc > 2 || (argc == 2 && strcmp(argv[1], "-z"))) + { + puts("Usage: rasterbench [-z]"); + return (1); + } + + mode = argc > 1 ? CUPS_RASTER_WRITE_COMPRESSED : CUPS_RASTER_WRITE; + + /* + * Ignore SIGPIPE... + */ + + signal(SIGPIPE, SIG_IGN); + + /* + * Run the tests several times to get a good average... + */ + + printf("Test read/write speed of %d pages, %dx%d pixels...\n\n", + TEST_PAGES, TEST_WIDTH, TEST_HEIGHT); + for (i = 0; i < TEST_PASSES; i ++) + { + printf("PASS %2d: ", i + 1); + fflush(stdout); + + ras_fd = run_read_test(); + start_secs = get_time(); + + write_test(ras_fd, mode); + + write_secs = get_time(); + printf(" %.3f write,", write_secs - start_secs); + fflush(stdout); + + close(ras_fd); + wait(&status); + + read_secs = get_time(); + pass_secs[i] = read_secs - start_secs; + printf(" %.3f read, %.3f total\n", read_secs - write_secs, pass_secs[i]); + } + + printf("\nMedian Total Time: %.3f seconds per document\n", + compute_median(pass_secs)); + + return (0); +} + + +/* + * 'compute_median()' - Compute the median time for a test. + */ + +static double /* O - Median time in seconds */ +compute_median(double *secs) /* I - Array of time samples */ +{ + int i, j; /* Looping vars */ + double temp; /* Swap variable */ + + + /* + * Sort the array into ascending order using a quicky bubble sort... + */ + + for (i = 0; i < (TEST_PASSES - 1); i ++) + for (j = i + 1; j < TEST_PASSES; j ++) + if (secs[i] > secs[j]) + { + temp = secs[i]; + secs[i] = secs[j]; + secs[j] = temp; + } + + /* + * Return the average of the middle two samples... + */ + + return (0.5 * (secs[TEST_PASSES / 2 - 1] + secs[TEST_PASSES / 2])); +} + + +/* + * 'get_time()' - Get the current time in seconds. + */ + +static double /* O - Time in seconds */ +get_time(void) +{ + struct timeval curtime; /* Current time */ + + + gettimeofday(&curtime, NULL); + return (curtime.tv_sec + 0.000001 * curtime.tv_usec); +} + + +/* + * 'read_test()' - Benchmark the raster read functions. + */ + +static void +read_test(int fd) /* I - File descriptor to read from */ +{ + int y; /* Looping var */ + cups_raster_t *r; /* Raster stream */ + cups_page_header2_t header; /* Page header */ + unsigned char buffer[8 * TEST_WIDTH]; + /* Read buffer */ + + + /* + * Test read speed... + */ + + if ((r = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) + { + perror("Unable to create raster input stream"); + return; + } + + while (cupsRasterReadHeader2(r, &header)) + { + for (y = 0; y < header.cupsHeight; y ++) + cupsRasterReadPixels(r, buffer, header.cupsBytesPerLine); + } + + cupsRasterClose(r); +} + + +/* + * 'run_read_test()' - Run the read test as a child process via pipes. + */ + +static int /* O - Standard input of child */ +run_read_test(void) +{ + int ras_pipes[2]; /* Raster data pipes */ + int pid; /* Child process ID */ + + + if (pipe(ras_pipes)) + return (-1); + + if ((pid = fork()) < 0) + { + /* + * Fork error - return -1 on error... + */ + + close(ras_pipes[0]); + close(ras_pipes[1]); + + return (-1); + } + else if (pid == 0) + { + /* + * Child comes here - read data from the input pipe... + */ + + close(ras_pipes[1]); + read_test(ras_pipes[0]); + exit(0); + } + else + { + /* + * Parent comes here - return the output pipe... + */ + + close(ras_pipes[0]); + return (ras_pipes[1]); + } +} + + +/* + * 'write_test()' - Benchmark the raster write functions. + */ + +static void +write_test(int fd, /* I - File descriptor to write to */ + cups_mode_t mode) /* I - Write mode */ +{ + int page, x, y; /* Looping vars */ + int count; /* Number of bytes to set */ + cups_raster_t *r; /* Raster stream */ + cups_page_header2_t header; /* Page header */ + unsigned char data[32][8 * TEST_WIDTH]; + /* Raster data to write */ + + + /* + * Create a combination of random data and repeated data to simulate + * text with some whitespace. + */ + + CUPS_SRAND(time(NULL)); + + memset(data, 0, sizeof(data)); + + for (y = 0; y < 28; y ++) + { + for (x = CUPS_RAND() & 127, count = (CUPS_RAND() & 15) + 1; + x < sizeof(data[0]); + x ++, count --) + { + if (count <= 0) + { + x += (CUPS_RAND() & 15) + 1; + count = (CUPS_RAND() & 15) + 1; + + if (x >= sizeof(data[0])) + break; + } + + data[y][x] = CUPS_RAND(); + } + } + + /* + * Test write speed... + */ + + if ((r = cupsRasterOpen(fd, mode)) == NULL) + { + perror("Unable to create raster output stream"); + return; + } + + for (page = 0; page < TEST_PAGES; page ++) + { + memset(&header, 0, sizeof(header)); + header.cupsWidth = TEST_WIDTH; + header.cupsHeight = TEST_HEIGHT; + header.cupsBytesPerLine = TEST_WIDTH; + + if (page & 1) + { + header.cupsBytesPerLine *= 4; + header.cupsColorSpace = CUPS_CSPACE_CMYK; + header.cupsColorOrder = CUPS_ORDER_CHUNKED; + } + else + { + header.cupsColorSpace = CUPS_CSPACE_K; + header.cupsColorOrder = CUPS_ORDER_BANDED; + } + + if (page & 2) + { + header.cupsBytesPerLine *= 2; + header.cupsBitsPerColor = 16; + header.cupsBitsPerPixel = (page & 1) ? 64 : 16; + } + else + { + header.cupsBitsPerColor = 8; + header.cupsBitsPerPixel = (page & 1) ? 32 : 8; + } + + cupsRasterWriteHeader2(r, &header); + + for (y = 0; y < TEST_HEIGHT; y ++) + cupsRasterWritePixels(r, data[y & 31], header.cupsBytesPerLine); + } + + cupsRasterClose(r); +} + + +/* + * End of "$Id: rasterbench.c 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/filter/rastertoepson.c b/filter/rastertoepson.c new file mode 100644 index 0000000..533c7eb --- /dev/null +++ b/filter/rastertoepson.c @@ -0,0 +1,1160 @@ +/* + * "$Id: rastertoepson.c 9384 2010-11-22 07:06:39Z mike $" + * + * EPSON ESC/P and ESC/P2 filter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * Setup() - Prepare the printer for printing. + * StartPage() - Start a page of graphics. + * EndPage() - Finish a page of graphics. + * Shutdown() - Shutdown the printer. + * CompressData() - Compress a line of graphics. + * OutputLine() - Output a line of graphics. + * main() - Main entry and processing of driver. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * Model numbers... + */ + +#define EPSON_9PIN 0 +#define EPSON_24PIN 1 +#define EPSON_COLOR 2 +#define EPSON_PHOTO 3 +#define EPSON_ICOLOR 4 +#define EPSON_IPHOTO 5 + + +/* + * Macros... + */ + +#define pwrite(s,n) fwrite((s), 1, (n), stdout) + + +/* + * Globals... + */ + +unsigned char *Planes[6], /* Output buffers */ + *CompBuffer, /* Compression buffer */ + *LineBuffers[2]; /* Line bitmap buffers */ +int Model, /* Model number */ + NumPlanes, /* Number of color planes */ + Feed, /* Number of lines to skip */ + EjectPage; /* Eject the page when done? */ +int DotBit, /* Bit in buffers */ + DotBytes, /* # bytes in a dot column */ + DotColumns, /* # columns in 1/60 inch */ + LineCount, /* # of lines processed */ + EvenOffset, /* Offset into 'even' buffers */ + OddOffset, /* Offset into 'odd' buffers */ + Shingling, /* Shingle output? */ + Canceled; /* Has the current job been canceled? */ + + +/* + * Prototypes... + */ + +void Setup(void); +void StartPage(const ppd_file_t *ppd, const cups_page_header2_t *header); +void EndPage(const cups_page_header2_t *header); +void Shutdown(void); + +void CancelJob(int sig); +void CompressData(const unsigned char *line, int length, int plane, + int type, int xstep, int ystep); +void OutputLine(const cups_page_header2_t *header); +void OutputRows(const cups_page_header2_t *header, int row); + + +/* + * 'Setup()' - Prepare the printer for printing. + */ + +void +Setup(void) +{ + const char *device_uri; /* The device for the printer... */ + + + /* + * EPSON USB printers need an additional command issued at the + * beginning of each job to exit from "packet" mode... + */ + + if ((device_uri = getenv("DEVICE_URI")) != NULL && + strncmp(device_uri, "usb:", 4) == 0 && Model >= EPSON_ICOLOR) + pwrite("\000\000\000\033\001@EJL 1284.4\n@EJL \n\033@", 29); +} + + +/* + * 'StartPage()' - Start a page of graphics. + */ + +void +StartPage( + const ppd_file_t *ppd, /* I - PPD file */ + const cups_page_header2_t *header) /* I - Page header */ +{ + int n, t; /* Numbers */ + int plane; /* Looping var */ + + + /* + * Send a reset sequence. + */ + + if (ppd && ppd->nickname && strstr(ppd->nickname, "OKIDATA") != NULL) + printf("\033{A"); /* Set EPSON emulation mode */ + + printf("\033@"); + + /* + * See which type of printer we are using... + */ + + switch (Model) + { + case EPSON_9PIN : + case EPSON_24PIN : + printf("\033P\022"); /* Set 10 CPI */ + + if (header->HWResolution[0] == 360 || header->HWResolution[0] == 240) + { + printf("\033x1"); /* LQ printing */ + printf("\033U1"); /* Unidirectional */ + } + else + { + printf("\033x0"); /* Draft printing */ + printf("\033U0"); /* Bidirectional */ + } + + printf("\033l%c\033Q%c", 0, /* Side margins */ + (int)(10.0 * header->PageSize[0] / 72.0 + 0.5)); + printf("\033\062\033C%c", /* Page length in 1/6th inches */ + (int)(header->PageSize[1] / 12.0 + 0.5)); + printf("\033N%c", 0); /* Bottom margin */ + printf("\033O"); /* No perforation skip */ + + /* + * Setup various buffer limits... + */ + + DotBytes = header->cupsRowCount / 8; + DotColumns = header->HWResolution[0] / 60; + Shingling = 0; + + if (Model == EPSON_9PIN) + printf("\033\063\030"); /* Set line feed */ + else + switch (header->HWResolution[0]) + { + case 60: + case 120 : + case 240 : + printf("\033\063\030"); /* Set line feed */ + break; + + case 180 : + case 360 : + Shingling = 1; + + if (header->HWResolution[1] == 180) + printf("\033\063\010");/* Set line feed */ + else + printf("\033+\010"); /* Set line feed */ + break; + } + break; + + default : + /* + * Set graphics mode... + */ + + pwrite("\033(G\001\000\001", 6); /* Graphics mode */ + + /* + * Set the media size... + */ + + if (Model < EPSON_ICOLOR) + { + pwrite("\033(U\001\000", 5); /* Resolution/units */ + putchar(3600 / header->HWResolution[1]); + } + else + { + pwrite("\033(U\005\000", 5); + putchar(1440 / header->HWResolution[1]); + putchar(1440 / header->HWResolution[1]); + putchar(1440 / header->HWResolution[0]); + putchar(0xa0); /* n/1440ths... */ + putchar(0x05); + } + + n = header->PageSize[1] * header->HWResolution[1] / 72.0; + + pwrite("\033(C\002\000", 5); /* Page length */ + putchar(n); + putchar(n >> 8); + + if (ppd) + t = (ppd->sizes[1].length - ppd->sizes[1].top) * + header->HWResolution[1] / 72.0; + else + t = 0; + + pwrite("\033(c\004\000", 5); /* Top & bottom margins */ + putchar(t); + putchar(t >> 8); + putchar(n); + putchar(n >> 8); + + if (header->HWResolution[1] == 720) + { + pwrite("\033(i\001\000\001", 6); /* Microweave */ + pwrite("\033(e\002\000\000\001", 7); /* Small dots */ + } + + pwrite("\033(V\002\000\000\000", 7); /* Set absolute position 0 */ + + DotBytes = 0; + DotColumns = 0; + Shingling = 0; + break; + } + + /* + * Set other stuff... + */ + + if (header->cupsColorSpace == CUPS_CSPACE_CMY) + NumPlanes = 3; + else if (header->cupsColorSpace == CUPS_CSPACE_KCMY) + NumPlanes = 4; + else if (header->cupsColorSpace == CUPS_CSPACE_KCMYcm) + NumPlanes = 6; + else + NumPlanes = 1; + + Feed = 0; /* No blank lines yet */ + + /* + * Allocate memory for a line/row of graphics... + */ + + if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL) + { + fputs("ERROR: Unable to allocate memory\n", stderr); + exit(1); + } + + for (plane = 1; plane < NumPlanes; plane ++) + Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes; + + if (header->cupsCompression || DotBytes) + { + if ((CompBuffer = calloc(2, header->cupsWidth)) == NULL) + { + fputs("ERROR: Unable to allocate memory\n", stderr); + exit(1); + } + } + else + CompBuffer = NULL; + + if (DotBytes) + { + if ((LineBuffers[0] = calloc(DotBytes, + header->cupsWidth * (Shingling + 1))) == NULL) + { + fputs("ERROR: Unable to allocate memory\n", stderr); + exit(1); + } + + LineBuffers[1] = LineBuffers[0] + DotBytes * header->cupsWidth; + DotBit = 128; + LineCount = 0; + EvenOffset = 0; + OddOffset = 0; + } +} + + +/* + * 'EndPage()' - Finish a page of graphics. + */ + +void +EndPage( + const cups_page_header2_t *header) /* I - Page header */ +{ + if (DotBytes && header) + { + /* + * Flush remaining graphics as needed... + */ + + if (!Shingling) + { + if (DotBit < 128 || EvenOffset) + OutputRows(header, 0); + } + else if (OddOffset > EvenOffset) + { + OutputRows(header, 1); + OutputRows(header, 0); + } + else + { + OutputRows(header, 0); + OutputRows(header, 1); + } + } + + /* + * Eject the current page... + */ + + putchar(12); /* Form feed */ + fflush(stdout); + + /* + * Free memory... + */ + + free(Planes[0]); + + if (CompBuffer) + free(CompBuffer); + + if (DotBytes) + free(LineBuffers[0]); +} + + +/* + * 'Shutdown()' - Shutdown the printer. + */ + +void +Shutdown(void) +{ + /* + * Send a reset sequence. + */ + + printf("\033@"); +} + + +/* + * 'CancelJob()' - Cancel the current job... + */ + +void +CancelJob(int sig) /* I - Signal */ +{ + (void)sig; + + Canceled = 1; +} + + +/* + * 'CompressData()' - Compress a line of graphics. + */ + +void +CompressData(const unsigned char *line, /* I - Data to compress */ + int length,/* I - Number of bytes */ + int plane, /* I - Color plane */ + int type, /* I - Type of compression */ + int xstep, /* I - X resolution */ + int ystep) /* I - Y resolution */ +{ + const unsigned char *line_ptr, /* Current byte pointer */ + *line_end, /* End-of-line byte pointer */ + *start; /* Start of compression sequence */ + unsigned char *comp_ptr, /* Pointer into compression buffer */ + temp; /* Current byte */ + int count; /* Count of bytes for output */ + static int ctable[6] = { 0, 2, 1, 4, 18, 17 }; + /* KCMYcm color values */ + + + /* + * Setup pointers... + */ + + line_ptr = line; + line_end = line + length; + + /* + * Do depletion for 720 DPI printing... + */ + + if (ystep == 5) + { + for (comp_ptr = (unsigned char *)line; comp_ptr < line_end;) + { + /* + * Grab the current byte... + */ + + temp = *comp_ptr; + + /* + * Check adjacent bits... + */ + + if ((temp & 0xc0) == 0xc0) + temp &= 0xbf; + if ((temp & 0x60) == 0x60) + temp &= 0xdf; + if ((temp & 0x30) == 0x30) + temp &= 0xef; + if ((temp & 0x18) == 0x18) + temp &= 0xf7; + if ((temp & 0x0c) == 0x0c) + temp &= 0xfb; + if ((temp & 0x06) == 0x06) + temp &= 0xfd; + if ((temp & 0x03) == 0x03) + temp &= 0xfe; + + *comp_ptr++ = temp; + + /* + * Check the last bit in the current byte and the first bit in the + * next byte... + */ + + if ((temp & 0x01) && comp_ptr < line_end && *comp_ptr & 0x80) + *comp_ptr &= 0x7f; + } + } + + switch (type) + { + case 0 : + /* + * Do no compression... + */ + break; + + case 1 : + /* + * Do TIFF pack-bits encoding... + */ + + comp_ptr = CompBuffer; + + while (line_ptr < line_end) + { + if ((line_ptr + 1) >= line_end) + { + /* + * Single byte on the end... + */ + + *comp_ptr++ = 0x00; + *comp_ptr++ = *line_ptr++; + } + else if (line_ptr[0] == line_ptr[1]) + { + /* + * Repeated sequence... + */ + + line_ptr ++; + count = 2; + + while (line_ptr < (line_end - 1) && + line_ptr[0] == line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = 257 - count; + *comp_ptr++ = *line_ptr++; + } + else + { + /* + * Non-repeated sequence... + */ + + start = line_ptr; + line_ptr ++; + count = 1; + + while (line_ptr < (line_end - 1) && + line_ptr[0] != line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = count - 1; + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + break; + } + + putchar(0x0d); /* Move print head to left margin */ + + if (Model < EPSON_ICOLOR) + { + /* + * Do graphics the "old" way... + */ + + if (NumPlanes > 1) + { + /* + * Set the color... + */ + + if (plane > 3) + printf("\033(r%c%c%c%c", 2, 0, 1, ctable[plane] & 15); + /* Set extended color */ + else if (NumPlanes == 3) + printf("\033r%c", ctable[plane + 1]); + /* Set color */ + else + printf("\033r%c", ctable[plane]); /* Set color */ + } + + /* + * Send a raster plane... + */ + + length *= 8; + printf("\033."); /* Raster graphics */ + putchar(type); + putchar(ystep); + putchar(xstep); + putchar(1); + putchar(length); + putchar(length >> 8); + } + else + { + /* + * Do graphics the "new" way... + */ + + printf("\033i"); + putchar(ctable[plane]); + putchar(type); + putchar(1); + putchar(length & 255); + putchar(length >> 8); + putchar(1); + putchar(0); + } + + pwrite(line_ptr, line_end - line_ptr); + fflush(stdout); +} + + +/* + * 'OutputLine()' - Output a line of graphics. + */ + +void +OutputLine( + const cups_page_header2_t *header) /* I - Page header */ +{ + if (header->cupsRowCount) + { + int width; + unsigned char *tempptr, + *evenptr, + *oddptr; + register int x; + unsigned char bit; + const unsigned char *pixel; + unsigned char *temp; + + + /* + * Collect bitmap data in the line buffers and write after each buffer. + */ + + for (x = header->cupsWidth, bit = 128, pixel = Planes[0], + temp = CompBuffer; + x > 0; + x --, temp ++) + { + if (*pixel & bit) + *temp |= DotBit; + + if (bit > 1) + bit >>= 1; + else + { + bit = 128; + pixel ++; + } + } + + if (DotBit > 1) + DotBit >>= 1; + else + { + /* + * Copy the holding buffer to the output buffer, shingling as necessary... + */ + + if (Shingling && LineCount != 0) + { + /* + * Shingle the output... + */ + + if (LineCount & 1) + { + evenptr = LineBuffers[1] + OddOffset; + oddptr = LineBuffers[0] + EvenOffset + DotBytes; + } + else + { + evenptr = LineBuffers[0] + EvenOffset; + oddptr = LineBuffers[1] + OddOffset + DotBytes; + } + + for (width = header->cupsWidth, tempptr = CompBuffer; + width > 0; + width -= 2, tempptr += 2, oddptr += DotBytes * 2, + evenptr += DotBytes * 2) + { + evenptr[0] = tempptr[0]; + oddptr[0] = tempptr[1]; + } + } + else + { + /* + * Don't shingle the output... + */ + + for (width = header->cupsWidth, tempptr = CompBuffer, + evenptr = LineBuffers[0] + EvenOffset; + width > 0; + width --, tempptr ++, evenptr += DotBytes) + *evenptr = tempptr[0]; + } + + if (Shingling && LineCount != 0) + { + EvenOffset ++; + OddOffset ++; + + if (EvenOffset == DotBytes) + { + EvenOffset = 0; + OutputRows(header, 0); + } + + if (OddOffset == DotBytes) + { + OddOffset = 0; + OutputRows(header, 1); + } + } + else + { + EvenOffset ++; + + if (EvenOffset == DotBytes) + { + EvenOffset = 0; + OutputRows(header, 0); + } + } + + DotBit = 128; + LineCount ++; + + memset(CompBuffer, 0, header->cupsWidth); + } + } + else + { + int plane; /* Current plane */ + int bytes; /* Bytes per plane */ + int xstep, ystep; /* X & Y resolutions */ + + + /* + * Write a single line of bitmap data as needed... + */ + + xstep = 3600 / header->HWResolution[0]; + ystep = 3600 / header->HWResolution[1]; + bytes = header->cupsBytesPerLine / NumPlanes; + + for (plane = 0; plane < NumPlanes; plane ++) + { + /* + * Skip blank data... + */ + + if (!Planes[plane][0] && + memcmp(Planes[plane], Planes[plane] + 1, bytes - 1) == 0) + continue; + + /* + * Output whitespace as needed... + */ + + if (Feed > 0) + { + pwrite("\033(v\002\000", 5); /* Relative vertical position */ + putchar(Feed); + putchar(Feed >> 8); + + Feed = 0; + } + + CompressData(Planes[plane], bytes, plane, header->cupsCompression, xstep, + ystep); + } + + Feed ++; + } +} + + +/* + * 'OutputRows()' - Output 8, 24, or 48 rows. + */ + +void +OutputRows( + const cups_page_header2_t *header, /* I - Page image header */ + int row) /* I - Row number (0 or 1) */ +{ + unsigned i, n; /* Looping vars */ + int dot_count, /* Number of bytes to print */ + dot_min; /* Minimum number of bytes */ + unsigned char *dot_ptr, /* Pointer to print data */ + *ptr; /* Current data */ + + + dot_min = DotBytes * DotColumns; + + if (LineBuffers[row][0] != 0 || + memcmp(LineBuffers[row], LineBuffers[row] + 1, + header->cupsWidth * DotBytes - 1)) + { + /* + * Skip leading space... + */ + + i = 0; + dot_count = header->cupsWidth * DotBytes; + dot_ptr = LineBuffers[row]; + + while (dot_count >= dot_min && dot_ptr[0] == 0 && + memcmp(dot_ptr, dot_ptr + 1, dot_min - 1) == 0) + { + i ++; + dot_ptr += dot_min; + dot_count -= dot_min; + } + + /* + * Skip trailing space... + */ + + while (dot_count >= dot_min && dot_ptr[dot_count - dot_min] == 0 && + memcmp(dot_ptr + dot_count - dot_min, + dot_ptr + dot_count - dot_min + 1, dot_min - 1) == 0) + dot_count -= dot_min; + + /* + * Position print head for printing... + */ + + if (i == 0) + putchar('\r'); + else + { + putchar(0x1b); + putchar('$'); + putchar(i & 255); + putchar(i >> 8); + } + + /* + * Start bitmap graphics for this line... + */ + + printf("\033*"); /* Select bit image */ + switch (header->HWResolution[0]) + { + case 60 : /* 60x60/72 DPI gfx */ + putchar(0); + break; + case 120 : /* 120x60/72 DPI gfx */ + putchar(1); + break; + case 180 : /* 180 DPI gfx */ + putchar(39); + break; + case 240 : /* 240x72 DPI gfx */ + putchar(3); + break; + case 360 : /* 360x180/360 DPI gfx */ + if (header->HWResolution[1] == 180) + { + if (Shingling && LineCount != 0) + putchar(40); /* 360x180 fast */ + else + putchar(41); /* 360x180 slow */ + } + else + { + if (Shingling && LineCount != 0) + putchar(72); /* 360x360 fast */ + else + putchar(73); /* 360x360 slow */ + } + break; + } + + n = (unsigned)dot_count / DotBytes; + putchar(n & 255); + putchar(n / 256); + + /* + * Write the graphics data... + */ + + if (header->HWResolution[0] == 120 || + header->HWResolution[0] == 240) + { + /* + * Need to interleave the dots to avoid hosing the print head... + */ + + for (n = dot_count / 2, ptr = dot_ptr; n > 0; n --, ptr += 2) + { + putchar(*ptr); + putchar(0); + } + + /* + * Move the head back and print the odd bytes... + */ + + if (i == 0) + putchar('\r'); + else + { + putchar(0x1b); + putchar('$'); + putchar(i & 255); + putchar(i >> 8); + } + + if (header->HWResolution[0] == 120) + printf("\033*\001"); /* Select bit image */ + else + printf("\033*\003"); /* Select bit image */ + + n = (unsigned)dot_count / DotBytes; + putchar(n & 255); + putchar(n / 256); + + for (n = dot_count / 2, ptr = dot_ptr + 1; n > 0; n --, ptr += 2) + { + putchar(0); + putchar(*ptr); + } + } + else + pwrite(dot_ptr, dot_count); + } + + /* + * Feed the paper... + */ + + putchar('\n'); + + if (Shingling && row == 1) + { + if (header->HWResolution[1] == 360) + printf("\n\n\n\n"); + else + printf("\n"); + } + + fflush(stdout); + + /* + * Clear the buffer... + */ + + memset(LineBuffers[row], 0, header->cupsWidth * DotBytes); +} + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + ppd_file_t *ppd; /* PPD file */ + int page; /* Current page */ + int y; /* Current line */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("%s job-id user title copies options [file]"), + "rastertoepson"); + return (1); + } + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open raster file")); + sleep(1); + return (1); + } + } + else + fd = 0; + + ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* + * Initialize the print device... + */ + + ppd = ppdOpenFile(getenv("PPD")); + if (!ppd) + { + ppd_status_t status; /* PPD error */ + int linenum; /* Line number */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("The PPD file could not be opened.")); + + status = ppdLastError(&linenum); + + fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); + + return (1); + } + + Model = ppd->model_number; + + Setup(); + + /* + * Process pages as needed... + */ + + page = 0; + + while (cupsRasterReadHeader2(ras, &header)) + { + /* + * Write a status message with the page number and number of copies. + */ + + if (Canceled) + break; + + page ++; + + fprintf(stderr, "PAGE: %d %d\n", page, header.NumCopies); + _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), page); + + /* + * Start the page... + */ + + StartPage(ppd, &header); + + /* + * Loop for each line on the page... + */ + + for (y = 0; y < header.cupsHeight; y ++) + { + /* + * Let the user know how far we have progressed... + */ + + if (Canceled) + break; + + if ((y & 127) == 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printing page %d, %d%% complete."), + page, 100 * y / header.cupsHeight); + fprintf(stderr, "ATTR: job-media-progress=%d\n", + 100 * y / header.cupsHeight); + } + + /* + * Read a line of graphics... + */ + + if (cupsRasterReadPixels(ras, Planes[0], header.cupsBytesPerLine) < 1) + break; + + /* + * Write it to the printer... + */ + + OutputLine(&header); + } + + /* + * Eject the page... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), page); + + EndPage(&header); + + if (Canceled) + break; + } + + /* + * Shutdown the printer... + */ + + Shutdown(); + + ppdClose(ppd); + + /* + * Close the raster stream... + */ + + cupsRasterClose(ras); + if (fd != 0) + close(fd); + + /* + * If no pages were printed, send an error message... + */ + + if (page == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); + return (1); + } + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (0); + } +} + + +/* + * End of "$Id: rastertoepson.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/filter/rastertohp.c b/filter/rastertohp.c new file mode 100644 index 0000000..af9583b --- /dev/null +++ b/filter/rastertohp.c @@ -0,0 +1,889 @@ +/* + * "$Id: rastertohp.c 9384 2010-11-22 07:06:39Z mike $" + * + * Hewlett-Packard Page Control Language filter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * Setup() - Prepare the printer for printing. + * StartPage() - Start a page of graphics. + * EndPage() - Finish a page of graphics. + * Shutdown() - Shutdown the printer. + * CancelJob() - Cancel the current job... + * CompressData() - Compress a line of graphics. + * OutputLine() - Output a line of graphics. + * main() - Main entry and processing of driver. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * Globals... + */ + +unsigned char *Planes[4], /* Output buffers */ + *CompBuffer, /* Compression buffer */ + *BitBuffer; /* Buffer for output bits */ +int NumPlanes, /* Number of color planes */ + ColorBits, /* Number of bits per color */ + Feed, /* Number of lines to skip */ + Duplex, /* Current duplex mode */ + Page, /* Current page number */ + Canceled; /* Has the current job been canceled? */ + + +/* + * Prototypes... + */ + +void Setup(void); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); +void EndPage(void); +void Shutdown(void); + +void CancelJob(int sig); +void CompressData(unsigned char *line, int length, int plane, int type); +void OutputLine(cups_page_header2_t *header); + + +/* + * 'Setup()' - Prepare the printer for printing. + */ + +void +Setup(void) +{ + /* + * Send a PCL reset sequence. + */ + + putchar(0x1b); + putchar('E'); +} + + +/* + * 'StartPage()' - Start a page of graphics. + */ + +void +StartPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int plane; /* Looping var */ + + + /* + * Show page device dictionary... + */ + + fprintf(stderr, "DEBUG: StartPage...\n"); + fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); + fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); + fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); + fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); + + fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); + fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); + fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); + fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); + fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); + fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], + header->HWResolution[1]); + fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", + header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], + header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); + fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); + fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); + fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); + fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], + header->Margins[1]); + fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); + fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); + fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); + fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); + fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); + fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); + fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); + fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); + fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], + header->PageSize[1]); + fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); + fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); + fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); + fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); + fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); + fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); + + /* + * Setup printer/job attributes... + */ + + Duplex = header->Duplex; + ColorBits = header->cupsBitsPerColor; + + if ((!Duplex || (Page & 1)) && header->MediaPosition) + printf("\033&l%dH", /* Set media position */ + header->MediaPosition); + + if (Duplex && ppd && ppd->model_number == 2) + { + /* + * Handle duplexing on new DeskJet printers... + */ + + printf("\033&l-2H"); /* Load media */ + + if (Page & 1) + printf("\033&l2S"); /* Set duplex mode */ + } + + if (!Duplex || (Page & 1) || (ppd && ppd->model_number == 2)) + { + /* + * Set the media size... + */ + + printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ + printf("\033&l0O"); /* Set portrait orientation */ + + switch (header->PageSize[1]) + { + case 540 : /* Monarch Envelope */ + printf("\033&l80A"); /* Set page size */ + break; + + case 595 : /* A5 */ + printf("\033&l25A"); /* Set page size */ + break; + + case 624 : /* DL Envelope */ + printf("\033&l90A"); /* Set page size */ + break; + + case 649 : /* C5 Envelope */ + printf("\033&l91A"); /* Set page size */ + break; + + case 684 : /* COM-10 Envelope */ + printf("\033&l81A"); /* Set page size */ + break; + + case 709 : /* B5 Envelope */ + printf("\033&l100A"); /* Set page size */ + break; + + case 756 : /* Executive */ + printf("\033&l1A"); /* Set page size */ + break; + + case 792 : /* Letter */ + printf("\033&l2A"); /* Set page size */ + break; + + case 842 : /* A4 */ + printf("\033&l26A"); /* Set page size */ + break; + + case 1008 : /* Legal */ + printf("\033&l3A"); /* Set page size */ + break; + + case 1191 : /* A3 */ + printf("\033&l27A"); /* Set page size */ + break; + + case 1224 : /* Tabloid */ + printf("\033&l6A"); /* Set page size */ + break; + } + + printf("\033&l%dP", /* Set page length */ + header->PageSize[1] / 12); + printf("\033&l0E"); /* Set top margin to 0 */ + } + + if (!Duplex || (Page & 1)) + { + /* + * Set other job options... + */ + + printf("\033&l%dX", header->NumCopies); /* Set number copies */ + + if (header->cupsMediaType && + (!ppd || ppd->model_number != 2 || header->HWResolution[0] == 600)) + printf("\033&l%dM", /* Set media type */ + header->cupsMediaType); + + if (!ppd || ppd->model_number != 2) + { + int mode = Duplex ? 1 + header->Tumble != 0 : 0; + + printf("\033&l%dS", mode); /* Set duplex mode */ + printf("\033&l0L"); /* Turn off perforation skip */ + } + } + else if (!ppd || ppd->model_number != 2) + printf("\033&a2G"); /* Set back side */ + + /* + * Set graphics mode... + */ + + if (ppd && ppd->model_number == 2) + { + /* + * Figure out the number of color planes... + */ + + if (header->cupsColorSpace == CUPS_CSPACE_KCMY) + NumPlanes = 4; + else + NumPlanes = 1; + + /* + * Set the resolution and top-of-form... + */ + + printf("\033&u%dD", header->HWResolution[0]); + /* Resolution */ + printf("\033&l0e0L"); /* Reset top and don't skip */ + printf("\033*p0Y\033*p0X"); /* Set top of form */ + + /* + * Send 26-byte configure image data command with horizontal and + * vertical resolutions as well as a color count... + */ + + printf("\033*g26W"); + putchar(2); /* Format 2 */ + putchar(NumPlanes); /* Output planes */ + + putchar(header->HWResolution[0] >> 8); /* Black resolution */ + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + putchar(0); + putchar(1 << ColorBits); /* # of black levels */ + + putchar(header->HWResolution[0] >> 8); /* Cyan resolution */ + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + putchar(0); + putchar(1 << ColorBits); /* # of cyan levels */ + + putchar(header->HWResolution[0] >> 8); /* Magenta resolution */ + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + putchar(0); + putchar(1 << ColorBits); /* # of magenta levels */ + + putchar(header->HWResolution[0] >> 8); /* Yellow resolution */ + putchar(header->HWResolution[0]); + putchar(header->HWResolution[1] >> 8); + putchar(header->HWResolution[1]); + putchar(0); + putchar(1 << ColorBits); /* # of yellow levels */ + + printf("\033&l0H"); /* Set media position */ + } + else + { + printf("\033*t%dR", header->HWResolution[0]); + /* Set resolution */ + + if (header->cupsColorSpace == CUPS_CSPACE_KCMY) + { + NumPlanes = 4; + printf("\033*r-4U"); /* Set KCMY graphics */ + } + else if (header->cupsColorSpace == CUPS_CSPACE_CMY) + { + NumPlanes = 3; + printf("\033*r-3U"); /* Set CMY graphics */ + } + else + NumPlanes = 1; /* Black&white graphics */ + + /* + * Set size and position of graphics... + */ + + printf("\033*r%dS", header->cupsWidth); /* Set width */ + printf("\033*r%dT", header->cupsHeight); /* Set height */ + + printf("\033&a0H"); /* Set horizontal position */ + + if (ppd) + printf("\033&a%.0fV", /* Set vertical position */ + 10.0 * (ppd->sizes[0].length - ppd->sizes[0].top)); + else + printf("\033&a0V"); /* Set top-of-page */ + } + + printf("\033*r1A"); /* Start graphics */ + + if (header->cupsCompression) + printf("\033*b%dM", /* Set compression */ + header->cupsCompression); + + Feed = 0; /* No blank lines yet */ + + /* + * Allocate memory for a line of graphics... + */ + + if ((Planes[0] = malloc(header->cupsBytesPerLine)) == NULL) + { + fputs("ERROR: Unable to allocate memory\n", stderr); + exit(1); + } + + for (plane = 1; plane < NumPlanes; plane ++) + Planes[plane] = Planes[0] + plane * header->cupsBytesPerLine / NumPlanes; + + if (ColorBits > 1) + BitBuffer = malloc(ColorBits * ((header->cupsWidth + 7) / 8)); + else + BitBuffer = NULL; + + if (header->cupsCompression) + CompBuffer = malloc(header->cupsBytesPerLine * 2); + else + CompBuffer = NULL; +} + + +/* + * 'EndPage()' - Finish a page of graphics. + */ + +void +EndPage(void) +{ + /* + * Eject the current page... + */ + + if (NumPlanes > 1) + { + printf("\033*rC"); /* End color GFX */ + + if (!(Duplex && (Page & 1))) + printf("\033&l0H"); /* Eject current page */ + } + else + { + printf("\033*r0B"); /* End GFX */ + + if (!(Duplex && (Page & 1))) + printf("\014"); /* Eject current page */ + } + + fflush(stdout); + + /* + * Free memory... + */ + + free(Planes[0]); + + if (BitBuffer) + free(BitBuffer); + + if (CompBuffer) + free(CompBuffer); +} + + +/* + * 'Shutdown()' - Shutdown the printer. + */ + +void +Shutdown(void) +{ + /* + * Send a PCL reset sequence. + */ + + putchar(0x1b); + putchar('E'); +} + + +/* + * 'CancelJob()' - Cancel the current job... + */ + +void +CancelJob(int sig) /* I - Signal */ +{ + (void)sig; + + Canceled = 1; +} + + +/* + * 'CompressData()' - Compress a line of graphics. + */ + +void +CompressData(unsigned char *line, /* I - Data to compress */ + int length, /* I - Number of bytes */ + int plane, /* I - Color plane */ + int type) /* I - Type of compression */ +{ + unsigned char *line_ptr, /* Current byte pointer */ + *line_end, /* End-of-line byte pointer */ + *comp_ptr, /* Pointer into compression buffer */ + *start; /* Start of compression sequence */ + int count; /* Count of bytes for output */ + + + switch (type) + { + default : + /* + * Do no compression... + */ + + line_ptr = line; + line_end = line + length; + break; + + case 1 : + /* + * Do run-length encoding... + */ + + line_end = line + length; + for (line_ptr = line, comp_ptr = CompBuffer; + line_ptr < line_end; + comp_ptr += 2, line_ptr += count) + { + for (count = 1; + (line_ptr + count) < line_end && + line_ptr[0] == line_ptr[count] && + count < 256; + count ++); + + comp_ptr[0] = count - 1; + comp_ptr[1] = line_ptr[0]; + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + break; + + case 2 : + /* + * Do TIFF pack-bits encoding... + */ + + line_ptr = line; + line_end = line + length; + comp_ptr = CompBuffer; + + while (line_ptr < line_end) + { + if ((line_ptr + 1) >= line_end) + { + /* + * Single byte on the end... + */ + + *comp_ptr++ = 0x00; + *comp_ptr++ = *line_ptr++; + } + else if (line_ptr[0] == line_ptr[1]) + { + /* + * Repeated sequence... + */ + + line_ptr ++; + count = 2; + + while (line_ptr < (line_end - 1) && + line_ptr[0] == line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = 257 - count; + *comp_ptr++ = *line_ptr++; + } + else + { + /* + * Non-repeated sequence... + */ + + start = line_ptr; + line_ptr ++; + count = 1; + + while (line_ptr < (line_end - 1) && + line_ptr[0] != line_ptr[1] && + count < 127) + { + line_ptr ++; + count ++; + } + + *comp_ptr++ = count - 1; + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + } + + line_ptr = CompBuffer; + line_end = comp_ptr; + break; + } + + /* + * Set the length of the data and write a raster plane... + */ + + printf("\033*b%d%c", (int)(line_end - line_ptr), plane); + fwrite(line_ptr, line_end - line_ptr, 1, stdout); +} + + +/* + * 'OutputLine()' - Output a line of graphics. + */ + +void +OutputLine(cups_page_header2_t *header) /* I - Page header */ +{ + int plane, /* Current plane */ + bytes, /* Bytes to write */ + count; /* Bytes to convert */ + unsigned char bit, /* Current plane data */ + bit0, /* Current low bit data */ + bit1, /* Current high bit data */ + *plane_ptr, /* Pointer into Planes */ + *bit_ptr; /* Pointer into BitBuffer */ + + + /* + * Output whitespace as needed... + */ + + if (Feed > 0) + { + printf("\033*b%dY", Feed); + Feed = 0; + } + + /* + * Write bitmap data as needed... + */ + + bytes = (header->cupsWidth + 7) / 8; + + for (plane = 0; plane < NumPlanes; plane ++) + if (ColorBits == 1) + { + /* + * Send bits as-is... + */ + + CompressData(Planes[plane], bytes, plane < (NumPlanes - 1) ? 'V' : 'W', + header->cupsCompression); + } + else + { + /* + * Separate low and high bit data into separate buffers. + */ + + for (count = header->cupsBytesPerLine / NumPlanes, + plane_ptr = Planes[plane], bit_ptr = BitBuffer; + count > 0; + count -= 2, plane_ptr += 2, bit_ptr ++) + { + bit = plane_ptr[0]; + + bit0 = ((bit & 64) << 1) | ((bit & 16) << 2) | ((bit & 4) << 3) | ((bit & 1) << 4); + bit1 = (bit & 128) | ((bit & 32) << 1) | ((bit & 8) << 2) | ((bit & 2) << 3); + + if (count > 1) + { + bit = plane_ptr[1]; + + bit0 |= (bit & 1) | ((bit & 4) >> 1) | ((bit & 16) >> 2) | ((bit & 64) >> 3); + bit1 |= ((bit & 2) >> 1) | ((bit & 8) >> 2) | ((bit & 32) >> 3) | ((bit & 128) >> 4); + } + + bit_ptr[0] = bit0; + bit_ptr[bytes] = bit1; + } + + /* + * Send low and high bits... + */ + + CompressData(BitBuffer, bytes, 'V', header->cupsCompression); + CompressData(BitBuffer + bytes, bytes, plane < (NumPlanes - 1) ? 'V' : 'W', + header->cupsCompression); + } + + fflush(stdout); +} + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("%s job-id user title copies options [file]"), + "rastertohp"); + return (1); + } + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open raster file")); + sleep(1); + return (1); + } + } + else + fd = 0; + + ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* + * Initialize the print device... + */ + + ppd = ppdOpenFile(getenv("PPD")); + if (!ppd) + { + ppd_status_t status; /* PPD error */ + int linenum; /* Line number */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("The PPD file could not be opened.")); + + status = ppdLastError(&linenum); + + fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); + + return (1); + } + + Setup(); + + /* + * Process pages as needed... + */ + + Page = 0; + + while (cupsRasterReadHeader2(ras, &header)) + { + /* + * Write a status message with the page number and number of copies. + */ + + if (Canceled) + break; + + Page ++; + + fprintf(stderr, "PAGE: %d %d\n", Page, header.NumCopies); + _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); + + /* + * Start the page... + */ + + StartPage(ppd, &header); + + /* + * Loop for each line on the page... + */ + + for (y = 0; y < header.cupsHeight; y ++) + { + /* + * Let the user know how far we have progressed... + */ + + if (Canceled) + break; + + if ((y & 127) == 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printing page %d, %d%% complete."), + Page, 100 * y / header.cupsHeight); + fprintf(stderr, "ATTR: job-media-progress=%d\n", + 100 * y / header.cupsHeight); + } + + /* + * Read a line of graphics... + */ + + if (cupsRasterReadPixels(ras, Planes[0], header.cupsBytesPerLine) < 1) + break; + + /* + * See if the line is blank; if not, write it to the printer... + */ + + if (Planes[0][0] || + memcmp(Planes[0], Planes[0] + 1, header.cupsBytesPerLine - 1)) + OutputLine(&header); + else + Feed ++; + } + + /* + * Eject the page... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); + + EndPage(); + + if (Canceled) + break; + } + + /* + * Shutdown the printer... + */ + + Shutdown(); + + if (ppd) + ppdClose(ppd); + + /* + * Close the raster stream... + */ + + cupsRasterClose(ras); + if (fd != 0) + close(fd); + + /* + * If no pages were printed, send an error message... + */ + + if (Page == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); + return (1); + } + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (0); + } +} + + +/* + * End of "$Id: rastertohp.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/filter/rastertolabel.c b/filter/rastertolabel.c new file mode 100644 index 0000000..e413d7d --- /dev/null +++ b/filter/rastertolabel.c @@ -0,0 +1,1315 @@ +/* + * "$Id: rastertolabel.c 9774 2011-05-12 06:15:14Z mike $" + * + * Label printer filter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2001-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * Setup() - Prepare the printer for printing. + * StartPage() - Start a page of graphics. + * EndPage() - Finish a page of graphics. + * CancelJob() - Cancel the current job... + * OutputLine() - Output a line of graphics. + * PCLCompress() - Output a PCL (mode 3) compressed line. + * ZPLCompress() - Output a run-length compression sequence. + * main() - Main entry and processing of driver. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include + + +/* + * This driver filter currently supports Dymo, Intellitech, and Zebra + * label printers. + * + * The Dymo portion of the driver has been tested with the 300, 330, + * and 330 Turbo label printers; it may also work with other models. + * The Dymo printers support printing at 136, 203, and 300 DPI. + * + * The Intellitech portion of the driver has been tested with the + * Intellibar 408, 412, and 808 and supports their PCL variant. + * + * The Zebra portion of the driver has been tested with the LP-2844, + * LP-2844Z, QL-320, and QL-420 label printers; it may also work with + * other models. The driver supports EPL line mode, EPL page mode, + * ZPL, and CPCL as defined in Zebra's online developer documentation. + */ + +/* + * Model number constants... + */ + +#define DYMO_3x0 0 /* Dymo Labelwriter 300/330/330 Turbo */ + +#define ZEBRA_EPL_LINE 0x10 /* Zebra EPL line mode printers */ +#define ZEBRA_EPL_PAGE 0x11 /* Zebra EPL page mode printers */ +#define ZEBRA_ZPL 0x12 /* Zebra ZPL-based printers */ +#define ZEBRA_CPCL 0x13 /* Zebra CPCL-based printers */ + +#define INTELLITECH_PCL 0x20 /* Intellitech PCL-based printers */ + + +/* + * Globals... + */ + +unsigned char *Buffer; /* Output buffer */ +unsigned char *CompBuffer; /* Compression buffer */ +unsigned char *LastBuffer; /* Last buffer */ +int LastSet; /* Number of repeat characters */ +int ModelNumber, /* cupsModelNumber attribute */ + Page, /* Current page */ + Feed, /* Number of lines to skip */ + Canceled; /* Non-zero if job is canceled */ + + +/* + * Prototypes... + */ + +void Setup(ppd_file_t *ppd); +void StartPage(ppd_file_t *ppd, cups_page_header2_t *header); +void EndPage(ppd_file_t *ppd, cups_page_header2_t *header); +void CancelJob(int sig); +void OutputLine(ppd_file_t *ppd, cups_page_header2_t *header, int y); +void PCLCompress(unsigned char *line, int length); +void ZPLCompress(char repeat_char, int repeat_count); + + +/* + * 'Setup()' - Prepare the printer for printing. + */ + +void +Setup(ppd_file_t *ppd) /* I - PPD file */ +{ + int i; /* Looping var */ + + + /* + * Get the model number from the PPD file... + */ + + if (ppd) + ModelNumber = ppd->model_number; + + /* + * Initialize based on the model number... + */ + + switch (ModelNumber) + { + case DYMO_3x0 : + /* + * Clear any remaining data... + */ + + for (i = 0; i < 100; i ++) + putchar(0x1b); + + /* + * Reset the printer... + */ + + fputs("\033@", stdout); + break; + + case ZEBRA_EPL_LINE : + break; + + case ZEBRA_EPL_PAGE : + break; + + case ZEBRA_ZPL : + break; + + case ZEBRA_CPCL : + break; + + case INTELLITECH_PCL : + /* + * Send a PCL reset sequence. + */ + + putchar(0x1b); + putchar('E'); + break; + } +} + + +/* + * 'StartPage()' - Start a page of graphics. + */ + +void +StartPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + ppd_choice_t *choice; /* Marked choice */ + int length; /* Actual label length */ + + + /* + * Show page device dictionary... + */ + + fprintf(stderr, "DEBUG: StartPage...\n"); + fprintf(stderr, "DEBUG: MediaClass = \"%s\"\n", header->MediaClass); + fprintf(stderr, "DEBUG: MediaColor = \"%s\"\n", header->MediaColor); + fprintf(stderr, "DEBUG: MediaType = \"%s\"\n", header->MediaType); + fprintf(stderr, "DEBUG: OutputType = \"%s\"\n", header->OutputType); + + fprintf(stderr, "DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance); + fprintf(stderr, "DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia); + fprintf(stderr, "DEBUG: Collate = %d\n", header->Collate); + fprintf(stderr, "DEBUG: CutMedia = %d\n", header->CutMedia); + fprintf(stderr, "DEBUG: Duplex = %d\n", header->Duplex); + fprintf(stderr, "DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], + header->HWResolution[1]); + fprintf(stderr, "DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n", + header->ImagingBoundingBox[0], header->ImagingBoundingBox[1], + header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]); + fprintf(stderr, "DEBUG: InsertSheet = %d\n", header->InsertSheet); + fprintf(stderr, "DEBUG: Jog = %d\n", header->Jog); + fprintf(stderr, "DEBUG: LeadingEdge = %d\n", header->LeadingEdge); + fprintf(stderr, "DEBUG: Margins = [ %d %d ]\n", header->Margins[0], + header->Margins[1]); + fprintf(stderr, "DEBUG: ManualFeed = %d\n", header->ManualFeed); + fprintf(stderr, "DEBUG: MediaPosition = %d\n", header->MediaPosition); + fprintf(stderr, "DEBUG: MediaWeight = %d\n", header->MediaWeight); + fprintf(stderr, "DEBUG: MirrorPrint = %d\n", header->MirrorPrint); + fprintf(stderr, "DEBUG: NegativePrint = %d\n", header->NegativePrint); + fprintf(stderr, "DEBUG: NumCopies = %d\n", header->NumCopies); + fprintf(stderr, "DEBUG: Orientation = %d\n", header->Orientation); + fprintf(stderr, "DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp); + fprintf(stderr, "DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], + header->PageSize[1]); + fprintf(stderr, "DEBUG: Separations = %d\n", header->Separations); + fprintf(stderr, "DEBUG: TraySwitch = %d\n", header->TraySwitch); + fprintf(stderr, "DEBUG: Tumble = %d\n", header->Tumble); + fprintf(stderr, "DEBUG: cupsWidth = %d\n", header->cupsWidth); + fprintf(stderr, "DEBUG: cupsHeight = %d\n", header->cupsHeight); + fprintf(stderr, "DEBUG: cupsMediaType = %d\n", header->cupsMediaType); + fprintf(stderr, "DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor); + fprintf(stderr, "DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel); + fprintf(stderr, "DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine); + fprintf(stderr, "DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder); + fprintf(stderr, "DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace); + fprintf(stderr, "DEBUG: cupsCompression = %d\n", header->cupsCompression); + fprintf(stderr, "DEBUG: cupsRowCount = %d\n", header->cupsRowCount); + fprintf(stderr, "DEBUG: cupsRowFeed = %d\n", header->cupsRowFeed); + fprintf(stderr, "DEBUG: cupsRowStep = %d\n", header->cupsRowStep); + + switch (ModelNumber) + { + case DYMO_3x0 : + /* + * Setup printer/job attributes... + */ + + length = header->PageSize[1] * header->HWResolution[1] / 72; + + printf("\033L%c%c", length >> 8, length); + printf("\033D%c", header->cupsBytesPerLine); + + printf("\033%c", header->cupsCompression + 'c'); /* Darkness */ + break; + + case ZEBRA_EPL_LINE : + /* + * Set print rate... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && + strcmp(choice->choice, "Default")) + printf("\033S%.0f", atof(choice->choice) * 2.0 - 2.0); + + /* + * Set darkness... + */ + + if (header->cupsCompression > 0 && header->cupsCompression <= 100) + printf("\033D%d", 7 * header->cupsCompression / 100); + + /* + * Set left margin to 0... + */ + + fputs("\033M01", stdout); + + /* + * Start buffered output... + */ + + fputs("\033B", stdout); + break; + + case ZEBRA_EPL_PAGE : + /* + * Start a new label... + */ + + puts(""); + puts("N"); + + /* + * Set hardware options... + */ + + if (!strcmp(header->MediaType, "Direct")) + puts("OD"); + + /* + * Set print rate... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && + strcmp(choice->choice, "Default")) + { + float val = atof(choice->choice); + + if (val >= 3.0) + printf("S%.0f\n", val); + else + printf("S%.0f\n", val * 2.0 - 2.0); + } + + /* + * Set darkness... + */ + + if (header->cupsCompression > 0 && header->cupsCompression <= 100) + printf("D%d\n", 15 * header->cupsCompression / 100); + + /* + * Set label size... + */ + + printf("q%d\n", (header->cupsWidth + 7) & ~7); + break; + + case ZEBRA_ZPL : + /* + * Set darkness... + */ + + if (header->cupsCompression > 0 && header->cupsCompression <= 100) + printf("~SD%02d\n", 30 * header->cupsCompression / 100); + + /* + * Start bitmap graphics... + */ + + printf("~DGR:CUPS.GRF,%d,%d,\n", + header->cupsHeight * header->cupsBytesPerLine, + header->cupsBytesPerLine); + + /* + * Allocate compression buffers... + */ + + CompBuffer = malloc(2 * header->cupsBytesPerLine + 1); + LastBuffer = malloc(header->cupsBytesPerLine); + LastSet = 0; + break; + + case ZEBRA_CPCL : + /* + * Start label... + */ + + printf("! 0 %u %u %u %u\r\n", header->HWResolution[0], + header->HWResolution[1], header->cupsHeight, + header->NumCopies); + printf("PAGE-WIDTH %d\r\n", header->cupsWidth); + printf("PAGE-HEIGHT %d\r\n", header->cupsWidth); + break; + + case INTELLITECH_PCL : + /* + * Set the media size... + */ + + printf("\033&l6D\033&k12H"); /* Set 6 LPI, 10 CPI */ + printf("\033&l0O"); /* Set portrait orientation */ + + switch (header->PageSize[1]) + { + case 540 : /* Monarch Envelope */ + printf("\033&l80A"); /* Set page size */ + break; + + case 624 : /* DL Envelope */ + printf("\033&l90A"); /* Set page size */ + break; + + case 649 : /* C5 Envelope */ + printf("\033&l91A"); /* Set page size */ + break; + + case 684 : /* COM-10 Envelope */ + printf("\033&l81A"); /* Set page size */ + break; + + case 756 : /* Executive */ + printf("\033&l1A"); /* Set page size */ + break; + + case 792 : /* Letter */ + printf("\033&l2A"); /* Set page size */ + break; + + case 842 : /* A4 */ + printf("\033&l26A"); /* Set page size */ + break; + + case 1008 : /* Legal */ + printf("\033&l3A"); /* Set page size */ + break; + + default : /* Custom size */ + printf("\033!f%dZ", header->PageSize[1] * 300 / 72); + break; + } + + printf("\033&l%dP", /* Set page length */ + header->PageSize[1] / 12); + printf("\033&l0E"); /* Set top margin to 0 */ + printf("\033&l%dX", header->NumCopies); + /* Set number copies */ + printf("\033&l0L"); /* Turn off perforation skip */ + + /* + * Print settings... + */ + + if (Page == 1) + { + if (header->cupsRowFeed) /* inPrintRate */ + printf("\033!p%dS", header->cupsRowFeed); + + if (header->cupsCompression != ~0) + /* inPrintDensity */ + printf("\033&d%dA", 30 * header->cupsCompression / 100 - 15); + + if ((choice = ppdFindMarkedChoice(ppd, "inPrintMode")) != NULL) + { + if (!strcmp(choice->choice, "Standard")) + fputs("\033!p0M", stdout); + else if (!strcmp(choice->choice, "Tear")) + { + fputs("\033!p1M", stdout); + + if (header->cupsRowCount) /* inTearInterval */ + printf("\033!n%dT", header->cupsRowCount); + } + else + { + fputs("\033!p2M", stdout); + + if (header->cupsRowStep) /* inCutInterval */ + printf("\033!n%dC", header->cupsRowStep); + } + } + } + + /* + * Setup graphics... + */ + + printf("\033*t%dR", header->HWResolution[0]); + /* Set resolution */ + + printf("\033*r%dS", header->cupsWidth); + /* Set width */ + printf("\033*r%dT", header->cupsHeight); + /* Set height */ + + printf("\033&a0H"); /* Set horizontal position */ + printf("\033&a0V"); /* Set vertical position */ + printf("\033*r1A"); /* Start graphics */ + printf("\033*b3M"); /* Set compression */ + + /* + * Allocate compression buffers... + */ + + CompBuffer = malloc(2 * header->cupsBytesPerLine + 1); + LastBuffer = malloc(header->cupsBytesPerLine); + LastSet = 0; + break; + } + + /* + * Allocate memory for a line of graphics... + */ + + Buffer = malloc(header->cupsBytesPerLine); + Feed = 0; +} + + +/* + * 'EndPage()' - Finish a page of graphics. + */ + +void +EndPage(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header) /* I - Page header */ +{ + int val; /* Option value */ + ppd_choice_t *choice; /* Marked choice */ + + + switch (ModelNumber) + { + case DYMO_3x0 : + /* + * Eject the current page... + */ + + fputs("\033E", stdout); + break; + + case ZEBRA_EPL_LINE : + /* + * End buffered output, eject the label... + */ + + fputs("\033E\014", stdout); + break; + + case ZEBRA_EPL_PAGE : + /* + * Print the label... + */ + + puts("P1"); + break; + + case ZEBRA_ZPL : + if (Canceled) + { + /* + * Cancel bitmap download... + */ + + puts("~DN"); + break; + } + + /* + * Start label... + */ + + puts("^XA"); + + /* + * Set print rate... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && + strcmp(choice->choice, "Default")) + { + val = atoi(choice->choice); + printf("^PR%d,%d,%d\n", val, val, val); + } + + /* + * Put label home in default position (0,0)... + */ + + printf("^LH0,0\n"); + + /* + * Set media tracking... + */ + + if (ppdIsMarked(ppd, "zeMediaTracking", "Continuous")) + { + /* + * Add label length command for continuous... + */ + + printf("^LL%d\n", header->cupsHeight); + printf("^MNN\n"); + } + else if (ppdIsMarked(ppd, "zeMediaTracking", "Web")) + printf("^MNY\n"); + else if (ppdIsMarked(ppd, "zeMediaTracking", "Mark")) + printf("^MNM\n"); + + /* + * Set label top + */ + + if (header->cupsRowStep != 200) + printf("^LT%u\n", header->cupsRowStep); + + /* + * Set media type... + */ + + if (!strcmp(header->MediaType, "Thermal")) + printf("^MTT\n"); + else if (!strcmp(header->MediaType, "Direct")) + printf("^MTD\n"); + + /* + * Set print mode... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zePrintMode")) != NULL && + strcmp(choice->choice, "Saved")) + { + printf("^MM"); + + if (!strcmp(choice->choice, "Tear")) + printf("T,Y\n"); + else if (!strcmp(choice->choice, "Peel")) + printf("P,Y\n"); + else if (!strcmp(choice->choice, "Rewind")) + printf("R,Y\n"); + else if (!strcmp(choice->choice, "Applicator")) + printf("A,Y\n"); + else + printf("C,Y\n"); + } + + /* + * Set tear-off adjust position... + */ + + if (header->AdvanceDistance != 1000) + { + if ((int)header->AdvanceDistance < 0) + printf("~TA%04d\n", (int)header->AdvanceDistance); + else + printf("~TA%03d\n", (int)header->AdvanceDistance); + } + + /* + * Allow for reprinting after an error... + */ + + if (ppdIsMarked(ppd, "zeErrorReprint", "Always")) + printf("^JZY\n"); + else if (ppdIsMarked(ppd, "zeErrorReprint", "Never")) + printf("^JZN\n"); + + /* + * Print multiple copies + */ + + if (header->NumCopies > 1) + printf("^PQ%d, 0, 0, N\n", header->NumCopies); + + /* + * Display the label image... + */ + + puts("^FO0,0^XGR:CUPS.GRF,1,1^FS"); + + /* + * End the label and eject... + */ + + puts("^IDR:CUPS.GRF^FS"); + puts("^XZ"); + + /* + * Free compression buffers... + */ + + free(CompBuffer); + free(LastBuffer); + break; + + case ZEBRA_CPCL : + /* + * Set tear-off adjust position... + */ + + if (header->AdvanceDistance != 1000) + printf("PRESENT-AT %d 1\r\n", (int)header->AdvanceDistance); + + /* + * Allow for reprinting after an error... + */ + + if (ppdIsMarked(ppd, "zeErrorReprint", "Always")) + puts("ON-OUT-OF-PAPER WAIT\r"); + else if (ppdIsMarked(ppd, "zeErrorReprint", "Never")) + puts("ON-OUT-OF-PAPER PURGE\r"); + + /* + * Cut label? + */ + + if (header->CutMedia) + puts("CUT\r"); + + /* + * Set darkness... + */ + + if (header->cupsCompression > 0) + printf("TONE %u\r\n", 2 * header->cupsCompression); + + /* + * Set print rate... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zePrintRate")) != NULL && + strcmp(choice->choice, "Default")) + { + val = atoi(choice->choice); + printf("SPEED %d\r\n", val); + } + + /* + * Print the label... + */ + + if ((choice = ppdFindMarkedChoice(ppd, "zeMediaTracking")) == NULL || + strcmp(choice->choice, "Continuous")) + puts("FORM\r"); + + puts("PRINT\r"); + break; + + case INTELLITECH_PCL : + printf("\033*rB"); /* End GFX */ + printf("\014"); /* Eject current page */ + break; + } + + fflush(stdout); + + /* + * Free memory... + */ + + free(Buffer); +} + + +/* + * 'CancelJob()' - Cancel the current job... + */ + +void +CancelJob(int sig) /* I - Signal */ +{ + /* + * Tell the main loop to stop... + */ + + (void)sig; + + Canceled = 1; +} + + +/* + * 'OutputLine()' - Output a line of graphics... + */ + +void +OutputLine(ppd_file_t *ppd, /* I - PPD file */ + cups_page_header2_t *header, /* I - Page header */ + int y) /* I - Line number */ +{ + int i; /* Looping var */ + unsigned char *ptr; /* Pointer into buffer */ + unsigned char *compptr; /* Pointer into compression buffer */ + char repeat_char; /* Repeated character */ + int repeat_count; /* Number of repeated characters */ + static const char *hex = "0123456789ABCDEF"; + /* Hex digits */ + + + switch (ModelNumber) + { + case DYMO_3x0 : + /* + * See if the line is blank; if not, write it to the printer... + */ + + if (Buffer[0] || + memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine - 1)) + { + if (Feed) + { + while (Feed > 255) + { + printf("\033f\001%c", 255); + Feed -= 255; + } + + printf("\033f\001%c", Feed); + Feed = 0; + } + + putchar(0x16); + fwrite(Buffer, header->cupsBytesPerLine, 1, stdout); + fflush(stdout); + +#ifdef __sgi + /* + * This hack works around a bug in the IRIX serial port driver when + * run at high baud rates (e.g. 115200 baud)... This results in + * slightly slower label printing, but at least the labels come + * out properly. + */ + + sginap(1); +#endif /* __sgi */ + } + else + Feed ++; + break; + + case ZEBRA_EPL_LINE : + printf("\033g%03d", header->cupsBytesPerLine); + fwrite(Buffer, 1, header->cupsBytesPerLine, stdout); + fflush(stdout); + break; + + case ZEBRA_EPL_PAGE : + if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine)) + { + printf("GW0,%d,%d,1\n", y, header->cupsBytesPerLine); + for (i = header->cupsBytesPerLine, ptr = Buffer; i > 0; i --, ptr ++) + putchar(~*ptr); + putchar('\n'); + fflush(stdout); + } + break; + + case ZEBRA_ZPL : + /* + * Determine if this row is the same as the previous line. + * If so, output a ':' and return... + */ + + if (LastSet) + { + if (!memcmp(Buffer, LastBuffer, header->cupsBytesPerLine)) + { + putchar(':'); + return; + } + } + + /* + * Convert the line to hex digits... + */ + + for (ptr = Buffer, compptr = CompBuffer, i = header->cupsBytesPerLine; + i > 0; + i --, ptr ++) + { + *compptr++ = hex[*ptr >> 4]; + *compptr++ = hex[*ptr & 15]; + } + + *compptr = '\0'; + + /* + * Run-length compress the graphics... + */ + + for (compptr = CompBuffer + 1, repeat_char = CompBuffer[0], repeat_count = 1; + *compptr; + compptr ++) + if (*compptr == repeat_char) + repeat_count ++; + else + { + ZPLCompress(repeat_char, repeat_count); + repeat_char = *compptr; + repeat_count = 1; + } + + if (repeat_char == '0') + { + /* + * Handle 0's on the end of the line... + */ + + if (repeat_count & 1) + { + repeat_count --; + putchar('0'); + } + + if (repeat_count > 0) + putchar(','); + } + else + ZPLCompress(repeat_char, repeat_count); + + fflush(stdout); + + /* + * Save this line for the next round... + */ + + memcpy(LastBuffer, Buffer, header->cupsBytesPerLine); + LastSet = 1; + break; + + case ZEBRA_CPCL : + if (Buffer[0] || memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine)) + { + printf("CG %u 1 0 %d ", header->cupsBytesPerLine, y); + fwrite(Buffer, 1, header->cupsBytesPerLine, stdout); + puts("\r"); + fflush(stdout); + } + break; + + case INTELLITECH_PCL : + if (Buffer[0] || + memcmp(Buffer, Buffer + 1, header->cupsBytesPerLine - 1)) + { + if (Feed) + { + printf("\033*b%dY", Feed); + Feed = 0; + LastSet = 0; + } + + PCLCompress(Buffer, header->cupsBytesPerLine); + } + else + Feed ++; + break; + } +} + + +/* + * 'PCLCompress()' - Output a PCL (mode 3) compressed line. + */ + +void +PCLCompress(unsigned char *line, /* I - Line to compress */ + int length) /* I - Length of line */ +{ + unsigned char *line_ptr, /* Current byte pointer */ + *line_end, /* End-of-line byte pointer */ + *comp_ptr, /* Pointer into compression buffer */ + *start, /* Start of compression sequence */ + *seed; /* Seed buffer pointer */ + int count, /* Count of bytes for output */ + offset; /* Offset of bytes for output */ + + + /* + * Do delta-row compression... + */ + + line_ptr = line; + line_end = line + length; + + comp_ptr = CompBuffer; + seed = LastBuffer; + + while (line_ptr < line_end) + { + /* + * Find the next non-matching sequence... + */ + + start = line_ptr; + + if (!LastSet) + { + /* + * The seed buffer is invalid, so do the next 8 bytes, max... + */ + + offset = 0; + + if ((count = line_end - line_ptr) > 8) + count = 8; + + line_ptr += count; + } + else + { + /* + * The seed buffer is valid, so compare against it... + */ + + while (*line_ptr == *seed && + line_ptr < line_end) + { + line_ptr ++; + seed ++; + } + + if (line_ptr == line_end) + break; + + offset = line_ptr - start; + + /* + * Find up to 8 non-matching bytes... + */ + + start = line_ptr; + count = 0; + while (*line_ptr != *seed && + line_ptr < line_end && + count < 8) + { + line_ptr ++; + seed ++; + count ++; + } + } + + /* + * Place mode 3 compression data in the buffer; see HP manuals + * for details... + */ + + if (offset >= 31) + { + /* + * Output multi-byte offset... + */ + + *comp_ptr++ = ((count - 1) << 5) | 31; + + offset -= 31; + while (offset >= 255) + { + *comp_ptr++ = 255; + offset -= 255; + } + + *comp_ptr++ = offset; + } + else + { + /* + * Output single-byte offset... + */ + + *comp_ptr++ = ((count - 1) << 5) | offset; + } + + memcpy(comp_ptr, start, count); + comp_ptr += count; + } + + /* + * Set the length of the data and write it... + */ + + printf("\033*b%dW", (int)(comp_ptr - CompBuffer)); + fwrite(CompBuffer, comp_ptr - CompBuffer, 1, stdout); + + /* + * Save this line as a "seed" buffer for the next... + */ + + memcpy(LastBuffer, line, length); + LastSet = 1; +} + + +/* + * 'ZPLCompress()' - Output a run-length compression sequence. + */ + +void +ZPLCompress(char repeat_char, /* I - Character to repeat */ + int repeat_count) /* I - Number of repeated characters */ +{ + if (repeat_count > 1) + { + /* + * Print as many z's as possible - they are the largest denomination + * representing 400 characters (zC stands for 400 adjacent C's) + */ + + while (repeat_count >= 400) + { + putchar('z'); + repeat_count -= 400; + } + + /* + * Then print 'g' through 'y' as multiples of 20 characters... + */ + + if (repeat_count >= 20) + { + putchar('f' + repeat_count / 20); + repeat_count %= 20; + } + + /* + * Finally, print 'G' through 'Y' as 1 through 19 characters... + */ + + if (repeat_count > 0) + putchar('F' + repeat_count); + } + + /* + * Then the character to be repeated... + */ + + putchar(repeat_char); +} + + +/* + * 'main()' - Main entry and processing of driver. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream for printing */ + cups_page_header2_t header; /* Page header from file */ + int y; /* Current line */ + ppd_file_t *ppd; /* PPD file */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + /* + * We don't have the correct number of arguments; write an error message + * and return. + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("%s job-id user title copies options [file]"), + "rastertolabel"); + return (1); + } + + /* + * Open the page stream... + */ + + if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to open raster file")); + sleep(1); + return (1); + } + } + else + fd = 0; + + ras = cupsRasterOpen(fd, CUPS_RASTER_READ); + + /* + * Register a signal handler to eject the current page if the + * job is cancelled. + */ + + Canceled = 0; + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGTERM, CancelJob); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = CancelJob; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGTERM, CancelJob); +#endif /* HAVE_SIGSET */ + + /* + * Open the PPD file and apply options... + */ + + num_options = cupsParseOptions(argv[5], 0, &options); + + ppd = ppdOpenFile(getenv("PPD")); + if (!ppd) + { + ppd_status_t status; /* PPD error */ + int linenum; /* Line number */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("The PPD file could not be opened.")); + + status = ppdLastError(&linenum); + + fprintf(stderr, "DEBUG: %s on line %d.\n", ppdErrorString(status), linenum); + + return (1); + } + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + /* + * Initialize the print device... + */ + + Setup(ppd); + + /* + * Process pages as needed... + */ + + Page = 0; + + while (cupsRasterReadHeader2(ras, &header)) + { + /* + * Write a status message with the page number and number of copies. + */ + + if (Canceled) + break; + + Page ++; + + fprintf(stderr, "PAGE: %d 1\n", Page); + _cupsLangPrintFilter(stderr, "INFO", _("Starting page %d."), Page); + + /* + * Start the page... + */ + + StartPage(ppd, &header); + + /* + * Loop for each line on the page... + */ + + for (y = 0; y < header.cupsHeight && !Canceled; y ++) + { + /* + * Let the user know how far we have progressed... + */ + + if (Canceled) + break; + + if ((y & 15) == 0) + { + _cupsLangPrintFilter(stderr, "INFO", + _("Printing page %d, %d%% complete."), + Page, 100 * y / header.cupsHeight); + fprintf(stderr, "ATTR: job-media-progress=%d\n", + 100 * y / header.cupsHeight); + } + + /* + * Read a line of graphics... + */ + + if (cupsRasterReadPixels(ras, Buffer, header.cupsBytesPerLine) < 1) + break; + + /* + * Write it to the printer... + */ + + OutputLine(ppd, &header, y); + } + + /* + * Eject the page... + */ + + _cupsLangPrintFilter(stderr, "INFO", _("Finished page %d."), Page); + + EndPage(ppd, &header); + + if (Canceled) + break; + } + + /* + * Close the raster stream... + */ + + cupsRasterClose(ras); + if (fd != 0) + close(fd); + + /* + * Close the PPD file and free the options... + */ + + ppdClose(ppd); + cupsFreeOptions(num_options, options); + + /* + * If no pages were printed, send an error message... + */ + + if (Page == 0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("No pages were found.")); + return (1); + } + else + { + _cupsLangPrintFilter(stderr, "INFO", _("Ready to print.")); + return (0); + } +} + + +/* + * End of "$Id: rastertolabel.c 9774 2011-05-12 06:15:14Z mike $". + */ diff --git a/filter/rastertopwg.c b/filter/rastertopwg.c new file mode 100644 index 0000000..d4d67cd --- /dev/null +++ b/filter/rastertopwg.c @@ -0,0 +1,461 @@ +/* + * "$Id: rastertopwg.c 10006 2011-09-20 18:36:33Z mike $" + * + * CUPS raster to PWG raster format filter for CUPS. + * + * Copyright 2011 Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright law. + * Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry for filter. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include + + +/* + * 'main()' - Main entry for filter. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int fd; /* Raster file */ + cups_raster_t *inras, /* Input raster stream */ + *outras; /* Output raster stream */ + cups_page_header2_t inheader, /* Input raster page header */ + outheader; /* Output raster page header */ + int y; /* Current line */ + unsigned char *line; /* Line buffer */ + int page = 0, /* Current page */ + page_width, /* Actual page width */ + page_height, /* Actual page height */ + page_top, /* Top margin */ + page_bottom, /* Bottom margin */ + page_left, /* Left margin */ + linesize, /* Bytes per line */ + lineoffset; /* Offset into line */ + unsigned char white; /* White pixel */ + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *back; /* cupsBackSize attribute */ + _ppd_cache_t *cache; /* PPD cache */ + _pwg_size_t *pwg_size; /* PWG media size */ + _pwg_media_t *pwg_media; /* PWG media name */ + int num_options; /* Number of options */ + cups_option_t *options = NULL;/* Options */ + const char *val; /* Option value */ + + + if (argc < 6 || argc > 7) + { + puts("Usage: rastertopwg job user title copies options [filename]"); + return (1); + } + else if (argc == 7) + { + if ((fd = open(argv[6], O_RDONLY)) < 0) + { + perror("ERROR: Unable to open print file"); + return (1); + } + } + else + fd = 0; + + inras = cupsRasterOpen(fd, CUPS_RASTER_READ); + outras = cupsRasterOpen(1, CUPS_RASTER_WRITE_PWG); + + ppd = ppdOpenFile(getenv("PPD")); + back = ppdFindAttr(ppd, "cupsBackSide", NULL); + + num_options = cupsParseOptions(argv[5], 0, &options); + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + cache = ppd ? ppd->cache : NULL; + + while (cupsRasterReadHeader2(inras, &inheader)) + { + /* + * Compute the real raster size... + */ + + page ++; + + fprintf(stderr, "PAGE: %d %d\n", page, inheader.NumCopies); + + page_width = (int)(inheader.cupsPageSize[0] * inheader.HWResolution[0] / + 72.0); + page_height = (int)(inheader.cupsPageSize[1] * inheader.HWResolution[1] / + 72.0); + page_left = (int)(inheader.cupsImagingBBox[0] * + inheader.HWResolution[0] / 72.0); + page_bottom = (int)(inheader.cupsImagingBBox[1] * + inheader.HWResolution[1] / 72.0); + page_top = page_height - page_bottom - inheader.cupsHeight; + linesize = (page_width * inheader.cupsBitsPerPixel + 7) / 8; + lineoffset = page_left * inheader.cupsBitsPerPixel / 8; /* Round down */ + + switch (inheader.cupsColorSpace) + { + case CUPS_CSPACE_W : + case CUPS_CSPACE_RGB : + case CUPS_CSPACE_SW : + case CUPS_CSPACE_SRGB : + case CUPS_CSPACE_ADOBERGB : + white = 255; + break; + + case CUPS_CSPACE_K : + case CUPS_CSPACE_CMYK : + case CUPS_CSPACE_DEVICE1 : + case CUPS_CSPACE_DEVICE2 : + case CUPS_CSPACE_DEVICE3 : + case CUPS_CSPACE_DEVICE4 : + case CUPS_CSPACE_DEVICE5 : + case CUPS_CSPACE_DEVICE6 : + case CUPS_CSPACE_DEVICE7 : + case CUPS_CSPACE_DEVICE8 : + case CUPS_CSPACE_DEVICE9 : + case CUPS_CSPACE_DEVICEA : + case CUPS_CSPACE_DEVICEB : + case CUPS_CSPACE_DEVICEC : + case CUPS_CSPACE_DEVICED : + case CUPS_CSPACE_DEVICEE : + case CUPS_CSPACE_DEVICEF : + white = 0; + break; + + default : + _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); + fprintf(stderr, "DEBUG: Unsupported cupsColorSpace %d on page %d.\n", + inheader.cupsColorSpace, page); + return (1); + } + + if (inheader.cupsColorOrder != CUPS_ORDER_CHUNKED) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); + fprintf(stderr, "DEBUG: Unsupported cupsColorOrder %d on page %d.\n", + inheader.cupsColorOrder, page); + return (1); + } + + if (inheader.cupsBitsPerPixel != 1 && + inheader.cupsBitsPerColor != 8 && inheader.cupsBitsPerColor != 16) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Unsupported raster data.")); + fprintf(stderr, "DEBUG: Unsupported cupsBitsPerColor %d on page %d.\n", + inheader.cupsBitsPerColor, page); + return (1); + } + + memcpy(&outheader, &inheader, sizeof(outheader)); + outheader.cupsWidth = page_width; + outheader.cupsHeight = page_height; + outheader.cupsBytesPerLine = linesize; + + outheader.cupsInteger[14] = 0; /* VendorIdentifier */ + outheader.cupsInteger[15] = 0; /* VendorLength */ + + if ((val = cupsGetOption("print-content-optimize", num_options, + options)) != NULL) + { + if (!strcmp(val, "automatic")) + strlcpy(outheader.OutputType, "Automatic", + sizeof(outheader.OutputType)); + else if (!strcmp(val, "graphics")) + strlcpy(outheader.OutputType, "Graphics", sizeof(outheader.OutputType)); + else if (!strcmp(val, "photo")) + strlcpy(outheader.OutputType, "Photo", sizeof(outheader.OutputType)); + else if (!strcmp(val, "text")) + strlcpy(outheader.OutputType, "Text", sizeof(outheader.OutputType)); + else if (!strcmp(val, "text-and-graphics")) + strlcpy(outheader.OutputType, "TextAndGraphics", + sizeof(outheader.OutputType)); + else + { + fprintf(stderr, "DEBUG: Unsupported print-content-type \"%s\".\n", val); + outheader.OutputType[0] = '\0'; + } + } + + if ((val = cupsGetOption("print-quality", num_options, options)) != NULL) + { + int quality = atoi(val); /* print-quality value */ + + if (quality >= IPP_QUALITY_DRAFT && quality <= IPP_QUALITY_HIGH) + outheader.cupsInteger[8] = quality; + else + { + fprintf(stderr, "DEBUG: Unsupported print-quality %d.\n", quality); + outheader.cupsInteger[8] = 0; + } + } + + if ((val = cupsGetOption("print-rendering-intent", num_options, + options)) != NULL) + { + if (!strcmp(val, "absolute")) + strlcpy(outheader.cupsRenderingIntent, "Absolute", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "automatic")) + strlcpy(outheader.cupsRenderingIntent, "Automatic", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "perceptual")) + strlcpy(outheader.cupsRenderingIntent, "Perceptual", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "relative")) + strlcpy(outheader.cupsRenderingIntent, "Relative", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "relative-bpc")) + strlcpy(outheader.cupsRenderingIntent, "RelativeBpc", + sizeof(outheader.cupsRenderingIntent)); + else if (!strcmp(val, "saturation")) + strlcpy(outheader.cupsRenderingIntent, "Saturation", + sizeof(outheader.cupsRenderingIntent)); + else + { + fprintf(stderr, "DEBUG: Unsupported print-rendering-intent \"%s\".\n", + val); + outheader.cupsRenderingIntent[0] = '\0'; + } + } + + if (inheader.cupsPageSizeName[0] && + (pwg_size = _ppdCacheGetSize(cache, inheader.cupsPageSizeName)) != NULL) + { + strlcpy(outheader.cupsPageSizeName, pwg_size->map.pwg, + sizeof(outheader.cupsPageSizeName)); + } + else + { + pwg_media = _pwgMediaForSize((int)(2540.0 * inheader.cupsPageSize[0] / + 72.0), + (int)(2540.0 * inheader.cupsPageSize[1] / + 72.0)); + + if (pwg_media) + strlcpy(outheader.cupsPageSizeName, pwg_media->pwg, + sizeof(outheader.cupsPageSizeName)); + else + { + fprintf(stderr, "DEBUG: Unsupported PageSize %.2fx%.2f.\n", + inheader.cupsPageSize[0], inheader.cupsPageSize[1]); + outheader.cupsPageSizeName[0] = '\0'; + } + } + + if (inheader.Duplex && !(page & 1) && + back && _cups_strcasecmp(back->value, "Normal")) + { + if (_cups_strcasecmp(back->value, "Flipped")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + } + else if (_cups_strcasecmp(back->value, "ManualTumble")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else if (_cups_strcasecmp(back->value, "Rotated")) + { + if (inheader.Tumble) + { + outheader.cupsInteger[1] = -1;/* CrossFeedTransform */ + outheader.cupsInteger[2] = -1;/* FeedTransform */ + + outheader.cupsInteger[3] = page_width - page_left - + inheader.cupsWidth; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_bottom; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_width - page_left; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_top; + /* ImageBoxBottom */ + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else + { + /* + * Unsupported value... + */ + + fprintf(stderr, "DEBUG: Unsupported cupsBackSide \"%s\".\n", back->value); + + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + } + else + { + outheader.cupsInteger[1] = 1; /* CrossFeedTransform */ + outheader.cupsInteger[2] = 1; /* FeedTransform */ + + outheader.cupsInteger[3] = page_left; + /* ImageBoxLeft */ + outheader.cupsInteger[4] = page_top; + /* ImageBoxTop */ + outheader.cupsInteger[5] = page_left + inheader.cupsWidth; + /* ImageBoxRight */ + outheader.cupsInteger[6] = page_height - page_bottom; + /* ImageBoxBottom */ + } + + if (!cupsRasterWriteHeader2(outras, &outheader)) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); + fprintf(stderr, "DEBUG: Unable to write header for page %d.\n", page); + return (1); + } + + /* + * Copy raster data... + */ + + line = malloc(linesize); + + memset(line, white, linesize); + for (y = page_top; y > 0; y --) + if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); + fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", + page_top - y + 1, page); + return (1); + } + + for (y = inheader.cupsHeight; y > 0; y --) + { + cupsRasterReadPixels(inras, line + lineoffset, inheader.cupsBytesPerLine); + if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); + fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", + inheader.cupsHeight - y + page_top + 1, page); + return (1); + } + } + + memset(line, white, linesize); + for (y = page_bottom; y > 0; y --) + if (!cupsRasterWritePixels(outras, line, outheader.cupsBytesPerLine)) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Error sending raster data.")); + fprintf(stderr, "DEBUG: Unable to write line %d for page %d.\n", + page_bottom - y + page_top + inheader.cupsHeight + 1, page); + return (1); + } + + free(line); + } + + cupsRasterClose(inras); + if (fd) + close(fd); + + cupsRasterClose(outras); + + return (0); +} + + +/* + * End of "$Id: rastertopwg.c 10006 2011-09-20 18:36:33Z mike $". + */ diff --git a/filter/spec-ppd.header b/filter/spec-ppd.header new file mode 100644 index 0000000..c8793d3 --- /dev/null +++ b/filter/spec-ppd.header @@ -0,0 +1,32 @@ + + +

CUPS PPD Extensions

+ +

This specification describes the attributes and extensions that CUPS adds to Adobe TechNote #5003: PostScript Printer Description File Format Specification Version 4.3. PostScript Printer Description ("PPD") files describe the capabilities of each printer and are used by CUPS to support printer-specific features and intelligent filtering.

+ + diff --git a/filter/spec-ppd.shtml b/filter/spec-ppd.shtml new file mode 100644 index 0000000..670e899 --- /dev/null +++ b/filter/spec-ppd.shtml @@ -0,0 +1,1898 @@ +

PPD File Syntax

+ +

The PPD format is text-based and uses lines of up to 255 characters terminated by a carriage return, linefeed, or combination of carriage return and line feed. The following ABNF definition [RFC5234] defines the general format of lines in a PPD file:

+ +
+PPD-FILE = HEADER +(DATA / COMMENT / LINE-END)
+
+HEADER   = "*PPD-Adobe:" *WSP DQUOTE VERSION DQUOTE LINE-END
+
+VERSION  = "4.0" / "4.1" / "4.2" / "4.3"
+
+COMMENT  = "*%" *TCHAR LINE-END
+
+DATA     = "*" 1*KCHAR [ WSP 1*KCHAR [ "/" 1*TCHAR ] ] ":"
+           1*(*WSP VALUE) LINE-END
+
+VALUE    = 1*TCHAR / DQUOTE 1*SCHAR DQUOTE
+
+KCHAR    = ALPHA / DIGIT / "_" / "." / "-"
+
+SCHAR    = LINE-END / WSP / %x21.23-7E.A0-FF
+
+TCHAR    = %x20-7E.A0-FF
+
+LINE-END = CR / LF / CR LF
+
+ + +

Auto-Configuration

+ +

CUPS supports several methods of auto-configuration via PPD keywords.

+ +

Mac OS X 10.5APAutoSetupTool

+ +

*APAutoSetupTool: "/LibraryPrinters/vendor/filename"

+ +

This Mac OS X keyword defines a program that sets the default option choices. It is run when a printer is added from the Add Printer window or the Nearby Printers list in the Print dialog.

+ +

The program is provided with two arguments: the printer's device URI and the PPD file to be used for the printer. The program must write an updated PPD file to stdout.

+ +

Examples:

+ +
+*% Use our setup tool when adding a printer
+*APAutoSetupTool: "/Library/Printers/vendor/Tools/autosetuptool"
+
+ +

Mac OS X 10.2/CUPS 1.4?MainKeyword

+ +

*?MainKeyword: "
+ PostScript query code that writes a message using the = operator...
+"
+*End

+ +

The ?MainKeyword keyword defines PostScript code that determines the currently selected/enabled option keyword (choice) for the main keyword (option). It is typically used when communicating with USB, serial, Appletalk, and AppSocket (port 9100) printers.

+ +

The PostScript code typically sends its response back using the = operator.

+ +

Example:

+ +
+*OpenUI OptionDuplex/Duplexer Installed: Boolean
+*DuplexOptionDuplex: False
+*OptionDuplex False/Not Installed: ""
+*OptionDuplex True/Installed: ""
+
+*% Query the printer for the presence of the duplexer option...
+*?OptionDuplex: "
+  currentpagedevice /Duplex known
+  {(True)} {(False)} ifelse
+  = flush
+"
+*End
+*CloseUI: OptionDuplex
+
+ +

Mac OS X 10.4/CUPS 1.5OIDMainKeyword

+ +

*?OIDMainKeyword: ".n.n.n..."
+*OIDMainKeyword OptionKeyword1: "value"
+...
+*OIDMainKeyword OptionKeywordN: "value"

+ +

The OIDMainKeyword keyword is used to define SNMP OIDs that map to installable options. The first (query) line defines the OID to lookup on the network device. The second and subsequent keywords define a mapping from OID value to option keyword. Since SNMP is an IP-based network protocol, this method is typically only used to configure AppSocket, IPP, and LPD network printers.

+ +

Examples:

+ +
+*% Get the installed memory on the printer...
+*?OIDInstalledMemory: ".1.3.6.1.2.1.25.2.2.0"
+*OIDInstalledMemory 16MB: "16384 KBytes"
+*OIDInstalledMemory 32MB: "32768 KBytes"
+*OIDInstalledMemory 48MB: "49152 KBytes"
+*OIDInstalledMemory 72MB: "73728 KBytes"
+
+ + +

Color Profiles

+ +

CUPS supports three types of color profiles. The first type is based on sRGB and is used by the standard CUPS raster filters and GPL Ghostscript. The second type is based on ICC profiles and is used by the Quartz-based filters on MacOS X. The final type is based on well-known colorspaces such as sRGB and Adobe RGB.

+ +
Note: + +

At this time, none of the CUPS raster filters support ICC profiles. This will be addressed as time and resources permit.

+ +
+ +

DeprecatedcupsColorProfile

+ +

*cupsColorProfile Resolution/MediaType: "density gamma m00 m01 m02 m10 m11 m12 m20 m21 m22"

+ +

This string keyword specifies an sRGB-based color profile consisting of gamma and density controls and a 3x3 CMY color transform matrix. This keyword is not supported on Mac OS X.

+ +

The Resolution and MediaType values may be "-" to act as a wildcard. Otherwise they must match one of the Resolution or MediaType option keywords defined in the PPD file.

+ +

The density and gamma values define gamma and +density adjustment function such that:

+ +
+f(x) = density * x gamma
+
+ +

The m00 through m22 values define a 3x3 transformation matrix for the CMY color values. The density function is applied after the CMY transformation:

+ +
+| m00 m01 m02 |
+| m10 m11 m12 |
+| m20 m21 m22 |
+
+ +

Examples:

+ +
+*% Specify a profile for printing at 360dpi on all media types
+*cupsColorProfile 360dpi/-: "1.0 1.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+*% Specify a profile for printing at 720dpi on Glossy media
+*cupsColorProfile 720dpi/Glossy: "1.0 2.5 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+*% Specify a default profile for printing at all other resolutions and media types
+*cupsColorProfile -/-: "0.9 2.0 1.0 0.0 -0.2 -0.4 1.0 0.0 -0.2 0.0 1.0"
+
+ + +

Mac OS X 10.3/CUPS 1.2cupsICCProfile

+ +

*cupsICCProfile ColorModel.MediaType.Resolution/Description: "filename"

+ +

This keyword specifies an ICC color profile that is used to convert the document colors to the device colorspace. The ColorModel, MediaType, and Resolution option keywords specify a selector for color profiles. If omitted, the color profile will match any option keyword for the corresponding main keyword.

+ +

The Description specifies human-readable text that is associated with the color profile. The filename portion specifies the ICC color profile to use; if the filename is not absolute, it is loaded relative to the /usr/share/cups/profiles directory.

+ +

Examples:

+ +
+*% Specify a profile for CMYK printing at 360dpi on all media types
+*cupsICCProfile CMYK..360dpi/360dpi CMYK: "/Library/Printers/vendor/Profiles/foo-360-cmyk.icc"
+
+*% Specify a profile for RGB printing at 720dpi on Glossy media
+*cupsColorProfile RGB.Glossy.720dpi/720dpi Glossy: "/Library/Printers/vendor/Profiles/foo-720-glossy-rgb.icc"
+
+*% Specify a default profile for printing at all other resolutions and media types
+*cupsICCProfile ../Default: "/Library/Printers/vendor/Profiles/foo-default.icc"
+
+ +

Customizing the Profile Selection Keywords

+ +

The ColorModel, MediaType, and Resolution main keywords can be reassigned to different main keywords, allowing drivers to do color profile selection based on different parameters. The cupsICCQualifier1, cupsICCQualifier2, and cupsICCQualifier3 keywords define the mapping from selector to main keyword:

+ +
+*cupsICCQualifier1: MainKeyword1
+*cupsICCQualifier2: MainKeyword2
+*cupsICCQualifier3: MainKeyword3
+
+ +

The default mapping is as follows:

+ +
+*cupsICCQualifier1: ColorModel
+*cupsICCQualifier2: MediaType
+*cupsICCQualifier3: Resolution
+
+ +

Mac OS X 10.4Custom Color Matching Support

+ +

*APSupportsCustomColorMatching: true
+*APCustomColorMatchingName name/text: ""
+*APCustomColorMatchingProfile: profile
+*APDefaultCustomColorMatchingProfile: profile

+ +

These keywords tell the Mac OS X raster filters that the printer driver provides its own custom color matching and that generic color profiles should be used when generating 1-, 3-, and 4-component raster data as requested by the driver. The APCustomColorMatchingProfile and APDefaultColorMatchingProfile keywords specify alternate color profiles (sRGB or AdobeRGB) to use for 3-color (RGB) raster data.

+ +
Note: + +

Prior to Mac OS X 10.6, the default RGB color space was Apple's "GenericRGB". The new default in Mac OS X 10.6 and later is "sRGB". For more information, see "Mac OS X v10.6: About gamma 2.2" on Apple's support site.

+ +
+ +

Mac OS X 10.5APCustomColorMatchingName

+ +

*APCustomColorMatchingName name/text: ""

+ +

This keyword defines an alternate name for the color matching provided by a driver in the Color Matching print panel. The default is to use the name "Vendor Matching" or its localized equivalent.

+ +

Examples:

+ +
+*% Define the names for our color matching...
+*APCustomColorMatchingName name/AcmeColor(tm): ""
+*fr.APCustomColorMatchingName name/La AcmeColor(tm): ""
+
+ +

Mac OS X 10.5APCustomColorMatchingProfile

+ +

*APCustomColorMatchingProfile: name

+ +

This keyword defines a supported RGB color profile that can be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported. If not specified, RGB data will use the GenericRGB colorspace.

+ +
Note: + +

If you provide multiple APCustomColorMatchingProfile keywords, you are responsible for providing the necessary user interface controls to select the profile in a print dialog pane. Add the named profile to the print settings using the key kPMCustomColorMatchingProfileKey.

+ +
+ +

Examples:

+ +
+*% Use sRGB for RGB color by default, but support both sRGB and AdobeRGB
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+*APCustomColorMatchingProfile: sRGB
+*APCustomColorMatchingProfile: AdobeRGB
+
+ +

Mac OS X 10.5APDefaultCustomColorMatchingProfile

+ +

*APDefaultCustomColorMatchingProfile: name

+ +

This keyword defines the default RGB color profile that will be used when doing custom color matching. Currently only sRGB, AdobeRGB, and GenericRGB are supported.

+ +

Examples:

+ +
+*% Use sRGB for RGB color by default
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+
+ +

Mac OS X 10.4APSupportsCustomColorMatching

+ +

*APSupportsCustomColorMatching: boolean

+ +

This keyword specifies that the driver provides its own custom color matching. When true, the default hand-off colorspace will be GenericGray, GenericRGB, or GenericCMYK depending on the number of components the driver requests. The APDefaultCustomColorMatchingProfile keyword can be used to override the default 3-component (RGB) colorspace.

+ +

The default for APSupportsCustomColorMatching is false.

+ +

Examples:

+ +
+*APSupportsCustomColorMatching: true
+*APDefaultCustomColorMatchingProfile: sRGB
+
+ + +

Constraints

+ +

Constraints are option choices that are not allowed by the driver or device, for example printing 2-sided transparencies. All versions of CUPS support constraints defined by the legacy Adobe UIConstraints and NonUIConstraints keywords which support conflicts between any two option choices, for example:

+ +
+*% Do not allow 2-sided printing on transparency media
+*UIConstraints: "*Duplex *MediaType Transparency"
+*UIConstraints: "*MediaType Transparency *Duplex"
+
+ +

While nearly all constraints can be expressed using these keywords, there are valid scenarios requiring constraints between more than two option choices. In addition, resolution of constraints is problematic since users and software have to guess how a particular constraint is best resolved.

+ +

CUPS 1.4 and higher define two new keywords for constraints, cupsUIConstraints and cupsUIResolver. Each cupsUIConstraints keyword points to a cupsUIResolver keyword which specifies alternate options that resolve the conflict condition. The same cupsUIResolver can be used by multiple cupsUIConstraints.

+ +
Note: + +

When developing PPD files that contain constraints, it is very important to use the cupstestppd(1) program to verify that your constraints are accurate and cannot result in unresolvable option selections.

+ +
+ +

CUPS 1.4/Mac OS X 10.6cupsUIConstraints

+ +

*cupsUIConstraints resolver: "*Keyword1 *Keyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 *Keyword2 OptionKeyword2 ..."
+*cupsUIConstraints resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."
+*cupsUIConstraints: "*InstallableKeyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

+ +

Lists two or more options which conflict. The "resolver" string is a (possibly unique) keyword which specifies which options to change when the constraint exists. When no resolver is provided, CUPS first tries the default choice followed by testing each option choice to resolve the conflict.

+ +

Examples:

+ +
+*% Specify that 2-sided printing cannot happen on transparencies
+*cupsUIConstraints transparency: "*Duplex *MediaType Transparency"
+
+*% Specify that envelope printing cannot happen from the paper trays
+*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
+*cupsUIConstraints envelope: "*PageSize Env10 *InputSlot Tray1"
+*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
+*cupsUIConstraints envelope: "*PageSize EnvDL *InputSlot Tray2"
+
+*% Specify an installable option constraint for the envelope feeder
+*cupsUIConstraints: "*InputSlot EnvFeeder *InstalledEnvFeeder"
+
+*% Specify that photo printing cannot happen on plain paper or transparencies at 1200dpi
+*cupsUIConstraints photo: "*OutputMode Photo *MediaType Plain *Resolution 1200dpi"
+*cupsUIConstraints photo: "*OutputMode Photo *MediaType Transparency *Resolution 1200dpi"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsUIResolver

+ +

*cupsUIResolver resolver: "*Keyword1 OptionKeyword1 *Keyword2 OptionKeyword2 ..."

+ +

Specifies two or more options to mark/select to resolve a constraint. The "resolver" string identifies a particular action to take for one or more cupsUIConstraints. The same action can be used for multiple constraints. The option keyword pairs are treated as an ordered list of option selections to try - only the first N selections will be used, where N is the minimum number of selections required. Because cupsResolveConflicts() will not change the most recent option selection passed to it, at least two options from the constraints must be listed to avoid situations where conflicts cannot be resolved.

+ +

Examples:

+ +
+*% Specify the options to change for the 2-sided transparency constraint
+*cupsUIResolver transparency: "*Duplex None *MediaType Plain"
+
+*% Specify the options to change for the envelope printing constraints.  Notice
+*% that we try to change the InputSlot to either the envelope feeder or the
+*% manual feed first, then we change the page size...
+*cupsUIResolver envelope: "*InputSlot EnvFeeder *InputSlot ManualFeed *PageSize Letter"
+
+*% Specify the options to change for the photo printing constraints
+*cupsUIResolver photo: "*OutputMode Best *Resolution 600dpi"
+
+ + +

Globalized PPD Support

+ +

CUPS 1.2 and higher adds support for PPD files containing multiple languages by following the following additional rules:

+ +
    + +
  1. The LanguageVersion MUST be English
  2. + +
  3. The LanguageEncoding MUST be ISOLatin1
  4. + +
  5. The cupsLanguages keyword MUST be provided and list each of the supported locales in the PPD file
  6. + +
  7. Main and option keywords MUST NOT exceed 34 (instead of 40) characters to allow room for the locale prefixes in translation keywords
  8. + +
  9. The main keyword "Translation" MUST NOT be used
  10. + +
  11. Translation strings included with the main and option keywords MUST NOT contain characters outside the ASCII subset of ISOLatin1 and UTF-8; developers wishing to use characters outside ASCII MUST provide a separate set of English localization keywords for the affected keywords.
  12. + +
  13. Localizations are specified using a locale prefix of the form "ll" or "ll_CC." where "ll" is the 2-letter ISO language code and "CC" is the 2-letter ISO country code
      +
    • A generic language translation ("ll") SHOULD be provided with country-specific differences ("ll_CC") provided only as needed
    • +
    • For historical reasons, the "zh" and "zh_CN" locales map to Simplified Chinese while the "zh_TW" locale maps to Traditional Chinese
    • +
  14. + +
  15. Locale-specific translation strings MUST be encoded using UTF-8.
  16. + +
  17. Main keywords MUST be localized using one of the following forms: +

    *ll.Translation MainKeyword/translation text: ""
    + *ll_CC.Translation MainKeyword/translation text: ""

  18. + +
  19. Option keywords MUST be localized using one of the following forms: +

    *ll.MainKeyword OptionKeyword/translation text: ""
    + *ll_CC.MainKeyword OptionKeyword/translation text: ""

  20. + +
  21. Localization keywords MAY appear anywhere after the first line of the PPD file
  22. + +
+ +
Note: + +

We use a LanguageEncoding value of ISOLatin1 and limit the allowed base translation strings to ASCII to avoid character coding issues that would otherwise occur. In addition, requiring the base translation strings to be in English allows for easier fallback translation when no localization is provided in the PPD file for a given locale.

+ +
+ +

Examples:

+ +
+*LanguageVersion: English
+*LanguageEncoding: ISOLatin1
+*cupsLanguages: "de fr_CA"
+*ModelName: "Foobar Laser 9999"
+
+*% Localize ModelName for French and German
+*fr_CA.Translation ModelName/La Foobar Laser 9999: ""
+*de.Translation ModelName/Foobar LaserDrucken 9999: ""
+
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+*% Localize printer-state-reason for French and German
+*fr_CA.cupsIPPReason com.vendor-error/Une erreur sèrieuse s'est produite: "/help/com.vendor/error.html"
+*de.cupsIPPReason com.vendor-error/Eine ernste Störung trat: "/help/com.vendor/error.html"
+
+...
+
+*OpenUI *InputSlot/Paper Source: PickOne
+*OrderDependency: 10 AnySetup *InputSlot
+*DefaultInputSlot: Auto
+*% Localize InputSlot for French and German
+*fr_CA.Translation InputSlot/Papier source: ""
+*de.Translation InputSlot/Papiereinzug: ""
+*InputSlot Auto/Default: "<</ManualFeed false>>setpagedevice"
+*% Localize InputSlot=Auto for French and German
+*fr_CA.InputSlot Auto/Par Defaut: ""
+*de.InputSlot Auto/Standard: ""
+*InputSlot Manual/Manual Feed: "<</ManualFeed true>>setpagedevice"
+*% Localize InputSlot=Manual for French and German
+*fr_CA.InputSlot Manual/Manuel mecanisme de alimentation: ""
+*de.InputSlot Manual/Manueller Einzug: ""
+*CloseUI: *InputSlot
+
+ + +

CUPS 1.3/Mac OS X 10.6Custom Options

+ +

CUPS supports custom options using an extension of the CustomPageSize and ParamCustomPageSize syntax:

+ +
+*CustomFoo True: "command"
+*ParamCustomFoo Name1/Text 1: order type minimum maximum
+*ParamCustomFoo Name2/Text 2: order type minimum maximum
+...
+*ParamCustomFoo NameN/Text N: order type minimum maximum
+
+ +

When the base option is part of the JCLSetup section, the "command" string contains JCL commands with "\order" placeholders for each numbered parameter. The CUPS API handles any necessary value quoting for HP-PJL commands. For example, if the JCL command string is "@PJL SET PASSCODE=\1" and the first +option value is "1234" then CUPS will output the string "@PJL SET PASSCODE=1234".

+ +

For non-JCLSetup options, the "order" value is a number from 1 to N and specifies the order of values as they are placed on the stack before the command. For example, if the PostScript command string is "<</cupsReal1 2 1 roll>>setpagedevice" and the option value is "2.0" then CUPS will output the string "2.0 <</cupsReal1 2 1 roll>>setpagedevice".

+ +

The "type" is one of the following keywords:

+ +
    + +
  • curve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x value
  • + +
  • int - an integer value from "minimum" to "maximum"
  • + +
  • invcurve - a real value from "minimum" to "maximum" representing a gamma correction curve using the function: f(x) = x 1 / value
  • + +
  • passcode - a string of numbers value with a minimum of "minimum" numbers and a maximum of "maximum" numbers ("minimum" and "maximum" are numbers and passcode strings are not displayed in the user interface)
  • + +
  • password - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers and password strings are not displayed in the user interface)
  • + +
  • points - a measurement value in points from "minimum" to "maximum"
  • + +
  • real - a real value from "minimum" to "maximum"
  • + +
  • string - a string value with a minimum of "minimum" characters and a maximum of "maximum" characters ("minimum" and "maximum" are numbers)
  • + +
+ +

Examples:

+ +
+*% Base JCL key code option
+*JCLOpenUI JCLPasscode/Key Code: PickOne
+*OrderDependency: 10 JCLSetup *JCLPasscode
+*DefaultJCLPasscode: None
+*JCLPasscode None/No Code: ""
+*JCLPasscode 1111: "@PJL SET PASSCODE = 1111<0A>"
+*JCLPasscode 2222: "@PJL SET PASSCODE = 2222<0A>"
+*JCLPasscode 3333: "@PJL SET PASSCODE = 3333<0A>"
+*JCLCloseUI: *JCLPasscode
+
+*% Custom JCL key code option
+*CustomJCLPasscode True: "@PJL SET PASSCODE = \1<0A>"
+*ParamCustomJCLPasscode Code/Key Code: 1 passcode 4 4
+
+
+*% Base PostScript watermark option
+*OpenUI WatermarkText/Watermark Text: PickOne
+*OrderDependency: 10 AnySetup *WatermarkText
+*DefaultWatermarkText: None
+*WatermarkText None: ""
+*WatermarkText Draft: "<</cupsString1(Draft)>>setpagedevice"
+*CloseUI: *WatermarkText
+
+*% Custom PostScript watermark option
+*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
+*ParamCustomWatermarkText Text: 1 string 0 32
+
+
+*% Base PostScript gamma/density option
+*OpenUI GammaDensity/Gamma and Density: PickOne
+*OrderDependency: 10 AnySetup *GammaDensity
+*DefaultGammaDensity: Normal
+*GammaDensity Normal/Normal: "<</cupsReal1 1.0/cupsReal2 1.0>>setpagedevice"
+*GammaDensity Light/Lighter: "<</cupsReal1 0.9/cupsReal2 0.67>>setpagedevice"
+*GammaDensity Dark/Darker: "<</cupsReal1 1.1/cupsReal2 1.5>>setpagedevice"
+*CloseUI: *GammaDensity
+
+*% Custom PostScript gamma/density option
+*CustomGammaDensity True: "<</cupsReal1 3 -1 roll/cupsReal2 5 -1>>setpagedevice"
+*ParamCustomGammaDensity Gamma: 1 curve 0.1 10
+*ParamCustomGammaDensity Density: 2 real 0 2
+
+ + +

Writing PostScript Option Commands for Raster Drivers

+ +

PPD files are used for both PostScript and non-PostScript printers. For CUPS raster drivers, you use a subset of the PostScript language to set page device keywords such as page size, resolution, and so forth. For example, the following code sets the page size to A4 size:

+ +
+*PageSize A4: "<</PageSize[595 842]>>setpagedevice"
+
+ +

Custom options typically use other operators to organize the values into a key/value dictionary for setpagedevice. For example, our previous CustomWatermarkText option code uses the roll operator to move the custom string value into the dictionary for setpagedevice:

+ +
+*CustomWatermarkText True: "<</cupsString1 3 -1 roll>>setpagedevice"
+
+ +

For a custom string value of "My Watermark", CUPS will produce the following PostScript code for the option:

+ +
+(My Watermark)
+<</cupsString1 3 -1 roll>>setpagedevice
+
+ +

The code moves the string value ("My Watermark") from the bottom of the stack to the top, creating a dictionary that looks like:

+ +
+<</cupsString1(My Watermark)>>setpagedevice
+
+ +

The resulting dictionary sets the page device attributes that are sent to your raster driver in the page header.

+ +

Custom Page Size Code

+ +

There are many possible implementations of the CustomPageSize code. For CUPS raster drivers, the following code is recommended:

+ +
+*ParamCustomPageSize Width:        1 points min-width max-width
+*ParamCustomPageSize Height:       2 points min-height max-height
+*ParamCustomPageSize WidthOffset:  3 points 0 0
+*ParamCustomPageSize HeightOffset: 4 points 0 0
+*ParamCustomPageSize Orientation:  5 int 0 0
+*CustomPageSize True: "pop pop pop <</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice"
+
+ +

Supported PostScript Operators

+ +

CUPS supports the following PostScript operators in addition to the usual PostScript number, string (literal and hex-encoded), boolean, null, and name values:

+ +
    + +
  • << - Start a dictionary.
  • + +
  • >> - End a dictionary.
  • + +
  • [ - Start an array.
  • + +
  • ] - End an array.
  • + +
  • copy - Copy the top N objects on the stack.
  • + +
  • dup - Copy the top object on the stack.
  • + +
  • index - Copy the Nth from the top object on the stack.
  • + +
  • pop - Pop the top object on the stack.
  • + +
  • roll - Shift the top N objects on the stack.
  • + +
  • setpagedevice - Set the page header values according to the key/value dictionary on the stack.
  • + +
+ +
Note: + +

Never use the unsupported dict or put +operators in your option code. These operators are typically used in +option code dating back to Level 1 PostScript printers, which did not +support the simpler << or >> operators. +If you have old option code using dict or put, you can +rewrite it very easily to use the newer << and +>> operators instead. For example, the following code +to set the page size:

+ + + +
+1 dict dup /PageSize [612 792] put setpagedevice
+
+ +

can be rewritten as:

+ +
+<< /PageSize [612 792] >> setpagedevice
+
+ +
+ +

Supported Page Device Attributes

+ +

Table 2 shows the supported page device attributes along with PostScript code examples.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Supported Page Device Attributes
Name(s)TypeDescriptionExample(s)
AdvanceDistanceIntegerSpecifies the number of points to advance roll media after printing.<</AdvanceDistance 18>>setpagedevice
AdvanceMediaIntegerSpecifies when to advance the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</AdvanceMedia 4>>setpagedevice
CollateBooleanSpecifies whether collated copies are required.<</Collate true>>setpagedevice
CutMediaIntegerSpecifies when to cut the media: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</CutMedia 1>>setpagedevice
DuplexBooleanSpecifies whether 2-sided printing is required.<</Duplex true>>setpagedevice
HWResolutionInteger ArraySpecifies the resolution of the page image in pixels per inch.<</HWResolution[1200 1200]>>setpagedevice
InsertSheetBooleanSpecifies whether to insert a blank sheet before the job.<</InsertSheet true>>setpagedevice
JogIntegerSpecifies when to shift the media in the output bin: 0 = never, 1 = after the file, 2 = after the job, 3 = after the set, and 4 = after the page.<</Jog 2>>setpagedevice
LeadingEdgeIntegerSpecifies the leading edge of the media: 0 = top, 1 = right, 2 = bottom, 3 = left.<</LeadingEdge 0>>setpagedevice
ManualFeedBooleanSpecifies whether media should be drawn from the manual feed tray. Note: The MediaPosition attribute is preferred over the ManualFeed attribute.<</ManualFeed true>>setpagedevice
MediaClassStringSpecifies a named media.<</MediaClass (Invoices)>>setpagedevice
MediaColorStringSpecifies the color of the media.<</MediaColor >>setpagedevice
MediaPositionIntegerSpecifies the tray or source of the media.<</MediaPosition 12>>setpagedevice
MediaTypeStringSpecifies the general media type.<</MediaType (Glossy)>>setpagedevice
MediaWeightIntegerSpecifies the media weight in grams per meter2.<</MediaWeight 100>>setpagedevice
MirrorPrintBooleanSpecifies whether to flip the output image horizontally.<</MirrorPrint true>>setpagedevice
NegativePrintBooleanSpecifies whether to invert the output image.<</NegativePrint true>>setpagedevice
NumCopiesIntegerSpecifies the number of copies to produce of each page.<</NumCopies 100>>setpagedevice
OrientationIntegerSpecifies the orientation of the output: 0 = portrait, 1 = landscape rotated counter-clockwise, 2 = upside-down, 3 = landscape rotated clockwise.<</Orientation 3>>setpagedevice
OutputFaceUpBooleanSpecifies whether to place the media face-up in the output bin/tray.<</OutputFaceUp true>>setpagedevice
OutputTypeStringSpecifies the output type name.<</OutputType (Photo)>>setpagedevice
PageSizeInteger/Real ArraySpecifies the width and length/height of the page in points.<</PageSize[595 842]>>setpagedevice
SeparationsBooleanSpecifies whether to produce color separations.<</Separations true>>setpagedevice
TraySwitchBooleanSpecifies whether to switch trays automatically.<</TraySwitch true>>setpagedevice
TumbleBooleanSpecifies whether the back sides of pages are rotated 180 degrees.<</Tumble true>>setpagedevice
cupsBorderlessScalingFactorRealSpecifies the amount to scale the page image dimensions.<</cupsBorderlessScalingFactor 1.01>>setpagedevice
cupsColorOrderIntegerSpecifies the order of colors: 0 = chunked, 1 = banded, 2 = planar.<</cupsColorOrder 0>>setpagedevice
cupsColorSpaceIntegerSpecifies the page image colorspace: 0 = W, 1 = RGB, 2 = RGBA, 3 = K, 4 = CMY, 5 = YMC, 6 = CMYK, 7 = YMCK, 8 = KCMY, 9 = KCMYcm, 10 = GMCK, 11 = GMCS, 12 = White, 13 = Gold, 14 = Silver, 15 = CIE XYZ, 16 = CIE Lab, 17 = RGBW, 32 to 46 = CIE Lab (1 to 15 inks)<</cupsColorSpace 1 >>setpagedevice
cupsCompressionIntegerSpecifies a driver compression type/mode.<</cupsCompression 2>>setpagedevice
cupsInteger0
+ ...
+ cupsInteger15
IntegerSpecifies driver integer values.<</cupsInteger11 1234>>setpagedevice
cupsMarkerTypeStringSpecifies the type of ink/toner to use.<</cupsMarkerType (Black+Color)>>setpagedevice
cupsMediaTypeIntegerSpecifies a numeric media type.<</cupsMediaType 999>>setpagedevice
cupsPageSizeNameStringSpecifies the name of the page size.<</cupsPageSizeName (A4.Full)>>setpagedevice
cupsPreferredBitsPerColorIntegerSpecifies the preferred number of bits per color, typically 8 or 16.<</cupsPreferredBitsPerColor 16>>setpagedevice
cupsReal0
+ ...
+ cupsReal15
RealSpecifies driver real number values.<</cupsReal15 1.234>>setpagedevice
cupsRenderingIntentStringSpecifies the color rendering intent.<</cupsRenderingIntent (AbsoluteColorimetric)>>setpagedevice
cupsRowCountIntegerSpecifies the number of rows of raster data to print on each line for some drivers.<</cupsRowCount 24>>setpagedevice
cupsRowFeedIntegerSpecifies the number of rows to feed between passes for some drivers.<</cupsRowFeed 17>>setpagedevice
cupsRowStepIntegerSpecifies the number of lines between columns/rows on the print head for some drivers.<</cupsRowStep 2>>setpagedevice
cupsString0
+ ...
+ cupsString15
StringSpecifies driver string values.<</cupsString0(String Value)>>setpagedevice
+ + +

Media Keywords

+ +

The CUPS media keywords allow drivers to specify alternate custom page +size limits based on up to two options.

+ +

CUPS 1.4/Mac OS X 10.6cupsMediaQualifier2

+ +

*cupsMediaQualifier2: MainKeyword

+ +

This keyword specifies the second option to use for overriding the +custom page size limits.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMediaQualifier3

+ +

*cupsMediaQualifier3: MainKeyword

+ +

This keyword specifies the third option to use for overriding the +custom page size limits.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMinSize

+ +

*cupsMinSize .Qualifier2.Qualifier3: "width length"
+*cupsMinSize .Qualifier2.: "width length"
+*cupsMinSize ..Qualifier3: "width length"

+ +

This keyword specifies alternate minimum custom page sizes in points. +The cupsMediaQualifier2 and +cupsMediaQualifier3 keywords +are used to identify options to use for matching.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMaxSize

+ +

*cupsMaxSize .Qualifier2.Qualifier3: "width length"
+*cupsMaxSize .Qualifier2.: "width length"
+*cupsMaxSize ..Qualifier3: "width length"

+ +

This keyword specifies alternate maximum custom page sizes in points. +The cupsMediaQualifier2 and +cupsMediaQualifier3 keywords +are used to identify options to use for matching.

+ +

Example:

+ +
+*% Specify alternate custom page size limits based on InputSlot and Quality
+*cupsMediaQualifier2: InputSlot
+*cupsMediaQualifier3: Quality
+*cupsMaxSize .Manual.: "1000 1000"
+*cupsMinSize .Manual.: "100 100"
+*cupsMinSize .Manual.Photo: "200 200"
+*cupsMinSize ..Photo: "300 300"
+
+ + +

General Attributes

+ +

CUPS 1.3/Mac OS X 10.5cupsBackSide

+ +

*cupsBackSide: keyword

+ +

This keyword requests special handling of the back side of pages +when doing duplexed (2-sided) output. Table 1 +shows the supported keyword values for this keyword and their effect +on the raster data sent to your driver. For example, when cupsBackSide +is Rotated and Tumble is false, your driver +will receive print data starting at the bottom right corner of the page, with +each line going right-to-left instead of left-to-right. The default value is +Normal.

+ +
Note: + +

cupsBackSide replaces the older cupsFlipDuplex +keyword - if cupsBackSide is specified, cupsFlipDuplex +will be ignored.

+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1: Back Side Raster Coordinate System
cupsBackSideTumble ValueImage Presentation
NormalfalseLeft-to-right, top-to-bottom
NormaltrueLeft-to-right, top-to-bottom
ManualTumblefalseLeft-to-right, top-to-bottom
ManualTumbletrueRight-to-left, bottom-to-top
RotatedfalseRight-to-left, bottom-to-top
RotatedtrueRight-to-left, top-to-bottom
Flipped *falseLeft-to-right, bottom-to-top
Flipped *trueRight-to-left, top-to-bottom
+
+ +

* - Not supported in Mac OS X 10.5.x and earlier

+ +
+ + +
Figure 1: Back side images
Back side images
+ +

Examples:

+ +
+*% Flip the page image for the back side of duplexed output
+*cupsBackSide: Flipped
+
+*% Rotate the page image for the back side of duplexed output
+*cupsBackSide: Rotated
+
+ +

Also see the related APDuplexRequiresFlippedMargin +keyword.

+ +

CUPS 1.4/Mac OS X 10.6cupsCommands

+ +

*cupsCommands: "name name2 ... nameN"

+ +

This string keyword specifies the commands that are supported by the +CUPS command file filter for this device. The command names are separated +by whitespace.

+ +

Example:

+ +
+*% Specify the list of commands we support
+*cupsCommands: "AutoConfigure Clean PrintSelfTestPage ReportLevels com.vendor.foo"
+
+ + +

CUPS 1.3/Mac OS X 10.5cupsEvenDuplex

+ +

*cupsEvenDuplex: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer requires an even number of pages when 2-sided +printing is selected. The default value is false.

+ +

Example:

+ +
+*% Always send an even number of pages when duplexing
+*cupsEvenDuplex: true
+
+ +

cupsFax

+ +

*cupsFax: boolean

+ +

This boolean keyword specifies whether the PPD defines a facsimile device. The default is false.

+ +

Examples:

+ +
+*cupsFax: true
+
+ +

cupsFilter

+ +

*cupsFilter: "source/type cost program"

+ +

This string keyword provides a conversion rule from the +given source type to the printer's native format using the +filter "program". If a printer supports the source type directly, +the special filter program "-" may be specified.

+ +

Examples:

+ +
+*% Standard raster printer driver filter
+*cupsFilter: "application/vnd.cups-raster 100 rastertofoo"
+
+*% Plain text filter
+*cupsFilter: "text/plain 10 texttofoo"
+
+*% Pass-through filter for PostScript printers
+*cupsFilter: "application/vnd.cups-postscript 0 -"
+
+ +

CUPS 1.5cupsFilter2

+ +

*cupsFilter2: "source/type destination/type cost program"

+ +

This string keyword provides a conversion rule from the given source type to the printer's native format using the filter "program". If a printer supports the source type directly, the special filter program "-" may be specified. The destination type is automatically created as needed and is passed to the filters and backend as the FINAL_CONTENT_TYPE value.

+ +
Note: + +

The presence of a single cupsFilter2 keyword in the PPD file will hide any cupsFilter keywords from the CUPS scheduler. When using cupsFilter2 to provide filters specific for CUPS 1.5 and later, provide a cupsFilter2 line for every filter and a cupsFilter line for each filter that is compatible with older versions of CUPS.

+ +
+ +

Examples:

+ +
+*% Standard raster printer driver filter
+*cupsFilter2: "application/vnd.cups-raster application/vnd.foo 100 rastertofoo"
+
+*% Plain text filter
+*cupsFilter2: "text/plain application/vnd.foo 10 texttofoo"
+
+*% Pass-through filter for PostScript printers
+*cupsFilter2: "application/vnd.cups-postscript application/postscript 0 -"
+
+ +

DeprecatedcupsFlipDuplex

+ +

*cupsFlipDuplex: boolean

+ +

Due to implementation differences between Mac OS X and Ghostscript, +the cupsFlipDuplex keyword is deprecated. Instead, use +the cupsBackSide keyword to specify +the coordinate system (pixel layout) of the page data on the back side of +duplex pages.

+ +

The value true maps to a cupsBackSide value +of Rotated on Mac OS X and Flipped with +Ghostscript.

+ +

The default value is false.

+ +
Note: + +

Mac OS X drivers that previously used +cupsFlipDuplex may wish to provide both the old and +new keywords for maximum compatibility, for example:

+ +
+*cupsBackSide: Rotated
+*cupsFlipDuplex: true
+
+ +

Similarly, drivers written for other operating systems using +Ghostscript can use:

+ +
+*cupsBackSide: Flipped
+*cupsFlipDuplex: true
+
+ +

CUPS 1.3/Mac OS X 10.5cupsIPPFinishings

+ +

*cupsIPPFinishings number/text: "*Option Choice ..."

+ +

This keyword defines a mapping from IPP finishings +values to PPD options and choices.

+ +

Examples:

+ +
+*cupsIPPFinishings 4/staple: "*StapleLocation SinglePortrait"
+*cupsIPPFinishings 5/punch: "*PunchMedia Yes *PunchLocation LeftSide"
+*cupsIPPFinishings 20/staple-top-left: "*StapleLocation SinglePortrait"
+*cupsIPPFinishings 21/staple-bottom-left: "*StapleLocation SingleLandscape"
+
+ +

CUPS 1.3/Mac OS X 10.5cupsIPPReason

+ +

*cupsIPPReason reason/Reason Text: "optional URIs"

+ +

This optional keyword maps custom +printer-state-reasons keywords that are generated by +the driver to human readable text. The optional URIs string +contains zero or more URIs separated by a newline. Each URI can +be a CUPS server absolute path to a help file under the +scheduler's DocumentRoot directory, a full HTTP URL +("http://www.domain.com/path/to/help/page.html"), or any other +valid URI which directs the user at additional information +concerning the condition that is being reported.

+ +

Since the reason text is limited to 80 characters by the PPD specification, longer text strings can be included by URI-encoding the text with the "text" scheme, for example "text:some%20text". Multiple text URIs are combined by the ppdLocalizeIPPReason into a single string that can be displayed to the user.

+ +

Examples:

+ +
+*% Map com.vendor-error to text but no page
+*cupsIPPReason com.vendor-error/A serious error occurred: ""
+
+*% Map com.vendor-error to more than 80 characters of text but no page
+*cupsIPPReason com.vendor-error/A serious error occurred: "text:Now%20is%20the%20time
+text:for%20all%20good%20men%20to%20come%20to%20the%20aid%20of%20their%20country."
+
+*% Map com.vendor-error to text and a local page
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html"
+
+*% Map com.vendor-error to text and a remote page
+*cupsIPPReason com.vendor-error/A serious error occurred: "http://www.vendor.com/help"
+
+*% Map com.vendor-error to text and a local, Apple help book, and remote page
+*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+*cupsIPPReason com.vendor-error/A serious error occurred: "/help/com.vendor/error.html
+help:anchor='com.vendor-error'%20bookID=Vendor%20Help
+http://www.vendor.com/help"
+*End
+
+ +

CUPS 1.5cupsIPPSupplies

+ +

*cupsIPPSupplies: boolean

+ +

This keyword tells the IPP backend whether it should report the current marker-xxx supply attribute values. The default value is True. + +

Example:

+ +
+*% Do not use IPP marker-xxx attributes to report supply levels
+*cupsIPPSupplies: False
+
+ +

CUPS 1.2/Mac OS X 10.5cupsLanguages

+ +

*cupsLanguages: "locale list"

+ +

This keyword describes which language localizations are +included in the PPD. The "locale list" string is a space-delimited +list of locale names ("en", "en_US", "fr_CA", etc.)

+ +

Example:

+ +
+*% Specify Canadian, UK, and US English, and Canadian and French French
+*cupsLanguages: "en_CA en_UK en_US fr_CA fr_FR"
+
+ +

cupsManualCopies

+ +

*cupsManualCopies: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer does not support copy generation in +hardware. The default value is false.

+ +

Example:

+ +
+*% Tell the RIP filters to generate the copies for us
+*cupsManualCopies: true
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMarkerName

+ +

*cupsMarkerName/Name Text: ""

+ +

This optional keyword maps marker-names strings that are +generated by the driver to human readable text.

+ +

Examples:

+ +
+*% Map cyanToner to "Cyan Toner"
+*cupsMarkerName cyanToner/Cyan Toner: ""
+
+ +

CUPS 1.4/Mac OS X 10.6cupsMarkerNotice

+ +

*cupsMarkerNotice: "disclaimer text"

+ +

This optional keyword provides disclaimer text for the supply level +information provided by the driver, typically something like "supply levels +are approximate".

+ +

Examples:

+ +
+*cupsMarkerNotice: "Supply levels are approximate."
+
+ +

cupsModelNumber

+ +

*cupsModelNumber: number

+ +

This integer keyword specifies a printer-specific model +number. This number can be used by a filter program to adjust +the output for a specific model of printer.

+ +

Example:

+ +
+*% Specify an integer for a driver-specific model number
+*cupsModelNumber: 1234
+
+ +

CUPS 1.3/Mac OS X 10.5cupsPJLCharset

+ +

*cupsPJLCharset: "ISO character set name"

+ +

This string keyword specifies the character set that is used +for strings in PJL commands. If not specified, US-ASCII is +assumed.

+ +

Example:

+ +
+*% Specify UTF-8 is used in PJL strings
+*cupsPJLCharset: "UTF-8"
+
+ +

CUPS 1.4/Mac OS X 10.6cupsPJLDisplay

+ +

*cupsPJLDisplay: "what"

+ +

This optional keyword specifies which command is used to display the +job ID, name, and user on the printer's control panel. "What" is either "none" +to disable this functionality, "job" to use "@PJL JOB DISPLAY", or "rdymsg" +to use "@PJL RDYMSG DISPLAY". The default is "job".

+ +

Examples:

+ +
+*% Display job information using @PJL SET RDYMSG DISPLAY="foo"
+*cupsPJLDisplay: "rdymsg"
+
+*% Display job information display
+*cupsPJLDisplay: "none"
+
+ +

CUPS 1.2/Mac OS X 10.5cupsPortMonitor

+ +

*cupsPortMonitor urischeme/Descriptive Text: "port monitor"

+ +

This string keyword specifies printer-specific "port +monitor" filters that may be used with the printer. The CUPS +scheduler also looks for the Protocols keyword to see +if the BCP or TBCP protocols are supported. If +so, the corresponding port monitor ("bcp" and "tbcp", +respectively) is listed in the printer's +port-monitor-supported keyword.

+ +

The "urischeme" portion of the keyword specifies the URI scheme +that this port monitor should be used for. Typically this is used to +pre-select a particular port monitor for each type of connection that +is supported by the printer. The "port monitor" string can be "none" +to disable the port monitor for the given URI scheme.

+ +

Examples:

+ +
+*% Specify a PostScript printer that supports the TBCP protocol
+*Protocols: TBCP PJL
+
+*% Specify that TBCP should be used for socket connections but not USB
+*cupsPortMonitor socket/AppSocket Printing: "tbcp"
+*cupsPortMonitor usb/USB Printing: "none"
+
+*% Specify a printer-specific port monitor for an Epson USB printer
+*cupsPortMonitor usb/USB Status Monitor: "epson-usb"
+
+ +

CUPS 1.3/Mac OS X 10.5cupsPreFilter

+ +

*cupsPreFilter: "source/type cost program"

+ +

This string keyword provides a pre-filter rule. The pre-filter +program will be inserted in the conversion chain immediately +before the filter that accepts the given MIME type.

+ +

Examples:

+ +
+*% PDF pre-filter
+*cupsPreFilter: "application/pdf 100 mypdfprefilter"
+
+*% PNG pre-filter
+*cupsPreFilter: "image/png 0 mypngprefilter"
+
+ + +

CUPS 1.5cupsPrintQuality

+ +

*cupsPrintQuality keyword/text: "code"

+ +

This UI keyword defines standard print qualities that directly map from the IPP "print-quality" job template keyword. Standard keyword values are "Draft", "Normal", and "High" which are mapped from the IPP "print-quality" values 3, 4, and 5 respectively. Each cupsPrintQuality option typically sets output mode and resolution parameters in the page device dictionary, eliminating the need for separate (and sometimes confusing) output mode and resolution options.

+ +
Note: + +

Unlike all of the other keywords defined in this document, cupsPrintQuality is a UI keyword that MUST be enclosed inside the PPD OpenUI and CloseUI keywords.

+ +
+ +

Examples:

+ +
+*OpenUI *cupsPrintQuality/Print Quality: PickOne
+*OrderDependency: 10 AnySetup *cupsPrintQuality
+*DefaultcupsPrintQuality: Normal
+*cupsPrintQuality Draft/Draft: "code"
+*cupsPrintQuality Normal/Normal: "code"
+*cupsPrintQuality High/Photo: "code"
+*CloseUI: *cupsPrintQuality
+
+ +

CUPS 1.5cupsSingleFile

+ +

*cupsSingleFile: Boolean

+ +

This boolean keyword tells the scheduler whether to print multiple files in a job together or singly. The default is "False" which uses a single instance of the backend for all files in the print job. Setting this keyword to "True" will result in separate instances of the backend for each file in the print job.

+ +

Examples:

+ +
+*% Send all print data to a single backend
+*cupsSingleFile: False
+
+*% Send each file using a separate backend
+*cupsSingleFile: True
+
+ +

CUPS 1.4/Mac OS X 10.6cupsSNMPSupplies

+ +

*cupsSNMPSupplies: boolean

+ +

This keyword tells the standard network backends whether they should query +the standard SNMP Printer MIB OIDs for supply levels. The default value is +True. + +

Example:

+ +
+*% Do not use SNMP queries to report supply levels
+*cupsSNMPSupplies: False
+
+ +

cupsVersion

+ +

*cupsVersion: major.minor

+ +

This required keyword describes which version of the CUPS +PPD file extensions was used. Currently it must be the string +"1.0", "1.1", "1.2", or "1.3".

+ +

Example:

+ +
+*% Specify a CUPS 1.2 driver
+*cupsVersion: "1.2"
+
+ + +

Mac OS X Attributes

+ +

Mac OS X 10.3APDialogExtension

+ +

*APDialogExtension: "/Library/Printers/vendor/filename.plugin"

+ +

This keyword defines additional option panes that are displayed in the +print dialog. Each keyword adds one or more option panes. See the "OutputBinsPDE" +example and Apple +Technical Q&A QA1352 for information on writing your own print dialog +plug-ins.

+ +
Note: + +

Starting with Mac OS X 10.5, each plug-in must be compiled "4-way fat" +(32-bit and 64-bit for both PowerPC and Intel) with garbage collection enabled +in order to be usable with all applications.

+ +
+ +

Examples:

+ +
+*% Add two panes for finishing and driver options
+*APDialogExtension: "/Library/Printers/vendor/finishing.plugin"
+*APDialogExtension: "/Library/Printers/vendor/options.plugin"
+
+ +

Mac OS X 10.4APDuplexRequiresFlippedMargin

+ +

*APDuplexRequiresFlippedMargin: boolean

+ +

This boolean keyword notifies the RIP filters that the +destination printer requires the top and bottom margins of the +ImageableArea to be swapped for the back page. The +default is true when cupsBackSide is Flipped +and false otherwise. Table 2 shows how +APDuplexRequiresFlippedMargin interacts with cupsBackSide +and the Tumble page attribute.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2: Margin Flipping Modes
APDuplexRequiresFlippedMargincupsBackSideTumble ValueMargins
falseanyanyNormal
anyNormalanyNormal
trueManualDuplexfalseNormal
trueManualDuplextrueFlipped
trueRotatedfalseFlipped
trueRotatedtrueNormal
true or unspecifiedFlippedanyFlipped
+ +

Example:

+ +
+*% Rotate the back side images
+*cupsBackSide: Rotated
+
+*% Don't swap the top and bottom margins for the back side
+*APDuplexRequiresFlippedMargin: false
+
+ +

Also see the related cupsBackSide +keyword.

+ +

APHelpBook

+ +

*APHelpBook: "bundle URL"

+ +

This string keyword specifies the Apple help book bundle to use when +looking up IPP reason codes for this printer driver. The +cupsIPPReason keyword maps +"help" URIs to this file.

+ +

Example:

+ +
+*APHelpBook: "file:///Library/Printers/vendor/Help.bundle"
+
+ +

Mac OS X 10.6APICADriver

+ +

*APICADriver: boolean

+ +

This keyword specifies whether the device has a matching Image Capture +Architecture (ICA) driver for scanning. The default is False.

+ +

Examples:

+ +
+*APICADriver: True
+*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
+ +

Mac OS X 10.3APPrinterIconPath

+ +

*APPrinterIconPath: "/Library/Printers/vendor/filename.icns"

+ +

This keyword defines the location of a printer icon file to use when +displaying the printer. The file must be in the Apple icon format.

+ +

Examples:

+ +
+*% Apple icon file
+*APPrinterIconPath: "/Library/Printers/vendor/Icons/filename.icns"
+
+ +

Mac OS X 10.4APPrinterLowInkTool

+ +

*APPrinterLowInkTool: "/Library/Printers/vendor/program"

+ +

This keyword defines an program that checks the ink/toner/marker levels +on a printer, returning an XML document with those levels. See the "InkTool" +example and +Apple +Technical Note TN2144 for more information.

+ +

Examples:

+ +
+*% Use a vendor monitoring program
+*APPrinterLowInkTool: "/Library/Printers/vendor/Tools/lowinktool"
+
+ +

Mac OS X 10.5APPrinterPreset

+ +

*APPrinterPreset name/text: "*Option Choice ..."

+ +

This keyword defines presets for multiple options that show up +in the print dialog of applications (such as iPhoto) that set the job +style hint to NSPrintPhotoJobStyleHint. Each preset maps to one or +more pairs of PPD options and choices as well as providing key/value data for +the application. The following standard preset names are currently defined:

+ +
    + +
  • General_with_Paper_Auto-Detect; Normal quality general printing with auto-detected media.
  • + +
  • General_with_Paper_Auto-Detect_-_Draft; Draft quality general printing with auto-detected media.
  • + +
  • General_on_Plain_Paper; Normal quality general printing on plain paper.
  • + +
  • General_on_Plain_Paper_-_Draft; Draft quality general printing on plain paper.
  • + +
  • Photo_with_Paper_Auto-Detect; Normal quality photo printing with auto-detected media.
  • + +
  • Photo_with_Paper_Auto-Detect_-_Fine; High quality photo printing with auto-detected media.
  • + +
  • Photo_on_Plain_Paper; Normal quality photo printing on plain paper.
  • + +
  • Photo_on_Plain_Paper_-_Fine; High quality photo printing on plain paper.
  • + +
  • Photo_on_Photo_Paper; Normal quality photo printing on glossy photo paper.
  • + +
  • Photo_on_Photo_Paper_-_Fine; High quality photo printing on glossy photo paper.
  • + +
  • Photo_on_Matte_Paper; Normal quality photo printing on matte paper.
  • + +
  • Photo_on_Matte_Paper_-_Fine; High quality photo printing on matte paper.
  • + +
+ +

The value string consists of pairs of keywords, either an option name and +choice (*MainKeyword OptionKeyword) or a preset identifier and value +(com.apple.print.preset.foo value). The following preset identifiers are currently used:

+ +
    + +
  • com.apple.print.preset.graphicsType; specifies the type of printing used for this printing - "General" for general purpose printing and "Photo" for photo printing.
  • + +
  • com.apple.print.preset.media-front-coating; specifies the media type selected by this preset - "none" (plain paper), "glossy", "high-gloss", "semi-gloss", "satin", "matte", and "autodetect".
  • + +
  • com.apple.print.preset.output-mode; specifies the output mode for this preset - "color" (default for color printers) or "monochrome" (grayscale, default for B&W printers).
  • + +
  • com.apple.print.preset.quality; specifies the overall print quality selected by this preset - "low" (draft), "mid" (normal), or "high".
  • + +
+ +

Presets, like options, can also be localized in multiple languages.

+ +

Examples:

+ +
+*APPrinterPreset Photo_on_Photo_Paper/Photo on Photo Paper: "
+  *MediaType Glossy
+  *ColorModel RGB
+  *Resolution 300dpi
+  com.apple.print.preset.graphicsType Photo
+  com.apple.print.preset.quality mid
+  com.apple.print.preset.media-front-coating glossy"
+*End
+*fr.APPrinterPreset Photo_on_Photo_Paper/Photo sur papier photographique: ""
+
+ +

Mac OS X 10.3APPrinterUtilityPath

+ +

*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/filename.app"

+ +

This keyword defines a GUI application that can be used to do printer +maintenance functions such as cleaning the print head(s). See ... for more +information.

+ +

Examples:

+ +
+*% Define the printer utility application
+*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app"
+
+ +

Mac OS X 10.6APScannerOnly

+ +

*APScannerOnly: boolean

+ +

This keyword specifies whether the device has scanning but no printing +capabilities. The default is False.

+ +

Examples:

+ +
+*APICADriver: True
+*APScannerOnly: True
+
+ +

Mac OS X 10.3APScanAppBundleID

+ +

*APScanAppBundleID: "bundle ID"

+ +

This keyword defines the application to use when scanning pages from +the device.

+ +

Examples:

+ +
+*APICADriver: True
+*APScanAppBundleID: "com.apple.ImageCaptureApp"
+
+ + +

Change History

+ +

Changes in CUPS 1.5

+ +
    + +
  • Changes all instances of PPD attributes to PPD keywords, to be consistent with the parent specification from Adobe.
  • + +
+ + +

Changes in CUPS 1.4.5

+ + + + +

Changes in CUPS 1.4

+ + + + +

Changes in CUPS 1.3.1

+ +
    + +
  • Added missing Mac OS X AP keywords.
  • + +
  • Added section on auto-configuration including the + OIDMainKeyword and ?MainKeyword + keywords.
  • + +
  • Minor reorganization.
  • + +
+ + +

Changes in CUPS 1.3

+ + + +

Changes in CUPS 1.2.8

+ +
    + +
  • Added section on supported PostScript commands for raster + drivers
  • + +
+ +

Changes in CUPS 1.2

+ + + +

Changes in CUPS 1.1

+ + diff --git a/filter/testimage.c b/filter/testimage.c new file mode 100644 index 0000000..57e3a19 --- /dev/null +++ b/filter/testimage.c @@ -0,0 +1,99 @@ +/* + * "$Id$" + * + * Image library test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry... + */ + +/* + * Include necessary headers... + */ + +#include "image.h" + + +/* + * 'main()' - Main entry... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + cups_image_t *img; /* Image to print */ + cups_icspace_t primary; /* Primary image colorspace */ + FILE *out; /* Output PPM/PGM file */ + cups_ib_t *line; /* Line from file */ + int y, /* Current line */ + width, /* Width of image */ + height, /* Height of image */ + depth; /* Depth of image */ + + + if (argc != 3) + { + puts("Usage: testimage filename.ext filename.[ppm|pgm]"); + return (1); + } + + if (strstr(argv[2], ".ppm") != NULL) + primary = CUPS_IMAGE_RGB; + else + primary = CUPS_IMAGE_WHITE; + + img = cupsImageOpen(argv[1], primary, CUPS_IMAGE_WHITE, 100, 0, NULL); + + if (!img) + { + perror(argv[1]); + return (1); + } + + out = fopen(argv[2], "wb"); + + if (!out) + { + perror(argv[2]); + cupsImageClose(img); + return (1); + } + + width = cupsImageGetWidth(img); + height = cupsImageGetHeight(img); + depth = cupsImageGetDepth(img); + line = calloc(width, depth); + + fprintf(out, "P%d\n%d\n%d\n255\n", + cupsImageGetColorSpace(img) == CUPS_IMAGE_WHITE ? 5 : 6, + width, height); + + for (y = 0; y < height; y ++) + { + cupsImageGetRow(img, 0, y, width, line); + fwrite(line, width, depth, out); + } + + cupsImageClose(img); + fclose(out); + + return (0); +} + + +/* + * End of "$Id$". + */ diff --git a/filter/testraster.c b/filter/testraster.c new file mode 100644 index 0000000..b7b70b3 --- /dev/null +++ b/filter/testraster.c @@ -0,0 +1,1084 @@ +/* + * "$Id: testraster.c 9870 2011-08-06 06:32:26Z mike $" + * + * Raster test program routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Test the raster functions. + * do_ppd_tests() - Test the default option commands in a PPD file. + * do_ps_tests() - Test standard PostScript commands. + * do_ras_file() - Test reading of a raster file. + * do_raster_tests() - Test reading and writing of raster data. + * print_changes() - Print differences in the page header. + */ + +/* + * Include necessary headers... + */ + +#include "image-private.h" +#ifdef WIN32 +# include +#else +# include +# include +#endif /* WIN32 */ + + +/* + * Test PS commands and header... + */ + +static const char *dsc_code = +"[{\n" +"%%BeginFeature: *PageSize Tabloid\n" +"<>setpagedevice\n" +"%%EndFeature\n" +"} stopped cleartomark\n"; +static const char *setpagedevice_code = +"<<" +"/MediaClass(Media Class)" +"/MediaColor((Media Color))" +"/MediaType(Media\\\\Type)" +"/OutputType<416263>" +"/AdvanceDistance 1000" +"/AdvanceMedia 1" +"/Collate false" +"/CutMedia 2" +"/Duplex true" +"/HWResolution[100 200]" +"/InsertSheet true" +"/Jog 3" +"/LeadingEdge 1" +"/ManualFeed true" +"/MediaPosition 8#777" +"/MediaWeight 16#fe01" +"/MirrorPrint true" +"/NegativePrint true" +"/NumCopies 1" +"/Orientation 1" +"/OutputFaceUp true" +"/PageSize[612 792.1]" +"/Separations true" +"/TraySwitch true" +"/Tumble true" +"/cupsMediaType 2" +"/cupsColorOrder 1" +"/cupsColorSpace 1" +"/cupsCompression 1" +"/cupsRowCount 1" +"/cupsRowFeed 1" +"/cupsRowStep 1" +"/cupsBorderlessScalingFactor 1.001" +"/cupsInteger0 1" +"/cupsInteger1 2" +"/cupsInteger2 3" +"/cupsInteger3 4" +"/cupsInteger4 5" +"/cupsInteger5 6" +"/cupsInteger6 7" +"/cupsInteger7 8" +"/cupsInteger8 9" +"/cupsInteger9 10" +"/cupsInteger10 11" +"/cupsInteger11 12" +"/cupsInteger12 13" +"/cupsInteger13 14" +"/cupsInteger14 15" +"/cupsInteger15 16" +"/cupsReal0 1.1" +"/cupsReal1 2.1" +"/cupsReal2 3.1" +"/cupsReal3 4.1" +"/cupsReal4 5.1" +"/cupsReal5 6.1" +"/cupsReal6 7.1" +"/cupsReal7 8.1" +"/cupsReal8 9.1" +"/cupsReal9 10.1" +"/cupsReal10 11.1" +"/cupsReal11 12.1" +"/cupsReal12 13.1" +"/cupsReal13 14.1" +"/cupsReal14 15.1" +"/cupsReal15 16.1" +"/cupsString0(1)" +"/cupsString1(2)" +"/cupsString2(3)" +"/cupsString3(4)" +"/cupsString4(5)" +"/cupsString5(6)" +"/cupsString6(7)" +"/cupsString7(8)" +"/cupsString8(9)" +"/cupsString9(10)" +"/cupsString10(11)" +"/cupsString11(12)" +"/cupsString12(13)" +"/cupsString13(14)" +"/cupsString14(15)" +"/cupsString15(16)" +"/cupsMarkerType(Marker Type)" +"/cupsRenderingIntent(Rendering Intent)" +"/cupsPageSizeName(Letter)" +"/cupsPreferredBitsPerColor 17" +">> setpagedevice"; + +static cups_page_header2_t setpagedevice_header = +{ + "Media Class", /* MediaClass */ + "(Media Color)", /* MediaColor */ + "Media\\Type", /* MediaType */ + "Abc", /* OutputType */ + 1000, /* AdvanceDistance */ + CUPS_ADVANCE_FILE, /* AdvanceMedia */ + CUPS_FALSE, /* Collate */ + CUPS_CUT_JOB, /* CutMedia */ + CUPS_TRUE, /* Duplex */ + { 100, 200 }, /* HWResolution */ + { 0, 0, 0, 0 }, /* ImagingBoundingBox */ + CUPS_TRUE, /* InsertSheet */ + CUPS_JOG_SET, /* Jog */ + CUPS_EDGE_RIGHT, /* LeadingEdge */ + { 0, 0 }, /* Margins */ + CUPS_TRUE, /* ManualFeed */ + 0777, /* MediaPosition */ + 0xfe01, /* MediaWeight */ + CUPS_TRUE, /* MirrorPrint */ + CUPS_TRUE, /* NegativePrint */ + 1, /* NumCopies */ + CUPS_ORIENT_90, /* Orientation */ + CUPS_TRUE, /* OutputFaceUp */ + { 612, 792 }, /* PageSize */ + CUPS_TRUE, /* Separations */ + CUPS_TRUE, /* TraySwitch */ + CUPS_TRUE, /* Tumble */ + 0, /* cupsWidth */ + 0, /* cupsHeight */ + 2, /* cupsMediaType */ + 0, /* cupsBitsPerColor */ + 0, /* cupsBitsPerPixel */ + 0, /* cupsBytesPerLine */ + CUPS_ORDER_BANDED, /* cupsColorOrder */ + CUPS_CSPACE_RGB, /* cupsColorSpace */ + 1, /* cupsCompression */ + 1, /* cupsRowCount */ + 1, /* cupsRowFeed */ + 1, /* cupsRowStep */ + 0, /* cupsNumColors */ + 1.001, /* cupsBorderlessScalingFactor */ + { 612.0, 792.1 }, /* cupsPageSize */ + { 0.0, 0.0, 0.0, 0.0 }, /* cupsImagingBBox */ + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }, + /* cupsInteger[16] */ + { 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, 10.1, 11.1, 12.1, 13.1, + 14.1, 15.1, 16.1 }, /* cupsReal[16] */ + { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", + "14", "15", "16" }, /* cupsString[16] */ + "Marker Type", /* cupsMarkerType */ + "Rendering Intent", /* cupsRenderingIntent */ + "Letter" /* cupsPageSizeName */ +}; + + +/* + * Local functions... + */ + +static int do_ppd_tests(const char *filename, int num_options, + cups_option_t *options); +static int do_ps_tests(void); +static int do_ras_file(const char *filename); +static int do_raster_tests(cups_mode_t mode); +static void print_changes(cups_page_header2_t *header, + cups_page_header2_t *expected); + + +/* + * 'main()' - Test the raster functions. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int errors; /* Number of errors */ + const char *ext; /* Filename extension */ + + + if (argc == 1) + { + errors = do_ps_tests(); + errors += do_raster_tests(CUPS_RASTER_WRITE); + errors += do_raster_tests(CUPS_RASTER_WRITE_COMPRESSED); + errors += do_raster_tests(CUPS_RASTER_WRITE_PWG); + } + else + { + int i; /* Looping var */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + + + for (errors = 0, num_options = 0, options = NULL, i = 1; i < argc; i ++) + { + if (argv[i][0] == '-') + { + if (argv[i][1] == 'o') + { + if (argv[i][2]) + num_options = cupsParseOptions(argv[i] + 2, num_options, &options); + else + { + i ++; + if (i < argc) + num_options = cupsParseOptions(argv[i], num_options, &options); + else + { + puts("Usage: testraster [-o name=value ...] [filename.ppd ...]"); + puts(" testraster [filename.ras ...]"); + return (1); + } + } + } + else + { + puts("Usage: testraster [-o name=value ...] [filename.ppd ...]"); + puts(" testraster [filename.ras ...]"); + return (1); + } + } + else if ((ext = strrchr(argv[i], '.')) != NULL) + { + if (!strcmp(ext, ".ppd")) + errors += do_ppd_tests(argv[i], num_options, options); + else + errors += do_ras_file(argv[i]); + } + else + { + puts("Usage: testraster [-o name=value ...] [filename.ppd ...]"); + puts(" testraster [filename.ras ...]"); + return (1); + } + } + + cupsFreeOptions(num_options, options); + } + + return (errors); +} + + +/* + * 'do_ppd_tests()' - Test the default option commands in a PPD file. + */ + +static int /* O - Number of errors */ +do_ppd_tests(const char *filename, /* I - PPD file */ + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + ppd_file_t *ppd; /* PPD file data */ + cups_page_header2_t header; /* Page header */ + + + printf("\"%s\": ", filename); + fflush(stdout); + + if ((ppd = ppdOpenFile(filename)) == NULL) + { + ppd_status_t status; /* Status from PPD loader */ + int line; /* Line number containing error */ + + + status = ppdLastError(&line); + + puts("FAIL (bad PPD file)"); + printf(" %s on line %d\n", ppdErrorString(status), line); + + return (1); + } + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, NULL)) + { + puts("FAIL (error from function)"); + puts(cupsRasterErrorString()); + + return (1); + } + else + { + puts("PASS"); + + return (0); + } +} + + +/* + * 'do_ps_tests()' - Test standard PostScript commands. + */ + +static int +do_ps_tests(void) +{ + cups_page_header2_t header; /* Page header */ + int preferred_bits; /* Preferred bits */ + int errors = 0; /* Number of errors */ + + + /* + * Test PS exec code... + */ + + fputs("_cupsRasterExecPS(\"setpagedevice\"): ", stdout); + fflush(stdout); + + memset(&header, 0, sizeof(header)); + header.Collate = CUPS_TRUE; + preferred_bits = 0; + + if (_cupsRasterExecPS(&header, &preferred_bits, setpagedevice_code)) + { + puts("FAIL (error from function)"); + puts(cupsRasterErrorString()); + errors ++; + } + else if (preferred_bits != 17 || + memcmp(&header, &setpagedevice_header, sizeof(header))) + { + puts("FAIL (bad header)"); + + if (preferred_bits != 17) + printf(" cupsPreferredBitsPerColor %d, expected 17\n", + preferred_bits); + + print_changes(&setpagedevice_header, &header); + errors ++; + } + else + puts("PASS"); + + fputs("_cupsRasterExecPS(\"roll\"): ", stdout); + fflush(stdout); + + if (_cupsRasterExecPS(&header, &preferred_bits, + "792 612 0 0 0\n" + "pop pop pop\n" + "<>" + "setpagedevice\n")) + { + puts("FAIL (error from function)"); + puts(cupsRasterErrorString()); + errors ++; + } + else if (header.PageSize[0] != 792 || header.PageSize[1] != 612) + { + printf("FAIL (PageSize [%d %d], expected [792 612])\n", header.PageSize[0], + header.PageSize[1]); + errors ++; + } + else + puts("PASS"); + + fputs("_cupsRasterExecPS(\"dup index\"): ", stdout); + fflush(stdout); + + if (_cupsRasterExecPS(&header, &preferred_bits, + "true false dup\n" + "<>setpagedevice\n" + "pop pop pop")) + { + puts("FAIL (error from function)"); + puts(cupsRasterErrorString()); + errors ++; + } + else + { + if (!header.Collate) + { + printf("FAIL (Collate false, expected true)\n"); + errors ++; + } + + if (header.Duplex) + { + printf("FAIL (Duplex true, expected false)\n"); + errors ++; + } + + if (header.Tumble) + { + printf("FAIL (Tumble true, expected false)\n"); + errors ++; + } + + if(header.Collate && !header.Duplex && !header.Tumble) + puts("PASS"); + } + + fputs("_cupsRasterExecPS(\"%%Begin/EndFeature code\"): ", stdout); + fflush(stdout); + + if (_cupsRasterExecPS(&header, &preferred_bits, dsc_code)) + { + puts("FAIL (error from function)"); + puts(cupsRasterErrorString()); + errors ++; + } + else if (header.PageSize[0] != 792 || header.PageSize[1] != 1224) + { + printf("FAIL (bad PageSize [%d %d], expected [792 1224])\n", + header.PageSize[0], header.PageSize[1]); + errors ++; + } + else + puts("PASS"); + + return (errors); +} + + +/* + * 'do_ras_file()' - Test reading of a raster file. + */ + +static int /* O - Number of errors */ +do_ras_file(const char *filename) /* I - Filename */ +{ + unsigned y; /* Looping vars */ + int fd; /* File descriptor */ + cups_raster_t *ras; /* Raster stream */ + cups_page_header2_t header; /* Page header */ + unsigned char *data; /* Raster data */ + int errors = 0; /* Number of errors */ + unsigned pages = 0; /* Number of pages */ + + + if ((fd = open(filename, O_RDONLY)) < 0) + { + printf("%s: %s\n", filename, strerror(errno)); + return (1); + } + + if ((ras = cupsRasterOpen(fd, CUPS_RASTER_READ)) == NULL) + { + printf("%s: cupsRasterOpen failed.\n", filename); + close(fd); + return (1); + } + + printf("%s:\n", filename); + + while (cupsRasterReadHeader2(ras, &header)) + { + pages ++; + data = malloc(header.cupsBytesPerLine); + + printf(" Page %u: %ux%ux%u@%ux%udpi", pages, + header.cupsWidth, header.cupsHeight, header.cupsBitsPerPixel, + header.HWResolution[0], header.HWResolution[1]); + fflush(stdout); + + for (y = 0; y < header.cupsHeight; y ++) + if (cupsRasterReadPixels(ras, data, header.cupsBytesPerLine) < + header.cupsBytesPerLine) + break; + + if (y < header.cupsHeight) + printf(" ERROR AT LINE %d\n", y); + else + putchar('\n'); + + free(data); + } + + cupsRasterClose(ras); + close(fd); + + return (errors); +} + + +/* + * 'do_raster_tests()' - Test reading and writing of raster data. + */ + +static int /* O - Number of errors */ +do_raster_tests(cups_mode_t mode) /* O - Write mode */ +{ + int page, x, y; /* Looping vars */ + FILE *fp; /* Raster file */ + cups_raster_t *r; /* Raster stream */ + cups_page_header2_t header, /* Page header */ + expected; /* Expected page header */ + unsigned char data[2048]; /* Raster data */ + int errors = 0; /* Number of errors */ + + + /* + * Test writing... + */ + + printf("cupsRasterOpen(%s): ", + mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE" : + mode == CUPS_RASTER_WRITE ? "CUPS_RASTER_WRITE_COMPRESSED" : + "CUPS_RASTER_WRITE_PWG"); + fflush(stdout); + + if ((fp = fopen("test.raster", "wb")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + return (1); + } + + if ((r = cupsRasterOpen(fileno(fp), mode)) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + fclose(fp); + return (1); + } + + puts("PASS"); + + for (page = 0; page < 4; page ++) + { + memset(&header, 0, sizeof(header)); + header.cupsWidth = 256; + header.cupsHeight = 256; + header.cupsBytesPerLine = 256; + + if (page & 1) + { + header.cupsBytesPerLine *= 2; + header.cupsColorSpace = CUPS_CSPACE_CMYK; + header.cupsColorOrder = CUPS_ORDER_CHUNKED; + header.cupsNumColors = 4; + } + else + { + header.cupsColorSpace = CUPS_CSPACE_K; + header.cupsColorOrder = CUPS_ORDER_BANDED; + header.cupsNumColors = 1; + } + + if (page & 2) + { + header.cupsBytesPerLine *= 2; + header.cupsBitsPerColor = 16; + header.cupsBitsPerPixel = (page & 1) ? 64 : 16; + } + else + { + header.cupsBitsPerColor = 8; + header.cupsBitsPerPixel = (page & 1) ? 32 : 8; + } + + if (cupsRasterWriteHeader2(r, &header)) + puts("cupsRasterWriteHeader2: PASS"); + else + { + puts("cupsRasterWriteHeader2: FAIL"); + errors ++; + } + + fputs("cupsRasterWritePixels: ", stdout); + fflush(stdout); + + memset(data, 0, header.cupsBytesPerLine); + for (y = 0; y < 64; y ++) + if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) + break; + + if (y < 64) + { + puts("FAIL"); + errors ++; + } + else + { + for (x = 0; x < header.cupsBytesPerLine; x ++) + data[x] = x; + + for (y = 0; y < 64; y ++) + if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) + break; + + if (y < 64) + { + puts("FAIL"); + errors ++; + } + else + { + memset(data, 255, header.cupsBytesPerLine); + for (y = 0; y < 64; y ++) + if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) + break; + + if (y < 64) + { + puts("FAIL"); + errors ++; + } + else + { + for (x = 0; x < header.cupsBytesPerLine; x ++) + data[x] = x / 4; + + for (y = 0; y < 64; y ++) + if (!cupsRasterWritePixels(r, data, header.cupsBytesPerLine)) + break; + + if (y < 64) + { + puts("FAIL"); + errors ++; + } + else + puts("PASS"); + } + } + } + } + + cupsRasterClose(r); + fclose(fp); + + /* + * Test reading... + */ + + fputs("cupsRasterOpen(CUPS_RASTER_READ): ", stdout); + fflush(stdout); + + if ((fp = fopen("test.raster", "rb")) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + return (1); + } + + if ((r = cupsRasterOpen(fileno(fp), CUPS_RASTER_READ)) == NULL) + { + printf("FAIL (%s)\n", strerror(errno)); + fclose(fp); + return (1); + } + + puts("PASS"); + + for (page = 0; page < 4; page ++) + { + memset(&expected, 0, sizeof(expected)); + expected.cupsWidth = 256; + expected.cupsHeight = 256; + expected.cupsBytesPerLine = 256; + + if (mode == CUPS_RASTER_WRITE_PWG) + { + strlcpy(expected.MediaClass, "PwgRaster", sizeof(expected.MediaClass)); + expected.cupsInteger[7] = 0xffffff; + } + + if (page & 1) + { + expected.cupsBytesPerLine *= 2; + expected.cupsColorSpace = CUPS_CSPACE_CMYK; + expected.cupsColorOrder = CUPS_ORDER_CHUNKED; + expected.cupsNumColors = 4; + } + else + { + expected.cupsColorSpace = CUPS_CSPACE_K; + expected.cupsColorOrder = CUPS_ORDER_BANDED; + expected.cupsNumColors = 1; + } + + if (page & 2) + { + expected.cupsBytesPerLine *= 2; + expected.cupsBitsPerColor = 16; + expected.cupsBitsPerPixel = (page & 1) ? 64 : 16; + } + else + { + expected.cupsBitsPerColor = 8; + expected.cupsBitsPerPixel = (page & 1) ? 32 : 8; + } + + fputs("cupsRasterReadHeader2: ", stdout); + fflush(stdout); + + if (!cupsRasterReadHeader2(r, &header)) + { + puts("FAIL (read error)"); + errors ++; + break; + } + + if (memcmp(&header, &expected, sizeof(header))) + { + puts("FAIL (bad page header)"); + errors ++; + print_changes(&header, &expected); + } + + fputs("cupsRasterReadPixels: ", stdout); + fflush(stdout); + + for (y = 0; y < 64; y ++) + { + if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) + { + puts("FAIL (read error)"); + errors ++; + break; + } + + if (data[0] != 0 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) + { + printf("FAIL (raster line %d corrupt)\n", y); + errors ++; + break; + } + } + + if (y == 64) + { + for (y = 0; y < 64; y ++) + { + if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) + { + puts("FAIL (read error)"); + errors ++; + break; + } + + for (x = 0; x < header.cupsBytesPerLine; x ++) + if (data[x] != (x & 255)) + break; + + if (x < header.cupsBytesPerLine) + { + printf("FAIL (raster line %d corrupt)\n", y + 64); + errors ++; + break; + } + } + + if (y == 64) + { + for (y = 0; y < 64; y ++) + { + if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) + { + puts("FAIL (read error)"); + errors ++; + break; + } + + if (data[0] != 255 || memcmp(data, data + 1, header.cupsBytesPerLine - 1)) + { + printf("fail (raster line %d corrupt)\n", y + 128); + errors ++; + break; + } + } + + if (y == 64) + { + for (y = 0; y < 64; y ++) + { + if (!cupsRasterReadPixels(r, data, header.cupsBytesPerLine)) + { + puts("FAIL (read error)"); + errors ++; + break; + } + + for (x = 0; x < header.cupsBytesPerLine; x ++) + if (data[x] != ((x / 4) & 255)) + break; + + if (x < header.cupsBytesPerLine) + { + printf("FAIL (raster line %d corrupt)\n", y + 192); + errors ++; + break; + } + } + + if (y == 64) + puts("PASS"); + } + } + } + } + + cupsRasterClose(r); + fclose(fp); + + return (errors); +} + + +/* + * 'print_changes()' - Print differences in the page header. + */ + +static void +print_changes( + cups_page_header2_t *header, /* I - Actual page header */ + cups_page_header2_t *expected) /* I - Expected page header */ +{ + int i; /* Looping var */ + + + if (strcmp(header->MediaClass, expected->MediaClass)) + printf(" MediaClass (%s), expected (%s)\n", header->MediaClass, + expected->MediaClass); + + if (strcmp(header->MediaColor, expected->MediaColor)) + printf(" MediaColor (%s), expected (%s)\n", header->MediaColor, + expected->MediaColor); + + if (strcmp(header->MediaType, expected->MediaType)) + printf(" MediaType (%s), expected (%s)\n", header->MediaType, + expected->MediaType); + + if (strcmp(header->OutputType, expected->OutputType)) + printf(" OutputType (%s), expected (%s)\n", header->OutputType, + expected->OutputType); + + if (header->AdvanceDistance != expected->AdvanceDistance) + printf(" AdvanceDistance %d, expected %d\n", header->AdvanceDistance, + expected->AdvanceDistance); + + if (header->AdvanceMedia != expected->AdvanceMedia) + printf(" AdvanceMedia %d, expected %d\n", header->AdvanceMedia, + expected->AdvanceMedia); + + if (header->Collate != expected->Collate) + printf(" Collate %d, expected %d\n", header->Collate, + expected->Collate); + + if (header->CutMedia != expected->CutMedia) + printf(" CutMedia %d, expected %d\n", header->CutMedia, + expected->CutMedia); + + if (header->Duplex != expected->Duplex) + printf(" Duplex %d, expected %d\n", header->Duplex, + expected->Duplex); + + if (header->HWResolution[0] != expected->HWResolution[0] || + header->HWResolution[1] != expected->HWResolution[1]) + printf(" HWResolution [%d %d], expected [%d %d]\n", + header->HWResolution[0], header->HWResolution[1], + expected->HWResolution[0], expected->HWResolution[1]); + + if (memcmp(header->ImagingBoundingBox, expected->ImagingBoundingBox, + sizeof(header->ImagingBoundingBox))) + printf(" ImagingBoundingBox [%d %d %d %d], expected [%d %d %d %d]\n", + header->ImagingBoundingBox[0], + header->ImagingBoundingBox[1], + header->ImagingBoundingBox[2], + header->ImagingBoundingBox[3], + expected->ImagingBoundingBox[0], + expected->ImagingBoundingBox[1], + expected->ImagingBoundingBox[2], + expected->ImagingBoundingBox[3]); + + if (header->InsertSheet != expected->InsertSheet) + printf(" InsertSheet %d, expected %d\n", header->InsertSheet, + expected->InsertSheet); + + if (header->Jog != expected->Jog) + printf(" Jog %d, expected %d\n", header->Jog, + expected->Jog); + + if (header->LeadingEdge != expected->LeadingEdge) + printf(" LeadingEdge %d, expected %d\n", header->LeadingEdge, + expected->LeadingEdge); + + if (header->Margins[0] != expected->Margins[0] || + header->Margins[1] != expected->Margins[1]) + printf(" Margins [%d %d], expected [%d %d]\n", + header->Margins[0], header->Margins[1], + expected->Margins[0], expected->Margins[1]); + + if (header->ManualFeed != expected->ManualFeed) + printf(" ManualFeed %d, expected %d\n", header->ManualFeed, + expected->ManualFeed); + + if (header->MediaPosition != expected->MediaPosition) + printf(" MediaPosition %d, expected %d\n", header->MediaPosition, + expected->MediaPosition); + + if (header->MediaWeight != expected->MediaWeight) + printf(" MediaWeight %d, expected %d\n", header->MediaWeight, + expected->MediaWeight); + + if (header->MirrorPrint != expected->MirrorPrint) + printf(" MirrorPrint %d, expected %d\n", header->MirrorPrint, + expected->MirrorPrint); + + if (header->NegativePrint != expected->NegativePrint) + printf(" NegativePrint %d, expected %d\n", header->NegativePrint, + expected->NegativePrint); + + if (header->NumCopies != expected->NumCopies) + printf(" NumCopies %d, expected %d\n", header->NumCopies, + expected->NumCopies); + + if (header->Orientation != expected->Orientation) + printf(" Orientation %d, expected %d\n", header->Orientation, + expected->Orientation); + + if (header->OutputFaceUp != expected->OutputFaceUp) + printf(" OutputFaceUp %d, expected %d\n", header->OutputFaceUp, + expected->OutputFaceUp); + + if (header->PageSize[0] != expected->PageSize[0] || + header->PageSize[1] != expected->PageSize[1]) + printf(" PageSize [%d %d], expected [%d %d]\n", + header->PageSize[0], header->PageSize[1], + expected->PageSize[0], expected->PageSize[1]); + + if (header->Separations != expected->Separations) + printf(" Separations %d, expected %d\n", header->Separations, + expected->Separations); + + if (header->TraySwitch != expected->TraySwitch) + printf(" TraySwitch %d, expected %d\n", header->TraySwitch, + expected->TraySwitch); + + if (header->Tumble != expected->Tumble) + printf(" Tumble %d, expected %d\n", header->Tumble, + expected->Tumble); + + if (header->cupsWidth != expected->cupsWidth) + printf(" cupsWidth %d, expected %d\n", header->cupsWidth, + expected->cupsWidth); + + if (header->cupsHeight != expected->cupsHeight) + printf(" cupsHeight %d, expected %d\n", header->cupsHeight, + expected->cupsHeight); + + if (header->cupsMediaType != expected->cupsMediaType) + printf(" cupsMediaType %d, expected %d\n", header->cupsMediaType, + expected->cupsMediaType); + + if (header->cupsBitsPerColor != expected->cupsBitsPerColor) + printf(" cupsBitsPerColor %d, expected %d\n", header->cupsBitsPerColor, + expected->cupsBitsPerColor); + + if (header->cupsBitsPerPixel != expected->cupsBitsPerPixel) + printf(" cupsBitsPerPixel %d, expected %d\n", header->cupsBitsPerPixel, + expected->cupsBitsPerPixel); + + if (header->cupsBytesPerLine != expected->cupsBytesPerLine) + printf(" cupsBytesPerLine %d, expected %d\n", header->cupsBytesPerLine, + expected->cupsBytesPerLine); + + if (header->cupsColorOrder != expected->cupsColorOrder) + printf(" cupsColorOrder %d, expected %d\n", header->cupsColorOrder, + expected->cupsColorOrder); + + if (header->cupsColorSpace != expected->cupsColorSpace) + printf(" cupsColorSpace %d, expected %d\n", header->cupsColorSpace, + expected->cupsColorSpace); + + if (header->cupsCompression != expected->cupsCompression) + printf(" cupsCompression %d, expected %d\n", header->cupsCompression, + expected->cupsCompression); + + if (header->cupsRowCount != expected->cupsRowCount) + printf(" cupsRowCount %d, expected %d\n", header->cupsRowCount, + expected->cupsRowCount); + + if (header->cupsRowFeed != expected->cupsRowFeed) + printf(" cupsRowFeed %d, expected %d\n", header->cupsRowFeed, + expected->cupsRowFeed); + + if (header->cupsRowStep != expected->cupsRowStep) + printf(" cupsRowStep %d, expected %d\n", header->cupsRowStep, + expected->cupsRowStep); + + if (header->cupsNumColors != expected->cupsNumColors) + printf(" cupsNumColors %d, expected %d\n", header->cupsNumColors, + expected->cupsNumColors); + + if (header->cupsBorderlessScalingFactor != + expected->cupsBorderlessScalingFactor) + printf(" cupsBorderlessScalingFactor %g, expected %g\n", + header->cupsBorderlessScalingFactor, + expected->cupsBorderlessScalingFactor); + + if (header->cupsPageSize[0] != expected->cupsPageSize[0] || + header->cupsPageSize[1] != expected->cupsPageSize[1]) + printf(" cupsPageSize [%g %g], expected [%g %g]\n", + header->cupsPageSize[0], header->cupsPageSize[1], + expected->cupsPageSize[0], expected->cupsPageSize[1]); + + if (header->cupsImagingBBox[0] != expected->cupsImagingBBox[0] || + header->cupsImagingBBox[1] != expected->cupsImagingBBox[1] || + header->cupsImagingBBox[2] != expected->cupsImagingBBox[2] || + header->cupsImagingBBox[3] != expected->cupsImagingBBox[3]) + printf(" cupsImagingBBox [%g %g %g %g], expected [%g %g %g %g]\n", + header->cupsImagingBBox[0], header->cupsImagingBBox[1], + header->cupsImagingBBox[2], header->cupsImagingBBox[3], + expected->cupsImagingBBox[0], expected->cupsImagingBBox[1], + expected->cupsImagingBBox[2], expected->cupsImagingBBox[3]); + + for (i = 0; i < 16; i ++) + if (header->cupsInteger[i] != expected->cupsInteger[i]) + printf(" cupsInteger%d %d, expected %d\n", i, header->cupsInteger[i], + expected->cupsInteger[i]); + + for (i = 0; i < 16; i ++) + if (header->cupsReal[i] != expected->cupsReal[i]) + printf(" cupsReal%d %g, expected %g\n", i, header->cupsReal[i], + expected->cupsReal[i]); + + for (i = 0; i < 16; i ++) + if (strcmp(header->cupsString[i], expected->cupsString[i])) + printf(" cupsString%d (%s), expected (%s)\n", i, + header->cupsString[i], expected->cupsString[i]); + + if (strcmp(header->cupsMarkerType, expected->cupsMarkerType)) + printf(" cupsMarkerType (%s), expected (%s)\n", header->cupsMarkerType, + expected->cupsMarkerType); + + if (strcmp(header->cupsRenderingIntent, expected->cupsRenderingIntent)) + printf(" cupsRenderingIntent (%s), expected (%s)\n", + header->cupsRenderingIntent, + expected->cupsRenderingIntent); + + if (strcmp(header->cupsPageSizeName, expected->cupsPageSizeName)) + printf(" cupsPageSizeName (%s), expected (%s)\n", + header->cupsPageSizeName, + expected->cupsPageSizeName); +} + + +/* + * End of "$Id: testraster.c 9870 2011-08-06 06:32:26Z mike $". + */ diff --git a/filter/textcommon.c b/filter/textcommon.c new file mode 100644 index 0000000..999e3a5 --- /dev/null +++ b/filter/textcommon.c @@ -0,0 +1,1214 @@ +/* + * "$Id: textcommon.c 9793 2011-05-20 03:49:49Z mike $" + * + * Common text filter routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * TextMain() - Standard main entry for text filters. + * compare_keywords() - Compare two C/C++ keywords. + * getutf8() - Get a UTF-8 encoded wide character... + */ + +/* + * Include necessary headers... + */ + +#include "textcommon.h" +#include + + +/* + * Globals... + */ + +int WrapLines = 1, /* Wrap text in lines */ + SizeLines = 60, /* Number of lines on a page */ + SizeColumns = 80, /* Number of columns on a line */ + PageColumns = 1, /* Number of columns on a page */ + ColumnGutter = 0, /* Number of characters between text columns */ + ColumnWidth = 80, /* Width of each column */ + PrettyPrint = 0, /* Do pretty code formatting */ + Copies = 1; /* Number of copies */ +lchar_t **Page = NULL; /* Page characters */ +int NumPages = 0; /* Number of pages in document */ +float CharsPerInch = 10; /* Number of character columns per inch */ +float LinesPerInch = 6; /* Number of lines per inch */ +int NumKeywords = 0; /* Number of known keywords */ +char **Keywords = NULL; /* List of known keywords */ + + +/* + * Local globals... + */ + +static char *code_keywords[] = /* List of known C/C++ keywords... */ + { + "and", + "and_eq", + "asm", + "auto", + "bitand", + "bitor", + "bool", + "break", + "case", + "catch", + "char", + "class", + "compl", + "const", + "const_cast", + "continue", + "default", + "delete", + "do", + "double", + "dynamic_cast", + "else", + "enum", + "explicit", + "extern", + "false", + "float", + "for", + "friend", + "goto", + "if", + "inline", + "int", + "long", + "mutable", + "namespace", + "new", + "not", + "not_eq", + "operator", + "or", + "or_eq", + "private", + "protected", + "public", + "register", + "reinterpret_cast", + "return", + "short", + "signed", + "sizeof", + "static", + "static_cast", + "struct", + "switch", + "template", + "this", + "throw", + "true", + "try", + "typedef", + "typename", + "union", + "unsigned", + "virtual", + "void", + "volatile", + "while", + "xor", + "xor_eq" + }, + *sh_keywords[] = /* List of known Boure/Korn/zsh/bash keywords... */ + { + "alias", + "bg", + "break", + "case", + "cd", + "command", + "continue", + "do", + "done", + "echo", + "elif", + "else", + "esac", + "eval", + "exec", + "exit", + "export", + "fc", + "fg", + "fi", + "for", + "function", + "getopts", + "if", + "in", + "jobs", + "kill", + "let", + "limit", + "newgrp", + "print", + "pwd", + "read", + "readonly", + "return", + "select", + "set", + "shift", + "test", + "then", + "time", + "times", + "trap", + "typeset", + "ulimit", + "umask", + "unalias", + "unlimit", + "unset", + "until", + "wait", + "whence" + "while", + }, + *csh_keywords[] = /* List of known csh/tcsh keywords... */ + { + "alias", + "aliases", + "bg", + "bindkey", + "break", + "breaksw", + "builtins", + "case", + "cd", + "chdir", + "complete", + "continue", + "default", + "dirs", + "echo", + "echotc", + "else", + "end", + "endif", + "eval", + "exec", + "exit", + "fg", + "foreach", + "glob", + "goto", + "history", + "if", + "jobs", + "kill", + "limit", + "login", + "logout", + "ls", + "nice", + "nohup", + "notify", + "onintr", + "popd", + "pushd", + "pwd", + "rehash", + "repeat", + "set", + "setenv", + "settc", + "shift", + "source", + "stop", + "suspend", + "switch", + "telltc", + "then", + "time", + "umask", + "unalias", + "unbindkey", + "unhash", + "unlimit", + "unset", + "unsetenv", + "wait", + "where", + "which", + "while" + }, + *perl_keywords[] = /* List of known perl keywords... */ + { + "abs", + "accept", + "alarm", + "and", + "atan2", + "bind", + "binmode", + "bless", + "caller", + "chdir", + "chmod", + "chomp", + "chop", + "chown", + "chr", + "chroot", + "closdir", + "close", + "connect", + "continue", + "cos", + "crypt", + "dbmclose", + "dbmopen", + "defined", + "delete", + "die", + "do", + "dump", + "each", + "else", + "elsif", + "endgrent", + "endhostent", + "endnetent", + "endprotoent", + "endpwent", + "endservent", + "eof", + "eval", + "exec", + "exists", + "exit", + "exp", + "fcntl", + "fileno", + "flock", + "for", + "foreach", + "fork", + "format", + "formline", + "getc", + "getgrent", + "getgrgid", + "getgrnam", + "gethostbyaddr", + "gethostbyname", + "gethostent", + "getlogin", + "getnetbyaddr", + "getnetbyname", + "getnetent", + "getpeername", + "getpgrp", + "getppid", + "getpriority", + "getprotobyname", + "getprotobynumber", + "getprotoent", + "getpwent", + "getpwnam", + "getpwuid", + "getservbyname", + "getservbyport", + "getservent", + "getsockname", + "getsockopt", + "glob", + "gmtime", + "goto", + "grep", + "hex", + "if", + "import", + "index", + "int", + "ioctl", + "join", + "keys", + "kill", + "last", + "lc", + "lcfirst", + "length", + "link", + "listen", + "local", + "localtime", + "log", + "lstat", + "map", + "mkdir", + "msgctl", + "msgget", + "msgrcv", + "msgsend", + "my", + "next", + "no", + "not", + "oct", + "open", + "opendir", + "or", + "ord", + "pack", + "package", + "pipe", + "pop", + "pos", + "print", + "printf", + "push", + "quotemeta", + "rand", + "read", + "readdir", + "readlink", + "recv", + "redo", + "ref", + "rename", + "require", + "reset", + "return", + "reverse", + "rewinddir", + "rindex", + "rmdir", + "scalar", + "seek", + "seekdir", + "select", + "semctl", + "semget", + "semop", + "send", + "setgrent", + "sethostent", + "setnetent", + "setpgrp", + "setpriority", + "setprotoent", + "setpwent", + "setservent", + "setsockopt", + "shift", + "shmctl", + "shmget", + "shmread", + "shmwrite", + "shutdown", + "sin", + "sleep", + "socket", + "socketpair", + "sort", + "splice", + "split", + "sprintf", + "sqrt", + "srand", + "stat", + "study", + "sub", + "substr", + "symlink", + "syscall", + "sysread", + "sysseek", + "system", + "syswrite", + "tell", + "telldir", + "tie", + "tied", + "time", + "times" + "times", + "truncate", + "uc", + "ucfirst", + "umask", + "undef", + "unless", + "unlink", + "unpack", + "unshift", + "untie", + "until", + "use", + "utime", + "values", + "vec", + "wait", + "waitpid", + "wantarray", + "warn", + "while", + "write" + }; + + +/* + * Local functions... + */ + +static int compare_keywords(const void *, const void *); +static int getutf8(FILE *fp); + + +/* + * 'TextMain()' - Standard main entry for text filters. + */ + +int /* O - Exit status */ +TextMain(const char *name, /* I - Name of filter */ + int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* Print file */ + ppd_file_t *ppd; /* PPD file */ + int i, /* Looping var */ + ch, /* Current char from file */ + lastch, /* Previous char from file */ + attr, /* Current attribute */ + line, /* Current line */ + column, /* Current column */ + page_column; /* Current page column */ + int num_options; /* Number of print options */ + cups_option_t *options; /* Print options */ + const char *val; /* Option value */ + char keyword[64], /* Keyword string */ + *keyptr; /* Pointer into string */ + int keycol; /* Column where keyword starts */ + int ccomment; /* Inside a C-style comment? */ + int cstring; /* Inside a C string */ + + + /* + * Make sure status messages are not buffered... + */ + + setbuf(stderr, NULL); + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + name); + return (1); + } + + /* + * If we have 7 arguments, print the file named on the command-line. + * Otherwise, send stdin instead... + */ + + if (argc == 6) + fp = stdin; + else + { + /* + * Try to open the print file... + */ + + if ((fp = fopen(argv[6], "rb")) == NULL) + { + perror("DEBUG: unable to open print file - "); + return (1); + } + } + + /* + * Process command-line options and write the prolog... + */ + + options = NULL; + num_options = cupsParseOptions(argv[5], 0, &options); + + if ((val = cupsGetOption("prettyprint", num_options, options)) != NULL && + _cups_strcasecmp(val, "no") && _cups_strcasecmp(val, "off") && + _cups_strcasecmp(val, "false")) + { + PageLeft = 72.0f; + PageRight = PageWidth - 36.0f; + PageBottom = PageBottom > 36.0f ? PageBottom : 36.0f; + PageTop = PageLength - 36.0f; + CharsPerInch = 12; + LinesPerInch = 8; + + if ((val = getenv("CONTENT_TYPE")) == NULL) + { + PrettyPrint = PRETTY_PLAIN; + NumKeywords = 0; + Keywords = NULL; + } + else if (_cups_strcasecmp(val, "application/x-cshell") == 0) + { + PrettyPrint = PRETTY_SHELL; + NumKeywords = sizeof(csh_keywords) / sizeof(csh_keywords[0]); + Keywords = csh_keywords; + } + else if (_cups_strcasecmp(val, "application/x-csource") == 0) + { + PrettyPrint = PRETTY_CODE; + NumKeywords = sizeof(code_keywords) / sizeof(code_keywords[0]); + Keywords = code_keywords; + } + else if (_cups_strcasecmp(val, "application/x-perl") == 0) + { + PrettyPrint = PRETTY_PERL; + NumKeywords = sizeof(perl_keywords) / sizeof(perl_keywords[0]); + Keywords = perl_keywords; + } + else if (_cups_strcasecmp(val, "application/x-shell") == 0) + { + PrettyPrint = PRETTY_SHELL; + NumKeywords = sizeof(sh_keywords) / sizeof(sh_keywords[0]); + Keywords = sh_keywords; + } + else + { + PrettyPrint = PRETTY_PLAIN; + NumKeywords = 0; + Keywords = NULL; + } + } + + ppd = SetCommonOptions(num_options, options, 1); + + if ((val = cupsGetOption("wrap", num_options, options)) == NULL) + WrapLines = 1; + else + WrapLines = !_cups_strcasecmp(val, "true") || !_cups_strcasecmp(val, "on") || + !_cups_strcasecmp(val, "yes"); + + if ((val = cupsGetOption("columns", num_options, options)) != NULL) + { + PageColumns = atoi(val); + + if (PageColumns < 1) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad columns value %d."), + PageColumns); + return (1); + } + } + + if ((val = cupsGetOption("cpi", num_options, options)) != NULL) + { + CharsPerInch = atof(val); + + if (CharsPerInch <= 0.0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad cpi value %f."), + CharsPerInch); + return (1); + } + } + + if ((val = cupsGetOption("lpi", num_options, options)) != NULL) + { + LinesPerInch = atof(val); + + if (LinesPerInch <= 0.0) + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad lpi value %f."), + LinesPerInch); + return (1); + } + } + + if (PrettyPrint) + PageTop -= 216.0f / LinesPerInch; + + Copies = atoi(argv[4]); + + WriteProlog(argv[3], argv[2], getenv("CLASSIFICATION"), + cupsGetOption("page-label", num_options, options), ppd); + + /* + * Read text from the specified source and print it... + */ + + lastch = 0; + column = 0; + line = 0; + page_column = 0; + attr = 0; + keyptr = keyword; + keycol = 0; + ccomment = 0; + cstring = 0; + + while ((ch = getutf8(fp)) >= 0) + { + /* + * Control codes: + * + * BS Backspace (0x08) + * HT Horizontal tab; next 8th column (0x09) + * LF Line feed; forward full line (0x0a) + * VT Vertical tab; reverse full line (0x0b) + * FF Form feed (0x0c) + * CR Carriage return (0x0d) + * ESC 7 Reverse full line (0x1b 0x37) + * ESC 8 Reverse half line (0x1b 0x38) + * ESC 9 Forward half line (0x1b 0x39) + */ + + switch (ch) + { + case 0x08 : /* BS - backspace for boldface & underline */ + if (column > 0) + column --; + + keyptr = keyword; + keycol = column; + break; + + case 0x09 : /* HT - tab to next 8th column */ + if (PrettyPrint && keyptr > keyword) + { + *keyptr = '\0'; + keyptr = keyword; + + if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), + compare_keywords)) + { + /* + * Put keywords in boldface... + */ + + i = page_column * (ColumnWidth + ColumnGutter); + + while (keycol < column) + { + Page[line][keycol + i].attr |= ATTR_BOLD; + keycol ++; + } + } + } + + column = (column + 8) & ~7; + + if (column >= ColumnWidth && WrapLines) + { /* Wrap text to margins */ + line ++; + column = 0; + + if (line >= SizeLines) + { + page_column ++; + line = 0; + + if (page_column >= PageColumns) + { + WritePage(); + page_column = 0; + } + } + } + + keycol = column; + + attr &= ~ATTR_BOLD; + break; + + case 0x0d : /* CR */ +#ifndef __APPLE__ + /* + * All but MacOS/Darwin treat CR as was intended by ANSI + * folks, namely to move to column 0/1. Some programs still + * use this to do boldfacing and underlining... + */ + + column = 0; + break; +#else + /* + * MacOS/Darwin still need to treat CR as a line ending. + */ + + { + int nextch; + if ((nextch = getc(fp)) != 0x0a) + ungetc(nextch, fp); + else + ch = nextch; + } +#endif /* !__APPLE__ */ + + case 0x0a : /* LF - output current line */ + if (PrettyPrint && keyptr > keyword) + { + *keyptr = '\0'; + keyptr = keyword; + + if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), + compare_keywords)) + { + /* + * Put keywords in boldface... + */ + + i = page_column * (ColumnWidth + ColumnGutter); + + while (keycol < column) + { + Page[line][keycol + i].attr |= ATTR_BOLD; + keycol ++; + } + } + } + + line ++; + column = 0; + keycol = 0; + + if (!ccomment && !cstring) + attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); + + if (line >= SizeLines) + { + page_column ++; + line = 0; + + if (page_column >= PageColumns) + { + WritePage(); + page_column = 0; + } + } + break; + + case 0x0b : /* VT - move up 1 line */ + if (line > 0) + line --; + + keyptr = keyword; + keycol = column; + + if (!ccomment && !cstring) + attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); + break; + + case 0x0c : /* FF - eject current page... */ + if (PrettyPrint && keyptr > keyword) + { + *keyptr = '\0'; + keyptr = keyword; + + if (bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), + compare_keywords)) + { + /* + * Put keywords in boldface... + */ + + i = page_column * (ColumnWidth + ColumnGutter); + + while (keycol < column) + { + Page[line][keycol + i].attr |= ATTR_BOLD; + keycol ++; + } + } + } + + page_column ++; + column = 0; + keycol = 0; + line = 0; + + if (!ccomment && !cstring) + attr &= ~(ATTR_ITALIC | ATTR_BOLD | ATTR_RED | ATTR_GREEN | ATTR_BLUE); + + if (page_column >= PageColumns) + { + WritePage(); + page_column = 0; + } + break; + + case 0x1b : /* Escape sequence */ + ch = getutf8(fp); + if (ch == '7') + { + /* + * ESC 7 Reverse full line (0x1b 0x37) + */ + + if (line > 0) + line --; + } + else if (ch == '8') + { + /* + * ESC 8 Reverse half line (0x1b 0x38) + */ + + if ((attr & ATTR_RAISED) && line > 0) + { + attr &= ~ATTR_RAISED; + line --; + } + else if (attr & ATTR_LOWERED) + attr &= ~ATTR_LOWERED; + else + attr |= ATTR_RAISED; + } + else if (ch == '9') + { + /* + * ESC 9 Forward half line (0x1b 0x39) + */ + + if ((attr & ATTR_LOWERED) && line < (SizeLines - 1)) + { + attr &= ~ATTR_LOWERED; + line ++; + } + else if (attr & ATTR_RAISED) + attr &= ~ATTR_RAISED; + else + attr |= ATTR_LOWERED; + } + break; + + default : /* All others... */ + if (ch < ' ') + break; /* Ignore other control chars */ + + if (PrettyPrint > PRETTY_PLAIN) + { + /* + * Do highlighting of C/C++ keywords, preprocessor commands, + * and comments... + */ + + if (ch == ' ' && (attr & ATTR_BOLD)) + { + /* + * Stop bolding preprocessor command... + */ + + attr &= ~ATTR_BOLD; + } + else if (!(isalnum(ch & 255) || ch == '_') && keyptr > keyword) + { + /* + * Look for a keyword... + */ + + *keyptr = '\0'; + keyptr = keyword; + + if (!(attr & ATTR_ITALIC) && + bsearch(&keyptr, Keywords, NumKeywords, sizeof(char *), + compare_keywords)) + { + /* + * Put keywords in boldface... + */ + + i = page_column * (ColumnWidth + ColumnGutter); + + while (keycol < column) + { + Page[line][keycol + i].attr |= ATTR_BOLD; + keycol ++; + } + } + } + else if ((isalnum(ch & 255) || ch == '_') && !ccomment && !cstring) + { + /* + * Add characters to the current keyword (if they'll fit). + */ + + if (keyptr == keyword) + keycol = column; + + if (keyptr < (keyword + sizeof(keyword) - 1)) + *keyptr++ = ch; + } + else if (ch == '\"' && lastch != '\\' && !ccomment && !cstring) + { + /* + * Start a C string constant... + */ + + cstring = -1; + attr = ATTR_BLUE; + } + else if (ch == '*' && lastch == '/' && !cstring && + PrettyPrint != PRETTY_SHELL) + { + /* + * Start a C-style comment... + */ + + ccomment = 1; + attr = ATTR_ITALIC | ATTR_GREEN; + } + else if (ch == '/' && lastch == '/' && !cstring && + PrettyPrint == PRETTY_CODE) + { + /* + * Start a C++-style comment... + */ + + attr = ATTR_ITALIC | ATTR_GREEN; + } + else if (ch == '#' && !cstring && PrettyPrint != PRETTY_CODE) + { + /* + * Start a shell-style comment... + */ + + attr = ATTR_ITALIC | ATTR_GREEN; + } + else if (ch == '#' && column == 0 && !ccomment && !cstring && + PrettyPrint == PRETTY_CODE) + { + /* + * Start a preprocessor command... + */ + + attr = ATTR_BOLD | ATTR_RED; + } + } + + if (column >= ColumnWidth && WrapLines) + { /* Wrap text to margins */ + column = 0; + line ++; + + if (line >= SizeLines) + { + page_column ++; + line = 0; + + if (page_column >= PageColumns) + { + WritePage(); + page_column = 0; + } + } + } + + /* + * Add text to the current column & line... + */ + + if (column < ColumnWidth) + { + i = column + page_column * (ColumnWidth + ColumnGutter); + + if (PrettyPrint) + Page[line][i].attr = attr; + else if (ch == ' ' && Page[line][i].ch) + ch = Page[line][i].ch; + else if (ch == Page[line][i].ch) + Page[line][i].attr |= ATTR_BOLD; + else if (Page[line][i].ch == '_') + Page[line][i].attr |= ATTR_UNDERLINE; + else if (ch == '_') + { + Page[line][i].attr |= ATTR_UNDERLINE; + + if (Page[line][i].ch) + ch = Page[line][i].ch; + } + else + Page[line][i].attr = attr; + + Page[line][i].ch = ch; + } + + if (PrettyPrint) + { + if ((ch == '{' || ch == '}') && !ccomment && !cstring && + column < ColumnWidth) + { + /* + * Highlight curley braces... + */ + + Page[line][column].attr |= ATTR_BOLD; + } + else if ((ch == '/' || ch == '*') && lastch == '/' && + column < ColumnWidth && PrettyPrint != PRETTY_SHELL) + { + /* + * Highlight first comment character... + */ + + Page[line][column - 1].attr = attr; + } + else if (ch == '\"' && lastch != '\\' && !ccomment && cstring > 0) + { + /* + * End a C string constant... + */ + + cstring = 0; + attr &= ~ATTR_BLUE; + } + else if (ch == '/' && lastch == '*' && ccomment) + { + /* + * End a C-style comment... + */ + + ccomment = 0; + attr &= ~(ATTR_ITALIC | ATTR_GREEN); + } + + if (cstring < 0) + cstring = 1; + } + + column ++; + break; + } + + /* + * Save this character for the next cycle. + */ + + lastch = ch; + } + + /* + * Write any remaining page data... + */ + + if (line > 0 || page_column > 0 || column > 0) + WritePage(); + + /* + * Write the epilog and return... + */ + + WriteEpilogue(); + + if (ppd != NULL) + ppdClose(ppd); + + return (0); +} + + +/* + * 'compare_keywords()' - Compare two C/C++ keywords. + */ + +static int /* O - Result of strcmp */ +compare_keywords(const void *k1, /* I - First keyword */ + const void *k2) /* I - Second keyword */ +{ + return (strcmp(*((const char **)k1), *((const char **)k2))); +} + + +/* + * 'getutf8()' - Get a UTF-8 encoded wide character... + */ + +static int /* O - Character or -1 on error */ +getutf8(FILE *fp) /* I - File to read from */ +{ + int ch; /* Current character value */ + int next; /* Next character from file */ + + + /* + * Read the first character and process things accordingly... + * + * UTF-8 maps 16-bit characters to: + * + * 0 to 127 = 0xxxxxxx + * 128 to 2047 = 110xxxxx 10yyyyyy (xxxxxyyyyyy) + * 2048 to 65535 = 1110xxxx 10yyyyyy 10zzzzzz (xxxxyyyyyyzzzzzz) + * + * We also accept: + * + * 128 to 191 = 10xxxxxx + * + * since this range of values is otherwise undefined unless you are + * in the middle of a multi-byte character... + * + * This code currently does not support anything beyond 16-bit + * characters, in part because PostScript doesn't support more than + * 16-bit characters... + */ + + if ((ch = getc(fp)) == EOF) + return (EOF); + + if (ch < 0xc0) /* One byte character? */ + return (ch); + else if ((ch & 0xe0) == 0xc0) + { + /* + * Two byte character... + */ + + if ((next = getc(fp)) == EOF) + return (EOF); + else + return (((ch & 0x1f) << 6) | (next & 0x3f)); + } + else if ((ch & 0xf0) == 0xe0) + { + /* + * Three byte character... + */ + + if ((next = getc(fp)) == EOF) + return (EOF); + + ch = ((ch & 0x0f) << 6) | (next & 0x3f); + + if ((next = getc(fp)) == EOF) + return (EOF); + else + return ((ch << 6) | (next & 0x3f)); + } + else + { + /* + * More than three bytes... We don't support that... + */ + + return (EOF); + } +} + + +/* + * End of "$Id: textcommon.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/filter/textcommon.h b/filter/textcommon.h new file mode 100644 index 0000000..0597c2e --- /dev/null +++ b/filter/textcommon.h @@ -0,0 +1,114 @@ +/* + * "$Id: textcommon.h 9042 2010-03-24 00:45:34Z mike $" + * + * Common text filter definitions for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + */ + +/* + * Include necessary headers... + */ + +#include "common.h" + + +/* + * C++ magic... + */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* + * Constants... + */ + +#define ATTR_NORMAL 0x00 +#define ATTR_BOLD 0x01 +#define ATTR_ITALIC 0x02 +#define ATTR_BOLDITALIC 0x03 +#define ATTR_FONT 0x03 + +#define ATTR_UNDERLINE 0x04 +#define ATTR_RAISED 0x08 +#define ATTR_LOWERED 0x10 +#define ATTR_RED 0x20 +#define ATTR_GREEN 0x40 +#define ATTR_BLUE 0x80 + +#define PRETTY_OFF 0 +#define PRETTY_PLAIN 1 +#define PRETTY_CODE 2 +#define PRETTY_SHELL 3 +#define PRETTY_PERL 4 +#define PRETTY_HTML 5 + + +/* + * Structures... + */ + +typedef struct /**** Character/attribute structure... ****/ +{ + unsigned short ch, /* Character */ + attr; /* Any attributes */ +} lchar_t; + + +/* + * Globals... + */ + +extern int WrapLines, /* Wrap text in lines */ + SizeLines, /* Number of lines on a page */ + SizeColumns, /* Number of columns on a line */ + PageColumns, /* Number of columns on a page */ + ColumnGutter, /* Number of characters between text columns */ + ColumnWidth, /* Width of each column */ + PrettyPrint, /* Do pretty code formatting? */ + Copies; /* Number of copies to produce */ +extern lchar_t **Page; /* Page characters */ +extern int NumPages; /* Number of pages in document */ +extern float CharsPerInch, /* Number of character columns per inch */ + LinesPerInch; /* Number of lines per inch */ +extern int UTF8, /* Use UTF-8 encoding? */ + NumKeywords; /* Number of known keywords */ +extern char **Keywords; /* List of known keywords... */ + + +/* + * Required functions... + */ + +extern int TextMain(const char *name, int argc, char *argv[]); +extern void WriteEpilogue(void); +extern void WritePage(void); +extern void WriteProlog(const char *title, const char *user, + const char *classification, const char *label, + ppd_file_t *ppd); + + +/* + * C++ magic... + */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + + +/* + * End of "$Id: textcommon.h 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/filter/texttops.c b/filter/texttops.c new file mode 100644 index 0000000..361fe4c --- /dev/null +++ b/filter/texttops.c @@ -0,0 +1,1165 @@ +/* + * "$Id: texttops.c 9399 2010-12-03 06:29:20Z mike $" + * + * Text to PostScript filter for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry for text to PostScript filter. + * WriteEpilogue() - Write the PostScript file epilogue. + * WritePage() - Write a page of text. + * WriteProlog() - Write the PostScript file prolog with options. + * write_line() - Write a row of text. + * write_string() - Write a string of text. + */ + +/* + * Include necessary headers... + */ + +#include "textcommon.h" +#include + + +/* + * Globals... + */ + +char *Glyphs[65536]; /* PostScript glyphs for Unicode */ +int NumFonts; /* Number of fonts to use */ +char *Fonts[256][4]; /* Fonts to use */ +unsigned short Chars[65536]; /* 0xffcc (ff = font, cc = char) */ +unsigned short Codes[65536]; /* Unicode glyph mapping to fonts */ +int Widths[256]; /* Widths of each font */ +int Directions[256];/* Text directions for each font */ + + +/* + * Local functions... + */ + +static void write_line(int row, lchar_t *line); +static void write_string(int col, int row, int len, lchar_t *s); +static void write_text(const char *s); + + +/* + * 'main()' - Main entry for text to PostScript filter. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + return (TextMain("texttops", argc, argv)); +} + + +/* + * 'WriteEpilogue()' - Write the PostScript file epilogue. + */ + +void +WriteEpilogue(void) +{ + puts("%%Trailer"); + printf("%%%%Pages: %d\n", NumPages); + puts("%%EOF"); + + free(Page[0]); + free(Page); +} + + +/* + * 'WritePage()' - Write a page of text. + */ + +void +WritePage(void) +{ + int line; /* Current line */ + + + NumPages ++; + printf("%%%%Page: %d %d\n", NumPages, NumPages); + + puts("gsave"); + + if (PrettyPrint) + printf("%d H\n", NumPages); + + for (line = 0; line < SizeLines; line ++) + write_line(line, Page[line]); + + puts("grestore"); + puts("showpage"); + + memset(Page[0], 0, sizeof(lchar_t) * SizeColumns * SizeLines); +} + + +/* + * 'WriteProlog()' - Write the PostScript file prolog with options. + */ + +void +WriteProlog(const char *title, /* I - Title of job */ + const char *user, /* I - Username */ + const char *classification, /* I - Classification */ + const char *label, /* I - Page label */ + ppd_file_t *ppd) /* I - PPD file info */ +{ + int i, j, k; /* Looping vars */ + char *charset; /* Character set string */ + char filename[1024]; /* Glyph filenames */ + FILE *fp; /* Glyph files */ + const char *datadir; /* CUPS_DATADIR environment variable */ + char line[1024], /* Line from file */ + *lineptr, /* Pointer into line */ + *valptr; /* Pointer to value in line */ + int ch, unicode; /* Character values */ + int start, end; /* Start and end values for range */ + char glyph[64]; /* Glyph name */ + time_t curtime; /* Current time */ + struct tm *curtm; /* Current date */ + char curdate[255]; /* Current date (text format) */ + int num_fonts; /* Number of unique fonts */ + char *fonts[1024]; /* Unique fonts */ + static char *names[] = /* Font names */ + { + "cupsNormal", + "cupsBold", + "cupsItalic" + }; + + + /* + * Get the data directory... + */ + + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + /* + * Adjust margins as necessary... + */ + + if (classification || label) + { + /* + * Leave room for labels... + */ + + PageBottom += 36; + PageTop -= 36; + } + + /* + * Allocate memory for the page... + */ + + SizeColumns = (PageRight - PageLeft) / 72.0 * CharsPerInch; + SizeLines = (PageTop - PageBottom) / 72.0 * LinesPerInch; + + if (SizeColumns <= 0 || SizeColumns > 32767 || + SizeLines <= 0 || SizeLines > 32767) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to print %dx%d text page."), + SizeColumns, SizeLines); + exit(1); + } + + if ((Page = calloc(sizeof(lchar_t *), SizeLines)) == NULL) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to print %dx%d text page."), + SizeColumns, SizeLines); + exit(1); + } + + if ((Page[0] = calloc(sizeof(lchar_t), SizeColumns * SizeLines)) == NULL) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to print %dx%d text page."), + SizeColumns, SizeLines); + exit(1); + } + + for (i = 1; i < SizeLines; i ++) + Page[i] = Page[0] + i * SizeColumns; + + if (PageColumns > 1) + { + ColumnGutter = CharsPerInch / 2; + ColumnWidth = (SizeColumns - ColumnGutter * (PageColumns - 1)) / + PageColumns; + } + else + ColumnWidth = SizeColumns; + + if (ColumnWidth <= 0) + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Unable to print %d text columns."), PageColumns); + exit(1); + } + + /* + * Output the DSC header... + */ + + curtime = time(NULL); + curtm = localtime(&curtime); + strftime(curdate, sizeof(curdate), "%c", curtm); + + puts("%!PS-Adobe-3.0"); + printf("%%%%BoundingBox: 0 0 %.0f %.0f\n", PageWidth, PageLength); + printf("%%cupsRotation: %d\n", (Orientation & 3) * 90); + puts("%%Creator: texttops/" CUPS_SVERSION); + printf("%%%%CreationDate: %s\n", curdate); + WriteTextComment("Title", title); + WriteTextComment("For", user); + puts("%%Pages: (atend)"); + + /* + * Initialize globals... + */ + + NumFonts = 0; + memset(Fonts, 0, sizeof(Fonts)); + memset(Glyphs, 0, sizeof(Glyphs)); + memset(Chars, 0, sizeof(Chars)); + memset(Codes, 0, sizeof(Codes)); + + /* + * Load the PostScript glyph names and the corresponding character + * set definition... + */ + + snprintf(filename, sizeof(filename), "%s/data/psglyphs", datadir); + + if ((fp = fopen(filename, "r")) != NULL) + { + while (fscanf(fp, "%x%63s", &unicode, glyph) == 2) + Glyphs[unicode] = strdup(glyph); + + fclose(fp); + } + else + { + _cupsLangPrintError("ERROR", _("Unable to open psglyphs")); + exit(1); + } + + /* + * Get the output character set... + */ + + charset = getenv("CHARSET"); + if (charset != NULL && strcmp(charset, "us-ascii") != 0) + { + snprintf(filename, sizeof(filename), "%s/charsets/%s", datadir, charset); + + if ((fp = fopen(filename, "r")) == NULL) + { + /* + * Can't open charset file! + */ + + _cupsLangPrintError("ERROR", _("Unable to open charset file")); + exit(1); + } + + /* + * Opened charset file; now see if this is really a charset file... + */ + + if (fgets(line, sizeof(line), fp) == NULL) + { + /* + * Bad/empty charset file! + */ + + fclose(fp); + _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), + filename); + exit(1); + } + + if (strncmp(line, "charset", 7) != 0) + { + /* + * Bad format/not a charset file! + */ + + fclose(fp); + _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset file \"%s\"."), + filename); + exit(1); + } + + /* + * See if this is an 8-bit or UTF-8 character set file... + */ + + line[strlen(line) - 1] = '\0'; /* Drop \n */ + for (lineptr = line + 7; isspace(*lineptr & 255); lineptr ++); /* Skip whitespace */ + + if (strcmp(lineptr, "utf8") == 0) + { + /* + * UTF-8 (Unicode) text... + */ + + NumFonts = 0; + + while (fgets(line, sizeof(line), fp) != NULL) + { + /* + * Skip comment and blank lines... + */ + + if (line[0] == '#' || line[0] == '\n') + continue; + + /* + * Read the font descriptions that should look like: + * + * start end direction width normal [bold italic bold-italic] + */ + + lineptr = line; + + start = strtol(lineptr, &lineptr, 16); + end = strtol(lineptr, &lineptr, 16); + + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (!*lineptr) + { + /* + * Can't have a font without all required values... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Bad font description line: %s"), valptr); + fclose(fp); + exit(1); + } + + *lineptr++ = '\0'; + + if (strcmp(valptr, "ltor") == 0) + Directions[NumFonts] = 1; + else if (strcmp(valptr, "rtol") == 0) + Directions[NumFonts] = -1; + else + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad text direction: %s"), + valptr); + fclose(fp); + exit(1); + } + + /* + * Got the direction, now get the width... + */ + + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (!*lineptr) + { + /* + * Can't have a font without all required values... + */ + + _cupsLangPrintFilter(stderr, "ERROR", + _("Bad font description line: %s"), valptr); + fclose(fp); + exit(1); + } + + *lineptr++ = '\0'; + + if (strcmp(valptr, "single") == 0) + Widths[NumFonts] = 1; + else if (strcmp(valptr, "double") == 0) + Widths[NumFonts] = 2; + else + { + _cupsLangPrintFilter(stderr, "ERROR", + _("Bad text width: %s"), valptr); + fclose(fp); + exit(1); + } + + /* + * Get the fonts... + */ + + for (i = 0; *lineptr && i < 4; i ++) + { + while (isspace(*lineptr & 255)) + lineptr ++; + + valptr = lineptr; + + while (!isspace(*lineptr & 255) && *lineptr) + lineptr ++; + + if (*lineptr) + *lineptr++ = '\0'; + + if (lineptr > valptr) + Fonts[NumFonts][i] = strdup(valptr); + } + + /* + * Fill in remaining fonts as needed... + */ + + for (j = i; j < 4; j ++) + Fonts[NumFonts][j] = strdup(Fonts[NumFonts][0]); + + /* + * Define the character mappings... + */ + + for (i = start, j = NumFonts * 256; i <= end; i ++, j ++) + { + Chars[i] = j; + Codes[j] = i; + } + + /* + * Move to the next font, stopping if needed... + */ + + NumFonts ++; + if (NumFonts >= 256) + break; + } + + fclose(fp); + } + else + { + _cupsLangPrintFilter(stderr, "ERROR", _("Bad charset type: %s"), lineptr); + fclose(fp); + exit(1); + } + } + else + { + /* + * Standard ASCII output just uses Courier, Courier-Bold, and + * possibly Courier-Oblique. + */ + + NumFonts = 1; + + Fonts[0][ATTR_NORMAL] = strdup("Courier"); + Fonts[0][ATTR_BOLD] = strdup("Courier-Bold"); + Fonts[0][ATTR_ITALIC] = strdup("Courier-Oblique"); + Fonts[0][ATTR_BOLDITALIC] = strdup("Courier-BoldOblique"); + + Widths[0] = 1; + Directions[0] = 1; + + /* + * Define US-ASCII characters... + */ + + for (i = 32; i < 127; i ++) + { + Chars[i] = i; + Codes[i] = i; + } + } + + /* + * Generate a list of unique fonts to use... + */ + + for (i = 0, num_fonts = 0; i < NumFonts; i ++) + for (j = PrettyPrint ? 2 : 1; j >= 0; j --) + { + for (k = 0; k < num_fonts; k ++) + if (strcmp(Fonts[i][j], fonts[k]) == 0) + break; + + if (k >= num_fonts) + { + /* + * Add new font... + */ + + fonts[num_fonts] = Fonts[i][j]; + num_fonts ++; + } + } + + /* + * List the fonts that will be used... + */ + + for (i = 0; i < num_fonts; i ++) + if (i == 0) + printf("%%%%DocumentNeededResources: font %s\n", fonts[i]); + else + printf("%%%%+ font %s\n", fonts[i]); + + puts("%%DocumentSuppliedResources: procset texttops 1.1 0"); + + for (i = 0; i < num_fonts; i ++) + { + if (ppd != NULL) + { + fprintf(stderr, "DEBUG: ppd->num_fonts = %d\n", ppd->num_fonts); + + for (j = 0; j < ppd->num_fonts; j ++) + { + fprintf(stderr, "DEBUG: ppd->fonts[%d] = %s\n", j, ppd->fonts[j]); + + if (strcmp(fonts[i], ppd->fonts[j]) == 0) + break; + } + } + else + j = 0; + + if ((ppd != NULL && j >= ppd->num_fonts) || + strncmp(fonts[i], "Courier", 7) == 0 || + strcmp(fonts[i], "Symbol") == 0) + { + /* + * Need to embed this font... + */ + + printf("%%%%+ font %s\n", fonts[i]); + } + } + + puts("%%EndComments"); + + puts("%%BeginProlog"); + + /* + * Download any missing fonts... + */ + + for (i = 0; i < num_fonts; i ++) + { + if (ppd != NULL) + { + for (j = 0; j < ppd->num_fonts; j ++) + if (strcmp(fonts[i], ppd->fonts[j]) == 0) + break; + } + else + j = 0; + + if ((ppd != NULL && j >= ppd->num_fonts) || + strncmp(fonts[i], "Courier", 7) == 0 || + strcmp(fonts[i], "Symbol") == 0) + { + /* + * Need to embed this font... + */ + + printf("%%%%BeginResource: font %s\n", fonts[i]); + + /**** MRS: Need to use CUPS_FONTPATH env var! ****/ + /**** Also look for Fontmap file or name.pfa, name.pfb... ****/ + snprintf(filename, sizeof(filename), "%s/fonts/%s", datadir, fonts[i]); + if ((fp = fopen(filename, "rb")) != NULL) + { + while ((j = fread(line, 1, sizeof(line), fp)) > 0) + fwrite(line, 1, j, stdout); + + fclose(fp); + } + + puts("\n%%EndResource"); + } + } + + /* + * Write the encoding array(s)... + */ + + puts("% character encoding(s)"); + + for (i = 0; i < NumFonts; i ++) + { + printf("/cupsEncoding%02x [\n", i); + + for (ch = 0; ch < 256; ch ++) + { + if (Glyphs[Codes[i * 256 + ch]]) + printf("/%s", Glyphs[Codes[i * 256 + ch]]); + else if (Codes[i * 256 + ch] > 255) + printf("/uni%04X", Codes[i * 256 + ch]); + else + printf("/.notdef"); + + if ((ch & 7) == 7) + putchar('\n'); + } + + puts("] def"); + } + + /* + * Create the fonts... + */ + + if (NumFonts == 1) + { + /* + * Just reencode the named fonts... + */ + + puts("% Reencode fonts"); + + for (i = PrettyPrint ? 2 : 1; i >= 0; i --) + { + printf("/%s findfont\n", Fonts[0][i]); + puts("dup length 1 add dict begin\n" + " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" + " /Encoding cupsEncoding00 def\n" + " currentdict\n" + "end"); + printf("/%s exch definefont pop\n", names[i]); + } + } + else + { + /* + * Construct composite fonts... Start by reencoding the base fonts... + */ + + puts("% Reencode base fonts"); + + for (i = PrettyPrint ? 2 : 1; i >= 0; i --) + for (j = 0; j < NumFonts; j ++) + { + printf("/%s findfont\n", Fonts[j][i]); + printf("dup length 1 add dict begin\n" + " { 1 index /FID ne { def } { pop pop } ifelse } forall\n" + " /Encoding cupsEncoding%02x def\n" + " currentdict\n" + "end\n", j); + printf("/%s%02x exch definefont /%s%02x exch def\n", names[i], j, + names[i], j); + } + + /* + * Then merge them into composite fonts... + */ + + puts("% Create composite fonts..."); + + for (i = PrettyPrint ? 2 : 1; i >= 0; i --) + { + puts("8 dict begin"); + puts("/FontType 0 def/FontMatrix[1.0 0 0 1.0 0 0]def/FMapType 2 def/Encoding["); + for (j = 0; j < NumFonts; j ++) + if (j == (NumFonts - 1)) + printf("%d", j); + else if ((j & 15) == 15) + printf("%d\n", j); + else + printf("%d ", j); + puts("]def/FDepVector["); + for (j = 0; j < NumFonts; j ++) + if (j == (NumFonts - 1)) + printf("%s%02x", names[i], j); + else if ((j & 3) == 3) + printf("%s%02x\n", names[i], j); + else + printf("%s%02x ", names[i], j); + puts("]def currentdict end"); + printf("/%s exch definefont pop\n", names[i]); + } + } + + /* + * Output the texttops procset... + */ + + puts("%%BeginResource: procset texttops 1.1 0"); + + puts("% Define fonts"); + + printf("/FN /cupsNormal findfont [%.3f 0 0 %.3f 0 0] makefont def\n", + 120.0 / CharsPerInch, 68.0 / LinesPerInch); + printf("/FB /cupsBold findfont [%.3f 0 0 %.3f 0 0] makefont def\n", + 120.0 / CharsPerInch, 68.0 / LinesPerInch); + if (PrettyPrint) + printf("/FI /cupsItalic findfont [%.3f 0 0 %.3f 0 0] makefont def\n", + 120.0 / CharsPerInch, 68.0 / LinesPerInch); + + puts("% Common procedures"); + + puts("/N { FN setfont moveto } bind def"); + puts("/B { FB setfont moveto } bind def"); + printf("/U { gsave 0.5 setlinewidth 0 %.3f rmoveto " + "0 rlineto stroke grestore } bind def\n", -6.8 / LinesPerInch); + + if (PrettyPrint) + { + if (ColorDevice) + { + puts("/S { 0.0 setgray show } bind def"); + puts("/r { 0.5 0.0 0.0 setrgbcolor show } bind def"); + puts("/g { 0.0 0.5 0.0 setrgbcolor show } bind def"); + puts("/b { 0.0 0.0 0.5 setrgbcolor show } bind def"); + } + else + { + puts("/S { 0.0 setgray show } bind def"); + puts("/r { 0.2 setgray show } bind def"); + puts("/g { 0.2 setgray show } bind def"); + puts("/b { 0.2 setgray show } bind def"); + } + + puts("/I { FI setfont moveto } bind def"); + + puts("/n {"); + puts("\t20 string cvs % convert page number to string"); + if (NumFonts > 1) + { + /* + * Convert a number to double-byte chars... + */ + + puts("\tdup length % get length"); + puts("\tdup 2 mul string /P exch def % P = string twice as long"); + puts("\t0 1 2 index 1 sub { % loop through each character in the page number"); + puts("\t\tdup 3 index exch get % get character N from the page number"); + puts("\t\texch 2 mul dup % compute offset in P"); + puts("\t\tP exch 0 put % font 0"); + puts("\t\t1 add P exch 2 index put % character"); + puts("\t\tpop % discard character"); + puts("\t} for % do for loop"); + puts("\tpop pop % discard string and length"); + puts("\tP % put string on stack"); + } + puts("} bind def"); + + printf("/T"); + write_text(title); + puts("def"); + + printf("/D"); + write_text(curdate); + puts("def"); + + puts("/H {"); + puts("\tgsave"); + puts("\t0.9 setgray"); + + if (Duplex) + { + puts("\tdup 2 mod 0 eq {"); + printf("\t\t%.3f %.3f translate } {\n", + PageWidth - PageRight, PageTop + 72.0f / LinesPerInch); + printf("\t\t%.3f %.3f translate } ifelse\n", + PageLeft, PageTop + 72.0f / LinesPerInch); + } + else + printf("\t%.3f %.3f translate\n", + PageLeft, PageTop + 72.0f / LinesPerInch); + + printf("\t0 0 %.3f %.3f rectfill\n", PageRight - PageLeft, + 144.0f / LinesPerInch); + + puts("\tFB setfont"); + puts("\t0 setgray"); + + if (Duplex) + { + puts("\tdup 2 mod 0 eq {"); + printf("\t\tT stringwidth pop neg %.3f add %.3f } {\n", + PageRight - PageLeft - 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + printf("\t\t%.3f %.3f } ifelse\n", 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + } + else + printf("\t%.3f %.3f\n", 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + + puts("\tmoveto T show"); + + printf("\tD dup stringwidth pop neg 2 div %.3f add %.3f\n", + (PageRight - PageLeft) * 0.5, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + puts("\tmoveto show"); + + if (Duplex) + { + puts("\tdup n exch 2 mod 0 eq {"); + printf("\t\t%.3f %.3f } {\n", 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + printf("\t\tdup stringwidth pop neg %.3f add %.3f } ifelse\n", + PageRight - PageLeft - 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + } + else + printf("\tn dup stringwidth pop neg %.3f add %.3f\n", + PageRight - PageLeft - 36.0f / LinesPerInch, + (0.5f + 0.157f) * 72.0f / LinesPerInch); + + puts("\tmoveto show"); + puts("\tgrestore"); + puts("} bind def"); + } + else + puts("/S { show } bind def"); + + puts("%%EndResource"); + + puts("%%EndProlog"); +} + + +/* + * 'write_line()' - Write a row of text. + */ + +static void +write_line(int row, /* I - Row number (0 to N) */ + lchar_t *line) /* I - Line to print */ +{ + int i; /* Looping var */ + int col; /* Current column */ + int attr; /* Current attribute */ + int font, /* Font to use */ + lastfont, /* Last font */ + mono; /* Monospaced? */ + lchar_t *start; /* First character in sequence */ + + + for (col = 0; col < SizeColumns;) + { + while (col < SizeColumns && (line->ch == ' ' || line->ch == 0)) + { + col ++; + line ++; + } + + if (col >= SizeColumns) + break; + + if (NumFonts == 1) + { + /* + * All characters in a single font - assume monospaced... + */ + + attr = line->attr; + start = line; + + while (col < SizeColumns && line->ch != 0 && attr == line->attr) + { + col ++; + line ++; + } + + write_string(col - (line - start), row, line - start, start); + } + else + { + /* + * Multiple fonts; break up based on the font... + */ + + attr = line->attr; + start = line; + lastfont = Chars[line->ch] / 256; + mono = strncmp(Fonts[lastfont][0], "Courier", 7) == 0; + col ++; + line ++; + + if (mono) + { + while (col < SizeColumns && line->ch != 0 && attr == line->attr) + { + font = Chars[line->ch] / 256; + if (strncmp(Fonts[font][0], "Courier", 7) != 0 || + font != lastfont) + break; + + col ++; + line ++; + } + } + + if (Directions[lastfont] > 0) + write_string(col - (line - start), row, line - start, start); + else + { + /* + * Do right-to-left text... + */ + + while (col < SizeColumns && line->ch != 0 && attr == line->attr) + { + if (Directions[Chars[line->ch] / 256] > 0 && + !ispunct(line->ch & 255) && !isspace(line->ch & 255)) + break; + + col ++; + line ++; + } + + for (i = 1; start < line; i ++, start ++) + if (!isspace(start->ch & 255)) + write_string(col - i, row, 1, start); + } + } + } +} + + +/* + * 'write_string()' - Write a string of text. + */ + +static void +write_string(int col, /* I - Start column */ + int row, /* I - Row */ + int len, /* I - Number of characters */ + lchar_t *s) /* I - String to print */ +{ + int ch; /* Current character */ + float x, y; /* Position of text */ + unsigned attr; /* Character attributes */ + + + /* + * Position the text and set the font... + */ + + if (Duplex && (NumPages & 1) == 0) + { + x = PageWidth - PageRight; + y = PageTop; + } + else + { + x = PageLeft; + y = PageTop; + } + + x += (float)col * 72.0f / (float)CharsPerInch; + y -= (float)(row + 0.843) * 72.0f / (float)LinesPerInch; + + attr = s->attr; + + if (attr & ATTR_RAISED) + y += 36.0 / (float)LinesPerInch; + else if (attr & ATTR_LOWERED) + y -= 36.0 / (float)LinesPerInch; + + if (x == (int)x) + printf("%.0f ", x); + else + printf("%.3f ", x); + + if (y == (int)y) + printf("%.0f ", y); + else + printf("%.3f ", y); + + if (attr & ATTR_BOLD) + putchar('B'); + else if (attr & ATTR_ITALIC) + putchar('I'); + else + putchar('N'); + + if (attr & ATTR_UNDERLINE) + printf(" %.3f U", (float)len * 72.0 / (float)CharsPerInch); + + if (NumFonts > 1) + { + /* + * Write a hex string... + */ + + putchar('<'); + + while (len > 0) + { + printf("%04x", Chars[s->ch]); + + len --; + s ++; + } + + putchar('>'); + } + else + { + /* + * Write a quoted string... + */ + + putchar('('); + + while (len > 0) + { + ch = Chars[s->ch]; + + if (ch < 32 || ch > 126) + { + /* + * Quote 8-bit and control characters... + */ + + printf("\\%03o", ch); + } + else + { + /* + * Quote the parenthesis and backslash as needed... + */ + + if (ch == '(' || ch == ')' || ch == '\\') + putchar('\\'); + + putchar(ch); + } + + len --; + s ++; + } + + putchar(')'); + } + + if (PrettyPrint) + { + if (attr & ATTR_RED) + puts("r"); + else if (attr & ATTR_GREEN) + puts("g"); + else if (attr & ATTR_BLUE) + puts("b"); + else + puts("S"); + } + else + puts("S"); +} + + +/* + * 'write_text()' - Write a text string, quoting/encoding as needed. + */ + +static void +write_text(const char *s) /* I - String to write */ +{ + int ch; /* Actual character value (UTF8) */ + const unsigned char *utf8; /* UTF8 text */ + + + if (NumFonts > 1) + { + /* + * 8/8 encoding... + */ + + putchar('<'); + + utf8 = (const unsigned char *)s; + + while (*utf8) + { + if (*utf8 < 0xc0) + ch = *utf8 ++; + else if ((*utf8 & 0xe0) == 0xc0) + { + /* + * Two byte character... + */ + + ch = ((utf8[0] & 0x1f) << 6) | (utf8[1] & 0x3f); + utf8 += 2; + } + else + { + /* + * Three byte character... + */ + + ch = ((((utf8[0] & 0x1f) << 6) | (utf8[1] & 0x3f)) << 6) | + (utf8[2] & 0x3f); + utf8 += 3; + } + + printf("%04x", Chars[ch]); + } + + putchar('>'); + } + else + { + /* + * Standard 8-bit encoding... + */ + + putchar('('); + + while (*s) + { + if (*s < 32 || *s > 126) + printf("\\%03o", *s); + else + { + if (*s == '(' || *s == ')' || *s == '\\') + putchar('\\'); + + putchar(*s); + } + + s ++; + } + + putchar(')'); + } +} + + +/* + * End of "$Id: texttops.c 9399 2010-12-03 06:29:20Z mike $". + */ diff --git a/fonts/Makefile b/fonts/Makefile new file mode 100644 index 0000000..516b53f --- /dev/null +++ b/fonts/Makefile @@ -0,0 +1,118 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Fonts makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Font files... +# + +FONTS = \ + Monospace \ + Monospace-Bold \ + Monospace-BoldOblique \ + Monospace-Oblique + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend target... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + $(INSTALL_DIR) -m 755 $(DATADIR)/fonts + if test "x$(BANNERTOPS)" != x -o "x$(TEXTTOPS)" != x; then \ + for file in $(FONTS); do \ + $(INSTALL_DATA) $$file $(DATADIR)/fonts; \ + done \ + fi + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + for file in $(FONTS); do \ + $(RM) $(DATADIR)/fonts/$$file; \ + done + $(RMDIR) $(DATADIR)/fonts + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/fonts/Monospace b/fonts/Monospace new file mode 100644 index 0000000..2512b85 --- /dev/null +++ b/fonts/Monospace @@ -0,0 +1,2744 @@ +%!PS-AdobeFont-1.0: Monospace 1.15 +%%DocumentSuppliedResources: font Monospace +%%Title: Monospace +%Version: 1.15 +%%CreationDate: Thu Oct 27 10:50:21 2005 +%%Creator: mike +%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%Copyright: DejaVu changes are in public domain + +% Generated by FontForge 20051018 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/Monospace known{/Monospace findfont dup/UniqueID known{dup +/UniqueID get 4166841 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def +/FontName /Monospace def +/FontBBox {-109 -1034 1342 2133 }readonly def +/UniqueID 4166841 def +/PaintType 0 def +/FontInfo 11 dict dup begin + /version (1.15) readonly def + /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def +% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +% DejaVu changes are in public domain + /FullName (Monospace) readonly def + /FamilyName (Monospace) readonly def + /Weight (Book) readonly def + /FSType 0 def + /ItalicAngle 0 def + /isFixedPitch true def + /UnderlinePosition -213 def + /UnderlineThickness 141 def + /ascent 1556 def +end readonly def +/Encoding 256 array + 0 1 255 { 1 index exch /.notdef put} for +dup 32/space put +dup 33/exclam put +dup 34/quotedbl put +dup 35/numbersign put +dup 36/dollar put +dup 37/percent put +dup 38/ampersand put +dup 39/quotesingle put +dup 40/parenleft put +dup 41/parenright put +dup 42/asterisk put +dup 43/plus put +dup 44/comma put +dup 45/hyphen put +dup 46/period put +dup 47/slash put +dup 48/zero put +dup 49/one put +dup 50/two put +dup 51/three put +dup 52/four put +dup 53/five put +dup 54/six put +dup 55/seven put +dup 56/eight put +dup 57/nine put +dup 58/colon put +dup 59/semicolon put +dup 60/less put +dup 61/equal put +dup 62/greater put +dup 63/question put +dup 64/at put +dup 65/A put +dup 66/B put +dup 67/C put +dup 68/D put +dup 69/E put +dup 70/F put +dup 71/G put +dup 72/H put +dup 73/I put +dup 74/J put +dup 75/K put +dup 76/L put +dup 77/M put +dup 78/N put +dup 79/O put +dup 80/P put +dup 81/Q put +dup 82/R put +dup 83/S put +dup 84/T put +dup 85/U put +dup 86/V put +dup 87/W put +dup 88/X put +dup 89/Y put +dup 90/Z put +dup 91/bracketleft put +dup 92/backslash put +dup 93/bracketright put +dup 94/asciicircum put +dup 95/underscore put +dup 96/grave put +dup 97/a put +dup 98/b put +dup 99/c put +dup 100/d put +dup 101/e put +dup 102/f put +dup 103/g put +dup 104/h put +dup 105/i put +dup 106/j put +dup 107/k put +dup 108/l put +dup 109/m put +dup 110/n put +dup 111/o put +dup 112/p put +dup 113/q put +dup 114/r put +dup 115/s put +dup 116/t put +dup 117/u put +dup 118/v put +dup 119/w put +dup 120/x put +dup 121/y put +dup 122/z put +dup 123/braceleft put +dup 124/bar put +dup 125/braceright put +dup 126/asciitilde put +dup 160/nonbreakingspace put +dup 161/exclamdown put +dup 162/cent put +dup 163/sterling put +dup 164/currency put +dup 165/yen put +dup 166/brokenbar put +dup 167/section put +dup 168/dieresis put +dup 169/copyright put +dup 170/ordfeminine put +dup 171/guillemotleft put +dup 172/logicalnot put +dup 173/sfthyphen put +dup 174/registered put +dup 175/macron put +dup 176/degree put +dup 177/plusminus put +dup 178/twosuperior put +dup 179/threesuperior put +dup 180/acute put +dup 181/mu put +dup 182/paragraph put +dup 183/periodcentered put +dup 184/cedilla put +dup 185/onesuperior put +dup 186/ordmasculine put +dup 187/guillemotright put +dup 188/onequarter put +dup 189/onehalf put +dup 190/threequarters put +dup 191/questiondown put +dup 192/Agrave put +dup 193/Aacute put +dup 194/Acircumflex put +dup 195/Atilde put +dup 196/Adieresis put +dup 197/Aring put +dup 198/AE put +dup 199/Ccedilla put +dup 200/Egrave put +dup 201/Eacute put +dup 202/Ecircumflex put +dup 203/Edieresis put +dup 204/Igrave put +dup 205/Iacute put +dup 206/Icircumflex put +dup 207/Idieresis put +dup 208/Eth put +dup 209/Ntilde put +dup 210/Ograve put +dup 211/Oacute put +dup 212/Ocircumflex put +dup 213/Otilde put +dup 214/Odieresis put +dup 215/multiply put +dup 216/Oslash put +dup 217/Ugrave put +dup 218/Uacute put +dup 219/Ucircumflex put +dup 220/Udieresis put +dup 221/Yacute put +dup 222/Thorn put +dup 223/germandbls put +dup 224/agrave put +dup 225/aacute put +dup 226/acircumflex put +dup 227/atilde put +dup 228/adieresis put +dup 229/aring put +dup 230/ae put +dup 231/ccedilla put +dup 232/egrave put +dup 233/eacute put +dup 234/ecircumflex put +dup 235/edieresis put +dup 236/igrave put +dup 237/iacute put +dup 238/icircumflex put +dup 239/idieresis put +dup 240/eth put +dup 241/ntilde put +dup 242/ograve put +dup 243/oacute put +dup 244/ocircumflex put +dup 245/otilde put +dup 246/odieresis put +dup 247/divide put +dup 248/oslash put +dup 249/ugrave put +dup 250/uacute put +dup 251/ucircumflex put +dup 252/udieresis put +dup 253/yacute put +dup 254/thorn put +dup 255/ydieresis put +readonly def +currentdict end +currentfile eexec +17F6ABC0BD4E5B049FA8ED1415B73797205424D2E47FC5DF8590627DC99082760E8B3E17 +0C18AF49528FA9DB386CE480B471EC8797784FB466233A879056FB46290A8F49442020C3 +E00AF7FDB602BAC1C4F8636E32FDDB936FC70C567B075E18878EA286E1D24CC1E14B50B7 +DCDD17FD5295A3F44E0DA80366E61263EA00234FA095739BDE371FED9A24338A8CAB0F53 +5964F1515D62E477A2F1C2BEEA2DF171E3962F0DE53E2763D7DE117F6B5328691D69C4D8 +D071D89F6AB4731DFE0A1FCC4F32351620B2B48E12AEAD940270EF4990B511E7D052C3A4 +2AAEF583BD41B85778646ED2E9A86A73A1089F502672860E7A7A9CFC2F7B2E221C6C9080 +7B7E7B4218C9B10B574C73E195D6C97D1EDC5FA365221BD82148D1ADEA7F235FFC14AD5A +47E11207058A7A9059FF373F66FEA5A9113CE0BCAF084AAE135556FE84AA4C5A9070BD77 +E7D39A94BA711FDFE442366E9F27F14EF80FFF2C342189C2E28D9FC541F049944C1CF913 +2A014935BF47B42C4E0847A335B4E6CE5016C1B8FC0C3E153C07ADF3C0B00CE001DDF36F +DE0CC04A25FA1635707299ACB277BFF663DE9558664D1DE90465FBC67BAEA7B1851FCC85 +7364E4BB97470017B40C4D54096C4AE2469A5D037963C7F009DD25A32C20487FF1F1F0A0 +124BF0B10891BC1FBDC65F9192B7236A694E1CFD1388CD27288222AE80032683C803533D +E6C39DF03BFA02DB5F35C1B99531836F38F6F04192AE3228C0F19841842F5C907529175B +6BF7B4A8D7B3F27FB39A58B7D3CF11A306701B548C3DC231102A45496B5535C96FBF0412 +004ED0658F28F845F4B0C5F02A680737A738A559E8E6BFCA7584C0A9FAB1B5D3C8995508 +856337933B9A49D0624F25CC06C8243C2A8816426753B631100403B630D81FCA4D08527F +3AE881DA5332F16C4D8B15F3CBD4DF36430C2199BE5CD27CCF4BE86F5519C046E73442E3 +AEC3F3DAD10948A6AF7740BE87874A288FB27851EF698B571A027E5787BB45BA566A2822 +69423D624D118CA8D14B389A93193F1C8CF64CDC3F0153D4B8CA8AA843C2C26AAC2971DA +7F52B17B21ACE56A7021C6255A2707BFF033A1477C42C0B5D2001820FC9A8BFFB4E9DBAB +B595E925C78C9CF87420160DC0B549CBD8A3D12352AFE06CFEF38A2D3715AECCF86E0919 +790BA8FEAE050576C4DFCB416E2DF5FA3B25192F16A935C9CA82C87CC997CA5909B956FA +1622B10EAD7465B8FE6B347675D7C363581C9B52C9D020AD5CF983284D9359F4C8F9E91B +C073DAFC702EA788540E72A08668BEA885605C8D42E5F6BAE086F3591C614D438FAB01E1 +3D69768ED2249FF1079E2EE704F9672DF9DF9C8A41CADAE9013809F1DA83673A8398B477 +A13B4B0093E151F6489A2D9BC119A66232A1AB85F31979FBA9EE7F163FD59FE14C72FAFF +A1CFCC482619E13021FEC7F10C6730E5A7FCAEE84EB5011F13E407591BCE6353D5AD0634 +D4414B008C95F31170FD8F33F83C6B02DDDF05401012E7260A3DD0213857AF9072EF5DA7 +389AE027997C2D7130443A4B2E505A9F17B00E84E142E4ECBFF3AEF2C2C4E84F162E2F7E +436222EBA20B0DB87346084A2BF64B70B1796729F845D456702C7625AD2CA3D232345C9C +12B9DCBDFAB9B8F697E5E4EF2D473D119F81A46F6FD8A03AAC73211F36FF824DE6E03788 +BD669A0E7F2813A4AA830C8EF8BE445CABE6019318806D10C5952157FF8F8286C1EE7015 +45C8F60EFA854EAE66835A2046A6915D395F1E0366A459E43236162A929ABE6ECDB26B57 +EAE7CE3731E0DB75ED207292FD83B6B288231E4F3F8170DCB831DF571EC07CE2D698CB6B +88C63F342E89FA1BE8879269D9F818C4F740C38EB419A8A814E52AC7CA90187730F43520 +115D7388390F20A8119771ED45AE1E58C1DD30B171E7B5B2E75DC63EDF55BCB9D7BF3119 +5E4BC6D91227A24B996F83BF8AA17D3A1DFD34B32E91C4F51C229796662763D1668E884B +E9BE85D60132A4C45ECFA6FEBEFFD3E34AF21DA897B24A5B836D4DF2E81D1B51FE682095 +63128FFE15E36687F7720F3C980EDED7A794EB420F3E0465B1E93755F64A9C54A24058FE +E496317919512048C2B01062574EAA66A2F86D01F58D9D252F2A84E7B44A057D8DE0EF2F +EF7B752B46B1643D7E57D2871CC15D0DAC4852901205AEB7C996A957C4A0605AAC287AA6 +581DD2C8ED591B89BA7126687F970D7D49E84AD96BCE16AFE6508B25E85D530D9A9F7A11 +E788CBC50E80F8A4ECD26C241C37078EDC447DFF2A43ED7BF1E00B6F227926A9913ACEB0 +98B833E54B3FD10F9D0CE4B8ED76549239A7F4FE846B9D57F26B53229856681CA7D3EFB0 +22CCF57311C872CD0D0342A2FFC59E2F13B32D530B0268A4D01A14193D1B17001E205355 +1E42338F7BAE7D9B02780A3D972AE4E904DD34761AA66159CEF52B226277596A2A9433D6 +4B5AA165D9595B99829EEA6E26F4E10DE1B6E0F33BDBB010A036D221B7F4191F4420B6EF +621566F238B0ACC9A7C41B90823D9DA08E327896CAE4AEE60F860240EC8A89C03E44E2CD +D4E767F4D457275E3F7AD41D4983D7C6BCEE26E6A7EBAD234DADE81B2C98C1F3F396979C +04A4E00E6F4AFDDDBE9D9EB775D1A1EE76399AEC7D30D3CD09AFD73601ADF5593B56D0B1 +4471810AF628AF86D1237E3690509FBAB8FB2F4D041CDA612467B254CBBF83780C60C1C7 +AED265168AFC379F832EBA6D6DFA2CE6FBE127690B37309F6A613608BA98A5B77E9ED5E4 +E7C373750542C245C20D10035D1163AE93970F3A8CCA7B5A57DD0503060637DEA1CDC404 +713E1DE9E328DD8D902D24E0C70B17620EA2217B7E51589626FF6923A0D76DE1B480DFC9 +CE2B7BE62919C80623B7E39BBBE748E8E70242233CCCC5899AE70F1A3B380418564AAB15 +E4CCB6BE3A9329C58D8843AA7D287D851168FB531FA694CAE2B9D77C13720A9499C13D50 +B4D6AB2A5BCAE592D465FBADE34CF7316886A7287918889EEB7FE26AB47B5319F833422D +803421C29FBCCF0D64657D945676C968938B633371EA7B3114BE2C23FD20581CDE846A7F +C5C57C4A4BFBE5A649B20E3756BA94FA8C45D0542134790D6105890BB01C961ACB87C761 +743FBA8F2549015D6B171EFD0390ECDB7744E185BB9D88BA42C4CCD61CF9AAC20B6E4C0D +A70F20091A75C9250C9F9287CDDD78D39400A85D28C70E38B38D33903E7496D3EE1FE98D +B047C84C59A60A58DA8DAC47A058A825544C1B4F4CBDFDD99A04BB691854A20A773544DA +A39EC11B14C864220F74CC2307075EBB4847AFF216614A471B1B169DCFF4F89FE390CB97 +46089C958316DEFEDDDF9F3BE4A6BCD0423836A7AC3F7A29CC863418B703668188C962D3 +6803BCEF438B47363A40762165AB9671A46F9253DDE8AFC38DAE53F7E34230ADE2830956 +F5B7EB9BE9E0086B7FB715173272B381B494085744ED8F2EDFAA567E2DFEC2861A231157 +818D7DC0898DCB8B8AE30BC0F1A65F018BBDFF3ACBA4436B5E824B6B4CC0F4402856E259 +F1D5F1C770A1589A621F9747B5F7E81908016DD977ADED8019C39BF5CB9AB35CA82CC83E +AEC842F6913929F8339EC1DCB27A53E3E1006174E2C8CBE4756F6762395DFB5AD85947BC +63137E05269807A5958D5A346528162B4C1B485E858DDB2ED3AF35A0485CBDECE9A2893D +C28B94DABA77498C26861FEF72571B5B66477862642465030FA5633E47B24BB8697E5A20 +73945D8E2338E554D66EAF307D9035AC9678414E799EC56AD03EB72A72B227DC18C3B27E +8AA1679D14FFBABF22FD2EE80C94AD06C34FE7F7597A82E1EFF272F2FCD72AECE10D5102 +BA8682441BAB1E8DD83EFAD74757A96051DE07782FE7B7D7BDF36DF39A434E59F1D2630D +93B66D1AD1A9565211B13427A036019C538D4C4314905257E8FEB31FC5DD316F606D7BFB +9CC3829EBCEAAF3722E465C60AB1D7CBA1D2D229CC28D11DF8FAFD2169339C0B61AEC73B +6FC855B5567FBF05D9088734DDD8755700C80A5C942915811567F103D0CB70611DE63F61 +9B2908AEED0B33A1CD43A84785FF49EE977D5C45E1ADE13672FBB01DB79096DFF6036904 +30B27DD8C0609AB745C238EC6F73B1CB8234794DDD9E1A41681CC004362DB2A97B8A96E9 +C981F7848C4BA5ECCE7CB87713B6B7C7CDB7450AFA5FA6719A8EF035D672A136AD494139 +8E777EBDBCA5DC8A9DFD54654883221071167CB4756FCD042891D85E4B2F5F306F39CD0F +B2E267665EC0A394A150D73A9AFE7C1098609BB6247A6DD24B01BD3B78DA1E49AAAFF696 +D27A53696FC27DA3B017224587D43372CD3406CCE3AC952D73C9AF01058C8EFFBD0C177B +204C6DF2CFC597FF177ADCAB6FCBD5F0267B00CA18311A4250FD04DF3809D4DB2C0E4778 +3D905D787362901E1171745B2A66848A3B617F29FE183DF6F746F9011AB14925AAFA1C4C +159C27D3BF8537D6FAA40A20B47745BD7148C698C450F18D0ADEBA3095F0379B7D0B4354 +E1BFFF0C63C7D745F0085D7239612CB0E5EF4B8FAEF7C19A7300881206500AC612D0C42C +66F4B99C32AF8CFFB05749260B56B7B425B550C427368E45AB7BB682C9D3E07FAF35DC89 +0AC6191384133DA9DCA3F3977243D277E0A1B833E37C4399B67DC083168310ED294ABA2B +6A96F5F1F7E8A18E5C8A95CE1E224DBBFFCBE5E54BCD199625EBB5E5DDF1F2795DD53D81 +86A5EEE389B4EA7402B14D2BA4B3D9A1F50079AE9809A0B0A5061764A3320D9AB4B5CF1C +4BCAAA4CB0F2926A46397B9D8F3B3956E647FCF3034A34B6BAB88BD4C53FB84638DA56D2 +2C65DB9BDEB68FCAD5CAB7B184EAEC585677704583CE9372F90471EA5B68FC5D1DD702A0 +A7668E6C7416E4A5CD646EFD2359DBB7367492BC0B4E6BAFA13D3D3975604E1A187A6E61 +EF6087394EAC2F8FA9FB4C040A994545480329FF5FF9B4727A39356F8A4043A74A9A7E2D +250826ADD481F91B9DB916A9FD5FE4469A9861A96BDF6BD3DAE13293B9DC2A318A35D7FF +DBCD241F2FB394644895A3F53C457C752A72E8167E6B7D4495B3C1DF0EC53127509988F1 +49D6C49CDA35B00652F148D3CAEFA3EFD8954E80766AEFCB85953366389FD4DF6D70E36E +B321BDB176FE7B75CC31A73F4DB7BDF5E0B45C23FFAD7B7EE35B9B6E9EA4141F4F98430B +D93BE0FCF80D63D7860E9B43D161DA7A68C2BD51E2E95ED7B54A91466D0716603CC41E83 +7004D94DABC5D971330DF98672136E372129A77CB496C7200FE3E287F7936E8002B54C51 +25B364B6E07943A078E2C018678B7E159C1DFDE7633CC3633B38D50C54B98B45DF4A972B +93B4B4013F8F1EC0083B09F3FAFD2CE2B2ED5791DDC0945679A122F21B4C5D67DA6E5A5F +2A5893AD3AA7AFD891ABC6860F14EE16DDE548520DC88C2CE6099861B038EB25A01589D3 +2F4AE37FAA4D171416651CCE37FA4EB8D063A0977988E50F9036C0A9C8E99E6D586EED28 +E0FEFBE7406386EB9FBDCBD8DF820F6371C99C6F7A4F2E3F43FD2792A9A2D3F81BD3DC6E +DEB59B1B4DACC2F278A0C6C1D3B841A73525F311504CEFC8538CD53C487F612D9045AB40 +8B8A76195907E3B679CE68322703C2F80A50401BD44BB5D14080A46F859075C9B51BF0A2 +C42321EDE4254F558FE33357746631F407C16675320B8DF3E24E0FBE2E93BF718CBCCF5F +F21F013313BAF474F239CD0FE72EB03279791A95BB322DF5C4725763052185CD5CDEDC76 +071B4B2337B406337237A2A6490D75598CF6010D22582B8A12871C17003839A8A8C42E92 +EFC92B7EF0763D7B6481965F890802C7AD345F2FFB5A444DE404C833D1D9DB1CEE2DABB6 +42DB540CB398BD2C16A7383E649A0714154E72D94438FF904755399C1674F5E01CD45590 +CD04C4FE3292356650A3D431D7600426A1475B5919722726468C247BCD565965DA6E4A83 +28644CB1FD2A23B1B45F74E6B4BA9AE065BE873BBB80505D16D54D9DE69026CF1DE8DEBD +E472F067C70CB4104D23ED0CC9BF68055283A6CC2AAF48FC59A580DA8597F95EBB8F61FB +C4F6B12FEE888AD60897383AB17D227C0CEF95E86F149ED6B71C2FD67F5A996E8B34C5EE +23DFFEE49200A250611E32FE3300AEE9BF13790703B6AC983C965F1C52D2BE0BE876D4A8 +85FCE072D5D584B12CF2CF91BD7D7F9EDA1D6FD62F40AB5682312D6138030FA1EBE9B194 +1DA4ABAE5A781EA979F608C6F0D5481CF48AACE9F79031574204447596555188C3D6048D +B9D7D8D1F0B67DD5F3468E7C7B647DCD1AC3B3C95E1DA6DA05816B49DC8BB86E85C0094C +6C9A703B88F020363930195842A753EE42B4BEC13B668101203BBB7D5CF7E9C3E39716B9 +85F4BA374147BC7B13BC2515C8A500596D35152A102FA248B9E30D6050C11045B9A81213 +7C228594EE2725F43CCE59D3F1669F0B4722B2171811C2A12B1905C0B40EF1B1957731A3 +A20D29302DB48D061351430549F57084C31D008391BC9D20534EA98CA6F951E00FDE49F6 +22913C19F44E489CF9A80274B43CA60CA5C517C821426D5BFA185649ADC0F1AFFE8ABFBC +A0A03CF0DB690CAF902219A5580EEB11DD3ED650979550454929EFDCC32C7E8418B80F54 +F0CAD6049E2EB23D5DBC2D680772F03E8F3D19913E6F771AC65C1575AA6968CC6857633A +C2520C09AE900BA1CED6C5C21C2CF8BCA8D676A539F22DFE03B4134AA8181CB38BB0F69F +C83517AB3AAB165F2A1FA474E067627199406D26881E8066E509D3C39A1A8C4BF99D4D46 +922EEA6D05F7EBDD33A33774F24A650B9170D2CBC9A69317CF90010F9688EC72B3DFD2B7 +0EAE5DE97C03A5CBC355E8A57F7C36D9AF8DA95B4A307965074244B72B5689F6DA0FD360 +DD95C184A7037397C0598153F96AEBF3E059B042A3251AEBAFDB90631C7A7E52C89E7623 +07487D51B8A019BE505E4078DF87A79565DAEAFCBDCF4D99E658A3A6F33C252CC8FDEA27 +CC974B91269FB2FD905A619159300A0274E79C1F52ACACBF68E03CBA15523A0B2081C739 +3D397D3D4BDF3094FBC5D20852EF7766A4C83B708E2F75008756044AB2B55C57559CF7A4 +636F74B49D18E81057BE38166F87DF24C73B337533DCAFC8F7D4EF0A3C4C6B82E9BFA3E4 +F3116E011FFC4A89B7FB72CFF1B0229D6D578AC85DC6E6C3CB956193689607D6D7A48367 +0D7C529E5C5C223E081E3C6F1F3A2B8BA8EB5C4DBD19F9A5566694EDDAB69837B65C8299 +63A95E321181E4BA0B097FBDF72647838C8B49DE3AA88B6F755317FB1785E12DDA71F944 +49D3D1DBC0C167B3793747D9D6EBF6FA13A74FE1FFB6A2EBBDDE14A21040380DA4BC9088 +C60ED587EDF6E2A00BC041990F00C7568373598310FBB5FE87A1656E381A2C449C63B236 +5BDA6D3C51D1E5A1A0ED408221B2FA8397FE2FC992F990DB3E772F3EA54CB468AD471FB8 +0FB1E1A9CC6444B98D2993F5DAAC9B5CDE3ED8AD6FD8DE80001DC7D67A09B39BA8D0B35A +CEFD510CF34838F06C72047309CFA29787631CD33E0E4457DF26244706966FCAD9A90668 +A155F9BC4214693A80C3440F56C2A01D87AD998493130C344E9560A88F9969585B6D2D4C +AEDCA0D1954D6C84E0F717C48548C60B39D0013FC95E3DA0C13796130F3E0D8A240F8ACC +4BFD93D26A7185DE5AA0C493EF230D0A5EB0DDFBD49A66A61D814D2D03EE94B40A25F8C6 +5F615B8C4402B4FFF0A882316E9123C0267E0773E048658ECF5C0008EC18976EE2F8CB4C +E5B4C17F857B83E16622180B70F0433488E58826B39221566EAE2A9C350177F10D9737CA +6ED009C263E3198F02D7A3514B3AA1AE7B0BDBE901D84DC256855A3DFCC83BF51C9B3CCA +1FD2756DC6D54280E164E942530CC560BDD8FA6AEAD30EF5BD8A4A30EE5755C7A4D7C550 +F0399CCEB87FB781EF298DBA53BF7FC3373388DDE9AE21AFE51A7EADFE83767E8A112DBF +C595A9B0E833CE7F8ECE227028F10E36B8147340F6C0152DADF434AB60CC64BD9158E0E8 +C30F38FD0D5D7573D43FC3AA9403BE945DF46D040AAD91FF69D0B0FDDAF19EDE36F089AB +D8E00D8417C463C1CB3292E6AC20CAF026C74FE0F97CF8D7956678D1A104002A68D53664 +A82EAA93112A3BD2B55113F37E8588E78C0429E482259A2A0C11F745A74429FBABB8A53C +D40101CE27011FE51335D3417E41ED1A8D260EAAB7C3F118B426DF541FFBDA96C4FA9859 +66B99AAB27B4DBFD28304F386879C6DF62242B689DE14BEAA08BF07AE4A38B203B024F88 +808C5E227B6AE750142874E5E59B23AB9B36025B6D67EAE9B8DB60B9A04A388525D1F50D +C46F8172AD8DACEB870ABB56944F916B492DD6E9D296049973D661689E8A416014D4D2C2 +782EAB49362E9FBFD5BD6F0C95F243BE717535005F99A22FF28A7A02A5F4BA4B1F505449 +61ED383753ADD0D2952FA9313CAA827F3D8F8977C98D760E4BBDC134DFBC0A008230D337 +35A048B81A94A8CB7034DE777595158CBABDB648F1A2325655EB64B42C24D190C2979F9F +AB4C9DA55299AEADE3801F9956E3C62A77A16746073EBBD364AC634B37671C8F153B8EF7 +D9F110CEE184CE3394349EBFD88E43D15B309DAFF263F4BECF1C581FC4CE876B68D3F1C5 +EB2F001FBA2809FDC3F834833F39B74C9E5018C8A7CBEECDFCB121EDCE0282988BC5BF4D +156D91F53B4EF6B9FF7D95CF1B39B679F06190A10C3FFF40D461000E3F8E422AC042148F +E12B5A776BB1F15D44D41CED498A9AEFD2CAF59CDCDE5C4158B8CA1CBDF4FB5AE83D99B1 +A39770AA15397D85F77F42846B0893AE39A0F4612A62A7D963B767DFB1E92A0B73FC65CC +EDBAD8D74D2C24E08B2D551538DD954D94A80B92E897E8C10D1725988EAF003E9BABE962 +2C9C8D278A6BF1935574C80C6815BDF0BB7011FBEA53A59C0C45D1978A1D3E6A7BCC87F4 +2C5FDC7886044CE5798F06096AB7FB360316E1BFCE3E719A1EA906E0C5949E00DE7AED0D +E6C25832D30CE1867387C8254F51171A9037C8CBC6D339B4647E9077D605C13E30324180 +A433FF9F3A7BBC3B0B775A860F7BAB63D7538E2092F902F019D29FE8DD198EBD85DF0564 +D39C10DC176F698641996117778D7F899153CB26D568C057DA39FBE2D21ACF39E0756E16 +7FB5AF562F190A7B940A8F4BFF98AE156D74CE4C8CEAAB103FE6F06B7D578E5D7675DBA7 +27FCC0B96031ADF2D3F204EF9DF63D8A4263EBE46B74F1A2CB67D620FF5B2585A53C7CB0 +DA53F6F219B277BE9F8735014BDF61936C3377A6D1348D3C670A65CD057B32DBBFFFF5E4 +D830E9CA83BABE9298431F93884E2083D6ED6DA68A30C7372539DE05E8CC9DD8A748C810 +462687C6B9B75B305C3A31BC32A122365DEB55AF6F6D2BA9468247BC0853E7144E46AAE7 +E0D7C76E8BA15289ED307E0943F5E3A05F051AD2C2EBDC7E2BA46F91B4CA94308D1D2FF3 +FCAB4EDDF761FFCF83C23C979E4D318A51A26424D78E5B215EA33F04E1BE296A9693F065 +9309FF404423775875D73F230FCD5CFB1AEF0F6CE5674F865C300105791111C1AAFC98A1 +557123E1C34749937C8BDE11E41C21B1B0FC53E8C5D199D3289DE09C7D7A95EB23D5192B +AAA67A13DABCDDF6C48115036065984276B126F294D6BDDFB90BE9319F3A3D031A22BBC6 +05766A7BC934472D23812B37720AC3403189F34F2CAC2B674B04D3B3B46B6662B1C2489A +2964D8EE5EAAC87A8AC7208E5E87358DDBEF9EBB52B96102CDB82D8BCC5D8A404DA247FC +C304D7153187BB579C75F71DA411E4B0FA80D2131D11C6BD693F3AA001FB349FA11B5FB4 +9DDC4B2A6443A8932AC4813795934D61D38BAEB1847EE5D3A7D01708524B3933B442709E +CBF2D39460259D44CE01645BCBCDC2BB9588C855936C6100009D867FBDC902475BB43DA2 +F7A309AE56082F18E670A25BA12213EB7D9BF6679452CD4814353BC62C1ECD5E1A7C50EE +43277A1D5D124BA9F596E19A29C24C234B1102893D2BEEA07F22450E26BE882D0FDC2AEA +5457AFEAD360063AF6A079958A343F444DC6EE7126AB88ED079C0165CF95765CC52DBBB7 +3CBECD85BB4F1176C4608201A6E2D3FA69C439B4AB2A9D5441F519DDC85C35C2DEE504DF +5ED9E958F768E9FED68D18748C8521FD6163FFE0DECF1BA44B11A261A4997D13E045C255 +0CD95881B9BC5D65A7C4AF0DA73A637F4979A3B54B9857402738B1E9FF94CDC075F51817 +CDFE1DC677E938F4ADB9E4CE4DDF4F12EE6C72352175B8389F39F84181C189F1BA529E9D +8D84B7E36790C1F57CE2117811E986D00B58EEFF6C8121934AF2FC54D09C486A5D9CA8F7 +6887CF4D7FE4841F3222F0C4E4F7D92C014FB4D48DB83FA87C243D453915BD6BDF5278BF +1C16090730765D68AD17160744DFD19AC8A754915E669074D4F3A9A1F37F7D720B38D5E1 +5D734093944BA853010ED6C6CC7D5D885D6A1366B2FEE42E54718A2DC1BBD437830EF66E +A0F540524597090FC7C762F19C3946274500428C3C3AAD98D9611484C8CD302D64991438 +1F7E531BEC859E6D6624ADE92B17C4D88AE651E49658CD23840C404E1E2EEA4F56D6725F +E514D3AE47AB1127EA69CE677705C603CAEB0DA31233E15ACC5D78ECBB90DBA3878F19FF +F2A62395FE3B8EEDCCBA872A42334251BB515C34F513D2FB745033E903863C24A7F8A47F +0DE02964F1D3AA92E60BEC967BE17A207ACCC4512B8E8D62E767608FEC0D4F0C6D339364 +0332BFDAA278713788075972FE7B5799FCCA94BDE4C881CE667C4B7D10F1A4CE65766CC1 +F3486E0F23DC940A93B3D88EA329FAB54F531034113FC7970DC304A20FA97FFE7116C6D7 +1504BC0FED9A1C8E617AFED697DD3FA441CB5894D783512E1FFB859EA5686F64381EE1A3 +471572DA94B4D7AAC35E3E77EC8ABBB310D46A70C5AB691B050019B1408DB7D155AD3F75 +27E8FEF1F1492E8C96C96A0EAA70AEE119B244995F1DDAC5F9E1B4EDD07AA389382345EE +2873FF17B725037B66F7B5B3CB74237808E8A1E8FA6B597F418D62D174E716C0A857219C +DD489083E9086E5A3564A8D0925003BB0935792B38A458F451CD15D8824E457132B50F8F +1A486AE2AFAAB124EB8D387A4AD23B552803298F23AB33D96547E1A028FDEE361836B59B +879F544757214D635D0AD01C8B8D8FD61B852E3F6BFC9281C99D1F360032349FB484BF27 +256B591CAF48AE5A6A1117BFB824F3850E95E75AB6FF948233763934CB18CD290BAE9E53 +747FA478BDB6E343336F58D89E05BAE9B912D484171ED576DE30D6516D68FF80CC6BC36B +62CCBF407447126E8B3D6D07DF3C187AAB240B84B5D07CEF0CEE8AAD28DEE446F321C622 +0A7E0026C64802A9A006887A170FBCB19B4C29CE1D4E089F5193171CA3D3EBDC1A1286A0 +60C648D24BBBB8791BC400BFCAC653A673F4C3A59C44D364D408B72437C06DAD89512F6B +9526FF964C3B2646DA7E34E3DC95D2408ED3816C6177133287B88C896EA7D575D1389971 +2A9D3A2E689C003CE2D5DC4073ED052F37A3183BDCE5EB3B509385AC8268DDC54A33F8B6 +865FD8D63ED1C51B89B07DFCA39914F10AE7233C7A62EC9B83A8C6E3CFDA24528B1D1F80 +3C74A108E7239456B412EDCDDD5995A6E56535CC9D47E871B0CF8B36BED4818FDD112A70 +2704D417B79347BA3CF24A1B116937BDCCACF86D8D4C544AE863DA44A29C308F740F5DD2 +3FABD1DC281D722590624DAE38EB4A119F5F271C42169287D8E37D34EDAD684EA20CF29E +EF4B6BA4D65E41E9E8BD9EF2321C2453DD84C5AA056017E7F5321A3C11614D810D0095E0 +5DA9C4ED65463C672FF360E0104F58A79D7C399F058A9C6BC6298AE226E06F294787A1BB +0EF6E1AEF499BEE46F2AD81296667E2896098DC7535E1415E7BC0C3844E308807AD7E5ED +59EFB26E2E6E5FA00B7CB6B1A160DB111AA0072ECB249F30A29643BE8F51276A0DA7ECA6 +03136C0147C73658D218BAD2A6DD880C62186178E527901CA62511326630815850E0F4B3 +7D3EF6B96BACDC9EAE70FDCE411297A167780F749BF79652EC2BDD4E620CFB45B8AA9AC7 +9BFDDF782E3B3A6FA9A0B20F8CD7362AE18479685828245B6069F437171A4678C6C1547B +5E4E998C8835104327C75298AB50A6A0D2ECFCA02D466C08669A93BDCD3BB186F04770DC +6AB7C774D2258C4E8C54D56C4EC2FE59EB24697C8BACB485E4DC203630B052FE09D83C97 +781AAA7CDDDD22804591A689B563D318FF5D269ABFD3278C345F6028127C672C3D3D8168 +5739CD11FF84E88C3BF219A41AC1C1272BE1D130A8D01EC18A83906CBC0E02FB4F430026 +5FC5E19B6A5BF67379EA2AD989A1BE64B8BC230CCE5E6782514D465C736B904F42D18417 +EF0A985121A8B155C06E1D0ED8BB3EE89226D931C9A8A0F5E80882DA98C72E346DEA25CA +C3962B6C5879B6AEA1F91DE7FFF9453F98FF1FB2805B21994C0DB8DCCB8872273BD7D964 +EBA87F2FFBC46DB4FB8FDDB5840A162CD6F6BAF0377B43E5DC9DF9054B1AF843D5A4A38A +481EB2DCF93C088FB019F8209BDD37502B8190281BA5F0A91171AE14E313617E74B751AC +AB74070193E0F231497C20484851F0182889D77581BBE0B1539663F844854D59F93CB6EB +A5CC3D2B3FCCF8D6C3758F5F333033513DB561A9E318F599797BCF0FC43391DD600A91F0 +B478A983687DADDCF974419A58F98338D9FEF2036373B5CAE2CCBC0169413BEE50EA39E0 +AA6E922F751B981FCBAA8702428C7FEEC0BAA712989D5F1CB3692F5EE3A014F716D42CB1 +42FA136A7ED845F781C18C1ECA0B6B10699AFDE08BA05393E413BFCA01C7A097933F87CE +45D7A7339F2793483DFB43A26B277C5B5D5A3A51CDDD80D0D6C1FA7D16E03DA0F7D86E50 +85D4516BEB44D0AA911A7945B244CD4A83FEC04985877D15CAB67EC734B1749D837AAE24 +1832A1B555172307301CF5D25EF9DB48B9BB1979893FF637A3C3A86A6D1688F0B45A411E +C8C02AEFA1764F5BB2423707FAE1439295E75E365785FE9B9E5C485779D124604AA59F95 +B8A4025E3D8246CE7AEB3F659B0309C77B6D10FDB120F6A4DF76EE00EF3607EF9D22EBAD +0DBA789B86339482B98F91CB29598365A5E735EA4B7AB18AE1AA8AB8BFCB207C558BDEE6 +F6865D10C8B3487D342C1F6E74CC0B13B522BC054AD4EA9EDAEA215359465BB97CEB6F7C +657ABE5577BCDBA7DD3A61B2C99F552BB70479328AD21F95C8A1F98D019CB23B6EED8808 +658742B1AF408ECF70B36ACCD4F06E4D160EA52DEF62E9CED463FB758C6121724B6E31A3 +A097A7D21B0D5A021B28FC000C68F6A4126A5418EB129AA699D04482EEBE82AFE18A7D3D +0608E71F5899272A4E614E34005578746F6A9D082E29E2F03EF54E9F55D393AD28477E27 +C780AC02449FDFE3314490520FEBA7B38A16E94A302569CFF6958FCDC79561F3F93FC71E +14E780E4F1E9DA30A9B1CFF569368069B140F5B8E67EDA15D0F25404A32362327A0FEE9F +9AE430D517AA8465C72E9490C31153E3528F08843A100BEC4D4BFB6C5E87CA088D4D4C18 +2E398D02AD5D8007CA369A83881AC0C886E72D91A48EC085002017066262AD81925B365B +7E594F3DF58C55A9DD737F2069BF951DB68720AA4043BD6F039AB927F7149DDB7830AC67 +293A70B6906135DFF159B352BE8AE55F1D03AB3BF5642CE1B1A49F773FFA1FBFCFFF851B +3DA54CC2A5BCC6C2EB2BC5CD41676EB08B727526CBC01FC9C7A076A5342BAABD5341B6B7 +3ED8A27013ECA0861430BE51B07CED3522A6031EE04E74F985F10D3776A206BBA86FD199 +64B37F1A8998F4BCD2599A891C5A61C131B23D29788719C15728644886443D12492C87ED +8EDFEC9C5620F7AE2C5CAA568333C26C8866A2E2651408D2BA3B40B68875FE271283A331 +F8EACD13FAED2342A5A3A74A1E76B74283898D8B265E0FC9CD3597CFE85FB55B56AC02A7 +55298DAC4A7471FE68872B311B690E5BC0AFCAFC4CD7EBB5326E453BB07A94843935CB49 +095EE8C7AB1BDFB71011CE6A8AB7F51363DCB97AF77C5C1CF0996F7F1A33BA929E9D32F3 +FABF10FF45E9E53A4A80B808548BF1D70383418B57C986341796FC5E1309EED60AD85476 +A7FE1AB5AE38258D917F267ADA978D02FA7F44200954F8230FEAABC0D7ED444864C91AE4 +4D6BFCB7E09DB0014B6E11FE753C6CF12592156B7946465D1D51C8FDFF1671B9DF64FD18 +0680EBDFE37D5B19B60BAF8A1081C8107C0C207941025CCBADF11423B7F09356B7D2B25E +3C8386FA4F41617DE67D7BE0C3790F853CDCDF996CAE79A0D0113AE8293426662D18E2F2 +92452A9F2D9B3845FC5B9ED4088DB9CC86886D82FE7310F2A158BD57739A0A1C36A7EF21 +6167ADE2542E5124FDD3143D353122182A9AA36A530C96AEFA8ADACF50A5B0266B59E396 +AEA8DF4FBB2AD02EBF24B49D4BEBEA6F1555B5515FE3052CCE0C540D20A82D6EAEA1196D +5A2C029DFC79E48CE0448F7A9FD83C7F107B40E55383E9656321497CB2742756FBDC2646 +A850AFBB90C1573979B32A29CD3E1C7A3350C9E1727E884CA842E9C60601092595D44011 +BB4F24E8A505EEB5397445011750A059265CF4212B4A5EACF7CEF1E922722B365987886E +481215C980DAA2114E03DCC02D1BF8B29098F54733B3090E4DCFF294E01915AF5AA3889A +99F6656F8BB7DBB5844EE7A9FA0FDB8AE67A2634BCFF57B248772F9B5F2E9CF95410060E +22C51E6437EE48FECCF819B1655F052CE6C6EF2175A54652EBC6C38F7BF60799733741CB +D7E030198D32B9956AE908436200C6EFF6611568EF351402A3EF854B0736390F7A16B7A1 +50EDD6E39B2E0D42439FD75C1D0311C8C45138AEE49A7DA2F742AE3C21E19F6ABD62198B +6DC17A3A315AA746961425A18051A0C0C5653D40F9A6D3A542F430DFE71ADAA74586FA56 +9EB935247FBF47098C4D85417C0A3C6E567F7A65B7C23C1060AFD086186E394896D1DE26 +9244085D469240E8391ECD7B219A887F01853AEF9A3191AE70D8D11FB13C7578348599D1 +95186180E4AA0C3419322A318487A712CCC0EE9954C87A6FF2FB447278EA942C101E925C +95DF648D275C836F03A4D1FA85144C7D57622FAD6BEFDDDD7AE2E931D430E29885E83E81 +4C7DF4DFE157A423A163E1372999E34A0689EF8F66EAFA66BCE76DC6CD5F3317BC7801E7 +F090410D2AB40B640777C30476CF9BD7446A9860594FEA131D308D9AEF8F96B7B8731ADB +CAAA0FB8585DBBE770852E8A76A43FDF93FE9566F81A02C2AAB4014CD74CFC1682F33686 +418EE5FB80C2DC2A155F16292FB6B5C35B230038A91814B625EBEC0089B75E7F3019490C +32BE5B78620FEC427B756A3A8085E42ED93304D80108A5D957E479933173EDF77913E5AB +C5B84133CF6B09FEAAC3A41068883696A3E2FAA73FD401E4A5E58F3F7258207159970234 +FD586D1C34EAE89F2213B28F3597EEE1C0D11CA93310C8A294C88119600944A539795B41 +E332CFAC0E578B7E9E9CDB291FAC7B0CA3C125FD3D783E4D955DA04AF2EA8B5C97869104 +84FB27D05B95C8C8FA91C84AD9BE171106D0AF6AF582343250BA953452E1237EFB0142AE +5837EBB076D5C7B6F25AF4625465CC89B27977E6CB71AD1D4058AA871CF3FC749BC4B87D +D7F75D3D18E455C67705EBD876D9073D828D4D083ECD7925822732C07E1581B1FCE4A337 +EC7644EAFEE206C62C1A64E10F0F1603CFC09C98FC36E61A59E9DF4C1D410BA2B775C44E +91001A452798FFD0954AD15D9D20823B52740716F40354E503816CDF0EDD7B6B97879260 +1204972E0B4F8E783317388D31B2DAD3132653A0585F9EF80BA68093A79B773836CD6E62 +CEF409A9A4007D3D7760167F0719F5A12DACD27BF8E0903C75A2BF680048538EF924B616 +FADD681B2E850B2C6AF69E86C491CCB41F8F9FB000F76155B651133D09135EDE439B6A99 +D4B35A49E2AF4F82A369ADAA500C873732664D50879258A9C663196BC29FBBAF20A7FC9E +7DC8904DB9536C92E45F958AD46C067DEFC27FDCB71A7A1E2391FA6B6306B71ADBF3D6EB +1544F077E38D93C9ED11B2CE62D3E94064FE75DBA762BADF76E071BCC5507244670FAF79 +F5B0E11CD72FDF68DDD6C03E6D42E4D505F88554662BCD0CB4F5A0A33CAE7BF80854E715 +8B4E020F2D7517F8B5AAE67675E7518C6A14F00938F36E23DA2172719B351F0A19CE3691 +12DB35771C4EC37F61669D570932E14B82E3B419ADBF6D0E201587E0DC75A1DEE6262DC2 +6EFB9A02174CE7C7BA8E626ED0BB8732AA3618909F69F2D4147F3018494E22ABDC63C89E +DFEE86E6B21DA05163A32415E6142528918A6936F05948C14B2E34FB4694D5F664AA766C +5FEFBBA0F344FFA065F5394F621DB9E6427EA543BBAAF77515D7EEFC5186ED5F9EC74A97 +FD1663195D941CD67C91A5217C8D5C7F1BB848C6A3BD03A2BE6A48C1B2E8BE247D02C01D +B04A994F207D25D5FC46939095986DDDE77FCBF9698D3748D12888D33A7E429AE13C8194 +D624AE196D2F1F384F2B31801B2C3FF3217046A5E11890FE1D63DB4159CFAC405D657BA4 +E47734669D01E953B6702B972981C08A0B028F5655F7C8BD1DDFE145BA1D57129CB9D5E1 +8996C0A0E01285E799F4753CA5879F862A765B6927D7AE8FB474E8169708E1D30E2780A4 +F6893E46DA3F20CBA50BC6B8A310A9BB06713EB126961C97A9F2A4393D663E078026657C +AAC7E6C723215F0FBE58AF074418AE70EC0E710C97A1CF4A0FF853A8051F18BF4AA7DA5D +5B52CE39EB779B75843F14E7736363EB213F3DA581741C7D21D8DC268063C46E97FB0B2F +B525AEC2C6F2D25E0EC43F91225719B4087A92D3A44DF7B5333C64B92862755D5D9566C7 +FFAA3554AB50821AF913213B8738D8FBEB7CF5BDC7E8F191EB3B66A8AC1DD9EF0D5FB967 +B9B1833D8C67F0B6AB2A32F00D20FA51E841BFA6ED035779536EB6EEB30CB751C81D7270 +FF877E2A0EB624FC8CB8D40830B9FE2762FDA8F5A861A0006CE1397598A712DEB751647A +2E5AA196BD31465961D4CFB2F9E8C5C20BE1C92592B3E457CDD05B11DCEF03127B494B8E +4AAE645ED3D891973EE5D633A24B19B06B0F2389FD5ECE0FC1C5091B8334209AC3DE128F +8772D373142113CD296AE0DE58B844496A70FBBC89C09629E095EB1E36DB8E73155735C6 +A4029C1CB8D935F3B563F68AFB6D1DE6D40A59A1F7092466355C7C1A5C3792353FC4A598 +73E5DB876C029895CC933DA80DC11368BB19DEA413FAF2F7652AC6A18ADD92A7D647883A +4201773313B677A7A1D0F4985FC8714CD9632C8266BF7317E557E79CE1EAFF26C5E19F95 +698799264FC251C8382158ED39E613F3BE87660A5F1F2C6F7D9EC08A901E4800463E6498 +65F2FCFAB56F971730824AED3970830FDF3E57802A4CE2DF1EC509522D0FF75EE464A502 +D77A0E9095DEAA555B6EAB3506F2B13B817B60AA418891969AB75873FB0553874048C1F0 +0A9C61105A9215572B1343571CD14FF0AFA30B040AA95AF309F412692288FF9D941CB245 +5B8FE672B4E78D6FDD3AD9EFBE0EAC354C7AD246456CE0C8166441D72762B6518B6EA8F3 +15898649D17F406FC07C50F87F04C9DC12284D655F3A4A14A3D55E80E2D3D054828CE8A4 +2E33D9963903C2BD11AC757687014D2DED8D1238BEBB7260A96D973B062ECE3D429BEF7B +63B4394A2B1DE4F56D0729A7956030F8757762F13A90E211B7B245F3E968446F5AB19621 +5C0A0F6F13957C0584357FB760C68D41A89049B5FFC42A021B1AE9217BCFFFF0063877C9 +4E884FF624D80BFE56F79CA93EBD70844BD30D51D57E19634287881CEFF135EC18ED3873 +596C7C9656B31BE31655F2630934492EE1FC3E44B9607F1AD8F4E162C356A1383AE4E797 +0D2FD92A69282CD16663B2B9D199702FD3CA9B6CC7FB12A7A0C2713B3F5E81F844BEEB2D +F3EE1F31BB05BF57377B9356B776D84711164A49AD69C338D8AA3EAC2F616E735E5677FB +D54A8140DBA442BFC8CE397B2F7F200E9B8AE8417733F90B2ABD1C70F81259D944090B92 +845767E935B2BB7D5181EF5B3D50FC31585BAC37CFA267B966DE999D3B40B2023F132ED9 +C72F827C28D41751D67B98ED61FE3E611A4AD1AB2C45F303677C79A49F774F710004E604 +0AE91BEFC6C8DB58218637DE4923CDB315E941E5E124AFED06CBD0B75484B7B9DB3179FC +5759BCE19BE50D07541DDEDF00C0BFCB084FD3BDD10C4EEC22DB607D65C29A6D78178AC5 +AEF0CB466EAE31EEBFC7B25B2AE157C69BC0747EA3222297F4DD937E1523B9864B62A666 +A4ABB9B4B3A908DA0C37059E847AC1405D2E4246A3CB9AD3B39BF3BEF16D48F769B69422 +7D6743C49F6DBCBA1113DF16B64272848F092C34103B40DC3118AF1CAB1E743BE858404C +3A9831ACE27D3DE50EC75F982D9DC1B6E34BC678A07D214B0A22AA146AB298647927FA54 +222DA2AE878C8A0FCFDCBF90A76CCE2D6CD623818121598C31D0485C900827C91AB17ED8 +3DEE367788418FA250F9841DEBBC95114D82CFF93E8C6164C65CED77D5DDAB4F65FDF19A +26FDF57FC3AFB4F4D155B1AF747A668724F1E2FBCAB941987A17D4B455A74F4E5DB5BD62 +496B197DF439701DD993EB50F92D161ED2E37170EE2D1DFA169C2AA43752C765FAA87107 +3DE44D8BAA93E6511DC365B68157C81C8F3DAC8C624E58EB22CEEB668A058E23F3DAA93A +D05C5B1DF3DB0C88D6FD40113A851F1387E9E2EBD2460EB7FB642BDF4CEDF1B22DBC51B4 +2DD058AEF2CB32B20A30F1948A363458FE07B146012FC3842DE485E687408187A89B93E5 +FFBE019CEE53E8A46C3BD54D12D35DD09D638B7033F0E8B48CC29FC898128F2359AEF423 +192C75DFE9EFD8FB5CD2ACD71811F5B8BA259E9F4179CB1385F85C9B1CEDE79C47ABE400 +0ED992A100198FFBFA4ED40B9B55FD2053DC49A2ADCFF0D18FBF9964BB2976D676FE54E5 +5051BF7FE08C5C70E8AB9A363F98DF09D22AFCFC8290E828CFA5E965574043B310D9A570 +98EC92E2876DDADC2AB52B05564EEF2A64AE2327DBD80795618500D96F296E178CEB3042 +F1BC49CD8112A5A373D6A72A8248DF6D682245A134FCB990F9FAB1CFEE41DCCAB9CCA831 +2B833D6D21BDE04BB26F445093A8C7334F58F3B0FE626C0832DB7BE2EE788357695F3B49 +FDF2B8225E7ABB6FF7A51EA4F03F3F4CA1BE00F70D74416FFAC47C4A8480D12FDBDF2450 +5D53A882988C5747FD8729FFD263C88749AAD3FB70B064AF33BD21630FD5853FC8EEBC7D +91CF02EAD8C57CE136A4B223AF4BAF7D7C08BF31F1718318BBFA9D416594EBC59E8D0BF1 +A2AC0249835FC1C274065D9A28D0B8D751B9677FBE7D970771A8FD96700F00A13AF76158 +AB7437F5EC667D32D8287ECB8A1794383896EA4BD9AE047EBE471A9500E94C3B9EDD0AD8 +24C9D9DAFD1F058929D21244D81A276712454324322A3CFE36FE1CD8172F502F427322F8 +FC8ABF150BF749B132A9E93FCD99AE015F1D75D923F9743C23F0F2264ADE0BD0AA7C1C8A +4BDDEDE18EBA55BBC33B3C9E9204B1418D7B1CF592A5707805C13D62C284B991C817B643 +00FAB2E0457E59E07CAEBDEA55F1D8FC9F6938509E1A11168539B92705BCC03115D29137 +45D24D1533D6988DBDC21795FB59E25850B74A265C47FF6F7A548066FA6203C503BE4E7E +1590689F1A4F73B7B39AD4ED10D89ADA19673655EBE215CADBA0FBD85DF65326ADDA0305 +FFF9BE785E52F0797A345F8A49A58A704106EB220F88F27180B3630AA358BBEE6E27908D +512882ED69166A628B32F06FF47D9D05214A4C8728305DF287A48150F2652EFCB1B7CB95 +AD2746D2F4C10847800E9EBEF69188B770D583A079C79DA8D7FD9349E925E9A9A30F2D8B +35EE7115158B3B353AD7E4E4E740D93289F2CDBE6A75E6BCC8A0A3221CCE578D3A974521 +9C418768B4E332783174173ACAAC86FB61F81DCABA0F46FD3B90D46BBD8F6469C30DA380 +A5A356499394FD428F7DA46DABF232202A8A293B2DA79B4933D0790630A57DDB232E9E25 +4DA8C370F1B3EBBF9182C71EA3BB243DA9685B9B8C1DC22D73B3BE40AE56B08716D1F035 +586556DC0DFC07AAA66F5B3084B7BF87D0AF89BC6AF8CE1CB73B56A39515D44DFADEF15C +E018E31E7B4C61B109A6E105505AB97FB8CD2E53D37BAA3B1C2EC25DB055D87245A8BE47 +94A6E03B71A5F1D13B6E5A7E6C5594CAFC6E303CCC61E01516262F9BCAC1B745EE5B2AA8 +C0E8209C20A1EF19E93222C31B95E4B4FCD0F78F7821FE995494A98BD756FE546700A590 +FFB496FF6852E53470E1A5AB253464BDC12CFF3B5DACF8EBB0B99E822322F21999337A6E +5E849866939D87B2F16DA93B9F8CA7C83BDC49A4F8C5EA64E8F8A1C00E0BEA534C499C84 +4F39E38A06EAA1102A1DFC0E25643EF8A6245427D8E77EA2AC7B352463671EB6DE8571A3 +84D98E1B35C3213F13132FE76D03AA87E5918FE48CBCB8A2F3EA9B1886BB540095D97BD6 +188DA701888410081B8BF49C7043BD8C48E18A51042E92B542176964E292BEAA06E310C7 +FDBFB496D6B7BA5B07A1D36D516EC19C37E1DD06B9F6F85BF740D26FD0DFC09ABC3D4A11 +CEEC922B651C147BDC3124DECBABCC8986F5D48556CCC5AF38F7EAAED9D719B983DE7742 +67F8CEB3302B8CCA7DB832794C3C4F0156E72BED47BFA0F7E4B25E13C0222584601BA304 +FE38C5E96D3B5E709B6F5FBC623FC9BC36A4C4E8D82452D260F13186EBA95EE4DB5D4ACC +945D0A3C5C1800C1D3198D509F7B8ED0A0E33612E25B9344F1D53CD949CF9F65463B7C58 +4E12D78D3E6CF003F9A4185A37ABC6D5BD7F331CCC01540452A36524DBB34EC2FA260C07 +824D76439B0059A8127F940EFC1FF165005123C6B43C9700034D5AB9C7FA1AB62E9FD91D +ABDE5F3D5C03A771B0554ABE655545E133AB8C230517D51830492F29E86963AA55E9B79D +79013BB52D623E660A4D356C293233B79E7263ECE8F8B6EB3E56C82C2051111F49D45D12 +5148AB7554D601BEAA3037CDC84ABA8825658A09C008D19163FE5FD06D56D1A687EBB6CB +1C9812EE0E765F14077116182F67D3006048F8BE549CC71A354048520E66860A0D9350A8 +864ACEF55EF91E17EFEAB4D6266C9BAA1D6D3D309073C9DE287BC0619D7E37EAAC4B7CDA +D320D993B7B8F387FB039AA7E1F84AEF034E7845A1B1B5306AD8FDA2834B59F18E6F1A09 +66221CD9531258458E428EA237FCC45BCBB9C5DDE72061FEF2FDE731706A4C92E5B0B255 +49F60FD845C45D940B4C5A4F38740A40DA356A56B8D155477C04A26B747941180F6EEC05 +A5BA892A0D8E4638A812BC405E2775EC3A2D0E3C288D0DEBFF53582FCEAC6936C152B8F7 +6F9D556F2474BF5ACE2B63550FB94C36E29A8501CAA4C22FDCF908C62012639ACAA7619F +01BF96A552A662DB5664E1DB1A4FDC4E5E9050088D730C8E1F387CBF93619952DD8E23B1 +4A385AC6C222AEB44127DA14539A079EB16991F0CA2D851467828C23A4D524CD5AD92FF8 +0439F6F47D703E9BBAE227628420C2DE818A9D2A6BF085B5262E026C7A04ABE831065F31 +68772805AAA986AD811CB78F3FF8A0FA7A211127BDDA087C1459520F9420CB06AA4518BA +A8935A97BB88A62EC76AB2990D8D414392E31C68A91E9DA122ADC8AF3BF4CE550CB1D22E +B2DC916E735D19215C489BD7B62B842970214B0D809639706303AE7CA8E270ECE748D283 +A8370B4F6A37092EC768426FDAEADFADF8598591AFE55984ECAAD3177973A78EAD02CBC3 +F7DB13A7864EC1E7A68ECC54EDE88E7A62A4AEFA9DB238BAF1A22079F23930CBF7CBE82C +2B98E37F28A47054BD47B48637179F4C57164B26F4EE0B484FC8692AADB29EA0C770C789 +8FDC78DD58B009B4901A678305A0DA4E89B2152A596E13FAAA822DDEFCAA30BD2FFBB1A3 +5DC54BEB87BF96E4C3D25334D86761D7D78C50D71DD13BEC2830A96761CBDDBFADED0A3B +6A0EFC34F96CF540E238410D22EE85AFD0AF104A624D3F9EE5F04D9D8805D7BB502E0223 +AFD0CE95C2B32B30030AC7385BC898C282A5EA204957853640D4BF963C97540744F4D888 +72006B2239C9EB3390FE16B4C3415F6EC97827597FF791B3D1B3BEE6D0329604ADD0C131 +6B24B8544ABAD72B337F00B8FE300BB4EC7372EFE3AC8156328238B94E66E1EC7CAEF9B4 +D58DED07D9CC777719E2C973EDF779310890AF183F94254B2CA3277120A03222FAD58E4A +ED28AAB3DA49B5ACF246666A597BF2656CE2960FC95BC24CEAC5431F73074538B8715071 +FF284765EB54207CA22596B3BECAE73DFC68A4F9A287B8DE7DFC27D0F860771239436FB2 +587B07C1FCA6C74A020A819701431808AAB5B6291992D83DC28F2D943AD0DE2D94BEFBE8 +A15AFEB7057DD4A97B4C172CCCDB490E6F9FC265636A35A2DC556648B5F9F80D180FA320 +AC69A0A61A3954BCAD612FABC12D486A0F2FF0457073F61F2A74345B1ECA9DEDCF26EAD8 +D02D3F4678C7AA82907721A828984C6196464440B2255DB9171706819E0BCB7169EB6722 +912EBFDC6CD488FA34A5556F28D2B448A7187B1E15255202DC9DE4F609682B0B6D2F61E0 +4EFEF15CAE39FD3F6F7B32F226C759A17E6C611BBA79D93186C853BD59D73B19E514D770 +89CE29127F5B36F1C0D661597A6FBF85C15307F624630DB6564BC755145BD19088CBA598 +86B29328DA2452957E306EE08CD942AD6FE6697231EB43DBD8D37B4ADD0B4D8947A057B2 +1D9A133A7DEEB89C1D35B3F49F803700CAE8774A4F9BFD45CE309A4342E3B7DC36B6F76A +7B51A81B70E038E3E4999D6EE027DECBCA548FB5F4DE4C49981D4617133BB3E0919C4778 +B80894FF4437120F1035520C75F882591EFD511B6F47C166C7663EA2DEEE335DB1A3106A +5FE0C49565C2AAA0BE977DB611B07D38DC41E6DB8F959798286DC0CE835CE64459558D4A +20DF59F2E8A63E2DB701619617CE4DD55E82EB396D5D701B691533D0B20C3A0C20F5054F +72EDE3BDC2393ECED94EC52C25A755B58F4E2596702FCA68B64DC554DAC85CFD99478701 +BBF2A47966CF72E683B5934F0EA5DD86F35B1556026AF02BCADE75ED3C579CC1D9430956 +9A53EB8ACBBA2551B9BF06594F66229489319F5A5A94E51281FEF7BE86AF12D8A8A1CF43 +04ACD3B27D6B9A574F09E2C41D245D8873A78D1CDDF4CC88D96D9F714FEDE70ACA30B83A +797AD3DDA7D6E52A5AF906CAC560813DB2226BA5BBEA60932640ACEAA2E7B2D412068A2E +49FE781E2544FDF8C762D947871EAA0DCFC183676B5644AE02DB3CAFABFF140BBF755966 +C9BD319925746E320AFD5B157C55E3EDB4D0DC3FA112964D68BE2A5FF08E8B31BC9E510A +F6CAAFE84C0A103117913E2C9ED8FEFF96B941AC14AE07B1CEE2308E36F617DC33CCF32D +3A52F4F6561A784FF2C1144625133FA8E30F7A86E82F675F1EB56579077EF6AE086BC2C0 +B389CDB5C5999A1FF3E51BF766227A03DEFF391312065305E5C3BFA97FE7D5E2ABD0AA7F +609D8A0E524F99B416172F7A0D174196FB411F79A7CA6F8694DF4F5DC48BB58F39460131 +D47167AF47DD3A6AF1E12C75D947F4C130BAA07174DC577B49726123F34FE9C76411FE62 +8E354B43A5F54BE0F210C7523BF018DB36CAD6DB8063F14FC3FD1B4B69706D45E615C3E2 +9F4E1FF8943FA55F1B9B4411BD0DFFA260664CACF3C2C3D9CEEDC1274B71805FEA88C3EC +E5BBA17D17E6250494278450141FD4A514CE968C33093FE07E64F168388D141E52E46DFB +1E2A9F4BB5132C1E6FE25245FBBB3B1CB7CF24FE6A134382F9863D4683AD93338D3A6726 +BAC2C4174FCF4A523453EA28F2095CC1159AE0E0927380C93DE4B979E26D56881A2647FE +0C46D0B6B50B0CA3750D6974A8DE149E252ED68FE33B26E2F04F06FE6C3FEE1E7FD72C05 +135DA55508F10522A7A2D8AB07220E73283F978B50D75FF36E789094CBA1A8E342428B89 +3B9A664939AC711933A2A1C425291A9E95C396879EF54BB6F3DA82E88CA8C34E9CDC22F1 +BAF6588CD3C54DAF5A7873501EDA6A25B793F219D3D229F6A028D34A19A9ABEFF2AAE4B8 +E62A05421D9CC0F78E2709BEB6133A0708BC174F5D745A6CC53E6DEAD27A1E6CD77832E8 +87935BB8736AFA3736E4B4313D6D1B7EB464A02B0C6DC3BC7C84630C2E9DD020AF3F6694 +90BB8CF0185DF9239E0D27B20FBBA001DA7C30F0DAFC8AFBF45C02019E4AB0AAE458B083 +1051F65D0E398A75F52FC3D617A25CDC2EA1FACD7113E0EBA0262595AB5EF65C1D54CB71 +BD87CC35C9BB992E0A63ECB8A1448619148ADADB906DB75076E0DA42BC6501F6B6717C62 +71E3881CC2D6747D0A0BC7B6B982CDA89E2B9D9870C96A86D3A4E1FA0B04140131F302D4 +A36AB220399A6E551FB6051283E405556A1591E402FA9F04B87F1E3C2AD60DE3128EBAED +2CCDAC808AA1CC5E64052FBCDC1EC710A3551B3AD6E21D20FB112543EE0DE94DED4DD8C8 +6526F470C83B1DB3536D6DD8C8E021B7A9A82C23A31A6F09E15BFBBEE0A8971B3F471437 +F0873BC669016F219A728510C712415C515D3AE02BAD8467A1E0D911448C0CB280C70F26 +14BC2E52782C1CE5E79C783BF880D1B914E44FAD64E140666274D68560DECA2194D70377 +4EC76B35669FAC269409712901F0D3555B60175AC7799E31CAB70D06EA8D9C359C9DB9B6 +A3E02F6923C498617C041C28CD7E57486569429C3E4C89944E0EB150813854E3C2EEC4D7 +37E2DBB99287ECE4279F3E0D9D8EEFED11867F0E05E40DB8858CFC5DDBE873A174D756EF +5D5E0D5F251F0FC0BFA7F69EF8D20E34B1B3B5D45501DBDB453D82F56BC6271C281A8A1E +7D0D8C9B920256EF07F4AAC8FE2189485089F52D024BE36045E0BE613F0FFFE13D223B0B +2478A20B98E76A783A98E7AFC642AC9CB333D6D39AD4E08B2BDA75686951965AFEB5D211 +57CF3DC3B911A4E45144B3D9D4AA4CF13DA039CC95A9CC8DF44CF17F3D09A1823D65CD4B +29E2408B1C3FC6C1F3980378E1098255136F0D4BF90D0C4C042F1C86D40BB762E72C7EE1 +BC530755416A0DAC2B3DA0E7BEEBE7AEA9A39825EDEBD6CA316FEBB14C701BB7EA4F7800 +3DF2462E2E429FFC3EE8904D963A0017A606EA0E526EFF1E60BF825B2ED9CB42678B6F6C +E55A893A047A4E5E38F15349B777566334153DE574290C6043694C364A3CFFFD07180F5A +44CD991A0535D13C91FA1134BC457A455022614F3AFAB921A70603C47C96B5E466942AE5 +83621BA1544F2AABC4CF7C6E8B77F52FE39F5798E2FB9F180E3C86ABAC210C57A0226E38 +75885E3572BD47BE016C361E84754FCE64AC3345393F511C99BBCD70443D497D575BD81A +47373184CD09ECD9F4A55F1CB26E921A2B8BDDDBC8052EC0B8CC812CCC2353586B0451B4 +791EB68293CB3B4C41B46723D2F138D5BAA8AA4580A5660F0DD13F25BD665D4994908BBB +74182C783EDA6C5187C32B7D5DDACE8DB1571E7061A063AA56DEE4B0B6F5544437417E0F +5F07EEDA1263224E5E44B83CB057BF54725859FED215E5B528BEFCA470C8527F40A09AE0 +20CD42E31306D1E9095137CB6E7FA08191BBCD7176B87A372A97671B9CC090936EF7E4E7 +85F1C6B541387A701828AD82A958C34DBE426FB12A03AA3BA2C97535DA8526164DCC150B +67442F7D6765D16EBE7FAF904F42A8185DD30DE284916705D3D8826DF1D37E668F9669BB +343D3200509218C5F929E0DFAA7FE3B79646F62835C808BAC29CEF8CA6D8363F0AC7291F +E45A85DF8F0B9FC14C7182170AB1F51D9D9C33D8D98713CBF0931063EA95EBB031904EC5 +7FA914B7D7B254C3B178E174F807269B2BE5F340A3674FC03D7550017B70C0E53472442B +3FDD4D1D45437DBC5AD56D690D9098D9DCDB17AAE217F73B54BA5D965EE197EEC8823FE4 +783FB5A4693273C7142728AD3F78946C0A8B7D3714DEAFED570BA2A9DF9240B61ADA22AE +3F9B21FD1D73D4A474EA14EBFE6AC82B068D08EA2988E7C610EA5097B62DBECEDA5278F7 +27824E5BA9EA442B328C3B02E03C88511DA9C72A271027176EAC2C7B6392E9E99D8B42E1 +2CDD9991E43099C503DA5FB60E5D4F8FD3CB67FFAF46A1DD243D9DF13116880E727A9271 +BB778126C01AF95B75137A0E3831BFF257CA37DE0B3B4DF3C983D091F09519365B2B812A +0B6273D30B01515013C73AC3B8D9C4520B5267E734651E013B8002D09F3B5BA7984A588C +F6115DC9EB84C1C9AA0CBC9777D8923B3230E0A2963E08743E51CDEEDE33F7DDB10AFF69 +BAC8682A2B0885B8059661599B805B9684010A3B6DA56E23E265BC209158D3ABC69BD6C7 +6B13BA17F225D990CF0A42C1A37A5EC523FD80E60DD542322B42202D77F646FE34DB9AD7 +9908DF03C1C5C351E542294D245E1098989BCBEEED311FC5E7C8ADD52E52BF6F0F1331DD +7F874B30B0A16484EE328FEBB0CA559613500BFE6994EA8357ECAEDB310CEA3235A421E1 +85471BFDAA649E3CC9128A0409C454B3C951FFEFFE648F1ADAA14D5317929411AB7D78F2 +B888B63481346F415314E1967919783F8D143EC05B7BC2D5D9F7315F41F0331911FD0018 +44E301CEAC9579DC227E0DF9FE2D217AC8D7B014CCB01DE9AE852AD42FAEF07CD5CAACAC +324F3C00E330939FF4B5B677DA731FF712A6F8A10687D29A296B0E685A4F52F3009A4608 +8A935788703C71B584A8E855683278077851E1416171568CA50BCB4EBC8DE6C952FEC45D +37FC6EA2EE7E151A96452C332221961EAED2B6262431C4C7BFFDD59EAEB9E3DBB17C3EB7 +3D90F0F872289F8AC482B4913C0A05E698C91682C37503A38C841C25A8BA855E7C1CD3EF +5F1E025E58B2EB4599D76DEF57A60CF24E814B3166042F8084B08711D1C68DA4110BFA7D +E8D3FBBEB3DE32CD01E237A403F8581AC2A015106AD81FA0DF90301D6BD887631A83623B +4EEEBFEEDA012BD6C504B450A5F43137757C2EC7DB3662748B105F8B22EC030895E0F607 +5BBBF246422A7D0D6E8953CA66170A8947034CD6EE37EB7BBD0D9F02A538AA0F3D2D2076 +8C307F9558765FA715444282C823FFA3E95640778053A383886551D4F86D490FC156636E +A5A3BD258674262202F4F76746ADD02FE0DCCD540EBD60EAB42D01FE252DBEC93598D6E2 +0312F2F4704AB003FF956FDA5C2A88F716A4EEC93503FA913CA019456AD0A8F6368CF6E5 +AD1B7CE1BB20BF0CB453379DEB3423B0649A6380ED7D0B40768730D37A9A98B2339852AA +286809BC86757FAF3DD54C18C3CDE9E72FA874BE9D82655E0551DAF13FD665BD14DC7891 +12FCA109A1C73D4B0A7F230E2F9512D0DDC8029983A1984406A5F100567B88BA186329B5 +7A68539D43F67BE6263EFA278181688FA595ED3BC7C7483C4DCDDFFC01E641C231EBD842 +D21B48105397FC32D6A8D555015760029C2CAB13AC8D603CABF46867CABA01A99B95C92C +3C224E8F59B3B327A01AE685ACFE6D67F28FA6663F6E47466DD0A6665592546D08AB7C5C +EFD20D6D5115C775E033E0DAC75F2C6411D999DFB21172A8D0D3E427F768CF7535320DBB +6053BF3A17536AF6B2C00979FED18A593F71146F9DEA8B31639AE0586B24763DF3469507 +3D1172972B5E1CB82BC46A60ACB82FC66B05D9228C67F3FB25E2D91FD11B696C9FE505CB +9BD2B2D85D3A22595C338574978048050FD13A59C41B3B0CC2868DE4E017B53935793DAA +3F6DABDA50B06F8141511C3D5093069CD1ECADB90C42431B5188D912A5DF033B633AB3EE +67E4943935EA094071001B6F8FDFA00C0E8415358DDA77F2DDF4F7E2694CA6933C804849 +54A1DB8B5B6FE3A7A970DAFDDD1107FBC4C596C379881A6B148D21733CB2700FD9F4FDAA +6DC49C40A6675C0284FB931AB93CFDE9A94FFC23BF259230AE1724F22485864833541367 +D274CE18EC890E4376F48144950FBE566FD285330486F5F23BAD7AF0A636821A122A4970 +35D77B580B5862D776826AA3735AEAE9D5D7D04C4582778F9B0F713A906618632FB653EF +4FEA9BD993D11E0E51FF3A3DD50EFB462C4251A42D63863256FC819037BE597382C6BE60 +955D060340A268DCDA514793C845FF10EF0C72D6FF27BD1858B49D50516D48D6FD33AF71 +11CD37F5F7F0C4A4508BE16B80565557D025B529ABDAA2850E4EB6D8AA30ECF49B5D18CA +AB0BE944E0B95AA0BBE9F4CA91A56FBD41983A6703FA0FE415171CE8C11AF45004FAC49A +4346C206EBF58FFA74F22D21A1E069AC9DEBE6D36156C32E74A4ECD8BE2C0A6983D404C1 +07DE0A75C732AEA64C88389E15D474F8C0E7789B8707E2F46297012F4F51D07A10794D03 +195654BE0F7DF9A4F5F102C5A68CD37D129051620F807301FC8BD8252B4CEEE5EF78E803 +9D41B48CD3262419E9A4F93B678B9F471F4B221E7D165C1D2980CACA79F4E549D2ED61B5 +02E583516547A49E2804F1149855D77A0D86F3B1B429C56523FA773FA9452CD5B6340E64 +B04FDAE2E5B6B234D03E87E2FD39AFA134265000F7A9506F55505874D0B584C504DCD29E +CCCB8D71485AEC7BC34AB30453AE4E3B2720CBEB6A9C9FDD7FE7DD565902C6BF2118DA3E +95595C12A7744212827DF07AC5AA7B1E05D42FF38758A3C3105C5F0422030BB0102A9BEE +0E07E20AA089C118908BD7207E686EDC8FEC0580F7FDD106F202676424FE815EAB287182 +61FDE8A17F2662BDC02C0E109A020C57C8F37C4B606FA2AFB8C0993E2CD1A91AE5BBF801 +390AB8EB8841FEB2B066F565E497DECCC37DFDC2581DA9AE15E8C215DC41FC92AEB57757 +E92E18FBFE36E0E6AF6887671A9578C318C7FF50178B32CC9A046370946ABBE792708330 +D1C370012CFA2BF4A5DF75CF019ABD1882566333B0E637B9935426FB127699885121D83A +4DB8A43A648A459C83D623EFDF5A60F11ADD585EFF0579C91F8B5ACBE889D4993BA6FCBD +64318022C3310DB5CE4324954D78F06ACAA1FA4C8C4120DD41DC4EE2CCA72CA36FCC368C +A31323A17E4CFB07A0A02CA23F8518CE8ACE1548FD4B67F0A5C414C309DEE52E5327E09F +4B2A07EDAD8A309C54DBCFE3A59B9BFD3174BED78566F6642916B5B01CF4DDABF72BAB82 +60EB5945BFD987B96B80DF607C64747F5344A27DCBF4EB9797BA5D17B7635D0D936833F5 +0AD01CF4B9FFC273C05AD87745D79BA436590D9B50988311A06EAF7CE77B5492A542ED4D +129DEF268D2BB87D07DA19ABA6D4F78874A0A6960C9934670B9EDC47102EF929581A8698 +A9CD8F43E4F071577730D9D18AC416AB398124D9EBB91AB66A4CADBEDE5043EDF627CC88 +C68DED934ECCABBB9A7FC34DFB1B65ADD724BA67DAAEEBD04679816733D344635D997125 +7B2BA27D1F44A7D7E48F9C9A4A412030AF12FB89B15B07C3B18F9C6EB6AFED69D6A9951C +3C1563481B46E4AE5841D88BF8C64461CEE73A332AA07C89414B4380D0CFAD8D61C72E68 +6B34B0EA660EE0C8370A99398D9B0166F8A77FF24BE1AD496B0C0E8ED04734527A5A8C79 +64F2568C9B00E98F7165D0594080DFFF7CE5FF8C26097FAFEEE33307E282858726E675C2 +4B4C31AD2B5B1B855B73D553E77D3320E4D88BEFAB426B94EA33FC9AD8FA81B6636CD4BF +FC2D11BD1F52BC5BAA38C072AB771A9A107554A327EA10452F9C7624BC2DCD6DE2D43EB7 +0298DE357909FF66BE487285902388A024E120D587890FECE3A00376884947E1E6334BBD +79B4774980E8A110E7BB841F9289805FEED0DA0F4D4B8048F190DE68517EF34963FA1BC8 +F8C575012E01C280B647902BBC2B80365E9A66E28EC8698EAC50CFDF1C6D113827AFEB9A +45434209C921460BFF483BE373CAD65640FB3A8B7E5AC12CEAEDD5EE1B244FC42CCE85FE +4D34FB21BEF3EA9B959B6DB1624F05ACA4602052A78FF842BB1148ED529A460DCEFDAE01 +6A10B5B3C9D11ABD14C53020138A9624F0DFC3B1E445290EDCD7F2DBF4BE408EA8EC21D4 +4D9DB728B76DA63AF62EB7F89DC43144028D1098287566586F195B124B89799E3881AE23 +F89DD6610230B09D6B8BDE79BA206B87BCBC18DBE1BC155862D28CD742C38DF8CC906233 +09F933D073491984DA9D927635800B84A1C2350CD18D962DC9A2A235E2443F5EA72DA9F6 +45BE3240B03AB4D9D95C3B57CA05FE3A7011E12B182AAD81B426BB17D44D5C1EB10959DA +01563CA2260F6010ED7D37609ACF759EDF8C044860FBE3C89213394F03A309C04EE231EB +FD84191ECF14A020C7A4D7BF855213D927DBD921E2324BBABA6B7A06D69B4271C66F4FC7 +F15DD52ECEEB76C4C97A85CD59A38E1CDEE2F78354B0B71155227553FBBAE0EBF0D625EA +34B78125DABA3211CA9CF1D4AFA909080061588AF14CB97BC4DCC1E1A0BC04A40B107318 +1CAB643F064192A6074D3220EE050DE3A56D1558AC0F7DA0E2844EB48999EE9409F0F683 +92569D7E7DE78F070FA44C2E8ECDB09578598508EF3B97FA2B585A163EB540F2E8290244 +D60006EF558A5CCCB1D40CDED1CCEBD665A320CB82797F38DE80CF0DA15BB0E13B8CC180 +9D99437A5B25041EF68916C6E601B0432A2DB84C8DE1EBE4AD5A3EE34249E47CDA593424 +7C9E3F3251C59AEEB48BE773A6D775E6723F3B2AA55B2439CF841E1C729153B22550BD91 +F272DFD3EAA1336E94C8AEE4DEAA00C772BF05FFBE35BDE7AE2A0EAFC33A71DEC72B3179 +E4CE0DBFC083372451A7006B32357B94CD7975ADF21D5977D10444C80257874005F8A02D +317CA3C38DD0F156F191F88A8BCFE274976220F0D25BA30DC195F5AC0CA478FC1173A7CD +2A93B482916358E8B0ACEC25E51F975E210C895E1200FF2D29419EC300BB8284EACA5027 +69676CFA8099A110D1AA50B5A4523CBAF5FEEE90B605C5CADDFE233D235E008667D7C0C8 +B2BBEE796F1F78F4819A201131D4399FF2CC2D59B05F923780E775A9ECC284A68A2D76E3 +65E687530B96FC564DD173613D190EE8F1E6BAFC238FD9642D356E764860855820937E40 +44A41861BC40DCC84BD6F9969DEC343DC6F3F7C8FE9342793553B5C335CEF67084B9F1B7 +FDC790015B7F9D682EF547C986CBBC0606E0DE60E95AF386CF4A475902C58FC382C5A35A +2CAC908457D5B69C88E95BCCF40A9B12012DB3F548C3ED3A549BE0E5B0BD17B38022F2EF +2987ECC4A6EA46BBFAE4D6B330C3FA7DB68F0695F7A52C2E9BA1B97A6A2FB6ABA4B8EC07 +5E01D2C021D66FD6E47A4014E5AB39DAD64DA85D3171D7398BFF397E371C483283854453 +4E7815254A0612E9B79143E83555FFAB3438D5F56CC1B72BAD832D3F03F49675BFF38F9B +8F1A89D2E739F07B2FD36BFEE46B0F8E22EB6F23710D0BA81F3B421E9691306ED6D87F65 +4FA8C6ACAA3356D8AEF5BABD5F6E6231E64A772C550212A6EB17D9EFB987D124E63EB266 +72F2C1C00DF095C829BA7AE2EC7C7C26FEEEF5C7AF6DCB1C846F6B6DBF3F7AA0585F6396 +0A27CB026B55B06954B296E45841706AB1D655A5EE4B774A336B137EEBB2AF2F958123A3 +A9649E57BD61EAD0FD1B05C16C1AAD5AC103C0CB1BE0DA4BF4DF83A7F47814A64A11B90F +B0E449D75637E8C8366346E6839AE374FA3A2CCF4437F3F4C21B3649E8F25499556971F7 +210B267ABAF315E8B1D2120AD9D3110258BA296B3BA195931492AB8A28F1CCCB4AA607D4 +7DEE5BF92546FCACFF9D9243B8941D011F272431B2782CACBC99D9BEBC4CA43C90864DC8 +4C800605BDC071902BA524866FA1D98C709BF9200EA73C2FD8F41BEA226F37947CFE0B83 +1BD00F2237535653F63AAE9A6484A558FC74B7475EB0D895E62344F509D216A97B96B466 +24B8C4CDDE55B5E76D06AEBF9877562210AB2113912A2354E60C6986EB1077526250325B +B926BEACF55EB2D98858849EE63A44003D3FBDC186315D8AEF57F8F829EB61C4BAB6C9A6 +E3626F0F3D7E6BA066E31D3F322D060AB9990A619D26BF75C261C69F2B88A9C28C70007E +9B2C08AA5E8F73D00BC882F3680CC9A78E6D70DC8884A65D53E86B6A4030027F7D403CD5 +6106F3DAACACCBB4481C81FED3B7A711B04F016E18330367108EE6BD1A3121A9BD33EB35 +E824BFEE0D128D00208F3E1C860CC99AC8174444D75DF99CDEB40EB09C20355DCA68E13B +630DAFABCBB6BB51FA406C924F40FA40E3FD6DA0C673DF1A2F695E8EC2127D51B6F034EA +E96345AF0294778C6BDE553B2A9578927C484B51B4566B120F8A074C52318F06033716D2 +563658FCE1FC71C655D3319E3DAE16886B92DF451714283F5C1BC3FF960295B947D0D3ED +1A101F34565F24519FF5E7764E3C5F2304FC8F6F313CF6864E09FF079C93167E654A7FD2 +4F6550BB972F93C43FB9399A0E82D58A43B926F454F38447110891E0011904A776271E60 +FC7AD11E984AF84FB551AE9E7CB68466AF9AD82FAB71590A265A08A58C16046254ACB03E +98EFA92EF2EEC42B4733B1BD9FC767DFE45D4E74FE31B3EA3588746D5A6ED60F874E7C00 +88E2E423BF78909FCE19952A9BF46BAB57640CE2478015C7137D87D722254B3A70D848BB +177F0926A2E8DB72506A41C381B6C9D9F4B22700C5AF711F5EE5C7C1CA502483DEF489EA +0EE03CDD50292460C7352EA9B5B4A50FCA148F7FB3191432787A1D4EE5AA9080D95B810F +B13F5267F1486BF1A49740C61E0C6C885E3C5B9B28534CFE99F9C656CBC3500DFEA2C3C0 +68DF8B93243857CCB6D50EA01222C1CD2AC256063A27F29969BCCEB98B677F10FF3041A5 +D78B64EB9034C4D2B3EAB0BCBCC6C3A4E3F9F8EE0BC45A934C97F79E3ED5B9889285F535 +7B5AECE08D84E86C95B68CD40E4D747A33024028EB6D6CC22D05306803C5120BA4988696 +F91F4576E3BF631FE32273E3618F378FE44B56431230AD82B5F7FAD86941DFB3716D4598 +C9B3C3B92E0839F583D28577946992529A301525F1D784C6E8D21999972522D79AC7072E +DCE82D02F952750C4EF7BB486F202D22C5117C4AF3C61C182C177BD247A4F58A55764371 +235A5BC43A4BF5F2977EFB2B293246BB9A55B4E52C4CC35F4C5362395B69B56CB8E21F4F +230A12741F10EE5869AFF80FB230EDAE5BACC982A7B715287BE10A2C77CAB7DCB986463E +00C3CF475A746BAAF746FC1657BFA756A3EF1C5721A9E5129AF438C17CF2717AA26F3B55 +6E16EC7012EA595BE25CAC595AD380BDE9357F70CE740D44CED744EB001FA180E54CEA76 +A0F33436BEF0173CFBE3F450823F53702405E39AA9AE532ACB2D87F94B89385941573FE1 +B00E96F44433409EBC3B007A2BA87A026E9A99AB844F0826F837CEAF0ED515B75FE083EA +47AD5BCB8DCE6ADEB4DEBD9DDC83554336FB9B23FDBE3E9812E8D388DA8036B2EA0F0544 +5EE65BD22CEA0325423876C76D30F77443A1AD4B8640369327DCB70945C94E625CA480E5 +D18DB76FF293F7FB61730A67DEC184BFCB2CEC8A47476E40533B00EACA213C3A9162C02F +229EE91BAD96D2E7FC21930BA22596037E2BAA35AF874BDC4ABDC9DF92F2CA2CD38C5626 +4457D579CCA2C2D9A69E72B46BE5B19789934A526195CE74263C4E4EE29AA0F0897E1375 +F9914C3E39CC8E254031F58F1618565CAA96AFC2F8636856214A86A5BDC3B48F05FB5391 +797D5A8DFF2793D1C1346E54C7EE0E6170C82C5F826C58E46902D7AE72F4725410FC008A +D1DBFF2B0F6D269D5390F43663AF29E2138582F6B223C0C577428E2E320AD6E2D8EC8F9B +28F4358A71590309F5D75F86078B95A66DCDE939BB502BD0298E6690CC33832DAD2F7133 +EC7CBCF9EAE3134D91FDEB4BC8C98AE7C8020BF3B3D88D8F207880958F1DEFFD714A947C +1E2A6DBBBA6E150EBBB7576D612BAEEFBA83E85F20F4B5FD8CA126CE2E063A87005E4FC9 +4DF19C2EF01DBE2B45D5F255152BDB78BAA8506BA36190DD155AC40D4448F0DBB3A0C0AE +FBE24ADC1CC30F4E1412CBC6CD52DF405A4252F8557E8154730E483B8541E663E0BAE8C7 +816D95CA8B6D800446E4665EE726DBF0ED62395CBDE723ACFCF0EBA7D39697EF738A6F21 +CF591045F1CA5C3E68C2CD77143D7F694A7B9FE3348F70719B0F7D805E1BB83A1AC9F346 +1DA81E3167465C8ADDF6EB04F86193152EE00970D2066F79B191EE15E33606D83505C36F +9E8B05926BC156D236E865636E459EB06DC8A9AE6BF433511AAF8B2F37F0655488CD800D +BFC43897B1028A659F689618B15FBB801F303FE42402DA3F49CFDC8D03E5C28249400DC9 +44596A2BBF7F3BAD818203685C7C1B13C05CBB7E86EFB28B6C4D1C9D46DD08CA022E54C5 +4C6D84E0B15412F3BB3B7CFEA7A9A06BBCE4C69157ABBDD52FC5FACF0A23A53953C35191 +8379F3FF2F3BF089CF82158BD6E7013F5DC178EE34C55CB37A84C98C2F24A64B34978D95 +F82760C5382AEEC5761418A7D75704EF2EFA8EAD21B8EE44B87A8FFC59EAFE6B2CAA3D90 +CD2CD737421FEF85551E5E499847EF4B9D7D33F72A9B9E739CB294A16041EF1FAE98F726 +AA1460D1C782A2D3A717F925B4AE0E1A32FBA63A20692348F7BCA69DDF3FC0BF734930BE +518FC35FE0DE9F36E6C6AF15D770FB35B68AFC513969D9A0934131FB9A0A60B351E38659 +E3D6ED518CD1D9BFB40A16AC9E77CDEF94E5C3CF0FAE13076F4BCE2841C7EF7E0B364A1D +5B932335CE17861FEEE20D02237AA90A704EB6B74477BCA3B8BEBF8CE59E19E861832F0B +950FE683E1E5C05547F00BBD3478125768EBEADB91C6F3D2529FF871939CC7C10D0F07AF +58FCC9F8F9538870C3559DDF56BD94B5C1F239E44324C68F756B33989B482C45A7B78D76 +6E95E12F4E8853A430877E892A392C0228C567BBD42BE2E2FFA7F27578842D7B5D05B799 +C080B6E55B53D196FB2C4CFD7BF64115742FFC49465B2B62D80E877AA7E7D9D8811327C6 +6DB937B48FF75E410B5F639F02774678625F24CE25814E5718941D731B2F8F52A61CCEEF +66D7A63A4D74DA48992E4794B453734C9C3CB488DFBA825C094CD8B9729AD572DE4B4B7E +557644A0821BFDF2AEB7BF98C740C6F7BB79E0D80891BD9926DA4DAD346C785B381DF173 +23760CC55A8D050F73E8B8B751438037EFD9505DCFE058874FDE5AA5DEDF7B0B1978F714 +3F0981B964DB2F7A55B97C7ADF41DC95CA295C8DF2858BEFB21B94F5957715F982BCA5A8 +D6BD438C12C8E95ACC46E9720C7AF8A61A1D952F80E1D65769283FD18C2ADA03242F333C +527384FC8E5FC02B32B4802A8AFD6A0FBBD5678CAA927B5E970CAE60F72773BB4CE9E49A +0455728B49422E2AFCE32DE8528696E6ED42B350B80C39BE82CB53478FD8EA4B63DAE5AC +3ED27E83AFFCCC52E65675EED25001048297E293DADC529D37B5BFAD0C659292A7D89F81 +88A37651DED8312E33EB4F39EEBA2102712D108E8122F06AAC04528E3EC813EBE0D99EA5 +72E4EA566ABE4FF8FF53362FA3158FA52FC599728D97AA69A5C46FCBF2B0B75D2704F9E7 +CC7CDCCA951FE69E9C2B9B448D44E82D3DE480087E98D1A580354D4D0A8F893DFB7EE4D9 +30990BB3B886A2F0AE65B2F8C5FB109B5B7A69886E73E7883783FB030DA933B5853DDFDF +EC18E867FD17F24DF97CF72D95C7EC0897D20F2FAE74A9280DDAD0497CA6D099FA350C68 +1A46CCBD7B8E7AB3AD45658B8F8B3DAA18D6C5DF704A51DF6F2DB5F7FC218980B65BB446 +99569FF1D4081B16356114E4E72166A09ADF09827750DFB537E9F3CB07A29E2D4A435579 +8F9FCFA874A4772D04B7AF6306A75C68260ABCC1B2F59C447845735F8D9557A97635C2B5 +046B8AEC2815C5094D918D67638C10C7820BBD26EA458B076D5979E4DEE7DBD341097400 +2DED95CC963CA2D607FFA38BF2F6175E77ED9A8ECE8B81EDCD7FD6470E63E48A68C0BF40 +952AD9C1426B3FA70F59D03F317C1484FEEED313A9B21DD3410F3DAF2D664C8176FF63EE +2FF4D366A2E12AE43B34039BA38EF175253B582F457EE300E0F4AE056909C751F8E9F889 +EC08A1668980672230F7564C28C98BE3021A863086442F0D1B0169F98CA5460CFA959A93 +61E44F39FD8F5F1395C18B9DE0DABFDCB82717E34E836578901B33EC4CC2AF27E94609C6 +D78FDE2D2EE6D169036CAEE5530FC220D59A1BCE8DDDD67C2902E53E21493FF9DF4F06D6 +0787A3E6D31507E4A924BA17142C4421D2B87ADCC7A1D0861607A50C49E8359E0BCEEBDF +BF997E7988B54950D1B8104C504AF8B321D155FA250380D4753C739CC0C2866ACB76E1FB +D3A7CEB9C6DED0AEDCB16CB9C0FF78FC48A3B7B9CB117DDBB3F2EAFCA2A9462C3F125163 +6D130D50AC1C2E4381A5E89C22432DA5646E4D7191EB57F78AE5C8C63190C8A350D7A084 +54619FEADA6DEB239AC9CF577DE28BC967871FEECA21CBC24B7F5BC4656441B627A81771 +7B793E36D510ECD9835595B08C54504A35DCD31FB2354A2E3B9029FF9586BDDED0E8BBA6 +C0DBBEEF15BD4ABA2296F949104B44C7AF0FE063A14CC8498E52DA2497EBF940DE5F6AA3 +3788199C9ABC1A3EDE12C4CD6324EE6C6856BCF9C5B009C150A304BC37ED7581BEF3827B +ED0C87705C2EE399BBC1A2888BB0EB5BE6CE090C4EC75F44B77EC20C37D890E9225CA515 +0A3710734549550537F5E097610804FE488C0E67F063AE0B685D4AB5FF167D9462A87061 +3E240E17905E7A47119CEA30BB69011C3AAE24AF76EB189D7BCB06EE72CBB7C1225D366A +661A2DFF5F3E9E5C6AF1D81553146BE97DF02DCB92B690BE5C0D2C44E1A57FEC0BED0149 +9A6D08BCDC64AAC6568A1D3045616E470F23AEF55E642FDF155842FAFF49EFC7F6261F25 +662E6373E1A107326EE123240146DC3E8A7BE75E51FCB2931C8F42A6E76542B763192B1A +287CF88D28D0C897BECC7924801EC1D7B7B7E519DF69DFA0DADFDA635C9942F0AE4DA3AC +B6F1EFE8003E1192DE4EBB8C0656DC6BE46462C97C02B63B7A660B12B1E169416683BB75 +DD6AFD649F97018C8DBE0D4CA139D964A7FE98E7E86EC3F4E846C3DAE736F4C348D39E35 +C98D98B96E6A0436F5B5DD9ECA1DCCCA921879F11D42512810B55584A2F72607D20F801D +029534B9D3D7C2FA984005D00398FE7E549CE68EAA5B2B21D87EC383973C2D7A3A095293 +A510DF4F80074C4919883DF6091561EDD20B440E6FFDFAC0895B3D4EA594B7396B4B3AF3 +78559044AA7863D818DC89064CB7518D7448C749E66B56F9914E538EEFBAF56FE087CDDA +AA59C8A6146C282DF632571830B849A87E0A1089979BA0B38911386EC7834B8C3D212224 +D76CE946A6DE2B2C246A92CBB976736A586DAFE1B3D62DA86B7ED2C92D1B852FA2DA29E5 +7AE135B93A7110018E0968145A18CA917354614CB1937AD9EDE813A70B30CFB5AEBCA5ED +C158CF63704ACA8275356C4837B9CA53F4BFE2718FCD0F4502F90632E5F65FBB14C56351 +21B5A367A979E1515FB818FD72D9AE26CBDE09F79C244AE16E4AA13609878D0DC151915D +151AC0844AE2CD57426FC916E920ED93AD36F9412EEEDC7CBE6EDF7EE7DF16D52CE0AF4F +2E5470517F51B4D4DC734AE36A66D44BAB9531B8E2AA28A811F08F4283FAF1394E56FFC0 +9BC31790081146224C8A599F9209D59027843EC5C1DF4C9919B0513050868A107F9B48EA +8D68EDDC6947CBD4031CAEC69E35BA5F7F2CE967A9A645B064059A523A06E8BB5F33CBC2 +70D056A003D76AA7BA382CD149BE61990747C75F16D48EB550EB230CE7A87D8150AE1352 +C3A828660FEC741DF9A0F41677F8ACD0376724B7060B0DEA0478692B3E3EFBEC197768B0 +022B89CE385C383C478221B9128B577FEE85289F1AE5680F3F0BAA120916102059E3EB49 +74EE47955A35175C55EE172D41B79D47A1D69B679F08AE94B8CF805744C571B87A9B53DB +2C9F9573FE047343039413D96C6E757C9FEC200EDB3AFF4D330DABF5F2FD5A165C137BEA +4F975CB34D9B372E543A61C95408C284AF4ECB516028144A64CA94CD5B4282257E8820EF +1CE2CEFEF2B2254C7555950DBC6CE5E30176DBD5DB8DBCA2159961DCE778A703908A4E01 +BA33D7645C00261888C7A63D0893DB6EE0BC2165F002CE8B909264173D563EA04940844A +F99D5750540EA9AF7EE79B37173C4150F42CCD60053870250E45921EA215D6A318C232DF +9000542ED5479DCAB19B839D4F2BC2871F552FE440D7EAB59F1E46130D45E1322D1EB470 +AD5948C18BE73A0EC5028E37D6E7A0D2B0305683D244FC5E80207825FD8E587A74900042 +9C60722A87D9C0D96B32159A5E00120A9FB93A5F49014C86ADD51C4A1DE4D5120DC04763 +136663D080AE9A62F7136088200DC77777868075E545F8AFF504E55024DA59E61CC7D28F +0D2CF46A746EA11F9CC96E28A12F1C4E208D77BC61FC5F7C32CD6210AF8D5167D0781F33 +F55EB7C7BB8DCF35FEAEA7B268051C9BDE278D9AFDC8B1F832A96FEA08ADA9EEFD8B4D64 +525E223E0F8BE2D4492FF02DEFCE293DF9BC0B63FADFC0CF36D86408C198354D60810EC9 +A184885B1049D002D5250D46763042EF9466A3CC6D5D77F15DDED407743E5B0E66F07E2F +0D6B34DD74B03ABDD904746F47AC74EC694F2423AAD5AC1BA4D92CC812D14AD5BFBE7EED +E711C2FF2CA96229106E9B1EBCB7B247E9DF0D3497B50AFB597128670D3C37D33E8B3E81 +4CC5939FC944F0DA9F486517F19CF6DBBC50315F25BCDC9E2EC95BC5C32C3873FFBD02E1 +10C4EBDB28C5D812B259385DE0F27DCCEEF80D106CCF483FCCA045664F74BB6F3A93467B +F8CE0D96A004A1E0432B509E1E28CD71BEF3CC18FEB60DEC9C3C8B4C7DCDC14360C02604 +65A67941AF7445642F51288B5BBE76CBB54DCEBFE0FC2BB4F9DCEAD53743B355DBB7095C +4869B00D783D56AB252AD6242BAC1D7F71701B0BDCCA9788B29FEB31245E97BA0BBF6167 +570DE4DB44AB1823F301C2804D20BB08494685CEC27C481041C456C5D1024B7787385BA8 +F7799355810EA9BC21F6B14F7A4FC8F85276FFBEACADA152C746133E53A53F8788030D93 +5206C09FC2A130AAF5A6B28BF9F81A3AB72F910FFBBAAC14993777786D6F6B42FD005566 +B7D5C006BCC0DD10EC2D8EA90ED65F8EB52B488F5D5AD6AB2A46FF7C06B95523D79246CF +34576847ECC644C0A85F3D379DB1F97A246FE3B066D0A6F7B6BA63854EEAC4C82A92C3F4 +53A9A906DF74B5996B96D2A13A1F7EF9682D8F0669D4D241BA1012B13D69CE14263707E2 +22BBB0E36F19ADB165BEEAD76B323B55740716B85043EEF89D393EA418BFA7806FD23FAE +5D26CB811E5113DA77A37560F82AE3D2F4D8C4970AE092D0E56888D525D45563D0CB4DB3 +5317E01296570AB93CE8FBEE77BEB7E9DBDEE9F3208656C8B536F8E44F89203343DEF8D0 +C6CF20273522C4E2ED3AB104E4C98E0C773C991C89E16BAD8D6EF4D70EB69F9B9E7192D9 +36E057EEB0048168D2199D790379433974A70E9F418899D3822B0354596149DEF74FD653 +162778EC18B4AC9093ED9A6A3B3C76EEC9CDBF5A4A4ED23BF60E04E5D53A1CCE0360E178 +A682D70D86C5E5D8B4DB2BBCF7082558185084F8D8A22C96C7296DABE818F67FA9E5ECB6 +F5064065B7CFD19BADB214DAF76DC8EE0348E93849BCF1940962F297DB8181847B9FA9FA +6B443B870C7FFC99CAC69584C8CB64B01098EA4D3496EB66CB4A146766706945BE8AC9E5 +1F82AD6B2891A38D0065D37C2ABF340C05F8BEE47A35F3B01485CBD9B4C79D6DE4CE40C6 +E73806BA1CFEBA9C3A0816054A8A41B757375D6A0E013F96D8D168F0A18E44FCE3975699 +FAEE3089DA2C4C743E8F746C7CE589968319BF03874B6F577D2ADF4711B8BD42EB9A51C7 +256916C4258B3EE07BD2CF4431F1C835C2E1E86887E100703EAA07336E54673C3A3EB4F1 +B687442C6D4AEBF412398D1F1465B8FFDC4FEFD5ABD396EEA8FE981E585F3CA45798A874 +EC4D3D7D2BB31E4CD62898F6D6F27E87B2D2E8BB78BA524A54731D04E0A21C19C05C5F45 +357270669300949C580629390B2734F0F1A32C764E0BBCB8177DE0E5B8FE4E958E9651E8 +703C8AB58326FE0449A73AC645B2DE49E6FC099399003449124AEC31A8714834A8601652 +6198B6AEA7A2F0895EA9F9BBEB13311BB006F4F6452C8F23064057B7329D3B98C5C2ED39 +139FA2436C0B610542069B96D6A0027D4C3B79CC646C8E063C38C3EE4145236F955A60D7 +073D6B8DADBD102BE5EB88FEB9B889A0E7FDDE15B9F69F734EDC33F16BDCB9FB84481969 +6CA99D5D5BB5EA6B2C082EBAA52963C8454A0A1E475013829CBC977864B617A14DDDA328 +E086803BC06FEEBE32D8977F9A8376325B773199B29B1CB15CDFAE065B3A127D8D160E1C +472206B7E4497C9E91B5F487FAFF62724D86478741E6A2FF610256AB92AB688F2AB751DD +90D96090E98A2C94C59F0756709F828EDF55D4C7A56E329F3085A8F7CBC2765929BE87DF +11B087B08DA4D082594FB949640C24586FF1C8B505EDAF05C4BE22EF8574AADDC544C702 +C76D7A9096B206979CCF7AE4249552B38A2FA76F2A9E4EA55ECF7E7B4AC88F77B6FE203A +2D4780CAC541C94107DA1031658D2041ABBDA42FA36A744F55B1B79090B3FC71BA917778 +CCEA41B76A06564B753BA93BF518CDCC98192399E4960A870D13B48A5B18AAFBC7AC0527 +66F9727D135DB7FEB447986F1817A66EA426643E1D2A4127680EB0BE913BFBBF01BCC874 +92F6D772F4823ACB23F378CE68FCDD439A23947BF8AECFD88A8F8FF4E28526920B833CDA +DA3F234880E1CF5DCB0D1E333809B0BACE4D1A3CF36E122F5258E7B277125C9AC20AC18B +9323D1C8332E6CE51FF5C7CFD5201E85498BD05430993DD8E18A04C75200C6B883B0386A +8E81A4A6E3CC28E4D0744D8EAB410D60B93B82B64D387EE84A27DEF4115D554C338EB123 +40E9B6B62FAE4846FBE23DE6EFF018EA67317C8743F171AD6A008CC1190D6ACF47B5712E +607B1D6A6EBF3EC767F51A6D432CBE352E67FB4D976D852144289006679AAE4E5C582043 +3ED4A6F4DDB4F6056AF923B84B8436BDEBE43AA7FF0A84B71F469C7BF396E0EA95D31AE5 +23B41676AAAC68203F1214E08BDFA403EBDCFCBA37023A566A0BCF34D4237B6A86FAE988 +DDF9D5699021CFEFCF8BCC3862836220C39BCC82553FBA41585259B0494FA1FFD2C92C93 +C4380B885A55A0F4E829CE6EFFC72F6FE64B66E64A2E3B0E82043D164D0EFCBD3CE98D2B +8EC210F6570A60C92ED09E5B8BA6618BDA36F14BB1B1E6DCCEBE50E612A09660377A67D9 +3B19D79AC625693FAE271348044AD13EA26B4FE7D1520A814C2F7730537068C5C34984B5 +0B8BD7F836B957067E02A65B6D26456BE4334F180030082A26D89091E30D628BCA32307B +310C0078D3FCD2283D078740BDC955B4DE611BA1D09A04AE30EB30154C0573F459E75557 +A006418C7EA44ABAEF9382C182CC6AE260328551D722FF8D4B06D292E09215F79118A716 +77B0F6B4A7F15BAF61BBABDEFD83C92231DC7E4A491333DCE7B5D1FF92B6D79462D8B95C +E8300AE364B0D92F7C40797EBBC62F9847C796775385E343FDB02A0726FF6D5E118B8913 +F77E2DE8D7A93359530808B89BA7CE125C2DD1174D30F0EF295CFDC6E4B039283D23F235 +24D860B97851E7A59A8863959F75757E6F9F7BB8C5629675225CE1F9543F3EED0D931D2E +18A9206F709E5586CF19A965C5CDDE330517E19596DB1A817C3146433FB0220655949098 +0FF33A01F79C04CF7D46D80AEAE67F867DD572EFC12B469C9BE08D9ECCE54050A6331593 +4FBAFBD5E4F2348251582AA624E6743A0C8FA08FB3739A303D919A9796797642F6CD65D6 +7548C40C32912745452600D2093AD67A34D3219CB539CECB093009B13AA77CAE78AECB0D +A624DA455725B2707A8B27FB75411B96DD0F8F33A31CCA0D0DF08BB08679C6D2F06CF847 +23DDFCC89E54D68DBC2E8AF22D0E20F86317847D41BD78B463593DE423200FCEC1341B6B +A61B327CD89757825968B6D40BDCEB55BC00827EDF7994C12CFED6A4C16F5F3CE38747CC +8942C8CE454794209ADCE9A7D2608224AAAC684EE97DC956453071AAB23DAC8D28D1E2EA +13D28DAFF068BF11859F8E1B8E8C571EA30CCAD1333788647E250577D2E908F41ECA1B5C +1A2199B479F0D38731EFF6F8DDF3B86FD436D41F24306BE4D1771EF24B287EA32C5A60FC +BAD6655A20261020A3690E70DCAC494A6AF3214BAEED8C00CC86E861C4BA6F545F94194D +9FD1736A81A26ADB9BF05BBFED3157D6893014E87FCD8419D750AB2F51711D1D4FCCA860 +FFD22A121805E91AAE796708CF754C5030742FA9AE9CE22FD45089F532C769E906D2D74A +6C7DADF54ABB9F8CE74AA0E8B86F9CE77CA934DE33404BD07BE3CD88FF1D9C27DF034032 +554121F6214B95B17E1F8B2909C31B93E3BCD416DC76A4D150B7DC1A0D16B57A3E7207E5 +34BDF060F416E97B6C97AD7FC846F6A3CFDC92BAA822FCD90087A19C6C04BFB4BEEECF2C +E8B184E9D9A72005D2E2B306AB25E7708A36C3C6CE857244BAEEAED79DCC8420EE0DF1C7 +A3BAE477C4DC1EFD1CCDA761F230AC93BAD22F569758FAEA83B6FC12796C503856E171C2 +1B8DE2926E0000BD7BCB2087184865B43DA908765DB836C1397F86C4EF27C6B667D35B3E +ABE731CD32C0501DA20A26F086373E4CCA74922D3988B857A715B8C70F131A190A33D9D8 +C36E061A60E1B5C63C749AE965EBED843204279D515969A3A5A5C0616FBA3D7DCF19AA8F +B0B8FE4D5134EAD0CC503F0BBFA49E7C2110BDD4BE27DC7B67DD0F417AF8C33FEC671208 +9D5309074D1B15CD52FD2CF319D1A3B149D7A513AD9D7C0C1EF8CD2CD7031F082B27CFE3 +1CB2737CCA9492AEC194A92BB2E5FDF0A94A30836D1FDCB78D9AD2A3E4A289A7E58177B2 +9D92BA721571204A74441EDA8385B79E67E5AE5F52A2A181E8C22E3343A30AA03E2DF4AF +B65F91D82A7823D2A172196B613DB060917CB303C574522DFAD536167A501EC998004BBC +7DCFE97EE8AE4F169D604214B9746475C32B7E557223B20DE15E67DFBE2B4251DE61F732 +9BE3B01CA9D20CC06173FF97EF9C15C4109A1A6A321C4CFF59F448D7021A0A0E2ACBEB78 +C4C7417E652E46DB60BC50D79A8247146CCCD3D288F7DFDD1379154E6E67C3245B8D4F78 +394936ACA8A3BDD330219F916595035D95CF1AC043B3205981126CDB837EC4A69FD88C20 +EB20E8204E3C5388A84F25AC5E96F58BBD258326C4961CC39627359AC1BBD203C878FA14 +6466C407F206184AF3D5666E7A3D6A01A866523FB85A86CBC08C62ABA290248E9E23647E +4A3D39C6C1A4DB8EBFE9BE7D70B228A3D426D6F5F0B73EE30A462983D166782B02AC2B3D +CBF181470A396FC272782D83A2F6978586975FF35C955A2A15DDF14A0A152B91344856DE +24E10D9BCA853424AA1ECA78A8598A300F620C5D5DCAFC26E087A118219F6F17B1A468A8 +B3C2CA6E1113F428BFA8776F863D89B432CCD125F7E37002067D775FADA0365E6314B022 +E782134FCD614431D014018CE7E6A66092EE5113F3E94ABD5CC5EBB42B11DAA52D18C34C +3A8A973F1BB6AFA1C81BC36EED9595E5AC3ACBD580D6D499273CC5A04FF2FF51CBF886D2 +4A80DC14D0C7C69B04E77E3C0D9DF24D295128632562A1BACE9CB3D69332EB08490CBB94 +37A4CBEDA79BC03409C7EFC8B8C38072D37F9C2EEA32C59644EB148EA83C21534D28211B +E074DB78285632BE3DEBDE8524490B9CE18FD89374171B546D349828B5C2E9A497539CCE +B501FCD13C47F4C2C57E7B625963E7159A57A3C18FF6DE06B357E7D125574D6BC2A3B891 +A918E00AF3BBDF845E6E3BB21FFDC4F724085C73B147EC7C72AAFE2C7087133CF8759CE3 +5365425F272C61CF5F96B1490DEDE8E9FE77E6F7FAD03A79DF2E2A90E1A12263EE5E67B4 +4B1A7C1737E4B178FEE720652505F6C5AD062FBEAF7C8134E984B8FEEA448340FEE7E3B8 +54436EE0CF964B7F854AB52C1A7FC0CB455EA3B879034C34361FC56935B400E93022A073 +44F0552946915B6DF0464C8F7DA5EF0C6CC85A877BEAB9FFC4854252FC2D01C275E634B5 +2F4A439AD072ED4917A6132CEA7669CC1D91CFA66EBC689CCA482E9D5DAC4F2D4A138041 +82792ED95C8305E0BCD5B0D70C6E89F7F292FFF59D405B86A00765E0E2A42C18004366A4 +C9AA307E15395495BD16D691EB48649FC2E377B388B6F5A8D519D6CC18B4F2176FA9481A +BF4A0674FD8627F5A544C3954A4F51C234DD631301465BCFF18734190C48531D3C22A368 +3A8887D4C665D442C58CF05192C957A5B8D5246E925963FB22A4476E74122D5C5A45A64A +DDD5280D5BCE3DD52BA0C2C5BB01E25C6107BB785D48C5E37EC652343D5DF64124E0544E +58785F88A7677C2995B938923A3D31BFEBE629A0C0B10E89DC24AD5C5BB67CE96706620D +44122A38FE39966D83C60B29DCEACE2D5B7C62B8DD63A8C4933EC9C2DB8F0E1EA95C4325 +E6A392A6FA28BC9D8A4614B57D6454ACBE1D4855126AF4F741EA672C5DC8785B9510F1E7 +CD009ABC0DA119E418B9D1732893A71295FFB947382B621A35430765814A4D87BC9225F7 +C30315EE1C82AA20C6694A2BBAB918D6218A862B9606E868B7CE46ADD21F18FC192F3E53 +680F2300AF3404BDA02406D991FCBD977F993BE179ECE640101FF69DD7130AE252104759 +BE35F677641AA99B77998EC68F2C33A8BEB421CDD80A32C85187445EB30F882B11DAA52D +15208664CED636B5A8630DAC33A8F1A8ABF26A1E28B1E9C5A8BF20B535534D337780DF72 +2D36FB033EFAC9F460A030DBA78B9DA909984C36A8D3A206501585E2E7CFAEE68CFFA72F +3C55906EF2D704D8815FC8DA8CAD942581B20FE0532732DD02C2E7809FDD9EAE6CDE2B79 +F81DFFEDBF5B25B0F81E884877AD96AC10D4CDE1212BDF99DB3BE6B407AC12D6FF84909E +B43A9E47C76B6D10F728AC30B0AC9902AB6FC8F894FF1B8EC121C32DAB55C6A781D5AD57 +45F94D85EF8BCC8F2672EDA77E61499065D9C1C6CB105E0DA67E2562663B52D97CE325FD +4C0C6A01D33FB1D3DBE738088EB49F61BA3A7E70F567109226E247AFF09D9B0A2103C79B +33467BA06B94DB8BAC62F45935DBCBF027F1C7C36DD12E895077A646392EC61266C98961 +FAE84D5338D421424846807E904E1B276CACA31010E0B3E5F5A05E98B82A5576C060F452 +6CE73581B41C6BFB71867D47293EB5E120E0878CBD4F670B69EE75C203CACDA0B87CD4D8 +6A7FE930BE7BB0D0E004FC34C2A51B5304FE437BAE9F2A2615DD834E6D680A1EED495A87 +5362C820E355D56B2B5D2C70EF2756A992BABD7C94555961A2C39C5AFF95AE8B88DB2B33 +2D0F4551212BD258BD2D6C53A290657A3475E173AF1CC8A893337932D9B35FF9CD005B2E +7854D0997F23CB9D359D7462EC0827DAA520FAAB6B0A396695DFCA5758BFA64DDF4203ED +FE4F89457895CE06250121FD57536E08E898DC20F084890D65772A9E242F5A07A0CA75C9 +C3551E79784A8A3256455B6C88CDB8652ECB2A457D00B90E2C0DBAEEED508EE964DF1329 +B34B20E37D58D92B6AA15B5D5F56702C9EB9755025FC8FC393C430CCFA34180ED1BCF887 +05C6E3EFEE8A9D5C99EC0F48CBCC34F37FE10FDCC68B021E14A1D131FCF8D5C2F8FBF465 +8A60A554D418D590E03A268503D12C542393342599828553AD4589E8B0E6DFB2EC663AA3 +B6A37FB206C1B732C18A052A0F309DCA19DAE82D110FD3337A863206216B00317508BA1C +1859349EEEE49B9D25C897D29C4F28C3757D350B3000612D4C32AB5E072DC92700132514 +30C91CDE6C1035138C683763736103E836DB99ADC686EDE265182E8B02063D76441E6122 +F10EB88DC27F1273BEBC4219A5E6934C51E2A9FD36C7CAA59FC5A5D2049C0781FB48B30B +750640992D5CE69D1602543B81712E8514041B4991A115956C268DE747B0F136F8819023 +8D14DDE8DDEBB7E147057EFAB2D0F0002CCD0C6D997248A1AA973D284D6A04A3E009EEF4 +3F9E859CFB4833C7E485DF4786089D9061F6F4C1EC74BD179D01636788A88597B7F9742E +17C41DBEA3E371FC867274D265589AF7BEACF9748E7E21B73318BB6728F455EF9BB67165 +6C39614711B33B96FF3F74EAFFCE174F0CFD3704637E5CD8AAAA0127AC58C82CA7B20971 +670582631831E7E5EDB9A27C26C67165C891679515E0514E6D6CB7ADD9CAE98B9E578DA4 +7B521CE6E8A0AD1DE58A024F954A424B707C462C83F5B459D000E5195F45FC4DD186DDDE +4E305D1A2743BE9C41B337785B9D57EBEC790987B6E1D03EC686CD01C3E2E14D63E07AC8 +FBDF1D5D1B38A2BC1BFBAE604908BEA0990033F9F4FBBB8CAA310EA2C217EB5FDB8E0B08 +98F64639043595E8D09010D98F959A7BF315716FE1E05109992F33231C10B7296E284A87 +219767CAB7BC5DD096DC7E164E114FCB6CB16F078275B08936A7A036D17B96863A068423 +D4B72E67EA43483968214F6243E538AEFDD7B076B0B6F7CE98A914D2A2332751DA48BCC8 +0A950FD81DACC79DD6E3A2EC69B724FCB10CAAA58272FA64D625557153DC7C1683858F9C +00C98EC395D7A364E65B33A0A8FF31C7FC19CE7DFB5D77E2B5196C924039F2B4D4859C11 +F3E9D42760F5DDB4A3BC9B78C0CFD18F9B75F4756DDFE2D7C3C8C4A60E6ABD17A234CC78 +10A6AC5778570C86C63B27926FA00D01A204CB6E7EDDFA36476E7278B67789B17EAB6F9B +384465DC8EA130CFB75204A20E63D0A77F4F2148BF88AF8D86A7CC39FEFCEAFEB7CAF7B0 +65D7CFC437E55773A2F24A1F7156C4488FEE00627ECE1B4CD8F8536B91B477331073BEAC +A38423E177E3BD2F6E5E31673EEF7C4510D430BE12AEABD40D3E7116C4C91F47CF12E4DD +6500656EA37E109AB7F5982BEEBDE4C4E1AB125EB84B560F82716B4D672D13CB3D424596 +8B201C3B628AE15A0E35EDAE952720D3D7DC3C373E1589C1B94E758BA485AD155FB984F0 +7EE774778F52A84919E48959C071F7ADA4D5D64A81E8D5D792F9E8DE6C491EF9ED29EF53 +3CE191646D7EA108500A935EC3EC9B4092EDC5920FD07A5549EDA2F643175B7CC27F7AC1 +098BD65DEA60D6780634EAD4FA2117E74458703F9722C9BFAC8863D2BBF338EF586B4E34 +2583F1EE4907414A1FF2DD25BBD2F5F3B10EE054A6783DE20C414E7366BBB3068D0E3CCD +A8AC3FE053EE1B89F32EA80EAE51D9FE242D06752BECDEF0F9FCC48DD72BF764378C8628 +98B308C826837EEE3C1F745325F1D989D33650C5A11AB9F5C47C20993159CA359ABB6E14 +ABED7BD14F7AB1B604EA8179D2254BB6D2F9F08904B91C645844368329765045BC4B0EDD +D8A5256C878D64941DCF0EED82A61004E584A8BA9CF9ADF76F5CB0B2F26FA4A4E6499C45 +92ECBFBD4736242A8C64D6E692524B3E663CD47D0341637139F2029358BF07AB385466AC +BFBDA0A68E684D4132E529F4CA6E3017AB2EA78F4281C290E2EB2A948281C7C466AE758C +19FB86A7C335C50BC32E68FC5973E533DC14720A90E5AE57F8E8D87B0567F291C797A00A +B00F1488437F05B149E4CE5B182C5CF82C3B15097C269913088C9A493C976319BFB2C669 +553240D1025AB656ED019592AA7AA98DF352A6F0CD453FB20FDA9BC5E53B003528C1701A +94F06022EB7DC590D290D564DD37357DD75AFCA9704642DDA1E23E47FE3EAC9E6B5D22B8 +AA0912C8176CB668997D9B9946314647ECBAE379CC2E8A836F697E614CD975560278F0AE +74EA9A7C10F94564170B11426EB79670083D2F68E3336898E5D670AA4785929A2ECB553D +356F8AFD7B0F95E8AFE1947C638684800A8720AB299EF7538D6D56FB1B679FA5987BAC22 +A06F3716B089EA008B1DC55E3CD09A39F0A903B8EB764E5AA9C1AC0B5231C440F68D4E01 +C36BAFC2FF18F34087A5B90744D85B8DB03B3F8F3578E1605487328A11ED9C7E7AB8DB6B +580D7329026F14F24304B195893CC1D091D960730D2C45751109DE55DE39047015AA14B5 +C497C41867A5DA02E7091FB40E952E8ADDCB0117562A04E71739AE2F9F2CF315D510DD0A +063AEE64F428F29AF03B9436652EE54D68BB45FF0E3A373E5CDDC9AD707A989AEC860A32 +2AB8C2CBE68F36F2523B1145ADF788BDBE0F577AD7F5B082ADA4E4F798199883011BDDE0 +18783C3E8246D2829325798FD75CED42DE6FA551BAB1A8E0637BE3D487AF286EC8B42278 +14FF0E5BD8B32A0C524FF0A0C22C8735BF7145D82F6721E7774D2EAB4C28BCE0634A10CD +571490C14979ADB3126983F20925E30D7DE2AC03C146432D8B15DEFEF9504467604D9F02 +32F7E56163F09E9BE071FE10FC3CDB00F40004AF8B01239CE23B5F69E37B35D5DAFA76B7 +8576B031E3386C6099407C8042816A4EF9CE790110CF24C114EFDB9C8529A43C41168F10 +A17C2ACD6C4E299A9DE70657E70B16CEDF35EB41392648F09A02E1E4717400DE1A346671 +37A7CD6A6EBC5F48A19FF169A279F815BEAE49B489923AB6243E4C8AF35B4CA1EFBD8EA2 +D21211D869E0D3DA441860B6BC465EA8497507B8323CBC9B41AE6C774EFAA7224385FDA0 +CA5104978442A4279CA25C29401BBA1367CEF35A2BE9D24CADBD7BD9695BE9AF03BD8DA6 +A62111A9B59A24A4ACF6334807CABD977D251213079A7265437C822AE4893BF048B19907 +E997F038CBDD1FD0B412AA2817453698EF05EEF47AB03E9FA77751C57210969591876316 +C83D5052163EDC28DBACB472D2873919B63E9271310702DB9521E8C18020470A4DC60EC7 +A1007BC82BCCFABFA1F575011A9067817930AE0321659ABFCFB4CFD6EA7AA86AEC98D64A +1854B666D075107ADC85FCDC67D89C379741264E6554B7F60E19A5292D356E64538777EC +830B8F0931D34A61F9CFF3C37E187D99D5A2E7E876D1E8996F73FDCD7E614101F97B8BEC +A0744AC91DB473C0103B6820134BA545183483C05E1EF90B59B78305350080D2204D751C +C8AE8DD9462DD62F0FBCE507F6EF39AAD77024E89975AD12BF8F86130D9B76AC7BC4D4BA +BEB06B76BA3D77DAF45E769C732882DF011DD3E00845CC703EEDB8EDCAF7A6EF4FAB06ED +AAE69FA3A9436774577899367B202442BD6CD24377AAAB605114823C26D249CB0E130CF9 +60D8313DC983131AF766483BA063D7ABC0BC24EC06DA0720D4884F9421B9946AC15C30A2 +DFD1375F5CD56D83C8B94CA84D3467574641768C02ED50024DA171F856880506E3AA5840 +1E65B0B73B80BE8CAAC83A1012D1F244F4B99BB4BFF9F001FDA8F06946883B1F0657C3F0 +22900DC7E6EBF936A8D55CD5D0D66291E24240F8B997361BB943B5A9D36900ECE284CD7F +66047938301E2632D00CEC224B1811F43475B3EBD58006DE58DA2F91EBCE1833CC23C395 +C071663B9A91B8FF22C98D840700E3256087FE0A616FF9C2323FBE8CA67CEE432A2D2AC4 +D00407877B33CB35B83591CABBF8700623D58B8C745C6FD0CDB21A2C7B26BD8495AC72EC +A551C5B077D0EE92F5A67FBB4D438114D161566167535A3B8BD74EB10382D997C418428E +F88388B24D9D78C103572341D2BAF842DF6522087E28058CCC1A8A7858EAA41D1F588C55 +282E7AD9708396959DAD7EEA79291F5FA856A15E0DBA1758E9788685F3FE87AD15E29379 +8CA04AD209B10DE234315BC07132D32C82ED96B649EF7BD65B80A45FB3A48C5C3A994628 +118633137D02298916DA8E3EC7598B8FF27058EF911807A26F2189169D7D53A305F89659 +B6AD13AB05ED759A14FC3FA59F36902ABFDE6D02CA63BE37DE57EA0FB0ADE69626B8AFF2 +C4CE000A5AD361A7311FB0503F6C6EAF4E12E90DD26C2FF14CF944F1C7D370D1035DDDE5 +DDACF493116C4B10BEF55FD88CEBC22252BF641FE8E871D2A051F774A5D3D9921D1BA16B +26765180C16A4800F59B9A6B990340D78EF95CE32DC7F14F34A67FFA19474C8EA4641284 +DBA859874D070F5B345083E1AC095CA5348E0358FE7B10F3DB25027CA0C6F63D034974E4 +64ADDEF24654F73B0473208664323C568A2EE651373FB821BA60F3ED0844FB75754B1D3F +D47D3097CECD9D8AA2E3C12A286F3AE09EE3F27E136DCD543BC7BDD8F4E1831FB190FBCB +8B5EB2BB4C91830CDC404EF0F46DA4A9F41345181D0F74F39F36F5D1E2FB935D595E6331 +80AB43D32F82C5F339DEB75288209C1F7E006326239FAD725314A95ED40D51CC657E52C0 +CEC73AC090702C85B9F171C89B2C787F1E7B4EDAA41CFAA83E47CE0BDD74E9AD13E71539 +A19872ADC0B12C705E9B4B271016B208974D97623777A64FD6F4DC176B98B07F9BA07D8B +949DDE4A4236D3F19F360265D8E745845F2E6D74C1982803330033B524B6692E58EEB2E8 +D1A3EC8575839D85FD65EFBAB49938B9BFFCC0A23D8549BEFFC4FFD9B5644B205E17EFFB +A6D24813F3F490722DCC5401EC9BB107ABD77D11FDD60D882E20F1993F9F471BDE3DF47B +13D8BDC905A1EC61E9325D4F6CB62477FCF08BA409B7B1BADDDBD072A8FB38E26AC452FD +B77D07A223CCE2EF62F7F7365B8C9697413D77A188491448143F300B09DAC3F77EC6E287 +C372410597198B2E7AF074597B6AA4E86AEBB31E56BA401D0E6E94C40A4F6EEC7703C3EE +06EF6FF5DDFDFC2B7443D67C04D7311BCF21761DCEA797936EBA6098C91A973EAB0A9D6A +E81C1893C7CE1A8D2181DB792D20C29F3E6C5310DA2F4A25DECE6246ADE8B78C0593ED7C +62D5D6C89B6EA4AEA664A79DED2FC50F958F8B1C7B92942B4E58323F2BABCA0B77B79992 +4738A89BE91ACC5306B0B6E45D672069AEB3485A0B52E931993E600B2E65F969D17585B9 +23D1E5C75F44E2866DDAF942C6ED937C4B7BF2409F1BF6397FD27BB5DC7DD077F0F988AF +0677615675590C950D0F9A39EADB0FD85644D3996C41A5B45393BF9FD3EAA4435F9A99CC +5A35051000E4FB703F801E8B71115A0EA3BE19D5AACCF5B0833AA87FA7CD506C3131B6E0 +5B3B92A493B57268CA478EAB09E71B1DC304A329DC6E7453F4B3721CD13C2B670C19A764 +9CCB29BACB087E768F9A817E893A4A0A7EC4EE391DF074C947B2978A844D944A10E2229E +0BBD69B27AA210D58954353D1266F57823ECED7EAD0AB583F4F27CEDF3F92D1FCCF34BBD +ABD82B2BE6BF7F958EAB3F5921D8CEC898D7076524B12D68DB720BB81305F195EF87BA96 +264878A18F98FCB5136177EF743037D4F7141A15744FBA348614DEEAA97A3510FF277A18 +8081B35AB29A53ABCFF2AF1DA946971AA55A72022A6DD32A7F55C05EEC925CE21704A5F9 +C35D5CE2130C32A48EBB7C30EFC34419355761BCD0732AD4B351BD046C32805BB089A3EF +B013E4F54374E8AFEC10ECFFEE05982915D22E25A2158F5BEED6A95EC6005490FF895CA5 +DB459A2DB44108AC0A9602723619CC2E013155ABD1286C9CC50397CC7AD975A042833A03 +3C2F010A0208D2B5F7FCAC1F4661332E91F43507BC6C55396FFBA9E2965CCA72EA47E3D6 +A0EE5BA53A8DC8579A85383B394A043B26E15EBCE158D95F14C714793513A6E11C0B4FD9 +A02704707112AAB327416114A7E25F6487E6749A8BE860330104E85A2791DE3C98B6D6DA +8D9F251995C972404D1A0D4F044E828F03848565B821BA154D836BF8BCDE9B4F3968E32A +D031AEC5216746F5BB0C24B6EA06EC50E0AFB4BEB48CCE75B016708682FBC063DA14314E +37152516354E42C8A6AEABEC056F7D9B85CE992D20061F25C87125A9DEED6DBDEF357EA8 +68E970CC703B5C8E67F94C2084FED1C6FE0F9BC6D26D132D7A8AB5EAC1B2801ADA11C806 +1D005081A47B901204BFF62BBEC6E119C24E047088B44278CC47816306864CC85A242CC8 +0D2A4A10BACAA701E62980CBB93B59190E7ED184E280B0A20F8CA4749C6375EE133A0A79 +5215D020563EE1AF19A3C573BCF56533C2BE07D4669C21E22FD33530D408714E42371322 +E72A367B66EE7CF614BF7F4647E6FC1B9F9E18867CB630B159D965F6B4CE54BFAC489F10 +FD115E894741C99B40E2810CB37E6F9529CF01989C96E6242D67BDFAF52888F1AEBF1870 +AACAEEFED464733028168BA7FA51311F251B9EB544BB6BB6F5FA90A20BCA883E3804916A +C83A39F9381FEA3D8ADEEE8A62634D02F3C7FCD8F01268976A3B90C59BFB9AB1F7293C14 +48E00102EF69931EE40BC3FACCAC7014FD78DD06EB156C860DDFCD7963038197189A681A +AFD7B886C6E7E26C87D4293AE6B1B4E7884FEDEACC9A2B049119147417F3AEB87B33A413 +C4FBBE3D0E5FB7D61B114A85A9C6F4A95D123234A394615192765DD73865CE47E4E0402B +42D3A1410AA055B18FE654FEC978F28FDB9865B09227A98940613EB39D7B8E4CF55CBCE6 +C13A5ED3DE5F617B495CE502392AC8DCE6A7B8CC7AE9B37943DEF4E6D4015D3936DBE823 +79E1210BC38B20BECCAEEABA24BA09357AD20C0289D2DC03E4CBB007B8B49AC2F1A47CD0 +5037FA11C1E1F36ED2F1DED20FF9D5042D9F9300B5C79C1803A9CFD65D80BEFF3AFFE22D +A6A1A48AE94C7F647195C920B4FA1E025B960BF661D592FE4FEE71702A7093BCD4AC1510 +7CA7CD0BFF3E766CD241DD6059DB2EE8AC74EFDFE8EAAF57B8AF7AA57B41EDF431549CA5 +DEA22928192F8D1D14F3087C9653F3C8FADB30FB994C72FEFAF5AFA5EFFCEC3725285D25 +19B356ECF7F22D1C6101DBF3F476575476166E599DA264073283C19A8ACCEF9C0EE2C69D +D9F0FEE3E57CF25CF842D0D3CBA7204B63FF0C4FB0D364BFF2D43D04FAEA7BEAE5300B14 +319DEC628BE834B7F995DDB697963AC750576C154BA3B31C102BAB9BB93272D6799437AC +9CDD83275AA5A15164757D9D06F95CC444B756237352134AACD5BDA0C41FC0FD98DF9C74 +96D32139692846A141BEDA8E79E7279F1ACB7491ECBABD9FDD1AE69C61B22DCFDC81E440 +B2965F0D82C291D07806957E6D017B8EA7AF37F05F5331BBFEA70A3AB8B078C4F87F4D64 +CCB62D889852BAE9C0FED70BAEB159343A9F3E1F2BBFDE54D5E9353B39B65C16E2412234 +D4E7E1C96D282E1C8D1B38D9B9293FFCDB5EFD759D583C9EE63A407F08A6B212AAD91FA9 +FA501D1C725EA8B08AF2880F1BF0EB6CBF885B70953517189B8536EC2C7960C7E6D5CDE5 +22282682107CF85CB025FBFF2E88FDC5ED4EA44DF630359EDF17BCC33BAB47C302F193E6 +5EEE260DE65D388E935B2471A70A40B5DAAC06911ACD2E5BC9D2853A501EBFB39711151D +643E9E4F78CE0FE4678ACA19C3F7B45E4DE13696E35FDB7EB7AB60853A6CB942DB425AD5 +CCC11AD042773482E0DBEA11FB1D3810AD5DD26B175339603E4E8F32A14BF7E994ACD717 +AE314DC77EAB6061863F7DFE05D95FEAF8436FA218FC3F59EF8FCA198BE6CCAEB3D4F3CB +BAF8F585FE5997C4619EF19E53DC30BD017A67E318612FF82EA2553D060B7D406904327E +779B4980085565B8FD0D7B497FB4350AA989820067B13355329BFAD8D9281F0703A9049B +75DB584D5FC19F3015BC11EBFFC3BDE393117DEEAF11994DF5B62B5CAB0B16AE64DB714B +E1ACE83640FEC6AFB4D5A66D7DF0AE5DBF347EF96B535E8ED1839CB030703846EA3D2E78 +6721D7A3409C8C23E7B0A609525D8A675C88E069E4E39C4E06EC3CBF5D65F4FF176DCDF4 +2DE2AD6EFCF7D2EBFA8E3FFB2353676C39B167AF4BAE04624856DD334890E8446134DF7A +2435D76D4D76090E7B6914873A08688FAD94CD3CF36C10F983A211BC0A8B0276265CFB28 +A976E83092D7B210B997F392AB4B31AC6DD977276E3EA61B4095F5804ABA0E21D8681A5D +E660B5C095054FEB45E9CDEE557675F66C4380A89FCF51E51347BA633FF52CE6F3FD9596 +5B329DE8A88AEC6F101338F1E0ADFD99212B29B725A6C4997117FF445DE895963F2787B9 +0A892C0A22B2D244834CF54A73082597044AC27F5253BBD4B01C42A69B8DFE25299DF085 +8C545801C56453C0E3659CA5A6F4FA3622968F77EBD8E551C8B5FB354B8192F3978E4DE7 +52544D029EEC168734C623C3DBECF5B362328EEAB289EAC40B85EC5A36FA3F73CA1C9A61 +771E4B2DE1633636F3BFCECC3D70741DEDA306255AE27D4FDBB89B811BBFDEEF8867E490 +C1A731C51EBED996DF36340D570FE89004AE7FEB5F686E1129100685EE41086A245154C8 +1D80DC435DE1253923B72DE0C6B2EE3DDDDFE5C0CDE38F683E7CE4813425EB35F9AAD55D +3CD3E62314510DF6C2FC0EE94CC188DA028C82FD9BE6C8597B271FD0ECA5FA6AA0704A0E +9C1EA47EE0DAA990E98E4BCE43EC3ADDCDA75ABFFF6E6FB98AB71271A73C3DFDFAE883F3 +B37A0D2193BD185786280B4DC961470011902D56F511759FAA40308DCE49EA5DE8C073F5 +AB3A29630B93ED1D1EC77A97CB5B157F65B583A96D2D50FD6EE078CD6D7A7CC4A31DFE09 +23A866725740D3E39ABA8305BBE4D4196EFF98A37788B9E71EA6E120DF0E6B9F14BE583A +EF3F2058C22BAE7DC3B63BC150EA62ED03BC238C27E65DAFB0992DFE8C8F5879B75753E7 +375E76ED56BEDD1C983B9548818E6C2BB71E38BF3F771B65F84706D75FD761A14ADAAD2F +4BC97ACCC1191441BF0AF940FDF539F961C670AC4C8129C1DF1E479207F50D1E08478503 +409C4E9D165946571AC1CA1D7EF9D31546CA99C1AF6F7611E605A08EE2E49162EFE39E33 +726D6ECF05520DE13F634AAB828595C898678BD119D7F6BE976AE504AF22FCFAB6F930A0 +29E176F442504F3ABAAEF24723311428384D691A98DF4689C6930D8860FEF6E355163282 +700594922D73799A67D834F1551D7BE208615F590781651CEC7AB705EB278B3470D7371B +A90AC7F0FC6EA11A906030EADF328B63E21A135A4BE6C6C1670C9F795097749D994277D5 +3866BED00493512C771C973CFED9D7125A095FCC4ED15B97E3CF56398981A8ED0D26266E +5516FBE18D099AB62B457C6D8A1CACDBD04A3F64D4D95A6F65B7DB021DB83C43DFC24A27 +E772D8A805FDE4F4645178693D5CD29B7ED26821B4DD1AAB2D256693A99F612500A903C3 +65889A1266CEF14E112C91F2E2DF5B27A3D979E957C5F70C9AB7F64B88F2466ECA5DD0F4 +465D920F5E78A955878C261079CECD27783086379EC6BDA8CBAD8726167520DCEC08D65D +4A9BB2729462365F7E3B97E6432EC01F8833870F1877FAE22E893400A346BF8D8729727E +E7694035DDCEEF10B596B3CE9754E69560A1D8F61AE59FD3CFBD0D1CB94A14AA155C2CE5 +03D238912CA0DA82E700EED99544762C22B8CB36E4EE2C73738CF1721ADDF2091411F98F +2F7EB86C46E4DB9CF84EE208F6049F73B788BFE5B38328DB074752C8BF9B51327A7E40BE +F48A409C0B2377236D94327A0A1E36BF296A670F5E75AA2F4C0AC6815D20B635F02B6929 +D72C60CAAFBBA4DC377B5DD92E904EBC2BC2ABCBE404197C803F7878F33FAA8C66EA0062 +CBB1E24BE46D23AF9762C2050F85CF03084FDC271BC0910266FB693A4C5EE4057C2319D4 +3921EC66E5408A0D28DB2C094C92CE16A2A9802A3D075B12D15C0F4F4B603EA70D69D94C +102436EB6A835D4E9C0937298843750472396D20FD66A039871D21588EDF04E607E03A0F +E4671CF071D2A24DE7AF33D9C1E3124607854CCC014BB6980C4ACE3B73F1544846CBA010 +A86E003A464014699ADFC587294C8F64F80F1311F4E0B8CC1624B7CBABB7EDAC646C7351 +D67CDD61B352D8E21DFA5D802D5CBA52A364B019FA24579BA36A99414E3B018B8632031A +365F4A0E9E5CFEE1C936E546C11AC93A2B7EF433C2010FEB3B2F315D806F6D1F42FCDA3D +144DE40934AD30A14F3AA66539FD901C6A7A9173DD4B2EB6F0F546C43DB1BE141B1E3442 +E0E0DDDBFD1E6C582102C5D3CA9A856A7082530B3C84DAD4FE67C718D7AE874C0B59171E +2CB2F1BD37A1C4DBB3E767E0E844E6A189A828384D042D055A118DE26D9C5787CB81B102 +F8DDFE285F0D24E0CA87658F2DD9B553B1D52A37B0E0A1E18AAFE6EE4D0CA2E3CBBE5907 +16FB32D9030A6C60523FFCBEA0D682CFD92341BF5C533EB7084EB42EF42A0B6E7D172B14 +805780F54FDBEB03AFD73D2219C74CBC569573B5DA65CDF3CD11D8CD1E3E60DC1AFAF5C7 +417DC5C8BCCDF6E129DE171607901C35ED11B0299BF2104C08158EA843AE803B63CAB426 +842C3B4D93954728352468A44B6A02115782156AB7DE5FA01B7A2C7C3C69BD02999A4F89 +3600E0E79F60EBF221A40269A40904EC3DDE24A4FCCF92DCA20AF2614B11D85F2EF90015 +9C878BE4D889D1471E17AEBFDF34C29ABFBC8B1FE07BA33A5C6B51B3DA5887AF6C6EB0FA +A7F7AC8EE55FA82C66210012FF0EF781815EB18D1530008AD7EB0705E854B3FA44AA79C8 +EB7A91BC40EFD85DBB3AA61209C03D1C8D70A57AB608FC5EDA04465E8C6545DCF52C867D +6F2F5175EDF68957BA609B1A5E6F9FB15F628EA7F0D74186E278D45F89F981660029CDA0 +B1CAAEF12FDEF8C4686171A9FD08BB0226DB70C564766AF171C6D25A08C6669F71CE6749 +43F553CCBBDA80CD3C55F283F3068BC8070B96EA52D2853565E00DDD209166FD46C17B85 +604F4F4FBFAC1E7B3FBE13DFF9C2354E625FC87FB3EDE892C48BBF9D11A3FCDF65A29E76 +FCEBA941644FF4485A4E14E5749CAE0CA96819C9B637CFAE5B6CEB8BC390444763570362 +D8B397C3783EE5DFFD08EA0F09DDC3F1A29452B3287443D67C04D6ED1E61B2DB7921A52C +7D25073B58CBA2699AB8578FC49CA9D550D482F1BC7CD283BB8B02390DDEFDE7CFB447B3 +FE99D6FB4A225DF571790CFA6FF35BA51440BE6740510D7BF8CD55FE16E6F394FABBBFE7 +2D2070BF9CAFFD58FCA0A70BA2F898511477A950293A2197A3E8A7E3FE7AEFCA9DC6704C +0ACAF82C39784D0D800F52E775150D976F1BC9B9D91EA99E44FC9CC9EBC08DED6F939CB9 +86CE37724553657133AB4903D0950B235130395EFFC27F76466ACE37A323358C6F935EFB +E8109BDDCE9EA7B22F92DA7A5F5AC992B4FA798C0F670C0467A63FE7571F707053A11071 +F6BD8D93C1B32F1359A827222080AFF5940135A1DA02DFC6AE1113A93E5FC5BDE02F9739 +0FE65F8680B0999EF41AB024E35A88876DF86E413AAFBDDFAD693C0BCD4654FD8F5B9A51 +BEF91593357F8F16B7C59CF6DB3E5B6B5597B8F8EE953FDAB759EF5F42B8D7E0282CBCFD +DD13062501C683FD109D972DBAB823909E117A55B08E20776A79BA61CE6D84AD8995BE0D +4D2AD126F6C195AF54998FFB9131E1F3DFC61F6AAD217D0DC339BF8DCE17D074EF5537E4 +7EC63E4B707D0048543D939DCE6852DAF6DC1FCF95D689441B998C8A5EEFA7DFEB894B4A +90216B335464CA50BEAB87DBC6B3E23AEFD21DBA17B004D9BCD94357EDA82F2E388054DC +593050F7226E133A937F83462C4A91079B8E96029FA17A4162384ECF11F95D53F3984022 +B02C4C82A702F75C0C3F91FF94571981380466C8BCAB42C2D3A33C282E7E6F5A73EA38FC +7E296FCF8B1E4C24DB0E2F7F076F659EAED92DA4C9700B6746ECD85995746D648B9FCEB8 +FCF7DE89F299DF6A6D7DD11FAD78270D2F45D75FB0BE0FED1C1290B733212C1D1BFA80B5 +D17CAFD3F3FF5E504B3EA44727AF6F3F37DCED87DB486BAEFC2D7DD7DA55635F671895F0 +EE51D1102B1B491542C9F3CC8F1D1F14CAE5700DC1566B7B44ECDA0150ACB072820C480F +F92F348C108CE1F70BBB830CB9BC69A3F3E4E52D191BCC2BCE475734B38238725E3F3A01 +84AB62B13458F221C2C505587407B5623B23FE444ED5BEB0F37CA4265FEAEFA74CB365D7 +401CD4C247AF0DE67280316545EA659C2401A8D8F8279A8BEAB4FA83F9AFBFBA32794C7C +A7268F6BD3CEBC42895E3317C1E8ACC0D82735559AC7EA0378524E879BA243CD6F938C6A +6BA39385EE7944805C6E3D0CEC912D1D711D90459D032D0F29DDED3320E437A8809727F0 +E42B52CDF7B49A350D8DF3ACC7FA81AED6E290DC3D40BA6A7001ECE8222BFBF2E7D21AF5 +B5DDDE2E531A5042892CAF60BA4BADD60AD61E811BCD9D7608E00CEB90989E48DC676155 +EF3D790B8A4FC96A351DC301FEA7B959A8CB44F228B852CBCE8F9450E4D288E48C3A5D6C +616B9BE51F38E9ABE16CAE86549316ED8B58E9B0D81E7994BD83A314601CFEBB5413C580 +399D87BF9ADE8D90BB6CC68CC36972159CB55335D74EAAB882A1C3724A2707037E5098C2 +2A6655650DFBB2F87BAA1B3EFF8AC76397A226B95492C64E648FFCC08F8A552E333F1E65 +660AEEAFA3B0296CFC6B300D3C6FBDA01CEE297241588DB27E449C03F0386EDB5D4DACD1 +59BFE6C5915988099909AEFD10008CF1BE8EE8E9F1DCD980DCF0394503177FF49827A3B9 +D9FADC16F0890A6D330146809CB5F3823DB1F9FE042B95146D6880EEFD113174FE00681A +697ED8BCC6E6B61188903CB3CF5F6248EE181772F5F873B671812B8FA93C1089BBFEC5EF +0696EE1715FB37348E75AE88A096C1141D19E7AACC7A1DFB282D180E8A08A8C92610D2D4 +E3ABDEAB7DB34FA630A8F5151DF12269454146FF715DA88798240C01F82BCD3BCD81C558 +E6CA13767923803162A8EADC641182B71A205CBF91D93ABD4D194E327234F4FA56F4C496 +40BCDFCCB269A49F449929DE799A99D15460CB9C131CA83204DD513D68F10A07FDC0DCC4 +6B93F8D87EFDE4590E3FE360779B5082401493763FA73519E8CBCA4F815AD8A95BD10135 +3A1F379DBF7ABDACC2E5FD6CBD2AFE90044D86BCEE408AE8A32C89C224EB483256854C72 +E68653701EA2AB54C09F98A365FF042C4018A0DDACE380B54FE568F3C72FF16E73A594C0 +E9F3A228171F6EF548EEB0A2F52A1EF48CD81AE008B8251196854A03D4474EF064C3B9A8 +C92427F5C3297BFED28C85C235272303BBA92E37257868DA3D4CC651A8E8B007AB388337 +29587176479D1F6A95417EDC03D9AA5B6FC390DC64753B279206DF1037A26F38A56D8A5E +97DA5E3F416F12FA14484C939EBB24CCF60CE0CB682821439DBA8DD842E6AEF330609AD0 +756ED23585F99CA1BF6A9D1520682D939B38408BF49DE661E632FFE11A7B9286AF457698 +1F26E731E8576D259BE89AFD3E96A0872F1992FFC3D5687C5324822D09FE555153E1B03C +7C1FBDCF72E8B369BC26A0995C6B5F5C3F0B6505AF28033E46CCD32D396F1FCF2BBC314A +CAF1BB2CDCE7B5E89015E304E1ED36853C9B8C4550894C208398A4596EABD6A675EA1716 +2AD277A409A2809727CB0F7D02F74910093346FE37D14EE063F6D3B6EF9C682988ADFAD4 +75D07035999A7247440FC2DA98D5EF04D718281C8F36719ECF7701D2AEF8B845B983A1D8 +46AD41CE818E1427A23A2E5F842A4BE05A6E867653B6D4530E40B96288C1FB0C49F47CA0 +ED4CE1456C3582C385155F309A5EF60819E3E2EAAB741278811A9DFFBAB54762ABC5F045 +1841D0984BE8960BB21E8642071E442D5EB7491F2261C855151628787A4C699EDA1F05DD +C578A9CB506FE5308A90B3752D067DCE9E715F12F662C5303CB064B3F5FB46358CB4F803 +21D29935FC49B937C066A1AC82913863D01C1FA85156CD0869652350602D766CB27BE412 +1E50493C0AFAB232057614AF48CBD74C4685360FD02900F8780AA8F0827F2F7E0B0B0306 +80A4CF3969036081462D92FE2DDE06DB413B4E76550706B43AE982AE2467353B8059A32D +B35DC0D388D6264C573182970C2D0526A6F57AFB21DFC59D22F8D791A214F50D716428A4 +BD37D25A5958BFAE8DABA9E2438270B90440AC7DCD9D4D8A3AAE7E6F0D54FD15D1C8C1D2 +3E04E9BDA3CD2D97C1DE1E6499DD2B2C9D1B789D600EC6B2B9E24739D65D9C8114606645 +D8F2ED5178E3647DC8CE3827E53FFBDFD5948F7302AD1D70987FAF02E5FD03A1B9CCC6AF +C658B742C88DC2547B3A4EC4CC5414220EAE69E23F7BEC39DC476D24331422D0FF109416 +CDD40545F6802040ECE231B7840CD13B8611D88A25CD60BA268CEFFA145592ECF8CEC07D +A9846135D35E035CB55F46FD5B9AB7D60CCDE973A3A51AC2F0314471629CB80CE30E6ADD +71B6819EAE128437C1AA243E869CE668C8BCA434D5A1156A41581D27F3B52DD26BD4089C +A25EF40DF171EE2109A17BCBC93B05EAC8418F4E415B6AE72CD4211DAA97780F11A4FD11 +A96409AA6BF06A69E6ABF9D31FB157C698F9CD86DEDAB707BA74814C9C96BADB58EEAA87 +3B4D4BE0C4A6FEC42B9AA8A70F57DE8399EB5D574B132BCB2D3FBE7ABCB621BBC3E483E3 +378CEDBD2FC9B758AE746BE44EB4973581E0F402C1738FB987E7C7B32FA9E3DD3E822F7B +7B79A5D67E0E7C455ACBB780BC94AFB886122FEDE728272B619765C841DEEB915C501C9D +5E162E25835F660E33C017C88A2BC8D1E93D32CE0C43A83C17937B7E886810F774215EEC +57A17AFA1F89AAD6751ADE08A4EE4A6DE1208F3A35D927850042155EF6F44BBA6BABA143 +BD726F652D7F8EFB9EF14D281186F9A8BAE057F048D7914429B7BD0D95DECE36C48C6F17 +599FDC8F31FA2A0444C683962895C68AFF8B343B9CE4703A2761AC84B1B31946A7C8373E +A369BF33219296783C5A3465179E1BAFE1BF8443801C972CF6D28BADDA13F78986F6DA38 +8CE4453D5E7AC0CB518D5C889688F3E54C3C00BAFF896961357BE6B4B487064A9660E353 +E8CD453B5B828AC0F166B50E0C1CAD4CE97469403B22EB2C3FCA6A734706EF4CF7F9331B +53E13D0A5653473636154D94CCD625F8858B69ABC25762AE4FA1763BCEB2989CCCDD275E +ED8E95DC14500574276083F59BCA0A2BE8BB1A9A5510C63FB48939BB2ADE959B0342E759 +F556A6BEA0D78099719C9D4FB5D8741598522D483B77155C9030D252E28C2AD364C84364 +39A58ED8E27CCB1469CAAB4CD8B7293BFE89A7BB6B72C4EA5D7C29EBD5B2A9DD66BAE6F1 +9FA45E886E5A79B5FC7A65438695659213E0F4C7A6590911CA0C976668C7C2697C4F0A54 +4E3240D23DE40D53274415F5D6CA333CEE4E6E04EF7C42E84DC0B8F583F83185E1E1CA10 +D210AE0816DBFED7AA382EE1CE6EE1ED7B3F3AEB25DA4B1F3555F39BA2DA5B87B9F78B57 +9B65915E2440B09090E4E8FB0C342933AD8DC8BA3DE1340F00A037CBC4D1E775D3555532 +F828FBAD77499AD45D007BDE4AD065F462D727AAA69E314BFC1055C5FE9637676246DB67 +A6BBB7A78AAF4DD18611871835C218A45DD0852434ACCDEEC60AA4DC48D752FE4303AB75 +654E270D27E951410DC5354E85590305BD4B0631C90E369D992ACE973879CB962EC25EF8 +D01C2F4BC4155F409AA95E65B89D4D1AF4989B6BC3681E913CC4CD798AACE97678D4EB0F +131D6C2378314EFF41C585571F3901B0D7BBA1E30CD7ED9E4C706446D55B9E269FF75547 +AF498C716FC0A951DCEBC8BFCF05DB2375B79CC1EDC162ABA073F01C06C0D64E4D17A692 +98482F4B4C1747A08B78073D590F5291936AC3016D5C2CF84DD6D93CA7FBF9FC7C9BCD98 +4EC0E07F03D6E632100BC328068B2C9C8BAABBA4E0CBEEE49D37025FD0CD005FE50DE670 +F7BF621CBA9C4723F3D7A6D1BA5AECCEA901403C03B66F6F92D403E4D89C238D75946080 +404B79D35F8D5E0DCDFB0E22AEE8B6BC7D994D05B7AED76A40A22DF9339DE4CD937D54D1 +E09B6660992B6FBC6B36791D5AA53093E29C78BF59E0D137B06FEE0A553939725EC59380 +82954AEB8EE503154E8B56F4B45B6357402D78D1282BFFD0D38D8940F0B3AA1D48419ADC +33E11C96A48FF09E3A6CCBF7C88A0750868FD61D0BAA581E6A010BE41462FF3F71DE3B9D +6951D2771373AAB7360AB1A7EF6C04113553AA399FD21B02E1C90FD6FF8DB09B6F485CD2 +EEECFB5CE1C4E0F3675CD792BF28D726C065D5B8BEB92681072CBF17EFBA31BADD5AD401 +C3171B406ED57D757E59AE1C61AB425A580C179771334CDBB633428DDA41FFA7E6BA6668 +568930B3AAB9B51EA7E63845A2D50CDD60F8F60C3FAA5549626895644C1BC9DDAC415BF7 +96137F82FD0FBAA9F66269000CE1421BE1F617564FAC0CDD70AB2B2DDF5C804540182B4B +EA2608F4C00A220D73EA038B76AAE89BDB8B6496D3F8CFC7FA60701303795C1BA8EED486 +48BC6DBBE06A28E84D4151F85C790E5C6C7862B7B5E1ADAC6EF0C300B1AAE19F092A0D2A +160208C31B9D36A334511C10339995BBCB3C06D5A7E0658B6E7988FA3704C6E109EB3E60 +687983DEA045BCF7596F869A5FCF88A68982DA5FD4E26F72E758C60917094E7A0BB9E32C +B16880994E573A73F4CEE17243CFCBB4FD85F64A249B74454654E360DF55D6BBFE5DCBE9 +AEDFF628B1F054645AFF8DCB417683CAA103C4FB59E9FCDEC985F0CB8FE454B245C42F81 +BB62E1128B7581F1634D63FA0DB839B631A5C46A6AA19A0586FF8E1F36639B416C2E348C +2BC4A28C9A4BAA5274EAF37037C0E0B1F74715F5DC6040AA6BDF49175744A7B214F90355 +2CF60765D50B7A92B7CF05BE188C4934EC815F2F3C274D5DE6945E5A25631DD732EC10A5 +D1D5911919442FB0BA3B411A655B8E9B2937D2EE2B317A9F8656898B2BBA3C93BF7FF001 +FEEEB4701A01F6493C6AE310789AAAB18E543F822AE6389A95F8E07F6948D90DF226DC22 +3FF6584CF81705161648F245BF7A95ED126F084190D003824AF91827912987CC74BBD073 +5898D710810A4057B652E46548031A2473758D5157BE9F657D6AD6E598FD6EA797F66E6B +AADF37C84C671A8938BD6ABB7B9B3B793EC1B8A70C1284D8C31B180E68BFCA71428EE2FD +D10185264F9AE8049B64DC56132A74B609867D3B9D4815D1BBC83A6CDDE66504F2917544 +5FEB2E0203BE174203BF266862F83828A462BF880AB22EDB59CB180A8E0CC4259E4DEF1E +1F3114AF8C03DC00C7B1F39027EBCC62D308E1A99E9C0B4AF746DB1BFC872B10C8D1275A +93128F35E8883DBAE47AE1EEEC72ED408ADB618C32C9D780AFC63F1F4D3CA1784A0E483D +401BA2C3E2B8B9A13307028DC563727C72F97C2A7373F9B8B664782C69999D827E4EA508 +585A47401D5274B658CC683401DB1B0977A4214BF0E747116F3A2C06F75395A4A4A5D8D2 +68E17F8AE00E264098436DC1054456A72D426FF4DD84EF7AE9F4C49434CF6C9218E7B91C +EBA8EA88CBF22F4F2DBCA527FCD11EA79E4E5719E8FDBFF5ED895F5E640353DFD38F6D11 +BA785ADD90035A3D7BA68620F26CBEBAACC14E13C904F0FD147D0D6326D94B42748B7D72 +94BF4F97386309EBC593B8BB4AF0D09C2EC2C666CF0BC151CE7F7F763FEBF83F521CF115 +AE13A8C069F3188140C2E1208BCCF8D05A3A79FBBE8E58232A7438DE1EE565B56146C9AE +4DC0CA21A5F17B05229FE0373C3291266A413C382CFB63365ECD9F80DC6CFF7C37CDDB9A +98786B3130B61DDE400B3383D300974B9CA0BE9326C2843267B805D9C2BDB088156A7641 +704B203D0485852AB3017B851D63BB4876A3CA32AB30B87A3A9789D10DD76168B2FC0BE7 +2DC6037A9ED4315DFDAC2691ACBB975B777FA7460A851217B7328BA52876260F0E9A43E2 +962A80174051139EAAE4773184190EB46E72554267C0FD1B9388271B7DED405931F65479 +FCC4596027F11BEA64C684BCCA6896CBE3BA2CB2F71C1AA16B55F63D27CC239ADEF62E8F +090863B0659D8E41B45B65F91BA24BCCB6FF5F37A03320282156468CFE46F95612300B5D +1D811C58AE9DDD905174565900634F0E20AA6D7A15E43872300C876087B005CEFCDFBBD3 +10D23C04EA817DE15F350C4F90207637DDCD73BE0834A1651709EC3EBC1F7A73457ADED7 +68D88A2653796D132233C25030EC8E8159D128E2260D60F18097E68B95A56E3C590D4F0C +E778F72FB0A5E182264651B3B93BB5115BF14FB1D71AD9C9EF953344C4E7B04B16000DF7 +0D8500FB657C4D368B669D92638E0FB331EC3AFDC59E75730FACB442DFC31FD087174379 +B491511BC6727E4C31C2FF756C409508979DC47972A9C0369BB61A450BC888B21213DFCE +0FB400AAFE8B250112CFBDEE410B03F344E1C6E3A5743304D23BB7897D6DD6A052346AE1 +66C20F309083C0CC33B1B7D4909D8218AACB35134DF67F72752F697C4A6C568ABF2A6BA0 +6138D0DC6FF73066A5E9E559E0A25A0E4BAA0F0544D680C812E16F70CC0F3521491ED1F9 +747958D476519258AF9141DB94B1599F78D80AC9FB2AF393CC98B307DD3DBC5BE037C41A +CA0450771CD31D126F3577A82E0D32E1E114753962A635DFB27FA9BE95240B38D4B20E64 +651847E20DB85F80D062E80D1377EE0D6A751B5C5E5F89E6A9F09DA05C3BA03ADA1878EC +6EAA9FB0E3D4A8E707B0EF507256D60F76E25B61421A4DC14CAF733B03F43951CB3A4880 +7664484002BCC03695237E902217ED414DBC57A89802EBF93D4DF4ED83E5CCF8A79BA8C8 +92ACD02A4D1BC0BECB65C3D2CBFFB5B11CC143D37EE56A55338854EA43506FD200B7F350 +EC0DD9A283D0C46C5D3E728F920875DE6D3EAC17B025CFD20823D2C435C120D20F80F948 +6A37B71B68462D9C38AC003E66871047A6DDA56FD5CE319C209DDDE831FAC80D8C6BF498 +DC6B58592451BE41740BEA4766E0D71E540EF881A9110CA16E9ADF2ABD9FF296279AB2F5 +CFCFCF8020D42B01F4CEA91440C7634A4B901E5B2377D6F37174C692ADEF3337C616119C +AB1735338F2E3AE72B22DEF9735318CF8B69F23E110D8439365C67CABA3D2C16FC96FCD7 +5076AA46F4F5B0DCE6E2D5250E2026609A76C41410B8CF45DC8BCB815E45C07F0C248BAA +FE71A474EB9CAC749EDE8FED1AC13AEEB5549AC306B1ECF05DAE05E5A339ACCD9FC8E52A +4EDD4E2E5660CB8640D7DF392BF2CA1B0864C01472B4ED4A7649719276F3709FDF5B890B +6150DBEE2EF12390B63FAF9C65AE46AF648DA2CAA1AFEFA6982E07C63F810D044BB122DD +2AA67ED2E98BC3B7505BFAD72E05E228FEB9FFB56068FBBBA1E8193EF539DF257A1D3019 +3B2E42386E6017DEC0593454C76E13DAEC50FCB81BA6ECC997225B79DF89783784083F87 +BFB92457456F60D9424C93CEDD40D4D462359E7060282A5A54E3F8F54C86CF6740A8AE60 +C66DEF9B52513D70B64FB40671EB762780F36180F14724069D029D1B43DDB672A5A6A9C8 +9BBBB54CE48D4D25E61A670344B4D8DDC7E57ADADE6CA7A1BB5134276528D0450E5DA9C1 +B8DDE79D25D3DDF220204561E67855D168FD7ADD01F497AFD5D3E89DD83E069486F55B59 +B91823689873ABA14D5CEAC606FA8393F1B34582F871B6C4131B9C483A4BBED1CD69BA47 +37D050F57ADF9C806CECCDA795101376838E893016CC92DFEAD0699E6BE626FFFAC028E5 +462A1E7CA9AC3FD199B4C4FF894A3E695E18646BA33B900365CE6B810C7D53DFCBD7F8D0 +D6DF20F3B09ABD2C7E862A5C8280E55612343FB741297A6BB95FD9423C4E0602A8F8156E +365AB54540AD5449FEB3E4D13C94794F17A0BD06D9E26DC3833C87FAA477041D1394E0C5 +993507E130C4F60019FC0B4B74652B2BEF4A9603FDDB3A534001448A8F691C0A97267826 +1CDBCDF47FB4B0A7830B434F180625B451173BA129726834181EAEC346CDDF68F32A57D1 +5ECD44FEB77C2054908C6F6CD73DF94E4FEB47EAB786106F25CEC7020AC7BCE0C45F7935 +46E02937D310ADA5C46379838E266B25127413F0AAE1AC370E3C753C6A7539C8AE525CE8 +9BA7C49158D4205E10C054DF541B7472A0A6040E68897ED029F42E013E0B8EA547A7612B +157718C7ED485CFE6CF0500C88A0CA1C96A2320535EAAFEFA930325B59E551C8D57BBF90 +2A5A7785E69CA885CB7456ED7D063C93161B7F0AB5C4A33B19CD8F9260114B75BBA018E5 +CFD6EA1CA19DA6A157C632769EEA695B634311B4168E776F9B81AE354455AB0E9BB355BF +1AD45D85173062B1B2E66F2820512ECE3A912A5383AD544FD4B0269E30EE1D120EA034FE +5257DD2B857C4812CFCFF94EA3B8AD00E18C2AA887CD8E2801740C69E148DCEFB34B4897 +84D875555B9362A35304998FBA3FBFA98D6902DC326F0F407751DD3ED02C77F9B22D768D +B8C3BE360CED4964E0D413D9B288E403DC8E6D89EB0B68B4BD3959B151B45FA8BD1967B3 +70D20BC10CBBF7F626F1B4C3F125833567B9E88DA21EF2CA6C209DEC8EA977752467090C +0467D01B5B0EC2ABAD8596A3A342B120A7E3103B009E8BA2B95378DB329B917C95587A82 +EF5F72890BAAA37264BB4555F5C69D10A4E64A462ECA8B4A1BB166D88036BA071BC33DCE +3E79FC9F144BC2E446B720155812C06F10752D1391963AE98C4CB8B035C3C8E2F7CCC529 +ED8AC3A052DEFD0302D1F4D5A1BDA6B042C1D90CF84123DCE6A7C29B3AC8FEA16F07A210 +3B2C7098ACFE7FD92682FEDC1132EA886581B798496D59B5AA47CE3BF3A9C7CAC6345386 +F60ADD73B0D52642F4E87461B1C2792155D2123D0D7BA43904891ECB1573D871B973FD0B +52D76A445B55F960BCD3AC44BF762B7AE12DB4FBBB0409C102445C759E7738C4D3FE2BAF +B97DAEB3517F5FA545180AE55DD7D4A0BB03EECADD21902226EE99A7156689824D02FBFF +41FF30B9D94D14348BEAF7D3710725E9A8054DFFA2794D7D5A90482E9A49600885043C5B +E0E220ADE6CE0FA63C5826CADE8A8363440C47E6E7590CC8F5D445121E8F8B947D8DC4E5 +DB5301E89AEA62B903ABE3AADD4E93A49A83B0BEB040F7F2C320301042CC9D31CCCFFD70 +32DB766066FC83EE7109C6D8DA79610D5E1E94848556E4DE9FCF55DDF8BE524361A4D673 +6F09CB8AFF3347C41B9397538ECF26274DCE7A27E76301007A492E0C6BECDCA0B1C9D1E5 +345AA204F29F361FBAC0211BCB444F8D9B9637791F5D3B869A5117CCD73EC5124F1ECF23 +705209F4CA831C5AE5BE9EEEB390A8666BE40363642DABBE28D1E06182A95ED0F7D1177E +D3294B4C29D8D1FAAA210543C3850FBCBAC813C21AF5D62621623DA41A27F9DA0ED6B0C3 +A2AB61A913094FA2574C52FA1195521962C8D6B8DB2A10139A9C09AFAC133A8BBACF0A86 +01F38217602E70DB3651DBB083C791E7317694AD1F50FAE278155390264C32975838DE33 +CFB0ECA1B0BD993C2A02E1DC2F46293018DA3AE825AB81621894620054724C3A8D95ED48 +1E899F972E6537B21FFB8A4C55319D15A03ABE885C333BE19ADBC450D58C5DA2B76DA6E6 +2487A71FFD2A851F0551F17A00D165FFC44F204565FD24B0D11C2C21238F5D6F64277FDB +4D0704DD6271C69F4A5CE05258832BFBB7D303C00EBF68DEF694D77215084C74BD2D89C7 +8FCFA635F694723DC79E99D87F03ABD7A06BC1BD7643092790AE2D15D63D2C98288AD284 +7F48081116C31D98680BF2C03E4C2FE4DA45851E4FCB6FEEA80294ED5709A796716B134A +8EEE8ADE6C3709541E3D234F952B4B2ACD1422756B8765AAB9C32338736207BFD12DC05C +4D7496F1AC0797D5A3047F9449A8C5237C75EFFEB8E157B262A833BFFA03A26CA8AA1188 +84426DA94B43BD21B1028EB2A6A30F41179DA886DCBE99AAB28A1B329BFB743ABA0A2F4B +B4C400F1F3BD3C9A0109F63EE563AFBDC1591BF3CFDC863429A79F6E0A21A749A934EC7A +08541245B9F3CA401EADE0438C18B9FA2A78B618F38C611F6C053D2F6A0726CD20687DD3 +B09863DC0DBAF040D15DE51397DDEF2712F688D291B71DB3F59A7D87E2F44FFED1144981 +A11BB9824B1F4FB6C9A1CB11867A187796E5076C811A9E085EB5C202E0CDE461CA541CAC +D3FCDB4031FC78D7410C4D1DE558A5B697F03F9EED11F731678677448420B876AF142242 +574C740985FD2B6038AFCF1A81C4D89D00C73A09C93AFE68E5158B06B1E4A5122A371687 +93C5744583791291A8B8C2CCADC8C1BD233285F91C87566E36545ECBF3A8D5F9B3721292 +8BF2218F2242E3F19F91120CDF7D7B118392A4F3742911D47C4B6B2A61A7F79378DC8DB5 +9DB041A761DB0EFF44C948341C174E5C6660DD5D3E5517EEE0DD88A655F3F9524168CDB8 +AA2A506EED7498CD8A320E2FA42D10B1F16F8FAB5B5E85DEA6DA3005ADE58DB47E35C71A +C9527AEB0DB1B59D7DBD35A5E5C3643E17139FE1BAF662C7E88031D01A9BEAF71A18DC76 +F8AA4EE94C2575C438BCEDE9118D5124135A071E3DC0B103DB08D7277EB7E9BBCEE953F9 +77E01A009A031D4A204B87C0F0BB722508B76E4F4ECE45295A2FE89A1DCD981EBB4F9877 +246527356F2E8DDD3A67C8A39047F4DBD69B37112BDADAB6342FB6C522FA37CE74FD74B4 +D37D919B612C91586A2F1EC2E1AD95A5DA5F6FC0E260362765A262386FD8B9C27CE5FA84 +EF0B7CA9A77B1C41DDB5CB9450AB1366C00176A7D47DA6E4BDB2C1C548426B69987EEAE9 +66F4A937FA6597B2A1F2A690C3B467C57DC1A6E271B4B4FB7A60EFE602B5A2CDEA496F54 +073DF69EE58BD31963B17870B41EF97E852E286E1EF07D48FD2CEE44F51FBE8FAFE8B171 +82DF3D6343C85AAC1F58494274574A6231652AA194027CDDC257B942A7FA1E9002E9D75E +80EF552962CC5DD48735A14C8B81020C167319755636653041031E89BD815A299BEE48C1 +626BB77614622D88D310B0E19CB4A9E57C174BC369BF13C727FB452170D9E830ACCA78FC +F7F0148CA9BC1EAD7CA3BE325B60C676B3C5AAFF6FCA80FBB8737C7BDF51549439E06B38 +79D71DB53A757EC2C2D66FFE2CDD0C166E2981980AA2166112BDD1B14C19916A14403BBC +7E0FA36A3818F6B4D4711BADDA0B113F6EEE39916EC8952E6A7858BC65BB175488A6BB74 +6E78C5D7C565EB59ED211C5DDA7443653F6467C403F9725AE83953468488A6EA8237CA9D +538328329A8B23D3C96727A7BE68B59048E394D2BD3E9B5B97E6C88DB0D3B2CA42C1E845 +9B375667990B8B28CAE32BB63B8973E40533D1E5FCB26B2F680F985DF33F37AE6F32B9B4 +CDA270B0B060C8E511A0220EF06F0BE429D2B977A3782A086676AE58C244D74E364533D7 +467DDB36A7B93F27A9B729BB3F0087C01E6E38ABB26A2CCBD35F2AFA01C1A085535F4427 +521B968EF7DC76BA612329090FBCB6C99F73A61BF1B3D0975F2C7457666994C94C5E6FCD +4D4CCF29DA3E355CC64034655471885713804F44081F1F4C426670A0390BA6D2C25977A4 +91720310D0421B3D5FEB3C88BBD35B2D4132497904A74C3535A15B924023C464CD70D227 +F28490233A568AFE309F6908C0F369189803ABA18497C20B5E47D5D969DA3EFE03059316 +C0CC37688CC42783823A1618AA7C0AB924CF1D4B961CDA7DC6FAAD0E8F742D33ABC15730 +CF0E246173CD0A8F21466C9A4A9F86EE6ED508BCFA0E4AB5AB079F1EBA14D78E4B562F81 +4A1F870260F35D55D415CD2C10EDC209F23BD8A0A0ED6FB8EE11C30EBC2250559B02221F +7861C08C18BA12E748D7181EA7314E355E27EBBE1B3C00C69C549D4442998259D9966E9A +6C89F9D8796A0DA2745CE68C3D15368621F9AEDD74264565EFF245EC7D5E235D524D19A0 +6D1512B3A823AFE1944DEEE38E6C365D8EF2917C382A537FD94DEB1F7A959A69A3990033 +F48466A241B4B39E8AB9643677BF42BFA3080B8B389DC2BD74DD9CF7D2D466CAB7CC7EBD +33FDFC9CBBC0B2A0D3176B3D5D9C78B121705E9AC8DB4B76711A8D299D6EC76386C78241 +FBE1887604B50BDAA81187B0987D0B7A2108A32BAB0406AB8977F4EB25957E88F93D0CDC +E9121D49CD3FAB7EF4B4627A731C43E7198EBF05E662A2A81F46E0C55510B6D47A5363BF +63A34E483316B4FAB3BCBD0F190F554E8133E1F31745424E0B29C031D84F24A1250CC3DC +28384EEA40BDC069C457BD958A8D2ADDDE965903B436FE8BABA1D722F82B6BC781980B54 +86FC63E2F918716776F756BB91752A0F591F518CD941AD6453AC1D5ADB8016E17F0367EF +973A4F6DF74BDC2691457DB95EA4C5729031B8397663BD0C4388B8E514B279F0F003947F +9DEEA6E76F6C3D3BC3F64987B5AF5F7D520BC76119DD36265453DF598CFA741E9A404704 +4C2AE3E1E7472CC11BAA4D5A32304447DCE4A766DD19A50542BF90C3F1F93BA6669BCF83 +808634A13FD2AE46048C42A90A8D0768E3BEE2B902E564CF27FAE1AE71E5862A8554967B +1BC8FD84EDD3410EADF57CB3E4617B65B26A2B90CD6D47E7796217B51BA60D29D81F424A +4590B5A8FAB9B7404CD142CA01B5ECDACF659A4B4997BF1D1B6F9847D3BF5102CEB53754 +1410448BF07E8E49786A718F56FEE3966C4852147B9193233C8008A2D2DFB70448078B95 +81FA5F9CFBBABBBC5D7E6BED86C9E69E71FB53AC96FA096AA8E6E46B67BD96A58A18AC48 +854D5C6466329B0A9C7C910A0ADFEC02A784B3553FC43E4C2EA8E1382AB1D9C103CD1260 +E3709CD18400AF2936AF02BC37FC32054A73CBF36B98521FBCF62D4F25FC7E0F3989B25C +084FC5B84F16F1812B52D7AB115F0A80DA3D846A3DE4A83C512778B469CB887EDEA0FC37 +9581C927228B510F441071FC705C98024CC64E9BD21CD7DF90BAE4D271DCEB183FCBAE68 +DC78E977A8D23206CD3D7E3AEC0E8607E24A431C6E24F649370C897A65FECE2BD91C7D82 +F7A1CFA96AF95891FB8A2806CBBD2AF6DE7205E8E7269DD0E8703758F93D0BFE29CD178A +62BE495A0F7574EDF1679AC65A72C43131B63AA8507A225C447CB2D71E0974A1405E5CF2 +E13C7FE15F3FE046377500E9C4A1D0C2825E49B8AFFA5B54785B39D27D181B0AD38E0E1D +35C03186235676EB44E268F6308B17B45B2AA604CBBD05E33497F4788E969E01EC50A3E0 +F8A6CDD1CD8950505828E16F2B85AED36EAFC45D9466045D43AD9B3B3B2B92D5AE0A383C +4C0D8C27BBA70E4A6E7F4D134E4D684B9AD5BC57F19810F88F618F49C66DB98D76F950C5 +25AEDFFFF5641D0DA2532994BFA810022AEB15505DFEB561227DAF7FFC9B2E1578108ABD +66424877BAEC36FA8FCFCD8E23ABD236399F4AB2FCD5CB2DC84B80ECB9C6EEEE7271999D +37272C0F8D1A306814BA2D302F7A3D8C08EF5375B38450E852820875DD008B55CD50230F +9F1C513684B5A7E0BC1C992804AA638CBEDAB8D673556F9ABCAEA81059B0EDC0193FB823 +92E4D7B739E8B0053F84B7891434CDDF773E15DFD66122A300E0A561CBADBC15058310BC +C9E44582D513D63E90832C521CA6F7E6C70D3A9F461BC33908F1773575043419B5310F74 +1FC502C5E52D7CE3421D0BA35BFEFB54E477106DFA69677F822FEE85CFEAA54EDF1E641E +D5E73F733F3021A0CA6F5CD5EA5ED8C09B1F3B1CA953E92A4117839A678572DEADA59C50 +BF67C6367BB03CE4FBFEB71F652918939FF2B61C6A89E2278D42FB30BEAF2CE7E6ED6D59 +CC0B941DBB15F4BC70AF627817277ED59A95A3FA22FE35AAB686FF442237C1B4A9FDF6EF +62E4F90266EEDC96AF7F7D538DF26632B6189C2C74F62106734308EAF30D9A6E25A8FC26 +12180B467359D44B592BC4679DBE01856CE65D2E0FAC04DED5207CAF770198827720A708 +E0667AD7A3EE70879A25C40D468E307E01C4EA8B0FB67A854674010A90CC42CD6821F717 +19055EAB05AF9C9856C6FB31850960CDFF7CBA473C4098A45A1E15C533182D146B64D9D1 +BCC4EBE36F926B2D4BCA8737364CA448CEE8A27610425E06420404B99D7C2FF4E02A90F8 +583262933685471C74FC236671D814DE1F3016BBBEB1780E4DE6489CD71F5DC6DC2BCAD8 +D742B695074F28EB6A91DA6977D8BFEE0A7012DF751455F36459FDD63FE1D1317858A2A0 +EBCC845331CB6BC509661F464ABB2B3341D1AF150993D73D547DBE8E13A249B4CE85D9D8 +3F35B2B7AA450CE28CD22F826F69F7B1F7AC8D802D97FB20536ABDF8CD275E67C22674B3 +1C6B69C7C8410B93FA3FD167764F2DE0DB966B9BAE9168554D718E00A5017263D49F1CA3 +443F1C126EA11DE16A4D19BFC9BB8AC52A5471D755EBD49B535760254143E163B22940A8 +0F2AC318C264DCCEF794B02CE91CFFD152416C37AF6F7F1D151F4143FB808D10D635E811 +CBFEB3EF3C291F8CA480769FA0D3D80E1ABB4199DE5EDDFCF720D95B1F7E57B80D529A22 +49AE1E2DDCDD4CFB478E88CA5EDC7C4A97B7BF8D1DB4CF194227B699D1A5884FA7163E87 +7117F2A46897135F0202B6AD25EA7BE2AAFC933D1E3761F0DA9432A72BF4FA0755CF555B +7DC892A63879333E1D5C4614215138BD11967D5746163ADF35C13D81DDC09045989E9AFB +668CD3E34572836F7ED5981CE6ED895DBD5B7BB1AC7BD9A4A197FF9C400050A97F8684A5 +E9732512D1BA6C9F4EB27773CED4ED9E63DDE7DE003BA708798235CF66D0C7517AEDDBAB +F667F6AFC423511BC344A8CF07EB7C697072B9CDB4958C40685DD2C6317B20ED0CE5DF6C +204B8029D48783B1AE8EF5FABFFAFBB42BE9D26B4840C04FCF826CF6168DC1533BBD3452 +7D2AE02FF4237675F45ECF4C1994D45E0A15E6D03A3E399BF9B0821AACB73329636833A8 +B4937F8DF6DC557D20FB4C1A33D7E7A2411BF35BB0888ECBBAFC4F1DDDFDF71BCC627304 +C4F92B71BFF5D96A822DC9C71687C1FD37299C4BB76B7F2343741882ED86E05FDFD97CC8 +76EEEE402AC25F9B5945C48629A605632DB0E7D210CAE8C887718F10FF689AF3BC23E960 +A1872ADD99BDCB14CB388B4BED0C9730947ED47775DC9A2B028778ADD281B8A7107C7348 +FF35B6403BFBDBC3AEE99D2DF222D796BE4EEE6071ECA471DB5740647D136B49D2FA83EC +7C12E402BCBE75C7BE2CB2C058D041A3A390D60165866D1B84A5A21AD65E5B7313071ED0 +CF488AD4CB6D7BC4CE06B620262D4C3952BC443E10EEEF07FE3A1CC72F2921AFA14CE11A +40655EF499B2FEBAB39B530BB27682D3618705104D6A781ED1463EF6217F8DA8DB308E47 +2654FB4A1F5CB5A147B50FE10357E109DCFF49AC818F53621619B37A9FC57A5DAB97F829 +82D2A91D92888851F9C58DB754808668EA721894C859EBB4E09123B8E21AF0D4ED31092B +1E866C80FA135E73CB59677CD3E74925A82A6E8AB6A1E28E1735E2BBA3B79CC8D1D6531E +A41214CB887AA60C94B642AC36F9720A420E64F321A474FBB57576C2B0155450B51EB175 +D39DA3945AD41ACDB958DE15C25913F7C3D7C0AE3A6CB987835B26DEE2F92FB85E7B872F +1035CC7E7332A9418126BD493C892033FEB7A254B47623F8645C52D240C70F1FEDA77C1F +87A90806E9AAEF356EAC0758714EC5018B1B481B79B416A2D6DC92D7B22AE75894517C16 +C3DD09C667BBCBDD6C3D36AB00B636323B2B6116125F6319FB4C16A57764E8B879086C2D +F146DF03073509C72932A516FD7BF9F9B1936B643201F590D1D551C2C5D48BDC93785B5E +67F1E6EC0A5D14D59A190CF6894060C1953D2DB3C79F48844F7A0B0F0FDC3AEA8A53E33D +577B67E9213ABFB350929FEB36A97DE7658B441CBAB1F0E26B3FC5612202817A5C2F423A +AE4430703E9FEA99B861C4A8CC09F79AC6E6F53DCCEB0EE7847CBF73ECF35D4F5530082D +1AF3AC71BC3918496CE6AABC23D61A98D11BC6D7B40885FB6FF6AC67ECF47C6733390DCF +A88F9B9326B5D130874910D3E479ADA40777274C02847ACEF3AEE8E0DA0434C9B35859C0 +3D23BFCB376446EA2DE09F42AC3713F0673D7DE567E8A0A1B15A1DC88FC081530804B744 +2B0681289D586D9757631803ABE18DEAE727DBE5DC052A0A1F0E70480DA458FA96A010B9 +57E4D1CB0085713817AFEA72535EC98D71B4B9ECEBE04C51974D94F874B0E3E74D149C96 +BEB4CBDC17D81564C3C84A14F5130A08AC7B71F1A2B81CFF6682062EC4DC6D8E1BDC312E +ED6ACE315A2A28C772216C052947E079071314DD07BB321F1EC8322F00CE57D3B0E53E6A +7A2B9002F1ED47621CC255EAB1F3152D5CF2456764014A5DE60DD0CEBED98B584457377B +F67065F706978C6AA2914A68A942DF2B2742622007655BA8780AEF5086CE17B67B8B3AA7 +E432EAE81226FF8CEC95D0498BCC0FE737DEE690FEC30B80F8DD74F05B9B88794A54611B +C12F61CF8BBDD49F33C5690E1F03DE89937040BA0775FAEC6ED05026ECC6DC4D0A0EB441 +66ABCC55B3194DFC9213025725A8EA81A3290031FC365D3741922FA26E1499B93C2B59A4 +BC226A3F86FF1551DAB5F9F850ACD311DF36EE86E5B3EAA4579972223DAAF9E475F9BDA8 +4D95A89DBE06611D73BF0717D1FE0258086C1B97103CB62D8DCEA974B41388C00F176979 +E8EFBCF4FFE9144820AF24BCC47EE0597276455F92BD1FA21FE19E1D98E6E8D6BDD6AFAB +E61C7B650C109A61E1A3C6E92A6F2BD8C872A32DB437E2EFA5A19641608CF2D5E109952F +8B2D9C0F0B96322665B1698490E37E860900EC392CD42DD9AA6DE6F0E5A5EE7BCD34A538 +95D129885A10D9446993F5CFB6978DBA5B9BAB29773756B9867E4A2561AEA643414BA7E6 +00DA0932D0252E094EEFE73E2AB163397C2266CEC81ED1CB7724335E1FDE7CD753646810 +F94A631F2DCCED349080D4E9BA7E9585E3F52F77114012C081C806A447BA8AE735E406BC +532B46F55134817DC0B30496C6F5367A4DDB55FE033A236404D643C4C3DDF9D8DAC0F165 +C2B8BDA4194795FF0146830C21CC1E991300548E7A0A0B032BFBD828A960FCE987A5ACB5 +E2224DCCE6CEA1F7C6BE69248B6044ED317F1F3C028142B52DD60DDEA986214D93685E9A +F3A2D9F7899A614FB41BAE93640B9BD10CC3981505415BD61325AE4E2EDF73E7AFDBDA1A +D4DD09F759787DA42A474F1B6C134AA6FEE8CB1B5BE1E9AC6AA2D1E60F7FE74EB2FAE2A6 +BD8874F746D14A51F860741F5DCB208C461F8118A4741573CE37DFC57E8B6EEB1D369758 +7956D6255ABB0E047F04D5AF7E59DF62EE011BCB403ABE71C63490F9E3F28096149F866B +480EC82AB9BCF835EDB42F72B33526DC06CA515920C92FF73CA0C1A1F1F61FE8F373C486 +5DF775DAF6C7BE60F2DD4232B73801BE6BC491FA63205730E4974A531F1E75E74A9ACD2E +D4A9A9A45FEEA8414614B535372F94E55BF70152086AD2738807B85E0ABB2F5AF149C8C9 +9A9F38A6CF85E31358F8846145F428A89DA1C26DAFCFACAE7992CAC52BE50FBE0EE43CBB +2228490A00E9716E513C434DFDFC38263D773404743713BB490DE92A2C4F3E2E67032D40 +B31649A0672EB3E41079316EF1020DEE6DC23B95B093FBB87A0A88733645423F72CFCA9B +4B499F178EE31E5C8B8D432D5872CDC09713CF21DAAC84AFC235E8AF0F8DD6D6CE213937 +7314BABC357F9DDE5B3F2EF4843827A6F0D1DE9C8D0DB30E14F9C94FBA3A7726D6479706 +162D0071B70C19CF32BC2FD0113504C82EEC7669A66331267B4EB18C5F1902B6B2C78C3A +86E5AA1D2BEBB6AD05539A612C230DA216C24B40029A8CD96B8FF0FF000E816B6A7C4F70 +90E217124A1D6A78604D5A340C278BA9B16CD4B5518E0376B3C518E1493AFA9FDF83C36F +6F28785DEA18DD992EA6C2909ED188A31E933A0F5B521ED9C46E7A70BAD32D05AFDC381C +9EA3D56E2E8C48276A82F9EC08440D6468D0DE0577EA8D5171B678F3AC9F3BE2D5DC899A +4D945959C9990F334EEB92F34B88F256FFA564C591D5B18F79BCF9817E827BE4BA219423 +252095B90DB4347B2D54F2BE6D31B87B525D103680700F13CC1C0F72B0DCCFDC01F2E924 +B5E1442F21025659C39289B7B4AF03169F584C49D38EAC00B1910B823745054F00B322CD +174BE2AB28915D81A829B6C87486ED7EA4D44D6EDB6BD69C25112E0387FE9826C0F3F2BA +D1C6BE26E603730DF1C4CB227936404E138136082AD61492923E173484955187CE3DE172 +0FCDFE244D85D3C5716B7A4338A8130748567E0044D3D9DAD19A9785272819ADC5CC9876 +B764CA881499268F67D6FE0ED4C73D463BA920F27CC02D187573082A1793D228D2011E2F +59A15D7349B2EE7C9E7BE1AC231DCBE9DC98A2796F5FD4A5853B8BAF6F266520CEA0C42B +0AA848B977E9FBB93F77CC2F6224A339242BA2D7CC565373E3636DC0CFAD06B7C5C8FF10 +392C03A29675102DAA1E7BD4D45A2BCB6F6C73F8C3A6DA9D520F858EE0E4028FF39A7C8E +AD10A54E91112AD1A6BB7DFF7D3421533DE306FD859D5F750268EF950F4CBA3623B38703 +1FE153AB39B304EC57FC95710ADFFCAC53508224A7DFFF79AB8A24E4DF0846926EA4CDD5 +665E4F1734764B53C911EE8AB436EA08ABF1FC7BDFDD754D22C6CDD1D6EF1786C10688E2 +E2830A80A5AA37C08D1545C24EEA559618C927E4E5A1D6F83CE3CC7B100D4E04561B1BA3 +08A400644C6B49F4D5AA8EC1B5D769D16B28E1FB6DB45B118FD348D2A6F241766EC0BA04 +DD24F51F3F288D954D2C7E3B402361D6343C5A26F78D2C220E83D33662BB0CD33D84209F +7AED4D30489645AE647D045AB0BD56E20943BBC8642B2DCDDC09F955EFCD74F04337A15B +9DC924D48D1AF6AE222B76563139CC37966D32937FC5BA436843EB57761B9F052B0BE1F7 +132E40D0F0C783CC80B728B75FB600127673C0FFC2838A8B52AA3C957E978000314DC091 +9D1DE4DCF84280D7939ACCAAA46ED513080442D497C7CBB2EF36C43CB3BD66844691DB7B +2F1ACF8D9695E03F747E3C0CDC2105871F13D27C3FA07E30A27F5414960DC3A51AC1B569 +F30811EC03218F259BA3E4668F83F6670968C7DFB3E7CFF0D12CE126E4C27DE03595C823 +528C95F4B1C92AE796CD890EBE3DA9746B92A835817B6EAA2FCD276A77436225C44E89B3 +6A0066BB7AA1E94C3203AB45A6E2DAA5DEA3B0F0E068A251CBBF98D376CF76ECBEBCF3E2 +1F375D73BC558151341B01B27E16ABCD30F60FF9A91AF52808606625051C54ECFDD28E8C +90E211E0174A616C68BFC718DDF2656FA27BE3DF485F050BB57F96B7D1F6531CB2B73B46 +D21629F201D40C5A37B572428805651E2EC179424D8F5251A84384783A83D2C89B6833D6 +D0697FFEEEBFEA9C8CA21A627F50A1168EDE8C5E085B5930192973DD939E36F10AD90B9F +C02C0B116F922ABDB2A94213E4D9AB7903770FE69017FA7B28894A5CC4C66930FA7FE05D +35D664AFD098B8A76C9F2EF0A11E36B6D7362B62205AC9282D8082C15E1BA41E8A711DA1 +CFD28A83BEB3ACA3F7095FCE5880F18EE93F9EE03C706AF5547B198B4A08B9731A61141C +9A953B2A5A3DFEDA3545EAC5D7D8D556E72118187899AD1D13D51B44F1E422F4809BF42D +FF01E2F05B9BF68849A398CFC799771C1AFC256B7D333549A0A71FB7A8813D5028BB8F2F +397C1A68F22F3F1B9C2B7C2D4F4EB721E73D6E63BA651C802CE8E57F5CAE8C1F6C4AAEF7 +BFE00547D8344D7741BAE7BA30F21197146C8B31523C1C651420D130A2DBC055FD437CD4 +D92E7DD74D6F1A1027CC95CC028F44F2C5B95E72CD31F200B0A3584946E55B9A6A20163A +3EC73566552D848290C8EE0C821F08DC9F1AD94C9E94E8C5B865BEBE2047092AFCF291BC +EE941AF3156D6C8AE07E63B81F27937759F91A6C8795051BFC02164475850E295E6F40E8 +4DEC3874F6762DCDE08F738816A14E5D5423590D87B85F7E0E88EA234561903039FBC1F7 +70ED97405878F62A7AA078601FF5277CAAE4722171DF7954AF82DB007C56E59A7A59F133 +071E193E18D2D24EFBA31F3E598B9FDE11C0416579BA3AF70C8F7F0D069C3BF3FDCA150D +ECD1E82A3D7E1C11F13D37F27CA578A761A9E5EE2B425EAEB8298120429D457998BCD81E +81531F1F23CC05417FD802E9C1B7FA92F129CDB8F498C78F9B936FBDB2EBEE402AC25BF3 +CED327EACFFAFB1619E023F018E22F30FAB458228AFFC545AB15D66D4A0B08716E484F4C +FF688C67B70B3878ED20939A1EDFDF9D62FF19EBD66C9FEA31F18B6221208CF315DF5108 +CE58848845FE2386F9F916108102A8EEA1E6A4806535410FAC7AD182F6F317E0A864DA31 +35FB3C0802E830A039535E66BB3ADCEC299454B7966FEAA81861965F79C0578D5D48F3FE +5FBAD2239BBF5F107E5FF42EE8EF094D8586E8810522BAA1E231B4FBDD6CF6C62D3B36AA +8477D9273E95D66CF67F5061EB4E3EC2048518063703DFB7EFF5C2F5A3968FAA705225FE +9E088D592EEB980C54777F46BB385CD979BBFC34F3870583C13643D449A49D275E38FB4E +A31E0C69CC3CD31BD790FD0960EEE331BC1C7D47AEE5ECD11D6EF0FDAFFD1FA2C0F33C85 +31357F04EFCD25B6CA2E0800E7CC8B467D4EC22FCE69FA0F1245253B8B3E842C10276456 +ED5D4BA9B19B07B8AE60115D4F423228878C7E6461523A102F03E2C997C826B0E01A8C74 +737BBFCC420E2A864B051B219EB2F65AF711C8034EE858E8E41E93E80D519D7D5B78FDD0 +E4BC44CB9657C8DD9C37EB9ADC2E33E42B02DA3E069B9B20D7A727DE8070E17FB032C9C3 +4F5623EBABB58EE9097C85E0A2D93279EB7F6CCFB82CC798F06208D106AE7E811BB77F43 +E4F96EBDB0E29E9CC6CFFA79A00837A14A424A9E97B16F52CE9C0068C43523E286038ED8 +D91087DD7764B1DCC9FB73CB72A1AAFC3A09D353C64A8E3480D2C3E9D1F583E2437BC1C0 +529AE01639F1CB00AF09CFD84C38037DA70512DCB7242EA3BDADF8429ADEB743E5509292 +37BA921D7AEBE87A100E99B0D806D0AA4B3BA6740FBDAB5D1E0FE3716EE4957BDA0258F2 +70B527DFB9E2FE35FB0A6AB0FFB583B9529FB51BF336852ED0D4135E6408AD228714EA74 +D76CA630E0AE366233CD90CD586C9D8031173646A78B88F1F88B409110801D522DDE383E +93675E5993EC6C007C5ACF1AA8D0F10A85A144E189273AC6E135E986EBC2A85074D3C290 +1AD3BA21B44827EC7A55EFD8A429FDA1DAD0929E86FA7692CC46E7B312B441806598F2FD +6090A17540D1140AE17D9A96678347EFDF0B510A8BD31A07F26FDE43A5E012D76BB72FD8 +8A70CFE950A471C724288EA13FCF2A5A7A3D54B2D30BAAACDC818C588BDE628B30011DC2 +5CCFC66F6C7C5F780280D8E4C421A0C30749C2B33EB4AB3882CF161E116498C4204455C5 +B70C59800A0530493F63B843B3BCAAC5F025163431DF3FF39FF9330084D41A696DB77343 +7C3DBD4E794431B80E72838210F2BFDEA75DDE26997A6F28065DEAF13EB71B0B098C8209 +3121ECFE486A0CC366FD76927D530C3448FA16790C4A96F66274D5E7A71427AF984C5004 +620F3011223C4556D8D996A9415812F1868EC9744B1101FFD7876B0F0765CCA2E7BFCEFE +6AE75779A6AC7876D5435153A48C4B931D23F7AF10A71532249DD0BB4F52514EB90B98BA +7EFCB01C47BE21CF5C2C82827AECAB3666D9DB46D415C31870CC7934BA73C5736117F639 +45883151F82A1728E5E591DACEFFC0AEE8E0234EE158F45F8CE995953F2D52D0DB5D23F6 +E02079E115F3844925501E263EA3EA7C364DDB44BA125796D630202D46DE831E5FCA2BF2 +8709E4C2A8139444CB401254A0149E4DCBC69AE1438FDC782A6DD7D08134A27C1C32033D +B1707A8CB8F458B3FAC6643712117752FCBC008F2EEEA842035EDD4E50DFF848E20201AB +074E662074C5F57290E7FE6EC37D5C1C11EE8DCAD4BB3CFEF95193F16A3AC6CBE11EC609 +111C0C056856B5CBC8C5F59CE7FB37CD8F3B53FE0EE6DCAAF3C933B849FD60852EEADBEA +C506630B94EB9814AD4A9D31D2F355A3A176685CED59E6F2A6F61458311635006CCA9833 +BE5552DEA87A360F2FE23679A8C5E05A5A8C395FA909C7BC287C6587D2BA7C4C22DC3396 +0BCD0B32BA37DC1C1F59E730B8F1ED109E215993B16FA35C7859B8F8F299449CE26091CC +5E9A4893D1D1AC688865BEBC3805855B245A9E90F715B904B9761E3EFC7676E9DB688EAE +D6C5470282E8F065A2CF7CBE00FA66260F1AE895921852BBE6CCC06732EF7290620A1371 +3C98977827D534617AA33769F4A89CE899D29A6048516B0B9E764C4B7A668470CC188EBF +54D31E95714E4F85F3EEDD46DF34786702A088B30A31D55BBF6EC09153F5A170E28FC2C9 +F39EC3EC34BE68B1B13F39C7138B176B064210B8751043F03C35601891F31570D77B94FD +05420F77B5BBF0F15B62C06CD8E026D7402D53D5455D608D9A903482DF22066AA82B0927 +918EFC606CEA50534BBC94269A487505D937C2A0FA09DA28BA69A0B90EA305CA02332254 +5AABC58727B5169F010548A30B750484B8A6F33BFD0026BED604C56CE9CD713A05FD9816 +C1A8CF1FFE9A458AD7A3A0B0F4FD0E506608C58669AB9809DAE774920917406CA8E68F9B +E4C6B9D36C0A31494625FDF84661D20DB004C8E6C1CE34646992D7A2780AA7BD04B7C15D +8A696817A5D5F4A00D9C25E6695C383C273877B1F75544713AA173E9892ECFF80CF54382 +02A2513C677A4AF1C3BFF5B282C807A77F222ACF5AC497A36DF8BA7C537391827360220B +40F2AF6FCD3D3A9EB8847899F3FEEBCE598050D7CE593565F3CDDA813453B62983C0D90B +71BFE793AA1B2F0CE07F43C8D4DD8BF656EEF5C6C3CF0FE90C9891344FE3F4644ED8E98F +6C1E8C00726BC7B8D2AA8AD0681339EBD2B1BE983E36988BB22257DC27CE5E183AABA617 +D9AF549235E8EC30B37B85BC3F371764AED219FACE0CFEACF611FEFAB312466E6C02B341 +904ADF69B17706D8AB2EA734D8895813DF940ADD72547D373DCF82D1C484D7544B06AD93 +3C4D95655ACBF08429DC60D26DD8690BB9B865D0846FC0D32117612B8A8DA0D6955B38E6 +7B7EB2405F7177097ADD4CF54475866A52BB7FB9DBF8055D96586EC8C634DF0768B27E29 +92CA552A1E4B920C56DBF6E6C03A74745A0AF944DCE92093C8BAAED7B40F2185D776081F +5B3049BDF295D0C4EEC9E3CC12F9B19922A76724879D842C1851C16A9447296DDD5096FF +804D0DEA8530DC5D0AFAFFEEEC6B3057F16FADE808E85040E4275FA41A9B7770048508AC +6AAC18540E2D903789AEA54DE0AFD72E582F596734D44EE33A9A719620F0B17FF028CCC9 +A1DDC29D41D9714C27CCC48A06A49551D8F5754D8AAE52D92D31269C9696924D52A44EC3 +D483A0849738125FEE094ACDC8C09574D7FB5FDAAE0F44497115EF7C152453BF1B6EAD42 +44B784EB072BBBAAF2962F61879D74D8850B1C544ED2AD2483EC46F99CA7E5A281C38C40 +A5BFAB0500A37CADA0FA0DCD05838A4180C0DD8AABAE616FDA7CD77572EBAB61656158D2 +C27C2DA43871390F39B4D3E193CF95C19D2D2B8072857284405C68F5AE101A49F786502B +8040587DC7E2AD00DF02504FB119202E0FDFDE2DE00D4AFB2B67C8DAC5838050CF1C2D19 +C2D2F17FDA9BB90DA4F6DA74DCED5972E2F8221EA6A0AAE477190CF01D645D452F0E477D +436DFB6EFF88407904DD172E6CA5E132CBEDE212BEE43C446CEBBCC250D13467915BFAAC +24AE63D231CB519A0007AECCD201482201282B6C7BB3C4C45392D32D5E6F0A673FB8C27B +D70813CBB4285D3755BE80CA5EFF3B8CC0738C090F535004A14D6EEA4B56CDB2E70DD71F +98DB9A8041A2F80882BC5EA1AC8661C20632CA27198917A619646193B4A3EDD8CFA675EF +5F83AF3D18735EB811698BA7EB58563F0C706A2DC7D372369CE227DE737713C18948DC20 +5D9E574513D54ACF922CC559100D90AA3439E5B3D02E0ED2EA9005F75BF378CEFE680D93 +CDEA6ECCC4B3F43CA57B128FFD4ACF5020CA5258B2A03AB259EEE34B80590D44F58F3D18 +7190011DDC9B6FE1F5D9D8F1090EE4BDB4FB56272C579E33C7A3ED0AB39D96C1AA74E197 +7F30423B3E2AC868292F70B3DC9D2A1FEEE89FF3BBBB195E409C5F473BCDFE107769B6EF +E8371487FD8408D67313A1E0A6E2E448A0321C0FC931AFEABC4F648E4185DAC8DFA30D9A +87C0380046D38FBDBCA63BD498FF6F96FB141AC9D0CCF2D58971BDA0703CB600FEC9C22C +781DD3CF1D0604930CA0D8D9C35C247643892A82095F9F12196EBF4638132CC259278A69 +6BE54B1BA1B56DB1EE0F1C8FE42989AF69E38473B2A4317356A415E1FCCAB2463C80B5F9 +185D0B49D4188DE1B620BA6D108F3D3732BF34FAB723C1373FE6440296A18732444F56D2 +2E4666EB01FD9E25BB52F399EF53375C9280D7F6C3E774A8FE3EAA78EED6A94F85089E6C +FDDAAE0774DD926D148BFDA4563FDFFE56AEE78D03B9BADC66DF13351F3538D6220D5D3B +814D6F55C97A4509358DA25B47CB33923506BFE54ABC45FFCE8B35EC6EC9B5EF3AD16EBF +9FC871736AE364350BCE0C88152854A653BAC1ACA37600276DFBF99E9BB4B19E90A6F234 +A11071922039565046DB5A6912908CB86AD30FD7FE3660C06F05554A0C970AE20BB57E92 +448EBC532764FCCD1FD1F8B7E10FD0EA90E043C3064B246CF3E2299BCD5FCBB0B8BA8C1F +7A78688A0AE89D73DA9E7D94B20A3566F0870462FC72C6D7390CB82761F428AE82DDBB9B +DDEB99B653807E6257A2DB61EA8F4FB2C1D133EB3D8D6DDAD980E5DC555C4183B6F1C380 +B932C33ED0AF6426372558F6E01186A41CB25FB6CEA786229ACB9E61A133E138685C485F +505EEA8B5BCB465E5A697E2D6AFFDF040CCC78B8A7DD2F76EFCD0ECB1DB60B7F6996A75A +A0059F9458D34FB95925FFF126E616B6FF585B566CB41926564D8BD98D8353DF5725E722 +86E1B9D1DF3644A4C45E3318ED821CE90B2D0495E97C5033C8733756CD10C763C2BC5CD8 +0EE9043A531A0DE7DCE115224D0E272AD0CA70D3E206B070728E093BA13F03E8D419E50F +F85B3DAED2E7A581948541410B2469172006F0C24854049C0180D0DF6686E314757D9D4A +7F6D641D499DF6550A60ABA333DB90F4615BACB3C808FF6F58272CC252236B29FC67FFCA +5ED9063DF8100D915C5B8F10D7B1AD3E848E797F82E9B76786A4524AC083B09D91396DB9 +05F133D6E300AA5FFB1E1D161D00B4CBB09DFEB87CDA9527A23FD4591E2DF7E920A3F4F4 +26A7D3AB614E8D45DB0399550E166F01C4C4F660430642F813212E24C7CB24CBA11EBAA7 +B9F63BB00955F125A92658AFAC7044896843138F90299686F549A427A542B2588230C21A +09938ED97A7A6382FC70174F303673CE2AE93D8103F5E633298E1DA2C36908F6F6039FD8 +37747FDE7F714A66CD8871AEF65B8A68529FD63F87AF84F3AD411F820AE9BCB84A7EA4F4 +3838492DC675D80FD615CFC9D6EA741C6B91AB432C0CBFE06FFCC562D71C6440176F39F5 +3D810FD4D3810E22089724E8A7F53D295681C2E07334D656EA4D3F7AD037D3B9C760042F +86A0E2240343EFCAC8E2578DB30BECDF093CFBD0056110EF5834A1E683CD7D624B04AC43 +A663469E0D3AAEF64944EF7C43F8FBA221DC846E86A8866AC53384FD35D10FCF34EB7404 +BB38289451048BBBE520F6018C3F3B8F6FF3FDE4C5F33D89E44DBAF04AC4FC17A4196676 +F16B8A2F02FAC4B8933CE617FDF903113354619906A8637566B3E61FA8C849261A625CBD +87BA5F1EC6479E7B9423BA14D9CA0C68E11BEAF1D1E948DE44257986388E75DB6FD9AE41 +13C36EA637EBD0812F272EB8381437855C7B0F262728CC886BCB624437F8CA30F107427C +7D1103CB94B19CB2129FD2B388D62CAD6078EB7528810DC458907A14EA0CA0B0C28DABCD +988174387FC28FF98B7C9BCCEFA0407D138828621AF7815C13EC04F7FCAF82ACD3E8E773 +B886BBBE2C4F2818E39A2D7F964A29B9E977F53C7107EB586D628F85798E70489189808E +159E28A8D81FF9D642F3FA4FFDC2059947719184D1E83FD5EEAC7FEFD5DE2DFA8D808AAE +91FE63E94AAFAE17FEDDE11C1EE21085438581DE1F5EABB4FD2A2C3CE0010492612F5797 +163F19DCA534DDF49FB45D0381664FE5CDEF1CD0C319B6748AC4B8996DED871EECB3E223 +8E924F30CE315DEC278EB94C6206951B2D4E735463650B5020CA8CBC756618AE1D8781D7 +B22ADE2D20CF71A9ED08111EAAF4E3DB1F081CE992ED1F7BFFF2B883EFD95F51CE612CE5 +6588D7A8F342EFB74A989AAA55ABCE83A773333315FAF1AEF25CDC4F19FD2293A51AD64D +A070635BE2763AEC91BE2DC9F233D8968860E76352E6DA9F7E5EAF068E19CF1DDB22EB76 +FBE149738F247F4369273B6A901705B7DB396F662986D91803DE93D89B8312826CAF94A7 +80EB2EF254FD8F19710452E7EA41399D50177F4A8CD017EA2446C1295B6C1598BCF35060 +4288FB0A9C7CBE9D94E6517CECA11528D286CFBF0D621DA7D93C7D1029FE0C70F20ADA26 +E05A67C4E301A086770130934D6ADD3419070C6E2F0173AE4DA51F478DE9BBE3687D09A3 +A48D7FFCA601801BA38BB9D87F091DD410BD354C24C74E2E049407B8A3A98F90FFA8327A +6260CEEC0D9CFCB9BD04C3C08FEA15D0884A9017E239335985C85E17697F874DD3EDC192 +AB8542A11C8B5F50A2B737F27E9A4078D72ED0656D5AFD0EB04F76565CA2777930DC4B0E +62715FE6D2A8A78D8C0187FFF43BF6C434DBB5DB369F4045558E5F4F047554D4641D02DE +A9A78C9B3B64D32D3415CA488D399273879BB9BA3EB375F630F273DAB8EDC0B015A3728E +B55013B32BE513A0AC4769876686C9816035C2D199E955DF7A99CC07B680229F2E9C4302 +D5F7F4DD4B9C3BD69982E0DD8699EDC973E55A259376CBABBED36F28024A9EA504154EEF +B9F2C5649E7338C52CD19690D7BC56CD06D5882366EE32FE4B56D7703237F3D38A4D5C07 +F4B851534F597A1723BD364620757118169DFEA997B90D243990C23B6583EAA176021C29 +923483CC99E04537F611D02C44E99A05FA78A0EF13F05F695F38E3E631750BC0427F162D +96057F1A50A392131DD979868B617C037D26CB9A92F478C57E822C3E946B1A30388A3813 +39C0A4215EE9314A42BED741A0345B13D16F462E60E493EB57A775B3A01EBE558F8423B3 +047BCA02DCD80CD35A3AD41ACB26D75C92B1DEFF4CE5E8A8332AA185DF670FA87410E36C +D27F4064090E39970DE94F2A9476DFAA41225BB65C0103F5F2F277F932CB3B1F273464F3 +1C6E88064995D7C6DDA4C597ED8C8AA2174DD99D8769F818CBD824E04EB3458DD29A78B4 +1BACA60903E1BC1AC6527351EE55A550CF7BB448C3926E5AB461E374AAEBF86885B8D912 +23108CA0D5D57C333DFE6EAF41FB5C7071B83EDA33362E2090A76DF9832BB5DF1E3AAFFE +135801E3634415E1E8A561360B599DDC5F84F3DC12E3A4DA3E325A67DB748F6768D42289 +0520E9FCA4928178B888C4BB626D82D9B52DD2A8558BE9A3013B4492CD8F11CD4B8CA79D +771D9A9127EB7D3F8AC0E09CF86F94AE011B568EC3A12B6C8B930084C0982FF9400E5308 +23E79DE9CE44B754947CF6EB96BB9C9FA45869AEFC46A19F957B677E93E25D7CCECA4389 +35D70BC5C89EA5E2D1BC207365D7950B8227E70D4CBF3613A1ED87A7CF85485DAB70AC0F +3CD67859B72D6384000CA9B3831D32CC774B27AC9A2C21A4CAFD3493A2BFC37464066BA3 +4A4BB4BAFA36019452F8A580C4F27BB5D81BDFD8902B510FE95DDB23CC43AAF71E464CB1 +AA6120E3CC15775000BFD24AD031F000F787696A6A6FE9F2EB409B259E706BC64E2BB7A3 +286718CFDD3D1D2F3BBE7218949E69815A570AA59CE6545BC1A2036381515AD097A81D2F +51AC22395AECC7D208F77CA9ECF5F2C121A7854AEF87CD2170A1F9F7FE9657F2C5C77344 +F7F07A90FC698A63382D7E59D7EBC856553BC2C821A6664E3BFFF963C3671EB7CD32C9F5 +AAD7CF79F066B847C533DE4298824AF0DB3C96B780358DAD0F71CAA85AA876EE8C056864 +FC9F11FBAD9D966AC00667AE21F9DA3555D55D81283142FF4071541CEF9C87882323BC72 +454D5261D13BC65EC5113899474CFD4C05D13D8FCB5F3A49A4967B8C46817DA1E71F7EDF +3FC7375ADA580A715D37FB8D56B2A9EE3296D302AC10A9C5AF7DB8E92C39EFBDCF74D102 +C9939DB7F7C2293A9BF92E3A81C2A17B1C2048150935B977B85EB6AFBFA266ADF1D7CDE5 +8EEADD8B2D7D2EE4D9FF56CDD2CB1CBDBE229B03353D7370F9149ACBF086403B96B6E859 +952A34C0B58B4891E029FC505417DA6175CC8786CD4326548C65941E17587AAEF46006AA +01599C4D9C3D66BC8F7776B38822AABEC1D52E1B29702C498D6583AA9BC40F656DD6F74D +0528F562A31E90F620B7E96FAEA15F1F2F0B68FDDDB00D9FFCDB10635AA54C47AEB4FF60 +EB3E40FC4F82A0F73B8440023753309E443CA66CBB5C02CF7D77DDC5917078EDCF50BDEF +1341027323183AD881EEB8CE2CE4B983C611508E8911F098ED89DBF2ABBA49F1E7DDBE0D +6BFC1EE74A839F7CCCCF4A12339519C2EFDA56941A74044CF1B0222361ADF02CADA96F2B +94AF954304B3CB7635C2E7E6BABDAAD0CADF6127F63A07BE097E6C7FF598272D39D3EC65 +4EC2E9B795C1E6A65C50AC1D540130B16DB5D763B9923DAD3CC2D8DBA1D3D2158C01EF3D +0F41E368C49FE8AB6DE7774CEB1134B1FED9E8911F9C2F29B8A65D2F030B966444B96EA3 +48E804BB6343A01E2A5A4B3A39EDAC4EC5A8F9F8BCB4377B0A10820E5B5FCD84A1343A02 +CADC1D5EC78CEDA3EEBC08E795D41C30390EDDB0D6228C706CF39C2989618E1A2C86FE80 +32E093F244E65BBD5AE8EEB19AFA5EC0717D5A0365890E707DC35B2B56187314BC1EE8AA +F3CF2A8E90B5A04CC30BEA3E50101256E48D0DDAE0E8DE05D62DC3AF06655AE331010C67 +EF2377D07B7075866B905644D7003205A1D9380B56386E291962F5A8CC209C4D540CE82A +02B4E654BD66EDEF1DA488CF02B1F37ACA1566F5FF3E4A25E9DC0FBE6F1CCBF4315DB6EB +F3027B8751BA5BE3E68C3B428012CDD1F23ED25C9F09B53321698639D37C581873723846 +06606C0B4E522B57B592A205EA908633A20BBFE46689A9C749FCB2C1BA5D4B3EC7DBF4FA +C810240BD7D2CBF721EA3F824497D9B105348C6DF4E964AADFF293FB406A4678D7E1CD5D +24E189EAEA1CF128CAC24C3764922AC24104808451776ADDF427A8E1DE5227B82546F1CC +8FD56C60EA96726924AD39459785E481A86C59E43F2964C332FAF11BEB87EA9F7CB71920 +1E31DB06A94C12CFCFC4CB0E5925B81BD827842A8FF3021BCB63E9CE7BF8984006062267 +DB5F53DCFF1F1C08E053020257982E81CD41F6D55D6DC148CE7E1588146E2E7A721E0C63 +4451BA6D6B0BA5E1434EA112CBC5BC508BAC211A55498D30FEE9DA4BB5D39E19767CE082 +CE5E2737B404708070E8E6F325D8E9A705398C4D2704CD50AB6567411B18D49F2D55D690 +CBB1B4D50EF9893F8071E8423DEC6A6738A92E527446549C87D4BE374C6BAB141331BE47 +B0A1415937AF7A047BF16B2AEFAFEDF28D15B66C241E346884870E8F3ADCAE8A1403CC77 +1EBDBA2F12EC4BC01547238E69EEE4B08FBFAFC2E81CDE882C9D7558501B0BC04175CA89 +D1EA401ACD6AFC5AAC4128539AA1F3ABFA352F69A1322A7E505F68774598F26EF248F658 +D0EB1ED0278DC608903AE7D8DB3A2FFBB486057720D8F7B6039C2BD00FBD67B73E183EC0 +D539325173FE5D5F6443A6D98B967ADFF599124199825EC044717674D4EA3D0CB23058DF +D156708E37DA80BC192F0D51ACD25D144411F856E36B135403F818297025F27FBF7EEEED +1D964BD4F0BEA178AC1780B1FAC7D64C2BED556696F164B97CA0C400F8ECA0E508884249 +8F32B23F9AC97B52EC55580C0C7DF9EAA9B8DAAF266DC0A02C2F3AF10D756AFF097A7610 +9C299FDFFBAC8A6C3652285901A145DE49C093F4AC2BE72327C35E6F0756F18C9D219D28 +24230C2F226FB0E9E47291136B363658230009DD11F2A8F23BC2F90E7EBFB384E1BD8E75 +42295AE84096E3BCB7F7E7ECFB394FA8B2C9B4746455DB755A59613D085C34D07BCF89C7 +2EABB16DDBA4C2C09B48A5D21D75CD9529E4684F29479264C9DF6FF211B72559F0BE453C +C83C1FB4EAE42A8DBC18B2F0DA7DF4CEB2EA36129B469CB59D74C5A6897676B3855E9E28 +5F0BCD467538175CD6485237686CF42A046B714941BFC56FD1ABCDFD292B5368AE331149 +B401F69DD62B294FF941B1CCDDEC0DCD5507889C8310A6FB7D7F3A9F0713AF8E52A5077D +10ECCD6B5E24B260052A25E09C477D1F4A4710EF521C44F5765EF8DAEE3B7BA4E286D764 +59802F38D8E97D9A557963FCF5CE32A7DD5BF847703BC9314102928DA945BC4301440841 +94AB6BEB1EAF29A147BD1155D2A5E68517E4C347098D4D49AA10A359132C633B02E3AB33 +4BA68714EB41277EE78BDB1418DFC5A584F6541F3EC0EFC75E66263F61CF2DDDC5DE5648 +B14B8A275CAE0728A9B60FD75210FFB3EE02535815F68572A9C29DE316C7A6C991DA22B8 +08CD58C392DAA11A2390AD45CB6161063043C464DFEC11E8B068A0CF516E38BF736AA9FA +A03AE4EBC45C03A4064A4CF07B171499954D8F93A7598F3D51E953F91C7A70F35C88A384 +97839CB7F9CFCF788932B261AB359F8834660BB0CB5C69A4178BC3A6A98D6DB0C7C346F5 +E44ECE30B1C3E5EB4D203CED8B5DFB17F8211D672013A41F5760D90D593B7079D6F231D3 +03E9C3BFFFDF1E98B8F156BF47EF60F082FB02AB362582361B5274444E6C615A8ADAFA43 +71CBD86CAB86AA91D096EA244AF3C69C4A2F9D62A0F5BDB7649DEF309347F364469383E1 +4B72A52AB0B0DC030D8E785C81724959CD02E1BBDF43E6B92DCC1AB433576ED1F7B7157A +483C99F4662ECEE5116AFC2B28263AEAE6FC04C656B02E15D619275C7D79894320559E18 +B75EDEBFA7230375F5EB1A66DC3AFF798C6B67D05D8B49F28AEBB509364AFFA36EF12063 +8D958796CDB5409D5D3D8270B4E602A530EA46300695868F972A1E3764FD44BABAB416DB +AD0E3799FE67EA3A134F9841C79F89AF7FCF182A484627FC0A70A8528346E3C27F655232 +10ED76FDD4626CE3EC9F34F506F9A7F68C50B9434024B7C40A3D1ACE1E616694E442625B +FB49252EB156B12AACB84BB3985FBB8431A9BC0D1F071F7947ABC095FEB24EBDC9381FD4 +ED98028BE53D441AFA5534C9D27A3D21CCC2EA3B6A652E08CAD80B56751ECB06F18CC9B7 +CEC29919314FB5283AFE5A1951D3669B446F094550DAAD91C36CE3E5D30238C65D2E1D67 +5648C147047FDCF267AACDBBA50B1F9C7959C5F12DBB94B64FD02741211F297176F5F849 +412EDC12029643AE2AF2CAE8552C69A90BA2AB2DED3FC3D5D5E8987CB9B538FF90B693D4 +B842EF7D8AF1055F53FF8442AB5854E94BD016AD3F29CCE91F6D222C7E0D3EF3DE72AD41 +C2E179FC20B4E0E694E50082E944C77CA4D878BA6F19410FF616569C59E94AEC542AB9CE +BDBC0C9726DB1D56FE5B66463699266E4802B8572C7D2E45DAF827DC6FF7543A45A8B7FB +908AFA10A67EDA2CC08F677503D0D30D74BA3379234897DBAA955011163C4E0138858535 +1FFDBEB8804F00B6799ACE948E698EBBA5C391BA1D2FC74F20C448FC0BB8766BB3858B46 +2E06F751F2762A5B8DBC4D2B7B96FCB3EACB4757528964DC348C274F757178EB41BBDDE2 +E075E7F340C899F2253DA8D35B2C544792077D7CD7678698C2D8A3E36D440640FF920E74 +7036EE2E46227F170C5F311BA5D89C0EEEAE6BD2CD006C5D18BEEFD521894E5DD7E865A1 +B894E8D3E24AFC5A89D18773A7028DACEC61BDF9CFEA5FD37826AC0A7B51C7CFE3813A36 +8D62036C6B5CE16E56601864092F2997816C600AAF2DF34CB4832981CA5737A5EEE14F2C +08302588D473353CC126C39CB3F6829CF84358384005A577A7F8E9BEBBE001DCD4BE0538 +6490A8E7BBAB5DBB98B5548E478614B9CB730CFAA373114384BA850D00FC9B4DCFCB6B8C +A57D4288E62BDF5D36BBC888C6CF5F501BA8B6D8C5D69D5699D80AD979974F42420D114D +9BD3F2ED149514EF44BBB2746A00E3C633FFA966AD76B0AED0568E44B94C1F820869D86E +91A78A7C5DB8F454D313637FCD271D92FC20C9F578B21A969EC9B1C015D8FA455AB419B2 +B743CF348AE9BBF466F8FBD617E29374DD71A846A75441CC79C4B1030266EC8E46801E38 +CB9FAC30D2804203AE5CA81D0FAD237EC8D8EA6C544F8BA10B91C2D3A402E940D3092E16 +9D44A95F8292E2DA06C709302F69729A5C5042A009D319FC7049C50DA4653337A6BE5A22 +B325F1C64CAF8682D3D4904654D636DDA229F6F41FE01DFE8CCA48B171FAF8C099A92C28 +D3691CE8EAC30941176151B67198121ACCF7A6EF4FAB0843C385003036DA94117B66FFAA +0A6A8C007404A9C0781D60652E48D530A656B7E005C5053A8CB7483D1EECC4A85D907859 +982A74B1731BE0B8F4B1E91E4481A68057F9AEFD9438343C1229B0E676842A85641CF32E +364CE9EDBB8D4603CAF04A5B2111760E1E77370474393F89179413D5B9184938BB00DC79 +FA7602A1A591EAD89E9D7DE655378E10E301B4005D6B5BF682DF253B0D8A34004DE431B7 +C82C1741D9952B20F7312F6B44806226115791D0E38C6A5E855B2197DE0317858F25C62F +2177D7E6237CD2CCB630FBB13107B25EC2A75EEA8AFE6AE0642AF1F23D171E99AEECB731 +5034D2410795B40495BE25FC6EE051D78792D65BEF57BE88C0DD7A7C6221D0B7ABD88762 +9AB940664A7F4B6261069B5DBC95BDBFB9DEFC25D4DD38B184CEDFB2653553894B7EB379 +4CE19DAD9160266B97A32BFF96C0A1B7B6EC126F34DD8B242AE0FCCFB7DA22EA249A14C3 +E6208F2FF090AB21CE1EBA11D66D654B30CD73CA6B2258F67706792E63E52B1F9829313A +C0D6FDB303995546B77974C0B07F906944B68B50CBDD7DDA5DBEC4740FC6333D1E62984F +A9C13C623620B27680BCDEBEE51E3B5841643383374E04BC65E4CBFA38C91ABA62D7AF44 +C721491F6C78A9088DDE50BBFA9CDDA44E567D776559D3E11030CAEE6E5E7D07289CB58C +852AB6E55F52A6F5730A099C982DD11296E4E33CCF20BF6EBF16C1EF76785F13A1AF9EF1 +A52FF02C06A959B6839550F4FC30D277AD524E215E05B63A9C7B74E2FCACAEF3DE606002 +349C3FD26BA26FFDD6737BEC9C5DAB55F0A63AECC534DBDC2174490980A9AE98B00F6BE5 +2334C6090BDD9AA329F6A66F551B3E41A0DE3EC021C7916F521DB7CF1D5A6B7B9D72851D +285358554917F453CC15A1D73FD528AD12230892C6774001C56840F60EC5439F6F54F741 +96E6D3D74010F14A30DF85B16D23A7194634CDD9E4D2D74FA1ECB3DB09DE7D7FA438468E +D1AAA438A463FC988C4460B1C55FAAB585AA17837CE6597B162601010A04725655079C2B +627139B1A2AD607FC365CA845CE554AC4881BF87DA677B2B240AF10286A947D624EFC074 +1D7EDBF557FC7BF5409AFEEF4535C7A02D9F195B1A20D54C25BB918EC1DE3492D8301448 +81CC8EBA460A299805212312643D95AC08F93ADE8DA467C4286ABC575D17265D7B268809 +C055D44FBBC1672E34B73EC73F114FACCEF8817B3EACC68C88D07249769D0AFA2B797863 +B6ADDE44995C903A35A619EEDDB8F1D76E736C26EC4E8BBEB51B05DBDFD840C0DB53C766 +625664B8506BB1A66DE8A04041ED2F68663BD15E3B932234F37CFF8128E4B2AC1C191297 +D4202B56DE39AEC4006ABE003B7594062C26F206C124E1AD656B8598F190A335A0351034 +388C225B0B542D11E3CC96C0B72789349BBCD9C445C19265D32440F6248F2315A9024BBA +0CB6B71BD71DA2B06B57FB0483262A653161E6ACFB5E916C22B6DAE5847740A36A40A505 +668EFD5FB438F9F1779C02A19D2C14D6F1DB6B120C060D2ED8BDEE9733497FC9134A82E7 +42970EDA3F136E0740CCAA97EF05658BC1BC0F5855303168E2BCBBA37305459215393674 +3D51B4670061818712549FB6CC007C1F13B8C74A8AEB05B30D37E6587148A94CB7C1F27F +1B4B37D298DA91CAA996A180DB262FEE001AE974B819D288A619A8ECC8E442D4A2EE0D93 +B89A0FFB9A03EA573BB8D40676E9C67EAADAC5C0A807D7422AB90881515D4DE087893B8D +A0329DDA3C42689CAE4F29C791EF79B2965F6DBA3C25AB0CE23ACFCCBFAF41ED546B4A05 +0203147147ED047719FAE976A2B71A81A0EDC3DF0A3E03B4CB8208BD7AA6CD91151B1A31 +5AC3C27534D9D73F285CBC0F3D7E0C2CCE2DA1502BD04AE6789ABF17DC7CC9214C67F2E8 +5DE2A1A71AE65A91D7F139756A1A9F912D759CA02A433F0C44E12E8739C4C2BF217B8FF9 +55FB47DCC70B1790B3E906B9AEC41467E5E0E9CA0317BFD62F2A493EA5DF4103A385B56B +45290A56E816C06EBAEC8D38509777CEBB11CE12509834FB28FA7A19FAADE81BDBF0E427 +46EAD35477D51E467EFAFAC373E3E72012AC7AD85901AB832B8197A5EF7ACC5A9D6362DF +89CB52589A3CE810CBA525DC46E2C00680EB66CB4E20CC4872B5F6F9BE3636117140C3CA +545CC3926EE9005FFF15AB7848A95ACAB42E3B565AE93DC7A1CB80B2854EEE6F14422013 +D50C7BDD75E97822BA7C7D65FD383BDD5BE7DC9942888CB7C39CF56F17ECB0676B73D3A0 +2A37319899D89426DA1B299009379DB2C217DC43FC08F4A43E13BF8522A2275EBA64628A +78B877E2EFF40FBF2B5C628981B0E66643757F5F8412A5B48AF6CE0D230D57100D2F3446 +CA7C8EBF6F3EACC15C3115BA9BD61CF3D6309C18BECDE16EB18F6D008C5C5CA0FA426B52 +5CC0F33A5743D4FAC4830C4B7ADD35ED3BD7F7B072847D2D430DDF667A6FBE49A371BF0E +BBAD32173AB5928B86FE1F4E74116041E0F6E4F1041BFE588A17C7ECFF96EBCC224EF0E0 +8E3D8566BC221C1991BEE248920A4BF4E424FFD1BD34D1CA66F53DBD6A1AA33B33CE4EC3 +ECE8DF81BC73A54DC350A3939F07521808FD40C566B03124BC7300D28035F2162B76F6B7 +F7A26EFE392EBC35BD718DD1697BC9FA8214A1E137E28308F7C37854FCFC6BD031A851F5 +E54751C2C409A314A0AF104BC8D561A5A8E7C6B0BF4F1EDF9B42F577A9B9AA91D690DA70 +6BFD54903E6A1591588A845EAF9B49A8C5BF35B06AE495F4A8CA94D64163B2BC03482DA0 +BBA8B30CC65711C8B45AB4EBAF027958D578B94DCA70863767A0627B0751AD63EB628BED +CBD2C89DFC2A3BAAE500389F9D25F1EE6FAF3BD85B018296528A0B6049688B2CF7BB1941 +386D49D254EAA716D29051B9A5295E937F700C7D46872B6D593869A88576DAC22A2F8B3A +5076656122DD5178AA5FF49A84BBBE20DEE581FAAE017BDA5B7D4886BD8E90755D766EA4 +B2E825F73B8DCAFC4AA1A8263A179EC15E6E7EA656B1BBA6E19756324876082C9CBF9094 +CD62531D1BC54FFD2F9F9DEB6282DE12B66D570EE73905B0287CF19E628533EA058D5FCE +AB66B6DFADC6AF54995ACB056B8BF3AF89EB021073FA98A4B6803DF89CEAEA3874B09625 +67D46C4D830F0CCA68C7F24B20B94FF73A0D270D2247193214DE5E85775E15F5ABF0C88F +59931730842A814185AE10BCC62DC83846FE3031B140D6E0E05F4E5B6053F71781B10D05 +81904D48290FB4A157670B791271F7B1B32BDA4A71776B196767EA25D5A935CBE1626C6E +5B3D8E64F74F03DFC72FB5C63BF586540071EE17C883AE11F2D154EE9AC0B2F7F71D4D08 +CC170A9D5206AF1585BCC8AABC2C2C714DF83AD1FB773CBECCCC388E0D3769CDF84DE17A +83618678EF40D4171BAF7236BB081887A042DB575528027CDAC918086C6D8FF005639565 +F6676782F78AAA4EAD4ED8162A35E447C2D60A07E6222415B516C8FE60B9C0FD24E78996 +C1316D99AC6BF81AE6A7E53BDB0DF9AD231123474DC9A0105CBB4D98EC4ABB4F9BB4D3DF +9BEFC99537B06378E91C875FCE12910CA65C33C47F1D8A864D17D5C5B288D5BF6393C576 +ECB62660756C8746C2125A8434A5DEEF7480CBC48C21595A28BC9931AD897C754A87CC3F +608999E7FE39CE1F60C099357246117C8A074BC1E405EA7FAD3277CA45F5053C2EE050C4 +B93A1F85B90084A12D625DABAF2291ED36699134DB6BBF4AEAD7CFE27379AA6AA93B31A9 +AAAD3F8F998BA94D3CED13C1730326F08928C6A648CD010845C7CAB2B935ED2450239B20 +63D25104A1E9F4DC48BD8BDA6FEC274BE5807DD2355F6CDD587263837ABF3C8CF8466D3D +9C38D0302F1CE94C967BEF58E6B867C9FE138A7DAA9E7C791865A3E8BA65A254C7032E38 +FFAEAAAD4EE632983D975F167172AFD8FF70A1CF6C90C24B9C1C3E1CF51046BCA8C2F0C3 +D56B931C70848521756E221AECB2F0015B3476FB304B28C4B7966A3F693AC9E1C5D69C55 +8DE014A05981CC5E1AE6083A91594F0BF812B1348B5401E4170AC65CA29A7182073F0E18 +8BDFDA17EF3933750DE211D30CED8B11A1107DE4F12336FEEF5AFB522B2060BB745526FB +D06E42C1D4C7F529706078FF598EE48C9521793F53F770636FF6CE984FBBDA645DB8E631 +E041B10E43E836B1F8C58C4F2D4A7BDD4165FCD7B19243AC560E80A6FE7A3EB4FFDA465D +9ADF12EF99FD68D90139A58A53583CD9A0A574B8E0A604E84FCBDCCF67B8A2DE8D411996 +12EB00DBBB8448B80098B458B143C6D1CCEFA354EDD81B01BD6EE4A0ACF2AC0338BFE143 +06DF27EC691542D79715D36E06DE6D7C2D3C9C0A7DF0094CFF0B50FB21D67138DCB7D447 +B45EAC890C4C6E08852F9C00D6DFB9C60A24061A3014844C84BCCDB993E0B8206E5DCD85 +A97D0F1AA82F5AAC40B5D490BC1C60F05B33BFE6F6C07138A4BD1ED177C2FFD13278F53B +1B20218F1685385A604934223F259646450DEFF801D97C1D38E8621C612A4E49B9CC2279 +7DC683D7AFAFE54FFED9563E880B86C25982D6733EA3B8558461207C91F024640FEB1D2D +5A7F80D16FC694DDC1A59B7E30D1924ABA53497F37345B31D2429F6804AC66E9FCCCF4EB +9EE2BF2836E5B55F29D445762ADBF6BAA501E198FC7FDFA66F3474B116E9A77319AFB981 +7C2F4BE21CDCA0FCB65F07DCDB906AE92CC40B4A8E967D91A00E9110BC5E3289AEC2643C +02F77C6313DB7BCA506CB8BB3F3A434904BBBB46D7C724766DB3BB73422B659F7D5AD5FE +6DAD7B204230C92AEB30AE4E510478F620BE0E4D6AB477971A22A5C6AA66835513B1E2A2 +278BE747880EA3E1EFAD48ED0B7B5C320B833587A22D5C944F5ACA917C4C49FCA58CCF19 +BD800F5DD3246DFB9A772AEE6DB700127D07167F2D69CABC855BA8850571850D913A0606 +3DAB1EDBB6AEA9724368DABE65C57341467A58E819ACD98BCCCCC971E30F0488694579C6 +C4991EDEFF6DDD79693EA8BAD8AC9495D8884E5B09D163C7A0D343C031CB29F879CC5064 +B65AD297089E7AEC41026B5E055DC47A7C529ED28F3D27A191239D4E3EA911C84084B411 +13D7029A39E6C6A2E931727711F1F06B807841406515B7711A6B96E6AEF79E271C6E7D42 +7146AC3915D35E9C2D4C9E7C5689F7B0371BAADD037840BD034F4C411AB29B36D4314729 +E97666CCED8F1A5AFF6FA352AF6AD9D9343DA8E3F97A8C756B48675750D128A3862C19D9 +086B597EE751BB0D87A3B7A56866CB6AFD2CF8B1B322C9B2493D40BD5B89C4AD69F347D7 +26C22E0E39ECE377C995A611B54C0B2EE3B6CB16673F50779C212AF1AFB93DFB2C931A09 +39A1379C379E3F7327A687B5C4D8D909D3CCC5C3195935D8A09D5E5BFF12E61EFF4FC6E5 +F99A1460C5D1FBA82C84136BCD64D96AD968D6EC728DF4A85573E021734AC6C2100B6F67 +F4E648F5E284618A1868E773D9CC819AE8BB433FD388E971F211301B3ED077CC37FA4B58 +0B50F8BD2309D8E81936C050E3F0C8C7D81A80DA508533BF5FCAA977C17A572DD92CF1A6 +B7172AB4C66890E9F4FEC661AD629FA0FD23E9427C481408A637F9E649DDDC31668366C3 +692B524D9B4DA99938076EAB2343FEEA1560550B8E8CD18D3CB23BDB1AF30F60EFF18936 +46B26A09E5411F6C456917CFC6BF3F74B2079D0AA56935E672464F6444F2E17DB330F94D +FA7CFF92DB6C800B2311AB86A21658D431EA7C811E020538CA2335B9DFF550C077E83B29 +544FC63F5407B1C9CBC3E6E6259742EC85BAA006D2715D686619A94AC7EAE394915CA656 +B8DE89A462A85CA179C276B4F90C399167DF0D928518DA2A45B3125CD16AEFD65C85801F +BDA3D139B3B349AA86037B579B8FA94C713DBF1DB2A904652E89AA8281DD58D4CFE3434D +6C86F0BF7921486C9AE78F322DD841CB43AD7EEAFB5735DBF68D03DFD6640DEFBE22B305 +B33DE7C444D16D31C3EFBDC78547D77962EA985B734970BD6C4B729C7364348B1CC321A9 +46D096A078A45797F63B1734E968CA55B8E905160740F68676AD286C9F44E1A94D17F911 +0EF21F8EFCE27A76D1D7869FD19C5A9AC889675172335D312E8E1DF59ED55F8FC13D0E6D +9601039BAB9AEF7A4F3BA688E288A089B326E0B582384B9BD80A0BAFA1130E2034F95D21 +49DEA8E5F576EFE035C5E58CE82CCC0B3A95980097B2D4A80BE162C8E3760C3532697651 +2626F6C64864810E304D98D77F13BD535DD5BFCDAEFFFCEDC1CED370DB2EEF6D90E1F0F8 +D4C3FAEE71AD31B0F4798ACD68E1A5FD00A327846DE3AD55B0F493E534AE6E30D2DA7EDF +3F68459CA7192321B98C8DB02D3399F72A0216F822FB8D0B5B650B38586BF22197F78D31 +55B67843202DDEFF5B04D4230DB2FC50443C21C8C28E7AE0E399767E03BEE4590C4D47F9 +27210114B296F1E8263213544DA56D46BB179ADBA6DC415D6A46679A4A7494AE4B2F0812 +9C5D06F92D2D500F336304FE3454F07A2083D6B6BD5D5AB3D6F917F555C7F7124AAC6F38 +4262A051D865369A95DD8EB9DFE43DCBCE770D3C8BB6630AC2F8DAFCE58C5C4060BAC1B2 +EEBAE9E56AED8725DEBA7CE23DF18E1A52A5B87F39EF416565DA17A5BB6566A8129CFD77 +D3DA3E3583E6F59EAA14F7788C06D3492FC84F7C6BDA74C9FA885EBB7125E87760A1E848 +E9CAA638A813D6EBE8EA2A3E9ABA7DC8C392A066331D9EACDE6C6819AE12A85B096CBFE5 +29BA283C2CB73FC34472C5289914EF347AC8119139A3E6F0CFFB5772D5AB65B276C171EE +D565CF9B1E629AF962BBB00CD86FED8DCA3DA0BDE9ACB286C516114BDC1AE1AC41DD8453 +795253786205499EF2E971F3DFC51C72AC5225EF4E0D9DEA403F24002591D9F55276CC38 +0DCCFBEB33F7733A1DACEBF1AF33D55029C44364284F6CDC12ED12BBE809666607771634 +90828A6F10683FAC8C3C4DDF38A0CFD1D1FEDAFB7100FD9C02AC8796C7B3B2793D11C107 +DF10D22D9C294A3AD3897431EE593AB265D97450A6B2DC4917ADBF04B04F32F5802EE354 +4D3A95CDDE623A423213D0063B79F8F40EECC82F3C5985CD12B0A46F5AB9DD5175A9F3DA +06E40950ECD37DE39B5EA6205D9427EF43D5B0D090A62B669E437D0C31B6A03850EA8BCE +5D2D48C25EDA80913821DEE94881348DF1726A7D61ACD9520267B5C668F46B1660E87E27 +658B7D3C2F1C06ED70D97AB144D22A4CFF4A54D73F703A5AAFCB5AE2C7C5B33CAE3F0BD3 +29600C9BF8BAA060ACD3C4D5A72851A2A18AF29212B1E070EEFC452048CF312134436B5C +E91FBD2E526CF0A35F42C1D8092DA30270EFF9577ED231B303B472670B458C6B53B1C766 +09159D861584F0901E7C8DED964E9ADB0B424092B4B50C490BC8DF607EB9345C7AA94CEA +F430F8DD439472CBEBE11C26F9D7C7C5F8F04F6D3D97043E282CC848A1BFC73C095841C0 +ED64E7449BF4CD53A64F0B932C45B0770D6D18CCA6147E9F992A93275AC93D1B3B0F02B1 +9F117034AEA1F3F0F77D482A3DD8D5B2F69122E5B08C067D39A1C25D042D1EF4F47377AB +CE1C38418BD39E7400F10247FA13291E34BA3CE681CDBD28F3F14EEC90A21C76806DA1CB +25AB9B96031D1A472C1146004C4DF21E61E07087A8DB5C33DCEA85EBDE4587FB2FBCDC2C +5C6B92E61C72B067EB5F07233162AFD24FE6A2A9D0BD11F401610D5C5F91E46D36B2401D +A81BA2716D4AEDA19136E58A14F5A367942B70DED7DB1E0703609FB97F8C72C062934495 +DE54A6C45EE6C8B5F368F2817ACD4A10F14A846C1FF578084779649C4BD01D9CBA1E88E0 +1DB953307EE9BF10E6C17B020FCEEF709840DF73B4CE45D4C2583CF4B357C33DE67C8CFE +8FFE367E89759117EF10E08899F466D342E75083CAD4795950C026505BA8CDE648FEC333 +BC5842ABEDC3CFCD3B27E707D6EAC3D54FE7B9C964E28AE0FFC96A06802C5A8327FC2CBD +DBA565FE970FFE18008C9DAD42EA99FF7BCD0656362AFF37432A182C59988B0BF458C370 +725CF7D7F864747CDEFA9688FF6D2CDCB49052F349F9BAC9F8261B5FF65BCD2E531BA32F +7FD7D3F0E3042811B345E8676907FE71D4FA94437A3A42872285F010D909D468462942BA +696325E79D943D0E44992A20EA118ACF9CA5F1B20E52719854476111D6479B3842A9CEF7 +749437F57055B19C5FD6993F5737E8555B19161FEF7F3560C6FC498EE8148B6327EC40EF +7CABBF6B7A99D14A789F6F5431BA4714CDA494E29542EDDBB4A250ACAFB9802B6A3D8FE2 +1CAB7FA79D9682C1B1752DD2E671ED5E4574BFF967156A503753B65075653471F29E06BF +7342AB3284E9EAC6F14232F32C3B0266416738EB5A138DC33DB2FA3A74E649532B4BA7A9 +AD51E0278FE837ED68A9A5E40AA236314885AEC0DE2BB1811BCC18F0A75CBEF875D886AD +55A873B8D3FC81BA69DA0C68778CFC5F02C17A851EBACDCFC9A0682D514144CF47382163 +6B1A61CCD572575E6A81671DDAF8C442E4268041F8E03398A9EE0F63B352839BFC4D4720 +0F86CB77549091DAE5FEE2CEFB21F4B987496FB8F993E3CC18EA9CF06442403830E06738 +20BBF3E4690163AECDCF693BEACC77B5591FCE1D2DC11621BE67F9C439F7864BCF981F3B +8A9CC1F21424AB86102448FE45A42993737F7C09275C627CD601906B75CC9370AD491B59 +2777DD8683ACC7CC961D6CABAB46A2AA65D8FDA3E66DC5C75ECECD209FFBBB76263E036B +8F62EAD1B802D3662A23A28079CB47ABA48799F3DB0D7E46710675B2C434513E997D189E +0A9661186D9D623D5B47BB377E4B0CE197D80E9AEE04E55059C6292C52E00D0AD892FE67 +600AFA285DC92263DC1F15EEBCA803647789D4D420FFB53C0CE4A669B4B963D5F2FA6FFC +3B28AABD6D97AA2F92EA3FF8EDE7AB264CEB19062030F43D8438DA703B68D2615928E4F7 +9687B03BAD9F3447ADD3090BBE186FFD3E42CBA236104DD1D9A8E9357CAD999E889D313B +262A4232C5926869139EF1165172932601BA4CB406177E25E6150605DB931A70870F5BA5 +1DAB4D15D500B261F9D708174568422C714F30B696095757C66F7D2E6A5CFD146D90F21F +27F62393B532583B49558C8C6124F2F428794133E093D4FE09805FB2F18BED35D12CA321 +B79B0369E46FE3191F47B07D234866AD7EA52C50F4C0562597AD1F7D186060BE2339C324 +F154C2EDF64C7A40E8419E7542B8CA143E172E3C62471AC1F42342051B3FEA08368A31D2 +56A7D51FAE801A420FA30E5D479283A21B50AF52C6BB4196433D933FAEBE36EC577C59A9 +BF52F260443A622B637FD4F6BFD330F8DAE7E4374E16B8E98BE92E3404CA22763671CE0D +276981334084462B06763958C81E7D85C76223546F3ADA094E5597AC68967D96CD9E76B5 +0518144684C71739C488751FFFD3B9859E23DFAEBC15A0AAD8417416CD5B47656E8BA799 +BB2ADFA07B90E634895108D5F97BAB5B560F0608C1239F49967B34941B908AA695840FE8 +4519FA60763EF706ABAF2E0C7D407E5DF05807FCDACB17685226D6B5070522D4A6AAC8B8 +77891A1390386A074745E5F4875F625E9BBED05B54D04EB6A6D8352E7E4E47FB7EF432C0 +808D0C139EF7EF5220838D1CFA3A839B10B772D8F2A197E8FCD7EDFAB65B7234A7E1C0CE +D75C3120A58706A26004C2218744B095AF45009AD3036AEE08068311B20974C4A95C8CCD +4EC20B2B8B8EC4F2D6F9281968EB51ED0E377E3BEA2481810C3B0B289AE6A3EF50339AC3 +B7F06050B7705C260D942DFE3B104C13728A2140F9E137AE5E476FA67245FC92F1DFD28A +81CDE2EDB4978F971F668664658A674999A62287F74C8BCDF0C306C20FCE35EB1BB7318F +9D7BC39F215535A9796A7AE7D117A273DD5F1B0F5FC5F87863A817993C96CC2CC0FE3504 +44698065A0654D045BE4FAA60A218D260FB013868B18AD6DF01B793D298F0CE041671E71 +81893BB81310462FD1906C5F8137FF46937B206588D2715297D008E6AFB90DB28E3D64DE +73EFC4A6DDE7466A3D1BB402FC04AA80DF2BC39AFD30207230828FABCECFBED8E11598AD +CA43FE742EA8D1BA8CEBE4449495398E5DE432B8218E02A5340C854455069082EC8AA449 +63A13C0069F468BFC1D3D75D4458383E04268297EFAED1D02B91AE933DECE8DC3337DC99 +D7AD1DC4B999A3AD5E8953C7820BBE425470B21BB61ED6007F236467503327FF73979677 +918B34DBEBC181DB99526586BB6E9889DD810A0CA022C62FCA58F2D4D738A74BA24E2FA8 +29B80401DCB36889A4CA08B77377DEB0C4172DAE920E318DCE78DA14ABDB77EECFA5A1A2 +6FF51D6569AF1218C4256D4B4D206ABBFB1D2C7AC2102815EABF306CDE0615FBA775B5E3 +446A2095C406CC1BFC1BF4A53E65FFF0ED565B45AD332505AFE0F91C8569897834C06194 +6C745ED6618A60065F6E3B3B49A61BF3265F3BB1FCF8A25F4880DC771ABCE6BD03B48C77 +83BDC1CE678E423ADEFE9AB04D40097D8DB062DA0A248D1C81AC57FBCE032B232C6FD553 +8AC5AE7983412BC80D23EB71E4DC3B946FBFC4B98C4250BF8D57CC55D929B55C354A3F9D +1C5329F36B06CC099C2201E7FA501F75CC7D5579FFAF9F9C63C6DFEDE80B5387117EDB49 +9D3F1C72D650FC120FDFC8E42479469DBCD81AB244C316963CD6EA1C34DA43400C5A2B7F +E9F0B71EC4EA67255AAF6A2F49982441962CA30DCCDE6F7894520FD2B811619713D91DED +5D1FBCBB42B1368E7F8F4B8438C515B4661879D353096F880AE278905424DBE523DB7B41 +A5867878E478B85960607BD1C129E85249CA520BDAA479CFFCDA162E46DDE5EF6BED9684 +31F3289735FA2891C13C0C341159905F43BFA6412B6ACF04C2A11B87AD4B41A35385AB66 +68CF890B1E9A43598F03AE5A833A932E5C5A70E498C405CC56BD0BF1074EF1431980F575 +67D7C62291703308B41C4B94A99DB6F6F1F924E791025D5E2F56F3A0B60903FC0CC0B2DA +8CC5785C6FB239ABB091B7718A9BA16D5A33083289E8347CB56172FF037F6FE1A9F7EF4D +5D68E23A9A3B9F63C2045AE2B1758489AFBABE23DC1FB610B37DC573D2C0AAF544ACC904 +B69C7775244B1ADB77B51727FC66D02637CF2E9C596A05AB6BEB23295A093AA90DC3C3E8 +F17CEBB44AD7A8BFA8898D6BDA4F84DCA2A30FB5F0D151D8F6666690BC71002F31AF05EF +E033513CE82E8639B45CD235F24CDB7C7C3576149CE989FECDE2F51FC835CA9A023D889B +F6DAA3DB5A8AC49DEFF48266333B5B01130F954242A7D5A369CFE937D3AF1C4F2C64051E +59FC2AAA3871EA827C5B74C70C259FD4DC5DE81E2970519C433F1331D1D08F5DB9BBC9EE +80D1B7972C7F1514F7116E25DF3E382785504969CC0AB8DEF43F5F45676B2090DE9A775C +04B5A4613D38FA586F05753CC38A684BF33D2991F909CFE097F97696CA2C59CC20A6D89F +4710B1EF765EDC4D5A0B7BDD33D8E818D97C9A19848903D1684436488AA7E204F577BA24 +F1D1E0D39ACE2DCB56550281BB24BB686F605B7146660EBB47F8E329EA27F94319D795A3 +71D2D04F6B3DBC4A61D4A7A6B748A60B5D8F3586FF31AC143FB706770E4DAC9A6741EE88 +79870FD251625EE5E77853F6C5D2F621C26757FE64857FE4D0502F84C14825D9BEDAD55A +35C640D9999543CFA0467165E5AA8E50699A1C13589A862BD656A22A50EB6F479D5C79F4 +585212673DC2BA0DA86109FFA40F5FFA1F660F8C055D2E9B9668B2966DCDACF5F189D835 +C029F51B85111D9D48F507AE75A7BA53CA97B39A5287CA4709DBEB723E6D68BFCA745FCF +7DEA768DB0FE6140198D62E880E49E2997AB132521C94D259CFFAC9036B0F2C2E15E22AA +6151E9D4737FD36B9676450E6F7C9E7531FD2F4F307D6D548F37A3DCE2CA5A811EC19778 +12B37C5722AFE78E1425C2C1C06461C1508818C9536FC9117951719B8D431551B4793C81 +CA6938CB75BF746C247A9F48354B0A4BDFB2D6DF3E305218173503195BBBBDDA322153A8 +2085F0FB5ED657637791A4A7E1C1B23CE0F8AFA1ECAE76A3FBB3E6B7A2BDA2E2252B2E43 +4413F7B626AB00CB381737A2BC0837E33C3E25C63852B841E70722F7ECF6238890D63CCD +2C93F7A2CEF10AA710AFD333322F4907E87A12DEF07F5C7BE344E73CF12CB388BB6F049C +D9713EBD215989CEEA7473C00E40F79CC0038762139D9FE2B2BBB290C51A3B4B9090D039 +C22B1A620DC1C3128C0EAFF4C62A29AF0338C65B6730BDB7D5A6A7261C04816B7D11463A +935AA0D33802EC148CB8E7DF6B8FD0FB064BDEABD0DFC3AD5A80CDAE645B7FBBC59359EB +A0D70699CCB53887530C3AC4E796DDA9AA05F36CC0A6D0C2F616E761CDB1ECEC164974B5 +0C0D38697DF56BD7F7F1772771054F18E3F5EDEBCE00939E70A43766D0E99EADFEE152A2 +FEACA0BD0BDFEAD28E3437753ED58E345FC0D6F4E395667411D4246C460DA5D3BF2F5374 +EAEAE1DF1A76A592C4957BB9C4D406257388DE96591969B30D10DED2C5B647B66CC0BCF6 +146FEF353A20A3A2E40C1A7B7964033816D6A544399965E9C17FC44C524268B0228E209D +2276C1071535597E57EC3D9C4D8328CA914F54536B1F63C89325D6B26DAB4A5B1FB8260C +241331D1B55C91406537C5323ADD2E3CDDDC9E199CE067262690BFDCB5184E25795251EE +181E745001ADEAEE0A9442D57002D48D6B53E693C37E0BC64ADA28301235E9799D9D0AAA +B4A23F6D8B4EAA5AD3B6B40618330441F6A24E44B160715740198B551C2883CB17FAFFD0 +3B4CE68ACBE3F6B33E29987B5258C1F7DFB87DB89735F05AE7966FF1F2B6546AF2A56918 +3687B6DC7B1AD435DA0209B0AE7CA01A3A3359291B1435C0BF04BDBE2B8778E4EBEE35D3 +17EB5CC7A3F7C5B7743AE69B16A6B9C89491D121617C20CBFA52E93274E6BBC8C0E9924A +002CBDD7922F3437560E3747B93775FA549457CDCB2A9943AD403BF8AF05EB1CA0EE347E +E832C6A17A3A53EDD50EF553A0E8D6723D3DAACEB6F81CBDB5B78A5B207A98183C3650BE +A88F82AF734CE32FFB1118E54FBCBFA2C2705D65FD4A1B3A3734F188078A7B09738C3EE3 +A12FCE8B7221C3041224D324AD3C514EEE792E3D47B1E8DA34AC3E577163E7AAD2C85170 +7D630EDFF8403AA2720B09218E0013FACA789243FD76719860373949951B1907097E01F7 +2840CC3089FBF9A86B01E6E5A882444A3D167A302AEFFD3AA9463A68C7922104E365FEDB +9BE61D5EC0A3AC5722F2BCC5101BABC86333955964509096B6799F286BEE15441C3DCD84 +A846B35D0B027C48DDCBE123DD9D2DD6A4808F0B3F98BD4BE29E1001905D8606390EEB35 +396A3A981529655D67FF0539BD3E1FF2FABBA0D4393CA781FDE2864DA5D2A0FA6F78063C +03CA44F27436C3421683D242EF3952B8707863F6DE2E3C94ACFA9FC60EAF7C8D09BE2D27 +BAEAD24C01748E1EC790EF22AF24F1F7BF0AA1FACDFB5C8E0A9B3A1E9E53047E4E791D7B +9DBC38B9EE8EB0E5CAF79C84E81897A4B202C6A3F22438D9B043D982F605E5C73CB01CE9 +56E9DA66D7BB53F38BC43DD2962D6589AA47BA3E0AD6BB8E0557127CF8F6F83AAAA3597A +8B57BBCDEEB2223AA2EB36BC84C7BF53F3B7D9C221FE76629512D04EC454D92060750F55 +0E76BCBBFBF9566266A8D033931774C37CDBE5FA71FB43137E5592DD67945201E1D10467 +A3BC5C273DE16E64035C39E4A36D7AA7F4E8389A1FDBF891B00613396194EFDC5B77A9D0 +9AF9C1A4EAE52C87A096FDFF8699EB01E9EFD3F786A7D45AAF8D9D33B934CDFD85C495F2 +09009C628EE54F19A9F02CE631DDC692C3C56D2FF00B8F277A18D1F38A63C394C717A0A9 +0B01AD75390D853D63D0E0678C35022369BC8C985C8229C98CE6BFE1C40770461A5E26C7 +7A7AAB035D6AAA9B0394021020797E627E2E7D17B39FD2E7AC6FEB917A148FB996911869 +49A036A0E5B85D8BCC59570E4C689F2E802262ED26A13C18A57F99A74DA94491C5727246 +D3FA45A7964F212454E119A32738582CD4F5899ED604F76F0327CC1E5746A86CDADA7F97 +E11EBB6524AF8107F3A8F0B8E5F887B799DCF9F9481859EC4E5FF63AF0C294C2AF716EB1 +3EC7DCFB796E3CE4B4CDA1DD15186CDE479CE4EECD1FB27F5A05B69FBDF436EF246E8BD1 +A03FCEA5FB213D81F80D6ED7960896101E046D1101A7522F31AD1BF6C08C5ED8F6574F48 +2B6FFEBF34A2A157567F1B82BCE3A46C14A168B0F4658055BBBA2E9C29A4DF42764F95CE +0EE9645C6E0BFF33CBBF3436F7A4FAB4B2A5055FF1DCEC075431A99670E03248CBCAED63 +4457D0EFC6565472A356B1169775BF5156DDF85E03688FE2AA31A158A65A1D9AA4489CC5 +6FDA78AB85C35C42B1754180577244C5343C21E222DA72B8BFA097BB860E9F834B62AF9D +D50481FC4B1B9861A1C2A9F340237C949FF030096DC29FEB028A00A5AEE8507AA290848B +714C13145AB3F4EA42C8EBBE4A3CC737C487D0DA0CE29BEFBEEE34F5CBE03DC91E5E2053 +F114C70CBE94DEA1653A26DD4CD332F62AB71115DADB2C6B3339878B9997AC3AB5F5ADD4 +9F432AC706A5256DCC4592C30DF40C5C47A2FDC72851FBB0E4EEFDA227B72EAEA758DEA2 +341344315496A6F22D42FFC55B4E90821C251F0D8B5FD3E0802D04E10DCC31E5024D330B +25AD95CE31981E90BFECB17E786A10ABF9A19220DB82744A43BF5B4DE0FD8C54171EA498 +AD14E0972D6EA90B5CB9846354C855E2E13B369BCACBF8F1852CE60227AB27CC84B9D326 +68E851BCE4086558BA8106D9249C3785F3C59E43827307C87C72033501ED888E32325158 +879454289A07888F09EC7EF1D6F55B92363BC740E170085C4D16547007A66B6F0E1FDB4A +4FDE032A497377F8B309B5803CB7B450A246A0CAFDB2F8CEE254EC5F6BC7C1EA38BFDD79 +268969FE9DEB9FD896E40E479222BD480EA1AD9E5E0EF7780D3E48D62219E5518499D46E +DE92464609DCDD07B5C948792B71F1854C114259463E839A2DE74A11A7FD114EDE9329D9 +F1EE8BE5463AF8A04943BF77CF68B0F3CA2571D4BDC19B980F8919AFF6EC80758056F93C +76758F0AB6313052355085DF8F0BD62C7380AA3D32102F48F4F84C153295AB27F3F55694 +E3C6339B3E34166DB450373B9F326A1E108ECD95B0887A4CB8C54A811B398C0B37289C81 +676CD8D528C75437BB2DA5C83C0FCDA94588BD785E4F800E87FDE1F277AFBC3ED0C5680B +27DC483446A828114CC9B239D8D1C2D920CF149B097F9A78E35C0BAFA1B0AAE5730BA067 +B142087578ECDED1DD73E8541BACE5FB813E14483193467EF8585682295816C4E29E197E +ED404E94340398A95A470A9E06BAB7BE0F5FB22338A833F9157594C5030639AE0E69894D +49098CA950C39937BF17194797AAAB7E076A2087467A2D29683142D84B0810F1C603A95B +3A81C3225003834CC446ED0944654805AAA164B088489DE9F71701AF4DA42C675388EA82 +CB8368EB21003C19AA278FC474731F2D74A008F24792F651F110E23EFCAC719E2E9C0481 +10968EB515AC09006E062EBDCECDB6D93772EAB20D7C105DB828A891F2711DB786B575ED +484349390AB27A3A767D8092B7585C8CF32F5FDF2B9D78A27FB8E05C4C25D970602ACA43 +31FC692DC5C7F7C0FC5669DD8B150D7A4EB22218DFAA75E79263D106AE84AA8B573B722F +BAF6D7F79097AE4007A3E519C107AD00F63069BCA7314000DFF2B06E4A9DC82FD10B27FA +16775E13913364DA3020F7CDF748CFCEBB7117CC4251031F6795F4289C4A63088E985927 +B971471069135C4DC3BE1FC3912B02F933F26F72297FCBA9F21820493FB49A1A862991E6 +948A274C9C5954AA6BA752D4B4096C953E92D916369F9AD0DA5055521E3420ACAA45D436 +6D061135613BD328630FEDA1634FFCD8E2F23097218C2449520D986694B882081A791CB1 +78925494D19A7EC770AABFB956E69DAFCA7C72698AEB9DA304765F3D9E351022F02B0C37 +9E8897E597144B416A008212A0780DDFB9FC1D89063A05D216AFED272F8836E5356A8BCA +818D7F491044995DBB9574BFA5B9E346409B9C4F768B59F654E9D607F3D5A078F1F5C0DA +6EAA9123F369B3341B40BCBEF1EFD9D56DD82A15B550E105F03100B18C7647702879FE4C +7D61243D5688B2979BF250CB1E594B1A2B9212EB957DBD3D41C0029A06C9BBC302F6E969 +4E998A090296411D7871E35D9B367C1191A3F9A638BDE0784508A7B4475F768C24BCAB2B +AB375DA779894022D09EFC62788289D9E72B74F7C52F2AB389038D4BDD244E1CC79B01DF +79E905BF50CFF6A5C06E68FD894BB1CB7E513B33F34400DC38EF8EF6E39268635F66CF70 +D5EF4EBE5D4F36430233785252376CE73CC9E6F83BEF01F6D1C5AAECB6848CA50996581D +E069F69083ACF3090F29844580712073716A36392BB2FC1049EAA0E114976B098A344B66 +E0CCBDCE847B2D3B620DFFEF1ED2FC8FEB76D1766F76F3855F2C2DE7CF10F4DD4664B006 +2262CA279472C2FC0882A8F0B5A4DAE04D4293FA7E08D7639B3D7FCAEA1124A261BEA0C7 +560C6C52E61802C8502C66D4896EB0D8964E0ADE75283048DD0A1E243690D989A49FF16B +33740C7A49B820032167807CF695F91C55C0BA6D6AE7FC7368885C674B8BF30931870677 +03A60AD58F42F6766DBE60A74B2C2E7CBCE56EE68DD0D269FDF5765AA414157BC63F5CB9 +123E0532224DEDFEA2E668F3875AE4C5260F93398EF86BD5867E0E18B497FD85C4FF4A4A +3AADF54256544BCD7811B58134BFC41026132D8D30BF6903C2940157AF0568C9B6BB3009 +7577212F65BDEF06FF06760E38BD32AF61BCFA7E2324D68AB590F2E45A9761124928F6C5 +64BDDB6B51180CBF141F48EF9FF6DAAAFF2E379A2CCE80EC839A2EDB91827F9D1BA0AE40 +FD36DBA0E8ABCE564309F7DDAD96A5C7D87212F8D586F013ED189D6850322E4670CE2D07 +18CB688DAFCF1961FB0F4AFDA71382DE9CD976FC29B4CEBADDF073774D9B8AE9F2374C04 +F704860ACB17F8A16B4051EDBDA362CED1BE1BFD0700524188278DC8D6B22E0D585F26A7 +C4447076AE0998A76AECEB8454959F30BF5A4BEF1495D6549392AE39D97388B5AB14612A +D6472A6B625134E17B540AC0D514C1239ECCAE5C75C9F7ECFDDDF66320D00052D874E6AB +792FB1CF5F37BE8F34A14CFAF642917406C3C519EF56C92114E706BCA38731B52D68B9E1 +61BDADBD17A62D1074CBED9FC77F5558CD4970878E0349536745C3DDC0E6BB4CE878B2DF +361B4DCDC5FDEBE160168F4D0DC81436B008714A2EA3BB569961F07BCDAE095A44F578AE +6D0E6B5DC7CDD38FCC37177DF292411C89B4B64612C82029570C5A7B9B55F38E063BD3FD +E00421B42FA18751B624D59495604A52A0DE27FEBBF7689E0DEA085841050DEFB7C9FA52 +D3515731A1BD61D4BF5E82841B221EF88D921E1EFF65F731948CA481E500A46E84487BE4 +E3F9DAC68918F117B77A2B5B68181C914FB764CC5876D2A42CFE47F045F72E5E443B4921 +D0D63323C748984F622F00F63C886F404C671119FEC90A598084F85B4866A5C79E987C5D +BE5458A2A0FBCE0BA6ECB7433F9D75142DE04FBA357042FA9793BC9803E78E573A14E140 +BAE5E044DFB28D9BF672461BB3A3E50E1BFC83EDFC49A962DEA01047208F49C4CEC837A9 +D2318E35301D2B18DF1E8D828B58FCE8D5F1450E4CCF92BE5CA2B30516A4E585D6C83BF2 +80C7442A4F942584BCAF4C2CB5C2F56170817BF0535EBA87C75BDAA0190710A7E2D4029E +CC54559EE6424E26F0FF8E1C2D3D012B3FAC397B1A446918F1D299A19B7A28C4D7F146F0 +CA4E29B96D275B54C16B1AC37FAF498462C7BA8D2C11291175FD05A5B3E08290EED58ACF +680DB2202F229D7A69F982E644285FD1FAF320A0C88E35BEC245D249AFBCF6CAD552423B +EA2AB070F314FB9B3EE02ACDE1FFA602D19E1805F27D1AFCD58D6D227EA765E6630149C9 +59ABDC3067CC97A797C555FDC59B9E4DE3B0681898C970609B1B6B15A15A65EEE2DEECE7 +2BEFB1E2C7A2BE2B3FF19B2CCAE4937DA4B593A60FBE0E0DF3925043E677D44B5FF7B42F +73EB65150EC0533B294B675BD7D5CC6A7BB6A4F043FDF87940F8A8CD366BFC008273CDE7 +72EC15D7367371283EE5BC26CD6D46CE665661E16C691727CAB0833942367DE588BBF434 +06F4DD67988AD1C0D5C3D24DA8A833021F65E4E4393959434E03CCBBCC98699A8B1550E9 +C3192D3D3755F81C51E6CCF4C4E6575D9D4EA77261B987C8FC8CF67035D281D76041F70C +2B2FDC8FCD2719A93FBEEEDF54685031ED2E960D2CCF2B5DB0840B2554B1723A703C41CA +1E6169F96A1050CBA7A1554FF8A6D7E4BAB0B549664DB9B808FE7C5EA9ABA7B071E71125 +54D021BFF7345D1295333E876E28E14F2274CA0E5E4F3838B775890CC30909661D5B86CC +4F681967BC8B5B9169C6D8F1B30ACB914E1140C6A5AC5B6855EE83BF9F8C5AC875D93BA4 +1C62B9D44917BD3B46F65B23FA3044FE5A6F812DF1E77139253576ABA80A57B38D315E82 +CE42DBB3BEFA62E400A194B5F59DCBFE915D3B5DC010B4DB140127BBF0195434F5A43957 +881974EAA69CCEB2E588DA124EC3F7CD00F6BB81AC494088F061065C204A851B8890A5F4 +EBE9D680DEC34FC853FBC85E20E3D9DDA86549FE11396BE73B2978AA8A4C80BA94788D8E +D03D48C88C9E047CAB868D7DB3837EFD41267AFDF4808944506ED385295788CFBCBD89A9 +8DD84168F808E49BD346874FB281AC70FB138E100D914093C582E7C85F5EB6243A941DF8 +253B06BD01E8F75C693123BC20D17307B8E8839CDC5CD180FBBFAFFF702E0E9F6077237C +F81EBE9737C296BD5180F40EB79A41BDEB37FB0FCBE238F1B86F45D8F25B39FD7DD4DE88 +4F1D9659A27AA3F25CE066D8D84FC09932B8B2D3BC89941CADBA33F7AA87ADC13453C674 +E8AF9CF633ACC730085EC2A843949B9E5BED6AC3ACAEE21D620495A0DC04260AE555D15B +59143C29566D3331B26DD93469C682409BE8D37BC93424E115F7DCDC95EECD57953BBD28 +974F249FC98A73A384260A0568A69B382886A9AB09B6215E463319F8736865F700134E65 +1D78B9C819501DC01CE5C55A2D58F12D74988AF124CC6C7E213520C940F6F8CB4CDCA9A9 +DD2B569D06A967208EC37AD2F0BFBA7AB7DFE87AD7A5AF4B6E77E2C8F90C9A97D7EC58FD +2D7ADB97CB6AB5189AB4E5C29A1044887CBF775E09348A2FF946E9D7FAB0A13D7405937A +EA98600DF50B8FDB161DF14D091B58E925BF12EF3176F3EC504E1E75FB868CC46146389C +23DBFE0F908356283136F4A2A3AF2C197997302BB3E545907C3295AC0FD06D2069D602DD +052BFBEE41D7C926B303D4C1CB548EC9537A0F5FB5C31899FD160BD9EC390F2E0F6575AA +032A78BFB98714D731B0804898F148ADF072B3E714009932FC8ADB363B18B2B15627D3DB +B20DE94FE90B2CF68F85D7961E9035DE17AA5505254D50704903F28EF414D3CA13077AE5 +A0BEAF8F5E11FEF25C8484A34A1C39FA1E8CE92F42BEB83158BF26EB1944E6213E5B1531 +C7065B2F1449D3D444855727E691A501BE62F659322006FF9A22A5288260A785611791A4 +56E6915D344495E82303F067471E323B888A61ECFCEF90676C5F490A9DD6B6803C5789FC +A7B0B7A1C7EA4BDEF4463CD5304C626E8D714619CBDD4C4EAE61EA1D2386642DD4DC77CF +3351FA6ACEB1ECD55CE4308DFE9A09763EA427021D90972F2B8711A98C246FB448FB3FEB +9887A101F53321CE647B3B9CD077A31915269E6D049E48305F3B2E84351FA7C2394520FA +BD5EC8CDF9EFAA99573B1788E0C77FCA125F590C38939FDE67561BE1EB47575028ED1F4D +27A7094B0500824F6FEF2710FCC5768F506616AEAE73807BE2ED2E0DD4C1A337993C9A62 +C7601418A586D038E886E1E22843C38A9F34845DF71AEC30726E9AD413A84081F1E31A53 +73D5CFDF816D8F6CCD90C2B438BBF715F0EDE86DC31341A0899CC6374C573FCF2AF67A47 +5371828212D9AA17F18FF25801F83D0AE19A4712E24C2C024A7505A2FB269EB3E7DDF59E +7D95DAD916A5D35B7D16A82764DDBB3773CB0C6E3B1F2FDCC0553B26795C348B6C0DBFEA +E7CA7B74D90257D8AF4F9D4F3C776D858CFD230781D2D6F28CEB29BF4EC4D413DB9B47DE +E4B36F6CCE14C09A033D580D573C21B4A45DC172C0EA0DF41A0BD5CCCD6479166B30961E +A2094DF2262D9E81465ED2C66BBF8B28CC4A25CB7C259BEE2C2F0991614D161B25D4635B +C869B8008A2156BA56B48D6220DEBB6713A035003DEAA0160477F5BF7E336E90CCF67155 +0A55B6A015468E8A8FC8050C979178EBE2F7434E11E6A77E2F99A133F81FB87A75F42EC9 +AE9ED23A3DCB35312036CD819952BCA72525A39594C79C52568556C3A90E95C6E789A99B +04348DFF652C9A178C5F88EE957D2D037FBCF584AB699B276AC228DB743B4C4548EB54EC +38F6157163A870C35A4A7861ACC66118FD3EBAF43154C13A4FB8C52AFAF5F7FC67571D85 +F994E66BA3E8ADE5973138F61AFAC440C1EAD910FF8F79B11B73C697FF7D921266E48D51 +DA2FD0B438CCE7BFC1A1233FB8B5D812D8E18846B6401E9CB3A33C514693F19CC21A2500 +FCB0B0EF63EA74441BE9BB70477A63A641B639C54F93F4D4BB8E76D0E6F49D134FEC890A +B6E118D754ECDB3FBAD7FD4493AD9415ED13C05A0FFD949F3363CD400C5E2B547F1CD6FF +E503F2F4620579B69415F4BC356F943868F198B4243D250992B83BEBA3F07930F0F93366 +72AE171AD02B20606532EAA8F819AC8968430201EFF0FE42E8CAB1A10431FF0353827919 +847B2B20B0B60241ACD440C8917B4D0723D44A5FDBA7681E9541AB784B1A109473D3AAF2 +C035C27419CE30E5EE3C62F0EA884E4D4F164776DFF12D212629EA3AB2B103F000BE0A92 +298F4D73B79AF1929DF56280BAC6F03ED3F9DCFEF4B138F88758E14D4E90C95DBD9FFC40 +173E6F795689C812D24BB1791879326ABD3CD7FD2985FA950B73099AE1B86959E46C4709 +1278D31A41B159811140598A24861E34F2BF09ECE88BC36747DDD892AE3918C41A961D35 +28D8A8649E626FCDC9551E073855DBC34B57F6D198831CC189FE1C452FCAF8980998D621 +F31D2B9C7794DDC8B32FF3F8BE6934B03CE603020E7A37B51DB4E1FC33F625A8983B95C1 +853A1B1B4D4F4942562DB9A0FFAD4AD95A977DE81139687123317B757CE75ECDC8287609 +6D7797D50287BE38960290831474ACCE3F57676811A5DCEC78E91488C53167DA013E3797 +A9A8C05968C8888B2A55EF2032D66F6174B61CD24D0C62BC49250AE6D9B505371CB15160 +C591809EE7551D40D3CBF88D33F8A3A9412E6221D9E656D22083980999E405957E9D5A36 +64EF1F676EAAF5FA309D23C56C95541E7E51958358B436DC4CA542DF18398AB8E4D05FD2 +D24BC091DDD9F4F963A20791D88703056B5AAB84655B3739821EB288F1A1182F67154973 +AEE39C7E8CA894130CB0A9A811A1DE595BF12D04EA825F2A11A365CD1CA85D7C7F2DE801 +985F64094A9D168AE1F9CF287CE99031D0A1742DC08698572926219E0965501497C9D355 +6E9E32D23BD070BBBE905C512C864DCB8BD9E8AF46FF4CFDE9D86E8F34DECEDD99E8A745 +E72885340086FC17EBA499548D8C535CFAFB42D202DF4C91BF817BB786E577C7508CF99E +A088D9B070F5A5201D23CD76C9DFF960F0A77EE8CC94FB5CDB8707F8A7420B7FC2AA40D0 +6E04F60C595DD66DD436A4E2BD606121E423E0177B17E73CDC168DDB7806294A1A2DC177 +87C4296B2BB174D55D9255EC44CF850A68DA75BE1B577E8DC80B715876712DF29CBFB81E +80BE970CB01B9F8018C381EE021B57E01FD3A742CA387317883EB3F06FFA93E0473BDF27 +98D77D6B3A962CF9F42D181FB4AFE59DC053F2C059035649A646F22A927A4EFBA9E6D3A0 +2C7762AC72BC6827D49171F1F57C354FEE5E92E96A30156B8484BB3D9FE7A21B59008AB9 +9692940D35EDFC207A14D20D2FE364ED08F54A255D1F434B432F00C67863997266F64862 +D92AF31C3C7961692F6952157C8922AC8C8061E5CE8E4FE5E024C1324140354E9DC3A768 +B2092B0184FC1A46FAE459AFBC0069ED4C2CEE34ED7D756D65A7474B28FE5F56F6E69150 +6EA2272C75943E3CC9CE5FEB2346AA91136F5B306805EC51D6BC12E5D557F1F290E14CC6 +043CA5CD3D0EF095D4E62BF2068072ED630BF1451B8A35DB5783B6496DA31E98129FB96E +02175D288D2854C505E2403AC9AE94145AF6D327270DB865EFF70867894567B87FF7E5D0 +16848740741342E871BBD632ECF7673E1C3ED00255BB34A67D709E16EA1E0BD24F6510CC +C1097402E3994605B5CAD28A48DE6F37787A77488D8C62614F5FC3340E952066B61C9DE5 +1EAE3FBAD5D8B5AC64F8B261BBF06FC677A28EB58F4C8A08A136AF3FE387E24E6B100774 +24D077650EC787BC8498BE6D7A1DB54A690C768825ED63AC24E62E40D5CCB2AD05A2675B +301C895800F08F936C7175F6BB3A5CBB86536D5EF41B111F3EBAD9769324DA1D88C4E835 +223D976FBE5B9DA39161F6F3A7BA02031BC20EE1143E1FA73599CD30CD43F0552510F0A3 +67E8E0963D12B74C429E15BE22C0AAC2717AAF021D437A784CCFA60E8BE2ECBCD962B1BB +EC8CAD0439CDB73131D32363354CB9BBAE21B01A27830971D1D7B842E3145D5A400BAEE3 +76C639A3B5D2AD8D51B75F7FA86465DE401BB13FDE3407A093479B87B0E3B2BDF33E9569 +6501ABCD07786B1ECF72DA8083FA1D79873753B466A0423F1B504236B95C497F39F5D5A0 +0417B3D8AF9721E5F3B5ED2DFE47D9BD0930F4E9234F181CD24394891F7B554766BFEFE3 +CB4533E3D01DD656FBE2C170B82393C0F3BBCE9367C9D5735AF8317450C7F4B163CE95F2 +6F2F7DB25CD88EE9B01716DBF1FFDA7FF16D54EA39841BFD3EDAF3684D2298ED45C8486A +F5014230F331FCFB320D28D5A1A17D02D5593538946C8669B346F4693FADAC663FC608C6 +E091F481E1C39749D26AA37062D7D94115152B214506B91617E829833AE67807905C70A6 +8412293287EEB2286A27DC7D7B9AF75FD4E32DAA4641EFFA2A79A04DA0EFF958F411890C +A50246E5A1F53315ACE19B22C9C14B897272237374BDA4221E3FD18A7D4E26A09DE3D246 +D604FA90092F188E4D2C6C0144E6D49DE9BC8ED4561B9CD8EE8D308EAD97B6150056AC9B +9551CDC472A642A9DA02BAC20EC5B57698D68ABD0ABF1B0FB5231479D72CF429C39DB34E +A75AB17BA21AB31E9DE9E2584C2EEA8BDCA322F0D03291CEFFF011843BD70C43F49551B9 +B10DA24AFC0B79A87B6F493EF73E690A4A705DC8CDE5E2602EC6E99168357A69816EA5A4 +5945A242CC85BF5E7B665DB8276C11483E879A1F9A59E4FC8D6B700519ADD96909BC3EB0 +DDABA0BA75AE8809B6B802FA830E63583622109614A63B928AFE297D434A33BD0A12ED89 +0C15CAD72DBFA7EB5F30B12077EF47A6EC309ED1009141176F7932955588C053DF307C96 +B719564855ACC024859429DCF8DDFB3F7ADE1BD65C9B6A97BF5A56FAE58F41BE9ACC6AAA +B0356F58900CF66FBAB2E2439C031103D8600FCCB20D209DD510DFE90716F654C539D349 +99130FA43BABF53F8AE298F10CB073B797AA50E00FE9F88D9337CAC4DBB0FE101C28283E +6D4DB8FAE80B4A998525F647E7023AC5B9BAC987D5A9233541214BF0DCCE6C524BC1C56A +ED18B4F76F8010AEB8E1024082D22AB60BD9F338AF6228A09E7DFA8438F2ACC066D2CCD8 +853062A5818DA00F1747B6BAB166F40D7639DE8CA985C2808B0010608FC7923C7771F728 +FDAFB1F118E2640C2C42301C465F40817C13E20448F16AC7D42E39FBE359F744C12DC67E +99A4B92D9691E1F6D2096F11FE4F017A4C2B22E4C550DD25E3E31E8531CE8DE879451600 +4C9236E36E8009F5706C8BEE72F007538DA5918999B97C386DD6D62F7B433DD99B74B490 +263C2AA2D059D2DE95CC604A5442116DAE3264568FFE88A9B1E4801052084DC11101EB03 +E514E220E7BA851FDB7B5C8CF635B2496FF38CE6DAA23FEFE02C25B520473E5E07EB9354 +EC2CB7A7A75FEE158D51A7CBE8EC36DFCD038BC52E9FA6483A5F4815C132B2C40544B08D +8C8A80B1916609636C2B53FE27E2B4715852A6F035C139F9EFA33ABBA2550B8CEB8F9C0B +EF80BF543D1745FA88347997D01BEE8A8E2FD52FC40D3BFD3D438FCFA1CC5B4082ADB51A +5EBE54EE1C95DDAF8E5FF6FCC98C3336A292A0FA05CB5B48C122D6A3330898979AAD071A +4BAC19B03B03CBA077252506F8E68EBF004B962BB85B15A87FE5497E8F2E208117834E48 +62EBA7AEFBA9A8997F71142BD6F6550F3BB358738B182A9CDD411159DA92B0B3E49E4226 +627A196036ABEED57F176C72B30AE16C1C01B330577FE8FB0C0F7E09BF821BFB4F056A8C +B52D5797C0FA48A9625292440F76387FFF46837A2445688696830AF32EACB2B6096367EB +A8C8C42341D2F3EB5D5190D9F7241FB1EC16DF0D6D40FABACD1D7E99EEF4AD6118696165 +3354A8DE539F92DD3426A196A7DC33F92B170D57E48AA80902D9F31AC582A4B569D15C86 +A8E6FC94D75970BC6BCDF2C77318B1DBCC7E398B48FAC8D2E392E93CC37F0BE6186DD645 +EB077151C6F58EE8203B697010EFCA123FA904A4EA80388FFD88C126AF7F6656E66B5417 +8134B77DB4E0797C9213483E787939113C39215FB9F5B3B141512D962C500863C2F362C2 +3B73E9AB89571A003E413435A02FA3569228CC6C0D5EDED34373FC7EBDA1200537C1B72E +9FAEC2E74E5E6C3E13CEF1B8F332E7CE6CBDC4A17EB9CC265638AE57E28E34CE99CB44C4 +AF96FE97893390FF2583486F7D8B0B2D9B13A8DC0551E8AB85046C9E4091B6D5D5B193F8 +3EB3E2131A6EC9DCC9DE88F4B64E45AE7B5B6CF10D4F812C9C784BF65FD9E942951AD808 +FC9F010A0F45723593A354E578F8FEB67978485F40620C83EEF210B6678CF323437DDC88 +5436567D76EEF3A83448EA76A3306CDE9D5045FB2BCAC94A7A58B21C0166D5C4339566C4 +203535359326524E7AE47FD406959610B24FE98ACE978A82B5F644B112EF6A289C018244 +85AEF2D0C38178851D0D5A6612C861AB52B46597558EE8E588F95BC8D657B02AADE2AA25 +9BDDA214A736CB417F9564699D293A98C7A7615F47806B5424CD1FB7292AD1F2D7DF6837 +675AD97FDCFA6825F4E22A4C0930299B0CCF9BCC67806E4E6A8EEDF449D96634C19EAA00 +912240EADD63C8FB02A227B987A17964F5C867079495B383FAE560309FABE8BBA46C3F85 +E766A98E5B8A980DF3205AFEB8416B4610E6853409B658DE2A7A3C2C6A292FF33A46D9C0 +E34FABFD57E19C89A8F88D8C4798A96F4C8C3655808FF336C7DB56F52E0C6AC761DC0E0B +39E33065A02A8812D91AD303F3DA2C1D61913C76F1D2DE272503B223ED71DF65A5168433 +A7BB3C3547A7E6A5A190F200992B73151BB9EE0D8D55F9AAB9D2E73677D3AD16D20D553A +D7A7A1668B19F58E7BB9A5CF973A861645016DC2D07A39D5430D6D1644B88035B8575DDA +D2DB0E6C040FAD93BD0B8486715821F2D47814EBC7EACE1A5CB5D3A2E19352EEE008F258 +6192627BD0B3033199DACE43803176F7A19946985CF975DD1BB313DC58DDB80A2671637F +E89D6354DDE8F8825550F1F616DAFCE19CFA095A36BC49B8437C00DB2DFF9B82ED7226A8 +06020769A534706BD6180DDBEDEA953C98D639FBC8130732B42F0C512237F541ECD03603 +8EC9F5BEC45B45F87A324B60E13280A18A2F6F333C34CC254464F774DD53906B7FBC79C1 +CA8CABD58310D272CB49F4B3C83EF616A9743CE5C56BF52B00776EE469A45B18B8457CE9 +DEA7CD6378C87304224B578E213AD3D9E5FF6E642BEFBD59162DF73F0B631C8831132284 +39374839A1DBA4C4B4C4E30B7D411B5247F258F18A8723659A17A52F8194FD810318B32E +19DC9B355C028E98A36545D65073D0F8F4DFF0F9637C6F599C2F883B10FADE5077B49257 +F16D0ABC0DDD9356F6B10FCB64D6B6ED9888E0312B092DC9D154CE76AC14D14DB564EF77 +0EB48216D431D21672D50AA13307610DA45B3AC8FA46EE7F61D0C643E53B65CC659E91A6 +71BF448EF3FAD8D18794B383523AE67CE1903510BBE2B2D5CC5D29F3DAFF71A54E582E22 +420D62CD7CC8A4E093207432EE4FD0FA3B2E72E5E4E62B450C557BFD0A83C540C1FE9E80 +C62D150ACC0CBCE73BE88F13D7E4D9A3791C806B38D12315C043CC022AC8CD3C61331345 +5D19B2036306F132C074043CBFED8F1C1F60C74F074708D3755A6F28628B31C0D8068669 +C8BB86C6412F32C8D6772CFCEA101D1ECC32AEEBDBE423A7DE28BE36D54D61CED5FABCF2 +F0E731800ABB9B10E413129331BC441F80A6617F9A5E551CB4BF74893227C7D9DF21DC11 +6C7E796F8ADEB43D2D223B4647DC5D53E65786C5A0DE8F3CD5BC6662B051291E36D47414 +F94D999AD31C1D6916EB723436B41A72844806C0A8D4BA41A04F1848DF180A3C3E27D8BC +961FC8509CB3D4069B33C5E01F3C0B04D55AF2EC4CFC4DD7EEC9AC9426CC907DC70D9EC4 +E428D30D8B28A27EF202E3788C5D14B0AF13D750EB7A8C5C4E5141AB5A477BD660753B64 +EF5C871681283A0DA5AD98DB70A90D72BFDCA0E18450D3091EFAEBAD23EDECF3F016BCF3 +BFBF286FD52B5D38D3D02E8161F8485D3B9B78C485A196C5CA052DFF546E4CAAAA9F9F8D +925E6F4D842B599E1A482C92F8CC86789F192987C3750771A11076C35415FEA472B29595 +9A437980A15C2136D26C83DA0AD724B1E961251F80B9D751A89A004DBD66C2540F758AE9 +A8D9A87A40CEC4A048AD21AAB511A630EE7C6DB0BFC5516B18140B0FB30CCD128475CF08 +1B10D9E5DED0BE1ED477142BAE698358D9FE9090CF0DE3FFF6692A18E2AEFEE40CF40B0C +AC0CBFAFD61CA62667B8C6AF75F2C8C610189522E5C334C3EE4C5949629430D193846DB1 +3F2F49284722C3D93FA7553DB263182610D960D1154CE3E72E93D477003E26405DF8457E +919785328FD7A0EC5E75FEA4A69A4B83A0B1BF8A257C95DB99ACE02E4E1AB1C7381F70EE +AFF4424E5DBC89F8744C31CEF9E39CBE52AE7B222C3003ECE5CDB70CBC5705BF14A8DD96 +858B2D91BCD9048CF5499B557B47EC7EAD4F691D9C0ACB5AD0EDD67F18D0C60BCC5B26ED +977B54870AD334A5BC6FE43C10EFC67449DD1EE7E447AAEA62CBBD3708A5C53B50D9A422 +D90DED5D2DE9496DCBA55431336DD959C87DB3C827D74142F295A7FA2AFF3FF16B6B3A19 +1947BEB998BFBA0058C8A0C851E677368674FE190B2498042A1091F5DE30DF16380DD89D +0F8D076F0AEA1FC15F065FB5F094FD7DCB9BEA369B473A796441BB35C3F7D083CDBA9263 +3AECE8EE5EA3A475C84552463F714F38F73B83ACD3DC7FDC9731E55C25735B62EC439FD7 +421236A8ABF2E15F572D93F863CABB5104F2F71C5CD8360ED6A16F0EA6E20965EFFFAB3B +9AE5935C206A074C7C3A21F8B50E6E19950DC462F06515B3271974877B0C33B7D2F735C1 +06597443E2C5421CAE134AF0E035786DE9969914E2F0B8982F9496D64DBFE6DDD678B875 +9825EA82937D32C5D3DF19C9F35700C733C65D3AE498C2039D41BBDE6CE9D975E753A022 +67E5354D1739005A656DEA77ECEEAD9D8C3B85512D8BF6B1B5ABD84B6D05CAF87B254ACC +3F650BEA548DC6EF6B1467BEA6E424945B7A6656F5DBC695D3E5434E0B88E5BE68B5BDEA +9F91337F7A74A5E7AECF9EC30AA070AC66E8B1D8AA70408B0F11683BBDE539EE5DBF9D32 +9B1A1C8CC14407B0FD0BC4E282D2BB466E3CFCB7E2E375A0DD49FEC7A0ED1CB15EBCF2E7 +F96F1094AA840E618E69EC295ACE5999BE90F77C523822EF0C15585CD816D7918D2AB0DB +65CB72F1AB5CE5625C75B493E801D7A0DEE575BCF53E4F0BAA2290275470C5F6B49BCF03 +E4E8E31CE64D3A6A6C42ECE25B6BE2D2D8D8A821C4C727806944639CB4DC84777A2CE101 +8CE5EE0470D863ACDBA2B69B48EC7EBB23BC73760396F13BF6A60BB6D664D7B553C2AE9F +32EE16F06A114A3BC7289747FC6D85BA0332D23EC947B25D6C10750A83027A745C1737AF +E9BBDB080BEE663646BE3894B184F9B892CA8EF2B3AC255DD53388D87859F9EAF8BC82CD +B12EE266A079F78EA317C41C505CDFA41B1CDD8A63B884DE1EEFDA7B7DB1EF77D0E98742 +79C50B55DA61FF95BFA7076ADF6BD3586E2120666BBCC3E431CBB19963982E50B9B1F375 +55AD6DA4AB02B305E074972C7961D66C1D1327AB93813F7A7C6C860A81281795033C8AD2 +8FD44E1AF0668D8ED469DC184B612DAFC1529F3AE5D8420B703821A559D58D5C574C15F4 +9C6CB20FCA5AF432FAF63E73F23638129D3E80509C0BE0034458DDE29F5C88807FE1C90E +5BAC2CFD565D686945583260334165D27B08EF3C7839396EE421686BBFF67996E5FC31F7 +C4C96155412C4E51D5B6C97F6C47AE74BE984B347222CAD8B76EF218F34CB3BDCDBFF446 +C8E52F3E2A121903E260C844B093439194BD3078E158273B28A7674F0528C9306CD09C1F +8D612881D46B8D4AA4C33206EEF23F0DF150AB91D4EF3A55120E3CABF490A2FDC34F85DE +0B4C3E712D3DE425B3B0B5053CCF7729D8FF20207EE09D7ECA11A2685FD4AAE6275B9C0A +E26543A3F0C826FBAB318690FCB471623009FC751E656D31538951000A413132B4C95E2A +75C56BAD12A492F5F44C14016CE7751831A892BAF050422E459E71A614409DFF87BEAF8E +9D61471C279C9B2981C3A1D119678516111B965A060822114F9CDA77DF46059D434C6A0D +D4E57EACFDB4560FD29807C7160051BB778CDD807B3602F6CA02F699E8A42C7A6143B149 +2E78C8796116ACC803B5CEB308B9F8E9F11DCE649719618A9EF689919605EE6FA001E178 +4A008D1D5AA354777566B4F5D496ED915709E2FB39688745DFCC3AEB5D520B77C8066429 +6C67D95C50FB86B9DFBEBA2AD8234EA2C967A02B72DFA5BEA5BEB8DB4A30428FAC98FB5E +6FBECB93EABA637684F4A82447EC00D422DB058D521299658F7D392FC1B0130A9B995477 +7FC2011549660457BA46B01E4D7AD51D1829BBD0C80576E893816FF1355C006FD22876AE +654B0D851931E1BF3E80090B762846ADC7EFE333D7C6D529D6B50FA87347EB35438B18B6 +DAB4B45CD3202370F744013D15C01AF637A755734706E667AFF3A498F437465B45255BFE +C519F8BF9FC37A61707A8D70F26AC6C90C73AC9CBE1A2C7F9D607BFDC999B784C7D15BAD +C0CED80AEE87A20D3CD2C57834020350B4310B17E62B192D376EF6947C8EE477331DEA66 +CCF090F1787B19397BD8129449C47D5E03EEF8D4B8238105D626115DAE76062AB6A01E4A +874EE181607F505FAEB9F8743CC79A0C674B8E5BD9EB8D02A5653C8AD1E6CD5FCBE83D12 +A64399F646860E564F1E118C5F18ED59BE775F93A3CDD8F1D4630A48A43C0F2AC8DA9A45 +7562CC56B57A802A3F8543BED0A96363529DD39675BFF7DF6F532D190BFD5C6B8AB3988D +6D375A117DA0C00AA1C9AB60C5023D52793CAF943B7318DB12377D962E53DB536BE2A1B3 +0199D481CB100B3DFC30F3D01EC4EB8C9CA7CE497440C54A12F1EFA9B50ECF7C6AC073F5 +12AC731C94BD7C24209A1BD1340DD6CA5C787E42DC97E23B125B786D4AA2B149D05EA6AA +891AE6BA361D1A42665E123EFABCCE667BD894ED319B8CA398EB6A5E213F813FCC912F54 +205D51716450E1744CB2A5A8612EBDE46F35257AAE6D3AEC55D65E07C50736AB52295D2F +5FF8D43AF818B05071354B5A462DCA72E6A5E482A807802A1DC14132E50425E75C6CB612 +F558228B7659A6CC4F2BEE307FFA31A861D88C994C650DD0F1845A26EF0B8D975B9E2120 +D6C669DE20802B62F23867D708EE1FF1EA35CCD53F5CAEB8EDA12E12A58E9F90D150A692 +194564E1DBB173B1B3AE5795460A5D1204F1C02A960659A0C0063A7D5E7497A581B0972B +B235C90F7D2F89D6F1279AC5A0A15DCDC5B1391F5E5C94AA03320AFB4895AC4F31F28C29 +3D9F6790243F7070E0AE21864C7A42129AC0EEADAD9D11CD447C307ED64DB0BB41BC3BDE +C9EDA6638EFDBA140CA92B7AD459482B2F573E29B03381A23176CEC332BBD7219231554D +C5FE2C2C56676A137945671D5F55E080EF0306681C44B994A5FEB444A672512C424991FE +6D8D33D099D464B44C8365D37CCF13792CD726375A5DA9CFFB56A5628FD564DCC124D2DC +4FC1E2AC8C0CD8DBA8E27138B3B5DBF786AFF59096E52C999D6A26C5637F277FFEEF34F1 +841A3420594149463AF075107E62315AA0B2D78CCF9A72D1EB9CFD1E7900B0CF877BE2F1 +C7A0B60A1D995F2C5C37F7EDCD09998E7B7E3E2A2C90D4AF8F9DB1ED529B9C3DFA0531A4 +9359BD1C4BF3B82A095562D38C7F15C3FDAF09BC39B670A529B9B7EDA1683D2410856031 +5737EAEAD181EB46EC51BAB3FE026E532E65F7E76A368C7100DD7AE43F881B45DE624CAB +E5AEE7D7EAE8CE12230A0336A098760C71E0003321B6F512527AA59726B249BA92A18C1F +1508D2E3881C1E004B830F9F24A706153F4B4565AB16978D608184FE0FCF816F567911F0 +9BFB10C7FCFE2CDE6ABC0C83657809FB8BE214E5570ACA4CB31226DF4F590BC37EAC8226 +DDFD5DF293A15CEDA79699E59CE459F1BFC0B08DA76C1234F996BF4B2B345A18B1AEBC38 +C04218864D6A7ED071173DB25DC27B8FA8A6DA897D83085CDDD24B3F3F1CF936C74B61F8 +020620AA9114411700938AB9E9269C13F97723E29E86EB5F14D1E86D15E8C8D678EC3CFF +DA4577F97BE67A8D3F60F56CDF929524E00A400C35BF46F64134324791FCD6DFB72DA7E7 +8B7EAF388F8D3C860E8E295867BD9032E74239F627DC645D0F2E99C6F56E3DD919447CE5 +CD3126F491688A53F54FACAAE5A14C796CD964F693C8556103BF132E93E2D9816282CD3F +32B84CA3798DD4675F6CC06E0A26C443E8CC9AC465E57DBBEE15BB206798C8ABAE8BF0F5 +DF4F029FAD45DD95671892AA63338E63779E321AC933FA3FFC368412BD62387E45BF0808 +7C3594EA7E6628BF2921F2AD33C4A7AB22DD7EE3272150D07ED085C5EEF85F5CF78FC9B1 +468D9698273BCBF896DA6CD43E088F7AF97AD83BF300817D35F93D74FF285EB6ECB223C3 +9368103876A36B5D84C099136868530F1DCDA96B56560E6B0B18D2C66C7FED082850CA25 +E7947934A1B66176B5C332CB1DA71B6D49754A06873F8C37C2C64A16442F0D983F6B989D +8153F027A9C8FED72FBB1C2A7A56361BE460D85338E47D0DD878336B040E685C48993D7F +B6B12CEA753190E47BDE31F458FC098A286EE4EF94A0804EEF0324F92643B4EB5FF1767F +9D0A99B59B1CEAA7FCB5CF1AE8B5E70E3949B085287554E8BB456CBA6EAC53040C589860 +195605D082EBF7E46BC4A7D2284C6518D8F49D524712B15981CBEE064FF6BFAA6BE46386 +BB84F6C20D8D0EC6A18A6B74C30A4BCB0F2B81F100A6E78DC4EBA3E6B9788F424467BCCF +FD6C58F5DA79A9691CB6D74DCD537AA085D385318AD6EC7C2F04567BF97EC15A73E963F5 +37CE3F70338D0E3994E0C9412702FD7BAEEE2E7A35A65E57FECD397D3EE54C863E641E6E +AC90E91A8C0F00D839B5ED9D9B2D7D78088907ED499480BB50EB9EC1FC3608A8FC1A20D6 +0C1F86BB28318444201E7E9F0D812D71B125B467BFBACBEFE734A7635786A7AB03AECF40 +AC5A6262239EF8E0F538231D2ECCC1720CD40D56CDAF38AFC197BDB28AFC98F57FC9588A +F65EE7268ECB44AEC3F5DA1453F0B4021BDB7D7829043C2B1D55BDDCF4687FF7D5092824 +30AC8A512FCD528156758D24318A9CF77678F040D05FA800B1910B33B7E12213008CCE3D +B9A5E90F708B26AD23F82CF3088D030B0559A6598FCEA3392073693C64AD3BFEFF0A05C1 +C9BBADB073A756AF42D91F8D88F0839E32C317319AB514A6A24CED9082F6473E2B983EEA +6724C8D82ED94A9A2BC4F375DFD2C84CCF06F9EBEFC67D357441CD976F0CBAA0C8BC2DED +B2AD5B5CC894AA880A164B68E2F5031566D8785EB72CB183F23AABFED617A6A9B08F4B8A +203D029CC05C13537C2FD2C98FF701CBB7FCDCFFF2DD7C1B152D68FD70E9F15ABB7634A4 +CC1DD8BA1F5EE887060F223B792F7D204A338B8A3526841D45D872DF6DC3A9073E4A828F +B70D993043F881AA83A543EB448B726197AEAC9A78CD6456035E5DCACA540D559601B595 +580EAAB91811B756A069A6EBCB887120F245D9CC70C730BF1F7990D119BA7CB75B5278D9 +045BCACF83947457578586A93E32B03E95942B3C036A21DAF4C6F0C5852EB71499C3B9FD +EDF36F528E9A0124992798C4BCED2711E4A2BEDA7A7FEA0652962B4448818A141E81BDF1 +2F11F423BF5675CF46B506DBC8FF2C4695FD27FEC069DF0A43B7136791E0A3782FC4C296 +9E06336C4F6109809F6ED605A56D1330046925FB5F62032E0E4E2C3FED27427C8B766C2D +26738A0AC701E7FD89EA4C9136E5F82306DB83E2E9C2B0CFADCE967B2A8EBCEBD67544A1 +89614D6B61E9C77AA77E3E739C03D593E00B07EA925F6321FF5B8F3C0FDBC3948C6D649D +96529559EDDFF57ECA28B2C0FE35D90D010C10E6E1B826CA23415E17ED863ED5715E7B4C +075F0E1806E51DB91E55AC8B64DB7731E8A33C1E8F5C8FBE17309859E5DCB58D10D3F658 +05923AFEC306B4359EC6A6E8F9DE3500799B7C7B322204AE472ABC69EFC886C11DE790E3 +603304713B3312C9CFC76ED0E421E2A034CED3E88D53A8D80A3F28F2CCB9E3358B152EF4 +421447CAB89C002C355274B50ADBA185A44A746FA19D7D481F7CB902E73E4AD2A74A1CE6 +3D9978AC3BD8B0DFD03E09425481F63EE2CDAB4AE17CD75A3AB05F9246B3DDC3E0AF1D9E +CBB521D540C01CC26CA6F3AA5BB49C804D312BA93E92CF11F6BBAC18A0EF051C52C41191 +8C01263AB5901221AE0F1BA6C924B8F937B49985E6D5C17B54E39E649E6D023F0AA42BC1 +D75A384B05519BB0E4118DEB70D272542D60E64957B749BB76016A1D356C681227228948 +5D89E1CD945BF9DCB49A5B831C082755540A032087A2ED82D166E292303CB1180C49E739 +5E403D0C5E6931ED6E36B52FAFE37CDAE28183F15C8AFE3DCCFD9A48A4BC21669E4D3667 +0DF71C4E6087F5B3ED2FA7AE8B5AAEF2A27F063332527B09D712CA18521744D89F90E9D1 +3BCD7EB332AD7BA8055BB8A859C4C16591FC3CE1474E260A74E3160DE648F815383B0310 +DB2FB9A4587FE13A4E909A83594584CFD382F05EAF8654DF5B44E39496290A7EABC36381 +8978F6C05B5EB3838572EB0C64C1D81E9AA0906FCD84E62B68E2D3BA876D536E7794067C +9C2370FF2E2E46004062B260CBFC29CB5FA0219C2EC6C8AB8CC4418ED8FDDE6747F8EFA1 +76A6C6D1276845AEC38B41EAB3727BBA0462E2E809D76E0B5BCAC08FED585BA6E5D8D0AA +3A36FEE108F55C23879B62C0A425F176E3C8C9031BD8B3E1B6C3D8DC383FDE0E36B33901 +50296F6869A4FC7E095517136B547295D1DEBFA341EBAEF34A179B070EEB60AA91839D97 +AA51768827E4A1CD55C5303D1D99341537B13FACB6F490072D8139BBB060FA1A02C93D3E +08888E313859B439AF27A3E5E7709BDA43F851D13AB5B2EF395A931A99D0A2FD8C6088FB +33D318D8EE1F7C7EE2D2199A638E3858EEA06B3A167F69FA5AABEE4558773A75610E7E30 +F3062576A2A7FD3E9F08FDAE5F1931A7FAEF85496071AF8E16AEE74C0A756927E0720708 +7846DF0F9A7C5444D007729FB69042683DFD7DB0078199812F85FC9DFF1E45C77C104F91 +37787E3867D5AC37FD7E86D52AC67672D89F04782F980EE918C6152DFE7657C6798557CD +ABC854E81C980DE5AAD8E0BC259247F73B92572973D482BA7E4F619F50B0DC247ADD0997 +CE4E98A71E4A041F46CE605D32AD047D2E4260033C3FBF80525396507815EEF46960A904 +1B83CF32AFF7712BE97D636B4162190F2D13CACEC58BB25E89496122D23CFA6676E790CC +29F48483788C724531BB3EDBD557950162907B68541B51ED6DD74C06C2BFD5346CC819CC +8CD654F17C9E798168C90DDEEE78B6AE37709D35923AAC0EF066146D93C8179832E1A7F0 +44C4637E560853D227D3A14EA62E2428567E0CEBCAA3C43B0977DA30251BCB74E445E981 +6521CF8F1955A9BF920121E4FFD1E022FF42581269DAEEE779282512DD46BDA9F7BCCFEA +77886D52E0B6A9C64A37AE0564DD09B4868BD1C6860FBFBA2FF022C291AAF670DB7AC717 +D82F709B07DABA0158FA67C0BC0DE958FDA1A63ABD29864C005FFA7FDCF73AFFA597D16D +51A1E16FED7C1E8DB6972353AE498A9F1B0AC3B778675312C7F01A7533E1A53F31964A3D +372A140EAACBBF7EEF600F69D8C466905CC21CFD1D1EB70B2469788BCF405ED84412A5AD +04AE871A79DEE0797426510EA8F790993002857BF2BD33963EC10B329A596226AAD8745E +EEC9A84BDF4793293D941756C6A582D273467EE704A878C40A1F8E6F4130DBEE6E484582 +4B78AEA786EEDF2E119F0D563C969A64B29F13327C52D03A16CD690341B2E0CA3B622F15 +ECC91DE30A47C82390F5EC38D3A52C24D3F4ED18E8733C1635C25854F05C394686913404 +E6A11B597213B0D506EC7EF6B9A6F4755B5A71099AD0FC9FF11244D70A5B987603F59AC2 +A01F251D9CC39F24FB322ED3FE0A0014A412D7C9A94088C8C2FC99657219FC27B299FBC5 +4E08F729AA6C013BB76CD320B23DDE9D9D9B78A34E6424BA1EB1C95B5005A53F90D3A2FC +DED3AB361A9388D2EE3FF47F4F9BFB29A1375351FDA929DE5A89346D7BDE86588EA5F95C +CD052B256653437D4B9F98F82A4E9D860B9E6CF4616E80E743936059A3ECEE59298A2CA7 +D83610215D893D065D73A0079E6BA899593C2D46866E980DC125DDA38519F181E20B026F +86B1CC7ED4C00C954146B530CAA58C3C52BE08BCD25DE61A6D7F8BF7C7D1E325C4D2D610 +169CCA13C7AFFA18DD3907C06A0FFCC09C7033B9B721871E31E4A25DFF7FC74899E1886D +8F3BD163AD7C34FB6A948C0FF667D97C8E918D8E663490CC7BB6AAF3689689725C07569B +D17661CB0990AF49011A3C324CA124C4CF555C021041B7D301FAB7D36518B34771E424AD +B62E962D8B2C46863DB108E1316AC529A404741DCB27DF4A081965B96ECB7C4564550BE7 +78629AD19568AB733BA2A1599F585BF5132B5B5E59F51BCF1C284AC371799C898950667B +44E71E5FC7E221C927DA70742469E3BFC1813CF5EAE32F109A87BB258438A6B744D3D642 +5B3C42DC2C542A8382C3B7BE8A5C43DE7E4A123D4130D3ABF3E95568DE13C5A5421352A3 +5A083A98EE09EB0EC99C0C33EC688D2573E9969AE74329D3D6E925C568A5BE0811C333C3 +372551F2A32BD9E0FCE86D3D2E83379BD55634101F863DE3407564E3A1A73D8572341037 +A6E3AAFA61F7ACCAD510F7C17261408E8BCF0AA72436BCF21F69EF6D3128CDFF321A54BA +3014DBB6E3354197EA88BD4AB5EF052589E3635601EE76508DADC4E2DDD9B9710CD11963 +B8B611C5D089CF34D6DB9E94FA9696EBDFE31DA2AC089FB93B8F5CB31C301607F29494E7 +490278F0E378BFD712EA4AA99234E3205D0F4E0F0705F352B62574B884E571183CF1D44F +C911A617AA1F23AC0BBE3E088A84D04AC51349E3E92ED227268DCB4DDA76B2DE3B473331 +91087C2A70BC8B0554C3F21D5B5A303F6FD58CD4343F0EB68087715D0086C3938DFF43E6 +92F01DB8319C4C2DB1E2D0B41117431086D4C51B010420F52C94C4B2040FA0FF2ACC4A23 +8C44EDE007896F73FD591E491C9359598F5786978E481141D70BD1FF759CE62EDE7648C2 +9E1C59FA4F7F61A2ED8ADF9E4654F1BF161D7E19FD0CA8307993F2FCDB726E4C92412D6C +F260767375AD211B46CDF539D66B2CAD7410FEF73A289812B6DFE69F6E6F24A3E66653E6 +C1BC17BA415FDA7E4FD466433CF5AE80827D928EE9A2B4FFE178E37B01E8AF99A8A26490 +0AB2637E25B3B5F4CD857E7CDC2F589CCF52D546F217D9B48C894E11F57BCFD6B6CC54A9 +B2242A8A39FEC8578F3F7D9B726F977F78103E4C2429A3C9B96372F3622D7C6FAD2C660C +FC73A3BB8539853BB061AB6F1EF3E6447983CCC1131276693F0BC5C2938DDE7864776E92 +8C2AF847D27FACFB07656A2DCDA533FF094927D920E227E9618A47E949E20A61D97412BF +273AFB50BF67F54190D982231FEFD98ABB2676E59E106F5E3945BB9739A87DB7E0091FCE +97F86052A8C9E9A49753E66CC322C3051FA489096E2FA9C2E5DF52E439EED2B9D1A8D918 +E19A9C8F97FDC6B9A8982A1AFFAAC4E50899661D2BF6EE5EA6F1FF825114A1B3316BEC52 +EC64416C7161B920D7DE9C339DE346A2BE6792F82CBCFCE4FEE70F04DAAFE5FD13778B1E +D7F5F6BBC097FDCADD6808536570ACCCF31DEBCAAE581CE6D4C6364E58665C530026FD50 +1FC1B1414B0371D2BE2675E304B041C7E635DC98DEE3F1811EB0995FB3167480F31C8F8D +85E3B5F1054AB5B5721B7E8C3FFAFC18F50C8EB58A5CA56DDDF3FFBACE09BDCB27852DDE +9A1DB9A9C4A51092D145A41E07981235051BC56F9319F03FD37B28388FF4AD8007F98B67 +C7E8FA79B54EB9F249A0A383F7AB987B6EDF5508069528D49FA26659AF0203E73A13AD7B +3F64D294AFF49E42A76D493AEE50B099E049F8750AE058C2863FA2F4EF9EB18F6D2C11B5 +906194F7B480DBE6FE3D6610BD08AEE0078BBA1411B26DDF14B16A3DAEC2B18B29EDD557 +645FF36507654C2A86B7B2D18C5F886E8F02FA3092D35D4802AE25A6CDF17C469E85F67B +1964A75CF22A241F2580875F639ED480E7AAA04620C6C58B5C839F0B659D9D2AB6EE6E0C +80EEA564E9CF0F9F7F0E70410426047F0EE92451C92C483AE8F456FD95E21C7549392C5E +41018826DB42CE4709FEE1A86F6CF18A0DF73A96F8147AD819E5639F95E6CA508B9CD05F +D0BBCD49AA42A09A168987B7D8747E4D3CAFC699DC40EABBF633E2B6339A824058BDD026 +180BB7BBE9937EC7B87E853DE8308BEBA2D7B1156E0524DB6D983B9EA396B3BCB9A6E425 +8C55325437EFEC9AA659E57B07B838576B65B10A9B4A77304383D9540200A24ABE5663F7 +29C64D293498F678469024A1F552E508B49B610D3EF334279AE58F4BE914742752E9FE31 +1642DF1310E0E54CABB5CFF9CBC0A9FD8C81AC09D7762D9A989C2ECE1B24CED02D991D83 +1E6BBE94F7D981DC75EE82BE1AB6E1021046AB988E5147D3E037E447B1B38834F9FC48A3 +23A734D2DF86BF8313892964B6FD68CB8E4DC0B1EAAE8E85B137E34C22C8F6CF2A5DE4B4 +B914D13FE7C0E3B73AE8A998CD19BA81E3825ADBB97854B7B89C7FFD8E059340566B7348 +36E6FD18BA8B1B60EFD13DB954CF005A501D70673FA63F79FDFFC78571E075E0503A472D +A3AAADEE2A7EC2710E7E910C9B3866BEF6001C47235AF38A70553649D910DC9195389373 +A87A62E97BD65CCA58128204FAE813DEE989DC1E72D36AA9675A25ECF1B8FB2CA45DF4B0 +23887604842BD3626CC1DB5722382315912FBC9C383275F430A76AC081366D100F40E42B +7A4D3A3CDEC8C47E8C56C696A756EF3EC9B47CB9570EABDDD906EECC8F754C92B174562F +118BE4FF9E0E84E15BBE5323267155546449138A613D2767AD28F188442F1FD558F1D09D +2C296FEB0FD94EDFD259F9C0E11F255FA4C39DA709FF2AC75FC4259BAD43DD8B27127F04 +049683A5A26A38E27654DDFD99247AC366003DF016EFCF2D96C6B2F9858F21BCA07EB0ED +516C2BC8EE39B0C568FB5FD8886B21632AC942E7E02C7BB24E007A08E8F628D74EE676D6 + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if diff --git a/fonts/Monospace-Bold b/fonts/Monospace-Bold new file mode 100644 index 0000000..5474cd6 --- /dev/null +++ b/fonts/Monospace-Bold @@ -0,0 +1,2354 @@ +%!PS-AdobeFont-1.0: Monospace-Bold 1.15 +%%DocumentSuppliedResources: font Monospace-Bold +%%Title: Monospace-Bold +%Version: 1.15 +%%CreationDate: Thu Oct 27 10:50:21 2005 +%%Creator: mike +%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%Copyright: DejaVu changes are in public domain + +% Generated by FontForge 20051018 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/Monospace-Bold known{/Monospace-Bold findfont dup/UniqueID known{dup +/UniqueID get 4234665 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def +/FontName /Monospace-Bold def +/FontBBox {-141 -1034 1457 2154 }readonly def +/UniqueID 4234665 def +/PaintType 0 def +/FontInfo 11 dict dup begin + /version (1.15) readonly def + /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def +% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +% DejaVu changes are in public domain + /FullName (Monospace Bold) readonly def + /FamilyName (Monospace) readonly def + /Weight (Bold) readonly def + /FSType 0 def + /ItalicAngle 0 def + /isFixedPitch true def + /UnderlinePosition -221 def + /UnderlineThickness 246 def + /ascent 1556 def +end readonly def +/Encoding 256 array + 0 1 255 { 1 index exch /.notdef put} for +dup 32/space put +dup 33/exclam put +dup 34/quotedbl put +dup 35/numbersign put +dup 36/dollar put +dup 37/percent put +dup 38/ampersand put +dup 39/quotesingle put +dup 40/parenleft put +dup 41/parenright put +dup 42/asterisk put +dup 43/plus put +dup 44/comma put +dup 45/hyphen put +dup 46/period put +dup 47/slash put +dup 48/zero put +dup 49/one put +dup 50/two put +dup 51/three put +dup 52/four put +dup 53/five put +dup 54/six put +dup 55/seven put +dup 56/eight put +dup 57/nine put +dup 58/colon put +dup 59/semicolon put +dup 60/less put +dup 61/equal put +dup 62/greater put +dup 63/question put +dup 64/at put +dup 65/A put +dup 66/B put +dup 67/C put +dup 68/D put +dup 69/E put +dup 70/F put +dup 71/G put +dup 72/H put +dup 73/I put +dup 74/J put +dup 75/K put +dup 76/L put +dup 77/M put +dup 78/N put +dup 79/O put +dup 80/P put +dup 81/Q put +dup 82/R put +dup 83/S put +dup 84/T put +dup 85/U put +dup 86/V put +dup 87/W put +dup 88/X put +dup 89/Y put +dup 90/Z put +dup 91/bracketleft put +dup 92/backslash put +dup 93/bracketright put +dup 94/asciicircum put +dup 95/underscore put +dup 96/grave put +dup 97/a put +dup 98/b put +dup 99/c put +dup 100/d put +dup 101/e put +dup 102/f put +dup 103/g put +dup 104/h put +dup 105/i put +dup 106/j put +dup 107/k put +dup 108/l put +dup 109/m put +dup 110/n put +dup 111/o put +dup 112/p put +dup 113/q put +dup 114/r put +dup 115/s put +dup 116/t put +dup 117/u put +dup 118/v put +dup 119/w put +dup 120/x put +dup 121/y put +dup 122/z put +dup 123/braceleft put +dup 124/bar put +dup 125/braceright put +dup 126/asciitilde put +dup 160/nonbreakingspace put +dup 161/exclamdown put +dup 162/cent put +dup 163/sterling put +dup 164/currency put +dup 165/yen put +dup 166/brokenbar put +dup 167/section put +dup 168/dieresis put +dup 169/copyright put +dup 170/ordfeminine put +dup 171/guillemotleft put +dup 172/logicalnot put +dup 173/sfthyphen put +dup 174/registered put +dup 175/macron put +dup 176/degree put +dup 177/plusminus put +dup 178/twosuperior put +dup 179/threesuperior put +dup 180/acute put +dup 181/mu put +dup 182/paragraph put +dup 183/periodcentered put +dup 184/cedilla put +dup 185/onesuperior put +dup 186/ordmasculine put +dup 187/guillemotright put +dup 188/onequarter put +dup 189/onehalf put +dup 190/threequarters put +dup 191/questiondown put +dup 192/Agrave put +dup 193/Aacute put +dup 194/Acircumflex put +dup 195/Atilde put +dup 196/Adieresis put +dup 197/Aring put +dup 198/AE put +dup 199/Ccedilla put +dup 200/Egrave put +dup 201/Eacute put +dup 202/Ecircumflex put +dup 203/Edieresis put +dup 204/Igrave put +dup 205/Iacute put +dup 206/Icircumflex put +dup 207/Idieresis put +dup 208/Eth put +dup 209/Ntilde put +dup 210/Ograve put +dup 211/Oacute put +dup 212/Ocircumflex put +dup 213/Otilde put +dup 214/Odieresis put +dup 215/multiply put +dup 216/Oslash put +dup 217/Ugrave put +dup 218/Uacute put +dup 219/Ucircumflex put +dup 220/Udieresis put +dup 221/Yacute put +dup 222/Thorn put +dup 223/germandbls put +dup 224/agrave put +dup 225/aacute put +dup 226/acircumflex put +dup 227/atilde put +dup 228/adieresis put +dup 229/aring put +dup 230/ae put +dup 231/ccedilla put +dup 232/egrave put +dup 233/eacute put +dup 234/ecircumflex put +dup 235/edieresis put +dup 236/igrave put +dup 237/iacute put +dup 238/icircumflex put +dup 239/idieresis put +dup 240/eth put +dup 241/ntilde put +dup 242/ograve put +dup 243/oacute put +dup 244/ocircumflex put +dup 245/otilde put +dup 246/odieresis put +dup 247/divide put +dup 248/oslash put +dup 249/ugrave put +dup 250/uacute put +dup 251/ucircumflex put +dup 252/udieresis put +dup 253/yacute put +dup 254/thorn put +dup 255/ydieresis put +readonly def +currentdict end +currentfile eexec +11167FB533773667FB8D3EFE82119D83C5E325D3F9FA9CD7D01B1F3F3E52876279E4660D +B5D444F0B7CE226ED8DF687C9F94FD3D6282F90864241946A4B8E8575E48452B9C0794B0 +E485E0EE753D96B6C08DFAE68281203752A25CAF8EADA400FDB4F9AC57F07D7C3CED86D6 +7F5FCFCD9D4635282E9D92A5D9598F79FCB9FB1A677408CF7EDE532374FF6A6A9703662D +17B5D4F6CD9CF249432F8C76D70BD990DDA5FEBDB59A17FC8A068E1DCF23729F4CCF2C91 +59376F20EBE27AC7473D31BBE76EA67D9AC99ED58644032A828859BD9DDE391FC993707F +97CABF55422D4C37042F25E17BB78E63EABE7783BE0C56F59E74EFBE7783B90310E817D7 +A01D0AC31EA0C9B67EA7A3EAC553F3DCD76270BAFB428DC7AB7EE802E06EC54B705A5A6F +125250A008FA7375643EDFF171457F65345A08795AE0F1E5FAC5A9CCD3E258A9CF83382F +B3385DA7FEEB19F6D001A7B5A214115B01B441014E51A9BF8057017663645BCE7E2C6228 +940658CCE20121AE23DB19754C876CF1E7ABB40B2C949C0D45AEDCEF0165C46A0E720BD4 +6260D7AB7E8B5A77F64542DB42BB3C48EF0F9D026C8563478B4B80B60DE0005A3C61B5BE +DEF534F95EC79CDBCE5AE2CABEAE6289BE6D998B2E0B090DC31F890A264618C9E9473962 +3BCC88789A953C3C9BD07F5B1D7A1621B71A12FE379E85E6562D62C449F1EF7B467D126A +41D13410BF85D7735CB440A7363A7C9755F3BAA6554FDBF71FFBC2B9EC7EF2BCF0228D5A +98361A9F79AC87EB346D5AC82847C2FF02AAEAAB6C8272350A534C5BCBD678B28C6F7B97 +44BF3243F970909CBBE5E4116F2A1F56EF992D3EE51889C80FA54C5C9982BFD90C1ED83B +3D7A917C2588207D5A15D4316C408332591A8845B322124D17D41E10FABF2662439FC0FA +92B839F0A6AE2065D029FE012F75D7B4B0947202894211CD4786A74385DC0817DDC3A2FF +8EFD3EE4CE9F31AA40282C2A0E88D02ED77F991C910D3CC20F1A6C513E105A65117D6FF8 +B448255F66674BD2CD7B66EEA96CEE551D97B27E7B0BB692664DB358985F0DCB1E5FA9D7 +F92799971280852C5DB56F5E0788208521AB6B2589034B48624D393F005525342C7441E2 +67D1BD07BBF43C69DC7BEC5A47993AFF6F6A9747787AB8FF45BCDBE88FCF290DD28FB3D4 +2FB726AECC1832A03E970FEC71D7CA532B45C8C5BF64CEA9F6F9483D369EC9FC0D82E3C7 +A5863D816D35503EBDC1CE27C57258E0D773318E88B9006AA04541D8F14B4F23F7B3D23F +6B4E990457C5525DCA3B63EE75C3A53611FA30AEB04A33EAC156049E60651AE830726330 +C3530A1BE5F3CA8AB63BAD85DA0080A22FA54A6DE4AD3EE96BB9EC60D3EC4AEA7B5FC82F +8EC803B2C6198E5ABF9B67A82B24D8F5C672E6A825FE0481B1744DBC008B0B1110761F23 +ACF02284979F836FAC0BAA9216C35A5AB25B95197F282592E27C9FBD8D5EFB330B08A956 +B6079D05D4500F00518B164CECA074491CEFF09A99055371AD3D0A9F1DD2EF38B33A0FBF +6C83E4AB7584D24400671CD568DE38F6DAB1660578C65AFC0FB5AE268AB26D47F38CB9C7 +E48BD5A7D4F62199EF7180D923958A41F3FDCDB0A856375B3BBAF2C4C32752FB0B641240 +E50FD465CB53BEF09BB0D73D204B2064B3B6322A1D227E8D7B4FAB71BBD3E2FFC59712B1 +EEC12CFEAEAA8135895D705C6BD8DC5726A21888E25B675475D53431DE441B7177F41A30 +A216DC48B78D025AF5CFC53ECCF08C494EDDB4D460CADF0E325C81B932F4BE839E5B6F3A +3AF49B330AB3DD8637D9D0BD305C15D20FB84B14725D4269A78D316B2C2401698B125DEC +EFC2D7DC0206C6535846C435E5DDCD2294C5ECA8FE4C3342D032CDEC2398A43971E15CDC +CC308BA14659D338D478ED2C91DFEE282D221AF7150507F3F35054CBA77F7B68B102C7A3 +B0A94AAC5EB7ACC45F29A2B23A8BA397727E1533E78F84870A647D8D2F364F0A9D9CFB1A +F82AA4A2FA9D4A33E2F508BE63488D4505E4BF2B22029A24EBF8ED5BA75646FBA0B80D8E +B076A4028B10A89BA8735E03092071307C212B76BBAB410DD4783C8653F472A853105F4A +0900CD58BDAD0DE8967A8084D49E03CAE74D6724924E2D85411B0E712ED4410F59793490 +429E6271123A4A3B45BE180248BE5F2BF16BFECE9B005C9AF12523C38E6DEBAA9F1BF6D4 +AC2B193FEF981CD5E4ED3573521A82DDBDDBD61F43EFE8CF474FFE43D82DA07FD8A1A494 +6E8C187FC6C85663A05E65BE968841C923CC2AEDC5193F624FE2FA5B4F33232BC9361141 +60C54189960EDF10F1B44C91417CA26FB66E4A89B19AC2280C59CB7C3428A0251E34B5AB +90368B31EDDFAA2BA749EFBDB7C99EFB9C5E67E9C6C62438E73DEA816919881E804E3D8A +EF1D5108C4895E2E285618AD7DC3A42F1E28378335D46ECAD9B3058B165257BDDCEFD817 +350ED1B3E3ADF86C3BA4E9624C2E592A8216F4B2700BC88992913406E7DB2B5F5DF3174E +A6D7639B616AE160282DCFDC85CAE0C73F3E695B09EE0FF5752321EA51A914A7C89FD9FA +0E66B2F01EC9033EE9DBD246725CB36EEBD34EB3481FC21C4AD3AD26B394E858E3F4C3B9 +4CCF83497813A5CAA32C5FE41787FD97734992458BDDEA1A9CE2D7135A65B592B73FE851 +C2671A257B5518E2C008553432C6FA79BCA95000F31BF7F0AD101A30607D1D34987D89B0 +F3E1A190231908C2451B8FB0D18EC8F873AB09F1419D48B041A02BC4F819FA17E81C3289 +77EF1BCA4E86CDE766B795EC8A1B299F57DBB4C72660533C8A96AE701F9EFBF198FE4D5D +C66C3EAAB293D0D9D908236037C83A759F2156AAEA78B6AE37DF0AA85A5F89215171FC75 +3A323D43A3295A2462D8902458F15F6345815BECCD373E3EF4F0993F7D52AAD4E2030CB7 +2862D8FA6E6138B71ACC7D62E7261FBD56148C8DE661AE9844FE920ACC2503E278DF0B04 +F669145B9C8D435BD90C3DBA004C09B39227A5409965E6ED90E5082B923D69B0842FDB38 +0D742890F9A9FE4BB8F923FFED2581277AD8FB61E2F17BB90D1A7E4195D7EB3FF833FE3B +72E696C3DAE0A3A49918540BF1C6046FFF094E01680EA558415209926FBD70B3CB4B044F +DC5FC844150C311F9C1C031F4D5B99DEE4F72F2307B8EFF74735B1ED593465D0D7998E61 +DA4D497AF119FC332156B8D882B4005FC8850E4DA96B7AE93E1552AEDE068D0E2B266C45 +0753CD2DA48A059CEE49F1E86E2F77F701FB177FA32D5F93FE4D6A01275EEB54692AA6C8 +95EE530E862079535A543DE4067CD630A7D8CC83AB9E04377B8D3A05F23280A6E1D68356 +C76D531990EB15EA707C0E5BB5055F428997E2A731A4F7B5288E54B2C4B949833EC117F3 +0A0575603796041BE985C63F48CD55E76638E7E54BBCCC9D2C73ABE423C6A7159CCBF80C +8FD931FACC6D8257D9202645B3138E367E160CA3CF22E1C5ACE59AFC77BFDFC25A5D6DDF +E6C2F6B68D062D0490D05B05B55A7A0C6E56A52A2EADC106E3BB6410205CED012BB49DC3 +6EC89674C22C7D17E3A6AD10A2812095454DA4D44414F42A8678BEB35D372D3851EBC535 +888D9E937906CC0475986D2656E16D78B391E8E8D3E9C91D980D526C6470E79B728ACB9C +B9F63C6000B9E60AD76959F7B14F06B631778911EA9DB59D8B9BE7DECC68DEEF068032B9 +272227B91840B30B7506A3FD57306015EF686A174F48B734D9070498D2184773E7353A24 +51D3276238B8874FDEB7161D1A8506BEF79EC5245651C29B9251EE17F834D200E2219A3A +9CD838C9BB31182C00A52E06DA6EA4E446FCFB62C92284116E14C3D38973F1704D5EB2E7 +6E6F88F7444364046AB43C4D7D44A23FA47B5EA158949A3E1F15DE70F40812444C6F0F4D +A9940F2B3CD1B7B1450C1BFE7A6E111503CFA45FF012A6DED44CBA623FCEAF5262BBF810 +90A4FC1EE72D5EF3852987026F50770F7410E486F1D15D25888C8D88188647F8776CFBB0 +C7D4F02644BD13C84C592DCE82A56F08920B2FB13BAFB405154895458F55DEECAB846104 +7B157C02450E0E529A10559BD8CD9592FFBC923092C1EB0AAE96E5CE64A6D5B636988F69 +EF02E3F5B84451BA2F6CC360B647908FA940E844C3DAE8FAF73E9ED416D6B8A20660EAF0 +2C662828F3E137B0956B15AA9C129A312E753202D429FC734325F1F82A3D9058ADB87688 +4B979CAEFF660A8EF9191F4E0D2CCAE5E5458139A0AD0637319FF41CD7DE9877AB094F4A +3F27EC8F5C7D42B1D892B829E1DBBFA9295B8383B23658ED25DA227B9F625B89E26C854C +0130CEB1F82D24E53D5FCCE082433A4029B1B4A5905D25BA809EEA54895220DCAED1B2AE +879E7BEE3CFA3C71FFBC77AEF4A415C96F2CE40EF47E2080FB59AB00DB4E8D527D9E41D3 +8DE95CBE66EAC589F5831C4BF0BBE1455F4960FE388B84074DA43DF499BE3810C38A4BA1 +D23F3A6C331F09135931FF0A7D77160E3FC9CBF4937D5814A12848C17ED3F62FEE21B11E +43889F3947F67F66BE8DE7EFA954E2CF8BFFAA33DEE3F3C397FC572DDFD7E42578DC39AB +7CACDE5A30E25CB6D949E2C89B02E48F70CA2D0FBA47F19B72CCF99B4C71C69B1E1A381E +F620B2BF283FD34CE116F5C2DD1BB9DAF60BD431A6CD475ADA9F7490E17D5DB183763467 +0C167B8E958A4C476820EB53A778B9131FC7205BCA2EE3791B8FB54AB6996B82B65B8E60 +71529E0E3A721E6306EE6448EC9607C427F543EB8C6717D0BF598F619D36A3FD7C0E3DBB +E7B5D923DC8EF2BD288C55EF93640E4249E0E9E36E1FCC19CEC8619495B71D84236313E8 +C552ED0F230DBEE3C395269DE393EB34F630A5043B054154A47EE48BCFA1B3DF9D142315 +F1826809F0BADC495B2C7DC93D34155D843427BCF872288B49D2A0AB22AF861112C324F3 +4428FD31584D3B5E88ADD1EDD809DA66F90C756386198CA263562A95BAAA64B1CA36897C +1069CDE2D44EE87FC186A24C10C23B8F3DE59B41D1AD8E01EDF4C32EE70F053DAB84D24D +33A6024D7A86570D96B34892F8E299414E7084D99B3C3A89531A7861A39EAEAD9506B0C7 +017E3A730C91AF6857DECFCE2FFF482DB160369A16BD17456EB74258D2D39F7177998A85 +6694D74A57318BBE392EBBCD069FCC8EFB71AC1516E350FE4F936BECB2A8DC4280BF3A64 +27F1B741C4FD53AFB32EB78D9C06D74B5F71DD967E087F733D50655900E086D358B46C2E +8EA8CB494C0EBBCA4B0A9C74B48E0236F9CA651D73D2DB6FB1F1F6F7561194C8858F3FF4 +B3F46FED001DC472F71BD6E16EC1516605779FBC1FF81D6ED6996F955C001DB98BC8E7EF +16065AE3A00E7C65B4F080F78C5E0CBC9EF8D4E6A8A3E76258B31BD4F6766A4B00A37AA3 +E5BEC4C495D5B92E701B7423FF09FE895CA54F82D584942A93ADA1C7AC5576345DB685AC +6E04586E55C997FD31D13FAD4D2FEC0181A8A0BAD0CE863F9052735AE3F245F549B8F2C1 +A5486F65BC217A57D404832AE633EEEDE8806889AEACC54237FC2C493CABE98111D34EDA +6739E5CA8FA33EBD70757FDC1243E9F1D58D69796A7BE700CB9A39F69ED0D811D4D286D0 +80BCA0D9E78E54B63E640C53BD479106062953EDCD604D10F3FF50620AB8D1B79F1F873E +E47512F37296FA930C5FCECC28FC6025270DF4B2CBC428ABB88BA940AD55CCA0EBFDDF91 +3AE3271FBFA6DEE0B62D6B94F40053A11410D91A1CA9DB0E9947AB24EC592A9FF3F00FCE +F1C436A94332952DFD7825CFE35489E12C6A8A7521AA5B32B307A7BE5200E45E1FDC5588 +96F0A32E97E31CF40BBA08833E7D7EF78DDD5D48685B19943705D87E40C235C0EDCDC6E5 +93AEEB193C8957E5A05E17F4609FB3626BD14CB597362AA65699A50DF076A54FB1012403 +E32A3CD7761DFF0B3F41AAC0BD55C1148A24BBF31B4CA15608F12DA8F671D76E33E00AAE +450412798B7BF74C216E112883E9920B0EDD24701790AEB565D9BF4927BD3856493D6B56 +2C5A231DEFF338A986DEE08AE42A6FB978608C3B9A4A1D8E17164A08E2FDB5D1E1D38AA5 +5E2E4B4D2F5C0317ECE305DCBB207D7599943B1116A0AF9B917E1EE7FEDD285F249B212E +AA66724290030E1220C5E26EE5623636FB5897E0CE1E0DA00B8E716A963B4A9498E113A2 +C6E68B6D35503EFB27C4D82FE3B48A7005560DF04BC6AAA01EAA47070C81D60C40614920 +12654837A5317AF1D7F24404E050CDB6C3D1B1BA2480FC9940707A9984D507A3C078365D +30662300B4E28756F69F8B65F9212B4A0FE63448CAAB6331DA9E7DA65347370F03E51135 +591456D774040BDA4BF0D318161C082F69ED644E51EFE26EFC45CFA0391220B09BE1157C +3E4B55CF5203F2AFA61D7C0F6F281460A761987144ACA50A2834954890D9BC811B72D0D5 +FBE77F8D01496257522EC90143BDCBBC30EB08B9D15097E0AA0AC15F6F7FEEE91224BC4F +531A65905AE9337D97652775BD7C43740E29EB66AEDF91D658C2A2F9849A26457C8866F6 +F96D59E6721018ED0637D6126F08EF685174F130D9735CA45227B508B52FB7D9BCCA10D3 +BF16A889EEA13847DA7CAB63C73C0F068C3BBEA8E162295F884B7E28BA144E30450A823B +9025847C739B6EEAD71967F8DBCA0AC8FBBC2A7847BD7B957B8E44EC96CA2888B47F86DA +786EFEB0C741D7CB67CC25371E59148D4C3ED2C5349A1EBE6B9DC8744EBBA600856B22F5 +1832C41955FF582F4E0337809EEFC33FCDBF9C31723278A8D085F1404D16A573314F2876 +85C67FC651E691B1C12121B0E209E3E7A0FAC4272D58F16863202CC7594D0A6B10A4948B +1FEE719857ECEA0CFF0D0643154CE968A7E909A6CF9A9672B2159717E854044AA6A13F05 +A3581A47D624126498DF26635EA643734E2DD2A2EFF5D2F70BCDE6F39C9D54F0A1DC05D7 +8BE1C28495B0064C2A18A02859FD8B1F91DB7D29BBBE7401B1891CAEB5BE54468DBE8B76 +74C2257466643C14A9657C1E79627D8743C14B4CD25C03AE56AB0D1D5EF596474C7881FC +0706543A538D2017E48205664D7443834DE0344BB76CCBFB64824E753FEE37F39581FD32 +27AF8959D869EA87D806668DC29436C60A8C9DCE55349B7C992F821C28A28482843577A1 +44C905FED079A06273C7960BADCB5196F3C9E2DCC87C0B1E03C5B5CC64AFD58CC72DA649 +040DEBDA7ACDA5BE6DEB142FADDFD883DC4F004B7B7FC5A1A8A44AA9C4A6B3CC034D4F92 +CB6293FE7A3EAAADE9568655CC3CF1EF283B1ECD15EDA0A2E3CADE0C3148A5E449CD5D92 +557FC15E2A3B99F6CAB2DE4E3DDD038184E46F1914481C7E5B5A1862C899AAFC1A4965F0 +5C152968522019B3D635C2A67DA80CA60F264E6F75F419ACE6F48F32C5B6FEA7E340DB0C +5C25F7FA380B1A7D7F4534F0ADB02EA93B4901B581A9EE79D3710248F0A5E03BABC2A066 +5583642E51E78893B375950891A694ED7C18B2CE872619ABE151DC8710F5395E79E5FB02 +5F05A3BD9364756A54FB8B31C81C2285942F9FA6940BF3D676C16FBCCF34A433028A9A0B +18A39831E0F04F03D7A4465DAB80894AD108CCFD1F004013B9D619E0EB552DAA5BFE0EA5 +53FCC2D38EA0FAA38BC25AA6E954A2ABE35AEC8383E556D1067F2A8F4FEAF745DF55771A +95502B33A40807C7692BDA00A142A4EB394838F57880B4ADE4D21DA150CB60752D5A11E0 +A309F50D63AF0C59DB2D58EA0C827441997566E8AC0F39C354CE94175BBC62A265FCA7A1 +87B3BE75E83EC96FFFA43F6675D9374771E2AAB0FB1A14E9843F864852CDB0E23D30F1E2 +EF19FBBB4501D41F4878208E041A8B5C0A46B3352A2CD1F5BE78B3C89B58DE076CC603BF +04163F64660236214F9B029CBE96F0F4DE40C8919EE1FB5435FBDB25083FB3EBD505B0AB +CCDAE8CF4AEC0DA7D890621D68D0056FBCA5832892EBE9E2BB72A2BCBD224F1D3E8E7AB4 +771CAD9C6A4A0E40A6BFE15313E15EDED08DB8941E04094149B69FAAD438E8C7047C8A41 +ED0B10070C48F804C11FE88BCF655BA3636A4C7426584812DF512535225E8499D867F83C +86BD170854BE047A028889695FEE4E7FC63DBD109AE00664414FC96496F85DC4BB719BE6 +B7C5BC4D7289028A003CBDF447018981D0A8E11656A4D75D6F5145C5DE04CFD6234551DD +F89930E9267D1080FAE4F9C66B1BC736C7375B902FA53D9E8BCF2B5A7BC4B6341CD65F79 +9673CF52F26D649882A3A2EB1609DBF2D4A4F02DA65BB417EEEE635485BAD51E96EFD4A6 +BDF0861B1922D31BAE22AEBB9DF54E2C5ABA5B97ECCB069903B2AA28D790560A64E3B93C +E0D3FDC457944A22A390C874D655AEA7BEA5B305B1BCA2F13DC73F1E8DC7662E20FC276F +1D29E9D96E8EEF0E3B2B0FAEEF541CCAEBAF485019979872A72A8ABCF89071E28DF389D6 +8418B9EE2488F611AC58EBBC150F3E93AE1B3A1C5426EFC55B22E5A7D1DABF78E4C6D196 +757CA1120B657ACDD4EBD7276EBD4A67A7440B46FA59C59E2E6681FC2BBA58FC8A82804C +F8C4AC4032B09681B6CCA415C532B91CDF0B0400AA088C9044C3895F3BF46C611BA136EB +AF72086A9D2BC385201BBD78DF875CD8F7D67C0D4F26D3D9C6345C55FDCE9B26BAEA3963 +A7DB21622C3B3B3DD82DFC66FE74937EE3728FB20328B047463856F9BD4E1B1F0D088A3F +19408DF937A84D543A5BB17445979A37399586A368E99FC2542D8F401D0BF360CA619854 +EDD0BE31318865A20F221772253518E9E09BE9DF95901147411D4C0879D26D8F930E4B30 +3FFEBD5FBB076BD9BC5B0A4C99F0B85800F25994108428F98697DA6E7C14F1780BDECC94 +16B682AF9E92A7AA7DD0B33EB695DFF884D14BFED98D3D9F84E36ED4FB2DD86F1A42D8B4 +A2EAF46CA449E0ADD9BA067F2DE96897318BDB05A560BED7588999185585F81C9BAA0AA0 +9449C1BE1F14AA0C729E6B66622D18B8D5340B74BCD66B967E6F29365A5745012C881F6E +CB10CB82B46B7AC551B5ED79C41709AB70B4AB493C4BC6DA1CAE87011B5961A5FF4B0ACB +17A95F29D49FDE6830C3B2D170968738A8815149B242B4884161186079DD6A1217FE9CE7 +E60E7045A21B10138832AE5C880FD54FEC7B71974DC8704DEB006E01EF9F61F7FC22A117 +123D5A2EA6AC39CDFC6BBB6380404B8F98CCD1E4FF7CBBCACC4AA13F260C081D9AF5108E +518516A2C58B27CDF940B960FDD3D51AF3FA1BEAA90687FE8BD145E9984AD71187BE737B +6765F385FC7A58FA771C84759CA27F908038C2B7BDF81DDB6797A3EB4EB6E8ADD3FB9FF4 +E92692577747890EC0CF77796BCC291929FB27FA69F10AC7912D9A7E6FB84DE14D9D6D12 +115A8630F8CD3F26A86F291714B931D3822B8A07E9276659D5F36EFE72858A444557FE0A +3BDC70E9D52F941E790EE7B7454557B792002BB07AC33F10F2CD2E5E16E88018F6F79D54 +34E408572D30A3316C3F1BD36E1BA16A49C3623317C62ACCCFD869EA76921D729E70F2F4 +63FA8F0035EEDE8EAB1E7BEE4C389DF3BF6625DF10CBF19701381B68525BFE96C2CD919C +2922EE99525048392C1BCF26B3141B551E9DFE25A2D0E84348BC032C28ED8A118DB6A083 +B1AC44A0EC9184D101FCC6A9CC4F5F9756783376BCB2DC289982795796454835FDF5F325 +DB4DFE924D2C02458FEDED43FE8DAE2EC4BB61536CF755E7E920835455CCE84B5C0C791B +9CB6D494445F304B173628D8057F45E9860DC8DE045E351750C0E71B2B13F78AE4941AA2 +F3E2E8E05125DFE290AF817D87693AAB16345CF0CF6CBFF594371E9815A5F3360CD52D8F +095AE10808F33F86E07E4B8A2BB3486F93D04C88FCACC7907E359442D0CAFCC088657360 +6C54F56DDC5039A88396731AFC577DC3324A0D24AA9348245F660A496410E3286B81D6F8 +7999933D898C0FF0D3FCBA5F9D5CF3326B863E941236E31FEF86B7DEF1014D1C6CF86B92 +4FEBF9FDEBD3709805485B618DAD03D15B5C401B94B2F4500F2FBE72CFEC2A69164D6185 +DF5160441DF72FC509EB7C1C1322AA5658B09E1BCE9BC99763E7DE13057E836E57D24460 +DEFEA1CE7C2553BBE5F5CDCA7869B7153A0C5349A7D0B546F971FC63864BA7F00BFE51E3 +905A87F67398D568709D27E5A746970F72EF9C71ABE7CE96044ECF80352F712B605A6B10 +8426A06A27E13FD837C520096D15F9B1A44E6F955E3FACD91B643BF0EE74D3FD6E9A10CD +F05C01FBC7BEA26D8AE8565CB89BB2E52EC98A4F4898D146084CDF4E6509462D267CE81D +D7A0E6E2EFEAFA1BBF696803FD40F021716C2838C19D32F741FA334D228E2BD34DA2D561 +E6609CD823CE02EBB683A6F1EECD93C9103E5328143EFF6C9E05956969D2F25AC992FC76 +39B5C238FA4A3157B959B4AF11B6AA05823C015134836A6560EA7F07EC86117511E13B10 +75D0D2259D36E7B8065D930184C7DDB1AC2B42A566FEEA6927313BE91C7EAADA352D9E76 +43D467F94AD5ECAE37BC145278B4048AFDF432B2E2F219661CEE53E159490F1E0FB04DF6 +D42F4B322AC01E5732859AEC445D6E120091996DCE46602EFA8C01EB0E1D8BB6D0D12174 +E4990498577B86CCEF0EF5F7EE913A3A8D78EF9CE4F37B0BE1B5F40A4D0B00EADBD92C7A +5083E8D4B093D7BDA5B88E08D5DA4EBF7FBDEA06DFB8C5161A92548160163EB7AA97B603 +96D869524163EE546E1E35F764A4879D2DF056A5E77438D45D81F9356A4F8EA0D007E0B5 +DD2441879A48AEEDCB1A2F493C3E648EA138D4DC080022EC7A62E08373CF032F48C2F585 +0589F04122726500E8B29216CCCF6ABC2A04A726224F9B029A25DE8C5965A6ED3F6E3518 +B72C6A0A64802424E91DDBA855C20EC358F6FBD79C30CC6DA41C9C117B23139C150DDB33 +7FC090A907DCB0FA4DCF914E3CB53EDCF7DFB6D2A200F7C2E8401667D828605C64D9A62C +7360AECC44BC3951D2ABD75976528B0B98913A2741D0E160B48FC0458FF56DDAF4FCF5B0 +6A351BE0A90F851C44BEC636C0AC688226C8B0FD136F2B612BB66ACBA8FF149783F24B99 +A0FFBD405F655FE2DC577E01953716C44965782D86658859FA313876424484951448ED6C +E43106D4F8FAD95C3163A1AD47AB14DAEE015A257735B0B14BA8C1F807B54E54670BFB7E +9311D936086C6DDADE803F4E304B6E823A937E1A92C28C5A61D0FA1DA992DEF383ADC936 +E910075C9573B15ED356345ADF2EABFBBF8CB6D1D35DB404CB70DF440642562D8778E5E3 +1C547AA1DD408A97F44048AFF9317364BB3A8D35503CA5F0FA509CD0A20DE629DD243EDC +163402620ABBCC4E9D7E679A92E7FBC45CCD3923AEC1C20C8F15647B0E661F82C738FC61 +FB3C954B9097633B78D21C958491977377BA0FB845FA5357F3519572002CA6A88FCC39BD +CB51A2F2BA462905906DC5A76632708E41585A47368D650954826C722853A1B9364D3F21 +0A844A8AB86EF33C8176B76E891F2AEE7C1DD8C6B0A2B52CE2AB398533B6D862593D30BC +2BC3046C588E63E2C02F17A5336D7B03B8CDEE76F5B8A8AB32F431F9FD1FD85013779781 +274597F8B717CFA22066ED723769550D604ACA4772C711C672FA57A9A30E962E9ABBA798 +AC43517D02EC267E25CA09B5FF087C0498660A975A7BC1F726B9B0362E786A5E6DA97B9C +83C8B7BE172423C79CD95A2DAD481CAEF11924E4357833DF7692C22ECE4A7C92B6C84B8D +4E1332A9AC1C897DF2777C9A3C8AA4B77574A5BC296BD2BB4DB715609DEB685CE804B710 +D098CF51391D799C2F59017002C2F2018970BC614F4A4A246A49E795FC2627A5361A474C +4EEA15FD114C5E067D2F091A25E56A019A2DC6E00F9A3CEAE73F68C7387A2BA310AF9980 +8709635A5A2AFA101FBC0FF8AF9D7F7CC1E44FD2344BE0ED353D24E8624D464938BC13D4 +078B481D9B32937D75B52CFEDAC13FEA859123B76C50856986F05DAFA7AB1885ED53E88F +57CB20D166DA5B3723AF472A0C3BA1325015BE2097BA520E15E0CCE3FC8D3AEC37F3DED1 +671FDE5EF193849D5141B9956A68DC514D6A9FCD67AF25D8751AA32D114A58728CDF973B +05464EA3CA55ACBDBC0C2CE814CF10E8639273C33DAA263C217A8C6F1A8EB1BACCB6C7FF +E50DFE35E2919D0CDD7C099FE7313B8D610C90034EEF74908906ACE8631A193C5C6341DE +6A311DAC36AC2E9FA441E985249302F9273EFEA3FD5AC02111A0B697CBE2FF96B245D2B7 +0847404C184BFE1E3C883E66D90EA64C797597CDE06554DE22537638509E69D9E18030F9 +E2ACC66700F2429D8C5787837421EEB83B023FF531F48B40EBD3E58A13A0FDFB227C2A28 +C9A81C16A7554BD0831F68AEEC7A1E834BE1F90CC96D7E6C5B06A5EE89B231C183E2BAC8 +4840BE8EE0CD47E46517F6C46F27B3691E5D271781E612602AA935061867860C660E6BBE +E57583687BE3C61186D98BCF7EBC3A3AFB9B88C7C466DFA58BA37840A537F1206C522FA5 +DCD1C129B51AA8EBEA4F5883B7D1EAD667B178B56FE7D831DAF15C631F52197F7E92B34E +DD68CFC92859C49922404F21F4BBBE4643501E39AF897D93EC8B89FCAB6BB8912F42E805 +532691D4BBA96077BB351BB9070DC2D5C17D60374AA9C8CC6B6ACF929B77E252F71A6F61 +74FE8058A8DF23CFF45A046CF30031D87FBE2D408BDB0C9939FBF6F16CCA38D97AB8B19D +7278EF78814FA670EC235651A4703B229B50BA6B3EAEC8A22F41AF0CD01984238C34C2A7 +9E18A8E493F64F74EA3638FC4EF88B7D788648B4A2ABF02432988F9A3C871FCE7C59B339 +4E00539AB825DFDA2C420E378D1A20CD0FB6F060349ACBE266DB820841088A9FF50C2686 +F90561D8248881869D04A809E738761CD091B084610BA958A39CA3F19CBE38437DF0FE69 +D23264E56B4760044F11EC435631D06C6C7934427BAF1015C9BA4E370CFD16F1E892AC3D +7932504A52DC9D9576CDCE2C37AB393A55180156F6F583B753E117E42F6BA85A64155118 +2FE36FC5D5C4C80F88F8825E88CA9F5CEBA97FD8ACBFA3C87FC906F443361B71F6B2D875 +DEBFADDC1CF3EA8A7D099C30A4207CDCB3901C13FA35DA02FB95DD0E6EB587D46D739A27 +B2A325237F8D33B1413618E8FAF1C9C146581EA841E8B85174D1787BEBEE6E409FD6B64B +3B066F62CA10009B10FF02A9D708203C02EC1F3309653B617F053754EE9863EB202D7ED6 +F5E47D80B48D99040CD17B44646694D8BB68F39FD6EE4ED77606D35B4B668A16608AF657 +FEB98F826C291B26325B6EB8587CC3EDFF18FDC96C56241ED36A6115BAB6579D5CFEE016 +75D3E4F23ECEDE16AB09586B9F5A56511EAFE9BD38D5B36B0CA45F1992475C129798465D +0B7E94BE9B308E87794522507AC3AF7B29C91AE0C6ABEAB8989289F238509063C3E74CB9 +393F2934A5FA0EB173E2982F412875AB7F1ACBEBCFCEF7647203869322300D4C110D30EC +C61E846AD1FE42361F357830D5D6DE7DBCDA6154F8C5B6591EA2580F34C2C5422150BCC6 +E8076F510E571BF3633255677A1971CB0624BB1A6DE11FBE9CD1260FE400240C4C5CC59B +A1EC6CEE2E054995D33FB5ADC781D78A371A9116CD8F9DC09CFF2F3542BC1DC1B4E61D3A +7310C9674DC24DEC68073F4A979FFF96DAC759988735089B043BFCFDA203DA4F99D8E719 +1FDFDD18F3B53895F7AD46093B8A9D55CFD2E527A50F46DF23E0288FB8F61E2254DE6933 +DB7E78462CF03E7E454F6774415D3DF25926B9C7E48AE576B05FE164CDBFD3AF56FF9A94 +D0C08EB26C4514140BA55B503A52D98CEC90C721AC3D2E280288D0F73C2A5ACE87AD9798 +E15AED95526210EC6428D10C1422482799D1BF69DD623B1B16DE95592FCB6366B5E91C1A +3E03F6D086258AE19576E5E66F9E6A8C029E26FB7471ACE648E9A9FC74251ABF854772EE +B42D96D9C87EEB12785547AB30CFB71FE683C621CBE389225C1F0DD6CC7C24FB9E5AA117 +A4A9C83A78776C0198745A21B6E154A9D560BBA0D419092CF341F1606686D396C9F417CA +DBFAB2D360D2035196C85A204AC2F0F3B3EB17BD337E6E9D57BB414613A636E22E944FB2 +556D9046E9CCCFE0B82BF68E0148B17CABC0A926DF4885D2572D53435CF8CA462BBD9A53 +AE3673D6C6A7BB9E857B9E01CD95F2336EC1DB562088E8C2B4C6DA9F8E7F6506A6E69D06 +82785BEAFEE2B57C1BE191673F51C6E2DB711667E34518363119A27D7D3618AC791B920A +E66FDFEE50BFF094E587DF23A4C100EEA75AB4E1B3384F99966543D48A3FCAACFC76E5C2 +00DE81A2DF1C7D7E4FE1D8FF59FE187C6271A80B42C9CC854096BD3FCE15048E7AB421A0 +89C15E9574D535142E877C1D72BC5A1173D157A1B61768CD39FB88D574A1BC3C67BBFDE7 +02EE677084111B8ED795273745892D9260CED632285E633DE80F3DE62FBF73350D71D72B +84F5A18D3BD43386D05642FDF1FAB29CA63B82E1969679FAA6283160946E0E3C7B3519A3 +5D791580141D2F980023C39C122C2D102E4243502B517678C7A4E522753F91F4EAF73C75 +C644080E3509EDB077EE84E1DAFC06B25101FDF01F1FDEF68C326A6F67253E18A0336EFB +2375FA4F70A077A2D09471AFD31FF4DB23B1FFEFE8A0CE644E864BE68E05EE75192D65DE +9D14F9A385AA2B9C4E5BE385FF1E2C8C9ED1C9CF4D48AAE769AE7FD807280FE96EA290B7 +8DC5A9F78F89CE562183C8D8DF90E6AF14B20C0431617FBF64BA977EB5DC3BD63BF0B81C +AD3D586409EBB6211CCFC8CF02A74A30CB9B3D2BFA8F954E3F9590A664B16E4E3EE7092C +DE1D42C778AD283AA66B630DCD68C968B393C23CE8D76AA2A9B911AD24D3C73C02B2763A +088ED7A1CF3B4BD07C9A0DFF7B642708B13B8E9C32923FBF1531AFA279E162804C301BC2 +F69F4E24A05BC2D93BB622B5528D2263FEF2C8A4CC1D6F01C282FEF8A188484450FB1359 +DAE4530DDA82A2B5359165BEDF8FF28880034D8EAC5E7C03A8FDD59EEB8E2564B3889509 +27EDFD59C2CA931F4058C6406DB402B71CDD3EC21F2533903830DC407F814B86ED983E29 +991A94AF27C008B2B448972C6CB7FBC5C30D577774624318C371737D090F67F6C36FC195 +F7E2DB836CEE170DE9ABDB2D99FA06E340CB144F8E65A29F13DDB34D2D462B38C7CB6695 +09D77000F9044C659B941CDDE2CDD35D12D6FE94B502CE6C67824A695D42828E2D111AE0 +752383F579A86B38BFD3F173D34FD9937F11027F44748A8903342287B85AFB49BFE24240 +0049F4683217BD8974D21EF4E373EBE69221DE4FC036AD9CDE8D1986D16260F361255CDD +6357354CCC036EF8248802C5A9DD6BE470FD647A913409EB0AF9B629050604C166A70835 +3B78E1A2A179B3161553FDD55B036867914EFB8A9436F668860770DC512D8779E53883D4 +DCF5913BE9C0AA9D002788725BDDF0B5FDD0B3E49A4DB4F79E9D28FB4872CDE8999A0E62 +A6A7934A80F1DE7B84672A65513F4B1B845437DBA6DD1DF9ABF70DD356DE74C924213528 +F24124F153637EB9ECFE91AA71DB9A92C19B376F7E409F81BE121349E2D5173B821F018C +A19039FBD57F6F7012D5E4684D149E92FD9E1EA48F3037B162560E3F29C6AA8100C0A633 +D685733DBB08D30DE48A53E28A3D4776B715355EA7E690664BD3F1F77AED2343A05F748E +DB986519D8E92CB843BC8C62EB5F46E73D734D079464EBBC97693FB5A95FC3CD7EAD4A42 +AE6090F18938D286AAF8D0AD64C77E46822EEAFBB655A0995110AEA8C61C4F198EEB8E8C +CD40D1A4317508E96EF47F6C9F4E6D37D81F8296BEACA5FF63732C8FFB8798545E86539D +6FA3EFB324A89107534E638B54059790DAAF10234064B5C51B1B233F977777FFCF18AEEA +AC8E9691C9C4E5652B68D4BF4D262565AA53E2E639FA7DE00A6E8E81075DAE11D09DC355 +2DF890E2F4FB7BF42D94BEDD9FF9E708765DBB5E2D86984BB5E9FD3AA69529A7B4A547A1 +3E7DD7AF3DB740A8076FB06D05EDFE10D4F77467D4950E515CCA452D9FD9FB023B7F7AD7 +188060BC823B479ABE20DCA872E7028AB0F44C36DB113876703856A5C632AB2D5F6543D8 +98C9FC6EAD7609E3002A348619733FFB0C715F55842ECA2FA2A1B89DB93A3BA102504DC3 +BE1F54AAC59EC23E6EA3223912EAFC711DA3210451BB58AA7AB7F14B1621C61D9875C97F +D4DEF3435C6C8BF9BA8574E2D2CC43EA26E34C774953AA0790E650ADC9BF79D57D90F994 +C1EA2B452B4CC7A59463C7CD5675632250C7A51A13B494D7228EF4843C8C1A75E3E2DD33 +3B64FA9ABF7E79185E0CFE9E416B619BAB1F0E27524B1736A97629DB8A9723231E1BB587 +8F94C1A223CABA2435BFDCC4D2879FCCE344F6387E33DC32DD59D38388A7EB620A28153B +C3BD9BDC43B6918A64E00AC4B27B4BE4A1C7BBF0A6EAF2656E196F70526C7ADCE42B3A12 +DF7DF2DC001F96C1C9D6B74BBC11177772A906922EAA6D745CF0A63DEB2D8C0364D2BBB8 +0A0A2FDA0DCF6E4325742AE90BB62AEAC0DBF0962C8101216C67D0535E96A464BA2185CC +612AEB75F66FA580590C43D13C7C8C25B858F63AD20258BE0C77809A641A8F8A662B9C81 +0F4B3D1A53A80E062BF3F388A2AE1D4877BE988DEAFB3A5EE0743EE75CD07D7BD867606E +45AC6243C9C775429CED85E6E5CA20021C6603514D6A6B36C153CA063213F8894ADBE917 +891A1ECF868C64E7BCA2580A0180F6746F4B6016A5326D778EDBC993072DF8D6F78A53B0 +5CBDBD5EDA4C30CD8FA370F701F093A06904AFB9D82167C82E1D069047D37B9A437AD75D +9F7F6AB574925D167B6C4BEFEC85AD45CAE11BFC1396F5E6B39843E71660875105150AEE +F2290EFA830DF0B9817D30D52B75FCD43BD20D30ECCA85B20B32698600DD8A8D0BC107D0 +C77B43C87161B766C69F02E81D58DB7006C5D5660DDE997AB669060C70F8AC2FAC3E13E1 +BCBAAA34143320C795625287013C7EF306BAA36A61B9C71F91AEE7E543F4586A7D8BD432 +BE60AFE2EE0DDF5718B227784E7165C4D2C4610ABE9521854902526E553D0A0CBBC26EF6 +E109C7040C3E876F71581B2831BB782CED2D8ABA918859741B1F748E0B8F81B168C7AE91 +25957055231EF91B31C3C09E2FEFF6C1BA4CDAF73B07684306BDF5F735DE2980E24C91E0 +A96B53BF903A23A324E2C3DE3432762CC7995CF5435A07252D6B8053DFA0A02AAA0E52C8 +8AB643C591431E6D3271B7AA05C5B5EC445463AF4E13D37E419947E18F22EF9CDF1BD04E +2E7F106D231986C21CCF02D103253678E4F56EAE1078993E69B76D07F1DB6B7C91F2C754 +7D521E7FF0ED8DD23A6277AF86E4F67B1D9B4FEC627AA69470922186E477EF75A7D77EF9 +FC4A16ECF9A37597119B804C927377352CEF88AC515D6E914FC1EF5AEA7AF1F3D3802C82 +60305538E678EDDDFA87ACD3BAEF1A09F4F4AE1AC97CC0E7785F3DB18B6EEAE005FCFD6A +C2A611CB6F4D8671C08791B9FED03755A13B8AD33C3341CE9C4FA948103DC77EF727AE31 +0C00806D7639F922B967830BF717CACFAF26E2331C571CFE01B214ED596815C833CA2973 +1D3B159B691BE5722D8ECFC2FC07E0E2A12FA9E76AA3F13374310C58E8E7CB36C68DD1D4 +3E1EC626199B5B77D977E9786CD9102454834775BEE6EDAB046E7BF335BC4572544D9377 +D60C6C389934E35E40252BB891D295E8A64C12C3790DDB9AE563FBFAC83A3AE606116ABF +36E94DB1368234A61027B95C152985B30D67C03A99C6C6A6DCAB9AFF3A8B5766302685C2 +A6438B11F72D91D3B1D2DCD97832861DF613EF54D4858B02A73D37AFCB0BE38C44ECC588 +20F47EA30645B18817B79268694829B33EEB7990C52A4057BE22490C688ED1D4B0B8096E +F6E24114065FDA365D05F9804107459ABF86DB0E7F38378C018003F089E79764B45D087D +02DBDBE171A3F280F8BB673D13826CDCFC624AF331BA9732D81E16E522B551CFB43117A3 +D2FA42EE3159041494C5B94E66FC3D59C0AFCC0785C89F4810F772E72CF7133CC7C75A25 +BF0648BE3E0EDD3A724DDB9277D8956876F0718ED0FFF0D7CCE2A8CD683D2246EB26C7C5 +0EDA3D83BF795B55207FB1B8F9559D27194AA9B0DFB8900AC8227ECFB43EC08A7B325DDE +D23F0ABA4A1B771483E181383EE1AD282C1E69B5A9E652EB71934CB6065FFB8FBFDB8307 +785AF2FB59FBDC229974A8714C47302429B17F5B10492C7594D66BC8CE44A8C42755499A +F34DD4DF71DC73E2DDEB16DA14D446A0E0AEFAAFA47A5290E7ED5AB76C076B892156B159 +A5FD0E83D88CCCBEAE6395046A76559F8F33DBADD30F8D530A342297E4E6BC9E0A0C9F17 +60ECD67C3008E01E34E5F688377CF8B6DAC331FAF3974572242DB1850F972DAA8D73F9B4 +1A21CD8F3ACFAE89915EF1A2E369899F81826565A454B0E68C02625AD18E47742280439E +B28A956044CE0A1A6E71895528109927487B2E543BE901144FD3AFE5811E2D5937439E5E +29B6B5CDE26F27174D6DF8D026696953A6ACCB3E84AD623C1183484F38484C41E31D18FE +52BAF597742D38312C7F83A31DC53EF0FB87325CC73E13A9A8B467C07237D23FAD848035 +AE90BC164C363787E65E8E759BFB8A1D0E36205BD6F9B5D95788E2A8ADE9D6CD15E1437D +F89755AC4FA834643732D4F5AFB8B379C8A404EB2D5795FBA40A0344DDFE3E0BF2475616 +9AABA8F303DCD70653B3FC4F15565E9A3C53E2190F3F8EE18DF5C5E74A5EBA1375946280 +93BA397B914D8AF25792043641E70260C6DFFDDA2E09DEA65B3C58260635C4E3E0D4E384 +8D7CC744A7D0E00EFE5A4F35B392E536F2EEF714EC49168304DA679F87088CEECC5DDBA4 +EA30D04BDD075553947644E66E5D5F50643FFE8A48D3B16633CD2083F05755BD47B71767 +53983E6F4394FD61B4964F749977AE31C2D5C25C3C40D1B7E070C7A019EC00E3C55A3255 +EBC73C47F2A4BED7BF0387F9E494FA3E2327D76584727AD5E8198BD80A56B7EBA9B0D92A +D0310E640E53ACCD7DDD57F3A286A301FC3E1ACBE21A4E9C572BB15721A64648027EB8CA +13BE6FD4C97E304406554A623F3F9FC0F95497D97A325BBCB5735E2A67BAE21C6650F633 +05B25DA1E1DF9417597E09C8EAE3C3AFED656BE4A8021F5AFFCF55CCDED9BDCE2E7E195B +1BC94C800ED80960503D735684810117CDF144B739AA5F912E71530A244D4C9DD5BC1AA6 +4A6DBACBF7B11706973418E8C2E04CF96E21B56C41162C78FCE26B025FA9E920C9C7641A +1303D118AC0AFB7C87A371346C19944F5AB905B59AD125C892D213989989BCE2366CD210 +8A07518095BF0051EE471575E0189E41C7350F1DDC40526C34081730EDE9756CA029B128 +6C63DA99B0A4422DED67441301E7AC53A74190D24E9CC438FC2826339FF05E3B58F8FC83 +FB8F58B14DC842565BD87ADF791E8E4413030B60A484128B0A91F91EB8F69B90FAFEE2C8 +7326618D44D4845ED40A2DDA09B5CBE186E330D4BD84A49A28E3F5D1AA6B37773C12FEB6 +885436DA31DF8145CF2A993242E6F2177BC470F58DA16422C8BAF4FFAEBD8B0D4AD5D41C +A32147945C2158CB5113C64ABA334DA9EFE8A371332F1540E374E0AEBEAB6BDDFFD4545C +E156121E3348E6BC1D3120D4BA238EBBFE05AFA4FDFB3968494088F06109BD62AF8023B1 +1F8802FA6322E0F11C03C97C229C80C656EC7E96E4B5D7BC8040E0901BECB86D9A4A5C70 +52B867CB27F11307C4CF24BA0F56CF555DF0A8F247D5A98B1B04B19EE9B394B3FF9473B0 +2D943013C77EBEEF429D97B42BD8E25E251FD7BB352C3994DFF181324936F0AE8267CE8B +657D167E89F690B0079BB26351FC13A13F968BC5E99FD306DAFC454A5F1A7ED0F388CE57 +62AF1A627ED239CE9B4391FCA709030E0734D5D8E1F7F89B3BA991AB9D4AEA597C4B074A +69F44BC22323039A98347F49DF7A98BF48E617184A03E7276716DC5895B5628A004FCF5E +01C22F2304746521740C919F3BD418DE025AC898B104BF9D15DAFE189246D3FF215BE37C +E1134F41B0D0F0AD80719202E6E3691465AC0C9430C80028CBACD2B80A95A6C10F39A5F6 +12DD73AF2C3E4E0770FA137759F5ABFED0186BEAE50031C202975200B58CD5C7AF95E60A +DDB460008A52BB26F4847E6E290A2CCB1F984E97B899D7B63948411FB074178475CFC3DC +E212536D720C6F704C1458D45E5F2D7DA34903ECF51947DE98552CB2CC5705494121A96D +BABFF6E7B1CA155EC91D910DB288BA8DD87736EA60C2B5A35AD67E4C4B323F1CEFD5844F +1B6947FCC7A11305A1CF3CBE545C891CCB7A10F9685C9E2979F7DED90DD1D5C69B934635 +B1444A33B4CB56210DD269B7CE94BE1282EE7A2E2652CC743F33D25F1E83680DC05392F5 +31CE3343914C7E6C77D9A0AA13DA8E7A97B402924097FFF414076A8E055E76FEB93C4CBD +8841A560092F4ADCEAB9AD16D7EECD6696BB47AC93950A844B70386F77572A3766CF3AD2 +500DB126AD78931F8FA3D7DA41C1F3E8FC42CFAC03070E28707D0FCA1A6A837521BFC1C1 +86990ABEFB76BA56B8ED8475F19E3B6EB8AEB62EF86989559B76679FF475C79DEC1A0DD0 +FCFA1FE72E35E5A50086F49757FB1E65957488453EFEC4E973A48EEEA0F4D64054DC9667 +0AEF518AE6999EB2A61C1DC53795AD29A18F30369C3F4378B78DD76781E7B96C39D068E8 +819ACD8DDB59E4D0B60D42398E336838FAE48E164F7935EABCF60B8B6CDB887BA75245FB +F061E3756EBFC0ACA6E0FFE3CFE8D3F67FB75186DF4557165E1A492FD523C7343B1C2D37 +F05C4CEBC077B8DA778BE378F322AC5CC3B06C2A74687B0B3AF9D08D453753B5FC6E4289 +F362954B80C0E4DF1915E1719431244BF87E065B4A033E0B204E6072D006EB10DCB9F916 +0042925BB8A82EE47AB260686DF9EA59803AFD45C4D0B19234F6BE7913519D61B5E6250C +4E5BC6CF722B53B283F4D5E5D2AA7DE35B5C87FD62C9E9DFFD671BAE7E08E68E11710E80 +5448DE7D5D65F4AA2E27EF0FF16CA3E6569A53745123A9FD7F0DC8A57D1AAD7CAB961645 +F0BFA125101F21F64F0CEC860CE306F02FB0AF49F0C0C6D11B437FEA68992FAA2D6CDB42 +6686056F769470CDA1C158913715FDB4D4687D06545AC87BBD5283D8B9E1FD1B1B0F256D +7C675712C2A6622A179F5AC2ABCD06070A038068033D07E64E0C70DEAF9D61DB3F4EFEE9 +ACA908C30023FE3CB81597386872FB5D5557BD4461D513B6A62EFCBBD3062E67095F1DBB +3167E0338EAC1A52B38FED183AB520E882595FA77F561312F83C102B04486D2942CEE713 +92563D7E609E81354D6F8192CE3310890CFE69B41907B023C3451075383E4BCF6102A669 +4B0593D81EDC415CF7EE2C2803CE5810EDC28B09155F92CB20C139B43E07BFAB08978CD5 +65270BD77658B0D4259BBD9C3A2200B64F73ABE0D77CE6D491253C7590F98F3AA8AF8BD0 +5946A659EC1099D13E733C96A4D84405915B12D7A5399645D0C37C1944387D088FB083FD +22BDF34BB31B396F618C518DA593A9584F8ED6E9F299E72A6F0863B4A3C9F184B1AAFC98 +0CC313B225EE3384D2D814A4E96C744E0DC6A666114241DA125F1178D8F1D986B7D31548 +F9B6079DD38BDBC0AA94F135C44D8B7B6E9A0A0B63FB5BA59152E97F61515F49B906C9FD +42772EB4016B53417C5A2C8E881B0376656115231306FE3AEDEB6182220C2181DA354D5C +28E0D758C573C113542CB5346ABEA9B5BF0243146C186DC5AE0BD9505E5517A6224EA50C +315C9BCBF6707540621B95B9F0BCCA2DF5BF3E8021CE9DDD2A74B6DDB0E9F6DC8E3BFC11 +C0697E87E6C4C642D2172889DDF4C17FCD3E463B30D7A930E4B26BA7289702ED77F2AC66 +BC9ED957863A22905F0996D337CFAE61389D3C70ABE7444E8138BC1BC31F8E572C0CFAD6 +BE60B1AD639AD39BE03AD66728C1CE5B7F2DA53098008E10B82CC2BECEC7B45421F0BDA2 +183588B519182DD0C80B0EF409E2F34C38A7D205CACB19864507CCEF34C5B7A18B9FB51E +3AFBC0970A799FD34464F7AA8135C32914D4DBC466DE2922595EC4A255405D04139C0CD7 +F162674F39D8C01F1E6062B5C946F2F4F5E2F49ECDFE43D2642272377C5393E9717CE335 +11B8542FFF199FDA0867DDE128B387A39CAA79DAA1DA1388B88A5C921BED6709418DA595 +7C8D96831B6FFAB26238DD3D11181345B4AA07FEE3D76093BA5C069C9CFE9E823416B6ED +487308D542C84630AAEDDE0B59A256526169B820E56504014812661336692959ADEB6805 +C7091B7899F0EF46299C414925315D10A8C9652931AC7141FBD3DBB0C34476AB2808FF11 +9B10C17C796E67EF18A386F9E55E34E0D32701D1F77C78FB542D49C53337B9074D92DCC7 +0D4AE59389BF27E9CD453608A19855F6A976347AB95CEE2B07FFF6765F97E66978173C61 +61E38E6CC3BB2E278C61BDB601DB7835E9515D347F37A63EC6DADD2F72BCD46AA4FBC82E +EC40DC7ECB825867B98D6F457BE4502C98DA8756CB9285B7DD1C867B9FCCE8591EF331AF +44E38E3523AA39BF0922C6F59F1E9343AD34DD39DDF485FAC00B38EFF62E16CECB735ABF +903630A30396F2912163FA8B23E97F5B81E2B5B538C454967644E63B351B068EF4BA9B3E +70C65BF5BE8F0352F7C0E25EDB22716A632FD832D51AF2D26C880035D8017C02B0065DF8 +44E289E6D559125A31F76E256197DEEE1F2CE1D0BB7303A3CE177B692D3D0F8931A35048 +F86168DEEF39FEDD4860DBE06F21F21D35E8B982D299CC945E2C8E1D73D1891ACD1AE977 +9584F2F3E9B5621C6EEAFCF91E293996F35562C16AB5F35B6A0B55D9FA85FE3B08692C03 +E453B44C8E1438205A9F18DB136F954C7155DA1288BFB6927A4C308C86C682B78087FC5D +CD3976667B4CDFB90CF4E882B1C35D9515760DD4ECADABE73C3E9758E0A8A3B01BAA6A2F +091CFB987E893A722ED935642252512C3C3492FE736403EBFA8FD18FA9E9CC5B0E802E4A +CF77415626A072B3EA3C637D2F998B91B7A7274C2DB664F4A9D73595C2F47DD61E303403 +04E0DFCF9CF520E33AC7E0978B004641E5B6A88A0657F615C2FAC770AD1DF1E31BFF6E1B +8A32F32F0BE2A2649B9BF3F046D8ECF27A0AA62909D0A80262633733EFCB4C21A295120E +9B9D193A12073BB638C3BFE75AEAF1B3F43FBE3FBA8176DBFC8AB0CCD2E874DE912E3A7B +13421673D66744ACD888E2687051B8CBA461B90E7302963CC5DB88AE64303BE9BABD47BC +05A780E1545EB389973A5CF4CF9E53953DDD085E617213B10B3836101E98A0638C1CDCE7 +C9E0D9FE79D94FCA6472E2C9C9FAF3D7D9F260FC849EED1236AD5774045E52CB82B0F7A5 +FE589651B53D7E9FE4A8848A702D6D5D0A415337F6E8DC7148ECCF94B23AF1C11616158B +EB253C903DC963B61D2C27DDF6E13CDA799C54FF9762A1864E516B913C401713B8854414 +B4CA200EBFAA01F382C70F27589796D7EDD4A35334853B33347F231F24C1817657C93000 +2B59E0A2C4A9796822D5F7BFB3193DD9808398FDC53BC25F402AB126C1B2C83914888851 +037FF02EB53642AA0E6CCBF0ED5812527BB367DB4E67A6B8046DA7C215448808EAB80496 +FFADA52671C89E018CBC8D36CF78675E0A721FEE1112BF9C78D478024364E91CFE2468EF +B6A0BD9E1DA67863124D9F5F996EF1FED356C7FD2AA3DB3E3F6CA36262E896894FED244C +F3BFAD999C6F42F13D4AF617C03E29DD1F8ED75BD11F94B1BEA408ECFF117610EAFBF4FB +241AC338E6A8714A92F2A5AEDE86C493792743F648F2AF6E9A2C692A9669180F629947B2 +6474C03FB8B712031E24F7529143F432607D57E81CBB91A0DC6588EAD2DF8AB5C43C45EB +9DFA398AE8272E43503D987B36504181B2E9AF2357ECD3E6FDEC731B623D921F8D1D0A19 +027876125DC02D8FD29CD8521B36373D4498E2D2D9144C85BA8D5D9AF13BD5C8278F036D +ADADFACE6FFEFDADFB88D3CFF12B2CA14BBA16CA7267A4CAC32A0EDE215D7C0FC7EF3B6A +59A33CD5145E2D8E3530F94B5BECFF74357DBA205348FB22D4E3D40F77ACE73BF519CAE7 +5277729978A61B1B9B76E846EE15C8139B927EC9E2F8B684E0E5A30AF34A0027B9F2351A +B149CE2C8DC951CD54B4D6974E0BD74BA6C2F83BF680F0A01CB39D8B835C097E262A77D9 +55A699E86D30312427EDDD64EF7A3ABA1CCDEC22EFF658FBEB30B8FDF59A9C4185A55704 +530A1499CD700E1D6AD5DBDE3B662DAFEBDBB185C32C7E34406FA6B3878D5B564ACC5D9B +EDF6C7B42411081423FCD2BEB0AE7EE02272F547D551547A11F8CAF8D9F2CFD8FF3626E6 +3CCFFCF9277E6003911C54371677D671AB17424633B776DC98004EA4EA0917E085616ED1 +273E73F2FB891557CC5A9BB65FF704EE526EBF8B34359AF0381A61059E7B740D8069C128 +0F942C6410FE3ED272251F2653817FDDEF786B1F7BA9C6CE02C56C33D98E937EB303717A +1AA3FE1CE2D10A5D07F0E7DD4269F44488ED497E75C92657A2CBD792B9E3DEC8C073ED52 +661DC43A52A6A8218385FD37E1D7791E540F225AAA90480B69468660E05F5B826851F985 +8D127FF6ABA8E58C4F69961AD4896B4EAD41D14399A3F7588E04E63FC1435DBD45530015 +D9C5A1DE717D3923919C31B79898FF17D949F47D354CD81840DABDC5585E3ABF11E556F2 +9EFC55559AF05084F95A5900033AC0AA2FE370C49C71411B98B69DAD30D9D9F75DC90A04 +E59234156EB4B9DD2F923A2DF771818759BC86E763FF36898697F37343FE7197EF5ECCD5 +0933E2C446D7AD1AE945A87A3B7F62F8E14899729CEF06BCDBBF29D65ACA3EB4293CEF53 +501735F2DEE6CB331ADC94F27492130776C3E3B422975275C115A1E9882C6A4559A698D4 +46C5CBE11497CB48EE316810CE428A6A08BFFFB3D196DAD7BD4778F216055C79C325477C +92443E2978BE1EDFDE5836C722B96A070269D2D3A1438374BA6071FAD1FFC511BD8974A5 +803AFAA40E3509B10223D7924DF9215650E9F13E75293B799B4256B7DB4878F3936CFCBB +33D0A37E209A1E3EA8EE6A3455A84E28552DFD56BCCA0BFB10B7F7D25983D3865A9C617D +C85CECEF64CD8E470916B0111075DF6D051186CCCF48813C07E53D7DE553FA3B50B6F7D7 +EA60B3EF169527C6206D89C15436344E8C4AAA490C0D6F300D3A18EE3C50D30BE9ACB50D +5BAED6CA52732E7530C67CEFEC9ACE3659FF09897A62F22A6383F7B62289052485B2139C +48187D0FD3F64D65EF4E2678AB5133A09D448986C96C383FCA7E3518D91BD02A51BE54A2 +F7221ADC7317ECA49522C765BF38BE70EA692F063BEF59D5465E3D65DB466ECE7568BBB8 +526587C1A4FBCBA6D585509FC29F6223D68C4BA4AB48D83192EF4D323FCFCD2C399BA52F +776CF7CBC0F7B9F828A7441FC1540DF41FFE91718AC9CCE2EFD9D0E8D8FBCE8402B441A0 +AA2F95E4508D703E86875A48BC8C579A2CC0D3086B99290845A44B3E14B28D95246607D5 +ABD998C92B5CE660D40D31BBA97CAD73DB5ADA4613520BD4C4D19F34A9D3E57D66DB2090 +30CC7F57D5108AC7DF5F528C04A15B360C8CD1ACB78F090AC2518C1EA0D64F0DF393460E +25C7F07970E49ED6DAF204DD86A718DE11F8DEC66E247880CE1DF51FFD8A5797C63948A4 +80D37C43C508219F322B346B65ADB3A801FFB1033D409838FE05234432EFF0FE2127AB0B +EBC5890CB026BF94AAC5DD98E4153015B36D30B72E5192DD9D5EC6E8609423DDFF7339DE +5EAD4AE73019DFBF3BBD13FC154FCCE5F459FF033A826C7C4DE12ADE39CD85D3366B8CEA +64D4CC905F352424FE9120F447B75A51379885369A73600366055384C7BE79205D2B868A +1A6246C803C27D558DEE4EE108C013C6CFB8AC1016479E37C0FF0D4371ADE9EDBC986BE8 +A8861975C6761CF9DFB6F89244B2B447AA9E48E8EEBBFE1AD875AFE06D2BD72D0867FE65 +68D316B08DF35217AB5BC65200870036F850433BA2C26D1AF67C859E8DEA24AE44C6F303 +059B3AA2CC0F2DCBFA798E151627BB8CA785FEB783D59D10132725E44133655873FA414E +C6C9EB631DF1D0D3ABEF257BDFA9B1BBF6C17731195DB3B53EA289A0D3E63F41A330CBCE +863B1B6352A72A11F54C813595FA055BB5FF7F27735D4D3F5C87ED89FD18A4709B73CF8E +64F9793F12A0946B974A03C4BE4C1C2CEF752D57E323981438F021334D69737DB7B9A0CC +4CD5A93A3B9478DFEA4096D143BED8D3C4E19C7BE85436745B6BD0D54DE8DBCD1268E5AE +D92F8D23596A27B730088F4529D03E2C88966525D62C4A90D4869514362F605EBB9852AC +904758B83108A59E29BA45404380D86D51EC2567A3574A9C6889B22CC1C23063A782746A +02F43654B378E2C60A66F583FA666105EE8AC6C54C17AE79D0BDCAEFD951139FD96D45B8 +2F75F1928870A9876678588B6FF4B76F3062A0B895F8095ED27A8E620C2CA398EA161BF6 +9EEE9567D3C4CBE7ABC01D7AF30BFBB269CBBD0BCE7208BE1C94E95639E99337C56FBAF3 +AF87E956EBBBF2D87FFECC8B32220949A038C48BE761CAD77799F8191AC0975236C15458 +A7957630480517AC0F89026DC1B4AF3B005DA7DAEDBE41EA451D4B28516204427BACF5ED +968101E14C29396B7BBDAA67F10A602207F365E96CC6E050248C46BAE78348C4E016AB3F +1A1DB7E9BBDF6C8CD37615A12891667153DE23FC013ACBDE84E5E490FDBF9066C1CB00E0 +528714B54E71B5626E71D387B8FD41B21E2DD15CD595EEDD545A90E8F0D02388820B2A97 +527EF7DAA65732B6EE2F07E2936318FB75143DDE8F5FDE804346AEFF05637BF48A705A85 +B6F3863470ED141E118801AD9F47FB05BDC65AAF8F398BD3EB895C3AC5C94DB7CED1AE7D +1D7311DD67343AE0B5724A8827CC26E463AA76B00F4CD3168F1C92C64EAB1D001907B900 +6B1A12550668E688E2D0ED3355ED0271228CBBE4D56848F0B08EA24B00B5B20BAD06EE1B +C6606DAA509FDC41D2BE545F9FA650E8FBB0E78CC856A5331A8A6476FA3C44487B9F37AA +5DBDE9BE2A64C69CE8438170E2B40893AFFC0BE099EAB03E5034458D54BF9B64BEEF7167 +A25AEC8A1F7217E492E5674E4C8B343B9249B384BA88DCC4F8902FD4D535C0246E1609F5 +4285F84C2D4B489369576E74272255C329942F764CD4A51C730C99E7F5F8B7C52DD252C8 +500319E4CBE6C696C77CE1ED8BD05D22E4861CF9D156B95499B3718A47E5BEC9FD72E1DA +DBDBF137EFD6CF8BCE7D64A27B8C9BF6E24C929BF07F5A62BEC7BC760706D31B98DD8E87 +97559CF8E4357AC49FF6B47667228686A3AE789D68B059FBAB877F3F1BD00841A1F151E1 +EFA94F69BCF41D4F9DB5423430A2AD2BCD53BC87A5178F74EE469772FEFE1153C8454288 +31B12B8276E3E54162B64B393BBF23F1EAB4D1D385FFA5CB3C57809CAD0A453A10661D25 +685A9C56B41A53C3B1CE6E41418D8B8104A2BAF3667EC877C9B6269BCFCAACFAF695EAA6 +BF13891E52B4FBB7543F1BE26A867EE6B515DA051C3C7BA25BA135FC186D4379D9AB4949 +582692485409A5DC52BD6836D8CADC2A48A4F5B4FCDC69099C3EFC7166ED293A795DFDC7 +3FC01A91C9C15219723FEA15A4FAAC3511AE8D0DCCAA1FDDF7E2AF4CBA80E38FC6D2D8E5 +B9AFE27366ADFF0529348BE4E56484F0E31BFB7B9DA4F06626599FEAD323CA644677794F +541EC7888B181EB0AAED60E6F0E5FB4F2FE2564E2988D6441E58C2C0C1DE63CF65D625B1 +46FC422A0E0E77C43C8FA2CCD310B5694EC8CD1B9A3ABFFA25687D4013C0E5703094D5ED +37295E540A1B2B2E836FF73B23E8CDD190D1FC04DC6CB9D5947AA853F6748388D400B6FC +7DCCA73AFE6D1FBC61A7A3AEE4D24BA702A2F4493D484F19CDA1A850C95486E4E4D43F8A +A584D14F82AA0B3862E1FB06E941A90FEACC607D27AE58CF19399886879BAB287A429D5C +0C821C26C61F169F1B90CF77878968F56737041BE38776374546623553223E6E2A8682E7 +737528C915EBD41B263DF7E12E4A4C6967FAE40F90DA0D0410E0F22BDE01F018D63A8C23 +C157E72C6910157A63B33AAC9E5F3C58F771B8CD24F0E24C4EC17277C8B8DE5DDE52176F +A9740EAD3F62125BE32678C35005CD445EEAB9AA1E9A71FD11614426E171EE85F5D9A17C +536C87D58C5140A64B080966EC5A3E0AED8BACE84496BD019E6023AB562FBC1F28CBF296 +3FF98D715ACEF7BDDDFD65DB78CB3F0E16C440EE636A0D7C05CB97C085F7C5222ACC6305 +4DA8C3F7D950B0399B7250BCB66D0D520AB951530E728B4892779DF0FE56C9A27E279DD5 +02883DD2E2E4013D03491C52B21DCE600D68156106418DF5273C6F6FC9A3E1E9889DCE43 +17628702B21201E48D23A7E0EC5E1DAF104F3BA1F659B8FDCE301C3D7ACAE1B7CD6846BD +496B16BF6DAC876C117242B3088287DF82F260F960CF90849F515702F71EED275A40A579 +B0B8F707681B5FAB21A81FD992254AFC0D43E88D641445FDAE5D6874C4EC37B2BE38D5B4 +6DEB232B7100BCABA7ABBD53F5455EB07ECFA23B1703A2690869A8D0E60276830D7B4FAB +231FDF2784CC788CE61A4909B89C5B8A5791FC3160166BAB1BE25E57BFB2D162CFCF36D9 +CE524A56A15DC752BDEE0CFE605E5BA650ACCF0DE4286C70EDDFDF8527A02C3958B17C82 +1769E8EE3E46FCD93AFABBDAE4809836C56C242B0C6C63107AC6C3364B7C79BA5C62BF62 +EB6277B4F6905CB999C568AE118A690FCBDB37433DD2B360A7C66EB52DAEB0662D61DE6A +74637C6C8B373F9EF9A473486F3A4326ED5A442BD2566912C9531C5EA6BA89553FB67C16 +1933CA4D7FF5886F2F6B3ACEBF939B682968D4B0590B0D39A0871A78EF3885E47F892C16 +FE93101266B12AB988DB622F4E408C442937B56007334AE919983566CCF994B3084C0D42 +5EF94563A51CB142F0829F5398B647AAC6E0010DFCCCCC15BD0EA5A6CC90EF8F790980F1 +4C8A27B2792B3C83E1317CB932DB3B28F008D442D374AA75573F5A324D7C5D6DE8ABE5D2 +CF78A931DCCAD7831AC5A7A5D5DE80E475DB271F0CD21A47B1E7DB5233705ED0D421EC5A +2BEE73D5949400151866E065B28D6E1F6574E2D335BB542D16EDA5823886430390F9A0D2 +B937F7ABD1DA9E04894ABC066F8CF0B8BC196BC1465A378BA14D2284AE4DEA134DDD7440 +77DBA60CD0F9E478EAE5F7DC0D6309C9EA514D44C279700088581B29BC0136E2F4EA3E9B +64403DDB054736966C331AC20514637A3CAAD1B27C569045C444D48FFB63091B6D20CC67 +FA5034880794ACF58358861548044DACE9BF02B4A23925639B7A6A5DD4B6AEB2F18C1619 +DA2E4597905CF4A00ADA215FF258BF38FEE6923D67424DC1B05015C8D09DB1FB7F660C6D +E061FA2690AF2CA528AFDDEAEEBE6291D61955BE374DEBC8A915639DBC5382A17810993F +92E7EB5D2492E76F6142679171DB74170A6B390CBF7E13CD5307CF04D4C471BE0C7EFEEF +B36F609D765DAFF2E682983BB0CA6B70B713F1217C8F2272637C8AE97B3E15D5D451AAF0 +44FA166A93B277E334DB8EC58EA397CD013B53DE2D7944387712E80F086942728B9A4877 +C1193716F71ABCD563EA769AA555CA4C48FBAB634B1AACB77C7A576C4DEE78C5CCE3D3F6 +E483B076A4024292A35BC7080245E56B6D58926983C0D9C31206130B3B8AD5CCCF8A8659 +465C36D5C5FBEDD7B455EB4BAFF35AAAA12BEBFC6A7B40AA15B5B957625C37494177CBD3 +E3E59740FE558926927022C6411B9F07ED9BBC31AD206944E56146CA8BC0A9E8C9172C0C +0B7C46FCB490EBD02E86F69564B8030A3280E376839D680786A0A068DFCF0A3DA5048898 +69C9AF0362765CB583B785FE8C0FDCCE4F39527A7B73565CEC9E798FCE909941522819D4 +519A12043D35DCFA7D9188EDFEE780E04A868346C68A3ACE74B16641873B8985C1F0C263 +9BF63ED86CB556943932F9AC71096EC23E9584C8CEC8E95C52A493E4463B168BEB6F259E +71B2B22B53554E487A897256E37BD4C1D3B48DA9AA5C5CB8D5D85C61D6E1BE3A607BEF1A +A8ACD46A93FE3C07D0BB9EBBAAF0433C7E5C6D5040CF9F5AFFB1AD8104D1328005CC5B10 +A1993D3EEAF3C3BA4A0B1A260A72DDA6ABD5358DE5171F1DBAB667AC022F46D3BDE54809 +790CC4EA533392E6C039013D4B0FA21E36143CD9E708C89CB13E09D624551CF86BB79C3F +13868988903A7C5C744743FC8CC6B48219FBFFA584E016953F8CF342DCD69077D9387A34 +EEFAD0463AD98FCE21EE8342A3CC4B9CC10F6804EE9CAF70FD1C56CFEF02B7CF2D89CBAA +E45918EC9445AF3D1C43DFA501D9B3789314063A748A6907BEC153F294D6D046B9C76D01 +4CC021D3074C0A2D8E92B45EBF14C1C5AA39546A2362CB8A6FA0F5198AF84119260DA3D3 +A89AAF0A976B1D5A020ED16268C8F1908400DDB8E27F57DC2B00E3E4F0DF1777A934DD89 +311A8C7309C24A670A6A9E03C094B548D223C31521DD7FC2BEB3DEFAF7904EC0123FFBE5 +4E627D9AEF3AD29FBAC003520D0B165F3AE91AC94FD8F3FA9A6BF9FB81863D03BEF8506A +A74C7DC0B50BD327C6942905BD07FBD62E4C3B16A06070BDFBD80414CB9D5261A5F721CD +FC7D1F1A6811E1362F9372CBAA3C8DA63BB103B2C10BF6F2504306DB05835B80FB70BC39 +DEC4DB3ED1EC4C2B64CC907D751407B6B8379F449210D0BB68CA1C445ACEEBF9C31419B2 +C4C5B8780991D042AB3948A5C5C8005E0BE1859B13F8AE6D4AF62F00B415BE5BB641B964 +53F037C492B988D839B96AC0FE01DC0EA9E064FF06EFFEFA446F41AE8E44AE58355CBBE4 +57DBEE1EACEBE69E6686B687CFFE11DDF76C2EEEB6662B1A2A176BA63E8800A51160A6DB +886AC4C5868D17487273984BA2A47F39837F197D6A9B279D71157B6ECC2A72F83C1A5C45 +B17698F3183C00B6A61C732604E5520320309069628602318F4F68DF0BBC2BAC6E90D1DD +ADAA738EFDC3F63E8F24DEC44D41D2CA546AAB5A88FF61081C144DF568F35C21A887FBAD +C87166B58486340679B5F844DBDD772E9848400746A207BD04F470D2B2F14A36225FD693 +E1BC7CD6AA3BC7FE471C56B411B084FF8A67B0B42954C0915C7388BCC44DB2CBA0A70F4B +1692AC59029B8181D12F6A1F22170E04696799AECE8E6B4A96FE89B7A18A4B6684815BAB +D8D94F98302D44EA827914CFDE8CAC4CE48586630DDDE0FD1F9A57E8AB0EBD27F6A25186 +7986192B6D3F46C796247B1A220455A49745710E32F4D03B4F15636197C6F84967054365 +F7C0B1C20DADB63AA474551586EA5F055F8F3EBB1214ACB3128D4C6FA566C8E506DAD848 +6DC4A245D1977218241A5FC37AF7C03342EEEEEDB2EADED36EC0C43BA42F14E3E9601784 +5780F5C6E5262D96C0C50C87C9CE4E4666D1EF982FA7D4F99EB0A5EF4AB0456FEA1225A4 +E6873C1B6888ABEDCB0D84275EB400E73695564A15E338E00DC77981DE14FEFB40796373 +631102384B1A3C0EC239F19A2DEF2689F75F5D55E22AE9EA06A8A33424765D84E458AF21 +B8C99E6BBBE5517587FF76E7D02BC5AE43007F2228014951C93C50EE50EAB764BFC8A084 +86E97549CC9A8C53E442C8AF409C98382080D32974A105D60383E077138C34F887159B4D +5745F7B6443B446C5840BB92A3B0BC317EDB0CAC5310AEBF16285AD0C4DCDE6E27C0185E +9CA90D3086D6E11EB43E65F25F74377AE8BABC97E0D9ACFDC1339D0613600BF6E2F6FCBF +66A0AAAEBDF0E9B3241F57D08C17612666F8286FC17AD0CCC5AF7F355668E146C3FF61EC +07A85AD2A655DACD2CC58D5D0216CCE6F8621405AC7A4A160B6B2C9B6C5857D40A5BFABC +199AD07AE8BE3169A9182F81F80A094608F1C2B894A6CC33CE4DB65AC02E3528601A27B0 +FB7E14B2B97F6391B0CC8963A71C6794E74037CED7C0F2D9B7EA192C44A5C1EC78535F45 +A5A38F6C9E9E811B950B7D0B2BCC7AB21E8B10057E64A72CD86549B52D74C806C242FEAD +5751BBF62735377DF1C0582C89B0794D01FDA343EFA486AB2746A6780508206D0C42F020 +94F3B8ED6371412FD4CFF17DB123DD857DF02FEF68954C8A64FAE88C67351FFE15834360 +1F9DA7526CDD58BAFD5372A39BB7AF47A04BA972ED382B7CE3FDD92B98B9147EC77C5496 +773F33E58D6B9F48447D3BEB6B12CF2FA194EBD93B318014CA0EFE61E6299E097B394F88 +6D15B7DE6DBDD12A8B38C5D0F328FCA5798E951D950DED554353AFC64543CF6735456CA2 +72333B0797B4CF24D247BC76F9FD325A2044F01046343862E92591CF371C1A2F6118E36D +2AA1EECFFBE7115C525A722072311E353526224622B96265B29C10F6FA3E35B8B4AC8AB9 +084F74CA7C2E39C19361F97BADE96E7962B8356C92DCCE8B5AB85C48F569001F238D113E +8E0D83B793ABB238B8DBEDF30F33BE03ED480AE7672942C7F60FBB2B2ED85451DBEC08D6 +3F33AF72437E6598E90C52D62319A1F2018AAB1155506A96D4F2558004CAA6EC715D8EF5 +A34C7779ABAF2CC9A288DD88B96F0F3F1E45A6A7049348446526EF562DAB4EDDD8BB3030 +E913252DED80A8075C1C93E27509193CAEEDC132A3176490B03C53DACCC26417A5838515 +FD4A8093EAF7718341F9A6973474EBD66C63884BC78E318CF04B9D3449196110EB6BC018 +C1DB6CCBCA2ECD1016F1E884320B14B27BB8A15FB42E190C30E45965C32C21104F49FAA5 +B3F983C768BE7C909127C19EE6392D6E9E698D650CEFB7AE48B2442522D88C6D6FDA41DA +B8B3187F497DA1BDA3FDBC8B71A619063D9461393FFD5A072F237B7FAB49597636B7A41E +91DE676102B0FB2ECB4D5135C015B99419925667444BAB52923DE73287D3934DCB1BDE9E +72ECC4C55A55BB24A71B5A37960993BC88A0C66B82C2E2AD597EDAE4F74FE918106413E7 +233C832EAD1D2A2E515D734960730EDB2A8072D539E2C69CC5C9E569109B20670157AB44 +41BC249E8DAECBD9F2115663E7C88AD8C4067158B822CB278DBE410E8B1E3E79D4E20C6A +E8FBB5746390C823D5D818C3583A41A2D080DF439916FF23709C6E816F7DA9FCC60E5B6B +FD17813DC59636D33A2523AED576BCDFB0DC88725D6B6F286B2C3DD85E53D825DFAAC9A8 +8572519A254CB4435907A2A57EE96CE3078F80E24C0DB0FC3B047684460F5314B1EE091D +6CE4B884D06DEEBB7E1ADF4B44376699AEBD7A5F4AE19B5FF8022459E9E2D43117F4C1D7 +630028D14169FBCB72DDBE7E4BFB4B7EE1DCEEEB91623718BD1E5B9E16DD4F3ED2469BC3 +1BE0D51A530DE079DE096431EB3C624898333E4A271A79D33816881ECA7C355C1C0EDE72 +039E2800D050F507D05D8DC2A6F79C1E58D269B1CF397160A813A827B5D5060CE32B3454 +DBFD65339F3B75CEA60BE92A1848B7CA7EB730BFA278E8D549D3DC68E9EB32553FA32360 +4F516DCCC56EB0751383005BCA15849491D9A0BA4227295B88BD819FAE10216E1E2F7CCC +DE0FA17076C881DC4ED1E03F3004437849D059449BF180F4E5A547218D6CA90D235A179F +BE73FCDE7531099D073127D048B9D3050959CD6DB6FF19E57BB9F296536E33293F4856B8 +20A8E948E00F7FB3226F846EAB9F1A7DFCB11871E7B85C4A7BE6A023BDB2314FD77868FB +E02DA316769382443FDE43AD3979D243726923904918AB90A8405B0184189C7FD724DD7A +E4EA99A6E31C18B5A00448A8146A9897584A935118BBD8F7BA9EC471461E5D932434345B +630674C3ACD3C97E0A5C1E6FB286D9A3ECF40FA51AD7C1FF9992E0EFB3633F4FE8450FB2 +15947E2AA9E07D07A98723DFF9D31CF3C50C4796D98DEBE12BD475765D8AEA0180CCB73E +C33CC144FCE23D5D90282349CB17E9FA753A6B8D0F3FA480C5D6D4E11FB30393DC4A774A +6C568A6794F6C71DBB7A1E0D9F5BF8DAF1EC3CC18CB067FF86201124CA66FD8F7B884910 +DF8511ECA9F027A27CBD235BA14613E32213923BE966B04A79A6328431B07F762BD7AADB +CAC4E00EC767F91C3BDC7FB20329CBC2A91A98EF384CEAB49CE57F3A4D83C4A690E49D37 +BA278E9D39B92740923B3F3E5B8AA7743F2B8EFAA230C211884999091373843DBE82C2B2 +3FF81D8D7BDD75E9782C9F3BA1C587402A335ED42FE47F837366C61306807EB50BAB23F7 +196DD1080B0389BD1221115F17D9B51FC600C77D5B02D78F05ED65F895AD34CCEB36EFDD +8A3289F4AC4472CC5513E688B96053B6DB54198E0C0B51C3FA3723AB54F2615E0FD7B488 +B3DF35A895E558A05C100605A213129C0D8DF08C92A772450F2F1EE7806DF2B5C5DB82BC +4B72137716329403F9CCF85B592DDA02CD4FA4780D60E8B9BD7D079C59070046432F8A2D +8BCE7098D4A81E6933807B0D9EB617C2D8F7DC8E29A5C10030C93918378EC771EAC7FC78 +9BB4D5D1CB078D4B2F0F239039EF9F1B45D768CF1870089F76F54F86CF4BF7A443A1B333 +EBA476838752720F8ACF49C0147F62068606057E9E8F55D3C26BC0328216D6E55B9A18E8 +BD8FDC0AE1FBD60D1244AE9B060313ED36231A8610D0DB8BBF8B9D0C218082678F828853 +2BF2FCCB4E13251E1FB176AF17CFD1B4E74B195FD65493F74C9755562D91D83CDBBF8693 +161FD054345DC816F885596C6B5F423605D0DA925E27D8A44F6EC50E36C368B29AF9FA5F +7D634E4390814758A934E216DC092F352B49916F6F117EEC457AF1029FD0FA1B267BF519 +C85866DB602A67F6ADCB772EE699DF5FBE9799BD6B0CDFEBFAF2FFBA9E7D1C7A4E9A8D72 +B1730290E8EF082B6313E162E1C1EFFC7A404C28B4B3E4C9485041E941455CEC85C94BC6 +B727E5872EC049B0F6654CA3F21E107FFC105175C30BD172B8FEE93D16EB85F14DC911AA +E9CAB4579778040FCC18F15C35F5CB1DDAB8C393476B882571B1C81777835F011B5DC4D7 +91703453E60205ADB46E9F9049F980603DEFA613F14F370EC8729C5D365BC4D128C65114 +833F57FEAA89834597C2AAFCDB74C5CA0A35B6C380EB029CBCEF5B7BE1D253760653677A +78D18C6230986DA5EBC43888B7CD821C1EDC997A4A3574F695CFBECB60C7F07C5FC4B9CD +CC49ED481593019AB8400DAE0BCA31F101B5483B3DCC330631F1EC7F4E5D3EB5D6E38ABE +DE013DBDDD4FF6D9689C2F4F3E7D0F2FAD680B94B5375853A079678C3C2FD7CECE27C8F8 +7603BA3C73B1CA9CD33F9D114630E413F118161CE5C6B38C8C5827710231B9E8905FAD73 +DB3AC1FB0C7883FB8C0A96E05859265637903B41E662CC4D5FB36368E4400737C5F34F1F +465CB2065E90A9B453C7D2A3102CE69537616A15A462087234A358808EECECF2E1704E35 +0AF5A17DFC5D5E83798E98861B94A1170CB4DA8BCA63957EB1B7E0515CAAEC440A291161 +F6B81BA7DEC7270FD3F2C07B8629E1CE3FF15376660078185A05C41D4FBF99285413F001 +4CE1D20E4EB2EF6676D1AA2FA8A4DC9BD3AF6F664F9B4E4B3BCF606D14AEA0DBC253E9A8 +75AB27F3D5A7328850C2E90B6BDA2420E82BC0ADF07C005357514257694FD442A6E701EC +CC91B7E0845B17CC8F09892BA35CD5334DD73AA0424AE8A0E1CA52D2109E62EDE237177F +1B469CDCB95F1ED1934C09C1C71A9061D0C29059C00D7A6CC1DD2AA2DDC209164890161E +8B4532199F7A5503A4438B3769C9E1F8368764D4F5A5FC7CB397E27844ABC9F2498A6BBD +B6AA3C33125B52F692D2E4ED469E7B3ED78D60BA285131AA78F581FECEDADBFD2E7932A2 +D96A86944BC7D3F511558E3BFD8AE1250924162874186ED3D12210C79C044682F7BC3029 +D9A352D3533BD903F26A180686482129DE478F6A0FAD7DFCB9EF25F13260B9B0273645B6 +24583701E37773426743C9AD1569FCB3C69277C3958944EB211758D1787C86F9DB344713 +9F522EC5328337AA586BDE5B734EBC6F5F392F7BD9D6910F204C63E9529C9561FEEFF567 +800BCB0E900BB465DE21A576A809A13F3E4FB24A9223B41E52BC297040808840FC7FE337 +7B7B71A0318EFEA9A421FBCF3B797BE09579FC5559C3085163CCD30F2757E457A04923FF +DD33B439351FBA13AF5DF216A968D8F093540D70222A5F98CF9E6EE6FA6ABA02B3BFFFFF +1AD6B5A3E48298FDB66E69459C7E9646829B032E99DBC5B4C98731D868D14159E95224EA +9237CFDF32A20DA1A4CAFC0D55CB9DC4BAE3468A0A91EEACB9F6C76F677DC6BB83BABAC6 +7A7238F67F41F0A67EAE0578F56D3734C87304C0D3800E9B52DBCFF05F6EAA9440691225 +CAAB4C86856463B0E0ECE208CF4920871DB1EADA477879A4C64194DDC2325040FA104327 +FEE2F853DB4515C154B3B8A78419DC4B17C78F14BE6C7E8BB47388B11075474AEC54D6AA +C53AE725242BA69651DCDDBA6774C3DB95B947A044D009DE74575030C947F25274EB0A1D +331D25E53F231FE7C2B7817F44B6E98D0B845BD0A31DD9C8E3B6845CC80B259C0B850278 +5E0542CD65CDD0102FADBA33501C1251340F10AC63988FF53BAA60345A145455009B80E6 +D67C8722B22FBB74554A88B0284F641DA252B9A2556B5EC15DE1EB75C0F74CBEF4FF7CA9 +50B90497D23A935511F5B7EEA0B92BC686D71EA186B49B21E9183279379637F8BC3A3079 +3419AB94A6EAB55F602ED0D4EB20BF6AE82050C432FEA1EA3B5BF2A16B879E586C1130D6 +CD5682D7A1F51704EB03EEF129D7994D80183B70E3D60A5EE4CA8E21D4703605FC8E2CDC +03E1FD17A2B788FD74DA79A0942856C022E9ED417BE6F097328E22717AD8A4976A855FC1 +5B8CDCB66FCAD6E6D87021578F2A3D93CBA708390E849C1A96E234EB91F54F53299529BF +1BD1DC11722FB9DB27C98F2FB05D62DA1B7EA32CFEA033EF7C1C47B3FFCFD9A4BCBAEE4D +66C94E8488D397644A2735E9AC8E0A5B4C61504D43D85B27026F15059B0717A0E9C2A893 +FD1A0C53815951FE68958615A581D9F1C22DDB219C3C7213F20C496AA0D04E9B3957F71F +94A2A9E20FC1DE943A30D72E20E0DC0AD7D974164656FFA36F1940909464CA435D47546F +4E74ACC7817BB6842CF97FF285E4EABC7CFFC7A314983AD5DE3FA821AEBA7E95252B0524 +D423F8FE71FC1E4D8883876DAB19415FF39A330D8F1F2E9E728F2D47EA05397F8F6D4A17 +7BE4BE649DB34CD403FE663509DB51FA3DBB4F3DBF4C969DDE8E18CC54AEFDBB23E286F3 +EF0AD94165558C2E1E91854A7B2D547735A3BF9A4AD940C328709F99801FD5CE9EB34C2C +394BC530B2F79D6EB01FB151A20C03F64A76D6018699B09BABE16CCCFC516FE46A906633 +26E06B7BA28EE26134B52B96696BBA8A235103E8516FEDF892039A768C632C39CEDB3AAC +19D71D351AE1DBDC46ADA5D3D547084243A87FECF11DD3A99C79E08A17969322C177544A +A0A79990D1C52BDE6777A77DE02D9E9192A6D06D4B1D2FA19A95D1EB5B2F700A3D76D383 +D6D8E68D85759C829BA020BEA26587350B8BB4A22BB437999F0207B51E3C29508CE76AD0 +CF2FDDE225F0A1C2437E8607CD180CCE7A4975A535A9F1AE496A3A7D83A276C67BAA1981 +66BD3AACFA8CF66632E6D18D256F878143ED7EC542D7C29F16B0CE96D65201519B1A1C6F +941B4812CE4597C92727C2B1E3D41AB59F3B026C32230374B012491D5DC66E20871B0EFA +4A1989D8AB26B772A7BE6002E4FB4AF7F5DD5B0639FB0E59349A6AD7522240F19DEFAC33 +D0FD050E565E36E87C5CBF0D924A3EC16BCB31277F53770CDC95254C0B9DF1CBEA0D4386 +299D005AC2C1B4985DED85978FA75596D95488F9A16F77CD6572064B658D6FBB7F765CC3 +18C1032AB570E04589F6B56A67E0DA0D485062899BBB0E760E649B0485B13F76922AFF97 +59BF4651ABD8AE83EAB7544A2CF451E9BB18F0C4EEB431D46B65CC1B9049F243FE740FB0 +276059C3A80EAC689D5A511399334BBEFEE83FE0138D3F46FDE381EA63DD0A5AC4E36754 +BA7AC6784CF3A1428945483EC5DF805B846C2C758EEC2DF8A63B55EB7FC0762080071E10 +EEDAE6674E5539B69A6335C68F1FC10BF1F41157D082CB9376292CDD4362F14185D87F50 +369E7B562DD7F75DCBC86A5E8187192B61E3EC233F9E26230855498C1A580470CC20E233 +C8215A825640A89D8E21E4FC2A4EC8CE44778B4C96B217C0CDB6D2645FD5E4DC24D293C3 +84512BDF80C6B99FE14E429AB9C08E7AB2D752F44C1E826E91DF652505F6C84F050707B7 +9E222C6861D5302739CF4561C0A5FF82CCF7E7BB2B3F23360B8B0AFE8D3A272F6EAEB35F +5419938DA96A1EF1FB50DEFDB9C9895BAA791556F51D3BFDC373AC0FEE03560918977CB7 +851EDC56750C708883149FA8D939B5BC7F7035ED3E2F2CE7295765C0BC09FA3E18D350C9 +9B40E2810C1FD915C2AF3AF93855AEA12DBA06896A51C9B2443E2D9A9068FC76E353699C +B8A782C2126D7947101849809294F5763E150498F31BFE1D5D8AF704BB59176DA3DF2CF9 +0013ECB8E30250E5AF4152D892F4BE558D140613936DF6F9D43629B1594FBBA870B0FE5D +1BC168BC183C60BA2ACB3C9BE52F853AD4FC1B009801ADC0FB070C65084ECD3165874E91 +4915B5F188E4CC3BC03240CBE3224662D2B3AB7B3E177E6ED05C7EDC0E96600FF6527A4F +2A63179E47E74DD67A4D11BB1954DD479D7B66FA38BCBC85411B841D963417853482EDC6 +0753CBD2E0B0EA725170E33CF7B7F801BB348538360EF54A01CEB35AD465CFAF5ECA3EA0 +CE3DA1240E1C94A7F88375ABC46AFB407FED5EDBFDD79AF542956435D271EA685D9E8474 +ADBB88246355C959AE1408A5C4E9209FEF36253B0EA5DF070DF4BB364FFA3386A7FDA80C +046EE0F54552D258C3BF0C964718077914D4A43854FEB495FC4D421C2939978770ABD337 +3160C7D8C9D81F1F3ECF40D24885AD5F26805DFAFFBE9661031313540B02E71E1B9676F1 +5DA9BC5311178BE39B0FB98F3D7F1064B7E76FE3A15315E234C712AF8542E4E1CA1BC2E0 +8AE69382A34FAEFA2E0F67A6B62144B0C767A45C5DB57648171D43E8E07611E04E230C15 +5A16B786236833B51833EA22321EE4A3B2E273EA7D452957438428BBBBA25E31A5332106 +54AAB61F2302CE54F7B2A0128327D60ECDDE0E455FA05B16747F75D9A27638A174482ED5 +DD91C796158D9A20FB380971BC4E30FF0BC9B9556B4B53085044044AB9418C2144087A39 +3FF2988DAC87F5B872684A327B30E362978BB4903DE7A4C3967F62712B8EA2221CFE4BC8 +72E0EB73E63A06844ECC468DD8C9D2D774C3332553B9FFE6143545F214E3DCC512E15990 +9EA880363696C962E6912D26FEF0618B88BD1587CA13C3A82A423F19CF9347D55D005380 +3B1B91B352177813C3E20C5F04AB4B9A2AA11CD39E11125CEAC385C25299DE0B617D81AD +8091CE925DBF4675E7D70A515B83800F1115762A7E964FCAE0C61BEFEAE27CD77E39153B +DAA1C87FBAC70011B9A0F62A838A8122903AC09A39E53F56935778804BF3D025F664A9C4 +3E314ED0673FEA3ED9857079FC6A49A8B77617014A7054017601B5C6E75C8CD05F89C2DF +D8ED46914521C2D972BBE86480177A3A2B2DD174C77BE7FC9E0069568B392C124774A1D8 +DED4DB00F17024B55A5048A4F33C6EC5B0BB43EE3AAB650D9BE28160D4C0F128BE5FA21A +A29DC060CBDABAD9BDD6CE0B5A4B2051E038794AEA31C482C2B5586320652D940FC3D6A8 +012EBE0EABD7BC1491162F8FC1C40D07B904B5758515C1286DE71562A790E8A86B6D626D +6327F9C7EE4EAEF270D5A6081025B95DBB7F57C33B819CD417850311E3CA2899703649A2 +623255DF77C213A59602CB749F49A381C6101D27D7975ECB414D601B1F893AB8B8159410 +E92550514FE10C04C2D218C7B8EFAB3A007816C50B3CB724411558E8DC8520908C205239 +501DB6FF5B5CE1767C7EFAACE931987BE0797361B3565571F440FE447A168AB3360C3E36 +1E6DCF8F6482885ADEEED01DFA23F47C6B44E6268DAA6962225B10D37E57E20D9C55376B +9D6A880A90D535F91D3893FC09B5409F2D2A428BBBEF2D9DC4686BFF8A863A6CCAE5FCBC +5090B2B9841AD3205B0EFBFF72AABED459118C799C6B281B64500243BCF11D5531BB74F8 +A7F676670EA1342A41AC8FBCAF459C9D11D5673A0592AFF53ACD4B94904F7FB3759C59A2 +A7E5FC2126ABFB56535D0A6240CDB83223EDE4371D910931D7994AE05CDC24FD81FE8126 +5E40835FCED262A0DEE35F705E0668983D65A8CE7DB1177CA8B7BE0A73A99D4D3C44F401 +DD6CC8CC119FC36438F18A924D6DE1C2040D2BAFE336277A751D6D4D05A828AB3FB8BD48 +A7DE7C166360788AC8DD81662727B330D860166B2AE789181E4231B5AA3A205663024162 +C053F2213D30B5102B3C430F9B67E3FCE64FBA1BB617DE61D2A64FECEF8B6BE7D4074E75 +DD4AA701474CB17982EC4203E1754A19DE41874EE1818BD4F243869BEA6422CDAD1FDE4A +84A1410C9BC92A32525D6DC52EF3E90F5829CEA418542FCA02FDA62666386F628543CB04 +D08188E6B9B0092E6D00C6C75C5CA9436AD0597C741D4B2C63E585470994B5466C509B0F +D077B49D87DD6BBEAC8C6C4197B9C0789025B49BDD9534F42CCF987DF9B04B18D19F9343 +A91696E0E206F4DBDEB45D6D7697B49C4FF5584800CB512611EEC8415BFE1983BA96BB82 +3AC3E496D9D79C6426B97A1455E070695A27E407CCFCE7472F147EC95134B89BFFB87146 +982FB4756612EE55A782F303B54670333FC04E707FCB84D255B05D52AFAE8F473E8C4FF1 +F6E95EC1B820ACD2D3E980A1B778C4568693AFD446C6E416C48A45CBAD61564329C4ECB3 +A98B4ECFB3551D1F1C03717D29A5DB62C8F1B21D036714A94CE536D0E84E3E10800AB513 +91E05C62F2A9FFEB3A738E3262E1919FDF43EF49842F6EE5D309FDFFA0B74FF64262AB5E +813C8042B2F450A5CF7B547A8383039E7C14567EAFCE9644DAB0A54249EDCF4C24EFEF7B +B3EF129DF5A11E12A78FEBA6080680AF4476F4C0AFF6E8B27B07D6EBBF5B1FEB28341344 +3154B99A65CFE335224F382137E3AC87777A6719AC1CA6832B61AE8CD6A1931105707F0A +DDA25615B526EA2543F6FAFD00D70E4091B6D5D58C9CD62B19C70D7469F6FDCABAE2A517 +66C9B0DB0AB351973A4E2FDFF81DB1651DEDB905ACC447FAB2B2803E90DF264C96092528 +8211E23246BF45FD1AC67983A7FD5B371581B8BED06B9CF8E6AA6C4BC84771219E7404B5 +6DCD474D9B859D1891FC2231869763E6B8F0615D7AE7B83260DE84BA39D6D60F50BA70A9 +EA8FAC771A0F0A745932D00C1328806D938CAE671B94EEFF484E5FBE9A74A97CAD47358E +A3CE9F399407407FC199677DD7BB6B7B9B00AAE6EA1633EE18DDBD40FEFD138F8423B304 +4B9E9AB192B7C767D7D63AAC804F0D5309E0FE72A8259BF12DBE7A215B8FC8460C285C4E +26067E3C558163C1622617B082C6FC941F8563CF4ABECD0DBF79CD5DD86B492E3C46D0DA +BD16AC96ECD6B41212431FECB4EF59DC7DD3071CE030BD5DE690BCDDEA9A2594C50CF77D +53B223EEA513B40CEC7005C4F6B6DE2D3680EAFFB6FBE0DE70E7DB5C11F2BD4085C123A4 +73E5CA0785FE70E38E081B5971D4C390A87CF5DD83C8BD63C4307D22A1680792E27FC431 +8D403102A052645B4AAA9BEEE578CA28E2C15DFE12134BCCB2171C15A45C5D4D8ACC0EE4 +A2C8AF801D64D5979E52AC410A69277160104A386D747814F0DC0C178CCC2BB40E175992 +9D3F05ED411630ADFB8E4E57CD223E012F457A8A7C2BEF27BDFD41D3B39673ACEB92A48C +E3464A8720196A60E21C1736066FD19154C02D7BC22E821C76F4B89185FA39B48B00BB85 +AE14236DFF7E1EE1466C65A1B4B9453D8ACF727CDC0EA04D85E2A4F41976E4833C145444 +B0465FBCF96BEA9554304FBFBA4C39ED11F2E1D9588EAC200B31441889B081775BF75B6D +7AA3055C85ACFD57DCBDDC12257F565F1980DA3215AB29A2545B2FEB107C91A454DD3C32 +D7D620943472E7AEB5805E64EE7B1D3582A2DD74D439AF03C00478FC35EC9017F1A37B59 +A31A196CFBC38B4921A76E41E3A6E2C0E5059FC3848DEBAA378D87736B01C6710B5B0DAE +FB06D00BE44EE7C687DBF6CBAE699D88694891A95392324C6C49595C7113FD6D521A182E +FDB264432F3B661D4E86766A7DCA2E53F72F7FB78A0C436DF0D516EED141D796F3591226 +E617BAE549DFFAC4CFA0F555DF7DFAA525DA35DB699A892B09E654992F99F89CED6273C5 +9EB9C512BFA0465E61FDE63D312B1B2758E645893A19C82A81E5E0F5AE8E51621EAB69A4 +1D425F9F78B47ED5CEC857DA012E641D5C203532691F9177F4531EAE8E6A7D5A2B1B374B +B921CA70F41E7F32A8D83C54AE01DC76C88A96C1403FEB6942029A86B1306AB096F8A42C +2D7FE35C7E9F3DD494579CEF39755AAF7C74909CF5F7322C4FFB2C5A196658B7AB49056A +E3DCABCDFE40DB0912B5E15BBAE08B72D7AFA7D64265F4185401E6E723E151EACB8C7494 +819998FDEE918EE491E4F9D5F889378256F2F7858762A5E049A618ADF34DB73540486414 +1187E3CCF635097AFEE95F695F806BA1419D85C50FA033E4E9FCC155849677B3A20F6451 +D8E4E5AB1BFBD967B5F53C21A30EDF1286A0E19FC557598294586D5184D1CDF8BC83594E +17333A522E32233DAA8A6EB39A6330013C32A2E74F0EB6234B63D47A4C8D21E1618E5906 +5EB21FA9A926E01A78A60FBD71808A0B75F65786A9E3E08488FE89E433C287DED44763E4 +F317DAE0709D7D54EA969B751F4C62AC976693FCD366804E66B2BA8D955945B86D492E74 +F17C0484FA5C45D7F60DB0D4578C5725A88A9DEF8E5D31EA02411CAF6F703AF96F50FBBE +6739B57D4C1C318FE7D491C94565DEBC43078303D329E87078EF9B48D66C3E98ACCFEDC0 +A31761AF6854E5C4DAD36C809876D93C06D91416770CE8852B5E54AA22F6EF1A5BAD532B +E4F55FE7E2AB457F3242030F443975DFB0F2CDCDC1BFE629C8BAE7AF2D21C9BEB3EA10CD +E4EAC54AC081CD3C0AA161C52BFAC3A9E4F0FF77563D6FDDE73E44E926E1BDFAB4B1A11E +2B4A7E1D2CF9D6B9DE48D99DF99E0DA53F5A449B344AB2ABFB94BE9E60E6E9B328B58337 +A4D4BD60CBCE14C364A2A1D5C02410C2E8A98CFF3A48D23C752413A4FCCC5C044AC99451 +20B15B31CC5C7B5FC6D80866C1110B45F9B274326656CE6D74F3481B7D5DE8E5AA907509 +C15914FD27CE89F911641DFD588812A8292504EBDA5645E8C510F5E88EF44C573CE46D01 +EFBC6E3E1BE9600D77210B10330748F210F2CEE4841940A78AE1352654139757283F0FE8 +12040846B6B24F1D96EA06CEDF19F0E3359C8B30C3986C2E20F5801C7F74ACA621E8C4B2 +4C38B9888AE24013371F19C80165522AC90C40832C71E617E042ABFA071BAC4D87D91F86 +4209F5073D3E54A26FC2FC8F89DE3C1B121881665D48339FD2FE7B0ABEF5491941DD26D2 +B379900687DC8DAF6E35153F409DD58DA91742E93CFAFD431EDB7A32FF814048DCEF7459 +830CFFFCF958160B1B54525EFC46D8892C30561D0D7780625B0876D816A0099AF1EAE992 +AAB126289D55638559BBAF487E1A9E2F118B3D498C49767B28FA680BAE464632C94435FA +E32836F8093885A91F66CD5070B91558616853AB410AABF0DABCC02BB85344751A2B2911 +3847CBEDA65616487A853D9104D0E00012F179EEB06D9EC54CB50DCEE655CDEE79F89318 +F8212779CC310304A2F604402C8EB99DEDB3051CD1EC0D03309EBDB8C3B5A89E06C49957 +5E00904DA0106F87D58FAEEB8581EB47E982E29C5ABEEC747205A33C7B05A0CED74C3403 +0012BB647B5AB617AC8508E8A0F254E102406EF1EA86DC39CD9335FC8A5CCB1504757BC3 +AC11BCBE92800AED15E84FC3A6FD8BC6C27C4A13AD946DBC65E45B3C1F72D4D2C1793512 +9CAF2C6C238F1E57F428CA2CA51ED139015DD06B931A9FD41A8A759142F50D4A18D9E071 +3CC7607EF0337C7B401CC2E47F0DDE63B32BC1DF572F94991D1BF97F1BC17DCFAB95A834 +E34652C6BD93277754DBBB1DBAB6F0158CBB6E9304F9A1B5DBB370C3EEF6A0F937A0C7BF +789CBB57E308D2D3EC0A0F04BC3BAC016AE4CFEFD4A5F5FF9F2289460CC7E6FF27A7B421 +BA3BA86F2A48C2002C4C0379D90B50952B6A629ABEC22143A906752E0BB2DA15C36EF74E +DB102D691DECF27A7C252D866640FE74BB7BD351C4DB5C8E4956FD73CD6675FC53DCAFE2 +256AC5E46FEF1D0044B5A347682FAF71ED9CC08F231605BC342148E3CAD6A80ACEECC89F +767E814046DE67F5277CD737D09A62B499DFF7908242C6E5F17987573334AC66ABEE66D6 +1C61D14C3687DBEAA7BE38D248A7B8CC775C5B577305C3F41BAF7C7D64B43E7326133C2E +795F50EF42EB3F5817277E2690C8785064AB6BC61AB04F578549BF671D88E113DC704764 +91AC7787C2561DF6AE9F3BA5FA24F5F2C49B8B72833D030536BCF0AF10592FF37E223065 +ED6F4BF075F70A7D0ABA84CA427CCACF9A0CFE46A429FA64597C677C71A231C997AF401D +07FD7FD98F4A5826DAEC4D76B2E6A8DF68AB8EF09A0A6BD0097840364FBBBD4B93950A16 +CD68B07CDCE7C341AB8647A3338B1608D67CEA47D26EB1ACC0F94D928F2930C2CBEA594E +B773548213CF17642DF03784B9293BBB8BAB745893C2CA0F9450A337E448A282A285867E +0B0A2F5DD49A23D475709131946B03E8C2F7B2D21DD7F1EE583B22A73D81E5F72136802F +D917750E53E63031FFBA218DAF8B3DBEC561581706AED8A5CFB6593F5CC98BABB048587E +C9EE27EC04859B6C233474BA9FA8F8D909B17705C6F2BA0CEF169B46497E712C458354F9 +F0E1B72581F18BF74AE06CEEE0DC27FA684432625C579A29843D44973D4BCA13998DBEC3 +0375F1C05CCA91819C3F7C7F2A240B515AAA8403230F9367CF391F3538ED5BD391E70F24 +51B6CA9F969CCCBB58A05FB86E90BA4FDDAEDDA84A73CD40617486DF08FE7985A55F77A6 +B2CF450665F98F0D173D0DFA608A4E89CA6B7CF2F86134CA0B97FE3FA0856613C7E71D9A +4389BEBE6C1DDF23A7D617ECF980EB78AC5FE99665CEBDF1BB8C1CF29C345B94591CE29F +3E77AC66C3A9A1FB34526A1F335E71FC1AB62B4E8237E80CAA0265FDD418322B068FD4AB +0E603448CC61D57106F1BDDB5785AF5A18C211021FB6F91AEA6112BE9F34A75C6C428EE0 +8101FD9904EEF19996EDC2235F3CAE00B0FD20331597B63535D001A5A2951F4057C83A8C +04EC71AF466EB9EE31CAE51F453423FC327FCC256D71D4E2D956538C16231BC8E6A54FB2 +85E7D5A967CCDA56DEE48109FA4776F87466F0F62355CA0990097B2BF7F947C0198F13F6 +EA5321370A9CDDD612DEB3C91766A19B4228AD5A4D782D9C51BD3DDF268D53C24F6E4543 +52B2780CC5906D6D08A27AC49043FC1ADBFC07ECC113D815AF2BB5922E42776ADBAFA1D8 +E8608AEDDDA45E181521E5A8C39BFB2E9E72A7342D641574D84AAE3D23F114E2C675E50E +98C0C4D59107E15753F2E29B2EBAA4D40A0FCB785E0F20FE5EC3F4C42AF3445298625AD4 +656A42B95D3F3BA64495423BCE66806EAD119E6F949E5E0CB7D20D8B218FF77704BA5CCF +C6B96CDE2E22E2A1866F80C103C986D01BD96F2207438F8132ADF46C5E889C2752458D26 +050C2D2D9996A7E90414880A34BF4F6F7EA862ACC40E6446C8C64BA66314493C05D5552B +FFD967B26CAFB3238DFB04A14757FCF34B547F81448D5BE2C385775093FA69D2B5264954 +7552C28488251224E4571A0537F87370D575C6093047374077BCDD8315E40EADF2ED65B2 +9BE930D5A78E0E4F21ECB50582FE1501FF48EC392D1717D5037175395D726475E79B5EA6 +68150DA75B9FA24A530FEA3EB4D2E4D73A66C800452FA1053CCEFD77046B058693170362 +AA4EBD8C51C334C4C24AE69086BA5A9AB3E8540E0AC782324DF007DA127A7CC2EAAB55D7 +33201140FA9B632F11D41030ACEDF37F12D4E4801645CE624BA973671E41C1A11169592D +CC529462D2047E2A5D06FE543E5471D0A0FB591A9D3568D2B642C2DAF22BFAF136DC1635 +11611AE38717F04BCE872368BA82FF9256AAB0AAE93D52A286FC62802FFE2E8FF98414AD +A2E28D0C07D95FE5C9B025A9AAD8A355710C6085D45BCA501AFE400EE1F9B34545AECCE9 +8DF25A6C7330711288765392C4529746FACD974BD8CB996395FEB547A9D674F5E56D4841 +32A4B48D87A380C52E05C86083677D88696CD2CA221E676C8F950FEB61CC6CE37D055DDB +83089B0814A90EA5B3EDF692055D7DE2208F5F5151667ADD999A0301E9D2A017634D3C5F +8B645C726D0BEE71D4098E0739B44D565FF574FE93A250AAB0879413C38763AA3B294956 +BF0649C5495E92262A3EE9E3CDCEFD1DCED80221217ECCD09A04B2759C746D720C3E88E6 +22174A8E496228CE9BEB430557D8AC5A813670400BCF93AEE40CFC554A933EEABB239B80 +EE603F1617B3238E4EAF043699EC674D348997BD3105B8EFCD06E55F78AEA6AFE81EF9EC +836F4703650D803CD01DC38094F11CFF0B34734308908ED646E5B37BB9524C886DF94F83 +B2D470752A139E6A06ADAEB559E3D5A1F4EEB78F896AAE3D9836D4C7D4576877307821A0 +DCBC61D1318B937ADB53865F9F9B6B90659DC518108B81196CB6E81D676B1EAAF9B0F3F6 +FB499A99BCC7169E7F37E9808634E2A0CA9DF40F204F86FCD7BD135D177ADF005B5D9D9A +0690DAE940905664994FCA90777CB9B3C4591FC0881FD146A41E9EBE7B8F74DD407642F4 +5BD399C6EF5471E987E01A009F532C2E66305C890B0B582824B527ADEDF668456AF3776E +4634332C59C3133D8581D47EF6B45B636422CB5FA0B117FE1AE0361B93CAD6850624F353 +FD41296FE84391636A2EF92A3658E07B857DA4FC19889E760494957276BFF9543FEC23E5 +2A7C9174B581D299B52DD03AE726A95634C8BAC12F17B80B3B40BF98BE848CC4837C3CFE +FE2E3B64B5A8BDE695ED0BA15451AFC5F0576DB1E9E9F29F05D4DD02EC3AE44E15171CC5 +EC254176D86C83C062B7206966E7F0A8822816251C0AC4A746F661897E24D2A44AAE93E1 +259A4C582FA34DBD0B4952CEBD2753EDFCC37ED685FA00E67C455D03072C2A218647B582 +F58270B59936EFFE692E0F27DF5D73AEB8D2CE0970629D51B9EB91C0D2712CC3BC71640E +9ECA1D662FFA06E071D1E013695854792DDD672080A0AA42657C9664D6D850757DDBB167 +9FF6A837674A5DBF38B2A435C2AE04EB86D351FA0CB82F0D5F00A96D55976B44D6B6BF5A +75346A8CD71230B6A44268B73188A84C47F09EFD13CBEB51CCF7ECDE43A3BEC6933643A6 +68B023344E407CB2A6055EBD6E75A27B6FFEFBD095828A8C5B9A14FD78AF99BFCDFB0A27 +3313455D19B2036304167E9F8264FE47E1F5AC04EC94FFB3E1D6C90E1758758D2E811C7F +DF1EB0AF24EF89E907484BD07B8D825B98D99AEDF1FE0D67FC98A0159DD6492503B86C35 +FDBFA654E3CF4B00D0E4E50A77BAFC6D4CD69A668AB5D0436E9A2DA573E04EF308A6A928 +29F21A8419FF3B7689590D3787B3CDAC9B6A98FC0AC7B06DA9748F5765A25708C3E9DEB4 +1DF4EFD5BD9E0C1090BA956EB65087F5FA803CE15BD0FB4090EA9DA33F86512A67CF8775 +BA3C3D834FA4D6798CBE5D5439279DD0EE083DE2026B2EFE83C203C632193D30D390443F +A5D1D1288C2B7395BF91F3FA657BDD688A562EBBA50DF28EA5834DC1F9CE073B704D2DD8 +594620A53DA722209A6C4A9A906B552B562917A86373C43132B5997CCDFCFA398C35EAB2 +D275883CF4C5AF773B535BBA0CACB12ADBD2B3407C8F046F1D4F391EADA619AA2DB788A1 +93B7F6975889D7676AFB6EA09978E9590E75F7B106112D0B62063A21DC59110EA5E123A6 +51F2BB21FBD6C80083E5B3405835F9AB6DE5A7C579F8F7B006983B897E4C9224BA21EF0C +DB8546D2F477D280F554F98AABF7F6D7E890B327129F4D43E3BE119D1E9B1D42FA1A7F39 +0941803CC1752DF5A9198AC5AFC71DD6402095EE312A89D1466307F0353A610881A56891 +4EAF39DB13B984A78C1B9EF169EF8781DE0BE7B20698502E8F81BFC06DBF766B3CE28A43 +4801EB4FE9703BA5933AC6F0872CFFCDDADF1135D02714C30D5F54D36DF3415F416D66A7 +EA918A64E00AF9213CF9CFC63B200BBB4402E53DD95BC8B5AAC20E62964AA87173563396 +AFDEF06AC069AFBB08D6600AA3A61C23682551F73B2B7E4DD70392464C439FA6CEE41A1B +4EC280388A8DF86195788A9B766DCB0E1AD6AB7A1C66A1835D7AAA8FC92741104C6A5553 +C149A5BEB648BD3488C13494D9661FC8F9DD431E9EC1989CA9B35E67A2BC9FED7BC3E362 +6389B29B863DC77F8ED314B47B4B86C9E559A6E41366D47672D9E9314B192833D3752C70 +3A571CF80D6F165C660F42F58DB5CEF453943C7DD0D252476F678E44C6340B7E4D52C927 +5855FEA030BB191D34FBF80C039955C2AC6F0C38F6FFE281A52F13B62543DF45BBDEEC7B +A2CC3A125963D1524EFF639AFD013A472B336E43E9256C3EBC5910A05F641EA1ECB98857 +FDF7613E9A3790F9FBE16F8B1E9CAC2829EC0B651F00E1B6B56F0025ED82BFC5FE1D227E +3DC00ED525823F310A834A747ED0FB5F5DAB7EAB307D0906AECE8AEDC3808C53C3C9E954 +6771D79028ED61CE595EACA42B6ACB8C47B1417F1E88391C0CE35415C9FB29106F8EFF96 +82843119AF94F798D7079D40F21B94BB3061C2155A87075846A62B1E1292B465E946AE00 +A3EA7C2057244AC8C4D54A8618AD7B06A833E9C26BD2BF4A40CFC7F7D780DF4C31B0CBE7 +0657FBF4AEED88152E1FCA2956141559002CEA98E7299FD83BC9BF9CA0523697D9E188AB +2D883665C329A8A4803C8E66072DA31E615FF9254BA8CD94A5C6CA0EE7AAFF3108F48D79 +0523D58E98803CE03FC53E71DF394691240284E210C77595F292696975A206A43AA7FC7E +C0CEF778307863F56016C13EA6A26299FF417E0668692ABCD895E7CAF13A9C1BEE2B1E62 +0DF960006550CBCFCBBB006257051D7254425C49F840B8EE5A44A61E5AF465A3A831FC26 +A8A2062943955676AC4D5168EE2464067C056B1DCE6FE780108953F9FAFB6F89DC775E63 +6E3EBD3308468ED7B31CCB4D80142AE342D630B919584B2DD67E904A48C5CEEB65C1C84D +8D2964A4842E8C2A83129C91662137BE032B007A30A0A4D2B31ED3B1F44AD5275FF105BA +929ADE2B78FBE0F3F34E2E9A35568D96214AC1A347510E8E5EF0C9CCF08798C5B0C09DC7 +3FE817E2BD84AF14627A8210099509770C680C327ED697A255B28E81DF6B512060D47084 +B8AC21EF59C34AA36A9D14A093116EADC45F3F64AB297E114053081C8D6B135B36D25AF7 +7F2050648799554FE6BB50CB6E957E26A0C62788EB76901B438AA6422118463BCE7AB3F8 +C21E007C21A9434A0294650543B58F0925F664585BC875ACBFCF44F5BED0D8AFB0D8FD6E +215A03ECB350DA054FE30172E920C34E64AC011A655F5A782178DCB3F65FEFE0CAA68993 +DF30FAA2471396F6D74213C38A511773DC7E84A9831C2E8C4B51EFE3D8DD0674050B8DBC +F1E09ECA5BBCAB73780ACB37D46742594C6070EDC7F5C555FD50044208F6A26316F17B25 +1DDCC694443233702745485F3CA188CD3E1F833C99ED46EE525D31C6518A86B723E890CF +DE3A834170507C9F24F28A124DDC734BE002039E81148D73F8C86918DE78E07964001EFD +9A3EE31A0347EC258360D2CA6AEBE7EC4D5FE0A29D415DD78A13B8CB8DA84AC8E480FD48 +F4A9440EABFD6A1C4988A7D6FA7146CBC14FAEB8864C578A81D86C61C0D08AE6D50F5654 +DDCBD02D7D9D9AAA56C417D2A3C42AE47ED81350FF917E7D5D390D4BC8AB934353D902AD +98BBAE982ECABC933FD33310FEC3266BB373AF3B53D8880A8106253FA48D78899D0E6548 +A9EBCDED56B39BC0FA78BEA9A795BE60BD3D60C1DDF5375DE0800F1FD55AB46B49536F7B +5986E790A4FFAB8B81B7CEA21980D0634E7B2CC00D1D7A9A7C00A5CBAF65476A714ACE77 +99795EBC2A944A688BC40F2A23DF71B3826654EA7646D2338BF23E216A8EA59AE50DF2E1 +D6A05A86C25EDA267225592F695FFCEC993CFAE93452BB3F2C17470552564F2AB70AAC50 +D49ECC01A418903401B4BC6F3E0D3DAA9CD062AA1A8B93016BC008924F8AA7075ABDC5E0 +01A215A63EC8A8F1FF0E7F5A1102D2D5DBEEDE248904EE28590A4E48C98B4E97DCA69479 +08FEBD5BD880AA737D2A600A71D1CC35B20612F656EF4C125ECF75DC0E1BDB57BB09BB26 +332CD1B9AD52147CDD30D03EAAD4EDF4C7C2E4092C409701BBC8EC163E4C660EB018B0C3 +4D4844EBB910E0566DF844ED250624A6C8BAC481B32024FD4EABA3D4E8A67F83FA4E4927 +A15D64462B3004F5610EB847E9413CE174D64908B0464A144DB43FA1FC8356FBBC00D303 +74E22B3EBB141575D6EA036CF0B469597C57AAAC00F840EDF201E57C0D84929A34108847 +E90C97352CA858A6B1F76E1C772C1DA2A8362D02EC7C112E8755C7D720AC5A2BC528913B +37E0BDF15147DE30321647D8001FDCFA437709AF90ACF0E56196A9696C0054E67BC6630D +7D99F3092D8DFEF0C788715D9BC43788542693045A485D5231D731EA740BE448DBB72ABC +A34AA5B8B2A4EF6E91F61B0A8AD9666808888DD61A09CBF2FA30E812BF1B73EE2D387C6E +4821DA27733C60795C8EA0E806F74601EB9F3676284A37ECE9495CB87015F18DFB39B9E2 +93303261BE268AA644CC7793A6266C026A06BFDC3074E7A67C8F6B35729CE40D6C343C4B +95EB9C778F6D513CFAEBC5FBB8AC844D1982F300675B0920C098AB288D12423A3401B6BC +CE7725E619706B6241BE210CE68A5B3F068C7255C6A0959CCD3AA40627230F27057001DF +328A741F867833911AC3D24DBC1C79462012801A6E0897F2896AD1B5345F72BB639C799B +FB4C6EFCC57760C82015F6855099EF7C5DE59C5766BC6DD4F4A61110E8CD93BDD891A83F +D8DADC0AAF16032E8B02E69F1EF25EF7CA8C23815C38F7FEEC5E4A4F11BF1E0C2275FDE1 +B29CF45A585F47962E6137150F0AEAE31ABAE6DD3D66E54D8B7E6707445857348F6326A0 +9F403CAD72D93B038C91B7465347160DE4FB2F2F81B4BD24449CE03BA177C8E13B3D590E +A6F4C5CE396D238C642BAD4C5BD4C0B2EC8B935BF9D9A85F64D867799103E285264A5F53 +CBD2E0B0D69176ED284676494369C38711ABCC23E61961F6B46C576B407D273EE84E274A +E02EC5C8923ED2D5AE650450F5A1665CC148AA0FA6E26143BBAFA846E9263E49C9ABA1C9 +E4ACC9A7E6ED0865B42023F21A1F234F485C4F22B58925B336BF883906ECA1000F456773 +48250626716520CB2CA5DC9EED93F694A1CC6D7EE74CBDC660E3A033EEB0CCDADB32C5FE +9F5A4BB9BE18F13A6CC678213E631916E283D5B12DD6B9926279CAAF46A469CC3D4EF950 +D701A667C2BFE15292FC3A2ED9E1C916B90C9E25606ABF91FE44BBF18CB230EAEF6B0C30 +3E94C24F82957557840C11F4845C7F2C49337CB588FB9791EF1C40D4CA00CD5254426E84 +391C265D4B21E9FA474843065E306BF794BF3F798505285246B906CA4F343743C5539EFF +AFFF1F93CBC5DBCA989E64B2133EDC8DECB05FFE150469EC1433E3A3C0B49B7C14EF6069 +CCC488A1AC96C39203C010647ADC1BF32B69623D291608BBEEF2C5FDE603863C91029AE1 +B6287F8576F73922B5192BF1B226ADC2DD17D98B8D0558874DEBF7018C82A9E9AA9D89F7 +DE237D1DFDDE2BD43EFDCE2ADE67906EE2525A667883685DCF78BCBAE353486C96B3831F +C1E1C7DF12DDB8CF10895DABD16A1DFA87AF1FDF8F4A6DF019395D713269024BA721CA02 +C1E2E605BED8AB8C822CC84903A7E5BA090900F1A409F4B1D30F740325E4995A5C9FFDAB +1B8480D7B5B8CEE4F35206E13EC960650A2C1D0C4D7D7407A86E583EBA40267A67A8E87B +19D41649DDEBD7A73593AF94C2366CCC6F81BE9558CCC90CE95060ABA2BB508467640E6A +726ED96B571CE6F2AC68EC104D3C2D3AD54F8490DE638B77C93595E2B1A44B079F79B487 +B92C12B16B203F91DEC2E7183AE99D79DCE4BDE5B240767D52438DC5AED4ACC691683BB4 +3D2A1636C917B6E270F309D3B75D34FEBF8BA64B01FDDD848D52C30FFAEDE43EA21C9ECF +487A31ACC1B1405E615C9DB6A9B96BC45114E20FAD0CCA71B410BB14A39997E9653FB11A +666995E488B650EEA712FCA7206F5228061BD5BC385DAE9CF087449EF683F69F673F30C0 +33DDD590F086EDBC3A72F9B17F488E2B36A381141F355AA1AC81AD4C103101AF96259CE4 +30A0612CA3110A5953666DB362D982687010AB9B81A63256AF6E69AF6D8B3150FE860D29 +E0DE5D686096A3D523EB8CEB214DC73CDCF00D2E98BBC713C6D7883AFFA02188A5E8A8C1 +007EEE1B185AF14BF0D0E06BB144660A5891C8C7710B2B85CED49F14A5D5B028A8FB6464 +3CB3B42D1EC8C334D51A270A3A2D483B223C3D95C733D79A9EACD97F7BB32D28BB381D40 +399F0B9BF194521F189D37040DAFDC8723BF45FAD60D2527503894BCD4B0B746734915F4 +F5B04D4E5044631F40BC3758DCBBB2A2AB63D7B44EEED53991AFD2988E13A7A6C389641B +32819144DA32DDB3ED45873E6BA0604A9E682558C0BA2B139D29E4986037AD326BDF4079 +B6C071DC3607D52DA49F6BF8DCEF6F04C4AB860D660BC30E758518E16102642A190F89BF +D0078394DACB5052E74EFEDA5BC176A861D8C5D78C83A46B4D5230786068F12BCFE1E73E +4F7865D5B86144B26AA5490F229E6FF7CC5964AEB6631B08E2A4EBFCCEA10488CABAF2D1 +576155E6C862855CCF52C74834BE25DFABC0BC4FB7A1EA21B2AAAAE45D1455D844C6AC2C +C57D081149F6E40B1FE620B697424B85A7177F19BC63E93975A08CF009C4659EF47A3680 +488C43751FCD7D848FF55C472F02029253403CB04872EA4364DEE69934F6D049113FEBC0 +E3E5D978CB8A2423B9910E3901981DAB495C4F323C3E3036BA45B66BCEFB4DB5C7AE91B1 +7A4A956471BC552A1C109EF67D97069D3DD5663063262FF4270CEC1079BC4C4C2AF643C4 +FE0B5F3B39389C104D40B84035710A59AB041F67B5FE2E5D3CA3E720D1C7A3F104A74C05 +DAFEDF29777AD6FAFCEA4854B864DDFC878DAB7C42CE153FA01857AC1D5B1990EB73C82B +A01D3557E10D14742444761671084F1242C9D2EE9E211465F5F8F0333C77B123D6C03A92 +D0D8B91822D6E20DAD190F4D7A1FB12418D6FE63A2B1148CBE94328ACB42845E27928643 +444C3378FBBA83ADF56A3DF9ACF9C1F2A8F3F2F3814E26D9DE7494E2F709A57E373A594E +4F64FDFDA6BC3866E3F7BF58127F6337165826F3D20DCB22EE9D7DE5CC14D10DD3BEF093 +2B0D75E289E5A332700C2CC5EDC65CC61C592E19144A13A38E24B1FFF7F904CE261FB76A +31DE7360290C8B750D92E08A25DCBF3BE97529DD52F004AD59C6721FEF0EA46F1693C5D0 +992C517536B390C86F5E788995B35B6311E6EED72D15594717CF385DF042F8515455E808 +C54A0155E58D4277FFFE04CF0C16E1259F39E84292F592BF936FD50BE54ECAB54BD27CDC +4AFD246C35D901882765CFA13A381A4F888462CA5A775DBFCF37B864AADD8796ECB2E13B +4156BDA78E6E7308F3CA382B478A60C441B09483E6CCBD51E02E5664E8DEC087AAC030D1 +431A2301C1034BFE73EBB7F2744F689D09F424F22A48960C991526F7063B78EE26D0F997 +B917DBE51D7D291F54F1C22D3E9F9B8472CED7317B6E91F4BFD2E3623D6F3FD2401BA7CD +6F93918D2D629AB72C4060B6E72AAA295F0EAD79B0A7C651D5A9FE6348EFC9396664557C +0D5688F01962E8526CE7A55866CD56847F49BD43A674D6C22EA7EAC1A4D437D2A9BCFA53 +5361CD640DFE5189DEC2AF088359B13C6AE7027EA51DD1E757DFDA89A9BC23BBC1138839 +C549FEA71E42F497440214911982F115D3A9278D2119E0A17F0BB1F8A86B7A776C3EB940 +8819B2602C66C523FE07DC9AEB0E6D4AB6F39A308A6E8F755CFA0F41796159FC55B3A083 +F28494B4C0FC25322D17E6083E79394BA1F444CF84E5DD9D9721121277CAA3E0E380A7BF +93C2335695E2F34D05CC3C3FA3322A7C863A16A9A5AD4BF1C629BEBFC20FE361AA2C6CC4 +C0D3EAB00097D9D2344B8772B049CF951DCDB1C23C138B2D7DA551A22A53EA2F604D7BDE +8AB2D034ADB57A65DCA8CB55AC778F9649BBBAF8E7223096CDB9780455268FB9CD379AF1 +DDECC2F7C22A25683BA56EC7AC869150810D8A6A5B854A78DDA6C21C9FDBA227E26809CE +FD44A8E4593DFA5B9D170A19B9DC779F507FA0B28B5C8E3AC017005FDC519E8CB69B9385 +760AE1A8A111E763FB0C3B083BE1F083AA14DF9CC83142A1DFEE5312097BCD8DDD91F113 +0A3B920FEC7E9383B23F7A396BDF28BD1EBB48934BC490D133D594021C256B698BC4E93D +1E746522E485DD53C1B7980EDF066F7C7FF9F27FEC20ADDD1FEB09CFC81F2B0E0820B90F +FB40B66CEA152312DC5E7F8CF45AA0B45636859EA9DA112F76B714CD83CE2803D3BDBBC0 +A3FD5EAA7609A1E4A82DA08701A3AC0818DAD502DECE3A5C7D9B5D6DA50F8535AA1C3C91 +A9358EEBDDBDD94AAF1DDE610E9036E1D5E1F180D426A8B33B4E640BE49073C4B0C0639B +0A28D6E08D76DCFA2F4B409EA1EFF27437809073F29FED0E64506185022EB0A5F9A54BCF +ACB0F2BDD859222546338939F73C212749C36D6B0E9AF72EBD059C3838FAC738DFAA69B4 +FA87CFF491D877DFBAD90222DFE9564CDA37E5576BD66F635720F398EB6863C5143FDF5D +A4F07317547B86C5B335CE05755AAEEAA8A927933B252E82BEF3DE30DFDAC82D1354CB63 +028B03BF59AE93FF30771BC27B186C7A9F7AFA7525F719EC5EFAF2526524BAA29793D5ED +C1003A42ADC2A344D0E4210254F2DD33AC58649887FED4080AF18554646C01BF9BC54959 +D0C06E459CD818580444E37BD2852F44C8D6FA18F7DB6FC15174524EFDD0BC9867832DB2 +F837374BB8C9031A27B17A386E6D00BA61D49003665E1231D79E05EFF440E48FAEC9CCC3 +5985299B3FA94586B516C2317B1AC9C91005994A84466514D7EBD12AB998D4D99BA37C73 +EE3C723217B4D9BD5A0AAB12760886A8A99A4AAF038EE5626035CAAB42C6AD08EAD6CD2F +0FCF85C2CE2D6150A559250140D19610DDABB115D625C17455F928B55F762028E49E4769 +872B96F84031DA85ADE6F18D601F6D576C9CB68B8FF011B13DA0DDE4D6E35E5A3E6EEB73 +248161764FB3B122A4F40ACC83CFC073D4657C042248684EAC14C56615AB156BD549C964 +C8E5A5DD901BA9B583B4D176FAACDE48BA78601EC7BBDF45AC7319F7598A93B68088BC1F +B6B4F429609FDAAF3235BFEDF0AB25B6D2BC024B533E6E300165ADBE42C890F17B9FFF6E +45B5BAA3A14FB36D26E7DE60CE24F4893BE0E2CC7A780BEB1EAE0C6AA0EDCC3BF991E5B9 +A6F98F5F5428AFE21113C1D8DA34783DC47969B9669EC1F97EFD43FAAF5C02FDB722840C +108CBFEAC5E0BE99AB3E21CE4E622DFDF8C32250C10D68EB0B6788E5269479CC441B32AC +1FBFC5660164E498713F6A2809F1BFDD79E8340EBB90481932706B378FE8DE987D5BFA1C +B688817968E797903E558F8C7D0DEADA0B5F08D3D9D27C92E4DBE0F123261737DA41C264 +E59CBA14C0F60459CA59AC58D1A766EABC8E5CBCE3D94E1779099B56EBA27F5263DB950C +ECFF97261AC0BF39C4364FDE7BB1CF10DB8C3EF5763BB7976815D78C6F886ECC77F92BB4 +46D284D2948A94FA4E5E59D104858DD3ACEDD4088302B71E6A9DD709D47DF40DA7FF78EA +7A1E226F2C24E73D292B63100F1A6C98548019DE887E739A4DDB4E1D0676967C64723EF0 +F1CEDBA21FF8BA11539BA9F93E55FA54B3DA6B81C50899ADE4EF9369DADE1FA36E2A889A +A3C22215AB36718E57BC68FD115801B35CDCD592DB87FBDD9AB399896E4DF414835FCE3E +EE36D6ED5672E8113B19913958321650C8CCD69DA0D9D7E9C0607715534BA674118C8BB7 +CA7AF1A57328FA73270221F6A2D429D4424F1C13D8CD7C6FDE11B2A119C30EBBEB1DD394 +29B266261E39BDDD5F2446444A9AC581712FCA7B9073E1F4BE450445FC14EA0352D7633D +75C5C5F24DC0C99B888707A6E9DE9927EAAFF533868CC8ABF725EEB94A96699A0821DCEF +BB2A1DFD6D566446CF3CA7C80460C0772C5B7D47BA2D601D3EE74A5855AF4A35649D7DAF +0A87747B37F2B1BC2E13DA21A70EC7D78831B840EE91B89BC147C1A58DBA58FB3749F3CD +1216FF6DE2271EC85C84D07598EF77275ECECBAEC3C99F7686836A8480BA6BCC30B555A4 +0CD5506DEB52F16CC6B4F7FC8B2D8A508FE947505B6C4DE055A188D28FB639553C63D5DE +2FB330ADD822C7206651DC5E0C5259E6F3F489C0D57BCEC574BEB3E8CAD2BD4FAD239B9C +4E6C0F410805E831003F27A569B327A52A5B72446F83813FB2230FB670C2DAA0E36876E8 +82C612BA77B7C486DAB6B41AD9D41A5A8FA66E116F48F8A4573536008C9677D75EA140B2 +C11892F86AD1FC350E49C55069284311885787693154DC010F49927AAB51AD8C816BB00A +216DB9AC0739409ACEE53EFBE5429DC7FFCEB9F54909649F1CA3DAC3B450703DB8A4DD3B +170969E3381FBE10637C9E69A646C1E58EE791FA68E4350FA17BB704AC1C746591B940DE +618B5ECF8FE03DA7E6ECF7F208A004815161E7F680AA7EF1001D6E99526DCC4F9E8F7754 +A56EAF46E1E7CCA21E319FF7E44D531E4BB04B7138E6F6A522B58CCDBBF09EBB18287550 +66CC6E7D2660B9DAEE62164A62E49684BCB64D521F6062904D26D8DB101AE8733777CA16 +B20066E6E88C7BFB3C56156AECC89B449912B0C0F362C949FF0503D9C349003284CAF806 +952AE72AF962F13CAE5A87FDFCCEBB81F154487B260229A9904C44F027C776C4FA9BE776 +DD6D4FE4B8D8C9F52897F843CFD2B14BD3FDE0509659E8065F6790F2C95EC56FCFB366D4 +582422CC5011BDCD3466235BA9212F14F2FA0F377DF05784D75F45E5F863A27879B9BF1F +DDA7916CDA88995E2B52F93A7433CCA2173C1B3AFD83D736D4555A1BCDC83740E9E69A11 +9B5629B03F5A9D18047663D0A6154C4772AFBE9DB5DCC115263D91F95DF2CCA51A4A655B +FB0B99EA0BF628C0FFD5564E882303DE00B69D666F3FE93A2F2358E3BB4BF60B6F89A7F7 +9421015C3B64A82FA30A92D62B0D3564ED96AD8C228A30F4BBAEC782E3A01DF417CF9F5E +8B7BEBB8840BEC912AB7B35BE4EFF43E8891AC25F57DF8AECEFF1840C865A93FD1F6C3E5 +F0E48AFF008F52A23B5F3ED5612823AE23E084A84201F9BAAFA5C1D6670CA499BCD92FA3 +C51C0F5C2262941FFAAD5B4317068E78A1215B8F32E60E77196008D95FBE342426E61DB6 +7DF41434115C10B5E04DABD307EF04426DA652094C53EA304AE96BDD6DAC136E1B0913B4 +6874CECD3F1EC272BC4B5A3264A7C3D8881F2415165383BDAF1DCA39A1C53C3BD45E1665 +16EC26F583D1705592AA862D75CD754B66F0CC89EA5A06351BAB9FEF4A8B592D636C23A0 +7D82581D2E972AF42ECF8CFEFF5168695E998D8A756FBEA0FB03FF2FDBF1A3979767E0E2 +A15F041CF0870AC7105E8A2AF5FBB0E00F212C0430C407278400139624895C0B67AE7649 +207A1EE4A781EE6AF39E8C4A77FD75DB7992CB90D9AC239BED5A56105ADF5E224525B4EB +DE5D43734ED2BBBA28C8CDE0334C9393DF8CCA236FD8E15D5D970900F4DB12C02FA5E2A6 +837C40C097B24942820B116C7693B43F0870BEF05AEB81D73E2CC42E448712D37C22212C +280E111F738B765A74DF533182178E6CE806AAC22F5E270E1CFD406902C45BB6A58DE01A +9D75F874C698BD4A9EE40414A446B6E49C8D198583D4A0B51F8FFE1FB809B8E7EBA85242 +477A9C0AEE9DAA8F7E78A5B73DF068D38CE0A7B36D857862DC2CA4C0FAC20A0B9F7F6BCD +EEE7EC90079B59F46B7A354D1A8D6D4A71DF790E23C4E106EAEC1497DA2B5E36F3EB9E12 +4D049B5E3D92C68D388E1D9D8749E93D2AE063770EE9B9D9491E62223949D60B11AB8C97 +A87C3CD45D13D1B033272698389E80746211AC1E09ED156F7E3AAE2016B178CD4ACAB399 +0C849249133D5C2F855D55A31697C551581953F622621231DBF209EB003D04CFD33BC791 +7AA01C79C2AFCC2308263D0B886A9524FEF38FB01CC278A73A86B06A0467F6A8E57F488E +F20C22BCDDF368A4322F629D81680312B763585EADED366B810A95977066B421D630CAA9 +0A18AE200329931AF4A1F4DFA5830DB32425AB3B36A023ACD186B4F51AA3D021B44ECE3A +042C12DC54CEE0B038DA451724D8DA69CA2ECBC3C9E986263ACB791A659174BC940473FD +03CBD870A2079E225D78D7AA550A3F42FBC2F027F184F54903A1DEED269E6F2CEE48A7E0 +E9DE7018417C65A6DB9CC89A93B1297981530C330F7988161203354F17ED6184EC023C95 +584E45E8E88836C5263398540DCB7EEDDA5299BA8CDFC93E39287F425DB852EAC42A88CF +3145792AC6712403EB9BF1ADA24CC204F9757B4EFFACA94F74E5CB546569F0C21EA5DC63 +6A7C20A40C6FFF3B173D7C64DE1D6E47AAD74AEE3B27FF5E577CF3BABDAAF91BF166FE00 +65B36A224C4E83252D7820667A3D7A1EE57326683285F217FC893C374DE7F859DED7C50F +AD5A30931D50E568A12C43C746018C1C35306EAD324CB66B0F747BD24023CEBC636F21AA +B1A396FF13A2ED3321EA129F72CE2E2B9FA6E00CAB30CD5E8DBA1703962F33E9FB3CFB01 +E91BADEFD13500034B926A667F48ADC59A4CF6D07FD4E7EA96417B25B08FC1F284EF2B3A +D0A720A95E1AEB3834C453ABDB93F78CA55544597E02CFC6D818423FA15D5D7AA96D9EE7 +6FB33A9A708DF038B19E7ECF0E068B627C26E5A3C53DFDC0A9678C8AFC496078056F8902 +05A38FBA09155052F80832357B84CA86F3B9C399410FFED89BCAF4ACD808B6C7BE343571 +DD2E812C5CA964B8933141A33895804CA34F77074785B58913B2CCC2445B0D54F4D326EB +E5D8307C92E0AEBA068341A5A14D3AB5AA38D35C0C020F3AB33608BB9C7C28F7BD1022B1 +5ACAF78740EC7DB4AFA3F8917D5722CED290D5764E7FDEB6B0E9EE78A8E51F4F88FDB506 +87EAB486D0218B9DC1D29FACFB7BE25F4D85C1E8AF20B039E23F1E92C79FB13C7EEFAE44 +6567C47AAAC59487CA15B65D3D14CA2D8AC17A8F3ACD19C7B58C2BBCB22DC2F3DE7FF42C +A6EF389584E4F59CC35D84EF94F3ED5A604DF5CA83035B54817526302662BA6DB7202638 +B4BC47B6E907B0BC3FCF31D06943FF8E04C1344AE04F96583A8FE674A79615A76807E1F0 +FA1EDC93A9538ACBA48C054B4087CEED23E7B4F1750A7629C333102F38001A7A29DFA697 +A3DFAF60BB89908CD78AF393A469E54A41D31CBD35D2BD98E5C04DB8ABD7C6AF6A47F51E +2F9F4DB3CAD40A85C32ACEAD6C196981E16F90541929DFC9BDF8293ADDA1840EC116F3E1 +191AA907CC72F75FF0923BE2862199035CA1CD4C423171118BB8D250B5897EC9C2AB8C88 +D7FBB99AA99D6D194B33A9152E8C1750498EAAD12C4EB45C1604FB747BA3FCE8DA3EA4B9 +6861CAB69A1FD8D04011CDE1807BB405DFC1482CB2ED7D3AAA1F8714CC8163FD8F0B36BD +31AFCAEA934265898AA67B80877BDA58F3E701F78CF052AF02F08D3AA1FCE61EA12D53E7 +022B3824A1B700FDA87D31F3413929CC5D1D287B2B5C91F82D9F6DCBCB599D19B4220E27 +C3AAC4F0999C1723924CD7E9C06AFF56F27054FCD334BD9567217D5BB294CEDBCB77920E +A6FBA60BF77B255E5FBD2BAE7AA22D0AD45C8322A899C45D0B12B3EFEB4444B0CB284019 +33DADF209B797C0F2E77AEB82AE01F09E7897905A43ACB91D64BC3DFFA88A52F8FE2C901 +78A045A48573C28B02782D54B9BF615CB5FDD714342378CDE02AA661A18893B49723A650 +308A721D0D626460AF055C356B3503F6B4CAEA685B1495CF6AE66D14CA45996137D7E173 +7B1ADCC54A6F30E1E270F4507D9B4B10F647320ED3595D6C1B077C8DA047FE03665AE73E +68A82F78EF7C1DE60427BABED7396E6C412E44FC8D98AEA402C00A784D3A3FBC7793AA8C +C87A07101BBF6FA2C3178D93DBCF3E00C95F5C0E2ABEA7158330D7EADDECD7B5EE420BD1 +C4C40016AA88FAD7B44B6DCFD9729B136DD16F7B54470F0FBD3A671A13C5DA0A52258636 +1F2FF96985D9B5B582A1B0E51FF2A2BCB8EBB5018DE067019B6C3DE3A052440D893BE3DD +414D2FA37489D3E34FC6E97FF94D2A2CE6B460498B996D2E21E2EA92E937E68AA000BC8B +9349E5DFDA563D70EE336C181E9B12FCC65C40A2507685E03D2D4EFE013BA6D6B36D5D5F +03E7B0920B195FA23FA98993DBFC8F7DC4B7C6BC72C8280C78C150B99604C93323273001 +6078600837D5B179B1AF3FF5692963612F93A8BED3B2630E9EE9738B5F016B0D42D908F8 +9D67A5555DADA0529F1F0445FDDFB01953E264DD3AD489AC710CBDCADB39A99CFD9A0200 +2CE7F462BA691742EB31B0DBDF6F7F26FCEC9BE173A4D78CB40332EAD8A1793F70598EF7 +CDBEBC02F493DB8C654994F6150B43FB49CBB5E886A515828E25F83C8FE14E782C43E332 +B351A8E68094839AE4BE33E8D026CDCF79995EB0160FC1ED53C1835909A1F51407181A1D +82B529685DD92FE74A21862FEF7B2ED4962A360BA825B08E961380522CC75BAD11FB7F6B +15378AFC8BBE9521854926147E47A08D728CB679330AE15AB75213AE7793450108837607 +F592719EDC0420A2D9CCB8A9BD7D58D9C7E4775B753F2E928588DB470F6A23378968AE20 +380CF35131CA742AE80AB160434F7AA2A88B2FE42F54FBEDE83A99D5DDF22108250113B4 +34B8C3F8E46D57658C37E229B4791CDF9B2E2C5CB26A83F4B71739741EDF475222665072 +EEA39059AE36739F8CE47842BD9CCC13BABCF2888CB5AB13A12E83E3E1D0BB27C879D435 +684482F1ACBCA88855A0BA49E685B8EC66ADE40A153F64DD355CEFE3FA55F78E499A0303 +45CD4B0471B73FDDB5E5F3B7233F6204EEDE30D7DF03617F267636A4276F6EE6D065A405 +03081E2FD97C1738247526B2F1E374665F400980561ACA6BA65076EB0A23F4955268851A +3781AC4CE6687986945A3E0AFAC73DEDB76E2FA23BB33E094DF1FF05602E52A49E1B510B +5562EF0D58E45430AF43EEE073DDF0EC00614C0E2DF121C173E1ECE36B4D87D0FD9D13B2 +75A7C0C8F9B62B5032B77C8909097B3D4B7482A3623DD75BEF4EF27EDCD3E91F628DC448 +4E15D7D633B3415402E48B1B577EFAB6413CB65CBCA453F5EB78E778055798816D895A42 +22EBC77D51C992C56ECDB984D5DD94BFFD01E3EE1082F6D189E3A4D04D6FD2C206235A44 +2578CCBA9CF00D7D2CFC3BDB2D6CAC8AE35DD17F39E0AE8D0A84AA451789BF3C672F7F50 +CDE8F58C4AD3251B124722AC292A11FE426B0B51B2EE4EC7C65103F1128B54820C458E09 +7376F3295D30ACDD561EAD278082B7FDBF592F5261B0BA27A71B8474EC2815A8E62957FC +FEDA68BA3300AEBC9FCC1C5ED4ABFB2B91C08AAB32BBA60A669B9BAF89524FA6B3B63AA4 +6191B699D7DC81F8E21A990BBB3F906D4F93C3CADD734FE6BC866DE02D2EE1D119A71565 +752224235EB79D3668084A41D7CCB27C48595EA82BDED902BBD71818547D4E755DD372A5 +276B2EC7C66F730F79C111AB99493BF93BE7F252EDDF129D8F7B7DE6AB41E9F8861AB866 +51F4D928F6449852F6FDF2B84E2D8341D6E7CF35FFA7CFD875A02F83733D2F8EA7FD2448 +7A575976B07F5BC799DB0925F0D6967E0C18DD80906639AEB86B4098A732C969703C8DB6 +E9F1E849E75FC37714D4A745A08EA4B374CFEEEAB664116D809AC06A8B3FB1DF8F71BC8E +BB5AA0467A728A6446768BC45F128D5EE2596FA35BD65F90DBA5A78B5D02E2FA2EA43FCE +1D2987C8081EC335A63ADA5DE5F6A87020AECCF4ABE0D17D4AFFE79462708D14E3A5820B +BA2663912A5CEFBF01788B0BD19D08CA965E30C9B7FDD2B8156F23AF2653BA4D42E6AEEA +A4A812E561FC68A7316634CBDA855E683AFE67ADB8632345B8718289DA3D1F0B00234049 +08EBC15F22DEB99C37280695EAED4D3EDBC084D9FCE7214B85788B6DD81E5AC6B93B47A0 +4BD833CC79B0AA2D4FCC9707874F3C7149F5F751D1A52F59B014E604984C6B2CCF869B38 +A045E50B957DAA6EEE0A74305705DFF1D7EC14BA595E5EEFBE93903DD31B977525AFBCC5 +7C31113400041DADCB603614F882FD78B88D6931DC3FEDA881B6FE8081110CB885B8EEF4 +58DFD7D303B413024A16D40FBF7792785C2B5DBA567798CE9C99195EF294799EBA4CE802 +3D6B0B1C344C90002AB158D3617EACA713F48AB12C062E8BDD7D7C5EBCA6617547A915DA +48C5497DD8439BC2C304AA1ECB709867EAD1B4E37305A3FFB1A8E9D52462C769CE6928CD +CE5521F6C134C61F08832CD620385D38CDAD88BEB32B997D9C8EEFEA6F17135A47116412 +3EA3E64254752EAA4745350ADA708255901462AC021792ED74770B031C21C58A7F50A32F +ED93D45E5D9DCFC27891989CA4BB010E2DF384657530B1256ECFB2613F7FD59ED67E5288 +048E5994C2EB3DBE5D9E77536B967D7DFCC87376A5075C7CA33B7C36251001F0501137FB +62E0D60F991CE5E3992C3EA4DF89FE2B75048B35B95C5E6EDDC4130FEFF7586C58629AD0 +752666C8A3A1885096FB0ADA14524AAC57E72F66304EDF923F2547D6AFFC0823CB5A8EAC +CC46B4786B46D611FD42D633818CE9A23DED24AA2764AC6AE7884AFD1DE22A63AD5B105B +4042B44E44E8A5ECE975FFB6D14E1BF1924F4EFA0D0DAD4E2CA0F5B1473F6D9A7BFD42CA +966B065D46D3F97056CB9BBA064E62E6A1CE5836BE83371BA46B58BCADA103A2F0E72F68 +E361D46664551B3AD71FDCCC221DE21C3E78C33D597AF3E533EFCD4573E0C2EDE28FEB42 +6D9B7A423ED593E57D7D5FD7C5D97D0B8AA3C1B1F902E89201E28EA19D0D140F8DBB4BD1 +A62309913048A6A82494D26CBBF9DD4456109471043BEC23E4E3D52BC1A33BD7DA7CD67E +D13E738B1FCEAFF839598F54FACEA0EB1F7D3C5419C2BC588B16A1CCF8814C0AEAFE671D +DDB96353D32D1F86191490516C461A4666235CCDC5179B4324B7936E26916DA037699EE1 +622E25173E9E1286306E6034D667CF1510AD4789188F7D0772D2DB127665273683698804 +9B9EB1D8A2689D5C46B5B455492FD96281133AA54945D039BA684A89ADEDA43A9496F996 +EB442E2C020D4EABAC6750E320D8DDC7256BEADCEF54E609B20DF4A6E39CEED8B3D4CA98 +0FF47314CC3A3A3E978C4F8911D5AF92C7A0110902A8F5362DB47F19DBCFFB4789C90A34 +8CFA880D4CB23D284C57072C7880B016C2F4338288D32F641EFF0E1F2D04FBEC6D02C61E +B27A4146B19A5BCE213327C003B1DAC40740AA1E9FB73911F3777FD976F90FC42D91D5DB +7ABB08EB6A5E4D367DAB5B31347A726FE7F04854DBA180019823FDFB4A44479DC0F84952 +8BD0BFC0025117A8D6B36FA9F88A76DC36E4DF00A2E3D2BDC2FFBCFCA12E3F4CED77C1EA +B2AE53A27BE8D1E77A618343F6673CAD03754FC14543BBA5FA50E1D7A8DB2646042879E5 +0D1D259898D91048C8B8B0D421C3FAF3E875D7FA4D7EFA088B657442742D89D0923577C7 +7ACCC9D8319DE2640A2422AB011CC520245A59A1D86CCD5F9D5616A35BA2977AC7686BAA +AFE1A277F407594D6A60D5231EA34761A78C1AAED1A1A6AB100535435C615B8D89C4E078 +829B475470ADDC46331469053DA6B4DAB9F0B0344D97B744BBE1962200DA293864FD2936 +2A6F74DE71CA9A5A1A6E697CD643D33B89A7314A605E54CBE1CF0EC3AE3F11982EC3B0EB +5D9505D4BFC7402D6539038C6D5E0B27620F7FAC514CE55B230F9A7AD528ECBCFDCDCBA4 +AFBB51CBB1F892545F88C9C5AEE7D3B522ED35F53696EFA39D72B734086CF673DB0EC924 +556F1CBE7D12A8232E51F563E848D7C9170A2AB0AA5702DCF43AC2DA03403374BD85E3F0 +CBC2EC8D2A823A8ABFAD7FE39742DC1DA40DD0AA6E5E1CC84B3B80C909C2E6E01659194E +592493C1B1D39EBDA54FE9E501BC06D9F2D5B507B8A6A5A9A56DE260459DF378DB3C5348 +84C391C7BFBB36216286796C176220211850D52596BEDFF1455EB36F869D93F275BC2E02 +07CE5F8E5F07ABE7D6B59E6533462CED7C4288A61A5AA7E206986061233FFF0CCF6EF957 +D9FA5B99FB733BDBB3BA0C66508E483BAA1FD689D51B5175533DE2614ECE76F9BB8C5DE0 +DED71BB2F386E03D51CCAEAF84F0EFB290FCDF2C0219B1EC25CCCC33571E29739D8A0025 +FEDA1849B5EEE32D4DB59456B1CFCA8E8F7108003DBA2A20120DA0D7E3CE40FEA9193615 +2F1EE75A674D8C6624CB60E8A42B218AC9E41EBBB6771DB40D83262877AF2A369A20CF57 +BA61484D323FCFCAC034BBBCD8F92644830578DFA45421988048B1660C823CE8F291E099 +311CF62AE24CA332086F6C9CEE197DA96FD2EB0A8E49D2E7045AE7619916124FF5D85907 +DF15FB7951BE56AC6C10EC2A98AC525012A7A75F39B5A6DA63168608C5D1F8A4188F12B0 +F37049B2E1E70A225DCCE1432B0DC309215BC07A2D68A261664C3394CD4A800E30E77823 +E1D8D98B0002208B09873C0A3E6724B3A1A21C074232C400EFD5D526C213550F826EE84C +3FEAEADF6CCC9E7FEB9A91DE653D1F4CBAECF29E197FE8B9CE2201E39DBABB02299477F4 +791D5CBB3ABBB53077409E1C4D23E7E43B071E523414A00EB50E0A1BA6CA87896C9191EC +C6154FA8483509FCB65DB129EACF38D00481C70D5D4A1FA9A3B2E84B321222E1CEBAF617 +A8E7EDB4DF284FFC1429CDD667C52D8F2D79E97BBDEBFA0EBCD52A54C963797F9940942D +3D4D1E9962C34589D754761089F50A3BFE1F9F51C1F1F67560BBEDFD67680C61337F53D2 +7B2D18B4DE7DA691587FC93909CCC2BA2E853D4590936D3B989502BBBBD9929E370B59F5 +073D7EDA6875A191C5BBB8C0413CFF0444F16685442A6EB0F33EFFB569D3AB77151271B0 +B2C5E7078442F1568B5BEE33BDD450854289BFA1CCD81866AFA983921423678D8C9FB9A6 +D9E77A177CD5434BB12C4615DBC5A21317F9B6775EDE6E44A29AF506F119820B5197BD05 +207E0607F1083F0FA4F1E34E9EEC2AD41DF659EF2473724C7FE34AD74D33B15AC0877234 +224B88851D27BEC30033A417C61798F8C0C35123860ED2569A62BC7B2509CB0DF03E3A49 +9CA57311614D12AED1DC3FB1470726AD11CE5D420F4A94586435E7C18661CFF62BE322D9 +A395002F4DB83E37145BC240CB6E5FDCA11686656EECFB072B3422184AF75C8FAC2B6E7F +33C3BBCBBC8B894A05BE1B75BD64A3CCB485F7359C785C449AC4CA3EBF59496AAA7D0DAD +FF7BF3F8300AC6644BB4C8E7613C5A4C309EE67AF77701CC1DF39B0C01A296309FA6DF84 +3875E1A057BC7E5ECB644240AEC11AA4157F67136831E5449EDB5017C03509B78B35B016 +DB6C9DA02AFAA51337B3E6FC0091904D04B328D1D57F33CA77E5BDBD38AFA74A7444158B +20009EB4A2029AC86EF3076BFA6A97469DF182172D39D9BB16D5F15B526B61FBCA683306 +7097DF4ACCB7CFCABB675161A3EEC657E8A8DA7AB590CBB4EEE9999BD8BD3C2885E3C0DD +52E7850E680F9CC5048FE8B0BBB656CEDC82C07CB9FEF713BE8C5021CA593E445C034796 +B34DC2ACC85FD770DDBB7179F518BAC017B53293A52859A4220DFADC93FBD31F191E2467 +DEB59636682EA309C19F1C5FC8643D9D7BF9A9F928994D15BF645E83B37DDB833F0422FF +6422A9545FE2F0B2D959C8839BDA8F2D76E369AB05F324089853CE660EEFC774D714954F +EBDCD762E9490AB0B5CA9EF9B4DA51665C5CFE10AF8822C0831F80470467CF1F49B88E69 +4C75793F8BD37EEAB798D310F5115C5F5DF6D650D75981132E94140843F8440739AD7543 +82B6A4109CD818116DA0FAD8E0FB22903897A1D4C49284411F0BF018E880AEA118322543 +098F74BCA2C1EA19B2FED0C0D1D74329F4F23027D75C304C2BDC5355D5B5424F000090CE +EF554020B76DFF1EBF9EB929AC89CD76CD5D0E784207743F1C8C0B2275EF960766295992 +5C97D6D4EDFE071B4AFA15C5D9EB72A67C1FB72FC634337D827603AA7C37E62EB623F5C4 +5E23AB693ED30B6736149463A8A01AB28A087F8C80ABEDF20358899FC34F1B587B017B30 +99E8AA24D9054F66E79DDEC2AC82FBB0115923D68239EF1CCA2CE89E935EEE0C451301EE +075EE992B3183D0E149A65A12AC23DF90D4B05E79F8A0120123D972B919EC7DCA6F00711 +FAC4F842BE2B8384137E5858EC111C33348E85EBBC6C176169969F30841CE85A381EE1A5 +BAF76C017C559D955FCF8FF05A5CDB40E91AC7BD74CDCB519DCC657F3F3F54DCD402CF96 +FBB2C1EFAA5757CDEF80BC6575CE488E2DC246AE31A3E9634DF5337FAAE9259DEBB8C64B +5F190C04BED5616CADBA4C014A6290BA5D70D2619724A960D60989F52B79C09433DF6715 +54167E161E4A1455A02846FBD422E4270D03841B3B5888FB8399C1F9645B870ABD3F9199 +B8D81BEF3316A3004D07B378962BCB2A0D6531A948B59B7C46DECD179FD73C95D5EF6390 +A105F0B15BB743B0B7D0A23EB7F9065637B717840FB9A2F7FB7C5DB79DD08DD7E024BBDA +9453FCF5AE11747C590480EE6003F5330860DCB1219FA7458846C8F25B816BB245D50901 +F892E2489F34259C300EDD02B616FE650D5514AD5734B77C7BED0DC3E495C418B6A9EC0B +EC39E783C913F71D96E9B0A476CF3F2D0253F90BE85D186A823453B109C79AB859726BDF +85236314120C93F4D44B55EB5A0C11A2D4602149DC836A2F41AA9F096F4082E3B199BD2C +AA2653AE68087AA655B4113CBF54998BF44C8837E6DC8FDD599160C1B191C2B18AF7EDBC +2BCC5CEAD0E765C856E0A39E8E904A821DA88AB030ECBAF39CEB016FD34BCF6049F558B3 +EEE3C1EA53B87E7BC2CD8455209A708590ECBB9566A78262C6268FB2180C3C4825267A3F +BCAC25E204D05417C85E4C46BE30E4FC876D461967483D9ECC839024333A235C05E61545 +E52220B3E3CE601C4480A959F032244A1CF4204A36CA332EC0258A916D0E68B043F30949 +0DDBB75B000DDB359B315FC9BBDE10A42A3A7D6D506B21D1B48254F84FCA27774A98E249 +FCFCE9E96B7EB51D85A671987AD1F3B35C755667B64DA70EFAF67CE8B14A866AE04CA6E7 +EED0905E5FD17B98D75F91279E033C5FAE681AE10A17C818E79204D6AF3925D70AC627B3 +6B81D9D8D75232F308BE848BB67A87A561821201C796FDF6F39B031F5049490AE19E8DBE +A908EA44E378232A09032D368F1C22E1E7984FA82E14FE340911E786105AC959A5A52534 +C585F1A85C5DE7F78CDC5B43546C8CA3629906BC586B11DDDF157CF1031B182BA3D335A7 +A779F56FC0C037C2948DFD410B53FCDA94E73B53BB76C71B132405ECD8F0B4AB5262BA72 +230B7420F4E03F7BDA0162F59938DBE1220B5CEB12FF83C7C9606A67078C95075D827631 +1ACC893D484D548A52A547C96A30AE7A3B30FB715770CA5861556BEE0E9D8E837D385C7A +40D24B46DBB4A23A24ED5844F5ED69D58CFE897C8FB9555D41578C97234763E41E1E3062 +185FADD8A80EB9BF519D1A21C1EF6ED7D16F42F5F083046A63711E79E2B4646EFC2E656E +55355D7D3E6411B465B535043F9A6A57601D15F4B24D1AF71EB93A0C7C07C85FFC32871C +1DAF85DA374524B0554E196A18A149870C508BDC9FE22CEF54BEEDBC1820BF4B7DEFECA9 +062F3ADC6E93E560F7D37EF6AE086BFA66D02D82C8454FC5CEB362007AB53947B2A14059 +E449E45A379008271758E200F71807B3664771BFB9C46668BBE1A35AD7B208C9AE0CD84F +8ACFCCDEF782E5E6D3B21F236F004B41E7E6FDA292970F74127259DD470368EE2C17E7F3 +215DBF172A740F42F74BC74C8A5469974446122D11741EFE5CA3AC65D03154E425C85F6C +525B3CC38005CC7999643144C6BF34EE658BF922456FB08DA18CAF92332BA728EC95FAF5 +8BFF30FF9F1FF2BF14009A5E6B9536F6C5DF9CDA8C2F34842C8EC1FD510F878F1D3605F3 +47B6C95921C8700AFF9E75B7E2B404D13BF906CACB3A1B0529A3168C31C96ACC12723A00 +455229C1BAFE2DC474FC46E969F6A07CBC2D4C3D9C8C81D9BFD84A95756451670D128EBA +ED2CEF998B03950827D203804F46DD1F1CEBA6110E29A93DDD2C38E8D02769A9523842C8 +533F6EE2CA11FD585EA4FB551DED51FAC17FD30E0BAAC02D6206159911CA2BCB19CADDAA +4FA6F2911442CBE8A69FA4CF3CC4792CADFF5FB70D1A8441046F0103A36CDC7B8F82C115 +DDA815EF71DC8295D8BEE1D412DB942B2619D67A5C1F8B06DCC13BEDEC191D9E818E722B +ADE04C6C358A27D1EC9B5C0C198B9B235EB6DAE815C0561A8C29526AD3212B32A3D4FA35 +831008C5A9AD3B9A8D68903021B9513619868E2F8535DB856AFACC031B890ADE468A9903 +B716040C73E77CC57813869E1AD1FC706BC34DF7477FDFE9A0C21AD33C78AE789D829935 +51CF312B811250B8F6244A098EAABCB3A6EE2DCF7209F04AC039A4EF35867AF00F01657E +B517482EA86295127A388A8BF4B605ED4E13F03B2A3839990ACEF98156084F5BB2206344 +5941C560132D0349D52CB72C85B983DF6391B885C5C6048D5F74FBBF496C70FE021AA578 +280053474B6C1F9AEC55F6DA9DCCF3CAC7A7DEC6F743A81FA0DCF7621B484589330E3201 +8A1B7257F719BBD0161EC4ACAB731F2026B77298EFA4104EDBA6B299858184FD1D4C907D +B3A6D0192F8C7DF66D3B0C947AF0F91F7CB09320BC0D0B11CC026162450096809A8D1E8F +01A09E2D3C64E6C91E2B31AEC3F1607381714BAF0D00240FE58264BCFFDA303E87296DFF +1BF630DCF9AF3BDB5ECA30991897AED39EC4CF40070109746FBE9D6E5A24F70D8B2D050E +B63D55AC6D18153F3D5D04E10B704A2B47E7555627A84F394B3FFFB6AB7363A9DBBD11D9 +323050BE1C294A586CCBC043FF952C34582F4D4F8A9F6E71A246B47B7B87AFA9BDA0ACA3 +CC3ED5129B810A98883B1A449E5834344BCF7C09117052EC619C8512DDFC81A68CB6D179 +CB3D6F3BE24A1F29669B7C666A9A0C6148E54BAE665515F5490639C66BA808E40B615EBF +5B59D3CDEEA96951927E406F696745250F0A5A8B8850C3A3AA7F59CC3F18F3FC141DDECE +33CB43777CB6359B9015B27CCA83BB4EDA646BEBBEB1FE0BCD0E1114C0F983918DFF74B5 +57B7A614EC0FDB3D1FA926CC76D3B6F0527BADACC1C302DC6D4019E89EF7DD3195494638 +794543E29846DCA17B1724C3B2C09172B9402437E747F22F1C959AFD01C092E87ECC0CEF +C7C422538164E8E551775CB7660B90009EF7C910845385B97FFC2DD5E8DC1DD3C0B2128E +9553A042C74308F74DC7F04CA995F9B9870AD1E8F89382E9E9DE8600936F1E2180D59B2C +B8A3536BD7F2C47142C756D26411B6E5E34B03C49CFE87398C7334C786B729DA1F36028D +DD5A16009B6BCCA2DD6737C7C4C3CE7004B488B86507D095B567868A6ED59964EA34095A +DFE44C9FEB502977A1369EDBFBEDE949CF421C576859E181AE2CEABCE6C35A88F5050345 +FBAEE8E1FCD98F6DE17E66DAF5D5929046C074E8D85C4AFDC71367857E8A7B1AC3E526F1 +8B7DF5E90F2DCA4007344D0EE044E663D50BF80300A3F1F1DB03B14DF2CDA7A367F91A5D +AC834BE8E057EDCE5274252AB3FFC1D1DE90857EED51040A2FD881583184CDD2CDF4D629 +B907353B9F878AF4E46FD64C85360927664DAEB7371EEB887F5AEC4F76C6700824FC8E05 +53A785DE724528E12C1FA1A8D32059EAA3A99E6D481665DA762E6325A4310222D7DF3918 +E96FFB85B3C04D9E7CF4F3328FBC31F736E93559EEC6D60A878990E8108012A2785233E8 +2E57C735254C7B38E16C6C7E7179246054583C7299050C31496993555A1243826532B139 +71188CC8580B73C43CBFD1E8F23369F56EAE15FB0FA461BB771026722695A8F4C6BFFA3D +76BD2E85D3BBCF1F7F53D23639E39754A4D71B48F1A8C8A18C2004A05EBA0656E3E9884F +9FCC00D55514EE382FEDB40BA636BA174FE950F2B0BEBB9C926E77ED32B08ECB1F4D4499 +02387444393D3A97BD81109E56701374F13CC9774778ED60E3EAE3C78BB6E0B7ACC43B0E +5F29F3DF4610E97F86D7DE9CE585E2BC144E1193C123BDDBCFF83336625ADD90F1DEBBF9 +74CE0797BD5369D2E3C448BEF8AC728723EBF987B4F1CCCA1B3FF3C0CF8F0287E3F5430D +BC67542E10C560A28AB12B3513C1120D8975A6EE71DE0175AD8FB16C3DCE4B265DED2815 +F03C7FDD72E34A27215870758DB124A5D630723BAE250535FF92FFADB0ADA3C4D31D007F +562836EB114CB81FFE1E9F54756A3D1A8E3CE7DA8EAC4036555B6583937F6307017392F0 +FA28BE83A6C4AC9183B899DE736F86D05A91CCC5545B7AA2694841AA98ECC5712A76011C +9637D079BCD5295AE2999EC5C032F7ABEC0804E2A2510303EE071A9777E89E32804C51F6 +1458AF5736CFE2DCC50564CF3EFB629FDA6C39CCDBC5417AEAEDD0509A025B43A682B218 +8AD0D62B96ADD583B027B85C532A1F1C2CBDCCA5FD54A3ABA6EBEE74F2568BD9AC0E19BE +26C1C2436C4FF76B4F50F05A37A1A73A02D155C2DB4A849082AFDB1284F9566407CBF976 +F2D7C124BB538A0B26898CC818BFD9D34D41DA06677516C8D78B6C801B864DE2B7830E1F +868F33DA7E549639ACF55183CAEDFDEA0664AD59BBAF56FAE34AD40EAA21F539F916E41D +690419E36D2C268B7F72B86BE962AC175BED26F6411B70A92CCB9D7A27FF88929F0D13DA +90CC5948B6411F7B04586E283389D530C85CACF958D145C88A34E03781617B40171D3187 +430BB6102B6F1B2C9DE91D2D7BC2A8D5770736B9402415C966FF73EB321FE99505100C1E +47433619A68E08EBC593B85B638EFF1C484BAC03B045BE97A0E8AB48C929F3E801A3D057 +6415902C739C6F92B15E8AF8DA0DEC3450DF6AF7522ED6F316439B8C6FEF58F96BC9C096 +C6E5C9FA97C1524F6F4B84D614EA7B2217B7DFCA1AE90496066A04DDBBBEB49965526701 +3A7513B3453AD0543D475A82C2CDABEFBF7EE5FE95DF01DD6EB4E2F5B36E5AD98A5CB658 +87327AB12AB875E4D9D7CFD34C4F02325EC3E37553B4EE12DD5CE535B2F6C7651DC26A62 +CAED8B3A97A143029F3EF41678CAC2E5F2CC6EE9BD567FF58F32435045214B62BFB112F7 +14FD95F9BBB4F3B3FB620429E12CD2C52C55E483CCEEA72D524C4CF1D91E80F27ACAF36B +5BC7D386BFCF9D70D3CC730D5D2C9C75BAAEA9EE1FF093321AF65CCC73B6BA6F977249F6 +746D69E200645A4E40EAE0986FF0CF3F1B5572BF9536DCEA02B6925801D1C466129D45A2 +E927BDBF6D6F84C3548C78E70DAE806CAD180FC468F979685F845BB2311524539B1C7ACC +C9EF641183A100AB51C155E89961090E2349C601C6769CAC3B1C2537BE0CFD560B9B2369 +4E1B8E9083DF9261B17EF6475C0A42466B4DBC8C601CD82D6236729CB8C80FCB57E7AFA5 +D9D9B35F66E5B29251086BB760BE94831670D955DC8288817A9DBCF7A6ED48038596CD76 +BB2FA5541EF78AF5CE421CCFB286624BF3C98829323A7EE8CDDA3C5DE22044672C8D233A +C08521CA69962135FDDC8EA4139BCB13B64EC0DEA02C437BF522F41A8768ECC542D5EA8A +9F85417B598931410BC08259AF88E410B695A9A6EBD730853F2FDFE3FB00875F21E1EF5F +60D8D8F62E643A6F4D124FD84FD72FD21DCE57144CBEE5EED9C05796B3F59338903913F0 +CA0B073B074A44B1E1951353EE514CB41BF3D50DCFF683CD15836226EE9E73F55D4078F6 +5E3A288CF7F124ED183DDF2C0EDCA6C375160756DC3DC33757CBE85822FB2ADC859CA8CF +7CEAB1DF3A48E751A6604C3E4E53A9C9CB967813C3181D7E4C1DC954A26EA4B28E23E39D +C2564845970739B40AC5B267B4CC07C90E289EC9288AD379A7B684B97BFDB45F036BA95B +EEBB25A5BBFD3F0EFEE2ECDEEFADBEFE80BF2A8C01BA345B29DFA9B25B2D2234F358BB99 +2054FBDB728192CB5EAB19319257140E95B8F31E14BE579364136543A847989F4E410786 +A0A068E38A439250C3D61EBECB1AC741D529A5A74A546FF7BC9F2CEEB11CB98F4FA97BDA +C74A7EC4DE3948859D3091CE7D8992D2C094590B0AF2038429E30A6BF3C7533A900A4240 +E082BC40535E8A07E55E6FACA93FDCF4BE35823B30A2810DC991AEFE4320F927105101D8 +48A790904C823CBE8286DBC1D8E7CC50B1E5931640FBD0213B0FEB7AF7AC38CCC6B738CA +74B1FE58BF8B559A7D3AF0D2ABEF706671A977E737B5E49C4BBBE7B412FC8512C17661A8 +9827E24623F4428598A65FC5A79E77736EE2506E5A61DC3ED221F412AEF9FB3AFF6A79F2 +EF15CE24C810321A72FC6705FCFE24032801E3F61EC145D6A82C43DB8E5F9D20AE3FD7A6 +72477CEA2B6D04C24804AA1597A4A3E0B7E3E15D307D8A13D4311F4EA895199D208B23EF +DB35D975CA9D6D9A036F27FE597C41804A8B5EE10EBD4C16DD09C6228988A780CB315C53 +C2455FFAAB2D71FF87E67EE35A65AB2B8BCC351DCCD62BE2DC199B3574FCEDAD5809517B +8E3BB1B197078CD7F691B4D0474EA1F398AE3AF07263E8BD0842B8012EBE5F51CD5FF11C +35CBA2B275CAFC8D0B3D4FAD5B0931C03A3E0F79F31EED87ED8AE3C4F628FE1A1F2205B1 +55BAC7504D754C58BDC458A4B24F8A4E1401AD5B66E3547DCF9409C1C811CC2DF862062C +74A773A5B7686504B4C7396230D5F2F0A2BE098245EBA1758F20E0E5FE2C94E899AFB774 +4F29CF4D61334CDDD7C38BF479B0CC3DA8E67FB6D3150523C09A24286D86A9F4E1F5C2DC +CB18719F6087FD27EB5BBD9BEDE21B10C26BC38CD98952A128F4CF48F8651B97F6244F23 +E61EE0FBCB5D3BFD9C2E14792920066CA5E70449C4F13057DFD33A11B71C7991D29A7185 +CBDDFEDA7CFB85ABDB7F854F4342EA020DB708556762994759BBAD1E9F83E7F2961B017C +4EB56B73B37F019A8B91DF3EFEAEF75E016457A70AA33D31C9BCA76BA4B805646F8264A4 +6C15C2470F4903A99B0D0BF9B7B7D384F640FAE3DF6AC2ECB533DF89838B258D8128F5C9 +1DB7350B9BDF201455D5AAC7C08F39B643D8CCF26AF3563DBA05B5AE422388644CEC7ED2 +3EADA9060442A728F966D50989C477BD2E4BD4E206C8B014D2707DA596661CD7035B526B +61CBD0FE916D0D7B4B22ABD91B4902C44187E74D71647F7143FAC8E4E9907DBAFE15215B +6F20B82E09B29630E5F1CD15268481847192856F1BB23A00D7E6522090B3672286DCA1E3 +D2DE32FFC4C978F61180D497D9DF1C1CD48B1857CBD40EA172DA1438862A7A28F570B5B1 +73B53E1E81C6EC11A269001C6E6070CDD0156DE95E320F3B496036C1136F15EE35D79F2C +962280292A3678BC4DE5D1C2535F09571A5EFF5379BA71C9996B7003F27BE9C810C68D9E +8D55287AD3D1B570C57CCAFB53109C3EB5674920E6FE3AD170F783B1AF3BAC0BA5CA1598 +6218777F4EE1FD7738963D6DE1D8E1BF1353D5D96DE89C2DE3AD2015265D9077AEA8F26A +9A391A61A27CB0F9E8CE16A12D1C2128E8CB7AE0E861E3CB56769A07E812F1169A283C65 +A22F19881485367B098EF3B97BB9E41775BBE13F4E1560F2AA0FEBE4A31118F55142E590 +B51D5A0867B89F00D9D461D74DACADA920DB5452D80982761B357AFD2F613113854673B1 +3F0F1EAA566427323E2B35F2FED6339DC28170D90EF4F8E4E77506115BFB2FC891AAFAA6 +59611E9FC6F5384DC5096D54E09567BA8379C7D058CE8A3E203EA28DB122519E483A46D5 +F527919C4AA0F635F6F29C4AC9363EA96B0802002BD547E0C248AEFB8DAA0A75DAE5B8B2 +7C7B4716769521B4F3A8B68B0251CA46BA9B7FCD00B3D4A59002B249860669961FE8F4B6 +B594B68D781B24DEE41869F320C0CA419B596F3AE725B4089A388AC4F84A201392C1AE79 +D6AD6F13023E6412BF29DFBF33F00D8966E8C87FB883F97B1430DDD9EE0D0E8ECE00DACC +CDDE43F90351DC64D38EB3013CFCAC2792F613EB56CCF8553C3D9A4B2E9544058BCA3B86 +6F2E33A68CB60097D017252DF367F584DD224D38163B6BB1F5E8154C9590B8E3425FD89F +4575B5150F2C674CE5421E4930766BE7A55D1A01044D2FDA079E1E5CAD18F5F0B7897741 +EE1F4FAD109E503F44526746BB3B5C803047AAB46B1D2CE31F3E026853F52528C3CF6BBB +6BD36DFB524170B10BC85C070459CDD84D25C0EC712B5E8C8D1E6A736993351DA8261CA2 +81F4013542CB6BF8168AE8F04C55BD7EBFAE0EA6C3B45CD9698C7CD576793A1007E2B391 +0310CC96F4D2C5C0565CFF92468AAD585185BF6A19CA9D27D6E1440CD56CA0AD46F4D1DF +0DAD5F2A2C1D2B1ADD80030E38080DC4CCD773B7E7A74EE7F9A964BFAD960B2542E6EFB4 +64FFA0ED1C8828B8C266897C0F7AED40851746A573DBF08F602BCF9E1B339BE24BF35D0F +AE254E6D6170A224FB5225D8859F5C440F96359783D21940DE8553275485D0287DC71919 +A3D81FA8D8167DDA0F42E1CB15A19D673B896729B2A492531E9FB8811837318C24546170 +9F428D0E7B0A6C416FCA1B5B8849B86EB6ACB1B901E2D90E0939F3856934894315E3BDB8 +1DEEFF69B45C8C7871E73E6A20B64362FECA450D8BEA3878AAA0676BC8F9DFF37AFECA0C +C1096900829EF7DE769DCFA7FF9DF38C9C313829A5B9A7FF7707BC554F1B4FE54214371C +6681D624954BBBB90BA5AAA44175DC50C6BF1E8A618471C3D1D58471F2567084E503EFF8 +F4083B75F03B7848069ED9AD01AF51BC5A9C3F34E0EF36FFDD3D3DB350740A56231E8323 +60E8327F218D6E7F2490258F03B904CBC4763871F37E1B8C88D592876E0648184954B702 +CA5FF4851485BE6501DE9AF291D2D4A55CE425E405833285358EFB271ECA61CB37942EC9 +9D53EED6939D6E828C6B2E013E0ECE1A60736726F77775C299D6784E51B1863D304A9069 +F217C825FF94E4982C8B3CC30242232FA59A8274011712957B3F1DDF558CAF79DE460A9F +B15A2D1A3999EBCB3501BE97E719138CBFB37242A4883B3300E20CD21EDBBE0F0D8EDE3A +D6940338657BE43C6C04EA6C48BD51CE3D064B55EFC5DD632E1084BD01ADDF53C114D329 +438792E470EFAEEA5DFD2FC40553C736BF612A8AB8B0FFE6F16DE99FCA0A0B5026B2A50C +C15F0886047EBA1F115984B30050C579C1CA97D31BF4167448D89B3BC66EB4A099E4DE4A +89F186334430655C7A2709930DCF66404322FE8C1AEB3C7952A4DD19CB35C3F50802FD7E +E82D233FAE8EE5377A6211C0D55E5C188CC858D2A38990ED8B2E804FFD60DA6C477D90DE +24A93AE87BBA8558770C427EE99A8623F26EA053C077837CB691CD6BA6A22EE8C584594F +B5A8F2C75D5ADF7EBD927BD53B6F5809A0D6088C094EE056EAB006CB8C4BB2C035D57A55 +57C3BB319E4F0F9BA89129924EB53F7D349C0435A1ACFAABBFF97E9FEF3DB3DF03C21E47 +C5FBC852A8DD098CEA2C335CCDA04F2D2C9E7E38A327C7D78CCA84B96C432EA51C9A3CE2 +37BDEED3EA86D69716E5D60DAA77F31CADE9BB9FA1CFFB8A3A293A5B3FF9FEF03CF96BB7 +F259C3FC6EFC422FC55673819F3F4272A675B2ABCF8A4DB411090346889715D49FB199B9 +6AC6C2981257EA9211FA518AA5E582E35E0034AC42F607F587787EF3A6EA75C1C396FC99 +331D4DE3A906906D334CE8DCACAD9D6880B84BE0068ED1F365B9E7DF9D35E79412BAA94A +BDF0274B01E64B865E7D4532CD08516C8649BCFD7EE65685B27BD947156ECBBB358C110A +5D5767808E8D924F31464FD3BFBEB53FDE41411840C1B689963B2A5781467C9E44E681C3 +5CB292DFF210C75FB4014107B364F2D3B8D3394AFC8B14BA28585E1238DCD8395E05852F +C813E23F7A278E72C7463995EAB78999388E9F093C84F3FE3A164FACC9A0890FBE7CEAFB +0C988CC963B228D9939928E886095F772F12F8B05F4D66ABD8F3332BF5426002B905A049 +886BD5D9EBA35960612E1DFFC74FB5479E37A19A17BCB600E200FBD9437F1FF156028386 +FA46C79694EF0EDF059E63EEB766646DFFBF7385C0893EA15B3A1C982C051C49F4AF465C +A9E6E837C463F580B883A93C1E8BDD68EFE50FE6616A831DF101F184D2ACB6112A10720C +6D173FA6E5C494A271FE20AB7959234BA355301BF8276B34BD198A6F6415C094936BB323 +322CD5957A5BDF76EEC4EBAD015276DEF92868B49CA04FAB36BF6670CA237B4530BF5DE0 +B5774A3E67AAE1EFC2653CF7ACE86FDEB7C8D78B29D1B92170D47EAD57AC140DCB44DC34 +AF59FEBC88B667842227BAE500E6A1DBEBAB7750429B00703863C2D3B3BD0420D3660EBD +6C14592216F03A404E4E46458A9370BE3A92618924313DE6453AED7361D34CFB4369C789 +770D33E94993EDD582C6140423189EAF3CDD7A672D0DD00207B86A4D8FACE9976D83D81E +CECF00CE22D20B441038D424E3958FFFB7FF68D6214BFDA59085FA022DBA5C94071A3F72 +1221CE61C19B19542C3321030BF5CE4D8022B49573793EB824E9CB243D0E9EB6B89A34DC +744450FCDD335E607B45DDF26A57C7DBF83A8C0136ED272D908A0A469C9E61F3CE9EA255 +3D81B9E0B98F323928B0F44D62FF942276A4BF297FE225EDAE82A20680A011229F58DEA6 +9FCE234B22B2AEC35A208E23EC809A5F790F09E11FD738CF62168B1BC2F7DA9564B8D576 +11AAE9CA0094FBAA861B6114A66A4692291D5F4EDF5E230CA8E6526C55B62C8FCD46D435 +6407C7082BCA46845FB9A2865EE0CE8F860278152F0A849BDB8B85E481132797F49DD35B +247BBE4369FCB4A20FF77D6F791568CFD158CC1319F17868CEF028224D2AF3243EC6740C +93FE35E7372CF7E68F06DECC8160B7C04F7086F4A4FA66DB58100D6513000C4CC90BB363 +6BC1B6ADE24EA559EE3245CB74502FE440D7ED58AE19B182E0EB645D7BCC5D8CF1EC26BF +D8BAA713B6215595BF42FC097D5DAB7C030C522A694E027CF558BA7EBD711EA18249BDC3 +DF346537E5FF50755BF03D38A338EDF1974B21FD6E75548FB8E2CACD173F40EB5A9F15B2 +FFC720F0190ACEE2B6E5B040F7B89AB214DD89E1E8AA859BF436EE19C5DE800ABBEA049C +9B6FA77C93A833C02A11CE4E502D174403B582F617D388CD71407FA8C7060B9F3AE414B6 +63F4B524051CAEEFE1C919346B60DD19E9FEC14191B72DC49CF0FA248E568F6AD137EC5F +73BC3F3F79CFF305D88447E05B4BC7B25D20B5916787EB38D2BBA64411FE911BAF1C69F0 +FECE979BA0267D3A297E80FE07FB6F6330C3D4E9777C095B74DB138EA9BE483655FDC269 +A8759203B594DB7C9F6AB5909651C4A27B18E51CE5F695C2ACEE18DA6AE89A3BCFF95D65 +365BF11C14A5FB2BD261CF6ABA383FC467C81FFFD366672895BA37633C3A89739B397604 +0734CF9218B3710863906ED0002D0E756F66DDA0B38F40882E388DDAF61AA9EBCC87B0DB +E04F06F6CD3CA3F24EBC695C1CA0DFDE7DDA8864EDA643FB93E0AD976D5C1F36F65E7A0B +2B1767B0C302AC325B83FB1BB658381C387FBA199CD1C3EC7602CF0E19C96C10890DCEC5 +6166BD141F3061BB7A0654BEDC8DB922337942873A2F6E8E11FC291F8C16AF1A0C8221E9 +62106D02C4F575F4A9F61287E4C20D948E9E4CC7E74B99776EF3A27A0C2ADF127E60174E +4BFEA136B745DCA205A07EFBA484F7E0F76E5FA389DBEDDE4557C73C6B8BD6CFE9D0EF6E +E197EB8A5EB0468F5A80F6E71F9D65382067B3216C740744E671A533F046B48D61845500 +488CF8202A1E91176F97E50970BC00D58CFC9B1BAEC3435DE567CC6B5C601ED7BD437C25 +86E02997F7AFE95F1AD71CCEC4E9C2B9D8D17BDCB66A128122AC0E0CA37CE810AEBB216D +C4AB46AE69CB2AA97CAC99C1C6A5B112A1BC553658BFA93E931B4F28ECC6C0C43E18FCDA +5972FCB8882A86CA41349630542DAF536846B01DD5ADCC84FA4AE1CC58EC5B325C4EFFD4 +E32EC77120141D233E5C02CF7A52399AF39D64F4B9000B881F13070D85E8DB91DBD38A42 +08D5C6D8ED42A48272851DE276E5ACF698E6088343F852E0B139E724BBAE48A44EDD7A63 +B5772F61E178C2CBC38F728DC708FD792737E5A495FAA3335133C45CC887FCC94889DB5E +2DD34C1DC8B2901EF49320B2B8E7708A778A54A540CDF310ECAFE13653DAA2D6C9CAAA00 +7AAAC4D9CBD01F61F0E1D8F35C06019B1D6CCCEC5CD9A1A263CA630C8C14EC325F8E5718 +D4CC035FE652C2A2DCC53B7EB5AB33B43C7D1EDACA8F589C5966BD92DF8B62D56523BD33 +501CBFE506B9061B096C184C5504A61CD6B5E03A8338F5B16ECB0324A8785DF1EE193710 +B76D5301448B0C664F565ED0538257FCFBCB051683FC200D4AD675FC4CABAACBEF11BC38 +E95F474AF3FA7FB187E5876B1F04A26DAD7904E39F3D53A1D5FED70E523867C3E1A5B65D +BE0B1D6CA84EDEF3D0A24D042CA491D6BC39647EF390BA25E2F998ACE7386F8424E3E03D +6EAA815E717F835E3528069BC3A65CE58FDC49B602E0418A3972D9E5F6192AF89397AED8 +32CB25A607DDE31B69FB61164EA5633C019B3E4BC93078739879A2364CF42633C07D1BE2 +57AF2B07A1E5ED68B06BFB81CAC77F6D2EA4750266E8919E8911391688D4EADAB19B3E54 +4460DA693474250CA9A864C17B7BB5059C0D08B32400A51339C4ED7385D9C1DD1839D96C +8C0A6BE1CECD38544854E9698401E33EBF50C1DAAD1652D0EB978D8025D86E07C3DD64FC +92D362A13E173F1A5D015A43AC3CB57732C6A2A204B990635B607938D99422B450E54B7B +4CF6D22BE2F6B9E936611A0132538CD1D8AF62A260501B3696EFBB0EE006F658EFD8AFB4 +19C3C8957B3D9DA5F8758CCBD17734D80E2E207A58E8E97B2B9B78012FAA2C73CBE0061B +EB3F30CC034F7FE5D3251DA71BD8372BCC7F271B5DDF11167AB166C59F63B9923F043611 +52240DAC4CE6B15DD8FF9ED6F74FAB00A4D2D9F89BED255126AEC97ABE2D0C7D3947907B +0AF2FF6A641A43BFDE3126F54E213C03C54E01BE7DBA01F71E523FCAA4C02970BAFC51DE +EA7A8530D73D62B5F3F457AFB500C5734AF579603D2CAB9AE49281EED2CC8FF7101B4F45 +F619FE5FD48A83D934F6A0D394B07B1235AC8FA8F3DC3CCD9479D87398074DA6AFC3402F +21B31DE8621AAD29EFD4F9CAF0A9FA9D9A0D097625412B4FD723E1363E5729F40D8C02DF +8D222A48C23B2E25CDF4F69D283E006E0679F1BD904A9075FB0A8094C1BBC3400A2BEE5F +736CDCFE47991E539406DFC399BD0B76D3A5C8F91BC2BCD841E4AFBB521D46B8E0558F4F +A800637D47167FD2EF79F5251095FFA2F3BDB915015010FA689E4E87F921298735A30EAD +938B6BA40D4E58042A3065AB059C598A96DEE3AF09237FE8A6BE9CEF014AF36D91508C93 +F7A18393BC321C3A4110B160261477F6D9B6771DC8738D8259BC4FF1F2C1A657638CF4F5 +08AA9400D4AEF4ED4508BB30F35E38D968E008230DFE501A9612966F7E35B6D8DF26338D +B63BD1B88885992D8D3BC7EFCCD89622689192CF14C328C4E4DED3025E56F3E73FE2472A +144AF139106A197E00EDC57C2443686A234D214FEE4AA2E3EF978444D4A2BD1373423CE4 +E5F82099974FE66D53972F774F2BCE9003538CC59003D0DDAF9889FBF2519EA31F3A515F +8D2C0091937DCAD3FC757E18FBA1C37F8FCC69685E95932B3DE60F80837EAE690DCE306A +EB060698E560BD148CCCB42240665ABD523CB02FE18214AE45C44756E9D3A8183DED7506 +E560EDB4D43E3971712C3D23714B0F83D3BF19C7320FFEFD07E9E8CC573D97FED37FD3DA +5EE98331C70CEFDB6F6564D8EA0B985F1206239822A4644CF2D7ECDC63FC5D2014359891 +5916E41FB338545CECC1B9E37DBEFCED4A55DB485C86C56EA97DA572A2B74D2650C8C839 +1C57A1FC4F75913C8446846F26614E8C72080DE0FBC3FCF92864DF37F8A3C66109AA56BB +3CDD02BF5330C38BD39B081AFE90F775FA6C78BBFC51DC0FF37B9CAB4058888CB3D4DB26 +40D7224C0DBF9467C720CBB5F684B2A1CA8951B29182A3913EE398B8E77CB27868A439CF +9DD03BAA0B60DEF70FF776096D86E71394968B7D64CE289373BFC8BB2CC0BDF78E1178E3 +D6F5473427E7AB841223F963FBB2A5743A823367D9AC4A5ACD8BA483F5BB5AEA19B1E882 +670B74FF997E3321BE8A96D7C0435EB77A36F7AD6AD0C7B21F5C74895090908FCDDFA655 +628898D8FD6218A60C301D959265B430369C564E01CDCB05F42B520625FC0FA93F9736AC +7D5ABC70D1A25F6A6A95C1CF4A584B51E9CA9FBFC9F24EC4F2257B2AEBBD9581438668A9 +F84CE7E9919C84227D76B11B1BFB61788C69603F0106CE5FA226129EBAC295709495748D +7E1856EF2F1D5F19458B977506F64AA7E433E4E62662F10FFF43701F2A726C3F8CEB19CF +D467C3B4E835A99941C7E46101CE2C97683A17530F32808DE665326D6605984689241CD4 +5DDDBB5C964F3FCF7FD89D8B580D941B856613EB1A8E59052B296E8CAB02B561863B3671 +E0E73789B112F7DB5F0B2313B083D17166D05B65DCEE648210AB9D3F3DFFE60EC4649552 +2F101001B3FBAFE7BF2F0EDB70A95C572767FC1880F84A70DBEE39648A176BA8C7C87EDC +D424245F6F66C910AAC0C60E5078260A698AD823965D83268AC7A98EA0E7A23A7599470F +F6B2E6C6F32FD3714B210C775DFF039590A0A159BCD248E95CDE7A234CD8F64CCD5ED383 +D2E49F9FF4DB2BC7E7F8E1F45643BBA556CC2A8C7C0D32CCE2D17CE77C6C8B021AF086B5 +1F0649C7E2081705B2C0C57B205E8C6985C849B01EF956BD97F8862BE1B061733C8DECB3 +47F4AA8CCF7FADCC4C335D3917604DBA283DBC054C76199749C7748A48417624EAB6C930 +B403FCF33E8A48AE4D064E70CAF24F68AAF18D1F87E4A920E2796BAEEA34BD4F208C90AB +87D599E2A4A2427715819D7FD510ECBEA421E32FA9C3B672BB5329FF756B0E4B31C2B16C +ADB8ED6D90BF002B29D4B4F9AB7DB03B83EC9A165A3F1148A9C1958B8071F279440A019E +743A624CFD4166857D8DA38C230DBC91DEDCE97E006B242E14CF25EACDE17E7E2A6621F5 +662820DD295589E5BCFEBA6E737C3DEF3D3482D7737CDE224E3509858B999B66F6F365B7 +34C207A58FB6C0DCC099E1A50D95A7BA53E0E51EB4D6B55B681B37FDAC9543F143EE5B57 +292DE45AECC7F8528F70642A9ED6A987748EB0FCF8E4964131787205AAAE1D84B18E2736 +911C20659F9813B7F90F69F2B93360E2983CC40A3122DEA8263FAFD8DDCA7CDF12908042 +F5B2045B3AA8BB0336816C80F1C89F7141CB3C64C08E8879145B10696164E0872635D06C +186444A971B188D84C0B908CAA9D14DE8E69A758841AD6FA932A648E9694E399F234D090 +D365A315CEF4F66DB8E959A56FBEC35DF6A4E969A49FCAA95FA2797D401DC1B42BD82BE6 +5BDF85A7B8A3FDE93B698F10F675E8E0B7D2AB4B3DB8E0FA5D21184C9487BCDE17AB44BD +DDC9278A72C83EC2896B02DA5D91F2BF9FD44D56CB65B65DBE0D325427E6456E4046DB1C +5229F513A4EEEFC319A58334835FA5DDFB73D4C8E92C4A3A2F449939939E07BF9B3B2200 +1488481193B08870E0F077E47E7946186ACAEB9FA732474E2DA080AB573A4DD27BD99894 +F2EED2C80BC44C46596FB47502649BBD83744562DEC7224B1CC54CF28192D3C23956A7EA +96DBF54D85353CBBA1770E0FB58B6F1852409BCB1BDB61313C3C7C3A349591AEC393EAC1 +BD80E7CCB94C3604C5BA8B0828AF45182C683FF51D2D2C00570F6A172E2F9DEE877B03BB +45E866CD7E5A99E63B4141C4B12A21F62CFDD331137CD027F94DDF9F054C162D74FA1CC3 +94F404C707DA1F4BD2A8C1C762F243F14FC71E546EBB5733C43AB43FF23BA9C2CB9058CE +3F3808A129A03B6E13BF8DFFD23A1D02C839FB6ACDE2BAD2474EE64FF7AF05FB40E30A23 +6BE270B787D6FB1FFCC0C4D7625B13217071FE46C2DC56DA79F278C69E85D7856927D0FB +108EFF1E3AFBCB9CE54BE2F76DD439BB182D3DF1F2796DF6B5733959A950ECCFFE7E0B7C +6BDF71CCC7DA4FEB31D6FD79C506250FEDE21414A1A842747F350664CF53E6710808AD08 +A6FD26ABD8CC592F693BA372A5C0D0A6F4277A92553CC72CD6212865DA7D032D1904F1BF +668B0B37511CFBE3AAF595EFE422FB3007AE3022CEB6C87058941DDD0DBF6F9ABC5E8CC2 +6AF7BEFBC1F4B1A03636965919D070FAE1F7F9BF42FF16E9778708478A279DB9DDA512CD +B372E39B9C5C87CC7A6E55BAE1626E8AA3ED7BAB198149D33D8E79960DEE846CBD2ABA76 +1979C57754955E90D7533C0B38CE5851C926F0738CF4EF1BB2951DCEBAA0A0704870DD80 +FFDF92D2136C1F470FF5345C7A93F4DB72360B4DAE833E2614154FA43A2347FAF4ADEB0B +73C8FB0AE22A42F80B03C7207F75851AA036C76934BF67B10ED6A5B2000A2F300A9E1552 +FF9F4C66ED0FB34900CB8649CA50BE457B967184D0AE2BAAFFA2AF24881761BA01759D8B +EA601F2C09E5A15B1289A9BEB266392CF5CFF78EDDE664F3FD6B77A6C10BDAB1E57E4ADC +2EEA4F2897D2ECA99DBEDB2046C7E889EE2FB30F172EF290BD4E16FB68C14E88A58E3F70 +9895FC431776EC963284E03B6975ADB155128913F0A3C910E6D3F0AA11A1D6D67C0EF96C +145D63F6E629C61C934BE19A0EC8D5ECB08AB1305C5C53F41628E7AA2945D72A18F5CD78 +3DAEDA17DBC867BD813F81E2D828B09EE77EC5BD7943FAA62E9682214C65735152E0AFBC +E7808699369C181FAA4977771FD8D716DB2BEA0FA4CFDB606A2EE243E0F4B576A3C5FAE3 +8F67C4E29DC0D86EAEDBBA90803E2AB710F16BBE42748967150D969C2E07115A9B2A2507 +A87F7EBAC946F7178505BD9FB0E08D86DAAF88D8A5EDB321FC2E7915CB80E6C0C2B125EE +0FC6124990A00E685E157EC94D72CCE6169F852E0D19DDAFAD022C4DA4D19B979D33790A +E763E04F78D6449C7D3674A12D1C01BD73872284A3D7CE4B551CB80602FA4145DD2E4360 +1CDCF3D6567887A6B0A73B7E1B6BA01DC93C51E9FDA181B20835A75541320F1BA53EE871 +16D938FC03B909D4FC6558223DF057E3E6195C1E26D33B28AE7156B88D7B5A6A85ED8498 +48EF890A5402467A8B11E2DA4719C395D6F40E91535F1DE6C7FE1FA57705A8F1321E2D74 +69593D7E6FD067E07B51E7BCCB382B1B00B655116F3F382D990AFAF26347CC6FDA803727 +C1E13C6429D1F5D5E5D9D56EACCDB32E30AA10DDF5E0294E59123E4C2E020AF1D13A0F89 +99F30A49D8049E7D9B8676D2C13DD896FF4CB82995F6517462886B4D6DC37BE8B13D07BD +23CC78524F835DB22AAB29A1E6468E8607FE3C9E1B1CDA29B98623C87EF39A2DE0BE849C +438EEA208FAD0DF05BB478D8E54501EAB704ED405598D38D6A58628BFF784EE969725A1E +8BF897007D0D6F53025453714BE52FB6A5E4FFADE5563846F778B71FB0D225F8C9AE9985 +9CE14DF67AACCBFAC3AFACF1CC6FFB6BB517C87A382D1AC1615DFD97E52D3020E531B8D5 +C6318FB90D30C2CE9EB7EC0D2DD8FBC83A48BE41F22EFAB7B5CB7262E8BFC1196C69AA92 +EF1AA1D59DE9B1C55D5B7C0019D68F23323CEB4FA767550B090439C2D1867631A97CEF5E +7871494CBCD1EE56C0EBD4B2EC412EAFFD1783CF073E9B6575CE9642F704486C6CB319BB +19CD270D1EF9B63FE25255F6CD5D3B77B64FFF7B562742593E6DAB5EDC5E9E9467A1A478 +8BFE80F892B3DD660B1765B757CDF91B61E5AC7C7FA68857656473C32CDBCC21C3A0E812 +FBB939809D552C9394686F8CE36CFC3FE8994D26CF4917CF0F11E0DF8B806B5AC7B092A9 +255EA0364A9DF03B85D67BD2B4B4FABBC8161542814E432486F103F2DF6097DED715E2DB +B130A753D35EC68126DB76A2952575BAC3FABE2BE9FF73D18E60BA667575FE3327769770 +925F00FE13573F5050DE00CF24CD231CF619B2351371433DB15B1E97AFB39FDC4E07F1B8 +45449EF4CD86B3F0C0BA12D52A81D5386A9B3DDC62E588FA80D5A1E31FF503945EE0FCC6 +841AD3D4E56F9C801E84B01FE978E7684F451822423122221FDCF6702D48CD226DB839A0 +E095A31975298CF2FD71E6423F0FA5191D8BF7E27E6963A23F31131E68278485BBC5208B +6C5D2765BD053C47566A65DC4B173E1580183763326010D54652BCF7BF68FADE1E3B8B28 +E5C601E241431E665178E56C36AA1125B07D8E4E9627027D73CD5A664B40D82199E3622B +EB76FC104B2E5A6E009B4AEB180ADE287F763B73A6F8636C0CBAB936F79859941ADBA525 +72CC725A8834FB6247ACFDED0131BD5032ED40A04AB7C655AD7E954E4CEAB74524582D7C +142FEAEC28F549E36135C085A35DE07E782E72CA53BF7B2C8EE8C3D8346E2C2BA619924F +FD9E5FDF9564723BC0FBC215BA0F785532DEF5AE95939F027A62A402A7FECD77F064AF12 +9472A23D2118B569DE04888A8ACCFD6DA14E928A7C2FCE35531FF112F93202859771381D +6D161E6BCF5C6DE9B375DE8E983A64AE6AB75FD52D590B78C13885B46FBEFCABED5BAD69 +04C4624E71B29C4EF6B6C2564485210616C08A3C41C83BD947940BE454185EEB33B0F0D3 +680F9BEC8417063BF03100F3484678BD0F51869F3244EB71775D0397B8DB029D13A2A318 +2320FAC3561E7C994DF8F94EA306736B7059857552CBDA0E2DB4689A1572B509DC658E6F +5C7FDD812DBBFDDE644F980A58E05F14454F916D4458DB067719254EF77A887D71FA3385 +3D6A8D1FD29885E3F52C6E424EE0AC4E1E64180999A7266C896CC3140A3C59DE77DD941D +376EBFA09D7F3761704BAA2C738610F39E7FCA335BE7B36F9306795D5B2056C57FC42C84 +66BB9141ADE2ECD7A4ED5BF9251C3091D8B950B95CF07303B165A65A4CD198BFFA8DDB46 +1032A70916E66838CF2A76CF444ECBCB9ED23B3B32143C9A98A395E51CFC281106A7DAF3 +74AD4BDF3089EBE727C93E58025BD6C8D917065C4873A5DB3E90084716C5082F6CBAA4FC +E60176DA9B75DBC2DC5BEFDEAB261C915A7F68CD5F3296FA854324B661BE571A9CB98157 +9C6FE6A5EFFE43C9933EC292550619B794FEDB97CA0FBDADC4FC665D7955B43BD3B23A0F +1B76D78F7A1CED8FE598074469135890FE8789FADA3CFD4FB965A1FA62E55328EC450B3F +1E6B00FE274A494D25E94A2A95131D5E6C8DC6E27B65BEAFCE6095420696940A282C5AA5 +B9E66F243FA307C989352A1D557B83C5855C004D86A4BBEB11BE9F152693A77925B014E1 +6AD084959F78B2A136EA406231AB1509E43176B268B8EE14FBC281CE832FDC2475447A21 +49CD45645A78E4A0027060CAB18394DD5A3E7721B27AEB22C9E98AD563BB5FB2B0A0A759 +93F090DC2249F1CD8ED869E0316A2AD4EDB4C24B18B758AD2C746AA9E7544299C8170211 +6D591080B15C376BA8386FACF02BF9E84AB8C7470483A4D6921CA9A2F191A42BA49928BD +BA244CF5918E55F59E27D9CE90517F9485D91F1D5B02EC941BEB6AC9C7CE3E684E882D18 +7C9B3EC948A745932BBE4DAF8FA61A84FD7D1BE556891F8C339E63457FB447024A3EF140 +99E8FD37DB2AD623BA1476C883F62395E98C1B99F981F3FCE92A9DEE9D99627F5DA6753A +F46B1B69666048C981DE59BA35C0481FA33A17D511EEDD45D90AA7576573625F167C3BA4 +35B8FFEFBED92F368B92A0DC32975BB2C9C8B1A121CFC44075474B78B496E953D45B9762 +B2ECD85E0CE52B15510E80AE563235E400CBEAC6EDB602386FE1237ECF4D3C14C92280CF +F9768E60748AF4865981EDE419204FD2F18FC50E49245260BE2319DC1E624C2E59BFE1FB +CD04A3F5FAFD8D159E42B8E52E0B2279FA442E613AAE3DB6A1016579D3170F8F489E3793 +12A6E32F45128B15E01373AD0C1449D0E5F31D5DC50EED3EB856629EC2E51616F40C9DB2 +F4EB8BFC519F473A02BBF02FE0E8F86D0EBBDE611081C24B3ABE09239A9682D8D573580E +86D5FB31227823CABCA34D9BC918F38D9B3273223408871EE2D29133367C6048E0FCD93D +22144710814CEF24D9680041F020EC73546ABD22B6F521DADB8E1F6AD20AA8F33FDEDDAF +273CB366CC1F7FE33927075C911FC4D9D8175A7AA4E483C2F4AB658EBD523405F83F5CC7 +E328F3FFA5A66900508DE0682F4B4632880A3C807D606A2038F796B3A150F2202C538F3B +92DEAAE46528E1BA68E19E6FEB80CBF5155A91C16AA6FF5CA472B4444D0981D1D9F7C9E9 +FCCFF9E67FDFDD78AA2AB765E34C7BC29B2D8BB138AFFC8351FA98DA41C552F6C1479229 +5909A4EF7F4865E16BBE81EA742178C3E86B9D2B957DABD2D6A558921D4FC3429A30BA66 +13783DD39563547E9CD1FBAE6257DA11204DC8130C89C5B80541E0668752872C050A4320 +92BEE57ECC95266FB612532DD8D5465C938AE4979559CBFA8F2D7903E48CF9DEB397EA6F +31F274D48E8956D337310359199708CEA05DDD64CA417300ABA7EBE4CCB70DB7BB31FB45 +E2B9E0F15423FBB2EE5964278A536790F16ED4F9CE31F6DACE8C0FC489CA73D2457CF3CE +BB9BEBD0CFD2D1F11816BACCA5D4F9A84EDF8D7F09190C16F1B6D1766AF98A34E5A28693 +B555E507017C1B9A1B9D8D2F52E2899ECEBB6A341BDB98DB0885D97C5BB9D35EB6D18099 +594DA2A6257D5E4806D45CCA23CE2545697E3DF34B6E7558D080B030268AC56A576AEA44 +B4DA78A686340EA9B2249C58381347DE308439CBCB5988DB881340139156FFCA9A8961C6 +2004EB36FB0C77F8B762B388EAE846531CC38B75AEF785311A6F8AD5C0FDE8A61D89292D +AC55E1920923E91BBDBB40675A3D956163323406F2EAD0BC79E4E31C2C2B22B46D266657 +FD150611305CE08885360A76FF28F3DC837ACA58CAC71443120508A80F9F7086DAAC40A2 +9082706907B9751B19D67567FA243BB6595E1DF225DA36FC4F8D86712B1BEAA0D297AFB6 +D20AB0ECC8CAF709E991604552ADAD7F22F8F229527B60BCD4DD9786AA36A13328881677 +7E00F57F9E562B2CCF2D1F6F6968054D8C9B08FCA9E0DFA07C11BCDA281DE484968626FB +52B677BCAEF983444B24B0D959B66FBB9631AD4796C435888E09D90B1FE97274D8459A07 +9863D3DF6856A45BF8555999FD430FF9AF50FA060364A727503362129D627BCDDE83F679 +549FBE4258B08DF47BDC2BC161D5E61804588615C5CCC3CA6948C25DC854EDEF94A2315E +A89ADD8163BFEA9D72B430ADE3D9C17D69C9362D2827EEB15BFE3B8806A8CE373469DCA9 +13FE773C8B9DB720538BCC4D8D5481CA29661C00D1F5CAD55799F363AD2CD563EAAA70F0 +6E250629F63A0ACCD3AB2F89F579557B8299F1642663399DF9DEF3BEBE9F9FB3505E9581 +4D58D1335C9AB341F1928FB7553474865191AD7D8A89C8505B88C1C22BA7E3A88A512AEE +41B79569560C45B67497A6AED27FBBE40C8B2310157AED1078B9F352B79BCC93DDDE7803 +F479CAF0EB48AC801A0BB9EE972A258F110446154E8DF88DDC10523E8CA22A62285B6285 +E7B3A4AD23216701310C4152DCD1E39F771BF8305D35E0BD42432A0C03AF965756F25CE7 +0869B6DAFAFC69C8DB3631C918A7CB0A1A6E3248C5E1E665E926DAAFC9BED400CD4584AE +03DAEA56407CFFE84729215EEE16B10BF164B5AD7303A77423679FE14F6626C934A14587 +97A4ECA95603E5F4023CFA4262EA9E949CFF449EF9A82005B23631255E615B060E4BE2F5 +526E06676500DB126EA3D38E3562E1819BB68624010F5A984D446790AC8EBE11C5137500 +1814CCFDB10A27EB87382CF5788150D66B803F0833CD73063F2CDB1C2A56E12F8DF75310 +EDE85042D615FE028F68C668017A2A32594B89C428059DDE3FCDB18F9906C7E813DEA4EC +C3296C1A21BD4BD3C373E91E0D6B6582D99DF35F5091C09602547B864DFE966532EE4669 +49DEA26C0F7B42D8023F8EDA050D8482361EA43C52FFF4F54335284BEAC3F427B6C59058 +912C233525631F113FB15B888D5112759466A337C37A22346C6A4963E3CB53ACB141A59B +3BAF30349CA7D8827C2CEEB62EDBD851C2AD9BB8083DFBBF305ACE6868046BD93B59C2AC +75D6F3B1C243C6EF66533D2DADF52D81DF1397ADC532CE86363BAFD043F9B1B8E6B83547 +4E3BC3018912BE08A570BB4000BB13F249F38DF8C73906EE9ADC7D5630F04BECA0A86EB4 +52ABFECF46D03CBAF4BE02061EA50576A984FEDE9DE35DEDE1988DAF0A6308EC4B6BDFE2 +CB0C7198122C19F73CA7436955379985DDE2ECF851D83A425B4427A4A17AAC64D9E68691 +2645FEEA0A8A0F7A7C1CC0B3E96C519386EC14626AEF3E9E8718877DBDF45C9B8984F81C +99980A8F8F3C9618F34407CA7916D2C4741AB9B4F916763E1592BA2C2D5979E2256E2D17 +A77905EC38606C3645F1348E77ED501DCB783B8BF677E55415DF7373C47212BC59CB71A5 +4425410E29A19F74A9EA8AA508B19464BD0BD1958931B135DB014C6F358ACB880C189070 +E27188EDAA43009B515994E8F3481A9DFF6DB2D5D474F0957603B0A45A7E6ABA97640576 +11054B1ED7C692263C1B2BC424FC68615E9973A230849E771175432E48746AD8E3A15746 +1622190775BAF10F8BB66D2DF99170760B26DF8714BDF178334D0F90A615939C95DF51FF +D90B28F5BB67FA593ED31E035342E6F187DFAC21FEB26107E4ABC7F484AE11CAF85543EB +6FA887B4FEC65A760FA33E6AD078F420D4828B526B37B4AFCDF396459B6338896D7EE8DE +FA3E10C6087DD4E3F56CA302D955FABDF1EC04A5FE4F12CD40535879AF0AA992D40E53BE +2EFC1FD35E3DFA33EAFBBA4E851434334BD4551B4228BEB88C5F8D259864132E2B893C98 +2A9560ADB25C06487A75809CE201F001E426EAFDA88F9C7AC36F57B06B212F03AB8FD9D9 +6EB6122E968F3536977ABEF5E75AF5C9C30684D3D7833E3495F7F9BA021B5C4A1F76408F +B42837E068F91D9D2FB467802873702AF6216CFE60C42B1C8F70E7555AEFAE95B6D44C9B +967E68064CEED38C09BC1A3FC447FEA9902A26B6D5FCC8A42F47AD2FB2C4DAC61AA0ABFA +58515C45C912BACA7D3D32EB79DC14A4D8DAD9EC0CF8F4F213D3E109127FB7047D2DC47C +0DA7A5B790318A1E13163DB7DA71AD64BEC58BCF31A596DC90163B1C46C9175059B27DB2 +D858EB1AD055891E58C34233140240EDA5AD13695EC1FA606EC0CA9CD84293A75829B1DA +2DBB20D97F96D626D7E6D2332B664BF543849554B07ADAD02CF6DFA3BBA2D8D707810B0D +20BC441FCAD69B8D986480B1E191FF390FA02B76787CE41E3F779936A2EA8CC0167BA167 +E4E08204BB8F4D0CE908AFF57F1E9CEB3F00C1B863BF65443684BA425888ECA909B2A6AC +5436D996810370BE779C30D21941A101B2EBFD4F38DE2295CA0FD39AFEFC997377EFE1EA +C62A9347DE13284235061173CDBD0C97A06045EE97A193E79350B8762ADDDC2494A68628 +173A30563595266EE3AEAE1179EE7CCF47A7F9A84DA4B4120FF6B12FD8784BBB674404C9 +973DB36020A9A7EC459F263213846A56FB52BE79B8D1F52FD8EB086A761C665D94D01336 +D5029A5C9C7D7C1234BB170E90CBCF1AF8E5F5B21CCF7C11F9F2A28384B844B1F8F1E543 +393EA9DFDF15ABB11520408BA5242CE5B5AA7EDA7DD72D3D9B939AB2AA4257764929C8CF +5F6806A21D524DDBABA96FC46B942AA00F9485C1F071BC6C94E65A153045F88BACB20D69 +6EC1405D8880ED1456162625EF0EDA8ED6022F4E6BCB8800A23F762EA3853E45B4ADE7AD +4620E7CB83EB1CDBD40ABA6234EBE853B3378EBD4F077AF9E12E692995EE06D45CD4CAD5 +ECED7947A89DCE4A66F1B265BE66BCFAE487B41AC623ACDC6667018626CA450FA2E60512 +23B86144AC9A5169C29FFBAEEB9E1D65CDEF2A5BBD29DDA5021AB9F435C459A3809A5DD3 +6EDDD773C0530A1BE54910B014A6AFCC1D95E36A5C8C7D8DD1DD091D7B14E811D864B1E9 +41122A7867ADB016F949DFAE0BA06FBBBCE87C833C6B244AC48A7481C54FE756C2438B00 +9ABD319AF57D0F69874D274F96A12BD417E8CBA7E20FE608A73A88A935EFB77DBC198005 +1CFB9CBA94E196A412C45CAA4F890DD9334611CA1D8D6F6DFC3C180180F22683BB00B8B1 +0D78BF4D64DE288D2ECA95878C2BF266880E547D3826C5D1F3C6B4B0A3EF0345D8FA66C7 +EC77180BB59A6CA349687F18FF5FB5B10AFDD7A440E20F55650F258A10899BD9467DE2B2 +086D32150FF9242346A6546F9A1548436BEDD02049983A46A2CDB4BBA8BFA5F04D7BCD4D +35DEBB30496780236DBE224DA28218DF58037509FAAF6BE46DFE5A93C1F072F37D80FD97 +33FDCA1345C468C85CF501D4EE30D36EF5FD87837DDFBD703B8F6AC4AB3DCAAD7E7C5E54 +B6383A74F4533EB9FBA0BD8D1D1703590CE24FC3DA5E5BC929BB6EFAD09F02BBA5E30315 +2AB1CE32A6A2F61448A765D912A8DCD8A8E0003CC2BF739F4DBDB388320D990B9F00E04E +05AD6B650435F44CA9570D878D89CE782E06C68BA9024EB887C6FA18223F587338BDA034 +893624FB950E74209BBD763A9677FCDE1236B74CBCFDDBEDECB58DB1DC445BE8672ACEBB +05F0E677D133DDAD4607720462C63FD9409C29C75039A9EC34EF0BD89B3AC6045389A3E2 +136C9A6D502D335789CB74B7F369A6877C01CBA68278828D17C5B7C0DA4F385FA21DD8C4 +C68B9E17A35905DC4006DDD3D35186E31CFD74C26E7FDC450E6729F81FA36000E7EF2AE3 +9C4D80D9A94429DBBCCFC44A7044F424E90C5D156CE1696CFA2EA4742338359287297CAA +5D616C1F7C7E7E71CE9099028D6516FFAE321143EEA343250553B3249C2937C1797ABCEB +BFBBA9BDCCD5A15DFB20E3772660DBE2C410BAB6F4B1BBDC61AF96F88BF830C23564D4F8 +2FE22F6B22B63D06D1B40DDD976E19C8B361239546890888FAC5E7ACB15C4762C4871DEE +EF368A59B6BF8A359E29967FDC8A59E03E357D3B84843B20EAE12741CD9E2F2A3A32CFF9 +1DA33E881008CC686D03A1D55651986C00F7796559D4D8825AA811EE8810B921FE485D43 +1873E682B76E96ADF5A586B9C1C5A876AD507C51545009F09E2241835ABE9C6CBC76D88B +7BCA368487A11BD7654EA0B1EC5F8EFC9B587718C732037B875ABE9F5D44C82B29FEF550 +B80FC0FF7AF43A6CDDAD7A3E8024A09C04CC5570C1E91B97E7829AE7402C870E5496E8F4 +B12B0D9DD500DB6F8546F7C2F965387C37A701F2B43D236AFDD777537967741E88F7BEFC +9D9B3C7D6A86B1AB92919A48589CF276BB9F00DA2D7BE38F46C9E5B2365948E32A30D830 +0FA8980D7D7C6ED2252D9465EFF276856698108122833A0B3E774EFDF55A69070FBC7E53 +E955C4E02CA71323261353E8F5D1A4948ED41F4AD7E25585E6DFCF5553C9187632617F3F +9D2230A478E4BB63497500A3CD8AF78C780E700B14272AB399D2D2FD9979A9F422DD2B92 +8CDDFEED37A40A77F93A1BFB9ED9297B2BFCBF9FD40A44D2227F4C7EEE3066F1020EA335 +91BCB47A260B744919F0359E2AE3C619592C325474063675E5D85DAD5A00CC879EFE071E +68CA2CBD108FAB3849D312DDB823BBD18D7C3D61DE7A5E4AFEDB203D4056B43EE1D93CA5 +0BCC10AECAA08799E0888B637B6D122EFEDF40DEF30CA93485F424928F3CD6AC66D85035 +F8BEB418C560E00331294B1F57831C33F8ECBB2561837A5A0B0E5E2EA2DC3F72A1C09990 +11BD2F0A0916AD62A8DBA859AE63FD73491390CDE70B0C0B7D36354BAA08BD6014B790FB +33FB26BF6C2215E16379072959ACBEC5485642A7C7ADB0B826DF3390C36C9B28E724D2A5 +7F57EF0B1846B358669EDBBDA569EA1B28E9AFF2DB2A8DEFECDC073D954F3879175289ED +9F159376F3D1301EF514B47D3EDD5092C4618A80D20ED37D4EDFC8621CB7E4683AD8B2F5 +51D666B8F39C0CA193BE383B0DD31BD540408314871CDEB6117ECADF8E187D1D5ACF5239 +1F8B2B1C6E6F89A35022D0A2B8CE22B79B200AE116A4E9E097872CFCE5BFF8CE9DDE2E85 +087649207EBEEA22E07187C24404533EEDDDA851CA5E7C18657BAB75029DED2D381CF4AD +2D5D52A310EF4B8477008C11393D74B34F0FCA4026ED3C12C71941A6D77F501A649C8823 +2D9A1EA080561578DC7A1D591B8E922BA280977ACF3549A24125FBE9049C30CB9DC547E0 +766EEDD5C0210C248C4E7E435C81AF15B187F84C216BD842380436BC3467225938AAC1E1 +FF7CBC6E6C59BBD50767D3BCFE93564F1905AA38F1DDAE4A783E857D148289304F8DF194 +CCE5CFE440CEEDDC5F3CD1E1587F67DBC41DF3CB4F08AD19178CC4B77B1DA3CA02B6F40E +36984E0439E53877225B9F8576A9A2B57286D6F759A060956CD30B6E37473CBB55D76FA0 +2F4588E66305A1F40DACA56CBCD42883B960B6DE2F91DE519C80D8FBEDBE38024EC6F6FB +B6FBDD5323235130771153124CB95ABDF622F737A42078D8E81C9965B7324F231A072739 +5129FB30006987B2BB806D414672310FAAD37F3FD005EC54D6BD2170AAB9A21E52A9A7C8 +C6AF03F51488D34B06F22D93E72FA5BF7097918FF67DEF79A6D62CB216ADB114A01CDFF7 +DD387A0CC150E852D4D267187F6A6DD6B78C9E283C9D547DC6373A36F3252CC683CDE9D8 +EB7221146E8C54D1A90DE57003A0CA78440EBFBF35028112B431C508298BAB97DC45875C +D002FBC1E47BE8096D13D485E2604EEF44B0324B0F494D874A723D080A9A32B9668605E0 +18BDA773FFFE5566DDA289972B087D9E69268B2CC04CC1F22DEA738A2248F370328C7FE6 +D50DCC267BF736C8C3418626BACC805DC44F60A862413D4C76104D6AA64F813ED9766563 +3236CC8EB519A9C3A2D53D20658BD68463BFBB0B97A795A78280B0C05DFA3FAA5EC6E6E2 +879ED3817C5FFD07949528C3C60DC6A8F1C73B7B87975A101AD9097F694B7D3140B2EED4 +52E98F073ED4648992EE76954A712C1804DE95D1C1C98048E5ED790B3269BE49C7653292 +E69CB482E19611F24773F00E483B8541F7D1EF3CB9730F527FF6309EC105CDDC9BE9F9D9 +4C28B3520719E5AB1EACB85BFC4CA92ECE780476DFB3BA759550A261B675ED4E1C1325C2 +EAC510BCF993FA03281FFF75833EFDB168EAF8B2AB92AAB82B389E7086822363A74829F9 +FA36C1703081E55EAC5E6358866EAE8BC04C37770DC97392713F110C143B7CEEFFCDD84C +A6713C01B4AF3732DE935DCDC2223015E57FBF98DCC32ABA1A989176963124CD353DB3E1 +8998F5F322EBB591528544A4A4E0618076FB07540DADD6D00F8B66A60ED5496CBB703E59 +45EE138D7CD77C301CBF0814A7AEAC93127862431265081273C1E04B6C2B4DD0936D8F34 +98B2EDBF2E2E09397169EC99FB85AF23E929F4871EB8FED7AA77B2E22AD7AE6C86F15B07 +A01B8A1E3F8381CF2A7AA25FD49876DF2E0DB253DED331F7CC0A545BDFF42CACED8946D7 +9661F3A340952AE1CAC541F0F6E66682A22AEE604941AAFE270C3C2AF132C9925A01B35E +D770156A0AF4EF33B00DE099330D5A874F84A23621C6352DE80952305BF501442710DED6 +97682CB92BFFB645C2A48C49D47F8664BFDA17F5ED7A0F64CA28A05CA58F06A9296E6BFA +858B5A728B28E12C75D947DBDF779F738D67BE839FC0D80F3DECCF255898CB916E2BCFAD +74FE85DB8AA036791DEB28487B368F14F1FC79E54D4D94074F8FB530036B09CA8C44468A +A199990933422C6AAAD716F03358E8FCDE9DF706F0590037971AF1D705DCDB45085D8940 +31468CB922E90E44AAABFE7DB1D6D4BD37081491EF89F46FF4F7FEE501495112CF757202 +448FA93DCDA89464D7AABDDB7BEEFC9671BE5A929DE84677636F12F4BC22A59E22F57BE1 +E680B67FAA2F00FB39B6FC7A48E43DDAB93FE9DD75869375A874B7CD49D22C314D617848 +139D61022A79D94AE1FF9E07C7A7C3437709E09B92A8F33AEC386DD37374051F0387BBD5 +F366C3EA12F5AEA0569D15B22729E006748E900A17E5D4EDD52FCF4561925C7ECEE84B3C +F29BA83B03EC7ADE70040D898BD3EADCA66DF42045C795ADFCEDE3DFCDAFCC68391DF6BF +C9CF4A49A45550F6301B581D19B8A8F7CD9E06BE7A3C5358D6A319188A803E8A5CBF9877 +B8E53CBD98E3CF270330BE2BE853E5BEEC128633EBD5471D9E5AE1D67D28E17C752C5443 +E16B6E1AE341E83ED9B6CFCE88A12A7329525C0A3BD2D8AFEF72D727B3104F12BC874446 +FF1E5204DCFC9CE7F772855D63A2A8DE36D382346F8C43D7153B9BDA92AA04600267E704 +E9F43F3D625EE0EE228617C7ECFF39AE97806096BD66B914A43EEF2917100C2F0E1B2554 +C891D50C3A0037190C9AD8BB6563E004696DCE62881C1F6F8F05A96DDAF3F89CDBB780CF +6B7196124DC1730D05CF821CA85156F7EA996C7E3A44BE8D4EA29ECEB2E49CA7D676EA3C +874594DA4B8ED45B1568EACD8FF68963E24F2E05EAE0908D1E81165B872F3C6284181CD9 +A06996A7D247A1661D65DC5558E0CBFE14724BE1D44B08A1E06D880D87905E889AEB0ECE +71E3A9037621470305B423EE63C2BCB5B227B264A4CD5CF8573D8B320004D212B65A44E9 +A856A3631BA02C46868994BC9985F219C9DFCAD9591F2B76B34904DD221E7C9BD2DF06EA +B632E6CA2A24699AE6C9C6B4937A8293CA61D36F3193D888D5081E4CCB837D93438602EE +DB2D197BDBCD0A00534B493E250ADEBB1D79238C8F8076801EBE4A282C98750ED7BA28C5 +9B903A26553E03E5B1B99A2B1D13BB6624717357E3F368B65C8B2AB2606577E45345C971 +CE54702D072593814090A9EE9559DBB28B3A3F44328C33F652FF066F87F1B251EA5098F1 +1E970A3505B982A023147D7D8B077E626727B1AEFF6277BB306423D55070829D73895B67 +3E2E6F9A1F954B6EF69507E1BE86D6C594AE270D54C39B1645FDA847DC3D3267AC9E3190 +9A509C03DBFC0A063FE9FA2BDCF21199FF1397A93F13522702B339AF7E6CD121FC2E3D4A +22132ED26FB31F2EAB17B8DA9AEFD61386EA3EBB771A43B60EFFF3CA55238BE1A0852F8E +5B78DE572FF42616F1D4A64E40C722AF8E194464F506FB9A6F52E52ECDC7D31287373EDE +F46C5DEDA0CDAE20AD6C88D6315714304D8589D6A24DCD9A0491598AC69638C04A19C07D +CEEC1F8325317431B3892F270779A55F293085402C4B4085268AD69995186470A2E2A106 +44AEE77DBC20926ADA20F91B5BDCC0181BB34C18D1FB68A32808ACD569EA71E627FB5419 +EA3228DAE56414EA93250EA395BA750C60084D2BEDF6144E970B0C5C7CF40B05EDB70452 +7775F2D0A55E33BECD54B9F91807B097575929FA313EEA4B8EBA80F9499BE28AF2A3BF03 +CDFA19AFB30DAC150756F90B432083DF21C79616A054384D91F913520EC45133A30C84B1 +C1EFA0D1AA9B4FB33908CD93F76F6A8CD03F8714EB0E688DD3A5931BA940C68DA296B217 +BB6E1BA16FCC974E3E9F45A30B47EBC5CDCC6E2FC6AFDD826A1BB6851F68BB88C2879B21 +81BA06EB195D8775B8CA20B436B664BDEF465309FBFFAA48B0736069FD790DBA0047E4BE +7591F6B5849B2A1B891895EC40234269370FF1E66AF3D391300E07F7987D3B168C9F4770 +9AEA1367B53613F52EEAA64D8D296396EE3B6338B8479022B19A9992964200413F29C3C9 +9DDC50C2C61B92465E339B9A585CF0BD532B2F2F3B7BC3597AE2B89C686781AB7C1A2A44 +A6A897F1CEB49F63DB43D9DAC45F92880661E79D2C292CF910A3E75013D4D3EE05CC1A7F +7EFF6810E89660F47D06DF62507A067B1F37A100CA620992848EF811D2B0FFE0FB8A85AF +D58086E2BF8ABA3FF4435FCEFA66F460BB9919A7EF73B5FC511BB3D4C91BE3E90DDDF6B4 +4A2521451B568A167D4CAA98A2BC114B77B2184D15F98943660EC92BD6D0B5D79449FAE3 +089A4709F68872DCA3AC59ECC84A66EA19DB2FDFEDF7F8E57D90F6FB0E856931EE8EA3BE +8F3D692E4CBA21BFF24CC7DD3366D5F7E57A190F61502CBA9C274DEAED962E5EE3CE7B16 +2E34BA08806B7358D820009CB348B10F225EA9DCB92B0C0CCA4192C3437043132CA73E96 +6527062BA32227B2DA597C8E3E75436467F2D6895B5AAF1BCF55A02267E5FC21AAD0E8E7 +F2459C0B6EF0C372D72F697DD46475075C4172E50405703CD18C23A6D3E7ED6F526C3EDA +DC5AF40507AA9A76C86E8136CD695C955D7942553361E63FAAE9C23BF3A24F35F8F9B659 +90D7A6656AE186B1C596A8E3F69748427F0C09F5641F284B674F46CF3D0E2708419C1689 +F40A35DFACD95F8C6A1EE07E7AC8E9FAB58FEE8D52E81D486F5950685CD4EB36EBC16FA7 +C0F420D6ADE912042CD2AA3C60B2468A59DE0A5CDAD889180BF05405064ADE97876CE977 +D6F665803C8BE866AB0F1B08452A478408095AA3B8EB0FE8490AA682DD00CD3AD3592FBB +54CC977B46E3CE307E7D8EFBA586000BB17EB0F2EFD0B0EE61CE18ECD565DEE97E37CCFA +323BABB4D6354DA19CD9080C96D13A5E6AA1888B17970D7DA8D1B461822CD70CCCAB9F30 +D48F924C91DE9F3243FEABDE5C3C620CD32A5AEECD6BD20EF890F1457285ECFDBBD22BA3 +FAF661BA18BBC1E6EF81DAA2E2A7CBD7A058ADFF961B5A103D967C610530EB58E2D78DAA +17BEC7C9176EFE8EE633FC227BDA64E54A6533B6D56B787F5098C47824ACEECD50CF4C3F +172C3C7DAF7B6EC9FA8775C52609D08B073B784951D66C8AC33222604C634E99E99D28C8 +B45846715733EB3446CDDF659D1BE4B439CF32FC2841AD3DEC81A95B20B04790A669EE4A +A9B40DCB3BB6F0A68E5A2763A8CE7B72586CB6006FCB68C3EED89E54698EE5928F10F5D5 +616EDBF01C349C20E99261495735C1CAFF99E2B1FC986A36552A37D7B57C1D4EF460ED45 +FEF6967FAEDE8AE1B2C7AD835D31AC8160B760E7A36333B83843EE3F55BA19E2F6CD7D33 +9FF0657577CA58BAFA3AC0B7302E88871974DC65218E856338C81F00E4FB35F8DCCE6208 +D7F1BD45C3792D21C308A3CB7B50AFAD17EDFA027545355991E99C1EE99D85BBE5BBBCED +4E9C6334ACE88F82894B4B1F81F51DC6BBFB2621CF7ED7FAB3170A5DBF6F5E82BA316172 +60223D7049D20ECFED36DD022307D5ECEC358D4A8E7DE800F7D7C048FB265C96108B6D56 +EFBA19A79D37CA7DF37EA1F778B74CD5BE98A2B13BA7E69DE56365CAC9456A3C248D6828 +6BBAC51CFD6D73BED3BD7A7A7B9800B63D1A94882A52F322CC329F1BD691574732DCC32A +3425E83B88EEF053240D7C7C643A7FCB0DC7B452E1AF9131CB776D450EBEAC8F282B218F +D1540E4816E53C488F026A6934CD059DD5A09DB1DD8016815D066551BCFCD503CAE5FC7E +996E67351A6D681EB67D78F1174B3041096687912F43F6ABD7078C7792EC69A42ADB3F40 +95F326C049344123D0F93EF2D79DA7E77875AE9110F3E87FD87AD187B566DBB723E06877 +462C366B15BCBC0D244C2DA7D033E0BE800D3DEB29B295B6326AF0E5F151D50D6E1AFADA +88A3E0B990C1660004FE5B25F2BD607AC5A141ADCF984FD2EE49871B9BF5D5A1B3D96780 +B4E0AEEF7B4400AFBBDA0350A1586294FCFB5EC075978ECC7F6222AFBC50C6A0CA10DBD7 +8615D8128DE67FE07F2E3869900367476DA42C78AE359894BF443298166E7C935B310FF5 +E1BB2FA0677A947A7ECF0A89C3FBBD60D4D8104F220360D505EFA6AB9CE111C3137F6E51 +0616EA60ED8D1ADBB1B058BA22A6A76CCF8F0FBC04AAB81C6439F44D5659E937118995D9 +C299BC02E354FD4E62E10AE9D2D80CCC72780909F49E6732A61B131E7AAB8EC3D7EFC725 +A153D69D3204AD5F6A3AD6728C2B9E26D337E846A797A13CDB160D740D11FC38CCA2DB5D +E33074C7E5601C8573641E40BCEDD6B84CA7D15C1B86F42D4EC74C2CDAF65D5E22929717 +C6237AF09A0461AD9237F71C011BF36C00CC630E0C55D1B04D7D989EA011D282B77A4BC3 +C54B5440557303C245FAEC70FD1945A8556B8033269E6EA1C1DAAD39CF5A1BA9F6448684 +EC60E9809ED363B0134FD6F19F208FDB26A4A828EA42322550BD312044EAD339FD8DF100 +0E9F64428FF8C72C51FDAE3E7A69B6D0BFC9B2664D7864163ADF48D2F3EC3629063A39E0 +0B8B4DF52D2B855AC448BCFC2A3BED94D0CFC4A66FC6CB22D158C9B1FF632CE71DF9E1DB +CDDCB6AD62101DD1A776CA2A111B283E25D1CFD8B5F238E0FCB2008FC1DDA4EF6CC11C85 +96E38D6DC1CC624C11EFFF6DE5AD410B7773BA0C9C8B9E5F3B7C601222D810E921D55DF1 +575F452CEE78BAC9E306B0801234709349F8C7D603AA39CA94E878781D5355B6A534D5CA +06B774BA53AF73D36F60705629854BB39552ED6A4508A20633D2FDE04ADC59EFB86BCC91 +AABFC0BC1CC136BBD43D8934C54D3062D129F4AA3A37AAB7E870C6272D32D2E56D0F260A +75F6037AA30AE59A3A5C3417021026BA3DF9E6E55765F5B0933AECF62E28C342CE6C6687 +6FE4231A5AB35F194D7029849D8169BC54B94F34DCA13AFE4F5261102648C1FF98212831 +D76A892CB55AB502AAF52AD08635464A7C65AA6947F6CE69BE3C7984CD36057A31B2D8B1 +935122CC567A10025B6F4E305D40B600D3147961F914DFF15C07E6971A4B58E2D8F02F4D +54F50947094617BBDC1811AF2FFD72F5376BD65059737BE960D52C9B41F2FFFD1927F3CF +750FF71292AFE92B978F1A89EDB201F71D014FBC8D2758687039EEBF1ACFAB367C555381 +EA24C44F1E0EE7FAE39EBA4413FA3DE14F947FF5B3909323BD35193B6E2BEAB668B94A12 +40E61DC39EFB28634214B3A46CC0E00BD66D5B2D92B14A708098207C092B45351778E984 +E75DCC4AF44F9774821AE9FD16F44B733C611D708BA56895FD42150EC39E3A86E7253C70 +480114E55C14AB9F448CDE802540B710B1B22C0BF0CF557FE300A2BA25A0D841084A0178 +338EAE9D3DD9B19B062C76015CD0CE257D80DFDDF86C52FD7BDC4648EDF57FE1DD48C1C9 +AE6A3D17FC3CA05716E302BDF2F219B52E16CA97E63ACF67D27EBEC25BED0450B057D378 +9545B823DDCB91E9162D0B8BA526A918BA140A99E32287165394D51499E3CE10F75C9881 +BB3E3E6734B5380623496697FF66123076CAD8648A11D710988ABE094F9A11F4645E399B +91444EF95F0317E07B38A3D6FDA2241425A175F8495D25FA347425E419A78BFC62D17F92 +888986182D3DD448C236B84F46C7100EC23F321E73BF1839EF3500A0B147DA4B93CAB290 +CDEA0EC5567AD07078D426A98601D292966C172EEBCF61258B805CE42DEDCBF73995B8E1 +6580EE97FF610B938FCBC6D2DCC05D59E5D9F3BB90981F92C4545DEE34794CBD60FDCDFD +80449225D216246049948AF7B161D509D34F457F210116D1BDB10AFF53AEA6B51A49FB22 +FDF56471F610550D3133616E184B7D06539032DD560C4B5B54859C4232781326ADDF91C0 +98BFDC7B24A57BC4E69E97707CEA01F58D0E5B72919B202EB8852561D37FA219DE667986 +23D6CD0535C2CD0F642238D80452DF1482B1197076EA7CCDFC3C336B0FC883DE2FABB5DD +C80041A4104E575BFD65B4EED3BF9CDBDD4B83BCFC7295392850F8EB50C4D85DCF6AECB5 +C88F6EA597966AC63872251EDBF270A94512187EE6483D272D50B5E4B7F4556EB9B474E3 +85DC8A6152FEAB40CA34CCA515302C6FF2E66C42E731673962D2FE5320D577A67AF1B02C +A3697EA85E771565B97A476E388A5DA358B8A1D30DF2EF680288F20E3F5BAF340B44B7EB +5E531E569896FDD63DA9AE424B0CC244D99A0256488922A394F2E31FAAA47D95D90BCB0E +83429ED543041F2B8635F3033122F4E114096D497F6D993541A6CD7A6747232B88A3593A +71DDC13689EBB077B3552C366A4685B48DB7E9A0102F02A1C1A31662568DD1D4D3D95D9D +B2C491A04534833CA789145A6570F4B6E8FEEB77A9E9240FA9820695380C4A231D61A58E +F20C07FB1CE230170387CFA28C408D3251ACE1216FF77CA0D54A35591822489C0CF393B2 +4C26623EBC3A3A9C8DBCC5779A2EB09A8EE6F1EF3D97C107F9BF10252698367A16D05E84 +E0B41817D06814D26FF79AA87661C7C2D5487DE11BE2E4DDD7C926834DF8532652AC8DC4 +43FDD086A256005BFCD9C4D9F05D0EE9650FCA24327400BB5FD44F183227F62720787691 +75AF9CF033C19D7B4D2D52FEF89DC3BA145A1CF750AC8AA71EB65FA16FCB377F0492736F +33A408D699FA3A9472D422751E333B368FAB32C05E959591C3977F0A9B94E0EAC792E1DB +BC609E1315D59901672AE9A5ED9381FFB2864EDBF657D8EC8FE580409B0C8AF08892C00D +DA1D2D32CB52611060BFBDADCC73B272936A150A03EC52B4AB5A196C28394154DDBB879F +627E656510322DAF03F018E917A40C6C70371658095B7A9CA96575E976DE9D2E3719BE63 +33CE53FA1B970455CC734181CBDF92969555C42909B590908F43C81FBE180F043FF8EE57 +965D3B28C0FEBEEB075B2DE3444B117F6836E12234670651230446DFD71133C169B9D743 +1B26A1E5B251B4E7A170133FF9B403D3F345213A67C80EA3F48E12A2B564B97E5E570651 +070EA250C155D9F7F50D95BF852F1A337B152A2167BBA4F2E1FD348DEA9AC2B2DB341B06 +07422BAE29EFE1F7E1CC7EF9EB9C1CE879C0BC2B4D3E3BB126879C4BCC0F9219D89064CB +BB943487ADAD2E7A5E6A72FAC3C2002226C24462D7CAE7ABD0687F785028CC6E3C4F1026 +A994669C2320444BC35BC6CF8239FD0A4B4C663EEADF9FE60ED2E4ADD276680C5C84488E +2956D72DDD2A49BBC3367EB742CC9D69AE615CE4693636373743DE1FC06429C5D5F19E42 +A6285DF5394041362F5F43F219977A7B4101E8A3EF45502DD8E702D677423271333664ED +727310F0A2F12CB90332228BDA42FF040CA6359948EBBFEA768FE2E85F344E38A48A21DB +04C8C47CFC95B14DB8ADEA6A4994A366E8D46A4A1453880390130A157DA8B5D14B250893 +C3DDE306C62E466968F1EBFF0AB0224AC7F87B8746B816EC02F7FB710176EC2104662591 +4D2E5083ED6DDD42EB82AE75EFCA4B4017E00B80CF11CF347CF1D9A1F43C5A7E16A47CE1 +CF113A4ED121F109F763DE14B756E396C59E9412CB166FDED494706C7B9BB806387921A4 +C4A1FA6556D82F252E69C479D4314252A146F14A310B0D3861FAA13FBAEDABDE8B238342 +897C50E88A951A7C63670040DC49BEEC93CE42819BC79A5C974E968E523CDFF701B6A0C2 +C1E00D0A2C889BC270C0A94A58B8F44AE45AE3ACF02357A1A78AFE2E09755E0E48BE6221 +A06C91800234AE2E2687049E0372C8B0B2573BA6F044FB9827C1D6DD90234D91CC1BF4CC +FBF14E163DA400E2BE334A4D806B3A934CB6ED7674DE6267B3BA9BF4820C4D41FF661E7D +10E0EB3F7358BAD6C01B7E1EB1DEF5996678548E589A2FB993126E55BCD6BC1BB1F0D4C8 +1B1088A7688BF682E63D54F55CAF1C2EFA84B79974439C4F90B8D05DC7C300D450BFCA2C +240CE0D01156FF5EEA35C9542374BEEFFBFFB332E14526213ECF605DA61DDDE45AEED1B5 +C29217566ABCD452A266C8668369B6C4871FED4D830735A947A15BF41F0210235476E83B +EE843F80375DC95FD0D3D0480202033BCD2D83DEA1B0DBECB3D55EA6AFB96F5B6FC48B6A +7C1308346583BADC3B7AA668DD819F81E82747226FB67162B8F921790663FD7C0F7DBE63 +BFA878DA1434AE325EC02D786FECEC94696863A3235D048E80BD57857B7F0E6B84C2067D +F04AD7AF6AF06195B4FCD01D3257480979D79740D4A5EF82D2D5F6359890B1BDA818B8B7 +43620F6844689B7005B608ACC102444067FC7752EE4FCCCF24321872ED9437AF8D263AB4 +123213968A9801D2F9E902D540FBB430BFDE25C15A8185B42BBE510DF4E9F456286F28AD +DBEA5596EBDD910C7E375DD40500995C867C2E5BF9AAF54E57E730C3C1F199E78ADEA406 +8AF853A645C0DEDEC05C825DF25511FD40B0B6761547BB986AF1E878F905723580D7490D +026D2D7A49A2E553010593189A0980DFDB18122405110422806CE79E7088487F7FC5C80D +33217362356D42CCFFC9F51FC103A68A60E4CBFEEF0852C998FDF4A3CEED447A2D77A9D1 +16F88B6ED092FA4D25C59E731A03ECE98247E96B055EB4176B8BA5F795E6EE92F8DB0446 +540207D9FD913E00D20683128E3B99F3EFA0ABBB945606B30E0CAB0EB6B91D30EC381184 +E5046DD2DAD0A4B5D3C6ECCCFF402C1BF5B42E7AC1EB818BC76B92BDE97DB485A9E4660C +DC3F409129B5BD00E573E2B4DFE2E0113E288974DBF9AC6BEFE9CA8DD0F73C8443C906CC +4D21BC9ADFF2E9ACEFEF101A1087EC168EB9EDD54D55CF072F4DAADA363C28D9E2FE52EB +2A58F4BE72A494F370575246965A4C4670A7F4B47F118FE5BC17ADF7DDAA469EFD6A13D9 +8A148B02700D4D374EFA01E2C6502E6BE36F2FC25CFF1D6A4695110595BD358705674162 +54D33C3DDCBC891265EC7F0FC06BD7BDF70D7000328062F889C4BE68F4FAF0D2C2F5D8B5 +C61C40A3134433C222071270F466D9EEFAC22119C67A9EB2F626DF8CF62F028ED74CF733 +1181D642532801BFB127A1946362F2F8BC33B8651A565ABA0226943CA88FAA9F0D8CAD31 +7B7D2B0B0A5D10907355FEBAA4BFC717BBC99A604178B897CC8CD98A14531E9742FDF11F +8D17D2ED67DE68CF3E2DBC0FF6A23C876F3101DF942314DF0D06160643C4096C65B90E15 +4E2D0CC44AE46932068856CE3EBD03D8A74EE5BBFF74CCC54F0E1D3EB0756C29923686DA +2410B414A5CD43855C82BDAB7AE111E284FA77BACBCD412A438F59FA4006C11F4B45C502 +24F939A12289F846A43E1A5EF39DED94922AF63537D12EAE8E4641D5434BFD058FBF163E +586556CB1E13D15A5487091D9BD004C556CD533A25E40F97AEFB4AFA5A2079C87701E65C +96405AF89D0D7BB41FEC6C4AE2834F99B1426B47EEA08FF81B13AD5738DCF2013E45FF93 +38652EA8A36B8690ACF0997A1CC2501219AFBFCEEB79ADF018B5A55C8734924D5F6EA575 +F0DE17E3BB3AB11F8930DA1A8F3CACD9A0452145BA4F00BCBF072826F1B6F1B9FFEA2736 +7319B85F39FFA7EBA15305A338452211E2D011E566B2B5A822E478BE2852853A1A8D1270 +C9E5E6B80959DC2C1FA70F62765CB50154AE0FAABAF9BC997BFC4C54F63D4D2B948FAA26 +0ABAC11CF0677CA044B1783FB87D31B1960CB0B21024AD08580B0CD6BC4BE22BF8A144D9 +88063037F1D2F17552A15D47D21CFE1B88298BC7F715555783299A9FDD4D131F1645D195 +E6AC8EC0BBD1827548A0F971080AF1DC214CC3720969B735EB0858DEB89821FCBD047BEA +1F1F8B5F27C98785342D56C145D03A0469D92E932ADBF560D35D555893B0D2F795918DDB +D65386906E232A3545C916A9AA57403E5244686BD99006CBDA3E93BF9A22A2F172B58147 +4480A90190018CE07634573D67C93211A9577AAC8799CFE6FED8F9274D45ADA841A66CE1 +EB00BB0330615CF756DDF0D6B9DA2B59480E63F0A40DC2E635EBAE9C5ED7283188B89551 +96C155259DB91835ED78A3D3BF07EAF6CB3B3CF6F4C0633C764D8B76592FDE07B62D7DF6 +F5D16F26EAC7DD91E4296442225A5A02A2990B222BB8A1239B38F83A807F828683935682 +51A567B9F68558885FD32E58C4B22D467DC494F20A3428F68A18F0037E8CF4837FDD62D6 +EA3CB73E8ECDA81132256DD09F7CDE0CDCDBA85DF239F2671E0295031A3184F7A31F5F05 +A29A40534BB0E02C99089977172A469A12D331448D690EFA0E05099A960ECC3D9DCC4BE3 +1447F5D77CF9F59078307213D6666E6D9567AD8A341A10C93A6EE3C726FA3A730835E134 +C83E47BBFFB68A5B8ACA88414800FA1971F0B7162DF5EA90BCBDEC7B2C2916F4EB39FED7 +98DCE6D49E8D36A188A18596C02FA8F8B5B1C9C67BB8BB1369EC2FE51BD0E554F52517BD +5736CB8B581C4B083F891903EEC740B3F52F404BE51F26FBB90739620719C528DC56AA6F +185DE3A0145225AAF56C7B8B510F0B6C5BCE56F69DFC3AB39C5A9A6110C54B0C014BFED6 +06808B965E8B4CE61BC3CBE66BCB6AB0C53457E2EF94EAA1B05A3B9C459542579FC7FD69 +043E9A4A79E6688CF835BD981FF5935E7111EC2B4FFDFE1E05825BC54C55A06D737E1BF0 +5F332D6B958078B4F3BB7FB1952960F35C28AC9DE3B8A5443650A22DBD69F43F1008543F +AD0ADAFE7A2D4CC1158F6DFE38D5ED78CEA0E8B742D86AF575C3DD05E07339D95A52E7D0 +8F28B53F42E0EF55E488782D6DAC953C2B46C759D7AB0FD9D521B996B4F492C762250AEA +0371EDF1A6C892CC2AAE5E8CF85C9532294A7598152455F1229296BA051DD83CDC08920A +E0CDCD29814EFBFCD435FB171DC21C75B6765E2FEE6EBC57941C984E05C107F0B696839C +E94FF8D337BF520AB53FCA1CA456E5404EC1F05F71725E8545FE4DF3E612FC6C14403108 +2EDD3E5150943EF21E845230ED91BB60C95CA91F1389F299667673221A8680DE65D12BDB +1AFB6C7BE73520179FEAB41FF62A57B14FDE16CDE460F4FEFA016A555445C78CE88DD0EE +A01D49F22F4516E316BB4EB03E5C012291EA5A5314ADD2D16645075E84E50A11F7ADE384 +592EA0A2AFD06BF19D2AC55F9C7EF98FFE32747DBB496FE6A61F01BBF83E0AB9CAACBBA3 +3598EC42C422EE412EF1B1F1704E7E59F28C354F9F6F5B64E780EEE47370607120870DE6 +2623F01C4F8A46059E4DCDF4CCF5775F157DD756D45AE5AA6BD5EB415B04559796AB1270 +3CBAC585D4DE40AA03CF8DA7BA33D863EFAA0F7B990316A7351D9A533E2AB6576024DE45 +176D6823F31DC55A0CC29B5BDCFEC6C75F5D11D67BDFF15D083CA9CB9DF28DF02AE258EC +5611ED8D721FE60910CA5484A9F5DF3449F85D7F9900C61F4FB43617446E5E74E1849977 +0A0B686EBE371582B0F8B9D811F40D7B01296DD6D3DADFEB2FCE5DA4D93F97B38251626E +D3C9350AA320EB926688474DBBA786DF88FE9BB502AC65937890DF9BF4E1F20197F3CD40 +9B2F7766078FABDA9C535FE03BE36DF70FF23BA71CB322A9A18A88CE6ED79AB299A0B707 +6E180B8F282CEDE8551094B7D2AD13360CDD68E0F4B8488324C0ACE44BB04EF246B02BED +49DFA83A9C5219E88FF327CC0599177FCB71819B2EF4758D1D95911FEA16A6C50ED66FC4 +6B478A4DA493651F59A1F637C656AA6F8B11102EE41C33730E4BF7F400E6947A4F1E153E +2460624E874EB6BA5FDE3C2026964483783E1767F6E8AA12F646F3C47410F0040DD1207C +56F29EE16D2DD32C0FD73894A44E87E656D3582E3D615C6053E1B7B70E64279D617A958C +265B6BD1DE5F706ADF911D83972D46F929331C5BDAB2DCC47D10BA4D62D5B246F99A19F1 +E884117F99304249E8A87C6E6FA5083DC0F9E97626DA3E16AE4ED909D1B7E3A911B99E7D +9808528039AB0641948F10D793A2AEBC4686BD895773F143559DCFDCD6C09D4C1630E454 +0F112093F70B4C76C5D97D28E6FC8DFE2B2322E000404218CE03458E9196B95E63CD625E +61C03D7A4271A6A4AD5CB055F113D7F10C69E4F282B9D6EC5A60A901ED1EE9BAB97FD40D +33184163AA17A3F8EE9CADB38F047772FC8D39E3BFC7C9F5D0A3A277F7BB73C27516363C +BB23E8B0224234F7FC63206B19687CE91EE596D7F8921A5C7FB1CB746511BC9AEF5B6B74 +45CE95D7B58443C4FB4DCAB1F6819B94336058A708F936D38860AED70500373A4CC6A1CE +10F2BEF120E18CB10EF236457BD1529A5C6C2DBCBFB85F70F7DBDFCF25B9485E92C02108 +88CD2DD84215188B778BF35BF1381779ECC36974BCCBBC37D7999EDB9EC98C92D7C8BB3F +798BBEBDD852E320E3540C46C0371AF1CCC1F59D9C78A92F710C28A2B9707C8567A9AAE1 +1642EB8BFF1E9CE99B30A784DEAF11210C44EA275F137EBE69C197039E9D35A8E76C799A +E73B0D65EE4D1FD59E0E8B32030B6B4CE02E698F7090205E7B466C985ADEADB18CBCE64E +5074D90C4764823413CDA39DC16CE421D60F485FACA831FDC4EF6204894EB5B108734F3B +48E6AF64C0BF82E71AEC055DBD588D62AB4585555FCCF3982204397FB4BB4602B313EDB0 +B746734B8E6AF4FB59CA0457D45F6CA15966C3ADB050F7B83D75D43B2D54E8CF9604494B +7C712E0263E7154B31C205F51F1EFAE4FFBFCD5F522FD9E85AD6C6DEC091D7CD445F56F4 +A6D087280B252E7901A34EB4BA00206E4EDFD63FBDA45A17DFB1873BF8B6E82B4FCF7AB3 +CC1099EDE08FAE748854C9E468C9C8B8FFF239E366B4E8FC76048B0638F7FBB9DB80E711 +91F51D4CA50ABB65E361BE32D12605B10C8ACDCF2101D66928C9D95099C296B33651B44A +BF0EC9C0B7A6B686AC630264897CD3274A1E87AA8FD7182A124ACCE7CAFE4887E06A7B34 +FC7DF7973AEE69B8381047E2D254375C46BEBA1730FCC6FE4D6564DA9EA963D0B7D45475 +FBBB54BB12F389AE979D1F36E4FAE0EC7A1B2B7B86ECA42C85268E0953A461C8EE02C407 +FC387141C52866DB49D8BFCC065FD264E5F57423E3DBDF1270D2BB7DA6A860D22722E052 +3489A3A0B5F0E7E46DCBABBD89D3E4112A031B37576D35B95452B25B5CD04E18EF24FB0B +98A00B549599F3E924EBFC4FAEFCE504A1877F69375FFE7E9E7D2EE82CB2C80A87630A98 +88F13C26E568F5AF98F6D30A7C3E20695AFA9B2809FD646A8334AAC86B1020FE968085A5 +70ABD597C472F693F3EDCD5E88767D23293C1F64BA94029DA5921C251FBECA22F1BA47DA +142810A60CC9090E7996F3B09423D4D850C83F47B497E4C17718020B0DB9915933FD016A +D32B50CD62E6E20BC09646093ED3BA9F9D0AB09F5B6B01F69CC8F706B3CC3828B7794A67 +3F2C3CAD3A2EF13171C65111A9D34F0FBEA00FCD22C509FDD913C7DC144618BD743B3639 +1E4694442AA86AECC639CB1A857DEBB2D5DBBAC329C4E1AE4F095EBD6259D0EDC896A818 +829311503650962679D627D060C51C4A78E80BF764C7DF2121896E0B02E74B9E65CA2CD5 +5A6ABA7884C961B474FD4AB32172A6E070B29FBFBB424417D6D1F89F6A8BFCC880C82C9B +7C4F23739259076A57B3BEA79878839E3C0DA5FBC47A52B81724DBD303C58B027F1F1D43 +2DFE420EA7C773BC0884909AD03F7793F40878A46813EA207D855FD8D397DAE056F89394 +602DCB1174532DEDAA96C5907FB020BDB735AFEF6896EB193CB16A56A3274398A20A503D +B1B66729D094A21DD45E12511715FC962E0F3238630954BA513374FBCE28737B80CEF5B9 +802097BA8D3BF8BF5315838C014B08D9BBF849EB92459D04D0B735E487858E333E140CDF +71A6B463EBEFF3A86A5E1AB29902A14DB4C72DD9FDECB05F2EECDCC4314A600D6724FE39 +7478CFCC6478622A8441B88BBFF9AACE6FE02E7B96B09BAC4B90A65F04AA6126304339D7 +E450C24922FF6F3027FB0F6AE9C19BF3C633708255E1E9F06B8245485273A72DB47FF9F5 +E5AB05B1D8518691885AFB8DD3350D9305C4DB91FB120F666DEAC0AE0C64EB19106F386E +E8A848CBCC9091EC8FA9004353981D5C214D920A07B439E78EF98628E1C0CF014D54F271 +349676D7BB0E41418A67DB24F36B3D8953A73D18E95DA0645666B485DA0061B2D49480BD +C081AE8CE6C696BB8A7224E933FAECAEA2C09551F961556F7D1314A869D1E698DC887BFD +F0E57FE8459FB5B1EABC88F50FB6B3BE5B6DEED96854201D97A6A199F4C5E0929762832B +E47A897217131F32718E2FE87A2A5CAF8594242C504CF3C86C73B68C09B05DC02F428941 +F441110CEC6283 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if diff --git a/fonts/Monospace-BoldOblique b/fonts/Monospace-BoldOblique new file mode 100644 index 0000000..880b52f --- /dev/null +++ b/fonts/Monospace-BoldOblique @@ -0,0 +1,2445 @@ +%!PS-AdobeFont-1.0: Monospace-BoldOblique 1.15 +%%DocumentSuppliedResources: font Monospace-BoldOblique +%%Title: Monospace-BoldOblique +%Version: 1.15 +%%CreationDate: Thu Oct 27 10:50:21 2005 +%%Creator: mike +%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%Copyright: DejaVu changes are in public domain + +% Generated by FontForge 20051018 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/Monospace-BoldOblique known{/Monospace-BoldOblique findfont dup/UniqueID known{dup +/UniqueID get 4092906 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def +/FontName /Monospace-BoldOblique def +/FontBBox {-173 -1034 1654 2157 }readonly def +/UniqueID 4092906 def +/PaintType 0 def +/FontInfo 11 dict dup begin + /version (1.15) readonly def + /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def +% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +% DejaVu changes are in public domain + /FullName (Monospace Bold Oblique) readonly def + /FamilyName (Monospace) readonly def + /Weight (Bold) readonly def + /FSType 0 def + /ItalicAngle -11 def + /isFixedPitch true def + /UnderlinePosition -221 def + /UnderlineThickness 246 def + /ascent 1556 def +end readonly def +/Encoding 256 array + 0 1 255 { 1 index exch /.notdef put} for +dup 32/space put +dup 33/exclam put +dup 34/quotedbl put +dup 35/numbersign put +dup 36/dollar put +dup 37/percent put +dup 38/ampersand put +dup 39/quotesingle put +dup 40/parenleft put +dup 41/parenright put +dup 42/asterisk put +dup 43/plus put +dup 44/comma put +dup 45/hyphen put +dup 46/period put +dup 47/slash put +dup 48/zero put +dup 49/one put +dup 50/two put +dup 51/three put +dup 52/four put +dup 53/five put +dup 54/six put +dup 55/seven put +dup 56/eight put +dup 57/nine put +dup 58/colon put +dup 59/semicolon put +dup 60/less put +dup 61/equal put +dup 62/greater put +dup 63/question put +dup 64/at put +dup 65/A put +dup 66/B put +dup 67/C put +dup 68/D put +dup 69/E put +dup 70/F put +dup 71/G put +dup 72/H put +dup 73/I put +dup 74/J put +dup 75/K put +dup 76/L put +dup 77/M put +dup 78/N put +dup 79/O put +dup 80/P put +dup 81/Q put +dup 82/R put +dup 83/S put +dup 84/T put +dup 85/U put +dup 86/V put +dup 87/W put +dup 88/X put +dup 89/Y put +dup 90/Z put +dup 91/bracketleft put +dup 92/backslash put +dup 93/bracketright put +dup 94/asciicircum put +dup 95/underscore put +dup 96/grave put +dup 97/a put +dup 98/b put +dup 99/c put +dup 100/d put +dup 101/e put +dup 102/f put +dup 103/g put +dup 104/h put +dup 105/i put +dup 106/j put +dup 107/k put +dup 108/l put +dup 109/m put +dup 110/n put +dup 111/o put +dup 112/p put +dup 113/q put +dup 114/r put +dup 115/s put +dup 116/t put +dup 117/u put +dup 118/v put +dup 119/w put +dup 120/x put +dup 121/y put +dup 122/z put +dup 123/braceleft put +dup 124/bar put +dup 125/braceright put +dup 126/asciitilde put +dup 160/nonbreakingspace put +dup 161/exclamdown put +dup 162/cent put +dup 163/sterling put +dup 164/currency put +dup 165/yen put +dup 166/brokenbar put +dup 167/section put +dup 168/dieresis put +dup 169/copyright put +dup 170/ordfeminine put +dup 171/guillemotleft put +dup 172/logicalnot put +dup 173/sfthyphen put +dup 174/registered put +dup 175/macron put +dup 176/degree put +dup 177/plusminus put +dup 178/twosuperior put +dup 179/threesuperior put +dup 180/acute put +dup 181/mu put +dup 182/paragraph put +dup 183/periodcentered put +dup 184/cedilla put +dup 185/onesuperior put +dup 186/ordmasculine put +dup 187/guillemotright put +dup 188/onequarter put +dup 189/onehalf put +dup 190/threequarters put +dup 191/questiondown put +dup 192/Agrave put +dup 193/Aacute put +dup 194/Acircumflex put +dup 195/Atilde put +dup 196/Adieresis put +dup 197/Aring put +dup 198/AE put +dup 199/Ccedilla put +dup 200/Egrave put +dup 201/Eacute put +dup 202/Ecircumflex put +dup 203/Edieresis put +dup 204/Igrave put +dup 205/Iacute put +dup 206/Icircumflex put +dup 207/Idieresis put +dup 208/Eth put +dup 209/Ntilde put +dup 210/Ograve put +dup 211/Oacute put +dup 212/Ocircumflex put +dup 213/Otilde put +dup 214/Odieresis put +dup 215/multiply put +dup 216/Oslash put +dup 217/Ugrave put +dup 218/Uacute put +dup 219/Ucircumflex put +dup 220/Udieresis put +dup 221/Yacute put +dup 222/Thorn put +dup 223/germandbls put +dup 224/agrave put +dup 225/aacute put +dup 226/acircumflex put +dup 227/atilde put +dup 228/adieresis put +dup 229/aring put +dup 230/ae put +dup 231/ccedilla put +dup 232/egrave put +dup 233/eacute put +dup 234/ecircumflex put +dup 235/edieresis put +dup 236/igrave put +dup 237/iacute put +dup 238/icircumflex put +dup 239/idieresis put +dup 240/eth put +dup 241/ntilde put +dup 242/ograve put +dup 243/oacute put +dup 244/ocircumflex put +dup 245/otilde put +dup 246/odieresis put +dup 247/divide put +dup 248/oslash put +dup 249/ugrave put +dup 250/uacute put +dup 251/ucircumflex put +dup 252/udieresis put +dup 253/yacute put +dup 254/thorn put +dup 255/ydieresis put +readonly def +currentdict end +currentfile eexec +1CED864D422F76FD8FAEF6132F502482A3D8B4A45438351BEF76DE83DDF4E51528714B6A +2E0891A07E6A4C4AF06631204074926585455A5677B5DB36647E8D4B74F135293000FE37 +CEAC7E5D7112AD08238B10F0A7E8C6B22250EC0C3AE0CEC1B5D58D6CE79A5C9E8AA78533 +80CBA7928F215BFBAB9974AFFD4EAE72E2F13FA51DBB826B3345FF4EFECC42059C923D3D +744770EB5214390157686984CE97B7A323A282FB3942AC23170668648757127D1F629DE9 +F47CC4D8B96EB65B46A5F601947908C6623ED3C619000369C9E67729C539451F62FC5580 +9EE2C0DEDB3928CC0FDD6D955E88BDD03D1ACF344F28493FCB53D4FC1B863FA25220FE1A +1481C7750500555A9BD2D8D14147C9F8D44BF71EF40F09B0A188725D6B400C688671D7B5 +547DF767FF1075536B17074CB44E973ABC27A9494A2D5880537C8D53A2C7262E53EB25FF +C4C00E380FF2F8B0A0D33A03BD016174D197257B13A27D23E9EFE76CC0F6D8975A0015DA +DA093AA1B08F2BD290040DBD6674FF79F4718DA59796045B4D8091C39F6B407D5F2715C4 +E5CCF1F7A8909DC995C81CB305B02836E96488ABED0835D20FBD3507AEA8C9B51EB85BC7 +148CB611417A4A894FEB958C0CFC59F6359567D6A13A0D01A7AC80E9918450DE949D19BE +31C7FFE9CCB6A9980AC3CFE03409367CCF926A75F8CAF8C2BCE07AE51FA505E0EAEDB20C +4B530DFF7DABB79822CCAB90A5366E32840749B94EF996104D44B3E13E3EDA856C4CFD10 +3CE65A33CE8A22AFF27E081A93AEC929F7766C0F1F8C8A5414D3BB4C46F8E791D02C1710 +95FFE94019D62F166E3EDBD88B350E8211CFC504E546F14016DA01DFF478C25015A6530B +8D38CA3F7AF4DB3B8959EACC030207E8239C17E351E737F58960875256AE6BF5094C042B +F753341EDA79F533F602F673B803394FA140B5F9E0768413A9EA96961CA0002036751C33 +FEFB66DC4FF30585349AF7C9924B9C94E20DD44381028847816BE17FA4D554B30A78AF24 +11318819B1553C659F9866EAE2C775A9E06BB5E90AF8B32B1A7BB290EFFA41F5B5033C85 +401D3B85F125D61EE0B245E0FF52B1F46CA409A86A88A8E40CF38BB9940168BF936734B1 +F45EF8AFE5BDA9F613972D9F61EF5FE3F8D4D19690C2AFC60C3FC4681906BD2570945EC1 +8B6161A8A960546C23964E2B005EB85B4146C5EA93313E99557B8820C6690E945AE88661 +AAB10C0D47BD67CC00C03BA82A04407CD9B692351FBA25E75E4486A21D9A0542762D5A64 +F8B1B879A11EBFBCE426F221372C7DA133D7CC2B2C0F9E6F269B3DDD14A4167F184F76BB +F0A6AE68F88340051B93CCAC09BBCE3A674F684ADC4F2F5D121A3CDA013FD031637EADC3 +36D6EFF295A86B54867FCFE1F05BF5A73C737040BD3B1A0E924193B83B6BB378B2453D9A +A3D53B864E1EFA1822D4D2EAE2B310A42389ABF90F4D439E0DC7CF34E8B90439EE25C677 +00F9DD5CBFC6DD5681E3C79F26089F6D569E0F07CDBA2881D812766439FFC0894C0E191E +054AFA67FC1B1AAC7ACDC5B6D710F1D0D7D6EA32937FBD67CA71A1D5C5EF59A3C0D833C4 +5F78B126A88A81E73971B7E12AF16C4B23086F282FB309755696851DB9685FA9564AD878 +BB22CCFFF759CA65A594FFC2FAD61F774BB8450A09B08631B1E808E267E855F003A5B951 +D8B4BB325401E199F57345709782E2959757EAB5BE7AD6B5BFF17014E3A1A8382819CE75 +EAC4C68377FC032EC0D74603F25A2B1386F7FEEE876467D0DDEE2B2B9D03E25F32137D1B +4A8F90BBA322636C8571B6E215111579F95C346171C8BFE6777B081660877518D1B44917 +ECAEE307B68D51DF094AAD59DDA212747661AB31A9F31392C4EEDE462668675988A83172 +AD88BAFEEBBE500AFB2A4D9CDC985494CDB271AA0741C0709A2A4991B5EEC213F3BCF107 +E6EC214DEE85916ADD3440AA2A7D24F0645E254639EFD1AA093BAE93015A7FCCADE66817 +F4AFF9E5A10DC390AC33D707D8A8401F93D0318626FB23F8E6226B5C5230FAA6323C32AD +9F73A91ACC682BEF7AB3A99347316812A926E30DA8AD7CA702E52C73CC37D8A2F8D3D679 +D2F4F17419B85D061833B63DDCA501DB6E5FE81B5F8E601C59057D912CF9163D1DDB4237 +6D4CFAEDCF4E4F66600F71D7C31061A9846A0F153536DAD78AFC80AC89DFBB1CECE4D89A +DCC95F5E7E03A41A6BBDEAFB3372ACF32ED1D5DA6CF8A768812D69620806585686FF6658 +81AD1D1AB17E7282E6150A3EB40B400ECD78E202FA63A5508EC4D6FD78EC3998991D3829 +B4CAF3B7714AADF0AA04D5239F5BB40A7678938E493E6E58BA9AADAC797A8A7AFAF594E5 +82CE777C987C6E9B4EE421FD1E44B7C3DB349621789B8142C2773C049CD999E3BD26B634 +BC86CDCC6F930EAC04C71A25E8A2D1DE3539C8981723ABBFAF835B9615FA36A3D89E1502 +F46C09FE21AD93811C447461729A4283E1C865419A5437973C07F830FB3645906DE1EF79 +5A4D0DA6079B77C3D0CC1D1581EB24BD9644CBE0FF57D58295D3C1529F95B61F21B4480C +9B1FDD14B20A776EE20F18FDB5A595778724CD68D237057519E58622DB09E9F86D8FDC28 +1F5FC5BDA84BBB46836244A7510737F6FC411F39FC9A6EB3FCB5D9541C7B3410F60AA52E +FF65CD9C4D20B21CC0E16A7DF3800DABF3475105AFAF14D2CBFE8C4A0CB98910441699B4 +B7419F0F91E4E7E68F6AE3640B4E82A52856FEC5D51863D14CC9A7E54DFC3F18EA6FE05B +DDA764A8FFB62408BA412567BCD78692A562E309C2DBCD900AC231610AB97A7701B98440 +5EAB031BD3922A9B29AA0A38BA410AC99CCA246E324FA59BF265924EB41343043C2D8CCB +FFE1F6EE81437B8C256179A5A69D7C0BAE4F13C59D7356B0FC9878D14CC9F1882E68EFB5 +0B324F590A76A19F01520AFE617A6ED645A9BBB0D4AEF69A01099C2F7F93382700E3C7C1 +2862E5289B66EAAB1DBE13802C29D11452A82968592995686EB09AC67B64CAC41E9177B1 +1A21741097ED55CB5F383DCE927C5EE5FCC13B261589586DCB03ACF7E74C67606A71E235 +A335469B97FDB6DA8613437685ECE63BED792266DB50ECAFBF082DEFE04803CCCAC08B1F +47D3EEE82D635A9F97975EFD80A316371ADF86031250077B1CC0F403845FAA306ECCAC14 +A194E85663252D9FAEA449B2A2AC2C76EF828F9EEA8556CA4057EE0BEF356C1DCC76308F +05CD254A737EAFDF2912E74C38C3617EDAE3969A03B01AB3254C909B93979E6226E20D48 +69B44FE0F9D8002A02ED206544DD099567DDA0489BD957DC14818C7CC1264D405BCC9E9D +A31BA99C5A695E106794694B7FF847497FC8A7E961C57CE3959D71253007B8C2A6733FCC +B6E43863F782DC8D37C60A226D46AFB6176C9507C7837C1DD2E23559FA1377794CC32079 +90FD6E0EAB77096F8C4896081B5203495207EE8CFCE63AF48840778C1DE08A449953DF83 +D5EC0B82593EF1D059D2C5B9350F21AE58BAB03F57A4CCDD4D4CD8CAF475E0315CA8612A +C3E66CC597DFD5F4F53BC6788B84C1E2E8A8AD02FEE9D9D5F7471508D7E3F447F55EB1D9 +D54EE8207131F8FB5B2A394C0C08F35E8F93AC9E0D0F93A77C28F9FDE8990CAB8E3908FF +EB8DC0EFCC98F88315E0DA33B6C6B4B50B17661DE788C1A874BCD2407C3047DC79DD6650 +B6908207965CB5BF7E7B83A7030D30D3799F406C9875E3CFA9A42401CA2C7115B1446472 +4D38382EAD16C042B8F2B352F6A9FC7FBC2E488BE6A2D97FBC1E643FE4CDA2097253798A +D26DDBD706E4CBC5661BD87E5E488960F643A960E9DE3891163276B377FF96D9D2E93B81 +17DEC91E5D3BA80B14A699C56E8F48DA2EE0A8DFC2C981B106C70E0766CC379D97653EE5 +465EED2B6FEE0C1CD2F4776D30E08EEAFCC427D6420F516F9F0CB3C060659C4CADAAAD94 +40B3FF65406F49F4174C2B0C606A3B03A8BE0F7767139539BDC38B93965ED44BE4E2A53A +149EE0D512D37958A9BC369452B6A121DFA0BAAEC6E9F6E00533AD6EF857E662C7FF4AF4 +5B7732E3C5A037E3A752682EBA6976330FF3FC1CC6271EB7B2024D2B00386A8A5737F052 +F98A223E309E457645E4D1C91B59E827C451D0CF32DC3B3D725BF5E325F9D2CC1994C319 +2B4C1D05BDCB87122F41D6F72A762FA45509074D76A32974ED953C5257F9EA335152E96C +1EAD2DFC8B7A85B5DDA1975EA400EF5DEA8F43C82EF663D3E5E122D4EB1C67E7E16CEA46 +F12D63DFECB85A84C7B77637FD330F89503DB4B342124ADE972AA14D81F492A5695225D4 +39A6EDB80209D1A49A7B393D00C1B5429DEE9D81EE2E7570A5E244E6457612C61E3869BD +772FB5CCCE59811D7CF516105765ACE6B68061B1B411FE664C84A767F66238231C96159A +21C3CBFEDF73F3B56A25264CD5FCFE91C36977A683B369716D6525FDC97E5D2828F26961 +292D8D5F7279E6C0C87F89827B1ED97187E3EB9E3ED021F23DF98790F5095C6063E144B5 +34FB190D15B1DED675CF8CF5C8FDA3434844ED1BB8E1D93F43D5829E6603AB001D423EA8 +279972CCF3AFB4BF776483A41C607AF581B1031E6DA4D716B7876D7785FA7DA4C74DE445 +33EE4B832B5B27154617AE7C5E32F4CDBEFA77290FE45D80011C0E7BF5BDE91A63708F0A +FAC6D6AFF5FE1EEB23C187EF486BE3E8EB042616A4763634BE5B4CF31417D6B7A807A3F3 +C3A6F6C285A7C7BD46AB63CA1F9BBE01A4E8E98E4CB44D2F26CCB99A85402F0A474E531D +9675475FA6F06A7347FD8FA30BFA67ADACCECA881CF703E2E15D8585A9EFE607E311922B +D9F0F8B7715021C9A90986D4C0E681F024CD13CD38A34DC8415FB96E6DEBA849D1CFD157 +181439E3C004ACF2D5E7C40F2366A89977662CC8D0C0CE03E77F77696871B7BCF85DEF44 +9F1DFD9A9B4F68B870A1ACEAB20CD407A27C5B75533A08CDDF6D0C97650EC5FD4AC0208E +07C59FA798DFD38FB86AF3E71503F76634DFB15F6323927C87AFDFA9178D71391DC51E76 +75BC787B749BB53926B0BA5FDCFFB241AE27B036C586CCCCFA0896D78A63578A986E329B +DA9F0E5EB0C5C1DEF06FD3667910600941AA707EF6EA9ACCF721C8DCF7760BFA32E3D5CB +86E79CF66DE28D80CFF83950238BA7EAF551FC3A8E4EE0302C840E7FA11D2F1BBBEA8EEE +94C313EB4B47975CFDB214B3134711BCD1F2E3ABDF11E591E9EABFF57C226CA83B3DBAE9 +DD3FC6F2C3C4777E9B5479A7E904D0E1F7D36CDFF6B32323E4218F8CFD5EF467865B2636 +81FFD990E58EA69595D4D86F2122C52BBFB43650FA8145B1B6AF095541123E31E99B3981 +A701C47091FA0C752499D2754E3D6A2E3322730CFA4EABB60807FC81AB82D6A4C81949EE +75B45A30EFAD61F1984993AB44AE604BB045120D01CCC85B0EB54302E05AF8B5FAAEF675 +62057457ED730857620073F014DB40BDA7E41941A3FCB28A9EB2DA319C3193A90030F0CC +0DE63B94B68E7548B709AE50267036A770646EF39C64B31DB865D12A60E502DB4EB11C5F +F784708E3F670FEBB1888296C3753D690EB6D9ED17216471CD3C4D5FB8F3F6DA866E326C +58E8E892A3E6BF60ACD586D6CC8A0C984EB030E4C5E1883B78C4A04ABACD295FA292830F +2884504E35363BF69D7B2F16E43F5B94CF2CA934185C684B1F87108B58C0FA15F75F48AA +A03892283FD1FAB239D5A09BFA310E59F2244FEF8481E1494A263EC2E3D4CC5ABAE4E37B +D73F74559FF9B32EC960E5689C3E86033F1D20210FC448143FEF0C77809CF789F6B8A55C +F383BE3D85B82DEDFE4DC4480C508325A5D28216C097BEF9893103004E551D0516E05B33 +1408028C881732A82151E3572C279972EE0DA66503B2A7A7E450F1A4866B9FD0215B7BA4 +84C0E5B95276E6FCC43896D4222EC7ED7CA5A4D873D0E80523DA60CFED59C07C7704072B +8D988611AB4CE42D6F85CF336CD7FBDB4FD1B13BEF8D97BE6355EFBFC2F53E7D59E257B0 +F71B620746A03C7D7C5B2CCE57177F16490074171B8DC509297CD5E43B498F86C2BCB119 +8C408DC0DDC294DD2253FFC5B03DA71DBF93E8BF8E2AB316D852369AF766C92CB2C82CFF +4F9247BF252C7712AE3978F76F78AD8C9002426B3736257E92CED2337961A693797AD3A7 +3138CA2489CC0E2AF826E4DDEBBB1C1C2F07C6B98C721A0519A2CA6DBF7AA6CC5C1184AA +E5A05AD35274696A805327F95544D71747E356D5C1B83431FD8CE05F0378CA6BAA36E7F6 +8CCDA7246655D8866D21E21E63B23440457B8863118B7080AA83318B32D45756D17AAF29 +20A7DCA29679F76FEF9C33D543E54460506CF9254E16656E033D7558A09FE3BDAB6A283F +0A881A67E3FF025A92F37748527EC24A7337AAA5B6254A5F95FEE2380125D05A25A9BA64 +4E60FBC4C25C2AAC69CDAC16ED0D79188DEFF61692D56DD91481D11F6B6AF7C86CE24BA3 +761E2380974ED69FEBECB22EED4C4E244C635C52E0B162A79C948592CC6BFDDBCA26C8AD +D9A35E6EDC3D659EAFDE4C4F430133C337461E97D2460BB6C8C2550A500433C5F96EC312 +3044426764FD9EA134359F414F59105A3705DB72BB3199B0CF9240979119D7E0FC27BC13 +849501B45F654ED63F93B6D74590BDA5A019A93A397A59E9B8A41E5F61219F5884390F12 +321281D125799406F9E234F1133BEECAF2EA304AB4C313C902214FB7D7993723772C39CB +0127B4E82830DE0B9A7D60FB452F70F90ED4CD2D2628A132816ADED99B9F355D20313F71 +1B0586F2A20C90705BBE628F2C9720534FE780FF3EC15DE762EDFC86ECE91A1A9E530C54 +56A887921523806EFAB6E9E397838087921945D0EFDAD8EAD7D27E3C24B4BCEF2C8B92C9 +06A725065BB42F0DE1653DF32C802EE2EC33EBE5FFB0470AE8AEAEF3119ECA6FA4728AF2 +CEED07C5F5024A27EB62475A8254E8DD444685EBC545BCEFF63FBC285208350AF5065CDB +466FBAB8540D8679430793A202CDB44EEA4082A36797F4308F037F64739247389189E303 +F31A1AF0C1780FD9AADC74528533AC6EEACE64E043E09EC5BE365D706FBCB09338597286 +30962CBE409AEBA4142B80C11603B4276DF35E15E62CD9478711D2CC8454561B687C2463 +9F68BBE2659168C72BF87743E758D33649ABDF6A7A4F42F625B2F83A4F141CFFF14A661C +9DA1E1D045F6891F82EF2E548E11497164235049BD3E3CE707E99874DFCF2E912DC431F3 +7F9894E3C7BA894BF1677FA0F392BA9FB652BC93D898501C5E6B4E20FA8AC7CE6FDC9AC1 +D86723440BF06D420E78F5B32BEE9BE5DCAE455DF6EF63128622CD90C39B46CB9EE4F45D +72A5EB1512EDCB4DB7220E561160941421D6860979A039B9E5D5706126A3D65BB8F46740 +2332E34E1709298538D20F5BFD178A2AF0391E93672D1BDACAA87CAD9C13873C98B3BFE1 +D28D783690420FC7A88F50241EDF64BCAC2B64E2B0BEF2B5C646318674EAEB1A15D431D2 +1678A73D2165F9A356E648D47FB6B7B5A889391E194BF80550962C1E996DDE28AEBB2529 +6508102B534332948DE46D92DEA56C8D19A08FAD37A646BE88C0B6178F72FFA422F33D81 +D5C4F69504B96A0CC6FF3F4525E0F78BF4F1B27D7970FF1B2F9703952C823C0E99BBA0E6 +63E413EDA3C4ED453176723D3B91683DA70365774570A5E36C40CEFAF29BB91948820395 +B60D780E7EFF9BF0C7496905628CD5084A34D852EC665C81497DDAE2D38594C8556937E3 +FC505A281C3B582A9288EBC36E39B8A1148AE6B29B265016DBBEE8DDA7B0E9C7EFF37B87 +2E95507CCD7FEF306906F05B7FF2387A2AD253178616AFC3BE56667A9B1875C81D960245 +54B5B785D210EB8285BCA0D3462CB40CC8A7310567AB5C1ACFCF279EDC74DFC8863A0441 +897C6FC2C12B875832FC9CEAEF57543C65AE75987834B1C2ED9FCB266A9B8703C2F53E69 +3375F4BAC0C609D464FC164426B01930746D0C66516E02FA50A95B742A7117DD03D67414 +D40A0E37D0C9340181B3D689A09898DA6B4EBF8B9D022DEF18DCBB58D2AAE351488A28DF +8C01110345C31A7CCF136CAC367B7609DDF27B64326B1A93D69677314EB62E1603C7E522 +420000203B5A9014148875FFB716CDA3B0EE8558AB8A864DF11BD863A640FFE835E0D469 +F1587F32E5F329C2BAD5B2604B58204B7667397F349D4A5EC7D40F53AC32B5D493F8128C +295165B31A382D32383E1B45C12992EA246D677319AF5C09E2F540411404949A9825F62B +5A306FDE4A93720B5067B3433353F3473E078A92F433D8A3E7CDB486131A4EFBA06065A2 +97C4706E1C0049557496AAB1BEA12A9B7BC411608EF41ED6F3EF7288494B9B5B9728066A +F99B7AFDCF6C245C06FAB5FC1175D9816EB90FF3116A4040CD614F18ED3339C5828BC121 +550D55A8595E4E679F37A744926179453C7E27190D64F3284656CE7C0D334A7420275903 +F9C0889248ACDA0D646C1885FE98F4E2E9DA8353852DCDDC9A36DD4359723FBDD1FC3334 +E4F49C07F30DED223A031BB54AC966DA65C9979D32FA1F3E9B2F46EE773891A4CD8A9BD4 +EF1AF2763F1BB5A3F9067317D9B5BAB7C622F974A3DA0934EBA78E353E220C29FECF3541 +528AC86A4EE2F73AC9D38FEE530D517C00CF43377D607942F881613C9BE20B59D48AE852 +31E81B23EC531003D7505E6584FF64CE940DBF2DB3742B142A20B1C8B6AA07D9538D4E16 +B70AD1D7C07EE5BA566876C92F548A643A158096AE000A8C6E1948D46AF2FE91AA3587D9 +F39E0315C506F739461E8B73ADFD18B15285A15A6161491B7CD85F80C1C7240E35BA7FFA +40876F878B468DF1B50EC980FBC4C8C62BB16DC81A38A21ED69CD2AEA4A56B093BA9FC57 +1EEF14D429176852D4CB3762BA789C741EFC39C26606E93BD525C2850E99822BE0DA5CA8 +CB749B6A650ABE24C3667428E8DB1C790ACF96E0D4B48441B019D29D85AAD46F3FC6BB14 +8DC9DFFA73A5C6B041C48A60616850C31D1F648757E4ADD8AC4B6EACAA801A88D3043842 +6352AC493AD6D01C83BAA2B645217F62E167B30964B8493EBE3D5370EDECA3F75193416A +C763EC9318BB4A8651D858AFD090692FE0F3114698F8F7E729C5F0C20BE9EEF9E12AFA46 +8B77608629D6E5D5269898206BD5BB4D6BB72D97A959E793984D26012E4C5BF4B3D70C7F +43AB875FBC17E8CD19E0E56EE012782E73DC04B62B806142265938B4FB9B366B109921E5 +353E29F046F530734E2E312E953708B41884E50A0B4A7D2BA9A8132BE0FCF7FF5E37F0AE +7FB48513B73D346FCD60996A2ABC8659A8E93CF9A0E1135BBC4A438E71813F2C217744EA +4D42E3DB03AE3038CD53F8FEDDCDEDBAE5C69D7EBF6DD4A41A1510A12358D5DA5F98AC07 +DFB9C648B5A72AC100480E34D38B897E9390E223C1E057FC09AA828D2524CFEB0B36E2F4 +794FF8D66E9734AF0559123BB70725C1B466E5230C8BEDB01B073C10F4011D7C0F6F2814 +60A76371335A96AD7469C7C7012A3AF9E1BF900B64384B1FB1804CEA27DC37DCBB64B8EF +98BC8179AF176295DAE271D686E87D3B9DC68C138FB4F7E2FDD5962B35DC6FD46DD24242 +CC30107200FE6F7730D33F274B6E532FE791EBA9AA79E4049D3E406C74CE152AE8FD1BAA +96920AB1EB2CCEF4D3E3F58DD499C8458CAEC9FE7F1E91DFB25BEFB7EC37E53EA6A524F0 +6D22F8403643F13063D750BFE2CC05C32380A92172F9071F5B526764B3B98EA9246387A6 +09DB489CCAC4B35B07FCF17955B42ACEE5656DD90B6746EB8D11A8C43AAD98AE1EFF5751 +F313B455A66D646D83D4055FEF177C96DDB064BB5E6F880935CF01D146A8C792757F0CCC +25F3FF24869BA74D81DD1572901F099C6FEEC45992B8DBB77043A0527F628ABEE2DAEE4B +EAE37E89071761307BFE39AFF657DAC83DBAD2C5F602917213DB0C5D4A9604F37DF37C3C +49FF2FF5CB143505FCCB025002F292789FA6690B573DF46E2DD0DCCAF4F5E4369075E359 +5B999C19872053E9930701583E88627BCA93A11BF22CC6F45F440CE2FD768CD93B64ECD5 +4916B0764C459A2689A72E147AE9E66995BF88E4EB0DE2B9067D0FBAAA1658620F4B8F3C +5B469F5543F02D4DCFFBA5071BBA25C7D025C1635C5F5E2F72A850C3E5F63978689C3D55 +4F139D38F8F28E79D6C96AD77F03BB29A928F5C81FCAB3406BB16B427E26DD0394634FB1 +1134F07F316FAAEC79F04BAA0F2CC7D8BE3E76805500A40DB647A3AB774DD011C6D2D65F +03B4F2A45079ECE8831C28A4EB68F462561CF76650BD8000FB8971FF4ABD066FFA0C1E74 +6D21E35ACDE42E376A6C6488602674C537CDCF5F163101D4AEE68F0688E16337454C4CC6 +07D2BF89342B8F38438B6E4F142BC7496E17F12F7D241FE0653E8F1AA12BF5E2F91F6886 +20870CC5794A56888CC248E076DBC743CAB5B43D784D9C576755750C79F3116BAF053ED6 +659D9F02375AF7D017CE1DD368481271F3959A5F84F49B1D0C796F547A5DF8551908E48B +65E05E8DA081C69CFC95FD9889148A5594C1C839EC62D9D12A20B39D4163C193843F829E +6FA88926D80FBA23988EE8A69544A3B6D72D7B87716A963B4A9498E11893F19395D7DC37 +83FBE1AEDCB3ED86AFF660A4D3E25FA7F21848C1A8815334D443269EB21DBD8794A744B9 +7C9BA089AE6D1F3AC68615EC11DC1A6FDE19B1D732BE963890C6DE995CB4184614B3741B +A64842BA7486D4774D90FF43CAD4A6D8AB1BA46E0EB7A8812BB1D973F13DB24A043124FE +60C9C97151A8B582BDA433FFA3B9F734EEA35F1B86674150A50F75543D3BA208743F0978 +C6532B70CF70FD58BAE0B3EF4157279C6E9CA885CD1CEB3694A286993A238AFD737D34E0 +585C5396C21991883B928672AF8E7060F41EB9D955C2F3BBF7378E52964BB318920778EF +A1EF42EA6D8C53508A79C1DE7D85E0C9A292B820EF3FCF714BB533423A60BA1D5A084A35 +CE918A6867A12FD0C3B3BFD50BB025AA2B304EA290544A2758FACF6BC401A0391B070F24 +C3777E8D5DD438F24CCC919DA93C2D548A2279FAD56A845F4CE6A9912A77B202DCC77F45 +4A3B3BA11741E32D2D1C4F824978A078FEE972A6646FCB3843C655DB8FC065D66434DF6E +F46BBA42413CA88FAA9F0B2FFD2D753D6B891D8A6B75AE8189123A0DB91B971C00300F5B +CFC2387EAF61C367C981BFF3F0BFB148227E9A7DE7299DE595B027970CCBB78B0C524CC1 +DA29C98A769081FF8B2EAD1D01A97FB975C084784F33109CE38732F4B7BC2E89E38F7C22 +7E295B9D644CCDF0C3F899203C33DEEA916EE508679BC12117140BF786E118733EF50B94 +E8547E486E9BEEA26D42565201E05B4F7354989423115D89BEB2F1596F2458D7F248483D +7E1B4E359D679B0F4E1B2C73EC3C37373AEDC75723340A07B4BB35C820D69B0550BFE3B4 +24B44BF1C627C21EA62F4D81E59AE4FF9EE17315064544BA9908A49492439F5F4CA58F3B +82923CD1045F2A43449ED3BC3FE872A89A470857B1B0FFEB942D08B41E80EA5CD66FACE9 +94559A4A143270F8CCC95D2880C2206E0BA08216A85966E084F061B13887EEE5D335DEF2 +B872D0816C8923B106A629E90ABBC2016A819DB95E63CD4C7B56FE64A917915FB3E9E16A +E1E74DC608F123DC565D6AA5839F8FCEDCA33258DD1F2471C787E8DEF9FB417D33225428 +874680419E9DBB9479530B26C4385F3FBA517222155729798049856C640C8745A7212A4B +E7473EEF586E548BDD5ABFB34EFABE513FF7EC3E28CBD7521C8AB00FC7162D85E7D9515D +E56C53B4BC1FF18CAD6DCDF28317F32F5DC5A2D9F3B15616165F15D7757A05C4A7187384 +1261A65046B57EEFDB367EE48468EB4BEBD7A67368DF534C217E3CFB16F15CA97B986922 +B078C7B76E634EAC55BC29D2376AE295D49C9916F562ADD7823E23EC90CBE7395919DBB4 +6B5E21E56F9A5B204BF0662F68C49E9303623D847763A1AC888D00D7ABCF34C3401D2EE1 +59005343EE15EFB9D5A5A1D330A8D5EB442A1BB47C523A18F4733B76373FA37AF4234363 +03EC4BED56C72AB6316966E2FCB2363FF2D4CA597E68BCC3FE3F139C272C7454B85E9FD9 +E23D8B6A38159E91B587C2B5F01D75817B75315B989E85D71E52CA4F13497F8A11C207D0 +89FD55A01D3251D7553AF6BD067A65158DAA766E24AF513B5711A0AB231087315A3D97C1 +2B5E790F4488FDA7EDCD02DBC2FCE692DB6D56F16BBA576687769642F0169DC57DFD04F2 +FF63861E7C03F841F84AD6C096A57520694E536A26A19D977AF1DA8793C7434764FC12B5 +16BBCB418F59C91ED4BE658224960F0DB0C95879A591F94DC288FD475A32079D31E6C41E +808FA8D9968817012620E7F30F14B2C1C0A5BE47E647832CF3334F68F4CA0CF338223262 +1A0478FA29D7D90CFCF76D83F39E44A4A878000A6A252BDECE5DA448EEEF21A63695323E +9C69DAD5E67438DE4F7B20B6B0A035751A39FFBD912F4EFA1713546D0156C53BD3F3BFB3 +AD47F99BA96E0234178A7E980830ABDC6E8C5CE38CF0CC56570447291D422D9ACA5CD12D +D4444402FE14825BA95670755422399CE362805AFD38C923358F5DB8BF1078C3FC6AB6CA +E3B057B7760CD16F2EFADE9EA0D40D6296E4BDEB33AD023109148BAEB6307D20AD3F8A77 +F5063C8319ECF4E56586C12982AB630890FFB2158AD97B5AFDEC586DE615E8304FCA1C52 +0369FEBC2C9EEE9068A6DEAC05706FE7E024E8254C4CE5C7404DE853DAEA209E7D067F88 +571FEF20076CF19D6CACD0D29B43E04E132D40C0FEC8FD4FA9A7621BD18215BE346A0F5F +C6DC05175753865A2D987B947FEDE67B23FE2D3635C357633D57C90C41923F889541D703 +9399785BAA6EF2ADBFA1940227CFEF4448BA652201223FAC24CF955B98087C4CA2664263 +BE8746DFC29FA5DEA877AF83897FE2B068B061B5C05871FA675C449654E6AEAD3A8F896A +A3588948271FB7F9CD953144CD070DEF9F6CF516C8AD51B47B87766087329889670AB278 +9CF4A2552225A1C997BEE8C3D9FE338609022837E306282A21867ADCD56FA9763D34A547 +8C7C7570B19D04D6164EADCE146E617C85A122E9265746EF9A929CD2A9E341095C7E646D +95D437FD5BE233E352B27BD9A19D0FAE0FF524257DCDA23C6D5AADF460EE7358D4490D7B +9DBD68A72EBDF1D266BC974D7F56D3C89850C024CEE759D09214108D6916D34B407E62AD +89B402AC74F74EF4C0E96569977627C9BB63B6C6F536D1A9CB279B636EDE90A804F32254 +DC167ACDEAF8778B164E36ED23DB890438AEB44487E3355E536835BE443021621DCA9E4C +8C39A54F4B7C28716329997C1B0BE5CB5FFFC7E99724D5D8C829783D156155639D79DBF1 +FDBF3082B62BCD5A3A04BDD2D94BAFB7BB997ED0A6524DBB227EFB29BD49A240CBF7644B +AFA665795211AA5735F435336C88EEE7972E94505873F66EA6657AE8A1480119EC9896EC +EB6C9250F5BE682193B4CF0C9CBAF146D2A61C895BE6518CDEEA1E460EA8119433685E51 +87CC18A77BAFB8C8C411EEE0CC655631E7ECFDCE6C59B397C9D568D0EAF9C6C540E508AD +3CEC230FFC326F1D9570218D51591C335D89BED38711EDDACE3FDB2F667B1107EB410283 +61F09D4082975C1EC481504D446B0284D017F96B94FA8875B08B11CE175C1CDE5D0CC9BC +93202FF57BACADCAE11ED701021E7720B88A78AFDDD6D71409E4DE4EB766970C87E3D900 +76EAD2457BD9D819B99CC7B0AE137CC3E018F0EC1450E91D2ED5BDB94D86BB77BA4F291D +8DC1443FDD001C7EB25B09208B92FA8EA31CD9D0A6DB0059C0B4643D898CD15CDDCB211B +885155CCF420E1C62B867A923C1071D1B4495FC4914D957D3208D4C0EE082C898D74A063 +2B60AB2D9657B9F510BBE6A2B9AC95D1192350183541E598FCD52B811F4543A1CF25A85C +12F9B4E51CDBB6067286D7B6919EE8BEE3B3B6C55BA28AF9E7604D13148000CC0C1F2619 +DA17AFD8CE1DFE099B7039FE71D8F6439F0E046C72F76E2CE69E7D787C9AD548563517CB +72B57FBE712261D00FEC755C108E9020548F4B49D805FF248370459EB32985DFF1BFAA2C +E0EE93D945744965FD6945525C176FD953B5394E521DA5CE283F147FE0A538C74F326BA6 +60D9721EC2A777B3F9047EEE5535159EDA109AB7CD240520DB61BD088FC45F4A0EB42614 +4AFFD87C7C1DF28DA381BA980D2B144708F7E471230DE98BB691D78F4D8A72B8CB519474 +9D392D4CCD79A03DDFB93F8A8163BD07FECD4851EAF615A49607385852857FCE90F3E499 +3056B7E80244FA21F488EFB3341095E684F428574DDAF149AA105863626B4952129CC819 +06D28957E534DDB5C030E718CE15C9561A04BF18A0F3785CA6ADBB5E2CA74C9166D95FC5 +8537624A9B0663B9D4684E64D1C17BA9DE128EBE66E057FD3CE3B5C7AD929640C7B26B71 +48E82F21A36B86664317A1412DA80BDF4C867852BE5E650B772F6DA9919F32B96860783A +AB469C9C88A0BA958D3986121F396C4D2183D104DB5D0382A846DF7D40E195182CD24C79 +01C1A9E556EB8CCDE58C61E44E7E80F37568AB5858AB86FBFD0711552F0CEBC1F4A4FB1A +0D55986B73B49D49911008851EFB478C9E93BE7A1AD4E10FE0222432F64329B0B1577D3C +E603C0B50AEF8FDB39804ECF0B566C2757DF12F65F3AEFEDCAD98A6B9DE485E0E96F3974 +FC7B196065C86992DE0BA6D4CF123A0CDCB94CEEFB8420916000F18B643DCD6A48FA32D9 +F5FA37D93CDFAA1BE4D95FB3D597CAF2EE196814A3B2E30A494C70EA193DF6647D96DF61 +BFCE1C5043899E5D33176B746ED3F555AA0AC6A6057C0D1B2D283C33142114CE60DE0811 +A8816D22DDE6BC1854B6C8930A5FA6496769388FCF338446838C3FD937C391CE06946181 +83051E106A440443F143CCD973B24B9E5D27E384853212CA4AE98C16B49A4A311A7759D3 +41B4497DCE2627B7D6E4FFF124EDC45B2573371C034707AAC8CD3A3F9547534422428B11 +6F840382D0D36802DB6386A9E73B4E3E4D3BBC0FD636A9F21967B1D550D727CB401598DE +144B1E04B617FBBDE509F475F0F2181C0F0C6C3F49228D0859269839C52FC2018CDEBA3B +51108199DDC78BD12E55B48B557E07797FC27BD87D41FE591E26F284B3E80C3B6B4C227F +25562C846B64143CA3864C1974777D33EB196C29B3391D658208C62B8D0679C5A2380B4C +95CC97B4192EECE50BB950FA8387505E858D309FB172A852DE81ADE4F7B7D1AACEBFE2AD +6F0106EDED3D7EED9F3827929B54C17364D62141CF95137DBC1EE377FAEC39147CB344B0 +94AFBA1B7A0A82D41E1FC63DAB168534255D02890B465F496A2625CB78E683DF3B64060F +255876747A24DDC01E0074211C23F8E28DBD6A6A0FE90C42A35983A92EC58F0383124C88 +9FB29494FE686DA32A5140BFB5E34941EE0A436BC5777AC41D188069BAC81E7E5A76CD21 +3D5312E317771DBE5EC3A6A3DDE1BF1176C051E8949CD8AEA5B12D67B8EF50C3ACB62E11 +73B9C04AAD76EF38A14E2974394080439A18C0194676434BF803672E115B12401E2DB0AC +7DB89D1D784AECCCE8B0B1541D3494A3DD019EEE3600C839B16070F7373244891AA199D4 +5AE86ECC513C403991885AFB8DFE85B21C3290DE9277B6BE583EDF324C3DEDE193B1D568 +9977EF532122FE8592BE4B649B773685A6BB1EEB7C9A7B00F123A4DD784F52A0D0A88FC1 +292AAC4EED21D1669C7BF24448A28405A6D958F702620DF8DEDCD899B7D88D9E8FA886E3 +87E91ED91318B7C0FB7353FBA22DB282D8AE1EDE64EFE64DD31D2CEC0712454C66502976 +2944EEDCB22AE9D3ADA5D9AA6D49004F5FB72CD0C6594D7D51F56FD7DD5FEF94B0CF6CBA +C823B03E69EB1F5A067C384EEE3021A4EC292CE7A87CE3A068B51DA6C9BC7A5293553DF3 +21226509A3F95ABC67B047D344BA7595A2D6210E748968EAB2999E24CC2041D1FEB1B7D7 +CCDB4FD8E57E1DB84C47F072CF15CB9425FEB8CEBA0C6A7B807CCD6A640C2DA23990BACF +69E414FDE169EE9DCF25B85463CFB6B1212A980DF38301DD90961CA8B53AC3E6EE9FF9E1 +54A3DCA66C6644F75164B3DEF201C66BE4D54F108A27689C79B0384070151567A306DC4F +61E6A5400E74429CA8F6CD35DE63EE5D81D30EB252BC34D99255BBDD7333A73531B4176F +104318299AE0FC04EE26B4B3B70C39AE5D96A968229113A6C9605483A55AAE4E1B4FE4ED +C3E61E7E416F905BFC6E7B8B982919BDE420725B76E9F3D2C993DF2A9A71B62202595AB0 +A15C1DFE629AECF2BB6362843CC82646B95C88BB074CBD23361008B6A575B19E27A49D26 +CEF1C27B1DC89A9CFA5725E8C886D376166E813DFEC08ADEE5A31660B1882C4115D12B40 +2D62CB4CB1C938D07FCF89E61B352551AC0B0E37837EAF6AC464C58A79068B2C7FD4FC89 +D471C914D867EE903B948B64B0AB8E3F80CB1A70260E84418014FFDC90F20B07E7DF7751 +17432E151473F92B8D7FC93827D2A1F1A204EAB90CC4E493F962FEBD84B816359F4088D6 +3B9B33B4A2CCFCA49AE19EAD91C9A6D3079C1E0A167C874C16741F3A0243A88E45D1F144 +32B31A286B1112DDAB9E816DF3BBFAA348C75305099E610EB9CAEEE570506483383F3681 +C287B3ECC3CB25835A3594604EDC661BEB1E4EFCEDAD9E4B6B09587C4C2810550FA9CB99 +CF035064646F9DFECF48B98DB27A51B26EDBF083A7EA8BC696DE161CC10301FCEAB82E94 +FA5FB6707DA84B83D8007435F44B216B36EF71DA5E490ADE62D61DB7802070FEBEE23F42 +4BBF0521F693EA29A40ABE744C030FB428C52A4CABD3D5E43283958CF3924290884E1198 +E50DEA4BDA72BB3CF95A1FFC8508139A48AECE8FED2704BB2EB8851E3A7132DCD145203C +CA826F0453C71FC2581AAB287947A14425D928D75307080488E1A30224D933A090857214 +029F05EAC8F5724F146A5E5E6392DA33465082CF2FA942F83BDC6A6870C0585B1339679C +8619069983A6FD382142C46F2D63E4B129A62216936FFDCEB97A1C5A9575CCA5A1C421C7 +600AF4CF4640A41F6584D73B5B3AE1A8D98DCBB4F3AF7D2E7316588C1B3BD6FB3E1FA8CC +EC6C8A857374D1383B0C9D1D314A10EDECF095E3A4069E79A94DD59FE72639FB02413D68 +4FEB3ED14BA97F733516C88771DEC6C4F7AAC18160D7F1C85916ED3F69CC6181574D0C2F +AF7D3E1EFA05EB5084F4F9BF4DFC6A4DA0985918622D90860C8838C5B8EE35B059733381 +EA94BF0FFCEA70FC4EF0AF2BB2B5FC4BAEF9D0CEA3E8516323451D868F723D01E0B78749 +4A69738FB836BFEE328A0A4541A03012D44B4830F174B7E35B0A25086DF34532C428E41C +83F0814F0F0D52021F42037B4DF2A6759DAD05A346E019A0633745439D835620555BBA5E +136A950B9BB234C1B3450E58CACDD658FFFD69B8E87D4EAE015F5427452AE657736DE2E0 +D66DFF9E03E20E37B377AE912B90DF242285B89610A55386CB1BFD83652E6BA1DCA7D1AC +A79748D0C07475ACFC652460785F6D82D1EB593DCBCFF0157856D5799635FA3E129FC93C +71A23376E61DDE5014964C4554743312A14FBF83FE99739D6C9C45EA465A4B55EFE80045 +D1021AFDDA6E5E13925F3F69A19741615D56991688E0A794DB1534BB43F010A76D4E29C4 +ECD9A16A90A7588DA1C31500FD55E32B2ABA623524B1E4BD40259F5C746EA160C13416E9 +167D2A5507D8D484427C0C5153E0865241A7BE0C298ACB22E5A2BB24AC7F78DB58415206 +F1C435587D4ED941AB7335D0CFA0528409704BC8FDA106CEFD32B77F1D6A02DEE4B05FE7 +3DF87C5D95533B4983A7FD9C3FD2A3C109F9D1719C372B01073C33C5CDA6E20F91EE2F2D +AC11D4B111E070DD059698CF18553C4A9A8707046A420F9BC6A6C208906987F2F5883E1F +8EF30E5A9F78BD73AE6C563EB04FD51AC339900528D76C28AE2913FC28C4CF2F585876DA +472A01FE1934645BA0AEFD5102C2F36362DDFF6EE3B4A12B63CA06698F06A0F25487EE6A +28CEEC421948B856D0CD999682277ACB8EB94DD7D88F18FED1725C3F0A9545795ACA2B6E +9C44687395B6EF3B76806A500019CB2A70C07E571100B7FCF486E0D14340DEF49740B1E9 +65ED400EABD0F69E310CBCAE8714030F5776CFDB057AB354CC2F1053F84EB8008F455DC3 +9870CEB793F611999E33B32E64572D46CEB3E64E0881CA70C576E2FC07AC9349EBF26BC5 +6D4E84EA3C835070D0C52A41DF388C8FFC979174084133CCD6639B616A4A20DB37F2A437 +0EF7E9F11A14D28B18076E8321FA194D9070D1D8226B2911595E3567C156BB1624F63635 +24D1F3634A08E48178D1486C48243DF9156D63B32901417626676305F6ECF88998B46F1B +50AF077104C052E9A20EAE6924DE1DDBDC99FE3305F4BF802ACD8DEBAAF15A3F8879553C +B1F4B3D7839D6989775507FAC15DF1B0DC95F554B16E0DF685CBDBB41E4A852CF7DC8A96 +8DA449DD5966EED3F7802A7B12A95CEC94DAF052CADC2CA2D84D7A8FD9BD74F90F47991C +4FB5C5D9342C445E963AF1CAF3E5DF7AA4D483C9F8EF73CFE48C6A25889E3B5B71CA4E4B +0FF97995BC83939E986AD7F6B379CAD7FD04C46234D8F85A234A878939110DEBDEAE85DC +636BE2A646F64D9661844FFEF6D22FB15F5B38C129DDF372C3198992CB6C378E8C306739 +012DD4B486CC3148BA4498EA8C0149E59D4AF1E7A0C00E0F94D58CA91C0C4261F459A4B4 +2F8791E72A634D734A3F5DF66AF91FA8ECD4671C67ADDFFD2E2FD30FCC3EFBF0AEBCE786 +DC44B9316B000A73773D1C354964AA129D82722BE5C666D5DAAC7A087F1BDDEBE3FB9AA4 +CA53FB8684F87577A264E607053D5E321108EE9B8CE78600F1986C9F2510C8AE368BF871 +8C8AD6E2864E257E40602D3107ADF63FD9DA46BCDBDB77B5164C43C9F1D0A1E2A50C7C0F +7BC6B45BEC60EAF2FC74022B8F0463F39CBCCF2B38318C6EB370B7CC45AFB3C1350F2A4B +48629916CFF777829AE2904FA90C19C748BFC921ED3985BB03DFEC5E9E250321B75723CD +1AAFE40242C54B182846A979E80024A9E72029A7205F13157E57C5F40951623EF59EE581 +20E1C1F1EC93870BCDF45A74A731DC31CB5EE13F8C568E4C80C7D9ECE815610F215AE88F +7157CBCE990172AE920EBED45161194EF998C933252599CA45540855A0E4FEA0866C2D41 +8DA00464051D7C0E2E5932D7D80921BD7F6997C9FC550BDD83433D959768C0E35E8750BA +0AD159CC296B98CA650724BF9693E410AB6106B9D423AA2EE6A47DD102EAC9B74D66858E +FFA99A6422C9B5B2D466E817E8ABCD4E953A9DF9CBBFFE5748E6F47DCC8831566DCA5EB7 +26B68A5C1C575340F5D034E15209E7A6C5A3284F3720A5C197111539E4D3F4B3392D8F4F +C400E3CC89544B440BFB258003A6B7EBE045D625BB3166DF4869F2D8CF74EB7303F0AC40 +93C24843BBFCD9A617E2C7BD53572F0B61DF1BCF677B5439B97483C973AE56D0E206FAFC +1082F9B2D0D5F900F6575BD6E11FD0863577F4CB1277C1D156711DFFA1012EF22725D52D +0136939EF40B0F661853385E154C8660C3C472618E7115D705CD837DFB7C0EC85F8B0A59 +DD1564378A8CF2B03768B9CC5AD7ECA0DDDD4D405B0DACD6D13468C833DE9DC82271BC80 +E4A6357569407FB09C289458B2ED792D01A9BBC25ECADAA8F2955811145BD3D681834C23 +28C5E3760EA15AA03D3E0C4E67191EFA44E4A4928089E1224BFB0E79B5BA440E036007D5 +32CB8560DD157D60A5A690894208C9FCA54F32FBBF9C9BCB8A3A9ADCFCF2BCA1564290E9 +832C9E79304A223F60B7B58245E65D598EFC1FA06847E1AAAEC8BB3ACB454AB5EEB9265B +04589BB8FCB5F87576703AA3594B688F5001053D34F17FAE60486EA07E6CBAE2C6358DA6 +AA1E68A556A1E2B1B2DAEC2302FE04241CA53BAB74E4EF219ABB868FD624B519C70EAB34 +B5A953F17AEB07E867B4317B48B2DAC162B6A9EBFFF4910FFD8A96BDF6E501030928E380 +A6277590835C01A704FAF9C32907990804D0A1F70529C09742422B48586C8762D5E8871A +F91527187537526FA52601116969BCF7C4FF8A22446A184E9CAC17AF709489FA39D372A6 +6C3D580B183D1AFBD6A21736DE9A09F2968AE69FB587F4FBF7BF281DA926F6F55DB0430B +B45CFEBC493195A1B98F68A514C64483E30F22A7DAD69FA38ABC4B51110560DF23517214 +081F999A3F1D415D8993C940BC40C481F77402B51E7573801DBE672A8739BE239923B996 +23B97992EE35B62734095822B8331F69EEF8BD26FE6A6FCC0F6524CE9BEEFBF40D70DCAC +49BCA97837DD526C105AE9624303C120407740601B1808D28F311B42B2EC20E1FDABFF13 +2DC42A1EA01827AC85F44F4E24C9B72BC9EC17361053BFEEA913CA872A24FCAD6415C77E +59FBC9182B6E931C0580BAFE050432866D75828FBDC44889A794C63F0855E75CB056F36A +A4F5F72D64E5AC055EAC800972934F2534FBB67469E7E41FB8F5819D03ACCCDEE81EF213 +0E1A4FD88BC7074BFD5D83FEEC51C9D1AFA13EDAC699B3DE2595C88525891F2179D8A0A3 +650CC93EC86F1B79D135BCDF82E797480322E4115A5DF19F16DF7C2557D750347CBFF239 +979DBF0DD515FA7B9A12F57670103E579FE7E7A9E0608CA20D0CB3FD1862E99248035DF7 +008C5972B216D066B473085B42AE54AE3C4651E4961F412E7702535F351F4273A97414A5 +3FF91785AA3A90119E4B93B8BA0375207191A2EAF3600CBD3A2ECE12D8EAF640295AFFD8 +83A7779F6DDF812467E38DB5E6B5F1C1DF8B4A0B95BF02E5C5F896936CB4408BF19CB9F5 +58541953A868C07F1FEA9A3EE0CE28BA312C12336E4B1161A934DB4035DF951B428B0320 +5FCAF9201D34DCBA174888CA3EF9D8E708B7CCE5CC95ABA181B7D251BFD9D6B3D7358EDE +A8A32B7F85C3F2FAA6D2C8D08751CC807E719311621F76D554B7238E9BBE15F19A7102A3 +0F343CC0110F464BBE35CD3920EC3A3EAE89EEF21717ED7015359D47FD7BFD16CE001058 +0B6DCB1BBAC9FCB2EE435D6AF4284B0CFB140CFC4B7BAD83E8A5EDF7C27C3001225D1030 +0F48379F84B62D77D289B6F2CBAB0CB27B5B9F840EE86072FEE3A858A62753BB5550BE8B +A63CAA5AB5E3756451A79F6A65D6CAB3DB0FC739345392377CCA2661A58AF73837441681 +567C6E81C0C8944033A4F36D599CA915EFE4D03D95C245298D10FA0A5BC9E9569D84E13E +9653D44C827182AB29339203E578FB73FD1F1354142BF3D553A6720EA72318EE76E226D2 +AC788224721DD4522A247C18ECE489334991DCAE23D459656224ACD39B04DF5ED6A19375 +DA2C2113CB7B8696EB78522BAA320D94A6C04E9CCE17D07C833B6760173F99151D27C561 +61DFAF6BD81FC42872E3DC8BEF1472CD53E32271A997CEA4A057D8CB8DAE15FA7AB150C0 +D92A1A65CA400C436CA993854B8C18D78F1B593139F5F227ABB34E1590A37886467BB263 +14C735651C3245FBB4F620A013D98499BDCF3BFDD6F1923DD9701F295E50E4C3C74DCE02 +571B4F4CB40C06B325AE0D51CF1D9BA0892ED1DE29419E3B8D6BA907B54A96BB67C1EE59 +31E85906AD2C09A9A964401769446BBE07199EC8EA8E3947B5EC31AC7537F93C9CA4FCAD +771A110F2D3AC7CB6DBFBBC2855F2F360D8EBB53045AAB46D65D206F03E0F4C453FA6169 +1DD1171543A53B89A2353511525EA85A4A825F3BB6BBD2889CFB8696E89902EB0DDB58A2 +279D214EDD2E20E0DC1F06A02B09AE75B20DCD226D353ED6541007905383551B46C2802F +EEB4AB6DA75C2ABB220E8168268AA384B3D4F8D9CA591B6BADBC27E4CED9B4324B2C4C19 +80ED6D6F7792FFEA1BF7D9F4D5CF6E52120BBAD41C87C749C042EE247978B45A1B30DA2B +C2785D51B7E02482A095B8D8A3D2132F9C80ABA4508931AF7A99A07C0286144C4F666802 +A68D63210AD70C872F74D40F72547ABA3F4779DB29A4C86633E273B3DE4B5F52759E171F +C67D16C74D105780E2B85DAA2D13807660CAB1830AEB605CA7577743D01AB9D001A65C75 +95F576940C1D3E48C8F5FF569E6B17954E98284DAA7C062347F0C043D9B71AE0FE0554F1 +D2C8DDA86EE58CDB0D63C974812D902CA525FA81B3332E4A87A5261D6B3FF4FE11F44A1D +73804F9DEF69D93F195C05C8C16781252FB8DDE0C59687454BA4D7A3CF762DB5AD308A64 +6978CB14A6A8DC6570806D7016E3B7FC0FF01ADC1D983B8A720AA7882DC49442A7D94A6E +8F01E5DC1201D9D0747A7DE1500D7BAD256BB6992F5B5E1BEC1D88BA81C11F80F994653B +36586D1EA5B5F805B16438070875630DB4B42B0CD171B152FB6BA57E9A755F80F91AF208 +2832357ED13E723AEC166195D6D88DDDE42571059A5B8667D28F3CEEBF24002360F226B2 +9C6103C47D98A6A330FDB99A0326B702EEC1D3B8A118F98DDD07ADAF1B24470C8C465217 +172119E78D37FA0E679D3F4EB4BD103D821FD839127AF7A26042853B99C89049A7268D82 +DF8079A1D47144010BC562504310AEA3E2FE85D91CE43275B50FDA31256265A4C318E075 +2C7CC99FA1618BC3979A58399060CBD9C4C8C7D5455A63BBC4963336C5BC72ECB5245CB9 +FEB9D399E925F9C67EC1FFAF1B28A1071A58CAA3AF9ADAD934F4D1459FCCFB856644B2E6 +FA6FFE63D48676EEBFCFDC2CCD9EC64B71A30342D364A165AD365F82C9971C565291E1A4 +FB4A40806D264B5A3EA0EDD1DDD6972D5EE5A27D633D546EBD8D3B184D7740E519857AEA +F8E2108FA525B504780CA54567B09C188D5D960C2CB3AD7FF016955229DDD88BEAC3BB94 +C955A5A27029E2E76FDFCCFA2538DB7FDF8995A4A785630B22EB30AB37722535C95A432D +04B82EB054DD30227EEE30D77607A4C2BBFCB2F653CA8895DBEF75AEB36BC7A48DAAF131 +193DC36826ACB8F8F33048F223D6BB88DC9FF78BF729C07E70117D205D39EC03A0C89BDD +926E7CC6664ED8355F2EC41D9B3CA8B4B58A201BBE9535A5620FB6C100D97161F308B01F +5E9E22428400DC8F41D6CB367BA6E8CD890D0672E8506B4C6CB352AE06BAA26700E74856 +7FCBE12864C32480CA3A1CED87517146FEC7578E3DC027CF2A59A5A09A3CB76657362158 +5A1BD78D218EAC0B318D8C96F2594734AAFABDBB4C2B6927AD5299698366B1BAF03BCAB1 +E9BC91A11A33A1352BD8F7170AE64A116675C3ABB5840114D8E1208D851BA251C88A7764 +A90E769FA91AB807AC6777F777030BA02DED02C2C391B69282AAC1BD8B99F7F9BC778E98 +B2DAA85A3EF8E9DBDDB7887890B0B2310285DE0EDDB6B4628550AD5C2FCA48FEC21F1BDB +3C6384784EB6557DF3DBF585103EF3B0276C48154823C79224218011DAF0763BAB3A9CE8 +C412D7676245E96BDD47F2E79E126FFD8AD75139B3B37FB13DDEE30FFAE28F7327B859F3 +14E4514546B87FA7FD4FD545872FB0AE4F8AEAC3B882A23DAE3D98098BA60847B013CAC5 +6577FFE3D8A1FAE941DEDCCDC7101E7DFB0B17F0E11100A2947B73FD8A22341639966D6F +DAEFF59CF0508E01920C167369109507A6E7ECD9CCFC30F7AA87BA0C1C82BD959FF8C43F +234EC01C7E2B3AAF12F543FCF5C2A2077DF5E0E9E3A976F107BC8E8856427511FD5EA85A +BE944C72CBBB3DBF4C9870F2EF2FB3398449AED9E345A43E8A6B0A99EDAF4118C89A3612 +CA99B59D4BBF25800E147BCC6CC51D1B3239DBC3A15CE68ECE1F2CDD6D8732238A922C04 +AB8859F9255477B00DB497320B8017AC48BE9C10D2452A82BDCE5C37953D644D50761302 +FD40AF015C8FF79C82015EBD62EDEAF0C0AC637F54F436ACD2D0876390EF02E29A4E3B3F +59C7B3E1EDB64B75F0DAF5B401015114F226BC68E31187214A69EAE0261DD7DD59B033D9 +311A2F01E44FC47F13927C1C9921A5881F2172CAAC71B0FE038C1B6CE87B04EFA42DD4D3 +65F6249C359F8071BADA34F2BD0A2A2C7B6B8AFA6A1F765AF2A9E77942190D1929EFC2E5 +509B9066CFB90D5D2A4732088CFFCB20A56A3218B020F491688AFC95CF8240EE7B7C38AA +13CF17FDA80F40DBFD5F92D1185968B43A26D0E38D0C9F91E7226E5BDE34F083FA117E2A +EF3CA2FE14C63CF404CF833DFBC09E27D96F5A6C16FBDA79DCF00652DC6AB73C4F6548F2 +16C8B245B15D9B5B29746E53FAA0D95E4C0357A3BE36A6CD993AECB9A42828E934A36388 +FB546D8C9D3531EC7B729D44D8AB61975BC7135E5ED59FEE11F12CF5C9C59160DE698385 +778A751CC279F807DD68BD5CF994340A16FF47147F029468C24E6E7AB08C2C69E9A5C5B9 +8C62FF6197C8455BBDB7BE9D069BADCCBE86FEB495B52BF65CF17C4B1157210C98948036 +55444C22444519D8A72A2899C20138698BD646E94748B62C3CCEB35C56837BEF1BDE5B39 +AF2E40A4D73DD747F1429CB4A953F949B97D56DE8601E7F299C218FA0D367559A750802F +64DA3BC53F83A733B1379AA57CDB1D657C2EE623A9696CFB580CB63902F87B4786A55EA6 +2BDA6CF94FA9CA44F388138020463F5BEEA1E273BD5BED2E9B08B60558D6A2901929C23D +2E6A61351A5CFA65DF52819D002CF21CE650520436C9681C60D81582D5568A6A0536E236 +26A13B4CD55903D130BFD7EFF26E806768C8EEA16359FD842898B8DC539E3170D4FCF3B8 +72621BD4C65DFD9F7EDDC0B17BB478990673970D4D4A07C7170698D784360F7A6A53768E +D9B41AB73360FE08C21855615214C91BAEF2F6A5AB71CA45E4B52326EBFB99A0CD401A7E +2944424878194E14C2BF7D183EA1B4C0BF9A3B2157EDD6143E9E9B30891F1185C3E2942B +EC87C1EDE03B77FE7CE0D145C0D918D13EB28EE264DC78409D7FADFB03718C6DF7D50A71 +EB216B5735A990274C349119C8739E5505F23C7025A79F4A22FFCC532981D27A70B94A48 +CDEEDE1590A2A0FBE661ED24CEEEC4DFFADA11F6514A8D7C026D2D685B07F9DFAD07147F +C7EBD82D9A52AAB50D1B52945ADD441A5F3A6C809127457895402C1AA796582950808F4A +21BE6BD2FE25CB9576AE1640ECDE763FFCFFFDD8096C9AD89B8B2390A2275F224F2FFFEF +148E4E1F29DB6BEAE998065B0306535D588F901C3904FF47D1428DDF213BB0D9D558006B +B5F032CEC1BDF4F8997B304CE400EDB24EE46C97DA278E03B768C2A23C88878B9A79DA41 +68175815CD1336A71D57C6E07CC7B8596425C9F8214F0BC2D99400B9FD644C1F8CF0AD3B +795B074D9D9CF25C18D3847873744228A6AB058D5D213587F16740AB978CE10EC3274FB3 +DD411E0392432D67C9945091AA3D90F95C3AF2B808FFA37B6C6359EA023D1ACB7A007F4D +5AAD3D9EE2467F5FD642FF3AAB11451EDE32138525FD48DAC480E29A16561A7FAF95759D +F83FC7504396991BA3CE2072851D7B962FA387A40F62DA05B81B39CFA6123F5B2CF261B4 +C7A84DAF87238729FF71D6F3DCED7CC97CB9C373D6B150C035853167C49368F16E447A18 +0F7F9D4CC3978E3E6B5F3B4CC7FA3078883D4C8BAC0A94E9B69B7CCB94E6D5898EC61A06 +E5A960058E6A1696C0BE287F24869414CA8D16E761C120FF5116A19EBD39109B0E251664 +DB0A5722B4366151759BDBA4A74204893F585A940EB1BCC870873F6F4E08BC88A239F23F +FC51016CF6F8CA8830346363BBA0E1FF376EB66174CF31ED9AE04219301EBF61A1BB5E55 +A89EEC27A12666287AE6AEA4D45A3706FDED0A70326CB050B6D25FC56216F932C1294E54 +88E3C331627D85B34875E7B51E4E7AF724CDBABB1F14EB6F23088595F2BF26D88C04D4F2 +4B94D94DD47761AA0A9BF649B06F7A2D56D30FC432FB49B570A53280A341BAB378037DEF +7FDC3B284C83F7CEE6800CBA2E20844A4DF8F2F5400167D136F810A7A739195896E470F9 +5875E669A770691C885365FBBAD1BD8461B005DBDD60891F12D8D4C8D51C8605B3CFED8C +EFF997868478A6A9D642789127727FA231B4BADFF182AB67B8D19402633BCD4913957BE8 +8F95E11EFB60934E8F26BD79622385F5D1CC5F7F492BD69C8C4BE47D76EE6466880A1885 +F63C3F4C893032D90FA8CCAEF615340A8424B4B1752C9009DD1EE6E0A10A0BE83DCF2CF1 +E746AC5A62FB5809310D5F64A267028A7EF02493B6DF22012D036A19B4AE3A9ED9A5F9C1 +6EA82AFC6DF1DDD7E243B4464FDC28B63DF4CAB59A58949558B1C1B4DD96800A69D14E7F +9DA1E1FB6DDEF437C2D31493631E79A41AEF27721579C7B40AC30421726959CA6CFC3F65 +5B309D67F0D50DBD33DE84CCB5EEFDC4923A4200341A8B5F9541428A9B6B94CB973BE6A2 +F39DF0CC141B9CAC1D0F25FD087A176D68BF69C6D2BA5084B586B289B00346DADBB42774 +251ABF854004F12EE97092CBEC6BECA5B74F21DB1BB72C9BBD9C0E11CDB4F64F347FCBEE +AE58924610D8A5ECC6EEACAAD54B36117A2EA580B9D6FB9635EF4ECC1649D1AC8634CD74 +0D01BA7F6F2379AB2BE4425C02198E8E75FB46CC405F706C2E2CEE54582CC08A239A6DF9 +BBD208AD5AB256C5CA2230DDBBAB210FABE5D4582B22F0E66ADF21F4F755D8E16EB071A1 +3EB431CB00EBA9EE617E43AC2E0DF733151A82D3000DE349C9B9E44227CF001D50E6C62D +A792040A868EB92A635208145CF8C25F51B698BC3460273AE679D251A43D5D1ED8D5D759 +6743700F9B67ADF9E103EE9C2D1727808433DA9D16ABDAE228FB35FADED5D54816E066A1 +8EC29EF2242125D1687D60655B3EBBD8E6227D0CAEC0E0BDB7845914D063890125E568E3 +8B14160794781E8EB631115576CF5A7E9639B02A28CF363720067EB527988EA1D2DDA4DB +CD35790CD4F91A253D0A9814143492857A320088FB02B28ADE5CCB4BD7878682E2895B07 +7029BEA07B654A13EAC49FC3E9BE70BFEB73418204F9164A26E47632CB0FB20C643A3245 +4777AE40288C6942D4C0C88FAB77120BC73DEA4EF0AC703DFBBE9FE79796671938382F22 +8A9C5B45C48FA131C17BE362EBDEE57378738DBC29297A9B69A7854A6D702524A76573BF +F76434BE57EA370D43CCED36DD0223939D362102547E2B7896BEADA8F0B3243979B3B4B3 +4F43500473F7C712B5E3B25BBBCEDDD40797649305E5E7AF2B767CB21C93195FA3B2BFC1 +A5891A91CA879BDD643A4A3B384C7A55718BD872E01674336419D2B1EFCBD888FE8FE9EA +3F07C87A87BEF21E66F8B26D25841401C499B31DF68FF0491E660E40C79E5EC2312BBF1E +364F6177BDA9DA10DCB347E40C8F423B12700C4C47DA4B09A27CB14310C7EE8DBFA567DB +0BA6DF2499B5ECE65519504C42B6813E0B906ED94861EFEBD5281DC0531513893F7EBF2B +9F43022A81ACE291CA736570C6E099A8CCB59D8E7568AA5D18FBBA8986905D35E9B52D59 +1E36EC95612B25F371F2743890AA44974F54814A4BDCC23F5DC100B5584B09A746938953 +B5D519A50D3F1FCE6040918E3CA5E3DDCF5506055FF493A8AD4F8A081BC3524D88336AF1 +80888D96699045EE95F984547B4D9844C9B596CDFBAC8ADB0194B7141DAA0385470F2AD9 +F542FD1369E418C5B380CE40E2461D3B68E091021E21DDC50D96C5578D73B9E84227EA05 +8231936F4264834C133C58D71D347100684A1F3F5A5B461D669B92BD7A00745C98906EB3 +15ACF12D2E94B597940D85CA5B69506661133A6B11BC940ADB550FD9B3FC14499677212F +B6166E695839DCEA3F1442E2C9E32E28EFAD1678796946725A1C0C62A1EC5972933A8FA0 +D37AD1D8EFDCA892F53962F57906EDF22B55AAAA17562F2F876C0B5C85197FCD583E2A87 +6C28672FB7ACCB063154A1FFC37A33B104AA37C7417F46EE3D4B59BB4E4DDD58A2EFD829 +71275C35081723630CA67016C8BEB30A7441E0BC9A4973888F0A377D7A3ADDE25981BBB8 +036AA2D9B15B71D54A7BC6C8DF79E7D2D50E97F1DB6E796655F47B5E988653996F1D3885 +60BB63A3C364B5AD590A5DB33524282B3C6A7C228EFBFC222FA475FFF99E83EECDCC09C5 +406985D9B3C00199EE2A620A7F820D1DC40353E0A76B46DA672AE1CFE632FA3523C8B32E +2C0D7344DE9DEB24C7E311E981B216361C401B2C7E135028BA08D3B91D39099DEB9DBB2A +4050AD37B9B823815BC6AA107A3C7B935BF259D9FECE88232061E4796B425B5BAF4C5E8C +4E9190E159743D7F3E4AB2191B8EE8877D8936E5D324FB57E6936F8267C015CE6D04291B +200E1C964660503C96C4A4B782D09F4D3BA952B7EC7AD5B568D27E3A07B26486BC45F394 +128A011F68B0434829C59772C66A001A50FE3C5F2C4683BD81AD8C4B7F7A25127CDE5E2D +EC216243C2398A1551F8C1E37939FF94CEC8A9C1CBAC52BF6371DE25BE148EB39FCD9552 +3065F034E4F96B1C5D61120DC87D04E7DED973471C0A3FA1E1E6BE6E2F01DC0199399B87 +5EB88A3E4AA85EFC9D9F28B3DC52319D374AA64118E1383A8A577538C29859090DB65026 +4A866725524BEB3FBBBEF6AB74FE8F786D1FA8AD94BE90794AC7E72DB71DF74F577F169D +F3B310C2D69D729A2DD755AECBC0E463716BA5DCD4680D4D4F4164420F2B46DBCC60BE6D +A68DA2B2AF32608266241BDA6CF36E132D83D16092DFF4D138BED509909E250DFD9FAE30 +53BE12A825D3A91E404449013E219BC67A2B18E40D497125A2F39BD16824CA7D2A2E5173 +89D69D5D838BA27ABDA5012B426E58456B2399ECB1B4009CFDD6307F6D104647AAD6D083 +A562E7282007B3B2A0B6FB23F2EEBD0E7F643A9BC7075D893335DB246CCBD8A37DC6F1B9 +649AF15271717A769484B5531A1A7D99A43E90490F86C170193442D01EBF02842D349B7A +580D601534F1EA401D27D98455EC4A5800F4BF5893EE080441F6CD28226E4F6AEDDDB7EE +7CE77F2BB54FF006967504CCF02F4875EBA2448C00FF58DA77B50A4F4A007663B5B64B18 +702C96AA0E6F85410580F931BBF249E91AF47477EA284CD42572FEA81C462D7E0CB5F81D +EBB94225776D69B02F04D76B51BAF103B265139F85EBA00F47BACB0A1FAB9D39B648B5CF +06E58CF1CC43A431315953006CED0FF5701401B01CE4F335015EB6E41DE8D14F1B5C5757 +1371E7875B17C44B374184836C07D47F4FA44F8E49959BA63A4647F757B3837BD334D2A0 +423E620AC5E1C5B18C3A400A8CCB7119C3331812AD8863FC3A97B470293F83CFC37E8BDD +D2EEE4C5F88423740C93563603FCEC652CD447869112070497A5141CD7DC66F62EB445F2 +DAFE1378B286E730801959EC5FCED464E1BDB06D725970C08CA0ABB730C12C720E219519 +FEF20F96A1B0FA671565B45FCF41A40D5AFBAA092A09F72ED35FE94A98DCF5649F6AA3EB +FEE7ADE1E19B4429C4E1E76880C398246201CB067D8A734B23BD3118A8F5F7516E5B1452 +72CB0AD9F41ECD8FA61ED0CA87385B2B45B1BBA6CDBD7B9C9890F727BBAF5EA03273E387 +FBFE8D0143D1B215003C9EECFFC9970AD21B0A7E90F56E53B3409E102F89D95B3EC58DF1 +B1C8D48CCF22BEE22EDEDF25CA18A0461D2C582220ED664F198B93B388FD8CA9CAA6D8AC +95F10E458BE5480C767D6606675208E4C823FAD4A3B8E77915BD881C345B0A8C34F01B75 +2566AE58CF3BC97B215EAAA7189AD6BCE0A524C0998235A61713C538CBE9769E2350F670 +4BA790CF77CE5BABE376D5C2B2F9EB8D90B762BC59D9DEA5234ED14A949B002258212E36 +D5A22B4D847EA8C4171D74B78A5E225E3D956FE7F8B95FA133C50F864725C1B8F11C2D1B +3AA7D08C0745209E00B98BBE59E463D60C79122469F9ABB8A7CF777BD90999206C83F8CE +8C95C79993C20CA63CF556C821C8DD3D5124D2F293E5506D9CA515E026223D115DB59D8C +883FD825FA3EBB449524F1BE7811BE76856A063BAF9C09A3930417DB889B4DFC1563F688 +02F4AE1BA0EFE463FE884CFAFC0FECD0F4396B006B9230D9D3BBE6757318184EE7EB6FE7 +00E148C53CF3FB7DC90811F6D5CC8F9FFF975EC7DDA685B76D05C0320E7C3AB3479D00FA +927FB3E9E4363115D05E3D62AC3FD06310DFC6117117AD8BCF44233B05901E32D8A1BE67 +CA059C513BA968CA1EFE077CF8D651540EABC16EA1F61AB1D7F74F41EA52E1BAA0A19576 +5547168636187DE931C6F97C624391A212859C3A95F42DC367AACF13BBDD503FC1350FC2 +FC6259B290A18447FBF37284CE1F00DD81929B13F366C0C4FE86E834DFC7FBF5B4DE4D5A +33D014E3229A7957A112519134F0794825317A8D56EBA39ED15725CD940D974912D4A79D +C499D3B2DFD7FD67DC7E79F70A04D5AAF40FFA6A568AA4FE042FC2AE31E83F60671CAF60 +B8425E4F3959FADE3947B2DD3438C7B08D71A036B2ED959168D507274BC4C04BC9A9448C +0385531153595DF90BCCA1EDD889B3C9F3CE3FE63FC858AE51CACCA7160C3296038EDA20 +38625CE0DD5C236F6F18B3B41FB6D5953F18D5FD4F700A95B08BB10431090C652BFAD23B +D4A9211D0CF59E5C2D0AAC5708386D14F02858C820A191239D08E6121A77A83FE89BF056 +C42A6A56B55EA35DAD6696F64F3B702C21F4D97D87CB80ADF688E6F1094B00714820BA53 +65CD655C9DD5BC030FB2029972D15CA71610085A1A7CA47E290D5554413EB88B70D94881 +1BA89738DBC0C16EB47A3CB6190E191E67004BFBAB73A067501BD283CA816CAB52515721 +4CF005497DC884ED61CD5F5235EDFC207A0E8BE0696E7F93BC267C1CBD85BF4BFBDB755D +BEB88A7D4B978AC52B7D1AB8D828448F848EB6D2F839AE9F4BBF34E1BD5DE77FA93F23A9 +D111529C49A295893296D10F51BCF03327CF774BB1AC501BD8BCA58F3E82BEF79C39F434 +845435E9DADBEFA2AD5D79D8B0ADED3DAC9C1AD9E6A24B206C9DBBECD552B2E6DF97F864 +C8925A37EEF8718CD4D277949D389959D852977FCF96E2C46477CA973846DD65AF478490 +028CEF70A4290B22C4DD7514F1DB34820656EAABD1FCDB7A9BEE0C18E577D9F27CC50777 +D55B4EEA53E8F681F76D4791300A06C380E57B35FA48314BE3C4A70D1B73E743A2B264F7 +3E3C73CB25FD2D33D74064BA8803858C8353C1036E09EE4489433C92F43ACAE005051DF4 +A89628CD3B3EB9A569AE2DC5EB290715FB1028B2E32BA7BC4C48AF1FAFD94412BC7A036D +A31924EE68FEB3ED8DB8340154D5757AB86B7D5D37464D58A22B54E37FA9891FE1A54C01 +D7FA05BCED8CA937BBE67979068B177A777B2B315E6B1F77AB6930DE1372A95A0A1A01FE +C9405011F1F3AA2252EBA22A54C779661AFFD26FDFB10044D8B68277234762FA2ADF8EB6 +B53B75E663976FFBF7D43502184FA7CF047A8CDC2CF0220E542ED63EE9588C41E35496AC +39715683CED932BDAC827F5CCB9BE1D3BDDEE2D2C900AB23E2B54766DA16CC227E58E53F +788F5A8880B5FE8A7355DC73B6B26BF783F02E2CCD5F96794DCECAA0E7A603CAF330FF6B +D8D56153CB4272AACA3DCAA5932B7F754D23BE23B2282F6C2C59B2C1EE4410F342160BCA +093ED020E4EDD16C7E6E03FBDB06D510E6680A471E3B4E2C4319FC138B92A8EE4058A0D1 +8D7FCC51D9F16E9B74EC75CB482903BFD27C4A17654A6AD85D608558C6A717D47005A8DF +B52C28282EEF5B9F7DB1086D19021269438BA974CB8C34A8B85C5542519424FDA394E116 +61636091F18BA443113DB75E9FE5C5B8971E8749D15FAB20B90C10D3682102CCC30CFC3B +67DC2D519C96B9F607B6BAA01FBD8B78236BDCD6EC3536D15BB3A069272C646403BC64F6 +FD55E28988D01DBEEC75547D4D4A975761E5BDBD5E3D7601065C4F9657D3E492DB6A3558 +037943383B261335F01494978F46999DCD5584F7B5DEA427D20F20E29B1D80AEF1E279AB +F27AB8410172E203B3945F98FF87A2FEE2B89293BE2F5DBD88A200130143D79A5F8943A3 +D0895650BD6CC2FC5D5675B30B12B4E095F2475F7D8788EC9AA952FFC8DACB281EAEF931 +34A6F83920FF8E7C58441BE339ACCBBCD4C9BA4C8EB9A5F6A45614F991D9EB0A76B2C869 +944CBE0D6C0CA4C8BAD0B897328A4D354C60A31AD9EBC0F97835BF4CB7976BDB95152A1E +919144C60E884BC6E6857496C77C3C7AD9F52C53A9051238011D41F14687E5B3F666CCE4 +86D16F3CDFB9AEDE1CCB3452A68F5FD75FB96600750457E3C3FA6579BF938439AFC75386 +D1C0A1FE73AD6968DE195544F85CFC697793F1F66DE6CBD8137A918B2C24A99724C978F7 +46BF6AECA401F5D298CD1081970FA904F2E2CBB2D749526C2E14A43970B2B2CD28EE9178 +A58F60F7BE3F87967B4C1BEA2ED73DF6692862CE919E3B406480A69CAB794692D0FD1C6A +65FB1065BCB5AB47306164C0241A6177D8AD8E629C77F84A1AB5CA62B493C5C016AEA0C1 +E45AE05B54646CA6E134B776D09A11FE04953679CFF2777B01370F482CA655CBA8D1F91E +07D0106FE37E83267B5432ABB51D56C88EDC58A11D8D90FB5E82BC023C4521A6649B9388 +5BA6C0D139C3BDB8B0325CBC27AC4E8F673E53D84476E1632DD4A09E94D375B65B0FA682 +18609F5996F543A985FB6CA55D302D63F86F234F94C9A5A15B0333F722702682424DA956 +1E6614FFBF8A9293F5750E06BDBB05D3BF6F56865577FCC010643699D0AAD5633BE88939 +AE6324C36A7A5FD5F148162952C357C4FA5E8DCBAEEDD28D71A809ADFD563AB3C4CB790D +8FC41B81784B3E9C672A2F6A2230E90882EA374A579ED2BF72795E84B089635FC4F2B48C +D51C418BF26AA4939CFF22A0B37182836E70AC08C971EDFB46A31BA11480BB855D53A01F +5A0688B2CDB04B9C2CF22A63ABCDC965993AEE1DBE2BE79DA4D1BB595E24E87267FF1648 +D7F8E531B275C5499FD4202A948E2DD9FBC7CEF688566DBC53B886A2F9843F94CDECFC63 +78E6937D4CB278E11EE9E2957D8BA31145058010C98A752CF568AAD0FF5C4C67988868ED +19762F2F54D6D58A3747A6C5A052543ADAF50DE5AEC5DBFE6A2F78F08A50E5F65C328290 +B383524AD0A1A477A9815C8378DDC0CD7E8CDAF6F097E5DD40900B0DD7A7354A37B9D90E +7C4FFEBFD1DBFBE33B5EBCA7607243A53EA746FFB8CA2D88E73D2696281CB210E6D5A0D8 +46F669F24E3448DAF1DE413B6248564E718D903654ACEBCE09A7CA994306D924535F5792 +21C39D8E386B1573B9B7C26256419D8B52F4980018DCC0001DC87F590C378EC0DCBAB4B1 +8F362A7F64BD16DE2E647A4B0573D92F1300D5D8423A1FC658E708457646CA9585071B72 +E66A2D919AE292B460E816FDC8CCAD369EB90FBAF5BAC731FDE38CE2E45B755934264D8E +4EABBA7D6C0C91B4444BEC23D8FE44230223BD612D845BF57659A9594168655749D147AD +CD4182BA77EC41BA34595990446E1D093CA7264512C12DB9EDCC3A2E97B478DA4A2E7A81 +3CCE2592BB816CCED1196A40E76E4B0BD2EEEA1EA7BF331D497548FEE91A56C7C057C3CA +E25412546FAA9C1B8382F5F01004E506A0DF3BE419B38AA7196EFB6C9B469E49DD63572A +60FC9A5483CFB723FA04BAE4AD526E8C3B14E252750A79C13D07CC1A1A424B33586F7072 +F28D5C61DBE7F0EB9BF47110B4CB018190CF5BD564CE48B9775FEA3DC1FBB03206573E02 +C60969330F0DAC03A4EEF803D7F860C14C50D809EA5D5FB13001048D2CEC6B56C2423CAA +EA0FBBC4FDF550F0EA3D921F522A65CCB0E1F590106F163DE12D1410F35D72E7C6168D64 +829F8144C5B7CC9F902081954923AD742954477ADFDD4D321A593A41806C002B02D9DE03 +38DE6B6401408FB03D282489D23B6CD09A77EC31A7EBE000D54150B03A8610D0DB8BBF8B +9C7E94419C0E522521585F2B7C657CABEEEBA79F2C8FE57C86F593F805945E7DA313B826 +2DC421EFEBA8237EFCF9B054D12CBCD0A3BB32C4A5BAC3E8C105C32860E80FD83F095A20 +AA4497CB6F4A879E5F7AD6C2A8272E937A61BB95402F130A37261569D47A88D4ADB80A1B +1EE5FF03D8890B212E3508C408EF145C570FE2656ECAB9EF52657A04456B580344FD4F87 +2B5D5308DB567B1E957073892D8F83A2C8F93CCFC11D3965EA0B985B5521C997786CE86A +3D9E0A3407EC73E51BCBE2B53D11DD304F0B7469E34A5F6904F5B3807A62534D742DBD4D +3EED49B28F68BBAF5DB1E261ABD0C7739CC09A4779D5D2AB15ED9762FC6E72F78B71DFA3 +23C29D48F47E44A38D87168413E3F589B9470C79EF8A4EB6216F1F0F74FE2853E7EFF2EC +902018A4F6FAF4CFA75B646447DA90B8DD612A65ECD9504C751D331B3762DD369EB0D179 +CBB70EDADDF73E58919C65DE73497A87B4ACF06360FEE10E7593507C6663B0FD0308C95B +F21B9ADE7966A23FA4CD0648051F2CC20ADC25C8F983EC2DC97E2160BCC62CE3051273F6 +3D65913AFAC94E548B6BE0BECE2B704778A24C4348F128A4EF617A7F43AA327193B5BE44 +C2045CB1840DF5FB6CDCBE455EECA489E22F0FF715F4FD6D14A874031C58A8446730D0AE +D36887A4B33DC943FB6A9469AA781FB0E994AAE327A86408D63885662065330B6AC00AEA +FADA28C53CB4255EA1858ECD3869BD7A27EB5C9949530081E5E103DB50CB34534A4C63BB +78E91AC992D1D58F2D08E7706D25CE375CD041F049F762B4B20FA9052DB766881540D4FF +1BD7A4FB927F0A3ECD257938BE91A220D9FA4E00201CC64A1E9816E9D71E95931A5D018F +0AF2877F2737A7749BDF3C90A1694FB81EA9C970629EDEDB5EBF19A60EDA5D7419F3EC1C +A51FF1544B23800B0DDE96AD4E5E660AB20AA419182AC33ECE2A48675FB2D74770AAFDBD +6C300C6360B9B5FF14B7022BE140C05133BD0D848A605491C156D08EA88FD0C4D2334200 +B8437E6088DB32493099469000426A3CDCC627757C9DF0BFA4E9E0CD5D0C8F3E921B1E41 +48CB6D876F445CA4CB9FD7E7FFD4032B2A97EFB025B182A88CA72212186417A5C373B5A4 +3357E58EEAB3FD609C5DFDE96D4BA104C74D69AC17E20058D0B4E875A53F547DEACEBE20 +CF74242301FA39FA6FE6B0C22C5FBEF3DAE3B2727949C20CB8A1CA7A70C7A09E0BF76794 +BD67F51F3D3A1C2005E4DAA6CA87768747DB8A7ED1334F03D3C3EEBD796AF804DB774DBB +403B4B0F6820033CBC99BDDDBCCBBAF0FE7C56959608DA53BF83A56606CD524D3A80D591 +AEEA4658F0E252308551371D192F88F5D8D58D2B898C494FB23463837B8249B5EA5B1DA3 +12A1CCFDF4234C772102A6F0405227A48F6B216BEE7520409C77C77B8F962977F9DEC1FE +098EBC19A77E3B155DF2514D4E8087E0CE8D53B272735F463871AB02BEA13B9E402C2239 +73D2B968E55031BF9A929B6468599889CFC84ACC422439464277D86FC347D3681EF42838 +08CE24709A9A3ADF4621805A61E3AE1252051A00A8DE2ECE5DB8D6D415F2648E7FDF4219 +4F8A063187F64980D3216EA297178A6F87395F40DDF9DEC4D649D74736AEAFBA82E7D0C9 +05D44A8E2F02D356741C23DC37F482F54CE53DE8800BDDBCD170B8F089339C7CAFF13A4E +2D4C4EE33BAF718DAF51BDDA347FD8760F3297CC169112DFAFC9871CE42FF8C29D7A2168 +0C6E23A2FD776240694B44696F69D11454646066BD4B6ED7BF4CF3550BF0F32FCD0ED0BC +CE20286B8CB1645C308B74D0EF5CFF8927E1F2FAB0366BE55CD069AA7676E4592FD42342 +617A186D3C144D173DDF6E01F5E5E5A67A9648144BBD646BD3D76BE1AF70EEFBEF0361A0 +4BEFEB59E94AA5CE2400907C9FADCFC3633ABB62F24B0980093FEB72977CC3E44AEA7007 +B4721D8B35BA81A01C600FDFC070A29337FDD56DCBA7EF9DF7364E0230500F9B8A075625 +7B12FAA98EF15E011D6A6D02C84655D15AE62181FA4D0CE38A6FD6B2DE4F57B0B963095C +95536BD7A53D0FB7C1167F251A9C43DE263D68FAD27C6C10ADFB6D02BD1339CEE7DD6EC2 +FAA687A55AC07E279CCDD84F46A6DEEBBB380B1DE2897DC279C784A9E352683352B059B6 +15990972B53695F73097EE77081F23E15DA3B489A9B088C2D7C76B89948F31D68C3F3FC5 +0243D545C56B62CFBF55E1102D9C761E8A7B0F9A547F9B0935CD78E32AFCE9A451C2F455 +DF2DF4117955D9C9B30619FD8A9EF23827E70FF05B55511185288C06668B65BF67CD8C77 +CE1363B83499E455CDF30270842A22F23D101F7CE773BD709D2E9172B169E25C2AF2B64F +93DABC5C18CF61B30DE7ACF3B7D746EC1B725B90B767D24DB244DC37A42861250A52A287 +F2B7062AC268559A2C231F3A93E510527BDBC3DFC742B457D774C6FC8B023C02E783F2CB +C50C4D37DD81433BAE0A8A9CFA280E7008C47CD75E1A77242B5C1ADCAF70E3C0F870C126 +197091879369A7B31FEB8086E1733E377DF5AD77358D296D3C1CB2EB54B7DB9C8E5AB4E1 +005A775EFA44328FD755D84A064876CAA2E1016DA7DCC961F2101A8FCB699B73A23CB866 +51E728C07CB9EFF654EC83A5DAF21DCF2F777535680C32E4A88AA2D7D65F166B430CFE51 +9F252F51640D7443D75CCD2F5E8494D1210B3F5BEC029002C754BF6B506B5715601F5134 +B6D95060BAC8F6CFA2249FE4B5DA5B098873CCD2C5A6E983F6C62C3C0A9274899858AE7B +5364B4434187B91EFB705FAB6372E3A003D5361138EA6AC70C048E7E05E2F319AA81DE1A +8D1836CD2B049800B991CFEADF399960C02EAFA33CA1D987B161234EF3A67DC53B6FE467 +857D5897446EC2D4C5FE183320F28B74EF3900815A540EB68C325F038A564A23AE235D12 +A475030624FBEAB5A8A536D0011C89AD8557AA5307A5DD4E46AD91FA15B8D6A297DE7717 +0BC90F8C526B6B9496F1D4C83491DD2FDE4CCE06420D943C5104B0C56DC184D8293D9305 +9AD7C5F6251F7AE7C19BD13AC98FCCF587FA9A223082B43F04267535CBAF822F0DF7A642 +7370794C4CE3723238828BC3459A01D8B363A6B9342CB523A13CE1139525AF0C372F8AA9 +98A3E2962BF6728F815D33AA537B8E27ED9174ED4422ECA87BD9E0EFA86566C4314BCFCC +324D5FB4105E9A965CD258FB0A2B970FE0A21F951F3C86EDC5543B067E2CE337CDC04E30 +EE665A3725A4110E845D9025978D445DE6284A55197735A5C018D99CAAFE6597F3D58D37 +68EEAE6F5428AB3B23B5F2F9E8EFF5D6DDF1B4BEDC6D245E63F2E5DC0911E8CA2A9DB100 +CCC4EB9C54BEB0EEBB2E1027BFBD041DD39B27C151EA50EFCDA46F4273F74C85AA88B1A6 +7BA9A98C7C6D7C406D8B3F7892565B8856C77668B86A0BA9BF743C5884FB94CB729403E9 +28EA9C8ADB060911FC0E3DCB9B828FDC489FBC1F15FC2D75807EE98AFF5D841D88303A7E +4CB6DAEC1872D384214EC0E3039478DF79CBB7C12202F9F56F3206FE61B04AECBE1D7757 +0CB8A43D3E145B0ADA7CE219CBC99952BF54D734673632B68AEE6CDA8BA19BF7937100A5 +FA294B86F7439FB59E367CEED44FEA1F4CC2FBA570AC2C32FA6D9F67474BCA9318A84A31 +107CA7AE187454434340DB2F3A0B2B41E552EE49E828C20266B88BD04DBE61AC6FF59A8A +D065A704C18C315CE79A72B061A94558964300564DE5B41B0BA3A0493851A355ACB34BCE +7FA00DCDF05F3BB733C9C79BE3F83D6103171A648F81BB138B4996B606A7A8A997761548 +08F89BCC7C81BB14F916F8AECD873406778E51BB93E56C25DFEC6C3778AAD6B537E6F488 +D29898E17B5D38BE14ED70D79A62B9282DDF229114C0BF9830F2E18A4717C45BF1B29A76 +31B60D13A283C7F92EC4EA3D98D2331270030A14BF9A8E07D87E66BC034F830DEFFBB5D9 +9E95293C70571BBC4B65E1AA13DDC945815FA79746024F5751F8FFE718D97B8AF465BA54 +598EAD21B323C3CE47AF7BCBA58BCCCFFFA0FD2B463C85DE8D02378C86BA7D3F44C54165 +E00E64FDF7228570A6F94C2A1F8CC5D947A470552302D6B3850EF092D6923FFD39E01F7A +B0ACC7B6467877CC301A03136B93A57AC0949D62D3F3E63DFBAF695767877516DFA1CBAC +F68BED7E2AC83C1612F234CB12A368CEE9657C6519908C7B046494842013EF81A4986D38 +58EAAC69D84FF32CC5CCAE2E438DE88A426365EEE0FE9745DB5B7D494C3ADEE8C6C31EAC +CAEEFC174DE952E2D668BD28D621DF9C81BA0355E943BA3ADFF04721B586C659494D5A36 +985AF4AA408939371F448293A0C04CBE72C558E4DE12B36F823445A2267806836D265BC0 +8B279386DF1579512252A9CC6F69D83959FD3F1FC6057DBF5F28C644AD4862ADBF133C2D +5779D96F1EB234FE09E0FFC62EDE6D295F19F52A9A6124197CC250EBF77DECDD5F8B024A +D635E941AC0CB5CA59F6278FE2AE87F7A005A5A9FBDE7609B4DB903112DAB7B612969DF3 +F99F3D34D95467DCBA57E6755BC80C4D18EF9F440A2562DDED104A80D075F8D0C308B10C +E31B777B438DF32A77433152571170DD44AF096981632062E3F525ECB3697F3EDD316E15 +2E502A9B8B351710611DDB75B710D6CA9801ADFB57EEBE007527611D47C181C3BA7BADC3 +1210B9FAEF3608350D905791F025960862B0B06B4BFCCE7FD92EDA6D9B2FE67206ED53AD +E69BE630442EAB6BD2977E3BBFF487CB15A7127B40BFA161D8BA602AE211C8E3FCE684C0 +3E4B7E8148C2F61DD65E1D07355B37E62A6BFC70656B4C32FCDC5926EFE37AED5253F67F +DF9A556956D96848B81A6E11D005984DC36E99F1874803398FA37966B1A37B8282BF9093 +65A1B89C1E1CC37B02254B75C75D77A39F9D1DBFE7B79F70AD0DD6038D824A7DB8DBBD79 +B6A5302D5859D5925B79A210210103791C4212F579EE900CB3FAF002DB06E0ED6D5E74CB +71ED20AD85A257F1244C79A2B6E703DADBFFBFFD414C1EF6C7A7CC4B12F72811C0F0DFEA +A4DBCF715812A3E827C06AF347EE1D72F9FBE9BE3D061DB13CE123C71C8341C2F56762A4 +FD0C1CCCEF591D01E7608B097621C45DBCFA96348DA2F80839F0EB6026AF7C14E73E8506 +FC9C1F68C88CBEE385FC280F18D7817A8606FF3FDD506FABBCC72662B0DF81EE90727ED5 +90306DFE6119A9CBC84172C3D434DDE35039F91591837F903585245D0131DADCB710309C +596B7A8CF8839B2C347C2493234386F988A7066BE6B26F9EC504868915D71E1EB5E9AD4C +F2C5F71E761B50FCEB823CAD364F3E5F3B1D10BA4916D915ED0040A920C9C9ECF344E685 +2B805F4B1FC9062625BA815ABECC0EE80D708D0BD141681233E5A483FB2DE7DF9B13237B +649715BACEAB3F4BF6C6403F8460D190C77E4DAEF62F437361F6B9DA9B4787A68DEC88D4 +556111ACAB7C7BB5F2F1933291DF83425C10895A2B47330B661DDFA456F130D91EEE2A4E +F9AE28D45DCB80DB7322DD6D7E394D475AEE95D0DAC575AE569BF9D26CBA1CFEC9DF25CA +A1A701F60B297064A17CD878E101FD6A6F981905E50CD52A807B466465F0526BD502F249 +B8C4408C130D017E6238B5B5BFBFBA518BBF414E11E2D25926362F4EC5E83E6C26B19C04 +D68C4D6D891B10773EF156166D9CABB85F08A1C130D9D35351CC9E7E739460EAB51F3F8E +A011A2CB3354F759E9EB297219157F02BED05B78BCD8C73E3881C835A7D986A3877815FA +5ADB7713819D931FD05C53FC0C584C45763B6725094485EE3C48E246A1E8968C6DA8979A +2D12CF4A97A8822BA5A066F62333C313694562FBBD8ED26D32E8D09426D0AFE33BFF61CE +23F03ADFE9FFF17EC5063381102289356B1696475310DB04806487792F7EF42CCDB4B8F9 +9DE168D16AA56321F29B09EAEDAA9727CDE7DBBEB62F33EC6FF1E9A74696A7F4B15A2684 +968D5CF34F65E88601368BEA29104246000EF93B64098CBB9F26DB4EA1791C48E245109D +23F39C97F87BE05A31B4AEB6B7A8E49A4648F8A6AA3EB1B80E2A0014CC18A59B43441A81 +D78794CC162D367AC2E22C4985C0EC45B9E29F1D00EFCB898807DF65A3373208127922EE +E16DB24D335DA01050CED1BE9470624CCBBD978063F6C538F90CED1FF48A83E404FE5DD9 +2DC2DEDB2324409E78583E5C7874A9661480386FDC2FD62329D5BB33AE4B5ADE5FCB9BCD +B016857AE69032C019ACC0D16E07C92B252C2AD5E2AB2BC9A1BC074EB697D7842AC5F61F +6832A8942C6BB35E3802123DDF726304D74F10FE22E386C2AEEE158BEC56DBDD264A2321 +1A3D0B53183DB2F74A306D00758DF51ECAE68DD8944FAC719EF56190017CE10DA46066D8 +AA27F9D6B8BE4911E2FE16D77303A58EA4C184BA139F7D39C4B1BE8C72B8104D1FF671BB +DFB1C1F8E518CAD156D4ABB057B622287CEAEEB574F2C202462FE2575EA7D8CD820FB4C4 +B87F022D732D07DD009845BA831A6E2A248D5ADF9C179276905A494DD35E4F7E581141BF +AC76849B0F38B5A726049BFC2196C38B6EF6F7A0D38730CF3CF850A689553B7595070858 +97211A03A40B37BFB57363CCA5CDFB04E01759813DF0B67A693FADFD5692DBCBC543DC30 +65192915E654112AF3676DC58854D602C427315FDB2E0624D826BB60B5EBFB4CB190299F +930D0385629EAF0C0EB37F4C01C5C770BF1F0F825A2A4B6FE50D2DB566D5B7A819FAD0A0 +0E4A7E8686E9FA936C0315622C95735E251FAB0407814B0F2F848860B942A413C7F43239 +C413EFFB4B01C1CF1BB9AD882DF6A3B64B5B7C7F0EB4E707DC5012133AB2493E7C3A88DB +5D0A51394FC7D6E66ED529D16686537DE3FB1EA7116363C4F5945B344FDF031FDDECDACF +34F2458908AE0F62E2D200A9B147C1FBC1877FB41DF6979AFA02071312BEE01A786E5EE1 +FF1B4462913540CDB34B783D104BE4071888AAB52177898F5537712D8DA1B09BAA0F094E +8174BD25333D3043CEC70925961865785A6F81359B7A580D60134A293C8DF73F9896BD62 +809715A8C846915E7E636CEFD18125CDFF15E380A8901B0BD2B7CDFB80916D4839849795 +A7231BDBBFB9858A7834BAC1FF8B8365D9602985E8D8EDF33D04AF77E24525460278EF7F +03AFD42AEC3F4201F8C56C2F4885F0CE693EA5BF4F62A8CD61F3A7827A1C40FA52228ABC +8D19EE1089AB3E80336EF6070B9EB31781EB9C6F6E3BF3BAB61443BFB63C08BBADE7E842 +67C6A44128F33D7843DEBBA3BA7E723E91922C437D24A329E72547DE8ADE2C9676C2A078 +A12CAAEAE690A31FA18076FA77BCFD1EFB5762ACE44FDB97FB5219DCF9F542F87A959EA2 +F118162323B46DA8A0C116269D8301850EA28761CC0E5ED06ED48968EBBBACB891CE73FA +52B7C262C73DAE25843C00923D04893302DC2EA0EEC7A2CBBFD949A3B4135F5AEF66411D +CDE7856F7FDAA0E630C3BBD42305182E3475589B41461360EE1B72298D97825C499D9F49 +653AD3EACEDB5F9790BECB554A643AF9F1CD3455DD51E79FB0A6221C4FAF81BD822A1BE1 +AB8F8B18E4141787961546744132ECC7F19EB3E81863CB6B3FAB60D3963D6E6F106A2558 +589B07BA69CD18152F8A8B884BB24FF318A071CDC695F6D8DFF7D04E16F0AFE7BF2F03CE +F6977E0CA4B46C24E22FA22C0B9DA11EDE76B5B511B1DDB6CDE7C314EC86E2B79E1C4FE5 +357797A5EA3373FB14A212440F6CB0821AF449122D94828CC38E44AD6C7C7FA78B932192 +55ACF779D9634B75999314B31F79003E030054010133046C6CA9AF0FF33AEB9E7C63553F +F34203EEBF0E3F104453C1430A3642E79A4F5D708551C4751C9F4DF3862FA15814A10567 +69516410AA29695690A5DF3E7B407A2E5F05C8DB7AFA0132D5F43177388FCDB17B325990 +1AA479F19C138122AA2EC5674A7D41D85233345FAC3ECBEDE642BE5669128E17DDA2D86E +34088BB76C64685FF98F01D48175847E0F49E2404E9C5E9F9073F3796DC575468B53F9F7 +39F93EA3FDF18DAC9489FFBB9B18F150CED84E6A4241580023C622129B1A91A8079CA92B +1A8B26B955986833D3144BB4EA25866AD4B499247D44EF273ACB2F1637F195AE7E89541F +C6B70C8064F12B696A0C9BB09DED5F41E19914918F7F4834428A01350DDAFF763611C173 +12EB28618542E8EBF479BBF5B120E02ECCF7D3F9638979F0602194DC2512C682FC947B4C +CD5BE48F0CD4BAF3710BB42195ADC7DA9EAEC09E124D49E7CBAF579616DFAB94961998E1 +4EFD0128982A15580D1A2ACAFC740EAD92FAC43E7FEFB551EB9322A8EA302B573A6C4B90 +87041EEE1D7B60CF1E50A88F59EB46F1DE9F9760F21B8EB325E90B536AD68829FB965237 +5097A06AAC312372A7D3EA7134A53C253505997B4FB2BC25EC2ABC8BAFAEE96BEB6EE940 +A76AEDF4F00EDAE82434B3D5C8B854BFF71EC073A0DE2D98FDA384E4DDB1D84704BAB88E +DF057C84DE21A1F7C4FA509F1E22C7B8FF788DA95A7215DEE81784B7F47643CB85D08DAF +425E251EB72FE482CAB41D49389B323E66D27863D719D78C676EC91981B0E516C21942E4 +66804EED7E214B4EED83A1831D925019709A3EB1B2CE62491339DEA3A3890107CC5C486E +F7A861D7B023B2835A87F62008BCB96748B6037BE07D54A22AA4206C85BF24208016BFDF +EC4E68D8CA14CCFEC2CE496819159C153610C4521D312B8538FD3AEEC5FEB1021FE9595F +767ABEE99B952F0AF794FC4D7FB0BA7B8CD73B543ADF833989ECA557EF2FE9E80C786180 +FE2B6249F45440E94C98C00ED7B95EF5AED26A9058826EEFE0377F4CF786450929E290E1 +D89E70679A7BA87CB29FCBE1A79F24A2713D182F1BF990340FD0E00012A25801BC643A9D +DA70E046D123E7E64B884B0F8024639E055D6F7FAE5CC5108B68125C02EE9EC0C41368E5 +6F869A55ED15563BADF2F88086EAD3E67E8714AC03D2A12B7E99C2947D6422E5F11B74EA +2CC153B8409A2A03C0AE3AE784AB05475F3D086EBC28089DDCF12C8D4324A8659EDB40DD +5AE08B2752D196ADBD0E540590A414A6BC6931CD78CF0D78B23080B4D5C5D86B9E4E0EC5 +3D774845DF7C74D07F242655018AAA23E64165DD462F5D2A282B5165096732D55A3946BC +C00AEFA41085AB8F2B6BD34C065DA2C9C2999903FBF17E9E7E39E874981E9A850504F7D2 +A1B69C85F532C6749BC675FC181CA05F486858C0F22BFEC83F14D4754C3C42F0AE0ADB56 +9A48214A9DBB6D163E528E4DE29157A8E7089EFF2E2AA6AC85AAAE8925CA4A019DC38668 +418C964DDD2EE6F2B92BA48E10789DEC415FA94C81CB95093F71BA384081A7A01D3C2DBB +A934E37E27B4232C8A3802CAB57BE8BC899635B620F54FA5639EA9BFAA5294E57856664B +B3B3DFBE40DFA0E09A14ED2DBE9C47CB032A86D9482D29959E21FE32CEBAB87FBEA9D283 +7044E2161D62CCCF0A3E3195F874F78AE00DAC349EFCBA46A8419CE0A7788B1A2527DE7F +1908F9C67D4C59DFA016D21F61D3F29AA54763F81F2837C5D4DB2807F3E47EDF257588E8 +64FEDBD51B1C169035F1B64D80EE209C5A2315B961D33E4957E11A2225F0E8CA0BCC1E18 +9428EF1FC4BBFF887EDF1375E2768129D8558658D78D876F455FF4F0C65F35004AFBDEC0 +F99C007905DB17D92A64B5D1A390233820D41BEA0F2B732B12BAA6777E96A94F23CCFB02 +2AB8BF09CF9EE6960FFA056EBDB46B04B8F187D05CEB9CF0BA0F796BB494D5F511010E0E +14BE33E45C807F4FD23AB76B0F0E3969010DB86834D787B8E0F92689807033BEF513DED8 +EB3EADA76AEEAADBB191518A950F227A0ACBEDEB778F43FCB3A281F7B7C35F58BB1B3814 +49E40140D8059E950413B9CD3F93240629B030023DD6233C59ECA2035392E64869AF7FD9 +4116ED71B821F0AEE5A68CD691653C2D6DAAB8AFE466D5D7F1BC3ADD65C0AF0EAAAA1486 +DEF5F16684DFD78B7A41F7816CE8A787019D9ABD2F4E4253C9229A2DF73C22DF22B93A8E +4FFC4769448A3E00CF85A939424EC3856CBA520420BB7001372D2F703C5B36CCCFCC5BC0 +1619D9DC961BDB0D9A2FB18759149632141348364E794B15E7BC79420F0711382127B262 +292FBB7F4D0B37A7627E8EC5F5FC374B98B18FF02DB2F442D8DB5ED06F90C3BBB17D05A0 +5D7D11A6A7C2E62F15E7644ADDA44F1A3CC71B61645C7497C242DED8199E31DB0A247C08 +1739BBE040E7CC7299BF09DC0CE4CC6C59BA7D1867CD3CF518ED80959FD8B26748EBFE0F +DF816836E57738FEE205BE2941BF7F155FFF82EB877B7DEE42BAAF4BF2E2057453611C33 +B2FC235D7141ACBCF65F068F2A90A86B8D19B6A0D7223024B42CD6D71C04EE865279A1D1 +6A401D2393058EB9A16020EC8E69943F631333D3C08C9892F8FA620CACC3D1A4F411FB78 +A6CC30F441BE858EB8ED7A92164C59FAE8C5C6F275C2025FC60E326FC2F7CD6EC4612DC7 +1D58EC6E363D90BFD5A93F552F7C3A6DE059A13C14CA2C15D35E1E5E10775ADC9D925185 +1ECE6C1AD5BF430846F62165FB21A393838DC98C2501D598E83EE90B31378D4D92CFE8C9 +869538BA6614A71D3F29E455DDEF8321C2AD78CC2C0A832B3D0F1C09E3B5FA99B121C283 +0200791629A4094DE00EB9AEC55670263DEF10783A699D69BF861FEA783A51937E1BB83B +D96026CD631C7CC3C7EF3BB698700B307079EF2F28F52FC05FE409E020B5E044D1766C37 +55064E5B49FA1FCC37E6D8341525F9DC92B35455711091F1229AA39B397E9ED05EEE7797 +B9A9EFB8FC162EABECFD465756E8B747A3041355178430CB089E1CA3783DE19454F97E0B +3B24813D695BA962CE2046C8F2778B0A7808D046AC0713E1A6DAD26033D153421A24E667 +AA649DA942425C45875437F703E68F68AC5F5AF9B4E087FF4AB87DA00D174E090D834BB0 +14B00764C1CAA2AD4FA2B457858F2784BCA840C7A8BC929505056E3BF3FF533D94C9CE14 +76DA773403FC3F80E1A2335699A55079B6993B0FB187499392167930A874EB1954E6DA45 +C9591EEDC1E8247F237C8657B6FAD992B9426D584E116EBAD9B9F2214A8E850F541A208C +A8792F3980B4CF5E75970884DD7583FE277F82ADC1FF35E5F3FB216AB68C353B25F34C0C +F2C4A60B1E51EE88F7BA84FB1C23601FA2270049E573C05218BEEFD56DF0A648665DB6B7 +81C3B0B503202DC005B8F2F00430288086BC3B4D0625BA2966630F71DC0483FC43DC4AD4 +AFBEFCE65FB61CE89F07FF29B9A9007700503043B24CD9DD8BF9E4714CA99B9504BD7FBF +DAF7ADBAD4168CBEDD5EC802F2DFE773585C5162E564CF1C39BD04CDAA50C2032956EE47 +948EE6628F9EC006711877235813960C9926CBF2372B9329C3CCE4F4190FACCF33B25BE9 +BB4DDEB7E91E8D8ED843DF6F0352E51AE0670C4E0A91E78664D5F88F77F6B9EFFD25071A +F9BF35C2D572275E5FBC2461277DCB0DCE505C6DCDF913CE7A99DA563AC06E1C4B07D7BB +0A24BA8CDFEDD3C16107DA2195FF9677EB104C08C085D6364BCB745BDE0D313D93E318CD +F7929B299185C098642464F491E64EF9A2DC1DBC34153495AD62F886309CC6B6571D6177 +91D94AD5A337912569067DFA1311EA41D5455C24D3B60ED3E698E10978C10FFB9A7C2137 +92A6FC31939290392D8ACD3253593287DFFC13CC9D80870AF32A2B82AD21C49560FABC56 +48FE43EE74D71F0E6D8008100FDC812029C4F1FA3ABE01A4EE9D99A2FA574F93BBC6F17C +7301329B2363DF36FA029621D478A795F9D564EE356CEF0A1E60ED1DBF5FA08590D677D0 +9A1FFF7CF8D657D3D1CF2915BD56B44BCF420FF4A523162CA1791A56287BE773D74F7246 +F52C0D1E22AEA987241202665D0F5EA6391ABF31F16A5BE4353FFAAC2408A0680A33752C +D527145AE349CD781E339C8A9D87E5C0B1312F5B3C150FAFB4588ACC7D6357A5A3B4510A +556A7FAD44643F04BC6D42A23E83640091DC70FBE51B57A7E0EF1E2D6112624AA21136AA +A1B1C6DBC1D1515491F0EE3F9C4338B58E3D0603E1C12A0588118F9261139CE44B5183C2 +AEC863C7D7CAC0DD272FC5142FDD80FC668A6CE709CD7F297DEA655A767CB8A088474BDF +5EC4263121C7B3F154D8396B2470FF226A397257FE5D24EFBD3AE08CEB5CFE9194DC4C6C +147F24D3B36830FAB0AAF03DA1442C1E5E77951538CC9A022370A8C3E39273E4B8E3FB8D +28EE116FEB770A6F223CFFD7925C64CEDB8A7D66212CB443B2A0207EDF102672ADDF2084 +5C2D36FF281B33BD3408CF628D7637F1E92A5D2168DBB183BDF98D99E5A68D9995AE6123 +3675A1AE7BDBD80642E27D6271437F24D28884C90351E819D9785E556334E20EEAFCCDE9 +2929DF0BAC01FF12B56C2B4EED3E554F3ABC0096BC7E5D9409C923E9ABE6032B20784815 +DE1C1663D6EC86D7476A0E9698CD3B201F5F9CBFFBE604C4C2E823045473B0381B1968ED +20DC0D0EC89487B4FFF6F3F83A3D68EE78868FE5262235C3609C6756BE484D87923175F4 +80A084A25B5776FF76742A70F7A60D8B76C3E13409A38A258E3E334F66FEE4567A68BF1C +8CEC4A80CFA0361BF63B7A0D5A0819C85E1A9EC223C0569857D730688E6D177E4BEB8E31 +F873625E39573842035C5C6D66D923654A8FAD9421E1026987A9C825505DB5382184EFD3 +6C84BDA96B464796D72571760CADB46199643060A0552D8DF95A9E6C30787CBD2F57B0FA +D1FA43FBB1E488FBDAE8273BA4F191398652EC86743D32FD5708673AD1D39F62425934FC +AC949F047C873CB94E4A3CCE44A458EAF26953DE54F645CA7B35553204A0F5C7A32E92E5 +27785DE73A3E2A3A3FCB54EA4E395E73C5C89F64B77EE218F935AA4C42106A33C78D03A6 +90813236AEE3E50C2C44323B83401444174174DE4895D090CDB64274B70F557204C772E2 +D1C47C79C1EC238D5B345F7D9CBF27C6B98C5163E6D1D93F23F311DFD594658B903480F9 +A475D3A3D9BF909D042CD76AF8D574D71BA12EB33259C745D3FF5403E579F794EC95CA20 +9959A9CDF439138715101F9FFB3E867A2FEFC41EEE21AC816B7E48F340634714E98CFB91 +E97CDEC4C25CFF567676460102255E8BF37C8B4BFA821EF0165779094CC8ADEBE5778333 +9B9F4DC83DE0360DC52628543D41E0FC9EF2EA434DB9520C2CF5E74863D9BA197F8E7A97 +912643D24CD024E6468A188E0D1E903C48B9A996ECF5D9B64A64E026046E90F5C92CE2F1 +260BC6D4F298DA5A10B3620C4BEBB5C721B830ECC1DC8CDB86AAD6C20C9EB56DE6520D0E +29B6C3EB14A93D43B951CC2C690B277B426B84E4BBB4E1719278150A03C450A9FB44F6E9 +16DFC8986441969A50F06A4483EA651839C31E89A9E4644E96094DE5320CE79DA5499528 +AFDF9C150A4CB53A4EF9BAB6989BA5D0703A4F2F5D4CBC95719C0518DED3474F875DE58A +3A2C369EDF2BD851E5F2E0BCCD47A0452C8751E45DE47CC2C340EF4AB6F4F885B0C2C21C +8E8B252249C5B45EFA5B3E8A27CB39556A262F03A04639280ED71F8D01E12E4FF9D37C3D +3DF6164A4C300E495CEF60F368C4F5277FDC5B27E369483237780072A6709BB6B1E32F33 +53AEDF5A0B1A30EEEFFAEC01A0E9630E5A50BABC081DCF71997F181CC310023AED5BA74E +769DA4D3FA84951BA80EA57C39C805F1C4B42C7673403CDE1573E1641B76F1AE22E57954 +48B4C46AB50E3EA8B82FA89C9BEF737337168E18498C3653AC2BA51C757A15A8BE8B1675 +FCB325B5130E13C36A66E3056C8A0157DB84F7D6636EB06B83FE198579DF5135C77839D9 +548214B53BD51BFC1EBB8CF2E4B1ED77EAF56E953221F95D30D6F16DCF13A57664DB4DB2 +B45DBB6410A9963DEE6496DCADA35B5AEED478EC9297FCB64555373F4ABE73D92B97CDFC +0D83E4D2E80C6433533451BA99E9B2777492AB98DCB69C2AB9737E5A075FA29CB29307BD +315A4A67E7A5519B55CD6DC3E241AA0A067B0FFD337D72FB0B5B290982EE91CAC2504A02 +71315319A641ED197E14017EBCFF2B124E1D449C5A692BBD0E7486686DBEE2F15552583A +A52385CC9064ECC3873A1530112161BDE2008B484BB616459466E66985829F8415D83DB3 +4736B604DEB0E730A3ABA6D04ADE6666E303C40BA9B35FA5C753743239361A8AD23B80CD +AEEC9B8BF6CFE55D9EFAABE474D9BE5F06255EB903315DCD4E2D3469D08AE17F2813D7ED +F8B3B5D004347932D9B38955E27B786CCF0724784E0D545588B51460D9C2572C6E4C4B4F +9A01217FB8F2FBD0757BDC1882292CA04C24E7828D9A6F64B151A4EF2507C3D3EEB98F76 +77D041A5DCBED1BDB61B43034F4F6F5807953BE78631376E6D3AC14411587526E7DD2E68 +9D6241942A0C990123F2FB111F926A68B809DC5CA2CDED30262E71CFA275767F76D5514D +9B7A435A07670F011DDDDD31D8B944151A6A47C6EAF3AE44881252A078F261814A06492F +628BC815F32E0B889863A15409164250C9ECBFAE7A749AACEA6AAA3FBF9BBF40722DAE91 +167BFB833791D3426DF713F829F60F3F9638E1559B82C3704E048AC9879E4AF5C70C9641 +BBA5C04816B4EA6CDA7BE2DC728364587A5E7FFEB8DA7BDBFCB842FCEAF179244EC8B247 +7AB7337897FC0946AE494BC487510CA123CBFAB3B7EDCEE9DA82C37D55AAB651B887E6F0 +5A71F2331B1FF033A1D553186C786C224B1CA80D6693F4F6A948E338BE6CC540E86FEFED +280166B01B5B8F9B278A91E1BC632C3B06A4BC08530D8F1C89A6928E91B8E7C393C9AE2F +91F826E8AA3E11C72CBB0A552EA0261D5912A191127D351B12371E985C6DB66834869EBD +746F758FB0140C248852AECB41CC4972B6CEA24800F2528CFA99E667FD10EE57CF671099 +527AA11667321AE9277E4293811190986CEEFE93FB7C4A1F1A5884BD786B13F8B73A1A46 +19257501BEBE4E2A6BC3DF7BE7451D9364F00EF318111A8E4FC065022AF0EC88040267E7 +BA268C6FEFBA8AFB91120EFE066B8B23E40A0A0F209D3097881CC2B7141BDAF8FF7C5964 +4C029DDA226401B9B98C6A53AF6A93B39F6E3673A3054EEA3CF8CAFADAE0805018CFA969 +7E879B9C31521B340B288FC8910E5B6E061A027A4C69DA1BF038999D693108AFB70D0DBA +A90F3B2C073FE4251064E1FC887AD3708256487DA8EEE60795CF11DEAABF0CCD9CE8E372 +AD4CC8C8DC413B9D2019440173F6F83CC66ECA28C8029C1AB834DF7BF2AF0E0D86C66BA2 +6EF90A1761FBADC03C1FE598D954339A2970A5C9EC56236D9183E6155A511A272D005087 +14F8749B03A5A2B9DE2886B539F1A377FAB65ED3437D55988512B1B1C638015B0ECE68C5 +3AEC61020E34BD8E6AD7659399F0E1D8D23F5EE282BC764249B664D75FAFE67CB5A9DA4F +2094ECB30CB6B68D52AA665BBA751B446118C74148DF979A0FF173364D79202606AC2756 +8D41821B1E4D4175411CD766FCA1C25093E6CE9A37C2048755DB82D7448526B59766288C +9225108E8E86261B57C521991CDC273C0BD25EF4434670C80AF8DB7300F26A9701537DD3 +8FAD0BB2E9EB8F0FC9F2C8629BA97AA1980C39E9BE5740501BD4D57D71235C84C3EF6B4D +CA3D1EFCDF79B8D4EB7C29EC5AB15EC38B2104745E45235A1F37F19E921CB2213F1A91C1 +C392817E7D3AD3A6ED1EC8EE290CF5B1CFA2BF21DF8B9069F4496B7E80E7E96673B77EF3 +AD7B2FD6653510AB77BBF1AC8A07DDE48A8C2AD11EAF2CA95540A164C1B0834106FCED12 +E179477B185DF43148633CE3AF60539493D0C88173C0E63CB5A44790FE41C211966EE03D +424F492C2C87C04F0C28CAFEBEBEA7D11AC959E0C8A88776B4372E356C913943BFC88983 +1C8F95A399DFD02779301D05205EBB921C1F52AA522746CA533AC829EBF7235FBCB0AD82 +69A64B2C68748ED4843FB583151429A1E9537CB40960FFE9C9340CC11BEE00EC7005641E +964F4B0183C49262F3202EB6525EEC66CB68B27185B7DBE343FBFE8BBB34393DA1FBE929 +50702ABD341F45EEAF0EE66C848EAC04CFC854FC058A9418834B4F18E6D861AB31DC1C42 +DFA8D939921067BFF8815B708537A120CDB13E775802C57A0D0CCBC6ECD4CA0DDAD91F01 +97DDD9118990BD71A1CB241B88DDE7EA4F13236CBCD7CA64FC858CBF1E5A38C98C19E3AE +AC0B7B256BA7E15F0E49C84A437DF190A81D0E179B2AFD03A427F2F9AD83DD2A4EA893B5 +BCDA0F09C419FF0D0EE4A811886E2784800865CC8177D4E80FA005C014AD9B124D3D060B +526237FCAF98F23D1F7195F72CDE4E72B87FC4A872FA95441483FEC58EDE0C8B97909B95 +D5FF189C0D49053B187E0A1A8AB85DBB6D765EC78742E334378EDAD7F2FA77E9CED5F652 +295145D463126659E0F6BA982BDC32363FCEC79AAD13248135E6A28222BE0127D807306D +C94C817B649AC020B8B3DDB18CC5B05B83014A10DB5FB9AE6BE4A078FF056EF661B2F4BD +B422CD7E80AE9B6835330AFF67FF1024136EF097F4DD5344D37FD7562802B2A1713431D6 +FC1EFFEB21A02267D7F6B2552C97FBCD4BDE4214DB01C1376F07928CABFB1106B02FD2BA +BDC8C71D0278DCB64375613479FBD3D7D893D279A3FBE92BC92BD99B6FEF817344AC2DD6 +EEF172D3BB609E961180734E1B4C4F4B2D704BA4D1D3103BA4F62DAAD46DF7136070EB14 +549FE8C727CAF060D877D22E21F474F9627507EB1FE2A28534789407DB20FD6D6D9F5CB0 +7CCD392440EDA0E18E1A5EAA7B2C8BEB249A627EEA58DCA375DAE4EA816AEE7BE8BD92AC +AE63C97BA1DF13081EE64198B83926153C8AD6F1C86FA73986BFAA5F0EF5091A4B591BB3 +32ED4334E6D67A0288D390261E88FA39574FEB6F7B19B808DC87426BF13BFE2F76ED7103 +87A5283D27CEF752B20D831D8494A2E35DE7F68856AFB67B6EDC883C45840C6E83F1E9D9 +4E4351D50BB9A03B0F0B0527CCEED0081C96A029EF47F68A1BFB0A5DC673A0C8254216CB +D84693230437E107267B9244E2287BC6CBCDF73B24DB5B947D5738568471FA1FFAC537B2 +BF13C99D56230D49E12AAFDF51B03265A9A14529147FDE45C234282644C9BAD0C6892861 +029C9F27E4AE13F8278E135E89E81A7E552B11DCAD49507502B47B1580A6222672EE9C3D +A05B74A4719A849179B6C93BECD1F18FDC9CDB1EA52ADF96D29409B9B9DD63861A2C74F5 +1A99843FD141AC60A49FA6A134FF4C4328AA9D95BCE4B89B4BE4CFDC1DF3603DDB0D7DCD +E1A3FEC7059299A216BF88469B5C9B16C20680B14D414902E8A7D80E5429AA24D94EFDCF +500C1F1ED0F3853E2715598355B9440AFB9A8D06F6C038EBE0574B24E3A168E93833F462 +B24FA106DD40C967878248B2E1D58CB8E4646DE1F2B5BCF7FC02B4BC7DF7593737F583AF +03264E5C35FBF1227DEF2C4F6889C2F77C3B84638CB682645D0F2E99E0C4EF9ACEBB11CF +0F658F7D3163C488C6E642B5B03C1E40F69BC2293497374FB157F42111ED5B96E04040D1 +8C0020820B37A22DA38F4E21A64FFC24131CCA0F575529157E9A59EC6546004241A8F51E +9E85066AB22B72FA003CC868F965DFC34A2A0055FF86443CD3ABD3EDC30E9196C20629B2 +AF3A1A0C42C88C20449F889A39BDE45EEA0551AA0BF0E9641D7D1FE0F3C286C7EE34800C +20A72C954EEE657FB36E10ACDC18D165C8DEFEC48D154FBA121CF1066508A075A669612D +26B9309F2CD33B2109AE9E6B1EBD4391F7B66F625367766F8CF0B8BC2D201124CFD9920C +B61F71C4781B459ED271EED5937FBA4359FE1DDA7F3907ADD7C15ED021E7735985E6AA8E +F21011A13E5CED0B69877C636D293BB99AE7B9457E8C4B84C4EC695C5944622B5F47DEB5 +1F3D653C7ED73B53D16B504E761B8C105CBA84E45B408B415045310CFE8D693AAC924ED6 +C61A12C7B0CED04E630D8A04F8838F286E646960120FE35D0D13F9E273DB647A999F1580 +C1448CDA80B9489BB8E5E4507A7A5B5329A2E962EED597E4B7C4E6C72740EEB351A3364D +0B0689BC2658395E2B69A8FF0600EC50868404BAF6792A59983C6E372DDBEEA9953870AD +319849F018362B016EC38C0B7F947402449352CCCDE055068417434416F0475EC82A5441 +987A472F59AD152C56FE81F1501E88D0BA843083736F783C366CB18C8A787FCB60E6F8C4 +3B56BD458D9A42FBFFBE128C928DB06C7BF8F2C0FE209B25DBE0F28C1CBC8328C8E868E1 +F1DA76549F34B6FEC13E1400B2F9A66E00D89CAA99B2DDD6A0BFC73C09C7D774CC05629A +E23AF62DD1E58D3843EAE55452281A0DC2B31CFCE75A7FEAAB90041602CA5293EA58F8ED +C18635ED0234B9799A12388C2AA469FEE8CFE1B112F7BE610990CD51BB13D955CD02D571 +323F565D7BC240FE71E3A3A1B92BB9A1C7EC2EC6406F06AE7C0D14262319D389A7CD8D34 +D41313DE9B2336963A5EC892A8051BEEBED24ADCB1F0BBDE77C4E3AED1D777C0EF2F1AAB +DEE62B1967964C98CA08561EA234879DFB0F50BA067E1462CB63544786D56935ADCE3E7B +399B1B3D0098DC19E4EFC04922CCC28609390A7B163D66853C2C8FF94591CD1DF499DB82 +F0F6FB7FB6D3571735528F544C16786CFCC7FA10D28FFBDB6C455AF2A6E1F6BECC080B6B +EFAEA5D51607A260620EDD1DC6E8AAB588BFCAD39A98E028BD26DBCCB149D818E0B91BF0 +8AFB55C618FDEDC15ED7055521BC90689E61965FBF22172F584827852B6DCD8FD466953F +D16A806E20C5C96064F28BAC94F3A7818B18EAAD9BBDFA0FC302E663B989D97A76E925C1 +CD1307E43C97F88DD731AC971B862E99633A531788BDAA4847A1FD124660B00000007168 +72191B3F124402B990F3C379862AE823A3646762EF68A69D3AA91C56F50B10807C915447 +38AB8EB6C01618880F72A6C2DA6764158320CFBEFC9F23A0C1DB0AED395C70B28C4D47F9 +7C5018499E45AE5407C03CDFA41D02E18F7AE56346D872B03CD5FBDE0D0DBF11C1FD313D +E0A7856974BCBE0EB331CE51D190BFDE4C08BE9CFF6F2A32072454EBF4DDDD1E3B9CDE7F +9ED3B2C1C5C60A12813DD88D75CFA6A9CC4583764D40C7001764B69A739EC079E7ACA5C4 +1DDAD7D15C8807719EDCB3054D9DE3DA92912F019B50B62C8C4AE9488CD7D683565B2031 +DBE9E7573595ABA60602B6023C1D4DC8370A529873DFF92DE908CFBFAEE97B0273CE36AE +6C931F5282CD2341DAC0D6DC59A693FF4AE740E77322F8073471F6CB3CA99E7A530F5E82 +7E4C5185E015655F784855E4989F27CFB02AEFD20C3D0E9E4C1346ED248A6EBEE2BCEB80 +1B912CE4AE5475DCD5D0516397CC74589AD3D52E70A9DC423CAB42BE428CC2DFA56E2C9B +DB4F083F8A7B3B2B9063EAB3FC255A489707792141F87A2FCE77B89AF7099DAAE3EBBE9B +3655691A5538305B664C75DF2DCFCD53C87C38D9EDF8F7DF8A808851ED31E8348C77CA4F +3AEC6C2BE721FA3CE9D54B72B414A0992AC3A9DEFCF40579F59B0E30EE3A9B599772936D +5E5B921D5693FD702A30BDECC82AE6CC10132C2B6C697326CDB3201D35C4396887B5CD1F +1909A0C3A19BA71AAE02E8639B6AD1426866196F0F9F0DEAAF8BDC53720674296BD41161 +DAA21FA4534BA100FA41161734E310C6E88B8BACC050174028F4DF483785184B30AD1BD0 +2EEE2F93A187C5F48EB3ADB9D63AA4D52D76AB07B93CDA7F12F3C7D9E58DB297D2048375 +5E5C6D1B8F9C5C07A142E0A68177BD7AB073CFB934EF14D9616B15BA2B38AB4FA4B5877D +04F5308D74D642B46352FD84B4FFF058C282D308AD2AA99270964618A04C0E522AB7A4EA +123FEC9A47F13060E534C0C58C327B063D59CF96413E176031FB21F3AF9E3BF1BA6521EB +C71336E468A8FFD6AC2EEAED7ED016D2775AD2A7432534704B399BAD93E0A1FD5C8E6FDF +E8DE157ED4FBFA62C5F0D12DFE4C519713A76D6B2D35FFAC7C0B90ABAA8BEC8D2221FA39 +5685428736398AB87F9B73F7094E02A5019A360FB5E0A2857AB2439999377C9D4B1529B8 +D8DC1EE0B68D1A5AE1BE39949A8D53F9274D51650124E4BC873C07FF0786CA64EAE168E3 +B8E0210945249FA48059080232CBCB56A910E40D14A479F193BFBBD701384407A2DC56C9 +BEE9A4F3F011F02D0AE09C3F6EE0808336C70C6BD82525858EECB6521238C717469BE58B +6865E2E9867FC248A82B44142F5E825665F6780B03015A6CD2B1592F36B7F1C03D58DCE1 +9588FC260148D0DE42196BD052136CA1BD82BBC0AAAC6ADE4500B9F374DCE51779697BFE +670245D126066964B61D59864EB636C43D6ABA70429614DB400CAC2ED06D85D3E7C3D9DB +B5E2E7EAD6031B9798EDF30772FB9CA88F52D2A56C1CBA8F95202DA92870CA6EAD0358F2 +183C791783746255B2E87EA261A1D9C4B7B9B4174D412BDC01F4AC19DA76C423992291A0 +B0B85C1F62AAC83B253D8C251DDC43D921AE994E7122F7A49EDC473B0D9B71D8801A0D43 +B589E6C1395255D3515A637670589D6BF4CB75870D2BFF2491B7DF7EF95F04C0531C3C00 +6BA3CBFE26F52EB9D041DB138FEF272218451237E60685E66390659CB98F178E3BEB8834 +6B1E49C6D9EEE0677281D460E3AA55250A0D8D37DF9DDDE21F002A70E2F9A22F0AFAED24 +80C169B2BEF14DB7E75ED43E2317948F2F5F17A8A301E5DD65D1950AFFB85A1B4A26AA89 +104519AB57E70A3F506453128E1614BF850F371F29A9CA224B2B258C9830F3046D4F1C8D +3DCA9AAAC020617CEDB6FC6E1EDC69E17812FE92EA38C97ED91987A65C72FA48C353326C +DC7BD08632C96BF3C9A7C095391BCD9335E8F254E937A77855854EF20235319423D2DBC7 +DD2435B9EF9B9CE1046B95421A98E910196E802263650E5D2087E34E384ED7FABFB6DBDD +48342333407D7163A1B1031F841AD55FDBE7C1553CF17CF057652E243CDCFC8F86D8911C +C6DA2FA6BD522ED649C52DB102498790D6D55EF2AE27790595E8D8489EFC05F505566958 +33A31087D230F6041DEB7173D2BFFF6B59E643B532C2649D4902CA7FBD79F3347ED28EDE +D5EFC41B0B6CC97F6165806BABA7930768FE8E4B8313A5C9D69BF0B029CFF51B9470A22D +98A6257A6BC6B34F11536130A980D985E24F69E0846C395DA6C35C036940E609F9677B0D +EA2B923A92626EEC8E224E2BED76CBCCF6F2DC14CF8D90BDEC80E7088CA871846C68247D +C4912B6DBAD4C97A472C1FEB6B2B460929E374B23975046E6081E210116ECB0F3680D99F +E7BC4794EA19037638DFD2ABEB7365F2A7BDFA3C7766B3FF642F0639D897A3F0772EF880 +EAC10E1BA44C207039C64D2DE51AB6F71E703F36B24F9BCD0179853B815DBAB59057E8F4 +7C74B338BF128922C8057518CB7FA34AF8F590BDB76296E4258570F5CDCE24B4F9755C88 +F4F3CFAFFA1EF7EA5052A2C7D8A823D0A1EA7740A726FDD7B1D28D17B01A0EFCD601F20E +FEFB1688FBB375573F54EA1913230461B54B64174D7C99ED8A2DD269CB60B02050A2B300 +C0E7039663C388C4670BA295EC5BFAF496DFC11816ECFB433AB94380D1982DF52B362305 +289A0EA2205C91DAD93A6428491028D50A987C5501D0FEE5509196EFD2CD36D695B71289 +E2A4A96BB065C0D9242351C6A3732E49D51B5E472F9EF2524716B7478AB7460F43267CE5 +6B2DFBEE8D34E1BA79A57B175D8B9496BA2C806C2F6CDFDEB0DCCD0D813E79E766FB8548 +9087D61E7506F04102C2DCDE9B44EF10B38443F7207B707A265E1111FC0E411F04A64524 +3465AE5AD4FEC01561DFB4C1384B8FF54A0AEBBF189822B63ED986B8197B3B1085087B01 +B9EC606AF3C1CBEF701224ACAC1BAB4DE76FE28BC7F538DF318EBB3CDA0E9FB06214F497 +BC2926399C79CCC70A464C2B58D51A52BF06A5650D21929E4C2EE5AB624F5EFA25E64B63 +2ABBC3285A79C5576ABE016283D08E19246B77166612E83B2244A1BF5A7CAE45A691AA7D +BC31377285E78F094870584C23A2216453B9F0804BBF32FFDF810A2DEE41CB2743472A57 +D050F61E285D232C6EA0C2EAC1C0FECA0E489970C7B83D6F1D64B187BCBDF29815CAFF8B +8EC2AC2705DB255240A5A435A0B0AB6F2C9451C7E14FED26DA327D432A30B672CC7E0D99 +8653AEAA0DC7FB4161E604CEF7464934795E01C7CD625A2C7C4988CCD213C19CE963C6EC +F45078DD17A158FB2F9FD1241FE5FE0C45D05AF19E5C5D5AED76D297414EBF0E95E451F8 +B61EF47D7A80B240518FD2BD42C53B96BCB17F04B850CC889859887A2EBCA1499C10D034 +D545C5101EC917FD27B1F87B4460B8D5036A7072070ADB83573796D07A4C4C5348FA845E +C31C83BAAA79D880FC9965C08621C9BB6A982CACF2E9076CC88F14F4E2B1403A980AA310 +33CC1C16B108D3C390F95E87D6DA3FB4E9AEECA82F70424F82C243D0F0DB273FEFA8F57A +CB2994DF51CCD21C45A00F60EED00CB7C2CB6D131A57AD4CC98FA2BD0313E15AB964221A +6662B6319E305F2D2255741DA5465C9602E7AA3558B98B906B4AEC3AC8CBF877E51AE0A3 +CD1423A0AFD38716B0B74C7F492412AB575D9DA05634E20D34026A1E02B58806AE95378C +8018A42F273FE95E72C6E8BC54646FDC010E807B2E78AEE753E9A223B8B014CE464AB7BC +5C6FFB19A0687C0FD300BFA19FA2E9A65FD2A4BB8B5E6967289A70EB18821A32CA0751A5 +972A6F3E3054E10972F59A9DCDEFC5DB1E9FDD87003B98228BDDC733DF066CA5490A902F +2930EA9C937B586CDBD433532E6230F87773FFB354BDEEB778ACC289F3015C5158828790 +BD620956700DBDD6C2A9CC76FCA2868936D279495651B5798491478B1B77CE6656E8FB2A +69FDFCC2C8FE04C5C6AF6054C01678278164ACD9CB8C7BB41E0A4A4A3513283C38B03B6C +27E66FA995F58346B724189632494406D7B8E6CE243C5BF1CDE8C87AEB0E6F43C52D5D3D +4F3F9C876FB9ADA96302D73FD3DD51D82E1314024C5B1262CC009052C4E598A2B7D855B7 +BEF4FB97D65D8B26B69CA86C173CE21A159B3765FD48A6E978137FB2C7B9C4A39A94EB09 +A9825BCFB87EDB546D917F4BB3B618906C643280D3A33CC87311002B465D440C5FE3B8EA +1C3AFE1CBA90999683875070513E14D37D5AC6214D5E38748901D3740350CBABF87ACACA +FBE7CB2A97332D9BFED8B0A7EB95BCA79E8D4D6A80C1162A49C73961822A568D43BA71A4 +90E3571845A95B8AC2313098F7C3379DB959167CA17281F8FC7933F10BAF70A573981F5E +02810780D9780AE94EACC4F4A2D1BE14649E1B776175FB5EAF25DE613686161995472B24 +86AC004708550BCF2CE0CF3032A02BEA90E1163319C20894648844A936D39C7A266060A6 +093B59CBDD59E4FC67AF429BCBFB4037DEC87FD9CE0FC26D488C1987E0D6A79AB19A7601 +3C3286ADA28464BE78C5C591126978FE183EB480403432664318992C47600105BD1C223C +E78F8F5B3C1C56F298C28B700886B9E467E7ECBA6BFD0BCA114CC74CFE8252FD9FF4C39F +AD3071CC0E832A9F4BF89F9AE4FFA1FF02CE797052DDE080C175AE529C61B639D842BDBD +B8D349090DDA8F503C909349A69BDC6D972805B15D2E8D321E9296E3E0965E7BDB040FAD +CA90D1BE06E438AB653E7553EB43A4430E3AB1A43BEB97715FE97A8B76A7B5B1262DAA01 +DFF0259186017062090F6B9A35B9962DF2F7EB85B6D20A693B1D925DB4BF06996F60BDD4 +6C2381937E21B3299CF3BAA565727DFBFCD38BF24143D400CF99A7F3D09D17D5E1CBA49A +9C607D434EDDD31BC70D277CDDCC5CE03C001B53CB1D448A87DB676F6BE0681BF57F66C0 +43BA1BF6889DC9F054A544C4D498B74988D5DC13262AB95205386343ED6D3C077B058B57 +4C464D02E35DD342CF013B84CBA67538AE13A3F50BE444014ADF085E95D736139E1646AF +7C4A401E25B3511364DA040AEAFF801A664E71B0D2C6E46B510A97D5B75B2377E54BC7B8 +C4B368602743EB5856E4385C4FB3F364C54239B5794F69E39791CE5BD967BD03E212B8B6 +E14336AF3900878E5031993E3043B23376975A43CB032C9D9C1E485CF34F3A1F2055AEC7 +9A2D2E68CF82F1CA0DDF7200B9FE4172947540769AC5FA6AA53A87E6A79AE9CAC84C0FE5 +F0C0752F85329F95AB21AC314B7D32C538E70112C12A34DF2CE7127E5696F88CF65BD083 +5E57CF98FE8AE4873FD1EDC9F775E6920E87000CAF9C8B7FE3CA5A84A5AFE056CA8D5610 +69F8979E13055582F11FADFDE7BF60FA9EF36AEF0D85F29D94CE5C571574EE03FCE5E5BC +A5B2D3E4FA107FED636226B59D00CCE51BEB891DFE12F04BCEEC13606B051D5A50B08F93 +D0B3ECDE4EF0DE6E06829E559BB2AEBD02D0B7A1C505743ABBFE54A9682123C3695E86C7 +54465D3A60369CF9C3FA800658DC52000B8F6915A9F5549849EE092CFA885BD5FA96E6E3 +D04DE784BF6F17F333AC90FD8AFA98ED04F003E47A44893E943B6504791D21FFEE630A7D +026F82D0B903496D3E08DC35768EE6FF9AB617D29193A5FDF8A0976336297CA65BA71A1F +56E19EEBAF4AC438B9807AC1F4CB0DC9F740910E2BC32220D37A337FECB98301B0A203DB +739DC361838D4577296B9DF5E1DEF57DBFCA489801685288238CD8DA085C709663DE7F84 +127FC9E6C4FCDF327532C87635A6D7822D36583930BC9FA1746966A175670A2EE77D5FE5 +DB0F43189C37191F0ED80A333E8B117508E17C010FDDAA44820EF17FA9AFBDB754507F4E +1AC0D09A0FAFC80ADA11DA469995CD7FAF67CD8E29AB323C03B6A1DE80B684FC2AE84B46 +BFE4748300EF789A12A166FCD29ED3AED2FDC431BF9B3A450E2B15BDCE9F15C13E4C28FF +15E145C661B3EF6DF748C32129BD734087B8DF6A5C00B4765F2B518ED29FC53D283587F1 +2B62F177D14E3956A64C425AD811AE6833F2E095AC0F7BED54333095002EF33824F6A7C2 +3CD332BAEC7AB22642A5331A0C1656E3E2E4FA99825B5F1A04350BD96AD4E491F97E47C9 +F5FDEF0466EE0566D5F2ECBDC2C3B0DCA65728196BC139EDA445C7B5435E293F50C91CE5 +4FF3AB7112603BE44D41198C3A5BF2CA4BC460C0BD8D86073948C452AFD0A35CDF30CE1F +AB58276DC2A49CE15CB2C1EE44E0C3E07D73936CF675B1A40B1A2DA5C61BFE4E56C92FD7 +CFA03B2D6A9A108054AE303195132BBBCEAE17F83B7B9140BB11DC6D2A3B17A46CE4FD4E +0EEB5FDBF8028B1E7052C602C5E7BC63D6F6A9172032D538B495C3D8E3DB6FAFB0CEE41F +35884819BB65463B11378A7526B582A4D2EE1726615B66E8514B4173C47B399F86ADAF7F +E7F7C08A707A30AE31400B603A31951A7F617BC16E5905ADEA0197382CF2F799F8ABE8DA +134FC37C99767D4ADFD45502F189ECF7D08471186F4D29A054DED0C5AFA56A8AB3AD5F3C +71D784803E0237F41B764C6A91676BF4623E80803231960AF3B941EFD842235968071455 +F1BECCB46F437930B443A1C4F681AE595A7F7057496C5BF98FECFF07CE1B4E3653B7AF75 +2F647322BF2FD773C8C79B305EA2365EB878FEC55A277066560401CCA10AB996645BAE4E +728E34864C7F2F0ECECF66C0387B2DADBDA23EBC4C0B904C5D152C9856EA1FB76D10BFE0 +7213A87551081FDBEFC207AE33B860649D445724095B28D45354590E967DA4960814E184 +2ED400AA72982427E378092623D784272A07450265A89A88C13F0A71A03C4234EE525034 +2F5F28BAF685A2D8AD6C195B4CC3ED9DFC0E82910D692ADE7236347002251126C4CF7C82 +175624CC08445EC64357BE592FA06FFE3FB52720F4CCB0A78173F0BFE317F2C22EC52607 +C9479BFEDD6FF60EC8F1F613251BDDED25F2639E469B344B86ABF4BAA8A9E05C5AA49C91 +826B39636461E805364EA49E222129B12D357641D89411DC5081064473E78BE378BE642D +16B4CA3D926E508E5905AB84C588EF25E3AE064348C93A28880A02B0665C2486BB41BCBC +8CDB229607ECFD58E01D99D71BC1AE9DACE87D02D7567D570CE3BB7EBB5877A5E309B181 +0E75AB6AA6E2A72B9DAFDF89862C96141D72DAAA090F0EC8A239F1CB565C7B7523ADD890 +76109390815D4D128B26523BF36FFEEB3D1DEFB8C44460FE64C11F1183A99BBF9C5D7BAC +B644531BC4873EEF693B2E5401D764F0172127F873786FE8A95142DACBEE14E4B1E11E5E +13B3015B6344C9B27CAD49C457FFFDA86E0097D8533F76344AB561593CC09BDBC1758F07 +9F31AFC4BFCCFDC2D54B8FA7F1265E8AD350C44C940B8111B4A59D078423535205A22202 +92F892CC2A5AA50ABFA912D6FB0304EA164E191CCC659DA1E00B2DE5A6830B60D69AC9D3 +CEFEFC2CB0DC016B7FB41D5853A0BE141DC15CAE07A90E56187BAF3716B7A7CC839FB123 +69DCD8656F62C1E631FCED16D171A3521ACF60675FFD2911A20DFE45A57887984AE2C41C +A8C6C24A12445E167CAC1A3FAF610DDCC8649C6F6CF07AF89125C6F37C70B682BB77394D +F4F6E7A111A0ACA9CD25E1679891B3FE9FDB3EDDE1D3805DF7C42BC5FE4A6D91C7042F67 +6ECFE15B9A90AEA755B3E032C60A71554102A9FF4C2E9E467F0B7DB9CA0F2AC3CBC3CDFB +8DC2A7365807E409E75E89047415598A8720B25CD32FBC18C12EF6E1F9A193132C0DA8AB +134A567DE1BA0583E12BA2045A36C298ECC4F909510D29ACAE1EED825ADA28437F457BE1 +94FA7EA3ACD0119F438ED2A2A31BFC511BCC3CDBCDF34B6DE3DFC6F4836178D9BB35BF9A +C546AD2D1527D1B020D2A975E83848CC431CCDAB997A195E2AB6B3D5A8980D5824EDA901 +EDBD85AA2B82480CC76BA911F2D4F7E2675E69F4005412AB2E88861A7D925EBDE0799075 +F858F32B8BBEBE0F6138D4C8AEB2EA647046C533519867FCF286E04AB146CE6EF4080A8B +2026BDA70349038DE8C2B71B2B2834E57D4D486F95CAB49C4DDC2DD17D8C959101CD2DF3 +D9E4E9FEC4CC05B2490A90A30C898E8588CDEAC838565BD0B6B494F2DFA565A606789728 +0EAC877E47201EFF4329FE524BACE5E90E8525CA1F5206B83D1FBD284D1109651141B4F1 +CD1D1F5A0406B90E4FEB435BFFB60BEC00454F406B6CBCC3883F8D470226A8214207DA07 +76CEFA99D769166A8327F8543039B44FE297A1EC1611713846E67B20E0DF311F715E4CC0 +3D1AD8EE1D14FE0AA2D55D1C30F9C1F12C9D8BB8E5429FDC4247AD4718B634AE34213480 +45B9ABE0C2E231914402548748A388FFE3D5148DE9F9BE6CDC21DEE4B5F9FB0C3A52EE12 +A9B23D6815E76979C6266A811157E380AF6C7911D55DD522FB766932E2CD361406517268 +43C8C1EA841219D167757C201022045656A45FA93AEA1B404B16882F20BC30B36FC2DB62 +96DC200D567BA9B4D49366EC4D3AF556013DA5878F04B437257CCCD164EA4460E472DBFD +AF091AF1C2131C55FD31E7DE78BF0380C4B34C89528CE0A36ECEDEBFFB34DC33AF1006F7 +EAE6444F7F063BD1B1B9C88850B1997D3A24BD1650FF98744C9A0CD6F7246CE22A1A91AC +D1EA6FBD9237C32B80D6BF79B40A3E622E83DFF1366BC6B7B6295D5785BA00342C146BC2 +527FCF50B73C17B76D6B4B0B98BE03BAD8A67C7D547C866DB6FCAC78C69735F26DE9FE2C +D9504F5AF31727791158F17D129677F5F9BAEF97A1899A7DAEEA53E70EC6C822C3F893B7 +3A4C313551553E902E762BC58D8D1E9508D9D3355D5FC528DA87BC94DD9EE305ED737379 +CEAC96549D3E7E505A13F11EBBF0BEAD38601BE5BF68B1EBBC504F8D9B4219307F7DE93B +EA6B153F5BB35E2B50AE9309229698580334EA4590E06E41D834EF86DECDF64687DF0258 +6AB142A457531A9103D49D0D64FD583046A107210FF1FD544A8B07EA3DFCC04ED74BA498 +E927C72907E896B8E6C0C0FD016A42B6F45AD628761A78C405C51BC07DB9D90D54674B0C +62F43785115A94708879349142D612DACF210116A3EE5F0AE9EFFFB694C328C73EB4FA11 +56E38C4E25BFCF9F441C2B0A6752091DD9F9C2175495B973CCC0EBDCD43125CADBE4DFA9 +3E11EE051D6D46B0B8A8C4DD6443D392CB7801D131DD58696594B1FFA5DB9D70F46E1C7A +84B445E50922880FE987BF899BB603CA937D4DD3386C24D24AD31038CD9C5727AABF3DF3 +0FA105F554A39A091655147C8511B818A5932FA9B33C2B1DE319C5F704BD439ED6E1B8DD +FDBFFBBB038B350E1B8579A1B2F55B24FCAFCBB6905F24C82A3FCE3374F979405E69BD62 +6346E4531E130DA4358CC11FAC6E705228CD1D4BD865DE15F2C8629E77CE5152E3CE5207 +D42D9265A4F27C5FC3AF11712F1736F56CAE5DB347163DE798EA934C189E5FD6ADF49DD8 +4E9692559753CAE3584F3C43902F775B9534A4B541DF22DDDF723339562A5785E37CC808 +47E59091A5A339467B57F15902EBD2399B55A19E098ED661A475A559E465A502CA339B3C +64A55AA28D3DDF57133DE6FC6443B563A0D49F898E0CBF45E55748AEA9E7A215D26E07B2 +C8CEBD2D9D233D8E86D53D079691EA21DE11F9C4FE0D3C904C5FDCDF2301BE7C896C2FE1 +036C2B3D9EC21292BF87593E27BBDA40DB83CA23F65C56064816657C97DD53CFC7FB54E5 +353730E625C5B31F030BB0E1D09429E6C6496EBCB17C114667F9B8A31ED328AF0EE9E7F0 +1AD0E70AF25BF2BBE8F99A4AAE42A6466347CE5FECF91355D61A312C550AABF782CBF1CB +649FD914B4AB1EC2BBDC6EFD65621921858E9CEAD02447DAC2CCD4D9D880BCB1513A5AF0 +D931F417C1342554E7EFE9529B18CB931453AFA51E2830037D2DBA79C565EDF25A0A7059 +315E242D82F2A32DACB9D86C62658FFB7E5A11D00B59CF45B48C1682FE8FC4A4FA41746F +E6F734D86B7CA91C976D40B64601831546DF211405F1F44FB6B8FAD3E880B74B66A93783 +F12CBBA01B8D456A1BB0DB78EF455B230B53F95C4E7B13EAA9A8BD49F886CEDBD9066819 +085B30488B011B125737F16BB6B31908808E7B076BF88E2F23684929602C888BB3A51D29 +A3D8DF55B39A48E5115E686380452EC5784D09C44ACB5EB20ABF8DFA9DF66344BCFCF175 +A877296E511AC83765358D8C091B91A6C70AAEF9A66C2F36F6387D5795B60261381CAB7D +9A1EF15EE18683C485317692DC0CCC859F5DCF51C3930355BEE5592A9E5DEE4360E8151B +582E019C674501C0F27D1EEC05B1F55FE9F79C5FCA04AEC51BF01CF8BF5DEFA0C9DA4DF1 +0D923E6E56D35364023C84D9D71D68168A73ACA6A6CB8304C1A830C3CC7155D9C5141DBA +165A1C733FF5320A1D1028B7B543D2A1516071D0C02AC030E52BF79E464D8938294A7D92 +5874AE6FCB352EFD4790F6973A627FD2979C19FBF19D2870FAEB6BE729D34FED4C87264D +65FC15436A57DA96DC09C7CA864CEE0D98AE9C498F258C4599CC97A1B9095825760D06A5 +C53E257F54407EF4DEBE04606D65E3D09C01535736D3852089D8FC0D2CEB60BE19D959F0 +CE1858D5B4B72A953FDD1CAB16B1768236162A67C1B77CC4DF6393A480DA4223B65C9747 +67A08C86DD75BEBC418E370D5C2853523D68852E705A4BE611142EF56ED90583181D8559 +9AD285830BE0986BD8FABE86377F5529A5749A30C89A272711A694AE29E2700034B6B620 +5413F9BB288AA9B0BDE0E91CE8643E96C8A771FEFD1EFED94DF8D67CABBE928E3A845723 +BA2B85A2BF2BB4F784F2324040C42292BA0966DF1A495D7DA80B9B79F76D10F1A12D53E7 +A16B3175CBC39C1BE14A36CA1E3C7CABD9F8DA323243F0703C3BBABD48B1CD35BBF2755F +2508FD2D66FDDD1DC21D232CCDD7CA5E749A841F82EFF35249BD72B0820CC69FF176164E +EB3E885E1DA18762FCD40761FB5C91D692F2678BA2BC45CF1BECC0A8C28EFD62D1EE29BC +2CA29D922AF0A592E19AC004573F357ABCFA00916487664065D3864EFBC54AE0A70952EF +676B5087CDD43D9540C784DBAFA0C0ACB72E35CF6D82789E3352A16D379A4C26118C4B5B +8E5C7258B2B9082556A1B018085F19168CB7787CA06283382260FA3743D036EC4142DD7D +2654BF95651123718193310928CE49B532F6B26181B078228B97B4BACCD79F6A8DAF1004 +096284F2D45BA3BA14F1D0CAD558239BF696B1F2D6F6AA2D11693B497A7FF12BEB36F65C +C453320F8241820AFA96FB54E83DF38BEA9C7A004EE4965EB7104982F4D7847D397B9EA5 +9F93C61BD259C3BAA15323EDA020E35DD78B7FBE6D7CAFC5C34D9C8A60B079EA6A3123FF +B7352EA72DB9BF6C80E7D97AC188A9B8BEEE3C80819D35EDF1CE62AC4DA459EB208BFF41 +4A3EF9C4E3514F44EEDF60CB817EC66E3D698702B5DC889EE0C064A387C7487DD97B4EE1 +2792DAB796E4123E9D7F3191B22F2481A4602CFDE1E708EC6BFA63C771058B380EE6AD48 +2524F9F1FB75D470EC11226A138F4B9E5360AB443D5091B324271E8B251297D8236E3C5C +E92AB19E2005DB4A8BB12950E6A3C47C16229F300F8BDEB8A54211BA195589F6C8CE22C1 +A32B3610EF0E43458132703F86AB9CCAE7F99CD7DA69EEE32CB011EEED797C841ADED034 +4BE043DC76BC7E5F877620283E923259EC2100FB83832D104A256105EE8FA5742D7E252A +7539334AAACF79E4EFD98C32661AFCEEEB5A9CE44B2CEB765C6FC6B361E95CBAE60A8680 +D2741C9AC12B834BE5EE4F498B1FC7137BCDC32A225DBB86B1F342BE3FBB03A17624066D +2D652F7F7F8D431AE8DC401FA2FC64AC056A9F29DFFBDE1E07BA398624F3337B6001D1B4 +F54E9E67B059415D43144EA8DDECCB6B57022B678CE554EC7979BC4DE26BBDA16059A3F1 +16457844011864CEA021FC099B7FC141923CEE982E2915C6D0C28767027E139BBA2EB02D +49DD1B247EFC7A2A1504C4DCAF35305671CBB20B2BFEB0EAE475ED4AD53293B94A6E6AC8 +41FE1E9CACBADD1744428F6F992348A3B1D391CF65C86E2F1E57382D245C920C7CF3140D +6AF604F686019AF155ABC0B0BB9835FC49755277A5DF9E6F0A7B8E91EEE7A2287704D71B +64D4F6D0C927DF674B35A38E98CD7ED00B76966B2E44912BB1EB240C25AE3DE8E7668062 +55CFEBBE98D8A49657D1B230F8A9AFB157AB3BF74C8485F5A275B2C065797A9B3E1021DD +7FC20AF45DBB60346C53E3CEEE031619153CAE0CA4A3C25458D73EC46E8B7196CEFFAD73 +6243CD4F81D73A2A7D0C3F58DFDEACFD4330655FA5082CB75FAEA9B99D8BE6A0FFF920FA +9F8AA5CC2EFD3BD09C3B8A94BA03D1411D6AC5894A8402330D5564AF8E75AE549A11BD49 +E15B20F7879DAF938B09E430CE1B57EDD9346CA8AF022DE5548A4726D49E8DC439D7DE79 +7C006A7AA78B018A1D68E15AA83FAF97394FA4F0E1460DA5AA9710656AA1E294016F2F8F +D7B10DFCD2D10AB59308DE6108C3D44CA6B5B1A0A5408E6FDCBDE1B5CF86CD7A9F815146 +B9721F11ECF3EFF7640EAEE03D8D3B4B4F055C6EA18A7FF129F369A1FDEB7B71A3223890 +BCAE11DB2848941B6323221AD976E5986280844ECB67C4A1ACE6BC87517A2DDB2F928A01 +8727B99FDCF0D0CFF57A0BEB04C7DA62E41E9623AF0FA6EB651E0D1C9C72140CFF8A7A2B +BBA67EEF1AD2419BD5D399E09F2BAE43881E8AC834E46F6F1C96B6EB4DEEB32637DAFA37 +89C2BD92A4989F9AD822A6483D516A143EEF6DE93ACDFF3B118F8B80865EEA782EEF6DEF +D8E5E9252B378E3F09E770F38CF1A71A5CA9E872EEC7E1AB4AE8B4DCEA41630FD47B9602 +81A711304DDA075014AD733B83D5631276F636D4A470C1DB8F5B1E1AC5B005FE2B5B4D79 +346B39D86048D7066C0F5476FA7E8A8F7D48488F49507237719121AAE83EF6938AF31754 +5C848CE4E8A118A8093F5720CC4884D3886A5BEA6312782D229ECDC11D4AA1731A5B098E +DAFBB3EAF2C539FBFE55E96C1129EF344000D8DDD7C7CD53196B27AB252155A634FEA9D7 +971E3079ABD8F38DC7C166B5DC2D0B1C66D776BA678C5C57E8EFDD55EFA2F5B5FF8DADC6 +0F18A0026B3159C7FF28D5283E6835147CE4D5E5ECB6A8E537CDD7F8F7A0E7B6FC53292E +FE0F780D9B58293F527159A8440C09FD842877464711F7256DD732AB76D834EFD0C5557B +DE603FCF0E35B4025848595E585A7707A33F0693022B06FC2032659BA15DA56C183E51DE +A5A8921061E9ADC27AB380DCFC851ABBD9A51632F60EF08C2FCF84A86A89516D66DBB232 +A4EF10707682B9AF6A9B584766C8432FE43BD4D2111F81446E0D508817D6E6742261939E +36C71EE1945C10C1CF6FCA1236AE71A10957B57B1F8F69EDACBBB9898735D2071C073E43 +6585FE7EB0BC41E40DC59BCE6C311D84F9C41929DEE8317615033CE146B3C8DD7C1DFC28 +471226DCBB5A003FB6185793B313EACB67A443C60A2A7873EA4F13C0DEE9209D4829FBDE +5E93380F14C2F04448CCCE8C92A0494E4F5BE68792D35D019F1C4279D261579261B6A990 +6ED88C23D9D7993D36FB0F0ACC744B14FCA75D62AFBDBDDE020DB4EC979F9A816DB0AA8F +767A0CA4D561E00EE5917AA1FCCD701A8FA3BAC8AF96268B9E141D891F15B918882FBDF0 +4B611708AB3D464936D9AB17E781DE646C2BE7EBABF82F4D547F09719EB03FC702894480 +9E8C963D076BCF1DD1C29F3E6A57DDD550B4C50C940363F0015EC80F170B282BF9E9E8A8 +7E11B31975583D1B8678BE0F782DD2DA711A0EFDC5EFD9BCB47C4C458AE693207F67915B +388CF71C508BE8A2E3336692A068097AFC21A42DF45A12CCD4E6E005857D04328032A455 +070E65A5F1574DD06B48CB94508FC3DAB04FC0D777C24F1B8A32F5401919441A01C7FEA8 +90AB7C15FE2FCFE62713F42E9ADECCFA5114E46E8FE38448282A694BEC76034775C730DE +B2813ED4E2EB75C8D2CF9F6EAA42A82C5C711BE920E4497E4DC4F60ECD923B6F21FF8C9B +2AE3EB19CBB422FD027B4C8CC503F523E7B18DD1858D1DA08C9B0D0B9C9870D549436AE8 +D21746C86310CB94923304496CB2112D91AFEA2776A9CC7CD79D381AB7E251B6B13E8DCC +36DB7BDAB3AD9D22C7A9F6CEEE7C130E3753C4AFC946839697EFFDBC4005EACCDFEFC029 +9D259947810AFE57002A3FD3B9446977345BC5D5D53B6F9722C47DDA534BFF98C2433B0E +EA965E20ABEA481A9C81C612ED51CCC35A74CDB473AD0A5D2E42950AC1F66DE6393BC9B7 +B02B00441EF8CC421695854293874A7168496467FACB15062D50600824D18F65E3FB83DC +C5273D5743A84DB5CF9D38AAB1478BC6CC1F849ECDDD397DC56D1B1BA395684520D68729 +FF5132F4F7B48A17DD6FCC303871D6AA2F29CAEF2EF77E0C149829B9225746D43286D1D0 +940E765628810673F32809AE451309BDBAE942726E9A2D57711683B3C4D39F6DC393A20F +BF0A8F4F73E8A103B3D9B12572BA4B846A0A9EF3702546EB97A046264F067FDC72CCD091 +E357B618687BE9E5C7E667914F44EECBF3DA82C9464380981288AB2F9B058DB262EF5BB3 +0A4E0327AF77B82AAF49479A96A6CE7051D2277EEBF286FECA3B0CFB56E1A94B147620DF +BB6207691D8E751D5E468B36BD64C8220F2883A5DA60346EED5616F924660658111CE6A1 +0FE807C63FB67BECA2AC00D98C47B5F1CD6B9FCAA51848D97EAED90AFA582F925DB9DD91 +F77B73CE5BCFC0A8B21C4A75862B345ECD68545A4ED15FD4A3235429019E3C922537DFF6 +F0C2907B10D068D116EACC7E0C82EECD67C0A377E367500BAA0B47EE6444C4FA196C7DCB +F1B080A2531A96E2A874DDD02793E72C1D259C3004474DFC91F2BA21554D2DBA3E4613D6 +535691E6E4AC04940353EC25951DB2D4EB2FCE5D701249B835FFED7C78225A84A24D138F +631AB67295866BBBD000C1D5BD26B43EBBE4740716DA3D8293CE4E359792F7120811B32E +2B378B876D41E70631187CEF898EDE78C0A8986CA30889A8F53C2344384E3FEFFBE7AF07 +171E031BFA6536E2E6719D934F74B39169E1D912790256B06BAD12CC3AE588B2B2DF1C7B +ED6A3E99773C25BA78DAB1C8E902D65E4E55FA9005C4D80819AEB20723269B6C091AFEE9 +29D46C11C198A7BB0D4260EC9464156F655EB1D460DB7C72D932CA927D39EF98F35EB6DA +7F8143A443DA3D0E909E6B846DC2DFBED888DB41F2C03D9C9B61F31B2E8334DB7205FA8E +C2B94D71CCF61FDB51C66D8AF7A47417DEC7FFBD8A052779869E709F3B36BB74340E78D0 +3BED0A4618738C9D2C3C447C0D50BAFD176208820D1F314E21615B7A4397883F8D59E65E +80A814CB6E8FBA91B0C410A8B7E37188C1849AA206A66162902591AA90F18E0426C586AE +80F63CD8764DAB7FE811172A87AEE833E935F5F56AED5062E2B35F6077EA26AD8DBB1011 +745F36D936EE50A88144F211B37D8C169938EDBAF26E277DC7A921C0154317BB081A7537 +F0FC37CD6EBDB6F97130CCE08B85690E173D7158367C616412A63D0B8ABAEB47B1BE35D3 +23456EFCF7962953F630002DFEA23DF4672FEB5DA149B713FC91C94505596471E44D590C +54FC5D336DF319A98AA87DB9D313B9DB208DDAF46FD5469AF90F548E704DE24E3344B95D +6EED106864FAD4001FD8DE48DEB22C8AC3FAE18F7B176804DCE5AA2144A073FC9BFE4CAC +CD6CA534902429E28CBEECFA8D984A71E77B5662A1AD114F301F548F192B11ED7EB56BB3 +F8FE62001753FBF161D538878778501F917441F9C5DC3B39704BC1A234117157303EEB24 +EF453A1E05208A07B8AB22DA331527E0871EE7D713917E86C80D2FEC3B934E5B7540C672 +34D0FA0E4AEE6A5B1706F2F3AE147690A76815F5575A5C5B44682028A065FE8037E10526 +5F282058D027620C117A57CACB77AE153E8517134168668E79017166CC435DD24831DE0F +65872D49DF581C872FBD74E0E2502B9C0C741322E9CA72152E7DA26D84696366D3DB5C56 +943FE579F99CFE384EDEFEDFB30F7EF5ACFF5BB88327E5A63B796C7EA2461B21419592B3 +65DABD1DB63F6AFE1B959CD018163A48D82D0D36284F118263E9D2B8FA2E3104BAE034E1 +A1DEE263980EFDB385CD6D687D1092752D7E3A6C46D678BA2A2F3E208988AEF16EB2C67C +0C5DDFC85C6819746A034BE35F5C6DC967D64005E4104A7EC6C55CEE199CAD3F98D83A22 +E9A32D0B0F4E7DDC4BF81D77914EC3C3DA3AAF51424CE3B50AB293152EF0EC717F16815C +4ACCEA27FFF69DAD5AC1DD549C6CB01F23F3C5A3DA340CD914849991C554202076C37DBC +7FD48DF9DF23F5DDDBCEFE0114A2877C31385A184742AF5AB3007908A359240E9DBB0AC9 +501B7BAA815CC273D953E0D50802CAF8C00FCC054B10F0AB7C072C573FC4D3EF018754EA +32203E847125B73AD879F613804FFB9470CF39D0694155B3D5D500E3379A163C86CB1AD7 +85C3AD12B724AA4F203C212FC0FB7051CD0EEFA161920E515FC83EBE802800D1C851E085 +B069541D8E183032EE5FB6D8200376FF0FA5786796E7B33352601711A2323AB0F2CB64A9 +B71C936643B259BB73CAD6D04B33201FD772599DC49B9611533D53630A3C91A6DA4E3CFF +519BB469F2C23613B0D445D98377E8EEE6218E0CF7333EB5C4257AE30DC6F8FD35C5978D +4071F0D9464C260223902E3C76703BB2E3B3FDD9ACB3F6E43C3BBEDDDAA846A4893A6E6D +6E8D5AF8FD12DFCBEF1B5D8F537AEE87AD8AB3B486910F0013FA6239528F698F61B6A2FC +FA7CDF66B238222B989DD390A1647AFDB9AB7E287F5CD96B7E443C293B39C7C8A91A207D +E7F0A73A48387C9955747277BCA7E97EC37EF0741EDC541F9804C12F95F3325F2E80CCCE +0CA03C931C7FFFB7419BB3B2A3A67325DAE74C4D597C41E922B09ED70F411F7E29486C5A +3D94A857CC69502C6DFBB6E63780DC3908B989F01116B28CD8BA096CD0B09B3EF4AC8E64 +55FC7300CD8861EE2F1FEEFCC03D95FAE9DCA58000441A1D3419B77DA35E80CA40C0C49C +E1DAA21511AF32DDCCF3935CF78808330C469C4F12481571303335C945937C0080E56DF3 +ADAE10198495A9E04DA1AD8453A5C3B7D9E6E8A8F6F57BA249F0E9CCDFCD8D25C8E39BCE +2B158052D9112093EDB087E2DAAA0C835634BF21B6C767D7D622BFC669B78040109BD4E3 +673468377348A6EF3D0E6D1D7BE8A07BEAE0D72CC158FFD8904003E7D928F7F9B78097AB +A98804FF2BEEB62C695333EA76444009C03751DA71269219D0B30BE98C710803DC3C1159 +2CF0B2D8317B13358B3D96F2B79F801E303417DC8FFA4C1B5B246C5167410518BF7B122F +072E1C356BB87B6BAA4B36609C3CBC4FF578ABCB0A9B4241AC991354B9BE34E831FBDDA1 +D97665C37DD1AA4E2E2AF3D41D2E9561646C40D622883D790D6986C60A2E5B2D27D9370F +0F2E57DBCEBDB45A6244D1DDE4F64D30B94621B21EBDD2DD7F87E75E9BC4F47F1E94450F +AB7D3A2687C66FE4495A05AD81E2C0AB09B4814422272290A024FC55819E7DDB08666BB6 +FF9C9C4F1AB70697649197C550C48D221DD1BFFD20AD9B43F876F19CD818F3EBAD352B94 +03A050E79CA2A369363033508882A1B63D0755B43E01BBDFE55E7F6C171E1A6BB37365F5 +6241C6DF75D3E1B1364A655982D595C66A186310A5B2B3A4C99D39069337E0B7F3448D7E +E8AB0C5EF3AD79CD8D9C86C1E54392437C1077573076513C0DACCE6D16A3ECCED9C438BC +F7859B1ECB294B03260BA9D9890424DAA816587C4004FF0905C6026A04E130E3B59F1952 +02270BCEFD5B7CF306389D3F255EC17C85C6C53D597E11DB5C1E0902508F22044441EEA9 +A474CB66BC40D45A2E0DEF1C83FC4432E155567ED91D8A928D2986479F149E4AB3987D95 +93B419964BFCA0E042CCF7807B125F29E22A488BDB19285FCAB04AC29A564D599075B2E5 +B3CF0C6D53BCC23C1ED6A5206A6AE91E2F21AFDD4542D64A85F397B3CB0DC1F2A0C2AA87 +5C38974242DFB90B4CA67259D610BC8691037931C69D18242CF469FADC88CDC85FDEB881 +A431ADFD4071F3C856EE5BA0196D1A7F157887642EB50C8662ACF5BBD27C4038206FD907 +8AB7146AF5B02FBC3B84E61DC936C2B79F204C8765D6F366CE1DE4FAA944852EA71AA25E +BFD160E6286C927FC76EB19F4C5878B5D847FC5A941B8F2A1C7C38A0C310DDDB5D171E4D +0A1774ED965F237A5396E5A94F87367DB141DACB4448F67789C26DCE06FA01C92014ACD0 +1209D727E37A5C64067B2DC0F91530D8AAF59DE0D750B2A18BE91D7A3362EB026C438FAB +EB0AB75C8B2F4137D843BE8EF156CFA20563E291B34F19F97081D4E43F4A62DC72591D54 +289D839CD857540EFA38AE1A02A13EEE35A0A4A3576FF6AD5598A76B3E83FB67F5062FDA +4A2DA616282CEFC090E154EBEE481B906CC206AC6A5A9AA442265E95CA379785B96E76DC +D4095708AF8A65DC213E42581C59359F3B48EFE9F20AA85E04EBD4F8B4B8201607BC2CFF +FC71D43AB06A3D82E766054F2A54734A38A714058C7573B847C8A3A82304638F2579F037 +83B88E29709F5AED8F17F68BFED85C7589F5343D8A1B73935D693E70E49F67EBF2E85104 +F1A384F7D6BB00AB4067F816CB11C71C625136E073E4C98486A5972DF70B5537693FF55C +DA94FFF774F7C10120F4836B9E26941B8AD2E48B90D71ED129A48DB73DDC0E7CD569272F +33014FABEABE382BC029832CA1A7EEFBCBD24CB435B58703F1E9909FF7D30D37154F2D5A +29CFDBE1892DBAACC07E68544AD4A1E672DD620A5EA6F84B360D6B0C9D2A16600731892F +4BA194089DD0D829F7DDE7885C7FDB37B8DB601623B7B398070E617E2DB13AA6B7C7EDA1 +352570A133F0DD267E23EF4885DDD4B6A2EFAD3B55741CE7B36475A878228A200A49202D +13A9EC655051C1EC4FB61E9D3C1029D21C4B943A64479F82B247759FE49DBCD64EAD1605 +81159DDDF18584457D99949AF2F2EE4F2E3AED242C25919F51CB76A188867D5959D8AF10 +FCCC2DD8D2EBD266B751EDF244BB8284A4705E1A4649A050348AE54A048E515F29469FDD +B04A905C3B9C2B3744455C781BE4487DB56A085A9BDF8F8256FA4C1B37DFF3295F5418AE +C03ADCB277B3157A1DA2D7176E12B334A49E7CB311D6BEE45459160E34B024E8B68A1768 +E83A7B8D7E0D5167E4BC7EA55157A20C82EF009A2631CF53205E11B7D0E7675329822052 +C2FD7C1FA61D269A90B94A4F103E6FB3EF6B1B0304ECF573EEBB1A432F7AC539EB7D40CD +C2F67D1D3E87E6B66CC16B63E00EA442036DA83A7E3CC8F2946CA59FCC0C085D642DE6CF +7C8B642EE62B830ABCC7CDE13DEE8C11A4718ACE97C8D47BE41AF8DFB4A95D44EDD219FA +137541C53086519D6F32112A2507D37B2EB7D2FC10AE66CC5D5A2D6A4F8E6F084A95C923 +CB40B8437D3D51231B50C72DC5FEC25ADEAED8D72EA6FE59859CD3512F36A0A46D55607A +AA143A65CCA0203366C702554B905A093B2E845FD90002C689CFCFFF02586DBEBCB11688 +7FF863EA45DD0EED511F4CAF921015383CA0391E393A44419B34E82789A62502C19B3287 +DEF1F5B24C60F5677576902DCF76F00BC4D3A056875990D18BA69154154C76B2BAA38ACC +39C8C1D55892583B7C32CBE6411834223200F22B416709FCF635EA5016BC3CCAE42C68EF +AA30B0EE474890D25C9EB745915FB60F517600C7F380582C7BDF4B34FADC9C60CB139D03 +626F4DAC953F9446C02331E2804245F7AF2BABE7FD2636854AF0CC676792580B228AF541 +6172AFF0C2FD5730C2D71C9FA3E17D36F9AA4120E180D025B710EB9F95AD8AE31B66D872 +20F028D258A85409CDF37158F840C2F418A0470357AA99A825A9537D24BCEB415329EB6D +5D985445AB19B08ACFC1F58510119ED297B034334EEAEA319D0EF5F7DBE4836DF61041FE +071BCDF1644E9C2D924251049CEEB73548286CC1EA170F0895771CED237B33FA8EAF5571 +E22C890F0B552D319EDE4A59928F14FFDD911F08C17E939FC035D7AEEFCD77AB4A2E7C4D +91B25D75F5C6CE9122C27E0E4A033417F389CF8796EE0F55794001AD285C9285436E983C +94ACA66A8C8027689688D0FA18DB23BEEF57C73CE751FC6ED14FB4D9601080258B7D4885 +4CF3F9A8DC58E073B3D2961729AD90372490C0202095ABF65A8C95691D7A32DC000B6FB3 +EFE315D903FF04A6B366788B5A5FADA322BDC00BFE337DFEF5EA0B899E36CC226DCE1B75 +CC352F71064E7F05420E4C3D1102F55E082E04F1CDA182E5DFFB5EF1283E721CECC5978A +A1EFACAB70A21438B380BE3A972AF19381FCDFCC60FF173ABA8BC049D0D9F22DBD722FED +1711CCDF75C710D083B0F3A56338A7708DEA014BA01943086306885854CBBFB8E372AD75 +6A00B5CE723A2558D80EA8B34F987AF7828CC5457865D9299E3070077F8D04D94C569806 +97CCB42D01ECF928629FDDC07CF668E87ED8313BDAA0D5FD84B0B416FA83998B1ABC0B03 +A3E43B188B7D74287A1463CF2967C7FF64335B205A69E974789EF5741A6CA9A3B62FAE04 +37B957A01ADC30C6C1CEBFAA7044161B9A094377D57E4E990FEA040EE9E37414D70376A3 +66D16916752F4F51F45171892908A53A3F6EE0497A69CE4D4F4085B1BC10F65623456980 +DDCE8C933CAC5C779D518720F5B8F511C8FE4C53E23103A12B2FA4DD02938ECA2AE76C58 +000D38B2FA467C1E1A8A442F9EC4F02E0DABB0204F2AE527B6F7CC775DCD07DBD96C589A +B912F727B9B81FCDEC5B3761842E845FDB6CF3840CF0F183F2ECFD28A92BB4F5CCE7DE8A +ED8912F728E39646F57DDD2816BCB3BE81DBF41DB3D3837BDF55B60E083EEFCD1A012A38 +846E025EC9AF4CA745679C60F88F01E3AEE7B65599AB02836F7A1F192466F5F729483DD8 +7C2E1CC75A61F0D7171C85DB04073B9A319A2F2B76C632AF2ED220FD9D7A1F9010836070 +E0D864D1D31180C1B6E35B6CA08D7261CC843915F15F802B3613E14218DC9EB7548A5680 +C1A9E7A6AB73A75DB974B4359BC428F1CDD2BA5E7F4590DCD96F1C3BD35AAF8549463541 +2A28027140D352FD0D9EFD97CCE7A86729432B246EDBC0A54EDDD6E67636A6F908BA5BD5 +0A90F4F1365DEE1C1E8989C0AC6C4A64861096C1B1D3CFAE51DDDD96CC24C5C11275EC50 +5F8DBCB44E345EBEEAD458D458A177542F5EE64FEEACA55A61AF8738E6BF38A6C9B211DC +F7F2675EB86CF3711C97FF23FB5F5FEB1867467158BC75F7BF7414BA151937085005B8DA +A6D82F31DCA1007E8D3D317D13BDE2428072D2A3A2743EBD214348B15EC3504426FDF73E +3588BD1789A8FB8BCC1E1A021BF64D274EF0C9FAC95EB50E2D7A1768E82BDB5A4239DD1D +9DD8E1775D3BD4CC4C07523E74FA545D5D650E9BC87B80E41EAAAD235833D1CF3B6B9411 +4EC21687773049E082646C8F29641D858D9890B41FE8C54649F840A0B81166130722EFFC +A6446C5509D988E0B4A9AE8E8765E1DFEF579A6D658C4781BA3B3DACB899F0AC467B9C14 +C66C8930E9A8558C8A19AFD95FFF4A3DADD1DDF80245C2F5F91D23B39CAAF4D2BB1216F6 +4490CBDD7FEFED8406D62DDA4A4B0F0FD80487C9752A0948F74930FD47AAD59FFB8B5540 +DE795994B0B6F209699D1DBFE7B7A94DF25522C7BF57C77EE9530784756D2FD8D058B9F3 +BEE20B4BCD63C950F9A4A01F66680608D66AA87E2FE5FBCC265505325711299F6E8F54FD +1686C4B532C504753EA7BA292A91A0FEB9E5BD690F1FC1D1B16D3B9870CB2CD14F7454A0 +8F365FA3FF1F0A8A33F9476A7053BF19ADB66EE28825530115BF79F60AE108B28822EC6F +313C14E43C02FE8871307F481D8B00F0E7C847A3F239723F4003226EE84B31A72F19BE81 +CB986F92710E37B1F6F263403CBB97392DDC7550F03A1ED56165B3082314995D75A4588A +C4E503C6BFF1E642802E0C3F1058B45E370D3DEEC937533E1CCAB26BEA94E9F89F6C5DE7 +6701DA7753CD1FFE77A42B11765EC6F80520EE01878ACB37096CB9C091387AB3BD68205D +1CA6E5BDFFABB2550E6B942F65FA977D55A459DDBFE4E17581CC19FC3B589F976EC22F91 +8E95546F8A447EA621DC289B7B7D67CC9C246322B221E6EFF507C2DBD4A93E41C2F7AD94 +4BBBB57372F85E601FFB6984CA66A5B7E98650E84F498AF13C4B0EEB0038953B5A33DEA6 +9CAD47277A632B26BE464E87951E89B8E0C051BC34220EC245E6E31383B22980AC124D84 +3662E9A1C8663100520AEE44DA661F4307BE10122C14D706993A586C7400BA3C74F020B2 +047CCBE55A6DCCA5AD37AACF9ADC82A59060518FA39649A726CF23543CE91A1A1070FCFF +CA48C8C6A9B02CC28479D8F58040984250C0AA0F581DFC8A5F978EC3DEAD276FBF7722C0 +2C3E41D993368CC019110A5ABD10C1ACD5A5705160AF288A60BA2AFD20D22099265BD254 +28EDA9461AC8193680AD019787902636FF81AF8C0CFE7BF8C064850BAE2E652CAB330EAF +13508DC67B881361C4F29B45D9885BC4CE554493AB16F995A98D40B7DB137953488710E2 +03295B129EB42BE45B089F8F40D505380EC2EC7C1DDCA1940DB8678A1CA0232F3140FDC9 +C00FC77392237C66F9A0A8B88A7D7D7162F72A1319BB22E8DDF62DDE64C9796FEB38C360 +D00F5C94FB772344423AECC5B4491B100A2A93D716B57B5B44083101335682DC6BCAC0DC +B500EF88D04F4F955A1214F56508DFCE4299A8B5DDE9A997E431A55B0E8DB6CA1C332502 +200C5C5899731AF052BC28D2980C00DB0DAEA4CA5EAF199A5DBD0BF794AC18CBACC20981 +96FD0AC31CEB455C61991445EBE8AC899B9AE530847D5DF608D011437B2FB24E4A1C45F8 +05FE4FF8D4109B5394447D7C9FAE9F57EB904B7D6635C77377D84D628F0BB1898FD9DEB9 +3E82CC2ACF52553E9ADDEB1E275280C62E4E8AC9722C5E1CB54DE4C4DCCCE6166F7F70C1 +50747CE19775F12C19E4A81599CB9C57918A42BB0E9AA638429B13B606EFA7EE2FBD7632 +0275BA3CCEB743B7101BCDDB2CE5EDF843E8944E4D87E1BBEF47C9D5611E1805CA0F2850 +CF8A205D53F054DD143C3C90D9605C3B7AF045C553A6332D791209DE72E02C146312B25A +9A5F4AFDBCD83EB67685ACF487664FCF0CA5C455F5848E18A5ABCC174F55984E368335D7 +BC77BE4E2923147A111FC8CC57CBFD5BD87D09867347F01E11DA0780E4FDE4DDA54833CB +10ED212340A0180CDC5924F675AC6DAE629555524297FD133BBACC4F51BA326AB7D07DCE +2093D6DC8E6126DEDE9ECBA129DF931399C72CE690C0B119B117A14E3AFC18094DEF65C8 +4DE9705255D3D411BDC6958D872CBAB28C9586DA888066A2A00B05FB21B5DFE2B9B4C87A +A0C4D7B91EFC7E8076DC5817C35652903605B78FEBFF1B4783A170D8060FC151CE533755 +7B8B3B1EE083114F977201446CB8A5BFB5DDF0852365330CD5C82CFA9BB2DFA6BABDF675 +45586F4D28605BCCCD80BA8B59B501C629D6E6BD5D676665462D5DB2784C5D6D8A42B406 +11700F3A27FD143BC1EFD859F7705C795EEEA9FFE57E25AECCC5C7E270833AA9604C6248 +612C356B6D9937E3B770F3B4FD632A0D8778C5EE2CE62C4E780AF5CFAC1C7C564637044C +0C8C90B9BD886F9BDC287FA97D4B4F4E4E8D7816BB25DD740D8C9307B94DFC8E8E91F41A +189E20E2B438AFC4F42607744E8BF74F3106312D7480A71840D4994ECB0A7A088784AA68 +84BF4DA162D5C38A4EC6354D19F06313DF2D4167B57BD2E5F544490D711E4B97F8D5B68B +F4098D8C9F2D8B8256EA8CCE05D189DEF0E86938052C44D7DA68445A6AEB7AEFD865BC96 +592DD991DB7FF294AC7DD8241E23DE5C908046179B44B9E8A79472154E254D44BD9FFF4A +435B05DEB14C08377D2ABCB8A26F706A366335F2DBFBF5D59B9DA9C67CB396A17A40C874 +C28E4AB5E242B6AE244EF37D90C8699BF1F2D5F8CD1D3130C0CA72B7040991FA90B3C413 +699CEFA97113609A486483E2A72DDF26953094C4E2970A243DE23963F929C3CED76AB062 +8072F5AF6EE3F950DCF88F57F33CABA2C8E4598D4FA6AF46656512E180DEA02FE3BC8701 +C4EFD669BDB52129FEC53E6FC55499680208E6A874BE255EC21B8C75A9D0D8A2622A4CFA +7E6BB9E8986AD3EE513F341C595AB2A14784466170C4D6DC2E9BAC82B988CA2609FF4B01 +185CC5A2B639A028E4A378503F55C147E6F8B30CFE5380A7A07981C15BE3C7120257C67B +4B603314DC2B65A2E4036151713B934F460FBC1B052417B907F70FA06E2219F310E34443 +A17AD4524ADCD140341BF982EE4D8DE7D969AC5621129C600231B16E97B62B6F618CBBCB +638020E75A77DBE28CB0EC9E4221F5D573DEE815512CEBEA629E6761617E69BA730B1EE6 +14C96D5758E519783F0862FB4F5C10D444882A344972A91E12051B2B29DFEF503D8762AD +895871D7CD4CC8BE62E1315831FC25712EA1C4DAFE49CA332CCDB5AC2C2D67F6594D592D +221B7DE7E93261E9D34179DE194AB2F4F4DA9DF9EE3EFAFEA6F1193940AED5655FEFCEE9 +E38DB186C5B5DAC4B0AA13A89EA5E81303A681133ED154B164E3A1D416DF8623A38213E8 +049B876C7C22F625A57248C0B61E4DE518F982E11672AF1765984203B7B7A17C2CD7C7A3 +847B6FCE423541C14C6712572DBE3BB99D1144021286B4E3939560998BC16A6CB47F9905 +BD48B9E25D1B548F6AED304BAD2823E364DAC055423B76800ECDA7C554211DB47BD28200 +79FE362F799925A8BEC4B4770574290D0654CEC588933BE1845BE51FDA15760DAB3257C2 +67E89BA950E833DDF7D7FC37F54AFE1954B006E3C758ED7BF3B28217EF77FFE36196D8A0 +A81157CA87889D7239BCC205459C3A11B808545C8A256F97F3B7369EDD1CF5D916E71B0A +77BBC006A71865EB15837635FFAED75D3172D91BF820230392B102D1C6AE05F36AD0236C +90133DEAF1B0F7658B6121D1F2F293DBCC6524C89A3554827D44601BFAB910BB7C908B8A +7EB7E84221ADDE214CDEB6B74765F2E8148F013F4D6CFEC4C7BB344D82B176D665A98424 +CC385736C4E1D81808ED22869C8132E5EFBFCCDFD1DEF732C3604BB683E4728EB60386E4 +D03D08E76B36DB7D39F07F505FC13A336B7AFF4D9587D1EFA16105FFFEEEB8BC2406766A +D3742312A7DA69A7B666A178BE43DE659D46CFB1A0309EBEF7B886EA3B3B554EB7225644 +EEDCADBBA3978EA1EB59B35EEE61BF1396A61922DC59487016F66561EFCEA19F30295719 +156A8C9099F0C07B5C076DCEA85C4924ADB96095AF46C1F9BA08BFAD5A4DC49E95CAB635 +CF1DFAE9A1FDB81E27609EEBE67A9636AF703415EFBF5EF0EAF7C10B1B04F139E60FE96A +6BB3104555EF08139F1641575A227E86F0DF716C829AEB4BC5CA32128AE75286C6CE0147 +F4D6873FF3B94A6CA54F701B9494B380D65E691F988CF7C6D74BF67A42F169FE5AF96CDA +656683349FBD542386DB635D09CC032C6BD486D08ABCD17A69C7FBDB61378024D2866932 +47E834F7BE079A875D8243E46E1533BCD01EAD3BB390A727226935F1BB5A9A1C395C92FB +679D980E6E67EECF4DEB74D75C164D53DAA8AA3955A91C29F28AECFC65BA8D7572374DE4 +F35056460B36941E7E0BAB36B8C28E081A29D92526D2F19BE960DB6CB355003BEB9B3054 +2A56413F77FCFA28B73258A8F4D473C04F8876C2B32901F62FDCF97261B3CF09D0BD6087 +ADD051543706CDFEF061C5F909E6BACFB2DCA11F38DA994E7BE7373AC2877648A0628662 +00AEE5E012297FFFCF714986436209EAFF78C09FBD9C54160A4D4C0629FE3F85CE065438 +8A996B462D6F520EFEDF8EA2578FBD42753A2882BB3FFFE6F65A89D0A74E27F306BBED76 +1F35A13A1DBE04D998F5CD63054D98D5A209E82637FB48929F7C70C154F66B6E40DB0F74 +18C103D628A4BEB3BD0455D886D752D58009ACB9D52EEF4F119F22CE23AABF40C558BA77 +5363C68AEFA720A3B14576B1EFD95405666BDB2966B36C206DF8DC7C2797412602A7603E +C13F0F2FE5747134C666FC26974D7FE913158CBEDA9AD94535099E136A43B962A93F881D +880E205772643F2B60C8BCEC7E4612BF86F9C0FA3A2F13191C1A6C3D50B35D6E07F8ED98 +1B6D2F8DE15FD9709A8E541A0276CCA6542FF3B921CF5A5EB6FA0AFD68A952114C9A3F8E +3B3FF6CFB9EAAB6DBBC62F38461824B3D0831C5E560C6459E6453B629B95F9D2CD117AD6 +E038075BE1D25A833FCB17D3FF657B483AB6CB82FE2AF17EC4AF1FDCC3FD6942A0425826 +3DE038F6D17E3F79404D44819424A2A4C559D44241D5F577FD60A00990FC2D14C271DBA2 +177747C6DE94CBC7C9C72D0459752D7E9680CE0181DBB43180AF135BCEE65DEBE77C1687 +078AB912E9183A60EE6229F6B9ADBA395A5559739C3E29C8B0EB221A036BA888FABE661B +F4D4EE0B4B6D62C5A6C96EF3C57A8B104E14B9DF763CC16B81729D771B557C4CD2191384 +0B40201E52A80869810ACF32FF93C005CD90B15F8628832CC689542A4D4DE58B55B050B8 +3E246BF54510B53218A2C556758FCC89C07E5E7D892AB0B9264529368EF16CC4BD6348B9 +57F2D5AAA98E0F999D4D400E77CBE175D35F004A19AB64F00169769EFE8E7D287A7C024C +A1A0D3F915EFBB25CF9604BBDECDA184C0D81EEB197FFC04B2190687D6086DC57FC08F7F +2DA512C57A3B9CE44115F9A6A7434E203CAB798A8ED7A68D9DEC0919B0B7B334337B652C +34F200CA9C679806B47152B2325AA1D1275B62F78B8610CE4D37F7F7DDD281AE294B7DAB +508AFE5492C4A497DF7D37837D43ED2A3D91C04ABCA7B0F7414A451ED560D20B0164DB0F +227CC753A9CD526F8C57468912A3780F3E9A6D626405FB486F6945AED27C48661FE726AF +EDF3D69BC7ACF0CC657CFFD5347869D16AC4C6ED41F643C9BC981425125B563065DD7963 +22413E1EBADDAA6993AA9629CF048863BB3AAE34B44308D27C48B6F4F9E8E1CE6C471466 +678EE304328CCD8EF1DE777AE28EA758360EE7BE768332794871E18009B99351710E22F1 +83146E57B21C72EB728B83C9BC618904CC0094FDB26814C8667AFA12D26076575D26106B +1407B08EBAB89EEEE0CAF34616054550D610DB759C168E26C08557822B995606459FE74F +1D085225CF359A8092A9175FB03ECA2812D7467622F4F0132EB4B1DC6C40CC969842000C +3DDEDCDCFA0E8CA62B214E34F1051F468224AA8D0867170019FE82F745DB85ACE622A175 +E50A3A371D5580313E08E2BE5A6262A83CF8B6DF0A02F258F81C636D02F381AB20166A5C +AD53633533D61E534CFAB2899BFAC061ED7734EF53E7652C6D56186FC27D54991C8411CD +D2E9D048910765AF119118607413B556016B075BB4245947B9ECB4DE17C38172AF945904 +92630EF8789A3B7D973C9152A4EAA90AE6C984622AAC31DD7952553DB1289CD44C16A3F6 +7FCF7BB135F885F083A539D05DD1128322FBA172737E00842BD674AE3AD8CB68D95004F7 +0EB5E23E04182E56D4E9355FEF193B4606D4C3D6B9275521AC4EE52E7148DE5196E7F84E +A8E19C639D8D20F70EA1D413CE48295B47880A8535F8E0A626E913543AD381A8259FC5FA +593DBE84701260503BFDF27E719A99635B710F44EB5382AC3E6444E6B7C6D5931AD45866 +08F06FD25CFFC918DFB136AE01275EEA017BFD989D0236E7297EAE998B198FD2DCA030A3 +B851EF96074946664C4C12A680DF7A412475EF3E641DE2644A11F9FECF59332241712B76 +4E6F32AA42AB853E51078416EAE47704A0063CDE2E539A46DC16516C1E4680A8B1785BF6 +CFA86A558F74164390C3D35DB0CB7659910B6709393EBF9397920D1CA964859983FB49BF +7DF5472D866E654ED33A10B1726A5F3DA71B93CF1A21AD65ED51DEBE5625236470C49485 +AA53F0271E41C2A20553C67DC3388EB8C51EBF88E533B014FB9CCECD1CE071FEB8353D85 +E89DEDC7AC71C3873601B71CCC7BA3B5988DED9FF85CD350ED374EB8BBF2813854EACAE8 +3460EC71E78B7EFF1EDC8EB3E7AF2764C63760B38F6015B5299A1B1969251CF1E80B8E50 +4EC30439ABD13E9FE242520E37F523A1CE4008A75E490C2D5283F66FF5CEF6A97FE86B78 +4551D1B4BA916A12CD2BF1434FC74F43342297E4E6BC9E0A0C9F54ED31CDF86C93847E27 +B3C4DF7815D96E6DC9E88DF85BB7956FEC3DE7E867765E6986DCF54BE77F07AC3E36F27D +C4C0BCAE8CF485A549534819543CBBF33C6DC3B04766DBC4DBEEE029DF6D7AF91D1170E6 +1F7968397BBFA987A4C4BC74CE816AAC3646A02C8E216BF2CED3FBE06C98AD6C5168A570 +98AFDC8F3D4C59616DBA4D3DD61E7774F6583644B27E85A670EA442C9D575265A892A87D +07583509186E84C57EC343221FCB436F363AF502CB6CE631EC7711DBB3C37FCAD34D110E +B82FF2F7209B3F68EBCA22D918D3FE424215139DC75CA266904FD5F6D40269D39517051D +5B077D26B22F5D3F07CEB35444782EAC7DD819A401590F38571C148EBEA2E682E472DBFA +43103B2183117A9002D04D419A7DB18BE5365FE9F8E2F8498035A992ACC07EE86E1A2AAE +1258DC4B4C6F8D0D930B31FD0EEA876D0D726C7328DC4D5C76B6BEEE6190EB3B650F88D6 +45BC3FB7822F2DB69C2174C93E39A70320B47816BA3E8EA313BBF34C3EE729112A0C9254 +1D09C9BFDB31F939E8D03E31BD3263500F7B92E6072E1A418F7A70112C7C3609799A7203 +3A1809AAA623C58E93213D12DD3A8C37F3E156A7435A42D3AA20E62DC8D4D69BC694DB70 +533729E878603C0CFFEE8D5A4C1A7F29EB6E07799846CC096A8257643A9F85D5CC913E03 +E72C1030636E078D42761C2C3F0E1E84C205B4D8A3D17F63BE4D70ADC45F2DDF2B5121AA +A4AB3D909D1FE0179CF72BDEA0250B110CB4F74648535A1E9BE45A8844EB110F60C490AC +BAA48F32526582B619AF1DCEEA109B7DCCE048996547BE21D4DF519608B5ABDA68ABCDE7 +AADC339F5626E64C93110B21C112E12B5E75F15A8FF5B0DCDFE85A1E2F0968E721C242E0 +4B9543CE6D394F8D00B20A007EDA10672C511445DCD8470ED2413862E6809C15A2E9205D +E522936138B66C44D5BB9B20C908A6CC8D6F6DEDF3568E5EC6672107A24032130CB5D5CC +B8849075CC87FF04B7D8D5370E0294C87D20283B1E6D54679D4E73CBD1D7BE72B992E0C7 +0686C5BC456FC44BD468B6B1BB22D7DACC0FF36C94AC831D391CB9FCADE8F469A5F89414 +B22001501F06BA70414A074A4B7A6A0F2AA2AEA1DAE282C549ED6F656394D187E68940DD +EEAFD5414238578E2A5757134DA9B6730BEDDF727773B2EC1A17E4DEEEA30482475C93BC +484083883EAC5E0D7AA0DAC552FC82F99D6522FEFD818F8023B1F945FB86AB96713B3041 +03F2B5E3913A5D769D5033B2B23D69BB7F21E34B0E808A750A89885CDB2B65B490F7EE6F +DD0A636187F0271C9DA27274A01D4380A02BDECD5D7A5A1AE228C22532838CCA3750A8FF +48D831F27F3712E85B956F03F534D2A478F8F819EDE0071BF9132F78DC0F5B7D578FC0DA +B3BA0CAC5FD186610C32FF89D130E0AB9E9E2980D9069D4AF6EA32E2ABFFE99B09BF4FF6 +588E56A2A87DB9313742A901826BFD2C80526CA519010BC7290C8B3A9F47B917343D0698 +E17565724A7DB1207EBC6B16B449D9E8B67F7CF227AF62815C71E553F644B89ACC4B9EE3 +A8CB7073905DE06FB65E44E0A762AA5D3A109B5A9092658CFD43E64F634BC8C16945DE3C +267546354C88EA3C459AF00C4DA9214692BDA482D65130CB6ACAAA37CFAF3CB336090A42 +E7C67D0961B02F1B2C167726893D18FA3092EA8B2CD553480FCCBCE14BE635D0399225A5 +F65F995B463D640A43FBFD8892A6DD3E0B284455EACD55F2F973023DB12EC59EFAADE85F +55139137DD595514800B235421CCAC9B0CEF4701977406565B494E6AA763FDE3127B2695 +6F0E38CEE9988649FDC62BB0C46DA3D253ED787F2997F0285CF008F7E34586E304AC3AA4 +87316B18797A189483105B0B4F9C96BC191A337667B58678C725BCCC51A5DE3FC6564C2D +35432A453B0E92F550EE81A89AE84B79C3A0E22E6A23D0F2C263660AEE964EA461A40BE5 +8D2B1CEC1CD8342B764DF2A9901F20B0A7B44E5EAB40D3F0A0601794E5B42ECB812AE487 +4B96EFF33C2BA5801A2511B074F335AF4A530880F73F7A4344D22B2A9AAEC85B1D26C878 +201247E53901F4C41CEE45555EEBB174270919C0448DAC16160EB7AE2B09E96ABD9C09AE +B7A95C4B5226D8F3125DD27E6CF0CF6E2A0D5CD6BFB414ABBC6C4A382E5B7F34BF4BBFAB +013F885C4F224147075FDAACA41AF49F4D9034C22B0B9483DE0B075E641B5B3ABDAD073B +0374B79BF3A07FCD45C148C8374401B57421B9B57CCAA25D4C8CC7C9EC5BFAD5879CCC93 +665C1BE2826EBB24893C36F75F9617BE4A54E01FC7A2F52DC845C95AAB9505EE18E370CC +B5F6DFDD80DCDA36A05051C3478022A57E91F4A078F5B486F88C17763C285A2CDB6615BD +62544FBAC5F75939A9153D31ED2CB79ACA1FF6F2483EA35AA9CA0582C2F2DE156E8BEEB7 +EF12CF7453475E7460A3E92DC95BF6189CE2144B23D4FE778E29AD6120B5B93F441D6FFC +0310F8F22E39393A21F342A59688B6C11A66A3AF852AAA03C46A932587AA5D3685A3F4DF +B1B857FB12619686F7FC6C2430B9C24F1311DDBBCFC8FC294D84EF5E99FF22EF6BB4B2D2 +20B301EB713FA8C76EC566A253A5A7DD2323D70FF5B48F2CA57A9D3F94C737326D2CBBD2 +2D7FEE0100D039D28474A64372EEC52C616F800C2CC1B53BA93A18E153CB91E089EF0F12 +318E3A844F017EF68C496477D1EFBED61D215ABE6467563A625FC0563E2A113B6A58C7CA +75ABA028750E3444F6B19DBD850DA52880F3D8B765A8E9310A1F22502BF2ACD7A3E40191 +3A1D8B7B79BA0CD8D85225CC31474CBAF4479834FF184475C7FB6EACCDD0D5F1733FC56B +BFFEA34E08A0B7EC795FBCFD8149E900F00B6E207B6E9464880A5344C309FD2BBBC58D32 +68EF30C36BB5A5C892013E8832BA813AFE822D11B3E3ACFD02CA56421671DA938398F57D +11FD157449D3E423DB6A0A4EBCE845936F542BEB5B31406A6B5C8842783A5E19A6E8FDC7 +94D322239F4866F9EFD89CD88D9FF11C167AA63A9B6707DB1356D757C80623F10B31C661 +FE9D9F118208851FB3DDB8B0DD1937005B15D900B8B854C4571F3A9C1D0D67909E1AA591 +A59B2A45B5D8F481EF7B5DD6D4E6C8CD5FBA9C812F8BEB1C2A6E4BF8F51D7A507D6B6E18 +1991B5D4955FE3210612526CF495CDF2C3CD39A26F4BF6D98DD43C4D407D261C603B837F +E8E09B15F403D721FA990224D46FEA9D7931D4CAFE3181F21B3B47A1D3910913C3110A1A +45EE125EE773556E17EB3BC516E336B2C7733D8FE30FB7C22626BF7D94EDF00FD945EC44 +0D4570B85180A90BC46B280069BBF5B69A3DCEF13EF0F159B07FD5DE0289EAC807EFD6F8 +30A20CFE8DEF807947EC1442EDBC9C32701A9CE873748F33ABE5BBA35A85453DFAFC4CBA +2F01ADE4DECE86290C4DCDFD676DA97B69BAC7A8BD920C4345DDEC907CA183FBDDD2638E +D5432F9188CEA76B10E40260C4A8B559FBC422C41143432EC319E1727E8989EEF94B85A1 +8FE398A4928F6554DA075ECAF0A5B9305580853E010CB59142F847621234B4B7DAC52D86 +151E920633C2951731D4534A174CA7685E8F617EBA01DC1C756F91F8456DE200DD557AA6 +830A506DF674D90871943F822ABAC2867414D3B9D8D410E8BE29C00C7FBFA5B03858146B +DEEB557A662A30F1C858376DFADD19125C60CF5A73C1B4B0BA6B6218F1BAE096C21F004D +8716DBEC943156F291C61FA23F1FC37C20CA2CA6CD42A3A1223CC0DA7ECCC0D4C2604EF5 +796F53C1749E6B5E2E22F52A2BA077D324253BFAD6563AC2F6126B3F94E160D579BD0DE3 +8806C554406E63CC803A83D29E0DDE72B999D345E655899DD0E9873CA47C216C902A7443 +3F54D6D8BB3A716DFA65239FA2AF27DE88A97E521119041FC89312C4B23AC10861590A65 +871B7F0731BF11E3712182E7FD8AC4C94C366E93BE90243B0F5C29201E418CDF3DCD649F +0D9A0C1696B0EDCB31616DB976F4761FD47AFC1872CAE6802FB506DD67737DCC10A658C1 +DA0CD9A920A96E5CECB844A302FF0C312C5D7A8801203EFDED0049FF37E9887132A484C4 +1D332E72A6FCE3C3D48705D86F4187910AEAD72CED404526CDCE1B8A34C91FFE62BCC410 +64663903D557C5CEE087600C09E32C8EB537EA43F56C62E78DA50FD5F598C0FEC55BD912 +BADFA2F5DD75523FB189146F92B31FDF6BCDD1119867C6480B258FB96A916092301679EA +E82FE1D96EE14E382B00484A2F983FA5272B2B86280917EA80DA0449286CE2042B893755 +EC15ADDD93C432CD6989F9B6B8DE2A83A94F2B5FF22CC849DAB24A224DEA14A11BD68F10 +06FA67E62E6507B027F21A940F7E63A09BC9BC5299143AEA8B008665C9EB1F584D7070B2 +FD5B5E0C10FDE0AE740FC6C5FFBC1693FF4D2285D87392FEAC408409016980AAC25D93BA +3C3F5E1F432706E6122FE76519F584F96A552D58855495FE5F0F4919DF8285C668416523 +DA7F2703095BFB3621FE24F6F2C97C073FC5AED60F7A32CDDF72327A1A0D32D58BB98F97 +01FF1F6CE4ACB58F44090E39269DA552D9E242806BBBEE9B65A619728E863896C26AE155 +6CE6915DC42ADB2E3A386FC4CBE64EF8CDD835A84783991F9274DF20FB6B1FEC860E54AD +44F85774FD50E3B7817173C23DD46003BCE91605B7F861666F0774489635F4611060EA85 +8D66ADAA95B2BB066285F485B6CFC8FD3754B01CA01266D27BFD2712F4DECF25AB7FEDB2 +A4455070BB51804379A3D4D184E89B1D1BF94F870800CADAA95FB57B1227F0B691D253D4 +A85EFB1D8D182049259115AD8272544FBD0CD49E7A9F551E22F027272C60A1367CEA64CE +49A07AA8183B4B471D83072DF31DBD739B6F64158165F8941084E880C8CC46F06F3AC420 +B70E97D8A8B3DE6478633FBD016C258DDD12DE9062988CB9CEC82E21D9960971AFBFE9C8 +B2DB92E3F848653BF165A78118962E8DBE219E4FDCD68BA661541B0220B2AA0CAD74284C +8F28AC3E19638A0EB29903E703FC1145A0E9D33584455E5D1FA7BD6A733F8D8AA9AFF447 +583B0176258139CA3757A4FEA374425E9BE34B4683B392B6E334951FDF4E6047077B7011 +39F27A73FD2B4B115D8D408EA5E14636470794941040894AB66F19EFCFE812AB289C3315 +2EB58271E458B257F63715B3C05B454AAA50290F32AD47F089DABB1C480D92D69FF08211 +7C867A731F50E3EC9DA99D966AE570F584494A3A55EFA002D97D3A0EAD08DAD1494E57FD +61EF7BA94C4D0C3E85732A07994726452A69DB3C27DFAFEA6BD6A2D192264E6B4B846A30 +A6BB1625381511EE16BE4CD4D5C7CE332A8524AD748DE4ACC5E08F3167E99F63B785964D +B5871FCE8BB244F5DA0C7F00C5D198B13904D2B57A8399420AC2DF333B638F2A29B2E261 +D447F2AD9EA4F11128EDD65C6524A6B53412A7E92B1F3D7B4F7338A1CEB909357ADB0819 +57C48AD11E96AF967A60638E91B6FEEB4AD90C33F98AD1EA2B51F302B51D6D1ED82DBE81 +3DA68ECE9BD145FA28B7B6A5D6A9F7141439DFDA0E2D59530751F16B010326B54FCEEAEE +2E5644C6F693FECC5AFB1F64CCA65DE08A89584B90D0B6B5C5F4CF75F2C2B1CFD0D32B2B +F7101CE6BAEE7D0E845E975D44FDB3297D0944B9268E367A2608BF4BABFE4142B692CD16 +73AC17BBFB416A37580302558CAC6F7549CD60B75C9B5960A86E050612E9EE6DEAF19EE2 +6219E9C5D28AA076B3FA2504C1523269F093A0E00268E765CEF7DA0DF01AA3DAA12926B1 +A89D9BB8ABEA16CA2D2867790C7553E1E87F8CDA07810A4D94AEFFBC15FBF4D543BE0967 +B11D2FBD221D5BDDAF28718E4042000F5FBC07CD343FC7E6D9A94B8F6E9EB3B02D5BC584 +9AFA37ED5AEFAD28217ED06986DB0F51D4632CC5D1E2A49B950C3666815FB44BD4059294 +7401269A17539E88901FCE325629E59AD0CC15D6C3FF32D2497DC7A9797582D88C7F03CC +F2F230692DD463F4A471540737E6995FC32200E7BDAE53AC1465188312C2FB7B52ED98F9 +FE530B8F1CF8A6675FB9E603F58BE9CAC46585B6D305D888822806BC5FF084210489FB79 +2E511A939E01E69AD152624777EE98EA396DEC7D2C633290FBA60BBC153D9A0C1DC5A269 +740EF5CF4B2879A839932E1C8850D1EF95E8B5A0D719351EFC71D7AEEF92EF29D3C41D90 +86DDA4AAA9735908CFEB590E365B69B2D2FEF8193FB2CB24113859F3BD2E99F01F2B1B4E +080300193B5AB6F7711522EEC833D74A13F8686A6E585E7B6315FA28EA544B4EAE4EF62B +88B781FED5741046AC84484CDD1B670017F0D0D2F19D3EF24E984B14CD052E3B38553850 +6307817BA3938801B9E1D137447D979B5148AC1B822D49059EEB945AEC4DC1EBEC2FF6CD +DFB19A0370A02F9CAA30B6725A6CDCBCA72242B805E6559BFD292668FB5ECE523F0F44E0 +E75D483645B6988AFB0D5E8EC5688CB56B69A7B6A7F160ECC40894BAE45AD555571CC25B +A86E81C5931DC238346DACF3EA05C078D309693F1E812BA249D84F6AD605D073B22AC83A +F2749BF32A32C9115AC414D58A78D96A0F480C706266244B6A668486F54A16973E7A83B6 +36EB03E66507A277958C19D9AD4DE66BEE89B7463731F724DF5650CBE74EC300665131C4 +01BCC4D03891C6ABB61FADEDD7C83D56F35BAD5D731E0B3EA4F9C9A07FE5D3DCE21B5BAA +1C8E79B19E38CD61EB802B2C2F467D1A8129D45788B85C9F7B53232501ABC0768CF3830C +308A87783868ACC346DD0141702B517E5C07B5E29B238E55549F98EC3BBDB67EEC173ACB +0DD4B3550D958C7E777D39F9C21CAA5B51404C28DE12061DCA1CD427089D2AD99D23DF19 +B0729235CA955CBC5E4077A0FFBF3BB64ACF02204B706733BE9CB2EFBFDF21F62E4E7ED9 +34A78E626472A53747557AE2C209324D1F8278E31FF96305F0BB41DB5B165AED08AD9312 +F1FBF368E09C4A4004649E40D578DECB4A1F82EF4EAF76BD8CDA9C4C61EB1E187E7E319E +03EFEF18E4969C5DCAB53D8CF41AF5D4DB3D9CCBE23D1A126CB60B1864DEF1B702995622 +9BDFF2387711F1F06B807841406515B774B970666855333607B4DBEB4B670F6A452AD43D +FA2F83DF711AAEFD9FD74A307335AE574B4097AF88C2B4C928BDBF40F822BA98F7F8CBE6 +26DB9AF8DB0B6A309680C026E9FCAC9A541974056EEA1A0F9F71AF08237DC5FA78D8C38E +5E057DD2812E4591CA207000DD62CFF38CB97C8049B8CFDF0CE6BA900CCC85E02C758C1C +27B00DBC3FDDDE584457C872ED79218368C8D8F36079045A6B9AD62AAD7A53E2ABF1AA60 +4AB15BEEF2736FC7AABED55B17B8E665B58D03CC42F70EEA4AF5F1D82B4EA91ED721C498 +DE4DBFF06C3E58E0350BF931D27189680C68C68D73555F02B76F1A786B4FEAD6D6FF846E +370790C8529BEFE512A8AE178689A55C747FB7603D3F9A4BFC36FE91CF212CCC569CB895 +7680FD2D466A1C057C0022B4972841AE7746C47813AA324519B461AAACCAE87134DAA64F +093742B7B3B691274EA2148071E77E636AE14ECD0CC3C9CC7C18ADB23954FBE043DB23E4 +DA069CDD55E908173D71582A774B57793F5228274CA43C4EC01FE31CE14699656A9EB6AD +9468D7CA25467349B9F56CF2873A09467107F6B9C20147D2095B7294FCBB671EDF0B804D +76F6E1AA7CE9D7CF60CDF7F85AD1C410422A779B908F3E6F6C8571B6FC4F7F012FB99FEB +4292E9F354A3E9DAB81E22D4C75DA3BE9C8868BF2395D815D097010EF8A6A58CC91A6FBA +C59344E785465D4B91F7633D1718D16852CE793825CC4B422EC90C3216999A55400FE0F7 +CDC38A0F6360802991885FEB799FFDB3C1C87C0127CA781A22BFB9AA8A6D6E414DD2C31C +CA6304577E4D617A5388657632349D4F49D1582152E43683200FC465146137FF942F1888 +44975B7A2E508083B0261E8EACC54747310FFA32C00A0DF9B59F77A360349E259D9DB841 +47ED76941E8C8C6F053116A004C3998B7C84D94B60044480D048AB31F355B8F6768C189B +E4A024183988E8C3717BE19D29B4BAA4A94A3624C0DC4F8A7A99121DCC71EA32D2B8D6E3 +B4DAA6B632E8D64717D32CC76C1322BF2FA82D3C349E7FBFAC44BA0304E4AB4A8689D819 +CC3A0DD336BB7E45CA84991DE87CA3C615E3DDED468DC67E402BAFE01E096C61E0BE0645 +AD50A227015278116EAEBF7895E5513E4A811BB90E1D2E204F3E0E656B3F75D25008E84A +9FC4AE44628B7B38A484E23992C2C1EC229EE966480FCEEE199F0892689FA18B489F2C31 +F2F2196620809EF6E0524D99A86C627B053EA195870585D6B3C54C3B55C80E352482998A +2673772C4524BB4467A867FD953C07504C6154201CF96D422D0A3151342FC9C66DE45FD1 +29EEDFC9ADF67374A4C1CD2E76048EA9D4212A32F468E74007A6C3A8251DAAC735228DA0 +5C245346BFB1903F217D62F63087721672EC60B846652D9CE8AA2350919ACB2D8490C6B0 +5B63EC808D611BB1D7AC1CB102AD7350773DC8248384D1FCD72953CE507723529CD4202F +AAA080F519FABBFA48C620A1511A2FCDA8BA96E7784520AE0093AC58623AFCDAF0EEF6B2 +5DC8813512254752576AA9608DBADCA38F319EBF5164C1244FC3B6DF2523D8D8F19D23E3 +53C1C484FA52DA7B8D84D71100B076BC3082DDF29D6A14AE8BBC72B1626F882C1B98EB3D +F31DE2C5174A0AC1E5F2F82EB3CFA93EF6741473DA694CE020EAC6E1EF41636351E12946 +E3BA2B1D0246D059563F2BEDE7A67648AE6CA534F32E52FE7F4F2CC936F9EF70C8EF1597 +A073E36D237BD34A3CA8BAD7D01C54BA5012C690D680158A694D2CC0362B7FFB8A888A39 +F2CB418D7FDEC46B0E5F104A032581415B083A992D6E8CB4D0E9FA93ADDACCE7BA34D919 +9E579DC050DA9032B1C8ACE46D1E2D224556FC0FFDC35FED173D86FFFED1AAE13734D1DA +D2F06EDFC4FD311FC2279A79783B7C56928D5EA6F8FB4560776F99BABD3D228E8C62CCE6 +C06B7A122FC441CC5490C9085C8A469F524403B8ACF9A607651464467DE098CE068FC171 +55ED9489C819F31A3BA4E1EA3C728212D8C40CC1FDA9EC60AED881A93A411592719E4FFF +B035AA8F25B9DA96D536969496A96B05BACF2BF1C7BA6EC50759CE388EB3625683C753E0 +E3383877F4B2F74B1951730F51ACC3B0107B6DAE39AD2B17E78B4194F5C8D162CA37104A +E00F81F7E254B4D1104C01F404F41CEF92CBA628122589CED905CDE34196FE690EDE9CD9 +AEB0B9D7645D051E78CDDC34B58A64308A2CAE739A825F18525688E03E6138F5DA8D8898 +539F5E4BFC1C64DB496A16D9542674AD655EEA6DAB57AE3FD9058532AD0301CA47AD0B4C +6998716CEF388E0B2FAD6D14578958FFA3330E3759FB8EBC2C25C61EF372235135D2853F +CF308CF00441DEB973BB742C7CF4AB0C189B9FAB10C7969777928CC525D9C122781AEFEE +8B82537EB27D7B264F5CC973B096B13C688DA097128CA6467997A5401DCD797F08EBF73F +AFB5EFAE784C63F5D81CB073FA5DDA3B8F78FBCB37AD0CD54514F07C59B6FEDF0C86FC6C +C0C5E03D5B75B147D0EFE4A484A55555F7FB840BC2DDC488A1AE3C26A22A7975C57090C5 +D2A8E484E6E7831AA47BAD43DF7C1D5C92AFE866DCE8E0B81E5D36DAA24FEF28D44C5E67 +18B277E8CED636116EF9EFC5DD3F06241C40F23A6334BD4C7DB7523C565A669C19EF1578 +329B297AE7F4EB69E25EC5F9BA77635BDED28ED33E3D1FCC4EC257E4BAEBE188003E3AC6 +BB930837230D7625415B260E4CAA348690646BD20F33E1022E1926AC163A59CB3BAD761A +CF10756E27B6FF79801478D2B3F1CEA0B64835439C60AA4D861B7C4FF471A169482B751A +C64854226AD0E38528F72B72FD8472D83909464F26AD09804D05D3B6DFAAEFBF0D0AF345 +CE1BD364299B1646141C294AC917E55458DEAFDDF0A9734218D5F5685F0ADDEBE6231377 +006D9E3FB3FEC843050CE2050D818396BA57EBCBA3ACF483A42EAF1C434B35216305BBD3 +F9598DDE9BEE0B47A4B8984849063BA638D97AEF425CE3C5A82F3A4B2CCFCF9711B77599 +32D10869BA44FD4DE4D9EAA863C811DEBE27EB910C265492A45BAA73973E3D8849218608 +0B6285D62F797879D6E118341BBB8AA44D0FE79DD91FD58F988D53AD07C17AE0EDA91C84 +8F2E83031A8BE1569D1E7FF432BDC605E434CD52BDBD52BDFA689A6A52AA4204BBF90ED6 +5A206B03D55B8E275755DD2853D6D944AC74107C3160AD7E87324BE16F5B0D6FC37DC819 +8259AD5C06483BC15F983B4FA914BE907B9AE230E655EB1FBAE374EBFB84553420C34D61 +AB2523A8C838526A9C88A1467E0C27AE1C3DEC1B011D156C8D8C2AEA0B7ABDA324656AB1 +AC7D4F5CEC922426E9D5DCAD965E0D4D0C5F4A223230E157A22DDFA14FFECEB183168421 +CB6462B3109211D59D9F00AE30827E55F27C17A7248446A21F4107973B0BC987919E692E +1F76F7F540F7A4C440597B265290601FCCEF11BAAD4FAF3DDC4AE6218213F42F2BB253BC +E6B0EF2E6C3858988141C626DA7A65D7E48175E4DE032CF76619736AE7BBE01C026A3970 +EC79C5DFE931F076DB5F674C163E5367F03AE6E2E7271B273CE5EF0004D7AE89B63DB32C +0064FE4980ADCDE7357820F5943FF1B2AC49DBA19B2F124F15C7AEED84CA6F15C30A9A39 +3C7D492A0460E2000CDA313E9E420C5F5E47F959CC2329B6F8A1B7B818F0D44A2A176614 +D847F360F445A4168693257AE71D832577FD2E432EFF0E9322B3B4A404EE13501645466F +5CE3B19EA1016D089DF6F96E5377A68592B981E728FE3DFB2449C7F187B3DED6F5DB1D55 +14FAD8DC06D95B6B4377AD1F0BCF7B744EC490328CB734FB1A45506F9B6EA2B85E7CF093 +742CB10D1D5FB7664A9A7DA82C2C2DA07F43A95CDFD02B9EE4D954B2BBDA540689DE8A37 +62219CEDEDE4C78F7E314EB519996C0610ABD85C749012C63973AE84DE4BF8B6B1333024 +BB6E856DE3BED4C890DA1B7612689910607EBC32814DBBDBF179AC0E7C8C0A31B19775EA +14DDC7057CA38E53EE24A11CFF34A4E78672C14B215A8F7B70F3B6231E8C9E2206052580 +902E05AD3FFE970ED2228053898E3EE2605B4D4B364D463F0F3ADECA545BF39E0B14E0E3 +A7E5429E661A9718CC86D935E11FB2DC10FB436AAB75BE0AA27B8480AEA99AE6ACC68698 +7D69781BC4791A2A202B0289BADD16C29FD7A5C7C1146E51B4441F1BB5CBBB04D54C336D +B0AD62057F7F97AF8F7BFFAE47D1BD86D2936B8BABF25E91E41CD8917AAF282949F0D9EB +1D4ED2B89478BC159FD71E7207A65437B20D18144E4BEFA99C89983FBB71240EAAB20E62 +40E63F517EA139D1AC71946470F28E0BC26DFCFDD4533FA5BFC0C663F53C42BBFC16CB96 +8C0E61E2A6C4DB7B688ADD4E2F9D1010FA4B4E8E278236C66C7C1E5FE6B3EF982A970C22 +11006A98ABA967E7BCFA17176463E2509AA6218FE0A7CBEBD9F9151370FCC669EEA0AFA7 +265F498B879C4C94AD02327D680059C8F7A388260D1013DB99887C5BED8A68925C3D9E0D +56335F93A402BE584D1798266F41C5FF3C647DDD2C2D788A7A56C8278303C0E9F20F8595 +4F6B47B79B6CB9C6FC80AE76BABFEC2B750B5ECB267A6866AFC68A51F6FAC54B84B9FDE5 +54165EC7104F5626108754BF07116A75EDE93A35CBE84FE778DC3BD50A8421A959B512D7 +E7881889E5AD2DCAF9CEF64E86A98BF5384D4F341B53CED94D430F3DAEFB506EA693FA23 +6830EC178791B015ABE069A44CE20752334986A43EC06F8ED44B0796FA741F0B18BA5821 +10C4D7C3B9B681047FBCF17DCAE103ADA23C9D41955B2C0DF276D5DEAE83A941E8241B51 +DD9FAC40AE8FA3B9308470CCCE30E17C1C015019E1A69BE8A054194A1190B956F414D473 +DC5605BC7284C0025F01A715D7282736704B3E824BEC160772EA327572384DFFA650A292 +FEF417B2C4B395AF893BCA339134D3BDE3E4A8CE7D76E2556C59D7292003C5487DF76D55 +4549FE9977FDDE5460389F32D5663656528C257C2057EA3EB5D70D20F550824C71DE3212 +32A29241C8BE67ED9540B3F461A001C8F63898DCE28423A3F5CE806DEE0B50E8F5A76C86 +530491F67C48B8683996B6BBF6DBC1666BC6E9B2BF4624701A67B52F792333DC12CC6142 +B2568EBB0ADDD4F9F3443D45204B013E098E62C6ABE0FB14C2158574A7C0B24EDCFE3557 +2C5C30294889CDA3C7C1C67558AA3C05D012F516479DEFCAB7ADB890F9E96E9615634176 +5E8BDD3CA8E85DA76443A538AD530EAEB42E6876FC74AF2B6AC2526F64C8D323B5F5CFC3 +BAE26A4F30D4477EFBDF054BC83513705CE5830AF048CFEBFB4AADDF2E7483A4F1860D18 +7D318914C3622F4EA58942D5527484D2AF2D0AE2DF74A1975268F9ECE82E364F5A3B186E +39A4A10049D6358C044B6B05E9B90217D0A3BC0EBE473DF1A7CE2A4DA8D5648DE7BA58DF +0335B7A4C4DB44B2BC583DF0394BBF14541329B64142B6FF4E37F523DDAFD8C1067DBE8E +4770563B8AE958C26BB51920158795D0A4DE9DDD3C2874A572436749FF5535BDB59E8C83 +E421F605083516551E89A2FE34FB9B4AE55036A3D7ADC71F64281A3C54EAAC2670CB34E2 +AE94E71943719DDD21B8AA335EA3181896301B065FB0519AC8160BF9FE18957E5B72396E +240ED3A9779F04FBEDC858B2DFCA71863A17E73D53958AAC58CED0DD0026D562BE9F395B +49C12C0C29D4B84C28881D17B10F5026F8B208BAA6DA070F94110587A76E00282D3CC5BA +D88C3A9A714C063F8B325495644DCCEC332257733448C50A40DE95BA8E5AD73FBBE404AE +EA1B1F49DE4F9F1770B73ACB5E9CC4B5D1204A97335197B14DCB3DA403DA430EF0C2CB46 +E050B1E17FE0105A619BCAE09A33CA4DD54E84B8568299C1F2EB116C16D54DE40D9880D1 +B2FE45706CF0340CD591FB94B130BF0EEEB3F1EA675B032AA0A780F0E0E69A63E932E01F +43EB43DE97EF02CAD65BD2013569695789971D843DF14DEE9A32A1EF22BAAD4A4468AC40 +588EFF9BF91CE0C09C30DF0E2504AB95E85E70F6769679C12EC83204FF0C5CEC67A26CAE +748F530A80ED96E3C6D28F8F12F5B3A7A53B1BE5B096B0D186784402A3CC1D4EE4162128 +D0FF956979EF79DEEDB9732249CA150D159D1FF502E33E4A305F066A9617BCB637DEB999 +DE15A2DFCF9297E2E93F65D90A233B7F512882AB88439B26B9C672A08EC301262BD37164 +37191838D992F15154E96EA15454E4EE9E9D4C01CE2090120620F5E5A0849036975EDDE7 +9E207B17DFA344C8300D07BF024C89B9621F8FDA10A5032197BA4B6C127FC68C3D1397E2 +88219E9F151363321807084F8596DB0A24A8D6E41732C843C01843A9B4D9C1041D28C7F3 +F4DD289EAE019B6E8A3CA2952A8BFAAE3CFA6F0527BD3CC9544196A0DBBCAE1F095C3674 +B34358049CF212CD96530B9875DE99D93BFF4D87E544C7FF8E79F757ACBFC7DED0A8FB1B +4BD53D1E76FE95E930E3F329DF6310107223E4E576F38CECAEF561B5E95CAAEAD603B792 +F1B1BB7EBE2C73E7144AD8D50F0581AE74C9A811A52E986FB6E249F9290E515639900754 +C8FBF4ABD9F642970190D28CF4BEEFC7C39D1271DE2A357949A69BDC6D8343487BF6BD25 +1C1DBC1132B1FA6FDB4D3233ED570D9310F8C9DD92B7217EEDAE942A25DDD6D5C24BB4F3 +9809C658BCD0CE41C70709AB8899E4956D9615C1A2B1A627E47CCC17DA3454291667EE26 +AF97D99AECD1F7AAA7AEC910734786FC797D819AA8D539D10EE8DEF86E4499010310E241 +C9FCC7F3E2B0FCC692D9B2D8346717A5781E6AACF1A891E2E6E65225F35026AE348E0E16 +7475CE6A9A0C14FB588A483B9483AC475043907935061B48D03677ECFEB8377235E44F7F +581F02557B6F009E964A4C345494EF9EB4427ABF1D2DECCE71A87D55C57ED6E561CFB835 +8C8A38E387531A6D04AA87F5AA92D73B2DF8C972402001B9FA67DADE45F803540AD55272 +AAC3A49F23F910EBEE137F616544F86DC7E33CF672859A545677018279B5D1AB673640DB +4EB45C3049D2BAB6116D34B3CF6A88ADFCA5A657E93C32EF5912DBCE65C9527C068D03D5 +A23A29E934391FB4317CADA46B7CA8A4F0440CACC958028D20197C1F1C0D3CF39F107548 +5928CFC10177DC70FB5133A7ECC5C82C978858DC1CF44A53B4461E85B6591131B19806BE +EB57CF868D200A7F27567F124140D712AC0DF6D6FB8045671207AB0CA4735D4422EE8133 +3E0143072416E707CDEC20286F72E3070E374D79D95CE144AEEC86E6DC9001B991F15CDE +9EE7E8368B4BACF9DBA6E83848E5A3088C2858C71BB5841E990BEF89DE5ED42A6EF9F0B7 +8127DBF344A29104E9272D0ED77B5C32D245B17293C54F8D939E314350B42D95A3A2F4D7 +6FEC437F8CA935638E8558D7919ABD0DBD6323F83AF703B38E8445FDCACC8F1919D2BD4D +808D18FE28285B62FA958B34CFF05150BFC884F0A323F67CBEFB98B393607F500530A1BB +CD2E2C93D25EF97621F872091C13D1BACDCE7DF636FFA29B24C51111E7C10F0FBD250FD7 +0899B2D370B955A7B467F9C726CCA0C1B05938FAB3357BD97FFC32A78589BAD9B54CEB88 +E0C95CDF9387637A043394276D50FD4E6A6170DB7325B11EA2145BAD3643F51114332630 +229198CC4A68C207E61284CE848E0CB6F9F7FB24E72D5D0877F2697F39F7F9F713FE2360 +A199760E993836E477943388D08EF210C1C782E086639B507CA9CD5428FFF902EA82B280 +DD203279043B62ED9C93150CE5D365C3ABB3C353172273AFF2C75BCB68FADEC1964DAABA +777D83401AA12D8B5173796F691D8A2E9BE7FDA49421AB46A014EF1C566B78AA4889C684 +D45B5C9181DCD1B12D4BFCC354454B6A85C4FA25E74D55A1C6CCE8C4FB9ECAAF885BE22C +A5DBE8ECBCF909D4487E6C64DD9B489DF6BF4B1F2A38B7D18983B2E41696D55446FE1261 +11A0940EB96A23142770F5A17CD8D89E85C6CF269F6041B0F32467D1DE4C0335F543CC07 +492BD7BFD0209DFEEE502FEE06D2D0EA9A0F81CD36DBBFA8E386BF486338444DCA97AA8F +83FDC85A8A88A801854C22B3849467A660173E5E81C055E30CDC869B1BB9C367923A3491 +F51197DC9971B477FE060AAC5C91FF8D67677C3B08705254972D8CBB0DB05A10771844A8 +4391AC7B60179F20E345D2C9DFDFE1C42D947DB12F84F1CE05991AB56FE498345230BB3C +7F92A3AF86D20828D86E931BEBC818BE595D2E17D3F9E105E39649E89E13656F9461087A +36E1DB0DCD850BBCD07249227B65E494CE8C88BC106F7CEA5EFE48E482F66F5F6763A766 +0262501535FA5FC71CFA87BFDA2F8FD2BFF0553D2008EBF081BC56BBA010C00081EA5D80 +190C4FFD7A105FE500915F6F652A0A00FF97A7C825E8617077473C38B5D820C24F78E387 +A776A8904C265AE4CABF3D1845011DB66A4D732F842FFD7CA1F5FB53714D0EA9F43AD20D +280FEBA87134571F5405A57094243FB22E12635ADBF0D1900E93684D1D8B5EB04D9D01CE +A3CAD54C9B4666E336DC6EF82DA6915CEC1F11C89E249B0A5C460BE552BFB4AD545CEE0A +3A97B65EEBDE82FA1893442E7446C901C50838934D82DB73DB7780946506B966CA83A142 +5D1A82EA07C3941EB1942325E258A5F39BC9D7B8D84F7AC876C9E47B854BE1D40154A54A +DC42BBB5E5D318A6E8B2B985F2F87F5A2486F261CCB59F171111D04D29E38CCB692F21D4 +E5909148ABDA6CE4FCD577E3EB39D8199C63E1EE22443B0176D84D2EC501F16BD5B01826 +67DCD1C99DF0A8B3F27BEDD2917BB900484171D2AAA6E0B39FED994DEA6FBA6877EF4D94 +F552177A83541F4111D1EAFE83A5D102A011726403648B148DEFD8754E91E52BFA9A5F80 +273475A427EF5C5CA4D981A2D98AA00A4BEAA2779FF342B5EC0A452F860620B88AFBAE3E +1FFC666C05647B3E73CD54BF35FF47411585FC84CFD702FA116EBDEB396AF5D9C298C3CB +BD97E8EE08EAADB0C854F18D2AC5D08771ABBCE5B70895E8F04C3CCC49525BBA4407E081 +62A272E0F623578EF4502FE2DD325DD87021079967B1FD01B95E8A0CC6E65317D947B340 +7B42052106F27ECBF69B431C6D73F9CE9220BE91C38E1AA2F9779E128BDA6A76ADE5AB3E +B9744A6365A95368D5F7C9C297F5AF8C0E21B16FB8B8DDDE4AC3EE393BE599B2B3E3698D +38C84A69DA371E8C323EA53BB232F07A761473580CC3F0CBD5C73FFDAC3BAFBB1D9E7D77 +1CA641EFBB2A190E8DFCDAD040736BE41D29723711CE965926CA4A56C6E4C5FEE60C6634 +C3B3BBE74BB0ACB8BC0FF9C426679D863DC1745AC462037444B6631529D8A8BB22EF605E +53297B146FC90E7A751C5E151545E89281BCBC7271731E5B0362994090B2560A8E62858E +860FF9644008AD601B15FFD2BC3D25D06FA0D78F003AC39D89FE621C1E368BB9221E2C59 +15A56634D5EBB299635F48DFA2BD37431E224E38CED95C183604B9CC3C8B153434D6DBA9 +CA955106159337D2709025F848B5440990957B0F12D416F823A75EA2567DD02849BB9B98 +FD5F32844E8F24ABDE050C333DCD9C9E4DFFD97C22C0045740B6B3E94DD8964F1E601544 +4465655844C809A51B9658EFBBA085489139EBD2344E68FFCAF99BC6C50C68C0C03EC1E4 +0C378E68F1CD3A8C459D732377514B1CF1594627569C16F9441AB05F9B4D7B1A6AF79E5F +E62D1DAAF71234F31509DD947BF67EEBFA0FAD13B794D4292516AB84FB96F5DD8C6D65C6 +0B822B78E917D7BF5BA9F2A4C90D94625B0DD2E31AD0D12EB3AC5F882F72D07F88045B35 +55AF20B6AA3648EFD5CF73798F3CF86B139C909D1D253FDDCF78F0915EF8CEFF7FAD6CD3 +C784BB88B8F31D1DA52FC67500D064DE56C233C333CAFD866D102FAFA71A2B2FCD2715EB +47C5B65909EAFDC5250EDB78FDA4854EF0706F226C1191ED8E1ECD79A43BAF7154547059 +D567146000900625B22D3F7E356DFEBC00D4B6E6C1296A4E4038973B9156D5D748B6C0EF +0B82B459E24670C9A951629E57FA90935E710899C37A5310822E99AD7D7B32018DF94FF0 +E723CDFFDBA6BE5DE8FC147C794E9FBD12D3CC53C5E14A328F6FC6C6FA479A0E0F760253 +899B220E7ACFB537262764F994D680BD4A48F618E7FFE9E92FBB09ADA32A7656B14E53C6 +B43774A908AC61698B44B4FF91D6BBDA42D53DDF348CD277A2A07A0ED439FF4D94F769D7 +6FAFC6F19F7A307927FB233796CA701B40A1C3E93A98703802B5D41F8A57F0D699B7ADEF +AD6D130B06C3D34C8D2414A21C75D4FAD9EEF2791AAF7731033336E141E15CFBCD7C3923 +C663CB78D678F222738BB970C5ABDEC1C983D465F71D8189A9F1A031875460CB9E46FDEE +A4074549FDE7A01F209409850C6848DBD1C9EA058A28D224363CD796F106683166A00DF8 +F5239AE3288F9D0C14E05217849FA07DB6DE17148462C0AC9195FF3C20B76C452DC58273 +3B81BB7526C69124C4AEFC411FBC581C29E01494C28F40A9FA088AA7B727E5C6D8842122 +79BC38AF7593B2A53E8B0FAB585CEF88D5F497727EF2342F89EA4901DD5FC97AFC1BB805 +817AF7C8FB9E1055D8A2DE3DC09C09BB71A999CABB055C4E2600D91BD4A0A6FB2E9066DB +CDAD3FC26D0921B2B9ABDCF99D74CEEDAE954EE6AC80E6AF69EAD98BBF0F14788D973381 +5714B6C0BDA27CB3E7235065ECF910CF27DA939D6354D3CDB120FA8E0E1C28E48445BF7F +06CE9F6867641A9238175665ACA110E8908243CB693C60D369E1C12D39ADCB6350395F6E +7ACBB1FBA75E91D21C141394842D6D107CB412C754C0068DB283EEBF44046213B55C2BC2 +5E403DE803680684F0F5E2054548D3AA52D5EB1F4E8D32279697818359850B50DCAE5559 +B000B4D74C97AD069101159A5FC03C66FD88F44824E0D28681870E6FF118DB32ECD10A88 +1540C1B63BE33ED8EA640F50C47055797C2E6A04BE027BA3A2E8F9344FA48BE1EF0D3A58 +59F9CFF0FDFF085F78712C711D4AEDA295775AD416408D226C4DDDFED69F5FFDDBD3D6BB +590EFE0CBA5404FE99FC4AA90D53FD3CEA35AB8042784717D1EB67529B74825206798862 +08D744892CFE8944B9EDB4452072D39363878167C371C3BE4816955959F7773BB66AB794 +2A2EB43BA482610A388035F9542C3D321BF1B1FFE827812A6C9A2F22B17CE0D04BB34653 +02D0F9331F41370AEA4F1B09AC2AF71F588B250D4B777CE024E9280CFE9EB36D9CADCFBB +4C1BD4CCD1C035B15D736C6F49AC229909BC877036E6F584D4155E0D20AC99E41040AE3A +23A0645A1B3C8C9553840388140AC1B49585231B98797C1C19D483A6E69FF566E6DC0AEC +71807AC1F4D3DBEBB2F4A4F6576DBA8A0B1B8643C9BD1D97A912E90A737268F6A91E0A70 +FEE73DAEED851EDFC631701755AC7B2EA3EC8990EBFB3EEB64B75FF320BA84821750BE74 +F2F2C8097EE95B2402D6F4C31E1BB947A5F86168745F8BE621289CB65BB1AA299214F52F +80950D6AEE089AD94BA4D19B9767B4B3D3CA631DBC1B2A37B3BE026429532E717BCAEF7E +8BCE17D47F40F3665C00A0BD87BB6033CD56FA275BF4BD06CF4F2B0ED24A061064092815 +9D73667E820E4235F1C4E629610A1C260C43774831CD75A5375399644CA9C46BE2F516C6 +7B059743008E82085EC673CCCA702BF07B8A9F57BE338D2D0F8D2FF6090F3AA1BA20A9CF +C02EC2471992118F070FEFD45B3C0FC0B55162490FA9D9DD60A6732532F1AC45A4D5ADA8 +DAD9ED5D24080E2C94F6A30ACAB0F075A50EC19544623D14A5A9A783A61A75D6F6E6249B +7B4AD8EDDD1154ECCA8ACA427736DB27758A0D7AD3F79745FAEF53B171D96FC735281986 +C4214ED6754154011F4D0B1BF910142DA99D3BAFC74D8F2BFED52422BEAA5DE0BD18538F +1C8CA315FBE5510954227B90718FB84785E0ECD9243B7C991690D2A7ED913E5080A15D27 +927BF869EB1279474726B8317FBF9B77774B2A97C294D56D02C40087DAF596AC35C2BDBE +CE3CC534DC34CB2042F85F686F4FF4098890439464D56CD011FCB85BA87C6B51E9C0ABCC +EB9A96152F5137E6590DE02C9E9C24D133FF585394FC59779F64E1AEBED7A007A269482E +E8943604DD95A632EF16B0888DD6080EEDAFE8F386E05427DA25E6D15E38BAC599A57266 +C416F20DB2B81BFB7AF0F10223DF1E760C2B3EF6EC37AC447833E8220604CB3643CD2CE9 +53FD9E2D22F6053A7780F79DD161807B661E196C77DFED2AAA7ED10253943A7FA2C25602 +3586BF0508910EA8C688036557439C183A1E9B9165DC2BF055E58DDB25672E7E701B3CCA +056B592AE84DA9278C95328EEDECA8E7A4FB521D3646F3195D9A21517DF98B334AE2E201 +BC4D0D3162B6D0F53F801263DB7AB69F1D2998038804A2A8E96E588853D7BF448C3DED2F +CCB995EBD6520A2C6FED07E13EE3E546FFAC962C6C30F570B8BDE1ED758550150515C927 +2C6760A12A097D07A6A8AC10C5FBB66E29BF85A74AB804A6CC99FE01946620D14C3B8B6F +FEB0C74E4EA1A225D5B9B5DD45389FCFCBAE9D45AD3C7F3E875C0FAB231F7902B5C860F0 +2B4A13B39AE999E051B7B8D05BBED72B29ABF13ECC485FC1EBF0DCE452ECCFE6F230B2E6 +B778E45197B80EE42F4ED63DAAA570C4ABF8CE4B30AF7B694B70780F96BC9742F7F1D3CE +66AD5E473D8CD8002A436B078918949013B721329F9A931DF6F084FA5FB7C66BA81B6980 +0CC79452F5EE2991BFA84EA8689A5B7D20AEE04B0E5B0FFC03B8D8D1DF4F1D3FA29BD6F5 +433809C897B31F184AD02C8E9FEEFCA647EACE79EEA1DB444269C3F88EBB896B2A81995E +9030FD059C48589B1FECD0F98490152F1A1CCA7929F19951D345E342A805FE72B4A1B4BF +F2730AA22A41D1E07A890AA61F2B9B6607191C92D052A673B15FD49145611AF6754E4F32 +C12533BCF702626D7F1E44A7D7150640F09819CEAA1C0A2E2E8FCC3CB262CF29232A38B7 +F0EF66086AC8197B5226C5D69A6F57F16733BEC14D8E7A47509BE951DF1B810CCF6932FF +4DC57D208B13AB86C0E22569A6C11661C91711C35C61BDB6268C82E08AC53589A13FFB3C +F5EDBEC7E7A41CB81401DF66295606B544A9DF4924416423D6732B4631EB73266E370083 +16D0DA6106AC038C1406A5B6F8639BE3EE6C880F9DDE71085C6446F9F2815E2A6ADFCA93 +5A7BFDF4D5AFD5CC7C8C487D57B090A5CB7A7712E207FA7000E39CCB41AABB32923D5E1B +C8D7F2C05D9A3FFDAE5AB0BBA940A8A25114CE99B207FC2DB264D44472B188C5CB9F41C1 +913B880EF8108348BEB174712B2FC1192F37175C5060C9B1F63F729A4E94D0DA524E2DDC +ED8C1F460B782DC62F4C23C6C0FDDCFFA7E2F918CF417C2A4ADDDE53381F65E3DB52D291 +C72998809B59818B71BF922A04C053E2921679838CF482AC654E982A60D2C097C4A5B134 +34657AA08F5568536FFD2574AA4A88873C762371971480ABF1290A05AFDDF9C072DD721D +EF36CACA75F4AA4E28F965AC02A54735E167A7DABF06ABD1FB339E34848F1CEAE16D4744 +0107AD4A526B99C6396BDC4426B858BB7FE38037F46E180E3F8108C79E457904E0AA9BFF +6D3E9B2A89D3F40ACC279C87F0A1DA1245AC6E766F7FF56A7F7DB7352673036D8162CB5F +C666B6F2E944E19F78EF0B87EFAEFF4209A5F83A563A6954873F88B2CB402462804E2850 +C1C5379CF747707E54B6FE28163C31E581B5951E1A12169B1496CFFD8D862FE0126A0460 +7435B53E7E1453255BC1BF14B67D8275CE9DD068529E5314A28087EA792E841448B2720B +FCAC76DBA06A85D1FFA731D06757170CFA16D6758D5E371655C64747E1FBEFDA27115923 +C701004B5E38E32E4E9FFC294639B67A0A8BBB44D6050AD78A41747910AB112CC7D995CF +004B43B8C0AE28049672D0591392A2EF95A8021F2AB281DA86EC270D683060B8D9D6127A +CD4D5900209C117295822A9963D86D5B85D66E4502E5D2E03DF43DF5A162F502C454E971 +09A24B58B9BD864D5E11F8818811AAF0FE432527F897C7B9B1853DD7E73250BDC414A83A +85C6916FA701AB3B71AF0AA8429DB2A9F85BA74E49DDCAC5174C927F28C1970D0FCFF89B +ED30E83163D21EE4741659EBD12F2FDDC934E812ABF1A0A0CD1D2AF47DF045BF6C6CC15B +4E61D058650AAAB48CB9027757EBB21398C5899AB5876F13E23655A7AB3C19AB2D3BD7AE +55F808B6F4409012629F99A24FA15581F9EAB68177DD80DF8A78F0440E5FDDDE882A0976 +076F1B708C63FECE076193E53934681157F1EEAE0DB94A68289A3963775E0793C3FE3862 +9A6D3161E25A76A5CC1017884136E801A9EC1958AEAEEEB543BEE46B55FACAFC0A8B0814 +9121CFDAEDF975B4722D7EAC6768779DE79D4031D42622D3B2EC0A8DB5BB117DE455F37C +7E5A948088828127F042301446E89F67A6748440460844A5DACD816D728B00C725C771EA +647896AC27708EC7F9C858CD6E5264BA8DE4D1B2662CD161C0099FFA627070C7A228BE5B +F38052CFE6640BD91780ACB62158ED53E83CB21BB2DD3C2C40B70CAA21FCFF4BD6F07220 +67A644BE891798B0FCEB7FC5365ED584349903AE4BE36990F66113C3E3E2A12A2B822A5B +D334342AAA886A4C3460598A6D2C6C120369E27F5D8DC14D2C79C7B5215F0D6D0D7D7F69 +AD2A561C66C113DF9F60548A6725826E9C508BA07AAB59F3BFCC74D70D3D00546745392E +FDF15D348F0A5E36AD6C250CDD7D4AC53DD79991F36631371908BB9CDCF2089F4E37EF58 +E9A5AA78F3896AB9769C510A5965BFA79E40083388A56649126390F24312A4AC2D05C2B9 +A5CAA54F62628212354D6EFA8875F4B424732598FD8ADD1DA5459243D233D95F8840D51F +93847579566AE17644FCC7165E551BB9BFE7666E02F77CAE781D41D2EAD5388553E06363 +99653C07C45F603D6C017AC9DAAFA14339F25210A4A91DEC0DDED2501D38C15AD3371153 +CE2CB9E7A77DFA80BBAED85CD46D3495AF1D3BA9246885CCAB880908970E87B0BBAB6447 +A611956A2614BB89323FE3546868CD7C558C0BE2DF1F3649C0190BBDD38C8168DC698555 +2E913FA8BEC47F2ADA8211F4FC25EA75F5BF578FADF6707F051A0DDE5CC99C83DE55EAB3 +D81F40A05370B3609A9EE133982CAECB4108661833572E5360D31CB29916146F3D43C127 +E1DD71CA9413C462AEF379BAAC990E9C3BCF2C22E90F15AE7CF1DC3C52A44894E123881D +B6396ABA0C77AA2EA0BBD78C7312C9B9FC36271B058DAD3F57C44F57CB825908CB62B3A5 +CE1BA60AD20892AA2A559C53E8A883E9F9CBBA38D13E8E71A8C008861454A58087E729F1 +C50723854AE1F620D3E2D716697529BF345A269ADC240B8EB1593604E08A12E8C184EA2D +A26B206A5643EF0071D752A3D4982A507246F237880919ECE1538E34EFBB9D991129B948 +A0D37A10321F792A35C6602F5191D34100396E0E89C0CD41CF82D1A3E55FBF6575DC08EF +59485DDB2F33B1689738ECA78A59501F8A838D3BB960C025617D8C50855F31044D02F076 +8B5B1E6058737389AEC850E66C6F478F96C5C1D2F451841C30D6C1EFFC5B780D26A3BB24 +AA555A045DE634041EAE5F0572AB927AFA68877A77FF3AE277505B133BEF87C2899DD7CF +A9275F03B6B8461DD1791D0B0558E2E7A36295DAC3CAF878BC670E6B005FA34E78938F50 +DE3B75424769ADD07717737AB4E965A9565C1459C3197B545A64A5F22F7F3BC0A0641122 +85134DF7405EB961B367250242455D9896F92FD1B784AF5DF40C408B0F30A4689168029D +B522BFBE784FBCADE1D1301EACB5EB09DE63E20D5B313D2D04DE931862F08309633401FD +2117426434AB74A5A8480F6F9466E93FED5AF4DF1B3C81E5ED77DA855D1DCC9803DBFBEF +79994E045DCFA6FAF3BF1DEA57EB30FCFD0BE7A17855D82DEE77AD5F61C08DFF00958DFF +B5604F75DC8CC24623F582BCD220CDFE0D340A1C476D09289C5213DD812A0BAEAA492E8E +AF3436C2D490FB5104DF3139BA8D5DC7AF08BD1C9517206FCC738B626C3E29E590E2883C +30A4C745F59E54463086B20B76628FA4DD6E295144B43C87311DD11B559472034543C376 +65CD9B874ACEF7028F342E2B34CA04260ABF8C8E6193A64B94B6E1EA6DB6AC39FF3EC27D +A41A460DB7FB38555E272E1CDB792E682E887EB5C5AC5C0D4037C2BEE840A825AE864D34 +B205B65BA9E9B4D07A16FD1D285EB96E172E89A1024E5C0BEAAF1E37861ABE6767B98CDB +50C786E66AFC82AC474391C08F1FD549FAD7401F72E04B3A9A6C52C1B697E9D4E3E33122 +EEE5D0C72B03CCE96FC3D26966FC06C9BA4B7B838076796DC95CFA3FC222B3097C43BEE6 +251843EC7E8C81377481BA2C5F77C47C2BBC53FCBD8305C557C2FF07B9CEA70184E9DB31 +98CD10E6D6B9D3ECFF62AE429193DF88CF2A6548766C2DDAD04C3062D17BD5F4AE274043 +07735A6DD95F65E3CB850883474E57A0376F867507756D7FA74D0ABC7AC4ADD08E0AEF53 +39B613F64A33F92ED360B7C0A65F8F81290408D0B8752B7C03796629304BB83A455D51B7 +4C89ECDA38CBE83C5FFC54A7E5CAF3E2636865BEB3D6092CB7E4EFE6B13F710988F1B492 +9F4EA0676EA6B8495DF63F8BCFFCD47EE238221BA37F1C53B40A20D70347145DD5A04858 +4F1B55173B2808416CA7BDDA7775DC4F208742F7DE0382C97916342A192E47D3BE4454E6 +A2F80C8B72550D55E9B463299A2008334589CD4B5C19FD948BE6F9991EB7988F004E3BB4 +EDCFFD47BCF21276935650AACC3169B54109D8C02EE11D3B2670A7CD006DBC704EAD9F5D +3D1678C93199034AC92DD1959D25423A135441DAB773A78739663959C3AF3BE598102B4B +504DE19444E3BBACD584E15F6BB0D6AAC894FE5F86999096DF225232AA65B122511D3D0C +6AF2A7B25273CDCE5F4791416BD85DF4841C49ED8179DAA39FBE9E8A5D0A1BE58D67A0CD +CED550F9E02274A337EED7DFA9C3E23AB6AFF8F782AB4DBA173D8D0DF5A687070A4F8782 +DEFAC64D97487B10BB114338A16A081C64853076AB441E0598135A79028847D19229E650 +E96257DA27FA1C78F42302D996744BD5DDCAD26FD13F21B2D31ADD3878493ECDEDF6A257 +CA47BB5203286AD59910C8BE7604244C6E0041F3AC99029A5C61CF29A105FE4572BDBD01 +8B55B411B4CED2FB4F793F842CE40F2F8D07D8E10E79587970FD254F4106278DC7FC6E86 +6D7A1729C01D612A7FF65A63CF1C27CC79AA57699B0188285F474BA5BE90322DA6F653ED +3BD73542F9557352A042731F7448ECC6F931218E6B25ABC903E201F61BF1A7796135506A +DC2091CC49E8776202498C3C779C5A0DAA64C92D65FD3002E359062E1051FEC9DD47DDB2 +08AC3EC609544FC692BC2638E17AE95601E0153EEEAF7FF294CAB662116B455AEFA27744 +FA0AE2C7274442ED99491738BF4E832BD2991C59C2D94665FB6FE9EDD8BBD65EB2936F9F +8855722E84B50DD6EE83331138EF9779751C13E8757A54DDEE891507D2D00289B8667C6E +D9DF722391C9A4C7BBC146C735253EFC8E7B436134CEC60EE2ABC2F999EAF00352F141F6 +B3203DFD0FCEEF69B74CC180714A56B020B8832D291F17398E5B219300AB472699C5FFA8 +45878442020D780E1F2DD784AD116221769CB0C92A8B9864D646FC6DE853C19AFA0C9034 +6AAA5ECF81394BAB6F82035CF59E4CECA428E4D9513C5DE593D9B2A9EA127510CC68B5E8 +43A17803AC404DDDAC646E6E73C63C63001DA49CEDB5630B2E5A4231CD3F21DCABE8B3A0 +3ED509459FFFFB2457F1D5608E09448CA76E516407057805B82CAEE2B5FDF19BA480D93A +396EFE8199D04CF81E08E979C2C84EAEBC3CAD9DCF81189FF9A1ACF3FC19A88B30020EAD +5DE7A2EB7804FA0DA9BF71A339C3A304F51E47F11F9F0F754B04473A3ACADF6FFF079CD6 +C6F6B58A4BD5B340AADACEFDD5140B637EB3209BF8FB72B493643CFAF4900AAFC63A4EAF +D7B9A4A241ED10FC7CA1490304E2DDE4B22354B33253B41438CEDFA00E5146648B219E4C +E22D7BEA2EFA6A063DC8B1772371E3698C243C48CA4705352C3996DA94B1258B79C0B4D9 +63E69A95DD8318CBCB338354B91AF6852EE956A28F0DE835004D7F96C0E149DE50241951 +0621F7317209D1E1FD2172242E4B079FE328941BB0720194EFB48EAA04E59196EE8611D3 +325D1C12A3947C9E8453042F5F6F4B7B381BBDD7D927A8FABE70AE7282291265E7AEA516 +8E8D1BA24C71653323E26AA6344BC0D9F1717255E81D4C6A8B4AEE128C71F228D5775ED8 +257434AA754C770309C9FD1E8D1B69A12A78A726C80A9F74136FEE214D9EA87DD2E07F79 +53C78272BC75F22F54BA647413B5500051159EFC793BF1F44A6B8053414A331AE9AD43C2 +9AB2FDFA1107242078E6B581EA6DB98A73EDFB2AB8D733A91F8137C92E27ABB2ADBDF87D +E8B9086A12D3D9F7F5CD98D8393FD4D55F8FB26E849373C89C5FBE982C59A13FD4C655D0 +DD98A9056D4F4C36CF1611CE5B1931F38077D845F1D0CB9A32FA9E9560F3DE0D90B922E8 +EDCFF38CE0F00B53894EDE37276432C4786665233C4B72A2E770C1A6B137EBCD8275F64D +F1C19140C3A4186408993F112C44EAF2EB0D97FAD7503835AD56965D66B85B037984B561 +B125093AAECF14B8240026FD89389E6B1485C76EF24B838E1E67ACE175054E8EB18DAC7B +9FE59483EDB1EF741098E13D72AE7C263A8102336E6AA6492DF4C098FEF95D7B73F90CCD +3A77ECCD01816353DC819A90AEC7F58CB524B91D861D24DC8565ED19C3E44B91F6FB76C6 +E34B107A33EEA9BA30E8046DA880C4F6C7A5C3E58E45B4061E400F12F63219DB2DB438DE +57CB2ADEA50CE263FAAB683A5F993657C38A7301C8F0971A258465A2A03915341AF17D89 +B60A4A6E35153F4089E7394EBE36F3FA0E52D561C6954E60080A4CD4BC3DCB8C38E2F835 +A4F7EE9D8CC16A8FB6F205B4B9B9052517956A19D11038ABCBC28ADAED8AF15A274F634B +D4EE6FA279A872A087A53486CE9F0230F464B877E9CF8002765094E2E3B08F2F479F311A +A80699980FBD99914C09E6677161DACAE71884A21BB600BEB151D1698CBCB8F3C4CA9222 +8BEC63501DA8BD9819EB03006A427402FBC8C702E9F8CF2B0DCDC7BFCF0A5081A47BE7F6 +56366881FE8FB14E160E786A080B98A9CC17E0B52F93E31EAEAC7AF0FA0379C64F7EFC69 +5B80F3EBEB7745F3FABFCF0B4FA1AA56CFC3485B50C09783DE242F277D1054891CD9E78D +C67525BC2308F66F9CA11AA6AD31D48C3FE3FF0346ECD3648F803C50B86DAC19B0DD85DD +D09CA881CE34034530BBD51EB6075147CF0077AEC54690677B17334DE7DE56AFDFAA80A3 +D8F9700A9DB28A760C5DABFF102D5138EAD1E697D050D4BB9E6DDD28F0D2C669F0713049 +29534D421413BC278180F1172594DEE9DDBF4BACE639DBD04EA2497A4E72032C5C981038 +7749BA925E3E46CA02CCF1AC8C2931D1F538EED1B3B725C6C4AAC7D65DB7DFA4F86257D2 +69BA6B0CA4902214C3A37D0D2DD45E2427599F3C55FD813840A251F96DEF09C7E72D7007 +59A90A9F65B1DC63CB2020CEC0BCC6C54F428B8AEBC5FBA51EDEF53D88378F012C780D7F +A904DF1DA8B7148308BF2175B11B83281E132FB20AF80ACACB781EEB48894FE148F5FA96 +3AAECF094DB605BE46AE4EECDB1B8C1C64308F6F21239596B12DF0CFA846A09810F803BC +BA672B89004AD755D201D19CEBA6C99873EEDEC4929078513912D0815566BCBE3994F345 +68151B5B3375936A8825CA58392851D1A873DFC8BA308C58AC1F9EDBEAFAFDEE682C071A +BA64798C8486AF1510073C04773B4CDF2B77C3C4E3A3EC365FC4E08FC93B116F8F183947 +28029EE89EEC18724AC9D36A2BE1428D90F85557C4D2AD1442855DE6CF1D06C0BA192F79 +2D08D3AD3FB804AF6B68B3885556ADB4A4D11CC336B1B998344083129C66446868CB7657 +E8946E25AC33ADD0BD39D1D3396FA15B344B4BBA42C4F6265BA738A58FA31AFEA589A025 +428664B136A771A9B63606A6E63A29376255DDF52E89C2336454C3452110A4D0C73A27BD +D2A47D47744A3B9A4B84BC63349FF5C75A6CE2010E70B24A053C9BC8DB1089F4CB4047F0 +D102860A352BD4F0E9B2FE00C730CA3620434DBBB5180092CED4F7CBB8021E705F4C13BC +759B366A4D054B804EA3A8A9604674EC0DB26E93112CB244FEB1DA9CF920CB24DF6A0E7D +7F3B117B9E62ACAE126303EDFEACD893A8947CC822D84757FDD6460A0A344E31D1E8FE98 +FACAAFB39C49EEFDF56DD8014572563FBD5527097CC805E6B03066A81E6120337F83D1C7 +BAE66253655316248F0CE35FBD61A2372D7B8A1573D34211AD49C592716566EAFA3FFB23 +50B54A4FD1521FFB1DE011FCD82792B93D87788F8409AFD40C7448DF74CAB5343D62C534 +26F0120A12C601E35C4A17788FA6086B3B4C7C70F1043198C61E3EA717533971E8F78E56 +17C84A3B5EE522B4C7C33FB5F1B93089EE7EC6D3FA90EB7C886D04116C3C0947FC5F3B85 +45636538CBCAA1DDBA880A0D5A30FFFB07401B25CA5572D41426D4A6D98F3EE01AC1BFE6 +D40C58F4A2413631E59140F65AEBC0990A76BE20C2996D00053F353945CEC87AB8970B88 +20DF8527A018548EEBC55906E04B0A3A498877B2D1ABAEC069260F05541301AAFB158200 +DCD67355FC73930DD4B47DE9ED0501CE7E38823203CE6D714E5501DE6C9922187592236C +E424564D6FA776E1EABC1000B2A854D06860F6ED7668C4D5DB5CABF4E89D9E05166CDCBE +D679B2E1645790F968D0F12843561B95FC90B8CD75EE2D053CBAE61E215082E5609C1146 +32C8B81CF298E477C0427D4CC68E6FCDB88393BE8520CA93DF1E3B519980FB3523BB18B1 +99F1626457857CF7641AC66E257634B349B2D5A8728DD02A890391BF2EF8C6358E4BEFE1 +6A214068AA175A1E7FF734960FDDC28989AED8261D18B4D996372FDF4788AED732041886 +24521DBEB9985BECDA0A6CE64DEC42A2539CCD4F55323057B8AD70BBD5B05872B864FFFF +2D627668ACC1D8D1908C1E3E2C76D45DD2058C717C02D279B0AC4B2E526C657FF7C5DEB5 +3538D1B2116AAA957A6B16F0CF83430395996462F8183F71041D543C330183A941CC5E37 +8C348ADA81F946090676425EDD0EAD6EA996CBBDBF83B606D78B08684BBEBCFFED1D0875 +6CF352F872A71DFEB693608F24E3F4D663E53661B35A0BBEB3B630489FBEA39BCD26BB90 +0923FC711CDA89442435FE3A491FA23170B6223A577282C24FB7E895E2A0715D2B78F20F +F1F9B06AA9D754FBB32CBBBA06663C59B7A8B22E666B26F2B9D8C55179953581E756BEBB +82CB10E21A7F590C6569324ECC4C34DB4BFD9EFA84897068199ED8344A438A1FFA475534 +0EEB53B8E087515ABA25BA2B1414EE4F86E257387D4C0C7D010888AEF962069C57450925 +6C3F0625BFD6909356DD62C01875C69204C843E6BA873049D72ACEFBCD9106FD45B8E9B9 +8CED3AE42ADAE6A7BEFE925BF6421E88540D9E599CCBFB9E8DED2C5DE0B7AC4B331EAD42 +DEE8EDC35312B1062CAECCBC903CEB8F67897BEC2305B6C333FB766D92C6CDBD77CB4F31 +F63AE1C04A249361D2EF6E0BAAEB7FA3B87E0BE0E1E50C1F480AEE2DD2B6B4D7DD89A020 +8C9B43ED6F46F3883AB7E53869E3C2ED3DB0DBB1A05B1629E48B3D7F420F02FDA6B1CBB9 +3DEF237CDE1F7BD8C80AC7AE5388C30335378E0E374D0C41EB824BAF001A4C47C399F301 +13B442A2C1B27EC161CF528FC2B256579E3C96AD5F4575454449B3B5E1CBDB300A364C7E +6675B6B924B48E58A0629E729941C3830D23968002C56F84F53CF124E771FC83CCAA3363 +5A130FD70D9422B524BEBC6FFF2369A71DAABD932B9D4ABEE240F07A4DE04C280D9CDC39 +A52D9B09799279368965C40C32771BCBA0EA9BFD488BFC3D154B8E421391BC7081D27262 +B40B8B953C02432B8074CE466299EE8BA9A0BF0D47F797EB5A8300B1E80EB44EA0C0D51F +8577BBEFE06C2C31199B4B4483BDBC10B9821B7CBCCA73E4A96932ACB5DFA52B2F3F346A +444EED0B3B0E81E8B65867CAEC517B99B84F574AB31FFABC2E0DA312F12E549436538E9C +82417153110E8060C80101B8AB8955FBC6FCB64499BC6AA18EB6DFB9406304B2FA5A003A +650C15B78EF641381F9A474623E69167793F9896DC82AC4A01FE4E267E9713507AB69A60 +DA690E3F3031CB836256B21FC26BE0B340FBB84AFA550F7ED8C3D0DAB80AA2FEC258477D +6576F86E6D8FFB91F99917A1EFD4902BC12AECE66A5EBCC6585ADE4D96CDF5A78D10EED9 +4D543079A9F60B3650D17C81748189C5A1859982574E1E821E943AD2C59000D8CE586E64 +178DECF669143E9D12131FA2AB2516A3472C7B41DBE5E8D2812FC7DBBC2415055EC1EE77 +A1BC7FAEC22051FDFA79F47C5D511C3F55DEC0369CE994D574299A9E3AB915935C654D71 +F3FD4988F5265EB95349304260ACFB633722F5AE8F43D3EF4ED5A0D333AB72ED10C1BCDF +30A2C85CA9A4B10DF95613BB465C2757CD153E81A1CB4B6D6B7A723BF5FBDB791B38E900 +EE8CA0F36399A767FEEB1C239880F13643BFF60481776C3856A033436C14768B09134DD7 +2C79C88DB4A5E7AF3F76B4806DFA232841268CE4D3D6D8FCF5820EC52B713C9ECAF0320A +5E94C45E93A785D5F4DB8E5A1F43BB8AF4218EBC91BF88D10311EC6812F42BDAB8BA486E +77AB14763C2E489EED940D934AEB3840BDEDCB9307830202AD02B3E7E27E0358F8502DD0 +F01935DFA95F69B68F5CD4F90ED84AD59DEF5E62508CE3A5AF67B2FFE39D37C59E5251AB +5E26C96C0B08D593BDB3F7ED93F9BFAA609723BF87BA135847B8535611C5E4EA0BD324F8 +3B38289C3C5D54713A58DE72FADFB4B89E7F4C40261C1779B97CB9F9570530D5943A00EF +FE435F5541AA079CC0E8452EF366D9DC18B0A6A0454FF9AFF47957973F77B9806373C9A3 +D048558F532788AECECD659B8B2751958B3F454011DB88F3BEB0D50053DC70B0244AC1FD +20D70C444E1CB00399EC559D6A2513DBFC001689156FB89CCEDC3EA3C9B70BF2FDB3A1C0 +9CF814E7F1332B7C752DA6B2910663D3E0AB53E89A236ED66418A280FB4A561DF005B08F +885D58BEF1429418D81F67A00403D87E16519FACA45298D16ECD5CE1839D3BDBCD784710 +8622BCFBCE4C100602211E6762998BE4F6F211EB916468F587A4DCFCC2030FA5FCFE8018 +1299E339E35ECDC494D4314368270D837927C46EDC1299FA541480A07F085D583F2B9390 +EF3B4A2A8ECA8B28648D8132A0D5B37E353731056BAC85AE7491369809C4A06ED7B0CB7D +BB71404D67DCEADEF47603F7C1A3337AC93CA5510F022893466AF4C74C24428275C44E23 +0FFA5972C9D36359FCE3899A3D60EF63920F154DD39CCE56BA57E540C1A3497B3EFE96A5 +EEAEE028AC28D81A541F833A62C8F7AC492BF304C632A023C7A170F8B3ECAA4284CD01A5 +6F74B4A41F1FD464BF46C890325D17CF9C8ADB8AACDD9CCA20015374111DACDA8744BE20 +DD6C99E09B51AB2287016DD65383E8918B5557B78578CECCA7EAEFF8E9BE9E1B13A24613 +C953C5BB45BB74A5A935F32E708927D5FDC1805B5EB9745D35654E25BA50FBBD7DB58D7D +6F70E102C640B771CAF3C1C138AA9A828E79F377A1FC8913012E5547D3602B22B4C365DF +269CBE55BC4AA79FABC53F01EE7D809481DDD3EE602A7266B7280DAFDC68259CBA490414 +84E4EADF0F8E4CEA8A8CFF260B8F4C9C5A3F2ED699B4CC72DADF932F844E65C1BD385CC0 +F2EF81820D16CBD8CE2B27ACEC225FD1DB77723EA0F03B1CF07630B907C7494EB4CAA725 +18144B1E15B0B34E8F3890269BAFCAF6DF4EDF3861ECB5266C285085BF4E1C6FC0FBA7A2 +6504467B734692FC2C9797D1B6536FD42314CB0FBDC0B104EBCA6539F47A97E1C8974876 +9BF5EC71AF381DBAF9016B5A794EF38776FD9F811F31EB98010FB1FCBBF23A00794E2FC5 +9637254DF49FB9C0F459FDFA0AB0C8C040AD780D6CF3C9173472B8A6F041D3B30720C1C0 +324B977866A3F892FE9A12DE84A6F0D723ADC584A17C055F07F4BEC7486D6B064885E410 +B48509BBD815C3BC2D57F23515AC82551CE3D334424F3456944460013BC5B7B43AB19D7A +62C9C2431CAB250705DDA8CD0395FC754AF7E0B10BEC12EF69100A831CEB62F5C016142C +32B8A41F852F57BA1DF144C2A534C06559BA009A92E345305589796697EF28E097DC06FB +8465A9DBDE8F5C38BD9D0EFFC3712F9F070F1FD50BF691811F94E12F26D47AC350C01C96 +BDC13416E1272D457AD210AFD2822408337E8BA7E63FF468AE68983966BDE984F4894F2A +47E982E29C6855351180079ED4E9D53912764533F5EE35A93B31A4885855A31DCC719522 +8D266F9C539DF45036A97F920B717D08ECF274B66EBA30E223A49D67975E8962F617C107 +23261A6FA71061BF91EDC235B9288E4D856FF764A5E65AAA044865D0666523B24CA1AA3F +87A58577ADE42B6DD75960840BBE46C584818A5C7E4E0FC13D41E9E1062BF50260E86A39 +09C5C59BE2E8301ED90C22A42CD5DCC436AF0A0E8987853B1FBF316986DCF54BCE866D05 +1992116762A7E54B08DB4E6126604B30F6D304E3D1B8FC6E602E11D791648C024661CE90 +7A6808EEBC6E3E2C0CFF9A9C6DE679F7E0246CFAB927F1D1A642958267645432FD9861D4 +92DE7CD99824C0A7D93A27F279C0D9919E4D14BC0855F4B562447974B2ECD1171B848D17 +8216047A6834390D7704EB2D6B16EC16A478C69AAD1A4F766FDB6D609628AFFA7F34796D +0667AE68EAF4D3BF8C7316A99E5CAC797F0220A930B7F3005EC0C72A2A925DEFD27F2DE0 +8120030CD29A9F5553E5609363E34A9526327EB61AC707C48F +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if diff --git a/fonts/Monospace-Oblique b/fonts/Monospace-Oblique new file mode 100644 index 0000000..9322927 --- /dev/null +++ b/fonts/Monospace-Oblique @@ -0,0 +1,2706 @@ +%!PS-AdobeFont-1.0: Monospace-Oblique 1.15 +%%DocumentSuppliedResources: font Monospace-Oblique +%%Title: Monospace-Oblique +%Version: 1.15 +%%CreationDate: Thu Oct 27 10:50:21 2005 +%%Creator: mike +%Copyright: Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +%Copyright: DejaVu changes are in public domain + +% Generated by FontForge 20051018 (http://fontforge.sf.net/) +%%EndComments + +FontDirectory/Monospace-Oblique known{/Monospace-Oblique findfont dup/UniqueID known{dup +/UniqueID get 4136343 eq exch/FontType get 1 eq and}{pop false}ifelse +{save true}{false}ifelse}{false}ifelse +11 dict begin +/FontType 1 def +/FontMatrix [0.000488281 0 0 0.000488281 0 0 ]readonly def +/FontName /Monospace-Oblique def +/FontBBox {-239 -1034 1512 2105 }readonly def +/UniqueID 4136343 def +/PaintType 0 def +/FontInfo 11 dict dup begin + /version (1.15) readonly def + /Notice (Copyright \050c\051 2003 by Bitstream, Inc. All Rights Reserved.\012DejaVu changes are in public domain\012) readonly def +% Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. +% DejaVu changes are in public domain + /FullName (Monospace Oblique) readonly def + /FamilyName (Monospace) readonly def + /Weight (Book) readonly def + /FSType 0 def + /ItalicAngle -11 def + /isFixedPitch true def + /UnderlinePosition -213 def + /UnderlineThickness 141 def + /ascent 1556 def +end readonly def +/Encoding 256 array + 0 1 255 { 1 index exch /.notdef put} for +dup 32/space put +dup 33/exclam put +dup 34/quotedbl put +dup 35/numbersign put +dup 36/dollar put +dup 37/percent put +dup 38/ampersand put +dup 39/quotesingle put +dup 40/parenleft put +dup 41/parenright put +dup 42/asterisk put +dup 43/plus put +dup 44/comma put +dup 45/hyphen put +dup 46/period put +dup 47/slash put +dup 48/zero put +dup 49/one put +dup 50/two put +dup 51/three put +dup 52/four put +dup 53/five put +dup 54/six put +dup 55/seven put +dup 56/eight put +dup 57/nine put +dup 58/colon put +dup 59/semicolon put +dup 60/less put +dup 61/equal put +dup 62/greater put +dup 63/question put +dup 64/at put +dup 65/A put +dup 66/B put +dup 67/C put +dup 68/D put +dup 69/E put +dup 70/F put +dup 71/G put +dup 72/H put +dup 73/I put +dup 74/J put +dup 75/K put +dup 76/L put +dup 77/M put +dup 78/N put +dup 79/O put +dup 80/P put +dup 81/Q put +dup 82/R put +dup 83/S put +dup 84/T put +dup 85/U put +dup 86/V put +dup 87/W put +dup 88/X put +dup 89/Y put +dup 90/Z put +dup 91/bracketleft put +dup 92/backslash put +dup 93/bracketright put +dup 94/asciicircum put +dup 95/underscore put +dup 96/grave put +dup 97/a put +dup 98/b put +dup 99/c put +dup 100/d put +dup 101/e put +dup 102/f put +dup 103/g put +dup 104/h put +dup 105/i put +dup 106/j put +dup 107/k put +dup 108/l put +dup 109/m put +dup 110/n put +dup 111/o put +dup 112/p put +dup 113/q put +dup 114/r put +dup 115/s put +dup 116/t put +dup 117/u put +dup 118/v put +dup 119/w put +dup 120/x put +dup 121/y put +dup 122/z put +dup 123/braceleft put +dup 124/bar put +dup 125/braceright put +dup 126/asciitilde put +dup 160/nonbreakingspace put +dup 161/exclamdown put +dup 162/cent put +dup 163/sterling put +dup 164/currency put +dup 165/yen put +dup 166/brokenbar put +dup 167/section put +dup 168/dieresis put +dup 169/copyright put +dup 170/ordfeminine put +dup 171/guillemotleft put +dup 172/logicalnot put +dup 173/sfthyphen put +dup 174/registered put +dup 175/macron put +dup 176/degree put +dup 177/plusminus put +dup 178/twosuperior put +dup 179/threesuperior put +dup 180/acute put +dup 181/mu put +dup 182/paragraph put +dup 183/periodcentered put +dup 184/cedilla put +dup 185/onesuperior put +dup 186/ordmasculine put +dup 187/guillemotright put +dup 188/onequarter put +dup 189/onehalf put +dup 190/threequarters put +dup 191/questiondown put +dup 192/Agrave put +dup 193/Aacute put +dup 194/Acircumflex put +dup 195/Atilde put +dup 196/Adieresis put +dup 197/Aring put +dup 198/AE put +dup 199/Ccedilla put +dup 200/Egrave put +dup 201/Eacute put +dup 202/Ecircumflex put +dup 203/Edieresis put +dup 204/Igrave put +dup 205/Iacute put +dup 206/Icircumflex put +dup 207/Idieresis put +dup 208/Eth put +dup 209/Ntilde put +dup 210/Ograve put +dup 211/Oacute put +dup 212/Ocircumflex put +dup 213/Otilde put +dup 214/Odieresis put +dup 215/multiply put +dup 216/Oslash put +dup 217/Ugrave put +dup 218/Uacute put +dup 219/Ucircumflex put +dup 220/Udieresis put +dup 221/Yacute put +dup 222/Thorn put +dup 223/germandbls put +dup 224/agrave put +dup 225/aacute put +dup 226/acircumflex put +dup 227/atilde put +dup 228/adieresis put +dup 229/aring put +dup 230/ae put +dup 231/ccedilla put +dup 232/egrave put +dup 233/eacute put +dup 234/ecircumflex put +dup 235/edieresis put +dup 236/igrave put +dup 237/iacute put +dup 238/icircumflex put +dup 239/idieresis put +dup 240/eth put +dup 241/ntilde put +dup 242/ograve put +dup 243/oacute put +dup 244/ocircumflex put +dup 245/otilde put +dup 246/odieresis put +dup 247/divide put +dup 248/oslash put +dup 249/ugrave put +dup 250/uacute put +dup 251/ucircumflex put +dup 252/udieresis put +dup 253/yacute put +dup 254/thorn put +dup 255/ydieresis put +readonly def +currentdict end +currentfile eexec +12D37711F3EF58D4B0160CA0E8A8B30BEAB80C582DE4028394F513096550F71FA11E0919 +505AD6B7CD35BB9BC351DECCB83DC12688E510CD157D892C101B29A3F7371CD20D496932 +3EB249027679D3DB7582D953F033C85D9B05B2E5B9E3F8CC14BCEA62C23DCEDB24A737CE +0B749199BDC0ED14B3F80C24B773C7D94E0C32CB6CABC70B74F04C589AE25F78DAF2C485 +03C9800E9816B03D596C6E3855892618845E5102FF46233B460979463BD7A820DDD6835A +95C220225DFE27AA6BB31E99C60F679AC7C5A3363C40EF4C555EB47B0B8DB21ABCDD571D +28DE4719336D102E1E7D1EDCC5B3B0E60354D35EB856F234AB60D3C84342CB01D8747F93 +73140C128A546250AD327045F7903E144A248D16DBC150EBAAE66ED529E3E69214BF4A15 +12C2CA07FCF9A1CA5DD6D5A3577FF552FCE29E2CE9236A470FD258273428609693228B91 +5420FBA3ECF0A2406B4484196374D33A6C4ECFB322185AB88BAE99CB4FF8147A0C4D3274 +29B1B69D3985E21294AC5BF3777F72FD8986BCFF6374642612A36E01B5F19A4C313C684F +B4A10E6D366CE685E4D566655263E514862031506A3B886388753592B0F9A5D61EE9C644 +3E5E6BCD8E4FB03ECBF8955C142520D0F71F7E4DC8C45E335345B990BE35EEF99170556D +05A25CFF99E21151C7C1407675D515921EDD3FA3B98A58FBD14CDF1AB6AEFF424587D2F3 +CCBAA445F12ACC21F1AFB0EBA2D9D9EFED2C77A01C7B4FF0042E9BF457442297D0989DE2 +DC27042B646D45A9BCB9D9B80AAD373DC283EF83A52BBC4FF0B2E17194CF18618BEB8CCB +BA24F7B836924BAF4DA12D018EB41F3307ED0F6B29C51B20D92FE58C27CF5E7D8A3386EB +04685234F0D2D1704EFDE3C72CAEE80A17BFC25C4ECE7DA8A4F9044856A19794E13B9199 +279CDE03A30495084E75DB7C213CEA250A5DE3A17D168335FEF9BE57291A770F53502F9F +78ADC6BAA3223B013B120789D9672B286D7713F8AE9802A4424B889344D6D06B280F60AC +A1A81A0D8ED436C84543D86A866C981A4A8ABD3488FE907F39B32311E4C2EE313AE91061 +A1FE81235477F816259BA0D0151DCB3F28B2F59518B09E249369379B19E5DFC19EE63BEA +CBB0636880CB367BB50ACF4767E2A9E9BD7F0339D4128C54E622D4C39C5FB383438B4A73 +9BC3A717D1E3F8A8CE7AC4FB789C7531FCDF82C32E4C8591C3D707E6CEB702C2D210627C +558FB139108437B8E9D99B2F8532F76709E821391A07BB1A9305F62EE8F9E1EA1844FFAC +C5205E5428D155457F451A8177E75D61195BC5A9F564297E4C36C9D3F730D1ECDF921096 +C42A26E66BFDB9AE5682CE255B0DF1265A763798CAEA7A3138CAE6A7F6711899EE2FE701 +D825DF705F2BA8D8C6A6FC077C7F63C35D0CC5A183A03EEDB7A81D71092717E60CCD03D9 +D7EA295AE3407BFA22C26CF4D7689B46CB49FFCDC43F3BF5B3A49E53387FF86B4267B880 +361199FE0B20B7955DE33F541FFFA0DAD7917CD64ABBABF977ED46127DBCFCB179757EB8 +BC08D07CA46AAF440882C7ACC9B93C575C363FA81F381CCBA6B3ED329D349D8D7E3E1884 +8327A19CA6C83DDC89005AB7D6725D11AC8BD6F2C7CE8B10131F7A82484D03A3C6D854AD +4E173EC6852F0E46D46F6B85B2641AE69CA53069AE2B330F57223C297E09358F7DE81F08 +CAE980A507F685FB2156714E7E9E88D88FBCAACF86ED25335647B1238F31BDD5D820EE43 +821F5CF2F7D9A67586D99E9D4931AAA7C2D32FAEE392CD9FA4DB8F69D76C3BBB48A10CAF +BA3E78F64701913B414845FE6A5F78A24CF5CD29097FE21032C5FFB34F107F51B3D8C848 +2100FE54272E0E17B79419FC0AC8966CCB7AFCF723A8F721B06CC80CE0B07B92DFD20E93 +BF01ED0C72F6385A49524A7AF5EDF658FCEA7475FC6CA315926826FAD3A90FEB182B6651 +B1966E20F7300D288DB7A53402D5D8D0A748E3C0D21B9DD078FE8560B40C06B2A7037659 +A8603518F2A67C62BBD9A29F452723A8EFE6CFA2C356EDFACDC8AE936533498DB168588B +6B96C1FA3A2740E3BAF4470783C49202FB9D1A9A9DC3B375F1187CC1DFECBC616584EE00 +BD76FE39C6EF0B7A7ED422042C1EBD392A51BB458F920DC197915A74CE8E6635EAA0A772 +426427212311ADCEFEE54E075B8E03ABF3D4F7939D35809F0B6AAFFD9C08562B9E6BF8CB +B6E3303A1B3851920EEA8EA61B081D22A585403C8D25E645987434DA4A16E57A585B4097 +3FE63FF99E2BB9B860DEC906F8FC183A6C57570859D7E381A6CEDCECFD566DD50CA67801 +ACC6151D9C6D7D5A3A19C5A283EF37F1F418A469BA10E45EBAB0432A366C1549CB402F12 +DD99AC7F802EB9D2B56899BEEB60C65C6B22EEB9A00C680E94E8B190B1C3A395B6535C3A +3831D857819FC23F840B273D3133F1BF243EDCF846D8E308E04F6A38B5C73502F34C6680 +0AF88F2E920E39CE4C31DB700CE6A2777048E4B2509EDD822FB0036D888B86ADD2A01C8C +AD1EDAF950AA9EE999B4EECA0DBF02064602085C18FFF27707F09511AF5611DC76220CF9 +FA55BB850E7F4359A9B597ED3E3298B765D9AEA76484DCC7338551FAA0F1BB8CA3D0A628 +5BA8BD8E8342155B682CD6C8FBE6631D627C4616E80114385D6B52E2C827D5E7A2C1CDE2 +B32BF8686B1E6A3E8689D1C2191C6C3E9697633E65521500EC357746647364248682F2CC +37AE635B876025B85622049F99B824C32D060CC599FD4CDD9BB51530FAE7EA750DFB07AC +A3226EA764D547F7158AD27B0187FB701626E7364C72377402A88754F1D3B5842031E319 +9DC3FAB04D7A3C1FF486AC03EDE9CB78A5E911F56B06635ADF5867E64C2871317AA8B298 +3F0FEB5251C244D589A8C9BE5A9C6382F9B409CE2D4F19AF79FDD4157C326A43EC78BC27 +FA5384398C5F927955B2B67EE653CC6EFDCAF7C23C0D08B8C3DC41CB5844E057EE1A277F +8DC7FA99594391BA6DFF30FC9FEA550E58F39934675E587698AF82F00F428AC930567362 +B401C42AA7B9B4FEC9443E9AF5FB3E999A94ED088D97CB11E6955BC9E561D59EE34BA1ED +A6C9217EF560D154BA8F19865CB8C913F12986A48DE78E9D284C0885C8B69DB0CB47560F +D88FC212B29C91E004D18376A09A184ED29866DC4A179293A52A1BA548E6F8439B326A16 +2FA0CE6AED75A05FA30EF09A72CFE06124BDF8016C638725770D529A0163954177D45382 +3A74FD8E44B3773EA1280431E880CD2398A944C4D045AE91138244E0BC15343D6AD7225C +20406C0AA1A4257FB281C2FC949CC3D215F827F782F9F4BD121F67794A8F13F19FEA800B +6C7240E804D6FBACC9A2CDB6E7D24F6C61E89CB47C94D8E961ACB9355A12B42486447C02 +7AF9D7B1C4F0E4CAA8E28BE31684D721083208D76482B9BE451A4F0426F5DA9A2413D98F +CA9BFC29E1A8680172ECF33C7218D796D6447FB643974250FE831F4D5F0ED8ACD2B0E9E8 +DC6479E203625F2C5D62F96244773D954ED8F9B4D74A0D8426A9A61176EE6AA0DB4BB3FD +8E0F9F49119F2F2F1EDFAF9FCE35316F718A3DBCD0DA416574C87366E3321DAE1798F437 +7FF418523E807C3D80C80A5057F16781ED3CDE4EA1AF173093712B3F76DA73D0FE64E273 +C4309D9BF5CB0308A3BFCDC1D7BF1830D22C77414BEAF5868006615536737E20C438265E +74B43F267E748B834FB03691FE68D944561F1DEB1CA295E442C6EBC274B6D9A0D4C2BCC6 +5D6401049EBC97F0F7A5678389267B0D6C10757954FAD66FEB12875BF4349BBC775A0804 +00E25D70A165C7ABE5F5F4427DBE548C9701E20CE28356478DFFA5F08C30FC08228CD6F3 +C6B030734A683BC5196F3D29C43E80F96D4EE3DD54785633987F385340098B5498A7DC1E +07D42614FE6F1BA7068B0677345C695A494BBF150C8E4F91EAD66E387856CB09986439A4 +03A2EA248EDD1D00A4D490B9DC4BD11E36E155EBCA715B513D991A19548B417539B36308 +0D7E8E3ADECC1073EAF675C90D5897E13CA0AAAB196E8A48F867F0F71E5E5E24C36D5492 +E476ED92090842D327E4682E483F082FF71BD290542C19242F596801E9B67386498D3855 +BD5AFDF1A0A6AC211B38278F7ABDEB586EE5FD5ED91382EED8677D8A1792B270A46812DC +BA8A1379D5E5B7413CD43C6CB3E447E49F35CF2E7BC2E99229286B2A636F83C16BECF6E8 +63E23449DB08CD8FDF0F5F8EDE5A410131B866B55C6BBA8528C17072EAA042662D855A3E +5D164BA81ECD230EEFBD2A37F823D410469B05F3198B56400B89B6637BEDE2A19465F240 +338ABE767699529CECBBAEF4879AC00A6639589927A1CA91298FD051FF15223EC94FBB3C +1C61D1611D05E59ED9BE06C0C9DB3C311CDA93CFD321508D1187007207A02EE50F422383 +DCE98954FF609844A8AE9C29B56C1AAC1238D45FA35A3DA527E3FB618CAEC32EE156BFB6 +2E8F66F6FCA7EA0B9BCF0A144A05FD8FE25BFF681E3AE6784D6A670FA08776299E0ADA1B +A972D1E35CE0BDA9F06F8A8B96C8750CF25E24F69A0A49C65F7A9716FA4C5F3CEF3512F7 +AC82BE0C5F21A6876F73880FC7CEA205B4286929ED2513D38A5695208A5CD4DE401B214A +BE67DA7B8B2C63F5B06BB039D7294DC883723FB83F736A5EE8A02C9F968FCFE5556E52D7 +9E070ED53CF85FE574F52C9446E61BC83DDE8C5AB547B08E19561E6F4B84D422DE6DF197 +3B2572006AAE0CC1F19E342389DF278FF04BDC5CBE51E27FA51D696B123DA5B342648532 +FAD98EBE03894533AFE4BECE638CA5785DDC9D7ECEB71E59B01285978563920DBF542794 +6B13DF1BD0C0D349B77290CE840C17E9F71A7E34F3EF3472AB04E9DEC00BC4C258F522AB +15C73CF78CCB3A83D7A2047FA52A4C7196C4E750C14D77EBF5C799702BB84B646BF7F9A1 +2A6D27166F7AC9B7A2D6B6062627331C8435A64C04096FEEF7867334828680E41990E319 +334217DE53F32DD9FE73537D000A5493EBC0B5282FC1D72E0DFEEB51694F6B2DF87F3E80 +858DADF97EA3E4A864AC9AF980B1BA0159E7E046EF395143D2C2AAC26A0FC3A8F1ADB37B +6E3AF132D51D9ACBABDB4244AD14C837A30C3B9CA47CEA267845DFD9FD5A0522BB50BC0B +CADD7730E893A06E8F175DF29B4092EDAE7CB28F8FD389C14EACC8FFDC815355B9FB564A +F8C33D5871ECFC0CD0E33A0AAFD6F7323A3FD696B4EE641249BFDF82EAC73D0D823A5BC0 +EC34C42269F5699F129273CC384C8A17BEDC4BA4E384BE7D6213EB49FFFC5C98FBE27877 +85F64405CA64B5F2C10470B82BC1471F59C8EEEC668D88CF0441451E275328E3903A54D9 +216F0F70F63DCE071BA66B31E59EF5731CC778455222D441C0809C690AA9E70AEB6546AB +6B6D27A66004E67813F7509A3F2B2FFD717A77FBE48A7480FE4F2E0E9DF61D378D817928 +926F8F202341E945DDD9F747F6AA931A9369326C3AEECFAE75D289691683E6635E215E10 +9C76807AA3B71450BDEAC4AC8A55F7B6B7933745E2F3F2F3049CE858B10E17F8C236B247 +FAC04A7C3E6298C1A2036E14EE164AE8478FA4AE6F24A9E542D3D2B450E4EDEE099AA693 +16E89A308123CC5DF3E4822A5B57C7FEC21271BFA0168C3309ADF2DABEA0610FB18ABF69 +5622E7A1C371B3EC501D52A1DFB94AC84E30A500449867BEFCB5A07DC54A2F961F296DF4 +9829E92B8E0928315D60103EAF984847A6FF6185F8C1EEAC3A114F7588AD864F3A16B94E +3AE4E0738E13B6190AF3A27427DEA99F8A6491CF60C2F8F5C8A524CDDFC5AF2F7304DF82 +DD8E2F273DC82A9F0F7812297C485AE2B330DBE5B0C2E91922484FAC56649226FE104F57 +E88622612FD6CC084725C3C717D6B04432D13EC9DD5BDE98FA56EBFD2C7FC973AB611168 +C43379538659B695DEC62E8D58BEFCF44F9F0F52273D998C6BD8766BF4B26E479DA21563 +04B1248C80C58E7A9609B64934AD07C1945F03AD258D32D4D47B6C1A95D44B135F380A64 +C7ACDDD22D510DCD056A38C8400F21900F1692BF2210F6B161EB8C6E7702291C0CD2123F +6EDA46B95BAB323A99784F32A3FAADE6599CAF43F3CF39D43776A205B6024F6DCB27349E +C394FD27D389C1CED32138732AF2EDD4215A8E81A058BDF9797E0EE81D13B7773897EEAA +B71BF9D0D6D913DC0887442A470D5878766BC30C065E64456A88F88F754C3B6CC402BD8F +BE60B69F6CF942EC531A6768887DC1D6C08A690109E86D08D9470B9A684D751101A2821E +48805AD36D0E6D3BFF33FFC4994645AD2B599188B30649ADF04EF349B934E99E3D767C6F +95DB404233259FFA5BF4CD809B4E08F51653D72C2C24B7419B49585672244128A45AF33A +82BF11CF4B402B322D7DD20410A85B28CD32DBBCBAD192079514ED52996086747DEDB275 +8C8CD1F05B82B0BB80F5A0BD1C7A2F726B29F6D8DBDC9E199C494A8682D3A12F3430388E +845B4878CF87871AC6914DCE0E7AC20407F04B3A41EA5EE88C23AB19D61E5446ECA0CD77 +0D6992CA5DFEE0265BF81AD4EAF93BD5C068D1A0FB1704499AC8F16E26754ABBF318E528 +D7B12C0CE352E4FB67A1F6DBAF06C9EE5C0A04A926EB75A2E76E1050CF4300721B0F130C +E912C53166696D93B131CE8D487FE3B5A8450EC7A8961479FBF29E63DA9B03E79F2FE5C7 +14B57DAAB035A0D2A6A9BB5FED68F49C58360E5E974709D12AAD0680E1C0145526CE2C88 +36FC489C50D8D3FC5C0AE2C517030391268B306D231A9BB1E881928727235C693FC86B6F +A9A62D337FCD128CFE1BCACDABE9F384B90C10DF4967A447D53828F62E753D639E4432AF +361F680C212BFB50065241FD8403C80D5FD3F57A60643D586449C76238BAD444D1282943 +FBF39869CCADCDCD0815A484C494FA16930F3636FE854A1530277D1232303C0A86365066 +89FFD5E3C5AC028CDD18A3FB360C8973AEE50FA93127D6C7B3F323689F3075CEB2017BF8 +BF827381B96044E245DA2A845A536E053A1D5B540A8A27745547FF27CC9368EEACA827C7 +A47E56107A68B58A4ADC9B4A56C69C16A061F50C79A7034D317FA0F61A123D749AE3A140 +4D8A29EF631D5F925C8116256B40B81EAA31C326F4902BF46D68C5D6930EC624F3F50587 +9CB9DE9740CA93D36B8C84FF21E7E2AE48FAB457A8973106BA5A4A9D35D19AEAB1AE1E2E +8794C96BEA993A03C1CAC00697D95BF3287D7B14701DF8EF79683F2771A444D334E7074E +0B1602CC3D08293FCC6815946798BA56470783A0BCEEF3BBAE34D9ADDD47EC0E23E63505 +67965078615B540448EFE238DF5F70F1439123534B37B01D7189DFB6B21E783474B476F1 +9857F50753D49ACB4EA73BAFD9727E3EDB0ABD056CA73046DD3743451C0C2E54AC8646A9 +C1E269B570605A92E28FF146F6C9E49FEBC2B0D1946D673064640F610FC762ECBF415845 +E80463295D0EC0F6CDD35852CC9126E08DA99B91A75CF7EBD86466AE0C381E87E9D99BEA +1F6D35F3603AF79212C5146712B20727A4CA38A6CD684B5503BA1C18590EDF890902448D +ED527E7EB9A15623500BDA827261BEC6E0AFC5D644DD384BA6B3BBA29EF93FEAC2BA6C56 +82AAD04CA8FEC95DC915B8566A268801A7242DACB08C0A47122DFE37EFE10B721CF410A0 +471163142D46D3FEA4282739312E53BF815FA207F0DDFD7200FE6F7730D33F25ECCCE770 +2765D198251988F9D85E4828719243D6275E563E439F7F7162BDCC0BE33CF25EDA87DB8B +D51D0B64335C358ADAE488D997D3ED523C3187A50D1E287E00552844DC66F3417D145635 +3984699130F9B7E860359DE4B14195307288A8EED3BE2AE04339CE84BC1C1D02861C32BA +47C050474FA44D746FB2BCC7A1469C9246DF0725F6B854FA1AB68D68E96228E2CB7834E8 +01684DDB14552974A23ECA2254EF2B6D195650ABF1E2BD69B2BBE1BF520CA77E748C0152 +FC5665C36AEBD0002190FA221DD3115ECAF905114FA7222822523711E48DC71EF5FF7BC0 +9BF1C3DEA0283B5868357DBBFF7B4C6F91C47F941B40F03259AD826AE6FF057EF4B07B9A +058C4B7BDF58C6FE1D71FE9F5E96ACEDF8DB833A4CBE46BDF8009F0FBECA3314AFBB162F +0545C10E45F1F697A2B895849DE0EA02F2770349317E43BE527A3B1D808785CA305E06F6 +84935F0E7AA4E015A8A4FF3E8F7E6E5472D161EA42B964F48D1450F9E52D5CB33C5D84B1 +4138225527E6680BB40D7E73B2CB4BEC73EEF10629E9C614DDF422DCE8E4B6F64DFC4ECC +3C48660A9E1983F4A84E4EB254D5EDA7E1A6736D98D878502A6320CC661E4F47418B4D4A +9D0DD2A9733C000A0AD41583095DFF2D1AFDCF6ECF69C85E5C9BB3F202BDDFB142E6C18E +60B07D7EA40340938542A5EA036B354AB35FA8FA0B9391765A8C498B85F454AEC3F177F6 +8A122FFC8976D4AC99A370B3B7D706EB1BD36B3AE5D51C9482FFADA8DC7584795E8696F2 +81A0F0E3E9912BEA16AA15597B801EE5571F4BD4FB95052049A663FFF72DF8FC6FA0CBFD +A15889F230C5AA3B25F4DA1500DC0302010956C520A7F73E1A7A938E895784C05399030B +D4452FF0BA27AC1563BFF0BA19B2C5427E2E6B8A06BBAB6137DB007FC4692267B0D10ED3 +1C0341AAA6F3BF586940AACD797830468685029B2284346296F1500FE92FABCDAB796F35 +46274B8A69AEA68FBC6E1EBAE3957865D7DC284EA7A6CED43CFC91B1CFA4038F413DFB36 +491FBDB1902914D92F2E45BCE9EBCC1484C97058783BA2C17F42B57A180C0F4E35B71090 +CB0A51F6AAD0A5B01E9AA7B8E69FA463B54A124AC05B01A942526B070244A2ECB6DBA5F8 +01DB459733371F92936CDFB4F35F7DC4ACDFE02A4002186F98A1000FA168B6B409D152ED +D5BE9141CBE10E0EA1C17687E011FFA488E8D9DA7D75E847770AD67132F8DBA4DAB8E567 +54CE8BD5B72DEA699E2EDB0BC2868B71E012E631C747F23F5C221BE43E034DE187BDD469 +E712F4FFFF09597BDEA4E71E76693FC639F758606E99774C1FEDBB5F121AB9B0240D1AF3 +86B28EB0024E13C0CCB25457F4996665A9F68682995960BBBB9622C70E1910C36BF19E5D +AE05BA5AA16E07F1E26F00C5009F6D5BF8B2AB9A3A34ABCC391B1EED111BB98B0A357D67 +91EDB58EA4B24336B4C0CD8994CD552E29288AB0A7FBF948891C41639412F0F2B70FC00D +2C509270C53B5EA1306176290600581E0E7A793FF3C6A085B9C627F941E36C4D6D31154F +6CD00209EFB60C1AAE01636B10484C673C58881FF8B54AA1EDAACC309F1C72C434247C7D +ACA423249AFFC2ED1E53D1B862FB553E583C4694C99B6116AE9F6BAF64D2B512C9C624FD +EAD7A00D757B5526D4AC98137C875D0E0E051ACBDE4996DF3B4D5719114C22D5DCF02A06 +4DBF81847FB12C931C2D8F6E9C557666DD6AF7B28E7E763DA7BE334EB3FB89DC1D5D8F12 +6ABFCDB56CE31A41E098375CD932B9ED53E5DCFD6A943A983F071F8B6EC1C35DAC748BFD +32B8FAA674B8F902B433BF12F554D391B56A3C8E36B6AADCD9489CFF80136FC575D7E64A +957656B2C4FC270F23AD3790BCC95E85894C61108A9EDA8EC4D22E9846ABE07A528583E3 +3084991834D424B8D52EA04CF93C1275FBAF578710888BAB0E447C395F0988035DBF6B79 +D65169437CD509EFFF8D61A333C909BAD589AA1069281E3DD8A266D4809471F65218DFB9 +9CF1D4A6C4C07B0A508DE36F53D506B25268058512AADAD9E9EEA08EE51C0B12977CC9DA +DC195E944C659D2E847FA471A403D3069BCFAC82479AD29FCBEF4EF6C93EDEE4F0C0E44A +34F25718B7158938A3A9CE183D707D4F789A5BD28F331C23B3290AFC5E4504794654A814 +BCD943F786F603E24C01E81C1E8577047C3E85BB4D861278CE2E7E32193D1849A9A310C8 +419214AB037971D051A9355EADEE4F56DECF0B20C0AE7A396797480EE47FF822F96DFDB2 +39122A3C8F8A83B8B3E105B3950C8E5703BFC5E591437422FD417A71797DCD2872FDD9FF +28EFB8E20B2EC948F0D4EB1C67E7E16CEA436DEDE1B17E0C4A11F1E91D3CE839DEC8390A +FF3C58953D098B24597766D01BD59A89ADA6F1040482EBA4157EF2FE71B220551809013A +B5B47CFFA33546A676DFF72EC6D1A04D82750805E38EAEDFAD935833B94133FD5FF8A58A +5A01CD5715627E74E0856D1F8455F6379F2E8256CE604480CA874DBA0D06E190833A8015 +7BB75CA24E95175821FE790DF854F15E7EDE318E0C0171FAC8BEB5390B47D5814E4D1F13 +0FDCA640E0FDB9D0A5068E98158FE775AF2D0C7D9136087E00E07B67AFC8FF6DD8FD9CCE +ECA3ABCD3DD58DF9F14C032941B13E01BF6EA44844D52FBC037A47BD94310EC47A1F7B54 +B6BC07C7092D8946CF949C654EC1AA520804F8531C1534BFA935FAAD3B9D7EC925BB0C4E +2C7E8E205C09104B8FDD7F8AE970107E94EC5C2D5A7F28DD7C0BD6C911CCAD24CC303D5F +0C6C9A4A585247D5EBE57AC01E7D8E3A384DAE4803718C1C81D3035324BDCA7BB452A030 +89FDFEB64728A25EACA1F4AB96A6749C4BFD6DF72102371863F719D55825AE83673701D7 +C5139567073180C72C6CF38A0CBEBDDB043D2B412BFC25A08CBB18FDA0AE80554DC1082D +E4D70908AA0C667073F0CEC5655C947CDBE6C501B1E38BE843A5A8CB02312EB04CB098F0 +638ECBF704DEB82CB1AE8CFB27B368D95A72757162884704BC4A74DC7ECCCFD1842D8957 +BB1AF1B020A97A149AAC0E0BA7699703E9879E49F122A838BC7465161E9C4C62E02B38AA +396C1E65209428DC112B08AA731031B4198BF48048132ACA9B40FAAC94A236BD16BEB9C6 +83A511F57E22ECE0C6C63C0A3C5366FBC488DD3CCB19CA471ECD0B895B644C2735C8D008 +945C02FB39F91ED4D633C151251CAE4E82B18B55D978E6A7DAFD6F4D5497EFC807AE9AC4 +2BB5E96A8630756DD2EF1A7529AAB9DC1CD2A98C9F70ECC97D8D1F920A5EDAB809C7BEAD +04B8E0C3266E1C2601FCDC61B73007294ED1176FA5C5E94075A95BABC2589B04B2DC6A7F +2A244975EB7CED7636A6216A7CEBE34CE405D1C2BBDCF3D30D0B65AB3F92357B9AF56455 +2F36A611924DBC9C90AEF0F6DA64EBB58510AA8AD7BC633B8340A942721C69B39A01A69C +28E44C520708800484B236420555098D369EAF3A1251B128881C6A71F464B0DC77B9D1B0 +68B476024784DF5B722667126F0ED991F123124FEEF22BEE19DA1869CA12E0C94229BBA5 +B2CDCDE1BAD1DD53B2A713C4EFBDE270F0C8AB7F9AA27FA800DB025FA10B2FDBFE4B8A98 +A1283CDCF35BDB1A6291884C494FC6224B965B55742FC5DAC852C0D014CBE5D8E64406AA +5845853F669A1667A543E64D5F86444D0CC1C4F796B0F51C0BBEFC8A7195C72566851BFD +01D5A7F44A707448E67D202D89994F2BDA312FF16B5287D1D13E4FF8CA905D012B2DCC06 +42DD1A85636EE7981F13C099535D935C1A1FF5218CB190A58BAB01C2F502323676ED3AC6 +AA4485008B7D142EB15455355811F1FE8B7FBBE5D93534A4936308067A6F6C1D80F6A287 +696606946C8D61C244DFFFA6FAB178513EC0F1724B24B3F26F1725471AE031FF8E15109E +A992D90EFDEDF8796BE5C16425E1E1391680C229067BA9C69CDC20077C02364C6E62EEA2 +CC5A7EFAE6A9493FB1FCC5C93228AB5DBDA8A2BF8161FEC4492B02B4F29CE42BA9C5ACB6 +8708C055BA56CF6210662112EBAF899E62CDB2EB8A685EFBD1BE151B4F2CCA5DEBB90B5E +55FEC92DAABBFAF7C3778BA79A59B131682568FD96640F3794EB7C57A508DDEA025C7120 +89F193118946022A9024289B2FD5D6FBB8B8413B0DF5F65227DC12E99B7B657F846D798B +F5E74A3DCFFF1B9E1EADBE5A22268846CB5749B22A96CB7C2A7E1BF47E9E8F5FF7354314 +3112230BA9E8A3218442BB7DDA51AB8641BCC1A4F6D25B53A4ECDC171F1B384C6546F6D8 +7239CF09E6C8573BD593FBA1ED2C42443F6090EA7A5F4AF4781270BFD801F57F42A7C51B +AA65AFCADED310E6F29FFF5D641C2807B8CC4DF05D45CA5BB072F73E5A7364851C7DEFF5 +270D676F9F86E425D14171E3862B7FAAC43E181CE165BF319EF549BC8B5C3D3EC51017B5 +8FCC9817F9E527D8DD01F33C9B99A98F675312D26BB76FA0DFF8B239A1CC7AD1A5AA9333 +8AC724B6A4C9B5CADFBFF718A5593C51E476468BBCF2E5E77A151DD9DA236E5765CC545B +AD8D10D62B238BB574D665D0A6CEC479D1719D587C1362C2AF7C04793B2A7B20C297D5AC +0F96F6019E1648B603AD04F8817F6A6F5E568A775850DEE71372303059B137BB129580D7 +D10134DECD6D801AA62089EF6A573DE96E0958552DE214E3615A306B798B6D68314DBF57 +4305E2B09CE8816EA4515CD6D2FECD2EA452FC01F62464E73FA7006117556487B6F58197 +5EE9CA6DCA4480FB0B9450FA07B5FED7528ECC235BD8D3A24CA63382B0DDCADAC78384D1 +E5A6EA0646E3655E6C86C323CEED8F76A53677A70AC54CCFB97A3713E5209E1A0F9B6863 +289A62261BAD054A7A495C3D0F883735284B7ED4A624C39C8A03B93FA9BB91BB396C0E4F +E3A173A5100CC25ACD1E3967588C56F6F3E70AA6E9F5621E4B9F3A25C0ED1B89054EE11B +ED849B16F521BD9A143D0B29796D66BD57B4011EC290045DDE9C4800C2D0D1DE24501859 +50DEDB737635EDE2D1559E0BA7C0B361BBAC80FCE4E4B35746B8865813930ABAA5BEB288 +1D820EDA6A683CA4A94EECDB1BD0415D0586C844C66736751640C5E8055C6093FED9F84D +EADE6273926A863D231C9B461B41EFEB4D945D529AF5BF494858A5E5E0A0BF1B179B697A +F25A3E29991DA1DE79DF293961AB7CA49846941E82FC59B1C06B9BE8BA005138F6979DF2 +7909F57060DE9028ED61B1EDC811A60090CDEBD7781D628BAF2C540FC7B4783BB1763630 +96B50637075013D726F9D0EFA2ACF762929C06075D5992B5E386496B381858B6AB040CEC +184571C870023678728ED7332630969C86BF521693DE56D09D6D8B0B37511C7D714E9932 +6DD501DC3AF262A1837BEB8AE03DC161F61251A615103EFFFBA7757615F60F7AF5DFEE44 +5F9E832E4794299721776D643A4395D21F905685BA9038521F05E3C3E5BD1D3EF9C229CA +695BCA0132C4A64A71334D9E76C48F6F4D5901CBD9DAEBE194071FB0FE7D2C5C395DF93A +C1C64AA36EEDF18B1CA6E2B510E52A35091AE7673924F36F7AAEB981B9957A3EF3123C5E +05AFF67CDB142D00CD16E03754BF6C68CFA2D734333AD69B3A3296EC597C8B76CC3232AB +45ECC8B2C90253A7001485D49E6310FDB5DAD3E7EEB4305BE7DF36342C4B1E11E0945B5D +EB63198EE676FEB7D3382D0CA6EC11E11E8130AA9740FA070EB518CEAD8C85D8BE693FC7 +15B31D6CEB164254D322B7032075DE964C94AD8B28BA58A3A30EA9DE79234F4DE0CCE216 +DC09F22CFFC1E740B082DF65F10F9D9D173E1F4A996F16D5DDE396179B4CE389A555C3BF +BA3B9059418EE567C4DC661C151F9EBD8F2E006288A6CF3B86D8F260E15E77682FE2976F +14D4E69ECE6B15C1042EBDABA1D24D9758EC60EA675421D5556C26A83CAC3B003F8426F7 +98195AF444EE55CA608A69408D69B7B103FE873A1CBDE862A7F7C4B27E778D4ECEB1F596 +C4796B37DDA26AE61A4579506AC65F72BE3D01C2BFC79556913780F541E26E5316F6A56B +5C92DABA9B7B9A9E80BDD4FF1D3F27559F83021D89CE8497F665F2CF2FED3805F8CA7D36 +355E41188F853B192CC64320849EA08D09BC87D24DEFFA9196F75F00893DF4A069BB4340 +A9A451102003DC8FEDDDE6B648EE1675851310D15FE319BFD1E411DAC0402698598396EC +9B01FAA040F37D13D65D9F88120D6212C7BE51B98FECC29CBEFBA669EF8B73A39EF24D86 +8C692FBD3C55724FCC7BA3912B87998A4E50566ED69BB2742FCD60FD3BAD55EBFAAA0E9C +8BB15FD2BB7BD82D65E722297E9173E09D8C228A76755A3611170CE15924D3F2BC9FFDDE +B0F2CDFC4CE44B6507B03916E334B4FE336473D0DAD959DBF3B11684D09C67872EB406DC +E8AADD34D2A0FE88056B2184D2B07825749A3131CFBA4A6885CF4D84D914DEA0A4DEBD54 +F35F031C2B4C18D2C0E5DA80463FC86645A3B63209C53BD98B394398E506D8E34F0637C6 +BD702B6BAB0E45F12EA06112EDD4983034410D96D3EF907D32C71AD4953A8C90FB289510 +70AD7E985BE69AB6D180E110FDF29770905DDEC7DF995FF72724A275CE8CE825B9322B9E +B301DD7E90A6075123279F9EA89333E39457333EBDFC5F07AB1563003D0E766A010F2342 +A5E210C256CA182DF768439CCBFC43477E25E15BFDB3A224BC1C9D67B0A0EE160B7142B3 +58330DC30E49446C18969AB491CBEAA64AE611F587A3A7F7BD3B206CD034D0EFDC12C992 +4FC9F60EB7A7B7BDD94E900C5A58AAC8C17B3588A95D614197E1D5D1013888DCBD84F7C2 +51DDBDB5E1EE146350A94679DBE6A67BD7EFF924C402C23DB55C00664754CC9E4D3B1422 +16AEB7A712CE85947C4680102B651F83DFE71428028B258E722D827C2C347CE087C741CD +F0846675E34D56EF99E21854CA02AE9BF9B41B34E58A1D5144A6E9D698172FC2D8E8DC49 +098B77980978D67285DA23F821896D3ACFE7ACB6FD5DD87AE6D07F5FDE7AA553A869E594 +BC2EBEA2E0ABDD5E747FCF0F7D1381F9E121E97B11456F80215AC688AC777CFB9419D95C +DAB35AF315C5C83114FF51BD583F17EC51A911F255521B3DE63C5B0A016EDB98722E0B15 +FE68117B4406CAE3F29DF6CC813569882C169070F6F499DAD42E1ED6DEDBFD464D352B53 +0BB28FE2554FAFDD48FFB9E1A433E94681A5B9DB2AA285BC5CDA48C1BF7AE7999E5A6678 +D9ABB9A68BD4A60756C13ED1975E2107F6D1FC4FCB2E18FC25E68DD2E53A623D15B95541 +31F1DD74E82AF748119B40F6E4E703DEE1856BACBBFF672DF548327A95F3B52DD40105C3 +604A24047CD989DDDBBCCA27D28F3BCD681CD55AFAA1CC5F29B39FE1D6B59FBADAE71196 +CD83F5329C9B969A5BA06BA67AFC193C4BDA78A275C64E2D82F373EDB713498ACCA9FE26 +9FC4736828D55A98AB9FE487AF40164FC38085F9DE01332E3710F22EA52DA9CAA28DDB5E +3AA72EE9444F818DB13EAEE426543DAD3C78D48B513DFF77C18555DA53B33B04C8887199 +7B2C9E86E12E94AF3F379D196532D2CDB84741211A584B7560DEBA3C53CC78E240186671 +8D295EA11162384F00A727EA4B7EE6527DD7DFBBF5966FB4372A35BD2FA7BB7A6FCFE23D +AAB6570FA52506E3EF532E7E7930298FFBE47D48641C0E26D1BA636AEDCDE13DDFB3C822 +DC32C43759F016752DE8F256DF5B57EC3C623C05037F1E41C38C66D18A27610CA8BC0E5E +FE4FA49EB0E287E855990B9C83A103A1151727B192496B318A0730AC902D7C4B154155A9 +47AEF1B7255276631566EE5B995D9596517E42DE25FFC666FC0703336FCFCAA2B97031EF +9B95FD714ACB1A47A249DA377A6EC9338558939C6327B90B77249CFB4CE6FC947BF1E88F +17F20A194DDD37657E8D5BC31F624B6976A0078063FF707BADEF04391782C6660BCA4623 +17BC929F6411D2351B9DD2F67CE4BE04D251829BA6E5ABE574FB3D3D8D2858AC7B87F3E9 +951F0FAD71060D85DD3BF22DF505778932D2C7CEE2BD318C0E9601D085FD258C6ABC091F +EC3F44C639B2852EBB31BA5522AF78BEDDBBC52E804D5DDF23DD119B951551695BE44C23 +5DCD52729FE0FD451F9CEF413EE55AF45128E35BB451D654496CF1C8C2BEA6C95F87040D +928EE96A22AA91E8166577727896E7A26EA5298620E50832956DC5B4B95986C69079A1B6 +8F64DDDCC518AAEC30D9E908BEA76C19D54388435012C2F8ABAC88BD1F82A1083F729569 +0A4076112B601F35B1E104720EB73D88E0E62CC0FE278EAF5BE953AD8D44604C35D05A14 +7123538297A5B80677AE45EBE1620302B8248F2B0CCFA068CBF76C863CDCEDF677AFEF18 +F4934012F795C9CD39EED5915DDAD4F640BF75DC91CE77E4B449703C1FBED867745F67C9 +BC48C987BCE8B838D35930735744DB987AA4E8EDC83236D764D1237028F6AE8A6CCCA003 +692C28CD708F1C9F4B0468140AECAEEDC465455D8C69159ED0AD0D0B004A8B51ADFDEB3D +82220B8D2DBCC5E1CC0F550E44B83FA668B30044A2E9978A810D4EF995490065DCFDEE41 +E94DAA51D26F13EB8218220FCB1F0F32D5B5C15E715A4FCC605B2F8800F44B82633A83DE +FA4C3430104CE6650AF07AB2668E751DA4845205FD29B7B03F46B51DEDC3B6DB3E534E15 +AA0B33BD6E0D2C5F8442EF326828B9A3188EB15DB04F301A98E00710AC5CFBFB9B2B99BD +5AED103DE636341AB7B03E24016228C0DD81EC95D5A8B8EE1C44944858784C024BE6C8FB +D038801D2423D09711C5FAAB0E16C87D307B53FA9F874E6FBF1004E47C6A6907DF86BA73 +9DAAD79101866EF02234D746C72BC60A69F7BFC111C5C26B87440D836432E283EB0CB8A9 +39ACB06AF4FF3857EEC12A1BD1189514CD518060FC75DDB601F545CCC37676ABE3EDD86A +7FA54DA5C33D42861E585D05EFD8B41D42F7A9A904F48FD96E30EF9C74433B35B1EC9F3F +15607376F04695749F917ACA32779CE1CD986051E43C2EE748542E4C7CD50E3C30DD46B7 +C6F809D1051F977E7D351C67403B913BE5273A97429416656D83C0BE7C08CBEF00BB4651 +D0D5CE1E8885A32CBC72DD26CAB330BE9845425E048B1EE1AC7591F0F0CC9F73E1EBF665 +76591E3DD449304DAFDFB6A44C7BC4DCD9202AA223C9128A961792E3C0DFDA3515BCABBA +78F38651862266E779C228C596BBF3903F097765DA142C99E5185BE9DE2F01AFFF441965 +198BD1FBE9BB8D61BA6C685BEBCBD4381C20F71F8DEBEFF62D7946B04C7D357E54ECAF48 +A49EEF2ED25179C1C3FD45268363FA20D07A84D60484C712A43D224C57551FBDAF4973BE +EC02A16076184E3108DCADFA44B93710DB3388E633AFA06AFEC76802F05EFAE2CFC74A5B +AF3600A46B026AB514EFBB7184C75BD39FE9427F6F0F9D2435BE1B26BBD4816A72B8AB67 +DA7A6960F5A7A0E7FB1F83DCA6E3E8E8F1BB11E22D378FA743B7791E981D117A2E8126A0 +F3CF5C9B0C35BAF8B66211813FE63B029E2A3913CAAC2603AA4AC900EB8428FDF58DE83C +D998B69BCB6ABB67FAB1647806FE19FD695372D671EA0B6566719938456CC79D265C9791 +725AD53DF396BFA79E945F4AD42DEE0C69C995EE8DC3D8E85BF383DA9C1256AB133CECC2 +49A3BCBF384F53AD50B3A58606F4A92D68DF6C072E66997978A92EF5124DFAC8B3938E60 +94C0FAF7556D0F75925FE99AB3E80FEA8042A977931E75635051DC896059C30D7ADC38E8 +90131D3472CE1BBBBABF231728199245250B618AA5F830D20C8B1117E4406C97F59A9A76 +205946764DECECD486D1C217242CF8C58263535485E89344DEFAB9D94079EC177AF6DC31 +051EA610E81026B7569A061E99309A04CC3977C9BBA45E88B6AAEBF585B5C79E42548C23 +060E0E103CE6EA0897B43EAA35366DEFC5B1E5E673424D707F05C770F31218BF56855627 +8C9F75A113F5DB640C2EDB7F9D3138A5C314243030CE2BC58F4EFC9B546E407A1764118F +F9D2208C6219D088CD8A214CBC0C1DF55772A04DFABD89E08F7C98455E8A5F1F82BA749C +7C5C5E6CEDABDB9B3F6E1D717ED97A50D0906BD4682D9A529B3530F29113A35D5681980B +8D099BAC264E382DCFAB0419F3313453A080795E7CF66860ECCB8782191F4CB0EB2D2965 +F14D28EB35DBF1C95437674D84C1C331F4EE99C8DECD6946069B3A4A7DEEE0E48E817AF3 +08C28DF99E67A4413655CEB10BECCB27448530B1688517F0C5DBDB97A17C6F12C6AFBF55 +AB5AC791F5363E56AFDC38DAB07B7A47B9FBEA91427847C5EC1D584FF56E6F2735FCEC80 +DEB8D89F90090A11819D08591A37EC3948E36AFD44237CAB16533CFB51B50E1EBFC4A6D7 +BFA520FDA738662AE6C0214DBB2723FBFFC986E9DD47A493FC0090575CCDDD6C38EAA038 +3858C077F57E1DFDA8DA95C9A18D9432DA2C86DE069CB675D9C8189EF01C567CE476E0B5 +31FE688044569D34362235F894E746E6306C03E76E615571D9CE6FB31D63BF1DAF29AB76 +27C0D02D7760EFE583C8C2FAD4AF0A90AE91642F2F20725858CBC2FABB5A5A36F19A3C6E +455DDEBAF968A90312E83193605CE8E5454E396C2C59557EFA1BE1E0F8A0AADD060F77E3 +C642635484956025266155DE24655C44BB0B4D07099D81760DD0823EB9EBABBA27A559F4 +8803E6999B782A4D91C388B46E1EBA6E8BF7CE9080F46B539A507F5DD17AAA05D05A551C +B57918F3AF43390187E3765548F4E5A3360A95C80DD6AE1B26E1F90B8391A3872ECFBA2A +087415ABEBB9119CAA1D411EF7E0F0737AB30979A30B2ECBC8EA42F38B41421CFC94BFB1 +FD30BAEB6AE340D043A15138AC4A7FB12CC0AB80547DA81D91166B09CB56A5504C048DF4 +D4E1E7083B5EF010A38F4BD375A3918D25B05026FFEF87AC25AB554EE74AEED323B4AE63 +0F1320CC97909D2819A8EB0A90AB5F1147DD888AEC5D42C8C5F2B2728A80AE8673831189 +D76571F665756C2C01AD4F936EE0E607C27FA9B8E38BA5C67B52E7A50E09AFB2D0610A00 +863C59F7A1BF14A5D3FF8954CBBC3D13F709B433822DB8CA2E64BA1FDA4F9478A5AF24FC +A4427F49F39EBEDD3BA9DF9B2ACE9FCB01BCC9153A7DE685AC5284427B0C573A6E5D9013 +86834552B2356F11011083B65724EF7F8C7D7CA259E0C03793B9EEEDA5B6DA8376E72EB8 +033A415DE664EA5CF53B88655FC02AE5E530C6A90F443F740444956B60F6ED760294DBC1 +9F492DB3A5D4E532D0DBD9EE8139092D3E89D7CA7490400FA4EBE56334B1A17C9826AEB7 +74749C9193FBEE0414C7E7877E26B8274283F14A14AC7CA27139CBB8CB89A6D38DA283DD +3D421153DB2D917391215433E356E64E4A07F6D82EED542FBEDAFD11D0BD4EF3041C6865 +2ACBB1FE71C6B7B3850FF45176850FFD64D18D4D55BA5E74D037D3CDFC62563CE2929233 +1E42E636DEBE14DE81804C1A15903CFBE782409A1E8684819BE6AD86F1C0EABC03F4CCA3 +A959E0B6C57F02D29062A6F0E3E5978C4726C01F607307C16F5F64460E81042B8E2F6524 +EA16F9BC21AE861DEE4013959FBA74E40B750AEAD9607FF6D15D96F6C28F4E9398C70CF4 +1B654A2A337FC8AEC523F27F6C5F0DA4B2D4A3758A0DAC65BF2167DEA823C3D108D3661C +CC47D80C948444701335BC4DF8A8A8E433776FBBBDF0C97E985DA1311451CC85AF9E5BD2 +FFF576BC8E4A79C92A00678761D47D093A26796DE0316A80BA5CE0BB69E188F4C38E7BEE +45C8DE646991071844CBB503847613EC82BCD6950F44D64D8117B52E3A63402C09931410 +D7A1AA9A04F9815D52C3BB9FBC829F9DFA76ACD77BC751475979D82275B709AF02783A64 +A633CD8F213DDE9216664C22E9F9AE3370B282E9098B86D4FDE991FB9D16D04C0C7F5262 +D539102F6529D73F20D1996061515A8F1219B228502590166332AE7D27CC822ACCF92861 +5091818F53CE6A7F1C5A68CCC3D6C7BFC81167C3C2294C9591B71CEFFC88A245E16484DD +1080375D15B6A3BBDE47CD198D0BE312AE1F5F6EF6DE4A2CA38A717D7104466509C8593B +FA6B5DB6DF788C6952A28E25CA9E20D636EF9E84FE3CE4D3A4647464F79111A610A1AF84 +E0BD4B8F7BA06C3AF012C74C91DEC0C597E6F4C19546D258D9E53E7943D6694EE85C74B4 +93276817411892299BC02A2CFB065F5655DD87E69743313801CAF098FA1C56841174EF0D +4A7F27B2E91762069656895B9FCC9434434ED722BB9A532606688F303D0C514B31D179CB +DED0DFF008F09184FA548FE7C276989AF46C9C63000814F90372A1295717CE87B2D9EA55 +34C0A4D467A0F6A32482B8139AC4240E3569476BD4F8D5CA5CD62F28BD2FD820602FB678 +69D696EEFFF2C173D2C7EBA377390670908EA07A7E90BA16790314AA8A923B234C8ADA37 +25888BC9A631A4A5B308378369C29B79966AB44E3F4DF846B0438C31B6143C9C3A003C86 +A2119FC5FC1509BACEE7A9A1EF43945214A1E37879CABF18B7A18E8BFF45E9C5E7CF05C1 +81F2BF236310B0AC2B1D45E0F6E3961AFA34CD8597914B6D503F7F5BB964B7DDF195A95B +FD5F3FE49340767491F213D849B3299AE439801B84A2718489868599F29DB6849A5471D9 +043C6B4BCB4AAA48DC6CA3DCDBE782D3113463400F09399DB804AA81FAEA98C6C7FF513E +1CEFDDD822C4A5ED4F0EC1AD96EBC6A713BB82FAD69C3E914AE2CE2AD2DE8FA301364658 +0987D4836813D3DF7BA9A77601FE3DD487408794D7167D6297BB19C8ECA466D56F130AB5 +E0ACE40D575558A8221EF634AA1D43CB10B8CB8ABE6EB2EBF97C8ECBCA498BD740A73DF4 +0CDE64C2C0F2D1468C01047ECC2320A9FB6D965C83A2CC768323CD1FF3590D6DE86AAA5A +4ADF258AFA132E8D8C04AA614E11D26466CD9F265AAE7D8F3629857C73946C1CDE7EE21E +15C1ABC4A1F591DC1CBC14B66269525A664419D0C9AA2C4713790AF5E23B566EE38D0530 +886A48F041B8B009C5522B55E63813023C763C68545AEF0FBDF2674C94219D0233EE3D3D +165B31C9BD4B9F27649B860D935D77557035BDF4238B499C5CEE68E946454034E4841914 +987B718F237862C350178B8FCBFDDDE9E184B3EA11240ACAA8AB1880410F42E0C66D7A2F +CD1DF1A3E421353590D9880F7A5A0065314D2E892D45090526A1378ED18A694F6820EDAA +5599C2EAA34954D28B021848397DADFB07F7529EE0C975F5AEB815D91BB7CEACD2888F3C +9EB8BFC41EEF2883618CCBAA18890E36B6CD9973E0A0665387DDD9829DABD9DE59C20652 +6608C3FE3D5033C33DF477762D37F080E3CC292D9E18348B2200956458F0CE0987B39876 +733331F948C4F15C818AEB8F829C03DA8BE6EEB40AF79A1686AB9A289FFA67BE3A42C396 +D5D24246959921707E84C9D4BA448BD725D6DDF0F735C9ACA2FF7CC28B75A81100CB2B6E +05B75DECBC1204C68ADD1B324CD24F99E5ADF9DD3A41CDF704184E27303DA98C72037B29 +276445BE607B12363036C6EA298E2B47890FE0C3948DD0AA3D0FAC17ADA775F58FCC520C +3B289ABB6315218DD1D5A6F36198EF93C58096B8A4A97D6B49278A7E41E0ED9C9D28186C +C8B5D8DC860505D94B5BE90D1765C154C43238EEFD91F5A385B6FCDD19272F1E9E3E50D3 +83C523509B45D8A166727E8022861AB6D8A8DA71EF875A19362015DA1672CAB7E9D80E0F +93A00867BF6A4B2894CBC866BD744013E8FED49596E6D0CE6D18D5CF56CFFB2BBC53FCBD +9F2B1D7221A7F5B539AA962F74E002DFDB8A1425A881DA6D62DB3E1E43CD9C20C4B8C0BE +FCE4B01FADC43B7406529B30BDD270098761F3BEC88EA6AC40C5143AFF3B926512F2D560 +F381B90202556D8E3AAE54712179B1C33131D52A4423676F83EEB850FD9D3281F4E092C4 +A3B402DEA3D01774B5BC9AA527D7E2A28EA9E6097064DF15F9A0F5B1AAE25ABA18689AC4 +2F1E2F1BEFF552DC96BFF8798FCD5877FB4F4B5082AF6D3F24293C7D34344959BA691E53 +8575D64484F2B36F1223DBC2A9959793C29DAC7C28E334775A1081818099D1CA68B693D9 +ED1D3163BEE2611E01B87E8B443A0D8AD12F251752E7850C29F2A535971E4BF055EF7322 +652B71CDFA987F4A51269AE8783EBD530F6180AD15739754EADD4811134E25FF8D2C6FC8 +9FB63D240BA9E80CFAEA02523BAE484EEF08045792885AD55A5D77F4A6645001DF9A596C +877DF33EBA8E728567A4C4FE3D848C7C16E8A3B156AFFBCCAE51E668656929F9D061648B +27093B54604B900461B0E9ECF73718C3B5FB199592BC7C59466F041BA9963920E2174F59 +7F943A02728D5B7FF69735757F5071904A2F6FA79DFD8F35E96DD4F92ECAF58A184CD6F3 +C05E50A25BE5E77BB2856AF8C71C69BDB8EFCC82EE65BA7841387E9CD655FDCA5707DD67 +26B96EF73B36B83362698C5945C75AAFDBBDA1ECA470512B7E11CAC4FFA3C3C66A07BFB0 +1F927E762871045195410E088ECB16884172E616721D58A5F51B5CC0AD3B3858180E1A36 +76CE2B46D4D91D06B146F81BED26358E5301AFD2DBB78D60F9F1A6185B50BF7A18CD41C1 +DD9065950F64ACDE99EBDCA136676247E455813438395B2D3FFEB24A2DE4D8D742EBADC7 +CEA283AD867A1239C224B59D55BEB159D6E4F5E588AD01DD7D398AD7BA539E6F82F8AAAF +9F5F1A7444DEDCBFD014548440DF870D701E9485467492E832E235FDC1AA087952B7126A +017E73A40F8CF1EB23E9BE25B942B2CAD61746F5277B807FFCD1C99CE3B2EC69FE5A648E +92A04C71CDB188935DCFC4D261DCD29215431D80A7979C571CB7E1CCBB7E3627DDCE9717 +148CA0E8BD7F7F22BE4ECF15E8B6CF1B0B98D55A3285DC2819172495EFE082B32E72FD3A +91986A13CCEDC5D832C77A4B559175C53EEE61089B4580FC39F34997A4DF83E427FE668C +3D89C417FE22308176F895549F6E5BCE6EB9AC04675AA645BFB2D81A22CB7B30CA206A3F +01B9FDABC7055B295236A79DF2522E4BB918AB2643351186D695E56E61CFF970A4118686 +E85A4D2E34C515D0203848CD2E92566F38E1D0DA886DC2BBDABF5B3D7B4BDEC68C5FE6C1 +8EA7E92F5470CA95AA5CDDB9936632E9DDDBC7FDDB86D4E96CCE3E8C579874BEED51CBE4 +D861D6657AE53192DB369EA930F87A9CD2FD7F9361D7CD884062870D4149126AC714B191 +1AC77CAFDD1C48686AC3474BDB9ED4B73EF67193714A392C4B273E919AFFA7EFBE7C690C +82E547D56C79ACC4935BAD6C4F333FB5774FE84084EB940DD7E002410132F4A84894E2E7 +4661DC6CA73050FF3BFC04AA8959E9C91D2EABD7447839F3B32E1ACF1482E6DB7ECF37BB +EE26C27AC90BDAFE91F8D92534DAE644CFC38E2A2C540A3868B0E16A6DDB60B02628A94D +5702C1EC2211AFC1A9F7E888B90263734588B6FA7BD2CFFF5B56F91A70633C1353885C24 +8C5FDF9CA938673645E3D320D7C5566F4CF7C9C6E86C9945386A16FCB72D342D936B0E30 +6EBECF12E4F45A6CEC4947A71D674128FB0F72C198E4F4227CF98E2F3CDB7E7AB55AE127 +1C2A39C526CDDFB66A183B6589505CA7F5EE98C400A6C760441B01000F2ECE968EBA5DE5 +102C3974AD4716D7789E07AA39A3458740D9F55D5B35DC0B557CBA9661B6588B37F63173 +7579616AB866890E1AF0B90399F1F7E95E18703E6F723E70B2C00B6640EBB44353DC5A25 +D007F285A25B3241BD80CF83C220ADB9288AE09FA0DBACA187671CAE9C04B61AFA10337E +75FE9FF0A4BF03605D0FFE41DEEB2F2DB93CF868CC7155DE51819D14FE17986BD187DA95 +96C1904E8AECA0F6DEEE83C9D8CEBEF4C0D13D5D5A13E6F3839CF955A6AAE6F7F5DE124F +0174F811324CDDBFF0247214BA4A343959EECD37D67EAB103B4B9CBDE0FB77ECD1AC24A2 +C9FDB80D0C07AFE58C4839CF9D4CE6B78A1173AE2F05C51F17827754A8EF22B5FA54F3E5 +9ADD2A1103F898664DE8ACDB89929B04776F51E241134E9A77F071CA83DEF1E04EF457C7 +56A29D540B3ED164BAE4BA2C56967BCF5BA142CF8640CD829A952063BF1D9714AD903999 +F3B59167E2B440BA083635B6A11A652E94AA1135F9E00B0BEB10B533811FEBC64C7107EE +7A2B4CEB6D019A305F633A9229121A9E1097C289129181CA5EDFDB7F9EAC133C6025FEB9 +9C9BBA2BFA67603A7790A146174C061889EC6A77DAE40C6C4E002263203BD6BD05D3699C +7C21644A24D562DB3C2CEBDABD3DA2F607458CD4EDB1FF6F9275F767B8FF38AF5DDEA7FD +A18A1CC091BEDABC7C1A959031009969572A97AC1C6836F3C24F6960ADB94D89C5FFEE9B +3391C4671A09EA87B8675CE4D3C473E3B8A750671BC95439E75243100CCD0E0873A6A218 +C8E574583C968E46EC6115266614DCF130AF7F2CB1DB978B409846735D7B29F1F8042921 +7C32639EBF476E5B0EF1367F65F0600DD11C0142BA2386FB01479DED4F8AB419AB5A82DD +66295577726A4C30D92A8972B72D0EC338487B630E86FD7984A97502583B27F5D1BA3A0A +8236ED3B99EF2AFC4018CF8EA12D89158A04353B33FAB1E638F1817E72E8B6AD3C58A86E +0DF708B6F1EAB273E746FDA3A8013271F16D3F0DBA72A07FB48CA2E0815F5635EEF35FBF +27DF180FE2F9522E57CB690E4DF7BAB0C4F07D34BB8984D569340061B64C6D1B5B5E2090 +31A81A794634F445055CAFCE9E72BC0724EE4C9CE1F94D461E9619B3CFB47B5C404D15E0 +3C61B1F11D23808893679372E8BF24AA8D6D443F9A29C2908331F799593CBFD1AC2EAD9D +855295E0B486E8AD72F570B3D768D775D4EDE2B9E48FAB6EF2C3A72F458D8B2DC2D534A8 +55FC77ACB99BDA7B5FD432D848815D327BE30A97556203F1C4276993E1A83329E62E8288 +7ABC85C17622A83B380B8E0C381376DA627C5852F0A031B80E22273170CA4D1367B183FA +169F6EA37C541C3E4EC299A8F34835D56AAE798E69B233309FFA71761469CC4736E2D627 +073DB92380000DA1B9D6353AD27DB894F3DCA36918E7CA103B60B1AEC505D6BA9B22A92F +BD69B9B2EFFD277157AEBE234B579E82D829D06DC06E67A4AF366F76D9321CFEF7DB3167 +3024556E61DD0FF006848A044D80407DDD75F123B155681F47C15283A44286FAE9549D8E +49477A38347F5AC9940F511E0222BDF46263DE6DBE16990D0975C2279487BCAA41177833 +C54F854836CD22346F409021DD7424D157B2E6DC9CD664EABD2B5352B1326C1C046D6E91 +306E84D44B798DFACAFABCF352426442DA14795EE6EE5A1E451238E946943534A0E4D53F +5CFF56D8AA689FE7E45D8974C5CE1D4DD9608AA42A873D0A0257D8766E7DEE544C350556 +5E58D358F0AB8DC7038795861DDADC8B0387D823F3AB985FFAE915019CE53B91A2666F39 +73143D04434D1B572ACF9B335F0B921E1E49428DA8AB0BD8D09B351C8BCA247A86FF7253 +4EF78A5150BA14BDBA2D535D5A46017518104E810EC678C9202699159CD05060C1C9A5DF +7421F17177B9141550BC2B2D9F2BC5DA1346AF811667AA0F5DDE7F690B366F6FC9C3A488 +B88D827C24ADE4AF85A5D5CEC82BED8485EFADAB9D9CBFA07A879A9D6141EBCB10028BDB +83DC99174B710E444714AA5D275073EFD6C542654E303D4F61826E7C505FDECB175C31F3 +455A2E835D12123392DB79B22ADCB30658228C0142B6D271FEACA94A186539740AEE942D +11F4B10B00C6DA85D934FDA37B37332E61C66AB95EBB5473308E3F2E33F220CF1960202E +5A2A81C85E8E831D4A48A7A9CB178A3F59AEFC408EC69D76722CE9FE89F5B7F1A31C7606 +32EAFE6DB673C6E76B0E472B2F0844506A481EAB5479CF0C559F02718F76D41F78B2CED2 +19D72BD4D9CFA3F99F1B8869E0A8AE58F40DCFBEB1B8FDB98032C3430E7402B9B1A93141 +74557B5A1CA485CFCF20D6830140FE0FFDE105A08DDB301E2109E5E371C2EB2568481443 +51F989472D19D12AB51C7F23AD18B592118EBB0945747EBD9F4DABE0C8EF4F3B8AAF5FA0 +34B3FDB56EC249523B1A3C32BC4A6719AE510FB82BE0CC27D6D4FA2A806941EA8E3CDEB8 +A30F91078D22260FFD25E57D8B3BF7A743031731EB7396D5E9A949039FB9ED19E38D5C5C +644696E3EC29B78591F522484829BD1A58FA3595AB26E0566838DA3ECD428D905824B697 +3FBF19090E11E99B789B61C0BC97C86C7FFB32FAB5C7FE00EECB9C8C126C55C959A6B06B +C709F0923589F9E540E746AC6949DE143744799EBEF6761AB9DA2E06127C18617324286C +874740B4B5F82DEC59585397A4B75A5FCE31AB26478A7BF1AEE14AF3098F589C1FB7C010 +ADF80512E936F57CDE3B8E244B00A80054664EF33B5BA3E4FF2F43DE74496A57C0F13B65 +A60A2F4CE599BB104E72EDBF9BEDE7B943F9404760B7A79AC38AC19086516CB33AF7F962 +0157DAD4D4AA68B8C96A66AC15C526A1711081F56738F3238EF37EF609BEB0792D41941F +6F1C7D95E0391CFF720A51755979EBE6323C653EDAF0808644E41FACCC09C29E1A210B10 +881AA79E4D9714F33A96735C3B2D0B13EE6272BD4D157E7FADE7F6BE9825E5655E80A018 +5EB33917002B5342002CE5D24859B6EA11E571FBD6F1F753974F965E7B5A8E0B3BAA8AC4 +A6C6D56EC55E44BC9D42C8A9AA29249B420DADF448F6DE76D1DC62763D5B01A4030A7D78 +28BBF81417BB287B267F64F8676174097E43E99785609F9C542ED5D29121D5626A9C7461 +5B145C86C2AEE98A127B25A990D9D73987958DF6831FC937B06AEFEEE14583B91590C768 +7A9FC1CEA0EAAD6F29FFAE96F8ADAA658DE66B8567E8A9E56D866B8A9A08C3D389B3373A +AF2D0AABBAD35D8F3AAD5D04B69CD31F7BE8ACFF96CE6DB8C42E9F842E4254EB34C2DB18 +F0BD1D6EFF4ECDDCB5E77E92CE64F20260E68903EA705FBACBDAAC6CDD7FB431948F1504 +876DCAE96AA501F25FC5707CAE2DA29E995B6C4BC6CE6C641CED312FA02000D9057627ED +14D531443C740E7CA081652087E0360C095652A1CC56A27B7FA61B3420ABACDAF14E02AC +C80FD7B412A97CE4F33DAD5C747EF14281EBEFD492468839338802E42FBF554DA46DDE16 +88D26DB26DD3613986E9D28D14D4BAF9F739F93E8EC34A2BBA207294D8212D2CFE560918 +A72DDF5A537C4571281DAB8743A487D8C370D67C0EFD1698BFAB848E86D24DA2D213712B +BA731CA3F76B657051083119FDA759A58F8CEF458085052FB1440D6938E438774FF94EF8 +896FB0AC6A92DAEA2E7C00BD76000C5BA8BAB7E5282952B4F16BB9AE8265F8637118A4FB +F229CA87AE41C6ACDF9F8D318D6C3028A70BBB245DFB2E1137E3BE90284B26E8FF4CF77D +66231F1BAFF98284128D08E8FA4FA75981A22F45CC026B1906FAB73C2FC219D3F7253831 +17A24392036B26AEBF3495F3300F63AFB9F0FA950673F5584FB20CDB57EB0E947F31DD76 +945838D69875CD1A4E7D2AF5382044DFDE866E37CCE23F3D06B1F5A941FD06CC0550D64F +312A9D6A655414490AB1B1FD54E34748E1D408782FCF8FA6A611232CC7218B4A0EB93CD2 +09876191651777FB56BE434096B02918A658A7403E45F59A1CDDAC1BA53DD186DB8E35A6 +4078C11DC0DE5165205CBE612FF365C193BA540F5C6CDCAD0255E361622E94607400A330 +BCFABF835275473D4C7767015963CE0FB7DC88B4AEB660FBE4F86039E51DEA6DB4DD229F +73D4A0A322C6D349A4C8BB304B96B32DC129DDF372FC424D1815C4EC51C9B0743D6831E2 +6BB5E28E89DAFC8845F00E47992877FD57EE0C02A76FBE2FDE8802A176E8A03509AE57D2 +0CE44217026FE28F2E06435ABF13D27875C5B4C6057DB1E1F70163C1011972A9C0DECED7 +6C8B547B8202977D802062E4189713D7F579093F4B9A72C69516F1179DC3512584977589 +461AC3D1BE8BE1C05867EF6FDC26E3B82D9CF9D159DC0CC1F9D6F94166A60E6CB9FF3FA6 +0D2B136FB725DE769BC3A8B64722456F049421CB7F863A357B318A979C3513C9065F5CA5 +93022DF125C9DBFBB822B1F84936DC5314F17DDF2960FEE70CA3E7289409EA5AE6F15DA6 +0E407C6262D41D52C864705B7DD26AF2CB813689E24E9673686ACB1970FB41CAA49378F4 +31C53F3A08AC7AF4D13F7FA81B6C3F71FF999380205C74E1B29B5A4FBD349783DF613FE7 +E2CBC7AA7B424965C42EF2CA80C60E0EC6F7665BB3CBC009F0F5C6D4E8ED5CFEF0E5DB9E +3DC006C98706723B2BEC309ED20CF1CDC60D66BB478B87E8947419ABD499CCE74F80FE97 +89041D176C3BEDC9EEF152024E3678134EDF755D8C247E3332F7ECE95E649E73A54C5BAD +228A629F5F6C8EF48935C8591910230DC5D04C395325F0C211BEC315F26F84AE8DE9DC91 +A9B5796CA0ABCD4774CC3DE12C39C2FC257165DD8A7E458E87CB67B6A487F10C351C4881 +0A636E4109845E0C664C47A2E11F9C99BD72570B26E854B4BCBB49F4011CB2CA4464FA72 +6DD8C1F05C69527991D634487D48BC554A80DC32B334D3BF6D65F1AC32D0E764825C8760 +8B6317DCDC713644DA60322D68CE38FAB781D24E14B19E711BCDB629AF7DB032CC9C4393 +195992B6ED1AF8B84AA21B5E3BB12EBA01DAB58DCC2E9549747FD222454D0327C66D62E2 +7EEA7AD48B09DE56F0968E271E59E8965E16862B7968A14078BBA821C2A4487F877E3932 +1D56C51B010AFB2844BB7E4AA57E3AECEAF7213B1C70F6EB993706C4F2A613257027370F +CCA30A862ADC2D07E4619A8F753B13B94C275A14403C97CC131A924EEDF78933502A8E93 +344E91F5A238B236B228DC9FB65C60F8888DCA6B8A1EA897530D193537FF73E8DC70B3EC +4CE290AAAABFAC0EB4C9534C7F3EDE90E840A1CE7975204FE70B52ED5576B0956E62EE25 +7857BB5DEF2AFD8D46228E9625C5C0FE48311A07CA246ADFD9BA1435340914455C0CAA4E +92914E7AF31E25438AA05FA2656094BB31855A27BCDC45683EFF1291934C3C115D8CF919 +7A245EFEFE3F7FDEC037ECDFE70737A4D961CA634AE153B01F03B1A9F72B602A8358D258 +E03E54AF79090DB322ECE0CE33377E42E5373F443E851550E5D44F06C1C513173CD04D47 +9A9E70C9774780821872EFC100F5F5F34A1E0754E037F6F5917EF5126E5F12D46BDDC038 +2D11C217839C1DFE8D34BE69124B3934B22B4E8225BFCB2F265E197474B9349BAF2C1FCA +352EF3F4AFAF1074DDB24E8A70218C83DA835CC97F6C55B6FC10C199BC9EE1033F6F2890 +FEFC3998D9F2941E350297F56B377A0EB5BA47A8195331A7CF3BFE934A97B88F18A38551 +3EA97201C200B5419E83D8AE47D6D6F3E864CFCA8A874DEEA5CADECD31CECFD46771E9FA +7B24F3509E6B0B04F8C4C1C8E27DB0F2F9E0A422988B2D525670841C73E5D11F4B1DF7AE +9AE2D8A3B5C354446C86862C687A3C21CA35FF2E962FB591310B8C0213A914278B65C7C2 +83E1CC558F6091BF4B159428BA249CDC3395D72E1D5E998C88F379A5C0DBFFE5833349FD +5C61034AC1EEA717B26646D9024C3D8763F3B33E60A5BADFB514937B9AEA89009F5F6779 +8D5D92AB0CB3D57FB123DD852BA04E3C0AE9D8021F0735B69289822FE2727140AD5B911E +376B13EAFACC44BB0F0A8DB9079DF3F3720779B5BF1C02CE47463281F6E496AB7695291F +26C2E02A026A104C8EC76E0DE5D7272A3B83A947E3568DD72E8B2DA7869D1FF74F6E6C0C +70CF5EB3D5D650498D267117C37DD3FB5870C84FB972E5C52DC3E0CCE6FA398D4807F1ED +F253D014AFFE0C5EF86A8E431D1EB82D6D223809BCEA39DAF9AC1CD37243CF73E0635BB6 +6B8887C9C2B2C740F8373237B52A89E589D811C40C5170A7B7ADC6C5643F76C4D5031862 +961B7E211127BD0F716CAC04C4F8D8D0958FCF4D420947354D495BAB0C0D2D76030FA004 +910DC71A861857B1B073C6CC56691822B8749EC78741ED8EB2FE26F37E1F9A3B36947EAD +661BA045810DAE798DAB615C0FA2B242209D8EE04BA06A78FDA985402076CB3A893E5364 +2C998BBA5F530C8944EEBCCF46B9BA42AA25E0D859953A948E85A8022C68EBD496553B68 +2555030C9336F53FE11C84168F19533F5AA4BA9C94FD120491D55C1D3FAB459F80F70034 +48F1AAAD448969D1DDC31D65619CD33070EC9BBF9B4A53C180015AB0D807744FB32AC68A +DFD7986E082D57C22EAD0C5352E86911E8088BF50E5F9E1D70241959CD3C18145B258B50 +261CC153E7CAB9BD1E723209024540E123C2333D5A5C4C45ACA1358790816CC30F3D9BBD +8453E76263FC425F7C2E41F79B402DD79552BE2C837B3048BD534F90B3AE2CB1F15A559E +C00F1E783101866534B0039C433AF1DEA08C4CBAB477327EB3A56AD0F7AF75CDEE8D96A8 +0BF499251B400B85B4D157DB4E54184AEC11547522A187287E945DBC7E31CE99E8499737 +2675C3059133BAE517DC46AE28E735C72E31B30AAF58CE26BAD1FC878E54A72D0C44F980 +4C9D5D93947A846B01F61AD1325CFA2DE62664F181557BCB92050CD697A26133B06D6C6B +2B2CDF60CE774CC5EF0CE86EA4E4879ECFE1C9B03E3EC73E35D53F5A1DC2AC8105953D02 +277742EE13CC39195503F2F5C8C29CDA7E4D54AD44DF4BAF5006FB9C081A938A5B51EDF0 +A20A005D40125960D589531F23CBA7C55CCF78C72DDBC8E9D84BC2A0C95DC0134FC564CD +B08777FFD70A0EF725693F54E8C46CD77A5B9FDC91E83AD010DBA9802E3E140943706AA9 +2FE69EC2474E61FBFDDECD7FA0641290E709A9145D8ABF5DC42285CD98CEC24BA9A7345E +BAF82D4461F027FD8C609CDC0EFDB7696CDB4116EBB91F0FD74676DD5E5C880CC9531A26 +D0256575BC551C3CB40BC4382B30302AB0B891201F818BFDF6D4BC88DA3E4CCCD97DFA0B +C01A7FD9BF8DAA71C8D18B08E213AA8FC7ED8E3172F80615EB510FCD5AC5D508047BE71E +5C0E2F8E200E2BB4A8BD0C4ACE1D5CDFBBF09C74516F09AD40BB4DCB48310BD33D28B81F +B6D0D04144E925C43A7CEE48D7772344EEBCF29D226ACACF8E693C74A0C11DA4177FB477 +6148575C305615CC381612776C6C6ADF8A92408F434717F365CD54EC0507D77032A1EEB6 +6478EC198AAE86D1DD2719CB3AB7A34757C07DAC27ED8A2EE44C55EB3F7074DBC98738E6 +175EBE6393151DF9EEBFFA3B8F5CACE947311B9CAA3C9BD0FB3B359EB30A910D2128D437 +E9216956AE6574F55D25E0E5D8A8E0C96293CBE723960A373ECE00A392D78456EFD6E287 +D57562DB3BC3D2A7E767ABEA1D7231C4888B7F7DA7DB7ADF3EDDA0815CFF72C4A40E6CB1 +2D55239788BCDC55F9F4FA9772782128F15E16E71F33F6C5B75BE8DEF23D8B4E0DFD8173 +879DB3411147841801D556A6390538919D7D2608F5140F564EADF2DC08DF0AD03F8C126F +FC49829551BFBF7EF652359414F56CBB309705B39D719A5DACD7401D6AB251FCC278936F +5A0DAE9A899AB62B9A33FCF22092DA0984A4BBC5C90C6F0448D48BF510E9FC8C9B67C447 +1271E9ABCCBB65A4D92DD146C910AC34752CE16939378F0030039D7DC4187B66257475C6 +AB2E3883693090DF350A42D3ABEDE7E84B3EE9187FF09775889B28DF0C1F289AA28E9EFC +ECE418B40D7AE3EBDA065B2C1B0AFEC58B67199E52E33FA3A305708BE5A2B5C88795617C +DA1EF1314095D09920B6EAC7FFE58978DEDDA2F17E598278DA325949A4C14C5C0EB76029 +1E325DA7F4DD83F453B6DC912C790EEFF754F69B308DAE37ED42DEE308EFE13437599F15 +406532D885197F621DD87FEEFFBC70BD47AB8FA0FAE972242FBA4F7A7F09D01628F87645 +1D3A6B885B11F74B42C8FDE4DC02F0E677F0A7132B751720464BC97DE5BD08EE4170E7F5 +036BEEF0824340EAB34A358635B8279825717994AE76928D15502BBAC200294388F53B1B +C01EDEBC38390B986B27E68AEF3C05883E851BF71A6EC8A3DA59A3767D40005DD98704CB +EE22059B92062B96273D77BA9BCDC6D856102AC322CED73033E6E86DE0CF2B015570C46F +9BB93DD4979472A4BB5DF56ACA2F9636B6A11253421FA471BB93A5561874B43C99BC2EDF +333511242334B62A0BD58E9161260561B9CB3CED25518A3CF7691ABFA61980BD4E5B6FA0 +7ABB135421400F7086EB0C4FF44E220A7FE7D92A159BFC63E4D01700E719D56BB6F440E4 +142852FFBE5ECC6B6A1A66D20C7F07A5AE5909685A3A71922C7AB0D1C18A27BB6E6044CB +B8D2C5A86785378EF5CC4167479142722523E12132F03E5D408F69CDAAFA5C55FB6E8AF5 +8EFB0D41B8448A2E30C66C99B5524AF66BC0F8C5BDEF2B8F0877C5E316ADE6BF0FC19DDA +AF9F915CF3119AED62D21C33DCE3F7EFAFF5A7B0CDC005CE387D4B16C6030F751DF94863 +99BC7E769FAF52EAD494C8154AF2CA80A6982C7F5B2206D9D4B39B6E61956ADFC144723F +99BA540F0C9D1DE18921A04A3206DECFF8D04C727FC9E88DEA9C056E2179B22AD2607017 +9A901B66146D0951DDFD1B9E384EB181D7945A4F83F2A06EB41A2459903FB0AC43CBCA77 +1F62A2E9727007042980C7FF98F349CE0CDCFF6F3447C3AF2712CA82D6828DB71C48A1EE +E331572A4591BD9D3FA077E2F29D0DCF9C68CFE2B6A71FBAFB0E02C241582E09E3C848B2 +CB8AB75D633C42598FA07F85D5EC3F577079CF2F0E68162E66D83176EF3B23291D741AA5 +77D747220835A8B966049F3AA22CFC0D6B1F55EBB917EF80B50487FF81BA7ADDB90CC430 +CAD43AD6199CF4CDE68193659F7E4860F259EB99B56C0E62390597DE3E05983AD165982B +E8305FF7E77363A9CE624FBC98626C21F6723F61352E036656B96277E783D4E6BD0EDF58 +5611C8D7BB3132B9E7C21B65B6EC5E3BF908677F6A5C5DD76BB16CDE31232CF2DD3F437B +BCBA6901A99D9692EF82FF0F8CDF49DAB5A947DC27007F604C3D2CA84455F9F30A75BA00 +71B9C36D21B4080D1C9CD31712527B8A6B5D6C39C29690E92E036D49E186D640E2F45673 +789BE4F96524657EC01BBF37F792212AC8688FCB572D26D10ECB727A316DD79CAD673E6D +2897D77D5EA7723E541C0BD23F4CD3DC2A5B9E2EFA15A024E825CDCC81CCB5B588CE4B18 +1D6E90D3EC7CCD947D371B98CC18A30C33E90EB7A5C180A6D500758CADE6787D5E89779A +067C2DEC491D78466EFC113586C71C5B7E2697685BF5AF1C6806BD2FD63DD7A5202F3C50 +93EC7D2C129E0C3A8CC8950CCB2901894B1233AB3F71CA25E34BED65930899A695EBBC51 +2F28FE435C99ACDB6CFBF1836CFC762BA9FEF40EC118CA6B8ED46BBF94082D4CB52FA712 +397BC0C630D77283AF633364F319FBCCDF6756304CB60B8A14AC86F62AC180AADBCAC4E0 +077C3299BD7486A05378F35430E5E1FB84A01A7C4A0B48DCD72BA02699B8087B5858C7FD +A52A85F08BD02409CE14EF70619E0D344612BA9971C830A0FA719F6EA5F3ADDB460C1430 +4A987565651FC9D13B307E48B7BDD9EC6CE1459E6062C2267D20D5D17992A4B84027B410 +36DDBAA9670152215FA62B5054356BDFFFA7F623EDDFE2BB20A935AED52A2EC844973BB6 +BEB38FBD1D4B21B9D802569D6255049FD9175DAFB66E7FB6E30170D872BDD64BAA1B16FE +81AC65EE9053D339A0C009DC5364D958ABF3E87D38A4E9ADCE9037BF4FC62E8D3D1812EA +8028CCA0852526736660713DA8E3B4C0CF2940659E8BB23F3B553D4FCD40EDE971697C27 +E41F2A6C0C29139B2209D091003326D69A2F081AC4B7F61BE46AC6662574D463DB86338F +40BC2640EF0CAC42C1DEE896C41DC6DC5A86B1A0E5CED10D826660947B11AA1E9AA44692 +E63082D4527C7CF7ABCD388E7ADC0C1EA3E4845469B19505F5E5FD66B65C50F9AB02BBAA +73B8EAB789D7F226365500A2E9ECD9A220BE7BE3D04635E9C95CC1196749F6B07151AD92 +12ECA4122683808000AD54E24730571C9BACE4A563029DB9B921CFD536954CE064DA5D1B +B49D74C55D08B1753124965A402A52188F44A14D9C28449C665266E999D7605E719175C7 +6070B3A4A28B6ED3513322386B2B65689A4B65788A6BD0A869468B4F3544C6E6E6ECE246 +506B988CC39625ED5148E0F620482A198DFD8CDDECC485F003B7A752B1B46B00DE60FE76 +D86911A37A0C26EE72968C5783CDB1744192EFD434CE8BF0B1C45DCF7226F120E85C800D +0C97EFC7159B9CC14EE505042F371750E32F98485337BB26D4BB702BEDA217CAF9F0863D +733B2406270DA91A556BEA4D620A8155258DB0DC3C11EBCE82561957B2AC8204DDA993E7 +58CCEFA6989442B696635B7D29AAAE8E14396E72F838E305E79F25B5AD19D4310A368419 +E3F773930F2D6BAF2C8DAC2F2C7F3420594BD9E1AC2D6CD7A185F7F673984ED76D18B836 +388084525C12BAB5BFA4844121E86E4C747B283ACA5C61E672679AE73940CB44ACB61CD7 +18DC458AA1CFB314A0769445D0D06EBA26549A4EE1AF27005D27ADDADE65EF1FC6EE7BDC +CFA6881D20F2B22972FC4357BF445008069FC6AE550B2D9BA16D565667364E1800167E33 +0A36ED921DDF850A3F993F0B00B1C378004CB008A631D30FD498D676AC38783DE7103FE4 +F314BA9168C19B0FC49363EE43704A9A119B360B5203EDAA03E7DEE736D7E6E94CB80CA6 +42C856E2AF8D68315141E7E9E9F63B48A9F3AEE965F0B62483F3C5AF47CF61DC4EEDBAA9 +F70846E660A7FED078BD46445CE45ED58C63AC224AAC16885D3F4E3F94F0779E180693E8 +B4A15469CEB06D6ADBC5DEFD221406A8C48B95A72303F54DA54B745B504DFC5F522CE50A +EDC0D27842FDE517791D8389ABF07F352EA4A752D4DB20B50CDEF5CEF9C6C8EF510FEE9B +F1737412D9CDE528A66B37A4BB9272BF9C8292BAC9EC2F66E730C3D038E981638C503993 +FF43DDA2C59AD94337CA7B45FE8C270334D4B330682344E372B08A09BF9AFCA47B68656C +1428369C660EFF4392C79DA407B29373D09D4EA1157A8A8D1D81D38034DE3E7272DB3525 +4547B81EA3B0E2C89E60992C4E95D17968EEFA64BF116B4A9A2C0C0B242DF6A571CCBBB7 +6A58E80D84D48D18C5B2F75CA84A7B7AACAEB5548F2A13D95C8918C4EA6C8087F866DF76 +46538BDCF0B13A918A64E00AEDC53F222D8BA4AA75D90121FC69AA03E8B07E1FD92A67B5 +02B9BC301225181043E987D5930FC2E3C77553BE300959CD767FF441D019828837680A8D +DBAE996F1B3739EEBCA8CAE9AEDCE3E3784EDDCFA86EC38BD460F979CFF0347BBBD36DEA +F8DB645DC277536BF8F1BA745EB4A2127CA7B71253C6539A31299156F12E07E5C9591C45 +0C0E804503F8F4520C9FA55A490F6C827004FE2413123851B780FF78743B72C9E1499B81 +77773A6788D1101D8551E12C46BFAAC185F7B6C9916796B3A351DBACF4A69A515EA1F765 +67B5A62DD9D6FBDC9574F8CC8DD20EC6AF803477B8C78497EA757DB04EEDB5F3522B1CF2 +E4EDCF923B14A6E4AAC3413D841EB5ECBA4116CE6549E55BDCA1DA667AE75F9626998ECB +5D82C4D207BF45C16A728847E952E8200194A04288336F8FC2AAD5FEDD5D17287B77882C +42E5F956B9DEEFD55ECDD8354C0CA47BC0164B2294C4B2DED139084B4C1213B74CF02E17 +C4B43FFC034A2051CFAE1CF99D72492C567A750C704AB26AEEAD7A06D3D98616FDB0C0E3 +34D99387EBB43874FC89A225720BDFE02090EFFF13CAA7EAD31827B6DE1E98E450DAADD1 +515D7A65B28AF7057C7B26720025A8918D1A6810F2147D64230FF7925FB42A7AE373C210 +5C99311C02EA1B33361D538B7742BC02B68E238BB4B62A4785B27F071D3F1AF43BEDEE81 +F7717E213F352B861562C314EA8E03B8EDF986E488A1664547CFE7A59DB4B657FAFD0DAE +15ED435D89355108E44135142B60C2FFBEDF32F28DF01F02F2DE4C3C40E95CB0D8D64E23 +672A423743DDBDD3AED5E910E634C9BAA69C8F6B33C8D0DEBF5FA56D7E6D51E7EC3A8DE7 +14DA3A104DDF5FBF10EEFDF85520ED2B71F11EB46ED74F70BA58146EF447CF88E92D99BF +681D3DC3DB4AD32D0915FD7C458D3AE35A060C59FD3A8B0B7E99A3A7F8978CBF381A6235 +D7534A4D11472936DBFDCD33844B8E36205089FABA95BDADBB0B55F9C8814E5F283413A7 +08CC3D15F487E170DD7DFE8C471FE85C06383D444F65298EBA6FC3761D7F8D6F18916A16 +EA794043EFFCB72B5837672E8999904EEA79EBE0D3464CB48E9AEDCDDD2FD9CF7C111C57 +2C280A48DC5B83052ABEF370DC98EDB610EA5E43C5A9A8BBFCF10917003E4E25943534A0 +E4D281F2CF61C6E7C0C10AAEBF23B7CAB563CE25555B82462A71A2D0C511390117AFC3D9 +3C948C1F37F052C17EC23E87B3B43B4E874A723DBD01DC97602F498A1993D8E6A5AF7426 +9E487DF83C45F7F9DE891963DDC7099951AD3E59AC9E5586AFB026A66E6FF8B3A9DDBC51 +79E697BA2B46BC285AD67722E8087F813B774AA31E66BBD187AD9876315619C33138DA8D +834BC729A8948E617CD7A4B802D0F7FB484807D09CD337097462B9690533562506B7DC80 +7CE404B4A1C2899535B13540A75DD666E1ED18CF75D95A3FEB472B7A596A007455682108 +01948D18DF7E008D8086552D5F472341BEC1A3E2856B445C0099339B9FE2ACDCBFF172FC +5BFA8A63067E9EAF13AC8D6F0FEAB24FF4E326A252BAE6F48175927E7D45F2A84CCC0AAA +1400A922DFBB601E2129A649464C417901D7EE4B66B91A6DF5B787F9B6B758E2DDF58724 +37F4658116E04EFACCADA54863E874F314AC25C4D10858A2EAF9687A4C45AAFB755251B0 +E2A298855AA83D44F254C832073A4E065694BF538C63CCC8CB0C3AE89663E24906614A15 +2DB4E4EC5FCB83A229285C1CE0B52954FB21A166142D8F82B60997DD39ABEDB4D3A8680B +8BED2755297909B1D66724FF4B556FE99D26C655F7BF055A529562F4B1DFD7A16166CF1F +75606228E96A320CAD4C2589BC86C4940FE50CDFE12BD5EB50A5A2B0223A6358FE07FCD6 +C791193E83A8B66766BA2F2E3D15E3275C27ADF65E2088D058082ACD6B7AA272B26967F1 +7606DA71E7CA51EBF5662FB025419DC26D155113947B966933287A14F066AC40D7028A08 +07130DA33A7DFA24144A05BFFB1D979252E83F21A493F7149C33D7508523CD56C09F3963 +322C64BC63B8CCCD8FE84E0DB44917107B6567579983BE44F73C9E524F44956C93D85975 +E4531A3DC0FA9CDB9916DA0432E4EF9C48FC9FC482BC9744F6D818889C4B5D0B766D2243 +B50B9EA3F0D20DE6A86F7D0C0F4B58E3B526C2DD36E01BCBC6EB8364B15909C335D8FCA4 +7845F72F203AE4FE8F9D0FD1F1364DEBF7EF7CB08D6BFA764A7E79B9D76A412D879D2709 +0F4D54A848C5EFD424C553A5CE0486D29AC6F2C6B372DFE8DF265097F184F2B88CB3C690 +052719F268460D78153B97D77F824C82B466DAFF2630CB263115406B8B91C9FE8E9AE54C +A2C96C85789610964525453B9D902ACFE6EB379887C72B472189B9E7CD6033F2E57E9C90 +206E218B9834ED77760A12FA0A5A6F86D2C226E1DDA31A5CF2D0EFBC4AA20242D662A869 +CC6A8C5E4B3732A9985A2BC6DEF9A1FE49309CF5557695B66955CBC49938FF605AB6F57D +CC7D570CC84A8F10C50D2DEC2BF6746CA9F256725BA75D273325E24D04AAF0F2DD9AA3F5 +F282773B5CB4B5DB26ABE691245BE7A3FF07C4AF6817725B03419F1B72068A5EA81870C9 +93E040F4BC52C454FD43AC24E3A7B909582F2AB3584FA66031EABC8CEEDB7DE30D3FA311 +A41DAC1CC909AEA330FCFA89BEF8D0D5217172BE25BCB3DC180DAAC52B9A95E588ABEE17 +105E3DA435AD2698CF07035DD5C19C8DCD58480CCD20C1FF529D37B5BF95716DD5B36F74 +B58FE28847962E7C3E2ADD93C91B529C48233EADBC2668AF421CEAFC5D8C65DFCB6493E0 +5A86E7A5CDAC1CB839DF0E099E67A2F8A7CB966BE497C573A5506AB4944AF2FD770F5834 +ED14B897BBAD1F3218007AB429C3250F7EB284AA16149DE1E6B6B540B5AEC33C4BE0A12A +11C3D63B8574C6B2B4155629FC9C13EFADB572BF35C2939226A90310A067B4F47A8719B6 +63035EC0FA87AB6FE5515F1B1419C12F06BF3D49393481B7F45534B71FED5E1B8F8B6480 +28AED0652F5C7FC254C25858EDCC0B92C6E6145A8DECF4CC54C822A6EA80F62122A58FD3 +1BFC6FBD5DE46F258D4215FC361C0B8BA50E3D63E7423EBD6EBDEF07696D25A6FB25F44A +5D747225006F4AEEE6EC177CEAC8DDB0A7D9F536BC69B59A5AC650AF57F92798785D44E5 +79EE905CB999C568B7DB553BD63184F22E59FFBE661535B35770A1EFB0F6530B455DFC54 +1A4CA7E19136D9F3ED1A7C8F58752296CF5232C45902E6129AF4380E677A74D06E2A3A01 +9C72A32A8555E52F5113112FBC4A2A42BCE68F7F5484D650CD206B0787C1875E7BF15183 +3FCE25FFA474F67497605D6C6517BFF948E873E4AC2BDB6995045E489D6310C22F6B4582 +906FB0A5484C4BBCE8FA61D80E4277EF0D37D09B869C0A174B97BB3E127776A0FFA4D941 +B0BC194C78F189369E13D86645749416506452668810DFB0B4011A40E60CBF7CFA855CA0 +F36C517B959FD11587B9C6C6EDA0FA01FEBDA786B36F3E21948F878D6DCAFA94E10509FF +5F8DDF25EEE7CB8E058F0BE6FB4DA87C28F225763AEB26BA7BFD8A52467F096A759F4379 +C150E63BBE70940EBD573424ED3559B16F83D22068E16633D95A0267E18EF9391B9199B5 +80A91B7A74BBF60CF13E4EF71AD3FFF9ED5604D73BD0C5A15812A439A3FE6641F2DE8B52 +EF0BC70B7693FEA9CA49F93525D29B037AA40A33FC2199C3F29139FA63408048F29B7F3C +6EB0CCEAF6C51D4AD842A315257AEFFEE6D5A02C9A56A144B0AB2837402ECDFE10B85F84 +88A87D9512E0FDA5CA64AB541E1BE99C9B89EFE7D3F17874F7593FDFBDE867653562CFA9 +C06BC81560883D1F051CFB128310229768A77E87DAD9A45810446E4E116341AAA3D4B332 +68322B7DC8984E41EAA6826393C2319424202AFF4928CEFDC24D7EFF4B64533FBC25164C +E0083FC7DBF81E663C4E1746A7A7E4D7C0EC4CB4D9FD396508D6A96CD400C85212F522CA +F4F6290CC2843E2B632571FAE0ADFD99A7E3F9831B0EE07340BF0C7D6EDF95DEDAD7D492 +DCD83D871ECE63ADC0A50C3E76E5157D3872E0F78E036B3A36459E78484C9307B3DCB831 +A99D9411C1CF4EAE117D651BE3BC04C2AB067E512F0F89A566F275DBBEB231DB42A0A197 +C301F33F4E65EFDDAEF015999BBC1FB75E1F6A7925D3E2075E98E314BCC10C94877F0B0A +007708984B326817A532F7AAE87E026AA715FE64373BBEBAE99A0F83CD0C77173DB845C1 +028F25015FC3DA0488676715D3EC8D1149A90AE16F418218404CC465D4EE8BEDEEE36F47 +DFDC27D07FB5F4EC0BB8DB4601DCFD54A2BE85A9476000D20181311F5B6F4111CFE1A850 +DAC7C23D30B674627F1A852FAC1F0437D18E6B3CE4FC7911FE7255390E0739D2A83DEAC7 +02185389034889A8A437BF74BFC3A5BA6BB8735A8FEC009D55492F7D43C5C6F92E469260 +4723A88723FD31B20AFBD42C150EE51108B05E8F7027ED40735A1D63931FD3CD5833FA1E +C77980CFA0F7A8C47164639255AD00AEC0764BAEB2045025B7C6536309CC9A38291A1F6C +141D1A42F33BAF14C5844C13E8AFF8A7CB4AEC72E6039A60CC67F03DB21AAF2976BDA0A3 +9D92A848D743DAAA36C288ECBDFB46D53E958762B1FD0F570F40154838506B656A081473 +18FF01FFBE5D17C131949F5489E4C74EED3369A496D05E0C9256EE92D3424E95A30485F9 +A00B0595FDBF84B03BC9672A4816D2D290AD1DF00E54C668DFE765D9EC28815477D7FB69 +781C0A050660946AB8AB1E29EE5ECB2C1A272591CC48EDBB5EBF26D765E24F5CF4BF43ED +17E5BBB55C55DAF106C46E4D8241E4AA01AF7CCF79176FB4BEE78D5299C313E2DC300237 +D1E149743E16081CF124BBCD7D9325125C9C9AAD57E86A94D18CF62D4E0785F820A9B7F9 +E3AE3FAF0F7DB0262BE9BA917540B8CD3421643A01CB26F81555B05DA466F1136A7F3E80 +3461C2F063ABF750BC814579689D3CAA094035CA96298F7F264C6546143DA15C6E085DB5 +2065E8ECACDEB3ED4FC0D1AA4B01E3ED36211DE438DD1B3712EC858D66BD3779C96D4994 +234A8FD8C1340CA9EA51A2750A6B0C65EE1C54C321F4D060F7F5F07B49C9528AE0A1D45B +5549FD72B0A15BF903B1F70B92458817DB0FD9F1731E82885835A717B0A1304BC067338B +1638D51E99D5C23872D4CE5097B89635C3BF28D6D2FC96BBD80C26BEA1968B8A59C278A9 +8BA49B1E59E3584E54DA5998C5E70AF167DAE2710F7656169647D2781AD1C27766703FC9 +6C08A0739EC521182A77410F2E2A788B47C745B4B0A2313F49AC8802EA461F04F3D54FE5 +58D2B21E9348C19FF519939154AA3ED07E24D3C15971F380551408C897D618749CB38BAF +625434B73061407AC05E0D7B0885791153FC0AD5C3275C03F528FCEA3BE91D9CA9C3B402 +3C931D467854D68DDBC0FBAF70D38365C0C76344472A876E74C04CEA12DAB0A55E776BAB +CAEEFE1CB7E834BEE48DBC155599C4A0BC00E6B8746D7D0B9CDBABC463D8E2688F46F126 +520ACADDFAE65101EDA0F523C6B9503D8FD1A5B9F0B6DBF0C286358D92FDE66720F5AF47 +CA87A0B6E04E46BFBF21EBD5CDEA194B6425B5ECF81518178E0259E386F5F852C6870E7E +034582EC658F59C2E07428737B36B77B9AD3BD6D28EB1742453C5D4867FE879805A80331 +C6E52C0557E5D036DB1EE67E7274AF769DEBEB23121AD503E3023A8515FD5ADEA11AA020 +2BCFE0AE826A09874CCE19AD2A2A188C7331127751342E542258D3996DABBA1B6DF80323 +5B6A223DE4F193B862224F807F99C0749994F0C72CC784AF11C411D34D649FDA1C77CB0D +BE519001F9E757BD8035A0C9AEA86609B71A4622D5C78589502CD2DD58709544A76526F1 +603F205AACDCB62EEF46D9042A2C9E76B887826827C6F22D73760CDCDD0FBEB827BD2E1C +3B5B0726A08DD2AEB614FFFD02C36F9E8B404160C909B70414BC8DE600A5D56479B83015 +9B8E61AADC8C8AA077816ECB6317A9B16D30DD8D4499FFAEE87CE97F72453A37D187D91F +A0C29A65A8F9C88ED22CF19CC0B40324449CA4E7751D77A0D76669AD420216EBDA92CFFC +50454E7EDDC5C4DAF66B67675B576ED2C90EDD9F8182589ACEF1B034D2F848D0CBFAF84E +38B7C42D2670D0A5E382FA11AD3F2FD6BC79EA02C074644F35842D1DAEF70507A361A0DA +03F5517B789C5684461F698F2FB20A7801CA9EE12981B5A793A481F48E33B596832AE4EB +7AF3681CC464F6895127CF10D14477611CF8AA88D0F6888225DBE342A708BD62EED4FF31 +CCC1ADB38DAB151C94E9A1554980B3C077683DCC0513ED4C55D57BBBA0ADB8A5E79A1B4A +BE43C703948452C44F1734F1C433797315C644A8E76D13DDF5E0296143F61FAD14E16ADE +97BC12ACC5DDEE482231A9E9145E69D63CFE889A1BEE0907362C60ABF581EA8541E36ECB +30457098E7DA18D6FFD57901AEB7913C59AF691D1A1FD3DF485F7EE669A5915EABA6456F +955F2D2F7D56CE0E349EA743B3F44ED555AAEB7F2A71711E08FB67B9738928AB842F6111 +2B9126C7474753CFB458EBF75D817175179B3FA956F1D998C52FC9CEC7217440889D0481 +CB91C8A8D1D1C6967964C7DCE3D9EB0BE6598DA5708DBDEE4EDF76CE91E128732A8CF56E +C8BA08828E9B270A818F98FABCA757BF3C3855C6DB448F7A4A6853522F7541D46AF3818D +B905D64847078757E0110C0BE6AF4BFF722FBAF5D8A4138BFFF94C7678A10F9FD850998D +B710D5BBF763B8A70491CA4D53124CB95A953B080CC31174646AD474BBF5BDF057A1186D +B083E6E762C669E935A02D60EC62FB71B6990D25BE44E949C85D1582611D826197E8F617 +CF2FC506489E59CB380E2ECA368916347B1E1B59DC1AC765676B904A63D7F8CCB1F7E2B9 +B8290B30E53B28F6FBF55D191BFBCB51F3BDDA71C7A9B1152F686191B0AD05FEDD3FC37D +42AFD7B3021D255DB7A00E6C2B3E714BAF7E61BFE8B7A88BD5B6EDE4C1DCADCC30565AFA +1E2458F35E44CB6F7228BA384CC1B7A64CE912998D42572F45A30B2C4F919BB21F66E1AE +6C787773E419E1AC1AD41A3DDC044C1BEC45CA2D0382A11C1543683F9DE1302FEB0C9DF1 +8BF8B9F0272132E1CFEB54E38A8B90C3F5630A3EF083C73C4E83BF0C312F09D5352F41CA +7C8EBF842E7F46F3D97C4AB03040640B95D465D50789EFD68A12F1A450AF35844A7A2302 +3F25728A85EEA2D9D124C4B04AFA44205E110CF923A4D713552FFAEDAECFED8898AFF89D +BB682A961D1F815C3F978B9C190006959D4330D772C884F6B0C77B2D1FF722DD86448C76 +A68AF642A08994966D3C2836D7063A59B168AABF47179CDD6D6F902C601A89FEF38E5A69 +9753828649B3470B5A03A2B58AA910B758ADCD5739611894DAE786D5AA005A5826DBFE38 +8B0F4105BC76C0437FEE9CA6C861FFB1EEF6620B7562B44AA0D29D1DBFE7B7954971087F +E8D291A0DB5E4CB0512B104EA6044CB75C099716AABCB5EC89B14BD18F5D1A73E9A8DF5C +A593BDA22FA28D8837519C38432667684C7C23594AEA6B39E3A819B72A00652C205B02B6 +F8127CA0C7381B8D433B86E6DDAE2ED9482345792276F4604A9208AD8CABAE8B0A0BD0D2 +7D0D5955C20C6E4425E295F5AF9FCA7DF682FBDD5B8B107B5FDBCBB0D751B2D2BDA99314 +A9CC66F9E92FF5048E5A6AE2B8B03611C7000B0903491DA44123CCBBC67B1D4086C22ACD +08599534BC98EDEE0A73117ED20679CF3D9ED1506774C67526D9AF3DEC36B9FF799479DC +52A70429F79C8878509E8DFB756BDA3D76B31B9BBD77DAD3956B1D951C157F02EDF252E8 +D02AD799A9DED7B38B352FD0841B96DAB3A3562F68178448DD8F1F5FE40438933F97530D +0E6C918C571B921F9F7B054B798CA04426237F4085044F7395D0E4FE3CAB961348D11912 +E5FC311138A82F470FF3C8DF00B1B0563BE81C25AB58E95CC392203F9668BF187DF43482 +BCEA0456394E31DA0819AB3E71FB8E02FDD90E05A39D0D5B4EF919E958B862C3A96A1275 +F66C689964B85C4C60A9E6D44EC9900B85245C8CAC2847882497A97043255228B8C29529 +12EA890FF254BD8C584126DAD1B2AC1AACF528564883F0C15C41A8749EE4AEF5FB514940 +060D3397DDAB08DB2113F942B03375B4A2AAAF9501734C17DC220BC97E367C2160982356 +2ED3C739164B659C480317952AFF044A4550DF79113B4F7FDBEC7B332EDFCAB7DA5B4AA1 +469479B4490EA5462191AD1B336DB782BF7A2CBFD7D4B885E2083110511FDE57459457D6 +68D29B1E31E734B30E4EE6AC28E8D74A2DEDD48BA964776BECDED8A86934A88D60A85279 +9E9C65EE342F2555ACCC0E47202CE451274D76C6FAA943BDDB5C35855499141FA589F452 +C5F424280D5863C7ED7544701C4B0660AC835D58905E458947DC5C220540D1FEBB4F18BF +7649596ED3C3F8D76CD146E5B5995F406CDC2F8D1D0D7CD4FD1BFF5907BBA5AD0B475F85 +D4C75829E57476F12E1315742C875008A96A06A76627DD694E1EFC09D05159B101C8613B +F0FA5E027B1C7F089D07B48BAFB047E4A75B101B417F82FF32BAAB877D7798A2DFA48A40 +85C47A5DA67FF503552D60295D5C61803C2700879C685494886505DB291413B22C7CDD3E +9C36F74A88E53FD9AE6E4AD73025C80555094DD7D1A171A1F85833A390793DCC86DC25B3 +1BF605ED87669F1D4D44FE035636746A80865E4320BAB50B42B6A6037B1A7134AA8B42F6 +4A85B58C318E600D80E892B337786190C009CDA82D95786A6F723408E1F79C330221E753 +F1A30D90450D9FCE6539A7E4B2AD69557746FDE8E4E6207FDC9068C400244A0CBF276F84 +A2286A98A9B4A60457D3C1C2B1FFBEBBA67DA76E0B3D1027B914755CA8152E1CA4542714 +9F709EE182D12B9D653D960F7242567EFE61643037028C97B19D96BE9F5EDA4230A329B2 +78CA496D0C8894CF6FF8A410AA93EBD0F54CDA812CB5935DAC06DC7968F1FD4DA26B621B +CB0C9FDD45A51E5043E501E17A042CC421E80413C5861941796E1F0213C02A968CB5CF10 +EEA25AA24095839B12D6C260D99B5C42B65C40824D408464B30D6F9E02E8686294CEA8A9 +39AF573CFFCAE51DFCF51D229D3753F144CBB1ACFE9253F5E36CB4199CB5768E6E1CE224 +396923C6E1C9B1ACDAD64CE0DF19C102CCBE2F7D206EEE22350016B1DFD13EC06891C41A +353318C8744A912692209F590799C99741F3656DE0110C310E8F460C3B94C7F5EC4598D3 +786D7C297707C6CA9CD9AA80A18141C9937EA927FFD3586CA76ECA5E5335DF22CB4AFBC1 +8DAAA401CA2CB71E1E97BAA78CA4D1AB912028138B9901EEAA6E17263C540958263A509C +1E3C266138BC36DFB2B82E145C794AF0606D7B9724E40BD70E3B83D7B32E32E0BE470279 +C05473C3649009D96F47300ED3668B9F140E65746CEE1DEEE623734F93E1C309B3F5E5BA +EFA93C4E96DDB8E14DB661CC2D23995A845F8916079EB740DF80158A8740C15DE4B367F8 +85B1755C69254BEB14DBDEDA5279C0A4BD93D43B940AC1AB933C20EC96B8B833DAB56BD9 +15C46666D22E72B629E97EB44CD41B441F6E079E40FA868F3D74CE320D23402BED7C4A49 +4468869683DD4BF0C4B59BECAD9706D091FF749B749DFCCADAAA2907457760A7A2269285 +F31D4D815E0AF703CF9A0D671F4637881245B134D4E25A8DFB7E58F7DD06912E6FB27CB4 +1B137208E30C0BF65FC3C078E9AD98BA6A46E3D29F035FB6A430964B84D9CE91A03F6719 +614D8F12760A8EEA1999780E00AD8FEE24095D7FEF3BD669042F0D03010814916A66401A +3183CC41D8EA4423A97EFD187FC1D832146031D4837294C35EE6E1E0E8ABE8F68CEFB5D5 +97C10241B7D8D83F281221F1B84FBA400A586364C58E1B611CE0E2092E0734FA0EA881F4 +2A8E82E9B02C0A5BBB21940EB06554D01940FE87BD2BC7D03032646D583028436B495E6C +A8F58566A946BD076D693177F13DF96B3A43C1650085A23D199A4773C717DE2A19BD8C46 +C0D6487698620D89A1A07FA0205D14870AA43C6ABFA2599A84AB5CDD18A66F6540320B28 +A1A9904402F62213DD74DEF28E2260842BA1F5ECC26C2450352EC67BC2C956C325B1F996 +4051364A7592346F0C28DD2C52BA5123691B47B857284B4862961504778C8B5E06ABD1C6 +F37E2343C185BCB458D42DA166D9479F8E529BFAB0AC782010BE8E526F5E4C17BF9A6BDA +F8BD46522BB6A877C54ECCE890C389FCC576B605B65C7D17A483FDA2C826A6E8F27915FC +9E006666AD30D11B31AEF6DD8BB9FCEFB655F4D7DB73767FE1FACFE15CEF7FB27C3ACFE3 +4E761F9BACEDC1CDEC22B0F50619FF7AED2689F2EE768CB0BAFB857680B15D9CE8AB0A24 +36450529F86FE3A7CCCCFF0287092F18AD672F424DB6EDFD50AE8EDD481022EA1FFD016E +E3B4BC8583BCFB45436471B5B4340892F390E061E0F28B4019812B0CC299C3D70151F87F +15018D49097A50B1EB5B90A736ECBD060A802A30632C2A681FF14E1ED5AC77726CC1B76D +378180CBEC15DEBD4CA283F2441B1E02CF8CC7D91A212EF2E0B1F194C196D731EF43A420 +2E0A1BAE1C3C1F060688BCEC9C24B07984F8EC84242EF6660E7966DAED4AD845FC859DB0 +71F1EA8C7E9E5235058EC9C42ABB815C699A883344E95504F9C5F6BF340DF54AB9BDD438 +B8D63DEA04CBBCE565E3D78B71C6E2C04D4E1EA83DDB824C8AE8E9CC621CC1C75906F900 +D2152DF36AE9390162C3DDDD20E79F9402FFF7A1D66377037D2A5E8F9E0889F55C711DB6 +38AFACC568A1B4E4EA06E3A3B749DF4026A0EFD2AD56BD458D9A5837F046F81ADB9C1872 +71238A54CDB3290187DB1504008362EFBB553C0167B5B58DDD5DD0788B4806D02AFDACB7 +78DC36578DB5486BFF8FA27ED2705587C3B0A471DC74A47479EF2B7F0D35A77D9683CCCA +F64C5E79F57F96DA3EE6666053089561CC89A0AD22E9DDD5AAE38F6ABDA3476E5BF7EA15 +B4D782E42F6B1E778C9CD33436D1B2B72FE8B01E18E01C6558816D0ADE36FDF34B8D8F2A +A15E028CE59BD9DE568683CFCB8ED3CFA289CDF4525A46BB7B0A91A62491A09821633CE5 +C54994009761A3E6DD30D61612EF66F49E190A2EF1D189D75C9EAEF9CD21E505F9CF63B9 +5B399B25C2808CED1FC3F6BCD950156394711567792045A8C90A10A193650379B5F44F80 +B9D3C265064754B0390963D2A060AAD443CF6C377C6DD81E4B313D94CD22DE546C56CE4F +06FFB5C4D703D1CEB9E9957ACDA546D0B327450F212252B3686FA87442CA18B2B0D2C1E0 +F91CCD54AD769C78D4E719BBC32554B6F486ACC1EFF4C8A3DEC5C359821715C2B64C2CD8 +43D25F4899375AD2011C3A89914CBEA23970C20ABFC55AC3318BB03FE1B061CC5E1C6BCF +B4E5A9488F08845DC4B03A79CCD15CA393BFF66051555DA32B68BE66DB340662F445782E +EEBEE5CFDB73AE4F9864435B828D168F17B59E9ED6B1E4DBBEBED2075911DFEECF1D97F2 +C57D0D5EB64FCDF7BD4F2F390F0182C997AEA6B3D5C5AB9CA14A3928F6358CCE901D205A +ED5C22BC9838128C8631B69B02787A956865F15EBDB937DFBEBAC70381767AA7EF592146 +BE4EC825A96C8695E9DF2490962D6A9F877E260A19362995C03E00B44DAE22F3E1AFFECC +ECF056319ABDD8009FE30466EAD5BFF178E43BEE8445C0F3A4CFADC000CB29A66736B803 +46E6BBA25CB8EDADED812DE0D7962C2C05A0DAFFE6AE2604F628F823659537651DEE00FF +795ABFB6C2FAA5E2531A36DD12AA069E8E0EAD1C6737FAA3B412F97E6D5DAB28460AB7E8 +160E0656C551452575ED47630A545FDFBB6763F61CC4BE7BD81AFD6861AEF0B34044B583 +836311C2BD2F0A5C74A455962A1991DC75DFF5BD46265C8805FCABE04238795013F09F40 +D2F2F7C5D12F251752D938DC7C9BE00E5F7506E51E0EC4A7AED0FFBE5353DD0A6FC560E8 +3FEEEEAF01316D5386633AE96A5609FBA122684608F90C54E9E3C1700ACD31686FAF7BA4 +84AE837057BB3FBEB1B6C9AEE7412A74C5EC366F682BAE51CA425FB274D17C41D0DA1632 +751E2D58CB0837549DD2296065176FEE15365363284E0F4778575C464110F5CFB186E92C +B488958079B3DDF229F4448C19B24023C1EE9F226EED46316480F01DAE2D4A5EA42A3DB3 +85E3668A3CDFDAAB384BD79DF85A103A8E09561B4E826D3079658295512DDCDB7AC7ED56 +0966855109359E217E44805FB55FCC926CBBD27D34D5D1339D9306CEB6BF3468616AF144 +765C64DBCFA2BE91F92AD7DB47DC92CCB3297AA99593851BBD29C07E7011584945C5F390 +E048B582367C97BEDC1B31BBB1D2D8C038C05DD28E3915D6E35ECA809B335190DAB354AD +3D3EF2A5E3FFC5D8F0F7A87A8EE9C6F9E07154919054DCE87D8FFE62E279CC05A4DA0BD8 +B933A49F7FEFD11E241DC1E4786B73D15FABD2915541B9019AF06EA28A1DB0FC3ADDE1B8 +A370187BC285F66D544A23184D17E346CDD21C0B1ADAD499D78EE0258279A8FBB802EB50 +887CE8290DE6F29AB3F6D0884BF63AC982A21682CCA88BBA82A237F39AC8D1EC827CBB72 +559AF2F5E640B1E43AF7448258469187427A600608E5FFCFB50D3406D453D30B830D0B44 +B7BBDBF0A5F00A33A4BA6429C9D3460BD6DCA861970E123E67CDC85ED1A304FCD0C18B1B +19CA443F0B85423F4EA44E0A31DCD363CF59630319D2ABA44E822902062C4194D1B4A04D +DF98F54946C5769EDEA86028E88DADC98D785521AB79728C029FE0515C9BB6DBDCA26033 +1B28F70CE1445AEDCC0E267903013BA6F98A564E6FB70FAD1343200A4E3AFF261381434F +4C8E3DCC87F1482C99E9E2EFC4A0D7352DAC825045D1CB8E102D9FF018467759C808D863 +55C4D25B3D1097317FDD11BA90BED164B5204A40110751287F19926A82FDC6E8216584CF +CB1B805BA9237ADA8D5BED21A89F6628495EE78DBBEC0163316E7301AAF1315E00302F64 +D22A33EE587C3116003CFBE41718A07DC7CE295DF8D7CDF05245C46893759E0F2DD35507 +CCA29752106D0CF2DBC8CCF6ABA8826EA7B0455585B26DCBCF0F598A7DBA8FBF04879EE1 +82637DB44C1FD37E7A74481A333CBEFE4B413D8AB6A3F4DFFC471A611CC70C55618499B6 +5EF14ABA68839AB4656971DF193FBC70467BEB52171F3E140FF40BA1C77BF02500842784 +4A06AD4F0ADE586113BB339DDA9FA72FD99DA3B1FCD26D25E79B28069013D8FBF48897D5 +2B92448BECA722F486F3EF5C751FD6DFD0560987137C75E466FF9F2002B7CE576A9282B1 +ED5450AF132C858CC092E7CE3CEBF5C78E3DE84D130CB8E1C9A9D08495FA3918969D06A7 +8D10750170BC3ADBB4628BFFAEDB8F47A2197D95DB975DDE5FEB8FD97AAA479AEEC667A4 +8DC0D8D44C02F7B7497A394944AB7094F3396623AE275B60F32AE74A3ED40FAC1B465F26 +6A8FE9162EA850F4DE855DC492315E3DB9390000F84363328D4891009B8F10AB08F1E4FF +DFCD0B78719F59B0FEF3F2D7990F388EAFEB85C6F8383D3E50F3317EDD0B44AB566F798F +F7B1CF7C9CD522350CD1D92E56061D508E66FAB2756999B57075108DC7A0AAB4D77849E1 +00B8B7B5690763983245CE5B96853F7E1E90D5807B02C0E44FB50170AD7AFC8CA8229AD7 +941453154232B97C0CFFB5D710DD5B4AF78146FAEB62DC9E73F72BCD539713B683311ACB +BFBC5533E9800939175CDC5634FEF7D7BD135D6347EE83118C6FECD86799534165E063CA +5461B7AB4002D1972C22665FE8F75B4A6E7CD2D868311ACC98E29AED65A9DD734A55E7D9 +43A4F53D0602F79E2EEFD38BA394581DF5895435A9E8FA35DBF89F3F7E00E09EC5858D12 +6D0993DC87BB9331168488F7B12BA780D07450007F067B824CD0D7F0FCD3EF8D5DABA99E +BFD130AC89B20F0E2BFD4F8256D1B4041F90E3E145DF48A61BBE573394B2E70CF92F274F +4639A6910E6E6945DA69476BA89E1CE00241213B739E1C9A0A9B352DE885B04A47B10BFA +4A040533606F2585F78DAC66EA103984E5484A06D583AEE68BD0D8415B0F6CE4505E571F +3A21899D8CE43837035AECF430D1AB85A8AB0080BB31D421FC1818C32CC591417CBB595A +7FB281122ACC1742E7A7B6807AE5AF3F98C94B85ABC8FE8482F5CD9F7A0A18DA819D2A8E +A1841FB1255E3F4DCD1FC2BD3E182A45AFF9E888D7B3D49F4C5272722BF9CFBA654CEE4B +09C0C9897B4495BB6D38B00F0E4CF7891D61CE6542FD8F84C2590C62C47E967790F812E5 +D0DC81571ED64FB311336B154421EDCE032F253098D7360F2079719047F9A47F2AE63CA8 +DFBF90423BCC6630F75CA70936096BBB9719034946F340464563DCA8ED94EAC3837C497A +50315ABFF0CEDC6CB3B7B1C30A8442648734645999BA94AB7EAA67798AB5407CB484344B +86204DBB56D3627091D3709FAAE6CA20AB5733F556C40059E56B42DAF823CD0F5139B240 +7CB44AF4DDC58EB2499525536E01363B4E1A36331838E88C6F0BCF423F70DAA9ED12B5FC +98C606C301616A1DCE9DAB545FA0ECDD8B967DFD1C1F096D242CB1368A7075BF72E12B91 +A953923276693A46023276B9BCD24108A524C40026E305427EFBA8D9A8C87D1AEEEA0AA9 +F4BD27476FACEB36ACE046FD8A5AFE4123B6944DA5E7BBE7C4F608EB0DA74DF816ED7453 +6DD277F8E59F65AEA8541DA98E492DFD48504D645345E957129E2A60FC5BAB29BFFE74E6 +4D66EF0BEBA0B02A78BDFF4CDA36A04C20AD552AA92BB75D52A78745C7B47F7D399C17FD +C56C1588083E04035263D46D90144165184F0E630A4FB68874E4C715A3708E84A8C08142 +988557DE1FE684AEA24BED59A1AF602A04F7E916FECB96D2D2149E71642AAFE15B0E399D +3C66A5944B4B0BA234670AE5D78380041161A606B33BD1B38D9F53A592D3C021F6636731 +6110C7E4DF35E8BB85F649E568ADFF1736A1B27E5B13AFF8C4504230D877FDE932AEFC2F +F9E0BFC61BFA1541A6F2C6F53A22311DBA8A8067D67EC1A240E27F85FC0D46C4DD2F519D +7B72897EA5B38704848B4834AE19C7BD5E19E5C65BE109EB9B02CB0376E603B1B6BD18A3 +CF63B906F8BA66BB52B1BCAAFE70BD7A2A184424DC53C91582F47173486998947B074A87 +B49FB5148B6FF3FB34FCCD25CF2940042E7E90EF0E9DA4B520F123CFDABD3B3CD2DD8CA8 +039F6CB5E379D17FF8C3E7F9F597A25201332F0062A0E6A06CA14750DA000B4570B4B3D4 +859038CCA94E63854AD5DF2AEB672F92D99F6E5B03A8A174D64695141A12F8D6E0BAD839 +D104B24B2B02F83B30910AAE4978C9558D256F12A120EFCC8BBC9FE8122DA3BB72C7A77A +F47200C9C18DC6560B9D3B82AACB581A4F3735B4D2D215CCA7046DFCB3468917E96B6A67 +865B57BD51428A0221225C3A79D3D129B52497ED727331C1924340B127752929C29EEF01 +677C812CC6AEFCBFF1E3D24594D430E0164B6B933EC66A7FD00B4E701657F6766A186BCB +872F32AB18CEEBD3E14574AA775B3A73B3BA7BE94916FEA42716105E6326C21A59B62AD1 +681A9672934A3EE224B4E634B6B4DA3EF82969768B243092A98BCEAD10097659B9264DC7 +E83CA911201CF43984F4384DDD10F5E7741F78F3013591AE7541965489C0CE0B2C78228E +2148182930C04ACA997CB303C5C096147E25E0773262E62A8FBB81351EE809D416F63B48 +615E95245EFAE2FE041D10F0755A3FBED883200C13537A1FC5B1CA14BB847C8BA1049B6F +7CFD9784512E4D2582198F8594B4B689772DAA8EC2AC7969E3B20DAF8A17D36C91F1A5E7 +4FA921F611BFEE1982F590D8BC0613CA86B0338CA0F5FA6107B9CABEE94D143C98DAC455 +F64B2D213C5F3CE2F7430673D5E2224765ED4341D8FD04864F8861369ABE41DB25207682 +C81BFE06C3513FA019456A976CD751B29F4E65C7853DC7E5AA99539926284A316DAAC56F +64767BC4BEDACCE77C7D8C774F0896034ECF9B9E418203D94B94018D126ED69E431D792B +89FAD0AD799A0660B1282C226C03EA2E2EAD24432912D2D405A7A5130525AB9A4C6BE1B3 +CCF9094EE61401F04BAE9CDE3CFB0A0A1D33054F993EF6A6A8F1E026E744F19F19F8DD45 +01199F97E79F711C1C219532B448CCEDB409AA0EA129135C1791AF1BE7FECC1C9B1D89E0 +906EC96620278EF044C18228F5CBB67DBB36C7BD10DA5378224949CB6B2EDFAC66404F22 +42AF5508383B90080331ED71451BB59A8A2B91E05365884DDA3A23C9BA8A043C9A5E399E +5A4350138459B562729D850CAF38D18C4DD8B6F9D8D69402099C0791C82FD8F1937B1F8B +05E3D4E22DF453D2E8CE4248BB5A61CAC9E36908DD9049CA1EAA4E7773D54F9BF82D4447 +010C37DC6CB5A199B0BCA9AA3743592E651B69D1D4BD2563135944545A1DD8CA0B1928A4 +93361DEE737C834868A6CC2B6BA3A44E198D1EC12123BB95103C8699B4B76D7062ECADF3 +13FC6AFB6D364ACEE2091991D4045CA2A5E33C7BBFC82149C437FC423ABDEDD7E4BCA0F7 +BD1ACA371A129F11735758E0E88F453DB813998F91CDC3428B5D8FFDBAC983213F9C35C9 +C6B5B1DA85C0F0FF0089BFFE9269AA245A8F8BA47E373D2AEAF9F492835B1A3B3AD9AD49 +076B2DA90C516B95C8D603B758D285B811C97A3B28BD0DFD924F4F4A6C6B1C1E0F7E51EB +582914400A9B2610D008D43D9623BFA18A64B6160A72606CEF0A31DF88C7ECB3327A0F48 +3B0DBF54F1A02BD3DF36AADE1A65D4ABBCFC72149DA3992CFBF54D1DA3DAC66DB428DF19 +90F4C7923A23EFAB36FEA4B00661289D7FB382ACFBB03C6C82B58A46701FB75E36E1C697 +7026DF6B66554C2C36397230657BFF069FD03DFF9128A2240EBE1B838512F48F1482991D +E0AD6B6590DDB2052564F6798C1BB88C06D53C4D4C76A4BB1C35355468B3C71547D76010 +C8902F5DF9C07A43E99230DA6CC708BEEF6D3E976C07404DE4A1C7BBF11CEAD519AA6006 +EEFD89D2CC4351FC3E72415E8965B1785AD0E29EE59032F6D0487941940FD8EB73B9CE70 +704AE65D7C3E7E30FC066DAFAF38E2A19025F628E7FE6054694D7AD21ADA5B747E54AD1D +4DD57BFCADCDAD35E795A23BAA5171B8081EC9803B8FE6242AB1B421A20C6CD6A107572C +9DA40E22D64E0D053972699180A9B5062CF460A715CF99CFDA1861BA3876047D969CD8F5 +889104DC3CD6A91E6765BD2CCF49F21BAABCCCC6984D5DDC1F872F85A45D42C490352D53 +70695AA4420AC5E6A0CE1C5B72186FD1FDFC64CB7680ABAFFB390C494FDA8852E6523BB8 +E184A625027F79620D9712D570AA5E2DE15863B222F7F5880DCB462BBEC2B5198E005DD1 +17B6867C218FD965BEC790161999B8D27E7694909828261593BE4DCE97FE5868285EEDEF +EAB74A5707DC3C7824C1D4B170F729D9E04A3891E2C90FBA545FBB6F8883C60ADAEFD251 +6453F30B02B63D0438F927ADD8CABC0F78290C5D0433A1C611E4754BB72DB7A96364D9AB +8B698A63CFABED083D9DB7B3934DA6FED9C162D33BC52D95F98632C93A8B6611C5C3CFAD +B32DE2F520ACC68788CEB420269963C96B341D7702F7830FAE6CE78D23A99258FCBC3955 +9EA5748F18B560FBB1557019420217FC3FF9E1F98FA219728C74FFB024771CAB8A1675AB +F57B229870ABE51416A8D5906D27EBF989A3F4C6A94E0B9CC383C5F161B0079868B17D03 +2C992D39EEF4FF295EE6331E26022D098D1753BC6F949C0FA5567C8CBB382A92D13881F8 +734E4AFD1E7157D9ED6DE9EE7DA0B8A08F54B7C8121D9D4A5805373016BE8DAA8B2C20A2 +CCC748F20209A63A4A7988AAC44D829241E0033FE88CD314A751EA836287DB68B32C9F5D +0808946D8706556B3E597F70857C9C1ABC8728E256E9A34CA4D88D08A12AD64C1344E0A6 +7FCAF84A2E338B6734319ABB816F50BFAF49009AD63FCF1C9A4C7889485D7D6A3804A5C3 +52534EEE795E391609D1B6500321D29935FC49B937C061D556BBA407DF6A79C3372E1B91 +9539E5C21B816C060642188482BA31D8F3C4CAF759F7710E269235EB9F47C2699CB14C6E +0CB2DBA8CA246D4F8A4D95B4452A4AA20FED42E66C415FF1FB74BBB434FFF1831BECD82B +23B04ED0C66B5E1CCE3E166EC586CDB122D6FBDCDE2444230D932261DA28CA59BA47B23C +461E0EF7AD3E03C501EDD54727F14196906C9413FEA8E2DDB9C7B955B3A7B83D91DA4BD0 +2C7FD4A96FD70634E2069AD2189A546F0B4FCF0DCB00C0E5F3527A3F0FCAD178C8D2BC4F +4ABEB2250B4EEFBA149604B1A3D2178279E28B7E91E859E110510CD6C87D52E74CAF03AE +69A5D08D4F6A45B3DA591EC6198259C39E4ABA9D417336E18E0E07CFC28C84B466F034AF +A8541DDCFA4038288A6BA7A2503AA194DBAEBF3DEEF9BE93EFCDC351442B48AA8C0C9B67 +EAB4F75821E1FD55E60757D11BA394F8F336242890254F43F598650EE6EE730FA54E7EE7 +AF00FF3F55703D39B2623C7657E4CBB969AA8D7CE187C0119E485E391F57A6A42B2EBEB8 +F22B0F46012D822C8EC9ED9FB4085AE3C5FD36A9628B07B1A963337BA95E1EE89FD3ACBE +4921FAC06134DDBF72062F31B1D351020C16B886A36CA9D5EEAA6470CF5044C7B6710392 +1577D9D5CC9E49A36C30ADF473FE06CAF00A5DDB44475F74152D2E520A1975CD1C0A15F6 +A47893FEC6BC00E1A44E8F6A1651D39BEE76E67C83B735872BECCCF0F907207778C4664E +85C7D637FD201814BBC7D1C6200038B17F75E08B23F4AD0737259F9C07C47556FAE21B18 +1A110F056B1A612375A511FDAD2C291CF389622FD073F292ED09953B11E2A6626E6A4CDB +8B50B8F9C7147114DF64C9FD8CD2E064CD9A3EB95555FB2B8D6E8A4BCDDC54E97E9F0B5D +D3815077F6A825F924FCA5821E78BBB3E493F77CC71FCB3A5D9092453A0084AFA1ECF49C +384A274B9B2CE36C0B1413C473D041B4BE0080B561F7A03F5A1641A6FCD1959506EFE270 +88ACA5283BF1D38901F2E071BBA4B2E35BB79D9CE9CD3B776C7348EE014D21BE0421CBE0 +4026C044120006AE1816528B353850C3577F4A0CD8BBABA169DE487AFBDA975B850736F9 +1345BE2B5ED8D94DC2505B8D6218F3167050BFE7E723008CA3C29E3244509D0893C580F9 +4FAE8F724DEB1EE280AE8993C9502E9F40477FBAAE9C3F9DFD0A78FC38D537FC0BD23851 +8499DD3CC9E583C292D200B9A082008E52604EE8AABDF15DB108C8D5A693CD829C8812F1 +0CE53781E50A9D234AB33BE6693C3FB59B921DB35FDD87A393F137D0CE119CE835138F18 +7F2338E0AED3D973652DBB79D7761D39B8A819BCED55B483BEA6B5E971E06475D03E2B9B +B3B9D6677636111D4725EE36A077BE72347358A1EF91E5FFB77A0ED25542DD3FE9D7BC18 +596E2DF47A12A43F324444FE90226A63DC1CD5F265CD7EF81FE20A592D5A181B7AA251A8 +0CFDCDFA15B8A43A88F6889D2EDF93093DF25CC232BD1DB179536A1E3C46274F7F36A443 +86A764B04DFA73FF34D7BCF86C0A5122EA5332CA1D797DCCE9BDC7C8516BF80532BBDCEE +A7C2A883683CC3CBBF1E96490C2B7D21DA99A3D6A0ED78252B12E1C97CE41D2B837E948E +94BAB7BD87C929D8FAED67A8FAC5AF8E73F2518428646B0A70387CF9DF41DF0F4B5E7A5E +786909F6FF0CB78649EC9F653FE445B4D588370E86EFDCB1EDAAD1D2601725EDD7CB78E7 +E815A4B76528F51FB88CF25A44B187001C63988B6E32531DD4E961DF683D794C0AE3DF76 +D0C29D5A279E668E08501979650610050BE7FAA5B67B93E47C807D22B26CE24B9BEB46F5 +B09C4A4683ECE59E931850DFB86108AD5937DA19A2132BC076AEFADF3AE07F65451E7A69 +5A583E0741864156E31C4DB9795ED7BCEDEEAE6ACD259FBDEFD4B4F4F187726A7A247974 +7B22593130F566D3DFD71E500EDCA19CD8B7B7FB5EBAD025660F5D8B3F24A224D741BB9E +84942742D9D88E771B721E72859DF2CFFE2B288EABC083FAA26D815BA98A7A9F701395A9 +7A8058CDC1CF51740E293F51B6F0D61666A365235AE1296E1C9485A0043F651DF417CB94 +E53A1D79AA96CD5D8AFA0637EDC6CDAA761FD5F4E712745FAA66F74E7CA9D4C7929884D5 +32E12C92625B882AE1B60E0BFCB317DA1704F8A9337A42A8BE38DBDDEDC1E6FA9EB01F4C +FB0BA8A2B29D02D9DBE63D2D592348A645747C55A939E94753887A853D3DBE03C0BF8BB6 +C4892B94415E60C3B7927B3B7BDCF56B45189044192DD6CF8FD192C5929C1741B6E53FE0 +7B4CD9EF8409287D791BE417165B54D5FFEF0F742984E18340AA54EC8D3E0D7A479F269D +B8FBD0671C09E265CBE33A64CA9BF752D334803C09D32EA7EB774C32EC2E2D8706173E56 +C6A9690179F2191453DA57206855397146877BC55A562AF975C3715AA39F85C39A681FBE +F83A7377E88E569732533A5EA193CCB76318E9D6ADD7400BB9CFF14D698C4179033570C6 +D00D70E5EEF63015399E5F49C4DEBF22666D76B6D60F801D023FF4EE8D63A1DC0709481D +491F88979DC7AF7260BC0EE1CAD6A7A3EB0CE78C93865884383489F457F2AC5CE0C832F3 +F4B81820F37DDDB712560F066ED63777198E3491EBF087DA503CD59812FB082ED11E072C +1C1482D879AE9F461ABBD5D4BE7D8B50D50C55DDF9C49D64FF968207614A85DF8DD56502 +809FA54B200F7DD9A6D4262AD7F0CF61F87A69DEE18A9B8C67F1CC152A8509E64211A064 +F39F3CCE5894A8EC0E23C9A557DF5FD50E2A5CAA3338C1781D04CB638A47C7A5A6FF8230 +1867BFD856A6BF11BA8DF56963D17291AA202C991F7EC97B501F79CEEAE44474806A06C4 +00BA8E8C5AC49448ED4C248327E2CD223B9199ADA618FF99F8DB84065C36A8205F5D3356 +C690D972B139D97449C080821798A70E55801EB4532D0EA1C05DC635932D1848310C063E +05BB58B016A99FDD3102CF2BF2AFC5C6FAD3C031FA24F9BDAAC454529565E4EB52F838EB +D4A61A32FFB3A5768F3B1135629AFFB808AA85788B3BA755AA51A6580803B6CE45D94581 +849CF2FA75442E759F1A544237938E831F504BF6408034B034009BD82E623AA31B66D128 +2741C8692C56E3F251BE3D582C32A9B770D5DB3E9DA9BF50A527B37DD41C425623F3B787 +7186F26937B3E04E291EE805DCEDDFA214158DFE50A3ACCD0DABAB73F5F51BFCA200C466 +B9A786E7CFF65F4B24C29D39A844A6F6D6BE41C298C2BCCC5CBDBF3C3B731121F834E230 +C8AA3BF6E2C40EBFFF4723BC0B2AC407B93DBEBEDD49CD639EEC65777A5B6F94B8DC1C59 +05040D8E4B205068BDBD5F812058D4D8BC2E16114D22D81701D36665CEC878D148AE79B0 +F67957B5505708ED3D98FA55BAB6FD20E2C8BA1C326F514AF29CE979DF66BF1F71A579C2 +EEAA176A3632CE7F136885EF3D530C15DDB59C28CC8E820F55E31667E8D8555DF76807CE +3B37007E37A06AB32A21B2DD297C72785A88AD6F45784224D29241B013663073D8E1F7C1 +DD2BF95BF7C74B8743B31EF48655049EAD7BB13B87E648BF938059202183DD2970BCE1ED +3018733F8E5B7EF9255A29ACF581426DDB9224858BB380AC7BFFA1DC8D2589A83FAF5ACB +A4985D845B3F635046887AA62327FE0B0F020239E9FC7477821F7BD43EA2EBF1DC9CCF32 +FF6111507BF24557126C3BEAF30DCAFA051E3E9C26882BC3F4915F54AF9965505D89D11A +562EA74783739F0C788D0BE3547F16F9BD13F96D861B2DAB90A4BD23043D588D9B583C8E +15E9530D006DB4F17E0B4EA0A851397C4B781D707F98179B6E212A6FD87E2509B6AE4CF9 +EEEC87747374BB2144CE2E7A70B0F2C03A69493F9DD476675AF200F15EBEA4F7770001F5 +461B9079488E9FC1FE2EBC86DFE8CA2D2ACA5F746804F639228E813C8A1D1680F0A12499 +CE56678DFCF24FFC05C80F78989CDFB4F0CDA8E66428511E9BB0ACB8EC04161CC575AEA7 +522A229C75815C78B3248031DE073E0C5E538BD886F85555AA2E0A0456C2933A95E83AF7 +D16C8F8DA487452AC84487EC764A1A2EB1CC754F517FAD18C7F76769E67E3363D8881823 +6949A35827574BD65623CD4FE89C0F11AC2E050584CA49DEF1C513A8F7690652F963447E +DC79D866F8C42EC7F3092DF52EBCF6E64D19E44CE1403BBC3A29C56CAFA903D315D42058 +A01E6124B82F1093A3027891C49FF06C8C1638563F92BA051AA5F750FF5F6108F6C0071C +E9CA1CC669841592DE89A5383CEA9207C9DEF1A4FD137847A80630FECCE16A6454F4E857 +80A9B166DCFC50AD94E332CBC546CBC0A39507C8205050473351C6263B33FD705594E654 +06B19A80DBDD061D12BB89775D6BF4933B3FBF3BAF6B287A32EA01ED2B5B33C48715EF5F +4650C9B92EEDE15F46DC093FDE463578EB377697703D7ED7C0E576001487567316B333E9 +CCD75BCBA59E69E1AB62F39D0546EE67FD4C1339A93E01951F0C2A38A994406406D2C64B +D719DAF35CBB25BBC68E6DA6016ED0AD7E1930CB951C1CC22A8D82E144969FF25FF153F5 +D7A7A6608471BC31ED1F4B4E6E58173FDD83FCAC6FA079FE172CAB3BF667C0FAA4827244 +1445223D78002593602829313EEB37EF4EF8C96129E96484E36328213B9DD5F55B731167 +FA55DBCE903768321B2F375FF1323016F7A8C0B401BF8E2A983EBAC57AA4CE5668BBE152 +E1BAF5615559760ADAAFBBF1EA43703AAC9A74F21383017152EA311AC3D3F8762E1D8918 +887A0BD9E880D3C052A48B4EDEE667370097EFDE700B49D0A19F32AA3B43C9B58A3EC400 +DED3BA2829B90F54D8F0B3BECED9136941272DC0332FDDEAABBE38A0F8BE05287CB0D281 +DF55F4E8AB705B54DD026BC09E5831A64C728D9895D21E1FBD24D198ECD475CEEA216726 +E8BB15D4F8E946B5B097CC9C89E79470F0DEE451DB14D96C994DAFB07A0221BD48F79587 +DFC722BE7B360A93B98B42443494076BA779417DA3C17BFBE69B4B547A3EFAC6552E4D4B +9B03D51C863CCB46A8ED112C0B19608879DEAC918544B43B4199B2C0DA7B318FF13E0CF8 +47612E7279C334F681AC44CEBAB0D6E141506AB98322FE9F41430E69FA2F482CEFD68F3B +1280C9B6EA383C053F9474397E8800A6DB961655D18ABB68600F570C2D02E4750622174D +6A9AB48B05DDB2D56D74DAA537A642E1FBB63E55FDCD54615D08EAC22EF484FADB9862C8 +6FE2E6C300A367EECFE4337110796C21F60F9CA9D034917B1C98FA45EC79DA8DCDB216E4 +A3DD97F0C51F7828743AA768F2E442D2264DE35D7F191AE874B856C8473ECFF241A46AA3 +C2261E74BAEC485E0602ACDF8FF0A0077E84E6C8330951209C87E117DC57D6018E7D4EDB +E79E6F59C75D8D030B442B65B3513F74610B98C40E3C2D500D41ACECA44257F8E24B0B19 +4B6C8E20C51E61AE4F633F8586B52CF2D9438958C52F7DB15B499E69FE3BDC8E983CC34F +80B57FE1279254A228E7286CE78E771BF9436154847370D7DAEA0D995D9D7FC2F0637731 +29E076BF10576E480C1D82C29648A2AD8CD36814C67045E4A67737C22B5B5EA48387D991 +E35B8DB9695290D7CA13B1106C6FFE40A6EFF1DAF1A841F3A5F75B68D441687872E91EAD +4AE10D047756DECBFBE4F87262C2008D4ABEE51A0641AA309631D7E54258182E56901E59 +D1F6C7F15E8D3FB2CA70AE578B2CA08C65FFE542A479407F98D06F398DF54DCC16FBE30C +67FDD4A3227238EED53CFE2AE0088A1E2F9AA08917947C4CF795D3E464D55987C4DFD14E +EEE7C9EABC34C4F4C77B56C8E486BC35E38DCAB4E7FA1746C5854175AF400460BF82BDE3 +C9E066F4ABA7E1DAF6C04035AB86B1289E3702FF3DFE4FA431238AE487D486150A1C52D1 +047B1663D12962B478BB1E4B750FAA1E2A09ACE4AE89058F3E2B928167FEF099922EA552 +6435952A7ACECF1650B319BB3BB8734F9F54696B556BEA7EEC47E4A77D81280415E02DC2 +3F4D9A73F44AAA9646671EFEA5549FCC9A5915239DDA6E1C872F742B28A203AA88401DB7 +00C36DD78CEA2A9293E8768D5C59721D16A41000A2E1B230DFAF4A1BAC797DDB85BCC5A5 +A38BE413D0270D7259289AD4788D1D9769234BAE6CBA1DF835601A76CFA75C005C0EB325 +6A100B43C0AC0D0051084902D68F0517C91EA5F4161961644230055C97947D5756C62F12 +C550E113B2A88EC56345C965D81EDC09F62AE036C18AAD798250E5A0A07E607F3E2D0ED7 +B889CC2961339149DA012D74F290574735CF2706FAFF605861571D78FB92A8CDDC84C83C +BEBFC000D43211962C578111F8FB8E8506EB1871A518CC7313242FA11F8D51BFC3797637 +F5E1AC8EC1435B36D98BF1BF34C960C6CE650D5115A7A244ED7489BDB7F6514BE25372F0 +9E3F378CF95A0E462C0E0E1B4E84696F1977059079AA626D0F441D2CE7F4B52A49B14FA1 +19762B9FF8966772E936F0C6BBB0B24F7846FA1109562BB57A995AB8DA48C9EDD5E90FC3 +4C51EE9DFF7A2D4AC959320FE10B800C83E9B83FC89FA220F965DB0495A4EB5EB1AA21DE +5EB75C0CC0619C9C38F942CD525ABD40EAC721322D47D7117D750325AECC9A021D1A12D9 +D439AFC0425F9046622EA9F34FE1FAE58C428311D62DF1FACA2127AA627E91F5063FE47D +F727DEE5B989E1D4A89B900FA7A9CE3259A3A86D966609FC254CBE319DBF40FCB0515567 +A54AFDCA6CB575C49E893A136D1680BA06CD3C427E1D1DD707AEF67C44B89A4CCC1F40BD +64820463144AFF0DB7CF78F08BEC8C7DB7356EBE85A0DFFAD4D3DFA0F7F4AD70E7A5B49D +9E51D73AF08C7B65B9914071A837733C0819ED07223BCEC52D623D29CFC3463233DA8E44 +02C013306E90993BB54CD78043BFCE18E490443AB6D7567FDBB9C5ED761968B39DD21669 +EC5DBB5DC7205B279B3095460CEE2273600AD169C649D846A1DB9E6524A7FD5D9EA9C9F1 +A02CBF4D9874ABDDCCE5F70F7B3F408F6186A0CBF83EC8A342D7CCC022C55BCB472D5896 +069976044EE83A88622CB1C774EA75B34DE55D618E7D22D50ADD05328B59F9AA9B683EBF +4741311B7C07541228ED36A71F9175F4D0EFE9C11B0AAA03403F1BD623F43B4E8C8A9E5D +8D2B43F240C89DECE40B79C64DF6FDA815F08D51BACDD7D6932B73F74A3486993CDA0834 +3812F920486140EE379675C07291435631EEB4E03CB5DAB603EFE0545CF4130F9D7D421D +5114A4FEE9E4B2897BC6D232ADB685C55EDF8C2A8C47814A38B8C7BF34FB777360449448 +90946A15CDE17EF60BA40E77DAF5BECFDCA9A09FFCB93D0010A161BFDD40EBF7605EBA0A +50C3BFC9B8A48CFB895FA52EDDD86221D6EBEB0E9A3D8D0F80B88DA1B8099DCDD7703C53 +0C90F979DA5A2CF528B610B5645087D2CCF5D8F639E420AACF09F97231C3250DEFF28978 +43F44E473AEE74810B77D8449877E45AB5A30E29A4E98CD78F57A47A195C3CE22A5BDED9 +1B3C576D10D7467B3940542E70A7DFC92F4876E384131982D7680FE05A5812C80621EFC0 +A2F0BEA16B3D4D9C07B8AC4A540C803246CE437DA13FE610EF3211F81CB7801C642279E4 +9CF563ADD932DE6ECA45918DDBE97DA17B443C7BA15FCF39D91F9C4501B03E56B9F6DD75 +F3A47EFA6B7D9702EDF6C79C9183F37DFC805E5689F27B53D5487767B276AA037A210C02 +AE23A2C4C89E6CCDD49FF5FC857B2E8B8A9976C238456D000DBD35B00A9401657DF88913 +BE616D0800945CE1404968E78028B727B6DB6547F5155F4C5E0C97C3FEC8882EDFEF555E +98E76A3BEEBE09DBCDA40C2C35BC1A8C7A6B7812AFCB1468D527F723C947F56B9B1B4A45 +BC11CE5C3CA9D950E4729A242866E226A66E3D8F71D9AE73F0F8740E2974CAD28FE613C6 +B67BDFAEC416CF799EABCA17EC183A0FC013A16EA73B5156AD203C2D07898D20AC23D03E +C5E4534F153440C72D3DB5DAB3EF1AF626472D039892379A39E894B10BE22EB8296E209A +8C823E4999F6BF0A1D3CD90825C752A98AA190A2E19266329A49014C772510AFB6B85D23 +FC3811B1BE5CACAB09B5D46E3813DDFF41B8ABBF8E8ECC2CB14D48632DA2E5F5F748E14A +8877B8E5F2E2621014B93A7AF3113E3A8B3BCDDB1CAB7E7FEDEB79E1825E27151E7C74B4 +CBCB8B40A82F1F333AD206F18835FA8EE49BAF6E22E851DF09857DD303CA2CCDABE607FA +78740F70DD481DBD1EE04F730B5A3762082B1B47E69F39201D42A8E21F0F48CB5EF716F2 +4E3B4B20E53CAC08BF494E71495B4E95E46B6AC1802F01DBCFA8DBD1A3ED82894A5DC263 +700908A3AB700075586F3F3406496A1DBF40121744A9A1C51D3E135CBDBB5BA68D3BABA6 +21AAAB308EF3B0287A32AB2E584FECA9A3E00E0A3A7C038C225C51788C3D13232240EADD +63C8FB02A0471517FFC82E8E2AF6AC526F0A3DEE7726821ED3627638AD691FD4B240B9FF +613B72C089D11C22C610F9B9E244EDC11BFEBEB5B1C5E4B4A4362683363B14FCFFD748AD +339C432D31744B43591ED1DAC1721A9FAB9DA2B016070D89914C0EDDA9EFC894440C8B4F +3CE96EC4DEFCC4C57AF0DF67C40575095323A5D73D671D2A716A787DDC6837A6AF455F6E +B524888B98EE8E8F48FC9443899D3CC6FCF6EA214CF462BE414302FA0B39C1DB687B5186 +EC46781405BED3DD98FA23D796D197E9CA2287D4494E876F8AE61898792E3794AF5B3901 +815FBC50E7876043D1F14E61A6F998617EB751C113739F035F4E9DA35DD53DBAAA91056D +1EEC865258540B185DF50A01862EED02EE626051FBAE63DF6D94666EFAF4ECE522CC8066 +EBEC91734715C3919932E28169F49981D7316E982C287F716FFA8D61B939F8A47899D57A +C3D845FFDB0F21BBF2AFB9980EB0D4E180B4A22A902299FCA5B157AF5DDACDF2C9DD3E58 +2AEC6BBC869919860893B9FCFA4881FF8AD0D10066CCA51A0B63D478D1DD7BFDED04DF2F +58186AF02494A6EEE99FB66AF9F3B7C6A9E1BBA52AF2FA10596044F7A9D4B0CB337AD6AC +5BF8CDBB69390F7536B977311C6C9127F26DEE4378A17CC931587F77F14DDEAD5DDEE1E8 +B57FCBE1382D9529880BEE3DF9FDDC6A3F9C6056988E5FDD101A54459F6932133871851C +4871EF219571A1FC43A42BF14E8B029D8AD6EF458B59057FD6BA634ABA8D6C11EEF4BCD9 +402F47D4739BDDF22948A9D5E7754F621D27565CFC92BEBD62555B12BEE04955923A9E8D +6B0C3D336E8345FBDD40B8E7C9A43DB83A895EEDDE6211EB1360FB016A9DC23F5055839A +9A71775D8A45056735F14F87600916F187A53C323C86CDE455356176FB014584B4A04126 +3FA11150B2DEA71B44BB130243973600B3A9204C13304853D33A15CCC111C0F08360DA8A +A2C615A72FC79C1B128D04ABA0E92A138CBFB37253EE80A18BC9D92B5845E895A7DC4060 +41AB37F3D4827254BAC860D6EDE8C5912D8DAE2F943A4430269FC9F9894024C73C90D77F +0FC81E16F618BF7DFC1AF1CB2EC0972F62B30F5B37747A8AE2C7A2C7C34595B8F1DF513B +973BE2F1ED822FD4BD7D5B07BDDA6006019700257B103BA495F9148012C4CDB2C3180DE0 +B395BCACDE2FFFBC1C64DA5D7ED1738B68AE483E5007EF90C9A770D73988849F2D2D6EC7 +734422A7D0BD41042988E4F215A81B4D2545A2C84A1CB218825221D3E33D5D5A2DA7E91F +90B275B9F73571286905C58ACE35E0FCAEA9A9BAC32784C8CFF609B09114D6836AE6315E +4943E9AFAE0905E0516603C5CC2C54C364CDF9282DB7BA8DFE921D7B4833C48A8045A60E +ADFE47F9E1818BC4F97657007DEEAB9DCA84280E3014EEBF7D4D0D1DBFEDB072B20CC4C2 +BDC4414DA5070757F4EB8F65B1DC1D8C934F9BC20F516A9C6295724DCAB93A9CFB0D75CE +A6237E7F225DB1CBAA18C679E2C6F0121FC59D090E5DED3306F50DD0F92D5D9FA2003095 +CE6C5157C569F3E5FC02D4F3FA115B9B294C74CF95DDED62CF1E5490A6FBC97065247D4E +23D1E39B0EFEC6663C27674AFCEFBEA9E482909EF6B6B8E3AAB9FC169B0DCC8449B50A08 +221406F001A4D140579FA9338C675DAD54E854CF359452C07D07EC05F28301D94FCB46DA +0D0F5502DB24BBA0364EFF694A7F4E86FEB6845CD59493BCDE8BBC61A30FA209B890F097 +5600D91FD896E6E0DD0626B4BCA3487AE1C577320E0C251AEDCB44910510CE89CCFAAFAA +CB88770FA29636576011B67C6FBEA6A310AD45A006100C4473E844ED4DDF69341BDB9FC8 +3D37F678B9F7A2BEF245F823186C56AB3667795C79EC85D68B9A34E9779E29889E67DF20 +26B22D42C423C1425A678D8868543E96DFF0EA75C3666B0EC85A015B7048F5ADD08EFB1D +B674AF6D008808168A8EF8EAA7D43F942043F3508D6AAE60CAC9C9950B81C5ED863B6653 +0C98AEBE1942E63CBA37FA6E02DA11AB27F8579BBA5220635D424AE097A88C830B3D42BD +6B7D89F6F40F63B362E5215373F943ECEF08666D86D2D3AF045EDA7F9F796A5522608F6E +3FAD8953F166C11FD0688B127AC306770C934311A4890C48ED4EA8D12D04C5E2FF9B6DE1 +5253DFA7627F3600C89884B2B3861B364FEB31805A1D91B95D2DAAE9D16538DDCB94EBC1 +23F63ADE7C1B9D48E526EAEC0FFD822160DE068723170F5B753B5C10A0A79CD09ABF1E96 +A8811EB377BA65F37ECBC966A054A65FBE686C3BE9FA4573BF86865A5D997FFB690841A1 +F273016436C3D76351BAE06BA745BF00F27428B1113B5351567C9B254948D8A91F6927DA +381F993B0F941458CE5F5189091A65B5D90FEF01051919863C47FB4EB11D18CCF8E5C8AB +3E518A0923BF4AA13F83BB3FE88A4C3D680B7FD65D649E0159C6C9151FE7959E77699105 +B8E4E1B10C0C5B56C400325D32EB5716BD0FB13AFC7A424222B970A894C7D33BABF63B59 +EF13538F526CEA62F5856F1BB23A00D7E65220E5241D7EBCD0F84C44ED3EB468DA011023 +4358E69CB5AD8C0B53F2AC1D014358CA2C2A3C901AC5B2850DF73455D690D3944BB641E6 +995053A40D4A513425BE0A17D619DF7ED39076E9FF9163282CBABEB14BF7E4A49A5D93C8 +69B9F57C9D86AAD074633AA533F5734F2B98B0CFF7ACD4726BB1CB239032FBA59B3D0FEB +3F3C169C667807380CAF379766B5984B4CD3D71975B62EBEFF09056E62917083E35CAFD5 +6FEB1C7A89658F46733CDA47E99797EFB6E48332D24C1B9766F92D4D4AC4EF17CF6418BB +CD0694C26CD6B5421AFFDC33764719826667B6F88E604F982049D286A35B5EC47E07605C +A8D53448C6A436B183BAD32E8138CF289C5D0ECAE1A2818BC3CAFA0B02C9097BDF043F15 +8625F6B756D85C81A4B42865A4AF790BE63EB95C72BE08598898E801FABABC845EBBA1B4 +4D4ED41CFF1CD460612F8C2B249B1A206656B2CFC3910C57465343DCA6DF0DCDA3F6DE56 +8D6AD6F83DDFEE9DE523EC0BC45138BB80B7315D894B27D73C4C1DC582BBA0A8917E2E10 +F94369E0A956F61EE11CBB2B45ED6027D448538B36C471D2D3BB6BAF447B60F6023F55A3 +24A5C71573438FBF1A7B40A746A73F5E1B51FA3F38DC9A2806BCA0B8B6817B1A265826B3 +27D425929BDEAC8136A91329B43EAB1AF325960D105915D185E0522CAEF00A15A2014F6D +E29C3093AFF98028F5061818F8783B37FD1881ED44D6516EFBADD5D6B500D5502BFE6A5D +908A07BABD50514A1484901A51AF83C338624298070D04C1DC09D03E565C7D25726E37AC +1D1A9F5DB891126F9944BFA1080C7906A263BA892363087DFCBF6B92D9AF9CA1D7781A99 +9DD794B3385C18AD819D9558CEEBC46F9097E9B6CE6A00F1BD43C98730CB80D48937D0D7 +36862809C16C794C4435B41DFC392291E699EBE1AA54537375B6FBB27F1230B77A0A05F9 +2BFA166CDB8B180036DB3F48E4851A538C628C8D5D9CD556317A0CF0E6C28183E07249E6 +D6D47F35F1C3220596EF0CC1F0580ACB2B029B5A5B0C10DAEAD5D3F698CFEC641F16D80C +0225611726C1D8C4482A00038BEC8E0B9EF7263C32DF0F80E01473C41307FD9C10742079 +9F2E0486F5C937EBFA48B7B61DBA9094AFF525790B61C3858F76685675BC6ABD1B9E9A8C +A17C98CF85E49D6CB5A6B7CEE52D67EC249CC2681F802C06FFC639BF3A0EEF23AE39AF5D +C3E77F63D07EC30E4B3E06F74E707DBDE5B6DC0DC1A9DB02ECA2FBA6C87CDF278EA55812 +40495E2C138BE9CD3AE2A1A427151A5EE3CDCE28421B137B1427CC48EEE8EC1355B48FB2 +86F40371EB9DCAA5E163C65967FFD4FBDF7B358463D00AB081ECE83596C2EA2F3CBBD847 +6D6EEFF31FD8A0E3CF4B6362BE42331CC2737891CFA525B1CE62F2FA4B1F2FCBA54D0452 +B77579DD1C56DDDD6DFB2DCB816B47FEFE0E84D3A19FEAD6290FBF751BAA095C068334BD +77F0F04DEB6443DA99E84D250849045DBE0ED267F2789B475127E6C57059359EB08AA04D +3FCEE5B1E61EAFD90B19668647CC52FE842FB9D5A58E3E50E4CD7A2EBF1FC9DDF4CA4B0D +29AAAFC8344627C9BC74C49BD24774EB0CC6DA70B3F3BEE134F298528373CA8B96121B31 +2C5D02525A1166E8A644D04194DF8E1D9323FE92DAC4833CF0E08C716716069AAC65A421 +142B305E97E668A32B397244555BB14653C18384550BB417C05EC9343BE28E62845ECB49 +AE6AFD50A5619CD1F5779FE6AE1C2A2C10420F0E9426AF4614FE2E6E925214E0ED5C6133 +E9E44ABC962770A4E598E8D4300F9C93CC152C5067FFAE77FE9A171A5E463D1E9E5A332A +564281F49055D0A99F49A20368EA7C75285EF8215FC37FA69A66101EE4E2E32A1A2AA753 +8EE3FAE3D4C31F96C34A74677BC9221FB904F777F69D2B85825E09C8BEBC973E4AE85EFD +123507D5D428372188270978D9C7ACEE75DB5D1F1E2988832870B7EE4F5366DE20237EF3 +E526DC33E2A4FA186A43325779EE8253D76DD1C4FB007F1A2B8E0272334A5956C488ACB1 +1D09C8399B4181B626636F6EFED9A5086BDA64AFA3677A48D13464C2E0813421D96B08F5 +F3B7D2CBF5B2875A1C217F4677B026B21A07A8C61140B1A91D552A1947952448D7492460 +FCFAB5A22A7E9BFC577ADAFEE42FB8C0EAD717071E54493AA7BFAE960641332AFF9AD94F +9FA05A94FD5CB6014FBC8D274ABD58DE566F621672550D2453ED92AC8E317D6D28F5A443 +D211A3A65005F8A18006D2EC7749AC8F57FA4142BDD1D62EB99A2C4A2EA448AD5DECCAD8 +7B54EE483B40CE76CE2CC0239B0B50C8AF29E007A10FADC1863D9844B2380052383F333A +29A7168871919497C878D7DDFE5D22667C51FFF6C2926B3D219D3A3C02EDF6A9FAD14E90 +90D293156E00F6292F11808EF0E73CA26147998707EA4ABFF7B77A5E29ABACC005EF74DA +D402BB1AACE7CDFA12F93421506980C275BACC61B292DD800E07E1D640A187E73A0B682F +0005D5BD5F6E53171C376B1573B9F1FEF247AC3494D828991A9050C2B85870A9C2E08C14 +A92632C3553AFE16C771A3FF2DE42949E1AD0665A0BAC07C8B1C9622873C54DCAC6D642C +1F050F2CF566713BC4C09E28AD0E7CC6986CDCF68D5D8DAA0B20B6310E4198A1B95BB262 +7B1816093B84234255C361928DB4BC5AC3A67A487C540394E833E3D879B3C96ABD4ECC4C +95FE7718D1D6443C84458B694AD25EF8824F947569C001931C133D999D6DB574698BB17C +B86246A3559E4E4EFC079D0BC9FBE3A8668DF9311E7EFFE4316B47C4982168D69331CEFB +AB51A1BE03A6C2CCCCAFE7BFA2A836AB5819FC8E18E33C4CA59955247D0EF9AF810141E7 +B60D58D38A2A5F4686C1FBCC929A2601EEED2A4A4DE9AC90F726F1D1A16BDCCFF5280A6D +52B626B3D927E606189991FF548FAC99C1DAC6B894B4BAA370678060B1D6CE7D1F74E251 +920D7279E493017DFB862ACA5BA417A9A975E4D6736C2DEA7418CC1A07DD3812BBBE56C6 +F3CE5DBC16353009E547376D99F03FE9A087C29A1161F2629D00206C219300B1D09F4BF2 +AD8475A269466201C57EDB25D8A458E4FF1424FDF09B1879F5AC6512952D56EA719263D6 +F8BD77D3B5C04A2D9E27EEF0FF3F42484F667DD1B3E483C45DA8057AF1C3746820D7C663 +5C363BCBF2106DC618AA1F46C34E9562F33EE3D392A6072FA236BDFED8D8FFE526694AAD +A68AF0ED535F0E1E2CE19ECABC2FC66ACB07E44FDFF7111639117086B1876725BEA99E8B +D0CD8055DB154A8A7BE4165118C104A5C1B2629B4C948EF51A68C7A3B5ED70C2AB40F0A7 +53B75AF07F4248699B03A7654C366AA3A25121D8590E787FA902D5E29516BAD7C842C649 +41EB1350B2BAC0E28946943E0D5C227326D7B1C3939FA481245B19E7959B770DB9355DE2 +E5B6FB5F66E273BB9CC91527F87F35E95AAD29D867A0D35E9E6B1BE8F1EAA06FDEF2BF33 +E694D4747D525AFFF997EC367C1E1D0B55C2146BBE47581FF99824269E43B795FB02F80F +83B1BB3222C6A48B9651325E4A6274BE9047DABB7FC9F85751DC9239E82CBC5ECA22358C +8EB9DA76B9CBF92894268C49CDE4F67B6299CB46FAF1A8E42FD584BA74C47767613325EC +95CBE6A43BEA5FF97C7C2195E970504893EAC878AAEC0CC2E86CCEC442DB62FA15C4BEBF +35D8AD91711A689415A84DA6AD6D1E2646E363D143FFCE360B3E9D282A84559B1202AFC8 +41A603E80631FA5F1914411B13811ECAB8CEF64906B0361F5F558A22026F46FC88A389CD +E0B23523E884686C7D4D9FEB4C3D66BC410E2111A73988E73CE96CC26A9ABAF3C860D8F2 +658FD13A44F3DA9B5E53E348FA51B64299FCBF16D16E07CFD4C5446614FFAED07FFE9E25 +A10696029806CE3E23582A1FFC5B83185A0411E8353BE08D7AC131E2BC7B7A8EA6B36653 +82B2C4C217CA8A09ABADE43A7A5249643758B7FD0CEAB8A9AD8E8ADF1A9D13C2E5EAEBE6 +D29ED3734EDF200A92E19490CF4E42DFEA28AFEEA7FEBCBEC1645C6A101B51303BAFB113 +8D90761074D935F9F553787C1F653FFA3DE1A8808D185F38D57DB5E1B16C1EE5B1385C4F +3C9FAD7CB2460DEAD9DEB549303502AFF17660B9330D162C891F1039B68ED4682BE6BC89 +7800F158A24B07539CA9CFC6324D52054527406D915BC0932F1D7A86E2FD1F649386CA6C +6E27C50CB7A63862D606CDFC3ED8C6328A756AFB01865C264FA74B586E5A6D34CA48CC74 +24B5EE73BEACE92A3A4D97BFBAE51EDC60643B8FCF024EF05E263C0BF15AC37665BE3428 +86F6B507B63463EB2DBBB5B2EC5CA4F227F9D5CB0124BDCE2C0AB3D4358273910E916D43 +6FF95985D564BB420489DD1A0919C8100EA03EC5702A9925C68C86B4972C118B04016533 +BD9726054B7B563BEBBCD62CCC5A08F133ED0554872DE4188F1F15D52CB5592B1E35A319 +C6E5EFBC10CEC89E9DD78884E18FBCC408378351B276FB389136ABAC62515C1F5C3D3755 +3E0FF12DC19621DC4E6C148FC4F56F8FE32CDF567DA11F80ABB91D224D4AA7ECDA2A5035 +9825F25B2150EE449C101935B44549EB3E6830D551C551E1501D7CE5B3968B770016F605 +8F0CD392393DE4576167DF1061732E9F7A42464610BF841387941487AB1BDF04AD40EA13 +90A50F076215B6DBA43231647418BDBFD39FB143D43E0B8912F36348FC7A1CA96DEA49AF +416D8A6CE75EA49395667E19CABC2B8D43543A488B130A2D85386518D86987BDF99A26D8 +B4EE1E29A4BBB8AD0AD4A27B346FB5F9E8E5F180F0D5748FD98A64715954A3125A749A43 +EA2B18CD4DAD93656B8FD9CE27E5EED5BBC369C060BBB43B4038ACFEAE8D437A354CC373 +66B2715885DDE1BE0F5DCF688E5AFE08E163264DAC1BCCFE9666B01970F2F16B47772ECF +751055380EF0002FC3877CD3F89FB0D9E018A6541FB71AA3F6CE602C4DE2920386F01185 +E2CF256CD8F8EB24F460270B6CB8982C46CA5E58566ACF504EED68FEB0255B6D58B33687 +551FACECF40487D58D4DB520A1BF372DD3B66710DF6224E9B6D2EC15B31EB4E41A6CFD53 +42E3FF218807059B0EC60B96CA5F9F4CEBDB3ADA79C16624824F479F5FFF981B0E109BCF +8C15D2254FF75BCDBDD4AFFB96CEA4968C38611FC2204054673FA7AF01DADAF779AE58E6 +8600044320439E79D45D56352B704E5F12E56ED1788E0817DB76B80F134C9752F0082CC1 +D4205003C0B2E73BD54138B10E0A16CB57A0ECBD17DED50FCDF7BDD848576E87868A911C +C5F0B1C36BFDDCE813366DED05732C46C9DADA44D71E94C3C4A5030EF7061684CA509C70 +8A242B8A39D649530F379E81A1F5B4456A452038BE180E35889AB052D14823392AEE2379 +FF3564A86A2F50AFF40962F665F3C005CFF6992FB85040E6601D20135D7227F05892F344 +2578C821EE1F00E68E0475C0266FE10458A18634B226AF224A80FA07A1E3A29FF6AD2838 +CCCCEE4E5E9035220AE9F53C02DCA89F00418FDF632653C5C64BEED2209ED102489720BB +D735B06159B60BB162997140BB6AA99CD063B94A7DE5098A8CEE9A1AC5ECCB0E0D12D399 +27FF2FF621919638D4205E39DEED766108D63938FAB0DB2B2C9D1BDFCB14517C7E98369A +7BD3E31ACCCCEAFB954D92A22209C9E825CB38C9B5A529823B0A85BAC2605864B022BE5B +B8DAA6312E8DEFE04593F4E8D0284DBBA42CDFB7C189F280FF48B79891EEF4FCF59A413B +7CFAA37EF7A154DF78808E4AB8CDA33FC51F6E389227BA952469AD2D7BAC328342467482 +FE311D122B9AFE8A16E9B6F5551CBEE36A3EADD5FE7A524A556F3D7AB3217FD8C574DF32 +083E0D1EA61A8E01E3BE1392BD2955486E289C3E1727FE71C50D1B50E4B7D945C5555851 +AFE225EAC181B0EA541AF40AE45309B4BE2DE1BC9B36E0B7849D0844330F3850572B3869 +FCA1BFDA818FFE1CB7095423D611D85890BDAC15318028FE9F3033D1DCAD9381B9237247 +D65829AB81AFB878C7EF54CBB6CA38526AFFF404662434D7714FD8A5D0800C8FCDF69A5B +A6938079F41D08E80746259C7D7D24E149E2C55424223CCC1AB2008545CB8C5B51CEB8FE +DAC374E94A7836030F536F34A55352ED405D9C31AC2F82FF072B9B885968D534C9792F45 +1BC48E942D28CFF06246597246776530F72392C98D29CCDDBD9063EC24D559437B844430 +0D2D742E08C0126F4116198C72AD9D95E83A534A6D353FE873038825687C3AB0281600CD +FB2558D70450E14684F610E144A7568C471334FBEDE0CBFE913297A657321182AFD4045B +D5D205551C6F9B904781B32529C2AB0FE1DEE6269CF6009203027C9425262CA5AF2EB250 +493B9C1018F2907DCC656816D57FE4C987CBE7F7F1BF0EAF8AA40E23B456093B3DA29C21 +5CC7F911ABD9ED34866EAEA9E1E7998C4126CB3B44F7A8075C37640E0AABFF1B9B0EF003 +96A9CA8999EFEC2FDE533584B5F49BB4DB1E121B581E12F2392E7ABBCEB56B35E8D0E507 +980457C24100377B95668B167C6E5388760883BB173A6993A88104A3E08747F1B75F553E +65E448C8188A3942182FEF0593BDFDAD67691E125012714A0B4A61F5E918980E1A167A32 +D7CC3D46435CF3F2A84458F309661A2095792F79D1CA6378DF864A308E162F1D8B35CA85 +98045B55B19BFB7D18C05B0216F5A7B75167E7866537F3F8F6BFCEC95B946B4AB1B0B015 +E45ACFBA6F4E24FFBD0FC639591A95337ACD84FCA6A164857EAFFF41D00138A582E321A1 +D6205B3E73E2A55882FD873FDAD0F9D205D47F75055FA3863E5210EF6A56F8D12397E3BD +EDBBF54C8A328E62E03BE58D301B285E398A7AC55F6E08493099CCF7A70E79CA81E275BC +86805E22DC3126C98916CC09B06CCCEEC5B66469CCB92AA21B71A49A2596076818B17ADB +301590C5CA8635CFB881832F8621E6C15EF5D59F20F75098FBC0A7E79690CB5CB3F746FD +D8B0A8B92AC145E9303ACF6FC91820119325FF5D8BEDA62446311A73D89739E628B907DD +AD9B8CB60E076AC1092DE241A56495D0C1A5EBC43888BB8DD087BD6CDF38E1DE93630923 +CD7F57AF1604A42B70D2E073935E66025F44ABB3E8B620E065810AE1D2415D7A58175D06 +B7CB4C211499F9F9EC43B92C3E93DCDF03699D731DD288C1651A62A25AA9BAEB1B79AC89 +974C233D6ABEE67B4729A746A700348845A42953CD858ED53F385288ED83EC2B54C2F416 +3D4E2E5011485D9293567429D4BA52F1F4CCCD80BA8B59B501C629AE567F24C3AAFEAA0B +4612ECA7694CBDFF876C3B9B5391D6EC38DD10166C3CF3CFEB02DAF1EDFB661899D3EBC2 +556EAD791F18381618D14F7B7B115A35DC0E8E282B8D1B4C9E68B09E9C8589837660444C +89E477BA7BD0CDB39EA9FADEA33A9990458A06660A30EDB737BD11627B68DF9445A34D4E +4993BA9E24CEDF0FD6955CECA5C9C79A340AB31096FCE9FFD84B2F49C8D504F55F413860 +7BC83217782E1A269E662DE79C67506F14AF71EF7302282256C1894AFA5DEADE51BF4222 +F2D0F1F4FC1EA7E128D7645E07941187D5CF65EC19667F2D204222C6958BF58525124ECC +17C02EFB44881DBFC89A8D5D73A05295B71AD83BD9C54ACF1FF0C542D13DD9CD6957078B +FC5F8A0BA938AB3466F44919BD38C5A0B14E899208598792AC43F532D41C6B8C4393DBE4 +472B5339C02B620F6D49C0B0BA93BEAC6373539881206C1F8E5A0F4241D0116737C4EE62 +575A47D79F1DE2569516D24FCEE9B7829CD545FE71D3DAE6FCE4BD780437E597F5849135 +D69B7E51E2D6A83FD3A8E67FDB1825D2A56E4BD7D6ABC291D052997EEDFF0DD618211607 +1D1CE4B60708315358C989BDE51C97FF5F2B2141893287F822D6AE440A811FEB93E0E600 +AF51552FE111FA4AB014A89EF562FA552A8CFA6E5CFBE95D81B7E50C04BE883DA4E460E0 +83438DF33E15F8D759FCB651B18357B40094736416124FF1D59B4B7BE4940CC5875676CA +EE4A30F059BC59596E693595CC889B2627B3392C5EB267863CB753908FEF7712BA9ADC4B +E47B18FE8807AFF106669E8EED7E0DC5AEB3DA3FFD8AD8D8B841626B800B5B82292D8A56 +D5E9FA394EB1686C441CE523407401BB4044C4C5BC448888BF122AC6D703AD6333EABC52 +C999312CB3E16FE4FF2FC8859D8662CCD6E35DA8B02BD22E776020C3BDD774E9A24EB72F +7231F1B9B3A096E4A47AF15B4AAE20946F8358BCAB1D5E3FF566D361508DE82D46038A28 +BC879A9E75016FE30A8AFBCB1F2ABDECB4ABA14CAA2323A5DA6C57A712EC6CAFB1FEDF0C +235E50B30127F62CF88E77362F6CCA0810E29B35EE5B7BB29920BAF6FFAB5EB3FF5377CD +A310FBD9AF79001E8583748164CD7C4138DCBA043B67CA3993C385B9F054585517E4F73C +C5F63F46F78235501F636BA4BB41BD0CA9BCEF79F0CFBFA446E09EF8C6B915AD718CA59D +B97A78CEA2195C968842C94B36EBA1F3DADE4872E3FD7542D6E477EE9343CE5F801BAE59 +CBE5A2F66DA2177389308B526493A523A9496C7C928F021542A1D6676CB3207979AFD6CE +2E4B37B3E3621312782607BE9F9598D470564F6C3E502FA2067C1DB36C0928D7491F5119 +72EA2A488D3A4A0BAAAFC021FC89DEBE05D7E992122A5887ABD7C88AAF0B12E3A0E6457D +E7BDDDAE5C4449AD3D0EBC9B0BA6C5A72C2EF5048238A8595B33F570FE36F1C9A3ADC38A +1EC604428BECD165520FE81172BBD2DC01EE2A923F88DF8A6CD992DE1875FE3C122B42A8 +2F4CD38D5336DE782586385878CEF7124AF8454C75E92B4AA8786F40B0414497A099F755 +F1BA0AB892066BBE83E472880AD336EA7012100B03D06E9BC9904651AA7F93B107EFF61F +6A2F7CA20240BF1D3E83B3256398CBECC74F8882E40B3E10C0535ED23A8214E19464082A +DDF3F590F9CBB75F06820A1DAF1DBBA19CA4D57B7CDB841980BE2E879E8D83E74FBB3EF9 +7D644DFCA51DAD4F342534160CF07F8822082DF31D8A6282711D849DA3F583B32ACB48E3 +0C130028571B9565E61BBF8253E97435F60AC0C91934C5A3FFECA5155B25455D59C18CF4 +66AE7A467EB5799BF2488B1568340F368267625F1ACB7FA34A8E582B0528FDFF256154C2 +F4F2D0F61A03D13A58E01548646D6B4659B4613E83476159E8E597546BD1F7902FD0DFB1 +71390A36A8389E25388391BAE75567201CD1A6225F774AF5E3132222EB969BCE588E1E18 +15BC60934C8E132627D342B1F7D780F9B5DC657A975387202EE08E957F3D123B4C115F71 +CA9CD0A5ED37C7626C8596E9A4DA7FF5A114A85E545F89C3694F3FB28A5224CA6F930538 +9B76D686F13C370887F75F88F50C98974857520DD8806736D034C188403234F1CEC012A1 +17F9DC0B03346D88401DFEA09A28944CBDF75E79EC6B26F204CD6D4F7CF02FB3066E7085 +BC35AD0CF7CF47AF38524C05B13E51A8BECD2B4EB4E9AA3A7FBF08A1E71A61B2ABBBB10B +714A0E46FFDF3FFEE96BAE962C10B8FD824E700E3ED94FBB1E03AECF77CDF572F623ABF6 +9D1AF511F65408CCCF16BFB2F1A0895D5CF069A78A3ABF523D4053F8A4F6DA0F3C6247A4 +5F2F6F21C964B50EF4615BF41283B6C655E55397A6FBC23249D306151A4E5F57C26AB256 +345B45B3D81AB1AA64C80F09C6000ADE9948C42E03356C0377EE74E17281985B8ACBC958 +EB9289159091E36937DF725063C434D30DADEDC3007066C7302D0B12F8CCCDBAFC57BB30 +261918964E42F08D1345D4018BB1E84E31B0F57210033C0EF479D1ED0AD35CB7178B173C +6AF59A4824FE5FAA88AA847FF999B3152F7C12F7258F7C5DA155B8BC0F166D9B6AD20188 +3154BFCC9E3B9B267FF8831BFB906C6CBA7D05842E95129D60B562678A322B94BC988601 +E8E32A6C507F02005BB1CB8B220A6903B4F621ECA9FA513FA4ABA25D107A39ADD5D32593 +5D8875831F02E4556E6EF278C01E8A7FFFFCD1D5EB4689A2DD86D291F473120B984218F7 +DBCFD434EAB3EF19D1A67F4EE9D239FBC0BAE239D0C634D29950EEB6FC06F0481A10B225 +7B80E1F0395CCE4C4291A54A5154FF1B0896D2E0CAF112D0E534F014FCD73082FE9E8A67 +ED23FDD4F7C37651FDBEDF999D44D9BD7D57EF6038598BCE94ACC2B6C0BCE60433F834E3 +524E3FA6028B6D5DE7631B10A2BB1C77BAEE351FC7373C175D3878502C2DC5D40596ED3D +8940052DCDC8EBE7F1853D85B06AF9114FD739E558F0FCA26F3817A990605F9C9807F900 +A18C71248300BCFD22D7857C390431356FA4BF993357647D9A094763D668B7908CA93E2E +EAB15E34E48B1EAF8082C6FCBA7DA5E9848B33BC59D6B50C9CB5108F3C356A45A854338D +81881FC425875EC59D361ED95CE99FD7A279A807671C8141A000A5419E8B9549F3617114 +6077CAF18A152CD041F94E113DEE2932F1AD09D55359B7B39F4771F15521DE58C311D143 +AFA24A92D36037968DED5FA71402B34442F9820F31D1C608124C2B50EED276FD06CB04B2 +3D0579FAC4ACD7C674EC5E6527AA352E38B35B14FD647E645CBE09C5D3EBC76D35D02820 +C91A1E422057E99A86EFC9845EBD5735B8F61A957B44C33F7CA9502E08F39E24111E73DD +7C5BF59212BE06698913B89C221944A9E539B1E79038B3E2D2FC40DC4D9115256D8BEED0 +343FFE190D6242A3054711C86A20E0C4DFE2C270375DBD1009A6ED640D505F25F475E0A4 +DBC0D9840A68F2E657C1AD8AAD7A260AD74DFBDB32B2C6CCA9A49361755DFBC09935041C +BC531A5924CF763C29DBE8F169BBE77A261B1DFBF1504A04CE7C3EFBC0E36DB1CD256AB7 +F40C272E2C3C217779A2D45E1A33E504A32183552ECB71EB562040C03D276A91590A286D +2A90E7A292B21AC7FC70082F18903E2B3246A66D95C47F7FA0099524F38018566485DDE1 +4FBB810C07BBBC487546F0C2BB295D1BEC35D797B0A6AE0616ED8465BBF239A46FEFE3F2 +E20F85E3E383C16D6F97044B6E4E80DB26953D609F8AE0FDDC92A41FF2A7EA7744585B51 +27F7D1D756487DF4D75289DC3FB822A16E1A8063D5BD6B2D7201DBF78BF4A34FD17D8133 +F8662DD9704ABE347C405D6111474E69C5F22552E4C6EBAB4A6537B46FA2EFADB55485BE +A4359C8BE0B2A696BB946E89A5AB3EC81AB9B584E6EC841BCF4192EF82EFCEA357C90039 +3AD2705B9BEBC894E42369F7CDB749E1A174EE4CB77454CE86BAB1B631899C547321C9EE +0499149D87F3FF59D13335D54177268569DE1AD675BCDB9281C21ADADDF54B32E62B3EA1 +2FC565A670778959ACB4C4A36B6FEB86B174D3FFB0B2617B2A84EA37BA5B4DAE6B7F1DA7 +36C01E446799F135BD5573B086D61B5D902097E93C9460E586BC8C5FB863507F7938B02D +90EE19C51E00DEFF3764A3483F52777644D3F20C0B99A8807F25FD6080373B09C68B45A7 +BEA9F0731DE751BDF4147C690A9E767DB679A8F51849D094DC1E8209EF159084231610F4 +187ED2875D1E93A2C977C3F1C86614B60F81B31CFCF2086E91C3A09456F376DF76F6F4C5 +6F6D96CA852C7B749255150C5C16453A84B9FADBBF40273B18FF8E61F309B649BE8C8BE3 +75F739C6CABCC9FF39CFAB9997E77507A7EE5D521C769F6A9A03472C51AF83D6682700F3 +9D1114A04992A23768D8547D668A9C1302DFE2A2011E3B0A101ECA1A41A79C2AD80DA863 +CBC5D77DB3FDA136ABFA30603EFB15F99F848F18B2B55D3038E7E7F6B691350D3C0D6766 +4D0849BFE0CE481B1B732326AB02CE44BB2C15122A57D42264349E72BD47BE006DACE8F2 +A0ADAC696138227F9ECFFABC0466C2EB581211CC0A24061CDB43FBF37A4E8BA1434A35E0 +2AF6B5914D493F64328F8590CDCD38169368F805D5B64AC0F4B996ADA8879157AA0EE3EA +605553CAEFB6D31B01F66016C64F7188556D66F185A29164AAB1ADFC1FFE71934CEC127B +147F36AF98AA9A7877A7188EE0160EE26705D1AD9B5F86D8B6BEE71C1BA240FC2A903D65 +0C3C69CCCDDF00222CB01141C0F03958D9BD5524D8C31D4554073E2DB0169849487244D2 +2A28987A82DDAA0CD060C8A8740F1A11509152B4602A6D0DDC4456849FE5E402F9ED88E1 +DDF8E5AD854B5FC77575AD955C95BD033D69F4A2D2EA6B6EF587EB16ED3E0F52E7578FC7 +F22324AFB86353B1EA4C51179440F2CC64A37A92BDE6A88B24104CB8EC78C660A40E43E0 +27E0EB69D813A3C29C9C3614E6408532FA474CF9FC5AD498F8335DF4A04BAD633110405E +EE6A5E40D6BD7E23337B1B623735BC3130720DFD1FD1A86C4A90145EE483728278C48E5A +CCC333FBE140DDBE0A28168D6B2BDB902491E0340DC052C28FEBB140B85BF1FC4DC35582 +1752E935381556DFE0A1439A0BC810F9527331CA35508E3D0A451B3D285D37A25F1F949B +9C9ED1BEF8289E5AA1A3BA045CA7CB647F1C1A528D85938E04ACB1E7F08F5ED3D18C9E86 +7AB607E8BACF757C98BB71878979DE3862927977A0CE431174DF24872B21988D6AD35B07 +42C01ECC82FD805CBF22BA02CF596876EE1E135254A8BB6DAEEBB2BFF9911EFD7C3A25B8 +55B95EDAAB6F25A31BB29BDF2B0FC3E0F4479DD96BEF601E4DF77A459B73B69A9C55A87C +D63851038A7ABCC475BBA0365C4CEF17A742D1371131397AA139032620E16D89B3BB7A1F +7B018BDC6EC29A8FC02D6C6E943EC1B1A718DB6AC51BD7C5FDCBF2BF792CF9ADCE89D130 +DC5C200FE8625BB13A02F45E06A53B7D186838EEC83906E8298CF83CF5A28EBA36D67F56 +64EC006E350266F7D2C81ED295F572CAA52FCBCA9B605E421DF4E9393D1E775838992B7F +63BA394188312C75E64F9BF0217E6E31905945D27BACA0693E0660563A0BE2868E22A604 +C901BD00FD8E9088C4255B2583EEC2417AF39CBDB672845EF9BE24901D270059E7EF3C99 +0BDCED89538A8CCFA5A0BEBBEB671720576DD349566E591ED760FBFFEAD66148F05D37E2 +0833FDE02A4E85F2CE08B0E03DCEF68D454E135F8F07BF93724E0B7E0FE769A0AAC5B513 +F4A763347B10B50B88792E1CB3E6E948B75A8835DBCF188436153A2C2B44CB18D8996FEA +75324C8973D1F0E4A3942E2A05E43B3C4AA46EF7B54039542193CF76CAF775DFB15B31F0 +41AD173F8821FDDBD7275618B37F2693A29C9A990B7BDE96FC532242929F81B1B61025CA +717236C5D41ABD690EC853317D21B20C2CD6E9701202305CC34F5855934E03F1F58A0D32 +D73602B07ABB1904173E09D799769D7127B665537FD6FCBE10E725CF814B83475FB8E443 +027F490BB8488157A4208D031ED3992E2E0EE89C5E19AE11B16E95452F86B04C3E233A13 +02B300C9A21E2D920B49DB479AD034860B77C8C1279EF314FB4073B6077625270113848F +BFA4C6D1CC72D3DD8DAB5298D5A5BAF7E832FB36B13875D241286EB56495FA62909539F8 +9D043095F5B32E10F59B8204F0C598FCD78FBAE872D833662FE913E595E3A2073A41CB74 +5AF21AF5790DFC9D3CB011FEEC385B5DCED039630C8BEDF0790C235CF0174F3DF205DFC9 +A621B1A32351499845F888DCA445879AF5871EDD1572FB6B07B52A583A288434502D0333 +FF418B95580F4DE9B2F5BA2906F074AC91F566E5E394AA7695A161D01DEC146BFDE0448D +E6DD22D7A3C0BE7D02A29EBE15AD1F302299D673379CA3C2E500C573B8F81E0ADE5F59CB +BB8E0B5EDFFE4797C763D4FF7CE0117EE17E80CAC2A3EE7840C03867DC19B51885FC6ACB +FC0EC204489CD1A6ECACA8112FC1603C254E40049812D1BA5C561C1224BA56B97FD66DFF +C43D96FDD510AC6DF46A9C7AB22FDD5E9318C4A5F598E34A3E60989577333E2CF7AF6129 +FAEF2704C1C3B997691E484675D62AFCD81F86A6EF5FA4DAE7D4F690BDA5E35D0C3EAB49 +A377A2A0B6019DDDD8E293738FA7503120A91AE095F613B3F925BB4D433A67090AD6AA88 +37979DC1DBE9FD46CAB54F1D9AB5B9E20CEB07AA93346801BF8EE52977FE36EB1CC51587 +FE57ADAB168CF8A7B95665F65FEC3F3EA5920401402D8D22A3D4000DDCB5D06C5A901430 +865872360B37C1277EA4C31B32C16C9EDCC6162049204A9A028943915A7753F72452ABB9 +901712C494B0E175E27B99F6F34A232A826ABDA15D82D4FD0AD88BA50545A5D9A4E3A90F +51987EBFFF48CC52D8E7FBF1121DEDE46BCC71F7F3941EE02897013189FD60D9F41C2F3D +86A0C693DACAA72D68404118DBE5524D07B1D2EFFA1F54EF0D0205FDECE28BB1080F2112 +AD17E04A000C581BDBA02571C412DBC9BDF10FBFDE1CB328239362BB008ED70FE062B84C +E93030327374F47D62D4740DFD23B3F1FBAEEC619ED18446690E0339D2BCCDCFE3DA5D5A +215224657F8CB4587553B7344A4CCA78DF1D955679F3C308317D8EC48269D5E1A9917E0C +46BD6D7284BA185DEC43E31CE9B148CF708C722AB59CE7429617978F678E7B42B6DAFE8D +CA1690208AF9541B8EF5C8057A459A6D6BB3F0410DD1DAAE469A71B7A416CACE53E775AD +CA8787E88CEE3F57834B13D46A5DC1215DDFF7668A9CEC79FBBA1964F794F71D7BC2567B +10AAA3EFBC22781C66B3C89B7973748CC35978F844A5EE16CDD95BD4AF3C6C63C79577A1 +20B893398A583BDEFC646E917250AFE307E1FB053C3A8EFB26CD4F65D58DAE816549C502 +DCEFE24A4DDED6ABC44FDFBEA9A92B2F78F20710997E683F8D9BDB7C603A9204CD90E932 +7ADF5B551419354EF67AFF7225026D2703874F841A034FBCB33267D8794C1C1BB9B26F16 +04BBCEE30D6D2BA30AB3F8E03E0DB4D57190A570686C420FA4775B5F8D984C4C7505DF4D +309ED3BF16BB32B62241928BB3D978E10CEEC6AA72A00F786AC72F6ADC5E1BF1A234B6E2 +06FD0F6DB21BBB5D0D800BC43197CEBAE8AF770BBFAD4E41488AE5A8283EBD2E58BB4BC4 +5DBAE530D05418381BB610F5AD1AC375681618A7913CEFDB93815EAD3006729FD89DF4B2 +39E5DE1DCCB4BEC942EDBFCCC34C46704F5B31BEECC45558BD2E2DF554E6130112161BDA +86C779B47D9E79EE1A6C41A722F1C8710C5470F02B98B6A102A962E456827E7A8E9C2527 +5F9EF9B0D3420A3CF1F96B798CE32F47C076A1973AA532ED91B44B6627D5ECDB94E488CC +A0E54247BD99B1035769E7DCBC91BA655EBC0576E42738B7BAF5F7A19EFFFB78E0DD567B +51C9064ACCF00AA9D6AA5F8EE73AC3FDDC1F501DC67D9257629C767B9AE582A1BBEE8C0C +1B4BA4D5830FDC6C3A3D164EC1B30B8EA721ECDE61AECAF5DEDE7CE02F336A22E302D711 +AC6B83152A1B41C67A5D3EF767153F5FB882D0448B39B8507ECEEA86CE74EAACC8AC3E78 +E20FB23FD92C81D2EBD9014530F0AEED1595039D94AD48CCA8BE1C77233A9AC19CAF5A45 +CE5E96C5B2A962E8DC39339A2B10975C18C5B6162226221AD8BB4307F64E2B2C4F01FDF3 +1A6DC4966C9D6D2E3D5E92F0D21DF7779E35404C97B632DFF66716FBF8993294CA6B09BA +8F7F840DAC99DF3D75413A0F417416C7FEC264D6CC58355B1290692666A47E47F0BA3CFF +5DBC8EE2F4FA068D8059C1CF153C65BAEEC4F8196600B9D5C09DA14C8D5F87D88FC7DFEF +B797D33E292D4A6201AC0DFA4B50285805501F3AF1E2A48C3493FE2DB06589B0C045B0BE +5A2C5601F2F4644E6FBA9263BAEC6008760AD7833187540BDE0DA3EC762393EA778DF052 +BB978B708C7A2DAC5D62B2B4BC6EDA8DE77E548366C34411463BF5DACFAB701D0F64E937 +F5188E46151F8D47932243856F3727904404BD99EFC5F0AC5DD895CFD4067B7F338E2DF2 +BA69A84D26FCA6DA0ADF101669B9B502DA75D202F863D2AB8F821937F180352211F24835 +707B5D821DD71A74E4B9562370F2C61A228FA42F12983E32C15B13AF9F2D59CFE9FFE1D2 +4412F40E1BC6D90E8D943DFB8D5A36EFBDC7836025D6193A8B7AFDBA1EC3455F2EC95A6C +BCADD64C7D41322C98479EFF511BD4BD70C06EAED0DEFFA2790649282EDCC5F3ECFBB70E +7D62E1184DF3A46B154DD1AED7BA74CA7841DE08B4DB92DCF4F1C2EA54738F2BBD8A7B70 +0EC21D05AC8650A7F1802EF604A9DE97E8BCA273D26D97972ED752E3E9CA7D3FC11AF401 +D01398DEF5206AA94D0A79DE65F02C3E9A02C2DEAA900017DB7C0AD39F93BC2EB27F2E64 +3BF0FA8AE458C73B62B7709AB58D8AF25511B5C3FFDC5F45C4DF09400AB5E69054AB6BAE +57D427BFC6A6A65DCAC262E99797304D660B672E72BF8BEC5FCFD074A5D1E949634D1DDD +3399A80D693E3494DE56E1D0CCDD217FC6C6A2F4D6ECB7E3636E438ACD4E6B7166B27342 +2298824C5C547423EEBAA5FAFF2FF810A73C2BCC057F7FA1E96F21D665D377F727CA2FB8 +93307ADB216DB69824B72312242DE1105C4D7B048476E64C71F4C4659F084916660CD035 +85B922CB2EB7FE0E940A7A122313A85E0AAAA7A2699B4D1227D8A2F8F59B8FA5F6CFB63B +7ED2F9AAEFB6A71D186815A0CE5816A787E25288A9CCBCFA886423F776DE6C09B17858FF +CDBB8A52CD54BDDA98CE2BBE25849A2B4B113B6B7044431419512A00CBC8E5703E5A4A1F +954BABB0CA465884524BD70CE67D6FC9E2BD7E0615DF712866788A17AF26D842CEDC9EEB +B0A3061963958B9140BE41E74B7893265FAA57FE53140658DC931F0B897D0E857AE3A337 +F04D884ABE8D8E1DF1632DCFC2BB65E4BB2791B215957D5EDAD04A4D1F4372414D26CD68 +3CD89B893EF0CA895C2D36FF87A1CFB2E9F1A628CD59432046022B3E44BF2B5D5DE76F51 +5165FC2EBB07FBB23F262C07066D215DC73EDF780FFBC54502E57C69DDFC77D9896D3824 +D4749482FDBDEB40058FBF293BBEDC8C7AAFACCBEB160334D29AA7F61F34B929F020F8FF +17CE610B0E0D1823DF605B2E145C9E78AF8396E4AFB267C7679ACB0B7BCA258F7AEFBDA5 +E49F3C3A17F0290F9DC6C5F51F193E2DB779CF8081C733BA0D7FFBB9EA3A2FE3ABFB4782 +B2510CA124ADFE0BFBA82C46A0BFC430C2CFBFE41DC3DFC070FA9DB38F0D33982127C8CF +74AF1001B096849C8A518B6CA05445858EF78DE8B3B6F3019CEC8E10775EF9842DCB56AF +982AB270C89644AA55B486BCD8616B440105FA6C34298422C994EF6C30C1574ADEBC0F43 +85029231FF5FA84AAEFAD31442120059A7A1D24BB44D14844A039F366ABCA742A6279402 +7B53DD4431B167F07AC0EFC75ED8545431371D5FEEF2E51649D1AC862FD5E8C18ED86FC9 +9639B861D2B502A2B5F75062891ACAD88D39729CE2CB515DF3C49413A974476A515E3F15 +E071A6A82D5A51036FABDCFF62659D0B54DC1B9E68945E87A4CFC0E4D285D23BD9583126 +4D2B4E4515A7B34F83A077F848306AD71CDB2B5E6F701DF84AC82CE1096B987E2DA09727 +CBD0DACE976AB94EE6B133C09B787C80F275DA36605CF5955FC706A332E3140B43AF9C02 +9C23C489C5C15F77F076C6A21DF7B91E9249E93854406CDCF2EAA68DEA68BABDF5AFB702 +CD9457BC4FDEC0251834A5FE1EBC40D1C8F21C3C56B2558E1EBA3AFD3E0B53AC7793E078 +73F8A219C6057DBF6BC066367D953F44EBCE2704D2258344AD65CA865CAC50085E5E321F +B66E4404028E313876B65E5CCE58DDECD17DE76874030B63B267639147EBDA692745AE09 +775C4CC4C0B44469A01BA55B87913D834952541CC527D6D24238A5CAA83CDEAC1D7B5449 +7B6F9F57E0AEBCC7EE2DF0CECCFFC7FDB46DE41FA6E6D41AEC58E9A2CF359F9762ADC653 +5C52FE93E9FFE3225887009B596AC2B29336E0EEFF29738D4181D339F0FBEF72D29C750D +FE1318CA42C5393D639E7650AB689225BCE2072C88526B9AF5B970CAAB8331D89B888345 +BC5E839314B671E70CD895F56D945E8584A7A956EF105BCEC436117D4BDB3791A741B7BB +5B2F0033241EC02B40B75BBAA4C99D5F48FB370569C6E42B8747476E405B9D683D2FAADC +7C4A02FCB91C654F47C80AFFEE61D2310619E72C36695090BBBBFB5E0B7169B96BDBC9EC +4E8AD00B36B4FBB0B849CC04675277733D2FEF6A6EE9C83BE4900D02B95B516DD10A53FF +4431B3BE8C68AE823BA121DBC6C22470BEAE5AF5441CA8208D3DBBC3C444704E7644F8C6 +11B0890325648B2EC17FBAE41012E7D49566E5016D94336D4C701DE2805AA001E79C9032 +C64838049D8D065A171C11F06BE58A478B9299B3A517C73CE84EF38D07F291EDE3535CB8 +D769308C2252C63839CCAC3BC9E8A24E871D90398F3187E3557E40A24FB1C61FCA55BB70 +5EC3B1ADE33F0C6340338B197654B373EF588D43E710869321FCCE8A00596981C49B185C +DA92F64E0A65CD32D9448491EEEF78E4F410806EF4D6DC5F7804E99B87E640CFC46B6975 +AD18A05C470D233D23A20B4F85E8E008301D9763C4CB53A6CB6F380A439DDF64E4F69367 +446A0B57A0E98A6ADD0CF0CAEEC82BDEA2D130AA246EA0E4FA2E8DBB4459D5FFDFD7798F +842CA8BC7458DDAE4C28FF65568617C25E0CE82CE644B3F6445C7408E257FA1791199F5E +711023E5BC7E5AB961E867B06B83418954EF9A59EAC6566D572B4E97B5C6750A49636929 +562C6E0E2737F5B9BC06EBEF9FE62D9CF4FA509A42D192482B878757B319F886FA9EEF7A +563DE61A0BABBD76B9A9FC2009A9049FC6662C32434B6C8F4E410C2F5A146EB951D25138 +47D03A64A453B748A14D2A2FC9AE56A9585F1E6725ECFAAB26E99418F8F2F944AFFF32D8 +AFED5E292F40728B8804D91737AA9CDC05485F9F7031841B12F431355EA522C674101B83 +09CF71D8D27477286DC05428F7E8443EC7E4471CF97ABB18753524A79A1B331CAB1E3FE3 +6D19BFE3724777670FA07CAA0A501E1B5524E62C15D0B888414300EAB0DEA137D43A0B70 +FB6563163E0AE68D160B96B4A71817DCBD24BDD8FAD76ED2ACF5E0CE1DBB5AD9A1AD4B98 +997987FBB15346F93053314D53CF4BA6A9FC6B3EEC4E5DE20393D00A6D69FD55B98E3045 +C27469B46C39C40B0F5BF53DC1142AF67212F469FE7F7334A39CF19443C1243FAF6B05AD +1FDC50457F06D14F119EC724269EAC946793DA2CFF0C1AE736320C5F01B51F2780277D4F +A77680C81BCB7FA34A8F4F63F07CC619DB4BA4AE94420E532E6D06558D8B0D9299DF88E5 +479F1C82178C7FDB90830CEAB719A0EC4DA5E66DE2D4B97F11113E0DDA557353222E6329 +8F21D925AEE6FAF6121AD7F2E7F805F88901E53E353152729A737C197937EF857257BC70 +0890EABC66A8DDD6F4636DF744612B2E744BCA5D376D2CE87993132742B66FEA1AA5A4D1 +0A5DB79DC3EC04D88B5B5CCC988AD647B7719AFF1F2FDC55B7DD113655F19E6D47D2CFD7 +B2BDF4FD564A6798D3696B5BAD5F7A3E8609B9D9D0DDC4F32F2798052ECF1EF3793B16C1 +F489004AB008CA729064EA7193D2AAFFA934AC2DE6CB00FFC86A54B11426A97A5E161899 +4DD7FD85144308CC4C376272E86849BDB4351A9CB9BAC62C53FF3D06580CD2CAC229FDAC +CF8BABD15E1D7D81A2388597FCF2508AF5F8D189B5E5A86441E73002DCE94CF0DD953575 +470ED6D6AD57F62FAB4EEA0EE65C5C2FFB9FCFD5F850DEF261314A155A18AAD1B47EAB24 +FB7C0408B1C3DC80C6FF2D6CAA3348BF792803DDBD9258C694FA9A4FEB1D3BE1E22562D9 +46D3BF713B8ECC1532BACC2ACA978761621A122252F5CF0A658C06EFFD96B39B7EAA7C0C +E691FFE170A91871B6DED3BAB734E733ADC503B5AF97D595247FA80B81AF8ED77F99B192 +0731917779642446DA30FC7DD5A5661F9268302D2B812D750A3F144C89038A6F573B0C62 +EC227C3C5970D8EA34781CF49E56E1ADF0743CE23940279CCDD27AFB7BB7B740F579D9FA +B7BF912D52F35DFAA22B7D182C022E2FAB7BD0D90F7B6A03D0D6EBA225C70E07CC00F2A4 +599DC63A9218C17AB08927C0AFE57C6D3F0E7E2240A8E0C3CC6CD9854BE51B7F69040BB4 +ADEF206D2110DD52D5746D0085D583E67DF440125C26EB27BB8EC054A2AFEAAAB3139B53 +653E4C82D085D35BE137B6E30FA4C81EB3F968B12B2F4DB0AC653BB3E13BCBD9994C47DD +99727A7BB5908BFAACCA7EDEC566AB58DEE6B4CA521699CB6C3C7460440A522145347A0B +9B572D96702B497B8F9C3EE612B3445781F3FA7AAC78DA64950EFAF975623382BB6FF724 +3B1078C354E6F4CFE12BB8F374100D8E9033460B5911D4A18BAEE611272EB961EDABF97F +F350744757DA2435292D03C54CBA103EB72626EC2680077B5DA99E248BC7581F791F157D +0F0A359070827288F6961A8B42F98C948AAEE02CA29166EBED6F41CC2B14274CC8CBE8BE +70EACDEF5DED806EBEF4FDB794A1A9EF45E6BB01183CC4058DD5D6BF33CB6A195DC97AAB +72DAAA73A8922281DAEFEE6EFBE9E66F1B4C6D5A72830D9CBDAF7CC287ABB0753DBA936A +B515518C6C121E52BD84359EC983A7DEC5E395DBECDD837788A01387CA0CA84F6984A9DA +4D93CB543AA1101AF32021F2D2530300C6A16C7B27FC6D98E8E192AD089E9D10F10243A0 +1403222518D2B80A79360F81472FBAAFF0348BD16D8AD6888CF4971C2B61A8DA0A469009 +45F508DF6DE8F7A061EE437A227887D1C24BF05EA03A0B79CED06821B6A53F8275C885E9 +F5891E8DFFE67F22BDFE05507F478C90D8A90424097FA970E2B5C88820520C79AD9B539A +A10EF6701499CB72F33021E5066D86EF1B2AEE8165CAC5A97E3C20E24229C072A41B515D +3B1AD941352CA33927D63A7B0065AA432994EF31520C80F4FA3E68CA9CA548AAD31A64E8 +D383F59BFEBC0288E76332EDF7DCEDBABB3E068DF02D19FD7D0FDAD1BE7EF4947524554E +EA87550C141BF3EA6A20FF4834D2044AC7733FFCBF34EE678ACA19A3A8FE3D943C2B3505 +242111C2B6307A00989A20E8CB7E4267AECDC4E6F5F9CD70568C5AA8A4E899E404C7CEED +9989C788AFE029340B6A3D6376476181D19844598ED5CCF1AD2CF4A676FBFD17C0EF5BE4 +66CBA814647C2E0B5A2D85F3D3C8C16242848ACC70063D67918F800424305F2140A76BE5 +AC8A5CE0E32E26618F308EA578CDCB1CFED7CD12AFEABC6F6A236BE927BD11AD0A961943 +56C174C7881373770078D3D9BDF23CB838C5D64F923EC5831B791D5604931A8834AA6D95 +A79FC44C7DFC090CBBCB177A42A22E6897CE9376D17FE945E1E813AA473CC1530A7A834D +0EC298E73517624640BB35203A089D9483D047A87CA2646DBD18EB02BB9F0EE711FA83BB +BE07B54F1B7AFF9F36575BA99F81F75326F59D9EE26D4E4F642004285B6BAF192396F4C7 +731C5504593DF687B274EF80F27105F4569AF2EF4C5C5E88D476A73EC4444ABAD8E9AB3F +950C9CF21BD78ACE310C328F988CF22A7EC165E724DDA3F25D403B28A1B61F668C013524 +32458C657E8FA6CBD2E6E91106AF5B9C8EE170FD1FB323404E4101CC134FE8F0887AEEF2 +3013CCFDFFDCFD5FF60897B720A00204E8544F51735C976EC497BDDC085BD209F756C77E +296716650CC169558746490D024BD14FA54EB4E0CB75E8E91FA2E256F3DB4844308C7998 +A0EFE04FC6B14B73A43AE16D586C6683520A82286BA58D24ECEC212CDD93D2810EB4856B +13D432AA6CDF05600A12C7FEAF7B990E9E8CBB8AAE023FCBDF953180AF6913D0DE5B8660 +E23AC2B170320467ADC89CD584E9A366F063ACDFD5FD44E5BAB3B7167254ECFB222AB3FF +2187E43CBA6FB705317EE5DAA8D9F5DB83957CD64508A61EDA6B5D5BDEEFB2C6214DD059 +8AF10A03A486022A8DB111374E8442CA13D467BE84BB1001E7B9DBCAF50F767330FD3F62 +A310CDF232600D7DFAD998A0EA10EFFC49A702347E6C23BE9027C2BDE2E9A14CD55788CB +0C8B4891930AE2BB346CAC0A2CA7C904D2343316A6F4202E22D4E448049B18EBE76FE3D9 +7EC95EC99264B6F938108A36CDC5C4D7DB364F89E9371EABC18B1CE08CE519BB2C4973DC +4C0ECA366D8C6CC07A2DD320B997D5987297B330703D2A2DFE33EFAE86200B750D1A2D2F +762E43A94523A2136492B440F6551374F3591FCE4D37F7C192C592133B3315D3435A9DF0 +F2F3F621ADCDF53F9CEB8E7B332E701AFFF13641C88DF71858352BA45506D267877FDD8E +BEE4E80EBF692631C7C7133012E4CA6082B90533BE3082C34084385CD16C7A4B7123EDFB +66EE5F20C2C66226542B98B437C6925E7CB65C02F4C659DAB78FC4ED155C312DBCD5BC7A +F588D049D52655E57D3964D3BB713C6F7B33296292BB6273D626EFDB0CC6E0D346F8383F +315C275FC9FE745C9CC2416F3E1B896CE9D4621E0B1798959434E380E5672C9301474FE5 +C50B8344DC9BAD4ED7A57F965ECB1F9DBE601D2967701D4C083529B6DE730D9940D03381 +EFCD0F2E5632CD6948F1C7D3B624A248786D69E581B916263DF67B7AD6C34F034B3F48E4 +D26F64BBAD4B57E5E3E4B11BBE3EADF529E0473547DFA0781ABACA0F03AEAE3C14884A2B +47AEFD5174D2A5F45530A8C9A0B7C66DCA9CCB84AD031574B6D3FC3E6F1B0D794D061CC3 +3FBF13B5CFC934C0561396DC77DC2AA6FE3AB54B6215EE21A65582A8A9585AFA2CAF8194 +B3B887EA4C7F71696F93642371258BDD862C0CF23B819B194777DA8503A584CB26B849F9 +5CF461F3321BBCCBCA5DFCB054837FB3C288ACC2F394158F2263A8D4956ED155081F1A93 +B5180BFB3B694BFFD214C63D1CC0AC82521BA89EFE47A573D8FADF7C7B31CC98ACB47E9A +517CD04C18F8A8116592704192274FA9D817D49AFF1BF2EDA8273B04A86E308F51336DA5 +FC70705D6142F000986593A7BBD524A4A03F5A1831E7434B0700B89EC3D45BFC3CBE0841 +06E053FB46BED0AE359A76CFB808CCB22DE78B1A88415AC79249BA9F9BC5BE2C3041DAE1 +9F6B46545F534821E0BF703A6AC49F4DF2D24A4A90AED84C71F87799BCC37ED9FEADEF35 +97ABB6D731757C04C00002C40F34DA0F35E39F6330A1651F89C321627DF1D1289C1C6782 +35D205CDBDE6BE95F64A2510AD7CE06D51BFB98E7AEAAAD4E2AC15E631BF136E4082B01E +409BD78C495C88D3B62E3112B7B72268C4B1BF55E4FF2EB726ACD3A99148B0D0DC516294 +1E9B8C97C861AD1551703D9B1B17D1613F8BA6917B319BC2910728C5B46EF2CF9E1A06E3 +645C52A5D4F72494C1C18F858D211D2EE721FE457969D9A9BAECB4A0058780025142153E +9B94CF1B20B717D5F9AC5BA9271B4CD61628402FC3883ED1D43BB2EE931614D871E7814E +5ECC895E6CD9BB8A27F55004E7BB3E4A09B1D9C5D6B49140BA231B867F68F3A3C9981BF3 +9D9BCDDDB6330C8329FD52B1F1B6A7E392AD3EAA4D8E63BF3A895365FFAF54F297126CA6 +3FC07DB3763E7D2B79D2974BD0A380AAB25DB48F06BED0CD275640E5759C966A22E2437C +11E92131BDDA040BAEDA876D8861FC551F32591621A14BE6EEA790B77752FA636B8A627F +51428CD373F2ECC19DC714100A200E098E262FCDDCA6328A18B060219FF495AD46AB95DB +2E33D5A697E5D25CB5F0FCF988D62C9AC53E415735BF0DFFDEE23ECA22528B3D66DFF37C +77EDA16945BC694775901CFA106809ED3B59312B4A1023AB13738FF47921A0601D0A56A7 +4FB9F6B73F1564EFA5F2A31DB04365A577A1D9DF9FFFE6A4692E2ABF7DA3876BA90B7FB3 +168962EB38E03DC5E06E1633947848968BD649CE9B3064CDD5F88477195EDD4018F60FB3 +D2BA8190C9B2165FB5DB5AD79240CFBA8D4B2DC061F5392759EA162CE0FBDAB3D8EC991D +3238D835F27F6440F50942305538B3EB8B4C9CB46ADC7A0DEF82807C277B9CDAEB65B874 +1E3CCA532A619367426CAAFADE5756F0C22E6FBA7CA826E663ED6716308482C957703BA0 +FD4322B105202352E9091B44793A849E17B9D4931D7E4FFBAAFF32D1705FF5D82A878139 +0B5CBB1E5E00A02E80C299CC3C9612FFC9AE200C4F4B919E958039D4628480A7A0279EAA +DD0D28BD5E1D07BC18D66FA86EC9843665066045DC5DEE15146D9B4CEC6B0CA6EC946967 +3A464C46BCFF5451383B65B62D348907887BDD77931996B56645F118E9392215662998D8 +51AE73BC084FF9931D22E5012F6D18ABF618DFB01CFCBFE1A2C53B61B84D3B85A5D04196 +FC8A0E507A87560ECB8E2DB3CA84A2C97AFEE1005F6A44E00E3924527B1FCB8A3954C746 +D6F0E4266940814355AB8B57D3AB85A89EFFD1E384FD8E832E6A846D6B8DAF0C99C3803C +F9BC1CC4A1B611DB8B3B3F1763F6BB877952ADE48CD9BEDEF049137CC2F0D859CB4EB075 +2A1E581D835921533C868480469430E3AE90B9C965B4130B20E22A060A182827628CFA56 +FBED3BE7A4C078E939BD9F79D1A51017DB08B27472B813B5D94CE9CEDCEF61AD4AC1DFA2 +37261EB3360CAA70EB0AEBB1777928B2199791EB0F4E0DA70F0A59DDB0B7FBD49AEF255C +BF51C0F35AE0A242100AB96E0A2B51F82D5413FA7AA2C603F913066AB8AC55FD474829EE +82E5DBC360130AF5FAE5EE9159B5E09ECE9678DE75A50F49EA5C24FEA536658D48417F7B +5DC4737FAF73D41EA93B3889B9FE272D79788E337120691A76D0820E24F5657DF5CF2BA4 +BCE1799E533A991BC20CC52CEF9142186FBFB77E214A4311A243CFB5AD566995DE9CF7C4 +06D4235FA3ADE98D6C6CF3DAA3AF13106D38C4FBA7DD764FA38225DC7C41BEA8E87F6013 +8D320F004E832F52EE5D716F21C47ED0BE801523BB94D9691B393704380A58722C70E0CB +F70EAAF9B5CABA0D298A0152E246CF19A63DDFCE9D45E691EBD404B4EF6F14B3AB70329C +286C3CF24CED4D7591E4FC548ECB3B7864677028CD1073C949F6E334E528D62EB1EF23CD +E94DBB71E289FD419A9D51579BEE2F1E66C0EDBD29A32859F1E5CAB29264EC3D6AD03E0B +7BCA83FE20945CA48A4BF76C1F89B747DDD06BD000373561D123AB04AF26D1A785AB792A +95ECEA3DC6F5E36A143204A17492A6C3C9F974D73919F4830BC2ADF839B83753C3C58011 +BA6975CEE5655357AA6981C18EAB50DD25E4956D2912BDC0B401BF8E3E719D34D4543E00 +6570D7F59EE1E6E683B53B0DB9A8DD3C188FBF57C719C8E1A35EB957151D5CA1208DC55F +F81AE455B267013FE1515015206F1DA5E7F9F56C1F0A2FE55C1724CDE3E00C9FD055F198 +ED0E75DABCBCA26D558C90BEBAEF6F67D9DBE1758FA9C67FD49528CFA39AA21A4CB6D797 +C5E81AAAEADA6E7EC773F9C5ED0D2B0E722BBC8D449F5692E6FD2E90EB3673648EC34907 +8D99E469FEC7D6F63606E607BF946C78C1347CE1CF45DF42036AF0DEBA6AB19ECF358DD8 +C691742D3A0FB495C0947C3528B0AF579C16598750E475F169C1A36E8DCB33D2151CBE14 +52496F4F9414BC8EFFEB38D22714D2388B56035A4D431EF4D07D126CA898324F2BE44E42 +BDD930AD74363F011B2EA953CA48A7065C5E21B0B0E9C87FEDCFCA17AB6DEE77B167F31F +6E157B289EDC38F47D836250303B7A6662825E184A464B3B6BAF6A31627EEC2E932E617B +16806DAF25E7A6CEB17E89C602FBB0191592BDC0244293F46E0E698281FA9B697EA945FD +9063410A495A75AF971B7F50331D3FE964B3B2E7C6EA890198D4AB7D515F58936D7104AB +67013017B699EB3F3DF5F49744076536B951160156CB7F9D64B035C6BF0C3119ABACE506 +F15605840976E567A1ABA8B94B3B956A2982806AA50413B5F89514E0B065A6710FCF6173 +5C91FA417686324F69A98BD4EF2B0EB1A3CE20DEBAF35E592CFC68CB3F1640B91D20D415 +08DFC28FC3AD0143A8EB9BCDCD2D2BB45844D387845FEC9A6C9E26F495573F7435B6C62E +93DAC158FFDB41A137F5DAF1F8FA134C26A1A40BCB646E26A513C76A6EB07B559522863A +6373062B7C033FB23364CD9540C146CC7D0C1F33A137E5BE097F7FDE6281EB9B9C2F8203 +6DC40494242533C561CF736393C54CA3306FB4974FD76685D26BFA885CAF41AEE3B4230F +DF98BA4EC7646D3F25A8A337C557E4AD260C6246EECDBCF0BED340BFAE2A0BE007640D51 +A583D0747A5F354406DF9D3544CEE1A8E45E0C3ED5B5727171DE29E75ED1E06E4B878C08 +1EA5AF1FBC2CEEF821380656867929E482C13FE6D3FCECA67CC16450E0BDDC5996D7B281 +7E15F29F94780F3E4561A3F0D53DCAD7295D68013E2A12F73E2887F500C5C40497802B5C +69FE8CA2F4EBEC94CEF708EB00D4E44C73741A432687036ADDD9021FC35ED215E742BA4C +D8093F29B90132352A60AA49F1A6351C80D63BFCDD2C4E136F18D605FC406EEBD81FF609 +F396669F082D83B9E1C9573A21C8BFF715FA8401CD7B5DF1BB56C709A32AA27DA08F2BFC +4CC9D74491D7452C51C19D585407E97414FF616B8EB4FDB31672B93EF09B1478907D3B22 +8AFC23A38B48E0B1AEED91089548C135CF3BE546F737BBDAF3A3DB727B8AEED13A2CE344 +56ECCE70D653AEBF7B71EAC15074263FB58C10985830EAEE832E65609A6651374DFFB88A +CFD2FA6BB43ACAE247BBD826E54B6F6AB6DDFF4A51F5DCA90062BD3E033AC713FB95862B +540B9EF93991984FB86936A0841FD6491989B55980D917A53663A63952B9CCB826ADAB9B +DC71EAE0BD3B580E767F7CDAD1E0EE09C9A5F015610FF572B4778D19260E5C5154AEB615 +F494F6905F04B1420E9C4531A7F6A8840E79A83AA20DC7BC86C9F51B0D10F6F0DA001852 +FDFFB7E60D675CEEAD92F73756A91D67A760145DC0EF8565833F84C50D0E17A3A1F33676 +E467012444D09186160B317F0D6063194E46E5A484CEF017C919D3E063AE2E79171D937B +1536CA40EC4E4C71FB24CC038B20CE25504189986C5195E7C89D71DA60F40C8E34BD62EE +44018745746F174D3E30E8F2AC3CB4165474B456A8E4BD62244C4698B6C18630122561F4 +6A5776B7961FE532C7DCCED058CDF95197466C2D6B5ADCC3A2BB6487B5DFFF6E95612798 +18FB8D213AF93B346458431C42C697F3E98EF51A234B8D717718B7EC360F181BCCA72A74 +C99FC0BE536FBC7F71B32AC4F85035EAC720C49C03CAC855FA49D1BEEF2799B86D21F3DE +5F3BA47568811A2909D19CB06A3B62A285744DDAD31745AC58AB7D9BBFDAFF5E86EF4806 +5BA5BA3E78F6B85DED5261177F0B7D20B03ED496B3957A34A4ED1D493FF084653D014BE4 +1DEA598AD3EE6907A53828B49DF06C3BF1CEF5AB6946BF2E56D646077AFA325482FF16F7 +93656A895E24CB4263E382CDE6D67C5506FA7E0BD0B20BDFE0766803BC9DF615E456FCA4 +8BC2E2AD6E4348414F748F031E23854AE6FC92650A55DE479AFAD409836481881C04729F +DC49DF2D9FC46D2BFB3B68DA59CED1280D0A97C7BFFFEBFC72E9BBED16C24B734343C111 +4A999791D052352ED194974774876A84B7B9339B85E6566B1C721A535A378AF89D834374 +78DAA191261D4C83E12F372EB245CBB39AF956E9A28289BDA6399BD2390618BCF9AC4EDD +18CAA6EA6AF116C9560FA860C615467195720014657D4767D70F6817979FEED7A181CCAB +AF11554132B382423713EA8F05092EB14DFF6F06E1A813BBC84091E76038D6E3DA10DCFF +81E750DAAA2BF7BB75C4B1A3347DC8436E47D1B9780DA48842492B86E7D9DD848E1E8F62 +4BA0B054DBBE5328F208952E19707BDC6012F04A475D47D8C7EB6A64C2AFAE3A363CAD97 +936DF3D6347D8CF1862818495A6836AE1343272EB8F34BB4C3F9B0A631E922C920446DA8 +34E9C2F3551BF71677176A1F414188645F43BAD39FBC3453265C05EAF83C3F8B85CB80B4 +B3B5AC99B901E6E2C9A1C065848A814033FA6D5551954D4B36BE89E01C1CD16949005298 +CDA21D4BA36577A9784DAA57DFDFD0621EAEE192200CD5932A18442B6E925280A7B52D2E +8C7116DC0CAE26B92A9A81B5B6B62836E3857CD38F2F5AB075E642760C0B442725756915 +413B2636001AC3D87FBFABC43D6EDD8D111B01942EB7FA47D71AA4520026FB22834DF914 +791FDB207DF0897D89A0057B2BA1DBDDDDE182DD14C85EF10D35F6ED8CD2398171EE25C7 +9C54D90C059A566A0936B8716CA905803FBD950BC4595D9F4CB59C37574AAE4055D5B472 +DE1E6DD3A7C58CED64FFE344AF8B8698F8F1D2FBFEAAEA7F136EA0044472CDE262C7FC8A +0416A868086A5A9A2669B7C6B97482C570FB3192255D5DA008C9E13D1F5A4A3EDB7A5C35 +F71797DAC5B5F32A5C03C429198D56BC5B8BBFBF890C6A29A4DF397B2863B75FFD8DA751 +95F747DFC65379BA575CFE55A02C589CC8E62B8A8623FCC135E90ABD9900782B42378CA2 +C55BFCEED08EBCACB61C53C5678787DC29D2455EC3A379C1ECA2707DD3E8C008E26C42E6 +C48C8E3B9E0F667C541B963313F4FEF02BD67EFEFC63A1A0093A95F15FD139398A4CAC17 +83471AC10E3598688E1A6E261AE763A28C58E8A5B9CE4DD7B8971764340B9862AF36C89D +F6708F535653BA9CE2711624A646B1D1BE8AB250275A1718841830BFABA2A900AD276D4D +592A5D7164C6A7B00A62B08C7F27ACBC78C91E91298AA4B56D090B0A8546549B2BD2E3BB +6FB39B6CDC7EBFB5798FC9589DD707C01842E40FFD597F2BB1B3EE4408F9D38600804C82 +2ABEEDAD6AA6EA75BAEF32E3C33CDA01847303D9C142140FA1B6E71E2BD3C78F5ABEC001 +66B2D689A8C4B0A7A1C32F3AB9DE8CEB7D20B59524656606DB340F4B7727FB35D2176112 +F91C3AABAC27DE231F74AEE1F6CDB49E2844F40F5F01FC9E96465FAD1D10E1A921D81F9B +3F13CF82DC97DEE3462F58797B21E6DE4279A153669FE49D78CFEA9835D5A85ADE360B6B +4EBA9BB8E9FF8AFD2287EE69877FC6C5593A69114EB174AD40F150282B1939D8A3BCFDF9 +74A8864679AFA7619D7EF1F347AD39E2899DDA9EA99E112D15E809E899A2294CC42F4EC1 +251631ED566907E1947F95ED61DD306F67BE79407AF36F34DAECABF7057555BDBE1DF645 +433F5DC42894C3CCF54D21C17B64FBDDB881A2C27765017B51BFA8147BF24157E7CE1314 +79D5C001348767CF1E82A9A43BECDF2F173A42292C8145FDB705CCEFD9ED6CC945A4CB6F +6DAF4DDECB1DEBB0ABD084011D033F0A06F66D9E2C40DACDC790BD663A2436F50B3A91BB +27B40F6B05B4D84169CA16CA7C7E609957A918BD60284C78DA035DC6215AA76115F0FAF5 +4C90315EB8A8F3FF25734F79300F0E676D06836B5FD19BED6CC7DF74548575820A735D25 +89F676D0129D8A44EB47AC1B673657EFDCE874541E2179437B9393978525FBB93A1CDB32 +1D1E47B3B6FDE0924CAD789284CE6F18837E89CD0E1739CEDA90AF44ADA49DB336934144 +D8BED19D5090A3E79B6A96E303A45E0DF44E795A08E1B5612BD05BE52E0508D60E5979ED +B9BB44EB5851737FD5660B71661FC76DB3F9347FD7CFDD2E9C23AC26F805AD8E70A52F73 +B11DE295E3285A08BBEDFBD62C67A540400A01D6FD969896C8D5C46C7093646E530824E2 +C9DFF21E870EEF04CABCB2F62EAC60C1B62CE5403A1B5620DF7A3065B44C7D28366AC821 +86E49974DBA9CAD1249E3EDD876981C595BAC7D05F18D6430F31B96879DFE16021590211 +9F228B03E1378D8E9F7080D517F8C668CC27A9A60F74134827F37CC38C65E577D1DCEEDF +2A207906E90A51A72AC31C4431BBB18242DE354DCAF50978E619E8A06CA801937B522396 +AD588A1FDEB567116CDFF51876FA3640027CE40CBE18D9423F05EDA77E876433F496FF70 +0D89FD7B47B848C5336C80A5EC644FEDB3F4A9EA02AA43A6EEFCDD27762051D2DE2DA02F +A03CD491478948B3039FD532751EA70F56C254893A034971CA7F65BFF5662D4A61AF91BF +752BAB772A556644F711EEF61958DA954494C50941CE83C6B7B6B2859AE7E9754FABA903 +35437EFE4C7B2B36B99251E0C8122A16E4F9C883DC4CD72B5E2A854622B73E6E3C4DA098 +1B208CBCEF104F5777F2BAF65746B7EC51F3C51AD38A12089E4971BAED178A9302F20DC4 +88CEDEB2CD8BF9607912EBF7B0BFC3F226228C96C0C128C498FA351081022E47F62EFB15 +23545AA028A8CE0F56C85BE3186D6811E4B86B31EE3234C595D34164B27D40295D2C2DC8 +1BED866C6A0405C4742CDF5A2563524C93AB0D350CD8B3DF7D219379F302A3A1C12E0954 +09698ACDAC5A2A89B7F54C846A0378E44E923CFFDE69B53F62FC661571E22880B065261C +B0929D4E234503B81FCD8771685310EF5CFCB2210073EE65770F445B93EACC6DE6556C80 +59794A7499C2402066996593653192CE60E4907FED614060F4A9F68F0B949C33A7D5672C +60317CC5AD98FF3301C2176E6CEAB2EF6ACEF60B6FB96F553CD8CCB05C2B1EED6044CB83 +40DF43DB21B567EF0A5657704E4DE711FC3EA7933BAEE7744234A369326D1B0BDE34A8C7 +2E328F30FE150DFD111D75122F29CED31C666793100CC8B69A17CFE330BCA55848B86397 +F9DD4950D6DF2B4486E26AA8FFB58445EBB14BBCCA683F3DCF2AC64025ECA14151D278C2 +977A9E046EAA361E658451DF157386033AD47B48C674EBCCDB79B8032A7D8FC01C8AD15F +E1B9A410C5D4B51E20AC8E8DDAC4BF6020A2751114FB024A96B95E3053F38A3E9444CF7C +C666B514EFDCCC3E167CA0B5F8095EB8D4060937718F6D8705A15B3E515201D9CB804467 +25B98EA469785969D46E24F05EA3AFDB074901774745286056761846B80553F0D3460CF8 +29C7794E4A360D3C731448086638214DC101591F4531543E9DB6BBEB1B91DF1FB3D1C4EF +B13058C4B339935CFB4660CDB385C473BF7ABA5B5BC69083FEA6A17C6D04B23E9437C8ED +14C680DFC74453C4FF2A6BEED2BB7DE8B346EA2DEAE4435DF08305BCE245ED67E41DBBF2 +96E3E10562A55D667D3F9CD286FDC42624B4BAF764E3C3378C8135A99F314C1CAC47B3B2 +E1FB39499594B223CC03EAC5F75BA3D91D892883D2843B29397BE6E06842D48B75DF75E5 +480F6501AF694E0E76D228DF52219C15E7F33267A9D1C3515308EF73D3DB303FCB9497AB +FA1236E8DBE95DE4EC90A9592CE96949D0DC55EF858A18DD37AF76A51EB3B98BDE0ED83E +7F4C6297245315E685559B4AA1D37E47053657E710D0AA3CCD41ECCCECC286BD133B64A2 +E8583148702FA532121E1E7B058BA1D24E7DF660A9E130BB8BE6DD87D005CEBAB1C8E87C +34C3EA39378893ED7752DC543535761B4A237ABD04B53080196D79D692DE2E53B7167B6D +76DA2279335AC5BF986E1AEADD9EE3A100756B15353BECE08FA788CAB5F63BC7AD58C442 +4AB03866AE0E18D4DC71BDF4B58A79C75D616933A31BD5BC14A2743E4A1EB88D90DB1854 +F132A946B090E2A092F71CD84239403C0CAFE30A7900061AF680F855DA5E91B023830B93 +48050178113D7831EFB051CA8534A3FA88222FB85D1A1E9D99936C49DE0A1DD7C8383F29 +B9B2EE1CD7064488D60C7E76F4F2DB018A4B9C95CCBE2F9CD7DEDE9501BEAA9C0D08C590 +1F9211AEF3AAC99DEFBD5F9C431EAA31798BD7D3A3A5604892F44CB3B736E8F8F79202B1 +6E9ED3ED418EF08539CD3DD9E624BADD761A44835AC95D5D07F7D67B93EB70AD8E86E0EB +5AC1D4263F51E84583E424D0444B673747A8B353A780A6F8549F11A4962641A47CB1C3E3 +C4A241D244BA92AB05E6BA17BE0D6DC648C1F9D5F88EC20E103D1589D0E86D2B27CC077D +810BD20514BE94853BCCFEF33D7655EE94DB8559BE3FC78C539E70F84E20534E7A5D6930 +A02889A4A82BA058888AB3EC75769BF961283481CF006D73FFA088EE019BB4AA990FC858 +621437BFB2D79C49157B5757CDC8EEAAD540E02BE1404EEBDC0B7BF094B80789D03B5F7F +5756535B392A64F9617ED0856A7D167A78032855ADF1E672851A439D9DF57967EFC56D44 +FCC6D878C31CE7904C70433721C4E981F2643C08D96E4753850A4F427FA3D984E00832BD +53437FDAB0A491C81CD6CF81D8BF5247E01CAD335A6DC9A69962B5830DEE96B57C9B08A0 +A5F401CC9CE286D3FB2B24F8E77508E4182551B4EE7B8139B80B805B64923ACE685CD576 +BF57A5F538B3F03C38B7DDFDE686B8F79271F8E4E909960D6D36523D4A217E4036AD4C84 +1E228DEC38AD432162211F5BA65FE03E0796A29EB8A8C4DB9BEA37E5C15A4AFF900A3456 +723DD6CB1F8BE7C5372A815691A92B5F1DD97BFC89FA5EBCDCC61AE4EF0245684ED4FC18 +7631D4292A94C9E3BBA81159E3688CAF6FC988236FAD971D774B54626DA436D10BD42A1E +86036DB36914728E66B8EEA3B432126A5C1F0FF3928557A3D7583BE21007D81D40D8359D +83075211A8366B16613E1B40EB840DFCCED4063CF06117963EF200E0FC0A558B1B69DED6 +08A00C25C68AA7EA0D902047A0981330DB2788E994E2196FED97CE2E777C0213532CB19C +A28B07792F57F19433A14D1E6506958E8B6483D3651A1EA10D988C541CDA715DE138B612 +76926F9793C603B1836E4E9A4DE110A69D60E0F9BB0D5DB9F4B67209EFBE8D69D4C20B15 +0640052CD4367DDCE4722A87E9914B7DF541DEFA52278ECEB60572E0CC31AFC6C30ADEF7 +5898DB0B4A5D00F169688EC5212983AD3DCA6604CD2B3FD4A351EB4661F025716B2DCA8A +F52CE6D269979C1F7E7942F583B2CB678F8DC52CB250C603D48B206D5547816C220AF203 +609BFE7B53CE4C88178C95A4E8F2F8B4BACB1CA5EF4CC1E76347AA958F2789D441AA1193 +C56ED7B27A0099B3EEBAC6AA6302891D3F16A913D980522CDDD8E3303437EC9AFBC4858E +D3DD92E3E329B34B344718E4950DE3829812896AA20A9480582570DC88FD7F4AC2F46B24 +CDDD8EC6BE4862DE1412F427B698B83AF5A0EA767778564F3C3CA40EA60281099297E104 +E46E308BBF5EF23CCA84F9D6A6F773157582EE0F1BC477274999637E199E269DAD3D67BF +D3EBBE840CD906E73A31EC7EB044E41F6B72367F6EABF54DA9F1664A1664338E202105FE +E7F071026D12CEDC2D86D581C496B400D58CFCBB7B2A551BDABAFAC1125090DDDEFD4F55 +55B21AC1F6E5DDAE6700935C521AE129F886598539C41D07FE2680F25442BC29BDE2902A +07FEEEB0A14E4F0201483BDD99D4142194BA2FB991F76B35D0DC31526A417212E5151E31 +60F3AD665ED99E0C7E50A43F58B2D6A8A075A96DFAFEA84C12EAD776CC6A3445771DE987 +DD0775A8DA30A1D0B92ED1D1A8B3E0133198B33C58A9E79943083C1EF44C0AE8A12D3BF6 +7CE1EF00C97E220DF31245B47F4720DA1F1B66A11A1AECBC9183C654DCEE7A16D47A3503 +74458A7303ECAC951588D2DEFE51919ACE2093697639CF60467FE9E43DC30B9FD53D4C22 +DB1F7B81EC206548C1E6E6B6CFE038764C4702F62CC23C38AFBC762D24E7625804867B40 +1626B14B8E45C6D9641B591D868FBADB07FCBE00C193F2F13F174648665CDA538E8977FE +E8B54B74CD4F84BDF7A1D2D1E64539F146D3D116BEBBAAEA5FED99C5DE42526EEFBB78CB +F8AAEC9F769B94FEF470C60E0B2F79C7F99D8C9C7C32A68302B352496255FB3785F74B43 +B4A173961F9018930515E6D1A57897420C404F32B3A0E2CDBBF8B53DCCDA0F0954BF6F80 +2638FBACAE414DB6C63F60ABFF719EAC3831C7D5AE46AAA7BECE1B71875D46504E61C29A +3AFA16498509FC57DF4B4BF40CD4D8D59399EEF835D97EEF06B373F6E006EC22FC61BD13 +99EB69F248D991725232C1C5BBFFEBF0477A08BDD42F32FA43C5F5C06C2BF639E1C86F0D +8E49B70E134B038781A1E85AE2A16FD1364479A5A46EEB1191390F469D0C573079523D1E +F2B049171F9345AC5FAD682E4CAE51E1717FB19F8AAED47B7572EFD188806BD9FAE5AB42 +37683C9797DEB62E1FD9DD5CD1D477918D19D004AE0334E7F6A705C4B6D01FEDD05DA5FA +063F81B6C6842D81A774C04531F708045021B8F11243E2C3F3EF7FAF5BA95C117B9DD6E1 +AABBC678F5046CBB55FB58849B6500A1A9593AB0BE9E2CD823FD35F60A485C3DDA2A36E4 +D13984CFFDC0992E39CBE5CD18076A92820D874E2576C83A6B02384D33F07DF51788BBF8 +27DD031A3520EAA36248860261133BAB4441635E255AE14B59B37B35CACB94688809FC1E +DFAD40EB2307B2E0B8303BD47A15F736F58A4B7D8ACC44141E5E7D85D24B6CD12591633B +7A005A49120406ED1CE82835C70426862D94F10BE0A51C894074506444BC899136DCE869 +D20F94E6E1D67F579E94D83DBD0B2230E55B90E01088DDA3748DEB1A7FBEB2D9D5625149 +06F512CAB6655C97060CE906ABD62996B2F1EFB10585C49EB019986CD391C1250C9E290F +435A19B3035A30B415C614D64E396E5AF2970E36BB508E4AA4A030C9A38ED4D04B967E2C +F5BDFC66833DCC48BC43772864DC29337040BC9AFBBA5E6272CEB78222394AF8362D32AF +C1AA0E3359A4DCF2A98F14C1876631E2C98E8E29C41655F970963592C4BA3D028420B197 +559C882A42896CA2FCAE8919352A02C39BF565A6841E3B181234E3750125F983E415A065 +137F3C67B80FBF6390B53BEDBD3ABF8E11C807C89B1420C37C790BAFFDE9EFFDE9092673 +DFC748B14ADE1A7B9883C545C0C145DA0D404571F94F4A161F7A747EFC311D1F52C33CF5 +993D987161F2AF52920FE97AEFC3651767C8750FDB45920C972401A337517BB88B3B65EC +B1E6A67B6B0728E3A1E46B1FDCBBE1D3757D715F91AE74F3740D2329944246FFC50665A3 +87B472AB71CA71539C2D15C56AEE7951666BB869FDDB6D91FB4F90A00163E7F1F4634472 +46DC61B4B08ED312157BA05105B93F0F8DE781CFB59480E1B8596A3354C8783CEF52EFDC +74C9D143C16088448B8A9CBBCEC59900B16961E845CC92AAF400943EEDFE174CB3E465DA +6D92240D8CEED8557EC7631EA9D2B4F0758CDD9847D703A5623FC1C96D321482243A6E9C +853FA07459B8DF72F6D6CADDE4D92A8B110566984A4B8678B8CC8FF4B2F4665030FC2B47 +A0102CBB3D8F4E0C40D761D05BF4B9A684FCE51A5F750093AE65299413225E64BB20D6C3 +E287D934DD3040DEFDA92AFBA6E79483DF64FE3CB9B265F7CDDB2F5DEA767D5967CF0393 +B7405BE70F810DEF309C5D2EE786DBD819EA4A4253125AEA8DDE8F9AC42AB35E11773CC8 +434462261939FE3EE8F30383450E3C6CBB033FC839332F6B6092E724274A89C86BB4ECCE +2FF70EF35268E9EFD66F1A75222BAA8CC9F9F4BB4943CB28207C633004F31E0721FA48B7 +D1E9D10A0694EF6A58A1F01EAA6BE615F2B1BAC49B9CC0A77FE251B7CF5611ACB1A0BD53 +8ABF1BE4F584AABB038F4FE84606BD96CF25FE9146651587023F868B13557E4153F2FAE2 +070BE3D081C4CC5410E803F04FC2284EDEE54DD387DD61F0B3C2A1815B35DBE6FFE337D0 +7C50DFF344C2A4D9921DC7FD0FBA8CA06FB07CED571BE57E89C3E429B40F0D8EDE7B522A +32AF6249D1EB966D27A5424495A82F15DBC8FC90B8619C0363AFA45C26D60FBB408606D9 +A37B385582513B61641595F7328A1EC830E90BB7C8B186552E2F645E2F09553BAA432558 +DEAEDDD0591CA23F19E6B9D2143F0CFC9550A43DE70F69A66A89C4E505E02FDF77C87E3F +A3768B12B7B7137C5DF761978563CC1C81AF9B7721D1E21A7E18CFD583EE4BC928E75AE8 +3F4DEF7A587D0AF30DE0CF4D74872360DB3BCD6529906995C1294DB90C93B44EBFB95527 +3D0B704C529EE441EA8E1EE2E3B03B7BA50CEC0C34AC176EB56AADB692EE9A53C215AB0C +5736A3A4EC7E37F2ED5E4BDC7B82D0E35E06915E068FD974F225E70461D780906A7B7831 +AA07687C177FE71B84A4136C7A6BF2FE6408A9C7049795C49326069BF24244430A960ABC +ACE67533486D6D5C6CA89D71904C5C48D02969628A2184F6B36C5FFB64A671116196BBE7 +4FA57CA9CC66378C0CF086FBDF05DFA609BCED01EF21DB027551B888242BDD941C302340 +0C2622E8557A0E12DDF981313D1F5953B57835592C8828C102C16EC39D06B63F31C373A2 +5077672A1134EFE0D4437E8F38AB373B214EB5F2BE1F6D80A07E1AA296AB7F974EE1DD76 +EED4B86A3CBA0E3C9D9F1A12F5E58913054D4557C2CC1C2C147196C7CB1435CC90C5D7CB +D2379FE287CE562D9B7660E157E175ECCE8AA94B1173665484D19D65A9B191D4C09D43B7 +90D1DA313C09025020B2315B0112B8E059E01525EE0AF0189CE06A307801725A26B2B3D1 +F0A1BFA9056E1D7DF67B1A8E82946D5328AAB07A9D90E21F5163B1E3DD6D789068C8A1DB +553FCEA69C14609A69805B3333EB608E4744C58C454DE66723A7794D09DEF7C6C981DDF8 +1B84B3E498D055ECEB6E8372D331861437AA69AE7D9A0932F4E71B9930D6F2DC38161257 +A32B87A7D37D200A5B9B5B257C0C9833BF04F91496BBAE83E9AE742362D8E74E0A4AE5CA +029B5CA078EA6D8F00B1ABB84A08FF1C03BA539128A42166D06E09FA8AE71B74A216ECCC +82DB316C9589BC68456F8ECD9B4BEF1E12506D537B6BE4CBB15C969B05D2F220B6E2678F +4F2D497DFB72D8F9584FBF0D363547F84E1B28FEA0C869A090FADD5B90E36B88326F6589 +BCFD8FDAB3993532F04949DB9EC2D2F2F1360E2E75AE76A6796A2E7AFED4DAB1B7B10D54 +33AB4C76331AABAE0D3ACAAA62C1BC3F72662EC71B76568BF3450B45C2D09BECB562A49D +3428A9DEED6D956CE1AFD83D90A0FC021957B45B8C03CDE0579EDADAB4BA570B29809545 +3A1D56FB60FCF22C038803ED3908D09A5E4E3EACD180A6D355FD7EB96B05305E841DED98 +07F75F133A6CA5D3415D0376504634B8DC2AC7A5BB53F9A3A032A878DFFA224FAD7A22B6 +9416767480B814D12E7D316D07AE8AA5117C04503B2E194F5CE94EFEE005DA30AD9114C8 +BA99323CF76547C24D607E40B62C51D86B672675E6F0730ABDC9B7B186D7EFDC4BEE86A6 +6456C4074BAF42818B46DB83D70FC8D1CA702CBB672B38BF0E776B52755468462B2EA034 +DA32113FC26E122261018D3A125D174D301FF7B16B57A406CD70110AD35710C2B67B7330 +CEC7B6B33770572AA9227AC52B0D6C6D0E25515C5844FD5D24140E01F3A4099BE114B94F +DB65580BAB585F3561FC997C5DFC1A27A5AB4CC6DAB5DF46F3D575316C81A2049089FCD4 +1E4740F4D16EEB08F117EEED488A6A9DE20B498CB60E48EB5A0839134B9F102BFBBBA982 +74ECB5679EBC7CD178B6F179ED979AE8E9A41763A97B4E14A7AB6A2C1A446615786CA3FA +32BAC716808B486702635502AA9F336C101A6E6A5F3033F5A92E13B9DFEEA4E7E98422E3 +3D051264262DAF41BDE94B43E0A375A42C59702EF2C43445C5EC7B6002BDE7C342F52AC3 +A5844A0EE75F5670C8B80AEBDDB2FE3D28BD6961037C0C54BE5ED708F683D1494DDFBCDC +976AB35442BB049A5ABAD1246996AB4E56CB0DC9596EE6ED06D02BB2DF9A7C9CD5B07BDB +7AD345607291736909E194D93DC68A1C612945A264A81603A9D0DFD5435DDB97F42957BC +AB7D6B400E2943A3F455918135E6EFFB0AA5E9C3509860CB5727363AC596CA1D08979225 +814CBD4A22CB979E1A6F6B9BD0359E782E852F51DAB107EFB2C2F1CE5D69D5471704572B +65A8B8B45305088AF7FA401348962022C952067504E39F3E879025FBE8E5ADD940B6D4D1 +737101C3999B9C6F58B259219AF84F1C146AE2DDF02C492FB5F582E739F1D1A3A0752CBD +5C401C91BFA7BE13F936DDA112AD87ACFAA7DF7CDB341443967E8CE3091F024329934DA6 +AE431187CF6C1955744518EDEFA73ED94EF60764C59EC21CBB08EA73512314A7E0658DCD +B61CDF37259EDE297DDDD7022DF5174DE5FA5216E566D1AF3249DE12E3A4EEF90A125EB0 +5633B85E3A12463693D5E2D6C01F5353761DE77FC8BDEF35FE0432E1CE3254F0F50A1B77 +C2245BB6DAA558E893F89AD98296C328D37C816CA808943AC488BC0090A4DB29DB0EAE82 +C89337A7C3FD1B4000202C42489974411B7B63D69BCB12E7EE7173E51D1DA17D7C82E6D9 +F810E76A97A9F118F1989B9DF448249BA2AD095A9698BB74D744C9ABCADAD6260E069C9C +73B05D41228C475C1207FB4AA8A14562FDC889D6870F5D045073F18D8716944B52A7F9C5 +0005002C0D1032B7F3ED2F60E9B27D056D1BF9AE3B1C9B4AE9A76EFAB3EB926376080C14 +5100DBBA2FAFB47E119443AAC33CD4A49DBB8C0E8629C56B8427AA94A6E076EDD6A16574 +336E6AC1D23E04E9BDA3CD2C926604C4E8170A3B9599FBFA9D3C8BD6192020E0296968C2 +EFA8C621C0FB0AFD399FD8E14CCDD94D5C6406D6B1A2564507BC818467322EDC55C3A3EE +E343DC08142264D205F542C023F8C82CAFAF6DC194E2016202247696F03CAD55224FDBCB +0E8DD2C9DC53F5BA9DAB23C033C788CBA2382EEA7390EE61A9672345EE2749CCA136632B +34AA12A5FC16974E9EB835A5598ADA0898BA5C87757D5EADAB5D0F71E4B75B8B1D711128 +E277A973EC136CAFFEF269A28B00881991B33CC8C5DF618B95C049CD97D746978B6C3AC0 +CB9EF6A51BD9702D0C14AB484DA4AC2400BDC557CD5E57A2421ADEC7F2326370E6F5D5C2 +9DAC782AB9255D0F4D0C98E7F9E0D7D31B114B1BD18AA2510E4F4A97582A15F170C12EFE +80842C1D3FB9C74F40DDCC8517FB123EDCA605305E841DDB1E5AD5448DD4972A20045021 +196CC951B8C99E3F000CF984252686EBBDE5DA0593C8514F131FA94949AAE1AED3E780CB +0504CFAD74171757769C8B2F51D54DBDE3EEB48E75486B4A75E4431F8BCD1A985C4484BB +1B5CA35F1BFE7B3A7C41A42B66756A229A7A5A0DA6B7A5084EEF6B8AC804C17F1E88E5C3 +D0C1D55BD687A9803A1AA74A60C0360873B37C79B09A1B823C3C8AA322BFA2E9B77701D2 +BD815C11DF5C55C393B73F98B73A500EEE6CBDC9E4F5405C73C3B635D6D0CA58BB47D41B +25149C3962190A1CB6FE7A8D6D4E26A205733F42BE8A2B0A8B4573C92CC98FDD07318671 +F3D3D5C7C757DD5AC7350F64E70381D190A05C674AAA796DE36886AA50955B422BF5995B +6F8EAD32715151456AEF2AD3D16FA3120B0E95D817F9CCCF7B2A55D529272B1E1BC060B9 +9F6342A1229DD8EC1DDFE9B59DBDF216006E98EC1AA5A1F55EA3D7EDCE63ADE2D4A3BE57 +E45A1FFFC04D1C9F1466583BB2AD58AF695DB3DC075327144B35BC40EADC993BF3BB97EC +A3F7756324E46DC6F4A13CE5266433C90FDEF6F46D38A9CE9DBD993B941AABE630ACA87B +B14EE46C977EAF512A769611F269A17D6A7889F28F4D38CB9F20580F6F4F5324FBF8F6B4 +F6C101ED306407463004171F3C8EEC70B9A2FBAFE213D1450F9E368E56183F4449780F4C +20171C3354E3AFD7D31B9CD7979F57FE545B06F40AB613B5B91D21D9E50B7B01E057F02D +DE24F4720972007D62736223D8C3C442CA0BBC8F31D29387399CEEC87700982A394A11CC +C73E118113558A4D44BA30924C4310F7C83F2C6D3FF570FCB031C12322CBD38CF98053AF +BEC2E7DA168EAB3B646713AD5C3FB0CAC7BE1D7CC779FDBEDA2FB78CADFB0EDE7BC13C17 +531C20EFA0C63BC58AA447545EB89FE0271198D71AE26924F939A063521C082560D97EE9 +6130A6F6EB7CB75BADBA1A8A00736860986EC623DA35F8210E26B843345B941C0C0B262E +B8EEB95482CB4EB437431E541F1C2820699258B1D17229E1DC8D7B170742CA64773F8062 +330A53950E929080661E588C1E4B85B5235130D50876837EF131D3F01CB0508954F39838 +ED8A7F38E5E7AEC8A74FC71EFE42E03E01B3CE075AC305B223B03944F9C39193A9EB6334 +FE05EFB242FECDEB2CFB62E0852B8AE333A92B8CD54F33318B1B22A8FBE47619A40D2CE1 +226735134BD860754D2804FC482441D48F1239B2D53E0ABD6FA1D556E4551203DDC5C79A +F0169D0306F1BD451D9FAF5A200FAC1C833CD3E72E37AF7D95860D2D04A1FCAE8EDCC522 +255D759C135B7812CBD0A6EA9BDCC084E528A533B79FE9CE5BA00E86448CA798C6CA5B05 +5EF88EEB8EB276D2E84524D64468EA6D25F062CE4D47C1E15CD734BBD04308FF67DA439D +577A00E4824EBFCB2EA5A00B55655157AFA0DA8FBBBC520A39B37D9FAE15A2CC90DE8B11 +9F69965BD22F20B63A3DC8C71A15510F85AC76F3248D2E5593266D9874E3C099649F78A1 +85F07DC3D9C1CA1FB2FCDF2808945571904E3E37A00EAF493BFDF11E9B6D4DD951C76EB9 +9BA671641E4A3FFA7C16F3AF41ECE3EDAEB91B0D8065D2324856C13B02C6666AE0DE50A2 +EB8380E0CF9665C3005EBFBC1AC075D05713A70CDD5590E7B9A54CDAA5F5BD2463AE744A +A12F29C1C2D241712C3A80DC860C4BE572905586FCF974241213D073D3AFE446608B31B9 +E4F368D5627A50E0D55F22899B18E8BBD1DC96EA7EE8411650950B38E5E977E25A210070 +B8BCD0C109AAA5E1D838AFB35A25B0C32267672D34D5E1F139DFC10AE6D23F14B07190A6 +0DA8E6522D3050EACCE19A9D1C762BFF247CADBD1D1F172C006DB745A3F4D05D33957DFB +471AE4ACE69B8AE49D8257B8B88D36865C0301D3DBF8114850A2B05D2A8121B3335DD399 +067962216367A8E8CC834D69BF7E16D06B4C7F602F908DA3903FEAC017228C976741A421 +C49048140D1B8D484153AB948A01CD7113C0AB9BD5466F8A26557E9F984BEA514EBE72E8 +C38FAB5F634EAB033C960539945FFDCF63E1DF47A8C6BF4460F6DB6778BE2D90B90BAEF4 +6AADCACBC8D1DE9BA3E9D4A2A8EB70F5CC3F02ECF6D76BCFDCAB9BBD36DF52DF860D64E1 +F0958B74361BA4298D792AF1D119905FE6D3067BFA8146CE1633D5C4658847F3F9E18143 +F1AB4D35C953AA5105FF94FC0C345E478B5B1D4584CA7BC050A31740EDE0FAC5EFA57126 +2CDAE360AB92ACBFD23807A0394160A8EF0B0F320CE3685040D091289DBCE3454B1ED51C +83D8EDB2C86C71805DDBD584BB61E88A673ECD1535F5891EF7695F182F783B59ECBB0DA0 +B445D7AB5DF5C9BD042929611182301813145BAAC4D54644E93BC8FD2CEDE0207B5D60ED +FF95CE7CC60DA632FEA04F8BC518E4A5197BBE065062556EADE480A86B8A2E0C9F1BF739 +1102D97C4D6A33B05C2EC5F457306266572C06274ABA9EEDB8F3C4E405EB5F132AB3E947 +CFF44017C6D8B79980DDEB698BB03BEB0C864A0766EDE34FED65FA889C5F149736CB7640 +B13BDA9CC6D5BF72FBC3009CB4FF5A877CA3E973A2A08FF25B212B8665DC4D6630B6EB48 +0D6E1E8DCA6F34AC6EAA482A4C6AD1763E17665BDE15BC08806A3FF8BE68584C8EABDFB1 +1E415329EFD07459890671D21872E0B0CB2EE1577B4A9283F224E3D0CA7106ED0C91FFFB +4A3B8CBDB5E528C8D95D19741F16DF780F6D49FF6815351D0F0D92A0CD72FD14A19E1DB9 +97C3CC11BD6FB2AEB5281951D508A3EAAAFBB048B87AFC7CAB9BBE1D1C407D52978B6AC4 +6136E779209453BC2A6A86C198D1DFD8818526715228EBB5F411E1554004F48FDDD2607B +E0D3979B82E35B78985FAC19CC95022D1F0AB9358CFE21C27BAB89AE4B03CD35565BC65B +E6E25BBC43F5298B14000AC0867BAE57BCBC40E938C304F37D9AC390A90BB5ACC906599E +789066315EEC0C15FDEC2F6E637A3082C85B2ED6BCFD621F033396CF1B7330D97265F873 +C92A64271C6CD63635758B05C10F67831EE579EF0B4AEAC245BC87541C1E7561E24B5E01 +B323E220BF1170BE5A4319684883C910556AB899372CF97C572D1AA86A34D826D6D4A048 +AE28B9D3E63A00A6CD36A5C4472E1B7840FD3B09A16190BB63588E98921E17D4180AA540 +56457195934F082F0C0F7D104E9271FB8E7D0CECCD395BCFF6539B76EC3FDBB1363A56ED +366E8F9DD48A9349E4DD8A78C5B683E8365F3D0B4F2F8DE3D70B0B8825667406898EFF52 +A957499AE83E6FD2037CBDBE6B9265B0CB7323F86AD386F7A65CBFA93DD00255BBA82F96 +34A80487F68BC69000869F6CBDD217096BBE6BD9179DEEBE12422C308CE023854FBC077B +BF1B820172633D8F70B26A302EE6B64258FE46DA73AB8C384756200C95A5623D0F2A41E4 +7EE54394A784941A06F082C737B9C6C5855C5F11729D6777E38A6B5F061C8E324CD2469C +37B564AED2568502B980A054BA7007E8D9ED7733D3956BF5A3AD62C262CFA0BA9BFE0772 +7B67909D59A0084BBB85DE630245D514D86A920891417AB9FBC93863498E04E1DB27EC92 +6F5455BF6A5D09BB6C4968E10A177CA4B057E7D360F4646C986BDC5FB0C7ADA94D69F257 +96A37E10F1C62FE65D66790A0599D0A20ACD87AE4ECAD36C45678542E8D8E364DA954F9E +E832D403BAD839441AA6F7118FD8C18B5C36F20EA984755E672FD1C2DECC0F6764711C3E +7F6710BB8C7911BBDDB001B9CCBDD363B8CD618CF15ED57B63E5436047E7FB5BAE45D062 +D2EDEC99D9335118AC31D73AC1770FD0E5618608C7F42507753B5115520D4E220339B3B8 +AC54C83451996E8A489FA86B1E6C990A5000614688D4C29AD6EF8010131BEC1AD2670F9C +DBAC78485175F999CDFFB8572F30648EB8F49548850B6CBED30114EFB970C8A58E814239 +CB0C1A855ECB24E0E38A6F4AC9EA5D255A9EE180F41213F8168F03E4F646411AB5B4AFFB +B17C2533092A51313D3556E734FA0970E0760CE24A573A511EDF00457F348C5E465C1AF1 +198BCBA0CA6DB414B66EBF68E557E2EA72E80D7615B3A3017214BF1525A6CCCD1BBB3925 +C42E13E162797DC077B2674BCA2265F48F72407B24CA2002C2DBD2DAEFE4D0BF1B1D682E +40B74BAD6C4B69328848F208D5ECA1A49B6F59E89B306FC5C47E6C007A5B0E5380538B38 +1DAAB61199AF1857C9D0649570534B486FB5144D9588547716F848A8015C8C2D21995D4C +860802DFB07E4DF45E09C7D7FD5EE824CE4128ADF624250D69ACC87A0A10F647E7575DF1 +E7ADE6B0BCF063411797D563441EBCFB213F200A4CE96623BD6CF127727364E0450EFE99 +288E9A3B1FA4A1E776C9BC581931B72749EF0DF7D786F898CEB10158B705BD15B6A9ADC9 +9C7E2E3624905EC361BEEBA65E43FEDA49EB8F8A85187973C5D19FB54BDDCD79E42E2C08 +130865F10D7D600246548D33303B617CD6F81E0A11F4BC23DA3B167E5B2FBDA8BE051C49 +536C4B0940C61A954418AFAD8B0B19D85DEB12B1219DE27FF75797D0DA16F00F80AC113D +F19AE8BF86FCBB602F3BC696611935FDCB61F05EE17FDC36E0B1087187F80D5C3EAE1B17 +DC1BA5817CBA5C3CBAB6BD6455AA2C3B44B57494B8BD08859C1213B24A62755F7CCA048F +63F3F430CCEB00BBF39343F25AD4B6C62039A3F7B943344F86312E7566620694B77C5B69 +2AB977A7331B5F38D883F9B7C4F89E4A66F725E0EBD8E988AB9AAECF32D31C75A3E6849C +32E4F06196DB937008FFA15DA36CA90BECBE909AEF6CA20E2315C82BA27385D08720E1FC +BD5652AE843BE5F3D457B7F488E7AFDDDCD29BDF7ACEDF1075ED819674E47D0FC92DB7FE +0AFDE6D58685F855FFDF52CE51B9C2720A82712A4B7BD96DE3EA95CD1635ECF7663C1D54 +A885A6AE72D84462639C52F987138050CBF73A5504F66D1430DFACF226FF12069A80ABDD +0141CC2E05524BAC464CA4C59AF2912A2A4EA112F8C8A0BC4C908BD6C0BBA0123110F3E9 +CE3A216081892A19AC53FAD507E34110EFC7D4699A98849C5502F9DCD4418FA81EAC9481 +E4C20B4F46BE4DD134FFB03E47D6547D6540E1EA036167460F2922629E01ED36553AF423 +0050BBA670A4B74790B213D70D7ED543F9787E8920551C4703DB62110EF2E30DF12E91F6 +8AE86C3C6F9EB3043C162C0A0CFF7D4FA90CFDA5278D2B47D265D06CC33FCDDFDF3C68D3 +6BEDCBABB491F89962A46F90923C51EFEACB39FA22A36CDDEA38855682F126AEBEC06558 +94CE26C769392D71F1C4CBC34E3A4565EE74D67AB272327B457D346B756322FCA806938F +BFB118244CE3B164ABB58135A96B7E1211220995376CD058DDBC291AEFEE79A41501AA17 +BE5200BA08E047BF985A97A8DCC1640E279DD35938B57C186918F163012A4C947D665449 +5CAC149C96F6A40502ACF8BE05D671777DCD218EF7FFF41AF93A80418A2AB81FA89120BC +91A462F034E8801E1251BC3327321C7C0652ED3B26CB8B6CADF42AE3D97A8DB1A732E452 +FF187A97A2E03372667F91825FF3CC861B4122A1A0A3F4564323209DCB8FD2A886E95F58 +1539C74E4F5A0EC5B63DFB416F3859B46DCDBE7D724DACA0C5B6483FEABF3F36D6B13D2A +49DACF1EAC4FA6C7B161A22CD876F5D511C2C2FC96C8B3AE53311E2D9468874BBB9E6B4B +D18C5DA32F4E00923F59D2FC2079BD4BEDFA9E960249C650EADF2937CF7E339FD103CF71 +AF2549D4E9763E75A84744E73F70B669B6808258677265A9C2A48D95CF90D1E1585B4B60 +D19CA105909FE1D0EBCF533562ED6953C71C3CBD9CC474B6F6418A87C6B608E9D62CD3B4 +15565A14EAA18B23199A1521B101314B38A6662F5EE6390C9DEB538F5AF1BCC84DC9CA33 +E2D403FB1FB1A2E12D485D534F1A8A27447B5F9F13ECE527F7CD3CD9144AC5F137637659 +8199D0EE633CCD95797F4D55447D3105AA87498F1FC8B8750A440C46ABF820EF499F9D5A +2818FFC414EEABC029AD6F961CA43BF94BFAEEDB8962A6124A192E1343E16A5E20204016 +B5175FF8252310B60F276148849E8556BBBD44CB9E59F5992AC845CDB2BC3B33BD7F0816 +2C36B7D91BD17A37F77A7938A5209FE92DEAD16A595E91917F6E49ECAD8C7B01F1565089 +815BAD961827931E718DF2B1F9743B938ACA21B648916FA76C5C99BFAC1DA9526A8F8793 +733B8CB1123A12E1FAEFE75332D850FB7F296539E76031DDEA6851EA00D97F7B83945C3E +5C29D9B7F31B9A7B541B7640C17347CB2E39C15FDCF8C8B8ECE605239020783F333064E9 +ABBF3236976CC021E852C2D1C1A95D6DFD5746E076D14E75D2D31D0E93260802D9B4B846 +865DDE6FD59150562F6EF062B5DFE7C136978FB4A84ECB6AD463E199CB6ED2A9EDD7CBED +D8BB618DA4E68319C7F194C0DEE2AF19A36943837505AA05FCFA86550C704A7EF74227D6 +58BFB33945D1E1FF102C91F6378D54AF74F1CEB81BEE7A848B8C933E4F9AB1D6914D9010 +9FF6C47194AFE0004A7245ABA2CE53A6C0B8636FB445E1D27E631618DCEE6E1FAFA19B28 +A3FF71FE46241F832D43FA786CAA4B5125821F13BA3023B54DC4E59CBB027C1720432DED +5D53E05E2E830F53F6CEFFA0F17394A13EDC3ED8EE8493523394C5C73CA15C428E481D73 +FD4BAC226F9B923A1BC380535B19161F12034CC22DB93B335E1D603F8FAFF5BAF4410A02 +C8D0391C8B118EFBE289DD957956EF0CAC55D68F2069FF4D24ADE54DC83286E790F7EC12 +2EA9CE466BDD9175E8D50EF54A5219997A440C689634B35CB4C440327CD35CB05AE77E39 +87D742854CEC4E4784D4C1B06340295D19C1944BCF826E96FF84B4C80E173892B6DEAB45 +DFC0BF6CE1142215881A64D73D10AE8BB835CAFEED23A7810FB3FA4E8D811809BECD7062 +2C9C6CE8725C331F42F991BC35674C0E451EB19887FF4792D738D4E22E4BB897C03E79BA +7F79F5CBFC2FB014BB58DEFF61A4AF62F3029F6829CF1DF5BD69FB1C73C68E36F2B3B1B2 +30B1D436D6DCA96563DA655E275ABB2AFD15D313D000D8E3F0D3461421D52B2A22623249 +E155D6276A5E6E0B5746C1BAB10B628092CD035976220A0121A3D16BC6B6F222511DA119 +E245943C5E7D68E32308EFD355CA3438436A5942292295282CB1FCDAE8B7A3AD3CB39CCC +5A6DDC8FC771700383C268F4D676E9DBDC33C14688F23179089396251728AF49BE24D02A +7CA4B1AA3CC148FB87E7C87EE41FE22723009FE89BD2DC689DDC9F034931ED7802B014F1 +C20D8F53EC110CDF35B8360FB1C58C9AA0F366260F36D21232E89FA1314476FFBA7F3AB8 +935147AF814D3BFF97635B11AB9EA47F6EF5952ABE438B536CF0FF25848F7480DFF36F43 +7CE6BD8701F4394A80E4D62731086ADAEEC41E6017A8AB72F890E9ED036C13BE24A7F2D0 +ABF1999B865B61349C501A9024FD08A319FB8E5DBA6E7283E8FC0BE48B9672CECD1F1091 +23A155914F163FD67AA466048A46DE447257D86C493B90178F37A23D66D192E552E46CB8 +E3C6D39B4CF574DF2C38CA6C74D0881E6E5C068766AC2898185BB326890F530984F3F31F +57F80C0220E2CDC14CE937420869C037B4C197C44B59FF91FAD5DAA875A7802A293679A8 +2AF31176B3DBDCA9FB5BF5C40038E7F119C61B7554F35DA79D942B9BE756497B3C9B7A19 +E5BCFFFD7BDD046EED61780D4CC5A7F8E3A78B7B2414212870BA0D27FF3C01B2AB030EEB +8F036B48673D6AB3460BB45939214BAB345B8D1FD6D2CDD3CAB37376244A7AC0FA3DF861 +60A193EE77CCCA93B2D984FA9CF07A54E9207EE127EF5B877A561216609567F9BD907BB2 +11A7383579FAB14FFACCFCC0E260DDCE27377C32FC039FF52A5D8059E7D4CFC880B0D634 +51482FC24A8E711B3D962A0926F4A0FBDF29036E0499FE6F5D115B7A95A059D6FCC36C87 +03DB34BB67B65F511637D91C428EED31371E9E9A00FA82BAC36AE2FDD0ADAD995E0E96FB +C909C5AC04BB213EBB5865A2CCE6942DD92EC73AF8C7D554A4B32910C7CE57EE79D11ACB +26D7CADECC469CF16953A50DDB0FF9A909F0382FC342CB38E2F3D8EDD0DC5919433386D1 +14B708E1AE5F01C2F08B8C8741D67BD1F02B4934A76D79B095AF43B68958BDE13D0F570B +71128A40A050BFF9C5D944C09A4B5D8AD0758B497771699B4E577436B15E31EF7D804663 +F768B9F5C9829EFFD5B479E1A0813E49D48705EFCCBCB2B23A7F0C39DAC69E7E35D7F4BA +770945D9F36A39D251B6CB76C88AD374E177B0F9D703865A69CEB6C0157419E781888F73 +47D0D641C43FF3521C3F380E26ADA5237ADE8C5FEEC8AF046C1B46903941181D958F16D1 +908D95A62869DE2DFD0AAC4D7441238B2ED50CDF729B10961883EC733F806C587C2D8F7D +B205AA3E7F6E34D5A2A2003E8CFDD22A63DAC1B04A11D77A6830CED7D9DA87BBD9E8D278 +275D1626D31054A23E9283FEC3D634BA1544AC5AD0E28DBD03C5CABF697DEAAE65D6167D +0E2EC4BC6C3B91581AC32B45F7ABA1B825848552D1413D1B5111168959A23F54C5B8E5E1 +B49C4096D5F546388E1279891E01D1FFDF63940F7AA520570B408C9C2CDA7F5A4B058919 +53B35D7523EA69927469DC90F6D8E15782204AE32885DC6BE6107D5EEFB29F69FBFECE44 +70CEFB37D0093844BE3ED424EFF064CF724A54B6B720ED020E70ADAC6716787FEEA1F22C +84A5E59BC6A643A29F50E3B76E6658D5BD8CA3554EA68CBFACD0CA0882B8E3389EE7945B +AC71B219233EE299C4C8FFB3BEB77BD483DE2A89DE4E697FA3A057EC47448CB99A7F1696 +00BBE4735D36408548405A8D4CE4209445DD0C4FFAA271ADCD14DDAA1598D44247156649 +1009AFC9B40874D4499857EF50BA7038F25A2159AAF9AC535EE1BC83E515D1439057F042 +C62DCB063AF8F014090AC771CC83DDFFFE0336CD4F14E3B6397E7AA442FF3C385A5A4B59 +2080801CC0BD5EA5F608A7936BD16248E3CAA7B49A475BEC9720EE44A06921A93375F344 +013752C467DB023F3F01FA7F427121DE5C4AFF495A06932C52FAA62C043B22ADA265BC90 +61B7702F9E44E326B54A423A472D23817F6135E05C1DDE477A9E27F42F5555E8FC22060B +D53ECBCA45C31C09BACC68EEA5126EE5E73502F2CF42BC5916B95590B778D556C4DB817B +2780787590B62405840D01F6B5301260E1EF0856219246C2CA7FBFB307FA728241E9A08F +F8FE0F6E708228172358EB98895B3C3C7FBAB501BEA9911A6C6769456E491C89B2FBD751 +C9339E174850B679B47118416AF8E849438FA52C4E2A0D1D8AB94385FED3747F9A8E78E5 +47FA728DA9C44F5D2296072A8ED789FAFFD237802988A20A8C16F78A50D2AB87A2BF8EC2 +8503F757AC6E9E556686A37D84D7B9DD81345E70D212D3D83E7D074A2BD9191D05205B27 +56E74664E1C3169AA601EE6276EB238E3EB9586C37ED4089E5C7AF97021FDADB6AAAF8ED +54CF169A574A7A6066EA74B3A255CFE9B6FDC2EABF4915325BEC03173370C41B71A65C08 +C4C809A78F52E89A27514E2771572235B8CE4E21229953786A90542924444BF56C163D41 +BCBDA2BD5981499D1BBFC7F7FDCD4EBAE43341EE9EBC04A5B3E86ABAACEE27AAAAEEA722 +63298EF83E19321B7CF9B1FAE2520159C2731E6023FBDDC81296BD2303788705D7A6FF72 +5ACD9365879F3742C0A375E23B124F85E2E533F958EDD9CEF05698E4F7E2C035EE665851 +E1B9B324D381BECE9AE126892F2B51826E44B80DF026FED2832BE1414CDC410B142E9248 +380FB3EF59A1CB8944C21E3B8F0450293E6FCE004AC4B002989C877AC2648964D137D881 +7C37A778E0EB56D243F6606A883875808323739C0B55B5F82C5BBC389566B7C24604D9E1 +9070CD37A2199B77BD81C6C0E4317AA361CD7F3D4CB2EEACF59D09FCB317C2E5656DD9EE +54D8D9C2FE364E21FDCC38F9FBE33457A70B75A4F9BE1DF8B6577B9E103F2276B77BDCA6 +0AB499915F331113F04C81F9572AFD95245AD3573A195D9CD1AF7D26FAB028F7A821DE62 +8132A99E8B39D4597457CBA2281394CF68069397BFB22BCF992989D8AFAFF25129A9F9CE +040FCB4752291D822EBD224DAC909194EAA4A07FC65F1EDC6C2D376190875FB8D2D19820 +7F71663705D83FE18CCAB848C11C5E112193D753B6A2BD9183054AE6021629E7927E4064 +9CEB4114C9B59F9827B98A70052FB67B5C45360C9C272DCD0C7DAC2A515707F6B63B2718 +B53B84441A28F777122D848B490C796185AD91E8474267D48B36DA7E3A7F70FC0F9319D3 +F937FD90AB3859794AC608FB96E283ED974159234761B8A114C8856FA00353C44D5C3976 +54488B0CFDBBC5A243595E2950E2ADFF06568551EC636B7D18FC1E68130F6623EB109415 +5F58F46A636EB98B30DE84A313ED1ED0EC0C8032B21ECFD11F2292A31E24E702D4723F50 +632F9D91DFF52142CFE2749A16B5B81F0ECEF869A7486191A3A910AE94C24471231B733D +FD6645C3856F341C0E1ECC17432635133CF66336D3C2C4F103C3EFE59FC7E45545A0A5A0 +CA19C0DBBF2B8CD3CBB482CD5BA7EBCA2CD5AC9E0C201FA4ACE28F00EB491ECEC3871AA9 +C0A303D585F94FCE1365117A59BD2644CE990F0A04239ED4B52CB5A0639BE554A2FFB03A +B9BC1E6C7989680B41BE26D2B01EFFE47819E737BBDB28868E0CEA2FFE4C7300B82E3016 +3BEEAA5EC834B2A2509BE99FCA5B087861C63EE1F84AACFA6FD77543D91C9C2E525BE531 +C02FF04A1F50C50B1F9CA7157F8A7787DD417868E48A035904BDA647EACC821F0ABB4053 +F19B502075211F1E1BD2714EE43D1AE7E19F8D13354D331E1935BB1246544EFA1DE7390F +7A561A6CC3F48C222A9C6C0B3A89714A16B3F61B6E26E3238FD641D431C7F6EC8005ECB3 +113C00A96AD8842746CF3D457F0F951D90C797716C3E8A08059207DBBB40D9095D8074E1 +069E36841ECC7EBF2081F293C194A044F5FD536D0F3B6551AD3CEA2FB84A5A32E20E34E2 +CDC9AF5E6839C3521EBECE2F4B39788F313FAB6D0F089BE45A7F4FB021D15C2661BA55F8 +691E8A9E5AE18FA617E5AC262F24962132E051BA7DDBBD3C5E7B3256ED5BBF7A670E0091 +B3AA0F6860559521C858CE6FC640029FD9D5FE03D1CC485A27080DE3BA08A36DDF87C81E +CE731AF1CE3F87FB19F91E324FF044110AE7C39110F9787C7F69E9C09FFBE37BA8B3DD17 +9B1EA5E176D6562DAC43992B8B5AED68898B6D56189426727100A36D92E2CB96672F58EE +EF30E90EC2569CEE9DA1B590F16B88E5E55FAEE2477E36E9CECA4D4DD9E969FC0D27CB94 +B5C3E738635D3C9AB4A0191CB553399EBB25D1D43DDA545A732B66DCF18A913EB214AAE9 +A408BC1E04449C07E114142FC22AC8639359B2413F3ADF5303088B00DBCD6AAF1ED46964 +F749F420207CE7CB3A27A4C260E174E17C6892695B3167B65271C232F1C67BCAD83B0216 +278FAD19834B58E7E1A2813EAB45DAC586EDEF11FF9CFC828811CC290C4EA40017A4BBD8 +889D5373B0002C0DCE55B2EABAB80E58B4341F386781264AD72C9B251255C0983AEB350B +03410B4C7E7E2ABE655E3A7AAB548D49C1EC489006EF4167BE2EA41CAD999E4CD6328ED0 +726C61B51EDF0952909C38480A6E801ADC241B50A972D31C7AC63BEB3746172F1CAFFA20 +D6E1009B9B1E79308ED3CD70D3F2975B0D241D8CDFD191A934E83E0BF3A938E19B3C461F +566B19516C068AD6BA4DF7CB37EA8343DB1ECD5CAEE329432E15147CE61AC4EEC2866463 +557C05CD59FCE1659245B7D8AB628F2ED8B24F6AD0B1AD37797FC20C098445EA1F43E3B3 +388550D0AFD24C74AAB269C1FE7596CF8F010D665111305ECFDEF52E89C240510D5D83F8 +FFC38DD47A537F55F7F79CB460F36812A1E3C26E8A7DD6131DA076BFA93D6C03E6E4C279 +D720B41A9CCD6A58EE1BD43A3035CDCE464BDC7CEBD79B867F30B0D15400B897A5ED7324 +A4A75568BD1211D036A5710F23C7A2E1D3F7E45C929FDA7ED13EFBEC7604427BCF853F92 +D954E627D0ED842663CFB64A2A6358C86F80FFB6A955C17B04B096D76B03DA9660D93004 +C44AAB74C40F99C702BBF33C4FE471ED4E6A0ABF3B15B340708D5D16FAB80D1E51F7D1A3 +8C7AC19A871C5D47963CE3CB961AF75A47C09B7AE97A3EB1C16D64D12A0798D5CAB48F68 +0E6B2DD1F7BCF7FD97719CBD7FCA4BC1CF31640675AB798F7A7CCD4E4A109E0E00A806F5 +8888F7A7091A9B7CFD350599C9AA0E7F679AB200035F48A57172C499737631A4F442F3A1 +BF5A3E5A2B77E02B66768DB9E76AE46E403E0E4BFBC1F14256ECD89BDF623F266389DF28 +AAC38991DDD4743F4A3B8EAEA45BF38EEFD1B7D3998B9B8542E78EB9FEFCB9D256EA8EA7 +6B56BA2A4849598F03483C59ED550D3508D12B35E4B82C2703883BBAFC0885BAE8B1440C +D2E368939FFE45BFEB172FCC597F19B089FC567332C97C3567C9DA05A3B99DADAB2BA61E +B9CFC9C1407322118C7B7BE2686FB5DBF0D31C5116F2F232AC8C3B6B1ED3E36AE2E9A638 +1E714212A76D2733DCF8F2BA8C1BB345A8B3D98162EE87C308539AEC3EC8EDA6CFDC423F +BDF208A89A906314950C1877A12E14C1DCBE5033474850128DFECB859E33F6EE578BB384 +DDC252AF788BD61E95E5375D134D6457B0A4690D7239440FF37E9F67CF10D1EE312653A0 +22702614C537EE7FFC677F630A079A98139EAA23FA2764B1D37CF5360002711890C12374 +CE980C83FF11E102C7AC31E4D96862CD3B8A77FB59FB8F3932750F21929B00912332196F +D9AABC0E4703C7BBB695FB1EC820CB6F69B9869FB819DD43AB4000BF70FA0320B5D3D2DF +8801021F0B0A45EEBCA8BFE6B616DCA4641358A4A18CFC749B17058929CAEFE146183C73 +BFD0BC668BE2EB8CC7003FBFC5F79373DAA86E4D9B65953031DCED7595D7779FA985FB1F +176161B955D22591CD434DA21E63FD9DF743B49B16A5ABE84E74293B1CE2BB4E2481770C +9B90A6641984001AF9E6DFB280D37922ED6A77D3C92F9E0F82B4CEC5FE92CFDCDF708EA3 +47EE98261C07F434E88A2042877D47C813992A1DBED99A6898288156CA26C7E473988BE2 +F5EC8DDD0FEE7D552832B69523330C12C6F0A307CDA286454EEBEB0B236AF69390B6FD9D +3546DE7015FBA1D36B08769D5DF07FFCC8AAAC31825F0F515813221E1D467F126CB9BDCD +E95DF5C7D64FF789BDB3A3339130A974D96606CBB812C8AEE855F29C5BDD9BA49FBDD481 +14DB68A228B685F35B5C33A9CE2CA9E0C30690831780284D6A75C9F9D86CC5A492EA5264 +09E1A2736EABD5FEF257F027B7363F8BF39519DB2940A1DFF0B3DCEC5CFBEE09633B4DF2 +6C29184ABEC66BB894F685BCF2AAF1301B1AB15398050C86A84E87491489F15FD2907D7D +ADD73C36FD0F7A40E021077CDD8AAA237DC9CB5E13C00EB7E91353BC58E0B8870BB319F5 +074B651F0D5179AABF87D023AFE75B3AA68D62FB959A5B6EFEA8D204C09F72B038A8C5D0 +9977F1457ED158E3BB57CE63EC2EE4577DE42F9D91AA5ADF0460374A36C972C33616D040 +2D8C1257C018B736CAD8BC182ECF63CEA524C8B3835E9CBF7618D930717C9DF018778787 +B5BD608E6DDE644B3CEC092A232B66420872C1412751FE7A72D604B7C01CB200506DD521 +F45DAE82F0C7CD4AB3B8E2E1B5A9B3D13546DA5A45A3195DC9A550D428882299614F9E8D +47E1674C7A95FE4B8E5EDA9D9499614A78DC322870B32E916C14088CFA3A76BA4F7CE4B6 +5C979130800F2F2D998F48DC5A2EC1CD18496402265677FD28F48CB38145EBDB30D2BBFF +15CA9FAEC6802D7BDC7F1A281DB9A6553B7D3F757A1FAA6AB91C0D31757FBE705EFE4C71 +AB0749AEFFE6768B35A0AC03636F4757B38C2F4C0A78EAA3557473913AC1AD37B72E79FB +75E2DA3A4A7AA867032A952D519BC5FC9BB684D0F21A661DEBE79B1C1513A16D8E32EB13 +E8DBB3F132C87ECE0972BF63001E8B9DC6C3F445191D536F8983B142BD94DD8F41C8756E +EFDB106BDEE3224FA448DAC03ACA80AE79B7DA40347D3C3A643B915C51BFCB861438C546 +1A59FB26B538BDFBB8D7DE77955A8FE6016F770BAB928D277CD4C2B3FD3839FE75308F21 +826B36084E485927C5DB75AA7B6133F468C71D218307B40CFE1BB6AD24E3C2240EE17084 +AF6C1E0D83CCE1699FDDB4763BC15F722D0383F5F4638785268FC439EB0A8C6B5AF7B938 +957DD111A83BA935CCF13A9DCBCAC9188CA67EDF1A6D18A34C956DE87418EA5E4796E59B +D981015C8D276CF4D8884AE423314AD62781108BA767131E08302A926C44B858B792DC52 +FBD6D15B5E9C4CABAA159FB5BCA5CAD068A5A718613598B518D015D3B6C43A01A5540849 +EC15F399A1DDEA9BDC47B409B10067FCCDA5932FD02BEF518433D8E7C83BA8567A2248DC +2271BB39F07414DF7655BCA33FA7811592168ABD559F49EC0F7968E87130093E607C2F1F +087154DA681D1C92C1B5EB87BFFF15C7DB4F8E319E42BDEC5B95A2F816BFC0A0CE997CB8 +BCCEA3DF23280D4C922482CA09EDA8C31F9C5FD9C22480DE591A3649A29F0293F976F366 +7A66D3923D6BEBD0C1A1F06C11C2C4207B2981E91DF0C0ABC84CE8B7B23B4837C51E2A94 +A7E3AB209AB5B99D40F39B1DE342502818A23235455B56BDCED3ACD910CD92E9E71DEF41 +0E3A01D9B7156F9DE0FC8916AB29D79F5B093C1CDD19CC1FDD6FFBD050ED563CA3C60022 +404A2E53E9EA3186A3177A57FB4B726DAFA37A4FD45D2C191E3E771C0CDA22EFAD7915B2 +15CCBD2A35E04CDF4779FE80B980ADE2D2E71B8F936D905AD7382B08C43A3ED6BBC5578C +80417621C7A3A87079ADF2B635671C36A1F57B971FF2918E14E80549150AB492D9709508 +ED98B983A9D40188F93847967A10FD16DFFE2C1276EACD959435C36899210DBEA62023A7 +ED706126E4E5E005B7608F078E3F0A42E87C84B37215F883E0F078127D47C4B362CEE951 +69F92B2887F67A3F1D02BEBF0277BA479264E7AD5E1087F613330246606F4907D3BA39C4 +644B7F9BC608BAC3107D9C66FF7CD9E9D624703055DFE0262E96B17BF017579001A7EE29 +4F4217B697CD9A397D35D8CB781D9FE282D9082D273AB082CCD017D7843E1AE3A41613F1 +F69AE113E8A993C83FFDBEDEFA92A9101B54D1AFB5BC7B41F3AB3C610E60AC17861E45B7 +34D7706BF6971921CF0E5344DC613EB31AB4E31775D990CEC15AF459BE474959EB24CABD +ED3B7D6A6540AA81B806D326D7614808FA2039A6675AC11F4E90EED294E867A84116FB5D +89BEB45F738B1275BBB4106108FB19D6EA4CA71E3B0C2BEA1EAC19D27EB928EBACA9DD62 +75865C4B86025B626202116190ECF58F149257C62C70EEEC110B540C636BBF747801A21F +B32A82CCF24062325AEB3B5DFEDD49AE625635C34CC330A93F1029F3A3A731537A0BF076 +C938773406C1670F4976AD1AAA5D3629EFE797A1133A683FBEC7DB8C480B32CA888ABB6F +049CDD5D65EAB1E23EABAEF26756618BF3CBA5D62286C938D3F6F20C731DB6044B89AF92 +F58FE18DC156E0F0D7A548C6D838F57899D7A693A6D158E5B9A19D4CCE4CE574FA1F9570 +7092879FA2C3F4AC5F223E3E0A174B97BB2CBC7815A20FF509B43D6EA17D515BDD9B3CF9 +4827C88EB2AC1FD13192752DB92070FBF319E4DD93EC6C9287108E248BC3F814CF3F85A4 +F6EEDCF1B78BBEE9987BB0767968894F13E299C79F50E052B7627584F1C78BC8EA588B4C +FB6C1204AAD2D47B42955EEE8563913BDC8167B5E82B48F3243F218E8832BCEED22BEEB6 +1B434A2AA2E93CB5654868F0A7E049852EE328F6A555AE92CB23702AE1B71B5E6EDF1BDE +ED68CA1E96EDD0A9B214C02A429479FE612C312D8B8BBE3DFD711D25D816709B78125476 +4AC1676AEB53B4CE261AD842C485829A8DBB25956041C5BBACB27B75F0659622F2791718 +110991560C261EC4834C976182843A56DC1918191840DFE95A5FA00624A6C24228805545 +4E7EDDCC9CA865B10991C4B73BBC16BBF6F0F4D4058FE9163BAC69EFB2A3269FE9F2A092 +BE8F9D59D9AD9F434998B44AB3892EA4360C38BFB150DA95EEEBA94B419D9D126410188B +475E794541F41D5C9D12D96BEDA86DF04640E6D766F0276BA1D0EE6E3B47A758D8D2D6DA +90B97B6ACFFA7D7BFEDF0BF7101F32248C7C72560F770D52AFCDC8F285846E00F5B0A83F +346B85D71DD49927304D228E2BE7980904A813AD23D5EE752D210FA2EBF72200914C8AA8 +ACD6B586437EAC4287C0D3C569E1969E71797949592DD7E1A65096819C7F3ED6218F1D0E +6FAFF3597787C9AF1C875E66878D55C64B2140B873C14F9D344E80F6E1434D0814B3C55C +7FF47038B2DD9104B7E836E0804B3E4042F5E1627E4C871AF0C42B498BD34475CDFD89CE +72E8D6DEAE27C84CBC4270348B684D5DB84C025A0CDD01F010F345ED7C75251990AC320B +AFF49806BAC46C8E87895DAD7D223A89AACBC9745439B6FB5B8603010AB29F2F9D3EB3D8 +24E2471720BC1ED2EE9BB61682AD6328D642B131780AB02A598BA9806C8327C43E1880D8 +37C5CDEB36BFD7812569F2FCBDF7B68934689238D59AB7D111FBF5BAD7DB4E85148373C9 +6016A50269968F2DB4824C1BA985C6FF1AC4BBB99F57232795F390BEA26222E79BB218A2 +23E68505A11925BCB27A403E5D27C9FB0EAFB29B7B6396CC58431D267FDB5DA11A64662A +EF150E3C268732F5EAC6C2FDF28FA507531ECAEBD55F4B0AB89D8F4C4CD41EAA211EDFD6 +65091948FF530681FBE7919E476C4DBE1397C51E4AA2C4BA1F0BBA3ED714E766E2638ECE +21B08E93C2EE29FB886C75B9436D2ADEB232736CFB5BAEED34EB47FF78CE41C6444377DE +8B7970BB19E9B52F5422305F14BB7AF0BF98F46D1D1E17B13E679C99112388F39827338E +E36498823D40CAB56D7C2749AAFF144D3F89A703F2F416C34592AAA4C6C30A96F3287868 +CE6F6EAA22A55E06F5D353F441E62A851A138B6E26631EF586EFA6952D428AF7D71901A9 +7E5BA59D462E10388C233E191AEEA380D9E2E23579C4345DB63F7691D0378F950B9CD2C2 +C0C17A8CF6144A7E81CDB3A5DAF7F2AE6A5F92E6910CA0D7A50569EA890FF71DD49D5012 +BD3FA623A1331BDE94EA4D2CD2C538AF787632B6339925FD6CBFD8ECBA7CC464B31DFFCA +F79AB027945A2C1E9C058ED8F0F3221A0353961BB2B2EA75876B74EDDDAFB7ABFEA39F38 +36A8E19C9372D3CD704A19B301BAD2801B16BEFF75BCADC90D2EEA514A199105FDAB37EC +8A75B14E67B638CAF1ADFBAF70D38355A66B513BFEDBBA2CC6981C25E364297C873C908E +A288D930A8A18AF24C38B92F520DB5A41D708A438BC39356730D028198A08AD3430237FB +8EC675CE19EAF97C06CDF706B138EAD722EAD2C7C6108A4C474210CE38A7A4EB0FF573DA +59B024BED3579A7C870AFF17EB284527030EAD8F515D18EE490FD5D32545527F38BE7B7D +CE9C1D1283B1771AAD8953E6D89EBC068E1C42C8431D6EC365F736652C4D74C627BC0689 +A3F273D9D9D94FF32CC504AADE91D4E17105EBA804952F566F0849A34B4E150223E5ED27 +786FD43209CC4F4EE8F4DB98D2C1DB336AE17E745DD8EB3D95A9984A632475430B0E80AE +49A5118C73F0E060C7AC98A8F03E9E7BCA9492AE7D5CED0AA5F177E5EA1F6FFB5AA43A13 +76C8FAD9344ECD8E6B64EDA15AA52B37DDE5AEF3242C236D2C5B401000EE78D62A889665 +2553636E765463181099C47679428ED39AD2F77F8F35DC07A726666751D8DF804635DB17 +C4A81D61036E8CE9CE5E441226584EC469082C6C765909DCE05DD9C9D932F295EB587B37 +C7C32818BA4126B809ED89CEC7F14494720018DC93BC5F2635B5F1ADECFC9B4D2B028FFE +AC248B2663FCD7A43E5468B43FA11E3BC439A5B519DFCDDE7403AB81F0771A7D85BCDF08 +B2C1DF316723EBCB4FBCEAA61454F48D6A354FCAA92E58757D9CE79F92166468522C00BC +FFD765E0F3BCCE1C41E1717BDAD21746C86310CB9490510FCE6DB36CAD377215650FD82B +9E3FD5E1188EB4D87A216B9B475DF5B634C39C87DD4B89EBF8DD52E7850E680F9CC7E610 +774D1F96C682B067FDC4456954D74B9D1FF2C18CCB9FB0C059517D174974D58D3376C32A +53A2F6C1E6844152C3EB1E954A095D9EFCF72158B0C58A1B55EB29741FFD07F55030A9EC +945C351CEE57273FBD4ECFDA6EB2A4FC374E1763B50648C68678B5FB5CDA2DA8D87EC85F +738F2C2F2DFD4F93E44CD2BC2BB5B8103073EC603487DB06311F97BBFBACF934E3524EC4 +3006CC8A613AD9DDADE1023D0044F0C27F577900A62888C75FCA2B1F7DC59683028FE95F +78039BACCF4E9710D3594B1205B5B08AAB01B04827A82516467C561E80484C2AF83781E0 +F947645951BC5CA167AADE20C8AE192CF9F800C409971D09BD173FE2FB130D8C543F4B57 +D7170BF0146B6138A12D9B04B717CB244E68A023E96E30918A1CBBC4A17EB994398BD47D +CE04656333D38F705EE4ED3A75E569A68409CBD18DF1FD537ABAE8E5D4E67D45FE12CD4B +5ADE49AA221D208F8C0C93FA8D659A01F2B9AC7869AAB3A69C1DC5B48FB8A91039BBA6E8 +3FE9985115B0B304F0E5293FFE5BC54CC84840EF951EAE7E4A1F0D4D1231E0A2F505F54B +9CC2E373991495EED14DCF911DB949E4FA0016D5DD8D1126BE6A149AACD3B51F26347320 +A064FA81697B41AA19D5EBB8500022559BBCFFEA94E6F6F5C8755D9B669418107341FB18 +6855A75AAB2D1FBCCD70DE7120277E9B9D8C9BAE1CED962255F61D28EE29C001D0758578 +0B24E2F7B0CD7EBE33EE42A55A217C5832730B414D5109844A5E9934CA865AD2AE9127C7 +CAC28FE451C17A44C8C79395762EB7747B2DD7780DA0B2145CD2732B2D62724271FE4B5D +96B882BF2C73F1E2BB9D700B83CE16AE2D6AB9726E12B09872EA940C1FADFEF125F89D09 +1FE5580E48ABF5493F9D8CC50CCCE629D6F8ACAF3998943225C5D2D795A1A10E2C1AC6D8 +B057F4A8225F0B24E4D6410F4A38D75D14601250E427EBFDD43AAF5E5C1EE0CCDB6D4504 +E3F854ED2EF4E8BDFA1F7422AB86B17896E6D3D0B14B81C515B489C3BE5B471461D6901D +B39949A0B137BF9AF0C3A8124BB3FB4C1DC43A9ECCC48DB999E5FEB94B60DF942AE440AA +4E69A70EEE8860EE2CE8570ABFA7519AC16AA1991540596881033B01CDB54E4DB401430B +20696CD808C73AEBB6E61A5C41C96D7FC338E6E92A112ABF427C6E0EB23E278B3E5967BE +13998C6786382093F74E2B067D428E9877F44DF94F6FEC76109987F3D7F13CE7C4C24648 +61128BB2C51BC858F4B87C3B3938698B4CE4CEAC0A73D872D5A43269B11B95D85FDB1F49 +545527BB2AA699944776B9A623DF59DB1B3035A6177A713667D78F7457C950D2664BA6DB +1076009612A6806B24AB931A8466BE6EED4BC7776F1AB926213490BDA0F8E65E84B960D2 +625E6FC88744371574FC22DE9CAC8E37D0F0BEDACE16C034A588888EBA681CB89FB9D2E5 +3F04BAE4629739F91C372321D3F2653E4D24439E6B8AAFD71184436B86AA3D9C0B170A54 +728385BF8B6ECCDB25ED1D3363837400E80789F16FC73CD235568FE7F51385693E41555A +F53AB56069EBF4F2B5D0C7859E988DCCAA37F0AD98EB34169D3E9BF7C664BE123640569D +89F1C34BACC3B967853750B3627FD055A2AE8B2BBD6DDC2F6AC54BC7FF5122A540D0D200 +FF8FCF17DFD821E8034BFFEC18E1CD7DF35D4E1D80614347D92743B7CBE2910AD330A5B1 +C1D5DC95379F601A289069159AC6183E283257AB2C97C8BB3D6500B012BC6A9F47B0A57F +2639AAD56552486847B304AD088CB8AEB07D032C4C275029A69563E350F3D64A67A7B88D +561AB9C9DE1FC593DFC448FAD9E42063AF99A70DC8EFDB928FEFF2225FA1DE159DE073E6 +3A55D312B9B1810B375E116D79617D0F348EB2184E8A150E94223C792193E1A096646EE2 +A0D82C33EBB19E422988824963C50BAAA8598B9D51DB4149A366F621852EF0B17B4A41A2 +3436A438D8E65735F6B4D1E2EF89A12E4002AC8E585BC407EE6F34CD2D7046E042C463EE +EBC4971A00B9A5F29102455E787BC66620D627385BAA3812F6B0BCF03AF1728064E1A8B7 +D7F5574C5DC22F5C0472CBD0E351F430823302827B31BF2338D85F80DDCCD3EA5E49B9A8 +8B8BBE6B0132C8198DA4436F609C27D13E7E561F05E783F04630B3EC03272F33E3F08419 +D5B4C16B386DCA42D17E89D7ACF46F6F4A79BBA082700F7F98327F2C7E62D8B1E6BFAF8C +212819FB632C3DCB4AC92A8A0F94F350FB0BE0C89503CD0A52B3AE4817C2CA7193563FE9 +20CC6F4E24C116AB47AF0E3313702E1E96BD9817C1297C30FC7178314E401E4CB3847ACB +1CBB1A672D928C1945E6629F626F66A679E9E39263C3A6804BA6A7D18F0CD0F1E01FEAFA +7786ECD7026C94DD0310F20E8BF525CF5EB072E1EE59E66FDBF54880401F7F66A4C5D019 +297B0EF4C6D3478BFE76B93FACE72F5CDEFFABEBD78DD06E377787E873CB76C7F5130748 +E42599B216AF2254DDFC5AA8146EA01E76FFA094DD65EBF264C301F1311A53E86082E20A +9B5E98CADFA0A10BE2A96CA3D0A33104911C1EF4CAE7E4E7CE3F6A765952D3E72E914DEB +FC50474634A05EC92FA59914A798E42044484FB6F7E3E5D1AF45828422B971D5E7B91601 +848A2624DC276C47F14441338E47FF6F1741A38939A8B75ADC8702F0553ACD787BD49F4C +D4D2CA40759C000A619BE27C2923D72438EB49D684DBBE48DBC67AF1935C9833B9E25252 +1E2869C7E808FC1ACD822659AC94F94FF2E11174FB7A7D199EDE962C61672D9F5D2C93F1 +BC99052FB782D94B08617E3C7BF232D9EDD6FD466A2ED7E55318F6E789E4A09F636B91E9 +6EE41F556224A8108BE1CFB2A83A57BA6C8995B6F7A5BE1D454A18CBF2E71FFC4D23A3B4 +9A202FEFF154CCE053BFABCC83CE4FE091E31B4759761F3D535348EF85AE276108592DCA +9A84E1EA28786F871636712C1B85B412DFE705AC768AC8F5B65BD49CE921CDDB5C4D41DF +BB2A7F14263AD2295F25ACFBF3F621D19437F0DDCB174280EA65836E9DCE638364E04085 +29F239946EB500E4455E7B79A412EB03C72D7D18A1EFC6A5C86AA2987C43E3987A5EF3F4 +F35712C790EB5137ABC92B2DAE1CD4E06E21B0DC03E2503687BA0DB73A4DDDEFB41C3BF5 +199ED14731480556C59F1127993C587517CC2406EFA6529122D90D9A9E4C1400B97B5DA0 +3A17AC4C5E238267969046365CA9ADE8D7C76746091704DF72709098602891ED11EE7AF8 +FD7B26DDE5E9CBD0BAB0E2E8C2B6BD49F2FF4CD016EE88B55F087152E7B2E4F67D081FAB +847050548D26D0FE5365833D2A4791018284552C1F40D9ECE2605A3BE0EE2ED5DECE4D4D +A8D5D81ED6101786D8AF3E5EBEB78FBECD7D3B471FF8C6900E12D0F45671D44DA582421F +9BBD5759CDCC9FEE1991520E8F84BB8ACA4A370237E4C4FF92BE8EE6C307DFC47078E167 +DA4C7B2740B9A429012F4BB8519507F2A18F51BDD82168B9576E29531A5B26CD7B0FD7DB +6E346CAB301B33CEBEE1F3D61D73B7D6145F89985653445FA519F91597A0F984DADE3094 +7109124D39A2A7E6D1CFDAF96A73FA0849075111F1ABC010A6871CC05709441C20CEF9B9 +A9AD1A8B1C207D0FE1E7D9D238D0A65EDAFE0BB3802D68CBF0B4CC151A8B330DD04E07DE +C3329735761D7FDE1ACC1B0E86566891E6AE571EB4936A3BC13A3684A52CAF7B7BD84C73 +C68F436156F5A1F05A1898FEAD0F35CF7778CC824139B47484C71C4EE3625F86D1B12317 +7620B46984D92F7C1D38D392F8981CA76FD1678CFDD43FA5F2A5B5F92FEDFF593F699866 +F063DA7E0AD329FF3C45A2236A3F7A6D420E3A66B2BE1BFBF1CC584BE3B68BA2714DB085 +1B803EB1A075C6B1495099C0A5CC7C51369BE2A79E23D793BCD72A8BD7DEC3E180ABF90D +D5D4137A796716083BBDD2C75EAEE01531EABFBD93F8D442525DD798E799D7EA30AB15BD +9A20FE527E524FD7D6BD01884C12044BD7E81DE8293F50F63201D31838FDC0C7B20EEB93 +2372EA2F80F325EBE41BFC037B9FFB5150E421E2E785B5DDB910C3569DCE72A9441AA858 +D0325B3BF2FB3FE83A3D558A63AED58F48C5ACD609D5E1B048A6B519E061E601F4387F03 +7049B8CD97F402EED07DF88A9FB133E9DE42A205727495050C9C6B9D346E0B159C704A3B +99F4F4A11A7B530F48BA5EFE0C6141F6F973C844BD43119D3AF52E22D2C6B615E53FB90B +E1683719BC94124D51559326EDCFE600F75B0427CCE88D215A5B57F6DC59F504F2A7AC5B +2B90F94AD673C8872A03DCDEB8712634E1BA3CB2E227ED6535160B62FABBC22B7FBA8174 +70E62F61792B40AAA5454010B2B008FB1DB7C11038CB98C8CD5401C95DB173A4AFD3CC0F +7E5F19B6DFDC8BDF118786ECE351307B0E4C30233C0177781085FA1B2C5D1EF51BF9490B +B6D1CD1C18F0782098F9E484F9420D635C79D6AC0740B7AE70BBBFEAF8B8958BD921D2A9 +798546BDD7858F810FEB5D84CF411AA3827A50420FE741BC3812CDE1865F4A2EF6A25A4C +ED7EB24CCD38095AFE425D3B0A90539A1CD93DE3F35B020D047EFCE7E1C5C18633B419A2 +1167ACFD3CC3EE0629C0717AE994F151BEFF9EF0AF6E0F14358FBFBA8B61D669ADA8C47C +AA03859AD7E8C07FC39514A8A85E5C5D02B5DDB48725BC15B70AB80FF7F563D481106810 +D8DF1EE07EAF9DB56374124F654CCB454E3C7B0BB490E0D9CB50460E1857C32C95021954 +35C010736A65A00FC28A348ECD4B494F5FEF4D236FBCB951535C546F248F0BAA11F372DD +67F838667C2657A7ABC4631530F275D7A5ED73DEC263A1749630C251ED3F5B9708876730 +0ED8DBD0F588D874267EE87E8486B700B58DE87DA46980B752B5EAA853699AE65D50A6D5 +1A41D217244B8BC5C39D98272731E8D605EEABE0E6E487BC89F5962D2423DAF0C580D424 +719EBA7E9FC3C8C49AA2ED9BF1B679C51EC07D7C4F4401DA63B66AF7061BAE89C443718E +EEA6FBD03E21DDAD5A1B2C251FF101AADE3FF3243F71CA14F19F71E3CB8689BE24E506C3 +C2E9BF2ADC82BFDBAD0C07082B75EAE1ECD31A8B90B9A582FEC64B65A8DF81E54B867EEB +E71C191443897E25FAC6EDE419F11912D284F8819AF00617BB03330055E5C49023BD472E +B32FE903E2C3A3BD9452389DA13CB1E4662ABFE88ABCA6DF0E55878CADFE425B8BF42313 +9107696719E947249B70C02251E24CBB3F3E027245651181113F3C2DDA0FF61B1243B6C4 +CDB870D3E05B7DA867C1853A6F8E53CDDD654831048A6F58EEDE299A70E0C18C02600DA3 +7D1507535286BD1C167BF37F925C8468967709EDBF94DFE0BFCFF11F0B715C77BF1FF7D7 +0BD8258DBDEE61ED4785F85DF2C52157FEC3C01282226FCC96E0ED8CDC8874A209E54A9C +0E8EDA0887E0561CE0B3ECBAB1019F39132E6DA0FE6761379C4424EFC66C36EB4AD7D125 +B88A0A7C19ABABD4A60FBDF0CC1414A77837EB57609D6E4C5DA8A37D18B05B4F755776FC +1930C15DFA2B545D8DCC65B7C8C4A3B9A8DBFC8C64CF90C1047828084070516FF3897E5C +CD223CA4E5DE09834C960D0483F48156CB48B73EB3387A01208AC9991949027675AB9AAF +B3D1AE8791DDA72EEA9053C50218F89B65935D6E40979F583456658C00C593034A067B3F +5B9F7177E6032F1F6BC96AD544F8B98472724D7F48C91D08B4CE91B5EE736A22996CD971 +34E2D4221E0891CA4C8708A6059DB1C48350106A304F7000A1D165D44CCD6F6EE7EA5434 +4F5506C13BA5D12A04548D75D266E0A027DE905EB4DF15ECA1CDFA1D4EE0B9D650AFF4A6 +3ED6A0AD78D63938669B505CD5B799DDB4A3BAD89CAB921F18D26DC9B581B0E28EA395A2 +349B5909107EE11E9CC364961A335C913A34094E63C9163E45A5FF43D3B58E5101E8E2F0 +AFCE604BC96F676F942301846A6F3C54AF5A4D60F37B7A4C3BE982FDEE76F0B8 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +{restore}if diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..ec408f7 --- /dev/null +++ b/install-sh @@ -0,0 +1,234 @@ +#!/bin/sh +# +# "$Id: install-sh 10317 2012-03-01 00:05:55Z mike $" +# +# Install a program, script, or datafile. +# +# Copyright 2008-2012 by Apple Inc. +# +# This script is not compatible with BSD (or any other) install program, as it +# allows owner and group changes to fail with a warning and makes sure that the +# destination directory permissions are as specified - BSD install and the +# original X11 install script did not change permissions of existing +# directories. It also does not support the transform options since CUPS does +# not use them... +# +# Original script from X11R5 (mit/util/scripts/install.sh) +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. + +# set DOITPROG to echo to test this script +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# Force umask to 022... +umask 022 + +# put in absolute paths if you don't have them in your path; or use env. vars. +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" +gzipprog="${GZIPPROG-gzip}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +gzipcp () ( + # gzipcp from to + $gzipprog -9 <"$1" >"$2" +) + +while [ x"$1" != x ]; do + case $1 in + -c) + instcmd="$cpprog" + shift + continue + ;; + + -d) + dir_arg=true + shift + continue + ;; + + -m) + chmodcmd="$chmodprog $2" + shift + shift + continue + ;; + + -o) + chowncmd="$chownprog $2" + shift + shift + continue + ;; + + -g) + chgrpcmd="$chgrpprog $2" + shift + shift + continue + ;; + + -s) + stripcmd="$stripprog" + shift + continue + ;; + + -z) + instcmd="gzipcp" + shift + continue + ;; + + *) + if [ x"$src" = x ]; then + src="$1" + else + dst="$1" + fi + shift + continue + ;; + esac +done + +if [ x"$src" = x ]; then + echo "install-sh: No input file specified" + exit 1 +fi + +if [ x"$dir_arg" != x ]; then + dst="$src" + src="" + + if [ -d "$dst" ]; then + instcmd=: + else + instcmd=$mkdirprog + fi +else + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if [ ! -f "$src" -a ! -d "$src" ]; then + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ]; then + echo "install: No destination specified" + exit 1 + fi + + # If destination is a directory, append the input filename. + if [ -d "$dst" ]; then + dst="$dst/`basename $src`" + fi +fi + +## this sed command emulates the dirname command +dstdir="`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`" + +# Make sure that the destination directory exists. +# This part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then + defaultIFS=' + ' + IFS="${IFS-${defaultIFS}}" + + oIFS="${IFS}" + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS="${oIFS}" + + pathcomp='' + + while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ]; then $doit $mkdirprog "${pathcomp}"; fi + + pathcomp="${pathcomp}/" + done +fi + +if [ x"$dir_arg" != x ]; then + # Make a directory... + $doit $instcmd $dst || exit 1 + + # Allow chown/chgrp to fail, but log a warning + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst || echo "warning: Unable to change owner of $dst!"; fi + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst || echo "warning: Unable to change group of $dst!"; fi + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst || exit 1; fi +else + # Install a file... + dstfile="`basename $dst`" + + # Check the destination file - for libraries just use the "-x" option + # to strip... + case "$dstfile" in + *.a | *.dylib | *.sl | *.sl.* | *.so | *.so.*) + stripopt="-x" + ;; + *) + stripopt="" + ;; + esac + + # Make a temp file name in the proper directory. + dsttmp="$dstdir/#inst.$$#" + + # Move or copy the file name to the temp name + $doit $instcmd $src $dsttmp || exit 1 + + # Update permissions and strip as needed, then move to the final name. + # If the chmod, strip, rm, or mv commands fail, remove the installed + # file... + if [ x"$stripcmd" != x ]; then $doit $stripcmd $stripopt "$dsttmp" || echo "warning: Unable to strip $dst!"; fi + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp" || echo "warning: Unable to change owner of $dst!"; fi + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp" || echo "warning: Unable to change group of $dst!"; fi + + trap "rm -f ${dsttmp}" 0 && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; fi && + $doit $rmcmd -f "$dstdir/$dstfile" && + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" +fi + +exit 0 diff --git a/locale/Dependencies b/locale/Dependencies new file mode 100644 index 0000000..4543566 --- /dev/null +++ b/locale/Dependencies @@ -0,0 +1,28 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +checkpo.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +checkpo.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +checkpo.o: ../cups/language.h ../cups/string-private.h ../config.h +checkpo.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +checkpo.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +checkpo.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +checkpo.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +checkpo.o: ../cups/transcode.h ../cups/thread-private.h +po2strings.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +po2strings.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +po2strings.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +po2strings.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +po2strings.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +po2strings.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +po2strings.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +po2strings.o: ../cups/language-private.h ../cups/transcode.h +po2strings.o: ../cups/thread-private.h +translate.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +translate.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +translate.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +translate.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +translate.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +translate.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +translate.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +translate.o: ../cups/language-private.h ../cups/transcode.h +translate.o: ../cups/thread-private.h diff --git a/locale/Makefile b/locale/Makefile new file mode 100644 index 0000000..331aed5 --- /dev/null +++ b/locale/Makefile @@ -0,0 +1,219 @@ +# +# "$Id: Makefile 10270 2012-02-13 17:13:21Z mike $" +# +# Locale file makefile for CUPS. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 1993-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +OBJS = checkpo.o po2strings.o strings2po.o translate.o +TARGETS = checkpo po2strings strings2po translate + + +# +# Make everything... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + $(RM) $(TARGETS) $(OBJS) + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: $(INSTALL_LANGUAGES) + +install-languages: + $(INSTALL_DIR) -m 755 $(LOCALEDIR) + for loc in $(LANGUAGES) ; do \ + if test -f cups_$$loc.po; then \ + $(INSTALL_DIR) -m 755 $(LOCALEDIR)/$$loc ; \ + $(INSTALL_DATA) cups_$$loc.po $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ + fi ; \ + done + +install-langbundle: po2strings + $(INSTALL_DIR) -m 755 "$(BUILDROOT)$(BUNDLEDIR)/Resources/English.lproj" + $(INSTALL_DATA) cups.strings "$(BUILDROOT)$(BUNDLEDIR)/Resources/English.lproj" + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: $(UNINSTALL_LANGUAGES) + +uninstall-languages: + -for loc in $(LANGUAGES) ; do \ + $(RM) $(LOCALEDIR)/$$loc/cups_$$loc.po ; \ + done + +uninstall-langbundle: + $(RM) "$(BUILDROOT)$(BUNDLEDIR)/Resources/English.lproj/cups.strings" + + +# +# pot - Creates/updates the cups.pot template file, merges changes into existing +# message catalogs, and updates the cups.strings file. We don't use +# xgettext to update the cups.strings file due to known xgettext bugs. +# + +pot: checkpo po2strings + echo Updating cups.pot... + mv cups.pot cups.pot.bck + touch cups.pot + cd ..; xgettext -o locale/cups.pot -cTRANSLATORS -s \ + --keyword=_ --no-wrap \ + --copyright-holder="Apple Inc." \ + --package-name="CUPS" --package-version="1.5" \ + --msgid-bugs-address="http://www.cups.org/str.php" \ + */*.c */*.cxx + (cat cups.header; tail +6 cups.pot; cat cups.footer) > cups.pot.N + mv cups.pot.N cups.pot + echo Checking cups.pot... + ./checkpo cups.pot + for loc in *.po; do \ + echo Merging changes into cups_$$loc... ; \ + msgmerge -o $$loc -s -N --no-location $$loc cups.pot ; \ + done + echo Updating cups.strings... + ./po2strings cups.pot cups.strings + + +# +# checkpo - A simple utility to check PO files for correct translation +# strings. Dependency on static library is deliberate. +# +# checkpo filename.po [... filenameN.po] +# + +checkpo: checkpo.o ../cups/$(LIBCUPSSTATIC) + echo Linking $<... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o checkpo checkpo.o \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + +checkall: checkpo + for file in *.po; do \ + ./checkpo $$file; \ + done + + +# +# po2strings - A simple utility which uses iconv to convert GNU gettext +# message catalogs to Mac OS X .strings files. +# +# po2strings filename.po filename.strings +# + +po2strings: po2strings.o ../cups/$(LIBCUPSSTATIC) + echo Linking $<... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o po2strings po2strings.o \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + + +# +# strings2po - A simple utility which uses iconv to convert Mac OS X +# .strings files to GNU gettext message catalogs. +# +# strings2po filename.strings filename.po +# + +strings2po: strings2po.o + echo Linking $<... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o strings2po strings2po.o + + +# +# translate - A simple utility which uses Google to translate the cups.pot +# file to one of several languages. +# +# translate outfile language +# + +translate: translate.o ../cups/$(LIBCUPSSTATIC) + echo Linking $<... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o translate translate.o \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 10270 2012-02-13 17:13:21Z mike $". +# diff --git a/locale/checkpo.c b/locale/checkpo.c new file mode 100644 index 0000000..479fde8 --- /dev/null +++ b/locale/checkpo.c @@ -0,0 +1,413 @@ +/* + * "$Id: checkpo.c 9384 2010-11-22 07:06:39Z mike $" + * + * Verify that translations in the .po file have the same number and type of + * printf-style format strings. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Usage: + * + * checkpo filename.po [... filenameN.po] + * + * Compile with: + * + * gcc -o checkpo checkpo.c `cups-config --libs` + * + * Contents: + * + * main() - Validate .po files. + * abbreviate() - Abbreviate a message string as needed. + * collect_formats() - Collect all of the format strings in the msgid. + * free_formats() - Free all of the format strings. + */ + +#include + + +/* + * Local functions... + */ + +static char *abbreviate(const char *s, char *buf, int bufsize); +static cups_array_t *collect_formats(const char *id); +static void free_formats(cups_array_t *fmts); + + +/* + * 'main()' - Validate .po files. + */ + +int /* O - Exit code */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + cups_array_t *po; /* .po file */ + _cups_message_t *msg; /* Current message */ + cups_array_t *idfmts, /* Format strings in msgid */ + *strfmts; /* Format strings in msgstr */ + char *idfmt, /* Current msgid format string */ + *strfmt; /* Current msgstr format string */ + int fmtidx; /* Format index */ + int status, /* Exit status */ + pass, /* Pass/fail status */ + untranslated; /* Untranslated messages */ + char idbuf[80], /* Abbreviated msgid */ + strbuf[80]; /* Abbreviated msgstr */ + + + if (argc < 2) + { + puts("Usage: checkpo filename.po [... filenameN.po]"); + return (1); + } + + /* + * Check every .po file on the command-line... + */ + + for (i = 1, status = 0; i < argc; i ++) + { + /* + * Use the CUPS .po loader to get the message strings... + */ + + if ((po = _cupsMessageLoad(argv[i], 1)) == NULL) + { + perror(argv[i]); + return (1); + } + + if (i > 1) + putchar('\n'); + printf("%s: ", argv[i]); + fflush(stdout); + + /* + * Scan every message for a % string and then match them up with + * the corresponding string in the translation... + */ + + pass = 1; + untranslated = 0; + + for (msg = (_cups_message_t *)cupsArrayFirst(po); + msg; + msg = (_cups_message_t *)cupsArrayNext(po)) + { + /* + * Make sure filter message prefixes are not translated... + */ + + if (!strncmp(msg->id, "ALERT:", 6) || !strncmp(msg->id, "CRIT:", 5) || + !strncmp(msg->id, "DEBUG:", 6) || !strncmp(msg->id, "DEBUG2:", 7) || + !strncmp(msg->id, "EMERG:", 6) || !strncmp(msg->id, "ERROR:", 6) || + !strncmp(msg->id, "INFO:", 5) || !strncmp(msg->id, "NOTICE:", 7) || + !strncmp(msg->id, "WARNING:", 8)) + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Bad prefix on filter message \"%s\"\n", + abbreviate(msg->id, idbuf, sizeof(idbuf))); + } + + idfmt = msg->id + strlen(msg->id) - 1; + if (idfmt >= msg->id && *idfmt == '\n') + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Trailing newline in message \"%s\"\n", + abbreviate(msg->id, idbuf, sizeof(idbuf))); + } + + for (; idfmt >= msg->id; idfmt --) + if (!isspace(*idfmt & 255)) + break; + + if (idfmt >= msg->id && *idfmt == '!') + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Exclamation in message \"%s\"\n", + abbreviate(msg->id, idbuf, sizeof(idbuf))); + } + + if ((idfmt - 2) >= msg->id && !strncmp(idfmt - 2, "...", 3)) + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Ellipsis in message \"%s\"\n", + abbreviate(msg->id, idbuf, sizeof(idbuf))); + } + + + if (!msg->str || !msg->str[0]) + { + untranslated ++; + continue; + } + else if (strchr(msg->id, '%')) + { + idfmts = collect_formats(msg->id); + strfmts = collect_formats(msg->str); + fmtidx = 0; + + for (strfmt = (char *)cupsArrayFirst(strfmts); + strfmt; + strfmt = (char *)cupsArrayNext(strfmts)) + { + if (isdigit(strfmt[1] & 255) && strfmt[2] == '$') + { + /* + * Handle positioned format stuff... + */ + + fmtidx = strfmt[1] - '1'; + strfmt += 3; + if ((idfmt = (char *)cupsArrayIndex(idfmts, fmtidx)) != NULL) + idfmt ++; + } + else + { + /* + * Compare against the current format... + */ + + idfmt = (char *)cupsArrayIndex(idfmts, fmtidx); + } + + fmtidx ++; + + if (!idfmt || strcmp(strfmt, idfmt)) + break; + } + + if (cupsArrayCount(strfmts) != cupsArrayCount(idfmts) || strfmt) + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Bad translation string \"%s\"\n for \"%s\"\n", + abbreviate(msg->str, strbuf, sizeof(strbuf)), + abbreviate(msg->id, idbuf, sizeof(idbuf))); + fputs(" Translation formats:", stdout); + for (strfmt = (char *)cupsArrayFirst(strfmts); + strfmt; + strfmt = (char *)cupsArrayNext(strfmts)) + printf(" %s", strfmt); + fputs("\n Original formats:", stdout); + for (idfmt = (char *)cupsArrayFirst(idfmts); + idfmt; + idfmt = (char *)cupsArrayNext(idfmts)) + printf(" %s", idfmt); + putchar('\n'); + putchar('\n'); + } + + free_formats(idfmts); + free_formats(strfmts); + } + + /* + * Only allow \\, \n, \r, \t, \", and \### character escapes... + */ + + for (strfmt = msg->str; *strfmt; strfmt ++) + if (*strfmt == '\\' && + strfmt[1] != '\\' && strfmt[1] != 'n' && strfmt[1] != 'r' && + strfmt[1] != 't' && strfmt[1] != '\"' && !isdigit(strfmt[1] & 255)) + { + if (pass) + { + pass = 0; + puts("FAIL"); + } + + printf(" Bad escape \\%c in filter message \"%s\"\n" + " for \"%s\"\n", strfmt[1], + abbreviate(msg->str, strbuf, sizeof(strbuf)), + abbreviate(msg->id, idbuf, sizeof(idbuf))); + break; + } + } + + if (pass) + { + if ((untranslated * 10) >= cupsArrayCount(po) && + strcmp(argv[i], "cups.pot")) + { + /* + * Only allow 10% of messages to be untranslated before we fail... + */ + + pass = 0; + puts("FAIL"); + printf(" Too many untranslated messages (%d of %d)\n", + untranslated, cupsArrayCount(po)); + } + else if (untranslated > 0) + printf("PASS (%d of %d untranslated)\n", untranslated, + cupsArrayCount(po)); + else + puts("PASS"); + } + + if (!pass) + status = 1; + + _cupsMessageFree(po); + } + + return (status); +} + + +/* + * 'abbreviate()' - Abbreviate a message string as needed. + */ + +static char * /* O - Abbreviated string */ +abbreviate(const char *s, /* I - String to abbreviate */ + char *buf, /* I - Buffer */ + int bufsize) /* I - Size of buffer */ +{ + char *bufptr; /* Pointer into buffer */ + + + for (bufptr = buf, bufsize -= 4; *s && bufsize > 0; s ++) + { + if (*s == '\n') + { + if (bufsize < 2) + break; + + *bufptr++ = '\\'; + *bufptr++ = 'n'; + bufsize -= 2; + } + else if (*s == '\t') + { + if (bufsize < 2) + break; + + *bufptr++ = '\\'; + *bufptr++ = 't'; + bufsize -= 2; + } + else if (*s >= 0 && *s < ' ') + { + if (bufsize < 4) + break; + + sprintf(bufptr, "\\%03o", *s); + bufptr += 4; + bufsize -= 4; + } + else + { + *bufptr++ = *s; + bufsize --; + } + } + + if (*s) + strcpy(bufptr, "..."); + else + *bufptr = '\0'; + + return (buf); +} + + +/* + * 'collect_formats()' - Collect all of the format strings in the msgid. + */ + +static cups_array_t * /* O - Array of format strings */ +collect_formats(const char *id) /* I - msgid string */ +{ + cups_array_t *fmts; /* Array of format strings */ + char buf[255], /* Format string buffer */ + *bufptr; /* Pointer into format string */ + + + fmts = cupsArrayNew(NULL, NULL); + + while ((id = strchr(id, '%')) != NULL) + { + if (id[1] == '%') + { + /* + * Skip %%... + */ + + id += 2; + continue; + } + + for (bufptr = buf; *id && bufptr < (buf + sizeof(buf) - 1); id ++) + { + *bufptr++ = *id; + + if (strchr("CDEFGIOSUXcdeifgopsux", *id)) + { + id ++; + break; + } + } + + *bufptr = '\0'; + cupsArrayAdd(fmts, strdup(buf)); + } + + return (fmts); +} + + +/* + * 'free_formats()' - Free all of the format strings. + */ + +static void +free_formats(cups_array_t *fmts) /* I - Array of format strings */ +{ + char *s; /* Current string */ + + + for (s = (char *)cupsArrayFirst(fmts); s; s = (char *)cupsArrayNext(fmts)) + free(s); + + cupsArrayDelete(fmts); +} + + +/* + * End of "$Id: checkpo.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/locale/cups.footer b/locale/cups.footer new file mode 100644 index 0000000..490c9d4 --- /dev/null +++ b/locale/cups.footer @@ -0,0 +1,5 @@ + + +# +# End of "$Id$". +# diff --git a/locale/cups.header b/locale/cups.header new file mode 100644 index 0000000..275aef4 --- /dev/null +++ b/locale/cups.header @@ -0,0 +1,27 @@ +# +# "$Id$" +# +# Message catalog template for CUPS. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Notes for Translators: +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# diff --git a/locale/cups.pot b/locale/cups.pot new file mode 100644 index 0000000..72ac93c --- /dev/null +++ b/locale/cups.pot @@ -0,0 +1,7085 @@ +# +# "$Id$" +# +# Message catalog template for CUPS. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Notes for Translators: +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.5\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: systemv/lpstat.c:1876 systemv/lpstat.c:2001 +msgid "\t\t(all)" +msgstr "" + +#: systemv/lpstat.c:1879 systemv/lpstat.c:1882 systemv/lpstat.c:2004 +#: systemv/lpstat.c:2007 +msgid "\t\t(none)" +msgstr "" + +#: berkeley/lpc.c:433 +#, c-format +msgid "\t%d entries" +msgstr "" + +#: systemv/lpstat.c:756 systemv/lpstat.c:772 +#, c-format +msgid "\t%s" +msgstr "" + +#: systemv/lpstat.c:1857 systemv/lpstat.c:1982 +msgid "\tAfter fault: continue" +msgstr "" + +#: systemv/lpstat.c:1481 systemv/lpstat.c:1826 systemv/lpstat.c:1952 +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +#: systemv/lpstat.c:1880 systemv/lpstat.c:2005 +msgid "\tBanner required" +msgstr "" + +#: systemv/lpstat.c:1881 systemv/lpstat.c:2006 +msgid "\tCharset sets:" +msgstr "" + +#: systemv/lpstat.c:1845 systemv/lpstat.c:1970 +msgid "\tConnection: direct" +msgstr "" + +#: systemv/lpstat.c:1836 systemv/lpstat.c:1962 +msgid "\tConnection: remote" +msgstr "" + +#: systemv/lpstat.c:1800 systemv/lpstat.c:1926 +msgid "\tContent types: any" +msgstr "" + +#: systemv/lpstat.c:1884 systemv/lpstat.c:2009 +msgid "\tDefault page size:" +msgstr "" + +#: systemv/lpstat.c:1883 systemv/lpstat.c:2008 +msgid "\tDefault pitch:" +msgstr "" + +#: systemv/lpstat.c:1885 systemv/lpstat.c:2010 +msgid "\tDefault port settings:" +msgstr "" + +#: systemv/lpstat.c:1806 systemv/lpstat.c:1932 +#, c-format +msgid "\tDescription: %s" +msgstr "" + +#: systemv/lpstat.c:1799 systemv/lpstat.c:1925 +msgid "\tForm mounted:" +msgstr "" + +#: systemv/lpstat.c:1878 systemv/lpstat.c:2003 +msgid "\tForms allowed:" +msgstr "" + +#: systemv/lpstat.c:1840 systemv/lpstat.c:1966 +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#: systemv/lpstat.c:1849 systemv/lpstat.c:1974 +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#: systemv/lpstat.c:1853 systemv/lpstat.c:1978 +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#: systemv/lpstat.c:1831 systemv/lpstat.c:1957 +#, c-format +msgid "\tLocation: %s" +msgstr "" + +#: systemv/lpstat.c:1856 systemv/lpstat.c:1981 +msgid "\tOn fault: no alert" +msgstr "" + +#: systemv/lpstat.c:1801 systemv/lpstat.c:1927 +msgid "\tPrinter types: unknown" +msgstr "" + +#: systemv/lpstat.c:1462 +#, c-format +msgid "\tStatus: %s" +msgstr "" + +#: systemv/lpstat.c:1861 systemv/lpstat.c:1875 systemv/lpstat.c:1986 +#: systemv/lpstat.c:2000 +msgid "\tUsers allowed:" +msgstr "" + +#: systemv/lpstat.c:1868 systemv/lpstat.c:1993 +msgid "\tUsers denied:" +msgstr "" + +#: berkeley/lpc.c:435 +msgid "\tdaemon present" +msgstr "" + +#: berkeley/lpc.c:431 +msgid "\tno entries" +msgstr "" + +#: berkeley/lpc.c:403 berkeley/lpc.c:415 +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +#: berkeley/lpc.c:428 +msgid "\tprinting is disabled" +msgstr "" + +#: berkeley/lpc.c:426 +msgid "\tprinting is enabled" +msgstr "" + +#: systemv/lpstat.c:1484 +#, c-format +msgid "\tqueued for %s" +msgstr "" + +#: berkeley/lpc.c:423 +msgid "\tqueuing is disabled" +msgstr "" + +#: berkeley/lpc.c:421 +msgid "\tqueuing is enabled" +msgstr "" + +#: systemv/lpstat.c:1792 systemv/lpstat.c:1918 +msgid "\treason unknown" +msgstr "" + +#: systemv/cupstestppd.c:436 +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +#: systemv/cupstestppd.c:3781 +msgid " Ignore specific warnings." +msgstr "" + +#: systemv/cupstestppd.c:3785 +msgid " Issue warnings instead of errors." +msgstr "" + +#: systemv/cupstestppd.c:392 systemv/cupstestppd.c:397 +msgid " REF: Page 15, section 3.1." +msgstr "" + +#: systemv/cupstestppd.c:387 +msgid " REF: Page 15, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:407 +msgid " REF: Page 19, section 3.3." +msgstr "" + +#: systemv/cupstestppd.c:360 +msgid " REF: Page 20, section 3.4." +msgstr "" + +#: systemv/cupstestppd.c:412 +msgid " REF: Page 27, section 3.5." +msgstr "" + +#: systemv/cupstestppd.c:355 +msgid " REF: Page 42, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:402 +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:372 +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:366 +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:377 +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:382 +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#: berkeley/lpq.c:554 +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#: systemv/cupstestppd.c:571 +#, c-format +msgid " PASS Default%s" +msgstr "" + +#: systemv/cupstestppd.c:506 +msgid " PASS DefaultImageableArea" +msgstr "" + +#: systemv/cupstestppd.c:540 +msgid " PASS DefaultPaperDimension" +msgstr "" + +#: systemv/cupstestppd.c:613 +msgid " PASS FileVersion" +msgstr "" + +#: systemv/cupstestppd.c:657 +msgid " PASS FormatVersion" +msgstr "" + +#: systemv/cupstestppd.c:677 +msgid " PASS LanguageEncoding" +msgstr "" + +#: systemv/cupstestppd.c:697 +msgid " PASS LanguageVersion" +msgstr "" + +#: systemv/cupstestppd.c:749 +msgid " PASS Manufacturer" +msgstr "" + +#: systemv/cupstestppd.c:789 +msgid " PASS ModelName" +msgstr "" + +#: systemv/cupstestppd.c:809 +msgid " PASS NickName" +msgstr "" + +#: systemv/cupstestppd.c:869 +msgid " PASS PCFileName" +msgstr "" + +#: systemv/cupstestppd.c:944 +msgid " PASS PSVersion" +msgstr "" + +#: systemv/cupstestppd.c:849 +msgid " PASS PageRegion" +msgstr "" + +#: systemv/cupstestppd.c:829 +msgid " PASS PageSize" +msgstr "" + +#: systemv/cupstestppd.c:904 +msgid " PASS Product" +msgstr "" + +#: systemv/cupstestppd.c:979 +msgid " PASS ShortNickName" +msgstr "" + +#: systemv/cupstestppd.c:1354 +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#: systemv/cupstestppd.c:1466 +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#: systemv/cupstestppd.c:1325 +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#: systemv/cupstestppd.c:1724 +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +#: systemv/cupstestppd.c:1370 +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1706 +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +#: systemv/cupstestppd.c:1378 +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1729 +msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF." +msgstr "" + +#: systemv/cupstestppd.c:1362 +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +#: systemv/cupstestppd.c:1393 +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1401 +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1436 +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +#: systemv/cupstestppd.c:1427 +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +#: systemv/cupstestppd.c:1410 +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#: systemv/cupsaddsmb.c:282 +msgid " cupsaddsmb [options] -a" +msgstr "" + +#: systemv/cupstestdsc.c:427 +msgid " cupstestdsc [options] -" +msgstr "" + +#: systemv/cupstestppd.c:3776 +msgid " program | cupstestppd [options] -" +msgstr "" + +#: systemv/cupstestppd.c:3708 +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#: systemv/cupstestppd.c:2228 +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#: systemv/cupstestppd.c:3865 +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#: systemv/cupstestppd.c:2298 +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#: systemv/cupstestppd.c:3468 systemv/cupstestppd.c:3517 +#: systemv/cupstestppd.c:3556 +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#: systemv/cupstestppd.c:3422 +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#: systemv/cupstestppd.c:2369 +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2455 +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2944 +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#: systemv/cupstestppd.c:2551 +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:1802 +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:3372 +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2413 systemv/cupstestppd.c:2509 +#: systemv/cupstestppd.c:2595 systemv/cupstestppd.c:2653 +#: systemv/cupstestppd.c:2708 systemv/cupstestppd.c:2763 +#: systemv/cupstestppd.c:2818 systemv/cupstestppd.c:2871 +#: systemv/cupstestppd.c:2993 +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:2353 systemv/cupstestppd.c:2439 +#: systemv/cupstestppd.c:2535 systemv/cupstestppd.c:2622 +#: systemv/cupstestppd.c:2677 systemv/cupstestppd.c:2732 +#: systemv/cupstestppd.c:2787 systemv/cupstestppd.c:2842 +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#: systemv/cupstestppd.c:2887 +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#: systemv/cupstestppd.c:2185 +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#: systemv/cupstestppd.c:1783 +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#: systemv/cupstestppd.c:3500 systemv/cupstestppd.c:3540 +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#: systemv/cupstestppd.c:3408 +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#: systemv/cupstestppd.c:2398 systemv/cupstestppd.c:2494 +#: systemv/cupstestppd.c:2580 systemv/cupstestppd.c:2638 +#: systemv/cupstestppd.c:2693 systemv/cupstestppd.c:2748 +#: systemv/cupstestppd.c:2803 systemv/cupstestppd.c:2855 +#: systemv/cupstestppd.c:2978 +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3101 +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:3086 +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1993 systemv/cupstestppd.c:2034 +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#: systemv/cupstestppd.c:1888 +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:1820 +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#: systemv/cupstestppd.c:1979 systemv/cupstestppd.c:2020 +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#: systemv/cupstestppd.c:1872 +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#: systemv/cupstestppd.c:3594 +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#: systemv/cupstestppd.c:2274 +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#: systemv/cupstestppd.c:3159 systemv/cupstestppd.c:3173 +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#: systemv/cupstestppd.c:3139 +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#: systemv/cupstestppd.c:3313 +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3274 +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#: systemv/cupstestppd.c:3021 +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#: systemv/cupstestppd.c:1943 +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#: systemv/cupstestppd.c:1925 +#, c-format +msgid " %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#: systemv/cupstestppd.c:2143 +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:1148 +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#: systemv/cupstestppd.c:562 +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#: systemv/cupstestppd.c:496 +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:532 +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:1005 +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +#: systemv/cupstestppd.c:725 +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#: systemv/cupstestppd.c:741 +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#: systemv/cupstestppd.c:780 +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:936 +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:897 +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:971 +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1129 +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#: systemv/cupstestppd.c:605 +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:649 +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1193 +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#: systemv/cupstestppd.c:1207 +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#: systemv/cupstestppd.c:3735 systemv/cupstestppd.c:3757 +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#: systemv/cupstestppd.c:1266 +#, c-format +msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters." +msgstr "" + +#: systemv/cupstestppd.c:1239 +#, c-format +msgid " **FAIL** Default translation string for option %s contains 8-bit characters." +msgstr "" + +#: systemv/cupstestppd.c:2081 +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:2126 +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#: systemv/cupstestppd.c:2103 +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#: systemv/cupstestppd.c:582 +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#: systemv/cupstestppd.c:481 +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:517 +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:623 +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:667 +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:1056 +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:687 +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:707 +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:759 +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:799 +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:819 +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:879 +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:954 +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:859 +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1025 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:839 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#: systemv/cupstestppd.c:1078 +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +#: systemv/cupstestppd.c:914 +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:989 +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#: systemv/cupstestppd.c:335 +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#: systemv/cupstestppd.c:347 +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#: systemv/cupstestppd.c:1478 +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +#: systemv/cupstestdsc.c:431 +msgid " -h Show program usage" +msgstr "" + +#: systemv/cupstestdsc.c:234 systemv/cupstestdsc.c:276 +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#: systemv/cupstestdsc.c:305 +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#: systemv/cupstestdsc.c:218 systemv/cupstestdsc.c:258 +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#: systemv/cupstestdsc.c:176 +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +#: systemv/cupstestdsc.c:192 +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#: systemv/cupstestdsc.c:362 +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#: systemv/cupstestdsc.c:342 +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#: systemv/cupstestdsc.c:372 +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#: systemv/cupstestdsc.c:352 +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +#: systemv/cupstestppd.c:1480 +msgid " NO ERRORS FOUND" +msgstr "" + +#: systemv/cupstestdsc.c:395 +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#: systemv/cupstestdsc.c:390 +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#: systemv/cupstestdsc.c:382 +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +#: systemv/cupstestdsc.c:402 +msgid " Warning: file contains binary data." +msgstr "" + +#: systemv/cupstestdsc.c:410 +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#: systemv/cupstestdsc.c:406 +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +#: systemv/cupsctl.c:216 +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +#: systemv/cupsctl.c:218 +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +#: systemv/cupsctl.c:220 +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +#: systemv/cupsctl.c:222 +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +#: systemv/cupsctl.c:224 +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +#: systemv/cupsctl.c:226 +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +#: ppdc/ppdc.cxx:456 +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +#: ppdc/ppdc.cxx:458 +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +#: ppdc/ppdc.cxx:460 +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +#: test/ipptool.c:4383 +msgid " -4 Connect using IPv4." +msgstr "" + +#: test/ipptool.c:4384 +msgid " -6 Connect using IPv6." +msgstr "" + +#: test/ipptool.c:4385 +msgid " -C Send requests using chunking (default)." +msgstr "" + +#: scheduler/cupsfilter.c:1438 scheduler/cupsfilter.c:1465 +msgid " -D Remove the input file when finished." +msgstr "" + +#: ppdc/ppdc.cxx:438 ppdc/ppdhtml.cxx:175 ppdc/ppdpo.cxx:255 +msgid " -D name=value Set named variable to value." +msgstr "" + +#: systemv/cupsctl.c:211 +msgid " -E Enable encryption." +msgstr "" + +#: systemv/cupsaddsmb.c:285 +msgid " -E Encrypt the connection to the server." +msgstr "" + +#: test/ipptool.c:4387 +msgid " -E Test with TLS encryption." +msgstr "" + +#: scheduler/main.c:2062 +msgid " -F Run in the foreground but detach from console." +msgstr "" + +#: systemv/cupsaddsmb.c:287 +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +#: test/ipptool.c:4389 +msgid " -I Ignore errors." +msgstr "" + +#: ppdc/ppdc.cxx:440 ppdc/ppdhtml.cxx:177 ppdc/ppdi.cxx:131 ppdc/ppdpo.cxx:257 +msgid " -I include-dir Add include directory to search path." +msgstr "" + +#: systemv/cupstestppd.c:3780 +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +#: scheduler/cupsfilter.c:1467 +msgid " -J title Set title." +msgstr "" + +#: test/ipptool.c:4390 +msgid " -L Send requests using content-length." +msgstr "" + +#: scheduler/cupsfilter.c:1440 scheduler/cupsfilter.c:1468 +msgid " -P filename.ppd Set PPD file." +msgstr "" + +#: systemv/cupstestppd.c:3782 +msgid " -R root-directory Set alternate root." +msgstr "" + +#: test/ipptool.c:4392 +msgid " -S Test with SSL encryption." +msgstr "" + +#: test/ipptool.c:4394 +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +#: systemv/cupsaddsmb.c:289 +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +#: scheduler/cupsfilter.c:1441 scheduler/cupsfilter.c:1469 +msgid " -U username Set username for job." +msgstr "" + +#: systemv/cupsctl.c:212 +msgid " -U username Specify username." +msgstr "" + +#: test/ipptool.c:4396 +msgid " -V version Set default IPP version." +msgstr "" + +#: systemv/cupstestppd.c:3783 +msgid " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}" +msgstr "" + +#: test/ipptool.c:4398 +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +#: systemv/cupsaddsmb.c:291 +msgid " -a Export all printers." +msgstr "" + +#: scheduler/cupsfilter.c:1470 +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +#: ppdc/ppdc.cxx:442 +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +#: scheduler/main.c:2059 +msgid " -c config-file Load alternate configuration file." +msgstr "" + +#: scheduler/cupsfilter.c:1471 +msgid " -c copies Set number of copies." +msgstr "" + +#: scheduler/cupsfilter.c:1442 +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +#: test/ipptool.c:4400 +msgid " -d name=value Set named variable to value." +msgstr "" + +#: ppdc/ppdc.cxx:444 +msgid " -d output-dir Specify the output directory." +msgstr "" + +#: scheduler/cupsfilter.c:1444 scheduler/cupsfilter.c:1472 +msgid " -d printer Use the named printer." +msgstr "" + +#: scheduler/cupsfilter.c:1446 scheduler/cupsfilter.c:1474 +msgid " -e Use every filter from the PPD file." +msgstr "" + +#: scheduler/main.c:2061 +msgid " -f Run in the foreground." +msgstr "" + +#: test/ipptool.c:4402 +msgid " -f filename Set default request filename." +msgstr "" + +#: scheduler/cupsfilter.c:1476 +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +#: scheduler/main.c:2064 +msgid " -h Show this usage message." +msgstr "" + +#: systemv/cupsaddsmb.c:292 +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +#: systemv/cupsctl.c:213 +msgid " -h server[:port] Specify server address." +msgstr "" + +#: scheduler/cupsfilter.c:1448 scheduler/cupsfilter.c:1478 +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +#: test/ipptool.c:4404 +msgid " -i seconds Repeat the last file with the given time interval." +msgstr "" + +#: scheduler/cupsfilter.c:1450 +msgid " -j job-id[,N] Filter file N from the specified job (default is file 1)." +msgstr "" + +#: scheduler/cupsfilter.c:1480 +msgid " -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +#: scheduler/main.c:2065 +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +#: ppdc/ppdc.cxx:446 +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +#: ppdc/ppdc.cxx:448 +msgid " -m Use the ModelName value as the filename." +msgstr "" + +#: scheduler/cupsfilter.c:1452 +msgid " -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +#: scheduler/cupsfilter.c:1454 +msgid " -n copies Set number of copies." +msgstr "" + +#: test/ipptool.c:4406 +msgid " -n count Repeat the last file the given number of times." +msgstr "" + +#: scheduler/cupsfilter.c:1482 +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +#: ppdc/ppdi.cxx:133 +msgid " -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +#: ppdc/ppdmerge.cxx:370 +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +#: scheduler/cupsfilter.c:1455 +msgid " -o name=value Set option(s)." +msgstr "" + +#: scheduler/cupsfilter.c:1456 +msgid " -p filename.ppd Set PPD file." +msgstr "" + +#: test/ipptool.c:4408 +msgid " -q Be quiet - no output except errors." +msgstr "" + +#: systemv/cupstestppd.c:3787 +msgid " -q Run silently." +msgstr "" + +#: systemv/cupstestppd.c:3788 +msgid " -r Use 'relaxed' open mode." +msgstr "" + +#: test/ipptool.c:4410 +msgid " -t Produce a test report." +msgstr "" + +#: ppdc/ppdc.cxx:450 +msgid " -t Test PPDs instead of generating them." +msgstr "" + +#: scheduler/main.c:2066 +msgid " -t Test the configuration file." +msgstr "" + +#: scheduler/cupsfilter.c:1457 +msgid " -t title Set title." +msgstr "" + +#: scheduler/cupsfilter.c:1458 scheduler/cupsfilter.c:1484 +msgid " -u Remove the PPD file when finished." +msgstr "" + +#: systemv/cupstestppd.c:3789 +msgid " -v Be slightly verbose." +msgstr "" + +#: ppdc/ppdc.cxx:452 ppdc/ppdpo.cxx:259 +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +#: systemv/cupsaddsmb.c:294 +msgid " -v Be verbose (show commands)." +msgstr "" + +#: test/ipptool.c:4411 +msgid " -v Show all attributes sent and received." +msgstr "" + +#: systemv/cupstestppd.c:3790 +msgid " -vv Be very verbose." +msgstr "" + +#: ppdc/ppdc.cxx:454 +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +#: systemv/cupstestppd.c:333 systemv/cupstestppd.c:345 +#: systemv/cupstestppd.c:478 systemv/cupstestppd.c:493 +#: systemv/cupstestppd.c:514 systemv/cupstestppd.c:529 +#: systemv/cupstestppd.c:559 systemv/cupstestppd.c:579 +#: systemv/cupstestppd.c:602 systemv/cupstestppd.c:620 +#: systemv/cupstestppd.c:646 systemv/cupstestppd.c:664 +#: systemv/cupstestppd.c:684 systemv/cupstestppd.c:704 +#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:738 +#: systemv/cupstestppd.c:756 systemv/cupstestppd.c:777 +#: systemv/cupstestppd.c:796 systemv/cupstestppd.c:816 +#: systemv/cupstestppd.c:836 systemv/cupstestppd.c:856 +#: systemv/cupstestppd.c:876 systemv/cupstestppd.c:894 +#: systemv/cupstestppd.c:911 systemv/cupstestppd.c:933 +#: systemv/cupstestppd.c:951 systemv/cupstestppd.c:968 +#: systemv/cupstestppd.c:986 systemv/cupstestppd.c:1002 +#: systemv/cupstestppd.c:1022 systemv/cupstestppd.c:1053 +#: systemv/cupstestppd.c:1075 systemv/cupstestppd.c:1126 +#: systemv/cupstestppd.c:1145 systemv/cupstestppd.c:1189 +#: systemv/cupstestppd.c:1203 systemv/cupstestppd.c:1235 +#: systemv/cupstestppd.c:1262 systemv/cupstestppd.c:1780 +#: systemv/cupstestppd.c:1799 systemv/cupstestppd.c:1817 +#: systemv/cupstestppd.c:1869 systemv/cupstestppd.c:1885 +#: systemv/cupstestppd.c:1922 systemv/cupstestppd.c:1940 +#: systemv/cupstestppd.c:1976 systemv/cupstestppd.c:1990 +#: systemv/cupstestppd.c:2017 systemv/cupstestppd.c:2031 +#: systemv/cupstestppd.c:2077 systemv/cupstestppd.c:2099 +#: systemv/cupstestppd.c:2122 systemv/cupstestppd.c:2139 +#: systemv/cupstestppd.c:2181 systemv/cupstestppd.c:2224 +#: systemv/cupstestppd.c:2271 systemv/cupstestppd.c:2295 +#: systemv/cupstestppd.c:2349 systemv/cupstestppd.c:2365 +#: systemv/cupstestppd.c:2395 systemv/cupstestppd.c:2409 +#: systemv/cupstestppd.c:2435 systemv/cupstestppd.c:2451 +#: systemv/cupstestppd.c:2491 systemv/cupstestppd.c:2505 +#: systemv/cupstestppd.c:2531 systemv/cupstestppd.c:2547 +#: systemv/cupstestppd.c:2577 systemv/cupstestppd.c:2591 +#: systemv/cupstestppd.c:2618 systemv/cupstestppd.c:2635 +#: systemv/cupstestppd.c:2649 systemv/cupstestppd.c:2673 +#: systemv/cupstestppd.c:2690 systemv/cupstestppd.c:2704 +#: systemv/cupstestppd.c:2728 systemv/cupstestppd.c:2745 +#: systemv/cupstestppd.c:2759 systemv/cupstestppd.c:2783 +#: systemv/cupstestppd.c:2800 systemv/cupstestppd.c:2814 +#: systemv/cupstestppd.c:2838 systemv/cupstestppd.c:2852 +#: systemv/cupstestppd.c:2867 systemv/cupstestppd.c:2884 +#: systemv/cupstestppd.c:2940 systemv/cupstestppd.c:2975 +#: systemv/cupstestppd.c:2989 systemv/cupstestppd.c:3017 +#: systemv/cupstestppd.c:3082 systemv/cupstestppd.c:3097 +#: systemv/cupstestppd.c:3135 systemv/cupstestppd.c:3155 +#: systemv/cupstestppd.c:3169 systemv/cupstestppd.c:3368 +#: systemv/cupstestppd.c:3404 systemv/cupstestppd.c:3418 +#: systemv/cupstestppd.c:3464 systemv/cupstestppd.c:3496 +#: systemv/cupstestppd.c:3513 systemv/cupstestppd.c:3536 +#: systemv/cupstestppd.c:3552 systemv/cupstestppd.c:3590 +#: systemv/cupstestppd.c:3731 systemv/cupstestppd.c:3753 +#: systemv/cupstestppd.c:3861 +msgid " FAIL" +msgstr "" + +#: systemv/cupstestppd.c:1286 +msgid " PASS" +msgstr "" + +#: berkeley/lpq.c:560 +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#: berkeley/lpq.c:565 +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#: filter/bannertops.c:784 +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "" + +#: filter/bannertops.c:805 +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "" + +#: filter/bannertops.c:775 +#, c-format +msgid "%.2f x %.2f inches" +msgstr "" + +#: filter/bannertops.c:794 +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "" + +#: systemv/lpstat.c:750 +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#: scheduler/ipp.c:11234 +#, c-format +msgid "%s cannot be changed." +msgstr "" + +#: berkeley/lpc.c:189 +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#: berkeley/lpq.c:651 +#, c-format +msgid "%s is not ready" +msgstr "" + +#: berkeley/lpq.c:644 +#, c-format +msgid "%s is ready" +msgstr "" + +#: berkeley/lpq.c:647 +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#: driver/rastertoescpx.c:1775 driver/rastertopclx.c:1800 +#: filter/rastertoepson.c:985 filter/rastertohp.c:711 +#: filter/rastertolabel.c:1134 +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#: systemv/lpstat.c:754 +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#: scheduler/ipp.c:718 +#, c-format +msgid "%s not supported." +msgstr "" + +#: systemv/lpstat.c:765 +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#: systemv/lpstat.c:770 +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#: berkeley/lpq.c:552 +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#: cups/langprintf.c:86 scheduler/cupsfilter.c:719 systemv/lpadmin.c:805 +#: systemv/lpadmin.c:856 systemv/lpadmin.c:906 systemv/lpadmin.c:962 +#: systemv/lpadmin.c:1060 systemv/lpadmin.c:1113 systemv/lpadmin.c:1170 +#: systemv/lpadmin.c:1481 +#, c-format +msgid "%s: %s" +msgstr "" + +#: systemv/cancel.c:294 systemv/cancel.c:357 +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#: systemv/cupsaccept.c:68 +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#: berkeley/lpq.c:236 berkeley/lpr.c:344 systemv/lp.c:584 +#, c-format +msgid "%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#: systemv/lp.c:231 +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#: systemv/lp.c:219 +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#: systemv/lp.c:505 +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#: systemv/lp.c:461 +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#: systemv/lp.c:480 +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#: berkeley/lpr.c:240 +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#: systemv/lp.c:264 +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#: berkeley/lpr.c:209 +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#: systemv/lpstat.c:231 +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#: systemv/lp.c:138 +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#: systemv/lp.c:168 +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#: systemv/lp.c:391 +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#: berkeley/lpr.c:103 +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#: berkeley/lpq.c:180 berkeley/lprm.c:123 systemv/cancel.c:124 +#: systemv/cupsaccept.c:123 systemv/lp.c:189 systemv/lpstat.c:291 +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#: systemv/lp.c:371 +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#: berkeley/lpr.c:263 +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#: berkeley/lpr.c:153 systemv/lp.c:288 +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#: systemv/lp.c:441 +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#: systemv/lp.c:308 +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#: systemv/cupsaccept.c:141 +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#: systemv/lp.c:354 +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#: berkeley/lpq.c:111 berkeley/lpr.c:84 berkeley/lprm.c:104 +#: systemv/cancel.c:94 systemv/cupsaccept.c:101 systemv/lp.c:116 +#: systemv/lpadmin.c:438 systemv/lpstat.c:137 +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#: systemv/cancel.c:145 +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#: berkeley/lpr.c:125 +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#: systemv/lpstat.c:157 systemv/lpstat.c:171 +#, c-format +msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." +msgstr "" + +#: berkeley/lpq.c:241 berkeley/lpr.c:349 systemv/lp.c:589 +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#: systemv/lp.c:330 +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#: berkeley/lpr.c:352 systemv/lp.c:592 +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#: berkeley/lpr.c:305 systemv/lp.c:537 +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#: berkeley/lpr.c:287 systemv/lp.c:520 +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#: berkeley/lpr.c:396 systemv/lp.c:624 +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#: berkeley/lprm.c:87 berkeley/lprm.c:172 systemv/cancel.c:214 +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#: berkeley/lpq.c:150 +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#: berkeley/lpr.c:274 berkeley/lprm.c:139 systemv/cancel.c:156 +#: systemv/cupsaccept.c:164 systemv/lp.c:496 systemv/lpstat.c:452 +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#: systemv/cupsaccept.c:157 +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#: systemv/lp.c:208 +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#: systemv/lpstat.c:504 systemv/lpstat.c:543 +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#: scheduler/cupsfilter.c:572 +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#: systemv/lp.c:418 +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#: scheduler/cupsfilter.c:463 +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#: systemv/cupsaccept.c:198 +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#: berkeley/lpq.c:97 berkeley/lpr.c:70 berkeley/lprm.c:67 systemv/cancel.c:81 +#: systemv/cupsaccept.c:88 systemv/cupsaddsmb.c:86 systemv/lp.c:102 +#: systemv/lpadmin.c:239 systemv/lpinfo.c:88 systemv/lpmove.c:73 +#: systemv/lpstat.c:102 test/ipptool.c:304 test/ipptool.c:321 +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#: berkeley/lpq.c:295 scheduler/cupsfilter.c:1226 systemv/cancel.c:237 +#: systemv/cupsaddsmb.c:144 systemv/cupsaddsmb.c:171 +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#: systemv/cancel.c:317 +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#: scheduler/cupsfilter.c:429 +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#: ppdc/ppdmerge.cxx:96 +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#: scheduler/cupsfilter.c:667 ppdc/ppdmerge.cxx:112 +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#: scheduler/cupsfilter.c:397 +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#: berkeley/lpq.c:153 systemv/lpstat.c:558 +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#: scheduler/cupsfilter.c:440 +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#: scheduler/cupsfilter.c:1432 +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#: scheduler/cupsfilter.c:421 +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#: berkeley/lpr.c:139 +#, c-format +msgid "%s: Warning - \"%c\" format modifier not supported - output may not be correct." +msgstr "" + +#: systemv/lp.c:468 +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#: systemv/lp.c:487 +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#: systemv/lp.c:175 +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#: systemv/lp.c:378 +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +#: ppdc/sample.c:319 +msgid "-1" +msgstr "" + +#: ppdc/sample.c:310 +msgid "-10" +msgstr "" + +#: ppdc/sample.c:402 +msgid "-100" +msgstr "" + +#: ppdc/sample.c:401 +msgid "-105" +msgstr "" + +#: ppdc/sample.c:309 +msgid "-11" +msgstr "" + +#: ppdc/sample.c:400 +msgid "-110" +msgstr "" + +#: ppdc/sample.c:399 +msgid "-115" +msgstr "" + +#: ppdc/sample.c:308 +msgid "-12" +msgstr "" + +#: ppdc/sample.c:398 +msgid "-120" +msgstr "" + +#: ppdc/sample.c:307 +msgid "-13" +msgstr "" + +#: ppdc/sample.c:306 +msgid "-14" +msgstr "" + +#: ppdc/sample.c:305 +msgid "-15" +msgstr "" + +#: ppdc/sample.c:318 +msgid "-2" +msgstr "" + +#: ppdc/sample.c:418 +msgid "-20" +msgstr "" + +#: ppdc/sample.c:417 +msgid "-25" +msgstr "" + +#: ppdc/sample.c:317 +msgid "-3" +msgstr "" + +#: ppdc/sample.c:416 +msgid "-30" +msgstr "" + +#: ppdc/sample.c:415 +msgid "-35" +msgstr "" + +#: ppdc/sample.c:316 +msgid "-4" +msgstr "" + +#: ppdc/sample.c:414 +msgid "-40" +msgstr "" + +#: ppdc/sample.c:413 +msgid "-45" +msgstr "" + +#: ppdc/sample.c:315 +msgid "-5" +msgstr "" + +#: ppdc/sample.c:412 +msgid "-50" +msgstr "" + +#: ppdc/sample.c:411 +msgid "-55" +msgstr "" + +#: ppdc/sample.c:314 +msgid "-6" +msgstr "" + +#: ppdc/sample.c:410 +msgid "-60" +msgstr "" + +#: ppdc/sample.c:409 +msgid "-65" +msgstr "" + +#: ppdc/sample.c:313 +msgid "-7" +msgstr "" + +#: ppdc/sample.c:408 +msgid "-70" +msgstr "" + +#: ppdc/sample.c:407 +msgid "-75" +msgstr "" + +#: ppdc/sample.c:312 +msgid "-8" +msgstr "" + +#: ppdc/sample.c:406 +msgid "-80" +msgstr "" + +#: ppdc/sample.c:405 +msgid "-85" +msgstr "" + +#: ppdc/sample.c:311 +msgid "-9" +msgstr "" + +#: ppdc/sample.c:404 +msgid "-90" +msgstr "" + +#: ppdc/sample.c:403 +msgid "-95" +msgstr "" + +#: ppdc/sample.c:320 +msgid "0" +msgstr "" + +#: ppdc/sample.c:321 +msgid "1" +msgstr "" + +#: ppdc/sample.c:393 +msgid "1 inch/sec." +msgstr "" + +#: ppdc/sample.c:181 +msgid "1.25x0.25\"" +msgstr "" + +#: ppdc/sample.c:182 +msgid "1.25x2.25\"" +msgstr "" + +#: ppdc/sample.c:441 +msgid "1.5 inch/sec." +msgstr "" + +#: ppdc/sample.c:183 +msgid "1.50x0.25\"" +msgstr "" + +#: ppdc/sample.c:184 +msgid "1.50x0.50\"" +msgstr "" + +#: ppdc/sample.c:185 +msgid "1.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:186 +msgid "1.50x2.00\"" +msgstr "" + +#: ppdc/sample.c:330 +msgid "10" +msgstr "" + +#: ppdc/sample.c:452 +msgid "10 inches/sec." +msgstr "" + +#: ppdc/sample.c:6 +msgid "10 x 11" +msgstr "" + +#: ppdc/sample.c:7 +msgid "10 x 13" +msgstr "" + +#: ppdc/sample.c:8 +msgid "10 x 14" +msgstr "" + +#: ppdc/sample.c:432 +msgid "100" +msgstr "" + +#: ppdc/sample.c:343 +msgid "100 mm/sec." +msgstr "" + +#: ppdc/sample.c:433 +msgid "105" +msgstr "" + +#: ppdc/sample.c:331 +msgid "11" +msgstr "" + +#: ppdc/sample.c:453 +msgid "11 inches/sec." +msgstr "" + +#: ppdc/sample.c:434 +msgid "110" +msgstr "" + +#: ppdc/sample.c:435 +msgid "115" +msgstr "" + +#: ppdc/sample.c:332 +msgid "12" +msgstr "" + +#: ppdc/sample.c:454 +msgid "12 inches/sec." +msgstr "" + +#: ppdc/sample.c:9 +msgid "12 x 11" +msgstr "" + +#: ppdc/sample.c:436 +msgid "120" +msgstr "" + +#: ppdc/sample.c:344 +msgid "120 mm/sec." +msgstr "" + +#: ppdc/sample.c:252 +msgid "120x60dpi" +msgstr "" + +#: ppdc/sample.c:258 +msgid "120x72dpi" +msgstr "" + +#: ppdc/sample.c:333 +msgid "13" +msgstr "" + +#: ppdc/sample.c:241 +msgid "136dpi" +msgstr "" + +#: ppdc/sample.c:334 +msgid "14" +msgstr "" + +#: ppdc/sample.c:335 +msgid "15" +msgstr "" + +#: ppdc/sample.c:337 +msgid "15 mm/sec." +msgstr "" + +#: ppdc/sample.c:10 +msgid "15 x 11" +msgstr "" + +#: ppdc/sample.c:345 +msgid "150 mm/sec." +msgstr "" + +#: ppdc/sample.c:292 +msgid "150dpi" +msgstr "" + +#: ppdc/sample.c:377 +msgid "16" +msgstr "" + +#: ppdc/sample.c:378 +msgid "17" +msgstr "" + +#: ppdc/sample.c:379 +msgid "18" +msgstr "" + +#: ppdc/sample.c:253 +msgid "180dpi" +msgstr "" + +#: ppdc/sample.c:380 +msgid "19" +msgstr "" + +#: ppdc/sample.c:322 +msgid "2" +msgstr "" + +#: ppdc/sample.c:394 +msgid "2 inches/sec." +msgstr "" + +#: ppdc/sample.c:279 +msgid "2-Sided Printing" +msgstr "" + +#: ppdc/sample.c:187 +msgid "2.00x0.37\"" +msgstr "" + +#: ppdc/sample.c:188 +msgid "2.00x0.50\"" +msgstr "" + +#: ppdc/sample.c:189 +msgid "2.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:190 +msgid "2.00x1.25\"" +msgstr "" + +#: ppdc/sample.c:191 +msgid "2.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:192 +msgid "2.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:193 +msgid "2.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:194 +msgid "2.00x5.50\"" +msgstr "" + +#: ppdc/sample.c:195 +msgid "2.25x0.50\"" +msgstr "" + +#: ppdc/sample.c:196 +msgid "2.25x1.25\"" +msgstr "" + +#: ppdc/sample.c:197 +msgid "2.25x4.00\"" +msgstr "" + +#: ppdc/sample.c:198 +msgid "2.25x5.50\"" +msgstr "" + +#: ppdc/sample.c:199 +msgid "2.38x5.50\"" +msgstr "" + +#: ppdc/sample.c:442 +msgid "2.5 inches/sec." +msgstr "" + +#: ppdc/sample.c:200 +msgid "2.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:201 +msgid "2.50x2.00\"" +msgstr "" + +#: ppdc/sample.c:202 +msgid "2.75x1.25\"" +msgstr "" + +#: ppdc/sample.c:203 +msgid "2.9 x 1\"" +msgstr "" + +#: ppdc/sample.c:381 +msgid "20" +msgstr "" + +#: ppdc/sample.c:338 +msgid "20 mm/sec." +msgstr "" + +#: ppdc/sample.c:346 +msgid "200 mm/sec." +msgstr "" + +#: ppdc/sample.c:242 +msgid "203dpi" +msgstr "" + +#: ppdc/sample.c:382 +msgid "21" +msgstr "" + +#: ppdc/sample.c:383 +msgid "22" +msgstr "" + +#: ppdc/sample.c:384 +msgid "23" +msgstr "" + +#: ppdc/sample.c:385 +msgid "24" +msgstr "" + +#: ppdc/sample.c:250 +msgid "24-Pin Series" +msgstr "" + +#: ppdc/sample.c:259 +msgid "240x72dpi" +msgstr "" + +#: ppdc/sample.c:386 +msgid "25" +msgstr "" + +#: ppdc/sample.c:347 +msgid "250 mm/sec." +msgstr "" + +#: ppdc/sample.c:387 +msgid "26" +msgstr "" + +#: ppdc/sample.c:388 +msgid "27" +msgstr "" + +#: ppdc/sample.c:389 +msgid "28" +msgstr "" + +#: ppdc/sample.c:390 +msgid "29" +msgstr "" + +#: ppdc/sample.c:323 +msgid "3" +msgstr "" + +#: ppdc/sample.c:395 +msgid "3 inches/sec." +msgstr "" + +#: ppdc/sample.c:3 +msgid "3 x 5" +msgstr "" + +#: ppdc/sample.c:204 +msgid "3.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:205 +msgid "3.00x1.25\"" +msgstr "" + +#: ppdc/sample.c:206 +msgid "3.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:207 +msgid "3.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:208 +msgid "3.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:209 +msgid "3.25x2.00\"" +msgstr "" + +#: ppdc/sample.c:210 +msgid "3.25x5.00\"" +msgstr "" + +#: ppdc/sample.c:211 +msgid "3.25x5.50\"" +msgstr "" + +#: ppdc/sample.c:212 +msgid "3.25x5.83\"" +msgstr "" + +#: ppdc/sample.c:213 +msgid "3.25x7.83\"" +msgstr "" + +#: ppdc/sample.c:4 +msgid "3.5 x 5" +msgstr "" + +#: ppdc/sample.c:171 +msgid "3.5\" Disk" +msgstr "" + +#: ppdc/sample.c:180 +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "" + +#: ppdc/sample.c:214 +msgid "3.50x1.00\"" +msgstr "" + +#: ppdc/sample.c:391 +msgid "30" +msgstr "" + +#: ppdc/sample.c:339 +msgid "30 mm/sec." +msgstr "" + +#: ppdc/sample.c:348 +msgid "300 mm/sec." +msgstr "" + +#: ppdc/sample.c:243 +msgid "300dpi" +msgstr "" + +#: ppdc/sample.c:419 +msgid "35" +msgstr "" + +#: ppdc/sample.c:255 +msgid "360dpi" +msgstr "" + +#: ppdc/sample.c:254 +msgid "360x180dpi" +msgstr "" + +#: ppdc/sample.c:324 +msgid "4" +msgstr "" + +#: ppdc/sample.c:396 +msgid "4 inches/sec." +msgstr "" + +#: ppdc/sample.c:215 +msgid "4.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:223 +msgid "4.00x13.00\"" +msgstr "" + +#: ppdc/sample.c:216 +msgid "4.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:217 +msgid "4.00x2.50\"" +msgstr "" + +#: ppdc/sample.c:218 +msgid "4.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:219 +msgid "4.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:220 +msgid "4.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:221 +msgid "4.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:222 +msgid "4.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:420 +msgid "40" +msgstr "" + +#: ppdc/sample.c:340 +msgid "40 mm/sec." +msgstr "" + +#: ppdc/sample.c:421 +msgid "45" +msgstr "" + +#: ppdc/sample.c:325 +msgid "5" +msgstr "" + +#: ppdc/sample.c:446 +msgid "5 inches/sec." +msgstr "" + +#: ppdc/sample.c:5 +msgid "5 x 7" +msgstr "" + +#: ppdc/sample.c:422 +msgid "50" +msgstr "" + +#: ppdc/sample.c:423 +msgid "55" +msgstr "" + +#: ppdc/sample.c:326 +msgid "6" +msgstr "" + +#: ppdc/sample.c:447 +msgid "6 inches/sec." +msgstr "" + +#: ppdc/sample.c:224 +msgid "6.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:225 +msgid "6.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:226 +msgid "6.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:227 +msgid "6.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:228 +msgid "6.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:229 +msgid "6.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:230 +msgid "6.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:424 +msgid "60" +msgstr "" + +#: ppdc/sample.c:341 +msgid "60 mm/sec." +msgstr "" + +#: ppdc/sample.c:270 +msgid "600dpi" +msgstr "" + +#: ppdc/sample.c:251 +msgid "60dpi" +msgstr "" + +#: ppdc/sample.c:257 +msgid "60x72dpi" +msgstr "" + +#: ppdc/sample.c:425 +msgid "65" +msgstr "" + +#: ppdc/sample.c:327 +msgid "7" +msgstr "" + +#: ppdc/sample.c:449 +msgid "7 inches/sec." +msgstr "" + +#: ppdc/sample.c:11 +msgid "7 x 9" +msgstr "" + +#: ppdc/sample.c:426 +msgid "70" +msgstr "" + +#: ppdc/sample.c:261 +msgid "720dpi" +msgstr "" + +#: ppdc/sample.c:427 +msgid "75" +msgstr "" + +#: ppdc/sample.c:328 +msgid "8" +msgstr "" + +#: ppdc/sample.c:450 +msgid "8 inches/sec." +msgstr "" + +#: ppdc/sample.c:12 +msgid "8 x 10" +msgstr "" + +#: ppdc/sample.c:231 +msgid "8.00x1.00\"" +msgstr "" + +#: ppdc/sample.c:232 +msgid "8.00x2.00\"" +msgstr "" + +#: ppdc/sample.c:233 +msgid "8.00x3.00\"" +msgstr "" + +#: ppdc/sample.c:234 +msgid "8.00x4.00\"" +msgstr "" + +#: ppdc/sample.c:235 +msgid "8.00x5.00\"" +msgstr "" + +#: ppdc/sample.c:236 +msgid "8.00x6.00\"" +msgstr "" + +#: ppdc/sample.c:237 +msgid "8.00x6.50\"" +msgstr "" + +#: ppdc/sample.c:428 +msgid "80" +msgstr "" + +#: ppdc/sample.c:342 +msgid "80 mm/sec." +msgstr "" + +#: ppdc/sample.c:429 +msgid "85" +msgstr "" + +#: ppdc/sample.c:329 +msgid "9" +msgstr "" + +#: ppdc/sample.c:451 +msgid "9 inches/sec." +msgstr "" + +#: ppdc/sample.c:13 +msgid "9 x 11" +msgstr "" + +#: ppdc/sample.c:14 +msgid "9 x 12" +msgstr "" + +#: ppdc/sample.c:256 +msgid "9-Pin Series" +msgstr "" + +#: ppdc/sample.c:430 +msgid "90" +msgstr "" + +#: ppdc/sample.c:431 +msgid "95" +msgstr "" + +#: berkeley/lpc.c:213 +msgid "?Invalid help command unknown." +msgstr "" + +#: cgi-bin/admin.c:2443 +msgid "A Samba password is required to export printer drivers" +msgstr "" + +#: cgi-bin/admin.c:2439 +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#: scheduler/ipp.c:2430 +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#: scheduler/ipp.c:1034 +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +#: ppdc/sample.c:15 +msgid "A0" +msgstr "" + +#: ppdc/sample.c:16 +msgid "A0 Long Edge" +msgstr "" + +#: ppdc/sample.c:17 +msgid "A1" +msgstr "" + +#: ppdc/sample.c:18 +msgid "A1 Long Edge" +msgstr "" + +#: ppdc/sample.c:37 +msgid "A10" +msgstr "" + +#: ppdc/sample.c:19 +msgid "A2" +msgstr "" + +#: ppdc/sample.c:20 +msgid "A2 Long Edge" +msgstr "" + +#: ppdc/sample.c:21 +msgid "A3" +msgstr "" + +#: ppdc/sample.c:22 +msgid "A3 Long Edge" +msgstr "" + +#: ppdc/sample.c:23 +msgid "A3 Oversize" +msgstr "" + +#: ppdc/sample.c:24 +msgid "A3 Oversize Long Edge" +msgstr "" + +#: ppdc/sample.c:25 +msgid "A4" +msgstr "" + +#: ppdc/sample.c:27 +msgid "A4 Long Edge" +msgstr "" + +#: ppdc/sample.c:26 +msgid "A4 Oversize" +msgstr "" + +#: ppdc/sample.c:28 +msgid "A4 Small" +msgstr "" + +#: ppdc/sample.c:29 +msgid "A5" +msgstr "" + +#: ppdc/sample.c:31 +msgid "A5 Long Edge" +msgstr "" + +#: ppdc/sample.c:30 +msgid "A5 Oversize" +msgstr "" + +#: ppdc/sample.c:32 +msgid "A6" +msgstr "" + +#: ppdc/sample.c:33 +msgid "A6 Long Edge" +msgstr "" + +#: ppdc/sample.c:34 +msgid "A7" +msgstr "" + +#: ppdc/sample.c:35 +msgid "A8" +msgstr "" + +#: ppdc/sample.c:36 +msgid "A9" +msgstr "" + +#: ppdc/sample.c:38 +msgid "ANSI A" +msgstr "" + +#: ppdc/sample.c:39 +msgid "ANSI B" +msgstr "" + +#: ppdc/sample.c:40 +msgid "ANSI C" +msgstr "" + +#: ppdc/sample.c:41 +msgid "ANSI D" +msgstr "" + +#: ppdc/sample.c:42 +msgid "ANSI E" +msgstr "" + +#: ppdc/sample.c:47 +msgid "ARCH C" +msgstr "" + +#: ppdc/sample.c:48 +msgid "ARCH C Long Edge" +msgstr "" + +#: ppdc/sample.c:49 +msgid "ARCH D" +msgstr "" + +#: ppdc/sample.c:50 +msgid "ARCH D Long Edge" +msgstr "" + +#: ppdc/sample.c:51 +msgid "ARCH E" +msgstr "" + +#: ppdc/sample.c:52 +msgid "ARCH E Long Edge" +msgstr "" + +#: cgi-bin/classes.c:169 cgi-bin/printers.c:172 +msgid "Accept Jobs" +msgstr "" + +#: cups/http-support.c:1257 +msgid "Accepted" +msgstr "" + +#: cgi-bin/admin.c:570 +msgid "Add Class" +msgstr "" + +#: cgi-bin/admin.c:883 +msgid "Add Printer" +msgstr "" + +#: cgi-bin/admin.c:444 cgi-bin/admin.c:477 cgi-bin/admin.c:525 +#: cgi-bin/admin.c:535 +msgid "Add RSS Subscription" +msgstr "" + +#: ppdc/sample.c:163 +msgid "Address" +msgstr "" + +#: ppdc/sample.c:172 +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "" + +#: cgi-bin/admin.c:210 cgi-bin/admin.c:284 cgi-bin/admin.c:2864 +msgid "Administration" +msgstr "" + +#: ppdc/sample.c:438 +msgid "Always" +msgstr "" + +#: backend/socket.c:129 +msgid "AppSocket/HP JetDirect" +msgstr "" + +#: ppdc/sample.c:459 +msgid "Applicator" +msgstr "" + +#: scheduler/ipp.c:1159 +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#: scheduler/ipp.c:352 +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +#: ppdc/sample.c:126 +msgid "B0" +msgstr "" + +#: ppdc/sample.c:127 +msgid "B1" +msgstr "" + +#: ppdc/sample.c:137 +msgid "B10" +msgstr "" + +#: ppdc/sample.c:128 +msgid "B2" +msgstr "" + +#: ppdc/sample.c:129 +msgid "B3" +msgstr "" + +#: ppdc/sample.c:130 +msgid "B4" +msgstr "" + +#: ppdc/sample.c:131 +msgid "B5" +msgstr "" + +#: ppdc/sample.c:132 +msgid "B5 Oversize" +msgstr "" + +#: ppdc/sample.c:133 +msgid "B6" +msgstr "" + +#: ppdc/sample.c:134 +msgid "B7" +msgstr "" + +#: ppdc/sample.c:135 +msgid "B8" +msgstr "" + +#: ppdc/sample.c:136 +msgid "B9" +msgstr "" + +#: cups/dest.c:827 +msgid "Bad NULL dests pointer" +msgstr "" + +#: cups/ppd.c:343 +msgid "Bad OpenGroup" +msgstr "" + +#: cups/ppd.c:345 +msgid "Bad OpenUI/JCLOpenUI" +msgstr "" + +#: cups/ppd.c:347 +msgid "Bad OrderDependency" +msgstr "" + +#: cups/ppd-cache.c:148 cups/ppd-cache.c:193 cups/ppd-cache.c:231 +#: cups/ppd-cache.c:237 cups/ppd-cache.c:253 cups/ppd-cache.c:269 +#: cups/ppd-cache.c:278 cups/ppd-cache.c:286 cups/ppd-cache.c:303 +#: cups/ppd-cache.c:311 cups/ppd-cache.c:326 cups/ppd-cache.c:334 +#: cups/ppd-cache.c:352 cups/ppd-cache.c:364 cups/ppd-cache.c:379 +#: cups/ppd-cache.c:391 cups/ppd-cache.c:413 cups/ppd-cache.c:421 +#: cups/ppd-cache.c:439 cups/ppd-cache.c:447 cups/ppd-cache.c:462 +#: cups/ppd-cache.c:470 cups/ppd-cache.c:488 cups/ppd-cache.c:496 +#: cups/ppd-cache.c:523 cups/ppd-cache.c:567 cups/ppd-cache.c:575 +#: cups/ppd-cache.c:583 +msgid "Bad PPD cache file." +msgstr "" + +#: cups/http-support.c:1272 +msgid "Bad Request" +msgstr "" + +#: cups/snmp.c:1002 +msgid "Bad SNMP version number" +msgstr "" + +#: cups/ppd.c:348 +msgid "Bad UIConstraints" +msgstr "" + +#: filter/pstext.c:278 filter/texttops.c:297 filter/texttops.c:309 +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#: filter/texttops.c:472 +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#: filter/textcommon.c:613 +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#: scheduler/ipp.c:1460 +#, c-format +msgid "Bad copies value %d." +msgstr "" + +#: filter/textcommon.c:625 +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +#: cups/ppd.c:356 +msgid "Bad custom parameter" +msgstr "" + +#: cups/http-support.c:1424 scheduler/ipp.c:2549 +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2590 +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#: scheduler/ipp.c:9423 scheduler/ipp.c:9439 scheduler/ipp.c:10652 +#: scheduler/ipp.c:12158 +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#: scheduler/ipp.c:10668 +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +#: cups/util.c:928 +msgid "Bad filename buffer" +msgstr "" + +#: filter/pstext.c:324 filter/pstext.c:362 +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#: filter/texttops.c:364 filter/texttops.c:402 +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +#: scheduler/ipp.c:11250 +msgid "Bad job-priority value." +msgstr "" + +#: scheduler/ipp.c:1490 +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +#: scheduler/ipp.c:1474 +msgid "Bad job-sheets value type." +msgstr "" + +#: scheduler/ipp.c:11280 +msgid "Bad job-state value." +msgstr "" + +#: scheduler/ipp.c:4061 scheduler/ipp.c:4513 scheduler/ipp.c:7267 +#: scheduler/ipp.c:7414 scheduler/ipp.c:8857 scheduler/ipp.c:9126 +#: scheduler/ipp.c:9974 scheduler/ipp.c:10199 scheduler/ipp.c:10548 +#: scheduler/ipp.c:11142 +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#: filter/textcommon.c:637 +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#: scheduler/ipp.c:2194 scheduler/ipp.c:6809 +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2158 scheduler/ipp.c:6773 +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#: scheduler/ipp.c:1506 +#, c-format +msgid "Bad number-up value %d." +msgstr "" + +#: cups/adminutil.c:292 +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#: scheduler/ipp.c:1523 +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "" + +#: scheduler/ipp.c:2633 +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#: scheduler/ipp.c:2694 +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#: scheduler/ipp.c:320 +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#: scheduler/ipp.c:305 +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +#: cgi-bin/admin.c:1485 +msgid "Bad subscription ID" +msgstr "" + +#: filter/pstext.c:337 +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#: filter/texttops.c:377 +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#: filter/pstext.c:375 +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#: filter/texttops.c:416 +#, c-format +msgid "Bad text width: %s" +msgstr "" + +#: cups/ppd.c:358 +msgid "Bad value string" +msgstr "" + +#: cgi-bin/admin.c:3409 cgi-bin/admin.c:3655 +msgid "Banners" +msgstr "" + +#: filter/bannertops.c:666 +msgid "Billing Information: " +msgstr "" + +#: ppdc/sample.c:296 +msgid "Bond Paper" +msgstr "" + +#: backend/usb-darwin.c:1846 +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +#: filter/pstops.c:2072 +msgid "Buffer overflow detected, aborting." +msgstr "" + +#: ppdc/sample.c:263 +msgid "CMYK" +msgstr "" + +#: ppdc/sample.c:372 +msgid "CPCL Label Printer" +msgstr "" + +#: cgi-bin/admin.c:1486 cgi-bin/admin.c:1525 cgi-bin/admin.c:1535 +msgid "Cancel RSS Subscription" +msgstr "" + +#: backend/ipp.c:1899 +msgid "Canceling print job." +msgstr "" + +#: scheduler/ipp.c:2674 +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +#: ppdc/sample.c:288 +msgid "Cassette" +msgstr "" + +#: cgi-bin/admin.c:1708 cgi-bin/admin.c:1872 cgi-bin/admin.c:1884 +#: cgi-bin/admin.c:1895 +msgid "Change Settings" +msgstr "" + +#: scheduler/ipp.c:2206 scheduler/ipp.c:6821 +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +#: cgi-bin/classes.c:195 cgi-bin/classes.c:322 +msgid "Classes" +msgstr "" + +#: cgi-bin/printers.c:182 +msgid "Clean Print Heads" +msgstr "" + +#: scheduler/ipp.c:4965 +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +#: ppdc/sample.c:291 +msgid "Color" +msgstr "" + +#: ppdc/sample.c:262 +msgid "Color Mode" +msgstr "" + +#: berkeley/lpc.c:204 +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +#: cups/snmp.c:1006 +msgid "Community name uses indefinite length" +msgstr "" + +#: backend/ipp.c:775 backend/lpd.c:862 backend/socket.c:395 +msgid "Connected to printer." +msgstr "" + +#: backend/ipp.c:682 backend/lpd.c:685 backend/socket.c:314 +msgid "Connecting to printer." +msgstr "" + +#: cups/http-support.c:1245 +msgid "Continue" +msgstr "" + +#: ppdc/sample.c:374 +msgid "Continuous" +msgstr "" + +#: backend/lpd.c:1008 backend/lpd.c:1140 +msgid "Control file sent successfully." +msgstr "" + +#: backend/ipp.c:1219 backend/lpd.c:460 +msgid "Copying print data." +msgstr "" + +#: cups/http-support.c:1254 +msgid "Created" +msgstr "" + +#: filter/bannertops.c:854 +msgid "Created On: " +msgstr "" + +#: cups/ppd.c:1070 cups/ppd.c:1110 cups/ppd.c:1355 cups/ppd.c:1458 +msgid "Custom" +msgstr "" + +#: ppdc/sample.c:368 +msgid "CustominCutInterval" +msgstr "" + +#: ppdc/sample.c:366 +msgid "CustominTearInterval" +msgstr "" + +#: ppdc/sample.c:352 +msgid "Cut" +msgstr "" + +#: ppdc/sample.c:460 +msgid "Cutter" +msgstr "" + +#: ppdc/sample.c:248 +msgid "Dark" +msgstr "" + +#: ppdc/sample.c:244 +msgid "Darkness" +msgstr "" + +#: backend/lpd.c:1093 +msgid "Data file sent successfully." +msgstr "" + +#: cgi-bin/admin.c:2168 cgi-bin/admin.c:2179 cgi-bin/admin.c:2224 +msgid "Delete Class" +msgstr "" + +#: cgi-bin/admin.c:2253 cgi-bin/admin.c:2264 cgi-bin/admin.c:2309 +msgid "Delete Printer" +msgstr "" + +#: filter/bannertops.c:735 +msgid "Description: " +msgstr "" + +#: ppdc/sample.c:290 +msgid "DeskJet Series" +msgstr "" + +#: scheduler/ipp.c:1426 +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "" + +#: systemv/lpinfo.c:300 +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +#: ppdc/sample.c:445 +msgid "Direct Thermal Media" +msgstr "" + +#: cups/file.c:308 +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#: cups/file.c:280 +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#: cups/file.c:297 +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#: cups/file.c:268 +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#: cups/file.c:253 +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +#: ppdc/sample.c:354 +msgid "Disabled" +msgstr "" + +#: scheduler/ipp.c:7316 +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +#: filter/bannertops.c:820 +msgid "Driver Name: " +msgstr "" + +#: filter/bannertops.c:831 +msgid "Driver Version: " +msgstr "" + +#: ppdc/sample.c:284 +msgid "Duplexer" +msgstr "" + +#: ppdc/sample.c:238 +msgid "Dymo" +msgstr "" + +#: ppdc/sample.c:440 +msgid "EPL1 Label Printer" +msgstr "" + +#: ppdc/sample.c:443 +msgid "EPL2 Label Printer" +msgstr "" + +#: cgi-bin/admin.c:1923 cgi-bin/admin.c:1935 cgi-bin/admin.c:1989 +#: cgi-bin/admin.c:1996 cgi-bin/admin.c:2031 cgi-bin/admin.c:2044 +#: cgi-bin/admin.c:2068 cgi-bin/admin.c:2141 +msgid "Edit Configuration File" +msgstr "" + +#: cups/adminutil.c:337 +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +#: cgi-bin/admin.c:3680 +msgid "Ending Banner" +msgstr "" + +#: ppdc/sample.c:2 +msgid "English" +msgstr "" + +#: systemv/lppasswd.c:193 +msgid "Enter old password:" +msgstr "" + +#: systemv/lppasswd.c:224 +msgid "Enter password again:" +msgstr "" + +#: systemv/lppasswd.c:212 +msgid "Enter password:" +msgstr "" + +#: scheduler/client.c:2441 +msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." +msgstr "" + +#: ppdc/sample.c:73 +msgid "Envelope #10 " +msgstr "" + +#: ppdc/sample.c:74 +msgid "Envelope #11" +msgstr "" + +#: ppdc/sample.c:75 +msgid "Envelope #12" +msgstr "" + +#: ppdc/sample.c:76 +msgid "Envelope #14" +msgstr "" + +#: ppdc/sample.c:77 +msgid "Envelope #9" +msgstr "" + +#: ppdc/sample.c:89 +msgid "Envelope B4" +msgstr "" + +#: ppdc/sample.c:90 +msgid "Envelope B5" +msgstr "" + +#: ppdc/sample.c:91 +msgid "Envelope B6" +msgstr "" + +#: ppdc/sample.c:78 +msgid "Envelope C0" +msgstr "" + +#: ppdc/sample.c:79 +msgid "Envelope C1" +msgstr "" + +#: ppdc/sample.c:80 +msgid "Envelope C2" +msgstr "" + +#: ppdc/sample.c:81 +msgid "Envelope C3" +msgstr "" + +#: ppdc/sample.c:67 +msgid "Envelope C4" +msgstr "" + +#: ppdc/sample.c:68 +msgid "Envelope C5" +msgstr "" + +#: ppdc/sample.c:69 +msgid "Envelope C6" +msgstr "" + +#: ppdc/sample.c:82 +msgid "Envelope C65" +msgstr "" + +#: ppdc/sample.c:83 +msgid "Envelope C7" +msgstr "" + +#: ppdc/sample.c:84 +msgid "Envelope Choukei 3" +msgstr "" + +#: ppdc/sample.c:85 +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +#: ppdc/sample.c:86 +msgid "Envelope Choukei 4" +msgstr "" + +#: ppdc/sample.c:87 +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +#: ppdc/sample.c:70 +msgid "Envelope DL" +msgstr "" + +#: ppdc/sample.c:278 +msgid "Envelope Feed" +msgstr "" + +#: ppdc/sample.c:88 +msgid "Envelope Invite" +msgstr "" + +#: ppdc/sample.c:92 +msgid "Envelope Italian" +msgstr "" + +#: ppdc/sample.c:93 +msgid "Envelope Kaku2" +msgstr "" + +#: ppdc/sample.c:94 +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +#: ppdc/sample.c:95 +msgid "Envelope Kaku3" +msgstr "" + +#: ppdc/sample.c:96 +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +#: ppdc/sample.c:97 +msgid "Envelope Monarch" +msgstr "" + +#: ppdc/sample.c:99 +msgid "Envelope PRC1 " +msgstr "" + +#: ppdc/sample.c:100 +msgid "Envelope PRC1 Long Edge" +msgstr "" + +#: ppdc/sample.c:117 +msgid "Envelope PRC10" +msgstr "" + +#: ppdc/sample.c:118 +msgid "Envelope PRC10 Long Edge" +msgstr "" + +#: ppdc/sample.c:101 +msgid "Envelope PRC2" +msgstr "" + +#: ppdc/sample.c:102 +msgid "Envelope PRC2 Long Edge" +msgstr "" + +#: ppdc/sample.c:103 +msgid "Envelope PRC3" +msgstr "" + +#: ppdc/sample.c:104 +msgid "Envelope PRC3 Long Edge" +msgstr "" + +#: ppdc/sample.c:105 +msgid "Envelope PRC4" +msgstr "" + +#: ppdc/sample.c:106 +msgid "Envelope PRC4 Long Edge" +msgstr "" + +#: ppdc/sample.c:108 +msgid "Envelope PRC5 Long Edge" +msgstr "" + +#: ppdc/sample.c:107 +msgid "Envelope PRC5PRC5" +msgstr "" + +#: ppdc/sample.c:109 +msgid "Envelope PRC6" +msgstr "" + +#: ppdc/sample.c:110 +msgid "Envelope PRC6 Long Edge" +msgstr "" + +#: ppdc/sample.c:111 +msgid "Envelope PRC7" +msgstr "" + +#: ppdc/sample.c:112 +msgid "Envelope PRC7 Long Edge" +msgstr "" + +#: ppdc/sample.c:113 +msgid "Envelope PRC8" +msgstr "" + +#: ppdc/sample.c:114 +msgid "Envelope PRC8 Long Edge" +msgstr "" + +#: ppdc/sample.c:115 +msgid "Envelope PRC9" +msgstr "" + +#: ppdc/sample.c:116 +msgid "Envelope PRC9 Long Edge" +msgstr "" + +#: ppdc/sample.c:98 +msgid "Envelope Personal" +msgstr "" + +#: ppdc/sample.c:119 +msgid "Envelope You4" +msgstr "" + +#: ppdc/sample.c:120 +msgid "Envelope You4 Long Edge" +msgstr "" + +#: ppdc/sample.c:249 +msgid "Epson" +msgstr "" + +#: cgi-bin/admin.c:3723 +msgid "Error Policy" +msgstr "" + +#: filter/rastertopwg.c:403 filter/rastertopwg.c:418 filter/rastertopwg.c:429 +#: filter/rastertopwg.c:440 +msgid "Error sending raster data." +msgstr "" + +#: systemv/lpinfo.c:103 systemv/lpmove.c:88 +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +#: ppdc/sample.c:364 +msgid "Every 10 Labels" +msgstr "" + +#: ppdc/sample.c:356 +msgid "Every 2 Labels" +msgstr "" + +#: ppdc/sample.c:357 +msgid "Every 3 Labels" +msgstr "" + +#: ppdc/sample.c:358 +msgid "Every 4 Labels" +msgstr "" + +#: ppdc/sample.c:359 +msgid "Every 5 Labels" +msgstr "" + +#: ppdc/sample.c:360 +msgid "Every 6 Labels" +msgstr "" + +#: ppdc/sample.c:361 +msgid "Every 7 Labels" +msgstr "" + +#: ppdc/sample.c:362 +msgid "Every 8 Labels" +msgstr "" + +#: ppdc/sample.c:363 +msgid "Every 9 Labels" +msgstr "" + +#: ppdc/sample.c:355 +msgid "Every Label" +msgstr "" + +#: ppdc/sample.c:121 +msgid "Executive" +msgstr "" + +#: cups/http-support.c:1300 +msgid "Expectation Failed" +msgstr "" + +#: cgi-bin/admin.c:2431 cgi-bin/admin.c:2450 +msgid "Export Printers to Samba" +msgstr "" + +#: systemv/cupstestdsc.c:172 systemv/cupstestdsc.c:189 +#: systemv/cupstestdsc.c:214 systemv/cupstestdsc.c:231 +#: systemv/cupstestdsc.c:255 systemv/cupstestdsc.c:273 +#: systemv/cupstestdsc.c:302 systemv/cupstestdsc.c:339 +#: systemv/cupstestdsc.c:349 systemv/cupstestdsc.c:359 +#: systemv/cupstestdsc.c:369 systemv/cupstestdsc.c:379 +#: systemv/cupstestdsc.c:387 +msgid "FAIL" +msgstr "" + +#: ppdc/sample.c:122 +msgid "FanFold German" +msgstr "" + +#: ppdc/sample.c:123 +msgid "FanFold Legal German" +msgstr "" + +#: ppdc/sample.c:124 +msgid "Fanfold US" +msgstr "" + +#: cups/file.c:312 +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#: cups/file.c:287 +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#: cups/file.c:301 +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#: cups/file.c:273 +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#: cups/file.c:259 +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +#: ppdc/sample.c:169 +msgid "File Folder" +msgstr "" + +#: ppdc/sample.c:178 +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "" + +#: scheduler/ipp.c:2569 +#, c-format +msgid "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cupsd.conf\"." +msgstr "" + +#: driver/rastertoescpx.c:1899 driver/rastertopclx.c:1924 +#: filter/rastertoepson.c:1117 filter/rastertohp.c:845 +#: filter/rastertolabel.c:1273 +#, c-format +msgid "Finished page %d." +msgstr "" + +#: ppdc/sample.c:125 +msgid "Folio" +msgstr "" + +#: cups/http-support.c:1279 +msgid "Forbidden" +msgstr "" + +#: filter/imagetoraster.c:1188 +#, c-format +msgid "Formatting page %d." +msgstr "" + +#: cups/ppd.c:699 cups/ppd.c:1259 +msgid "General" +msgstr "" + +#: ppdc/sample.c:268 +msgid "Generic" +msgstr "" + +#: cups/snmp.c:1016 +msgid "Get-Response-PDU uses indefinite length" +msgstr "" + +#: ppdc/sample.c:299 +msgid "Glossy Paper" +msgstr "" + +#: scheduler/ipp.c:4039 scheduler/ipp.c:4439 scheduler/ipp.c:4977 +#: scheduler/ipp.c:7245 scheduler/ipp.c:7392 scheduler/ipp.c:8834 +#: scheduler/ipp.c:9952 scheduler/ipp.c:10177 scheduler/ipp.c:10526 +#: scheduler/ipp.c:11120 +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +#: ppdc/sample.c:264 +msgid "Grayscale" +msgstr "" + +#: ppdc/sample.c:289 +msgid "HP" +msgstr "" + +#: ppdc/sample.c:170 +msgid "Hanging Folder" +msgstr "" + +#: ppdc/sample.c:179 +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "" + +#: cups/ipp.c:1291 cups/ipp.c:1311 cups/ipp.c:1345 +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +#: cups/ipp.c:1254 +msgid "IPP attribute has no name." +msgstr "" + +#: cups/ipp.c:1727 +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +#: cups/ipp.c:1519 +msgid "IPP boolean value not 1 byte." +msgstr "" + +#: cups/ipp.c:1577 +msgid "IPP date value not 11 bytes." +msgstr "" + +#: cups/ipp.c:1748 +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +#: cups/ipp.c:1494 +msgid "IPP enum value not 4 bytes." +msgstr "" + +#: cups/ipp.c:1491 +msgid "IPP integer value not 4 bytes." +msgstr "" + +#: cups/ipp.c:1690 +msgid "IPP language length overflows value." +msgstr "" + +#: cups/ipp.c:1404 +msgid "IPP member name is not empty." +msgstr "" + +#: cups/ipp.c:1237 +msgid "IPP name larger than 32767 bytes." +msgstr "" + +#: cups/ipp.c:1654 +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +#: cups/ipp.c:1623 +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +#: cups/ipp.c:1596 +msgid "IPP resolution value not 9 bytes." +msgstr "" + +#: cups/ipp.c:1707 +msgid "IPP string length overflows value." +msgstr "" + +#: cups/ipp.c:1650 +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +#: cups/ipp.c:1477 +msgid "IPP value larger than 32767 bytes." +msgstr "" + +#: ppdc/sample.c:1 +msgid "ISOLatin1" +msgstr "" + +#: cups/ppd.c:351 +msgid "Illegal control character" +msgstr "" + +#: cups/ppd.c:352 +msgid "Illegal main keyword string" +msgstr "" + +#: cups/ppd.c:353 +msgid "Illegal option keyword string" +msgstr "" + +#: cups/ppd.c:354 +msgid "Illegal translation string" +msgstr "" + +#: cups/ppd.c:355 +msgid "Illegal whitespace character" +msgstr "" + +#: ppdc/sample.c:283 +msgid "Installable Options" +msgstr "" + +#: ppdc/sample.c:286 +msgid "Installed" +msgstr "" + +#: ppdc/sample.c:302 +msgid "IntelliBar Label Printer" +msgstr "" + +#: ppdc/sample.c:301 +msgid "Intellitech" +msgstr "" + +#: cups/http-support.c:1306 +msgid "Internal Server Error" +msgstr "" + +#: cups/ppd.c:342 +msgid "Internal error" +msgstr "" + +#: ppdc/sample.c:167 +msgid "Internet Postage 2-Part" +msgstr "" + +#: ppdc/sample.c:176 +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "" + +#: ppdc/sample.c:168 +msgid "Internet Postage 3-Part" +msgstr "" + +#: ppdc/sample.c:177 +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "" + +#: backend/ipp.c:301 +msgid "Internet Printing Protocol" +msgstr "" + +#: filter/commandtops.c:125 +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +#: cups/ppd.c:1377 +msgid "JCL" +msgstr "" + +#: ppdc/sample.c:53 +msgid "JIS B0" +msgstr "" + +#: ppdc/sample.c:55 +msgid "JIS B1" +msgstr "" + +#: ppdc/sample.c:54 +msgid "JIS B10" +msgstr "" + +#: ppdc/sample.c:56 +msgid "JIS B2" +msgstr "" + +#: ppdc/sample.c:57 +msgid "JIS B3" +msgstr "" + +#: ppdc/sample.c:58 +msgid "JIS B4" +msgstr "" + +#: ppdc/sample.c:59 +msgid "JIS B4 Long Edge" +msgstr "" + +#: ppdc/sample.c:60 +msgid "JIS B5" +msgstr "" + +#: ppdc/sample.c:61 +msgid "JIS B5 Long Edge" +msgstr "" + +#: ppdc/sample.c:62 +msgid "JIS B6" +msgstr "" + +#: ppdc/sample.c:63 +msgid "JIS B6 Long Edge" +msgstr "" + +#: ppdc/sample.c:64 +msgid "JIS B7" +msgstr "" + +#: ppdc/sample.c:65 +msgid "JIS B8" +msgstr "" + +#: ppdc/sample.c:66 +msgid "JIS B9" +msgstr "" + +#: scheduler/ipp.c:10249 +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#: scheduler/ipp.c:4079 scheduler/ipp.c:4309 scheduler/ipp.c:4364 +#: scheduler/ipp.c:4541 scheduler/ipp.c:4987 scheduler/ipp.c:6907 +#: scheduler/ipp.c:7285 scheduler/ipp.c:7432 scheduler/ipp.c:7732 +#: scheduler/ipp.c:8681 scheduler/ipp.c:8703 scheduler/ipp.c:8875 +#: scheduler/ipp.c:9100 scheduler/ipp.c:9143 scheduler/ipp.c:9992 +#: scheduler/ipp.c:10217 scheduler/ipp.c:10566 scheduler/ipp.c:11160 +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#: scheduler/ipp.c:4573 +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "" + +#: scheduler/ipp.c:4567 +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "" + +#: scheduler/ipp.c:4579 +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "" + +#: scheduler/ipp.c:8901 scheduler/ipp.c:9185 scheduler/ipp.c:11175 +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#: scheduler/ipp.c:10231 +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#: scheduler/ipp.c:4094 +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#: scheduler/ipp.c:10006 +#, c-format +msgid "Job #%d is not held." +msgstr "" + +#: cgi-bin/ipp-var.c:1055 +msgid "Job Completed" +msgstr "" + +#: cgi-bin/ipp-var.c:1053 +msgid "Job Created" +msgstr "" + +#: filter/bannertops.c:623 +msgid "Job ID: " +msgstr "" + +#: cgi-bin/ipp-var.c:1059 +msgid "Job Options Changed" +msgstr "" + +#: cgi-bin/ipp-var.c:1057 +msgid "Job Stopped" +msgstr "" + +#: filter/bannertops.c:631 +msgid "Job UUID: " +msgstr "" + +#: scheduler/ipp.c:11258 +msgid "Job is completed and cannot be changed." +msgstr "" + +#: cgi-bin/jobs.c:198 +msgid "Job operation failed:" +msgstr "" + +#: scheduler/ipp.c:11294 scheduler/ipp.c:11313 scheduler/ipp.c:11324 +msgid "Job state cannot be changed." +msgstr "" + +#: scheduler/ipp.c:10097 +msgid "Job subscriptions cannot be renewed." +msgstr "" + +#: cgi-bin/jobs.c:103 cgi-bin/jobs.c:114 cgi-bin/jobs.c:195 +msgid "Jobs" +msgstr "" + +#: backend/lpd.c:183 +msgid "LPD/LPR Host or Printer" +msgstr "" + +#: ppdc/sample.c:239 +msgid "Label Printer" +msgstr "" + +#: ppdc/sample.c:455 +msgid "Label Top" +msgstr "" + +#: scheduler/ipp.c:2215 scheduler/ipp.c:6830 +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +#: ppdc/sample.c:164 +msgid "Large Address" +msgstr "" + +#: ppdc/sample.c:173 +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "" + +#: ppdc/sample.c:300 +msgid "LaserJet Series PCL 4/5" +msgstr "" + +#: ppdc/sample.c:43 +msgid "Letter Oversize" +msgstr "" + +#: ppdc/sample.c:44 +msgid "Letter Oversize Long Edge" +msgstr "" + +#: ppdc/sample.c:245 +msgid "Light" +msgstr "" + +#: cups/ppd.c:350 +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "" + +#: cgi-bin/admin.c:2468 +msgid "List Available Printers" +msgstr "" + +#: filter/imagetoraster.c:668 +msgid "Loading print file." +msgstr "" + +#: filter/bannertops.c:744 +msgid "Location: " +msgstr "" + +#: ppdc/sample.c:281 +msgid "Long-Edge (Portrait)" +msgstr "" + +#: cups/http-support.c:1521 +msgid "Looking for printer." +msgstr "" + +#: filter/bannertops.c:753 +msgid "Make and Model: " +msgstr "" + +#: ppdc/sample.c:277 +msgid "Manual Feed" +msgstr "" + +#: filter/bannertops.c:780 +msgid "Media Dimensions: " +msgstr "" + +#: filter/bannertops.c:800 +msgid "Media Limits: " +msgstr "" + +#: filter/bannertops.c:769 +msgid "Media Name: " +msgstr "" + +#: cups/ppd.c:746 cups/ppd.c:1314 +msgid "Media Size" +msgstr "" + +#: cups/ppd.c:750 cups/ppd.c:1318 ppdc/sample.c:271 +msgid "Media Source" +msgstr "" + +#: ppdc/sample.c:373 +msgid "Media Tracking" +msgstr "" + +#: cups/ppd.c:748 cups/ppd.c:1316 ppdc/sample.c:294 +msgid "Media Type" +msgstr "" + +#: ppdc/sample.c:246 +msgid "Medium" +msgstr "" + +#: cups/ppd.c:339 +msgid "Memory allocation error" +msgstr "" + +#: cups/ppd.c:359 +msgid "Missing CloseGroup" +msgstr "" + +#: cups/ppd.c:340 +msgid "Missing PPD-Adobe-4.x header" +msgstr "" + +#: cups/ppd.c:349 +msgid "Missing asterisk in column 1" +msgstr "" + +#: scheduler/ipp.c:7308 +msgid "Missing document-number attribute." +msgstr "" + +#: cups/adminutil.c:273 +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +#: cgi-bin/admin.c:737 cgi-bin/admin.c:2180 cgi-bin/admin.c:2265 +#: cgi-bin/admin.c:2904 cgi-bin/admin.c:3158 cgi-bin/admin.c:3269 +#: cgi-bin/admin.c:3979 +msgid "Missing form variable" +msgstr "" + +#: scheduler/ipp.c:10620 +msgid "Missing last-document attribute in request." +msgstr "" + +#: cups/pwg-media.c:473 +msgid "Missing media or media-col." +msgstr "" + +#: cups/pwg-media.c:392 +msgid "Missing media-size in media-col." +msgstr "" + +#: scheduler/ipp.c:7862 +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +#: cups/ppd.c:357 +msgid "Missing option keyword" +msgstr "" + +#: scheduler/ipp.c:4220 scheduler/ipp.c:4245 +msgid "Missing requesting-user-name attribute." +msgstr "" + +#: scheduler/ipp.c:488 +msgid "Missing required attributes." +msgstr "" + +#: filter/bannertops.c:222 +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#: cups/adminutil.c:254 +#, c-format +msgid "Missing value on line %d." +msgstr "" + +#: cups/ppd.c:341 +msgid "Missing value string" +msgstr "" + +#: cups/pwg-media.c:380 +msgid "Missing x-dimension in media-size." +msgstr "" + +#: cups/pwg-media.c:386 +msgid "Missing y-dimension in media-size." +msgstr "" + +#: systemv/lpinfo.c:470 +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +#: cgi-bin/admin.c:570 +msgid "Modify Class" +msgstr "" + +#: cgi-bin/admin.c:883 +msgid "Modify Printer" +msgstr "" + +#: cgi-bin/ipp-var.c:425 cgi-bin/ipp-var.c:516 +msgid "Move All Jobs" +msgstr "" + +#: cgi-bin/ipp-var.c:364 cgi-bin/ipp-var.c:423 cgi-bin/ipp-var.c:514 +msgid "Move Job" +msgstr "" + +#: cups/http-support.c:1263 +msgid "Moved Permanently" +msgstr "" + +#: cups/ppd.c:338 +msgid "NULL PPD file pointer" +msgstr "" + +#: cups/snmp.c:1053 +msgid "Name OID uses indefinite length" +msgstr "" + +#: scheduler/ipp.c:1222 +msgid "Nested classes are not allowed." +msgstr "" + +#: ppdc/sample.c:439 +msgid "Never" +msgstr "" + +#: ppdc/sample.c:265 +msgid "New Stylus Color Series" +msgstr "" + +#: ppdc/sample.c:267 +msgid "New Stylus Photo Series" +msgstr "" + +#: cups/ppd.c:1906 +msgid "No" +msgstr "" + +#: cups/http-support.c:1260 +msgid "No Content" +msgstr "" + +#: cups/util.c:1297 +msgid "No PPD name" +msgstr "" + +#: cups/snmp.c:1047 +msgid "No VarBind SEQUENCE" +msgstr "" + +#: cups/adminutil.c:788 +msgid "No Windows printer drivers are installed." +msgstr "" + +#: cups/request.c:571 cups/request.c:914 +msgid "No active connection" +msgstr "" + +#: scheduler/ipp.c:4490 +#, c-format +msgid "No active jobs on %s." +msgstr "" + +#: scheduler/ipp.c:329 +msgid "No attributes in request." +msgstr "" + +#: scheduler/ipp.c:4121 +msgid "No authentication information provided." +msgstr "" + +#: cups/snmp.c:1004 +msgid "No community name" +msgstr "" + +#: scheduler/ipp.c:7108 +msgid "No default printer." +msgstr "" + +#: cgi-bin/ipp-var.c:436 scheduler/ipp.c:8438 +msgid "No destinations added." +msgstr "" + +#: backend/usb.c:200 +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +#: cups/snmp.c:1034 +msgid "No error-index" +msgstr "" + +#: cups/snmp.c:1026 +msgid "No error-status" +msgstr "" + +#: scheduler/ipp.c:9389 scheduler/ipp.c:10634 +msgid "No file in print request." +msgstr "" + +#: filter/pstext.c:438 +msgid "No fonts in charset file." +msgstr "" + +#: cups/util.c:922 +msgid "No modification time" +msgstr "" + +#: cups/snmp.c:1051 +msgid "No name OID" +msgstr "" + +#: driver/rastertoescpx.c:1918 driver/rastertopclx.c:1943 +#: filter/rastertoepson.c:1147 filter/rastertohp.c:876 +#: filter/rastertolabel.c:1302 +msgid "No pages were found." +msgstr "" + +#: cups/util.c:916 +msgid "No printer name" +msgstr "" + +#: cups/util.c:1800 +msgid "No printer-uri found" +msgstr "" + +#: cups/util.c:1785 +msgid "No printer-uri found for class" +msgstr "" + +#: scheduler/ipp.c:7511 +msgid "No printer-uri in request." +msgstr "" + +#: cups/snmp.c:1018 +msgid "No request-id" +msgstr "" + +#: scheduler/ipp.c:6715 +msgid "No subscription attributes in request." +msgstr "" + +#: scheduler/ipp.c:8774 +msgid "No subscriptions found." +msgstr "" + +#: cups/snmp.c:1042 +msgid "No variable-bindings SEQUENCE" +msgstr "" + +#: cups/snmp.c:997 +msgid "No version number" +msgstr "" + +#: ppdc/sample.c:376 +msgid "Non-continuous (Mark sensing)" +msgstr "" + +#: ppdc/sample.c:375 +msgid "Non-continuous (Web sensing)" +msgstr "" + +#: ppdc/sample.c:247 +msgid "Normal" +msgstr "" + +#: cups/http-support.c:1282 +msgid "Not Found" +msgstr "" + +#: cups/http-support.c:1294 +msgid "Not Implemented" +msgstr "" + +#: ppdc/sample.c:285 +msgid "Not Installed" +msgstr "" + +#: cups/http-support.c:1269 +msgid "Not Modified" +msgstr "" + +#: cups/http-support.c:1297 +msgid "Not Supported" +msgstr "" + +#: scheduler/ipp.c:1598 scheduler/ipp.c:11856 +msgid "Not allowed to print." +msgstr "" + +#: ppdc/sample.c:146 +msgid "Note" +msgstr "" + +#: systemv/cupstestdsc.c:433 +msgid "Note: this program only validates the DSC comments, not the PostScript itself." +msgstr "" + +#: cups/http-support.c:1251 cups/ppd.c:336 +msgid "OK" +msgstr "" + +#: ppdc/sample.c:280 +msgid "Off (1-Sided)" +msgstr "" + +#: ppdc/sample.c:370 +msgid "Oki" +msgstr "" + +#: cgi-bin/help.c:90 cgi-bin/help.c:131 cgi-bin/help.c:141 cgi-bin/help.c:172 +msgid "Online Help" +msgstr "" + +#: cups/adminutil.c:955 +#, c-format +msgid "Open of %s failed: %s" +msgstr "" + +#: cups/ppd.c:344 +msgid "OpenGroup without a CloseGroup first" +msgstr "" + +#: cups/ppd.c:346 +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "" + +#: cgi-bin/admin.c:3750 +msgid "Operation Policy" +msgstr "" + +#: filter/pstops.c:2220 +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +#: cgi-bin/admin.c:3400 cgi-bin/admin.c:3484 +msgid "Options Installed" +msgstr "" + +#: scheduler/cupsfilter.c:1437 scheduler/cupsfilter.c:1464 +#: scheduler/main.c:2058 systemv/cupsaddsmb.c:284 systemv/cupsctl.c:209 +#: systemv/cupstestdsc.c:429 systemv/cupstestppd.c:3778 test/ipptool.c:4382 +#: ppdc/ppdc.cxx:437 ppdc/ppdhtml.cxx:174 ppdc/ppdi.cxx:130 +#: ppdc/ppdmerge.cxx:369 ppdc/ppdpo.cxx:254 +msgid "Options:" +msgstr "" + +#: filter/bannertops.c:674 +msgid "Options: " +msgstr "" + +#: cups/ppd-cache.c:156 +msgid "Out of date PPD cache file." +msgstr "" + +#: cups/ppd-cache.c:1366 +msgid "Out of memory." +msgstr "" + +#: cups/ppd.c:752 cups/ppd.c:1320 +msgid "Output Mode" +msgstr "" + +#: systemv/lpstat.c:1191 systemv/lpstat.c:1195 +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#: systemv/lpstat.c:1185 +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#: systemv/lpstat.c:1209 systemv/lpstat.c:1213 +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#: systemv/lpstat.c:1203 +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +#: systemv/cupstestdsc.c:399 +msgid "PASS" +msgstr "" + +#: ppdc/sample.c:269 +msgid "PCL Laser Printer" +msgstr "" + +#: ppdc/sample.c:149 +msgid "PRC16K" +msgstr "" + +#: ppdc/sample.c:150 +msgid "PRC16K Long Edge" +msgstr "" + +#: ppdc/sample.c:151 +msgid "PRC32K" +msgstr "" + +#: ppdc/sample.c:154 +msgid "PRC32K Long Edge" +msgstr "" + +#: ppdc/sample.c:152 +msgid "PRC32K Oversize" +msgstr "" + +#: ppdc/sample.c:153 +msgid "PRC32K Oversize Long Edge" +msgstr "" + +#: cups/snmp.c:1014 +msgid "Packet does not contain a Get-Response-PDU" +msgstr "" + +#: cups/snmp.c:993 +msgid "Packet does not start with SEQUENCE" +msgstr "" + +#: ppdc/sample.c:369 +msgid "ParamCustominCutInterval" +msgstr "" + +#: ppdc/sample.c:367 +msgid "ParamCustominTearInterval" +msgstr "" + +#: cups/auth.c:199 cups/auth.c:367 +#, c-format +msgid "Password for %s on %s? " +msgstr "" + +#: systemv/cupsaddsmb.c:252 +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "" + +#: cgi-bin/classes.c:167 +msgid "Pause Class" +msgstr "" + +#: cgi-bin/printers.c:170 +msgid "Pause Printer" +msgstr "" + +#: ppdc/sample.c:457 +msgid "Peel-Off" +msgstr "" + +#: ppdc/sample.c:160 +msgid "Photo" +msgstr "" + +#: ppdc/sample.c:161 +msgid "Photo Labels" +msgstr "" + +#: ppdc/sample.c:295 +msgid "Plain Paper" +msgstr "" + +#: cgi-bin/admin.c:3418 cgi-bin/admin.c:3699 +msgid "Policies" +msgstr "" + +#: cgi-bin/admin.c:3425 cgi-bin/admin.c:3768 cgi-bin/admin.c:3781 +msgid "Port Monitor" +msgstr "" + +#: ppdc/sample.c:287 +msgid "PostScript Printer" +msgstr "" + +#: ppdc/sample.c:147 +msgid "Postcard" +msgstr "" + +#: ppdc/sample.c:71 +msgid "Postcard Double " +msgstr "" + +#: ppdc/sample.c:72 +msgid "Postcard Double Long Edge" +msgstr "" + +#: ppdc/sample.c:148 +msgid "Postcard Long Edge" +msgstr "" + +#: ppdc/sample.c:304 +msgid "Print Density" +msgstr "" + +#: cups/notify.c:82 +msgid "Print Job:" +msgstr "" + +#: ppdc/sample.c:349 +msgid "Print Mode" +msgstr "" + +#: ppdc/sample.c:392 +msgid "Print Rate" +msgstr "" + +#: cgi-bin/printers.c:179 +msgid "Print Self-Test Page" +msgstr "" + +#: ppdc/sample.c:336 +msgid "Print Speed" +msgstr "" + +#: cgi-bin/ipp-var.c:792 +msgid "Print Test Page" +msgstr "" + +#: ppdc/sample.c:365 +msgid "Print and Cut" +msgstr "" + +#: ppdc/sample.c:353 +msgid "Print and Tear" +msgstr "" + +#: backend/ipp.c:1519 +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +#: backend/ipp.c:1509 +msgid "Print file accepted - job ID unknown." +msgstr "" + +#: backend/parallel.c:286 backend/socket.c:424 backend/usb-unix.c:195 +msgid "Print file sent." +msgstr "" + +#: backend/ipp.c:1470 +msgid "Print file was not accepted." +msgstr "" + +#: backend/ipp.c:1871 +msgid "Print job too large." +msgstr "" + +#: filter/bannertops.c:648 +msgid "Printed For: " +msgstr "" + +#: filter/bannertops.c:656 +msgid "Printed From: " +msgstr "" + +#: filter/bannertops.c:876 +msgid "Printed On: " +msgstr "" + +#: cgi-bin/ipp-var.c:1047 +msgid "Printer Added" +msgstr "" + +#: ppdc/sample.c:272 +msgid "Printer Default" +msgstr "" + +#: cgi-bin/ipp-var.c:1051 +msgid "Printer Deleted" +msgstr "" + +#: cgi-bin/ipp-var.c:1049 +msgid "Printer Modified" +msgstr "" + +#: filter/bannertops.c:614 +msgid "Printer Name: " +msgstr "" + +#: cgi-bin/ipp-var.c:1045 +msgid "Printer Paused" +msgstr "" + +#: ppdc/sample.c:303 +msgid "Printer Settings" +msgstr "" + +#: backend/usb-unix.c:132 +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +#: backend/parallel.c:234 backend/serial.c:256 +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +#: backend/lpd.c:611 backend/lpd.c:997 backend/lpd.c:1079 backend/lpd.c:1129 +msgid "Printer did not respond." +msgstr "" + +#: backend/ipp.c:881 backend/ipp.c:888 +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +#: backend/usb-unix.c:429 backend/usb-unix.c:513 +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +#: backend/runloop.c:253 backend/runloop.c:371 +msgid "Printer is not currently connected." +msgstr "" + +#: backend/runloop.c:392 +msgid "Printer is now connected." +msgstr "" + +#: backend/usb-darwin.c:1286 +msgid "Printer is now online." +msgstr "" + +#: backend/usb-darwin.c:1307 +msgid "Printer is offline." +msgstr "" + +#: backend/usb-unix.c:139 +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +#: backend/parallel.c:240 +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +#: cups/notify.c:126 +msgid "Printer:" +msgstr "" + +#: cgi-bin/printers.c:204 cgi-bin/printers.c:332 +msgid "Printers" +msgstr "" + +#: driver/rastertoescpx.c:1882 driver/rastertopclx.c:1904 +#: filter/rastertoepson.c:1093 filter/rastertohp.c:817 +#: filter/rastertolabel.c:1249 +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#: filter/imagetops.c:817 +#, c-format +msgid "Printing page %d." +msgstr "" + +#: cgi-bin/classes.c:173 cgi-bin/printers.c:176 +msgid "Purge Jobs" +msgstr "" + +#: ppdc/sample.c:155 +msgid "Quarto" +msgstr "" + +#: scheduler/ipp.c:1593 scheduler/ipp.c:11851 +msgid "Quota limit reached." +msgstr "" + +#: berkeley/lpq.c:515 +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +#: berkeley/lpq.c:511 +msgid "Rank Owner Pri Job Files Total Size" +msgstr "" + +#: backend/ipp.c:1878 backend/socket.c:475 driver/rastertoescpx.c:1923 +#: driver/rastertopclx.c:1948 filter/rastertoepson.c:1152 +#: filter/rastertohp.c:881 filter/rastertolabel.c:1307 +msgid "Ready to print." +msgstr "" + +#: cgi-bin/classes.c:171 cgi-bin/printers.c:174 +msgid "Reject Jobs" +msgstr "" + +#: backend/lpd.c:1004 backend/lpd.c:1136 +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#: backend/lpd.c:1089 +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +#: ppdc/sample.c:437 +msgid "Reprint After Error" +msgstr "" + +#: cups/http-support.c:1285 +msgid "Request Entity Too Large" +msgstr "" + +#: cups/ppd.c:754 cups/ppd.c:1322 ppdc/sample.c:240 +msgid "Resolution" +msgstr "" + +#: cgi-bin/classes.c:165 +msgid "Resume Class" +msgstr "" + +#: cgi-bin/printers.c:167 +msgid "Resume Printer" +msgstr "" + +#: ppdc/sample.c:165 +msgid "Return Address" +msgstr "" + +#: ppdc/sample.c:174 +msgid "Return Address - 3/4 x 2\"" +msgstr "" + +#: ppdc/sample.c:458 +msgid "Rewind" +msgstr "" + +#: cups/adminutil.c:2169 +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +#: cups/snmp.c:995 +msgid "SEQUENCE uses indefinite length" +msgstr "" + +#: cups/http-support.c:1309 +msgid "SSL/TLS Negotiation Error" +msgstr "" + +#: cups/http-support.c:1266 +msgid "See Other" +msgstr "" + +#: backend/usb-darwin.c:543 backend/usb-libusb.c:273 +msgid "Sending data to printer." +msgstr "" + +#: backend/serial.c:783 backend/serial.c:942 backend/serial.c:1064 +#: backend/serial.c:1158 +#, c-format +msgid "Serial Port #%d" +msgstr "" + +#: cgi-bin/ipp-var.c:1061 +msgid "Server Restarted" +msgstr "" + +#: cgi-bin/ipp-var.c:1067 +msgid "Server Security Auditing" +msgstr "" + +#: cgi-bin/ipp-var.c:1063 +msgid "Server Started" +msgstr "" + +#: cgi-bin/ipp-var.c:1065 +msgid "Server Stopped" +msgstr "" + +#: cups/http-support.c:1303 +msgid "Service Unavailable" +msgstr "" + +#: cgi-bin/admin.c:2905 cgi-bin/admin.c:2951 cgi-bin/admin.c:3108 +#: cgi-bin/admin.c:3127 +msgid "Set Allowed Users" +msgstr "" + +#: cgi-bin/admin.c:3154 +msgid "Set As Server Default" +msgstr "" + +#: cgi-bin/admin.c:3254 +msgid "Set Class Options" +msgstr "" + +#: cgi-bin/admin.c:3254 cgi-bin/admin.c:3428 cgi-bin/admin.c:3810 +msgid "Set Printer Options" +msgstr "" + +#: cgi-bin/admin.c:3980 cgi-bin/admin.c:4024 cgi-bin/admin.c:4042 +msgid "Set Publishing" +msgstr "" + +#: ppdc/sample.c:166 +msgid "Shipping Address" +msgstr "" + +#: ppdc/sample.c:175 +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "" + +#: ppdc/sample.c:282 +msgid "Short-Edge (Landscape)" +msgstr "" + +#: ppdc/sample.c:297 +msgid "Special Paper" +msgstr "" + +#: backend/lpd.c:1045 +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +#: ppdc/sample.c:350 +msgid "Standard" +msgstr "" + +#. TRANSLATORS: Banner/cover sheet before the print job. +#: cgi-bin/admin.c:3671 +msgid "Starting Banner" +msgstr "" + +#: driver/rastertoescpx.c:1866 driver/rastertopclx.c:1887 +#: filter/rastertoepson.c:1069 filter/rastertohp.c:793 +#: filter/rastertolabel.c:1225 +#, c-format +msgid "Starting page %d." +msgstr "" + +#: ppdc/sample.c:156 +msgid "Statement" +msgstr "" + +#: ppdc/sample.c:260 +msgid "Stylus Color Series" +msgstr "" + +#: ppdc/sample.c:266 +msgid "Stylus Photo Series" +msgstr "" + +#: scheduler/ipp.c:4636 scheduler/ipp.c:7878 scheduler/ipp.c:8587 +#: scheduler/ipp.c:10085 +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +#: ppdc/sample.c:157 +msgid "Super A" +msgstr "" + +#: ppdc/sample.c:158 +msgid "Super B" +msgstr "" + +#: ppdc/sample.c:162 +msgid "Super B/A3" +msgstr "" + +#: cups/http-support.c:1248 +msgid "Switching Protocols" +msgstr "" + +#: ppdc/sample.c:159 +msgid "Tabloid" +msgstr "" + +#: ppdc/sample.c:45 +msgid "Tabloid Oversize" +msgstr "" + +#: ppdc/sample.c:46 +msgid "Tabloid Oversize Long Edge" +msgstr "" + +#: ppdc/sample.c:351 +msgid "Tear" +msgstr "" + +#: ppdc/sample.c:456 +msgid "Tear-Off" +msgstr "" + +#: ppdc/sample.c:397 +msgid "Tear-Off Adjust Position" +msgstr "" + +#: scheduler/ipp.c:7582 scheduler/ipp.c:7660 scheduler/ipp.c:7676 +#: scheduler/ipp.c:7694 +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#: scheduler/ipp.c:8109 +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "" + +#: scheduler/ipp.c:8096 +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "" + +#: driver/rastertoescpx.c:1794 driver/rastertopclx.c:1819 +#: filter/rastertoepson.c:1038 filter/rastertohp.c:764 +#: filter/rastertolabel.c:1189 +msgid "The PPD file could not be opened." +msgstr "" + +#: cgi-bin/admin.c:750 +msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." +msgstr "" + +#: cups/localize.c:353 +msgid "The developer unit needs to be replaced." +msgstr "" + +#: cups/localize.c:351 +msgid "The developer unit will need to be replaced soon." +msgstr "" + +#: cups/localize.c:343 +msgid "The fuser's temperature is high." +msgstr "" + +#: cups/localize.c:345 +msgid "The fuser's temperature is low." +msgstr "" + +#: scheduler/ipp.c:2242 +msgid "The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" + +#: scheduler/ipp.c:2225 scheduler/ipp.c:6840 +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +#: cups/localize.c:349 +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +#: cups/localize.c:347 +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +#: cups/localize.c:331 +msgid "The output bin is almost full." +msgstr "" + +#: cups/localize.c:333 +msgid "The output bin is full." +msgstr "" + +#: cups/localize.c:329 +msgid "The output bin is missing." +msgstr "" + +#: filter/imagetoraster.c:466 +msgid "The page setup information was not valid." +msgstr "" + +#: cups/localize.c:325 +msgid "The paper tray is almost empty." +msgstr "" + +#: cups/localize.c:327 +msgid "The paper tray is empty." +msgstr "" + +#: cups/localize.c:323 +msgid "The paper tray is missing." +msgstr "" + +#: cups/localize.c:306 +msgid "The paper tray needs to be filled." +msgstr "" + +#: filter/imagetops.c:322 filter/imagetoraster.c:683 +msgid "The print file could not be opened." +msgstr "" + +#: backend/ipp.c:898 +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +#: backend/ipp.c:748 backend/ipp.c:863 backend/ipp.c:969 backend/ipp.c:1298 +#: backend/ipp.c:1446 backend/lpd.c:819 backend/socket.c:374 +msgid "The printer is busy." +msgstr "" + +#: cups/localize.c:311 +msgid "The printer is not connected." +msgstr "" + +#: backend/ipp.c:726 backend/ipp.c:759 backend/ipp.c:859 backend/lpd.c:798 +#: backend/lpd.c:839 backend/socket.c:353 backend/socket.c:386 +msgid "The printer is not responding." +msgstr "" + +#: cups/localize.c:337 +msgid "The printer is out of ink." +msgstr "" + +#: cups/localize.c:335 +msgid "The printer is running low on ink." +msgstr "" + +#: cups/localize.c:313 +msgid "The printer is running low on toner." +msgstr "" + +#: backend/ipp.c:741 backend/lpd.c:812 backend/socket.c:367 +msgid "The printer is unreachable at this time." +msgstr "" + +#: cups/localize.c:315 +msgid "The printer may be out of toner." +msgstr "" + +#: backend/ipp.c:735 backend/lpd.c:806 backend/socket.c:361 +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +#: cgi-bin/admin.c:932 +msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." +msgstr "" + +#: scheduler/ipp.c:904 scheduler/ipp.c:1216 scheduler/ipp.c:4285 +#: scheduler/ipp.c:4456 scheduler/ipp.c:6371 scheduler/ipp.c:6674 +#: scheduler/ipp.c:6988 scheduler/ipp.c:7548 scheduler/ipp.c:8314 +#: scheduler/ipp.c:8370 scheduler/ipp.c:8693 scheduler/ipp.c:8959 +#: scheduler/ipp.c:9048 scheduler/ipp.c:9081 scheduler/ipp.c:9404 +#: scheduler/ipp.c:9797 scheduler/ipp.c:9878 scheduler/ipp.c:11029 +#: scheduler/ipp.c:11484 scheduler/ipp.c:11814 scheduler/ipp.c:11896 +#: scheduler/ipp.c:12188 +msgid "The printer or class does not exist." +msgstr "" + +#: scheduler/ipp.c:1384 +msgid "The printer or class is not shared." +msgstr "" + +#: cups/localize.c:317 +msgid "The printer's cover is open." +msgstr "" + +#: cups/localize.c:321 +msgid "The printer's door is open." +msgstr "" + +#: cups/localize.c:319 +msgid "The printer's interlock is open." +msgstr "" + +#: cups/localize.c:339 +msgid "The printer's waste bin is almost full." +msgstr "" + +#: cups/localize.c:341 +msgid "The printer's waste bin is full." +msgstr "" + +#: scheduler/ipp.c:1011 scheduler/ipp.c:2407 +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "" + +#: scheduler/ipp.c:4262 +msgid "The printer-uri attribute is required." +msgstr "" + +#: scheduler/ipp.c:995 +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" + +#: scheduler/ipp.c:2391 +msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" + +#: cgi-bin/admin.c:474 +msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." +msgstr "" + +#: scheduler/client.c:2464 +msgid "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." +msgstr "" + +#: scheduler/ipp.c:7643 +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +#: scheduler/ipp.c:6918 +msgid "There are too many subscriptions." +msgstr "" + +#: cups/localize.c:308 +msgid "There is a paper jam." +msgstr "" + +#: backend/usb-darwin.c:379 backend/usb-darwin.c:438 backend/usb-darwin.c:505 +#: backend/usb-darwin.c:526 backend/usb-libusb.c:235 backend/usb-libusb.c:256 +msgid "There was an unrecoverable USB error." +msgstr "" + +#: ppdc/sample.c:444 +msgid "Thermal Transfer Media" +msgstr "" + +#: filter/bannertops.c:640 +msgid "Title: " +msgstr "" + +#: scheduler/ipp.c:1587 +msgid "Too many active jobs." +msgstr "" + +#: scheduler/ipp.c:1481 +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#: scheduler/ipp.c:2728 +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +#: ppdc/sample.c:298 +msgid "Transparency" +msgstr "" + +#: ppdc/sample.c:293 +msgid "Tray" +msgstr "" + +#: ppdc/sample.c:273 +msgid "Tray 1" +msgstr "" + +#: ppdc/sample.c:274 +msgid "Tray 2" +msgstr "" + +#: ppdc/sample.c:275 +msgid "Tray 3" +msgstr "" + +#: ppdc/sample.c:276 +msgid "Tray 4" +msgstr "" + +#: cups/http-support.c:1288 +msgid "URI Too Long" +msgstr "" + +#: ppdc/sample.c:138 +msgid "US Ledger" +msgstr "" + +#: ppdc/sample.c:139 +msgid "US Legal" +msgstr "" + +#: ppdc/sample.c:140 +msgid "US Legal Oversize" +msgstr "" + +#: ppdc/sample.c:141 +msgid "US Letter" +msgstr "" + +#: ppdc/sample.c:142 +msgid "US Letter Long Edge" +msgstr "" + +#: ppdc/sample.c:143 +msgid "US Letter Oversize" +msgstr "" + +#: ppdc/sample.c:144 +msgid "US Letter Oversize Long Edge" +msgstr "" + +#: ppdc/sample.c:145 +msgid "US Letter Small" +msgstr "" + +#: backend/serial.c:796 +#, c-format +msgid "USB Serial Port #%d" +msgstr "" + +#: cgi-bin/admin.c:2033 cgi-bin/admin.c:2046 cgi-bin/admin.c:2070 +msgid "Unable to access cupsd.conf file:" +msgstr "" + +#: cgi-bin/admin.c:526 +msgid "Unable to add RSS subscription:" +msgstr "" + +#: cgi-bin/admin.c:815 +msgid "Unable to add class:" +msgstr "" + +#: backend/ipp.c:1616 +msgid "Unable to add document to print job." +msgstr "" + +#: scheduler/ipp.c:1628 +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +#: cgi-bin/admin.c:1060 cgi-bin/admin.c:1420 +msgid "Unable to add printer:" +msgstr "" + +#: scheduler/ipp.c:1326 +msgid "Unable to allocate memory for file types." +msgstr "" + +#: filter/pstops.c:456 +msgid "Unable to allocate memory for page info" +msgstr "" + +#: filter/pstops.c:450 +msgid "Unable to allocate memory for pages array" +msgstr "" + +#: cgi-bin/admin.c:1526 +msgid "Unable to cancel RSS subscription:" +msgstr "" + +#: backend/ipp.c:1920 +msgid "Unable to cancel print job." +msgstr "" + +#: cgi-bin/admin.c:4025 +msgid "Unable to change printer-is-shared attribute:" +msgstr "" + +#: cgi-bin/admin.c:3109 +msgid "Unable to change printer:" +msgstr "" + +#: cgi-bin/admin.c:1710 cgi-bin/admin.c:1874 +msgid "Unable to change server settings:" +msgstr "" + +#: filter/commandtops.c:421 +msgid "Unable to configure printer options." +msgstr "" + +#: cups/adminutil.c:911 cups/request.c:1022 +msgid "Unable to connect to host." +msgstr "" + +#: backend/ipp.c:704 backend/ipp.c:1119 backend/lpd.c:778 +#: backend/parallel.c:219 backend/serial.c:241 backend/socket.c:333 +#: backend/usb-unix.c:117 +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#: cups/adminutil.c:726 +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#: cups/adminutil.c:691 +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#: cups/adminutil.c:522 +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#: scheduler/ipp.c:2848 +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +#: scheduler/ipp.c:2903 +msgid "Unable to copy PPD file." +msgstr "" + +#: cups/adminutil.c:487 +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#: cups/adminutil.c:610 +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#: scheduler/ipp.c:2825 +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +#: filter/imagetops.c:141 filter/imagetoraster.c:301 +msgid "Unable to copy print file" +msgstr "" + +#: backend/ipp.c:2012 +msgid "Unable to create compressed print file" +msgstr "" + +#: filter/imagetoraster.c:242 +msgid "Unable to create pipes for filters" +msgstr "" + +#: cups/util.c:601 cups/util.c:1655 +msgid "Unable to create printer-uri" +msgstr "" + +#: scheduler/cupsfilter.c:1241 +msgid "Unable to create temporary file" +msgstr "" + +#: cgi-bin/admin.c:1924 cgi-bin/admin.c:1936 +msgid "Unable to create temporary file:" +msgstr "" + +#: cgi-bin/admin.c:2227 +msgid "Unable to delete class:" +msgstr "" + +#: cgi-bin/admin.c:2312 +msgid "Unable to delete printer:" +msgstr "" + +#: cgi-bin/classes.c:260 cgi-bin/printers.c:269 +msgid "Unable to do maintenance command:" +msgstr "" + +#: cgi-bin/admin.c:2048 +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +#: cups/http.c:4192 +msgid "Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +#: cups/http.c:4182 +msgid "Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +#: cups/http.c:4177 +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +#: cups/http.c:4187 +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +#: cups/http.c:4197 +msgid "Unable to establish a secure connection to host (peer dropped connection before responding)." +msgstr "" + +#: cups/http.c:4172 +msgid "Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +#: cups/http.c:4167 +msgid "Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +#: cups/http.c:3929 cups/http.c:4224 cups/http.c:4257 cups/http.c:4274 +msgid "Unable to establish a secure connection to host." +msgstr "" + +#: cgi-bin/ipp-var.c:365 +msgid "Unable to find destination for job" +msgstr "" + +#: cups/http-support.c:1634 +msgid "Unable to find printer." +msgstr "" + +#: filter/imagetoraster.c:266 +msgid "Unable to fork filter" +msgstr "" + +#: backend/ipp.c:2034 +msgid "Unable to generate compressed print file" +msgstr "" + +#: backend/ipp.c:2938 +msgid "Unable to get backend exit status." +msgstr "" + +#: cgi-bin/classes.c:450 +msgid "Unable to get class list:" +msgstr "" + +#: cgi-bin/classes.c:549 +msgid "Unable to get class status:" +msgstr "" + +#: cgi-bin/admin.c:1321 +msgid "Unable to get list of printer drivers:" +msgstr "" + +#: cgi-bin/admin.c:2959 +msgid "Unable to get printer attributes:" +msgstr "" + +#: cgi-bin/printers.c:467 +msgid "Unable to get printer list:" +msgstr "" + +#: backend/ipp.c:922 +msgid "Unable to get printer status." +msgstr "" + +#: cgi-bin/printers.c:569 +msgid "Unable to get printer status:" +msgstr "" + +#: cups/adminutil.c:565 cups/adminutil.c:769 +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#: cups/adminutil.c:639 +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#: backend/ipp.c:636 backend/lpd.c:417 backend/socket.c:275 +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +#: backend/dnssd.c:529 backend/ipp.c:318 backend/lpd.c:200 +#: backend/socket.c:171 +msgid "Unable to locate printer." +msgstr "" + +#: cgi-bin/admin.c:814 +msgid "Unable to modify class:" +msgstr "" + +#: cgi-bin/admin.c:1059 cgi-bin/admin.c:1419 +msgid "Unable to modify printer:" +msgstr "" + +#: cgi-bin/ipp-var.c:432 cgi-bin/ipp-var.c:521 +msgid "Unable to move job" +msgstr "" + +#: cgi-bin/ipp-var.c:434 cgi-bin/ipp-var.c:523 +msgid "Unable to move jobs" +msgstr "" + +#: cups/ppd.c:337 +msgid "Unable to open PPD file" +msgstr "" + +#: cgi-bin/admin.c:3305 +msgid "Unable to open PPD file:" +msgstr "" + +#: filter/texttops.c:282 +msgid "Unable to open charset file" +msgstr "" + +#: backend/ipp.c:2018 +msgid "Unable to open compressed print file" +msgstr "" + +#: cgi-bin/admin.c:2683 +msgid "Unable to open cupsd.conf file:" +msgstr "" + +#: backend/parallel.c:246 backend/serial.c:261 backend/usb-unix.c:145 +msgid "Unable to open device file" +msgstr "" + +#: scheduler/ipp.c:7329 +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +#: backend/ipp.c:359 backend/ipp.c:1380 backend/ipp.c:1576 backend/ipp.c:2024 +#: backend/lpd.c:484 backend/parallel.c:150 backend/serial.c:190 +#: backend/socket.c:158 backend/usb.c:237 filter/bannertops.c:183 +#: filter/gziptoany.c:71 filter/pstext.c:89 filter/pstext.c:249 +#: filter/pstext.c:266 filter/pstops.c:305 +msgid "Unable to open print file" +msgstr "" + +#: filter/texttops.c:263 +msgid "Unable to open psglyphs" +msgstr "" + +#: driver/rastertoescpx.c:1814 driver/rastertopclx.c:1839 +#: filter/rastertoepson.c:998 filter/rastertohp.c:724 +#: filter/rastertolabel.c:1147 +msgid "Unable to open raster file" +msgstr "" + +#: filter/texttops.c:216 +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#: filter/texttops.c:180 filter/texttops.c:188 filter/texttops.c:196 +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +#: cgi-bin/ipp-var.c:795 +msgid "Unable to print test page:" +msgstr "" + +#: backend/runloop.c:95 backend/runloop.c:322 +msgid "Unable to read print data" +msgstr "" + +#: backend/usb-darwin.c:613 backend/usb-darwin.c:657 backend/usb-libusb.c:343 +#: backend/usb-libusb.c:378 +msgid "Unable to read print data." +msgstr "" + +#: cups/adminutil.c:2205 +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +#: filter/pstops.c:568 +msgid "Unable to see in file" +msgstr "" + +#: cgi-bin/ipp-var.c:598 cgi-bin/ipp-var.c:618 +msgid "Unable to send command to printer driver" +msgstr "" + +#: backend/usb-darwin.c:735 backend/usb-libusb.c:454 +msgid "Unable to send data to printer." +msgstr "" + +#: filter/imagetoraster.c:1246 filter/imagetoraster.c:1343 +#: filter/imagetoraster.c:1384 +msgid "Unable to send raster data to the driver." +msgstr "" + +#: cups/adminutil.c:821 +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +#: cgi-bin/admin.c:3926 +msgid "Unable to set options:" +msgstr "" + +#: cgi-bin/admin.c:3196 +msgid "Unable to set server default:" +msgstr "" + +#: backend/ipp.c:2797 backend/ipp.c:2874 backend/ipp.c:2882 +msgid "Unable to start backend process." +msgstr "" + +#: cgi-bin/admin.c:1986 +msgid "Unable to upload cupsd.conf file:" +msgstr "" + +#: backend/usb-darwin.c:1985 backend/usb-darwin.c:2009 +msgid "Unable to use legacy USB class driver." +msgstr "" + +#: backend/runloop.c:124 backend/runloop.c:377 +msgid "Unable to write print data" +msgstr "" + +#: filter/gziptoany.c:90 +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +#: cups/http-support.c:1276 +msgid "Unauthorized" +msgstr "" + +#: cgi-bin/admin.c:3622 +msgid "Units" +msgstr "" + +#: cups/http-support.c:1316 cups/ppd.c:364 +msgid "Unknown" +msgstr "" + +#: filter/pstops.c:2228 +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#: backend/ipp.c:501 +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#: backend/lpd.c:346 +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#: backend/lpd.c:317 +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#: backend/ipp.c:548 +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#: filter/pstops.c:2211 +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#: backend/lpd.c:332 +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#: scheduler/ipp.c:11686 +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "" + +#: scheduler/ipp.c:11669 +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "" + +#: backend/ipp.c:520 +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#: backend/serial.c:379 +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#: filter/pstops.c:2419 +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#: scheduler/ipp.c:429 +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#: scheduler/ipp.c:9370 scheduler/ipp.c:10599 scheduler/ipp.c:12140 +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#: scheduler/ipp.c:9504 scheduler/ipp.c:10749 scheduler/ipp.c:12169 +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#: scheduler/ipp.c:10732 +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#: scheduler/ipp.c:1447 +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#: filter/pstops.c:2501 +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +#: scheduler/ipp.c:1545 +msgid "Unsupported margins." +msgstr "" + +#: cups/pwg-media.c:467 +msgid "Unsupported media value." +msgstr "" + +#: filter/pstops.c:2545 +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#: filter/pstops.c:2579 +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#: filter/pstops.c:2630 +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +#: filter/rastertopwg.c:147 filter/rastertopwg.c:155 filter/rastertopwg.c:164 +msgid "Unsupported raster data." +msgstr "" + +#: cups/snmp.c:1112 +msgid "Unsupported value type" +msgstr "" + +#: cups/http-support.c:1291 +msgid "Upgrade Required" +msgstr "" + +#: systemv/lpadmin.c:668 +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#: filter/pdftops.c:109 +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#: backend/dnssd.c:174 backend/ipp.c:307 backend/lpd.c:189 +#: backend/parallel.c:127 backend/serial.c:167 backend/socket.c:135 +#: backend/usb.c:183 driver/commandtoescpx.c:57 driver/commandtopclx.c:57 +#: filter/textcommon.c:518 monitor/bcp.c:62 monitor/tbcp.c:61 +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#: filter/bannertops.c:118 filter/commandtops.c:74 filter/gziptoany.c:50 +#: filter/imagetops.c:123 filter/imagetoraster.c:215 filter/pstops.c:269 +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +#: scheduler/cupsfilter.c:1463 +msgid "Usage: convert [ options ]" +msgstr "" + +#: systemv/cupsaddsmb.c:281 +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +#: systemv/cupsctl.c:206 +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +#: scheduler/main.c:2057 +msgid "Usage: cupsd [options]" +msgstr "" + +#: scheduler/cupsfilter.c:1436 +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +#: systemv/cupstestdsc.c:425 +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +#: systemv/cupstestppd.c:3774 +msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +#: test/ipptool.c:4380 +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +#: systemv/lpmove.c:125 +msgid "Usage: lpmove job/src dest" +msgstr "" + +#: systemv/lpoptions.c:553 +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +#: systemv/lppasswd.c:476 +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +#: systemv/lppasswd.c:479 +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +#: berkeley/lpq.c:670 +msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +#: ppdc/ppdc.cxx:435 +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +#: ppdc/ppdhtml.cxx:172 +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +#: ppdc/ppdi.cxx:128 +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +#: ppdc/ppdmerge.cxx:367 +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +#: ppdc/ppdpo.cxx:252 +msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +#: backend/snmp.c:218 +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +#: cups/snmp.c:1064 +msgid "Value uses indefinite length" +msgstr "" + +#: cups/snmp.c:1049 +msgid "VarBind uses indefinite length" +msgstr "" + +#: cups/snmp.c:999 +msgid "Version uses indefinite length" +msgstr "" + +#: backend/ipp.c:1656 +msgid "Waiting for job to complete." +msgstr "" + +#: backend/usb-darwin.c:457 backend/usb-libusb.c:193 +msgid "Waiting for printer to become available." +msgstr "" + +#: backend/socket.c:444 +msgid "Waiting for printer to finish." +msgstr "" + +#: cups/adminutil.c:793 +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +#: cups/http-support.c:1312 +msgid "Web Interface is Disabled" +msgstr "" + +#: cups/ppd.c:1904 +msgid "Yes" +msgstr "" + +#: scheduler/client.c:2451 +#, c-format +msgid "You must access this page using the URL https://%s:%d%s." +msgstr "" + +#: systemv/lppasswd.c:254 +msgid "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number." +msgstr "" + +#: ppdc/sample.c:448 +msgid "ZPL Label Printer" +msgstr "" + +#: ppdc/sample.c:371 +msgid "Zebra" +msgstr "" + +#: cups/notify.c:102 +msgid "aborted" +msgstr "" + +#: cups/notify.c:99 +msgid "canceled" +msgstr "" + +#: cups/notify.c:105 +msgid "completed" +msgstr "" + +#: scheduler/cupsfilter.c:355 +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +#: scheduler/ipp.c:7201 +msgid "cups-deviced failed to execute." +msgstr "" + +#: scheduler/ipp.c:8031 scheduler/ipp.c:8281 +msgid "cups-driverd failed to execute." +msgstr "" + +#: systemv/cupsaddsmb.c:233 +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +#: systemv/cupsctl.c:147 +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#: systemv/cupsctl.c:158 +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#: systemv/cupsctl.c:201 +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#: systemv/cupsctl.c:203 +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +#: scheduler/main.c:190 +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +#: scheduler/main.c:222 scheduler/main.c:229 +msgid "cupsd: Unable to get current directory." +msgstr "" + +#: scheduler/main.c:296 +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#: scheduler/main.c:289 +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +#: scheduler/main.c:256 +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#: scheduler/cupsfilter.c:1214 +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#: scheduler/cupsfilter.c:1208 +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +#: scheduler/cupsfilter.c:363 +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#: scheduler/cupsfilter.c:1256 +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +#: systemv/cupstestppd.c:260 +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +#: systemv/cupstestppd.c:276 +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#: systemv/lpstat.c:1231 systemv/lpstat.c:1234 systemv/lpstat.c:1237 +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224 +#, c-format +msgid "device for %s: %s" +msgstr "" + +#: cups/snmp.c:1036 +msgid "error-index uses indefinite length" +msgstr "" + +#: cups/snmp.c:1028 +msgid "error-status uses indefinite length" +msgstr "" + +#: cups/notify.c:90 +msgid "held" +msgstr "" + +#: berkeley/lpc.c:209 +msgid "help\t\tGet help on commands." +msgstr "" + +#: cups/notify.c:131 +msgid "idle" +msgstr "" + +#: test/ipptool.c:373 +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +#: test/ipptool.c:508 +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +#: test/ipptool.c:532 +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#: test/ipptool.c:590 +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#: test/ipptool.c:362 +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +#: test/ipptool.c:501 +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +#: test/ipptool.c:571 +msgid "ipptool: May only specify a single URI." +msgstr "" + +#: test/ipptool.c:524 +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +#: test/ipptool.c:408 +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +#: test/ipptool.c:389 +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +#: test/ipptool.c:491 +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +#: test/ipptool.c:332 +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +#: test/ipptool.c:345 +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +#: test/ipptool.c:617 +msgid "ipptool: URI required before test file." +msgstr "" + +#: test/ipptool.c:551 +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +#: scheduler/ipp.c:9037 +msgid "job-printer-uri attribute missing." +msgstr "" + +#: systemv/lpadmin.c:131 systemv/lpadmin.c:375 +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +#: systemv/lpadmin.c:614 +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +#: systemv/lpadmin.c:457 +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +#: systemv/lpadmin.c:364 +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +#: systemv/lpadmin.c:120 +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +#: systemv/lpadmin.c:558 +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +#: systemv/lpadmin.c:491 +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +#: systemv/lpadmin.c:574 +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +#: systemv/lpadmin.c:202 +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +#: systemv/lpadmin.c:221 +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +#: systemv/lpadmin.c:594 +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +#: systemv/lpadmin.c:274 +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +#: systemv/lpadmin.c:417 +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +#: systemv/lpadmin.c:294 +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +#: systemv/lpadmin.c:313 +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +#: systemv/lpadmin.c:164 +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +#: systemv/lpadmin.c:525 +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +#: systemv/lpadmin.c:975 +msgid "lpadmin: No member names were seen." +msgstr "" + +#: systemv/lpadmin.c:762 +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#: systemv/lpadmin.c:989 +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +#: systemv/lpadmin.c:175 systemv/lpadmin.c:324 systemv/lpadmin.c:536 +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +#: systemv/lpadmin.c:105 +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#: systemv/lpadmin.c:96 systemv/lpadmin.c:149 systemv/lpadmin.c:253 +#: systemv/lpadmin.c:339 systemv/lpadmin.c:393 systemv/lpadmin.c:510 +#: systemv/lpadmin.c:647 +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +#: systemv/lpadmin.c:1332 +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +#: systemv/lpadmin.c:402 +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#: systemv/lpadmin.c:1342 +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +#: systemv/lpadmin.c:348 +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +#: systemv/lpadmin.c:656 +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#: systemv/lpadmin.c:474 +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#: systemv/lpadmin.c:629 +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#: systemv/lpadmin.c:624 +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +#: systemv/lpadmin.c:580 +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +#: berkeley/lpc.c:76 berkeley/lpc.c:104 berkeley/lpc.c:140 +msgid "lpc> " +msgstr "" + +#: systemv/lpinfo.c:137 +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +#: systemv/lpinfo.c:190 +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +#: systemv/lpinfo.c:207 +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +#: systemv/lpinfo.c:224 +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +#: systemv/lpinfo.c:155 +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +#: systemv/lpinfo.c:173 +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +#: systemv/lpinfo.c:241 +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#: systemv/lpinfo.c:265 +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#: systemv/lpinfo.c:259 +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#: systemv/lpinfo.c:252 +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#: systemv/lpmove.c:133 +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#: systemv/lpmove.c:119 +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#: systemv/lpmove.c:97 +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +#: systemv/lpoptions.c:150 systemv/lpoptions.c:168 systemv/lpoptions.c:244 +msgid "lpoptions: No printers." +msgstr "" + +#: systemv/lpoptions.c:219 +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#: systemv/lpoptions.c:521 +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#: systemv/lpoptions.c:529 +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +#: systemv/lpoptions.c:99 +msgid "lpoptions: Unknown printer or class." +msgstr "" + +#: systemv/lppasswd.c:173 +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +#: systemv/lppasswd.c:302 +msgid "lppasswd: Password file busy." +msgstr "" + +#: systemv/lppasswd.c:431 +msgid "lppasswd: Password file not updated." +msgstr "" + +#: systemv/lppasswd.c:398 +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +#: systemv/lppasswd.c:253 +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +#: systemv/lppasswd.c:230 +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#: systemv/lppasswd.c:199 systemv/lppasswd.c:218 +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#: systemv/lppasswd.c:304 systemv/lppasswd.c:312 systemv/lppasswd.c:329 +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#: systemv/lppasswd.c:364 systemv/lppasswd.c:377 systemv/lppasswd.c:408 +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#: systemv/lppasswd.c:446 +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#: systemv/lppasswd.c:458 +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#: systemv/lppasswd.c:389 +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#: systemv/lpstat.c:1039 +#, c-format +msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#: systemv/lpstat.c:970 +#, c-format +msgid "members of class %s:" +msgstr "" + +#: berkeley/lpq.c:582 +msgid "no entries" +msgstr "" + +#: systemv/lpstat.c:1043 +msgid "no system default destination" +msgstr "" + +#: scheduler/ipp.c:6889 +msgid "notify-events not specified." +msgstr "" + +#: scheduler/ipp.c:2179 scheduler/ipp.c:6794 +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#: scheduler/ipp.c:2169 scheduler/ipp.c:6784 +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +#: cups/notify.c:87 +msgid "pending" +msgstr "" + +#: ppdc/ppdc.cxx:113 ppdc/ppdpo.cxx:93 +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#: ppdc/ppdpo.cxx:134 +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:412 +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-import.cxx:264 +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:1797 +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1115 +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2034 +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2720 +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#: ppdc/ppdc-source.cxx:1699 +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:934 +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:957 +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:396 +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1095 +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:449 +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:437 +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:505 +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:494 +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:516 +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:697 +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2906 +#, c-format +msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:828 +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1079 +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1690 +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1207 +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2620 +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1503 +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1682 +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:355 +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3278 +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1060 +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3109 +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3142 +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3232 +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3295 +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1158 +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1247 +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1783 +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:481 +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1575 +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1609 +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1587 +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1766 +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:341 ppdc/ppdc-catalog.cxx:353 +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1006 +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:574 +#, c-format +msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1864 +#, c-format +msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:363 +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1103 +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2795 +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3398 +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:730 +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:374 +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1087 +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:229 +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:974 +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:966 +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:982 +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1629 +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1601 +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:251 ppdc/ppdpo.cxx:123 +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:187 +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:126 +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:2413 ppdc/ppdc-source.cxx:2645 +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:2514 ppdc/ppdc-source.cxx:2549 +#: ppdc/ppdc-source.cxx:2579 +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:418 +#, c-format +msgid "ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#: ppdc/ppdc-driver.cxx:730 +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1652 ppdc/ppdc-source.cxx:2883 +#: ppdc/ppdc-source.cxx:2969 ppdc/ppdc-source.cxx:3062 +#: ppdc/ppdc-source.cxx:3195 ppdc/ppdc-source.cxx:3328 +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1645 +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:707 +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2496 +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:374 +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#: ppdc/ppdc.cxx:266 +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#: ppdc/ppdc.cxx:287 +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#: ppdc/ppdc.cxx:303 ppdc/ppdc.cxx:309 +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:1731 +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2652 +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:198 +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#: ppdc/ppdc.cxx:135 +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#: ppdc/ppdc-file.cxx:50 +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#: ppdc/ppdc-source.cxx:2055 +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:435 +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2925 +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:908 +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:3155 +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-catalog.cxx:463 +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#: ppdc/ppdc-source.cxx:3409 +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:1016 +#, c-format +msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#: ppdc/ppdc-source.cxx:2165 +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#: ppdc/ppdc.cxx:365 +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#: ppdc/ppdc.cxx:380 +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#: ppdc/ppdc.cxx:148 +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#: ppdc/ppdmerge.cxx:136 +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#: ppdc/ppdmerge.cxx:176 +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#: ppdc/ppdmerge.cxx:160 +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#: systemv/lpstat.c:1784 +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#: systemv/lpstat.c:1773 +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1778 +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1909 +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#: systemv/lpstat.c:1895 +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#: systemv/lpstat.c:1902 +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +#: cups/notify.c:93 cups/notify.c:134 +msgid "processing" +msgstr "" + +#: systemv/lp.c:639 +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +#: cups/snmp.c:1020 +msgid "request-id uses indefinite length" +msgstr "" + +#: systemv/lpstat.c:2048 +msgid "scheduler is not running" +msgstr "" + +#: systemv/lpstat.c:2044 +msgid "scheduler is running" +msgstr "" + +#: cups/adminutil.c:2276 +#, c-format +msgid "stat of %s failed: %s" +msgstr "" + +#: berkeley/lpc.c:211 +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +#: cups/notify.c:96 cups/notify.c:137 +msgid "stopped" +msgstr "" + +#: systemv/lpstat.c:1017 +#, c-format +msgid "system default destination: %s" +msgstr "" + +#: systemv/lpstat.c:1014 +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +#: cups/notify.c:108 cups/notify.c:140 +msgid "unknown" +msgstr "" + +#: cups/notify.c:117 +msgid "untitled" +msgstr "" + +#: cups/snmp.c:1045 +msgid "variable-bindings uses indefinite length" +msgstr "" + + +# +# End of "$Id$". +# diff --git a/locale/cups.strings b/locale/cups.strings new file mode 100644 index 0000000..e1795c8 --- /dev/null +++ b/locale/cups.strings @@ -0,0 +1,1572 @@ +"\t\t(all)" = "\t\t(all)"; +"\t\t(none)" = "\t\t(none)"; +"\t%d entries" = "\t%d entries"; +"\t%s" = "\t%s"; +"\tAfter fault: continue" = "\tAfter fault: continue"; +"\tAlerts: %s" = "\tAlerts: %s"; +"\tBanner required" = "\tBanner required"; +"\tCharset sets:" = "\tCharset sets:"; +"\tConnection: direct" = "\tConnection: direct"; +"\tConnection: remote" = "\tConnection: remote"; +"\tContent types: any" = "\tContent types: any"; +"\tDefault page size:" = "\tDefault page size:"; +"\tDefault pitch:" = "\tDefault pitch:"; +"\tDefault port settings:" = "\tDefault port settings:"; +"\tDescription: %s" = "\tDescription: %s"; +"\tForm mounted:" = "\tForm mounted:"; +"\tForms allowed:" = "\tForms allowed:"; +"\tInterface: %s.ppd" = "\tInterface: %s.ppd"; +"\tInterface: %s/interfaces/%s" = "\tInterface: %s/interfaces/%s"; +"\tInterface: %s/ppd/%s.ppd" = "\tInterface: %s/ppd/%s.ppd"; +"\tLocation: %s" = "\tLocation: %s"; +"\tOn fault: no alert" = "\tOn fault: no alert"; +"\tPrinter types: unknown" = "\tPrinter types: unknown"; +"\tStatus: %s" = "\tStatus: %s"; +"\tUsers allowed:" = "\tUsers allowed:"; +"\tUsers denied:" = "\tUsers denied:"; +"\tdaemon present" = "\tdaemon present"; +"\tno entries" = "\tno entries"; +"\tprinter is on device '%s' speed -1" = "\tprinter is on device '%s' speed -1"; +"\tprinting is disabled" = "\tprinting is disabled"; +"\tprinting is enabled" = "\tprinting is enabled"; +"\tqueued for %s" = "\tqueued for %s"; +"\tqueuing is disabled" = "\tqueuing is disabled"; +"\tqueuing is enabled" = "\tqueuing is enabled"; +"\treason unknown" = "\treason unknown"; +"\n DETAILED CONFORMANCE TEST RESULTS" = "\n DETAILED CONFORMANCE TEST RESULTS"; +" Ignore specific warnings." = " Ignore specific warnings."; +" Issue warnings instead of errors." = " Issue warnings instead of errors."; +" REF: Page 15, section 3.1." = " REF: Page 15, section 3.1."; +" REF: Page 15, section 3.2." = " REF: Page 15, section 3.2."; +" REF: Page 19, section 3.3." = " REF: Page 19, section 3.3."; +" REF: Page 20, section 3.4." = " REF: Page 20, section 3.4."; +" REF: Page 27, section 3.5." = " REF: Page 27, section 3.5."; +" REF: Page 42, section 5.2." = " REF: Page 42, section 5.2."; +" REF: Pages 16-17, section 3.2." = " REF: Pages 16-17, section 3.2."; +" REF: Pages 42-45, section 5.2." = " REF: Pages 42-45, section 5.2."; +" REF: Pages 45-46, section 5.2." = " REF: Pages 45-46, section 5.2."; +" REF: Pages 48-49, section 5.2." = " REF: Pages 48-49, section 5.2."; +" REF: Pages 52-54, section 5.2." = " REF: Pages 52-54, section 5.2."; +" %-39.39s %.0f bytes" = " %-39.39s %.0f bytes"; +" PASS Default%s" = " PASS Default%s"; +" PASS DefaultImageableArea" = " PASS DefaultImageableArea"; +" PASS DefaultPaperDimension" = " PASS DefaultPaperDimension"; +" PASS FileVersion" = " PASS FileVersion"; +" PASS FormatVersion" = " PASS FormatVersion"; +" PASS LanguageEncoding" = " PASS LanguageEncoding"; +" PASS LanguageVersion" = " PASS LanguageVersion"; +" PASS Manufacturer" = " PASS Manufacturer"; +" PASS ModelName" = " PASS ModelName"; +" PASS NickName" = " PASS NickName"; +" PASS PCFileName" = " PASS PCFileName"; +" PASS PSVersion" = " PASS PSVersion"; +" PASS PageRegion" = " PASS PageRegion"; +" PASS PageSize" = " PASS PageSize"; +" PASS Product" = " PASS Product"; +" PASS ShortNickName" = " PASS ShortNickName"; +" WARN %s has no corresponding options." = " WARN %s has no corresponding options."; +" WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2." = " WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2."; +" WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n REF: Page 122, section 5.17" = " WARN Duplex option keyword %s may not work as expected and should be named Duplex.\n REF: Page 122, section 5.17"; +" WARN File contains a mix of CR, LF, and CR LF line endings." = " WARN File contains a mix of CR, LF, and CR LF line endings."; +" WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3." = " WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3."; +" WARN Line %d only contains whitespace." = " WARN Line %d only contains whitespace."; +" WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3." = " WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3."; +" WARN Non-Windows PPD files should use lines ending with only LF, not CR LF." = " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF."; +" WARN Obsolete PPD version %.1f.\n REF: Page 42, section 5.2." = " WARN Obsolete PPD version %.1f.\n REF: Page 42, section 5.2."; +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3." = " WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3."; +" WARN PCFileName should contain a unique filename.\n REF: Pages 61-62, section 5.3." = " WARN PCFileName should contain a unique filename.\n REF: Pages 61-62, section 5.3."; +" WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7." = " WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7."; +" WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7." = " WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7."; +" WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3." = " WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3."; +" cupsaddsmb [options] -a" = " cupsaddsmb [options] -a"; +" cupstestdsc [options] -" = " cupstestdsc [options] -"; +" program | cupstestppd [options] -" = " program | cupstestppd [options] -"; +" %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")." = " %s \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")."; +" %s %s %s does not exist." = " %s %s %s does not exist."; +" %s %s file \"%s\" has the wrong capitalization." = " %s %s file \"%s\" has the wrong capitalization."; +" %s Bad %s choice %s.\n REF: Page 122, section 5.17" = " %s Bad %s choice %s.\n REF: Page 122, section 5.17"; +" %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." = " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s."; +" %s Bad UTF-8 \"%s\" translation string for option %s." = " %s Bad UTF-8 \"%s\" translation string for option %s."; +" %s Bad cupsFilter value \"%s\"." = " %s Bad cupsFilter value \"%s\"."; +" %s Bad cupsFilter2 value \"%s\"." = " %s Bad cupsFilter2 value \"%s\"."; +" %s Bad cupsICCProfile %s." = " %s Bad cupsICCProfile %s."; +" %s Bad cupsPreFilter value \"%s\"." = " %s Bad cupsPreFilter value \"%s\"."; +" %s Bad cupsUIConstraints %s: \"%s\"" = " %s Bad cupsUIConstraints %s: \"%s\""; +" %s Bad language \"%s\"." = " %s Bad language \"%s\"."; +" %s Bad permissions on %s file \"%s\"." = " %s Bad permissions on %s file \"%s\"."; +" %s Bad spelling of %s - should be %s." = " %s Bad spelling of %s - should be %s."; +" %s Cannot provide both APScanAppPath and APScanAppBundleID." = " %s Cannot provide both APScanAppPath and APScanAppBundleID."; +" %s Default choices conflicting." = " %s Default choices conflicting."; +" %s Empty cupsUIConstraints %s" = " %s Empty cupsUIConstraints %s"; +" %s Missing \"%s\" translation string for option %s, choice %s." = " %s Missing \"%s\" translation string for option %s, choice %s."; +" %s Missing \"%s\" translation string for option %s." = " %s Missing \"%s\" translation string for option %s."; +" %s Missing %s file \"%s\"." = " %s Missing %s file \"%s\"."; +" %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14." = " %s Missing REQUIRED PageRegion option.\n REF: Page 100, section 5.14."; +" %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14." = " %s Missing REQUIRED PageSize option.\n REF: Page 99, section 5.14."; +" %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"."; +" %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" = " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\""; +" %s Missing cupsUIResolver %s" = " %s Missing cupsUIResolver %s"; +" %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." = " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"."; +" %s Missing option %s in cupsUIConstraints %s: \"%s\"" = " %s Missing option %s in cupsUIConstraints %s: \"%s\""; +" %s No base translation \"%s\" is included in file." = " %s No base translation \"%s\" is included in file."; +" %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17" = " %s REQUIRED %s does not define choice None.\n REF: Page 122, section 5.17"; +" %s Size \"%s\" defined for %s but not for %s." = " %s Size \"%s\" defined for %s but not for %s."; +" %s Size \"%s\" has unexpected dimensions (%gx%g)." = " %s Size \"%s\" has unexpected dimensions (%gx%g)."; +" %s Size \"%s\" should be \"%s\"." = " %s Size \"%s\" should be \"%s\"."; +" %s Size \"%s\" should be the Adobe standard name \"%s\"." = " %s Size \"%s\" should be the Adobe standard name \"%s\"."; +" %s cupsICCProfile %s hash value collides with %s." = " %s cupsICCProfile %s hash value collides with %s."; +" %s cupsUIResolver %s causes a loop." = " %s cupsUIResolver %s causes a loop."; +" %s cupsUIResolver %s does not list at least two different options." = " %s cupsUIResolver %s does not list at least two different options."; +" **FAIL** %s choice names %s and %s differ only by case." = " **FAIL** %s choice names %s and %s differ only by case."; +" **FAIL** %s must be 1284DeviceID\n REF: Page 72, section 5.5" = " **FAIL** %s must be 1284DeviceID\n REF: Page 72, section 5.5"; +" **FAIL** BAD Default%s %s\n REF: Page 40, section 4.5." = " **FAIL** BAD Default%s %s\n REF: Page 40, section 4.5."; +" **FAIL** BAD DefaultImageableArea %s\n REF: Page 102, section 5.15." = " **FAIL** BAD DefaultImageableArea %s\n REF: Page 102, section 5.15."; +" **FAIL** BAD DefaultPaperDimension %s\n REF: Page 103, section 5.15." = " **FAIL** BAD DefaultPaperDimension %s\n REF: Page 103, section 5.15."; +" **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4." = " **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4."; +" **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1." = " **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1."; +" **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1." = " **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1."; +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3." = " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3."; +" **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3." = " **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3."; +" **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3." = " **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3."; +" **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3." = " **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3."; +" **FAIL** Bad %s choice %s\n REF: Page 84, section 5.9" = " **FAIL** Bad %s choice %s\n REF: Page 84, section 5.9"; +" **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3."; +" **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3." = " **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3."; +" **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." = " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1."; +" **FAIL** Bad LanguageVersion %s - must be English." = " **FAIL** Bad LanguageVersion %s - must be English."; +" **FAIL** Default option code cannot be interpreted: %s" = " **FAIL** Default option code cannot be interpreted: %s"; +" **FAIL** Default translation string for option %s choice %s contains 8-bit characters." = " **FAIL** Default translation string for option %s choice %s contains 8-bit characters."; +" **FAIL** Default translation string for option %s contains 8-bit characters." = " **FAIL** Default translation string for option %s contains 8-bit characters."; +" **FAIL** Group names %s and %s differ only by case." = " **FAIL** Group names %s and %s differ only by case."; +" **FAIL** Multiple occurrences of %s choice name %s." = " **FAIL** Multiple occurrences of %s choice name %s."; +" **FAIL** Option names %s and %s differ only by case." = " **FAIL** Option names %s and %s differ only by case."; +" **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5." = " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5."; +" **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15." = " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15."; +" **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15." = " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15."; +" **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3." = " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3."; +" **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3." = " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3."; +" **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15." = " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15."; +" **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3." = " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3."; +" **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3." = " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3."; +" **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3." = " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3."; +" **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3." = " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3."; +" **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3." = " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3."; +" **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3." = " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3."; +" **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3." = " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3."; +" **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14." = " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14."; +" **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14." = " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14."; +" **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14." = " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14."; +" **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15." = " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15."; +" **FAIL** REQUIRED Product\n REF: Page 62, section 5.3." = " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3."; +" **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3." = " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3."; +" **FAIL** Unable to open PPD file - %s" = " **FAIL** Unable to open PPD file - %s"; +" **FAIL** Unable to open PPD file - %s on line %d." = " **FAIL** Unable to open PPD file - %s on line %d."; +" %d ERRORS FOUND" = " %d ERRORS FOUND"; +" -h Show program usage" = " -h Show program usage"; +" Bad %%%%BoundingBox: on line %d.\n REF: Page 39, %%%%BoundingBox:" = " Bad %%%%BoundingBox: on line %d.\n REF: Page 39, %%%%BoundingBox:"; +" Bad %%%%Page: on line %d.\n REF: Page 53, %%%%Page:" = " Bad %%%%Page: on line %d.\n REF: Page 53, %%%%Page:"; +" Bad %%%%Pages: on line %d.\n REF: Page 43, %%%%Pages:" = " Bad %%%%Pages: on line %d.\n REF: Page 43, %%%%Pages:"; +" Line %d is longer than 255 characters (%d).\n REF: Page 25, Line Length" = " Line %d is longer than 255 characters (%d).\n REF: Page 25, Line Length"; +" Missing %!PS-Adobe-3.0 on first line.\n REF: Page 17, 3.1 Conforming Documents" = " Missing %!PS-Adobe-3.0 on first line.\n REF: Page 17, 3.1 Conforming Documents"; +" Missing %%EndComments comment. REF: Page 41, %%EndComments" = " Missing %%EndComments comment. REF: Page 41, %%EndComments"; +" Missing or bad %%BoundingBox: comment.\n REF: Page 39, %%BoundingBox:" = " Missing or bad %%BoundingBox: comment.\n REF: Page 39, %%BoundingBox:"; +" Missing or bad %%Page: comments.\n REF: Page 53, %%Page:" = " Missing or bad %%Page: comments.\n REF: Page 53, %%Page:"; +" Missing or bad %%Pages: comment.\n REF: Page 43, %%Pages:" = " Missing or bad %%Pages: comment.\n REF: Page 43, %%Pages:"; +" NO ERRORS FOUND" = " NO ERRORS FOUND"; +" Saw %d lines that exceeded 255 characters." = " Saw %d lines that exceeded 255 characters."; +" Too many %%BeginDocument comments." = " Too many %%BeginDocument comments."; +" Too many %%EndDocument comments." = " Too many %%EndDocument comments."; +" Warning: file contains binary data." = " Warning: file contains binary data."; +" Warning: no %%EndComments comment in file." = " Warning: no %%EndComments comment in file."; +" Warning: obsolete DSC version %.1f in file." = " Warning: obsolete DSC version %.1f in file."; +" --[no-]debug-logging Turn debug logging on/off." = " --[no-]debug-logging Turn debug logging on/off."; +" --[no-]remote-admin Turn remote administration on/off." = " --[no-]remote-admin Turn remote administration on/off."; +" --[no-]remote-any Allow/prevent access from the Internet." = " --[no-]remote-any Allow/prevent access from the Internet."; +" --[no-]remote-printers Show/hide remote printers." = " --[no-]remote-printers Show/hide remote printers."; +" --[no-]share-printers Turn printer sharing on/off." = " --[no-]share-printers Turn printer sharing on/off."; +" --[no-]user-cancel-any Allow/prevent users to cancel any job." = " --[no-]user-cancel-any Allow/prevent users to cancel any job."; +" --cr End lines with CR (Mac OS 9)." = " --cr End lines with CR (Mac OS 9)."; +" --crlf End lines with CR + LF (Windows)." = " --crlf End lines with CR + LF (Windows)."; +" --lf End lines with LF (UNIX/Linux/Mac OS X)." = " --lf End lines with LF (UNIX/Linux/Mac OS X)."; +" -4 Connect using IPv4." = " -4 Connect using IPv4."; +" -6 Connect using IPv6." = " -6 Connect using IPv6."; +" -C Send requests using chunking (default)." = " -C Send requests using chunking (default)."; +" -D Remove the input file when finished." = " -D Remove the input file when finished."; +" -D name=value Set named variable to value." = " -D name=value Set named variable to value."; +" -E Enable encryption." = " -E Enable encryption."; +" -E Encrypt the connection to the server." = " -E Encrypt the connection to the server."; +" -E Test with TLS encryption." = " -E Test with TLS encryption."; +" -F Run in the foreground but detach from console." = " -F Run in the foreground but detach from console."; +" -H samba-server Use the named SAMBA server." = " -H samba-server Use the named SAMBA server."; +" -I Ignore errors." = " -I Ignore errors."; +" -I include-dir Add include directory to search path." = " -I include-dir Add include directory to search path."; +" -I {filename,filters,none,profiles}" = " -I {filename,filters,none,profiles}"; +" -J title Set title." = " -J title Set title."; +" -L Send requests using content-length." = " -L Send requests using content-length."; +" -P filename.ppd Set PPD file." = " -P filename.ppd Set PPD file."; +" -R root-directory Set alternate root." = " -R root-directory Set alternate root."; +" -S Test with SSL encryption." = " -S Test with SSL encryption."; +" -T Set the receive/send timeout in seconds." = " -T Set the receive/send timeout in seconds."; +" -U samba-user Authenticate using the named SAMBA user." = " -U samba-user Authenticate using the named SAMBA user."; +" -U username Set username for job." = " -U username Set username for job."; +" -U username Specify username." = " -U username Specify username."; +" -V version Set default IPP version." = " -V version Set default IPP version."; +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}" = " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes,translations}"; +" -X Produce XML plist instead of plain text." = " -X Produce XML plist instead of plain text."; +" -a Export all printers." = " -a Export all printers."; +" -a 'name=value ...' Set option(s)." = " -a 'name=value ...' Set option(s)."; +" -c catalog.po Load the specified message catalog." = " -c catalog.po Load the specified message catalog."; +" -c config-file Load alternate configuration file." = " -c config-file Load alternate configuration file."; +" -c copies Set number of copies." = " -c copies Set number of copies."; +" -c cupsd.conf Set cupsd.conf file to use." = " -c cupsd.conf Set cupsd.conf file to use."; +" -d name=value Set named variable to value." = " -d name=value Set named variable to value."; +" -d output-dir Specify the output directory." = " -d output-dir Specify the output directory."; +" -d printer Use the named printer." = " -d printer Use the named printer."; +" -e Use every filter from the PPD file." = " -e Use every filter from the PPD file."; +" -f Run in the foreground." = " -f Run in the foreground."; +" -f filename Set default request filename." = " -f filename Set default request filename."; +" -f filename Set file to be converted (otherwise stdin)." = " -f filename Set file to be converted (otherwise stdin)."; +" -h Show this usage message." = " -h Show this usage message."; +" -h cups-server Use the named CUPS server." = " -h cups-server Use the named CUPS server."; +" -h server[:port] Specify server address." = " -h server[:port] Specify server address."; +" -i mime/type Set input MIME type (otherwise auto-typed)." = " -i mime/type Set input MIME type (otherwise auto-typed)."; +" -i seconds Repeat the last file with the given time interval." = " -i seconds Repeat the last file with the given time interval."; +" -j job-id[,N] Filter file N from the specified job (default is file 1)." = " -j job-id[,N] Filter file N from the specified job (default is file 1)."; +" -j mime/type Set output MIME type (otherwise application/pdf)." = " -j mime/type Set output MIME type (otherwise application/pdf)."; +" -l Run cupsd from launchd(8)." = " -l Run cupsd from launchd(8)."; +" -l lang[,lang,...] Specify the output language(s) (locale)." = " -l lang[,lang,...] Specify the output language(s) (locale)."; +" -m Use the ModelName value as the filename." = " -m Use the ModelName value as the filename."; +" -m mime/type Set output MIME type (otherwise application/pdf)." = " -m mime/type Set output MIME type (otherwise application/pdf)."; +" -n copies Set number of copies." = " -n copies Set number of copies."; +" -n count Repeat the last file the given number of times." = " -n count Repeat the last file the given number of times."; +" -o filename Set file to be generated (otherwise stdout)." = " -o filename Set file to be generated (otherwise stdout)."; +" -o filename.drv Set driver information file (otherwise ppdi.drv)." = " -o filename.drv Set driver information file (otherwise ppdi.drv)."; +" -o filename.ppd[.gz] Set output file (otherwise stdout)." = " -o filename.ppd[.gz] Set output file (otherwise stdout)."; +" -o name=value Set option(s)." = " -o name=value Set option(s)."; +" -p filename.ppd Set PPD file." = " -p filename.ppd Set PPD file."; +" -q Be quiet - no output except errors." = " -q Be quiet - no output except errors."; +" -q Run silently." = " -q Run silently."; +" -r Use 'relaxed' open mode." = " -r Use 'relaxed' open mode."; +" -t Produce a test report." = " -t Produce a test report."; +" -t Test PPDs instead of generating them." = " -t Test PPDs instead of generating them."; +" -t Test the configuration file." = " -t Test the configuration file."; +" -t title Set title." = " -t title Set title."; +" -u Remove the PPD file when finished." = " -u Remove the PPD file when finished."; +" -v Be slightly verbose." = " -v Be slightly verbose."; +" -v Be verbose (more v's for more verbosity)." = " -v Be verbose (more v's for more verbosity)."; +" -v Be verbose (show commands)." = " -v Be verbose (show commands)."; +" -v Show all attributes sent and received." = " -v Show all attributes sent and received."; +" -vv Be very verbose." = " -vv Be very verbose."; +" -z Compress PPD files using GNU zip." = " -z Compress PPD files using GNU zip."; +" FAIL" = " FAIL"; +" PASS" = " PASS"; +"%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" = "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes"; +"%-7s %-7.7s %-7d %-31.31s %.0f bytes" = "%-7s %-7.7s %-7d %-31.31s %.0f bytes"; +"%.0f x %.0f millimeters" = "%.0f x %.0f millimeters"; +"%.0f x %.0f to %.0f x %.0f millimeters" = "%.0f x %.0f to %.0f x %.0f millimeters"; +"%.2f x %.2f inches" = "%.2f x %.2f inches"; +"%.2f x %.2f to %.2f x %.2f inches" = "%.2f x %.2f to %.2f x %.2f inches"; +"%s accepting requests since %s" = "%s accepting requests since %s"; +"%s cannot be changed." = "%s cannot be changed."; +"%s is not implemented by the CUPS version of lpc." = "%s is not implemented by the CUPS version of lpc."; +"%s is not ready" = "%s is not ready"; +"%s is ready" = "%s is ready"; +"%s is ready and printing" = "%s is ready and printing"; +"%s job-id user title copies options [file]" = "%s job-id user title copies options [file]"; +"%s not accepting requests since %s -" = "%s not accepting requests since %s -"; +"%s not supported." = "%s not supported."; +"%s/%s accepting requests since %s" = "%s/%s accepting requests since %s"; +"%s/%s not accepting requests since %s -" = "%s/%s not accepting requests since %s -"; +"%s: %-33.33s [job %d localhost]" = "%s: %-33.33s [job %d localhost]"; +// TRANSLATORS: Message is "subject: error" +"%s: %s" = "%s: %s"; +"%s: %s failed: %s" = "%s: %s failed: %s"; +"%s: Don't know what to do." = "%s: Don't know what to do."; +"%s: Error - %s environment variable names non-existent destination \"%s\"." = "%s: Error - %s environment variable names non-existent destination \"%s\"."; +"%s: Error - bad job ID." = "%s: Error - bad job ID."; +"%s: Error - cannot print files and alter jobs simultaneously." = "%s: Error - cannot print files and alter jobs simultaneously."; +"%s: Error - cannot print from stdin if files or a job ID are provided." = "%s: Error - cannot print from stdin if files or a job ID are provided."; +"%s: Error - expected character set after \"-S\" option." = "%s: Error - expected character set after \"-S\" option."; +"%s: Error - expected content type after \"-T\" option." = "%s: Error - expected content type after \"-T\" option."; +"%s: Error - expected copies after \"-#\" option." = "%s: Error - expected copies after \"-#\" option."; +"%s: Error - expected copies after \"-n\" option." = "%s: Error - expected copies after \"-n\" option."; +"%s: Error - expected destination after \"-P\" option." = "%s: Error - expected destination after \"-P\" option."; +"%s: Error - expected destination after \"-b\" option." = "%s: Error - expected destination after \"-b\" option."; +"%s: Error - expected destination after \"-d\" option." = "%s: Error - expected destination after \"-d\" option."; +"%s: Error - expected form after \"-f\" option." = "%s: Error - expected form after \"-f\" option."; +"%s: Error - expected hold name after \"-H\" option." = "%s: Error - expected hold name after \"-H\" option."; +"%s: Error - expected hostname after \"-H\" option." = "%s: Error - expected hostname after \"-H\" option."; +"%s: Error - expected hostname after \"-h\" option." = "%s: Error - expected hostname after \"-h\" option."; +"%s: Error - expected mode list after \"-y\" option." = "%s: Error - expected mode list after \"-y\" option."; +"%s: Error - expected name after \"-%c\" option." = "%s: Error - expected name after \"-%c\" option."; +"%s: Error - expected option=value after \"-o\" option." = "%s: Error - expected option=value after \"-o\" option."; +"%s: Error - expected page list after \"-P\" option." = "%s: Error - expected page list after \"-P\" option."; +"%s: Error - expected priority after \"-%c\" option." = "%s: Error - expected priority after \"-%c\" option."; +"%s: Error - expected reason text after \"-r\" option." = "%s: Error - expected reason text after \"-r\" option."; +"%s: Error - expected title after \"-t\" option." = "%s: Error - expected title after \"-t\" option."; +"%s: Error - expected username after \"-U\" option." = "%s: Error - expected username after \"-U\" option."; +"%s: Error - expected username after \"-u\" option." = "%s: Error - expected username after \"-u\" option."; +"%s: Error - expected value after \"-%c\" option." = "%s: Error - expected value after \"-%c\" option."; +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option." = "%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" option."; +"%s: Error - no default destination available." = "%s: Error - no default destination available."; +"%s: Error - priority must be between 1 and 100." = "%s: Error - priority must be between 1 and 100."; +"%s: Error - scheduler not responding." = "%s: Error - scheduler not responding."; +"%s: Error - too many files - \"%s\"." = "%s: Error - too many files - \"%s\"."; +"%s: Error - unable to access \"%s\" - %s" = "%s: Error - unable to access \"%s\" - %s"; +"%s: Error - unable to queue from stdin - %s." = "%s: Error - unable to queue from stdin - %s."; +"%s: Error - unknown destination \"%s\"." = "%s: Error - unknown destination \"%s\"."; +"%s: Error - unknown destination \"%s/%s\"." = "%s: Error - unknown destination \"%s/%s\"."; +"%s: Error - unknown option \"%c\"." = "%s: Error - unknown option \"%c\"."; +"%s: Error - unknown option \"%s\"." = "%s: Error - unknown option \"%s\"."; +"%s: Expected job ID after \"-i\" option." = "%s: Expected job ID after \"-i\" option."; +"%s: Invalid destination name in list \"%s\"." = "%s: Invalid destination name in list \"%s\"."; +"%s: Invalid filter string \"%s\"." = "%s: Invalid filter string \"%s\"."; +"%s: Need job ID (\"-i jobid\") before \"-H restart\"." = "%s: Need job ID (\"-i jobid\") before \"-H restart\"."; +"%s: No filter to convert from %s/%s to %s/%s." = "%s: No filter to convert from %s/%s to %s/%s."; +"%s: Operation failed: %s" = "%s: Operation failed: %s"; +"%s: Sorry, no encryption support." = "%s: Sorry, no encryption support."; +"%s: Unable to connect to server." = "%s: Unable to connect to server."; +"%s: Unable to contact server." = "%s: Unable to contact server."; +"%s: Unable to determine MIME type of \"%s\"." = "%s: Unable to determine MIME type of \"%s\"."; +"%s: Unable to open %s: %s" = "%s: Unable to open %s: %s"; +"%s: Unable to open PPD file: %s on line %d." = "%s: Unable to open PPD file: %s on line %d."; +"%s: Unable to read MIME database from \"%s\" or \"%s\"." = "%s: Unable to read MIME database from \"%s\" or \"%s\"."; +"%s: Unknown destination \"%s\"." = "%s: Unknown destination \"%s\"."; +"%s: Unknown destination MIME type %s/%s." = "%s: Unknown destination MIME type %s/%s."; +"%s: Unknown option \"%c\"." = "%s: Unknown option \"%c\"."; +"%s: Unknown source MIME type %s/%s." = "%s: Unknown source MIME type %s/%s."; +"%s: Warning - \"%c\" format modifier not supported - output may not be correct." = "%s: Warning - \"%c\" format modifier not supported - output may not be correct."; +"%s: Warning - character set option ignored." = "%s: Warning - character set option ignored."; +"%s: Warning - content type option ignored." = "%s: Warning - content type option ignored."; +"%s: Warning - form option ignored." = "%s: Warning - form option ignored."; +"%s: Warning - mode option ignored." = "%s: Warning - mode option ignored."; +"-1" = "-1"; +"-10" = "-10"; +"-100" = "-100"; +"-105" = "-105"; +"-11" = "-11"; +"-110" = "-110"; +"-115" = "-115"; +"-12" = "-12"; +"-120" = "-120"; +"-13" = "-13"; +"-14" = "-14"; +"-15" = "-15"; +"-2" = "-2"; +"-20" = "-20"; +"-25" = "-25"; +"-3" = "-3"; +"-30" = "-30"; +"-35" = "-35"; +"-4" = "-4"; +"-40" = "-40"; +"-45" = "-45"; +"-5" = "-5"; +"-50" = "-50"; +"-55" = "-55"; +"-6" = "-6"; +"-60" = "-60"; +"-65" = "-65"; +"-7" = "-7"; +"-70" = "-70"; +"-75" = "-75"; +"-8" = "-8"; +"-80" = "-80"; +"-85" = "-85"; +"-9" = "-9"; +"-90" = "-90"; +"-95" = "-95"; +"0" = "0"; +"1" = "1"; +"1 inch/sec." = "1 inch/sec."; +"1.25x0.25\"" = "1.25x0.25\""; +"1.25x2.25\"" = "1.25x2.25\""; +"1.5 inch/sec." = "1.5 inch/sec."; +"1.50x0.25\"" = "1.50x0.25\""; +"1.50x0.50\"" = "1.50x0.50\""; +"1.50x1.00\"" = "1.50x1.00\""; +"1.50x2.00\"" = "1.50x2.00\""; +"10" = "10"; +"10 inches/sec." = "10 inches/sec."; +"10 x 11" = "10 x 11"; +"10 x 13" = "10 x 13"; +"10 x 14" = "10 x 14"; +"100" = "100"; +"100 mm/sec." = "100 mm/sec."; +"105" = "105"; +"11" = "11"; +"11 inches/sec." = "11 inches/sec."; +"110" = "110"; +"115" = "115"; +"12" = "12"; +"12 inches/sec." = "12 inches/sec."; +"12 x 11" = "12 x 11"; +"120" = "120"; +"120 mm/sec." = "120 mm/sec."; +"120x60dpi" = "120x60dpi"; +"120x72dpi" = "120x72dpi"; +"13" = "13"; +"136dpi" = "136dpi"; +"14" = "14"; +"15" = "15"; +"15 mm/sec." = "15 mm/sec."; +"15 x 11" = "15 x 11"; +"150 mm/sec." = "150 mm/sec."; +"150dpi" = "150dpi"; +"16" = "16"; +"17" = "17"; +"18" = "18"; +"180dpi" = "180dpi"; +"19" = "19"; +"2" = "2"; +"2 inches/sec." = "2 inches/sec."; +"2-Sided Printing" = "2-Sided Printing"; +"2.00x0.37\"" = "2.00x0.37\""; +"2.00x0.50\"" = "2.00x0.50\""; +"2.00x1.00\"" = "2.00x1.00\""; +"2.00x1.25\"" = "2.00x1.25\""; +"2.00x2.00\"" = "2.00x2.00\""; +"2.00x3.00\"" = "2.00x3.00\""; +"2.00x4.00\"" = "2.00x4.00\""; +"2.00x5.50\"" = "2.00x5.50\""; +"2.25x0.50\"" = "2.25x0.50\""; +"2.25x1.25\"" = "2.25x1.25\""; +"2.25x4.00\"" = "2.25x4.00\""; +"2.25x5.50\"" = "2.25x5.50\""; +"2.38x5.50\"" = "2.38x5.50\""; +"2.5 inches/sec." = "2.5 inches/sec."; +"2.50x1.00\"" = "2.50x1.00\""; +"2.50x2.00\"" = "2.50x2.00\""; +"2.75x1.25\"" = "2.75x1.25\""; +"2.9 x 1\"" = "2.9 x 1\""; +"20" = "20"; +"20 mm/sec." = "20 mm/sec."; +"200 mm/sec." = "200 mm/sec."; +"203dpi" = "203dpi"; +"21" = "21"; +"22" = "22"; +"23" = "23"; +"24" = "24"; +"24-Pin Series" = "24-Pin Series"; +"240x72dpi" = "240x72dpi"; +"25" = "25"; +"250 mm/sec." = "250 mm/sec."; +"26" = "26"; +"27" = "27"; +"28" = "28"; +"29" = "29"; +"3" = "3"; +"3 inches/sec." = "3 inches/sec."; +"3 x 5" = "3 x 5"; +"3.00x1.00\"" = "3.00x1.00\""; +"3.00x1.25\"" = "3.00x1.25\""; +"3.00x2.00\"" = "3.00x2.00\""; +"3.00x3.00\"" = "3.00x3.00\""; +"3.00x5.00\"" = "3.00x5.00\""; +"3.25x2.00\"" = "3.25x2.00\""; +"3.25x5.00\"" = "3.25x5.00\""; +"3.25x5.50\"" = "3.25x5.50\""; +"3.25x5.83\"" = "3.25x5.83\""; +"3.25x7.83\"" = "3.25x7.83\""; +"3.5 x 5" = "3.5 x 5"; +"3.5\" Disk" = "3.5\" Disk"; +"3.5\" Disk - 2 1/8 x 2 3/4\"" = "3.5\" Disk - 2 1/8 x 2 3/4\""; +"3.50x1.00\"" = "3.50x1.00\""; +"30" = "30"; +"30 mm/sec." = "30 mm/sec."; +"300 mm/sec." = "300 mm/sec."; +"300dpi" = "300dpi"; +"35" = "35"; +"360dpi" = "360dpi"; +"360x180dpi" = "360x180dpi"; +"4" = "4"; +"4 inches/sec." = "4 inches/sec."; +"4.00x1.00\"" = "4.00x1.00\""; +"4.00x13.00\"" = "4.00x13.00\""; +"4.00x2.00\"" = "4.00x2.00\""; +"4.00x2.50\"" = "4.00x2.50\""; +"4.00x3.00\"" = "4.00x3.00\""; +"4.00x4.00\"" = "4.00x4.00\""; +"4.00x5.00\"" = "4.00x5.00\""; +"4.00x6.00\"" = "4.00x6.00\""; +"4.00x6.50\"" = "4.00x6.50\""; +"40" = "40"; +"40 mm/sec." = "40 mm/sec."; +"45" = "45"; +"5" = "5"; +"5 inches/sec." = "5 inches/sec."; +"5 x 7" = "5 x 7"; +"50" = "50"; +"55" = "55"; +"6" = "6"; +"6 inches/sec." = "6 inches/sec."; +"6.00x1.00\"" = "6.00x1.00\""; +"6.00x2.00\"" = "6.00x2.00\""; +"6.00x3.00\"" = "6.00x3.00\""; +"6.00x4.00\"" = "6.00x4.00\""; +"6.00x5.00\"" = "6.00x5.00\""; +"6.00x6.00\"" = "6.00x6.00\""; +"6.00x6.50\"" = "6.00x6.50\""; +"60" = "60"; +"60 mm/sec." = "60 mm/sec."; +"600dpi" = "600dpi"; +"60dpi" = "60dpi"; +"60x72dpi" = "60x72dpi"; +"65" = "65"; +"7" = "7"; +"7 inches/sec." = "7 inches/sec."; +"7 x 9" = "7 x 9"; +"70" = "70"; +"720dpi" = "720dpi"; +"75" = "75"; +"8" = "8"; +"8 inches/sec." = "8 inches/sec."; +"8 x 10" = "8 x 10"; +"8.00x1.00\"" = "8.00x1.00\""; +"8.00x2.00\"" = "8.00x2.00\""; +"8.00x3.00\"" = "8.00x3.00\""; +"8.00x4.00\"" = "8.00x4.00\""; +"8.00x5.00\"" = "8.00x5.00\""; +"8.00x6.00\"" = "8.00x6.00\""; +"8.00x6.50\"" = "8.00x6.50\""; +"80" = "80"; +"80 mm/sec." = "80 mm/sec."; +"85" = "85"; +"9" = "9"; +"9 inches/sec." = "9 inches/sec."; +"9 x 11" = "9 x 11"; +"9 x 12" = "9 x 12"; +"9-Pin Series" = "9-Pin Series"; +"90" = "90"; +"95" = "95"; +"?Invalid help command unknown." = "?Invalid help command unknown."; +"A Samba password is required to export printer drivers" = "A Samba password is required to export printer drivers"; +"A Samba username is required to export printer drivers" = "A Samba username is required to export printer drivers"; +"A class named \"%s\" already exists." = "A class named \"%s\" already exists."; +"A printer named \"%s\" already exists." = "A printer named \"%s\" already exists."; +"A0" = "A0"; +"A0 Long Edge" = "A0 Long Edge"; +"A1" = "A1"; +"A1 Long Edge" = "A1 Long Edge"; +"A10" = "A10"; +"A2" = "A2"; +"A2 Long Edge" = "A2 Long Edge"; +"A3" = "A3"; +"A3 Long Edge" = "A3 Long Edge"; +"A3 Oversize" = "A3 Oversize"; +"A3 Oversize Long Edge" = "A3 Oversize Long Edge"; +"A4" = "A4"; +"A4 Long Edge" = "A4 Long Edge"; +"A4 Oversize" = "A4 Oversize"; +"A4 Small" = "A4 Small"; +"A5" = "A5"; +"A5 Long Edge" = "A5 Long Edge"; +"A5 Oversize" = "A5 Oversize"; +"A6" = "A6"; +"A6 Long Edge" = "A6 Long Edge"; +"A7" = "A7"; +"A8" = "A8"; +"A9" = "A9"; +"ANSI A" = "ANSI A"; +"ANSI B" = "ANSI B"; +"ANSI C" = "ANSI C"; +"ANSI D" = "ANSI D"; +"ANSI E" = "ANSI E"; +"ARCH C" = "ARCH C"; +"ARCH C Long Edge" = "ARCH C Long Edge"; +"ARCH D" = "ARCH D"; +"ARCH D Long Edge" = "ARCH D Long Edge"; +"ARCH E" = "ARCH E"; +"ARCH E Long Edge" = "ARCH E Long Edge"; +"Accept Jobs" = "Accept Jobs"; +"Accepted" = "Accepted"; +"Add Class" = "Add Class"; +"Add Printer" = "Add Printer"; +"Add RSS Subscription" = "Add RSS Subscription"; +"Address" = "Address"; +"Address - 1 1/8 x 3 1/2\"" = "Address - 1 1/8 x 3 1/2\""; +"Administration" = "Administration"; +"Always" = "Always"; +"AppSocket/HP JetDirect" = "AppSocket/HP JetDirect"; +"Applicator" = "Applicator"; +"Attempt to set %s printer-state to bad value %d." = "Attempt to set %s printer-state to bad value %d."; +"Attribute groups are out of order (%x < %x)." = "Attribute groups are out of order (%x < %x)."; +"B0" = "B0"; +"B1" = "B1"; +"B10" = "B10"; +"B2" = "B2"; +"B3" = "B3"; +"B4" = "B4"; +"B5" = "B5"; +"B5 Oversize" = "B5 Oversize"; +"B6" = "B6"; +"B7" = "B7"; +"B8" = "B8"; +"B9" = "B9"; +"Bad NULL dests pointer" = "Bad NULL dests pointer"; +"Bad OpenGroup" = "Bad OpenGroup"; +"Bad OpenUI/JCLOpenUI" = "Bad OpenUI/JCLOpenUI"; +"Bad OrderDependency" = "Bad OrderDependency"; +"Bad PPD cache file." = "Bad PPD cache file."; +"Bad Request" = "Bad Request"; +"Bad SNMP version number" = "Bad SNMP version number"; +"Bad UIConstraints" = "Bad UIConstraints"; +"Bad charset file \"%s\"." = "Bad charset file \"%s\"."; +"Bad charset type: %s" = "Bad charset type: %s"; +"Bad columns value %d." = "Bad columns value %d."; +"Bad copies value %d." = "Bad copies value %d."; +"Bad cpi value %f." = "Bad cpi value %f."; +"Bad custom parameter" = "Bad custom parameter"; +"Bad device-uri \"%s\"." = "Bad device-uri \"%s\"."; +"Bad device-uri scheme \"%s\"." = "Bad device-uri scheme \"%s\"."; +"Bad document-format \"%s\"." = "Bad document-format \"%s\"."; +"Bad document-format-default \"%s\"." = "Bad document-format-default \"%s\"."; +"Bad filename buffer" = "Bad filename buffer"; +"Bad font description line \"%s\"." = "Bad font description line \"%s\"."; +"Bad font description line: %s" = "Bad font description line: %s"; +"Bad job-priority value." = "Bad job-priority value."; +"Bad job-sheets value \"%s\"." = "Bad job-sheets value \"%s\"."; +"Bad job-sheets value type." = "Bad job-sheets value type."; +"Bad job-state value." = "Bad job-state value."; +"Bad job-uri \"%s\"." = "Bad job-uri \"%s\"."; +"Bad lpi value %f." = "Bad lpi value %f."; +"Bad notify-pull-method \"%s\"." = "Bad notify-pull-method \"%s\"."; +"Bad notify-recipient-uri \"%s\"." = "Bad notify-recipient-uri \"%s\"."; +"Bad number-up value %d." = "Bad number-up value %d."; +"Bad option + choice on line %d." = "Bad option + choice on line %d."; +"Bad page-ranges values %d-%d." = "Bad page-ranges values %d-%d."; +"Bad port-monitor \"%s\"." = "Bad port-monitor \"%s\"."; +"Bad printer-state value %d." = "Bad printer-state value %d."; +"Bad request ID %d." = "Bad request ID %d."; +"Bad request version number %d.%d." = "Bad request version number %d.%d."; +"Bad subscription ID" = "Bad subscription ID"; +"Bad text direction \"%s\"." = "Bad text direction \"%s\"."; +"Bad text direction: %s" = "Bad text direction: %s"; +"Bad text width \"%s\"." = "Bad text width \"%s\"."; +"Bad text width: %s" = "Bad text width: %s"; +"Bad value string" = "Bad value string"; +"Banners" = "Banners"; +"Billing Information: " = "Billing Information: "; +"Bond Paper" = "Bond Paper"; +"Boolean expected for waiteof option \"%s\"." = "Boolean expected for waiteof option \"%s\"."; +"Buffer overflow detected, aborting." = "Buffer overflow detected, aborting."; +"CMYK" = "CMYK"; +"CPCL Label Printer" = "CPCL Label Printer"; +"Cancel RSS Subscription" = "Cancel RSS Subscription"; +"Canceling print job." = "Canceling print job."; +"Cannot share a remote Kerberized printer." = "Cannot share a remote Kerberized printer."; +"Cassette" = "Cassette"; +"Change Settings" = "Change Settings"; +"Character set \"%s\" not supported." = "Character set \"%s\" not supported."; +"Classes" = "Classes"; +"Clean Print Heads" = "Clean Print Heads"; +"Close-Job doesn't support the job-uri attribute." = "Close-Job doesn't support the job-uri attribute."; +"Color" = "Color"; +"Color Mode" = "Color Mode"; +"Commands may be abbreviated. Commands are:\n\nexit help quit status ?" = "Commands may be abbreviated. Commands are:\n\nexit help quit status ?"; +"Community name uses indefinite length" = "Community name uses indefinite length"; +"Connected to printer." = "Connected to printer."; +"Connecting to printer." = "Connecting to printer."; +"Continue" = "Continue"; +"Continuous" = "Continuous"; +"Control file sent successfully." = "Control file sent successfully."; +"Copying print data." = "Copying print data."; +"Created" = "Created"; +"Created On: " = "Created On: "; +"Custom" = "Custom"; +"CustominCutInterval" = "CustominCutInterval"; +"CustominTearInterval" = "CustominTearInterval"; +"Cut" = "Cut"; +"Cutter" = "Cutter"; +"Dark" = "Dark"; +"Darkness" = "Darkness"; +"Data file sent successfully." = "Data file sent successfully."; +"Delete Class" = "Delete Class"; +"Delete Printer" = "Delete Printer"; +"Description: " = "Description: "; +"DeskJet Series" = "DeskJet Series"; +"Destination \"%s\" is not accepting jobs." = "Destination \"%s\" is not accepting jobs."; +"Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s" = "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s"; +"Direct Thermal Media" = "Direct Thermal Media"; +"Directory \"%s\" contains a relative path." = "Directory \"%s\" contains a relative path."; +"Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."; +"Directory \"%s\" is a file." = "Directory \"%s\" is a file."; +"Directory \"%s\" not available: %s" = "Directory \"%s\" not available: %s"; +"Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)."; +"Disabled" = "Disabled"; +"Document #%d does not exist in job #%d." = "Document #%d does not exist in job #%d."; +"Driver Name: " = "Driver Name: "; +"Driver Version: " = "Driver Version: "; +"Duplexer" = "Duplexer"; +"Dymo" = "Dymo"; +"EPL1 Label Printer" = "EPL1 Label Printer"; +"EPL2 Label Printer" = "EPL2 Label Printer"; +"Edit Configuration File" = "Edit Configuration File"; +"Empty PPD file." = "Empty PPD file."; +// TRANSLATORS: Banner/cover sheet after the print job. +"Ending Banner" = "Ending Banner"; +"English" = "English"; +"Enter old password:" = "Enter old password:"; +"Enter password again:" = "Enter password again:"; +"Enter password:" = "Enter password:"; +"Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." = "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket."; +"Envelope #10 " = "Envelope #10 "; +"Envelope #11" = "Envelope #11"; +"Envelope #12" = "Envelope #12"; +"Envelope #14" = "Envelope #14"; +"Envelope #9" = "Envelope #9"; +"Envelope B4" = "Envelope B4"; +"Envelope B5" = "Envelope B5"; +"Envelope B6" = "Envelope B6"; +"Envelope C0" = "Envelope C0"; +"Envelope C1" = "Envelope C1"; +"Envelope C2" = "Envelope C2"; +"Envelope C3" = "Envelope C3"; +"Envelope C4" = "Envelope C4"; +"Envelope C5" = "Envelope C5"; +"Envelope C6" = "Envelope C6"; +"Envelope C65" = "Envelope C65"; +"Envelope C7" = "Envelope C7"; +"Envelope Choukei 3" = "Envelope Choukei 3"; +"Envelope Choukei 3 Long Edge" = "Envelope Choukei 3 Long Edge"; +"Envelope Choukei 4" = "Envelope Choukei 4"; +"Envelope Choukei 4 Long Edge" = "Envelope Choukei 4 Long Edge"; +"Envelope DL" = "Envelope DL"; +"Envelope Feed" = "Envelope Feed"; +"Envelope Invite" = "Envelope Invite"; +"Envelope Italian" = "Envelope Italian"; +"Envelope Kaku2" = "Envelope Kaku2"; +"Envelope Kaku2 Long Edge" = "Envelope Kaku2 Long Edge"; +"Envelope Kaku3" = "Envelope Kaku3"; +"Envelope Kaku3 Long Edge" = "Envelope Kaku3 Long Edge"; +"Envelope Monarch" = "Envelope Monarch"; +"Envelope PRC1 " = "Envelope PRC1 "; +"Envelope PRC1 Long Edge" = "Envelope PRC1 Long Edge"; +"Envelope PRC10" = "Envelope PRC10"; +"Envelope PRC10 Long Edge" = "Envelope PRC10 Long Edge"; +"Envelope PRC2" = "Envelope PRC2"; +"Envelope PRC2 Long Edge" = "Envelope PRC2 Long Edge"; +"Envelope PRC3" = "Envelope PRC3"; +"Envelope PRC3 Long Edge" = "Envelope PRC3 Long Edge"; +"Envelope PRC4" = "Envelope PRC4"; +"Envelope PRC4 Long Edge" = "Envelope PRC4 Long Edge"; +"Envelope PRC5 Long Edge" = "Envelope PRC5 Long Edge"; +"Envelope PRC5PRC5" = "Envelope PRC5PRC5"; +"Envelope PRC6" = "Envelope PRC6"; +"Envelope PRC6 Long Edge" = "Envelope PRC6 Long Edge"; +"Envelope PRC7" = "Envelope PRC7"; +"Envelope PRC7 Long Edge" = "Envelope PRC7 Long Edge"; +"Envelope PRC8" = "Envelope PRC8"; +"Envelope PRC8 Long Edge" = "Envelope PRC8 Long Edge"; +"Envelope PRC9" = "Envelope PRC9"; +"Envelope PRC9 Long Edge" = "Envelope PRC9 Long Edge"; +"Envelope Personal" = "Envelope Personal"; +"Envelope You4" = "Envelope You4"; +"Envelope You4 Long Edge" = "Envelope You4 Long Edge"; +"Epson" = "Epson"; +"Error Policy" = "Error Policy"; +"Error sending raster data." = "Error sending raster data."; +"Error: need hostname after \"-h\" option." = "Error: need hostname after \"-h\" option."; +"Every 10 Labels" = "Every 10 Labels"; +"Every 2 Labels" = "Every 2 Labels"; +"Every 3 Labels" = "Every 3 Labels"; +"Every 4 Labels" = "Every 4 Labels"; +"Every 5 Labels" = "Every 5 Labels"; +"Every 6 Labels" = "Every 6 Labels"; +"Every 7 Labels" = "Every 7 Labels"; +"Every 8 Labels" = "Every 8 Labels"; +"Every 9 Labels" = "Every 9 Labels"; +"Every Label" = "Every Label"; +"Executive" = "Executive"; +"Expectation Failed" = "Expectation Failed"; +"Export Printers to Samba" = "Export Printers to Samba"; +"FAIL" = "FAIL"; +"FanFold German" = "FanFold German"; +"FanFold Legal German" = "FanFold Legal German"; +"Fanfold US" = "Fanfold US"; +"File \"%s\" contains a relative path." = "File \"%s\" contains a relative path."; +"File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." = "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)."; +"File \"%s\" is a directory." = "File \"%s\" is a directory."; +"File \"%s\" not available: %s" = "File \"%s\" not available: %s"; +"File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." = "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)."; +"File Folder" = "File Folder"; +"File Folder - 9/16 x 3 7/16\"" = "File Folder - 9/16 x 3 7/16\""; +"File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cupsd.conf\"." = "File device URIs have been disabled. To enable, see the FileDevice directive in \"%s/cupsd.conf\"."; +"Finished page %d." = "Finished page %d."; +"Folio" = "Folio"; +"Forbidden" = "Forbidden"; +"Formatting page %d." = "Formatting page %d."; +"General" = "General"; +"Generic" = "Generic"; +"Get-Response-PDU uses indefinite length" = "Get-Response-PDU uses indefinite length"; +"Glossy Paper" = "Glossy Paper"; +"Got a printer-uri attribute but no job-id." = "Got a printer-uri attribute but no job-id."; +"Grayscale" = "Grayscale"; +"HP" = "HP"; +"Hanging Folder" = "Hanging Folder"; +"Hanging Folder - 9/16 x 2\"" = "Hanging Folder - 9/16 x 2\""; +"IPP 1setOf attribute with incompatible value tags." = "IPP 1setOf attribute with incompatible value tags."; +"IPP attribute has no name." = "IPP attribute has no name."; +"IPP begCollection value not 0 bytes." = "IPP begCollection value not 0 bytes."; +"IPP boolean value not 1 byte." = "IPP boolean value not 1 byte."; +"IPP date value not 11 bytes." = "IPP date value not 11 bytes."; +"IPP endCollection value not 0 bytes." = "IPP endCollection value not 0 bytes."; +"IPP enum value not 4 bytes." = "IPP enum value not 4 bytes."; +"IPP integer value not 4 bytes." = "IPP integer value not 4 bytes."; +"IPP language length overflows value." = "IPP language length overflows value."; +"IPP member name is not empty." = "IPP member name is not empty."; +"IPP name larger than 32767 bytes." = "IPP name larger than 32767 bytes."; +"IPP nameWithLanguage value less than minimum 4 bytes." = "IPP nameWithLanguage value less than minimum 4 bytes."; +"IPP rangeOfInteger value not 8 bytes." = "IPP rangeOfInteger value not 8 bytes."; +"IPP resolution value not 9 bytes." = "IPP resolution value not 9 bytes."; +"IPP string length overflows value." = "IPP string length overflows value."; +"IPP textWithLanguage value less than minimum 4 bytes." = "IPP textWithLanguage value less than minimum 4 bytes."; +"IPP value larger than 32767 bytes." = "IPP value larger than 32767 bytes."; +"ISOLatin1" = "ISOLatin1"; +"Illegal control character" = "Illegal control character"; +"Illegal main keyword string" = "Illegal main keyword string"; +"Illegal option keyword string" = "Illegal option keyword string"; +"Illegal translation string" = "Illegal translation string"; +"Illegal whitespace character" = "Illegal whitespace character"; +"Installable Options" = "Installable Options"; +"Installed" = "Installed"; +"IntelliBar Label Printer" = "IntelliBar Label Printer"; +"Intellitech" = "Intellitech"; +"Internal Server Error" = "Internal Server Error"; +"Internal error" = "Internal error"; +"Internet Postage 2-Part" = "Internet Postage 2-Part"; +"Internet Postage 2-Part - 2 1/4 x 7 1/2\"" = "Internet Postage 2-Part - 2 1/4 x 7 1/2\""; +"Internet Postage 3-Part" = "Internet Postage 3-Part"; +"Internet Postage 3-Part - 2 1/4 x 7\"" = "Internet Postage 3-Part - 2 1/4 x 7\""; +"Internet Printing Protocol" = "Internet Printing Protocol"; +"Invalid printer command \"%s\"." = "Invalid printer command \"%s\"."; +"JCL" = "JCL"; +"JIS B0" = "JIS B0"; +"JIS B1" = "JIS B1"; +"JIS B10" = "JIS B10"; +"JIS B2" = "JIS B2"; +"JIS B3" = "JIS B3"; +"JIS B4" = "JIS B4"; +"JIS B4 Long Edge" = "JIS B4 Long Edge"; +"JIS B5" = "JIS B5"; +"JIS B5 Long Edge" = "JIS B5 Long Edge"; +"JIS B6" = "JIS B6"; +"JIS B6 Long Edge" = "JIS B6 Long Edge"; +"JIS B7" = "JIS B7"; +"JIS B8" = "JIS B8"; +"JIS B9" = "JIS B9"; +"Job #%d cannot be restarted - no files." = "Job #%d cannot be restarted - no files."; +"Job #%d does not exist." = "Job #%d does not exist."; +"Job #%d is already aborted - can't cancel." = "Job #%d is already aborted - can't cancel."; +"Job #%d is already canceled - can't cancel." = "Job #%d is already canceled - can't cancel."; +"Job #%d is already completed - can't cancel." = "Job #%d is already completed - can't cancel."; +"Job #%d is finished and cannot be altered." = "Job #%d is finished and cannot be altered."; +"Job #%d is not complete." = "Job #%d is not complete."; +"Job #%d is not held for authentication." = "Job #%d is not held for authentication."; +"Job #%d is not held." = "Job #%d is not held."; +"Job Completed" = "Job Completed"; +"Job Created" = "Job Created"; +"Job ID: " = "Job ID: "; +"Job Options Changed" = "Job Options Changed"; +"Job Stopped" = "Job Stopped"; +"Job UUID: " = "Job UUID: "; +"Job is completed and cannot be changed." = "Job is completed and cannot be changed."; +"Job operation failed:" = "Job operation failed:"; +"Job state cannot be changed." = "Job state cannot be changed."; +"Job subscriptions cannot be renewed." = "Job subscriptions cannot be renewed."; +"Jobs" = "Jobs"; +"LPD/LPR Host or Printer" = "LPD/LPR Host or Printer"; +"Label Printer" = "Label Printer"; +"Label Top" = "Label Top"; +"Language \"%s\" not supported." = "Language \"%s\" not supported."; +"Large Address" = "Large Address"; +"Large Address - 1 4/10 x 3 1/2\"" = "Large Address - 1 4/10 x 3 1/2\""; +"LaserJet Series PCL 4/5" = "LaserJet Series PCL 4/5"; +"Letter Oversize" = "Letter Oversize"; +"Letter Oversize Long Edge" = "Letter Oversize Long Edge"; +"Light" = "Light"; +"Line longer than the maximum allowed (255 characters)" = "Line longer than the maximum allowed (255 characters)"; +"List Available Printers" = "List Available Printers"; +"Loading print file." = "Loading print file."; +"Location: " = "Location: "; +"Long-Edge (Portrait)" = "Long-Edge (Portrait)"; +"Looking for printer." = "Looking for printer."; +"Make and Model: " = "Make and Model: "; +"Manual Feed" = "Manual Feed"; +"Media Dimensions: " = "Media Dimensions: "; +"Media Limits: " = "Media Limits: "; +"Media Name: " = "Media Name: "; +"Media Size" = "Media Size"; +"Media Source" = "Media Source"; +"Media Tracking" = "Media Tracking"; +"Media Type" = "Media Type"; +"Medium" = "Medium"; +"Memory allocation error" = "Memory allocation error"; +"Missing CloseGroup" = "Missing CloseGroup"; +"Missing PPD-Adobe-4.x header" = "Missing PPD-Adobe-4.x header"; +"Missing asterisk in column 1" = "Missing asterisk in column 1"; +"Missing document-number attribute." = "Missing document-number attribute."; +"Missing double quote on line %d." = "Missing double quote on line %d."; +"Missing form variable" = "Missing form variable"; +"Missing last-document attribute in request." = "Missing last-document attribute in request."; +"Missing media or media-col." = "Missing media or media-col."; +"Missing media-size in media-col." = "Missing media-size in media-col."; +"Missing notify-subscription-ids attribute." = "Missing notify-subscription-ids attribute."; +"Missing option keyword" = "Missing option keyword"; +"Missing requesting-user-name attribute." = "Missing requesting-user-name attribute."; +"Missing required attributes." = "Missing required attributes."; +"Missing value on line %d of banner file." = "Missing value on line %d of banner file."; +"Missing value on line %d." = "Missing value on line %d."; +"Missing value string" = "Missing value string"; +"Missing x-dimension in media-size." = "Missing x-dimension in media-size."; +"Missing y-dimension in media-size." = "Missing y-dimension in media-size."; +"Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s" = "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s"; +"Modify Class" = "Modify Class"; +"Modify Printer" = "Modify Printer"; +"Move All Jobs" = "Move All Jobs"; +"Move Job" = "Move Job"; +"Moved Permanently" = "Moved Permanently"; +"NULL PPD file pointer" = "NULL PPD file pointer"; +"Name OID uses indefinite length" = "Name OID uses indefinite length"; +"Nested classes are not allowed." = "Nested classes are not allowed."; +"Never" = "Never"; +"New Stylus Color Series" = "New Stylus Color Series"; +"New Stylus Photo Series" = "New Stylus Photo Series"; +"No" = "No"; +"No Content" = "No Content"; +"No PPD name" = "No PPD name"; +"No VarBind SEQUENCE" = "No VarBind SEQUENCE"; +"No Windows printer drivers are installed." = "No Windows printer drivers are installed."; +"No active connection" = "No active connection"; +"No active jobs on %s." = "No active jobs on %s."; +"No attributes in request." = "No attributes in request."; +"No authentication information provided." = "No authentication information provided."; +"No community name" = "No community name"; +"No default printer." = "No default printer."; +"No destinations added." = "No destinations added."; +"No device URI found in argv[0] or in DEVICE_URI environment variable." = "No device URI found in argv[0] or in DEVICE_URI environment variable."; +"No error-index" = "No error-index"; +"No error-status" = "No error-status"; +"No file in print request." = "No file in print request."; +"No fonts in charset file." = "No fonts in charset file."; +"No modification time" = "No modification time"; +"No name OID" = "No name OID"; +"No pages were found." = "No pages were found."; +"No printer name" = "No printer name"; +"No printer-uri found" = "No printer-uri found"; +"No printer-uri found for class" = "No printer-uri found for class"; +"No printer-uri in request." = "No printer-uri in request."; +"No request-id" = "No request-id"; +"No subscription attributes in request." = "No subscription attributes in request."; +"No subscriptions found." = "No subscriptions found."; +"No variable-bindings SEQUENCE" = "No variable-bindings SEQUENCE"; +"No version number" = "No version number"; +"Non-continuous (Mark sensing)" = "Non-continuous (Mark sensing)"; +"Non-continuous (Web sensing)" = "Non-continuous (Web sensing)"; +"Normal" = "Normal"; +"Not Found" = "Not Found"; +"Not Implemented" = "Not Implemented"; +"Not Installed" = "Not Installed"; +"Not Modified" = "Not Modified"; +"Not Supported" = "Not Supported"; +"Not allowed to print." = "Not allowed to print."; +"Note" = "Note"; +"Note: this program only validates the DSC comments, not the PostScript itself." = "Note: this program only validates the DSC comments, not the PostScript itself."; +"OK" = "OK"; +"Off (1-Sided)" = "Off (1-Sided)"; +"Oki" = "Oki"; +"Online Help" = "Online Help"; +"Open of %s failed: %s" = "Open of %s failed: %s"; +"OpenGroup without a CloseGroup first" = "OpenGroup without a CloseGroup first"; +"OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" = "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first"; +"Operation Policy" = "Operation Policy"; +"Option \"%s\" cannot be included via %%%%IncludeFeature." = "Option \"%s\" cannot be included via %%%%IncludeFeature."; +"Options Installed" = "Options Installed"; +"Options:" = "Options:"; +"Options: " = "Options: "; +"Out of date PPD cache file." = "Out of date PPD cache file."; +"Out of memory." = "Out of memory."; +"Output Mode" = "Output Mode"; +"Output for printer %s is sent to %s" = "Output for printer %s is sent to %s"; +"Output for printer %s is sent to remote printer %s on %s" = "Output for printer %s is sent to remote printer %s on %s"; +"Output for printer %s/%s is sent to %s" = "Output for printer %s/%s is sent to %s"; +"Output for printer %s/%s is sent to remote printer %s on %s" = "Output for printer %s/%s is sent to remote printer %s on %s"; +"PASS" = "PASS"; +"PCL Laser Printer" = "PCL Laser Printer"; +"PRC16K" = "PRC16K"; +"PRC16K Long Edge" = "PRC16K Long Edge"; +"PRC32K" = "PRC32K"; +"PRC32K Long Edge" = "PRC32K Long Edge"; +"PRC32K Oversize" = "PRC32K Oversize"; +"PRC32K Oversize Long Edge" = "PRC32K Oversize Long Edge"; +"Packet does not contain a Get-Response-PDU" = "Packet does not contain a Get-Response-PDU"; +"Packet does not start with SEQUENCE" = "Packet does not start with SEQUENCE"; +"ParamCustominCutInterval" = "ParamCustominCutInterval"; +"ParamCustominTearInterval" = "ParamCustominTearInterval"; +"Password for %s on %s? " = "Password for %s on %s? "; +"Password for %s required to access %s via SAMBA: " = "Password for %s required to access %s via SAMBA: "; +"Pause Class" = "Pause Class"; +"Pause Printer" = "Pause Printer"; +"Peel-Off" = "Peel-Off"; +"Photo" = "Photo"; +"Photo Labels" = "Photo Labels"; +"Plain Paper" = "Plain Paper"; +"Policies" = "Policies"; +"Port Monitor" = "Port Monitor"; +"PostScript Printer" = "PostScript Printer"; +"Postcard" = "Postcard"; +"Postcard Double " = "Postcard Double "; +"Postcard Double Long Edge" = "Postcard Double Long Edge"; +"Postcard Long Edge" = "Postcard Long Edge"; +"Print Density" = "Print Density"; +"Print Job:" = "Print Job:"; +"Print Mode" = "Print Mode"; +"Print Rate" = "Print Rate"; +"Print Self-Test Page" = "Print Self-Test Page"; +"Print Speed" = "Print Speed"; +"Print Test Page" = "Print Test Page"; +"Print and Cut" = "Print and Cut"; +"Print and Tear" = "Print and Tear"; +"Print file accepted - job ID %d." = "Print file accepted - job ID %d."; +"Print file accepted - job ID unknown." = "Print file accepted - job ID unknown."; +"Print file sent." = "Print file sent."; +"Print file was not accepted." = "Print file was not accepted."; +"Print job too large." = "Print job too large."; +"Printed For: " = "Printed For: "; +"Printed From: " = "Printed From: "; +"Printed On: " = "Printed On: "; +"Printer Added" = "Printer Added"; +"Printer Default" = "Printer Default"; +"Printer Deleted" = "Printer Deleted"; +"Printer Modified" = "Printer Modified"; +"Printer Name: " = "Printer Name: "; +"Printer Paused" = "Printer Paused"; +"Printer Settings" = "Printer Settings"; +"Printer busy, will retry in 10 seconds." = "Printer busy, will retry in 10 seconds."; +"Printer busy; will retry in 30 seconds." = "Printer busy; will retry in 30 seconds."; +"Printer did not respond." = "Printer did not respond."; +"Printer does not support IPP/%d.%d, trying IPP/%s." = "Printer does not support IPP/%d.%d, trying IPP/%s."; +"Printer is busy, will retry in 5 seconds." = "Printer is busy, will retry in 5 seconds."; +"Printer is not currently connected." = "Printer is not currently connected."; +"Printer is now connected." = "Printer is now connected."; +"Printer is now online." = "Printer is now online."; +"Printer is offline." = "Printer is offline."; +"Printer not connected, will retry in 30 seconds." = "Printer not connected, will retry in 30 seconds."; +"Printer not connected; will retry in 30 seconds." = "Printer not connected; will retry in 30 seconds."; +"Printer:" = "Printer:"; +"Printers" = "Printers"; +"Printing page %d, %d%% complete." = "Printing page %d, %d%% complete."; +"Printing page %d." = "Printing page %d."; +"Purge Jobs" = "Purge Jobs"; +"Quarto" = "Quarto"; +"Quota limit reached." = "Quota limit reached."; +"Rank Owner Job File(s) Total Size" = "Rank Owner Job File(s) Total Size"; +// TRANSLATORS: Pri is job priority. +"Rank Owner Pri Job Files Total Size" = "Rank Owner Pri Job Files Total Size"; +"Ready to print." = "Ready to print."; +"Reject Jobs" = "Reject Jobs"; +"Remote host did not accept control file (%d)." = "Remote host did not accept control file (%d)."; +"Remote host did not accept data file (%d)." = "Remote host did not accept data file (%d)."; +"Reprint After Error" = "Reprint After Error"; +"Request Entity Too Large" = "Request Entity Too Large"; +"Resolution" = "Resolution"; +"Resume Class" = "Resume Class"; +"Resume Printer" = "Resume Printer"; +"Return Address" = "Return Address"; +"Return Address - 3/4 x 2\"" = "Return Address - 3/4 x 2\""; +"Rewind" = "Rewind"; +"Running command: %s %s -N -A %s -c '%s'" = "Running command: %s %s -N -A %s -c '%s'"; +"SEQUENCE uses indefinite length" = "SEQUENCE uses indefinite length"; +"SSL/TLS Negotiation Error" = "SSL/TLS Negotiation Error"; +"See Other" = "See Other"; +"Sending data to printer." = "Sending data to printer."; +"Serial Port #%d" = "Serial Port #%d"; +"Server Restarted" = "Server Restarted"; +"Server Security Auditing" = "Server Security Auditing"; +"Server Started" = "Server Started"; +"Server Stopped" = "Server Stopped"; +"Service Unavailable" = "Service Unavailable"; +"Set Allowed Users" = "Set Allowed Users"; +"Set As Server Default" = "Set As Server Default"; +"Set Class Options" = "Set Class Options"; +"Set Printer Options" = "Set Printer Options"; +"Set Publishing" = "Set Publishing"; +"Shipping Address" = "Shipping Address"; +"Shipping Address - 2 5/16 x 4\"" = "Shipping Address - 2 5/16 x 4\""; +"Short-Edge (Landscape)" = "Short-Edge (Landscape)"; +"Special Paper" = "Special Paper"; +"Spooling job, %.0f%% complete." = "Spooling job, %.0f%% complete."; +"Standard" = "Standard"; +// TRANSLATORS: Banner/cover sheet before the print job. +"Starting Banner" = "Starting Banner"; +"Starting page %d." = "Starting page %d."; +"Statement" = "Statement"; +"Stylus Color Series" = "Stylus Color Series"; +"Stylus Photo Series" = "Stylus Photo Series"; +"Subscription #%d does not exist." = "Subscription #%d does not exist."; +"Super A" = "Super A"; +"Super B" = "Super B"; +"Super B/A3" = "Super B/A3"; +"Switching Protocols" = "Switching Protocols"; +"Tabloid" = "Tabloid"; +"Tabloid Oversize" = "Tabloid Oversize"; +"Tabloid Oversize Long Edge" = "Tabloid Oversize Long Edge"; +"Tear" = "Tear"; +"Tear-Off" = "Tear-Off"; +"Tear-Off Adjust Position" = "Tear-Off Adjust Position"; +"The %s attribute cannot be provided with job-ids." = "The %s attribute cannot be provided with job-ids."; +"The PPD file \"%s\" could not be found." = "The PPD file \"%s\" could not be found."; +"The PPD file \"%s\" could not be opened: %s" = "The PPD file \"%s\" could not be opened: %s"; +"The PPD file could not be opened." = "The PPD file could not be opened."; +"The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." = "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."; +"The developer unit needs to be replaced." = "The developer unit needs to be replaced."; +"The developer unit will need to be replaced soon." = "The developer unit will need to be replaced soon."; +"The fuser's temperature is high." = "The fuser's temperature is high."; +"The fuser's temperature is low." = "The fuser's temperature is low."; +"The notify-lease-duration attribute cannot be used with job subscriptions." = "The notify-lease-duration attribute cannot be used with job subscriptions."; +"The notify-user-data value is too large (%d > 63 octets)." = "The notify-user-data value is too large (%d > 63 octets)."; +"The optical photoconductor needs to be replaced." = "The optical photoconductor needs to be replaced."; +"The optical photoconductor will need to be replaced soon." = "The optical photoconductor will need to be replaced soon."; +"The output bin is almost full." = "The output bin is almost full."; +"The output bin is full." = "The output bin is full."; +"The output bin is missing." = "The output bin is missing."; +"The page setup information was not valid." = "The page setup information was not valid."; +"The paper tray is almost empty." = "The paper tray is almost empty."; +"The paper tray is empty." = "The paper tray is empty."; +"The paper tray is missing." = "The paper tray is missing."; +"The paper tray needs to be filled." = "The paper tray needs to be filled."; +"The print file could not be opened." = "The print file could not be opened."; +"The printer URI is incorrect or no longer exists." = "The printer URI is incorrect or no longer exists."; +"The printer is busy." = "The printer is busy."; +"The printer is not connected." = "The printer is not connected."; +"The printer is not responding." = "The printer is not responding."; +"The printer is out of ink." = "The printer is out of ink."; +"The printer is running low on ink." = "The printer is running low on ink."; +"The printer is running low on toner." = "The printer is running low on toner."; +"The printer is unreachable at this time." = "The printer is unreachable at this time."; +"The printer may be out of toner." = "The printer may be out of toner."; +"The printer may not exist or is unavailable at this time." = "The printer may not exist or is unavailable at this time."; +"The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." = "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)."; +"The printer or class does not exist." = "The printer or class does not exist."; +"The printer or class is not shared." = "The printer or class is not shared."; +"The printer's cover is open." = "The printer's cover is open."; +"The printer's door is open." = "The printer's door is open."; +"The printer's interlock is open." = "The printer's interlock is open."; +"The printer's waste bin is almost full." = "The printer's waste bin is almost full."; +"The printer's waste bin is full." = "The printer's waste bin is full."; +"The printer-uri \"%s\" contains invalid characters." = "The printer-uri \"%s\" contains invalid characters."; +"The printer-uri attribute is required." = "The printer-uri attribute is required."; +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." = "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"."; +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." = "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"."; +"The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." = "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)."; +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it." = "The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to enable it."; +"The which-jobs value \"%s\" is not supported." = "The which-jobs value \"%s\" is not supported."; +"There are too many subscriptions." = "There are too many subscriptions."; +"There is a paper jam." = "There is a paper jam."; +"There was an unrecoverable USB error." = "There was an unrecoverable USB error."; +"Thermal Transfer Media" = "Thermal Transfer Media"; +"Title: " = "Title: "; +"Too many active jobs." = "Too many active jobs."; +"Too many job-sheets values (%d > 2)." = "Too many job-sheets values (%d > 2)."; +"Too many printer-state-reasons values (%d > %d)." = "Too many printer-state-reasons values (%d > %d)."; +"Transparency" = "Transparency"; +"Tray" = "Tray"; +"Tray 1" = "Tray 1"; +"Tray 2" = "Tray 2"; +"Tray 3" = "Tray 3"; +"Tray 4" = "Tray 4"; +"URI Too Long" = "URI Too Long"; +"US Ledger" = "US Ledger"; +"US Legal" = "US Legal"; +"US Legal Oversize" = "US Legal Oversize"; +"US Letter" = "US Letter"; +"US Letter Long Edge" = "US Letter Long Edge"; +"US Letter Oversize" = "US Letter Oversize"; +"US Letter Oversize Long Edge" = "US Letter Oversize Long Edge"; +"US Letter Small" = "US Letter Small"; +"USB Serial Port #%d" = "USB Serial Port #%d"; +"Unable to access cupsd.conf file:" = "Unable to access cupsd.conf file:"; +"Unable to add RSS subscription:" = "Unable to add RSS subscription:"; +"Unable to add class:" = "Unable to add class:"; +"Unable to add document to print job." = "Unable to add document to print job."; +"Unable to add job for destination \"%s\"." = "Unable to add job for destination \"%s\"."; +"Unable to add printer:" = "Unable to add printer:"; +"Unable to allocate memory for file types." = "Unable to allocate memory for file types."; +"Unable to allocate memory for page info" = "Unable to allocate memory for page info"; +"Unable to allocate memory for pages array" = "Unable to allocate memory for pages array"; +"Unable to cancel RSS subscription:" = "Unable to cancel RSS subscription:"; +"Unable to cancel print job." = "Unable to cancel print job."; +"Unable to change printer-is-shared attribute:" = "Unable to change printer-is-shared attribute:"; +"Unable to change printer:" = "Unable to change printer:"; +"Unable to change server settings:" = "Unable to change server settings:"; +"Unable to configure printer options." = "Unable to configure printer options."; +"Unable to connect to host." = "Unable to connect to host."; +"Unable to contact printer, queuing on next printer in class." = "Unable to contact printer, queuing on next printer in class."; +"Unable to copy 64-bit CUPS printer driver files (%d)." = "Unable to copy 64-bit CUPS printer driver files (%d)."; +"Unable to copy 64-bit Windows printer driver files (%d)." = "Unable to copy 64-bit Windows printer driver files (%d)."; +"Unable to copy CUPS printer driver files (%d)." = "Unable to copy CUPS printer driver files (%d)."; +"Unable to copy PPD file - %s" = "Unable to copy PPD file - %s"; +"Unable to copy PPD file." = "Unable to copy PPD file."; +"Unable to copy Windows 2000 printer driver files (%d)." = "Unable to copy Windows 2000 printer driver files (%d)."; +"Unable to copy Windows 9x printer driver files (%d)." = "Unable to copy Windows 9x printer driver files (%d)."; +"Unable to copy interface script - %s" = "Unable to copy interface script - %s"; +"Unable to copy print file" = "Unable to copy print file"; +"Unable to create compressed print file" = "Unable to create compressed print file"; +"Unable to create pipes for filters" = "Unable to create pipes for filters"; +"Unable to create printer-uri" = "Unable to create printer-uri"; +"Unable to create temporary file" = "Unable to create temporary file"; +"Unable to create temporary file:" = "Unable to create temporary file:"; +"Unable to delete class:" = "Unable to delete class:"; +"Unable to delete printer:" = "Unable to delete printer:"; +"Unable to do maintenance command:" = "Unable to do maintenance command:"; +"Unable to edit cupsd.conf files larger than 1MB" = "Unable to edit cupsd.conf files larger than 1MB"; +"Unable to establish a secure connection to host (certificate chain invalid)." = "Unable to establish a secure connection to host (certificate chain invalid)."; +"Unable to establish a secure connection to host (certificate not yet valid)." = "Unable to establish a secure connection to host (certificate not yet valid)."; +"Unable to establish a secure connection to host (expired certificate)." = "Unable to establish a secure connection to host (expired certificate)."; +"Unable to establish a secure connection to host (host name mismatch)." = "Unable to establish a secure connection to host (host name mismatch)."; +"Unable to establish a secure connection to host (peer dropped connection before responding)." = "Unable to establish a secure connection to host (peer dropped connection before responding)."; +"Unable to establish a secure connection to host (self-signed certificate)." = "Unable to establish a secure connection to host (self-signed certificate)."; +"Unable to establish a secure connection to host (untrusted certificate)." = "Unable to establish a secure connection to host (untrusted certificate)."; +"Unable to establish a secure connection to host." = "Unable to establish a secure connection to host."; +"Unable to find destination for job" = "Unable to find destination for job"; +"Unable to find printer." = "Unable to find printer."; +"Unable to fork filter" = "Unable to fork filter"; +"Unable to generate compressed print file" = "Unable to generate compressed print file"; +"Unable to get backend exit status." = "Unable to get backend exit status."; +"Unable to get class list:" = "Unable to get class list:"; +"Unable to get class status:" = "Unable to get class status:"; +"Unable to get list of printer drivers:" = "Unable to get list of printer drivers:"; +"Unable to get printer attributes:" = "Unable to get printer attributes:"; +"Unable to get printer list:" = "Unable to get printer list:"; +"Unable to get printer status." = "Unable to get printer status."; +"Unable to get printer status:" = "Unable to get printer status:"; +"Unable to install Windows 2000 printer driver files (%d)." = "Unable to install Windows 2000 printer driver files (%d)."; +"Unable to install Windows 9x printer driver files (%d)." = "Unable to install Windows 9x printer driver files (%d)."; +"Unable to locate printer \"%s\"." = "Unable to locate printer \"%s\"."; +"Unable to locate printer." = "Unable to locate printer."; +"Unable to modify class:" = "Unable to modify class:"; +"Unable to modify printer:" = "Unable to modify printer:"; +"Unable to move job" = "Unable to move job"; +"Unable to move jobs" = "Unable to move jobs"; +"Unable to open PPD file" = "Unable to open PPD file"; +"Unable to open PPD file:" = "Unable to open PPD file:"; +"Unable to open charset file" = "Unable to open charset file"; +"Unable to open compressed print file" = "Unable to open compressed print file"; +"Unable to open cupsd.conf file:" = "Unable to open cupsd.conf file:"; +"Unable to open device file" = "Unable to open device file"; +"Unable to open document #%d in job #%d." = "Unable to open document #%d in job #%d."; +"Unable to open print file" = "Unable to open print file"; +"Unable to open psglyphs" = "Unable to open psglyphs"; +"Unable to open raster file" = "Unable to open raster file"; +"Unable to print %d text columns." = "Unable to print %d text columns."; +"Unable to print %dx%d text page." = "Unable to print %dx%d text page."; +"Unable to print test page:" = "Unable to print test page:"; +"Unable to read print data" = "Unable to read print data"; +"Unable to read print data." = "Unable to read print data."; +"Unable to run \"%s\": %s" = "Unable to run \"%s\": %s"; +"Unable to see in file" = "Unable to see in file"; +"Unable to send command to printer driver" = "Unable to send command to printer driver"; +"Unable to send data to printer." = "Unable to send data to printer."; +"Unable to send raster data to the driver." = "Unable to send raster data to the driver."; +"Unable to set Windows printer driver (%d)." = "Unable to set Windows printer driver (%d)."; +"Unable to set options:" = "Unable to set options:"; +"Unable to set server default:" = "Unable to set server default:"; +"Unable to start backend process." = "Unable to start backend process."; +"Unable to upload cupsd.conf file:" = "Unable to upload cupsd.conf file:"; +"Unable to use legacy USB class driver." = "Unable to use legacy USB class driver."; +"Unable to write print data" = "Unable to write print data"; +"Unable to write uncompressed print data: %s" = "Unable to write uncompressed print data: %s"; +"Unauthorized" = "Unauthorized"; +"Units" = "Units"; +"Unknown" = "Unknown"; +"Unknown choice \"%s\" for option \"%s\"." = "Unknown choice \"%s\" for option \"%s\"."; +"Unknown encryption option value: \"%s\"." = "Unknown encryption option value: \"%s\"."; +"Unknown file order: \"%s\"." = "Unknown file order: \"%s\"."; +"Unknown format character: \"%c\"." = "Unknown format character: \"%c\"."; +"Unknown option \"%s\" with value \"%s\"." = "Unknown option \"%s\" with value \"%s\"."; +"Unknown option \"%s\"." = "Unknown option \"%s\"."; +"Unknown print mode: \"%s\"." = "Unknown print mode: \"%s\"."; +"Unknown printer-error-policy \"%s\"." = "Unknown printer-error-policy \"%s\"."; +"Unknown printer-op-policy \"%s\"." = "Unknown printer-op-policy \"%s\"."; +"Unknown version option value: \"%s\"." = "Unknown version option value: \"%s\"."; +"Unsupported baud rate: %s" = "Unsupported baud rate: %s"; +"Unsupported brightness value %s, using brightness=100." = "Unsupported brightness value %s, using brightness=100."; +"Unsupported character set \"%s\"." = "Unsupported character set \"%s\"."; +"Unsupported compression \"%s\"." = "Unsupported compression \"%s\"."; +"Unsupported document-format \"%s\"." = "Unsupported document-format \"%s\"."; +"Unsupported document-format \"%s/%s\"." = "Unsupported document-format \"%s/%s\"."; +"Unsupported format \"%s\"." = "Unsupported format \"%s\"."; +"Unsupported gamma value %s, using gamma=1000." = "Unsupported gamma value %s, using gamma=1000."; +"Unsupported margins." = "Unsupported margins."; +"Unsupported media value." = "Unsupported media value."; +"Unsupported number-up value %d, using number-up=1." = "Unsupported number-up value %d, using number-up=1."; +"Unsupported number-up-layout value %s, using number-up-layout=lrtb." = "Unsupported number-up-layout value %s, using number-up-layout=lrtb."; +"Unsupported page-border value %s, using page-border=none." = "Unsupported page-border value %s, using page-border=none."; +"Unsupported raster data." = "Unsupported raster data."; +"Unsupported value type" = "Unsupported value type"; +"Upgrade Required" = "Upgrade Required"; +"Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]" = "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]"; +"Usage: %s job user title copies options [filename]" = "Usage: %s job user title copies options [filename]"; +"Usage: %s job-id user title copies options [file]" = "Usage: %s job-id user title copies options [file]"; +"Usage: %s job-id user title copies options file" = "Usage: %s job-id user title copies options file"; +"Usage: convert [ options ]" = "Usage: convert [ options ]"; +"Usage: cupsaddsmb [options] printer1 ... printerN" = "Usage: cupsaddsmb [options] printer1 ... printerN"; +"Usage: cupsctl [options] [param=value ... paramN=valueN]" = "Usage: cupsctl [options] [param=value ... paramN=valueN]"; +"Usage: cupsd [options]" = "Usage: cupsd [options]"; +"Usage: cupsfilter [ options ] filename" = "Usage: cupsfilter [ options ] filename"; +"Usage: cupstestdsc [options] filename.ps [... filename.ps]" = "Usage: cupstestdsc [options] filename.ps [... filename.ps]"; +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" = "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]"; +"Usage: ipptool [options] URI filename [ ... filenameN ]" = "Usage: ipptool [options] URI filename [ ... filenameN ]"; +"Usage: lpmove job/src dest" = "Usage: lpmove job/src dest"; +"Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer" = "Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer"; +"Usage: lppasswd [-g groupname]" = "Usage: lppasswd [-g groupname]"; +"Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]" = "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]"; +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" = "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]"; +"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" = "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]"; +"Usage: ppdhtml [options] filename.drv >filename.html" = "Usage: ppdhtml [options] filename.drv >filename.html"; +"Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]"; +"Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" = "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]"; +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" = "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]"; +"Usage: snmp [host-or-ip-address]" = "Usage: snmp [host-or-ip-address]"; +"Value uses indefinite length" = "Value uses indefinite length"; +"VarBind uses indefinite length" = "VarBind uses indefinite length"; +"Version uses indefinite length" = "Version uses indefinite length"; +"Waiting for job to complete." = "Waiting for job to complete."; +"Waiting for printer to become available." = "Waiting for printer to become available."; +"Waiting for printer to finish." = "Waiting for printer to finish."; +"Warning, no Windows 2000 printer drivers are installed." = "Warning, no Windows 2000 printer drivers are installed."; +"Web Interface is Disabled" = "Web Interface is Disabled"; +"Yes" = "Yes"; +"You must access this page using the URL https://%s:%d%s." = "You must access this page using the URL https://%s:%d%s."; +"Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number." = "Your password must be at least 6 characters long, cannot contain your username, and must contain at least one letter and number."; +"ZPL Label Printer" = "ZPL Label Printer"; +"Zebra" = "Zebra"; +"aborted" = "aborted"; +"canceled" = "canceled"; +"completed" = "completed"; +"convert: Use the -f option to specify a file to convert." = "convert: Use the -f option to specify a file to convert."; +"cups-deviced failed to execute." = "cups-deviced failed to execute."; +"cups-driverd failed to execute." = "cups-driverd failed to execute."; +"cupsaddsmb: No PPD file for printer \"%s\" - %s" = "cupsaddsmb: No PPD file for printer \"%s\" - %s"; +"cupsctl: Cannot set Listen or Port directly." = "cupsctl: Cannot set Listen or Port directly."; +"cupsctl: Unable to connect to server: %s" = "cupsctl: Unable to connect to server: %s"; +"cupsctl: Unknown option \"%s\"" = "cupsctl: Unknown option \"%s\""; +"cupsctl: Unknown option \"-%c\"" = "cupsctl: Unknown option \"-%c\""; +"cupsd: Expected config filename after \"-c\" option." = "cupsd: Expected config filename after \"-c\" option."; +"cupsd: Unable to get current directory." = "cupsd: Unable to get current directory."; +"cupsd: Unknown argument \"%s\" - aborting." = "cupsd: Unknown argument \"%s\" - aborting."; +"cupsd: Unknown option \"%c\" - aborting." = "cupsd: Unknown option \"%c\" - aborting."; +"cupsd: launchd(8) support not compiled in, running in normal mode." = "cupsd: launchd(8) support not compiled in, running in normal mode."; +"cupsfilter: Invalid document number %d." = "cupsfilter: Invalid document number %d."; +"cupsfilter: Invalid job ID %d." = "cupsfilter: Invalid job ID %d."; +"cupsfilter: Only one filename can be specified." = "cupsfilter: Only one filename can be specified."; +"cupsfilter: Unable to get job file - %s" = "cupsfilter: Unable to get job file - %s"; +"cupstestppd: The -q option is incompatible with the -v option." = "cupstestppd: The -q option is incompatible with the -v option."; +"cupstestppd: The -v option is incompatible with the -q option." = "cupstestppd: The -v option is incompatible with the -q option."; +"device for %s/%s: %s" = "device for %s/%s: %s"; +"device for %s: %s" = "device for %s: %s"; +"error-index uses indefinite length" = "error-index uses indefinite length"; +"error-status uses indefinite length" = "error-status uses indefinite length"; +"held" = "held"; +"help\t\tGet help on commands." = "help\t\tGet help on commands."; +"idle" = "idle"; +"ipptool: \"-i\" and \"-n\" are incompatible with -X\"." = "ipptool: \"-i\" and \"-n\" are incompatible with -X\"."; +"ipptool: \"-i\" is incompatible with \"-X\"." = "ipptool: \"-i\" is incompatible with \"-X\"."; +"ipptool: \"-n\" is incompatible with \"-X\"." = "ipptool: \"-n\" is incompatible with \"-X\"."; +"ipptool: Bad URI - %s." = "ipptool: Bad URI - %s."; +"ipptool: Bad version %s for \"-V\"." = "ipptool: Bad version %s for \"-V\"."; +"ipptool: Invalid seconds for \"-i\"." = "ipptool: Invalid seconds for \"-i\"."; +"ipptool: May only specify a single URI." = "ipptool: May only specify a single URI."; +"ipptool: Missing count for \"-n\"." = "ipptool: Missing count for \"-n\"."; +"ipptool: Missing filename for \"-f\"." = "ipptool: Missing filename for \"-f\"."; +"ipptool: Missing name=value for \"-d\"." = "ipptool: Missing name=value for \"-d\"."; +"ipptool: Missing seconds for \"-i\"." = "ipptool: Missing seconds for \"-i\"."; +"ipptool: Missing timeout for \"-T\"." = "ipptool: Missing timeout for \"-T\"."; +"ipptool: Missing version for \"-V\"." = "ipptool: Missing version for \"-V\"."; +"ipptool: URI required before test file." = "ipptool: URI required before test file."; +"ipptool: Unknown option \"-%c\"." = "ipptool: Unknown option \"-%c\"."; +"job-printer-uri attribute missing." = "job-printer-uri attribute missing."; +"lpadmin: Class name can only contain printable characters." = "lpadmin: Class name can only contain printable characters."; +"lpadmin: Expected PPD after \"-P\" option." = "lpadmin: Expected PPD after \"-P\" option."; +"lpadmin: Expected allow/deny:userlist after \"-u\" option." = "lpadmin: Expected allow/deny:userlist after \"-u\" option."; +"lpadmin: Expected class after \"-r\" option." = "lpadmin: Expected class after \"-r\" option."; +"lpadmin: Expected class name after \"-c\" option." = "lpadmin: Expected class name after \"-c\" option."; +"lpadmin: Expected description after \"-D\" option." = "lpadmin: Expected description after \"-D\" option."; +"lpadmin: Expected device URI after \"-v\" option." = "lpadmin: Expected device URI after \"-v\" option."; +"lpadmin: Expected file type(s) after \"-I\" option." = "lpadmin: Expected file type(s) after \"-I\" option."; +"lpadmin: Expected hostname after \"-h\" option." = "lpadmin: Expected hostname after \"-h\" option."; +"lpadmin: Expected interface after \"-i\" option." = "lpadmin: Expected interface after \"-i\" option."; +"lpadmin: Expected location after \"-L\" option." = "lpadmin: Expected location after \"-L\" option."; +"lpadmin: Expected model after \"-m\" option." = "lpadmin: Expected model after \"-m\" option."; +"lpadmin: Expected name after \"-R\" option." = "lpadmin: Expected name after \"-R\" option."; +"lpadmin: Expected name=value after \"-o\" option." = "lpadmin: Expected name=value after \"-o\" option."; +"lpadmin: Expected printer after \"-p\" option." = "lpadmin: Expected printer after \"-p\" option."; +"lpadmin: Expected printer name after \"-d\" option." = "lpadmin: Expected printer name after \"-d\" option."; +"lpadmin: Expected printer or class after \"-x\" option." = "lpadmin: Expected printer or class after \"-x\" option."; +"lpadmin: No member names were seen." = "lpadmin: No member names were seen."; +"lpadmin: Printer %s is already a member of class %s." = "lpadmin: Printer %s is already a member of class %s."; +"lpadmin: Printer %s is not a member of class %s." = "lpadmin: Printer %s is not a member of class %s."; +"lpadmin: Printer name can only contain printable characters." = "lpadmin: Printer name can only contain printable characters."; +"lpadmin: Unable to add a printer to the class:\n You must specify a printer name first." = "lpadmin: Unable to add a printer to the class:\n You must specify a printer name first."; +"lpadmin: Unable to connect to server: %s" = "lpadmin: Unable to connect to server: %s"; +"lpadmin: Unable to create temporary file" = "lpadmin: Unable to create temporary file"; +"lpadmin: Unable to delete option:\n You must specify a printer name first." = "lpadmin: Unable to delete option:\n You must specify a printer name first."; +"lpadmin: Unable to open PPD file \"%s\" - %s" = "lpadmin: Unable to open PPD file \"%s\" - %s"; +"lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first." = "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first."; +"lpadmin: Unable to set the printer options:\n You must specify a printer name first." = "lpadmin: Unable to set the printer options:\n You must specify a printer name first."; +"lpadmin: Unknown allow/deny option \"%s\"." = "lpadmin: Unknown allow/deny option \"%s\"."; +"lpadmin: Unknown argument \"%s\"." = "lpadmin: Unknown argument \"%s\"."; +"lpadmin: Unknown option \"%c\"." = "lpadmin: Unknown option \"%c\"."; +"lpadmin: Warning - content type list ignored." = "lpadmin: Warning - content type list ignored."; +"lpc> " = "lpc> "; +"lpinfo: Expected 1284 device ID string after \"--device-id\"." = "lpinfo: Expected 1284 device ID string after \"--device-id\"."; +"lpinfo: Expected language after \"--language\"." = "lpinfo: Expected language after \"--language\"."; +"lpinfo: Expected make and model after \"--make-and-model\"." = "lpinfo: Expected make and model after \"--make-and-model\"."; +"lpinfo: Expected product string after \"--product\"." = "lpinfo: Expected product string after \"--product\"."; +"lpinfo: Expected scheme list after \"--exclude-schemes\"." = "lpinfo: Expected scheme list after \"--exclude-schemes\"."; +"lpinfo: Expected scheme list after \"--include-schemes\"." = "lpinfo: Expected scheme list after \"--include-schemes\"."; +"lpinfo: Expected timeout after \"--timeout\"." = "lpinfo: Expected timeout after \"--timeout\"."; +"lpinfo: Unknown argument \"%s\"." = "lpinfo: Unknown argument \"%s\"."; +"lpinfo: Unknown option \"%c\"." = "lpinfo: Unknown option \"%c\"."; +"lpinfo: Unknown option \"%s\"." = "lpinfo: Unknown option \"%s\"."; +"lpmove: Unable to connect to server: %s" = "lpmove: Unable to connect to server: %s"; +"lpmove: Unknown argument \"%s\"." = "lpmove: Unknown argument \"%s\"."; +"lpmove: Unknown option \"%c\"." = "lpmove: Unknown option \"%c\"."; +"lpoptions: No printers." = "lpoptions: No printers."; +"lpoptions: Unable to add printer or instance: %s" = "lpoptions: Unable to add printer or instance: %s"; +"lpoptions: Unable to get PPD file for %s: %s" = "lpoptions: Unable to get PPD file for %s: %s"; +"lpoptions: Unable to open PPD file for %s." = "lpoptions: Unable to open PPD file for %s."; +"lpoptions: Unknown printer or class." = "lpoptions: Unknown printer or class."; +"lppasswd: Only root can add or delete passwords." = "lppasswd: Only root can add or delete passwords."; +"lppasswd: Password file busy." = "lppasswd: Password file busy."; +"lppasswd: Password file not updated." = "lppasswd: Password file not updated."; +"lppasswd: Sorry, password doesn't match." = "lppasswd: Sorry, password doesn't match."; +"lppasswd: Sorry, password rejected." = "lppasswd: Sorry, password rejected."; +"lppasswd: Sorry, passwords don't match." = "lppasswd: Sorry, passwords don't match."; +"lppasswd: Unable to copy password string: %s" = "lppasswd: Unable to copy password string: %s"; +"lppasswd: Unable to open password file: %s" = "lppasswd: Unable to open password file: %s"; +"lppasswd: Unable to write to password file: %s" = "lppasswd: Unable to write to password file: %s"; +"lppasswd: failed to backup old password file: %s" = "lppasswd: failed to backup old password file: %s"; +"lppasswd: failed to rename password file: %s" = "lppasswd: failed to rename password file: %s"; +"lppasswd: user \"%s\" and group \"%s\" do not exist." = "lppasswd: user \"%s\" and group \"%s\" do not exist."; +"lpstat: error - %s environment variable names non-existent destination \"%s\"." = "lpstat: error - %s environment variable names non-existent destination \"%s\"."; +"members of class %s:" = "members of class %s:"; +"no entries" = "no entries"; +"no system default destination" = "no system default destination"; +"notify-events not specified." = "notify-events not specified."; +"notify-recipient-uri URI \"%s\" is already used." = "notify-recipient-uri URI \"%s\" is already used."; +"notify-recipient-uri URI \"%s\" uses unknown scheme." = "notify-recipient-uri URI \"%s\" uses unknown scheme."; +"pending" = "pending"; +"ppdc: Adding include directory \"%s\"." = "ppdc: Adding include directory \"%s\"."; +"ppdc: Adding/updating UI text from %s." = "ppdc: Adding/updating UI text from %s."; +"ppdc: Bad boolean value (%s) on line %d of %s." = "ppdc: Bad boolean value (%s) on line %d of %s."; +"ppdc: Bad font attribute: %s" = "ppdc: Bad font attribute: %s"; +"ppdc: Bad resolution name \"%s\" on line %d of %s." = "ppdc: Bad resolution name \"%s\" on line %d of %s."; +"ppdc: Bad status keyword %s on line %d of %s." = "ppdc: Bad status keyword %s on line %d of %s."; +"ppdc: Bad variable substitution ($%c) on line %d of %s." = "ppdc: Bad variable substitution ($%c) on line %d of %s."; +"ppdc: Choice found on line %d of %s with no Option." = "ppdc: Choice found on line %d of %s with no Option."; +"ppdc: Duplicate #po for locale %s on line %d of %s." = "ppdc: Duplicate #po for locale %s on line %d of %s."; +"ppdc: Expected a filter definition on line %d of %s." = "ppdc: Expected a filter definition on line %d of %s."; +"ppdc: Expected a program name on line %d of %s." = "ppdc: Expected a program name on line %d of %s."; +"ppdc: Expected boolean value on line %d of %s." = "ppdc: Expected boolean value on line %d of %s."; +"ppdc: Expected charset after Font on line %d of %s." = "ppdc: Expected charset after Font on line %d of %s."; +"ppdc: Expected choice code on line %d of %s." = "ppdc: Expected choice code on line %d of %s."; +"ppdc: Expected choice name/text on line %d of %s." = "ppdc: Expected choice name/text on line %d of %s."; +"ppdc: Expected color order for ColorModel on line %d of %s." = "ppdc: Expected color order for ColorModel on line %d of %s."; +"ppdc: Expected colorspace for ColorModel on line %d of %s." = "ppdc: Expected colorspace for ColorModel on line %d of %s."; +"ppdc: Expected compression for ColorModel on line %d of %s." = "ppdc: Expected compression for ColorModel on line %d of %s."; +"ppdc: Expected constraints string for UIConstraints on line %d of %s." = "ppdc: Expected constraints string for UIConstraints on line %d of %s."; +"ppdc: Expected driver type keyword following DriverType on line %d of %s." = "ppdc: Expected driver type keyword following DriverType on line %d of %s."; +"ppdc: Expected duplex type after Duplex on line %d of %s." = "ppdc: Expected duplex type after Duplex on line %d of %s."; +"ppdc: Expected encoding after Font on line %d of %s." = "ppdc: Expected encoding after Font on line %d of %s."; +"ppdc: Expected filename after #po %s on line %d of %s." = "ppdc: Expected filename after #po %s on line %d of %s."; +"ppdc: Expected group name/text on line %d of %s." = "ppdc: Expected group name/text on line %d of %s."; +"ppdc: Expected include filename on line %d of %s." = "ppdc: Expected include filename on line %d of %s."; +"ppdc: Expected integer on line %d of %s." = "ppdc: Expected integer on line %d of %s."; +"ppdc: Expected locale after #po on line %d of %s." = "ppdc: Expected locale after #po on line %d of %s."; +"ppdc: Expected name after %s on line %d of %s." = "ppdc: Expected name after %s on line %d of %s."; +"ppdc: Expected name after FileName on line %d of %s." = "ppdc: Expected name after FileName on line %d of %s."; +"ppdc: Expected name after Font on line %d of %s." = "ppdc: Expected name after Font on line %d of %s."; +"ppdc: Expected name after Manufacturer on line %d of %s." = "ppdc: Expected name after Manufacturer on line %d of %s."; +"ppdc: Expected name after MediaSize on line %d of %s." = "ppdc: Expected name after MediaSize on line %d of %s."; +"ppdc: Expected name after ModelName on line %d of %s." = "ppdc: Expected name after ModelName on line %d of %s."; +"ppdc: Expected name after PCFileName on line %d of %s." = "ppdc: Expected name after PCFileName on line %d of %s."; +"ppdc: Expected name/text after %s on line %d of %s." = "ppdc: Expected name/text after %s on line %d of %s."; +"ppdc: Expected name/text after Installable on line %d of %s." = "ppdc: Expected name/text after Installable on line %d of %s."; +"ppdc: Expected name/text after Resolution on line %d of %s." = "ppdc: Expected name/text after Resolution on line %d of %s."; +"ppdc: Expected name/text combination for ColorModel on line %d of %s." = "ppdc: Expected name/text combination for ColorModel on line %d of %s."; +"ppdc: Expected option name/text on line %d of %s." = "ppdc: Expected option name/text on line %d of %s."; +"ppdc: Expected option section on line %d of %s." = "ppdc: Expected option section on line %d of %s."; +"ppdc: Expected option type on line %d of %s." = "ppdc: Expected option type on line %d of %s."; +"ppdc: Expected override field after Resolution on line %d of %s." = "ppdc: Expected override field after Resolution on line %d of %s."; +"ppdc: Expected quoted string on line %d of %s." = "ppdc: Expected quoted string on line %d of %s."; +"ppdc: Expected real number on line %d of %s." = "ppdc: Expected real number on line %d of %s."; +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." = "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s."; +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s." = "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s."; +"ppdc: Expected selector after %s on line %d of %s." = "ppdc: Expected selector after %s on line %d of %s."; +"ppdc: Expected status after Font on line %d of %s." = "ppdc: Expected status after Font on line %d of %s."; +"ppdc: Expected string after Copyright on line %d of %s." = "ppdc: Expected string after Copyright on line %d of %s."; +"ppdc: Expected string after Version on line %d of %s." = "ppdc: Expected string after Version on line %d of %s."; +"ppdc: Expected two option names on line %d of %s." = "ppdc: Expected two option names on line %d of %s."; +"ppdc: Expected value after %s on line %d of %s." = "ppdc: Expected value after %s on line %d of %s."; +"ppdc: Expected version after Font on line %d of %s." = "ppdc: Expected version after Font on line %d of %s."; +"ppdc: Invalid #include/#po filename \"%s\"." = "ppdc: Invalid #include/#po filename \"%s\"."; +"ppdc: Invalid cost for filter on line %d of %s." = "ppdc: Invalid cost for filter on line %d of %s."; +"ppdc: Invalid empty MIME type for filter on line %d of %s." = "ppdc: Invalid empty MIME type for filter on line %d of %s."; +"ppdc: Invalid empty program name for filter on line %d of %s." = "ppdc: Invalid empty program name for filter on line %d of %s."; +"ppdc: Invalid option section \"%s\" on line %d of %s." = "ppdc: Invalid option section \"%s\" on line %d of %s."; +"ppdc: Invalid option type \"%s\" on line %d of %s." = "ppdc: Invalid option type \"%s\" on line %d of %s."; +"ppdc: Loading driver information file \"%s\"." = "ppdc: Loading driver information file \"%s\"."; +"ppdc: Loading messages for locale \"%s\"." = "ppdc: Loading messages for locale \"%s\"."; +"ppdc: Loading messages from \"%s\"." = "ppdc: Loading messages from \"%s\"."; +"ppdc: Missing #endif at end of \"%s\"." = "ppdc: Missing #endif at end of \"%s\"."; +"ppdc: Missing #if on line %d of %s." = "ppdc: Missing #if on line %d of %s."; +"ppdc: Need a msgid line before any translation strings on line %d of %s." = "ppdc: Need a msgid line before any translation strings on line %d of %s."; +"ppdc: No message catalog provided for locale %s." = "ppdc: No message catalog provided for locale %s."; +"ppdc: Option %s defined in two different groups on line %d of %s." = "ppdc: Option %s defined in two different groups on line %d of %s."; +"ppdc: Option %s redefined with a different type on line %d of %s." = "ppdc: Option %s redefined with a different type on line %d of %s."; +"ppdc: Option constraint must *name on line %d of %s." = "ppdc: Option constraint must *name on line %d of %s."; +"ppdc: Too many nested #if's on line %d of %s." = "ppdc: Too many nested #if's on line %d of %s."; +"ppdc: Unable to create PPD file \"%s\" - %s." = "ppdc: Unable to create PPD file \"%s\" - %s."; +"ppdc: Unable to create output directory %s: %s" = "ppdc: Unable to create output directory %s: %s"; +"ppdc: Unable to create output pipes: %s" = "ppdc: Unable to create output pipes: %s"; +"ppdc: Unable to execute cupstestppd: %s" = "ppdc: Unable to execute cupstestppd: %s"; +"ppdc: Unable to find #po file %s on line %d of %s." = "ppdc: Unable to find #po file %s on line %d of %s."; +"ppdc: Unable to find include file \"%s\" on line %d of %s." = "ppdc: Unable to find include file \"%s\" on line %d of %s."; +"ppdc: Unable to find localization for \"%s\" - %s" = "ppdc: Unable to find localization for \"%s\" - %s"; +"ppdc: Unable to load localization file \"%s\" - %s" = "ppdc: Unable to load localization file \"%s\" - %s"; +"ppdc: Unable to open %s: %s" = "ppdc: Unable to open %s: %s"; +"ppdc: Undefined variable (%s) on line %d of %s." = "ppdc: Undefined variable (%s) on line %d of %s."; +"ppdc: Unexpected text on line %d of %s." = "ppdc: Unexpected text on line %d of %s."; +"ppdc: Unknown driver type %s on line %d of %s." = "ppdc: Unknown driver type %s on line %d of %s."; +"ppdc: Unknown duplex type \"%s\" on line %d of %s." = "ppdc: Unknown duplex type \"%s\" on line %d of %s."; +"ppdc: Unknown media size \"%s\" on line %d of %s." = "ppdc: Unknown media size \"%s\" on line %d of %s."; +"ppdc: Unknown message catalog format for \"%s\"." = "ppdc: Unknown message catalog format for \"%s\"."; +"ppdc: Unknown token \"%s\" seen on line %d of %s." = "ppdc: Unknown token \"%s\" seen on line %d of %s."; +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." = "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s."; +"ppdc: Unterminated string starting with %c on line %d of %s." = "ppdc: Unterminated string starting with %c on line %d of %s."; +"ppdc: Warning - overlapping filename \"%s\"." = "ppdc: Warning - overlapping filename \"%s\"."; +"ppdc: Writing %s." = "ppdc: Writing %s."; +"ppdc: Writing PPD files to directory \"%s\"." = "ppdc: Writing PPD files to directory \"%s\"."; +"ppdmerge: Bad LanguageVersion \"%s\" in %s." = "ppdmerge: Bad LanguageVersion \"%s\" in %s."; +"ppdmerge: Ignoring PPD file %s." = "ppdmerge: Ignoring PPD file %s."; +"ppdmerge: Unable to backup %s to %s - %s" = "ppdmerge: Unable to backup %s to %s - %s"; +"printer %s disabled since %s -" = "printer %s disabled since %s -"; +"printer %s is idle. enabled since %s" = "printer %s is idle. enabled since %s"; +"printer %s now printing %s-%d. enabled since %s" = "printer %s now printing %s-%d. enabled since %s"; +"printer %s/%s disabled since %s -" = "printer %s/%s disabled since %s -"; +"printer %s/%s is idle. enabled since %s" = "printer %s/%s is idle. enabled since %s"; +"printer %s/%s now printing %s-%d. enabled since %s" = "printer %s/%s now printing %s-%d. enabled since %s"; +"processing" = "processing"; +"request id is %s-%d (%d file(s))" = "request id is %s-%d (%d file(s))"; +"request-id uses indefinite length" = "request-id uses indefinite length"; +"scheduler is not running" = "scheduler is not running"; +"scheduler is running" = "scheduler is running"; +"stat of %s failed: %s" = "stat of %s failed: %s"; +"status\t\tShow status of daemon and queue." = "status\t\tShow status of daemon and queue."; +"stopped" = "stopped"; +"system default destination: %s" = "system default destination: %s"; +"system default destination: %s/%s" = "system default destination: %s/%s"; +"unknown" = "unknown"; +"untitled" = "untitled"; +"variable-bindings uses indefinite length" = "variable-bindings uses indefinite length"; diff --git a/locale/cups_da.po b/locale/cups_da.po new file mode 100644 index 0000000..85446e4 --- /dev/null +++ b/locale/cups_da.po @@ -0,0 +1,8692 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f mm" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f til %.0f x %.0f mm" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f tommer" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f til %.2f x %.2f tommer" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s kan ikke ændres." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 tomme/sek." + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 tomme/sek." + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 tommer/sek." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sek." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 tommer/sek." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 tommer/sek." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sek." + +msgid "120x60dpi" +msgstr "120 x 60 dpi" + +msgid "120x72dpi" +msgstr "120 x 72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sek." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sek." + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 tommer/sek." + +msgid "2-Sided Printing" +msgstr "Dobbeltsidet udskrivning" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 tommer/sek." + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sek." + +msgid "200 mm/sec." +msgstr "200 mm/sek." + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-bens serien" + +msgid "240x72dpi" +msgstr "240 x 72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sek." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 tommer/sek." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3,5\" disk" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5\" disk - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sek." + +msgid "300 mm/sec." +msgstr "300 mm/sek." + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360 x 180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 tommer/sek." + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sek." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 tommer/sek." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 tommer/sek." + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sek." + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 tommer/sek." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 tommer/sek." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sek." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 tommer/sek." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-bens serien" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Accepter job" + +msgid "Accepted" +msgstr "Accepteret" + +msgid "Add Class" +msgstr "Tilføj klasse" + +msgid "Add Printer" +msgstr "Tilføj printer" + +msgid "Add RSS Subscription" +msgstr "Tilføj RSS-abonnement" + +msgid "Address" +msgstr "Adresse" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adresse - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administration" + +msgid "Always" +msgstr "Altid" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Bruger" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Ugyldig NULL dests-markør" + +msgid "Bad OpenGroup" +msgstr "Ugyldig OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Ugyldig OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Ugyldig OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Ugyldig anmodning" + +msgid "Bad SNMP version number" +msgstr "Ugyldigt versionsnummer på SNMP" + +msgid "Bad UIConstraints" +msgstr "Ugyldig UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Ugyldig værdi for kopier %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Ugylidig speciel parameter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Ugyldig værdi for number-up %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Ugyldige værdier for page-ranges %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Bannere" + +msgid "Billing Information: " +msgstr "Faktureringsoplysninger: " + +msgid "Bond Paper" +msgstr "Bond-papir" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL-etiketprinter" + +msgid "Cancel RSS Subscription" +msgstr "Annuller RSS-abonnement" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Skift indstillinger" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klasser" + +msgid "Clean Print Heads" +msgstr "Rengør skrivehoveder" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Farve" + +msgid "Color Mode" +msgstr "Farvefunktion" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Fællesnavn bruger uendelig længde" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Fortsæt" + +msgid "Continuous" +msgstr "Fortsat" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Oprettet" + +msgid "Created On: " +msgstr "Oprettet den: " + +msgid "Custom" +msgstr "Speciel" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Klip" + +msgid "Cutter" +msgstr "Klipper" + +msgid "Dark" +msgstr "Mørk" + +msgid "Darkness" +msgstr "Mørke" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Slet klasse" + +msgid "Delete Printer" +msgstr "Slet printer" + +msgid "Description: " +msgstr "Beskrivelse: " + +msgid "DeskJet Series" +msgstr "DeskJet-serie" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Destinationen \"%s\" accepterer ikke job." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Direkte termisk medie" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Slået fra" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Navn på printerarkiv: " + +msgid "Driver Version: " +msgstr "Version på printerarkiv: " + +msgid "Duplexer" +msgstr "Dupleksenhed" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1-etiketprinter" + +msgid "EPL2 Label Printer" +msgstr "EPL2-etiketprinter" + +msgid "Edit Configuration File" +msgstr "Rediger konfigurationsarkiv" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Slutbanner" + +msgid "English" +msgstr "Danish" + +msgid "Enter old password:" +msgstr "Skriv gammel adgangskode:" + +msgid "Enter password again:" +msgstr "Skriv adgangskode igen:" + +msgid "Enter password:" +msgstr "Skriv adgangskode:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Skriv dit brugernavn og din adgangskode eller root-brugernavnet og -" +"adgangskoden for at få adgang til denne side. Hvis du bruger Kerberos-" +"godkendelse, skal du sikre dig, at du har en gyldig Kerberos-billet." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Ilægning af kuvert" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Fejlpolitik" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Hver 10. etiket" + +msgid "Every 2 Labels" +msgstr "Hver 2. etiket" + +msgid "Every 3 Labels" +msgstr "Hver 3. etiket" + +msgid "Every 4 Labels" +msgstr "Hver 4. etiket" + +msgid "Every 5 Labels" +msgstr "Hver 5. etiket" + +msgid "Every 6 Labels" +msgstr "Hver 6. etiket" + +msgid "Every 7 Labels" +msgstr "Hver 7. etiket" + +msgid "Every 8 Labels" +msgstr "Hver 8. etiket" + +msgid "Every 9 Labels" +msgstr "Hver 9. etiket" + +msgid "Every Label" +msgstr "Alle etiketter" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Forventning mislykkedes" + +msgid "Export Printers to Samba" +msgstr "Eksporter printere til Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Arkivmappe" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Arkivmappe - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "8,5 x 13\"" + +msgid "Forbidden" +msgstr "Forbudt" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Generelt" + +msgid "Generic" +msgstr "Generel" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU bruger uendelig længde" + +msgid "Glossy Paper" +msgstr "Glittet papir" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Gråtoner" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hængende mappe" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hængende mappe - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Ulovligt kontroltegn" + +msgid "Illegal main keyword string" +msgstr "Ulovlig streng til hovednøgleord" + +msgid "Illegal option keyword string" +msgstr "Ulovlig nøgleordsstreng til indstilling" + +msgid "Illegal translation string" +msgstr "Ulovlig oversættelsesstreng" + +msgid "Illegal whitespace character" +msgstr "Ulovlig tegn for tom plads" + +msgid "Installable Options" +msgstr "Ekstraudstyr" + +msgid "Installed" +msgstr "Installeret" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar-etiketprinter" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Intern fejl" + +msgid "Internet Postage 2-Part" +msgstr "Internet-porto 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet-porto 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet-porto 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet-porto 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet Printing Protocol" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Job #%d er allerede afbrudt - kan ikke annullere." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Job #%d er allerede annulleret - kan ikke annullere." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Job #%d er allerede færdigt - kan ikke annullere." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Job færdigt" + +msgid "Job Created" +msgstr "Job oprettet" + +msgid "Job ID: " +msgstr "Job-id: " + +msgid "Job Options Changed" +msgstr "Jobindstillinger ændret" + +msgid "Job Stopped" +msgstr "Job stoppet" + +msgid "Job UUID: " +msgstr "Job-uuid: " + +msgid "Job is completed and cannot be changed." +msgstr "Job er færdigt og kan ikke ændres." + +msgid "Job operation failed:" +msgstr "Jobhandling mislykkedes:" + +msgid "Job state cannot be changed." +msgstr "Jobstatus kan ikke ændres." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Job" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-vært eller -printer" + +msgid "Label Printer" +msgstr "Etiketprinter" + +msgid "Label Top" +msgstr "Top af etiket" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Stor adresse" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Stor adresse - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Lys" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Linje længere end det maksimalt tilladte (255 tegn)" + +msgid "List Available Printers" +msgstr "Vis tilgængelige printere" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Placering: " + +msgid "Long-Edge (Portrait)" +msgstr "Lang kant (stående)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Mærke og model: " + +msgid "Manual Feed" +msgstr "Manuel ilægning" + +msgid "Media Dimensions: " +msgstr "Mediestørrelser: " + +msgid "Media Limits: " +msgstr "Mediebegrænsninger: " + +msgid "Media Name: " +msgstr "Medienavn: " + +msgid "Media Size" +msgstr "Mediestørrelse" + +msgid "Media Source" +msgstr "Mediekilde" + +msgid "Media Tracking" +msgstr "Mediesporing" + +msgid "Media Type" +msgstr "Medietype" + +msgid "Medium" +msgstr "Medium" + +msgid "Memory allocation error" +msgstr "Fejl i hukommelsestildeling" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Manglende PPD-Adobe-4.x header" + +msgid "Missing asterisk in column 1" +msgstr "Manglende stjerne i kolonne 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Manglende værdistreng" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Rediger klasse" + +msgid "Modify Printer" +msgstr "Rediger printer" + +msgid "Move All Jobs" +msgstr "Flyt alle job" + +msgid "Move Job" +msgstr "Flyt job" + +msgid "Moved Permanently" +msgstr "Flyttet permanent" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD-arkivmarkør" + +msgid "Name OID uses indefinite length" +msgstr "Navn-oid bruger uendelig længde" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Aldrig" + +msgid "New Stylus Color Series" +msgstr "Ny Stylus Color Series" + +msgid "New Stylus Photo Series" +msgstr "Ny Stylus Photo Series" + +msgid "No" +msgstr "Nej" + +msgid "No Content" +msgstr "Intet indhold" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Ingen VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Ingen aktiv forbindelse" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Intet fællesskabsnavn" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Ingen destinationer tilføjet." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Intet error-index" + +msgid "No error-status" +msgstr "Ingen error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Ingen navn-oid" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Ingen request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Ingen abonnementer fundet." + +msgid "No variable-bindings SEQUENCE" +msgstr "Ingen variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Intet versionsnummer" + +msgid "Non-continuous (Mark sensing)" +msgstr "Ikke fortsat (mærkefølsom)" + +msgid "Non-continuous (Web sensing)" +msgstr "Ikke fortsat (webfølsom)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Ikke fundet" + +msgid "Not Implemented" +msgstr "Ikke implementeret" + +msgid "Not Installed" +msgstr "Ikke installeret" + +msgid "Not Modified" +msgstr "Ikke ændret" + +msgid "Not Supported" +msgstr "Ikke understøttet" + +msgid "Not allowed to print." +msgstr "Må ikke udskrive." + +msgid "Note" +msgstr "Bemærk" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Fra (ensidet)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Hjælp på skærmen" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "åbning af %s mislykkedes: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup uden en CloseGroup først" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI uden en CloseUI/JCLCloseUI først" + +msgid "Operation Policy" +msgstr "Driftspolitik" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Ekstraudstyr installeret" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Ekstraudstyr: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Udskriftsfunktion" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL-laserprinter" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Pakke indeholder ikke en Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Pakke starter ikke med SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Adgangskode til %s på %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Adgangskode til %s kræves til adgang til %s via SAMBA: " + +msgid "Pause Class" +msgstr "Sæt klasse på pause" + +msgid "Pause Printer" +msgstr "Sæt printer på pause" + +msgid "Peel-Off" +msgstr "Aftrækkelig" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Fotoetiketter" + +msgid "Plain Paper" +msgstr "Almindeligt papir" + +msgid "Policies" +msgstr "Politikker" + +msgid "Port Monitor" +msgstr "Portovervågning" + +msgid "PostScript Printer" +msgstr "PostScript-printer" + +msgid "Postcard" +msgstr "Postkort" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Tryktæthed" + +msgid "Print Job:" +msgstr "Udskriftsjob:" + +msgid "Print Mode" +msgstr "Udskriftsfunktion" + +msgid "Print Rate" +msgstr "Udskriftshastighed" + +msgid "Print Self-Test Page" +msgstr "Udskriv testside" + +msgid "Print Speed" +msgstr "Udskriftshastighed" + +msgid "Print Test Page" +msgstr "Udskriv testside" + +msgid "Print and Cut" +msgstr "Udskriv og klip" + +msgid "Print and Tear" +msgstr "Udskriv og riv af" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Udskrevet til: " + +msgid "Printed From: " +msgstr "Udskrevet fra: " + +msgid "Printed On: " +msgstr "Udskrevet den: " + +msgid "Printer Added" +msgstr "Printer tilføjet" + +msgid "Printer Default" +msgstr "Printerstandard" + +msgid "Printer Deleted" +msgstr "Printer slettet" + +msgid "Printer Modified" +msgstr "Printer ændret" + +msgid "Printer Name: " +msgstr "Printernavn: " + +msgid "Printer Paused" +msgstr "Printer på pause" + +msgid "Printer Settings" +msgstr "Printerindstillinger" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Printer:" + +msgid "Printers" +msgstr "Printere" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Udrens job" + +msgid "Quarto" +msgstr "Kvartformat" + +msgid "Quota limit reached." +msgstr "Maks. kvote nået." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Afvis job" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Udskriv igen efter fejl" + +msgid "Request Entity Too Large" +msgstr "Enhedsanmodning for stor" + +msgid "Resolution" +msgstr "Opløsning" + +msgid "Resume Class" +msgstr "Genoptag klasse" + +msgid "Resume Printer" +msgstr "Genoptag printer" + +msgid "Return Address" +msgstr "Returadresse" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Returadresse - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Spol tilbage" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE bruger uendelig længde" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Se andet" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Seriel port #%d" + +msgid "Server Restarted" +msgstr "Server startet igen" + +msgid "Server Security Auditing" +msgstr "Kontrol af serversikkerhed" + +msgid "Server Started" +msgstr "Server startet" + +msgid "Server Stopped" +msgstr "Server stoppet" + +msgid "Service Unavailable" +msgstr "Service utilgængelig" + +msgid "Set Allowed Users" +msgstr "Indstil tilladte brugere" + +msgid "Set As Server Default" +msgstr "Indstil som serverstandard" + +msgid "Set Class Options" +msgstr "Foretag klasseindstillinger " + +msgid "Set Printer Options" +msgstr "Foretag printerindstillinger " + +msgid "Set Publishing" +msgstr "Indstil publicering" + +msgid "Shipping Address" +msgstr "Leveringsadresse" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Leveringsadresse - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Kort kant (liggende)" + +msgid "Special Paper" +msgstr "Specielt papir" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Starter banner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Udtalelse" + +msgid "Stylus Color Series" +msgstr "Stylus Color Series" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Series" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Skifter protokoller" + +msgid "Tabloid" +msgstr "17 x 11\"" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Riv" + +msgid "Tear-Off" +msgstr "Riv af" + +msgid "Tear-Off Adjust Position" +msgstr "Riv af, juster position" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "PPD-arkivet \"%s\" findes ikke." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "PPD-arkivet \"%s\" kunne ikke åbnes: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Klassenavnet må kun indeholde op til 127 tegn, der kan udskrives, og må ikke " +"indeholde mellemrum, skråstreger (/) og nummertegnet (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "Egenskaben notify-lease-duration kan ikke bruges med jobabonnementer." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Printernavnet må kun indeholde op til 127 tegn, der kan udskrives, og må " +"ikke indeholde mellemrum, skråstreger (/) og nummertegnet (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Printer-uri \"%s\" indeholder ugyldige tegn." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "Printer-uri skal have formatet \"ipp://VÆRTSNAVN/klasser/KLASSENAVN\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"Printer-uri skal have formatet \"ipp://VÆRTSNAVN/printere/PRINTERNAVN\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Abonnementsnavnet må ikke indeholde mellemrum, skråstreger (/), " +"spørgsmålstegn (?) og nummertegnet (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Der er for mange abonnementer." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Termiske overførselsmedier" + +msgid "Title: " +msgstr "Titel: " + +msgid "Too many active jobs." +msgstr "For mange aktive job." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Gennemsigtighed" + +msgid "Tray" +msgstr "Bakke" + +msgid "Tray 1" +msgstr "Bakke 1" + +msgid "Tray 2" +msgstr "Bakke 2" + +msgid "Tray 3" +msgstr "Bakke 3" + +msgid "Tray 4" +msgstr "Bakke 4" + +msgid "URI Too Long" +msgstr "URI for lang" + +msgid "US Ledger" +msgstr "17 x 11\"" + +msgid "US Legal" +msgstr "8,5 x 14\"" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "8,5 x 11\"" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Seriel USB-port #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Kan ikke få adgang til arkivet cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Kan ikke tilføje RSS-abonnement:" + +msgid "Unable to add class:" +msgstr "Kan ikke tilføje klasse:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Kan ikke tilføje printer:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Kan ikke annullere RSS-abonnement:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Kan ikke ændre egenskaben printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Kan ikke skifte printer:" + +msgid "Unable to change server settings:" +msgstr "Kan ikke ændre serverindstillinger:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Kan ikke oprette forbindelse til vært." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Kan ikke oprette midlertidigt arkiv:" + +msgid "Unable to delete class:" +msgstr "Kan ikke slette klasse:" + +msgid "Unable to delete printer:" +msgstr "Kan ikke slette printer:" + +msgid "Unable to do maintenance command:" +msgstr "Kan ikke udføre vedligeholdelseskommando:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Kan ikke hente klasseliste:" + +msgid "Unable to get class status:" +msgstr "Kan ikke hente klassestatus:" + +msgid "Unable to get list of printer drivers:" +msgstr "Kan ikke hente liste over printerarkiver:" + +msgid "Unable to get printer attributes:" +msgstr "Kan ikke hente printerattributter:" + +msgid "Unable to get printer list:" +msgstr "Kan ikke hente printerliste:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Kan ikke hente printerstatus:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Kan ikke ændre klasse:" + +msgid "Unable to modify printer:" +msgstr "Kan ikke ændre printer:" + +msgid "Unable to move job" +msgstr "Kan ikke flytte job" + +msgid "Unable to move jobs" +msgstr "Kan ikke flytte job" + +msgid "Unable to open PPD file" +msgstr "Kan ikke åbne PPD-arkiv" + +msgid "Unable to open PPD file:" +msgstr "Kan ikke åbne PPD-arkiv:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Kan ikke åbne arkivet cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Kan ikke udskrive testside:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Kan ikke foretageindstillinger:" + +msgid "Unable to set server default:" +msgstr "Kan ikke indstille serverstandard:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Kan ikke overføre arkivet cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Ikke godkendt" + +msgid "Units" +msgstr "Enheder" + +msgid "Unknown" +msgstr "Ukendt" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Ukendt printer-error-policy \"%s\"." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Ukendt printer-op-policy \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Ikke understøttet værditype" + +msgid "Upgrade Required" +msgstr "Opgradering kræves" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Værdi bruger uendelig længde" + +msgid "VarBind uses indefinite length" +msgstr "VarBind bruger uendelig længde" + +msgid "Version uses indefinite length" +msgstr "Version bruger uendelig længde" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ja" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Du skal åbne denne side vha. URL-adressen https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL-etiketprinter" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "afbrudt" + +msgid "canceled" +msgstr "annulleret" + +msgid "completed" +msgstr "færdig" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced blev ikke udført." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd blev ikke udført." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index bruger uendelig længde" + +msgid "error-status uses indefinite length" +msgstr "error-status bruger uendelig længde" + +msgid "held" +msgstr "udsat" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "ledig" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "afventer" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "behandler" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id bruger uendelig længde" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "stat af %s mislykkedes: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "stoppet" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "ukendt" + +msgid "untitled" +msgstr "uden navn" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings bruger uendelig længde" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(alle)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(ingen)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d optegnelser\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tEfter fejl: Fortsæt\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAdvarsler:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner kræves\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tTegnsæt:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tForbindelse: Direkte\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tForbindelse: Ekstern\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tStandardsidestørrelse:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tStandardhøjde:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tStandardportindstillinger:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tBeskrivelse: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tAktiv formular:\n" +#~ "\tIndholdstyper: alle\n" +#~ "\tPrintertyper: Ukendt\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormularer tilladt:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tGrænseflade: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tGrænseflade: %s/grænseflader/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tGrænseflade: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tPlacering: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tVed fejl: Ingen advarsel\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tBrugere tilladt:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tBrugere ikke tilladt:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemon til stede\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tingen optegnelser\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tprinter er på enheden '%s', hastighed -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tudskrivning er slået fra\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tudskrivning er slået til\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tstår i kø til %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tkø er slået fra\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tkø er slået til\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tårsag ukendt\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " DETALJEREDE RESULTATER AF TEST AF OVERENSSTEMMELSE\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Side 15, afsnit 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Side 15, afsnit 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Side 19, afsnit 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Side 20, afsnit 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Side 27, afsnit 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Side 42, afsnit 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Side 16-17, afsnit 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Side 42-45, afsnit 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Side 45-46, afsnit 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Side 48-49, afsnit 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Side 52-54, afsnit 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" er i konflikt med \"%s %s\"\n" +#~ " (begrænsning=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s har ingen tilsvarende indstillinger!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s deler et almindeligt præfiks med %s\n" +#~ " REF: Side 15, afsnit 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Standardvalg er i konflikt!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Nøgleordet til dupleksindstillingen %s virker muligvis " +#~ "ikke som forventet og skal hedde Dupleks!\n" +#~ " REF: Side 122, afsnit 5.17.\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Arkiv indeholder en blanding af linjeskifttyperne CR, LF og " +#~ "CR LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding kræves af PPD 4.3 spec.\n" +#~ " REF: Side 56-57, afsnit 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Linje %d indeholder kun tom plads!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Manufacturer kræves af PPD 4.3 spec.\n" +#~ " REF: Side 58-59, afsnit 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN Manglende APDialogExtension-arkiv \"%s\"\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN Manglende APPrinterIconPath-arkiv \"%s\"\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN PPD-arkiver, som ikke stammer fra Windows, må kun bruge " +#~ "linjeskifttypen LF, ikke CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Forældet PPD-version %.1f!\n" +#~ " REF: Side 42, afsnit 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName længere end 8.3 overtræder PPD-spec.\n" +#~ " REF: Side 61-62, afsnit 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokoller indeholder PJL, men JCL-attributter er ikke " +#~ "indstillet.\n" +#~ " REF: Side 78-79, afsnit 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokoller indeholder både PJL og BCP; forventede TBCP.\n" +#~ " REF: Side 78-79, afsnit 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName kræves af PPD 4.3 spec.\n" +#~ " REF: Side 64-65, afsnit 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s eksisterer ikke!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Ugyldigt %s-valg %s!\n" +#~ " REF: Side 122, afsnit 5.17.\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Ugyldig UTF-8 \"%s\"-oversættelsesstreng til indstillingen %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ugyldig UTF-8 \"%s\"-oversættelsesstreng til indstillingen %s, " +#~ "valg %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsFilter-værdi \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Ugyldig cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsPreFilter-værdi \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Ugyldigt sprog \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Tom cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Manglende \"%s\"-oversættelsesstreng til indstillingen %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Manglende \"%s\"-oversættelsesstreng til indstillingen %s, valg " +#~ "%s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Manglende valg *%s %s i UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Manglende valg *%s %s i cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Manglende cupsFilter-arkiv \"%s\"\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Manglende cupsICCProfile-arkiv \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Manglende cupsPreFilter-arkiv \"%s\"\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Manglende cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Manglende indstilling %s i UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Manglende indstilling %s i cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr "" +#~ " %s Ingen basisoversættelse af \"%s\" er inkluderet i arkiv!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s REQUIRED %s definerer ikke valget Ingen!\n" +#~ " REF: Side 122, afsnit 5.17.\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s-talværdi kolliderer med %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s forårsager en sløjfe!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s navne på valg %s og %s adskilles kun af brugen af " +#~ "store/små bogstaver!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s skal være 1284DeviceID!\n" +#~ " REF: Side 72, afsnit 5.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG Default%s %s\n" +#~ " REF: Side 40, afsnit 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIGT DefaultImageableArea %s!\n" +#~ " REF: Side 102, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG DefaultPaperDimension %s!\n" +#~ " REF: Side 103, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG JobPatchFile-egenskab i arkiv\n" +#~ " REF: Side 24, afsnit 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG Manufacturer (skulle være \"HP\")\n" +#~ " REF: Side 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG Manufacturer (skulle være \"Oki\")\n" +#~ " REF: Side 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIGT ModelName - \"%c\" ikke tilladt i streng.\n" +#~ " REF: Side 59-60, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIG PSVersion - ikke \"(string) int\".\n" +#~ " REF: Side 62-64, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIGT Product - ikke \"(string)\".\n" +#~ " REF: Side 62, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** UGYLDIGT ShortNickName - længere end 31 tegn.\n" +#~ " REF: Side 64-65, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Ugyldigt %s-valg %s!\n" +#~ " REF: Side 84, afsnit 5.9.\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Ugyldig FileVersion \"%s\"\n" +#~ " REF: Side 56, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Ugyldig FormatVersion \"%s\"\n" +#~ " REF: Side 56, afsnit 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** Ugyldig LanguageEncoding %s - skal være ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** Ugyldig LanguageVersion %s - skal være dansk!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** Standardkode til indstilling kunne ikke fortolkes: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Standardoversættelsesstreng til indstillingen %s, valg %" +#~ "s, indeholder 8 bit tegn!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Standardoversættelsesstreng til indstillingen %s " +#~ "indeholder 8 bit tegn!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Gruppenavne %s og %s adskilles kun af brugen af store/små " +#~ "bogstaver!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Flere forekomster af %s valg af navn %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Navne på indstillinger %s og %s adskilles kun af brugen " +#~ "af store/små bogstaver!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Side 40, afsnit 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Side 102, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Side 103, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Side 56, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Side 56, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ImageableArea til PageSize %s\n" +#~ " REF: Side 41, afsnit 5.\n" +#~ " REF: Side 102, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Side 56-57, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Side 57-58, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Side 58-59, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Side 59-60, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Side 60, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Side 61-62, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Side 62-64, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Side 100, afsnit 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Side 41, afsnit 5.\n" +#~ " REF: Side 99, afsnit 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Side 99-100, afsnit 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PaperDimension til PageSize %s\n" +#~ " REF: Side 41, afsnit 5.\n" +#~ " REF: Side 103, afsnit 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Side 62, afsnit 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Side 64-65, afsnit 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d FEJL FUNDET\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Ugyldig %%%%BoundingBox: på linje %d!\n" +#~ " REF: Side 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Ugyldig %%%%Page: på linje %d!\n" +#~ " REF: Side 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Ugyldige %%%%Pages: på linje %d!\n" +#~ " REF: Side 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Linje %d er på mere end 255 tegn (%d)!\n" +#~ " REF: Side 25, Linjelængde\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " Manglende %!PS-Adobe-3.0 på første linje!\n" +#~ " REF: Side 17, 3.1 Overensstemmende dokumenter\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Manglende %%EndComments-kommentar!\n" +#~ " REF: Side 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Manglende eller ugyldig %%BoundingBox: kommentar!\n" +#~ " REF: Side 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Manglende eller ugyldig %%Page: kommentarer!\n" +#~ " REF: Side 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Manglende eller ugyldig %%Pages: kommentar!\n" +#~ " REF: Side 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " INGEN FEJL FUNDET\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Så %d linjer, der overskred 255 tegn!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " For mange %%BeginDocument-kommentarer!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " For mange %%EndDocument-kommentarer!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Advarsel: Arkiv indeholder binære data!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Advarsel: Ingen %%EndComments-kommentar i arkiv!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Advarsel: Forældet DSC-version %.1f i arkiv!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Kan ikke åbne PPD-arkiv - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Kan ikke åbne PPD-arkiv - %s på linje %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10-kuvert" + +#~ msgid "#11 Envelope" +#~ msgstr "#11-kuvert" + +#~ msgid "#12 Envelope" +#~ msgstr "#12-kuvert" + +#~ msgid "#14 Envelope" +#~ msgstr "#14-kuvert" + +#~ msgid "#9 Envelope" +#~ msgstr "#9-kuvert" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s accepterer anmodninger siden %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s er ikke implementeret af CUPS-versionen af lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s er ikke klar\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s er klar\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s er klar og udskriver\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s accepterer ikke anmodninger siden %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s ikke understøttet!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s accepterer anmodninger siden %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s accepterer ikke anmodninger siden %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [job %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s mislykkedes: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Ved ikke, hvad jeg skal gøre!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Fejl - %s-miljøvariabel navngiver ikke eksisterende destination \"%s" +#~ "\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Fejl - ugyldig job-id!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "%s: Fejl - kan ikke udskrive arkiver og ændre job på samme tid!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Fejl - kan ikke udskrive fra stdin, hvis der leveres arkiver eller en " +#~ "job-id!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Fejl - forventede tegnsæt efter indstillingen '-S'!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Fejl - forventede indholdstype efter indstillingen '-T'!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Fejl - forventede kopier efter indstillingen '-n'!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Fejl - forventede antal kopier efter indstillingen '-#'!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Fejl - forventede destination efter indstillingen '-P'!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Fejl - forventede destination efter indstillingen '-b'!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Fejl - forventede destination efter indstillingen '-d'!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Fejl - forventede formular efter indstillingen '-f'!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Error - forventede udsat navn efter indstillingen '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Error - forventede værtsnavn efter indstillingen '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Error - forventede værtsnavn efter indstillingen '-H'!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Error - forventede funktionsliste efter indstillingen '-y'!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Error - forventede navn efter indstillingen '-%c'!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "" +#~ "%s: Error - forventede alternativ streng efter indstillingen '-o'!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Error - forventede sideliste efter indstillingen '-P'!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Error - forventede prioritet efter indstillingen '-%c'!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Fejl - forventede årsagstekst efter indstillingen '-r'!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Error - forventede titel efter indstillingen '-t'!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Error - forventede brugernavn efter indstillingen '-U'!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Error - forventede brugernavn efter indstillingen '-u'!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Error - forventede værdi efter indstillingen '-%c'!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Fejl - skal have \"completed\", \"not-completed\" eller \"all\" efter " +#~ "indstillingen '-W'!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Fejl - ingen tilgængelig standarddestination.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Fejl - prioritet skal være mellem 1 og 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Fejl - planlægger svarer ikke!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Fejl - for mange arkiver - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Fejl - kan ikke få adgang til \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Fejl - kan ikke sætte i kø fra stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Fejl - ukendt destination \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Fejl - ukendt destination \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Fejl - ukendt indstilling '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Fejl - ukendt indstilling '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Forventede job-id efter indstillingen '-i'!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filter \"%s\" ikke tilgængeligt: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Ugyldigt destinationsnavn på listen \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Ugyldig filterstreng \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Skal have job-id ('-i jobid') før '-H restart'!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Intet filter til konvertering fra %s/%s til %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Handling mislykkedes: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "" +#~ "%s: Beklager, der er ikke medkompileret krypteringsunderstøttelse!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Kan ikke oprette forbindelse til server\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Kan ikke kontakte server!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Kan ikke bestemme MIME-typen på \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Kan ikke åbne %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Kan ikke åbne %s - %s på linje %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Kan ikke åbne %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Kan ikke åbne PPD-arkiv: %s på linje %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Kan ikke læse MIME-database fra \"%s\" eller \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Ukendt destination \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Ukendt destination på MIME-typen \"%s/%s\"!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Ukendt indstilling '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Ukendt kilde på MIME-typen %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Advarsel - '%c'-formatmodifikation ikke understøttet - resultat " +#~ "muligvis ikke korrekt!" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Advarsel - indstillingen tegnsæt ignoreret!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Advarsel - indstillingen indholdstype ignoreret!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Advarsel - indstillingen formular ignoreret!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Advarsel - indstillingen funktion ignoreret!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Fejl - %s-miljøvariabel navngiver ikke eksisterende destination \"%s" +#~ "\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: Fejl - forventede option=value efter indstillingen '-o'!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: Fejl - ingen tilgængelig standarddestination.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 dpi gråtoner" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Ugyldig hjælpekommando ukendt\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Der kræves en Samba-adgangskode til eksport af printerarkiver!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Der kræves et Samba-brugernavn til eksport af printerarkiver!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Der findes allerede en klasse kaldet \"%s\"!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Der findes allerede en printer kaldet \"%s\"!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (overstørrelse)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (overstørrelse)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (beskåret)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (overstørrelse)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Forsøger at indstille %s-printer-state til ugyldig værdi %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Egenskabsgrupper er ikke i rækkefølge (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Ugyldig enheds-URI \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Ugyldig device-uri \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Ugyldig device-uri-plan \"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Ugyldigt document-format \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Ugyldig arkivnavnebuffer!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Ugyldig skriftattribut: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Ugyldig værdi for job-priority!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Ugyldig værdi for job-sheets \"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Ugyldig værditype på job-sheets!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Ugyldig værdi for job-state!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Ugyldig egenskab for job-uri \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Ugyldig notify-pull-method \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Ugyldig notify-recipient-uri URI \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Ugyldig indstilling + valg på linje %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Ugyldig port-monitor \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Ugyldig værdi for printer-state %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Ugyldigt versionsnummer på anmodning %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Ugyldig abonnements-id!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0-kuvert" + +#~ msgid "C1 Envelope" +#~ msgstr "C1-kuvert" + +#~ msgid "C2 Envelope" +#~ msgstr "C2-kuvert" + +#~ msgid "C3 Envelope" +#~ msgstr "C3-kuvert" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4-kuvert" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5-kuvert" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6-kuvert" + +#~ msgid "C65 Envelope" +#~ msgstr "C65-kuvert" + +#~ msgid "C7 Envelope" +#~ msgstr "C7-kuvert" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Tegnsættet \"%s\" understøttes ikke!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3-kuvert" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4-kuvert" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Kommandoer kan være forkortet. Kommandoer er:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Kunne ikke scanne typen \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Dæksel åbent." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL-kuvert" + +#~ msgid "Developer almost empty." +#~ msgstr "Fremkalder næsten tom." + +#~ msgid "Developer empty!" +#~ msgstr "Fremkalder tom!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Enhed: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokument %d findes ikke i job %d." + +#~ msgid "Door open." +#~ msgstr "Dæksel åbent." + +#~ msgid "Double Postcard" +#~ msgstr "Dobbelt postkort" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Kan ikke tildele hukommelse til sideinfo: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Kan ikke tildele hukommelse til rækkefølge af sider: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Ugyldig %%BoundingBox: Kommentar set!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Ugyldig %%IncludeFeature: Kommentar!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Ugyldig %%Page: Kommentar i arkiv!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Ugyldig %%PageBoundingBox: Kommentar i arkiv!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Ugyldigt SCSI-enhedsarkiv \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Ugyldigt tegnsætsarkiv %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Ugyldig type på tegnsæt %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Ugyldig kolonneværdi %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Ugyldig cpi-værdi %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Ugyldig linje til skriftbeskrivelse: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Ugyldig lpi-værdi %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Ugyldigt sidelayout!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Ugyldig tekstretning %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Ugyldig tekstbredde %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Destinationsprinter findes ikke!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Dubleret %%BoundingBox: Kommentar set!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Dublerede %%Pages: Kommentar set!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Tomt udskriftsarkiv!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Fejl %d under afsendelse af PAPSendData-anmodning: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: Forventede streng med anførselstegn på linje %d af %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Uoprettelig USB-fejl!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "ERROR: Ugyldig HP-GL/2-kommando set, kan ikke udskrive arkiv!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: Manglende %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: Manglende %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Manglende enheds-URI på kommandolinjen og ingen DEVICE_URI-" +#~ "miljøvariabel!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Manglende værdi på linje %d i bannerarkiv!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Kræver en msgid-linje før evt. oversætterstrenge på linje %d i %" +#~ "s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Ingen %%BoundingBox: Kommentar i header!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Ingen %%Pages: Kommentar i header!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Ingen enheds-URI fundet i argv[0] eller i DEVICE_URI-" +#~ "miljøvariabel!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Ingen skrifter i tegnsætsarkiv %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Ingen sider fundet!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Ikke mere papir!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER-miljøvariabel ikke defineret!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Udskriftsarkiv blev ikke accepteret (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Printer svarer ikke!\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Printer svarer ikke!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Printer sendte uventet EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Ekstern vært accepterede ikke kontrolarkiv (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Ekstern vært accepterede ikke dataarkiv (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Der opstod en timeout-fejl under afsendelse af data til printeren\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Kan ikke føje arkivet %d til job: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Kan ikke annullere jobbet %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Kan ikke kopiere PDF-arkiv" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Kan ikke oprette socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Kan ikke oprette midlertidigt komprimeret udskriftsarkiv: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Kan ikke oprette midlertidigt arkiv" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Kan ikke oprette midlertidigt arkiv - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Kan ikke oprette midlertidigt arkiv: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke udføre pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Kan ikke udføre gs-program" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Kan ikke udføre pdftops-program" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke fork pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Kan ikke hente PAP-anmodning" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Kan ikke hente PAP-svar" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: Kan ikke hente PPD-arkiv til printeren \"%s\" - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Kan ikke hente AppleTalk-standardzone" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Kan ikke hente attributter til jobbet %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Kan ikke hente printerstatus (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Kan ikke finde printeren '%s'!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Kan ikke søge efter PAP-svar" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Kan ikke slå AppleTalk-printere op" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Kan ikke oprette AppleTalk-adresse" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åbne \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Kan ikke åbne %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åbne bannerarkiv \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åbne enhedsarkivet \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åbne arkivet \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åbne arkivet \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Kan ikke åbne billedarkiv til udskrivning!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åbne udskriftarkivet \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Kan ikke åbne udskriftsarkivet %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Kan ikke åbne udskriftarkivet %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Kan ikke åbne midlertidigt komprimeret udskriftsarkiv: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Kan ikke åbne midlertidigt arkiv" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Kan ikke udskrive %d tekstspalter!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Kan ikke udskrive %dx%d tekstside!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Kan ikke læse udskriftsdata" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Kan ikke læse udskriftsdata!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Kan ikke reservere port" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Kan ikke forsøge at forskyde %ld i arkiv - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Kan ikke forsøge at forskyde %lld i arkiv - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Kan ikke sende LPD-kommando" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Kan ikke sende PAP tickle-anmodning" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Kan ikke sende startanmodningen PAP send data" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Kan ikke sende udskriftsdata (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Kan ikke sende udskriftsdata!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Kan ikke sende udskriftsarkiv til printer" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Kan ikke sende udpunkteringsnul til printer" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke vente på pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke skrive %d byte til \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Kan ikke skrive %d byte til printer!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Kan ikke skrive kontrolarkiv" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Kan ikke skrive udskriftsdata" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Kan ikke skrive udskriftsdata: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Kan ikke skrive rasterdata til driver!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Kan ikke skrive til midlertidigt arkiv" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: Kan ikke skrive ukomprimerede dokumentdata: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Uventet tekst på linje %d af %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Ukendt værdi i krypteringsindstilling \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Ukendt arkivrækkefølge \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Ukendt formattegn \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Ukendt beskedkatalogformat til \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Ukendt indstilling \"%s\" med værdien \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Ukendt udskriftsfunktion \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Ukendt værdi på versionsindstilling \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Værdi for lysstyrke %s ikke understøttet, bruger lysstyrke=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Værdi for gamma %s ikke understøttet, bruger gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: Værdi for number-up %d ikke understøttet, bruger number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Værdi for number-up-layout %s ikke understøttet, bruger number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Værdi for page-border %s ikke understøttet, bruger page-" +#~ "border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: doc_printf-overløb (%d byte) registreret, annullerer!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-filter gik ned på signalet %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-filter afsluttede med status %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops afsluttede på signalet %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops afsluttede med status %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: Kan gendannes: Kan ikke oprette forbindelse til printer; prøver " +#~ "igen om 30 sekunder...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() mislykkedes" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: Kan ikke stat udskriftsarkiv" + +#~ msgid "Empty PPD file!" +#~ msgstr "Tomt PPD-arkiv!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "ERROR: Værtsnavn kræves efter indstillingen '-h'!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Arkivets enheds-URI'er er blevet slået fra! Du slår det til ved at se i " +#~ "FileDevice-direktivet i \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Fixertemperatur høj!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Fixertemperatur lav!" + +#~ msgid "German FanFold" +#~ msgstr "Tysk FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "Tysk FanFold, 8,5 x 14\"" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Fik en printer-uri-egenskab, men ingen job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk slået fra i Systemindstillinger\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk slået fra i Systemindstillinger.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Annullerer udskriftsjob...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Sluttet til printer...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Opretter forbindelse til printer...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Kontrolarkiv sendt\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Dataarkiv sendt\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Formaterer siden %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Indlæser billedarkivet...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Søger efter printer...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Åbner forbindelse\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Udskriftsarkiv sendt, venter på, at printer bliver færdig...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Printer i brug; prøver igen om 10 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Printer i brug; prøver igen om 30 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Printer i brug; prøver igen om 5 sekunder...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: Printer understøtter ikke IPP/%d.%d, prøver IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Printer i brug; prøver igen om 5 sekunder...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Printer er passiv.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Printer er passiv.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Printer er nu aktiv.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Printer er passiv.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: Printer ikke tilsluttet; prøver igen om 30 sekunder...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Udskriver side %d, %d%% færdig...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Udskriver side %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Klar til at udskrive.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Sender kontrolarkiv (%lu byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Sender kontrolarkiv (%u byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Sender data\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Sender dataarkiv (%ld byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Sender dataarkiv (%lld byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Sender udskriftsdata...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Sendt udskriftsarkiv, %ld byte...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Sendt udskriftsarkiv, %lld byte...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Spoler LPR-job, %.0f%% færdig...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Kan ikke kontakte printer, sætter job i kø på næste printer i " +#~ "klassen...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Bruger AppleTalk-standardzone \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Venter på, at job bliver færdigt...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Venter på, at printer bliver tilgængelig...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4-kuvert" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (overstørrelse)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5-kuvert" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6-kuvert" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Blæk/toner næsten tom." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Blæk/toner tom!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Affaldsbeholder til blæk/toner næsten fuld." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Affaldsbeholder til blæk/toner fuld!" + +#~ msgid "Interlock open." +#~ msgstr "Sikkerhedsafbryder åben." + +#~ msgid "Invite Envelope" +#~ msgstr "Invite-kuvert" + +#~ msgid "Italian Envelope" +#~ msgstr "Italiensk kuvert" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Job #%d kan ikke startes igen - ingen arkiver!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Job #%d eksisterer ikke!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Job #%d er færdigt og kan ikke ændres!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Job #%d er ikke færdigt!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Job #%d er ikke udsat til godkendelse!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Job #%d er ikke udsat!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Job #%s eksisterer ikke!" + +#~ msgid "Job %d not found!" +#~ msgstr "Job %d findes ikke!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Jobabonnementer kan ikke fornys!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2-kuvert" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3-kuvert" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Sproget \"%s\" understøttes ikke!" + +#~ msgid "Media jam!" +#~ msgstr "Mediestop!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Mediebakke næsten tom." + +#~ msgid "Media tray empty!" +#~ msgstr "Mediebakke tom!" + +#~ msgid "Media tray missing!" +#~ msgstr "Mediebakke mangler!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Mediebakke skal fyldes op." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Manglende document-number-attribut!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Manglende dobbelt anførselstegn i linje %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Manglende formularvariabel!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Manglende notify-subscription-ids-egenskab!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Manglende requesting-user-name-egenskab!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Manglende nødvendige attributter!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Manglende værdi i linje %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch-kuvert" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Udskriftsarkiv accepteret - job-id %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Udskriftsarkiv accepteret - job-id ukendt.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Intet PPD-navn!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Der er ikke installeret nogen Windows-printerdrivere!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Ingen aktive job på %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Ingen attributter i anmodning!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Ingen godkendelsesoplysninger leveret!" + +#~ msgid "No default printer" +#~ msgstr "Ingen standardprinter" + +#~ msgid "No file!?!" +#~ msgstr "Intet arkiv!?!" + +#~ msgid "No modification time!" +#~ msgstr "Intet ændringstidspunkt!" + +#~ msgid "No printer name!" +#~ msgstr "Intet printernavn!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Ingen printer-uri fundet til klasse!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Ingen printer-uri fundet!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Ingen printer-uri i anmodning!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Ingen abonnementsattributter i anmodning!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC næsten slidt op." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC slidt op!" + +#~ msgid "Out of toner!" +#~ msgstr "Ikke mere toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Udbakke næsten fuld." + +#~ msgid "Output bin full!" +#~ msgstr "Udbakke fuld!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Udskrifter til printer %s er sendt til %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "Udskrifter til printer %s er sendt til ekstern printer %s på %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Udskrifter til printer %s/%s er sendt til %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Udskrifter til printer %s/%s er sendt til ekstern printer %s på %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Udbakke mangler!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1-kuvert" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10-kuvert" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2-kuvert" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3-kuvert" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (overstørrelse)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4-kuvert" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5-kuvert" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6-kuvert" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7-kuvert" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8-kuvert" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9-kuvert" + +#~ msgid "Personal Envelope" +#~ msgstr "Personlig kuvert" + +#~ msgid "Printer offline." +#~ msgstr "Printer passiv." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Grad Ejer Job Arkiv(er) Str. i alt\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Grad Ejer Pri Job Arkiver Str. i " +#~ "alt\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Aktiv kommando: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI-printer" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "17 x 11\" (overstørrelse)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Værdien for notify-user-data er for stor (%d > 63 oktetter)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Printeren eller klassen er ikke delt!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Printeren eller klassen findes ikke." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Egenskaben printer-uri kræves!" + +#~ msgid "Toner low." +#~ msgstr "Toner lav." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "For mange job-sheets-værdier (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "For mange printer-state-reasons-værdier (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "7,25 x 10,5\"" + +#~ msgid "US Fanfold" +#~ msgstr "Amerikansk fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "8,5 x 14\" (overstørrelse)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "8,5 x 11\" (overstørrelse)" + +#~ msgid "US Letter (Small)" +#~ msgstr "8,5 x 11\" (beskåret)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Kan ikke tilføje job til destinationen \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Kan ikke tildele hukommelse til arkivtyper!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere 64 bit CUPS-printerarkiver (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere 64 bit Windows-printerarkiver (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere CUPS-printerarkiver (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Kan ikke kopiere PPD-arkiv - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Kan ikke kopiere PPD-arkiv!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere Windows 2000-printerarkiver (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere Windows 9x-printerarkiver (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Kan ikke kopiere grænsefladeinstruks - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Kan ikke oprette printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Kan ikke redigere cupsd.conf-arkiver på mere end 1 MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Kan ikke finde jobbets destination!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Kan ikke finde printer!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Kan ikke installere Windows 2000-printerarkiver (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Kan ikke installere Windows 9x-printerarkiver (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Kan ikke åbne dokument %d i job %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Kan ikke afvikle \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Kan ikke sende kommando til printerarkiv!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Kan ikke indstille Windows-printerarkiv (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Kan ikke bruge oprindeligt printerarkiv af USB-klasse!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Ukendt printerfejl (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Ikke understøttet tegnsæt \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Ikke understøttet komprimering \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Ikke understøttet komprimeringsegenskab %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Ikke understøttet format \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Ikke understøttet format \"%s\"!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Ikke understøttet format '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Brug:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Brug: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Brug: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Brug: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Brug: convert [ options ]\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ "\n" +#~ " -f arkivnavn Indstil arkiv, der skal konverteres (otherwise " +#~ "stdin)\n" +#~ " -o arkivnavn Indstil arkiv, der skal genereres (otherwise " +#~ "stdout)\n" +#~ " -i mime/type Indstil indgående MIME-type (otherwise auto-" +#~ "typed)\n" +#~ " -j mime/type Indstil udgående MIME-type (otherwise application/" +#~ "pdf)\n" +#~ " -P arkivnavn.ppd Indstil PPD-arkiv\n" +#~ " -a 'name=value ...' Juster indstilling(er)\n" +#~ " -U brugernavn Indstil brugernavn til job\n" +#~ " -J titel Indstil titel\n" +#~ " -c kopier Indstil antal kopier\n" +#~ " -u Fjern PPD-arkiv når færdig\n" +#~ " -D Fjern indgående arkiv når færdig\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Brug: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ " -E Krypter forbindelsen til serveren\n" +#~ " -H samba-server Brug den navngivne SAMBA-server\n" +#~ " -U samba-user Godkend vha. den navngivne SAMBA-bruger\n" +#~ " -a Eksporter alle printere\n" +#~ " -h cups-server Brug den navngivne CUPS-server\n" +#~ " -v Vær detaljeret (vis kommandoer)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Brug: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ "\n" +#~ " -E Slå kryptering til\n" +#~ " -U brugernavn Angiv brugernavn\n" +#~ " -h server[:port] Angiv serveradresse\n" +#~ "\n" +#~ " --[no-]debug-logging Slå fejlfindingslog til/fra\n" +#~ " --[no-]remote-admin Slå ekstern administration til/fra\n" +#~ " --[no-]remote-any Tillad/afvis adgang fra Internet\n" +#~ " --[no-]remote-printers Vis/skjul eksterne printere\n" +#~ " --[no-]share-printers Slå printerdeling til/fra\n" +#~ " --[no-]user-cancel-any Brugere må/må ikke annullere alle job\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Brug: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Indlæs alternativt konfigurationsarkiv\n" +#~ "-f Afvikl i forgrunden\n" +#~ "-F Afvikl i baggrunden, men fjern\n" +#~ "-h Vis denne brugsmeddelelse\n" +#~ "-l Start cupsd fra startd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Brug: cupsfilter -m mime/type [ options ] arkivnavn\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ "\n" +#~ " -c cupsd.conf Indstil cupsd.conf-arkiv til at bruge\n" +#~ " -j job-id[,N] Filter arkiv N fra det anførte job (standard er arkiv " +#~ "1)\n" +#~ " -n kopier Indstil antal kopier\n" +#~ " -o name=value Juster indstilling(er)\n" +#~ " -p arkivnan.ppd Indstil PPD-arkiv\n" +#~ " -t titel Indstil titel\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Brug: cupstestdsc [options] arkivnavn.ps [... arkivnavn.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ "\n" +#~ " -h Vis programbrug\n" +#~ "\n" +#~ " Bemærk: Dette program godkender kun DSC-kommentarer, ikke selve " +#~ "PostScript.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Brug: cupstestppd [options] arkivnavn1.ppd[.gz] [... arkivnavnN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Indstillinger:\n" +#~ "\n" +#~ " -R root-directory Indstil alternativ root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Udsted advarsler i stedet for fejl\n" +#~ " -q Afvikl i baggrunden\n" +#~ " -r Brug 'relaxed' åben funktion\n" +#~ " -v Vær en anelse detaljeret\n" +#~ " -vv Vær meget detaljseret\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Brug: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Brug: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Brug: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Brug: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Brug: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Brug: ppdc [options] arkivnavn.drv [ ... arkivnavnN.drv ]\n" +#~ "Indstillinger:\n" +#~ " -D name=value Indstil navngiven variabel til værdi.\n" +#~ " -I include-dir Tilføj inkluder bibliotek i søgesti.\n" +#~ " -c catalog.po Indlæs det anførte beskedkatalog.\n" +#~ " -d output-dir Angiv resultatbiblioteket.\n" +#~ " -l lang[,lang,...] Angiv resultatsproget(-sprogene) (locale).\n" +#~ " -m Brug ModelName-værdien som arkivnavnet.\n" +#~ " -t Test PPD'er i stedet for at generere dem.\n" +#~ " -v Vær detaljeret (flere v'er giver flere detaljer).\n" +#~ " -z Komprimer PPD-arkiver vha. GNU zip.\n" +#~ " --cr Afslut linjer med CR (Mac OS 9).\n" +#~ " --crlf Afslut linjer med CR + LF (Windows).\n" +#~ " --lf Afslut linjer med LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Brug: ppdhtml [options] arkivnavn.drv >arkivnavn.html\n" +#~ " -D name=value Indstil navngiven variabel til værdi.\n" +#~ "Indstillinger:\n" +#~ " -I include-dir Tilføj inkluder bibliotek i søgesti.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Brug: ppdi [options] arkivnavn.ppd [ ... arkivnavnN.ppd ]\n" +#~ "Indstillinger:\n" +#~ " -I include-dir\n" +#~ " -o arkivnavn.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Brug: ppdmerge [options] arkivnavn.ppd [ ... arkivnavnN.ppd ]\n" +#~ "Indstillinger:\n" +#~ " -o arkivnavn.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Brug: ppdpo [options] -o arkivnavn.po arkivnavn.drv [ ... arkivnavnN." +#~ "drv ]\n" +#~ "Indstillinger:\n" +#~ " -D name=value Indstil navngiven variabel til værdi.\n" +#~ " -I include-dir Tilføj inkluder bibliotek i søgesti.\n" +#~ " -v Vær detaljeret (flere v'er giver flere detaljer).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Brug: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Tilføjer kun de første %d fundne printere" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boolesk forventet for indstillingen waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Kunne ikke læse anmodningen om side-channel!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Indstillingen \"%s\" kan ikke inkluderes via IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Printer svarer ikke!\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Printer sendte uventet EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vært svarede ikke med kommandostatus-byte efter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vært svarede ikke med kontrolstatus-byte efter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vært svarede ikke med datastatus-byte efter %d " +#~ "sekunder!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: Timeout i SCSI-kommando (%d); prøver igen...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Dette dokument overholder ikke Adobe Document Structuring " +#~ "Conventions og udskrives muligvis ikke korrekt!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Kan ikke åbne \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Kan ikke sende PAP status-anmodning" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Uventet PAP-pakke af typen %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Ukendt PAP-pakke af typen %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Ukendt valg \"%s\" til indstillingen \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Ukendt indstilling \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Ikke understøttet baudhastighed %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: tal forventet for indstillingen status \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: Kan gendannes: Netværksværten '%s' er i brug; prøver igen om %d " +#~ "sekunder...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Advarsel - der er ikke installeret nogen Windows 2000-printerarkiver!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4-kuvert" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "konverter: Brug indstillingen -f til at anføre et arkiv, der skal " +#~ "konverteres.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Intet PPD-arkiv til printeren \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Kan ikke oprette forbindelse til server: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Ukendt indstilling \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Ukendt indstilling \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Forventede config-arkivnavn efter indstillingen \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Kan ikke hente aktuelt bibliotek!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Ukendt argument \"%s\" - afbryder!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Ukendt indstilling \"%c\" - afbryder!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: launchd(8)-understøttelse ikke medkompileret, afvikles i normal " +#~ "funktion.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Ugyldigt dokumentnummer %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Ugyldig job-id %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Der kan kun anføres et arkivnavn!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Kan ikke oprette midlertidigt arkiv: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Kan ikke hente jobarkiv - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "" +#~ "cupstestppd: Indstillingen -q er ikke kompatibel med indstillingen -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "" +#~ "cupstestppd: Indstillingen -v er ikke kompatibel med indstillingen -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "enhed til %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "enhed til %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "hjælp\t\tfå hjælp til kommandoer" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "egenskaben job-printer-uri mangler!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Klassenavn må kun indeholde tegn, der kan udskrives!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: Forventede PPD efter indstillingen '-P'!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Forventede allow/deny:userlist efter indstillingen '-u'!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Forventede klasse efter indstillingen '-r'!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Forventede klassenavn efter indstillingen '-c'!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Forventede beskrivelse efter indstillingen '-D'!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Forventede enheds-URI efter indstillingen '-v'!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Forventede arkivtype(r) efter indstillingen '-I'!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Forventede værtsnavn efter indstillingen '-h'!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Forventede grænseflade efter indstillingen '-i'!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Forventede placering efter indstillingen '-L'!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Forventede model efter indstillingen '-m'!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Forventede navn=værdi efter indstillingen '-o'!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Forventede printer efter indstillingen '-p'!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Forventede printernavn efter indstillingen '-d'!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "" +#~ "lpadmin: Forventede printer eller klasse efter indstillingen '-x'!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Ingen medlemsnavne set!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Printeren %s er allerede medlem af klassen %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Printeren %s er ikke medlem af klassen %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Printernavn må kun indeholde tegn, der kan udskrives!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke føje en printer til klassen:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Kan ikke oprette forbindelse til server: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Kan ikke oprette midlertidigt arkiv - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Kan ikke oprette midlertidigt arkiv: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Kan ikke åbne PPD-arkivet \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Kan ikke åbne arkivet \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke fjerne en printer fra klassen:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille PPD-arkivet:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille enheds-URI'en:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille grænsefladeinstruksen eller PPD-arkivet:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille grænsefladeinstruksen:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille printerbeskrivelsen:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille printerens placering:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke indstille printerens udstyr:\n" +#~ " Du skal først angive et printernavn!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Ukendt indstilling for tillad/afvis \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Ukendt argument \"%s\"!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Ukendt indstilling '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Advarsel - listen indholdstype ignoreret!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: Forventede 1284-enheds-id-streng efter --device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Forventede sprog efter --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Forventede mærke og model efter --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Forventede produktstreng efter --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Forventede planliste efter --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Forventede planliste efter --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Forventede timeout efter --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Ukendt argument \"%s\"!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Ukendt indstilling '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Ukendt indstilling '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Kan ikke oprette forbindelse til server: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Ukendt argument \"%s\"!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Ukendt indstilling '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Ingen printere!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Kan ikke tilføje printer eller tilfælde: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Kan ikke hente PPD-arkivet til %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Kan ikke åbne PPD-arkivet til %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Ukendt printer eller klasse!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Det er kun root, der må tilføje og slette adgangskoder!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Adgangskodearkiv i brug!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Adgangskodearkiv ikke opdateret!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Beklager, adgangskoderne er ikke de samme!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Beklager, adgangskode afvist. Adgangskoden skal bestå af mindst " +#~ "6 tegn, må ikke indeholde dit brugernavn og skal indeholde mindst et " +#~ "bogstav og et tal.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Beklager, adgangskoderne er ikke de samme!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Kan ikke kopiere adgangskodestreng: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Kan ikke åbne adgangskodearkiv: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Kan ikke skrive til adgangskodearkiv: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: kunne ikke sikkerhedskopiere gammelt adgangskodearkiv: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: kunne ikke omdøbe adgangskodearkiv: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: brugeren \"%s\" og gruppen \"%s\" findes ikke.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: Fejl - %s-miljøvariabel navngiver ikke eksisterende destination " +#~ "\"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "medlemmer af klassen %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "ingen optegnelser" + +#~ msgid "no system default destination\n" +#~ msgstr "ingen standarddestination til system" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events ikke anført!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" er allerede brugt!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" bruger ukendt skema!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d ikke i orden!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Tilføjer inkluder bibliotek \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Tilføjer/opdaterer ui-tekst fra %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Ugyldig booleesk værdi (%s) på linje %d af %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldigt opløsningsnavn \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldigt statusnøgleord %s på linje %d af %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Ugyldig variabelerstatning ($%c) på linje %d af %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Valg fundet på linje %d af %s uden nogen indstilling!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Dubleret #po for lokalitet %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Forventede en filterdefinition på linje %d af %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Forventede et programnavn på linje %d af %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Forventede booleesk værdi på linje %d af %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventede tegnsæt efter Font på linje %d af %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Forventede valgkode på linje %d af %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Forventede valgnavn/-tekst på linje %d af %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventede farverækkefølge til ColorModel på linje %d af %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Forventede farveområde til ColorModel på linje %d af %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Forventede komprimering til ColorModel på linje %d af %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventede begrænsningsstreng til UIConstraints på linje %d af %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Forventede nøgleord til printerarkivtype efter DriverType på linje %" +#~ "d af %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Forventede duplekstype efter Duplex på linje %d af %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventede kodning efter Font på linje %d af %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventede arkivnavn efter #po %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Forventede gruppenavn/-tekst på linje %d af %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Forventede inkluder arkivnavn på linje %d af %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Forventede heltal på linje %d af %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Forventede lokalitet efter #po på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter FileName på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter Font på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter Manufacturer på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter MediaSize på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter ModelName på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn efter PCFileName på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn/tekst efter %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn/tekst efter Installable på linje %d af %s.\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Forventede navn/tekst efter Resolution på linje %d af %s.\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventede navn-/tekstkombination til ColorModel på linje %d af %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Forventede indstillingsnavn/-tekst på linje %d af %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Forventede indstillingssektion på linje %d af %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Forventede indstillingstype på linje %d af %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventede tilsidesættelsesfelt efter Resolution på linje %d af %" +#~ "s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Forventede rigtigt tal på linje %d af %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Forventede opløsnings-/medietype efter ColorProfile på linje %d af %" +#~ "s.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventede opløsnings-/medietype efter SimpleColorProfile på linje %" +#~ "d af %s.\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventede vælger efter %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventede status efter Font på linje %d af %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Forventede streng efter Copyright på linje %d af %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Forventede streng efter Version på linje %d af %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Forventede to indstillingsnavne på linje %d af %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventede værdi efter %s på linje %d af %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventede version efter Font på linje %d af %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Ugyldigt #include/#po-arkivnavn \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig omkostning for filter på linje %d af %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig tom MIME-type for filter på linje %d af %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldigt tomt programnavn for filter på linje %d af %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig indstillingssektion \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig indstillingstype \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Indlæser oplysningsarkiv til printerarkiv \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Indlæser beskeder til lokalitet \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Indlæser beskeder fra \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: Manglende #endif i slutningen af \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: Manglende #if på linje %d af %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Intet beskedkatalog til lokalitet %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Indstilling %s omdefineret med en anden type på linje %d af %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Indstillingen constraint skal *name på linje %d af %s.\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: For mange indlejrede #if-udsagn på linje %d af %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Kan ikke oprette PPD-arkivet \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Kan ikke oprette resultatbibliotek %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Kan ikke oprette resultatrør: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Kan ikke udføre cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Kan ikke finde #po-arkiv %s på linje %d af %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Kan ikke finde inkluder arkiv \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Kan ikke finde lokalisering for \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Kan ikke indlæse lokaliseringsarkivet \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Udefineret variabel (%s) på linje %d af %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Ukendt type printerarkiv %s på linje %d af %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ukendt duplekstype \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ukendt mediestørrelse \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Ukendt mærke \"%s\" set på linje %d af %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Ukendt udpunkteringstegn i rigtige tal \"%s\" på linje %d af %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Uafsluttet streng startende fra %c på linje %d af %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Skriver %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Skriver PPD-arkiver til bibliotek \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Ugyldig LanguageVersion \"%s\" in %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Ignorerer PPD-arkiv %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Kan ikke sikkerhedskopiere %s til %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "printeren %s slået fra siden %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "printeren %s er ledig. Slået til siden %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "printeren %s udskriver nu %s-%d. Slået til siden %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "printeren %s/%s slået fra siden %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "printeren %s/%s er ledig. Slået til siden %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "printeren %s/%s udskriver nu %s-%d. Slået til siden %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "anmodnings-id er %s-%d (%d arkiv(er))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "planlægger er ikke aktiv\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "planlægger er aktiv\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tvis status for daemon og kø\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "standarddestination til system: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "standarddestination til system: %s/%s\n" diff --git a/locale/cups_de.po b/locale/cups_de.po new file mode 100644 index 0000000..43b44c6 --- /dev/null +++ b/locale/cups_de.po @@ -0,0 +1,8739 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f Millimeter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f bis %.0f x %.0f Millimeter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f Zoll" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f bis %.2f x %.2f Zoll" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s kann nicht geändert werden." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 Zoll/Sek." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25 Zoll" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25 Zoll" + +msgid "1.5 inch/sec." +msgstr "1,5 Zoll/Sek." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25 Zoll" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50 Zoll" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00 Zoll" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00 Zoll" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 Zoll/Sek." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/Sek." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 Zoll/Sek." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 Zoll/Sek." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/Sek." + +msgid "120x60dpi" +msgstr "120x60 dpi" + +msgid "120x72dpi" +msgstr "120x72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/Sek." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/Sek." + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 Zoll/Sek." + +msgid "2-Sided Printing" +msgstr "Doppelseitig drucken" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37 Zoll" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50 Zoll" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00 Zoll" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25 Zoll" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00 Zoll" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00 Zoll" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00 Zoll" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50 Zoll" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50 Zoll" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25 Zoll" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00 Zoll" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50 Zoll" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50 Zoll" + +msgid "2.5 inches/sec." +msgstr "2,5 Zoll/Sek." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00 Zoll" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00 Zoll" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25 Zoll" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1 Zoll" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/Sek." + +msgid "200 mm/sec." +msgstr "200 mm/Sek." + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-Pin Serie" + +msgid "240x72dpi" +msgstr "240x72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/Sek." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 Zoll/Sek." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00 Zoll" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25 Zoll" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00 Zoll" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00 Zoll" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00 Zoll" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00 Zoll" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00 Zoll" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50 Zoll" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83 Zoll" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83 Zoll" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3,5-Zoll-Diskette" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5-Zoll-Diskette – 2 1/8 x 2 3/4 Zoll" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00 Zoll" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/Sek." + +msgid "300 mm/sec." +msgstr "300 mm/Sek." + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360x180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 Zoll/Sek." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00 Zoll" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00 Zoll" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00 Zoll" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50 Zoll" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00 Zoll" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00 Zoll" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00 Zoll" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00 Zoll" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50 Zoll" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/Sek." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 Zoll/Sek." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 Zoll/Sek." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00 Zoll" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00 Zoll" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00 Zoll" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00 Zoll" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00 Zoll" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00 Zoll" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50 Zoll" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/Sek." + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 Zoll/Sek." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 Zoll/Sek." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00 Zoll" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00 Zoll" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00 Zoll" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00 Zoll" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00 Zoll" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00 Zoll" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50 Zoll" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/Sek." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 Zoll/Sek." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-Pin Serie" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "DIN A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "DIN A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "DIN A10" + +msgid "A2" +msgstr "DIN A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "DIN A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "DIN A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "DIN A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "DIN A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "DIN A7" + +msgid "A8" +msgstr "DIN A8" + +msgid "A9" +msgstr "DIN A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Druckaufträge akzeptieren" + +msgid "Accepted" +msgstr "Akzeptiert" + +msgid "Add Class" +msgstr "Klasse hinzufügen" + +msgid "Add Printer" +msgstr "Drucker hinzufügen" + +msgid "Add RSS Subscription" +msgstr "RSS-Abo hinzufügen" + +msgid "Address" +msgstr "Adresse" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adresse – 1 1/8 x 3 1/2 Zoll" + +msgid "Administration" +msgstr "Verwaltung" + +msgid "Always" +msgstr "Immer" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applicator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "DIN B0" + +msgid "B1" +msgstr "DIN B1" + +msgid "B10" +msgstr "DIN B10" + +msgid "B2" +msgstr "DIN B2" + +msgid "B3" +msgstr "DIN B3" + +msgid "B4" +msgstr "DIN B4" + +msgid "B5" +msgstr "DIN B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "DIN B6" + +msgid "B7" +msgstr "DIN B7" + +msgid "B8" +msgstr "DIN B8" + +msgid "B9" +msgstr "DIN B9" + +msgid "Bad NULL dests pointer" +msgstr "Ungültiger NULL-Dests-Pointer" + +msgid "Bad OpenGroup" +msgstr "Ungültige OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Ungültiges OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Ungültige OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Ungültige Anfrage" + +msgid "Bad SNMP version number" +msgstr "Ungültige SNMP-Versionsnummer" + +msgid "Bad UIConstraints" +msgstr "Ungültige UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Ungültiger Kopienwert „%d“." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Ungültiger angepasster Parameter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Ungültiger Number-Up-Wert „%d“." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Ungültige Seitenbereichswerte %d–%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Banner" + +msgid "Billing Information: " +msgstr "Rechnungsinformationen: " + +msgid "Bond Paper" +msgstr "Papier bündeln" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL Etikettendrucker" + +msgid "Cancel RSS Subscription" +msgstr "RSS-Abo widerrufen" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Einstellungen ändern" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klassen" + +msgid "Clean Print Heads" +msgstr "Saubere Druckerköpfe" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Farbe" + +msgid "Color Mode" +msgstr "Farbmodus" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Community-Name hat unbestimmte Länge" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Weiter" + +msgid "Continuous" +msgstr "Kontinuierlich" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Erstellt" + +msgid "Created On: " +msgstr "Erstellt am: " + +msgid "Custom" +msgstr "Eigene" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Abschneiden" + +msgid "Cutter" +msgstr "Abschneider" + +msgid "Dark" +msgstr "Dunkel" + +msgid "Darkness" +msgstr "Dunkelheit" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Klasse löschen" + +msgid "Delete Printer" +msgstr "Drucker löschen" + +msgid "Description: " +msgstr "Beschreibung: " + +msgid "DeskJet Series" +msgstr "DeskJet Serie" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Ziel „%s“ akzeptiert keine Druckaufträge." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Direct Thermal Media" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Deaktiviert" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Treibername: " + +msgid "Driver Version: " +msgstr "Treiberversion: " + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 Etikettendrucker" + +msgid "EPL2 Label Printer" +msgstr "EPL2 Etikettendrucker" + +msgid "Edit Configuration File" +msgstr "Konfigurationsdatei bearbeiten" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Banner beenden" + +msgid "English" +msgstr "German" + +msgid "Enter old password:" +msgstr "Altes Kennwort eingeben:" + +msgid "Enter password again:" +msgstr "Kennwort erneut eingeben:" + +msgid "Enter password:" +msgstr "Kennwort eingeben:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Geben Sie Ihren Benutzernamen und das Kennwort oder den root-Benutzernamen " +"und -Kennwort ein, um auf diese Seite zuzgreifen. Falls Sie die Kerberos-" +"Authentifizierung verwenden, stellen Sie sicher, dass Sie ein gültiges " +"Kerberos-Ticket haben." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Umschlagzuführung" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Fehlerbehandlung" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Alle 10 Etiketten" + +msgid "Every 2 Labels" +msgstr "Alle 2 Etiketten" + +msgid "Every 3 Labels" +msgstr "Alle 3 Etiketten" + +msgid "Every 4 Labels" +msgstr "Alle 4 Etiketten" + +msgid "Every 5 Labels" +msgstr "Alle 5 Etiketten" + +msgid "Every 6 Labels" +msgstr "Alle 6 Etiketten" + +msgid "Every 7 Labels" +msgstr "Alle 7 Etiketten" + +msgid "Every 8 Labels" +msgstr "Alle 8 Etiketten" + +msgid "Every 9 Labels" +msgstr "Alle 9 Etiketten" + +msgid "Every Label" +msgstr "Bei jedem Etikett" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Erwartete Daten nicht erhalten" + +msgid "Export Printers to Samba" +msgstr "Drucker zu Samba exportieren" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Dateiordner" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Dateiordner – 9/16 x 3 7/16 Zoll" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Verboten" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Allgemein" + +msgid "Generic" +msgstr "Allgemein" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU hat unbestimmte Länge" + +msgid "Glossy Paper" +msgstr "Glanzpapier" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Graustufen" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hängeordner" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hängeordner – 9/16 x 2 Zoll" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Ungültiges Steuerungszeichen" + +msgid "Illegal main keyword string" +msgstr "Ungültiger Main-Keyword-String" + +msgid "Illegal option keyword string" +msgstr "Ungültiger Option-Keyword-String" + +msgid "Illegal translation string" +msgstr "Ungültiger Übersetzungsstring" + +msgid "Illegal whitespace character" +msgstr "Ungültiges Leerzeichen" + +msgid "Installable Options" +msgstr "Installationsoptionen" + +msgid "Installed" +msgstr "Installiert" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar Etikettendrucker" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Interner Fehler" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2-teilig" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2-teilig – 2 1/4 x 7 1/2 Zoll" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3-teilig" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3-teilig – 2 1/4 x 7 Zoll" + +msgid "Internet Printing Protocol" +msgstr "Internet-Druckerprotokoll" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Druckauftrag Nr. %d wurde bereits abgebrochen – Abbruch nicht möglich." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "" +"Druckauftrag Nr. %d wurde bereits abgeschlossen – Abbruch nicht möglich." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Druckauftrag abgeschlossen" + +msgid "Job Created" +msgstr "Druckauftrag erzeugt" + +msgid "Job ID: " +msgstr "Druckauftrags-ID: " + +msgid "Job Options Changed" +msgstr "Druckauftragsoptionen wurden geändert" + +msgid "Job Stopped" +msgstr "Druckauftrag gestoppt" + +msgid "Job UUID: " +msgstr "Druckauftrags-UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "Druckauftrag ist abgeschlossen und kann nicht geändert werden." + +msgid "Job operation failed:" +msgstr "Druckvorgang fehlgeschlagen:" + +msgid "Job state cannot be changed." +msgstr "Druckauftragsstatus kann nicht geändert werden." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Druckaufträge" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-Host oder -Drucker" + +msgid "Label Printer" +msgstr "Etikettendrucker" + +msgid "Label Top" +msgstr "Etikett (oben)" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Adresse (groß)" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Adresse (groß) – 1 4/10 x 3 1/2 Zoll" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Serie PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Hell" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Zeile ist länger als maximal zulässig (255 Zeichen)" + +msgid "List Available Printers" +msgstr "Verfügbare Drucker anzeigen" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Standort: " + +msgid "Long-Edge (Portrait)" +msgstr "Lange Kante (Hochformat)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Hersteller und Modell: " + +msgid "Manual Feed" +msgstr "Manuelle Papierzufuhr" + +msgid "Media Dimensions: " +msgstr "Medienmaße: " + +msgid "Media Limits: " +msgstr "Mediendruckgrenzen: " + +msgid "Media Name: " +msgstr "Medienname: " + +msgid "Media Size" +msgstr "Mediengröße" + +msgid "Media Source" +msgstr "Medienquelle" + +msgid "Media Tracking" +msgstr "Medienführung" + +msgid "Media Type" +msgstr "Medienart" + +msgid "Medium" +msgstr "Medium" + +msgid "Memory allocation error" +msgstr "Fehler bei der Speicherzuteilung" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x Header fehlt" + +msgid "Missing asterisk in column 1" +msgstr "Sternchen in Spalte 1 fehlt" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Wertestring fehlt" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Klasse verändern" + +msgid "Modify Printer" +msgstr "Drucker verändern" + +msgid "Move All Jobs" +msgstr "Alle Druckaufträge bewegen" + +msgid "Move Job" +msgstr "Druckauftrag bewegen" + +msgid "Moved Permanently" +msgstr "Dauerhaft bewegt" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD File Pointer" + +msgid "Name OID uses indefinite length" +msgstr "Name-OID hat unbestimmte Länge" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Niemals" + +msgid "New Stylus Color Series" +msgstr "New Stylus Color Serie" + +msgid "New Stylus Photo Series" +msgstr "New Stylus Photo Serie" + +msgid "No" +msgstr "Nein" + +msgid "No Content" +msgstr "Kein Inhalt" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Keine VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Keine aktive Verbindung" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Kein Community-Name" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Keine Ziele hinzugefügt." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Kein Fehlerindex" + +msgid "No error-status" +msgstr "Kein Fehlerstatus" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Kein Name-OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Keine Anfrage-ID" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Keine Subskriptionen gefunden." + +msgid "No variable-bindings SEQUENCE" +msgstr "Keine „variable-bindings SEQUENCE“" + +msgid "No version number" +msgstr "Keine Versionsnummer" + +msgid "Non-continuous (Mark sensing)" +msgstr "Nicht fortlaufend (Mark-Sensing)" + +msgid "Non-continuous (Web sensing)" +msgstr "Nicht fortlaufend (Web-Sensing)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Nicht gefunden" + +msgid "Not Implemented" +msgstr "Nicht implementiert" + +msgid "Not Installed" +msgstr "Nicht installiert" + +msgid "Not Modified" +msgstr "Nicht verändert" + +msgid "Not Supported" +msgstr "Nicht unterstützt" + +msgid "Not allowed to print." +msgstr "Drucken nicht erlaubt." + +msgid "Note" +msgstr "Hinweis" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Aus (Einseitig)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Online-Hilfe" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "%s öffnen fehlgeschlagen: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup ohne CloseGroup zuerst" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI ohne CloseUI/JCLCloseUI zuerst" + +msgid "Operation Policy" +msgstr "Nutzungsrichtlinien" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Installierte Optionen" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Optionen: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Ausgabemodus" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL Laserdrucker" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Paket enthält kein Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Paket beginnt nicht mit SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Das Kennwort für „%s“ auf „%s“? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "" +"Das Kennwort für „%s“ wird benötigt für den Zugriff auf „%s“ über SAMBA: " + +msgid "Pause Class" +msgstr "Klasse anhalten" + +msgid "Pause Printer" +msgstr "Drucker anhalten" + +msgid "Peel-Off" +msgstr "Aufkleber" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Foto-Etiketten" + +msgid "Plain Paper" +msgstr "Standardpapier" + +msgid "Policies" +msgstr "Richtlinien " + +msgid "Port Monitor" +msgstr "Port-Monitor" + +msgid "PostScript Printer" +msgstr "PostScript-Drucker" + +msgid "Postcard" +msgstr "Postkarte" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Druckdichte" + +msgid "Print Job:" +msgstr "Druckauftrag:" + +msgid "Print Mode" +msgstr "Druckmodus" + +msgid "Print Rate" +msgstr "Druckrate" + +msgid "Print Self-Test Page" +msgstr "Selbsttestseite drucken" + +msgid "Print Speed" +msgstr "Druckgeschwindigkeit" + +msgid "Print Test Page" +msgstr "Testseite drucken" + +msgid "Print and Cut" +msgstr "Drucken und abschneiden" + +msgid "Print and Tear" +msgstr "Drucken und abziehen" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Gedruckt für: " + +msgid "Printed From: " +msgstr "Gedruckt von: " + +msgid "Printed On: " +msgstr "Gedruckt am: " + +msgid "Printer Added" +msgstr "Drucker hinzugefügt" + +msgid "Printer Default" +msgstr "Standardeinstellung für Drucker" + +msgid "Printer Deleted" +msgstr "Drucker gelöscht" + +msgid "Printer Modified" +msgstr "Drucker geändert" + +msgid "Printer Name: " +msgstr "Druckername: " + +msgid "Printer Paused" +msgstr "Drucker angehalten" + +msgid "Printer Settings" +msgstr "Druckereinstellungen" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Drucker:" + +msgid "Printers" +msgstr "Drucker" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Druckaufträge aufräumen" + +msgid "Quarto" +msgstr "US Quarto" + +msgid "Quota limit reached." +msgstr "Kontingentgrenze erreicht." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Druckaufträge ablehnen" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Druckvorgang nach dem Fehler fortsetzen" + +msgid "Request Entity Too Large" +msgstr "Gesamte Anfrage zu groß" + +msgid "Resolution" +msgstr "Auflösung" + +msgid "Resume Class" +msgstr "Klasse fortsetzen" + +msgid "Resume Printer" +msgstr "Drucken fortsetzen" + +msgid "Return Address" +msgstr "Absender-Adresse" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Absender-Adresse – 3/4 x 2 Zoll" + +msgid "Rewind" +msgstr "Zurückdrehen" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE hat unbestimmte Länge" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Siehe auch" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Serieller Anschluss Nr. %d" + +msgid "Server Restarted" +msgstr "Server neu gestartet" + +msgid "Server Security Auditing" +msgstr "Server Security Auditing" + +msgid "Server Started" +msgstr "Server gestartet" + +msgid "Server Stopped" +msgstr "Server gestoppt" + +msgid "Service Unavailable" +msgstr "Dienst nicht verfügbar" + +msgid "Set Allowed Users" +msgstr "Zugelassene Benutzer festlegen" + +msgid "Set As Server Default" +msgstr "Als Standardeinstellungen für Server festlegen" + +msgid "Set Class Options" +msgstr "Klassenoptionen festlegen" + +msgid "Set Printer Options" +msgstr "Druckeroptionen festlegen" + +msgid "Set Publishing" +msgstr "Veröffentlichung festlegen" + +msgid "Shipping Address" +msgstr "Lieferadresse" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Lieferadresse – 2 5/16 x 4 Zoll" + +msgid "Short-Edge (Landscape)" +msgstr "Kurze Kante (Querformat)" + +msgid "Special Paper" +msgstr "Spezialpapier" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Startbanner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "US Statement" + +msgid "Stylus Color Series" +msgstr "Stylus Color Serie" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Serie" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Protokoll wechseln" + +msgid "Tabloid" +msgstr "US Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Abziehen" + +msgid "Tear-Off" +msgstr "Abziehen" + +msgid "Tear-Off Adjust Position" +msgstr "Abziehposition" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Die PPD-Datei „%s“ konnte nicht gefunden werden." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Die PPD-Datei „%s“ konnte nicht geöffnet werden: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Der Klassenname darf maximal 127 druckbare Zeichen haben und darf keine " +"Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Das Attribut „notify-lease-duration“ kann nicht mit Druckauftrags-" +"Subskriptionen verwendet werden." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Der Druckername darf maximal 127 druckbare Zeichen haben und darf keine " +"Leerzeichen, Schrägstriche (/) oder Rautezeichen (#) enthalten." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Die Drucker-URI „%s“ enthält ungültige Zeichen." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/classes/" +"CLASSNAME" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"Die Drucker-URI muss in der folgenden Form vorliegen: ipp://HOSTNAME/" +"printers/PRINTERNAME" + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Der Subkriptionsname darf keine Leerzeichen, Schrägstriche (/), Fragezeichen " +"(?) oder Rautezeichen (#) enthalten." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Es liegen zu viele Subskriptionen vor." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Thermal Transfer Media" + +msgid "Title: " +msgstr "Titel: " + +msgid "Too many active jobs." +msgstr "Zu viele aktive Druckaufträge." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparenz" + +msgid "Tray" +msgstr "Fach" + +msgid "Tray 1" +msgstr "Fach 1" + +msgid "Tray 2" +msgstr "Fach 2" + +msgid "Tray 3" +msgstr "Fach 3" + +msgid "Tray 4" +msgstr "Fach 4" + +msgid "URI Too Long" +msgstr "URI zu lang" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Lang" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Brief" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB Serieller Anschluss Nr. %d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Kein Zugriff auf Datei „cupsd.conf“:" + +msgid "Unable to add RSS subscription:" +msgstr "RSS-Abo konnte nicht hinzugefügt werden:" + +msgid "Unable to add class:" +msgstr "Klasse konnte nicht hinzugefügt werden:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Drucker konnte nicht hinzugefügt werden:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "RSS-Abo konnte nicht widerrufen werden:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Attribut „printer-is-shared“ konnte nicht geändert werden:" + +msgid "Unable to change printer:" +msgstr "Drucker konnte nicht geändert werden:" + +msgid "Unable to change server settings:" +msgstr "Servereinstellungen konnten nicht geändert werden:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Verbindungsaufbau zum Host fehlgeschlagen." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Temporäre Datei konnte nicht erstellt werden:" + +msgid "Unable to delete class:" +msgstr "Klasse konnte nicht gelöscht werden:" + +msgid "Unable to delete printer:" +msgstr "Drucker konnte nicht gelöscht werden:" + +msgid "Unable to do maintenance command:" +msgstr "Wartungsbefehl konnte nicht ausgeführt werden:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Klassenliste konnte nicht abgerufen werden:" + +msgid "Unable to get class status:" +msgstr "Klassenstatus konnte nicht abgerufen werden:" + +msgid "Unable to get list of printer drivers:" +msgstr "Liste der Druckertreiber konnte nicht abgerufen werden:" + +msgid "Unable to get printer attributes:" +msgstr "Druckerattribute konnten nicht abgerufen werden:" + +msgid "Unable to get printer list:" +msgstr "Druckerliste konnte nicht abgerufen werden:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Druckerstatus konnte nicht abgerufen werden:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Klasse konnte nicht verändert werden:" + +msgid "Unable to modify printer:" +msgstr "Drucker konnte nicht verändert werden:" + +msgid "Unable to move job" +msgstr "Druckauftrag konnte nicht bewegt werden" + +msgid "Unable to move jobs" +msgstr "Druckaufträge konnten nicht bewegt werden" + +msgid "Unable to open PPD file" +msgstr "Die PPD-Datei konnte nicht geöffnet werden" + +msgid "Unable to open PPD file:" +msgstr "Die PPD-Datei konnte nicht geöffnet werden:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Die Datei „cupsd.conf“ konnte nicht geöffnet werden:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Testseite konnte nicht gedruckt werden:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Optionen konnten nicht festgelegt werden:" + +msgid "Unable to set server default:" +msgstr "Standardeinstellungen für Server konnten nicht festgelegt werden:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Die Datei „cupsd.conf“ konnte nicht hochgeladen werden:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Nicht berechtigt" + +msgid "Units" +msgstr "Einheiten" + +msgid "Unknown" +msgstr "Unbekannt" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Unbekannte printer-error-policy „%s“." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Unbekannte printer-op-policy „%s“." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Wertetyp nicht unterstützt" + +msgid "Upgrade Required" +msgstr "Aktualisierung erforderlich" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Wert hat unbestimmte Länge" + +msgid "VarBind uses indefinite length" +msgstr "VarBind hat unbestimmte Länge" + +msgid "Version uses indefinite length" +msgstr "Version hat unbestimmte Länge" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ja" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Auf diese Seite greifen Sie zu über die URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL Etikettendrucker" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "abgebrochen" + +msgid "canceled" +msgstr "abgebrochen" + +msgid "completed" +msgstr "abgeschlossen" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "„cups-deviced“ konnte nicht ausgeführt werden." + +msgid "cups-driverd failed to execute." +msgstr "„cups-driverd“ konnte nicht ausgeführt werden." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "Fehlerindex hat unbestimmte Länge" + +msgid "error-status uses indefinite length" +msgstr "Fehlerstatus hat unbestimmte Länge" + +msgid "held" +msgstr "gehalten" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inaktiv" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "ausstehend" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "Bearbeiten" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "Anfrage-ID hat unbestimmte Länge" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "Status von %s fehlgeschlagen: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "Gestoppt" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "Unbekannt" + +msgid "untitled" +msgstr "Ohne Titel" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings hat unbestimmte Länge" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(alles)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(ohne)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d Einträge\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tNach Fehler: fortsetzen\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tWarnhinweise:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner erforderlich\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tZeichensätze:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tVerbindung: direkt\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tVerbindung: enfernt\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tStandardseitengröße:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tStandardzeilenhöhe:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tStandard-Anschlusseinstellungen:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tBeschreibung: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormular aktiviert:\n" +#~ "\tInhaltstypen: beliebig\n" +#~ "\tDruckertypen: unbekannt\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tZugelassene Formulare:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tSchnittstelle: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tSchnittstelle: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tSchnittstelle: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tStandort: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tBei Fehler: kein Warnhinweis\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tZugelassene Benutzer:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tGesperrte Benutzer:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tDaemon vorhanden\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tkeine Einträge\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tDrucker ist auf Geschwindigkeit des Geräts „%s“ -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tDrucken ist deaktiviert\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tDrucken ist aktiviert\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tWarteliste für %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tWarteliste ist deaktiviert\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tWarteliste ist aktiviert\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tGrund unbekannt\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " AUSFÜHRLICHE KONFORMITÄTSTESTERGEBNISSE\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Seite 15, Abschnitt 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Seite 15, Abschnitt 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Seite 19, Abschnitt 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Seite 20, Abschnitt 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Seite 27, Abschnitt 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Seite 42, Abschnitt 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Seite 16–17, Abschnitt 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Seite 42–45, Abschnitt 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Seite 45–46, Abschnitt 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Seite 48–49, Abschnitt 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Seite 52–54, Abschnitt 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f Byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN Konflikt zwischen „%s %s“ und „%s %s“\n" +#~ " (constraint=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s hat keine passenden Optionen!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s hat eine gemeinsames übliches Präfix mit %s\n" +#~ " REF: Seite 15, Abschnitt 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Konflikt bei Standardauswahl!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Duplex-Option-Keyword „%s“ funktioniert u. U. nicht wie " +#~ "erwartet – es sollte „Duplex“ heißen!\n" +#~ " REF: Seite 122, Abschnitt 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Datei enthält Mischung aus den Zeilenenden „CR“, „LF“ und " +#~ "„CR LF“!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding benötigt von PPD 4.3 Spezifikation.\n" +#~ " REF: Seite 56–57, Abschnitt 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Zeile %d enthält nur Leerzeichen!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Manufacturer benötigt von PPD 4.3 Spezifikation.\n" +#~ " REF: Seite 58–59, Abschnitt 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN APDialogExtension-Datei „%s“ fehlt\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN APPrinterIconPath-Datei „%s“ fehlt\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN Windows-fremde PPD-Datei sollte nur Zeilenenden mit „LF“ " +#~ "verwenden, nicht mit „CR LF“!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Veraltete PPD-Version %.1f!\n" +#~ " REF: Seite 42, Abschnitt 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName ist länger als 8.3 und verstößt gegen die PPD-" +#~ "Spezifikation.\n" +#~ " REF: Seite 61–62, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokolle enthalten PJL, aber JCL-Attribute sind nicht " +#~ "festgelegt.\n" +#~ " REF: Seite 78–79, Abschnitt 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokolle enthalten PJL sowie BCP; es wurde aber TBCP " +#~ "erwartet.\n" +#~ " REF: Seite 78–79, section 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName benötigt von PPD 4.3 Spezifikation.\n" +#~ " REF: Seite 64–65, Abschnitt 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s existiert nicht!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Ungültig: %s Auswahl %s!\n" +#~ " REF: Seite 122, Abschnitt 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Ungültiger UTF-8 „%s“ Übersetzungsstring für Option „%s“!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ungültiger UTF-8 „%s“ Übersetzungsstring für Option „%s“, " +#~ "Auswahl „%s“!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Ungültiger cupsFilter-Wert „%s“!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Ungültiges cupsICCProfile „%s“!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Ungültiger cupsPreFilter-Wert „%s“!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Ungültiges cupsUIConstraints „%s“: „%s“!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Ungültige Sprache „%s“!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Leeres cupsUIConstraints „%s“!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Fehlender „%s“-Übersetzungsstring für Option „%s“!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Fehlender „%s“-Übersetzungsstring für Option „%s“, Auswahl „%" +#~ "s“!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Fehlende Auswahl „*%s %s“ in UIConstraints „*%s %s *%s %s“!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Fehlende Auswahl „*%s %s“ in cupsUIConstraints „%s“: „%s“!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Fehlende cupsFilter-Datei „%s“\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Fehlende cupsICCProfile-Datei „%s“!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Fehlende cupsPreFilter-Datei „%s“\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Fehlender cupsUIResolver „%s“!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Fehlende Option „%s“ in UIConstraints „*%s %s *%s %s“!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Fehlende Option „%s“ in cupsUIConstraints „%s“: „%s“!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Keine Basisübersetzung „%s“ in der Datei enthalten!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s BENÖTIGT: „%s“ definiert Auswahl nicht als „None“!\n" +#~ " REF: Seite 122, Abschnitt 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s Hash-Wert von cupsICCProfile „%s“ in Konflikt mit „%s“!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver „%s“ erzeugt eine Schleife!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEHLER** %s-Auswahlnamen „%s“ und „%s“ unterscheiden sich nur " +#~ "durch Groß-/Kleinschreibung!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FEHLER** „%s“ muss 1284DeviceID sein!\n" +#~ " REF: Seite 72, Abschnitt 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: Default%s „%s“\n" +#~ " REF: Seite 40, Abschnitt 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: DefaultImageableArea „%s“!\n" +#~ " REF: Seite 102, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: DefaultPaperDimension „%s“!\n" +#~ " REF: Seite 103, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: JobPatchFile-Attribut in Datei\n" +#~ " REF: Seite 24, Abschnitt 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: Manufacturer (sollte „HP“ sein)\n" +#~ " REF: Seite 211, Tabelle D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: Manufacturer (sollte „Oki“ sein)\n" +#~ " REF: Seite 211, Tabelle D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: ModelName – „%c“ nicht zulässig im String.\n" +#~ " REF: Seite 59–60, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: PSVersion – nicht „(string) int“.\n" +#~ " REF: Seite 62–64, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: Product – nicht „(string)“.\n" +#~ " REF: Seite 62, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** UNGÜLTIG: ShortNickName – länger als 31 Zeichen.\n" +#~ " REF: Seite 64–65, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FEHLER** Ungültig: „%s“ Auswahl „%s“!\n" +#~ " REF: Seite 84, Abschnitt 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** Ungültige FileVersion „%s“\n" +#~ " REF: Seite 56, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** Ungültige FormatVersion „%s“\n" +#~ " REF: Seite 56, Abschnitt 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FEHLER** Ungültiges LanguageEncoding „%s“ – muss „ISOLatin1“ " +#~ "sein!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **FEHLER** Ungültige LanguageVersion „%s“ – muss „Englisch“ sein!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FEHLER** Standardoptionscode kann nicht interpretiert werden: %" +#~ "s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FEHLER** Standard-Übersetzungsstring für Option „%s“ Auswahl „%" +#~ "s“ enthält 8-Bit-Zeichen!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FEHLER** Standard-Übersetzungsstring für Option „%s“ enthält 8-" +#~ "Bit-Zeichen!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEHLER** Gruppennamen „%s“ und „%s“ unterscheiden sich nur durch " +#~ "Groß-/Kleinschreibung!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FEHLER** Mehrere Vorkommen des „%s“-Auswahlnamens „%s“!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEHLER** Optionnamen „%s“ und „%s“ unterscheiden sich nur durch " +#~ "Groß-/Kleinschreibung!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: Default%s\n" +#~ " REF: Seite 40, Abschnitt 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: DefaultImageableArea\n" +#~ " REF: Seite 102, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: DefaultPaperDimension\n" +#~ " REF: Seite 103, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: FileVersion\n" +#~ " REF: Seite 56, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: FormatVersion\n" +#~ " REF: Seite 56, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: ImageableArea für PageSize „%s“\n" +#~ " REF: Seite 41, Abschnitt 5.\n" +#~ " REF: Seite 102, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: LanguageEncoding\n" +#~ " REF: Seite 56–57, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: LanguageVersion\n" +#~ " REF: Seite 57–58, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: Manufacturer\n" +#~ " REF: Seite 58–59, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: ModelName\n" +#~ " REF: Seite 59–60, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: NickName\n" +#~ " REF: Seite 60, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PCFileName\n" +#~ " REF: Seite 61–62, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PSVersion\n" +#~ " REF: Seite 62–64, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PageRegion\n" +#~ " REF: Seite 100, Abschnitt 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PageSize\n" +#~ " REF: Seite 41, Abschnitt 5.\n" +#~ " REF: Seite 99, Abschnitt 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PageSize\n" +#~ " REF: Seite 99–100, Abschnitt 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: PaperDimension für PageSize „%s“\n" +#~ " REF: Seite 41, Abschnitt 5.\n" +#~ " REF: Seite 103, Abschnitt 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: Product\n" +#~ " REF: Seite 62, Abschnitt 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEHLER** BENÖTIGT: ShortNickName\n" +#~ " REF: Seite 64–65, Abschnitt 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d FEHLER GEFUNDEN\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Ungültige %%%%BoundingBox: in Zeile %d!\n" +#~ " REF: Seite 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Ungültige %%%%Page: in Zeile %d!\n" +#~ " REF: Seite 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Ungültige %%%%Pages: in Zeile %d!\n" +#~ " REF: Seite 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Zeile %d ist länger als 255 Zeichen (%d)!\n" +#~ " REF: Seite 25, Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 fehlt in der ersten Zeile!\n" +#~ " REF: Seite 17, 3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments-Kommentar fehlt!\n" +#~ " REF: Seite 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox fehlt oder ist ungültig: Kommentar!\n" +#~ " REF: Seite 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page fehlt oder ist ungültig: Kommentare!\n" +#~ " REF: Seite 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages fehlt oder ist ungültig: Kommentar!\n" +#~ " REF: Seite 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " KEINE FEHLER GEFUNDEN\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " %d Zeilen mit über 255 Zeichen gefunden!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Zu viele %%BeginDocument-Kommentare!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Zu viele %%EndDocument-Kommentare!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Achtung: Datei enthält Binärdaten!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Achtung: kein %%EndComments-Kommentar in der Datei!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Achtung: veraltete DSC-Version %.1f in der Datei!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FEHLER\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FEHLER\n" +#~ " **FEHLER** PPD-Datei konnte nicht geöffnet werden – %s.\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FEHLER\n" +#~ " **FEHLER** PPD-Datei konnte nicht geöffnet werden – %s in Zeile %" +#~ "d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "US #10 Umschlag" + +#~ msgid "#11 Envelope" +#~ msgstr "US #11 Umschlag" + +#~ msgid "#12 Envelope" +#~ msgstr "US #12 Umschlag" + +#~ msgid "#14 Envelope" +#~ msgstr "US #14 Umschlag" + +#~ msgid "#9 Envelope" +#~ msgstr "US #9 Umschlag" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f Byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f Byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s akzeptiert Anfragen seit %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s ist nicht implementiert in der CUPS-Version von lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s ist nicht bereit\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s ist bereit\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s ist bereit und druckt\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s akzeptiert keine Anfragen seit %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s nicht unterstützt!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s akzeptiert Anfragen seit %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s akzeptiert keine Anfragen seit %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [Druckauftrag %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s fehlgeschlagen: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Weiß nicht, was ich tun soll!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Fehler – %s Umgebungsvariablennamen nicht vorhanden für Ziel „%s“!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Fehler – ungültige Druckauftrags-ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Fehler – kann nicht gleichzeitig Dateien drucken und Druckaufträge " +#~ "ändern!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Fehler – kann nicht von „stdin“, wenn Dateien oder eine Druckauftrags-" +#~ "ID übergeben werden!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Fehler – Zeichensatz erwartet nach '-S'-Option!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Fehler – Inhaltstyp erwartet nach '-T'-Option!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Fehler – Kopien erwartet nach '-n'-Option!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Fehler – Kopienanzahl erwartet nach '-#'-Option!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Fehler – Ziel erwartet nach '-P'-Option!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Fehler – Ziel erwartet nach '-b'-Option!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Fehler – Ziel erwartet nach '-d'-Option!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Fehler – Form erwartet nach '-f'-Option!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Fehler – Name halten erwartet nach '-H'-Option!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Fehler – Hostname erwartet nach '-H'-Option!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Fehler – Hostname erwartet nach '-h'-Option!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Fehler – Modusliste erwartet nach '-y'-Option!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Fehler – Name erwartet nach '-%c'-Option!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Fehler – Optionsstring erwartet nach '-o'-Option!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Fehler – Seitenliste erwartet nach '-P'-Option!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Fehler – Priorität erwartet nach '-%c'-Option!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Fehler – Text mit Grund erwartet nach '-r'-Option!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Fehler – Titel erwartet nach '-t'-Option!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Fehler – Benutzername erwartet nach '-U'-Option!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Fehler – Benutzername erwartet nach '-u'-Option!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Fehler – Wert erwartet nach '-%c'-Option!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Fehler – benötigt „completed“, „not-completed“ oder „all“ nach '-W'-" +#~ "Option!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Fehler – kein Standardziel verfügbar.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Fehler – Priorität muss zwischen 1 und 100 sein.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Fehler – Scheduler reagiert nicht!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Fehler – zu viele Dateien – „%s“\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Fehler – kein Zugriff auf „%s“ – %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Fehler – keine Warteliste für „stdin“ – %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Fehler – unbekanntes Ziel „%s“!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Fehler – unbekanntes Ziel „%s/%s“!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Fehler – unbekannte Option '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Fehler – unbekannte Option '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Druckauftrags-ID erwartet nach '-i'-Option!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filter „%s“ nicht verfügbar: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Ungültiger Zielname in Liste „%s“!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Ungültiger Filterstring „%s“\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Druckauftrags-ID ('-i jobid') benötigt vor '-H restart'!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Kein Filter für Konvertierung von %s/%s zu %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Aktion fehlgeschlagen: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Verschlüsselungsunterstützung nicht verfügbar!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Verbindung mit Server fehlgeschlagen\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Verbindungsaufbau zum Server fehlgeschlagen!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: MIME-Typ von „%s“ konnte nicht bestimmt werden!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: „%s“ konnte nicht geöffnet werden – %s in Zeile %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: PPD-Datei konnte nicht geöffnet werden – %s in Zeile %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "" +#~ "%s: MIME-Datenbank von „%s“ oder „%s“ konnte nicht gelesen werden!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Unbekanntes Ziel „%s“!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Unbekannter Ziel-MIME-Typ „%s/%s“!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Unbekannte Option '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Unbekannter Quell-MIME-Typ „%s/%s“!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Achtung – '%c'-Format-Modifier nicht unterstützt – Ausgabe ist u. U. " +#~ "nicht korrekt!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Achtung – Zeichensatzoption ignoriert!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Achtung – Inhaltstypoption ignoriert!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Achtung – Formoption ignoriert!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Achtung – Modusoption ignoriert!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Fehler – %s Umgebungsvariablennamen nicht vorhanden für Ziel „%s“!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: Fehler – „option=value“ erwartet nach '-o'-Option!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: Fehler – kein Standardziel verfügbar.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11 Zoll" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13 Zoll" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14 Zoll" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11 Zoll" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11 Zoll" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI Graustufen" + +#~ msgid "60x720dpi" +#~ msgstr "60x720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9 Zoll" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10 Zoll" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11 Zoll" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12 Zoll" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Ungültiger Hilfebefehl ist unbekannt\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "Es wird ein Samba-Kennwort benötigt, um Druckertreiber exportieren zu " +#~ "können!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Es wird ein Samba-Benutzername benötigt, um Druckertreiber exportieren zu " +#~ "können!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Es gibt bereits eine Klasse mit dem Namen „%s“!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Es gibt bereits einen Drucker mit dem Namen „%s“!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (Übergröße)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (Übergröße)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (klein)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (Übergröße)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "" +#~ "Versuch, den Druckerstatus für „%s“ auf den ungültigen Wert „%d“ zu " +#~ "setzen!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Attributgruppen sind durcheinander (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Ungültige Geräte-URI „%s“!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Ungültige Geräte-URI „%s“!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Ungültiges Geräte-URI-Schema „%s“!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Ungültiges Dokumentformat „%s“!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Ungültiger Dateinamen-Puffer!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Ungültiges Schriftattribut: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Ungültiger Wert für Druckauftragspriorität!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Ungültiger Wert „%s“ für Druckauftragslisten!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Ungültiger Wertetyp für Druckauftragslisten!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Ungültiger Wert für Druckauftragsstatus!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Ungültiges Druckauftrags-URI-Attribut „%s“!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Ungültige Notify-Pull-Methode „%s“!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Ungültige Notify-Recipient-URI: URI „%s“!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Ungültige Option + Auswahl in Zeile %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Ungültiger Port-Monitor „%s“!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Ungültiger Wert „%d“ für Druckerstatus!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Ungültige Anfrage-Versionsnummer %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Ungültige Subskriptions-ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "DIN C0 Umschlag" + +#~ msgid "C1 Envelope" +#~ msgstr "DIN C1 Umschlag" + +#~ msgid "C2 Envelope" +#~ msgstr "DIN C2 Umschlag" + +#~ msgid "C3 Envelope" +#~ msgstr "DIN C3 Umschlag" + +#~ msgid "C4" +#~ msgstr "DIN C4" + +#~ msgid "C4 Envelope" +#~ msgstr "DIN C4 Umschlag" + +#~ msgid "C5" +#~ msgstr "DIN C5" + +#~ msgid "C5 Envelope" +#~ msgstr "DIN C5 Umschlag" + +#~ msgid "C6" +#~ msgstr "DIN C6" + +#~ msgid "C6 Envelope" +#~ msgstr "DIN C6 Umschlag" + +#~ msgid "C65 Envelope" +#~ msgstr "DIN C65 Umschlag" + +#~ msgid "C7 Envelope" +#~ msgstr "DIN C7 Umschlag" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Zeichensatz „%s“ nicht unterstützt!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 Umschlag" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 Umschlag" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Befehle können abgekürzt werden. Befehle sind:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Typ „%s“ konnte nicht durchsucht werden!" + +#~ msgid "Cover open." +#~ msgstr "Die Abdeckung ist offen." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL Umschlag" + +#~ msgid "Developer almost empty." +#~ msgstr "Der Entwickler ist fast leer." + +#~ msgid "Developer empty!" +#~ msgstr "Der Entwickler ist leer!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Gerät: URI = %s\n" +#~ " Klasse = %s\n" +#~ " Info = %s\n" +#~ " Hersteller und Modell = %s\n" +#~ " Geräte-ID = %s\n" +#~ " Standort = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokument „%d“ nicht gefunden in Druckauftrag „%d“." + +#~ msgid "Door open." +#~ msgstr "Die Tür ist offen." + +#~ msgid "Double Postcard" +#~ msgstr "Doppelpostkarte" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Speicher für Seiteninfo konnte nicht zugewiesen werden: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "" +#~ "EMERG: Speicher für Seiten-Array konnte nicht zugewiesen werden: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Ungültige %%BoundingBox: Kommentar gesehen!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Ungültiges %%IncludeFeature: Kommentar!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Ungültige %%Page: Kommentar in Datei!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Ungültige %%PageBoundingBox: Kommentar in Datei!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Ungültige SCSI-Gerätedatei „%s“!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Ungültige Zeichensatzdatei „%s“\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Ungültiger Zeichensatztyp „%s“\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Ungültiger Spaltenwert „%d“!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Ungültiger cpi-Wert „%f“!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Ungültige Schriftbeschreibungszeile: „%s“\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Ungültiger lpi-Wert „%f“!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Ungültiges Seitenformat!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Ungültige Textrichtung „%s“\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Ungültige Textweite „%s“\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Zieldrucker existiert nicht!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Doppelte %%BoundingBox: Kommentar gesehen!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Doppelte %%Pages: Kommentar gesehen!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Leere Druckdatei!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Fehler „%d“ beim Senden der PAPSendData-Anfrage: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: String mit Anführungszeichen erwartet in Zeile %d von %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Schwerwiegender USB-Fehler!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Ungültiger HP-GL/2-Befehl aufgetreten; Datei konnte nicht gedruckt " +#~ "werden!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: Fehlender %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: Fehlendes %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Geräte-URI fehlt in der Befehlszeile und keine DEVICE_URI " +#~ "Umgebungsvariable vorhanden!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Wert fehlt in Zeile %d der Bannerdatei!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: msgid-Zeile benötigt vor allen Übersetzungsstrings in Zeile %d von " +#~ "%s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Keine %%BoundingBox: Kommentar im Header!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Keine %%Pages: Kommentar im Header!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Keine Geräte-URI gefunden in „argv[0]“ oder in DEVICE_URI " +#~ "Umgebungsvariable!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Keine Schriften in Zeichensatzdatei „%s“\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Keine Seiten gefunden!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Kein Papier mehr!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: DRUCKER: Umgebungsvariable nicht definiert!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Druckdatei wurde nicht akzeptiert (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Drucker reagiert nicht\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Drucker reagiert nicht!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Drucker sendete unerwartet EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "" +#~ "ERROR: Entfernter Host hat die Steuerungsdatei nicht akzeptiert (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Entfernter Host hat Datendatei nicht akzeptiert (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Beim Senden der Daten an den Drucker ist ein Fehler wegen " +#~ "Zeitüberschreitung aufgetreten.\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "" +#~ "ERROR: Datei „%d“ konnte nicht zu Druckauftrag hinzugefügt werden: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Druckauftrag „%d“ konnte nicht abgebrochen werden: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: PDF-Datei konnte nicht kopiert werden" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Socket konnte nicht erstellt werden" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Temporäre komprimierte Druckdatei konnte nicht erstellt werden: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Temporäre Datei konnte nicht erstellt werden" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Temporäre Datei konnte nicht erstellt werden – %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Temporäre Datei konnte nicht erstellt werden: %s.\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops konnte nicht ausgeführt werden: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: gs-Programm konnte nicht ausgeführt werden" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: pdftops-Programm konnte nicht ausgeführt werden" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Fork für pictwpstops konnte nicht ausgeführt werden: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: PAP-Anfrage konnte nicht empfangen werden" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: PAP-Antwort konnte nicht empfangen werden" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: PPD-Datei für Drucker „%s“ konnte nicht abgefragt werden – %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: AppleTalk-Standardzone konnte nicht abgefragt werden" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "" +#~ "ERROR: Attribute für Druckauftrag „%d“ konnten nicht abgefragt werden (%" +#~ "s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Druckerstatus konnte nicht abgefragt werden (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Drucker „%s“ konnte nicht gefunden werden!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Abfrage der PAP-Antwort nicht möglich" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Suche nach AppleTalk-Druckern nicht möglich" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Erstellen der AppleTalk-Adresse nicht möglich" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Bannerdatei „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Gerätedatei „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Datei „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Datei „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Bilddatei konnte nicht zum Drucken geöffnet werden!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Druckdatei „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Druckdatei „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Druckdatei „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Temporäre komprimierte Druckdatei konnte nicht geöffnet werden: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Temporäre Datei konnte nicht geöffnet werden" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: %d Textspalten konnten nicht gedruckt werden!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: %dx%d Textseite konnte nicht gedruckt werden!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Druckdaten konnten nicht gelesen werden" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Druckdaten konnten nicht gelesen werden!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Anschluss konnte nicht reserviert werden" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "" +#~ "ERROR: Nach dem Versatz „%ld“ in der Datei konnte nicht gesucht werden – %" +#~ "s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "" +#~ "ERROR: Nach dem Versatz „%lld“ in der Datei konnte nicht gesucht werden – " +#~ "%s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: LPD-Befehl konnte nicht gesendet werden" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: PAP-Rückkopplungsanfrage konnte nicht gesendet werden" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "" +#~ "ERROR: Erste PAP-Anfrage zum Senden von Daten konnte nicht gesendet werden" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Druckdaten konnten nicht gesendet werden (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Druckdaten konnten nicht gesendet werden!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Druckdatei konnte nicht an den Drucker gesendet werden" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "" +#~ "ERROR: Nachfolgende Nullen konnten nicht an den Drucker gesendet werden" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Warten auf pictwpstops nicht möglich: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: %d Byte konnten nicht auf „%s“ geschrieben werden: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: %d Byte konnten nicht auf den Drucker geschrieben werden!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Steuerungsdatei konnte nicht geschrieben werden" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Druckdaten konnten nicht geschrieben werden" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Druckdaten konnten nicht geschrieben werden: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "" +#~ "ERROR: Rasterdaten konnten nicht auf den Treiber geschrieben werden!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Temporäre Datei konnte nicht geschrieben werden" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "" +#~ "ERROR: Unkomprimierte Dokumentdaten konnten nicht geschrieben werden: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Unerwarteter Text in Zeile %d von %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Unbekannter Verschlüsselungsoptionswert „%s“!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Unbekannte Dateianordnung „%s“\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Unbekanntes Formatzeichen „%c“\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Unbekanntes Message-Catalog-Format für „%s“!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Unbekannte Option „%s“ mit Wert „%s“!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Unbekannter Druckmodus „%s“\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Unbekannter Versionsoptionswert „%s“!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Nicht unterstützter Helligkeitswert „%s“; „brightness=100“ " +#~ "verwenden!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "" +#~ "ERROR: Nicht unterstützter Gammawert „%s“; „gamma=1000“ verwenden!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: Nicht unterstützter Number-Up-Wert „%d“; „number-up=1“ verwenden!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Nicht unterstützter Number-Up-Layout-Wert „%s“; „number-up-" +#~ "layout=lrtb“ verwenden!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Nicht unterstützter Seitenrandwert „%s“; „page-border=none“ " +#~ "verwenden!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: doc_printf-Overflow (%d Byte) festgestellt; abbrechen!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-Filter fehlgeschlagen bei Signal „%d“!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-Filter ausgestiegen mit Status „%d“!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops-Filter ausgestiegen bei Signal „%d“!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops-Filter ausgestiegen mit Status „%d“!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: wiederherstellbar: Verbindung zum Drucker nicht möglich, erneuter " +#~ "Versuch in 30 Sekunden …\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: Auswahl() fehlgeschlagen" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: „stat“ für Druckdatei nicht möglich" + +#~ msgid "Empty PPD file!" +#~ msgstr "Leere PPD-Datei!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Fehler: Hostname benötigt nach '-h'-Option!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FEHLER\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Dateigeräte-URIs wurden deaktiviert! Infos zum Aktivieren finden Sie im " +#~ "FileDevice-Verzeichnis unter „%s/cupsd.conf“." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Die Temperatur des Fixierers ist zu hoch!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Die Temperatur des Fixierers ist zu niedrig!" + +#~ msgid "German FanFold" +#~ msgstr "Deutsch Endlospapier" + +#~ msgid "German FanFold Legal" +#~ msgstr "Deutsch Endlospapier (Brief)" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Drucker-URI-Attribute vorhanden, aber keine Druckauftrags-ID!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk wurde in den Systemeinstellungen deaktiviert.\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk wurde in den Systemeinstellungen deaktiviert.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Druckauftrag abbrechen …\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Mit Drucker verbunden …\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Mit Drucker verbinden …\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Steuerungsdatei erfolgreich übertragen\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Datendatei erfolgreich übertragen\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Seite %d formatieren …\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Bilddatei laden …\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Drucker suchen …\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Verbindung herstellen\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: Druckdatei gesendet, warten auf Abschließen des Druckers …\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Drucker ist ausgelastet, erneuter Versuch in 10 Sekunden …\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Drucker ist ausgelastet, erneuter Versuch in 30 Sekunden …\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Drucker ist ausgelastet, erneuter Versuch in 5 Sekunden …\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: Drucker unterstützt IPP/%d.%d nicht, erneuter Versuch mit IPP/1.0 " +#~ "…\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Drucker ausgelastet, erneuter Versuch in 5 Sekunden …\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Drucker ist derzeit offline.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Drucker ist derzeit offline.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Drucker ist jetzt online.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Drucker ist offline.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: Drucker nicht verbunden, erneuter Versuch in 30 Sekunden …\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Seite %d drucken, %d %% abgeschlossen …\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Seite %d drucken …\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Bereit zum Drucken\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Steuerungsdatei senden (%lu Byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Steuerungsdatei senden (%u Byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Daten senden\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Datendatei senden (%ld Byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Datendatei senden (%lld Byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Druckdaten senden …\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Druckdatei gesendet, %ld Byte …\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Druckdatei gesendet, %lld Byte …\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: LPR-Druckauftrag aufzeichnen, %.0f %% abgeschlossen …\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Verbindung zum Drucker nicht möglich; an den nächsten Drucker der " +#~ "Klasse senden …\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Standard-AppleTalk-Zone „%s“ verwenden\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Warten, bis der Druckauftrag agbeschlossen ist …\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Warten, bis der Drucker verfügbar ist …\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 Umschlag" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (Übergröße)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 Umschlag" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 Umschlag" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tinte/Toner fast leer." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tinte/Toner leer!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Tinten/Toner-Abfallbehälter fast voll." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Tinten/Toner-Abfallbehälter voll!" + +#~ msgid "Interlock open." +#~ msgstr "Die Verriegelung ist offen." + +#~ msgid "Invite Envelope" +#~ msgstr "Einladung Umschlag" + +#~ msgid "Italian Envelope" +#~ msgstr "Italienisch Umschlag" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "" +#~ "Druckauftrag Nr. %d kann nicht neu gestartet werden – keine Dateien " +#~ "vorhanden!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Druckauftrag Nr. %d existiert nicht!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "" +#~ "Druckauftrag Nr. %d ist abgeschlossen und kann nicht geändert werden!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Druckauftrag Nr. %d ist nicht abgeschlossen!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Druckauftrag Nr. %d benötigt keine Authentifizierung!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Druckauftrag Nr. %d wird nicht gehalten!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Druckauftrag Nr. %s existiert nicht!" + +#~ msgid "Job %d not found!" +#~ msgstr "Druckauftrag %d wurde nicht gefunden!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Druckauftrags-Subskription kann nicht erneuert werden." + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 Umschlag" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 Umschlag" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Sprache „%s“ nicht unterstützt!" + +#~ msgid "Media jam!" +#~ msgstr "Papierstau im Medienfach!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Das Medienfach ist fast leer." + +#~ msgid "Media tray empty!" +#~ msgstr "Das Medienfach ist leer!" + +#~ msgid "Media tray missing!" +#~ msgstr "Das Medienfach fehlt!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Das Medienfach muss aufgefüllt werden." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Attribut „document-number“ fehlt!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Doppeltes Anführungszeichen in Zeile %d fehlt!" + +#~ msgid "Missing form variable!" +#~ msgstr "Formvariable fehlt!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Attribut „notify-subscription-ids“ fehlt!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Attribut „requesting-user-name“ fehlt!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Benötigte Attribute fehlen!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Wert in Zeile %d fehlt!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modell: Name = %s\n" +#~ " Standardsprache = %s\n" +#~ " Hersteller und Modell = %s\n" +#~ " Geräte-ID = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "US Monarch Umschlag" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Druckdatei akzeptiert – Druckauftrags-ID %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Druckdatei akzeptiert – Druckauftrags-ID unbekannt.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Kein PPD-Name!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Es sind keine Windows-Druckertreiber installiert!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Keine aktiven Druckaufträge auf %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Keine Attribute abgerufen!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Keine Authentifizierungs-Informationen übergeben!" + +#~ msgid "No default printer" +#~ msgstr "Kein Standarddrucker" + +#~ msgid "No file!?!" +#~ msgstr "Keine Datei!?!" + +#~ msgid "No modification time!" +#~ msgstr "Kein Änderungsdatum!" + +#~ msgid "No printer name!" +#~ msgstr "Kein Druckername!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Keine Drucker-URI gefunden für Klasse!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Keine Drucker-URI gefunden!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Keine Drucker-URI abgerufen!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Keine Subskriptionsattribute abgerufen!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "Die Bildtrommel (OPC) muss bald ausgetauscht werden." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "Die Bildtrommel (OPC) muss ausgetauscht werden!" + +#~ msgid "Out of toner!" +#~ msgstr "Der Toner ist leer!" + +#~ msgid "Output bin almost full." +#~ msgstr "Das Ausgabefach ist fast voll." + +#~ msgid "Output bin full!" +#~ msgstr "Das Ausgabefach ist voll!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Ausgabe für Drucker „%s“ wird an „%s“ gesendet\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Ausgabe für Drucker „%s“ wird an den entfernten Drucker „%s“ auf „%s“ " +#~ "gesendet\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Ausgabe für Drucker „%s/%s“ wird an „%s“ gesendet\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Ausgabe für Drucker „%s/%s“ wird an den entfernten Drucker „%s“ auf „%s“ " +#~ "gesendet\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Das Ausgabefach fehlt!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 Umschlag" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 Umschlag" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 Umschlag" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 Umschlag" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (Übergröße)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 Umschlag" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 Umschlag" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 Umschlag" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 Umschlag" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 Umschlag" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 Umschlag" + +#~ msgid "Personal Envelope" +#~ msgstr "Persönlicher Umschlag" + +#~ msgid "Printer offline." +#~ msgstr "Der Drucker ist offline." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Rang Eigentümer Druckauftrag Datei(en) " +#~ "Gesamtgröße\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Rang Eigentümer Druckauftrag Dateien " +#~ "Gesamtgröße\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Befehl ausführen: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI-Drucker" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "US Tabloid (Übergröße)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Der Wert für „notify-user-data“ ist zu groß (%d > 63 Oktetts)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Der Drucker oder die Klasse sind nicht freigegeben!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Der Drucker oder die Klasse wurden nicht gefunden!" + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Das Drucker-URI-Attribut wird benötigt!" + +#~ msgid "Toner low." +#~ msgstr "Wenig Toner." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Zu viele job-sheets-Werte (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Zu viele printer-state-reasons-Werte (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Endlospapier" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Lang (Übergröße)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Brief (Übergröße)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Brief (klein)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Druckauftrag für das Ziel „%s“ konnte nicht hinzugefügt werden!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Der Speicher für die Dateitypen konnte nicht zugeordnet werden." + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "64-Bit CUPS-Druckertreiberdateien konnten nicht kopiert werden (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "64-Bit Windows-Druckertreiberdateien konnten nicht kopiert werden (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "CUPS-Druckertreiberdateien konnten nicht kopiert werden (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "PPD-Datei konnte nicht kopiert werden – %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "PPD-Datei konnte nicht kopiert werden!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Windows 2000 Druckertreiberdateien konnten nicht kopiert werden (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Windows 9x Druckertreiberdateien konnten nicht kopiert werden (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Schnittstellenskript konnte nicht kopiert werden – %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Drucker-URI konnte nicht erstellt werden!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "" +#~ "„cupsd.conf“-Dateien größer als 1 MB können nicht bearbeitet werden!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Ziel für den Druckauftrag konnte nicht gefunden werden!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Drucker konnte nicht gefunden werden!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Windows 2000 Druckertreiberdateien konnten nicht installiert werden (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Windows 9x Druckertreiberdateien konnten nicht installiert werden (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "" +#~ "Das Dokument „%d“ in Druckauftrag „%d“ konnte nicht geöffnet werden!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "„%s“ konnte nicht ausgeführt werden: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Befehl konnte nicht an den Druckertreiber gesendet werden!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Windows-Druckertreiber konnte nicht festgelegt werden (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Alte USB-Klasse-Treiber konnten nicht verwendet werden!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Unbekannter Druckerfehler (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Zeichensatz „%s“ nicht unterstützt!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Komprimierung „%s“ nicht unterstützt!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Komprimierungsattribut „%s“ nicht unterstützt!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Format „%s“ nicht unterstützt!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Format „%s“ nicht unterstützt!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Format „%s/%s“ nicht unterstützt!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Usage: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Usage: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Usage: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Usage: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Usage: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Usage: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Nur die ersten %d gefundenen Drucker werden hinzugefügt" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boolscher Wert erwartet für waiteof-Option „%s“\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Lesen der Side-Channel-Anfrage fehlgeschlagen!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Option „%s“ kann nicht mithilfe von „IncludeFeature“ " +#~ "eingeschlossen werden!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Drucker reagiert nicht\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Drucker sendete unerwartet EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Entfernter Host hat nicht mit dem Befehlstatusbyte geantwortet " +#~ "nach %d Sekunden!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Entfernter Host hat nicht mit dem Steuerungsstatusbyte " +#~ "geantwortet nach %d Sekunden!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Entfernter Host hat nicht mit dem Datenstatusbyte geantwortet " +#~ "nach %d Sekunden!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: Zeitüberschreitung bei SCSI-Befehl (%d); erneut versuchen …\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Dieses Dokument entspricht nicht den Dokumentstruktur-" +#~ "Konventionen von Adobe und wird u. U. nicht korrekt gedruckt!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: „%s:%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: PAP-Statusanfrage konnte nicht gesendet werden" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Unerwartetes PAP-Paket des Typs „%d“\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Unbekanntes PAP-Paket des Typs „%d“\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Unbekannte Auswahl „%s“ für Option „%s“!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Unbekannte Option „%s“!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Baud-Rate „%s“ wird nicht unterstützt!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: Zahlwert erwartet für Statusoption „%s“\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: wiederherstellbar: Netzwerkhost „%s“ ist ausgelastet; erneuter " +#~ "Versuch in %d Sekunden …\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Achtung: Es sind keine Windows 2000 Druckertreiber installiert!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 Umschlag" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "konvertieren: Mit der -f Option eine Datei zum Konvertieren festlegen.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: keine PPD-Datei für Drucker „%s“ – %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Verbindungsaufbau zum Server fehlgeschlagen: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: unbekannte Option „%s“!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: unbekannte Option „-%c“!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: „config filename“ erwartet nach '-c'-Option!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Aktueller Ordner konnte nicht gefunden werden!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: unbekanntes Argument „%s“ – abbrechen!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: unbekannte Option „%c“ – abbrechen!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: „launchd(8) support“ nicht übersetzt, in „normal mode“ ausführen.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: ungültige Dokumentnummer %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: ungültige Druckauftrags-ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Nur ein Dateiname kann angegeben werden!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Temporäre Datei konnte nicht erstellt werden: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Druckauftragsdatei konnte nicht geladen werden – %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "" +#~ "cupstestppd: '-q'-Option ist nicht kompatibel mit der '-v'-Option.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "" +#~ "cupstestppd: '-v'-Option ist nicht kompatibel mit der '-q'-Option.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "Gerät für %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "Gerät für %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tget help on commands\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-URI-Attribut fehlt!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Klassenname kann nur druckbare Zeichen enthalten!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: PPD erwartet nach '-P'-Option!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: „allow/deny:userlist“ erwartet nach '-u'-Option!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Klasse erwartet nach '-r'-Option!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Klassenname erwartet nach '-c'-Option!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Beschreibung erwartet nach '-D'-Option!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Geräte-URI erwartet nach '-v'-Option!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Dateityp(en) erwartet nach '-I'-Option!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Hostname erwartet nach '-h'-Option!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Schnittstelle erwartet nach '-i'-Option!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Standort erwartet nach '-L'-Option!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Modell erwartet nach '-m'-Option!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: name=value erwartet nach '-o'-Option!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Drucker erwartet nach '-p'-Option!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Druckername erwartet nach '-d'-Option!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Drucker oder Klasse erwartet nach '-x'-Option!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Keine zugehörigen Namen gefunden!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Drucker „%s“ gehört bereits zur Klasse „%s“.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Drucker „%s“ gehört bereits zur Klasse „%s“.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Druckername kann nur druckbare Zeichen enthalten!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Drucker konnte nicht zu der Klasse hinzugefügt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Verbindungsaufbau zum Server fehlgeschlagen: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Temporäre Datei konnte nicht erstellt werden – %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Temporäre Datei konnte nicht erstellt werden: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: PPD-Datei „%s“ konnte nicht geöffnet werden – %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Datei „%s“ konnte nicht geöffnet werden: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Drucker konnte nicht aus der Klasse entfernt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Die PPD-Datei konnte nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Die Geräte-URI konnte nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Das Schnittstellenskript oder die PPD-Datei konnten nicht " +#~ "festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Das Schnittstellenskript konnte nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Die Druckerbeschreibung konnte nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Der Druckerstandort konnte nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Die Druckeroptionen konnten nicht festgelegt werden:\n" +#~ " Legen Sie zuerst einen Druckernamen fest!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: unbekannte allow/deny-Option „%s“!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: unbekanntes Argument „%s“!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: unbekannte Option '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Achtung – Inhaltstypliste ignoriert!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: 1284 Geräte-ID String erwartet nach „--device-id“!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Sprache erwartet nach „--language“!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Hersteller und Modell erwartet nach „--make-and-model“!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Produktstring erwartet nach „--product“!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Schemaliste erwartet nach „--exclude-schemes“!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Schemaliste erwartet nach „--include-schemes“!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Zeitüberschreitung erwartet nach „--timeout“!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: unbekanntes Argument „%s“!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: unbekannte Option '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: unbekannte Option '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Verbindungsaufbau zum Server fehlgeschlagen: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: unbekanntes Argument „%s“!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: unbekannte Option '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Keine Drucker!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "" +#~ "lpoptions: Drucker oder Instanz konnten nicht hinzugefügt werden: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: PPD-Datei für „%s“ konnte nicht geladen werden: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: PPD-Datei für „%s“ konnte nicht geöffnet werden!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Drucker oder Klasse unbekannt!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Nur „root“ kann Kennwörter hinzufügen und löschen!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Kennwortdatei wird gerade verwendet!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Kennwortdatei ist nicht aktualisiert!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Kennwörter stimmen nicht überein!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Kennwort abgelehnt.\n" +#~ "Das Kennwort muss mindestens 6 Zeichen lang sein, darf nicht Ihren " +#~ "Benutzernamen enthalten und muss mindestens einen Buchstaben und eine " +#~ "Zahl enthalten.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Kennwörter stimmen nicht überein!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Kennwortstring konnte nicht kopiert werden: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Kennwortdatei konnte nicht geöffnet werden: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "" +#~ "lppasswd: In die Kennwortdatei konnte nicht geschrieben werden: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: Sichern der alten Kennwortdatei fehlgeschlagen: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: Kennwortdatei konnte nicht umbenannt werden: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: Benutzer „%s“ und Gruppe „%s“ existieren nicht.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: Fehler – %s Umgebungsvariablennamen nicht vorhanden für Ziel „%" +#~ "s“!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "gehört zu Klasse „%s“:\n" + +#~ msgid "no entries\n" +#~ msgstr "keine Einträge\n" + +#~ msgid "no system default destination\n" +#~ msgstr "kein System-Standardzielort\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "„notify-events“ nicht festgelegt!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI „%s“ wird bereits verwendet!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI „%s“ verwendet unbekanntes Schema!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id „%d“ ist ungültig!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Ordner „%s“ hinzufügen …\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: UI-Text von „%s“ hinzufügen/aktualisieren …\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Ungültiger Boolscher Wert (%s) in Zeile %d von %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiger aufzulösender Name „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiges Status-Keyword „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Ungültige Variablenersetzung ($%c) in Zeile %d von %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Auswahl in Zeile %d von %s gefunden ohne Option!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Duplikat #po für Locale „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Filterdefinition erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Programmname erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Boolschen Wert erwartet in Zeile %d von %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Zeichensatz nach Schrift erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Auswahlcode erwartet in Zeile %d von %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Auswahlname/-text erwartet in Zeile %d von %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Farbreihenfolge für ColorModel erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Farbraum für ColorModel erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Komprimierung für ColorModel erwartet in Zeile %d von %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Constraints String für UIConstraints erwartet in Zeile %d von %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Treibertyp-Keyword nach DriverType erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Duplextyp nach Duplex erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Codierung nach Schrift erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Dateiname nach #po %s erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Gruppenname/-text erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: „include filename“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: „integer“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Locale nach #po erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Name nach „%s“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Name nach FileName erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Name nach Font erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Name nach Manufacturer erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Name nach MediaSize erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Name nach ModelName erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Name nach PCFileName erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Name/Text nach „%s“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Name/Text nach Installable erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Name/Text nach Resolution erwartet in Zeile %d von %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Kombination aus Name/Text für ColorModel erwartet in Zeile %d von %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Optionsname/-text erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: „option section“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: „option type“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: „override field“ nach Resolution erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: „real number“ erwartet in Zeile %d von %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: „resolution/mediatype“ nach ColorProfile erwartet in Zeile %d von %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: „resolution/mediatype“ nach SimpleColorProfile erwartet in Zeile %d " +#~ "von %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: „selector“ nach „%s“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Status nach Font erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: „string“ nach Copyright erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: „string“ nach Version erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Zwei Optionsnamen erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: „value“ nach „%s“ erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Version nach Font erwartet in Zeile %d von %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: ungültiger #include/#po Dateiname „%s“!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiges „cost“ für Filter in Zeile %d von %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiger leerer MIME-Typ für Filter in Zeile %d von %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Ungültiger leerer Programmname für Filter in Zeile %d von %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiger Optionsabschnitt „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ungültiger Optionstyp „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Treiberinfodatei „%s“ laden …\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Meldungen für Locale „%s“ laden …\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Meldungen von „%s“ laden …\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif fehlt am Ende von „%s“!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if fehlt in Zeile %d von %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Kein Message-Catalog verfügbar für Locale „%s“!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Option „%s“ neu definiert durch anderen Typ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Option „constraint must *name“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Zu viele verschachtelte #if in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: PPD-Datei „%s“ konnte nicht erstellt werden – %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Ausgabeordner „%s“ konnte nicht erstellt werden: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Ausgabekanäle konnten nicht erstellt werden: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: cupstestppd konnte nicht ausgeführt werden: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: #po-Datei „%s“ wurde nicht gefunden in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: include-Datei „%s“ wurde nicht gefunden in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Lokalisierung für „%s“ wurde nicht gefunden – %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Lokalisierungsdatei „%s“ konnte nicht geladen werden – %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Nicht defnierte Variable (%s) in Zeile %d von %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Unbekannter Treibertyp „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Unbekannter Duplextyp „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Unbekannte Mediengröße „%s“ in Zeile %d von %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Unbekannter Token „%s“ gefunden in Zeile %d von %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Unbekannte nachfolgende Zeichen in Real Number „%s“ in Zeile %d von " +#~ "%s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Unvollständiger String beginnend mit %c in Zeile %d von %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: %s schreiben …\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: PPD-Dateien schreiben in Ordner „%s“ …\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Ungültige LanguageVersion „%s“ in %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: PPD-Datei „%s“ ignorieren …\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Backup von „%s“ auf %s fehlgeschlagen – %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "Drucker „%s“ deaktiviert seit %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "Drucker „%s“ ist inaktiv; aktiviert seit %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "Drucker „%s“ druckt gerade %s–%d; aktiviert seit %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "Drucker „%s/%s“ deaktiviert seit %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "Drucker „%s/%s“ ist inaktiv; aktiviert seit %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "Drucker „%s/%s“ druckt gerade %s–%d; aktiviert seit %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "Anfrage-ID ist %s–%d (%d Datei(en))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "Scheduler ist nicht aktiv\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "Scheduler ist aktiv\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "Status\t\tStatus für Daemon und Warteliste anzeigen\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "System-Standardzielort: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "System-Standardzielort: %s/%s\n" diff --git a/locale/cups_es.po b/locale/cups_es.po new file mode 100644 index 0000000..8c96159 --- /dev/null +++ b/locale/cups_es.po @@ -0,0 +1,5774 @@ +# +# "$Id$" +# +# Spanish message catalog for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.5\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2011-06-18 19:16+0100\n" +"Last-Translator: Juan Pablo González Riopedre \n" +"Language-Team: Spanish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "\t\t(todos)" + +msgid "\t\t(none)" +msgstr "\t\t(ninguno)" + +#, c-format +msgid "\t%d entries" +msgstr "\t%d entradas" + +#, c-format +msgid "\t%s" +msgstr "\t%s" + +msgid "\tAfter fault: continue" +msgstr "\tTras fallo: continuar" + +#, c-format +msgid "\tAlerts: %s" +msgstr "\tAlertas: %s" + +msgid "\tBanner required" +msgstr "\tSe necesita un rótulo" + +msgid "\tCharset sets:" +msgstr "\tAjustes del juego de caracteres:" + +msgid "\tConnection: direct" +msgstr "\tConexión: directa" + +msgid "\tConnection: remote" +msgstr "\tConexión: remota" + +msgid "\tContent types: any" +msgstr "\tTipos de contenido: cualesquiera" + +msgid "\tDefault page size:" +msgstr "\tTamaño de página predeterminado:" + +msgid "\tDefault pitch:" +msgstr "\tPaso predeterminado:" + +msgid "\tDefault port settings:" +msgstr "\tAjustes del puerto predeterminados:" + +#, c-format +msgid "\tDescription: %s" +msgstr "\tDescripción: %s" + +msgid "\tForm mounted:" +msgstr "\tFormulario montado:" + +msgid "\tForms allowed:" +msgstr "\tFormularios permitidos:" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "\tInterfaz: %s.ppd" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "\tInterfaz: %s/interfaces/%s" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "\tInterfaz: %s/ppd/%s.ppd" + +#, c-format +msgid "\tLocation: %s" +msgstr "\tUbicación: %s" + +msgid "\tOn fault: no alert" +msgstr "\tEn fallo: no alertar" + +msgid "\tPrinter types: unknown" +msgstr "\tTipos de impresora: desconocidos" + +#, c-format +msgid "\tStatus: %s" +msgstr "\tEstado: %s" + +msgid "\tUsers allowed:" +msgstr "\tUsuarios permitidos:" + +msgid "\tUsers denied:" +msgstr "\tUsuarios denegados:" + +msgid "\tdaemon present" +msgstr "\tdemonio presente" + +msgid "\tno entries" +msgstr "\tno hay entradas" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "\tla impresora está conectada a '%s' velocidad -1" + +msgid "\tprinting is disabled" +msgstr "\tla impresión está desactivada" + +msgid "\tprinting is enabled" +msgstr "\tla impresión está activada" + +#, c-format +msgid "\tqueued for %s" +msgstr "\ten cola para %s" + +msgid "\tqueuing is disabled" +msgstr "\tla cola está desactivada" + +msgid "\tqueuing is enabled" +msgstr "\tla cola está activada" + +msgid "\treason unknown" +msgstr "\trazón desconocida" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" +"\n" +" RESULTADOS DETALLADOS DE LA PRUEBA DE CONFORMIDAD" + +msgid " Ignore specific warnings." +msgstr " Ignorar advertencias (warnings) específicas." + +msgid " Issue warnings instead of errors." +msgstr "" +" Emitor advertencias (warnings) en vez de errores." + +msgid " REF: Page 15, section 3.1." +msgstr " REF: Página 15, sección 3.1." + +msgid " REF: Page 15, section 3.2." +msgstr " REF: Página 15, sección 3.2." + +msgid " REF: Page 19, section 3.3." +msgstr " REF: Página 19, sección 3.3." + +msgid " REF: Page 20, section 3.4." +msgstr " REF: Página 20, sección 3.4." + +msgid " REF: Page 27, section 3.5." +msgstr " REF: Página 27, sección 3.5." + +msgid " REF: Page 42, section 5.2." +msgstr " REF: Página 42, sección 5.2." + +msgid " REF: Pages 16-17, section 3.2." +msgstr " REF: Páginas 16-17, sección 3.2." + +msgid " REF: Pages 42-45, section 5.2." +msgstr " REF: Páginas 42-45, sección 5.2." + +msgid " REF: Pages 45-46, section 5.2." +msgstr " REF: Páginas 45-46, sección 5.2." + +msgid " REF: Pages 48-49, section 5.2." +msgstr " REF: Páginas 48-49, sección 5.2." + +msgid " REF: Pages 52-54, section 5.2." +msgstr " REF: Páginas 52-54, sección 5.2." + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr " %-39.39s %.0f bytes" + +#, c-format +msgid " PASS Default%s" +msgstr " PASA Default%s" + +msgid " PASS DefaultImageableArea" +msgstr " PASA DefaultImageableArea" + +msgid " PASS DefaultPaperDimension" +msgstr " PASA DefaultPaperDimension" + +msgid " PASS FileVersion" +msgstr " PASA FileVersion" + +msgid " PASS FormatVersion" +msgstr " PASA FormatVersion" + +msgid " PASS LanguageEncoding" +msgstr " PASA LanguageEncoding" + +msgid " PASS LanguageVersion" +msgstr " PASA LanguageVersion" + +msgid " PASS Manufacturer" +msgstr " PASA Manufacturer" + +msgid " PASS ModelName" +msgstr " PASA ModelName" + +msgid " PASS NickName" +msgstr " PASA NickName" + +msgid " PASS PCFileName" +msgstr " PASA PCFileName" + +msgid " PASS PSVersion" +msgstr " PASA PSVersion" + +msgid " PASS PageRegion" +msgstr " PASA PageRegion" + +msgid " PASS PageSize" +msgstr " PASA PageSize" + +msgid " PASS Product" +msgstr " PASA Product" + +msgid " PASS ShortNickName" +msgstr " PASA ShortNickName" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr " ADVERTENCIA %s tiene opciones que no corresponden." + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" +" ADVERTENCIA %s comparte un prefijo común con %s\n" +" REF: Página 15, sección 3.2." + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" +" ADVERTENCIA La clave de opción Duplex %s puede que no funcione " +"como se espera y debería llamarse Duplex.\n" +" REF: Página 122, sección 5.17" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" +" ADVERTENCIA El archivo contiene una mezcla de líneas acabadas en " +"CR, LF y CR LF." + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" +" ADVERTENCIA Se necesita LanguageEncoding por especificación de " +"PPD 4.3.\n" +" REF: Páginas 56-57, sección 5.3." + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr " ADVERTENCIA La línea %d solo contiene espacios en blanco." + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" +" ADVERTENCIA Se necesita Manufacturer por especificación de PPD " +"4.3.\n" +" REF: Páginas 58-59, sección 5.3." + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" +" ADVERTENCIA Los archivos PPD que no sean de Windows deben tener " +"líneas que acaben sólo en LF, no en CR LF." + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" +" ADVERTENCIA Versión de PPD %.1f anticuada.\n" +" REF: Página 42, sección 5.2." + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" ADVERTENCIA PCFileName es mas largo que 8.3 violando la " +"especificación PPD.\n" +" REF: Páginas 61-62, sección 5.3." + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" ADVERTENCIA PCFileName debe contener un único nombre de archivo.\n" +" REF: Páginas 61-62, sección 5.3." + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" +" ADVERTENCIA Los protocolos contienen PJL pero no se especifican " +"los atributos JCL.\n" +" REF: Páginas 78-79, sección 5.7." + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" +" ADVERTENCIA Los protocolos contienen a ambos, PJL y BCP; se " +"esperaba TBCP.\n" +" REF: Páginas 78-79, sección 5.7." + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" +" ADVERTENCIA Se necesita ShortNickName por especificación de PPD " +"4.3.\n" +" REF: Páginas 64-65, sección 5.3." + +msgid " cupsaddsmb [options] -a" +msgstr " cupsaddsmb [opciones] -a" + +msgid " cupstestdsc [options] -" +msgstr " cupstestdsc [opciones] -" + +msgid " program | cupstestppd [options] -" +msgstr " programa | cupstestppd [opciones] -" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" +" %s \"%s %s\" está en conflictocon \"%s %s\"\n" +" (restricción=\"%s %s %s %s\")." + +#, c-format +msgid " %s %s %s does not exist." +msgstr " %s %s %s no existe." + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr " %s archivo %s \"%s\" tiene las mayúsculas equivocadas" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" +" %s Preferencia %s incorrecta %s.\n" +" REF: Página 122, sección 5.17" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" +" %s Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s, " +"preferencia %s." + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr " %s Cadena de traducción UTF-8 \"%s\" incorrecta para opción %s." + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr " %s Valor cupsFilter \"%s\" incorrecto." + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr " %s cupsICCProfile %s incorrecto." + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr " %s Valor cupsPreFilter \"%s\" incorrecto." + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr " %s cupsUIConstraints %s: \"%s\" incorrecto" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr " %s Idioma incorrecto \"%s\"." + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr " %s Permisos incorrectos en el archivo %s \"%s\"." + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr " %s %s mal escrito - debería ser %s." + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr " %s No puede proporcionar APScanAppPath y APScanAppBundleID." + +#, c-format +msgid " %s Default choices conflicting." +msgstr " %s Las preferencias predeterminadas están en conflicto." + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr " %s cupsUIConstraints %s vacío." + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" +" %s Falta cadena de traducción \"%s\" para opción %s, preferencia %s." + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr " %s Falta cadena de traducción \"%s\" para opción %s." + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr " %s Falta archivo %s \"%s\"." + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" +" %s Falta la opción NECESARIA PageRegion.\n" +" REF: Página 100, sección 5.14." + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" +" %s Falta la opción NECESARIA PageSize.\n" +" REF: Página 99, sección 5.14." + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" +" %s Falta la preferencia *%s %s en UIConstraint \"*%s %s *%s %s\"." + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr " %s Falta la preferencia *%s %s en cupsUIConstraints %s: \"%s\"" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr " %s Falta cupsUIResolver %s" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr " %s Falta la opción %s en UIConstraints \"*%s %s *%s %s\"." + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr " %s Falta la opción %s en cupsUIConstraints %s: \"%s\"" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr " %s No hay traducción base \"%s\" incluida en el archivo." + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" +" %s NECESARIA %s no define la opción None.\n" +" REF: Página 122, sección 5.17" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr " %s Tamaño \"%s\" definido para %s pero no para %s." + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr " %s El tamaño \"%s\" tiene dimensiones inesperadas (%gx%g)." + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr " %s Tamaño \"%s\" debería ser \"%s\"." + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" +" %s Tamaño \"%s\" debería ser el nombre estandar de Adobe \"%s\"." + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr " %s valor hash de cupsICCProfile %s colisiona con %s." + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr " %s cupsUIResolver %s genera un bucle." + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr " %s cupsUIResolver %s no lista al menos dos opciones diferentes." + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" +" **FALLO** %s nombres de opción %s y %s se diferencian sólo en la " +"capitalización." + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" +" **FALLO** %s debe ser 1284DeviceID\n" +" REF: Página 72, sección 5.5" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" +" **FALLO** Default%s %s INCORRECTO\n" +" REF: Página 40, sección 4.5." + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" +" **FALLO** DefaultImageableArea %s INCORRECTO\n" +" REF: Página 102, sección 5.15." + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" +" **FALLO** DefaultPaperDimension %s INCORRECTO\n" +" REF: Página 103, sección 5.15." + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" +" **FALLO** Atributo JobPatchFile en archivo, INCORRECTO\n" +" REF: Página 24, sección 3.4." + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" +" **FALLO** Fabricante INCORRECTO (debería ser \"HP\")\n" +" REF: Página 211, tabla D.1." + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" +" **FALLO** Fabricante INCORRECTO (debería ser \"Oki\")\n" +" REF: Página 211, tabla D.1." + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" +" **FALLO** ModelName INCORRECTO - \"%c\" no permitido en la cadena.\n" +" REF: Páginas 59-60, sección 5.3." + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" +" **FALLO** PSVersion INCORRECTO - no es \"(string) int\".\n" +" REF: Páginas 62-64, sección 5.3." + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" +" **FALLO** Product INCORRECTO - no es \"(string)\".\n" +" REF: Página 62, sección 5.3." + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" +" **FALLO** ShortNickName INCORRECTO - mayor de 31 caracteres.\n" +" REF: Páginas 64-65, sección 5.3." + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" +" **FALLO** Preferencia %s incorrecta %s\n" +" REF: Página 84, sección 5.9" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" +" **FALLO** FileVersion \"%s\" incorrecto\n" +" REF: Página 56, sección 5.3." + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" +" **FALLO** FormatVersion \"%s\" incorrecto\n" +" REF: Página 56, sección 5.3." + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" +" **FALLO** LanguageEncoding %s incorrecto: debería ser ISOLatin1." + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" +" **FALLO** LanguageVersion %s incorrecto: debería ser English (Inglés)." + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" +" **FALLO** El código de opción predeterminado no puede ser " +"interpretado: %s" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" +" **FALLO** Cadena de traducción predeterminada para opción %s " +"preferencia %s contiene caracteres de 8-bits." + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" +" **FALLO** Cadena de traducción predeterminada para opción %s contiene " +"caracteres de 8-bits." + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" +" **FALLO** Nombres de grupo %s y %s se diferencian sólo en la " +"capitalización." + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr " **FALLO** Múltiples apariciones de %s nombre de opción %s." + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" +" **FALLO** Nombres de opción %s y %s se diferencian sólo en la " +"capitalización." + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" +" **FALLO** SE NECESITA Default%s\n" +" REF: Página 40, sección 4.5." + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" +" **FALLO** SE NECESITA DefaultImageableArea\n" +" REF: Página 102, sección 5.15." + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" +" **FALLO** SE NECESITA DefaultPaperDimension\n" +" REF: Página 103, sección 5.15." + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" +" **FALLO** SE NECESITA FileVersion\n" +" REF: Página 56, sección 5.3." + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" +" **FALLO** SE NECESITA FormatVersion\n" +" REF: Página 56, sección 5.3." + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" +" **FALLO** SE NECESITA ImageableArea para PageSize %s\n" +" REF: Página 41, sección 5.\n" +" REF: Página 102, sección 5.15." + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" +" **FALLO** SE NECESITA LanguageEncoding\n" +" REF: Páginas 56-57, sección 5.3." + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" +" **FALLO** SE NECESITA LanguageVersion\n" +" REF: Páginas 57-58, sección 5.3." + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" +" **FALLO** SE NECESITA Manufacturer\n" +" REF: Páginas 58-59, sección 5.3." + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" +" **FALLO** SE NECESITA ModelName\n" +" REF: Páginas 59-60, sección 5.3." + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" +" **FALLO** SE NECESITA NickName\n" +" REF: Página 60, sección 5.3." + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" **FALLO** SE NECESITA PCFileName\n" +" REF: Páginas 61-62, sección 5.3." + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" +" **FALLO** SE NECESITA PSVersion\n" +" REF: Páginas 62-64, sección 5.3." + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" +" **FALLO** SE NECESITA PageRegion\n" +" REF: Página 100, sección 5.14." + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" +" **FALLO** SE NECESITA PageSize\n" +" REF: Página 41, sección 5.\n" +" REF: Página 99, sección 5.14." + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" +" **FALLO** SE NECESITA PageSize\n" +" REF: Páginas 99-100, sección 5.14." + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" +" **FALLO** SE NECESITA PaperDimension para PageSize %s\n" +" REF: Página 41, sección 5.\n" +" REF: Página 103, sección 5.15." + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" +" **FALLO** SE NECESITA Product\n" +" REF: Página 62, sección 5.3." + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" +" **FALLO** SE NECESITA ShortNickName\n" +" REF: Página 64-65, sección 5.3." + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr " **FALLO** No se ha podido abrir el archivo PPD - %s" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" +" **FALLO** No se ha podido abrir el archivo PPD - %s en la línea %d." + +#, c-format +msgid " %d ERRORS FOUND" +msgstr " %d ERRORES ENCONTRADOS" + +msgid " -h Show program usage" +msgstr " -h Mostrar el uso del programa" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" +" %%%%BoundingBox: incorrecto en línea %d.\n" +" REF: Página 39, %%%%BoundingBox:" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" +" %%%%Page: incorrecto en línea %d.\n" +" REF: Página 53, %%%%Page:" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" +" %%%%Pages: incorrecto en línea %d.\n" +" REF: Página 43, %%%%Pages:" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" +" La línea %d es más larga de 255 caracteres (%d).\n" +" REF: Página 25, Longitud de Línea" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" +" Falta %!PS-Adobe-3.0 en la primera línea.\n" +" REF: Página 17, 3.1 Conformidad de documentos" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" +" Falta comentario %%EndComments. REF: Página 41, %%EndComments" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" +" Falta comentario %%BoundingBox: o incorrecto.\n" +" REF: Página 39, %%BoundingBox:" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" +" Falta comentario %%Page: o incorrecto.\n" +" REF: Página 53, %%Page:" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" +" Falta comentario %%Pages: o incorrecto.\n" +" REF: Página 43, %%Pages:" + +msgid " NO ERRORS FOUND" +msgstr " NO SE HAN ENCONTRADO ERRORES" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr " Se han visto %d líneas que exceden de 255 caracteres." + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr " Demasiados comentarios %%BeginDocument." + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr " Demasiados comentarios %%EndDocument." + +msgid " Warning: file contains binary data." +msgstr " Advertencia: el archivo contiene datos binarios." + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr " Advertencia: no hay comentario %%EndComments en el archivo." + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr " Advertencia: versión DSC %.1f obsoleta en el archivo." + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr " --[no-]debug-logging Activar/desactivar registro de depuración." + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr " --[no-]remote-admin Activar/desactivar administración remota." + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr " --[no-]remote-any Permitir/evitar acceso desde Internet." + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr " --[no-]remote-printers Mostrar/ocultar impresoras remotas." + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" +" --[no-]share-printers Activar/desactivar compartición de impresoras." + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" +" --[no-]user-cancel-any Permitir/evitar a usuarios que cancelen cualquier " +"trabajo." + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr " --cr Finalizar líneas con CR (Mac OS 9)." + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr " --crlf Finalizar líneas con CR + LF (Windows)." + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" +" --lf Finalizar líneas con LF (UNIX/Linux/Mac OS X)." + +msgid " -4 Connect using IPv4." +msgstr " -4 Conectar usando IPv4." + +msgid " -6 Connect using IPv6." +msgstr " -6 Conectar usando IPv6." + +msgid " -C Send requests using chunking (default)." +msgstr "" +" -C Enviar peticiones usando fragmentación " +"(predeterminado)." + +msgid " -D Remove the input file when finished." +msgstr " -D Eliminar el archivo de entrada al terminar." + +msgid " -D name=value Set named variable to value." +msgstr " -D nombre=valor Establece la variable nombre al valor." + +msgid " -E Enable encryption." +msgstr " -E Activar cifrado." + +msgid " -E Encrypt the connection to the server." +msgstr " -E Cifra la conexión al servidor." + +msgid " -E Test with TLS encryption." +msgstr " -E Prueba con cifrado TLS." + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" +" -F Ejecuta en primer plano pero separado de la " +"consola." + +msgid " -H samba-server Use the named SAMBA server." +msgstr " -H servidor-samba Usa el servidor SAMBA nombrado." + +msgid " -I Ignore errors." +msgstr " -I Ignora errores." + +msgid " -I include-dir Add include directory to search path." +msgstr "" +" -I include-dir Añade directorio include a la ruta de búsqueda." + +msgid " -I {filename,filters,none,profiles}" +msgstr " -I {filename,filters,none,profiles}" + +msgid " -J title Set title." +msgstr " -J título Establece título." + +msgid " -L Send requests using content-length." +msgstr " -L Envía peticiones usando content-length." + +msgid " -P filename.ppd Set PPD file." +msgstr " -P nombre_archivo.ppd Establece archivo PPD." + +msgid " -R root-directory Set alternate root." +msgstr " -R directorio-raíz Establece directorio raíz alternativo." + +msgid " -S Test with SSL encryption." +msgstr " -S Prueba con cifrado SSL." + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" +" -T Establece el tiempo de espera de recepción/envío " +"en segundos." + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" +" -U ususario-samba Autentifica usando el usuario SAMBA " +"especificado." + +msgid " -U username Set username for job." +msgstr "" +" -U nombre_usuario Establece el nombre de usuario para el " +"trabajo." + +msgid " -U username Specify username." +msgstr " -U nombre_usuario Especifica el nombre de usuario." + +msgid " -V version Set default IPP version." +msgstr " -V versión Establece la versión IPP predeterminada." + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" +" -X Produce XML plist en vez de texto sin formato." + +msgid " -a Export all printers." +msgstr " -a Exporta todas las impresoras." + +msgid " -a 'name=value ...' Set option(s)." +msgstr " -a 'nombre=valor ...' Establece opción(es)." + +msgid " -c catalog.po Load the specified message catalog." +msgstr " -c catálogo.po Carga el catálogo de mensajes especificado." + +msgid " -c config-file Load alternate configuration file." +msgstr "" +" -c archivo-config Carga archivo de configuración alternativo." + +msgid " -c copies Set number of copies." +msgstr " -c copias Establece el número de copias." + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr " -c cupsd.conf Establece el archivo cupsd.conf a usar." + +msgid " -d name=value Set named variable to value." +msgstr " -d nombre=valor Establece la variable al valor." + +msgid " -d output-dir Specify the output directory." +msgstr " -d dir-salida Especifica el directorio de salida." + +msgid " -d printer Use the named printer." +msgstr " -d impresora Usa la impresora especificada." + +msgid " -e Use every filter from the PPD file." +msgstr " -e Usa cada filtro desde el archivo PPD." + +msgid " -f Run in the foreground." +msgstr " -f Ejecuta en primer plano." + +msgid " -f filename Set default request filename." +msgstr "" +" -f nombre_archivo Establece nombre de archivo predeterminado." + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" +" -f nombre_archivo Establece el archivo que va a ser convertido " +"(si no, stdin)." + +msgid " -h Show this usage message." +msgstr " -h Muestra este mensaje de uso." + +msgid " -h cups-server Use the named CUPS server." +msgstr " -h servidor-cups Usa el servidor CUPS especificado." + +msgid " -h server[:port] Specify server address." +msgstr " -h servidor[:puerto] Especifica la dirección del servidor." + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" +" -i tipo/mime Establece el tipo MIME de entrada (si no, auto-" +"typed)." + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" +" -i segundos Repite el último archivo con el intervalo de " +"tiempo dado." + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" +" -j id-trabajo[,N] Filtra el archivo N desde el trabajo " +"especificado (predeterminado archivo 1)." + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" +" -j tipo/mime Establece el tipo MIME de salida (si no, " +"application/pdf)." + +msgid " -l Run cupsd from launchd(8)." +msgstr " -l Ejecuta cupsd desde launchd(8)." + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" +" -l idioma[,idioma,...] Especifica los idiomas de salida (código " +"regional)." + +msgid " -m Use the ModelName value as the filename." +msgstr "" +" -m Usa el valor ModelName como nombre de archivo." + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" +" -m tipo/mime Establece el tipo MIME de salida (si no, " +"application/pdf)." + +msgid " -n copies Set number of copies." +msgstr " -n copias Establece el número de copias." + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" +" -n contador Repite el último archivo el número de veces " +"especificado." + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" +" -o nombre_archivo Establece el archivo que va a ser generado " +"(si no, stdout)." + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" +" -o nombre_archivo.drv Establece el archivo de información del " +"controlador (si no, ppdi.drv)." + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" +" -o nombre_archivo.ppd[.gz] Establece el archivo de salida (si no, " +"stdout)." + +msgid " -o name=value Set option(s)." +msgstr " -o nombre=valor Establece opciones." + +msgid " -p filename.ppd Set PPD file." +msgstr " -p nombre_archivo.ppd Establece archivo PPD." + +msgid " -q Be quiet - no output except errors." +msgstr " -q Silencioso - sin salida excepto errores." + +msgid " -q Run silently." +msgstr " -q Ejecución silenciosa." + +msgid " -r Use 'relaxed' open mode." +msgstr " -r Usa modo abierto 'relajado'." + +msgid " -t Produce a test report." +msgstr " -t Produce un informe de la prueba." + +msgid " -t Test PPDs instead of generating them." +msgstr " -t Prueba los PPDs en vez de generarlos." + +msgid " -t Test the configuration file." +msgstr " -t Prueba el archivo de configuración." + +msgid " -t title Set title." +msgstr " -t título Establece título." + +msgid " -u Remove the PPD file when finished." +msgstr " -u Borra el archivo PPD tras terminar." + +msgid " -v Be slightly verbose." +msgstr " -v Ser ligeramente detallado." + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr " -v Ser detallado (más v's para más detalle)." + +msgid " -v Be verbose (show commands)." +msgstr " -v Ser detallado (mostrar comandos)." + +msgid " -v Show all attributes sent and received." +msgstr "" +" -v Mostrar todos los atributos enviados y recibidos." + +msgid " -vv Be very verbose." +msgstr " -vv Ser muy detallado." + +msgid " -z Compress PPD files using GNU zip." +msgstr " -z Comprimir archivos PPD usando GNU zip." + +msgid " FAIL" +msgstr " FALLO" + +msgid " PASS" +msgstr " PASA" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milímetros" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f a %.0f x %.0f milímetros" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f pulgadas" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f a %.2f x %.2f pulgadas" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "%s aceptando peticiones desde %s" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s no puede ser cambiado." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "%s no está implementado en la versión de CUPS de lpc." + +#, c-format +msgid "%s is not ready" +msgstr "%s no está preparada" + +#, c-format +msgid "%s is ready" +msgstr "%s está preparada" + +#, c-format +msgid "%s is ready and printing" +msgstr "%s está preparada e imprimiendo" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "%s job-id usuario título copias opciones [archivo]" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "%s no acepta peticiones desde %s -" + +#, c-format +msgid "%s not supported." +msgstr "No se admite el uso de %s." + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "%s/%s aceptando peticiones desde %s" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "%s/%s no acepta peticiones desde %s -" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "%s: %-33.33s [trabajo %d localhost]" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "%s: %s ha fallado: %s" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "%s: No sé que hay que hacer." + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" +"%s: Error - %s nombres de variables de entorno no existen en destino \"%s\"." + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "%s: Error - ID de trabajo incorrecta." + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" +"%s: Error - no se pueden imprimir archivos y alterar trabajos al mismo " +"tiempo." + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" +"%s: Error - no se puede imprimir desde stdin si se proporcionan archivos o " +"una ID de trabajo." + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "%s: Error - se esperaba un juego de caracteres tras la opción \"-S\"." + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "%s: Error - se esperaba un tipo de contenido tras la opción \"-T\"." + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "%s: Error - se esperaba número de copias tras la opción \"-#\"." + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "%s: Error - se esperaba número de copias tras la opción \"-n\"." + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "%s: Error - se esperaba un destino tras la opción \"-P\"." + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "%s: Error - se esperaba un destino tras la opción \"-b\"." + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "%s: Error - se esperaba un destino tras la opción \"-d\"." + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "%s: Error - se esperaba un formulario tras la opción \"-f\"." + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "%s: Error - se esperaba un nombre de retención tras la opción \"-H\"." + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción \"-H\"." + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "%s: Error - se esperaba un nombre de ordenador tras la opción \"-h\"." + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "%s: Error - se esperaba una lista de modos tras la opción \"-y\"." + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "%s: Error - se esperaba un nombre tras la opción \"%c\"." + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "%s: Error - se esperaba opción=valor tras la opción \"-o\"." + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "%s: Error - se esperaba una lista de páginas tras la opción \"-P\"." + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "%s: Error - se esperaba un valor de prioridad tras la opción \"-%c\"." + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "%s: Error - se esperaba un texto con una razón tras la opción \"-r\"." + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "%s: Error - se esperaba un título tras la opción \"-t\"." + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "%s: Error - se esperaba un nombre de usuario tras la opción \"-U\"." + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "%s: Error - se esperaba un nombre de usuario tras la opción \"-u\"." + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "%s: Error - se esperaba un valor tras la opción \"%c\"." + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" +"%s: Error - se necesita \"completed\", \"not completed\", o \"all\" tras la " +"opción \"-W\"." + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "%s: Error - destino predeterminado no disponible." + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "%s: Error - la prioridad debe estar entre 1 y 100." + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "%s: Error - el programa planificador de tareas no responde." + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "%s: Error - demasiados archivos - \"%s\"." + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "%s: Error - no se ha podido acceder a \"%s\" - %s" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "%s: Error - no se ha podido poner en cola desde stdin - %s." + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "%s: Error - destino \"%s\" desconocido." + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "%s: Error - destino \"%s/%s\" desconocido." + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "%s: Error - opción \"%c\" desconocida." + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "%s: Error: opción \"%s\" desconocida." + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "%s : Se esperaba una ID de trabajo tras la opción \"-i\"." + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "%s: Nombre de destino no válido en la lista \"%s\"." + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "%s: Cadena de filtro \"%s\" no válida." + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" +"%s: Se necesita un ID de trabajo (\"-i id_trabajo\") antes de \"-H restart\"." + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "%s: No hay ningún filtro para convertir de %s/%s a %s/%s." + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "%s: La operación ha fallado: %s" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "%s: Lo siento, no está compilado con la opción de cifrado." + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "%s: No se ha podido conectar al servidor." + +#, c-format +msgid "%s: Unable to contact server." +msgstr "%s: No se ha podido contactar con el servidor." + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "%s: No se ha podido determinar el tipo MIME de \"%s\"." + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "%s: No se pudo abrir %s: %s" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "%s: No se ha podido abrir el archivo PPD: %s en la línea %d." + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "%s: No se pudo leer base de datos MIME desde \"%s\" o \"%s\"." + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "%s: Destino \"%s\" desconocido." + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "%s: Tipo MIME de destino %s/%s desconocido." + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "%s: Opción \"%c\" desconocida." + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "%s: Tipo MIME de origen %s/%s desconocido." + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" +"%s: Advertencia - no se admite el uso del modificador de formato \"%c\" - la " +"salida puede no ser correcta." + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "%s: Advertencia - opción de juego de caracteres no tenida en cuenta." + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "%s: Advertencia - opción de tipo de contenido no tenida en cuenta." + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "%s: Advertencia - opción de formulario no tenida en cuenta." + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "%s: Advertencia - opción de modo no tenida en cuenta." + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 pulg./seg" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25 pulg." + +msgid "1.25x2.25\"" +msgstr "1.25x2.25 pulg." + +msgid "1.5 inch/sec." +msgstr "1.5 pulg./seg" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25 pulg." + +msgid "1.50x0.50\"" +msgstr "1.50x0.50 pulg." + +msgid "1.50x1.00\"" +msgstr "1.50x1.00 pulg." + +msgid "1.50x2.00\"" +msgstr "1.50x2.00 pulg." + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 pulg./seg" + +msgid "10 x 11" +msgstr "10 x 11" + +msgid "10 x 13" +msgstr "10 x 13" + +msgid "10 x 14" +msgstr "10 x 14" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/seg" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 pulg./seg" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 pulg./seg" + +msgid "12 x 11" +msgstr "12 x 11" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/seg" + +msgid "120x60dpi" +msgstr "120x60ppp" + +msgid "120x72dpi" +msgstr "120x72ppp" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136ppp" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/seg" + +msgid "15 x 11" +msgstr "15 x 11" + +msgid "150 mm/sec." +msgstr "150 mm/seg" + +msgid "150dpi" +msgstr "150ppp" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180ppp" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 pulg./seg" + +msgid "2-Sided Printing" +msgstr "Dúplex" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37 pulg." + +msgid "2.00x0.50\"" +msgstr "2.00x0.50 pulg." + +msgid "2.00x1.00\"" +msgstr "2.00x1.00 pulg." + +msgid "2.00x1.25\"" +msgstr "2.00x1.25 pulg." + +msgid "2.00x2.00\"" +msgstr "2.00x2.00 pulg." + +msgid "2.00x3.00\"" +msgstr "2.00x3.00 pulg." + +msgid "2.00x4.00\"" +msgstr "2.00x4.00 pulg." + +msgid "2.00x5.50\"" +msgstr "2.00x5.50 pulg." + +msgid "2.25x0.50\"" +msgstr "2.25x0.50 pulg." + +msgid "2.25x1.25\"" +msgstr "2.25x1.25 pulg." + +msgid "2.25x4.00\"" +msgstr "2.25x4.00 pulg." + +msgid "2.25x5.50\"" +msgstr "2.25x5.50 pulg." + +msgid "2.38x5.50\"" +msgstr "2.38x5.50 pulg." + +msgid "2.5 inches/sec." +msgstr "2.5 pulg./seg" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00 pulg." + +msgid "2.50x2.00\"" +msgstr "2.50x2.00 pulg." + +msgid "2.75x1.25\"" +msgstr "2.75x1.25 pulg." + +msgid "2.9 x 1\"" +msgstr "2.9 x 1 pulg." + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/seg" + +msgid "200 mm/sec." +msgstr "200 mm/seg" + +msgid "203dpi" +msgstr "203ppp" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-Pin Series" + +msgid "240x72dpi" +msgstr "240x72ppp" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/seg" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 pulg./seg" + +msgid "3 x 5" +msgstr "3 x 5" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00 pulg." + +msgid "3.00x1.25\"" +msgstr "3.00x1.25 pulg." + +msgid "3.00x2.00\"" +msgstr "3.00x2.00 pulg." + +msgid "3.00x3.00\"" +msgstr "3.00x3.00 pulg." + +msgid "3.00x5.00\"" +msgstr "3.00x5.00 pulg." + +msgid "3.25x2.00\"" +msgstr "3.25x2.00 pulg." + +msgid "3.25x5.00\"" +msgstr "3.25x5.00 pulg." + +msgid "3.25x5.50\"" +msgstr "3.25x5.50 pulg." + +msgid "3.25x5.83\"" +msgstr "3.25x5.83 pulg." + +msgid "3.25x7.83\"" +msgstr "3.25x7.83 pulg." + +msgid "3.5 x 5" +msgstr "3.5 x 5" + +msgid "3.5\" Disk" +msgstr "Disco de 3.5 pulg." + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Disco de 3.5 pulg. - 2 1/8 x 2 3/4 pulg." + +msgid "3.50x1.00\"" +msgstr "3.50x1.00 pulg." + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/seg" + +msgid "300 mm/sec." +msgstr "300 mm/seg" + +msgid "300dpi" +msgstr "300ppp" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360ppp" + +msgid "360x180dpi" +msgstr "360x180ppp" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 pulg./seg" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00 pulg." + +msgid "4.00x13.00\"" +msgstr "4.00x13.00 pulg." + +msgid "4.00x2.00\"" +msgstr "4.00x2.00 pulg." + +msgid "4.00x2.50\"" +msgstr "4.00x2.50 pulg." + +msgid "4.00x3.00\"" +msgstr "4.00x3.00 pulg." + +msgid "4.00x4.00\"" +msgstr "4.00x4.00 pulg." + +msgid "4.00x5.00\"" +msgstr "4.00x5.00 pulg." + +msgid "4.00x6.00\"" +msgstr "4.00x6.00 pulg." + +msgid "4.00x6.50\"" +msgstr "4.00x6.50 pulg." + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/seg" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 pulg./seg" + +msgid "5 x 7" +msgstr "5 x 7" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 pulg./seg" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00 pulg." + +msgid "6.00x2.00\"" +msgstr "6.00x2.00 pulg." + +msgid "6.00x3.00\"" +msgstr "6.00x3.00 pulg." + +msgid "6.00x4.00\"" +msgstr "6.00x4.00 pulg." + +msgid "6.00x5.00\"" +msgstr "6.00x5.00 pulg." + +msgid "6.00x6.00\"" +msgstr "6.00x6.00 pulg." + +msgid "6.00x6.50\"" +msgstr "6.00x6.50 pulg." + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/seg" + +msgid "600dpi" +msgstr "600ppp" + +msgid "60dpi" +msgstr "60ppp" + +msgid "60x72dpi" +msgstr "60x72ppp" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 pulg./seg" + +msgid "7 x 9" +msgstr "7 x 9" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720ppp" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 pulg./seg" + +msgid "8 x 10" +msgstr "8 x 10" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00 pulg." + +msgid "8.00x2.00\"" +msgstr "8.00x2.00 pulg." + +msgid "8.00x3.00\"" +msgstr "8.00x3.00 pulg." + +msgid "8.00x4.00\"" +msgstr "8.00x4.00 pulg." + +msgid "8.00x5.00\"" +msgstr "8.00x5.00 pulg." + +msgid "8.00x6.00\"" +msgstr "8.00x6.00 pulg." + +msgid "8.00x6.50\"" +msgstr "8.00x6.50 pulg." + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/seg" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 pulg./seg" + +msgid "9 x 11" +msgstr "9 x 11" + +msgid "9 x 12" +msgstr "9 x 12" + +msgid "9-Pin Series" +msgstr "9-Pin Series" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "?Comando de ayuda no válido desconocido." + +msgid "A Samba password is required to export printer drivers" +msgstr "" +"Se requiere una contraseña Samba para exportar los controladores de impresora" + +msgid "A Samba username is required to export printer drivers" +msgstr "" +"Se requiere un nombre de usuario Samba para exportar los controladores de " +"impresora" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "Ya existe una clase llamada \"%s\"." + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "Ya existe una impresora llamada \"%s\"." + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "A0 lado largo" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "A1 lado largo" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "A2 lado largo" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "A3 lado largo" + +msgid "A3 Oversize" +msgstr "A3 Extragrande" + +msgid "A3 Oversize Long Edge" +msgstr "A3 Extragrande lado largo" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "A4 lado largo" + +msgid "A4 Oversize" +msgstr "A4 Extragrande" + +msgid "A4 Small" +msgstr "A4 Pequeño" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "A5 lado largo" + +msgid "A5 Oversize" +msgstr "A5 Extragrande" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "A6 lado largo" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "ARCH C lado largo" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "ARCH D lado largo" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "ARCH E lado largo" + +msgid "Accept Jobs" +msgstr "Aceptar trabajos" + +msgid "Accepted" +msgstr "Aceptado" + +msgid "Add Class" +msgstr "Añadir clase" + +msgid "Add Printer" +msgstr "Añadir impresora" + +msgid "Add RSS Subscription" +msgstr "Añadir subscripción RSS" + +msgid "Address" +msgstr "Dirección" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Dirección - 1 1/8 x 3 1/2 pulg." + +msgid "Administration" +msgstr "Administración" + +msgid "Always" +msgstr "Siempre" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplicador" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" +"Se ha intentado cambiar el valor printer-state de %s a un valor incorrecto %" +"d." + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "Los grupos de atributos están desordenados (%x < %x)." + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "A5 Extragrande" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Puntero destino NULLincorrecto" + +msgid "Bad OpenGroup" +msgstr "OpenGroup incorrecto" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI incorrecto" + +msgid "Bad OrderDependency" +msgstr "OrderDependency incorrecto" + +msgid "Bad PPD cache file." +msgstr "Archivo de caché PPD incorrecto." + +msgid "Bad Request" +msgstr "Petición incorrecta" + +msgid "Bad SNMP version number" +msgstr "Número de versión SNMP incorrecto" + +msgid "Bad UIConstraints" +msgstr "UIConstraints incorrecto" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "Archivo de juego de caracteres incorrecto \"%s\"." + +#, c-format +msgid "Bad charset type: %s" +msgstr "Tipo de juego de caracteres incorrecto: %s" + +#, c-format +msgid "Bad columns value %d." +msgstr "Valor de número de columnas %d incorrecto." + +#, c-format +msgid "Bad copies value %d." +msgstr "Valor de copias %d incorrecto." + +#, c-format +msgid "Bad cpi value %f." +msgstr "Valor de cpi %f incorrecto." + +msgid "Bad custom parameter" +msgstr "Parámetro a medida incorrecto" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "device-uri \"%s\" incorrecto." + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "Esquema device-uri \"%s\" incorrecto." + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "document-format \"%s\" incorrecto." + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "document-format-default \"%s\" incorrecto." + +msgid "Bad filename buffer" +msgstr "Nombre de archivo del búfer incorrecto" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "Línea de descripción tipográfica incorrecta: \"%s\"." + +#, c-format +msgid "Bad font description line: %s" +msgstr "Línea de descripción tipográfica incorrecta: %s" + +msgid "Bad job-priority value." +msgstr "Valor job-priority incorrecto." + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "Valor de job-sheets \"%s\" incorrecto." + +msgid "Bad job-sheets value type." +msgstr "Tipo de valor de job-sheets incorrecto." + +msgid "Bad job-state value." +msgstr "Valor job-state incorrecto." + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "job-uri \"%s\" incorrecto." + +#, c-format +msgid "Bad lpi value %f." +msgstr "Valor de lpi %f incorrecto." + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "notify-pull-method \"%s\" incorrecto." + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "notify-recipient-uri \"%s\" incorrecto." + +#, c-format +msgid "Bad number-up value %d." +msgstr "Valor number-up (páginas por hoja) %d incorrecto." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "Opción + preferencia incorrectas en línea %d." + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Valores de page-ranges %d-%d incorrectos." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "port-monitor \"%s\" incorrecto." + +#, c-format +msgid "Bad printer-state value %d." +msgstr "Valor printer-state %d incorrecto." + +#, c-format +msgid "Bad request ID %d." +msgstr "Petición incorrecta de ID %d." + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "Petición incorrecta de número de versión %d.%d." + +msgid "Bad subscription ID" +msgstr "ID de subscripción incorrecto" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "Dirección de texto incorrecta \"%s\"." + +#, c-format +msgid "Bad text direction: %s" +msgstr "Dirección de texto incorrecta: %s" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "Anchura de texto incorrecta \"%s\"." + +#, c-format +msgid "Bad text width: %s" +msgstr "Anchura de texto incorrecta: %s" + +msgid "Bad value string" +msgstr "Cadena de valores incorrecta" + +msgid "Banners" +msgstr "Rótulos" + +msgid "Billing Information: " +msgstr "Información de facturación: " + +msgid "Bond Paper" +msgstr "Papel de cartas" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "Se esperaba un valor lógico para la opción waiteof \"%s\"." + +msgid "Buffer overflow detected, aborting." +msgstr "Se ha detectado un desbordamiento de buffer, cancelando." + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Impresora de etiquetas CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Cancelar subscripción RSS" + +msgid "Canceling print job." +msgstr "Cancelando trabajo de impresión." + +msgid "Cannot share a remote Kerberized printer." +msgstr "No se puede compartir una impresora remota Kerberizada." + +msgid "Cassette" +msgstr "Casete" + +msgid "Change Settings" +msgstr "Cambiar configuración" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "No se admite el juego de caracteres \"%s\"." + +msgid "Classes" +msgstr "Clases" + +msgid "Clean Print Heads" +msgstr "Limpiar cabezales de impresión" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "Close-Job no admite el atributo job-uri." + +msgid "Color" +msgstr "Color" + +msgid "Color Mode" +msgstr "Modo de color" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" +"Los comandos se pueden abreviar. Los comandos son:\n" +"\n" +"exit help quit status ?" + +msgid "Community name uses indefinite length" +msgstr "Nombre de comunidad usa una longitud indefinida" + +msgid "Connected to printer." +msgstr "Conectado a la impresora." + +msgid "Connecting to printer." +msgstr "Conectando a la impresora." + +msgid "Continue" +msgstr "Continuar" + +msgid "Continuous" +msgstr "Continuo" + +msgid "Control file sent successfully." +msgstr "Archivo de control enviado correctamente." + +msgid "Copying print data." +msgstr "Copiando datos de impresión." + +msgid "Created" +msgstr "Creado" + +msgid "Created On: " +msgstr "Creado en: " + +msgid "Custom" +msgstr "A medida" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Cortar" + +msgid "Cutter" +msgstr "Cortadora" + +msgid "Dark" +msgstr "Oscuro" + +msgid "Darkness" +msgstr "Oscuridad" + +msgid "Data file sent successfully." +msgstr "Archivo de datos enviado correctamente." + +msgid "Delete Class" +msgstr "Borrar clase" + +msgid "Delete Printer" +msgstr "Borrar impresora" + +msgid "Description: " +msgstr "Descripción: " + +msgid "DeskJet Series" +msgstr "DeskJet Series" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "El destino %s no acepta trabajos." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" +"Dispositivo: uri = %s\n" +" clase = %s\n" +" info = %s\n" +" marca y modelo = %s\n" +" id dispositivo= %s\n" +" ubicación = %s" + +msgid "Direct Thermal Media" +msgstr "Soporte térmico directo" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "El directorio \"%s\" contiene una ruta relativa." + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "El directorio \"%s\" tiene permisos no seguros (0%o/uid=%d/gid=%d)." + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "El directorio \"%s\" es un archivo." + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "Directorio \"%s\" no disponible: %s" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "Permisos del directorio \"%s\" OK (0%o/uid=%d/gid=%d)." + +msgid "Disabled" +msgstr "Deshabilitado" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "El documento #%d no existe en el trabajo #%d." + +msgid "Driver Name: " +msgstr "Nombre del controlador: " + +msgid "Driver Version: " +msgstr "Versión del controlador: " + +msgid "Duplexer" +msgstr "Unidad de impresión dúplex" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Impresora de etiquetas EPL1" + +msgid "EPL2 Label Printer" +msgstr "Impresora de etiquetas EPL2" + +msgid "Edit Configuration File" +msgstr "Editar archivo de configuración" + +msgid "Empty PPD file." +msgstr "Archivo PPD vacío." + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Rótulo final" + +msgid "English" +msgstr "Spanish" + +msgid "Enter old password:" +msgstr "Introduzca la contraseña antigua:" + +msgid "Enter password again:" +msgstr "Introduzca nuevamente la contraseña:" + +msgid "Enter password:" +msgstr "Introduzca la contraseña:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Introduzca su nombre de usuario y contraseña o el nombre de usuario y " +"contraseña de root para poder acceder a esta página. Si está usando " +"autentificación Kerberos, asegúrese de que tiene un ticket Kerberos válido." + +msgid "Envelope #10 " +msgstr "Sobre #10" + +msgid "Envelope #11" +msgstr "Sobre #11" + +msgid "Envelope #12" +msgstr "Sobre #12" + +msgid "Envelope #14" +msgstr "Sobre #14" + +msgid "Envelope #9" +msgstr "Sobre #9" + +msgid "Envelope B4" +msgstr "Sobre B4" + +msgid "Envelope B5" +msgstr "Sobre B5" + +msgid "Envelope B6" +msgstr "Sobre B6" + +msgid "Envelope C0" +msgstr "Sobre C0" + +msgid "Envelope C1" +msgstr "Sobre C1" + +msgid "Envelope C2" +msgstr "Sobre C2" + +msgid "Envelope C3" +msgstr "Sobre C3" + +msgid "Envelope C4" +msgstr "Sobre C4" + +msgid "Envelope C5" +msgstr "Sobre C5" + +msgid "Envelope C6" +msgstr "Sobre C6" + +msgid "Envelope C65" +msgstr "Sobre C65" + +msgid "Envelope C7" +msgstr "Sobre C7" + +msgid "Envelope Choukei 3" +msgstr "Sobre Choukei 3" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "Sobre Choukei 3 lado largo" + +msgid "Envelope Choukei 4" +msgstr "Sobre Choukei 4" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "Sobre Choukei 4 lado largo" + +msgid "Envelope DL" +msgstr "Sobre DL" + +msgid "Envelope Feed" +msgstr "Alimentador de sobre" + +msgid "Envelope Invite" +msgstr "Sobre Invitación" + +msgid "Envelope Italian" +msgstr "Sobre Italiano" + +msgid "Envelope Kaku2" +msgstr "Sobre Kaku2" + +msgid "Envelope Kaku2 Long Edge" +msgstr "Sobre Kaku2 lado largo" + +msgid "Envelope Kaku3" +msgstr "Sobre Kaku3" + +msgid "Envelope Kaku3 Long Edge" +msgstr "Sobre Kaku3 lado largo" + +msgid "Envelope Monarch" +msgstr "Sobre Monarch" + +msgid "Envelope PRC1 " +msgstr "Sobre PRC1" + +msgid "Envelope PRC1 Long Edge" +msgstr "Sobre PRC1 lado largo" + +msgid "Envelope PRC10" +msgstr "Sobre PRC10" + +msgid "Envelope PRC10 Long Edge" +msgstr "Sobre PRC10 lado largo" + +msgid "Envelope PRC2" +msgstr "Sobre PRC2" + +msgid "Envelope PRC2 Long Edge" +msgstr "Sobre PRC2 lado largo" + +msgid "Envelope PRC3" +msgstr "Sobre PRC3" + +msgid "Envelope PRC3 Long Edge" +msgstr "Sobre PRC3 lado largo" + +msgid "Envelope PRC4" +msgstr "Sobre PRC4" + +msgid "Envelope PRC4 Long Edge" +msgstr "Sobre PRC4 lado largo" + +msgid "Envelope PRC5 Long Edge" +msgstr "Sobre PRC5 lado largo" + +msgid "Envelope PRC5PRC5" +msgstr "Sobre PRC5PRC5" + +msgid "Envelope PRC6" +msgstr "Sobre PRC6" + +msgid "Envelope PRC6 Long Edge" +msgstr "Sobre PRC6 lado largo" + +msgid "Envelope PRC7" +msgstr "Sobre PRC7" + +msgid "Envelope PRC7 Long Edge" +msgstr "Sobre PRC7 lado largo" + +msgid "Envelope PRC8" +msgstr "Sobre PRC8" + +msgid "Envelope PRC8 Long Edge" +msgstr "Sobre PRC8 lado largo" + +msgid "Envelope PRC9" +msgstr "Sobre PRC9" + +msgid "Envelope PRC9 Long Edge" +msgstr "Sobre PRC9 lado largo" + +msgid "Envelope Personal" +msgstr "Sobre Personal" + +msgid "Envelope You4" +msgstr "Sobre You4" + +msgid "Envelope You4 Long Edge" +msgstr "Sobre You4 lado largo" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Directiva de error" + +msgid "Error sending raster data." +msgstr "Error enviando trama de datos (raster)." + +msgid "Error: need hostname after \"-h\" option." +msgstr "Error: se necesita un nombre de ordenador tras la opción \"-h\"." + +msgid "Every 10 Labels" +msgstr "Cada 10 etiquetas" + +msgid "Every 2 Labels" +msgstr "Cada 2 etiquetas" + +msgid "Every 3 Labels" +msgstr "Cada 3 etiquetas" + +msgid "Every 4 Labels" +msgstr "Cada 4 etiquetas" + +msgid "Every 5 Labels" +msgstr "Cada 5 etiquetas" + +msgid "Every 6 Labels" +msgstr "Cada 6 etiquetas" + +msgid "Every 7 Labels" +msgstr "Cada 7 etiquetas" + +msgid "Every 8 Labels" +msgstr "Cada 8 etiquetas" + +msgid "Every 9 Labels" +msgstr "Cada 9 etiquetas" + +msgid "Every Label" +msgstr "Cada etiqueta" + +msgid "Executive" +msgstr "Ejecutivo" + +msgid "Expectation Failed" +msgstr "Lo que se esperaba, falló." + +msgid "Export Printers to Samba" +msgstr "Exportar impresoras a Samba" + +msgid "FAIL" +msgstr "FALLO" + +msgid "FanFold German" +msgstr "FanFold alemán" + +msgid "FanFold Legal German" +msgstr "FanFold Legal alemán" + +msgid "Fanfold US" +msgstr "FanFold de EE.UU" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "El archivo \"%s\" contiene una ruta relativa." + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "El archivo \"%s\" tiene permisos no seguros (0%o/uid=%d/gid=%d)." + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "El archivo \"%s\" es un directorio." + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "Archivo \"%s\" no disponible: %s" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "Permisos del archivo \"%s\" OK (0%o/uid=%d/gid=%d)." + +msgid "File Folder" +msgstr "Carpeta de archivos" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Carpeta de archivosr - 9/16 x 3 7/16 pulg." + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" +"Los URIs del dispositivo de archivo han sido deshabilitados. Para " +"habilitarlos, vea la directiva FileDevice en \"%s/cupsd.conf\"." + +#, c-format +msgid "Finished page %d." +msgstr "Acabada la página %d." + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Prohibido" + +#, c-format +msgid "Formatting page %d." +msgstr "Formateando página %d." + +msgid "General" +msgstr "General" + +msgid "Generic" +msgstr "Genérico" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU usa una longitud indefinida" + +msgid "Glossy Paper" +msgstr "Papel satinado" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "Se ha obtenido el atributo printer-uri pero no el job-id." + +msgid "Grayscale" +msgstr "Escale de grises" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Carpeta colgante" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Carpeta colgante - 9/16 x 2 pulg." + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Carácter de control ilegal" + +msgid "Illegal main keyword string" +msgstr "Cadena de clave principal ilegal" + +msgid "Illegal option keyword string" +msgstr "Cadena de clave de opción ilegal" + +msgid "Illegal translation string" +msgstr "Cadena de traducción ilegal" + +msgid "Illegal whitespace character" +msgstr "Carácter de espacio en blanco ilegal" + +msgid "Installable Options" +msgstr "Opciones instalables" + +msgid "Installed" +msgstr "Instalada" + +msgid "IntelliBar Label Printer" +msgstr "Impresora de etiquetas IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "Error interno del servidor" + +msgid "Internal error" +msgstr "Error interno" + +msgid "Internet Postage 2-Part" +msgstr "Correo por Internet Parte-2" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Correo por Internet Parte-2 - 2 1/4 x 7 1/2 pulg." + +msgid "Internet Postage 3-Part" +msgstr "Correo por Internet Parte-3" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Correo por Internet Parte-3 - 2 1/4 x 7 pulg." + +msgid "Internet Printing Protocol" +msgstr "Protocolo de Impresión de Internet IPP" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "JIS B0" + +msgid "JIS B1" +msgstr "JIS B1" + +msgid "JIS B10" +msgstr "JIS B10" + +msgid "JIS B2" +msgstr "JIS B2" + +msgid "JIS B3" +msgstr "JIS B3" + +msgid "JIS B4" +msgstr "JIS B4" + +msgid "JIS B4 Long Edge" +msgstr "JIS B4 lado largo" + +msgid "JIS B5" +msgstr "JIS B5" + +msgid "JIS B5 Long Edge" +msgstr "JIS B5 lado largo" + +msgid "JIS B6" +msgstr "JIS B6" + +msgid "JIS B6 Long Edge" +msgstr "JIS B6 lado largo" + +msgid "JIS B7" +msgstr "JIS B7" + +msgid "JIS B8" +msgstr "JIS B8" + +msgid "JIS B9" +msgstr "JIS B9" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "El trabajo #%d no puede ser reiniciado - no hay archivos." + +#, c-format +msgid "Job #%d does not exist." +msgstr "El trabajo #%d no existe." + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "El trabajo #%d ya está anulado - no se puede cancelar." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "El trabajo #%d ya está cancelado - no se puede cancelar." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "El trabajo #%d ya ha sido completado - no se puede cancelar." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "El trabajo #%d ha terminado y no puede ser modificado." + +#, c-format +msgid "Job #%d is not complete." +msgstr "El trabajo #%d no ha sido completado." + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "El trabajo #%d no está retenido para autentificación." + +#, c-format +msgid "Job #%d is not held." +msgstr "El trabajo #%d no está retenido." + +msgid "Job Completed" +msgstr "Trabajo completado" + +msgid "Job Created" +msgstr "Trabajo creado" + +msgid "Job ID: " +msgstr "ID del trabajo: " + +msgid "Job Options Changed" +msgstr "Opciones de trabajo cambiadas" + +msgid "Job Stopped" +msgstr "Trabajo detenido" + +msgid "Job UUID: " +msgstr "UUID del trabajo: " + +msgid "Job is completed and cannot be changed." +msgstr "El trabajo está terminado y no puede ser cambiado." + +msgid "Job operation failed:" +msgstr "La operación del trabajo ha fallado:" + +msgid "Job state cannot be changed." +msgstr "No se puede cambiar el estado del trabajo." + +msgid "Job subscriptions cannot be renewed." +msgstr "Las suscripciones de trabajos no han podido ser renovadas." + +msgid "Jobs" +msgstr "Trabajos" + +msgid "LPD/LPR Host or Printer" +msgstr "Equipo o impresora LPD/LPR" + +msgid "Label Printer" +msgstr "Impresora de etiquetas" + +msgid "Label Top" +msgstr "Parte superior de la etiqueta" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "No se admite el uso del idioma \"%s\"." + +msgid "Large Address" +msgstr "Dirección grande" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Dirección grande - 1 4/10 x 3 1/2 pulg." + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "Carta Extragrande" + +msgid "Letter Oversize Long Edge" +msgstr "Carta Extragrande lado largo" + +msgid "Light" +msgstr "Ligero" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Línea más larga que el máximo permitido (255 caracteres)" + +msgid "List Available Printers" +msgstr "Listar impresoras disponibles" + +msgid "Loading print file." +msgstr "Cargando archivo de impresión." + +msgid "Location: " +msgstr "Ubicación: " + +msgid "Long-Edge (Portrait)" +msgstr "Lado largo (retrato)" + +msgid "Looking for printer." +msgstr "Buscando impresora." + +msgid "Make and Model: " +msgstr "Marca y modelo: " + +msgid "Manual Feed" +msgstr "Alimentación manual" + +msgid "Media Dimensions: " +msgstr "Dimensiones del papel: " + +msgid "Media Limits: " +msgstr "Límites del papel: " + +msgid "Media Name: " +msgstr "Nombre del soporte: " + +msgid "Media Size" +msgstr "Tamaño de papel" + +msgid "Media Source" +msgstr "Fuente del papel" + +msgid "Media Tracking" +msgstr "Seguimiento del medio" + +msgid "Media Type" +msgstr "Tipo de papel" + +msgid "Medium" +msgstr "Media" + +msgid "Memory allocation error" +msgstr "Error de reserva de memoria" + +msgid "Missing CloseGroup" +msgstr "Falta CloseGroup" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Falta cabecera PPD-Adobe-4.x" + +msgid "Missing asterisk in column 1" +msgstr "Falta un asterisco en la columna 1" + +msgid "Missing document-number attribute." +msgstr "Falta el atributo document-number." + +#, c-format +msgid "Missing double quote on line %d." +msgstr "Faltan dobles comillas en línea %d." + +msgid "Missing form variable" +msgstr "Falta una variable de formulario" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "Falta media o media-col." + +msgid "Missing media-size in media-col." +msgstr "Falta media-size en media-col." + +msgid "Missing notify-subscription-ids attribute." +msgstr "Falta el atributo notify-subscription-ids." + +msgid "Missing option keyword" +msgstr "Falta cadena de clave de opción" + +msgid "Missing requesting-user-name attribute." +msgstr "Falta el atributo requesting-user-name." + +msgid "Missing required attributes." +msgstr "Faltan atributos necesarios." + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "Falta un valor en la línea %d del archivo de rótulo." + +#, c-format +msgid "Missing value on line %d." +msgstr "Falta un valor en la línea %d." + +msgid "Missing value string" +msgstr "Falta cadena de valores" + +msgid "Missing x-dimension in media-size." +msgstr "Falta x-dimension en media-size." + +msgid "Missing y-dimension in media-size." +msgstr "Falta y-dimension en media-size." + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" +"Modelo: nombre = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" + +msgid "Modify Class" +msgstr "Modificar clase" + +msgid "Modify Printer" +msgstr "Modificar impresora" + +msgid "Move All Jobs" +msgstr "Mover todos los trabajos" + +msgid "Move Job" +msgstr "Mover trabajo" + +msgid "Moved Permanently" +msgstr "Movido permanentemente" + +msgid "NULL PPD file pointer" +msgstr "Puntero de archivo PPD NULO" + +msgid "Name OID uses indefinite length" +msgstr "Nombre OID usa una longitud indefinida" + +msgid "Nested classes are not allowed." +msgstr "No se permiten clases anidadas." + +msgid "Never" +msgstr "Nunca" + +msgid "New Stylus Color Series" +msgstr "Nueva Stylus Color Series" + +msgid "New Stylus Photo Series" +msgstr "Nueva Stylus Photo Series" + +msgid "No" +msgstr "No" + +msgid "No Content" +msgstr "No hay contenido" + +msgid "No PPD name" +msgstr "No hay nombre de PPD" + +msgid "No VarBind SEQUENCE" +msgstr "No hay Varbind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "No está instalado ningún controlador de impresora de Windows." + +msgid "No active connection" +msgstr "No hay conexión activa" + +#, c-format +msgid "No active jobs on %s." +msgstr "No hay trabajos activos en %s." + +msgid "No attributes in request." +msgstr "No hay atributos en la solicitud." + +msgid "No authentication information provided." +msgstr "No se ha proporcionado información de autentificación." + +msgid "No community name" +msgstr "No hay nombre de comunidad" + +msgid "No default printer." +msgstr "No hay impresora predeterminada." + +msgid "No destinations added." +msgstr "No se han añadido destinos." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" +"No se ha encontrado el URI del dispositivo en argv[0] o en la variable de " +"entorno DEVICE_URI." + +msgid "No error-index" +msgstr "No hay error-index" + +msgid "No error-status" +msgstr "No hay error-status" + +msgid "No file in print request." +msgstr "No hay ningún archivo en la petición de impresión." + +msgid "No fonts in charset file." +msgstr "No hay fuentes en el archivo de juego de caracteres." + +msgid "No modification time" +msgstr "No hay tiempo de modificación" + +msgid "No name OID" +msgstr "No hay nombre OID" + +msgid "No pages were found." +msgstr "No se han encontrado páginas." + +msgid "No printer name" +msgstr "No hay nombre de impresora" + +msgid "No printer-uri found" +msgstr "No se encontró printer-uri" + +msgid "No printer-uri found for class" +msgstr "No se encontró printer-uri para la clase" + +msgid "No printer-uri in request." +msgstr "No hay printer-uri en la petición." + +msgid "No request-id" +msgstr "No hay request-id" + +msgid "No subscription attributes in request." +msgstr "No hay atributos de subscripción en la solicitud." + +msgid "No subscriptions found." +msgstr "No se han encontrado subscripciones." + +msgid "No variable-bindings SEQUENCE" +msgstr "No hay variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "No hay número de versión" + +msgid "Non-continuous (Mark sensing)" +msgstr "No continuo (sensible a señal)" + +msgid "Non-continuous (Web sensing)" +msgstr "No continuo (sensible a web)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "No encontrado" + +msgid "Not Implemented" +msgstr "No implementado" + +msgid "Not Installed" +msgstr "No instalado" + +msgid "Not Modified" +msgstr "No modificado" + +msgid "Not Supported" +msgstr "No permitido" + +msgid "Not allowed to print." +msgstr "No se permite imprimir." + +msgid "Note" +msgstr "Nota" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" +"Nota: este programa sólo valida los comentarios DSC, no los PostScript." + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Desactivado (1 cara)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Ayuda en línea" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "La apertura de %s ha fallado: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup sin un CloseGroup previo" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI sin un CloseUI/JCLCloseUI previo" + +msgid "Operation Policy" +msgstr "Directiva de operación" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "La opción \"%s\" no puede incluirse via %%%%IncludeFeature." + +msgid "Options Installed" +msgstr "Opciones instaladas" + +msgid "Options:" +msgstr "Opciones: " + +msgid "Options: " +msgstr "Opciones: " + +msgid "Out of date PPD cache file." +msgstr "Archivo de caché PPD obsoleto." + +msgid "Out of memory." +msgstr "Sin memoria." + +msgid "Output Mode" +msgstr "Modo de salida" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "La salida de la impresora %s se ha enviado a %s" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" +"La salida de la impresora %s se ha enviado a la impresora remota %s en %s" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "La salida de la impresora %s/%s se ha enviado a %s" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" +"La salida de la impresora %s/%s se ha enviado a la impresora remota %s en %s" + +msgid "PASS" +msgstr "PASA" + +msgid "PCL Laser Printer" +msgstr "Impresora Laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "PRC16K lado largo" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "PRC32K lado largo" + +msgid "PRC32K Oversize" +msgstr "PRC32K Extragrande" + +msgid "PRC32K Oversize Long Edge" +msgstr "PRC32K Extragrande lado largo" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "El paquete no contiene un Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "El paquete no empieza por SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "¿Contraseña de %s en %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Se requiere la contraseña de %s para acceder a %s vía SAMBA: " + +msgid "Pause Class" +msgstr "Pausar clase" + +msgid "Pause Printer" +msgstr "Pausar impresora" + +msgid "Peel-Off" +msgstr "Despegar" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Foto pequeña" + +msgid "Plain Paper" +msgstr "Papel normal" + +msgid "Policies" +msgstr "Reglas" + +msgid "Port Monitor" +msgstr "Monitor de puerto" + +msgid "PostScript Printer" +msgstr "Impresora PostScript" + +msgid "Postcard" +msgstr "Postal" + +msgid "Postcard Double " +msgstr "Postal doble" + +msgid "Postcard Double Long Edge" +msgstr "Postal doble lado largo" + +msgid "Postcard Long Edge" +msgstr "Postal lado largo" + +msgid "Print Density" +msgstr "Densidad de impresión" + +msgid "Print Job:" +msgstr "Imprimir trabajo:" + +msgid "Print Mode" +msgstr "Modo de impresión" + +msgid "Print Rate" +msgstr "Tasa de impresión" + +msgid "Print Self-Test Page" +msgstr "Imprimir página de auto-prueba" + +msgid "Print Speed" +msgstr "Velocidad de impresión" + +msgid "Print Test Page" +msgstr "Imprimir página de prueba" + +msgid "Print and Cut" +msgstr "Imprimir y cortar" + +msgid "Print and Tear" +msgstr "Imprimir y romper" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "Archivo de impresión aceptado: ID de trabajo %d." + +msgid "Print file accepted - job ID unknown." +msgstr "Archivo de impresión aceptado: ID de trabajo desconocido." + +msgid "Print file sent." +msgstr "Archivo de impresión enviado." + +msgid "Print file was not accepted." +msgstr "No se ha aceptado el archivo de impresión." + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Impreso para: " + +msgid "Printed From: " +msgstr "Impreso desde: " + +msgid "Printed On: " +msgstr "Impreso en: " + +msgid "Printer Added" +msgstr "Impresora añadida" + +msgid "Printer Default" +msgstr "Predeterminado de la impresora" + +msgid "Printer Deleted" +msgstr "Impresora borrada" + +msgid "Printer Modified" +msgstr "Impresora modificada" + +msgid "Printer Name: " +msgstr "Nombre de la impresora: " + +msgid "Printer Paused" +msgstr "Impresora en pausa" + +msgid "Printer Settings" +msgstr "Configuración de la impresora" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "Impresora ocupada; reintento en 10 segundos." + +msgid "Printer busy; will retry in 30 seconds." +msgstr "Impresora ocupada; reintento en 30 segundos." + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "La impresora no es compatible con IPP/%d.%d, probando IPP/%s." + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "La impresora está ocupada, reintento en 5 segundos." + +msgid "Printer is not currently connected." +msgstr "La impresora está sin conexión en estos momentos." + +msgid "Printer is now connected." +msgstr "La impresora ya tiene conexión." + +msgid "Printer is now online." +msgstr "La impresora ya está en línea." + +msgid "Printer is offline." +msgstr "La impresora está fuera de línea." + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "Impresora no conectada, reintento en 30 segundos." + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "Impresora no conectada; reintento en 30 segundos." + +msgid "Printer:" +msgstr "Impresora:" + +msgid "Printers" +msgstr "Impresoras" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "Imprimiendo página %d, %d%% completado." + +#, c-format +msgid "Printing page %d." +msgstr "Imprimiendo página %d." + +msgid "Purge Jobs" +msgstr "Purgar trabajos" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Se ha alcanzado el límite de cuota." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "Rango Propiet. Trabajo Archivo(s) Tamaño total" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" +"Rango Propiet. Pri Trabajo Archivos Tamaño total" + +msgid "Ready to print." +msgstr "Lista para imprimir." + +msgid "Reject Jobs" +msgstr "Rechazar trabajos" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "El ordenador remoto no ha aceptado el archivo de control (%d)." + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "El ordenador remoto no ha aceptado el archivo de datos (%d)." + +msgid "Reprint After Error" +msgstr "Volver a imprimir tras un error" + +msgid "Request Entity Too Large" +msgstr "La entidad requerida es demasiado larga" + +msgid "Resolution" +msgstr "Resolución" + +msgid "Resume Class" +msgstr "Reanudar clase" + +msgid "Resume Printer" +msgstr "Reanudar impresora" + +msgid "Return Address" +msgstr "Remite" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Remite - 3/4 x 2 pulg." + +msgid "Rewind" +msgstr "Rebobinar" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "Ejecutando comando: %s %s -N -A %s -c '%s'" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE usa una longitud indefinida" + +msgid "SSL/TLS Negotiation Error" +msgstr "Error en negociación SSL/TLS" + +msgid "See Other" +msgstr "Ver otros" + +msgid "Sending data to printer." +msgstr "Enviando datos a la impresora." + +#, c-format +msgid "Serial Port #%d" +msgstr "Puerto serie #%d" + +msgid "Server Restarted" +msgstr "Servidor reiniciado" + +msgid "Server Security Auditing" +msgstr "Auditoría de seguridad del servidor" + +msgid "Server Started" +msgstr "Servidor iniciado" + +msgid "Server Stopped" +msgstr "Servidor parado" + +msgid "Service Unavailable" +msgstr "Servicio no disponible" + +msgid "Set Allowed Users" +msgstr "Establecer usuarios permitidos" + +msgid "Set As Server Default" +msgstr "Establecer como predeterminada del servidor" + +msgid "Set Class Options" +msgstr "Cambiar opciones clase" + +msgid "Set Printer Options" +msgstr "Cambiar opciones impresora" + +msgid "Set Publishing" +msgstr "Hacer pública" + +msgid "Shipping Address" +msgstr "Dirección de envío" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Dirección de envío - 2 5/16 x 4 pulg." + +msgid "Short-Edge (Landscape)" +msgstr "Lado corto (apaisado)" + +msgid "Special Paper" +msgstr "Papel especial" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "Guardando trabajo en cola, %.0f%% completado." + +msgid "Standard" +msgstr "Estándar" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Rótulo inicial" + +#, c-format +msgid "Starting page %d." +msgstr "Iniciando página %d." + +msgid "Statement" +msgstr "Declaración" + +msgid "Stylus Color Series" +msgstr "Stylus Color Series" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Series" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "Subscripción #%d no existe." + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B (13 x 19 pulg.)" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Protocolos de conexión" + +msgid "Tabloid" +msgstr "Tabloide" + +msgid "Tabloid Oversize" +msgstr "Tabloide Extragrande" + +msgid "Tabloid Oversize Long Edge" +msgstr "Tabloide Extragrande lado largo" + +msgid "Tear" +msgstr "Pestaña" + +msgid "Tear-Off" +msgstr "Pestaña desprendible" + +msgid "Tear-Off Adjust Position" +msgstr "Ajuste de posición de la pestaña desprendible" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "El atributo %s no puede ser usado con jobs-ids." + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "No se ha podido encontrar el archivo PPD \"%s\"." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "No se ha podido abrir el archivo PPD \"%s\": %s" + +msgid "The PPD file could not be opened." +msgstr "No se ha podido abrir el archivo PPD." + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"El nombre de la clase sólo puede contener hasta 127 caracteres imprimibles y " +"no puede contener espacios, barras (/), o la almohadilla (#)." + +msgid "The developer unit needs to be replaced." +msgstr "La unidad de revelado debe ser reemplazada" + +msgid "The developer unit will need to be replaced soon." +msgstr "La unidad de revelado necesitará ser cambiada pronto." + +msgid "The fuser's temperature is high." +msgstr "Temperatura del fusor alta" + +msgid "The fuser's temperature is low." +msgstr "Temperatura del fusor baja" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"El atributo notify-lease-duration no puede ser usado con subscripciones de " +"trabajos." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "El valor notify-user-data es demasiado grande (%d > 63 octetos)." + +msgid "The optical photoconductor needs to be replaced." +msgstr "El fotoconductor óptico necesita ser cambiado." + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "El fotoconductor óptico necesitará ser cambiado pronto." + +msgid "The output bin is almost full." +msgstr "Recipiente de salida casi lleno" + +msgid "The output bin is full." +msgstr "Bandeja de salida llena." + +msgid "The output bin is missing." +msgstr "Falta la bandeja de salida." + +msgid "The page setup information was not valid." +msgstr "La información de configuración de página no era válida." + +msgid "The paper tray is almost empty." +msgstr "Bandeja de papel casi vacía." + +msgid "The paper tray is empty." +msgstr "Bandeja de papel vacía." + +msgid "The paper tray is missing." +msgstr "Falta la bandeja de papel." + +msgid "The paper tray needs to be filled." +msgstr "Hay que poner papel en la bandeja." + +msgid "The print file could not be opened." +msgstr "No se ha podido abrir el archivo de impresión." + +msgid "The printer URI is incorrect or no longer exists." +msgstr "El URI de la impresora es incorrecto o ya no existe." + +msgid "The printer is busy." +msgstr "La impresora está ocupada." + +msgid "The printer is not connected." +msgstr "La impresora no está conectada." + +msgid "The printer is not responding." +msgstr "La impresora no responde." + +msgid "The printer is out of ink." +msgstr "La impresora no tiene tinta." + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "La impresora es inalcanzable en este momento." + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "La impresora puede no existir o no estar disponible en este momento." + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"El nombre de la impresora sólo puede contener hasta 127 caracteres " +"imprimibles y no puede contener espacios, barras (/), o la almohadilla (#)." + +msgid "The printer or class does not exist." +msgstr "La impresora o clase no existe." + +msgid "The printer or class is not shared." +msgstr "La impresora o clase no está compartida." + +msgid "The printer's cover is open." +msgstr "La tapa de la impresora está abierta." + +msgid "The printer's door is open." +msgstr "La puerta de la impresora está abierta." + +msgid "The printer's interlock is open." +msgstr "El dispositivo de seguridad de la impresora está abierto." + +msgid "The printer's waste bin is almost full." +msgstr "Recipiente de residuos de la impresora está casi lleno." + +msgid "The printer's waste bin is full." +msgstr "Recipiente de residuos de la impresora está lleno." + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "El printer-uri \"%s\" contiene caracteres no válidos." + +msgid "The printer-uri attribute is required." +msgstr "Se necesita el atributo printer-uri." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/classes/" +"NOMBRE_CLASE\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"El printer-uri debe ser de la forma \"ipp://NOMBRE_ORDENADOR/printers/" +"NOMBRE_IMPRESORA\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"El nombre de la subscripción no puede contener espacios, barras (/), signos " +"de interrogación (?), o la almohadilla (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" +"La interfaz web está desactivada en este momento. Ejecute \"cupsctl " +"WebInterface=yes\" para activarla." + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "No se admite el uso del valor which-jobs \"%s\"." + +msgid "There are too many subscriptions." +msgstr "Hay demasiadas subscripciones." + +msgid "There is a paper jam." +msgstr "Hay un atasco de papel." + +msgid "There was an unrecoverable USB error." +msgstr "Ha habido un error USB irrecuperable." + +msgid "Thermal Transfer Media" +msgstr "Soporte de transferencia térmica" + +msgid "Title: " +msgstr "Título: " + +msgid "Too many active jobs." +msgstr "Demasiados trabajos activos." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "Demasiados valores de job-sheets (%d > 2)." + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "Demasiados valores printer-state-reasons (%d > %d)." + +msgid "Transparency" +msgstr "Transparencia" + +msgid "Tray" +msgstr "Bandeja" + +msgid "Tray 1" +msgstr "Bandeja 1" + +msgid "Tray 2" +msgstr "Bandeja 2" + +msgid "Tray 3" +msgstr "Bandeja 3" + +msgid "Tray 4" +msgstr "Bandeja 4" + +msgid "URI Too Long" +msgstr "URI demasiado largo" + +msgid "US Ledger" +msgstr "Libro Mayor, 17 x 11 pulg." + +msgid "US Legal" +msgstr "Legal EE.UU." + +msgid "US Legal Oversize" +msgstr "Legal EE.UU. Extragrande" + +msgid "US Letter" +msgstr "Carta EE.UU." + +msgid "US Letter Long Edge" +msgstr "Carta EE.UU. lado largo" + +msgid "US Letter Oversize" +msgstr "Carta EE.UU. Extragrande" + +msgid "US Letter Oversize Long Edge" +msgstr "Carta EE.UU. Extragrande lado largo" + +msgid "US Letter Small" +msgstr "Carta EE.UU. Pequeña" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Puerto serie USB #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "No se ha podido acceder al archivo cupsd.conf" + +msgid "Unable to add RSS subscription:" +msgstr "No se ha podido añadir la subscripción RSS:" + +msgid "Unable to add class:" +msgstr "No se ha podido añadir la clase:" + +msgid "Unable to add document to print job." +msgstr "No se ha podido añadir el documento al trabajo de impresión." + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "No se ha podido añadir el trabajo para el destino \"%s\"." + +msgid "Unable to add printer:" +msgstr "No se ha podido añadir la impresora:" + +msgid "Unable to allocate memory for file types." +msgstr "No se ha podido reservar memoria para tipos de archivo." + +msgid "Unable to allocate memory for page info" +msgstr "No se ha podido reservar memoria para la información de página." + +msgid "Unable to allocate memory for pages array" +msgstr "No se ha podido reservar memoria para la secuencia de páginas" + +msgid "Unable to cancel RSS subscription:" +msgstr "No se ha podido cancelar la subscripción RSS:" + +msgid "Unable to cancel print job." +msgstr "No se ha podido cancelar el trabajo de impresión." + +msgid "Unable to change printer-is-shared attribute:" +msgstr "No se ha podido cambiar el atributo printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "No se ha podido cambiar la impresora:" + +msgid "Unable to change server settings:" +msgstr "No se ha podido cambiar la configuración del servidor:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "No se ha podido conectar al servidor." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" +"No se ha podido contactar con la impresora; poniendo en cola en la siguiente " +"impresora de la clase." + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" +"No se han podido copiar los archivos del controlador de impresora de 64-bit " +"de CUPS (%d)." + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" +"No se han podido copiar los archivos del controlador de impresora de 64-bit " +"de Windows (%d)." + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" +"No se han podido copiar los archivos del controlador de impresora de CUPS (%" +"d)." + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "No se ha podido copiar el archivo PPD - %s" + +msgid "Unable to copy PPD file." +msgstr "No se ha podido copiar el archivo PPD." + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" +"No se han podido copiar los archivos del controlador de impresora de Windows " +"2000 (%d)." + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" +"No se han podido copiar los archivos del controlador de impresora de Windows " +"9x (%d)." + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "No se ha podido copiar el script de interfaz - %s" + +msgid "Unable to copy print file" +msgstr "No se ha podido copiar el archivo de impresión" + +msgid "Unable to create compressed print file" +msgstr "No se ha podido crear el archivo de impresión comprimido" + +msgid "Unable to create pipes for filters" +msgstr "No se han podido crear tuberías (pipes) para filtros" + +msgid "Unable to create printer-uri" +msgstr "No se ha podido crear printer-uri" + +msgid "Unable to create temporary file" +msgstr "No se ha podido crear el archivo temporal" + +msgid "Unable to create temporary file:" +msgstr "No se ha podido crear el archivo temporal:" + +msgid "Unable to delete class:" +msgstr "No se ha podido borrar la clase:" + +msgid "Unable to delete printer:" +msgstr "No se ha podido borrar la impresora:" + +msgid "Unable to do maintenance command:" +msgstr "No se ha podido realizar el comando de mantenimiento:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "No se pueden editar archivos cupsd.conf mayores de 1MB" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (cadena " +"certificado incorrecta)." + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (el " +"certificado aún no es válido)." + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (certificado " +"caducado)." + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (el nombre de " +"ordenador no coincide)." + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (el par cortó " +"la conexión antes de responder)." + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (certificado " +"auto-firmado)." + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" +"No se ha podido establecer una conexión segura con el servidor (certificado " +"no seguro)." + +msgid "Unable to establish a secure connection to host." +msgstr "No se ha podido establecer una conexión segura al servidor." + +msgid "Unable to find destination for job" +msgstr "No se ha podido encontrar destino para el trabajo" + +msgid "Unable to find printer." +msgstr "No se ha podido encontrar la impresora." + +msgid "Unable to fork filter" +msgstr "No se ha podido bifurcar (fork) el filtro" + +msgid "Unable to generate compressed print file" +msgstr "No se ha podido crear el archivo de impresión comprimido" + +msgid "Unable to get backend exit status." +msgstr "No se ha podido obtener el estado de salida del programa backend" + +msgid "Unable to get class list:" +msgstr "No se ha podido obtener la lista de clases:" + +msgid "Unable to get class status:" +msgstr "No se ha podido obtener el estado de la clase:" + +msgid "Unable to get list of printer drivers:" +msgstr "No se ha podido obtener la lista de controladores de impresora:" + +msgid "Unable to get printer attributes:" +msgstr "No se han podido obtener los atributos de la impresora:" + +msgid "Unable to get printer list:" +msgstr "No se ha podido obtener la lista de impresoras:" + +msgid "Unable to get printer status." +msgstr "No se ha podido obtener el estado de la impresora." + +msgid "Unable to get printer status:" +msgstr "No se ha podido obtener el estado de la impresora" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" +"No se han podido instalar los archivos del controlador de impresora de " +"Windows 2000 (%d)." + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" +"No se han podido instalar los archivos del controlador de impresora de " +"Windows 9x (%d)." + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "No se ha podido localizar la impresora \"%s\"." + +msgid "Unable to locate printer." +msgstr "No se ha podido localizar la impresora." + +msgid "Unable to modify class:" +msgstr "No se ha podido modificar la clase:" + +msgid "Unable to modify printer:" +msgstr "No se ha podido modificar la impresora:" + +msgid "Unable to move job" +msgstr "No se ha podido mover el trabajo" + +msgid "Unable to move jobs" +msgstr "No se han podido mover los trabajos" + +msgid "Unable to open PPD file" +msgstr "No se ha podido abrir el archivo PPD" + +msgid "Unable to open PPD file:" +msgstr "No se ha podido abrir el archivo PPD:" + +msgid "Unable to open charset file" +msgstr "No se ha podido abrir el archivo del juego de caracteres" + +msgid "Unable to open compressed print file" +msgstr "No se ha podido abrir el archivo de impresión comprimido" + +msgid "Unable to open cupsd.conf file:" +msgstr "No se ha podido abrir el archivo cupsd.conf:" + +msgid "Unable to open device file" +msgstr "No se ha podido abrir el archivo de dispositivo" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "No se ha podido abrir el documento #%d del trabajo #%d." + +msgid "Unable to open print file" +msgstr "No se ha podido abrir el archivo de impresión" + +msgid "Unable to open psglyphs" +msgstr "No se ha podido abrir psglyphs" + +msgid "Unable to open raster file" +msgstr "No se ha podido abrir el archivo de trama de datos (raster)" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "No se han podido imprimir %d columnas de texto." + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "No se han podido imprimir %dx%d páginas de texto." + +msgid "Unable to print test page:" +msgstr "No se ha podido imprimir la página de prueba:" + +msgid "Unable to read print data" +msgstr "No se han podido leer los datos de impresión" + +msgid "Unable to read print data." +msgstr "No se han podido leer los datos de impresión." + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "No se ha podido ejecutar \"%s\": %s" + +msgid "Unable to see in file" +msgstr "No se ha podido mirar en el archivo" + +msgid "Unable to send command to printer driver" +msgstr "No se ha podido enviar un comando al controlador de la impresora" + +msgid "Unable to send data to printer." +msgstr "No se han podido enviar datos a la impresora." + +msgid "Unable to send raster data to the driver." +msgstr "No se ha podido enviar la trama de datos (raster) al controlador." + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" +"No se ha podido configurar el controlador de impresora de Windows (%d)." + +msgid "Unable to set options:" +msgstr "No se han podido cambiar las opciones:" + +msgid "Unable to set server default:" +msgstr "No se han podido cambiar los ajustes predeterminados del servidor:" + +msgid "Unable to start backend process." +msgstr "No se ha podido iniciar el proceso backend." + +msgid "Unable to upload cupsd.conf file:" +msgstr "No se ha podido copiar el archivo cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" +"No se ha podido usar el controlador de dispositivo de clase USB obsoleto." + +msgid "Unable to write print data" +msgstr "No se han podido escribir los datos de impresión" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "No se han podido escribir los datos de impresión sin comprimir: %s" + +msgid "Unauthorized" +msgstr "No autorizado" + +msgid "Units" +msgstr "Unidades" + +msgid "Unknown" +msgstr "Desconocido" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "Preferencia \"%s\" desconocida para la opción \"%s\"." + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "Valor de opción de cifrado \"%s\" desconocida." + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "Orden de archivos \"%s\" desconocido." + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "Carácter de formato \"%c\" desconocido." + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "Opción \"%s\" con valor \"%s\" desconocida." + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "Opción \"%s\" desconocida" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "Modo de impresión \"%s\" desconocido." + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "printer-error-policy \"%s\" incorrecto." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "printer-op-policy \"%s\" incorrecto." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "Valor de opción de versión \"%s\" desconocida." + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "Velocidad en baudios %s no permitida." + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "Valor de brillo %s no permitido; usando brillo=100." + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "Juego de caracteres \"%s\" no permitido." + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "Compresión \"%s\" no permitida." + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "document-format \"%s\" no permitido." + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "document-format \"%s/%s\" no permitido." + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "Formato \"%s\" no permitido." + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "Valor gamma %s no permitido; usando gamma=1000." + +msgid "Unsupported margins." +msgstr "Márgenes no permitidos." + +msgid "Unsupported media value." +msgstr "Valor del medio no permitido." + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" +"Valor de number-up (páginas por hoja) %d no permitido; usando number-up=1." + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" +"Valor de number-up-layout (disposición de páginas por hoja) %s no permitido; " +"usando number-up-layout=lrtb." + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" +"Valor de page-border (borde de página) %s no permitido; usando page-" +"border=none (ninguno)." + +msgid "Unsupported raster data." +msgstr "Trama de datos no permitidos." + +msgid "Unsupported value type" +msgstr "Tipo de valor no permitido" + +msgid "Upgrade Required" +msgstr "Se requiere actualización" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" +"Uso:\n" +"\n" +" lpadmin [-h servidor] -d destino\n" +" lpadmin [-h servidor] -x destino\n" +" lpadmin [-h servidor] -p impresora [-c clase] [-i interfaz] [-m modelo]\n" +" [-r clase] [-v dispositivo] [-D descripción]\n" +" [-P archivo_ppd] [-o nombre=valor]\n" +" [-u allow:usuario,usuario] [-u deny:usuario,usuario]" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "Uso: %s trabajo usuario título copias opciones [archivo]" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "Uso: %s job-id usuario título copias opciones [archivo]" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "Uso: %s job-id usuario título copias opciones archivo" + +msgid "Usage: convert [ options ]" +msgstr "Uso: convert ( opciones )" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "Uso: cupsaddsmb [opciones] impresora1 ... impresoraN" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "Uso: cupsctl [opciones] [param=valor ... paramN=valorN]" + +msgid "Usage: cupsd [options]" +msgstr "Uso: cupsd [opciones)" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "Uso: cupsfilter ( opciones ) archivo" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "Uso: cupstestdsc [opciones] nombre_archivo.ps [... nombre_archivo.ps]" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" +"Uso: cupstestppd [opciones] nombre_archivo1.ppd[.gz] [... nombre_archivoN.ppd" +"[.gz]]" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "Uso: ipptool [opciones] URI nombre_archivo [ ... nombre_archivoN ]" + +msgid "Usage: lpmove job/src dest" +msgstr "Uso: lpmove trabajo/fuente destino" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" +"Uso: lpoptions [-h servidor] [-E] -d impresora\n" +" lpoptions [-h servidor] [-E] [-p impresora] -l\n" +" lpoptions [-h servidor] [-E] -p impresora -o opción[=valor] ...\n" +" lpoptions [-h servidor] [-E] -x impresora" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "Uso: lppasswd [-g nombre_grupo]" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" +"Uso: lppasswd [-g nombre_grupo] [nombre_usuario]\n" +" lppasswd [-g nombre_grupo] -a [nombre_usuario]\n" +" lppasswd [-g nombre_grupo] -x [nombre_usuario]" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" +"Uso: lpq (-P dest) (-U nombre_usuario) (-h nombre_ordenador(:puerto)) (-l) " +"(+intervalo)" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "Uso: ppdc [opciones] nombre_archivo.drv [ ... nombre_archivoN.drv ]" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "Uso: ppdhtml [opciones] nombre_archivo.drv >nombre_archivo.html" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "Uso: ppdi [opciones] nombre_archivo.ppd [ ... nombre_archivoN.ppd ]" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" +"Uso: ppdmerge [opciones] nombre_archivo.ppd [ ... nombre_archivoN.ppd ]" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" +"Uso: ppdpo [opciones] -o nombre_archivo.po nombre_archivo.drv [ ... " +"nombre_archivoN.drv ]" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "Uso: snmp [ordenador-o-dirección-ip]" + +msgid "Value uses indefinite length" +msgstr "Valor usa una longitud indefinida" + +msgid "VarBind uses indefinite length" +msgstr "VarBind usa una longitud indefinida" + +msgid "Version uses indefinite length" +msgstr "Versión usa una longitud indefinida" + +msgid "Waiting for job to complete." +msgstr "Esperando a que finalice el trabajo." + +msgid "Waiting for printer to become available." +msgstr "Esperando a que la impresora esté disponible." + +msgid "Waiting for printer to finish." +msgstr "Esperando a que finalice la impresora." + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" +"Advertencia, no está instalado ningún controlador de impresora de Windows " +"2000." + +msgid "Web Interface is Disabled" +msgstr "La interfaz web está desactivada." + +msgid "Yes" +msgstr "Si" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Debe acceder a esta página usando el URL https://" +"%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" +"Su contraseña debe tener al menos 6 caracteres, no puede contener su nombre " +"de usuario, y debe tener al menos una letra y un número." + +msgid "ZPL Label Printer" +msgstr "Impresora de etiquetas ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "cancelado" + +msgid "canceled" +msgstr "cancelado" + +msgid "completed" +msgstr "completado" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "convert: Use la opción -f para especificar el archivo a convertir." + +msgid "cups-deviced failed to execute." +msgstr "Ha fallado al ejecutarse cups-deviced." + +msgid "cups-driverd failed to execute." +msgstr "Ha fallado al ejecutarse cups-driverd." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "cupsaddsmb: No hay archivo PPD para la impresora \"%s\" - %s" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "cupsctl: No se puede establecer Listen o Port directamente." + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "cupsctl: No se ha podido conectar al servidor: %s" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "cupsctl: Opción \"%s\" desconocida" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "cupsctl: Opción \"-%c\" desconocida" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" +"cupsd: Se esperaba un nombre de archivo de configuración tras la opción \"-c" +"\"." + +msgid "cupsd: Unable to get current directory." +msgstr "cupsd: No se ha podido obtener el directorio actual." + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "cupsd: Argumento \"%s\" desconocido - cancelando." + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "cupsd: Opción \"%c\" desconocida - cancelando." + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" +"cupsd: el uso de launchd(8) no ha sido compilado, ejecutándose en modo " +"normal." + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "cupsfilter: Número de documento %d no válido." + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "cupsfilter: ID de trabajo %d no válida." + +msgid "cupsfilter: Only one filename can be specified." +msgstr "cupsfilter: Solo se puede especificar un nombre de archivo." + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "cupsfilter: No se ha podido obtener el archivo del trabajo - %s" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "cupstestppd: La opción -q es incompatible con la opción -v." + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "cupstestppd: La opción -v es incompatible con la opción -q." + +#, c-format +msgid "device for %s/%s: %s" +msgstr "dispositivo para %s/%s: %s" + +#, c-format +msgid "device for %s: %s" +msgstr "dispositivo para %s: %s" + +msgid "error-index uses indefinite length" +msgstr "error-index usa una longitud indefinida" + +msgid "error-status uses indefinite length" +msgstr "error-status usa una longitud indefinida" + +msgid "held" +msgstr "retenido" + +msgid "help\t\tGet help on commands." +msgstr "help\t\tProporciona ayuda sobre los comandos." + +msgid "idle" +msgstr "inactiva" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "ipptool: \"-i\" y \"-n\" son incompatibles with -X\"." + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "ipptool: \"-i\" es incompatible with \"-X\"." + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "ipptool: \"-n\" es incompatible with \"-X\"." + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "ipptool: URI - %s incorrecto." + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "ipptool: Versión %s para \"-V\" incorrecta." + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "ipptool: Número de segundos no válido para \"-i\"." + +msgid "ipptool: May only specify a single URI." +msgstr "ipptool: Sólo se puede especificar un URI." + +msgid "ipptool: Missing count for \"-n\"." +msgstr "ipptool: Falta el contador para \"-n\"." + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "ipptool: Falta el nombre del archivo para \"-f\"." + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "ipptool: Falta un nombre=valor para \"-d\"." + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "ipptool: Falta el número de segundos para \"-i\"." + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "ipptool: Falta un tiempo de espera para \"-T\"." + +msgid "ipptool: Missing version for \"-V\"." +msgstr "ipptool: Falta la versión para \"-V\"." + +msgid "ipptool: URI required before test file." +msgstr "ipptool: Se requiere un URI antes del archivo de prueba." + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "ipptool: Opción \"-%c\" desconocida." + +msgid "job-printer-uri attribute missing." +msgstr "Falta el atributo job-printer-uri." + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" +"lpadmin: El nombre de la clase sólo puede contener caracteres imprimibles." + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "lpadmin: Se esperaba un PPD tras la opción \"-P\"." + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "lpadmin: Se esperaba allow/deny:lista_usuarios tras la opción \"-u\"." + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "lpadmin: Se esperaba una clase tras la opción \"-r\"." + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "lpadmin: Se esperaba un nombre de clase tras la opción \"-c\"." + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "lpadmin: Se esperaba una descripción tras la opción \"-D\"." + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "lpadmin: Se esperaba un URI de dispositivo tras la opción \"-v\"." + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "lpadmin: Se esperaba(n) tipo(s) de archivo(s) tras la opción \"-l\"." + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "lpadmin: Se esperaba un nombre de ordenador tras la opción \"-h\"." + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "lpadmin: Se esperaba una interfaz tras la opción \"-i\"." + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "lpadmin: Se esperaba una ubicación tras la opción \"-L\"." + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "lpadmin: Se esperaba un modelo tras la opción \"-m\"." + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "lpadmin: Se esperaba un nombre tras la opción \"-R\"." + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "lpadmin: Se esperaba un nombre=valor tras la opción \"-o\"." + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "lpadmin: Se esperaba una impresora tras la opción \"-p\"." + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "lpadmin: Se esperaba un nombre de impresora tras la opción \"-d\"." + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "lpadmin: Se esperaba una impresora o clase tras la opción \"-x\"." + +msgid "lpadmin: No member names were seen." +msgstr "lpadmin: No se han visto nombres de miembros" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "lpadmin: La impresora %s ya es miembro de la clase %s." + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "lpadmin: La impresora %s no es miembro de la clase %s." + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" +"lpadmin: El nombre de la impresora sólo puede contener caracteres " +"imprimibles." + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: No se ha podido añadir una impresora a la clase:\n" +" Debe especificar un nombre de impresora primero." + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "lpadmin: No se ha podido conectar al servidor: %s" + +msgid "lpadmin: Unable to create temporary file" +msgstr "lpadmin: No se ha podido crear el archivo temporal" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: No se ha podido borrar la opción:\n" +" Primero debe especificar un nombre de impresora." + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "lpadmin: No se ha podido abrir el archivo PPD \"%s\" - %s" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: No se ha podido quitar una impresora de la clase:\n" +" Primero debe especificar un nombre de impresora." + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: No se han podido establecer las opciones de impresora:\n" +" Primero debe especificar un nombre de impresora." + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "lpadmin: Opción allow/deny desconocida \"%s\"." + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "lpadmin: Argumento \"%s\" desconocido." + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "lpadmin: Opción \"%c\" desconocida." + +msgid "lpadmin: Warning - content type list ignored." +msgstr "lpadmin: Advertencia - lista de tipo de contenido no tenida en cuenta." + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" +"lpinfo: Se esperaba una cadena ID de dispositivo 1284 tras \"--device-id\"." + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "lpinfo: Se esperaba un idioma tras \"--language\"." + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "lpinfo: Se esperaba marca y modelo tras \"--make-and-model\"." + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "lpinfo: Se esperaba una cadena de producto tras \"--product\"." + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "lpinfo: Se esperaba una lista de esquemas tras \"--exclude-schemes\"." + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "lpinfo: Se esperaba una lista de esquemas tras \"--include-schemes\"." + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "lpinfo: Se esperaba un tiempo de espera tras \"--timeout\"." + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "lpinfo: Argumento \"%s\" desconocido." + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "lpinfo: Opción \"%c\" desconocida." + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "lpinfo: Opción \"%s\" desconocida." + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "lpmove: No se ha podido conectar al servidor: %s" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "lpmove: Argumento \"%s\" desconocido." + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "lpmove: Opción \"%c\" desconocida." + +msgid "lpoptions: No printers." +msgstr "lpoptions: No hay impresoras." + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "lpoptions: No se ha podido añadir la impresora o la instancia: %s" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "lpoptions: No se ha podido obtener el archivo PPD para %s: %s" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "lpoptions: No se ha podido abrir el archivo PPD para %s." + +msgid "lpoptions: Unknown printer or class." +msgstr "lpoptions: Impresora o clase desconocida." + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "lppasswd: Solo el usuario root puede añadir o borrar contraseñas." + +msgid "lppasswd: Password file busy." +msgstr "lppasswd: Archivo de contraseñas ocupado." + +msgid "lppasswd: Password file not updated." +msgstr "lppasswd: Archivo de contraseñas no actualizado." + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "lppasswd: Lo siento, la contraseña no coincide." + +msgid "lppasswd: Sorry, password rejected." +msgstr "lppasswd: Lo siento, la contraseña ha sido rechazada." + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "lppasswd: Lo siento, las contraseñas no coinciden." + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "lppasswd: No se ha podido copiar la cadena de contraseña: %s" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "lppasswd: No se ha podido abrir el archivo de contraseñas: %s" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "lppasswd: No se ha podido escribir en el archivo de contraseñas: %s" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" +"lppasswd: falló al hacer una copia de seguridad del antiguo archivo de " +"contraseñas: %s" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "lppasswd: falló al cambiar de nombre al archivo de contraseñas: %s" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "lppasswd: el usuario \"%s\" y el grupo \"%s\" no existen." + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" +"lpstat: error - Los nombre de variable de entorno %s no existen en el " +"destino \"%s\"." + +#, c-format +msgid "members of class %s:" +msgstr "miembros de la clase %s:" + +msgid "no entries" +msgstr "no hay entradas" + +msgid "no system default destination" +msgstr "no hay un destino predeterminado del sistema" + +msgid "notify-events not specified." +msgstr "notify-events no especificado." + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "El URI notify-recipient-uri \"%s\" ya está usado." + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "El URI notify-recipient-uri \"%s\" usa un esquema desconocido." + +msgid "pending" +msgstr "pendiente" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "ppdc: Añadiendo directorio include \"%s\"." + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "ppdc: Añadiendo/actualizando texto UI desde %s." + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "ppdc: Valor lógico (%s) incorrecto en línea %d de %s." + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "ppdc: Atributo de fuente: %s incorrecto" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "ppdc: Resolución de nombre \"%s\" incorrecta en línea %d de %s." + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "ppdc: Clave de estado %s incorrecta en línea %d de %s." + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "ppdc: Sustitución de variable ($%c) errónea en la línea %d de %s." + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "ppdc: Selección encontrada en línea %d de %s sin opciones." + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "ppdc: #po duplicado para código regional %s en línea %d de %s." + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "ppdc: Se esperaba una definición de filtro en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "ppdc: Se esperaba un nombre de programa en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "ppdc: Se esperaba un valor lógico en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" +"ppdc: Se esperaba un juego de caracteres tras Font en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "ppdc: Se esperaba un código apropiado en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "ppdc: Se esperaba un nombre/texto apropiado en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" +"ppdc: Se esperaba un orden de color para ColorModel en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "ppdc: Se esperaba colorspace para ColorModel en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "ppdc: Se esperaba compresión para ColorModel en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" +"ppdc: Se esperaba una cadena de restricciones para UIConstraints en la línea " +"%d de %s." + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" +"ppdc: Se esperaba una clave de tipo de controlador tras DriverType en la " +"línea %d de %s." + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "ppdc: Se esperaba un tipo dúplex tras Duplex en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "ppdc: Se esperaba una codificación tras Font en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" +"ppdc: Se esperaba un nombre de archivo tras #po %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "ppdc: Se esperaba un nombre/texto de grupo en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "ppdc: Se esperaba un nombre de archivo include en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "ppdc: Se esperaba un número entero en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "ppdc: Se esperaba un código regional tras #po en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras FileName en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras Font en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras Manufacturer en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras MediaSize en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras ModelName en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "ppdc: Se esperaba un nombre tras PCFileName en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "ppdc: Se esperaba un nombre/texto tras %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" +"ppdc: Se esperaba un nombre/texto tras Installable en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" +"ppdc: Se esperaba un nombre/texto tras Resolution en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" +"ppdc: Se esperaba una combinación nombre/texto para ColorModel en la línea %" +"d de %s." + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "ppdc: Se esperaba una opción de nombre/texto en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "ppdc: Se esperaba una sección de opciones en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "ppdc: Se esperaba un tipo de opción en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" +"ppdc: Se esperaba un campo de anulación tras Resolution en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "ppdc: Se esperaba una cadena entrecomillada en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "ppdc: Se esperaba un número real en la línea %d de %s." + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" +"ppdc: Se esperaba resolución/tipo de soporte tras ColorProfile en la línea %" +"d de %s." + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" +"ppdc: Se esperaba resolución/tipo de soporte tras SimpleColorProfile en la " +"línea %d de %s." + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "ppdc: Se esperaba un selector tras %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "ppdc: Se esperaba un estado tras Font en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "ppdc: Se esperaba una cadena tras Copyright en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "ppdc: Se esperaba una cadena tras Version en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "ppdc: Se esperaban dos nombres de opciones en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "ppdc: Se esperaba un valor tras %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "ppdc: Se esperaba una versión tras Font en la línea %d de %s." + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "ppdc: Nombre de archivo #include/#po incorrecto \"%s\"." + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "ppdc: Coste incorrecto para el filtro en la línea %d de %s." + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "ppdc: Tipo MIME vacío incorrecto para el filtro en la línea %d de %s." + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" +"ppdc: Nombre de programa vacío incorrecto para el filtro en la línea %d de %" +"s." + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "ppdc: Sección de opción incorrecta \"%s\" en la línea %d de %s." + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "ppdc: Tipo de opción incorrecta \"%s\" en la línea %d de %s." + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "ppdc: Cargando archivo de información de controlador \"%s\"." + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "ppdc: Cargando mensajes del idioma \"%s\"." + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "ppdc: Cargando mensajes desde \"%s\"." + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "ppdc: Falta un #endif al final de \"%s\"." + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "ppdc: Falta un #if en la línea %d de %s." + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" +"ppdc: Se necesita una línea msgid antes de cualquier cadena de traducción en " +"línea %d de %s." + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "ppdc: No se ha proporcionado catálogo de mensajes para el idioma %s." + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" +"ppdc: Opción %s definida en dos diferentes grupos en la línea %d de %s." + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "ppdc: Opción %s redefinida con un tipo diferente en la línea %d de %s." + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "ppdc: Opción de restricción debe *name en línea %d de %s." + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "ppdc: Demasiados #if anidados en la línea %d de %s." + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "ppdc: No se ha podido crear el archivo PPD \"%s\" - %s." + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "ppdc: No se ha podido crear el directorio de salida %s: %s" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "ppdc: No se han podido crear canales (pipes) de salida: %s" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "ppdc: No se ha podido ejecutar cupstestppd: %s" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" +"ppdc: No se ha podido encontrar el archivo #po %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" +"ppdc: No se ha podido encontrar el archivo include \"%s\" en la línea %d de %" +"s." + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "ppdc: No se ha podido encontrar localización para \"%s\" - %s" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "ppdc: No se ha podido cargar el archivo de localización \"%s\" - %s" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "ppdc: No se pudo abrir %s: %s" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "ppdc: Variable no definida (%s) en la línea %d de %s." + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "ppdc: Texto inesperado en la línea %d del %s." + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "ppdc: Tipo de controlador desconocido %s en la línea %d de %s." + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "ppdc: Tipo dúplex desconocido \"%s\" en la línea %d de %s." + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "ppdc: Tamaño de papel desconocido \"%s\" en la línea %d de %s." + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "ppdc: Formato del catálogo de mensajes para \"%s\" desconocido." + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "ppdc: Elemento desconocido \"%s\" visto en la línea %d de %s." + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" +"ppdc: Caracteres finales desconocidos en el número real \"%s\" en la línea %" +"d de %s." + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "ppdc: Cadena que comienza por %c sin terminar en la línea %d de %s." + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "ppdc: Advertencia - nombre de archivo superpuesto \"%s\"." + +#, c-format +msgid "ppdc: Writing %s." +msgstr "ppdc: Escribiendo %s." + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "ppdc: Escribiendo archivos PPD al directorio \"%s\"." + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "ppdmerge: LanguageVersion \"%s\" incorrecto en %s." + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "ppdmerge: Ignorando archivo PPD %s." + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "ppdmerge: No se ha podido hacer copia de seguridad de %s a %s- %s" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "la impresora %s está deshabilitada desde %s -" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "la impresora %s está inactiva. activada desde %s" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "la impresora %s está imprimiendo %s-%d. activada desde %s" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "la impresora %s/%s está desactivada desde %s -" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "la impresora %s/%s está inactiva. activada desde %s" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "la impresora %s/%s está imprimiendo %s-%d. activada desde %s" + +msgid "processing" +msgstr "en proceso" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "la id solicitada es %s-%d (%d archivo(s))" + +msgid "request-id uses indefinite length" +msgstr "request-id usa una longitud indefinida" + +msgid "scheduler is not running" +msgstr "el planificador de tareas no se está ejecutando" + +msgid "scheduler is running" +msgstr "el planificador de tareas se está ejecutando" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "estado de %s ha fallado: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "status\t\tMuestra el estado del demonio (daemon) y la cola." + +msgid "stopped" +msgstr "parada" + +#, c-format +msgid "system default destination: %s" +msgstr "destino predeterminado del sistema: %s" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "destino predeterminado del sistema: %s/%s" + +msgid "unknown" +msgstr "desconocido" + +msgid "untitled" +msgstr "sin título" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings usa una longitud indefinida" + +#~ msgid "Printer did not respond after %d seconds." +#~ msgstr "La impresora no respondió tras %d segundos." + +#~ msgid "The printer is almost out of ink." +#~ msgstr "La impresora casi no tiene tinta." + +#~ msgid "The printer is low on toner." +#~ msgstr "La impresora tiene poco tóner." + +#~ msgid "The printer is out of toner." +#~ msgstr "La impresora no tiene tóner." + +#~ msgid "Unable to connect to server" +#~ msgstr "No se ha podido conectar al servidor" + +#~ msgid "Unable to get print job status." +#~ msgstr "No se ha podido obtener el estado del trabajo de impresión." diff --git a/locale/cups_eu.po b/locale/cups_eu.po new file mode 100644 index 0000000..a2dfbd1 --- /dev/null +++ b/locale/cups_eu.po @@ -0,0 +1,8895 @@ +# translation of cups_1.4rc1_eu.po to Basque +# +# "$Id$" +# +# Message catalog template for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# +# Notes for Translators: +# +# The following prefixes MUST NOT be translated: "ALERT:", "CRIT:", "INFO:", +# "NOTICE:", and "WARNING:". +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# +# Iñaki Larrañaga Murgoitio , 2009. +msgid "" +msgstr "" +"Project-Id-Version: cups_1.4rc1_eu\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-07-03 19:34+0200\n" +"Last-Translator: Iñaki Larrañaga Murgoitio \n" +"Language-Team: Basque \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: eu\n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milimetro" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f -> %.0f x %.0f milimetro" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f hatz" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f -> %.2f x %.2f hatz" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s ezin da aldatu." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 hazt/seg" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25\"" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25\"" + +msgid "1.5 inch/sec." +msgstr "1.5 hatz/seg" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25\"" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50\"" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00\"" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 hatz/seg" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/seg" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 hatz/seg" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 hatz/seg" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/seg" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/seg" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/seg" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 hatz/seg" + +msgid "2-Sided Printing" +msgstr "2 alboetatik inprimatzea" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37\"" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50\"" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00\"" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25\"" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00\"" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00\"" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00\"" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50\"" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50\"" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25\"" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00\"" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50\"" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50\"" + +msgid "2.5 inches/sec." +msgstr "2.hatz/seg" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00\"" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00\"" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/seg" + +msgid "200 mm/sec." +msgstr "200 mm/seg" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24 orrratzeko serieak" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/seg" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 hatz/seg" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00\"" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25\"" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00\"" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00\"" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00\"" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00\"" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00\"" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50\"" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83\"" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5\" diskoa" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3.5\" diskoa - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/seg" + +msgid "300 mm/sec." +msgstr "300 mm/seg" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 hatz/seg" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00\"" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00\"" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00\"" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50\"" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00\"" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00\"" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00\"" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00\"" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/seg" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 hatz/seg" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 hatz/seg" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00\"" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00\"" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00\"" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00\"" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00\"" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00\"" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/seg" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 hatz/seg" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 hatz/seg" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00\"" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00\"" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00\"" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00\"" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00\"" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00\"" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/seg" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 hatz/seg" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9 orratzeko serieak" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Onartu lanak" + +msgid "Accepted" +msgstr "Onartuta" + +msgid "Add Class" +msgstr "Gehitu klasea" + +msgid "Add Printer" +msgstr "Gehitu inprimagailua" + +msgid "Add RSS Subscription" +msgstr "Gehitu RSS harpidetza" + +msgid "Address" +msgstr "Helbidea" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Helbidea - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administrazioa" + +msgid "Always" +msgstr "Beti" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplikatzailea" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Okerreko helburuko NULL erakuslea" + +msgid "Bad OpenGroup" +msgstr "Okerreko OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Okerreko OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Okerreko OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Okerreko eskaera" + +msgid "Bad SNMP version number" +msgstr "Okerreko SNMP bertsio zenbakia" + +msgid "Bad UIConstraints" +msgstr "Okerreko UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Okerreko kopien %d balioa." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Okerreko parametro pertsonalizatua" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Okerreko number-up balioa: %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Okerreko page-ranges balioak: %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Titularrak" + +msgid "Billing Information: " +msgstr "Fakturazioaren informazioa: " + +msgid "Bond Paper" +msgstr "Tituluentzako papera" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL etiketen inprimagailua" + +msgid "Cancel RSS Subscription" +msgstr "Utzi RSS harpidetza" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Aldatu ezarpenak" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klaseak" + +msgid "Clean Print Heads" +msgstr "Garbitu inprimatze-buruak" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Kolorea" + +msgid "Color Mode" +msgstr "Koloreen modua" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Komunitatearen izenak definitu gabeko luzera darabil" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Jarraitu" + +msgid "Continuous" +msgstr "Jarraia" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Sortuta" + +msgid "Created On: " +msgstr "Sorrera-data:" + +msgid "Custom" +msgstr "Pertsonalizatu" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Ebaki" + +msgid "Cutter" +msgstr "Ebakigailua" + +msgid "Dark" +msgstr "Iluna" + +msgid "Darkness" +msgstr "Iluntasuna" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Ezabatu klasea" + +msgid "Delete Printer" +msgstr "Ezabatu inprimagailua" + +msgid "Description: " +msgstr "Deskripzioa: " + +msgid "DeskJet Series" +msgstr "DeskJet serieak" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "\"%s\" helburuak ez du lanik onartzen." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Zuzeneko euskarri termikoa" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Desgaituta" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Kontrolatzailearen izena:" + +msgid "Driver Version: " +msgstr "Kontrolatzailearen bertsioa:" + +msgid "Duplexer" +msgstr "Duplexatzailea" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 etiketen inprimagailua" + +msgid "EPL2 Label Printer" +msgstr "EPL2 etiketen inprimagailua" + +msgid "Edit Configuration File" +msgstr "Editatu konfigurazioko fitxategia" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Titularraren amaiera" + +msgid "English" +msgstr "Basque" + +msgid "Enter old password:" +msgstr "Sartu pasahitz zaharra:" + +msgid "Enter password again:" +msgstr "Sartu pasahitza berriro:" + +msgid "Enter password:" +msgstr "Sartu pasahitza:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Idatzi zure erabiltzaile-izena eta pasahitza, edo supererabiltzailearen " +"izena eta pasahitza, orrialde honetara sarbidetzeko. Kerberos " +"autentifikazioa erabiltzen ari bazara, ziurtatu zaitez baliozko Kerberos " +"txartela duzula." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Gutunazalen iturria" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Erroreen politika" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "10 etiketez behin" + +msgid "Every 2 Labels" +msgstr "2 etiketez behin" + +msgid "Every 3 Labels" +msgstr "3 etiketez behin" + +msgid "Every 4 Labels" +msgstr "4 etiketez behin" + +msgid "Every 5 Labels" +msgstr "5 etiketez behin" + +msgid "Every 6 Labels" +msgstr "6 etiketez behin" + +msgid "Every 7 Labels" +msgstr "7 etiketez behin" + +msgid "Every 8 Labels" +msgstr "8 etiketez behin" + +msgid "Every 9 Labels" +msgstr "9 etiketez behin" + +msgid "Every Label" +msgstr "Etiketa bakoitzeko" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Espero zenak huts egin du" + +msgid "Export Printers to Samba" +msgstr "Esportatu inprimagailuak Samba-ra" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Fitxategien karpeta" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Fitxategien karpeta - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folioa" + +msgid "Forbidden" +msgstr "Debekatua" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Orokorra" + +msgid "Generic" +msgstr "Generikoa" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU definitu gabeko luzera darabil" + +msgid "Glossy Paper" +msgstr "Paper satinatua" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Gris-eskala" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Esekitako karpeta" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Esekitako karpeta - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Kontrol-karaktere ilegala" + +msgid "Illegal main keyword string" +msgstr "Gako-hitzaren kate nagusia ilegala" + +msgid "Illegal option keyword string" +msgstr "Aukeraren gako-hitzaren katea ilegala" + +msgid "Illegal translation string" +msgstr "Itzulpenaren katea ilegala" + +msgid "Illegal whitespace character" +msgstr "Zuriunea karakterea ilegala" + +msgid "Installable Options" +msgstr "Aukera instalagarriak" + +msgid "Installed" +msgstr "Instalatuta" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar etiketen inprimagailua" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "Zerbitzariaren barneko errorea" + +msgid "Internal error" +msgstr "Barneko errorea" + +msgid "Internet Postage 2-Part" +msgstr "Interneteko posta 2. zatia" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Interneteko posta 2. zatia - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Interneteko posta 3. zatia" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Interneteko posta 3. zatia - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Interneten inPrimatzeko Protokoloa" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "%d. lana jadanik abortatuta dago, ezin da bertan behera utzi." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "" +"%d. lana jadanik bertan behera utzita dago, ezin da bertan behera utzi." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "%d. lana jadanik burututa dago, ezin da bertan behera utzi." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Lana burututa" + +msgid "Job Created" +msgstr "Lana sortuta" + +msgid "Job ID: " +msgstr "Lanaren IDa: " + +msgid "Job Options Changed" +msgstr "Lanaren aukerak aldatuta" + +msgid "Job Stopped" +msgstr "Lana geldituta" + +msgid "Job UUID: " +msgstr "Lanaren UUIDa:" + +msgid "Job is completed and cannot be changed." +msgstr "Lana burututa dago eta ezin da aldatu." + +msgid "Job operation failed:" +msgstr "Lanaren eragiketak huts egin du:" + +msgid "Job state cannot be changed." +msgstr "Lanaren egoera ezin da aldatu." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Lanak" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR ostalaria edo inprimagailua" + +msgid "Label Printer" +msgstr "Etiketen inprimagailua" + +msgid "Label Top" +msgstr "Etiketaren goian" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Helbide luzea" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Helbide luzea - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet PCL 4/5 serieak" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Argia" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Lerroa baimendutako gehienezkoa (255 karaktere) baino luzeagoa" + +msgid "List Available Printers" +msgstr "Inprimagailu erabilgarrien zerrenda" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Kokalekua: " + +msgid "Long-Edge (Portrait)" +msgstr "Ertz-luzea (bertikala)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Marka eta modeloa: " + +msgid "Manual Feed" +msgstr "Eskuzko iturria" + +msgid "Media Dimensions: " +msgstr "Paperaren dimentsioak: " + +msgid "Media Limits: " +msgstr "Paperaren mugak: " + +msgid "Media Name: " +msgstr "Paperaren izena: " + +msgid "Media Size" +msgstr "Paperaren tamaina" + +msgid "Media Source" +msgstr "Paperaren iturria" + +msgid "Media Tracking" +msgstr "Paperaren jarraipena" + +msgid "Media Type" +msgstr "Paper mota" + +msgid "Medium" +msgstr "Euskarria" + +msgid "Memory allocation error" +msgstr "Errorea memoria esleitzean" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x goiburukoa falta da" + +msgid "Missing asterisk in column 1" +msgstr "Izartxoa falta da 1. zutabean" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Balioaren katea falta da" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Aldatu klasea" + +msgid "Modify Printer" +msgstr "Aldatu inprimagailua" + +msgid "Move All Jobs" +msgstr "Aldatu lan guztiak lekuz" + +msgid "Move Job" +msgstr "Aldatu lana lekuz" + +msgid "Moved Permanently" +msgstr "Betirako lekuz aldatuta" + +msgid "NULL PPD file pointer" +msgstr "PPD fitxategiaren erakusle NULUA" + +msgid "Name OID uses indefinite length" +msgstr "Izenaren OIDak definitu gabeko luzera darabil" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Inoiz ere ez" + +msgid "New Stylus Color Series" +msgstr "Stylus Color serie berriak" + +msgid "New Stylus Photo Series" +msgstr "Stylus Photo serie berriak" + +msgid "No" +msgstr "Ez" + +msgid "No Content" +msgstr "Edukirik ez" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "'VarBind SEQUENCE'-rik ez" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Ez dago konexio aktiborik" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Ez dago komunitatearen izenik" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Ez da helbururik gehitu." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Ez dago error-index parametroa" + +msgid "No error-status" +msgstr "Ez dago error-status parametroa" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Ez dago izenaren OIDrik" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Ez dago request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Ez da harpidetzarik aurkitu." + +msgid "No variable-bindings SEQUENCE" +msgstr "Ez dago 'variable-bindings SEQUENCE'-rik" + +msgid "No version number" +msgstr "Ez dago bertsioaren zenbakirik" + +msgid "Non-continuous (Mark sensing)" +msgstr "Ez da jarraia (markaren detekzioa)" + +msgid "Non-continuous (Web sensing)" +msgstr "Ez da jarraia (web detekzioa)" + +msgid "Normal" +msgstr "Arrunta" + +msgid "Not Found" +msgstr "Ez da aurkitu" + +msgid "Not Implemented" +msgstr "Ez dago garatuta" + +msgid "Not Installed" +msgstr "Ez dago instalatuta" + +msgid "Not Modified" +msgstr "Ez dago aldatuta" + +msgid "Not Supported" +msgstr "EZ dago onartuta" + +msgid "Not allowed to print." +msgstr "Inprimatzea ez dago baimenduta." + +msgid "Note" +msgstr "Oharra" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "Ados" + +msgid "Off (1-Sided)" +msgstr "Desaktibatuta (1 aldea)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Lineako laguntza" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Huts egin du %s irekitzean: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup aurreko CloseGroup-rik gabe" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI aurreko CloseUI/JCLCloseUI-rik gabe" + +msgid "Operation Policy" +msgstr "Eragiketaren politika" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Instalatutako aukerak" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Aukerak: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Irteeraren modua" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL laser inprimagailua" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Paketeak ez dauka Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Paketeak ez da SEQUENCErekin hasten" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "%s(r)en pasahitza %s(e)n?" + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "%s(r)en pasahitza behar da %s(e)n SAMBA bidez sarbidetzeko: " + +msgid "Pause Class" +msgstr "Pausatu klasea" + +msgid "Pause Printer" +msgstr "Pausatu inprimagailua" + +msgid "Peel-Off" +msgstr "Altxatu" + +msgid "Photo" +msgstr "Argazkia" + +msgid "Photo Labels" +msgstr "Argakien etiketak" + +msgid "Plain Paper" +msgstr "Paper soila" + +msgid "Policies" +msgstr "Politikak" + +msgid "Port Monitor" +msgstr "Atakaren monitorea" + +msgid "PostScript Printer" +msgstr "PostScript inprimagailua" + +msgid "Postcard" +msgstr "Postala" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Inprimatze-dentsitatea" + +msgid "Print Job:" +msgstr "Inprimatzeko lana:" + +msgid "Print Mode" +msgstr "Inprimatze modua" + +msgid "Print Rate" +msgstr "Inprimatze-emaria" + +msgid "Print Self-Test Page" +msgstr "Inprimatu auto-probako orrialdea" + +msgid "Print Speed" +msgstr "Inprimatzeko abiadura" + +msgid "Print Test Page" +msgstr "Inprimatu probako orrialdea" + +msgid "Print and Cut" +msgstr "Inprimatu eta ebaki" + +msgid "Print and Tear" +msgstr "Inprimatu eta altxatu" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Honentzako inprimatuta: " + +msgid "Printed From: " +msgstr "Hemendik inprimatuta: " + +msgid "Printed On: " +msgstr "Inprimatze-data: " + +msgid "Printer Added" +msgstr "Inprimagailua gehituta" + +msgid "Printer Default" +msgstr "Inprimagailu lehenetsia" + +msgid "Printer Deleted" +msgstr "Inprimagailua ezabatuta" + +msgid "Printer Modified" +msgstr "Inprimagailua aldatuta" + +msgid "Printer Name: " +msgstr "Inprimagailuaren izena: " + +msgid "Printer Paused" +msgstr "Inprimagailua pausatuta" + +msgid "Printer Settings" +msgstr "Inprimagailuaren ezarpenak" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Inprimagailua:" + +msgid "Printers" +msgstr "Inprimagailuak" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Garbitu lanak" + +msgid "Quarto" +msgstr "Laurdena" + +msgid "Quota limit reached." +msgstr "Kuotaren mugara iritsita." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Ukatu lanak" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Inprimatu berriro erroreen ostean" + +msgid "Request Entity Too Large" +msgstr "Eskaeraren entitatea luzeegia" + +msgid "Resolution" +msgstr "Bereizmena" + +msgid "Resume Class" +msgstr "Jarraitu klasea" + +msgid "Resume Printer" +msgstr "Jarraitu inprimagailua" + +msgid "Return Address" +msgstr "Itzulerako helbidea" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Itzulerako helbidea - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Birboninatu" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCEk definitu gabeko luzera darabil" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Ikusi besteak" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Serieko %d. ataka" + +msgid "Server Restarted" +msgstr "Zerbitzaria berrabiarazita" + +msgid "Server Security Auditing" +msgstr "Zerbitzariko segurtasun auditoretza" + +msgid "Server Started" +msgstr "Zerbitzaria abiarazita" + +msgid "Server Stopped" +msgstr "Zerbitzaria geldituta" + +msgid "Service Unavailable" +msgstr "Zerbitzaria ez dago eskuragarri" + +msgid "Set Allowed Users" +msgstr "Ezarri baimendutako erabiltzaileak" + +msgid "Set As Server Default" +msgstr "Ezarri zerbitzari lehenetsi gisa" + +msgid "Set Class Options" +msgstr "Ezarri klasearen aukerak" + +msgid "Set Printer Options" +msgstr "Ezarri inprimagailuaren aukerak" + +msgid "Set Publishing" +msgstr "Argitaratu" + +msgid "Shipping Address" +msgstr "Bidaltzeko helbidea" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Bidaltzeko helbidea - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Ertz laburra (horizontala)" + +msgid "Special Paper" +msgstr "Paper berezia" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Estandarra" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Hasierako titularra" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Instrukzioa" + +msgid "Stylus Color Series" +msgstr "Stylus Color serieak" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo serieak" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Protokoloak aldatzen" + +msgid "Tabloid" +msgstr "Tabloidea" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Altxatu" + +msgid "Tear-Off" +msgstr "Altxatu" + +msgid "Tear-Off Adjust Position" +msgstr "Altxatze-posizioaren doiketa" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Ezin izan da \"%s\" PPD fitxategia aurkitu." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Ezin izan da \"%s\" PPD fitxategia ireki: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Klasearen izenak inprimagarriak diren 127 karaktere sooilik eduki ditzake, " +"eta ezin du zuriune, barrak (/) edo traolaren (#) ikurrik eduki." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "notify-lease-duration atributua ezin da erabili lanen harpidetzekin." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Inprimagailuaren izenak inprimagarriak diren 127 karaktere sooilik eduki " +"ditzake, eta ezin du zuriune, barrak (/) edo traolaren (#) ikurrik eduki." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "\"%s\" printer-uri atributuak baliogabeko karaktereak ditu." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"printer-uri \"ipp://OSTALARIIZENA/classes/KLASEIZENA\" erakoa izan behar du." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"printer-uri \"ipp://OSTALARIIZENA/printers/INPRIMAGAILUIZENA\" erakoa izan " +"behar du." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Harpidetzaren izenak inprimagarriak ezin du zuriune, barrak (/), galdera " +"ikurra (?) edo traolaren (#) ikurrik eduki." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Harpidetza gehiegi daude." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Transferentzia termikoaren euskarria" + +msgid "Title: " +msgstr "Titulua: " + +msgid "Too many active jobs." +msgstr "Lan aktibo gehiegi." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Gardentasuna" + +msgid "Tray" +msgstr "Erretilua" + +msgid "Tray 1" +msgstr "1. erretilua" + +msgid "Tray 2" +msgstr "2. erretilua" + +msgid "Tray 3" +msgstr "3. erretilua" + +msgid "Tray 4" +msgstr "4. erretilua" + +msgid "URI Too Long" +msgstr "URIa luzeegia" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US legala" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US gutuna" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB zerieko %d. ataka" + +msgid "Unable to access cupsd.conf file:" +msgstr "Ezin da cupsd.conf fitxategia atzitu:" + +msgid "Unable to add RSS subscription:" +msgstr "Ezin da RSS harpidetza gehitu:" + +msgid "Unable to add class:" +msgstr "Ezin da klasea gehitu:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Ezin da inprimagailua gehitu:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Ezin da RSS harpidetza bertan behera utzi:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Ezin da printer-is-shared atributua aldatu:" + +msgid "Unable to change printer:" +msgstr "Ezin da inprimagailua aldatu:" + +msgid "Unable to change server settings:" +msgstr "Ezin dira zerbitzariaren ezarpenak aldatu:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Ezin da ostalariarekin konektatu." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Ezin da aldi baterako fitxategia sortu:" + +msgid "Unable to delete class:" +msgstr "Ezin da klasea ezabatu:" + +msgid "Unable to delete printer:" +msgstr "Ezin da inprimagailua ezabatu:" + +msgid "Unable to do maintenance command:" +msgstr "Ezin da mantenimenduko komandoa landu:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Ezin da klaseen zerrenda lortu:" + +msgid "Unable to get class status:" +msgstr "Ezin da klasearen egoera lortu:" + +msgid "Unable to get list of printer drivers:" +msgstr "Ezin da inprimagailuen kontrolatzaileen zerrenda lortu:" + +msgid "Unable to get printer attributes:" +msgstr "Ezin dira inprimagailuaren atributuak lortu:" + +msgid "Unable to get printer list:" +msgstr "Ezin da inprimagailuen zerrenda lortu:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Ezin da inprimagailuaren egoera lortu:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Ezin da klasea eraldatu:" + +msgid "Unable to modify printer:" +msgstr "Ezin da inprimagailua eraldatu:" + +msgid "Unable to move job" +msgstr "Ezin da lana lekuz aldatu" + +msgid "Unable to move jobs" +msgstr "Ezin dira lanak lekuz aldatu" + +msgid "Unable to open PPD file" +msgstr "Ezin da PPD fitxategia ireki" + +msgid "Unable to open PPD file:" +msgstr "Ezin da PPD fitxategia ireki:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Ezin da cupsd.conf fitxategia ireki:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Ezin da probako orrialdea inprimatu:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Ezin dira aukerak ezarri:" + +msgid "Unable to set server default:" +msgstr "Ezain da zerbitzari lehenetsia ezarri:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Ezin da cupsd.conf fitxategia igo:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Autorizaziorik ez" + +msgid "Units" +msgstr "Unitateak" + +msgid "Unknown" +msgstr "Ezezaguna" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "\"%s\" printer-error-policy ezezaguna." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "\"%s\" printer-op-policy ezezaguna." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Onartu gabeko balio mota" + +msgid "Upgrade Required" +msgstr "Eguneratu egin behar da" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Balioak definitu gabeko luzera darabil" + +msgid "VarBind uses indefinite length" +msgstr "VarBind-ek definitu gabeko luzera darabil" + +msgid "Version uses indefinite length" +msgstr "Bertsioak definitu gabeko luzera darabil" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Bai" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Orrialde hau honako URLan atxitu deakezu: https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL etiketen inprimagailua" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "abortatuta" + +msgid "canceled" +msgstr "bertan behera utzita" + +msgid "completed" +msgstr "burututa" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced programak huts egin du exekutatzean." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd programak huts egin du exekutatzean." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "'error-index'-ek definitu gabeko luzera darabil" + +msgid "error-status uses indefinite length" +msgstr "'error-status'-ek definitu gabeko luzera darabil" + +msgid "held" +msgstr "eutsita" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inaktibo" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "zain" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "prozesatzen" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "'request-id'-ek definitu gabeko luzera darabil" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "%s(e)n estatistikak huts egin du: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "geldituta" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "ezezaguna" + +msgid "untitled" +msgstr "izengabea" + +msgid "variable-bindings uses indefinite length" +msgstr "'variable-bindings'-ek definitu gabeko luzera darabil" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(denak)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(bat ere ez)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d sarrera\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tHutsegitearen ostean: jarraitu\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAlertak:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tTitularra behar da\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tKaraktere-jokoa:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tKonexioa: zuzena\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tKonexioa: urrunekoa\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tOrrialde-tamaina lehenetsia:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tTarte lehenetsia:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tAtakaren ezarpen lehenetsiak:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDeskripzioa: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tInprimakia muntatuta:\n" +#~ "\tEduki mota: edozer\n" +#~ "\tInprimagailu motak: ezezaguna\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tBaimendutako inprimakiak:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterfazea: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterfazea: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterfazea: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tKokalekua: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tHutsegitean: alertarik ez\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tBaimendutako erabiltzaileak:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tUkatutako erabiltzaileak:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemona badago\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tsarrerarik ez\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tinprimagailua '%s' gailuan dago abiadura -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tinprimatzea desgaituta dago\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tinprimatzea gaituta dago\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\t%s(e)n ilaratuta\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tilaratzea desgaituta\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tilaratzea gaituta\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tarrazoi ezezaguna\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " ADOSTASUNAREN PROBAREN EMAITZ XEHETUA\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " Erref.: 15. orrialdea, 3.1 atala.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " Erref.: 15. orrialdea, 3.2 atala.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " Erref.: 19. orrialdea, 3.3 atala.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " Erref.: 20. orrialdea, 3.4 atala.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " Erref.: 27. orrialdea, 3.5 atala.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " Erref.: 42. orrialdea, 5.2 atala.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " Erref.: 16-17 orrialdeak, 3.2 atala.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " Erref.: 42-45 orrialdeak, 5.2 atala.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " Erref.: 45-46 orrialdeak, 5.2 atala.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " Erref.: 48-49 orrialdeak, 5.2 atala.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " Erref.: 52-54 orrialdeak, 5.2 atala.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " BALIOZKOA Lehenetsia%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " BALIOZKOA DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " BALIOZKOA DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " BALIOZKOA FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " BALIOZKOA FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " BALIOZKOA LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " BALIOZKOA LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " BALIOZKOA Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " BALIOZKOA ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " BALIOZKOA NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " BALIOZKOA PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " BALIOZKOA PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " BALIOZKOA PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " BALIOZKOA PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " BALIOZKOA Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " BALIOZKOA ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " ABISUA \"%s %s\" gatazkan dago honekin: \"%s %s\"\n" +#~ " (murriztapena=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " ABISUA %s(e)k ez dagozkion aukerak ditu.\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " ABISUA %s(e)k aurrizki amankomuna partekatzen du %s(r)ekin\n" +#~ " Erref: 15. orrialdea, 3.2 atala.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " ABISUA Aukera lehenetsiak gatazkan.\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " ABISUA Duplex aukeraren %s gakoak baliteke behar ez bezala " +#~ "funtzionatzea eta Duplex izena eduki beharko luke.\n" +#~ " Erref: 122. orrialdea, 5.17 atala\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " ABISUA Fitxategiak nahastutako CR, LF eta CR-LF lerro amaierak " +#~ "ditu.\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " ABISUA PPD 4.3 zehaztapenak LanguageEncoding behar du.\n" +#~ " Erref: 56-57 orrialdeak, 5.3 atala.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " ABISUA %d lerroak zuriuneak soilik ditu.\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " ABISUA PPD 4.3 zehaztapenak Manufacturer behar du.\n" +#~ " Erref: 58-59 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " ABISUA Windows-ekoak ez diren PPD fitxategien lerroak LFrekin " +#~ "amaitu beharko lukete, ez CR-LFrekin\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " ABISUA PPDren %.1f bertsio zaharkitua.\n" +#~ " Erref: 42. orrialdea, 5.2 atala.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " ABISUA PCFileName 8.3 baino luzeagoa da, eta PPD " +#~ "zehaztapenaren bortxaketa da.\n" +#~ " Erref: 61-62 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " ABISUA Protokoloek PJL dute, baina JCL atributuak ez daude " +#~ "ezarrita.\n" +#~ " Erref: 78-79 orrialdeak, 5.7 atala.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " ABISUA Protokoloek bai PJL bai BCP dituzte, baina TBCP espero " +#~ "zen.\n" +#~ " Erref: 78-79 orrialdeak, 5.7 atala.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " ABISUA PPD 4.3 zehaztapenak ShortNickName behar du.\n" +#~ " Erref: 64-65 orrialdeak, 5.3 atala.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s ez da existitzen.\n" + +#~ msgid " %s %s file \"%s\" has the wrong capitalization!\n" +#~ msgstr " %s %s \"%s\" fitxategiak okerreko kapitalizazioa du.\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Okerreko %s(r)en %s hautaketa.\n" +#~ " Erref: 122. orrialdea, 5.17 atala.\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Okerreko \"%s\" UTF-8 itzulpeneko katea %s aukerarentzako.\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Okerreko \"%s\" UTF-8 itzulpeneko katea %s aukerarentzako, %s " +#~ "hautaketa.\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Okerreko cupsFilter-en \"%s\" balioa\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Okerreko %s cupsICCProfile.\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Okerreko cupsPreFilter-ren \"%s\" balioa.\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Okerreko %s cupsUIConstraints: \"%s\".\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Okerreko \"%s\" hizkuntza\n" + +#~ msgid " %s Bad spelling of %s - should be %s!\n" +#~ msgstr " %s %s(r)en okerreko ortografia - %s izan beharko luke.\n" + +#~ msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID!\n" +#~ msgstr " %s Ezin dira APScanAppPath eta APScanAppBundleID eman.\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s %s cupsUIConstraints hutsa\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s \"%s\" itzulpeneko katea falta da %s aukeran\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s \"%s\" itzulpeneko katea falta da %s aukeran, %s hautaketa.\n" + +#~ msgid " %s Missing APDialogExtension file \"%s\"\n" +#~ msgstr " %s APDialogExtension-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " %s APPrinterIconPath-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing APPrinterLowInkTool file \"%s\"\n" +#~ msgstr " %s APPrinterLowInkTool-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing APPrinterUtilityPath file \"%s\"\n" +#~ msgstr " %s APPrinterUtilityPath-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing APScanAppPath file \"%s\"\n" +#~ msgstr " %s APScanAppPath-en \"%s\" fitxategia falta da\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageRegion option!\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " %s BEHARREZKOA DEN PageRegion aukera falta da.\n" +#~ " Erref: 100. orrialdea, 5.14 atala.\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageSize option!\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " %s BEHARREZKOA DEN PageSize aukera falta da.\n" +#~ " Erref: 99. orrialdea, 5.14 atala.\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s *%s %s aukera falta da \"*%s %s *%s %s\" UIConstraints-en\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s *%s %s aukera falta da %s cupsUIConstraints-en: \"%s\"\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s cupsFilter-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s cupsICCProfile-en \"%s\" fitxategia falta da.\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s cupsPreFilter-en \"%s\" fitxategia falta da\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s %s cupsUIResolver falta da\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s %s aukera falta da \"*%s %s *%s %s\" UIConstraints-en\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s %s aukera falta da %s cupsUIConstraints-en: \"%s\"\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Ez da oinarrizko \"%s\" itzulpena sartu fitxategian.\n" + +#~ msgid "" +#~ " %s Non-standard size name \"%s\"!\n" +#~ " REF: Page 187, section B.2.\n" +#~ msgstr "" +#~ " %s Tamaina ez estandarra dauka \"%s\" izenak.\n" +#~ " Erref: 187. orrialdea, B.2 atala.\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s BEHARREZKOA DEN %s(e)k ez du 'Bat ere ez' aukera definitzen.\n" +#~ " Erref: 122. orrialdea, 5.17 atala.\n" + +#~ msgid " %s Size \"%s\" defined for %s but not for %s!\n" +#~ msgstr "" +#~ " %s \"%s\" tamaina definituta %s(r)entzako, baina ez honentzako: %" +#~ "s.\n" + +#~ msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)!\n" +#~ msgstr " %s \"%s\" tamainak ustekabeko dimentsioak ditu (%gx%g).\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr "" +#~ " %s cupsICCProfile-ren %s hash balioak beste honekin talka egiten " +#~ "du: %s\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s %s cupsUIResolver-ek begizta sortzen du\n" + +#~ msgid "" +#~ " %s cupsUIResolver %s does not list at least two different " +#~ "options!\n" +#~ msgstr "" +#~ " %s %s cupsUIResolver-ek ez du gutxienez bi aukera desberdin " +#~ "zerrendatu.\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s aukeraren %s eta %s izenak letren " +#~ "kapitalizazioan soilik desberdintzen dira.\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s 1284DeviceID izan behar du\n" +#~ " Erref: 72. orrialdea, 5.5 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO Default%s %s\n" +#~ " Erref: 40. orrialdea, 4.5 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO DefaultImageableArea %s.\n" +#~ " Erref: 102. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO DefaultPaperDimension %s.\n" +#~ " Erref: 103. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO JobPatchFile atributua fitxategian\n" +#~ " Erref: 24. orrialdea, 3.4 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO Manufacturer (\"HP\" izan beharko luke)\n" +#~ " Erref: 211. orrialdea, D.1 taula.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO Manufacturer (\"Oki\" izan beharko luke)\n" +#~ " Erref: 211. orrialdea, D.1 taula.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO ModelName - \"%c\" ez dago baimenduta " +#~ "katean.\n" +#~ " Erref: 59-60 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO PSVersion - ez da \"(string) int\".\n" +#~ " Erref: 62-64 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO Product - ez da \"(string)\".\n" +#~ " Erref: 62. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** OKERREKO ShortNickName - 31 karaktere baino " +#~ "luzeagoa.\n" +#~ " Erref: 64-65 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Okerreko %s %s aukera\n" +#~ " Erref: 84. orrialdea, 5.9 atala.\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Okerreko \"%s\" FileVersion\n" +#~ " Erref: 56. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Okerreko \"%s\" FormatVersion\n" +#~ " Erref: 56. orrialdea, 5.3 atala.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Okerreko %s LanguageEncoding - ISOLatin1 izan behar " +#~ "du\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Okerreko %s LanguageVersion - Ingelesa izan behar " +#~ "du\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Aukera lehenetsiaren kodea ezin da interpretatu: %" +#~ "s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s aukeraren %s hautaketaren itzulpen-kate " +#~ "lehenetsiak 8 biteko karaktereak ditu.\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s aukeraren itzulpen-kate lehenetsiak 8 biteko " +#~ "karaktereak ditu.\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s eta %s talde-izenak letren kapitalizazioan " +#~ "soilik desberdintzen dira.\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s aukeraren %s izenaren hainbat agerraldi daude.\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **HUTSEGITEA** %s eta %s aukeren izenak letra kapitalizatuetan " +#~ "soilik desberdintzen dira.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Default%s BEHARREZKOA DA\n" +#~ " Erref: 40. orrialdea, 4.5 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** DefaultImageableArea BEHARREZKOA DA\n" +#~ " Erref: 102. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** DefaultPaperDimension BEHARREZKOA DA\n" +#~ " Erref: 103. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** FileVersion BEHARREZKOA DA\n" +#~ " Erref: 56. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** FormatVersion BEHARREZKOA DA\n" +#~ " Erref: 56. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** ImageableArea BEHARREZKOA DA %s PageSize-rentzako\n" +#~ " Erref: 41. orrialdea, 5 atala.\n" +#~ " Erref: 102. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** LanguageEncoding BEHARREZKOA DA\n" +#~ " Erref: 56-57 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** LanguageVersion BEHARREZKOA DA\n" +#~ " Erref: 57-58 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Manufacturer BEHARREZKOA DA\n" +#~ " Erref: 58-59 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** ModelName BEHARREZKOA DA\n" +#~ " Erref: 59-60 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** NickName BEHARREZKOA DA\n" +#~ " Erref: 60. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** PCFileName BEHARREZKOA DA\n" +#~ " Erref: 61-62 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** PSVersion BEHARREZKOA DA\n" +#~ " Erref: 62-64 orrialdeak, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** PageRegion BEHARREZKOA DA\n" +#~ " Erref: 100. orrialdea, 5.14 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** REQUIRED BEHARREZKOA DA\n" +#~ "ageSize\n" +#~ " Erref: EF. orrialdea: atalasection 5.\n" +#~ " Erref: EF. orrialdea: sec atalation 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** PageSize BEHARREZKOA DA\n" +#~ " Erref: 99-100 orrialdeak, 5.14 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** PaperDimension BEHARREZKOA DA %s PageSize-rentzako\n" +#~ " Erref: 41. orrialdea, 5 atala.\n" +#~ " Erref: 103. orrialdea, 5.15 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** Product BEHARREZKOA DA\n" +#~ " Erref: 62. orrialdea, 5.3 atala.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **HUTSEGITEA** ShortNickName BEHARREZKOA DA\n" +#~ " Erref: 64-65 orrialdeak, 5.3 atala.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d ERRORE AURKITU DIRA\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Okerreko %%%%BoundingBox: %d lerroan\n" +#~ " Erref: 39. orrialdea, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Okerreko %%%%Page: %d lerroan\n" +#~ " Erref: 53. orrialdea, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Okerreko %%%%Pages: %d lerroan\n" +#~ " Erref: 43. orrialdea, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " %d lerroa 255 karaktere baino luzeagoa da (%d)!\n" +#~ " Erref: 25. orrialdea, lerroaren luzera\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 falta da aurreneko lerroan\n" +#~ " Erref: 17. orrialdea, 3.1 Adostasunaren dokumentuak\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments iruzkina falta da\n" +#~ " Erref: 41. orrialdea, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox okerrekoa edo falta da: iruzkina\n" +#~ " Erref: 39. orrialdea, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page okerrekoa edo falta da: iruzkinak\n" +#~ " Erref: 53. orrialdea, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages okerrekoa edo falta da: iruzkina\n" +#~ " Erref: 43. orrialdea, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " EZ DA ERRORERIK AURKITU\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " 255 karaktere baino luzeagoak diren %d lerro aurkitu dira\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " %%BeginDocument iruzkin gehiegi\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " %%EndDocument iruzkin gehiegi\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Abisua: fitxategiak datu bitarrak ditu\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Abisua: ez dago %%EndComments iruzkinik fitxategian\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Abisua: DSC %.1f bertsio zaharkitua fitxategian\n" + +#~ msgid " FAIL\n" +#~ msgstr " HUTSEGITEA\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " HUTSEGITEA\n" +#~ " **HUTSEGITEA** Ezin da PPD fitxategia ireki - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " HUTSEGITEA\n" +#~ " **HUTSEGITEA** Ezin da PPD fitxategia ireki - %s %d lerroan.\n" + +#~ msgid " PASS\n" +#~ msgstr " BALIOZKOA\n" + +#~ msgid "#10 Envelope" +#~ msgstr "10. gutunazala" + +#~ msgid "#11 Envelope" +#~ msgstr "11. gutunazala" + +#~ msgid "#12 Envelope" +#~ msgstr "12. gutunazala" + +#~ msgid "#14 Envelope" +#~ msgstr "14. gutunazala" + +#~ msgid "#9 Envelope" +#~ msgstr "9. gutunazala" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s(e)k eskaerak onartzen ditu %s unetik\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s ez dago CUPSen lpc bertsioan garatuta.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s ez dago prest\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s prest dago\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s prest dago eta inprimatzen\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s(e)k ez du eskaerarik onartzen %s unetik\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s ez dago onartuta." + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s-(e)k eskaerak onartzen ditu %s unetik\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s-(e)k ez ditu eskaerarik onartzen %s unetik\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [%d lana localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s(e)k huts egin du: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: ez daki zer egin.\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: errorea - Inguruneko %s aldagaiak existitzen ez den \"%s\" helburua " +#~ "izendatzen du\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: errorea - lanaren okerreko IDa\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: errorea - ezin dira fitxategiak inprimatu eta aldi berean lanak " +#~ "aldatu\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: errorea - ezin da stdin-etik inprimatu fitxategiak edo lan baten IDa " +#~ "ematen bada\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: errorea - '-S' aukeraren ondoren karaktere-jokoa espero zen\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: errorea - '-T' aukeraren ondoren eduki mota espero zen\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: errorea - '-n' aukeraren ondoren kopiak espero ziren\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "" +#~ "%s: errorea - '-#' aukeraren ondoren kopien zenbatzailea espero zen\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: errorea - '-P' aukeraren ondoren helburua espero zen\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: errorea - '-b' aukeraren ondoren helburua espero zen\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: errorea - '-d' aukeraren ondoren helburua espero zen\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: errorea - '-f' aukeraren ondoren inprimakia espero zen\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: errorea - '-H' aukeraren ondoren eusteko izena espero zen\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: errorea - '-H' aukeraren ondoren ostalari-izena espero zen\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: errorea - '-h' aukeraren ondoren ostalari-izena espero zen\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: errorea - '-y' aukeraren ondoren moduen zerrenda espero zen\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: errorea - '-%c' aukeraren ondoren izena espero zen\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: errorea - '-o' aukeraren ondoren aukera-katea espero zen\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "" +#~ "%s: errorea - '-P' aukeraren ondoren orrialdeen zerrenda espero zen\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: errorea - '-%c' aukeraren ondoren lehentasuna espero zen\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "" +#~ "%s: errorea - '-r' aukeraren ondoren arrazoiaren testua espero zen\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: errorea - '-t' aukeraren ondoren titulua espero zen\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "" +#~ "%s: errorea - '-U' aukeraren ondoren erabiltzaile-izena espero zen\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "" +#~ "%s: errorea - '-u' aukeraren ondoren erabiltzaile-izena espero zen\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: errorea - '-%c' aukeraren ondoren balio bat espero zen\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: errorea - '-W' aukeraren ondoren \"completed\", \"not-completed\", " +#~ "edo \"all\" egon behar du\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: errorea - helburu lehenetsia ez dago eskuragarri\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: errorea - lehentasuna 1 eta 100 artean egon behar du\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: errorea - antolatzaileak ez du erantzuten\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: errorea - fitxategi gehiegi - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: errorea - ezin da \"%s\" atzitu - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: errorea - ezin da stdin-etik ilaratu - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: errorea - \"%s\" helburu ezezaguna\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: errorea - \"%s/%s\" helburu ezezaguna\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: errorea - '%c' aukera ezezaguna\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: errorea - '%s' aukera ezezaguna\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: '-i' aukeraren ondoren lanaren IDa espero zen\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: \"%s\" iragazkia ez dago erabilgarri: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: helburuaren izen baliogabea \"%s\" zerrendan\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: \"%s\" iragazkiaren kate baliogabea\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: lanaren IDa ('-i lanIDa') behar da '-H restart'-en aurretik\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: ez dago iragazkirik %s/%s -> %s/%s bihurtzeko\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: huts egin du eragiketak: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: ez da enkriptatzeko euskarriarekin konpilatu\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: ezin da zerbitzariarekin konektatu\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: ezin da zerbitzariarekin kontaktatu\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: ezin da \"%s\"(r)en MIME mota zehaztu\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: ezin da %s ireki: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: ezin da PPD fitxategia ireki: %s %d lerroan\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d.\n" +#~ msgstr "%s: ezin da PPD fitxategia ireki: %s %d lerroan\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: ezin da MIMEen datu-basea irakurri \"%s\" edo \"%s\"(e)ndik\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: \"%s\" helburu ezezaguna\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: %s/%s MIME motaren helburu ezezaguna\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: '%c' aukera ezezaguna\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: %s/%s MIME moten iturburu ezeaguna\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: abisua - '%c' formatuaren eraldatzailea ez dago onartuta - irteera ez " +#~ "da zuzena izango\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: abisua - karaktere-jokoaren aukerari ezikusi egin zaio\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: abisua - edukiaren motaren aukerari ezikusi egin zaio\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: abisua - inprimakiaren aukerari ezikusi egin zaio\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: abisua - moduen aukerari ezikusi egin zaio\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: errorea - inguruneko %s aldagaiak existitzen ez den \"%s\" helburua " +#~ "izandatzen du\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: errorea - '-o' aukeraren ondoren aukera=balioa espero zen\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: errorea - helburu lehenetsia ez dago eskuragarri\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "? laguntzako komando ezezagun baliogabea\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "Samba-ko pasahitza behar da inprimagailuaren kontrolatzaileak " +#~ "esportatzeko." + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Samba-ko erabiltzaile-izena behar da inprimagailuaren kontrolatzaileak " +#~ "esportatzeko." + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "\"%s\" izeneko klasea badago lehendik ere." + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "\"%s\" izeneko inprimagailua badago lehendik ere." + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (handiagoa)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (handiagoa)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (txikia)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (handiagoa)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "" +#~ "%s inprimagailuaren egoera okerreko %d balioarekin ezartzen saiatzen." + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Taldeen atributuak ordenatik kanpo daude (%x < %x)" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Okerreko gailuaren URIa: \"%s\"\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Okerreko device-uri: \"%s\"." + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Okerreko device-uri eskema: \"%s\"." + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Okerreko document-format: \"%s\"." + +#~ msgid "Bad filename buffer!" +#~ msgstr "Okerreko fitxategi-izenaren buferra." + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Okerreko letra-atributua: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Okerreko job-priority balioa." + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Okerreko job-sheets balioa: \"%s\"." + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Okerreko job-sheets balio mota." + +#~ msgid "Bad job-state value!" +#~ msgstr "Okerreko job-state balioa." + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Okerreko job-uri atributua: \"%s\"." + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Okerreko notify-pull-method: \"%s\"." + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Okerreko notify-recipient-uri URIa: \"%s\"." + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Okerreko aukera + hautaketa %d. lerroan." + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Okerreko port-monitor: \"%s\"." + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Okerreko printer-state balioa: %d." + +#~ msgid "Bad request ID %d!" +#~ msgstr "Okerreko eskaeraren IDa: %d." + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Okerreko eskaeraren bertsio zenbakia: %d.%d." + +#~ msgid "Bad subscription ID!" +#~ msgstr "Okerreko harpidetzaren IDa." + +#~ msgid "C0 Envelope" +#~ msgstr "C0 gainazala" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 gainazala" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 gainazala" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 gainazala" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 gainazala" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 gainazala" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 gainazala" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 gainazala" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 gainazala" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "\"%s\" karaktere-jokoa ez dago onartuta." + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 gainazala" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 gainazala" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Komandoa laburtu daitezke. Hauek dira komandoak:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Ezin izan da \"%s\" mota eskaneatu." + +#~ msgid "Cover open." +#~ msgstr "Estalkia irekita." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL gutunazala" + +#~ msgid "Developer almost empty." +#~ msgstr "Errebelatzailea ia hutsik." + +#~ msgid "Developer empty!" +#~ msgstr "Errebelatzailea hutsik!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Gailua: URIa = %s\n" +#~ " klasea = %s\n" +#~ " informazioa = %s\n" +#~ " marka eta modeloa = %s\n" +#~ " gailuaren IDa = %s\n" +#~ " kokalekua = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Ez da %d dokumentua aurkitu %d lanean." + +#~ msgid "Door open." +#~ msgstr "Atea irekita." + +#~ msgid "Double Postcard" +#~ msgstr "Postal bikoitza" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "" +#~ "EMERG: ezin da memoriarik esleitu orrialdearen informazioarentzako: %s.\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: ezin da memoriarik esleitu orrialdeen arrayarentzako: %s.\n" + +#~ msgid "ERROR: %s job-id user title copies options [file]\n" +#~ msgstr "" +#~ "ERROR: %s job-id erabiltzailea titulua kopiak aukerak [fitxategia]\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox: iruzkin okerra ikusi da\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: %%IncludeFeature: iruzkin okerra\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: %%Page: iruzkin okerra fitxategian\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: %%PageBoundingBox: iruzkin okerra fitxategian\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: SCSI gailuaren fitxategia okerra: \"%s\"\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: karaktere-jokoaren fitxategia okerra: %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: karaktere-jokoaren mota okerra: %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: zutabeen balioa okerra: %d\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: cpi-ren balioa okerra: %f\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: letra-deskripzioaren lerroa okerra: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: lpi balioa okerra: %f\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: orrialdearen konfigurazioa okerra\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: testuaren norabidea okerra: %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: testuaren zabalera okerra: %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: helburuko inprimagailua ez da existitzen\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: bikoiztutako %%BoundingBox: iruzkina ikusi da\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: bikoiztutako %%Pages: iruzkina ikusi da\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: inprimatzeko fitxategia hutsik dago.\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: %d errorea PAPSendData eskaera bidaltzean: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: komatxoen arteko katea espero zen %2$s(r)en %1$d lerroan\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: USBaren errore larria\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: baliogabeko HP-GL/2 komandoa ikusi da, ezin da fitxategia " +#~ "inprimatu\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog falta da\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup falta da\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: gailuaren URIa falta da komando-lerroan eta ez dago inguruneko " +#~ "DEVICE_URI aldagairik\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: balioa falta da titularraren fitxategiko %d lerroan\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: msgid lerro bat behar da itzulpeneko edozein kateren aurretik %d " +#~ "lerroan %s(e)n\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: ez dago %%BoundingBox: iruzkinik goiburuan\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: ez dago %%Pages: iruzkinik goiburuan\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: ez da gailuaren URIrik aurkitu argv[0] argumentuan edo inguruneko " +#~ "DEVICE_URI aldagaian\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "" +#~ "ERROR: ez da letra-tiporik aurkitu karaktere-jokoaren %s fitxategian\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: ez dira orrialderik aurkitu\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: ez dago paperik\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: inguruneko PRINTER aldagaia ez dago definituta\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: inprimatzeko fitxategia ez da onartu (%s)\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: inprimagailuak ez du erantzuten\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: inprimagailuak ez du erantzuten\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: inprimagailuak ustekabeko EOF bidali du\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: urruneko ostalariak ez du kontrol-fitxategia onartu (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: urruneko ostalariak ez du datuen fitxategia onartu (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "ERROR: denbora-muga gainditu da inprimagailura datuak bidaltzean\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: ezin da %d fitxategia lanari gehitu: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: ezin da %d lana bertan behera utzi: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: ezin da PDF fitxategia kopiatu" + +#~ msgid "ERROR: Unable to create pipe" +#~ msgstr "ERROR: ezin da kanalizazioa sortu" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: ezin da socket-a sortu" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: ezin da aldi baterako inprimatzeko konprimitutako fitxategia " +#~ "sortu: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: ezin da aldi baterako fitxategia sortu" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: ezin da pictwpstops exekutatu: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: ezin da gs programa exekutatu" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: ezin da pdftops programa exekutatu" + +#~ msgid "ERROR: Unable to execute pstops program" +#~ msgstr "ERROR: ezin da pstops programa exekutatu" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: ezin da pictwpstops sardetu: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: ezin da PAP eskaera lortu" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: ezin da PAP erantzuna lortu" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: ezin da \"%s\" - \"%s\" inprimagailuaren PPD fitxategia lortu.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: ezin da AppleTalk zona lehenetsia lortu" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: ezin da %d lanaren atributurik lortu (%s)\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: ezin da inprimagailuaren egoera lortu (%s)\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: ezin da '%s' inprimagailua aurkitu\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: ezin da PAP erantzuna aurktitu" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: ezin da AppleTalk inprimagailurik aurkitu" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: ezin da AppleTalk helbiderik sortu" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: ezin da \"%s\" - \"%s\" ireki\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: ezin da %s ireki: %s\n" + +#~ msgid "ERROR: Unable to open PPD file!\n" +#~ msgstr "ERROR: ezin da PPD fitxategia ireki\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: ezin da \"%s\" titularraren fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: ezin da \"%s\" gailuaren fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: ezin da \"%s\" fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: ezin da \"%s\" fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: ezin da irudiaren fitxategia ireki inprimatzeko\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: ezin da \"%s\" inprimatzeko fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: ezin da %s inprimatzeko fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: ezin da %s inprimatzeko fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open raster file - %s\n" +#~ msgstr "ERROR: ezin da bilbearen fitxategia ireki: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: ezin da aldi baterako konprimitutako inprimatzeko fitxategia " +#~ "ireki: %s\n" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: ezin dira testuaren %d zutabe inprimatu\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: ezin da %dx%d testu orrialde inprimatu\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: ezin da inprimatzeko daturik irakurri" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: ezin da inprimatzeko daturik irakurri\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: ezin da ataka erreserbatu" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: ezin da fitxategiko %ld posizioan kokatu: %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: ezin da fitxategiko %lld posizioan kokatu: %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: ezin da LPD komandoa bidali" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: ezin da PAP eskaera bidali" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: ezin da PAPren hasierako datuak bidaltzeko eskaera bidali" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: ezin da inprimatzeko daturik bidali (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: ezin da inprimatzeko daturik bidali\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: ezin da inprimatzeko fitxategia inprimagailura bidali" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: ezin da NULL balioa bidali inprimagailura" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: ezin da pictwpstops-ren zain egon: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: ezin dira %d byte idatzi \"%s\"(e)n: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: ezin dira %d byte idatzi inprimagailuan\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: ezin da kontrol-fitxategia idatzi" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: ezin da inprimatzeko daturik idatzi" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: ezin da inprimatzeko daturik idatzi: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: ezin da bilbeko daturik idatzi kontrolatzailean\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: ezin da aldi baterako fitxategian idatzi" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: ezin da deskonprimitutako dokumentuaren daturik idatzi: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: ustekabeko testua %2$s fitxategiko %1$d lerroan\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: enkriptatzeko aukeraren \"%s\" balioa ezezaguna\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: \"%s\" fitxategiaren ordena ezezaguna\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: \"%c\" karakterearen formatua ezezaguna\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: mezuaren katalogo-formatua ezezaguna \"%s\"(r)entzako\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: \"%s\" aukera ezezaguna \"%s\" balioarekin\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: inprimatzeko \"%s\" modua ezezaguna\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: bertsioaren aukeraren \"%s\" balioa ezezaguna\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: distiraren %s balioa onartu gabea. Distira=100 erabiltzen\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: gammaren %s balioa onartu gabea. Gamma=100 erabiltzen\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: number-up parametroaren %d balioa onartu gabea. number-up=1 " +#~ "erabiltzen\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: number-up-layout parametroaren %s balioa onartu gabea. number-up-" +#~ "layout=1 erabiltzen\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: page-border parametroaren %s balioa onartu gabea. page-border=none " +#~ "erabiltzen\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "" +#~ "ERROR: gainezkatutako doc_printf (%d byte) detektattua. Bertan behera " +#~ "uzten\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops %d seinalearekin irten da\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops %d egoerarekin irten da\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: berreskura daiteke. Ezin da inprimagailuarekin konektatu. 30 " +#~ "segundo barru saiatuko da berriro...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: huts egin du select()-ek" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: ezin da 'stat' exekutatu inprimatzeko fitxategiarentzako" + +#~ msgid "Empty PPD file!" +#~ msgstr "PPD fitxategia hutsik dago." + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Errorea: ostalari-izena behar da '-h' aukeraren ondoren\n" + +#~ msgid "FAIL\n" +#~ msgstr "HUTSEGITEA\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Fitxategiaren gailuaren URIak desgaitu egin dira. Gaitzeko, ikus " +#~ "FileDevice direktiba \"%s/cupsd.conf\" fitxategian." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Fuser-aren tenperatura altua." + +#~ msgid "Fuser temperature low!" +#~ msgstr "Fuser-aren tenperatura baxua." + +#~ msgid "German FanFold" +#~ msgstr "FanFold alemana" + +#~ msgid "German FanFold Legal" +#~ msgstr "FanFold Legal alemana" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "printer-uri atributua lortu da, baina ez job-id." + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk desgaituta sistemako hobespenetan\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk desgaituta sistemako hobespenetan.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: inprimatzeko lana bertan behera uzten...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: inprimagailura konektatuta...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: inprimagailura konektatzen...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: kontrol-fitxategia ongi bidali da\n" + +#~ msgid "INFO: Copying print data...\n" +#~ msgstr "INFO: inprimatzeko datuak kopiatzen...\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: datuen fitxategia ongi bidali da\n" + +#~ msgid "INFO: Finished page %d...\n" +#~ msgstr "INFO: %d orrialdea amaituta...\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: %d orrialdeari formatua ematen...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: irudiaren fitxategia kargatzen...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: inprimagailua bilatzen...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: konexioa irekitzen\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: inprimatzeko fitxategia bidalita, inprimagailuak amaitu zain...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: inprimagailua lanpetuta. 10 segundotan saiatu da berriro...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: inprimagailua lanpetuta. 30 segundotan saiatu da berriro...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: inprimagailua lanpetuta. 5 segundotan saiatu da berriro...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: inprimagailuak ez du IPP/%d.%d onartzen. Honekin saiatzen: " +#~ "IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "" +#~ "INFO: inprimagailua lanpetuta dago. 5 segundotan saiatu da berriro...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: inprimagailua unean lineaz kanpo dago.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: inprimagailua unean linean dago.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: inprimagailua orain linean dago.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: inprimagailua lineaz kanpo dago.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: inprimagailua ez dago konektatuta. 30 segundo barru saiatuko da " +#~ "berriro...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: %d orrialdea inprimatzen. %% %d osatuta...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: %d orrialdea inprimatzen...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: inprimatzeko prest.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: kontrol-fitxategia bidaltzen (%lu byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: kontrol-fitxategia bidaltzen (%u byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: datuen fitxategia bidaltzen\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: datuen fitxategia bidaltzen (%ld byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: datuen fitxategia bidaltzen (%lld byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: inprimatzeko datuak bidaltzen...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: inprimatzeko fitxategia bidalita, %ld byte...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: inprimatzeko fitxategia bidalita, %lld byte...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: LPR lana ilaran jartzen. %% %.0f osatuta...\n" + +#~ msgid "INFO: Starting page %d...\n" +#~ msgstr "INFO: %d orrialdea hasten...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: ezin da inprimagailuarekin kontaktatu, klaseko hurrengo " +#~ "inprimagailuan ilaratzen...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: \"%s\" AppleTalk zona lehenetsia erabiltzen\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: lana osatzeko itxoiten...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: inprimagailua erabilgarri egon arte itxoiten...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 gutunazala" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (handiagoa)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 gutunazala" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 gutunazala" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tinta/Tonerra ia hutsik." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tinta/Tonerra hutsik!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Tinta/Tonerraren zakarrontzia ia beteta." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Tinta/Tonerraren zakarrontzia beteta!" + +#~ msgid "Interlock open." +#~ msgstr "Segurtasun-blokeoa irekita." + +#~ msgid "Invite Envelope" +#~ msgstr "Gobidapeneko gutunazala" + +#~ msgid "Italian Envelope" +#~ msgstr "Gutunazal italiarra" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "%d. lana ezin da berrabiatu. Ez dago fitxategirik." + +#~ msgid "Job #%d does not exist!" +#~ msgstr "%d. lana ez da existitzen." + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "%d. lana jadanik burututa dago, eta ezin da aldatu." + +#~ msgid "Job #%d is not complete!" +#~ msgstr "%d. lana ez dago burututa." + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "%d. lana ez dago atxikituta autentifikatzeko." + +#~ msgid "Job #%d is not held!" +#~ msgstr "%d. lana ez dago atxikituta." + +#~ msgid "Job #%s does not exist!" +#~ msgstr "%s. lana ez da existitzen." + +#~ msgid "Job %d not found!" +#~ msgstr "%d lana ez da aurkitu." + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Lanaren harpidetzak ezin dira berritu." + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 gutunazala" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 gutunazala" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "\"%s\" hizkuntza ez dago onartuta." + +#~ msgid "Media jam!" +#~ msgstr "Paper gatazka!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Paperen erretilua is hutsik." + +#~ msgid "Media tray empty!" +#~ msgstr "Paperen erretilua hutsik!" + +#~ msgid "Media tray missing!" +#~ msgstr "Paperen erretilua falta da!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Paperen erretilua bete egin behar da." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "document-number atributua falta da." + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Komatxo bikoitzak falta dira %d lerroan." + +#~ msgid "Missing form variable!" +#~ msgstr "Inprimakiaren aldagaia falta da." + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "notify-subscription-ids atributua falta da." + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "requesting-user-name atributua falta da." + +#~ msgid "Missing required attributes!" +#~ msgstr "Beharrezko atributuak falta dira." + +#~ msgid "Missing value on line %d!" +#~ msgstr "Balioa falta da %d lerroan." + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modeloa: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch gutunazala" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: inptimatzeko fitxategia onartuta - lanaren IDa: %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "" +#~ "NOTICE: inptimatzeko fitxategia onartuta - lanaren IDa: ezezaguna.\n" + +#~ msgid "No PPD name!" +#~ msgstr "PPD izenik ez." + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Ez daude Windows-eko inprimagailuen kontrolatzailerik instalatuta!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Ez dago lan aktiborik %s(e)n." + +#~ msgid "No attributes in request!" +#~ msgstr "Ez dago atributurik eskaeran." + +#~ msgid "No authentication information provided!" +#~ msgstr "Ez da autentifikatzeko informaziorik eman." + +#~ msgid "No default printer" +#~ msgstr "Ez dago inprimagailu lehenetsirik" + +#~ msgid "No file!?!" +#~ msgstr "Fitxategirik ez?" + +#~ msgid "No modification time!" +#~ msgstr "Ez dago aldaketa-ordurik." + +#~ msgid "No printer name!" +#~ msgstr "Ez dago inprimagailuaren izenik." + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Ez da printer-uri aurkitu klasearentzako" + +#~ msgid "No printer-uri found!" +#~ msgstr "Ez da printer-uri aurkitu." + +#~ msgid "No printer-uri in request!" +#~ msgstr "Ez da printer-uri aurkitu eskaeran." + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Ez dago harpidetzako atributurik eskaeran." + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPCa ia agortuta." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPCa agortuta." + +#~ msgid "Out of toner!" +#~ msgstr "Tonerra agortuta!" + +#~ msgid "Output bin almost full." +#~ msgstr "Irteerako ontzia ia beteta." + +#~ msgid "Output bin full!" +#~ msgstr "Irteerako ontzia beteta!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "%s inprimagailuarentzako irteera %s(e)ra bidalita\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "%s inprimagailuarentzako irteera urruneko %s inprimagailura bidalita %s(e)" +#~ "n\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "%s/%s inprimagailuarentzako irteera %s(e)ra bidalita\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "%s/%s inprimagailuarentzako irteera urruneko %s inprimagailura bidalita %s" +#~ "(e)n\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Irteerako erretilua falta da." + +#~ msgid "PASS\n" +#~ msgstr "BALIOZKOA\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 gutunazala" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 gutunazala" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 gutunazala" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 gutunazala" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (handiagoa)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 gutunazala" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 gutunazala" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 gutunazala" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 gutunazala" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 gutunazala" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 gutunazala" + +#~ msgid "Personal Envelope" +#~ msgstr "Gutunazal pertsonala" + +#~ msgid "Printer offline." +#~ msgstr "Inprimagailua lineaz kanpo." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Errenk. Jabea Lana Fitxategiak Tamaina osoa\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Errenk. Jabea Lehent. Lana Fitxategiak Tamaina " +#~ "osoa\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Komandoa exekutaten: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI inprimagailua" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloidea (handiagoa)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data balioa handiegia da (%d > 63 zortzikote)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Inprimagailua edo klasea ez dago partekatuta." + +#~ msgid "The printer or class was not found." +#~ msgstr "Inprimagailua edo klasea ez da aurkitu." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "printer-uri atributua behar da." + +#~ msgid "Toner low." +#~ msgstr "Tonerra baxua." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "job-sheets balio gehiegi (%d > 2)." + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "printer-state-reasons balio gehiegi (%d > %d)." + +#~ msgid "US Executive" +#~ msgstr "US exekutiboa" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US legala (handiagoa)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US gutuna (handiagoa)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US gutuna (txikia)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Ezin da lana gehitu \"%s\" helbururako." + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Ezin da memoria esleitu fitxategi motentzako." + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira 64 bit-eko CUPSeko inprimagailuen kontrolatzaileen fitxategiak " +#~ "kopiatu (%d)." + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira 64 bit-eko Windows-eko inprimagailuen kontrolatzaileen " +#~ "fitxategiak kopiatu (%d)." + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira CUPSeko inprimagailuen kontrolatzaileen fitxategiak kopiatu (%" +#~ "d)." + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Ezin da PPD fitxategia kopiatu: %s." + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Ezin da PPD fitxategia kopiatu." + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira Windows 2000ko inprimagailuen kontrolatzaileen fitxategiak " +#~ "kopiatu (%d)." + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira Windows 9x sistemako inprimagailuen kontrolatzaileen " +#~ "fitxategiak kopiatu (%d)." + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Ezin da interfazeko script-a kopiatu: %s." + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Ezin da printer-uri sortu." + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "" +#~ "Ezin dira 1 MB baino handiagoak diren cupsd.conf fitxategiak editatu." + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Ezin da helburua aurkitu lanarentzako." + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Ezin da inprimagailua aurkitu.\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira Windows 2000ko inprimagailuen kontrolatzaileen fitxategiak " +#~ "instalatu (%d)." + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Ezin dira Windows 9x sistemako inprimagailuen kontrolatzaileen " +#~ "fitxategiak instalatu (%d)." + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Ezin da %d. dokumentua ireki %d. lanean." + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Ezin da \"%s\" exekutatu: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Ezin da komandoa bidali inprimagailuaren kontrolatzaileari." + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Ezin da Windows-eko inprimagailuaren kontrolatzailea ezarri (%d)." + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Ezin da USB klaseko kontrolatzaile zaharkitua erabili.\n" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Onartu gabeko \"%s\" karaktere-jokoa." + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Onartu gabeko \"%s\" konpresioa." + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Onartu gabeko %s konpresio atributua." + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Onartu gabeko \"%s\" formatua." + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Onartu gabeko '%s' formatua." + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Onartu gabeko '%s/%s' formatua." + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Erabilera:\n" +#~ "\n" +#~ " lpadmin [-h zerbitzaria] -d helburua\n" +#~ " lpadmin [-h zerbitzaria] -x helburua\n" +#~ " lpadmin [-h zerbitzaria] -p inprimagailua [-c klasea_gehitzeko] [-i " +#~ "interfazea] [-m modeloa]\n" +#~ " [-r klasea_kentzeko] [-v gailua] [-D deskripzioa]\n" +#~ " [-P ppd-fitxategia] [-o izena=balioa]\n" +#~ " [-u allow:erabiltzailea,erabiltzailea] [-u deny:" +#~ "erabiltzailea,erabiltzailea]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "" +#~ "Erabilera: %s lana erabiltzailea titulua kopiak aukerak [fitxategi-" +#~ "izena]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "" +#~ "Erabilera: %s lanaren_IDa erabiltzailea titulua kopiak aukerak [fitxategi-" +#~ "izena]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "" +#~ "Erabilera: %s lanaren_IDa erabiltzailea titulua kopiak aukerak " +#~ "fitxategia\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Erabilera: convert [ Aukerak ]\n" +#~ "\n" +#~ "Aukerak:\n" +#~ " -e Erabili PPD fitxategiko iragazki bakoitza\n" +#~ " -f fitxategi-izena Ezarri fitxategia bihurtzeko (bestela " +#~ "stdin)\n" +#~ " -o fitxategi-izena Ezarri fitxategia sortzeko (bestela " +#~ "stdout)\n" +#~ " -i mime/mota Ezarri sarrerako MIME mota (bestela mota " +#~ "automatikoa)\n" +#~ " -j mime/mota Ezarri irteerako MIME mota (bestela application/" +#~ "pdf)\n" +#~ " -P fitxategi-izena.ppd Ezarri PPD fitxategia\n" +#~ " -a 'izena=balioa ...' Ezarri aukerak\n" +#~ " -U erabiltzaile-izena Ezarri lanaren erabiltzaile-izena\n" +#~ " -J titulua Ezarri titulua\n" +#~ " -c kopiak Ezarri kopia kopurua\n" +#~ " -u Kendu PPD fitxategia amaitutakoan\n" +#~ " -D Kendu sarrerako fitxategia amaitutakoan\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Erabilera: cupsaddsmb [aukerak] inprimagailua1 ... inprimagailuaN\n" +#~ " cupsaddsmb [aukerak] -a\n" +#~ "\n" +#~ "Aukerak:\n" +#~ " -E Enkriptatu zerbitzarirako konexioa\n" +#~ " -H samba-zerbitzaria Erabili izendatutako SAMBA zerbitzaria\n" +#~ " -U samba-erabiltzailea Autentifikatu izendatutako SAMBAko " +#~ "erabiltzailea erabiliz\n" +#~ " -a Esportatu inprimagailu guztiak\n" +#~ " -h cups-zerbitzaria Erabili izendatutako CUPS zerbitzaria\n" +#~ " -v Hitzez hitz (erakutsi komandoak)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Erabilera: cupsctl [aukerak] [param=balioa ... paramN=balioaN]\n" +#~ "\n" +#~ "Aukerak:\n" +#~ "\n" +#~ " -E Gaitu enkriptatzea\n" +#~ " -U erabiltzaile-izena Zehaztu erabiltzaile-izena\n" +#~ " -h zerbitzaria[:ataka] Zehaztu zerbitzariaren helbidea\n" +#~ "\n" +#~ " --[no-]debug-logging Txandakatu arazketaren erregistroak " +#~ "aktibatzea/desaktibatzea\n" +#~ " --[no-]remote-admin Txandakatu urruneko administrazioa aktibatzea/" +#~ "desaktibatzea\n" +#~ " --[no-]remote-any Baimendu/Saihestu atzitzea Internetetik\n" +#~ " --[no-]remote-printers Erakutsi/Ezkutatu urruneko inprimagailuak\n" +#~ " --[no-]share-printers Baimendu/Saihestu inprimagailua partekatzea\n" +#~ " --[no-]user-cancel-any Baimendu/Saihestu erabiltzaileek edozer lan " +#~ "bertan behera uztea\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Erabilera: cupsd [-c konfigurazio-fitxategia] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c konfigurazio-fitxategia Kargatu konfigurazioko beste fitxategi " +#~ "bat\n" +#~ "-f Exekutatu aurreko planoan\n" +#~ "-F Exekutatu aurreko planoan baina bereiztuta\n" +#~ "-h Erakutsi erabileraren mezu hau\n" +#~ "-l Exekutatu cupsd launchd(8)-etik\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Erabilera: cupsfilter -m mime/mota [ aukerak ] fitxategi-izena\n" +#~ "\n" +#~ "Aukerak:\n" +#~ "\n" +#~ " -c cupsd.conf Ezarri cupsd.conf fitxategia erabiltzeko\n" +#~ " -e Erabili PPD fitxategiko iragazki bakoitza\n" +#~ " -j lanaren-id[,N] Iragazi N fitxategia zehaztutako lanetik " +#~ "(lehenetsia 1. fitxategia da)\n" +#~ " -n kopiak Ezarri kopia kopurua\n" +#~ " -o izena=balioa Ezarri aukerak\n" +#~ " -p fitxategi-izena.ppd Ezarri PPD fitxategia\n" +#~ " -t titulua Ezarri titulua\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Erabilera: cupstestdsc [aukerak] fitxategi-izena.ps [... fitxategi-izena." +#~ "ps]\n" +#~ " cupstestdsc [aukerak] -\n" +#~ "\n" +#~ "Aukerak:\n" +#~ "\n" +#~ " -h Erakutsi programaren erabilera\n" +#~ "\n" +#~ " Oharra: programa honek DSC iruzkinak soilik balidatzen ditu, ez " +#~ "PostScript bera.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Erabilera: cupstestppd [aukerak] fitxategia1.ppd[.gz] [... fitxategia.ppd" +#~ "[.gz]]\n" +#~ " programa | cupstestppd [aukerak] -\n" +#~ "\n" +#~ "Aukerak:\n" +#~ "\n" +#~ " -R erroko-direktorioa Ezarri beste erro bat\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Igorri abisuak erroreen ordez\n" +#~ " -q Exekutatu isilean\n" +#~ " -r Erabili modu ireki 'lasaia'\n" +#~ " -v Erakutsi xehetasun piskatekoa\n" +#~ " -vv Xehetasun askokoa\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Erabilera: lpmove lana/iturria helburua\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Erabilera: lpoptions [-h zerbitzaria] [-E] -d inprimagailua\n" +#~ " lpoptions [-h zerbitzaria] [-E] [-p inprimagailua] -l\n" +#~ " lpoptions [-h zerbitzaria] [-E] -p inprimagailua -o aukera" +#~ "[=balioa] ...\n" +#~ " lpoptions [-h zerbitzaria] [-E] -x inprimagailua\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Erabilera: lppasswd [-g talde-izena]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Erabilera: lppasswd [-g talde-izena] [erabiltzaile-izena]\n" +#~ " lppasswd [-g talde-izena] -a [erabiltzaile-izena]\n" +#~ " lppasswd [-g talde-izena] -x [erabiltzaile-izena]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Erabilera: lpq [-P helb] [-U erab-izena] [-h ostalari-izena[:ataka]] [-l] " +#~ "[+barrutia]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Erabilera: ppdc [aukerak] fitxategia.drv [ ... fitxategiaN.drv ]\n" +#~ "\n" +#~ "Aukerak:\n" +#~ " -D izena=balioa Ezarri izendatutako aldagaia balioarekin.\n" +#~ " -I include-dir Gehitu include direktorioa bilaketako bide-" +#~ "izenari.\n" +#~ " -c katalogoa.po Kargatu zehaztutako mezuen katalogoa.\n" +#~ " -d irteerako-dir Zehaztu irteerako direktorioa.\n" +#~ " -l hizk[,hizk,...] Zehaztu irteerako hizkuntzak (lokalak).\n" +#~ " -m Erabili ModelName balioa fitxategi-izen gisa.\n" +#~ " -t Probatu PPDak, haiek sortu ordez.\n" +#~ " -v Hitzez hitz (zenbat eta 'v' gehiago, xehetasun " +#~ "gehiago).\n" +#~ " -z Konprimitu PPD fitxategiak GNU zip erabiliz.\n" +#~ " --cr Amaitu lerroak CRrekin (Mac OS 9).\n" +#~ " --crlf Amaitu lerroak CR + LFrekin (Windows).\n" +#~ " --lf Amaitu lerroak LFrekin (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Erabilera: ppdhtml [aukerak] fitxategia.drv >fitxategia.html\n" +#~ " -D izena=balioa Ezarri izendatutako aldagaia balioarekin.\n" +#~ "Aukerak:\n" +#~ " -I include-dir Gehitu include direktorioa bilaketako bide-" +#~ "izenari.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Erabilera: ppdi [aukerak] fitxategia.ppd [ ... fitxategiaN.ppd ]\n" +#~ "Aukerak:\n" +#~ " -I include-dir\n" +#~ " -o fitxategia.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Erabilera: ppdmerge [aukerak] fitxategia.ppd [ ... fitxategiaN.ppd ]\n" +#~ "Aukerak:\n" +#~ " -o fitxategia.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Erabilera: ppdpo [aukerak] -o fitxategia.po fitxategia.drv [ ... " +#~ "fitxategiaN.drv ]\n" +#~ "Aukerak:\n" +#~ " -D izena=balioa Ezarri izendatutako aldagaia balioarekin.\n" +#~ " -I include-dir Gehitu include direktorioa bilaketako bide-" +#~ "izenari.\n" +#~ " -v Hitzez hitz (zenbat eta 'v' gehiago, xehetasun " +#~ "gehiago).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Erabilera: snmp [ostalari-edo-ip-helbidea]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: aurkitutako aurreneko %d inprimagailu gehitzen" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: \"%s\" waitof aukeran boolear bat espero zen\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: huts egin du albo-kanaleko eskaera irakurtzean\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: \"%s\" aukera ezin da sartu IncludeFeature bidez\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: inprimagailuak ez du erantzuten\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: inprimagailuak ustekabeko EOF bidali du\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: urruneko ostalariak ez du erantzun komandoaren egoeraren " +#~ "bytearekin %d segundo ondoren\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: urruneko ostalariak ez du erantzun kotroleko egoeraren " +#~ "bytearekin %d segundo ondoren\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: urruneko ostalariak ez du erantzun datuen egoeraren bytearekin %" +#~ "d segundo ondoren\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: SCSI komandoak denboraren muga gainditu du (%d). Berriro " +#~ "saiatzen...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: dokumentu hau ez dator bat Abode Document Structuring " +#~ "Conventions-eko zehaztapenekin, eta ez da ongi inprimatuko.\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: ezin da \"%s:%s\" ireki: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: ezin da PAP egoeraren eskaera bidali" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: ustekabeko PAP paketea %d motakoa\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: %d motako PAP pakete ezezaguna\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: \"%s\" hautaketa ezezaguna \"%s\" aukeran\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: \"%s\" aukera ezezaguna\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: %s baudio-emaria onartu gabea\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: zenbakia espero en \"%s\" egoeraren aukeran\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: berreskuratu daiteke. Sareko '%s' ostalaria lanpetuta dago. " +#~ "Berriro saiatuko da %d segundo barru...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Abisua, ez dago Windows 2000 sistemako inprimagailuen kontrolatzailerik " +#~ "instalatuta." + +#~ msgid "You4 Envelope" +#~ msgstr "You4 gutunazala" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: erabili -f aukera bihurtzea nahi den fitxategia zehazteko.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "" +#~ "cupsaddsmb: ez dago PPD fitxategirik \"%s\" inprimagailuarentzako: %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: ezin da zerbitzariarekin konektatu: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: \"%s\" aukera ezezaguna.\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: \"-%c\" aukera ezezaguna.\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "" +#~ "cupsd: konfigurazioko fitxategia espero zen \"-c\" aukeraren ondoren.\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: ezin da uneko direktorioa lortu.\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: \"%s\" argumentu ezezaguna. Abortatzen.\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: \"%c\" aukera ezezaguna. Abortatzen.\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: ez da launchd(8) euskarriarekin konpilatu. Modu arruntean " +#~ "exekutatzen.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: baliogabeko %d dokumentu-zenbakia.\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: baliogabeko %d lanaren IDa.\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: fitxategi-izen bakarra soilik zehaztu daiteke.\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: ezin da lanaren fitxategia lortu: %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: -q aukera ez da bateragarria -v aukerarekin.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: -v aukera ez da bateragarria -q aukerarekin.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "%s/%s(r)en gailua: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "%s(r)en gailua: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tkomandoei buruzko laguntza eskaintzen du\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri atributua falta da." + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: klasearen izenak karaktere inprimagarriak soilik eduki ditzake.\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: PPDa espero zen '-P' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin: Expected alerabiltzaile-zerrenda espero zen st afaukeraren " +#~ "ondoren.\n" +#~ "option!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: klasea espero zen '-r' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: klasearen izena espero zen '-c' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: deskripzioa espero zen '-D' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: gailuaren URIa espero zen '-v' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: fitxategi motak espero ziren '-I' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: ostalari-izena espero zen '-h' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: interfazea espero zen '-i' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: kokalekua espero zen '-L' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: modeloa espero zen '-m' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: izena=balioa espero zen '-o' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: inprimagailua espero zen '-p' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "" +#~ "lpadmin: inprimagailuaren izena espero zen '-d' aukeraren ondoren.\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "" +#~ "lpadmin: inprimagailua edo klasea espero zen '-x' aukeraren ondoren.\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: ez da kideen izenik ikusi.\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: %s inprimagailua jadanik %s klasearen kidea da.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: %s inprimagailua ez da %s klaseko kidea.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: inprimagailuaren izenak karaktere inprimagarriak soilik eduki " +#~ "ditzake.\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da inprimagailua klaseari gehitu:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: ezin da zerbitzariarekin konektatu: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: ezin da \"%s\" PPD fitxategia ireki: %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: ezin da \"%s\" fitxategia ireki: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da inprimagailua klasetik kendu:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da PPD fitxategia ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da gailuaren URIa ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da interfazearen script-a edo PPD fitxategia ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da interfazearen script-a ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da inprimagailuaren deskripzioa ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin da inprimagailuaren kokalekua ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: ezin dira inprimagailuaren aukerak ezarri:\n" +#~ " Aurrenik inprimagailuaren izena zehaztu behar duzu.\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: \"%s\" allow/deny aukera ezezaguna.\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: '%s' argumentu ezezaguna.\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: '%c' aukera ezezaguna.\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: abisua - edukiaren moten zerrendari ezikusi egin zaio.\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo: 1284 gailuaren IDaren katea espero zen --device-id aukeraren " +#~ "ondoren.\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: hizkuntza espero zen --language aukeraren ondoren.\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "" +#~ "lpinfo: marka eta modeloa espero ziren --make-and-model aukeraren " +#~ "ondoren.\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "" +#~ "lpinfo: produktuaren katea espero zen --product aukeraren ondoren.\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "" +#~ "lpinfo: eskemen zerrenda espero zen --exclude-schemes aukeraren ondoren.\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "" +#~ "lpinfo: eskemen zerrenda espero zen --include-schemes aukeraren ondoren.\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: denbora-muga espero zen --timeout aukeraren ondoren.\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: '%s' argumentu ezezaguna.\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: '%c' aukera ezezaguna.\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: '%s' aukera ezezaguna.\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: ezin da zerbitzariarekin konektatu: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: '%s' argumentu ezezaguna.\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: '%c' aukera ezezaguna.\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: inprimagailurik ez?\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: ezin da inprimagailua edo instantzia gehitu: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "" +#~ "lpoptions: ezin da PPD fitxategia lortu %s inprimagailuarentzako: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: ezin da PPD fitxategia ireki %s(r)entzako.\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: inprimagailua edo klasea ezezaguna.\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "" +#~ "lppasswd: supererabiltzaileak (root) soilik gehitu edo ezabatu ditzake " +#~ "pasahitzak.\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: pasahitzen fitxategia lanpetuta.\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: pasahitzen fitxategia ez da eguneratu.\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: pasahitzak ez dira berdinak.\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: pasahitza ukatu da.\n" +#~ "Zure pasahitzak gutxiene 6 karaktere izan behar ditu, ezin du\n" +#~ "zure erabiltzaile-izenik eduki, eta gutxienez hizki bat eta zenbaki bat " +#~ "eduki behar du.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: pasahitzak ez datoz bat.\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: ezin da pasahitzaren katea kopiatu: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: ezin da pasahitzen fitxategia ireki: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: ezin da pasahitzen fitxategian idatzi: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: huts egin du pasahitzen fitxategi zaharraren babeskopia " +#~ "egitean: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: huts egin du pasahitzen fitxategia izenez aldatzean: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "" +#~ "lppasswd: \"%s\" erabiltzailea eta \"%s\" taldea ez dira existitzen.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: errorea . Inguruneko %s aldagaiak existitzen ez den \"%s\" " +#~ "helburua izendatzen du.\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "%s klasearen kideak:\n" + +#~ msgid "no entries\n" +#~ msgstr "sarrerarik ez\n" + +#~ msgid "no system default destination\n" +#~ msgstr "ez dago sistemako helburu lehenetsirik.\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events ez da zehaztu." + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "\"%s\" notify-recipient-uri URIa jadanik erabilita dago." + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "\"%s\" notify-recipient-uri URIak eskema ezezaguna darabil." + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "%d notify-subscription-id ez da ona." + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" include direktorioa gehitzen...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: UIaren testua gehitzen/eguneratzen %s(e)tik...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: okerreko balio boolearra (%s) %d lerroan of(e)n %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: okerreko \"%s\" bereizmen izena%d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: okerreko %s egoeraren gako-hitza %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: okerreko aldagaien ordezkaketa ($%c) %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: hautaketa aurkituta %d lerroan aukerarik gabeko %s(e)n.\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: %s lokalaren #po-a bikoiztua %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: iragazkiaren definizioa espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: programaren izena espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: balio boolearra espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: karaktere-jokoa espero zen Font-en ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: hautaketaren kodea espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: hautaketaren izena/tesua espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: koloreen ordena espero zen ColorModel-entzako %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: kolore-espazioa espero zen ColorModel-entzako %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: konpresioa espero zen ColorModel-entzako %d lerroan %s(e)n.\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: murriztapenen katea espero zen UIConstraints-entzako %d lerroan %s" +#~ "(e)n.\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: kontrolatzaile motaren gako-hitza espero zen DriverType-ren ondoren " +#~ "%d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: duplex mota espero zen Duplex-en ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: kodeketa espero zen Font-en ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: fitxategi-izena espero zen %s #po ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: taldearen izena/testua espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: include fitxategi-izena espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: osoko zenbakia espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: lokala espero zen espero zen #po ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen %s(rÇ)en ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen FileName ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen Font ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen Manufacturer ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen MediaSize ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen ModelName ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: izena espero zen PCFileName ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: izena/testua espero zen %s ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: izena/testua espero zen Installable ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: izena/testua espero zen Resolution ondoren %d lerroan %s(e)n.\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: izena/testuaren konbinazioa espero zen ColorModel-arentzako %d " +#~ "lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: aukeraren izena/testua espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: aukeraren atala espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: aukera mota espero zen %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: gainidazketaren eremua espero zen Resolution ondoren %d lerroan %s" +#~ "(e)n.\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: zenbaki erreala espero zen %d lerroan %s(e)n.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: bereizmena/euskarri mota espero zen ColorProfile ondoren %d lerroan " +#~ "%s(e)n.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: bereizmena/euskarri mota espero zen SimpleColorProfile ondoren %d " +#~ "lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: hautatzailea espero zen %s ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: egoera espero zen Font ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: katea espero zen Copyright ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: katea espero zen Version ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: aukeren bi izen espero ziren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: balioa espero zen %s ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: bertsioa espero zen Font ondoren %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: baliogabeko #include/#po \"%s\" fitxategi-izena.\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: baliogabeko iragazkiaren kostua %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: baliogabeko MIME mota hutsa iragazkiarentzako %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: baliogabeko prorgramare izen hutsa iragazkiarentzako %d lerroan %s" +#~ "(e)n.\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: baliogabeko aukeraren \"%s\" atala %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: baliogabeko aukeraren \"%s\" mota %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: kontrolatzailearen \"%s\" datu-fitxategia kargatzen...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" lokalaren mezuak kargatzen...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: mezuak \"%s\"(e)tik kargatzen...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif falta da \"%s\"(r)en amaieran.\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if falta da %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: ez da mezuen katalogorik eman %s lokalarentzako.\n" + +#~ msgid "ppdc: Option %s defined in two different groups on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %s aukera bi talde desberdinetan definituta %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %s aukera berriro definituta mota desberdin batekin %d lerroan %s(e)" +#~ "n.\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: aukeraren murriztapenak *izena eduki behar du %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: habiarazitako #if gehiegi %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: ezin da \"%s\" PPD fitxategia sortu: %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: ezin da %s irteerako direktorioa sortu: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: ezin dira irteerako kanalizazioak sortu: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: ezin da cupstestppd exekutatu: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: ezin da %s #po fitxategia aurkitu %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: ezin da \"%s\" include fitxategia aurkitu %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: ezin da lokalizazioa aurkitu \"%s\"(r)entzako: %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: ezin da \"%s\" lokalizazioaren fitxategia kargatu: %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: definitu gabeko aldagaia (%s) %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: %s kontrolatzaile mota ezezaguna %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: \"%s\" duplex mota ezezaguna %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: \"%s\" euskarri-tamaina ezezaguna %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: \"%s\" token ezezaguna ikusi da %d lerroan %s(e)n.\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: amaierako karaktere ezezagunak \"%s\" zenbaki errealean %d lerroan %" +#~ "s(e)n.\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: %c(r)ekin hasitako amaitu gabeko katea %d lerroan %s(e)n.\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: %s inprimatzen...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: PPD fitxategiak \"%s\" direktorioan idazten...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: okerreko \"%s\" LanguageVersion %s(e)n\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: %s PPD fitxategiari ezikusi egiten...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: ezin da %s(r)en babeskopia %s(e)n egin: %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "printer %s desgaituta %s ostean\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "%s inprimagailua inaktibo dago. Gaituta %s ostetik.\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "%s inprimagailua orain %s-%d inprimatzen ari da. Gaituta %s ostetik.\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "%s/%s inprimagailua desgaituta %s ostetik\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "%s/%s inprimagailua inaktibo dago. Gaituta %s ostetik.\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "%s/%s inprimagailua orain %s-%d inprimatzen ari da. Gaituta %s ostetik.\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "eskaeraren IDa %s-%d da (%d fitxategi)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "antolatzailea ez da exekutatzen ari.\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "antolatzailea exekutatzen ari da.\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\terakutsi daemon-aren eta ilararen egoera\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "sistemako helburu lehenetsia: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "sistemako helburu lehenetsia: %s/%s\n" diff --git a/locale/cups_fi.po b/locale/cups_fi.po new file mode 100644 index 0000000..e57719b --- /dev/null +++ b/locale/cups_fi.po @@ -0,0 +1,8710 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-12 15:10+0200\n" +"Last-Translator: Teppo Turtiainen \n" +"Language-Team: Finnish\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimetriä" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f - %.0f x %.0f millimetriä" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f tuumaa" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f - %.2f x %.2f tuumaa" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "Kohdetta %s ei voida muuttaa." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 tuumaa/s" + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25 \"" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25 \"" + +msgid "1.5 inch/sec." +msgstr "1,5 tuumaa/s" + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25 \"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50 \"" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00 \"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00 \"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 tuumaa/s" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/s" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 tuumaa/s" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 tuumaa/s" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/s" + +msgid "120x60dpi" +msgstr "120 x 60 dpi" + +msgid "120x72dpi" +msgstr "120 x 72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/s" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/s" + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 tuumaa/s" + +msgid "2-Sided Printing" +msgstr "Kaksipuolinen tulostus" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37 \"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50 \"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00 \"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25 \"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00 \"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00 \"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00 \"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50 \"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50 \"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25 \"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00 \"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50 \"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50 \"" + +msgid "2.5 inches/sec." +msgstr "2,5 tuumaa/s" + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00 \"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00 \"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25 \"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1 \"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/s" + +msgid "200 mm/sec." +msgstr "200 mm/s" + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-nastainen" + +msgid "240x72dpi" +msgstr "240 x 72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/s" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 tuumaa/s" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00 \"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25 \"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00 \"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00 \"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00 \"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00 \"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00 \"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50 \"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83 \"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83 \"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3,5 \" levy" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5 \" levy - 2 1/8 x 2 3/4 \"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00 \"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/s" + +msgid "300 mm/sec." +msgstr "300 mm/s" + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360 x 180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 tuumaa/s" + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00 \"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00 \"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00 \"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50 \"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00 \"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00 \"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00 \"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00 \"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50 \"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/s" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 tuumaa/s" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 tuumaa/s" + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00 \"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00 \"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00 \"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00 \"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00 \"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00 \"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50 \"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/s" + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 tuumaa/s" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 tuumaa/s" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00 \"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00 \"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00 \"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00 \"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00 \"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00 \"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50 \"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/s" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 tuumaa/s" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-nastainen" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Hyväksy töitä" + +msgid "Accepted" +msgstr "Hyväksytty" + +msgid "Add Class" +msgstr "Lisää luokka" + +msgid "Add Printer" +msgstr "Lisää tulostin" + +msgid "Add RSS Subscription" +msgstr "Lisää RSS-tilaus" + +msgid "Address" +msgstr "Osoite" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Osoite - 1 1/8 x 3 1/2 \"" + +msgid "Administration" +msgstr "Ylläpito" + +msgid "Always" +msgstr "Aina" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applikaattori" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Virheellinen NULL dests -osoitin" + +msgid "Bad OpenGroup" +msgstr "Virheellinen OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Virheellinen OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Virheellinen OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Virheellinen pyyntö" + +msgid "Bad SNMP version number" +msgstr "Virheellinen SNMP-versionumero" + +msgid "Bad UIConstraints" +msgstr "Virheellinen UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Virheellinen kopioiden määrä %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Virheellinen muokattu parametri" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Virheellinen number-up-arvo %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Virheelliset page-ranges-arvot %d - %d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Otsikot" + +msgid "Billing Information: " +msgstr "Laskutustiedot: " + +msgid "Bond Paper" +msgstr "Bond-paperi" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL-tarratulostin" + +msgid "Cancel RSS Subscription" +msgstr "Peru RSS-tilaus" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Muuta asetuksia" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Luokat" + +msgid "Clean Print Heads" +msgstr "Puhdista tulostuspäät" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Väri" + +msgid "Color Mode" +msgstr "Väritila" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Yhteisönimi käyttää määrittämätöntä pituutta" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Jatka" + +msgid "Continuous" +msgstr "Jatkuva" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Luotu" + +msgid "Created On: " +msgstr "Luotu: " + +msgid "Custom" +msgstr "Muokattu" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Leikkaa" + +msgid "Cutter" +msgstr "Leikkaaja" + +msgid "Dark" +msgstr "Tumma" + +msgid "Darkness" +msgstr "Tummuus" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Poista luokka" + +msgid "Delete Printer" +msgstr "Poista tulostin" + +msgid "Description: " +msgstr "Kuvaus: " + +msgid "DeskJet Series" +msgstr "DeskJet-sarja" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Kohde ”%s” ei vastaanota töitä." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Suora lämpömedia" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Pois käytöstä" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Ajurin nimi: " + +msgid "Driver Version: " +msgstr "Ajurin versio: " + +msgid "Duplexer" +msgstr "Duplekseri" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1-tarratulostin" + +msgid "EPL2 Label Printer" +msgstr "EPL2-tarratulostin" + +msgid "Edit Configuration File" +msgstr "Muokkaa asetustiedostoa" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Loppuotsikko" + +msgid "English" +msgstr "Finnish" + +msgid "Enter old password:" +msgstr "Syötä vanha salasana:" + +msgid "Enter password again:" +msgstr "Syötä salasana uudelleen:" + +msgid "Enter password:" +msgstr "Syötä salasana:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Syötä oma käyttäjätunnuksesi ja salasanasi tai rootin käyttäjätunnus ja " +"salasana tämän sivun käyttämistä varten. Jos käytät Kerberos-todentamista, " +"varmista, että sinulla on kelvollinen Kerberos-lippu." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Kirjekuoren syöttö" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Virhekäytäntö" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Joka 10. tarra" + +msgid "Every 2 Labels" +msgstr "Joka 2. tarra" + +msgid "Every 3 Labels" +msgstr "Joka 3. tarra" + +msgid "Every 4 Labels" +msgstr "Joka 4. tarra" + +msgid "Every 5 Labels" +msgstr "Joka 5. tarra" + +msgid "Every 6 Labels" +msgstr "Joka 6. tarra" + +msgid "Every 7 Labels" +msgstr "Joka 7. tarra" + +msgid "Every 8 Labels" +msgstr "Joka 8. tarra" + +msgid "Every 9 Labels" +msgstr "Joka 9. tarra" + +msgid "Every Label" +msgstr "Joka tarra" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Odotus epäonnistui" + +msgid "Export Printers to Samba" +msgstr "Vie tulostimet Sambaan" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Arkistokansio" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Arkistokansio - 9/16 x 3 7/16 \"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Kielletty" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Yleiset" + +msgid "Generic" +msgstr "Yleinen" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU käyttää määrittämätöntä pituutta" + +msgid "Glossy Paper" +msgstr "Kiiltävä paperi" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Harmaasävy" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Riippukansio" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Riippukansio - 9/16 x 2 \"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Virheellinen ohjausmerkki" + +msgid "Illegal main keyword string" +msgstr "Virheellinen pääavainsanan merkkijono" + +msgid "Illegal option keyword string" +msgstr "Virheellinen valinta-avainsanan merkkijono" + +msgid "Illegal translation string" +msgstr "Virheellinen käännösmerkkijono" + +msgid "Illegal whitespace character" +msgstr "Virheellinen tyhjä merkki" + +msgid "Installable Options" +msgstr "Asennettavat lisävarusteet" + +msgid "Installed" +msgstr "Asennettu" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar-tarratulostin" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Sisäinen virhe" + +msgid "Internet Postage 2-Part" +msgstr "Internet-postimerkki kaksiosainen" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet-postimerkki kaksiosainen - 2 1/4 x 7 1/2 \"" + +msgid "Internet Postage 3-Part" +msgstr "Internet-postimerkki kolmiosainen" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet-postimerkki kolmiosainen - 2 1/4 x 7 \"" + +msgid "Internet Printing Protocol" +msgstr "Internet Printing Protocol" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Työ %d on jo keskeytetty - ei voida perua." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Työ %d on jo peruttu - ei voida perua." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Työ %d on jo suoritettu - ei voida perua." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Työ suoritettu" + +msgid "Job Created" +msgstr "Työ luotu" + +msgid "Job ID: " +msgstr "Työn tunnus: " + +msgid "Job Options Changed" +msgstr "Työn valintoja muutettu" + +msgid "Job Stopped" +msgstr "Työ pysäytetty" + +msgid "Job UUID: " +msgstr "Työn UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "Työ on suoritettu eikä sitä voida muuttaa." + +msgid "Job operation failed:" +msgstr "Työtoiminto epäonnistui:" + +msgid "Job state cannot be changed." +msgstr "Työn tilaa ei voida muuttaa." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Työt" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-palvelin tai -tulostin" + +msgid "Label Printer" +msgstr "Tarratulostin" + +msgid "Label Top" +msgstr "Tarran yläpuoli" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Suuri osoite" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Suuri osoite - 1 4/10 x 3 1/2 \"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Vaalea" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Rivi on pidempi kuin suurin sallittu (255 merkkiä)" + +msgid "List Available Printers" +msgstr "Luetteloi käytettävissä olevat tulostimet" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Sijainti: " + +msgid "Long-Edge (Portrait)" +msgstr "Pitkä reuna (pysty)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Merkki ja malli: " + +msgid "Manual Feed" +msgstr "Käsinsyöttö" + +msgid "Media Dimensions: " +msgstr "Median mitat: " + +msgid "Media Limits: " +msgstr "Median rajat: " + +msgid "Media Name: " +msgstr "Median nimi: " + +msgid "Media Size" +msgstr "Median koko" + +msgid "Media Source" +msgstr "Median lähde" + +msgid "Media Tracking" +msgstr "Median seuranta" + +msgid "Media Type" +msgstr "Median tyyppi" + +msgid "Medium" +msgstr "Keskikokoinen" + +msgid "Memory allocation error" +msgstr "Muistinvarausvirhe" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x-otsake puuttuu" + +msgid "Missing asterisk in column 1" +msgstr "Tähtimerkki puuttuu sarakkeesta 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Arvomerkkijono puuttuu" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Muokkaa luokkaa" + +msgid "Modify Printer" +msgstr "Muokkaa tulostinta" + +msgid "Move All Jobs" +msgstr "Siirrä kaikki työt" + +msgid "Move Job" +msgstr "Siirrä työ" + +msgid "Moved Permanently" +msgstr "Siirretty pysyvästi" + +msgid "NULL PPD file pointer" +msgstr "PPD-tiedoston osoitin NULL" + +msgid "Name OID uses indefinite length" +msgstr "Nimi-OID käyttää määrittelemätöntä pituutta" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Ei koskaan" + +msgid "New Stylus Color Series" +msgstr "Uusi Stylus Color Series" + +msgid "New Stylus Photo Series" +msgstr "Uusi Stylus Photo Series" + +msgid "No" +msgstr "Ei" + +msgid "No Content" +msgstr "Ei sisältöä" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Ei VarBind SEQUENCE:a" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Ei aktiivista yhteyttä" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Ei yhteisönimeä" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Kohteita ei lisätty." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Ei virheindeksiä" + +msgid "No error-status" +msgstr "Ei virhetilaa" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Ei nimi-OID:tä" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Ei pyyntötunnistetta" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Tilauksia ei löytynyt." + +msgid "No variable-bindings SEQUENCE" +msgstr "Ei variable-bindings SEQUENCE:a" + +msgid "No version number" +msgstr "Ei versionumeroa" + +msgid "Non-continuous (Mark sensing)" +msgstr "Ei-jatkuva (mark sensing)" + +msgid "Non-continuous (Web sensing)" +msgstr "Ei-jatkuva (web sensing)" + +msgid "Normal" +msgstr "Normaali" + +msgid "Not Found" +msgstr "Ei löytynyt" + +msgid "Not Implemented" +msgstr "Ei toteutettu" + +msgid "Not Installed" +msgstr "Ei asennettu" + +msgid "Not Modified" +msgstr "Ei muokattu" + +msgid "Not Supported" +msgstr "Ei tuettu" + +msgid "Not allowed to print." +msgstr "Tulostaminen ei ole sallittua." + +msgid "Note" +msgstr "Huomaa" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Pois (yksipuolinen)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Verkko-ohjeet" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "kohteen %s avaaminen epäonnistui: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup ilman edeltävää CloseGroup:ia" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI ilman edeltävää CloseUI/JCLCloseUI:ta" + +msgid "Operation Policy" +msgstr "Toimintakäytäntö" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Valinnat asennettu" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Valinnat: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Tulostetila" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL-lasertulostin" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Paketti ei sisällä Get-Response-PDU:ta" + +msgid "Packet does not start with SEQUENCE" +msgstr "Paketti ei ala SEQUENCE:lla" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Salasana kohteelle %s kohteessa %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "" +"Kohteelle %s tarvitaan salasana kohteen %s käyttämiseen Samban kautta: " + +msgid "Pause Class" +msgstr "Keskeytä luokka" + +msgid "Pause Printer" +msgstr "Keskeytä tulostin" + +msgid "Peel-Off" +msgstr "Irrotettava" + +msgid "Photo" +msgstr "Valokuva" + +msgid "Photo Labels" +msgstr "Valokuvatarrat" + +msgid "Plain Paper" +msgstr "Tavallinen paperi" + +msgid "Policies" +msgstr "Käytännöt" + +msgid "Port Monitor" +msgstr "Porttimonitori" + +msgid "PostScript Printer" +msgstr "PostScript-tulostin" + +msgid "Postcard" +msgstr "Postikortti" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Tulostustiheys" + +msgid "Print Job:" +msgstr "Tulosta työ:" + +msgid "Print Mode" +msgstr "Tulostustila" + +msgid "Print Rate" +msgstr "Tulostustaajuus" + +msgid "Print Self-Test Page" +msgstr "Tulosta itsetestisivu" + +msgid "Print Speed" +msgstr "Tulostusnopeus" + +msgid "Print Test Page" +msgstr "Tulosta testisivu" + +msgid "Print and Cut" +msgstr "Tulosta ja leikkaa" + +msgid "Print and Tear" +msgstr "Tulosta ja revi" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Tulostettu kohteelle: " + +msgid "Printed From: " +msgstr "Tulostettu kohteesta: " + +msgid "Printed On: " +msgstr "Tulostettu: " + +msgid "Printer Added" +msgstr "Tulostin lisätty" + +msgid "Printer Default" +msgstr "Tulostimen oletus" + +msgid "Printer Deleted" +msgstr "Tulostin poistettu" + +msgid "Printer Modified" +msgstr "Tulostinta muokattu" + +msgid "Printer Name: " +msgstr "Tulostimen nimi: " + +msgid "Printer Paused" +msgstr "Tulostin keskeytetty" + +msgid "Printer Settings" +msgstr "Tulostinasetukset" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Tulostin:" + +msgid "Printers" +msgstr "Tulostimet" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Poista työt" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Kiintiöraja saavutettu." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Hylkää työt" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Tulosta uudelleen virheen jälkeen" + +msgid "Request Entity Too Large" +msgstr "Pyydetty kohde liian suuri" + +msgid "Resolution" +msgstr "Tarkkuus" + +msgid "Resume Class" +msgstr "Jatka luokka" + +msgid "Resume Printer" +msgstr "Jatka tulostin" + +msgid "Return Address" +msgstr "Palautusosoite" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Palautusosoite - 3/4 x 2 \"" + +msgid "Rewind" +msgstr "Kelaa taaksepäin" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE käyttää määrittämätöntä pituutta" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Katso muu" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Sarjaportti %d" + +msgid "Server Restarted" +msgstr "Palvelin käynnistettiin uudelleen" + +msgid "Server Security Auditing" +msgstr "Palvelimen turvallisuustarkastus" + +msgid "Server Started" +msgstr "Palvelin käynnistetty" + +msgid "Server Stopped" +msgstr "Palvelin pysäytetty" + +msgid "Service Unavailable" +msgstr "Palvelu ei käytettävissä" + +msgid "Set Allowed Users" +msgstr "Aseta sallitut käyttäjät" + +msgid "Set As Server Default" +msgstr "Aseta palvelimen oletukseksi" + +msgid "Set Class Options" +msgstr "Aseta luokan valinnat" + +msgid "Set Printer Options" +msgstr "Aseta tulostimen valinnat" + +msgid "Set Publishing" +msgstr "Aseta julkaisu" + +msgid "Shipping Address" +msgstr "Lähetysosoite" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Lähetysosoite - 2 5/16 x 4 \"" + +msgid "Short-Edge (Landscape)" +msgstr "Lyhyt reuna (vaaka)" + +msgid "Special Paper" +msgstr "Erikoispaperi" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standardi" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Aloitetaan otsikkoa" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Lausunto" + +msgid "Stylus Color Series" +msgstr "Stylus Color Series" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Series" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Vaihdetaan protokollia" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Revi" + +msgid "Tear-Off" +msgstr "Repäisy" + +msgid "Tear-Off Adjust Position" +msgstr "Repäisykohdan säätö" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "PPD-tiedostoa ”%s” ei löytynyt." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "PPD-tiedostoa ”%s” ei voitu avata: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Luokan nimi voi sisältää enintään 127 näkyvää merkkiä eikä voi sisältää " +"välilyöntejä, kauttaviivoja (/) eikä ristikkomerkkiä (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"notify-lease-duration-attribuuttia ei voida käyttää työtilausten kanssa." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Tulostimen nimi voi sisältää enintään 127 näkyvää merkkiä eikä voi sisältää " +"välilyöntejä, kauttaviivoja (/) eikä ristikkomerkkiä (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri ”%s” sisältää virheellisiä merkkejä." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"printer-uri:n on oltava muotoa ”ipp://PALVELINNIMI/classes/LUOKANNIMI”." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"printer-uri:n on oltava muotoa ”ipp://PALVELINNIMI/printers/TULOSTIMENNIMI”." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Tilauksen nimi ei voi sisältää välilyöntejä, kauttaviivoja (/), " +"kysymysmerkkejä (?) eikä ristikkomerkkiä (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Tilauksia on liikaa." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Lämpösiirtomedia" + +msgid "Title: " +msgstr "Otsikko: " + +msgid "Too many active jobs." +msgstr "Liikaa aktiivisia töitä." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Kalvo" + +msgid "Tray" +msgstr "Alusta" + +msgid "Tray 1" +msgstr "Alusta 1" + +msgid "Tray 2" +msgstr "Alusta 2" + +msgid "Tray 3" +msgstr "Alusta 3" + +msgid "Tray 4" +msgstr "Alusta 4" + +msgid "URI Too Long" +msgstr "Osoite liian pitkä" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB-sarjaportti %d" + +msgid "Unable to access cupsd.conf file:" +msgstr "cupsd.conf-tiedostoa ei voida käyttää:" + +msgid "Unable to add RSS subscription:" +msgstr "RSS-tilausta ei voida lisätä:" + +msgid "Unable to add class:" +msgstr "Luokkaa ei voida lisätä:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Tulostinta ei voida lisätä:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "RSS-tilausta ei voida perua:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "printer-is-shared-attribuuttia ei voida muuttaa:" + +msgid "Unable to change printer:" +msgstr "Tulostinta ei voida vaihtaa:" + +msgid "Unable to change server settings:" +msgstr "Palvelimen asetuksia ei voida muuttaa:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Palvelimeen ei voida yhdistää." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Tilapäistiedostoa ei voida luoda:" + +msgid "Unable to delete class:" +msgstr "Luokkaa ei voida poistaa:" + +msgid "Unable to delete printer:" +msgstr "Tulostinta ei voida poistaa:" + +msgid "Unable to do maintenance command:" +msgstr "Ylläpitokomentoa ei voida suorittaa:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Luokkaluetteloa ei voida hakea:" + +msgid "Unable to get class status:" +msgstr "Luokan tilaa ei voida hakea:" + +msgid "Unable to get list of printer drivers:" +msgstr "Luetteloa tulostinajureista ei voida hakea:" + +msgid "Unable to get printer attributes:" +msgstr "Tulostimen attribuutteja ei voida hakea:" + +msgid "Unable to get printer list:" +msgstr "Tulostinluetteloa ei voida hakea:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Tulostimen tilaa ei voida hakea:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Luokkaa ei voida muokata:" + +msgid "Unable to modify printer:" +msgstr "Tulostinta ei voida muokata:" + +msgid "Unable to move job" +msgstr "Työtä ei voida siirtää" + +msgid "Unable to move jobs" +msgstr "Töitä ei voida siirtää" + +msgid "Unable to open PPD file" +msgstr "PPD-tiedostoa ei voida avata" + +msgid "Unable to open PPD file:" +msgstr "PPD-tiedostoa ei voida avata:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "cupsd.conf-tiedostoa ei voida avata:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Testisivua ei voida tulostaa:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Valintoja ei voida asettaa:" + +msgid "Unable to set server default:" +msgstr "Palvelimen oletusta ei voida asettaa:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "cupsd.conf-tiedostoa ei voida lähettää:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Valtuuttamaton" + +msgid "Units" +msgstr "Yksiköt" + +msgid "Unknown" +msgstr "Tuntematon" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Tuntematon printer-error-policy ”%s”." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Tuntematon printer-op-policy ”%s”." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Ei-tuettu arvotyyppi" + +msgid "Upgrade Required" +msgstr "Päivitys vaaditaan" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Arvo käyttää määrittämätöntä pituutta" + +msgid "VarBind uses indefinite length" +msgstr "VarBind käyttää määrittämätöntä pituutta" + +msgid "Version uses indefinite length" +msgstr "Versio käyttää määrittämätöntä pituutta" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Kyllä" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Sivua on käytettävä käyttäen osoitetta https://%" +"s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL-tarratulostin" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "keskeytetty" + +msgid "canceled" +msgstr "peruttu" + +msgid "completed" +msgstr "suoritettu" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced:n suorittaminen epäonnistui." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd:n suorittaminen epäonnistui." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index käyttää määrittämätöntä pituutta" + +msgid "error-status uses indefinite length" +msgstr "error-status käyttää määrittämätöntä pituutta" + +msgid "held" +msgstr "pidetty" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "toimeton" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "odottaa" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "käsitellään" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id käyttää määrittämätöntä pituutta" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "kohteen %s stat epäonnistui: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "pysäytetty" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "tuntematon" + +msgid "untitled" +msgstr "nimetön" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings käyttää määrittämätöntä pituutta" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(kaikki)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(ei mitään)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d tietuetta\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tVian jälkeen: jatka\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tVaroitukset:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tOtsikko vaaditaan\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tMerkistöt:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tYhteys: suora\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tYhteys: etä\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tSivun oletuskoko:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tOletusmerkkiväli:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tPortin oletusasetukset:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tKuvaus: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tLomake liitetty:\n" +#~ "\tSisältötyypit: mikä tahansa\n" +#~ "\tTulostintyypit: tuntematon\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tLomakkeet sallittu:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tLiitäntä: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tLiitäntä: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tLiitäntä: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tSijainti: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tVian aikana: ei varoitusta\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tKäyttäjät sallittu:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tKäyttäjät estetty:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\ttaustaprosessi käynnissä\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tei tietueita\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\ttulostin on laitteessa ”%s” nopeus -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\ttulostus on pois käytöstä\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\ttulostus on käytössä\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tjonossa kohteelle %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tjonotus on pois käytöstä\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tjonotus on käytössä\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tsyy tuntematon\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " YKSITYISKOHTAISET STANDARDIENMUKAISUUSTESTIN TULOKSET\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " VIITE: sivu 15, osa 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " VIITE: sivu 15, osa 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " VIITE: sivu 19, osa 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " VIITE: sivu 20, osa 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " VIITE: sivu 27, osa 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " VIITE: sivu 42, osa 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " VIITE: sivut 16 - 17, osa 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " VIITE: sivut 42 - 45, osa 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " VIITE: sivut 45 - 46, osa 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " VIITE: sivut 48 - 49, osa 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " VIITE: sivut 52 - 54, osa 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f tavua\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN ”%s %s” on ristiriidassa kohteen ”%s %s” kanssa\n" +#~ " (rajoitus=”%s %s %s %s”)\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN Kohteella %s ei ole vastaavia valintoja!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s jakaa yleisen etuliitteen kohteen %s kanssa\n" +#~ " VIITE: sivu 15, osa 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Oletusvaihtoehdot ovat ristiriidassa!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Kaksipuoleisuusvalinnan avainsana %s ei ehkä toimi " +#~ "odotetulla tavalla ja sen pitäisi olla nimeltään Duplex!\n" +#~ " VIITE: sivu 122, osa 5.17.\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Tiedosto sisältää sekaisin CR-, LF- ja CR LF -" +#~ "rivinvaihtoja!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding vaaditaan PPD 4.3 -määrityksessä.\n" +#~ " VIITE: sivut 56 - 57, osa 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Rivi %d sisältää vain tyhjää!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Manufacturer vaaditaan PPD 4.3 -määrityksessä.\n" +#~ " VIITE: sivut 58 - 59, osa 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN APDialogExtension-tiedosto ”%s” puuttuu\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN APPrinterIconPath-tiedosto ”%s” puuttuu\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN Muiden kuin Windowsin PPD-tiedostojen tulisi käyttää LF-" +#~ "rivinvaihtoja eikä CR LF -rivinvaihtoja!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Vanhentunut PPD-versio %.1f!\n" +#~ " VIITE: sivu 42, osa 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName on PPD-määrityksen vastaisesti pidempi kuin " +#~ "8.3.\n" +#~ " VIITE: sivut 61 - 62, osa 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokollat sisältävät PJL:ää, mutta JCL-attribuutteja ei " +#~ "ole asetettu.\n" +#~ " VIITE: sivut 78 - 79, osa 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokollat sisältävät sekä PJL:ää etä BCP:tä; TBCP:tä " +#~ "odotettiin.\n" +#~ " VIITE: sivut 78 - 79, osa 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName vaaditaan PPD 4.3 -määrityksessä.\n" +#~ " VIITE: sivut 64 - 65, osa 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " Kohdetta %s %s %s ei ole olemassa!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Virheellinen %s vaihtoehto %s!\n" +#~ " VIITE: sivu 122, osa 5.17.\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Virheellinen UTF-8 ”%s” käännösmerkkijono valinnalle %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Virheellinen UTF-8 ”%s” käännösmerkkijono valinnalle %s, " +#~ "vaihtoehto %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Virheellinen cupsFilter-arvo ”%s”!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Virheellinen cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Virheellinen cupsPreFilter-arvo ”%s”!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Virheellinen cupsUIConstraints %s: ”%s”!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Virheellinen kieli ”%s”!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Tyhjä cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Käännösmerkkijono ”%s” valinnalle %s puuttuu!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Käännösmerkkijono ”%s” valinnalle %s puuttuu, vaihtoehto %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Vaihtoehto *%s %s kohteessa UIConstraints ”*%s %s *%s %s” " +#~ "puuttuu!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Vaihtoehto *%s %s kohteessa cupsUIConstraints %s: ”%s” " +#~ "puuttuu!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s cupsFilter-tiedosto ”%s” puuttuu!\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s cupsICCProfile-tiedosto ”%s” puuttuu!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s cupsPreFilter-tiedosto ”%s” puuttuu!\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver %s puuttuu!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Valinta %s kohteessa UIConstraints ”*%s %s *%s %s” puuttuu!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Valinta %s kohteessa cupsUIConstraints %s: ”%s” puuttuu!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Tiedostossa ei ole peruskäännöstä ”%s”!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s VAADITTU %s ei määrittele vaihtoehtoa None!\n" +#~ " VIITE: sivu 122, osa 5.17.\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr "" +#~ " %s cupsICCProfile %s hajautusarvo törmää kohteen %s kanssa!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s aiheuttaa silmukan!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Kohteen %s vaihtoehtojen nimet %s ja %s eroavat " +#~ "toisistaan vain isojen ja pienten merkkien osalta!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s on oltava 1284DeviceID!\n" +#~ " VIITE: sivu 72, osa 5.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN Default%s %s\n" +#~ " VIITE: sivu 40, osa 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN DefaultImageableArea %s!\n" +#~ " VIITE: sivu 102, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN DefaultPaperDimension %s!\n" +#~ " VIITE: sivu 103, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN JobPatchFile-attribuutti tiedostossa\n" +#~ " REF: sivu 24, osa 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN Manufacturer (tulisi olla ”HP”)\n" +#~ " REF: sivu 211, taulukko D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN Manufacturer (tulisi olla ”Oki”)\n" +#~ " REF: sivu 211, taulukko D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN ModelName - ”%c” ei ole sallittu " +#~ "merkkijonossa.\n" +#~ " VIITE: sivut 59 - 60, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN PSVersion - ei ”(string) int”.\n" +#~ " VIITE: sivut 62 - 64, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN Product - ei ”(string)”.\n" +#~ " VIITE: sivu 62, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VIRHEELLINEN ShortNickName - pidempi kuin 31 merkkiä.\n" +#~ " VIITE: sivut 64 - 65, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Virheellinen %s vaihtoehto %s!\n" +#~ " VIITE: sivu 84, osa 5.9.\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Virheellinen FileVersion ”%s”\n" +#~ " VIITE: Sivu 56, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Virheellinen FormatVersion ”%s”\n" +#~ " VIITE: Sivu 56, osa 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** Virheellinen LanguageEncoding %s - pitää olla ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **FAIL** Virheellinen LanguageVersion %s - pitää olla English!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **FAIL** Oletusarvoista valintakoodia ei voida tulkita: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Oletusarvoinen käännösmerkkijono valinnan %s " +#~ "vaihtoehdolle %s sisältää 8-bittisiä merkkejä!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Oletusarvoinen käännösmerkkijono valinnalle %s sisältää 8-" +#~ "bittisiä merkkejä!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Ryhmien nimet %s ja %s eroavat toisistaan vain isojen ja " +#~ "pienten merkkien osalta!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr "" +#~ " **FAIL** Useita esiintymiä kohteen %s vaihtoehtojen nimeä %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Vaihtoehtojen nimet %s ja %s eroavat toisistaan vain " +#~ "isojen ja pienten merkkien osalta!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN Default%s\n" +#~ " VIITE: sivu 40, osa 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN DefaultImageableArea\n" +#~ " VIITE: sivu 102, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN DefaultPaperDimension\n" +#~ " VIITE: sivu 103, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN FileVersion\n" +#~ " VIITE: sivu 56, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN FormatVersion\n" +#~ " VIITE: sivu 56, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN ImageableArea PageSize-arvolle %s\n" +#~ " VIITE: sivu 41, osa 5.\n" +#~ " VIITE: sivu 102, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN LanguageEncoding\n" +#~ " VIITE: sivut 56 - 57, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN LanguageVersion\n" +#~ " VIITE: sivut 57 - 58, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN Manufacturer\n" +#~ " VIITE: sivut 58 - 59, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN ModelName\n" +#~ " VIITE: sivut 59 - 60, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN NickName\n" +#~ " VIITE: sivu 60, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PCFileName\n" +#~ " VIITE: sivut 61 - 62, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PSVersion\n" +#~ " VIITE: sivut 62 - 64, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PageRegion\n" +#~ " VIITE: sivu 100, osa 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PageSize\n" +#~ " VIITE: sivu 41, osa 5.\n" +#~ " VIITE: sivu 99, osa 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PageSize\n" +#~ " VIITE: sivut 99 - 100, osa 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN PaperDimension PageSize-arvolle %s\n" +#~ " VIITE: sivu 41, osa 5.\n" +#~ " VIITE: sivu 103, osa 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN Product\n" +#~ " VIITE: sivu 62, osa 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** VAADITAAN ShortNickName\n" +#~ " VIITE: sivu 64 - 65, osa 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d VIRHETTÄ LÖYDETTIIN\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Virheellinen %%%%BoundingBox: rivillä %d!\n" +#~ " VIITE: sivu 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Virheellinen %%%%Page: rivillä %d!\n" +#~ " VIITE: sivu 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Virheellinen %%%%Pages: rivillä %d!\n" +#~ " VIITE: sivu 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Rivi %d on pidempi kuin 255 merkkiä (%d)!\n" +#~ " VIITE: sivu 25, Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 puuttuu ensimmäiseltä riviltä!\n" +#~ " VIITE: sivu 17, 3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments-kommentti puuttuu!\n" +#~ " VIITE: sivu 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox:-kommentti puuttuu tai on virheellinen!\n" +#~ " VIITE: sivu 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page:-kommentit puuttuvat tai ovat virheellisiä!\n" +#~ " VIITE: sivu 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages:-kommentti puuttuu tai on virheellinen!\n" +#~ " VIITE: sivu 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " VIRHEITÄ EI LÖYTYNYT\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " %d riviä ovat pidempiä kuin 255 merkkiä!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Liikaa %%BeginDocument-kommentteja!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Liikaa %%EndDocument-kommentteja!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Varoitus: tiedosto sisältää binääridataa!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Varoitus: tiedostossa ei ole %%EndComments-kommenttia!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Varoitus: tiedostossa on vanhentunut DSC-versio %.1f!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** PPD-tiedostoa ei voida avata - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** PPD-tiedostoa ei voida avata - %s rivillä %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Envelope" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Envelope" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Envelope" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Envelope" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Envelope" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f tavua\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f tavua\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s vastaanottaa pyyntöjä alkaen %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "Kohdetta %s ei ole toteutettu lpc:n CUPS-versiossa.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s ei ole valmis\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s on valmis\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s on valmis ja tulostaa\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s ei vastaanota pyyntöjä alkaen %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s ei ole tuettu!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s vastaanottaa pyyntöjä alkaen %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s ei vastaanota pyyntöjä alkaen %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [työ %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s epäonnistui: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: En tiedä mitä tehdä!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Virhe - %s ympäristömuuttujanimien kohdetta ”%s” ei ole olemassa!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Virhe - virheellinen työn tunnus!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Virhe - tiedostoja ei voida tulostaa ja työtä muuttaa " +#~ "samanaikaisesti!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Virhe - oletussyötevirrasta ei voida tulostaa, jos annetaan " +#~ "tiedostoja tai työn tunnus!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Virhe - S-valitsimen jälkeen odotettiin merkistöä!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Virhe - T-valitsimen jälkeen odotettiin sisältötyyppiä!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Virhe - n-valitsimen jälkeen odotettiin kopioiden lukumäärää!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Virhe - #-valitsimen jälkeen odotettiin kopioiden lukumäärää!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Virhe - P-valitsimen jälkeen odotettiin kohdetta!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Virhe - b-valitsimen jälkeen odotettiin kohdetta!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Virhe - d-valitsimen jälkeen odotettiin kohdetta!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Virhe - f-valitsimen jälkeen odotettiin muotoa!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Virhe - H-valitsimen jälkeen odotettiin pidon nimeä!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Virhe - H-valitsimen jälkeen odotettiin palvelinnimeä!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Virhe - h-valitsimen jälkeen odotettiin palvelinnimeä!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Virhe - y-valitsimen jälkeen odotettiin tilaluetteloa!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Virhe - %c-valitsimen jälkeen odotettiin nimeä!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Virhe - o-valitsimen jälkeen odotettiin valintamerkkijonoa!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Virhe - P-valitsimen jälkeen odotettiin sivuluetteloa!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Virhe - %c-valitsimen jälkeen odotettiin tärkeyttä!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Virhe - r-valitsimen jälkeen odotettiin syytekstiä!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Virhe - t-valitsimen jälkeen odotettiin otsikkoa!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Virhe - U-valitsimen jälkeen odotettiin käyttäjätunnusta!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Virhe - u-valitsimen jälkeen odotettiin käyttäjätunnusta!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Virhe - %c-valitsimen jälkeen odotettiin arvoa!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Virhe - W-valitsimen jälkeen tarvitaan ”completed”, ”not-completed” " +#~ "tai ”all”!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Virhe - oletuskohdetta ei ole käytettävissä.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Virhe - tärkeyden on oltava 1 - 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Virhe - ajastin ei vastaa!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Virhe - liikaa tiedostoja - ”%s”\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Virhe - kohdetta ”%s” ei voida käyttää - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Virhe - oletussyötevirrasta ei voida laittaa jonoon - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Virhe - tuntematon kohde - ”%s”\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Virhe - tuntematon kohde - ”%s/%s”\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Virhe - tuntematon valitsin ”%c”!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Virhe - tuntematon valitsin ”%s”!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: i-valitsimen jälkeen odotettiin työn tunnusta!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Suodin ”%s” ei ole käytettävissä: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Virheellinen kohdenimi luettelossa ”%s”!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Virheellinen suodinmerkkijono ”%s”\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: Tarvitaan työn tunnus (”-i jobid”) ennen ”-H restart” -valitsinta!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Ei suodinta, jolla muuntaa muodosta %s/%s muotoon %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Toiminto epäonnistui: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Salaustukea ei ole käännetty mukaan!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Palvelimeen ei voida yhdistää\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Palvelinta ei tavoitettu!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Kohteen ”%s” MIME-tyyppiä ei voida määrittää!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Kohdetta %s ei voida avata - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Kohdetta %s ei voida avata - %s linjalla %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Kohdetta %s ei voida avata: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: PPD-tiedostoa s ei voida avata: %s linjalla %d.\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: MIME-tietokantaa ei voida lukea kohteesta ”%s” tai ”%s”!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Tuntematon kohde - ”%s”\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Tuntematon kohde-MIME-tyyppi %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Tuntematon valitsin ”%c”!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Tuntematon lähde-MIME-tyyppi %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Varoitus - %c-muotovalitsinta ei tueta - tuloste saattaa olla " +#~ "virheellinen!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Varoitus - merkistövalitsin jätettiin huomioimatta!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Varoitus - sisältötyyppivalitsin jätettiin huomioimatta!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Varoitus - lomakevalitsin jätettiin huomioimatta!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Varoitus - tilavalitsin jätettiin huomioimatta!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: virhe - %s ympäristömuuttujanimien kohdetta ”%s” ei ole olemassa!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: virhe - o-valitsimen jälkeen odotettiin valinta=arvo!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: virhe - oletuskohdetta ei ole käytettävissä.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11 \"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13 \"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14 \"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11 \"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11 \"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 dpi harmaasävy" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9 \"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10 \"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11 \"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12 \"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Virheellinen ohje tuntematon komento\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Tulostinajureiden viemiseen tarvitaan Samba-salasana!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Tulostinajureiden viemiseen tarvitaan Samba-käyttäjätunnus!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Luokka nimeltä ”%s” on jo olemassa!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Tulostin nimeltä ”%s” on jo olemassa!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (ylikokoinen)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (ylikokoinen)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (pieni)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (ylikokoinen)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Yritettiin asettaa %s printer-state virheelliseen arvoon %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Attribuuttiryhmät ovat epäjärjestyksessä (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Virheellinen laite-osoite ”%s”!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Virheellinen device-uri ”%s”!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Virheellinen device-uri-malli ”%s”!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Virheellinen document-format ”%s”!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Virheellinen tiedostonimipuskuri!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Virheellinen kirjasinattribuutti: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Virheellinen job-priority-arvo!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Virheellinen job-sheets-arvo ”%s”!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Virheellinen job-sheets-arvon tyyppi!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Virheellinen job-state-arvo!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Virheellinen job-uri-attribuutti ”%s”!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Virheellinen notify-pull-method ”%s”!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Virheellinen notify-recipient-uri-osoite ”%s”!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Virheellinen valinta ja vaihtoehto rivillä %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Virheellinen port-monitor ”%s”!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Virheellinen printer-state-arvo %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Virheellinen pyynnön versionumero %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Virheellinen tilaustunnus!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 Envelope" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 Envelope" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 Envelope" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 Envelope" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 Envelope" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 Envelope" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 Envelope" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 Envelope" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 Envelope" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Merkistöä ”%s” ei tueta!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 Envelope" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 Envelope" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Komennot voidaan lyhentää. Komennot ovat:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Tyyppiä ”%s” ei voitu skannata!" + +#~ msgid "Cover open." +#~ msgstr "Kansi avoinna." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL Envelope" + +#~ msgid "Developer almost empty." +#~ msgstr "Kehite lähes loppu." + +#~ msgid "Developer empty!" +#~ msgstr "Kehite loppu!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Laite: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokumenttia %d ei löytynyt työstä %d." + +#~ msgid "Door open." +#~ msgstr "Ovi avoinna." + +#~ msgid "Double Postcard" +#~ msgstr "Double Postcard" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: ei voida varata muistia sivutiedolle: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: ei voida varata muistia sivutaululle: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Virheellinen %%BoundingBox:-kommentti havaittu!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Virheellinen %%IncludeFeature:-kommentti!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Virheellinen %%Page:-kommentti tiedostossa!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Virheellinen %%PageBoundingBox:-kommentti tiedostossa!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Virheellinen SCSI-laitetiedosto ”%s”!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Virheellinen merkistötiedosto %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Virheellinen merkistötyyppi %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Virheellinen sarakearvo %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Virheellinen cpi-arvo %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Virheellinen kirjasinkuvausrivi: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Virheellinen lpi-arvo %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Virheellinen arkin määrittely!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Virheellinen tekstin suunta %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Virheellinen tekstin leveys %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Kohdetulostinta ei ole olemassa!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Monistunut %%BoundingBox:-kommentti havaittu!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Monistunut %%Pages:-kommentti havaittu!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Tyhjä tulostustiedosto!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Virhe %d lähetettäessä PAPSendData-pyyntöä: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "" +#~ "ERROR: Odotettiin lainausmerkin merkittyä merkkijonoa rivillä %d / %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Vakava USB-virhe!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Virheellinen HP-GL/2-komento havaittu, tiedostoa ei voida " +#~ "tulostaa!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog puuttuu!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup puuttuu!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Laitteen osoite puuttuu komentoriviltä eikä DEVICE_URI-" +#~ "ympäristömuuttujaa ole määritelty!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Arvo puuttuu otsikkotiedoston riviltä %d!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Tarvitaan msgid-rivi ennen käännösmerkkijonoja rivillä %d / %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Otsakkeessa ei ole %%PageBoundingBox:-kommenttia!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Otsakkeessa ei ole %%Pages:-kommenttia!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Laitteen osoitetta ei löytynyt argv[0]:stä eikä DEVICE_URI-" +#~ "ympäristömuuttujasta!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Merkistötiedostossa %s ei ole kirjasimia\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Sivuja ei löytynyt!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Paperi loppu!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER-ympäristömuuttujaa ei ole määritelty!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Tulostustiedostoa ei hyväksytty (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Tulostin ei vastaa\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Tulostin ei vastaa!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Tulostin lähetti odottamattoman EOF:n\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Etäpalvelin ei hyväksynyt ohjaustiedostoa (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Etäpalvelin ei hyväksynyt datatiedostoa (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Lähetettäessä dataa tulostimelle tapahtui aikakatkaisuvirhe\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Tiedostoa %d ei voida lisätä työhön: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Työtä %d ei voida peruuttaa: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: PDF-tiedostoa ei voida kopioida" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Socketia ei voida luoda" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: Tilapäistä pakattua tulostustiedostoa ei voida luoda: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Tilapäistiedostoa ei voida luoda" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Tilapäistiedostoa ei voida luoda - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Tilapäistiedostoa ei voida luoda: %s.\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops:ia ei voida suorittaa: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: gs-ohjelmaa ei voida suorittaa" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: pdftops-ohjelmaa ei voida suorittaa" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops:ia ei voida forkata: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: PAP-pyyntöä ei voida hakea" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: PAP-vastausta ei voida hakea" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: Tulostimen ”%s” PPD-tiedostoa ei voida hakea - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Oletusarvoista AppleTalk-vyöhykettä ei voida hakea" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Työn %d ominaisuuksia ei voida hakea (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Tulostimen tilaa ei voida hakea (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Tulostinta ”%s” ei löytynyt!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: PAP-vastausta ei voida etsiä" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: AppleTalk-tulostimia ei voida etsiä" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: AppleTalk-osoitteita ei voida tehdä" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Kohdetta ”%s” ei voida avata - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Kohdetta %s ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Otsikkotiedostoa ”%s” ei voida avata - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Laitetiedostoa ”%s” ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Tiedostoa ”%s” ei voida avata - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Tiedostoa ”%s” ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Kuvatiedostoa ei voida avata tulostusta varten!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Tulostustiedostoa ”%s” ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Tulostustiedostoa %s ei voida avata - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Tulostustiedostoa %s ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Tilapäistä pakattua tulostustiedostoa ei voida avata: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Tilapäistiedostoa ei voida avata" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: %d tekstisaraketta ei voida tulostaa!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: %d x %d tekstisivua ei voida tulostaa!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Tulostusdataa ei voida lukea" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Tulostusdataa ei voida lukea!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Porttia ei voida varata" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Tiedostossa ei voida siirtyä kohtaan %ld - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Tiedostossa ei voida siirtyä kohtaan %lld - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: LPD-komentoa ei voida lähettää" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: PAP tickle -pyyntöä ei voida lähettää" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Alkuperäistä PAP send data -pyyntöä ei voida lähettää" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Tulostusdataa ei voida lähettää (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Tulostusdataa ei voida lähettää!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Tulostustiedostoa ei voida lähettää tulostimelle" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Loppu-NUL:ia ei voida lähettää tulostimelle" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops:ia ei voida odottaa: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: %d tavua ei voida kirjoittaa kohteeseen ”%s”: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: %d tavua ei voida kirjoittaa tulostimelle!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Ohjaustiedostoa ei voida kirjoittaa" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Tulostusdataa ei voida kirjoittaa" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Tulostusdataa ei voida kirjoittaa: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Rasteridataa ei voida kirjoittaa ajurille!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Tilapäistiedostoon ei voida kirjoittaa" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: Pakkaamatonta dokumenttidataa ei voida kirjoittaa: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Odottamatonta tekstiä rivillä %d / %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Tuntematon salausvalinnan arvo ”%s”!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Tuntematon tiedostojärjestys ”%s”\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Tuntematon muotomerkki ”%c”\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Tuntematon viestikatalogimuoto kohteelle ”%s”!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Tuntematon valinta ”%s” arvolla ”%s”!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Tuntematon tulostustila ”%s”\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Tuntematon versiovalinnan arvo ”%s”!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: Ei-tuettu kirkkausarvo %s, käytetään kirkkaus=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Ei-tuettu gamma-arvo %s, käytetään gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Ei-tuettu number-up-arvo %d, käytetään number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Ei-tuettu number-up-layout-arvo %s, käytetään number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "ERROR: Ei-tuettu page-border-arvo %s, käytetään page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: Havaittiin doc_printf-ylivuoto (%d tavua), keskeytetään!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-suodin kaatui signaaliin %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-suodin lopetti signaaliin %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops lopetti signaaliin %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops lopetti paluuarvolla %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: korjattavissa: Tulostimeen ei voida yhdistää, yritetään uudelleen " +#~ "30 sekunnin kuluttua...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() epäonnistui" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: tulostustiedostoa ei voida statata" + +#~ msgid "Empty PPD file!" +#~ msgstr "Tyhjä PPD-tiedosto!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Virhe: h-valitsimen jälkeen tarvitaan palvelinnimi!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Tiedostolaitteiden osoitteet on poistettu käytöstä! Voit ottaa ne " +#~ "käyttöön ”%s/cupsd.conf”-tiedoston FileDevice-säännöllä." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Lämpövastuksen lämpötila on korkea!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Lämpövastuksen lämpötila on matala!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Saatiin printer-uri-attribuutti, mutta ei job-id:tä!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk poistettu käytöstä järjestelmäasetuksissa\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk poistettu käytöstä järjestelmäasetuksissa.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Perutaan tulostustyötä...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Yhteydessä tulostimeen...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Yhdistetään tulostimeen...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Ohjaustiedoston lähetys onnistui\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Datatiedoston lähetys onnistui\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Muotoillaan sivua %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Ladataan kuvatiedostoa...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Etsitään tulostinta...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Avataan yhteyttä\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Tulostustiedosto lähetetty, odotetaan tulostuksen valmistumista...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "" +#~ "INFO: Tulostin varattu; yritetään uudelleen 10 sekunnin kuluttua...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Tulostin varattu; yritetään uudelleen 30 sekunnin kuluttua...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "" +#~ "INFO: Tulostin varattu; yritetään uudelleen 5 sekunnin kuluttua...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: Tulostin ei tue IPP-versiota %d.%d. Yritetään IPP/1.0:aa...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "" +#~ "INFO: Tulostin on varattu; yritetään uudelleen 5 sekunnin kuluttua...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Tulostin on tällä hetkellä offline.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Tulostin on tällä hetkellä offline.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Tulostin on nyt online.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Tulostin on offline.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Tulostinta ei ole yhdistetty; yritetään uudelleen 30 sekunnin " +#~ "kuluttua...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Tulostetaan sivua %d, %d %% suoritettu...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Tulostetaan sivua %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Valmis tulostamaan.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Lähetetään ohjaustiedostoa (%lu tavua)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Lähetetään ohjaustiedostoa (%u tavua)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Lähetetään dataa\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Lähetetään datatiedostoa (%ld tavua)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Lähetetään datatiedostoa (%lld tavua)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Lähetetään tulostusdataa...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Lähetettiin tulostustiedosto, %ld tavua...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Lähetettiin tulostustiedosto, %lld tavua...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Lähetetään LPR-työtä, %.0f %% suoritettu...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Tulostimeen ei saada yhteyttä, jonotetaan luokan seuraavalle " +#~ "tulostimelle...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Käytetään oletusarvoista AppleTalk-vyöhykettä ”%s”\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Odotetaan työn valmistumista...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Odotetaan, että tulostin tulee käytettäväksi...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 Envelope" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (ylikokoinen)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 Envelope" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 Envelope" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Väriaine lähes loppu." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Väriaine loppu!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Hukkavärisäiliö lähes täynnä." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Hukkavärisäiliö täynnä!" + +#~ msgid "Interlock open." +#~ msgstr "Välilukko avoinna." + +#~ msgid "Invite Envelope" +#~ msgstr "Kutsun kirjekuori" + +#~ msgid "Italian Envelope" +#~ msgstr "Italialainen kirjekuori" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Työtä %d ei voida aloittaa uudelleen - ei tiedostoja!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Työtä %d ei ole olemassa!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Työ %d on suoritettu eikä sitä voida muuttaa!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Työtä %d ei ole suoritettu!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Työtä %d ei pidetä todentamista varten!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Työtä %d ei pidetä!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Työtä %s ei ole olemassa!" + +#~ msgid "Job %d not found!" +#~ msgstr "Työtä %d ei löytynyt!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Työtilauksia ei voida uudistaa!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 Envelope" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 Envelope" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Kieltä ”%s” ei tueta!" + +#~ msgid "Media jam!" +#~ msgstr "Mediatukos!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Syöttöalusta lähes tyhjä." + +#~ msgid "Media tray empty!" +#~ msgstr "Syöttöalusta tyhjä!" + +#~ msgid "Media tray missing!" +#~ msgstr "Syöttöalusta puuttuu!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Syöttöalusta on täytettävä." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Document-number-attribuutti puuttuu!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Kaksinkertainen lainausmerkki puuttuu riviltä %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Muotomuuttuja puuttuu!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "notify-subscription-ids-attribuutti puuttuu!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "requesting-user-name-attribuutti puuttuu!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Vaadittuja attribuutteja puuttuu!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Arvo puuttuu riviltä %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Malli: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch Envelope" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Tulostustiedosto hyväksytty - työn tunnus %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Tulostustiedosto hyväksytty - työn tunnus tuntematon.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Ei PPD-nimeä!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Windows-tulostinajureita ei ole asennettu!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Kohteessa %s ei ole aktiivisia töitä!" + +#~ msgid "No attributes in request!" +#~ msgstr "Pyynnössä ei ole attribuutteja!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Todentamistietoja ei annettu!" + +#~ msgid "No default printer" +#~ msgstr "Ei oletustulostinta" + +#~ msgid "No file!?!" +#~ msgstr "Ei tiedostoa!?!" + +#~ msgid "No modification time!" +#~ msgstr "Ei muokkausaikaa!" + +#~ msgid "No printer name!" +#~ msgstr "Ei tulostimen nimeä!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Luokalle ei löytynyt tulostinosoitetta!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Tulostinosoitetta ei löytynyt!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Pyynnössä ei ole tulostinosoitetta!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Pyynnössä ei ole tilausattribuutteja!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC:n käyttöikä päättymässä." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC:n käyttöikä päättynyt!" + +#~ msgid "Out of toner!" +#~ msgstr "Väriaine loppu!" + +#~ msgid "Output bin almost full." +#~ msgstr "Tulostusalusta lähes täynnä." + +#~ msgid "Output bin full!" +#~ msgstr "Tulostusalusta täynnä!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Tulostimen %s tuloste lähetetään kohteeseen %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "Tulostimen %s tuloste lähetetään etätulostimelle %s kohteessa %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Tulostimen %s/%s tuloste lähetetään kohteeseen %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Tulostimen %s/%s tuloste lähetetään etätulostimelle %s kohteessa %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Tulostusalusta puuttuu!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 Envelope" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 Envelope" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 Envelope" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 Envelope" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (ylikokoinen)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 Envelope" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 Envelope" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 Envelope" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 Envelope" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 Envelope" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 Envelope" + +#~ msgid "Personal Envelope" +#~ msgstr "Personal Envelope" + +#~ msgid "Printer offline." +#~ msgstr "Tulostin offline." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Sija Omistaja Työ Tiedostot Koko " +#~ "yhteensä\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Sija Omistaja Pri Työ Tiedostot Koko " +#~ "yhteensä\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Suoritetaan komentoa: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI-tulostin" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (ylisuuri)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data-arvon on liian suuri (%d > 63 oktettia)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Tulostinta tai luokkaa ei ole jaettu!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Tulostinta tai luokkaa ei löytynyt." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "printer-uri-attribuutti tarvitaan!" + +#~ msgid "Toner low." +#~ msgstr "Väriaine vähissä." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Liikaa job-sheets-arvoja (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Liikaa printer-state-reasons-arvoja (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (ylikokoinen)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (ylikokoinen)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (pieni)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Työtä ei voida lisätä kohteelle ”%s”!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Tiedostotyypeille ei voida varata muistia!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "64-bittisiä CUPS-tulostinajuritiedostoja ei voida kopioida (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "64-bittisiä Windows-tulostinajuritiedostoja ei voida kopioida (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "CUPS-tulostinajuritiedostoja ei voida kopioida (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "PPD-tiedostoa ei voida kopioida - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "PPD-tiedostoa ei voida kopioida!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Windows 2000 -tulostinajuritiedostoja ei voida kopioida (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Windows 9x -tulostinajuritiedostoja ei voida kopioida (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Liitäntäskriptiä ei voida kopioida - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Tulostinosoitetta ei voida luoda!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "" +#~ "cupsd.conf-tiedostoja, joka ovat suurempia kuin 1 Mt, ei voida muokata!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Työlle ei löydy kohdetta!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Tulostinta ei löytynyt!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Windows 2000 -tulostinajuritiedostoja ei voida asentaa (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Windows 9x -tulostinajuritiedostoja ei voida asentaa (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Dokumenttia %d työssä %d ei voida avata!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Kohdetta ”%s” ei voida suorittaa: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Komentoa ei voida lähettää tulostinajurille!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Windows-tulostinajuria ei voida asettaa (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Vanhaa USB-luokka-ajuria ei voida käyttää!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Tuntematon tulostinvirhe (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Ei-tuettu merkistö ”%s”!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Ei-tuettu pakkausmenetelmä ”%s”!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Ei-tuettu pakkausattribuutti %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Ei-tuettu muoto ”%s”!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Ei-tuettu muoto ”%s”!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Ei-tuettu muoto ”%s/%s”!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Käyttö:\n" +#~ "\n" +#~ " lpadmin [-h palvelin] -d kohde\n" +#~ " lpadmin [-h palvelin] -x kohde\n" +#~ " lpadmin [-h palvelin] -p tulostin [-c lisää-luokka] [-i liitäntä] [-m " +#~ "malli]\n" +#~ " [-r poista-luokka] [-v laite] [-D kuvaus]\n" +#~ " [-P ppd-tiedosto] [-o nimi=arvo]\n" +#~ " [-u allow:käyttäjä,käyttäjä] [-u deny:käyttäjä," +#~ "käyttäjä]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Käyttö: %s työ käyttäjä otsikko kopioita valinnat [tiedostonimi]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Käyttö: %s job-id käyttäjä otsikko kopioita valinnat [tiedosto]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Käyttö: %s job-id käyttäjä otsikko kopioita valinnat tiedosto\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Käyttö: convert [ valitsimet ]\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ "\n" +#~ " -f tiedostonimi Aseta muunnettava tiedosto (muussa tapauksessa " +#~ "stdin)\n" +#~ " -o tiedostonimi Aseta luotava tiedosto (muussa tapauksessa " +#~ "stdout)\n" +#~ " -i mime/tyyppi Aseta syötteen MIME-tyyppi (muussa tapauksessa " +#~ "määritetään automaattisesti)\n" +#~ " -j mime/tyyppi Aseta tulosteen MIME-tyyppi (muussa tapauksessa " +#~ "application/pdf)\n" +#~ " -P tiedostonimi.ppd Aseta PPD-tiedosto\n" +#~ " -a 'nimi=arvo ...' Aseta valintoja\n" +#~ " -U käyttäjätunnus Aseta työn käyttäjätunnus\n" +#~ " -J otsikko Aseta otsikko\n" +#~ " -c kopioita Aseta kopioiden määrä\n" +#~ " -u Poista PPD-tiedosto, kun valmis\n" +#~ " -D Poista syötetiedosto, kun valmis\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Käyttö: cupsaddsmb [valitsimet] tulostin1 ... tulostinN\n" +#~ " cupsaddsmb [valitsimet] -a\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ " -E Salaa yhteys palvelimeen\n" +#~ " -H samba-palvelin Käytä nimettyä SAMBA-palvelinta\n" +#~ " -U samba-käyttäjä Todentaudu käyttäen nimettyä SAMBA-käyttäjää\n" +#~ " -a Vie kaikki tulostimet\n" +#~ " -h cups-palvelin Käytä nimettyä CUPS-palvelinta\n" +#~ " -v Ole monisanainen (näytä komennot)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Käyttö: cupsctl [valitsimet] [param=arvo ... paramN=arvoN]\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ "\n" +#~ " -E Ota salaus käyttöön\n" +#~ " -U käyttäjätunnus Määrittele käyttäjätunnus\n" +#~ " -h palvelin[:portti] Määrittele palvelimen osoite\n" +#~ "\n" +#~ " --[no-]debug-logging Laita virheiden kirjaaminen päälle tai pois " +#~ "päältä\n" +#~ " --[no-]remote-admin Laita etähallinta päälle tai pois päältä\n" +#~ " --[no-]remote-any Salli tai estä pääsy internetistä\n" +#~ " --[no-]remote-printers Näytä tai kätke etätulostimet\n" +#~ " --[no-]share-printers Laita tulostinjako päälle tai pois päältä\n" +#~ " --[no-]user-cancel-any Salli tai estä käyttäjien perua mikä tahansa " +#~ "työ\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Käyttö: cupsd [-c määrittelytiedosto] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c määrittelytiedosto Lataa vaihtoehtoinen määrittelytiedosto\n" +#~ "-f Suorita etualalla\n" +#~ "-F Suorita etualalla, mutta irrota\n" +#~ "-h Näytä tämä käyttöohje\n" +#~ "-l Suorita cupsd launchd(8):sta\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Käyttö: cupsfilter -m mime/tyyppi [ valitsimet ] tiedostonimi\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ "\n" +#~ " -c cupsd.conf Aseta käytettävä cupsd.conf-tiedosto\n" +#~ " -j job-id[,N] Suodintiedosto N määritellystä työstä (oletus on " +#~ "tiedosto 1)\n" +#~ " -n kopiot Aseta kopioiden määrä\n" +#~ " -o nimi=arvo Aseta valintoja\n" +#~ " -p tiedostonimi.ppd Aseta PPD-tiedosto\n" +#~ " -t otsikko Aseta otsikko\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Käyttö: cupstestdsc [valitsimet] tiedostonimi.ps [... tiedostonimi.ps]\n" +#~ " cupstestdsc [valitsimet] -\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ "\n" +#~ " -h Näytä ohjelman käyttö\n" +#~ "\n" +#~ " Huomaa: tämä ohjelma tarkistaa vain DSC-kommentit, ei itse " +#~ "PostScriptiä.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Käyttö: cupstestppd [valitsimet] tiedostonimi1.ppd[.gz] [... " +#~ "tiedostonimiN.ppd[.gz]]\n" +#~ " ohjelma | cupstestppd [valitsimet] -\n" +#~ "\n" +#~ "Valitsimet:\n" +#~ "\n" +#~ " -R juurihakemisto Aseta vaihtoehtoinen juuri\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Anna varoituksia virheiden sijasta\n" +#~ " -q Suorita hiljaa\n" +#~ " -r Käytä ”rentoa” avointa tilaa\n" +#~ " -v Ole monisanainen\n" +#~ " -vv Ole erittäin monisanainen\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Käyttö: lpmove työ/lähde kohde\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Käyttö: lpoptions [-h palvelin] [-E] -d tulostin\n" +#~ " lpoptions [-h palvelin] [-E] [-p tulostin] -l\n" +#~ " lpoptions [-h palvelin] [-E] -p tulostin -o valinta[=arvo] ...\n" +#~ " lpoptions [-h palvelin] [-E] -x tulostin\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Käyttö: lppasswd [-g ryhmätunnus]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Käyttö: lppasswd [-g ryhmätunnus] [käyttäjätunnus]\n" +#~ " lppasswd [-g ryhmätunnus] -a [käyttäjätunnus]\n" +#~ " lppasswd [-g ryhmätunnus] -x [käyttäjätunnus]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Käyttö: lpq [-P kohde] [-U käyttäjätunnus] [-h palvelinnimi[:portti]] [-" +#~ "l] [+aikaväli]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Käyttö: ppdc [valitsimet] tiedostonimi.drv [ ... tiedostonimiN.drv ]\n" +#~ "Valitsimet:\n" +#~ " -D nimi=arvo Aseta nimetty muuttuja arvoon.\n" +#~ " -I include-hakemisto Lisää include-hakemisto hakupolkuun.\n" +#~ " -c katalogi.po Lataa määritellyn viestikatalogin.\n" +#~ " -d tulostehakemisto Määrittele tulostehakemisto.\n" +#~ " -l kieli[,kieli,...] Määrittele tulostekieli (lokaali).\n" +#~ " -m Käytä ModelName-arvoa tiedostonimenä.\n" +#~ " -t Testaa PPD:t niiden luomisen sijasta.\n" +#~ " -v Ole monisanainen (useammat v-kirjaimet lisäävät " +#~ "monisanaisuutta).\n" +#~ " -z Pakkaa PPD-tiedostot GNU zipillä.\n" +#~ " --cr Päätä rivit CR:llä (Mac OS 9).\n" +#~ " --crlf Päätä rivit CR + LF:llä (Windows).\n" +#~ " --lf Päätä rivit LF:llä (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Käyttö: ppdhtml [valitsimet] tiedostonimi.drv > tiedostonimi.html\n" +#~ " -D nimi=arvo Aseta nimetty muuttuja arvoon.\n" +#~ "Valinnat:\n" +#~ " -I include-hakemisto Lisää include-hakemisto hakupolkuun.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Käyttö: ppdi [valitsimet] tiedostonimi.ppd [ ... tiedostonimiN.ppd ]\n" +#~ "Valitsimet:\n" +#~ " -I include-hakemisto\n" +#~ " -o tiedostonimi.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Käyttö: ppdmerge [valitsimet] tiedostonimi.ppd [ ... tiedostonimiN.ppd ]\n" +#~ "Valitsimet:\n" +#~ " -o tiedostonimi.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Käyttö: ppdpo [valitsimet] -o tiedostonimi.po tiedostonimi.drv [ ... " +#~ "tiedostonimiN.drv ]\n" +#~ "Valitsimet:\n" +#~ " -D nimi=arvo Aseta nimetty muuttuja arvoon.\n" +#~ " -I include-hakemisto Lisää include-hakemisto hakupolkuun.\n" +#~ " -v Ole monisanainen (useammat v-kirjaimet lisäävät " +#~ "monisanaisuutta).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Käyttö: snmp [palvelin-tai-ip-osoite]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Lisätään vain %d ensimmäistä löydettyä tulostinta" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: waiteof-valinnalle ”%s” odotettiin totuusarvoa\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Sivukanavapyyntöä ei voitu lukea!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Valintaa ”%s” ei voida sisällyttää IncludeFeature:n kautta!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Tulostin ei vastaa\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Tulostin lähetti odottamattoman EOF:n\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Etäpalvelin ei vastannut komentotilatavulla %d sekunnin " +#~ "jälkeen!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Etäpalvelin ei vastannut ohjaustilatavulla %d sekunnin jälkeen!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Etäpalvelin ei vastannut datatilatavulla %d sekunnin jälkeen!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: SCSI-komento aikakatkaistiin (%d); yritetään uudelleen...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Tämä dokumentti ei ole Adobe Document Structuring Conventions -" +#~ "määrityksen mukainen eikä välttämättä tulostu oikein!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Kohdetta ”%s:%s” ei voida avata: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: PAP status -pyyntöä ei voida lähettää" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Odottamaton PAP-paketti tyyppiä %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Tuntematon PAP-paketti tyyppiä %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Tuntematon vaihtoehto ”%s” valinnalle ”%s”!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Tuntematon valinta ”%s”!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Ei-tuettu siirtonopeus %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: tilavalinnalle ”%s” odotettiin numeroarvoa\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: korjattavissa: Verkkopalvelin ”%s” on varattu; yritetään " +#~ "uudelleen %d sekunnin kuluttua...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Varoitus, Windows 2000 -tulostinajureita ei ole asennettu!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 Envelope" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "convert: Määrittele muunnettava tiedosto f-valitsimella.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Tulostimelle ”%s” ei ole PPD-tiedostoa - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Palvelimeen ei voida yhdistää: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Tuntematon valinta ”%s”!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Tuntematon valinta ”-%c”!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: c-valitsimen jälkeen odotettiin määrittelytiedoston nimeä!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Nykyistä hakemistoa ei voida hakea!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Tuntematon argumentti ”%s” - keskeytetään!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Tuntematon valinta ”%c” - keskeytetään!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: launchd(8)-tukea ei ole käännetty mukaan, toimitaan " +#~ "normaalitilassa.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Virheellinen dokumenttinumero %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Virheellinen työtunnus %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Vain yksi tiedostonimi voidaan määritellä!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Tilapäistiedostoa ei voida luoda: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Työtiedostoa ei voida hakea - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: q-valitsin ei ole yhteensopiva v-valitsimen kanssa.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: v-valitsin ei ole yhteensopiva q-valitsimen kanssa.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "laite kohteelle %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "laite kohteelle %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tsaat tietoja komennoista\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri-attribuutti puuttuu!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Luokan nimi voi sisältää vain näkyviä merkkejä!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: P-valitsimen jälkeen odotettiin PPD:tä!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin: u-valitsimen jälkeen odotettiin allow/deny:käyttäjäluettelo!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: r-valitsimen jälkeen odotettiin luokkaa!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: c-valitsimen jälkeen odotettiin luokan nimeä!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: D-valitsimen jälkeen odotettiin kuvausta!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: v-valitsimen jälkeen odotettiin laiteosoitetta!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: I-valitsimen jälkeen odotettiin tiedostotyyppejä!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: h-valitsimen jälkeen odotettiin palvelinnimeä!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: i-valitsimen jälkeen odotettiin liitäntää!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: L-valitsimen jälkeen odotettiin sijaintia!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: m-valitsimen jälkeen odotettiin mallia!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: o-valitsimen jälkeen odotettiin nimi=arvo!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: p-valitsimen jälkeen odotettiin tulostinta!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: d-valitsimen jälkeen odotettiin tulostimen nimeä!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: x-valitsimen jälkeen odotettiin tulostinta tai luokkaa!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Jäsennimiä ei havaittu!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Tulostin %s on jo luokan %s jäsen.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Tulostin %s ei ole luokan %s jäsen.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Tulostimen nimi voi sisältää vain näkyviä merkkejä!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tulostinta ei voida lisätä luokkaan:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Palvelimeen ei voida yhdistää: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Tilapäistiedostoa ei voida luoda - %s.\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Tilapäistiedostoa ei voida luoda: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: PPD-tiedostoa ”%s” ei voida avata - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Tiedostoa ”%s” ei voida avata: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tulostinta ei voida poistaa luokasta:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: PPD-tiedostoa ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Laiteosoitetta ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Liitäntäskriptiä tai PPD-tiedostoa ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Liitäntäskriptiä ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tulostimen kuvausta ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tulostimen sijaintia ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tulostimen valintoja ei voida asettaa:\n" +#~ " Määrittele tulostimen nimi ensin!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Tuntematon allow/deny-valinta ”%s”!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Tuntematon argumentti ”%s”!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Tuntematon valinta ”%c”!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "" +#~ "lpadmin: Varoitus - sisällöntyyppiluettelo jätettiin huomioimatta!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo: --device-id:n jälkeen odotettiin 1284-laitetunnistemerkkijonoa!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: --language:n jälkeen odotettiin kieltä!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: --make-and-model:n jälkeen odotettiin merkkiä ja mallia!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: --product:n jälkeen odotettiin tuotemerkkijonoa!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: --exclude-schemes:n jälkeen odotettiin malliluetteloa!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: --include-schemes:n jälkeen odotettiin malliluetteloa!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: --timeout:n jälkeen odotettiin aikakatkaisua!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Tuntematon argumentti ”%s”!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Tuntematon valinta ”%c”!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Tuntematon valinta ”%s”!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Palvelimeen ei voida yhdistää: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Tuntematon argumentti ”%s”!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Tuntematon valinta ”%c”!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Ei tulostimia!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Tulostinta tai esiintymää ei voida lisätä: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: PPD-tiedostoa ei voida hakea kohteelle %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: PPD-tiedostoa ei voida avata kohteelle %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Tuntematon tulostin tai luokka!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Vain root voi lisätä tai poistaa salasanoja!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Salasanatiedosto on varattu!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Salasanatiedostoa ei päivitetty!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Salasana ei täsmää!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Salasana hylättiin.\n" +#~ "Salasanan on oltava vähintään 6 merkkiä pitkä, se ei saa sisältää\n" +#~ "käyttäjätunnustasi ja sen on sisällettävä vähintään yksi kirjain ja " +#~ "numero.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Salasanat eivät täsmää!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Salasanamerkkijonoa ei voida kopioida: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Salasanatiedostoa ei voida avata: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Salasanatiedostoon ei voida kirjoittaa: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: vanhaa salasanatiedostoa ei voitu varmuuskopioida: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: salasanatiedoston nimeä ei voitu muuttaa: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: käyttäjää ”%s” ja ryhmää ”%s” ei ole olemassa.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: virhe - %s ympäristömuuttujanimien kohdetta ”%s” ei ole " +#~ "olemassa!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "jäsen luokassa %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "ei tietueita\n" + +#~ msgid "no system default destination\n" +#~ msgstr "ei järjestelmän oletuskohdetta\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events:iä ei määritelty!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri-osoite ”%s” on jo käytössä!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri-osoite ”%s” käyttää tuntematonta mallia!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d ei kelpaa!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Lisätään include-hakemistoa ”%s”...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Lisätään/päivitetään käyttöliittymätekstiä kohteesta %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Virheellinen totuusarvo (%s) rivillä %d / %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen tarkkuuden nimi ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen tila-avainsana ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Virheellinen muuttujan korvaus ($%c) rivillä %d / %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Riviltä %d / %s löytyi vaihtoehto ilman valintaa!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Kaksoiskappale #po lokaalille %s rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin suodinmääritystä rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin ohjelman nimeä rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Odotettiin totuusarvoa rivillä %d / %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin merkistöä Font:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Odotettiin vaihtoehtokoodia rivillä %d / %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Odotettiin vaihtoehtonimeä/-tekstiä rivillä %d / %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin värijärjestystä ColorModel:ille rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin väriavaruutta ColorModel:ille rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin pakkausta ColorModel:ille rivillä %d / %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin rajoitusmerkkijonoa UIConstraints:ille rivillä %d / %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin ajurintyypin avainsanaa DriverType:lle rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin dupleksityyppiä Duplex:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin koodausta Font:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin tiedostonimeä #po:n %s jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin ryhmänimeä/-tekstiä rivillä %d / %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin include-tiedoston nimeä rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin kokonaislukua rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin lokaalia #po:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä kohteen %s jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä FileName:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä Font:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä Manufacturer:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä MediaSize:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä ModelName:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin nimeä PCFileName:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin nimeä/tekstiä kohteen %s jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin nimeä/tekstiä Installable:n jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin nimeä/tekstiä Resolution:in jälkeen rivillä %d / %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin nimi-/tekstiyhdistelmää ColorModel:ille rivillä %d / %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin valintanimeä/-tekstiä rivillä %d / %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin valintaosiota rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin valintatyyppiä rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin ohituskenttää Resolution:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin reaalilukua rivillä %d / %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin tarkkuutta/mediatyyppi ColorProfile:n jälkeen rivillä %" +#~ "d / %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin tarkkuutta/mediatyyppi SimpleColorProfile:n jälkeen " +#~ "rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin valitsijaa kohteen %s jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin tilaa Font:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Odotettiin merkkijonoa Copyright:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin merkkijonoa Version:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin kahta valintanimeä rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin arvoa kohteen %s jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Odotettiin versiota Font:in jälkeen rivillä %d / %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Virheellinen #include/#po-tiedostonimi ”%s”!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen hinta suotimelle rivillä %d / %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen tyhjä MIME-tyyppi suotimelle rivillä %d / %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Virheellinen tyhjä ohjelman nimi suotimelle rivillä %d / %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen valintaosio ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Virheellinen valintatyyppi ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Ladataan ajurin tietotiedostoa ”%s”...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Ladataan viestejä lokaalille ”%s”...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Ladataan viestejä kohteesta ”%s”...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif puuttuu kohteen ”%s” lopusta!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if puuttuu riviltä %d / %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Ei viestikatalogia lokaalille %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Valinta %s määritelty uudelleen eri tyypillä rivillä %d / %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Valintarajoituksen on tehtävä *name rivillä %d / %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Liikaa sisäkkäisiä #if:ejä rivillä %d / %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: PPD-tiedostoa ”%s” ei voida luoda - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Tulostushakemistoa %s ei voida luoda: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Tulostusputkia ei voida luoda: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: cupstestppd:ia ei voida suorittaa: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: #po-tiedostoa %s ei löytynyt riviltä %d / %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: include-tiedostoa ”%s” ei löytynyt riviltä %d / %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Lokalisointia kohteelle ”%s” ei löytynyt - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Lokalisointitiedostoa ”%s” ei voitu ladata - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Määrittelemätön muuttuja (%s) rivillä %d / %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Tuntematon ajurityyppi %s rivillä %d / %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Tuntematon dupleksityyppi ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Tuntematon mediakoko ”%s” rivillä %d / %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Tuntematon token ”%s” rivillä %d / %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Tuntemattomia seuraavia merkkejä reaaliluvussa ”%s” rivillä %d / %" +#~ "s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Määrittelemätön merkkijono, joka alkaa %c, rivillä %d / %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Kirjoitetaan %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Kirjoitetaan PPD-tiedostoja hakemistoon ”%s”...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Virheellinen LanguageVersion ”%s” kohteessa %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Jätetään huomioimatta PPD-tiedosto %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Kohdetta %s ei voida varmuuskopioida kohteeseen %s - %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "tulostin %s poissa käytöstä alkaen %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "tulostin %s on toimettomana. käytössä alkaen %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "tulostin %s tulostaa %s-%d. käytössä alkaen %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "tulostin %s/%s poissa käytöstä alkaen %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "tulostin %s/%s on toimettomana. käytössä alkaen %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "tulostin %s/%s tulostaa %s-%d. käytössä alkaen %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "pyynnön tunnus on %s-%d (%d tiedostoa)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "ajastin ei ole käynnissä\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "ajastin on käynnissä\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tnäytä taustaprosessin tila ja jono\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "järjestelmän oletuskohde: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "järjestelmän oletuskohde: %s/%s\n" diff --git a/locale/cups_fr.po b/locale/cups_fr.po new file mode 100644 index 0000000..2257fa3 --- /dev/null +++ b/locale/cups_fr.po @@ -0,0 +1,8821 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimètres" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f à %.0f x %.0f millimètres" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f pouces" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f à %.2f x %.2f pouces" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "Impossible de modifier « %s »." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 po/s" + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 po/s" + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 po/s" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/s" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 po/s" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 po/s" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/s" + +msgid "120x60dpi" +msgstr "120 x 60 ppp" + +msgid "120x72dpi" +msgstr "120 x 72 ppp" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 ppp" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/s" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/s" + +msgid "150dpi" +msgstr "150 ppp" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 ppp" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 po/s" + +msgid "2-Sided Printing" +msgstr "Impression recto-verso" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 po/s" + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/s" + +msgid "200 mm/sec." +msgstr "200 mm/s" + +msgid "203dpi" +msgstr "203 ppp" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Série 24 broches" + +msgid "240x72dpi" +msgstr "240 x 72 ppp" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/s" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 po/s" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Disque 3,5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Disque 3,5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/s" + +msgid "300 mm/sec." +msgstr "300 mm/s" + +msgid "300dpi" +msgstr "300 ppp" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 ppp" + +msgid "360x180dpi" +msgstr "360 x 180 ppp" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 po/s" + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/s" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 po/s" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 po/s" + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/s" + +msgid "600dpi" +msgstr "600 ppp" + +msgid "60dpi" +msgstr "60 ppp" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 po/s" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 ppp" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 po/s" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/s" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 po/s" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Série 9 broches" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Accepter les tâches" + +msgid "Accepted" +msgstr "Accepté" + +msgid "Add Class" +msgstr "Ajouter une classe" + +msgid "Add Printer" +msgstr "Ajouter une imprimante" + +msgid "Add RSS Subscription" +msgstr "Ajouter abonnement RSS" + +msgid "Address" +msgstr "Adresse" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adresse - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administration" + +msgid "Always" +msgstr "Toujours" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applicator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Pointeur de dests NULL incorrect" + +msgid "Bad OpenGroup" +msgstr "OpenGroup erroné" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI erroné" + +msgid "Bad OrderDependency" +msgstr "OrderDependency erroné" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Requête incorrecte" + +msgid "Bad SNMP version number" +msgstr "Numéro de version SNMP incorrect" + +msgid "Bad UIConstraints" +msgstr "UIConstraints erroné" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Nombre de copies erroné : %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Paramètre personnalisé incorrect" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Valeur de number-up %d incorrecte." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Intervalle de pages erroné : %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Bannières" + +msgid "Billing Information: " +msgstr "Informations de facturation : " + +msgid "Bond Paper" +msgstr "Papier pour titres" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMJN" + +msgid "CPCL Label Printer" +msgstr "Imprimante pour étiquettes CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Annuler abonnement RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Modifier les paramètres" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Classes" + +msgid "Clean Print Heads" +msgstr "Nettoyer les têtes d’impression" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Couleur" + +msgid "Color Mode" +msgstr "Mode de couleur" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Le nom de la communauté s’avère être de longueur indéfinie" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Continuer" + +msgid "Continuous" +msgstr "Continu" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Créé" + +msgid "Created On: " +msgstr "Créé le : " + +msgid "Custom" +msgstr "Personnalisation" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Couper" + +msgid "Cutter" +msgstr "Cutter" + +msgid "Dark" +msgstr "Foncé" + +msgid "Darkness" +msgstr "Tons foncés" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Supprimer la classe" + +msgid "Delete Printer" +msgstr "Supprimer l’imprimante" + +msgid "Description: " +msgstr "Description : " + +msgid "DeskJet Series" +msgstr "Série DeskJet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "La destination « %s » n’accepte pas de tâche." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Papier pour impression thermique directe" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Désactivé" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nom du gestionnaire : " + +msgid "Driver Version: " +msgstr "Version du gestionnaire : " + +msgid "Duplexer" +msgstr "Duplexeur" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Imprimante pour étiquettes EPL1" + +msgid "EPL2 Label Printer" +msgstr "Imprimante pour étiquettes EPL2" + +msgid "Edit Configuration File" +msgstr "Modifier le fichier de configuration" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Fin de la bannière" + +msgid "English" +msgstr "French" + +msgid "Enter old password:" +msgstr "Ancien mot de passe :" + +msgid "Enter password again:" +msgstr "Confirmez le nouveau mot de passe :" + +msgid "Enter password:" +msgstr "Entrez le nouveau mot de passe :" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Entrez votre nom d’utilisateur et votre mot de passe ou bien identifiez-vous " +"en tant que « root » pour accéder à cette page. Si vous utilisez " +"l’authentification Kerberos, assurez-vous de disposer d’un ticket Kerberos " +"valide." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Alimentation au format enveloppe" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Règles d’erreur" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Toutes les 10 étiquettes" + +msgid "Every 2 Labels" +msgstr "Toutes les 2 étiquettes" + +msgid "Every 3 Labels" +msgstr "Toutes les 3 étiquettes" + +msgid "Every 4 Labels" +msgstr "Toutes les 4 étiquettes" + +msgid "Every 5 Labels" +msgstr "Toutes les 5 étiquettes" + +msgid "Every 6 Labels" +msgstr "Toutes les 6 étiquettes" + +msgid "Every 7 Labels" +msgstr "Toutes les 7 étiquettes" + +msgid "Every 8 Labels" +msgstr "Toutes les 8 étiquettes" + +msgid "Every 9 Labels" +msgstr "Toutes les 9 étiquettes" + +msgid "Every Label" +msgstr "Chaque étiquette" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Échec de la condition de valeur attendue" + +msgid "Export Printers to Samba" +msgstr "Exporter les imprimantes vers SAMBA" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Dossier de fichier" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Dossier de fichier - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Interdit" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Général" + +msgid "Generic" +msgstr "Générique" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU s’avère être de longueur indéfinie" + +msgid "Glossy Paper" +msgstr "Papier brillant" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Niveaux de gris" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Dossier suspendu" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Dossier suspendu - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Caractère de contrôle interdit" + +msgid "Illegal main keyword string" +msgstr "Mot-clé essentiel interdit" + +msgid "Illegal option keyword string" +msgstr "Mot-clé d’option interdit" + +msgid "Illegal translation string" +msgstr "Traduction interdite" + +msgid "Illegal whitespace character" +msgstr "Caractère « espace blanc » interdit" + +msgid "Installable Options" +msgstr "Options installables" + +msgid "Installed" +msgstr "Installée" + +msgid "IntelliBar Label Printer" +msgstr "Imprimante pour étiquettes IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Erreur interne" + +msgid "Internet Postage 2-Part" +msgstr "Affranchissement Internet en 2 parties" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Affranchissement Internet en 2 parties - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Affranchissement Internet en 3 parties" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Affranchissement Internet en 3 parties - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet Printing Protocol" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL ( Langage de contrôle de tâche )" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "La tâche n°%d est déjà abandonnée - impossible de l’annuler." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "La tâche n°%d est déjà annulée - impossible de l’annuler." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "La tâche n°%d est déjà terminée - impossible de l’annuler." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "terminée" + +msgid "Job Created" +msgstr "Tâche créée" + +msgid "Job ID: " +msgstr "Identifiant de tâche : " + +msgid "Job Options Changed" +msgstr "Options de la tâche modifiées" + +msgid "Job Stopped" +msgstr "arrêtée" + +msgid "Job UUID: " +msgstr "UUID de tâche : " + +msgid "Job is completed and cannot be changed." +msgstr "La tâche est terminée et ne peut être modifiée." + +msgid "Job operation failed:" +msgstr "L’opération sur la tâche a échoué :" + +msgid "Job state cannot be changed." +msgstr "L’état de la tâche ne peut être modifié." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Tâches" + +msgid "LPD/LPR Host or Printer" +msgstr "Hôte ou imprimante LPD/LPR" + +msgid "Label Printer" +msgstr "Imprimante pour étiquettes" + +msgid "Label Top" +msgstr "Étiquette supérieure" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Adresse étendue" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Adresse étendue - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet série PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Clair" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Ligne dépassant la longueur maximale autorisée (255 caractères)" + +msgid "List Available Printers" +msgstr "Énumérer les imprimantes disponibles" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Emplacement : " + +msgid "Long-Edge (Portrait)" +msgstr "Bord le plus long (Portrait)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Marque et modèle : " + +msgid "Manual Feed" +msgstr "Alimentation manuelle" + +msgid "Media Dimensions: " +msgstr "Dimensions du papier : " + +msgid "Media Limits: " +msgstr "Limites du papier : " + +msgid "Media Name: " +msgstr "Nom du papier : " + +msgid "Media Size" +msgstr "Taille du papier" + +msgid "Media Source" +msgstr "Source du papier" + +msgid "Media Tracking" +msgstr "Crénage du papier" + +msgid "Media Type" +msgstr "Type de papier" + +msgid "Medium" +msgstr "Moyen" + +msgid "Memory allocation error" +msgstr "Erreur d’allocation de mémoire" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Entête PPD-Adobe-4.x manquant" + +msgid "Missing asterisk in column 1" +msgstr "Astérisque manquant à la colonne 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Chaîne de valeur manquante" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Modifier la classe" + +msgid "Modify Printer" +msgstr "Modifier l’imprimante" + +msgid "Move All Jobs" +msgstr "Transférer toutes les tâches" + +msgid "Move Job" +msgstr "Transférer la tâche" + +msgid "Moved Permanently" +msgstr "Transférées de façon permanente" + +msgid "NULL PPD file pointer" +msgstr "Pointeur de fichier PPD NULL." + +msgid "Name OID uses indefinite length" +msgstr "L’OID du nom s’avère être de longueur indéfinie" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Jamais" + +msgid "New Stylus Color Series" +msgstr "Nouvelles série Stylus Color" + +msgid "New Stylus Photo Series" +msgstr "Nouvelles série Stylus Photo" + +msgid "No" +msgstr "Non" + +msgid "No Content" +msgstr "Aucun contenu" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Aucune SEQUENCE VarBind" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Aucune connexion active" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Aucun nom de communauté" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Aucune destination ajoutée." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Paramètre error-index absent" + +msgid "No error-status" +msgstr "Paramètre error-status absent" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Aucun OID de nom" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Paramètre request-id absent" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Aucun abonnement trouvé." + +msgid "No variable-bindings SEQUENCE" +msgstr "Aucune SEQUENCE variable-bindings" + +msgid "No version number" +msgstr "Aucun numéro de version" + +msgid "Non-continuous (Mark sensing)" +msgstr "Non continu (détection de marque)" + +msgid "Non-continuous (Web sensing)" +msgstr "Non continu (détection Web)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Introuvable" + +msgid "Not Implemented" +msgstr "Non implémentée" + +msgid "Not Installed" +msgstr "Non installée" + +msgid "Not Modified" +msgstr "Non modifiée" + +msgid "Not Supported" +msgstr "Non prise en charge" + +msgid "Not allowed to print." +msgstr "Impression interdite" + +msgid "Note" +msgstr "Remarque" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Désactivé (recto)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Aide en ligne" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "L’ouverture de %s a échoué : %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup sans CloseGroup préalable" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI sans CloseUI/JCLCloseUI préalable" + +msgid "Operation Policy" +msgstr "Règles de fonctionnement" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Options installées" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Options : " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Mode de sortie" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Imprimante laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Le paquet ne contient aucun paramètre Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Le paquet ne commence pas par SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Mot de passe pour %s sur %s ? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Un mot de passe pour %s est nécessaire pour accéder à %s via SAMBA : " + +msgid "Pause Class" +msgstr "Suspendre la classe" + +msgid "Pause Printer" +msgstr "Suspendre l’imprimante" + +msgid "Peel-Off" +msgstr "Décoller" + +msgid "Photo" +msgstr "Photo" + +msgid "Photo Labels" +msgstr "Étiquettes photo" + +msgid "Plain Paper" +msgstr "Papier vierge" + +msgid "Policies" +msgstr "Règles" + +msgid "Port Monitor" +msgstr "Moniteur de port" + +msgid "PostScript Printer" +msgstr "Imprimante PostScript" + +msgid "Postcard" +msgstr "Carte postale" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Densité d’impression" + +msgid "Print Job:" +msgstr "Tâche d’impression :" + +msgid "Print Mode" +msgstr "Mode d’impression" + +msgid "Print Rate" +msgstr "Taux d’impression" + +msgid "Print Self-Test Page" +msgstr "Imprimer une page d’autotest" + +msgid "Print Speed" +msgstr "Vitesse d’impression" + +msgid "Print Test Page" +msgstr "Imprimer la page de test" + +msgid "Print and Cut" +msgstr "Impression à découper" + +msgid "Print and Tear" +msgstr "Impression à détacher" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Imprimé pour : " + +msgid "Printed From: " +msgstr "Imprimé de : " + +msgid "Printed On: " +msgstr "Imprimé sur : " + +msgid "Printer Added" +msgstr "ajoutée" + +msgid "Printer Default" +msgstr "par défaut" + +msgid "Printer Deleted" +msgstr "supprimée" + +msgid "Printer Modified" +msgstr "modifiée" + +msgid "Printer Name: " +msgstr "Nom de l’imprimante : " + +msgid "Printer Paused" +msgstr "en pause" + +msgid "Printer Settings" +msgstr "Réglages de l’imprimante" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Imprimante :" + +msgid "Printers" +msgstr "Imprimantes" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Purger les tâches" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Quota atteint." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Refuser les tâches" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Réimprimer après erreur" + +msgid "Request Entity Too Large" +msgstr "Entité de requête trop volumineuse" + +msgid "Resolution" +msgstr "Résolution" + +msgid "Resume Class" +msgstr "Relancer la classe" + +msgid "Resume Printer" +msgstr "Relancer l’imprimante" + +msgid "Return Address" +msgstr "Renvoyer l’adresse" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Renvoyer l’adresse - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Rembobiner" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE s’avère être de longueur indéfinie" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Autres" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Port série #%d" + +msgid "Server Restarted" +msgstr "Le serveur a redémarré" + +msgid "Server Security Auditing" +msgstr "Vérification de la sécurité du serveur" + +msgid "Server Started" +msgstr "Le serveur a démarré" + +msgid "Server Stopped" +msgstr "Le serveur s’est arrêté" + +msgid "Service Unavailable" +msgstr "Service indisponible" + +msgid "Set Allowed Users" +msgstr "Définir les autorisations" + +msgid "Set As Server Default" +msgstr "Définir comme valeur par défaut pour le serveur" + +msgid "Set Class Options" +msgstr "Définir les options de classe" + +msgid "Set Printer Options" +msgstr "Définir les options de l’imprimante" + +msgid "Set Publishing" +msgstr "Définir la publication" + +msgid "Shipping Address" +msgstr "Adresse de livraison" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Adresse de livraison - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Bord le plus court (paysage)" + +msgid "Special Paper" +msgstr "Papier spécial" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Début de la bannière" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Déclaration" + +msgid "Stylus Color Series" +msgstr "Série Stylus Color" + +msgid "Stylus Photo Series" +msgstr "Série Stylus Photo" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Permuter les protocoles" + +msgid "Tabloid" +msgstr "Tabloïd" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Détacher" + +msgid "Tear-Off" +msgstr "Détacher" + +msgid "Tear-Off Adjust Position" +msgstr "Position d’ajustement du détachement" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Le fichier PPD « %s » n’a pu être trouvé." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Le fichier PPD « %s » n’a pu être ouvert : %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Le nom de classe doit comporter au plus 127 caractères, tous imprimables, " +"sans espace, « / » et « # »." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"L’attribut « notify-lease-duration » ne peut pas être utilisé dans un " +"abonnement de tâche." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Le nom d’imprimante doit comporter au plus 127 caractères, tous imprimables, " +"sans espace, « / » et « # »." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Le paramètre printer-uri « %s » contient des caractères non valides." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"L’attribut « printer-uri » doit se présenter sous la forme « ipp://HOSTNAME/" +"classes/CLASSNAME »." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"L’attribut « printer-uri » doit se présenter sous la forme « ipp://HOSTNAME/" +"printers/PRINTERNAME »." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Le nom de l’abonnement ne doit pas contenir d’espace ni aucun des symboles " +"« / », « ? » et « # »." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Les abonnements sont trop nombreux." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Papier pour transfert thermique" + +msgid "Title: " +msgstr "Titre : " + +msgid "Too many active jobs." +msgstr "Trop de tâches en cours." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparence" + +msgid "Tray" +msgstr "Bac" + +msgid "Tray 1" +msgstr "Bac 1" + +msgid "Tray 2" +msgstr "Bac 2" + +msgid "Tray 3" +msgstr "Bac 3" + +msgid "Tray 4" +msgstr "Bac 4" + +msgid "URI Too Long" +msgstr "URI trop long" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Légal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Lettre" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Port série USB #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Impossible d’accéder au fichier cupsd.conf :" + +msgid "Unable to add RSS subscription:" +msgstr "Impossible d’ajouter d’abonnement RSS :" + +msgid "Unable to add class:" +msgstr "Impossible d’ajouter la classe :" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Impossible d’ajouter l’imprimante :" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Impossible d’annuler l’abonnement RSS :" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Impossible de modifier l’attribut « printer-is-shared » :" + +msgid "Unable to change printer:" +msgstr "Impossible de modifier l’imprimante :" + +msgid "Unable to change server settings:" +msgstr "Impossible de modifier les réglages du serveur :" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Connexion à l’hôte impossible." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Impossible de créer le fichier temporaire :" + +msgid "Unable to delete class:" +msgstr "Impossible de supprimer la classe :" + +msgid "Unable to delete printer:" +msgstr "Impossible de supprimer l’imprimante :" + +msgid "Unable to do maintenance command:" +msgstr "Impossible de lancer la commande de maintenance :" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Impossible d’obtenir la liste des classes :" + +msgid "Unable to get class status:" +msgstr "Impossible d’obtenir l’état de la classe :" + +msgid "Unable to get list of printer drivers:" +msgstr "Impossible d’obtenir la liste des gestionnaires d’impression :" + +msgid "Unable to get printer attributes:" +msgstr "Impossible de récupérer les attributs de l’imprimante :" + +msgid "Unable to get printer list:" +msgstr "Impossible d’obtenir la liste des imprimantes :" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Impossible d’obtenir l’état de l’imprimante :" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Impossible de modifier la classe :" + +msgid "Unable to modify printer:" +msgstr "Impossible de modifier l’imprimante :" + +msgid "Unable to move job" +msgstr "Impossible de transférer la tâche." + +msgid "Unable to move jobs" +msgstr "Impossible de transférer les tâches." + +msgid "Unable to open PPD file" +msgstr "Impossible d’ouvrir le fichier PPD." + +msgid "Unable to open PPD file:" +msgstr "Impossible d’ouvrir le fichier PPD :" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Impossible d’ouvrir le fichier cupsd.conf :" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Impossible d’imprimer la page de test :" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Impossible de définir les options :" + +msgid "Unable to set server default:" +msgstr "Impossible de définir la valeur par défaut pour le serveur :" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Impossible de transmettre le fichier cupsd.conf :" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Non autorisé" + +msgid "Units" +msgstr "Unités" + +msgid "Unknown" +msgstr "Inconnu" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Paramètre printer-error-policy « %s » inconnu." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Paramètre printer-op-policy « %s » inconnu." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Type de valeur non pris en charge" + +msgid "Upgrade Required" +msgstr "Mise à niveau obligatoire" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "La valeur s’avère être de longueur indéfinie" + +msgid "VarBind uses indefinite length" +msgstr "VarBind s’avère être de longueur indéfinie" + +msgid "Version uses indefinite length" +msgstr "La version s’avère être de longueur indéfinie" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Oui" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Vous devez accéder à cette page par l’URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Imprimante pour étiquettes ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "abandonnée" + +msgid "canceled" +msgstr "annulée" + +msgid "completed" +msgstr "terminée" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "L’exécution de « cups-deviced » a échoué." + +msgid "cups-driverd failed to execute." +msgstr "L’exécution de « cups-driverd » a échoué." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "Le paramètre error-index s’avère être de longueur indéfinie" + +msgid "error-status uses indefinite length" +msgstr "Le paramètre error-status s’avère être de longueur indéfinie" + +msgid "held" +msgstr "retenue" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inactive" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "en attente" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "en cours" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "Le paramètre request-id s’avère être de longueur indéfinie" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "stat sur %s a échoué : %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "arrêtée" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "inconnu" + +msgid "untitled" +msgstr "sans titre" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings s’avère être de longueur indéfinie" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(tous)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(aucun)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d entrées\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tAprès une erreur : poursuivre\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAlertes :" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBannière requise\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tJeux de caractères :\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tConnexion : directe\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tConnexion : distante\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tTaille de papier par défaut :\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tTon par défaut :\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tRéglages par défaut du port :\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDescription : %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormat monté :\n" +#~ "\tType de contenu : any (quelconque)\n" +#~ "\tType d’imprimantes : unknown (inconnu)\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormats autorisés :\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterface : %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterface : %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterface : %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tEmplacement : %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tEn cas d’erreur : aucun avertissement\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tUtilisateurs autorisés :\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tUtilisateurs refusés :\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemon présent\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\taucune entrée\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tl’imprimante correspond au périphérique « %s », débit -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tl’impression est désactivée\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tl’impression est activée\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tmis en file d’attente pour %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tla mise en file d’attente est désactivée\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tla mise en file d’attente est activée\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\traison inconnue\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " RÉSULTATS DÉTAILLÉS DU TEST DE CONFORMITÉ\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF : page 15, rubrique 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF : page 15, rubrique 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF : page 19, rubrique 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF : page 20, rubrique 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF : page 27, rubrique 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF : page 42, rubrique 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF : pages 16 et 17, rubrique 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF : pages 42 à 45, rubrique 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF : pages 45 et 46, rubrique 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF : pages 48 et 49, rubrique 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF : pages 52 à 54, rubrique 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f octets\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " VALIDE Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " VALIDE DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " VALIDE DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " VALIDE FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " VALIDE FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " VALIDE LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " VALIDE LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " VALIDE Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " VALIDE ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " VALIDE NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " VALIDE PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " VALIDE PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " VALIDE PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " VALIDE PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " VALIDE Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " VALIDE ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " ATTN « %s %s » entre en conflit avec « %s %s ».\n" +#~ " (constraint=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " ATTN Aucune option ne correspond à %s.\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " ATTN %s partage un préfixe avec %s\n" +#~ " REF : page 15, rubrique 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " ATTN Choix par défaut en conflit.\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " ATTN Le mot-clé %s d’option duplex peut ne pas fonctionner " +#~ "comme attendu et doit s’intituler Duplex.\n" +#~ " REF : page 122, rubrique 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " ATTN Le fichier contient un mélange de fins de ligne CR, LF et " +#~ "CR LF.\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " ATTN LanguageEncoding requis d’après les spécifications PPD " +#~ "4.3\n" +#~ " REF : pages 56 et 57, rubrique 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " ATTN La ligne %d ne contient que des espaces blancs.\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " ATTN Paramètre Manufacturer requis d’après les spécifications " +#~ "PPD 4.3\n" +#~ " REF : pages 58 et 59, rubrique 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " ATTN Fichier APDialogExtension « %s » manquant\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " ATTN Fichier APPrinterIconPath « %s » manquant\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " ATTN Les fichiers PPD non-Windows doivent utiliser des fins de " +#~ "ligne définis uniquement par LF et non CR LF.\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " ATTN Version PPD obsolète %.1f.\n" +#~ " REF : page 42, rubrique 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " ATTN Le nom de fichier PCFileName ne respecte pas les " +#~ "spécifications PPD pour le format 8.3\n" +#~ " REF : pages 61 et 62, rubrique 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " ATTN La section Protocols contient PJL mais les attributs JCL " +#~ "ne sont pas définis.\n" +#~ " REF : pages 78 et 79, rubrique 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " ATTN La section Protocols contient PJL et BCP, mais TBCP est " +#~ "attendu.\n" +#~ " REF : pages 78 et 79, rubrique 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " ATTN ShortNickName requis d’après les spécifications PPD 4.3\n" +#~ " REF : pages 64 et 65, rubrique 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s n’existe pas.\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Choix %s erroné %s.\n" +#~ " REF  : page 122, rubrique 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Chaîne de traduction UTF-8 « %s » incorrecte pour l’option %s.\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Chaîne de traduction UTF-8 « %s » incorrecte pour l’option %s, " +#~ "le choix %s.\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Valeur cupsFilter « %s » incorrecte.\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s cupsICCProfile « %s »  incorrect.\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Valeur cupsPreFilter « %s » incorrecte.\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s cupsUIConstraints %s : « %s ».\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Langue « %s » incorrecte.\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints %s vide.\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Chaîne de traduction « %s » manquante pour l’option %s.\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Chaîne de traduction « %s » manquante pour l’option %s et le " +#~ "choix %s.\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Choix manquant *%s %s dans UIConstraints « *%s %s *%s %s ».\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Choix manquant *%s %s dans cupsUIConstraints %s :« %s ».\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Fichier cupsFilter manquant « %s ».\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Fichier cupsICCProfile manquant « %s ».\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Fichier cupsPreFilter manquant « %s ».\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver manquant « %s ».\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Option %s manquante dans UIConstraints « *%s %s *%s %s ».\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Option %s manquante dans cupsUIConstraints %s : « %s ».\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr "" +#~ " %s Aucune traduction de base « %s » n’est comprise dans le " +#~ "fichier.\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s %s requis ne définit pas le choix Aucun.\n" +#~ " REF : page 122, rubrique 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr "" +#~ " %s La valeur de hachage cupsICCProfile %s entre en collision avec %" +#~ "s.\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s provoque une boucle.\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **ÉCHEC** Les noms de choix %s %s et %s diffèrent seulement par " +#~ "leurs majuscules.\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **ÉCHEC** %s doit correspondre à 1284DeviceID.\n" +#~ " REF : page 72, rubrique 5.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **ÉCHEC** Default%s %s erroné.\n" +#~ " REF : page 40, rubrique 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** DefaultImageableArea %s erroné.\n" +#~ " REF : page 102, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** DefaultPaperDimension %s erroné.\n" +#~ " REF : page 103, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **ÉCHEC** Attribut JobPatchFile erroné dans le fichier.\n" +#~ " REF : page 24, rubrique 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **ÉCHEC** Manufacturer erroné (doit être « HP »)\n" +#~ " REF : page 211, tableau D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **ÉCHEC** Manufacturer incorrect (doit être « Oki »)\n" +#~ " REF : page 211, tableau D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** ModelName erroné - « %c » interdit dans la chaîne.\n" +#~ " REF : pages 59 et 60, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** PSVersion erroné - différent de « (string) int ».\n" +#~ " REF : pages 62 à 64, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** Paramètre Product erroné - différent de « (string) ».\n" +#~ " REF : page 62, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** ShortNickName erroné - dépasse 31 caractères.\n" +#~ " REF : pages 64 et 65, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **ÉCHEC** Choix %s %s erroné.\n" +#~ " REF : page 84, rubrique 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** FileVersion « %s » incorrect\n" +#~ " REF : page 56, rubrique 5.3." + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** FormatVersion « %s » incorrect\n" +#~ " REF : page 56, section 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **ÉCHEC** LanguageEncoding %s incorrect - doit correspondre à " +#~ "ISOLatin1.\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **ÉCHEC** LanguageVersion %s incorrect - doit correspondre à " +#~ "Anglais.\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **ÉCHEC** Le code de l’option par défaut ne peut pas être " +#~ "interprété : %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **ÉCHEC** La chaîne de traduction par défaut pour l’option %s, " +#~ "choix %s, contient des caractères 8 bits.\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **ÉCHEC** La chaîne de traduction par défaut pour l’option %s " +#~ "contient des caractères 8 bits.\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **ÉCHEC** Les noms de groupe %s et %s diffèrent seulement par " +#~ "leurs majuscules.\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **ÉCHEC** Plusieurs occurrences de %s, nom de choix %s.\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **ÉCHEC** Noms d’option %s et %s diffèrent seulement par leurs " +#~ "majuscules.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **ÉCHEC** Default%s requis\n" +#~ " REF : page 40, rubrique 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** DefaultImageableArea requis\n" +#~ " REF : page 102, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** DefaultPaperDimension requis\n" +#~ " REF : page 103, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** FileVersion requis\n" +#~ " REF : page 56, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** FormatVersion requis\n" +#~ " REF : page 56, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** ImageableArea requis pour PageSize %s\n" +#~ " REF : page 41, rubrique 5.\n" +#~ " REF : page 102, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** LanguageEncoding requis\n" +#~ " REF : pages 56 et 57, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** LanguageVersion requis\n" +#~ " REF : pages 57 et 58, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** Manufacturer requis\n" +#~ " REF : pages 58 et 59, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** ModelName requis\n" +#~ " REF : pages 59 et 60, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** NickName requis\n" +#~ " REF : page 60, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** PCFileName requis\n" +#~ " REF : pages 61 et 62, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** PSVersion requis\n" +#~ " REF : pages 62 à 64, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **ÉCHEC** PageRegion requis\n" +#~ " REF : page 100, rubrique 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **ÉCHEC** PageSize requis\n" +#~ " REF : page 41, rubrique 5.\n" +#~ " REF : page 99, rubrique 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **ÉCHEC** PageSize requis\n" +#~ " REF : pages 99 et 100, rubrique 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **ÉCHEC** PaperDimension requis pour PageSize %s\n" +#~ " REF : page 41, rubrique 5.\n" +#~ " REF : page 103, rubrique 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** Product requis\n" +#~ " REF : page 62, rubrique 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **ÉCHEC** ShortNickName requis\n" +#~ " REF : page 64 et 65, rubrique 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr "%d ERREURS TROUVÉES\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " %%%%BoundingBox erroné : %d en ligne.\n" +#~ " REF : page 39, %%%%BoundingBox :\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " %%%%Page erroné  : %d en ligne.\n" +#~ " REF : page 53, %%%%Page :\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " %%%%Pages erroné : %d en ligne.\n" +#~ " REF : page 43, %%%%Pages :\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " La ligne %d dépasse 255 caractères (%d).\n" +#~ " REF : page 25, longueur de ligne\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 manquant à la première ligne.\n" +#~ " REF : page 17, 3.1 Uniformisation des documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Commentaire %%EndComments manquant.\n" +#~ " REF : page 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox manquant ou erroné : commentaire.\n" +#~ " REF : page 39, %%BoundingBox :\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page manquant ou erroné : commentaires.\n" +#~ " REF: page 53, %%Page :\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages manquant ou erroné : commentaire.\n" +#~ " REF : page 43, %%Pages :\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " AUCUNE ERREUR RENCONTRÉE\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " %d lignes dépassant 255 caractères rencontrées.\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Commentaires %%BeginDocument trop nombreux.\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Commentaires %%EndDocument trop nombreux.\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Attention : le fichier contient des données binaires.\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Attention : pas de commentaire %%EndComments dans le fichier.\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Attention : version DSC obsolète %.1f dans le fichier.\n" + +#~ msgid " FAIL\n" +#~ msgstr " ÉCHEC\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " ÉCHEC\n" +#~ " **ÉCHEC** Impossible d’ouvrir le fichier - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " ÉCHEC\n" +#~ " **ÉCHEC** Impossible d’ouvrir le fichier - %s en ligne %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " VALIDE\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Enveloppe" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Enveloppe" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Enveloppe" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Enveloppe" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Enveloppe" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f octets\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f octets\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s acceptant des requêtes depuis %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s n’est pas implémenté par la version CUPS de lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s n’est pas prêt\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s est prêt\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s est prêt et en cours d’impression\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s n’acceptant pas de requêtes depuis %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s : opération non prise en charge." + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s%s acceptant des requêtes depuis %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s n’acceptant pas de requêtes depuis %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s : %-33.33s [tâche %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s : %s échoué : %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s : aucune décision possible.\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s : Erreur - %s destination non-existante des noms de variable " +#~ "d’environnement « %s ».\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s : erreur - ID de tâche incorrect.\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s : erreur - ne peut pas imprimer les fichiers et modifier les tâches " +#~ "simultanément.\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s : erreur - ne peut pas imprimer depuis stdin si les fichiers ou l’ID " +#~ "de tâche sont fournis.\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s : erreur - jeu de caractères attendu après l’option « -S ».\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s : erreur - type de contenu attendu après l’option « -T ».\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s : erreur - copies attendues après l’option « -n ».\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s : erreur - nombre de copies attendu après l’option « -# ».\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s : erreur - destination attendue après l’option « -P ».\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s : erreur - destination attendue après l’option « -b ».\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s : erreur - destination attendue après l’option « -d ».\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s : erreur - formulaire attendu après l’option « -f ».\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s : erreur - nom de maintien attendu après l’option « -H ».\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s : erreur - nom d’hôte attendu après l’option « -H ».\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s : erreur - nom d’hôte attendu après l’option « -h ».\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s : erreur - liste des modes attendue après l’option « -y ».\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s : erreur - nom attendu après l’option « -%c ».\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s : erreur - chaîne d’option attendue après l’option « -o ».\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s : erreur - liste de pages attendue après l’option « -P ».\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s : erreur - priorité attendue après l’option « -%c ».\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s : erreur - raison attendue après l’option « -r ».\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s : erreur - titre attendu après l’option « -t ».\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s : erreur - nom d’utilisateur attendu après l’option « -U.\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s : erreur - nom d’utilisateur attendu après l’option « -u ».\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s : erreur - valeur attendue après l’option « -%c ».\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s : erreur - « terminé », « pas terminé » ou « tout » nécessaire après " +#~ "l’option « -W ».\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s : erreur - aucune destination par défaut disponible.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s : erreur - la priorité doit être comprise entre 1 et 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Erreur - le programmateur ne répond pas.\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s : erreur - fichiers trop nombreux - « %s »\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s : erreur - impossible d’accéder à « %s » - %s" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "" +#~ "%s : erreur - impossible de mettre en file d’attente depuis stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s : erreur - destination inconnue « %s ».\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s : erreur - destination inconnue « %s/%s ».\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s : erreur - option inconnue « -%c ».\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s : erreur - option inconnue « -%s ».\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s : erreur - ID de tâche attendu après l’option « -i ».\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s : filtre « %s » indisponible : %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s : nom de destination dans la liste « %s »  non valide.\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s : chaîne de filtre « %s » non valide" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s : identifiant de tâche (« -i jobid ») nécessaire avant « -H restart ».\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s : aucun filtre pour convertir %s/%s en %s/%s.\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s : l’opération a échoué : %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "" +#~ "%s : désolé, aucune prise en charge du chiffrement incluse dans la " +#~ "compilation.\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s : Connexion impossible au serveur\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s : impossible de contacter le serveur.\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr " %s : impossible de déterminer le type MIME de « %s ».\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s : impossible d’ouvrir %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s : impossible d’ouvrir %s - %s à la ligne %d." + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s : impossible d’ouvrir %s : %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s : impossible d’ouvrir le fichier PPD : %s à la ligne %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "" +#~ "%s : impossible de lire la base de données MIME à partir de « %s » ou « %" +#~ "s ».\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s : destination inconnue « %s ».\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s : destination inconnue du type MIME %s/%s.\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s : option inconnue « %c ».\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s : source inconnue du type MIME %s/%s.\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s : avertissement - modification de format « %c » non prise en charge - " +#~ "la sortie risque d’être incorrecte.\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s : avertissement - option du jeu de caractères ignorée.\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s : avertissement - option du type de contenu ignorée.\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s : avertissement - option de formulaire ignorée.\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s : avertissement - option de mode ignorée.\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s : erreur - %s destination non-existante des noms de variable " +#~ "d’environnement « %s ».\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s : erreur - « option=valeur » attendu après l’option « -o ».\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s : erreur - aucune destination par défaut disponible.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 ppp (niveaux de gris)" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 ppp" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Commande inconnue d’aide\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "Un mot de passe SAMBA est nécessaire pour exporter les gestionnaires " +#~ "d’impression." + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Un nom d’utilisateur SAMBA est nécessaire pour exporter les gestionnaires " +#~ "d’impression." + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Une classe porte déjà le nom de « %s »." + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Une imprimante porte déjà le nom de « %s »." + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (format supérieur)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (format supérieur)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (petit format)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (format supérieur)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "" +#~ "Tentative d’attribution d’une valeur erronée au paramètre « printer-" +#~ "state » %s : %d." + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Les groupes d’attributs ne sont pas dans le bon ordre (%x < %x)." + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "URI de périphérique « %s » incorrect.\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "device-uri « %s » incorrect." + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Schéma de device-uri « %s » incorrect." + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "document-format « %s » incorrect." + +#~ msgid "Bad filename buffer!" +#~ msgstr "Tampon des noms de fichier incorrect." + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Attribut de police incorrect : %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Valeur de job-priority incorrecte." + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Valeur de job-sheets « %s » incorrecte." + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Type de job-sheets incorrect." + +#~ msgid "Bad job-state value!" +#~ msgstr "Valeur de job-state incorrecte." + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Attribut de job-uri « %s » incorrect." + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Paramètre notify-pull-method « %s » incorrect." + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "URI de notify-recipient-uri « %s » incorrect." + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Couple option/choix incorrect à la ligne %d.\n" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "port-monitor « %s » incorrect" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Valeur de printer-state %d incorrecte." + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Numéro de version de requête %d.%d incorrect." + +#~ msgid "Bad subscription ID!" +#~ msgstr "Identifiant d’abonnement incorrect." + +#~ msgid "C0 Envelope" +#~ msgstr "C0 Enveloppe" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 Enveloppe" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 Enveloppe" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 Enveloppe" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 Enveloppe" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 Enveloppe" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 Enveloppe" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 Enveloppe" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 Enveloppe" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Jeu de caractères « %s » non pris en charge." + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 Enveloppe" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 Enveloppe" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Les commandes peuvent être abrégées. Celles-ci correspondent à :\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Impossible d’analyser le type « %s »." + +#~ msgid "Cover open." +#~ msgstr "Couvercle ouvert." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL Enveloppe" + +#~ msgid "Developer almost empty." +#~ msgstr "Développeur presque vide." + +#~ msgid "Developer empty!" +#~ msgstr "Développeur vide." + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Périphérique : uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Document %d introuvable dans la tâche %d." + +#~ msgid "Door open." +#~ msgstr "Capot ouvert." + +#~ msgid "Double Postcard" +#~ msgstr "Carte postale double" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "" +#~ "EMERG: impossible d’allouer de la mémoire pour les informations de la " +#~ "page : %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "" +#~ "EMERG: impossible d’allouer de la mémoire pour l’étalage des pages : %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox erroné : commentaire vu.\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: %%IncludeFeature erroné : commentaire.\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: %%Page erroné : commentaire dans le fichier.\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: %%PageBoundingBox erroné : commentaire dans le fichier.\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: fichier de périphérique SCSI « %s » erroné.\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: fichier de jeu de caractères %s erroné\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: type de jeu de caractères %s erroné\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: valeur de colonnes %d erronée.\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: valeur de cpi %f erronée.\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: ligne de description de police erronée : %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: valeur de lpi %f erronée.\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: format d’impression erroné.\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: direction de texte %s erronée\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: largeur de texte %s erronée\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: l’imprimante de destination n’existe pas.\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox en double : commentaire vu.\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: %%Pages en double : commentaire vu.\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: fichier d’impression vide.\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: erreur %d lors de l’envoi de la requête PAPSendData : %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "" +#~ "ERROR: chaîne entre guillemets droits attendue à la ligne %d sur %s.\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: erreur USB fatale.\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: commande HP-GL/2 non valide détectée ; impossible d’imprimer le " +#~ "fichier.\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog manquant.\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup manquant.\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: URI du périphérique manquant sur la ligne de commande et aucune " +#~ "variable d’environnement DEVICE_URI.\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: valeur manquante à la ligne %d du fichier de bannière.\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: une ligne msgid est obligatoire avant toute chaîne de traduction à " +#~ "la ligne %d sur %s.\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: aucun %%BoundingBox : commentaire dans l’en-tête.\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: aucun %%Pages : commentaire dans l’en-tête.\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: aucun URI trouvé pour le périphérique, dans argv[0] ou la variable " +#~ "d’environnement DEVICE_URI.\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "" +#~ "ERROR: aucune police ne se trouve dans le fichier du jeu de caractères %" +#~ "s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: aucune page trouvée.\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: plus de papier.\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: variable d’environnement d’imprimante non définie.\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: fichier d’impression non accepté (%s).\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: l’imprimante ne répond pas.\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: l’imprimante ne répond pas.\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: l’imprimante a envoyé un code EOF inattendu.\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: l’hôte à distance n’a pas accepté le fichier contrôle (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "" +#~ "ERROR: l’hôte à distance n’a pas accepté le fichier de données (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: le délai d’attente a été dépassé lors de l’envoi de données à " +#~ "l’imprimante.\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: impossible d’ajouter le fichier %d à la tâche : %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: impossible d’annuler la tâche %d : %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: impossible de copier le fichier PDF" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: impossible de créer un socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: impossible de créer un fichier d’impression temporaire compressé : " +#~ "%s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: impossible de créer un fichier temporaire." + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: impossible de créer un fichier temporaire - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: impossible de créer un fichier temporaire : %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: impossible d’exécuter pictwpstops : %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: impossible d’exécuter le programme gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: impossible d’exécuter le programme pdftops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: impossible d’effectuer le fork de pictwpstops : %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: impossible d’obtenir la requête PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: impossible d’obtenir la réponse PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: impossible d’obtenir le fichier PPD pour l’imprimante « %s » - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: impossible de déterminer la zone AppleTalk par défaut" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: impossible d’obtenir les attributs %d de la tâche (%s).\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: impossible de déterminer l’état de l’imprimante (%s).\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: impossible de localiser l’imprimante « %s ».\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: impossible de rechercher une réponse PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: impossible de rechercher des imprimantes AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: impossible de générer une adresse AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: impossible d’ouvrir « %s » - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: impossible d’ouvrir %s : %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier de bannière « %s » - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier « %s » de périphérique : %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier « %s » - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier « %s » : %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "" +#~ "ERROR: impossible d’ouvrir le fichier image en vue de l’impression.\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier d’impression « %s » : %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier d’impression %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: impossible d’ouvrir le fichier d’impression %s : %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: impossible d’ouvrir le fichier d’impression temporaire compressé : " +#~ "%s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: impossible d’ouvrir le fichier temporaire." + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: impossible d’imprimer %d colonnes de texte.\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: impossible d’imprimer la page de texte en %d x %d.\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: impossible de lire les données d’impression." + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: impossible de lire les données d’impression.\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: impossible de réserver le port" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "" +#~ "ERROR: impossible de chercher jusqu’au décalage %ld dans le fichier - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "" +#~ "ERROR: impossible de chercher jusqu’au décalage %lld dans le fichier - %" +#~ "s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: impossible d’envoyer la commande LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: impossible d’envoyer la requête de passage PAP" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "" +#~ "ERROR: impossible d’envoyer la requête initiale de données d’envoi PAP" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: impossible d’envoyer les données d’impression (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: impossible d’envoyer les données d’impression.\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: impossible d’envoyer le fichier d’impression à l’imprimante" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: impossible d’envoyer la valeur Null de fin à l’imprimante" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: impossible d’attendre les pictwpstop : %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: impossible d’écrire %d octets sur « %s » : %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: impossible d’écrire %d octets vers l’imprimante.\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: impossible d’écrire le contenu du fichier de contrôle" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: impossible d’écrire les données d’impression" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "" +#~ "ERROR: impossible d’écrire le contenu des données d’impression : %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "" +#~ "ERROR: impossible d’écrire de données de trame dans le gestionnaire.\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: impossible d’écrire dans le fichier temporaire" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "" +#~ "ERROR: impossible d’écrire de données de document non compressées : %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: texte inattendu à la ligne %d sur %s.\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: valeur de l’option de chiffrement « %s » inconnue.\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: ordre de fichier « %s » inconnu\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: caractère de format « %c » inconnu\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: format du catalogue de messages inconnu pour « %s ».\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: option « %s » inconnue avec la valeur « %s ».\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: mode d’impression « %s » inconnu\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: inconnue version option value « %s ».\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: valeur de luminosité non prise en charge %s, brightness=100.\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: valeur de gamma non prise en charge %s, gamma=1000.\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: valeur number-up non prise en charge %d, number-up=1.\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: valeur de number-up-layout non prise en charge %s, number-up-" +#~ "layout=lrtb.\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: valeur de page-border non prise en charge %s, page-border=none.\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "" +#~ "ERROR: dépassement de capacité de doc_printf (%d octets) détecté, " +#~ "processus en cours d’interruption.\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "" +#~ "ERROR: le filtre pdftops a cessé de fonctionner à l’issue du signal %d.\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "" +#~ "ERROR: le filtre pdftops a indiqué l’état %d lors de sa fermeture.\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops a quitté au signal %d.\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops a indiqué l’état %d lors de sa fermeture.\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: problème réversible : impossible de se connecter à l’imprimante ; " +#~ "nouvel essai dans 30 secondes…\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: la fonction select() a échoué" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: impossible de lancer le fichier d’impression" + +#~ msgid "Empty PPD file!" +#~ msgstr "Fichier PPD vide." + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Erreur : un nom d’hôte après l’option « -h » est nécessaire.\n" + +#~ msgid "FAIL\n" +#~ msgstr "ÉCHEC\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Les URI des périphériques de fichier ont été désactivés. Pour l’activer, " +#~ "reportez-vous à la directive FileDevice dans « %s/cupsd.conf »." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Température de l’unité-fusible élevée." + +#~ msgid "Fuser temperature low!" +#~ msgstr "Température de l’unité-fusible faible." + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Légal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Attribut « printer-uri » trouvé mais sans attribut « job-id »" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk désactivé dans les Préférences Système.\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk désactivé dans les Préférences Système.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: annulation de la tâche d’impression…\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: connecté à l’imprimante…\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: connexion à l’imprimante…\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: fichier de contrôle envoyé correctement\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: fichier de données envoyé correctement\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: mise en forme de la page %d…\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: chargement du fichier image…\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: recherche de l’imprimante…\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: établissement de la connexion\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: fichier d’impression envoyé, en attente de la fin de la tâche " +#~ "d’impression…\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: imprimante occupée ; nouvel essai dans 10 secondes…\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: imprimante occupée ; nouvel essai dans 30 secondes…\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: imprimante occupée ; nouvel essai dans 5 secondes…\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: imprimante ne prenant pas en charge IPP/%d.%d ; tentative avec " +#~ "IPP/1.0…\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: imprimante occupée ; nouvel essai dans 5 secondes…\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: imprimante actuellement déconnectée.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: imprimante actuellement hors ligne.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: imprimante en ligne à présent.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: imprimante hors ligne.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: imprimante non connectée ; nouvel essai dans 30 secondes…\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: impression de la page %d, %d %% accompli…\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: impression de la page %d…\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: prêt pour l’impression.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: envoi du fichier de contrôle (%lu octets)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: envoi du fichier de contrôle (%u octets)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: envoi des données\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: envoi du fichier de données (%ld octets)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: envoi du fichier de données (%lld octets)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: envoi des données d’impression…\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: fichier d’impression envoyé, %ld octets…\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: fichier d’impression envoyé, %lld octets…\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: mise en attente de la tâche LPR, %.0f %% achevé…\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: impossible d’entrer en contact avec l’imprimante, mise en file " +#~ "d’attente sur l’imprimante suivante par ordre de classe…\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: utilisation de la zone AppleTalk par défaut « %s »\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: en attente de la fin de la tâche…\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: attente de disponibilité de l’imprimante…\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 Enveloppe" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (format supérieur)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 Enveloppe" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 Enveloppe" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Encre/toner presque vide." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Encre/toner vide." + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Poubelle d’encre/de toner presque remplie." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Poubelle d’encre/de toner remplie." + +#~ msgid "Interlock open." +#~ msgstr "Dispositif de verrouillage ouvert." + +#~ msgid "Invite Envelope" +#~ msgstr "Enveloppe d’invitation" + +#~ msgid "Italian Envelope" +#~ msgstr "Enveloppe à l’italienne" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "La tâche n°%d ne peut être redémarrée - aucun fichier." + +#~ msgid "Job #%d does not exist!" +#~ msgstr "La tâche n°%d n’existe pas." + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "La tâche n°%d est terminée et ne peut plus être modifiée." + +#~ msgid "Job #%d is not complete!" +#~ msgstr "La tâche n°%d n’est pas terminée." + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "La tâche n°%d n’est pas en attente d’authentification." + +#~ msgid "Job #%d is not held!" +#~ msgstr "La tâche n°%d n’est pas retenue." + +#~ msgid "Job #%s does not exist!" +#~ msgstr "La tâche n°%s n’existe pas." + +#~ msgid "Job %d not found!" +#~ msgstr "La tâche n°%d n’a pas été trouvée." + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Les abonnements de tâche ne peuvent être renouvelés." + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Enveloppe Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Enveloppe Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Langue « %s » non prise en charge." + +#~ msgid "Media jam!" +#~ msgstr "Bourrage papier" + +#~ msgid "Media tray almost empty." +#~ msgstr "Bac à papier presque vide." + +#~ msgid "Media tray empty!" +#~ msgstr "Bac à papier vide." + +#~ msgid "Media tray missing!" +#~ msgstr "Bac manquant." + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Le bac à papier doit être rempli." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Attribut « document-number » manquant." + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Caractère ˝ manquant à la ligne %d." + +#~ msgid "Missing form variable!" +#~ msgstr "Un champ du formulaire HTML n’a pas été rempli." + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Attribut notify-subscription-ids manquant" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Attribut « requesting-user-name » manquant" + +#~ msgid "Missing required attributes!" +#~ msgstr "Il manque des attributs indispensables." + +#~ msgid "Missing value on line %d!" +#~ msgstr "Valeur manquante à la ligne %d.\n" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modèle : name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Enveloppe Monarch" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: fichier d’impression accepté - identifiant de tâche %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "" +#~ "NOTICE: fichier d’impression accepté - identifiant de tâche inconnu.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Aucun nom PPD" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Aucun pilote d’impression Windows n’est installé." + +#~ msgid "No active jobs on %s!" +#~ msgstr "Aucune tâche en cours sur « %s »." + +#~ msgid "No attributes in request!" +#~ msgstr "Aucun attribut dans la requête." + +#~ msgid "No authentication information provided!" +#~ msgstr "Aucune information d’authentification." + +#~ msgid "No default printer" +#~ msgstr "Aucune imprimante par défaut" + +#~ msgid "No file!?!" +#~ msgstr "Aucun fichier !?!" + +#~ msgid "No modification time!" +#~ msgstr "Aucune heure de modification" + +#~ msgid "No printer name!" +#~ msgstr "Aucun nom d’imprimante." + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Paramètre printer-uri absent pour la classe." + +#~ msgid "No printer-uri found!" +#~ msgstr "Paramètre printer-uri absent." + +#~ msgid "No printer-uri in request!" +#~ msgstr "Paramètre printer-uri absent de la requête." + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Aucun attribut d’abonnement dans la requête." + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC presque en fin de vie." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC en fin de vie." + +#~ msgid "Out of toner!" +#~ msgstr "Plus de toner." + +#~ msgid "Output bin almost full." +#~ msgstr "Corbeille de sortie presque pleine." + +#~ msgid "Output bin full!" +#~ msgstr "Corbeille de sortie pleine." + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "La sortie de l’imprimante %s est envoyée à %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "La sortie de l’imprimante %s est envoyée à l’imprimante distante %s sur %" +#~ "s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "La sortie de l’imprimante %s/%s est envoyée à %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "La sortie de l’imprimante %s/%s est envoyée à l’imprimante distante %s " +#~ "sur %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Bac en sortie manquant." + +#~ msgid "PASS\n" +#~ msgstr "VALIDE\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Enveloppe PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Enveloppe PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Enveloppe PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Enveloppe PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (format supérieur)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Enveloppe PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Enveloppe PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Enveloppe PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Enveloppe PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Enveloppe PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Enveloppe PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Enveloppe personnelle" + +#~ msgid "Printer offline." +#~ msgstr "hors ligne." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Classmt Proprio Tâche Fichier(s) Taille " +#~ "totale\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Classmt Proprio Pri Tâche Fichiers Taille " +#~ "totale\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Commande en cours d’exécution : %s %s -N -A %s -c « %s »\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Imprimante SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloïd (format supérieur)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "" +#~ "La valeur de l’attribut « notify-user-data » est trop grande (%d > 63 " +#~ "octets)." + +#~ msgid "The printer or class is not shared!" +#~ msgstr "L’imprimante ou la classe n’est pas partagée." + +#~ msgid "The printer or class was not found." +#~ msgstr "L’imprimante ou la classe n’a pas été trouvée." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "L’attribut « job-printer-uri » est obligatoire." + +#~ msgid "Toner low." +#~ msgstr "Niveau du toner faible." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Valeurs job-sheets trop nombreuses (%d > 2)." + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Valeurs printer-state-reasons trop nombreuses (%d > %d)." + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Légal (format supérieur)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Lettre (format supérieur)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Lettre (format inférieur)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Impossible d’ajouter de tâche à la destination « %s »." + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Impossible d’allouer de la mémoire pour les types de fichiers." + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible de copier les fichiers des gestionnaires d’impression CUPS " +#~ "64 bits (%d)." + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible de copier les fichiers des pilotes d’impression Windows " +#~ "64 bits (%d)." + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible de copier les fichiers du gestionnaire d’impression CUPS (%d)." + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Impossible de copier le fichier PPD - « %s »." + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Impossible de copier le fichier PPD." + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible de copier les fichiers des pilotes d’impression pour Windows " +#~ "2000 (%d)." + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible de copier les fichiers des pilotes d’impression pour Windows " +#~ "9x (%d)." + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Impossible de copier le script d’interface - « %s »." + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Impossible de créer le paramètre printer-uri." + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "" +#~ "Impossible de modifier des fichiers cupsd.conf de taille supérieure à " +#~ "1 Mo." + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Impossible de trouver la destination de la tâche." + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Impossible de retrouver l’imprimante.\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible d’installer les fichiers des pilotes d’impression pour Windows " +#~ "2000 (%d)." + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Impossible d’installer les fichiers des pilotes d’impression pour Windows " +#~ "9x (%d)." + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Impossible d’ouvrir le document %d dans la tâche %d." + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Impossible d’exécuter « %s » : %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Impossible d’envoyer la commande au gestionnaire de l’imprimante." + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "" +#~ "Impossible d’installer les fichiers des pilotes d’impression pour Windows " +#~ "(%d).\n" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Impossible d’exploiter l’ancien gestionnaire de la classe USB.\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Erreur inconnue relative à l’imprimante (%s)" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Jeu de caractères « %s » non pris en charge." + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Compression « %s » non prise en charge" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Attribut de compression %s non pris en charge" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Format « %s » non pris en charge" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Format « %s » non pris en charge" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Format « %s/%s » non pris en charge" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Usage :\n" +#~ "\n" +#~ " lpadmin [-h serveur] -d destination\n" +#~ " lpadmin [-h serveur] -x destination\n" +#~ " lpadmin [-h serveur] -p imprimante [-c ajouter-classe] [-i interface] " +#~ "[-m modèle]\n" +#~ " [-r supprimer-classe] [-v périphérique] [-D " +#~ "description]\n" +#~ " [-P fichier-ppd] [-o nom=valeur]\n" +#~ " [-u allow:utilisateur,utilisateur] [-u deny:" +#~ "utilisateur,utilisateur]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Usage : %s tâche utilisateur titre copies options [nom_fichier]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Usage : %s id-tâche utilisateur titre copies options [fichier]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Usage : %s id-tâche utilisateur titre copies options fichier\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Usage : convert [ options ]\n" +#~ "\n" +#~ "Options :\n" +#~ "\n" +#~ " -f nom_fichier Définir le fichier à convertir (dans le cas " +#~ "contraire, stdin)\n" +#~ " -o nom_fichier Définir le fichier à générer (dans le cas " +#~ "contraire, stdout)\n" +#~ " -i mime/type Définir le type MIME en entrée (dans le cas " +#~ "contraire, auto-typed)\n" +#~ " -j mime/type Définir le type MIME en sortie (dans le cas " +#~ "contraire, application/pdf)\n" +#~ " -P nom_fichier.ppd Définir le fichier PPD\n" +#~ " -a 'nom=valeur …' Définir la ou les options\n" +#~ " -U nom_utilisateur Définir le nom d’utilisateur pour la tâche\n" +#~ " -J titre Définir le titre\n" +#~ " -c copies Définir le nombre de copies\n" +#~ " -u Supprimer le fichier PPD une fois terminé\n" +#~ " -D Supprimer le fichier en entrée une fois terminé\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Usage : cupsaddsmb [options] imprimante1 … imprimanteN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options :\n" +#~ " -E Chiffrer la connexion au serveur\n" +#~ " -H serveur_samba Faire appel au serveur SAMBA indiqué\n" +#~ " -U utilisateur_samba S’authentifier par le biais de l’utilisateur " +#~ "SAMBA indiqué\n" +#~ " -a Exporter toutes les imprimantes\n" +#~ " -h serveur_cups Faire appel au serveur CUPS indiqué\n" +#~ " -v Activer la verbosité (afficher les commandes)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Usage : cupsctl [options] [paramètre=valeur … paramètreN=valeurN]\n" +#~ "\n" +#~ "Options :\n" +#~ "\n" +#~ " -E Activer le chiffrement\n" +#~ " -U nom_utilisateur Indiquer le nom de l’utilisateur\n" +#~ " -h serveur[:port] Indiquer l’adresse du serveur\n" +#~ "\n" +#~ " --[no-]debug-logging Activer/désactiver le listage de débogage\n" +#~ " --[no-]remote-admin Activer/désactiver l’administration à " +#~ "distance\n" +#~ " --[no-]remote-any Autoriser/interdire l’accès à partir " +#~ "d’Internet\n" +#~ " --[no-]remote-printers Afficher/masquer les imprimantes à distance\n" +#~ " --[no-]share-printers Activer/désactiver le partage d’imprimante\n" +#~ " --[no-]user-cancel-any Autoriser/interdire aux utilisateurs d’annuler " +#~ "toute tâche\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Usage : cupsd [-c fichier_config] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c fichier_config Charger un autre fichier de configuration\n" +#~ "-f Exécuter en premier plan\n" +#~ "-F Exécuter en premier plan mais en mode détaché\n" +#~ "-h Afficher le présent message d’usage des options\n" +#~ "-l Exécuter cupsd à partir de launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Usage : cupsfilter -m mime/type [ options ] nom_fichier\n" +#~ "\n" +#~ "Options :\n" +#~ "\n" +#~ " -c cupsd.conf Définir le fichier cupsd.conf à utiliser\n" +#~ " -j id-tâche[,N] Filtrer le fichier N sur la tâche indiquée (par " +#~ "défaut, fichier 1)\n" +#~ " -n copies Définir le nombre de copies\n" +#~ " -o nom=valeur Définir la ou les options\n" +#~ " -p nom_fichier.ppd Définir le fichier PPD\n" +#~ " -t titre Définir le titre\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Usage : cupstestdsc [options] nom_fichier.ps [… nom_fichier.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options :\n" +#~ "\n" +#~ " -h Afficher l’utilisation du programme\n" +#~ "\n" +#~ " Remarque : ce programme ne fait que valider les commentaires DSC et " +#~ "non le PostScript en tant que tel.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Usage : cupstestppd [options] nom_fichier1.ppd[.gz] [… nom_fichierN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options :\n" +#~ "\n" +#~ " -R répertoire_root Définir un autre utilisateur root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Produire des avertissements plutôt que des " +#~ "erreurs\n" +#~ " -q Exécuter sans sortie à l’utilisateur\n" +#~ " -r Utiliser le mode d’ouverture « sans contrainte »\n" +#~ " -v Produire une légère verbosité\n" +#~ " -vv Produire une importante verbosité\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Usage : lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Usage : lpoptions [-h serveur] [-E] -d imprimante\n" +#~ " lpoptions [-h serveur] [-E] [-p imprimante] -l\n" +#~ " lpoptions [-h serveur] [-E] -p imprimante -o option[=valeur] …\n" +#~ " lpoptions [-h serveur] [-E] -x imprimante\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Usage : lppasswd [-g nom_groupe]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Usage : lppasswd [-g nom_groupe] [nom_utilisateur]\n" +#~ " lppasswd [-g nom_groupe] -a [nom_utilisateur]\n" +#~ " lppasswd [-g nom_groupe] -x [nom_utilisateur]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Usage : lpq [-P dest] [-U nom_utilisateur] [-h nom_hôte[:port]] [-l] " +#~ "[+intervalle]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Usage : ppdc [options] nom_fichier.drv [ … nom_fichierN.drv ]\n" +#~ "Options :\n" +#~ " -D nom=valeur Définir la variable; dont le nom est indiqué; sur " +#~ "la valeur fournie.\n" +#~ " -I inclure-rép Inclure le répertoire au chemin de recherche.\n" +#~ " -c catalogue.po Charger le catalogue indiqué de messages.\n" +#~ " -d sortie-rép Préciser le répertoire de sortie.\n" +#~ " -l langue[,langue,…] Préciser la ou les langues de sortie (locale).\n" +#~ " -m Utiliser la valeur de ModelName comme nom de " +#~ "fichier.\n" +#~ " -t Tester les PPD au lieu de les générer.\n" +#~ " -v Activer la verbosité (lettres V complémentaires " +#~ "pour augmenter la verbosité).\n" +#~ " -z Comprimer les fichiers PPD par la méthode de zip " +#~ "GNU.\n" +#~ " --cr Fin de lignes à l’aide de CR (Mac OS 9).\n" +#~ " --crlf Fin de lignes à l’aide de CR + LF (Windows).\n" +#~ " --lf Fin de lignes à l’aide de LF (UNIX/Linux/Mac OS " +#~ "X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Usage : ppdhtml [options] nom_fichier.drv >nom_fichier.html\n" +#~ " -D nom=valeur Définir la variable, dont le nom est précisé, sur " +#~ "la valeur indiquée.\n" +#~ "Options :\n" +#~ " -I inclure-rép Inclure le répertoire au chemin de recherche.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Usage : ppdi [options] nom_fichier.ppd [ … nom_fichierN.ppd ]\n" +#~ "Options :\n" +#~ " -I inclure-rép\n" +#~ " -o nom_fichier.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Usage : ppdmerge [options] nom_fichier.ppd [ … nom_fichierN.ppd ]\n" +#~ "Options :\n" +#~ " -o nom_fichier.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Usage : ppdpo [options] -o nom_fichier.po nom_fichier.drv [ … " +#~ "nom_fichierN.drv ]\n" +#~ "Options :\n" +#~ " -D nom=valeur Définir la variable, dont le nom est précisé, sur " +#~ "la valeur indiquée.\n" +#~ " -I inclure-rép Inclure le répertoire au chemin de recherche.\n" +#~ " -v Activer la verbosité (lettres V complémentaires pour " +#~ "augmenter la verbosité).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Usage : snmp [hôte-ou-adresse-ip]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: ajout limité aux %d premières imprimantes trouvées" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: valeur booléenne attendue pour l’option waiteof « %s »\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: échec de lecture de la requête de canal latéral.\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: l’option « %s » ne peut être incluse par le biais " +#~ "d’IncludeFeature.\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: l’imprimante ne répond pas.\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "" +#~ "WARNING: l’imprimante a envoyé le caractère EOF de manière inattendue\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l’hôte à distance n’a pas répondu au bout de %d secondes par un " +#~ "octet d’état de commande.\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l’hôte à distance n’a pas répondu au bout de %d secondes par un " +#~ "octet d’état de contrôle.\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l’hôte à distance n’a pas répondu au bout de %d secondes par un " +#~ "octet d’état de données.\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: la commande SCSI a expiré (%d) ; nouvel essai…\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: ce document n’est pas conforme aux normes Adobe (Adobe Document " +#~ "Structuring Conventions) et risque de ne pas s’imprimer correctement.\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: impossible d’ouvrir « %s :%s » : %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: impossible d’envoyer la requête d’état PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: paquet PAP inattendu, de type %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: paquet PAP inconnu, de type %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: choix « %s » inconnu pour l’option « %s ».\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: option « %s » inconnue.\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: débit en bauds %s non pris en charge.\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: nombre attendu pour l’option d’état « %s »\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: problème réversible : l’hôte du réseau « %s » est occupé ; nouvel " +#~ "essai dans %d secondes…\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "WARNING: aucun pilote d’impression pour Windows 2000 n’est installé." + +#~ msgid "You4 Envelope" +#~ msgstr "Enveloppe You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert : utilisez l’option -f pour préciser un fichier à convertir.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb : aucun fichier PPD pour l’imprimante « %s » - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl : connexion impossible au serveur : %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl : option « %s » inconnue\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl : option « -%c » inconnue\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "" +#~ "cupsd : nom de fichier de configuration attendu après l’option « -c ».\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd : impossible de déterminer le répertoire actif.\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd : argument « %s » inconnu - interruption en cours…\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd : option inconnue « %c » - interruption en cours…\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd : prise en charge de launchd(8) non compilée dans le code ; " +#~ "exécution en mode normal.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter : numéro de document %d non valide.\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter : identifiant %d de tâche non valide.\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter : un seul nom de fichier peut être spécifié.\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter : impossible de créer le fichier temporaire : %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter : impossible d’obtenir le fichier de tâche - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd : l’option -q est incompatible avec l’option -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd : l’option -v est incompatible avec l’option -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "périphérique pour %s/%s : %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "périphérique pour %s : %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\taccéder à l’aide relative aux commandes\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Attribut « job-printer-uri » manquant." + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin : le nom d’une classe doit se limiter aux caractères " +#~ "imprimables.\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin : fichier PPD attendu après l’option « -P ».\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin : paramètre allow/deny:liste_utilisateurs attendu après l’option " +#~ "« -u ».\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin : classe attendue après l’option « -r ».\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin : nom de classe attendu après l’option « -c ».\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin : description attendue après l’option « -D ».\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin : URI de périphérique attendu après l’option « -v ».\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "" +#~ "lpadmin : type ou types de fichier attendu(s) après l’option « -I ».\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin : nom d’hôte attendu après l’option « -h ».\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin : interface attendue après l’option « -i ».\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin : emplacement attendu après l’option « -L ».\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin : modèle attendu après l’option « -m ».\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin : nom=valeur attendu après l’option « -o ».\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin : imprimante attendue après l’option « -p ».\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin : nom d’imprimante attendu après l’option « -d ».\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin : imprimante ou classe attendue après l’option « -x ».\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin : aucun nom de membre détecté.\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin : l’imprimante %s est déjà un membre de la classe %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin : l’imprimante %s n’est pas un membre de la classe %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin : le nom de l’imprimante doit se limiter aux caractères " +#~ "imprimables.\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible d’ajouter d’imprimante à la classe :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin : connexion impossible au serveur : %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin : impossible de créer un fichier temporaire - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin : impossible de créer un fichier temporaire : %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin : impossible d’ouvrir le fichier PPD « %s » - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin : impossible d’ouvrir le fichier « %s » : %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de retirer une imprimante de la classe :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir le fichier PPD :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir l’URI du périphérique :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir le script ou le fichier PPD interface :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir le script interface :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir la description de l’imprimante :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir l’emplacement de l’imprimante :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin : impossible de définir les options de l’imprimante :\n" +#~ " Vous devez d’abord indiquer le nom d’une imprimante.\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin : option allow/deny « %s » inconnue.\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin : argument « %s » inconnu.\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin : option « %c » inconnue.\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin : avertissement - liste des types de contenu ignorée.\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo : chaîne de l’identifiant du périphérique 1284 attendue après « --" +#~ "id-périphérique ».\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo : langue attendue après « --language ».\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo : marque et modèle attendus après « --make-and-model »\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo : chaîne du produit attendue après « --product ».\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo : liste des schémas attendue après « --exclude-schemes ».\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo : liste des schémas attendue après « --include-schemes ».\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo : délai d’attente attendu après « --timeout ».\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo : argument « %s » inconnu.\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo : option « %c » inconnue.\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo : option « %s » inconnue.\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove : connexion impossible au serveur : %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove : argument « %s » inconnu.\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove : option « %c » inconnue.\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions : aucune imprimante !?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions : impossible d’ajouter d’imprimante ou d’instance : %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions : impossible d’obtenir le fichier PPD de %s : %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions : impossible d’ouvrir le fichier PPD de %s ».\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions : imprimante ou classe inconnue.\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "" +#~ "lppasswd : seul l’utilisateur « root » est en mesure d’ajouter ou de " +#~ "supprimer des mots de passe.\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd : fichier des mots de passe occupé.\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd : fichier des mots de passe non mis à jour.\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd : mot de passe non concordant.\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd : mot de passe rejeté.\n" +#~ "Votre mot de passe doit comporter au moins six caractères, au moins une " +#~ "lettre et un chiffre,\n" +#~ "et ne peut pas reprendre votre nom d’utilisateur.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd : les mots de passe ne concordent pas.\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd : impossible de copier la chaîne de mot de passe : %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd : impossible d’ouvrir le fichier des mots de passe : %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "" +#~ "lppasswd : impossible d’écrire dans le fichier des mots de passe : %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd : impossible d’effectuer de copie de sauvegarde de l’ancien " +#~ "fichier des mots de passe : %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "" +#~ "lppasswd : impossible de renommer le fichier des mots de passe : %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd : l’utilisateur « %s » et le groupe « %s » n’existent pas.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat : erreur - destination « %s » inexistante pour les noms de " +#~ "variables d’environnement %s.\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "membres de la classe %s :\n" + +#~ msgid "no entries\n" +#~ msgstr "aucune entrée\n" + +#~ msgid "no system default destination\n" +#~ msgstr "aucune destination système par défaut\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "Attribut « notify-events » non renseigné." + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "" +#~ "L’URI « %s », indiquée par le paramètre notify-recipient-uri, est déjà " +#~ "utilisée." + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "" +#~ "L’URI « %s » du paramètre « notify-recipient-uri » utilise un mode inconnu." + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d erroné." + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc : inclusion du répertoire « %s »…\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "" +#~ "ppdc : ajout/actualisation du texte de l’interface utilisateur à partir " +#~ "de %s…\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc : valeur booléenne (%s) incorrecte à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc : nom de résolution « %s » incorrect à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc : mot-clé d’état %s incorrect à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "" +#~ "ppdc : substitution de variables ($%c) incorrecte à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc : choix trouvé à la ligne %d sur %s, sans Option.\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc : #po en double pour la langue %s à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc : définition de filtre attendue à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc : nom de programme attendu à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc : valeur booléenne attendue à la ligne %d sur %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc : jeu de caractères attendu après Font à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc : code de choix attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc : nom/texte de choix attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : ordre de couleurs attendu pour ColorModel à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : espace de couleurs attendu pour ColorModel à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc : compression attendue pour ColorModel à la ligne %d de %s.\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : chaîne des contraintes attendue pour UIConstraints à la ligne %d " +#~ "de %s.\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc : mot-clé attendu du type de gestionnaire après DriverType à la " +#~ "ligne %d de %s.\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc : type de duplex attendu après Duplex à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc : encodage attendu après Font à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc : nom de fichier attendu après #po %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc : nom/texte de groupe attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc : nom de fichier d’inclusion attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc : nombre entier attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc : langue attendue après #po à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après FileName à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après Font à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après Manufacturer à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après MediaSize à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après ModelName à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc : nom attendu après PCFileName à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc : nom/texte attendu après %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc : nom/texte attendu après Installable à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc : nom/texte attendu après Resolution à la ligne %d de %s.\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : association nom/texte attendue pour ColorModel à la ligne %d de %" +#~ "s.\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc : nom/texte d’option attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc : section d’option attendue à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc : type d’option attendu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : champ de remplacement attendu après Resolution à la ligne %d de %" +#~ "s.\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc : nombre réel attendu à la ligne %d de %s.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc : résolution/type de papier attendu après ColorProfile à la ligne %d " +#~ "de %s.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc : résolution/type de papier attendu après SimpleColorProfile à la " +#~ "ligne %d de %s.\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc : sélecteur attendu après %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc : état attendu après Font à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc : chaîne attendue après Copyright à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc : chaîne attendue après Version à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc : deux noms d’option attendus à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc : valeur attendue après %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc : version attendue après Font à la ligne %d de %s.\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc : nom de fichier #include/#po « %s » non valide\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc : coût pour le filtre à la ligne %d de %s non valide\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc : type MIME pour le filtre à la ligne %d de %s non valide\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : nom de programme vide pour le filtre à la ligne %d de %s non " +#~ "valide\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc : section d’option « %s » à la ligne %d de %s non valide\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc : type d’option « %s » à la ligne %d de %s non valide\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "" +#~ "ppdc : chargement du fichier « %s » des informations de gestionnaire…\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc : chargement de messages pour la langue « %s »…\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc : chargement de messages de « %s »…\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc : #endif absent à la fin de « %s ».\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc : #if absent à la ligne %d de %s.\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc : aucun catalogue de messages fourni pour la langue %s.\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : option %s redéfinie sous un autre type à la ligne %d de %s.\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc : contrainte d’option doit inclure *nom à la ligne %d de %s.\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : instructions #if imbriquées trop nombreuses à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc : impossible de créer le fichier PPD « %s » - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc : impossible de créer le répertoire de sortie %s : %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc : impossible de créer les canaux de sortie : %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc : impossible d’exécuter cupstestppd : %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : impossible de retrouver le fichier #po %s à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : impossible de retrouver le fichier d’inclusion « %s » à la ligne %d " +#~ "de %s.\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc : impossible de déterminer la localisation de « %s » - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "" +#~ "ppdc : impossible de charger le fichier de localisation « %s » - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc : variable indéfinie (%s) à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc : type de gestionnaire %s inconnu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc : type de duplex « %s » inconnu à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc : taille du papier « %s » inconnue à la ligne %d de %s.\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc : jeton « %s » inconnu détecté à la ligne %d de %s.\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc : caractères de fin, dans le nombre réel « %s », inconnus à la ligne %" +#~ "d de %s.\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc : chaîne commençant par %c non terminée, à la ligne %d de %s.\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc : écriture de %s…\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc : écriture des fichiers PPD dans le répertoire « %s »…\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge : LanguageVersion « %s » incorrect dans %s.\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge : fichier PPD %s ignoré…\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "" +#~ "ppdmerge : impossible d’effectuer de copie de sauvegarde de %s en %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "l’imprimante %s est désactivée depuis %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "l’imprimante %s est inactive, mais activée depuis %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "l’imprimante %s est en cours d’impression %s-%d (activée depuis %s)\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "l’imprimante %s/%s est désactivée depuis %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "l’imprimante %s/%s est inactive, mais activée depuis %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "l’imprimante %s/%s est en cours d’impression %s-%d (activée depuis %s)\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "l’identifiant de la requête est %s-%d (%d fichier(s))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "le programmateur n’est pas en cours d’exécution\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "le programmateur s’exécute\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tafficher l’état du daemon et la file d’attente\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "destination système par défaut : %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "destination système par défaut : %s/%s\n" diff --git a/locale/cups_hu.po b/locale/cups_hu.po new file mode 100644 index 0000000..8f9a138 --- /dev/null +++ b/locale/cups_hu.po @@ -0,0 +1,5835 @@ +# Gabor Kelemen , 2011. +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2011-12-02 01:55+0100\n" +"Last-Translator: Gabor Kelemen \n" +"Language-Team: Hungarian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Generator: KBabel 1.11.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "\t\t(all)" +msgstr "\t\t(mind)" + +msgid "\t\t(none)" +msgstr "\t\t(egyik sem)" + +#, c-format +msgid "\t%d entries" +msgstr "\t%d bejegyzés" + +#, c-format +msgid "\t%s" +msgstr "\t%s" + +msgid "\tAfter fault: continue" +msgstr "\tHiba után: folytatás" + +#, c-format +msgid "\tAlerts: %s" +msgstr "\tRiasztások: %s" + +msgid "\tBanner required" +msgstr "\tKísérőoldal szükséges" + +msgid "\tCharset sets:" +msgstr "\tKarakterkódolások:" + +msgid "\tConnection: direct" +msgstr "\tKapcsolat: közvetlen" + +msgid "\tConnection: remote" +msgstr "\tKapcsolat: távoli" + +msgid "\tContent types: any" +msgstr "\tTartalomtípusok: bármely" + +msgid "\tDefault page size:" +msgstr "\tAlapértelmezett oldalméret:" + +msgid "\tDefault pitch:" +msgstr "\tAlapértelmezett térköz:" + +msgid "\tDefault port settings:" +msgstr "\tAlapértelmezett portbeállítások:" + +#, c-format +msgid "\tDescription: %s" +msgstr "\tLeírás: %s" + +msgid "\tForm mounted:" +msgstr "\tFelszerelt típus:" + +msgid "\tForms allowed:" +msgstr "\tEngedélyezett típusok:" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "\tFelület: %s.ppd" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "\tFelület: %s/interfaces/%s" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "\tFelület: %s/ppd/%s.ppd" + +#, c-format +msgid "\tLocation: %s" +msgstr "\tHely: %s" + +msgid "\tOn fault: no alert" +msgstr "\tHiba esetén: nincs riasztás" + +msgid "\tPrinter types: unknown" +msgstr "\tNyomtatótípusok: ismeretlen" + +#, c-format +msgid "\tStatus: %s" +msgstr "\tÁllapot: %s" + +msgid "\tUsers allowed:" +msgstr "\tEngedélyezett felhasználók:" + +msgid "\tUsers denied:" +msgstr "\tLetiltott felhasználók:" + +msgid "\tdaemon present" +msgstr "\ta démon jelen van" + +msgid "\tno entries" +msgstr "\tnincsenek bejegyzések" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "\ta nyomtató a(z) „%s” eszközön, sebesség -1" + +msgid "\tprinting is disabled" +msgstr "\ta nyomtatás letiltva" + +msgid "\tprinting is enabled" +msgstr "\ta nyomtatás engedélyezve" + +#, c-format +msgid "\tqueued for %s" +msgstr "\tsorba állítva ehhez: %s" + +msgid "\tqueuing is disabled" +msgstr "\ta sorba állítás letiltva" + +msgid "\tqueuing is enabled" +msgstr "\ta sorba állítás engedélyezve" + +msgid "\treason unknown" +msgstr "\tismeretlen ok" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" +"\n" +" MEGFELELŐSÉGI TESZT RÉSZLETES EREDMÉNYEI" + +msgid " Ignore specific warnings." +msgstr " Adott figyelmeztetések mellőzése." + +msgid " Issue warnings instead of errors." +msgstr " Figyelmeztetések kiadása hibák helyett." + +msgid " REF: Page 15, section 3.1." +msgstr " REF: 15. oldal, 3.1-es szakasz." + +msgid " REF: Page 15, section 3.2." +msgstr " REF: 15. oldal, 3.2-es szakasz." + +msgid " REF: Page 19, section 3.3." +msgstr " REF: 19. oldal, 3.3-as szakasz." + +msgid " REF: Page 20, section 3.4." +msgstr " REF: 20. oldal, 3.4-es szakasz." + +msgid " REF: Page 27, section 3.5." +msgstr " REF: 27. oldal, 3.5-ös szakasz." + +msgid " REF: Page 42, section 5.2." +msgstr " REF: 42. oldal, 5.2-es szakasz." + +msgid " REF: Pages 16-17, section 3.2." +msgstr " REF: 16-17. oldalak, 3.2-es szakasz." + +msgid " REF: Pages 42-45, section 5.2." +msgstr " REF: 42-45. oldalak, 5.2-es szakasz." + +msgid " REF: Pages 45-46, section 5.2." +msgstr " REF: 45-46. oldalak, 5.2-es szakasz." + +msgid " REF: Pages 48-49, section 5.2." +msgstr " REF: 48-49. oldalak, 5.2-es szakasz." + +msgid " REF: Pages 52-54, section 5.2." +msgstr " REF: 52-54. oldalak, 5.2-es szakasz." + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr " %-39.39s %.0f bájt" + +#, c-format +msgid " PASS Default%s" +msgstr " SIKER Default%s" + +msgid " PASS DefaultImageableArea" +msgstr " SIKER DefaultImageableArea" + +msgid " PASS DefaultPaperDimension" +msgstr " SIKER DefaultPaperDimension" + +msgid " PASS FileVersion" +msgstr " SIKER FileVersion" + +msgid " PASS FormatVersion" +msgstr " SIKER FormatVersion" + +msgid " PASS LanguageEncoding" +msgstr " SIKER LanguageEncoding" + +msgid " PASS LanguageVersion" +msgstr " SIKER LanguageVersion" + +msgid " PASS Manufacturer" +msgstr " SIKER Manufacturer" + +msgid " PASS ModelName" +msgstr " SIKER ModelName" + +msgid " PASS NickName" +msgstr " SIKER NickName" + +msgid " PASS PCFileName" +msgstr " SIKER PCFileName" + +msgid " PASS PSVersion" +msgstr " SIKER PSVersion" + +msgid " PASS PageRegion" +msgstr " SIKER PageRegion" + +msgid " PASS PageSize" +msgstr " SIKER PageSize" + +msgid " PASS Product" +msgstr " SIKER Product" + +msgid " PASS ShortNickName" +msgstr " SIKER ShortNickName" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr " FIGY nem tartoznak beállítások ehhez: %s." + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" +" FIGY %s közös előtagot használ ezzel: %s\n" +" REF: 15. oldal, 3.2-es szakasz." + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" +" FIGY A duplex beállítás %s kulcsszava lehet, hogy nem várt módon " +"működik, és Duplexnek kell nevezni.\n" +" REF: 122. oldal, 5.17-es szakasz" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr " FIGY A fájl CR, LF és CR LF sorvégek keverékét tartalmazza." + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" +" FIGY A PPD 4.3 specifikáció megköveteli a LanguageEncoding " +"jelenlétét.\n" +" REF: 56-57. oldalak, 5.3-as szakasz." + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr " FIGY A(z) %d. sor csak üres helyet tartalmaz." + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" +" FIGY A PPD 4.3 specifikáció megköveteli a Manufacturer " +"jelenlétét.\n" +" REF: 58-59. oldalak, 5.3-as szakasz." + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" +" FIGY A nem windowsos PPD fájlok csak LF, és nem CR LF végű " +"sorokat használhatnak." + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" +" FIGY Elavult PPD-verzió: %.1f.\n" +" REF: 42. oldal, 5.2-es szakasz." + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" FIGY A 8.3-nál hosszabb PCFileName megsérti a PPD-specifikációt.\n" +" REF: 61-62. oldalak, 5.3-as szakasz." + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" FIGY A PCFileName egyedi fájlnevet kell tartalmazzon.\n" +" REF: 61-62. oldalak, 5.3-as szakasz." + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" +" FIGY A Protocols PJL-t tartalmaz, de a JCL attribútumok nincsenek " +"beállítva.\n" +" REF: 78-79. oldal, 5.7-es szakasz." + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" +" FIGY A Protocols PJL-t és BCP-t is tartalmaz; a várt a TBCP.\n" +" REF: 78-79. oldalak, 5.7-es szakasz." + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" +" FIGY A PPD 4.3 specifikáció megköveteli a ShortNickName " +"jelenlétét.\n" +" REF: 64-65. oldalak, 5.3-as szakasz." + +msgid " cupsaddsmb [options] -a" +msgstr " cupsaddsmb [kapcsolók] -a" + +msgid " cupstestdsc [options] -" +msgstr " cupstestdsc [kapcsolók] -" + +msgid " program | cupstestppd [options] -" +msgstr " program | cupstestppd [kapcsolók] -" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" +" %s „%s %s” ütközik ezzel: „%s %s”\n" +" (megszorítás=„%s %s %s %s”)." + +#, c-format +msgid " %s %s %s does not exist." +msgstr " %s %s %s nem létezik." + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr " %s %s fájl „%s” kis- és nagybetűi hibásak." + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" +" %s Hibás %s lehetőség: %s.\n" +" REF: 122. oldal, 5.17-es szakasz." + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" +" %s Hibás UTF-8 „%s” fordítás a(z) %s beállítás %s lehetőségéhez." + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr " %s Hibás UTF-8 „%s” fordítás a(z) %s beállításhoz." + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr " %s Hibás cupsFilter érték: „%s”." + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr " %s Hibás cupsICCProfile: %s." + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr " %s Hibás cupsPreFilter érték: „%s”." + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr " %s Hibás cupsUIConstraints: %s: „%s”" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr " %s Hibás nyelv: „%s”." + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr " %s Hibás jogosultságok a(z) %s fájlok: „%s”." + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr " %s %s el van írva - %s kellene legyen." + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" +" %s Nem biztosítható egyszerre az APScanAppPath és APScanAppBundleID." + +#, c-format +msgid " %s Default choices conflicting." +msgstr " %s Az alapértelmezett választások ütköznek." + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr " %s Üres cupsUIConstraints: %s" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr " %s Hiányzó „%s” fordítás a(z) %s beállítás %s lehetőségéhez." + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr " %s Hiányzó „%s” fordítás a(z) %s beállításhoz." + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr " %s Hiányzó %s fájl: „%s”." + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" +" %s Hiányzó KÖTELEZŐ PageRegion beállítás.\n" +" REF: 100. oldal, 5.14-es szakasz." + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" +" %s Hiányzó KÖTELEZŐ PageSize beállítás.\n" +" REF: 99. oldal, 5.14-es szakasz." + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" +" %s Hiányzó lehetőség (*%s %s) az UIConstraints elemben: „*%s %s *%s %" +"s”." + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" +" %s Hiányzó lehetőség (*%s %s) a cupsUIConstraints %s elemben: „%s”" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr " %s Hiányzó cupsUIResolver %s" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" +" %s Hiányzó %s beállítás az UIConstraints elemben: „*%s %s *%s %s”." + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr " %s Hiányzó %s beállítás a cupsUIConstraints %s elemben: „%s”" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr " %s A fájl nem tartalmaz alap „%s” fordítást." + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" +" %s A KÖTELEZŐ %s nem definiálja a None lehetőséget.\n" +" REF: 122. oldal, 5.17-es szakasz." + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" +" %s A(z) „%s” méret definiálva van ehhez: %s de ehhez már nem: %s." + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr " %s A(z) „%s” méret váratlan kiterjedéssel rendelkezik (%gx%g)." + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr " %s „%s” méret el van írva - „%s” kellene legyen." + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" +" %s A(z) „%s” méretnek ennek a szabványos Adobe névnek kellene lennie: " +"„%s”." + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr " %s A cupsICCProfile (%s) hash értéke ütközik ezzel: %s." + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr " %s A cupsUIResolver (%s) ismétlődést okoz." + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" +" %s A cupsUIResolver (%s) nem sorol fel legalább két eltérő " +"beállítást." + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" +" **HIBA** A(z) %s lehetőségnevek: %s és %s csak a kis- és nagybetűkben " +"különböznek." + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" +" **HIBA** %s csak 1284DeviceID lehet\n" +" REF: 72. oldal, 5.5-ös szakasz" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" +" **HIBA** HIBÁS Default%s %s\n" +"\n" +" REF: 40. oldal, 4.5-ös szakasz." + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" +" **HIBA** HIBÁS DefaultImageableArea %s\n" +" REF: 102. oldal, 5.15-ös szakasz." + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" +" **HIBA** HIBÁS DefaultPaperDimension %s\n" +" REF: 103. oldal, 5.15-ös szakasz." + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" +" **HIBA** HIBÁS JobPatchFile attribútum a fájlban\n" +" REF: 24. oldal, 3.4-es szakasz." + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" +" **HIBA** HIBÁS Manufacturer („HP” kellene)\n" +" REF: 211. oldal, D.1 táblázat." + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" +" **HIBA** HIBÁS Manufacturer („Oki” kellene)\n" +" REF: 211. oldal, D.1 táblázat." + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" +" **HIBA** HIBÁS ModelName - „%c” nem engedélyezett a " +"karakterláncban.\n" +" REF: 59-60. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" +" **HIBA** HIBÁS PSVersion - nem „(string) int”.\n" +" REF: 62-64. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" +" **HIBA** HIBÁS Product - nem „(string)”.\n" +" REF: 62. oldal, 5.3-as szakasz." + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" +" **HIBA** HIBÁS ShortNickName - 31 karakternél hosszabb.\n" +" REF: 64-65. oldalak, 5.3-as szakasz." + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" +" **HIBA** Hibás %s választás: %s\n" +" REF: 84. oldal, 5.9-es szakasz" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" +" **HIBA** Hibás FileVersion: „%s”\n" +" REF: 56. oldal, 5.3-as szakasz." + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" +" **HIBA** Hibás FormatVersion: „%s”\n" +" REF: 56. oldal, 5.3-as szakasz." + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" +" **HIBA** Bad LanguageEncoding %s - ISOLatin1 kellene hogy legyen." + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr " **HIBA** Bad LanguageVersion %s - English kellene hogy legyen." + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr " **HIBA** Az alapértelmezett beállításkód nem értelmezhető: %s" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" +" **HIBA** Az alapértelmezett fordítás %s beállítás %s lehetőségéhez 8 " +"bites karaktereket tartalmaz." + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" +" **HIBA** Az alapértelmezett fordítás a(z) %s beállításhoz 8 bites " +"karaktereket tartalmaz." + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" +" **HIBA** A(z) %s és %s csoportnevek csak a kis- és nagybetűkben " +"különböznek." + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr " **HIBA** A(z) %s választásnév (%s) többször is előfordul." + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" +" **HIBA** A(z) %s és %s beállításnevek csak a kis- és nagybetűkben " +"különböznek." + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" +" **HIBA** KÖTELEZŐ a Default%s\n" +" REF: 40. oldal, 4.5-ös szakasz." + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" +" **HIBA** KÖTELEZŐ a DefaultImageableArea\n" +" REF: 102. oldal, 5.15-ös szakasz." + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" +" **HIBA** KÖTELEZŐ a DefaultPaperDimension\n" +" REF: 103. oldal, 5.15-ös szakasz." + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a FileVersion\n" +" REF: 56. oldal, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a FormatVersion\n" +" REF: 56. oldal, 5.3-as szakasz." + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" +" **HIBA** KÖTELEZŐ az ImageableArea ehhez: PageSize %s\n" +" REF: 41. oldal, 5. szakasz.\n" +" REF: 102. oldal, 5.15-ös szakasz." + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a LanguageEncoding\n" +" REF: 56-57. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a LanguageVersion\n" +" REF: 57-58. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a Manufacturer\n" +" REF: 58-59. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a ModelName\n" +" REF: 59-60. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a NickName\n" +" REF: 60. oldal, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a PCFileName\n" +" REF: 61-62. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a PSVersion\n" +" REF: 62-64. oldalak, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" +" **HIBA** KÖTELEZŐ a PageRegion\n" +" REF: 100. oldal, 5.14-es szakasz." + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" +" **HIBA** KÖTELEZŐ a PageSize\n" +" REF: 41. oldal, 5. szakasz.\n" +" REF: 99. oldal, 5.14-es szakasz." + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" +" **HIBA** KÖTELEZŐ a PageSize\n" +" REF: 99-100. oldalak, 5.14-es szakasz." + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" +" **HIBA** KÖTELEZŐ a PaperDimension ehhez: PageSize %s\n" +" REF: 41. oldal, 5. szakasz.\n" +" REF: 103. oldal, 5.15-ös szakasz." + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a Product\n" +" REF: 62. oldal, 5.3-as szakasz." + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" +" **HIBA** KÖTELEZŐ a ShortNickName\n" +" REF: 64-65. oldalak, 5.3-as szakasz." + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr " **HIBA** Nem nyitható meg a PPD-fájl - %s" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr " **HIBA** Nem nyitható meg a PPD-fájl - %s a(z) %d. sorban." + +#, c-format +msgid " %d ERRORS FOUND" +msgstr " %d HIBA TALÁLHATÓ" + +msgid " -h Show program usage" +msgstr " -h Használati utasítás megjelenítése" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" +" Hibás %%%%BoundingBox: a(z) %d. sorban.\n" +" REF: 39. oldal, %%%%BoundingBox:" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" +" Hibás %%%%Page: a(z) %d. sorban.\n" +" REF: 53. oldal, %%%%Page:" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" +" Hibás %%%%Pages: a(z) %d. sorban.\n" +" REF: 43. oldal, %%%%Pages:" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" +" A(z) %d. sor hosszabb 255 karakternél (%d).\n" +" REF: Page 25. oldal, sorhossz" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" +" Hiányzó %!PS-Adobe-3.0 az első sorban.\n" +" REF: 17. oldal, 3.1 Megfelelő dokumentumok" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" +" Hiányzó %%EndComments megjegyzés.\n" +" REF: 41. oldal, %%EndComments" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" +" Hiányzó vagy hibás %%BoundingBox: megjegyzés.\n" +" REF: 39. oldal, %%BoundingBox:" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" +" Hiányzó vagy hibás %%Page: megjegyzések.\n" +" REF: 53. oldal, %%Page:" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" +" Hiányzó vagy hibás %%Pages: megjegyzés.\n" +" REF: 43. oldal, %%Pages:" + +msgid " NO ERRORS FOUND" +msgstr " NEM TALÁLHATÓ HIBA" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr " %d sor meghaladta a 255 karaktert." + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr " Túl sok %%BeginDocument megjegyzés." + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr " Túl sok %%EndDocument megjegyzés." + +msgid " Warning: file contains binary data." +msgstr " Figyelmeztetés: a fájl bináris adatokat tartalmaz." + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr " Figyelmeztetés: nincs %%EndComments megjegyzés a fájlban." + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr " Figyelmeztetés: elavult DSC verzió (%.1f) a fájlban." + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr " --[no-]debug-logging Hibakeresési naplózás be/ki." + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr " --[no-]remote-admin Távoli adminisztráció be/ki." + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr " --[no-]remote-any Internetről való elérés be/ki." + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr " --[no-]remote-printers Távoli nyomtatók megjelenítése/elrejtése." + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr " --[no-]share-printers Nyomtatómegosztás be/ki." + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr " --[no-]user-cancel-any Felhasználói feladatmegszakítás be/ki." + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr " --cr Sorok zárása CR-rel (Mac OS 9)." + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr " --crlf Sorok zárása CR + LF-fel (Windows)." + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr " --lf Sorok zárása LF-fel (UNIX/Linux/Mac OS X)." + +msgid " -4 Connect using IPv4." +msgstr " -4 Csatlakozás IPv4 használatával." + +msgid " -6 Connect using IPv6." +msgstr " -6 Csatlakozás IPv6 használatával." + +msgid " -C Send requests using chunking (default)." +msgstr "" +" -C Kérések küldése darabolás használatával (alap)." + +msgid " -D Remove the input file when finished." +msgstr "" +" -D A bemeneti fájl eltávolítása a befejezés után." + +msgid " -D name=value Set named variable to value." +msgstr " -D név=érték A megnevezett változó beállítása az értékre." + +msgid " -E Enable encryption." +msgstr " -E Titkosítás engedélyezése." + +msgid " -E Encrypt the connection to the server." +msgstr " -E A kapcsolat titkosítása a kiszolgálóhoz." + +msgid " -E Test with TLS encryption." +msgstr " -E Tesztelés TLS titkosítással." + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" +" -F Futtatás az előtérben, de leválasztás a konzolról." + +msgid " -H samba-server Use the named SAMBA server." +msgstr " -H samba-kiszolgáló A megnevezett SAMBA kiszolgáló használata." + +msgid " -I Ignore errors." +msgstr " -I Hibák figyelmen kívül hagyása." + +msgid " -I include-dir Add include directory to search path." +msgstr "" +" -I include-kvt Az include könyvtár keresési útvonalhoz adása." + +msgid " -I {filename,filters,none,profiles}" +msgstr " -I {filename,filters,none,profiles}" + +msgid " -J title Set title." +msgstr " -J cím Cím beállítása." + +msgid " -L Send requests using content-length." +msgstr "" +" -L Kérések küldése a content-length használatával." + +msgid " -P filename.ppd Set PPD file." +msgstr " -P fájlnév.ppd PPD-fájl megadása." + +msgid " -R root-directory Set alternate root." +msgstr " -R root-könyvtár Alternatív root beállítása." + +msgid " -S Test with SSL encryption." +msgstr " -S Tesztelés SSL titkosítással." + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" +" -T A fogadási/küldési időkorlát beállítása " +"másodpercben." + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" +" -U samba-felh Hitelesítés a megnevezett SAMBA felhasználóként." + +msgid " -U username Set username for job." +msgstr " -U felhasználónév Felhasználónév beállítása a feladathoz." + +msgid " -U username Specify username." +msgstr " -U felhasználónév Felhasználónév megadása." + +msgid " -V version Set default IPP version." +msgstr " -V verzió Alapértelmezett IPP verzió beállítása." + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" +" -X XML plist előállítása egyszerű szöveg helyett." + +msgid " -a Export all printers." +msgstr " -a Minden nyomtató exportálása." + +msgid " -a 'name=value ...' Set option(s)." +msgstr " -a 'név=érték ...' Beállítások megadása." + +msgid " -c catalog.po Load the specified message catalog." +msgstr " -c katalógus.po A megadott üzenetkatalógus betöltése." + +msgid " -c config-file Load alternate configuration file." +msgstr " -c konfig-fájl Másik konfigurációs fájl betöltése." + +msgid " -c copies Set number of copies." +msgstr " -c másolatok Másolatok számának megadása." + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr " -c cupsd.conf Használandó cupsd.conf fájl megadása." + +msgid " -d name=value Set named variable to value." +msgstr " -d név=érték A megnevezett változó beállítása az értékre." + +msgid " -d output-dir Specify the output directory." +msgstr " -d kimeneti-kvt A kimeneti könyvtár megadása." + +msgid " -d printer Use the named printer." +msgstr " -d nyomtató A megnevezett nyomtató használata." + +msgid " -e Use every filter from the PPD file." +msgstr " -e Minden szűrő használata a PPD fájlból." + +msgid " -f Run in the foreground." +msgstr " -f Futtatás az előtérben." + +msgid " -f filename Set default request filename." +msgstr " -f fájlnév Alapértelmezett kérésfájlnév beállítása." + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" +" -f fájlnév Átalakítandó fájl megadása (egyébként stdin)." + +msgid " -h Show this usage message." +msgstr " -h Ezen súgó megjelenítése." + +msgid " -h cups-server Use the named CUPS server." +msgstr " -h cups-kiszolgáló A megnevezett CUPS kiszolgáló használata." + +msgid " -h server[:port] Specify server address." +msgstr " -h kiszolgáló[:port] Kiszolgáló címének megadása." + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" +" -i mime/type Bemeneti MIME-típus beállítása (egyébként " +"automatikus)." + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" +" -i másodperc Az utolsó fájl megismétlése a megadott időközzel." + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" +" -j job-id[,N] Az N. fájl kiszűrése a megadott feladatból " +"(alapértelmezett az 1.)." + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" +" -j mime/type Kimeneti MIME-típus beállítása (egyébként " +"application/pdf)." + +msgid " -l Run cupsd from launchd(8)." +msgstr "" +" -l A cupsd futtatása a launchd(8) használatával." + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr " -l nyelv[,nyelv,...] A kimeneti nyelvek (locale) megadása." + +msgid " -m Use the ModelName value as the filename." +msgstr " -m A ModelName érték használata fájlnévként." + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" +" -m mime/type Kimeneti MIME-típus beállítása (egyébként " +"application/pdf)." + +msgid " -n copies Set number of copies." +msgstr " -n másolatok Másolatok számának megadása." + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" +" -n szám Az utolsó fájl ismétlése a megadott alkalommal." + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" +" -o fájlnév Az előállítandó fájl beállítása (egyébként stdout)." + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" +" -o fájlnév.drv Illesztőprogram-információs fájl beállítása " +"(egyébként ppdi.drv)." + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr " -o fájlnév.ppd[.gz] Kimeneti fájl beállítása (egyébként stdout)." + +msgid " -o name=value Set option(s)." +msgstr " -o név=érték Beállítások megadása." + +msgid " -p filename.ppd Set PPD file." +msgstr " -p fájlnév.ppd PPD-fájl megadása." + +msgid " -q Be quiet - no output except errors." +msgstr " -q Csendes mód - nincs kimenet a hibákon kívül." + +msgid " -q Run silently." +msgstr " -q Csendes futás." + +msgid " -r Use 'relaxed' open mode." +msgstr " -r A „lazított” megnyitási mód használata." + +msgid " -t Produce a test report." +msgstr " -t Tesztjelentés előállítása." + +msgid " -t Test PPDs instead of generating them." +msgstr " -t PPD-k tesztelése az előállításuk helyett." + +msgid " -t Test the configuration file." +msgstr " -t A konfigurációs fájl tesztelése." + +msgid " -t title Set title." +msgstr " -t cím Cím beállítása." + +msgid " -u Remove the PPD file when finished." +msgstr " -u A PPD fájl eltávolítása befejezéskor." + +msgid " -v Be slightly verbose." +msgstr " -v Valamivel részletesebb kimenet." + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" +" -v Részletes mód (nagyobb részletesség = több v)." + +msgid " -v Be verbose (show commands)." +msgstr " -v Részletes mód (parancsok megjelenítése)." + +msgid " -v Show all attributes sent and received." +msgstr "" +" -v Minden elküldött és fogadott attribútum " +"megjelenítése." + +msgid " -vv Be very verbose." +msgstr " -vv Nagyon részletes mód." + +msgid " -z Compress PPD files using GNU zip." +msgstr "" +" -z PPD-fájlok tömörítése a GNU zip használatával." + +msgid " FAIL" +msgstr " HIBA" + +msgid " PASS" +msgstr " SIKER" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bájt" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bájt" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milliméter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f to %.0f x %.0f milliméter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f hüvelyk" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f to %.2f x %.2f hüvelyk" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "%s elfogadja a kéréseket ez óta: %s" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s nem módosítható." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "%s nincs megvalósítva az lpc CUPS verziója által." + +#, c-format +msgid "%s is not ready" +msgstr "%s nem áll készen" + +#, c-format +msgid "%s is ready" +msgstr "%s készen áll" + +#, c-format +msgid "%s is ready and printing" +msgstr "%s készen áll és nyomtat" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "%s feladatazonosító felhasználó cím példányok beállítások [fájl]" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "%s nem fogad el kéréseket ez óta: %s -" + +#, c-format +msgid "%s not supported." +msgstr "%s nem támogatott." + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "%s/%s elfogadja a kéréseket ez óta: %s" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "%s/%s nem fogadja el a kéréseket ez óta: %s -" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "%s: %-33.33s [%d. feladat localhost]" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "%s: %s" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "%s: %s sikertelen: %s" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "%s: Nem dönthető el, mi a teendő." + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "%s: Hiba - a(z) %s környezeti változó nem létező célt nevez meg: „%s”." + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "%s: Hiba - hibás feladatazonosító." + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" +"%s: Hiba - nem lehet egyszerre fájlokat nyomtatni és feladatokat " +"megváltoztatni." + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" +"%s: Hiba - nem lehet az stdin-ről nyomtatni, ha fájlok vagy feladatazonosító " +"van megadva." + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "%s: Hiba - a „-S” kapcsoló után karakterkészletnek kellene állnia." + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "%s: Hiba - a „-T” kapcsoló után tartalomtípusnak kellene állnia." + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "%s: Hiba - a „-#” kapcsoló után példányszámnak kellene állnia." + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "%s: Hiba - a „-n” kapcsoló után példányszámnak kellene állnia." + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "%s: Hiba - a „-P” kapcsoló után célnak kellene állnia." + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "%s: Hiba - a „-b” kapcsoló után célnak kellene állnia." + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "%s: Hiba - a „-d” kapcsoló után célnak kellene állnia." + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "%s: Hiba - a „-f” kapcsoló után típusnak kellene állnia." + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "%s: Hiba - a „-H” kapcsoló után tárolónévnek kellene állnia." + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "%s: Hiba - a „-H” kapcsoló után gépnévnek kellene állnia." + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "%s: Hiba - a „-h” kapcsoló után gépnévnek kellene állnia." + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "%s: Hiba - a „-y” kapcsoló után módlistának kellene állnia." + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "%s: Hiba - a „-%c” kapcsoló után névnek kellene állnia." + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" +"%s: Hiba - a „-o” kapcsoló után egy beállítás=érték párnak kellene állnia." + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "%s: Hiba - a „-P” kapcsoló után oldallistának kellene állnia." + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "%s: Hiba - a „-%c” kapcsoló után prioritásnak kellene állnia." + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" +"%s: Hiba - a „-r” kapcsoló után az okot megadó szövegnek kellene állnia." + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "%s: Hiba - a „-t” kapcsoló után címnek kellene állnia." + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "%s: Hiba - a „-U” kapcsoló után felhasználónévnek kellene állnia." + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "%s: Hiba - a „-U” kapcsoló után felhasználónévnek kellene állnia." + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "%s: Hiba - a „-%c” kapcsoló után értéknek kellene állnia." + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" +"%s: Hiba - a „-W” kapcsoló után a „completed”, „not-completed” vagy „all” " +"egyikének kellene állnia." + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "%s: Hiba - nem érhető el alapértelmezett cél." + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "%s: Hiba - a prioritásnak 1 és 100 között kell lennie." + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "%s: Hiba - az ütemező nem válaszol." + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "%s: Hiba - túl sok fájl - „%s”." + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "%s: Hiba - „%s” nem érhető el - %s" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "%s: Hiba - nem lehet sorba állítani az stdin-ről - %s." + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "%s: Hiba - ismeretlen cél: - „%s”." + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "%s: Hiba - ismeretlen cél: „%s/%s”." + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "%s: Hiba - ismeretlen kapcsoló: „%c”." + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "%s: Hiba - ismeretlen kapcsoló: „%s”." + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "%s: Feladatazonosítónak kellene állnia a „-i” kapcsoló után." + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "%s: Érvénytelen célnév a listában: „%s”." + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "%s: Érvénytelen szűrőkarakterlánc: „%s”." + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "%s: Feladatazonosító („-i jobid”) szükséges a „-H restart” előtt." + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "%s: Nincs szűrő %s/%s átalakításához erre: %s/%s." + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "%s: A művelet sikertelen: %s" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "%s: Elnézést, a titkosítás nem támogatott." + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "%s: Nem lehet a kiszolgálóhoz kapcsolódni." + +#, c-format +msgid "%s: Unable to contact server." +msgstr "%s: Nem lehet elérni a kiszolgálót." + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "%s: Nem határozható meg a(z) „%s” MIME-típusa." + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "%s: A(z) %s nem nyitható meg: %s" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "%s: Nem nyitható meg a(z) %s PPD-fájl a(z) %d. sorban." + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "%s: Nem olvasható a MIME-adatbázis innen: „%s” vagy innen: „%s”." + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "%s: Ismeretlen cél: „%s”." + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "%s: Ismeretlen cél MIME-típus: %s/%s." + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "%s: Ismeretlen kapcsoló: „%c”." + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "%s: Ismeretlen forrás MIME-típus: %s/%s." + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" +"%s: Figyelmeztetés - a(z) „%c” formátummódosító nem támogatott - a kimenet " +"nem feltétlenül lesz helyes." + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "%s: Figyelmeztetés - a karakterkészlet kapcsoló mellőzve." + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "%s: Figyelmeztetés - a tartalomtípus kapcsoló mellőzve." + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "%s: Figyelmeztetés - a típus kapcsoló mellőzve." + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "%s: Figyelmeztetés - a mód kapcsoló mellőzve." + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 hüvelyk/mp." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 hüvelyk/mp." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 hüvelyk/mp." + +msgid "10 x 11" +msgstr "10 x 11" + +msgid "10 x 13" +msgstr "10 x 13" + +msgid "10 x 14" +msgstr "10 x 14" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/mp." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 hüvelyk/mp." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 hüvelyk/mp." + +msgid "12 x 11" +msgstr "12 x 11" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/mp." + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/mp." + +msgid "15 x 11" +msgstr "15 x 11" + +msgid "150 mm/sec." +msgstr "150 mm/mp." + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 hüvelyk/mp." + +msgid "2-Sided Printing" +msgstr "2 oldalas nyomtatás" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 hüvelyk/mp." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/mp." + +msgid "200 mm/sec." +msgstr "200 mm/mp." + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24 tűs sorozat" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/mp." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 hüvelyk/mp." + +msgid "3 x 5" +msgstr "3 x 5" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "3,5 x 5" + +msgid "3.5\" Disk" +msgstr "3,5\"-es lemez" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5\"-es lemez - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/mp." + +msgid "300 mm/sec." +msgstr "300 mm/mp." + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 hüvelyk/mp." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/mp." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 hüvelyk/mp." + +msgid "5 x 7" +msgstr "5 x 7" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 hüvelyk/mp." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/mp." + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "60x72dpi" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 hüvelyk/mp." + +msgid "7 x 9" +msgstr "7 x 9" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 hüvelyk/mp." + +msgid "8 x 10" +msgstr "8 x 10" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/mp." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 hüvelyk/mp." + +msgid "9 x 11" +msgstr "9 x 11" + +msgid "9 x 12" +msgstr "9 x 12" + +msgid "9-Pin Series" +msgstr "9 tűs sorozatok" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "?Az érvénytelen súgóparancs ismeretlen." + +msgid "A Samba password is required to export printer drivers" +msgstr "A nyomtató-illesztőprogramok exportálásához Samba jelszó szükséges" + +msgid "A Samba username is required to export printer drivers" +msgstr "" +"A nyomtató-illesztőprogramok exportálásához Samba felhasználónév szükséges" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "Már létezik „%s” nevű osztály." + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "Már létezik „%s” nevű nyomtató." + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "A0 hosszú élű" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "A1 hosszú élű" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "A2 hosszú élű" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "A3 hosszú élű" + +msgid "A3 Oversize" +msgstr "A3 túlméretes" + +msgid "A3 Oversize Long Edge" +msgstr "A3 túlméretes hosszú élű" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "A4 hosszú élű" + +msgid "A4 Oversize" +msgstr "A4 túlméretes" + +msgid "A4 Small" +msgstr "A4 kicsi" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "A5 hosszú élű" + +msgid "A5 Oversize" +msgstr "A5 túlméretes" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "A6 hosszú élű" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "ARCH C hosszú élű" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "ARCH D hosszú élű" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "ARCH E hosszú élű" + +msgid "Accept Jobs" +msgstr "Feladatok elfogadása" + +msgid "Accepted" +msgstr "Elfogadva" + +msgid "Add Class" +msgstr "Osztály hozzáadása" + +msgid "Add Printer" +msgstr "Nyomtató hozzáadása" + +msgid "Add RSS Subscription" +msgstr "RSS-feliratkozás hozzáadása" + +msgid "Address" +msgstr "Cím" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Cím - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Adminisztráció" + +msgid "Always" +msgstr "Mindig" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Felhordó" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "Kísérlet %s nyomtatóállapot hibás értékre (%d) állítására." + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "Az attribútumcsoportok nincsenek sorrendben (%x < %x)." + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "B5 túlméretes" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Hibás NULL célmutató" + +msgid "Bad OpenGroup" +msgstr "Hibás OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Hibás OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Hibás OrderDependency" + +msgid "Bad PPD cache file." +msgstr "Hibás PPD-gyorsítótárfájl." + +msgid "Bad Request" +msgstr "Hibás kérés" + +msgid "Bad SNMP version number" +msgstr "Hibás SNMP verziószám" + +msgid "Bad UIConstraints" +msgstr "Hibás UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "Hibás karakterkészletfájl: „%s”." + +#, c-format +msgid "Bad charset type: %s" +msgstr "Hibás karakterkészlet-típus: %s" + +#, c-format +msgid "Bad columns value %d." +msgstr "Hibás oszlopérték: %d." + +#, c-format +msgid "Bad copies value %d." +msgstr "Hibás példányérték: %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "Hibás cpi érték: %f." + +msgid "Bad custom parameter" +msgstr "Hibás egyéni paraméter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "Hibás device-uri: „%s”." + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "Hibás device-uri séma: „%s”." + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "Hibás document-format érték: „%s”." + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "Hibás document-format-default érték: „%s”." + +msgid "Bad filename buffer" +msgstr "Hibás fájlnévpuffer" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "Hibás betűkészletleíró sor: „%s”." + +#, c-format +msgid "Bad font description line: %s" +msgstr "Hibás betűkészlet-leíró sor: %s." + +msgid "Bad job-priority value." +msgstr "Hibás job-priority érték." + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "Hibás job-sheets érték: „%s”." + +msgid "Bad job-sheets value type." +msgstr "Hibás job-sheets értéktípus." + +msgid "Bad job-state value." +msgstr "Hibás job-state érték." + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "Hibás job-uri érték: „%s”." + +#, c-format +msgid "Bad lpi value %f." +msgstr "Hibás lpi érték: %f." + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "Hibás notify-pull-method érték: „%s”." + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "Hibás notify-recipient-uri érték: „%s”." + +#, c-format +msgid "Bad number-up value %d." +msgstr "Bad number-up érték: „%d”" + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "Hibás beállítás + érték a(z) %d. sorban." + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Hibás page-ranges értékek: %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "Hibás port-monitor: „%s”." + +#, c-format +msgid "Bad printer-state value %d." +msgstr "Hibás printer-state érték: %d." + +#, c-format +msgid "Bad request ID %d." +msgstr "Hibás kérésazonosító: %d." + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "Hibás kérésverziószám: %d.%d." + +msgid "Bad subscription ID" +msgstr "Hibás feliratkozásazonosító" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "Hibás szövegirány: „%s”." + +#, c-format +msgid "Bad text direction: %s" +msgstr "Hibás szövegirány: %s." + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "Hibás szövegszélesség: „%s”." + +#, c-format +msgid "Bad text width: %s" +msgstr "Hibás szövegszélesség: %s." + +msgid "Bad value string" +msgstr "Hibás értékkarakterlánc" + +msgid "Banners" +msgstr "Kísérőoldalak" + +msgid "Billing Information: " +msgstr "Számlázási adatok: " + +msgid "Bond Paper" +msgstr "Kötött papír" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "A várt érték logikai a waiteof „%s” beállításához." + +msgid "Buffer overflow detected, aborting." +msgstr "Puffertúlcsordulás észlelve, megszakítás." + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL címkenyomtató" + +msgid "Cancel RSS Subscription" +msgstr "RSS-feliratkozás törlése" + +msgid "Canceling print job." +msgstr "Nyomtatási feladat megszakítása." + +msgid "Cannot share a remote Kerberized printer." +msgstr "Nem osztható meg távoli Kerberos-nyomtató." + +msgid "Cassette" +msgstr "Kazetta" + +msgid "Change Settings" +msgstr "Beállítások módosítása" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "A(z) „%s” karakterkészlet nem támogatott." + +msgid "Classes" +msgstr "Osztályok" + +msgid "Clean Print Heads" +msgstr "Nyomtatófejek tisztítása" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "A Close-Job nem támogatja a job-uri attribútumot." + +msgid "Color" +msgstr "Szín" + +msgid "Color Mode" +msgstr "Színmód" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" +"A parancsok rövidíthetők. A parancsok:\n" +"\n" +"exit help quit status ?" + +msgid "Community name uses indefinite length" +msgstr "A közösségnév végtelen hosszat használ" + +msgid "Connected to printer." +msgstr "Kapcsolódva a nyomtatóhoz." + +msgid "Connecting to printer." +msgstr "Kapcsolódás a nyomtatóhoz." + +msgid "Continue" +msgstr "Folytatás" + +msgid "Continuous" +msgstr "Folyamatos" + +msgid "Control file sent successfully." +msgstr "Vezérlőfájl sikeresen elküldve." + +msgid "Copying print data." +msgstr "Nyomtatási adatok másolása." + +msgid "Created" +msgstr "Létrehozva" + +msgid "Created On: " +msgstr "Létrehozva: " + +msgid "Custom" +msgstr "Egyéni" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Kivágás" + +msgid "Cutter" +msgstr "Vágó" + +msgid "Dark" +msgstr "Sötét" + +msgid "Darkness" +msgstr "Sötétség" + +msgid "Data file sent successfully." +msgstr "Az adatfájl sikeresen elküldve." + +msgid "Delete Class" +msgstr "Osztály törlése" + +msgid "Delete Printer" +msgstr "Nyomtató törlése" + +msgid "Description: " +msgstr "Leírás: " + +msgid "DeskJet Series" +msgstr "DeskJet sorozat" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "A(z) „%s” cél nem fogad el feladatokat." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" +"Eszköz: uri = %s\n" +" osztály = %s\n" +" info = %s\n" +" gyártó és modell = %s\n" +" eszközazonosító = %s\n" +" hely = %s" + +msgid "Direct Thermal Media" +msgstr "Direkt termál címke" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "A(z) „%s” könyvtár relatív útvonalat tartalmaz." + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" +"A(z) „%s” könyvtár jogosultságai nem biztonságosak (0%o/uid=%d/gid=%d)." + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "A(z) „%s” könyvtár nem fájl." + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "A(z) „%s” könyvtár nem érhető el: %s" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "A(z) „%s” könyvtár jogosultságai megfelelők (0%o/uid=%d/gid=%d)." + +msgid "Disabled" +msgstr "Kikapcsolva" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "A(z) %d. dokumentum nem létezik a(z) %d. feladatban." + +msgid "Driver Name: " +msgstr "Illesztőprogram neve: " + +msgid "Driver Version: " +msgstr "Illesztőprogram verziója: " + +msgid "Duplexer" +msgstr "Duplexáló" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 címkenyomtató" + +msgid "EPL2 Label Printer" +msgstr "EPL2 címkenyomtató" + +msgid "Edit Configuration File" +msgstr "Konfigurációs fájl szerkesztése" + +msgid "Empty PPD file." +msgstr "Üres PPD-fájl." + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Záró kísérőoldal" + +msgid "English" +msgstr "Angol" + +msgid "Enter old password:" +msgstr "Adja meg a régi jelszót:" + +msgid "Enter password again:" +msgstr "Adja meg újra a jelszót:" + +msgid "Enter password:" +msgstr "Adja meg a jelszót:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Adja meg felhasználónevét és jelszavát, vagy a root felhasználó nevét és " +"jelszavát az oldal eléréséhez. Ha Kerberos hitelesítést használ, akkor " +"győződjön meg róla, hogy rendelkezik érvényes Kerberos jeggyel." + +msgid "Envelope #10 " +msgstr "Boríték #10 " + +msgid "Envelope #11" +msgstr "Boríték #11" + +msgid "Envelope #12" +msgstr "Boríték #12" + +msgid "Envelope #14" +msgstr "Boríték #14" + +msgid "Envelope #9" +msgstr "Boríték #9" + +msgid "Envelope B4" +msgstr "B4 boríték" + +msgid "Envelope B5" +msgstr "B5 boríték" + +msgid "Envelope B6" +msgstr "B6 boríték" + +msgid "Envelope C0" +msgstr "C0 boríték" + +msgid "Envelope C1" +msgstr "C1 boríték" + +msgid "Envelope C2" +msgstr "C2 boríték" + +msgid "Envelope C3" +msgstr "C3 boríték" + +msgid "Envelope C4" +msgstr "C4 boríték" + +msgid "Envelope C5" +msgstr "C5 boríték" + +msgid "Envelope C6" +msgstr "C6 boríték" + +msgid "Envelope C65" +msgstr "C65 boríték" + +msgid "Envelope C7" +msgstr "C7 boríték" + +msgid "Envelope Choukei 3" +msgstr "Choukei boríték 3" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "Choukei boríték 3, hosszú élű" + +msgid "Envelope Choukei 4" +msgstr "Choukei boríték 4" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "Choukei boríték 4, hosszú élű" + +msgid "Envelope DL" +msgstr "DL boríték" + +msgid "Envelope Feed" +msgstr "Borítékadagoló" + +msgid "Envelope Invite" +msgstr "Meghívóboríték" + +msgid "Envelope Italian" +msgstr "Olasz boríték" + +msgid "Envelope Kaku2" +msgstr "Kaku2 boríték" + +msgid "Envelope Kaku2 Long Edge" +msgstr "Kaku2 hosszú élű boríték" + +msgid "Envelope Kaku3" +msgstr "Kaku3 boríték" + +msgid "Envelope Kaku3 Long Edge" +msgstr "Kaku3 hosszú élű boríték" + +msgid "Envelope Monarch" +msgstr "Monarch boríték" + +msgid "Envelope PRC1 " +msgstr "PRC1 boríték" + +msgid "Envelope PRC1 Long Edge" +msgstr "PRC1 hosszú élű boríték" + +msgid "Envelope PRC10" +msgstr "PRC10 boríték" + +msgid "Envelope PRC10 Long Edge" +msgstr "PRC10 hosszú élű boríték" + +msgid "Envelope PRC2" +msgstr "PRC2 boríték" + +msgid "Envelope PRC2 Long Edge" +msgstr "PRC2 hosszú élű boríték" + +msgid "Envelope PRC3" +msgstr "PRC3 boríték" + +msgid "Envelope PRC3 Long Edge" +msgstr "PRC3 hosszú élű boríték" + +msgid "Envelope PRC4" +msgstr "PRC4 boríték" + +msgid "Envelope PRC4 Long Edge" +msgstr "PRC4 hosszú élű boríték" + +msgid "Envelope PRC5 Long Edge" +msgstr "PRC5 hosszú élű boríték" + +msgid "Envelope PRC5PRC5" +msgstr "PRC5PRC5 boríték" + +msgid "Envelope PRC6" +msgstr "PRC6 boríték" + +msgid "Envelope PRC6 Long Edge" +msgstr "PRC6 hosszú élű boríték" + +msgid "Envelope PRC7" +msgstr "PRC7 boríték" + +msgid "Envelope PRC7 Long Edge" +msgstr "PRC7 hosszú élű boríték" + +msgid "Envelope PRC8" +msgstr "PRC8 boríték" + +msgid "Envelope PRC8 Long Edge" +msgstr "PRC8 hosszú élű boríték" + +msgid "Envelope PRC9" +msgstr "PRC9 boríték" + +msgid "Envelope PRC9 Long Edge" +msgstr "PRC9 hosszú élű boríték" + +msgid "Envelope Personal" +msgstr "Személyes boríték" + +msgid "Envelope You4" +msgstr "You4 boríték" + +msgid "Envelope You4 Long Edge" +msgstr "You4 hosszú élű boríték" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Hibaházirend" + +msgid "Error sending raster data." +msgstr "Hiba a raszteradatok küldésekor." + +msgid "Error: need hostname after \"-h\" option." +msgstr "Hiba: a „-h” kapcsoló után gépnév szükséges." + +msgid "Every 10 Labels" +msgstr "10 címkénként" + +msgid "Every 2 Labels" +msgstr "2 címkénként" + +msgid "Every 3 Labels" +msgstr "3 címkénként" + +msgid "Every 4 Labels" +msgstr "4 címkénként" + +msgid "Every 5 Labels" +msgstr "5 címkénként" + +msgid "Every 6 Labels" +msgstr "6 címkénként" + +msgid "Every 7 Labels" +msgstr "7 címkénként" + +msgid "Every 8 Labels" +msgstr "8 címkénként" + +msgid "Every 9 Labels" +msgstr "9 címkénként" + +msgid "Every Label" +msgstr "Címkénként" + +msgid "Executive" +msgstr "Exekutív" + +msgid "Expectation Failed" +msgstr "A várakozás meghiúsult" + +msgid "Export Printers to Samba" +msgstr "Nyomtatók exportálása Samba rendszerbe" + +msgid "FAIL" +msgstr "HIBA" + +msgid "FanFold German" +msgstr "Német leporelló" + +msgid "FanFold Legal German" +msgstr "Legal német leporelló" + +msgid "Fanfold US" +msgstr "US leporelló" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "A(z) „%s” fájl relatív útvonalat tartalmaz." + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "A(z) „%s” fájl jogosultságai nem biztonságosak (0%o/uid=%d/gid=%d)." + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "A(z) „%s” fájl egy könyvtár." + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "A(z) „%s” fájl nem érhető el: %s" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "A(z) „%s” fájl jogosultságai megfelelők (0%o/uid=%d/gid=%d)." + +msgid "File Folder" +msgstr "Iratmappa" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Fájlmappa - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" +"A fájl eszközök URI-címei le lettek tiltva. Az engedélyezéshez lásd a " +"FileDevice direktívát a(z) „%s/cupsd.conf” fájlban." + +#, c-format +msgid "Finished page %d." +msgstr "%d. oldal befejezve." + +msgid "Folio" +msgstr "Ívlap" + +msgid "Forbidden" +msgstr "Tiltott" + +#, c-format +msgid "Formatting page %d." +msgstr "%d. oldal formázása" + +msgid "General" +msgstr "Általános" + +msgid "Generic" +msgstr "Általános" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "A Get-Response-PDU végtelen hosszot használ" + +msgid "Glossy Paper" +msgstr "Fényes papír" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "A kapott printer-uri attribútumhoz nincs job-id." + +msgid "Grayscale" +msgstr "Szürkeárnyalat" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Lógó mappa" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Lógó mappa - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "ISOLatin1" + +msgid "Illegal control character" +msgstr "Érvénytelen vezérlőkarakter" + +msgid "Illegal main keyword string" +msgstr "Érvénytelen főkulcsszó-karakterlánc" + +msgid "Illegal option keyword string" +msgstr "Érvénytelen kapcsolókulcsszó-karakterlánc" + +msgid "Illegal translation string" +msgstr "Érvénytelen fordítás" + +msgid "Illegal whitespace character" +msgstr "Érvénytelen üres hely karakter" + +msgid "Installable Options" +msgstr "Telepíthető beállítások" + +msgid "Installed" +msgstr "Telepítve" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar címkenyomtató" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "Belső kiszolgálóhiba" + +msgid "Internal error" +msgstr "Belső hiba" + +msgid "Internet Postage 2-Part" +msgstr "Kétrészes internetes postai" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Kétrészes internetes postai - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Háromrészes internetes postai" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Háromrészes internetes postai - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet nyomtatási protokoll" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "JIS B0" + +msgid "JIS B1" +msgstr "JIS B1" + +msgid "JIS B10" +msgstr "JIS B10" + +msgid "JIS B2" +msgstr "JIS B2" + +msgid "JIS B3" +msgstr "JIS B3" + +msgid "JIS B4" +msgstr "JIS B4" + +msgid "JIS B4 Long Edge" +msgstr "JIS B4 hosszú élű" + +msgid "JIS B5" +msgstr "JIS B5" + +msgid "JIS B5 Long Edge" +msgstr "JIS B5 hosszú élű" + +msgid "JIS B6" +msgstr "JIS B6" + +msgid "JIS B6 Long Edge" +msgstr "JIS B6 hosszú élű" + +msgid "JIS B7" +msgstr "JIS B7" + +msgid "JIS B8" +msgstr "JIS B8" + +msgid "JIS B9" +msgstr "JIS B9" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "A(z) %d. feladat nem indítható újra - nincsenek fájlok." + +#, c-format +msgid "Job #%d does not exist." +msgstr "A(z) %d. feladat nem létezik." + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "A(z) %d. feladat már félbe van szakítva - nem szakítható meg." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "A(z) %d. feladat már meg van szakítva - nem szakítható meg." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "A(z) %d. feladat már kész van - nem szakítható meg." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "A(z) %d. feladat befejeződött, és nem módosítható." + +#, c-format +msgid "Job #%d is not complete." +msgstr "A(z) %d. feladat nincs kész." + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "A(z) %d. feladat nincs hitelesítésre visszatartva." + +#, c-format +msgid "Job #%d is not held." +msgstr "A(z) %d. feladat nincs visszatartva." + +msgid "Job Completed" +msgstr "Feladat befejeződött" + +msgid "Job Created" +msgstr "Feladat létrehozva" + +msgid "Job ID: " +msgstr "Feladatazonosító: " + +msgid "Job Options Changed" +msgstr "Feladat beállításai módosítva" + +msgid "Job Stopped" +msgstr "Feladat leállítva" + +msgid "Job UUID: " +msgstr "Feladat UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "A feladat befejeződött, és nem módosítható." + +msgid "Job operation failed:" +msgstr "A feladatművelet sikertelen:" + +msgid "Job state cannot be changed." +msgstr "A feladat állapota nem módosítható." + +msgid "Job subscriptions cannot be renewed." +msgstr "A feladatfeliratkozások nem újíthatók meg." + +msgid "Jobs" +msgstr "Feladatok" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR kiszolgáló vagy nyomtató" + +msgid "Label Printer" +msgstr "Címkenyomtató" + +msgid "Label Top" +msgstr "Címke teteje" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "A(z) „%s” nyelv nem támogatott." + +msgid "Large Address" +msgstr "Nagy cím" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Nagy cím - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet sorozat PCL 4/5" + +msgid "Letter Oversize" +msgstr "Letter túlméretes" + +msgid "Letter Oversize Long Edge" +msgstr "Letter túlméretes hosszú élű" + +msgid "Light" +msgstr "Gyenge" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "A sor hosszabb a maximálisan engedélyezettnél (255 karakter)" + +msgid "List Available Printers" +msgstr "Elérhető nyomtatók felsorolása" + +msgid "Loading print file." +msgstr "Nyomtatandó fájl betöltése." + +msgid "Location: " +msgstr "Hely: " + +msgid "Long-Edge (Portrait)" +msgstr "Hosszú élű (álló)" + +msgid "Looking for printer." +msgstr "Nyomtató keresése." + +msgid "Make and Model: " +msgstr "Gyártó és modell: " + +msgid "Manual Feed" +msgstr "Kézi adagolás" + +msgid "Media Dimensions: " +msgstr "Média méretei: " + +msgid "Media Limits: " +msgstr "Média korlátai: " + +msgid "Media Name: " +msgstr "Média neve: " + +msgid "Media Size" +msgstr "Média mérete" + +msgid "Media Source" +msgstr "Média forrása" + +msgid "Media Tracking" +msgstr "Média követése" + +msgid "Media Type" +msgstr "Média típusa" + +msgid "Medium" +msgstr "Médium" + +msgid "Memory allocation error" +msgstr "Memóriafoglalási hiba" + +msgid "Missing CloseGroup" +msgstr "Hiányzó CloseGroup" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Hiányzó PPD-Adobe-4.x fejléc" + +msgid "Missing asterisk in column 1" +msgstr "Hiányzó csillag az 1. oszlopban" + +msgid "Missing document-number attribute." +msgstr "Hiányzó document-number attribútum." + +#, c-format +msgid "Missing double quote on line %d." +msgstr "Hiányzó dupla idézőjel a(z) %d. sorban." + +msgid "Missing form variable" +msgstr "Hiányzó típusváltozó" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "Hiányzó média vagy media-col." + +msgid "Missing media-size in media-col." +msgstr "Hiányzó media-size a media-col elemben." + +msgid "Missing notify-subscription-ids attribute." +msgstr "Hiányzó notify-subscription-ids attribútum." + +msgid "Missing option keyword" +msgstr "Hiányzó kapcsolókulcsszó" + +msgid "Missing requesting-user-name attribute." +msgstr "Hiányzó requesting-user-name attribútum." + +msgid "Missing required attributes." +msgstr "Hiányzó kötelező attribútumok." + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "Hiányzó érték a kísérőoldalfájl %d. sorában." + +#, c-format +msgid "Missing value on line %d." +msgstr "Hiányzó érték a(z) %d. sorban." + +msgid "Missing value string" +msgstr "Hiányzó értékkarakterlánc" + +msgid "Missing x-dimension in media-size." +msgstr "Hiányzó x-dimension a media-size elemben." + +msgid "Missing y-dimension in media-size." +msgstr "Hiányzó y-dimension a media-size elemben." + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" +"Modell: név = %s\n" +" természetes nyelv = %s\n" +" gyártó és típus = %s\n" +" eszközazonosító = %s" + +msgid "Modify Class" +msgstr "Osztály módosítása" + +msgid "Modify Printer" +msgstr "Nyomtató módosítása" + +msgid "Move All Jobs" +msgstr "Minden feladat áthelyezése" + +msgid "Move Job" +msgstr "Feladat áthelyezése" + +msgid "Moved Permanently" +msgstr "Tartósan áthelyezve" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD-fájl mutató" + +msgid "Name OID uses indefinite length" +msgstr "Név OID végtelen hosszt használ" + +msgid "Nested classes are not allowed." +msgstr "A beágyazott osztályok nem engedélyezettek." + +msgid "Never" +msgstr "Soha" + +msgid "New Stylus Color Series" +msgstr "New Stylus Color sorozat" + +msgid "New Stylus Photo Series" +msgstr "New Stylus Photo sorozat" + +msgid "No" +msgstr "Nem" + +msgid "No Content" +msgstr "Nincs tartalom" + +msgid "No PPD name" +msgstr "Nincs PPD-név" + +msgid "No VarBind SEQUENCE" +msgstr "Nincs VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "Nincsenek telepítve windowsos nyomtató-illesztőprogramok." + +msgid "No active connection" +msgstr "Nincs aktív kapcsolat" + +#, c-format +msgid "No active jobs on %s." +msgstr "Nincsenek aktív feladatok ezen: %s." + +msgid "No attributes in request." +msgstr "Nincsenek attribútumok a kérésben." + +msgid "No authentication information provided." +msgstr "Nem adott meg hitelesítési információkat." + +msgid "No community name" +msgstr "Nincs közösségnév" + +msgid "No default printer." +msgstr "Nincs alapértelmezett nyomtató." + +msgid "No destinations added." +msgstr "Nem lett cél hozzáadva." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" +"Nem található az eszköz URI azonosítója az argv[0] változóban vagy a " +"DEVICE_URI környezeti változóban." + +msgid "No error-index" +msgstr "Nincs error-index" + +msgid "No error-status" +msgstr "Nincs error-status" + +msgid "No file in print request." +msgstr "Nincs fájl a nyomtatási kérésben." + +msgid "No fonts in charset file." +msgstr "Nincsenek betűk a karakterkészlet-fájlban." + +msgid "No modification time" +msgstr "Nincs módosítási idő" + +msgid "No name OID" +msgstr "Nincs név OID" + +msgid "No pages were found." +msgstr "Nem találhatók oldalak." + +msgid "No printer name" +msgstr "Nincs nyomtatónév" + +msgid "No printer-uri found" +msgstr "Nem található printer-uri" + +msgid "No printer-uri found for class" +msgstr "Nem található printer-uri az osztályhoz" + +msgid "No printer-uri in request." +msgstr "Nincs printer-uri a kérésben." + +msgid "No request-id" +msgstr "Nincs request-id" + +msgid "No subscription attributes in request." +msgstr "Nincsenek feliratkozási attribútumok a kérésben." + +msgid "No subscriptions found." +msgstr "Nem található feliratkozás." + +msgid "No variable-bindings SEQUENCE" +msgstr "Nincs variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Nincs verziószám" + +msgid "Non-continuous (Mark sensing)" +msgstr "Nem végtelenített (jelölésérzékelés)" + +msgid "Non-continuous (Web sensing)" +msgstr "Nem végtelenített (webérzékelés)" + +msgid "Normal" +msgstr "Normál" + +msgid "Not Found" +msgstr "Nem található" + +msgid "Not Implemented" +msgstr "Nincs megvalósítva" + +msgid "Not Installed" +msgstr "Nincs telepítve" + +msgid "Not Modified" +msgstr "Nincs módosítva" + +msgid "Not Supported" +msgstr "Nem támogatott" + +msgid "Not allowed to print." +msgstr "Nem engedélyezett a nyomtatás." + +msgid "Note" +msgstr "Megjegyzés" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" +"Megjegyzés: ez a program csak a DSC-megjegyzéseket ellenőrzi, nem magát a " +"PostScriptet." + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Ki (egyoldalas)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Online súgó" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "%s megnyitása sikertelen: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "Az OpenGroup előtt nincs CloseGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "Az OpenUI/JCLOpenUI előtt nincs CloseUI/JCLCloseUI" + +msgid "Operation Policy" +msgstr "Működtetési házirend" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "A(z) „%s” beállítás nem vehető fel a %%%%IncludeFeature használatával." + +msgid "Options Installed" +msgstr "Telepített beállítások" + +msgid "Options:" +msgstr "Beállítások:" + +msgid "Options: " +msgstr "Beállítások: " + +msgid "Out of date PPD cache file." +msgstr "Elavult PPD-gyorsítótárfájl." + +msgid "Out of memory." +msgstr "Elfogyott a memória." + +msgid "Output Mode" +msgstr "Kimeneti mód" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "A(z) %s nyomtató kimenete erre van elküldve: %s" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" +"A(z) %s nyomtató kimenete a(z) %s távoli nyomtatóra van elküldve ezen: %s" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "A(z) %s/%s nyomtató kimenete erre van elküldve: %s" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" +"A(z) %s/%s nyomtató kimenete a(z) %s távoli nyomtatóra van elküldve ezen: %s" + +msgid "PASS" +msgstr "SIKER" + +msgid "PCL Laser Printer" +msgstr "PCL lézernyomtató" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "PRC16K hosszú élű" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "PRC32K hosszú élű" + +msgid "PRC32K Oversize" +msgstr "PRC32K túlméretes" + +msgid "PRC32K Oversize Long Edge" +msgstr "PRC32K túlméretes hosszú élű" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "A csomag nem tartalmaz Get-Response-PDU elemet" + +msgid "Packet does not start with SEQUENCE" +msgstr "A csomag nem a SEQUENCE elemmel kezdődik" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "%s jelszava ezen: %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "%s jelszava szükséges %s eléréséhez SAMBA használatával: " + +msgid "Pause Class" +msgstr "Osztály szüneteltetése" + +msgid "Pause Printer" +msgstr "Nyomtató szüneteltetése" + +msgid "Peel-Off" +msgstr "Leválasztás" + +msgid "Photo" +msgstr "Fotó" + +msgid "Photo Labels" +msgstr "Fotócímkék" + +msgid "Plain Paper" +msgstr "Sima papír" + +# msgid "Postcard Double" +# msgstr "Dupla képeslap" +msgid "Policies" +msgstr "Házirendek" + +msgid "Port Monitor" +msgstr "Portfigyelő" + +msgid "PostScript Printer" +msgstr "PostScript nyomtató" + +msgid "Postcard" +msgstr "Képeslap" + +msgid "Postcard Double " +msgstr "Dupla képeslap " + +msgid "Postcard Double Long Edge" +msgstr "Hosszú élű dupla képeslap" + +msgid "Postcard Long Edge" +msgstr "Hosszú élű képeslap" + +msgid "Print Density" +msgstr "Nyomtatás sűrűsége" + +msgid "Print Job:" +msgstr "Nyomtatási feladat:" + +msgid "Print Mode" +msgstr "Nyomtatási mód" + +msgid "Print Rate" +msgstr "Nyomtatási sebesség" + +msgid "Print Self-Test Page" +msgstr "Öntesztelő oldal nyomtatása" + +msgid "Print Speed" +msgstr "Nyomtatási sebesség" + +msgid "Print Test Page" +msgstr "Tesztoldal nyomtatása" + +msgid "Print and Cut" +msgstr "Nyomtatás és kivágás" + +msgid "Print and Tear" +msgstr "Nyomtatás és szakítás" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "Nyomtatási fájl elfogadva - feladatazonosító: %d" + +msgid "Print file accepted - job ID unknown." +msgstr "Nyomtatási fájl elfogadva - feladatazonosító ismeretlen." + +msgid "Print file sent." +msgstr "Nyomtatási fájl elküldve." + +msgid "Print file was not accepted." +msgstr "A nyomtatási fájl nem lett elfogadva." + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Nyomtatva ehhez: " + +msgid "Printed From: " +msgstr "Nyomtatva ebből: " + +msgid "Printed On: " +msgstr "Nyomtatva ekkor: " + +msgid "Printer Added" +msgstr "Nyomtató hozzáadva" + +msgid "Printer Default" +msgstr "Nyomtató alapértelmezése" + +msgid "Printer Deleted" +msgstr "Nyomtató törölve" + +msgid "Printer Modified" +msgstr "Nyomtató módosítva" + +msgid "Printer Name: " +msgstr "Nyomtatónév: " + +msgid "Printer Paused" +msgstr "Nyomtató szüneteltetve" + +msgid "Printer Settings" +msgstr "Nyomtató beállításai" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "Nyomtató elfoglalt, 10 másodperc múlva újrapróbálkozom." + +msgid "Printer busy; will retry in 30 seconds." +msgstr "Nyomtató elfoglalt; 30 másodperc múlva újrapróbálkozom." + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" +"A nyomtató nem támogatja az IPP/%d.%d módot, próbálkozás az IPP/%s móddal…" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "Nyomtató elfoglalt, 5 másodperc múlva újrapróbálkozom." + +msgid "Printer is not currently connected." +msgstr "A nyomtató jelenleg nincs csatlakoztatva." + +msgid "Printer is now connected." +msgstr "A nyomtató jelenleg csatlakoztatva van." + +msgid "Printer is now online." +msgstr "A nyomtató jelenleg elérhető." + +msgid "Printer is offline." +msgstr "A nyomtató offline állapotban van." + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "A nyomtató nem csatlakozik, 30 másodperc múlva újrapróbálkozom." + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "A nyomtató nem csatlakozik; 30 másodperc múlva újrapróbálkozom." + +msgid "Printer:" +msgstr "Nyomtató:" + +msgid "Printers" +msgstr "Nyomtatók" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "%d. oldal nyomtatása, %d%% kész." + +#, c-format +msgid "Printing page %d." +msgstr "%d. oldal nyomtatása." + +msgid "Purge Jobs" +msgstr "Feladatok eltávolítása" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Kvótakorlát elérve." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "Sorr Tulaj Felad Fájlok Teljes méret" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" +"Sorr Tulaj Pri Felad Fájlok Teljes méret" + +msgid "Ready to print." +msgstr "Nyomtatásra kész." + +msgid "Reject Jobs" +msgstr "Feladatok visszautasítása" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "A távoli gép nem fogadta el a vezérlőfájlt (%d)." + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "A távoli gép nem fogadta el az adatfájlt (%d)." + +msgid "Reprint After Error" +msgstr "Újranyomtatás hiba után" + +msgid "Request Entity Too Large" +msgstr "A kérésegyed túl nagy" + +msgid "Resolution" +msgstr "Felbontás" + +msgid "Resume Class" +msgstr "Osztály folytatása" + +msgid "Resume Printer" +msgstr "Nyomtató folytatása" + +msgid "Return Address" +msgstr "Visszaküldési cím" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Visszaküldési cím - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Visszatekerés" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "Parancs futtatása: %s %s -N -A %s -c '%s'" + +msgid "SEQUENCE uses indefinite length" +msgstr "A SEQUENCE végtelen hosszt használ" + +msgid "SSL/TLS Negotiation Error" +msgstr "SSL/TLS egyeztetési hiba" + +msgid "See Other" +msgstr "A többi megjelenítése" + +msgid "Sending data to printer." +msgstr "Adatok küldése a nyomtatónak." + +#, c-format +msgid "Serial Port #%d" +msgstr "%d. soros port" + +msgid "Server Restarted" +msgstr "Kiszolgáló újraindítva" + +msgid "Server Security Auditing" +msgstr "Kiszolgáló biztonsági megfigyelése" + +msgid "Server Started" +msgstr "Kiszolgáló elindítva" + +msgid "Server Stopped" +msgstr "Kiszolgáló leállítva" + +msgid "Service Unavailable" +msgstr "A szolgáltatás nem érhető el" + +msgid "Set Allowed Users" +msgstr "Engedélyezett felhasználók beállítása" + +msgid "Set As Server Default" +msgstr "Beállítás kiszolgáló alapértelmezéseként" + +msgid "Set Class Options" +msgstr "Osztály beállításainak megadása" + +msgid "Set Printer Options" +msgstr "Nyomtató beállításainak megadása" + +msgid "Set Publishing" +msgstr "Közzététel beállítása" + +msgid "Shipping Address" +msgstr "Szállítási cím" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Szállítási cím - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Rövid élű (fekvő)" + +msgid "Special Paper" +msgstr "Speciális papír" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "Feladat sorba állítása, %.0f%% kész." + +msgid "Standard" +msgstr "Szabványos" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Kezdő kísérőoldal" + +#, c-format +msgid "Starting page %d." +msgstr "%d. oldal kezdése." + +msgid "Statement" +msgstr "Statement" + +msgid "Stylus Color Series" +msgstr "Stylus Color sorozat" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo sorozat" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "A(z) %d. feliratkozás nem létezik." + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Szuper B/A3" + +msgid "Switching Protocols" +msgstr "Protokollváltás" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "Tabloid túlméretes" + +msgid "Tabloid Oversize Long Edge" +msgstr "Hosszú élű túlméretes tabloid" + +msgid "Tear" +msgstr "Letépés" + +msgid "Tear-Off" +msgstr "Perforáció" + +msgid "Tear-Off Adjust Position" +msgstr "Perforáció igazítási pozíciója" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "A(z) %s attribútum nem adható meg job-id értékekkel." + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "A(z) „%s” PPD-fájl nem található." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "A(z) „%s” PPD-fájl nem nyitható meg: %s" + +msgid "The PPD file could not be opened." +msgstr "A PPD-fájl nem nyitható meg." + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Az osztálynév legfeljebb 127 nyomtatható karaktert tartalmazhat, kivéve a " +"„/”, „#” és szóköz karaktereket." + +msgid "The developer unit needs to be replaced." +msgstr "Az előhívó egységet ki kell cserélni." + +msgid "The developer unit will need to be replaced soon." +msgstr "Az előhívó egységet hamarosan ki kell majd cserélni." + +msgid "The fuser's temperature is high." +msgstr "A beégetőmű hőmérséklete túl magas." + +msgid "The fuser's temperature is low." +msgstr "A beégetőmű hőmérséklete túl alacsony." + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"A notify-lease-duration attribútum nem használható feladatfeliratkozásokkal." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "A notify-user-data érték túl magas (%d > 63 oktet)." + +msgid "The optical photoconductor needs to be replaced." +msgstr "Az optikai fotovezetőt ki kell cserélni." + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "Az optikai fotovezetőt hamarosan ki kell majd cserélni." + +msgid "The output bin is almost full." +msgstr "A kimeneti tartó majdnem megtelt." + +msgid "The output bin is full." +msgstr "A kimeneti tartó megtelt." + +msgid "The output bin is missing." +msgstr "A kimeneti tartó hiányzik." + +msgid "The page setup information was not valid." +msgstr "Az oldalbeállítási információk érvénytelenek." + +msgid "The paper tray is almost empty." +msgstr "Majdnem üres a papírtálca." + +msgid "The paper tray is empty." +msgstr "Üres a papírtálca." + +msgid "The paper tray is missing." +msgstr "Hiányzik a papírtálca." + +msgid "The paper tray needs to be filled." +msgstr "Fel kell tölteni a papírtálcát." + +msgid "The print file could not be opened." +msgstr "A nyomtatási fájl nem nyitható meg." + +msgid "The printer URI is incorrect or no longer exists." +msgstr "A nyomtató URI-címe helytelen, vagy nem létezik." + +msgid "The printer is busy." +msgstr "A nyomtató elfoglalt." + +msgid "The printer is not connected." +msgstr "A nyomtató nincs csatlakoztatva." + +msgid "The printer is not responding." +msgstr "A nyomtató nem válaszol." + +msgid "The printer is out of ink." +msgstr "A nyomtatóból kifogyott a tinta." + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "A nyomtató jelenleg elérhetetlen." + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "A nyomtató nem létezik, vagy jelenleg elérhetetlen." + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"A nyomtatónév legfeljebb 127 nyomtatható karaktert tartalmazhat, kivéve a " +"„/”, „#” és szóköz karaktereket." + +msgid "The printer or class does not exist." +msgstr "A nyomtató vagy osztály nem létezik." + +msgid "The printer or class is not shared." +msgstr "A nyomtató vagy osztály nincs megosztva." + +msgid "The printer's cover is open." +msgstr "A nyomtató fedele nyitva van." + +msgid "The printer's door is open." +msgstr "A nyomtató ajtaja nyitva van." + +msgid "The printer's interlock is open." +msgstr "A nyomtató retesze nyitva van." + +msgid "The printer's waste bin is almost full." +msgstr "A nyomtató hulladéktárolója majdnem megtelt." + +msgid "The printer's waste bin is full." +msgstr "A nyomtató hulladéktárolója megtelt." + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "A(z) „%s” printer-uri érvénytelen karaktereket tartalmaz." + +msgid "The printer-uri attribute is required." +msgstr "A printer-uri attribútum szükséges." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"A printer-uri a következő alakú kell legyen: „ipp://GÉPNÉV/classes/" +"OSZTÁLYNÉV”." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"A printer-uri a következő alakú kell legyen: „ipp://GÉPNÉV/printers/" +"NYOMTATÓNÉV”." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"A feliratkozás neve nem tartalmazhatja a „/”, „?”, „#” és szóköz " +"karaktereket." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" +"A webes felület jelenleg le van tiltva. Futtassa a „cupsctl " +"WebInterface=yes” parancsot az engedélyezéséhez." + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "A(z) „%s” which-jobs érték nem támogatott." + +msgid "There are too many subscriptions." +msgstr "Túl sok feliratkozás van." + +msgid "There is a paper jam." +msgstr "Begyűrődött a papír." + +msgid "There was an unrecoverable USB error." +msgstr "Helyrehozhatatlan USB-hiba történt." + +msgid "Thermal Transfer Media" +msgstr "Termáltranszfer címke" + +msgid "Title: " +msgstr "Cím: " + +msgid "Too many active jobs." +msgstr "Túl sok aktív feladat." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "Túl sok job-sheets érték (%d > 2)." + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "Túl sok printer-state-reasons érték (%d > %d)." + +msgid "Transparency" +msgstr "Átlátszóság" + +msgid "Tray" +msgstr "Tálca" + +msgid "Tray 1" +msgstr "1. tálca" + +msgid "Tray 2" +msgstr "2. tálca" + +msgid "Tray 3" +msgstr "3. tálca" + +msgid "Tray 4" +msgstr "4. tálca" + +msgid "URI Too Long" +msgstr "Az URI túl hosszú" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "US Legal túlméretes" + +msgid "US Letter" +msgstr "US levél" + +msgid "US Letter Long Edge" +msgstr "Hosszú élű US levél" + +msgid "US Letter Oversize" +msgstr "Túlméretes US levél" + +msgid "US Letter Oversize Long Edge" +msgstr "Hosszú élű túlméretes US levél" + +msgid "US Letter Small" +msgstr "US Letter kicsi" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "%d. USB soros port" + +msgid "Unable to access cupsd.conf file:" +msgstr "A cupsd.conf fájl nem érhető el:" + +msgid "Unable to add RSS subscription:" +msgstr "Nem vehető fel az RSS-feliratkozás:" + +msgid "Unable to add class:" +msgstr "Nem vehető fel osztály:" + +msgid "Unable to add document to print job." +msgstr "A dokumentum nem adható hozzá a nyomtatási feladathoz." + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "Nem vehető fel feladat a(z) „%s” célhoz." + +msgid "Unable to add printer:" +msgstr "Nem vehető fel nyomtató:" + +msgid "Unable to allocate memory for file types." +msgstr "A memória lefoglalása nem lehetséges a fájltípusoknak." + +msgid "Unable to allocate memory for page info" +msgstr "A memória lefoglalása nem lehetséges az oldalinformációknak." + +msgid "Unable to allocate memory for pages array" +msgstr "A memória lefoglalása nem lehetséges az oldalak tömbjének." + +msgid "Unable to cancel RSS subscription:" +msgstr "Nem távolítható el az RSS-feliratkozás:" + +msgid "Unable to cancel print job." +msgstr "Nem szakítható meg a nyomtatási feladat." + +msgid "Unable to change printer-is-shared attribute:" +msgstr "A printer-is-shared attribútum nem módosítható:" + +msgid "Unable to change printer:" +msgstr "Nem módosítható a nyomtató:" + +msgid "Unable to change server settings:" +msgstr "Nem módosíthatók a kiszolgáló beállításai:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "A géphez nem lehet kapcsolódni." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" +"A nyomtatóval nem vehető fel a kapcsolat, sorba állítás az osztály következő " +"nyomtatójára." + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "A 64 bites CUPS illesztőprogram-fájlok nem másolhatók (%d)." + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "A 64 bites Windows illesztőprogram-fájlok nem másolhatók (%d)." + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "A CUPS illesztőprogram-fájlok nem másolhatók (%d)." + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "A PPD-fájl nem másolható - %s" + +msgid "Unable to copy PPD file." +msgstr "A PPD-fájl nem másolható." + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "A Windows 2000 illesztőprogram-fájlok nem másolhatók (%d)." + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "A Windows 9x illesztőprogram-fájlok nem másolhatók (%d)." + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "A felület parancsfájl nem másolható - %s" + +msgid "Unable to copy print file" +msgstr "A nyomtatási fájl nem másolható" + +msgid "Unable to create compressed print file" +msgstr "Nem hozható létre tömörített nyomtatási fájl" + +msgid "Unable to create pipes for filters" +msgstr "Nem hozhatók létre csövek a szűrőkhöz" + +msgid "Unable to create printer-uri" +msgstr "Nem hozható létre printer-uri" + +msgid "Unable to create temporary file" +msgstr "Az átmeneti fájl létrehozása nem lehetséges" + +msgid "Unable to create temporary file:" +msgstr "Az átmeneti fájl létrehozása nem lehetséges:" + +msgid "Unable to delete class:" +msgstr "Nem törölhető az osztály:" + +msgid "Unable to delete printer:" +msgstr "Nem törölhető a nyomtató:" + +msgid "Unable to do maintenance command:" +msgstr "Nem hajtható végre a karbantartási parancs:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "Nem szerkeszthetők 1 MB-nál nagyobb cupsd.conf fájlok" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (érvénytelen " +"tanúsítványlánc)." + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (a tanúsítvány még nem " +"érvényes)." + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (a tanúsítvány lejárt)." + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "Nem hozható létre biztonságos kapcsolat a géphez (a gépnév eltér)." + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (a partner eldobta a " +"kapcsolatot a válasz előtt)." + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (önaláírt tanúsítvány)." + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" +"Nem hozható létre biztonságos kapcsolat a géphez (a tanúsítványban nem lehet " +"megbízni)." + +msgid "Unable to establish a secure connection to host." +msgstr "Nem hozható létre biztonságos kapcsolat a géphez." + +msgid "Unable to find destination for job" +msgstr "Nem található a feladat célja" + +msgid "Unable to find printer." +msgstr "Nem található a nyomtató." + +msgid "Unable to fork filter" +msgstr "A szűrő nem indítható el" + +msgid "Unable to generate compressed print file" +msgstr "Nem állítható elő tömörített nyomtatási fájl" + +msgid "Unable to get backend exit status." +msgstr "Nem kérhető le a háttérprogram kilépési állapota." + +msgid "Unable to get class list:" +msgstr "Nem kérhető le az osztályok listája:" + +msgid "Unable to get class status:" +msgstr "Nem kérhető le az osztály állapota:" + +msgid "Unable to get list of printer drivers:" +msgstr "Nem kérhető le a nyomtató-illesztőprogramok listája:" + +msgid "Unable to get printer attributes:" +msgstr "Nem kérhetők le a nyomtató attribútumai:" + +msgid "Unable to get printer list:" +msgstr "Nem kérhető le a nyomtatók listája:" + +msgid "Unable to get printer status." +msgstr "Nem kérhető le a nyomtató állapota." + +msgid "Unable to get printer status:" +msgstr "Nem kérhető le a nyomtató állapota:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "A Windows 2000 illesztőprogram-fájlok nem telepíthetők (%d)." + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "A Windows 9x illesztőprogram-fájlok nem telepíthetők (%d)." + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "Nem található a(z) „%s” nyomtató." + +msgid "Unable to locate printer." +msgstr "Nem található a nyomtató." + +msgid "Unable to modify class:" +msgstr "Nem módosítható az osztály:" + +msgid "Unable to modify printer:" +msgstr "Nem módosítható a nyomtató:" + +msgid "Unable to move job" +msgstr "Nem helyezhető át a feladat" + +msgid "Unable to move jobs" +msgstr "Nem helyezhetők át a feladatok" + +msgid "Unable to open PPD file" +msgstr "Nem nyitható meg a PPD-fájl" + +msgid "Unable to open PPD file:" +msgstr "Nem nyitható meg a PPD-fájl:" + +msgid "Unable to open charset file" +msgstr "A karakterkészletfájl nem nyitható meg" + +msgid "Unable to open compressed print file" +msgstr "Nem nyitható meg tömörített nyomtatási fájl" + +msgid "Unable to open cupsd.conf file:" +msgstr "A cupsd.conf fájl nem nyitható meg:" + +msgid "Unable to open device file" +msgstr "Az eszközfájl nem nyitható meg" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "Nem nyitható meg a(z) %d. dokumentum a(z) %d. feladatban." + +msgid "Unable to open print file" +msgstr "A nyomtatási fájl nem nyitható meg" + +msgid "Unable to open psglyphs" +msgstr "A psglyphs nem nyitható meg" + +msgid "Unable to open raster file" +msgstr "Raszterfájl megnyitása nem lehetséges" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "Nem nyomtatható ki %d szövegoszlop." + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "Nem nyomtatható ki %dx%d szövegoldal." + +msgid "Unable to print test page:" +msgstr "Nem nyomtatható tesztoldal:" + +msgid "Unable to read print data" +msgstr "Nem olvashatók a nyomtatási adatok" + +msgid "Unable to read print data." +msgstr "Nem olvashatók a nyomtatási adatok." + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "A(z) „%s” nem futtatható: %s" + +msgid "Unable to see in file" +msgstr "A fájl nem olvasható" + +msgid "Unable to send command to printer driver" +msgstr "Nem küldhető parancs a nyomtató-illesztőprogramnak" + +msgid "Unable to send data to printer." +msgstr "Az adatok nem küldhetők el a nyomtatóra." + +msgid "Unable to send raster data to the driver." +msgstr "A raszteradatok nem küldhetők el az illesztőprogramnak." + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "A Windows illesztőprogram nem állítható be (%d)." + +msgid "Unable to set options:" +msgstr "Nem adhatók meg a beállítások:" + +msgid "Unable to set server default:" +msgstr "Nem állítható be a kiszolgáló alapértelmezése:" + +msgid "Unable to start backend process." +msgstr "Nem indítható a háttérfolyamat." + +msgid "Unable to upload cupsd.conf file:" +msgstr "A cupsd.conf fájl nem tölthető fel:" + +msgid "Unable to use legacy USB class driver." +msgstr "Nem használható az örökölt USB osztály-illesztőprogram." + +msgid "Unable to write print data" +msgstr "Nem írhatók a nyomtatási adatok" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "Nem írhatók a tömörítetlen nyomtatási adatok: %s" + +msgid "Unauthorized" +msgstr "Nem jogosult" + +msgid "Units" +msgstr "Mértékegységek" + +msgid "Unknown" +msgstr "Ismeretlen" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "Ismeretlen lehetőség („%s”) a(z) „%s” beállításhoz." + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "Ismeretlen titkosításibeállítás-érték: „%s”." + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "Ismeretlen fájlsorrend: „%s”." + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "Ismeretlen formázókarakter: „%c”." + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "Ismeretlen kapcsoló („%s”) „%s” értékkel." + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "Ismeretlen kapcsoló: „%s”." + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "Ismeretlen nyomtatási mód: „%s”." + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Ismeretlen printer-error-policy: „%s”." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Ismeretlen printer-op-policy: „%s”." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "Ismeretlen verzióbeállítás-érték: „%s”." + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "Nem támogatott átviteli sebesség: %s" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "Nem támogatott fényerőérték (%s), fényerő=100 használata." + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "Nem támogatott karakterkészlet: „%s”." + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "Nem támogatott tömörítés: „%s”." + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "Nem támogatott document-format: „%s”." + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "Nem támogatott document-format: „%s/%s”." + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "Nem támogatott formátum: „%s”." + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "Nem támogatott gamma érték (%s), gamma=1000 használata." + +msgid "Unsupported margins." +msgstr "Nem támogatott margók." + +msgid "Unsupported media value." +msgstr "Nem támogatott médiaérték." + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "Nem támogatott number-up érték (%d), number-up=1 használata." + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" +"Nem támogatott number-up-layout érték (%s), number-up-layout=lrtb használata." + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "Nem támogatott page-border érték (%s), page-border=none használata." + +msgid "Unsupported raster data." +msgstr "Nem támogatott raszteradatok." + +msgid "Unsupported value type" +msgstr "Nem támogatott értéktípus" + +msgid "Upgrade Required" +msgstr "Frissítés szükséges" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" +"Használat:\n" +"\n" +" lpadmin [-h kiszolgáló] -d cél\n" +" lpadmin [-h kiszolgáló] -x cél\n" +" lpadmin [-h kiszolgáló] -p nyomtató [-c hozzáadandó-osztály] [-i " +"csatoló]\n" +" [-m modell] [-r eltávolítandó-osztály] [-v " +"eszköz]\n" +" [-D leírás] [-P ppd-fájl] [-o név=érték]\n" +" [-u allow:felhasználó,felhasználó] [-u deny:" +"felhasználó,felhasználó]" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "Használat: %s feladat felhasználó cím példányok kapcsolók [fájlnév]" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" +"Használat: %s feladatazonosító felhasználó cím példányok kapcsolók [fájl]" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" +"Használat: %s feladatazonosító felhasználó cím példányok kapcsolók fájl" + +msgid "Usage: convert [ options ]" +msgstr "Használat: convert [ kapcsolók ]" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "Használat: cupsaddsmb [kapcsolók] nyomtató1 ... nyomtatóN" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "Használat: cupsctl [kapcsolók] [param=érték ... paramN=értékN]" + +msgid "Usage: cupsd [options]" +msgstr "Használat: cupsd [kapcsolók]" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "Használat: cupsfilter [ kapcsolók ] fájlnév" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "Használat: cupstestdsc [kapcsolók] fájlnév.ps [... fájlnév.ps]" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" +"Használat: cupstestppd [kapcsolók] fájlnév1.ppd[.gz] [... fájlnévN.ppd[.gz]]" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "Használat: ipptool [kapcsolók] URI fájlnév [ ... fájlnévN ]" + +msgid "Usage: lpmove job/src dest" +msgstr "Használat: lpmove feladat/forrás cél" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" +"Használat: lpoptions [-h kiszolgáló] [-E] -d nyomtató\n" +" lpoptions [-h kiszolgáló] [-E] [-p nyomtató] -l\n" +" lpoptions [-h kiszolgáló] [-E] -p nyomtató -o kapcsoló[=érték] …\n" +" lpoptions [-h kiszolgáló] [-E] -x nyomtató" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "Használat: lppasswd [-g csoportnév]" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" +"Használat: lppasswd [-g csoportnév] [felhasználónév]\n" +" lppasswd [-g csoportnév] -a [felhasználónév]\n" +" lppasswd [-g csoportnév] -x [felhasználónév]" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" +"Használat: lpq [-P cél] [-U felhasználónév] [-h gépnév[:port]] [-l] [+időköz]" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "Használat: ppdc [kapcsolók] fájlnév.drv [ ... fájlnévN.drv ]" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "Használat: ppdhtml [kapcsolók] fájlnév.drv > fájlnév.html" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "Használat: ppdi [kapcsolók] fájlnév.ppd [ ... fájlnévN.ppd ]" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "Használat: ppdmerge [kapcsolók] fájlnév.ppd [ ... fájlnévN.ppd ]" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" +"Használat: ppdpo [kapcsolók] -o fájlnév.po fájlnév.drv [ ... fájlnévN.drv ]" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "Használat: snmp [gép-vagy-ip-cím]" + +msgid "Value uses indefinite length" +msgstr "Az érték végtelen hosszt használ" + +msgid "VarBind uses indefinite length" +msgstr "A VarBind végtelen hosszt használ" + +msgid "Version uses indefinite length" +msgstr "A verzió végtelen hosszt használ" + +msgid "Waiting for job to complete." +msgstr "Várakozás a feladat befejeződésére." + +msgid "Waiting for printer to become available." +msgstr "Várakozás a nyomtató elérhetővé válására." + +msgid "Waiting for printer to finish." +msgstr "Várakozás a nyomtatás befejezésére." + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" +"Figyelmeztetés, nincsenek telepítve Windows 2000 nyomtató-illesztőprogramok." + +msgid "Web Interface is Disabled" +msgstr "A webes felület letiltva" + +msgid "Yes" +msgstr "Igen" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Ezt az oldalt a következő URL használatával érje el: https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" +"Jelszavának legalább 6 karakter hosszúságúnak kell lennie, nem " +"tartalmazhatja ą felhasználónevét, és legalább egy betűt és számot kell " +"tartalmaznia." + +msgid "ZPL Label Printer" +msgstr "ZPL címkenyomtató" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "megszakítva" + +msgid "canceled" +msgstr "megszakítva" + +msgid "completed" +msgstr "végrehajtva" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "convert: Használja a -f kapcsolót az átalakítandó fájl megadásához." + +msgid "cups-deviced failed to execute." +msgstr "A cups-deviced végrehajtása sikertelen." + +msgid "cups-driverd failed to execute." +msgstr "A cups-driverd végrehajtása sikertelen." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "cupsaddsmb: Nincs PPD-fájl a(z) „%s” nyomtatóhoz - %s" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "cupsctl: A Listen vagy Port nem állítható be közvetlenül." + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "cupsctl: Nem lehet a kiszolgálóhoz csatlakozni: %s" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "cupsctl: Ismeretlen kapcsoló: „%s”" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "cupsctl: Ismeretlen kapcsoló: „-%c”" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "cupsd: A „-c” kapcsoló után konfigurációs fájl nevének kellene állnia." + +msgid "cupsd: Unable to get current directory." +msgstr "cupsd: Az aktuális könyvtár nem kérhető le." + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "cupsd: Ismeretlen argumentum: „%s” - megszakítás." + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "cupsd: Ismeretlen kapcsoló: „%c” - megszakítás." + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" +"cupsd: A launchd(8) támogatása nincs befordítva, futtatás normál módban." + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "cupsfilter: Érvénytelen dokumentumszám: %d." + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "cupsfilter: Érvénytelen feladatazonosító: %d." + +msgid "cupsfilter: Only one filename can be specified." +msgstr "cupsfilter: Csak egy fájlnév adható meg." + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "cupsfilter: A feladatfájl nem kérhető le - %s" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "cupstestppd: A -q kapcsoló nem kompatibilis a -v kapcsolóval." + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "cupstestppd: A -v kapcsoló nem kompatibilis a -q kapcsolóval." + +#, c-format +msgid "device for %s/%s: %s" +msgstr "eszköz ehhez: %s/%s: %s" + +#, c-format +msgid "device for %s: %s" +msgstr "eszköz ehhez: %s: %s" + +msgid "error-index uses indefinite length" +msgstr "az error-index végtelen hosszot használ" + +msgid "error-status uses indefinite length" +msgstr "az error-status végtelen hosszot használ" + +msgid "held" +msgstr "felfüggesztve" + +msgid "help\t\tGet help on commands." +msgstr "help\t\tSúgó a parancsokhoz." + +msgid "idle" +msgstr "tétlenség" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "ipptool: a „-i” és „-n” nem kompatibilisek a „-X” kapcsolóval." + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "ipptool: a „-i” nem kompatibilis a „-X” kapcsolóval." + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "ipptool: a „-n” nem kompatibilis a „-X” kapcsolóval." + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "ipptool: Hibás URI - %s." + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "ipptool: Hibás verzió (%s) a „-V” kapcsolóhoz." + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "ipptool: Érvénytelen másodpercek a „-i” kapcsolóhoz." + +msgid "ipptool: May only specify a single URI." +msgstr "ipptool: Csak egy URI adható meg." + +msgid "ipptool: Missing count for \"-n\"." +msgstr "ipptool: Hiányzó szám a „-n” kapcsolóhoz." + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "ipptool: Hiányzó fájlnév a „-f” kapcsolóhoz." + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "ipptool: Hiányzó név=érték pár a „-d” kapcsolóhoz." + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "ipptool: Hiányzó másodpercek a „-i” kapcsolóhoz." + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "ipptool: Hiányzó időkorlát a „-T” kapcsolóhoz." + +msgid "ipptool: Missing version for \"-V\"." +msgstr "ipptool: Hiányzó verzió a „-V” kapcsolóhoz." + +msgid "ipptool: URI required before test file." +msgstr "ipptool: URI szükséges a tesztfájl előtt." + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "ipptool: Ismeretlen kapcsoló: „-%c”." + +msgid "job-printer-uri attribute missing." +msgstr "A job-printer-uri attribútum hiányzik." + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "lpadmin: Az osztálynév csak nyomtatható karaktereket tartalmazhat." + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "lpadmin: A „-P” kapcsoló után PPD-nek kellene állnia." + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" +"lpadmin: A „-u” kapcsoló után allow/deny:felhasználólistának kellene állnia." + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "lpadmin: A „-r” kapcsoló után osztálynak kellene állnia." + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "lpadmin: A „-c” kapcsoló után osztálynévnek kellene állnia." + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "lpadmin: A „-D” kapcsoló után leírásnak kellene állnia." + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "lpadmin: A „-v” kapcsoló után eszköz URI-címnek kellene állnia." + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "lpadmin: A „-I” kapcsoló után fájltípusnak kellene állnia." + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "lpadmin: A „-h” kapcsoló után gépnévnek kellene állnia." + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "lpadmin: A „-i” kapcsoló után felületnek kellene állnia." + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "lpadmin: A „-L” kapcsoló után helynek kellene állnia." + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "lpadmin: A „-m” kapcsoló után modellnek kellene állnia." + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "lpadmin: A „-h” kapcsoló után gépnévnek kellene állnia." + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "lpadmin: A „-o” kapcsoló után név=érték párnak kellene állnia." + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "lpadmin: A „-p” kapcsoló után nyomtatónak kellene állnia." + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "lpadmin: A „-d” kapcsoló után nyomtatónévnek kellene állnia." + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" +"lpadmin: A „-x” kapcsoló után nyomtatónak vagy osztálynak kellene állnia." + +msgid "lpadmin: No member names were seen." +msgstr "lpadmin: Nem voltak megadva tagnevek." + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "lpadmin: A(z) %s nyomtató már tagja a(z) %s osztálynak." + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "lpadmin: A(z) %s nyomtató nem tagja a(z) %s osztálynak." + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "lpadmin: A nyomtatónév csak nyomtatható karaktereket tartalmazhat." + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Nem adható a nyomtató az osztályhoz:\n" +" Előbb meg kell adnia egy nyomtatónevet." + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "lpadmin: Nem lehet a kiszolgálóhoz csatlakozni: %s" + +msgid "lpadmin: Unable to create temporary file" +msgstr "lpadmin: Az átmeneti fájl létrehozása nem lehetséges" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Nem törölhető a beállítás:\n" +" Előbb meg kell adnia egy nyomtatónevet." + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "lpadmin: A(z) „%s” PPD-fájl nem nyitható meg - %s" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Nem távolítható el a nyomtató az osztályból:\n" +" Előbb meg kell adnia egy nyomtatónevet." + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" +"lpadmin: Nem adhatók meg a nyomtatóbeállítások:\n" +" Előbb meg kell adnia egy nyomtatónevet." + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "lpadmin: Ismeretlen allow/deny kapcsoló: „%s”." + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "lpadmin: Ismeretlen argumentum: „%s”." + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "lpadmin: Ismeretlen kapcsoló: „%c”." + +msgid "lpadmin: Warning - content type list ignored." +msgstr "lpadmin: Figyelmeztetés - a tartalomtípus-lista mellőzve." + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" +"lpinfo: A „--device-id” kapcsoló után 1284-es eszközazonosítónak kellene " +"állnia." + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "lpinfo: A „--language” kapcsoló után nyelvnek kellene állnia." + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" +"lpinfo: A „--make-and-model” kapcsoló után gyártónak és modellnek kellene " +"állnia." + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" +"lpinfo: A „--product” kapcsoló után termék karakterláncnak kellene állnia." + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" +"lpinfo: A „--exclude-schemes” kapcsoló után sémalistának kellene állnia." + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" +"lpinfo: A „--include-schemes” kapcsoló után sémalistának kellene állnia." + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "lpinfo: A „--timeout” kapcsoló után időkorlátnak kellene állnia." + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "lpinfo: Ismeretlen argumentum: „%s”." + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "lpinfo: Ismeretlen kapcsoló: „%c”." + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "lpinfo: Ismeretlen kapcsoló: „%s”." + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "lpmove: Nem lehet a kiszolgálóhoz csatlakozni: %s" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "lpmove: Ismeretlen argumentum: „%s”." + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "lpmove: Ismeretlen kapcsoló: „%c”." + +msgid "lpoptions: No printers." +msgstr "lpoptions: Nincsenek nyomtatók." + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "lpoptions: Nem vehető fel a nyomtató vagy példány: %s" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "lpoptions: Nem kérhető le PPD-fájl ehhez: %s: %s" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "lpoptions: Nem nyitható meg PPD-fájl ehhez: %s." + +msgid "lpoptions: Unknown printer or class." +msgstr "lpoptions: Ismeretlen nyomtató vagy osztály." + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "lppasswd: Csak a root vehet fel vagy törölhet jelszavakat." + +msgid "lppasswd: Password file busy." +msgstr "lppasswd: A jelszófájl foglalt." + +msgid "lppasswd: Password file not updated." +msgstr "lppasswd: A jelszófájl nem lett frissítve." + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "lppasswd: Elnézést, a jelszó nem egyezik." + +msgid "lppasswd: Sorry, password rejected." +msgstr "lppasswd: Elnézést, a jelszó visszautasítva." + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "lppasswd: Elnézést, a jelszavak nem egyeznek." + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "lppasswd: A jelszókarakterlánc nem másolható: %s" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "lppasswd: A jelszófájl nem nyitható meg: %s" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "lppasswd: A jelszófájlba nem lehet írni: %s" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "lppasswd: a régi jelszófájl mentése sikertelen: %s" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "lppasswd: a jelszófájl átnevezése sikertelen: %s" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "lppasswd: a(z) „%s” felhasználó és „%s” csoport nem létezik." + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" +"lpstat: hiba - a(z) %s környezeti változó nem létező célt („%s”) nevez meg." + +#, c-format +msgid "members of class %s:" +msgstr "%s osztály tagjai:" + +msgid "no entries" +msgstr "nincsenek bejegyzések" + +msgid "no system default destination" +msgstr "nincs rendszerszintű alapértelmezett cél" + +msgid "notify-events not specified." +msgstr "A notify-events nincs megadva." + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "A(z) „%s” notify-recipient-uri URI már használatban van." + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "A(z) „%s” notify-recipient-uri URI ismeretlen sémát használ." + +msgid "pending" +msgstr "függőben" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "ppdc: „%s” include-könyvtár hozzáadása." + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "ppdc: Felületszöveg hozzáadása/frissítése innen: %s." + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "ppdc: Hibás logikai érték (%s) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "ppdc: Hibás betűkészlet attribútum: %s" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "ppdc: Hibás felbontásnév („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "ppdc: Hibás állapotkulcsszó (%s) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "ppdc: Hibás változóhelyettesítés ($%c) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "ppdc: A(z) %d. sorban található lehetőséghez nincs Option ebben: %s." + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" +"ppdc: Többszörös #po a(z) %s területi beállításhoz a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "ppdc: Szűrődefiníciónak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "ppdc: Programnévnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "ppdc: Logikai értéknek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" +"ppdc: Karakterkészletnek kellene a Font után állnia a(z) %d. sorban ebben: %" +"s." + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "ppdc: Lehetőségkódnak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" +"ppdc: Lehetőségnévnek/szövegnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" +"ppdc: Színsorrendnek kellene a(z) %d. sorban állnia a ColorModelhez ebben: %" +"s." + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" +"ppdc: Színtérnek kellene a(z) %d. sorban állnia a ColorModelhez ebben: %s." + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" +"ppdc: Tömörítésnek kellene a(z) %d. sorban állnia a ColorModelhez ebben: %s." + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" +"ppdc: Megszorítás-karakterláncnak kellene a(z) %d. sorban állnia a " +"UIConstraintshoz ebben: %s." + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" +"ppdc: Illesztőprogram-típusnak kellene a(z) %d. sorban állnia a DriverType " +"után ebben: %s." + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" +"ppdc: Duplex típusnak kellene a Duplex után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "ppdc: Kódolásnak kellene a Font után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" +"ppdc: Fájlnévnek kellene a #po %s után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" +"ppdc: Csoportnévnek/szövegnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "ppdc: include fájlnévnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "ppdc: Egésznek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" +"ppdc: Területi beállításnak kellene a #po után állnia a(z) %d. sorban ebben: " +"%s." + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "ppdc: Névnek kellene a(z) %s után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "ppdc: Névnek kellene a FileName után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "ppdc: Névnek kellene a Font után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" +"ppdc: Névnek kellene a Manufacturer után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" +"ppdc: Névnek kellene a MediaSize után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" +"ppdc: Névnek kellene a ModelName után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" +"ppdc: Névnek kellene a PCFileName után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" +"ppdc: Névnek/szövegnek kellene a(z) %s után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" +"ppdc: Névnek/szövegnek kellene az Installable után állnia a(z) %d. sorban " +"ebben: %s." + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" +"ppdc: Névnek/szövegnek kellene a Resolution után állnia a(z) %d. sorban " +"ebben: %s." + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" +"ppdc: Név/szöveg kombinációnak kellene a(z) %d. sorban állnia a " +"ColorModelhez ebben: %s." + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" +"ppdc: Beállításnévnek/szövegnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "ppdc: Beállításszakasznak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "ppdc: Beállítástípusnak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" +"ppdc: Felülbírálási mezőnek kellene a Resolution után állnia a(z) %d. sorban " +"ebben: %s." + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" +"ppdc: Idézett karakterláncnak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "ppdc: Valós számnak kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" +"ppdc: Felbontásnak/médiatípusnak kellene a(z) %d. sorban állnia a " +"ColorProfile után ebben: %s." + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" +"ppdc: Felbontásnak/médiatípusnak kellene a(z) %d. sorban állnia a " +"SimpleColorProfile után ebben: %s." + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" +"ppdc: Választónak kellene a(z) %s után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "ppdc: Állapotnak kellene a Font után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" +"ppdc: Karakterláncnak kellene a Copyright után állnia a(z) %d. sorban ebben: " +"%s." + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" +"ppdc: Karakterláncnak kellene a Version után állnia a(z) %d. sorban ebben: %" +"s." + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "ppdc: Két beállításnévnek kellene a(z) %d. sorban állnia ebben: %s." + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "ppdc: Értéknek kellene a(z) %s után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "ppdc: Verziónak kellene a Font után állnia a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "ppdc: Érvénytelen #include/#po fájlnév: „%s”." + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "ppdc: Érvénytelen költség a szűrőhöz a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" +"ppdc: Érvénytelen üres MIME-típus a szűrőhöz a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" +"ppdc: Érvénytelen üres programnév a szűrőhöz a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "ppdc: Érvénytelen beállításszakasz („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "ppdc: Érvénytelen beállítástípus („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "ppdc: Illesztőprogram-információs fájl betöltése: „%s”." + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "ppdc: Üzenetek betöltése a területi beállításhoz: „%s”." + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "ppdc: Üzenetek betöltése ebből: „%s”." + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "ppdc: Hiányzó #endif a(z) „%s” végén." + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "ppdc: Hiányzó #if a(z) %d. sorban ebben: %s." + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" +"ppdc: Egy msgid sor szükséges a fordítások előtt a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "ppdc: Nincs üzenetkatalógus a(z) %s területi beállításhoz." + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" +"ppdc: A(z) %s beállítás két különböző csoportban van definiálva a(z) %d. " +"sorban ebben: %s." + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" +"ppdc: A(z) %s beállítás másik típussal újra van definiálva a(z) %d. sorban " +"ebben: %s." + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" +"ppdc: A megszorítás beállításnak *name elemet kell használnia a(z) %d. " +"sorban ebben: %s." + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "ppdc: Túl sok beágyazott #if a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "ppdc: A(z) „%s” PPD-fájl nem hozható létre - %s." + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "ppdc: Nem hozható létre a kimeneti %s könyvtár: %s" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "ppdc: Nem hozhatók létre a kimeneti csövek: %s" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "ppdc: Nem hajtható végre a cupstestppd: %s" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "ppdc: Nem található a(z) %s #po fájl a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "ppdc: Nem található a(z) „%s” include fájl a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "ppdc: Nem található lokalizáció ehhez: „%s” - %s" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "ppdc: Nem tölthető be a(z) „%s” lokalizációs fájl - %s" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "ppdc: A(z) %s nem nyitható meg: %s" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "ppdc: Nem definiált változó (%s) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "ppdc: Váratlan szöveg a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "ppdc: Ismeretlen illesztőprogram-típus (%s) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "ppdc: Ismeretlen duplex típus („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "ppdc: Ismeretlen médiaméret („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "ppdc: Ismeretlen üzenetkatalógus-formátum ehhez: „%s”." + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "ppdc: Ismeretlen jelsor („%s”) a(z) %d. sorban ebben: %s." + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" +"ppdc: Ismeretlen záró karakterek a(z) „%s” valós számban a(z) %d. sorban " +"ebben: %s." + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" +"ppdc: Befejezetlen karakterlánc %c kezdettel a(z) %d. sorban ebben: %s." + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "ppdc: Figyelmeztetés - átfedő fájlnév: „%s”." + +#, c-format +msgid "ppdc: Writing %s." +msgstr "ppdc: %s írása." + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "ppdc: PPD-fájlok írása ebbe a könyvtárba: „%s”." + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "ppdmerge: Hibás LanguageVersion („%s”) ebben: %s." + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "ppdmerge: A(z) %s PPD-fájl mellőzése." + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "ppdmerge: %s nem menthető ide: %s - %s" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "a(z) %s nyomtató letiltva ez óta: %s -" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "a(z) %s nyomtató tétlen. engedélyezve ez óta: %s" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "a(z) %s nyomtató nyomtat: %s-%d. engedélyezve ez óta: %s" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "a(z) %s/%s nyomtató letiltva ez óta: %s -" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "a(z) %s/%s nyomtató tétlen. engedélyezve ez óta: %s" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "a(z) %s/%s nyomtató nyomtat: %s-%d. engedélyezve ez óta: %s" + +msgid "processing" +msgstr "feldolgozás" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "kérésazonosító: %s-%d (%d fájl)" + +msgid "request-id uses indefinite length" +msgstr "A request-id végtelen hosszt használ" + +msgid "scheduler is not running" +msgstr "az ütemező nem fut" + +msgid "scheduler is running" +msgstr "az ütemező fut" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "%s elérése sikertelen: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "status\t\tA démon és a sor állapotának megjelenítése." + +msgid "stopped" +msgstr "megállítva" + +#, c-format +msgid "system default destination: %s" +msgstr "rendszer alapértelmezett célja: %s" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "rendszer alapértelmezett célja: %s/%s" + +msgid "unknown" +msgstr "ismeretlen" + +msgid "untitled" +msgstr "névtelen" + +msgid "variable-bindings uses indefinite length" +msgstr "A variable-bindings végtelen hosszt használ" + +#~ msgid "-I Ignore errors." +#~ msgstr "-I Hibák figyelmen kívül hagyása." + +#~ msgid "-q Run silently." +#~ msgstr "-q Csendes futás." + +#~ msgid "B5 JIS" +#~ msgstr "B5 JIS" + +#~ msgid "JB0" +#~ msgstr "JB0" + +#~ msgid "JB1" +#~ msgstr "JB1" + +#~ msgid "JB10" +#~ msgstr "JB10" + +#~ msgid "JB2" +#~ msgstr "JB2" + +#~ msgid "JB3" +#~ msgstr "JB3" + +#~ msgid "JB4" +#~ msgstr "JB4" + +#~ msgid "JB6" +#~ msgstr "JB6" + +#~ msgid "JB7" +#~ msgstr "JB7" + +#~ msgid "JB8" +#~ msgstr "JB8" + +#~ msgid "JB9" +#~ msgstr "JB9" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Network host \\\"%s\\\" is busy; will retry in %d seconds." +#~ msgstr "" +#~ "A(z) „%s” hálózati kiszolgáló elfoglalt, %d másodperc múlva " +#~ "újrapróbálkozom." + +#~ msgid "Network printer \\\"%s\\\" is busy." +#~ msgstr "A(z) „%s” hálózati nyomtató elfoglalt." + +#~ msgid "Network printer \\\"%s\\\" is not responding." +#~ msgstr "A(z) „%s” hálózati nyomtató nem válaszol." + +#~ msgid "Printer busy; will retry in 10 seconds." +#~ msgstr "Nyomtató elfoglalt; 10 másodperc múlva újrapróbálkozom." + +#~ msgid "Printer did not respond after %d seconds." +#~ msgstr "A nyomtató nem válaszolt %d másodperc után." + +#~ msgid "The printer is almost out of ink." +#~ msgstr "A nyomtatóból majdnem kifogyott a tinta." + +#~ msgid "The printer is low on toner." +#~ msgstr "A nyomtatóban kifogyóban van a festékkazetta." + +#~ msgid "The printer is out of toner." +#~ msgstr "A nyomtató festékkazettája kifogyott." + +#~ msgid "This printer does not conform to the IPP standard and may not work." +#~ msgstr "" +#~ "Ez a nyomtató nem felel meg az IPP szabványnak, és lehet, hogy nem fog " +#~ "működni." + +#~ msgid "" +#~ "This printer does not conform to the IPP standard. Please contact the " +#~ "manufacturer of your printer for assistance." +#~ msgstr "" +#~ "Ez a nyomtató nem felel meg az IPP szabványnak. Segítségért keresse meg a " +#~ "nyomtató gyártóját." + +#~ msgid "Unable to add file to job: %s" +#~ msgstr "Nem vehető fel a fájl a feladatba: %s" + +#~ msgid "Unable to connect to server" +#~ msgstr "A kiszolgálóhoz nem lehet kapcsolódni." + +#~ msgid "Unable to get job attributes: %s" +#~ msgstr "Nem kérhetők le a feladat attribútumai: %s" + +#~ msgid "Unable to get print job status." +#~ msgstr "Nem kérhető le a nyomtatási feladat állapota." + +#~ msgid "Unable to get printer status: %s" +#~ msgstr "Nem kérhető le a nyomtató állapota: %s" + +#~ msgid "\\t%s" +#~ msgstr "\\t%s" + +#~ msgid "\\tno entries" +#~ msgstr "\\tnincs bejegyzés" diff --git a/locale/cups_id.po b/locale/cups_id.po new file mode 100644 index 0000000..3f5671c --- /dev/null +++ b/locale/cups_id.po @@ -0,0 +1,8556 @@ +# translation of cups_id.po to Bahasa Indonesia +# +# "$Id$" +# +# Message catalog template for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# Citra Paska , 2008, 2009. +# +# Notes for Translators: +# +# The following prefixes MUST NOT be translated: "ALERT:", "CRIT:", "INFO:", +# "NOTICE:", and "WARNING:". +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# +msgid "" +msgstr "" +"Project-Id-Version: cups_id\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-09-29 05:17+0700\n" +"Last-Translator: Citra Paska \n" +"Language-Team: Bahasa Indonesia\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Generator: KBabel 1.11.4\n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milimeter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f hingga %.0f x %.0f milimeter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f inci" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f hingga %.2f x %.2f inci" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s tidak bisa diubah." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 inci/det." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 inci/det." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 inci/det." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/det." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 inci/det." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 inci/det." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/det." + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/det." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/det." + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 inci/det." + +msgid "2-Sided Printing" +msgstr "2-Sisi Pencetakan" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1.00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 inci/det." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/det." + +msgid "200 mm/sec." +msgstr "200 mm/det." + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Seri 24-Pin" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/det." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 inci/det." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Diska 3,5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Diska 3.5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/det." + +msgid "300 mm/sec." +msgstr "300 mm/det." + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 inci/det." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/det." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 inci/det." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 inci/det." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/det." + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 inci/det." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 inci/det." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/det." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 inci/det." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Seri 9-Pin" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Terima Tugas" + +msgid "Accepted" +msgstr "Diterima" + +msgid "Add Class" +msgstr "Tambah Kelas" + +msgid "Add Printer" +msgstr "Tambah Pencetak" + +msgid "Add RSS Subscription" +msgstr "Tambah Subskripsi RSS" + +msgid "Address" +msgstr "Alamat" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Alamat - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administrasi" + +msgid "Always" +msgstr "Selalu" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplikator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "" + +msgid "Bad OpenGroup" +msgstr "OpenGroup Jelek" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI Jelek" + +msgid "Bad OrderDependency" +msgstr "OrderDependency Jelek" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Permintaan Jelek" + +msgid "Bad SNMP version number" +msgstr "Nomor versi SNMP jelek" + +msgid "Bad UIConstraints" +msgstr "UIConstraints Jelek" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Nilai rangkap %d jelek." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Parameter ubahan jelek" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Nilai number-up %d jelek." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Nilai page-ranges %d-%d jelek." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Pataka" + +msgid "Billing Information: " +msgstr "Informasi Tagihan: " + +msgid "Bond Paper" +msgstr "Kertas Surat" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "" + +msgid "Cancel RSS Subscription" +msgstr "Batal Subskripsi RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Ubah Pengaturan" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Kelas" + +msgid "Clean Print Heads" +msgstr "Bersihkan Kepala Pencetak" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Warna" + +msgid "Color Mode" +msgstr "Modus Warna" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Nama komunitas memiliki panjang tak terdefinisi" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Lanjut" + +msgid "Continuous" +msgstr "Terus-menerus" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Dibuat" + +msgid "Created On: " +msgstr "Dibuat Pada: " + +msgid "Custom" +msgstr "Ubahan" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Potong" + +msgid "Cutter" +msgstr "Pemotong" + +msgid "Dark" +msgstr "Gelap" + +msgid "Darkness" +msgstr "Gelap" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Hapus Kelas" + +msgid "Delete Printer" +msgstr "Hapus Pencetak" + +msgid "Description: " +msgstr "Deskripsi: " + +msgid "DeskJet Series" +msgstr "Seri Deskjet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Tujuan \"%s\" bukanlah tugas yang diterima." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Media Termal Langsung" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Dinonaktifkan" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nama Penggerak: " + +msgid "Driver Version: " +msgstr "Versi Penggerak: " + +msgid "Duplexer" +msgstr "Pendupleks" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 Pencetak Label" + +msgid "EPL2 Label Printer" +msgstr "EPL2 Pencetak Label" + +msgid "Edit Configuration File" +msgstr "Sunting Berkas Konfigurasi" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Akhir Pataka" + +msgid "English" +msgstr "Indonesian" + +msgid "Enter old password:" +msgstr "Masukkan sandi lama:" + +msgid "Enter password again:" +msgstr "Masukkan lagi sandinya:" + +msgid "Enter password:" +msgstr "Masukkan sandi:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Masukkan nama pengguna dan sandi Anda atau nama pengguna dan sandi root " +"untuk mengakses halaman ini. Apabila Anda menggunakan otentikasi Kerberos, " +"pastikan bahwa Anda memiliki tiket Kerberos yang sah." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Amplop Feed" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Polis Kesalahan" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Tiap 10 Label" + +msgid "Every 2 Labels" +msgstr "Tiap 2 Label" + +msgid "Every 3 Labels" +msgstr "Tiap 3 Label" + +msgid "Every 4 Labels" +msgstr "Tiap 4 Label" + +msgid "Every 5 Labels" +msgstr "Tiap 5 Label" + +msgid "Every 6 Labels" +msgstr "Tiap 6 Label" + +msgid "Every 7 Labels" +msgstr "Tiap 7 Label" + +msgid "Every 8 Labels" +msgstr "Tiap 8 Label" + +msgid "Every 9 Labels" +msgstr "Tiap 9 Label" + +msgid "Every Label" +msgstr "Tiap Label" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "" + +msgid "Export Printers to Samba" +msgstr "Ekspor Pencetak melalui Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Map" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Map - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Terlarang" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Umum" + +msgid "Generic" +msgstr "Umum" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU memiliki panjang tak terdefinisi" + +msgid "Glossy Paper" +msgstr "Kertas Glosi" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Skala Abu-abu" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Map Gantung" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Map Gantung - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Karakter kontrol ilegal" + +msgid "Illegal main keyword string" +msgstr "String kata kunci utama ilegal" + +msgid "Illegal option keyword string" +msgstr "String opsi kata kunci ilegal" + +msgid "Illegal translation string" +msgstr "String translasi ilegal" + +msgid "Illegal whitespace character" +msgstr "" + +msgid "Installable Options" +msgstr "" + +msgid "Installed" +msgstr "" + +msgid "IntelliBar Label Printer" +msgstr "Pencetak Label IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "Kesalahan Internal Server" + +msgid "Internal error" +msgstr "Kesalahan internal" + +msgid "Internet Postage 2-Part" +msgstr "Perangko Internet 2-Bagian" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Perangko Internet 2-Bagian - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Perangko Internet 3-Bagian" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Perangko Internet 3-Bagian - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Protokol Cetak Internet" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Tugas #%d telah dibatalkan - tidak bisa dibatalkan lagi." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Tugas #%d sudah dibatalkan - tidak bisa dibatalkan lagi." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Tugas #%d sudah diselesaikan - tidak bisa dibatalkan." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Tugas Diselesaikan" + +msgid "Job Created" +msgstr "Tugas Dibuat" + +msgid "Job ID: " +msgstr "ID Tugas: " + +msgid "Job Options Changed" +msgstr "Perubahan Opsi Tugas" + +msgid "Job Stopped" +msgstr "Tugas Dihentikan" + +msgid "Job UUID: " +msgstr "UUID Tugas: " + +msgid "Job is completed and cannot be changed." +msgstr "Tugas sudah diselesaikan dan tidak bisa diubah." + +msgid "Job operation failed:" +msgstr "Operasi tugas gagal:" + +msgid "Job state cannot be changed." +msgstr "Status tugas tidak bisa diubah." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Tugas" + +msgid "LPD/LPR Host or Printer" +msgstr "Host atau Pencetak LPD/LPR" + +msgid "Label Printer" +msgstr "Pencetak Label" + +msgid "Label Top" +msgstr "Label Atas" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Alamat Besar" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Alamat Besar - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "Seri LaserJet PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Cahaya" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Baris melebihi panjang yang diperbolehkan (255 karakter)" + +msgid "List Available Printers" +msgstr "Daftar Pencetak yang Tersedia" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Lokasi: " + +msgid "Long-Edge (Portrait)" +msgstr "Sisi Panjang (Tegak)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Pembuat dan Model: " + +msgid "Manual Feed" +msgstr "" + +msgid "Media Dimensions: " +msgstr "Dimensi Media: " + +msgid "Media Limits: " +msgstr "Batas Media: " + +msgid "Media Name: " +msgstr "Nama Media: " + +msgid "Media Size" +msgstr "Ukuran Media" + +msgid "Media Source" +msgstr "Sumber Media" + +msgid "Media Tracking" +msgstr "" + +msgid "Media Type" +msgstr "Jenis Media" + +msgid "Medium" +msgstr "" + +msgid "Memory allocation error" +msgstr "Kesalahan alokasi memori" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Kehilangan tajuk PPD-Adobe-4.x" + +msgid "Missing asterisk in column 1" +msgstr "Kehilangan asterik pada kolom 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Kehilangan string nilai" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Ubah Kelas" + +msgid "Modify Printer" +msgstr "Ubah Pencetak" + +msgid "Move All Jobs" +msgstr "Pindah Semua Tugas" + +msgid "Move Job" +msgstr "Pindah Tugas" + +msgid "Moved Permanently" +msgstr "Dipindahkan Permanen" + +msgid "NULL PPD file pointer" +msgstr "" + +msgid "Name OID uses indefinite length" +msgstr "Nama OID memiliki panjang tak terdefinisi" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Tidak Pernah" + +msgid "New Stylus Color Series" +msgstr "Seri Stylus Color Baru" + +msgid "New Stylus Photo Series" +msgstr "Seri Stylus Photo Baru" + +msgid "No" +msgstr "Tidak" + +msgid "No Content" +msgstr "Tak Ada Isi" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Tidak ada VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Tidak ada koneksi yang aktif" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Tidak ada nama komunitas" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Tidak ada tujuan yang ditambah." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Tidak ada error-index" + +msgid "No error-status" +msgstr "Tidak ada error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Tidak ada nama OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Tidak ada request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Tidak ada subskripsi yang ditemukan." + +msgid "No variable-bindings SEQUENCE" +msgstr "Tidak ada variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Tidak ada nomor versi" + +msgid "Non-continuous (Mark sensing)" +msgstr "Tak bersambungan (Penanda)" + +msgid "Non-continuous (Web sensing)" +msgstr "Tak bersambungan (Web)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Tidak Ketemu" + +msgid "Not Implemented" +msgstr "Tidak Diimplementasikan" + +msgid "Not Installed" +msgstr "Tidak Terpasang" + +msgid "Not Modified" +msgstr "Tidak Diubah" + +msgid "Not Supported" +msgstr "Tidak Didukung" + +msgid "Not allowed to print." +msgstr "Tidak diperbolehkan mencetak." + +msgid "Note" +msgstr "Catatan" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "Oke" + +msgid "Off (1-Sided)" +msgstr "Mati (1-Sisi)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Bantuan Langsung" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Gagal membuka %s: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup tanpa CloseGroup lebih dulu" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI tanpa CloseUI/JCLCloseUI lebih dulu" + +msgid "Operation Policy" +msgstr "Polis Operasi" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Opsi yang Terpasang" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opsi: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Modus Keluaran" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Pencetak Laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Paket tidak mengandung Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Paket tidak dimulai dengan SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Sandi untuk %s pada %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Sandi untuk %s diperlukan untuk mengakses %s via SAMBA: " + +msgid "Pause Class" +msgstr "Tahan Kelas" + +msgid "Pause Printer" +msgstr "Tahan Pencetak" + +msgid "Peel-Off" +msgstr "" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Label Foto" + +msgid "Plain Paper" +msgstr "Kertas Biasa" + +msgid "Policies" +msgstr "Kebijakan" + +msgid "Port Monitor" +msgstr "Port Monitor" + +msgid "PostScript Printer" +msgstr "Pencetak PostScript" + +msgid "Postcard" +msgstr "Kartu Pos" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Densitas Cetak" + +msgid "Print Job:" +msgstr "Tugas Cetak:" + +msgid "Print Mode" +msgstr "Modus Cetak" + +msgid "Print Rate" +msgstr "" + +msgid "Print Self-Test Page" +msgstr "Cetak Halaman Uji-Mandiri" + +msgid "Print Speed" +msgstr "Kecepatan Cetak" + +msgid "Print Test Page" +msgstr "Cetak Halaman Uji" + +msgid "Print and Cut" +msgstr "Cetak dan Potong" + +msgid "Print and Tear" +msgstr "" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Dicetak Untuk: " + +msgid "Printed From: " +msgstr "Dicetak Dari: " + +msgid "Printed On: " +msgstr "Dicetak Pada: " + +msgid "Printer Added" +msgstr "Pencetak Ditambah" + +msgid "Printer Default" +msgstr "Pencetak Utama" + +msgid "Printer Deleted" +msgstr "Pencetak Dihapus" + +msgid "Printer Modified" +msgstr "Pencetak Diubah" + +msgid "Printer Name: " +msgstr "Nama Pencetak: " + +msgid "Printer Paused" +msgstr "Pencetak Ditahan" + +msgid "Printer Settings" +msgstr "Pengaturan Pencetak" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Pencetak:" + +msgid "Printers" +msgstr "Pencetak" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Membersihkan Tugas" + +msgid "Quarto" +msgstr "Kuarto" + +msgid "Quota limit reached." +msgstr "Batas kuota telah dicapai." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Tolak Tugas" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Cetak Ulang Usai Kesalahan" + +msgid "Request Entity Too Large" +msgstr "Entitas Pesanan Terlalu Besar" + +msgid "Resolution" +msgstr "Resolusi" + +msgid "Resume Class" +msgstr "" + +msgid "Resume Printer" +msgstr "" + +msgid "Return Address" +msgstr "Alamat Pengembalian" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Alamat Pengembalian - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Ulang" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE memiliki panjang tak terdefinisi" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Lihat Lainnya" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Port Serial #%d" + +msgid "Server Restarted" +msgstr "Server Dijalankan Ulang" + +msgid "Server Security Auditing" +msgstr "Audit Sekuritas Server" + +msgid "Server Started" +msgstr "Server Dijalankan" + +msgid "Server Stopped" +msgstr "Server Dihentikan" + +msgid "Service Unavailable" +msgstr "Layanan Tak Tersedia" + +msgid "Set Allowed Users" +msgstr "Atur Pengguna yang Boleh" + +msgid "Set As Server Default" +msgstr "Atur Sebagai Baku Server" + +msgid "Set Class Options" +msgstr "Atur Opsi Kelas" + +msgid "Set Printer Options" +msgstr "Atur Opsi Pencetak" + +msgid "Set Publishing" +msgstr "Atur Penerbitan" + +msgid "Shipping Address" +msgstr "Alamat Pengiriman" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Alamat Pengiriman - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Sisi-Pendek (Mendatar)" + +msgid "Special Paper" +msgstr "Kertas Khusus" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standar" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Menjalankan Pataka" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Pernyataan" + +msgid "Stylus Color Series" +msgstr "Seri Stylus Color" + +msgid "Stylus Photo Series" +msgstr "Seri Stylus Photo" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Berpindah Protokol" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "" + +msgid "Tear-Off" +msgstr "" + +msgid "Tear-Off Adjust Position" +msgstr "" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Berkas PPD \"%s\" tak bisa ditemukan." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Berkas PPD \"%s\" tak bisa dibuka: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Nama kelas paling banyak 127 karakter cetak dan tidak mengandung spasi, " +"garis miring (/), atau pun tanda pagar (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Atribut notify-lease-duration tak bisa digunakan bersama subskripsi tugas." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Nama pencetak paling banyak 127 karakter cetak dan tidak mengandung spasi, " +"garis miring (/), atau tanda pagar (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Terdapat karakter tidak sah pada printer-uri \"%s\"." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"Bentuk printer-uri seharusnya menuruti format \"ipp://HOSTNAME/classes/" +"CLASSNAME\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"Bentuk printer-uri seharusnya menuruti format \"ipp://HOSTNAME/printers/" +"PRINTERNAME\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Nama subskripsi tidak bisa mengandung spasi, garis miring (/), tanda tanya " +"(?), atau tanda pagar (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Terlalu banyak subskripsi." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "" + +msgid "Title: " +msgstr "Judul: " + +msgid "Too many active jobs." +msgstr "Terlalu banyak tugas yang aktif." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparansi" + +msgid "Tray" +msgstr "Baki" + +msgid "Tray 1" +msgstr "Baki 1" + +msgid "Tray 2" +msgstr "Baki 2" + +msgid "Tray 3" +msgstr "Baki 3" + +msgid "Tray 4" +msgstr "Baki 4" + +msgid "URI Too Long" +msgstr "URI Terlalu Panjang" + +msgid "US Ledger" +msgstr "Ledger AS" + +msgid "US Legal" +msgstr "Legal AS" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "Kuarto AS" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Port Serial USB #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Tidak bisa mengakses berkas cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Tidak bisa menambah subskripsi RSS:" + +msgid "Unable to add class:" +msgstr "Tidak bisa menambah kelas:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Tidak bisa menambah pencetak:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Tidak bisa membatalkan subskripsi RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Tidak bisa mengubah atribut printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Tidak bisa mengubah pencetak:" + +msgid "Unable to change server settings:" +msgstr "Tidak bisa mengubah pengaturan server:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Tidak bisa terhubung ke host." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Tidak bisa membuat berkas temporer:" + +msgid "Unable to delete class:" +msgstr "Tidak bisa menghapus kelas:" + +msgid "Unable to delete printer:" +msgstr "Tidak bisa menghapus pencetak:" + +msgid "Unable to do maintenance command:" +msgstr "" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Tidak bisa memperoleh daftar kelas:" + +msgid "Unable to get class status:" +msgstr "Tidak bisa memperoleh status kelas:" + +msgid "Unable to get list of printer drivers:" +msgstr "Tidak bisa memperoleh daftar penggerak pencetak:" + +msgid "Unable to get printer attributes:" +msgstr "Tidak bisa memperoleh atribut pencetak:" + +msgid "Unable to get printer list:" +msgstr "Tidak bisa memperoleh daftar pencetak:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Tidak bisa memperoleh status pencetak:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Tidak bisa mengubah kelas:" + +msgid "Unable to modify printer:" +msgstr "Tidak bisa mengubah pencetak" + +msgid "Unable to move job" +msgstr "Tidak bisa memindahkan tugas" + +msgid "Unable to move jobs" +msgstr "Tidak bisa memindahkan tugas" + +msgid "Unable to open PPD file" +msgstr "Tidak bisa membuka berkas PPD" + +msgid "Unable to open PPD file:" +msgstr "Tidak bisa membuka berkas PPD:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Tidak bisa membuka berkas cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Tidak bisa mencetak halaman uji:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Tidak bisa mengeset opsi:" + +msgid "Unable to set server default:" +msgstr "" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Tidak bisa mengunggah berkas cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Terlarang" + +msgid "Units" +msgstr "Unit" + +msgid "Unknown" +msgstr "Tak Dikenal" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "printer-error-policy \"%s\" tak dikenal." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "printer-op-policy \"%s\" tak dikenal." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Jenis nilai tak didukung" + +msgid "Upgrade Required" +msgstr "Diperlukan Naik-Tingkat" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Value memiliki panjang tak terdefinisi" + +msgid "VarBind uses indefinite length" +msgstr "VarBind memiliki panjang tak terdefinisi" + +msgid "Version uses indefinite length" +msgstr "Version memiliki panjang tak terdefinisi" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ya" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Anda harus mengakses halaman ini melalui URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Pencetak Label ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "digagalkan" + +msgid "canceled" +msgstr "dibatalkan" + +msgid "completed" +msgstr "diselesaikan" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced gagal dieksekusi." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd gagal dieksekusi." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index memiliki panjang tak terdefinisi" + +msgid "error-status uses indefinite length" +msgstr "error-status memiliki panjang tak terdefinisi" + +msgid "held" +msgstr "ditahan" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "menganggur" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "tunda" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "memproses" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id memiliki panjang tak terdefinisi" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "status dari %s gagal: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "dihentikan" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "tak dikenal" + +msgid "untitled" +msgstr "tak berjudul" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings memiliki panjang tak terdefinisi" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(semua)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(nihil)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d entri\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tUsai kesalahan: lanjut\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tPeringatan:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner diperlukan\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tSet karakter:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tKoneksi: langsung\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tKoneksi: jarak jauh\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tUkuran halaman utama:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tTiti utama:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tPengaturan port utama:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDeskripsi: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormulir yang diakuisisi:\n" +#~ "\tJenis isi: apa saja\n" +#~ "\tJenis pencetak: tak dikenal\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormulir yang diperbolehkan:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tAntarmuka: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tAntarmuka: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tAntarmuka: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tLokasi: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tSaat gagal: tanpa peringatan\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tPengguna yang diperbolehkan:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tPengguna yang dilarang:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tjurik hadir\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\ttidak ada entri\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tpencetak pada perangkat '%s' kecepatan -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tproses cetak dinonaktifkan\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tproses cetak diaktifkan\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tantrian untuk %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tantrian dinonaktifkan\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tantrian diaktifkan\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\talasan tak dikenal\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " DETIL HASIL KECOCOKAN TES\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Halaman 15, seksi 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Halaman 15, seksi 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Halaman 19, seksi 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Halaman 20, seksi 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Halaman 27, seksi 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Halaman 42, seksi 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Halaman 16-17, seksi 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Halaman 42-45, seksi 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Halaman 45-46, seksi 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Halaman 48-49, seksi 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Halaman 52-54, seksi 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f bita\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" konflik dengan \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s tidak memiliki opsi yang berkorespondensi!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s berbagi prefiks umum dengan %s\n" +#~ " REF: Halaman 15, seksi 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Pilihan utama mengalam konflik!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Opsi kata kunci Duplex %s mungkin tidak bekerja seperti " +#~ "yang diharapkan dan seharusnya dinamai Duplex!\n" +#~ " REF: Halaman 122, seksi 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Berkas memiliki campuran CR, LF, dan CR LF pada akhir " +#~ "baris!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding diperlukan oleh spesifikasi PPD 4.3.\n" +#~ " REF: Halaman 56-57, seksi 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Baris %d hanya mengandung spasi!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Manufacturer diperlukan oleh spesifikasi PPD 4.3.\n" +#~ " REF: Halaman 58-59, seksi 5.3.\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN Berkas PPD non-Windows seharusnya hanya berakhir baris " +#~ "LF, bukan CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN PPD versi %.1f telah usang!\n" +#~ " REF: Halaman 42, seksi 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName lebih panjang dari 8.3 melanggar spesifikasi " +#~ "PPD.\n" +#~ " REF: Halaman 61-62, seksi 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols mengandung PJL tetapi atribut JCL tidak diset.\n" +#~ " REF: Halaman 78-79, seksi 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols mengandung PJL dan BCP; diharapkan TBCP.\n" +#~ " REF: Halaman 78-79, seksi 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName diperlukan oleh spesifikasi PPD 4.3.\n" +#~ " REF: Halaman 64-65, seksi 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s tidak ada!\n" + +#~ msgid " %s %s file \"%s\" has the wrong capitalization!\n" +#~ msgstr " %s %s berkas \"%s\" memiliki kapitalisasi yang salah!\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s UTF-8 jelek \"%s\" string translasi untuk opsi %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s UTF-8 jelek \"%s\" string translasi untuk opsi %s, pilihan %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Nilai cupsFilter jelek \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s cupsICCProfile jelek \"%s\"!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Nilai cupsPreFilter jelek \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s cupsUIConstraints jelek %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Bahasa jelek \"%s\"!\n" + +#~ msgid " %s Bad spelling of %s - should be %s!\n" +#~ msgstr " %s Ejaan dari %s jelek - seharusnya %s!\n" + +#~ msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID!\n" +#~ msgstr "" +#~ " %s Tidak dapat menyediakan APScanAppPath dan APScanAppBundleID!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints %s kosong!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Kehilangan \"%s\" string translasi untuk opsi %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Kehilangan \"%s\" string translasi untuk opsi %s, pilihan %s!\n" + +#~ msgid " %s Missing APDialogExtension file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas APDialogExtension \"%s\"\n" + +#~ msgid " %s Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas APPrinterIconPath \"%s\"\n" + +#~ msgid " %s Missing APPrinterLowInkTool file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas APPrinterLowInkTool \"%s\"\n" + +#~ msgid " %s Missing APPrinterUtilityPath file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas APPrinterUtilityPath \"%s\"\n" + +#~ msgid " %s Missing APScanAppPath file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas APScanAppPath \"%s\"\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageRegion option!\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " %s Kehilangan opsi PageRegion yang DIPERLUKAN!\n" +#~ " REF: Halaman 100, seksi 5.14.\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageSize option!\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " %s Kehilangan opsi PageSize yang DIPERLUKAN!\n" +#~ " REF: Halaman 99, seksi 5.14.\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Kehilangan pilihan *%s %s dalam UIConstraints \"*%s %s *%s %s" +#~ "\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Kehilangan pilihan *%s %s dalam cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas cupsFilter \"%s\"\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Kehilangan berkas cupsICCProfile \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Kehilangan berkas cupsPreFilter \"%s\"\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Kehilangan cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Kehilangan opsi %s dalam UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Kehilangan opsi %s dalam cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr "" +#~ " %s Tidak ada basis translasi \"%s\" yang disertakan pada berkas!\n" + +#~ msgid "" +#~ " %s Non-standard size name \"%s\"!\n" +#~ " REF: Page 187, section B.2.\n" +#~ msgstr "" +#~ " %s Nama ukuran nonstandar \"%s\"!\n" +#~ " REF: Halaman 187, seksi B.2.\n" + +#~ msgid " %s Size \"%s\" defined for %s but not for %s!\n" +#~ msgstr " %s Ukuran \"%s\" ditentukan untuk %s bukan untuk %s!\n" + +#~ msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)!\n" +#~ msgstr "" +#~ " %s Ukuran \"%s\" memiliki dimensi yang tak diharapkan (%gx%g)!\n" + +#~ msgid "" +#~ " %s cupsUIResolver %s does not list at least two different " +#~ "options!\n" +#~ msgstr "" +#~ " %s cupsUIResolver %s tidak menyediakan setidaknya dua opsi " +#~ "berbeda!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s nama yang dipilih %s dan %s berbeda hanya pada besar/" +#~ "kecilnya huruf!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s seharusnya 1284DeviceID!\n" +#~ " REF: Halaman 72, seksi 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** Default%s %s JELEK\n" +#~ " REF: Halaman 40, seksi 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultImageableArea %s JELEK!\n" +#~ " REF: Halaman 102, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultPaperDimension %s JELEK!\n" +#~ " REF: Halaman 103, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** Atribut JobPatchFile JELEK dalam berkas\n" +#~ " REF: Halaman 24, seksi 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Manufacturer JELEK (seharusnya \"HP\")\n" +#~ " REF: Halaman 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Manufacturer JELEK (seharusnya \"Oki\")\n" +#~ " REF: Halaman 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ModelName JELEK - \"%c\" tidak diperbolehkan dalam " +#~ "string.\n" +#~ " REF: Halaman 59-60, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PSVersion JELEK - bukan \"(string) int\".\n" +#~ " REF: Halaman 62-64, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Product JELEK - bukan \"(string)\".\n" +#~ " REF: Halaman 62, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ShortNickName JELEK - lebih dari 31 karakter.\n" +#~ " REF: Halaman 64-65, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FileVersion \"%s\" jelek\n" +#~ " REF: Halaman 56, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FormatVersion \"%s\" jelek\n" +#~ " REF: Halaman 56, seksi 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **FAIL** LanguageEncoding %s jelek - seharusnya ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** LanguageVersion %s jelek - seharusnya English!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **FAIL** Kode opsi utama tidak bisa diinterpretasikan: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** String translasi utama untuk opsi %s pilihan %s " +#~ "mengandung karakter 8-bit!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** String translasi utama untuk opsi %s mengandung karakter " +#~ "8-bit!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Nama kelompok %s dan %s berbeda hanya besar/kecilnya " +#~ "huruf!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Terjadi ganda dari %s nama yang dipilih %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Nama opsi %s dan %s berbeda hanya besar/kecilnya huruf!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN Default%s\n" +#~ " REF: Halaman 40, seksi 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN DefaultImageableArea\n" +#~ " REF: Halaman 102, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN DefaultPaperDimension\n" +#~ " REF: Halaman 103, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN FileVersion\n" +#~ " REF: Halaman 56, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN FormatVersion\n" +#~ " REF: Halaman 56, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN ImageableArea untuk PageSize %s\n" +#~ " REF: Halaman 41, seksi 5.\n" +#~ " REF: Halaman 102, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN LanguageEncoding\n" +#~ " REF: Halaman 56-57, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN LanguageVersion\n" +#~ " REF: Halaman 57-58, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN Manufacturer\n" +#~ " REF: Halaman 58-59, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN ModelName\n" +#~ " REF: Halaman 59-60, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN NickName\n" +#~ " REF: Halaman 60, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PCFileName\n" +#~ " REF: Halaman 61-62, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PSVersion\n" +#~ " REF: Halaman 62-64, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PageRegion\n" +#~ " REF: Halaman 100, seksi 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PageSize\n" +#~ " REF: Halaman 41, seksi 5.\n" +#~ " REF: Halaman 99, seksi 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PageSize\n" +#~ " REF: Halaman 99-100, seksi 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN PaperDimension untuk PageSize %s\n" +#~ " REF: Halaman 41, seksi 5.\n" +#~ " REF: Halaman 103, seksi 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN Product\n" +#~ " REF: Halaman 62, seksi 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** DIPERLUKAN ShortNickName\n" +#~ " REF: Halaman 64-65, seksi 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d KESALAHAN DITEMUKAN\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " %%%%BoundingBox jelek: pada baris %d!\n" +#~ " REF: Halaman 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Baris %d lebih dari 255 karakter (%d)!\n" +#~ " REF: Halaman 25, Line Length (Panjang Baris)\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " Kehilangan %!PS-Adobe-3.0 pada baris pertama!\n" +#~ " REF: Halaman 17, 3.1 Conforming Documents (Menyesuaikan Dokumen)\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Kehilangan komentar %%EndComments!\n" +#~ " REF: Halaman 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Kehilangan atau %%BoundingBox jelek: komentar!\n" +#~ " REF: Halaman 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Kehilangan atau %%Page jelek: komentar!\n" +#~ " REF: Halaman 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Kehilangan atau %%Pages jelek: komentar!\n" +#~ " REF: Halaman 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " TIDAK ADA KESALAHAN\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Menemukan %d baris yang melebihi 255 karakter!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Terlalu banyak komentar %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Terlalu banyak komentar %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Peringatan: berkas mengandung data biner!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Peringatan: tidak ada komentar %%EndComments dalam berkas!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Peringatan: DSC usang versi %.1f dalam berkas!\n" + +#~ msgid " FAIL\n" +#~ msgstr " GAGAL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " GAGAL\n" +#~ " **FAIL** Tidak bisa membuka berkas PPD - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " GAGAL\n" +#~ " **FAIL** Tidak bisa membuka berkas PPD - %s pada baris %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " LEWAT\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Amplop" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Amplop" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Amplop" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Amplop" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Amplop" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bita\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bita\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s menerima permintaan sejak %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s tidak diimplementasikan oleh versi lpc CUPS.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s tidak siap\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s siap\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s siap dan sedang mencetak\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s tidak menerima permintaan sejak %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s tidak didukung!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s menerima permintaan sejak %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s tidak menerima permintaan sejak %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [tugas %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s gagal: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Tidak tahu apa yang hendak dikerjakan!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Kesalahan - Nama variabel lingkungan %s sebenarnya tidak ada \"%s\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Kesalahan - ID tugas jelek!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Kesalahan - tidak bisa mencetak dan mengubah tugas secara bersamaan!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Kesalahan - tidak bisa mencetak dari stdin apabila berkas atau ID " +#~ "tugas disediakan!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan set karakter usai opsi '-S'!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan jenis konten usai opsi '-T'!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan banyaknya rangkap usai opsi '-n'!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "" +#~ "%s: Kesalahan - diharapkan banyak hitungan rangkap usai opsi '-#'!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan target usai opsi '-P'!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan target usai opsi '-b'!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan target usai opsi '-d'!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan formulir usai opsi '-f'!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama yang ditahan usai opsi '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama host usai opsi '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama host usai opsi '-h'!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan daftar modus usai opsi '-y'!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama usai opsi '-%c'!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan opsi string usai opsi '-o'!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan daftar halaman usai opsi '-P'!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan prioritas usai opsi '-%c'!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan teks alasan usai opsi '-r'!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan judul usai opsi '-t'!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama pengguna usai opsi '-U'!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nama pengguna usai opsi '-u'!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Kesalahan - diharapkan nilai usai opsi '-%c'!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Kesalahan - diperlukan \"completed\", \"not-completed\", atau \"all\" " +#~ "usai opsi '-W'!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Kesalahan - tidak tersedia tujuan utama.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Kesalahan - prioritas harus antara 1 dan 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Kesalahan - penjadwal tidak merespon!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Kesalahan - terlalu banyak berkas - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Kesalahan - tidak bisa mengakses \"%s\" - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Kesalahan - tujuan tak dikenal \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Kesalahan - tujuan tak dikenal \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Kesalahan - opsi tak dikenal '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Kesalahan - opsi '%s' tak dikenal!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Diharapkan ID tugas usai opsi '-i'!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Penyaring \"%s\" tak tersedia: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Nama tujuan tidak sah pada daftar \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: String penyaring \"%s\" tidak sah\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Memerlukan ID tugas ('-i jobid') sebelum '-H restart'!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Tidak ada penyaring untuk konversi dari %s/%s ke %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Operasi gagal: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Maaf, tidak ada dukungan enkripsi yang dikompilasi serta!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Tidak bisa terhubung ke server\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Tidak bisa mengontak server!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Tidak bisa menentukan jenis MIME dari \"%s\"!\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Tidak bisa membuka %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Tidak bisa membuka berkas PPD: %s pada baris %d\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d.\n" +#~ msgstr "%s: Tidak bisa membuka berkas PPD: %s pada baris %d.\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Tak dapat membaca basis data MIME dari \"%s\" atau \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Tujuan tak dikenal \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Jenis MIME yang dituju tak dikenal %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Opsi tak dikenal '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Sumber jenis MIME tak dikenal %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Peringatan - format peubah '%c' tidak didukung - keluaran yang " +#~ "dihasilkan mungkin tak tepat!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Peringatan - opsi set karakter diabaikan!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Peringatan - opsi jenis konten diabaikan!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Peringatan - opsi formulir diabaikan!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Peringatan - opsi modus diabaikan!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: kesalahan - nama variabel lingkungan %s merupakan tujuan yang tidak " +#~ "ada \"%s\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: kesalahan - diharapkan opsi=nilai usai opsi '-o'!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: kesalahan - tidak ada tujuan utama.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Diperlukan sandi Samba untuk mengekspor penggerak pencetak!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Diperlukan nama pengguna Samba untuk mengekspor penggerak pencetak!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Kelas bernama \"%s\" sudah ada!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Pencetak bernama \"%s\" sudah ada!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (Besar)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (Besar)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (Kecil)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (Besar)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Kelompok atribut di luar jangkauan (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "URI perangkat \"%s\" jelek!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "device-uri \"%s\" jelek!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Skema device-uri \"%s\" jelek!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "document-format \"%s\" jelek!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Nama berkas penyangga jelek!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Atribut huruf jelek: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Nilai job-priority jelek!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Nilai job-sheets \"%s\" jelek!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Jenis nilai job-sheets jelek!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Nilai job-state jelek!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Atribut job-uri \"%s\" jelek!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "notify-pull-method \"%s\" jelek!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "URI notify-recipient-uri \"%s\" jelek!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Opsi + yang dipilih pada baris %d jelek!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "port-monitor \"%s\" jelek!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Nilai printer-state %d jelek!" + +#~ msgid "Bad request ID %d!" +#~ msgstr "ID permintaan %d jelek!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "ID subskripsi jelek!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 Amplop" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 Amplop" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 Amplop" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 Amplop" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 Amplop" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 Amplop" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 Amplop" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 Amplop" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 Amplop" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Set karakter \"%s\" tidak didukung!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 Amplop" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 Amplop" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Perintah bisa saja singkat. Perintahnya:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Tidak akan memindai jenis \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Penutup terbuka." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL Amplop" + +#~ msgid "Developer almost empty." +#~ msgstr "Developer hampir kosong." + +#~ msgid "Developer empty!" +#~ msgstr "Developer kosong!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Perangkat: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokumen %d tidak ditemukan di tugas %d." + +#~ msgid "Door open." +#~ msgstr "Pintu terbuka." + +#~ msgid "Double Postcard" +#~ msgstr "Kartu Pos Ganda" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Tidak bisa mengalokasikan memori untuk halaman info: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Tidak bisa mengalokasikan memori untuk larik halaman: %s\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Berkas perangkat SCSI \"%s\" jelek!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Berkas set karakter %s jelek\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Jenis set karakter %s jelek\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Nilai kolom %d jelek!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Nilai cpi %f jelek!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Baris deskripsi huruf: %s jelek\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Nilai lpi %f jelek!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Pengaturan halaman jelek!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Arah teks %s jelek\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Lebar teks %s jelek\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Pencetak yang dituju tidak ada!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Mencetak berkas kosong!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Kesalahan %d mengirim permintaan PAPSendData: %s\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Kesalahan fatal USB!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Ketidaksahan HP-GL/2 komentar terlihat, tak bisa mencetak berkas!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "" +#~ "ERROR: Kehilangan nilai pada baris %d dari berkas pataka (banner)!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Memerlukan baris msgid sebelum string translasi pada baris %d dari " +#~ "%s!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Tak ditemukan URI perangkat pada argv[0] atau dalam variabel " +#~ "lingkungan DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Tidak ada huruf pada berkas set karakter %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Tidak ketemu halaman!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Kehabisan kertas!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: Variabel lingkungan PRINTER belum ditentukan!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Berkas cetak tidak diterima (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Pencetak tidak merespon\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Pencetak tidak merespon!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Pencetak mengirim EOF yang tak diharapkan\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Host jarak jauh tidak menerima berkas kontrol (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Host jarak jauh tidak menerima data berkas (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "ERROR: Kehabisan waktu saat mengirim data ke pencetak\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Tidak bisa menambah berkas %d untuk tugas: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Tidak bisa membatalkan tugas %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Tidak bisa menyalin berkas PPD" + +#~ msgid "ERROR: Unable to create pipe" +#~ msgstr "ERROR: Tidak bisa membuat pipa" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Tidak bisa membuat soket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: Tidak bisa membuat berkas cetak berkompresi temporer: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Tidak bisa membuat berkas temporer" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Tidak bisa mengeksekusi pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Tidak bisa mengeksekusi program gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Tidak bisa mengeksekusi program pdftops" + +#~ msgid "ERROR: Unable to execute pstops program" +#~ msgstr "ERROR: Tidak bisa mengeksekusi program pstops" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Tidak bisa memperoleh permintaan PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Tidak bisa memperoleh respon PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: Tidak bisa memperoleh berkas PPD untuk pencetak \"%s\" - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Tidak bisa memperoleh zona baku AppleTalk" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Tidak bisa memperoleh atribut tugas %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Tidak bisa memperoleh status pencetak (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Tidak bisa menentukan lokasi pencetak '%s'!\n" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Tidak bisa membuat alamat AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Tidak bisa membuka \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Tidak bisa membuka %s: %s\n" + +#~ msgid "ERROR: Unable to open PPD file!\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas PPD!\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas perangkat \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas gambar untuk mencetak!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas cetak \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas cetak %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas cetak %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Tidak bisa membuka berkas cetak temporer berkompresi: %s\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Tidak bisa membaca data yang hendak dicetak" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Tidak bisa membaca data yang hendak dicetak!\n" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Tidak bisa mencari letak %ld dalam berkas - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Tidak bisa mencari letak %lld dalam berkas - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Tidak bisa mengirim perintah LPD" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Tidak bisa mengirim data yang hendak dicetak (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Tidak bisa mengirim data yang hendak dicetak!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Tidak bisa mengirim data ke pencetak" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Tidak bisa menunggu pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Tidak bisa menulis %d bita ke \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Tidak bisa menulis %d bita ke pencetak!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Tidak bisa menulis berkas kontrol" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Tidak bisa menulis data yang hendak dicetak" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Tidak bisa menulis data yang hendak dicetak: %s\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Tidak bisa menulis di berkas temporer" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Teks tak diharapkan pada baris %d dari %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Nilai opsi enkripsi \"%s\" tak dikenal!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Urutan berkas \"%s\" tak dikenal\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Format karakter \"%c\" tak dikenal\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Format katalog pesan \"%s\" tak dikenal!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Opsi \"%s\" dengan nilai \"%s\" tak dikenal!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Modus cetak \"%s\" tak dikenal\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Nilai opsi versi \"%s\" tak dikenal!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Nilai kecerahan %s tak didukung, gunakanlah brightness=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Nilai gama %s tak didukung, gunakanlah gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Nilai number-up %d tak didukung, gunakanlah number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Nilai number-up-layout %s tak didukung, gunakanlah number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Nilai page-border %s tak didukung, gunakanlah page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: Kelebihan doc_printf (%d bita) terdeteksi, dibatalkan!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops tertutup pada sinyal %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops tertutup dengan status %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: pemulihan: Tidak bisa menghubungi pencetak; akan mencoba ulang " +#~ "dalam 30 detik...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() gagal" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: tak dapat memulai berkas yang hendak dicetak" + +#~ msgid "Empty PPD file!" +#~ msgstr "Berkas PPD kosong!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Kesalahan: perlu nama host usai opsi '-h'!\n" + +#~ msgid "FAIL\n" +#~ msgstr "GAGAL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Berkas URI perangkat telah dinonaktifkan! Untuk mengaktifkannya, lihatlah " +#~ "petunjuk FileDevice dalam \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Suhu fusi tinggi!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Suhu fusi rendah!" + +#~ msgid "German FanFold" +#~ msgstr "FanFold Jerman" + +#~ msgid "German FanFold Legal" +#~ msgstr "FanFold Legal Jerman" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Memperoleh atribut printer-uri tetapi bukan job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk ditiadakan pada Preferensi Sistem\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk ditiadakan pada Preferensi Sistem.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Membatalkan tugas mencetak...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Terhubung ke pencetak...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Menghubungi pencetak...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Berkas kontrol berhasil dikirim\n" + +#~ msgid "INFO: Copying print data...\n" +#~ msgstr "INFO: Menyalin data yang hendak dicetak...\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Berkas data berhasil dikirim\n" + +#~ msgid "INFO: Finished page %d...\n" +#~ msgstr "INFO: Halaman selesai %d...\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Memformat halaman %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Memuat berkas gambar...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Mencari pencetak...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Membuka hubungan\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Berkas cetak dikirim, menunggu pencetak selesai mengerjakannya...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Pencetak sibuk; dicoba ulang 10 detik lagi...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Pencetak sibuk; dicoba ulang 30 detik lagi...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Pencetak sibuk; dicoba ulang 5 detik lagi...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: Pencetak tidak mendukung IPP/%d.%d, mencoba IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Pencetak sibuk; dicoba ulang 5 detik lagi...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Pencetak saat ini tak terhubung.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Pencetak saat ini tak terhubung.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Pencetak saat ini terhubung.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Pencetak saat ini tak terhubung.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: Pencetak tak terhubung; dicoba ulang 30 detik lagi...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Mencetak halaman %d, %d%% selesai...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Mencetak halaman %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Siap mencetak.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Mengirim berkas kontrol (%lu bita)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Mengirim berkas kontrol (%u bita)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Mengirim data\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Mengirim berkas data (%ld bita)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Mengirim berkas data (%lld bita)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Mengirim data yang hendak dicetak...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Mengirim berkas yang hendak dicetak, %ld bita...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Mengirim berkas yang hendak dicetak, %lld bita...\n" + +#~ msgid "INFO: Starting page %d...\n" +#~ msgstr "INFO: Memulai halaman %d...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Tidak bisa menghubungi pencetak, diantrikan ke pencetak selanjutnya " +#~ "pada kelas...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Menggunakan zona baku AppleTalk \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Menunggu tugas diselesaikan...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Menunggu pencetak tersedia...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 Amplop" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (Besar)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 Amplop" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 Amplop" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tinta/toner hampir kosong." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tinta/toner kosong!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Baki buangan tinta/toner hampir penuh." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Baki buangan tinta/toner sudah penuh!" + +#~ msgid "Invite Envelope" +#~ msgstr "Amplop Undangan" + +#~ msgid "Italian Envelope" +#~ msgstr "Amplop Italia" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Tugas #%d tidak bisa dicetak ulang - tidak ada berkas!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Tugas #%d tidak ada!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Tugas #%d sudah diselesaikan dan tidak dapat diubah!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Tugas #%d tidak selesai!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Tugas #%d tidak ditahan untuk otentikasi!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Tugas #%d tidak ditahan!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Tugas #%s tidak ada!" + +#~ msgid "Job %d not found!" +#~ msgstr "Tugas %d tidak ketemu!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Subkripsi tugas tidak bisa diperbaharui!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 Amplop" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 Amplop" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Bahasa \"%s\" tidak didukung!" + +#~ msgid "Media jam!" +#~ msgstr "Media tersangkut!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Baki media hampir kosong." + +#~ msgid "Media tray empty!" +#~ msgstr "Baki media kosong!" + +#~ msgid "Media tray missing!" +#~ msgstr "Baki media hilang!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Baki media perlu diisi." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Kehilangan atribut document-number!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Kehilangan tanda kutip pada baris %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Kehilangan variabel formulir!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Kehilangan atribut notify-subscription-ids!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Kehilangan atribut requesting-user-name!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Kehilangan atribut yang diperlukan!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Kehilangan nilai pada baris %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarki" + +#~ msgid "Monarch Envelope" +#~ msgstr "Amplop Monarki" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Berkas yang hendak dicetak diterima - ID tugas %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "" +#~ "NOTICE: Berkas yang hendak dicetak diterima - ID tugas tak dikenal.\n" + +#~ msgid "Nested classes are not allowed!" +#~ msgstr "Kelas bersarang tidak diperbolehkan!" + +#~ msgid "No PPD name!" +#~ msgstr "Tidak ada nama PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Tidak ada penggerak pencetak Windows yang terpasang!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Tidak ada tugas yang aktif pada %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Tidak ada atribut dalam permintaan!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Tidak ada informasi otentikasi yang tersedia!" + +#~ msgid "No default printer" +#~ msgstr "Tidak ada pencetak utama" + +#~ msgid "No file!?!" +#~ msgstr "Tidak ada berkas!?!" + +#~ msgid "No modification time!" +#~ msgstr "Tidak ada waktu modifikasi!" + +#~ msgid "No printer name!" +#~ msgstr "Tidak ada nama pencetak!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Tidak ditemukan printer-uri untuk kelas!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Tidak ditemukan printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Tidak ada printer-uri dalam permintaan!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Tidak ada atribut subskripsi dalam permintaan!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC nyaris di ujung hayat." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC sudah di ujung hayat!" + +#~ msgid "Out of toner!" +#~ msgstr "Kehabisan toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Baki keluaran hampir penuh." + +#~ msgid "Output bin full!" +#~ msgstr "Baki keluaran penuh!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Keluaran untuk pencetak %s dikirim ke %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Keluaran untuk pencetak %s dikirim ke pencetak jarak jauh %s pada %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Keluaran untuk pencetak %s/%s dikirim ke %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Keluaran untuk pencetak %s/%s dikirim ke pencetak jarak jauh %s pada %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Baki keluaran hilang!" + +#~ msgid "PASS\n" +#~ msgstr "LEWAT\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 Amplop" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 Amplop" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 Amplop" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 Amplop" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (Besar)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 Amplop" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 Amplop" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 Amplop" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 Amplop" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 Amplop" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 Amplop" + +#~ msgid "Personal Envelope" +#~ msgstr "Amplop Pribadi" + +#~ msgid "Printer offline." +#~ msgstr "Pencetak tak terhubung." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Urut Tuan Tgs Berkas Ukur Total\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Urut Tuan Pri Tugas Berkas Ukuran " +#~ "Total\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Menjalankan perintah: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Pencetak SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (Besar)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Nilai notify-user-data terlalu besar (%d > 63 oktet)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Pencetak atau kelas tidak dikongsikan!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Pencetak atau kelas tidak ditemukan." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Atribut printer-uri diperlukan!" + +#~ msgid "Toner low." +#~ msgstr "Toner lemah." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Terlalu banyak nilai job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Terlalu banyak nilai printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "Eksekutif AS" + +#~ msgid "US Fanfold" +#~ msgstr "Fanfold AS" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "Legal AS (Besar)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "Kuarto AS (Besar)" + +#~ msgid "US Letter (Small)" +#~ msgstr "Kuarto AS (Kecil)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Tidak bisa menambah tugas untuk tujuan \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Tidak bisa mengalokasikan memori untuk jenis berkas!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "Tidak bisa menyalin berkas penggerak pencetak CUPS 64-bit (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "Tidak bisa menyalin berkas penggerak pencetak Windows 64-bit (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Tidak bisa menyalin berkas penggerak pencetak CUPS (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Tidak bisa menyalin berkas PPD - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Tidak bisa menyalin berkas PPD!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Tidak bisa menyalin berkas penggerak pencetak Windows 2000 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Tidak bisa menyalin berkas penggerak pencetak Windows 9x (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Tidak bisa menyalin skrip antarmuka - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Tidak bisa membuat printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Tidak bisa menyunting berkas cupsd.conf lebih dari 1MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Tidak bisa menemukan tujuan untuk tugas!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Tidak bisa menemukan pencetak!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Tidak bisa memasang berkas penggerak pencetak Windows 2000 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Tidak bisa memasang berkas penggerak pencetak Windows 9x (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Tidak bisa membuka dokumen %d pada tugas %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Tidak bisa menjalankan \"%s\": %s\n" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Tidak bisa mengeset penggerak pencetak Windows (%d)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Set karakter \"%s\" tak didukung!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Kompresi \"%s\" tak didukung!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Atribut kompresi %s tak didukung!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Format \"%s\" tak didukung!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Format '%s' tak didukung!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Format '%s/%s' tak didukung!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Penggunaan:\n" +#~ "\n" +#~ " lpadmin [-h server] -d tujuan\n" +#~ " lpadmin [-h server] -x tujuan\n" +#~ " lpadmin [-h server] -p pencetak [-c tambah-kelas] [-i antarmuka] [-m " +#~ "model]\n" +#~ " [-r buang-kelas] [-v perangkat] [-D deskripsi]\n" +#~ " [-P berkas-ppd] [-o nama=nilai]\n" +#~ " [-u allow:pengguna,pengguna] [-u deny:pengguna," +#~ "pengguna]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Penggunaan: %s tugas pengguna judul salinan opsi [berkas]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Penggunaan: %s id-tugas pengguna judul rangkap opsi [berkas]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Penggunaan: %s id-tugas pengguna judul rangkap opsi berkas\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Penggunaan: cupsaddsmb [opsi] pencetak1 ... pencetakN\n" +#~ " cupsaddsmb [opsi] -a\n" +#~ "\n" +#~ "Opsi:\n" +#~ " -E Mengenkripsi koneksi ke server\n" +#~ " -H samba-server Menggunakan server SAMBA yang diberikan\n" +#~ " -U samba-user Otentikasi menggunakan nama pengguna SAMBA yang " +#~ "diberikan\n" +#~ " -a Mengekspor semua pencetak\n" +#~ " -h cups-server Menggunakan server CUPS yang ditentukan\n" +#~ " -v Menjadi riuh (menampilkan perintah)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Penggunaan: cupsctl [opsi] [param=nilai ... paramN=nilaiN]\n" +#~ "\n" +#~ "Opsi:\n" +#~ "\n" +#~ " -E Mengaktifkan enkripsi\n" +#~ " -U namapengguna Menentukan nama pengguna\n" +#~ " -h server[:portal Menentukan alamat server\n" +#~ "\n" +#~ " --[no-]debug-logging Mengaktifkan/tidak pencatat debug\n" +#~ " --[no-]remote-admin Mengaktifkan/tidak administrasi jarak jauh\n" +#~ " --[no-]remote-any Biarkan/cegah akses dari Internet\n" +#~ " --[no-]remote-printers Tampilkan/sembunyikan pencetak jarak jauh\n" +#~ " --[no-]share-printers Mengaktifkan/tidak pencetak yang dikongsi\n" +#~ " --[no-]user-cancel-any Biarkan/cegah pengguna biasa membatalkan " +#~ "tugas\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Penggunaan: cupsd [-c berkas-konfigurasi] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c berkas-konfigurasi Memuat berkas konfigurasi alternatif\n" +#~ "-f Berjalan pada latar depan\n" +#~ "-F Berjalan pada latar depan tapi terpisah\n" +#~ "-h Tampilkan pesan ini\n" +#~ "-l Menjalankan cupsd dari launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Penggunaan: cupsfilter -m mime/jenis [ opsi ] berkas\n" +#~ "\n" +#~ "Opsi:\n" +#~ "\n" +#~ " -c cupsd.conf Mengeset berkas cupsd.conf untuk digunakan\n" +#~ " -e Menggunakan tiap penyaring dari berkas PPD\n" +#~ " -j job-id[,N] Menyaring berkas N dari tugas yang diberikan (baku " +#~ "adalah berkas 1)\n" +#~ " -n copies Mengeset banyaknya salinan\n" +#~ " -o name=value Mengeset opsi\n" +#~ " -p filename.ppd Mengeset berkas PPD\n" +#~ " -t title Mengeset judul\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Penggunaan: cupstestdsc [opsi] berkas.ps [... berkas.ps]\n" +#~ " cupstestdsc [opsi] -\n" +#~ "\n" +#~ "Opsi:\n" +#~ "\n" +#~ " -h Menampilkan cara guna program\n" +#~ "\n" +#~ " Catatan: program ini hanya memvalidasi komentar DSC, bukan PostScript " +#~ "itu sendiri.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Penggunaan: cupstestppd [opsi] berkas1.ppd[.gz] [... berkasN.ppd[.gz]]\n" +#~ " program | cupstestppd [opsi] -\n" +#~ "\n" +#~ "Opsi:\n" +#~ "\n" +#~ " -R direktori-root Mengeset root alternatif\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Menampilkan peringatan ketimbang kesalahan\n" +#~ " -q Berjalan senyap\n" +#~ " -r Menggunakan modus 'relaxed' terbuka\n" +#~ " -v Menjadi riuh\n" +#~ " -vv Menjadi sangat riuh\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Penggunaan: lpmove tugas/sumber tujuan\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Penggunaan: lpoptions [-h server] [-E] -d pencetak\n" +#~ " lpoptions [-h server] [-E] [-p pencetak] -l\n" +#~ " lpoptions [-h server] [-E] -p pencetak -o opsi[=nilai] ...\n" +#~ " lpoptions [-h server] [-E] -x pencetak\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Penggunaan: lppasswd [-g namakelompok]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Penggunaan: lppasswd [-g namakelompok] [namapengguna]\n" +#~ " lppasswd [-g namakelompok] -a [namapengguna]\n" +#~ " lppasswd [-g namakelompok] -x [namapengguna]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Penggunaan: lpq [-P tujuan] [-U namapengguna] [-h namahost[:portal]] [-l] " +#~ "[+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Penggunaan: ppdc [opsi] berkas.drv [ ... berkasN.drv ]\n" +#~ "Opsi:\n" +#~ " -D nama=nilai Atur nilai variabel bernama.\n" +#~ " -I dir-inklusi Tambah direktori dalam jalur pencarian.\n" +#~ " -c katalog.po Memuat katalog pesan yang diinginkan.\n" +#~ " -d dir-keluaran Menentukan direktori keluaran.\n" +#~ " -l bhsa[,bhsa,...] Menentukan bahasa keluaran (lokal).\n" +#~ " -m Menggunakan nilai ModelName sebagai nama berkas.\n" +#~ " -t Menguji PPD ketimbang membuatnya.\n" +#~ " -v Menjadi riuh (tambahkan v lagi untuk lebih riuh).\n" +#~ " -z Kompres berkas PPD dengan GNU zip.\n" +#~ " --cr Akhiri baris dengan CR (Mac OS 9).\n" +#~ " --crlf Akhiri baris dengan CR + LF (Windows).\n" +#~ " --lf Akhiri baris dengan LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Penggunaan: ppdhtml [opsi] berkas.drv >berkas.html\n" +#~ " -D nama=nilai Atur nilai variabel bernama.\n" +#~ "Opsi:\n" +#~ " -I dir-inklusi Tambah direktori dalam jalur pencarian.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Penggunaan: ppdi [opsi] berkas.ppd [ ... berkasN.ppd ]\n" +#~ "Opsi:\n" +#~ " -I direktori\n" +#~ " -o berkas.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Penggunaan: ppdmerge [opsi] berkas.ppd [ ... berkasN.ppd ]\n" +#~ "Opsi:\n" +#~ " -o berkas.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Penggunaan: ppdpo [opsi] -o berkas.po berkas.drv [ ... berkasN.drv ]\n" +#~ "Opsi:\n" +#~ " -D nama=nilai Mengeset nilai variabel bernama.\n" +#~ " -I dir-inklusi Tambah direktori dalam jalur pencarian.\n" +#~ " -v Menjadi riuh (tambahkan v lagi untuk lebih riuh).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Penggunaan: snmp [host-atau-alamat-ip]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Hanya menambah %d pencetak pertama yang ditemukan" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Diharapkan boolean untuk opsi waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Gagal membaca permintaan kanal sisi!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: Opsi \"%s\" tidak akan disertakan via IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Pencetak tidak merespon!\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Pencetak mengirim EOF yang tak diharapkan\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host jarak jauh tidak merespon pada bita status perintah usai %d " +#~ "detik!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host jarak jauh tidak merespon pada bita kontrol status usai %d " +#~ "detik!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host jarak jauh tidak merespon pada bita status data usai %d " +#~ "detik!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: Perintah SCSI kehabisan waktu (%d); mencoba ulang...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Dokumen ini tidak sesuai dengan Adobe Document Structuring " +#~ "Conventions dan mungkin tidak tercetak dengan benar!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Tidak bisa membuka \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Tidak bisa mengirim permintaan status PAP" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Paket PAP berjenis %d tak dikenal\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Pilihan \"%s\" tak dikenal untuk opsi \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Opsi \"%s\" tak dikenal!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: angka diharapkan untuk opsi status \"%s\"\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Peringatan, tak ada penggerak pencetak Windows 2000 yang terpasang!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 Amplop" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "konversi: Gunakan opsi -f untuk menentukan berkas yang hendak " +#~ "dikonversi.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Tidak ada berkas PPD untuk pencetak \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Tidak bisa menghubungi server: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Opsi tak dikenal \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Opsi tak dikenal \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Diharapkan nama berkas konfigurasi usai opsi \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Tidak bisa memperoleh direktori sekarang!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Argumen \"%s\" tak dikenal - digagalkan!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Opsi \"%c\" tak dikenal - digagalkan!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: dukungan launchd(8) tidak dikompilasi serta, menjalankan dalam " +#~ "modus normal.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Jumlah dokumen %d tidak sah!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: ID tugas %d tak sah!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Hanya satu nama berkas yang bisa ditentukan!\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Tidak bisa memperoleh berkas tugas - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: Opsi -q tidak cocok dengan opsi -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: Opsi -v tidak cocok dengan opsi -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "perangkat untuk %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "perangkat untuk %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "bantuan\t\tmemperoleh bantuan dari baris perintah\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Atribut job-printer-uri hilang!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Nama kelas hanya boleh diisi karakter cetak!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: Diharapkan PPD usai opsi '-P'!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Diharapkan allow/deny:daftarpengguna usai opsi '-u'!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Diharapkan kelas usai opsi '-r'!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Diharapkan nama kelas usai opsi '-c'!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Diharapkan deskripsi usai opsi '-D'!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Diharapkan URI perangkat usai opsi '-v'!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Diharapkan jenis berkas usai opsi '-I'!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Diharapkan nama host usai opsi '-h'!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Diharapkan antarmuka usai opsi '-i'!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Diharapkan lokasi usai opsi '-L'!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Diharapkan model usai opsi '-m'!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Diharapkan nama=nilai usai opsi '-o'!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Diharapkan pencetak usai opsi '-p'!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Diharapkan nama pencetak usai opsi '-d'!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Diharapkan pencetak atau kelas usai opsi '-x'!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Tidak ada nama anggota yang terlihat!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Pencetak %s sudah menjadi anggota kelas %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Pencetak %s bukanlah anggota kelas %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Nama pencetak hanya bisa mengandung karakter cetak!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa menambah pencetak ke kelas:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Tidak bisa terkoneksi ke server: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Tidak bisa membuka berkas PPD \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Tidak bisa membuka berkas \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa membuang pencetak dari kelas:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset berkas PPD:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset URI perangkat:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset skrip antarmuka atau berkas PPD:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset skrip antarmuka:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset deskripsi pencetak:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset lokasi pencetak:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Tidak bisa mengeset opsi pencetak:\n" +#~ " Anda harus menentukan nama pencetak lebih dulu!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Opsi boleh/larang tak dikenal \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Argumen tak dikenal '%s'!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Opsi tak dikenal '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Peringatan - jenis isi diabaikan!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Diharapkan bahasa usai --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Diharapkan pembuat dan model usai --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Diharapkan string produk usai --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Diharapkan daftar skema usai --exclude-scemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Diharapkan daftar skema usai --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Diharapkan waktu habis usai --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Argumen tak dikenal '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Opsi tak dikenal '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Opsi tak dikenal '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Tidak bisa terkoneksi ke server: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Argumen tak dikenal '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Opsi tak dikenal '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Tidak ada pencetak!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Tidak bisa menambah pencetak: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Tidak bisa mendapatkan berkas PPD untuk %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Tidak bisa membuka berkas PPD untuk %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Pencetak atau kelas tak dikenal!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Hanya root yang bisa menambah atau menghapus sandi!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Berkas sandi sedang sibuk!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Berkas sandi tidak diperbaharui!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Maaf, sandi tidak cocok!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Maaf, sandi ditolak.\n" +#~ "Sandi Anda harus setidaknya 6 karakter, tidak memuat\n" +#~ "nama pengguna Anda, dan setidaknya memiliki satu huruf serta angka.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Maaf, sandi tidak cocok!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Tidak bisa menyalin string sandi: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Tidak bisa membuka berkas sandi: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Tidak bisa menulis ke berkas sandi: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: gagal mencadangkan berkas sandi yang lama: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: gagal mengubah nama berkas sandi: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: pengguna \"%s\" dan kelompok \"%s\" tidak ada.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: kesalahan - nama variabel lingkungan %s bukanlah tujuan yang ada " +#~ "\"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "anggota kelas %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "tak ada entri\n" + +#~ msgid "no system default destination\n" +#~ msgstr "tak ada tujuan sistem utama\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events tidak dispesifikasikan!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "URI notify-recipient-uri \"%s\" sudah dipakai!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "URI notify-recipient-uri \"%s\" memakai skema tak dikenal!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d tidak baik!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Menambahkan direktori \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdf: Menambah/memperbaharui teks UI dari %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Nilai boolean jelek (%s) pada baris %d dari %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Nama resolusi jelek \"%s\" pada baris %d dari %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Kata kunci status jelek %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Subtitusi variabel jelek ($%c) pada baris %d dari %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Ditemukan pilihan pada baris %d dari %s tanpa Option!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Duplikat #po untuk lokal %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan definisi penyaring pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama program pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Diharapkan nilai boolean pada baris %d dari %s.\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Diharapkan kode pilihan pada baris %d dari %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Diharapkan nama/teks pilihan pada baris %d dari %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan urutan warna untuk ColorModel pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan ruang warna untuk ColorModel pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan kompresi untuk ColorModel pada baris %d dari %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan string konstrain untuk UIConstraints pada baris %d dari %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan kata kunci jenis penggerak diikuti DriverType pada baris " +#~ "%d dari %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan jenis dupleks usai Duplex pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan enkode usai Font pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama berkas usai #po %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama/teks kelompok pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan nama berkas yang disertakan pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan integer pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan lokal usai #po pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai FileName pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai Font pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai Manufacturer pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai MediaSize pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai ModelName pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama usai PCFileName pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama/teks usai %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan nama/teks usai Installable pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nama/teks usai Resolution pada baris %d dari %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan nama/teks kombinasi untuk ColorModel pada baris %d dari %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan opsi nama/teks pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan opsi seksi pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan opsi jenis pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan bilangan real pada baris %d dari %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan resolusi/jenis media diikuti ColorProfile pada baris %d " +#~ "dari %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Diharapkan resolusi/jenis media diikuti SimpleColorProfile pada " +#~ "baris %d dari %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Diharapan selektor usai %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan status usai Font pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan string usai Copyright pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan string usai Version pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan dua opsi nama pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan nilai usai %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Diharapkan versi usai Font pada baris %d dari %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Nama berkas #include/#po \"%s\" tak sah!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Nilai tak sah bagi penyaring pada baris %d dari %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Jenis MIME kosong tak sah untuk penyaring pada baris %d dari %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Nama program korong tak sah untuk penyaring pada baris %d dari %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Seksi opsi \"%s\" tak sah pada baris %d dari %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Jenis opsi \"%s\" tak sah pada baris %d dari %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Memuat berkas informasi penggerak \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Memuat pesan untuk loakl \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Memuat pesan dari \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: Kehilangan #endif di akhir \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: Kehilangan #if pada baris %d dari %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Tak tersedia katalog pesan untuk lokal %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Terlalu banyak #if bersarang pada baris %d dari %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Tidak bisa membuat berkas PPD \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Tidak bisa membuat direktori keluaran %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Tidak bisa membuat pipa keluaran: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Tidak bisa mengeksekusi cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Tidak bisa menemukan berkas #po %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Tidak bisa menemukan berkas yang disertakan \"%s\" pada baris %d " +#~ "dari %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Tidak bisa menemukan lokalisasi bagi \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Tidak bisa memuat berkas lokalisasi \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Variabel tak berdefinisi (%s) pada baris %d dari %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Jenis penggerak tak dikenal %s pada baris %d dari %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Jenis dupleks tak dikenal \"%s\" pada baris %d dari %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ukuran media tak dikenal \"%s\" pada baris %d dari %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Menulis %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Menulis berkas PPD ke direktori \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: LanguageVersion \"%s\" jelek pada %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Mengabaikan berkas PPD %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Tidak bisa mencadangkan %s ke %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "pencetak %s ditiadakan sejak %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "pencetak %s sedang menganggur. diaktifkan sejak %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "pencetak %s saat ini tengah mencetak %s-%d. diaktifkan sejak %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "pencetak %s/%s dinonaktifkan sejak %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "pencetak %s/%s sedang menganggur. diaktifkan sejak %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "pencetak %s/%s saat ini tengah mencetak %s-%d. diaktifkan sejak %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "identitas permintaan adalah %s-%d (%d berkas)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "penjadwal tidak berjalan\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "penjadwal tengah berjalan\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tmenampilkan status daemon dan antrian\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "tujuan utama sistem: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "tujuan utama sistem: %s/%s\n" diff --git a/locale/cups_it.po b/locale/cups_it.po new file mode 100644 index 0000000..b0c0969 --- /dev/null +++ b/locale/cups_it.po @@ -0,0 +1,8926 @@ +# Vincenzo Reale , 2009. +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2010-01-10 01:03+0100\n" +"Last-Translator: Vincenzo Reale \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: it\n" +"X-Generator: Lokalize 1.0\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimetri" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f a %.0f x %.0f millimetri" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f pollici" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f a %.2f x %.2f pollici" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s non può essere modificato." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 poll./sec." + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 poll./sec." + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 poll./sec." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sec." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 poll./sec." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 poll./sec." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sec." + +msgid "120x60dpi" +msgstr "120 x 60 dpi" + +msgid "120x72dpi" +msgstr "120 x 72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sec." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sec." + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 poll./sec." + +msgid "2-Sided Printing" +msgstr "Stampa su due lati" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 poll./sec." + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sec." + +msgid "200 mm/sec." +msgstr "200 mm/sec." + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Serie a 24 pin" + +msgid "240x72dpi" +msgstr "240 x 72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sec." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 poll./sec." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Disco da 3,5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Disco da 3,5\": 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sec." + +msgid "300 mm/sec." +msgstr "300 mm/sec." + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360 x 180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 poll./sec." + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sec." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 poll./sec." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 poll./sec." + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sec." + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 poll./sec." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 poll./sec." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sec." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 poll./sec." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Serie a 9 pin" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Accetta stampe" + +msgid "Accepted" +msgstr "Accettate" + +msgid "Add Class" +msgstr "Aggiungi classe" + +msgid "Add Printer" +msgstr "Aggiungi stampante" + +msgid "Add RSS Subscription" +msgstr "Aggiungi sottoscrizione RSS" + +msgid "Address" +msgstr "Indirizzo" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Indirizzo: 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Amministrazione" + +msgid "Always" +msgstr "Sempre" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applicatore" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Puntatore dest. NULL errato" + +msgid "Bad OpenGroup" +msgstr "OpenGroup errato" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI errato" + +msgid "Bad OrderDependency" +msgstr "OrderDependency errato" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Richiesta errata" + +msgid "Bad SNMP version number" +msgstr "Numero versione SNMP errato" + +msgid "Bad UIConstraints" +msgstr "UIConstraints errato" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Valore copie %d errato." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Parametro personalizzato errato" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Valore number-up %d errato." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Valori page-ranges %d-%d errati." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Banner" + +msgid "Billing Information: " +msgstr "Informazioni pagamento: " + +msgid "Bond Paper" +msgstr "Carta normale" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Stampante etichetta CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Annulla sottoscrizione RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Modifica impostazioni" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Classi" + +msgid "Clean Print Heads" +msgstr "Pulisci testine stampante" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Colore" + +msgid "Color Mode" +msgstr "Modalità colore" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "I nomi comunitari utilizzano una lunghezza indefinita" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Continua" + +msgid "Continuous" +msgstr "Continuo" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Creato" + +msgid "Created On: " +msgstr "Creato il: " + +msgid "Custom" +msgstr "Personalizzato" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Taglia" + +msgid "Cutter" +msgstr "Cutter" + +msgid "Dark" +msgstr "Scuro" + +msgid "Darkness" +msgstr "Oscurità" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Elimina classe" + +msgid "Delete Printer" +msgstr "Elimina stampante" + +msgid "Description: " +msgstr "Descrizione: " + +msgid "DeskJet Series" +msgstr "Serie DeskJet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "La destinazione \"%s\" non accetta operazioni." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Media termico diretto" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Disabilitato" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nome driver: " + +msgid "Driver Version: " +msgstr "Versione driver: " + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Stampante etichette EPL1" + +msgid "EPL2 Label Printer" +msgstr "Stampante etichette EPL2" + +msgid "Edit Configuration File" +msgstr "Modifica documento di configurazione" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Banner finale" + +msgid "English" +msgstr "Italian" + +msgid "Enter old password:" +msgstr "Inserisci la vecchia password:" + +msgid "Enter password again:" +msgstr "Inserisci di nuovo la password:" + +msgid "Enter password:" +msgstr "Inserisci la password:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Per accedere a questa pagina, inserisci il tuo nome utente e la password o " +"il nome utente e la password di root." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Feed busta" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Politica errori" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Ogni 10 etichette" + +msgid "Every 2 Labels" +msgstr "Ogni 2 etichette" + +msgid "Every 3 Labels" +msgstr "Ogni 3 etichette" + +msgid "Every 4 Labels" +msgstr "Ogni 4 etichette" + +msgid "Every 5 Labels" +msgstr "Ogni 5 etichette" + +msgid "Every 6 Labels" +msgstr "Ogni 6 etichette" + +msgid "Every 7 Labels" +msgstr "Ogni 7 etichette" + +msgid "Every 8 Labels" +msgstr "Ogni 8 etichette" + +msgid "Every 9 Labels" +msgstr "Ogni 9 etichette" + +msgid "Every Label" +msgstr "Ogni etichetta" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Attesa fallita" + +msgid "Export Printers to Samba" +msgstr "Esporta stampanti a Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Cartella documento" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Cartella documento: 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Foglio" + +msgid "Forbidden" +msgstr "Vietato" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Generale" + +msgid "Generic" +msgstr "Generico" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU utilizza una lunghezza indefinita" + +msgid "Glossy Paper" +msgstr "Carta patinata" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Scala di grigi" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Cartella interruzione" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Cartella interruzione - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "ISOLatin1" + +msgid "Illegal control character" +msgstr "Carattere di controllo non consentito" + +msgid "Illegal main keyword string" +msgstr "Stringa di parola chiave principale non consentita" + +msgid "Illegal option keyword string" +msgstr "Stringa di parola chiave opzionale non consentita" + +msgid "Illegal translation string" +msgstr "Stringa di traduzione non consentita" + +msgid "Illegal whitespace character" +msgstr "Carattere spazio bianco non consentito" + +msgid "Installable Options" +msgstr "Opzioni installabili" + +msgid "Installed" +msgstr "Installate" + +msgid "IntelliBar Label Printer" +msgstr "Stampante etichette IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "Errore interno del server" + +msgid "Internal error" +msgstr "Errore interno" + +msgid "Internet Postage 2-Part" +msgstr "Francobollo Internet 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Francobollo Internet 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Francobollo Internet 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Francobollo Internet 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "IPP (Internet Printing Protocol)" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "La stampa #%d è già interrotta: impossibile annullare." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "La stampa #%d è già annullata: impossibile annullare." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "La stampa #%d è già completata: impossibile annullare." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Stampa completata" + +msgid "Job Created" +msgstr "Stampa creata" + +msgid "Job ID: " +msgstr "ID stampa: " + +msgid "Job Options Changed" +msgstr "Opzioni di stampa modificate" + +msgid "Job Stopped" +msgstr "Stampa interrotta" + +msgid "Job UUID: " +msgstr "UUID stampa: " + +msgid "Job is completed and cannot be changed." +msgstr "La stampa è completata e non può essere modificata." + +msgid "Job operation failed:" +msgstr "Operazione stampa fallita:" + +msgid "Job state cannot be changed." +msgstr "Lo stato della stampa non può essere modificato." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Stampe" + +msgid "LPD/LPR Host or Printer" +msgstr "Host o stampante LPD/LPR" + +msgid "Label Printer" +msgstr "Stampante etichette" + +msgid "Label Top" +msgstr "Etichetta superiore" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Indirizzo esteso" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Indirizzo esteso: - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Serie PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Luce" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Lunghezza riga superiore al limite massimo concesso (255 caratteri)" + +msgid "List Available Printers" +msgstr "Elenco stampanti disponibili" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Posizione: " + +msgid "Long-Edge (Portrait)" +msgstr "Taglio largo (ritratto)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Produzione e modello: " + +msgid "Manual Feed" +msgstr "Alimentazione manuale" + +msgid "Media Dimensions: " +msgstr "Dimensioni media: " + +msgid "Media Limits: " +msgstr "Limiti media: " + +msgid "Media Name: " +msgstr "Nome media: " + +msgid "Media Size" +msgstr "Dimensione media" + +msgid "Media Source" +msgstr "Sorgente media" + +msgid "Media Tracking" +msgstr "Rilevamento media" + +msgid "Media Type" +msgstr "Tipo media" + +msgid "Medium" +msgstr "Media" + +msgid "Memory allocation error" +msgstr "Errore di allocazione della memoria" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Intestazione PPD-Adobe-4.x mancante" + +msgid "Missing asterisk in column 1" +msgstr "Asterisco mancante nella colonna 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Stringa di valore mancante" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Modifica classe" + +msgid "Modify Printer" +msgstr "Modifica stampante" + +msgid "Move All Jobs" +msgstr "Sposta tutte le stampe" + +msgid "Move Job" +msgstr "Sposta stampa" + +msgid "Moved Permanently" +msgstr "Spostamento permanente" + +msgid "NULL PPD file pointer" +msgstr "Puntatore documento NULL PPD" + +msgid "Name OID uses indefinite length" +msgstr "Il nome OID utilizza una lunghezza indefinita" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Mai" + +msgid "New Stylus Color Series" +msgstr "Nuova serie Stylus Color" + +msgid "New Stylus Photo Series" +msgstr "Nuova serie Stylus Photo" + +msgid "No" +msgstr "No" + +msgid "No Content" +msgstr "Nessun contenuto" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Nessuna SEQUENZA VarBind" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Nessuna connessione attiva" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Nessun nome comunitario" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Nessuna destinazione aggiunta." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Nessun error-index" + +msgid "No error-status" +msgstr "Nessun error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Nessun nome OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Nessun request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Nessuna sottoscrizione trovata." + +msgid "No variable-bindings SEQUENCE" +msgstr "Nessuna SEQUENZA variable-bindings" + +msgid "No version number" +msgstr "Nessun numero versione" + +msgid "Non-continuous (Mark sensing)" +msgstr "Non-continuous (rilevamento contrassegno)" + +msgid "Non-continuous (Web sensing)" +msgstr "Non-continuous (rilevamento web)" + +msgid "Normal" +msgstr "Normale" + +msgid "Not Found" +msgstr "Non trovato" + +msgid "Not Implemented" +msgstr "Non implementato" + +msgid "Not Installed" +msgstr "Non installato" + +msgid "Not Modified" +msgstr "Non modificato" + +msgid "Not Supported" +msgstr "Non supportato" + +msgid "Not allowed to print." +msgstr "Non autorizzata a stampare." + +msgid "Note" +msgstr "Nota" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Off (su un lato)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Aiuto Online" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Apertura di %s fallita: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup senza un CloseGroup precedente" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI senza un CloseUI/JCLCloseUI precedente" + +msgid "Operation Policy" +msgstr "Politica operativa" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Opzioni installate" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opzioni: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Modalità di uscita" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Stampante laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Il pacchetto non contiene un Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Il pacchetto non inizia con una SEQUENZA" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Password per %s su %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Password per %s necessaria per accedere a %s via SAMBA: " + +msgid "Pause Class" +msgstr "Metti in pausa classe" + +msgid "Pause Printer" +msgstr "Metti in pausa stampante" + +msgid "Peel-Off" +msgstr "Stacca" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Etichette foto" + +msgid "Plain Paper" +msgstr "Carta normale" + +msgid "Policies" +msgstr "Politiche" + +msgid "Port Monitor" +msgstr "Monitor porta" + +msgid "PostScript Printer" +msgstr "Stampante PostScript" + +msgid "Postcard" +msgstr "Cartolina postale" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Densità di stampa" + +msgid "Print Job:" +msgstr "Stampa:" + +msgid "Print Mode" +msgstr "Modalità di stampa" + +msgid "Print Rate" +msgstr "Velocità di stampa" + +msgid "Print Self-Test Page" +msgstr "Pagina di autoverifica" + +msgid "Print Speed" +msgstr "Velocità di stampa" + +msgid "Print Test Page" +msgstr "Stampa pagina di prova" + +msgid "Print and Cut" +msgstr "Stampa e taglia" + +msgid "Print and Tear" +msgstr "Stampa e separa" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Stampato per: " + +msgid "Printed From: " +msgstr "Stampato da: " + +msgid "Printed On: " +msgstr "Stampato su: " + +msgid "Printer Added" +msgstr "Aggiunta stampante" + +msgid "Printer Default" +msgstr "Stampate di default" + +msgid "Printer Deleted" +msgstr "Stampante eliminata" + +msgid "Printer Modified" +msgstr "Manutenzione stampanti" + +msgid "Printer Name: " +msgstr "Nome stampante: " + +msgid "Printer Paused" +msgstr "Stampante in pausa" + +msgid "Printer Settings" +msgstr "Impostazioni stampante" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Stampante:" + +msgid "Printers" +msgstr "Stampanti" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Libera stampe" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Limite di quota raggiunto." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Scarta stampe" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Ristampa dopo errore" + +msgid "Request Entity Too Large" +msgstr "Richiesta di dimensioni eccessive" + +msgid "Resolution" +msgstr "Risoluzione" + +msgid "Resume Class" +msgstr "Riprendi classe" + +msgid "Resume Printer" +msgstr "Riprendi stampante" + +msgid "Return Address" +msgstr "Indirizzo mittente" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Indirizzo mittente - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Riavvolgi" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENZA utilizza una lunghezza indefinita" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Vedi altro" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Porta seriale#%d" + +msgid "Server Restarted" +msgstr "Server riavviato" + +msgid "Server Security Auditing" +msgstr "Auditing sicurezza server" + +msgid "Server Started" +msgstr "Server avviato" + +msgid "Server Stopped" +msgstr "Server interrotto" + +msgid "Service Unavailable" +msgstr "Servizio non disponibile" + +msgid "Set Allowed Users" +msgstr "Imposta utenti autorizzati" + +msgid "Set As Server Default" +msgstr "Imposta come server di default" + +msgid "Set Class Options" +msgstr "Imposta opzioni classe" + +msgid "Set Printer Options" +msgstr "Imposta opzioni stampante" + +msgid "Set Publishing" +msgstr "Imposta pubblicazione" + +msgid "Shipping Address" +msgstr "Indirizzo di spedizione" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Indirizzo di spedizione - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Lato corto (panoramica)" + +msgid "Special Paper" +msgstr "Carta speciale" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Banner iniziale" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Istruzione" + +msgid "Stylus Color Series" +msgstr "Serie Stylus Color" + +msgid "Stylus Photo Series" +msgstr "Serie Stylus Photo" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Cambio protocolli" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Separa" + +msgid "Tear-Off" +msgstr "Separa" + +msgid "Tear-Off Adjust Position" +msgstr "Posizione di regolazione separa" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Impossibile trovare il documento PPD \"%s\"." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Impossibile aprire il documento PPD \"%s\": %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Il nome della classe può contenere fino a 127 caratteri stampabili e non può " +"contenere spazi, barre (/) o cancelletti (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"L'attributo notify-lease-duration non può essere usato con le sottoscrizioni " +"delle stampe." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Il nome della stampante può contenere fino a 127 caratteri stampabili e non " +"può contenere spazi, barre (/) o cancelletti (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Printer-uri \"%s\" contiene caratteri non validi." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"È richiesto un printer-uri con formato \"ipp://HOSTNAME/classes/CLASSNAME\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"È richiesto un printer-uri con formato \"ipp://HOSTNAME/printers/PRINTERNAME" +"\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Il nome della sottoscrizione non può contenere spazi, barre (/), punti " +"interrogativi (?) o cancelletti (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Ci sono troppe sottoscrizioni." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Media trasferimento termico" + +msgid "Title: " +msgstr "Titolo: " + +msgid "Too many active jobs." +msgstr "Troppe stampe attive." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Trasparenza" + +msgid "Tray" +msgstr "Vassoio" + +msgid "Tray 1" +msgstr "Vassoio 1" + +msgid "Tray 2" +msgstr "Vassoio 2" + +msgid "Tray 3" +msgstr "Vassoio 3" + +msgid "Tray 4" +msgstr "Vassoio 4" + +msgid "URI Too Long" +msgstr "URI troppo lungo" + +msgid "US Ledger" +msgstr "Ledger USA" + +msgid "US Legal" +msgstr "Legale USA" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "Lettera USA" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Porta seriale#%d USB" + +msgid "Unable to access cupsd.conf file:" +msgstr "Impossibile accedere al documento cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Impossibile aggiungere la sottoscrizione RSS:" + +msgid "Unable to add class:" +msgstr "Impossibile aggiungere la classe:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Impossibile aggiungere la stampante:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Impossibile annullare la sottoscrizione RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Impossibile modificare l'attributo printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Impossibile cambiare stampante:" + +msgid "Unable to change server settings:" +msgstr "Impossibile modificare le impostazioni del server:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Impossibile connettersi all'host." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Impossibile creare il documento temporaneo:" + +msgid "Unable to delete class:" +msgstr "Impossibile eliminare la classe:" + +msgid "Unable to delete printer:" +msgstr "Impossibile eliminare la stampante:" + +msgid "Unable to do maintenance command:" +msgstr "Impossibile eseguire il comando di manutenzione:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Impossibile ottenere l'elenco delle classi:" + +msgid "Unable to get class status:" +msgstr "Impossibile ottenere lo stato della classe:" + +msgid "Unable to get list of printer drivers:" +msgstr "Impossibile ottenere l'elenco dei driver della stampante:" + +msgid "Unable to get printer attributes:" +msgstr "Impossibile ottenere gli attributi della stampante:" + +msgid "Unable to get printer list:" +msgstr "Impossibile ottenere l'elenco delle stampanti:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Impossibile ottenere lo stato della stampante:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Impossibile modificare la classe:" + +msgid "Unable to modify printer:" +msgstr "Impossibile modificare la stampante:" + +msgid "Unable to move job" +msgstr "Impossibile spostare la stampa" + +msgid "Unable to move jobs" +msgstr "Impossibile spostare le stampe" + +msgid "Unable to open PPD file" +msgstr "Impossibile aprire il documento PPD" + +msgid "Unable to open PPD file:" +msgstr "Impossibile aprire il documento PPD:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Impossibile aprire il documento cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Impossibile stampare la pagina di prova:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Impossibile configurare le opzioni:" + +msgid "Unable to set server default:" +msgstr "Impossibile impostare il server di default:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Impossibile caricare il documento cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Non autorizzato" + +msgid "Units" +msgstr "Unità" + +msgid "Unknown" +msgstr "Sconosciuto" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Printer-error-policy \"%s\" sconosciuto." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Printer-op-policy \"%s\" sconosciuto." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Tipo valore non supportato" + +msgid "Upgrade Required" +msgstr "Richiesto aggiornamento" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Il valore utilizza una lunghezza indefinita" + +msgid "VarBind uses indefinite length" +msgstr "VarBind utilizza una lunghezza indefinita" + +msgid "Version uses indefinite length" +msgstr "La versione utilizza una lunghezza indefinita" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Sì" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Devi accedere a questa pagina utilizzando l'URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Stampante etichetta ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "interrotto" + +msgid "canceled" +msgstr "annullato" + +msgid "completed" +msgstr "completato" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "esecuzione di cups-deviced fallita." + +msgid "cups-driverd failed to execute." +msgstr "esecuzione di cups-driverd fallita." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index utilizza una lunghezza indefinita" + +msgid "error-status uses indefinite length" +msgstr "error-status utilizza una lunghezza indefinita" + +msgid "held" +msgstr "bloccato" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inattivo" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "in sospeso" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "elaborazione in corso" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id utilizza una lunghezza indefinita" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "verifica di %s fallita: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "interrotto" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "Sconosciuto" + +msgid "untitled" +msgstr "senza titolo" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings utilizza una lunghezza indefinita" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(tutti)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(nessuno)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d voci\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tDopo il fallimento: continua\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAvvisi:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner richiesto\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tSet di caratteri:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tConnessione: diretta\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tConnessione: remota\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tDimensioni predefinite pagina:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tTono predefinito:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tImpostazioni predefinite porta:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDescrizione: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tModulo montato:\n" +#~ "\tTipi di contenuto: qualsiasi\n" +#~ "\tTipi di stampante: sconosciuti\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tModuli consentiti:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterfaccia: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterfaccia: %s/interfacce/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterfaccia: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tPosizione: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tIn caso di fallimento: nessun avviso\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tUtenti autorizzati:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tUtenti non autorizzati:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tpresente demone\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tnessuna voce\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tla stampante è sul dispositivo '%s' velocità -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tla stampa è disabilitata\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tla stampa è abilitata\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tin coda per %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tla coda è disabilitata\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tla coda è abilitata\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tmotivo sconosciuto\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " RISULTATI DETTAGLIATI DEL TEST DI CONFORMITÀ\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " RIF: pagina 15, sezione 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " RIF: pagina 15, sezione 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " RIF: pagina 19, sezione 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " RIF: pagina 20, sezione 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " RIF: pagina 27, sezione 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " RIF: pagina 42, sezione 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " RIF: pagine 16-17, sezione 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " RIF: pagine 42-45, sezione 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " RIF: pagine 45-46, sezione 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " RIF: pagine 48-49, sezione 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " RIF: pagine 52-54, sezione 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Produttore\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Prodotto\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" è in conflitto con \"%s %s\"\n" +#~ " (limitazione=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s non ha opzioni corrispondenti!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s condivide un prefisso comune con %s\n" +#~ " RIF: pagina 15, sezione 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Conflitto tra le scelte predefinite!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN La parola chiave Duplex %s potrebbe non funzionare " +#~ "correttamente e dovrebbe essere Duplex!\n" +#~ " RIF: pagina 122, sezione 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Il documento contiene un misto di interruzioni di riga " +#~ "CR, LF e CR LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding richiesto dalla specifica PPD 4.3.\n" +#~ " RIF: pagine 56-57, sezione 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN La riga %d contiene solamente spazi bianchi!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Produttore richiesto dalla specifica PPD 4.3.\n" +#~ " RIF: pagine 58-59, sezione 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN Documento APDialogExtension mancante \"%s\"\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN Documento APPrinterIconPath mancante \"%s\"\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN I documenti PPD per sistemi diversi da Windows dovrebbero " +#~ "usare solo interruzioni di riga LF, non CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Versione PPD %.1f obsoleta!\n" +#~ " RIF: pagina 42, sezione 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName maggiore di 8.3 in violazione della specifica " +#~ "PPD.\n" +#~ " RIF: pagine 61-62, sezione 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols contiene PJL, ma gli attributi JCL non sono " +#~ "impostati.\n" +#~ " RIF: pagine 78-79, sezione 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols contiene sia PJL che BCP; atteso TBCP.\n" +#~ " RIF: pagine 78-79, sezione 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName richiesto dalla specifica PPD 4.3.\n" +#~ " RIF: pagine 64-65, sezione 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s non esiste!\n" + +#~ msgid " %s %s file \"%s\" has the wrong capitalization!\n" +#~ msgstr " %s %s il file \"%s\" ha una capitalizzazione errata!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Errato %s scelta %s!\n" +#~ " Rif: pagina 122, sezione 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Stringa traduzione UTF-8 \"%s\" errata per l'opzione %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Stringa traduzione UTF-8 \"%s\" errata per l'opzione %s, scelta " +#~ "%s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Valore cupsFilter \"%s\" errato!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s cupsICCProfile %s errato!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Valore cupsPreFilter \"%s\" errato!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s cupsUIConstraints %s errato: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s lingua \"%s\" errata!\n" + +#~ msgid " %s Bad spelling of %s - should be %s!\n" +#~ msgstr " %s Ortografia non corretta di %s - dovrebbe essere %s!\n" + +#~ msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID!\n" +#~ msgstr "" +#~ " %s Impossibile fornire contemporaneamente APScanAppPath e " +#~ "APScanAppBundleID!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints %s vuoto!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Manca stringa traduzione \"%s\" per l'opzione %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Manca stringa traduzione \"%s\" per l'opzione %s, scelta %s!\n" + +#~ msgid " %s Missing APDialogExtension file \"%s\"\n" +#~ msgstr " %s File APDialogExtension \"%s\" mancante\n" + +#~ msgid " %s Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " %s File APPrinterIconPath \"%s\" mancante\n" + +#~ msgid " %s Missing APPrinterLowInkTool file \"%s\"\n" +#~ msgstr " %s File APPrinterLowInkTool \"%s\" mancante\n" + +#~ msgid " %s Missing APPrinterUtilityPath file \"%s\"\n" +#~ msgstr " %s File APPrinterUtilityPath \"%s\" mancante\n" + +#~ msgid " %s Missing APScanAppPath file \"%s\"\n" +#~ msgstr " %s File APScanAppPath \"%s\" mancante\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageRegion option!\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " %s Opzione RICHIESTA PageRegion mancante!\n" +#~ " REF: Pagina 100, sezione 5.14.\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageSize option!\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " %s Opzione RICHIESTA PageSize mancante!\n" +#~ " REF: Pagina 99, sezione 5.14.\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Manca stringa traduzione *%s %s in UIConstraints \"*%s %s *%s %s" +#~ "\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Manca stringa traduzione *%s %s in cupsUIConstraints %s: \"%s" +#~ "\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Documento cupsFilter \"%s\" mancante!\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Documento cupsICCProfile \"%s\" mancante!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Documento cupsPreFilter \"%s\" mancante\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver %s mancante!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Manca opzione %s in UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Manca opzione %s in cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr "" +#~ " %s Nessuna traduzione base \"%s\" è compresa nel documento!\n" + +#~ msgid "" +#~ " %s Non-standard size name \"%s\"!\n" +#~ " REF: Page 187, section B.2.\n" +#~ msgstr "" +#~ " %s Dimensione del nome \"%s\" non standard!\n" +#~ " REF: Pagina 187, sezione B.2.\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s %s RICHIESTO non definisce la scelta Nessuno!\n" +#~ " RIF: pagina 122, sezione 5.17\n" + +#~ msgid " %s Size \"%s\" defined for %s but not for %s!\n" +#~ msgstr " %s Dimensione \"%s\" definita per %s ma non per %s.\n" + +#~ msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)!\n" +#~ msgstr " %s La misura \"%s\" ha dimensioni inattese (%gx%g)!\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s il valore hash cupsICCProfile %s si scontra con %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s causa un loop!\n" + +#~ msgid "" +#~ " %s cupsUIResolver %s does not list at least two different " +#~ "options!\n" +#~ msgstr "" +#~ " %s il cupsUIResolver %s non elenca almeno due diverse opzioni.\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s i nomi di scelta %s e %s differiscono solo per " +#~ "maiuscole e minuscole!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s deve essere 1284DeviceID!\n" +#~ " RIF: pagina 72, sezione 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** Default%s %s ERRATO\n" +#~ " RIF: pagina 40, sezione 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultImageableArea %s ERRATO!\n" +#~ " RIF: pagina 102, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultPaperDimension %s ERRATO!\n" +#~ " RIF: pagina 103, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** Attributo JobPatchFile ERRATO nel documento\n" +#~ " RIF: pagina 24, sezione 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Produttore ERRATO (dovrebbe essere \"HP\")\n" +#~ " RIF: pagina 211, tabella D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Produttore ERRATO (dovrebbe essere \"Oki\")\n" +#~ " RIF: pagina 211, tabella D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ModelName ERRATO: \"%c\" non consentito nella stringa.\n" +#~ " RIF: pagine 59-60, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PSVersion ERRATO: non è \"(string) int\".\n" +#~ " RIF: pagine 62-64, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Product ERRATO: non è \"(string)\".\n" +#~ " RIF: pagine 62, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ShortNickName ERRATO: maggiore di 31 caratteri.\n" +#~ " RIF: pagine 64-65, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Scelta %s Errata %s \n" +#~ " RIF: pagina 84, sezione 5.9.\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FileVersion \"%s\" Errata \n" +#~ " RIF: pagina 56, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FormatVersion \"%s\" Errata \n" +#~ " RIF: pagina 56, sezione 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **FAIL** LanguageEncoding %s: deve essere ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** LanguageVersion %s errata: deve essere inglese!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** Impossibile interpretare il codice opzione di default: %" +#~ "s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** La stringa di traduzione predefinita per l'opzione %s " +#~ "scelta %s contiene caratteri di 8-bit!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** La stringa di traduzione predefinita per l'opzione %s " +#~ "contiene caratteri di 8-bit!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** I nomi dei gruppi %s e %s differiscono solo per maiuscole " +#~ "e minuscole!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Varie occorrenze dei nomi di scelta %s %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** i nomi delle opzioni %s e %s differiscono solo per " +#~ "maiuscole e minuscole!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO Default%s\n" +#~ " RIF: pagina 40, sezione 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO DefaultImageableArea\n" +#~ " RIF: pagina 102, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO DefaultPaperDimension\n" +#~ " RIF: pagina 103, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO FileVersion\n" +#~ " RIF: pagina 56, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO FormatVersion\n" +#~ " RIF: pagina 56, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO ImageableArea per PageSize %s\n" +#~ " RIF: pagina 41, sezione 5.\n" +#~ " RIF: pagina 102, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO LanguageEncoding\n" +#~ " RIF: pagine 56-57, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO LanguageVersion\n" +#~ " RIF: pagine 57-58, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO Produttore\n" +#~ " RIF: pagine 58-59, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO ModelName\n" +#~ " RIF: pagine 59-60, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO NickName\n" +#~ " RIF: pagina 60, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PCFileName\n" +#~ " RIF: pagine 61-62, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PSVersion\n" +#~ " RIF: pagine 62-64, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PageRegion\n" +#~ " RIF: pagina 100, sezione 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PageSize\n" +#~ " RIF: pagina 41, sezione 5.\n" +#~ " RIF: pagina 99, sezione 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PageSize\n" +#~ " RIF: pagine 99-100, sezione 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO PaperDimension per PageSize %s\n" +#~ " RIF: pagina 41, sezione 5.\n" +#~ " RIF: pagina 103, sezione 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO prodotto\n" +#~ " RIF: pagina 62, sezione 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** RICHIESTO ShortNickName\n" +#~ " RIF: pagina 64-65, sezione 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d ERRORI RILEVATI\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " %%%%BoundingBox: errato alla riga %d!\n" +#~ " RIF: pagina 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " %%%%Page: errato alla riga %d!\n" +#~ " RIF: pagina 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " %%%%Pages: errato alla riga %d!\n" +#~ " RIF: pagina 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " La riga %d eccede i 255 caratteri (%d)!\n" +#~ " RIF: pagina 25, lunghezza della riga\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 mancante alla prima riga!\n" +#~ " RIF: pagina 17, 3.1 uniformare documenti\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Commento %%EndComments mancante!\n" +#~ " RIF: pagina 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Commento %%BoundingBox: mancante o errato!\n" +#~ " RIF: pagina 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Commenti %%Page: mancante o errato!\n" +#~ " RIF: pagina 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Commento %%Pages: mancante o errato!\n" +#~ " RIF: pagina 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " NESSUN ERRORE RILEVATO\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Trovate %d righe che eccedono i 255 caratteri!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Troppi commenti %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Troppi commenti %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Attenzione: il documento contiene dati binari!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Attenzione: nessun commento %%EndComments nel documento!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Attenzione: versione DSC %.1f obsoleta nel documento!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Impossibile aprire il documento PPD: %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Impossibile aprire il file PPD: %s alla riga %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "Busta num. 10" + +#~ msgid "#11 Envelope" +#~ msgstr "Busta num. 11" + +#~ msgid "#12 Envelope" +#~ msgstr "Busta num. 12" + +#~ msgid "#14 Envelope" +#~ msgstr "Busta num. 14" + +#~ msgid "#9 Envelope" +#~ msgstr "Busta num. 9" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s accetta richieste da %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s non è implementato dalla versione CUPS di lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s non è pronta\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s è pronta\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s è pronta e stampa\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s non accetta richieste da %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s non supportato!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s accetta richieste da %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s non accetta richieste da %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [operazione localhost %d]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s fallito: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: non so cosa fare!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Errore: i nomi della variabile d'ambiente %s non esistono nella " +#~ "destinazione \"%s\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Errore: ID dell'operazione errato!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Errore: impossibile stampare documenti e modificare operazioni " +#~ "contemporaneamente!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Errore: impossibile stampare da stdin se vengono forniti documenti o " +#~ "ID dell'operazione!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Errore: atteso set di caratteri dopo l'opzione '-S'!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Errore: atteso tipo di contenuto dopo l'opzione '-T'!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Errore: attese copie dopo l'opzione '-n'!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Errore: atteso numero di copie dopo l'opzione '-#'!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Errore: attesa destinazione dopo l'opzione '-P'!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Errore: attesa destinazione dopo l'opzione '-b'!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Errore: attesa destinazione dopo l'opzione '-d'!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Errore: atteso modulo dopo l'opzione '-f'!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Errore: atteso nome di blocco dopo l'opzione '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Errore: atteso hostname dopo l'opzione '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Errore: atteso hostname dopo l'opzione '-h'!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Errore: atteso elenco modalità dopo l'opzione '-y'!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Errore: atteso nome dopo l'opzione '-%c'!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Errore: attesa stringa di opzione dopo l'opzione '-o'!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Errore: atteso elenco delle pagine dopo l'opzione '-P'!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Errore: attesa priorità dopo l'opzione '-%c'!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Errore: atteso testo di motivazione dopo l'opzione '-r'!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Errore: atteso titolo dopo l'opzione '-t'!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Errore: atteso nome utente dopo l'opzione '-U'!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Errore: atteso nome utente dopo l'opzione '-u'!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Errore: atteso valore dopo l'opzione '-%c'!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Errore: dopo l'opzione '-W', occorre \"completati\", \"non completati" +#~ "\" o \"tutti\"!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Errore: nessuna destinazione predefinita disponibile.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Errore: la priorità deve essere tra 1 e 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Errore: la stampa programmata non risponde!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Errore: troppi documenti - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Errore: impossibile accedere a \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Errore: impossibile effettuare la coda da stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Errore: destinazione \"%s\" sconosciuta!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Errore: destinazione \"%s/%s\" sconosciuta!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Errore: opzione '%c' sconosciuta!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Errore: opzione '%s' sconosciuta!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Atteso ID dell'operazione dopo l'opzione '-i'!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filtro \"%s\" non disponibile: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Nome di destinazione non valido nell'elenco \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Stringa filtro \"%s\" non valida\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: prima di '-H restart' è richiesto l'ID dell'operazione ('-i " +#~ "jobid')!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Nessun filtro per convertire da %s/%s a %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Operazione fallita; %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Spiacente, nessun supporto di codifica compilato!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Impossibile connettersi al server\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Impossibile contattare il server!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Impossibile determinare il tipo MIME di \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Impossibile aprire %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Errore: impossibile aprire %s - %s alla riga %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: impossibile aprire %s: - %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Impossibile aprire il documento PPD: %s alla riga %d\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d.\n" +#~ msgstr "%s: Impossibile aprire il file PPD: %s alla riga %d.\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: impossibile leggere il database MIME da \"%s\" o \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Destinazione sconosciuta \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Errore: tipo MIME di destinazione %s/%s sconosciuto!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Opzione '%c' sconosciuta!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Tipo MIME sorgente %s/%s sconosciuto!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Attenzione: modificatore di formato '%c' non supportato; il risultato " +#~ "potrebbe non essere corretto!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Attenzione: opzione del set di caratteri ignorata!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Attenzione: opzione del tipo di contenuto ignorata!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Attenzione: opzione del modulo ignorata!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Attenzione: opzione modalità ignorata!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Errore: i nomi della variabile d'ambiente %s non esistono nella " +#~ "destinazione \"%s\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: Errore: attesa opzione=valore dopo l'opzione '-o'!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: Errore: nessuna destinazione predefinita disponibile.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "Scala di grigi a 600 DPI" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Sconosciuto comando aiuto non valido\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Per esportare i driver di stampa è necessaria una password Samba!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Per esportare i driver di stampa è necessario un nome utente Samba!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Esiste già una classe chiamata \"%s\"!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Esiste già una stampante chiamata \"%s\"!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (senza margini)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (senza margini)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (con margini)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (senza margini)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Tentativo di impostare printer-state %s a un valore %d errato!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "I gruppi di attributi non sono ordinati (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "URI dispositivo \"%s\" errato!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "uri dispositivo \"%s\" errato!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Schema device-uri \"%s\" errato!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "document-format \"%s\" errato!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Buffer nome documento errato!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Attributo font errato: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Valore job-priority errato!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Valore job-sheets \"%s\" errato!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Tipo valore job-sheets errato!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Valore job-state errato!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Attributo job-uri \"%s\" errato!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "notify-pull-method \"%s\" errato!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "URI notify-recipient-uri \"%s\" errato!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Opzione + scelta errata alla riga %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Port-monitor \"%s\" errato!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Valore printer-state %d errato!" + +#~ msgid "Bad request ID %d!" +#~ msgstr "ID di richiesta errato %d." + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Numero versione richiesta %d.%d errato!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "ID abbonamento errato!" + +#~ msgid "C0 Envelope" +#~ msgstr "Busta C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Busta C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Busta C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Busta C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Busta C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Busta C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Busta C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Busta C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Busta C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Set di caratteri \"%s\" non supportato!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Busta Chou3" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Busta Chou4" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "I comandi possono essere abbreviati. I comandi sono:\n" +#~ "\n" +#~ "esci aiuto chiudi stato ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Impossibile eseguire scansione del tipo \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Coperchio aperto" + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "Busta DL" + +#~ msgid "Developer almost empty." +#~ msgstr "Developer quasi vuoto." + +#~ msgid "Developer empty!" +#~ msgstr "Developer vuoto!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Dispositivo: uri = %s\n" +#~ " classe = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " posizione = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Documento %d non trovato nell'operazione %d." + +#~ msgid "Door open." +#~ msgstr "Porta aperta" + +#~ msgid "Double Postcard" +#~ msgstr "Cartolina postale doppia" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: impossibile allocare memoria per info pagina: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: impossibile allocare memoria per matrice pagine: %s\n" + +#~ msgid "ERROR: %s job-id user title copies options [file]\n" +#~ msgstr "ERROR: %s job-id utente titolo copie opzioni [file]\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox errato: commento visto!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: %%IncludeFeature errato: commento!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: %%Page errato: commento nel documento!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: %%PageBoundingBox errato: commento nel documento!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: dispositivo SCSI \"%s\" errato!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: documento charset errato %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: tipo charset errato %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: valore colonne errato %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: valore cpi errato %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: riga descrizione font errata: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: valore lpi errato %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Formato di stampa errato!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: direzione testo errata %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: ampiezza testo errata %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: la stampante di destinazione non esiste!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox duplicato: commento visto!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: %%Pages duplicato: commento visto!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: documento di stampa vuoto!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: errore %d durante l'invio della richiesta PAPSendData: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: attesa stringa tra virgolette nella riga %d di %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: errore USB fatale!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: visto comando HP-GL/2 non valido, impossibile stampare documento!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog mancante!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup mancante!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: manca URI su linea di comando e nessuna variabile ambiente " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: manca valore alla riga %d del documento banner!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: occorre una riga msgid prima di ogni stringa di traduzione alla " +#~ "riga %d di %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: nessun %%BoundingBox: commento nell'intestazione!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: nessun %%Pages: commento nell'intestazione!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: nessun dispositivo URI trovato in argv[0] e nessuna variabile " +#~ "ambiente in DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: nessun font nel set di caratteri %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: nessuna pagina trovata!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: carta esaurita!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: variabile ambiente PRINTER non definita!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: il documento stampa non è stato accettato (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: la stampante non risponde\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: la stampante non risponde!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: la stampante ha inviato un EOF inatteso\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "" +#~ "ERROR: l'host remoto non ha accettato il documento di controllo (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: l'host remoto non ha accettato il documento dati (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: si è verificato un errore di timeout durante l'invio di dati alla " +#~ "stampante\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: impossibile aggiungere il documento %d alla stampa: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: impossibile annullare la stampa %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: impossibile copiare il documento PDF" + +#~ msgid "ERROR: Unable to create pipe" +#~ msgstr "ERROR: Impossibile creare il canale" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: impossibile creare il socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: impossibile creare il documento di stampa compresso temporaneo: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: impossibile creare il documento temporaneo" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: impossibile creare il documento temporaneo: %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: impossibile creare il documento temporaneo: %s.\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: impossibile eseguire pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: impossibile eseguire il programma gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: impossibile eseguire il programma pdftops" + +#~ msgid "ERROR: Unable to execute pstops program" +#~ msgstr "ERROR: Impossibile eseguire il programma pstops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: impossibile biforcare pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: impossibile ottenere richiesta PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: impossibile ottenere risposta PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: impossibile aprire il documento PPD per la stampante \"%s\" - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: impossibile ottenere zona di default AppleTalk" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "" +#~ "ERROR: impossibile ottenere gli attributi (%2$s) della stampa %1$d!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: impossibile ottenere lo stato della stampante (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: impossibile individuare la stampante '%s'!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: impossibile cercare risposta PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: impossibile cercare stampanti AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: impossibile rendere indirizzo AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: impossibile aprire \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: impossibile aprire %s: %s\n" + +#~ msgid "ERROR: Unable to open PPD file!\n" +#~ msgstr "ERROR: Impossibile aprire il file PPD.\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: impossibile aprire documento banner \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: impossibile aprire documento dispositivo \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: impossibile aprire documento \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: impossibile aprire documento \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: impossibile aprire il documento immagine per la stampa!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: impossibile aprire documento di stampa \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: impossibile aprire il documento di stampa %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: impossibile aprire il documento di stampa %s: %s\n" + +#~ msgid "ERROR: Unable to open raster file - %s\n" +#~ msgstr "ERROR: Impossibile aprire il file raster - %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: impossibile aprire il documento di stampa compresso temporaneo: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: impossibile aprire il documento temporaneo" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: impossibile stampare colonne di testo %d!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: impossibile stampare pagina di testo %dx%d!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: impossibile leggere i dati di stampa" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: impossibile leggere i dati di stampa!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: impossibile prenotare una porta" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: impossibile trovare distanza %ld nel documento - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: impossibile trovare distanza %lld nel documento - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: impossibile inviare comando LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: impossibile inviare richiesta PAP" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: impossibile inviare richiesta dati PAP iniziale" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: impossibile inviare i dati di stampa (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: impossibile inviare i dati di stampa!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: impossibile inviare il documento di stampa alla stampante" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: impossibile inviare trailing nul alla stampante" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: impossibile attendere per pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: impossibile scrivere %d byte su \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: impossibile scrivere %d byte sulla stampante!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: impossibile scrivere documento controllo" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: impossibile scrivere dati di stampa" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: impossibile scrivere dati di stampa: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: impossibile scrivere dati raster sul driver!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: impossibile scrivere documento temporaneo" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: impossibile scrivere dati documento non compressi: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: testo inatteso alla riga %d di %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: valore opzione di codifica sconosciuto \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: ordine documento sconosciuto \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: carattere formato sconosciuto \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: formato catalogo messaggio di \"%s\" sconosciuto!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: opzione \"%s\" con valore \"%s\" sconosciuta!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: modalità di stampa \"%s\" sconosciuta\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: valore opzione versione sconosciuto \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: valore luminosità %s non supportato, utilizzo luminosità=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: valore gamma %s non supportato, utilizzo gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: valore number-up %d non supportato, utilizzo number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: valore number-up-layout %s non supportato, utilizzo number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: valore page-border %s non supportato, utilizzo page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: rilevato overflow (%d byte) doc_printf, interrompo!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: il filtro pdftops si è chiuso al segnale %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: il filtro pdftops si è chiuso con stato %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops si è chiuso al segnale %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops si è chiuso con stato %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: recuperabile: impossibile stabilire connessione con la stampante; " +#~ "riprovo fra 30 secondi...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: selezione() fallita" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: impossibile avviare documento di stampa" + +#~ msgid "Empty PPD file!" +#~ msgstr "Documento PPD vuoto!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Errore: è necessario un nome host dopo l'opzione '-h'!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Gli URI del dispositivo documento sono stati disabilitati! Per " +#~ "abilitarli, consulta l'istruzione del FileDevice in \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Temperatura del fusibile elevata!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Temperatura del fusibile bassa!" + +#~ msgid "German FanFold" +#~ msgstr "Modulo continuo tedesco" + +#~ msgid "German FanFold Legal" +#~ msgstr "Modulo continuo legale tedesco" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Ottenuto un attributo printer-uri, ma nessun job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk disabilitata in Preferenze di Sistema.\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk disabilitata in Preferenze di Sistema.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: annullo lavoro di stampa...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: connesso alla stampante...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: connetto alla stampante...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: documento di controllo inviato con successo\n" + +#~ msgid "INFO: Copying print data...\n" +#~ msgstr "INFO: Copia dei dati di stampa...\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: documento dati inviato con successo\n" + +#~ msgid "INFO: Finished page %d...\n" +#~ msgstr "INFO: Pagina %d completata...\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: formatto pagina %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: carico documento immagine...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: cerco la stampante...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: apro la connessione\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: documento stampa inviato, attendo che la stampante finisca...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: stampante occupata; riprovo fra 10 secondi...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: stampante occupata; riprovo fra 30 secondi...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: stampante occupata; riprovo fra 5 secondi...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: la stampante non supporta IPP/%d.%d, provo IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: la stampante è occupata; riprovo fra 5 secondi...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: la stampante al momento non è in linea.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: la stampante al momento non è in linea.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: la stampante è adesso in linea.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: la stampante non è in linea.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: stampante non connessa; riprovo fra 30 secondi...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: stampo pagina %d, %d%% completato...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: stampo pagina %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: pronta per stampare.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: invio documento di controllo (%lu byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: invio documento di controllo (%u byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: invio dati\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: invio documento dati (%ld byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: invio documento dati (%lld byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: invio dati di stampa...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: inviato documento stampa, %ld byte...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: inviato documento stampa, %lld byte...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: eseguo lo spool della stampa LPR, %.0f%% completato...\n" + +#~ msgid "INFO: Starting page %d...\n" +#~ msgstr "INFO: Pagina iniziale %d...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: impossibile contattare la stampante, in coda sulla stampante " +#~ "successiva nella classe...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: uso una zona di default AppleTalk\"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: attendo che la stampa sia completata...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: attendo che la stampante sia disponibile...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "Busta ISO B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (senza margini)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "Busta ISO B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "Busta ISO B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Inchiostro/toner quasi vuoto." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Inchiostro/toner vuoto!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Cestino inchiostro/toner quasi pieno." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Cestino inchiostro/toner pieno!" + +#~ msgid "Interlock open." +#~ msgstr "Interblocco aperto." + +#~ msgid "Invite Envelope" +#~ msgstr "Busta invito" + +#~ msgid "Italian Envelope" +#~ msgstr "Busta standard italiana" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "La stampa #%d non può essere riavviata: nessun documento!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "La stampa #%d non esiste!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "La stampa #%d è terminata e non può essere modificata!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "La stampa %d non è completa!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "La stampa #%d non è bloccata per l'autenticazione!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "La stampa #%d non è bloccata!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "La stampa #%s non esiste!" + +#~ msgid "Job %d not found!" +#~ msgstr "Stampa %d non trovata!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Le sottoscrizioni delle stampe non possono essere rinnovate!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Busta Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Busta Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Lingua \"%s\" non supportata!" + +#~ msgid "Media jam!" +#~ msgstr "Inceppamento supporto!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Cassetto carta quasi vuoto." + +#~ msgid "Media tray empty!" +#~ msgstr "Cassetto carta vuoto!" + +#~ msgid "Media tray missing!" +#~ msgstr "Cassetto carta mancante!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Bisogna riempire il cassetto carta." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Attributo document-number mancante!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Doppi apici mancanti alla riga %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Variabile modulo mancante" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Attributo notify-subscription-ids mancante!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Attributo requesting-user-name mancante!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Attributi necessari mancanti!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Valore mancante alla riga %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modello: nome = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Busta Monarch" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: documento di stampa accettato: ID stampa %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: documento di stampa accettato: ID stampa sconosciuto.\n" + +#~ msgid "Nested classes are not allowed!" +#~ msgstr "Le classi nidificate non sono consentite." + +#~ msgid "No PPD name!" +#~ msgstr "Nessun nome PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Non è installato nessun driver di stampa Windows!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Nessuna stampa attiva su %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Nessun attributo nella richiesta!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Nessuna informazione di autenticazione fornita!" + +#~ msgid "No default printer" +#~ msgstr "Nessuna stampante predefinita" + +#~ msgid "No file!?!" +#~ msgstr "Nessun documento!?!" + +#~ msgid "No modification time!" +#~ msgstr "Nessuna ora modifica!" + +#~ msgid "No printer name!" +#~ msgstr "Nessun nome stampante!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Nessun printer-uri trovato per la classe!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Nessun printer-uri trovato!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Nessun printer-uri nella richiesta!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Nessun attributo di sottoscrizione nella richiesta!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC quasi alla fine del proprio ciclo di vita utile." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC alla fine del proprio ciclo di vita utile!" + +#~ msgid "Out of toner!" +#~ msgstr "Toner esaurito!" + +#~ msgid "Output bin almost full." +#~ msgstr "Vassoio di uscita quasi pieno." + +#~ msgid "Output bin full!" +#~ msgstr "Vassoio di uscita pieno!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "L'uscita per la stampante %s è inviata a %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "L'uscita per la stampante %s è inviata alla stampante remota %s su %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "L'uscita per la stampante %s/%s è inviata a %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "L'uscita per la stampante %s/%s è inviata alla stampante remota %s su %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Vassoio di uscita mancante!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Busta PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Busta PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Busta PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Busta PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (senza margini)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Busta PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Busta PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Busta PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Busta PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Busta PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Busta PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Busta personale" + +#~ msgid "Printer offline." +#~ msgstr "Stampante non in linea." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "Posiz. Proprietario Stampa Doc. Dim. totali\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "Posiz. Proprietario Stampa Doc. Dim. totali\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Esecuzione del comando: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Stampante SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (senza margini)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Il valore notify-user-data è troppo grande (%d > 63 ottetti)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "La stampante o la classe non è condivisa!" + +#~ msgid "The printer or class was not found." +#~ msgstr "La stampante o la classe non è stata trovata." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Attributo printer-uri richiesto!" + +#~ msgid "Toner low." +#~ msgstr "Toner basso." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Troppi valori job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Troppi valori printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "Executive USA" + +#~ msgid "US Fanfold" +#~ msgstr "Modulo continuo USA" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "Legale USA (senza margini)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "Lettera USA (senza margini)" + +#~ msgid "US Letter (Small)" +#~ msgstr "Lettera USA (con margini)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Impossibile aggiungere la stampa alla destinazione \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Impossibile allocare memoria per tipi di documento!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile copiare i documenti dei driver della stampante per CPU a 64 " +#~ "bit (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile copiare i documenti dei driver della stampante per Windows a " +#~ "64 bit (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile copiare i documenti CUPS dei driver della stampante (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Impossibile copiare il documento PPD: %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Impossibile copiare il documento PPD!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile copiare i documenti dei driver della stampante per Windows " +#~ "2000 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile copiare i documenti dei driver della stampante per Windows 9x " +#~ "(%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Impossibile copiare lo script di interfaccia: %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Impossibile creare printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Impossibile modificare i documenti cupsd.conf più grandi di 1 MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Impossibile trovare una destinazione per la stampa!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Impossibile trovare la stampante!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile installare i documenti dei driver di stampa per Windows 2000 " +#~ "(%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Impossibile installare i documenti dei driver di stampa per Windows 9x (%" +#~ "d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Impossibile aprire il documento %d nella stampa %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Impossibile eseguire \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Impossibile inviare comandi al driver della stampante!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Impossibile configurare il driver della stampante per Windows (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Impossibile utilizzare il driver della classe USB legacy!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Errore della stampante sconosciuto (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Set di caratteri \"%s\" non supportato!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Compressione \"%s\" non supportata!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Attributo compressione %s non supportato!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Formato \"%s\" non supportato!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Formato '%s non supportato'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Formato '%s/%s' non supportato!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Utilizzo:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destinazione\n" +#~ " lpadmin [-h server] -x destinazione\n" +#~ " lpadmin [-h server] -p stampante [-c add-class] [-i interfaccia] [-m " +#~ "modello]\n" +#~ " [-r remove-class] [-v dispositivo] [-D " +#~ "descrizione]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u consenti:utente,utente] [-u non consentire:" +#~ "utente,utente]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Utilizzo: [nome documento] opzioni titolo copie utente stampa %s\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Utilizzo: [documento] opzioni titolo copie utente ID stampa %s\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Utilizzo: documento opzioni titolo copie utente ID stampa %s\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Utilizzo: convert [ opzioni ]\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -e Utilizza ogni filtro dal file PPD\n" +#~ " -f nomefile Imposta il file da convertire (altrimenti stdin)\n" +#~ " -o nomefile Imposta il file da generare (altrimenti stdout)\n" +#~ " -i tipo/mime Imposta il tipo MIME in ingresso (altrimenti auto-" +#~ "typed)\n" +#~ " -j tipo/mime Imposta il tipo MIME di uscita (altrimenti " +#~ "application/pdf)\n" +#~ " -P nomefile.ppd Imposta file PPD\n" +#~ " -a 'nome=valore ...' Imposta opzione(i)\n" +#~ " -U nomeutente Imposta il nome utente per la stampa\n" +#~ " -J titolo Imposta il titolo\n" +#~ " -c copie Imposta il numero di copie\n" +#~ " -u Rimuove il file PPD al completamento\n" +#~ " -D Rimuove il file in ingresso al completamento\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Utilizzo: convert [ opzioni ]\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -f nome documento Imposta il documento da convertire " +#~ "(altrimenti stdin)\n" +#~ " -o nome documento Imposta il documento da generare (altrimenti " +#~ "stdout)\n" +#~ " -i mime/type Imposta il tipo MIME input (altrimenti auto-" +#~ "typed)\n" +#~ " -j mime/type Imposta il tipo MIME output (altrimenti " +#~ "application/pdf)\n" +#~ " -P filename.ppd Imposta il documento PPD\n" +#~ " -a 'nome=valore ...' Imposta opzione(i)\n" +#~ " -U nome utente Imposta il nome utente per la stampa\n" +#~ " -J titolo Imposta il titolo\n" +#~ " -c copie Imposta il numero di copie\n" +#~ " -u Rimuove il documento PPD terminata l'azione\n" +#~ " -D Rimuove il documento input terminata l'azione\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Utilizzo: cupsaddsmb [opzioni] stampante1 ... stampanteN\n" +#~ " cupsaddsmb [opzioni] -a\n" +#~ "\n" +#~ "Opzioni:\n" +#~ " -E Codifica la connessione al server\n" +#~ " -H samba-server Utilizza il server SAMBA specificato\n" +#~ " -U samba-user Effettua l'autenticazione utilizzando l'utente SAMBA " +#~ "specificato\n" +#~ " -a Esporta tutte le stampanti\n" +#~ " -h cups-server Utilizza il server CUPS specificato\n" +#~ " -v Cerca di essere dettagliato (mostra comandi)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Utilizzo: cupsctl [opzioni] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -E Abilita codifica\n" +#~ " -U nome utente Specifica nome utente\n" +#~ " -h server[:porta] Specifica indirizzo server\n" +#~ "\n" +#~ " --[no-]debug-logging Attiva o disattiva logging di debug\n" +#~ " --[no-]remote-admin Attiva o disattiva amministrazione remota\n" +#~ " --[no-]remote-any Consenti/impedisci accesso da Internet\n" +#~ " --[no-]remote-printers Mostra/nascondi stampanti remote\n" +#~ " --[no-]share-printers Attiva o disattiva condivisione stampanti\n" +#~ " --[no-]-]user-cancel-any Consenti/impedisci agli utenti di annullare " +#~ "qualsiasi stampa\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Utilizzo: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Carica documento di configurazione alternativo\n" +#~ "-f Esegui in primo piano\n" +#~ "-F Esegui in primo piano, ma sganciato\n" +#~ "-h Mostra questo messaggio relativo all'utilizzo\n" +#~ "-l Esegui cupsd da launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Utilizzo: cupsfilter -m tipo/mime [ opzioni ] nomefile\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -c cupsd.conf Imposta il file cupsd.conf da utilizzare\n" +#~ " -e Usa ogni filtro dal file PPD\n" +#~ " -j job-id[,N] Filtra il file N dalla stampa specificata (predefinito " +#~ "è il file 1)\n" +#~ " -n copies Imposta il numero di copie\n" +#~ " -o name=value Imposta opzione(i)\n" +#~ " -p filename.ppd Imposta il file PPD\n" +#~ " -t title Imposta il titolo\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Utilizzo: cupsfilter -m mime/type [ opzioni] filename\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -c cupsd.conf Imposta il documento cupsd.conf da utilizzare\n" +#~ " -j job-id[,N] Filtra il documento N dalla stampa specificata " +#~ "(l'opzione di default è documento 1)\n" +#~ " -n copies Imposta il numero di copie\n" +#~ " -o name=value Imposta l'opzione(i)\n" +#~ " -p filename.ppd Imposta il documento PPD\n" +#~ " -t title Imposta il titolo\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Utilizzo: cupstestdsc [opzioni] nomedocumento.ps [... nomedocumento.ps]\n" +#~ " cupstestdsc [opzioni] -\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -h Mostra l'utilizzo del programma\n" +#~ "\n" +#~ " Nota: questo programma convalida solo i commenti DSC, non il " +#~ "PostScript stesso.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Utilizzo: cupstestppd [opzioni] nomefile1.ppd[.gz] [... nomefileN.ppd[." +#~ "gz]]\n" +#~ " programma | cupstestppd [opzioni] -\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -R cartella-radice Imposta radice alternativa\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Emette avvisi al posto degli errori\n" +#~ " -q Esecuzione silenziosa\n" +#~ " -r Modalità di apertura 'rilassata'\n" +#~ " -v Abbastanza dettagliato\n" +#~ " -vv Molto dettagliato\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Utilizzo: cupstestppd [opzioni] nomefile1.ppd[.gz] [... nomefileN.ppd[." +#~ "gz]]\n" +#~ " programma | cupstestppd [opzioni] -\n" +#~ "\n" +#~ "Opzioni:\n" +#~ "\n" +#~ " -R root-directory Configura root alternativa\n" +#~ " -W {tutti,nessuno,limitazioni,default,filtri,traduzioni}\n" +#~ " Avvisi per problemi invece di errori\n" +#~ " -q Esegui in silenzio\n" +#~ " -r Utilizza modalità di apertura 'rilassata'\n" +#~ " -v Cerca di essere abbastanza dettagliato\n" +#~ " -vv Cerca di essere molto dettagliato\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Utilizzo: lpmove stampa/fonte dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Utilizzo: lpoptions [-h server] [-E] -d stampante\n" +#~ " lpoptions [-h server] [-E] [-p stampante] -l\n" +#~ " lpoptions [-h server] [-E] -p stampante -o opzione[=valore] ...\n" +#~ " lpoptions [-h server] [-E] -x stampante\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Utilizzo: lppasswd [-g nomegruppo]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Utilizzo: lppasswd [-g nomegruppo] [nomeutente]\n" +#~ " lppasswd [-g nomegruppo] -a [nomeutente]\n" +#~ " lppasswd [-g nomegruppo] -x [nomeutente]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Utilizzo: lpq [-P dest] [-U nomeutente] [-h nomehost[:porta]] [-l] " +#~ "[+intervallo]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Utilizzo: ppdc [opzioni] nomedocumento.drv [ ... nomedocumentoN.drv ]\n" +#~ "Opzioni:\n" +#~ " -D name=value Imposta la variabile specificata con il valore.\n" +#~ " -I include-dir Aggiunge includi directory al percorso di " +#~ "ricerca.\n" +#~ " -c catalog.po Carica il catalogo messaggi specificato.\n" +#~ " -d output-dir Specifica la directory di output.\n" +#~ " -l lingua[,lingua,...] Specifica la lingua(e) di output (impostazioni " +#~ "internazionali).\n" +#~ " -m Utilizza il valore ModelName come nome documento.\n" +#~ " -t Verifica PPD invece di generarli.\n" +#~ " -v Cerca di essere abbastanza dettagliato (più v per " +#~ "ulteriori dettagli).\n" +#~ " -z Comprime i documenti PPD utilizzando GNU zip.\n" +#~ " --cr Termina le linee con CR (Mac OS 9).\n" +#~ " --crlf Termina linee con CR + LF (Windows).\n" +#~ " --lf Termina linee con LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Utilizzo: ppdhtml [opzioni] nomedocumento.drv >nomedocumento.html\n" +#~ " -D name=value Imposta il nome specificato con il valore .\n" +#~ "Opzioni:\n" +#~ " -I include-dir Aggiunge includi directory al percorso di ricerca.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Utilizzo: ppdi [options] nomedocumento.ppd [ ... nomedocumentoN.ppd ]\n" +#~ "Opzioni:\n" +#~ " -I include-dir\n" +#~ " -o nomedocumento.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Utilizzo: ppdmerge [opzioni] nomedocumento.ppd [ ... nomedocumentoN." +#~ "ppd ]\n" +#~ "Opzioni:\n" +#~ " -o nomedocumento.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Utilizzo: ppdpo [opzioni] -o nomedocumento.po nomedocumento.drv [ ... " +#~ "nomedocumentoN.drv ]\n" +#~ "Opzioni:\n" +#~ " -D name=value Imposta la variabile specificata con il valore.\n" +#~ " -I include-dir Aggiunge includi directory al percorso di ricerca.\n" +#~ " -v Cerca di essere dettagliato (più v per ulteriori " +#~ "dettagli).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Utilizzo: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: aggiungi solo le prime stampanti %d trovate" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: atteso booleano per l'opzione waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: impossibile leggere richiesta canale laterale!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: impossibile includere l'opzione \"%s\" tramite IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: la stampante non risponde\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: la stampante ha inviato un EOF inatteso!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l'host remoto non ha risposto con byte stato comando dopo %d " +#~ "secondi!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l'host remoto non ha risposto con byte stato controllo dopo %d " +#~ "secondi!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: l'host remoto non ha risposto con byte stato dati dopo %d " +#~ "secondi!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: comando SCSI scaduto (%d); riprovo...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: questo documento non è conforme alle convenzioni Adobe sulla " +#~ "struttura dei documenti (Adobe Document Structuring Conventions) e " +#~ "potrebbe non essere stampato correttamente!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: impossibile aprire documento \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: impossibile inviare richiesta PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: pacchetto PAP inatteso di tipo %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: pacchetto PAP sconosciuto di tipo %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: scelta sconosciuta \"%s\" per opzione \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: opzione sconosciuta \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: tasso baud %s non supportato!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: atteso numero per l'opzione status \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: recuperabile: l'host del network '%s' è occupato; riprovo fra %d " +#~ "secondi...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Attenzione: non è installato nessun driver di stampa per Windows 2000!" + +#~ msgid "You4 Envelope" +#~ msgstr "Busta You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: utilizza l'opzione -f per specificare un documento da " +#~ "convertire.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: nessun documento PPD per la stampante \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: impossibile connettersi al server: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: opzione sconosciuta \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: opzione sconosciuta \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "" +#~ "cupsd: atteso nome documento di configurazione dopo l'opzione \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: impossibile aprire la directory attuale!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: argomento sconosciuto \"%s\" - interruzione!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: opzione sconosciuta \"%c\" - interrompo!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: supporto launchd(8) non compilato, eseguo in modalità normale.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: numero documento %d non valido!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: ID stampa %d non valido!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: è possibile specificare solo un nome documento!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: impossibile creare il documento temporaneo: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: impossibile aprire documento di stampa - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: l'opzione -q è incompatibile con l'opzione -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: l'opzione -v è incompatibile con l'opzione -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "dispositivo per %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "dispositivo per %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tottieni aiuto riguardo ai comandi\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "attributo job-printer-uri mancante!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: il nome della classe può contenere solo caratteri stampabili!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: atteso PPD dopo l'opzione '-P'!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: atteso allow/deny:userlist dopo l'opzione '-u'!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: attesa classe dopo l'opzione '-r'!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: atteso nome classe dopo l'opzione '-c'!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: attesa descrizione dopo l'opzione '-D'!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: atteso URI di dispositivo dopo l'opzione '-v'!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: attesi tipi di documento dopo l'opzione '-I'!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: atteso nome host dopo l'opzione '-h'!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: attesa interfaccia dopo l'opzione '-i'!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: attesa posizione dopo l'opzione '-L'!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: atteso modello dopo l'opzione '-m'!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: atteso nome=valore dopo l'opzione '-o'!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: attesa stampante dopo l'opzione '-p'!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: atteso nome stampante dopo l'opzione '-d'!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: attesa stampante o classe dopo l'opzione '-x'!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: nessun nome utente trovato!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: la stampante %s è già un membro della classe %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: la stampante %s non è un membro della classe %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: il nome della stampante può contenere solo caratteri " +#~ "stampabili!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile aggiungere una stampante alla classe:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: impossibile connettersi al server: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: impossibile creare il documento temporaneo - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: impossibile creare il documento temporaneo: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: impossibile aprire documento PPD \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: impossibile aprire documento \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile rimuovere una stampante dalla classe:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare il documento PPD:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare URI dispositivo:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare lo script di interfaccia o il documento " +#~ "PPD:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare lo script di interfaccia:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare la descrizione della stampante:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare la posizione della stampante:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: impossibile impostare le opzioni della stampante:\n" +#~ " Devi specificare prima il nome di una stampante!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: opzione consenti/non consentire \"%s\" sconosciuta!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: argomento '%s' sconosciuto!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: opzione '%c' sconosciuta!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: attenzione, elenco dei tipi di contenuto ignorato!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: attesa stringa ID dispositivo 1284 dopo --device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: attesa lingua dopo --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: attesi marca e modello dopo --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: attesa stringa prodotto dopo --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: atteso elenco schema dopo --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: atteso elenco schema dopo --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: atteso timeout dopo --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: argomento '%s' sconosciuto!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: opzione '%c' sconosciuta!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: opzione '%s' sconosciuta!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: impossibile connettersi al server: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: argomento '%s' sconosciuto!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: opzione '%c' sconosciuta!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: nessuna stampante!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: impossibile aggiungere una stampante o un'istanza: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: impossibile aprire il file PPD per %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: impossibile aprire il documento PPD per %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: stampante o classe sconosciuta!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: solo root può aggiungere o eliminare le password!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: il documento delle password è occupato!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: documento delle password non aggiornato!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: spiacente, la password non corrisponde!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: spiacente, password rifiutata.\n" +#~ "La password deve essere di almeno 6 caratteri, non può contenere\n" +#~ "il nome utente e deve contenere almeno una lettera e un numero.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: spiacente, le password non corrispondono!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: impossibile copiare la stringa della password: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: impossibile aprire il documento delle password: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: impossibile scrivere il documento delle password: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: copia di sicurezza del vecchio documento delle password " +#~ "fallita: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: rinomina del documento delle password fallita: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: l'utente \"%s\" e il gruppo \"%s\" non esistono.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: errore: i nomi della variabile d'ambiente %s non esistono nella " +#~ "destinazione \"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "membri della classe %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "nessuna voce\n" + +#~ msgid "no system default destination\n" +#~ msgstr "nessuna destinazione predefinita di sistema\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events non specificato!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" è già utilizzato!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" utilizza uno schema sconosciuto!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d non corretto!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: aggiungi includi directory \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: aggiungi/aggiorna testo UI da %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: valore booleano errato (%s) alla riga %d di %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nome risoluzione errato (%s) alla riga %d di %s.\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: chiave stato errata (%s) alla riga %d di %s.\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: sostituzione variabile errata ($%c) alla riga %d di %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: scelta trovata alla riga %d di %s senza opzione!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: duplica #po per impostazioni internazionali %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: attesa una definizione filtro alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: atteso un nome applicazione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: atteso un valore booleano alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: atteso un set di caratteri dopo Font alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: atteso codice scelta alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: attesa scelta nome/testo alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: atteso ordine colore per ColorModel alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: atteso spazio colore per ColorModel alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: attesa compressione per ColorModel alla riga %d di %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: attesa stringa limitazioni per UIConstraints alla riga %d di %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: attesa parola chiave tipo driver dopo DriverType alla riga %d di %" +#~ "s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: atteso tipo duplex dopo Duplex alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: attesa codifica dopo Font alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome documento dopo #po %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome/testo gruppo alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome documento alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: atteso intero alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: attese impostazioni internazionali dopo #po alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo FileName alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo Font alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo Produttore alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo MediaSize alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo ModelName alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome dopo PCFileName alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome/testo dopo %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome/testo dopo Installabile alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: atteso nome/testo dopo Risoluzione alla riga %d di %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: attesa combinazione nome/testo per ColorModel alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: attesa opzione nome/testo alla riga %d di %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: attesa sezione opzione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: atteso tipo opzione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: atteso campo sostituzione dopo Risoluzione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: atteso numero reale alla riga %d di %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: atteso risoluzione/mediatype dopo ColorProfile alla riga %d of %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: atteso risoluzione/mediatype dopo SimpleColorProfile alla riga %d " +#~ "of %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: atteso selettore dopo %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: atteso stato dopo Font alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: attesa stringa dopo Copyright alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: attesa stringa dopo Versione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: attesi due nomi opzione alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: atteso valore dopo %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: attesa versione dopo Font alla riga %d di %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: nome documento #include/#po \"%s\" non valido!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: costo non valido per filtro alla riga %d di %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: tipo MIME vuoto non valido per filtro alla riga %d di %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: nome programma vuoto non valido per filtro alla riga %d di %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: sezione opzione \"%s\" non valida alla riga %d di %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tipo opzione \"%s\" non valida alla riga %d di %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: carico documento informazioni del driver \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: carico messaggi per impostazioni internazionali \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: carico messaggi da \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif mancante alla fine di \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if mancante alla riga %d di %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "" +#~ "ppdc: nessun catalogo messaggi fornito per impostazioni internazionali %" +#~ "s!\n" + +#~ msgid "ppdc: Option %s defined in two different groups on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: L'opzione %s è definita in due gruppi differenti alla riga %d di %" +#~ "s.\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: opzione %s ridefinita con un tipo diverso alla riga %d di %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: l'opzione limitazione deve essere *indicata alla riga %d of %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: troppi #if' nidificati alla riga %d di %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: impossibile creare il documento PPD \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: impossibile creare la directory di output %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: impossibile creare pipe di output: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: impossibile eseguire cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: impossibile trovare il documento #po %s alla riga %d di %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: impossibile trovare includi documento \"%s\" alla riga %d di %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: impossibile trovare localizzazione per \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "" +#~ "ppdc: impossibile caricare documento di localizzazione per \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: variabile non definita (%s) alla riga %d di %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: tipo driver %s sconosciuto alla riga %d di %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tipo duplex \"%s\" sconosciuto alla riga %d di %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tipo media \"%s\" sconosciuto alla riga %d di %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: token \"%s\" sconosciuto visto alla riga %d di %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: caratteri trailing sconosciuti nel numero reale \"%s\" alla riga %d " +#~ "di %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: stringa non terminata che inizia con %c alla riga %d di %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: scrivo %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: scrivo documenti PPD nella directory \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: LanguageVersion \"%s\" errato in %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: ignoro documento %s PPD...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: impossibile eseguire copia di backup di %s su %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "la stampante %s è disabilitata da %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "la stampante %s è in attesa. Abilitata da %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "la stampante %s sta stampando %s-%d. Abilitata da %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "la stampante %s/%s è disabilitata da %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "la stampante %s/%s è in attesa. Abilitata da %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "la stampante %s/%s sta stampando %s-%d. Abilitata da %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "l'id richiesto è %s-%d (%d file)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "la stampa programmata non è in esecuzione\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "la stampa programmata è in esecuzione\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "stato\t\tmostra lo stato del demone e della coda\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "destinazione predefinita di sistema: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "destinazione predefinita di sistema: %s/%s\n" diff --git a/locale/cups_ja.po b/locale/cups_ja.po new file mode 100644 index 0000000..d130ba5 --- /dev/null +++ b/locale/cups_ja.po @@ -0,0 +1,8864 @@ +# +# "$Id$" +# +# Message catalog template for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# +# Notes for Translators: +# +# The following prefixes MUST NOT be translated: "ALERT:", "CRIT:", "INFO:", +# "NOTICE:", and "WARNING:". +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-20 16:43+0900\n" +"Last-Translator: OPFC TRANSCUPS \n" +"Language-Team: OPFC TRANSCUPS \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f ミリメートル" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f to %.0f x %.0f ミリメートル" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f インチ" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f to %.2f x %.2f インチ" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s は変更できません。" + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 インチ/秒" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25インチ" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25インチ" + +msgid "1.5 inch/sec." +msgstr "1.5 インチ/秒" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25インチ" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50インチ" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00インチ" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00インチ" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 インチ/秒" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 ミリメートル/秒" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 インチ/秒" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 インチ/秒" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 ミリメートル/秒" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 ミリメートル/秒" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 ミリメートル/秒" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 インチ/秒" + +msgid "2-Sided Printing" +msgstr "両面印刷" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37インチ" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50インチ" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00インチ" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25インチ" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00インチ" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00インチ" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00インチ" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50インチ" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50インチ" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25インチ" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00インチ" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50インチ" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50インチ" + +msgid "2.5 inches/sec." +msgstr "2.5 インチ/秒" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00インチ" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00インチ" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25インチ" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1インチ" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 ミリメートル/秒" + +msgid "200 mm/sec." +msgstr "200 ミリメートル/秒" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24ピンシリーズ" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 ミリメートル/秒" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 インチ/秒" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00インチ" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25インチ" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00インチ" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00インチ" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00インチ" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00インチ" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00インチ" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50インチ" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83インチ" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83インチ" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5 インチDisk" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3.5インチ Disk - 2 1/8 x 2 3/4インチ" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00インチ" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 ミリメートル/秒" + +msgid "300 mm/sec." +msgstr "300 ミリメートル/秒" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 インチ/秒" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00インチ" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00インチ" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00インチ" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50インチ" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00インチ" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00インチ" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00インチ" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00インチ" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50インチ" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 ミリメートル/秒" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 インチ/秒" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 インチ/秒" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00\"" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00\"" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00\"" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00\"" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00\"" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00\"" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/秒" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 インチ/秒" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 インチ/秒" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00\"" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00\"" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00\"" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00\"" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00\"" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00\"" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/秒" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 インチ/秒" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-Pin Series" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "ジョブの受け付け" + +msgid "Accepted" +msgstr "受け付けました" + +msgid "Add Class" +msgstr "クラスの追加" + +msgid "Add Printer" +msgstr "プリンターの追加" + +msgid "Add RSS Subscription" +msgstr "RSS 購読を追加" + +msgid "Address" +msgstr "アドレス" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "アドレス - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "管理" + +msgid "Always" +msgstr "常に有効" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "アプリケーター" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "不正な NULL 送信先ポインター" + +msgid "Bad OpenGroup" +msgstr "不正な OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "不正な OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "不正な OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "不正なリクエスト" + +msgid "Bad SNMP version number" +msgstr "不正な SNMP バージョン番号" + +msgid "Bad UIConstraints" +msgstr "不正な UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "%d は不正なコピー値です。" + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "不正なカスタムパラメーター" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "%d は不正な number-up 値です。" + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "%d-%d は不正な page-ranges 値です。" + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "バナー" + +msgid "Billing Information: " +msgstr "課金情報: " + +msgid "Bond Paper" +msgstr "ボンド紙" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL ラベルプリンター" + +msgid "Cancel RSS Subscription" +msgstr "RSS 購読をキャンセル" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "設定の変更" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "クラス" + +msgid "Clean Print Heads" +msgstr "プリントヘッドクリーニング" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "カラー" + +msgid "Color Mode" +msgstr "カラーモード" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "コミュニティ名の長さが不定" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "継続" + +msgid "Continuous" +msgstr "連続" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "ジョブ作成" + +msgid "Created On: " +msgstr "ジョブ作成日: " + +msgid "Custom" +msgstr "カスタム" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "カット" + +msgid "Cutter" +msgstr "カッター" + +msgid "Dark" +msgstr "濃い" + +msgid "Darkness" +msgstr "濃さ" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "クラスの削除" + +msgid "Delete Printer" +msgstr "プリンターの削除" + +msgid "Description: " +msgstr "説明: " + +msgid "DeskJet Series" +msgstr "DeskJet Series" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "宛先 \"%s\" はジョブを受け付けていません。" + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "感熱紙" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "無効" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "ドライバー名: " + +msgid "Driver Version: " +msgstr "ドライバーバージョン: " + +msgid "Duplexer" +msgstr "両面オプション" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 ラベルプリンター" + +msgid "EPL2 Label Printer" +msgstr "EPL2 ラベルプリンター" + +msgid "Edit Configuration File" +msgstr "設定ファイルの編集" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "終了バナー" + +msgid "English" +msgstr "Japanese" + +msgid "Enter old password:" +msgstr "古いパスワードを入力:" + +msgid "Enter password again:" +msgstr "パスワードを再度入力:" + +msgid "Enter password:" +msgstr "パスワードを入力:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"このページにアクセスするために、あなたのユーザー名とパスワード、あるいは " +"root のユーザー名とパスワードを入力してください。Kerberos 認証を使用している" +"場合、有効な Kerberos チケットがあることを確認してください。" + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "封筒フィード" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "エラーポリシー" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "10 ラベルごと" + +msgid "Every 2 Labels" +msgstr "2 ラベルごと" + +msgid "Every 3 Labels" +msgstr "3 ラベルごと" + +msgid "Every 4 Labels" +msgstr "4 ラベルごと" + +msgid "Every 5 Labels" +msgstr "5 ラベルごと" + +msgid "Every 6 Labels" +msgstr "6 ラベルごと" + +msgid "Every 7 Labels" +msgstr "7 ラベルごと" + +msgid "Every 8 Labels" +msgstr "8 ラベルごと" + +msgid "Every 9 Labels" +msgstr "9 ラベルごと" + +msgid "Every Label" +msgstr "すべてのラベル" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Expectation Failed" + +msgid "Export Printers to Samba" +msgstr "Samba へプリンターをエクスポート" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "ファイルフォルダー" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "ファイルフォルダー - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "フォリオ" + +msgid "Forbidden" +msgstr "Forbidden" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "一般" + +msgid "Generic" +msgstr "汎用" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU は不確定の長さを使用しています" + +msgid "Glossy Paper" +msgstr "光沢紙" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "グレースケール" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hanging Folder" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hanging Folder - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "不正な制御文字" + +msgid "Illegal main keyword string" +msgstr "不正なメインキーワード文字列" + +msgid "Illegal option keyword string" +msgstr "不正なオプションキーワード文字列" + +msgid "Illegal translation string" +msgstr "不正な翻訳文字列" + +msgid "Illegal whitespace character" +msgstr "不正な空白文字" + +msgid "Installable Options" +msgstr "インストール可能オプション" + +msgid "Installed" +msgstr "インストールされています" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar ラベルプリンター" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "サーバー内部エラー" + +msgid "Internal error" +msgstr "内部エラー" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "インターネット印刷プロトコル" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "ジョブ番号 %d はすでに中断されています - キャンセルできません。" + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "ジョブ番号 %d はすでにキャンセルされています - キャンセルできません。" + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "ジョブ番号 %d はすでに完了しています - キャンセルできません。" + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "ジョブ完了" + +msgid "Job Created" +msgstr "ジョブ作成" + +msgid "Job ID: " +msgstr "ジョブ ID: " + +msgid "Job Options Changed" +msgstr "ジョブオプション変更" + +msgid "Job Stopped" +msgstr "ジョブ中止" + +msgid "Job UUID: " +msgstr "ジョブ UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "ジョブは完了し変更できません。" + +msgid "Job operation failed:" +msgstr "ジョブ操作失敗:" + +msgid "Job state cannot be changed." +msgstr "ジョブの状態を変更できません。" + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "ジョブ" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR ホストまたはプリンター" + +msgid "Label Printer" +msgstr "ラベルプリンター" + +msgid "Label Top" +msgstr "ラベルトップ" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "ラージアドレス" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "ラージアドレス - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "薄い" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "1 行が最大値 (255 文字) を超えています" + +msgid "List Available Printers" +msgstr "使用可能なプリンターをリスト化" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "場所: " + +msgid "Long-Edge (Portrait)" +msgstr "長辺給紙 (縦向き)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "プリンタードライバー: " + +msgid "Manual Feed" +msgstr "手差し" + +msgid "Media Dimensions: " +msgstr "用紙の大きさ: " + +msgid "Media Limits: " +msgstr "用紙の印字領域: " + +msgid "Media Name: " +msgstr "用紙名:" + +msgid "Media Size" +msgstr "用紙サイズ" + +msgid "Media Source" +msgstr "給紙" + +msgid "Media Tracking" +msgstr "用紙の経路" + +msgid "Media Type" +msgstr "用紙種類" + +msgid "Medium" +msgstr "紙質" + +msgid "Memory allocation error" +msgstr "メモリ割り当てエラー" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x ヘッダがありません" + +msgid "Missing asterisk in column 1" +msgstr "1 列目にアスタリスクがありません" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "値文字列がありません" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "クラスの変更" + +msgid "Modify Printer" +msgstr "プリンターの変更" + +msgid "Move All Jobs" +msgstr "すべてのジョブの移動" + +msgid "Move Job" +msgstr "ジョブの移動" + +msgid "Moved Permanently" +msgstr "別の場所へ移動しました" + +msgid "NULL PPD file pointer" +msgstr "PPD ファイルポインターが NULL です" + +msgid "Name OID uses indefinite length" +msgstr "OID 名は限定的な長さを使用します" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Never" + +msgid "New Stylus Color Series" +msgstr "New Stylus Color シリーズ" + +msgid "New Stylus Photo Series" +msgstr "New Stylus Photo シリーズ" + +msgid "No" +msgstr "いいえ" + +msgid "No Content" +msgstr "中身がありません" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "VarBind SEQUENCE がありません" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "アクティブな接続はありません" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "コミュニティ名がありません" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "追加された宛先はありません" + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "エラーインデックスがありません" + +msgid "No error-status" +msgstr "エラーステータスがありません" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "OID 名がありません" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "リクエストID がありません" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "サブスクリプションが見つかりません。" + +msgid "No variable-bindings SEQUENCE" +msgstr "variable-bindings SEQUENCE がありません" + +msgid "No version number" +msgstr "バージョン名がありません" + +msgid "Non-continuous (Mark sensing)" +msgstr "非連続です (Mark sensing)" + +msgid "Non-continuous (Web sensing)" +msgstr "非連続です (Web sensing)" + +msgid "Normal" +msgstr "標準" + +msgid "Not Found" +msgstr "見つかりません" + +msgid "Not Implemented" +msgstr "実装されていません" + +msgid "Not Installed" +msgstr "インストールされていません" + +msgid "Not Modified" +msgstr "変更されていません" + +msgid "Not Supported" +msgstr "サポートされていません" + +msgid "Not allowed to print." +msgstr "印刷が許可されていません。" + +msgid "Note" +msgstr "注意" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Off (片面)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "オンラインヘルプ" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "%s のオープンに失敗しました: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup の前にまず CloseGroup が必要です" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI の前にまず CloseUI/JCLCloseUI が必要です" + +msgid "Operation Policy" +msgstr "操作ポリシー" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "インストールされたオプション" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "オプション:" + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "出力モード" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL レーザープリンター" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "パケットが Get-Response-PDU を含んでいません" + +msgid "Packet does not start with SEQUENCE" +msgstr "パケットが SEQUENCE から始まりません" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "%s のパスワード (%s 上)? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "%s のパスワード (SAMBA 経由で %s にアクセスするのに必要):" + +msgid "Pause Class" +msgstr "クラスの休止" + +msgid "Pause Printer" +msgstr "プリンターの休止" + +msgid "Peel-Off" +msgstr "Peel-Off" + +msgid "Photo" +msgstr "写真" + +msgid "Photo Labels" +msgstr "写真ラベル" + +msgid "Plain Paper" +msgstr "普通紙" + +msgid "Policies" +msgstr "ポリシー" + +msgid "Port Monitor" +msgstr "ポートモニター" + +msgid "PostScript Printer" +msgstr "ポストスクリプトプリンター" + +msgid "Postcard" +msgstr "ハガキ" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "印刷密度" + +msgid "Print Job:" +msgstr "ジョブの印刷:" + +msgid "Print Mode" +msgstr "印刷モード" + +msgid "Print Rate" +msgstr "印刷レート" + +msgid "Print Self-Test Page" +msgstr "自己テストページの印刷" + +msgid "Print Speed" +msgstr "印刷速度" + +msgid "Print Test Page" +msgstr "テストページの印刷" + +msgid "Print and Cut" +msgstr "プリントしてカット" + +msgid "Print and Tear" +msgstr "プリントして切り取る" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "プリント対象:" + +msgid "Printed From: " +msgstr "プリント元:" + +msgid "Printed On: " +msgstr "プリント先:" + +msgid "Printer Added" +msgstr "追加されたプリンター" + +msgid "Printer Default" +msgstr "デフォルトのプリンター" + +msgid "Printer Deleted" +msgstr "削除されたプリンター" + +msgid "Printer Modified" +msgstr "変更されたプリンター" + +msgid "Printer Name: " +msgstr "プリンター名:" + +msgid "Printer Paused" +msgstr "プリンターの休止" + +msgid "Printer Settings" +msgstr "プリンター設定" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "プリンター:" + +msgid "Printers" +msgstr "プリンター" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "ジョブの削除" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Quota の制限に達しました。" + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "ジョブの拒否" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "エラー後の再印刷" + +msgid "Request Entity Too Large" +msgstr "要求するエンティティが大きすぎます" + +msgid "Resolution" +msgstr "解像度" + +msgid "Resume Class" +msgstr "クラスを再開する" + +msgid "Resume Printer" +msgstr "プリンターを再開する" + +msgid "Return Address" +msgstr "アドレスを戻す" + +msgid "Return Address - 3/4 x 2\"" +msgstr "アドレスを戻す ー 3/4 x 2\"" + +msgid "Rewind" +msgstr "戻る" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE は不定長を使用しています" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "残りを見てください" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "シリアルポート #%d" + +msgid "Server Restarted" +msgstr "再起動されたサーバー" + +msgid "Server Security Auditing" +msgstr "サーバーのセキュリティーチェック" + +msgid "Server Started" +msgstr "開始されたサーバー" + +msgid "Server Stopped" +msgstr "停止されたサーバー" + +msgid "Service Unavailable" +msgstr "利用できないサービス" + +msgid "Set Allowed Users" +msgstr "許可するユーザーの設定" + +msgid "Set As Server Default" +msgstr "サーバーをデフォルトに設定" + +msgid "Set Class Options" +msgstr "クラスオプションを設定" + +msgid "Set Printer Options" +msgstr "プリンターオプションの設定" + +msgid "Set Publishing" +msgstr "公開の設定" + +msgid "Shipping Address" +msgstr "発送アドレス" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "発送アドレス - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "短辺 (横原稿)" + +msgid "Special Paper" +msgstr "スペシャルペーパー" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "標準" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "開始バナー" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "記述" + +msgid "Stylus Color Series" +msgstr "Stylus Color シリーズ" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo シリーズ" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "スーパー A" + +msgid "Super B" +msgstr "スーパー B" + +msgid "Super B/A3" +msgstr "スーパー B/A3" + +msgid "Switching Protocols" +msgstr "プロトコルの変更" + +msgid "Tabloid" +msgstr "タブロイド" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Tear" + +msgid "Tear-Off" +msgstr "Tear-Off" + +msgid "Tear-Off Adjust Position" +msgstr "Tear-Off 位置調節" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "PPD ファイル \"%s\" が見つかりません。" + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "PPD ファイル \"%s\" が開きませんでした: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"クラス名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポンド記" +"号 (#) を含んではなりません。" + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"notify-lease-duration 属性は、ジョブサブスクリプションと一緒に使うことはでき" +"ません。" + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"プリンター名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポン" +"ド記号 (#) を含んではなりません。" + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri \"%s\" には、無効な文字が含まれています。" + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"printer-uri は、\"ipp://ホスト名/classes/クラス名\" 形式でなければなりませ" +"ん。" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"printer-uri は \"ipp://ホスト名/printers/プリンター名\" 形式でなければなりま" +"せん。" + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"サブスクリプション名には、スペース、スラッシュ (/)、疑問府 (?)、ポンド記号 " +"(#) を使用しないでください。" + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "サブスクリプションが多すぎます。" + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "熱転写メディア" + +msgid "Title: " +msgstr "タイトル: " + +msgid "Too many active jobs." +msgstr "アクティブなジョブが多すぎます。" + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "OHP シート" + +msgid "Tray" +msgstr "トレイ" + +msgid "Tray 1" +msgstr "トレイ 1" + +msgid "Tray 2" +msgstr "トレイ 2" + +msgid "Tray 3" +msgstr "トレイ 3" + +msgid "Tray 4" +msgstr "トレイ 4" + +msgid "URI Too Long" +msgstr "URI が長過ぎます" + +msgid "US Ledger" +msgstr "US レジャー" + +msgid "US Legal" +msgstr "US リーガル" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US レター" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB シリアルポート #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "cupsd.conf ファイルにアクセスできません:" + +msgid "Unable to add RSS subscription:" +msgstr " RSS 購読を追加できません:" + +msgid "Unable to add class:" +msgstr "クラスを追加できません:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "プリンターを追加ができません:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "RSS 購読をキャンセルできません:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "printer-is-shared 属性を変更することができません:" + +msgid "Unable to change printer:" +msgstr "プリンターを変更できません:" + +msgid "Unable to change server settings:" +msgstr "サーバーの設定を変更できません:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "ホストに接続できません" + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "テンポラリファイルを作成できません:" + +msgid "Unable to delete class:" +msgstr "クラスを削除できません:" + +msgid "Unable to delete printer:" +msgstr "プリンターを削除できません:" + +msgid "Unable to do maintenance command:" +msgstr "メンテナンスコマンドを実行できません:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "クラスリストを取得できません:" + +msgid "Unable to get class status:" +msgstr "クラスの状態を取得できません:" + +msgid "Unable to get list of printer drivers:" +msgstr "プリンタードライバーのリストを取得できません:" + +msgid "Unable to get printer attributes:" +msgstr "プリンター属性を取得できません:" + +msgid "Unable to get printer list:" +msgstr "プリンターリストを取得できません:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "プリンターの状態を取得できません:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "クラスを変更できません:" + +msgid "Unable to modify printer:" +msgstr "プリンターを変更できません:" + +msgid "Unable to move job" +msgstr "ジョブを移動できません" + +msgid "Unable to move jobs" +msgstr "複数のジョブを移動できません" + +msgid "Unable to open PPD file" +msgstr "PPD ファイルを読み込むことができません" + +msgid "Unable to open PPD file:" +msgstr "PPD ファイルを読み込むことができません:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "cupsd.conf ファイルを開けません:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "テストページを印刷できません:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "オプションを設定できません:" + +msgid "Unable to set server default:" +msgstr "サーバーをデフォルトに設定できません:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "cupsd.conf ファイルをアップロードできません:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "不許可" + +msgid "Units" +msgstr "ユニット" + +msgid "Unknown" +msgstr "未知" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "\"%s\" は未知の printer-error-policy です。" + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "\"%s\" は未知の printer-op-policy です。" + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "サポートされていない型の値です" + +msgid "Upgrade Required" +msgstr "アップグレードが必要です" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "値は不定長です" + +msgid "VarBind uses indefinite length" +msgstr "VarBind は不定長です" + +msgid "Version uses indefinite length" +msgstr "Version は不定長です" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "はい" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"このページには URL https://%s:%d%s を使ってア" +"クセスする必要があります。" + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL ラベル・プリンター" + +msgid "Zebra" +msgstr "ゼブラ" + +msgid "aborted" +msgstr "停止" + +msgid "canceled" +msgstr "キャンセル" + +msgid "completed" +msgstr "完了" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced の実行に失敗しました。" + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd の実行に失敗しました。" + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "エラー・インデックスは不定長です" + +msgid "error-status uses indefinite length" +msgstr "エラー・ステータスは不定長です" + +msgid "held" +msgstr "ホールド" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "待機中" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "保留" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "処理中" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "リクエスト ID の長さが不定" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "%s の状態取得に失敗しました: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "停止" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "未知" + +msgid "untitled" +msgstr "タイトルなし" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings の長さが不定" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(すべて)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(なし)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d エントリー\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\t失敗後: 継続\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\t警告:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tバナーが必要\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\t文字セット:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\t接続: 直結\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\t接続: リモート\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tデフォルト用紙サイズ:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tデフォルトピッチ:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tデフォルトポート設定:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\t説明: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\t設定されたフォーム:\n" +#~ "\tコンテンツの種類: すべて\n" +#~ "\tプリンターの種類: 不明\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\t許可されているフォーム:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tインターフェイス: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tインターフェイス: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tインターフェイス: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\t場所: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\t失敗時: 警告なし\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\t許可されているユーザー:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\t拒否されているユーザー:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tデーモンは提供されています\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tエントリーがありません\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tデバイス '%s' 上のプリンター 速度 -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\t印刷は無効です\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\t印刷は有効です\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\t%s にキューしました\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tキューは無効です\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tキューは有効です\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\t未知の理由\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " 適合テスト結果詳細\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " 参照: 15 ページ、セクション 3.1。\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " 参照: 15 ページ、セクション 3.2。\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " 参照: 19 ページ、セクション 3.3。\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " 参照: 20 ページ、セクション 3.4。\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " 参照: 27 ページ、セクション 3.5。\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " 参照: 42 ページ、セクション 5.2。\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " 参照: 16-17 ページ、セクション 3.2。\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " 参照: 42-45 ページ、セクション 5.2。\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " 参照: 45-46 ページ、セクション 5.2。\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " 参照: 48-49 ページ、セクション 5.2。\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " 参照: 52-54 ページ、セクション 5.2。\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f バイト\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " 合格 Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " 合格 DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " 合格 DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " 合格 FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " 合格 FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " 合格 LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " 合格 LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " 合格 Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " 合格 ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " 合格 NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " 合格 PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " 合格 PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " 合格 PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " 合格 PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " 合格 Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " 合格 ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " 警告 \"%s %s\" は \"%s %s\" と競合します\n" +#~ " (禁則=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " 警告 %s は相当するオプションがありません!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " 警告 %s は %s と一般プレフィックスを共有します。\n" +#~ " 参照: 15 ページ、セクション 3.2。\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " 警告 デフォルトの選択肢が競合しています!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " 警告 Duplex オプションキーワード %s は期待通りに動作しないかも" +#~ "しれません。また、Duplex という名前であるべきです!\n" +#~ " 参照: 122 ページ、セクション 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " 警告 ファイルが CR、LF、CR LF の行末を混在して含んでいます!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " 警告 LanguageEncoding は PPD 4.3 仕様で必須です。\n" +#~ " 参照: 56-57 ページ、セクション 5.3。\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " 警告 %d 行が空白だけです!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " 警告 Manufacturer は PPD 4.3 仕様で必須です。\n" +#~ " 参照: 58-59 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " 警告 非 Windows PPD ファイルは、CR LF でなく LF のみを行末に使" +#~ "うべきです!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " 警告 PPD バージョン %.1f は現在使われていません!\n" +#~ " 参照: 42 ページ、セクション 5.2。\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " 警告 8.3 文字より長い PCFileName は PPD 仕様違反です。\n" +#~ " 参照: 61-62 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " 警告 プロトコルが PJL を含んでいますが JCL 属性が設定されていま" +#~ "せん。\n" +#~ " 参照: 78-79 ページ、セクション 5.7。\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " 警告 プロトコルが PJL と BCP の両方を含んでいます; TBCP を想定" +#~ "します。\n" +#~ " 参照: 78-79 ページ、セクション 5.7。\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " 警告 ShortNickName は PPD 4.3 仕様で必須です。\n" +#~ " 参照: 64-65 ページ、セクション 5.3。\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s が存在しません!\n" + +#~ msgid " %s %s file \"%s\" has the wrong capitalization!\n" +#~ msgstr "" +#~ " %s %s ファイル \"%s\" は不正な大文字で始まるワードを含んでいます!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 不正な %s が %s を選んでいます!\n" +#~ " 参照: 122 ページ、セクション 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 用)です!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 、選択 %s)です!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s 不正な値が cupsFilter に設定されています \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s 不正な cupsICCProfile %sです!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s 不正な値が cupsPreFilter に設定されています \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 不正な cupsUIConstraints %s: \"%s\"です!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s 無効な言語 \"%s\"です!\n" + +#~ msgid " %s Bad spelling of %s - should be %s!\n" +#~ msgstr " %s %s の不正な綴りです - %s であるべきです!\n" + +#~ msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID!\n" +#~ msgstr "" +#~ " %s APScanAppPath と APScanAppBundleID は同時に指定できません!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s 空の cupsUIConstraints %sです!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s \"%s\" 翻訳文字列 (オプション %s 用) が見つかりません!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s \"%s\" 翻訳文字列 (オプション %s 、選択 %s) が見つかりません!\n" + +#~ msgid " %s Missing APDialogExtension file \"%s\"\n" +#~ msgstr " %s APDialogExtension ファイル \"%s\" が見つかりません\n" + +#~ msgid " %s Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " %s APPrinterIconPath ファイル \"%s\" が見つかりません\n" + +#~ msgid " %s Missing APPrinterLowInkTool file \"%s\"\n" +#~ msgstr " %s APPrinterLowInkTool ファイル \"%s\" が見つかりません\n" + +#~ msgid " %s Missing APPrinterUtilityPath file \"%s\"\n" +#~ msgstr " %s APPrinterUtilityPath ファイル \"%s\" が見つかりません\n" + +#~ msgid " %s Missing APScanAppPath file \"%s\"\n" +#~ msgstr " %s APScanAppPath ファイル \"%s\" が見つかりません\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageRegion option!\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " %s 必須の PageRegion オプションが見つかりません!\n" +#~ " 参照: 100 ページ、セクション 5.14。\n" + +#~ msgid "" +#~ " %s Missing REQUIRED PageSize option!\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " %s 必須の PageSize オプションが見つかりません!\n" +#~ " 参照: 99 ページ、セクション 5.14。\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s  選択 *%s %s が UIConstraints \"*%s %s *%s %s\" 内に見つかりませ" +#~ "ん!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s 選択 *%s %s が cupsUIConstraints %s: \"%s\" 内に見つかりませ" +#~ "ん!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s cupsFilter ファイル \"%s\" が見つかりません!\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s cupsICCProfile ファイル \"%s\" が見つかりません!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s cupsPreFilter ファイル \"%s\" が見つかりません!\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver ファイル %s が見つかりません!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s オプション %s がUIConstraints \"*%s %s *%s %s\" に見つかりませ" +#~ "ん!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s オプション %s がcupsUIConstraints %s に見つかりません!: \"%s\"\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s ファイルにベース翻訳文字列 \"%s\" がありません!\n" + +#~ msgid "" +#~ " %s Non-standard size name \"%s\"!\n" +#~ " REF: Page 187, section B.2.\n" +#~ msgstr "" +#~ " %s サイズ名 \"%s\" は標準にありません!\n" +#~ " 参照: 187 ページ、セクション B.2。\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 必須の %s が選択肢 None を定義していません!\n" +#~ " 参照: 122 ページ、セクション 5.17。\n" + +#~ msgid " %s Size \"%s\" defined for %s but not for %s!\n" +#~ msgstr "" +#~ " %s サイズ \"%s\" は %s 向けに定義されていますが、%s にはありませ" +#~ "ん!\n" + +#~ msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)!\n" +#~ msgstr " %s サイズ \"%s\" は規定外の寸法 (%gx%g) を持っています!\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfileのハッシュ値 %s が %s と一致しません!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolverの %s がループしています!\n" + +#~ msgid "" +#~ " %s cupsUIResolver %s does not list at least two different " +#~ "options!\n" +#~ msgstr "" +#~ " %s cupsUIResolver %s は最低でも二つの異なったオプションを持っていな" +#~ "ければなりません!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **失敗** %s が選択した %s と %s は大文字/小文字のみが違うだけで" +#~ "す!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **失敗** %s は 1284DeviceID でなければなりません!\n" +#~ " 参照: 72 ページ、セクション 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失敗** 不正な Default%s %s\n" +#~ " 参照: 40 ページ、セクション 4.5。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** %s は不正な DefaultImageableArea です!\n" +#~ " 参照: 102 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** %s は不正な DefaultPaperDimension です!\n" +#~ " 参照: 103 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **失敗** ファイルに不正な JobPatchFile 属性があります\n" +#~ " 参照: 24 ページ、セクション 3.4。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失敗** 不正な Manufacturer (\"HP\" でなければなりません)\n" +#~ " 参照: 211 ページ、表 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失敗** 不正な Manufacturer (\"Oki\" でなければなりません)\n" +#~ " 参照: 211 ページ、表 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 不正な ModelName - 文字列に \"%c\" は許可されていませ" +#~ "ん。\n" +#~ " 参照: 59-60 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 不正な PSVersion - \"(文字列) 整数\" ではありません。\n" +#~ " 参照: 62-64 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 不正な Product - \"(文字列)\" ではありません。\n" +#~ " 参照: 62 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 不正な ShortNickName - 31 文字を超えています。\n" +#~ " 参照: 64-65 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **失敗** 不正な %s が %s を選んでいます!\n" +#~ " 参照: 84 ページ、セクション 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 不正なFileVersion \"%s\"\n" +#~ " 参照: 56 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** FormatVersion が違います \"%s\"\n" +#~ " 参照: 56 ページ、セクション 5.3。\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **失敗** 無効な LanguageEncoding %s - ISOLatin1 でなければなりませ" +#~ "ん!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **失敗** 無効な LanguageVersion %s - English でなければなりませ" +#~ "ん!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **失敗** デフォルトのオプションコードが解釈できません: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **失敗** オプション %s、選択 %s のデフォルトの翻訳文字列が 8 ビット" +#~ "文字を含んでいます!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **失敗** オプション %s のデフォルトの翻訳文字列が 8 ビット文字を含" +#~ "んでいます!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **失敗** グループ名 %s と %s は大文字/小文字が違うだけです!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **失敗** %s で複数のオプション %s が選択されています!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **失敗** オプション名 %s と %s は大文字/小文字が違うだけです!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失敗** Default%s は必須\n" +#~ " 参照: 40 ページ、セクション 4.5。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** DefaultImageableArea は必須\n" +#~ " 参照: 102 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** DefaultPaperDimension は必須\n" +#~ " 参照: 103 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** FileVersion は必須\n" +#~ " 参照: 56 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** FormatVersion は必須\n" +#~ " 参照: 56 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** PageSize %s に ImageableArea は必須\n" +#~ " 参照: 41 ページ、セクション 5。\n" +#~ " 参照: 102 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** LanguageEncoding は必須\n" +#~ " 参照: 56-57 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** LanguageVersion は必須\n" +#~ " 参照: 57-58 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** Manufacturer は必須\n" +#~ " 参照: 58-59 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** ModelName は必須\n" +#~ " 参照: 59-60 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** NickName は必須\n" +#~ " 参照: 60 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** PCFileName は必須\n" +#~ " 参照: 61-62 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** PSVersion は必須\n" +#~ " 参照: 62-64 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** PageRegion は必須\n" +#~ " 参照: 100 ページ、セクション 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** PageSize は必須\n" +#~ " 参照: 41 ページ、セクション 5。\n" +#~ " 参照: 99 ページ、セクション 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** PageSize は必須\n" +#~ " 参照: 99-100 ページ、セクション 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** PageSize %s に PaperDimension は必須\n" +#~ " 参照: 41 ページ、セクション 5。\n" +#~ " 参照: 103 ページ、セクション 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** Product は必須\n" +#~ " 参照: 62 ページ、セクション 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** ShortNickName は必須\n" +#~ " 参照: 64-65 ページ、セクション 5.3。\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d 個のエラーが見つかりました\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " 不正な %%%%BoundingBox: (%d 行)!\n" +#~ " 参照: 39 ページ、%%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " 不正な %%%%Page: (%d 行)!\n" +#~ " 参照: 53 ページ、%%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " 不正な %%%%Pages: (%d 行)!\n" +#~ " 参照: 43 ページ、%%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " %d 行が 255文字より長くなっています (%d)!\n" +#~ " 参照: 25 ページ、Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " 先頭行に %!PS-Adobe-3.0 がありません!\n" +#~ " 参照: 17 ページ、3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments コメントが見つかりません!\n" +#~ " 参照: 41 ページ、%%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox: コメントが見つからないか不正です!\n" +#~ " 参照: 39 ページ、%%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page: コメントが見つからないか不正です!\n" +#~ " 参照: 53 ページ、%%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages: コメントが見つからないか不正です!\n" +#~ " 参照: 43 ページ、%%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " エラーは見つかりませんでした\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " 255文字を超える %d 行が見つかりました!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " %%BeginDocument コメントが多すぎます!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " %%EndDocument コメントが多すぎます!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " 警告: ファイルにバイナリデータが含まれています!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " 警告: ファイルに %%EndComments コメントがありません!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " 警告: ファイルは時代遅れの DSC バージョン %.1f です!\n" + +#~ msgid " FAIL\n" +#~ msgstr " 失敗\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " 失敗\n" +#~ " **失敗** PPD ファイルを開けません - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " 失敗\n" +#~ " **失敗** PPD ファイルを開けません - %s (%d 行)。\n" + +#~ msgid " PASS\n" +#~ msgstr " 合格\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 封筒" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 封筒" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 封筒" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 封筒" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 封筒" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f バイト\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f バイト\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s は %s からリクエストを受け付けています\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s は lpc の CUPS バージョンでは実装されていません。\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s は準備ができていません\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s は準備ができています\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s は準備ができており印刷しています\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s は %s からリクエストを受け付けていません\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s はサポートされていません!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s は %s からリクエストを受け付けています\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s は %s からリクエストを受け付けていません\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s:%-33.33s [ジョブ %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s に失敗しました: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: 何が起きているか不明です!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: エラー - 不正なジョブ ID です!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: エラー - ファイルを印刷できず、ジョブを同時に変えることができません!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: エラー - ファイルまたはジョブ ID が提供されている場合、標準入力から印" +#~ "刷できません。 \n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: エラー - '-S' オプションのあとには文字セットが必要です!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: エラー - '-T' オプションのあとにはコンテンツタイプが必要です!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: エラー - '-n' オプションのあとにはコピー数が必要です!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: エラー - '-#' オプションのあとにはコピー数が必要です!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: エラー - '-P' オプションのあとには宛先が必要です!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: エラー - '-b' オプションのあとに宛先が必要です!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: エラー - '-d' オプションのあとにはプリンター名が必要です!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: エラー - '-f' オプションのあとには用紙名が必要です!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: エラー - '-H' オプションのあとにはホールド名が必要です!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: エラー - '-H' オプションのあとにはホスト名が必要です!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: エラー - '-h' オプションのあとにはホスト名が必要です!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: エラー - '-y' オプションのあとにはモードリストが必要です!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: エラー - '-%c' オプションのあとには名前が必要です!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: エラー - '-o' オプションのあとには文字列が必要です!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: エラー - '-P' オプションのあとにはページリストが必要です!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: エラー - '-%c' オプションのあとには優先度が必要です!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: エラー - '-r' のあとには理由のテキストが必要です!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: エラー - '-t' オプションのあとにはタイトルが必要です!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: エラー - '-U' オプションのあとにはユーザ名が必要です!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: エラー - '-u' オプションのあとにはユーザ名が必要です!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: エラー - '-%c' オプションのあとには値が必要です!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: エラー - '-W' オプションのあとには、\"completed\"、\"not-completed\"、" +#~ "\"all\" のいずれかが必要です!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: エラー - 優先度は 1 から 100 の間である必要があります。\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: エラー - スケジューラが応答していません!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: エラー - ファイルが多すぎます - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: エラー - \"%s\" にアクセスできません - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: エラー - 標準入力からキューにデータを入力できません! - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: エラー - \"%s\" は未知の宛先です!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: エラー - \"%s/%s\" は未知の宛先です!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: エラー - '%c' は未知のオプションです!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: エラー - '%s' は未知のオプションです!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: '-i' オプションのあとにはジョブ ID が必要です!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: フィルター \"%s\" は利用できません: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: リスト \"%s\" に無効な宛先名があります!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: 無効なフィルター文字列です \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: '-H restart' の前にはジョブ ID ('-i ジョブID') が必要です!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: %s/%s から %s/%s に変換するフィルターがありません!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: 操作に失敗しました: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "" +#~ "%s: すみません、暗号化サポートはコンパイル時に組み込まれていません!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: サーバーに接続できません\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: サーバーに連絡できません!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: \"%s\" の MIME タイプを判別できません!\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: %sを開けません: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: PPD ファイルを開けません: %s の %d 行目\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d.\n" +#~ msgstr "%s: PPD ファイルを開けません: %s の %d 行目\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "" +#~ "%s: \"%s\" または \"%s\" から MIME データベースを読み取ることができませ" +#~ "ん!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: \"%s\" は未知の宛先です!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: %s/%s は未知の宛先 MIME タイプです!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: '%c' は未知のオプションです!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: %s/%s は未知のソース MIME タイプです!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: 警告 - '%c' 形式修飾子はサポートされていません - 出力は正しくないもの" +#~ "になるかもしれません!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: 警告 - 文字セットオプションは無視されます!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: 警告 - コンテンツタイプオプションは無視されます!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: 警告 - 用紙オプションは無視されます!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: 警告 - モードオプションは無視されます!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: エラー - '-o' オプションのあとには オプション=値 が必要です!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11インチ" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13インチ" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14インチ" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11インチ" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11インチ" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?無効なヘルプコマンドです\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "プリンタードライバーをエクスポートするには Samba のパスワードが必要です!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "プリンタードライバーをエクスポートするには、Samba のユーザー名が必要です!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "\"%s\" という名前のクラスはすでに存在します!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "\"%s\" という名前のプリンターはすでに存在します!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (特大)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (特大)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (小)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (特大)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "%s printer-state に 不正な値 %d を設定しようとしています!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "属性グループは範囲外です (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "\"%s\" は無効なデバイス URI です!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "\"%s\" は無効な device-uri です!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "\"%s\" は無効な device-uri スキーマです!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "\"%s\" は不正な document-format です!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "不正なファイル名バッファーです!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "不正なフォント属性: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "不正な job-priority 値です!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "\"%s\" は不正な job-sheets 値です!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "不正な job-sheets 値タイプ です!" + +#~ msgid "Bad job-state value!" +#~ msgstr "不正な job-state 値です!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "\"%s\" は無効な job-uri 属性です!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "\"%s\" は無効な notify-pull-method です!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "URI \"%s\" は不正な notify-recipient-uri です!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "%d 行に不正なオプションと選択があります!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "\"%s\" は無効な port-monitor です!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "%d は無効な printer-state 値です!" + +#~ msgid "Bad request ID %d!" +#~ msgstr "%d は無効なリクエストIDです!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "バージョン番号 %d.%d は無効なリクエストです!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "不正なサブスクリプション ID です!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 封筒" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 封筒" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 封筒" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 封筒" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 封筒" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 封筒" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 封筒" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 封筒" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 封筒" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "文字セット \"%s\" はサポートされていません!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "封筒 長形3号" + +#~ msgid "Chou4 Envelope" +#~ msgstr "封筒 長形4号" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "コマンドは短縮できます。 コマンド:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "タイプ \"%s\" を検査できませんでした!" + +#~ msgid "Cover open." +#~ msgstr "カバーが開いています。" + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL 封筒" + +#~ msgid "Developer almost empty." +#~ msgstr "現像剤が無くなりかけています。" + +#~ msgid "Developer empty!" +#~ msgstr "現像剤が無くなりました!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "デバイス: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "ドキュメント %d がジョブ %d に見つかりません。" + +#~ msgid "Door open." +#~ msgstr "ドアが開いています。" + +#~ msgid "Double Postcard" +#~ msgstr "往復はがき" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: ページ情報のメモリー割り当てができません: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: ページアレイのメモリー割り当てができません: %s\n" + +#~ msgid "ERROR: %s job-id user title copies options [file]\n" +#~ msgstr "" +#~ "ERROR: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル]\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 不正な %%BoundingBox: コメントがあります!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: 不正な %%IncludeFeature: コメントです!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: 不正な %%Page: コメントがファイルにあります!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: 不正な %%PageBoundingBox: コメントがファイルにあります!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: 不正な SCSI デバイスファイル \"%s\" です!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: 不正な charset ファイル %s です\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: 不正な charset タイプ %s です\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: 不正な columns 値 %d です!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: 不正な cpi 値 %f です!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: 不正なフォント記述行: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: 不正な lpi 値 %f です!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: 不正なページ設定です!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: 不正な テキスト方向 %s です\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: 不正な テキスト幅 %s です\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: 送信先のプリンターが存在しません!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 重複した %%BoundingBox: コメントがあります!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: 重複した %%Pages: コメントがあります!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: 空のプリントファイルです!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: エラー %d PAPSendData request の送信: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: %d 行: %s には引用符で囲まれた文字列が必要です!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: 致命的な USB エラーです!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: 無効な HP-GL/2 コマンドがあり、ファイルをプリントできません!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog が見つかりません!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup が見つかりません!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: コマンドラインにデバイス URI が見つからず、環境変数 DEVICE_URI も見" +#~ "つかりません!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: バナーファイルの %d 行目に値が見つかりません!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "ERROR: %d 行: %s の翻訳文字列の前に msgid 行が必要です!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: %%BoundingBox: コメントがありません!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: %%Pages: コメントがヘッダーにありません!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりませ" +#~ "ん!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: charset ファイル %s にフォントが見つかりません\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: ページが見つかりません!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: 用紙切れです!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER 環境変数が定義されていません!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: プリントファイルが受け付けられませんでした (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: プリンターが応答していません\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: プリンターが応答していません!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: プリンターが 想定外の EOF を送信しました\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "" +#~ "ERROR: リモートホストがコントロールファイルを受け付けませんでした (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: リモートホストがデータファイルを受け付けませんでした (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: プリンターへのデータ送信中にタイムアウトエラーが発生しました\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: ファイル %d をジョブに追加できません: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: ジョブ %d をキャンセルできません: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: PDF ファイルをコピーできません" + +#~ msgid "ERROR: Unable to create pipe" +#~ msgstr "ERROR: pipe を生成できません" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: ソケットを作成できません" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: テンポラリーの圧縮プリントファイルを作成できません: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: テンポラリーファイルを作成できません" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops を実行できません: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: gs プログラムを実行できません" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: pdftops プログラムを実行できません" + +#~ msgid "ERROR: Unable to execute pstops program" +#~ msgstr "ERROR: pstops プログラムを実行できません" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops をフォークできません: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: PAP リクエストを取得できません" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: PAP レスポンスを取得できません" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: プリンター \"%s\" の PPD ファイルを取得できません - %s\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: デフォルトの AppleTalk ゾーンを取得できません" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: ジョブ %d の属性 (%s) を取得できません!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: プリンターのステータス (%s) を取得できません!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: プリンター '%s' が見つかりません\"!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: PAP レスポンスが見つかりません" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: AppleTalk プリンターが見つかりません" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: AppleTalk アドレスを作成できません" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: \"%s\" を開けません - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: %s を開けません: %s\n" + +#~ msgid "ERROR: Unable to open PPD file!\n" +#~ msgstr "ERROR: PPD ファイルを開けません!" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: バナーファイル \"%s\" を開けません - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: デバイスファイル \"%s\" を開けません: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: ファイル \"%s\" を開けません - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: ファイル \"%s\" を開けません: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: 印刷のためのイメージファイルを開けません!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: プリントファイル \"%s\" を開けません: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: プリントファイル %s を開けません - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: プリントファイル %s を開けません: %s\n" + +#~ msgid "ERROR: Unable to open raster file - %s\n" +#~ msgstr "ERROR: ラスターファイル %s を開けません\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: テンポラリーの圧縮プリントファイルを開けません: %s\n" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: テキストカラム %d をプリントできません!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: テキストページ %dx%d をプリントできません!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: プリントデータを読み込めません" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: プリントデータを読み込めません!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: ポートを予約できません" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: ファイルでのオフセット %ld へシークできません - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: ファイルでのオフセット %lld へシークできません - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: LPD コマンドを送信できません" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: PAP tickle 要求を送信できません" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: PAP の初期データ送信要求を送信できません" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: プリントデータを送信できません (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: プリントデータを送信できません!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: プリントファイルをプリンターへ送信できません" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: 最後の NUL をプリンターへ送信できません" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops を待つことができません: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: %d バイトを \"%s\" に書き込めません: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: %d バイトをプリンターに書き込めません!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: コントロールファイルを書き込めません" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: プリントデータを書き込めません" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: プリントデータを書き込めません: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: ラスターデータをドライバーへ書き込めません!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: テンポラリーファイルへ書き込めません" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: 非圧縮ドキュメントデータを書き込めません: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: %d 行: %s は予期せぬテキストです!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: \"%s\" は未知の暗号オプション値です!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: \"%s\" は未知のファイルオーダーです\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: \"%c\" は未知の書式文字です\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: \"%s\" は未知のメッセージカタログの書式です!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: \"%s\" (値 \"%s\") は未知のオプションです!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: \"%s\" は未知のプリントモードです\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: \"%s\" は未知のバージョンオプション値です!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: %s はサポートされていない輝度値です。brightness=100 を使用します!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "" +#~ "ERROR: %s はサポートされていないガンマ値です。gamma=1000 を使用します!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: %d はサポートされていない number-up 値です。number-up=1 を使用しま" +#~ "す!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: %s はサポートされていない number-up-layout 値です。number-up-" +#~ "layout=lrtb を使用します!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: %s はサポートされていない page-border 値です。page-border=none を使" +#~ "用します!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "" +#~ "ERROR: doc_printf オーバーフロー (%d バイト) が検出され、中断しました!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops はシグナル %d で終了しました!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops は状態 %d で終了しました!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: 回復可能: プリンターに接続できません。30 秒後に再試行します...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() が失敗しました" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: プリントファイルの状態を取得できません" + +#~ msgid "Empty PPD file!" +#~ msgstr "PPD ファイルが空です!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Error: '-h' オプションのあとにはホスト名が必要です!\n" + +#~ msgid "FAIL\n" +#~ msgstr "失敗\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "ファイルデバイス URI は無効になっています! 有効にするには、\"%s/cupsd.conf" +#~ "\" の FileDevice ディレクティブを参照してください。" + +#~ msgid "Fuser temperature high!" +#~ msgstr "定着器の温度が上っています!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "定着器の温度が下っています!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "printer-uri 属性を取得しましたが、job-id を取得できませんでした!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています。\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: プリントジョブをキャンセルしています...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: プリンターに接続しました...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: プリンターに接続中...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: コントロールファイルが正常に送信されました\n" + +#~ msgid "INFO: Copying print data...\n" +#~ msgstr "INFO: 印刷データをコピーしています..." + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: データファイルが正常に送信されました\n" + +#~ msgid "INFO: Finished page %d...\n" +#~ msgstr "INFO: ページ %d を終了...\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: ページ %d をフォーマット中...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: イメージファイルをロード中...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: プリンターを探しています...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: コネクションを開いています\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: プリントファイルを送信し、プリンターが作業を完了するのを待っていま" +#~ "す...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: プリンターがビジー状態です。10 秒後に再試行します...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: プリンターがビジー状態です。30 秒後に再試行します...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: プリンターが IPP/%d.%d をサポートしていません。IPP/1.0 を試しま" +#~ "す...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: プリンターは現在オフラインです。\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: プリンターは現在オフラインです。\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: プリンターは現在オンラインです。\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: プリンターはオフラインです。\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: プリンターに接続できません。30 秒後に再試行します...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: ページ %d をプリント中、%d%% 完了しました...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: ページ %d をプリント中...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: プリントの準備ができています\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: コントロールファイルを送信中 (%lu バイト)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: コントロールファイルを送信中 (%u バイト)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: データを送信中\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: データファイルを送信中 (%ld バイト)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: データファイルを送信中 (%lld バイト)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: プリントデータを送信中...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: プリントファイルを送信、%ld バイト...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: プリントファイルを送信、%lld バイト...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: LPR ジョブをスプール中、%.0f%% 完了しました...\n" + +#~ msgid "INFO: Starting page %d...\n" +#~ msgstr "INFO: ページ %d を開始...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: プリンターと交信できません。クラス内の次のプリンターにキューしま" +#~ "す...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: デフォルトの AppleTalk ゾーン \"%s\" を使います\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: ジョブが完了するのを待っています...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: プリンターが使用可能になるのを待っています...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 封筒" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (特大)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 封筒" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 封筒" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "インクまたはトナーがほとんどありません。" + +#~ msgid "Ink/toner empty!" +#~ msgstr "インクまたはトナーがありません!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "廃インクまたは廃トナー容器がほとんど一杯です。" + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "廃インクまたは廃トナー容器が一杯です!" + +#~ msgid "Interlock open." +#~ msgstr "インターロックが開いています。" + +#~ msgid "Invite Envelope" +#~ msgstr "招待状封筒" + +#~ msgid "Italian Envelope" +#~ msgstr "イタリア封筒" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "ジョブ番号 %d を再開できません - ファイルが見つかりません!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "ジョブ番号 %d は存在しません!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "ジョブ番号 %d はすでに終了し、変更できません!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "ジョブ番号 %d は完了していません!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "ジョブ番号 %d は認証のために保留されていません!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "ジョブ番号 %d は保留されていません!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "ジョブ番号 #%s は存在しません!" + +#~ msgid "Job %d not found!" +#~ msgstr "ジョブ番号 %d は見つかりません!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "ジョブサブスクリプションが更新できません!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "角 2 封筒" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "角 3 封筒" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "言語 \"%s\" はサポートされていません!" + +#~ msgid "Media jam!" +#~ msgstr "紙詰まりです!" + +#~ msgid "Media tray almost empty." +#~ msgstr "用紙トレイが空になりかけています。" + +#~ msgid "Media tray empty!" +#~ msgstr "用紙トレイが空になりました!" + +#~ msgid "Media tray missing!" +#~ msgstr "用紙トレイが見つかりません!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "用紙トレイに補充が必要です。" + +#~ msgid "Missing document-number attribute!" +#~ msgstr "document-number 属性がありません!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "%d 行に二重引用符がありません!" + +#~ msgid "Missing form variable!" +#~ msgstr "form 変数がありません!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "notify-subscription-ids 属性がありません!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "requesting-user-name 属性が設定されていません!" + +#~ msgid "Missing required attributes!" +#~ msgstr "必須の属性が設定されていません!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "%d 行に値がありません!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "モデル: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch 封筒" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID %d。\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID 不明。\n" + +#~ msgid "No PPD name!" +#~ msgstr "PPD の名前がありません!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Windows プリンタードライバーがインストールされていません!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "%s にはアクティブなジョブはありません!" + +#~ msgid "No attributes in request!" +#~ msgstr "リクエストに属性がありません!" + +#~ msgid "No authentication information provided!" +#~ msgstr "認証情報が提供されていません!" + +#~ msgid "No default printer" +#~ msgstr "デフォルトのプリンターはありません" + +#~ msgid "No file!?!" +#~ msgstr "ファイルがありません!?!" + +#~ msgid "No modification time!" +#~ msgstr "変更時刻がありません!" + +#~ msgid "No printer name!" +#~ msgstr "プリンター名がありません!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "クラスのプリンターURI が見つかりません!" + +#~ msgid "No printer-uri found!" +#~ msgstr "プリンターURI が見つかりません!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "プリンターURI のリクエストがありません!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "リクエストにサブスクリプション属性がありません!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC はもうすぐ交換が必要になります。" + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC は交換時期です!" + +#~ msgid "Out of toner!" +#~ msgstr "トナー切れです!" + +#~ msgid "Output bin almost full." +#~ msgstr "排紙トレイがほとんど一杯です。" + +#~ msgid "Output bin full!" +#~ msgstr "排紙トレイが一杯です!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "プリンター %s の出力は %s に送られます\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "プリンター %s の出力は、リモートプリンター %s (%s 上) に送られます\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "プリンター %s/%s の出力は %s に送られます\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "プリンター %s/%s の出力は、リモートプリンター %s (%s 上) に送られます\n" + +#~ msgid "Output tray missing!" +#~ msgstr "排紙トレイが見つかりません!" + +#~ msgid "PASS\n" +#~ msgstr "合格\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 封筒" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 封筒" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 封筒" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 封筒" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (特大)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 封筒" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 封筒" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 封筒" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 封筒" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 封筒" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 封筒" + +#~ msgid "Personal Envelope" +#~ msgstr "パーソナル封筒" + +#~ msgid "Printer offline." +#~ msgstr "プリンターはオフラインです。" + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "ランク 所有者 ジョブ ファイル 合計サイズ\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "ランク 所有者 優先 ジョブ ファイル 合計サイズ\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "コマンドを実行中: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI プリンター" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "タブロイド (特大)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data 値が大きすぎます (%d > 63 オクテット)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "プリンターまたはクラスは共有できません!" + +#~ msgid "The printer or class was not found." +#~ msgstr "プリンターまたはクラスが見つかりませんでした。" + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "printer-uri 属性は必須です!" + +#~ msgid "Toner low." +#~ msgstr "トナーが少なくなっています。" + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "job-sheets 値が多すぎます (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "printer-state-reasons 値が多すぎます (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US エグゼクティブ" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US リーガル (特大)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US レター (特大)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US レター (小)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "宛先\"%s\"にジョブを追加できません!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "ファイルタイプ用にメモリを割り当てられません!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "64-bit 版の CUPS プリンタードライバーファイルをコピーできません (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "64-bit 版の Windows プリンタードライバーをコピーできません (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "複数の CUPS プリンタードライバーファイルをコピーできません (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "PPD ファイルをコピーできません! - %s" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "PPD ファイルをコピーできません!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "複数の Windows 2000 プリンタードライバーファイルをコピーできません (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "複数の Windows 9x プリンタードライバーファイルをコピーできません (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "インターフェイススクリプトをコピーできません! - %s" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "printer-uri を作成できません!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "1MB 以上の cupsd.conf ファイルは編集できません!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "ジョブの宛先が見つかりません!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "プリンターが見つかりません!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "複数の Windows 2000 プリンタードライバーファイルをインストールできません " +#~ "(%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "複数の Windows 9x プリンタードライバーファイルをインストールできません (%" +#~ "d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "ドキュメント %d (ジョブ %d)を開けません!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "\"%s\" を実行できません: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "プリンタードライバーにコマンドを送信できません!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Windows プリンタードライバーを設定できません (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "古いタイプの USB クラスドライバーは使用できません!\n" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "\"%s\" はサポートされていない文字セットです!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "\"%s\" はサポートされていない圧縮形式です!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "%s はサポートされていない圧縮属性です!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "\"%s\" はサポートされていない形式です!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "'%s' はサポートされていない形式です!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "'%s/%s' はサポートされていない形式です!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "使い方:\n" +#~ "\n" +#~ " lpadmin [-h サーバー] -d 宛先\n" +#~ " lpadmin [-h サーバー] -x 宛先\n" +#~ " lpadmin [-h サーバー] -p プリンター [-c 追加クラス] [-i インターフェイ" +#~ "ス]\n" +#~ " [-m モデル] [-r 削除クラス] [-v デバイス]\n" +#~ " [-D 宛先] [-P PPD ファイル] [-o 名前=値]\n" +#~ " [-u allow:ユーザー,ユーザー] [-u deny:ユーザー,ユー" +#~ "ザー]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "" +#~ "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル名]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "" +#~ "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "" +#~ "使い方: %s ジョブID ユーザー タイトル コピー数 オプション ファイル\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "使い方: convert [オプション]\n" +#~ "\n" +#~ "オプション:\n" +#~ "\n" +#~ " -e PPD ファイルからすべてのフィルターを使用する\n" +#~ " -f filename 変換するファイルを指定する (指定がなければ stdin と" +#~ "なる)\n" +#~ " -o filename 生成するファイルを指定する (指定がなければ stdout " +#~ "となる)\n" +#~ " -i mime/type 入力の MIME タイプを指定する (指定がなければ自動タ" +#~ "イプ)\n" +#~ " -j mime/type 出力の MIME タイプを指定する (指定がなければ " +#~ "application/pdf)\n" +#~ " -P filename.ppd PPD ファイルを指定する\n" +#~ " -a 'name=value ...' オプションを指定する\n" +#~ " -U username ジョブのユーザー名を指定する\n" +#~ " -J title タイトルを指定する\n" +#~ " -c copies 部数を指定する\n" +#~ " -u 終了したときに PPD ファイルを削除する\n" +#~ " -D 終了したときに入力ファイルを削除する\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "使い方: cupsaddsmb [オプション] プリンター ... プリンターN\n" +#~ " cupsaddsmb [オプション] -a\n" +#~ "\n" +#~ "オプション:\n" +#~ " -E サーバーとの接続を暗号化する\n" +#~ " -H sambaサーバー 指定の SAMBA サーバーを使う\n" +#~ " -U sambaユーザー 指定の SAMBA ユーザーを使って認証する\n" +#~ " -a すべてのプリンターをエキスポートする\n" +#~ " -h cupsサーバー 指定の CUPS サーバーを使う\n" +#~ " -v 冗長にする (コマンドを表示する)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "使い方: cupsctl [オプション] [パラメータ=値 ... パラメータN=値N]\n" +#~ "\n" +#~ "オプション:\n" +#~ "\n" +#~ " -E 暗号化を有効にする\n" +#~ " -U ユーザ名 ユーザー名を指定する\n" +#~ " -h サーバー[:ポート] サーバーアドレスを指定する\n" +#~ "\n" +#~ " --[no-]debug-logging デバッグログの有効/無効を切り替える\n" +#~ " --[no-]remote-admin リモート管理の有効/無効を切り替える\n" +#~ " --[no-]remote-any インターネットからのアクセスを許可/禁止する\n" +#~ " --[no-]remote-printers リモートプリンターを表示/非表示にする\n" +#~ " --[no-]share-printers プリンター共有の有効/無効を切り替える\n" +#~ " --[no-]user-cancel-any あらゆるジョブのキャンセルをユーザーに許可/禁" +#~ "止する\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "使い方: cupsd [-c 設定ファイル] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c 設定ファイル 別の設定ファイルをロードする\n" +#~ "-f フォアグラウンドで実行する\n" +#~ "-F フォアグラウンドで実行するがデタッチする\n" +#~ "-h この使い方を表示する\n" +#~ "-l launchd(8) から cupsd を実行する\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -e Use every filter from the PPD file\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "使い方: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf 使用する cupsd.conf ファイルの指定\n" +#~ " -e PPD ファイルで指定されたすべてのフィルターを使用する\n" +#~ " -j job-id[,N] フィルターファイル N を指定されたジョブから使用する (デ" +#~ "フォルトは ファイル 1)\n" +#~ " -n copies 印刷部数を指定する\n" +#~ " -o name=value オプションを指定する\n" +#~ " -p filename.ppd PPDファイルを指定する\n" +#~ " -t title タイトルを指定する\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "使い方: cupstestdsc [オプション] ファイル名.ps [... ファイル名.ps]\n" +#~ " cupstestdsc [オプション] -\n" +#~ "\n" +#~ "オプション:\n" +#~ "\n" +#~ " -h プログラムの使い方を表示する\n" +#~ "\n" +#~ " 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を" +#~ "検証するものではありません。\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "使い方: cupstestppd [オプション] filename1.ppd[.gz] [... filenameN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [オプション] -\n" +#~ "\n" +#~ "オプション:\n" +#~ "\n" +#~ " -R root-directory 違うルートディレクトリを指定\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +#~ "translations}\n" +#~ " 指定されたものをエラーの代わりに警告として扱う\n" +#~ " -q メッセージなしモードで動く\n" +#~ " -r 「リラックス」オープンモードで開く\n" +#~ " -v メッセージ多めモード\n" +#~ " -vv メッセージ非常に多めモード\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "使い方: lpmove ジョブ/ソース 宛先\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "使い方: lpoptions [-h サーバー] [-E] -d プリンター\n" +#~ "   lpoptions [-h サーバー] [-E] [-p プリンター] -l\n" +#~ " lpoptions [-h サーバー] [-E] -p プリンター -o オプション[=" +#~ "値] ...\n" +#~ " lpoptions [-h サーバー] [-E] -x プリンター\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "使い方: lppasswd [-g グループ名]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "使い方: lppasswd [-g グループ名] [ユーザ名]\n" +#~ " lppasswd [-g グループ名] -a [ユーザ名]\n" +#~ " lppasswd [-g グループ名] -x [ユーザ名]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "使い方: lpq [-P 宛先] [-U ユーザー名] [-h ホスト名[:ポート]] [-l] [+間" +#~ "隔]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "使い方: ppdc [オプション] ファイル名.drv [ ... ファイル名N.drv ]\n" +#~ "オプション:\n" +#~ " -D 変数名=値 変数名で指定した変数に値をセットする\n" +#~ " -I include-dir include-dir で指定したディレクトリをサーチパスに追" +#~ "加\n" +#~ " -c catalog.po 指定したメッセージカタログをロードする\n" +#~ " -d output-dir 出力ディレクトリ(output-dir)を指定する\n" +#~ " -l lang[,lang,...] 出力言語を指定する。(複数可能)\n" +#~ " -m ModelName の値をファイル名として使用する\n" +#~ " -t PPD を出力しないでテストする\n" +#~ " -v 冗長出力を行う (v を追加してさらに冗長に)\n" +#~ " -z PPD ファイルを GNU zip を使って圧縮する\n" +#~ " --cr ラインの最後は CR (Mac OS 9 方式).\n" +#~ " --crlf ラインの最後は CR + LF (Windows 方式).\n" +#~ " --lf ラインの最後は LF (UNIX/Linux/Mac OS X 方式).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "使い方: ppdhtml [オプション] ファイル名.drv >ファイル名.html\n" +#~ " -D 変数名=値 変数名で指定した変数に値をセットする\n" +#~ "オプション:\n" +#~ " -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "使い方: ppdi [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n" +#~ "オプション:\n" +#~ " -I インクルードディレクトリ\n" +#~ " -o ファイル名.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "使い方: ppdmerge [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n" +#~ "オプション:\n" +#~ " -o ファイル名.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "使い方: ppdpo [オプション] -o ファイル名.po ファイル名.drv [ ... ファイル" +#~ "名N.drv ]\n" +#~ "オプション:\n" +#~ " -D 変数名=値 変数名で指定した変数に値をセットする\n" +#~ " -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n" +#~ " -v 冗長出力を行う (v を追加してさらに冗長に)\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "使い方: snmp [ホストまたはIPアドレス]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: 発見した順番に %d 台のプリンターだけ追加します" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: 論理値は、waiteof オプション \"%s\" であるべきです\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: サイドチャンネルの読み出しに失敗しました!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: オプション \"%s\" は IncludeFeature 経由で含めることはできませ" +#~ "ん!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: プリンターが反応しません\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: プリンターが意図しない EOF を返しました\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: リモートホストは %d 秒経ってもコマンド・ステータス・バイトを返し" +#~ "ませんでした!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: リモートホストは %d 秒経ってもコントロール・ステータス・バイトを" +#~ "返しませんでした!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: リモートホストは %d 秒経ってもデータ・ステータス・バイトを返しま" +#~ "せんでした!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: SCSI コマンドはタイムアウトしました (%d)。再試行中...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: この書類は Adobe Document Structuring Conventions に適合しておら" +#~ "ず、正しくプリントできない可能性があります!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: \"%s:%s\": %s を開けません\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: PAP ステータス・リクエストを送信できません" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: %d タイプの意図しない PAP パケット\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: 未知の PAP パケットのタイプ %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: \"%s\" (オプション \"%s\" 用) は未知の設定です!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: \"%s\" は未知のオプションです!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: %s はサポートしないボーレートです!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: ステータス・オプションの期待値は \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: 回復可能: ネットワークホスト '%s' はビジー状態です (%d 秒後に再試" +#~ "行します...)\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "警告、Windows 2000 プリンタードライバーがインストールされていません!" + +#~ msgid "You4 Envelope" +#~ msgstr "洋形 4 号" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: 変換するファイルを指定するには、-f オプションを使ってください。\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: プリンター \"%s\" の PPD ファイルがありません - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: サーバー: %s に接続できません\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: \"%s\" は未知のオプションです!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: \"-%c\"は未知のオプションです!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: -c オプションのあとには設定ファイル名が必要です!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: カレント・ディレクトリを取得できません!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: \"%s\" は未知の引数です - 停止します!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: \"%c\" は未知のオプションです - 停止します!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: launchd(8) サポートがコンパイルされていないので、通常モードで動作し" +#~ "ます。\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: 不正な文書番号 %d です!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: 不正なジョブID %d です!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: ひとつのファイル名のみを指定できます!\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: ジョブ・ファイルを取得できません - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: -q オプションは -v オプションと両立できません。\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: -v オプションは -q オプションと両立できません。\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "%s/%s のデバイス: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "%s のデバイス: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tコマンドのヘルプを取得\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri 属性がありません!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: クラス名は表示可能文字のみで構成されなければなりません!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: '-P' オプションのあとに PPD が必要です!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin: '-u' オプションのあとには allow/deny:ユーザーリスト が必要です!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: '-r' オプションのあとにはクラス名が必要です!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: '-c' オプションのあとにはクラス名が必要です!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: '-D' オプションのあとに説明が必要です!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: '-v' オプションのあとにはデバイス URI が必要です!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: '-I' オプションのあとにファイル形式が必要です!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: '-h' オプションのあとにはホスト名が必要です!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: '-i' オプションのあとにはインターフェイス名が必要です!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: '-L' オプションのあとに場所が必要です!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: '-m' オプションのあとにはモデル名が必要です!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: '-o' オプションのあとには 変数名=値 が必要です!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: '-p' オプションのあとにはプリンター名が必要です!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: '-d' オプションのあとにはプリンター名が必要です!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "" +#~ "lpadmin: '-x' オプションのあとにはプリンター名またはクラス名が必要です!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: メンバー名が見当たりません!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: プリンター %s はすでにクラス %s のメンバーです。\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: プリンター %s はクラス %s のメンバーではありません。\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: プリンター名には印字可能な文字のみ使用できます!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: クラスにプリンターを追加できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: サーバーに接続できません: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: PPD ファイル \"%s\" を開けません - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: ファイル \"%s\" を開けません: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: クラスからプリンターを削除できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: PPD ファイルを設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: デバイス URI を設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: インターフェイス・スクリプトまたは PPD ファイルを設定できませ" +#~ "ん:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: インターフェイススクリプトを設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: プリンターの説明を設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: プリンターの場所が設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: プリンター・オプションを設定できません:\n" +#~ " 先にプリンター名を指定する必要があります!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin:\"%s\" は未知の allow/deny オプションです!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: '%s' は未知の引数です!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: '%c' は未知のオプションです!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: 警告 - コンテンツタイプリストは無視されます!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo: --device-id の後には、1284デバイスIDを指定する必要があります!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: --language の後には、言語を指定する必要があります!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "" +#~ "lpinfo: --make-and-model の後には、メーカーとモデルを指定する必要がありま" +#~ "す!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: --product の後には、製品名を指定する必要があります!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "" +#~ "lpinfo: --exclude-schemes の後には、スキーマ・リストを指定する必要がありま" +#~ "す!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "" +#~ "lpinfo: --include-schemes の後には、スキーマ・リストを指定する必要がありま" +#~ "す!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "" +#~ "lpinfo: --timeout の後には、タイムアウト値を指定する必要があります!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: 未知の引数 '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: 未知のオプション '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: 未知のオプション '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: サーバーに接続できません: %s!\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: 未知の引数 '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: 未知のオプション '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: プリンターがありません!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: %s の PPD ファイルを開けません!: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: %s の PPD ファイルを開けません!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: 未知のプリンターまたはクラスです!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: root だけがパスワードの追加と削除を行えます!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: パスワードファイルがビジー状態です!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: パスワードファイルは更新されません!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: すみませんが、パスワードは拒否されました。\n" +#~ "パスワードは少なくとも 6 文字以上で、あなたのユーザー名を含んではなら" +#~ "ず、\n" +#~ "少なくとも 1 つの英字および数値を含んでなければなりません。\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: パスワード文字列をコピーできません: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: パスワードファイルを開けません: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: パスワードファイルに書き込めません: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: 古いパスワードファイルのバックアップに失敗しました: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: パスワードファイルの名前の変更に失敗しました: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: ユーザー \"%s\" およびグループ \"%s\" は存在しません。\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: エラー - 環境変数 %s が、存在しない宛先 \"%s\" を指しています!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "クラス %s のメンバー:\n" + +#~ msgid "no entries\n" +#~ msgstr "エントリーがありません\n" + +#~ msgid "no system default destination\n" +#~ msgstr "システムのデフォルトの宛先がありません\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events が指定されていません!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" はすでに使われています!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" には未知のスキームが使われています!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d は良くありません!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: ディレクトリー \"%s\" を追加しています...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: %s から UI テキストを追加または更新しています...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "" +#~ "ppdc: 不正な boolean 値 (%s) があります。%d 行目、ファイル名 %s。\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: 不正な resolution 名 \"%s\" があります。%d 行目、ファイル名 %s !\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: 不正な status キーワード %s があります。%d 行目、ファイル名 %s !\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: 不正な数値置換 ($%c) があります。%d 行目、ファイル名 %s。\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s で、Option がないのに Choice が見つかりまし" +#~ "た!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: locale %s に対して #po が2重に定義されています。%d 行目、ファイル名 " +#~ "%s !\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s においてフィルター定義が必要です!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s においてプログラム名が必要です!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において boolean 値が必要です。\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Font の後に charset が必要です!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において choice code が必要です。\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において choice name/text が必要です。\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ColorModel に対する color order が必" +#~ "要です!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ColorModel に対する colorspace が必" +#~ "要です!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ColorModel に対する compression が必" +#~ "要です!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において UIConstraints に対する constraint が" +#~ "必要です!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において DriverType の後に driver type " +#~ "keyword が必要です!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Duplex の後に type が必要です!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Font の後に encoding が必要です!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: #po %s の後にファイル名が必要です! (%d 行目, ファイル %s)\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において group name/text が必要です!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において include ファイル名が必要です!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において整数指定が必要です!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において #po の後に locale が必要です!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: %s の後に name が必要です。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において FileName の後に name が必要です!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Font の後に name が必要です!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Manufacturer の後に name が必要で" +#~ "す!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において MediaSize の後に name が必要です!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ModelName の後に name が必要です!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において PCFileName の後に name が必要です!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: %s の後に name/text が必要です。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Installable の後に name/text が必要" +#~ "です!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Resolution の後に name/text が必要で" +#~ "す!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ColorModel に対する name/text が必要" +#~ "です!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において option name/text が必要です!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において option section が必要です!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において option type が必要です!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Resolution の後に override field が" +#~ "必要です!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において実数が必要です!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において ColorProfile に続いて resolution/" +#~ "mediatype が必要です!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において SimpleColorProfile に続いて " +#~ "resolution/mediatype が必要です!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: %s の後に selector が必要です。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Font の後に status が必要です!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Copyright の後に文字列が必要です!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Version の後に文字列が必要です!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において 2 つのオプション名が必要です!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: %s の後に value が必要です。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Font の後に version が必要です!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: 無効な #include/#po ファイル名です \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な cost があり" +#~ "ます!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の MIME " +#~ "type があります!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の program " +#~ "name があります!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: 無効な option section があります \"%s\"。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: 無効な option type があります \"%s\"。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: ドライバー情報ファイル \"%s\" を読み込んでいます...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: ロケール \"%s\" のメッセージを読み込んでいます...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" からメッセージを読み込んでいます...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: \"%s\" の最後に #endif が見つかりません!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において #if が見つかりません!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: ロケール %s に対するメッセージカタログが見つかりません!\n" + +#~ msgid "ppdc: Option %s defined in two different groups on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: オプション %s が行 %d、ファイル %s の 2 つの異なるグループで定義され" +#~ "ています!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: オプション %s は異なる型で再定義されています。%d 行目、ファイル名 %" +#~ "s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %d 行目、ファイル名 %s において Option constraint は *name で指定し" +#~ "ます!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: %d 行目、ファイル名 %s において #if のネストが多すぎます!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: PPD ファイル \"%s\" を作成できません - %s。\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: ディレクトリー \"%s\" を作成できません - %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: 出力 pipe が作成できません: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: cupstestppd を実行できません: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: #po ファイル %s が見つかりません。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: インクルードファイル %s が見つかりません。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: \"%s\" に対する地域化情報が見つかりません - %s \n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: \"%s\" に対する地域化情報を読み込めません - %s \n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: 変数 (%s) は未定義です。%d 行目、ファイル名 %s。\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: %s は未知のドライバータイプです。%d 行目、ファイル名 %s。\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: \"%s\" は未知の両面タイプです。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: \"%s\" は未知の用紙サイズです。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: 未知の token \"%s\" があります。%d 行目、ファイル名 %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: 実数に未知の終了文字 \"%s\" があります。%d 行目、ファイル名 %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %c で始まる文字に対して終端文字がありません。%d 行目、ファイル名 %" +#~ "s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: %s を書き込んでいます...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: ディレクトリー \"%s\" に PPD ファイルを書き込んでいます...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: 不正な LanguageVersion \"%s\" が %s にあります!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: PPD ファイル %s を無視します...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: %s を %s にバックアップできません - %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "プリンター %s は %s から無効です -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "プリンター %s は待機中です。%s 以来有効です\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "プリンター %s は %s-%d を印刷しています。%s 以来有効です\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "プリンター %s/%s は %s から無効です -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "プリンター %s/%s は待機中です。%s 以来有効です\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "プリンター %s/%s は現在 %s-%d を印刷中です。%s 以来有効です\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "リクエスト ID は %s-%d です (%d 個のファイル)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "スケジューラーは動作していません\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "スケジューラーは動作中です\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tデーモンとキューの状態を表示\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "システムのデフォルトの宛先: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "システムのデフォルトの宛先: %s/%s\n" diff --git a/locale/cups_ko.po b/locale/cups_ko.po new file mode 100644 index 0000000..7a2d158 --- /dev/null +++ b/locale/cups_ko.po @@ -0,0 +1,8650 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0fmm" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f~%.0f x %.0fmm" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f인치" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f~%.2f x %.2f인치" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s을(를) 변경할 수 없습니다." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1인치/초" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25\"" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25\"" + +msgid "1.5 inch/sec." +msgstr "1.5인치/초" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25\"" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50\"" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00\"" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10인치/초" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100mm/초" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11인치/초" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12인치/초" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120mm/초" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15mm/초" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150mm/초" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2인치/초" + +msgid "2-Sided Printing" +msgstr "양면 프린트 중" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37\"" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50\"" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00\"" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25\"" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00\"" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00\"" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00\"" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50\"" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50\"" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25\"" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00\"" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50\"" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50\"" + +msgid "2.5 inches/sec." +msgstr "2.5인치/초" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00\"" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00\"" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20mm/초" + +msgid "200 mm/sec." +msgstr "200mm/초" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24핀 시리즈" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250mm/초" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3인치/초" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00\"" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25\"" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00\"" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00\"" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00\"" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00\"" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00\"" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50\"" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83\"" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5\" 디스크" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3.5\" 디스크 - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30mm/초" + +msgid "300 mm/sec." +msgstr "300mm/초" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4인치/초" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00\"" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00\"" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00\"" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50\"" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00\"" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00\"" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00\"" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00\"" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40mm/초" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5인치/초" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6인치/초" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00\"" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00\"" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00\"" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00\"" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00\"" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00\"" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60mm/초" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7인치/초" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8인치/초" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00\"" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00\"" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00\"" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00\"" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00\"" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00\"" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80mm/초" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9인치/초" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9핀 시리즈" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "작업 허용" + +msgid "Accepted" +msgstr "허용됨" + +msgid "Add Class" +msgstr "클래스 추가" + +msgid "Add Printer" +msgstr "프린터 추가" + +msgid "Add RSS Subscription" +msgstr "RSS 구독 추가" + +msgid "Address" +msgstr "주소" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "주소 - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "관리" + +msgid "Always" +msgstr "항상" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "적용자" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "잘못된 NULL dests 포인터" + +msgid "Bad OpenGroup" +msgstr "잘못된 OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "잘못된 OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "잘못된 OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "잘못된 요청" + +msgid "Bad SNMP version number" +msgstr "잘못된 SNMP 버전 번호" + +msgid "Bad UIConstraints" +msgstr "잘못된 UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "잘못된 복사 매수 값 %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "잘못된 사용자 설정 매개변수" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "잘못된 number-up 값 %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "잘못된 page-ranges 값 %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "배너" + +msgid "Billing Information: " +msgstr "지불 정보: " + +msgid "Bond Paper" +msgstr "고급 종이" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL 레이블 프린터" + +msgid "Cancel RSS Subscription" +msgstr "RSS 구독 취소" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "설정값 변경" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "클래스" + +msgid "Clean Print Heads" +msgstr "프린트 머리말 지우기" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "색상" + +msgid "Color Mode" +msgstr "색상 모드" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "커뮤니티 이름 길이가 무제한입니다" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "계속" + +msgid "Continuous" +msgstr "계속" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "생성됨" + +msgid "Created On: " +msgstr "다음에 생성됨: " + +msgid "Custom" +msgstr "사용자화" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "오려두기" + +msgid "Cutter" +msgstr "자르기 도구" + +msgid "Dark" +msgstr "어둡게" + +msgid "Darkness" +msgstr "어둠" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "클래스 삭제" + +msgid "Delete Printer" +msgstr "프린터 삭제" + +msgid "Description: " +msgstr "설명: " + +msgid "DeskJet Series" +msgstr "DeskJet 시리즈" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "\"%s\" 대상이 작업을 허용하지 않습니다." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "직접 열 미디어" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "비활성화됨" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "드라이버 이름: " + +msgid "Driver Version: " +msgstr "드라이버 버전: " + +msgid "Duplexer" +msgstr "양면 프린터" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 레이블 프린터" + +msgid "EPL2 Label Printer" +msgstr "EPL2 레이블 프린터" + +msgid "Edit Configuration File" +msgstr "구성 파일 편집" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "배너 종료 중" + +msgid "English" +msgstr "Korean" + +msgid "Enter old password:" +msgstr "이전 암호 입력:" + +msgid "Enter password again:" +msgstr "암호 다시 입력:" + +msgid "Enter password:" +msgstr "암호 입력:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"이 페이지에 연결하려면 사용자 이름 및 암호 또는 root 사용자 이름 및 암호를 입" +"력하십시오. Kerberos 인증을 사용하고 있다면, 유효한 Kerberos 티켓을 가지고 있" +"는지 확인하십시오." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "봉투 공급" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "오류 정책" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "10개 레이블마다" + +msgid "Every 2 Labels" +msgstr "2개 레이블마다" + +msgid "Every 3 Labels" +msgstr "3개 레이블마다" + +msgid "Every 4 Labels" +msgstr "4개 레이블마다" + +msgid "Every 5 Labels" +msgstr "5개 레이블마다" + +msgid "Every 6 Labels" +msgstr "6개 레이블마다" + +msgid "Every 7 Labels" +msgstr "7개 레이블마다" + +msgid "Every 8 Labels" +msgstr "8개 레이블마다" + +msgid "Every 9 Labels" +msgstr "9개 레이블마다" + +msgid "Every Label" +msgstr "모든 레이블" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "예상 실패" + +msgid "Export Printers to Samba" +msgstr "Samba로 프린터 보내기" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "파일 폴더" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "파일 폴더 - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "2절지" + +msgid "Forbidden" +msgstr "금지됨" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "일반" + +msgid "Generic" +msgstr "일반" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU 길이가 무제한입니다" + +msgid "Glossy Paper" +msgstr "글로시 종이" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "그레이 스케일" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "행잉 폴더" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "행잉 폴더 - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "올바르지 않은 제어 문자" + +msgid "Illegal main keyword string" +msgstr "올바르지 않은 주 키워드 스트링" + +msgid "Illegal option keyword string" +msgstr "올바르지 않은 옵션 키워드 스트링" + +msgid "Illegal translation string" +msgstr "올바르지 않은 번역 스트링" + +msgid "Illegal whitespace character" +msgstr "올바르지 않은 여백 문자" + +msgid "Installable Options" +msgstr "설치 가능한 옵션" + +msgid "Installed" +msgstr "설치됨" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar 레이블 프린터" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "내부 오류" + +msgid "Internet Postage 2-Part" +msgstr "인터넷 우표 2부분" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "인터넷 우표 2부분 - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "인터넷 우표 3부분" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "인터넷 우표 3부분 - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "인터넷 프린트 프로토콜" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "#%d 작업이 이미 중단됨 - 취소할 수 없습니다." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "#%d 작업이 이미 취소됨 - 취소할 수 없습니다." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "#%d 작업이 이미 완료됨 - 취소할 수 없습니다." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "작업이 완료됨" + +msgid "Job Created" +msgstr "작업이 생성됨" + +msgid "Job ID: " +msgstr "작업 ID: " + +msgid "Job Options Changed" +msgstr "작업 옵션이 변경됨" + +msgid "Job Stopped" +msgstr "작업이 중단됨" + +msgid "Job UUID: " +msgstr "작업 UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "작업이 완료되었고 변경할 수 없습니다." + +msgid "Job operation failed:" +msgstr "작업 실행에 실패함:" + +msgid "Job state cannot be changed." +msgstr "작업 상태를 변경할 수 없습니다." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "작업" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR 호스트 또는 프린터" + +msgid "Label Printer" +msgstr "레이블 프린터" + +msgid "Label Top" +msgstr "레이블 상단" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "주소 크게" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "주소 크게 - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet 시리즈 PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "불빛" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "줄에 허용되는 최대 길이보다 김(255자)" + +msgid "List Available Printers" +msgstr "사용 가능한 프린터 목록" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "위치: " + +msgid "Long-Edge (Portrait)" +msgstr "가장자리 길게(세로)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "제조사 및 모델: " + +msgid "Manual Feed" +msgstr "수동 공급" + +msgid "Media Dimensions: " +msgstr "미디어 크기: " + +msgid "Media Limits: " +msgstr "미디어 제한: " + +msgid "Media Name: " +msgstr "미디어 이름: " + +msgid "Media Size" +msgstr "미디어 크기" + +msgid "Media Source" +msgstr "미디어 소스" + +msgid "Media Tracking" +msgstr "미디어 추적" + +msgid "Media Type" +msgstr "미디어 유형" + +msgid "Medium" +msgstr "중간" + +msgid "Memory allocation error" +msgstr "메모리 할당 오류" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x 머리말이 유실됨" + +msgid "Missing asterisk in column 1" +msgstr "1열에 있는 별표가 유실됨" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "값 스트링이 유실됨" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "클래스 수정" + +msgid "Modify Printer" +msgstr "프린터 수정" + +msgid "Move All Jobs" +msgstr "모든 작업 이동" + +msgid "Move Job" +msgstr "작업 이동" + +msgid "Moved Permanently" +msgstr "영구적으로 이동" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD 파일 포인터" + +msgid "Name OID uses indefinite length" +msgstr "이름 OID 길이가 무제한입니다" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "안 함" + +msgid "New Stylus Color Series" +msgstr "새로운 Stylus Color 시리즈" + +msgid "New Stylus Photo Series" +msgstr "새로운 Stylus Photo 시리즈" + +msgid "No" +msgstr "아니요" + +msgid "No Content" +msgstr "콘텐츠 없음" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "VarBind SEQUENCE 없음" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "활성 연결이 없음" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "커뮤니티 이름 없음" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "추가된 대상이 없습니다." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "error-index 없음" + +msgid "No error-status" +msgstr "error-status 없음" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "이름 OID 없음" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "request-id 없음" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "발견된 구독이 없습니다." + +msgid "No variable-bindings SEQUENCE" +msgstr "variable-bindings SEQUENCE 없음" + +msgid "No version number" +msgstr "버전 번호 없음" + +msgid "Non-continuous (Mark sensing)" +msgstr "중단(마크 센싱)" + +msgid "Non-continuous (Web sensing)" +msgstr "중단(웹 센싱)" + +msgid "Normal" +msgstr "일반" + +msgid "Not Found" +msgstr "없음" + +msgid "Not Implemented" +msgstr "실행되지 않음" + +msgid "Not Installed" +msgstr "설치되지 않음" + +msgid "Not Modified" +msgstr "수정되지 않음" + +msgid "Not Supported" +msgstr "지원되지 않음" + +msgid "Not allowed to print." +msgstr "프린트가 허용되지 않습니다." + +msgid "Note" +msgstr "참고" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "승인" + +msgid "Off (1-Sided)" +msgstr "끔(한 쪽 방향)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "온라인 도움말" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "%s 열기 실패: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "우선 CloseGroup이 없는 OpenGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "우선 CloseUI/JCLCloseUI가 없는 OpenUI/JCLOpenUI" + +msgid "Operation Policy" +msgstr "동작 정책" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "설치된 옵션" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "옵션: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "출력 모드" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL 레이저 프린터" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "패킷에 Get-Response-PDU가 없습니다" + +msgid "Packet does not start with SEQUENCE" +msgstr "패킷이 SEQUENCE로 시작하지 않습니다" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "%2$s의 %1$s 암호? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "SAMBA를 통해 %2$s에 연결하려면 필요한 %1$s의 암호: " + +msgid "Pause Class" +msgstr "클래스 일시정지" + +msgid "Pause Printer" +msgstr "프린터 일시정지" + +msgid "Peel-Off" +msgstr "착탈식" + +msgid "Photo" +msgstr "사진" + +msgid "Photo Labels" +msgstr "사진 레이블" + +msgid "Plain Paper" +msgstr "일반 종이" + +msgid "Policies" +msgstr "정책" + +msgid "Port Monitor" +msgstr "포트 모니터" + +msgid "PostScript Printer" +msgstr "PostScript 프린터" + +msgid "Postcard" +msgstr "엽서" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "프린트 해상도" + +msgid "Print Job:" +msgstr "프린트 작업:" + +msgid "Print Mode" +msgstr "프린트 모드" + +msgid "Print Rate" +msgstr "프린트 비율" + +msgid "Print Self-Test Page" +msgstr "프린트 자체 테스트 페이지" + +msgid "Print Speed" +msgstr "프린트 속도" + +msgid "Print Test Page" +msgstr "프린트 테스트 페이지" + +msgid "Print and Cut" +msgstr "프린트 및 자르기" + +msgid "Print and Tear" +msgstr "프린트 및 티어" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "다음이 프린트됨: " + +msgid "Printed From: " +msgstr "다음에서 프린트됨: " + +msgid "Printed On: " +msgstr "다음에서 프린트됨: " + +msgid "Printer Added" +msgstr "추가된 프린터" + +msgid "Printer Default" +msgstr "기본 프린터" + +msgid "Printer Deleted" +msgstr "삭제된 프린터" + +msgid "Printer Modified" +msgstr "수정된 프린터" + +msgid "Printer Name: " +msgstr "프린터 이름: " + +msgid "Printer Paused" +msgstr "중단된 프린터" + +msgid "Printer Settings" +msgstr "프린터 설정" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "프린터:" + +msgid "Printers" +msgstr "프린터" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "작업 비우기" + +msgid "Quarto" +msgstr "4절지" + +msgid "Quota limit reached." +msgstr "용량이 한계에 도달했습니다." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "작업 거부" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "오류 시 다시 프린트" + +msgid "Request Entity Too Large" +msgstr "요청한 용량이 너무 큽니다" + +msgid "Resolution" +msgstr "해상도" + +msgid "Resume Class" +msgstr "클래스 다시 시작" + +msgid "Resume Printer" +msgstr "프린터 다시 시작" + +msgid "Return Address" +msgstr "주소 반환" + +msgid "Return Address - 3/4 x 2\"" +msgstr "주소 반환 - 3/4 x 2\"" + +msgid "Rewind" +msgstr "뒤로가기" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE 길이가 무제한입니다" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "기타 보기" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "시리얼 포트 #%d" + +msgid "Server Restarted" +msgstr "서버 재시동됨" + +msgid "Server Security Auditing" +msgstr "서버 보안 감사" + +msgid "Server Started" +msgstr "서버 시동됨" + +msgid "Server Stopped" +msgstr "서버 중단됨" + +msgid "Service Unavailable" +msgstr "사용할 수 없는 서비스" + +msgid "Set Allowed Users" +msgstr "허용된 사용자 설정" + +msgid "Set As Server Default" +msgstr "서버 기본값으로 설정" + +msgid "Set Class Options" +msgstr "클래스 옵션 설정" + +msgid "Set Printer Options" +msgstr "프린터 옵션 설정" + +msgid "Set Publishing" +msgstr "발행 설정" + +msgid "Shipping Address" +msgstr "발송 주소" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "발송 주소 - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "가장자리 짧게(가로)" + +msgid "Special Paper" +msgstr "특수 종이" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "표준" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "배너 시작 중" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "대차표" + +msgid "Stylus Color Series" +msgstr "Stylus Color 시리즈" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo 시리즈" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "수퍼 A" + +msgid "Super B" +msgstr "수퍼 B" + +msgid "Super B/A3" +msgstr "수퍼 B/A3" + +msgid "Switching Protocols" +msgstr "프로토콜 전환 중" + +msgid "Tabloid" +msgstr "타블로이드" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "절취" + +msgid "Tear-Off" +msgstr "절취선" + +msgid "Tear-Off Adjust Position" +msgstr "절취선 조절 위치" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "\"%s\" PPD 파일을 찾을 수 없습니다." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "\"%s\" PPD 파일을 열 수 없습니다: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"클래스 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래" +"시(/) 또는 파운드 기호(#)를 포함하지 않습니다." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "notify-lease-duration 속성을 작업 구독과 함께 사용할 수 없습니다." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"프린터 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래" +"시(/) 또는 파운드 기호(#)를 포함하지 않습니다." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "\"%s\" printer-uri가 유효하지 않은 문자를 포함합니다." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "printer-uri는 \"ipp://HOSTNAME/classes/CLASSNAME\" 형태여야 합니다." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "printer-uri는 \"ipp://HOSTNAME/printers/PRINTERNAME\" 형태여야 합니다." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"구독 이름은 빈 칸, 슬래시(/), 물음표(?) 또는 파운드 기호(#)를 포함하지 않습니" +"다." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "구독이 너무 많습니다." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "열 전송 미디어" + +msgid "Title: " +msgstr "제목: " + +msgid "Too many active jobs." +msgstr "활성 작업이 너무 많습니다." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "투명도" + +msgid "Tray" +msgstr "트레이" + +msgid "Tray 1" +msgstr "트레이 1" + +msgid "Tray 2" +msgstr "트레이 2" + +msgid "Tray 3" +msgstr "트레이 3" + +msgid "Tray 4" +msgstr "트레이 4" + +msgid "URI Too Long" +msgstr "URI가 너무 김" + +msgid "US Ledger" +msgstr "US 원장" + +msgid "US Legal" +msgstr "US 공문서" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US 편지지" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB 시리얼 포트 #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "cupsd.conf 파일에 연결할 수 없음:" + +msgid "Unable to add RSS subscription:" +msgstr "RSS 구독을 추가할 수 없음:" + +msgid "Unable to add class:" +msgstr "클래스를 추가할 수 없음:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "프린터를 추가할 수 없음:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "RSS 구독을 취소할 수 없음:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "printer-is-shared 속성을 변경할 수 없음:" + +msgid "Unable to change printer:" +msgstr "프린터를 변경할 수 없음:" + +msgid "Unable to change server settings:" +msgstr "서버 설정값을 변경할 수 없음:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "호스트에 연결할 수 없음." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "임시 파일을 생성할 수 없음:" + +msgid "Unable to delete class:" +msgstr "클래스를 삭제할 수 없음:" + +msgid "Unable to delete printer:" +msgstr "프린터를 삭제할 수 없음:" + +msgid "Unable to do maintenance command:" +msgstr "명령을 유지할 수 없음:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "클래스 목록을 얻을 수 없음:" + +msgid "Unable to get class status:" +msgstr "클래스 상태를 알 수 없음:" + +msgid "Unable to get list of printer drivers:" +msgstr "프린터 드라이버 목록을 얻을 수 없음:" + +msgid "Unable to get printer attributes:" +msgstr "프린터 속성을 얻을 수 없음:" + +msgid "Unable to get printer list:" +msgstr "프린터 목록을 얻을 수 없음:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "프린터 상태를 알 수 없습니다:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "클래스를 수정할 수 없음:" + +msgid "Unable to modify printer:" +msgstr "프린터를 수정할 수 없음:" + +msgid "Unable to move job" +msgstr "작업을 이동할 수 없습니다" + +msgid "Unable to move jobs" +msgstr "작업을 이동할 수 없습니다" + +msgid "Unable to open PPD file" +msgstr "PPD 파일을 열 수 없습니다" + +msgid "Unable to open PPD file:" +msgstr "PPD 파일을 열 수 없음:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "cupsd.conf 파일을 열 수 없음:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "테스트 페이지를 프린트할 수 없음:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "옵션을 설정할 수 없음:" + +msgid "Unable to set server default:" +msgstr "서버 기본값을 설정할 수 없음:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "cupsd.conf 파일을 업로드할 수 없습니다:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "인증되지 않음" + +msgid "Units" +msgstr "장비" + +msgid "Unknown" +msgstr "알 수 없음" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "알 수 없는 printer-error-policy \"%s\" ." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "알 수 없는 printer-op-policy \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "지원되지 않는 값 유형" + +msgid "Upgrade Required" +msgstr "업그레이드 필요함" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "값의 길이가 무제한입니다" + +msgid "VarBind uses indefinite length" +msgstr "VarBind의 길이가 무제한입니다" + +msgid "Version uses indefinite length" +msgstr "버전 길이가 무제한입니다" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "예" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"https://%s:%d%s URL을 사용하여 이 페이지에 연" +"결해야 합니다." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL 레이블 프린터" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "중단됨" + +msgid "canceled" +msgstr "취소됨" + +msgid "completed" +msgstr "완료됨" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced 실행에 실패했습니다." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd 실행에 실패했습니다." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index 길이가 무제한입니다" + +msgid "error-status uses indefinite length" +msgstr "error-status 길이가 무제한입니다" + +msgid "held" +msgstr "유지됨" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "대기" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "보류 중" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "처리 중" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id 길이가 무제한입니다" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "%s 통계에 실패함: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "중단됨" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "알 수 없음" + +msgid "untitled" +msgstr "무제" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings의 길이가 무제한입니다" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(전체)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(없음)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d개의 엔트리\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\t결함 후: 계속\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\t경고:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\t배너 필요함\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\t문자 세트 설정:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\t연결: 직접\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\t연결: 원격\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\t기본 페이지 크기:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\t기본 피치:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\t기본 포트 설정:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\t설명: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\t구성 마운트됨:\n" +#~ "\t콘텐츠 유형: 모두\n" +#~ "\t프린터 유형: 알 수 없음\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\t구성 허용됨:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\t인터페이스: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\t인터페이스: %s/인터페이스/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\t인터페이스: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\t위치: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\t결함 시: 경고 안 함\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\t사용자 허용됨:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\t사용자 거부됨:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\t데몬 표시\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\t엔트리 없음\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\t프린터가 '%s' 스피드 -1 장비에 있습니다\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\t프린트가 비활성화되었습니다\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\t프린트가 활성화되었습니다\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\t%s에 대한 대기열\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\t대기열이 비활성화되었습니다\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\t대기열이 활성화되었습니다\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\t알 수 없는 이유\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " 적합 테스트 상세 결과\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: 15페이지, 섹션 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: 15페이지, 섹션 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: 19페이지, 섹션 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: 20페이지, 섹션 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: 27페이지, 섹션 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: 42페이지, 섹션 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: 16-17페이지, 섹션 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: 42-45페이지, 섹션 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: 45-46페이지, 섹션 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: 48-49페이지, 섹션 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: 52-54페이지, 섹션 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f바이트\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\"이(가) \"%s %s\"와(과) 충돌합니다\n" +#~ " (제한=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s에 일치하는 옵션이 없습니다!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s이(가) %s와(과) 일반적인 접두어를 공유합니다\n" +#~ " REF: 15페이지, 섹션 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN 기본 선택사항 충돌!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN 양면 옵션 키워드 %s이(가) 예상대로 동작하지 않을 수 있으" +#~ "며 이름을 양면으로 해야 합니다!\n" +#~ " REF: 122페이지, 섹션 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr " WARN 파일이 CR, LF 및 CR LF 줄 끝을 포함합니다!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 사양은 LanguageEncoding이 필요합니다.\n" +#~ " REF: 56-57페이지, 섹션 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN %d번째 줄에는 여백만 있습니다!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 사양은 Manufacturer이 필요합니다.\n" +#~ " REF: 58-59페이지, 섹션 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN \"%s\" APDialogExtension 파일 유실됨\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN \"%s\" APPrinterIconPath 파일 유실됨\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN 비 Windows PPD 파일은 줄 끝을 CR LF가 아닌 LF만 있는 줄 끝" +#~ "을 사용해야 합니다!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN 이전 PPD 버전 %.1f!\n" +#~ " REF: 42페이지, 섹션 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 사양에 위반되는 8.3 이상의 PCFileName.\n" +#~ " REF: 61-62페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN 프로토콜은 PJL을 포함하지만 JCL 속성은 설정되지 않았습니" +#~ "다.\n" +#~ " REF: 78-79페이지, 섹션 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN 프로토콜은 PJL 및 BCP를 모두 포함합니다; TBCP 예상됨.\n" +#~ " REF: 78-79페이지, 섹션 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 사양은 ShortNickName이 필요합니다.\n" +#~ " REF: 64-65페이지, 섹션 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s이(가) 존재하지 않습니다!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 잘못된 %s - 선택사항 %s!\n" +#~ " REF: 122페이지, 섹션 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %1$s %3$s 옵션에 대한 잘못된 UTF-8 \"%2$s\" 번역 스트링!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %1$s %3$s 옵션, %4$s 선택사항에 대한 잘못된 UTF-8 \"%2$s\" 번역 스" +#~ "트링!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s 잘못된 \"%s\" cupsFilter 값!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s 잘못된 %s cupsICCProfile!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s 잘못된 \"%s\" cupsPreFilter 값!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 잘못된 cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s 잘못된 \"%s\" 언어!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints %s이(가) 비어있음!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %1$s %3$s 옵션에 대한 \"%2$s\" 번역 스트링 유실됨!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %1$s %3$s 옵션, %4$s 선택사항에 대한 \"%2$s\" 번역 스트링 유실됨!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %1$s \"*%4$s %5$s *%6$s %7$s\" UIConstraints에 있는 *%2$s %3$s 선택" +#~ "사항 유실됨!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %1$s %4$s cupsUIConstraints에 있는 *%2$s %3$s 선택사항 유실됨: \"%5" +#~ "$s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s \"%s\" cupsFilter 파일이 유실됨\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s \"%s\" cupsICCProfile 파일이 유실됨!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s \"%s\" cupsPreFilter 파일 유실됨\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s %s cupsUIResolver 유실됨!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %1$s \"*%3$s %4$s *%5$s %6$s\" UIConstraints에 있는 %2$s 옵션 유실" +#~ "됨!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %1$s %3$s cupsUIConstraints에 있는 %2$s 옵션 유실됨: \"%4$s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s 파일에 \"%s\" 기초 번역이 포함되어 있지 않습니다!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 선택사항 없음을 정의하지 않은 %s이(가) 필요!\n" +#~ " REF: 122페이지, 섹션 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s 불필요한 %s cupsICCProfile 값이 %s와(과) 충돌함!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s %s cupsUIResolver가 루프를 유발함!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr " **FAIL** %s 선택사항 이름 %s 및 %s이(가) 경우별로만 다름!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s은(는) 1284DeviceID이어야 합니다!\n" +#~ " REF: 72페이지, 섹션 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 Default%s %s\n" +#~ " REF: 40페이지, 섹션 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 DefaultImageableArea %s!\n" +#~ " REF: 102페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 DefaultPaperDimension %s!\n" +#~ " REF: 103페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** 파일에 있는 잘못된 JobPatchFile 속성\n" +#~ " REF: 24페이지, 섹션 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 Manufacturer(\"HP\"이어야 함)\n" +#~ " REF: 211페이지, 표 D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 Manufacturer(\"Oki\"이어야 함)\n" +#~ " REF: 211페이지, 표 D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 ModelName - \"%c\"은(는) 스트링에서 허용되지 않습니" +#~ "다.\n" +#~ " REF: 59-60페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 PSVersion - \"(string) int\"이(가) 아닙니다.\n" +#~ " REF: 62-64페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 Product - \"(string)\"이(가) 아닙니다.\n" +#~ " REF: 62페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 ShortNickName - 31자보다 깁니다.\n" +#~ " REF: 64-65페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 %s - 선택사항 %s!\n" +#~ " REF: 84페이지, 섹션 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 FileVersion \"%s\"\n" +#~ " REF: 56페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 FormatVersion \"%s\"\n" +#~ " REF: 56페이지, 섹션 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** 잘못된 LanguageEncoding %s - ISOLatin1이어야 합니다!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** 잘못된 LanguageVersion %s - 영어여야 합니다!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **FAIL** 기본 옵션 코드를 해석할 수 없습니다: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** %s 옵션 %s 선택사항에 대한 기본 번역 스트링이 8비트 문자" +#~ "를 포함합니다!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** %s 옵션에 대한 기본 번역 스트링이 8비트 문자를 포함합니" +#~ "다!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr " **FAIL** %s 및 %s 그룹 이름이 경우별로만 다름!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** 다중 %s 항목이 %s 이름을 선택!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr " **FAIL** %s 및 %s 옵션 이름이 경우별로만 다름!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** Default%s 필요\n" +#~ " REF: 40페이지, 섹션 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultImageableArea 필요\n" +#~ " REF: 102페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultPaperDimension 필요\n" +#~ " REF: 103페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FileVersion 필요\n" +#~ " REF: 56페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FormatVersion 필요\n" +#~ " REF: 56페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** %s PageSize에 대한 ImageableArea 필요\n" +#~ " REF: 41페이지, 섹션 5.\n" +#~ " REF: 102페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** LanguageEncoding 필요\n" +#~ " REF: 56-57페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** LanguageVersion 필요\n" +#~ " REF: 57-58페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Manufacturer 필요\n" +#~ " REF: 58-59페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ModelName 필요\n" +#~ " REF: 59-60페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** NickName 필요\n" +#~ " REF: 60페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PCFileName 필요\n" +#~ " REF: 61-62페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PSVersion 필요\n" +#~ " REF: 62-64페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageRegion 필요\n" +#~ " REF: 100페이지, 섹션 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageSize 필요\n" +#~ " REF: 41페이지, 섹션 5.\n" +#~ " REF: 99페이지, 섹션 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageSize 필요\n" +#~ " REF: 99-100페이지, 섹션 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** %s PageSize에 대한 PaperDimension 필요\n" +#~ " REF: 41페이지, 섹션 5.\n" +#~ " REF: 103페이지, 섹션 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Product 필요\n" +#~ " REF: 62페이지, 섹션 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ShortNickName 필요\n" +#~ " REF: 64-65페이지, 섹션 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d개의 오류 발견\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " 잘못된 %%%%BoundingBox: %d번째 줄!\n" +#~ " REF: 39페이지, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " 잘못된 %%%%Page: %d번째 줄!\n" +#~ " REF: 53페이지, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " 잘못된 %%%%Pages: %d번째 줄!\n" +#~ " REF: 43페이지, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " %d번째 줄이 255자보다 깁니다(%d)!\n" +#~ " REF: 25페이지, 줄 길이\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " 첫번째 줄에 있는 %!PS-Adobe-3.0이 유실됨!\n" +#~ " REF: 17페이지, 3.1 도큐멘트 구성하기\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments 설명 유실됨!\n" +#~ " REF: 41페이지, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " 유실되었거나 잘못된 %%BoundingBox: 설명!\n" +#~ " REF: 39페이지, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " 유실되었거나 잘못된 %%Page: 설명!\n" +#~ " REF: 53페이지, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " 유실되었거나 잘못된 %%Page: 설명!\n" +#~ " REF: 43페이지, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " 발견된 오류 없음\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " 255자를 초과하는 %d개의 줄 발견!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " 너무 많은 %%BeginDocument 설명!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " 너무 많은 %%EndDocument 설명!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " 경고: 파일에 바이너리 데이터가 포함되어 있습니다!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " 경고: 파일에 %%EndComments 설명이 없습니다!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " 경고: 파일에 이전 DSC 버전 %.1f가 있습니다!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** PPD 파일을 열 수 없음 - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** PPD 파일을 열 수 없음 - %s, %d번째 줄.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 봉투" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 봉투" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 봉투" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 봉투" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 봉투" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f바이트\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f바이트\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr " %2$s 이후에 %1$s 승인 요청\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "CUPS 버전의 lpc로는 %s이(가) 실행되지 않습니다.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s이(가) 준비되지 않음\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s이(가) 준비됨\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s이(가) 준비되었고 프린트 중\n" + +#, fuzzy +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%2$s 이후에 %1$s 승인 요청 안 함 -\n" +#~ "\t%1$s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s이(가) 지원되지 않음!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%3$s 이후에 %1$s/%2$s 승인 요청\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%3$s 이후에 %1$s/%2$s 승인 요청 안 함 -\n" +#~ "\t%4$s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [작업 %d 로컬호스트]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s 실패: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: 해야할 일을 모르겠음!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: 오류 - 잘못된 작업 ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "%s: 오류 - 파일을 프린트할 수 없고 작업을 동시에 대체할 수 없음!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: 오류 - 파일 또는 작업 ID가 제공되었다면 stdin에서 프린트할 수 없음!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: 오류 - '-S' 옵션 뒤에 문자 세트가 예상됨!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: 오류 - '-T' 옵션 뒤에 콘텐츠 유형이 예상됨!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: 오류 - '-n' 옵션 뒤에 복사 매수가 예상됨!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: 오류 - '-#' 옵션 뒤에 복사본 수가 예상됨!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: 오류 - '-P' 옵션 뒤에 대상이 예상됨!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: 오류 - '-b' 옵션 뒤에 대상이 예상됨!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: 오류 - '-d' 옵션 뒤에 대상이 예상됨!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: 오류 - '-f' 옵션 뒤에 구성이 예상됨!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: 오류 - '-H' 옵션 뒤에 유지 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: 오류 - '-H' 옵션 뒤에 호스트 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: 오류 - '-h' 옵션 뒤에 호스트 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: 오류 - '-y' 옵션 뒤에 모드 목록이 예상됨!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: 오류 - '-%c' 옵션 뒤에 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: 오류 - '-o' 옵션 뒤에 옵션 스트링이 예상됨!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: 오류 - '-P' 옵션 뒤에 페이지 목록이 예상됨!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: 오류 - '-%c' 옵션 뒤에 우선순위가 예상됨!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: 오류 - '-r' 옵션 뒤에 이유 텍스트가 예상됨!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: 오류 - '-t' 옵션 뒤에 제목이 예상됨!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: 오류 - '-U' 옵션 뒤에 사용자 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: 오류 - '-u' 옵션 뒤에 사용자 이름이 예상됨!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: 오류 - '-%c' 옵션 뒤에 값이 예상됨!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: 오류 - '-W' 옵션 뒤에 \"completed\", \"not-completed\" 또는 \"all\"이 " +#~ "필요!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: 오류 - 우선순위는 1에서 100사이여야 합니다.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: 오류 - 일정이 응답하지 않음!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: 오류 - 너무 많은 파일 - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: 오류 - \"%s\"에 연결할 수 없음 - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: 오류 - stdin에서 대기할 수 없음 - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: 오류 - 알 수 없는 대상 \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: 오류 - 알 수 없는 대상 \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: 오류 - 알 수 없는 옵션 '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: 오류 - 알 수 없는 옵션 '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: '-i' 옵션 뒤에 작업 ID가 예상됨!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: \"%s\" 필터를 사용할 수 없음: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: \"%s\" 목록에 유효하지 않은 대상 이름!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: 유효하지 않은 필터 문자열 \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: '-H restart' 앞에 작업 ID('-i jobid') 필요!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: %s/%s에서 %s/%s까지 변환할 필터가 없음!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: 작동 실패: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: 죄송합니다, 컴파일된 암호화 지원이 없습니다!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: 서버에 연결할 수 없음\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: 서버에 연결할 수 없음!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: MIME 유형의 \"%s\"을(를) 결정할 수 없음!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: %s을(를) 열 수 없음 - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: %s을(를) 열 수 없음 - %s, %d번째 줄\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: %s을(를) 열 수 없음: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: PPD 파일을 열 수 없음: %s, %d번째 줄\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: \"%s\" 또는 \"%s\"에서 MIME 데이터베이스를 읽을 수 없음!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: 알 수 없는 대상 \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: 알 수 없는 대상 MIME 유형 %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: 알 수 없는 옵션 '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: 알 수 없는 소스 MIME 유형 %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: 경고 - '%c' 포맷 조합 키가 지원되지 않음 - 출력이 올바르지 않을 수 있" +#~ "습니다!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: 경고 - 문자 세트 옵션이 무시됨!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: 경고 - 콘텐츠 유형 옵션이 무시됨!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: 경고 - 구성 옵션이 무시됨!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: 경고 - 모드 옵션이 무시됨!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: 오류 - '-o' 옵션 뒤에 option=value가 예상됨!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI 그레이 스케일" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?유효하지 않은 도움말 명령을 알 수 없음\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "프린터 드라이버를 보내려면 Samba 암호가 필요함!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "프린터 드라이버를 보내려면 Samba 사용자 이름이 필요함!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "\"%s\"(이)라는 이름의 클래스가 이미 존재합니다!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "\"%s\"(이)라는 이름의 프린터가 이미 존재합니다!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3(대)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4(대)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4(소)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5(대)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "%s 프린터 상태를 잘못된 %d 값으로 설정하려고 합니다!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "속성 그룹이 올바르지 않습니다(%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "잘못된 장비 URI \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "잘못된 device-uri \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "잘못된 device-uri 설계 \"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "잘못된 document-format \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "잘못된 파일 이름 버퍼!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "잘못된 서체 속성: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "잘못된 job-priority 값!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "잘못된 job-sheets 값\"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "잘못된 job-sheets 값 유형!" + +#~ msgid "Bad job-state value!" +#~ msgstr "잘못된 job-state 값!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "잘못된 job-uri 속성 \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "잘못된 notify-pull-method \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "잘못된 notify-recipient-uri URI \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "%d번째 줄에 있는 잘못된 옵션 + 선택사항!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "잘못된 port-monitor \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "잘못된 printer-state 값 %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "잘못된 요청 버전 숫자 %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "잘못된 구독 ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 봉투" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 봉투" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 봉투" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 봉투" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 봉투" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 봉투" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 봉투" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 봉투" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 봉투" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "\"%s\" 문자 세트가 지원되지 않음!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 봉투" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 봉투" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "명령이 생략될 수 있습니다. 명령은 다음과 같습니다:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "\"%s\" 유형을 검색할 수 없음!" + +#~ msgid "Cover open." +#~ msgstr "덮개가 열려 있음." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL 봉투" + +#~ msgid "Developer almost empty." +#~ msgstr "현상액이 거의 비었습니다." + +#~ msgid "Developer empty!" +#~ msgstr "현상액이 비어 있음!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "장비: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "도큐멘트 %d을 작업 %d에서 찾을 수 없습니다." + +#~ msgid "Door open." +#~ msgstr "문이 열려 있음." + +#~ msgid "Double Postcard" +#~ msgstr "이중 엽서" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: 페이지 정보에 메모리를 할당할 수 없습니다: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: 페이지 배열에 메모리를 할당할 수 없습니다: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 잘못된 %%BoundingBox: 설명이 보임!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: 잘못된 %%IncludeFeature: 설명!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: 잘못된 %%Page: 파일에 있는 설명!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: 잘못된 %%PageBoundingBox: 파일에 있는 설명!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: 잘못된 SCSI 장비 파일 \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: 잘못된 문자 세트 파일 %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: 잘못된 문자 세트 유형 %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: 잘못된 열 값 %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: 잘못된 cpi 값 %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: 잘못된 서체 설명 줄: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: 잘못된 lpi 값 %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: 잘못된 페이지 설정!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: 잘못된 텍스트 방향 %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: 잘못된 텍스트 길이 %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: 대상 프린터가 없습니다!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox 복제: 설명이 보임!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: %%Pages 복제: 설명이 보임!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: 빈 프린트 파일!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: %d 오류가 다음 PAPSendData 요청을 보내는 중: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: %2$s의 %1$d번째 줄에 인용 스트링이 예상됨!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: 심각한 USB 오류!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: 파일을 프린트할 수 없는, 유효하지 않은 HP-GL/2 명령이 보임!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog가 유실됨!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup이 유실됨!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: 명령 라인의 장비 URI가 유실되었고 DEVICE_URI 환경 변수가 없음!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: 배너 파일의 %d번째 줄 값이 유실됨!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: %2$s의 %1$d번째 줄에 있는 모든 번역 스트링 앞에 msgid 줄 필요!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: %%BoundingBox가 없음: 머리말에 설명!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: %%Pages가 없음: 머리말에 설명!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: argv[0] 또는 DEVICE_URI 환경 변수에서 발견된 장비 URI가 없음!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: %s 문자 세트 파일에 서체 없음\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: 페이지 없음!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: 종이 없음!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER 환경 변수가 정의되지 않음!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: 프린트 파일이 허용되지 않음(%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: 프린터가 응답하지 않음\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: 프린터가 응답하지 않음!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: 프린터가 예기치 않은 EOF를 보냄\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: 원격 호스트가 제어 파일을 허용하지 않음(%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: 원격 호스트가 데이터 파일을 허용하지 않음(%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: 데이터를 프린터로 전송하는 동안 시간초과 오류가 발생했습니다\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: 작업에 %d 파일을 추가할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: %d 작업을 취소할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: PDF 파일을 복사할 수 없음" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: 소켓을 생성할 수 없음" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: 임시 압축 프린트 파일을 생성할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: 임시 파일을 생성할 수 없음" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: 임시 파일을 생성할 수 없음 - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: 임시 파일을 생성할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops를 실행할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: gs 프로그램을 실행할 수 없음" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: pdftops 프로그램을 실행할 수 없음" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops를 분리(fork)할 수 없음: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: PAP 요청을 얻을 수 없음" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: PAP 응답을 얻을 수 없음" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: \"%s\"프린터에 대한 PPD 파일을 얻을 수 없음 - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: 기본 AppleTalk 영역을 얻을 수 없음" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: 작업 %d 속성을 얻을 수 없음(%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: 프린터 상태를 알 수 없음(%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: '%s' 프린터를 찾을 수 없음!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: PAP 응답을 찾을 수 없음" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: AppleTalk 프린터를 찾을 수 없음" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: AppleTalk 주소를 생성할 수 없음" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: \"%s\"을(를) 열 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: %s을(를) 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: \"%s\" 배너 파일을 열 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: \"%s\" 장비 파일을 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: \"%s\" 파일을 열 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: \"%s\" 파일을 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: 이미지 파일을 열어서 프린트할 수 없음!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: \"%s\" 프린트 파일을 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: %s 프린트 파일을 열 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: %s 프린트 파일을 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: 임시로 압축한 프린트 파일을 열 수 없음: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: 임시 파일을 열 수 없음" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: %d개의 텍스트 열을 프린트할 수 없음!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: %dx%d 텍스트 페이지를 프린트할 수 없음!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: 프린트 데이터를 읽을 수 없음" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: 프린트 데이터를 읽을 수 없음!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: 포트를 예약할 수 없음" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: 파일에서 %ld 오프셋을 찾을 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: 파일에서 %lld 오프셋을 찾을 수 없음 - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: LPD 명령을 보낼 수 없음" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: PAP tickle 요청을 보낼 수 없음" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: 초기 PAP 전송 데이터 요청을 보낼 수 없음" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: 프린트 데이터를 보낼 수 없음(%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: 프린트 데이터를 보낼 수 없음!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: 프린트 파일을 프린터로 보낼 수 없음" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: 끝자리 nul을 프린터로 보낼 수 없음" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: pictwpstops를 기다릴 수 없음: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: \"%2$s\"에 %1$d바이트를 쓸 수 없음: %3$s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: 프린터에 %d바이트를 쓸 수 없음!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: 제어 파일을 쓸 수 없음" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: 프린트 데이터를 쓸 수 없음" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: 프린트 데이터를 쓸 수 없음: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: 드라이버에 래스터 데이터를 쓸 수 없음!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: 임시 파일을 쓸 수 없음" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: 압축되지 않은 도큐멘트 데이터를 쓸 수 없음: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: %2$s의 %1$d번째 줄에 예기치 않은 텍스트!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: 알 수 없는 암호화 옵션 값 \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: 알 수 없는 파일 순서 \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: 알 수 없는 포맷 문자 \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: \"%s\"에 대한 알 수 없는 메시지 카탈로그 포맷!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: \"%2$s\" 값이 있는 알 수 없는 \"%1$s\" 옵션!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: 알 수 없는 \"%s\" 프린트 모드\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: 알 수 없는 \"%s\" 버전 옵션 값!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: brightness=100을 사용하는, 지원되지 않는 밝기 값 %s!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: gamma=1000을 사용하는, 지원되지 않는 감마 값 %s!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: number-up=1을 사용하는, 지원되지 않는 number-up 값 %d!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: number-up-layout=lrtb을 사용하는, 지원되지 않는 number-up-layout " +#~ "값 %s!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: page-border=none을 사용하는, 지원되지 않는 page-border 값 %s!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: doc_printf 오버플로우(%d바이트)가 발견됨, 중단 중!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops 필터가 신호 %d에서 충돌함!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops 필터가 상태 %d(으)로 종료됨!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops가 신호 %d에서 종료됨!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops가 상태 %d(으)로 종료됨!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "ERROR: 복원 가능: 프린터에 연결할 수 없음; 30초 후에 다시 시도...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() 실패" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: 프린트 파일을 시작할 수 없음" + +#~ msgid "Empty PPD file!" +#~ msgstr "PPD 파일이 비어있음!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "오류: '-h' 옵션 뒤에 호스트 이름이 필요!\n" + +#~ msgid "FAIL\n" +#~ msgstr "실패\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "파일 장비 URI가 비활성화되었습니다! 활성화하려면, \"%s/cupsd.conf\"에 있" +#~ "는 FileDevice 지시문을 보십시오." + +#~ msgid "Fuser temperature high!" +#~ msgstr "퓨저 온도가 높음!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "퓨저 온도가 낮음!" + +#~ msgid "German FanFold" +#~ msgstr "독일 FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "독일 FanFold 공문서" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "printer-uri 속성을 얻었지만, job-id가 없습니다!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: 시스템 환경설정에서 AppleTalk가 비활성화됨\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: 시스템 환경설정에서 AppleTalk가 비활성화되었습니다.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: 프린트 작업 취소 중...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: 프린터에 연결됨...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: 프린트에 연결 중...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: 제어 파일을 성공적으로 보냄\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: 데이터 파일을 성공적으로 보냄\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: %d페이지 포맷 중...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: 이미지 파일 로드 중...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: 프린터 검색 중...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: 연결 열기\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: 프린트 파일을 보냈고, 프린터 작업 종료 대기 중...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: 프린터 사용 중; 10초 후에 다시 시도...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: 프린터 사용 중; 30초 후에 다시 시도...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 프린터 사용 중; 5초 후에 다시 시도...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: 프린터가 IPP/%d.%d을 지원하지 않기 때문에, IPP/1.0을 시도 중...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 프린터 사용 중; 5초 후에 다시 시도...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: 현재 프린터가 오프라인입니다.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: 현재 프린터가 오프라인입니다.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: 현재 프린터가 온라인입니다.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: 프린터가 오프라인입니다.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: 프린터가 연결되지 않음; 30초 후에 다시 시도...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: %d페이지 프린트 중, %d%% 완료...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: %d페이지 프린트 중...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: 프린트할 준비가 되었습니다.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: 제어 파일 보내는 중(%lu바이트)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: 제어 파일 보내는 중(%u바이트)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: 데이터 보내는 중\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: 데이터 파일 보내는 중(%ld바이트)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: 데이터 파일 보내는 중(%lld바이트)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: 프린트 데이터 보내는 중...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: 프린트 파일 보냄, %ld바이트...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: 프린트 파일 보냄, %lld바이트...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: LPR 작업 스풀 중, %.0f%% 완료...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: 프린터에 연결할 수 없기 때문에, 클래스에 있는 다음 프린터 대기 " +#~ "중...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: \"%s\" 기본 AppleTalk 영역 사용 중 \n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: 작업 완료 대기 중...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: 프린터 사용 대기 중...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 봉투" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5(대)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 봉투" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 봉투" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "잉크/토너가 거의 비었습니다." + +#~ msgid "Ink/toner empty!" +#~ msgstr "잉크/토너가 비었음!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "잉크/토너 폐기소가 거의 찼습니다." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "잉크/토너 폐기소가 찼음!" + +#~ msgid "Interlock open." +#~ msgstr "연동 장치가 열려 있음." + +#~ msgid "Invite Envelope" +#~ msgstr "초대 봉투" + +#~ msgid "Italian Envelope" +#~ msgstr "이탈리아 봉투" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "#%d 작업을 다시 시작할 수 없음 - 파일 없음!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "#%d 작업이 없음!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "#%d 작업이 종료되었고 대체할 수 없음!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "#%d 작업이 왼료되지 않음!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "#%d 작업이 인증을 위해 유지되지 않음!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "#%d 작업이 유지되지 않음!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "#%s 작업이 존재하지 않음!" + +#~ msgid "Job %d not found!" +#~ msgstr "%d 작업이 발견되지 않음!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "작업 구독을 갱신할 수 없음!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 봉투" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 봉투" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "\"%s\" 언어가 지원되지 않음!" + +#~ msgid "Media jam!" +#~ msgstr "미디어가 걸림!" + +#~ msgid "Media tray almost empty." +#~ msgstr "미디어 트레이가 거의 비었습니다." + +#~ msgid "Media tray empty!" +#~ msgstr "미디어 트레이가 비어 있음!" + +#~ msgid "Media tray missing!" +#~ msgstr "미디어 트레이가 유실됨!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "미디어 트레이를 채워야 합니다." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "document-number 속성이 유실됨!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "%d번째 줄에 있는 큰 따옴표가 유실됨!" + +#~ msgid "Missing form variable!" +#~ msgstr "구성 변수가 유실됨!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "notify-subscription-ids 속성이 유실됨!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "requesting-user-name 속성이 유실됨!" + +#~ msgid "Missing required attributes!" +#~ msgstr "필요한 속성이 유실됨!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "%d번째 줄에 있는 값이 유실됨!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "모델: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch 봉투" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: 프린트 파일이 허용됨 - 작업 ID %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: 프린트 파일이 허용됨 - 알 수 없는 작업 ID.\n" + +#~ msgid "No PPD name!" +#~ msgstr "PPD 이름 없음!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "설치된 Windows 프린터 드라이버가 없음!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "%s에 활성 작업이 없음!" + +#~ msgid "No attributes in request!" +#~ msgstr "요청에 속성이 없음!" + +#~ msgid "No authentication information provided!" +#~ msgstr "제공된 인증 정보가 없음!" + +#~ msgid "No default printer" +#~ msgstr "기본 프린터가 없음" + +#~ msgid "No file!?!" +#~ msgstr "파일이 없음!?!" + +#~ msgid "No modification time!" +#~ msgstr "수정 시간 없음!" + +#~ msgid "No printer name!" +#~ msgstr "프린터 이름 없음!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "클래스에 대한 printer-uri 없음!" + +#~ msgid "No printer-uri found!" +#~ msgstr "printer-uri 없음!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "요청에 printer-uri 없음!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "요청에 구독 속성이 없음!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC 수명이 거의 다 되었습니다." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC 수명이 다 되었음!" + +#~ msgid "Out of toner!" +#~ msgstr "토너가 없음!" + +#~ msgid "Output bin almost full." +#~ msgstr "출력소 거의 찼습니다." + +#~ msgid "Output bin full!" +#~ msgstr "출력소가 찼습니다!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "%s 프린터 출력을 %s(으)로 보냄\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "%1$s 프린터 출력을 %3$s에 있는 %2$s 원격 프린터로 보냄\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "%s/%s 프린터 출력을 %s로 보냄\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "%1$s/%2$s 프린터 출력을 %4$s에 있는 %3$s 원격 프린터로 보냄\n" + +#~ msgid "Output tray missing!" +#~ msgstr "출력 트레이가 유실됨!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 봉투" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 봉투" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 봉투" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 봉투" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K(대)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 봉투" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 봉투" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 봉투" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 봉투" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 봉투" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 봉투" + +#~ msgid "Personal Envelope" +#~ msgstr "개인 봉투" + +#~ msgid "Printer offline." +#~ msgstr "프린터가 오프라인입니다." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "단계 소유자 작업 파일 총 크기\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "단계 소유자 우선순위 작업 파일 총 크" +#~ "기\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "실행 중인 명령: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI 프린터" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "타블로이드(대)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data 값이 너무 큼!(%d > 63행)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "프린터 또는 클래스를 공유할 수 없음!" + +#~ msgid "The printer or class was not found." +#~ msgstr "프린터 또는 클래스가 없습니다." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "printer-uri 속성이 필요함!" + +#~ msgid "Toner low." +#~ msgstr "토너가 부족합니다." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "job-sheets 값이 너무 많습니다(%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "printer-state-reasons 값이 너무 많습니다(%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US 행정 용지" + +#~ msgid "US Fanfold" +#~ msgstr "US 연속 용지" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US 공문서(대)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US 편지지(대)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US 편지지(소)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "\"%s\" 대상에 대한 작업을 추가할 수 없습니다!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "파일 유형에 대한 메모리를 할당할 수 없습니다!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "64비트 CUPS 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "64비트 Windows 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "CUPS 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "PPD 파일을 복사할 수 없음 - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "PPD 파일을 복사할 수 없습니다!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Windows 2000 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Windows 9x 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "인터페이스 스크립트를 복사할 수 없음 - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "printer-uri를 생성할 수 없습니다!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "1MB보다 큰 cupsd.conf 파일은 편집할 수 없습니다!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "작업에 대한 대상을 찾을 수 없습니다!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "프린터를 찾을 수 없습니다!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Windows 2000 프린터 드라이버 파일을 설치할 수 없습니다(%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Windows 9x 프린터 드라이버 파일을 설치할 수 없습니다(%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "도큐멘트 %d을(를) 작업 %d에서 열 수 없습니다!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "\"%s\"을(를) 실행할 수 없음: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "프린터 드라이버로 명령을 보낼 수 없습니다!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Windows 프린터 드라이버를 설정할 수 없습니다(%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "레거시 USB 클래스 드라이버를 사용할 수 없음!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "알 수 없는 프린터 오류(%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "지원되지 않는 문자 세트 \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "지원되지 않는 압축 \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "지원되지 않는 압축 속성 %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "지원되지 않는 포맷 \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "지원되지 않는 포맷 '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "지원되지 않는 포맷 '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "사용법:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "사용법: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "사용법: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "사용법: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "사용법: convert [ options ]\n" +#~ "\n" +#~ "옵션:\n" +#~ "\n" +#~ " -f filename 변환할 파일 설정(또는 stdin)\n" +#~ " -o filename 생성할 파일 설정(또는 stdout)\n" +#~ " -i mime/type 입력 MIME 유형 설정(또는 자동 유형 설정)\n" +#~ " -j mime/type 출력 MIME 유형 설정(또는 응용 프로그램/pdf)\n" +#~ " -P filename.ppd PPD 파일 설정\n" +#~ " -a 'name=value ...' 옵션 설정(s)\n" +#~ " -U username 작업에 대한 사용자 이름 설정\n" +#~ " -J title 제목 설정\n" +#~ " -c copies 복사 장 수 설정\n" +#~ " -u 종료 시 PPD 파일 제거\n" +#~ " -D 종료 시 입력 파일 제거\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "사용법: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "옵션:\n" +#~ " -E 서버 연결 암호화\n" +#~ " -H samba-server SAMBA 서버 사용\n" +#~ " -U samba-user 이름이 있는 SAMBA 사용자를 사용하여 인증\n" +#~ " -a 모든 프린터 보내기\n" +#~ " -h cups-server 이름이 있는 CUPS 서버 사용\n" +#~ " -v 상세하게(명령 보기)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "사용법: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "옵션:\n" +#~ "\n" +#~ " -E 암호화 활성화\n" +#~ " -U username 사용자 이름 지정\n" +#~ " -h server[:port] 서버 주소 지정\n" +#~ "\n" +#~ " --[no-]debug-logging 디버그 로그 켜기/끄기\n" +#~ " --[no-]remote-admin 원격 관리 켜기/끄기\n" +#~ " --[no-]remote-any 인터넷 접근 허용/차단\n" +#~ " --[no-]remote-printers 원격 프린터 보기/가리기\n" +#~ " --[no-]share-printers 프린터 공유 켜기/끄기\n" +#~ " --[no-]user-cancel-any 사용자가 모든 작업을 취소하는 것을 허용/차" +#~ "단\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "사용법: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file 대체 구성 파일 로드\n" +#~ "-f 전면에 실행\n" +#~ "-F 전면에 실행하지만 분리\n" +#~ "-h 이 사용법 메시지 보기\\n-l launchd(8)" +#~ "에서 cupsd 실행\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "사용법: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "옵션:\n" +#~ "\n" +#~ " -c cupsd.conf cupsd.conf 파일을 설정하여 사용\n" +#~ " -j job-id[,N] 특정 작업으로부터 파일 N 필터(기본은 파일 1)\n" +#~ " -n copies 복사 장 수 설정\n" +#~ " -o name=value 옵션 설정\n" +#~ " -p filename.ppd PPD 파일 설정\n" +#~ " -t title 제목 설정\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "사용법: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "옵션:\n" +#~ "\n" +#~ " -h 프로그램 사용법 보기\n" +#~ "\n" +#~ " 참고: 이 프로그램은 DSC 명령만을 유효화하고, PostScript 자체는 유효화" +#~ "하지 않습니다.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "사용법: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "옵션:\n" +#~ "\n" +#~ " -R root-directory 대체 루트 설정\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " 오류대신 문제 경고\n" +#~ " -q 조용히 실행\n" +#~ " -r 'relaxed' 오픈 모드 사용\n" +#~ " -v 약간 자세하게\n" +#~ " -vv 매우 자세하게\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "사용법: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "사용법: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "사용법: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "사용법: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "사용법: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] " +#~ "[+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "사용법: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "옵션:\n" +#~ " -D name=value 이름이 정해진 변수를 값으로 설정합니다.\n" +#~ " -I include-dir 포함 디렉토리를 검색 경로에 추가합니다.\n" +#~ " -c catalog.po 지정된 메시지 카탈로그를 로드합니다.\n" +#~ " -d output-dir 출력 디렉토리를 지정합니다.\n" +#~ " -l lang[,lang,...] 출력 언어를 지정합니다(로컬).\n" +#~ " -m 파일 이름으로 ModelName 값을 사용합니다.\n" +#~ " -t PPD를 생성하는 대신 테스트합니다.\n" +#~ " -v 자세하게(더 자세하게 하려면 v 추가).\n" +#~ " -z GNU zip을 사용하여 PPD 파일을 압축합니다.\n" +#~ " --cr CR로 줄을 끝냅니다(Mac OS 9).\n" +#~ " --crlf CR + LF로 줄을 끝냅니다(Windows).\n" +#~ " --lf LF로 줄을 끝냅니다(UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "사용법: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value 이름이 정해진 변수를 값으로 설정합니다.\n" +#~ "옵션:\n" +#~ " -I include-dir 포함 디렉토리를 검색 경로에 추가합니다.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "사용법: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "옵션:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "사용법: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "옵션:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "사용법: ppdpo [options] -o filename.po filename.drv [ ... filenameN." +#~ "drv ]\n" +#~ "옵션:\n" +#~ " -D name=value 이름이 정해진 변수를 값으로 설정합니다.\n" +#~ " -I include-dir 포함 디렉토리를 검색 경로에 추가합니다.\n" +#~ " -v 자세하게(더 자세하게 하려면 v 추가).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "사용법: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: 발견된 첫번째 %d개 프린터만 추가 중" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: 불리언이 waiteof 옵션을 예상함 \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: 읽기 side-channel 요청에 실패함!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: IncludeFeature를 통해 \"%s\" 옵션을 포함할 수 없음!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: 프린터가 응답하지 않음\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: 프린터가 예기치 않은 EOF를 보냄\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: %d초 후에 원격 호스트가 명령 상태 바이트에 응답하지 않음!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: %d초 후에 원격 호스트가 제어 상태 바이트에 응답하지 않음!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: %d초 후에 원격 호스트가 데이터 상태 바이트에 응답하지 않음!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: SCSI 명령 시간 초과(%d); 재시도 중...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: 이 도큐멘트는 Adobe Document Structuring Conventions을 실행하지 " +#~ "않기 때문에 올바르게 프린트되지 않을 수 있음!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: \"%s:%s\"을(를) 열 수 없습니다: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: PAP 상태 요청을 보낼 수 없습니다" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: %d 유형의 예기치 않은 PAP 패킷\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: %d 유형의 알 수 없는 PAP 패킷\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: \"%2$s\" 옵션에 대한 알 수 없는 \"%1$s\" 선택사항!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: 알 수 없는 \"%s\" 옵션!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: 지원되지 않는 보드율 %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: \"%s\" 상태 옵션에 대한 예상되는 번호\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: 복원 가능: '%s' 네트워크 호스트가 사용 중; %d초 후에 다시 시" +#~ "도...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "경고, 설치된 Windows 2000 프린터 드라이버가 없음!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 봉투" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "convert: 변환할 파일을 지정하려면 -f 옵션을 사용합니다.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: \"%s\" 프린터에 대한 PPD 파일이 없음 - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: 다음 서버에 연결할 수 없습니다: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: 알 수 없는 옵션 \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: 알 수 없는 옵션 \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: \"-c\" 옵션 뒤에 구성 파일 이름이 예상됨!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: 현재 디렉토리를 얻을 수 없음!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: 알 수 없는 \"%s\" 변수 - 중단 중!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: 알 수 없는 \"%c\" 옵션 - 중단 중!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: launchd(8) 지원이 컴파일되지 않아서, 일반 모드로 실행합니다.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: 유효하지 않은 도큐멘트 번호 %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: 유효하지 않은 작업 ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: 하나의 사용자 이름만 지정됨!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: 다음 임시 파일을 생성할 수 없습니다: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: 작업 파일을 얻을 수 없음 - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: -q 옵션은 -v 옵션과 호환되지 않습니다.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: -v 옵션은 -q 옵션과 호환되지 않습니다.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "%s/%s에 대한 장비: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "%s에 대한 장비: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\t명령에 대한 도움말 얻기\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri 속성이 유실됨!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: 클래스 이름은 프린트 가능한 문자만 포함할 수 있음!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: '-P' 옵션 뒤에 PPD가 예상됨!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: '-u' 옵션 뒤에 allow/deny:userlist가 예상됨!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: '-r' 옵션 뒤에 클래스가 예상됨!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: '-c' 옵션 뒤에 클래스 이름이 예상됨!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: '-D' 옵션 뒤에 설명이 예상됨!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: '-v' 옵션 뒤에 장비 URI가 예상됨!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: '-I' 옵션 뒤에 파일 유형이 예상됨!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: '-h' 옵션 뒤에 호스트 이름이 예상됨!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: '-i' 옵션 뒤에 인터페이스가 예상됨!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: '-L' 옵션 뒤에 위치가 예상됨!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: '-m' 옵션 뒤에 모델이 예상됨!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: '-o' 옵션 뒤에 name=value가 예상됨!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: '-p' 옵션 뒤에 프린터가 예상됨!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: '-d' 옵션 뒤에 프린터 이름이 예상됨!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: '-x' 옵션 뒤에 프린터 또는 클래스가 예상됨!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: 회원 이름이 보이지 않음!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: %s 프린터에 이미 %s 클래스 회원이 있습니다.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: %s 프린터에 %s 클래스 회원이 없습니다.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: 프린터 이름은 프린트 가능한 문자만 포함할 수 있음!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 클래스에 프린터를 추가할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: 서버에 연결할 수 없음: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: 임시 파일을 생성할 수 없음 - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: 임시 파일을 생성할 수 없음: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: \"%s\" PPD 파일을 열 수 없음 - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: \"%s\" 파일을 열 수 없음: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 클래스에서 프린터를 제거할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: PPD 파일을 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 장비 URI를 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 인터페이스 스크립트 또는 PPD 파일을 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 인터페이스 스크립트를 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 프린터 설명을 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 프린터 위치를 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 프린터 옵션을 설정할 수 없음:\n" +#~ " 먼저 프린터 이름을 지정해야 합니다!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: 알 수 없는 allow/deny 옵션 \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: 알 수 없는 '%s' 변수!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: 알 수 없는 '%c' 옵션!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: 경고 - 콘텐츠 유형 목록 무시됨!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: --device-id 뒤에 1284 장비 ID 스트링이 예상됨!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: --language 뒤에 언어가 예상됨!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: --make-and-model 뒤에 제조사 및 모델이 예상됨!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: --product 뒤에 제품 스트링이 예상됨!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: --exclude-schemes 뒤에 설계 목록이 예상됨!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: --include-schemess 뒤에 설계 목록이 예상됨!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: --timeout 뒤에 제한 시간이 예상됨!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: 알 수 없는 '%s' 변수!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: 알 수 없는 '%c' 옵션!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: 알 수 없는 '%s' 옵션!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: 서버에 연결할 수 없음: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: 알 수 없는 '%s' 변수!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: 알 수 없는 '%c' 옵션!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: 프린터가 없습니까!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: 프린터 또는 인스턴스를 추가할 수 없음: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: %s에 대한 PPD 파일을 얻을 수 없음: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: %s에 대한 PPD 파일을 열 수 없음!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: 알 수 없는 프린터 또는 클래스!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: root만 암호를 추가 또는 제거할 수 있음!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: 암호 파일 사용 중!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: 암호 파일이 업데이트되지 않음!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: 죄송합니다, 암호가 거부되었습니다.\n" +#~ "암호는 최소한 6자 이상이어야 하고, 사용자 이름을 포함해서는 안되며, \n" +#~ "최소 하나 이상의 문자 및 숫자를 포함해야 합니다.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: 암호 스트링을 복사할 수 없음: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: 암호 파일을 열 수 없음: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: 암호 파일에 쓸 수 없음: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: 이전 암호 파일을 백업하는데 실패함: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: 암호 파일 이름을 재설정하는데 실패함: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: \"%s\" 사용자 및 \"%s\" 그룹이 존재하지 않습니다.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: 오류 - %s 환경 변수 이름이 존재하지 않는 대상 \"%s\" 이름임!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "%s 클래스 회원:\n" + +#~ msgid "no entries\n" +#~ msgstr "엔트리 없음\n" + +#~ msgid "no system default destination\n" +#~ msgstr "시스템 기본 대상 없음\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events가 지정되지 않음!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri \"%s\" URI가 이미 사용 중임!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri \"%s\" URI가 알 수 없는 설계를 사용함!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "%d notify-subscription-id가 좋지 않습니다!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" 포함 디렉토리 추가 중...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: %s에서 UI 텍스트 추가/업데이트 중...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: 잘못된 불리언 값(%1$s)이 %3$s의 %2$d번째 줄에 있음.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: 잘못된 \"%1$s\" 해상도 이름이 %3$s의 %2$d번째 줄에 있음!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: 잘못된 %1$s 상태 키워드가 %3$s의 %2$d번째 줄에 있음!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: 잘못된 변수 대체항목($%1$c)이 %3$s의 %2$d번째 줄에 있음.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: 선택사항이 %2$s의 %1$d번째 줄에서 옵션 없이 발견됨!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: 로컬 %1$s에 대한 중복된 #po가 %3$s의 %2$d번째 줄에 있음!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 필터 정의가 예상됨!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 프로그램 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 불리언 값이 예상됨.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 문자 세트가 예상됨!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 선택사항 코드가 예상됨.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 선택사항 이름/텍스트가 예상됨.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 색상 순서가 예상됨!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 색상 공간이 예상됨!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 압축이 예상됨!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄에 UIConstraints에 대한 제한 스트링이 예상됨!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄, DriverType 뒤에 드라이버 유형 키워드가 예상됨!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Duplex 뒤에 양면 유형이 예상됨!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 인코딩이 예상됨!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄, #po %1$s 뒤에 파일 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 그룹 이름/텍스트가 예상됨!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 포함 파일 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 정수가 예상됨!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, #po 뒤에 로컬 위치가 예상됨!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, FileName 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Manufacturer 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, MediaSize 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, ModelName 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, PCFileName 뒤에 이름이 예상됨!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름/텍스트가 예상됨!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Installable 뒤에 이름/텍스트 예상됨!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 이름/텍스트 예상됨!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄, ColorModel에 대해 이름/텍스트 조합이 예상됨!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름/텍스트가 예상됨!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 섹션이 예상됨!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄의 옵션 유형이 예상됨!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 오버라이드 필드가 예상됨!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 실제 번호가 예상됨!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄, ColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄, SimpleColorProfile 뒤에 해상도/미디어 유형이 예" +#~ "상됨!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 선택자가 예상됨!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 상태가 예상됨!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Copyright 뒤에 스트링이 예상됨!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Version 뒤에 스트링이 예상됨!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름 2개가 예상됨!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 값이 예상됨!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 버전이 예상됨!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: 유효하지 않은 #include/#po 파일 이름 \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 비용!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 빈 MIME 유형!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 빈 프로그램 이름!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\" 옵션 섹션!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\" 옵션 유형!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" 드라이버 정보 파일 로드 중...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: 로컬 \"%s\"에 대한 메시지 로드 중...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: \"%s\"에서 메시지 로드 중...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: \"%s\" 끝에서 #endif 유실됨!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에서 #if 유실됨!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: 로컬 %s에 대해 제공된 메시지 카탈로그 없음!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 %1$s 옵션이 다른 유형으로 재정의됨!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 있는 옵션 제한은 *name이어야 함!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: %2$s의 %1$d번째 줄에 너무 많이 중첩된 #if가 있음!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: \"%s\" PPD 파일을 생성할 수 없음 - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: %s 출력 디렉토리를 생성할 수 없음: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: 출력 파이프를 생성할 수 없음: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: cupstestppd를 실행할 수 없음: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에서 #po 파일 %1$s을(를) 찾을 수 없음!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %3$s의 %2$d번째 줄에서 포함 파일 \"%1$s\"을(를) 찾을 수 없음!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: \"%s\"에 대한 현지화를 찾을 수 없음 - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: \"%s\"에 대한 현지화 파일을 로드할 수 없음 - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 변수(%1$s)가 정의되지 않음.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 %1$s 드라이브 유형!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 양면 유형!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 미디어 크기!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: %3$s의 %2$d번째 줄에 보이는 알 수 없는 \"%1$s\" 토큰!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: %3$s의 %2$d번째 줄에 있는 \"%1$s\" 실수에 알 수 없는 마지막 문자!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: %3$s의 %2$d번째 줄에 %1$c(으)로 시작하는 끝나지 않는 스트링!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: %s 쓰는 중...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: \"%s\" 디렉토리에 PPD 파일 쓰는 중...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: %2$s에 잘못된 \"%1$s\" LanguageVersion!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: %s PPD 파일 무시 중...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: %s을(를) %s(으)로 백업할 수 없음- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "%2$s 이후로 %1$s 프린터가 비활성화됨 -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "%s 프린터가 대기 중. %s 이후에 활성화됨\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "%s 프린터가 현재 %s-%d을(를) 프린트 중입니다. %s 이후에 활성화됨\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "%s/%s 프린터가 %s 이후에 비활성화됨 -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "%s/%s 프린터가 대기 중. %s 이후에 활성화됨\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "%s/%s 프린터가 현재 %s-%d을(를) 프린트 중입니다. %s 이후에 활성화됨\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "요청 id는 %s-%d(%d개의 파일)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "일정이 실행되지 않음\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "일정이 실행 중\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "상태\t\t데몬 및 대기열 상태 보기\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "시스템 기본 대상: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "시스템 기본 대상: %s/%s\n" diff --git a/locale/cups_nl.po b/locale/cups_nl.po new file mode 100644 index 0000000..02adec6 --- /dev/null +++ b/locale/cups_nl.po @@ -0,0 +1,8758 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimeter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f tot %.0f x %.0f millimeter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f inch" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f tot %.2f x %.2f inch" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s kan niet worden gewijzigd." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 inch/sec." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 inch/sec." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 inch/sec." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sec." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 inch/sec." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 inch/sec." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sec." + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sec." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sec." + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 inch/sec." + +msgid "2-Sided Printing" +msgstr "Dubbelzijdig afdrukken" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 inch/sec." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sec." + +msgid "200 mm/sec." +msgstr "200 mm/sec." + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-pens serie" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sec." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 inch/sec." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3,5-inch diskette" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5-inch diskette - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sec." + +msgid "300 mm/sec." +msgstr "300 mm/sec." + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 inch/sec." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sec." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 inch/sec." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 inch/sec." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sec." + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 inch/sec." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 inch/sec." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sec." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 inch/sec." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-pens serie" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Accepteer taken" + +msgid "Accepted" +msgstr "Geaccepteerd" + +msgid "Add Class" +msgstr "Voeg klasse toe" + +msgid "Add Printer" +msgstr "Voeg printer toe" + +msgid "Add RSS Subscription" +msgstr "Voeg RSS-abonnement toe" + +msgid "Address" +msgstr "Adres" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adres - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Beheer" + +msgid "Always" +msgstr "Altijd" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applicator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Ongeldige NULL-bestemmingspointer" + +msgid "Bad OpenGroup" +msgstr "Ongeldige OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Ongeldige OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Ongeldige OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Ongeldig verzoek" + +msgid "Bad SNMP version number" +msgstr "Ongeldig SNMP-versienummer" + +msgid "Bad UIConstraints" +msgstr "Ongeldige UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Ongeldige waarde voor aantal exemplaren %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Ongeldige zelfingestelde parameter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Ongeldige waarde voor number-up %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Ongeldige waarden voor paginabereik %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Banners" + +msgid "Billing Information: " +msgstr "Factuurgegevens: " + +msgid "Bond Paper" +msgstr "Bankpost" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL-etikettenprinter" + +msgid "Cancel RSS Subscription" +msgstr "Zeg RSS-abonnement op" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Wijzig instellingen" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klassen" + +msgid "Clean Print Heads" +msgstr "Reinig printerkoppen" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Kleur" + +msgid "Color Mode" +msgstr "Kleurenmodus" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor community-naam" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Ga door" + +msgid "Continuous" +msgstr "Doorlopend" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Aangemaakt" + +msgid "Created On: " +msgstr "Aangemaakt op: " + +msgid "Custom" +msgstr "Zelfingesteld" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Afsnijden" + +msgid "Cutter" +msgstr "Snijmachine" + +msgid "Dark" +msgstr "Donker" + +msgid "Darkness" +msgstr "Donkerte" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Verwijder klasse" + +msgid "Delete Printer" +msgstr "Verwijder printer" + +msgid "Description: " +msgstr "Beschrijving: " + +msgid "DeskJet Series" +msgstr "DeskJet-serie" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Bestemming \"%s\" accepteert geen opdrachten." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Direct Thermal-materiaal" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Uitgeschakeld" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Naam stuurprogramma: " + +msgid "Driver Version: " +msgstr "Versie stuurprogramma: " + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1-etikettenprinter" + +msgid "EPL2 Label Printer" +msgstr "EPL2-etikettenprinter" + +msgid "Edit Configuration File" +msgstr "Bewerk configuratiebestand" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Eindebanner" + +msgid "English" +msgstr "Dutch" + +msgid "Enter old password:" +msgstr "Voer oude wachtwoord in:" + +msgid "Enter password again:" +msgstr "Voer wachtwoord opnieuw in:" + +msgid "Enter password:" +msgstr "Voer wachtwoord in:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Voer uw gebruikersnaam en wachtwoord of de $%$root-gebruikersnaam en " +"bijbehorend wachtwoord in om deze pagina te benaderen. Maakt u gebruik van " +"Kerberos-toegangscontrole, controleer dan of u over een geldig Kerberos-" +"ticket beschikt." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Envelopinvoer" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Foutenbeleid" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Elke 10 etiketten" + +msgid "Every 2 Labels" +msgstr "Elke 2 etiketten" + +msgid "Every 3 Labels" +msgstr "Elke 3 etiketten" + +msgid "Every 4 Labels" +msgstr "Elke 4 etiketten" + +msgid "Every 5 Labels" +msgstr "Elke 5 etiketten" + +msgid "Every 6 Labels" +msgstr "Elke 6 etiketten" + +msgid "Every 7 Labels" +msgstr "Elke 7 etiketten" + +msgid "Every 8 Labels" +msgstr "Elke 8 etiketten" + +msgid "Every 9 Labels" +msgstr "Elke 9 etiketten" + +msgid "Every Label" +msgstr "Elk etiket" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Verwachting mislukt" + +msgid "Export Printers to Samba" +msgstr "Exporteer printers naar Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Dossiermap" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Dossiermap - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Verboden" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Algemeen" + +msgid "Generic" +msgstr "Generiek" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor Get-Response-PDU" + +msgid "Glossy Paper" +msgstr "Glanzend papier" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Grijstinten" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hangmap" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hangmap - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Ongeldig besturingsteken" + +msgid "Illegal main keyword string" +msgstr "Ongeldige tekenreeks voor hoofdsleutelwoord" + +msgid "Illegal option keyword string" +msgstr "Ongeldige tekenreeks voor optiesleutelwoord" + +msgid "Illegal translation string" +msgstr "Ongeldige tekenreeks voor vertaling" + +msgid "Illegal whitespace character" +msgstr "Ongeldig teken voor witruimte" + +msgid "Installable Options" +msgstr "Uitbreidingsmogelijkheden" + +msgid "Installed" +msgstr "Geïnstalleerd" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar-etikettenprinter" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Interne fout" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet Printing Protocol" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Taak #%d is al afgebroken - kan niet worden geannuleerd." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Taak #%d is al geannuleerd - kan niet worden geannuleerd." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Taak #%d is al gereed - kan niet worden geannuleerd." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Taak gereed" + +msgid "Job Created" +msgstr "Taak aangemaakt" + +msgid "Job ID: " +msgstr "Taak-ID: " + +msgid "Job Options Changed" +msgstr "Taakopties gewijzigd" + +msgid "Job Stopped" +msgstr "Taak gestopt" + +msgid "Job UUID: " +msgstr "Taak-UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "Taak is gereed en kan niet worden gewijzigd." + +msgid "Job operation failed:" +msgstr "Verwerking van taak is mislukt:" + +msgid "Job state cannot be changed." +msgstr "Status van taak kan niet worden gewijzigd." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Taken" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-host of -printer" + +msgid "Label Printer" +msgstr "Etikettenprinter" + +msgid "Label Top" +msgstr "Bovenkant etiket" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Groot adres" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Groot adres - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet-serie PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Licht" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Regel is langer dan toegestane maximum (255 tekens)" + +msgid "List Available Printers" +msgstr "Toon beschikbare printers" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Locatie: " + +msgid "Long-Edge (Portrait)" +msgstr "Lange kant (staand)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Merk en model: " + +msgid "Manual Feed" +msgstr "Handmatige invoer" + +msgid "Media Dimensions: " +msgstr "Afmetingen materiaal: " + +msgid "Media Limits: " +msgstr "Min. en max. afmetingen: " + +msgid "Media Name: " +msgstr "Materiaalnaam: " + +msgid "Media Size" +msgstr "Materiaalgrootte" + +msgid "Media Source" +msgstr "Bron voor materiaal" + +msgid "Media Tracking" +msgstr "Materiaaldetectie" + +msgid "Media Type" +msgstr "Materiaaltype" + +msgid "Medium" +msgstr "Materiaal" + +msgid "Memory allocation error" +msgstr "Geheugentoewijzingsfout" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Ontbrekende PPD-Adobe-4.x-kopregel" + +msgid "Missing asterisk in column 1" +msgstr "Ontbrekende asterisk in kolom 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Ontbrekende tekenreeks voor waarde" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Wijzig klasse" + +msgid "Modify Printer" +msgstr "Wijzig printer" + +msgid "Move All Jobs" +msgstr "Verplaats alle taken" + +msgid "Move Job" +msgstr "Verplaats taak" + +msgid "Moved Permanently" +msgstr "Definitief verplaatst" + +msgid "NULL PPD file pointer" +msgstr "NULL-pointer voor PPD-bestand" + +msgid "Name OID uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor naam-OID" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Nooit" + +msgid "New Stylus Color Series" +msgstr "Nieuwe Stylus Color-serie" + +msgid "New Stylus Photo Series" +msgstr "Nieuwe Stylus Photo-serie" + +msgid "No" +msgstr "Nee" + +msgid "No Content" +msgstr "Geen inhoud" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Geen VarBind-SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Geen actieve verbinding" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Geen community-naam" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Geen bestemmingen toegevoegd." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Geen error-index" + +msgid "No error-status" +msgstr "Geen error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Geen naam-OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Geen verzoek-ID" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Geen abonnementen gevonden." + +msgid "No variable-bindings SEQUENCE" +msgstr "Geen variable-bindings-SEQUENCE" + +msgid "No version number" +msgstr "Geen versienummer" + +msgid "Non-continuous (Mark sensing)" +msgstr "Niet-doorlopend (markeringssensor)" + +msgid "Non-continuous (Web sensing)" +msgstr "Niet-doorlopend (afstandssensor)" + +msgid "Normal" +msgstr "Normaal" + +msgid "Not Found" +msgstr "Niet gevonden" + +msgid "Not Implemented" +msgstr "Niet geïmplementeerd" + +msgid "Not Installed" +msgstr "Niet geïnstalleerd" + +msgid "Not Modified" +msgstr "Niet gewijzigd" + +msgid "Not Supported" +msgstr "Niet ondersteund" + +msgid "Not allowed to print." +msgstr "Afdrukken niet toegestaan." + +msgid "Note" +msgstr "Opmerking" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Uit (enkelzijdig)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Online Help" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Openen van %s mislukt: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup zonder eerst een CloseGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI zonder eerst een CloseUI/JCLCloseUI" + +msgid "Operation Policy" +msgstr "Gebruiksbeleid" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Geïnstalleerde opties" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opties: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Uitvoermodus" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL-laserprinter" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Pakket bevat geen Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Pakket begint niet met SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Wachtwoord voor %s op %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Wachtwoord voor %s vereist om %s te benaderen via SAMBA: " + +msgid "Pause Class" +msgstr "Onderbreek klasse" + +msgid "Pause Printer" +msgstr "Onderbreek printer" + +msgid "Peel-Off" +msgstr "Zelfklevend" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Foto-etiketten" + +msgid "Plain Paper" +msgstr "Gewoon papier" + +msgid "Policies" +msgstr "Beleid" + +msgid "Port Monitor" +msgstr "Poortmonitor" + +msgid "PostScript Printer" +msgstr "PostScript-printer" + +msgid "Postcard" +msgstr "Briefkaart" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Afdrukdichtheid" + +msgid "Print Job:" +msgstr "Afdruktaak:" + +msgid "Print Mode" +msgstr "Afdrukmodus" + +msgid "Print Rate" +msgstr "Afdrukdoorvoer" + +msgid "Print Self-Test Page" +msgstr "Druk zelftestpagina af" + +msgid "Print Speed" +msgstr "Afdruksnelheid" + +msgid "Print Test Page" +msgstr "Druk testpagina af" + +msgid "Print and Cut" +msgstr "Afdrukken en afsnijden" + +msgid "Print and Tear" +msgstr "Afdrukken en afscheuren" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Afgedrukt voor: " + +msgid "Printed From: " +msgstr "Afgedrukt vanaf: " + +msgid "Printed On: " +msgstr "Afgedrukt op: " + +msgid "Printer Added" +msgstr "Printer toegevoegd" + +msgid "Printer Default" +msgstr "Printerstandaard" + +msgid "Printer Deleted" +msgstr "Printer verwijderd" + +msgid "Printer Modified" +msgstr "Printer gewijzigd" + +msgid "Printer Name: " +msgstr "Printernaam: " + +msgid "Printer Paused" +msgstr "Printer onderbroken" + +msgid "Printer Settings" +msgstr "Printerinstellingen" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Printer:" + +msgid "Printers" +msgstr "Printers" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Maak takenlijst leeg" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Quotumlimiet bereikt." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Weiger taken" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Druk opnieuw af na fout" + +msgid "Request Entity Too Large" +msgstr "Request Entity te groot" + +msgid "Resolution" +msgstr "Resolutie" + +msgid "Resume Class" +msgstr "Hervat klasse" + +msgid "Resume Printer" +msgstr "Hervat printer" + +msgid "Return Address" +msgstr "Adres afzender" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Adres afzender - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Oprollen" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor SEQUENCE" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Zie andere" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Seriële poort #%d" + +msgid "Server Restarted" +msgstr "Server herstart" + +msgid "Server Security Auditing" +msgstr "Serverbeveiligingscontrole" + +msgid "Server Started" +msgstr "Server gestart" + +msgid "Server Stopped" +msgstr "Server gestopt" + +msgid "Service Unavailable" +msgstr "Voorziening niet beschikbaar" + +msgid "Set Allowed Users" +msgstr "Stel aantal toegestane gebruikers in" + +msgid "Set As Server Default" +msgstr "Stel in als serverstandaard" + +msgid "Set Class Options" +msgstr "Stel klasseopties in" + +msgid "Set Printer Options" +msgstr "Stel printeropties in" + +msgid "Set Publishing" +msgstr "Stel publicatie in" + +msgid "Shipping Address" +msgstr "Afleveradres" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Afleveradres - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Korte kant (liggend)" + +msgid "Special Paper" +msgstr "Speciaal papier" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standaard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Startbanner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Statement" + +msgid "Stylus Color Series" +msgstr "Stylus Color-serie" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo-serie" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Schakelen tussen protocollen" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Scheuren" + +msgid "Tear-Off" +msgstr "Afscheuren" + +msgid "Tear-Off Adjust Position" +msgstr "Pas positie voor afscheuren aan" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Het PPD-bestand \"%s\" kon niet worden gevonden." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Het PPD-bestand \"%s\" kon niet worden geopend: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"De klassenaam mag maximaal 127 afdrukbare tekens en geen spaties, schuine " +"strepen (/) of hekjes (#) bevatten." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Het attribuut &aops;notify-lease-duration&aops; kan niet worden gebruikt bij " +"taakabonnementen." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"De printernaam mag maximaal 127 afdrukbare tekens en geen spaties, schuine " +"strepen (/) of hekjes (#) bevatten." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "De printer-uri \"%s\" bevat ongeldige tekens." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"De printer-uri moet de vorm \"ipp://HOSTNAAM/klassen/KLASSENAAM\" hebben." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"De printer-uri moet de vorm \"ipp://HOSTNAAM/printers/PRINTERNAAM\" hebben." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"De abonnementsnaam mag geen spaties, schuine strepen (/), vraagtekens (?) of " +"hekjes (#) bevatten." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Er zijn te veel abonnementen." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Thermal Transfer-materiaal" + +msgid "Title: " +msgstr "Titel: " + +msgid "Too many active jobs." +msgstr "Te veel actieve taken." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparantie" + +msgid "Tray" +msgstr "Lade" + +msgid "Tray 1" +msgstr "Lade 1" + +msgid "Tray 2" +msgstr "Lade 2" + +msgid "Tray 3" +msgstr "Lade 3" + +msgid "Tray 4" +msgstr "Lade 4" + +msgid "URI Too Long" +msgstr "URI te lang" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB-seriële poort #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Niet mogelijk om toegang te krijgen tot cupsd.conf-bestand:" + +msgid "Unable to add RSS subscription:" +msgstr "Niet mogelijk om RSS-abonnement toe te voegen:" + +msgid "Unable to add class:" +msgstr "Niet mogelijk om klasse toe te voegen:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Niet mogelijk om printer toe te voegen:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Niet mogelijk om RSS-abonnement op te zeggen:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Niet mogelijk om attribuut &aops;printer-is-shared&aops; te wijzigen:" + +msgid "Unable to change printer:" +msgstr "Niet mogelijk om printer te wijzigen:" + +msgid "Unable to change server settings:" +msgstr "Niet mogelijk om serverinstellingen te wijzigen:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Niet mogelijk om verbinding met host te maken." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Niet mogelijk om tijdelijk bestand aan te maken:" + +msgid "Unable to delete class:" +msgstr "Niet mogelijk om klasse te verwijderen:" + +msgid "Unable to delete printer:" +msgstr "Niet mogelijk om printer te verwijderen:" + +msgid "Unable to do maintenance command:" +msgstr "Niet mogelijk om onderhoudscommando op te geven:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Niet mogelijk om klasselijst weer te geven:" + +msgid "Unable to get class status:" +msgstr "Niet mogelijk om klassestatus weer te geven:" + +msgid "Unable to get list of printer drivers:" +msgstr "Niet mogelijk om lijst van printerstuurprogramma&aops;s weer te geven:" + +msgid "Unable to get printer attributes:" +msgstr "Niet mogelijk om printerattributen weer te geven:" + +msgid "Unable to get printer list:" +msgstr "Niet mogelijk om printerlijst weer te geven:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Niet mogelijk om printerstatus weer te geven:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Niet mogelijk om klasse te wijzigen:" + +msgid "Unable to modify printer:" +msgstr "Niet mogelijk om printer te wijzigen:" + +msgid "Unable to move job" +msgstr "Niet mogelijk om taak te verplaatsen" + +msgid "Unable to move jobs" +msgstr "Niet mogelijk om taken te verplaatsen" + +msgid "Unable to open PPD file" +msgstr "Niet mogelijk om PPD-bestand te openen" + +msgid "Unable to open PPD file:" +msgstr "Niet mogelijk om PPD-bestand te openen:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Niet mogelijk om cupsd.conf-bestand te openen:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Niet mogelijk om testpagina af te drukken:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Niet mogelijk om opties in te stellen:" + +msgid "Unable to set server default:" +msgstr "Niet mogelijk om serverstandaard in te stellen:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Niet mogelijk om cupsd.conf file-bestand te uploaden:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Onbevoegd" + +msgid "Units" +msgstr "Eenheden" + +msgid "Unknown" +msgstr "Onbekend" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Onbekend printerfoutbeleid \"%s\"." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Onbekend printergebruiksbeleid \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Niet-ondersteund waardetype" + +msgid "Upgrade Required" +msgstr "Upgrade vereist" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor waarde" + +msgid "VarBind uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor VarBind" + +msgid "Version uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor versie" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ja" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"U dient deze pagina te benaderen via de URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL-etikettenprinter" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "afgebroken" + +msgid "canceled" +msgstr "geannuleerd" + +msgid "completed" +msgstr "gereed" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced niet uitgevoerd." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd niet uitgevoerd." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor error-index" + +msgid "error-status uses indefinite length" +msgstr "Onbepaalde lengte gebruikt voor error-status" + +msgid "held" +msgstr "vastgehouden" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "niet in gebruik" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "in bewerking" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "taak wordt verwerkt" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "onbepaalde lengte gebruikt voor request-id" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "stat van %s mislukt: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "gestopt" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "onbekend" + +msgid "untitled" +msgstr "naamloos" + +msgid "variable-bindings uses indefinite length" +msgstr "onbepaalde lengte gebruikt voor variable-bindings" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(alle)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(geen)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d onderdelen\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tNa storing: doorgaan\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tWaarschuwingen:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner vereist\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tCharset-sets:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tVerbinding: direct\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tVerbinding: niet-lokaal\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tStandaard paginagrootte:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tStandaardpitch:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tStandaard poortinstellingen:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tOmschrijving: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormulier geactiveerd:\n" +#~ "\tInhoudstypes: alle\n" +#~ "\tPrintertypes: onbekend\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormulieren toegestaan:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterface: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterface: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterface: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tLocatie: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tBij storing: geen waarschuwing\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tGebruikers toegelaten:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tGebruikers geweigerd:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemon aanwezig\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tgeen onderdelen\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tprinter bevindt zich op apparaat &aops;%s&aops; snelheid -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tafdrukken is uitgeschakeld\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tafdrukken is ingeschakeld\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tgeplaatst in wachtrij voor %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tverplaatsen naar wachtrij is uitgeschakeld\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tverplaatsen naar wachtrij is ingeschakeld\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tonbekende oorzaak\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " GEDETAILLEERDE RESULTATEN VOOR CONFORMANTIETEST\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Pagina 15, sectie 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Pagina 15, sectie 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Pagina 19, sectie 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Pagina 20, sectie 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Pagina 27, sectie 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Pagina 42, sectie 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Pagina 16-17, sectie 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Pagina 42-45, sectie 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Pagina 45-46, sectie 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Pagina 48-49, sectie 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Pagina 52-54, sectie 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f bytes\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" conflicteert met \"%s %s\"\n" +#~ " (beperking=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s heeft geen bijbehorende opties!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s deelt een gemeenschappelijke prefix met %s\n" +#~ " REF: Pagina 15, sectie 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Standaardkeuzen conflicteren!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Sleutelwoord %s voor duplexoptie werkt mogelijk niet " +#~ "zoals verwacht. Gebruik Duplex als sleutelwoord.\n" +#~ " REF: Pagina 122, sectie 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Bestand bevat een combinatie van CR-, LF- en CR LF-" +#~ "regeleinden!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN &aops;LanguageEncoding&aops; vereist door PPD 4.3-" +#~ "specificatie.\n" +#~ " REF: Pagina 56-57, sectie 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Regel %d bevat alleen witruimte!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN &aops;Manufacturer&aops; vereist door PPD 4.3-" +#~ "specificatie.\n" +#~ " REF: Pagina 58-59, sectie 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN APDialogExtension-bestand \"%s\" ontbreekt\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN APPrinterIconPath-bestand \"%s\" ontbreekt\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN PPD-bestanden voor andere systemen dan Windows mogen " +#~ "uitsluitend LF als regeleinde gebruiken, niet CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Verouderde PPD-versie %.1f!\n" +#~ " REF: Pagina 42, sectie 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName langer dan 8.3 komt niet overeen met PPD-" +#~ "specificatie.\n" +#~ " REF: Pagina 61-62, sectie 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols bevat PJL, maar JCL-attributen zijn niet " +#~ "ingesteld.\n" +#~ " REF: Pagina 78-79, sectie 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols bevat zowel PJL als BCP; verwachtte TBCP.\n" +#~ " REF: Pagina 78-79, sectie 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN &aops;ShortNickName&aops; vereist door PPD 4.3-" +#~ "specificatie.\n" +#~ " REF: Pagina 64-65, sectie 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s bestaat niet!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Ongeldige %s keuze %s!\n" +#~ " REF: Pagina 122, sectie 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s Ongeldige UTF-8 \"%s\" vertaalreeks voor optie %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ongeldige UTF-8 \"%s\" vertaalreeks voor optie %s, keuze %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Ongeldige waarde voor cupsFilter \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Ongeldig cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Ongeldige waarde voor cupsPreFilter \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Ongeldige cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Ongeldige taal \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Lege cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Ontbrekende \"%s\" vertaalreeks voor optie %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ontbrekende \"%s\" vertaalreeks voor optie %s, keuze %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Ontbrekende keuze *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Ontbrekende keuze *%s %s in cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Ontbrekend cupsFilter-bestand \"%s\"\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Ontbrekend cupsICCProfile-bestand \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Ontbrekend cupsPreFilter-bestand \"%s\"\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Ontbrekende cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Ontbrekende optie %s in UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Ontbrekende optie %s in cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Geen basisvertaling \"%s\" opgenomen in bestand!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s REQUIRED %s bevat geen definitie voor keuze None!\n" +#~ " REF: Pagina 122, sectie 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s hash-waarde conflicteert met %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s veroorzaakt een lus!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s keuzenamen %s en %s verschillen alleen in " +#~ "hoofdlettergebruik!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s moet 1284DeviceID zijn!\n" +#~ " REF: Pagina 72, sectie 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE Default%s %s\n" +#~ " REF: Pagina 40, sectie 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE DefaultImageableArea %s!\n" +#~ " REF: Pagina 102, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE DefaultPaperDimension %s!\n" +#~ " REF: Pagina 103, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIG JobPatchFile-attribuut in bestand\n" +#~ " REF: Pagina 24, sectie 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE Manufacturer (moet zijn \"HP\")\n" +#~ " REF: Pagina 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE Manufacturer (moet zijn \"Oki\")\n" +#~ " REF: Pagina 211, tabel D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE ModelName - \"%c\" niet toegestaan in " +#~ "tekenreeks.\n" +#~ " REF: Pagina 59-60, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE PSVersion - niet \"(tekenreeks) int\".\n" +#~ " REF: Pagina 62-64, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIG Product - niet \"(tekenreeks)\".\n" +#~ " REF: Pagina 62, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ONGELDIGE ShortNickName - langer dan 31 tekens.\n" +#~ " REF: Pagina 64-65, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Ongeldige %s keuze %s!\n" +#~ " REF: Pagina 84, sectie 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Ongeldige FileVersion \"%s\"\n" +#~ " REF: Pagina 56, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Ongeldige FormatVersion \"%s\"\n" +#~ " REF: Pagina 56, sectie 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** Ongeldige LanguageEncoding %s - moet ISOLatin1 zijn!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** Ongeldige LanguageVersion %s - moet Engels zijn!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** Code voor standaardoptie kan niet worden geïnterpreteerd: " +#~ "%s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Standaardvertaalreeks voor optie %s keuze %s bevat 8-bits " +#~ "tekens!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Standaardvertaalreeks voor optie %s bevat 8-bits tekens!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Groepsnamen %s en %s verschillen alleen in " +#~ "hoofdlettergebruik!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** %s keuzenaam %s komt meerdere keren voor!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Optienamen %s en %s verschillen alleen in " +#~ "hoofdlettergebruik!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Pagina 40, sectie 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Pagina 102, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Pagina 103, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Pagina 56, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Pagina 56, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ImageableArea voor PageSize %s\n" +#~ " REF: Pagina 41, sectie 5.\n" +#~ " REF: Pagina 102, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pagina 56-57, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pagina 57-58, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pagina 58-59, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pagina 59-60, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Pagina 60, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pagina 61-62, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pagina 62-64, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Pagina 100, sectie 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pagina 41, sectie 5.\n" +#~ " REF: Pagina 99, sectie 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pagina 99-100, sectie 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PaperDimension voor PageSize %s\n" +#~ " REF: Pagina 41, sectie 5.\n" +#~ " REF: Pagina 103, sectie 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Pagina 62, sectie 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Pagina 64-65, sectie 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d FOUTEN GEVONDEN" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Ongeldige %%%%BoundingBox: op regel %d!\n" +#~ " REF: Pagina 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Ongeldige %%%%Page: op regel %d!\n" +#~ " REF: Pagina 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Ongeldige %%%%Pages: op regel %d!\n" +#~ " REF: Pagina 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Regel %d bevat meer dan 255 tekens (%d)!\n" +#~ " REF: Pagina 25, Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " Ontbrekende %!PS-Adobe-3.0 op eerste regel!\n" +#~ " REF: Pagina 17, 3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Ontbrekend %%EndComments-commentaar!\n" +#~ " REF: Pagina 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Ontbrekend of ongeldig %%BoundingBox-commentaar!\n" +#~ " REF: Pagina 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Ontbrekend of ongeldig %%Page-commentaar!\n" +#~ " REF: Pagina 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Ontbrekend of ongeldig %%Pages-commentaar!\n" +#~ " REF: Pagina 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " GEEN FOUTEN GEVONDEN\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " %d Regels gevonden met meer dan 255 tekens!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Te veel %%BeginDocument-commentaren!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Te veel %%EndDocument-commentaren!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Waarschuwing: bestand bevat binaire gegevens!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Waarschuwing: bestand bevat geen %%EndComments-commentaar!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Waarschuwing: bestand bevat verouderde DSC versie %.1f!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Kan PPD-bestand niet openen - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Kan PPD-bestand niet openen - %s op regel %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10-envelop" + +#~ msgid "#11 Envelope" +#~ msgstr "#11-envelop" + +#~ msgid "#12 Envelope" +#~ msgstr "#12-envelop" + +#~ msgid "#14 Envelope" +#~ msgstr "#14-envelop" + +#~ msgid "#9 Envelope" +#~ msgstr "#9-envelop" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s accepteert verzoeken sinds %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s is niet geïmplementeerd in de CUPS-versie van lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s is niet gereed\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s is gereed\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s is gereed en bezig met afdrukken\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s accepteert geen verzoeken sinds %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s niet ondersteund!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s accepteert verzoeken sinds %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s accepteert geen verzoeken sinds %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [taak %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s niet gelukt: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Ik weet niet wat ik moet doen!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Fout - %s niet-bestaande bestemming voor variabelenamen van omgeving " +#~ "\"%s\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Fout - ongeldige taak-ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Fout - niet mogelijk om gelijktijdig bestanden af te drukken en taken " +#~ "te wijzigen!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Fout - niet mogelijk om af te drukken vanuit stdin als bestanden of " +#~ "een taak-ID zijn aangeleverd!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Fout - verwachtte tekenset na optie &aops;-S&aops;!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Fout - verwachtte inhoudstype na optie &aops;-T&aops;!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Fout - verwachtte aantal afdrukken na optie &aops;-n&aops;!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Fout - verwachtte aantal exemplaren na optie &aops;-#&aops;!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Fout - verwachtte bestemming na optie &aops;-P&aops;!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Fout - verwachtte bestemming na optie &aops;-b&aops;!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Fout - verwachtte bestemming na optie &aops;-d&aops;!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Fout - verwachtte formulier na optie &aops;-f&aops;!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Fout - verwachtte hold-naam na optie &aops;-H&aops;!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Fout - verwachtte hostnaam na optie &aops;-H&aops;!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Fout - verwachtte hostnaam na optie &aops;-h&aops;!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Fout - verwachtte moduslijst na optie &aops;-y&aops;!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Fout - verwachtte naam na optie &aops;-%c&aops;!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Fout - verwachtte optietekenreeks na optie &aops;-o&aops;!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Fout - verwachtte paginalijst na optie &aops;-P&aops;!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Fout - verwachtte prioriteit na optie &aops;-%c&aops;!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Fout - verwachtte verklaring na optie &aops;-r&aops;!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Fout - verwachtte titel na optie &aops;-t&aops;!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Fout - verwachtte gebruikersnaam na optie &aops;-U&aops;!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Fout - verwachtte gebruikersnaam na optie &aops;-u&aops;!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Fout - verwachtte waarde na optie &aops;-%c&aops;!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Fout - optie &aops;-W&aops; moet worden gevolgd door \"gereed\", " +#~ "\"niet gereed\" of \"alle\"!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Fout - geen standaardbestemming beschikbaar.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Fout - prioriteit moet tussen 1 en 100 liggen.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Fout - taakplanner reageert niet!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Fout - te veel bestanden - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Fout - niet mogelijk om \"%s\" te benaderen - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Fout - in wachtrij plaatsen vanaf stdin is niet mogelijk - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Fout - onbekende bestemming \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Fout - onbekende bestemming \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Fout - onbekende optie &aops;%c&aops;!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Fout - onbekende optie '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Verwachtte taak-ID na optie &aops;-i&aops;!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filter \"%s\" niet beschikbaar: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Ongeldige bestemmingsnaam in lijst \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Ongeldige filtertekenreeks \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: Taak-ID (&aops;-i jobid&aops;) nodig voor &aops;-H restart&aops;!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Geen filter beschikbaar voor conversie van %s/%s naar %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Bewerking mislukt: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Sorry, geen ondersteuning voor encryptie opgenomen!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Kan geen verbinding tot stand brengen met server\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Kan geen contact maken met server!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Niet mogelijk om MIME-type van \"%s\" vast te stellen!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Niet mogelijk om %s - %s te openen\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Niet mogelijk om %s - %s in regel %d te openen.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Niet mogelijk om %s te openen: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Niet mogelijk om PPD-bestand %s in regel %d te openen\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Niet mogelijk om MIME-database van \"%s\" of \"%s\" te lezen!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Onbekende bestemming \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Onbekend MIME-type voor bestemming %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Onbekende optie &aops;%c&aops;!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Onbekend MIME-type voor bron %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Waarschuwing - &aops;%c&aops; format modifier niet ondersteund - " +#~ "uitvoer is mogelijk niet correct!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Waarschuwing - tekensetoptie genegeerd!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Waarschuwing - inhoudstype-optie genegeerd!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Waarschuwing - formulieroptie genegeerd!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Waarschuwing - modusoptie genegeerd!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: fout - %s niet-bestaande bestemming voor variabelenamen van omgeving " +#~ "\"%s\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: fout - verwachtte optie=waarde na optie &aops;-o&aops;!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: fout - geen standaardbestemming beschikbaar.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600-DPI grijstinten" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Ongeldig en onbekend helpcommando\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "Voor het exporteren van printerstuurprogramma&aops;s is een Samba-" +#~ "wachtwoord vereist!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Voor het exporteren van printerstuurprogramma&aops;s is een Samba-" +#~ "gebruikersnaam vereist!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Er is al een klasse met de naam \"%s\"!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Er is al een printer met de naam \"%s\"!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (oversize)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (oversize)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (klein)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (oversize)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Poging om %s printer-state in te stellen op ongeldige waarde %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Attribuutgroepen hebben verkeerde volgorde (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Ongeldige apparaat-URI \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Ongeldige device-uri \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Ongeldig device-uri-schema \"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Ongeldige documentindeling \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Ongeldige bestandsnaambuffer!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Ongeldig lettertypeattribuut: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Ongeldige waarde voor job-priority!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Ongeldige waarde voor job-sheets \"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Ongeldig waardetype voor job-sheets!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Ongeldige waarde voor job-state!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Ongeldig job-uri-attribuut \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Ongeldige notify-pull-method \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Ongeldige URI voor notify-recipient-uri \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Ongeldige optie + keuze op regel %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Ongeldige port-monitor \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Ongeldige waarde voor printer-state %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Ongeldig versienummer voor verzoek %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Ongeldig abonnement-ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0-envelop" + +#~ msgid "C1 Envelope" +#~ msgstr "C1-envelop" + +#~ msgid "C2 Envelope" +#~ msgstr "C2-envelop" + +#~ msgid "C3 Envelope" +#~ msgstr "C3-envelop" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4-envelop" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5-envelop" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6-envelop" + +#~ msgid "C65 Envelope" +#~ msgstr "C65-envelop" + +#~ msgid "C7 Envelope" +#~ msgstr "C7-envelop" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Tekenset \"%s\" niet ondersteund!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3-envelop" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4-envelop" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Commando&aops;s kunnen worden afgekort. Commando&aops;s zijn:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Kon type \"%s\" niet scannen!" + +#~ msgid "Cover open." +#~ msgstr "Printklep open." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL-envelop" + +#~ msgid "Developer almost empty." +#~ msgstr "Ontwikkelaar bijna op." + +#~ msgid "Developer empty!" +#~ msgstr "Ontwikkelaar op!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Apparaat: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Document %d is niet gevonden in taak %d." + +#~ msgid "Door open." +#~ msgstr "Deur open." + +#~ msgid "Double Postcard" +#~ msgstr "Dubbele briefkaart" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Niet mogelijk geheugen toe te kennen voor pagina-info: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Niet mogelijk geheugen toe te kennen voor paginareeks: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Ongeldige %%BoundingBox: opmerking ontdekt!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Ongeldige %%IncludeFeature: opmerking!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Ongeldige %%Page: opmerking in bestand!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Ongeldige %%PageBoundingBox: opmerking in bestand!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Ongeldig SCSI-apparaatbestand \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Ongeldig tekensetbestand %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Ongeldig tekensettype %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Ongeldige kolomwaarde %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Ongeldige cpi-waarde %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Ongeldige regel voor lettertypeomschrijving: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Ongeldige lpi-waarde %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Ongeldige pagina-instelling!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Ongeldige tekstrichting %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Ongeldige tekstbreedte %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Printer die is gekozen als bestemming bestaat niet!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Dubbele %%BoundingBox: opmerking ontdekt!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Dubbele %%Pages: opmerking ontdekt!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Leeg afdrukbestand!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Fout %d bij versturen PAPSendData-verzoek: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "" +#~ "ERROR: Verwachtte tekenreeks met aanhalingstekens in regel %d van %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Fatale USB-fout!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Ongeldig HP-GL/2-commando ontdekt, kan afdrukbestand niet openen!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: Ontbrekende %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: Ontbrekende %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Ontbrekende apparaat-URI op commandoregel en geen DEVICE_URI-" +#~ "omgevingsvariabele!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Ontbrekende waarde in regel %d van bannerbestand!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: msgid-regel vereist voorafgaand aan vertaalreeksen in regel %d van " +#~ "%s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Geen %%BoundingBox: opmerking in kopregel!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Geen %%Pages: opmerking in kopregel!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Geen apparaat-URI gevonden in argv[0] of in DEVICE_URI-" +#~ "omgevingsvariabele!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Geen lettertypen in tekensetbestand %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Geen pagina&aops;s gevonden!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Papier is op!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER-omgevingsvariabele niet gedefinieerd!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Afdrukbestand niet geaccepteerd (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Printer reageert niet\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Printer reageert niet!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Printer heeft onverwacht einde-bestandteken verstuurd\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Niet-lokale host heeft stuurbestand niet geaccepteerd (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "" +#~ "ERROR: Niet-lokale host heeft gegevensbestand niet geaccepteerd (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Time-out-fout tijdens het versturen van gegevens naar de printer\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Niet mogelijk om bestand %d toe te voegen aan taak: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Niet mogelijk om afdruktaak %d te annuleren: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Niet mogelijk om PDF-bestand te kopiëren" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Niet mogelijk om socket aan te maken" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om tijdelijk gecomprimeerd afdrukbestand te maken: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Niet mogelijk om tijdelijk bestand aan te maken" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Niet mogelijk om tijdelijk bestand - %s te maken.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Niet mogelijk om tijdelijk bestand te maken: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Niet mogelijk om pictwpstops uit te voeren: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Niet mogelijk om gs-programma uit te voeren" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Niet mogelijk om pdftops-programma uit te voeren" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Niet mogelijk om pictwpstops te splitsen: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Niet mogelijk om PAP-verzoek op te vragen" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Niet mogelijk om PAP-reactie op te vragen" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om PPD-bestand voor printer \"%s\" op te vragen - %" +#~ "s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Niet mogelijk om standaard-AppleTalk-zone op te vragen" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Niet mogelijk om taakattributen %d op te vragen (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Niet mogelijk om printerstatus op te vragen (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Niet mogelijk om printer &aops;%s&aops; te vinden!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Niet mogelijk om naar PAP-reactie te zoeken" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Niet mogelijk om naar AppleTalk-printers te zoeken" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Niet mogelijk om AppleTalk-adres aan te maken" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Niet mogelijk om \"%s\" te openen - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Niet mogelijk om %s te openen: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Niet mogelijk om bannerbestand \"%s\" te openen - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Niet mogelijk om apparaatbestand \"%s\" te openen: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Niet mogelijk om bestand \"%s\" te openen - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Niet mogelijk om bestand \"%s\" te openen: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Niet mogelijk om beeldbestand te openen voor afdrukken!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukbestand \"%s\" te openen: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukbestand %s te openen - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukbestand %s te openen: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om tijdelijk gecomprimeerd afdrukbestand te openen: %" +#~ "s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Niet mogelijk om tijdelijk bestand te openen" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Niet mogelijk om %d tekstkolommen af te drukken!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Niet mogelijk om %dx%d tekstpagina af te drukken!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens te lezen" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens te lezen!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Niet mogelijk om poort te reserveren" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om te proberen %ld in bestand te positioneren - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om te proberen %lld in bestand te positioneren - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Niet mogelijk om LPD-commando te versturen" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Niet mogelijk om PAP-tickleverzoek te versturen" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om initieel PAP-verzoek voor versturen gegevens te " +#~ "versturen" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens te verzenden (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens te versturen!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Niet mogelijk om afdrukbestand naar printer te versturen" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om afsluitende lege tekens naar printer te versturen" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Niet mogelijk om te wachten op pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Niet mogelijk om %d bytes te schrijven naar \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Niet mogelijk om %d bytes naar printer te schrijven!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Niet mogelijk om stuurbestand weg te schrijven" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens weg te schrijven" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Niet mogelijk om afdrukgegevens weg te schrijven: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om rastergegevens weg te schrijven naar " +#~ "stuurprogramma!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Niet mogelijk om naar tijdelijk bestand te schrijven" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "" +#~ "ERROR: Niet mogelijk om ongecomprimeerde documentgegevens weg te " +#~ "schrijven: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Onverwachte tekst in regel %d van %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Onbekende waarde voor encryptie-optie \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Onbekende bestandsvolgorde \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Onbekend opmaakteken \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Onbekende berichtencatalogusstructuur voor \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Onbekende optie \"%s\" met waarde \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Onbekende afdrukmodus \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Onbekende waarde voor versie-optie \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Niet-ondersteunde waarde voor helderheid %s, gebruikt " +#~ "helderheid=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "" +#~ "ERROR: Niet-ondersteunde waarde voor gamma %s, gebruikt gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: Niet-ondersteunde waarde voor number-up %d, gebruikt number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Niet-ondersteunde waarde voor number-up-layout %s, gebruikt number-" +#~ "up-layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Niet-ondersteunde waarde voor page-border %s, gebruikt page-" +#~ "border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "" +#~ "ERROR: doc_printf-overflow (%d bytes) ontdekt, afdrukken wordt " +#~ "geannuleerd!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-filter vastgelopen op signaal %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-filter gestopt met status %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops gestopt na signaal %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops gestopt met status %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: kan worden hersteld: niet mogelijk om verbinding te maken met " +#~ "printer; nieuwe poging over 30 seconden...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() mislukt" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: stat van afdrukbestand niet mogelijk" + +#~ msgid "Empty PPD file!" +#~ msgstr "Leeg PPD-bestand!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Fout: hostnaam nodig na optie &aops;-h&aops;!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "File device-URI&aops;s zijn uitgeschakeld! Raadpleeg als u de URI&aops;s " +#~ "weer wilt inschakelen de richtlijn voor FileDevice in \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Fusertemperatuur te hoog!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Fusertemperatuur te laag!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Printer-uri-attribuut gevonden, maar geen job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk uitgeschakeld in Systeemvoorkeuren\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk uitgeschakeld in Systeemvoorkeuren.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Afdrukopdracht wordt geannuleerd...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Verbonden met printer...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Verbinden met printer...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Stuurbestand succesvol verzonden\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Gegevensbestand succesvol verzonden\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Bezig met indelen van pagina %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Bezig met laden van beeldbestand...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Zoeken naar printer...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Verbinding wordt geopend\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: Afdrukbestand verzonden, wacht tot printer gereed is...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Printer is bezig; nieuwe poging over 10 seconden...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Printer is bezig; nieuwe poging over 30 seconden...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Printer is bezig; nieuwe poging over 5 seconden...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: Printer biedt geen ondersteuning voor IPP/%d.%d, probeert nu " +#~ "IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Printer is bezig; nieuwe poging over 5 seconden...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Printer is momenteel offline.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Printer is momenteel offline.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Printer is nu online.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Printer is offline.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Geen verbinding met printer; nieuwe poging over 30 seconden...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Bezig met afdrukken van pagina %d, %d%% gereed...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Bezig met afdrukken van pagina %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Klaar om af te drukken.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Bezig met verzending van stuurbestand (%lu bytes)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Bezig met verzending van stuurbestand (%u bytes)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Bezig met verzenden van gegevens\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Bezig met verzenden van gegevensbestand (%ld bytes)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Bezig met verzenden van gegevensbestand (%lld bytes)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Afdrukgegevens worden verstuurd...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Afdrukbestand is verzonden, %ld bytes...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Afdrukbestand is verzonden, %lld bytes...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Bezig met spoolen van LPR-taak, %.0f%% gereed...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Kan geen contact maken met printer, taak wordt overgebracht naar " +#~ "volgende printer in klasse...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Standaard-AppleTalk-zone \"%s\" wordt gebruikt\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Wacht tot afdrukopdracht is afgerond...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Wacht tot printer beschikbaar is...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4-envelop" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (oversize)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5-envelop" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6-envelop" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Inkt/toner bijna op." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Inkt/toner op!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Opvangbak voor inkt/toner bijna vol." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Opvangbak voor inkt/toner vol!" + +#~ msgid "Interlock open." +#~ msgstr "Interlock open." + +#~ msgid "Invite Envelope" +#~ msgstr "Invite-envelop" + +#~ msgid "Italian Envelope" +#~ msgstr "Italian-envelop" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Taak #%d kan niet worden herstart - geen bestanden!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Taak #%d bestaat niet!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Taak #%d is gereed en kan niet worden gewijzigd!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Taak #%d is nog niet gereed!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Taak #%d wordt niet vastgehouden voor controle!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Taak #%d wordt niet vastgehouden!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Taak #%s bestaat niet!" + +#~ msgid "Job %d not found!" +#~ msgstr "Taak %d niet gevonden!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Taakabonnementen kunnen niet worden verlengd!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2-envelop" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3-envelop" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Taal \"%s\" wordt niet ondersteund!" + +#~ msgid "Media jam!" +#~ msgstr "Materiaal is vastgelopen!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Materiaallade is bijna leeg." + +#~ msgid "Media tray empty!" +#~ msgstr "Materiaallade is leeg!" + +#~ msgid "Media tray missing!" +#~ msgstr "Materiaallade ontbreekt!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Materiaallade moet worden bijgevuld." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Document-number-attribuut ontbreekt!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Ontbrekend dubbel aanhalingsteken op regel %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Ontbrekende formuliervariabele!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Notify-subscription-ids-attribuut ontbreekt!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Requesting-user-name-attribuut ontbreekt!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Vereiste attributen ontbreken!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Ontbrekende waarde op regel %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch-envelop" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Afdrukbestand geaccepteerd - taak-ID %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Afdrukbestand geaccepteerd - taak-ID onbekend.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Geen PPD-naam!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Er zijn geen Windows-printerstuurprogramma&aops;s geïnstalleerd!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Geen actieve taken op %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Verzoek bevat geen attributen!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Geen informatie verstrekt voor toegangscontrole!" + +#~ msgid "No default printer" +#~ msgstr "Geen standaardprinter" + +#~ msgid "No file!?!" +#~ msgstr "Geen bestand!?!" + +#~ msgid "No modification time!" +#~ msgstr "Geen bewerkingstijdstip!" + +#~ msgid "No printer name!" +#~ msgstr "Geen printernaam!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Geen printer-uri gevonden voor klasse!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Geen printer-uri gevonden!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Verzoek bevat geen printer-uri!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Verzoek bevat geen attributen voor abonnement!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC bijna aan einde levensduur." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC aan einde levensduur!" + +#~ msgid "Out of toner!" +#~ msgstr "Toner is op!" + +#~ msgid "Output bin almost full." +#~ msgstr "Uitvoerbak is bijna vol." + +#~ msgid "Output bin full!" +#~ msgstr "Uitvoerbak is vol!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Uitvoer voor printer %s wordt gestuurd naar %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Uitvoer voor printer %s wordt gestuurd naar niet-lokale printer %s op %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Uitvoer voor printer %s/%s wordt gestuurd naar %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Uitvoer voor printer %s/%s wordt gestuurd naar niet-lokale printer %s op %" +#~ "s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Uitvoerbak ontbreekt!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1-envelop" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10-envelop" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2-envelop" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3-envelop" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (oversize)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4-envelop" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5-envelop" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6-envelop" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7-envelop" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8-envelop" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9-envelop" + +#~ msgid "Personal Envelope" +#~ msgstr "Personal-envelop" + +#~ msgid "Printer offline." +#~ msgstr "Printer offline." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Positie Eigenaar Taak Bestand(en) Totale " +#~ "grootte\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Positie Eigenaar Prioriteit Taak " +#~ "Bestanden Totale grootte\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Commando wordt uitgevoerd: %s %s -N -A %s -c &aops;%s&aops;\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI-printer" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (oversize)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "De waarde voor notify-user-data is te groot (%d > 63 octetten)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "" +#~ "De printer of klasse is niet toegankelijk voor gemeenschappelijk gebruik!" + +#~ msgid "The printer or class was not found." +#~ msgstr "De printer of klasse kon niet worden gevonden." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Het attribuut &aops;printer-uri&aops; is vereist!" + +#~ msgid "Toner low." +#~ msgstr "Toner is bijna op." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Te veel waarden voor job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Te veel waarden voor printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (oversize)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (oversize)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (klein)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Niet mogelijk om taak toe te voegen voor bestemming \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Niet mogelijk om geheugen toe te wijzen voor bestandstypen!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om 64-bits CUPS-printerstuurprogramma&aops;s te kopiëren (%" +#~ "d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om 64-bits Windows-printerstuurprogramma&aops;s te kopiëren " +#~ "(%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om CUPS-printerstuurprogramma&aops;s te kopiëren (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Niet mogelijk om PPD-bestand te kopiëren - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Niet mogelijk om PPD-bestand te kopiëren!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om Windows 2000-printerstuurprogramma&aops;s te kopiëren (%" +#~ "d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om Windows 9x-printerstuurprogramma&aops;s te kopiëren (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Niet mogelijk om interfacescript te kopiëren - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Niet mogelijk om printer-uri aan te maken!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "" +#~ "Niet mogelijk om cupsd.conf-bestanden van meer dan 1 MB te bewerken!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Bestemming voor taak kon niet worden gevonden!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Printer is niet gevonden!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om Windows 2000-printerstuurprogramma&aops;s te installeren " +#~ "(%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Niet mogelijk om Windows 9x-printerstuurprogramma&aops;s te installeren (%" +#~ "d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Niet mogelijk om document %d in taak %d te openen!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Niet mogelijk om \"%s\" uit te voeren: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Niet mogelijk om commando naar printerstuurprogramma te versturen!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Niet mogelijk om Windows-printerstuurprogramma in te stellen (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Niet mogelijk om verouderd USB-stuurprogramma te gebruiken!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Onbekende printerfout (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Niet-ondersteunde tekenset \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Niet-ondersteunde compressie \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Niet-ondersteund compressie-attribuut %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Niet-ondersteunde indeling \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Niet-ondersteunde indeling '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Niet-ondersteunde indeling '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Gebruik:\n" +#~ "\n" +#~ " lpadmin [-h server] -d bestemming\n" +#~ " lpadmin [-h server] -x bestemming\n" +#~ " lpadmin [-h server] -p printer [-c voeg klasse toe] [-i interface] [-" +#~ "m model]\n" +#~ " [-r verwijder klasse] [-v apparaat] [-D " +#~ "omschrijving]\n" +#~ " [-P ppd-bestand] [-o naam=waarde]\n" +#~ " [-u sta toe:gebruiker,gebruiker] [-u weiger:" +#~ "gebruiker,gebruiker]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Gebruik: %s job user title copies options [bestandsnaam]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Gebruik: %s job-id user title copies options [bestand]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Gebruik: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Gebruik: convert [ opties ]\n" +#~ "\n" +#~ "Opties:\n" +#~ "\n" +#~ " -f bestandsnaam Stel te converteren bestand in (anders stdin)\n" +#~ " -o bestandsnaam Stel te genereren bestand in (anders stdout)\n" +#~ " -i mime/type Stel MIME-type voor invoer in (anders auto-typed)\n" +#~ " -j mime/type Stel MIME-type voor uitvoer in (anders application/" +#~ "pdf)\n" +#~ " -P bestandsnaam.ppd Stel PPD-bestand in\n" +#~ " -a 'naam=waarde ...' Stel optie(s) in\n" +#~ " -U gebruikersnaam Stel gebruikersnaam voor taak in\n" +#~ " -J titel Stel titel in\n" +#~ " -c aantal Stel aantal exemplaren in\n" +#~ " -u Verwijder het PPD-bestand na conversie\n" +#~ " -D Verwijder het invoerbestand na conversie\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Gebruik: cupsaddsmb [opties] printer1 ... printerN\n" +#~ " cupsaddsmb [opties] -a\n" +#~ "\n" +#~ "Opties:\n" +#~ " -E Gebruik encryptie voor verbinding met server\n" +#~ " -H samba-server Gebruik genoemde SAMBA-server\n" +#~ " -U samba-gebruiker Controleer toegang via genoemde SAMBA-gebruiker\n" +#~ " -a Exporteer alle printers\n" +#~ " -h cups-server Gebruik genoemde CUPS-server\n" +#~ " -v Gebruik verbose-modus (toon commando&aops;s)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Gebruik: cupsctl [opties] [param=waarde ... paramN=waardeN]\n" +#~ "\n" +#~ "Opties:\n" +#~ "\n" +#~ " -E Schakel encryptie in\n" +#~ " -U gebruikersnaam Geef gebruikersnaam op\n" +#~ " -h server[:poort] Geef serveradres op\n" +#~ "\n" +#~ " --[no-]debug-logging Schakel debug-logging in/uit\n" +#~ " --[no-]remote-admin Schakel beheer op afstand in/uit\n" +#~ " --[no-]remote-any Maak toegang via het internet mogelijk/" +#~ "onmogelijk\n" +#~ " --[no-]remote-printers Toon/verberg niet-lokale printers\n" +#~ " --[no-]share-printers Schakel gemeenschappelijk printergebruik in/" +#~ "uit\n" +#~ " --[no-]user-cancel-any Maak annuleren van taken door gebruikers " +#~ "mogelijk/onmogelijk\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Gebruik: cupsd [-c config-bestand] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Laad alternatief configuratiebestand\n" +#~ "-f Voer uit op voorgrond\n" +#~ "-F Voer uit op voorgrond, losgekoppeld\n" +#~ "-h Toon dit gebruiksbericht\n" +#~ "-l Voer cupsd uit vanaf launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Gebruik: cupsfilter -m mime/type [ opties ] bestandsnaam\n" +#~ "\n" +#~ "Opties:\n" +#~ "\n" +#~ " -c cupsd.conf Stel in welk cupsd.conf-bestand moet worden gebruikt\n" +#~ " -j taak-ID[,N] Filter bestand N uit opgegeven taak (standaard is " +#~ "bestand 1)\n" +#~ " -n aantal Stel aantal exemplaren in\n" +#~ " -o naam=waarde Stel optie(s) in\n" +#~ " -p bestandsnaam.ppd Stel PPD-bestand in\n" +#~ " -t titel Stel titel in\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Gebruik: cupstestdsc [opties] bestandsnaam.ps [... bestandsnaam.ps]\n" +#~ " cupstestdsc [opties] -\n" +#~ "\n" +#~ "Opties:\n" +#~ "\n" +#~ " -h Toon programmagebruik\n" +#~ "\n" +#~ " Opmerking: dit programma valideert alleen het DSC-commentaar, niet de " +#~ "PostScript-code.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Gebruik: cupstestppd [opties] bestandsnaam1.ppd[.gz] [... bestandsnaamN." +#~ "ppd[.gz]]\n" +#~ " program | cupstestppd [opties] -\n" +#~ "\n" +#~ "Opties:\n" +#~ "\n" +#~ " -R root-directory Stel alternatieve root in\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Toon waarschuwingen in plaats van fouten\n" +#~ " -q Voer uit zonder meldingen\n" +#~ " -r Gebruik &aops;relaxed&aops; open modus\n" +#~ " -v Gebruik beperkte verbose-modus\n" +#~ " -vv Gebruik uitgebreide verbose-modus\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Gebruik: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Gebruik: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o optie[=waarde] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Gebruik: lppasswd [-g groepsnaam]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Gebruik: lppasswd [-g groepsnaam] [gebruikersnaam]\n" +#~ " lppasswd [-g groepsnaam] -a [gebruikersnaam]\n" +#~ " lppasswd [-g groepsnaam] -x [gebruikersnaam]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Gebruik: lpq [-P bestemming] [-U gebruikersnaam] [-h hostnaam[:poort]] [-" +#~ "l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Gebruik: ppdc [opties] bestandsnaam.drv [ ... bestandsnaamN.drv ]\n" +#~ "Opties:\n" +#~ " -D naam=waarde Stel benoemde variabele in op waarde.\n" +#~ " -I include-dir Voeg include-directory toe aan zoekpad.\n" +#~ " -c catalogus.po Laad de opgegeven berichtencatalogus.\n" +#~ " -d uitvoer-dir Geef de uitvoerdirectory op.\n" +#~ " -l taal[,taal,...] Geef de uitvoertaal/-talen (taalversie) op.\n" +#~ " -m Gebruik de ModelName-waarde als bestandsnaam.\n" +#~ " -t Test PPD&aops;s in plaats van ze te genereren.\n" +#~ " -v Gebruik verbose-modus (meer v's voor uitgebreidere " +#~ "modus).\n" +#~ " -z Comprimeer PPD-bestanden met GNU-zip.\n" +#~ " --cr Sluit regels af met CR (Mac OS 9).\n" +#~ " --crlf Sluit regels af met CR + LF (Windows).\n" +#~ " --lf Sluit regels af met LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Gebruik: ppdhtml [opties] bestandsnaam.drv >bestandsnaam.html\n" +#~ " -D naam=waarde Stel benoemde variabele in op waarde.\n" +#~ "Opties:\n" +#~ " -I include-dir Voeg include-directory toe aan zoekpad.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Gebruik: ppdi [opties] bestandsnaam.ppd [ ... bestandsnaamN.ppd ]\n" +#~ "Opties:\n" +#~ " -I include-dir\n" +#~ " -o bestandsnaam.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Gebruik: ppdmerge [opties] bestandsnaam.ppd [ ... bestandsnaamN.ppd ]\n" +#~ "Opties:\n" +#~ " -o bestandsnaam.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Gebruik: ppdpo [opties] -o bestandsnaam.po bestandsnaam.drv [ ... " +#~ "bestandsnaamN.drv ]\n" +#~ "Opties:\n" +#~ " -D naam=waarde Stel benoemde variabele in op waarde.\n" +#~ " -I include-dir Voeg include-directory toe aan zoekpad.\n" +#~ " -v Gebruik verbose-modus (meer v's voor uitgebreidere " +#~ "modus).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Gebruik: snmp [host- of ip-adres]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Alleen de eerste %d gevonden printers worden toegevoegd" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Verwachtte Boolean voor optie &aops;waiteof&aops; \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Kon zijkanaalverzoek niet lezen!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Optie \"%s\" kan niet worden ingevoegd met behulp van " +#~ "IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Printer reageert niet\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Printer heeft onverwacht einde-bestandteken verstuurd\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Niet-lokale host heeft niet binnen %d seconden gereageerd met " +#~ "commandostatusbyte!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Niet-lokale host heeft niet binnen %d seconden gereageerd met " +#~ "besturingsstatusbyte!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Niet-lokale host heeft niet binnen %d seconden gereageerd met " +#~ "gegevensstatusbyte!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: SCSI-commando niet tijdig verwerkt (%d); nieuwe poging...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Dit document beantwoordt niet aan de Adobe Document Structuring " +#~ "Conventions en wordt mogelijk niet goed afgedrukt!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Niet mogelijk om \"%s:%s\" te openen: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Niet mogelijk om PAP-statusverzoek te versturen" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Onverwacht PAP-pakket van type %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Onbekend PAP-pakket van type %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Onbekende keuze \"%s\" voor optie \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Onbekende optie \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Niet-ondersteunde baudsnelheid %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: Verwachtte getal voor statusoptie \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: Herstelbare fout: netwerkhost &aops;%s&aops; is bezig; nieuwe " +#~ "poging over %d seconden...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Let op: geen Windows 2000-printerstuurprogramma&aops;s geïnstalleerd!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4-envelop" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: Gebruik de optie -f om het bestand op te geven dat u wilt " +#~ "converteren.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Geen PPD-bestand voor printer \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "" +#~ "cupsctl: Niet mogelijk om verbinding met server tot stand te brengen: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Onbekende optie \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Onbekende optie \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Verwachtte config-bestandsnaam na optie \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Niet mogelijk om huidige directory op te vragen!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Onbekend argument \"%s\" - bewerking wordt afgebroken!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Onbekende optie \"%c\" - bewerking wordt afgebroken!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: Geen ondersteuning voor launchd(8) opgenomen, bewerking wordt " +#~ "uitgevoerd in normale modus.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Ongeldig documentnummer %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Ongeldige taak-ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: U kunt slechts één bestandsnaam opgeven!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Niet mogelijk om tijdelijk bestand aan te maken: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Niet mogelijk om taakbestand op te vragen - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "" +#~ "cupstestppd: De optie -q kan niet worden gebruikt in combinatie met de " +#~ "optie -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "" +#~ "cupstestppd: De optie -v kan niet worden gebruikt in combinatie met de " +#~ "optie -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "apparaat voor %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "apparaat voor %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\thulpinformatie voor commando&aops;s opvragen\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Job-printer-uri-attribuut ontbreekt!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Klassenaam mag alleen afdrukbare tekens bevatten!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: Verwachtte PPD na optie &aops;-P&aops;!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Verwachtte allow/deny:userlist na optie &aops;-u&aops;!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Verwachtte klasse na optie &aops;-r&aops;!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Verwachtte klassenaam na optie &aops;-c&aops;!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Verwachtte omschrijving na optie &aops;-D&aops;!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Verwachtte apparaat-URI na optie &aops;-v&aops;!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Verwachtte bestandstype(n) na optie &aops;-I&aops;!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Verwachtte hostnaam na optie &aops;-h&aops;!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Verwachtte interface na optie &aops;-i&aops;!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Verwachtte locatie na optie &aops;-L&aops;!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Verwachtte model na optie &aops;-m&aops;!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Verwachtte naam=waarde na optie &aops;-o&aops;!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Verwachtte printer na optie &aops;-p&aops;!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Verwachtte printernaam na optie &aops;-d&aops;!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Verwachtte printer of klasse na optie &aops;-x&aops;!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Geen lidnamen ontdekt!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Printer %s is al lid van klasse %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Printer %s is geen lid van klasse %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Printernaam mag alleen afdrukbare tekens bevatten!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om printer aan klasse toe te voegen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om verbinding tot stand te brengen met server: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Niet mogelijk om tijdelijk bestand aan te maken - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Niet mogelijk om tijdelijk bestand aan te maken: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Niet mogelijk om PPD-bestand \"%s\" te openen - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Niet mogelijk om bestand \"%s\" te openen: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om printer uit klasse te verwijderen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om het PPD-bestand in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om de apparaat-URI in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om het interfacescript of het PPD-bestand in te " +#~ "stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om het interfacescript in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om de printerbeschrijving in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om de printerlocatie in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Niet mogelijk om de printeropties in te stellen:\n" +#~ " U moet eerst een printernaam opgeven!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Onbekende optie voor toestaan/weigeren \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Onbekend argument &aops;%s&aops;!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Onbekende optie &aops;%c&aops;!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Waarschuwing - inhoudstypelijst genegeerd!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo: Verwachtte tekenreeks met 1284-apparaat-ID na --device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Verwachtte taal na --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Verwachtte merk en model na --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Verwachtte producttekenreeks na --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Verwachtte schemalijst na --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Verwachtte schemalijst na --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Verwachtte time-out na --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Onbekend argument &aops;%s&aops;!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Onbekende optie &aops;%c&aops;!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Onbekende optie &aops;%s&aops;!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "" +#~ "lpmove: Niet mogelijk om verbinding met server tot stand te brengen: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Onbekend argument &aops;%s&aops;!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Onbekende optie &aops;%c&aops;!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Geen printers!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Niet mogelijk om printer of instance toe te voegen: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Niet mogelijk om PPD-bestand voor %s op te vragen: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Niet mogelijk om PPD-bestand voor %s te openen!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Onbekende printer of klasse!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Alleen root kan wachtwoorden toevoegen of verwijderen!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Wachtwoordbestand is in gebruik!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Wachtwoordbestand niet bijgewerkt!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Wachtwoord komt helaas niet overeen!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Dit wachtwoord is helaas niet toegestaan.\n" +#~ "Uw wachtwoord moet uit minimaal 6 tekens bestaan, waarvan minimaal één " +#~ "letter en één cijfer, en mag niet uw gebruikersnaam bevatten.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Wachtwoorden komen helaas niet overeen!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Niet mogelijk om wachtwoordreeks te kopiëren: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Niet mogelijk om wachtwoordbestand te openen: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Niet mogelijk om wachtwoordbestand weg te schrijven: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: Kon geen reservekopie maken van oude wachtwoordbestand: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: Kon wachtwoordbestand geen andere naam geven: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: Gebruiker \"%s\" en groep \"%s\" bestaan niet.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: fout - %s niet-bestaande bestemming voor variabelenamen van " +#~ "omgeving \"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "leden van klasse %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "geen onderdelen\n" + +#~ msgid "no system default destination\n" +#~ msgstr "geen bestemming voor systeemstandaard\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events niet gespecificeerd!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" wordt al gebruikt!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" gebruikt onbekend schema!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d niet goed!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Include-directory \"%s\" wordt toegevoegd...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Interfacetekst van %s wordt toegevoegd/bijgewerkt...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Ongeldige Booleaanse waarde (%s) in regel %d van %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldige resolutienaam \"%s\" in regel %d van %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldig statussleutelwoord %s in regel %d van %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Ongeldige variabelevervanging ($%c) in regel %d van %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Keuze gevonden in regel %d van %s zonder optie!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Dubbele #po voor taalversie %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte een filterdefinitie in regel %d van %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte een programmanaam in regel %d van %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Verwachtte Booleaanse waarde in regel %d van %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte tekenset na Font in regel %d van %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Verwachtte keuzecode in regel %d van %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Verwachtte keuzenaam/-tekst in regel %d van %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte kleurvolgorde voor ColorModel in regel %d van %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte kleurruimte voor ColorModel in regel %d van %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte compressie voor ColorModel in regel %d van %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte beperkingenreeks voor UIConstraints in regel %d van %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte sleutelwoord voor stuurprogrammatype na DriverType in " +#~ "regel %d van %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte duplextype na Duplex in regel %d van %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte codering na Font in regel %d van %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte bestandsnaam na #po %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte groepsnaam/-tekst in regel %d van %s!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte include-bestandsnaam in regel %d van %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte geheel getal in regel %d van %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte taalversie na #po in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na FileName in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na Font in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na Manufacturer in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na MediaSize in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na ModelName in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam na PCFileName in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam/tekst na %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam/tekst na Installable in regel %d van %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte naam/tekst na Resolution in regel %d van %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte naam/tekst-combinatie voor ColorModel in regel %d van %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte optienaam/-tekst in regel %d van %s!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte optiesectie in regel %d van %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte optietype in regel %d van %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte override-veld na Resolution in regel %d van %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte reëel getal in regel %d van %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte resolutie/materiaaltype na ColorProfile in regel %d van %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Verwachtte resolutie/materiaaltype na SimpleColorProfile in regel %" +#~ "d van %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte selector na %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte status na Font in regel %d van %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte tekenreeks na Copyright in regel %d van %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte tekenreeks na Version in regel %d van %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte twee optienamen in regel %d van %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte waarde na %s in regel %d van %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Verwachtte versie na Font in regel %d van %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Ongeldige #include/#po-bestandsnaam \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldige kosten voor filter in regel %d van %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldig leeg MIME-type voor filter in regel %d van %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Ongeldige lege programmanaam voor filter in regel %d van %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldige optiesectie \"%s\" in regel %d van %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ongeldig optietype \"%s\" in regel %d van %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Bestand met stuurprogrammagegevens \"%s\" wordt geladen...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Berichten voor taalversie \"%s\" worden geladen...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Berichten worden geladen uit \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif ontbreekt aan einde van \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if ontbreekt in regel %d van %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Geen berichtencatalogus opgegeven voor taalversie %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Optie %s opnieuw gedefinieerd met een ander type in regel %d van %" +#~ "s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Optiebeperking moet *name in regel %d van %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Te veel geneste #if's in regel %d van %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Niet mogelijk om PPD-bestand \"%s\" aan te maken - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Niet mogelijk om uitvoerdirectory %s aan te maken: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Niet mogelijk om uitvoerpipes aan te maken: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Niet mogelijk om cupstestppd uit te voeren: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: #po-bestand %s niet gevonden in regel %d van %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: include-bestand \"%s\" niet gevonden in regel %d van %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: geen lokalisatie gevonden voor \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Niet mogelijk om lokalisatiebestand \"%s\" te laden - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Niet-gedefinieerde variabele (%s) in regel %d van %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Onbekend type stuurprogramma %s in regel %d van %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Onbekend duplextype \"%s\" in regel %d van %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Onbekende materiaalgrootte \"%s\" in regel %d van %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Onbekend token \"%s\" in regel %d van %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Onbekende afsluitende tekens in reëel getal \"%s\" in regel %d van %" +#~ "s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Niet-afgesloten tekenreeks die begint met %c in regel %d van %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: %s wordt weggeschreven...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: PPD-bestanden worden naar directory \"%s\" geschreven...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Ongeldige LanguageVersion \"%s\" in %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: PPD-bestand %s wordt genegeerd...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "" +#~ "ppdmerge: Niet mogelijk om reservekopie van %s te bewaren als %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "printer %s uitgeschakeld sinds %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "printer %s is niet in gebruik. ingeschakeld sinds %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "printer %s is bezig met afdrukken %s-%d. ingeschakeld sinds %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "printer %s/%s uitgeschakeld sinds %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "printer %s/%s is niet in gebruik. ingeschakeld sinds %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "" +#~ "printer %s/%s is bezig met afdrukken %s-%d. ingeschakeld sinds %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "verzoek-ID is %s-%d (%d bestand(en))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "taakplanner is niet actief\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "taakplanner is actief\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\ttoon status van daemon en wachtrij\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "bestemming voor systeemstandaard: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "bestemming voor systeemstandaard: %s/%s\n" diff --git a/locale/cups_no.po b/locale/cups_no.po new file mode 100644 index 0000000..2fe9213 --- /dev/null +++ b/locale/cups_no.po @@ -0,0 +1,8659 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimeter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f til %.0f x %.0f millimeter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f tommer" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f til %.2f x %.2f tommer" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s kan ikke endres." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 tomme/sek" + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 tommer/sek" + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 tommer/sek" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sek" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 tommer/sek" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 tommer/sek" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sek" + +msgid "120x60dpi" +msgstr "120 x 60 dpi" + +msgid "120x72dpi" +msgstr "120 x 72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sek" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sek" + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 tommer/sek" + +msgid "2-Sided Printing" +msgstr "Tosidig utskrift" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 tommer/sek" + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sek" + +msgid "200 mm/sec." +msgstr "200 mm/sek" + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-pinners serie" + +msgid "240x72dpi" +msgstr "240 x 72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sek" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 tommer/sek" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3,5-tommers disk" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5-tommers disk – 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sek" + +msgid "300 mm/sec." +msgstr "300 mm/sek" + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360 x 180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 tommer/sek" + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sek" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 tommer/sek" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 tommer/sek" + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sek" + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 tommer/sek" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 tommer/sek" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sek" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 tommer/sek" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-pinners serie" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Motta jobber" + +msgid "Accepted" +msgstr "Mottatt" + +msgid "Add Class" +msgstr "Legg til klasse" + +msgid "Add Printer" +msgstr "Legg til skriver" + +msgid "Add RSS Subscription" +msgstr "Legg til RSS-abonnement" + +msgid "Address" +msgstr "Adresse" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adresse – 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administrering" + +msgid "Always" +msgstr "Alltid" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applikator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Ugyldig NULL-målpeker" + +msgid "Bad OpenGroup" +msgstr "Ugyldig OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Ugyldig ad OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Ugyldig OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Ugyldig forespørsel" + +msgid "Bad SNMP version number" +msgstr "Ugyldig SNMP-versjonsnummer" + +msgid "Bad UIConstraints" +msgstr "Ugyldig UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Ugyldig kopiverdi %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Ugyldig, tilpasset parameter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Ugyldig number-up-verdi %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Ugyldig page-ranges-verdier %d–%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Bannere" + +msgid "Billing Information: " +msgstr "Faktureringsinformasjon: " + +msgid "Bond Paper" +msgstr "Tykt papir" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL-etikettskriver" + +msgid "Cancel RSS Subscription" +msgstr "Avbryt RSS-abonnement" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Endre innstillinger" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klasser" + +msgid "Clean Print Heads" +msgstr "Rengjør skrivehoder" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Farge" + +msgid "Color Mode" +msgstr "Fargemodus" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Gruppenavn bruker uendelig lengde" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Fortsett" + +msgid "Continuous" +msgstr "Kontinuerlig" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Opprettet" + +msgid "Created On: " +msgstr "Opprettet på: " + +msgid "Custom" +msgstr "Tilpasset" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Klipp" + +msgid "Cutter" +msgstr "Kutter" + +msgid "Dark" +msgstr "Mørk" + +msgid "Darkness" +msgstr "Mørkhet" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Slett klasse" + +msgid "Delete Printer" +msgstr "Slett skriver" + +msgid "Description: " +msgstr "Beskrivelse: " + +msgid "DeskJet Series" +msgstr "DeskJet-serie" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Målet «%s» mottar ikke jobber." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Direkte varme-medium" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Deaktivert" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Drivernavn: " + +msgid "Driver Version: " +msgstr "Driverversjon: " + +msgid "Duplexer" +msgstr "Duplekser" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1-etikettskriver" + +msgid "EPL2 Label Printer" +msgstr "EPL2-etikettskriver" + +msgid "Edit Configuration File" +msgstr "Rediger konfigurasjonsfil" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Sluttbanner" + +msgid "English" +msgstr "Norwegian" + +msgid "Enter old password:" +msgstr "Oppgi det gamle passordet:" + +msgid "Enter password again:" +msgstr "Oppgi passordet igjen:" + +msgid "Enter password:" +msgstr "Oppgi passordet:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Oppgi brukernavnet og passordet ditt eller rotbrukernavnet og -passordet for " +"å få tilgang til denne siden. Hvis du bruker Kerberos-godkjenning, forsikrer " +"du deg om at du har en gyldig Kerberos-billett." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Konvoluttmating" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Feilkriterier" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Hver 10. etikett" + +msgid "Every 2 Labels" +msgstr "Hver 2. etikett" + +msgid "Every 3 Labels" +msgstr "Hver 3. etikett" + +msgid "Every 4 Labels" +msgstr "Hver 4. etikett" + +msgid "Every 5 Labels" +msgstr "Hver 5. etikett" + +msgid "Every 6 Labels" +msgstr "Hver 6. etikett" + +msgid "Every 7 Labels" +msgstr "Hver 7. etikett" + +msgid "Every 8 Labels" +msgstr "Hver 8. etikett" + +msgid "Every 9 Labels" +msgstr "Hver 9. etikett" + +msgid "Every Label" +msgstr "Hver etikett" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Forventning mislyktes" + +msgid "Export Printers to Samba" +msgstr "Eksporter skrivere til Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Filmappe" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Filmappe – 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Forbudt" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Generelt" + +msgid "Generic" +msgstr "Generisk" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU bruker uendelig lengde" + +msgid "Glossy Paper" +msgstr "Glanset papir" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Gråskala" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hengende mappe" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hengende mappe – 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Ulovlig kontrolltegn" + +msgid "Illegal main keyword string" +msgstr "Ulovlig streng for hovednøkkelord" + +msgid "Illegal option keyword string" +msgstr "Ulovlig streng for valgnøkkelord" + +msgid "Illegal translation string" +msgstr "Ulovlig oversettelsesstreng" + +msgid "Illegal whitespace character" +msgstr "Ulovlig mellomromstegn" + +msgid "Installable Options" +msgstr "Installerbare valg" + +msgid "Installed" +msgstr "Installert" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar-etikettskriver" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Intern feil" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2 deler" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2 deler – 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3 deler" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3 deler – 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internett-utskriftsprotokoll" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Jobb nr. %d er allerede kansellert – kan ikke avbryte." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Jobb nr. %d er allerede avbrutt – kan ikke avbryte." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Jobb nr. %d er allerede fullført – kan ikke avbryte." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Jobb fullført" + +msgid "Job Created" +msgstr "Jobb opprettet" + +msgid "Job ID: " +msgstr "Jobb-ID: " + +msgid "Job Options Changed" +msgstr "Jobbvalg endret" + +msgid "Job Stopped" +msgstr "Jobb stoppet" + +msgid "Job UUID: " +msgstr "Jobb-UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "Jobben er fullført og kan ikke endres." + +msgid "Job operation failed:" +msgstr "Jobbhandling mislyktes:" + +msgid "Job state cannot be changed." +msgstr "Jobbstatus kan ikke endres." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Jobber" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-vert eller -skriver" + +msgid "Label Printer" +msgstr "Etikettskriver" + +msgid "Label Top" +msgstr "Etikettopp" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Stor adresse" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Stor adresse – 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet-serie PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Lys" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Linjen er lengre enn det som er tillatt (255 tegn)" + +msgid "List Available Printers" +msgstr "Vis tilgjengelige skrivere" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Plassering: " + +msgid "Long-Edge (Portrait)" +msgstr "Langside (stående)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Merke og modell: " + +msgid "Manual Feed" +msgstr "Manuell mating" + +msgid "Media Dimensions: " +msgstr "Mediestørrelse: " + +msgid "Media Limits: " +msgstr "Mediebegrensninger: " + +msgid "Media Name: " +msgstr "Medienavn: " + +msgid "Media Size" +msgstr "Papirstørrelse" + +msgid "Media Source" +msgstr "Papirkilde" + +msgid "Media Tracking" +msgstr "Mediesporing" + +msgid "Media Type" +msgstr "Papirtype" + +msgid "Medium" +msgstr "Medium" + +msgid "Memory allocation error" +msgstr "Feil med hukommelsestildeling" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "PPD-Adobe-4.x-header mangler" + +msgid "Missing asterisk in column 1" +msgstr "Stjerne mangler i kolonne 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Verdistreng mangler" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Endre klasse" + +msgid "Modify Printer" +msgstr "Endre skriver" + +msgid "Move All Jobs" +msgstr "Flytt alle jobber" + +msgid "Move Job" +msgstr "Flytt jobb" + +msgid "Moved Permanently" +msgstr "Flyttet permanent" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD-filpeker" + +msgid "Name OID uses indefinite length" +msgstr "Navn-OID bruker uendelig lengde" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Aldri" + +msgid "New Stylus Color Series" +msgstr "Ny Stylus Color-serie" + +msgid "New Stylus Photo Series" +msgstr "Ny Stylus Photo-serie" + +msgid "No" +msgstr "Nei" + +msgid "No Content" +msgstr "Uten innhold" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Ingen VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Ingen aktive tilkoblinger" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Ingen gruppenavn" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Ingen mål lagt til." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Ingen error-index" + +msgid "No error-status" +msgstr "Ingen error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Uten navn-OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Ingen request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Fant ingen abonnementer." + +msgid "No variable-bindings SEQUENCE" +msgstr "Ingen variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Uten versjonsnummer" + +msgid "Non-continuous (Mark sensing)" +msgstr "Ikke fortløpende (merkeregistrering)" + +msgid "Non-continuous (Web sensing)" +msgstr "Ikke fortløpende (webregistrering)" + +msgid "Normal" +msgstr "Vanlig" + +msgid "Not Found" +msgstr "Ikke funnet" + +msgid "Not Implemented" +msgstr "Ikke implementert" + +msgid "Not Installed" +msgstr "Ikke installert" + +msgid "Not Modified" +msgstr "Ikke modifisert" + +msgid "Not Supported" +msgstr "Ikke støttet" + +msgid "Not allowed to print." +msgstr "Utskrift ikke tillatt." + +msgid "Note" +msgstr "Merk" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Av (énsidig)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Internett-basert hjelp" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Åpning av %s mislyktes: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup uten CloseGroup først" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI uten CloseUI/JCLCloseUI først" + +msgid "Operation Policy" +msgstr "Handlingskriterier" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Valg installert" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Valg: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Utdatamodus" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL-laserskriver" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Pakken inneholder ikke en Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Pakken begynner ikke med SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Passord for %s på %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Passord for %s kreves for å få tilgang til %s via SAMBA: " + +msgid "Pause Class" +msgstr "Sett klasse på pause" + +msgid "Pause Printer" +msgstr "Sett skriver på pause" + +msgid "Peel-Off" +msgstr "Fjern papir" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Fotoetiketter" + +msgid "Plain Paper" +msgstr "Vanlig papir" + +msgid "Policies" +msgstr "Kriterier" + +msgid "Port Monitor" +msgstr "Portovervåking" + +msgid "PostScript Printer" +msgstr "PostScript-skriver" + +msgid "Postcard" +msgstr "Postkort" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Utskriftstetthet" + +msgid "Print Job:" +msgstr "Utskriftsjobb:" + +msgid "Print Mode" +msgstr "Utskriftsmodus" + +msgid "Print Rate" +msgstr "Utskriftshastighet" + +msgid "Print Self-Test Page" +msgstr "Skriv ut testside" + +msgid "Print Speed" +msgstr "Utskriftshastighet" + +msgid "Print Test Page" +msgstr "Skriv ut testside" + +msgid "Print and Cut" +msgstr "Skriv ut og klipp" + +msgid "Print and Tear" +msgstr "Skriv ut og riv" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Skrevet ut for: " + +msgid "Printed From: " +msgstr "Skrevet ut fra: " + +msgid "Printed On: " +msgstr "Skrevet ut på: " + +msgid "Printer Added" +msgstr "Skriver lagt til" + +msgid "Printer Default" +msgstr "Skriverstandard" + +msgid "Printer Deleted" +msgstr "Skriver slettet" + +msgid "Printer Modified" +msgstr "Skriver endret" + +msgid "Printer Name: " +msgstr "Skrivernavn: " + +msgid "Printer Paused" +msgstr "Skriver satt på pause" + +msgid "Printer Settings" +msgstr "Skriverinnstillinger" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Skriver:" + +msgid "Printers" +msgstr "Skrivere" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Tøm jobber" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Begrensning nådd." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Avslå jobber" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Skriv ut på nytt etter feil" + +msgid "Request Entity Too Large" +msgstr "Forespørselsobjektet er for stort" + +msgid "Resolution" +msgstr "Oppløsning" + +msgid "Resume Class" +msgstr "Fortsett med klasse" + +msgid "Resume Printer" +msgstr "Fortsett med skriver" + +msgid "Return Address" +msgstr "Avsenderadresse" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Avsenderadresse – 3/4 x 2\"" + +msgid "Rewind" +msgstr "Spol tilbake" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE bruker uendelig lengde" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Se andre" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Serieport nr. %d" + +msgid "Server Restarted" +msgstr "Tjener startet på nytt" + +msgid "Server Security Auditing" +msgstr "Sikkerhetsgjennomgang for tjener" + +msgid "Server Started" +msgstr "Tjener startet" + +msgid "Server Stopped" +msgstr "Tjener stoppet" + +msgid "Service Unavailable" +msgstr "Tjeneste ikke tilgjengelig" + +msgid "Set Allowed Users" +msgstr "Angi tillatte brukere" + +msgid "Set As Server Default" +msgstr "Bruk som tjenerstandard" + +msgid "Set Class Options" +msgstr "Angi klassevalg" + +msgid "Set Printer Options" +msgstr "Angi skrivervalg" + +msgid "Set Publishing" +msgstr "Angi publisering" + +msgid "Shipping Address" +msgstr "Leveringsadresse" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Leveringsadresse – 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Kortside (liggende)" + +msgid "Special Paper" +msgstr "Spesialpapir" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Startbanner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Melding" + +msgid "Stylus Color Series" +msgstr "Stylus Color-serie" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo-serie" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Bytter protokoll" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Riv" + +msgid "Tear-Off" +msgstr "Riv av" + +msgid "Tear-Off Adjust Position" +msgstr "Riv av, juster plassering" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Fant ikke PPD-filen «%s»." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Kunne ikke åpne PPD-filen «%s»: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Klassenavnet kan kun inneholde opptil 127 tegn som kan skrives ut, og kan " +"ikke inneholde mellomrom, skråstrek (/) eller firkanttegn (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Notify-lease-duration-attributtet kan ikke brukes med jobbabonnementer." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Skrivernavnet kan kun inneholde opptil 127 tegn som kan skrives ut, og kan " +"ikke inneholde mellomrom, skråstrek (/) eller firkanttegn (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Printer-uri «%s» inneholder ugyldige tegn." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "Printer-uri må ha formatet «ipp://VERTSNAVN/klasser/KLASSENAVN»." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "Printer-uri må ha formatet «ipp://VERTSNAVN/skrivere/SKRIVERNAVN»." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Abonnementsnavnet kan ikke inneholde mellomrom, skråstrek (/), spørsmålstegn " +"(?) eller firkanttegn (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "For mange abonnementer." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Varmeoverføringsmedium" + +msgid "Title: " +msgstr "Tittel: " + +msgid "Too many active jobs." +msgstr "For mange aktive jobber." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Gjennomsiktighet" + +msgid "Tray" +msgstr "Skuff" + +msgid "Tray 1" +msgstr "Skuff 1" + +msgid "Tray 2" +msgstr "Skuff 2" + +msgid "Tray 3" +msgstr "Skuff 3" + +msgid "Tray 4" +msgstr "Skuff 4" + +msgid "URI Too Long" +msgstr "URI for lang" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB-serieport nr. %d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Får ikke tilgang til cupsd.conf-fil:" + +msgid "Unable to add RSS subscription:" +msgstr "Kan ikke legge til RSS-abonnement:" + +msgid "Unable to add class:" +msgstr "Kan ikke legge til klasse:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Kan ikke legge til skriver:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Kan ikke avslutte RSS-abonnement:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Kan ikke endre printer-is-shared-attributt:" + +msgid "Unable to change printer:" +msgstr "Kan ikke endre skriver:" + +msgid "Unable to change server settings:" +msgstr "Kan ikke endre tjenerinnstillinger:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Kan ikke koble til vert" + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Kan ikke opprette midlertidig fil:" + +msgid "Unable to delete class:" +msgstr "Kan ikke slette klasse:" + +msgid "Unable to delete printer:" +msgstr "Kan ikke slette skriver:" + +msgid "Unable to do maintenance command:" +msgstr "Kan ikke utføre vedlikeholdskommando:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Kan ikke hente klasseliste:" + +msgid "Unable to get class status:" +msgstr "Kan ikke hente klassestatus:" + +msgid "Unable to get list of printer drivers:" +msgstr "Kan ikke hente liste over skriverdrivere:" + +msgid "Unable to get printer attributes:" +msgstr "Kan ikke hente skriverattributter:" + +msgid "Unable to get printer list:" +msgstr "Kan ikke hente skriverliste:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Kan ikke hente skriverstatus:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Kan ikke endre klasse:" + +msgid "Unable to modify printer:" +msgstr "Kan ikke endre skriver:" + +msgid "Unable to move job" +msgstr "Kan ikke flytte jobb" + +msgid "Unable to move jobs" +msgstr "Kan ikke flytte jobber" + +msgid "Unable to open PPD file" +msgstr "Kan ikke åpne PPD-fil" + +msgid "Unable to open PPD file:" +msgstr "Kan ikke åpne PPD-fil:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Kan ikke åpne cupsd.conf-fil:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Kan ikke skrive ut testside:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Kan ikke angi valg:" + +msgid "Unable to set server default:" +msgstr "Kan ikke angi tjenerstandard:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Kan ikke laste opp cupsd.conf-fil:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Uautorisert" + +msgid "Units" +msgstr "Enheter" + +msgid "Unknown" +msgstr "Ukjent" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Ukjent printer-error-policy «%s»." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Ukjent printer-op-policy «%s»." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Verditypen støttes ikke" + +msgid "Upgrade Required" +msgstr "Oppgradering kreves" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Verdi bruker uendelig lengde" + +msgid "VarBind uses indefinite length" +msgstr "VarBind bruker uendelig lengde" + +msgid "Version uses indefinite length" +msgstr "Versjon bruker uendelig lengde" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ja" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Du må få tilgang til denne siden ved hjelp av URLen https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL-etikettskriver" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "kansellert" + +msgid "canceled" +msgstr "avbrutt" + +msgid "completed" +msgstr "fullført" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced ble ikke utført." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd ble ikke utført." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index bruker uendelig lengde" + +msgid "error-status uses indefinite length" +msgstr "error-status bruker uendelig lengde" + +msgid "held" +msgstr "holdt" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inaktiv" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "ventende" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "behandler" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id bruker uendelig lengde" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "status for %s mislyktes: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "stoppet" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "ukjent" + +msgid "untitled" +msgstr "uten navn" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings bruker uendelig lengde" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(alle)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(ingen)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d oppføringer\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tEtter feil: fortsett\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tVarsling:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tKrever banner\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tTegnsettsamlinger:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tTilkobling: direkte\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tTilkobling: ekstern\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tStandard sidestørrelse:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tStandard avstand:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tStandard portinnstillinger:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tBeskrivelse: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tAktivert skjema:\n" +#~ "\tInnholdstyper: alle\n" +#~ "\tSkrivertyper: ukjent\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tTillatte skjemaer:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tGrensesnitt: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tGrensesnitt: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tGrensesnitt: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tPlassering: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tVed feil: ingen varsling\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tBrukere tillatt:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tBrukere avslått:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemon til stede\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tingen oppføringer\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tskriver er på enhet «%s», hastighet -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tutskrift er deaktivert\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tutskrift er aktivert\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\ti kø for %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tutskriftskø er deaktivert\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tutskriftskø er aktivert\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tukjent grunn\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " DETALJERTE RESULTATER FRA SAMSVARSTEST\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Side 15, del 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Side 15, del 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Side 19, del 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Side 20, del 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Side 27, del 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Side 42, del 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Sider 16–17, del 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Sider 42–45, del 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Sider 45–46, del 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Sider 48–49, del 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Sider 52–54, del 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN «%s %s» er i strid med «%s %s»\n" +#~ " (constraint=«%s %s %s %s»)\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s har ingen relaterte valg!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s har samme prefiks som %s\n" +#~ " REF: Side 15, del 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Standardinnstillinger stemmer ikke overens!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Det er mulig at dupleksvalgnøkkelordet %s ikke fungerer " +#~ "som forventet og skal ha navnet Duplex!\n" +#~ " REF: Side 122, del 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr " WARN Filen inneholder CR-, LF- og CR LF-linjeskift!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding kreves av PPD 4.3-spesifikasjonen.\n" +#~ " REF: Sider 56–57, del 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Linjen %d inneholder kun mellomrom!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Manufacturer kreves av PPD 4.3-spesifikasjonen.\n" +#~ " REF: Sider 58–59, del 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN APDialogExtension-filen «%s» mangler\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN APPrinterIconPath-filen «%s» mangler\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN PPD-filer som ikke er i Windows-format, bør kun bruke " +#~ "linjeskift med LF, ikke CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Foreldet PPD-versjon %.1f!\n" +#~ " REF: Side 42, del 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName er lengre enn 8.3, noe som er et brudd på PPD-" +#~ "spesifikasjonen.\n" +#~ " REF: Sider 61–62, del 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokoller inneholder PJL, men JCL-attributter er ikke " +#~ "angitt.\n" +#~ " REF: Sider 78–79, del 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protokoller inneholder både PJL og BCP. Forventet TBCP.\n" +#~ " REF: Sider 78–79, del 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName kreves av PPD 4.3-spesifikasjonen.\n" +#~ " REF: Sider 64–65, del 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s finnes ikke!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Ugyldig %s-valg %s!\n" +#~ " REF: Side 122, del 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s Ugyldig UTF-8 «%s»-oversettelsesstreng for valget %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ugyldig UTF-8 «%s»-oversettelsesstreng for valget %s, " +#~ "innstillingen %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsFilter-verdi «%s»!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Ugyldig cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsPreFilter-verdi «%s»!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Ugyldig cupsUIConstraints %s: «%s»!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Ugyldig språk «%s»!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Tom cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s «%s»-oversettelsesstreng for valget %s mangler!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s «%s»-oversettelsesstreng for valget %s, innstillingen %s " +#~ "mangler!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Valget *%s %s i UIConstraints «*%s %s *%s %s» mangler!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Valget *%s %s i cupsUIConstraints %s mangler: «%s»!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s cupsFilter-filen «%s» mangler\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s cupsICCProfile-filen «%s» mangler!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s cupsPreFilter-filen «%s» mangler\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver %s mangler!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Valget %s i UIConstraints «*%s %s *%s %s» mangler!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Valget %s i cupsUIConstraints %s mangler: «%s»!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Filen inneholder ingen grunnoversettelse «%s»!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s OBLIGATORISK %s definerer ikke innstillingen Ingen!\n" +#~ " REF: Side 122, del 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s-hashverdi er i konflikt med %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s forårsaker en sløyfe!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEIL** Den eneste forskjellen mellom %s-valgnavnene %s og %s er " +#~ "store og små bokstaver!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FEIL** %s må være 1284DeviceID!\n" +#~ " REF: Side 72, del 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG Default%s %s\n" +#~ " REF: Side 40, del 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG DefaultImageableArea %s!\n" +#~ " REF: Side 102, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG DefaultPaperDimension %s!\n" +#~ " REF: Side 103, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG JobPatchFile-attributt i fil\n" +#~ " REF: Side 24, del 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG Manufacturer (skal være «HP»)\n" +#~ " REF: Side 211, tabell D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG Manufacturer (skal være «Oki»)\n" +#~ " REF: Side 211, tabell D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG ModelName – «%c» er ikke tillatt i strengen.\n" +#~ " REF: Sider 59–60, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG PSVersion – er ikke «(string) int».\n" +#~ " REF: Sider 62–64, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG Product – er ikke «(string)».\n" +#~ " REF: Side 62, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** UGYLDIG ShortNickName – mer enn 31 tegn.\n" +#~ " REF: Sider 64–65, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FEIL** Ugyldig %s-valg %s!\n" +#~ " REF: Side 84, del 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** Ugyldig FileVersion «%s»\n" +#~ " REF: Side 56, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** Ugyldig FormatVersion «%s»\n" +#~ " REF: Side 56, del 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **FEIL** Ugyldig LanguageEncoding %s – må være ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FEIL** Ugyldig LanguageVersion %s – må være English!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **FEIL** Kan ikke tolke standard valgkode: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FEIL** Standard oversettelsesstreng for valget %s, innstillingen " +#~ "%s inneholder 8-bitstegn!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FEIL** Standard oversettelsesstreng for valget %s inneholder 8-" +#~ "bitstegn!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEIL** Den eneste forskjellen mellom gruppenavnene %s og %s er " +#~ "store og små bokstaver!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FEIL** Flere forekomster av %s-valgnavnet %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEIL** Den eneste forskjellen mellom valgnavnene %s og %s er " +#~ "store og små bokstaver!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK Default%s\n" +#~ " REF: Side 40, del 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK DefaultImageableArea\n" +#~ " REF: Side 102, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK DefaultPaperDimension\n" +#~ " REF: Side 103, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK FileVersion\n" +#~ " REF: Side 56, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK FormatVersion\n" +#~ " REF: Side 56, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK ImageableArea for PageSize %s\n" +#~ " REF: Side 41, del 5.\n" +#~ " REF: Side 102, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK LanguageEncoding\n" +#~ " REF: Sider 56–57, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK LanguageVersion\n" +#~ " REF: Sider 57–58, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK Manufacturer\n" +#~ " REF: Sider 58–59, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK ModelName\n" +#~ " REF: Sider 59–60, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK NickName\n" +#~ " REF: Side 60, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PCFileName\n" +#~ " REF: Sider 61–62, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PSVersion\n" +#~ " REF: Sider 62–64, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PageRegion\n" +#~ " REF: Side 100, del 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PageSize\n" +#~ " REF: Side 41, del 5.\n" +#~ " REF: Side 99, del 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PageSize\n" +#~ " REF: Sider 99–100, del 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK PaperDimension for PageSize %s\n" +#~ " REF: Side 41, del 5.\n" +#~ " REF: Side 103, del 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK Product\n" +#~ " REF: Side 62, del 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEIL** OBLIGATORISK ShortNickName\n" +#~ " REF: Sider 64–65, del 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " FANT %d FEIL\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Ugyldig %%%%BoundingBox: på linje %d!\n" +#~ " REF: Side 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Ugyldig %%%%Page: på linje %d!\n" +#~ " REF: Side 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Ugyldig %%%%Pages: på linje %d!\n" +#~ " REF: Side 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Linje %d inneholder mer enn 255 tegn (%d)!\n" +#~ " REF: Side 25, Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 mangler på første linje!\n" +#~ " REF: Side 17, 3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " %%EndComments-kommentar mangler!\n" +#~ " REF: Side 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox:-kommentar mangler eller er ugyldig!\n" +#~ " REF: Side 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page-kommentarer mangler eller er ugyldig!\n" +#~ " REF: Side 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages-kommentar mangler eller er ugyldig!\n" +#~ " REF: Side 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " FANT INGEN FEIL\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Fant %d linjer som er lengre enn 255 tegn!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " For mange %%BeginDocument-kommentarer!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " For mange %%EndDocument-kommentarer!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Advarsel: filen inneholder binærdata!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Advarsel: ingen %%EndComments-kommentar i fil!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Advarsel: foreldet DSC-versjon %.1f i fil!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FEIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FEIL\n" +#~ " **FEIL** Kan ikke åpne PPD-fil – %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FEIL\n" +#~ " **FEIL** Kan ikke åpne PPD-fil – %s på linje %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10-konvolutt" + +#~ msgid "#11 Envelope" +#~ msgstr "#11-konvolutt" + +#~ msgid "#12 Envelope" +#~ msgstr "#12-konvolutt" + +#~ msgid "#14 Envelope" +#~ msgstr "#14-konvolutt" + +#~ msgid "#9 Envelope" +#~ msgstr "#9-konvolutt" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s mottar forespørsler siden %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s er ikke implementert av CUPS-versjonen av lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s er ikke klar\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s er klar\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s er klar og skriver ut\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s mottar ikke forespørsler siden %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s støttes ikke!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s mottar forespørsler siden %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s mottar ikke forespørsler siden %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [jobb %d lokal vert]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s mislyktes: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Vet ikke hva som skal gjøres!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: Feil – %s-miljøvariabel oppgir målet «%s» som ikke eksisterer!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Feil – ugyldig jobb-ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "%s: Feil – kan ikke skrive ut filer og endre jobber samtidig!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Feil – kan ikke skrive ut fra stdin hvis det er oppgitt filer eller " +#~ "en jobb-ID!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Feil – forventet tegnsett etter «-S»-valg!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Feil – forventet innholdstype etter «-T»-valg!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Feil – forventet eksemplarer etter «-n»-valg!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Feil – forventet antall eksemplarer etter «-#»-valg!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Feil – forventet mål etter «-P»-valg!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Feil – forventet mål etter «-b»-valg!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Feil – forventet mål etter «-d»-valg!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Feil – forventet skjema etter «-f»-valg!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Feil – forventet holdnavn etter «-H»-valg!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Feil – forventet vertsnavn etter «-H»-valg!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Feil – forventet vertsnavn etter «-h»-valg!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Feil – forventet modusliste etter «-y»-valg!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Feil – forventet navn etter «%c»-valg!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Feil – forventet valgstreng etter «-o»-valg!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Feil – forventet sideliste etter «-P»-valg!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Feil – forventet prioritet etter «%c»-valg!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Feil – forventet begrunnelsestekst etter «-r»-valg!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Feil – forventet tittel etter «-t»-valg!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Feil – forventet brukernavn etter «-U»-valg!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Feil – forventet brukernavn etter «-u»-valg!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Feil – forventet verdi etter «%c»-valg!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Feil – trenger «completed», «not-completed» eller «all» etter «-W»-valg!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Feil – ingen standardmål tilgjengelig.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Feil – prioritet må være mellom 1 og 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Feil – planlegger svarer ikke!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Feil – for mange filer – «%s»\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Feil – får ikke tilgang til «%s» – %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Feil – kan ikke legge i kø fra stdin – %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Feil – ukjent mål «%s»!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Feil – ukjent mål «%s/%s»!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Feil – ukjent valg «%c»!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Feil – ukjent valg «%s»!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Forventet jobb-ID etter «-i»-valg!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filteret «%s» er ikke tilgjengelig: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Ugyldig målnavn i liste «%s»!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Ugyldig filterstreng «%s»\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Trenger jobb-ID («-i jobid») før «-H restart»!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Mangler filter for å konvertere fra %s/%s til %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Handling mislyktes: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Støtte for kryptering er ikke kompilert inn!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Kan ikke koble til tjener\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Får ikke kontakt med tjener!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Kan ikke bestemme MIME-typen til «%s»!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Kan ikke åpne %s – %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Kan ikke åpne %s – %s på linje %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Kan ikke åpne %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Kan ikke åpne PDF-fil: %s på linje %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Kan ikke lese MIME-database fra «%s» eller «%s»!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Ukjent mål «%s»!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Ukjent MIME-type for mål %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Ukjent valg «%c»!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Ukjent kilde-MIME-type for mål %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Advarsel «%c»-formatmodifikator støttes ikke – det er mulig at utdata " +#~ "ikke er korrekt!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Advarsel – ignorerte tegnsettvalg!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Advarsel – ignorerte innholdstypevalg!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Advarsel – ignorerte skjemavalg!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Advarsel – ignorerte modusvalg!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: feil – %s-miljøvariabel oppgir målet «%s» som ikke eksisterer!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: feil – forventet option=value etter «-o»-valg!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: feil – ingen standardmål tilgjengelig.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI gråskala" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Ugyldig hjelpekommando ukjent\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Et Samba-passord kreves for å eksportere skriverdrivere!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Et Samba-brukernavn kreves for å eksportere skriverdrivere!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Det finnes allerede en klasse med navnet «%s»!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Det finnes allerede en skriver med navnet «%s»!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (overdimensjonert)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (overdimensjonert)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (lite)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (overdimensjonert)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Prøv å sette %s printer-state til den ugyldige verdien %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Attributtgrupper er ikke i rekkefølge (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Ugyldig device-URI «%s»!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Ugyldig device-uri «%s»!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Ugyldig device-uri-oppsett «%s»!\n" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Ugyldig document-format «%s»!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Ugyldig filnavnbuffer!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Ugyldig fontattributt: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Ugyldig job-priority-verdi!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Ugyldig job-sheets-verdi «%s»!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Ugyldig job-sheets-verditype!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Ugyldig job-state-verdi!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Ugyldig job-uri-attributt «%s»!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Ugyldig notify-pull-method «%s»!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Ugyldig notify-recipient-uri-URI «%s»!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Ugyldig valg og alternativ på linje %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Ugyldig port-monitor «%s»!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Ugyldig printer-state-verdi %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Ugyldig versjonsnummer for forespørsel %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Ugyldig abonnements-ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0-konvolutt" + +#~ msgid "C1 Envelope" +#~ msgstr "C1-konvolutt" + +#~ msgid "C2 Envelope" +#~ msgstr "C2-konvolutt" + +#~ msgid "C3 Envelope" +#~ msgstr "C3-konvolutt" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4-konvolutt" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5-konvolutt" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6-konvolutt" + +#~ msgid "C65 Envelope" +#~ msgstr "C65-konvolutt" + +#~ msgid "C7 Envelope" +#~ msgstr "C7-konvolutt" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Tegnsett «%s» støttes ikke!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3-konvolutt" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4-konvolutt" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Kommandoer kan være forkortet. Kommandoer er :\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Kunne ikke skanne type «%s»!" + +#~ msgid "Cover open." +#~ msgstr "Deksel åpent." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL-konvolutt" + +#~ msgid "Developer almost empty." +#~ msgstr "Fremkaller nesten tom." + +#~ msgid "Developer empty!" +#~ msgstr "Fremkaller tom!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Enhet: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Fant ikke dokumentet %d i jobben %d." + +#~ msgid "Door open." +#~ msgstr "Dør åpen." + +#~ msgid "Double Postcard" +#~ msgstr "Dobbelt postkort" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Kan ikke tildele hukommelse for sideinfo: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Kan ikke tildele hukommelse for sidesett: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Fant ugyldig %%BoundingBox:-kommentar!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Ugyldig %%IncludeFeature:-kommentar!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Ugyldig %%Page:-kommentar i fil!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Ugyldig %%PageBoundingBox:-kommentar i fil!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Ugyldig SCSI-enhetsfil «%s»!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Ugyldig tegnsettfil %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Ugyldig tegnsettype %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Ugyldig kolonneverdi %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Ugyldig cpi-verdi %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Ugyldig fontbeskrivelseslinje: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Ugyldig lpi-verdi %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Ugyldig sideoppsett!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Ugyldig tekstretning %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Ugyldig tekstbredde %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Målskriver finnes ikke!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Fant duplisert %%BoundingBox:-kommentar!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Fant duplisert %%Pages:-kommentar!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Tom utskriftsfil!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Feil %d ved sending av PAPSendData-forespørsel: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: Forventet streng i anførselstegn på linje %d av %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Kritisk USB-feil!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "ERROR: Fant ugyldig HP-GL/2-kommando, kan ikke skrive ut fil!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog mangler!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup mangler!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Mangler enhets-URI på kommandolinje, og ingen DEVICE_URI-" +#~ "miljøvariabel!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Mangler verdi på linje %d i bannerfil!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Krever en msgid-linje før oversettelsesstreng på linje %d av %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Ingen %%BoundingBox:-kommentar i header!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Ingen %%Pages:-kommentar i header!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Fant ingen enhets-URI i argv[0] eller i DEVICE_URI-miljøvariabel!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Ingen fonter i tegnsettfil %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Fant ingen sider!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Tom for papir!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER-miljøvariabel er ikke definert!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Utskriftsfil ble ikke akseptert (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Skriver svarer ikke\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Skriver svarer ikke!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Skriver sendte uventet EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Ekstern vert godtok ikke kontrollfil (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Ekstern vert godtok ikke datafil (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Det oppsto en tidsavbruddfeil under sending av data til skriveren\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Kan ikke legge til filen %d i jobb: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Kan ikke avbryte jobb %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Kan ikke kopiere PDF-fil" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Kan ikke opprette socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: Kan ikke opprette midlertidig, komprimert utskriftsfil: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Kan ikke opprette midlertidig fil" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Kan ikke opprette midlertidig fil – %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Kan ikke opprette midlertidig fil: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke utføre pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Kan ikke utføre gs-program" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Kan ikke utføre pdftops-program" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke forgrene pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Kan ikke hente PAP-forespørsel" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Kan ikke hente PAP-svar" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: Kan ikke hente PPD-fil for skriveren «%s» – %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Kan ikke hente standard AppleTalk-sone" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Kan ikke hente %d-attributter for jobb (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Kan ikke hente skriverstatus (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Finner ikke skriveren «%s»!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Kan ikke søke etter PAP-svar" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Kan ikke søke etter AppleTalk-skrivere" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Kan ikke lage AppleTalk-adresse" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åpne «%s» – %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Kan ikke åpne %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åpne bannerfilen «%s» – %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åpne enhetsfilen «%s»: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Kan ikke åpne filen «%s» – %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åpne filen «%s»: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Kan ikke åpne bildefil for utskrift!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke åpne utskriftsfilen «%s»: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Kan ikke åpne utskriftsfilen %s – %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Kan ikke åpne utskriftsfilen %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Kan ikke åpne midlertidig, komprimert utskriftsfil: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Kan ikke åpne midlertidig fil" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Kan ikke skrive ut %d tekstkolonner!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Kan ikke skrive ut %d x %d tekstside!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Kan ikke lese utskriftsdata" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Kan ikke lese utskriftsdata!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Kan ikke reservere port" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Kan ikke søke for å forskyve %ld i fil – %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Kan ikke søke for å forskyve %lld i fil – %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Kan ikke sende LPD-kommando" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Kan ikke sende PAP-tickleforespørsel" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Kan ikke sende innledende PAP-forespørsel om sending av data" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Kan ikke sende utskriftsdata (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Kan ikke sende utskriftsdata!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Kan ikke sende utskriftsfil til skriver" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Kan ikke sende «trailing nul» til skriver" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Kan ikke vente på pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Kan ikke skrive %d byte til «%s»: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Kan ikke skrive %d byte til skriver!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Kan ikke skrive kontrollfil" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Kan ikke skrive utskriftsdata" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Kan ikke skrive utskriftsdata: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Kan ikke skrive rasterdata til driver!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Kan ikke skrive til midlertidig fil " + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: Kan ikke skrive ukomprimert dokumentdata: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Uventet tekst på linje %d av %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Ukjent krypteringsvalgverdi «%s»!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Ukjent filrekkefølge «%s»\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Ukjent formattegn «%c»\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Ukjent meldingskatalogformat for «%s»!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Ukjent valg «%s» med verdien «%s»!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Ukjent utskriftsmodus «%s»\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Ukjent versjonsvalgverdi «%s»!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: Lysstyrkeverdien %s støttes ikke, bruker brightness=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Gammaverdien %s støttes ikke, bruker gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Number-up-verdien %d støttes ikke, bruker number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Number-up-layout-verdien %s støttes ikke, bruker number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Page-border-verdien %s støttes ikke, bruker page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: fant doc_printf-overflyt (%d byte), avbryter!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-filter krasjet på signal %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-filter avsluttet med statusen %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops avsluttet på signalet %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops avsluttet med statusen %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: gjenopprettbar: Kan ikke koble til skriver. Prøver på nytt om 30 " +#~ "sekunder...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() mislyktes" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: kan ikke statte utskriftsfilen" + +#~ msgid "Empty PPD file!" +#~ msgstr "Tom PPD-fil!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Feil: krever vertsnavn etter «-h»-valg!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FEIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Enhets-URIer for filer er deaktivert! Hvis du vil aktivere funksjonen, " +#~ "leser du FileDevice-direktivet i «%s/cupsd.conf»." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Fikseringsenhetens temperatur er høy!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Fikseringsenhetens temperatur er lav!" + +#~ msgid "German FanFold" +#~ msgstr "Tysk FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "Tysk FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Fikk et printer-uri-attributt, men ingen jobb-ID!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk deaktivert i Systemvalg\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk deaktivert i Systemvalg.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Avbryter utskriftsjobb...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Koblet til skriver...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Kobler til skriver...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Kontrollfil sendt\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Datafil sendt\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Formaterer side %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Laster inn bildefil...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Søker etter skriver...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Åpner forbindelse\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Utskriftsfil sendt, venter på at skriveren skal bli ferdig...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Skriveren er opptatt. Prøver på nytt om 10 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Skriveren er opptatt. Prøver på nytt om 30 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Skriveren er opptatt. Prøver på nytt om 5 sekunder...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: Skriveren støtter ikke IPP/%d.%d, prøver IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Skriveren er opptatt. Prøver på nytt om 5 sekunder...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Skriveren er ikke tilgjengelig.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Skriveren er ikke tilgjengelig.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Skriveren er tilgjengelig.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Skriveren er ikke tilgjengelig.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Skriveren er ikke tilgjengelig. Prøver på nytt om 30 sekunder...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Skriver ut side %d, %d%% fullført...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Skriver ut side %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Klar til utskrift.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Sender kontrollfil (%lu byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Sender kontrollfil (%u byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Sender data\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Sender datafil (%ld byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Sender datafil (%lld byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Sender utskriftsdata...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Utskriftsfil sendt, %ld byte...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Utskriftsfil sendt, %lld byte...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Legger LPR-jobb i utskriftskø, %.0f%% fullført...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Får ikke kontakt med skriver, legger i kø på neste skriver i " +#~ "klassen...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Bruker standard AppleTalk-sone «%s»\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Venter på at jobben skal bli ferdig...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Venter på at skriveren skal bli tilgjengelig...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4-konvolutt" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (overdimensjonert)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5-konvolutt" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6-konvolutt" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Blekk/toner nesten tom." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Blekk/toner tom!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Avfallsbeholder for blekk/toner nesten full." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Avfallsbeholder for blekk/toner full!" + +#~ msgid "Interlock open." +#~ msgstr "Sikkerhetsenhet åpen." + +#~ msgid "Invite Envelope" +#~ msgstr "Invitasjonskonvolutt" + +#~ msgid "Italian Envelope" +#~ msgstr "Italiensk konvolutt" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Kan ikke starte jobb nr. %d på nytt – ingen filer!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Jobb nr. %d finnes ikke!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Jobb nr. %d er fullført og kan ikke endres!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Jobb nr. %d er ikke fullført!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Jobb nr. %d holdes ikke for godkjenning!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Jobb nr. %d holdes ikke!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Jobben #%s finnes ikke!" + +#~ msgid "Job %d not found!" +#~ msgstr "Fant ikke jobben %d!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Jobbabonnementer kan ikke fornyes!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2-konvolutt" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3-konvolutt" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Språket «%s» støttes ikke!" + +#~ msgid "Media jam!" +#~ msgstr "Papirstopp!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Arkskuff nesten tom." + +#~ msgid "Media tray empty!" +#~ msgstr "Arkskuff tom!" + +#~ msgid "Media tray missing!" +#~ msgstr "Arkskuff mangler!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Arkskuffen må fylles." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "document-number-attributt mangler!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Dobbelt anførselstegn mangler på linje %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Skjemavariabel mangler!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Notify-subscription-ids-attributt mangler!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Requesting-user-name-attributt mangler!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Nødvendige attributter mangler!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Verdi mangler på linje %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modell: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch-konvolutt" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Utskriftsfil godtatt – jobb-ID %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Utskriftsfil godtatt – jobb-ID ukjent.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Uten PPD-navn!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Ingen Windows-skriverdrivere er installert!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Ingen aktive jobber på %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Ingen attributter i forespørsel!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Ingen godkjenningsinformasjon oppgitt!" + +#~ msgid "No default printer" +#~ msgstr "Ingen standardskriver" + +#~ msgid "No file!?!" +#~ msgstr "Ingen fil!?!" + +#~ msgid "No modification time!" +#~ msgstr "Uten endringstidspunkt!" + +#~ msgid "No printer name!" +#~ msgstr "Ingen skrivernavn!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Fant ikke printer-uri for klasse!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Fant ikke printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Ingen printer-uri i forespørsel!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Ingen abonnementsattributter i forespørsel!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC er nesten oppbrukt." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC oppbrukt!" + +#~ msgid "Out of toner!" +#~ msgstr "Tomt for toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Ut-beholder nesten full." + +#~ msgid "Output bin full!" +#~ msgstr "Ut-beholder full!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Utdata for skriveren %s er sendt til %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Utdata for skriveren %s er sendt til den eksterne skriveren %s på %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Utdata for skriveren %s/%s er sendt til %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Utdata for skriveren %s/%s er sendt til den eksterne skriveren %s på %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Utmatingsbrett mangler!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1-konvolutt" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10-konvolutt" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2-konvolutt" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3-konvolutt" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (overdimensjonert)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4-konvolutt" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5-konvolutt" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6-konvolutt" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7-konvolutt" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8-konvolutt" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9-konvolutt" + +#~ msgid "Personal Envelope" +#~ msgstr "Personlig konvolutt" + +#~ msgid "Printer offline." +#~ msgstr "Skriver ikke tilgjengelig." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Rangering Eier Jobb Fil(er) Samlet " +#~ "størrelse\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Rangering Eier Prioritet Jobb Filer " +#~ "Samlet størrelse\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Utfører kommando: %s %s -N -A %s -c «%s»\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI-skriver" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (overdimensjonert)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Notify-user-data-verdien er for stor (%d > 63 oktetter)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Skriveren eller klassen er ikke delt!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Fant ikke skriveren eller klassen." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Printer-uri-attributtet kreves!" + +#~ msgid "Toner low." +#~ msgstr "Lite toner." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "For mange job-sheets-verdier (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "For mange printer-state-reasons-verdier (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (overdimensjonert)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (overdimensjonert)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (lite)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Kan ikke legge til jobb for målet «%s»!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Kan ikke tildele hukommelse for filtyper!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere 64-bits CUPS-skriverdriverfiler (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere 64-bits Windows-skriverdriverfiler (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere CUPS-skriverdriverfiler (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Kan ikke kopiere PPD-fil – %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Kan ikke kopiere PPD-fil!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere Windows 2000-skriverdriverfiler (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Kan ikke kopiere Windows 9x-skriverdriverfiler (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Kan ikke kopiere grensesnittsprosedyre – %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Kan ikke opprette printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Kan ikke redigere cupsd.conf-filer som er større enn 1 MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Finner ikke mål for jobb!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Finner ikke skriver!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Kan ikke installere Windows 2000-skriverdriverfiler (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Kan ikke installere Windows 9x-skriverdriverfiler (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Kan ikke åpne dokumentet %d i jobben %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Kan ikke starte «%s»: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Kan ikke sende kommando til skriverdriver!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Kan ikke angi Windows-skriverdriver (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Kan ikke bruke eldre driver for USB-klasse!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Ukjent skriverfeil (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Tegnsettet «%s» støttes ikke!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Komprimeringen «%s» støttes ikke!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Komprimeringsattributtet %s støttes ikke!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Formatet «%s» støttes ikke!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Formatet «%s» støttes ikke!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Formatet «%s/%s» støttes ikke!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Bruk:\n" +#~ "\n" +#~ " lpadmin [-h tjener] -d mål\n" +#~ " lpadmin [-h tjener] -x mål\n" +#~ " lpadmin [-h tjener] -p skriver [-c legg til klasse] [-i grensesnitt] " +#~ "[-m modell]\n" +#~ " [-r fjern klasse] [-v enhet] [-D beskrivelse]\n" +#~ " [-P ppd-fil] [-o navn=verdi]\n" +#~ " [-u tillat:bruker,bruker] [-u avslå:bruker," +#~ "bruker]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Bruk: %s jobb-id bruker tittel kopier valg [filnavn]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Bruk: %s jobb-id bruker tittel kopier valg [fil]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Bruk: %s jobb-id bruker tittel kopier valg fil\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Bruk: konverter [ valg ]\n" +#~ "\n" +#~ "Valg:\n" +#~ "\n" +#~ " -f filnavn Angi at fil skal konverteres (stdin hvis ikke)\n" +#~ " -o filnavn Angi at fil skal genereres (stdout hvis ikke)\n" +#~ " -i mime/type Angi MIME-type for inndata (auto-typed hvis ikke)\n" +#~ " -j mime/type Angi MIME-type for utdata (application/pdf hvis " +#~ "ikke)\n" +#~ " -P filename.ppd Angi PPD-fil\n" +#~ " -a 'navn=verdi ...' Angi valg\n" +#~ " -U brukernavn Angi brukernavn for jobb\n" +#~ " -J tittel Angi tittel\n" +#~ " -c eksemplarer Angi antall eksemplarer\n" +#~ " -u Fjern PPD-fil når ferdig\n" +#~ " -D Fjern inndatafil når ferdig\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Bruk: cupsaddsmb [valg] printer1 ... printerN\n" +#~ " cupsaddsmb [valg] -a\n" +#~ "\n" +#~ "Valg:\n" +#~ " -E Krypter forbindelsen til tjeneren\n" +#~ " -H samba-tjener Bruk den angitte SAMBA-tjeneren\n" +#~ " -U samba-bruker Godkjenn ved hjelp av den angitte SAMBA-brukeren\n" +#~ " -a Eksporter alle skrivere\n" +#~ " -h cups-tjener Bruk den angitte CUPS-tjeneren\n" +#~ " -v Vær detaljert (vis kommandoer)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Bruk: cupsctl [valg] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Valg:\n" +#~ "\n" +#~ " -E Aktiver kryptering\n" +#~ " -U brukernavn Angi brukernavn\n" +#~ " -h tjener[:port] Angi tjeneradresse\n" +#~ "\n" +#~ " --[no-]debug-logging Aktiver eller deaktiver feilsøkingslogging\n" +#~ " --[no-]remote-admin Aktiver eller deaktiver ekstern " +#~ "administrering\n" +#~ " --[no-]remote-any Tillat eller forhindre tilgang fra Internett\n" +#~ " --[no-]remote-printers Vis eller skjul eksterne skrivere\n" +#~ " --[no-]share-printers Aktiver eller deaktiver skriverdeling\n" +#~ " --[no-]user-cancel-any Tillat eller forhindre at brukere kan avbryte " +#~ "en hvilken som helst jobb\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Bruk: cupsd [-c konfigurasjonsfil] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c konfigurasjonsfil Last inn alternativ konfigurasjonsfil\n" +#~ "-f Kjør i forgrunnen\n" +#~ "-F Kjør i forgrunnen, men skill\n" +#~ "-h Vis denne bruksmeldingen\n" +#~ "-l Kjør cupsd fra launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Bruk: cupsfilter -m mime/type [ valg ] filnavn\n" +#~ "\n" +#~ "Valg:\n" +#~ "\n" +#~ " -c cupsd.conf Angi hvilken cupsd.conf-fil som skal brukes\n" +#~ " -j jobb-id[,N] Filtrer filen N fra angitt jobb (standard er fil 1)\n" +#~ " -n eksemplarer Angi antall eksemplarer\n" +#~ " -o navn=verdi Angi valg\n" +#~ " -p filename.ppd Angi PPD-fil\n" +#~ " -t tittel Angi tittel\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Bruk: cupstestdsc [valg] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [valg] -\n" +#~ "\n" +#~ "Valg:\n" +#~ "\n" +#~ " -h Vis programbruk\n" +#~ "\n" +#~ " Merk: dette programmet validerer DSC-kommentarer, ikke selve " +#~ "PostScript-innholdet.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Bruk: cupstestppd [valg] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [valg] -\n" +#~ "\n" +#~ "Valg:\n" +#~ "\n" +#~ " -R rotkatalog Angi alternativ rot\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Gi advarsler i stedet for feil\n" +#~ " -q Kjør stille\n" +#~ " -r Bruk «avslappet» åpen modus\n" +#~ " -v Vær litt detaljert\n" +#~ " -vv Vær veldig detaljert\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Bruk: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Bruk: lpoptions [-h tjener] [-E] -d skriver\n" +#~ " lpoptions [-h tjener] [-E] [-p skriver] -l\n" +#~ " lpoptions [-h tjener] [-E] -p skriver -o valg[=verdi] ...\n" +#~ " lpoptions [-h tjener] [-E] -x skriver\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Bruk: lppasswd [-g gruppenavn]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Bruk: lppasswd [-g gruppenavn] [brukernavn]\n" +#~ " lppasswd [-g gruppenavn] -a [brukernavn]\n" +#~ " lppasswd [-g gruppenavn] -x [brukernavn]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Bruk: lpq [-P mål] [-U brukernavn] [-h vertsnavn[:port]] [-l] " +#~ "[+intervall]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Bruk: ppdc [valg] filename.drv [ ... filenameN.drv ]\n" +#~ "Valg:\n" +#~ " -D navn=verdi Bruk verdi for angitt variabel.\n" +#~ " -I include-dir Legg til inkluderingskatalog i søkebane.\n" +#~ " -c catalog.po Last inn angitt meldingskatalog.\n" +#~ " -d output-dir Angi utdatakatalog.\n" +#~ " -l lang[,lang,...] Angi utdataspråk (nasjonal innstilling).\n" +#~ " -m Bruk ModelName-verdi som filnavn.\n" +#~ " -t Test PPD-er i stedet for å generere dem.\n" +#~ " -v Vær detaljert (flere v-er gir høyere detaljnivå).\n" +#~ " -z Komprimer PPD-filer ved hjelp av GNU zip.\n" +#~ " --cr Bruk CR-linjeskift (Mac OS 9).\n" +#~ " --crlf Bruk CR + LF-linjeskift (Windows).\n" +#~ " --lf Bruk LF-linjeskift (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Bruk: ppdhtml [valg] filename.drv >filename.html\n" +#~ " -D navn=verdi Bruk verdi for angitt variabel.\n" +#~ "Valg:\n" +#~ " -I include-dir Legg til inkluderingskatalog i søkebane.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Bruk: ppdi [valg] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Valg:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Bruk: ppdmerge [valg] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Valg:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Bruk: ppdpo [valg] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Valg:\n" +#~ " -D navn=verdi Bruk verdi for angitt variabel.\n" +#~ " -I include-dir Legg til inkluderingskatalog i søkebane.\n" +#~ " -v Vær detaljert (flere v-er gir høyere detaljnivå).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Bruk: snmp [vert eller ip-adresse]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Legger til kun de %d første skriverne som ble funnet" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boolsk forventet for waiteof-valget «%s»\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Kunne ikke lese sidekanalforspørsel!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: Valget «%s» kan ikke inkluderes via IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Skriver svarer ikke\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Skriver sendte uventet EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vert svarte ikke med kommandostatusbyte etter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vert svarte ikke med kontrollstatusbyte etter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Ekstern vert svarte ikke med datastatusbyte etter %d sekunder!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: SCSI-kommando ble tidsavbrutt (%d). Prøver på nytt...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Dette dokumentet er ikke i overensstemmelse med Adobes " +#~ "konvensjoner for dokumentstruktur, og det er mulig at dokumentet ikke " +#~ "skrives ut riktig!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Kan ikke åpne «%s:%s»: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Kan ikke sende PAP-statusforespørsel" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Uventet PAP-pakke av typen %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Ukjent PAP-pakke av typen %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Ukjent innstilling «%s» for valget «%s»!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Ukjent valg «%s»!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Modulasjonshastigheten %s støttes ikke!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: tall forventet for statusvalget «%s»\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: gjenopprettbar: Nettverksverten «%s» er opptatt. Prøver på nytt " +#~ "om %d sekunder...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Advarsel: Ingen Windows 2000-skriverdrivere er installert!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4-konvolutt" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "konverter: Bruk valget -f for å angi en fil som skal konverteres.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Ingen PPD-fil for skriveren «%s» – %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Kan ikke koble til tjener: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Ukjent valg «%s»!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Ukjent valg «-%c»!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Forventet config-filnavn etter «-c»-valg!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Kan ikke hente nåværende katalog!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Ukjent argument «%s» – avbryter!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Ukjent valg «%c» – avbryter!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: launchd(8)-støtte er ikke kompilert inn, bruker vanlig modus.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Ugyldig dokumentnummer %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Ugyldig jobb-ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Kun ett filnavn kan spesifiseres!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Kan ikke opprette midlertidig fil: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Kan ikke hente jobbfil – %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: Valget -q er ikke kompatibelt med valget -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: Valget -v er ikke kompatibelt med valget -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "enhet for %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "enhet for %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "hjelp\t\thent hjelp ved kommandoer\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri-attributt mangler!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Klassenavn kan kun inneholde tegn som kan skrives ut!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: Forventet PPD etter «-P»-valg!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Forventet tillat/avslå:brukerliste etter «-u»-valg!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Forventet klasse etter «-r»-valg!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Forventet klassenavn etter «-c»-valg!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Forventet beskrivelse etter «-D»-valg!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Forventet enhets-URI etter «-v»-valg!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Forventet filtype etter «-I»-valg!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Forventet vertsnavn etter «-h»-valg!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Forventet grensesnitt etter «-i»-valg!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Forventet sted etter «-L»-valg!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Forventet modell etter «-m»-valg!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Forventet navn=verdi etter «-o»-valg!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Forventet skriver etter «-p»-valg!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Forventet skrivernavn etter «-d»-valg!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Forventet skriver eller klasse etter «-x»-valg!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Fant ingen medlemsnavn!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Skriveren %s er allerede medlem av klassen %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Skriveren %s er ikke medlem av klassen %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Skrivernavn kan kun inneholde tegn som kan skrives ut!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke legge til skriver i klassen:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Kan ikke koble til tjener: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Kan ikke opprette midlertidig fil – %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Kan ikke opprette midlertidig fil: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Kan ikke åpne PPD-filen «%s» – %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Kan ikke åpne filen «%s»: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke fjerne en skriver fra klassen:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi PPD-fil:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi enhets-URI:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi grensesnittsprosedyre eller PPD-fil:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi grensesnittsprosedyre:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi beskrivelse av skriver:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi skriverplassering:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kan ikke angi skrivervalg:\n" +#~ " Du må angi et skrivernavn først!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Ukjent tillat/avslå-valg «%s»!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Ukjent argument «%s»!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Ukjent valg «%c»!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Advarsel – ignorerte innholdstypeliste!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: Forventet 1284-enhets-ID-streng etter --device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Forventet språk etter --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Forventet merke og modell etter --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Forventet produktstreng etter --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Forventet oppsettliste etter --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Forventet oppsettliste etter --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Forventet tisdsavbrudd etter --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Ukjent argument «%s»!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Ukjent valg «%c»!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Ukjent valg «%s»!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Kan ikke koble til tjener: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Ukjent argument «%s»!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Ukjent valg «%c»!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Ingen skrivere!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Kan ikke legge til skriver eller forekomst: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Kan ikke hente PPD-fil for %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Kan ikke åpne PPD-fil for %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Ukjent skriver eller klasse!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Kun rot kan legge til og slette passord!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Passordfil er opptatt!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Passordfil er ikke oppdatert!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Beklager. Passordet stemmer ikke!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Beklager. Passordet ble ikke godtatt.\n" +#~ "Passordet må være på minst 6 tegn og kan ikke inneholde\n" +#~ "brukernavet ditt. Det må også inneholde must én bokstav og ett tall.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Beklager. Passordene er ikke like!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Kan ikke kopiere passordstreng: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Kan ikke åpne passordfil: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Kan ikke skrive til passordfil: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: kunne ikke sikkerhetskopiere gammel passordfil: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: kunne ikke endre navn på passordfil: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: brukeren «%s» og gruppen «%s» finnes ikke.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: feil – %s-miljøvariabel oppgir målet «%s» som ikke eksisterer!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "medlemmer av klassen %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "ingen oppføringer\n" + +#~ msgid "no system default destination\n" +#~ msgstr "ingen standardmål for system\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events ikke angitt!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri-URI «%s» er i bruk!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri-URI «%s» bruker et ukjent oppsett!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d er ubrukelig!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Legger til inkluderingskatalog «%s»...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Legger til / oppdaterer UI-tekst fra %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Ugyldig boolsk verdi (%s) på linje %d av %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig oppløsningsnavn «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig statusnøkkelord %s på linje %d av %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Ugyldig variabelutskifting ($%c) på linje %d av %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Fant alternativ på linje %d av %s uten valg!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Duplikat #po for nasjonal innstilling %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Forventet filterdefinisjon på linje %d av %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Forventet programnavn på linje %d av %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Forventet boolsk verdi på linje %d av %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventet tegnsett etter Font på linje %d av %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Forventet valgkode på linje %d av %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Forventet valgnavn/-tekst på linje %d av %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Forventet fargerekkefølge for ColorModel på linje %d av %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Forventet fargeområde for ColorModel på linje %d av %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Forventet komprimering for ColorModel på linje %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventet restriksjoner for UIConstraints på linje %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Forventet nøkkelord for drivertype etter DriverType på linje %d av %" +#~ "s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Forventet duplekstype etter Duplex på linje %d av %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventet koding etter Font på linje %d av %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventet filnavn etter #po %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Forventet gruppenavn/-tekst på linje %d av %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Forventet inkluderingsfilnavn på linje %d av %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Forventet heltall på linje %d av %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Forventet nasjonal innstilling etter #po på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter FileName på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter Font på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter Manufacturer på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter MediaSize på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter ModelName på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn etter PCFileName på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn/tekst etter %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn/tekst etter Installable på linje %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Forventet navn/tekst etter Resolution på linje %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventet navn/tekst-kombinasjon for ColorModel på linje %d av %s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Forventet valgnavn/-tekst på linje %d av %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Forventet valgdel på linje %d av %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Forventet valgtype på linje %d av %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventet overstyringsfelt etter Resolution på linje %d av %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Forventet reelt tall på linje %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Forventet oppløsning/papirtype etter ColorProfile på linje %d av %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Forventet oppløsning/papirtype etter SimpleColorProfile på linje %d " +#~ "av %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventet velger etter %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventet status etter Font på linje %d av %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Forventet streng etter Copyright på linje %d av %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Forventet streng etter Version på linje %d av %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Forventet to valgnavn på linje %d av %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Forventet verdi etter %s på linje %d av %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Forventet versjon etter Font på linje %d av %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Ugyldig #include/#po filnavn «%s»!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig kostnad for filter på linje %d av %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig, tom MIME-type for filter på linje %d av %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig, tomt programnavn for filter på linje %d av %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig valgdel «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ugyldig valgtype «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Laster inn driverinformasjonsfil «%s»...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Laster inn meldinger for nasjonal innstilling «%s»...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Laster inn meldinger fra «%s»...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: Mangler #endif ved slutten av «%s»!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: Mangler #if på linje %d av %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Ingen meldingskatalog oppgitt for nasjonal innstilling %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Valg %s definert på nytt med forskjellig type på linje %d av %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Valgrestriksjon må *navn på linje %d av %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: For mange nestede #if-er på linje %d av %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Kan ikke opprette PPD-filen «%s» – %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Kan ikke opprette utdatakatalog %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Kan ikke opprette utdatakanaler: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Kan ikke utføre cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Finner ikke #po-filen %s på linje %d av %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Finner ikke inkluderingsfilen «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Finner ikke lokalisering for «%s» – %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Finner ikke lokaliseringsfilen «%s» – %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Udefinert variabel (%s) på linje %d av %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Ukjent drivertype %s på linje %d av %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ukjent duplekstype «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ukjent papirstørrelse «%s» på linje %d av %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Ukjent kjennetegn «%s» funnet på linje %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Ukjente etterfølgende tegn i det reelle tallet «%s» på linje %d av %" +#~ "s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Uavsluttet streng begynner med %c på linje %d av %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Skriver %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Skriver PPD-filer til katalog «%s»...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Ugyldig LanguageVersion «%s» i %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Ignorerer PPD-fil %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Kan ikke sikkerhetskopiere %s til %s – %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "skriveren %s er deaktivert siden %s –\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "skriveren %s er inaktiv. aktivert siden %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "skriveren %s skriver nå ut %s–%d. aktivert siden %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "skriveren %s/%s er deaktivert siden %s –\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "skriveren %s/%s er inaktiv. aktivert siden %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "skriveren %s/%s skriver nå ut %s–%d. aktivert siden %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "request-id er %s–%d (%d fil(er))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "planlegger er ikke i gang\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "planlegger er i gang\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tvis status for daemon og kø\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "standardmål for system: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "standardmål for system: %s/%s\n" diff --git a/locale/cups_pl.po b/locale/cups_pl.po new file mode 100644 index 0000000..9b263b0 --- /dev/null +++ b/locale/cups_pl.po @@ -0,0 +1,8717 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f mm" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f do %.0f x %.0f mm" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f cali" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f do %.2f x %.2f cali" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s nie może zostać zmienione." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 cal/sek." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 cala/sek." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 cali/sek." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sek." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 cali/sek." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 cali/sek." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sek." + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sek." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sek." + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 cale/sek." + +msgid "2-Sided Printing" +msgstr "druk obustronny" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 cala/sek." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sek." + +msgid "200 mm/sec." +msgstr "200 mm/sek." + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24 igłowa" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sek." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 cale/sek." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "dysk 3.5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "dysk 3.5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sek." + +msgid "300 mm/sec." +msgstr "300 mm/sek." + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 cale/sek." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sek." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 cali/sek." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 cali/sek." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sek." + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 cali/sek." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 cali/sek." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sek." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 cali/sek." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9 igłowa" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Zaakceptuj zlecenia" + +msgid "Accepted" +msgstr "Zaakceptowane" + +msgid "Add Class" +msgstr "Dodaj klasę" + +msgid "Add Printer" +msgstr "Dodaj drukarkę" + +msgid "Add RSS Subscription" +msgstr "Dodaj subskrypcję RSS" + +msgid "Address" +msgstr "Adres" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adres - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administracja" + +msgid "Always" +msgstr "Zawsze" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplikator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Błędny PUSTY wskaźnik dests" + +msgid "Bad OpenGroup" +msgstr "Błędne OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Błędne OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Błędne OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Błędne żądanie" + +msgid "Bad SNMP version number" +msgstr "Błędny numer wersji SNMP" + +msgid "Bad UIConstraints" +msgstr "Błędne OrderDependency" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Błędna wartość kopii %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Błędny własny parametr" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Błędna wartość kopii %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Błędne wartości %d-%d page-ranges." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Bannery" + +msgid "Billing Information: " +msgstr "Fakturowanie: " + +msgid "Bond Paper" +msgstr "Papier uszlachetniony" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Drukarka etykiet CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Wycofaj subskrypcję RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Zmień ustawienia" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klasy" + +msgid "Clean Print Heads" +msgstr "Czyść głowice drukarki" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Kolor" + +msgid "Color Mode" +msgstr "Tryb koloru" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Community name używa nieograniczonej długości" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Dalej" + +msgid "Continuous" +msgstr "Ciągły" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Utworzono" + +msgid "Created On: " +msgstr "Utworzono: " + +msgid "Custom" +msgstr "Własne" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Wytnij" + +msgid "Cutter" +msgstr "Do cięcia" + +msgid "Dark" +msgstr "Ciemne" + +msgid "Darkness" +msgstr "Ciemność" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Usuń klasę" + +msgid "Delete Printer" +msgstr "Usuń drukarkę" + +msgid "Description: " +msgstr "Opis: " + +msgid "DeskJet Series" +msgstr "Seria DeskJet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Cel \"%s\" nie akceptuje zadań." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Materiał bezpośredni termiczny" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Wyłączone" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nazwa sterownika: " + +msgid "Driver Version: " +msgstr "Wersja sterownika: " + +msgid "Duplexer" +msgstr "Do druku obustronnego" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Drukarka etykiet EPL1" + +msgid "EPL2 Label Printer" +msgstr "Drukarka etykiet EPL2" + +msgid "Edit Configuration File" +msgstr "Edytuj plik konfiguracji" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Baner końcowy" + +msgid "English" +msgstr "Polish" + +msgid "Enter old password:" +msgstr "Podaj stare hasło:" + +msgid "Enter password again:" +msgstr "Powtórz hasło:" + +msgid "Enter password:" +msgstr "Podaj hasło:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Wprowadź swoje nazwę użytkownika i hasło lub nazwę i hasło użytkownika root, " +"aby uzyskać dostęp do tej strony. Jeżeli korzystasz z uwierzytelnienia " +"Kerberos, upewnij się, że posiadasz prawidłowy bilet Kerberos." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Podajnik kopert" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Zasady obsługi błędów" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Co 10 etykiet" + +msgid "Every 2 Labels" +msgstr "Co 2 etykiety" + +msgid "Every 3 Labels" +msgstr "Co 3 etykiety" + +msgid "Every 4 Labels" +msgstr "Co 4 etykiety" + +msgid "Every 5 Labels" +msgstr "Co 5 etykiet" + +msgid "Every 6 Labels" +msgstr "Co 6 etykiet" + +msgid "Every 7 Labels" +msgstr "Co 7 etykiet" + +msgid "Every 8 Labels" +msgstr "Co 8 etykiet" + +msgid "Every 9 Labels" +msgstr "Co 9 etykiet" + +msgid "Every Label" +msgstr "Co etykietę" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Oczekiwana wartość nie do zwrócenia" + +msgid "Export Printers to Samba" +msgstr "Wyeksportuj drukarki do Samby" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Folder" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Folder - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Zabronione" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Ogólne" + +msgid "Generic" +msgstr "Ogólne" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU używa nieskończonej długości" + +msgid "Glossy Paper" +msgstr "Papier błyszczący" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Szarości" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Wiszący folder" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Wiszący folder - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "Polish" + +msgid "Illegal control character" +msgstr "Niedozwolony znak kontrolny" + +msgid "Illegal main keyword string" +msgstr "Niedozwolony główny łańcuch słowa kluczowego" + +msgid "Illegal option keyword string" +msgstr "Niedozwolony łańcuch słowa kluczowego opcji" + +msgid "Illegal translation string" +msgstr "Niedozwolony łańcuch tłumaczenia" + +msgid "Illegal whitespace character" +msgstr "Niedozwolony biały znak" + +msgid "Installable Options" +msgstr "Opcje instalowane" + +msgid "Installed" +msgstr "Zainstalowane" + +msgid "IntelliBar Label Printer" +msgstr "Drukarka etykiet IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Błąd wewnętrzny" + +msgid "Internet Postage 2-Part" +msgstr "Etykieta Internet Postage, dwuczęściowa" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Etykieta Internet Postage, dwuczęściowa - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Etykieta Internet Postage, trzyczęściowa" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Etykieta Internet Postage, trzyczęściowa - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internetowy protokół druku" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Zlecenie #%d zostało już przerwane - nie można anulować." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Zlecenie #%d zostało już anulowane - nie można anulować." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Zlecenie #%d zostało już zakończone - nie można anulować." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "zlecenie zakończone" + +msgid "Job Created" +msgstr "utworzono zlecenie" + +msgid "Job ID: " +msgstr "ID zlecenia: " + +msgid "Job Options Changed" +msgstr "zmieniono opcje zlecenia" + +msgid "Job Stopped" +msgstr "zlecenie zatrzymane" + +msgid "Job UUID: " +msgstr "UUID zlecenia: " + +msgid "Job is completed and cannot be changed." +msgstr "Zlecenie zostało zakończone i nie może zostać zmienione." + +msgid "Job operation failed:" +msgstr "Operacja zlecenia nie powiodła się:" + +msgid "Job state cannot be changed." +msgstr "Stan zlecenia nie może zostać zmieniony." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Zlecenia" + +msgid "LPD/LPR Host or Printer" +msgstr "Host lub drukarka LPD/LPR" + +msgid "Label Printer" +msgstr "Drukarka etykiet" + +msgid "Label Top" +msgstr "Wierzch etykiety" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Duży adres" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Duży adres - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Lekki" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Wiersz dłuższy niż maksymalnie dozwolony (255 znaków)" + +msgid "List Available Printers" +msgstr "Pokaż dostępne drukarki" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Miejsce: " + +msgid "Long-Edge (Portrait)" +msgstr "Portretowy" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Marka i model: " + +msgid "Manual Feed" +msgstr "Ręczne podawanie papieru" + +msgid "Media Dimensions: " +msgstr "Wymiary nośnika: " + +msgid "Media Limits: " +msgstr "Ograniczenia nośnika: " + +msgid "Media Name: " +msgstr "Nazwa nośnika: " + +msgid "Media Size" +msgstr "Rozmiar nośnika" + +msgid "Media Source" +msgstr "Źródło nośnika" + +msgid "Media Tracking" +msgstr "Śledzenie nośnika" + +msgid "Media Type" +msgstr "Rodzaj nośnika" + +msgid "Medium" +msgstr "Średni" + +msgid "Memory allocation error" +msgstr "Błąd przydziału pamięci" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Brakujący nagłówek PPD-Adobe-4.x" + +msgid "Missing asterisk in column 1" +msgstr "Brakująca gwiazdka w kolumnie 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Brakujący łańcuch wartości" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Zmień klasę" + +msgid "Modify Printer" +msgstr "Zmień drukarkę" + +msgid "Move All Jobs" +msgstr "Przenieś wszystkie zlecenia" + +msgid "Move Job" +msgstr "Przenieś zlecenie" + +msgid "Moved Permanently" +msgstr "Trwale przeniesione" + +msgid "NULL PPD file pointer" +msgstr "PUSTY wskaźnik pliku PPD" + +msgid "Name OID uses indefinite length" +msgstr "OID nazwy używa nieskończonej długości" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Nigdy" + +msgid "New Stylus Color Series" +msgstr "New Stylus Color Series" + +msgid "New Stylus Photo Series" +msgstr "New Stylus Photo Series" + +msgid "No" +msgstr "Nie" + +msgid "No Content" +msgstr "Brak zawartości" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Brak VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Brak aktywnego połączenia" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Brak community name" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Nie dodano celów." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Brak error-index" + +msgid "No error-status" +msgstr "Brak error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Brak OID nazwy" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Brak request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Błędne ID subskrypcji." + +msgid "No variable-bindings SEQUENCE" +msgstr "Brak variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Brak nazwy wersji" + +msgid "Non-continuous (Mark sensing)" +msgstr "Nieciągły (Mark sensing)" + +msgid "Non-continuous (Web sensing)" +msgstr "Nieciągły (Web sensing)" + +msgid "Normal" +msgstr "Zwykły" + +msgid "Not Found" +msgstr "Nie znaleziono" + +msgid "Not Implemented" +msgstr "Niezaimplementowane" + +msgid "Not Installed" +msgstr "Niezainstalowane" + +msgid "Not Modified" +msgstr "Niezmienione" + +msgid "Not Supported" +msgstr "Nieobsługiwane" + +msgid "Not allowed to print." +msgstr "Brak zgody na druk." + +msgid "Note" +msgstr "Notatka" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Jednostronny" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Pomoc internetowa" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Otwarcie %s nie powiodło się: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup nie poprzedzony przez CloseGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI nie poprzedzony przez CloseUI/JCLCloseUI" + +msgid "Operation Policy" +msgstr "Polityka operacji" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Zainstalowane opcje" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opcje: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Tryb wyjścia" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Drukarka laserowa PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Pakiet nie zawiera Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Pakiet nie rozpoczyna się od SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Hasło dla %s na %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Wymagane jest hasło dla %s, aby uzyskać dostęp do %s przez Sambę:" + +msgid "Pause Class" +msgstr "Wstrzymanie klasy" + +msgid "Pause Printer" +msgstr "Wstrzymanie drukarki" + +msgid "Peel-Off" +msgstr "Peel-Off" + +msgid "Photo" +msgstr "Zdjęcie" + +msgid "Photo Labels" +msgstr "Etykiety zdjęć" + +msgid "Plain Paper" +msgstr "Zwykły papier" + +msgid "Policies" +msgstr "Zasady" + +msgid "Port Monitor" +msgstr "Monitor portów" + +msgid "PostScript Printer" +msgstr "Drukarka PostScriptowa" + +msgid "Postcard" +msgstr "Kartka pocztowa" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Gęstość druku" + +msgid "Print Job:" +msgstr "Zlecenie drukowania:" + +msgid "Print Mode" +msgstr "Tryb drukowania" + +msgid "Print Rate" +msgstr "Prędkość drukowania" + +msgid "Print Self-Test Page" +msgstr "Drukuj stronę testową" + +msgid "Print Speed" +msgstr "Prędkość druku" + +msgid "Print Test Page" +msgstr "Wydrukuj stronę próbną" + +msgid "Print and Cut" +msgstr "Drukuj i obetnij" + +msgid "Print and Tear" +msgstr "Drukuj i oderwij" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Druk dla: " + +msgid "Printed From: " +msgstr "Druk z: " + +msgid "Printed On: " +msgstr "Druk na: " + +msgid "Printer Added" +msgstr "Dodano drukarkę" + +msgid "Printer Default" +msgstr "Domyślna drukarka" + +msgid "Printer Deleted" +msgstr "Usunięto drukarkę" + +msgid "Printer Modified" +msgstr "Zmieniono drukarkę" + +msgid "Printer Name: " +msgstr "Nazwa drukarki: " + +msgid "Printer Paused" +msgstr "Drukarka wstrzymana" + +msgid "Printer Settings" +msgstr "Ustawienia drukarki" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Drukarka:" + +msgid "Printers" +msgstr "Drukarki" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Wyczyść zlecenia" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Przekroczono limit miejsca." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Odrzuć zlecenia" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Drukuj ponownie po błędzie" + +msgid "Request Entity Too Large" +msgstr "Encja zapytania zbyt długa" + +msgid "Resolution" +msgstr "Rozdzielczość" + +msgid "Resume Class" +msgstr "Wznowienie klasy" + +msgid "Resume Printer" +msgstr "Wznowienie drukarki" + +msgid "Return Address" +msgstr "Adres nadawcy" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Adres nadawcy - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Przewiń" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE używa nieskończonej długości" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Zobacz inne" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Port szeregowy #%d" + +msgid "Server Restarted" +msgstr "Uruchomiono serwer ponownie" + +msgid "Server Security Auditing" +msgstr "Sprawdzenie bezpieczeństwa serwera" + +msgid "Server Started" +msgstr "Uruchomiono serwer" + +msgid "Server Stopped" +msgstr "Zatrzymano serwer" + +msgid "Service Unavailable" +msgstr "Usługa niedostępna" + +msgid "Set Allowed Users" +msgstr "Ustaw dozwolonych użytkowników" + +msgid "Set As Server Default" +msgstr "Ustaw jako domyślne serwera" + +msgid "Set Class Options" +msgstr "Ustaw opcje klasy" + +msgid "Set Printer Options" +msgstr "Ustaw opcje drukarki" + +msgid "Set Publishing" +msgstr "Ustaw publikowanie" + +msgid "Shipping Address" +msgstr "Adres wysyłki" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Adres wysyłki - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Poziome" + +msgid "Special Paper" +msgstr "Papier specjalny" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standardowy" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Uruchamiam baner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Stwierdzenie" + +msgid "Stylus Color Series" +msgstr "Stylus Color Series" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Series" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Przełączanie protokołów" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Tear" + +msgid "Tear-Off" +msgstr "Tear-Off" + +msgid "Tear-Off Adjust Position" +msgstr "Korekcja pozycji odrywania" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Nie można znaleźć pliku PPD \"%s\"." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Nie można otworzyć pliku PPD \"%s\": %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Nazwa klasy może zawierać tylko do 127 drukowalnych znaków i nie może " +"zawierać spacji, ukośników (/) lub znaku #." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Cecha notify-lease-duration nie może być używana z subskrypcjami zadań." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Nazwa drukarki może zawierać tylko do 127 drukowalnych znaków i nie może " +"zawierać spacji, ukośników (/) lub znaku #." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri \"%s\" zawiera nieprawidłowe znaki." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"printer-uri musi być w formie \"ipp://NAZWA_KOMPUTERA/classes/NAZWA_KLASY\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"printer-uri musi być w formie \"ipp://NAZWA_KOMPUTERA/printers/NAZWA_DRUKARKI" +"\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Nazwa subskrypcji nie może zawierać spacji, ukośników (/), pytajników (?) " +"lub znaku #." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Jest zbyt wiele subskrypcji." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Nośnik druku termicznego" + +msgid "Title: " +msgstr "Tytuł: " + +msgid "Too many active jobs." +msgstr "Za dużo aktywnych zadań." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Przezroczystość" + +msgid "Tray" +msgstr "Podajnik" + +msgid "Tray 1" +msgstr "Podajnik 1" + +msgid "Tray 2" +msgstr "Podajnik 2" + +msgid "Tray 3" +msgstr "Podajnik 3" + +msgid "Tray 4" +msgstr "Podajnik 4" + +msgid "URI Too Long" +msgstr "Zbyt długi URI" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Port szeregowy USB #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Nie można uzyskać dostępu do pliku cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Nie można dodać subskrypcji RSS:" + +msgid "Unable to add class:" +msgstr "Nie można dodać klasy:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Nie można dodać drukarki:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Nie można wycofać subskrypcji RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Nie można zmienić cechy printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Nie można zmienić drukarki:" + +msgid "Unable to change server settings:" +msgstr "Nie można zmienić ustawień serwera:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Nie można połączyć się z hostem." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Nie można utworzyć pliku tymczasowego:" + +msgid "Unable to delete class:" +msgstr "Nie można usunąć klasy:" + +msgid "Unable to delete printer:" +msgstr "Nie można usunąć drukarki:" + +msgid "Unable to do maintenance command:" +msgstr "Nie można wykonać polecenia konserwacji:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Nie można uzyskać listy klas:" + +msgid "Unable to get class status:" +msgstr "Nie można uzyskać statusu klasy:" + +msgid "Unable to get list of printer drivers:" +msgstr "Nie można uzyskać listy sterowników drukarek:" + +msgid "Unable to get printer attributes:" +msgstr "Nie można uzyskać cech drukarki:" + +msgid "Unable to get printer list:" +msgstr "Nie można uzyskać listy drukarek:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Nie można uzyskać statusu drukarki:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Nie można zmienić klasy:" + +msgid "Unable to modify printer:" +msgstr "Nie można zmienić drukarki:" + +msgid "Unable to move job" +msgstr "Nie można przenieść zlecenia" + +msgid "Unable to move jobs" +msgstr "Nie można przenieść zadań" + +msgid "Unable to open PPD file" +msgstr "Nie można otworzyć pliku PPD" + +msgid "Unable to open PPD file:" +msgstr "Nie można otworzyć pliku PPD:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Nie można otworzyć pliku cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Nie można wydrukować strony testowej:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Nie można ustawić opcji:" + +msgid "Unable to set server default:" +msgstr "Nie można ustalić domyślnych parametrów serwera:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Nie można wysłać pliku cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Brak uwierzytelnienia" + +msgid "Units" +msgstr "Jednostki" + +msgid "Unknown" +msgstr "Nieznane" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Nieznane printer-error-policy \"%s\"!" + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Nieznane printer-op-policy \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Nieobsługiwany rodzaj wartości" + +msgid "Upgrade Required" +msgstr "Wymagane uaktualnienie" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Wartość używa nieskończonej długości" + +msgid "VarBind uses indefinite length" +msgstr "VarBind używa nieskończonej długości" + +msgid "Version uses indefinite length" +msgstr "Version używa nieskończonej długości" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Tak" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Aby uzyskać dostęp do tej strony, użyj URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Drukarka etykiet ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "przerwane" + +msgid "canceled" +msgstr "anulowane" + +msgid "completed" +msgstr "zakończone" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "Nie powiodło się wykonanie cups-deviced." + +msgid "cups-driverd failed to execute." +msgstr "Nie powiodło się wykonanie cups-driverd." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index używa nieskończonej długości" + +msgid "error-status uses indefinite length" +msgstr "error-status używa nieskończonej długości" + +msgid "held" +msgstr "wstrzymane" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "bezczynna" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "oczekujące" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "przetwarzane" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id używa nieskończonej długości" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "użycie stat z %s nie powiodło się: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "zlecenie zatrzymane" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "nieznane" + +msgid "untitled" +msgstr "nienazwane" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings używa nieskończonej długości" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(wszystko)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(brak)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d wpisów\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tPo niepowodzeniu: kontynuuj\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAlarmy:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner jest wymagany\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tZestawy znaków:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tPołączenie: bezpośrednie\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tPołączenie: zdalne\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tDomyślny rozmiar strony:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tDomyślny stopień:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tDomyślne ustawienia portu:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tOpis: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormularz zamontowany od:\n" +#~ "\tRodzaje zawartości: dowolne\n" +#~ "\tRodzaje drukarek: nieznane\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tDozwolone formularze:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterfejs: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterfejs: %s/interfejsy/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterfejs: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tPołożenie: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tPrzy niepowodzeniu: brak alarmu\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tDozwoleni użytkownicy:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tZabronieni użytkownicy:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdemon jest obecny\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tbrak wpisów\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tdrukarka jest urządzeniem \"%s\" prędkość -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tdrukowanie jest wyłączone" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tdrukowanie jest włączone\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tw kolejce dla%s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tkolejka jest wyłączona\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tkolejka jest włączona\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tnieznana przyczyna\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " SZCZEGÓŁOWE WYNIKI TESTU ZGODNOŚCI\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: strona 15, sekcja 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: strona 15, sekcja 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: strona 19, sekcja 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: strona 20, sekcja 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: strona 27, sekcja 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: strona 42, sekcja 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: strony 16-17, sekcja 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: strony 42-45, sekcja 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: strony 45-46, sekcja 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: strony 48-49, sekcja 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: strony 52-54, sekcja 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f bajtów\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " SUKCES Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " SUKCES DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " SUKCES DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " SUKCES FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " SUKCES FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " SUKCES LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " SUKCES LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " SUKCES Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " SUKCES ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " SUKCES NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " SUKCES PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " SUKCES PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " SUKCES PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " SUKCES PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " SUKCES Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " SUKCES ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " OSTRZEŻENIE \"%s %s\" jest w konflikcie z \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " OSTRZEŻENIE %s nie posiada odpowiadających opcji!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE %s współdzieli wspólny przedrostek z %s\n" +#~ " REF: strona 15, sekcja 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " OSTRZEŻENIE Konflikt domyślnych wyborów!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Podwójna opcja słowo kluczowe %s może nie działać " +#~ "w spodziewany sposób i powinno nosić nazwę Podwójne!\n" +#~ " REF: strona 122, sekcja 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Plik zawiera mieszaninę zakończeń wierszy CR, LF i " +#~ "CR LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE LanguageEncoding jest wymagane przez specyfikację " +#~ "PPD 4.3.\n" +#~ " REF: strony 56-57, sekcja 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " OSTRZEŻENIE Wiersz %d zawiera wyłącznie białe spacje!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Manufacturer jest wymagane przez specyfikację PPD " +#~ "4.3.\n" +#~ " REF: strony 58-59, sekcja 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " OSTRZEŻENIE Brakujący plik APDialogExtension \"%s\"\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " OSTRZEŻENIE Brakujący plik APPrinterIconPath \"%s\"\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Pliki PPD nie przeznaczone dla Windows powinny " +#~ "używać tylko zakończeń wierszy LF, nie CR LF!" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Przestarzała wersja PPD %.1f!\n" +#~ " REF: strona 42, sekcja 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE PCFileName dłuższa niż 8.3 narusza specyfikację " +#~ "PPD.\n" +#~ " REF: strony 61-62, sekcja 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Protokoły zawierają PJL, ale cechy JCL nie są " +#~ "ustawione.\n" +#~ " REF: strony 78-79, sekcja 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE Protokoły zawierają zarówno PJL jak i BCP, " +#~ "oczekiwano TBCP.\n" +#~ " REF: strony 78-79, sekcja 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " OSTRZEŻENIE ShortNickName jest wymagana przez specyfikację PPD " +#~ "4.3.\n" +#~ " REF: strony 64-65, sekcja 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s nie istnieje!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Zły wybór %s, %s!\n" +#~ " REF: strona 122, sekcja 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Nieprawidłowy UTF-8 łańcucha tekstowegi tłumaczenia \"%s\" dla " +#~ "opcji %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Nieprawidłowy UTF-8 łańcucha tekstowego tłumaczenia \"%s\" dla " +#~ "opcji %s, wybór %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Błędna wartość cupsFilter \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Nieprawidłowy profil cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Błędna wartość cupsPreFilter \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Błędna wartość cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Błędny język \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Puste cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Brakujący łańcuch tekstowy tłumaczenia \"%s\" dla opcji %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Brakujący łańcuch tekstowy tłumaczenia \"%s\" dla opcji %s, " +#~ "wybór %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Brakujący wybór *%s %s w UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Brakujący wybór *%s %s w cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Brakujący plik cupsFilter \"%s\"!\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Brakujący plik cupsICCProfile \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Brakujący plik cupsPreFilter \"%s\"!\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Brakujący cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Brakująca opcja %s w UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Brakująca opcja %s w cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Brak podstawowego tłumaczenia \"%s\" zawartego w pliku!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s WYMAGANE %s nie defuniuje wyboru Brak!\n" +#~ " REF: strona 122, sekcja 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s skrót koliduje z %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s powoduje pętlę!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **PROBLEM** %s nazwy wyborów %s i %s różnią się tylko wielkością " +#~ "liter!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **PROBLEM** %s musi być 1284DeviceID!\n" +#~ " REF: strona 72, sekcja 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość Default%s %s\n" +#~ " REF: strona 40, sekcja 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość DefaultImageableArea %s!\n" +#~ " REF: strona 102, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość DefaultPaperDimension %s!\n" +#~ " REF: strona 103, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość właściwości JobPatchFile w pliku\n" +#~ " REF: strona 24, sekcja 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość Manufacturer (powinno być \"HP\")\n" +#~ " REF: strona 211, tablica D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość Manufacturer (powinno być \"Oki\")\n" +#~ " REF: strona 211, tablica D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNA wartość ModelName - \"%c\" nie jest zezwolone w " +#~ "ciągu znaków.\n" +#~ " REF: strony 59-60, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNE PSVersion - nie jest \"(string) int\".\n" +#~ " REF: strony 62-64, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNE Product - nie jest \"(string)\".\n" +#~ " REF: strona 62, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** BŁĘDNE ShortNickName - dłuższe niż 31 znaków.\n" +#~ " REF: strony 64-65, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **PROBLEM** Błędny %s wybór %s!\n" +#~ " REF: strona 84, sekcja 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** Nieprawidłowe FileVersion \"%s\"\n" +#~ " REF: strona 56, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** Nieprawidłowe FormatVersion \"%s\"\n" +#~ " REF: strona 56, sekcja 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **PROBLEM** Błędna wartość LanguageEncoding %s - musi być " +#~ "ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **PROBLEM** Błędna wartość LanguageVersion %s - musi być " +#~ "angielski!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **PROBLEM** Nie można zinterpretować domyślnego kodu opcji: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **PROBLEM** Domyślny łańcuch tekstowy tłumaczenia dla opcji %s " +#~ "wyboru %s zawiera 8 bitowe znaki!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **PROBLEM** Nie można zinterpretować domyślnego kodu opcji: %s\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **PROBLEM** Nazwy grup %s i %s różnią się tylko wielkością liter!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Wielokrotne wystąpienia nazwy wyboru %s, %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **PROBLEM** Nazwy opcji %s i %s różnią się tylko wielkością " +#~ "liter!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE Default%s\n" +#~ " REF: strona 40, sekcja 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE DefaultImageableArea\n" +#~ " REF: strona 102, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE DefaultPaperDimension\n" +#~ " REF: strona 103, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE FileVersion\n" +#~ " REF: strona 56, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE FormatVersion\n" +#~ " REF: strona 56, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE ImageableArea for PageSize %s\n" +#~ " REF: strona 41, sekcja 5.\n" +#~ " REF: strona 102, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE LanguageEncoding\n" +#~ " REF: strony 56-57, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE LanguageVersion\n" +#~ " REF: strony 57-58, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** WYMAGANE Manufacturer\n" +#~ " REF: strony 58-59, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** WYMAGANE ModelName\n" +#~ " REF: strony 59-60, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE NickName\n" +#~ " REF: strona 60, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PCFileName\n" +#~ " REF: strony 61-62, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PSVersion\n" +#~ " REF: strony 62-64, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PageRegion\n" +#~ " REF: strona 100, sekcja 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PageSize\n" +#~ " REF: strona 41, sekcja 5.\n" +#~ " REF: strona 99, sekcja 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PageSize\n" +#~ " REF: strony 99-100, sekcja 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE PaperDimension dla PageSize %s\n" +#~ " REF: strona 41, sekcja 5.\n" +#~ " REF: strona 103, sekcja 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE Product\n" +#~ " REF: strona 62, sekcja 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **PROBLEM** WYMAGANE ShortNickName\n" +#~ " REF: strony 64-65, sekcja 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " ZNALEZIONO %d BŁĘDÓW\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Błędna wartość %%%%BoundingBox: w wierszu %d!\n" +#~ " REF: strona 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Błędna wartość %%%%Page: w wierszu %d!\n" +#~ " REF: strona 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Błędna wartość %%%%Pages: w wierszu %d!\n" +#~ " REF: strona 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Wiersz %d jest dłuższy niż 255 znaków (%d)!\n" +#~ " REF: strona 25, Długość wiersza\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " Brakujące %!PS-Adobe-3.0 w pierwszym wierszu!\n" +#~ " REF: strona 17, 3.1 Podporządkowywanie dokumentów\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Brakujący komentarz %%EndComments!\n" +#~ " REF: strona 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Brakujący lub błędny komentarz %%BoundingBox:!\n" +#~ " REF: strona 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Brakujące lub błędne komentarze %%Page:!\n" +#~ " REF: strona 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Brakujący lub błędny komentarz %%Pages:!\n" +#~ " REF: strona 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " NIE ZNALEZIONO BŁĘDÓW\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Znaleziono %d wierszy przekraczających 255 znaków!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Zbyt wiele komentarzy %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Zbyt wiele komentarzy %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Ostrzeżenie: plik zawiera dane binarne!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Ostrzeżenie: brak komentarza %%EndComments w pliku!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Ostrzeżenie: przestarzała wersja DSC %.1f w pliku!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **PROBLEM** Nie można otworzyć pliku PPD - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " PROBLEM\n" +#~ " **PROBLEM** Nie można otworzyć pliku PPD - %s w wierszu %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " SUKCES\n" + +#~ msgid "#10 Envelope" +#~ msgstr "Koperta #10" + +#~ msgid "#11 Envelope" +#~ msgstr "Koperta #11" + +#~ msgid "#12 Envelope" +#~ msgstr "Koperta #12" + +#~ msgid "#14 Envelope" +#~ msgstr "Koperta #14" + +#~ msgid "#9 Envelope" +#~ msgstr "Koperta #9" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bajtów" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bajtów\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s akceptuje żądania od %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s nie jest zaimplementowane przez lpc w wersji CUPS.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s nie jest gotowe\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s jest gotowe\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s jest gotowe i drukuje\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s nie akceptuje żądań od %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s jest nieobsługiwane!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s akceptuje żądania od %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s nie akceptuje żądań od %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [zlecenie %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s nie powiodło się: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: nie wiem co robić!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: błąd - %s nazw zmiennych środowiskowych z nieistniejącym celem \"%s" +#~ "\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: błąd - błędny ID zlecenia!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: błąd - nie można jednocześnie drukować plików i zmieniać zlecenia!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: błąd - nie można drukować ze standardowego wejścia, jeśli dostarczone " +#~ "są pliki lub ID zlecenia!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: błąd - oczekiwany zestaw znaków po opcji \"-S\"!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: błąd - oczekiwany typ zawartości po opcji \"-T\"!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: błąd - oczekiwane kopie po opcji \"-n\"!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: błąd - oczekiwany licznik kopii po opcji \"-#\"!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: błąd - oczekiwany cel po opcji \"-P\"!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: błąd - oczekiwany cel po opcji \"-b\"!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: błąd - oczekiwany cel po opcji \"-d\"!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: błąd - oczekiwana forma po opcji \"-f\"!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: błąd - oczekiwana wstrzymana nazwa po opcji \"-H\"!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: błąd - oczekiwana nazwa komputera po opcji \"-H\"!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: błąd - oczekiwana nazwa komputera po opcji \"-h\"!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: błąd - oczekiwana lista trybów po opcji \"-y\"!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: błąd - oczekiwana nazwa po opcji \"-%c\"!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: błąd - oczekiwany łańcuch tekstowy opcji po opcji \"-o\"!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: błąd - oczekiwana lista stron po opcji \"-P\"!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: błąd - oczekiwany priorytet po opcji \"-%c\"!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: błąd - oczekiwany tekst przyczyny po opcji \"-r\"!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: błąd - oczekiwany tytuł po opcji \"-t\"!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: błąd - oczekiwana nazwa użytkownika po opcji \"-U\"!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: błąd - oczekiwana nazwa komputera po opcji \"-u\"!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: błąd - oczekiwana wartość po opcji \"-%c\"!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: błąd - wymagane jest \"completed\", \"not-completed\" lub \"all\" po -" +#~ "W!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: błąd - brak dostępnego domyślnego celu.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: błąd - priorytet musi być między 1 a 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: błąd - planista nie odpowiada!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: błąd - za dużo plików - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: błąd - nie można uzyskać dostępu do \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: błąd - nie można wykonać kolejki z stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: błąd - nieznany cel \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: błąd - nieznany cel \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: błąd - nieznana opcja \"%c\"!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: błąd - nieznana opcja '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: oczekiwany ID zlecenia po opcji \"-i\"!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: filtr \"%s\" jest niedostępny: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: nieprawidłowa nazwa celu na liście \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: nieprawidłowy łańcuch filtra \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: wymagany jest ID zlecenia (\"-i id_zlecenia\") po \"-H restart\"!" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: brak filtra do konwersji z %s/%s na %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: operacja nie powiodła się: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: niestety, nie wkompilowano obsługi szyfowania!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: nie można połączyć się z serwerem\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: nie można skontaktować się z serwerem!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: nie można określić typu MIME \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: nie można otworzyć %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: nie można otworzyć %s - %s on line %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: nie można otworzyć %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: nie można otworzyć pliku PPD: %s on line %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: nie można odczytać bazy danych MIME z \"%s\" lub \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: nieznany cel \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: nieznany cel rodzaju MIME %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: nieznana opcja \"%c\"!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: nieznane źródło rodzaju MIME %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: ostrzeżenie - modyfikator formatu \"%c\" jest nieobsługiwany - " +#~ "wyjście może nie być prawidłowe!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: ostrzeżenie - opcja zestawu znaków została zignorowana!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: ostrzeżenie - opcja rodzaju zawartości została zignorowana!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: ostrzeżenie - opcja formularza została zignorowana!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: ostrzeżenie - opcja trybu została zignorowana!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: błąd - %s nazw zmiennych środowiskowych z nieistniejącym celem \"%s" +#~ "\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: błąd - oczekiwana opcja=wartość po opcji \"-o\"!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: błąd - brak dostępnego domyślnego celu.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI (szarości)" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Nieprawidłowe, nieznane polecenie pomocy\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Hasło Samby jest wymagany, aby wyeksportować sterowniki drukarek!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Nazwa użytkownika Samby jest wymagana, aby wyeksportować sterowniki " +#~ "drukarek!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Klasa o nazwie \"%s\" już istnieje!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Drukarka o nazwie \"%s\" już istnieje!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (oversize)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (oversize)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (mały)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (oversize)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Próba ustawienia błędnej wartości %2$d printer-state %1$s!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Grupy właściwości są nieuporządkowane (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Błędny URI urządzenia \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Błędne device-uri \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Błędny schemat device-uri \"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Błędne document-format \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Błędny bufor nazwy pliku!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Błędny atrybut czcionki: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Błędna wartość job-priority!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Błędna wartość job-sheets \"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Błędny rodzaj wartości job-sheets!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Błędna wartość job-state!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Błędna właściwość job-uri \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Błędne notify-pull-method \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Błędne notify-recipient-uri URI \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Błędna opcja + wybór w wierszu %d!\n" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Błędne port-monitor \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Błędna wartość printer-state %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Błędny numer wersji żądania %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Błędne ID subskrypcji." + +#~ msgid "C0 Envelope" +#~ msgstr "Koperta C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Koperta C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Koperta C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Koperta C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Koperta C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Koperta C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Koperta C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Koperta C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Koperta C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Zestaw znaków \"%s\" jest nieobsługiwany!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Koperta Chou3" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Koperta Chou4" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Polecenia mogą być skracane. Poleceniami są:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Nie można przeskanować rodzaju \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Pokrywa jest otwarta." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "Koperta DL" + +#~ msgid "Developer almost empty." +#~ msgstr "Wywoływacz jest niemal pusty." + +#~ msgid "Developer empty!" +#~ msgstr "Wywoływacz jest pusty!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Urządzenie: uri = %s\n" +#~ " klasa = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " lokalizacja = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokument %d nie znaleziony w zleceniu %d." + +#~ msgid "Door open." +#~ msgstr "Drzwi otwarte." + +#~ msgid "Double Postcard" +#~ msgstr "Podwójna pocztówka" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Nie można przydzielić pamięci dla informacji strony: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Nie można przydzielić pamięci dla tablicy stron: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: znaleziono nieprawidłowy komentarz %%BoundingBox:!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: nieprawidłowy komentarz %%IncludeFeature:!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: nieprawidłowy komentrza %%Page: w pliku!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: nieprawidłowy komentarz %%PageBoundingBox: w pliku!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Błędny plik urządzenia SCSI \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: nieprawidłowy plik zestawu znaków %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: nieprawidłowy rodzaj zestawu znaków %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: nieprawidłowa wartość kolumn %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: nieprawidłowa wartość cpi %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: nieprawidłowy wiersz opisu czcionki: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: nieprawidłowa wartość lpi %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: nieprawidłowe ustawienie strony!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: nieprawidłowy kierunek tekstu %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: nieprawidłowa szerokość tekstu %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: docelowa drukarka nie istnieje!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: znaleziono wielokrotny komentarz %%BoundingBox:!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: znaleziono wielokrotny komentarz %%Pages:!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: pusty plik druku!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: błąd %d podczas wysyłania żądania PAPSendData: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: spodziewany cytowany znak w linii %d w %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: błąd krytyczny USB!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: znaleziono nieprawidłowy komentarz HP-GL/2, nie można wydrukować " +#~ "pliku!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: brakujący %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: brakujący %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: brak URI urządzenia w wierszu poleceń i zmiennej środowiska " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: brakująca wartość w linii %d pliku bannera!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: potrzebna linia msgid przed ciągami tłumaczeń w linii %d w %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: brak komentarza %%BoundingBox: w nagłówku!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: brak komentarza %%Pages: w nagłówku!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: nie znaleziono URI urządzenia w argv[0] lub w zmiennej środowiska " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: brak czcionek w pliku zestawu znaków %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: nie znaleziono żadnych stron!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: brak papieru!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: zmienna środowiska PRINTER nie została określona!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: plik wydruku nie został zaakceptowany (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: drukarka nie odpowiada\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: drukarka nie odpowiada!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: drukarka wysłała niespodziewany EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: serwer zdalny nie zaakceptował pliku kontrolnego (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: serwer zdalny nie zaakceptował pliku danych (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: wystąpił błąd upływu limitu czasu podczas wysyłania danych do " +#~ "drukarki\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: nie można dodać pliku %d do zlecenia: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: nie można anulować zlecenia %d: %s/n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: nie można skopiować pliku PDF" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: nie można utworzyć gniazda" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: nie można utworzyć skompresowanego tymczasowego pliku wydruku: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: nie można utworzyć pliku tymczasowego" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: nie można utworzyć pliku tymczasowego - %s\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: nie można utworzyć pliku tymczasowego: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: nie można wykonać pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: nie można wykonać programu gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: nie można wykonać programu pdftops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: nie można rozdzielić pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: nie można uzyskać żądania PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: nie można uzyskać odpowiedzi PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: brak pliku PPD dla drukarki \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: nie można uzyskać domyślnej strefy AppleTalk" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: nie można uzyskać cech zlecenia %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: nie można uzyskać stanu drukarki (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: nie można znaleźć drukarki \"%s\"!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: nie można wyszukać odpowiedzi PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: nie można znaleźć drukarek AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: nie można utworzyć adresu AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: nie można otworzyć \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: nie można otworzyć %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku bannera \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku urządzenia \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: nie można otworzyć do druku pliku obrazka!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku wydruku \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku wydruku %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: nie można otworzyć pliku wydruku %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: nie można otworzyć tymczasowego skompresowanego pliku wydruku: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: nie można otworzyć pliku tymczasowego" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: nie można wydrukować %d łamów tekstu!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: nie można wydrukować %dx%d strony tekstu!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: nie można odczytać danych druku" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: nie można odczytać danych druku!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: nie można zarezerwować portu" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: nie można przejść do wiersza %ld w pliku - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: nie można przejść do wiersza %lld w pliku - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: nie można wysłać polecenia LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: nie można wysłać żądania PAP tickle" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: nie można wysłać początkowego żądania wysyłania danych PAP" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: nie można wysłać danych drukowania (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: nie można wysłać danych druku!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: nie można wysłać pliku do drukarki" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: nie można wysłać początkowego zera do drukarki" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: nie można czekać na pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: nie można zapisać %d bajtów do \"%s\":%s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: nie można zapisać %d bajtów do drukarki!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: nie można zapisać pliku kontrolnego" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: nie można zapisać danych druku" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: nie można zapisać danych druku: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: nie można zapisać zrastrowanych danych do sterownika!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: nie można zapisać do pliku tymczasowego" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: nie można zapisać nieskompresowanych danych dokumentu: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: niespodziewany tekst w linii %d w %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: nieznana wartość opcji szyfrowania \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: nieznany porządek plików \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: nieznany znak formatujący \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: nieznany format katalogu wiadomości \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: nieznana opcja \"%s\" o wartości \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: nieznany tryb druku \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: nieznana wartość opcji wersji \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: nieobsługiwana wartość jasności %s, korzystam z jasności=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: nieobsługiwana wartość gamma %s, korzystam z gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: nieobsługiwana wartość liczby kopii %d, korzystam z liczby " +#~ "kopii=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: nieobsługiwana liczba powtórzeń makiety %s, korzystam z liczby " +#~ "powtórzeń makiety=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: nieobsługiwana wartość ramki strony %s, korzystam z ramki " +#~ "strony=brak!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: wykryto przepełnienie doc_printf (%d bajtów), przerywam!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: filtr pdftops przerwał działanie po sygnale %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: filtr pdftops zakończył działanie ze stanem %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: zakończono pictwpstops po sygnale %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: zakończono pictwpstops ze stanem %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: usuwalny: nie można się połączyć z drukarką; ponowienie próby " +#~ "nastąpi za 30 sekund…\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: nieudane select()" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: nie można utworzyć statusu pliku drukowania" + +#~ msgid "Empty PPD file!" +#~ msgstr "Pusty plik PPD!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Błąd: wymagana jest nazwa serwera po opcji \"-h\"!\n" + +#~ msgid "FAIL\n" +#~ msgstr "PROBLEM\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "URI pliku urządzenia zostało wyłączone! Aby włączyć, zobacz dyrektywę " +#~ "FileDevice w \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Wysoka temperatura wygrzewacza!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Niska temperatura wygrzewacza!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Otrzymano właściwość printer-uri, ale bez job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk wyłączone w Preferencjach systemowych\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk wyłączone w Preferencjach systemowych.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: przerywam zlecenie drukowania…\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: połączony z drukarką...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: łączę z drukarką...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: udane wysłanie pliku kontrolnego\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: udane wysłanie pliku danych\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: formatuję stronę %d…\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: wczytuję plik obrazka…\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: szukam drukarki...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: otwieram połączenie\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: wysłano plik drukowania, czekam na zakończenie pracy drukarki…\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: drukarka jest zajęta; ponowię próbę za 10 sekund…\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: drukarka jest zajęta; ponowię próbę za 30 sekund…\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: drukarka jest zajęta; ponowę próbę za 5 sekund…\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: drukarka nie obsługuje IPP/%d.%d, próbuję IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: drukarka jest zajęta; ponowię próbę za 5 sekund…\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: drukarka jest wyłączona.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: drukarka nie jest obecnie w trybie gotowości.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: drukarka jest w trybie gotowości.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: drukarka nie jest w trybie gotowości.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: drukarka nie jest podłączona; ponowię próbę za 30 sekund…\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: drukuję stronę %d, %d%% zakończonych…\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: drukuję stronę %d…\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: gotowy do drukowania.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: wysyłam plik kontrolny (%lu bajtów)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: wysyłam plik kontrolny (%u bajtów)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: wysyłam dane\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: wysyłam plik danych (%ld bajtów)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: wysyłam plik danych (%lld bajtów)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: wysyłam dane wydruku...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: wysyłam plik drukowania, %ld bajtów…\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: wysyłam plik drukowania, %lld bajtów…\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Składuję zlecenie LPR, %.0f%% zakończono…\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: nie można skontaktować się z drukarką, ustawiam w kolejce następnej " +#~ "drukarki tej klasy…\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: używam domyślnej strefy AppleTalk \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: czekam na zakończenie zlecenia…\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: czekam, aż drukarka stanie się dostępna...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "Koperta ISO B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (Oversize)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "Koperta ISO B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "Koperta ISO B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tusz lub toner jest niemal pusty." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tusz lub toner skończył się!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Zbiornik zużytego atramentu lub tonera jest niemal pełny." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Zbiornik zużytego atramentu lub tonera jest pełny!" + +#~ msgid "Interlock open." +#~ msgstr "Rygiel jest otwarty." + +#~ msgid "Invite Envelope" +#~ msgstr "Koperta zaproszenia" + +#~ msgid "Italian Envelope" +#~ msgstr "Koperta włoska" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Zlecenie #%d nie może zostać ponownie uruchomione - brak plików!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Zlecenie #%d nie istnieje!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Zlecenie #%d zostało zakończone i nie może zostać zmienione!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Zlecenie #%d nie zostało zakończone!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Zlecenie #%d nie zostało wstrzymane do uwierzytelnienia!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Zlecenie #%d nie zostało wstrzymane!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Zlecenie #%s nie istnieje!" + +#~ msgid "Job %d not found!" +#~ msgstr "Nie znaleziono zlecenia %d!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Subskrypcje zlecenia nie mogą zostać ponowione!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Koperta Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Koperta Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Język \"%s\" jest nieobsługiwany!" + +#~ msgid "Media jam!" +#~ msgstr "Zacięcie nośnika!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Podajnik nośnika jest niemal pusty." + +#~ msgid "Media tray empty!" +#~ msgstr "Podajnik nośnika jest pusty!" + +#~ msgid "Media tray missing!" +#~ msgstr "Brak podajnika nośnika!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Trzeba napełnić podajnik nośnika." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Brakujący atrybut document-number!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Brakujący cudzysłów w wierszu %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Brakująca zmienna formularza!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Brakująca cecha notify-subscription-ids!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Brakuje cecha requesting-user-name!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Brakuje wymaganych cech!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Brakująca wartość w wierszu %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Koperta Monarch" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: zaakceptowano plik druku - ID zlecenia %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: zaakceptowano plik drukowania - nieznane ID zlecenia.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Brak nazwy PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Brak zainstalowanych sterowników drukarek dla Windows!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Brak aktywnych zadań na %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Brak cech w żądaniu!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Nie dostarczono informacji o uwierzytelnianiu!" + +#~ msgid "No default printer" +#~ msgstr "Brak domyślnej drukarki" + +#~ msgid "No file!?!" +#~ msgstr "Brak pliku?!?" + +#~ msgid "No modification time!" +#~ msgstr "Brak czasu zmiany!" + +#~ msgid "No printer name!" +#~ msgstr "Brak nazwy drukarki!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Nie znaleziono printer-uri dla tej klasy!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Nie znaleziono printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Żądanie nie zawiera printer-uri!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Brak cech subskrypcji w żądaniu!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC jest niemal zużyty." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC jest zużyty!" + +#~ msgid "Out of toner!" +#~ msgstr "Brak tonera!" + +#~ msgid "Output bin almost full." +#~ msgstr "Odbiornik jest niemal pełny." + +#~ msgid "Output bin full!" +#~ msgstr "Odbiornik jest pełny!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Wyjście dla drukarki %s zostało wysłane do %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Wyjście dla drukarki %s zostało wysłane do zdalnej drukarki %s na %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Wyjście dla drukarki %s/%s zostało wysłane do %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Wyjście dla drukarki %s/%s zostało wysłane do zdalnej drukarki %s na %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Brak odbiornika!" + +#~ msgid "PASS\n" +#~ msgstr "SUKCES\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Koperta PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Koperta PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Koperta PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Koperta PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (oversize)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Koperta PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Koperta PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Koperta PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Koperta PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Koperta PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Koperta PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Koperta osobista" + +#~ msgid "Printer offline." +#~ msgstr "Drukarka nie gotowa." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Kolejność Właściciel Zlecenie Pliki " +#~ "Całkowity rozmiar\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Kolejność Właściciel Drukowanie Zlecenie " +#~ "Pliki Całkowity rozmiar\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Uruchamiam polecenie: %s %s -N -A %s -c \"%s\"\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Drukarka SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (oversize)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Wartość notify-user-data jest za duża (%d > 63 oktety)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Drukarka lub klasa nie jest udostępniana!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Drukarka lub klasa nie została znaleziona." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Wymagana jest cecha printer-uri!" + +#~ msgid "Toner low." +#~ msgstr "Niski poziom tonera." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Zbyt wiele wartości job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Zbyt wiele wartości printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (Oversize)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (Oversize)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (Small)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Nie można dodać zlecenia do celu \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Nie można przydzielić pamięci dla rodzaju plików!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Nie można skopiować 64 bitowych plików sterowników drukarek CUPS (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Nie można skopiować 64 bitowych plików sterowników drukarek Windows (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Nie można skopiować plików sterowników drukarek CUPS (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Nie można skopiować pliku PPD - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Nie można skopiować pliku PPD!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Nie można skopiować plików sterowników drukarek Windows 2000 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Nie można skopiować plików sterowników drukarek Windows 9x (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Nie można skopiować skryptu interfejsu - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Nie można utworzyć printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Nie można zmienić plików cupsd.conf większych niż 1MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Nie można znaleźć celu dla zlecenia!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Nie można znaleźć drukarki!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Nie można zainstalować plików sterowników drukarek Windows 2000 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Nie można zainstalować plików sterowników drukarek Windows 9x (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Nie można otworzyć dokumentu %d w zleceniu %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Nie można uruchomić \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Nie można wysłać polecenia do sterownika drukarki!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Nie można ustawić sterownika drukarki Windows (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Nie można użyć starszego sterownika USB!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Nieznany błąd drukarki (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Nieobsługiwany zestaw znaków \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Nieobsługiwana kompresja \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Nieobsługiwana cecha kompresji %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Nieobsługiwany format \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Nieobsługiwany format \"%s\"!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Nieobsługiwany format \"%s/%s\"!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Użycie:\n" +#~ "\n" +#~ " lpadmin [-h serwer] -d cel\n" +#~ " lpadmin [-h serwer] -x cel\n" +#~ " lpadmin [-h serwer] -p drukarka [-c dodaj-klasę] [-i interfejs] [-m " +#~ "model]\n" +#~ " [-r usuń-klasę] [-v urządzenie] [-D opis]\n" +#~ " [-P plik-ppd] [-o nazwa=wartość]\n" +#~ " [-u zezwól:użytkownik,użytkownik] [-u zabroń:" +#~ "użytkownik,użytkownik]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Użycie: %s zlecenie użytkownik tytuł liczba_kopii opcje [plik]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Użycie: %s id_zlecenia użytkownik tytuł liczba_kopii opcje [plik]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Użycie: %s id_zlecenia użytkownik tytuł liczba_kopii opcje plik\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Użycie: convert [ opcje ]\n" +#~ "\n" +#~ "Opcje:\n" +#~ "\n" +#~ " -f plik Wybiera plik do konwersji (gdy pominięte, przyjmuje " +#~ "stdin)\n" +#~ " -o plik Wybiera plik do wygenerowania (gdy pominięte, " +#~ "przyjmuje stdout)\n" +#~ " -i typ/MIME Typ MIME na wejściu (gdy pominięte, przyjmowany " +#~ "automatycznie)\n" +#~ " -j typ/MIME Typ MIME na wyjściu (gdy pominięte, przyjmowany " +#~ "application/pdf)\n" +#~ " -P plik.ppd Plik PPD\n" +#~ " -a 'nazwa=wartość ...' Wybiera opcje\n" +#~ " -U użytkownik Wybiera nazwę użytkownika dla zlecenia\n" +#~ " -J tytuł Ustala tytuł\n" +#~ " -c kopie Ustala liczbę kopii\n" +#~ " -u Usuń plik PPD po zakończeniu\n" +#~ " -D Usuń plik wejściowy po zakończeniu\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Użycie: cupsaddsmb [opcje] drukarka1 ... drukarkaN\n" +#~ " cupsaddsmb [opcje] -a\n" +#~ "\n" +#~ "Opcje:\n" +#~ " -E Szyfruj połączenie z serwerem\n" +#~ " -H serwer_samba Użyj nazwy serwera SAMBA\n" +#~ " -U użytkownik_samba Uwierzytelnienie nazwą użytkownika SAMBA\n" +#~ " -a Eksportuj wszystkie drukarki\n" +#~ " -h serwer_cups Użyj nazwy serwera CUPS\n" +#~ " -v Podgląd (wyświetla polecenia)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Użycie: cupsctl [opcje] [param=wartość ... paramN=wartośćN]\n" +#~ "\n" +#~ "Opcje:\n" +#~ "\n" +#~ " -E Włącz szyfrowanie\n" +#~ " -U nazwa_użytkownika Określ nazwę użytkownika\n" +#~ " -h serwer[:port] Określ adres serwera\n" +#~ "\n" +#~ " --[no-]debug-logging Włącz lub wyłącz dziennik błędów\n" +#~ " --[no-]remote-admin Włącz lub wyłącz zdalną administrację\n" +#~ " --[no-]remote-any Pozwól lub zabroń dostęp przez Internet\n" +#~ " --[no-]remote-printers Pokaż lub ukryj zdalne drukarki\n" +#~ " --[no-]share-printers Włącz lub wyłącz udostępnianie drukarek\n" +#~ " --[no-]user-cancel-any Pozwól lub zabroń użytkownikom anulowanie " +#~ "dowolnego zlecenia\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Użycie: cupsd [-c plik-konfiguracji] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c plik-konfiguracji Wczytuje alternatywny plik konfiguracji\n" +#~ "-f Uruchamia na pierwszym planie\n" +#~ "-F Uruchamia na pierwszym planie, ale odłączone\n" +#~ "-h Wyświetla wiadomości o użyciu\n" +#~ "-l Uruchamia cupsd z launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Użycie: cupsfilter -m typ/mime [ opcje ] plik\n" +#~ "\n" +#~ "Opcje:\n" +#~ "\n" +#~ " -c cupsd.conf Wybiera plik cupsd.conf do użycia\n" +#~ " -j job-id[,N] Filtruje plik N z podanego zlecenia (domyślnie plik " +#~ "1)\n" +#~ " -n kopie Ustala liczbę kopii\n" +#~ " -o nazwa=wartość Ustala opcje\n" +#~ " -p plik.ppd Wybiera plik PPD\n" +#~ " -t tytuł Ustala tytuł\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Użycie: cupstestdsc [opcje] nazwapliku.ps [... nazwapliku.ps]\n" +#~ " cupstestdsc [opcje] -\n" +#~ "\n" +#~ "Opcje:\n" +#~ "\n" +#~ " -h Wyświetla użycie programu\n" +#~ "\n" +#~ " Uwaga: ten program sprawdza tylko komentarze DSC, nie PostScriptowe.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Użycie: cupstestppd [options] plik1.ppd[.gz] [... plikN.ppd[.gz]]\n" +#~ " program | cupstestppd [opcje] -\n" +#~ "\n" +#~ "Opcje:\n" +#~ "\n" +#~ " -R katalog-główny Ustala inny katalog główny\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Zwraca ostrzeżenia zamiast błędów\n" +#~ " -q Działa bez komunikatów\n" +#~ " -r Używaj trybu otwarcia relaxed\n" +#~ " -v Mniej komunikatów\n" +#~ " -vv Dużo komunikatów\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Użycie: lpmove zlecenie/źródło cel\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Użycie: lpoptions [-h serwer] [-E] -d drukarka\n" +#~ " lpoptions [-h serwer] [-E] [-p drukarka] -l\n" +#~ " lpoptions [-h serwer] [-E] -p drukarka -o opcja[=wartość] ...\n" +#~ " lpoptions [-h serwer] [-E] -x drukarka\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Użycie: lppasswd [-g nazwagrupy]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Użycie: lppasswd [-g nazwagrupy] [nazwaużytkownika]\n" +#~ " lppasswd [-g nazwagrupy] -a [nazwaużytkownika]\n" +#~ " lppasswd [-g nazwagrupy] -x [nazwaużytkownika]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Użycie: lpq [-P cel] [-U nazwaużytkownika] [-h nazwakomputera[:port]] [-" +#~ "l] [+przerwanie]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Użycie: ppdc [opcje] plik.drv [ ... plikN.drv ]\n" +#~ "Opcje:\n" +#~ " -D nazwa=wartość Przypisuje wartość nazwanej zmiennej.\n" +#~ " -I katalog-dołączeń Dodaje katalog do ścieżki wyszukiwania.\n" +#~ " -c katalog.po Wczytuje podany katalog komunikatów.\n" +#~ " -d katalog-wyjściowy Wybiera katalog wyjściowy.\n" +#~ " -l język[,język,...] Ustala języki wyjścia (locale).\n" +#~ " -m Używa nazwy ModelName jako nazwy pliku.\n" +#~ " -t Testuje pliki PPD zamiast je generować.\n" +#~ " -v Dodatkowe informacje (im więcej opcji v, tym " +#~ "więcej informacji).\n" +#~ " -z Kompresuje plik PPD za pomocą GNU zip.\n" +#~ " --cr Znaki końca wiersza to CR (Mac OS 9).\n" +#~ " --crlf Znaki końca wiersza to CR+LF (Windows).\n" +#~ " --lf Znaki końca wiersza to LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Użycie: ppdhtml [opcje] plik.drv >plik.html\n" +#~ " -D nazwa=wartość Przypisuje wartość nazwanej zmiennej.\n" +#~ "Opcje:\n" +#~ " -I katalog-dołączeń Dodaje katalog do ścieżki wyszukiwania.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Użycie: ppdi [opcje] plik.ppd [ ... plikN.ppd ]\n" +#~ "Opcje:\n" +#~ " -I katalog-dołączeń\n" +#~ " -o plik.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Użycie: ppdmerge [opcje] plik.ppd [ ... plikN.ppd ]\n" +#~ "Opcje:\n" +#~ " -o plik.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Użycie: ppdpo [opcje] -o plik.po plik.drv [ ... plikN.drv ]\n" +#~ "Opcje:\n" +#~ " -D nazwa=wartość Przypisuje nazwanej zmiennej podaną wartość.\n" +#~ " -I katalog-dołączeń Dodaje katalog do ścieżki wyszukiwania.\n" +#~ " -v Dodatkowe informacje (im więcej opcji v, tym więcej " +#~ "informacji).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Użycie: snmp [serwer_lub_adres_ip]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: dodaję tylko pierwszych %d znalezionych drukarek" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: dla opcji waiteof oczekiwano wartości logicznej \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: nie można odczytać żądania z kanału bocznego!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Opcja \"%s\" nie może zostać dołączona za pomocą " +#~ "IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: drukarka nie odpowiada\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: drukarka wysłała niespodziewany EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Serwer zdalny nie odpowiada bajtem statusu polecenia po %d " +#~ "sekundach!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: zdalny serwer nie odpowiada bajtem statusu kontroli po %d " +#~ "sekundach!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: zdalny serwer nie odpowiada bajtem statusu danych po %d " +#~ "sekundach!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: Upłynął czas oczekiwania polecenia SCSI (%d); ponawiam…\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Ten dokument nie jest zgodny z Konwencją struktury dokumentu " +#~ "Adobe i może nie zostać wydrukowany prawidłowo!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: nie można otworzyć \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: nie da się wysłać żądania statusu PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: niespodziewany pakiet PAP typu %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: nieznany pakiet PAP typu %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Nieznany wybór \"%s\" dla opcji \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Nieznana opcja \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Nieobsługiwana częstotliwość bodów %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: spodziewana liczba dla opcji statusu \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: usuwalny: Serwer sieciowy '%s' jest zajęty; ponowię za %d " +#~ "sekund...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Ostrzeżenie, brak zainstalowanych sterowników drukarek Windows 2000!" + +#~ msgid "You4 Envelope" +#~ msgstr "Koperta You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "convert: użyj opcji -f, aby wskazać plik do konwersji.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: brak pliku PPD dla drukarki \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: nie można się połączyć z serwerem: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Nieznana opcja \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Nieznana opcja \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: oczekiwana nazwa pliku konfiguracji po opcji \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: nie da się uzyskać bieżącego katalogu!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: nieznany argument \"%s\" - przerywam!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: nieznana opcja \"%c\" - przerywam!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: obsługa launchd(8) nie została wkompilowana, uruchamianie w " +#~ "normalnym trybie.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: nieprawidłowy numer dokumentu %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: nieprawidłowy kod zlecenia %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Może być określona tylko jedna nazwa pliku!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: nie udało się utworzyć pliku tymczasowego: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: nie da się uzyskać pliku zlecenia - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: opcja -q jest niezgodna z opcją -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: opcja -v jest niezgodna z opcją -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "urządzenie dla %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "urządzenie dla %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tpomoc na temat poleceń\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Brakuje cechy job-printer-uri!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: nazwa klasy może zawierać tylko drukowalne znaki!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: oczekiwany PPD po opcji \"-P\"!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: oczekiwane allow/deny:userlist po opcji \"-u\"!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: oczekiwana klasa po opcji \"-r\"!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: oczekiwana nazwa klasy po opcji \"-c\"!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: oczekiwany opis po pocji \"-D\"!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: oczekiwane URI urządzenia po opcji \"-v\"!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: oczekiwane typy plików po opcji \"-I\"!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: oczekiwana nazwa komputera po opcji \"-h\"!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: oczekiwany interfejs po opcji \"-i\"!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: oczekiwane położenie po opcji \"-L\"!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: oczekiwany model po opcji \"-m\"!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: oczekiwana nazwa=wartość po opcji \"-o\"!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: oczekiwana drukarka po opcji \"-p\"!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: oczekiwana nazw drukarki po opcji \"-d\"!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: oczekiwana drukarka lub klasa po opcji \"-x\"!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: nie zobaczono żadnych nazw elementów!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: drukarka %s jest już elementem klasy %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: drukarka %s nie jest elementem klasy %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: nazwa drukarki może zawierać tylko drukowalne znaki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można dodać drukarki do klasy:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: nie można połączyć się do serwera: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: nie można utworzyć pliku tymczasowego - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: nie można utworzyć pliku tymczasowego: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: nie można otworzyć pliku PPD \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: nie można otworzyć pliku \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można usunąć drukarki z klasy:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić pliku PPD:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić URI urządzenia:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić skryptu interfejsu lub pliku PPD:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić skryptu interfejsu:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić położenia drukarki:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: nie można ustawić opcji drukarki:\n" +#~ " Najpierw musi zostać określona nazwa drukarki!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: nieznana opcja zezwól/zabroń \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: nieznany argument \"%s\"!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: nieznana opcja \"%c\"!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "" +#~ "lpadmin: ostrzeżenie - lista rodzajów zawartości została zignorowana!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: po --device-id spodziewany jest ciąg ID urządzenia 1284!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: po --language spodziewany jest język!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: po --make-and-model spodziewana jest marka i model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "" +#~ "lpinfo: po --product spodziewany jest ciąg identyfikujący producenta!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: po --exclude-schemes spodziewana jest lista schematów!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: po --include-schemes spodziewana jest lista schematów!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: po --timeout spodziewany jest limit czasu!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: nieznany argument \"%s\"!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: nieznana opcja \"%c\"!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: nieznana opcja '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: nie można połączyć się z serwerem: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: nieznany argument \"%s\"!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: nieznana opcja \"%c\"!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: brak drukarek?!?\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: nie można dodać drukarki lub przykładu: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: nie można otworzyć pliku PPD dla %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: nie można otworzyć pliku PPD dla %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: nieznana drukarka lub klasa!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: tylko root może dodać lub usunąć hasła!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: plik hasła jest zajęty!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: plik hasła nie został zaktualizowany!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: przepraszam, hasła się nie zgadzają!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: przepraszam, hasło zostało odrzucone.\n" +#~ "Hasło musi mieć co najmniej 6 znaków, nie może zawierać nazwy\n" +#~ "użytkownika i musi zawierać co najmniej jedną literę i liczbę.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: przepraszam, hasła się nie zgadzają!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: nie można skopiować łańcucha hasła: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: nie można otworzyć pliku hasła: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: nie można zapisać do pliku hasła: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: utworzenie kopii zapasowej starego pliku hasła nie powiodło " +#~ "się: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: zmiana nazwy pliku hasła nie powiodła się: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: użytkownik \"%s\" i grupa \"%s\" nie istnieją.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: błąd - %s nazw zmiennych środowiskowych z nieistniejącym celem \"%" +#~ "s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "elementy klasy %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "brak wpisów\n" + +#~ msgid "no system default destination\n" +#~ msgstr "brak domyślnego celu systemowego\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-even jest nieokreślone!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" jest już użyte!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "URI notify-recipient-uri \"%s\" wykorzystuje nieznany schemat!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "%d notify-subscription-id nie dobre!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: dodaję katalog dołączeń \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: dodaję/uaktualniam tekst UI z %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: nieprawidłowa wartość logiczna (%s), linia %d w %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowa nazwa rozdzielczości \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowe słowo kluczowe statusu %s, linia %d w %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: nieprawidłowe zastąpienie zmiennej ($%c), linia %d w %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: w linii %d %s jest wybór bez opcji!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: powielone #po dla %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest definicja filtra!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa programu!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest wartość logiczna.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewany jest zestaw znaków po Font!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: w linii %d %s spodziewany jest kod wyboru.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa/tekst wyboru.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewana jest kolejność kolorów dla ColorModel!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewana jest przestrzeń kolorów dla ColorModel!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest kompresja dla ColorModel!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewany ciąg ograniczenia dla UIConstraints!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewane słowo kluczowe określające typ sterownika " +#~ "po DriverType!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewany jest typ druku obustronnego po Duplex!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewane jest kodowanie po Font!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa pliku po #po dla %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa grupy/tekst.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa dołączanego pliku.\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest liczba całkowita.\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: spodziewane jest locale po #po dla, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po FileName, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po Font, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po Manufacturer, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po MediaSize, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po ModelName, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa po PCFileName, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa/tekst po %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa/tekst po Installable, linia %d w %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest nazwa/tekst po Resolution, linia %d w %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziewana jest kombinacja nazwa/tekst dla " +#~ "ColorModel!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa opcji/tekst.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest nazwa opcji/tekst.\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewany jest typ opcji/tekst.\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: spodziewane jest pole zastąpienia po Resolution, linia %d w %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewana jest liczba rzeczywista.\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziwana jest rozdzielczość/typ nośnika po " +#~ "ColorProfile!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: w linii %d %s spodziwana jest rozdzielczość/typ nośnika po " +#~ "SimpleColorProfile!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: spodziewany jest wybieracz po %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: spodziewany jest status po Font, linia %d w %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: spodziewany jest ciąg znaków po Copyright, linia %d w %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: spodziewany jest ciąg znaków po Version, linia %d w %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s spodziewane są dwie nazwy opcji!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest wartość po %s, linia %d w %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: spodziewana jest wersja po Fon, linia %d w %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: nieprawidłowa nazwa pliku #include/#po \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowy koszt filtru w linii %d %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowy typ MIME dla filtru w linii %d %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: nieprawidłowa pusta nazwa programu dla filtru w linii %d %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowy wybór opcji \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nieprawidłowy typ opcji \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: wczytuję plik informacyjny sterownika \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: wczytuję komunikaty locale \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: wczytuję komunikaty z \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: na końcu \"%s\" brakuje #endif!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s brakuje #if!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: brak katalogu komunikatów w locale %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: opcja %s zdefiniowana ponownie jako inny typ, linia %d w %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: ograniczenie opcji wymaga *name w linii %d %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: w linii %d %s jest zbyt dużo zagnieżdżonych instrukcji #if!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: nie można utworzyć pliku PPD \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: nie można utworzyć katalogu wyjścia %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: nie można utworzyć potoku wyjścia: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: nie można wykonać cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: nie można znaleźć pliku #po %s, linia %d w %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nie można znaleźć pliku dołączenia \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: nie można znaleźć lokalizacji dla \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: nie można wczytać lokalizacji dla \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: niezdefiniowana zmienna (%s), linia %d w %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: nieznany typ sterownika %s, linia %d w %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nieznany typ obustronny \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nieznana wielkość nośnika \"%s\", linia %d w %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: nieznany znacznik \"%s\", linia %d w %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: nieznane znaki wiodące w liczbie rzeczywistej \"%s\", linia %d w %" +#~ "s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: niezakończony ciąg znaków, rozpoczynający się od %c, linia %d w %" +#~ "s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: zapisuję %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: zapisuję pliki PPD do katalogu \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: nieprawidłowa wersja LanguageVersion \"%s\" w %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: ignoruję plik PPD %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: nie można wykonać kopii zapasowej %s w %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "drukarka %s jest wyłączona od %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "drukarka %s jest bezczynna. włączona od %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "drukarka %s drukuje teraz %s-%d. włączona od %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "drukarka %s/%s jest wyłączona od %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "drukarka %s/%s jest bezczynna. włączona od %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "drukarka %s/%s drukuje teraz %s-%d. włączona od %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "ID żądania to %s-%d (%d plików)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "planista nie jest uruchomiony" + +#~ msgid "scheduler is running\n" +#~ msgstr "planista jest uruchomiony\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\twyświetla stan demonów i kolejki\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "domyślny cel systemowy: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "domyślny cel systemowy: %s/%s\n" diff --git a/locale/cups_pt.po b/locale/cups_pt.po new file mode 100644 index 0000000..e60a7d9 --- /dev/null +++ b/locale/cups_pt.po @@ -0,0 +1,8733 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milímetros" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f a %.0f x %.0f milímetros" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f polegadas" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f a %.2f x %.2f polegadas" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "Não é possível alterar %s." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 pol./seg." + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 pol./seg." + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 pol./seg." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/seg." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 pol./seg." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 pol./seg." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/seg." + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/seg." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/seg." + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 pol./seg." + +msgid "2-Sided Printing" +msgstr "Impressão dos 2 lados" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 pol./seg." + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/seg." + +msgid "200 mm/sec." +msgstr "200 mm/seg." + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Série de 24 pinos" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/seg." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 pol./seg." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Disco de 3,5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Disco de 3,5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/seg." + +msgid "300 mm/sec." +msgstr "300 mm/seg." + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 pol./seg." + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/seg." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 pol./seg." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 pol./seg." + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/seg." + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 pol./seg." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 pol./seg." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/seg." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 pol./seg." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Série de 9 pinos" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Aceitar trabalhos" + +msgid "Accepted" +msgstr "Aceite(s)" + +msgid "Add Class" +msgstr "Adicionar classe" + +msgid "Add Printer" +msgstr "Adicionar impressora" + +msgid "Add RSS Subscription" +msgstr "Adicionar subscrição RSS" + +msgid "Address" +msgstr "Endereço" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Endereço - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administração" + +msgid "Always" +msgstr "Sempre" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplicador" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Ponteiro dests NULL inválido" + +msgid "Bad OpenGroup" +msgstr "OpenGroup inválido" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI inválidos" + +msgid "Bad OrderDependency" +msgstr "OrderDependency inválida" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Pedido inválido" + +msgid "Bad SNMP version number" +msgstr "Número de versão SNMP inválido" + +msgid "Bad UIConstraints" +msgstr "UIConstraints inválidas" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Valor de cópias inválido %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Parâmetro personalizado inválido" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Valor number-up inválido %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Valores page-ranges inválidos %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Faixas publicitárias" + +msgid "Billing Information: " +msgstr "Informação de facturação: " + +msgid "Bond Paper" +msgstr "Papel de escritura" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Impressora de etiquetas CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Cancelar subscrição RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Alterar definições" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Classes" + +msgid "Clean Print Heads" +msgstr "Limpar cabeças de impressão" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Cor" + +msgid "Color Mode" +msgstr "Modo de cor" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Nome comunitário com comprimento indefinido" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Continuar" + +msgid "Continuous" +msgstr "Contínuo" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Criação" + +msgid "Created On: " +msgstr "Criação: " + +msgid "Custom" +msgstr "Personalizar" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Cortar" + +msgid "Cutter" +msgstr "Cortador" + +msgid "Dark" +msgstr "Escuro" + +msgid "Darkness" +msgstr "Escurecimento" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Apagar classe" + +msgid "Delete Printer" +msgstr "Apagar impressora" + +msgid "Description: " +msgstr "Descrição: " + +msgid "DeskJet Series" +msgstr "Série DeskJet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Destino \"%s\" não está a aceitar trabalhos." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Suporte térmico directo" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Inactivo" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nome do controlador: " + +msgid "Driver Version: " +msgstr "Versão do controlador: " + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Impressora de etiquetas EPL1" + +msgid "EPL2 Label Printer" +msgstr "Impressora de etiquetas EPL2" + +msgid "Edit Configuration File" +msgstr "Editar ficheiro de configuração" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Terminar faixa publicitária" + +msgid "English" +msgstr "Portuguese" + +msgid "Enter old password:" +msgstr "Introduza palavra-passe antiga:" + +msgid "Enter password again:" +msgstr "Introduza palavra-passe novamente:" + +msgid "Enter password:" +msgstr "Introduza palavra-passe:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Introduza o seu nome de utilizador e palavra-passe ou o nome de utilizador e " +"palavra-passe da raiz para aceder a esta página. Se utilizar a autenticação " +"Kerberos, certifique-se que tem um ticket de Kerberos válido." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Alimentação de envelopes" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Política de Erros" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "A cada 10 etiquetas" + +msgid "Every 2 Labels" +msgstr "A cada 2 etiquetas" + +msgid "Every 3 Labels" +msgstr "A cada 3 etiquetas" + +msgid "Every 4 Labels" +msgstr "A cada 4 etiquetas" + +msgid "Every 5 Labels" +msgstr "A cada 5 etiquetas" + +msgid "Every 6 Labels" +msgstr "A cada 6 etiquetas" + +msgid "Every 7 Labels" +msgstr "A cada 7 etiquetas" + +msgid "Every 8 Labels" +msgstr "A cada 8 etiquetas" + +msgid "Every 9 Labels" +msgstr "A cada 9 etiquetas" + +msgid "Every Label" +msgstr "Todas as etiquetas" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "A expectativa não se concretizou" + +msgid "Export Printers to Samba" +msgstr "Exportar Impressoras para Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Pasta de ficheiros" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Pasta de ficheiros - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Fólio" + +msgid "Forbidden" +msgstr "Proibido" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Geral" + +msgid "Generic" +msgstr "Genérico" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU com comprimento indefinido" + +msgid "Glossy Paper" +msgstr "Papel brilhante" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Níveis de cinzento" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Pasta suspensa" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Pasta suspensa - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Carácter de controlo ilegal" + +msgid "Illegal main keyword string" +msgstr "Cadeia de palavra-chave principal ilegal" + +msgid "Illegal option keyword string" +msgstr "Cadeia de palavra-chave de opção ilegal" + +msgid "Illegal translation string" +msgstr "Cadeia de tradução ilegal" + +msgid "Illegal whitespace character" +msgstr "Carácter de espaço em branco ilegal" + +msgid "Installable Options" +msgstr "Opções instaláveis" + +msgid "Installed" +msgstr "Instalado" + +msgid "IntelliBar Label Printer" +msgstr "Impressora de etiquetas IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Erro interno" + +msgid "Internet Postage 2-Part" +msgstr "Envio pela Internet em 2 partes" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Envio pela Internet em 2 partes - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Envio pela Internet em 3 partes" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Envio pela Internet em 3 partes - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Protocolo de impressão via Internet" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Trabalho #%d já interrompido - impossível cancelar." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Trabalho #%d já cancelado - impossível cancelar." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Trabalho #%d já concluído - impossível cancelar." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Trabalho concluído" + +msgid "Job Created" +msgstr "Trabalho criado" + +msgid "Job ID: " +msgstr "ID do trabalho: " + +msgid "Job Options Changed" +msgstr "Opções de trabalho alteradas" + +msgid "Job Stopped" +msgstr "Trabalho parado" + +msgid "Job UUID: " +msgstr "UUID do trabalho: " + +msgid "Job is completed and cannot be changed." +msgstr "Trabalho concluído; não é possível alterar." + +msgid "Job operation failed:" +msgstr "Operação de trabalho falhou:" + +msgid "Job state cannot be changed." +msgstr "Não é possível alterar o estado do trabalho." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Trabalhos" + +msgid "LPD/LPR Host or Printer" +msgstr "Host ou impressora LPD/LPR" + +msgid "Label Printer" +msgstr "Impressora de etiquetas" + +msgid "Label Top" +msgstr "Parte superior da etiqueta" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Endereço grande" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Endereço grande - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Série PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Claro" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Linha excede máximo permitido (255 caracteres)" + +msgid "List Available Printers" +msgstr "Apresentar impressoras disponíveis" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Localização: " + +msgid "Long-Edge (Portrait)" +msgstr "Margem longa (vertical)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Marca e modelo: " + +msgid "Manual Feed" +msgstr "Alimentação manual" + +msgid "Media Dimensions: " +msgstr "Dimensões do suporte: " + +msgid "Media Limits: " +msgstr "Limites do suporte: " + +msgid "Media Name: " +msgstr "Nome do suporte: " + +msgid "Media Size" +msgstr "Tamanho do suporte" + +msgid "Media Source" +msgstr "Origem do suporte" + +msgid "Media Tracking" +msgstr "Controlo do suporte" + +msgid "Media Type" +msgstr "Tipo de suporte" + +msgid "Medium" +msgstr "Médio" + +msgid "Memory allocation error" +msgstr "Erro de alocação de memória" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Cabeçalho PPD-Adobe-4.x inexistente" + +msgid "Missing asterisk in column 1" +msgstr "Asterisco inexistente na coluna 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Cadeia de valor inexistente" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Modificar classe" + +msgid "Modify Printer" +msgstr "Modificar impressora" + +msgid "Move All Jobs" +msgstr "Mover todos os trabalhos" + +msgid "Move Job" +msgstr "Mover trabalho" + +msgid "Moved Permanently" +msgstr "Mudou-se permanentemente" + +msgid "NULL PPD file pointer" +msgstr "Ponteiro do ficheiro PPD NULL" + +msgid "Name OID uses indefinite length" +msgstr "Nome OID com comprimento indefinido" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Nunca" + +msgid "New Stylus Color Series" +msgstr "Nova série a cores Stylus" + +msgid "New Stylus Photo Series" +msgstr "Nova série fotográfica Stylus" + +msgid "No" +msgstr "Não" + +msgid "No Content" +msgstr "Sem conteúdo" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Sem SEQUÊNCIA VarBind" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Nenhuma ligação activa" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Sem nome comunitário" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Sem destinos adicionados." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Sem error-index" + +msgid "No error-status" +msgstr "Sem error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Sem OID de nome" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Sem request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Sem subscrições." + +msgid "No variable-bindings SEQUENCE" +msgstr "Sem SEQUÊNCIA variable-bindings" + +msgid "No version number" +msgstr "Sem número de versão" + +msgid "Non-continuous (Mark sensing)" +msgstr "Não contínuo (leitura de marcas)" + +msgid "Non-continuous (Web sensing)" +msgstr "Não contínuo (leitura Web)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Não encontrado" + +msgid "Not Implemented" +msgstr "Não implementado" + +msgid "Not Installed" +msgstr "Não instalado" + +msgid "Not Modified" +msgstr "Não modificado" + +msgid "Not Supported" +msgstr "Não suportado" + +msgid "Not allowed to print." +msgstr "Sem permissão para imprimir." + +msgid "Note" +msgstr "Nota" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Inactivo (1 lado)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Ajuda online" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "abertura de %s falhou: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup sem um CloseGroup primeiro" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI sem um CloseUI/JCLCloseUI primeiro" + +msgid "Operation Policy" +msgstr "Política de Operação" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Opções instaladas" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opções: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Modo de saída" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Impressora Laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "O pacote não contém Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "O pacote não começa por SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Palavra-passe para %s em %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Palavra-passe para %s requerida para aceder a %s via SAMBA: " + +msgid "Pause Class" +msgstr "Colocar a classe em pausa" + +msgid "Pause Printer" +msgstr "Colocar a impressora em pausa" + +msgid "Peel-Off" +msgstr "Destacar" + +msgid "Photo" +msgstr "Fotografia" + +msgid "Photo Labels" +msgstr "Etiquetas de fotografias" + +msgid "Plain Paper" +msgstr "Papel normal" + +msgid "Policies" +msgstr "Políticas" + +msgid "Port Monitor" +msgstr "Monitor da porta" + +msgid "PostScript Printer" +msgstr "Impressora PostScript" + +msgid "Postcard" +msgstr "Postal" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Densidade de impressão" + +msgid "Print Job:" +msgstr "Imprimir trabalho:" + +msgid "Print Mode" +msgstr "Modo de impressão" + +msgid "Print Rate" +msgstr "Taxa de impressão" + +msgid "Print Self-Test Page" +msgstr "Imprimir página de teste automático" + +msgid "Print Speed" +msgstr "Velocidade de impressão" + +msgid "Print Test Page" +msgstr "Imprimir página de teste" + +msgid "Print and Cut" +msgstr "Imprimir e cortar" + +msgid "Print and Tear" +msgstr "Imprimir e rasgar" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Impresso para: " + +msgid "Printed From: " +msgstr "Impresso a partir de: " + +msgid "Printed On: " +msgstr "Impresso a: " + +msgid "Printer Added" +msgstr "Impressora adicionada" + +msgid "Printer Default" +msgstr "Impressora predefinida" + +msgid "Printer Deleted" +msgstr "Impressora apagada" + +msgid "Printer Modified" +msgstr "Impressora modificada" + +msgid "Printer Name: " +msgstr "Nome da impressora: " + +msgid "Printer Paused" +msgstr "Impressora em pausa" + +msgid "Printer Settings" +msgstr "Definições da impressora" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Impressora:" + +msgid "Printers" +msgstr "Impressoras" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Limpar trabalhos" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Quota atingida." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Rejeitar trabalhos" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Voltar a imprimir após o erro" + +msgid "Request Entity Too Large" +msgstr "Entidade do pedido demasiado extensa" + +msgid "Resolution" +msgstr "Resolução" + +msgid "Resume Class" +msgstr "Retomar classe" + +msgid "Resume Printer" +msgstr "Retomar impressora" + +msgid "Return Address" +msgstr "Endereço de devolução" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Endereço de devolução - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Retroceder" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE com comprimento indefinido" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Ver outros" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Porta de série n.º %d" + +msgid "Server Restarted" +msgstr "Servidor reiniciado" + +msgid "Server Security Auditing" +msgstr "Auditoria de segurança do servidor" + +msgid "Server Started" +msgstr "Servidor iniciado" + +msgid "Server Stopped" +msgstr "Servidor parado" + +msgid "Service Unavailable" +msgstr "Serviço indisponível" + +msgid "Set Allowed Users" +msgstr "Definir utilizadores permitidos" + +msgid "Set As Server Default" +msgstr "Definir como servidor predefinido" + +msgid "Set Class Options" +msgstr "Definir opções de classe" + +msgid "Set Printer Options" +msgstr "Definir opções de impressora" + +msgid "Set Publishing" +msgstr "Definir publicação" + +msgid "Shipping Address" +msgstr "Endereço de envio" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Endereço de envio - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Margem estreita (horizontal)" + +msgid "Special Paper" +msgstr "Papel especial" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Padrão" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Iniciar faixa publicitária" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Declaração" + +msgid "Stylus Color Series" +msgstr "Série a cores Stylus" + +msgid "Stylus Photo Series" +msgstr "Série fotográfica Stylus" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "A mudar de protocolo" + +msgid "Tabloid" +msgstr "Tablóide" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Rasgar" + +msgid "Tear-Off" +msgstr "Descartar" + +msgid "Tear-Off Adjust Position" +msgstr "Descartar posição de ajuste" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Não é possível localizar o ficheiro PPD \"%s\"." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Não é possível abrir o ficheiro PPD \"%s\": %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"O nome de classe pode ter o máximo de 127 caracteres imprimíveis e não pode " +"ter espaços, barras (/) ou cardinal (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Não é possível utilizar o atributo notify-lease-duration com subscrições de " +"trabalho." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"O nome de impressora pode ter o máximo de 127 caracteres imprimíveis e não " +"pode ter espaços, barras (/) ou cardinal (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "O atributo printer-uri \"%s\" contém caracteres inválidos." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"O atributo printer-uri deve ser do formato \"ipp://HOSTNAME/classes/CLASSNAME" +"\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"O atributo printer-uri deve ser do formato \"ipp://HOSTNAME/printers/" +"PRINTERNAME\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"O nome de subscrição não pode ter espaços, barras (/), pontos de " +"interrogação (?) ou cardinal (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Existem demasiadas subscrições." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Suporte de transferência térmica" + +msgid "Title: " +msgstr "Título: " + +msgid "Too many active jobs." +msgstr "Demasiados trabalhos activos." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparência" + +msgid "Tray" +msgstr "Bandeja" + +msgid "Tray 1" +msgstr "Bandeja 1" + +msgid "Tray 2" +msgstr "Bandeja 2" + +msgid "Tray 3" +msgstr "Bandeja 3" + +msgid "Tray 4" +msgstr "Bandeja 4" + +msgid "URI Too Long" +msgstr "URI demasiado longo" + +msgid "US Ledger" +msgstr "Livro de contas EUA" + +msgid "US Legal" +msgstr "Legal EUA" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "Carta EUA" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Porta de série USB n.º %d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Não é possível aceder ao ficheiro cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Não é possível adicionar a subscrição RSS:" + +msgid "Unable to add class:" +msgstr "Não é possível adicionar a classe:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Não é possível adicionar a impressora:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Não é possível cancelar a subscrição RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Não é possível alterar o atributo printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Não é possível alterar a impressora:" + +msgid "Unable to change server settings:" +msgstr "Não é possível alterar as definições do servidor:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Não é possível ligar ao host." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Não é possível criar o ficheiro temporário:" + +msgid "Unable to delete class:" +msgstr "Não é possível apagar a classe:" + +msgid "Unable to delete printer:" +msgstr "Não é possível apagar a impressora:" + +msgid "Unable to do maintenance command:" +msgstr "Não é possível executar o comando de manutenção:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Não é possível obter a lista de classes:" + +msgid "Unable to get class status:" +msgstr "Não é possível obter o estado da classe:" + +msgid "Unable to get list of printer drivers:" +msgstr "Não é possível obter a lista de recursos da impressora:" + +msgid "Unable to get printer attributes:" +msgstr "Não é possível obter os atributos da impressora:" + +msgid "Unable to get printer list:" +msgstr "Não é possível obter a lista de impressoras:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Não é possível obter o estado da impressora:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Não é possível modificar a classe:" + +msgid "Unable to modify printer:" +msgstr "Não é possível modificar a impressora:" + +msgid "Unable to move job" +msgstr "Não é possível mover o trabalho" + +msgid "Unable to move jobs" +msgstr "Não é possível mover os trabalhos" + +msgid "Unable to open PPD file" +msgstr "Não é possível abrir o ficheiro PPD" + +msgid "Unable to open PPD file:" +msgstr "Não é possível abrir o ficheiro PPD:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Não é possível abrir o ficheiro cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Não é possível imprimir a página de teste:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Não é possível definir opções:" + +msgid "Unable to set server default:" +msgstr "Não é possível definir como servidor predefinido:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Não é possível carregar o ficheiro cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Não autorizado" + +msgid "Units" +msgstr "Unidades" + +msgid "Unknown" +msgstr "Desconhecido" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Printer-error-policy desconhecida \"%s\"." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Printer-op-policy desconhecida \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Tipo de valor não suportado" + +msgid "Upgrade Required" +msgstr "Requer actualização" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Valor com comprimento indefinido" + +msgid "VarBind uses indefinite length" +msgstr "VarBind com comprimento indefinido" + +msgid "Version uses indefinite length" +msgstr "Versão com comprimento indefinido" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Sim" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Deve aceder a esta página utilizando o URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Impressora de etiquetas ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "interrompido" + +msgid "canceled" +msgstr "cancelado" + +msgid "completed" +msgstr "concluído" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced falhou a execução." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd falhou a execução." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index com comprimento indefinido" + +msgid "error-status uses indefinite length" +msgstr "error-status com comprimento indefinido" + +msgid "held" +msgstr "reter" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "inactivo" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "pendente" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "a processar" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id com comprimento indefinido" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "estatística de %s falhou: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "parado" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "desconhecido" + +msgid "untitled" +msgstr "sem nome" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings com comprimento indefinido" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(tudo)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(sem)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d entradas\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tApós falha: continuar\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAlertas:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tFaixa publicitária requerida\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tConjuntos charset:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tLigação: directa\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tLigação: remota\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tTamanho de página predefinido:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tPitch predefinido:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tPredefinições de porta:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDescrição: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormato montado:\n" +#~ "\tTipos de conteúdo: qualquer\n" +#~ "\tTipos de impressora: desconhecido\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormatos permitidos:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterface: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterface: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterface: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tLocalização: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tEm falha: sem alerta\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tUtilizadores permitidos:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tUtilizadores negados:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdaemon presente\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tsem entradas\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\timpressora está no periférico '%s' velocidade -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\timpressão desactivada\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\timpressão activada\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tem fila para %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tcolocação em fila desactivada\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tcolocação em fila activada\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tmotivo desconhecido\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " RESULTADOS DETALHADOS DO TESTE DE CONFORMIDADE\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Página 15, secção 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Página 15, secção 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Página 19, secção 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Página 20, secção 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Página 27, secção 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Página 42, secção 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Páginas 16-17, secção 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Páginas 42-45, secção 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Páginas 45-46, secção 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Páginas 48-49, secção 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Páginas 52-54, secção 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f bytes\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Predefinição%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Fabricante\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Produto\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" em conflito com \"%s %s\"\n" +#~ " (restrição=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s não tem opções correspondentes!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s partilha um prefixo comum com %s\n" +#~ " REF: Página 15, secção 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Escolhas predefinidas em conflito!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Palavra-chave de opção de frente e verso %s pode não " +#~ "funcionar como previsto e deve ter o nome Duplex!\n" +#~ " REF: Página 122, secção 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Ficheiro contém um misto de fins de linha CR, LF e CR " +#~ "LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding requerido por espec. de PPD 4.3\n" +#~ " REF: Páginas 56-57, secção 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Linha %d só contém espaço em branco!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Fabricante requerido por espec. de PPD 4.3\n" +#~ " REF: Páginas 58-59, secção 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN Ficheiro APDialogExtension inexistente \"%s\"\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN Ficheiro APPrinterIconPath inexistente \"%s\"\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN Ficheiros PPD não Windows devem utilizar fins de linha " +#~ "com LF, e não CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Versão de PPD obsoleta %.1f!\n" +#~ " REF: Página 42, secção 5.2" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName superior a 8.3 viola espec. de PPD\n" +#~ " REF: Páginas 61-62, secção 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocolos contêm PJL, mas atributos JCL não estão " +#~ "especificados.\n" +#~ " REF: Páginas 78-79, secção 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocolos contêm PJL e BCP; TBCP esperados.\n" +#~ " REF: Páginas 78-79, secção 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName requerido por espec. de PPD 4.3\n" +#~ " REF: Páginas 64-65, secção 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s não existe!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Escolha %s inválida %s!\n" +#~ " REF: Página 122, secção 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s Cadeia de tradução UTF-8 \"%s\" inválida para opção %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Cadeia de tradução UTF-8 \"%s\" inválida para opção %s, escolha " +#~ "%s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Valor cupsFilter inválido \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s CupsICCProfile inválido %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Valor cupsPreFilter inválido \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s CupsUIConstraints inválido %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Idioma inválido \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s CupsUIConstraints vazio %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Cadeia de tradução inexistente \"%s\" para opção %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Cadeia de tradução inexistente \"%s\" para opção %s, escolha %" +#~ "s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Escolha inexistente *%s %s em UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Escolha inexistente *%s %s em cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Ficheiro cupsFilter inexistente \"%s\"!\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Ficheiro cupsICCProfile inexistente \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Ficheiro cupsPreFilter inexistente \"%s\"!\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s CupsUIResolver inexistente %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Opção inexistente %s em UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Opção inexistente %s em cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Sem tradução base \"%s\" incluída no ficheiro!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s REQUERIDO %s não define a escolha Sem!\n" +#~ " REF: Página 122, secção 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s valor hash colide com %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s causa um loop!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s os nomes da escolha %s e %s divergem apenas pela " +#~ "utilização de maiúsculas/minúsculas!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s deve ser 1284DeviceID!\n" +#~ " REF: Página 72, secção 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** Predefinição%s %s inválida\n" +#~ " REF: Página 40, secção 4.5\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultImageableArea %s inválida!\n" +#~ " REF: Página 102, secção 5.15\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultPaperDimension %s inválida!\n" +#~ " REF: Página 103, secção 5.15\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** Atributo JobPatchFile inválido no ficheiro!\n" +#~ " REF: Página 24, secção 3.4\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Fabricante inválido (deve ser \"HP\")\n" +#~ " REF: Página 211, tabela D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** Fabricante inválido (deve ser \"Oki\")\n" +#~ " REF: Página 211, tabela D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ModelName inválido - \"%c\" não permitido na cadeia.\n" +#~ " REF: Páginas 59-60, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PSVersion inválida - não \"(cadeia) int\".\n" +#~ " REF: Páginas 62-64, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Produto inválido - não \"(cadeia)\".\n" +#~ " REF: Página 62, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ShortNickName inválido - superior a 31 car.\n" +#~ " REF: Páginas 64-65, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Escolha %s inválida %s!\n" +#~ " REF: Página 84, secção 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Versão de ficheiro inválida \"%s\"\n" +#~ " REF: Página 56, secção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Versão de formato inválida \"%s\"\n" +#~ " REF: Página 56, secção 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** LanguageEncoding %s inválida - deve ser ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** LanguageVersion %s inválida - deve ser Inglês!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** Impossível interpretar código de opção predefinida: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Cadeia de tradução predefinida para opção %s escolha %s " +#~ "contém caracteres de 8 bits!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Cadeia de tradução predefinida para opção %s contém " +#~ "caracteres de 8 bits!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Os nomes dos grupos%s e %s divergem apenas pela " +#~ "utilização de maiúsculas/minúsculas!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Múltiplos casos de %s nome da escolha %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Os nomes das opções %s e %s divergem apenas pela " +#~ "utilização de maiúsculas/minúsculas!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** Predefinição%s requerida\n" +#~ " REF: Página 40, secção 4.5\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultImageableArea requerida\n" +#~ " REF: Página 102, secção 5.15\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** DefaultPaperDimension requerida\n" +#~ " REF: Página 103, secção 5.15\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FileVersion requerida\n" +#~ " REF: Página 56, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FormatVersion requerida\n" +#~ " REF: Página 56, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ImageableArea requerida para PageSize %s\n" +#~ " REF: Página 41, secção 5.\n" +#~ " REF: Página 102, secção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** LanguageEncoding requerida\n" +#~ " REF: Páginas 56-57, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** LanguageVersion requerida\n" +#~ " REF: Páginas 57-58, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Fabricante requerido\n" +#~ " REF: Páginas 58-59, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ModelName requerido\n" +#~ " REF: Páginas 59-60, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** NickName requerido\n" +#~ " REF: Página 60, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PCFileName requerido\n" +#~ " REF: Páginas 61-62, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** PSVersion requerida\n" +#~ " REF: Páginas 62-64, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageRegion requerida\n" +#~ " REF: Página 100, secção 5.14\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageSize requerido\n" +#~ " REF: Página 41, secção 5.\n" +#~ " REF: Página 99, secção 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** PageSize requerido\n" +#~ " REF: Páginas 99-100, secção 5.14\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** PaperDimension requerida para PageSize %s\n" +#~ " REF: Página 41, secção 5.\n" +#~ " REF: Página 103, secção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Produto requerido\n" +#~ " REF: Página 62, secção 5.3\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ShortNickName requerido\n" +#~ " REF: Páginas 64-65, secção 5.3\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d ERROS ENCONTRADOS\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " %%%%BoundingBox: inválida na linha %d!\n" +#~ " REF: Página 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " %%%%Page: inválida na linha %d!\n" +#~ " REF: Página 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " %%%%Pages: inválidas na linha %d!\n" +#~ " REF: Página 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Linha %d tem mais de 255 caracteres (%d)!\n" +#~ " REF: Página 25, Comprimento da Linha\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 inexistente na primeira linha!\n" +#~ " REF: Página 17, 3.1 Documentos de Conformidade\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Comentário %%EndComments inexistente!\n" +#~ " REF: Página 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Comentário %%BoundingBox: inexistente ou inválido!\n" +#~ " REF: Página 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Comentários %%Page: inexistentes ou inválidos!\n" +#~ " REF: Página 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Comentário %%Pages: inexistente ou inválido!\n" +#~ " REF: Página 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " SEM ERROS\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Detectadas %d linhas que excedem 255 caracteres!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Demasiados comentários %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Demasiados comentários %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Aviso: ficheiro contém dados binários!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Aviso: sem comentário %%EndComments no ficheiro!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Aviso: versão obsoleta de DSC %.1f no ficheiro!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Impossível abrir ficheiro PPD - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Impossível abrir ficheiro PPD - %s na linha %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "Envelope n.º 10" + +#~ msgid "#11 Envelope" +#~ msgstr "Envelope n.º 11" + +#~ msgid "#12 Envelope" +#~ msgstr "Envelope n.º 12" + +#~ msgid "#14 Envelope" +#~ msgstr "Envelope n.º 14" + +#~ msgid "#9 Envelope" +#~ msgstr "Envelope n.º 9" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s aceita pedidos desde %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s não é implementado pela versão CUPS de lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s não está preparada\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s está preparada\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s está preparada e a imprimir\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s não aceita pedidos desde %s-\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s não suportado!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s aceita pedidos desde %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s não aceita pedidos desde %s-\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [trabalho %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s falhou: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Não sei que fazer!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Erro - nomes de variáveis de ambiente %s inexistentes no destino \"%s" +#~ "\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Erro - ID de trabalho inválido!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Erro - não é possível imprimir ficheiros e alterar trabalhos em " +#~ "simultâneo!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Erro - não é possível imprimir a partir de stdin se fornecidos " +#~ "ficheiros ou ID do trabalho!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Erro - conjunto de caracteres esperado após opção '-S'!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Erro - tipo de conteúdo esperado após opção '-T'!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Erro - cópias esperadas após opção '-n'!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Erro - contagem de cópias esperadas após opção '-#'!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-P'!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-b'!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-d'!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Erro - formato esperado após opção '-f'!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Erro - nome para reter esperado após opção '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Erro - nome de host esperado após opção '-h'!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Erro - nome de host esperado após opção '-h'!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Erro - lista de modo esperada após opção '-y'!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Erro - nome esperado após opção '-%c'!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Erro - cadeia de opção esperada após opção '-o'!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Erro - lista de página esperada após opção '-P'!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Erro - prioridade esperada após opção '-%c'!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Erro - texto de motivo esperado após opção '-r'!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Erro - título esperado após opção '-t'!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Erro - nome de utilizador esperado após opção '-u'!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Erro - nome de utilizador esperado após opção '-u'!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Erro - valor esperado após opção '-%c'!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Erro - necessário \"concluído\", \"não concluído\" ou \"tudo\" após " +#~ "opção '-W'!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Erro - sem destino predefinido disponível.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Erro - prioridade deve ser entre 1 e 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Erro - programador não responde!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Erro - demasiados ficheiros - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Erro - não é possível aceder a \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "" +#~ "%s: Erro - não é possível criar fila de espera a partir de stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Erro - destino desconhecido \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Erro - destino desconhecido \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Erro - opção desconhecida '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Erro - opção desconhecida '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: ID de trabalho esperado após opção '-i'!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filtro \"%s\" não disponível: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Nome de destino inválido na lista \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Cadeia de filtro inválida \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: Necessário ID do trabalho ('-i jobid') antes de '-H reiniciar'!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Sem filtro para converter de %s/%s para %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Operação falhou: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Sem suporte de encriptação compilado!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Não é possível ligar ao servidor\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Não é possível contactar o servidor!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Não é possível determinar tipo MIME de \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Não é possível abrir %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Não é possível abrir %s - %s na linha %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Não é possível abrir %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Não é possível abrir o ficheiro PDF: %s na linha %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "" +#~ "%s: Não é possível ler a base de dados MIME a partir de \"%s\" ou \"%s" +#~ "\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Destino desconhecido \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Destino desconhecido de tipo MIME %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Opção desconhecida '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Origem desconhecida de tipo MIME %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Aviso - modificador de formato '%c' não suportado - saída pode ser " +#~ "incorrecta!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Aviso - opção de conjunto de caracteres ignorada!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Aviso - opção de tipo de conteúdo ignorada!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Aviso - opção de formato ignorada!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Aviso - opção de modo ignorada!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Erro - nomes de variáveis de ambiente %s inexistentes no destino \"%s" +#~ "\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: Erro - opção=valor esperada após opção '-o'!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: Erro - sem destino predefinido disponível.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "Níveis de cinzento 600 DPI" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Comando de ajuda inválido desconhecido\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Palavra-passe Samba requerida para exportar recursos de impressora!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Nome de utilizador Samba requerido para exportar recursos de impressora!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Já existe uma classe com o nome \"%s\"!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Já existe uma impressora com o nome \"%s\"!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (extra grande)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (extra grande)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (pequeno)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (extra grande)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Tentativa de definir %s printer-state como valor inválido %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Grupos de atributos desordenados (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "URI de periférico inválido \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Device-uri \"%s\" inválido!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Esquema uri de periférico inválido \"%s\"!\n" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Document-format \"%s\" inválido!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Buffer de nome de ficheiro inválido!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Atributo de tipo de letra inválido: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Valor job-priority inválido!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Valor job-sheets \"%s\" inválido!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Tipo de valor job-sheets inválido!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Valor job-state inválido!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Atributo job-uri \"%s\" inválido!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Notify-pull-method \"%s\" inválido!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Notify-recipient-uri URI \"%s\" inválido!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Opção + escolha inválidas na linha %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Port-monitor \"%s\" inválido!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Valor printer-state inválido %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Número de versão pedido inválido %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "ID de subscrição inválido!" + +#~ msgid "C0 Envelope" +#~ msgstr "Envelope C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Envelope C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Envelope C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Envelope C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Envelope C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Envelope C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Envelope C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Envelope C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Envelope C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Conjunto de caracteres \"%s\" não suportado!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Envelope Chou3" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Envelope Chou4" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "É possível abreviar comandos. Comandos são:\n" +#~ "\n" +#~ "sair ajuda sair estado ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Não é possível procurar o tipo \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Tampa aberta." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "Envelope DL" + +#~ msgid "Developer almost empty." +#~ msgstr "Programador quase vazio." + +#~ msgid "Developer empty!" +#~ msgstr "Programador vazio!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Periférico: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "O documento %d não foi encontrado no trabalho %d." + +#~ msgid "Door open." +#~ msgstr "Porta aberta." + +#~ msgid "Double Postcard" +#~ msgstr "Postal duplo" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Não é possível alocar memória para info de página: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Não é possível alocar memória para matriz de páginas: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Detectado comentário %%BoundingBox: inválido!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Detectado comentário %%IncludeFeature: inválido!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Comentário %%Page: inválido no ficheiro!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Comentário %%PageBoundingBox: inválido no ficheiro!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Ficheiro de periférico SCSI inválido \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Ficheiro charset inválido %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Tipo charset inválido %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Valor de colunas inválido %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Valor cpi inválido %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Linha de descrição de tipo de letra inválida: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Valor lpi inválido %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Configuração de página inválida!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Orientação de texto inválida %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Largura de texto inválida %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: A impressora de destino não existe!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Detectado comentário %%BoundingBox: em duplicado!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Detectado comentário %%Pages: em duplicado!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Ficheiro de impressão vazio!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Erro %d ao enviar o pedido PAPSendData: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: Esperada cadeia entre aspas na linha %d de %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Erro fatal de USB!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Detectado comando HP-GL/2 inválido; impossível imprimir ficheiro!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog inexistente!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup inexistente!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: URI de periférico inexistente em command-line e sem variável de " +#~ "ambiente DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "" +#~ "ERROR: Valor inexistente na linha %d do ficheiro da faixa publicitária!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: É necessária uma linha msgid antes de quaisquer cadeias de " +#~ "tradução na linha %d de %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Sem comentário %%BoundingBox: no cabeçalho!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Sem comentário %%Pages: no cabeçalho!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Sem URI de periférico em argv[0] ou na variável de ambiente " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Tipos de letra inexistentes no ficheiro charset %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Sem páginas!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Sem papel!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: Variável de ambiente PRINTER não definida!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: O ficheiro de impressão não foi aceite (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: A impressora não responde\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: A impressora não responde!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: A impressora enviou um EOF inesperado\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: O host remoto não aceitou ficheiro de controlo (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: O host remoto não aceitou o ficheiro de dados (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Ocorreu um erro de tempo limite excedido ao enviar dados para a " +#~ "impressora\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Não é possível adicionar o ficheiro %d ao trabalho: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Não é possível cancelar o trabalho %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Não é possível copiar o ficheiro PDF" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Não é possível criar o socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível criar o ficheiro de impressão comprimido " +#~ "temporário: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Não é possível criar o ficheiro temporário" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Não é possível criar ficheiro o temporário - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Não é possível criar o ficheiro temporário: %s.\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível executar pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Não é possível executar o programa gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Não é possível executar o programa pdftops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível separar pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Não é possível obter pedidos PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Não é possível obter a resposta PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: Não é possível obter o ficheiro PPD para a impressora \"%s\" - %" +#~ "s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Não é possível obter a zona AppleTalk predefinida" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Não é possível obter os atributos do trabalho %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Não é possível obter o estado da impressora (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Não é possível localizar a impressora '%s'!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Não é possível procurar a resposta PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Não é possível procurar impressoras AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Não é possível criar o endereço AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Não é possível abrir \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Não é possível abrir %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível abrir o ficheiro da faixa publicitária \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro de periférico \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro de imagem para impressão!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro de impressão \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro de impressão %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Não é possível abrir o ficheiro de impressão %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível abrir o ficheiro de impressão comprimido " +#~ "temporário: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Não é possível abrir o ficheiro temporário" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Não é possível imprimir %d colunas de texto!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Não é possível imprimir %dx%d página de texto!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Não é possível ler os dados de impressão" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Não é possível ler os dados de impressão!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Não é possível reservar a porta" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Não é possível atingir offset %ld no ficheiro - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Não é possível atingir offset %lld no ficheiro - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Não é possível enviar o comando LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Não é possível enviar o pedido de carga PAP" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Não é possível enviar o pedido de dados PAP inicial" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Não é possível enviar dados de impressão (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Não é possível enviar os dados de impressão!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "" +#~ "ERROR: Não é possível enviar o ficheiro de impressão para a impressora" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Não é possível enviar trailing nul para a impressora" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível aguardar por pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível escrever %d bytes em \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Não é possível escrever %d bytes na impressora!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Não é possível escrever o ficheiro de controlo" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Não é possível escrever os dados de impressão" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Não é possível escrever dados de impressão: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Não é possível escrever dados de retícula no recurso!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Não é possível escrever no ficheiro temporário" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível escrever dados de documento não comprimidos: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Texto inesperado na linha %d de %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Valor de opção de encriptação desconhecido \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Ordem de ficheiro desconhecida \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Caracteres de formato desconhecido \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Formato desconhecido do catálogo de mensagens para \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Opção desconhecida \"%s\" com valor \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Modo de impressão desconhecido \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Valor de opção de versão desconhecido \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: Valor de brilho não suportado %s ao utilizar brilho=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Valor gama não suportado %s ao utilizar gama=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Valor number-up não suportado %d ao utilizar number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Valor number-up-layout não suportado %s ao utilizar number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Valor page-border não suportado %s ao utilizar page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: Detectado excesso doc_printf (%d bytes); a interromper!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: Filtro pdftops falhou ao sinal %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: Filtro pdftops saiu com o estado %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops saiu ao sinal %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops saiu com o estado %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: recuperável: Não é possível ligar à impressora; nova tentativa " +#~ "dentro de 30 segundos...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() falhou" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: Não é possível fazer stat do ficheiro de impressão" + +#~ msgid "Empty PPD file!" +#~ msgstr "Ficheiro PPD vazio!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Erro: necessário nome de host após opção '-h'!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "URIs do periférico do ficheiro foram desactivados! Para activar, consulte " +#~ "a directiva FileDevice em \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Temperatura do fusor elevada!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Temperatura do fusor baixa!" + +#~ msgid "German FanFold" +#~ msgstr "FanFold alemão" + +#~ msgid "German FanFold Legal" +#~ msgstr "FanFold legal alemão" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Obtive um atributo printer-uri, mas não job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk inactivo nas Preferências do Sistema\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk inactivo nas Preferências do Sistema.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: A cancelar trabalho de impressão...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Ligado à impressora...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: A ligar à impressora...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Ficheiro de controlo enviado com êxito\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Ficheiro de dados enviado com êxito\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: A formatar página %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: A carregar ficheiro de imagem...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: A procurar a impressora...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: A abrir a ligação\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Ficheiro de impressão enviado; a aguardar conclusão da " +#~ "impressora...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa dentro de 10 segundos...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa dentro de 30 segundos...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa dentro de 5 segundos...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: A impressora não suporta IPP/%d.%d, a tentar IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "" +#~ "INFO: A impressora está ocupada; nova tentativa dentro de 5 segundos...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: A impressora está actualmente sem ligação.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: A impressora está actualmente sem ligação.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: A impressora tem agora ligação.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: A impressora está sem ligação.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Impressora sem ligação; nova tentativa dentro de 30 segundos...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: A imprimir página %d, %d%% concluído...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: A imprimir página %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Preparada para imprimir.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: A enviar ficheiro de controlo (%lu bytes)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: A enviar ficheiro de controlo (%u bytes)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: A enviar dados\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: A enviar ficheiro de dados (%ld bytes)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: A enviar ficheiro de dados (%lld bytes)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: A enviar dados de impressão...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Ficheiro de impressão enviado, %ld bytes...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Ficheiro de impressão enviado, %lld bytes...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: A processar trabalho LPR, %.0f%% concluído...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Não é possível contactar a impressora; a colocar em fila na próxima " +#~ "impressora na classe...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: A utilizar a zona AppleTalk predefinida \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: A aguardar conclusão do trabalho...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: A aguardar até que a impressora fique disponível...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO Envelope B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (extra grande)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO Envelope B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO Envelope B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tinta/toner quase vazio." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tinta/toner vazio!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Receptáculo de tinta/toner quase cheio." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Receptáculo de tinta/toner cheio!" + +#~ msgid "Interlock open." +#~ msgstr "Bloqueio aberto." + +#~ msgid "Invite Envelope" +#~ msgstr "Envelope de convite" + +#~ msgid "Italian Envelope" +#~ msgstr "Envelope italiano" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Não é possível reiniciar o trabalho #%d - sem ficheiros!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Trabalho #%d não existe!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Trabalho #%d concluído; não é possível alterar!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Trabalho #%d não concluído!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Trabalho #%d não retido para autenticação!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Trabalho #%d não retido!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Trabalho #%s não existe!" + +#~ msgid "Job %d not found!" +#~ msgstr "Trabalho %d não encontrado!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Não é possível renovar as subscrições do trabalho!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Envelope Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Envelope Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Idioma \"%s\" não suportado!" + +#~ msgid "Media jam!" +#~ msgstr "Suporte encravado!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Tabuleiro de suporte quase vazio." + +#~ msgid "Media tray empty!" +#~ msgstr "Tabuleiro de suporte vazio!" + +#~ msgid "Media tray missing!" +#~ msgstr "Tabuleiro de suporte inexistente!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "É necessário encher o tabuleiro de suporte." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Atributo document-number inexistente!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Aspas inexistentes na linha %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Variável de formato inexistente!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Atributo notify-subscription-ids inexistente!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Atributo requesting-user-name inexistente!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Atributos necessários inexistentes!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Valor inexistente na linha %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modelo: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Envelope Monarch" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Ficheiro de impressão aceite - ID do trabalho %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "" +#~ "NOTICE: Ficheiro de impressão aceite - ID do trabalho desconhecido.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Sem nome PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Sem controladores de impressora Windows instalados!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Sem trabalhos activos em %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Sem atributos no pedido!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Sem informações de autenticação fornecidas!" + +#~ msgid "No default printer" +#~ msgstr "Sem impressora predefinida" + +#~ msgid "No file!?!" +#~ msgstr "Sem ficheiro?!" + +#~ msgid "No modification time!" +#~ msgstr "Tempo de modificação inexistente!" + +#~ msgid "No printer name!" +#~ msgstr "Nome de impressão inexistente!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Nenhum printer-uri para a classe!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Nenhum printer-uri encontrado!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Nenhum printer-uri no pedido!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Sem atributos de subscrição no pedido!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC quase em fim de vida." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC em fim de vida!" + +#~ msgid "Out of toner!" +#~ msgstr "Sem toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Receptáculo de saída quase cheio." + +#~ msgid "Output bin full!" +#~ msgstr "Receptáculo de saída cheio!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Saída de impressora %s enviada para %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "Saída de impressora %s enviada para impressora remota %s em %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Saída de impressora %s/%s enviada para %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "Saída de impressora %s/%s enviada para impressora remota %s em %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Tabuleiro de saída inexistente!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Envelope PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Envelope PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Envelope PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Envelope PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (extra grande)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Envelope PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Envelope PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Envelope PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Envelope PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Envelope PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Envelope PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Envelope pessoal" + +#~ msgid "Printer offline." +#~ msgstr "Impressora sem ligação." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Classificação Proprietário Trabalho Ficheiro" +#~ "(s) Tamanho total\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Classificação Proprietário Pri Trabalho " +#~ "Ficheiros Tamanho total\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Comando em execução: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Impressora SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tablóide (extra grande)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "O valor notify-user-data é demasiado grande (%d > 63 octetos)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Impressora ou classe não partilhadas!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Impressora ou classe não localizadas." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Necessário atributo printer-uri!" + +#~ msgid "Toner low." +#~ msgstr "Pouco toner." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Demasiados valores job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Demasiados valores printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "Executivo EUA" + +#~ msgid "US Fanfold" +#~ msgstr "Fanfold EUA" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "Legal EUA (extra grande)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "Carta EUA (extra grande)" + +#~ msgid "US Letter (Small)" +#~ msgstr "Carta EUA (pequena)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Não é possível adicionar o trabalho ao destino \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Não é possível alocar memória para tipos de ficheiros!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os ficheiros de controladores de impressora CUPS de " +#~ "64 bits (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os ficheiros de controladores de impressora Windows " +#~ "de 64 bits (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Não é possível copiar ficheiros de recurso de impressora CUPS (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Não é possível copiar o ficheiro PPD - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Não é possível copiar o ficheiro PPD!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os ficheiros de controladores de impressora Windows " +#~ "2000 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os ficheiros de controladores de impressora Windows " +#~ "9x (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Não é possível copiar o script de interface - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Não é possível criar printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Não é possível editar ficheiros cupsd.conf com mais de 1MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Não é possível localizar o destino para o trabalho!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Não é possível encontrar a impressora!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível instalar os ficheiros de controladores de impressora " +#~ "Windows 2000 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível instalar os ficheiros de controladores de impressora " +#~ "Windows 9x (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Não é possível abrir o documento %d no trabalho %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Não é possível executar \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Não é possível enviar o comando para o controlador de impressora!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Não é possível definir o controlador de impressora Windows (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Não é possível usar o controlador de classe USB!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Erro de impressora desconhecido (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Conjunto de caracteres \"%s\" não suportado!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Compressão não suportada \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Atributo de compressão não suportado %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Formato não suportado \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Formato não suportado '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Formato não suportado %s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Utilização:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "" +#~ "Utilização: opções de cópias de título de utilizador %s job-id [nome do " +#~ "ficheiro]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "" +#~ "Utilização: opções de cópias de título de utilizador %s job-id " +#~ "[ficheiro]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "" +#~ "Utilização: ficheiro de opções de cópias de título de utilizador %s job-" +#~ "id\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Utilização: convert [ options ]\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -f filename Definir ficheiro a ser convertido (caso contrário " +#~ "stdin)\n" +#~ " -o filename Definir ficheiro a ser gerado (caso contrário " +#~ "stdout)\n" +#~ " -i mime/type Definir tipo MIME de entrada (caso contrário auto-" +#~ "typed)\n" +#~ " -j mime/type Definir tipo MIME de saída (caso contrário " +#~ "application/pdf)\n" +#~ " -P filename.ppd Definir ficheiro PPD\n" +#~ " -a 'name=value ...' Definir opção(ões)\n" +#~ " -U username Definir nome de utilizador do trabalho\n" +#~ " -J title Definir título\n" +#~ " -c copies Definir número de cópias\n" +#~ " -u Remover o ficheiro PPD ao terminar\n" +#~ " -D Remover o ficheiro de entrada ao terminar\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Utilização: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Opções:\n" +#~ " -E Encriptar a ligação ao servidor\n" +#~ " -H samba-server Utilizar o servidor SAMBA\n" +#~ " -U samba-user Autenticar utilizando utilizador SAMBA\n" +#~ " -a Exportar todas as impressoras\n" +#~ " -h cups-server Utilizar o servidor CUPS\n" +#~ " -v Verboso (mostrar comandos)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Utilização: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -E Activar encriptação\n" +#~ " -U username Especificar nome de utilizador\n" +#~ " -h server[:port] Especificar endereço de servidor\n" +#~ "\n" +#~ " --[no-]debug-logging Activar/desactivar registo da depuração\n" +#~ " --[no-]remote-admin Activar/desactivar administração remota\n" +#~ " --[no-]remote-any Permitir/impedir acesso a partir da Internet\n" +#~ " --[no-]remote-printers Mostrar/ocultar impressoras remotas\n" +#~ " --[no-]share-printers Activar/desactivar partilha de impressora\n" +#~ " --[no-]user-cancel-any Permitir/impedir utilizadores de cancelar " +#~ "trabalhos\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Utilização: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Carregar ficheiro de configuração alternativa\n" +#~ "-f Executar em primeiro plano\n" +#~ "-F Executar em primeiro plano, mas separar\n" +#~ "-h Mostrar esta mensagem de utilização\n" +#~ "-l Executar cupsd a partir de launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Utilização: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -c cupsd.conf Definir ficheiro cupsd.conf a utilizar\n" +#~ " -j job-id[,N] Filtrar ficheiro N do trabalho especificado (a " +#~ "predefinição é ficheiro 1)\n" +#~ " -n copies Definir número de cópias\n" +#~ " -o name=value Definir opção(ões)\n" +#~ " -p filename.ppd Definir ficheiro PPD\n" +#~ " -t title Definir título\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Utilização: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -h Mostrar utilização de programa\n" +#~ "\n" +#~ " Nota: este programa só valida comentários DSC, não o próprio " +#~ "PostScript.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Utilização: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[." +#~ "gz]]\n" +#~ " programa | cupstestppd [options] -\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -R root-directory Especificar raiz alternativa\n" +#~ " -W {tudo, sem, restrições, predefinições, duplex, filtros, " +#~ "traduções}\n" +#~ " Emitir avisos em vez de erros\n" +#~ " -q Executar silenciosamente\n" +#~ " -r Utilizar modo aberto 'descontraído'\n" +#~ " -v Ligeiramente verboso\n" +#~ " -vv Muito verboso\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Utilização: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Utilização: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Utilização: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Utilização: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Utilização: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] " +#~ "[+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Utilização: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Opções:\n" +#~ " -D name=value Definir variável designada como valor.\n" +#~ " -I include-dir Adicionar incluir directório ao caminho de " +#~ "pesquisa.\n" +#~ " -c catalog.po Carregar o catálogo de mensagens especificado.\n" +#~ " -d output-dir Especificar o directório de saída.\n" +#~ " -l lang[,lang,...] Especificar o(s) idioma(s) (locale).\n" +#~ " -m Utilizar o valor ModelName como nome de ficheiro.\n" +#~ " -t Testar PPDs em vez de os gerar.\n" +#~ " -v Ser verboso (mais \"v\" para mais verbosidade).\n" +#~ " -z Comprimir ficheiros PPD utilizando o zip GNU.\n" +#~ " --cr Terminar linhas em CR (Mac OS 9).\n" +#~ " --crlf Terminar linhas em CR + LF (Windows).\n" +#~ " --lf Terminar linhas em LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Utilização: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Definir variável designada como valor.\n" +#~ "Opções:\n" +#~ " -I include-dir Adicionar incluir directório ao caminho de pesquisa.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Utilização: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Opções:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Utilização: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Opções:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Utilização: ppdpo [options] -o filename.po filename.drv [ ... filenameN." +#~ "drv ]\n" +#~ "Opções:\n" +#~ " -D name=value Definir variável designada como valor.\n" +#~ " -I include-dir Adicionar incluir directório ao caminho de pesquisa.\n" +#~ " -v Ser verboso (mais \"v\" para mais verbosidade).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Utilização: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: A adicionar apenas as primeiras %d impressoras encontradas" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Booleano esperado para opção waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Falha ao ler pedido de side-channel!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Não é possível incluir a opção \"%s\" via IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: a impressora não responde\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: A impressora enviou um EOF inesperado\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host remoto não respondeu com byte de estado de comando após %d " +#~ "segundos!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host remoto não respondeu com byte de estado de controlo após %d " +#~ "segundos!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Host remoto não respondeu com byte de estado de dados após %d " +#~ "segundos!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: Comando SCSI sem resposta (%d); a tentar de novo...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Este documento não está de acordo com ADSC e pode não ser " +#~ "impresso correctamente!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Não é possível abrir o ficheiro \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Não é possível enviar o pedido de estado PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Pacote PAP inesperado do tipo %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Pacote PAP desconhecido do tipo %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Escolha desconhecida \"%s\" para opção \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Opção desconhecida \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Taxa baud não suportada %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: número esperado para opção status \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: recuperável: host de rede '%s' ocupado; nova tentativa dentro de " +#~ "%d segundos...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Aviso, sem controladores de impressora Windows 2000 instalados!" + +#~ msgid "You4 Envelope" +#~ msgstr "Envelope You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: Utilize a opção -f para especificar um ficheiro para converter.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Sem ficheiro PPD para impressora \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Não é possível ligar ao servidor: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Opção desconhecida \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Opção desconhecida \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Nome de ficheiro config esperado após opção \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Não é possível obter o directório actual!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Argumento desconhecido \"%s\" - a interromper!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Opção desconhecida \"%c\" - a interromper!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "cupsd: suporte launchd(8) não compilado; execução em modo normal.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Número de documento inválido %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: ID de trabalho inválido %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Só pode ser especificado um nome de ficheiro!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Não é possível criar o ficheiro temporário: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Não é possível obter o ficheiro do trabalho - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: Opção -q incompatível com opção -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: Opção -v incompatível com opção -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "periférico para %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "periférico para %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tobter ajuda sobre comandos\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "atributo job-printer-uri inexistente!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Nome de classe só pode ter caracteres imprimíveis!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: PPD esperado após opção '-P'!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin: Permitir/negar:lista de utilizadores esperado após opção '-u'!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Classe esperada após opção '-r'!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Nome de classe esperado após opção '-c'!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Descrição esperada após opção '-D'!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: URI de periférico esperado após opção '-v'!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Tipo(s) de ficheiro esperados após opção '-I'!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Nome de host esperado após opção '-h'!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Interface esperada após opção '-i'!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Localização esperada após opção '-L'!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Modelo esperado após opção '-m'!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Nome=valor esperado após opção '-o'!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Impressora esperada após opção '-p'!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Nome de impressora esperado após opção '-d'!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Impressora ou classe esperadas após opção '-x'!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Sem nomes de membro detectados!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Impressora %s já é membro da classe %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Impressora %s não é membro da classe %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Nome de impressora só pode ter caracteres imprimíveis!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível adicionar impressora à classe:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Não é possível ligar ao servidor: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Não é possível criar o ficheiro temporário - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Não é possível criar o ficheiro temporário: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Não é possível abrir o ficheiro PPD \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Não é possível abrir o ficheiro \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível remover a impressora da classe:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir o ficheiro PPD:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir o URI do periférico:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir o script de interface ou ficheiro PPD:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir o script de interface:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir a descrição da impressora:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir a localização da impressora:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível definir as opções da impressora:\n" +#~ " Especifique primeiro um nome de impressora!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Opção permitir/negar desconhecida \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Argumento desconhecido '%s'!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Opção desconhecida '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Aviso - lista de tipo de conteúdo ignorada!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: Esperada cadeia ID de periférico 1284 após --device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Esperado idioma após --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Esperados marca e modelo após --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Esperada cadeia de produto após --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Esperada lista de esquema após --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Esperada lista de esquema após --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Esperado limite de tempo excedido após --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Argumento desconhecido '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Opção desconhecida '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Opção desconhecida '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Não é possível ligar ao servidor: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Argumento desconhecido '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Opção desconhecida '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Sem impressoras!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Não é possível adicionar impressora ou instância: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Não é possível obter o ficheiro PPD para %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Não é possível abrir o ficheiro PPD para %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Impressora ou classe desconhecidas!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Só raiz pode adicionar ou apagar palavras-passe!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Ficheiro de palavra-passe ocupado!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Ficheiro de palavra-passe não actualizado!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Palavra-passe não corresponde!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Palavra-passe rejeitada.\n" +#~ "A palavra-passe deve ter o mínimo de 6 caracteres, sem conter\n" +#~ "o nome de utilizador, e deve ter pelo menos uma letra e um número.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Palavras-passe não correspondem!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Não é possível copiar a cadeia de palavra-passe: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Não é possível abrir o ficheiro de palavra-passe: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "" +#~ "lppasswd: Não é possível escrever no ficheiro de palavra-passe: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: falha ao efectuar cópia de segurança de ficheiro de palavra-" +#~ "passe antigo: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: falha ao alterar nome de ficheiro de palavra-passe: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: utilizador \"%s\" e grupo \"%s\" não existem.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: erro - nomes de variáveis de ambiente %s inexistentes no destino " +#~ "\"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "membros da classe %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "sem entradas\n" + +#~ msgid "no system default destination\n" +#~ msgstr "sem destino predefinido de sistema\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events não especificados!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI \"%s\" já está em utilização!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" utiliza esquema desconhecido!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d incorrecto!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: A adicionar incluir directório \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: A adicionar/actualizar texto UI de %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Valor boolean inválido (%s) na linha %d de %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Nome de resolução inválido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Palavra-chave de estado inválida %s na linha %d de %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Substituição de variável inválida ($%c) na linha %d de %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Encontrada escolha na linha %d de %s sem Opção!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Duplicar #po para o locale %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Esperada uma definição de filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Esperado um nome de programa na linha %d de %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Esperado valor boolean na linha %d de %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Esperado charset após Tipo de Letra na linha %d de %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Esperado código de escolha na linha %d de %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Esperado nome/texto de escolha na linha %d de %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Esperada ordem de cor para ColorModel na linha %d de %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Esperado espaço de cor para ColorModel na linha %d de %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Esperada compressão para ColorModel na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Esperada cadeia de restrições para UIConstraints na linha %d de %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Esperada palavra-chave do tipo de controlador após DriverType na " +#~ "linha %d de %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Esperado tipo duplex após Duplex na linha %d de %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Esperada codificação após Tipo de Letra na linha %d de %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome de ficheiro após #po %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome/texto de grupo na linha %d de %s!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Esperado incluir nome de ficheiro na linha %d de %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Esperado número inteiro na linha %d de %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Esperado locale após #po na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após FileName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após Tipo de Letra na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após Fabricante na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após MediaSize na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após ModelName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome após PCFileName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome/texto após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome/texto após Instalável na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome/texto após Resolução na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Esperada combinação nome/texto para ColorModel na linha %d de %s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Esperado nome/texto da opção na linha %d de %s!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Esperada secção de opção na linha %d de %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Esperado tipo de opção na linha %d de %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Esperado substituir campo após Resolução na linha %d de %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Esperado número real na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Esperada resolução/tipo de suporte após ColorProfile na linha %d de " +#~ "%s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Esperada resolução/tipo de suporte após SimpleColorProfile na linha " +#~ "%d de %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Esperado selector após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Esperado estado Tipo de Letra na linha %d de %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Esperada cadeia após Copyright na linha %d de %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Esperada cadeia após Versão na linha %d de %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Esperados dois nomes de opção na linha %d de %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Esperado valor após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Esperada versão após Tipo de Letra na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Nome de ficheiro #include/#po inválido \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Custo inválido de filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Tipo MIME vazio inválido de filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Nome de programa vazio inválido de filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Secção de opção inválida \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Tipo de opção inválido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: A carregar ficheiro de informação de controlador \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: A carregar mensagens do locale \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: A carregar mensagens de \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif inexistente no final de \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if inexistente na linha %d de %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "" +#~ "ppdc: Não foi fornecido qualquer catálogo de mensagem para o locale %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Opção %s redefinida com um tipo diferente na linha %d de %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Restrição de opção tem *name na linha %d de %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Demasiados #if aninhados na linha %d de %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Não é possível criar o ficheiro PPD \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Não é possível criar o directório de saída %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Não é possível criar dutos de saída de dados: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Não é possível executar cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Não é possível encontrar #po ficheiro %s na linha %d de %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Não é possível encontrar incluir ficheiro \"%s\" na linha %d de %" +#~ "s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Não é possível encontrar a localização de \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "" +#~ "ppdc: Não é possível carregar o ficheiro de localização \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Variável indefinida (%s) na linha %d de %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Tipo de controlador desconhecido %s na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Tipo de duplex desconhecido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Tamanho de suporte desconhecido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Token desconhecido \"%s\" visto na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Caracteres de controlo desconhecidos no número real \"%s\" na linha " +#~ "%d de %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Cadeia não terminada começando por %c na linha %d de %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: A escrever %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: A escrever ficheiros PPD no directório \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: LanguageVersion inválida \"%s\" em %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: A ignorar o ficheiro PPD %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "" +#~ "ppdmerge: Não é possível efectuar a cópia de segurança %s em %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "impressora %s desactivada desde %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "impressora %s inactiva. activada desde %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "impressora %s agora a imprimir %s-%d. activada desde %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "impressora %s/%s desactivada desde %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "impressora %s/%s inactiva. activada desde %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "impressora %s/%s agora a imprimir %s-%d. activada desde %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "id de pedido é %s-%d (%d ficheiro(s))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "programador não está em execução\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "programador em execução\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tmostra estado de daemon e fila\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "destino predefinido de sistema: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "destino predefinido de sistema: %s/%s\n" diff --git a/locale/cups_pt_BR.po b/locale/cups_pt_BR.po new file mode 100644 index 0000000..3df237e --- /dev/null +++ b/locale/cups_pt_BR.po @@ -0,0 +1,8742 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2011-12-20 13:04-0200\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f milímetros" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f a %.0f x %.0f milímetros" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f polegadas" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f a %.2f x %.2f polegadas" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s não pode ser alterado." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 polegada/s" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25\"" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25\"" + +msgid "1.5 inch/sec." +msgstr "1.5 polegada/s" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25\"" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50\"" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00\"" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 polegadas/s" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/s" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 polegadas/s" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 polegadas/s" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/s" + +msgid "120x60dpi" +msgstr "120x60ppp" + +msgid "120x72dpi" +msgstr "120x72ppp" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136ppp" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/s" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/s" + +msgid "150dpi" +msgstr "150ppp" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180ppp" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 polegadas/s" + +msgid "2-Sided Printing" +msgstr "Impressão Frente e Verso" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37\"" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50\"" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00\"" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25\"" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00\"" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00\"" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00\"" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50\"" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50\"" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25\"" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00\"" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50\"" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50\"" + +msgid "2.5 inches/sec." +msgstr "2.5 polegadas/s" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00\"" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00\"" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/s" + +msgid "200 mm/sec." +msgstr "200 mm/s" + +msgid "203dpi" +msgstr "203ppp" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Séries de 24 pinos" + +msgid "240x72dpi" +msgstr "240x72ppp" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/s" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 polegadas/s" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00\"" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25\"" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00\"" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00\"" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00\"" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00\"" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00\"" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50\"" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83\"" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Disco de 3.5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Disco de 3.5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/s" + +msgid "300 mm/sec." +msgstr "300 mm/s" + +msgid "300dpi" +msgstr "300ppp" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360ppp" + +msgid "360x180dpi" +msgstr "360x180ppp" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 polegadas/s" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00\"" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00\"" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00\"" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50\"" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00\"" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00\"" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00\"" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00\"" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/s" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 polegadas/s" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 polegadas/s" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00\"" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00\"" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00\"" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00\"" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00\"" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00\"" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/s" + +msgid "600dpi" +msgstr "600ppp" + +msgid "60dpi" +msgstr "60ppp" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 polegadas/s" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720ppp" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 polegadas/s" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00\"" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00\"" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00\"" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00\"" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00\"" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00\"" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/s" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 polegadas/s" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Séries de 9 pinos" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCO C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCO D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCO E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Aceitar Trabalhos" + +msgid "Accepted" +msgstr "Aceito" + +msgid "Add Class" +msgstr "Adicionar Classe" + +msgid "Add Printer" +msgstr "Adicionar Impressora" + +msgid "Add RSS Subscription" +msgstr "Adicionar Inscrição RSS" + +msgid "Address" +msgstr "Endereço" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Endereço - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administração" + +msgid "Always" +msgstr "Sempre" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Aplicador" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Cursor NULL dests inválido" + +msgid "Bad OpenGroup" +msgstr "OpenGroup Inválido" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI Inválido" + +msgid "Bad OrderDependency" +msgstr "OrderDependency Inválido" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Pedido Inválido" + +msgid "Bad SNMP version number" +msgstr "Número de versão SNMP inválido" + +msgid "Bad UIConstraints" +msgstr "UIConstraints Inválido" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Valor de cópias inválidas %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Parâmetro personalizado inválido" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Valor de number-up inválido %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Valores de page-ranges inválidos %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Banners" + +msgid "Billing Information: " +msgstr "Informações de Cobrança: " + +msgid "Bond Paper" +msgstr "Papel Bond" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Impressora de Etiqueta CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Cancelar Inscrição RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Alterar Configurações" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Classes" + +msgid "Clean Print Heads" +msgstr "Limpar Cabeçotes de Impressão" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Cor" + +msgid "Color Mode" +msgstr "Modo de Cor" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Nome de comunidade usa comprimento indefinido" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Continuar" + +msgid "Continuous" +msgstr "Contínuo" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Criado" + +msgid "Created On: " +msgstr "Criado em: " + +msgid "Custom" +msgstr "Personalizar" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Cortar" + +msgid "Cutter" +msgstr "Guilhotina" + +msgid "Dark" +msgstr "Escuro" + +msgid "Darkness" +msgstr "Escuridão" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Apagar Classe" + +msgid "Delete Printer" +msgstr "Apagar Impressora" + +msgid "Description: " +msgstr "Descrição: " + +msgid "DeskJet Series" +msgstr "DeskJet Series" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "O destino \"%s\" não está aceitando trabalhos." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Mídia Termal Direta" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Desativado" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Nome do Driver: " + +msgid "Driver Version: " +msgstr "Versão do Driver: " + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Impressora de Etiquetas EPL1" + +msgid "EPL2 Label Printer" +msgstr "Impressora de Etiquetas EPL2" + +msgid "Edit Configuration File" +msgstr "Editar Arquivo de Configuração" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Finalizando Banner" + +msgid "English" +msgstr "Portuguese" + +msgid "Enter old password:" +msgstr "Digite a senha antiga:" + +msgid "Enter password again:" +msgstr "Digite a senha novamente:" + +msgid "Enter password:" +msgstr "Digite a senha:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Digite o seu nome de usuário e a sua senha ou o nome de usuário e a senha de " +"root para acessar esta página. Se estiver usando a autenticação Kerberos, " +"certifique-se de possuir uma entrada Kerberos válida." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Alimentação de Envelopes" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Política de Erro" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "A cada 10 etiquetas" + +msgid "Every 2 Labels" +msgstr "A cada 2 etiquetas" + +msgid "Every 3 Labels" +msgstr "A cada 3 etiquetas" + +msgid "Every 4 Labels" +msgstr "A cada 4 etiquetas" + +msgid "Every 5 Labels" +msgstr "A cada 5 etiquetas" + +msgid "Every 6 Labels" +msgstr "A cada 6 etiquetas" + +msgid "Every 7 Labels" +msgstr "A cada 7 etiquetas" + +msgid "Every 8 Labels" +msgstr "A cada 8 etiquetas" + +msgid "Every 9 Labels" +msgstr "A cada 9 etiquetas" + +msgid "Every Label" +msgstr "Todas as Etiquetas" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Falha de Expectativa" + +msgid "Export Printers to Samba" +msgstr "Exportar Impressoras para Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Pasta de Arquivo" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Pasta de Arquivo - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Fólio" + +msgid "Forbidden" +msgstr "Esquecido" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Geral" + +msgid "Generic" +msgstr "Genérico" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU usa comprimento indefinido" + +msgid "Glossy Paper" +msgstr "Papel Brilhante" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Escala de Cinzas" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Pasta Suspensa" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Pasta Suspensa - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Caractere de controle ilegal" + +msgid "Illegal main keyword string" +msgstr "Seqüência de caracteres de palavra-chave principal ilegal" + +msgid "Illegal option keyword string" +msgstr "Seqüência de caracteres de palavra-chave de opção ilegal" + +msgid "Illegal translation string" +msgstr "Seqüência de caracteres de tradução ilegal" + +msgid "Illegal whitespace character" +msgstr "Seqüência de caracteres de espaço em branco ilegal" + +msgid "Installable Options" +msgstr "Opções Instaláveis" + +msgid "Installed" +msgstr "Instalado" + +msgid "IntelliBar Label Printer" +msgstr "Impressora de Etiquetas IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Erro interno" + +msgid "Internet Postage 2-Part" +msgstr "Porte de Internet 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Porte de Internet 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Porte de Internet 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Porte de Internet 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Protocolo de Impressão da Internet" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "O trabalho #%d já foi anulado - não é possível cancelar." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "O trabalho #%d já foi cancelado - não é possível cancelar." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "O trabalho #%d já está concluído - não é possível cancelar." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Trabalho Concluído" + +msgid "Job Created" +msgstr "Trabalho Criado" + +msgid "Job ID: " +msgstr "ID de Trabalho: " + +msgid "Job Options Changed" +msgstr "Opções de Trabalho Alteradas" + +msgid "Job Stopped" +msgstr "Trabalho Parado" + +msgid "Job UUID: " +msgstr "UUID de Trabalho: " + +msgid "Job is completed and cannot be changed." +msgstr "O trabalho está concluído e não pode ser alterado." + +msgid "Job operation failed:" +msgstr "Falha de operação de trabalho:" + +msgid "Job state cannot be changed." +msgstr "O estado do trabalho não pode ser alterado." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Trabalhos" + +msgid "LPD/LPR Host or Printer" +msgstr "Host ou Impressora LPD/LPR" + +msgid "Label Printer" +msgstr "Impressora de Etiquetas" + +msgid "Label Top" +msgstr "Parte Superior da Etiqueta" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Endereço Grande" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Endereço Grande - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Claro" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Linha maior do que o máximo permitido (255 caracteres)" + +msgid "List Available Printers" +msgstr "Listar Impressoras Disponíveis" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Localização: " + +msgid "Long-Edge (Portrait)" +msgstr "Margem Grande (Vertical)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Marca e Modelo: " + +msgid "Manual Feed" +msgstr "Alimentação Manual" + +msgid "Media Dimensions: " +msgstr "Dimensões da Mídia: " + +msgid "Media Limits: " +msgstr "Limites da Mídia: " + +msgid "Media Name: " +msgstr "Nome da Mídia: " + +msgid "Media Size" +msgstr "Tamanho de Mídia" + +msgid "Media Source" +msgstr "Fonte de Mídia" + +msgid "Media Tracking" +msgstr "Rastreamento de Mídia" + +msgid "Media Type" +msgstr "Tipo de Mídia" + +msgid "Medium" +msgstr "Médio" + +msgid "Memory allocation error" +msgstr "Erro de alocação de memória" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Cabeçalho PPD-Adobe-4.x ausente" + +msgid "Missing asterisk in column 1" +msgstr "Asterisco ausente na coluna 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Seqüência de caracteres de valor ausente" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Modificar Classe" + +msgid "Modify Printer" +msgstr "Modificar Impressora" + +msgid "Move All Jobs" +msgstr "Mover Todos os Trabalhos" + +msgid "Move Job" +msgstr "Mover Trabalho" + +msgid "Moved Permanently" +msgstr "Movido Permanentemente" + +msgid "NULL PPD file pointer" +msgstr "Ponteiro de arquivo NULL PPD" + +msgid "Name OID uses indefinite length" +msgstr "OID do nome usa comprimento indefinido" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Nunca" + +msgid "New Stylus Color Series" +msgstr "New Stylus Color Series" + +msgid "New Stylus Photo Series" +msgstr "New Stylus Photo Series" + +msgid "No" +msgstr "Não" + +msgid "No Content" +msgstr "Sem Conteúdo" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Nenhuma VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Nenhuma conexão ativa" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Nenhum nome de comunidade" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Nenhum destino adicionado." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Nenhum error-index" + +msgid "No error-status" +msgstr "Nenhum error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Nenhum OID de nome" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Nenhum request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Nenhuma inscrição encontrada." + +msgid "No variable-bindings SEQUENCE" +msgstr "Nenhuma variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Nenhum número de versão" + +msgid "Non-continuous (Mark sensing)" +msgstr "Descontínuo (Leitura de marcas)" + +msgid "Non-continuous (Web sensing)" +msgstr "Descontínuo (Leitura Web)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Não Encontrado" + +msgid "Not Implemented" +msgstr "Não Implementado" + +msgid "Not Installed" +msgstr "Não Instalado" + +msgid "Not Modified" +msgstr "Não Modificado" + +msgid "Not Supported" +msgstr "Incompatível" + +msgid "Not allowed to print." +msgstr "Não permitido para impressão." + +msgid "Note" +msgstr "Nota" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Desligado (Frente)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Ajuda On-line" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "falha na abertura de %s: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup sem um CloseGroup primeiro" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI sem um CloseUI/JCLCloseUI primeiro" + +msgid "Operation Policy" +msgstr "Política de Operação" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Opções Instaladas" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Opções: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Modo de Saída" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Impressora Laser PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "O pacote não contém uma Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "O pacote não começa com SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Senha para %s em %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "A senha para %s requerida para acessar %s através do SAMBA: " + +msgid "Pause Class" +msgstr "Interromper Classe" + +msgid "Pause Printer" +msgstr "Colocar Impressora em Pausa" + +msgid "Peel-Off" +msgstr "Soltar" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Etiquetas de Foto" + +msgid "Plain Paper" +msgstr "Papel Normal" + +msgid "Policies" +msgstr "Políticas" + +msgid "Port Monitor" +msgstr "Monitor da Porta" + +msgid "PostScript Printer" +msgstr "Impressora PostScript" + +msgid "Postcard" +msgstr "Cartão-Postal" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Densidade da Impressão" + +msgid "Print Job:" +msgstr "Imprimir Trabalho:" + +msgid "Print Mode" +msgstr "Modo de Impressão" + +msgid "Print Rate" +msgstr "Taxa de Impressão" + +msgid "Print Self-Test Page" +msgstr "Imprimir Página de Autoteste" + +msgid "Print Speed" +msgstr "Velocidade de Impressão" + +msgid "Print Test Page" +msgstr "Imprimir Página de Teste" + +msgid "Print and Cut" +msgstr "Imprimir e Cortar" + +msgid "Print and Tear" +msgstr "Imprimir e Romper" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Impresso para: " + +msgid "Printed From: " +msgstr "Impresso de: " + +msgid "Printed On: " +msgstr "Impresso em: " + +msgid "Printer Added" +msgstr "Impressora Adicionada" + +msgid "Printer Default" +msgstr "Padrão de Impressora" + +msgid "Printer Deleted" +msgstr "Impressora Apagada" + +msgid "Printer Modified" +msgstr "Impressora Modificada" + +msgid "Printer Name: " +msgstr "Nome de Impressora: " + +msgid "Printer Paused" +msgstr "Impressora em Pausa" + +msgid "Printer Settings" +msgstr "Ajustes da Impressora" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Impressora:" + +msgid "Printers" +msgstr "Impressoras" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Ignorar Trabalhos" + +msgid "Quarto" +msgstr "Quarto" + +msgid "Quota limit reached." +msgstr "Limite de quota alcançado." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Rejeitar Trabalhos" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Imprimir Novamente Após Erro" + +msgid "Request Entity Too Large" +msgstr "Entidade do Pedido Muito Grande" + +msgid "Resolution" +msgstr "Resolução" + +msgid "Resume Class" +msgstr "Retomar Classe" + +msgid "Resume Printer" +msgstr "Retomar Impressora" + +msgid "Return Address" +msgstr "Endereço de Devolução" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Endereço de Devolução - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Retroceder" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE usa comprimento indefinido" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Ver Outro" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Porta serial nº%d" + +msgid "Server Restarted" +msgstr "Servidor Reiniciado" + +msgid "Server Security Auditing" +msgstr "Auditoria de Segurança de Servidor" + +msgid "Server Started" +msgstr "Servidor Iniciado" + +msgid "Server Stopped" +msgstr "Servidor Parado" + +msgid "Service Unavailable" +msgstr "Serviço Não Disponível" + +msgid "Set Allowed Users" +msgstr "Definir Usuários Permitidos" + +msgid "Set As Server Default" +msgstr "Definir como Padrão de Servidor" + +msgid "Set Class Options" +msgstr "Definir Opções de Classe" + +msgid "Set Printer Options" +msgstr "Definir Opções de Impressão" + +msgid "Set Publishing" +msgstr "Definir Publicação" + +msgid "Shipping Address" +msgstr "Endereço de Remessa" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Endereço de Remessa - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Margem Pequena (Horizontal)" + +msgid "Special Paper" +msgstr "Papel Especial" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Padrão" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Iniciando Banner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Instrução" + +msgid "Stylus Color Series" +msgstr "Stylus Color Series" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo Series" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Alternando Protocolos" + +msgid "Tabloid" +msgstr "Tablóide" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Rasgar" + +msgid "Tear-Off" +msgstr "Remover" + +msgid "Tear-Off Adjust Position" +msgstr "Remover Posição de Ajuste" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "O arquivo PPD \"%s\" não pôde ser encontrado." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "O arquivo PPD \"%s\" não pôde ser aberto: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"O nome de classe pode conter apenas até 127 caracteres imprimíveis e não " +"pode conter espaços, barras (/) ou o sinal de quadrado (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"O atributo notify-lease-duration não pode ser usado com as inscrições de " +"trabalho." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"O nome da impressora somente pode conter até 127 caracteres imprimíveis e " +"não pode conter espaços, barras (/) ou o sinal de quadrado (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "O printer-uri \"%s\" contém caracteres inválidos." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"O printer-uri deve ser do formato \"ipp://HOSTNAME/classes/CLASSNAME\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"O printer-uri deve ser do formato \"ipp://HOSTNAME/printers/PRINTERNAME\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"O nome de inscrição pode não conter espaços, barras (/), pontos de " +"interrogação (?) ou o sinal de quadrado (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Há muitas assinaturas." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Mídia de Transferência Termal" + +msgid "Title: " +msgstr "Título: " + +msgid "Too many active jobs." +msgstr "Muitos trabalhos ativos." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Transparência" + +msgid "Tray" +msgstr "Bandeja" + +msgid "Tray 1" +msgstr "Bandeja 1" + +msgid "Tray 2" +msgstr "Bandeja 2" + +msgid "Tray 3" +msgstr "Bandeja 3" + +msgid "Tray 4" +msgstr "Bandeja 4" + +msgid "URI Too Long" +msgstr "URI Muito Extenso" + +msgid "US Ledger" +msgstr "Duplo Carta EUA" + +msgid "US Legal" +msgstr "Legal EUA" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "Carta EUA" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Porta Serial USB nº%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Não é possível acessar cupsd.conf file:" + +msgid "Unable to add RSS subscription:" +msgstr "Não é possível adicionar a inscrição RSS:" + +msgid "Unable to add class:" +msgstr "Não é possível adicionar a classe:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Não é possível adicionar a impressora:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Não é possível cancelar a inscrição RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Não é possível alterar o atributo printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Não é possível alterar a impressora:" + +msgid "Unable to change server settings:" +msgstr "Não é possível alterar as configurações do servidor:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Não é possível conectar ao host." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Não é possível criar o arquivo temporário:" + +msgid "Unable to delete class:" +msgstr "Não é possível apagar a classe:" + +msgid "Unable to delete printer:" +msgstr "Não é possível apagar a impressora:" + +msgid "Unable to do maintenance command:" +msgstr "Não é possível fazer um comando de manutenção:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Não é possível obter a lista de classe:" + +msgid "Unable to get class status:" +msgstr "Não é possível obter o estado de classe:" + +msgid "Unable to get list of printer drivers:" +msgstr "Não é possível obter uma lista de drivers de impressora:" + +msgid "Unable to get printer attributes:" +msgstr "Não é possível obter os atributos de impressora:" + +msgid "Unable to get printer list:" +msgstr "Não é possível obter a lista de impressão:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Não é possível obter o estado da impressora:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Não é possível modificar a classe:" + +msgid "Unable to modify printer:" +msgstr "Não é possível modificar a impressora:" + +msgid "Unable to move job" +msgstr "Não é possível mover o trabalho" + +msgid "Unable to move jobs" +msgstr "Não é possível mover os trabalhos" + +msgid "Unable to open PPD file" +msgstr "Não é possível abrir o arquivo PPD" + +msgid "Unable to open PPD file:" +msgstr "Não é possível abrir o arquivo PPD:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Não é possível abrir o arquivo cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Não é possível imprimir uma página de teste:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Não é possível definir as opções:" + +msgid "Unable to set server default:" +msgstr "Não é possível definir o padrão do servidor:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Não é possível carregar o arquivo cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Não autorizado" + +msgid "Units" +msgstr "Unidades" + +msgid "Unknown" +msgstr "desconhecido" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "printer-error-policy desconhecido \"%s\"." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "printer-op-policy desconhecido \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Tipo de valor incompatível" + +msgid "Upgrade Required" +msgstr "Atualização Requerida" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Valor usa comprimento indefinido" + +msgid "VarBind uses indefinite length" +msgstr "VarBind usa comprimento indefinido" + +msgid "Version uses indefinite length" +msgstr "Versão usa comprimento indefinido" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Sim" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Você deve acessar esta página usando a URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Impressora de Etiquetas ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "anulado" + +msgid "canceled" +msgstr "cancelado" + +msgid "completed" +msgstr "concluído" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "falha de cups-deviced ao executar." + +msgid "cups-driverd failed to execute." +msgstr "falha de cups-driverd ao executar." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index usa comprimento indefinido" + +msgid "error-status uses indefinite length" +msgstr "error-status usa comprimento indefinido" + +msgid "held" +msgstr "mantido" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "ocioso" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "pendente" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "processando" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id usa comprimento indefinido" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "falha de stat de %s: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "parado" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "desconhecido" + +msgid "untitled" +msgstr "sem título" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings usa comprimento indefinido" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(todos)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(nenhum)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d entradas\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tApós falha: continuar\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tAlertas:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner requisitado\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tConjunto de caracteres:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tConexão: direta\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tConexão: remota\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tTamanho de página padrão:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tTom padrão:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tAjustes de porta padrão:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tDescrição: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tFormato montado:\n" +#~ "\tTipos de conteúdo: qualquer\n" +#~ "\tTipos de impressora: desconhecido\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tFormatos permitidos:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tInterface: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tInterface: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tInterface: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tLocalização: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tNa falha: nenhum alerta\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tUsuários permitidos:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tUsuários negados:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tapresentação de daemon\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tnenhuma entrada\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\ta impressora está no dispositivo '%s' velocidade -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\ta impressão está desativada\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\ta impressão está ativada\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tenfileirado para %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\to enfileiramento está desativado\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\to enfileiramento está ativado\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tmotivo desconhecido\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Página 15, seção 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Página 15, seção 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Página 19, seção 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Página 20, seção 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Página 27, seção 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Página 42, seção 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Página 16-17, seção 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Página 42-45, seção 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Página 45-46, seção 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Página 48-49, seção 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Página 52-54, seção 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f bytes\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Padrão%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Fabricante\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Produto\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN \"%s %s\" entra em conflito com \"%s %s\"\n" +#~ " (restrição=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s não possui opções correspondentes!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s compartilha um prefixo comum com %s\n" +#~ " REF: Página 15, seção 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Conflito de opções padrão!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Talvez a opção dúplex do teclado %s não funcione como " +#~ "esperado e deve ser denominada Dúplex!\n" +#~ " REF: Página 122, seção 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN O arquivo contém um mix de terminações de linha CR, LF e " +#~ "CR LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding solicitado por PPD 4.3 spec.\n" +#~ " REF: Páginas 56-57, seção 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN A linha %d contém apenas espaços em branco!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN Fabricante solicitado por PPD 4.3 spec.\n" +#~ " REF: Páginas 58-59, seção 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN Arquivo APDialogExtension ausente \"%s\"\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN Arquivo APPrinterIconPath ausente \"%s\"\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN Os arquivos PPD que não sejam do Windows devem usar " +#~ "linhas que terminem apenas com LF, e não com CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Versão PPD obsoleta%.1f!\n" +#~ " REF: Página 42, seção 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName maior que 8.3 em violação de PPD spec.\n" +#~ " REF: Páginas 61-62, seção 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Os protocolos contém PJL, mas os atributos JCL não estão " +#~ "definidos.\n" +#~ " REF: Páginas 78-79, seção 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Os protocolos contêm PJL e BCP; TBCP esperado.\n" +#~ " REF: Páginas 78-79, seção 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName solicitado por PPD 4.3 spec.\n" +#~ " REF: Páginas 64-65, seção 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s não existe!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Escolha %s inválida %s!\n" +#~ " REF: Página 122, seção 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s UTF-8 Inválido \"%s\" seqüência de caracteres de tradução para " +#~ "a opção %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s UTF-8 Inválido \"%s\" seqüência de caracteres de tradução para " +#~ "opção %s, escolha %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Valor de cupsFilter inválido \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s cupsICCProfile Inválido %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Valor de cupsPreFilter inválido \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s cupsUIConstraints Inválido %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Idioma inválido \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints Vazio %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Ausente \"%s\" seqüência de caracteres de tradução para a opção " +#~ "%s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Ausente \"%s\" seqüência de caracteres de tradução para a opção " +#~ "%s, escolha %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Escolha ausente *%s %s em UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Escolha ausente *%s %s em cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Arquivo cupsFilter ausente \"%s\"\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Arquivo cupsICCProfile ausente \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Arquivo cupsPreFilter ausente \"%s\"\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s cupsUIResolver ausente %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Opção ausente %s em UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Opção ausente %s em cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr "" +#~ " %s Nenhuma tradução base de \"%s\" está incluída no arquivo!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s REQUIRED %s não define a opção Nenhum!\n" +#~ " REF: Página 122, seção 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s o valor hash de cupsICCProfile %s colide com %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s provoca um loop!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** %s os nomes de seleção %s e %s se diferenciam apenas por " +#~ "maiúscula ou minúscula!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s deve ser 1284DeviceID!\n" +#~ " REF: Página 72, seção 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** BAD Padrão%s %s\n" +#~ " REF: Página 40, seção 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Página 102, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Página 103, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** BAD atributo JobPatchFile no arquivo\n" +#~ " REF: Página 24, seção 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** BAD Fabricante (deve ser \"HP\")\n" +#~ " REF: Página 211, tabela D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** BAD Fabricante (deve ser \"Oki\")\n" +#~ " REF: Página 211, tabela D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** BAD ModelName - \"%c\" não permitido na seqüência de " +#~ "caracteres.\n" +#~ " REF: Páginas 59-60, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** BAD PSVersion - não \"(seqüência de caracteres) int\".\n" +#~ " REF: Páginas 62-64, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** BAD Produto - não \"(seqüência de caracteres)\".\n" +#~ " REF: Página 62, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** BAD ShortNickName - maior que 31 caracteres.\n" +#~ " REF: Páginas 64-65, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Escolha %s inválida %s!\n" +#~ " REF: Página 84, seção 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FileVersion Inválida \"%s\"\n" +#~ " REF: Página 56, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** FormatVersion Inválido \"%s\"\n" +#~ " REF: Página 56, seção 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** LanguageEncoding %s inválido - deve ser ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FAIL** LanguageVersion %s inválido - deve ser inglês!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** O código de opção padrão não pode ser interpretado: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Seqüência de caracteres de tradução padrão para opção %s " +#~ "escolha %s contém caracteres de 8 bits!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Seqüência de caracteres de tradução padrão para opção %s " +#~ "contém caracteres de 8 bits!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Os nomes dos grupos %s e %s se diferenciam apenas por " +#~ "maiúscula ou minúscula!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Ocorrências múltiplas de %s nome de seleção %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Os nomes das opções %s e %s se diferenciam apenas por " +#~ "maiúscula ou minúscula!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Padrão%s\n" +#~ " REF: Página 40, seção 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Página 102, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Página 103, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Página 56, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Página 56, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ImageableArea para PageSize %s\n" +#~ " REF: Página 41, seção 5.\n" +#~ " REF: Página 102, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Páginas 56-57, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Páginas 57-58, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Fabricante\n" +#~ " REF: Páginas 58-59, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Páginas 59-60, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Página 60, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Páginas 61-62, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Páginas 62-64, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Página 100, seção 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Página 41, seção 5.\n" +#~ " REF: Página 99, seção 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Páginas 99-100, seção 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED PaperDimension para PageSize %s\n" +#~ " REF: Página 41, seção 5.\n" +#~ " REF: Página 103, seção 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED Produto\n" +#~ " REF: Página 62, seção 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Página 64-65, seção 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d ERROS ENCONTRADOS\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " %%%%BoundingBox inválido: na linha %d!\n" +#~ " REF: Página 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " %%%%Página inválida: na linha %d!\n" +#~ " REF: Página 53, %%%%Página:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " %%%%Páginas inválidas: na linha %d!\n" +#~ " REF: Página 43, %%%%Páginas:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " A linha %d é maior do que 255 caracteres (%d)!\n" +#~ " REF: Página 25, Comprimento de Linha\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 ausente na primeira linha!\n" +#~ " REF: Página 17, 3.1 Documentos Conformes\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Comentário %%EndComments ausente!\n" +#~ " REF: Página 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox ausente ou inválido: comentário!\n" +#~ " REF: Página 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Página ausente ou inválida: comentários!\n" +#~ " REF: Página 53, %%Página:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Páginas ausentes ou inválidas: comentário!\n" +#~ " REF: Página 43, %%Páginas:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " NENHUM ERRO ENCONTRADO\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Visualizadas %d linhas que excedem 255 caracteres!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Muitos comentários %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Muitos comentários %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Aviso: o arquivo contém dados binários!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Aviso: nenhum comentário %%EndComments no arquivo!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Aviso: versão DSC obsoleta %.1f no arquivo!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Não é possível abrir o arquivo - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Não é possível abrir o arquivo PPD - %s na linha %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Envelope" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Envelope" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Envelope" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Envelope" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Envelope" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s aceitando solicitações desde %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s não está implementado pela versão CUPS de lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s não está pronto\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s está pronto\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s está pronto e imprimindo\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s não está aceitando solicitações desde %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s não é compatível!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s está aceitando solicitações desde %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s não está aceitando solicitações desde %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [trabalho %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s falhou: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Não sei o que fazer!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Erro - %s nomes de variáveis de ambiente de destino não existente \"%s" +#~ "\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Erro - ID de trabalho inválido!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Erro - não é possível imprimir arquivos e alterar trabalhos " +#~ "simultaneamente!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Erro - não é possível imprimir a partir de stdin se os arquivos ou um " +#~ "ID de trabalho forem fornecidos!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Erro - conjunto de caracteres esperado após opção '-S'!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Erro - tipo de conteúdo esperado após opção '-T'!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Erro - cópias esperadas após opção '-n'!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Erro - contagem de cópias esperadas após opção '-#'!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-P'!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-b'!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Erro - destino esperado após opção '-d'!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Erro - formulário esperado após opção '-f'!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Erro - nome mantido esperado após opção '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Erro - nome de host esperado após opção '-H'!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Erro - nome de host esperado após opção '-H'!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Erro - lista de modo esperado após opção '-y'!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Erro - nome esperado após opção '-%c'!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "" +#~ "%s: Erro - seqüência de caracteres de opção esperada após opção '-o'!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Erro - lista de página esperada após opção '-P'!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Erro - prioridade esperada após opção '-%c'!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Erro - texto de motivo esperado após opção '-r'!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Erro - título esperado após opção '-t'!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Erro - nome de usuário esperado após opção '-U'!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Erro - nome de usuário esperado após opção '-U'!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Erro - valor esperado após opção '-%c'!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Erro - necessária opções \"completo\", \"incompleto\" ou \"todos\" " +#~ "após opção '-W'!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Erro - nenhum destino padrão disponível.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Erro - prioridade deve estar entre 1 e 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Erro - programador não responde!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Erro - muitos arquivos - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Erro - não foi possível acessar \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "" +#~ "%s: Erro - não foi possível fazer a fila a partir da mensagem padrão - %" +#~ "s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Erro - destino desconhecido \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Erro - destino desconhecido \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Erro - opção desconhecida '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Erro - opção desconhecida '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: ID de trabalho esperada após opção '-i'!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filtro \"%s\" não disponível: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Nome de destino inválido na lista \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Seqüência de caracteres inválida \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s: ID de trabalho necessária ('-i jobid') antes de 'reinício -H'!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Nenhum filtro para converter de %s/%s para %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Falha de operação: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Desculpe, não há compatibilidade de encriptação compilada!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Não é possível conectar ao servidor\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Não é possível contactar ao servidor!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Não é possível determinar o tipo MIME de \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Não é possível abrir %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Não é possível abrir %s - %s on-line %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Não é possível abrir %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Não é possível abrir um arquivo PPD: %s on-line %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Não é possível ler o banco de dados MIME de \"%s\" ou \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Destino desconhecido \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Tipo MIME de destino desconhecido %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Opção desconhecida '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Tipo MIME de fonte desconhecida %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Aviso - '%c' modificador de formato não compatível - a saída pode não " +#~ "ser correta!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Aviso - opção de conjunto de caracteres foi ignorada!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Aviso - opção de tipo de conteúdo foi ignorada!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Aviso - opção de formulário foi ignorada!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Aviso - opção de modo foi ignorada!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: erro - %s nomes de variáveis de ambiente de destino não existente \"%s" +#~ "\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: erro - option=value esperado após opção '-o'!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: erro - nenhum destino padrão disponível.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 ppp da escala de cinza" + +#~ msgid "60x720dpi" +#~ msgstr "60x720ppp" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Comando de ajuda inválido desconhecido\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "" +#~ "Uma senha do Samba é solicitada para exportar os drivers da impressora!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "" +#~ "Um nome de usuário do Samba é solicitado para exportar os drivers da " +#~ "impressora!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Uma classe chamada \"%s\" já existe!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Uma impressora chamada \"%s\" já existe!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (Excessivamente grande)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (Excessivamente grande)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (Pequeno)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (Excessivamente grande)" + +#~ msgid "ARCH A" +#~ msgstr "ARCO A" + +#~ msgid "ARCH B" +#~ msgstr "ARCO B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "" +#~ "Tentativa de configurar o estado da impressora %s para valor inválido %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Os grupos de atributos estão fora de ordem (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Dispositivo URI inválido \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "dispositivo uri inválido \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Esquema device-uri inválido \"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "formato de documento inválido \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Armazenamento intermediário do nome do arquivo inválido!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Atributo de fonte inválido: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Valor de job-priority inválido!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Valor job-sheets inválido \"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Tipo de valor job-sheets inválido!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Valor de job-state inválido!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Atributo de job-uri inválido \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "notify-pull-method inválido \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "notify-recipient-uri URI inválido \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "opção + escolha inválida na linha %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "port-monitor inválido \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Valor de printer-state inválido %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Número de versão de solicitação inválido %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "ID de inscrição inválido!" + +#~ msgid "C0 Envelope" +#~ msgstr "Envelope C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Envelope C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Envelope C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Envelope C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Envelope C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Envelope C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Envelope C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Envelope C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Envelope C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Conjunto de caracteres \"%s\" não compatível!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Envelope Chou3" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Envelope Chou4" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Os comandos podem ser abreviados. Os comandos são:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Não foi possível escanear tipo \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Tampa aberta." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "Envelope DL" + +#~ msgid "Developer almost empty." +#~ msgstr "Desenvolvedor quase vazio." + +#~ msgid "Developer empty!" +#~ msgstr "Desenvolvedor vazio!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Dispositivo: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Documento %d não encontrado no trabalho %d." + +#~ msgid "Door open." +#~ msgstr "Porta aberta." + +#~ msgid "Double Postcard" +#~ msgstr "Cartão-Postal Duplo" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "" +#~ "EMERG: Não é possível alocar memória para informação de página: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Não é possível alocar memória para matriz de páginas: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox inválido: comentário visto!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: %%IncludeFeature inválido: comentário!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: %%Página inválido: comentário no arquivo!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: %%PageBoundingBox inválido: comentário no arquivo!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Arquivo de dispositivo SCSI inválido \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Arquivo de conjunto de caracteres inválido %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Tipo de conjunto de caracteres inválido %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Valor de colunas inválido %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Valor cpi inválido %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Linha de descrição de fonte inválida: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Valor lpi inválido %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Configuração de página inválida!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Direção de texto inválida %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Largura de texto inválida %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Impressora de destino inexistente!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Duplicar %%BoundingBox: comentário visto!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Duplicar %%Páginas: comentário visto!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Arquivo de impressão vazio!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Erro %d ao enviar pedido PAPSendData: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: Seqüência de caracteres on-line esperada %d de %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Erro grave de USB!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Comentário visto HP-GL/2 inválido, não é possível imprimir o " +#~ "arquivo!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: %%EndProlog ausente!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: %%EndSetup ausente!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: URI de dispositivo ausente URI em command-line e nenhuma variável " +#~ "de ambiente DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Valor ausente na linha %d do arquivo de banner!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Necessária uma linha msgid antes de quaisquer seqüências de " +#~ "caracteres na linha %d de %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Nenhum %%BoundingBox: comentário no cabeçalho!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Nenhum %%Pages: comentário no cabeçalho!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Nenhum dispositivo URI encontrado em argv[0] ou em variável de " +#~ "ambiente DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Nenhuma fonte no arquivo de conjunto de caracteres %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Nenhuma página encontrada!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Sem papel!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: Variável de ambiente PRINTER não definido!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: O arquivo de impressão não foi aceito (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: A impressora não responde\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: A impressora não responde!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: A impressora enviou um EOF inesperado\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Host remoto não aceitou o arquivo de controle (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Host remoto não aceitou o arquivo de dados (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Houve um erro de tempo esgotado ao enviar os dados à impressora\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Não é possível adicionar o arquivo %d ao trabalho: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Não é possível cancelar o trabalho %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Não foi possível copiar o arquivo PDF" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Não foi possível criar soquete" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível criar o arquivo de impressão comprimido temporário: " +#~ "%s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Não é possível criar o arquivo temporário" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Não é possível criar o arquivo temporário - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Não é possível criar o arquivo temporário: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível executar pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Não é possível executar o programa gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Não é possível executar o programa pdftops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível forçar pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Não é possível obter o pedido PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Não é possível obter a resposta PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "" +#~ "ERROR: Não é possível obter o arquivo PPD para a impressora \"%s\" - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Não é possível obter a zona AppleTalk" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Não é possível obter os atributos %d do trabalho (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Não é possível obter o estado de impressão (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Não é possível localizar a impressora '%s'!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Não é possível procurar a resposta PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Não é possível buscar impressoras AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Não é possível criar o endereço AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Não é possível abrir \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Não é possível abrir %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de banner \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de dispositivo \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de imagem para impressão!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de impressão \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de impressão %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Não é possível abrir o arquivo de impressão %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível abrir o arquivo de impressão comprimido temporário: " +#~ "%s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Não é possível abrir o arquivo temporário" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Não é possível imprimir %d colunas de texto!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Não é possível imprimir %dx%d página de texto!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Não é possível ler os dados de impressão" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Não é possível ler os dados de impressão!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Não é possível reservar porta" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Não é possível localizar o deslocamento %ld no arquivo- %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível localizar o deslocamento %lld no arquivo - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Não é possível enviar um comando LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Não é possível enviar um pedido tickle de PAP" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Não é possível enviar o pedido de dados de envio PAP inicial" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Não é possível enviar dados de impressão (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Não é possível enviar dados de impressão!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Não é possível enviar o arquivo de impressão à impressora" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "" +#~ "ERROR: Não é possível enviar o valor nulo do fim da seqüência à impressora" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Não é possível aguardar pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Não é possível gravar %d bytes para \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Não é possível gravar %d bytes na impressora!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Não é possível gravar no arquivo de controle" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Não é possível gravar dados de impressão" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Não é possível gravar os dados de impressão: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Não é possível gravar os dados brutos para o driver!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Não é possível gravar no arquivo temporário" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "" +#~ "ERROR: Não é possível gravar os dados de documentos não comprimidos: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Texto inesperado na linha %d de %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Valor de opção de encriptação desconhecido \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Ordem de arquivo desconhecida \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Caractere de formato desconhecido \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Formato de catálogo de mensagem desconhecida para \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Opção desconhecida \"%s\" com valor \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Modo de impressão desconhecido \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Valor de opção de versão desconhecido \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: Valor de brilho não compatível %s, usando brilho=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Valor de gama não compatível %s, usando gama=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Valor de number-up não compatível %d, usando number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Valor de number-up-layout não compatível %s, usando number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Valor de page-border não compatível %s, usando page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: Sobrecarga de doc_printf (%d bytes) detectado, anulando!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: O filtro pdftops bloqueou no sinal %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: O filtro pdftops saiu com estado %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops saíram no sinal %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops saíram com estado %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: recuperável: Não é possível conectar-se à impressora; nova " +#~ "tentativa em 30 segundos...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: Seleção() falhou" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: Não foi possível iniciar o arquivo de impressão" + +#~ msgid "Empty PPD file!" +#~ msgstr "Arquivo PPD vazio!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Error: necessário um nome de host após a opção '-h'!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "URIs de dispositivo de arquivo foram desativados! Para ativá-los, " +#~ "consulte a diretiva FileDevice em \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Temperatura do fuser alta!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Temperatura do fuser baixa!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Obtido um atributo printer-uri, mas não um job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk desativado nas Preferências do Sistema\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk desativado nas Preferências do Sistema.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Cancelando trabalho de impressão...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Conectado à impressora...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Conectando à impressora...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Arquivo de controle enviado com êxito\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Arquivo de dados enviado com êxito\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Formatando página %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Carregando arquivo de imagem...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Buscando impressora...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Abrindo conexão\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "" +#~ "INFO: Arquivo de impressão enviado, aguardando conclusão da " +#~ "impressora...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa em 10 segundos...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa em 30 segundos...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Impressora ocupada; nova tentativa em 5 segundos...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: A impressora não é compatível com IPP/%d.%d, tentando IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: A impressora está ocupada; nova tentativa em 5 segundos...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: A impressora está atualmente desligada.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: A impressora está desligada atualmente.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: A impressora está conectada agora.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: A impressora está desligada.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: Impressora não conectada; nova tentativa em 30 segundos...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Imprimindo página %d, %d%% concluído...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Imprimindo página %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Pronta para imprimir.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Enviando arquivo de controle (%lu bytes)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Enviando arquivo de controle (%u bytes)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Enviando dados\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Enviando arquivo de dados (%ld bytes)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Enviando arquivo de dados (%lld bytes)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Enviando dados de impressão...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Arquivo de impressão enviado, %ld bytes...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Arquivo de impressão enviado, %lld bytes...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Armazenando trabalho LPR, %.0f%% concluído...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Não foi possível contactar a impressora, enfileirando na próxima " +#~ "impressora na classe...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Usando zona AppleTalk padrão \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Aguardando conclusão do trabalho...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Esperando que a impressora esteja disponível...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "Envelope ISO B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (Exces. grande)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "Envelope ISO B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "Envelope ISO B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Tinta/toner quase vazios." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Tinta/toner vazios!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Recipiente de tinta/toner quase cheio." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Recipiente de tinta/toner cheio!" + +#~ msgid "Interlock open." +#~ msgstr "Conexão aberta." + +#~ msgid "Invite Envelope" +#~ msgstr "Envelope de Convite" + +#~ msgid "Italian Envelope" +#~ msgstr "Envelope Italiano" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "O trabalho #%d não pode ser reiniciado - nenhum arquivo!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "O trabalho #%d não existe!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "O trabalho #%d está finalizado e não pode ser alterado!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "O trabalho #%d não está concluído!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "O trabalho #%d não está parado para autenticação!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "O trabalho #%d não está parado!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "O trabalho #%s não existe!" + +#~ msgid "Job %d not found!" +#~ msgstr "Trabalho %d não encontrado!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "As inscrições do trabalho não podem ser renovadas!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Envelope Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Envelope Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Idioma \"%s\" não compatível!" + +#~ msgid "Media jam!" +#~ msgstr "Atolamento de mídia!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Bandeja de mídia quase vazia." + +#~ msgid "Media tray empty!" +#~ msgstr "Bandeja de mídia vazia!" + +#~ msgid "Media tray missing!" +#~ msgstr "Bandeja de mídia ausente!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "A bandeja de mídia necessita ser preenchida." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Atributo document-number ausente!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Aspas ausentes na linha %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Variável de formato ausente!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Atributo notify-subscription-ids ausente!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Atributo requesting-user-name ausente!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Atributos necessários ausentes!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Valor ausente na linha %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modelo: nome = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarca" + +#~ msgid "Monarch Envelope" +#~ msgstr "Envelope Monarca" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Arquivo de impressão aceito - ID de trabalho %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "" +#~ "NOTICE: Arquivo de impressão aceito - ID de trabalho desconhecido.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Nenhum nome PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Nenhum driver de impressora do Windows instalado!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Nenhum trabalho ativo em %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Nenhum atributo na solicitação!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Nenhuma informação de autenticação fornecida!" + +#~ msgid "No default printer" +#~ msgstr "Nenhuma impressora padrão" + +#~ msgid "No file!?!" +#~ msgstr "Nenhum arquivo!?!" + +#~ msgid "No modification time!" +#~ msgstr "Nenhuma hora de modificação!" + +#~ msgid "No printer name!" +#~ msgstr "Nenhum nome de impressora!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Nenhum printer-uri encontrado para a classe!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Nenhum printer-uri encontrado!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Nenhum printer-uri em pedido!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Nenhum atributo de inscrição na solicitação!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC quase no final." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC no final!" + +#~ msgid "Out of toner!" +#~ msgstr "Sem toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Recipiente de saída quase cheio." + +#~ msgid "Output bin full!" +#~ msgstr "Recipiente de saída cheio!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "A saída para impressora %s foi enviada a %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "A saída para impressora %s foi enviada à impressora remota %s em %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "A saída para impressora %s/%s foi enviada a %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "A saída para impressora %s/%s foi enviada para a impressora remota %s em %" +#~ "s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Bandeja de saída ausente!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Envelope PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Envelope PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Envelope PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Envelope PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (Exces. grande)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Envelope PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Envelope PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Envelope PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Envelope PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Envelope PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Envelope PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Envelope Pessoal" + +#~ msgid "Printer offline." +#~ msgstr "Impressora desconectada." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Rank Proprietário Trabalho Arquivo(s) " +#~ "Tamanho Total\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Rank Proprietário Imp Trabalho " +#~ "Arquivos Tamanho Total\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Executando comando: %s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Impressora SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tablóide (Exces. grande)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "O valor notify-user-data é muito grande (%d > 63 octetos)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "A impressora ou a classe não estão compartilhadas!" + +#~ msgid "The printer or class was not found." +#~ msgstr "A impressora ou a classe não foram encontradas." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "O atributo printer-uri é necessário!" + +#~ msgid "Toner low." +#~ msgstr "Toner baixo." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Muitos valores de job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Muitos valores de printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "Executivo EUA" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "Legal EUA (Muito Grande)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "Carta EUA (Muito Grande)" + +#~ msgid "US Letter (Small)" +#~ msgstr "Carta EUA (Pequeno)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Não é possível adicionar o trabalho para o destino \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Não é possível alocar memória para os tipos de arquivo!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar arquivos de driver de impressora CUPS de 64-bit (%" +#~ "d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar arquivos do driver da impressora Windows de 64-bit " +#~ "(%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os arquivos do driver de impressora CUPS (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Não é possível copiar o arquivo PPD - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Não é possível copiar o arquivo PPD!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os arquivos do driver de impressora do Windows 2000 " +#~ "(%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível copiar os arquivos do driver de impressora do Windows 9x (%" +#~ "d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Não é possível copiar o roteiro de interface - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Não é possível criar printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Não é possível editar os arquivos cupsd.conf maiores que 1MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Não é possível buscar o destino para o trabalho!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Não é possível encontrar a impressora!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível instalar os arquivos de drivers de impressora do Windows " +#~ "2000 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "" +#~ "Não é possível instalar os arquivos de drivers de impressora do Windows " +#~ "9x (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Não é possível abrir o documento %d no trabalho %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Não é possível executar \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Não é possível enviar o comando ao driver da impressora!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Não é possível configurar o driver de impressora do Windows (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Não é possível usar o driver de classe USB de legado!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Erro de impressora desconhecido (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Conjunto de caracteres incompatíveis \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Compressão não compatível \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Atributo de compressão não compatível %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Formato não compatível \"%s\"!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Formato não compatível '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Formato não compatível '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "" +#~ "Usage: %s opções de cópias de título do usuário do trabalho [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Usage: opções de cópias de título de usuário %s job-id [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "" +#~ "Usage: arquivo de opções de cópias de título de usuário %s job-id \n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Usage: converter [ options ]\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -f filename Definir arquivo para conversão (senão stdin)\n" +#~ " -o filename Definir para ser gerado (senão stdout)\n" +#~ " -i mime/type Definir tipo MIME de entrada (senão auto-typed)\n" +#~ " -j mime/type Definir tipo MIME de saída (senão application/" +#~ "pdf)\n" +#~ " -P filename.ppd Definir arquivo PPD\n" +#~ " -a 'name=value ...' Definir opção(ões)\n" +#~ " -U username Definir nome do usuário para trabalho\n" +#~ " -J title Definir título\n" +#~ " -c copies Definir número de cópias\n" +#~ " -u Remover o arquivo PPD ao terminar\n" +#~ " -D Remover o arquivo de entrada ao terminar\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Opções:\n" +#~ " -E Encriptar a conexão ao servidor\n" +#~ " -H samba-server Usar o servidor SAMBA denominado\n" +#~ " -U samba-user Autenticar usando o usuário do SAMBA denominado\n" +#~ " -a Exportar todas as impressoras\n" +#~ " -h cups-server Usar o servidor CUPS denominado\n" +#~ " -v Ser detalhado (mostrar comandos)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -E Ativar encriptação\n" +#~ " -U username Especificar username\n" +#~ " -h server[:port] Especificar endereço do servidor\n" +#~ "\n" +#~ " --[no-]debug-logging Ativar/desativar registro de depuração\n" +#~ " --[no-]remote-admin Ativar/desativar administração remota\n" +#~ " --[no-]remote-any Permitir/evitar acesso a partir da Internet\n" +#~ " --[no-]remote-printers Mostrar/ocultar impressoras remotas\n" +#~ " --[no-]share-printers Ativar/desativar compartilhamento de " +#~ "impressora\n" +#~ " --[no-]user-cancel-any Permitir/evitar que usuários cancelem " +#~ "qualquer trabalho\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Carregar arquivo de configuração alternativa\n" +#~ "-f Executar em segundo plano\n" +#~ "-F Executar em segundo plano, porém destacar\n" +#~ "-h Mostrar esta mensagem de uso\n" +#~ "-l Executar cupsd a partir de launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -c cupsd.conf Definir arquivo cupsd.conf para uso\n" +#~ " -j job-id[,N] Arquivo de filtro N do trabalho especificado (o padrão " +#~ "é o arquivo 1)\n" +#~ " -n cópias Definir número de cópias\n" +#~ " -o name=value Definir opção(ões)\n" +#~ " -p filename.ppd Definir arquivo PPD\n" +#~ " -t title Definir título\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -h Mostrar utilização do programa\n" +#~ "\n" +#~ " Nota: este programa apenas valida os comentários DSC, não o próprio " +#~ "PostScript.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Opções:\n" +#~ "\n" +#~ " -R root-directory Definir raiz alternada\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Expedir avisos em vez de erros\n" +#~ " -q Executar silenciosamente\n" +#~ " -r Usar modo aberto 'relaxed'\n" +#~ " -v Ser levemente detalhado\n" +#~ " -vv Ser bastante detalhado\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Usage: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Usage: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Opções:\n" +#~ " -D name=value Definir variável denominada ao valor.\n" +#~ " -I include-dir Adicionar diretório de inclusão ao caminho da " +#~ "busca.\n" +#~ " -c catalog.po Carregar o catálogo da mensagem especificada.\n" +#~ " -d output-dir Especificar o diretório de saída.\n" +#~ " -l lang[,lang,...] Especificar o(s) idioma(s) de saída (local).\n" +#~ " -m Usar o valor ModelName como nome de arquivo.\n" +#~ " -t Testar PPDs em vez de gerá-los.\n" +#~ " -v Ser detalhado (mais v's para maior detalhamento).\n" +#~ " -z Comprimir arquivos PPD usando GNU zip.\n" +#~ " --cr Terminar linhas com CR (Mac OS 9).\n" +#~ " --crlf Terminar linhas com CR + LF (Windows).\n" +#~ " --lf Terminar linhas com LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Definir variável denominada ao valor.\n" +#~ "Options:\n" +#~ " -I include-dir Adicionar diretório de inclusão ao caminho da busca.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Opções:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Opções:\n" +#~ " -D name=value Definir variável denominada ao valor.\n" +#~ " -I include-dir Adicionar diretório de inclusão ao caminho da busca.\n" +#~ " -v Ser detalhado (mais v's para maior detalhamento).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Usage: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "" +#~ "WARNING: Adicionando somente as primeiras %d impressoras encontradas" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boleano esperado para opção waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Falha ao ler o pedido side-channel!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: A opção \"%s\" não pode ser incluída através de IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: A impressora não responde\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: A impressora enviou um EOF inesperado\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: O host remoto não repondeu com o byte de estado de comando após %" +#~ "d segundos!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: O host remoto não repondeu com o byte de estado de controle após " +#~ "%d segundos!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: O host remoto não repondeu com o byte de estado de dados após %d " +#~ "segundos!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: Tempo esgotado para comando SCSI (%d); tentando novamente...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Este documento não está de acordo com o Adobe Document " +#~ "Structuring Conventions e pode não ser impresso corretamente!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Não é possível abrir \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Não é possível enviar o pedido de estado PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Pacote PAP do tipo %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Pacote PAP desconhecido do tipo %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Escolha desconhecida \"%s\" para a opção \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Opção desconhecida \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Taxa de transmissão não compatível %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: número esperado para a opção de estado \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: recuperável: O host de rede '%s' está ocupado; tentará novamente " +#~ "em %d segundos...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "" +#~ "Warning, nenhum driver de impressora do Windows 2000 está instalado!" + +#~ msgid "You4 Envelope" +#~ msgstr "Envelope You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: use a opção -f para especificar um arquivo para converter.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Nenhum arquivo PPD para a impressora \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: não é possível conectar ao servidor: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Opção desconhecida \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Opção desconhecida \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "" +#~ "cupsd: Nome de arquivo de configuração esperado após a opção \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: não é possível obter o diretório atual!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Argumento desconhecido \"%s\" - anulando!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Opção desconhecida \"%c\" - anulando!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: suporte launchd(8) não compilado, executando em modo normal.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: número de documento inválido %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: ID de trabalho inválido %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Apenas um filename pode ser especificado!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: não é possível criar um arquivo temporário: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: não é possível obter o arquivo de trabalho - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: A opção -q é incompatível com a opção -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: A opção -v é incompatível com a opção -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "dispositivo para %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "dispositivo para %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "ajuda\t\tobter ajuda sobre os comandos\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Atributo job-printer-uri ausente!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: O nome de classe pode conter apenas caracteres imprimíveis!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: PPD esperado após a opção '-P'!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Permitir/negar esperado:userlist após a opção '-u'!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Classe esperada após opção '-r'!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Nome de classe esperado após a opção '-c'!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Descrição esperada após a opção '-D'!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: URI de dispositivo esperado após a opção '-v'!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Tipo(s) de arquivo esperado após a opção '-I'!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Hostname esperado após a opção '-h'!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Interface esperada após a opção '-i'!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Localização esperada após a opção '-L'!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Modelo esperado após a opção '-m'!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: name=value esperado após a opção '-o'!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Impressora esperada após a opção '-p'!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Nome de impressora esperada após a opção '-d'!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Impressora ou classe esperada após a opção '-x'!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Nenhum nome de membro foi visto!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: A impressora %s já é um membro de classe %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: A impressora %s não é um membro de classe %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "" +#~ "lpadmin: O nome da impressora pode conter apenas caracteres imprimíveis!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível adicionar uma impressora à classe:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Não é possível conectar-se ao servidor: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Não é possível criar um arquivo temporário - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Não é possível criar um arquivo temporário: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Não é possível abrir um arquivo PPD \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Não é possível abrir o arquivo \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível remover uma impressora da classe:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar o arquivo PPD:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar o URI de dispositivo:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar o roteiro de interface ou arquivo " +#~ "PPD:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar o roteiro de interface:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar a descrição da impressora:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar a localização da impressora:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Não é possível configurar as opções da impressora:\n" +#~ " Você deve especificar um nome de impressora primeiro!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Opção permitir/negar desconhecida \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Argumento desconhecido '%s'!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Opção desconhecida '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Aviso - lista de tipo de conteúdo ignorada!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "" +#~ "lpinfo: seqüência de caracteres de ID de dispositivo 1284 esperada após --" +#~ "device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: idioma esperado após --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: modelar e fazer esperado após --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "" +#~ "lpinfo: seqüência de caracteres de produto esperada após --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: lista de esquema esperada após --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: lista de esquema esperada após --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: tempo esgotado esperado após --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Argumento desconhecido '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Opção desconhecida '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: opção desconhecida '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Não é possível conectar-se ao servidor: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Argumento desconhecido '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Opção desconhecida '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Nenhuma impressora!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Não é possível adicionar impressora ou instância: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Não é possível obter o arquivo PPD para %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Não é possível abrir o arquivo PPD para %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Impressora ou classe desconhecidas!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Apenas o root pode adicionar ou apagar senhas!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Arquivo de senha ocupado!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Arquivo de senha não atualizado!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Desculpe, a senha não coincide!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Desculpe, senha rejeitada.\n" +#~ "A sua senha deve ter pelo menos 6 caracteres, não pode conter\n" +#~ "o seu nome de usuário e deve possuir pelo menos uma letra e um número.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Desculpe, as senhas não coincidem!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "" +#~ "lppasswd: Não é possível copiar a seqüência de caracteres da senha: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Não é possível abrir o arquivo de senha: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Não é possível gravar para o arquivo de senha: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: falha ao fazer backup do arquivo de senha antigo: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: falha ao renomear o arquivo de senha: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: usuário \"%s\" e grupo \"%s\" não existem.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: erro - %s destino não existente de nomes de variáveis de ambiente " +#~ "\"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "membros de classe %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "nenhuma entrada\n" + +#~ msgid "no system default destination\n" +#~ msgstr "nenhum destino padrão de sistema\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events não especificado!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "URI notify-recipient-uri \"%s\" já foi usado!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI \"%s\" usa um esquema desconhecido!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d não confiável!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: adicionando diretório de inclusão \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: adicionando/atualizando texto UI de %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: valor booleano inválido (%s) na linha %d de %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: nome de resolução inválido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: palavra-chave de estado inválido %s na linha %d de %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: substituição de variável inválida ($%c) na linha %d de %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: escolha encontrada na linha %d de %s com nenhuma Opção!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: duplicar #po para local %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: definição de filtro esperada na linha %d de %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: nome de programa esperado na linha %d de %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: valor booleano esperado na linha %d de %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: conjunto de caracteres depois de Font na linha %d de %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: código de escolha esperado na linha %d de %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: nome/texto de escolha esperado na linha %d de %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: ordem de cor esperada para ColorModel na linha %d de %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: colorspace esperada para ColorModel na linha %d de %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: compressão esperada para ColorModel na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: seqüência de caracteres de restrição esperada para UIConstraints na " +#~ "linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: palavra-chave do tipo de driver esperado após DriverType na linha %" +#~ "d de %s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: tipo de dúplex esperado após Duplex na linha %d de %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: codificação esperada após Font na linha %d de %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: nome de arquivo esperado após #po %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: nome/texto de grupo esperado na linha %d de %s!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: nome de arquivo de inclusão esperado na linha %d de %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: número inteiro esperado na linha %d de %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: localidade esperada após #po na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Nome esperado após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Nome esperado após FileName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Nome esperado após Font na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Nome esperado após Manufacturer na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: nome esperado após MediaSize na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: nome esperado após ModelName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: nome esperado após PCFileName na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: nome/texto esperado após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: nome/texto esperado após Installable na linha %d de %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: nome/texto esperado após Resolution na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: combinação de nome/texto esperado para ColorModel na linha %d de %" +#~ "s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: nome/texto de opção esperado na linha %d de %s!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: seção de opção esperada na linha %d de %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: tipo de opção esperada na linha %d de %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: campo de substituição esperado após Resolution na linha %d de %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: número real esperado na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: resolução/tipo de mídia esperado após ColorProfile na linha %d de %" +#~ "s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: resolução/tipo de mídia esperado após SimpleColorProfile na linha %" +#~ "d de %s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: seletor esperado após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: estado esperado após Font na linha %d de %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: seqüência de caracteres esperada após Copyright na linha %d de %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: seqüência de caracteres esperada após Version na linha %d de %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: dois nomes de opção esperados na linha %d de %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: valor esperado após %s na linha %d de %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: versão esperada após Font na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: nome de arquivo #include/#po inválido \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: custo inválido para filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: tipo MIME vazio inválido para filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: nome de programa vazio inválido para filtro na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: seção de opção inválida \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tipo de opção inválida \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: carregando arquivo de informações de driver \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: carregando mensagens para localidade \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: carregando mensagens de \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: #endif ausente no final de \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: #if ausente na linha %d de %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: nenhum catálogo de mensagem fornecido para a localidade %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: opção %s redefinida com um tipo diferente na linha %d de %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: a restrição da opção deve *name na linha %d de %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: muitos aninhados #if's na linha %d de %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: não é possível criar um arquivo PPD \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: não é possível criar o diretório de saída %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: não é possível criar canais de saída: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: não é possível executar cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Não é possível buscar o arquivo #po %s na linha %d de %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Não é possível buscar o arquivo de inclusão \"%s\" na linha %d de %" +#~ "s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Não é possível buscar a localização para \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "" +#~ "ppdc: Não é possível carregar o arquivo de localização \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Variável indefinida (%s) na linha %d de %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: tipo de driver desconhecido %s na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tipo de dúplex desconhecido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: tamanho de mídia desconhecido \"%s\" na linha %d de %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: token desconhecido \"%s\" visto na linha %d de %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: caracteres delimitadores desconhecidos em número real \"%s\" na " +#~ "linha %d de %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: seqüência de caracteres não finalizados começando com %c na linha %" +#~ "d de %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: gravando %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: gravando arquivos PPD no diretório \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: LanguageVersion inválido \"%s\" em %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: ignorando arquivo PPD %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: não é possível fazer o backup de %s em %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "impressora %s desativada desde %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "impressora %s está ociosa. ativada desde %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "impressora %s agora está imprimindo %s-%d. ativada desde %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "impressora %s/%s desativada desde %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "impressora %s/%s está ociosa. ativada desde %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "impressora %s/%s agora está imprimindo %s-%d. ativada desde %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "id solicitado é %s-%d (%d arquivo(s))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "o programador não está executando\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "o programador está executando\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "estado status\t\tshow de daemon e da fila\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "destino padrão de sistema: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "destino padrão de sistema: %s/%s\n" diff --git a/locale/cups_ru.po b/locale/cups_ru.po new file mode 100644 index 0000000..7cf0f8c --- /dev/null +++ b/locale/cups_ru.po @@ -0,0 +1,8709 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f мм" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f — %.0f x %.0f мм" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f дюймов" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f-%.2f x %.2f дюймов" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s не может быть изменен." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 дюйм/с" + +msgid "1.25x0.25\"" +msgstr "1,25x0,25\"" + +msgid "1.25x2.25\"" +msgstr "1,25x2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 дюйма/с" + +msgid "1.50x0.25\"" +msgstr "1,50x0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50x0,50\"" + +msgid "1.50x1.00\"" +msgstr "1,50x1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50x2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 дюймов/с" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 мм/с" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 дюймов/с" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 дюймов/с" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 мм/с" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 мм/с" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 мм/с" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 дюйма/с" + +msgid "2-Sided Printing" +msgstr "двусторонняя печать" + +msgid "2.00x0.37\"" +msgstr "2,00x0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00x0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00x1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00x1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00x2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00x3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00x4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00x5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25x0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25x1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25x4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25x5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38x5,50\"" + +msgid "2.5 inches/sec." +msgstr "2,5 дюйма/с" + +msgid "2.50x1.00\"" +msgstr "2,50x1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50x2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75x1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 мм/с" + +msgid "200 mm/sec." +msgstr "200 мм/с" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Тип 24-Pin" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 мм/с" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 дюйма/с" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00x1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00x1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00x2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00x3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00x5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25x2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25x5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25x5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25x5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25x7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "Диск 3.5\"" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "Диск 3.5\" - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50x1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 мм/с" + +msgid "300 mm/sec." +msgstr "300 мм/с" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 дюйма/с" + +msgid "4.00x1.00\"" +msgstr "4,00x1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00x13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00x2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00x2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00x3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00x4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00x5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00x6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00x6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 мм/с" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 дюймов/с" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 дюймов/с" + +msgid "6.00x1.00\"" +msgstr "6,00x1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00x2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00x3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00x4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00x5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00x6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00x6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 мм/с" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 дюймов/с" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 дюймов/с" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00x1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00x2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00x3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00x4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00x5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00x6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00x6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 мм/с" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 дюймов/с" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Тип 9-Pin" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Принять задания" + +msgid "Accepted" +msgstr "Принято" + +msgid "Add Class" +msgstr "Добавить класс" + +msgid "Add Printer" +msgstr "Добавить принтер" + +msgid "Add RSS Subscription" +msgstr "Добавить подписку на RSS" + +msgid "Address" +msgstr "Адрес" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Адрес - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Администрация" + +msgid "Always" +msgstr "Всегда" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Исполнительное устройство" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Неверный указатель NULL dests" + +msgid "Bad OpenGroup" +msgstr "Неверное значение OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Неверное значение OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Неверное значение OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Неверный запрос" + +msgid "Bad SNMP version number" +msgstr "Неверный номер версии SNMP" + +msgid "Bad UIConstraints" +msgstr "Неверное значение UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Неверное значение количества копий %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Неверный индивидуальный параметр" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Неверное значение number-up %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Неверные значения page-ranges %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Баннеры" + +msgid "Billing Information: " +msgstr "Реквизиты для выставления счета: " + +msgid "Bond Paper" +msgstr "Документная бумага" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Принтер для печати этикеток CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Отменить подписку на RSS" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Изменить настройки" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Классы" + +msgid "Clean Print Heads" +msgstr "Очистить головки принтера" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Цвет" + +msgid "Color Mode" +msgstr "Цветной режим" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Для имени сообщества длина не установлена" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Продолжить" + +msgid "Continuous" +msgstr "Непрерывно" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Создано" + +msgid "Created On: " +msgstr "Дата создания: " + +msgid "Custom" +msgstr "Индивидуальный" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Обрезать" + +msgid "Cutter" +msgstr "Резак" + +msgid "Dark" +msgstr "Темный" + +msgid "Darkness" +msgstr "Затемненность" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Удалить класс" + +msgid "Delete Printer" +msgstr "Удалить принтер" + +msgid "Description: " +msgstr "Описание: " + +msgid "DeskJet Series" +msgstr "Серия DeskJet" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Назначение «%s» не принимает задания." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Носитель для прямой термопечати" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Отключено" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Имя драйвера: " + +msgid "Driver Version: " +msgstr "Версия драйвера: " + +msgid "Duplexer" +msgstr "Дуплексер" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Принтер для печати этикеток EPL1" + +msgid "EPL2 Label Printer" +msgstr "Принтер для печати этикеток EPL2" + +msgid "Edit Configuration File" +msgstr "Редактировать файл конфигурации" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Конечный баннер" + +msgid "English" +msgstr "Russian" + +msgid "Enter old password:" +msgstr "Введите старый пароль:" + +msgid "Enter password again:" +msgstr "Введите пароль снова:" + +msgid "Enter password:" +msgstr "Введите пароль:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Введите свое имя пользователя и пароль или данные учетной записи root, чтобы " +"получить доступ к этой странице. Если используется проверка подлинности " +"Kerberos, необходимо также иметь действительный билет Kerberos." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Подача конвертов" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Политика ошибок" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Каждые 10 этикеток" + +msgid "Every 2 Labels" +msgstr "Каждые 2 этикетки" + +msgid "Every 3 Labels" +msgstr "Каждые 3 этикетки" + +msgid "Every 4 Labels" +msgstr "Каждые 4 этикетки" + +msgid "Every 5 Labels" +msgstr "Каждые 5 этикеток" + +msgid "Every 6 Labels" +msgstr "Каждые 6 этикеток" + +msgid "Every 7 Labels" +msgstr "Каждые 7 этикеток" + +msgid "Every 8 Labels" +msgstr "Каждые 8 этикеток" + +msgid "Every 9 Labels" +msgstr "Каждые 9 этикеток" + +msgid "Every Label" +msgstr "Каждая этикетка" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Сбой ожидания" + +msgid "Export Printers to Samba" +msgstr "Экспортировать принтеры в Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Каталог файла" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Каталог файла - 9 16/8 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Фолио" + +msgid "Forbidden" +msgstr "Запрещено" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Основные" + +msgid "Generic" +msgstr "Общее" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Для Get-Response-PDU длина не установлена" + +msgid "Glossy Paper" +msgstr "Глянцевая бумага" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Оттенки серого" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Папка подвесного хранения" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Папка подвесного хранения - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Недействительный контрольный символ" + +msgid "Illegal main keyword string" +msgstr "Недействительная основная строка ключевых слов" + +msgid "Illegal option keyword string" +msgstr "Недействительная строка ключевых слов параметра" + +msgid "Illegal translation string" +msgstr "Недействительный перевод" + +msgid "Illegal whitespace character" +msgstr "Недействительный символ пробела" + +msgid "Installable Options" +msgstr "Параметры, разрешенные к установке" + +msgid "Installed" +msgstr "Установлено" + +msgid "IntelliBar Label Printer" +msgstr "Принтер для печати этикеток IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Внутренняя ошибка" + +msgid "Internet Postage 2-Part" +msgstr "Наклейки Internet Postage 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Наклейки Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Наклейки Internet Postage 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Наклейки Internet Postage 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Протокол интернет-печати" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Задание #%d уже прервано – не удается отменить." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Задание #%d уже отменено – не удается отменить." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Задание #%d уже завершено – не удается отменить." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Задание завершено" + +msgid "Job Created" +msgstr "Задание создано" + +msgid "Job ID: " +msgstr "ID задания: " + +msgid "Job Options Changed" +msgstr "Параметры задания изменены" + +msgid "Job Stopped" +msgstr "Задание остановлено" + +msgid "Job UUID: " +msgstr "UUID задания: " + +msgid "Job is completed and cannot be changed." +msgstr "Задание завершено и не может быть изменено." + +msgid "Job operation failed:" +msgstr "Сбой операции задания:" + +msgid "Job state cannot be changed." +msgstr "Состояние задания не может быть изменено." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Задания" + +msgid "LPD/LPR Host or Printer" +msgstr "Хост или принтер LPD/LPR" + +msgid "Label Printer" +msgstr "Принтер для печати этикеток" + +msgid "Label Top" +msgstr "Верхний край этикетки" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Полный адрес" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Полный адрес - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "Серия LaserJet, PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Светлый" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Строка длиннее разрешенного предела (255 символов)" + +msgid "List Available Printers" +msgstr "Список доступных принтеров" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Местоположение: " + +msgid "Long-Edge (Portrait)" +msgstr "По длинной стороне (книжная)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Марка и модель: " + +msgid "Manual Feed" +msgstr "Ручная подача" + +msgid "Media Dimensions: " +msgstr "Размеры бумаги: " + +msgid "Media Limits: " +msgstr "Ограничения бумаги: " + +msgid "Media Name: " +msgstr "Название бумаги: " + +msgid "Media Size" +msgstr "Размер бумаги" + +msgid "Media Source" +msgstr "Источник бумаги" + +msgid "Media Tracking" +msgstr "Контроль подачи бумаги" + +msgid "Media Type" +msgstr "Тип бумаги" + +msgid "Medium" +msgstr "Средний" + +msgid "Memory allocation error" +msgstr "Ошибка распределения памяти" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Отсутствует заголовок PPD-Adobe-4.x" + +msgid "Missing asterisk in column 1" +msgstr "Отсутствует звездочка в колонке 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Отсутствует строка значения" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Изменить класс" + +msgid "Modify Printer" +msgstr "Изменить принтер" + +msgid "Move All Jobs" +msgstr "Переместить все задания" + +msgid "Move Job" +msgstr "Переместить задание" + +msgid "Moved Permanently" +msgstr "Перемещено окончательно" + +msgid "NULL PPD file pointer" +msgstr "Указатель PPD-файла установлен на NULL" + +msgid "Name OID uses indefinite length" +msgstr "Для имени OID длина не установлена" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Никогда" + +msgid "New Stylus Color Series" +msgstr "Серия Stylus Color нового поколения" + +msgid "New Stylus Photo Series" +msgstr "Серия Stylus Photo нового поколения" + +msgid "No" +msgstr "Нет" + +msgid "No Content" +msgstr "Нет контента" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Нет последовательности VarBind" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Нет рабочего подключения" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Нет имени сообщества" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Нет добавленных назначений." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Нет значения error-index" + +msgid "No error-status" +msgstr "Нет значения error-status" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Нет имени OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Нет идентификатора request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Подписки не найдены." + +msgid "No variable-bindings SEQUENCE" +msgstr "Нет последовательности variable-bindings" + +msgid "No version number" +msgstr "Нет номера версии" + +msgid "Non-continuous (Mark sensing)" +msgstr "С прерыванием (опознавание маркеров)" + +msgid "Non-continuous (Web sensing)" +msgstr "С прерыванием (опознавание сети)" + +msgid "Normal" +msgstr "Нормальный" + +msgid "Not Found" +msgstr "Не найдено" + +msgid "Not Implemented" +msgstr "Не реализовано" + +msgid "Not Installed" +msgstr "Не установлено" + +msgid "Not Modified" +msgstr "Не изменено" + +msgid "Not Supported" +msgstr "Не поддерживается" + +msgid "Not allowed to print." +msgstr "Не разрешено печатать." + +msgid "Note" +msgstr "Примечание" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "ОК" + +msgid "Off (1-Sided)" +msgstr "Выкл. (односторонняя печать)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Интерактивная справка" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Не удалось открыть %s: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup без предыдущего CloseGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI без предыдущего CloseUI/JCLCloseUI" + +msgid "Operation Policy" +msgstr "Политика операций" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Параметры установлены" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Параметры: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Режим вывода" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Лазерный принтер PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "В пакете нет Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Нет индикатора SEQUENCE в начале пакета" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Пароль для %s на %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Для доступа к %s через SAMBA требуется пароль для %s: " + +msgid "Pause Class" +msgstr "Приостановить класс" + +msgid "Pause Printer" +msgstr "Приостановить принтер" + +msgid "Peel-Off" +msgstr "Съемный слой" + +msgid "Photo" +msgstr "Фото" + +msgid "Photo Labels" +msgstr "Фотоэтикетки" + +msgid "Plain Paper" +msgstr "Обычная бумага" + +msgid "Policies" +msgstr "Политики" + +msgid "Port Monitor" +msgstr "Мониторинг порта" + +msgid "PostScript Printer" +msgstr "Принтер PostScript" + +msgid "Postcard" +msgstr "Открытка" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Плотность печати" + +msgid "Print Job:" +msgstr "Задание печати:" + +msgid "Print Mode" +msgstr "Режим печати" + +msgid "Print Rate" +msgstr "Скорость печати" + +msgid "Print Self-Test Page" +msgstr "Напечатать пробную страницу" + +msgid "Print Speed" +msgstr "Скорость печати" + +msgid "Print Test Page" +msgstr "Напечатать пробную страницу" + +msgid "Print and Cut" +msgstr "Напечатать и обрезать" + +msgid "Print and Tear" +msgstr "Напечатать и оборвать" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Напечатано для: " + +msgid "Printed From: " +msgstr "Напечатано из: " + +msgid "Printed On: " +msgstr "Дата печати: " + +msgid "Printer Added" +msgstr "Принтер добавлен" + +msgid "Printer Default" +msgstr "Принтер выбран по умолчанию" + +msgid "Printer Deleted" +msgstr "Принтер удален" + +msgid "Printer Modified" +msgstr "Принтер изменен" + +msgid "Printer Name: " +msgstr "Имя принтера: " + +msgid "Printer Paused" +msgstr "Принтер приостановлен" + +msgid "Printer Settings" +msgstr "Параметры принтера" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Принтер:" + +msgid "Printers" +msgstr "Принтеры" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Удалить задания" + +msgid "Quarto" +msgstr "Кватро" + +msgid "Quota limit reached." +msgstr "Предел квоты достигнут." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Отклонить задания" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Повторить печать после ошибки" + +msgid "Request Entity Too Large" +msgstr "Слишком большое содержимое запроса" + +msgid "Resolution" +msgstr "Разрешение" + +msgid "Resume Class" +msgstr "Возобновить работу класса" + +msgid "Resume Printer" +msgstr "Возобновить работу принтера" + +msgid "Return Address" +msgstr "Обратный адрес" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Обратный адрес - 3/4 x 2\"" + +msgid "Rewind" +msgstr "Вернуться в начало" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "Для SEQUENCE длина не установлена" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Посмотреть другие" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Последовательный порт #%d" + +msgid "Server Restarted" +msgstr "Сервер перезагружен" + +msgid "Server Security Auditing" +msgstr "Проверка безопасности сервера" + +msgid "Server Started" +msgstr "Сервер загружен" + +msgid "Server Stopped" +msgstr "Сервер остановлен" + +msgid "Service Unavailable" +msgstr "Служба недоступна" + +msgid "Set Allowed Users" +msgstr "Указать допущенных пользователей" + +msgid "Set As Server Default" +msgstr "Использовать данный сервер по умолчанию" + +msgid "Set Class Options" +msgstr "Настроить параметры класса" + +msgid "Set Printer Options" +msgstr "Настроить параметры принтера" + +msgid "Set Publishing" +msgstr "Настроить публикацию" + +msgid "Shipping Address" +msgstr "Адрес доставки" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Адрес доставки - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "По короткой стороне (альбомная)" + +msgid "Special Paper" +msgstr "Особая бумага" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Стандартный" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Запуск баннера" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Оператор" + +msgid "Stylus Color Series" +msgstr "Серия Stylus Color" + +msgid "Stylus Photo Series" +msgstr "Серия Stylus Photo" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Протоколы переключения" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Оборвать" + +msgid "Tear-Off" +msgstr "Место отрыва" + +msgid "Tear-Off Adjust Position" +msgstr "Откорректировать положение места отрыва" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "Не удается найти PPD-файл «%s»." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "Не удалось открыть PPD-файл «%s»: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Имя класса может содержать максимально 127 печатных символов и не может " +"содержать пробелы, дроби (/) или знак «решетки» (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Атрибут notify-lease-duration не может использоваться с подписками на " +"задание." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Имя принтера может содержать максимально 127 печатных символов и не может " +"содержать пробелы, дроби (/) или знак «решетки» (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri «%s» содержит недопустимые символы." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "printer-uri должен иметь форму «ipp://HOSTNAME/classes/CLASSNAME»." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "printer-uri должен иметь форму «ipp://HOSTNAME/printers/PRINTERNAME»." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +"Имя подписки не может содержать пробелы, дроби (/), вопросительные знаки (?) " +"или знак «решетки» (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Слишком много подписок." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Носитель для печати методом термопереноса" + +msgid "Title: " +msgstr "Заголовок: " + +msgid "Too many active jobs." +msgstr "Слишком много активных заданий." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Прозрачность" + +msgid "Tray" +msgstr "Лоток" + +msgid "Tray 1" +msgstr "Лоток 1" + +msgid "Tray 2" +msgstr "Лоток 2" + +msgid "Tray 3" +msgstr "Лоток 3" + +msgid "Tray 4" +msgstr "Лоток 4" + +msgid "URI Too Long" +msgstr "Слишком длинный адрес URI" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "Последовательный порт USB #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Не удается получить доступ к файлу «cupsd.conf»:" + +msgid "Unable to add RSS subscription:" +msgstr "Не удается добавить подписку RSS:" + +msgid "Unable to add class:" +msgstr "Не удается добавить класс:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Не удается добавить принтер:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Не удается отменить подписку RSS:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Не удается изменить атрибут printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Не удается изменить принтер:" + +msgid "Unable to change server settings:" +msgstr "Не удается изменить настройки сервера:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Не удается подключиться к хосту." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Не удается создать временный файл:" + +msgid "Unable to delete class:" +msgstr "Не удается удалить класс:" + +msgid "Unable to delete printer:" +msgstr "Не удается удалить принтер:" + +msgid "Unable to do maintenance command:" +msgstr "Не удается выполнить команду обслуживания:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Не удается получить список класса:" + +msgid "Unable to get class status:" +msgstr "Не удается получить статус класса:" + +msgid "Unable to get list of printer drivers:" +msgstr "Не удается получить список драйверов принтера:" + +msgid "Unable to get printer attributes:" +msgstr "Не удается получить атрибуты принтера:" + +msgid "Unable to get printer list:" +msgstr "Не удается получить список принтеров:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Не удается получить статус принтера:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Не удается изменить класс:" + +msgid "Unable to modify printer:" +msgstr "Не удается изменить принтер:" + +msgid "Unable to move job" +msgstr "Не удается переместить задание" + +msgid "Unable to move jobs" +msgstr "Не удается переместить задания" + +msgid "Unable to open PPD file" +msgstr "Не удается открыть PPD-файл" + +msgid "Unable to open PPD file:" +msgstr "Не удается открыть PPD-файл:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Не удается открыть файл «cupsd.conf»:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Не удается напечатать пробную страницу:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Не удается настроить параметры:" + +msgid "Unable to set server default:" +msgstr "Не удается назначить сервер используемым по умолчанию:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Не удается загрузить файл «cupsd.conf»:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Не санкционировано" + +msgid "Units" +msgstr "Единицы" + +msgid "Unknown" +msgstr "Неизвестный" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Неизвестная политика printer-error-policy «%s»." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Неизвестная политика printer-op-policy «%s»." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Неподдерживаемый тип значения" + +msgid "Upgrade Required" +msgstr "Требуется обновление" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Для значения длина не установлена" + +msgid "VarBind uses indefinite length" +msgstr "Для VarBind длина не установлена" + +msgid "Version uses indefinite length" +msgstr "Для Version длина не установлена" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Да" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Вы должны получить доступ к этой странице с помощью URL https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Принтер для печати этикеток ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "отменено" + +msgid "canceled" +msgstr "отменено" + +msgid "completed" +msgstr "завершено" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "Не удалось выполнить cups-deviced." + +msgid "cups-driverd failed to execute." +msgstr "Не удалось выполнить cups-driverd." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "Для error-index длина не установлена" + +msgid "error-status uses indefinite length" +msgstr "Для error-status длина не установлена" + +msgid "held" +msgstr "задержано" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "свободен" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "задержка" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "обработка" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "Для request-id длина не определена" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "не удалось установить %s: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "остановлен" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "неизвестный" + +msgid "untitled" +msgstr "новый" + +msgid "variable-bindings uses indefinite length" +msgstr "Для variable-bindings длина не установлена" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(все)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(нет)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\tзаписей: %d\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tПосле ошибки: продолжить\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tПредупреждения:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tТребуется баннер\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tНабор символов устанавливает:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tПодключение: прямое\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tПодключение: удаленное\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tРазмер страницы по умолчанию:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tВысота по умолчанию:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tНастройки порта по умолчанию:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tОписание: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tФорма подключения:\n" +#~ "\tТипы контента: любые\n" +#~ "\tТипы принтеров: неизвестно\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tРазрешенные формы:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tИнтерфейс: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tИнтерфейс: %s/интерфейсы/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tИнтерфейс: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tРасположение: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tПри ошибке: не выводить предупреждение\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tРазрешенные пользователи:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tЗапрещенные пользователи:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tдемон присутствует\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tнет записей\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tпринтер на скорости -1 устройства «%s»\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tпечать отключена\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tпечать включена\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tочередь для %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tочередь отключена\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tочередь включена\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tпричина неизвестна\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " ПОДРОБНЫЕ РЕЗУЛЬТАТЫ ТЕСТА СООТВЕТСТВИЯ\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Стр. 15, раздел 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Стр. 15, раздел 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Стр. 19, раздел 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Стр. 20, раздел 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Стр. 27, раздел 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Стр. 42, раздел 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Стр. 16-17, раздел 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Стр. 42-45, раздел 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Стр. 45-46, раздел 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Стр. 48-49, раздел 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Стр. 52-54, раздел 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f байт\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " PASS Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " PASS DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " PASS DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " PASS FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " PASS FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " PASS LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " PASS LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " PASS Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " PASS ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " PASS NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " PASS PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " PASS PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " PASS PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " PASS PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " PASS Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " PASS ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN «%s %s» конфликтует с «%s %s»\n" +#~ " (constraint=«%s %s %s %s»)\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s не содержит соответствующих параметров!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s использует общий префикс совместно с %s\n" +#~ " REF: Стр. 15, раздел 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN Значения, используемые по умолчанию, конфликтуют!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Ключевое слово параметра дуплекса %s может привести к " +#~ "некорректным результатам. Используйте имя «Duplex»!\n" +#~ " REF: Стр. 122, раздел 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " WARN Файл содержит комбинацию окончаний строки CR, LF и CR " +#~ "LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding требуется спецификацией PPD 4.3.\n" +#~ " REF: Стр. 56-57, раздел 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN Строка %d содержит только пробелы!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN LanguageEncoding требуется спецификацией PPD 4.3.\n" +#~ " REF: Стр. 58-59, раздел 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN Файл APDialogExtension отсутствует «%s»\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN Файл APPrinterIconPath отсутствует «%s»\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN PPD-файлы не из Windows должны использовать строки только " +#~ "с окончанием LF, а не с CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN Устаревшая версия PPD %.1f!\n" +#~ " REF: Стр. 42, раздел 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName длиннее чем 8.3 нарушает спецификацию PPD.\n" +#~ " REF: Стр. 61-62, раздел 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN Protocols содержит PJL, но атрибуты JCL не настроены.\n" +#~ " REF: Стр. 78-79, раздел 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN ShortNickName требуется спецификацией PPD 4.3.\n" +#~ " REF: Стр. 64-65, раздел 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s не существует!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Неверный %s выбор %s!\n" +#~ " REF: Стр. 122, раздел 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s Неверный перевод UTF-8 «%s» для параметра %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s Неверный перевод UTF-8 «%s» для параметра %s, выбора %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Неверное значение cupsFilter «%s»!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Неверный cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Неверное значение cupsPreFilter «%s»!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Неверный cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Неверный язык «%s»!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Пустой cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Перевод «%s» отсутствует для параметра %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s Перевод «%s» отсутствует для параметра %s, выбора %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Выбор *%s %s отсутствует в UIConstraints «*%s %s *%s %s»!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr "" +#~ " %s Выбор *%s %s отсутствует в cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Файл cupsFilter отсутствует «%s»\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Файл cupsICCProfile отсутствует «%s»!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Файл cupsFilter «%s» отсутствует\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Отсутствует cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Параметр %s отсутствует в UIConstraints «*%s %s *%s %s»!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Параметр %s отсутствует в cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Основной перевод «%s» не включен в файл!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " ТРЕБУЕТСЯ %s: %s не определяет выбор «Нет»!\n" +#~ " REF: Стр. 122, раздел 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " Хеш-значение %s cupsICCProfile %s конфликтует с %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s создает цикл!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Для выбора %s имена %s и %s различаются только регистром " +#~ "символов!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FAIL** %s должно соответствовать 1284DeviceID!\n" +#~ " REF: Стр. 72, раздел 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ Default%s %s\n" +#~ " REF: Стр. 40, раздел 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ DefaultImageableArea %s!\n" +#~ " REF: Стр. 102, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ DefaultPaperDimension %s!\n" +#~ " REF: Стр. 103, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ JobPatchFile атрибут в файле\n" +#~ " REF: Стр. 24, раздел 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ Manufacturer (должен быть «HP»)\n" +#~ " REF: Стр. 211, таблица D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ Manufacturer (должен быть «Oki»)\n" +#~ " REF: Стр. 211, таблица D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНОЕ ModelName – «%c» не разрешено в строке.\n" +#~ " REF: Стр. 59-60, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНАЯ PSVersion – не «(string) int».\n" +#~ " REF: Стр. 62-64, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ Product – не «(string)».\n" +#~ " REF: Стр. 62, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** НЕВЕРНЫЙ ShortNickName – длиннее чем 31 симв.\n" +#~ " REF: Стр. 64-65, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FAIL** Неверный %s выбор %s!\n" +#~ " REF: Стр. 84, раздел 5,9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Неверная FileVersion \"%s\"\n" +#~ " REF: Стр. 56, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** Неверная FormatVersion \"%s\"\n" +#~ " REF: Стр. 56, раздел 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr "" +#~ " **FAIL** Неверный LanguageEncoding %s – должно быть ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr "" +#~ " **FAIL** Неверный LanguageVersion %s – должен быть английский!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr "" +#~ " **FAIL** Не удается интерпретировать код параметра по умолчанию: %" +#~ "s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FAIL** Стандартный перевод для параметра %s выбора %s содержит 8-" +#~ "битовые символы!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FAIL** Стандартный перевод для параметра %s содержит 8-битовые " +#~ "символы!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Имена групп %s и %s различаются только регистром " +#~ "символов!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FAIL** Для выбора %s имя %s встречается несколько раз!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FAIL** Имена параметров %s и %s различаются только регистром " +#~ "символов!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ Default%s\n" +#~ " REF: Стр. 40, раздел 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ DefaultImageableArea\n" +#~ " REF: Стр. 102, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ DefaultPaperDimension\n" +#~ " REF: Стр. 103, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ FileVersion\n" +#~ " REF: Стр. 56, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ FormatVersion\n" +#~ " REF: Стр. 56, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ ImageableArea для PageSize %s\n" +#~ " REF: Стр. 41, раздел 5.\n" +#~ " REF: Стр. 102, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ LanguageEncoding\n" +#~ " REF: Стр. 56-57, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ LanguageVersion\n" +#~ " REF: Стр. 57-58, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ Manufacturer\n" +#~ " REF: Стр. 58-59, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ ModelName\n" +#~ " REF: Стр. 59-60, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ NickName\n" +#~ " REF: Стр. 60, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PCFileName\n" +#~ " REF: Стр. 61-62, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PSVersion\n" +#~ " REF: Стр. 62-64, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PageRegion\n" +#~ " REF: Стр. 100, раздел 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PageSize\n" +#~ " REF: Стр. 41, раздел 5.\n" +#~ " REF: Стр. 99, раздел 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PageSize\n" +#~ " REF: Стр. 99-100, раздел 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ PaperDimension для PageSize %s\n" +#~ " REF: Стр. 41, раздел 5.\n" +#~ " REF: Стр. 103, раздел 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ Product\n" +#~ " REF: Стр. 62, раздел 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FAIL** ТРЕБУЕТСЯ ShortNickName\n" +#~ " REF: Стр. 64-65, раздел 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " ОБНАРУЖЕНО ОШИБОК: %d\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Неверный %%%%BoundingBox: в строке %d!\n" +#~ " REF: Стр. 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Неверная %%%%Page: в строке %d!\n" +#~ " REF: Стр. 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Неверные %%%%Pages: в строке %d!\n" +#~ " REF: Стр. 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Строка %d длиннее 255 символов (%d)!\n" +#~ " REF: Стр. 25, Длина строки\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " %!PS-Adobe-3.0 отсутствует в первой строке!\n" +#~ " REF: Стр. 17, 3.1 Соответствующие документы\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Комментарий %%EndComments отсутствует!\n" +#~ " REF: Стр. 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Отсутствующий или неверный %%BoundingBox: комментарий!\n" +#~ " REF: Стр. 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Отсутствующая или неверная %%Page: комментарий!\n" +#~ " REF: Стр. 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Отсутствующие или неверные %%Pages: комментарий!\n" +#~ " REF: Стр. 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " ОШИБОК НЕ ОБНАРУЖЕНО\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Обнаружено строк длиннее 255 символов: %d!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " Слишком много комментариев %%BeginDocument!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " Слишком много комментариев %%EndDocument!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " WARNING: файл содержит бинарные данные!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " WARNING: нет комментария %%EndComments в файле!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " WARNING: устаревшая версия DSC %.1f в файле!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FAIL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Не удается открыть PPD-файл – %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FAIL\n" +#~ " **FAIL** Не удается открыть PPD-файл – %s в строке %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " PASS\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Envelope" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Envelope" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Envelope" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Envelope" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Envelope" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f байт\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f байт\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s принимает запросы с момента %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s не выполнено версией CUPS для lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s не готов\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s готов\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s готов и печатает\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s не принимает запросы с момента %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s не поддерживается!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s принимает запросы с момента %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s не принимает запросы с момента %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [задание %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: ошибка %s: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Дальнейшие действия неизвестны!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: Ошибка – %s переменная окружения указывает несуществующее назначение «%" +#~ "s»!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Ошибка – неверный ID задания!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Ошибка – невозможно одновременно печатать файлы и изменять задания!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Ошибка – не удается печатать из stdin, если предоставлены файлы или " +#~ "ID задания!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-S» должен идти набор символов!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-T» должен быть указан тип контента!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "" +#~ "%s: Ошибка – после параметра «-n» должно быть указано количество копий!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-#» должен быть указан номер копии!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-P» должно быть указано назначение!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-b» должно быть указано назначение!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-d» должно быть указано назначение!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-f» должна быть указана форма!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-H» должно быть указано имя хоста!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-H» должно быть указано имя хоста!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-h» должно быть указано имя хоста!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "" +#~ "%s: Ошибка – после параметра «-y» должен быть указан список режимов!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-%c» должно быть указано имя!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "" +#~ "%s: Ошибка – после параметра «-o» должна быть указана строка параметра!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-P» должен идти список страниц!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-%c» должен быть указан приоритет!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-r» должен идти текст причины!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-t» должен быть указан заголовок!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "" +#~ "%s: Ошибка – после параметра «-U» должно быть указано имя пользователя!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "" +#~ "%s: Ошибка – после параметра «-u» должно быть указано имя пользователя!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Ошибка – после параметра «-%c» должно быть указано значение!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Ошибка – требуется «завершено», «не завершено» или «все» после параметра " +#~ "«-W»!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Ошибка – нет доступного назначения по умолчанию.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Ошибка – приоритет должен быть от 1 до 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Ошибка – планировщик не отвечает!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Ошибка – слишком много файлов – «%s»\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Ошибка – не удается получить доступ к «%s» – %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Ошибка – не удается поставить в очередь из stdin - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Ошибка – неизвестное назначение «%s»!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Ошибка – неизвестное назначение «%s/%s»!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Ошибка – неизвестный параметр «%c»!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Ошибка – неизвестный параметр «%s»!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: После параметра «-i» должен быть указан ID задания!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Фильтр «%s» недоступен: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Неверное имя назначения в списке «%s»!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Неверная строка фильтра «%s»\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Требуется ID задания («-i jobid») перед «-H restart»!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Нет фильтра для преобразования из %s/%s в %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Операция не удалась: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Нет скомпилированной поддержки шифрования!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Не удается подключиться к серверу\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Не удается установить связь с сервером!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Не удается определить тип MIME «%s»!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Не удается открыть %s – %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Не удается открыть %s – %s в строке %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Не удается открыть %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Не удается открыть PPD-файл: %s в строке %d.\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Не удается прочитать базу данных MIME в «%s» или «%s»!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Неизвестное назначение «%s»!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Неизвестный MIME-тип назначения %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Неизвестный параметр «%c»!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Неизвестный MIME-тип источника %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Внимание – модификатор формата «%c» не поддерживается – вывод может " +#~ "быть неправильным!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Внимание – параметр набора символов пропущен!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Внимание – параметр типа контента пропущен!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Внимание – параметр формы пропущен!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Внимание – параметр режима пропущен!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "" +#~ "%s: ошибка – переменная окружения %s указывает несуществующее назначение «%" +#~ "s»!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "" +#~ "%s: ошибка – после параметра «-o» должна идти запись вида option=value!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: ошибка – нет доступного назначения по умолчанию.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600dpi, оттенки серого" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Неверная команда справки неизвестна\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Для экспорта драйверов принтера требуется пароль Samba!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Для экспорта драйверов принтера требуется имя пользователя Samba!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "Класс с именем «%s» уже существует!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "Принтер с именем «%s» уже существует!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (расширенный)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (расширенный)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (уменьшенный)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (расширенный)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Попытка установить %s printer-state на неверное значение %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Группы атрибутов не действуют (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Неверный URI устройства «%s»!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Неверное значение device-uri «%s»!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Неверная схема device-uri «%s»!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Неверное значение document-format «%s»!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Ошибка в буфере filename!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Неверный атрибут шрифта: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Неверное значение job-priority!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Неверное значение job-sheets «%s»!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Неверный тип значения job-sheets!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Неверное значение job-state!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Неверный атрибут job-uri «%s»!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Неверное значение notify-pull-method «%s»!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Неверный URI notify-recipient-uri «%s»!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Неверный параметр + выбор в строке %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Неверное значение port-monitor «%s»!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Неверное значение printer-state %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Неверный номер версии запроса %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Неверный ID подписки!" + +#~ msgid "C0 Envelope" +#~ msgstr "Конверт C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Конверт C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Конверт C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Конверт C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Конверт C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Конверт C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Конверт C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Конверт C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Конверт C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Набор символов «%s» не поддерживается!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Конверт Chou3" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Конверт Chou4" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Команды могут быть сокращены. Команды:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Не удалось сканировать тип «%s»!" + +#~ msgid "Cover open." +#~ msgstr "Крышка открыта." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "Конверт DL" + +#~ msgid "Developer almost empty." +#~ msgstr "Проявитель почти закончился." + +#~ msgid "Developer empty!" +#~ msgstr "Проявитель закончился!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Устройство: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Документ %d в задании %d не найден." + +#~ msgid "Door open." +#~ msgstr "Дверца открыта." + +#~ msgid "Double Postcard" +#~ msgstr "Двойная открытка" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Не удается выделить память для информации страницы: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Не удается выделить память для массива страниц: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Неверный %%BoundingBox: комментарий просмотрен!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Неверный %%IncludeFeature: комментарий!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Неверная %%Page: комментарий в файле!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Неверный %%PageBoundingBox: комментарий в файле!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Неверный файл устройства SCSI «%s»!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Неверный файл набора символов %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Неверный тип набора символов %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Неверное значение количества столбцов %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Неверное значение cpi %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Неверная строка описания шрифта: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Неверное значение lpi %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Неверные параметры страницы!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Неверное направление текста %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Неверная ширина текста %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Целевой принтер не существует!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Дубликат %%BoundingBox: комментарий просмотрен!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Дубликат %%Pages: комментарий просмотрен!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Пустой файл печати!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Ошибка %d при отправке запроса PAPSendData: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: В строке %d из %s должна быть строка в кавычках!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Критический сбой USB!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "" +#~ "ERROR: Обнаружена неверная команда HP-GL/2, не удается напечатать файл!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: Отсутствует %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: Отсутствует %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Отсутствует идентификатор URI устройства в командной строке и " +#~ "переменная окружения DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Отсутствует значение в строке %d в файле баннера!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Требуется строка msgid перед строкой перевода в строке %d из %s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Нет %%BoundingBox: комментарий в заголовке!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Нет %%Pages: комментарий в заголовке!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Не обнаружено URI устройства в argv[0] или переменной окружения " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Отсутствуют шрифты в файле набора символов %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Страницы не найдены!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Нет бумаги!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: Переменная окружения PRINTER не указана!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Файл печати не принят (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Принтер не отвечает\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Принтер не отвечает!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Принтер преждевременно передал индикатор EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Удаленный хост не принял контрольный файл (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Удаленный хост не принял файл данных (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Сбой, связанный со временем ожидания при отправке данных на " +#~ "принтер\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Не удается добавить файл %d к заданию: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Не удается отменить задание %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Не удается копировать файл PDF" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Не удается создать сокет" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: Не удается создать временный сжатый файл печати: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Не удается создать временный файл" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Не удается создать временный файл – %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Не удается создать временный файл: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Не удается выполнить pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Не удается запустить программу gs" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Не удается запустить программу pdftops" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Не удается разветвить pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Не удается получить запрос PAP" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Не удается получить ответ PAP" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: Не удается получить PPD-файл для принтера «%s» – %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Не удается определить стандартную зону AppleTalk" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Не удается получить атрибуты задания %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Не удается получить статус принтера (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Не удается обнаружить принтер «%s»!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Не удается провести поиск ответа PAP" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Не удается провести поиск принтеров AppleTalk" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Не удается ставить адрес AppleTalk" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Не удается открыть «%s» – %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Не удается открыть %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Не удается открыть файл баннера «%s» – %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Не удается открыть файл устройства «%s»: %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Не удается открыть файл «%s» – %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Не удается открыть файл «%s»: %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Не удается открыть файл изображения для печати!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Не удается открыть файл печати «%s»: %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Не удается открыть файл печати %s – %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Не удается открыть файл печати %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Не удается открыть временный сжатый файл печати: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Не удается открыть временный файл" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Не удается напечатать столбцы с текстом (%d)!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Не удается напечатать страницу с текстом %dx%d!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Не удается считать данные печати" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Не удается считать данные печати!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Не удается зарезервировать порт" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Не удается перейти к смещению %ld в файле – %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Не удается перейти к смещению %lld в файле – %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Не удается отправить команду LPD" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Не удается отправить контрольный запрос PAP" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Не удается отправить исходный запрос PAP на отправку данных" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Не удается отправить данные печати (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Не удается отправить данные печати!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Не удается отправить файл печати на принтер" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Не удается отправить конечное нулевое значение на принтер" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Не удается подождать pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Не удается записать %d байт на «%s»: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Не удается записать %d байт на принтер!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Не удается записать контрольный файл" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Не удается записать данные печати" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Не удается записать данные печати: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Не удается записать растровые данные на драйвер!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Не удается записать данные во временный файл" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: Не удается записать несжатые данные документа: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Непредвиденный текст в строке %d из %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Неизвестное значение параметра шифрования «%s»!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Неизвестный порядок файлов «%s»\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Символ неизвестного формата «%c»\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Неизвестный формат каталога сообщений для «%s»!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Неизвестный параметр «%s» со значением «%s»!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Неизвестный режим печати «%s»\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Неизвестное значение параметра версии «%s»!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Неподдерживаемое значение яркости %s, используется " +#~ "brightness=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "" +#~ "ERROR: Неподдерживаемое значение гаммы %s, используется gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "" +#~ "ERROR: Неподдерживаемое значение number-up %d, используется number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Неподдерживаемое значение number-up-layout %s, используется number-" +#~ "up-layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Неподдерживаемое значение page-border %s, используется page-" +#~ "border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: Обнаружено переполнение doc_printf (%d байт), отменяю!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: Сбой фильтра pdftops при сигнале %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: Фильтр pictwpstops закрыт со статусом %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: Фильтр pictwpstops закрыт по сигналу %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: Фильтр pictwpstops закрыт со статусом %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: Восстанавливаемо: не удается подключиться к принтеру; попытка " +#~ "будет повторена через 30 секунд…\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: Сбой оператора select()" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: Не удается установить файл печати" + +#~ msgid "Empty PPD file!" +#~ msgstr "Пустой PPD-файл!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "ERROR: Требуется имя хоста после параметра «-h»!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FAIL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "URI-адреса файлового устройства отключены! Чтобы включить их, используйте " +#~ "директиву FileDevice в «%s/cupsd.conf»." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Высокая температура термофиксатора!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Низкая температура термофиксатора!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Получен атрибут printer-uri, но не job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk отключен в Системных настройках\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk отключен в Системных настройках.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Отмена задания печати…\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Подключен к принтеру…\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Подключение к принтеру…\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Контрольный файл успешно отправлен\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Файл данных успешно отправлен\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Форматирование страницы %d…\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Загрузка файла изображения…\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Поиск принтера...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Установка соединения\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: Файл печати отправлен, ожидание окончания работы принтера…\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Принтер занят; попытка будет повторена через 10 секунд…\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Принтер занят; попытка будет повторена через 30 секунд…\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Принтер занят; попытка будет повторена через 5 секунд…\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "" +#~ "INFO: Принтер не поддерживает IPP/%d.%d; попытка использовать IPP/1.0…\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Принтер занят; попытка будет повторена через 5 секунд…\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: В данный момент принтер не подключен к сети.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: В данный момент принтер не подключен к сети.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Принтер подключен к сети.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Принтер не подключен к сети.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "" +#~ "INFO: Принтер не подключен; попытка будет повторена через 30 секунд…\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Печать страницы %d, %d%% завершена…\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Печать страницы %d…\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Готов к печати.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Отправка контрольного файла (%lu байт)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Отправка контрольного файла (%u байт)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Отправка данных\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Отправка файла данных (%ld байт)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Отправка файла данных (%lld байт)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Отправка данных печати…\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Отправлен файл печати, %ld байт…\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Отправлен файл печати, %lld байт…\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Спулинг задания LPR, %.0f%% выполнено…\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Не удается установить связь с принтером, постановка в очередь на " +#~ "следующем принтере в классе…\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Используется стандартная зона AppleTalk «%s»\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Ожидание окончания выполнения задания…\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Ожидание доступа к принтеру...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "Конверт ISO B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (расширенный)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "Конверт ISO B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "Конверт ISO B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Чернила/тонер заканчиваются." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Чернила/тонер закончились!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Корзина чернил/тонера почти полный." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Корзина чернил/тонера полная!" + +#~ msgid "Interlock open." +#~ msgstr "Открыт замок." + +#~ msgid "Invite Envelope" +#~ msgstr "Конверт Invite Envelope" + +#~ msgid "Italian Envelope" +#~ msgstr "Конверт Italian Envelope" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Задание #%d не может быть перезапущено – нет файлов!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Задание #%d не существует!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Задание #%d завершено и не может быть изменено!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Задание #%d не завершено!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Задание #%d не задержано для идентификации!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Задание #%d не задержано!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Задание #%s не существует!" + +#~ msgid "Job %d not found!" +#~ msgstr "Задание #%d не найдено!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Подписки на задание не могут быть обновлены!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Конверт Kaku2" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Конверт Kaku3" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Язык «%s» не поддерживается!" + +#~ msgid "Media jam!" +#~ msgstr "Затор бумаги!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Лоток с бумагой почти пуст." + +#~ msgid "Media tray empty!" +#~ msgstr "Лоток с бумагой пуст!" + +#~ msgid "Media tray missing!" +#~ msgstr "Лоток с бумагой отсутствует!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Необходимо вставить бумагу в лоток." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Отсутствует атрибут document-number!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Отсутствуют двойные кавычки в строке %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Отсутствует переменная формы!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Отсутствует атрибут notify-subscription-ids!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Отсутствует атрибут requesting-user-name!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Отсутствуют обязательные атрибуты!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Отсутствует значение в строке %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Конверт Monarch" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Файл печати принят – ID задания %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Файл печати принят – ID задания неизвестен.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Нет имени PPD!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Нет установленных драйверов принтера Windows!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Нет активных заданий на %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Нет атрибутов в запросе!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Нет информации для проверки подлинности!" + +#~ msgid "No default printer" +#~ msgstr "Нет принтера по умолчанию" + +#~ msgid "No file!?!" +#~ msgstr "Нет файла!?!" + +#~ msgid "No modification time!" +#~ msgstr "Не указано время изменения!" + +#~ msgid "No printer name!" +#~ msgstr "Нет имени принтера!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Не указан адрес printer-uri для класса!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Не указан адрес printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Нет адреса printer-uri в запросе!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Нет атрибутов подписки в запросе!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC почти в end-of-life." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC в end-of-life!" + +#~ msgid "Out of toner!" +#~ msgstr "Недостаточно тонера!" + +#~ msgid "Output bin almost full." +#~ msgstr "Выходной лоток почти заполнен." + +#~ msgid "Output bin full!" +#~ msgstr "Выходной лоток заполнен!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Вывод для принтера %s отправлен на %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "Вывод для принтера %s отправлен на удаленный принтер %s на %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Вывод для принтера %s/%s отправлен на %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "Вывод для принтера %s/%s отправлен на удаленный принтер %s на %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Выходной лоток отсутствует!" + +#~ msgid "PASS\n" +#~ msgstr "PASS\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Конверт PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Конверт PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Конверт PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Конверт PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (расширенный)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Конверт PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Конверт PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Конверт PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Конверт PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Конверт PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Конверт PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Индивидуальный конверт" + +#~ msgid "Printer offline." +#~ msgstr "Принтер в режиме не подключен к сети." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Ранг Владелец Задание Файл(ы) Общий " +#~ "размер\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Ранг Владелец Задание печати Файл(ы) " +#~ "Общий размер\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Запущенная команда: %s %s -N -A %s -c «%s»\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Принтер SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (расширенный)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Значение notify-user-data слишком длинное (%d > 63 октетов)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Нет общего доступа к принтеру или классу!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Принтер или класс не найден." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Требуется атрибут printer-uri!" + +#~ msgid "Toner low." +#~ msgstr "Тонер заканчивается." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "Слишком много значений job-sheets (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "Слишком много значений printer-state-reasons (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (расширенный)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (расширенный)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (уменьшенный)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Не удается добавить задание для назначения «%s»!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Не удается выделить память для типов файлов!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "Не удается копировать 64-битовые файлы драйвера принтера CUPS (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Не удается копировать 64-битовые файлы драйвера принтера для Windows (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Не удается копировать файлы драйвера принтера CUPS (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Не удается копировать PPD-файл – %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Не удается копировать PPD-файл!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "Не удается копировать файлы драйвера принтера Windows 2000 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Не удается копировать файлы драйвера принтера Windows 9x (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Не удается копировать скрипт интерфейса – %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Не удается создать printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Невозможно редактировать файлы «cupsd.conf» больше 1 МБ!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Не удается найти назначение для задания!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Не удается найти принтер!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "Не удается установить файлы драйвера принтера Windows 2000 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Не удается установить файлы драйвера принтера Windows 9x (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Не удается открыть документ %d в задании %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Не удается запустить «%s»: %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Не удается отправить команду драйверу принтера!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Не удается настроить драйвер принтера Windows (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Не удается использовать устаревший драйвер класса USB!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Неизвестная ошибка принтера (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Неподдерживаемый набор символов «%s»!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Неподдерживаемое сжатие «%s»!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Неподдерживаемый атрибут сжатия %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Неподдерживаемый формат «%s»!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "Неподдерживаемый формат «%s»!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Неподдерживаемый формат «%s/%s»!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Синтаксис:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Синтаксис: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Синтаксис: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Синтаксис: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Синтаксис: convert [ options ]\n" +#~ "\n" +#~ "Параметры:\n" +#~ "\n" +#~ " -f filename Указывается конвертируемый файл (в противном " +#~ "случае stdin)\n" +#~ " -o filename Указывается создаваемый файл (в противном случае " +#~ "stdout)\n" +#~ " -i mime/type Указывается MIME-тип данных на входе (в противном " +#~ "случае auto-typed)\n" +#~ " -j mime/type Указывается MIME-тип данных на выходе (в противном " +#~ "случае application/pdf)\n" +#~ " -P filename.ppd Указывается PPD-файл\n" +#~ " -a 'name=value ...' Указываются параметры\n" +#~ " -U username Указывается имя пользователя для задания\n" +#~ " -J title Указывается заголовок\n" +#~ " -c copies Указывается количество копий\n" +#~ " -u PPD-файл удаляется после выполнения команды\n" +#~ " -D Файл, поступивший на вход, удаляется после " +#~ "выполнения команды\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Синтаксис: cupsaddsmb [options] принтер1 ... принтерN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Параметры:\n" +#~ " -E Подключение к серверу шифруется\n" +#~ " -H samba-server Используется названный сервер SAMBA\n" +#~ " -U samba-user Выполняется проверка подлинности с использованием " +#~ "указанного пользователя SAMBA\n" +#~ " -a Экспортируются все принтеры\n" +#~ " -h cups-server Используется названный сервер CUPS\n" +#~ " -v Подробное отображение (показать команды)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Синтаксис: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Параметры:\n" +#~ "\n" +#~ " -E Включается шифрование\n" +#~ " -U username Указывается имя пользователя\n" +#~ " -h server[:port] Указывается адрес сервера\n" +#~ "\n" +#~ " --[no-]debug-logging Включается/отключается ведение журнала " +#~ "отладки\n" +#~ " --[no-]remote-admin Включается/отключается удаленное " +#~ "администрирование\n" +#~ " --[no-]remote-any Разрешается/запрещается доступ из Интернета\n" +#~ " --[no-]remote-printers Отображаются/скрываются удаленные принтеры\n" +#~ " --[no-]share-printers Включается/отключается совместное " +#~ "использование принтеров\n" +#~ " --[no-]user-cancel-any Пользователям разрешается/запрещается " +#~ "отменять задания\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Синтаксис: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Загружается альтернативный файл конфигурации\n" +#~ "-f Задание имеет высокий приоритет\n" +#~ "-F Задание имеет высокий приоритет и выделяется\n" +#~ "-h Отображается данное сообщение\n" +#~ "-l cupsd запускается из launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Синтаксис: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Параметры:\n" +#~ "\n" +#~ " -c cupsd.conf Используется файл cupsd.conf\n" +#~ " -j job-id[,N] Из указанного задания выбирается файл N (по умолчанию " +#~ "файл 1)\n" +#~ " -n copies Задается количество копий\n" +#~ " -o name=value Задаются параметры\n" +#~ " -p filename.ppd Задается PPD-файл\n" +#~ " -t title Задается заголовок\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Синтаксис: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Параметры:\n" +#~ "\n" +#~ " -h Отображается справка по использованию программы\n" +#~ "\n" +#~ " Примечание: данная программа проверяет только комментарии DSC, а не " +#~ "сам PostScript.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Синтаксис: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Параметры:\n" +#~ "\n" +#~ " -R root-directory Задается альтернативный корневой каталог\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Вместо ошибок выдаются предупреждения\n" +#~ " -q Команда выполняется в «тихом» режиме\n" +#~ " -r Используется открытый режим\n" +#~ " -v Режим более подробного отображения\n" +#~ " -vv Режим максимально подробного отображения\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Синтаксис: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Синтаксис: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "{>Синтаксис: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Синтаксис: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] " +#~ "[+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Синтаксис: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Параметры:\n" +#~ " -D name=value Указанной переменной присваивается значение.\n" +#~ " -I include-dir Добавляется каталог в путь поиска.\n" +#~ " -c catalog.po Загружается указанный каталог сообщений.\n" +#~ " -d output-dir Указывается каталог для выходных данных.\n" +#~ " -l lang[,lang,...] Указывается язык (регион) для выходных данных.\n" +#~ " -m В качестве имени файла используется значение " +#~ "ModelName.\n" +#~ " -t Вместо создания PPD-файлов выполняется их " +#~ "проверка.\n" +#~ " -v Режим подробного отображения (чем больше букв v, " +#~ "тем выше уровень детализации).\n" +#~ " -z Файлы PPD сжимаются с использованием GNU zip.\n" +#~ " --cr Строки заканчиваются на CR (Mac OS 9).\n" +#~ " --crlf Строки заканчиваются на CR + LF (Windows).\n" +#~ " --lf Строки заканчиваются на LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Синтаксис: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Указанной переменной присваивается значение.\n" +#~ "Параметры:\n" +#~ " -I include-dir Добавляется каталог в путь поиска.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Синтаксис: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Параметры:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Синтаксис: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Параметры:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Синтаксис: ppdpo [options] -o filename.po filename.drv [ ... filenameN." +#~ "drv ]\n" +#~ "Параметры:\n" +#~ " -D name=value Указанной переменной присваивается значение.\n" +#~ " -I include-dir Добавляется каталог в путь поиска.\n" +#~ " -v Подробный режим (чем больше букв v, тем выше уровень " +#~ "детализации).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Синтаксис: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Будут добавлены только первые найденные принтеры (%d)" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Параметр waiteof «%s» должен иметь булево значение\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Не удалось прочитать запрос бокового канала!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: Параметр «%s» не может быть включен через IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Принтер не отвечает\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Принтер преждевременно передал индикатор EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Удаленный хост не ответил байтом command-статуса после %d " +#~ "секунд!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Удаленный хост не ответил байтом control-статуса после %d " +#~ "секунд!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Удаленный хост не ответил байтом data-статуса после %d секунд!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: Время команды SCSI истекло (%d). Повтор попытки…\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Этот документ не соответствует Adobe Document Structuring " +#~ "Conventions и может быть напечатан неправильно!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Не удается открыть «%s:%s»: %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Не удается отправить запрос статуса PAP" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Непредвиденный PAP-пакет типа %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Неизвестный PAP-пакет типа %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Неизвестный выбор «%s» для параметра «%s»!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Неизвестный параметр «%s»!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Неподдерживаемая скорость передачи данных в бодах %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: Параметр статуса «%s» должен иметь числовое значение\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: Восстанавливаемо. Хост сети «%s» занят. Попытка будет повторена " +#~ "через %d сек…\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Внимание! Нет установленных драйверов принтера Windows 2000!" + +#~ msgid "You4 Envelope" +#~ msgstr "Конверт You4" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "convert: Используйте параметр -f для указания конвертируемого файла.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Нет PPD-файла для принтера «%s» – %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Не удается подключиться к серверу: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Неизвестный параметр «%s»!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Неизвестный параметр «-%c»!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Ожидаемое имя файла конфигурации после параметра «-c»!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Не удается определить текущий каталог!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Неизвестный аргумент «%s» – отмена!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Неизвестный параметр «%c» – отмена!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "" +#~ "cupsd: Поддержка launchd(8) не скомпилирована, работа в нормальном " +#~ "режиме.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Недопустимый номер документа %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Недопустимый ID задания %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Только одно имя файла может быть указано!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Не удается создать временный файл: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Не удается получить файл задания - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd: Параметр «-q» несовместим с параметром «-v».\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd: Параметр «-v» несовместим с параметром «-q».\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "устройство для %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "устройство для %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "справка\t\tполучить справку о командах\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Атрибут job-printer-uri отсутствует!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Имя класса может содержать только печатные символы!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: После параметра «-P» должен быть указан PPD!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "" +#~ "lpadmin: После параметра «-u» должен быть указан allow/deny:userlist!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: После параметра «-r» должен быть указан класс!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: После параметра «-c» должно быть указано имя класса!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: После параметра «-D» должно идти описание!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: После параметра «-v» должен быть указан URI устройства!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: После параметра «-I» должны быть указаны типы файлов!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: После параметра «-h» должно быть указано имя хоста!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: После параметра «-i» должен быть указан интерфейс!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: После параметра «-L» должно быть указано местоположение!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: После параметра «-m» должна быть указана модель!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "" +#~ "lpadmin: После параметра «-o» должно быть указано значение вида " +#~ "name=value!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: После параметра «-p» должен быть указан принтер!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: После параметра «-d» должно быть указано имя принтера!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "" +#~ "lpadmin: После параметра «-x» должен быть указан принтер или класс!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Имена участников не обнаружены!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Принтер %s уже является членом класса %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Принтер %s не является членом класса %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Имя принтера может содержать только печатные символы!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается добавить принтер к классу:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Не удается подключиться к серверу: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Не удается создать временный файл – %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Не удается создать временный файл: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Не удается открыть PPD-файл «%s» – %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Не удается открыть файл «%s»: %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается удалить принтер из класса:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить PPD-файл:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить URI устройства:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить скрипт интерфейса или PPD-файл:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить скрипт интерфейса:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить описание принтера:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить размещение принтера:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Не удается настроить параметры принтера:\n" +#~ " Необходимо сначала указать имя принтера!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: Неизвестный параметр allow/deny «%s»!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Неизвестный аргумент «%s»!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Неизвестный параметр «%c»!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Внимание – список типов контента пропущен!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: После --device-id должна идти строка ID устройства 1284!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: После –language должен быть указан язык!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "" +#~ "lpinfo: После --make-and-model должна быть указана марка и модель!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: После –product должна идти строка продукта!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: После --exclude-schemes должен идти список схем!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: После --ixclude-schemes должен идти список схем!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: После –timeout должно быть указано время ожидания!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Неизвестный аргумент «%s»!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Неизвестный параметр «%c»!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Неизвестный параметр «%s»!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Не удается подключиться к серверу: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Неизвестный аргумент «%s»!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Неизвестный параметр «%c»!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Нет принтеров!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "" +#~ "lpoptions: Не удается добавить принтер или представитель класса: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Не удается получить PPD-файл для %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Не удается открыть PPD-файл для %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Неизвестный принтер или класс!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "" +#~ "lppasswd: Только пользователь root может добавлять или удалять пароли!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Файл пароля занят!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Файл пароля не обновлен!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Пароль не подходит!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Пароль отклонен.\n" +#~ "Пароль должен состоять как минимум из 6 символов, не может содержать\n" +#~ "Ваше имя пользователя и должен содержать по крайней мере одну букву и " +#~ "цифру.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Пароль не подходит!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Не удается копировать строку пароля: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Не удается открыть файл пароля: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Не удается записать файл пароля: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: Не удалось создать рез. копию старого файла пароля: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: Не удалось переименовать файл пароля: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: Пользователь «%s» и группа «%s» не существуют.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: Ошибка – %s переменная окружения указывает несуществующее " +#~ "назначение «%s»!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "члены класса %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "нет записей\n" + +#~ msgid "no system default destination\n" +#~ msgstr "нет назначения системы по умолчанию\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events не указаны!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "URI-адрес notify-recipient-uri «%s» уже используется!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "URI-адрес notify-recipient-uri «%s» использует неизвестную схему!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d неверный!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Добавляю каталог «%s»...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Добавляю/обновляю текст интерфейса из %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Недопустимое булево значение (%s) в строке %d из %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Недопустимое имя разрешения «%s» в строке %d из %s.\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Недопустимое ключевое слово статуса %s в строке %d из %s.\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Недопустимая замена переменной ($%c) в строке %d из %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "" +#~ "ppdc: В строке %d из %s обнаружено значение, не привязанное к параметру!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Дубликат #po для региона %s в строке %d из %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть определение фильтра!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть имя программы!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: В строке %d из %s должно быть булево значение.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: После Font в строке %d из %s должен быть указан набор символов!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: В строке %d из %s должен быть код выбора.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: В строке %d из %s должно быть имя/текст выбора.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: После ColorModel в строке %d из %s должна быть указана цветовая " +#~ "схема!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Для ColorModel в строке %d из %s должно быть указано пространство " +#~ "цветов!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Для ColorModel в строке %d из %s должно быть указано сжатие!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Для UIConstraints в строке %d из %s должна быть указана строка " +#~ "ограничений!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: После DriverType в строке %d из %s должно быть указано ключевое " +#~ "слово типа драйвера!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: После Duplex в строке %d из %s должен быть указан тип дуплекса!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: После Font в строке %d из %s должна быть указана кодировка!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: После #po %s в строке %d из %s должно быть указано имя файла!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть указано имя группы/текст!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть указано имя файла!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть целое число!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: После #po в строке %d из %s должен быть указан регион!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: После %s в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: После FileName в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: После Font в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: После Manufacturer в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: После MediaSize в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: После ModelName в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: После PCFileName в строке %d из %s должно быть имя!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: После %s в строке %d из %s должно быть имя/текст!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: После Installable в строке %d из %s должно быть имя/текст!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: После Resolution в строке %d из %s должно быть имя/текст!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: После ColorModel в строке %d из %s должно быть имя/текст!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть указано имя параметра/текст!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должен быть раздел параметров!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должен быть указан тип параметра!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: После Resolution в строке %d из %s должно быть поле " +#~ "переопределения!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должно быть действительное число!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: После ColorProfile в строке %d из %s должно быть указано разрешение/" +#~ "тип носителя!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: После SimpleColorProfile в строке %d из %s должно быть указано " +#~ "разрешение/тип носителя!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: После %s в строке %d из %s должен быть селектор!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: После Font в строке %d из %s должен быть указан статус!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: После Copyright в строке %d из %s должна быть строка!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: После Version в строке %d из %s должна быть строка!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: В строке %d из %s должны быть два имени параметра!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: После %s в строке %d из %s должно быть значение!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: После Font в строке %d из %s должна быть указана версия!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Неверное имя файла #include/#po «%s»!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Затраты на фильтр в строке %d из %s указаны неверно!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Недопустимый пустой MIME-тип для фильтра в строке %d из %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Недопустимое пустое имя программы для фильтра в строке %d из %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Неверный раздел параметров «%s» в строке %d из %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Неверный тип параметра «%s» в строке %d из %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Загружаю файл с информацией о драйвере «%s»...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Загружаю сообщения для региона «%s»...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Загружаю сообщения из «%s»...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: Отсутствует #endif в конце «%s»!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: Отсутствует #if в строке %d из %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Не указан каталог сообщений для региона %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "ppdc: Для параметра %s определен другой тип в строке %d из %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Для ограничения параметра должно быть указано *name в строке %d из %" +#~ "s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: Слишком много вложенных операторов #if в строке %d из %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "lpadmin: Не удается создать PPD-файл «%s» – %s\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Не удается создать каталог для выходных данных %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Не удается создать конвейеры для выходных данных: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Не удается выполнить cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Не удается найти файл #po %s в строке %d из %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Не удается найти файл «%s» в строке %d из %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Не удается найти локализацию для «%s» - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Не удается загрузить файл локализации «%s» - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Не определена переменная (%s) в строке %d из %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Неизвестный тип драйвера %s в строке %d из %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Неизвестный тип дуплекса «%s» в строке %d из %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Неизвестный размер носителя «%s» в строке %d из %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Неизвестный маркер «%s» в строке %d из %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Неизвестные конечные символы в вещественном числе «%s» в строке %d " +#~ "из %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Не завершена строка, начинающаяся с %c в строке %d из %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Записываю %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Записываю PPD-файлы в каталог «%s»...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Неверное значение LanguageVersion «%s» в %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Пропускаю PPD-файл %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Невозможно создать резервную копию %s на %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "принтер %s отключен с момента %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "принтер %s свободен. Включен с момента %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "принтер %s сейчас печатает %s-%d. Включен с момента %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "принтер %s/%s отключен с момента %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "принтер %s/%s свободен. Включен с момента %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "принтер %s/%s сейчас печатает %s-%d. Включен с момента %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "id запроса %s-%d (%d файл.)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "планировщик не запущен\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "планировщик запущен\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "статус\t\tпоказать статус демона и очереди\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "назначение системы по умолчанию: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "назначение системы по умолчанию: %s/%s\n" diff --git a/locale/cups_sv.po b/locale/cups_sv.po new file mode 100644 index 0000000..8c83cbb --- /dev/null +++ b/locale/cups_sv.po @@ -0,0 +1,8673 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f millimeter" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f to %.0f x %.0f millimeter" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f tum" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f to %.2f x %.2f tum" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s kan inte ändras." + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 tum/sek." + +msgid "1.25x0.25\"" +msgstr "1,25 x 0,25" + +msgid "1.25x2.25\"" +msgstr "1,25 x 2,25\"" + +msgid "1.5 inch/sec." +msgstr "1,5 tum/sek." + +msgid "1.50x0.25\"" +msgstr "1,50 x 0,25\"" + +msgid "1.50x0.50\"" +msgstr "1,50 x 0,50" + +msgid "1.50x1.00\"" +msgstr "1,50 x 1,00\"" + +msgid "1.50x2.00\"" +msgstr "1,50 x 2,00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 tum/sek." + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 mm/sek." + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 tum/sek." + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 tum/sek." + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 mm/sek." + +msgid "120x60dpi" +msgstr "120 x 60 dpi" + +msgid "120x72dpi" +msgstr "120 x 72 dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136 dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 mm/sek." + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 mm/sek." + +msgid "150dpi" +msgstr "150 dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180 dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 tum/sek." + +msgid "2-Sided Printing" +msgstr "Dubbelsidig utskrift" + +msgid "2.00x0.37\"" +msgstr "2,00 x 0,37\"" + +msgid "2.00x0.50\"" +msgstr "2,00 x 0,50\"" + +msgid "2.00x1.00\"" +msgstr "2,00 x 1,00\"" + +msgid "2.00x1.25\"" +msgstr "2,00 x 1,25\"" + +msgid "2.00x2.00\"" +msgstr "2,00 x 2,00\"" + +msgid "2.00x3.00\"" +msgstr "2,00 x 3,00\"" + +msgid "2.00x4.00\"" +msgstr "2,00 x 4,00\"" + +msgid "2.00x5.50\"" +msgstr "2,00 x 5,50\"" + +msgid "2.25x0.50\"" +msgstr "2,25 x 0,50\"" + +msgid "2.25x1.25\"" +msgstr "2,25 x 1,25\"" + +msgid "2.25x4.00\"" +msgstr "2,25 x 4,00\"" + +msgid "2.25x5.50\"" +msgstr "2,25 x 5,50\"" + +msgid "2.38x5.50\"" +msgstr "2,38 x 5,50\"" + +msgid "2.5 inches/sec." +msgstr "2.5 tum/sek." + +msgid "2.50x1.00\"" +msgstr "2,50 x 1,00\"" + +msgid "2.50x2.00\"" +msgstr "2,50 x 2,00\"" + +msgid "2.75x1.25\"" +msgstr "2,75 x 1,25\"" + +msgid "2.9 x 1\"" +msgstr "2,9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 mm/sek." + +msgid "200 mm/sec." +msgstr "200 mm/sek." + +msgid "203dpi" +msgstr "203 dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "Serier med 24 pin" + +msgid "240x72dpi" +msgstr "240 x 72 dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 mm/sek." + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 tum/sek." + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3,00 x 1,00\"" + +msgid "3.00x1.25\"" +msgstr "3,00 x 1,25\"" + +msgid "3.00x2.00\"" +msgstr "3,00 x 2,00\"" + +msgid "3.00x3.00\"" +msgstr "3,00 x 3,00\"" + +msgid "3.00x5.00\"" +msgstr "3,00 x 5,00\"" + +msgid "3.25x2.00\"" +msgstr "3,25 x 2,00\"" + +msgid "3.25x5.00\"" +msgstr "3,25 x 5,00\"" + +msgid "3.25x5.50\"" +msgstr "3,25 x 5,50\"" + +msgid "3.25x5.83\"" +msgstr "3,25 x 5,83\"" + +msgid "3.25x7.83\"" +msgstr "3,25 x 7,83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5\" Disk" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3,5\" Disk - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3,50 x 1,00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 mm/sek." + +msgid "300 mm/sec." +msgstr "300 mm/sek." + +msgid "300dpi" +msgstr "300 dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360 dpi" + +msgid "360x180dpi" +msgstr "360 x 180 dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 tum/sek." + +msgid "4.00x1.00\"" +msgstr "4,00 x 1,00\"" + +msgid "4.00x13.00\"" +msgstr "4,00 x 13,00\"" + +msgid "4.00x2.00\"" +msgstr "4,00 x 2,00\"" + +msgid "4.00x2.50\"" +msgstr "4,00 x 2,50\"" + +msgid "4.00x3.00\"" +msgstr "4,00 x 3,00\"" + +msgid "4.00x4.00\"" +msgstr "4,00 x 4,00\"" + +msgid "4.00x5.00\"" +msgstr "4,00 x 5,00\"" + +msgid "4.00x6.00\"" +msgstr "4,00 x 6,00\"" + +msgid "4.00x6.50\"" +msgstr "4,00 x 6,50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 mm/sek." + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 tum/sek." + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 tum/sek." + +msgid "6.00x1.00\"" +msgstr "6,00 x 1,00\"" + +msgid "6.00x2.00\"" +msgstr "6,00 x 2,00\"" + +msgid "6.00x3.00\"" +msgstr "6,00 x 3,00\"" + +msgid "6.00x4.00\"" +msgstr "6,00 x 4,00\"" + +msgid "6.00x5.00\"" +msgstr "6,00 x 5,00\"" + +msgid "6.00x6.00\"" +msgstr "6,00 x 6,00\"" + +msgid "6.00x6.50\"" +msgstr "6,00 x 6,50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 mm/sek." + +msgid "600dpi" +msgstr "600 dpi" + +msgid "60dpi" +msgstr "60 dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 tum/sek." + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720 dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 tum/sek." + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8,00 x 1,00\"" + +msgid "8.00x2.00\"" +msgstr "8,00 x 2,00\"" + +msgid "8.00x3.00\"" +msgstr "8,00 x 3,00\"" + +msgid "8.00x4.00\"" +msgstr "8,00 x 4,00\"" + +msgid "8.00x5.00\"" +msgstr "8,00 x 5,00\"" + +msgid "8.00x6.00\"" +msgstr "8,00 x 6,00\"" + +msgid "8.00x6.50\"" +msgstr "8,00 x 6,50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 mm/sek." + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 tum/sek." + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "Serier med 9 pin" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "Acceptera utskrifter" + +msgid "Accepted" +msgstr "Accepterade" + +msgid "Add Class" +msgstr "Lägg till klass" + +msgid "Add Printer" +msgstr "Lägg till skrivare" + +msgid "Add RSS Subscription" +msgstr "Lägg till RSS-prenumeration" + +msgid "Address" +msgstr "Adress" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "Adress - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "Administration" + +msgid "Always" +msgstr "Alltid" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "Applikator" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "Felaktig NULL- destinationspekare" + +msgid "Bad OpenGroup" +msgstr "Felaktig OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "Felaktig OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "Felaktig OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "Felaktig begäran" + +msgid "Bad SNMP version number" +msgstr "Felaktigt SNMP-versionsnummer" + +msgid "Bad UIConstraints" +msgstr "Felaktig UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "Felaktigt värde för exemplar %d." + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "Felaktig anpassad parameter" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "Felaktigt värde för exemplar %d." + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "Felaktiga värden för sidintervall %d-%d." + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "Banners" + +msgid "Billing Information: " +msgstr "Faktureringsinformation: " + +msgid "Bond Paper" +msgstr "Fint papperr" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "Etikettskrivare CPCL" + +msgid "Cancel RSS Subscription" +msgstr "Avbryt RSS-prenumeration" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "Ändra inställningar" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "Klasser" + +msgid "Clean Print Heads" +msgstr "Rengör skrivarhuvuden" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "Färg" + +msgid "Color Mode" +msgstr "Färgläge" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "Gruppnamn använder obegränsad längd" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "Fortsätt" + +msgid "Continuous" +msgstr "Kontinuerlig" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "Skapad" + +msgid "Created On: " +msgstr "Skapad den: " + +msgid "Custom" +msgstr "Anpassad" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "Beskär" + +msgid "Cutter" +msgstr "Beskärare" + +msgid "Dark" +msgstr "Mörk" + +msgid "Darkness" +msgstr "Mörkhet" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "Ta bort klass" + +msgid "Delete Printer" +msgstr "Ta bort skrivare" + +msgid "Description: " +msgstr "Beskrivning: " + +msgid "DeskJet Series" +msgstr "DeskJet-serier" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "Mål \"%s\" tar inte emot utskrifter." + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "Termiska direktmedia" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "Avaktiverad" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "Drivrutinnamn: " + +msgid "Driver Version: " +msgstr "Drivrutinversion: " + +msgid "Duplexer" +msgstr "Duplexr" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "Etikettskrivare EPL1" + +msgid "EPL2 Label Printer" +msgstr "Etikettskrivare EPL2" + +msgid "Edit Configuration File" +msgstr "Redigera konfigurationsfil" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "Slutbanner" + +msgid "English" +msgstr "Swedish" + +msgid "Enter old password:" +msgstr "Ange gammalt lösenord:" + +msgid "Enter password again:" +msgstr "Ange lösenord igen:" + +msgid "Enter password:" +msgstr "Ange lösenord:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"Ange ditt användarnamn och lösenord eller root-användarnamnet och lösenord " +"för att komma åt denna sida. Om du använder Kerberos-autentisering, " +"kontrollera att du har en giltig Kerberos-biljett." + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "Kuvertmatare" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "Felpolicy" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "Var tionde etikett" + +msgid "Every 2 Labels" +msgstr "Varannan etikett" + +msgid "Every 3 Labels" +msgstr "Var tredje etikett" + +msgid "Every 4 Labels" +msgstr "Var fjärde etikett" + +msgid "Every 5 Labels" +msgstr "Var femte etikett" + +msgid "Every 6 Labels" +msgstr "Var sjätte etikett" + +msgid "Every 7 Labels" +msgstr "Var sjunde etikett" + +msgid "Every 8 Labels" +msgstr "Var åttonde etikett" + +msgid "Every 9 Labels" +msgstr "Var nionde etikett" + +msgid "Every Label" +msgstr "Alla etiketter" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "Ej förväntad respons" + +msgid "Export Printers to Samba" +msgstr "Exportera skrivare till Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "Filmapp" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "Filmapp - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "Folio" + +msgid "Forbidden" +msgstr "Förbjudet" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "Allmänt" + +msgid "Generic" +msgstr "Generisk" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU använder obegränsad längd" + +msgid "Glossy Paper" +msgstr "Blankt papper" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "Gråskala" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "Hängmapp" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "Hängmapp- 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "Otillåtet styrtecken" + +msgid "Illegal main keyword string" +msgstr "Otillåten huvudnyckelordssträng" + +msgid "Illegal option keyword string" +msgstr "Otillåten alternativnyckelordssträng" + +msgid "Illegal translation string" +msgstr "Otillåten översättningssträng" + +msgid "Illegal whitespace character" +msgstr "Otillåtet blanktecken" + +msgid "Installable Options" +msgstr "Installerbara alternativ" + +msgid "Installed" +msgstr "Installerad" + +msgid "IntelliBar Label Printer" +msgstr "Eikettskrivare från IntelliBar" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "Internt fel" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet Printing Protocol" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "Utskrift #%d är redan avbruten - kan inte avbryta." + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "Utskrift #%d är redan avbruten - kan inte avbryta." + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "Utskrift #%d är redan klar - kan inte avbryta." + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "Utskriften är klar" + +msgid "Job Created" +msgstr "Utskrift skapad" + +msgid "Job ID: " +msgstr "Uskrifts-ID: " + +msgid "Job Options Changed" +msgstr "Utskriftsalternativ ändrades" + +msgid "Job Stopped" +msgstr "Utskriften har stoppats" + +msgid "Job UUID: " +msgstr "Utskriftens UUID: " + +msgid "Job is completed and cannot be changed." +msgstr "Utskriften är klar och kan inte ändras." + +msgid "Job operation failed:" +msgstr "Utskriftsåtgärd misslyckades:" + +msgid "Job state cannot be changed." +msgstr "Utskriftsstatus kan inte ändras." + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "Utskrifter" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR-värd eller skrivare" + +msgid "Label Printer" +msgstr "Etikettskrivare" + +msgid "Label Top" +msgstr "Etikettens överdel" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "Large Address" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "Large Address - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "Lätt" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "Rad överskrider maxlängd (255 tecken)" + +msgid "List Available Printers" +msgstr "Senast tillgängliga skrivare" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "Plats: " + +msgid "Long-Edge (Portrait)" +msgstr "Långsida (porträtt)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "Tillverkning och modell: " + +msgid "Manual Feed" +msgstr "Manuell matning" + +msgid "Media Dimensions: " +msgstr "Mediemått: " + +msgid "Media Limits: " +msgstr "Mediegränser: " + +msgid "Media Name: " +msgstr "Medienamn: " + +msgid "Media Size" +msgstr "Mediestorlek" + +msgid "Media Source" +msgstr "Mediekälla" + +msgid "Media Tracking" +msgstr "Mediespårning" + +msgid "Media Type" +msgstr "Medietyp" + +msgid "Medium" +msgstr "Medium" + +msgid "Memory allocation error" +msgstr "Minnestilldelningsfel" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "Saknar PPD-Adobe-4.x-huvud" + +msgid "Missing asterisk in column 1" +msgstr "Saknar asterisk i kolumn 1" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "Saknar värdesträng" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "Ändra klass" + +msgid "Modify Printer" +msgstr "Ändra skrivare" + +msgid "Move All Jobs" +msgstr "Flytta alla utskrifter" + +msgid "Move Job" +msgstr "Flytta utskrift" + +msgid "Moved Permanently" +msgstr "Flyttad permanent" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD-filspekare" + +msgid "Name OID uses indefinite length" +msgstr "OID-namn använder obegränsad längd" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "Aldrig" + +msgid "New Stylus Color Series" +msgstr "Nya Stylus Color-serier" + +msgid "New Stylus Photo Series" +msgstr "Nya Stylus Photo-serier" + +msgid "No" +msgstr "Nej" + +msgid "No Content" +msgstr "Inget innehåll" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "Ingen VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "Ingen aktiv anslutning" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "Inget gruppnamn" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "Inga mål tillagda." + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "Inget felindex" + +msgid "No error-status" +msgstr "Ingen felstatus" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "Inget OID-namn" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "Inget order-ID" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "Inga prenumerationer hittades." + +msgid "No variable-bindings SEQUENCE" +msgstr "Ingen variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "Inget versionsnummer" + +msgid "Non-continuous (Mark sensing)" +msgstr "Non-continuous (Mark sensing)" + +msgid "Non-continuous (Web sensing)" +msgstr "Non-continuous (Web sensing)" + +msgid "Normal" +msgstr "Normal" + +msgid "Not Found" +msgstr "Hittades inte" + +msgid "Not Implemented" +msgstr "Inte implementerad" + +msgid "Not Installed" +msgstr "Inte installerad" + +msgid "Not Modified" +msgstr "Inte ändrad" + +msgid "Not Supported" +msgstr "Stöds inte" + +msgid "Not allowed to print." +msgstr "Ingen förvald skrivare." + +msgid "Note" +msgstr "Anm" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "OK" + +msgid "Off (1-Sided)" +msgstr "Av (1-sidig)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "Hjälp på webben" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "Kunde inte öppna %s: %s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup utan en CloseGroup först" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI utan en CloseUI/JCLCloseUI först" + +msgid "Operation Policy" +msgstr "Åtgärdspolicy" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "Alternativ installerade" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Alternativ: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "Utmatningsläge" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "Laserskrivare PCL" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "Paket innehåller inte Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "Paket börjar inte med SEQUENCE" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "Lösenord för %s på %s? " + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "Lösenord för %s krävs för att nå %s via SAMBA: " + +msgid "Pause Class" +msgstr "Pausa klass" + +msgid "Pause Printer" +msgstr "Pausa skrivare" + +msgid "Peel-Off" +msgstr "Peel-Off" + +msgid "Photo" +msgstr "Foto" + +msgid "Photo Labels" +msgstr "Fotoetiketter" + +msgid "Plain Paper" +msgstr "Vanligt papper" + +msgid "Policies" +msgstr "Policier" + +msgid "Port Monitor" +msgstr "Portövervakare" + +msgid "PostScript Printer" +msgstr "PostScript-skrivare" + +msgid "Postcard" +msgstr "Vykort" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "Svärta" + +msgid "Print Job:" +msgstr "Utskrift:" + +msgid "Print Mode" +msgstr "Utskriftsläge" + +msgid "Print Rate" +msgstr "Utskriftshastighet" + +msgid "Print Self-Test Page" +msgstr "Skriv ut självtestsida" + +msgid "Print Speed" +msgstr "Utskriftshastighet" + +msgid "Print Test Page" +msgstr "Skriv ut testsida" + +msgid "Print and Cut" +msgstr "Skriv ut och beskär" + +msgid "Print and Tear" +msgstr "Skriv ut riv" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "Utskriven för: " + +msgid "Printed From: " +msgstr "Utskriven från: " + +msgid "Printed On: " +msgstr "Utskriven den: " + +msgid "Printer Added" +msgstr "Skrivare tillagd" + +msgid "Printer Default" +msgstr "Skrivarstandard" + +msgid "Printer Deleted" +msgstr "Skrivare borttagen" + +msgid "Printer Modified" +msgstr "Skrivare ändrad" + +msgid "Printer Name: " +msgstr "Skrivarnamn: " + +msgid "Printer Paused" +msgstr "Utskrift pausad" + +msgid "Printer Settings" +msgstr "Skrivarinställningar" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "Skrivare:" + +msgid "Printers" +msgstr "Skrivare" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "Rensa utskrifter" + +msgid "Quarto" +msgstr "Kvartsark" + +msgid "Quota limit reached." +msgstr "Kvotgräns nådd." + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "Neka utskrifter" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "Skriv ut igen efter fel" + +msgid "Request Entity Too Large" +msgstr "Enheten är för stor" + +msgid "Resolution" +msgstr "Upplösning" + +msgid "Resume Class" +msgstr "Återuppta klass" + +msgid "Resume Printer" +msgstr "Återuppta skrivare" + +msgid "Return Address" +msgstr "Returadress" + +msgid "Return Address - 3/4 x 2\"" +msgstr "Returadress- 3/4 x 2\"" + +msgid "Rewind" +msgstr "Bakåt" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE använder obegränsad längd" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "Visa andra" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "Serieport #%d" + +msgid "Server Restarted" +msgstr "Servern har startats om" + +msgid "Server Security Auditing" +msgstr "Säkerhetskontroll av servern" + +msgid "Server Started" +msgstr "Servern har startat" + +msgid "Server Stopped" +msgstr "Servern har stoppats" + +msgid "Service Unavailable" +msgstr "Tjänst otillgänglig" + +msgid "Set Allowed Users" +msgstr "Ställ in tillåtna användare" + +msgid "Set As Server Default" +msgstr "Ställ in som serverförval" + +msgid "Set Class Options" +msgstr "Ställ in klassalternativ" + +msgid "Set Printer Options" +msgstr "Ställ in skrivaralternativ" + +msgid "Set Publishing" +msgstr "Ställ in publicering" + +msgid "Shipping Address" +msgstr "Leveransadress" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "Leveransadress - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "Kortsida (landskap)" + +msgid "Special Paper" +msgstr "Specialpapper" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "Standard" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "Startbanner" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "Utsaga" + +msgid "Stylus Color Series" +msgstr "Stylus Color-serier" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo-serier" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "Byter protokoll" + +msgid "Tabloid" +msgstr "Tabloid" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "Riv" + +msgid "Tear-Off" +msgstr "Riv-av" + +msgid "Tear-Off Adjust Position" +msgstr "Justeringsposition för avrivning" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "PPD-filen \"%s\" hittades inte." + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "PPD-filen \"%s\" kunde inte öppnas: %s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Klassnamnet får endast innehålla upp till 127 skrivbara tecken och får inte " +"innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)." + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "" +"Attributet notify-lease-duration kan inte användas med " +"utskriftsprenumerationer." + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"Skrivarnamnet får endast innehålla upp till 127 skrivbara tecken och får " +"inte innehålla blanksteg, snedstreck (/) eller fyrkantstecknet (#)." + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "Printer-uri \"%s\" innehåller ogiltiga tecken." + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "" +"Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/classes/KLASSNAMN\"." + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "" +"Printer-uri måste vara i formatet \"ipp://VÄRDNAMN/printers/SKRIVARNAMN\"." + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "" +""Klassnamnet får endast innehålla upp till 127 skrivbara tecken och får " +"inte innehålla blanksteg, snedstreck (/), frågetecken (?) eller " +"fyrkantstecknet (#)." + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "Det finns för många prenumerationer." + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "Termiska överföringsmedia" + +msgid "Title: " +msgstr "Titel: " + +msgid "Too many active jobs." +msgstr "För många aktiva utskrifter." + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "Genomskinlighet" + +msgid "Tray" +msgstr "Fack" + +msgid "Tray 1" +msgstr "Fack 1" + +msgid "Tray 2" +msgstr "Fack 2" + +msgid "Tray 3" +msgstr "Fack 3" + +msgid "Tray 4" +msgstr "Fack 4" + +msgid "URI Too Long" +msgstr "För lång URI" + +msgid "US Ledger" +msgstr "US Ledger" + +msgid "US Legal" +msgstr "US Legal" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "US Letter" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB-serieport #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "Kunde inte nå filen cupsd.conf:" + +msgid "Unable to add RSS subscription:" +msgstr "Kunde inte lägga till RSS-prenumeration:" + +msgid "Unable to add class:" +msgstr "Kunde inte lägga till klass:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "Kunde inte lägga till skrivare:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "Kunde inte avbryta RSS-prenumeration:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "Kunde inte ändra attributet printer-is-shared:" + +msgid "Unable to change printer:" +msgstr "Kunde inte ändra skrivare:" + +msgid "Unable to change server settings:" +msgstr "Kunde inte ändra serverinställningar:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "Kunde inte ansluta till värd." + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "Kunde inte skapa temporär fil:" + +msgid "Unable to delete class:" +msgstr "Kunde inte ta bort klass:" + +msgid "Unable to delete printer:" +msgstr "Kunde inte ta bort skrivare:" + +msgid "Unable to do maintenance command:" +msgstr "Kunde inte utföra underhållskommando:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "Kunde inte hämta klasslista:" + +msgid "Unable to get class status:" +msgstr "Kunde inte hämta klasstatus:" + +msgid "Unable to get list of printer drivers:" +msgstr "Kunde inte hämta listan med skrivardrivrutiner:" + +msgid "Unable to get printer attributes:" +msgstr "Kunde inte hämta skrivarattribut:" + +msgid "Unable to get printer list:" +msgstr "Kunde inte hämta skrivarlista:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "Kunde inte hämta skrivarstatus:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "Kunde inte ändra klass:" + +msgid "Unable to modify printer:" +msgstr "Kunde inte ändra skrivare:" + +msgid "Unable to move job" +msgstr "Kunde inte flytta utskrift" + +msgid "Unable to move jobs" +msgstr "Kunde inte flytta utskrifter" + +msgid "Unable to open PPD file" +msgstr "Kunde inte öppna PPD-fil" + +msgid "Unable to open PPD file:" +msgstr "Kunde inte öppna PPD-fil:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "Kunde inte öppna filen cupsd.conf:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "Kunde inte skriva ut testsida:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "Kunde inte ställa in alternativ:" + +msgid "Unable to set server default:" +msgstr "Kunde inte ställa in serverstandard:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "Kunde inte skicka upp filen cupsd.conf:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "Ej auktoriserad" + +msgid "Units" +msgstr "Enheter" + +msgid "Unknown" +msgstr "Okänd" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "Okänd printer-error-policy \"%s\"." + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "Okänd printer-op-policy \"%s\"." + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "Ogiltig värdetyp" + +msgid "Upgrade Required" +msgstr "Uppgradering krävs" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Värde använder obegränsad längd" + +msgid "VarBind uses indefinite length" +msgstr "VarBind använder obegränsad längd" + +msgid "Version uses indefinite length" +msgstr "Version använder obegränsad längd" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "Ja" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"Du måste öppna sidan med url:en https://%s:%d%s." + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "Etikettskrivare ZPL" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "stoppad" + +msgid "canceled" +msgstr "stoppad" + +msgid "completed" +msgstr "klar" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced misslyckades med att starta." + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd misslyckades med att starta." + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "felindex använder obegränsad längd" + +msgid "error-status uses indefinite length" +msgstr "felstatus använder obegränsad längd" + +msgid "held" +msgstr "hålls kvar" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "overksam" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "väntar" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "bearbetar" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "order-ID använder obegränsad längd" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "status för %s misslyckades: %s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "stoppad" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "okänd" + +msgid "untitled" +msgstr "namnlös" + +msgid "variable-bindings uses indefinite length" +msgstr "variabelbindningar använder obegränsad längd" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(alla)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(ingen)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d poster\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\tEfter fel: fortsätt\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tVarningar:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\tBanner krävs\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\tTeckenkodningar:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\tAnslutning: direkt\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\tAnslutning: fjärr\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\tFörvalt pappersformat:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\tStandardavstånd mellan bildpunkter:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\tStandardportinställningar:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\tBeskrivning: %s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\tAktiv skrivarmall:\n" +#~ "\tInnehållstyper: alla\n" +#~ "\tSkrivartyper: okänt\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\tTillåtna format:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\tGränssnitt: %s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\tGränssnitt: %s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\tGränssnitt: %s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\tPlats: %s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\tVid fel: ingen varning\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\tTillåtna användare:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\tNekade användare:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\tdemon närvarande\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\tinga poster\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\tskrivare finns på enheten ”%s” hastighet -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\tutskrifter är avaktiverade\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\tutskrifter är aktiverade\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\tköad för %s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\tköläggning är avaktiverad\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\tköläggning är aktiverad\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\tokänd anledning\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " DETALJERADE TESTRESULTAT\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: Sida 15, sektion 3.1.\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: Sida 15, sektion 3.2.\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: Sida 19, sektion 3.3.\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: Sida 20, sektion 3.4.\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: Sida 27, sektion 3.5.\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: Sida 42, sektion 5.2.\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: Sidorna 16-17, sektion 3.2.\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: Sidorna 42-45, sektion 5.2.\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: Sidorna 45-46, sektion 5.2.\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: Sidorna 48-49, sektion 5.2.\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: Sidorna 52-54, sektion 5.2.\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " OK Standard%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " OK DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " OK DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " OK FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " OK FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " OK LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " OK LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " OK Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " OK ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " OK NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " OK PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " OK PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " OK PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " OK PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " OK Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " OK ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " VARN \"%s %s\" är i konflikt med \"%s %s\"\n" +#~ " (begränsare=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " VARN %s har inga motsvarande alternativ!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " VARN %s delar ett vanligt prefix med %s\n" +#~ " REF: Sida 15, sektion 3.2.\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " VARN Standardval är i konflikt!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " VARN Nyckelordet %s för duplexalternativet kanske inte " +#~ "fungerar som det ska och bör vara Duplex!\n" +#~ " REF: Sida 122, sektion 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr "" +#~ " VARN Filen innehåller en blandning av radslut med CR, LF och " +#~ "CR LF!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " VARN LanguageEncoding krävs av PPD 4.3-spec.\n" +#~ " REF: Sidorna 56-57, sektion 5.3.\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " VARN Rad %d innehåller endast mellanslag!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " VARN Manufacturer krävs av PPD 4.3-spec.\n" +#~ " REF: Sidorna 58-59, sektion 5.3.\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " VARN Saknad APDialogExtension-fil ”%s”\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " VARN Saknad APPrinterIconPath-fil ”%s”\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " VARN Icke-Windows PPD-filer bör använda radslut med endast LF, " +#~ "inte CR LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " VARN Föråldrad PPD-version %.1f!\n" +#~ " REF: Sida 42, sektion 5.2.\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " VARN PCFileName längre än 8.3 i strid med PPD-spec.\n" +#~ " REF: Sidorna 61-62, sektion 5.3.\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " VARN Protokollen innehåller PJL men JCL-attributen är inte " +#~ "inställda.\n" +#~ " REF: Sidorna 78-79, sektion 5.7.\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " VARN Protokollen innehåller både PJL och BCP, förväntade " +#~ "TBCP.\n" +#~ " REF: Sidorna 78-79, sektion 5.7.\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " VARN ShortNickName krävs av PPD 4.3-spec.\n" +#~ " REF: Sidorna 64-65, sektion 5.3.\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s finns inte!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s Felaktigt %s val %s!\n" +#~ " REF: Sida 122, sektion 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr "" +#~ " %s Felaktig UTF-8-översättningssträng ”%s” för alternativet %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Felaktig UTF-8-översättningssträng ”%s” för alternativet %s, " +#~ "valet %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s Felaktigt cupsFilter-värde \"%s\"!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s Felaktig cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s Felaktigt cupsFilter-värde \"%s\"!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Felaktig cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s Felaktigt språk \"%s\"!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s Tom cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s Saknad översättningssträng ”%s” för alternativet %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr "" +#~ " %s Saknad översättningssträng ”%s” för alternativet %s, valet %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s Valet *%s %s saknas i UIConstraints \"*%s %s *%s %s”!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Valet *%s %s saknas i cupsUIConstraints %s: \"%s”!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s Felaktigt cupsFilter-värde \"%s\"\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s Saknad cupsICCProfile-fil \"%s\"!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s Saknad cupsPreFilter-fil \"%s\"\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s Saknad cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s Alternativet %s saknas i UIConstraints \"*%s %s *%s %s\"!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s Alternativet %s saknas i cupsUIConstraints %s: \"%s\"!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s Ingen grundöversättning \"%s\" finns i filen!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s KRÄVER %s definierar inte valet None!\n" +#~ " REF: Sida 122, sektion 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s hashvärde står i konflikt med %s!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s orsakade en loop!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEL** %s namnen %s och %s skiljer sig endast i fråga om stor " +#~ "eller liten bokstav!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **FEL** %s måste vara 1284DeviceID!\n" +#~ " REF: Sida 72, sektion 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG standard%s %s\n" +#~ " REF: Sida 40, sektion 4.5.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG DefaultImageableArea %s!\n" +#~ " REF: Sida 102, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG DefaultPaperDimension %s!\n" +#~ " REF: Sida 103, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIGT JobPatchFile-attribut i fil\n" +#~ " REF: Sida 24, sektion 3.4.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG Manufacturer (ska vara \"HP\")\n" +#~ " REF: Sida 211, tabell D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG Manufacturer (ska vara \"Oki\")\n" +#~ " REF: Sida 211, tabell D.1.\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG ModelName- \"%c\" tillåts inte i sträng.\n" +#~ " REF: Sidorna 59-60, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG PSVersion - inte \"(string) int\".\n" +#~ " REF: Sidorna 62-64, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG Product - inte \"(string)\".\n" +#~ " REF: Sida 62, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** FELAKTIG ShortNickName - längre än 31 tecken.\n" +#~ " REF: Sidorna 64-65, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **FEL** Felaktigt %s-val %s!\n" +#~ " REF: Sida 84, sektion 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** Felaktig FileVersion \"%s\"\n" +#~ " REF: Sida 56, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** Felaktig FormatVersion \"%s\"\n" +#~ " REF: Sida 56, sektion 5.3.\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **FEL** Felaktig språkkodning %s - måste vara ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **FEL** Felaktigt språk %s - måste vara engelska!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **FEL** Förvald alternativkod kan inte tolkas: %s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr "" +#~ " **FEL** Standardöversättningssträng för alternativet %s val %s " +#~ "innehåller 8-bitars tecken!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr "" +#~ " **FEL** Standardöversättningssträng för alternativet %s innehåller " +#~ "8-bitars tecken!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEL** Gruppnamnen %s och %s skiljer sig endast i fråga om stor " +#~ "eller liten bokstav!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **FEL** Flera förekomster av %s namn %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr "" +#~ " **FEL** Alternativnamnen %s och %s skiljer sig endast i fråga om " +#~ "stor eller liten bokstav!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **FEL** Standard%s KRÄVS\n" +#~ " REF: Sida 40, sektion 4.5.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER DefaultImageableArea\n" +#~ " REF: Sida 102, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER DefaultPaperDimension\n" +#~ " REF: Sida 103, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER FileVersion\n" +#~ " REF: Sida 56, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER FormatVersion\n" +#~ " REF: Sida 56, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER ImageableArea för PageSize %s\n" +#~ " REF: Sida 41, sektion 5.\n" +#~ " REF: Sida 102, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER LanguageEncoding\n" +#~ " REF: Sidorna 56-57, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER LanguageVersion\n" +#~ " REF: Sidorna 57-58, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER Manufacturer\n" +#~ " REF: Sidorna 58-59, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER ModelName\n" +#~ " REF: Sidorna 59-60, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER NickName\n" +#~ " REF: Sida 60, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PCFileName\n" +#~ " REF: Sidorna 61-62, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PSVersion\n" +#~ " REF: Sidorna 62-64, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PageRegion\n" +#~ " REF: Sida 100, sektion 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PageSize\n" +#~ " REF: Sida 41, sektion 5.\n" +#~ " REF: Sida 99, sektion 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PageSize\n" +#~ " REF: Sidorna 99-100, sektion 5.14.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER PaperDimension för PageSize %s\n" +#~ " REF: Sida 41, sektion 5.\n" +#~ " REF: Sida 103, sektion 5.15.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER Product\n" +#~ " REF: Sida 62, sektion 5.3.\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **FEL** KRÄVER ShortNickName\n" +#~ " REF: Sidorna 64-65, sektion 5.3.\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " %d FEL HITTADES\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " Felaktig %%%%BoundingBox: på rad %d!\n" +#~ " REF: Sida 39, %%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " Felaktig %%%%Page: på rad %d!\n" +#~ " REF: Sida 53, %%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " Felaktiga %%%%Pages: på rad %d!\n" +#~ " REF: Sida 43, %%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " Rad %d är längre än 255 tecken (%d)!\n" +#~ " REF: Sida 25, Line Length\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " Saknar %!PS-Adobe-3.0 på första raden!\n" +#~ " REF: Sida 17, 3.1 Conforming Documents\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " Saknar %%EndComments-kommentar!\n" +#~ " REF: Sida 41, %%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " Saknad eller felaktig %%BoundingBox: kommentar!\n" +#~ " REF: Sida 39, %%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " Saknad eller felaktig %%Page: kommentar!\n" +#~ " REF: Sida 53, %%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " Saknad eller felaktig %%Pages: kommentar!\n" +#~ " REF: Sida 43, %%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " INGA FEL HITTADES\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " Såg %d rader som översteg 255 tecken!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " För många %%BeginDocument-kommentarer!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " För många %%EndDocument-kommentarer!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " Varning: filen innehåller binärdata!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " Varning: ingen %%EndComments-kommentar i fil!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " Varning: föråldrad DSC-version %.1f i fil!\n" + +#~ msgid " FAIL\n" +#~ msgstr " FEL\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " FEL\n" +#~ " **FEL** Kunde inte öppna PPD-fil - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " FEL\n" +#~ " **FEL** Kunde inte öppna PPD-fil - %s på rad %d.\n" + +#~ msgid " PASS\n" +#~ msgstr " OK\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 Envelope" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 Envelope" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 Envelope" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 Envelope" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 Envelope" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s accepterar begäran sedan %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s är inte införd i CUPS-versionen av lpc.\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s är inte klar\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s är klar\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s är klar och skriver ut\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s accepterar inte begäran sedan %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s stöds inte!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s accepterar begäran sedan %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s accepterar inte begäran sedan %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s: %-33.33s [utskrift %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s: %s misslyckades: %s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s: Vet inte vad som ska göras!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: Fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s: Fel - felaktigt utskrifts-ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "" +#~ "%s: Fel - kan inte skriva ut filer och ändra utskrifter samtidigt!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "" +#~ "%s: Fel - kan inte skriva ut från standard in om filer eller ett " +#~ "utskrifts-ID anges!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s: Fel - förväntade teckenkodning efter alternativet ”-S”!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s: Fel - förväntade innehållstyp efter alternativet ”-T”!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s: Fel - förväntade exemplar efter alternativet ”-n”!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s: Fel - förväntade antal exemplar efter alternativet ”-#”!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s: Fel - förväntade mål efter alternativet ”-P”!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s: Fel - förväntade mål efter alternativet ”-b”!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s: Fel - förväntade mål efter alternativet ”-d”!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s: Fel - förväntade format efter alternativet ”-f”!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s: Fel - förväntade kvarhållningsnamn efter alternativet ”-H”!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s: Fel - förväntade värdnamn efter alternativet ”-H”!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s: Fel - förväntade värdnamn efter alternativet ”-h”!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s: Fel - förväntade lägeslista efter alternativet ”-y”!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s: Fel - förväntade namn efter alternativet ”-%c”!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s: Fel - förväntade alternativsträng efter alternativet ”-o”!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s: Fel - förväntade sidlista efter alternativet ”-P”!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s: Fel - förväntade prioritet efter alternativet ”-%c”!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s: Fel - förväntade anledningstext efter alternativet ”-r”!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s: Fel - förväntade titel efter alternativet ”-t”!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s: Fel - förväntade användarnamn efter alternativet ”-U”!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s: Fel - förväntade användarnamn efter alternativet ”-U”!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s: Fel - förväntade värde efter alternativet ”-%c”!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s: Fel - behöver ”completed”, ”not-completed” eller ”all” efter " +#~ "alternativet ”-W”!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s: Fel - inget standardmål tillgängligt.\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s: Fel - prioritet måste vara mellan 1 och 100.\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s: Fel - schemaläggare svarar inte!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s: Fel - för många filer - \"%s\"\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s: Fel - kunde inte komma åt \"%s\" - %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s: Fel - kunde inte köa från standard in - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s: Fel - okänt mål \"%s\"!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s: Fel - okänt mål \"%s/%s\"!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s: Fel - okänt alternativ ”%c”!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s: Fel - okänt alternativ ”%s”!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s: Förväntade utskrifts-ID efter alternativet ”-i”!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s: Filter \"%s\" inte tillgängligt: %s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s: Ogiltigt målnamn i listan \"%s\"!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s: Ogiltig filtersträng \"%s\"\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s: Behöver utskrifts-ID (”-i jobid”) före ”-H restart”!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s: Filter saknas för konvertering från %s/%s till %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s: Åtgärd misslyckades: %s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s: Tyvärr, inget stöd för kryptering har byggts in!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s: Kunde inte ansluta till server\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s: Kunde inte kontakta server!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s: Kan inte avgöra MIME-typ hos \"%s\"!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s: Kan inte öppna %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s: Kan inte öppna %s - %s på rad %d.\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s: Kan inte öppna %s: %s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s: Kan inte öppna PPD-fil: %s på rad %d\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s: Kan inte läsa MIME-databas från \"%s\" eller \"%s\"!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s: Okänt mål \"%s\"!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s: Okänd mål-MIME-typ %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s: Okänt alternativ ”%c”!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s: Okänd käll-MIME-typ %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "" +#~ "%s: Varning - ”%c” formatmodifieraren stöds inte - utmatning kanske inte " +#~ "blir korrekt!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s: Varning - alternativet för teckenkodning ignorerades!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s: Varning - alternativet för innehållstyp ignorerades!" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s: Varning - formuläralternativ ignorerades!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s: Varning - lägesalternativ ignorerades!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s: förväntade option=value efter alternativet ”-o”!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s: Fel - inget standardmål tillgängligt.\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI gråskala" + +#~ msgid "60x720dpi" +#~ msgstr "60 x 720 dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?Ogiltigt hjälpkommando okänt\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "Ett Samba-lösenord krävs för att exportera skrivardrivrutiner" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "Ett Samba-användarnamn krävs för att exportera skrivardrivrutiner!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "En klass med namnet \"%s\" finns redan!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "En skrivare med namnet \"%s\" finns redan!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3 (större)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4 (större)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4 (mindre)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5 (större)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "Försök att ställa in %s printer-state till felaktigt värde %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "Attributgrupper har fel ordning (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "Felaktig device URI \"%s\"!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "Felaktig device-uri \"%s\"!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "Felaktigt device-uri-system\"%s\"!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "Felaktigt document-format \"%s\"!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "Felaktig buffring av filnamn!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "Felaktigt teckensnittsattribut: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "Felaktigt värde för utskriftsprioritet!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "Felaktigt värde för utskriftsark \"%s\"!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "Felaktigt värde för typ av utskriftsark!" + +#~ msgid "Bad job-state value!" +#~ msgstr "Felaktigt värde för utskriftsstatus!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "Felaktigt attribut för job-uri \"%s\"!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "Felaktig notify-pull-method \"%s\"!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "Felaktig URI för notify-recipient \"%s\"!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "Felaktigt alternativ + val på rad %d!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "Felaktig portövervakare \"%s\"!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "Felaktigt värde för skrivarstatus %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "Felaktigt versionsnummer %d.%d för begäran!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "Felaktigt prenumerations-ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "Kuvert C0" + +#~ msgid "C1 Envelope" +#~ msgstr "Kuvert C1" + +#~ msgid "C2 Envelope" +#~ msgstr "Kuvert C2" + +#~ msgid "C3 Envelope" +#~ msgstr "Kuvert C3" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "Kuvert C4" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "Kuvert C5" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "Kuvert C6" + +#~ msgid "C65 Envelope" +#~ msgstr "Kuvert C65" + +#~ msgid "C7 Envelope" +#~ msgstr "Kuvert C7" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "Teckenkodningen \"%s\" stöds inte!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3-kuvert" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4-kuvert" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "Kommandon kan förkortas. Kommandon är:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "Kunde inte skanna typen \"%s\"!" + +#~ msgid "Cover open." +#~ msgstr "Lock öppet." + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL-kuvert" + +#~ msgid "Developer almost empty." +#~ msgstr "Tonern nästan slut." + +#~ msgid "Developer empty!" +#~ msgstr "Tonern är slut!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "Enhet: uri = %s\n" +#~ " klass = %s\n" +#~ " info = %s\n" +#~ " tillverkning-och-modell = %s\n" +#~ " enhets-id = %s\n" +#~ " plats = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "Dokument %d hittades inte i utskrift %d." + +#~ msgid "Door open." +#~ msgstr "Lucka öppen." + +#~ msgid "Double Postcard" +#~ msgstr "Dubbelt vykort" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: Kunde inte tilldela minne för sidinfo: %s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: Kunde inte tilldela minne för sidordning: %s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Felaktig %%BoundingBox: kommentar sedd!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: Felaktig %%IncludeFeature: kommentar!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: Felaktig %%Page: kommentar i fil!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: Felaktig %%PageBoundingBox: kommentar i fil!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: Felaktig SCSI-enhetsfil \"%s\"!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: Felaktig teckenkodningsfil %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: Felaktig teckenkodningstyp %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: Felaktigt kolumnvärde %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: Felaktigt cpi-värde %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: Felaktig typsnittsbeskrivning rad: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: Felaktigt lpi-värde %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: Felaktigt utskriftsformat!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: Felaktig textriktning %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: Felaktig textbredd %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: Målskrivaren finns inte!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: Duplikat av %%BoundingBox: kommentar sedd!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: Duplikat av %%Pages: kommentar sedd!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: Tom utskriftsfil!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: Fel %d vid sändning av PAPSendData- begäran: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: Förväntad sträng inom citationstecken på rad %d av %s!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: Allvarligt USB-fel!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "ERROR: Ogiltigt HP-GL/2-kommando sett, kan inte skriva ut filen!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: Saknad %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: Saknad %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Saknad enhets-URI i kommandoraden och ingen miljövariabel för " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: Saknar värde på rad %d i bannerfil!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: Ingen %%BoundingBox: kommentar i sidhuvud!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: Inga %%Pages: kommentar i sidhuvud!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "" +#~ "ERROR: Ingen enhets-URI hittades i argv[0] eller i miljövariabeln " +#~ "DEVICE_URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: Inga typsnitt i teckenkodningsfil %s\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: Inga sidor hittades!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: Slut på papper!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER-miljövariabeln är inte definierad!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: Utskriftsfilen accepterades inte (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: Skrivaren svarar inte\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: Skrivaren svarar inte\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: Skrivare skickade oväntat EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: Fjärrvärden accepterade inte styrfilen (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: Fjärrvärden accepterade inte datafilen (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "" +#~ "ERROR: Ett tidsgränsfel uppstod vid sändning av data till skrivare\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: Kunde inte lägga till filen %d i utskriften: %s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: Kunde inte avbryta utskriften %d: %s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: Kunde inte kopiera PDF-fil" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: Kunde inte skapa sockel" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: Kunde inte skapa en temporär komprimerad utskriftsfil: %s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: Kunde inte skapa temporär fil" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: Kunde inte skapa temporär fil - %s.\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: Kunde inte skapa temporär fil: %s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: Kunde inte utföra pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: Kunde inte exekvera gs-program" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: Kunde inte exekvera pdftops-program" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: Kunde inte grena process: %s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: Kunde inte hämta PAP-förfrågan" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: Kunde inte hämta PAP-svar" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: Ingen PPD-fil för skrivaren \"%s\" - %s.\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: Kunde inte hämta förvald AppleTalk-zon" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: Kunde inte hämta utskriftsattribut %d (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: Kunde inte hämta skrivarstatus (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: Kunde inte hitta skrivaren ”%s”!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: Kunde inte söka PAP-svar" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: Kunde inte söka AppleTalk-skrivare" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: Kunde inte göra AppleTalk-adress" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: Kunde inte öppna \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: Kunde inte öppna %s: %s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: Kunde inte öppna bannerfil \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: Kunde inte öppna enhetsfil \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: Kunde inte öppna fil \"%s\" - %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: Kunde inte öppna fil \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: Kunde inte öppna bildfilen för utskrift!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: Kunde inte öppna utskriftsfilen \"%s\": %s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: Kunde inte öppna utskriftsfilen %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: Kunde inte öppna utskriftsfilen %s: %s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: Kunde inte öppna temporär komprimerad utskriftsfil: %s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: Kunde inte öppna temporär fil" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: Kunde inte skriva ut %d textkolumner!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: Kunde inte skriva ut %dx%d textsida!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: Kunde inte läsa utskriftsdata" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: Kunde inte läsa utskriftsdata!" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: Kunde inte reservera porten" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: Kunde inte skapa offset %ld i fil - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: Kunde inte skapa offset %lld i fil - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: Kunde inte skicka LPD-kommando" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: Kunde inte skicka PAP-tickle-förfrågan" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: Kunde inte skicka första PAP-send-data-förfrågan" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: Kunde inte skicka utskriftsdata (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: Kunde inte skicka utskriftsdata!" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: Kunde inte skicka utskriftsfil till skrivare" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: Kunde inte skicka avslutande nullvärden till skrivare" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: Kunde inte vänta på pictwpstops: %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: Kunde inte skriva %d byte till \"%s\": %s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: Kunde inte skriva %d byte till skrivare!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: Kunde inte skriva styrfil" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: Kunde inte skriva utskriftsdata" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: Kunde inte skriva utskriftsdata: %s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: Kunde skriva rasterdata till skrivaren!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: Kunde inte skriva till temporär fil" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: Kunde inte skriva okomprimerade dokumentdata: %s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: Oväntad text på rad %d av %s!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: Okänt krypteringsalternativvärde \"%s\"!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: Okänd filordning \"%s\"\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: Okänt formattecken \"%c\"\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: Okänt meddelandekatalogformat för \"%s\"!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: Okänt alternativ \"%s\" med värde \"%s\"!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: Okänt utskriftsläge \"%s\"\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: Okänt versionsalternativvärde \"%s\"!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "" +#~ "ERROR: Värdet %s för ljusstyrka stöds inte, använder ljusstyrka=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: Värdet %s för gamma stöds inte, använder gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: Värdet %d för number-up stöds inte, använder number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: Värdet %s för number-up-layout stöds inte, använder number-up-" +#~ "layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "" +#~ "ERROR: Värdet %s för sidmarginal stöds inte, använder page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: doc_printf overflow (%d byte) upptäckt, stoppar!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops-filter kraschade på signal %d!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops-filter avslutades med status %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops avslutade med signalen %d!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops avslutades med status %d!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "" +#~ "ERROR: kan återställas: Kan inte ansluta till skrivaren, försöker igen om " +#~ "30 sekunder...\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() kunde inte utföras" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: kan inte få status för utskriftsfilen" + +#~ msgid "Empty PPD file!" +#~ msgstr "Tom PPD-fil!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "Fel: behöver värdnamn efter alternativet ”-h”!\n" + +#~ msgid "FAIL\n" +#~ msgstr "FEL\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "Filenhets URI:er har blivit avaktiverade! För att aktivera, se direktivet " +#~ "FileDevice i \"%s/cupsd.conf\"." + +#~ msgid "Fuser temperature high!" +#~ msgstr "Hög fixeringstemperatur!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "Låg fixeringstemperatur!" + +#~ msgid "German FanFold" +#~ msgstr "German FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "German FanFold Legal" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "Attribut för printer-uri finns, men inget utskrifts-ID!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk avaktiverat i Systeminställningar\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk avaktiverat i Systeminställningar.\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: Avbryter utskrift...\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: Ansluten till skrivare...\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: Ansluter till skrivare...\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: Styrfil har skickats\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: Datafil har skickats\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: Formaterar sidan %d...\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: Läser in bildfil...\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: Söker skrivare...\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: Öppnar anslutning\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: Utskriftsfil skickad, väntar på skrivaren...\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: Skrivaren är upptagen, försöker igen om 10 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: Skrivaren är upptagen, försöker igen om 30 sekunder...\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Skrivaren är upptagen, försöker igen om 5 sekunder...\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: Skrivaren stöder inte IPP/%d.%d, försöker med IPP/1.0...\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: Skrivaren är upptagen, försöker igen om 5 sekunder...\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: Skrivaren är frånkopplad just nu.\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: Skrivaren är frånkopplad just nu.\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: Skrivaren är online nu.\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: Skrivaren är frånkopplad.\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: Skrivaren är inte ansluten, försöker igen om 30 sekunder...\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: Skriver ut sidan %d, %d %% klart...\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: Skriver ut sidan %d...\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: Klar för utskrifter.\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: Skickar styrfil (%lu byte)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: Skickar styrfil (%u byte)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: Skickar data\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: Skickar datafil (%ld byte)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: Skickar datafil (%lld byte)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: Skickar utskriftsdata...\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: Skickar utskriftsfil, %ld byte...\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: Skickar utskriftsfil, %lld byte...\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: Buffrar LPR-utskrift, %.0f %% klart...\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "" +#~ "INFO: Kan inte kontakta skrivaren, köar för nästa skrivare i klassen...\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: Använder förvald AppleTalk-zon \"%s\"\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: Väntar på att utskrift ska bli klar...\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: Väntar på att skrivaren ska bli tillgänglig...\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "Kuvert ISO B4" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5 (större)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "Kuvert ISO B5" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "Kuvert ISO B6" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "Bläck/toner är nästan slut." + +#~ msgid "Ink/toner empty!" +#~ msgstr "Bläck/toner är slut!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "Avfallsbehållaren för bläck/toner nästan full." + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "Avfallsbehållaren för bläck/toner är full!" + +#~ msgid "Interlock open." +#~ msgstr "Spärrmekanism öppen." + +#~ msgid "Invite Envelope" +#~ msgstr "Invite-kuvert" + +#~ msgid "Italian Envelope" +#~ msgstr "Italienskt kuvert" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "Utskrift #%d kan inte startas om - inga filer!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "Utskrift #%d finns inte!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "Utskrift #%d är klar och kan inte ändras!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "Utskrift #%d är inte klar!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "Utskrift #%d hålls inte kvar för autentisering!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "Utskrift #%d hålls inte kvar" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "Utskrift #%s finns inte!" + +#~ msgid "Job %d not found!" +#~ msgstr "Utskrift %d hittades inte!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "Utskriftsprenumerationer kan inte förnyas!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2-kuvert" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3-kuvert" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "Språket \"%s\" stöds inte!" + +#~ msgid "Media jam!" +#~ msgstr "Medietrassel!" + +#~ msgid "Media tray almost empty." +#~ msgstr "Mediefack nästan tomt." + +#~ msgid "Media tray empty!" +#~ msgstr "Mediefack tomt!" + +#~ msgid "Media tray missing!" +#~ msgstr "Mediefack saknas!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "Mediefacket måste fyllas på." + +#~ msgid "Missing document-number attribute!" +#~ msgstr "Saknar attribut för dokumentnummer!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "Saknar dubbla citationstecken på rad %d!" + +#~ msgid "Missing form variable!" +#~ msgstr "Saknar formatvariabel!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "Saknar attributet notify-subscription-ids!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "Saknar attributet requesting-user-name!" + +#~ msgid "Missing required attributes!" +#~ msgstr "Saknar nödvändiga attribut!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "Saknar värde på rad %d!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "Modell: namn = %s\n" +#~ " natural_language = %s\n" +#~ " tillverkare-och-modell = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch-kuvert" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: Utskriftsfil accepterad - utskrifts-ID %d.\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: Utskriftsfil accepterad - utskrifts-ID okänt.\n" + +#~ msgid "No PPD name!" +#~ msgstr "Inget PPD-namn!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "Inga skrivardrivrutiner för Windows är installerade!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "Inga aktiva utskrifter på %s!" + +#~ msgid "No attributes in request!" +#~ msgstr "Inga attribut i begäran!" + +#~ msgid "No authentication information provided!" +#~ msgstr "Ingen autentiseringsinformation angiven!" + +#~ msgid "No default printer" +#~ msgstr "Ingen förvald skrivare" + +#~ msgid "No file!?!" +#~ msgstr "Ingen fil!?!" + +#~ msgid "No modification time!" +#~ msgstr "Ingen ändringstid!" + +#~ msgid "No printer name!" +#~ msgstr "Inget skrivarnamn!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "Ingen printer-uri hittades för klass!" + +#~ msgid "No printer-uri found!" +#~ msgstr "Inget printer-uri hittades!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "Inga printer-uri i begäran!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "Inga prenumerationsattribut i begäran!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC nästan vid slutpunkten." + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC vid slutpunkten!" + +#~ msgid "Out of toner!" +#~ msgstr "Slut på toner!" + +#~ msgid "Output bin almost full." +#~ msgstr "Utmatningsfack nästan fullt." + +#~ msgid "Output bin full!" +#~ msgstr "Utmatningsfack fullt!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "Utmatning för skrivaren %s skickas till %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "Utmatning för skrivaren %s skickas till fjärrskrivaren %s på %s\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "Utmatning för skrivaren %s/%s skickas till %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "" +#~ "Utmatning för skrivaren %s/%s skickas till fjärrskrivaren %s på %s\n" + +#~ msgid "Output tray missing!" +#~ msgstr "Utmatningsfack saknas!" + +#~ msgid "PASS\n" +#~ msgstr "OK\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "Kuvert PRC1" + +#~ msgid "PRC10 Envelope" +#~ msgstr "Kuvert PRC10" + +#~ msgid "PRC2 Envelope" +#~ msgstr "Kuvert PRC2" + +#~ msgid "PRC3 Envelope" +#~ msgstr "Kuvert PRC3" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K (större)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "Kuvert PRC4" + +#~ msgid "PRC5 Envelope" +#~ msgstr "Kuvert PRC5" + +#~ msgid "PRC6 Envelope" +#~ msgstr "Kuvert PRC6" + +#~ msgid "PRC7 Envelope" +#~ msgstr "Kuvert PRC7" + +#~ msgid "PRC8 Envelope" +#~ msgstr "Kuvert PRC8" + +#~ msgid "PRC9 Envelope" +#~ msgstr "Kuvert PRC9" + +#~ msgid "Personal Envelope" +#~ msgstr "Personligt kuvert" + +#~ msgid "Printer offline." +#~ msgstr "Skrivare frånkopplad." + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "" +#~ "Prioritet Ägare Utskrift Fil(er) Total " +#~ "storlek\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "Prioritet Ägare Utskrift Filer Total " +#~ "storlek\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "Kör kommando: %s %s -N -A %s -c ”%s”\n" + +#~ msgid "SCSI Printer" +#~ msgstr "Skrivare SCSI" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "Tabloid (större)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "Värdet för notify-user-data är för stort (%d > 63 oktetter)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "Skrivaren eller klassen är inte delad!" + +#~ msgid "The printer or class was not found." +#~ msgstr "Skrivaren eller klassen hittades inte." + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "Attributet printer-uri krävs!" + +#~ msgid "Toner low." +#~ msgstr "Toner låg." + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "För många värden för utskriftsark (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "För många värden för skrivarstatus (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "US Executive" + +#~ msgid "US Fanfold" +#~ msgstr "US Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "US Legal (större)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "US Letter (större)" + +#~ msgid "US Letter (Small)" +#~ msgstr "US Letter (mindre)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "Kunde inte lägga till utskrift för målet \"%s\"!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "Kunde inte tilldela minne för filtyper!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "Kunde inte kopiera filer för 64-bitars CUPS-skrivardrivrutin (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "" +#~ "Kunde inte kopiera filer för 64-bitars Windows-skrivardrivrutin (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "Kunde inte kopiera filer för CUPS-skrivardrivrutin (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "Kunde inte kopiera PPD-fil - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "Kunde inte kopiera PPD-fil!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Kunde inte kopiera filer för skrivardrivrutiner till 2000 Windows (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "Kunde inte kopiera filer för Windows 9x-skrivardrivrutin (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "Kunde inte kopiera gränssnittsskript - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "Kunde inte skapa printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "Kunde inte redigera cupsd.conf-filer större än 1 MB!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "Kunde inte hitta mål för utskrift!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "Kunde inte hitta skrivare!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "" +#~ "Kunde inte installera filer för skrivardrivrutiner till 2000 Windows (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "Kunde inte installera filer för Windows 9x-skrivardrivrutin (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "Kunde inte öppna dokument %d i utskrift %d!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "Kunde inte köra \"%s\": %s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "Kunde inte skicka kommando till skrivardrivrutin!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "Kunde inte ställa in Windows-skrivardrivrutin (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "Kunde inte använda tidigare USB-klassdrivrutin!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "Okänt skrivarfel (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "Ogiltig teckenuppsättning \"%s\"!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "Ogiltig komprimering \"%s\"!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "Ogiltigt komprimeringsattribut %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "Formatet \"%s\" stöds inte!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr " Formatet ”%s” stöds inte!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "Formatet ”%s/%s” stöds inte!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Användning:\n" +#~ "\n" +#~ " lpadmin [-h server] -d mål\n" +#~ " lpadmin [-h server] -x mål\n" +#~ " lpadmin [-h server] -p skrivare [-c lägg-till-klass] [-i gränssnitt] " +#~ "[-m modell]\n" +#~ " [-r radera-klass] [-v enhet] [-D beskrivning]\n" +#~ " [-P ppd-fil] [-o name=value]\n" +#~ " [-u tillåt:användare,användare] [-u neka:användare," +#~ "användare]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Användning: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Användning: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Användning: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Användning: konvertera [ alternativ ]\n" +#~ "\n" +#~ "Alternativ:\n" +#~ "\n" +#~ " -f filnamn Ange fil att konvertera (annars standard in)\n" +#~ " -o filnamn Ange fil att generera (annars standard ut)\n" +#~ " -i MIME/typ Ange MIME-typ för indata (annars automatiskt)\n" +#~ " -j MIME/typ Ange MIME-typ för utdata (annars program/pdf)\n" +#~ " -P filnamn.ppd Ange PPD-fil\n" +#~ " -a ”name=value ...” Ange alternativ\n" +#~ " -U användarnamn Ange användarnamn för utskrift\n" +#~ " -J titel Ange titel\n" +#~ " -c kopior Ange antal kopior\n" +#~ " -u Radera PPD-filen när det är klart\n" +#~ " -D Radera indatafilen när det är klart\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Användning: cupsaddsmb [alternativ] printer1 ... printerN\n" +#~ " cupsaddsmb [alternativ] -a\n" +#~ "\n" +#~ "Alternativ:\n" +#~ " -E Kryptera anslutningen till servernr\n" +#~ " -H samba-server Använd den som heter SAMBA server\n" +#~ " -U samba-användare Autentisera med den som heter SAMBA användare \n" +#~ " -a Exportera alla skrivare\n" +#~ " -h cups-server Använd den som heter CUPS server\n" +#~ " -v Visa utförligt (visa kommandon)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Användning: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Alternativ:\n" +#~ "\n" +#~ " -E Aktivera kryptering\n" +#~ " -U username Ange användarnamn\n" +#~ " -h server[:port] Ange serveradress\n" +#~ "\n" +#~ " --[no-]debug-logging Slå av/på loggning vid felsökning\n" +#~ " --[no-]remote-admin Slå av/på fjärradministrering\n" +#~ " --[no-]remote-any Tillåt/förhindra åtkomst från Internet\n" +#~ " --[no-]remote-printers Visa/göm fjärrskrivare\n" +#~ " --[no-]share-printers Slå av/på skrivardelning\n" +#~ " --[no-]user-cancel-any Tillåt/förhindra att användare kan avbryta " +#~ "utskrifter\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Användning: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Läs upp alternativ konfigurationsfil\n" +#~ "-f Kör i förgrunden\n" +#~ "-F Kör i förgrunden men koppla bort\n" +#~ "-h Visa det här användningsmeddelandet\n" +#~ "-l Kör cupsd från launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Användning: cupsfilter -m MIME/typ [ alternativ ] filnamn\n" +#~ "\n" +#~ "Alternativ:\n" +#~ "\n" +#~ " -c cupsd.conf Ange cupsd.conf-fil för användning\n" +#~ " -j utskrifts-ID[,N] Filtrera fil N från angiven utskrift (fil 1 är " +#~ "förvald)\n" +#~ " -n kopior Ange antal kopior\n" +#~ " -o name=value Ange alternativ)\n" +#~ " -p filnamn.ppd Ange PPD-fil\n" +#~ " -t titel Ange titel\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Användning: cupstestdsc [alternativ] filnamn.ps [... filnamn.ps]\n" +#~ " cupstestdsc [alternativ] -\n" +#~ "\n" +#~ "Alternativ:\n" +#~ "\n" +#~ " -h Visa programanvändning\n" +#~ "\n" +#~ " Obs: det här programmet verifierar DSC-kommentarer, men inte " +#~ "PostScript.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Användning: cupstestppd [alternativ] filnamn1.ppd[.gz] [... filnamnN.ppd[." +#~ "gz]]\n" +#~ " program | cupstestppd [alternativ] -\n" +#~ "\n" +#~ "Alternativ:\n" +#~ "\n" +#~ " -R root-directory Ange alternativ rot\n" +#~ " -W {alla,ingen,regler,standard,duplex,filter,översättningar}\n" +#~ " Skicka varningar istället för fel\n" +#~ " -q Kör ljudlöst\n" +#~ " -r Använd öppet läge\n" +#~ " -v Visa mindre utförligt\n" +#~ " -vv Visa mycket utförligt\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Användning: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Användning: lpoptions [-h server] [-E] -d skrivare\n" +#~ " lpoptions [-h server] [-E] [-p skrivare] -l\n" +#~ " lpoptions [-h server] [-E] -p skrivare -o alternativ[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x skrivare\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Användning: lppasswd [-g gruppnamn]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Användning: lppasswd [-g gruppnamn] [användarnamn]\n" +#~ " lppasswd [-g gruppnamn] -a [användarnamn]\n" +#~ " lppasswd [-g gruppnamn] -x [användarnamn]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Användning: lpq [-P dest] [-U användarnamn] [-h värdnamn[:port]] [-l] " +#~ "[+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Användning: ppdc [alternativ] filnamn.drv [ ... filnamnN.drv ]\n" +#~ "Alternativ:\n" +#~ " -D name=value Ange namngiven variabel till värde.\n" +#~ " -I include-dir Lägg till inkluderingsfiler till sökväg.\n" +#~ " -c catalog.po Läs upp angiven meddelandekatalog.\n" +#~ " -d output-dir Ange utdatakatalog.\n" +#~ " -l lang[,lang,...] Ange språk för utdata (språkversion).\n" +#~ " -m Använd värdet för modellnamn som filnamn.\n" +#~ " -t Testa PPD-filer istället för att skapa fler.\n" +#~ " -v Visa utförligt (ju fler v:n desto mer " +#~ "detaljerat).\n" +#~ " -z Komprimera PPD-filer med GNU zip.\n" +#~ " --cr Avsluta rader med CR (Mac OS 9).\n" +#~ " --crlf Avsluta rader med CR + LF (Windows).\n" +#~ " --lf Avsluta rader med LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Användning: ppdhtml [alternativ] filnamn.drv >filnamn.html\n" +#~ " -D name=value Ange namngiven variabel till värde.\n" +#~ "Alternativ:\n" +#~ " -I include-dir Lägg till inkluderingsfiler till sökväg.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Användning: ppdi [alternativ] filnamn.ppd [ ... filnamnN.ppd ]\n" +#~ "Alternativ:\n" +#~ " -I include-dir\n" +#~ " -o filnamn.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Användning: ppdmerge [alternativ] filnamn.ppd [ ... filnamnN.ppd ]\n" +#~ "Alternativ:\n" +#~ " -o filnamn.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Användning: ppdpo [alternativ] -o filnamn.po filnamn.drv [ ... filnamnN." +#~ "drv ]\n" +#~ "Alternativ:\n" +#~ " -D name=value Ange namngiven variabel till värde.\n" +#~ " -I include-dir Lägg till inkluderingsfiler till sökväg.\n" +#~ " -v Visa utförligt (ju fler v:n desto mer detaljerat).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Användning: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: Lägger endast till de första %d som hittas" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boolesk förväntat för alternativet waiteof \"%s\"\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: Kunde inte läsa sidkanalsbegäran!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "" +#~ "WARNING: Alternativet \"%s\" kan inte inkluderas via IncludeFeature!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: Skrivaren svarar inte\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: Skrivare skickade oväntat EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Fjärrvärden svarade inte med kommandostatusbyte efter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Fjärrvärden svarade inte med kontrollstatusbyte efter %d " +#~ "sekunder!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "" +#~ "WARNING: Fjärrvärden svarade inte med datastatusbyte efter %d sekunder!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "" +#~ "WARNING: SCSI-kommando nådde en maxtidsgräns (%d), försöker igen...\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: Det här dokumentet följer inte Adobes dokumentspecifikationer " +#~ "och kanske inte skrivs ut på rätt sätt!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: Kunde inte öppna \"%s:%s\": %s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: Kunde inte skicka begäran för PAP-status" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: Oväntat PAP-paket av typen %d\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: Okänt PAP-paket av typen %d\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: Okänt val \"%s\" för alternativet \"%s\"!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: Okänt alternativ \"%s\"!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: Formatet %s stöds inte!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: siffra förväntad för statusalternativ \"%s\"\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "" +#~ "WARNING: kan återställas: Nätverksvärden ”%s” är upptagen, försöker igen " +#~ "om %d sekunder...\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "Varning, inga skrivardrivrutiner för Windows 2000 är installerade!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4-kuvert" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "" +#~ "konvertera: Använd alternativet -f till att ange den fil som ska " +#~ "konverteras.\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb: Ingen PPD-fil för skrivaren \"%s\" - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl: Kunde inte ansluta till server: %s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl: Okänt alternativ \"%s\"!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl: Okänt alternativ \"-%c\"!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd: Förväntat konfigurationsfilnamn efter alternativet \"-c\"!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd: Kunde inte hämta aktuell katalog!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd: Okänt argument \"%s\" - stoppar!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd: Okänt alternativ \"%c\" - stoppar!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "cupsd: Stöd för launchd(8) inte inbyggt, kör i normalt läge.\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter: Ogiltigt dokumentnummer %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter: Ogiltigt utskrifts-ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter: Bara ett filnamn kan anges!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter: Kunde inte skapa temporär fil: %s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter: Kunde inte hämta utskriftsfil - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "" +#~ "cupstestppd: Alternativet -q är inte kompatibelt med alternativet -v.\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "" +#~ "cupstestppd: Alternativet -v är inte kompatibelt med alternativet -q.\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "enhet för %s/%s: %s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "enhet för %s: %s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "help\t\tfå hjälp om kommandon\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "Attributet job-printer-uri saknas!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: Klassnamn kan endast innehålla skrivbara tecken!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: Förväntat PPD efter alternativet ”-P”!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: Förväntad allow/deny:userlist efter alternativet ”-u”!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: Förväntad klass efter alternativet ”-r”!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: Förväntat klassnamn efter alternativet ”-c”!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: Förväntad beskrivning efter alternativet ”-D”!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: Förväntad enhets-URI efter alternativet ”-v”!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: Förväntade filtyp(er) efter alternativet ”-I”!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: Förväntat värdnamn efter alternativet ”-h”!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: Förväntat gränssnitt efter alternativet ”-i”!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: Förväntad plats efter alternativet ”-L”!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: Förväntad modell efter alternativet ”-m”!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: Förväntad name=value efter alternativet ”-o”!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: Förväntad skrivare efter alternativet ”-p”!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: Förväntat skrivarnamn efter alternativet ”-d”!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: Förväntad skrivare eller klass efter alternativet ”-x”!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: Inga medlemsnamn sågs!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: Skrivaren %s är redan medlem av klassen %s.\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: Skrivaren %s är inte en medlem av klassen %s.\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: Skrivarnamn kan endast innehålla skrivbara tecken!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte lägga till en skrivare till klassen:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: Kunde inte ansluta till server: %s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: Kunde inte skapa tempfil - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: Kunde inte skapa tempfil: %s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: Kunde inte öppna PPD-fil \"%s\" - %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: Kunde inte öppna filen \"%s\": %s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ta bort en skrivare från klassen:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in PPD-filen:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in enhets-URI:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in gränssnittsskriptet eller PPD-fil:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in gränssnittsskriptet:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in skrivarbeskrivningen:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in skrivarens plats:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: Kunde inte ställa in skrivaralternativen:\n" +#~ " Du måste ange ett skrivarnamn först!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: : Okänt tillåta/neka-alternativ \"%s\"!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: Okänt argument ”%s”!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: Okänt alternativ ”%c”!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: Varning - innehållstyplista ignorerades!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo: Förväntad 1284 device ID string efter--device-id!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo: Förväntat språk efter --language!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo: Förväntad tillverkning och modell efter --make-and-model!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo: Förväntad produktsträng efter --product!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo: Förväntad schemalista efter --exclude-schemes!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo: Förväntad schemalista efter --include-schemes!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo: Förväntat tidsgränsfel efter --timeout!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo: Okänt argument ”%s”!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo: Okänt alternativ ”%c”!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo: Okänt alternativ ”%s”!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove: Kunde inte ansluta till server: %s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove: Okänt argument ”%s”!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove: Okänt alternativ ”%c”!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions: Inga skrivare!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions: Kunde inte lägga till skrivare eller instans: %s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions: Kunde inte hämta PPD-fil för %s: %s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions: Kunde inte öppna PPD-fil för %s!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions: Okänd skrivare eller klass!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: Endast rot kan lägga till eller ta bort lösenord!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: Lösenordsfil upptagen!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: Lösenordsfil inte uppdaterad!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: Tyvärr, lösenord stämmer inte!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: Tyvärr, lösenord stämmer inte.\n" +#~ "Lösenordet måste vara minst 6 tecken långt, får inte innehålla\n" +#~ "ditt användarnamn, och måste innehålla åtminstone en bokstav och siffra.\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: Tyvärr, lösenorden stämmer inte överens!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: Kunde inte kopiera lösenordssträng: %s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: Kunde inte öppna lösenordsfil: %s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: Kunde inte skriva till lösenordsfil: %s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "" +#~ "lppasswd: misslyckades med att säkerhetskopiera gamla lösenordsfilen: %s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: misslyckades med att byta namn på lösenordsfilen: %s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: användare \"%s\" och grupp \"%s\" finns inte.\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "" +#~ "lpstat: fel - miljövariabeln %s namnger icke-existerande mål \"%s\"!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "medlemmar av klassen %s:\n" + +#~ msgid "no entries\n" +#~ msgstr "inga objekt\n" + +#~ msgid "no system default destination\n" +#~ msgstr "inget systemstandardmål\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events inte angivet!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "URI för notify-recipient-uri \"%s\" används redan!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "URI för notify-recipient-uri \"%s\" använder okänt schema!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d inte bra!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc: Lägger till inkluderingskatalog \"%s\"...\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc: Lägger till/uppdaterar UI-text från %s...\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Felaktigt booleskt värde (%s) på rad %d av %s.\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Felaktigt upplösningsnamn \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc: Felaktigt statuslösenord %s på rad %d av %s!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc: Felaktig variabelersättning ($%c) på rad %d av %s.\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc: Val hittades på rad %d of %s utan alternativ!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc: Dublicera #po för språk %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad filterdefinition på rad %d av %s!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat programnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc: Förväntat booleskt värde på rad %d av %s.\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad teckenkodning efter typsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc: Förväntad valkod på rad %d av %s.\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc: Förväntad namn-/textkod på rad %d av %s.\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad färgordning för ColorModel på rad %d av %s!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad färgrymd för ColorModel på rad %d av %s!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad komprimering för ColorModel på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad regelsträng för UIConstraints på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Förväntat lösenord för drivrutinstyp efter DriverType på rad %d av %" +#~ "s!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad duplextyp efter Duplex på rad %d av %s!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad kodning efter typsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat filnamn efter #po %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat gruppnamn/-text på rad %d av %s.\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat inkluderingsfilnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat heltal på rad %d av %s!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad språkversion #po på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter filnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter typsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter tillverkare på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter mediestorlek på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter modellnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn efter PC-filnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn/text efter %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn/text efter installerbart på rad %d av %s!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat namn/text efter upplösning på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Förväntat namn-/textkombination för ColorModel på rad %d av %s!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat alternativnamn/-text på rad %d av %s.\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat alternativavsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad alternativtyp på rad %d av %s!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat ersättningsfält efter upplösning på rad %d av %s!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat reellt tal på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Förväntad upplösning/medietyp efter ColorProfile på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc: Förväntad upplösning/medietyp efter SimpleColorProfile på rad %d av " +#~ "%s!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad väljare efter %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad status efter typsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad sträng efter upphovsrätt på rad %d av %s!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad sträng efter version på rad %d av %s!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc: Förväntade två alternativnamn på rad %d av %s!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc: Förväntat värde efter %s på rad %d av %s!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc: Förväntad version efter typsnitt på rad %d av %s!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc: Ogiltigt #include/#po filnamn \"%s\"!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ogiltig kostnad för filter på rad %d av %s!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ogiltig tom MIME-typ för filter på rad %d av %s!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "ppdc: Ogiltigt tomt programnamn för filter på rad %d av %s!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ogiltigt alternativavsnitt \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Ogiltig alternativtyp \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc: Läser in fil med drivrutinsinformation \"%s\"...\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc: Läser in meddelanden för språk \"%s\"...\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc: Läser in meddelanden från \"%s\"...\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc: Saknad #endif i slutet av \"%s\"!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc: Saknad #if på rad %d av %s!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc: Ingen meddelandekatalog angiven för språkversionen %s!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "" +#~ "ppdc: Alternativ %s definieras om med en annan typ på rad %d av %s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc: Alternativregel måste *name på rad %d av %s!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc: För många nästlade #if”s på rad %d av %s!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc: Kunde inte skapa PPD-fil \"%s\" - %s.\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc: Kunde inte skapa utdatakatalog %s: %s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc: Kunde inte skapa utdatarör: %s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc: Kunde inte köra cupstestppd: %s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc: Kunde inte hitta #po fil %s på rad %d av %s!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Kunde inte hitta inkluderingsfil \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc: Kunde inte hitta lokalisering för \"%s\" - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc: Kunde inte läsa in lokaliseringsfil för \"%s\" - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc: Odefinierad variabel (%s) på rad %d av %s.\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc: Okänd drivrutinstyp %s på rad %d av %s!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Okänd duplextyp \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc: Okänd mediestorlek \"%s\" på rad %d of %s!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc: Okänd symbol \"%s\" sågs på rad %d av %s!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc: Okända avslutande tecken i reellt tal \"%s\" på rad %d av %s!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc: Oavslutad sträng börjar med %c på rad %d av %s!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc: Skriver %s...\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc: Skriver PPD-filer till katalogen \"%s\"...\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge: Felaktig LanguageVersion \"%s\" i %s!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge: Ignorerar PPD-fil %s...\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge: Kan inte säkerhetskopiera %s till %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "skrivare %s avaktiverad sedan %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "skrivare %s är overksam. aktiverad sedan %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "skrivare %s skriver ut %s-%d. avaktiverad sedan %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "skrivare %s/%s avaktiverad sedan %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "skrivare %s/%s är overksam. aktiverad sedan %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "skrivare %s/%s skriver ut %s-%d. aktiverad sedan %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "ID för begäran är %s-%d (%d fil(er))\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "schemaläggare körs inte\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "schemaläggare körs\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "status\t\tvisa status för demon och kö\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "systemstandardmål: %s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "systemstandardmål: %s/%s\n" diff --git a/locale/cups_zh.po b/locale/cups_zh.po new file mode 100644 index 0000000..4ba6b5a --- /dev/null +++ b/locale/cups_zh.po @@ -0,0 +1,8592 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f 亳米" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f 至 %.0f x %.0f 亳米" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f 英寸" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f 至 %.2f x %.2f 英寸" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "%s 不能更改。" + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 英寸/秒" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25 英寸" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25 英寸" + +msgid "1.5 inch/sec." +msgstr "1.5 英寸/秒" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25 英寸" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50 英寸" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00 英寸" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00 英寸" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 英寸/秒" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 毫米/秒" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 英寸/秒" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 英寸/秒" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 毫米/秒" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 毫米/秒" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 毫米/秒" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 英寸/秒" + +msgid "2-Sided Printing" +msgstr "双面打印" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37 英寸" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50 英寸" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00 英寸" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25 英寸" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00 英寸" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00 英寸" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00 英寸" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50 英寸" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50 英寸" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25 英寸" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00 英寸" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50 英寸" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50 英寸" + +msgid "2.5 inches/sec." +msgstr "2.5 英寸/秒" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00 英寸" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00 英寸" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25 英寸" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1 英寸" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 毫米/秒" + +msgid "200 mm/sec." +msgstr "200 毫米/秒" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24 针系列" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 毫米/秒" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 英寸/秒" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00 英寸" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25 英寸" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00 英寸" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00 英寸" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00 英寸" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00 英寸" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00 英寸" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50 英寸" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83 英寸" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83 英寸" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5 英寸磁盘" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3.5 英寸磁盘 - 2 1/8 x 2 3/4 英寸" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00 英寸" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 毫米/秒" + +msgid "300 mm/sec." +msgstr "300 毫米/秒" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 英寸/秒" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00 英寸" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00 英寸" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00 英寸" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50 英寸" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00 英寸" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00 英寸" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00 英寸" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00 英寸" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50 英寸" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 毫米/秒" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 英寸/秒" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 英寸/秒" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00 英寸" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00 英寸" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00 英寸" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00 英寸" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00 英寸" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00 英寸" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50 英寸" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 毫米/秒" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 英寸/秒" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 英寸/秒" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00 英寸" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00 英寸" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00 英寸" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00 英寸" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00 英寸" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00 英寸" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50 英寸" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 毫米/秒" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 英寸/秒" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9 针系列" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "接受作业" + +msgid "Accepted" +msgstr "已接受" + +msgid "Add Class" +msgstr "添加类" + +msgid "Add Printer" +msgstr "添加打印机" + +msgid "Add RSS Subscription" +msgstr "添加 RSS 订阅" + +msgid "Address" +msgstr "地址" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "地址 - 1 1/8 x 3 1/2 英寸" + +msgid "Administration" +msgstr "管理" + +msgid "Always" +msgstr "始终" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "涂敷器" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "错误的 NULL dests 指针" + +msgid "Bad OpenGroup" +msgstr "错误的 OpenGroup" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "错误的 OpenUI/JCLOpenUI" + +msgid "Bad OrderDependency" +msgstr "错误的 OrderDependency" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "错误的请求" + +msgid "Bad SNMP version number" +msgstr "错误的 SNMP 版本号" + +msgid "Bad UIConstraints" +msgstr "错误的 UIConstraints" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "错误的份数值 %d。" + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "错误的自定参数" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "错误的 number-up 值 %d。" + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "错误的 page-ranges 值 %d-%d。" + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "标题" + +msgid "Billing Information: " +msgstr "帐单信息:" + +msgid "Bond Paper" +msgstr "半透明纸" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL 标签打印机" + +msgid "Cancel RSS Subscription" +msgstr "取消 RSS 订阅" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "更改设置" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "类" + +msgid "Clean Print Heads" +msgstr "清洁打印头" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "彩色" + +msgid "Color Mode" +msgstr "彩色模式" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "团体名称使用不定长度" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "继续" + +msgid "Continuous" +msgstr "连续" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "创建" + +msgid "Created On: " +msgstr "创建于:" + +msgid "Custom" +msgstr "自定" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "切纸" + +msgid "Cutter" +msgstr "切纸器" + +msgid "Dark" +msgstr "暗" + +msgid "Darkness" +msgstr "暗" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "删除类" + +msgid "Delete Printer" +msgstr "删除打印机" + +msgid "Description: " +msgstr "描述:" + +msgid "DeskJet Series" +msgstr "DeskJet 系列" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "目的位置“%s”没有接受作业。" + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "热敏介质" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "停用" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "驱动程序名称:" + +msgid "Driver Version: " +msgstr "驱动程序版本:" + +msgid "Duplexer" +msgstr "双面打印器" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 标签打印机" + +msgid "EPL2 Label Printer" +msgstr "EPL2 标签打印机" + +msgid "Edit Configuration File" +msgstr "编辑配置文件" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "结束标题" + +msgid "English" +msgstr "Chinese" + +msgid "Enter old password:" +msgstr "输入旧密码:" + +msgid "Enter password again:" +msgstr "再次输入密码:" + +msgid "Enter password:" +msgstr "输入密码:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"请输入您的用户名称和密码或者 root 用户的用户名称和密码来访问此页面。如果您正" +"在使用 Kerberos 鉴定,请确定您拥有的 Kerberos 票据是有效的。" + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "信封送纸" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "错误策略" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "每 10 个标签" + +msgid "Every 2 Labels" +msgstr "每 2 个标签" + +msgid "Every 3 Labels" +msgstr "每 3 个标签" + +msgid "Every 4 Labels" +msgstr "每 4 个标签" + +msgid "Every 5 Labels" +msgstr "每 5 个标签" + +msgid "Every 6 Labels" +msgstr "每 6 个标签" + +msgid "Every 7 Labels" +msgstr "每 7 个标签" + +msgid "Every 8 Labels" +msgstr "每 8 个标签" + +msgid "Every 9 Labels" +msgstr "每 9 个标签" + +msgid "Every Label" +msgstr "每个标签" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "预期失败" + +msgid "Export Printers to Samba" +msgstr "将打印机导出为 Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "文件夹" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "文件夹 - 9/16 x 3 7/16 英寸" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "对开本" + +msgid "Forbidden" +msgstr "禁止" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "通用" + +msgid "Generic" +msgstr "通用" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU 使用不定长度" + +msgid "Glossy Paper" +msgstr "光面纸" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "灰度" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "吊夹" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "吊夹 - 9/16 x 2 英寸" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "非法控制字符" + +msgid "Illegal main keyword string" +msgstr "非法主关键词字符串" + +msgid "Illegal option keyword string" +msgstr "非法选项关键词字符串" + +msgid "Illegal translation string" +msgstr "非法转换字符串" + +msgid "Illegal whitespace character" +msgstr "非法空白字符" + +msgid "Installable Options" +msgstr "可安装的选项" + +msgid "Installed" +msgstr "已安装" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar 标签打印机" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "内部错误" + +msgid "Internet Postage 2-Part" +msgstr "Internet 邮寄 2 部分" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet 邮寄 2 部分 - 2 1/4 x 7 1/2 英寸" + +msgid "Internet Postage 3-Part" +msgstr "Internet 邮寄 3 部分" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet 邮寄 3 部分 - 2 1/4 x 7 英寸" + +msgid "Internet Printing Protocol" +msgstr "Internet 打印协议" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "作业 #%d 已经中止 - 不能取消。" + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "作业 #%d 已经取消 - 不能取消。" + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "作业 #%d 已经完成 - 不能取消。" + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "作业已完成" + +msgid "Job Created" +msgstr "作业已创建" + +msgid "Job ID: " +msgstr "作业 ID:" + +msgid "Job Options Changed" +msgstr "作业选项已更改" + +msgid "Job Stopped" +msgstr "作业已停止" + +msgid "Job UUID: " +msgstr "作业 UUID:" + +msgid "Job is completed and cannot be changed." +msgstr "作业已完成,不能更改。" + +msgid "Job operation failed:" +msgstr "作业操作失败:" + +msgid "Job state cannot be changed." +msgstr "作业状态不能更改。" + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "作业" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR 主机或打印机" + +msgid "Label Printer" +msgstr "标签打印机" + +msgid "Label Top" +msgstr "标签顶部" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "长地址" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "长地址 - 1 4/10 x 3 1/2 英寸" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet 系列 PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "指示灯" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "行多于所允许的最大字符数(255 个字符)" + +msgid "List Available Printers" +msgstr "列出可用的打印机" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "位置:" + +msgid "Long-Edge (Portrait)" +msgstr "长边(纵向)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "制造和型号:" + +msgid "Manual Feed" +msgstr "手动送纸" + +msgid "Media Dimensions: " +msgstr "介质尺寸:" + +msgid "Media Limits: " +msgstr "介质限制:" + +msgid "Media Name: " +msgstr "介质名称:" + +msgid "Media Size" +msgstr "介质大小" + +msgid "Media Source" +msgstr "介质来源" + +msgid "Media Tracking" +msgstr "介质跟踪" + +msgid "Media Type" +msgstr "介质类型" + +msgid "Medium" +msgstr "中等" + +msgid "Memory allocation error" +msgstr "内存分配错误" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "缺少 PPD-Adobe-4.x 标头" + +msgid "Missing asterisk in column 1" +msgstr "栏 1 缺少星号" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "缺少值字符串" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "修改类" + +msgid "Modify Printer" +msgstr "修改打印机" + +msgid "Move All Jobs" +msgstr "移动所有作业" + +msgid "Move Job" +msgstr "移动作业" + +msgid "Moved Permanently" +msgstr "永久移动" + +msgid "NULL PPD file pointer" +msgstr "空 PPD 文件指针" + +msgid "Name OID uses indefinite length" +msgstr "名称 OID 使用不定长度" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "永不" + +msgid "New Stylus Color Series" +msgstr "新 Stylus Color 系列" + +msgid "New Stylus Photo Series" +msgstr "新 Stylus Photo 系列" + +msgid "No" +msgstr "否" + +msgid "No Content" +msgstr "无内容" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "无 VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "无活跃连接" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "无团体名称" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "未添加目的位置。" + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "无错误索引" + +msgid "No error-status" +msgstr "无错误状态" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "无名称 OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "无 request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "找不到订阅。" + +msgid "No variable-bindings SEQUENCE" +msgstr "无 variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "无版本号" + +msgid "Non-continuous (Mark sensing)" +msgstr "非连续(标记感应)" + +msgid "Non-continuous (Web sensing)" +msgstr "非连续(Web 感应)" + +msgid "Normal" +msgstr "正常" + +msgid "Not Found" +msgstr "找不到" + +msgid "Not Implemented" +msgstr "未完成" + +msgid "Not Installed" +msgstr "未安装" + +msgid "Not Modified" +msgstr "未修改" + +msgid "Not Supported" +msgstr "不支持" + +msgid "Not allowed to print." +msgstr "不允许打印。" + +msgid "Note" +msgstr "注释" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "好" + +msgid "Off (1-Sided)" +msgstr "关闭(单面)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "网上帮助" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "打开 %s 失败:%s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup 没有 CloseGroup 优先" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI 没有 CloseUI/JCLCloseUI 优先" + +msgid "Operation Policy" +msgstr "操作策略" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "选项已安装" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "Options: " + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "输出模式" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL 激光打印机" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "包不包含 Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "包不以 SEQUENCE 开始" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "%s(在 %s 上)的密码?" + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "需要 %s 的密码才能通过 SAMBA 访问 %s:" + +msgid "Pause Class" +msgstr "暂停类" + +msgid "Pause Printer" +msgstr "打印机暂停打印" + +msgid "Peel-Off" +msgstr "剥离" + +msgid "Photo" +msgstr "照片" + +msgid "Photo Labels" +msgstr "照片标签" + +msgid "Plain Paper" +msgstr "普通纸张" + +msgid "Policies" +msgstr "策略" + +msgid "Port Monitor" +msgstr "端口监视器" + +msgid "PostScript Printer" +msgstr "PostScript 打印机" + +msgid "Postcard" +msgstr "明信片" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "打印密度" + +msgid "Print Job:" +msgstr "打印作业:" + +msgid "Print Mode" +msgstr "打印模式" + +msgid "Print Rate" +msgstr "打印速率" + +msgid "Print Self-Test Page" +msgstr "打印自测试页面" + +msgid "Print Speed" +msgstr "打印速度" + +msgid "Print Test Page" +msgstr "打印测试页" + +msgid "Print and Cut" +msgstr "打印和切纸" + +msgid "Print and Tear" +msgstr "打印和撕纸" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "打印人:" + +msgid "Printed From: " +msgstr "打印自:" + +msgid "Printed On: " +msgstr "打印于:" + +msgid "Printer Added" +msgstr "打印机已添加" + +msgid "Printer Default" +msgstr "打印机默认" + +msgid "Printer Deleted" +msgstr "打印机已删除" + +msgid "Printer Modified" +msgstr "打印机已修改" + +msgid "Printer Name: " +msgstr "打印机名称:" + +msgid "Printer Paused" +msgstr "打印机已暂停" + +msgid "Printer Settings" +msgstr "打印机设置" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "打印机:" + +msgid "Printers" +msgstr "打印机" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "消除作业" + +msgid "Quarto" +msgstr "四开" + +msgid "Quota limit reached." +msgstr "已达到配额限制。" + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "拒绝作业" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "出错后重新打印" + +msgid "Request Entity Too Large" +msgstr "请求实体太大" + +msgid "Resolution" +msgstr "分辨率" + +msgid "Resume Class" +msgstr "继续类" + +msgid "Resume Printer" +msgstr "打印机继续打印" + +msgid "Return Address" +msgstr "寄信人地址" + +msgid "Return Address - 3/4 x 2\"" +msgstr "寄信人地址 - 3/4 x 2 英寸" + +msgid "Rewind" +msgstr "倒回" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE 使用不定长度" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "请参阅其他" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "串口 #%d" + +msgid "Server Restarted" +msgstr "服务器已重新启动" + +msgid "Server Security Auditing" +msgstr "服务器安全性审核" + +msgid "Server Started" +msgstr "服务器已启动" + +msgid "Server Stopped" +msgstr "服务器已停止" + +msgid "Service Unavailable" +msgstr "服务不可用" + +msgid "Set Allowed Users" +msgstr "设定允许的用户" + +msgid "Set As Server Default" +msgstr "设定为服务器默认" + +msgid "Set Class Options" +msgstr "设定类选项" + +msgid "Set Printer Options" +msgstr "设定打印机选项" + +msgid "Set Publishing" +msgstr "设定出版" + +msgid "Shipping Address" +msgstr "送货地址" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "送货地址 - 2 5/16 x 4 英寸" + +msgid "Short-Edge (Landscape)" +msgstr "短边(横向)" + +msgid "Special Paper" +msgstr "专用纸张" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "标准" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "启动标题" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "报表" + +msgid "Stylus Color Series" +msgstr "Stylus Color 系列" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo 系列" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "交换协议" + +msgid "Tabloid" +msgstr "小报用纸" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "撕纸" + +msgid "Tear-Off" +msgstr "撕纸" + +msgid "Tear-Off Adjust Position" +msgstr "撕纸调整位置" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "PPD 文件“%s”未能找到。" + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "PPD 文件“%s”未能打开。%s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"类名称可能最多包含 127 个可打印的字符,且不能包含空格、斜线 (/) 或磅符号 " +"(#)。" + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "notify-lease-duration 属性不能配合作业订阅使用。" + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"打印机名称可能最多包含 127 个可打印的字符,且不能包含空格、斜线 (/) 或磅符号 " +"(#)。" + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri“%s”含有无效字符。" + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "printer-uri 必须是“ipp://HOSTNAME/classes/CLASSNAME”形式。" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "printer-uri 必须是“ipp://HOSTNAME/classes/PRINTERNAME”形式。" + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "订阅名称可能不包含空格、斜线 (/)、问号 (?) 或磅符号 (#)。" + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "有太多订阅。" + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "热转印介质" + +msgid "Title: " +msgstr "标题:" + +msgid "Too many active jobs." +msgstr "太多活跃的作业。" + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "透明度" + +msgid "Tray" +msgstr "纸盒" + +msgid "Tray 1" +msgstr "纸盒 1" + +msgid "Tray 2" +msgstr "纸盒 2" + +msgid "Tray 3" +msgstr "纸盒 3" + +msgid "Tray 4" +msgstr "纸盒 4" + +msgid "URI Too Long" +msgstr "URI 太长" + +msgid "US Ledger" +msgstr "美国总帐用纸" + +msgid "US Legal" +msgstr "美国法定用纸" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "美国信纸" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB 串口 #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "无法访问 cupsd.conf 文件:" + +msgid "Unable to add RSS subscription:" +msgstr "无法添加 RSS 订阅:" + +msgid "Unable to add class:" +msgstr "无法添加类:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "无法添加打印机:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "无法取消 RSS 订阅:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "无法更改 printer-is-shared 属性:" + +msgid "Unable to change printer:" +msgstr "无法更改打印机:" + +msgid "Unable to change server settings:" +msgstr "无法更改服务器设置:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "无法连接到主机。" + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "无法创建临时文件:" + +msgid "Unable to delete class:" +msgstr "无法删除类:" + +msgid "Unable to delete printer:" +msgstr "无法删除打印机:" + +msgid "Unable to do maintenance command:" +msgstr "无法执行维护命令:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "无法获得类列表:" + +msgid "Unable to get class status:" +msgstr "无法获得类状态:" + +msgid "Unable to get list of printer drivers:" +msgstr "无法获得打印机驱动程序的列表:" + +msgid "Unable to get printer attributes:" +msgstr "无法获得打印机属性:" + +msgid "Unable to get printer list:" +msgstr "无法获得打印机列表:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "无法获得打印机状态:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "无法修改类:" + +msgid "Unable to modify printer:" +msgstr "无法修改打印机:" + +msgid "Unable to move job" +msgstr "无法移动作业" + +msgid "Unable to move jobs" +msgstr "无法移动作业" + +msgid "Unable to open PPD file" +msgstr "无法打开 PPD 文件" + +msgid "Unable to open PPD file:" +msgstr "无法打开 PPD 文件:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "无法打开 cupsd.conf 文件:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "无法打印测试页:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "无法设定选项:" + +msgid "Unable to set server default:" +msgstr "无法设定服务器默认值:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "无法上传 cupsd.conf 文件:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "未授权" + +msgid "Units" +msgstr "单位" + +msgid "Unknown" +msgstr "未知" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "未知 printer-error-policy“%s”。" + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "未知 printer-op-policy“%s”。" + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "不支持的值类型" + +msgid "Upgrade Required" +msgstr "要求升级" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "Value 使用不定长度" + +msgid "VarBind uses indefinite length" +msgstr "VarBind 使用不定长度" + +msgid "Version uses indefinite length" +msgstr "Version 使用不定长度" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "是" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"您必须使用 URL https://%s:%d%s 访问此页面。" + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL 标签打印机" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "已中止" + +msgid "canceled" +msgstr "已取消" + +msgid "completed" +msgstr "已完成" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "cups-deviced 执行失败。" + +msgid "cups-driverd failed to execute." +msgstr "cups-driverd 执行失败。" + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index 使用不定长度" + +msgid "error-status uses indefinite length" +msgstr "error-status 使用不定长度" + +msgid "held" +msgstr "保留" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "闲置" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "挂起" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "正在处理" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id 使用不定长度" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "获得 %s 的状态失败:%s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "已停止" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "未知" + +msgid "untitled" +msgstr "未命名" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings 使用不定长度" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(全部)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(无)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d 个条目\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\t发生故障后:继续\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\t警报:" + +#~ msgid "\tBanner required\n" +#~ msgstr "\t需要标题\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\t字符集集合:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\t连接:直接\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\t连接:远程\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\t默认页面大小:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\t默认间距:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\t默认端口设置:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\t描述:%s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\t已装载的表格:\n" +#~ "\t内容类型:任何\n" +#~ "\t打印机类型:未知\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\t允许的形式:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\t接口:%s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\t接口:%s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\t接口:%s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\t位置:%s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\t发生故障时:无警报\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\t允许的用户:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\t拒绝的用户:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\t监控程序已存在\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\t无条目\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\t打印机在设备 '%s' 上,速度 -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\t打印已停用\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\t打印已启用\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\t已排队进行%s\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\t队列已停用\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\t队列已启用\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\t原因未知\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " 详细的一致性测试结果\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " REF: 页 15,节 3.1。\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " REF: 页 15,节 3.2。\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " REF: 页 19,节 3.3。\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " REF: 页 20,节 3.4。\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " REF: 页 27,节 3.5。\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " REF: 页 42,节 5.2。\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " REF: 页 16-17,节 3.2。\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " REF: 页 42-45,节 5.2。\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " REF: 页 45-46,节 5.2。\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " REF: 页 48-49,节 5.2。\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " REF: 页 52-54,节 5.2。\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f 字节\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " 通过 Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " 通过 DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " 通过 DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " 通过 FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " 通过 FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " 通过 LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " 通过 LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " 通过 Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " 通过 ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " 通过 NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " 通过 PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " 通过 PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " 通过 PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " 通过 PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " 通过 Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " 通过 ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " WARN “%s %s”与“%s %s”有冲突\n" +#~ " (constraint=\"%s %s %s %s\")\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " WARN %s 没有相应的选项!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " WARN %s 与 %s 共享一个公共前缀\n" +#~ " REF: 第 15 页,第 3.2 节。\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " WARN 默认选择有冲突!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " WARN Duplex 选项关键词 %s 可能无法像期望那样工作,且应当命名为 " +#~ "Duplex!\n" +#~ " REF: 页 122,节 5.17。\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr " WARN 文件混有 CR、LF 和 CR LF 行尾!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 规范要求 LanguageEncoding。\n" +#~ " REF: 页 56-57,节 5.3。\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " WARN 行 %d 仅包含空白!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 规范要求 Manufacturer。\n" +#~ " REF: 第 58-59 页,第 5.3 节。\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " WARN 缺少 APDialogExtension 文件“%s”\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " WARN 缺少 APPrinterIconPath 文件“%s”\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " WARN 非 Windows PPD 文件应当仅使用以 LF 结尾的行,而不是以 CR " +#~ "LF 结尾的行!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " WARN 过时的 PPD 版本 %.1f!\n" +#~ " REF: 页 42,节 5.2。\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " WARN PCFileName 长于 8.3,不符合 PPD 规范。\n" +#~ " REF: 页 61-62,节 5.3。\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN 协议含有 PJL,但 JCL 属性未设定。\n" +#~ " REF: 页 78-79,节 5.7。\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " WARN 协议含有 PJL 和 BCP;还期待 TBCP。\n" +#~ " REF: 页 78-79,节 5.7。\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " WARN PPD 4.3 规范要求 ShortNickName。\n" +#~ " REF: 页 64-65,节 5.3。\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s 不存在!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 错误的 %s 选择 %s!\n" +#~ " REF: 第 122 页,第 5.17 节。\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s 错误的 UTF-8“%s”转换字符串(用于选项“%s”)!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s 错误的 UTF-8“%s”转换字符串(用于选项“%s”),选择“%s”!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s 错误的 cupsFilter 值“%s”!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s 错误的 cupsICCProfile %s!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s 错误的 cupsPreFilter 值“%s”!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 错误的 cupsUIConstraints %s:“%s”!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s 错误的语言“%s”!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s 空的 cupsUIConstraints %s!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s 缺少“%s”转换字符串(用于选项“%s”)!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s 缺少“%s”转换字符串(用于选项“%s”),选择“%s”!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s 缺少选择 *%s %s(在 UIConstraints“*%s %s *%s %s”中)!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 缺少选择 *%s %s(在 cupsUIConstraints“%s”中):“%s”!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s 缺少 cupsFilter 文件“%s”\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s 缺少 cupsICCProfile 文件“%s”!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s 缺少 cupsPreFilter 文件“%s”\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s 缺少 cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s 缺少选项 %s(在 UIConstraints“*%s %s *%s %s”中)!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 缺少选项 %s(在 cupsUIConstraints“%s”中):“%s”!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s 文件中不包括基本转换“%s”!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s 所请求的 %s 没有定义选择 None!\n" +#~ " REF: 第 122 页,第 5.17 节。\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s 散列值与 %s 冲突!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s 导致了一个循环!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr " **失败** %s 选择名称 %s 和 %s 只会根据情况而不同!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **失败** %s 必须是 1284DeviceID!\n" +#~ " REF: 页 72,节 5.5。\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失败** 错误的 Default%s %s\n" +#~ " REF: 第 40 页,第 4.5 节。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 错误的 DefaultImageableArea %s!\n" +#~ " REF: 页 102,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 错误的 DefaultPaperDimension %s!\n" +#~ " REF: 页 103,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **失败** 文件中错误的 JobPatchFile 属性\n" +#~ " REF: 第 24 页,第 3.4 节。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失败** 错误的 Manufacturer(应该是“HP”)\n" +#~ " REF: 第 211 页,表 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失败** 错误的 Manufacturer(应该是“Oki”)\n" +#~ " REF: 第 211 页,表 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 ModelName -“%c”,字符串中不允许。\n" +#~ " REF: 页 59-60,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 PSVersion - 不是“(string) int”。\n" +#~ " REF: 页 62-64,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 Product - 不是“(string) int”。\n" +#~ " REF: 页 62,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 ShortNickName - 多于 31 个字符。\n" +#~ " REF: 页 64-65,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **失败** 错误的 %s 选择 %s!\n" +#~ " REF: 第 84 页,第 5.9 节。\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 FileVersion“%s”\n" +#~ " REF: 第 56 页,第 5.3 节。\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 错误的 FormatVersion“%s”\n" +#~ " REF: 第 56 页,第 5.3 节。\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **失败** 错误的 LanguageEncoding %s - 必须是 ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **失败** 错误的 LanguageVersion %s - 必须是 English!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **失败** 不能解释默认选项编码:%s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr " **失败** 选项 %s 选择 %s 的默认转换字符串含有 8 位字符!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr " **失败** 选项 %s 的默认转换字符串含有 8 位字符!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr " **失败** 组别名称 %s 和 %s 只会根据情况而不同!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **失败** 多次出现 %s 选择名称 %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr " **失败** 选项名称 %s 和 %s 只会根据情况而不同!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失败** 要求 Default%s\n" +#~ " REF: 页 40,节 4.5。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 要求 DefaultImageableArea\n" +#~ " REF: 页 102,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 要求 DefaultPaperDimension\n" +#~ " REF: 页 103,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 FileVersion\n" +#~ " REF: 页 56,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 FormatVersion\n" +#~ " REF: 页 56,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 要求 PageSize %s 的 ImageableArea\n" +#~ " REF: 第 41 页,第 5 节。\n" +#~ " REF: 页 102,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 LanguageEncoding\n" +#~ " REF: 页 56-57,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 LanguageVersion\n" +#~ " REF: 页 57-58,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 Manufacturer\n" +#~ " REF: 页 58-59,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 ModelName\n" +#~ " REF: 页 59-60,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 NickName\n" +#~ " REF: 页 60,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 PCFileName\n" +#~ " REF: 页 61-62,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 PSVersion\n" +#~ " REF: 页 62-64,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **失败** 要求 PageRegion\n" +#~ " REF: 页 100,节 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **失败** 要求 PageSize\n" +#~ " REF: 第 41 页,第 5 节。\n" +#~ " REF: 页 99,节 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **失败** 要求 PageSize\n" +#~ " REF: 页 99-100,节 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失败** 要求 PageSize %s 的 PaperDimension\n" +#~ " REF: 第 41 页,第 5 节。\n" +#~ " REF: 页 103,节 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 Product\n" +#~ " REF: 页 62,节 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失败** 要求 ShortNickName\n" +#~ " REF: 页 64-65,节 5.3。\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " 发现 %d 个错误\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " 错误的 %%%%BoundingBox:在行 %d!\n" +#~ " REF: 页 39,%%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " 错误的 %%%%Page:在行 %d!\n" +#~ " REF: 页 53,%%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " 错误的 %%%%Pages:在行 %d!\n" +#~ " REF: 页 43,%%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " 行 %d 多于 255 个字符 (%d)!\n" +#~ " REF: 页 25,行长度\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " 首行缺少 %!PS-Adobe-3.0!\n" +#~ " REF: 页 17,3.1 符合文稿\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " 缺少 %%EndComments 批注!\n" +#~ " REF: 页 41,%%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " 缺少或错误的 %%%%BoundingBox:批注!\n" +#~ " REF: 页 39,%%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " 缺少或错误的 %%Page:批注!\n" +#~ " REF: 页 53,%%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " 缺少或错误的 %%Pages:批注!\n" +#~ " REF: 页 43,%%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " 未发现错误\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " 发现 %d 行超过 255 个字符!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " 太多 %%BeginDocument 批注!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " 太多 %%EndDocument 批注!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " WARNING: 文件含有二进制数据!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " WARNING: 文件中没有 %%EndComments 批注!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " WARNING: 文件中的 DSC 版本 %.1f 过时!\n" + +#~ msgid " FAIL\n" +#~ msgstr " 失败\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " 失败\n" +#~ " **失败** 无法打开 PPD 文件 - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " 失败\n" +#~ " **失败** 无法打开 PPD 文件 - %s 在第 %d 行。\n" + +#~ msgid " PASS\n" +#~ msgstr " 通过\n" + +#~ msgid "#10 Envelope" +#~ msgstr "10 号信封" + +#~ msgid "#11 Envelope" +#~ msgstr "11 号信封" + +#~ msgid "#12 Envelope" +#~ msgstr "12 号信封" + +#~ msgid "#14 Envelope" +#~ msgstr "14 号信封" + +#~ msgid "#9 Envelope" +#~ msgstr "9 号信封" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f 字节\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f 字节\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s 正在接受请求,时间从 %s\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s 未被 lpc 的 CUPS 版本实施。\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s 未准备就绪\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s 准备就绪\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s 已准备就绪,正在打印\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s 没有在接受请求,时间从 %s -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "%s 不被支持!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s 正在接受请求,时间从 %s\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s 没有在接受请求,时间从 %s -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s:%-33.33s [作业 %d 本地主机]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s:%s 失败:%s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s:不知道要做什么!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s:错误 - %s 个环境变量名称不存在目的位置“%s”!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s:错误 - 错误的作业 ID!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "%s:错误 - 不能同时打印文件和更改作业!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "%s:错误 - 如果文件或作业 ID 已提供,则不能从 stdin 打印!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s:错误 - '-S' 选项后期望字符集!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s:错误 - '-T' 选项后期望内容类型!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s:错误 - '-n' 选项后期望份数!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s:错误 - '-#' 选项后期望份数!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s:错误 - '-P' 选项后期望目的位置!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s:错误 - '-b' 选项后期望目的位置!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s:错误 - '-d' 选项后期望目的位置!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s:错误 - '-f' 选项后期望形式!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s:错误 - '-H' 选项后期望保留名称!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s:错误 - '-H' 选项后期望主机名称!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s:错误 - '-H' 选项后期望主机名称!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s:错误 - '-y' 选项后期望模式列表!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s:错误 - '-%c' 选项后期望名称!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s:错误 - '-o' 选项后期望选项字符串!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s:错误 - '-P' 选项后期望页面列表!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s:错误 - '-%c' 选项后期望优先级!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s:错误 - '-r' 选项后期望原因文本!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s:错误 - '-t' 选项后期望标题!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s:错误 - '-U' 选项后期望用户名称!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s:错误 - '-U' 选项后期望用户名称!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s:错误 - '-%c' 选项后期望值!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "%s:错误 -“-W”选项后需要“completed”、“not-completed”或“all”\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s:错误 - 没有默认目的位置。\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s:错误 - 优先级必须在 1 到 100 之间。\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s:错误 - 调度程序无响应!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s:错误 - 太多文件 -“%s”\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s:错误 - 无法访问“%s”- %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s:错误 - 无法从 stdin 排队 - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s:错误 - 未知目的位置“%s”!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s:错误 - 未知目的位置“%s/%s”!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s:错误 - 未知选项 '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s:错误 - 未知选项“%s”!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s:'-i' 选项后期望作业 ID!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s:滤镜“%s”不可用:%s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s:列表“%s”中的目的位置名称无效!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s:无效的滤镜字符串“%s”\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "" +#~ "%s:'-H restart' 之前需要作业 ID ('-i jobid')!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s:无滤镜可从 %s/%s 转换成 %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s:操作失败:%s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s:对不起,未编译加密支持!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s:无法连接到服务器\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s:无法联系服务器!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s:无法确定“%s”的 MIME 类型!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s:无法打开 %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s:无法打开 %s - %s(在第 %d 行)。\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s:无法打开 %s:%s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s:无法打开 PPD 文件:%s 在第 %d 行\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s:无法从“%s”或“%s”读取 MIME 数据库!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s:未知目的位置“%s”!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s:未知目的 MIME 类型 %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s:未知选项 '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s:未知的源 MIME 类型 %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "%s:警告 - “%c”格式修饰符不支持 - 输出可能不正确!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s:警告 - 字符集选项被忽略!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s:警告 - 内容类型选项被忽略!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s:警告 - 形式选项被忽略!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s:警告 - 模式选项被忽略!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s:错误 - %s 个环境变量名称不存在目的位置“%s”!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s:错误 - '-o' 选项后期望 option=value!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s:错误 - 没有默认目的位置。\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11 英寸" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13 英寸" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14 英寸" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11 英寸" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11 英寸" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI 灰度" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9 英寸" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10 英寸" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11 英寸" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12 英寸" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?未知的无效帮助命令\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "导出打印机驱动程序需要 Samba 密码!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "导出打印机驱动程序需要 Samba 用户名称!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "名称为“%s”的类已经存在!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "名称为“%s”的打印机已经存在!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3(大号)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4(大号)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4(小号)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5(大号)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "尝试将 %s 打印机状态设定为错误值 %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "属性组顺序混乱 (%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "错误的设备 URI“%s”!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "错误的 device-uri“%s”!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "错误的 device-uri 方案“%s”!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "错误的 document-format“%s”!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "错误的文件名称缓冲区!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "错误的字体属性:%s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "错误的 job-priority 值!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "错误的 job-sheets 值“%s”!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "错误的 job-sheets 值类型!" + +#~ msgid "Bad job-state value!" +#~ msgstr "错误的 job-state 值!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "错误的 job-uri 属性“%s”!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "错误的 notify-pull-method“%s”!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "错误的 notify-recipient-uri URI“%s”!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "行 %d 中错误的 option + choice!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "错误的 port-monitor“%s”!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "错误的 printer-state 值 %d!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "错误的请求版本号 %d.%d!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "错误的订阅 ID!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 信封" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 信封" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 信封" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 信封" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 信封" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 信封" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 信封" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 信封" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 信封" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "字符集“%s”不被支持!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 信封" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 信封" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "命令可能是缩写。命令是:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "未能扫描类型“%s”!" + +#~ msgid "Cover open." +#~ msgstr "机盖打开。" + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL 信封" + +#~ msgid "Developer almost empty." +#~ msgstr "显影剂差不多快要空了。" + +#~ msgid "Developer empty!" +#~ msgstr "显影剂已空!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "设备:uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "找不到文稿 %d(在作业 %d 中)。" + +#~ msgid "Door open." +#~ msgstr "打印机门打开。" + +#~ msgid "Double Postcard" +#~ msgstr "双面明信片" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: 无法为页面信息分配内存:%s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: 无法为页面序列分配内存:%s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 错误的 %%BoundingBox:发现批注!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: 错误的 %%IncludeFeature:批注!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: 错误的 %%Page:文件中的批注!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: 错误的 %%PageBoundingBox:文件中的批注!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: 错误的 SCSI 设备文件“%s”!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: 错误的字符集文件 %s\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: 错误的字符集类型 %s\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: 错误的列值 %d!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: 错误的 cpi 值 %f!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: 错误的字体描述行:%s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: 错误的 lpi 值 %f!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: 错误的页面设置!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: 错误的文本方向 %s\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: 错误的文本宽度 %s\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: 目的位置打印机不存在!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 重复的 %%BoundingBox:发现批注!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: 重复的 %%Pages!发现批注!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: 空打印文件!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: 发送 PAPSendData 请求时发生错误 %d:%s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: %2$s 的第 %1$d 行期望引号字符串!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: 致命的 USB 错误!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "ERROR: 发现无效的 HP-GL/2 命令,无法打印文件!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: 缺少 %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: 缺少 %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "ERROR: 命令行上缺少设备 URI,且无 DEVICE_URI 环境变量!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: 标题文件的第 %d 行缺少值!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "ERROR: %2$s 的第 %1$d 行上的任何转换字符串前面均需要有 msgid 行!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: 无 %%BoundingBox:标头中的批注!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: 无 %%Pages:标头中的批注!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "ERROR: 在 argv[0] 或 DEVICE_URI 环境变量中找不到设备 URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: 字符集文件 %s 中没有字体\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: 找不到页面!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: 缺纸!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: PRINTER 环境变量未定义!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: 打印文件不被接受 (%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: 打印机没有响应\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: 打印机没有响应!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: 打印机发送了意外的 EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: 远程主机不接受控制文件 (%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: 远程主机不接受数据文件 (%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "ERROR: 将数据发送到打印机时发生了超时错误\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: 无法将文件 %d 添加到作业:%s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: 无法取消作业 %d:%s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: 无法拷贝 PDF 文件" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: 无法创建套接字" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: 无法创建临时的压缩打印文件:%s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: 无法创建临时文件" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: 无法创建临时文件 - %s。\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: 无法创建临时文件:%s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: 无法执行 pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: 无法执行 gs 程序" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: 无法执行 pdftops 程序" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: 无法 fork pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: 无法获得 PAP 请求" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: 无法获得 PAP 响应" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: 无法获得用于打印机“%s”的 PPD 文件 - %s。\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: 无法获得默认的 AppleTalk 区域" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: 无法获得作业 %d 属性 (%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: 无法获得打印机状态 (%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: 找不到打印机 '%s' 的位置!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: 无法查找 PAP 响应" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: 无法查找 AppleTalk 打印机" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: 无法确定 AppleTalk 地址" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: 无法打开“%s”- %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: 无法打开 %s:%s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: 无法打开标题文件“%s” - %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: 无法打开设备文件“%s”:%s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: 无法打开文件“%s”- %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: 无法打开文件“%s”:%s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: 无法打开图像文件进行打印!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: 无法打开打印文件“%s”:%s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: 无法打开打印文件 %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: 无法打开打印文件 %s:%s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: 无法打开临时的压缩打印文件:%s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: 无法打开临时文件" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: 无法打印 %d 个文本栏!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: 无法打印 %dx%d 页文本页面!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: 无法读取打印数据" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: 无法读取打印数据!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: 无法保留端口" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: 无法搜寻到文件中的偏移 %ld - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: 无法搜寻到文件中的偏移 %lld - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: 无法发送 LPD 命令" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: 无法发送 PAP 反馈请求" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: 无法发送初始 PAP 发送数据请求" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: 无法发送打印数据 (%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: 无法发送打印数据!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: 无法将打印文件发送到打印机" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: 无法将尾空发送到打印机" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: 无法等待 pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: 无法将 %d 字节写入“%s”:%s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: 无法将 %d 字节写入打印机!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: 无法写入控制文件" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: 无法写入打印数据" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: 无法写入打印数据:%s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: 无法将光栅数据写入驱动程序!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: 无法写入到临时文件" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: 无法写入未压缩的文稿数据:%s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: %2$s 的第 %1$d 行有意外的文本!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: 未知的加密选项值“%s”!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: 未知的文件顺序“%s”\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: 未知的格式字符“%c”\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: “%s”的信息目录格式未知!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: 未知选项“%s”,其值为“%s”!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: 未知打印模式“%s”\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: 未知的版本选项值“%s”!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: 不被支持的亮度值 %s,使用 brightness=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: 不被支持的灰度系数值 %s,使用 gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: 不被支持的 number-up 值 %d,使用 number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: 不被支持的 number-up-layout 值 %s,使用 number-up-layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "ERROR: 不被支持的 page-border 值 %s,使用 page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: 检测到 doc_printf 溢出(%d 字节),正在中止!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops 滤镜在信号 %d 处崩溃!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops 滤镜退出,状态为 %d!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops 因信号 %d 退出!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops 因状态 %d 退出!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "ERROR: 可恢复:无法连接到打印机;将在 30 秒钟后重试…\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() 失败" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: 无法获得打印文件的状态" + +#~ msgid "Empty PPD file!" +#~ msgstr "空 PPD 文件!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "ERROR: '-h' 选项后需要主机名称!\n" + +#~ msgid "FAIL\n" +#~ msgstr "失败\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "文件设备 URI 已被停用!要启用,请参阅“%s/cupsd.conf”中的 FileDevice 指令。" + +#~ msgid "Fuser temperature high!" +#~ msgstr "加热鼓温度过高!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "加热鼓温度过低!" + +#~ msgid "German FanFold" +#~ msgstr "德国 FanFold" + +#~ msgid "German FanFold Legal" +#~ msgstr "德国 FanFold 法定用纸" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "获得 printer-uri 属性而不是 job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: AppleTalk 已在“系统偏好设置”中停用\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: AppleTalk 已在“系统偏好设置”中停用。\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: 正在取消打印作业…\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: 已连接到打印机…\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: 正在连接到打印机…\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: 控制文件已成功发送\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: 数据文件已成功发送\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: 正在格式化页面 %d…\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: 正在载入图像文件…\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: 正在查找打印机…\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: 正在打开连接\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: 打印文件已发送,正在等侍打印机结束打印…\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: 打印机正忙;将在 10 秒钟后重试…\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: 打印机正忙;将在 30 秒钟后重试…\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 打印机正忙;将在 5 秒钟后重试…\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: 打印机不支持 IPP/%d.%d,正在尝试 IPP/1.0…\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 打印机正忙;将在 5 秒钟后重试…\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: 打印机当前已脱机。\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: 打印机当前已脱机。\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: 打印机现在联机。\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: 打印机已脱机。\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: 打印机未连接;将在 30 秒钟后重试…\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: 正在打印第 %d 页,已完成 %d%%…\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: 正在打印第 %d 页…\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: 准备打印。\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: 正在发送控制文件(%lu 字节)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: 正在发送控制文件(%u 字节)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: 正在发送数据\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: 正在发送数据文件(%ld 字节)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: 正在发送数据文件(%lld 字节)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: 正在发送打印数据…\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: 已发送打印文件,%ld 字节…\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: 已发送打印文件,%lld 字节…\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: 正在缓冲 LPR 作业,已完成 %.0f%%…\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "INFO: 无法联系打印机,正在排队等待类中的下一个打印机…\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: 正在使用默认的 AppleTalk 区域“%s”\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: 正在等待作业完成…\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: 正在等待打印机可用…\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 信封" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5(大号)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 信封" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 信封" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "墨水/碳粉差不多快要空了。" + +#~ msgid "Ink/toner empty!" +#~ msgstr "墨水/碳粉已空!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "墨水/碳粉废物箱差不多快要满了。" + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "墨水/碳粉废物箱已满!" + +#~ msgid "Interlock open." +#~ msgstr "互锁打开。" + +#~ msgid "Invite Envelope" +#~ msgstr "邀请信封" + +#~ msgid "Italian Envelope" +#~ msgstr "意大利信封" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "作业 #%d 不能重新开始 - 无文件!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "作业 #%d 不存在!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "作业 #%d 已结束,不能更改!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "作业 #%d 没有完成!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "作业 #%d 没有等待进行签定!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "作业 #%d 没有等待!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "作业 #%s 不存在!" + +#~ msgid "Job %d not found!" +#~ msgstr "作业 %d 找不到!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "作业订阅不能续订!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 信封" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 信封" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "语言“%s”不被支持!" + +#~ msgid "Media jam!" +#~ msgstr "卡纸!" + +#~ msgid "Media tray almost empty." +#~ msgstr "介质盒差不多快要空了。" + +#~ msgid "Media tray empty!" +#~ msgstr "介质盒已空!" + +#~ msgid "Media tray missing!" +#~ msgstr "缺少介质盒!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "介质盒需要装纸。" + +#~ msgid "Missing document-number attribute!" +#~ msgstr "缺少 document-number 属性!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "行 %d 缺少双引号!" + +#~ msgid "Missing form variable!" +#~ msgstr "缺少形式变量!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "缺少 notify-subscription-ids 属性!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "缺少 requesting-user-name 属性!" + +#~ msgid "Missing required attributes!" +#~ msgstr "缺少要求的属性!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "行 %d 缺少值!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "型号:name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "皇家用纸" + +#~ msgid "Monarch Envelope" +#~ msgstr "皇家信封" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: 打印文件已接受 - 作业 ID %d。\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: 打印文件已接受 - 作业 ID 未知。\n" + +#~ msgid "No PPD name!" +#~ msgstr "无 PPD 名称!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "未安装 Windows 打印机驱动程序!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "%s 上没有活跃的作业!" + +#~ msgid "No attributes in request!" +#~ msgstr "请求中没有属性!" + +#~ msgid "No authentication information provided!" +#~ msgstr "未提供鉴定信息!" + +#~ msgid "No default printer" +#~ msgstr "无默认打印机" + +#~ msgid "No file!?!" +#~ msgstr "无文件!?!" + +#~ msgid "No modification time!" +#~ msgstr "无修改时间!" + +#~ msgid "No printer name!" +#~ msgstr "无打印机名称!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "找不到类的 printer-uri!" + +#~ msgid "No printer-uri found!" +#~ msgstr "找不到 printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "请求中没有 printer-uri!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "请求中没有订阅属性!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC 的使用寿命差不多快要到了。" + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC 的使用寿命已到!" + +#~ msgid "Out of toner!" +#~ msgstr "碳粉不足!" + +#~ msgid "Output bin almost full." +#~ msgstr "出纸箱差不多快要满了。" + +#~ msgid "Output bin full!" +#~ msgstr "出纸箱已满!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "打印机 %s 的输出已发送到 %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "打印机 %s 的输出已发送到远程打印机 %s(在 %s 上)\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "打印机 %s 的输出已发送到 %s/%s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "打印机 %s/%s 的输出已发送到远程打印机 %s(在 %s 上)\n" + +#~ msgid "Output tray missing!" +#~ msgstr "缺少输出盒!" + +#~ msgid "PASS\n" +#~ msgstr "通过\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 信封" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 信封" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 信封" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 信封" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K(大号)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 信封" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 信封" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 信封" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 信封" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 信封" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 信封" + +#~ msgid "Personal Envelope" +#~ msgstr "个人信封" + +#~ msgid "Printer offline." +#~ msgstr "打印机已脱机。" + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "顺序 所有者 作业 文件 总大小\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "顺序 所有者 优先级 作业 文件 总大小\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "运行命令:%s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI 打印机" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "小报用纸(大号)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data 值太大(%d > 63 个八位字节)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "打印机或类没有共享!" + +#~ msgid "The printer or class was not found." +#~ msgstr "打印机或类找不到。" + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "需要 printer-uri 属性。" + +#~ msgid "Toner low." +#~ msgstr "碳粉不足。" + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "太多 job-sheets 值 (%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "太多 printer-state-reasons 值 (%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "美国行政用纸" + +#~ msgid "US Fanfold" +#~ msgstr "美国 Fanfold" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "美国法定用纸(大号)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "美国信纸(大号)" + +#~ msgid "US Letter (Small)" +#~ msgstr "美国信纸(小号)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "无法为目的位置“%s”添加作业!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "无法为文件类型分配内存!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "无法拷贝 64 位 CUPS 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "无法拷贝 64 位 Windows 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "无法拷贝 CUPS 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "无法拷贝 PPD 文件 - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "无法拷贝 PPD 文件!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "无法拷贝 Windows 2000 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "无法拷贝 Windows 9x 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "无法拷贝接口脚本 - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "无法创建 printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "无法编辑大于 1MB 的 cupsd.conf 文件!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "找不到作业的目的位置!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "找不到打印机\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "无法安装 Windows 2000 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "无法安装 Windows 9x 打印机驱动程序文件 (%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "无法打开文稿 %d(在作业 %d 中)!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "无法运行“%s”:%s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "无法将命令发送到打印机驱动程序!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "无法获得 Windows 打印机驱动程序 (%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "无法使用传统 USB 类驱动程序!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "未知打印机错误 (%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "不支持的字符集“%s”!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "不被支持的压缩“%s”!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "不被支持的压缩属性 %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "不被支持的格式“%s”!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "不被支持的格式 '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "不被支持的格式 '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "Usage: %s job user title copies options [filename]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "Usage: %s job-id user title copies options [file]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "Usage: %s job-id user title copies options file\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "Usage: lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "Usage: lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "Usage: snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: 仅添加找到的前 %d 台打印机" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: Boolean 期望 waiteof 选项“%s”\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: 读取面通道请求失败!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: 不能通过 IncludeFeature 包括选项“%s”!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: 打印机没有响应\n" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: 打印机发送了意外的 EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: %d 秒钟后,远程主机没有响应命令状态字节!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: %d 秒钟后,远程主机没有响应控制状态字节!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: %d 秒钟后,远程主机没有响应数据状态字节!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: SCSI 命令超时 (%d);正在重试…\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "" +#~ "WARNING: 此文稿不符合 Adobe Document Structuring Conventions 的要求,可能" +#~ "无法正确打印!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: 无法打开“%s:%s”:%s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: 无法发送 PAP 状态请求" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: 意外的 PAP 包(类型 %d)\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: 未知的 PAP 包(类型 %d)\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: 未知选择“%s”(用于选项“%s”)!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: 未知选项“%s”!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: 不被支持的波特率 %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: 状态选项“%s”期望数字\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "WARNING: 可恢复:网络主机“%s”正忙;将在 %d 秒钟后重试…\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "警告,未安装 Windows 2000 打印机驱动程序!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 信封" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "转换:使用 -f 选项来指定要转换的文件。\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb:无 PPD 文件可用于打印机“%s”- %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl:无法连接到服务器:%s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl:未知选项“%s”!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl:未知选项“-%c”!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd:“-c”选项后期望配置文件名称!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd:无法获得当前目录!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd:未知自变量“%s”- 正在中止!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd:未知选项“%c”- 正在中止!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "cupsd:launchd(8) 支持未编译,正在以正常模式运行。\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter:无效的文稿编号 %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter:无效的作业 ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter:只能指定一个文件名称!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter:无法创建临时文件:%s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter:无法获得作业文件 - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd:-q 选项与 -v 选项不兼容。\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd:-v 选项与 -q 选项不兼容。\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "用于 %s/%s 设备:%s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "用于 %s 的设备:%s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "帮助\t\t获得命令帮助\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri 属性丢失!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin: 类名称只能含有可打印字符!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin: '-P' 选项后期望 PPD!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin: '-u' 选项后期望 allow/deny:userlist!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin: '-r' 选项后期望类。\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin: '-c' 选项后期望类名称!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin: '-D' 选项后期望描述!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin: '-v' 选项后期望设备 URI!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin: '-I' 选项后期望文件类型!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin: '-h' 选项后期望主机名称!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin: '-i' 选项后期望接口!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin: '-L' 选项后期望位置!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin: '-m' 选项后期望型号!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin: '-o' 选项后期望 name=value!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin: '-p' 选项后期望打印机!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin: '-d' 选项后期望打印机名称!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin: '-x' 选项后期望打印机或类!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin: 会发现成员名称!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin: 打印机 %s 已经是类 %s 的成员。\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin: 打印机 %s 不是类 %s 的成员。\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin: 打印机名称只能含有可打印字符!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法将打印机添加到类:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin: 无法连接到服务器:%s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin: 无法创建临时文件 - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin: 无法创建临时文件:%s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin: 无法打开 PPD 文件“%s”- %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin: 无法打开文件“%s”:%s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法从类中去掉打印机:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定 PPD 文件:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定设备 URI:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定接口脚本或 PPD 文件:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定接口脚本:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定打印机描述:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定打印机位置:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin: 无法设定打印机选项:\n" +#~ " 您必须先指定一个打印机名称!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin: 未知的允许/拒绝选项“%s”!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin: 未知自变量 '%s'!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin: 未知选项 '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin: 警告 - 内容类型列表被忽略!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo:--device-id 后期望的 1284 设备 ID 字符串!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo:--language 后期望的语言!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo:--make-and-model 后期望的制造和型号!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo:--product 后期望的产品字符串!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo:--exclude-schemes 后期望的方案列表!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo:--include-schemes 后期望的方案列表!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo:--timeout 后期望的超时!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo:未知自变量 '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo:未知选项 '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo:未知选项“%s”!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove:无法连接到服务器:%s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove:未知自变量 '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove:未知选项 '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions:无打印机!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions:无法添加打印机或实例:%s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions:无法获得 %s 的 PPD 文件:%s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions:无法打开 %s 的 PPD 文件!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions:未知打印机或类!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd: 仅根用户才可以添加或删除密码!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd: 密码文件正忙!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd: 密码文件未更新!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd: 对不起,密码不匹配!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd: 对不起,密码被拒绝。\n" +#~ "您的密码必须至少有 6 个字符长,不能包含\n" +#~ "您的用户名称,并且必须至少包含 1 个字母和 1 个数字。\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd: 对不起,密码不匹配!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd: 无法拷贝密码字符串:%s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd: 无法打开密码文件:%s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd: 无法写入密码文件:%s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd: 备份旧密码文件失败:%s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd: 给密码文件重新命名失败:%s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd: 用户“%s”和组“%s”不存在。\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "lpstat: 错误 - %s 个环境变量名称不存在目的位置“%s”!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "类 %s 的成员:\n" + +#~ msgid "no entries\n" +#~ msgstr "无条目\n" + +#~ msgid "no system default destination\n" +#~ msgstr "无系统默认目的位置\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "notify-events 未指定!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI“%s”已经在使用!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI“%s”使用未知方案!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d 不好!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc:正在添加包括目录“%s”…\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc:正在从 %s 添加/更新 UI 文本…\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc:错误的布尔值 (%1$s),在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:错误的分辨率名称“%1$s”,在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc:错误的关键词 %1$s,在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc:错误的变量替换 ($%1$c),在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc:在 %2$s 的第 %1$d 行找到选择,但没有选项!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc:地点 %1$s 的 #po 重复(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望滤镜定义!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望程序名称!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望布尔值。\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Font 后面期望字符集!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望选择代码。\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望选择名称/文本。\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望 ColorModel 的颜色顺序!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望 ColorModel 的颜色空间!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望 ColorModel 的压缩!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望 UIConstraints 的约束字符串!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上的 DriverType 后面期望驱动程序类型关键词!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Duplex 后面期望双面类型!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Font 后面期望编码!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc:#po %1$s 后面期望文件名称(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望组别名称/文本。\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望包括文件名称!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望整数!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 #po 后面期望地点!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 后面期望名称(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 FileName 后面期望名称!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Font 后面期望名称!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Manufacturer 后面期望名称!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 MediaSize 后面期望名称!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 ModelName 后面期望名称!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 PCFileName 后面期望名称!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 后面期望名称/文本(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Installable 后面期望名称/文本!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Resolution 后面期望名称/文本!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望 ColorModel 的名称/文本组合!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望选项名称/文本!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望选项区!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望选项类型!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Resolution 后面期望覆盖字段!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望实数!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上的 ColorProfile 后面期望分辨率/介质类型!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上的 SimpleColorProfile 后面期望分辨率/介质类型!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 后面期望选择器(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Font 后面期望状态!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Copyright 后面期望字符串!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Version 后面期望字符串!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行期望两个选项名称!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 后面期望值(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上的 Font 后面期望版本!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc:无效的 #include/#po 文件名称“%s”!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行有无效的滤镜成本!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行有无效的滤镜空 MIME 类型!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行有无效的滤镜空程序名称!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:无效的选项区“%1$s”,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:无效的选项类型“%1$s”,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc:正在载入驱动程序信息文件“%s”…\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc:正在载入地点“%s”的信息…\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc:正在从“%s”载入信息…\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc:“%s”的末尾丢失 #endif!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行丢失 #if!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc:没有为地点 %s 提供信息目录!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "ppdc:选项 %1$s 被重新定义为不同的类型(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc:选项约束必须在 %2$s 的第 %1$d 行上指定的 *name 中!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行嵌套的 #if 太多!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc:无法创建 PPD 文件“%s” - %s。\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc:无法创建输出目录 %s:%s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc:无法创建输出管道:%s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc:无法执行 cupstestppd:%s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc:找不到 #po 文件 %1$s(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:找不到包括文件“%1$s”(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc:找不到“%s”的本地化文件 - %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc:无法载入本地化文件“%s” - %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc:未定义的变量 (%1$s),在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc:未知的驱动程序类型 %1$s,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:未知的双面类型“%1$s”,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:未知的介质大小“%1$s”,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc:未知的令牌“%1$s”,出现在 %3$s 的第 %2$d 行!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "ppdc:实数“%1$s”中有未知的末尾字符(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc:未结束的字符串以 %1$c 开头(在 %3$s 的第 %2$d 行)!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc:正在写入 %s…\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc:正在将 PPD 文件写入目录“%s”…\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge:错误的 LanguageVersion“%s”(在 %s 中)!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge:正在忽略 PPD 文件 %s…\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge:无法将 %s 备份到 %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "打印机 %s 已停用,时间从 %s -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "打印机 %s 闲置,启用时间从 %s\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "打印机 %s 现在正在打印 %s-%d,启用时间从 %s\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "打印机 %s/%s 已停用,时间从 %s -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "打印机 %s/%s 闲置,启用时间从 %s\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "打印机 %s/%s 现在正在打印 %s-%d,启用时间从 %s\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "请求 id 是 %s-%d(%d 个文件)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "调度程序没有运行\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "调度程序正在运行\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "状态\t\t显示监控程序和队列的状态\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "系统默认目的位置:%s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "系统默认目的位置:%s/%s\n" diff --git a/locale/cups_zh_TW.po b/locale/cups_zh_TW.po new file mode 100644 index 0000000..556ab6a --- /dev/null +++ b/locale/cups_zh_TW.po @@ -0,0 +1,8590 @@ +msgid "" +msgstr "" +"Project-Id-Version: CUPS 1.4\n" +"Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" +"POT-Creation-Date: 2012-03-07 13:38-0800\n" +"PO-Revision-Date: 2009-02-16 12:00-0800\n" +"Last-Translator: Apple Inc.\n" +"Language-Team: Apple Inc.\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" + +msgid "\t\t(all)" +msgstr "" + +msgid "\t\t(none)" +msgstr "" + +#, c-format +msgid "\t%d entries" +msgstr "" + +#, c-format +msgid "\t%s" +msgstr "" + +msgid "\tAfter fault: continue" +msgstr "" + +#, c-format +msgid "\tAlerts: %s" +msgstr "" + +msgid "\tBanner required" +msgstr "" + +msgid "\tCharset sets:" +msgstr "" + +msgid "\tConnection: direct" +msgstr "" + +msgid "\tConnection: remote" +msgstr "" + +msgid "\tContent types: any" +msgstr "" + +msgid "\tDefault page size:" +msgstr "" + +msgid "\tDefault pitch:" +msgstr "" + +msgid "\tDefault port settings:" +msgstr "" + +#, c-format +msgid "\tDescription: %s" +msgstr "" + +msgid "\tForm mounted:" +msgstr "" + +msgid "\tForms allowed:" +msgstr "" + +#, c-format +msgid "\tInterface: %s.ppd" +msgstr "" + +#, c-format +msgid "\tInterface: %s/interfaces/%s" +msgstr "" + +#, c-format +msgid "\tInterface: %s/ppd/%s.ppd" +msgstr "" + +#, c-format +msgid "\tLocation: %s" +msgstr "" + +msgid "\tOn fault: no alert" +msgstr "" + +msgid "\tPrinter types: unknown" +msgstr "" + +#, c-format +msgid "\tStatus: %s" +msgstr "" + +msgid "\tUsers allowed:" +msgstr "" + +msgid "\tUsers denied:" +msgstr "" + +msgid "\tdaemon present" +msgstr "" + +msgid "\tno entries" +msgstr "" + +#, c-format +msgid "\tprinter is on device '%s' speed -1" +msgstr "" + +msgid "\tprinting is disabled" +msgstr "" + +msgid "\tprinting is enabled" +msgstr "" + +#, c-format +msgid "\tqueued for %s" +msgstr "" + +msgid "\tqueuing is disabled" +msgstr "" + +msgid "\tqueuing is enabled" +msgstr "" + +msgid "\treason unknown" +msgstr "" + +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS" +msgstr "" + +msgid " Ignore specific warnings." +msgstr "" + +msgid " Issue warnings instead of errors." +msgstr "" + +msgid " REF: Page 15, section 3.1." +msgstr "" + +msgid " REF: Page 15, section 3.2." +msgstr "" + +msgid " REF: Page 19, section 3.3." +msgstr "" + +msgid " REF: Page 20, section 3.4." +msgstr "" + +msgid " REF: Page 27, section 3.5." +msgstr "" + +msgid " REF: Page 42, section 5.2." +msgstr "" + +msgid " REF: Pages 16-17, section 3.2." +msgstr "" + +msgid " REF: Pages 42-45, section 5.2." +msgstr "" + +msgid " REF: Pages 45-46, section 5.2." +msgstr "" + +msgid " REF: Pages 48-49, section 5.2." +msgstr "" + +msgid " REF: Pages 52-54, section 5.2." +msgstr "" + +#, c-format +msgid " %-39.39s %.0f bytes" +msgstr "" + +#, c-format +msgid " PASS Default%s" +msgstr "" + +msgid " PASS DefaultImageableArea" +msgstr "" + +msgid " PASS DefaultPaperDimension" +msgstr "" + +msgid " PASS FileVersion" +msgstr "" + +msgid " PASS FormatVersion" +msgstr "" + +msgid " PASS LanguageEncoding" +msgstr "" + +msgid " PASS LanguageVersion" +msgstr "" + +msgid " PASS Manufacturer" +msgstr "" + +msgid " PASS ModelName" +msgstr "" + +msgid " PASS NickName" +msgstr "" + +msgid " PASS PCFileName" +msgstr "" + +msgid " PASS PSVersion" +msgstr "" + +msgid " PASS PageRegion" +msgstr "" + +msgid " PASS PageSize" +msgstr "" + +msgid " PASS Product" +msgstr "" + +msgid " PASS ShortNickName" +msgstr "" + +#, c-format +msgid " WARN %s has no corresponding options." +msgstr "" + +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2." +msgstr "" + +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should " +"be named Duplex.\n" +" REF: Page 122, section 5.17" +msgstr "" + +msgid " WARN File contains a mix of CR, LF, and CR LF line endings." +msgstr "" + +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +#, c-format +msgid " WARN Line %d only contains whitespace." +msgstr "" + +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" WARN Non-Windows PPD files should use lines ending with only LF, " +"not CR LF." +msgstr "" + +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f.\n" +" REF: Page 42, section 5.2." +msgstr "" + +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN PCFileName should contain a unique filename.\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7." +msgstr "" + +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +msgid " cupsaddsmb [options] -a" +msgstr "" + +msgid " cupstestdsc [options] -" +msgstr "" + +msgid " program | cupstestppd [options] -" +msgstr "" + +#, c-format +msgid "" +" %s \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")." +msgstr "" + +#, c-format +msgid " %s %s %s does not exist." +msgstr "" + +#, c-format +msgid " %s %s file \"%s\" has the wrong capitalization." +msgstr "" + +#, c-format +msgid "" +" %s Bad %s choice %s.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Bad UTF-8 \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsFilter2 value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsICCProfile %s." +msgstr "" + +#, c-format +msgid " %s Bad cupsPreFilter value \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Bad language \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad permissions on %s file \"%s\"." +msgstr "" + +#, c-format +msgid " %s Bad spelling of %s - should be %s." +msgstr "" + +#, c-format +msgid " %s Cannot provide both APScanAppPath and APScanAppBundleID." +msgstr "" + +#, c-format +msgid " %s Default choices conflicting." +msgstr "" + +#, c-format +msgid " %s Empty cupsUIConstraints %s" +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s, choice %s." +msgstr "" + +#, c-format +msgid " %s Missing \"%s\" translation string for option %s." +msgstr "" + +#, c-format +msgid " %s Missing %s file \"%s\"." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageRegion option.\n" +" REF: Page 100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" %s Missing REQUIRED PageSize option.\n" +" REF: Page 99, section 5.14." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s Missing cupsUIResolver %s" +msgstr "" + +#, c-format +msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"." +msgstr "" + +#, c-format +msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"" +msgstr "" + +#, c-format +msgid " %s No base translation \"%s\" is included in file." +msgstr "" + +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None.\n" +" REF: Page 122, section 5.17" +msgstr "" + +#, c-format +msgid " %s Size \"%s\" defined for %s but not for %s." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" has unexpected dimensions (%gx%g)." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be \"%s\"." +msgstr "" + +#, c-format +msgid " %s Size \"%s\" should be the Adobe standard name \"%s\"." +msgstr "" + +#, c-format +msgid " %s cupsICCProfile %s hash value collides with %s." +msgstr "" + +#, c-format +msgid " %s cupsUIResolver %s causes a loop." +msgstr "" + +#, c-format +msgid "" +" %s cupsUIResolver %s does not list at least two different options." +msgstr "" + +#, c-format +msgid " **FAIL** %s choice names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID\n" +" REF: Page 72, section 5.5" +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s\n" +" REF: Page 102, section 5.15." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1." +msgstr "" + +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1." +msgstr "" + +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad %s choice %s\n" +" REF: Page 84, section 5.9" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1." +msgstr "" + +#, c-format +msgid " **FAIL** Bad LanguageVersion %s - must be English." +msgstr "" + +#, c-format +msgid " **FAIL** Default option code cannot be interpreted: %s" +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s choice %s contains " +"8-bit characters." +msgstr "" + +#, c-format +msgid "" +" **FAIL** Default translation string for option %s contains 8-bit " +"characters." +msgstr "" + +#, c-format +msgid " **FAIL** Group names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid " **FAIL** Multiple occurrences of %s choice name %s." +msgstr "" + +#, c-format +msgid " **FAIL** Option names %s and %s differ only by case." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14." +msgstr "" + +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14." +msgstr "" + +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15." +msgstr "" + +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3." +msgstr "" + +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3." +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s" +msgstr "" + +#, c-format +msgid " **FAIL** Unable to open PPD file - %s on line %d." +msgstr "" + +#, c-format +msgid " %d ERRORS FOUND" +msgstr "" + +msgid " -h Show program usage" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d.\n" +" REF: Page 39, %%%%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Page: on line %d.\n" +" REF: Page 53, %%%%Page:" +msgstr "" + +#, c-format +msgid "" +" Bad %%%%Pages: on line %d.\n" +" REF: Page 43, %%%%Pages:" +msgstr "" + +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d).\n" +" REF: Page 25, Line Length" +msgstr "" + +msgid "" +" Missing %!PS-Adobe-3.0 on first line.\n" +" REF: Page 17, 3.1 Conforming Documents" +msgstr "" + +#, c-format +msgid " Missing %%EndComments comment. REF: Page 41, %%EndComments" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment.\n" +" REF: Page 39, %%BoundingBox:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Page: comments.\n" +" REF: Page 53, %%Page:" +msgstr "" + +#, c-format +msgid "" +" Missing or bad %%Pages: comment.\n" +" REF: Page 43, %%Pages:" +msgstr "" + +msgid " NO ERRORS FOUND" +msgstr "" + +#, c-format +msgid " Saw %d lines that exceeded 255 characters." +msgstr "" + +#, c-format +msgid " Too many %%BeginDocument comments." +msgstr "" + +#, c-format +msgid " Too many %%EndDocument comments." +msgstr "" + +msgid " Warning: file contains binary data." +msgstr "" + +#, c-format +msgid " Warning: no %%EndComments comment in file." +msgstr "" + +#, c-format +msgid " Warning: obsolete DSC version %.1f in file." +msgstr "" + +msgid " --[no-]debug-logging Turn debug logging on/off." +msgstr "" + +msgid " --[no-]remote-admin Turn remote administration on/off." +msgstr "" + +msgid " --[no-]remote-any Allow/prevent access from the Internet." +msgstr "" + +msgid " --[no-]remote-printers Show/hide remote printers." +msgstr "" + +msgid " --[no-]share-printers Turn printer sharing on/off." +msgstr "" + +msgid " --[no-]user-cancel-any Allow/prevent users to cancel any job." +msgstr "" + +msgid " --cr End lines with CR (Mac OS 9)." +msgstr "" + +msgid " --crlf End lines with CR + LF (Windows)." +msgstr "" + +msgid " --lf End lines with LF (UNIX/Linux/Mac OS X)." +msgstr "" + +msgid " -4 Connect using IPv4." +msgstr "" + +msgid " -6 Connect using IPv6." +msgstr "" + +msgid " -C Send requests using chunking (default)." +msgstr "" + +msgid " -D Remove the input file when finished." +msgstr "" + +msgid " -D name=value Set named variable to value." +msgstr "" + +msgid " -E Enable encryption." +msgstr "" + +msgid " -E Encrypt the connection to the server." +msgstr "" + +msgid " -E Test with TLS encryption." +msgstr "" + +msgid "" +" -F Run in the foreground but detach from console." +msgstr "" + +msgid " -H samba-server Use the named SAMBA server." +msgstr "" + +msgid " -I Ignore errors." +msgstr "" + +msgid " -I include-dir Add include directory to search path." +msgstr "" + +msgid " -I {filename,filters,none,profiles}" +msgstr "" + +msgid " -J title Set title." +msgstr "" + +msgid " -L Send requests using content-length." +msgstr "" + +msgid " -P filename.ppd Set PPD file." +msgstr "" + +msgid " -R root-directory Set alternate root." +msgstr "" + +msgid " -S Test with SSL encryption." +msgstr "" + +msgid " -T Set the receive/send timeout in seconds." +msgstr "" + +msgid " -U samba-user Authenticate using the named SAMBA user." +msgstr "" + +msgid " -U username Set username for job." +msgstr "" + +msgid " -U username Specify username." +msgstr "" + +msgid " -V version Set default IPP version." +msgstr "" + +msgid "" +" -W {all,none,constraints,defaults,duplex,filters,profiles,sizes," +"translations}" +msgstr "" + +msgid " -X Produce XML plist instead of plain text." +msgstr "" + +msgid " -a Export all printers." +msgstr "" + +msgid " -a 'name=value ...' Set option(s)." +msgstr "" + +msgid " -c catalog.po Load the specified message catalog." +msgstr "" + +msgid " -c config-file Load alternate configuration file." +msgstr "" + +msgid " -c copies Set number of copies." +msgstr "" + +msgid " -c cupsd.conf Set cupsd.conf file to use." +msgstr "" + +msgid " -d name=value Set named variable to value." +msgstr "" + +msgid " -d output-dir Specify the output directory." +msgstr "" + +msgid " -d printer Use the named printer." +msgstr "" + +msgid " -e Use every filter from the PPD file." +msgstr "" + +msgid " -f Run in the foreground." +msgstr "" + +msgid " -f filename Set default request filename." +msgstr "" + +msgid " -f filename Set file to be converted (otherwise stdin)." +msgstr "" + +msgid " -h Show this usage message." +msgstr "" + +msgid " -h cups-server Use the named CUPS server." +msgstr "" + +msgid " -h server[:port] Specify server address." +msgstr "" + +msgid " -i mime/type Set input MIME type (otherwise auto-typed)." +msgstr "" + +msgid "" +" -i seconds Repeat the last file with the given time interval." +msgstr "" + +msgid "" +" -j job-id[,N] Filter file N from the specified job (default is " +"file 1)." +msgstr "" + +msgid "" +" -j mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -l Run cupsd from launchd(8)." +msgstr "" + +msgid " -l lang[,lang,...] Specify the output language(s) (locale)." +msgstr "" + +msgid " -m Use the ModelName value as the filename." +msgstr "" + +msgid "" +" -m mime/type Set output MIME type (otherwise application/pdf)." +msgstr "" + +msgid " -n copies Set number of copies." +msgstr "" + +msgid "" +" -n count Repeat the last file the given number of times." +msgstr "" + +msgid " -o filename Set file to be generated (otherwise stdout)." +msgstr "" + +msgid "" +" -o filename.drv Set driver information file (otherwise ppdi.drv)." +msgstr "" + +msgid " -o filename.ppd[.gz] Set output file (otherwise stdout)." +msgstr "" + +msgid " -o name=value Set option(s)." +msgstr "" + +msgid " -p filename.ppd Set PPD file." +msgstr "" + +msgid " -q Be quiet - no output except errors." +msgstr "" + +msgid " -q Run silently." +msgstr "" + +msgid " -r Use 'relaxed' open mode." +msgstr "" + +msgid " -t Produce a test report." +msgstr "" + +msgid " -t Test PPDs instead of generating them." +msgstr "" + +msgid " -t Test the configuration file." +msgstr "" + +msgid " -t title Set title." +msgstr "" + +msgid " -u Remove the PPD file when finished." +msgstr "" + +msgid " -v Be slightly verbose." +msgstr "" + +msgid " -v Be verbose (more v's for more verbosity)." +msgstr "" + +msgid " -v Be verbose (show commands)." +msgstr "" + +msgid " -v Show all attributes sent and received." +msgstr "" + +msgid " -vv Be very verbose." +msgstr "" + +msgid " -z Compress PPD files using GNU zip." +msgstr "" + +msgid " FAIL" +msgstr "" + +msgid " PASS" +msgstr "" + +#, c-format +msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes" +msgstr "" + +#, c-format +msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes" +msgstr "" + +#, c-format +msgid "%.0f x %.0f millimeters" +msgstr "%.0f x %.0f 公釐" + +#, c-format +msgid "%.0f x %.0f to %.0f x %.0f millimeters" +msgstr "%.0f x %.0f to %.0f x %.0f 公釐" + +#, c-format +msgid "%.2f x %.2f inches" +msgstr "%.2f x %.2f 英吋" + +#, c-format +msgid "%.2f x %.2f to %.2f x %.2f inches" +msgstr "%.2f x %.2f to %.2f x %.2f 英吋" + +#, c-format +msgid "%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s cannot be changed." +msgstr "無法更改 %s。" + +#, c-format +msgid "%s is not implemented by the CUPS version of lpc." +msgstr "" + +#, c-format +msgid "%s is not ready" +msgstr "" + +#, c-format +msgid "%s is ready" +msgstr "" + +#, c-format +msgid "%s is ready and printing" +msgstr "" + +#, c-format +msgid "%s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s not supported." +msgstr "" + +#, c-format +msgid "%s/%s accepting requests since %s" +msgstr "" + +#, c-format +msgid "%s/%s not accepting requests since %s -" +msgstr "" + +#, c-format +msgid "%s: %-33.33s [job %d localhost]" +msgstr "" + +#. TRANSLATORS: Message is "subject: error" +#, c-format +msgid "%s: %s" +msgstr "" + +#, c-format +msgid "%s: %s failed: %s" +msgstr "" + +#, c-format +msgid "%s: Don't know what to do." +msgstr "" + +#, c-format +msgid "" +"%s: Error - %s environment variable names non-existent destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - bad job ID." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print files and alter jobs simultaneously." +msgstr "" + +#, c-format +msgid "%s: Error - cannot print from stdin if files or a job ID are provided." +msgstr "" + +#, c-format +msgid "%s: Error - expected character set after \"-S\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected content type after \"-T\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-#\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected copies after \"-n\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-b\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected destination after \"-d\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected form after \"-f\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hold name after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-H\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected hostname after \"-h\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected mode list after \"-y\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected name after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected option=value after \"-o\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected page list after \"-P\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected priority after \"-%c\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected reason text after \"-r\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected title after \"-t\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-U\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected username after \"-u\" option." +msgstr "" + +#, c-format +msgid "%s: Error - expected value after \"-%c\" option." +msgstr "" + +#, c-format +msgid "" +"%s: Error - need \"completed\", \"not-completed\", or \"all\" after \"-W\" " +"option." +msgstr "" + +#, c-format +msgid "%s: Error - no default destination available." +msgstr "" + +#, c-format +msgid "%s: Error - priority must be between 1 and 100." +msgstr "" + +#, c-format +msgid "%s: Error - scheduler not responding." +msgstr "" + +#, c-format +msgid "%s: Error - too many files - \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unable to access \"%s\" - %s" +msgstr "" + +#, c-format +msgid "%s: Error - unable to queue from stdin - %s." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown destination \"%s/%s\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Error - unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Expected job ID after \"-i\" option." +msgstr "" + +#, c-format +msgid "%s: Invalid destination name in list \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Invalid filter string \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Need job ID (\"-i jobid\") before \"-H restart\"." +msgstr "" + +#, c-format +msgid "%s: No filter to convert from %s/%s to %s/%s." +msgstr "" + +#, c-format +msgid "%s: Operation failed: %s" +msgstr "" + +#, c-format +msgid "%s: Sorry, no encryption support." +msgstr "" + +#, c-format +msgid "%s: Unable to connect to server." +msgstr "" + +#, c-format +msgid "%s: Unable to contact server." +msgstr "" + +#, c-format +msgid "%s: Unable to determine MIME type of \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "%s: Unable to open PPD file: %s on line %d." +msgstr "" + +#, c-format +msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination \"%s\"." +msgstr "" + +#, c-format +msgid "%s: Unknown destination MIME type %s/%s." +msgstr "" + +#, c-format +msgid "%s: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "%s: Unknown source MIME type %s/%s." +msgstr "" + +#, c-format +msgid "" +"%s: Warning - \"%c\" format modifier not supported - output may not be " +"correct." +msgstr "" + +#, c-format +msgid "%s: Warning - character set option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - content type option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - form option ignored." +msgstr "" + +#, c-format +msgid "%s: Warning - mode option ignored." +msgstr "" + +msgid "-1" +msgstr "-1" + +msgid "-10" +msgstr "-10" + +msgid "-100" +msgstr "-100" + +msgid "-105" +msgstr "-105" + +msgid "-11" +msgstr "-11" + +msgid "-110" +msgstr "-110" + +msgid "-115" +msgstr "-115" + +msgid "-12" +msgstr "-12" + +msgid "-120" +msgstr "-120" + +msgid "-13" +msgstr "-13" + +msgid "-14" +msgstr "-14" + +msgid "-15" +msgstr "-15" + +msgid "-2" +msgstr "-2" + +msgid "-20" +msgstr "-20" + +msgid "-25" +msgstr "-25" + +msgid "-3" +msgstr "-3" + +msgid "-30" +msgstr "-30" + +msgid "-35" +msgstr "-35" + +msgid "-4" +msgstr "-4" + +msgid "-40" +msgstr "-40" + +msgid "-45" +msgstr "-45" + +msgid "-5" +msgstr "-5" + +msgid "-50" +msgstr "-50" + +msgid "-55" +msgstr "-55" + +msgid "-6" +msgstr "-6" + +msgid "-60" +msgstr "-60" + +msgid "-65" +msgstr "-65" + +msgid "-7" +msgstr "-7" + +msgid "-70" +msgstr "-70" + +msgid "-75" +msgstr "-75" + +msgid "-8" +msgstr "-8" + +msgid "-80" +msgstr "-80" + +msgid "-85" +msgstr "-85" + +msgid "-9" +msgstr "-9" + +msgid "-90" +msgstr "-90" + +msgid "-95" +msgstr "-95" + +msgid "0" +msgstr "0" + +msgid "1" +msgstr "1" + +msgid "1 inch/sec." +msgstr "1 英吋∕秒" + +msgid "1.25x0.25\"" +msgstr "1.25x0.25\"" + +msgid "1.25x2.25\"" +msgstr "1.25x2.25\"" + +msgid "1.5 inch/sec." +msgstr "1.5 英吋∕秒" + +msgid "1.50x0.25\"" +msgstr "1.50x0.25\"" + +msgid "1.50x0.50\"" +msgstr "1.50x0.50\"" + +msgid "1.50x1.00\"" +msgstr "1.50x1.00\"" + +msgid "1.50x2.00\"" +msgstr "1.50x2.00\"" + +msgid "10" +msgstr "10" + +msgid "10 inches/sec." +msgstr "10 英吋∕秒" + +msgid "10 x 11" +msgstr "" + +msgid "10 x 13" +msgstr "" + +msgid "10 x 14" +msgstr "" + +msgid "100" +msgstr "100" + +msgid "100 mm/sec." +msgstr "100 公釐∕秒" + +msgid "105" +msgstr "105" + +msgid "11" +msgstr "11" + +msgid "11 inches/sec." +msgstr "11 英吋∕秒" + +msgid "110" +msgstr "110" + +msgid "115" +msgstr "115" + +msgid "12" +msgstr "12" + +msgid "12 inches/sec." +msgstr "12 英吋∕秒" + +msgid "12 x 11" +msgstr "" + +msgid "120" +msgstr "120" + +msgid "120 mm/sec." +msgstr "120 公釐∕秒" + +msgid "120x60dpi" +msgstr "120x60dpi" + +msgid "120x72dpi" +msgstr "120x72dpi" + +msgid "13" +msgstr "13" + +msgid "136dpi" +msgstr "136dpi" + +msgid "14" +msgstr "14" + +msgid "15" +msgstr "15" + +msgid "15 mm/sec." +msgstr "15 公釐∕秒" + +msgid "15 x 11" +msgstr "" + +msgid "150 mm/sec." +msgstr "150 公釐∕秒" + +msgid "150dpi" +msgstr "150dpi" + +msgid "16" +msgstr "16" + +msgid "17" +msgstr "17" + +msgid "18" +msgstr "18" + +msgid "180dpi" +msgstr "180dpi" + +msgid "19" +msgstr "19" + +msgid "2" +msgstr "2" + +msgid "2 inches/sec." +msgstr "2 英吋∕秒" + +msgid "2-Sided Printing" +msgstr "雙面列印" + +msgid "2.00x0.37\"" +msgstr "2.00x0.37\"" + +msgid "2.00x0.50\"" +msgstr "2.00x0.50\"" + +msgid "2.00x1.00\"" +msgstr "2.00x1.00\"" + +msgid "2.00x1.25\"" +msgstr "2.00x1.25\"" + +msgid "2.00x2.00\"" +msgstr "2.00x2.00\"" + +msgid "2.00x3.00\"" +msgstr "2.00x3.00\"" + +msgid "2.00x4.00\"" +msgstr "2.00x4.00\"" + +msgid "2.00x5.50\"" +msgstr "2.00x5.50\"" + +msgid "2.25x0.50\"" +msgstr "2.25x0.50\"" + +msgid "2.25x1.25\"" +msgstr "2.25x1.25\"" + +msgid "2.25x4.00\"" +msgstr "2.25x4.00\"" + +msgid "2.25x5.50\"" +msgstr "2.25x5.50\"" + +msgid "2.38x5.50\"" +msgstr "2.38x5.50\"" + +msgid "2.5 inches/sec." +msgstr "2.5 英吋∕秒" + +msgid "2.50x1.00\"" +msgstr "2.50x1.00\"" + +msgid "2.50x2.00\"" +msgstr "2.50x2.00\"" + +msgid "2.75x1.25\"" +msgstr "2.75x1.25\"" + +msgid "2.9 x 1\"" +msgstr "2.9 x 1\"" + +msgid "20" +msgstr "20" + +msgid "20 mm/sec." +msgstr "20 公釐∕秒" + +msgid "200 mm/sec." +msgstr "200 公釐∕秒" + +msgid "203dpi" +msgstr "203dpi" + +msgid "21" +msgstr "21" + +msgid "22" +msgstr "22" + +msgid "23" +msgstr "23" + +msgid "24" +msgstr "24" + +msgid "24-Pin Series" +msgstr "24-Pin 系列" + +msgid "240x72dpi" +msgstr "240x72dpi" + +msgid "25" +msgstr "25" + +msgid "250 mm/sec." +msgstr "250 公釐∕秒" + +msgid "26" +msgstr "26" + +msgid "27" +msgstr "27" + +msgid "28" +msgstr "28" + +msgid "29" +msgstr "29" + +msgid "3" +msgstr "3" + +msgid "3 inches/sec." +msgstr "3 英吋∕秒" + +msgid "3 x 5" +msgstr "" + +msgid "3.00x1.00\"" +msgstr "3.00x1.00\"" + +msgid "3.00x1.25\"" +msgstr "3.00x1.25\"" + +msgid "3.00x2.00\"" +msgstr "3.00x2.00\"" + +msgid "3.00x3.00\"" +msgstr "3.00x3.00\"" + +msgid "3.00x5.00\"" +msgstr "3.00x5.00\"" + +msgid "3.25x2.00\"" +msgstr "3.25x2.00\"" + +msgid "3.25x5.00\"" +msgstr "3.25x5.00\"" + +msgid "3.25x5.50\"" +msgstr "3.25x5.50\"" + +msgid "3.25x5.83\"" +msgstr "3.25x5.83\"" + +msgid "3.25x7.83\"" +msgstr "3.25x7.83\"" + +msgid "3.5 x 5" +msgstr "" + +msgid "3.5\" Disk" +msgstr "3.5 吋磁碟" + +msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" +msgstr "3.5 吋磁碟 - 2 1/8 x 2 3/4\"" + +msgid "3.50x1.00\"" +msgstr "3.50x1.00\"" + +msgid "30" +msgstr "30" + +msgid "30 mm/sec." +msgstr "30 公釐∕秒" + +msgid "300 mm/sec." +msgstr "300 公釐∕秒" + +msgid "300dpi" +msgstr "300dpi" + +msgid "35" +msgstr "35" + +msgid "360dpi" +msgstr "360dpi" + +msgid "360x180dpi" +msgstr "360x180dpi" + +msgid "4" +msgstr "4" + +msgid "4 inches/sec." +msgstr "4 英吋∕秒" + +msgid "4.00x1.00\"" +msgstr "4.00x1.00\"" + +msgid "4.00x13.00\"" +msgstr "4.00x13.00\"" + +msgid "4.00x2.00\"" +msgstr "4.00x2.00\"" + +msgid "4.00x2.50\"" +msgstr "4.00x2.50\"" + +msgid "4.00x3.00\"" +msgstr "4.00x3.00\"" + +msgid "4.00x4.00\"" +msgstr "4.00x4.00\"" + +msgid "4.00x5.00\"" +msgstr "4.00x5.00\"" + +msgid "4.00x6.00\"" +msgstr "4.00x6.00\"" + +msgid "4.00x6.50\"" +msgstr "4.00x6.50\"" + +msgid "40" +msgstr "40" + +msgid "40 mm/sec." +msgstr "40 公釐∕秒" + +msgid "45" +msgstr "45" + +msgid "5" +msgstr "5" + +msgid "5 inches/sec." +msgstr "5 英吋∕秒" + +msgid "5 x 7" +msgstr "" + +msgid "50" +msgstr "50" + +msgid "55" +msgstr "55" + +msgid "6" +msgstr "6" + +msgid "6 inches/sec." +msgstr "6 英吋∕秒" + +msgid "6.00x1.00\"" +msgstr "6.00x1.00\"" + +msgid "6.00x2.00\"" +msgstr "6.00x2.00\"" + +msgid "6.00x3.00\"" +msgstr "6.00x3.00\"" + +msgid "6.00x4.00\"" +msgstr "6.00x4.00\"" + +msgid "6.00x5.00\"" +msgstr "6.00x5.00\"" + +msgid "6.00x6.00\"" +msgstr "6.00x6.00\"" + +msgid "6.00x6.50\"" +msgstr "6.00x6.50\"" + +msgid "60" +msgstr "60" + +msgid "60 mm/sec." +msgstr "60 公釐∕秒" + +msgid "600dpi" +msgstr "600dpi" + +msgid "60dpi" +msgstr "60dpi" + +msgid "60x72dpi" +msgstr "" + +msgid "65" +msgstr "65" + +msgid "7" +msgstr "7" + +msgid "7 inches/sec." +msgstr "7 英吋∕秒" + +msgid "7 x 9" +msgstr "" + +msgid "70" +msgstr "70" + +msgid "720dpi" +msgstr "720dpi" + +msgid "75" +msgstr "75" + +msgid "8" +msgstr "8" + +msgid "8 inches/sec." +msgstr "8 英吋∕秒" + +msgid "8 x 10" +msgstr "" + +msgid "8.00x1.00\"" +msgstr "8.00x1.00\"" + +msgid "8.00x2.00\"" +msgstr "8.00x2.00\"" + +msgid "8.00x3.00\"" +msgstr "8.00x3.00\"" + +msgid "8.00x4.00\"" +msgstr "8.00x4.00\"" + +msgid "8.00x5.00\"" +msgstr "8.00x5.00\"" + +msgid "8.00x6.00\"" +msgstr "8.00x6.00\"" + +msgid "8.00x6.50\"" +msgstr "8.00x6.50\"" + +msgid "80" +msgstr "80" + +msgid "80 mm/sec." +msgstr "80 公釐∕秒" + +msgid "85" +msgstr "85" + +msgid "9" +msgstr "9" + +msgid "9 inches/sec." +msgstr "9 英吋∕秒" + +msgid "9 x 11" +msgstr "" + +msgid "9 x 12" +msgstr "" + +msgid "9-Pin Series" +msgstr "9-Pin 系列" + +msgid "90" +msgstr "90" + +msgid "95" +msgstr "95" + +msgid "?Invalid help command unknown." +msgstr "" + +msgid "A Samba password is required to export printer drivers" +msgstr "" + +msgid "A Samba username is required to export printer drivers" +msgstr "" + +#, c-format +msgid "A class named \"%s\" already exists." +msgstr "" + +#, c-format +msgid "A printer named \"%s\" already exists." +msgstr "" + +msgid "A0" +msgstr "A0" + +msgid "A0 Long Edge" +msgstr "" + +msgid "A1" +msgstr "A1" + +msgid "A1 Long Edge" +msgstr "" + +msgid "A10" +msgstr "A10" + +msgid "A2" +msgstr "A2" + +msgid "A2 Long Edge" +msgstr "" + +msgid "A3" +msgstr "A3" + +msgid "A3 Long Edge" +msgstr "" + +msgid "A3 Oversize" +msgstr "" + +msgid "A3 Oversize Long Edge" +msgstr "" + +msgid "A4" +msgstr "A4" + +msgid "A4 Long Edge" +msgstr "" + +msgid "A4 Oversize" +msgstr "" + +msgid "A4 Small" +msgstr "" + +msgid "A5" +msgstr "A5" + +msgid "A5 Long Edge" +msgstr "" + +msgid "A5 Oversize" +msgstr "" + +msgid "A6" +msgstr "A6" + +msgid "A6 Long Edge" +msgstr "" + +msgid "A7" +msgstr "A7" + +msgid "A8" +msgstr "A8" + +msgid "A9" +msgstr "A9" + +msgid "ANSI A" +msgstr "ANSI A" + +msgid "ANSI B" +msgstr "ANSI B" + +msgid "ANSI C" +msgstr "ANSI C" + +msgid "ANSI D" +msgstr "ANSI D" + +msgid "ANSI E" +msgstr "ANSI E" + +msgid "ARCH C" +msgstr "ARCH C" + +msgid "ARCH C Long Edge" +msgstr "" + +msgid "ARCH D" +msgstr "ARCH D" + +msgid "ARCH D Long Edge" +msgstr "" + +msgid "ARCH E" +msgstr "ARCH E" + +msgid "ARCH E Long Edge" +msgstr "" + +msgid "Accept Jobs" +msgstr "接受作業" + +msgid "Accepted" +msgstr "已接受" + +msgid "Add Class" +msgstr "加入類別" + +msgid "Add Printer" +msgstr "新增印表機" + +msgid "Add RSS Subscription" +msgstr "新增 RSS 訂閱" + +msgid "Address" +msgstr "地址" + +msgid "Address - 1 1/8 x 3 1/2\"" +msgstr "地址 - 1 1/8 x 3 1/2\"" + +msgid "Administration" +msgstr "管理" + +msgid "Always" +msgstr "總是" + +msgid "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +msgid "Applicator" +msgstr "噴頭" + +#, c-format +msgid "Attempt to set %s printer-state to bad value %d." +msgstr "" + +#, c-format +msgid "Attribute groups are out of order (%x < %x)." +msgstr "" + +msgid "B0" +msgstr "B0" + +msgid "B1" +msgstr "B1" + +msgid "B10" +msgstr "B10" + +msgid "B2" +msgstr "B2" + +msgid "B3" +msgstr "B3" + +msgid "B4" +msgstr "B4" + +msgid "B5" +msgstr "B5" + +msgid "B5 Oversize" +msgstr "" + +msgid "B6" +msgstr "B6" + +msgid "B7" +msgstr "B7" + +msgid "B8" +msgstr "B8" + +msgid "B9" +msgstr "B9" + +msgid "Bad NULL dests pointer" +msgstr "NULL dests 指標錯誤" + +msgid "Bad OpenGroup" +msgstr "OpenGroup 錯誤" + +msgid "Bad OpenUI/JCLOpenUI" +msgstr "OpenUI/JCLOpenUI 錯誤" + +msgid "Bad OrderDependency" +msgstr "OrderDependency 錯誤" + +msgid "Bad PPD cache file." +msgstr "" + +msgid "Bad Request" +msgstr "請求錯誤" + +msgid "Bad SNMP version number" +msgstr "SNMP 版本號碼錯誤" + +msgid "Bad UIConstraints" +msgstr "UIConstraints 錯誤" + +#, c-format +msgid "Bad charset file \"%s\"." +msgstr "" + +#, c-format +msgid "Bad charset type: %s" +msgstr "" + +#, c-format +msgid "Bad columns value %d." +msgstr "" + +#, c-format +msgid "Bad copies value %d." +msgstr "列印份數值 %d 錯誤。" + +#, c-format +msgid "Bad cpi value %f." +msgstr "" + +msgid "Bad custom parameter" +msgstr "自定參數錯誤" + +#, c-format +msgid "Bad device-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad device-uri scheme \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Bad document-format-default \"%s\"." +msgstr "" + +msgid "Bad filename buffer" +msgstr "" + +#, c-format +msgid "Bad font description line \"%s\"." +msgstr "" + +#, c-format +msgid "Bad font description line: %s" +msgstr "" + +msgid "Bad job-priority value." +msgstr "" + +#, c-format +msgid "Bad job-sheets value \"%s\"." +msgstr "" + +msgid "Bad job-sheets value type." +msgstr "" + +msgid "Bad job-state value." +msgstr "" + +#, c-format +msgid "Bad job-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad lpi value %f." +msgstr "" + +#, c-format +msgid "Bad notify-pull-method \"%s\"." +msgstr "" + +#, c-format +msgid "Bad notify-recipient-uri \"%s\"." +msgstr "" + +#, c-format +msgid "Bad number-up value %d." +msgstr "number-up 值 %d 錯誤。" + +#, c-format +msgid "Bad option + choice on line %d." +msgstr "" + +#, c-format +msgid "Bad page-ranges values %d-%d." +msgstr "page-ranges 值 %d-%d 錯誤。" + +#, c-format +msgid "Bad port-monitor \"%s\"." +msgstr "" + +#, c-format +msgid "Bad printer-state value %d." +msgstr "" + +#, c-format +msgid "Bad request ID %d." +msgstr "" + +#, c-format +msgid "Bad request version number %d.%d." +msgstr "" + +msgid "Bad subscription ID" +msgstr "" + +#, c-format +msgid "Bad text direction \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text direction: %s" +msgstr "" + +#, c-format +msgid "Bad text width \"%s\"." +msgstr "" + +#, c-format +msgid "Bad text width: %s" +msgstr "" + +msgid "Bad value string" +msgstr "" + +msgid "Banners" +msgstr "標語" + +msgid "Billing Information: " +msgstr "帳單資訊:" + +msgid "Bond Paper" +msgstr "證券紙" + +#, c-format +msgid "Boolean expected for waiteof option \"%s\"." +msgstr "" + +msgid "Buffer overflow detected, aborting." +msgstr "" + +msgid "CMYK" +msgstr "CMYK" + +msgid "CPCL Label Printer" +msgstr "CPCL 標籤印表機" + +msgid "Cancel RSS Subscription" +msgstr "取消 RSS 訂閱" + +msgid "Canceling print job." +msgstr "" + +msgid "Cannot share a remote Kerberized printer." +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Change Settings" +msgstr "更改設定" + +#, c-format +msgid "Character set \"%s\" not supported." +msgstr "" + +msgid "Classes" +msgstr "類別" + +msgid "Clean Print Heads" +msgstr "乾淨的列印頭" + +msgid "Close-Job doesn't support the job-uri attribute." +msgstr "" + +msgid "Color" +msgstr "顏色" + +msgid "Color Mode" +msgstr "顏色模式" + +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?" +msgstr "" + +msgid "Community name uses indefinite length" +msgstr "社群名稱使用的長度不確定" + +msgid "Connected to printer." +msgstr "" + +msgid "Connecting to printer." +msgstr "" + +msgid "Continue" +msgstr "繼續" + +msgid "Continuous" +msgstr "連續" + +msgid "Control file sent successfully." +msgstr "" + +msgid "Copying print data." +msgstr "" + +msgid "Created" +msgstr "已製作" + +msgid "Created On: " +msgstr "製作日期:" + +msgid "Custom" +msgstr "自定" + +msgid "CustominCutInterval" +msgstr "CustominCutInterval" + +msgid "CustominTearInterval" +msgstr "CustominTearInterval" + +msgid "Cut" +msgstr "剪下" + +msgid "Cutter" +msgstr "剪下程式" + +msgid "Dark" +msgstr "暗" + +msgid "Darkness" +msgstr "暗" + +msgid "Data file sent successfully." +msgstr "" + +msgid "Delete Class" +msgstr "刪除類別" + +msgid "Delete Printer" +msgstr "刪除印表機" + +msgid "Description: " +msgstr "描述:" + +msgid "DeskJet Series" +msgstr "DeskJet 系列" + +#, c-format +msgid "Destination \"%s\" is not accepting jobs." +msgstr "目的地“%s”不接受作業。" + +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s" +msgstr "" + +msgid "Direct Thermal Media" +msgstr "直接熱感媒體" + +#, c-format +msgid "Directory \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "Directory \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "Directory \"%s\" is a file." +msgstr "" + +#, c-format +msgid "Directory \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "Directory \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "Disabled" +msgstr "已停用" + +#, c-format +msgid "Document #%d does not exist in job #%d." +msgstr "" + +msgid "Driver Name: " +msgstr "驅動程式名稱:" + +msgid "Driver Version: " +msgstr "驅動程式版本:" + +msgid "Duplexer" +msgstr "Duplexer" + +msgid "Dymo" +msgstr "Dymo" + +msgid "EPL1 Label Printer" +msgstr "EPL1 標籤印表機" + +msgid "EPL2 Label Printer" +msgstr "EPL2 標籤印表機" + +msgid "Edit Configuration File" +msgstr "編輯配置檔案" + +msgid "Empty PPD file." +msgstr "" + +#. TRANSLATORS: Banner/cover sheet after the print job. +msgid "Ending Banner" +msgstr "結束標語" + +msgid "English" +msgstr "" + +msgid "Enter old password:" +msgstr "輸入新密碼:" + +msgid "Enter password again:" +msgstr "請再輸入密碼:" + +msgid "Enter password:" +msgstr "輸入密碼:" + +msgid "" +"Enter your username and password or the root username and password to access " +"this page. If you are using Kerberos authentication, make sure you have a " +"valid Kerberos ticket." +msgstr "" +"請輸入您的使用者名稱和密碼或 root 使用者名稱和密碼來存取此頁面。如果您是使用 " +"Kerberos 認證,請確定具備有效的 Kerberos 票券。" + +msgid "Envelope #10 " +msgstr "" + +msgid "Envelope #11" +msgstr "" + +msgid "Envelope #12" +msgstr "" + +msgid "Envelope #14" +msgstr "" + +msgid "Envelope #9" +msgstr "" + +msgid "Envelope B4" +msgstr "" + +msgid "Envelope B5" +msgstr "" + +msgid "Envelope B6" +msgstr "" + +msgid "Envelope C0" +msgstr "" + +msgid "Envelope C1" +msgstr "" + +msgid "Envelope C2" +msgstr "" + +msgid "Envelope C3" +msgstr "" + +msgid "Envelope C4" +msgstr "" + +msgid "Envelope C5" +msgstr "" + +msgid "Envelope C6" +msgstr "" + +msgid "Envelope C65" +msgstr "" + +msgid "Envelope C7" +msgstr "" + +msgid "Envelope Choukei 3" +msgstr "" + +msgid "Envelope Choukei 3 Long Edge" +msgstr "" + +msgid "Envelope Choukei 4" +msgstr "" + +msgid "Envelope Choukei 4 Long Edge" +msgstr "" + +msgid "Envelope DL" +msgstr "" + +msgid "Envelope Feed" +msgstr "信封送紙器" + +msgid "Envelope Invite" +msgstr "" + +msgid "Envelope Italian" +msgstr "" + +msgid "Envelope Kaku2" +msgstr "" + +msgid "Envelope Kaku2 Long Edge" +msgstr "" + +msgid "Envelope Kaku3" +msgstr "" + +msgid "Envelope Kaku3 Long Edge" +msgstr "" + +msgid "Envelope Monarch" +msgstr "" + +msgid "Envelope PRC1 " +msgstr "" + +msgid "Envelope PRC1 Long Edge" +msgstr "" + +msgid "Envelope PRC10" +msgstr "" + +msgid "Envelope PRC10 Long Edge" +msgstr "" + +msgid "Envelope PRC2" +msgstr "" + +msgid "Envelope PRC2 Long Edge" +msgstr "" + +msgid "Envelope PRC3" +msgstr "" + +msgid "Envelope PRC3 Long Edge" +msgstr "" + +msgid "Envelope PRC4" +msgstr "" + +msgid "Envelope PRC4 Long Edge" +msgstr "" + +msgid "Envelope PRC5 Long Edge" +msgstr "" + +msgid "Envelope PRC5PRC5" +msgstr "" + +msgid "Envelope PRC6" +msgstr "" + +msgid "Envelope PRC6 Long Edge" +msgstr "" + +msgid "Envelope PRC7" +msgstr "" + +msgid "Envelope PRC7 Long Edge" +msgstr "" + +msgid "Envelope PRC8" +msgstr "" + +msgid "Envelope PRC8 Long Edge" +msgstr "" + +msgid "Envelope PRC9" +msgstr "" + +msgid "Envelope PRC9 Long Edge" +msgstr "" + +msgid "Envelope Personal" +msgstr "" + +msgid "Envelope You4" +msgstr "" + +msgid "Envelope You4 Long Edge" +msgstr "" + +msgid "Epson" +msgstr "Epson" + +msgid "Error Policy" +msgstr "錯誤的原則" + +msgid "Error sending raster data." +msgstr "" + +msgid "Error: need hostname after \"-h\" option." +msgstr "" + +msgid "Every 10 Labels" +msgstr "每 10 個標籤" + +msgid "Every 2 Labels" +msgstr "每 2 個標籤" + +msgid "Every 3 Labels" +msgstr "每 3 個標籤" + +msgid "Every 4 Labels" +msgstr "每 4 個標籤" + +msgid "Every 5 Labels" +msgstr "每 5 個標籤" + +msgid "Every 6 Labels" +msgstr "每 6 個標籤" + +msgid "Every 7 Labels" +msgstr "每 7 個標籤" + +msgid "Every 8 Labels" +msgstr "每 8 個標籤" + +msgid "Every 9 Labels" +msgstr "每 9 個標籤" + +msgid "Every Label" +msgstr "每一個標籤" + +msgid "Executive" +msgstr "" + +msgid "Expectation Failed" +msgstr "與預期不符" + +msgid "Export Printers to Samba" +msgstr "將印表機輸出至 Samba" + +msgid "FAIL" +msgstr "" + +msgid "FanFold German" +msgstr "" + +msgid "FanFold Legal German" +msgstr "" + +msgid "Fanfold US" +msgstr "" + +#, c-format +msgid "File \"%s\" contains a relative path." +msgstr "" + +#, c-format +msgid "File \"%s\" has insecure permissions (0%o/uid=%d/gid=%d)." +msgstr "" + +#, c-format +msgid "File \"%s\" is a directory." +msgstr "" + +#, c-format +msgid "File \"%s\" not available: %s" +msgstr "" + +#, c-format +msgid "File \"%s\" permissions OK (0%o/uid=%d/gid=%d)." +msgstr "" + +msgid "File Folder" +msgstr "檔案夾" + +msgid "File Folder - 9/16 x 3 7/16\"" +msgstr "檔案夾 - 9/16 x 3 7/16\"" + +#, c-format +msgid "" +"File device URIs have been disabled. To enable, see the FileDevice directive " +"in \"%s/cupsd.conf\"." +msgstr "" + +#, c-format +msgid "Finished page %d." +msgstr "" + +msgid "Folio" +msgstr "對開紙" + +msgid "Forbidden" +msgstr "已禁止" + +#, c-format +msgid "Formatting page %d." +msgstr "" + +msgid "General" +msgstr "一般" + +msgid "Generic" +msgstr "通用" + +msgid "Get-Response-PDU uses indefinite length" +msgstr "Get-Response-PDU 使用的長度不確定" + +msgid "Glossy Paper" +msgstr "鏡面紙" + +msgid "Got a printer-uri attribute but no job-id." +msgstr "" + +msgid "Grayscale" +msgstr "灰階" + +msgid "HP" +msgstr "HP" + +msgid "Hanging Folder" +msgstr "懸掛的檔案夾" + +msgid "Hanging Folder - 9/16 x 2\"" +msgstr "懸掛的檔案夾 - 9/16 x 2\"" + +msgid "IPP 1setOf attribute with incompatible value tags." +msgstr "" + +msgid "IPP attribute has no name." +msgstr "" + +msgid "IPP begCollection value not 0 bytes." +msgstr "" + +msgid "IPP boolean value not 1 byte." +msgstr "" + +msgid "IPP date value not 11 bytes." +msgstr "" + +msgid "IPP endCollection value not 0 bytes." +msgstr "" + +msgid "IPP enum value not 4 bytes." +msgstr "" + +msgid "IPP integer value not 4 bytes." +msgstr "" + +msgid "IPP language length overflows value." +msgstr "" + +msgid "IPP member name is not empty." +msgstr "" + +msgid "IPP name larger than 32767 bytes." +msgstr "" + +msgid "IPP nameWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP rangeOfInteger value not 8 bytes." +msgstr "" + +msgid "IPP resolution value not 9 bytes." +msgstr "" + +msgid "IPP string length overflows value." +msgstr "" + +msgid "IPP textWithLanguage value less than minimum 4 bytes." +msgstr "" + +msgid "IPP value larger than 32767 bytes." +msgstr "" + +msgid "ISOLatin1" +msgstr "UTF-8" + +msgid "Illegal control character" +msgstr "不合法的控制字元" + +msgid "Illegal main keyword string" +msgstr "不合法的主要關鍵字串" + +msgid "Illegal option keyword string" +msgstr "不合法的選項關鍵字串" + +msgid "Illegal translation string" +msgstr "不合法的轉換字串" + +msgid "Illegal whitespace character" +msgstr "不合法的空白字元" + +msgid "Installable Options" +msgstr "可安裝的選項" + +msgid "Installed" +msgstr "已安裝" + +msgid "IntelliBar Label Printer" +msgstr "IntelliBar 標籤印表機" + +msgid "Intellitech" +msgstr "Intellitech" + +msgid "Internal Server Error" +msgstr "" + +msgid "Internal error" +msgstr "內部錯誤" + +msgid "Internet Postage 2-Part" +msgstr "Internet Postage 2-Part" + +msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" +msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +msgid "Internet Postage 3-Part" +msgstr "Internet Postage 3-Part" + +msgid "Internet Postage 3-Part - 2 1/4 x 7\"" +msgstr "Internet Postage 3-Part - 2 1/4 x 7\"" + +msgid "Internet Printing Protocol" +msgstr "Internet 列印通訊協定" + +#, c-format +msgid "Invalid printer command \"%s\"." +msgstr "" + +msgid "JCL" +msgstr "JCL" + +msgid "JIS B0" +msgstr "" + +msgid "JIS B1" +msgstr "" + +msgid "JIS B10" +msgstr "" + +msgid "JIS B2" +msgstr "" + +msgid "JIS B3" +msgstr "" + +msgid "JIS B4" +msgstr "" + +msgid "JIS B4 Long Edge" +msgstr "" + +msgid "JIS B5" +msgstr "" + +msgid "JIS B5 Long Edge" +msgstr "" + +msgid "JIS B6" +msgstr "" + +msgid "JIS B6 Long Edge" +msgstr "" + +msgid "JIS B7" +msgstr "" + +msgid "JIS B8" +msgstr "" + +msgid "JIS B9" +msgstr "" + +#, c-format +msgid "Job #%d cannot be restarted - no files." +msgstr "" + +#, c-format +msgid "Job #%d does not exist." +msgstr "" + +#, c-format +msgid "Job #%d is already aborted - can't cancel." +msgstr "已中止作業 #%d - 無法取消。" + +#, c-format +msgid "Job #%d is already canceled - can't cancel." +msgstr "已取消作業 #%d - 無法取消。" + +#, c-format +msgid "Job #%d is already completed - can't cancel." +msgstr "已完成作業 #%d - 無法取消。" + +#, c-format +msgid "Job #%d is finished and cannot be altered." +msgstr "" + +#, c-format +msgid "Job #%d is not complete." +msgstr "" + +#, c-format +msgid "Job #%d is not held for authentication." +msgstr "" + +#, c-format +msgid "Job #%d is not held." +msgstr "" + +msgid "Job Completed" +msgstr "已完成作業" + +msgid "Job Created" +msgstr "已建立作業" + +msgid "Job ID: " +msgstr "作業 ID:" + +msgid "Job Options Changed" +msgstr "已更改作業選項" + +msgid "Job Stopped" +msgstr "已停止作業" + +msgid "Job UUID: " +msgstr "作業 UUID:" + +msgid "Job is completed and cannot be changed." +msgstr "作業已完成且無法更改。" + +msgid "Job operation failed:" +msgstr "作業操作失敗:" + +msgid "Job state cannot be changed." +msgstr "無法更改作業狀態。" + +msgid "Job subscriptions cannot be renewed." +msgstr "" + +msgid "Jobs" +msgstr "作業" + +msgid "LPD/LPR Host or Printer" +msgstr "LPD/LPR 主機或印表機" + +msgid "Label Printer" +msgstr "標籤印表機" + +msgid "Label Top" +msgstr "標籤頂端" + +#, c-format +msgid "Language \"%s\" not supported." +msgstr "" + +msgid "Large Address" +msgstr "大型地址" + +msgid "Large Address - 1 4/10 x 3 1/2\"" +msgstr "大型地址 - 1 4/10 x 3 1/2\"" + +msgid "LaserJet Series PCL 4/5" +msgstr "LaserJet 系列 PCL 4/5" + +msgid "Letter Oversize" +msgstr "" + +msgid "Letter Oversize Long Edge" +msgstr "" + +msgid "Light" +msgstr "不明顯" + +msgid "Line longer than the maximum allowed (255 characters)" +msgstr "允許行長度大於最大值(255 個字元)" + +msgid "List Available Printers" +msgstr "列出可用印表機" + +msgid "Loading print file." +msgstr "" + +msgid "Location: " +msgstr "位置:" + +msgid "Long-Edge (Portrait)" +msgstr "沿長邊(直式)" + +msgid "Looking for printer." +msgstr "" + +msgid "Make and Model: " +msgstr "製造和型號:" + +msgid "Manual Feed" +msgstr "手動送紙" + +msgid "Media Dimensions: " +msgstr "媒體尺寸:" + +msgid "Media Limits: " +msgstr "媒體限制:" + +msgid "Media Name: " +msgstr "媒體名稱:" + +msgid "Media Size" +msgstr "媒體大小" + +msgid "Media Source" +msgstr "媒體來源" + +msgid "Media Tracking" +msgstr "媒體軌跡" + +msgid "Media Type" +msgstr "媒體類型" + +msgid "Medium" +msgstr "中" + +msgid "Memory allocation error" +msgstr "記憶體分配錯誤" + +msgid "Missing CloseGroup" +msgstr "" + +msgid "Missing PPD-Adobe-4.x header" +msgstr "遺失 PPD-Adobe-4.x 標題" + +msgid "Missing asterisk in column 1" +msgstr "直欄 1 中遺失星號" + +msgid "Missing document-number attribute." +msgstr "" + +#, c-format +msgid "Missing double quote on line %d." +msgstr "" + +msgid "Missing form variable" +msgstr "" + +msgid "Missing last-document attribute in request." +msgstr "" + +msgid "Missing media or media-col." +msgstr "" + +msgid "Missing media-size in media-col." +msgstr "" + +msgid "Missing notify-subscription-ids attribute." +msgstr "" + +msgid "Missing option keyword" +msgstr "" + +msgid "Missing requesting-user-name attribute." +msgstr "" + +msgid "Missing required attributes." +msgstr "" + +#, c-format +msgid "Missing value on line %d of banner file." +msgstr "" + +#, c-format +msgid "Missing value on line %d." +msgstr "" + +msgid "Missing value string" +msgstr "遺失值字串" + +msgid "Missing x-dimension in media-size." +msgstr "" + +msgid "Missing y-dimension in media-size." +msgstr "" + +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s" +msgstr "" + +msgid "Modify Class" +msgstr "修改類別" + +msgid "Modify Printer" +msgstr "修改印表機" + +msgid "Move All Jobs" +msgstr "移動所有作業" + +msgid "Move Job" +msgstr "移動作業" + +msgid "Moved Permanently" +msgstr "永久地移動" + +msgid "NULL PPD file pointer" +msgstr "NULL PPD 檔案指標" + +msgid "Name OID uses indefinite length" +msgstr "名稱 OID 使用的長度不確定" + +msgid "Nested classes are not allowed." +msgstr "" + +msgid "Never" +msgstr "永不" + +msgid "New Stylus Color Series" +msgstr "新 Stylus Color 系列" + +msgid "New Stylus Photo Series" +msgstr "新 Stylus Photo 系列" + +msgid "No" +msgstr "否" + +msgid "No Content" +msgstr "無內容" + +msgid "No PPD name" +msgstr "" + +msgid "No VarBind SEQUENCE" +msgstr "沒有 VarBind SEQUENCE" + +msgid "No Windows printer drivers are installed." +msgstr "" + +msgid "No active connection" +msgstr "沒有已啟用的連線" + +#, c-format +msgid "No active jobs on %s." +msgstr "" + +msgid "No attributes in request." +msgstr "" + +msgid "No authentication information provided." +msgstr "" + +msgid "No community name" +msgstr "沒有社群名稱" + +msgid "No default printer." +msgstr "" + +msgid "No destinations added." +msgstr "未加入目的地。" + +msgid "No device URI found in argv[0] or in DEVICE_URI environment variable." +msgstr "" + +msgid "No error-index" +msgstr "沒有錯誤索引" + +msgid "No error-status" +msgstr "沒有錯誤狀態" + +msgid "No file in print request." +msgstr "" + +msgid "No fonts in charset file." +msgstr "" + +msgid "No modification time" +msgstr "" + +msgid "No name OID" +msgstr "沒有名稱 OID" + +msgid "No pages were found." +msgstr "" + +msgid "No printer name" +msgstr "" + +msgid "No printer-uri found" +msgstr "" + +msgid "No printer-uri found for class" +msgstr "" + +msgid "No printer-uri in request." +msgstr "" + +msgid "No request-id" +msgstr "沒有 request-id" + +msgid "No subscription attributes in request." +msgstr "" + +msgid "No subscriptions found." +msgstr "找不到訂閱。" + +msgid "No variable-bindings SEQUENCE" +msgstr "沒有 variable-bindings SEQUENCE" + +msgid "No version number" +msgstr "沒有版本號碼" + +msgid "Non-continuous (Mark sensing)" +msgstr "不連續(標示感應)" + +msgid "Non-continuous (Web sensing)" +msgstr "不連續(Web 感應)" + +msgid "Normal" +msgstr "正常" + +msgid "Not Found" +msgstr "找不到" + +msgid "Not Implemented" +msgstr "尚未完成" + +msgid "Not Installed" +msgstr "尚未安裝" + +msgid "Not Modified" +msgstr "尚未修改" + +msgid "Not Supported" +msgstr "不受支援" + +msgid "Not allowed to print." +msgstr "不允許列印。" + +msgid "Note" +msgstr "注意" + +msgid "" +"Note: this program only validates the DSC comments, not the PostScript " +"itself." +msgstr "" + +msgid "OK" +msgstr "確定" + +msgid "Off (1-Sided)" +msgstr "關(單面)" + +msgid "Oki" +msgstr "Oki" + +msgid "Online Help" +msgstr "線上輔助說明" + +#, c-format +msgid "Open of %s failed: %s" +msgstr "打開 %s 失敗:%s" + +msgid "OpenGroup without a CloseGroup first" +msgstr "OpenGroup 之前沒有先 CloseGroup" + +msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" +msgstr "OpenUI/JCLOpenUI 之前沒有先 CloseUI/JCLCloseUI" + +msgid "Operation Policy" +msgstr "操作政策" + +#, c-format +msgid "Option \"%s\" cannot be included via %%%%IncludeFeature." +msgstr "" + +msgid "Options Installed" +msgstr "已安裝的選項" + +msgid "Options:" +msgstr "" + +msgid "Options: " +msgstr "選項:" + +msgid "Out of date PPD cache file." +msgstr "" + +msgid "Out of memory." +msgstr "" + +msgid "Output Mode" +msgstr "輸出模式" + +#, c-format +msgid "Output for printer %s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s is sent to remote printer %s on %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to %s" +msgstr "" + +#, c-format +msgid "Output for printer %s/%s is sent to remote printer %s on %s" +msgstr "" + +msgid "PASS" +msgstr "" + +msgid "PCL Laser Printer" +msgstr "PCL 雷射印表機" + +msgid "PRC16K" +msgstr "PRC16K" + +msgid "PRC16K Long Edge" +msgstr "" + +msgid "PRC32K" +msgstr "PRC32K" + +msgid "PRC32K Long Edge" +msgstr "" + +msgid "PRC32K Oversize" +msgstr "" + +msgid "PRC32K Oversize Long Edge" +msgstr "" + +msgid "Packet does not contain a Get-Response-PDU" +msgstr "封包不包含 Get-Response-PDU" + +msgid "Packet does not start with SEQUENCE" +msgstr "封包不是以 SEQUENCE 開頭" + +msgid "ParamCustominCutInterval" +msgstr "ParamCustominCutInterval" + +msgid "ParamCustominTearInterval" +msgstr "ParamCustominTearInterval" + +#, c-format +msgid "Password for %s on %s? " +msgstr "需要 %s(位於 %s 上)的密碼?" + +#, c-format +msgid "Password for %s required to access %s via SAMBA: " +msgstr "需要 %s 的密碼才能透過 SAMBA 存取 %s:" + +msgid "Pause Class" +msgstr "暫停類別" + +msgid "Pause Printer" +msgstr "暫停印表機" + +msgid "Peel-Off" +msgstr "去皮" + +msgid "Photo" +msgstr "照片" + +msgid "Photo Labels" +msgstr "照片標籤" + +msgid "Plain Paper" +msgstr "一般紙張" + +msgid "Policies" +msgstr "政策" + +msgid "Port Monitor" +msgstr "連接埠監視器" + +msgid "PostScript Printer" +msgstr "PostScript 印表機" + +msgid "Postcard" +msgstr "明信片" + +msgid "Postcard Double " +msgstr "" + +msgid "Postcard Double Long Edge" +msgstr "" + +msgid "Postcard Long Edge" +msgstr "" + +msgid "Print Density" +msgstr "列印密度" + +msgid "Print Job:" +msgstr "列印作業:" + +msgid "Print Mode" +msgstr "列印模式" + +msgid "Print Rate" +msgstr "列印速率" + +msgid "Print Self-Test Page" +msgstr "列印自我測試頁面" + +msgid "Print Speed" +msgstr "列印速度" + +msgid "Print Test Page" +msgstr "列印測試頁面" + +msgid "Print and Cut" +msgstr "列印並剪下" + +msgid "Print and Tear" +msgstr "列印並撕開" + +#, c-format +msgid "Print file accepted - job ID %d." +msgstr "" + +msgid "Print file accepted - job ID unknown." +msgstr "" + +msgid "Print file sent." +msgstr "" + +msgid "Print file was not accepted." +msgstr "" + +msgid "Print job too large." +msgstr "" + +msgid "Printed For: " +msgstr "列印對象:" + +msgid "Printed From: " +msgstr "列印自:" + +msgid "Printed On: " +msgstr "列印日期:" + +msgid "Printer Added" +msgstr "已加入印表機" + +msgid "Printer Default" +msgstr "預設印表機" + +msgid "Printer Deleted" +msgstr "已刪除印表機" + +msgid "Printer Modified" +msgstr "已修改印表機" + +msgid "Printer Name: " +msgstr "印表機名稱:" + +msgid "Printer Paused" +msgstr "印表機已暫停" + +msgid "Printer Settings" +msgstr "印表機設定" + +msgid "Printer busy, will retry in 10 seconds." +msgstr "" + +msgid "Printer busy; will retry in 30 seconds." +msgstr "" + +msgid "Printer did not respond." +msgstr "" + +#, c-format +msgid "Printer does not support IPP/%d.%d, trying IPP/%s." +msgstr "" + +msgid "Printer is busy, will retry in 5 seconds." +msgstr "" + +msgid "Printer is not currently connected." +msgstr "" + +msgid "Printer is now connected." +msgstr "" + +msgid "Printer is now online." +msgstr "" + +msgid "Printer is offline." +msgstr "" + +msgid "Printer not connected, will retry in 30 seconds." +msgstr "" + +msgid "Printer not connected; will retry in 30 seconds." +msgstr "" + +msgid "Printer:" +msgstr "印表機:" + +msgid "Printers" +msgstr "印表機" + +#, c-format +msgid "Printing page %d, %d%% complete." +msgstr "" + +#, c-format +msgid "Printing page %d." +msgstr "" + +msgid "Purge Jobs" +msgstr "清除作業" + +msgid "Quarto" +msgstr "四開紙" + +msgid "Quota limit reached." +msgstr "已達到四開紙限制。" + +msgid "Rank Owner Job File(s) Total Size" +msgstr "" + +#. TRANSLATORS: Pri is job priority. +msgid "" +"Rank Owner Pri Job Files Total Size" +msgstr "" + +msgid "Ready to print." +msgstr "" + +msgid "Reject Jobs" +msgstr "退出作業" + +#, c-format +msgid "Remote host did not accept control file (%d)." +msgstr "" + +#, c-format +msgid "Remote host did not accept data file (%d)." +msgstr "" + +msgid "Reprint After Error" +msgstr "發生錯誤後重新列印" + +msgid "Request Entity Too Large" +msgstr "請求的實體過大" + +msgid "Resolution" +msgstr "解析度" + +msgid "Resume Class" +msgstr "繼續類別" + +msgid "Resume Printer" +msgstr "繼續印表機" + +msgid "Return Address" +msgstr "寄件人地址" + +msgid "Return Address - 3/4 x 2\"" +msgstr "寄件人地址 - 3/4 x 2\"" + +msgid "Rewind" +msgstr "倒轉" + +#, c-format +msgid "Running command: %s %s -N -A %s -c '%s'" +msgstr "" + +msgid "SEQUENCE uses indefinite length" +msgstr "SEQUENCE 使用的長度不確定" + +msgid "SSL/TLS Negotiation Error" +msgstr "" + +msgid "See Other" +msgstr "參閱其他" + +msgid "Sending data to printer." +msgstr "" + +#, c-format +msgid "Serial Port #%d" +msgstr "序列埠 #%d" + +msgid "Server Restarted" +msgstr "重新啟動伺服器" + +msgid "Server Security Auditing" +msgstr "伺服器安全性審定" + +msgid "Server Started" +msgstr "已啟動伺服器" + +msgid "Server Stopped" +msgstr "已停止伺服器" + +msgid "Service Unavailable" +msgstr "服務無法使用" + +msgid "Set Allowed Users" +msgstr "設定允許的使用者" + +msgid "Set As Server Default" +msgstr "設為伺服器預設值" + +msgid "Set Class Options" +msgstr "設定類別選項" + +msgid "Set Printer Options" +msgstr "設定印表機選項" + +msgid "Set Publishing" +msgstr "設定發佈" + +msgid "Shipping Address" +msgstr "運送地址" + +msgid "Shipping Address - 2 5/16 x 4\"" +msgstr "運送地址 - 2 5/16 x 4\"" + +msgid "Short-Edge (Landscape)" +msgstr "沿短邊(橫式)" + +msgid "Special Paper" +msgstr "特殊紙張" + +#, c-format +msgid "Spooling job, %.0f%% complete." +msgstr "" + +msgid "Standard" +msgstr "標準" + +#. TRANSLATORS: Banner/cover sheet before the print job. +msgid "Starting Banner" +msgstr "起始標語" + +#, c-format +msgid "Starting page %d." +msgstr "" + +msgid "Statement" +msgstr "敘述" + +msgid "Stylus Color Series" +msgstr "Stylus Color 系列" + +msgid "Stylus Photo Series" +msgstr "Stylus Photo 系列" + +#, c-format +msgid "Subscription #%d does not exist." +msgstr "" + +msgid "Super A" +msgstr "Super A" + +msgid "Super B" +msgstr "Super B" + +msgid "Super B/A3" +msgstr "Super B/A3" + +msgid "Switching Protocols" +msgstr "切換通訊協定" + +msgid "Tabloid" +msgstr "小報用紙(Tabloid)" + +msgid "Tabloid Oversize" +msgstr "" + +msgid "Tabloid Oversize Long Edge" +msgstr "" + +msgid "Tear" +msgstr "撕開" + +msgid "Tear-Off" +msgstr "撕下" + +msgid "Tear-Off Adjust Position" +msgstr "撕下調整位置" + +#, c-format +msgid "The %s attribute cannot be provided with job-ids." +msgstr "" + +#, c-format +msgid "The PPD file \"%s\" could not be found." +msgstr "找不到 PPD 檔案“%s”。" + +#, c-format +msgid "The PPD file \"%s\" could not be opened: %s" +msgstr "無法打開 PPD 檔案“%s”:%s" + +msgid "The PPD file could not be opened." +msgstr "" + +msgid "" +"The class name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"類別名稱只能包含最多 127 個可列印字元,而且不能包含空格、斜線(/)或井字號" +"(#)。" + +msgid "The developer unit needs to be replaced." +msgstr "" + +msgid "The developer unit will need to be replaced soon." +msgstr "" + +msgid "The fuser's temperature is high." +msgstr "" + +msgid "The fuser's temperature is low." +msgstr "" + +msgid "" +"The notify-lease-duration attribute cannot be used with job subscriptions." +msgstr "notify-lease-duration 屬性不能與作業訂閱搭配使用。" + +#, c-format +msgid "The notify-user-data value is too large (%d > 63 octets)." +msgstr "" + +msgid "The optical photoconductor needs to be replaced." +msgstr "" + +msgid "The optical photoconductor will need to be replaced soon." +msgstr "" + +msgid "The output bin is almost full." +msgstr "" + +msgid "The output bin is full." +msgstr "" + +msgid "The output bin is missing." +msgstr "" + +msgid "The page setup information was not valid." +msgstr "" + +msgid "The paper tray is almost empty." +msgstr "" + +msgid "The paper tray is empty." +msgstr "" + +msgid "The paper tray is missing." +msgstr "" + +msgid "The paper tray needs to be filled." +msgstr "" + +msgid "The print file could not be opened." +msgstr "" + +msgid "The printer URI is incorrect or no longer exists." +msgstr "" + +msgid "The printer is busy." +msgstr "" + +msgid "The printer is not connected." +msgstr "" + +msgid "The printer is not responding." +msgstr "" + +msgid "The printer is out of ink." +msgstr "" + +msgid "The printer is running low on ink." +msgstr "" + +msgid "The printer is running low on toner." +msgstr "" + +msgid "The printer is unreachable at this time." +msgstr "" + +msgid "The printer may be out of toner." +msgstr "" + +msgid "The printer may not exist or is unavailable at this time." +msgstr "" + +msgid "" +"The printer name may only contain up to 127 printable characters and may not " +"contain spaces, slashes (/), or the pound sign (#)." +msgstr "" +"印表機名稱只能包含最多 127 個可列印的字元,而且不能包含空格、斜線(/)或井字" +"號(#)。" + +msgid "The printer or class does not exist." +msgstr "" + +msgid "The printer or class is not shared." +msgstr "" + +msgid "The printer's cover is open." +msgstr "" + +msgid "The printer's door is open." +msgstr "" + +msgid "The printer's interlock is open." +msgstr "" + +msgid "The printer's waste bin is almost full." +msgstr "" + +msgid "The printer's waste bin is full." +msgstr "" + +#, c-format +msgid "The printer-uri \"%s\" contains invalid characters." +msgstr "printer-uri“%s”包含無效的字元。" + +msgid "The printer-uri attribute is required." +msgstr "" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." +msgstr "printer-uri 格式必須為“ipp://HOSTNAME/classes/CLASSNAME”。" + +msgid "" +"The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." +msgstr "printer-uri 格式必須為“ipp://HOSTNAME/printers/PRINTERNAME”。" + +msgid "" +"The subscription name may not contain spaces, slashes (/), question marks " +"(?), or the pound sign (#)." +msgstr "訂閱名稱不能包含空格、斜線(/)、問號(?)或井字號(#)。" + +msgid "" +"The web interface is currently disabled. Run \"cupsctl WebInterface=yes\" to " +"enable it." +msgstr "" + +#, c-format +msgid "The which-jobs value \"%s\" is not supported." +msgstr "" + +msgid "There are too many subscriptions." +msgstr "訂閱數量太多。" + +msgid "There is a paper jam." +msgstr "" + +msgid "There was an unrecoverable USB error." +msgstr "" + +msgid "Thermal Transfer Media" +msgstr "熱感傳送媒體" + +msgid "Title: " +msgstr "標題:" + +msgid "Too many active jobs." +msgstr "已啟用的作業太多。" + +#, c-format +msgid "Too many job-sheets values (%d > 2)." +msgstr "" + +#, c-format +msgid "Too many printer-state-reasons values (%d > %d)." +msgstr "" + +msgid "Transparency" +msgstr "透明度" + +msgid "Tray" +msgstr "裝紙匣" + +msgid "Tray 1" +msgstr "裝紙匣 1" + +msgid "Tray 2" +msgstr "裝紙匣 2" + +msgid "Tray 3" +msgstr "裝紙匣 3" + +msgid "Tray 4" +msgstr "裝紙匣 4" + +msgid "URI Too Long" +msgstr "URI 太長" + +msgid "US Ledger" +msgstr "美式帳目報表紙(US Ledger)" + +msgid "US Legal" +msgstr "美式法定紙(US Legal)" + +msgid "US Legal Oversize" +msgstr "" + +msgid "US Letter" +msgstr "美式信紙(US Letter)" + +msgid "US Letter Long Edge" +msgstr "" + +msgid "US Letter Oversize" +msgstr "" + +msgid "US Letter Oversize Long Edge" +msgstr "" + +msgid "US Letter Small" +msgstr "" + +#, c-format +msgid "USB Serial Port #%d" +msgstr "USB 序列埠 #%d" + +msgid "Unable to access cupsd.conf file:" +msgstr "無法存取 cupsd.conf 檔案:" + +msgid "Unable to add RSS subscription:" +msgstr "無法加入 RSS 訂閱:" + +msgid "Unable to add class:" +msgstr "無法加入類別:" + +msgid "Unable to add document to print job." +msgstr "" + +#, c-format +msgid "Unable to add job for destination \"%s\"." +msgstr "" + +msgid "Unable to add printer:" +msgstr "無法新增印表機:" + +msgid "Unable to allocate memory for file types." +msgstr "" + +msgid "Unable to allocate memory for page info" +msgstr "" + +msgid "Unable to allocate memory for pages array" +msgstr "" + +msgid "Unable to cancel RSS subscription:" +msgstr "無法取消 RSS 訂閱:" + +msgid "Unable to cancel print job." +msgstr "" + +msgid "Unable to change printer-is-shared attribute:" +msgstr "無法更改 printer-is-shared 屬性:" + +msgid "Unable to change printer:" +msgstr "無法更改印表機:" + +msgid "Unable to change server settings:" +msgstr "無法更改伺服器設定:" + +msgid "Unable to configure printer options." +msgstr "" + +msgid "Unable to connect to host." +msgstr "無法連接主機。" + +msgid "Unable to contact printer, queuing on next printer in class." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy 64-bit Windows printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy CUPS printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy PPD file - %s" +msgstr "" + +msgid "Unable to copy PPD file." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to copy interface script - %s" +msgstr "" + +msgid "Unable to copy print file" +msgstr "" + +msgid "Unable to create compressed print file" +msgstr "" + +msgid "Unable to create pipes for filters" +msgstr "" + +msgid "Unable to create printer-uri" +msgstr "" + +msgid "Unable to create temporary file" +msgstr "" + +msgid "Unable to create temporary file:" +msgstr "無法製作暫存檔:" + +msgid "Unable to delete class:" +msgstr "無法刪除類別:" + +msgid "Unable to delete printer:" +msgstr "無法刪除印表機:" + +msgid "Unable to do maintenance command:" +msgstr "無法執行維護指令:" + +msgid "Unable to edit cupsd.conf files larger than 1MB" +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate chain invalid)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (certificate not yet valid)." +msgstr "" + +msgid "Unable to establish a secure connection to host (expired certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host (host name mismatch)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (peer dropped connection " +"before responding)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (self-signed certificate)." +msgstr "" + +msgid "" +"Unable to establish a secure connection to host (untrusted certificate)." +msgstr "" + +msgid "Unable to establish a secure connection to host." +msgstr "" + +msgid "Unable to find destination for job" +msgstr "" + +msgid "Unable to find printer." +msgstr "" + +msgid "Unable to fork filter" +msgstr "" + +msgid "Unable to generate compressed print file" +msgstr "" + +msgid "Unable to get backend exit status." +msgstr "" + +msgid "Unable to get class list:" +msgstr "無法取得類別列表:" + +msgid "Unable to get class status:" +msgstr "無法取得類別狀態:" + +msgid "Unable to get list of printer drivers:" +msgstr "無法取得印表機驅動程式的列表:" + +msgid "Unable to get printer attributes:" +msgstr "無法取得印表機屬性:" + +msgid "Unable to get printer list:" +msgstr "無法取得印表機列表:" + +msgid "Unable to get printer status." +msgstr "" + +msgid "Unable to get printer status:" +msgstr "無法取得印表機狀態:" + +#, c-format +msgid "Unable to install Windows 2000 printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to install Windows 9x printer driver files (%d)." +msgstr "" + +#, c-format +msgid "Unable to locate printer \"%s\"." +msgstr "" + +msgid "Unable to locate printer." +msgstr "" + +msgid "Unable to modify class:" +msgstr "無法修改類別:" + +msgid "Unable to modify printer:" +msgstr "無法修改印表機:" + +msgid "Unable to move job" +msgstr "無法移動作業" + +msgid "Unable to move jobs" +msgstr "無法移動作業" + +msgid "Unable to open PPD file" +msgstr "無法打開 PPD 檔案" + +msgid "Unable to open PPD file:" +msgstr "無法打開 PPD 檔案:" + +msgid "Unable to open charset file" +msgstr "" + +msgid "Unable to open compressed print file" +msgstr "" + +msgid "Unable to open cupsd.conf file:" +msgstr "無法打開 cupsd.conf 檔案:" + +msgid "Unable to open device file" +msgstr "" + +#, c-format +msgid "Unable to open document #%d in job #%d." +msgstr "" + +msgid "Unable to open print file" +msgstr "" + +msgid "Unable to open psglyphs" +msgstr "" + +msgid "Unable to open raster file" +msgstr "" + +#, c-format +msgid "Unable to print %d text columns." +msgstr "" + +#, c-format +msgid "Unable to print %dx%d text page." +msgstr "" + +msgid "Unable to print test page:" +msgstr "無法列印測試頁面:" + +msgid "Unable to read print data" +msgstr "" + +msgid "Unable to read print data." +msgstr "" + +#, c-format +msgid "Unable to run \"%s\": %s" +msgstr "" + +msgid "Unable to see in file" +msgstr "" + +msgid "Unable to send command to printer driver" +msgstr "" + +msgid "Unable to send data to printer." +msgstr "" + +msgid "Unable to send raster data to the driver." +msgstr "" + +#, c-format +msgid "Unable to set Windows printer driver (%d)." +msgstr "" + +msgid "Unable to set options:" +msgstr "無法設定選項:" + +msgid "Unable to set server default:" +msgstr "無法設定伺服器預設值:" + +msgid "Unable to start backend process." +msgstr "" + +msgid "Unable to upload cupsd.conf file:" +msgstr "無法上傳 cupsd.conf 檔案:" + +msgid "Unable to use legacy USB class driver." +msgstr "" + +msgid "Unable to write print data" +msgstr "" + +#, c-format +msgid "Unable to write uncompressed print data: %s" +msgstr "" + +msgid "Unauthorized" +msgstr "未授權" + +msgid "Units" +msgstr "單位" + +msgid "Unknown" +msgstr "未知" + +#, c-format +msgid "Unknown choice \"%s\" for option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown encryption option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown file order: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown format character: \"%c\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\" with value \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown print mode: \"%s\"." +msgstr "" + +#, c-format +msgid "Unknown printer-error-policy \"%s\"." +msgstr "未知的 printer-error-policy“%s”。" + +#, c-format +msgid "Unknown printer-op-policy \"%s\"." +msgstr "未知的 printer-op-policy“%s”。" + +#, c-format +msgid "Unknown version option value: \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported baud rate: %s" +msgstr "" + +#, c-format +msgid "Unsupported brightness value %s, using brightness=100." +msgstr "" + +#, c-format +msgid "Unsupported character set \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported compression \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported document-format \"%s/%s\"." +msgstr "" + +#, c-format +msgid "Unsupported format \"%s\"." +msgstr "" + +#, c-format +msgid "Unsupported gamma value %s, using gamma=1000." +msgstr "" + +msgid "Unsupported margins." +msgstr "" + +msgid "Unsupported media value." +msgstr "" + +#, c-format +msgid "Unsupported number-up value %d, using number-up=1." +msgstr "" + +#, c-format +msgid "Unsupported number-up-layout value %s, using number-up-layout=lrtb." +msgstr "" + +#, c-format +msgid "Unsupported page-border value %s, using page-border=none." +msgstr "" + +msgid "Unsupported raster data." +msgstr "" + +msgid "Unsupported value type" +msgstr "不受支援的值類型" + +msgid "Upgrade Required" +msgstr "需要升級" + +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]" +msgstr "" + +#, c-format +msgid "Usage: %s job user title copies options [filename]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options [file]" +msgstr "" + +#, c-format +msgid "Usage: %s job-id user title copies options file" +msgstr "" + +msgid "Usage: convert [ options ]" +msgstr "" + +msgid "Usage: cupsaddsmb [options] printer1 ... printerN" +msgstr "" + +msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]" +msgstr "" + +msgid "Usage: cupsd [options]" +msgstr "" + +msgid "Usage: cupsfilter [ options ] filename" +msgstr "" + +msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]" +msgstr "" + +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]" +msgstr "" + +msgid "Usage: ipptool [options] URI filename [ ... filenameN ]" +msgstr "" + +msgid "Usage: lpmove job/src dest" +msgstr "" + +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer" +msgstr "" + +msgid "Usage: lppasswd [-g groupname]" +msgstr "" + +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]" +msgstr "" + +msgid "" +"Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]" +msgstr "" + +msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: ppdhtml [options] filename.drv >filename.html" +msgstr "" + +msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]" +msgstr "" + +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]" +msgstr "" + +msgid "Usage: snmp [host-or-ip-address]" +msgstr "" + +msgid "Value uses indefinite length" +msgstr "值使用的長度不確定" + +msgid "VarBind uses indefinite length" +msgstr "VarBind 使用的長度不確定" + +msgid "Version uses indefinite length" +msgstr "版本使用的長度不確定" + +msgid "Waiting for job to complete." +msgstr "" + +msgid "Waiting for printer to become available." +msgstr "" + +msgid "Waiting for printer to finish." +msgstr "" + +msgid "Warning, no Windows 2000 printer drivers are installed." +msgstr "" + +msgid "Web Interface is Disabled" +msgstr "" + +msgid "Yes" +msgstr "是" + +#, c-format +msgid "" +"You must access this page using the URL https://%" +"s:%d%s." +msgstr "" +"您必須使用 URL https://%s:%d%s 存取此頁面。" + +msgid "" +"Your password must be at least 6 characters long, cannot contain your " +"username, and must contain at least one letter and number." +msgstr "" + +msgid "ZPL Label Printer" +msgstr "ZPL 標籤印表機" + +msgid "Zebra" +msgstr "Zebra" + +msgid "aborted" +msgstr "已中止" + +msgid "canceled" +msgstr "已取消" + +msgid "completed" +msgstr "已完成" + +msgid "convert: Use the -f option to specify a file to convert." +msgstr "" + +msgid "cups-deviced failed to execute." +msgstr "無法執行 cups-deviced。" + +msgid "cups-driverd failed to execute." +msgstr "無法執行 cups-driverd。" + +#, c-format +msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s" +msgstr "" + +msgid "cupsctl: Cannot set Listen or Port directly." +msgstr "" + +#, c-format +msgid "cupsctl: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"%s\"" +msgstr "" + +#, c-format +msgid "cupsctl: Unknown option \"-%c\"" +msgstr "" + +msgid "cupsd: Expected config filename after \"-c\" option." +msgstr "" + +msgid "cupsd: Unable to get current directory." +msgstr "" + +#, c-format +msgid "cupsd: Unknown argument \"%s\" - aborting." +msgstr "" + +#, c-format +msgid "cupsd: Unknown option \"%c\" - aborting." +msgstr "" + +msgid "cupsd: launchd(8) support not compiled in, running in normal mode." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid document number %d." +msgstr "" + +#, c-format +msgid "cupsfilter: Invalid job ID %d." +msgstr "" + +msgid "cupsfilter: Only one filename can be specified." +msgstr "" + +#, c-format +msgid "cupsfilter: Unable to get job file - %s" +msgstr "" + +msgid "cupstestppd: The -q option is incompatible with the -v option." +msgstr "" + +msgid "cupstestppd: The -v option is incompatible with the -q option." +msgstr "" + +#, c-format +msgid "device for %s/%s: %s" +msgstr "" + +#, c-format +msgid "device for %s: %s" +msgstr "" + +msgid "error-index uses indefinite length" +msgstr "error-index 使用的長度不確定" + +msgid "error-status uses indefinite length" +msgstr "error-status 使用的長度不確定" + +msgid "held" +msgstr "暫停" + +msgid "help\t\tGet help on commands." +msgstr "" + +msgid "idle" +msgstr "閒置" + +msgid "ipptool: \"-i\" and \"-n\" are incompatible with -X\"." +msgstr "" + +msgid "ipptool: \"-i\" is incompatible with \"-X\"." +msgstr "" + +msgid "ipptool: \"-n\" is incompatible with \"-X\"." +msgstr "" + +#, c-format +msgid "ipptool: Bad URI - %s." +msgstr "" + +#, c-format +msgid "ipptool: Bad version %s for \"-V\"." +msgstr "" + +msgid "ipptool: Invalid seconds for \"-i\"." +msgstr "" + +msgid "ipptool: May only specify a single URI." +msgstr "" + +msgid "ipptool: Missing count for \"-n\"." +msgstr "" + +msgid "ipptool: Missing filename for \"-f\"." +msgstr "" + +msgid "ipptool: Missing name=value for \"-d\"." +msgstr "" + +msgid "ipptool: Missing seconds for \"-i\"." +msgstr "" + +msgid "ipptool: Missing timeout for \"-T\"." +msgstr "" + +msgid "ipptool: Missing version for \"-V\"." +msgstr "" + +msgid "ipptool: URI required before test file." +msgstr "" + +#, c-format +msgid "ipptool: Unknown option \"-%c\"." +msgstr "" + +msgid "job-printer-uri attribute missing." +msgstr "" + +msgid "lpadmin: Class name can only contain printable characters." +msgstr "" + +msgid "lpadmin: Expected PPD after \"-P\" option." +msgstr "" + +msgid "lpadmin: Expected allow/deny:userlist after \"-u\" option." +msgstr "" + +msgid "lpadmin: Expected class after \"-r\" option." +msgstr "" + +msgid "lpadmin: Expected class name after \"-c\" option." +msgstr "" + +msgid "lpadmin: Expected description after \"-D\" option." +msgstr "" + +msgid "lpadmin: Expected device URI after \"-v\" option." +msgstr "" + +msgid "lpadmin: Expected file type(s) after \"-I\" option." +msgstr "" + +msgid "lpadmin: Expected hostname after \"-h\" option." +msgstr "" + +msgid "lpadmin: Expected interface after \"-i\" option." +msgstr "" + +msgid "lpadmin: Expected location after \"-L\" option." +msgstr "" + +msgid "lpadmin: Expected model after \"-m\" option." +msgstr "" + +msgid "lpadmin: Expected name after \"-R\" option." +msgstr "" + +msgid "lpadmin: Expected name=value after \"-o\" option." +msgstr "" + +msgid "lpadmin: Expected printer after \"-p\" option." +msgstr "" + +msgid "lpadmin: Expected printer name after \"-d\" option." +msgstr "" + +msgid "lpadmin: Expected printer or class after \"-x\" option." +msgstr "" + +msgid "lpadmin: No member names were seen." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is already a member of class %s." +msgstr "" + +#, c-format +msgid "lpadmin: Printer %s is not a member of class %s." +msgstr "" + +msgid "lpadmin: Printer name can only contain printable characters." +msgstr "" + +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to connect to server: %s" +msgstr "" + +msgid "lpadmin: Unable to create temporary file" +msgstr "" + +msgid "" +"lpadmin: Unable to delete option:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unable to open PPD file \"%s\" - %s" +msgstr "" + +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first." +msgstr "" + +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown allow/deny option \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpadmin: Unknown option \"%c\"." +msgstr "" + +msgid "lpadmin: Warning - content type list ignored." +msgstr "" + +msgid "lpc> " +msgstr "lpc> " + +msgid "lpinfo: Expected 1284 device ID string after \"--device-id\"." +msgstr "" + +msgid "lpinfo: Expected language after \"--language\"." +msgstr "" + +msgid "lpinfo: Expected make and model after \"--make-and-model\"." +msgstr "" + +msgid "lpinfo: Expected product string after \"--product\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--exclude-schemes\"." +msgstr "" + +msgid "lpinfo: Expected scheme list after \"--include-schemes\"." +msgstr "" + +msgid "lpinfo: Expected timeout after \"--timeout\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%c\"." +msgstr "" + +#, c-format +msgid "lpinfo: Unknown option \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unable to connect to server: %s" +msgstr "" + +#, c-format +msgid "lpmove: Unknown argument \"%s\"." +msgstr "" + +#, c-format +msgid "lpmove: Unknown option \"%c\"." +msgstr "" + +msgid "lpoptions: No printers." +msgstr "" + +#, c-format +msgid "lpoptions: Unable to add printer or instance: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to get PPD file for %s: %s" +msgstr "" + +#, c-format +msgid "lpoptions: Unable to open PPD file for %s." +msgstr "" + +msgid "lpoptions: Unknown printer or class." +msgstr "" + +msgid "lppasswd: Only root can add or delete passwords." +msgstr "" + +msgid "lppasswd: Password file busy." +msgstr "" + +msgid "lppasswd: Password file not updated." +msgstr "" + +msgid "lppasswd: Sorry, password doesn't match." +msgstr "" + +msgid "lppasswd: Sorry, password rejected." +msgstr "" + +msgid "lppasswd: Sorry, passwords don't match." +msgstr "" + +#, c-format +msgid "lppasswd: Unable to copy password string: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to open password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: Unable to write to password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to backup old password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: failed to rename password file: %s" +msgstr "" + +#, c-format +msgid "lppasswd: user \"%s\" and group \"%s\" do not exist." +msgstr "" + +#, c-format +msgid "" +"lpstat: error - %s environment variable names non-existent destination \"%s" +"\"." +msgstr "" + +#, c-format +msgid "members of class %s:" +msgstr "" + +msgid "no entries" +msgstr "" + +msgid "no system default destination" +msgstr "" + +msgid "notify-events not specified." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" is already used." +msgstr "" + +#, c-format +msgid "notify-recipient-uri URI \"%s\" uses unknown scheme." +msgstr "" + +msgid "pending" +msgstr "等待中" + +#, c-format +msgid "ppdc: Adding include directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Adding/updating UI text from %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad boolean value (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad font attribute: %s" +msgstr "" + +#, c-format +msgid "ppdc: Bad resolution name \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad status keyword %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Bad variable substitution ($%c) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Choice found on line %d of %s with no Option." +msgstr "" + +#, c-format +msgid "ppdc: Duplicate #po for locale %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a filter definition on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected a program name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected boolean value on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected charset after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice code on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected choice name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected color order for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected colorspace for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected compression for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected driver type keyword following DriverType on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected duplex type after Duplex on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected encoding after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected filename after #po %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected group name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected include filename on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected integer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected locale after #po on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after FileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after Manufacturer on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after MediaSize on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after ModelName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name after PCFileName on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Installable on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option name/text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option section on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected option type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected override field after Resolution on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected quoted string on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected real number on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d " +"of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected selector after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected status after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Copyright on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected string after Version on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected two option names on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected value after %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Expected version after Font on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid #include/#po filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Invalid cost for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty MIME type for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid empty program name for filter on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option section \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Invalid option type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Loading driver information file \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages for locale \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Loading messages from \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #endif at end of \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Missing #if on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Need a msgid line before any translation strings on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: No message catalog provided for locale %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s defined in two different groups on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option %s redefined with a different type on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Option constraint must *name on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Too many nested #if's on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create PPD file \"%s\" - %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output directory %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to create output pipes: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to execute cupstestppd: %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to find #po file %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find include file \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unable to find localization for \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to load localization file \"%s\" - %s" +msgstr "" + +#, c-format +msgid "ppdc: Unable to open %s: %s" +msgstr "" + +#, c-format +msgid "ppdc: Undefined variable (%s) on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unexpected text on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown driver type %s on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown media size \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unknown message catalog format for \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Unknown token \"%s\" seen on line %d of %s." +msgstr "" + +#, c-format +msgid "" +"ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Unterminated string starting with %c on line %d of %s." +msgstr "" + +#, c-format +msgid "ppdc: Warning - overlapping filename \"%s\"." +msgstr "" + +#, c-format +msgid "ppdc: Writing %s." +msgstr "" + +#, c-format +msgid "ppdc: Writing PPD files to directory \"%s\"." +msgstr "" + +#, c-format +msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Ignoring PPD file %s." +msgstr "" + +#, c-format +msgid "ppdmerge: Unable to backup %s to %s - %s" +msgstr "" + +#, c-format +msgid "printer %s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s now printing %s-%d. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s disabled since %s -" +msgstr "" + +#, c-format +msgid "printer %s/%s is idle. enabled since %s" +msgstr "" + +#, c-format +msgid "printer %s/%s now printing %s-%d. enabled since %s" +msgstr "" + +msgid "processing" +msgstr "正在處理" + +#, c-format +msgid "request id is %s-%d (%d file(s))" +msgstr "" + +msgid "request-id uses indefinite length" +msgstr "request-id 使用的長度不確定" + +msgid "scheduler is not running" +msgstr "" + +msgid "scheduler is running" +msgstr "" + +#, c-format +msgid "stat of %s failed: %s" +msgstr "啟動 %s 失敗:%s" + +msgid "status\t\tShow status of daemon and queue." +msgstr "" + +msgid "stopped" +msgstr "已停止" + +#, c-format +msgid "system default destination: %s" +msgstr "" + +#, c-format +msgid "system default destination: %s/%s" +msgstr "" + +msgid "unknown" +msgstr "未知" + +msgid "untitled" +msgstr "未命名" + +msgid "variable-bindings uses indefinite length" +msgstr "variable-bindings 使用的長度不確定" + +#~ msgid "\t\t(all)\n" +#~ msgstr "\t\t(全部)\n" + +#~ msgid "\t\t(none)\n" +#~ msgstr "\t\t(無)\n" + +#~ msgid "\t%d entries\n" +#~ msgstr "\t%d 個項目\n" + +#~ msgid "\tAfter fault: continue\n" +#~ msgstr "\t出錯後:繼續\n" + +#~ msgid "\tAlerts:" +#~ msgstr "\tWARNING: " + +#~ msgid "\tBanner required\n" +#~ msgstr "\t需要標語:\n" + +#~ msgid "\tCharset sets:\n" +#~ msgstr "\t字元集:\n" + +#~ msgid "\tConnection: direct\n" +#~ msgstr "\t連線:直接\n" + +#~ msgid "\tConnection: remote\n" +#~ msgstr "\t連線:遠端\n" + +#~ msgid "\tDefault page size:\n" +#~ msgstr "\t預設頁面大小:\n" + +#~ msgid "\tDefault pitch:\n" +#~ msgstr "\t預設音高:\n" + +#~ msgid "\tDefault port settings:\n" +#~ msgstr "\t預設連接埠設定:\n" + +#~ msgid "\tDescription: %s\n" +#~ msgstr "\t描述:%s\n" + +#~ msgid "" +#~ "\tForm mounted:\n" +#~ "\tContent types: any\n" +#~ "\tPrinter types: unknown\n" +#~ msgstr "" +#~ "\t已裝載的表單:\n" +#~ "\t內容類型:任意\n" +#~ "\t印表機類型:未知\n" + +#~ msgid "\tForms allowed:\n" +#~ msgstr "\t允許的表單:\n" + +#~ msgid "\tInterface: %s.ppd\n" +#~ msgstr "\t介面:%s.ppd\n" + +#~ msgid "\tInterface: %s/interfaces/%s\n" +#~ msgstr "\t介面:%s/interfaces/%s\n" + +#~ msgid "\tInterface: %s/ppd/%s.ppd\n" +#~ msgstr "\t介面:%s/ppd/%s.ppd\n" + +#~ msgid "\tLocation: %s\n" +#~ msgstr "\t位置:%s\n" + +#~ msgid "\tOn fault: no alert\n" +#~ msgstr "\t出錯時:無提示\n" + +#~ msgid "\tUsers allowed:\n" +#~ msgstr "\t允許的使用者:\n" + +#~ msgid "\tUsers denied:\n" +#~ msgstr "\t拒絕的使用者:\n" + +#~ msgid "\tdaemon present\n" +#~ msgstr "\t現有的服務程式\n" + +#~ msgid "\tno entries\n" +#~ msgstr "\t無項目\n" + +#~ msgid "\tprinter is on device '%s' speed -1\n" +#~ msgstr "\t印表機為設備 '%s' 的速度 -1\n" + +#~ msgid "\tprinting is disabled\n" +#~ msgstr "\t已停用列印\n" + +#~ msgid "\tprinting is enabled\n" +#~ msgstr "\t已啟用列印\n" + +#~ msgid "\tqueued for %s\n" +#~ msgstr "\t%s 已佇列\n" + +#~ msgid "\tqueuing is disabled\n" +#~ msgstr "\t已停用佇列\n" + +#~ msgid "\tqueuing is enabled\n" +#~ msgstr "\t已啟用佇列\n" + +#~ msgid "\treason unknown\n" +#~ msgstr "\t原因未知\n" + +#~ msgid "" +#~ "\n" +#~ " DETAILED CONFORMANCE TEST RESULTS\n" +#~ msgstr "" +#~ "\n" +#~ " 詳細的相似度測試結果\n" + +#~ msgid " REF: Page 15, section 3.1.\n" +#~ msgstr " 參考:第 15 頁,章節 3.1。\n" + +#~ msgid " REF: Page 15, section 3.2.\n" +#~ msgstr " 參考:第 15 頁,章節 3.2。\n" + +#~ msgid " REF: Page 19, section 3.3.\n" +#~ msgstr " 參考:第 19 頁,章節 3.3。\n" + +#~ msgid " REF: Page 20, section 3.4.\n" +#~ msgstr " 參考:第 20 頁,章節 3.4。\n" + +#~ msgid " REF: Page 27, section 3.5.\n" +#~ msgstr " 參考:第 27 頁,章節 3.5。\n" + +#~ msgid " REF: Page 42, section 5.2.\n" +#~ msgstr " 參考:第 42 頁,章節 5.2。\n" + +#~ msgid " REF: Pages 16-17, section 3.2.\n" +#~ msgstr " 參考:第 16-17 頁,章節 3.2。\n" + +#~ msgid " REF: Pages 42-45, section 5.2.\n" +#~ msgstr " 參考:第 42-45 頁,章節 5.2。\n" + +#~ msgid " REF: Pages 45-46, section 5.2.\n" +#~ msgstr " 參考:第 45-46 頁,章節 5.2。\n" + +#~ msgid " REF: Pages 48-49, section 5.2.\n" +#~ msgstr " 參考:第 48-49 頁,章節 5.2。\n" + +#~ msgid " REF: Pages 52-54, section 5.2.\n" +#~ msgstr " 參考:第 52-54 頁,章節 5.2。\n" + +#~ msgid " %-39.39s %.0f bytes\n" +#~ msgstr " %-39.39s %.0f byte\n" + +#~ msgid " PASS Default%s\n" +#~ msgstr " 通過 Default%s\n" + +#~ msgid " PASS DefaultImageableArea\n" +#~ msgstr " 通過 DefaultImageableArea\n" + +#~ msgid " PASS DefaultPaperDimension\n" +#~ msgstr " 通過 DefaultPaperDimension\n" + +#~ msgid " PASS FileVersion\n" +#~ msgstr " 通過 FileVersion\n" + +#~ msgid " PASS FormatVersion\n" +#~ msgstr " 通過 FormatVersion\n" + +#~ msgid " PASS LanguageEncoding\n" +#~ msgstr " 通過 LanguageEncoding\n" + +#~ msgid " PASS LanguageVersion\n" +#~ msgstr " 通過 LanguageVersion\n" + +#~ msgid " PASS Manufacturer\n" +#~ msgstr " 通過 Manufacturer\n" + +#~ msgid " PASS ModelName\n" +#~ msgstr " 通過 ModelName\n" + +#~ msgid " PASS NickName\n" +#~ msgstr " 通過 NickName\n" + +#~ msgid " PASS PCFileName\n" +#~ msgstr " 通過 PCFileName\n" + +#~ msgid " PASS PSVersion\n" +#~ msgstr " 通過 PSVersion\n" + +#~ msgid " PASS PageRegion\n" +#~ msgstr " 通過 PageRegion\n" + +#~ msgid " PASS PageSize\n" +#~ msgstr " 通過 PageSize\n" + +#~ msgid " PASS Product\n" +#~ msgstr " 通過 Product\n" + +#~ msgid " PASS ShortNickName\n" +#~ msgstr " 通過 ShortNickName\n" + +#~ msgid "" +#~ " WARN \"%s %s\" conflicts with \"%s %s\"\n" +#~ " (constraint=\"%s %s %s %s\")\n" +#~ msgstr "" +#~ " 警告 “%s %s”與“%s %s”衝突\n" +#~ " (限制=“%s %s %s %s”)\n" + +#~ msgid " WARN %s has no corresponding options!\n" +#~ msgstr " 警告 %s 沒有對應的選項!\n" + +#~ msgid "" +#~ " WARN %s shares a common prefix with %s\n" +#~ " REF: Page 15, section 3.2.\n" +#~ msgstr "" +#~ " 警告 %s 與 %s 共用一般的前置碼\n" +#~ " 參考:第 15 頁,章節 3.2。\n" + +#~ msgid " WARN Default choices conflicting!\n" +#~ msgstr " 警告 預設的選項衝突!\n" + +#~ msgid "" +#~ " WARN Duplex option keyword %s may not work as expected and " +#~ "should be named Duplex!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " 警告 兩用裝紙匣選項的關鍵字 %s 不能如預期運作,而應該命名為 " +#~ "Duplex!\n" +#~ " 參考:第 122 頁,章節 5.17\n" + +#~ msgid "" +#~ " WARN File contains a mix of CR, LF, and CR LF line endings!\n" +#~ msgstr " 警告 檔案包含 CR、LF 和 CR LF 的行結尾!\n" + +#~ msgid "" +#~ " WARN LanguageEncoding required by PPD 4.3 spec.\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " 警告 PPD 4.3 規格要求有 LanguageEncoding\n" +#~ " 參考:第 56-57 頁,章節 5.3。\n" + +#~ msgid " WARN Line %d only contains whitespace!\n" +#~ msgstr " 警告 第 %d 行只包含空白!\n" + +#~ msgid "" +#~ " WARN Manufacturer required by PPD 4.3 spec.\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " 警告 PD 4.3 規格要求有 Manufacturer\n" +#~ " 參考:第 58-59 頁,章節 5.3。\n" + +#~ msgid " WARN Missing APDialogExtension file \"%s\"\n" +#~ msgstr " 警告 遺失 APDialogExtension 檔案“%s”\n" + +#~ msgid " WARN Missing APPrinterIconPath file \"%s\"\n" +#~ msgstr " 警告 遺失 APPrinterIconPath 檔案“%s”\n" + +#~ msgid "" +#~ " WARN Non-Windows PPD files should use lines ending with only " +#~ "LF, not CR LF!\n" +#~ msgstr "" +#~ " 警告 非 Windows PPD 檔案應該使用僅含有 LF 的行結尾,而不是 CR " +#~ "LF!\n" + +#~ msgid "" +#~ " WARN Obsolete PPD version %.1f!\n" +#~ " REF: Page 42, section 5.2.\n" +#~ msgstr "" +#~ " 警告 PPD 版本 %.1f 已過時!\n" +#~ " 參考:第 42 頁,章節 5.2。\n" + +#~ msgid "" +#~ " WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " 警告 PCFileName 長度大於 8.3,這違反了 PPD 規格。\n" +#~ " 參考:第 61-62 頁,章節 5.3。\n" + +#~ msgid "" +#~ " WARN Protocols contains PJL but JCL attributes are not set.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " 警告 通訊協定包含 PJL,但未設定 JCL 屬性。\n" +#~ " 參考:第 78-79 頁,章節 5.7。\n" + +#~ msgid "" +#~ " WARN Protocols contains both PJL and BCP; expected TBCP.\n" +#~ " REF: Pages 78-79, section 5.7.\n" +#~ msgstr "" +#~ " 警告 通訊協定同時包含 PJL 和 BCP;應該為 TBCP。\n" +#~ " 參考:第 78-79 頁,章節 5.7。\n" + +#~ msgid "" +#~ " WARN ShortNickName required by PPD 4.3 spec.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " 警告 PPD 4.3 規格要求有 ShortNickName\n" +#~ " 參考:第 64-65 頁,章節 5.3。\n" + +#~ msgid " %s %s %s does not exist!\n" +#~ msgstr " %s %s %s 不存在!\n" + +#~ msgid "" +#~ " %s Bad %s choice %s!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s %s 選項 %s 錯誤!\n" +#~ " 參考:第 122 頁,章節 5.17\n" + +#~ msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" +#~ msgstr " %s 下列項目的 UTF-8“%s”轉換字串ERROR: 選項 %s!\n" + +#~ msgid "" +#~ " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s 下列項目的 UTF-8“%s”轉換字串ERROR: 選項 %s,選項 %s!\n" + +#~ msgid " %s Bad cupsFilter value \"%s\"!\n" +#~ msgstr " %s cupsFilter 值“%s”錯誤!\n" + +#~ msgid " %s Bad cupsICCProfile %s!\n" +#~ msgstr " %s cupsICCProfile %s 錯誤!\n" + +#~ msgid " %s Bad cupsPreFilter value \"%s\"!\n" +#~ msgstr " %s cupsPreFilter 值“%s”錯誤!\n" + +#~ msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s cupsUIConstraints %s:“%s”錯誤!\n" + +#~ msgid " %s Bad language \"%s\"!\n" +#~ msgstr " %s 語言“%s”錯誤!\n" + +#~ msgid " %s Empty cupsUIConstraints %s!\n" +#~ msgstr " %s cupsUIConstraints %s 為空白!\n" + +#~ msgid " %s Missing \"%s\" translation string for option %s!\n" +#~ msgstr " %s 下列項目的“%s”轉換字串遺失:選項 %s!\n" + +#~ msgid "" +#~ " %s Missing \"%s\" translation string for option %s, choice %s!\n" +#~ msgstr " %s 下列項目的“%s”轉換字串遺失:選項 %s,選項 %s!\n" + +#~ msgid "" +#~ " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr "" +#~ " %s 下列項目中遺失選項 *%s %s:UIConstraints“*%s %s *%s %s”!\n" + +#~ msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 下列項目中遺失選項 *%s %s:cupsUIConstraints %s:“%s”!\n" + +#~ msgid " %s Missing cupsFilter file \"%s\"\n" +#~ msgstr " %s 遺失 cupsFilter 檔案“%s”\n" + +#~ msgid " %s Missing cupsICCProfile file \"%s\"!\n" +#~ msgstr " %s 遺失 cupsICCProfile 檔案“%s”!\n" + +#~ msgid " %s Missing cupsPreFilter file \"%s\"\n" +#~ msgstr " %s 遺失 cupsPreFilter 檔案“%s”\n" + +#~ msgid " %s Missing cupsUIResolver %s!\n" +#~ msgstr " %s 遺失 cupsUIResolver %s!\n" + +#~ msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" +#~ msgstr " %s 下列項目中遺失選項 %s:UIConstraints“*%s %s *%s %s”!\n" + +#~ msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" +#~ msgstr " %s 下列項目中遺失選項 %s:cupsUIConstraints %s:“%s”!\n" + +#~ msgid " %s No base translation \"%s\" is included in file!\n" +#~ msgstr " %s 檔案中不包括基礎轉換“%s”!\n" + +#~ msgid "" +#~ " %s REQUIRED %s does not define choice None!\n" +#~ " REF: Page 122, section 5.17\n" +#~ msgstr "" +#~ " %s REQUIRED %s 未定義選項 None!\n" +#~ " 參考:第 122 頁,章節 5.17\n" + +#~ msgid " %s cupsICCProfile %s hash value collides with %s!\n" +#~ msgstr " %s cupsICCProfile %s 雜湊值與 %s 衝突!\n" + +#~ msgid " %s cupsUIResolver %s causes a loop!\n" +#~ msgstr " %s cupsUIResolver %s 造成迴圈!\n" + +#~ msgid " **FAIL** %s choice names %s and %s differ only by case!\n" +#~ msgstr " **失敗** %s 選項名稱 %s 和 %s 僅在某些情況下不同!\n" + +#~ msgid "" +#~ " **FAIL** %s must be 1284DeviceID!\n" +#~ " REF: Page 72, section 5.5\n" +#~ msgstr "" +#~ " **失敗** %s 必須為 1284DeviceID!\n" +#~ " 參考:第 72 頁,章節 5.5\n" + +#~ msgid "" +#~ " **FAIL** BAD Default%s %s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失敗** Default%s %s 錯誤\n" +#~ " 參考:第 40 頁,章節 4.5。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultImageableArea %s!\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** DefaultImageableArea %s 錯誤!\n" +#~ " 參考:第 102 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD DefaultPaperDimension %s!\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** DefaultPaperDimension %s 錯誤!\n" +#~ " 參考:第 103 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** BAD JobPatchFile attribute in file\n" +#~ " REF: Page 24, section 3.4.\n" +#~ msgstr "" +#~ " **失敗** 檔案中的 JobPatchFile 屬性錯誤\n" +#~ " 參考:第 24 頁,章節 3.4。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"HP\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失敗** Manufacturer 錯誤(應該為“HP”)\n" +#~ " 參考:第 211 頁,表格 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD Manufacturer (should be \"Oki\")\n" +#~ " REF: Page 211, table D.1.\n" +#~ msgstr "" +#~ " **失敗** Manufacturer 錯誤(應該為“Oki”)\n" +#~ " 參考:第 211 頁,表格 D.1。\n" + +#~ msgid "" +#~ " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** ModelName 錯誤 - 字串中不允許“%c”。\n" +#~ " 參考:第 59-60 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD PSVersion - not \"(string) int\".\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** PSVersion 錯誤 - 不是“(string) int”。\n" +#~ " 參考:第 62-64 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD Product - not \"(string)\".\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** Product 錯誤 - 不是“(string)”。\n" +#~ " 參考:第 62 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** BAD ShortNickName - longer than 31 chars.\n" +#~ " REF: Pages 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** ShortNickName 錯誤 - 長度大於 31 個字元。\n" +#~ " 參考:第 64-65 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** Bad %s choice %s!\n" +#~ " REF: Page 84, section 5.9\n" +#~ msgstr "" +#~ " **失敗** %s 選項 %s 錯誤!\n" +#~ " 參考:第 84 頁,章節 5.9\n" + +#~ msgid "" +#~ " **FAIL** Bad FileVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** FileVersion“%s”錯誤\n" +#~ " 參考:第 56 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** Bad FormatVersion \"%s\"\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** FormatVersion“%s”錯誤\n" +#~ " 參考:第 56 頁,章節 5.3。\n" + +#~ msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" +#~ msgstr " **失敗** LanguageEncoding %s 錯誤 - 必須為 ISOLatin1!\n" + +#~ msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" +#~ msgstr " **失敗** LanguageVersion %s 錯誤 - 必須為英語!\n" + +#~ msgid " **FAIL** Default option code cannot be interpreted: %s\n" +#~ msgstr " **失敗** 無法解譯預設選項代碼:%s\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s choice %s " +#~ "contains 8-bit characters!\n" +#~ msgstr " **失敗** 選項 %s 選項 %s 的預設轉換字串包含 8 位元字元!\n" + +#~ msgid "" +#~ " **FAIL** Default translation string for option %s contains 8-bit " +#~ "characters!\n" +#~ msgstr " **失敗** 選項 %s 的預設轉換字串包含 8 位元字元!\n" + +#~ msgid " **FAIL** Group names %s and %s differ only by case!\n" +#~ msgstr " **失敗** 群組名稱 %s 和 %s 僅在某些情況下不同!\n" + +#~ msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" +#~ msgstr " **失敗** 出現了多個 %s 選項名稱 %s!\n" + +#~ msgid " **FAIL** Option names %s and %s differ only by case!\n" +#~ msgstr " **失敗** 選項名稱 %s 和 %s 僅在某些情況下不同!\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Default%s\n" +#~ " REF: Page 40, section 4.5.\n" +#~ msgstr "" +#~ " **失敗** 需要 Default%s\n" +#~ " 參考:第 40 頁,章節 4.5。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultImageableArea\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** 需要 DefaultImageableArea\n" +#~ " 參考:第 102 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED DefaultPaperDimension\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** 需要 DefaultPaperDimension\n" +#~ " 參考:第 103 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FileVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 FileVersion\n" +#~ " 參考:第 56 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED FormatVersion\n" +#~ " REF: Page 56, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 FormatVersion\n" +#~ " 參考:第 56 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ImageableArea for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 102, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** PageSize %s 需要 ImageableArea\n" +#~ " 參考:第 41 頁,章節 5。\n" +#~ " 參考:第 102 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageEncoding\n" +#~ " REF: Pages 56-57, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 LanguageEncoding\n" +#~ " 參考:第 56-57 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED LanguageVersion\n" +#~ " REF: Pages 57-58, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 LanguageVersion\n" +#~ " 參考:第 57-58 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Manufacturer\n" +#~ " REF: Pages 58-59, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 Manufacturer\n" +#~ " 參考:第 58-59 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ModelName\n" +#~ " REF: Pages 59-60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 ModelName\n" +#~ " 參考:第 59-60 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED NickName\n" +#~ " REF: Page 60, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 NickName\n" +#~ " 參考:第 60 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PCFileName\n" +#~ " REF: Pages 61-62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 PCFileName\n" +#~ " 參考:第 61-62 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PSVersion\n" +#~ " REF: Pages 62-64, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 PSVersion\n" +#~ " 參考:第 62-64 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageRegion\n" +#~ " REF: Page 100, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** 需要 PageRegion\n" +#~ " 參考:第 100 頁,章節 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 99, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** 需要 PageSize\n" +#~ " 參考:第 41 頁,章節 5。\n" +#~ " 參考:第 99 頁,章節 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PageSize\n" +#~ " REF: Pages 99-100, section 5.14.\n" +#~ msgstr "" +#~ " **失敗** 需要 PageSize\n" +#~ " 參考:第 99-100 頁,章節 5.14。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED PaperDimension for PageSize %s\n" +#~ " REF: Page 41, section 5.\n" +#~ " REF: Page 103, section 5.15.\n" +#~ msgstr "" +#~ " **失敗** PageSize %s 需要 PaperDimension\n" +#~ " 參考:第 41 頁,章節 5。\n" +#~ " 參考:第 103 頁,章節 5.15。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED Product\n" +#~ " REF: Page 62, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 Product\n" +#~ " 參考:第 62 頁,章節 5.3。\n" + +#~ msgid "" +#~ " **FAIL** REQUIRED ShortNickName\n" +#~ " REF: Page 64-65, section 5.3.\n" +#~ msgstr "" +#~ " **失敗** 需要 ShortNickName\n" +#~ " 參考:第 64-65 頁,章節 5.3。\n" + +#~ msgid " %d ERRORS FOUND\n" +#~ msgstr " 發現 %d 個錯誤\n" + +#~ msgid "" +#~ " Bad %%%%BoundingBox: on line %d!\n" +#~ " REF: Page 39, %%%%BoundingBox:\n" +#~ msgstr "" +#~ " 第 %d 行的 %%%%BoundingBox: 錯誤!\n" +#~ " 參考:第 39 頁,%%%%BoundingBox:\n" + +#~ msgid "" +#~ " Bad %%%%Page: on line %d!\n" +#~ " REF: Page 53, %%%%Page:\n" +#~ msgstr "" +#~ " 第 %d 行的 %%%%Page: 錯誤!\n" +#~ " 參考:第 53 頁,%%%%Page:\n" + +#~ msgid "" +#~ " Bad %%%%Pages: on line %d!\n" +#~ " REF: Page 43, %%%%Pages:\n" +#~ msgstr "" +#~ " 第 %d 行的 %%%%Pages: 錯誤!\n" +#~ " 參考:第 43 頁,%%%%Pages:\n" + +#~ msgid "" +#~ " Line %d is longer than 255 characters (%d)!\n" +#~ " REF: Page 25, Line Length\n" +#~ msgstr "" +#~ " 第 %d 行長度大於 255 個字元(%d)!\n" +#~ " 參考:第 25 頁,行長度\n" + +#~ msgid "" +#~ " Missing %!PS-Adobe-3.0 on first line!\n" +#~ " REF: Page 17, 3.1 Conforming Documents\n" +#~ msgstr "" +#~ " 第一行遺失 %!PS-Adobe-3.0!\n" +#~ " 參考:第 17 頁,3.1 確認文件\n" + +#~ msgid "" +#~ " Missing %%EndComments comment!\n" +#~ " REF: Page 41, %%EndComments\n" +#~ msgstr "" +#~ " 遺失 %%EndComments 註解!\n" +#~ " 參考:第 41 頁,%%EndComments\n" + +#~ msgid "" +#~ " Missing or bad %%BoundingBox: comment!\n" +#~ " REF: Page 39, %%BoundingBox:\n" +#~ msgstr "" +#~ " %%BoundingBox﹕ 註解遺失或錯誤!\n" +#~ " 參考:第 39 頁,%%BoundingBox:\n" + +#~ msgid "" +#~ " Missing or bad %%Page: comments!\n" +#~ " REF: Page 53, %%Page:\n" +#~ msgstr "" +#~ " %%Page: 註解遺失或錯誤!\n" +#~ " 參考:第 53 頁,%%Page:\n" + +#~ msgid "" +#~ " Missing or bad %%Pages: comment!\n" +#~ " REF: Page 43, %%Pages:\n" +#~ msgstr "" +#~ " %%Pages: 註解遺失或錯誤!\n" +#~ " 參考:第 43 頁,%%Pages:\n" + +#~ msgid " NO ERRORS FOUND\n" +#~ msgstr " 未發現錯誤\n" + +#~ msgid " Saw %d lines that exceeded 255 characters!\n" +#~ msgstr " 發現 %d 行超出 255 個字元!\n" + +#~ msgid " Too many %%BeginDocument comments!\n" +#~ msgstr " %%BeginDocument 註解太多!\n" + +#~ msgid " Too many %%EndDocument comments!\n" +#~ msgstr " %%EndDocument 註解太多!\n" + +#~ msgid " Warning: file contains binary data!\n" +#~ msgstr " WARNING: 檔案包含二進位資料!\n" + +#~ msgid " Warning: no %%EndComments comment in file!\n" +#~ msgstr " WARNING: 檔案中沒有 %%EndComments 註解!\n" + +#~ msgid " Warning: obsolete DSC version %.1f in file!\n" +#~ msgstr " WARNING: 檔案中的 DSC 版本 %.1f 已過時!\n" + +#~ msgid " FAIL\n" +#~ msgstr " 失敗\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s\n" +#~ msgstr "" +#~ " 失敗\n" +#~ " **失敗** 無法打開 PPD 檔案 - %s\n" + +#~ msgid "" +#~ " FAIL\n" +#~ " **FAIL** Unable to open PPD file - %s on line %d.\n" +#~ msgstr "" +#~ " 失敗\n" +#~ " **失敗** 無法打開 PPD 檔案 - 第 %2$d 行的 %1$s。\n" + +#~ msgid " PASS\n" +#~ msgstr " 通過\n" + +#~ msgid "#10 Envelope" +#~ msgstr "#10 信封" + +#~ msgid "#11 Envelope" +#~ msgstr "#11 信封" + +#~ msgid "#12 Envelope" +#~ msgstr "#12 信封" + +#~ msgid "#14 Envelope" +#~ msgstr "#14 信封" + +#~ msgid "#9 Envelope" +#~ msgstr "#9 信封" + +#~ msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" +#~ msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f byte\n" + +#~ msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" +#~ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f byte\n" + +#~ msgid "%s accepting requests since %s\n" +#~ msgstr "%s 自 %s 後接受請求\n" + +#~ msgid "%s is not implemented by the CUPS version of lpc.\n" +#~ msgstr "%s 未由 CUPS 版本 lpc 執行。\n" + +#~ msgid "%s is not ready\n" +#~ msgstr "%s 尚未備妥\n" + +#~ msgid "%s is ready\n" +#~ msgstr "%s 已備妥\n" + +#~ msgid "%s is ready and printing\n" +#~ msgstr "%s 已備妥列印\n" + +#~ msgid "" +#~ "%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s 自 %s 後不接受請求 -\n" +#~ "\t%s\n" + +#~ msgid "%s not supported!" +#~ msgstr "不支援 %s!" + +#~ msgid "%s/%s accepting requests since %s\n" +#~ msgstr "%s/%s 自 %s 後接受請求\n" + +#~ msgid "" +#~ "%s/%s not accepting requests since %s -\n" +#~ "\t%s\n" +#~ msgstr "" +#~ "%s/%s 自 %s 後不接受請求 -\n" +#~ "\t%s\n" + +#~ msgid "%s: %-33.33s [job %d localhost]\n" +#~ msgstr "%s:%-33.33s [作業 %d localhost]\n" + +#~ msgid "%s: %s failed: %s\n" +#~ msgstr "%s:%s 失敗:%s\n" + +#~ msgid "%s: Don't know what to do!\n" +#~ msgstr "%s:不知道要執行的動作!\n" + +#~ msgid "" +#~ "%s: Error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s:錯誤 - %s 環境變數名稱中有不存在的目的地“%s”!\n" + +#~ msgid "%s: Error - bad job ID!\n" +#~ msgstr "%s:錯誤 - 作業 ID 錯誤!\n" + +#~ msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" +#~ msgstr "%s:錯誤 - 無法列印檔案並同時更改作業!\n" + +#~ msgid "" +#~ "%s: Error - cannot print from stdin if files or a job ID are provided!\n" +#~ msgstr "%s:錯誤 - 在提供檔案或作業 ID 的情況下無法從 stdin 進行列印!\n" + +#~ msgid "%s: Error - expected character set after '-S' option!\n" +#~ msgstr "%s:錯誤 - '-S' 選項後面預期為字元集!\n" + +#~ msgid "%s: Error - expected content type after '-T' option!\n" +#~ msgstr "%s:錯誤 - '-T' 選項後面預期為內容類型!\n" + +#~ msgid "%s: Error - expected copies after '-n' option!\n" +#~ msgstr "%s:錯誤 - '-n' 選項後面預期為份數!\n" + +#~ msgid "%s: Error - expected copy count after '-#' option!\n" +#~ msgstr "%s:錯誤 - '-#' 選項後面預期為複本計數!\n" + +#~ msgid "%s: Error - expected destination after '-P' option!\n" +#~ msgstr "%s:錯誤 - '-P' 選項後面預期為目的地!\n" + +#~ msgid "%s: Error - expected destination after '-b' option!\n" +#~ msgstr "%s:錯誤 - '-b' 選項後面預期為目的地!\n" + +#~ msgid "%s: Error - expected destination after '-d' option!\n" +#~ msgstr "%s:錯誤 - '-d' 選項後面預期為目的地!\n" + +#~ msgid "%s: Error - expected form after '-f' option!\n" +#~ msgstr "%s:錯誤 - '-f' 選項後面預期為表單!\n" + +#~ msgid "%s: Error - expected hold name after '-H' option!\n" +#~ msgstr "%s:錯誤 - '-H' 選項後面預期為保留名稱!\n" + +#~ msgid "%s: Error - expected hostname after '-H' option!\n" +#~ msgstr "%s:錯誤 - '-H' 選項後面預期為主機名稱!\n" + +#~ msgid "%s: Error - expected hostname after '-h' option!\n" +#~ msgstr "%s:錯誤 - '-h' 選項後面預期為主機名稱!\n" + +#~ msgid "%s: Error - expected mode list after '-y' option!\n" +#~ msgstr "%s:錯誤 - '-y' 選項後面預期為模式列表!\n" + +#~ msgid "%s: Error - expected name after '-%c' option!\n" +#~ msgstr "%s:錯誤 - '-%c' 選項後面預期為名稱!\n" + +#~ msgid "%s: Error - expected option string after '-o' option!\n" +#~ msgstr "%s:錯誤 - '-o' 選項後面預期為選項字串!\n" + +#~ msgid "%s: Error - expected page list after '-P' option!\n" +#~ msgstr "%s:錯誤 - '-P' 選項後面預期為頁面列表!\n" + +#~ msgid "%s: Error - expected priority after '-%c' option!\n" +#~ msgstr "%s:錯誤 - '-%c' 選項後面預期為優先順序!\n" + +#~ msgid "%s: Error - expected reason text after '-r' option!\n" +#~ msgstr "%s:錯誤 - '-r' 選項後面預期為原因文字!\n" + +#~ msgid "%s: Error - expected title after '-t' option!\n" +#~ msgstr "%s:錯誤 - '-t' 選項後面預期為標題!\n" + +#~ msgid "%s: Error - expected username after '-U' option!\n" +#~ msgstr "%s:錯誤 - '-U' 選項後面預期為使用者名稱!\n" + +#~ msgid "%s: Error - expected username after '-u' option!\n" +#~ msgstr "%s:錯誤 - '-u' 選項後面預期為使用者名稱!\n" + +#~ msgid "%s: Error - expected value after '-%c' option!\n" +#~ msgstr "%s:錯誤 - '-%c' 選項後面預期為值!\n" + +#~ msgid "" +#~ "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' " +#~ "option!\n" +#~ msgstr "" +#~ "%s:錯誤 - &aops;-W&aops; 選項後面需要“completed”、“not-" +#~ "completed”或“all”!\n" + +#~ msgid "%s: Error - no default destination available.\n" +#~ msgstr "%s:錯誤 - 無可用的預設目的地。\n" + +#~ msgid "%s: Error - priority must be between 1 and 100.\n" +#~ msgstr "%s:錯誤 - 優先順序必須介於 1 和 100 之間。\n" + +#~ msgid "%s: Error - scheduler not responding!\n" +#~ msgstr "%s:錯誤 - 排程器沒有回應!\n" + +#~ msgid "%s: Error - too many files - \"%s\"\n" +#~ msgstr "%s:錯誤 - 檔案太多 -“%s”\n" + +#~ msgid "%s: Error - unable to access \"%s\" - %s\n" +#~ msgstr "%s:錯誤 - 無法存取“%s”- %s\n" + +#~ msgid "%s: Error - unable to queue from stdin - %s\n" +#~ msgstr "%s:錯誤 - 無法從 stdin 佇列 - %s\n" + +#~ msgid "%s: Error - unknown destination \"%s\"!\n" +#~ msgstr "%s:錯誤 - 未知的目的地“%s”!\n" + +#~ msgid "%s: Error - unknown destination \"%s/%s\"!\n" +#~ msgstr "%s:錯誤 - 未知的目的地“%s/%s”!\n" + +#~ msgid "%s: Error - unknown option '%c'!\n" +#~ msgstr "%s:錯誤 - 未知的選項 '%c'!\n" + +#~ msgid "%s: Error - unknown option '%s'!\n" +#~ msgstr "%s:錯誤 - 未知的選項 '%s'!\n" + +#~ msgid "%s: Expected job ID after '-i' option!\n" +#~ msgstr "%s:'-i' 選項後面預期為作業 ID!\n" + +#~ msgid "%s: Filter \"%s\" not available: %s\n" +#~ msgstr "%s:無法使用濾鏡“%s”:%s\n" + +#~ msgid "%s: Invalid destination name in list \"%s\"!\n" +#~ msgstr "%s:列表“%s”中的目的地名稱無效!\n" + +#~ msgid "%s: Invalid filter string \"%s\"\n" +#~ msgstr "%s:過濾字串“%s”無效\n" + +#~ msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" +#~ msgstr "%s:&aops;-H restart&aops; 前面需要作業 ID('-i jobid')!\n" + +#~ msgid "%s: No filter to convert from %s/%s to %s/%s!\n" +#~ msgstr "%s:沒有濾鏡要從 %s/%s 轉換為 %s/%s!\n" + +#~ msgid "%s: Operation failed: %s\n" +#~ msgstr "%s:作業失敗:%s\n" + +#~ msgid "%s: Sorry, no encryption support compiled in!\n" +#~ msgstr "%s:抱歉,未編譯入加密支援!\n" + +#~ msgid "%s: Unable to connect to server\n" +#~ msgstr "%s:無法連接伺服器\n" + +#~ msgid "%s: Unable to contact server!\n" +#~ msgstr "%s:無法聯絡伺服器!\n" + +#~ msgid "%s: Unable to determine MIME type of \"%s\"!\n" +#~ msgstr "%s:無法確定“%s”的 MIME 類型!\n" + +#~ msgid "%s: Unable to open %s - %s\n" +#~ msgstr "%s:無法打開 %s - %s\n" + +#~ msgid "%s: Unable to open %s - %s on line %d.\n" +#~ msgstr "%s:無法打開 %s - %s 在第 %d 行。\n" + +#~ msgid "%s: Unable to open %s: %s\n" +#~ msgstr "%s:無法打開 %s:%s\n" + +#~ msgid "%s: Unable to open PPD file: %s on line %d\n" +#~ msgstr "%s:無法打開 PPD 檔案:%s 在第 %d 行\n" + +#~ msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" +#~ msgstr "%s:無法從“%s”或“%s”讀取 MIME 資料庫!\n" + +#~ msgid "%s: Unknown destination \"%s\"!\n" +#~ msgstr "%s:未知的目的地“%s”!\n" + +#~ msgid "%s: Unknown destination MIME type %s/%s!\n" +#~ msgstr "%s:未知的目的地 MIME 類型 %s/%s!\n" + +#~ msgid "%s: Unknown option '%c'!\n" +#~ msgstr "%s:未知的選項 '%c'!\n" + +#~ msgid "%s: Unknown source MIME type %s/%s!\n" +#~ msgstr "%s:未知的來源 MIME 類型 %s/%s!\n" + +#~ msgid "" +#~ "%s: Warning - '%c' format modifier not supported - output may not be " +#~ "correct!\n" +#~ msgstr "%s:警告 - 不支援 '%c' 格式修飾符 - 輸出可能不正確!\n" + +#~ msgid "%s: Warning - character set option ignored!\n" +#~ msgstr "%s:警告 - 已忽略字元集選項!\n" + +#~ msgid "%s: Warning - content type option ignored!\n" +#~ msgstr "%s:警告 - 已忽略內容類型選項!\n" + +#~ msgid "%s: Warning - form option ignored!\n" +#~ msgstr "%s:警告 - 已忽略表單選項!\n" + +#~ msgid "%s: Warning - mode option ignored!\n" +#~ msgstr "%s:警告 - 已忽略模式選項!\n" + +#~ msgid "" +#~ "%s: error - %s environment variable names non-existent destination \"%s" +#~ "\"!\n" +#~ msgstr "%s:錯誤 - %s 環境變數名稱中有不存在的目的地“%s”!\n" + +#~ msgid "%s: error - expected option=value after '-o' option!\n" +#~ msgstr "%s:錯誤 - &aops;-o&aops; 選項後面預期為 option=value!\n" + +#~ msgid "%s: error - no default destination available.\n" +#~ msgstr "%s:錯誤 - 沒有可用的預設目的地。\n" + +#~ msgid "10 x 11\"" +#~ msgstr "10 x 11\"" + +#~ msgid "10 x 13\"" +#~ msgstr "10 x 13\"" + +#~ msgid "10 x 14\"" +#~ msgstr "10 x 14\"" + +#~ msgid "12 x 11\"" +#~ msgstr "12 x 11\"" + +#~ msgid "15 x 11\"" +#~ msgstr "15 x 11\"" + +#~ msgid "600 DPI Grayscale" +#~ msgstr "600 DPI 灰階" + +#~ msgid "60x720dpi" +#~ msgstr "60x720dpi" + +#~ msgid "7 x 9\"" +#~ msgstr "7 x 9\"" + +#~ msgid "8 x 10\"" +#~ msgstr "8 x 10\"" + +#~ msgid "9 x 11\"" +#~ msgstr "9 x 11\"" + +#~ msgid "9 x 12\"" +#~ msgstr "9 x 12\"" + +#~ msgid "?Invalid help command unknown\n" +#~ msgstr "?無效的輔助說明指令未知\n" + +#~ msgid "A Samba password is required to export printer drivers!" +#~ msgstr "需要 Samba 密碼,才能輸出印表機驅動程式!" + +#~ msgid "A Samba username is required to export printer drivers!" +#~ msgstr "需要 Samba 使用者名稱,才能輸出印表機驅動程式!" + +#~ msgid "A class named \"%s\" already exists!" +#~ msgstr "名為“%s”的類別已存在!" + +#~ msgid "A printer named \"%s\" already exists!" +#~ msgstr "名為“%s”的印表機已存在!" + +#~ msgid "A3 (Oversize)" +#~ msgstr "A3(超大型)" + +#~ msgid "A4 (Oversize)" +#~ msgstr "A4(超大型)" + +#~ msgid "A4 (Small)" +#~ msgstr "A4(小型)" + +#~ msgid "A5 (Oversize)" +#~ msgstr "A5(超大型)" + +#~ msgid "ARCH A" +#~ msgstr "ARCH A" + +#~ msgid "ARCH B" +#~ msgstr "ARCH B" + +#~ msgid "Attempt to set %s printer-state to bad value %d!" +#~ msgstr "嘗試將 %s 印表機狀態設為錯誤的值 %d!" + +#~ msgid "Attribute groups are out of order (%x < %x)!" +#~ msgstr "屬性群組有問題(%x < %x)!" + +#~ msgid "Bad device URI \"%s\"!\n" +#~ msgstr "設備 URI“%s”錯誤!\n" + +#~ msgid "Bad device-uri \"%s\"!" +#~ msgstr "device-uri“%s”錯誤!" + +#~ msgid "Bad device-uri scheme \"%s\"!" +#~ msgstr "device-uri 架構“%s”錯誤!" + +#~ msgid "Bad document-format \"%s\"!" +#~ msgstr "document-format“%s”錯誤!" + +#~ msgid "Bad filename buffer!" +#~ msgstr "檔名緩衝區錯誤!" + +#~ msgid "Bad font attribute: %s\n" +#~ msgstr "字體屬性ERROR: %s\n" + +#~ msgid "Bad job-priority value!" +#~ msgstr "job-priority 值錯誤!" + +#~ msgid "Bad job-sheets value \"%s\"!" +#~ msgstr "job-sheets 值“%s”錯誤!" + +#~ msgid "Bad job-sheets value type!" +#~ msgstr "job-sheets 值類型錯誤!" + +#~ msgid "Bad job-state value!" +#~ msgstr "job-state 值錯誤!" + +#~ msgid "Bad job-uri attribute \"%s\"!" +#~ msgstr "job-uri 屬性“%s”錯誤!" + +#~ msgid "Bad notify-pull-method \"%s\"!" +#~ msgstr "notify-pull-method“%s”錯誤!" + +#~ msgid "Bad notify-recipient-uri URI \"%s\"!" +#~ msgstr "notify-recipient-uri URI“%s”錯誤!" + +#~ msgid "Bad option + choice on line %d!" +#~ msgstr "第 %d 行的 option + choice 錯誤!" + +#~ msgid "Bad port-monitor \"%s\"!" +#~ msgstr "port-monitor“%s”錯誤!" + +#~ msgid "Bad printer-state value %d!" +#~ msgstr "printer-state 值 %d 錯誤!" + +#~ msgid "Bad request version number %d.%d!" +#~ msgstr "請求版本號碼 %d.%d 錯誤!" + +#~ msgid "Bad subscription ID!" +#~ msgstr "訂閱 ID 錯誤!" + +#~ msgid "C0 Envelope" +#~ msgstr "C0 信封" + +#~ msgid "C1 Envelope" +#~ msgstr "C1 信封" + +#~ msgid "C2 Envelope" +#~ msgstr "C2 信封" + +#~ msgid "C3 Envelope" +#~ msgstr "C3 信封" + +#~ msgid "C4" +#~ msgstr "C4" + +#~ msgid "C4 Envelope" +#~ msgstr "C4 信封" + +#~ msgid "C5" +#~ msgstr "C5" + +#~ msgid "C5 Envelope" +#~ msgstr "C5 信封" + +#~ msgid "C6" +#~ msgstr "C6" + +#~ msgid "C6 Envelope" +#~ msgstr "C6 信封" + +#~ msgid "C65 Envelope" +#~ msgstr "C65 信封" + +#~ msgid "C7 Envelope" +#~ msgstr "C7 信封" + +#~ msgid "Character set \"%s\" not supported!" +#~ msgstr "不支援字元集“%s”!" + +#~ msgid "Chou3 Envelope" +#~ msgstr "Chou3 信封" + +#~ msgid "Chou4 Envelope" +#~ msgstr "Chou4 信封" + +#~ msgid "" +#~ "Commands may be abbreviated. Commands are:\n" +#~ "\n" +#~ "exit help quit status ?\n" +#~ msgstr "" +#~ "指令可以簡寫。指令為:\n" +#~ "\n" +#~ "exit help quit status ?\n" + +#~ msgid "Could not scan type \"%s\"!" +#~ msgstr "無法掃描類型“%s”!" + +#~ msgid "Cover open." +#~ msgstr "機蓋已打開。" + +#~ msgid "DL" +#~ msgstr "DL" + +#~ msgid "DL Envelope" +#~ msgstr "DL 信封" + +#~ msgid "Developer almost empty." +#~ msgstr "顯像劑即將耗盡。" + +#~ msgid "Developer empty!" +#~ msgstr "顯像劑已耗盡!" + +#~ msgid "" +#~ "Device: uri = %s\n" +#~ " class = %s\n" +#~ " info = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ " location = %s\n" +#~ msgstr "" +#~ "設備:uri = %s\n" +#~ " 類別 = %s\n" +#~ " 資訊 = %s\n" +#~ " 製造和型號 = %s\n" +#~ " 設備 ID = %s\n" +#~ " 位置 = %s\n" + +#~ msgid "Document %d not found in job %d." +#~ msgstr "文件 %d 在作業 %d 中找不到。" + +#~ msgid "Door open." +#~ msgstr "機門已打開。" + +#~ msgid "Double Postcard" +#~ msgstr "雙明信片" + +#~ msgid "EMERG: Unable to allocate memory for page info: %s\n" +#~ msgstr "EMERG: 無法為頁面資訊分配記憶體:%s\n" + +#~ msgid "EMERG: Unable to allocate memory for pages array: %s\n" +#~ msgstr "EMERG: 無法為頁面陣列分配記憶體:%s\n" + +#~ msgid "ERROR: Bad %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: %%BoundingBox ERROR: 發現有註解!\n" + +#~ msgid "ERROR: Bad %%IncludeFeature: comment!\n" +#~ msgstr "ERROR: %%IncludeFeature ERROR: 註解!\n" + +#~ msgid "ERROR: Bad %%Page: comment in file!\n" +#~ msgstr "ERROR: %%Page ERROR: 檔案中的註解!\n" + +#~ msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" +#~ msgstr "ERROR: %%PageBoundingBox ERROR: 檔案中的註解!\n" + +#~ msgid "ERROR: Bad SCSI device file \"%s\"!\n" +#~ msgstr "ERROR: SCSI 設備檔案“%s”錯誤!\n" + +#~ msgid "ERROR: Bad charset file %s\n" +#~ msgstr "ERROR: 字元集檔案 %s 錯誤\n" + +#~ msgid "ERROR: Bad charset type %s\n" +#~ msgstr "ERROR: 字元集類型 %s 錯誤\n" + +#~ msgid "ERROR: Bad columns value %d!\n" +#~ msgstr "ERROR: 直欄值 %d 錯誤!\n" + +#~ msgid "ERROR: Bad cpi value %f!\n" +#~ msgstr "ERROR: cpi 值 %f 錯誤!\n" + +#~ msgid "ERROR: Bad font description line: %s\n" +#~ msgstr "ERROR: 字體描述行ERROR: %s\n" + +#~ msgid "ERROR: Bad lpi value %f!\n" +#~ msgstr "ERROR: lpi 值 %f 錯誤!\n" + +#~ msgid "ERROR: Bad page setup!\n" +#~ msgstr "ERROR: 頁面設定錯誤!\n" + +#~ msgid "ERROR: Bad text direction %s\n" +#~ msgstr "ERROR: 文字方向 %s 錯誤\n" + +#~ msgid "ERROR: Bad text width %s\n" +#~ msgstr "ERROR: 文字寬度 %s 錯誤\n" + +#~ msgid "ERROR: Destination printer does not exist!\n" +#~ msgstr "ERROR: 目的印表機不存在!\n" + +#~ msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" +#~ msgstr "ERROR: 重複的 %%BoundingBox:發現有註解!\n" + +#~ msgid "ERROR: Duplicate %%Pages: comment seen!\n" +#~ msgstr "ERROR: 重複的 %%Pages:發現有註解!\n" + +#~ msgid "ERROR: Empty print file!\n" +#~ msgstr "ERROR: 列印檔案為空!\n" + +#~ msgid "ERROR: Error %d sending PAPSendData request: %s\n" +#~ msgstr "ERROR: %d 傳送 PAPSendData 請求時發生ERROR: %s\n" + +#~ msgid "ERROR: Expected quoted string on line %d of %s!\n" +#~ msgstr "ERROR: %2$s 的第 %1$d 行預期為引言字串!\n" + +#~ msgid "ERROR: Fatal USB error!\n" +#~ msgstr "ERROR: 嚴重的 USB 錯誤!\n" + +#~ msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" +#~ msgstr "ERROR: 發現無效的 HP-GL/2 指令,無法列印檔案!\n" + +#~ msgid "ERROR: Missing %%EndProlog!\n" +#~ msgstr "ERROR: 遺失 %%EndProlog!\n" + +#~ msgid "ERROR: Missing %%EndSetup!\n" +#~ msgstr "ERROR: 遺失 %%EndSetup!\n" + +#~ msgid "" +#~ "ERROR: Missing device URI on command-line and no DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "ERROR: 指令行遺失設備 URI 且沒有 DEVICE_URI 環境變數!\n" + +#~ msgid "ERROR: Missing value on line %d of banner file!\n" +#~ msgstr "ERROR: 標語檔案的第 %d 行遺失值!\n" + +#~ msgid "" +#~ "ERROR: Need a msgid line before any translation strings on line %d of %" +#~ "s!\n" +#~ msgstr "ERROR: 在 %2$s 第 %1$d 行的任何轉換字串前面都需要 msgid 行!\n" + +#~ msgid "ERROR: No %%BoundingBox: comment in header!\n" +#~ msgstr "ERROR: 沒有 %%BoundingBox:標題中的註解!\n" + +#~ msgid "ERROR: No %%Pages: comment in header!\n" +#~ msgstr "ERROR: 沒有 %%Pages:標題中的註解!\n" + +#~ msgid "" +#~ "ERROR: No device URI found in argv[0] or in DEVICE_URI environment " +#~ "variable!\n" +#~ msgstr "ERROR: 在 argv[0] 或 DEVICE_URI 環境變數中找不到設備 URI!\n" + +#~ msgid "ERROR: No fonts in charset file %s\n" +#~ msgstr "ERROR: 字元集檔案 %s 中沒有字體\n" + +#~ msgid "ERROR: No pages found!\n" +#~ msgstr "ERROR: 找不到頁面!\n" + +#~ msgid "ERROR: Out of paper!\n" +#~ msgstr "ERROR: 缺紙!\n" + +#~ msgid "ERROR: PRINTER environment variable not defined!\n" +#~ msgstr "ERROR: 未定義 PRINTER 環境變數!\n" + +#~ msgid "ERROR: Print file was not accepted (%s)!\n" +#~ msgstr "ERROR: 不接受列印檔案(%s)!\n" + +#~ msgid "ERROR: Printer not responding\n" +#~ msgstr "ERROR: 印表機未回應\n" + +#~ msgid "ERROR: Printer not responding!\n" +#~ msgstr "ERROR: 印表機未回應!\n" + +#~ msgid "ERROR: Printer sent unexpected EOF\n" +#~ msgstr "ERROR: 印表機傳送了非預期的 EOF\n" + +#~ msgid "ERROR: Remote host did not accept control file (%d)\n" +#~ msgstr "ERROR: 遠端主機未接受控制檔案(%d)\n" + +#~ msgid "ERROR: Remote host did not accept data file (%d)\n" +#~ msgstr "ERROR: 遠端主機未接受資料檔(%d)\n" + +#~ msgid "ERROR: There was a timeout error while sending data to the printer\n" +#~ msgstr "ERROR: 將資料傳送到印表機時發生逾時錯誤\n" + +#~ msgid "ERROR: Unable to add file %d to job: %s\n" +#~ msgstr "ERROR: 無法將檔案 %d 加入作業:%s\n" + +#~ msgid "ERROR: Unable to cancel job %d: %s\n" +#~ msgstr "ERROR: 無法取消作業 %d:%s\n" + +#~ msgid "ERROR: Unable to copy PDF file" +#~ msgstr "ERROR: 無法拷貝 PDF 檔案" + +#~ msgid "ERROR: Unable to create socket" +#~ msgstr "ERROR: 無法製作 socket" + +#~ msgid "ERROR: Unable to create temporary compressed print file: %s\n" +#~ msgstr "ERROR: 無法製作暫時的壓縮列印檔案:%s\n" + +#~ msgid "ERROR: Unable to create temporary file" +#~ msgstr "ERROR: 無法製作暫存檔" + +#~ msgid "ERROR: Unable to create temporary file - %s.\n" +#~ msgstr "ERROR: 無法製作暫存檔 - %s。\n" + +#~ msgid "ERROR: Unable to create temporary file: %s\n" +#~ msgstr "ERROR: 無法製作暫存檔:%s\n" + +#~ msgid "ERROR: Unable to exec pictwpstops: %s\n" +#~ msgstr "ERROR: 無法執行 pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to execute gs program" +#~ msgstr "ERROR: 無法執行 gs 程式" + +#~ msgid "ERROR: Unable to execute pdftops program" +#~ msgstr "ERROR: 無法執行 pdftops 程式" + +#~ msgid "ERROR: Unable to fork pictwpstops: %s\n" +#~ msgstr "ERROR: 無法分開 pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to get PAP request" +#~ msgstr "ERROR: 無法取得 PAP 請求" + +#~ msgid "ERROR: Unable to get PAP response" +#~ msgstr "ERROR: 無法取得 PAP 回應" + +#~ msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" +#~ msgstr "ERROR: 無法取得印表機“%s”的 PPD 檔案 - %s。\n" + +#~ msgid "ERROR: Unable to get default AppleTalk zone" +#~ msgstr "ERROR: 無法取得預設的 AppleTalk 區域" + +#~ msgid "ERROR: Unable to get job %d attributes (%s)!\n" +#~ msgstr "ERROR: 無法取得作業 %d 屬性(%s)!\n" + +#~ msgid "ERROR: Unable to get printer status (%s)!\n" +#~ msgstr "ERROR: 無法取得印表機狀態(%s)!\n" + +#~ msgid "ERROR: Unable to locate printer '%s'!\n" +#~ msgstr "ERROR: 找不到印表機 '%s'!\n" + +#~ msgid "ERROR: Unable to look for PAP response" +#~ msgstr "ERROR: 無法尋找 PAP 回應" + +#~ msgid "ERROR: Unable to lookup AppleTalk printers" +#~ msgstr "ERROR: 無法尋找 AppleTalk 印表機" + +#~ msgid "ERROR: Unable to make AppleTalk address" +#~ msgstr "ERROR: 無法設定 AppleTalk 地址" + +#~ msgid "ERROR: Unable to open \"%s\" - %s\n" +#~ msgstr "ERROR: 無法打開“%s”- %s\n" + +#~ msgid "ERROR: Unable to open %s: %s\n" +#~ msgstr "ERROR: 無法打開 %s:%s\n" + +#~ msgid "ERROR: Unable to open banner file \"%s\" - %s\n" +#~ msgstr "ERROR: 無法打開標語檔案“%s”- %s\n" + +#~ msgid "ERROR: Unable to open device file \"%s\": %s\n" +#~ msgstr "ERROR: 無法打開設備檔案“%s”:%s\n" + +#~ msgid "ERROR: Unable to open file \"%s\" - %s\n" +#~ msgstr "ERROR: 無法打開檔案“%s”- %s\n" + +#~ msgid "ERROR: Unable to open file \"%s\": %s\n" +#~ msgstr "ERROR: 無法打開檔案“%s”:%s\n" + +#~ msgid "ERROR: Unable to open image file for printing!\n" +#~ msgstr "ERROR: 無法打開要列印的影像檔!\n" + +#~ msgid "ERROR: Unable to open print file \"%s\": %s\n" +#~ msgstr "ERROR: 無法打開列印檔案“%s”:%s\n" + +#~ msgid "ERROR: Unable to open print file %s - %s\n" +#~ msgstr "ERROR: 無法打開列印檔案 %s - %s\n" + +#~ msgid "ERROR: Unable to open print file %s: %s\n" +#~ msgstr "ERROR: 無法打開列印檔案 %s:%s\n" + +#~ msgid "ERROR: Unable to open temporary compressed print file: %s\n" +#~ msgstr "ERROR: 無法打開暫時的壓縮列印檔案:%s\n" + +#~ msgid "ERROR: Unable to open temporary file" +#~ msgstr "ERROR: 無法打開暫存檔" + +#~ msgid "ERROR: Unable to print %d text columns!\n" +#~ msgstr "ERROR: 無法列印 %d 文字直欄!\n" + +#~ msgid "ERROR: Unable to print %dx%d text page!\n" +#~ msgstr "ERROR: 無法列印 %dx%d 文字頁面!\n" + +#~ msgid "ERROR: Unable to read print data" +#~ msgstr "ERROR: 無法讀取列印資料" + +#~ msgid "ERROR: Unable to read print data!\n" +#~ msgstr "ERROR: 無法讀取列印資料!\n" + +#~ msgid "ERROR: Unable to reserve port" +#~ msgstr "ERROR: 無法保留連接埠" + +#~ msgid "ERROR: Unable to seek to offset %ld in file - %s\n" +#~ msgstr "ERROR: 無法在檔案中尋找偏移 %ld - %s\n" + +#~ msgid "ERROR: Unable to seek to offset %lld in file - %s\n" +#~ msgstr "ERROR: 無法在檔案中尋找偏移 %lld - %s\n" + +#~ msgid "ERROR: Unable to send LPD command" +#~ msgstr "ERROR: 無法傳送 LPD 指令" + +#~ msgid "ERROR: Unable to send PAP tickle request" +#~ msgstr "ERROR: 無法傳送 PAP tickle 請求" + +#~ msgid "ERROR: Unable to send initial PAP send data request" +#~ msgstr "ERROR: 無法傳送初始 PAP 傳送資料請求" + +#~ msgid "ERROR: Unable to send print data (%d)\n" +#~ msgstr "ERROR: 無法傳送列印資料(%d)\n" + +#~ msgid "ERROR: Unable to send print data!\n" +#~ msgstr "ERROR: 無法傳送列印資料!\n" + +#~ msgid "ERROR: Unable to send print file to printer" +#~ msgstr "ERROR: 無法將列印檔案傳送至印表機" + +#~ msgid "ERROR: Unable to send trailing nul to printer" +#~ msgstr "ERROR: 無法將 trailing nul 傳送至印表機" + +#~ msgid "ERROR: Unable to wait for pictwpstops: %s\n" +#~ msgstr "ERROR: 無法等待 pictwpstops:%s\n" + +#~ msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" +#~ msgstr "ERROR: 無法將 %d 位元組寫入至“%s”:%s\n" + +#~ msgid "ERROR: Unable to write %d bytes to printer!\n" +#~ msgstr "ERROR: 無法將 %d 位元組寫入至印表機!\n" + +#~ msgid "ERROR: Unable to write control file" +#~ msgstr "ERROR: 無法寫入控制檔案" + +#~ msgid "ERROR: Unable to write print data" +#~ msgstr "ERROR: 無法寫入列印資料" + +#~ msgid "ERROR: Unable to write print data: %s\n" +#~ msgstr "ERROR: 無法寫入列印資料:%s\n" + +#~ msgid "ERROR: Unable to write raster data to driver!\n" +#~ msgstr "ERROR: 無法將水平掃瞄線資料寫入驅動程式!\n" + +#~ msgid "ERROR: Unable to write to temporary file" +#~ msgstr "ERROR: 無法寫入暫存檔" + +#~ msgid "ERROR: Unable to write uncompressed document data: %s\n" +#~ msgstr "ERROR: 無法寫入未壓縮的文件資料:%s\n" + +#~ msgid "ERROR: Unexpected text on line %d of %s!\n" +#~ msgstr "ERROR: %2$s 的第 %1$d 行有非預期的文字!\n" + +#~ msgid "ERROR: Unknown encryption option value \"%s\"!\n" +#~ msgstr "ERROR: 未知的加密選項值“%s”!\n" + +#~ msgid "ERROR: Unknown file order \"%s\"\n" +#~ msgstr "ERROR: 未知的檔案順序“%s”\n" + +#~ msgid "ERROR: Unknown format character \"%c\"\n" +#~ msgstr "ERROR: 未知的格式字元“%c”\n" + +#~ msgid "ERROR: Unknown message catalog format for \"%s\"!\n" +#~ msgstr "ERROR: “%s”的訊息目錄格式未知!\n" + +#~ msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" +#~ msgstr "ERROR: 未知的選項“%s”,值為“%s”!\n" + +#~ msgid "ERROR: Unknown print mode \"%s\"\n" +#~ msgstr "ERROR: 未知的列印模式“%s”\n" + +#~ msgid "ERROR: Unknown version option value \"%s\"!\n" +#~ msgstr "ERROR: 未知的版本選項值“%s”!\n" + +#~ msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" +#~ msgstr "ERROR: 不受支援的亮度值 %s,使用 brightness=100!\n" + +#~ msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" +#~ msgstr "ERROR: 不受支援的 gamma 值 %s,使用 gamma=1000!\n" + +#~ msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" +#~ msgstr "ERROR: 不受支援的 number-up 值 %d,使用 number-up=1!\n" + +#~ msgid "" +#~ "ERROR: Unsupported number-up-layout value %s, using number-up-" +#~ "layout=lrtb!\n" +#~ msgstr "" +#~ "ERROR: 不受支援的 number-up-layout 值 %s,使用 number-up-layout=lrtb!\n" + +#~ msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" +#~ msgstr "ERROR: 不受支援的 page-border 值 %s,使用 page-border=none!\n" + +#~ msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" +#~ msgstr "ERROR: 偵測到 doc_printf 溢位(%d 位元組),正在中斷!\n" + +#~ msgid "ERROR: pdftops filter crashed on signal %d!\n" +#~ msgstr "ERROR: pdftops 濾鏡在遇到訊號 %d 時當機!\n" + +#~ msgid "ERROR: pdftops filter exited with status %d!\n" +#~ msgstr "ERROR: pdftops 濾鏡以狀態 %d 結束!\n" + +#~ msgid "ERROR: pictwpstops exited on signal %d!\n" +#~ msgstr "ERROR: pictwpstops 在遇到訊號 %d 時結束!\n" + +#~ msgid "ERROR: pictwpstops exited with status %d!\n" +#~ msgstr "ERROR: pictwpstops 以狀態 %d 結束!\n" + +#~ msgid "" +#~ "ERROR: recoverable: Unable to connect to printer; will retry in 30 " +#~ "seconds...\n" +#~ msgstr "ERROR: 可回復:無法連接印表機;30 秒內將重試⋯\n" + +#~ msgid "ERROR: select() failed" +#~ msgstr "ERROR: select() 失敗" + +#~ msgid "ERROR: unable to stat print file" +#~ msgstr "ERROR: 無法開始列印檔案" + +#~ msgid "Empty PPD file!" +#~ msgstr "PPD 檔案為空!" + +#~ msgid "Error: need hostname after '-h' option!\n" +#~ msgstr "ERROR: '-h' 選項後面需要主機名稱!\n" + +#~ msgid "FAIL\n" +#~ msgstr "失敗\n" + +#~ msgid "" +#~ "File device URIs have been disabled! To enable, see the FileDevice " +#~ "directive in \"%s/cupsd.conf\"." +#~ msgstr "" +#~ "已停用檔案設備 URI!若要啟用,請參閱“%s/cupsd.conf”中的 FileDevice 指示。" + +#~ msgid "Fuser temperature high!" +#~ msgstr "加熱器溫度高!" + +#~ msgid "Fuser temperature low!" +#~ msgstr "加熱器溫度低!" + +#~ msgid "German FanFold" +#~ msgstr "德式折疊式報表紙(German FanFold)" + +#~ msgid "German FanFold Legal" +#~ msgstr "德式折疊式法定報表紙(German FanFold Legal)" + +#~ msgid "Got a printer-uri attribute but no job-id!" +#~ msgstr "已取得 printer-uri 屬性,但沒有 job-id!" + +#~ msgid "INFO: AppleTalk disabled in System Preferences\n" +#~ msgstr "INFO: 已在“系統偏好設定”中停用 AppleTalk\n" + +#~ msgid "INFO: AppleTalk disabled in System Preferences.\n" +#~ msgstr "INFO: 已在“系統偏好設定”中停用 AppleTalk。\n" + +#~ msgid "INFO: Canceling print job...\n" +#~ msgstr "INFO: 正在取消列印作業⋯\n" + +#~ msgid "INFO: Connected to printer...\n" +#~ msgstr "INFO: 已連接印表機⋯\n" + +#~ msgid "INFO: Connecting to printer...\n" +#~ msgstr "INFO: 正在連接印表機⋯\n" + +#~ msgid "INFO: Control file sent successfully\n" +#~ msgstr "INFO: 已成功傳送控制檔案\n" + +#~ msgid "INFO: Data file sent successfully\n" +#~ msgstr "INFO: 已成功傳送資料檔\n" + +#~ msgid "INFO: Formatting page %d...\n" +#~ msgstr "INFO: 正在格式化頁面 %d⋯\n" + +#~ msgid "INFO: Loading image file...\n" +#~ msgstr "INFO: 正在載入影像檔⋯\n" + +#~ msgid "INFO: Looking for printer...\n" +#~ msgstr "INFO: 正在尋找印表機⋯\n" + +#~ msgid "INFO: Opening connection\n" +#~ msgstr "INFO: 正在打開連線\n" + +#~ msgid "INFO: Print file sent, waiting for printer to finish...\n" +#~ msgstr "INFO: 已傳送列印檔案,正在等待印表機完成工作⋯\n" + +#~ msgid "INFO: Printer busy; will retry in 10 seconds...\n" +#~ msgstr "INFO: 印表機忙碌中;10 秒內將重試⋯\n" + +#~ msgid "INFO: Printer busy; will retry in 30 seconds...\n" +#~ msgstr "INFO: 印表機忙碌中;30 秒內將重試⋯\n" + +#~ msgid "INFO: Printer busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 印表機忙碌中;5 秒內將重試⋯\n" + +#~ msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" +#~ msgstr "INFO: 印表機不支援 IPP/%d.%d,正在嘗試 IPP/1.0⋯\n" + +#~ msgid "INFO: Printer is busy; will retry in 5 seconds...\n" +#~ msgstr "INFO: 印表機忙碌中;5 秒內將重試⋯\n" + +#~ msgid "INFO: Printer is currently off-line.\n" +#~ msgstr "INFO: 印表機目前已離線。\n" + +#~ msgid "INFO: Printer is currently offline.\n" +#~ msgstr "INFO: 印表機目前已離線。\n" + +#~ msgid "INFO: Printer is now online.\n" +#~ msgstr "INFO: 印表機已回到線上。\n" + +#~ msgid "INFO: Printer is offline.\n" +#~ msgstr "INFO: 印表機已離線。\n" + +#~ msgid "INFO: Printer not connected; will retry in 30 seconds...\n" +#~ msgstr "INFO: 未連接印表機;30 秒內將重試⋯\n" + +#~ msgid "INFO: Printing page %d, %d%% complete...\n" +#~ msgstr "INFO: 正在列印頁面 %d,%d%% 已完成⋯\n" + +#~ msgid "INFO: Printing page %d...\n" +#~ msgstr "INFO: 正在列印頁面 %d⋯\n" + +#~ msgid "INFO: Ready to print.\n" +#~ msgstr "INFO: 準備好進行列印。\n" + +#~ msgid "INFO: Sending control file (%lu bytes)\n" +#~ msgstr "INFO: 正在傳送控制檔案(%lu 位元組)\n" + +#~ msgid "INFO: Sending control file (%u bytes)\n" +#~ msgstr "INFO: 正在傳送控制檔案(%u 位元組)\n" + +#~ msgid "INFO: Sending data\n" +#~ msgstr "INFO: 正在傳送資料\n" + +#~ msgid "INFO: Sending data file (%ld bytes)\n" +#~ msgstr "INFO: 正在傳送資料檔(%ld 位元組)\n" + +#~ msgid "INFO: Sending data file (%lld bytes)\n" +#~ msgstr "INFO: 正在傳送資料檔(%lld 位元組)\n" + +#~ msgid "INFO: Sending print data...\n" +#~ msgstr "INFO: 正在傳送列印資料⋯\n" + +#~ msgid "INFO: Sent print file, %ld bytes...\n" +#~ msgstr "INFO: 已傳送列印檔案,%ld 位元組⋯\n" + +#~ msgid "INFO: Sent print file, %lld bytes...\n" +#~ msgstr "INFO: 已傳送列印檔案,%lld 位元組⋯\n" + +#~ msgid "INFO: Spooling LPR job, %.0f%% complete...\n" +#~ msgstr "INFO: 正在緩衝列印作業,%.0f%% 已完成⋯\n" + +#~ msgid "" +#~ "INFO: Unable to contact printer, queuing on next printer in class...\n" +#~ msgstr "INFO: 無法聯絡印表機,正在佇列等待類別中的下一個印表機⋯\n" + +#~ msgid "INFO: Using default AppleTalk zone \"%s\"\n" +#~ msgstr "INFO: 使用預設的 AppleTalk 區域“%s”\n" + +#~ msgid "INFO: Waiting for job to complete...\n" +#~ msgstr "INFO: 正在等待作業完成⋯\n" + +#~ msgid "INFO: Waiting for printer to become available...\n" +#~ msgstr "INFO: 正在等待印表機成為可用狀態⋯\n" + +#~ msgid "ISO B0" +#~ msgstr "ISO B0" + +#~ msgid "ISO B1" +#~ msgstr "ISO B1" + +#~ msgid "ISO B10" +#~ msgstr "ISO B10" + +#~ msgid "ISO B2" +#~ msgstr "ISO B2" + +#~ msgid "ISO B3" +#~ msgstr "ISO B3" + +#~ msgid "ISO B4" +#~ msgstr "ISO B4" + +#~ msgid "ISO B4 Envelope" +#~ msgstr "ISO B4 信封" + +#~ msgid "ISO B5" +#~ msgstr "ISO B5" + +#~ msgid "ISO B5 (Oversize)" +#~ msgstr "ISO B5(超大型)" + +#~ msgid "ISO B5 Envelope" +#~ msgstr "ISO B5 信封" + +#~ msgid "ISO B6" +#~ msgstr "ISO B6" + +#~ msgid "ISO B6 Envelope" +#~ msgstr "ISO B6 信封" + +#~ msgid "ISO B7" +#~ msgstr "ISO B7" + +#~ msgid "ISO B8" +#~ msgstr "ISO B8" + +#~ msgid "ISO B9" +#~ msgstr "ISO B9" + +#~ msgid "Ink/toner almost empty." +#~ msgstr "墨水或碳粉即將耗盡。" + +#~ msgid "Ink/toner empty!" +#~ msgstr "墨水或碳粉已耗盡!" + +#~ msgid "Ink/toner waste bin almost full." +#~ msgstr "墨水或碳粉廢料槽將滿。" + +#~ msgid "Ink/toner waste bin full!" +#~ msgstr "墨水或碳粉廢料槽已滿!" + +#~ msgid "Interlock open." +#~ msgstr "Interlock 已打開。" + +#~ msgid "Invite Envelope" +#~ msgstr "邀請信封" + +#~ msgid "Italian Envelope" +#~ msgstr "義大利信封" + +#~ msgid "Job #%d cannot be restarted - no files!" +#~ msgstr "無法重新啟動作業 #%d - 沒有檔案!" + +#~ msgid "Job #%d does not exist!" +#~ msgstr "作業 #%d 不存在!" + +#~ msgid "Job #%d is finished and cannot be altered!" +#~ msgstr "已完成作業 #%d 且無法更改!" + +#~ msgid "Job #%d is not complete!" +#~ msgstr "未完成作業 #%d!" + +#~ msgid "Job #%d is not held for authentication!" +#~ msgstr "未暫停作業 #%d 進行認證!" + +#~ msgid "Job #%d is not held!" +#~ msgstr "未暫停作業 #%d!" + +#~ msgid "Job #%s does not exist!" +#~ msgstr "作業 #%s 不存在!" + +#~ msgid "Job %d not found!" +#~ msgstr "找不到作業 %d!" + +#~ msgid "Job subscriptions cannot be renewed!" +#~ msgstr "無法更新作業訂閱!" + +#~ msgid "Kaku2 Envelope" +#~ msgstr "Kaku2 信封" + +#~ msgid "Kaku3 Envelope" +#~ msgstr "Kaku3 信封" + +#~ msgid "Language \"%s\" not supported!" +#~ msgstr "不支援語言“%s”!" + +#~ msgid "Media jam!" +#~ msgstr "媒體卡紙!" + +#~ msgid "Media tray almost empty." +#~ msgstr "媒體送紙匣即將用完。" + +#~ msgid "Media tray empty!" +#~ msgstr "媒體送紙匣為空!" + +#~ msgid "Media tray missing!" +#~ msgstr "找不到媒體送紙匣!" + +#~ msgid "Media tray needs to be filled." +#~ msgstr "媒體送紙匣需要添加紙張。" + +#~ msgid "Missing document-number attribute!" +#~ msgstr "遺失 document-number 屬性!" + +#~ msgid "Missing double quote on line %d!" +#~ msgstr "第 %d 行遺失雙引號!!" + +#~ msgid "Missing form variable!" +#~ msgstr "遺失表單變數!" + +#~ msgid "Missing notify-subscription-ids attribute!" +#~ msgstr "遺失 notify-subscription-ids 屬性!" + +#~ msgid "Missing requesting-user-name attribute!" +#~ msgstr "遺失 requesting-user-name 屬性!" + +#~ msgid "Missing required attributes!" +#~ msgstr "遺失必要的屬性!" + +#~ msgid "Missing value on line %d!" +#~ msgstr "第 %d 行遺失值!" + +#~ msgid "" +#~ "Model: name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" +#~ msgstr "" +#~ "型號:name = %s\n" +#~ " natural_language = %s\n" +#~ " make-and-model = %s\n" +#~ " device-id = %s\n" + +#~ msgid "Monarch" +#~ msgstr "Monarch" + +#~ msgid "Monarch Envelope" +#~ msgstr "Monarch 信封" + +#~ msgid "NOTICE: Print file accepted - job ID %d.\n" +#~ msgstr "NOTICE: 已接受列印檔案 - 作業 ID %d。\n" + +#~ msgid "NOTICE: Print file accepted - job ID unknown.\n" +#~ msgstr "NOTICE: 已接受列印檔案 - 作業 ID 未知。\n" + +#~ msgid "No PPD name!" +#~ msgstr "沒有 PPD 名稱!" + +#~ msgid "No Windows printer drivers are installed!" +#~ msgstr "未安裝 Windows 印表機驅動程式!" + +#~ msgid "No active jobs on %s!" +#~ msgstr "%s 上沒有已啟用的作業!" + +#~ msgid "No attributes in request!" +#~ msgstr "請求中沒有屬性!" + +#~ msgid "No authentication information provided!" +#~ msgstr "未提供認證資訊!" + +#~ msgid "No default printer" +#~ msgstr "沒有預設印表機" + +#~ msgid "No file!?!" +#~ msgstr "沒有檔案!?!" + +#~ msgid "No modification time!" +#~ msgstr "沒有修改時間!" + +#~ msgid "No printer name!" +#~ msgstr "沒有印表機名稱!" + +#~ msgid "No printer-uri found for class!" +#~ msgstr "找不到類別的 printer-uri!" + +#~ msgid "No printer-uri found!" +#~ msgstr "找不到 printer-uri!" + +#~ msgid "No printer-uri in request!" +#~ msgstr "請求中沒有 printer-uri!" + +#~ msgid "No subscription attributes in request!" +#~ msgstr "請求中沒有訂閱屬性!" + +#~ msgid "OPC almost at end-of-life." +#~ msgstr "OPC 壽命即將耗盡。" + +#~ msgid "OPC at end-of-life!" +#~ msgstr "OPC 壽命耗盡。" + +#~ msgid "Out of toner!" +#~ msgstr "碳粉已耗盡!" + +#~ msgid "Output bin almost full." +#~ msgstr "輸出槽將滿。" + +#~ msgid "Output bin full!" +#~ msgstr "輸出槽已滿!" + +#~ msgid "Output for printer %s is sent to %s\n" +#~ msgstr "已將印表機 %s 的輸出傳送至 %s\n" + +#~ msgid "Output for printer %s is sent to remote printer %s on %s\n" +#~ msgstr "已將印表機 %s 的輸出傳送至遠端印表機 %s(位於 %s 上)\n" + +#~ msgid "Output for printer %s/%s is sent to %s\n" +#~ msgstr "已將印表機 %s/%s 的輸出傳送至 %s\n" + +#~ msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" +#~ msgstr "已將印表機 %s/%s 的輸出傳送至遠端印表機 %s(位於 %s 上)\n" + +#~ msgid "Output tray missing!" +#~ msgstr "找不到輸出紙匣!" + +#~ msgid "PASS\n" +#~ msgstr "通過\n" + +#~ msgid "PRC1 Envelope" +#~ msgstr "PRC1 信封" + +#~ msgid "PRC10 Envelope" +#~ msgstr "PRC10 信封" + +#~ msgid "PRC2 Envelope" +#~ msgstr "PRC2 信封" + +#~ msgid "PRC3 Envelope" +#~ msgstr "PRC3 信封" + +#~ msgid "PRC32K (Oversize)" +#~ msgstr "PRC32K(超大型)" + +#~ msgid "PRC4 Envelope" +#~ msgstr "PRC4 信封" + +#~ msgid "PRC5 Envelope" +#~ msgstr "PRC5 信封" + +#~ msgid "PRC6 Envelope" +#~ msgstr "PRC6 信封" + +#~ msgid "PRC7 Envelope" +#~ msgstr "PRC7 信封" + +#~ msgid "PRC8 Envelope" +#~ msgstr "PRC8 信封" + +#~ msgid "PRC9 Envelope" +#~ msgstr "PRC9 信封" + +#~ msgid "Personal Envelope" +#~ msgstr "個人信封" + +#~ msgid "Printer offline." +#~ msgstr "印表機已離線。" + +#~ msgid "Rank Owner Job File(s) Total Size\n" +#~ msgstr "等級 持有人 作業 檔案 大小總計\n" + +#~ msgid "" +#~ "Rank Owner Pri Job Files Total Size\n" +#~ msgstr "" +#~ "等級 持有人 優先作業 檔案 大小總計\n" + +#~ msgid "Running command: %s %s -N -A %s -c '%s'\n" +#~ msgstr "執行指令:%s %s -N -A %s -c '%s'\n" + +#~ msgid "SCSI Printer" +#~ msgstr "SCSI 印表機" + +#~ msgid "Tabloid (Oversize)" +#~ msgstr "小報用紙-超大型(Tabloid-Oversize)" + +#~ msgid "The notify-user-data value is too large (%d > 63 octets)!" +#~ msgstr "notify-user-data 值太大(%d > 63 八位元組)!" + +#~ msgid "The printer or class is not shared!" +#~ msgstr "未共享印表機或類別!" + +#~ msgid "The printer or class was not found." +#~ msgstr "找不到印表機或類別。" + +#~ msgid "The printer-uri attribute is required!" +#~ msgstr "需要 printer-uri 屬性!" + +#~ msgid "Toner low." +#~ msgstr "碳粉過少。" + +#~ msgid "Too many job-sheets values (%d > 2)!" +#~ msgstr "太多 job-sheets 值(%d > 2)!" + +#~ msgid "Too many printer-state-reasons values (%d > %d)!" +#~ msgstr "太多 printer-state-reasons 值(%d > %d)!" + +#~ msgid "US Executive" +#~ msgstr "美式行政用紙(US Executive)" + +#~ msgid "US Fanfold" +#~ msgstr "美式折疊式報表紙(US Fanfold)" + +#~ msgid "US Legal (Oversize)" +#~ msgstr "美式法定紙-超大型(US Legal-Oversize)" + +#~ msgid "US Letter (Oversize)" +#~ msgstr "美式信紙-超大型(US Letter-Oversize)" + +#~ msgid "US Letter (Small)" +#~ msgstr "美式信紙-小型(US Letter-Small)" + +#~ msgid "Unable to add job for destination \"%s\"!" +#~ msgstr "無法為目的地“%s”加入作業!" + +#~ msgid "Unable to allocate memory for file types!" +#~ msgstr "無法為檔案類型分配記憶體!" + +#~ msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" +#~ msgstr "無法拷貝 64 位元 CUPS 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to copy 64-bit Windows printer driver files (%d)!" +#~ msgstr "無法拷貝 64 位元 Windows 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to copy CUPS printer driver files (%d)!" +#~ msgstr "無法拷貝 CUPS 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to copy PPD file - %s!" +#~ msgstr "無法拷貝 PPD 檔案 - %s!" + +#~ msgid "Unable to copy PPD file!" +#~ msgstr "無法拷貝 PPD 檔案!" + +#~ msgid "Unable to copy Windows 2000 printer driver files (%d)!" +#~ msgstr "無法拷貝 Windows 2000 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to copy Windows 9x printer driver files (%d)!" +#~ msgstr "無法拷貝 Windows 9x 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to copy interface script - %s!" +#~ msgstr "無法拷貝介面工序指令 - %s!" + +#~ msgid "Unable to create printer-uri!" +#~ msgstr "無法製作 printer-uri!" + +#~ msgid "Unable to edit cupsd.conf files larger than 1MB!" +#~ msgstr "無法編輯大小超過 1MB 的 cupsd.conf 檔案!" + +#~ msgid "Unable to find destination for job!" +#~ msgstr "找不到作業的目的地!" + +#~ msgid "Unable to find printer!\n" +#~ msgstr "找不到印表機!\n" + +#~ msgid "Unable to install Windows 2000 printer driver files (%d)!" +#~ msgstr "無法安裝 Windows 2000 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to install Windows 9x printer driver files (%d)!" +#~ msgstr "無法安裝 Windows 9x 印表機驅動程式檔案(%d)!" + +#~ msgid "Unable to open document %d in job %d!" +#~ msgstr "無法打開文件 %d(在作業 %d 中)!" + +#~ msgid "Unable to run \"%s\": %s\n" +#~ msgstr "無法執行“%s”:%s\n" + +#~ msgid "Unable to send command to printer driver!" +#~ msgstr "無法將指令傳送至印表機驅動程式!" + +#~ msgid "Unable to set Windows printer driver (%d)!" +#~ msgstr "無法設定 Windows 印表機驅動程式(%d)!" + +#~ msgid "Unable to use legacy USB class driver!\n" +#~ msgstr "無法使用繼承的 USB 類別驅動程式!\n" + +#~ msgid "Unknown printer error (%s)!" +#~ msgstr "未知的印表機錯誤(%s)!" + +#~ msgid "Unsupported character set \"%s\"!" +#~ msgstr "不受支援的字元集“%s”!" + +#~ msgid "Unsupported compression \"%s\"!" +#~ msgstr "不受支援的壓縮“%s”!" + +#~ msgid "Unsupported compression attribute %s!" +#~ msgstr "不受支援的壓縮屬性 %s!" + +#~ msgid "Unsupported format \"%s\"!" +#~ msgstr "不受支援的格式“%s”!" + +#~ msgid "Unsupported format '%s'!" +#~ msgstr "不受支援的格式 '%s'!" + +#~ msgid "Unsupported format '%s/%s'!" +#~ msgstr "不受支援的格式 '%s/%s'!" + +#~ msgid "" +#~ "Usage:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" +#~ msgstr "" +#~ "使用:\n" +#~ "\n" +#~ " lpadmin [-h server] -d destination\n" +#~ " lpadmin [-h server] -x destination\n" +#~ " lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m " +#~ "model]\n" +#~ " [-r remove-class] [-v device] [-D description]\n" +#~ " [-P ppd-file] [-o name=value]\n" +#~ " [-u allow:user,user] [-u deny:user,user]\n" +#~ "\n" + +#~ msgid "Usage: %s job user title copies options [filename]\n" +#~ msgstr "使用:%s 作業使用者標題拷貝選項 [檔名]\n" + +#~ msgid "Usage: %s job-id user title copies options [file]\n" +#~ msgstr "使用:%s job-id 使用者標題拷貝選項 [檔案]\n" + +#~ msgid "Usage: %s job-id user title copies options file\n" +#~ msgstr "使用:%s job-id 使用者標題拷貝選項檔案\n" + +#~ msgid "" +#~ "Usage: convert [ options ]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -f filename Set file to be converted (otherwise stdin)\n" +#~ " -o filename Set file to be generated (otherwise stdout)\n" +#~ " -i mime/type Set input MIME type (otherwise auto-typed)\n" +#~ " -j mime/type Set output MIME type (otherwise application/pdf)\n" +#~ " -P filename.ppd Set PPD file\n" +#~ " -a 'name=value ...' Set option(s)\n" +#~ " -U username Set username for job\n" +#~ " -J title Set title\n" +#~ " -c copies Set number of copies\n" +#~ " -u Remove the PPD file when finished\n" +#~ " -D Remove the input file when finished\n" +#~ msgstr "" +#~ "使用:convert [ options ]\n" +#~ "\n" +#~ "選項:\n" +#~ "\n" +#~ " -f filename 設定要轉換的檔案(否則為 stdin)\n" +#~ " -o filename 設定要產生的檔案(否則為 stdout)\n" +#~ " -i mime/type 設定輸入 MIME 類型(否則為 auto-typed)\n" +#~ " -j mime/type 設定輸出 MIME 類型(否則為 application/pdf)\n" +#~ " -P filename.ppd 設定 PPD 檔案\n" +#~ " -a 'name=value ...' 設定選項\n" +#~ " -U username 設定作業的使用者名稱\n" +#~ " -J title 設定標題\n" +#~ " -c copies 設定份數\n" +#~ " -u 完成時移除 PPD 檔案\n" +#~ " -D 完成時移除輸入檔案\n" + +#~ msgid "" +#~ "Usage: cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "Options:\n" +#~ " -E Encrypt the connection to the server\n" +#~ " -H samba-server Use the named SAMBA server\n" +#~ " -U samba-user Authenticate using the named SAMBA user\n" +#~ " -a Export all printers\n" +#~ " -h cups-server Use the named CUPS server\n" +#~ " -v Be verbose (show commands)\n" +#~ msgstr "" +#~ "使用:cupsaddsmb [options] printer1 ... printerN\n" +#~ " cupsaddsmb [options] -a\n" +#~ "\n" +#~ "選項:\n" +#~ " -E 加密與伺服器的連線\n" +#~ " -H samba-server 使用已命名的 SAMBA 伺服器\n" +#~ " -U samba-user 使用已命名的 SAMBA 使用者進行認證\n" +#~ " -a 輸出所有印表機\n" +#~ " -h cups-server 使用已命名的 CUPS 伺服器\n" +#~ " -v 列出明細(顯示指令)\n" + +#~ msgid "" +#~ "Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -E Enable encryption\n" +#~ " -U username Specify username\n" +#~ " -h server[:port] Specify server address\n" +#~ "\n" +#~ " --[no-]debug-logging Turn debug logging on/off\n" +#~ " --[no-]remote-admin Turn remote administration on/off\n" +#~ " --[no-]remote-any Allow/prevent access from the Internet\n" +#~ " --[no-]remote-printers Show/hide remote printers\n" +#~ " --[no-]share-printers Turn printer sharing on/off\n" +#~ " --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +#~ msgstr "" +#~ "使用:cupsctl [options] [param=value ... paramN=valueN]\n" +#~ "\n" +#~ "選項:\n" +#~ "\n" +#~ " -E 啟用加密\n" +#~ " -U username 指定使用者名稱\n" +#~ " -h server[:port] 指定伺服器位址\n" +#~ "\n" +#~ " --[no-]debug-logging 開啟/關閉除錯記錄\n" +#~ " --[no-]remote-admin 開啟/關閉遠端管理\n" +#~ " --[no-]remote-any 允許∕不允許從 Internet 存取\n" +#~ " --[no-]remote-printers 顯示∕隱藏遠端印表機\n" +#~ " --[no-]share-printers 開啟/關閉印表機共享\n" +#~ " --[no-]user-cancel-any 允許∕不允許使用者取消任何作業\n" + +#~ msgid "" +#~ "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file Load alternate configuration file\n" +#~ "-f Run in the foreground\n" +#~ "-F Run in the foreground but detach\n" +#~ "-h Show this usage message\n" +#~ "-l Run cupsd from launchd(8)\n" +#~ msgstr "" +#~ "使用:cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +#~ "\n" +#~ "-c config-file 載入替用配置檔案\n" +#~ "-f 在前景執行\n" +#~ "-F 在前景執行但與之分離\n" +#~ "-h 顯示本用法訊息\n" +#~ "-l 從 launchd(8) 執行 cupsd\n" + +#~ msgid "" +#~ "Usage: cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -c cupsd.conf Set cupsd.conf file to use\n" +#~ " -j job-id[,N] Filter file N from the specified job (default is file " +#~ "1)\n" +#~ " -n copies Set number of copies\n" +#~ " -o name=value Set option(s)\n" +#~ " -p filename.ppd Set PPD file\n" +#~ " -t title Set title\n" +#~ msgstr "" +#~ "使用:cupsfilter -m mime/type [ options ] filename\n" +#~ "\n" +#~ "選項:\n" +#~ "\n" +#~ " -c cupsd.conf 設定要使用的 cupsd.conf 檔案\n" +#~ " -j job-id[,N] 從指定的作業過濾檔案 N(預設為檔案 1)\n" +#~ " -n copies 設定份數\n" +#~ " -o name=value 設定選項\n" +#~ " -p filename.ppd 設定 PPD 檔案\n" +#~ " -t title 設定標題\n" + +#~ msgid "" +#~ "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -h Show program usage\n" +#~ "\n" +#~ " Note: this program only validates the DSC comments, not the " +#~ "PostScript itself.\n" +#~ msgstr "" +#~ "使用:cupstestdsc [options] filename.ps [... filename.ps]\n" +#~ " cupstestdsc [options] -\n" +#~ "\n" +#~ "選項:\n" +#~ "\n" +#~ " -h 顯示程式用法\n" +#~ "\n" +#~ " NOTICE: 此程式僅驗證 DSC 註解,而不是 PostScript 本身。\n" + +#~ msgid "" +#~ "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "Options:\n" +#~ "\n" +#~ " -R root-directory Set alternate root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " Issue warnings instead of errors\n" +#~ " -q Run silently\n" +#~ " -r Use 'relaxed' open mode\n" +#~ " -v Be slightly verbose\n" +#~ " -vv Be very verbose\n" +#~ msgstr "" +#~ "使用:cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +#~ " program | cupstestppd [options] -\n" +#~ "\n" +#~ "選項:\n" +#~ "\n" +#~ " -R root-directory 設定替用 root\n" +#~ " -W {all,none,constraints,defaults,duplex,filters,translations}\n" +#~ " 發出警告而不是錯誤\n" +#~ " -q 靜音執行\n" +#~ " -r 使用 'relaxed' 打開模式\n" +#~ " -v 列出明細\n" +#~ " -vv 列出詳盡明細\n" + +#~ msgid "Usage: lpmove job/src dest\n" +#~ msgstr "使用:lpmove job/src dest\n" + +#~ msgid "" +#~ "Usage: lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" +#~ msgstr "" +#~ "使用:lpoptions [-h server] [-E] -d printer\n" +#~ " lpoptions [-h server] [-E] [-p printer] -l\n" +#~ " lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +#~ " lpoptions [-h server] [-E] -x printer\n" + +#~ msgid "Usage: lppasswd [-g groupname]\n" +#~ msgstr "使用:lppasswd [-g groupname]\n" + +#~ msgid "" +#~ "Usage: lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" +#~ msgstr "" +#~ "使用:lppasswd [-g groupname] [username]\n" +#~ " lppasswd [-g groupname] -a [username]\n" +#~ " lppasswd [-g groupname] -x [username]\n" + +#~ msgid "" +#~ "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" +#~ msgstr "" +#~ "使用:lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" + +#~ msgid "" +#~ "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -c catalog.po Load the specified message catalog.\n" +#~ " -d output-dir Specify the output directory.\n" +#~ " -l lang[,lang,...] Specify the output language(s) (locale).\n" +#~ " -m Use the ModelName value as the filename.\n" +#~ " -t Test PPDs instead of generating them.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ " -z Compress PPD files using GNU zip.\n" +#~ " --cr End lines with CR (Mac OS 9).\n" +#~ " --crlf End lines with CR + LF (Windows).\n" +#~ " --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +#~ msgstr "" +#~ "使用:ppdc [options] filename.drv [ ... filenameN.drv ]\n" +#~ "選項:\n" +#~ " -D name=value 為已命名的變數設定值。\n" +#~ " -I include-dir 將包含的目錄加入搜尋路徑。\n" +#~ " -c catalog.po 載入指定的訊息目錄。\n" +#~ " -d output-dir 指定輸出目錄。\n" +#~ " -l lang[,lang,...] 指定輸出語言(區域環境設定)。\n" +#~ " -m 使用 ModelName 值作為檔名。\n" +#~ " -t 測試而不是產生 PPD。\n" +#~ " -v 列出明細(v 越多就越詳盡)。\n" +#~ " -z 使用 GNU zip 壓縮 PPD 檔案。\n" +#~ " --cr 以 CR 作為行結尾(Mac OS 9)。\n" +#~ " --crlf 以 CR + LF 作為行結尾(Windows)。\n" +#~ " --lf 以 LF 作為行結尾(UNIX/Linux/Mac OS X)。\n" + +#~ msgid "" +#~ "Usage: ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value Set named variable to value.\n" +#~ "Options:\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ msgstr "" +#~ "使用:ppdhtml [options] filename.drv >filename.html\n" +#~ " -D name=value 為已命名的變數設定值。\n" +#~ "選項:\n" +#~ " -I include-dir 將包含的目錄加入搜尋路徑。\n" + +#~ msgid "" +#~ "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" +#~ msgstr "" +#~ "使用:ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "選項:\n" +#~ " -I include-dir\n" +#~ " -o filename.drv\n" + +#~ msgid "" +#~ "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "Options:\n" +#~ " -o filename.ppd[.gz]\n" +#~ msgstr "" +#~ "使用:ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +#~ "選項:\n" +#~ " -o filename.ppd[.gz]\n" + +#~ msgid "" +#~ "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "Options:\n" +#~ " -D name=value Set named variable to value.\n" +#~ " -I include-dir Add include directory to search path.\n" +#~ " -v Be verbose (more v's for more verbosity).\n" +#~ msgstr "" +#~ "使用:ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +#~ "選項:\n" +#~ " -D name=value 為已命名的變數設定值。\n" +#~ " -I include-dir 將包含的目錄加入搜尋路徑。\n" +#~ " -v 列出明細(v 越多就越詳盡)。\n" + +#~ msgid "Usage: snmp [host-or-ip-address]\n" +#~ msgstr "使用:snmp [host-or-ip-address]\n" + +#~ msgid "WARNING: Adding only the first %d printers found" +#~ msgstr "WARNING: 僅加入找到的前 %d 個印表機" + +#~ msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" +#~ msgstr "WARNING: waiteof 選項“%s”預期為布林類型\n" + +#~ msgid "WARNING: Failed to read side-channel request!\n" +#~ msgstr "WARNING: 無法讀取 side-channel 請求!\n" + +#~ msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" +#~ msgstr "WARNING: 無法透過 IncludeFeature 併入選項“%s”!\n" + +#~ msgid "WARNING: Printer not responding\n" +#~ msgstr "WARNING: 印表機未回應!" + +#~ msgid "WARNING: Printer sent unexpected EOF\n" +#~ msgstr "WARNING: 印表機傳送了非預期的 EOF\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with command status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: 遠端主機未在 %d 秒後對指令狀態位元組產生回應!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with control status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: 遠端主機未在 %d 秒後對控制狀態位元組產生回應!\n" + +#~ msgid "" +#~ "WARNING: Remote host did not respond with data status byte after %d " +#~ "seconds!\n" +#~ msgstr "WARNING: 遠端主機未在 %d 秒後對資料狀態位元組產生回應!\n" + +#~ msgid "WARNING: SCSI command timed out (%d); retrying...\n" +#~ msgstr "WARNING: SCSI 指令逾時(%d);正在重試⋯\n" + +#~ msgid "" +#~ "WARNING: This document does not conform to the Adobe Document Structuring " +#~ "Conventions and may not print correctly!\n" +#~ msgstr "WARNING: 此文件未遵循“Adobe 文件結構慣例”,而且不能正確地列印!\n" + +#~ msgid "WARNING: Unable to open \"%s:%s\": %s\n" +#~ msgstr "WARNING: 無法打開“%s:%s”:%s\n" + +#~ msgid "WARNING: Unable to send PAP status request" +#~ msgstr "WARNING: 無法傳送 PAP 狀態請求!" + +#~ msgid "WARNING: Unexpected PAP packet of type %d\n" +#~ msgstr "WARNING: 類型 %d 的非預期 PAP 封包\n" + +#~ msgid "WARNING: Unknown PAP packet of type %d\n" +#~ msgstr "WARNING: 類型 %d 的未知 PAP 封包\n" + +#~ msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" +#~ msgstr "WARNING: 未知的選項“%s”(針對選項“%s”)!\n" + +#~ msgid "WARNING: Unknown option \"%s\"!\n" +#~ msgstr "WARNING: 未知的選項“%s”!\n" + +#~ msgid "WARNING: Unsupported baud rate %s!\n" +#~ msgstr "WARNING: 不受支援的傳輸速率 %s!\n" + +#~ msgid "WARNING: number expected for status option \"%s\"\n" +#~ msgstr "WARNING: 狀態選項“%s”預期為數字\n" + +#~ msgid "" +#~ "WARNING: recoverable: Network host '%s' is busy; will retry in %d " +#~ "seconds...\n" +#~ msgstr "WARNING: 可回復:網路主機 '%s' 忙碌中;%d 內將重試⋯\n" + +#~ msgid "Warning, no Windows 2000 printer drivers are installed!" +#~ msgstr "警告,未安裝 Windows 2000 印表機驅動程式!" + +#~ msgid "You4 Envelope" +#~ msgstr "You4 信封" + +#~ msgid "convert: Use the -f option to specify a file to convert.\n" +#~ msgstr "convert:使用 -f 選項來指定要轉換的檔案。\n" + +#~ msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" +#~ msgstr "cupsaddsmb:沒有適用於印表機“%s”的 PPD 檔案 - %s\n" + +#~ msgid "cupsctl: Unable to connect to server: %s\n" +#~ msgstr "cupsctl:無法連接伺服器:%s\n" + +#~ msgid "cupsctl: Unknown option \"%s\"!\n" +#~ msgstr "cupsctl:未知的選項“%s”!\n" + +#~ msgid "cupsctl: Unknown option \"-%c\"!\n" +#~ msgstr "cupsctl:未知的選項“-%c”!\n" + +#~ msgid "cupsd: Expected config filename after \"-c\" option!\n" +#~ msgstr "cupsd:“-c”選項後面預期為配置檔案名稱!\n" + +#~ msgid "cupsd: Unable to get current directory!\n" +#~ msgstr "cupsd:無法取得目前的目錄!\n" + +#~ msgid "cupsd: Unknown argument \"%s\" - aborting!\n" +#~ msgstr "cupsd:未知的參數“%s”- 正在中止!\n" + +#~ msgid "cupsd: Unknown option \"%c\" - aborting!\n" +#~ msgstr "cupsd:未知的選項“%c”- 正在中止!\n" + +#~ msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" +#~ msgstr "cupsd:未編譯入 launchd(8) 支援,在正常模式下執行。\n" + +#~ msgid "cupsfilter: Invalid document number %d!\n" +#~ msgstr "cupsfilter:無效的文件編號 %d!\n" + +#~ msgid "cupsfilter: Invalid job ID %d!\n" +#~ msgstr "cupsfilter:無效的作業 ID %d!\n" + +#~ msgid "cupsfilter: Only one filename can be specified!\n" +#~ msgstr "cupsfilter:只能指定一個檔名!\n" + +#~ msgid "cupsfilter: Unable to create temporary file: %s\n" +#~ msgstr "cupsfilter:無法製作暫存檔:%s\n" + +#~ msgid "cupsfilter: Unable to get job file - %s\n" +#~ msgstr "cupsfilter:無法取得作業檔案 - %s\n" + +#~ msgid "cupstestppd: The -q option is incompatible with the -v option.\n" +#~ msgstr "cupstestppd:-q 選項與 -v 選項不相容。\n" + +#~ msgid "cupstestppd: The -v option is incompatible with the -q option.\n" +#~ msgstr "cupstestppd:-v 選項與 -q 選項不相容。\n" + +#~ msgid "device for %s/%s: %s\n" +#~ msgstr "%s/%s 的設備:%s\n" + +#~ msgid "device for %s: %s\n" +#~ msgstr "%s 的設備:%s\n" + +#~ msgid "help\t\tget help on commands\n" +#~ msgstr "輔助說明\t\t取得指令的輔助說明\n" + +#~ msgid "job-printer-uri attribute missing!" +#~ msgstr "job-printer-uri 屬性遺失!" + +#~ msgid "lpadmin: Class name can only contain printable characters!\n" +#~ msgstr "lpadmin:類別名稱只能包含可列印的字元!\n" + +#~ msgid "lpadmin: Expected PPD after '-P' option!\n" +#~ msgstr "lpadmin:'-P' 選項後面預期為 PPD!\n" + +#~ msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" +#~ msgstr "lpadmin:&aops;-u&aops; 選項後面預期為 allow/deny:userlist!\n" + +#~ msgid "lpadmin: Expected class after '-r' option!\n" +#~ msgstr "lpadmin:&aops;-r&aops; 選項後面預期為類別!\n" + +#~ msgid "lpadmin: Expected class name after '-c' option!\n" +#~ msgstr "lpadmin:&aops;-c&aops; 選項後面預期為類別名稱!\n" + +#~ msgid "lpadmin: Expected description after '-D' option!\n" +#~ msgstr "lpadmin:&aops;-D&aops; 選項後面預期為描述!\n" + +#~ msgid "lpadmin: Expected device URI after '-v' option!\n" +#~ msgstr "lpadmin:&aops;-v&aops; 選項後面預期為設備 URI!\n" + +#~ msgid "lpadmin: Expected file type(s) after '-I' option!\n" +#~ msgstr "lpadmin:&aops;-I&aops; 選項後面預期為檔案類型!\n" + +#~ msgid "lpadmin: Expected hostname after '-h' option!\n" +#~ msgstr "lpadmin:&aops;-h&aops; 選項後面預期為主機名稱!\n" + +#~ msgid "lpadmin: Expected interface after '-i' option!\n" +#~ msgstr "lpadmin:&aops;-i&aops; 選項後面預期為介面!\n" + +#~ msgid "lpadmin: Expected location after '-L' option!\n" +#~ msgstr "lpadmin:'-L' 選項後面預期為位置!\n" + +#~ msgid "lpadmin: Expected model after '-m' option!\n" +#~ msgstr "lpadmin:'-m' 選項後面預期為型號!\n" + +#~ msgid "lpadmin: Expected name=value after '-o' option!\n" +#~ msgstr "lpadmin:&aops;-o&aops; 選項後面預期為 name=value!\n" + +#~ msgid "lpadmin: Expected printer after '-p' option!\n" +#~ msgstr "lpadmin:'-p' 選項後面預期為印表機!\n" + +#~ msgid "lpadmin: Expected printer name after '-d' option!\n" +#~ msgstr "lpadmin:'-d' 選項後面預期為印表機名稱!\n" + +#~ msgid "lpadmin: Expected printer or class after '-x' option!\n" +#~ msgstr "lpadmin:'-x' 選項後面預期為印表機或類別!\n" + +#~ msgid "lpadmin: No member names were seen!\n" +#~ msgstr "lpadmin:未發現會員名稱!\n" + +#~ msgid "lpadmin: Printer %s is already a member of class %s.\n" +#~ msgstr "lpadmin:印表機 %s 已經是類別 %s 的成員。\n" + +#~ msgid "lpadmin: Printer %s is not a member of class %s.\n" +#~ msgstr "lpadmin:印表機 %s 不是類別 %s 的成員。\n" + +#~ msgid "lpadmin: Printer name can only contain printable characters!\n" +#~ msgstr "lpadmin:印表機名稱只能包含可列印的字元!\n" + +#~ msgid "" +#~ "lpadmin: Unable to add a printer to the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法將印表機加入到類別:\n" +#~ " 您必須現指定印表機名稱!\n" + +#~ msgid "lpadmin: Unable to connect to server: %s\n" +#~ msgstr "lpadmin:無法連接伺服器:%s\n" + +#~ msgid "lpadmin: Unable to create temporary file - %s\n" +#~ msgstr "lpadmin:無法製作暫存檔 - %s\n" + +#~ msgid "lpadmin: Unable to create temporary file: %s\n" +#~ msgstr "lpadmin:無法製作暫存檔:%s\n" + +#~ msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" +#~ msgstr "lpadmin:無法打開 PPD 檔案“%s”- %s\n" + +#~ msgid "lpadmin: Unable to open file \"%s\": %s\n" +#~ msgstr "lpadmin:無法打開檔案“%s”:%s\n" + +#~ msgid "" +#~ "lpadmin: Unable to remove a printer from the class:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法從類別中移除印表機:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定 PPD 檔案:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the device URI:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定設備 URI:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script or PPD file:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定 PPD 檔案的介面工序指令:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the interface script:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定介面工序指令:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer description:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定印表機描述:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer location:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定印表機位置:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "" +#~ "lpadmin: Unable to set the printer options:\n" +#~ " You must specify a printer name first!\n" +#~ msgstr "" +#~ "lpadmin:無法設定印表機選項:\n" +#~ " 您必須先指定印表機名稱!\n" + +#~ msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" +#~ msgstr "lpadmin:未知的 allow/deny 選項“%s”!\n" + +#~ msgid "lpadmin: Unknown argument '%s'!\n" +#~ msgstr "lpadmin:未知的參數 '%s'!\n" + +#~ msgid "lpadmin: Unknown option '%c'!\n" +#~ msgstr "lpadmin:未知的選項 '%c'!\n" + +#~ msgid "lpadmin: Warning - content type list ignored!\n" +#~ msgstr "lpadmin:警告 - 已忽略內容類型列表!\n" + +#~ msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" +#~ msgstr "lpinfo:--device-id 後面預期為 1284 設備 ID 字串!\n" + +#~ msgid "lpinfo: Expected language after --language!\n" +#~ msgstr "lpinfo:--language 後面預期為語言!\n" + +#~ msgid "lpinfo: Expected make and model after --make-and-model!\n" +#~ msgstr "lpinfo:--make-and-model 後面預期為製造和型號!\n" + +#~ msgid "lpinfo: Expected product string after --product!\n" +#~ msgstr "lpinfo:--product 後面預期為產品字串!\n" + +#~ msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" +#~ msgstr "lpinfo:--exclude-schemes 後面預期為架構列表!\n" + +#~ msgid "lpinfo: Expected scheme list after --include-schemes!\n" +#~ msgstr "lpinfo:--include-schemes 後面預期為架構列表!\n" + +#~ msgid "lpinfo: Expected timeout after --timeout!\n" +#~ msgstr "lpinfo:--timeout 後面預期為逾時!\n" + +#~ msgid "lpinfo: Unknown argument '%s'!\n" +#~ msgstr "lpinfo:未知的參數 '%s'!\n" + +#~ msgid "lpinfo: Unknown option '%c'!\n" +#~ msgstr "lpinfo:未知的選項 '%c'!\n" + +#~ msgid "lpinfo: Unknown option '%s'!\n" +#~ msgstr "lpinfo:未知的選項 '%s'!\n" + +#~ msgid "lpmove: Unable to connect to server: %s\n" +#~ msgstr "lpmove:無法連接伺服器:%s\n" + +#~ msgid "lpmove: Unknown argument '%s'!\n" +#~ msgstr "lpmove:未知的參數 '%s'!\n" + +#~ msgid "lpmove: Unknown option '%c'!\n" +#~ msgstr "lpmove:未知的選項 '%c'!\n" + +#~ msgid "lpoptions: No printers!?!\n" +#~ msgstr "lpoptions:沒有印表機!?!\n" + +#~ msgid "lpoptions: Unable to add printer or instance: %s\n" +#~ msgstr "lpoptions:無法新增印表機或實例:%s\n" + +#~ msgid "lpoptions: Unable to get PPD file for %s: %s\n" +#~ msgstr "lpoptions:無法取得 %s 的 PPD 檔案:%s\n" + +#~ msgid "lpoptions: Unable to open PPD file for %s!\n" +#~ msgstr "lpoptions:無法打開 %s 的 PPD 檔案!\n" + +#~ msgid "lpoptions: Unknown printer or class!\n" +#~ msgstr "lpoptions:未知的印表機或類別!\n" + +#~ msgid "lppasswd: Only root can add or delete passwords!\n" +#~ msgstr "lppasswd:只有 root 使用者才能加入或刪除密碼!\n" + +#~ msgid "lppasswd: Password file busy!\n" +#~ msgstr "lppasswd:密碼檔案忙碌中!\n" + +#~ msgid "lppasswd: Password file not updated!\n" +#~ msgstr "lppasswd:未更新密碼檔案!\n" + +#~ msgid "lppasswd: Sorry, password doesn't match!\n" +#~ msgstr "lppasswd:抱歉,密碼不相符!\n" + +#~ msgid "" +#~ "lppasswd: Sorry, password rejected.\n" +#~ "Your password must be at least 6 characters long, cannot contain\n" +#~ "your username, and must contain at least one letter and number.\n" +#~ msgstr "" +#~ "lppasswd:抱歉,密碼遭到拒絕。\n" +#~ "您的密碼長度至少必須為 6 個字元,不能包含\n" +#~ "使用者名稱,而且至少必須包含一個字母和數字。\n" + +#~ msgid "lppasswd: Sorry, passwords don't match!\n" +#~ msgstr "lppasswd:抱歉,密碼不相符!\n" + +#~ msgid "lppasswd: Unable to copy password string: %s\n" +#~ msgstr "lppasswd:無法拷貝密碼字串:%s\n" + +#~ msgid "lppasswd: Unable to open password file: %s\n" +#~ msgstr "lppasswd:無法打開密碼檔案:%s\n" + +#~ msgid "lppasswd: Unable to write to password file: %s\n" +#~ msgstr "lppasswd:無法寫入密碼檔案:%s\n" + +#~ msgid "lppasswd: failed to backup old password file: %s\n" +#~ msgstr "lppasswd:無法備份舊的密碼檔案:%s\n" + +#~ msgid "lppasswd: failed to rename password file: %s\n" +#~ msgstr "lppasswd:無法重新命名密碼檔案:%s\n" + +#~ msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" +#~ msgstr "lppasswd:使用者“%s”和群組“%s”不存在。\n" + +#~ msgid "" +#~ "lpstat: error - %s environment variable names non-existent destination \"%" +#~ "s\"!\n" +#~ msgstr "lpstat:錯誤 - %s 環境變數名稱中有不存在的目的地“%s”!\n" + +#~ msgid "members of class %s:\n" +#~ msgstr "類別 %s 的成員:\n" + +#~ msgid "no entries\n" +#~ msgstr "沒有項目\n" + +#~ msgid "no system default destination\n" +#~ msgstr "沒有系統預設目的地\n" + +#~ msgid "notify-events not specified!" +#~ msgstr "未指定 notify-events!" + +#~ msgid "notify-recipient-uri URI \"%s\" is already used!" +#~ msgstr "notify-recipient-uri URI“%s”已被使用!" + +#~ msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" +#~ msgstr "notify-recipient-uri URI“%s”使用的是未知的架構!" + +#~ msgid "notify-subscription-id %d no good!" +#~ msgstr "notify-subscription-id %d 不合適!" + +#~ msgid "ppdc: Adding include directory \"%s\"...\n" +#~ msgstr "ppdc:正在加入包含的目錄“%s”⋯\n" + +#~ msgid "ppdc: Adding/updating UI text from %s...\n" +#~ msgstr "ppdc:正在從 %s 加入/更新 UI 文字⋯\n" + +#~ msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" +#~ msgstr "ppdc:錯誤的布林值(%1$s),在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:錯誤的解析度名稱“%1$s”,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Bad status keyword %s on line %d of %s!\n" +#~ msgstr "ppdc:錯誤的狀態關鍵字 %1$s,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" +#~ msgstr "ppdc:錯誤的變數替代($%1$c),在 %3$s 的第 %2$d 行。\n" + +#~ msgid "ppdc: Choice found on line %d of %s with no Option!\n" +#~ msgstr "ppdc:在 %2$s 的第 %1$d 行發現沒有“選項”的選擇!\n" + +#~ msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" +#~ msgstr "ppdc:環境變數 %1$s 的 #po 重複,在 %3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Expected a filter definition on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有過濾定義!\n" + +#~ msgid "ppdc: Expected a program name on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有程式名稱!\n" + +#~ msgid "ppdc: Expected boolean value on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有布林值。\n" + +#~ msgid "ppdc: Expected charset after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Font 後面預期為字元集!\n" + +#~ msgid "ppdc: Expected choice code on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有選項代碼。\n" + +#~ msgid "ppdc: Expected choice name/text on line %d of %s.\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有選項名稱/文字。\n" + +#~ msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有 ColorModel 的顏色體系!\n" + +#~ msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有 ColorModel 的色彩空間!\n" + +#~ msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有 ColorModel 的壓縮度!\n" + +#~ msgid "" +#~ "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有 UIConstraints 的限制字串!\n" + +#~ msgid "" +#~ "ppdc: Expected driver type keyword following DriverType on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上 DriverType 後面預期有驅動程式類型關鍵字!\n" + +#~ msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Duplex 後面預期有兩用裝紙匣類型!\n" + +#~ msgid "ppdc: Expected encoding after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Font 後面預期為編碼!\n" + +#~ msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" +#~ msgstr "ppdc:#po %1$s 後面預期為檔名,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Expected group name/text on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有群組名稱/文字!\n" + +#~ msgid "ppdc: Expected include filename on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有包含的檔名!\n" + +#~ msgid "ppdc: Expected integer on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有整數!\n" + +#~ msgid "ppdc: Expected locale after #po on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 #po 後面預期有環境變數!\n" + +#~ msgid "ppdc: Expected name after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 後面預期有名稱,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Expected name after FileName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 FileName 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Font 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Manufacturer 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 MediaSize 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name after ModelName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 ModelName 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 PCFileName 後面預期為名稱!\n" + +#~ msgid "ppdc: Expected name/text after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 後面預期為名稱/文字,在 %3$s 的第 %2$d 行上。\n" + +#~ msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Installable 後面預期為名稱/文字!\n" + +#~ msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Resolution 後面預期為名稱/文字!\n" + +#~ msgid "" +#~ "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有 ColorModel 的名稱/文字組合!\n" + +#~ msgid "ppdc: Expected option name/text on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有選項名稱/文字!\n" + +#~ msgid "ppdc: Expected option section on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有選項部分!\n" + +#~ msgid "ppdc: Expected option type on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有選項類型!\n" + +#~ msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Resolution 後面預期有覆蓋欄位!\n" + +#~ msgid "ppdc: Expected real number on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有實數!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %" +#~ "s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上 ColorProfile 後面預期有解析度∕媒體類型!\n" + +#~ msgid "" +#~ "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %" +#~ "d of %s!\n" +#~ msgstr "" +#~ "ppdc:%2$s 的第 %1$d 行上 SimpleColorProfile 後面預期有解析度∕媒體類型!\n" + +#~ msgid "ppdc: Expected selector after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 後面預期有選擇器,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Expected status after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Font 後面預期為狀態!\n" + +#~ msgid "ppdc: Expected string after Copyright on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Copyright 後面預期有字串!\n" + +#~ msgid "ppdc: Expected string after Version on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Version 後面預期有字串!\n" + +#~ msgid "ppdc: Expected two option names on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上預期有兩個選項名稱!\n" + +#~ msgid "ppdc: Expected value after %s on line %d of %s!\n" +#~ msgstr "ppdc:%1$s 後面預期有值,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Expected version after Font on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上 Font 後面預期有版本!\n" + +#~ msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" +#~ msgstr "ppdc:無效的 #include/#po 檔名“%s”!\n" + +#~ msgid "ppdc: Invalid cost for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 第 %1$d 行上的過濾成本無效!\n" + +#~ msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上用於過濾的空 MIME 類型無效!\n" + +#~ msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行上用於過濾的空程式名稱無效!\n" + +#~ msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:無效的選項部分“%1$s”,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:無效的選項類型“%1$s”,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Loading driver information file \"%s\"...\n" +#~ msgstr "ppdc:正在載入驅動程式資訊檔案“%s”⋯\n" + +#~ msgid "ppdc: Loading messages for locale \"%s\"...\n" +#~ msgstr "ppdc:正在為環境變數“%s”載入訊息⋯\n" + +#~ msgid "ppdc: Loading messages from \"%s\"...\n" +#~ msgstr "ppdc:正在從“%s”載入訊息⋯\n" + +#~ msgid "ppdc: Missing #endif at end of \"%s\"!\n" +#~ msgstr "ppdc:“%s”末端遺失 #endif!\n" + +#~ msgid "ppdc: Missing #if on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 的第 %1$d 行中遺失 #if!\n" + +#~ msgid "ppdc: No message catalog provided for locale %s!\n" +#~ msgstr "ppdc:沒有針對環境變數 %s 提供的訊息目錄!\n" + +#~ msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" +#~ msgstr "ppdc:在 %3$s 的第 %2$d: 行上,以不同的類型重複定義了選項 %1$s!\n" + +#~ msgid "ppdc: Option constraint must *name on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 第 %1$d 行上的選項限制形式必須為 *name!\n" + +#~ msgid "ppdc: Too many nested #if's on line %d of %s!\n" +#~ msgstr "ppdc:%2$s 第 %1$d 行上的巢狀 #if 太多!\n" + +#~ msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" +#~ msgstr "ppdc:無法製作 PPD 檔案“%s”- %s。\n" + +#~ msgid "ppdc: Unable to create output directory %s: %s\n" +#~ msgstr "ppdc:無法製作輸出目錄 %s:%s\n" + +#~ msgid "ppdc: Unable to create output pipes: %s\n" +#~ msgstr "ppdc:無法製作輸出路徑:%s\n" + +#~ msgid "ppdc: Unable to execute cupstestppd: %s\n" +#~ msgstr "ppdc:無法執行 cupstestppd:%s\n" + +#~ msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" +#~ msgstr "ppdc:在下列行中找不到 #po 檔案 %1$s:%3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:在下列行中找不到包含檔案“%1$s”:%3$s 的第 %2$d 行!\n" + +#~ msgid "ppdc: Unable to find localization for \"%s\" - %s\n" +#~ msgstr "ppdc:找不到本地化的“%s”- %s\n" + +#~ msgid "ppdc: Unable to load localization file \"%s\" - %s\n" +#~ msgstr "ppdc:無法載入本地化檔案“%s”- %s\n" + +#~ msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" +#~ msgstr "ppdc:未定義的變數(%1$s),在 %3$s 的第 %2$d 行上。\n" + +#~ msgid "ppdc: Unknown driver type %s on line %d of %s!\n" +#~ msgstr "ppdc:未知的驅動程式類型 %1$s,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:未知的兩用類型“%1$s”,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" +#~ msgstr "ppdc:未知的媒體大小“%1$s”,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" +#~ msgstr "ppdc:發現未知的代號“%1$s”,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "" +#~ "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %" +#~ "s!\n" +#~ msgstr "ppdc:實數“%1$s”中有未知的尾字元,在 %3$s 的第 %2$d 行上!\n" + +#~ msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" +#~ msgstr "ppdc:%3$s 的第 %2$d 行上有以 %1$c 開頭的未終止字串!\n" + +#~ msgid "ppdc: Writing %s...\n" +#~ msgstr "ppdc:正在寫入 %s⋯\n" + +#~ msgid "ppdc: Writing PPD files to directory \"%s\"...\n" +#~ msgstr "ppdc:正在將 PPD 檔案寫入目錄“%s”⋯\n" + +#~ msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" +#~ msgstr "ppdmerge:錯誤的 LanguageVersion“%s”,在 %s 中!\n" + +#~ msgid "ppdmerge: Ignoring PPD file %s...\n" +#~ msgstr "ppdmerge:正在忽略 PPD 檔案 %s⋯\n" + +#~ msgid "ppdmerge: Unable to backup %s to %s- %s\n" +#~ msgstr "ppdmerge:無法將 %s 備份到 %s- %s\n" + +#~ msgid "printer %s disabled since %s -\n" +#~ msgstr "印表機 %s 已停用,自 %s 後 -\n" + +#~ msgid "printer %s is idle. enabled since %s\n" +#~ msgstr "印表機 %s 處於閒置狀態,自 %s 後啟用\n" + +#~ msgid "printer %s now printing %s-%d. enabled since %s\n" +#~ msgstr "印表機 %s 正在列印 %s-%d。自 %s 後啟用\n" + +#~ msgid "printer %s/%s disabled since %s -\n" +#~ msgstr "印表機 %s/%s 自 %s 後停用 -\n" + +#~ msgid "printer %s/%s is idle. enabled since %s\n" +#~ msgstr "印表機 %s/%s 處於閑置狀態。自 %s 後啟用\n" + +#~ msgid "printer %s/%s now printing %s-%d. enabled since %s\n" +#~ msgstr "印表機 %s/%s 正在列印 %s-%d。自 %s 後啟用\n" + +#~ msgid "request id is %s-%d (%d file(s))\n" +#~ msgstr "請求 ID 為 %s-%d(%d 個檔案)\n" + +#~ msgid "scheduler is not running\n" +#~ msgstr "排程器並沒有執行\n" + +#~ msgid "scheduler is running\n" +#~ msgstr "排程器正在執行中\n" + +#~ msgid "status\t\tshow status of daemon and queue\n" +#~ msgstr "狀態\t\t顯示服務程式和佇列的狀態\n" + +#~ msgid "system default destination: %s\n" +#~ msgstr "系統預設目的地:%s\n" + +#~ msgid "system default destination: %s/%s\n" +#~ msgstr "系統預設目的地:%s/%s\n" diff --git a/locale/locale.txt b/locale/locale.txt new file mode 100644 index 0000000..f9abe72 --- /dev/null +++ b/locale/locale.txt @@ -0,0 +1,32 @@ +This directory contains the message strings used by CUPS for various +languages. Each subdirectory corresponds to a different locale, and +the cups_xx and cups_xx_YY files contain the messages for the locales +named "xx" or "xx_YY". + +Each message file starts with a character set identifier, which can be +one of the following: + + us-ascii + 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 + utf-8 + +After that, all non-blank lines are treated as messages, with any +leading whitespace removed. If a line starts with a number then the +message index is updated to the number. Otherwise, the next message +number is used. + +The message indices are defined in the include file . +The HTTP status messages use the status codes defined in . + +If you would like to contribute a new message file for your locale, or +have corrections to the current ones, please send them to: + + cups-support@cups.org diff --git a/locale/po2strings.c b/locale/po2strings.c new file mode 100644 index 0000000..70b7fd0 --- /dev/null +++ b/locale/po2strings.c @@ -0,0 +1,294 @@ +/* + * "$Id: po2strings.c 10379 2012-03-23 22:16:22Z mike $" + * + * Convert a GNU gettext .po file to an Apple .strings file. + * + * Copyright 2007-2012 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Usage: + * + * po2strings filename.strings filename.po + * + * Compile with: + * + * gcc -o po2strings po2strings.c `cups-config --libs` + * + * Contents: + * + * main() - Convert .po file to .strings. + */ + +#include + + +/* + * The .strings file format is simple: + * + * // comment + * "msgid" = "msgstr"; + * + * The GNU gettext .po format is also fairly simple: + * + * #. comment + * msgid "some text" + * msgstr "localized text" + * + * The comment, msgid, and msgstr text can span multiple lines using the form: + * + * #. comment + * #. more comments + * msgid "" + * "some long text" + * msgstr "" + * "localized text spanning " + * "multiple lines" + * + * Both the msgid and msgstr strings use standard C quoting for special + * characters like newline and the double quote character. + */ + +/* + * main() - Convert .po file to .strings. + */ + +int /* O - Exit code */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + const char *pofile, /* .po filename */ + *stringsfile; /* .strings filename */ + cups_file_t *po, /* .po file */ + *strings; /* .strings file */ + char s[4096], /* String buffer */ + *ptr, /* Pointer into buffer */ + *temp, /* New string */ + *msgid, /* msgid string */ + *msgstr; /* msgstr string */ + int length; /* Length of combined strings */ + int use_msgid; /* Use msgid strings for msgstr? */ + + + /* + * Process command-line arguments... + */ + + pofile = NULL; + stringsfile = NULL; + use_msgid = 0; + + for (i = 1; i < argc; i ++) + { + if (!strcmp(argv[i], "-m")) + use_msgid = 1; + else if (argv[i][0] == '-') + { + puts("Usage: po2strings [-m] filename.po filename.strings"); + return (1); + } + else if (!pofile) + pofile = argv[i]; + else if (!stringsfile) + stringsfile = argv[i]; + else + { + puts("Usage: po2strings [-m] filename.po filename.strings"); + return (1); + } + } + + if (!pofile || !stringsfile) + { + puts("Usage: po2strings [-m] filename.po filename.strings"); + return (1); + } + + /* + * Read strings from the .po file and write to the .strings file... + */ + + if ((po = cupsFileOpen(pofile, "r")) == NULL) + { + perror(pofile); + return (1); + } + + if ((strings = cupsFileOpen(stringsfile, "w")) == NULL) + { + perror(stringsfile); + cupsFileClose(po); + return (1); + } + + msgid = msgstr = NULL; + + while (cupsFileGets(po, s, sizeof(s)) != NULL) + { + if (s[0] == '#' && s[1] == '.') + { + /* + * Copy comment string... + */ + + if (msgid && msgstr) + { + /* + * First output the last localization string... + */ + + if (*msgid) + cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, + (use_msgid || !*msgstr) ? msgid : msgstr); + + free(msgid); + free(msgstr); + msgid = msgstr = NULL; + } + + cupsFilePrintf(strings, "//%s\n", s + 2); + } + else if (s[0] == '#' || !s[0]) + { + /* + * Skip blank and file comment lines... + */ + + continue; + } + else + { + /* + * Strip the trailing quote... + */ + + if ((ptr = strrchr(s, '\"')) == NULL) + continue; + + *ptr = '\0'; + + /* + * Find start of value... + */ + + if ((ptr = strchr(s, '\"')) == NULL) + continue; + + ptr ++; + + /* + * Create or add to a message... + */ + + if (!strncmp(s, "msgid", 5)) + { + /* + * Output previous message as needed... + */ + + if (msgid && msgstr) + { + if (*msgid) + cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, + (use_msgid || !*msgstr) ? msgid : msgstr); + } + + if (msgid) + free(msgid); + + if (msgstr) + free(msgstr); + + msgid = strdup(ptr); + msgstr = NULL; + } + else if (s[0] == '\"' && (msgid || msgstr)) + { + /* + * Append to current string... + */ + + length = (int)strlen(msgstr ? msgstr : msgid); + + if ((temp = realloc(msgstr ? msgstr : msgid, + length + strlen(ptr) + 1)) == NULL) + { + free(msgid); + if (msgstr) + free(msgstr); + perror("Unable to allocate string"); + return (1); + } + + if (msgstr) + { + /* + * Copy the new portion to the end of the msgstr string - safe + * to use strcpy because the buffer is allocated to the correct + * size... + */ + + msgstr = temp; + + strcpy(msgstr + length, ptr); + } + else + { + /* + * Copy the new portion to the end of the msgid string - safe + * to use strcpy because the buffer is allocated to the correct + * size... + */ + + msgid = temp; + + strcpy(msgid + length, ptr); + } + } + else if (!strncmp(s, "msgstr", 6) && msgid) + { + /* + * Set the string... + */ + + if (msgstr) + free(msgstr); + + if ((msgstr = strdup(ptr)) == NULL) + { + free(msgid); + perror("Unable to allocate msgstr"); + return (1); + } + } + } + } + + if (msgid && msgstr) + { + if (*msgid) + cupsFilePrintf(strings, "\"%s\" = \"%s\";\n", msgid, + (use_msgid || !*msgstr) ? msgid : msgstr); + } + + if (msgid) + free(msgid); + + if (msgstr) + free(msgstr); + + cupsFileClose(po); + cupsFileClose(strings); + + return (0); +} + + +/* + * End of "$Id: po2strings.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/locale/strings2po.c b/locale/strings2po.c new file mode 100644 index 0000000..52eeeef --- /dev/null +++ b/locale/strings2po.c @@ -0,0 +1,175 @@ +/* + * "$Id: strings2po.c 7720 2008-07-11 22:46:21Z mike $" + * + * Convert Apple .strings file (UTF-16 BE text file) to GNU gettext .po files. + * + * Usage: + * + * strings2po filename.strings filename.po + * + * Compile with: + * + * gcc -o strings2po strings2po.c + * + * Contents: + * + * main() - Convert .strings file to .po. + * read_strings() - Read a line from a .strings file. + * write_po() - Write a line to the .po file. + */ + +#include +#include + + +/* + * The .strings file format is simple: + * + * // comment + * "id" = "str"; + * + * Both the id and str strings use standard C quoting for special characters + * like newline and the double quote character. + */ + +/* + * Local functions... + */ + +static int read_strings(FILE *strings, char *buffer, size_t bufsize, + char **id, char **str); +static void write_po(FILE *po, const char *what, const char *s); + + +/* + * main() - Convert .strings file to .po. + */ + +int /* O - Exit code */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *strings, /* .strings file */ + *po; /* .po file */ + char iconv[1024], /* iconv command */ + buffer[8192], /* Line buffer */ + *id, /* ID string */ + *str; /* Translation string */ + int count; /* Number of messages converted */ + + + if (argc != 3) + { + puts("Usage: strings2po filename.strings filename.po"); + return (1); + } + + /* + * Cheat by using iconv to convert the .strings file from UTF-16 to UTF-8 + * which is what we need for the .po file (and it makes things a lot + * simpler...) + */ + + snprintf(iconv, sizeof(iconv), "iconv -f utf-16 -t utf-8 '%s'", argv[1]); + if ((strings = popen(iconv, "r")) == NULL) + { + perror(argv[1]); + return (1); + } + + if ((po = fopen(argv[2], "w")) == NULL) + { + perror(argv[2]); + pclose(strings); + return (1); + } + + count = 0; + + while (read_strings(strings, buffer, sizeof(buffer), &id, &str)) + { + count ++; + write_po(po, "msgid", id); + write_po(po, "msgstr", str); + } + + pclose(strings); + fclose(po); + + printf("%s: %d messages.\n", argv[2], count); + + return (0); +} + + +/* + * 'read_strings()' - Read a line from a .strings file. + */ + +static int /* O - 1 on success, 0 on failure */ +read_strings(FILE *strings, /* I - .strings file */ + char *buffer, /* I - Line buffer */ + size_t bufsize, /* I - Size of line buffer */ + char **id, /* O - Pointer to ID string */ + char **str) /* O - Pointer to translation string */ +{ + char *bufptr; /* Pointer into buffer */ + + + while (fgets(buffer, bufsize, strings)) + { + if (buffer[0] != '\"') + continue; + + *id = buffer + 1; + + for (bufptr = buffer + 1; *bufptr && *bufptr != '\"'; bufptr ++) + if (*bufptr == '\\') + bufptr ++; + + if (*bufptr != '\"') + continue; + + *bufptr++ = '\0'; + + while (*bufptr && *bufptr != '\"') + bufptr ++; + + if (!*bufptr) + continue; + + bufptr ++; + *str = bufptr; + + for (; *bufptr && *bufptr != '\"'; bufptr ++) + if (*bufptr == '\\') + bufptr ++; + + if (*bufptr != '\"') + continue; + + *bufptr = '\0'; + + return (1); + } + + return (0); +} + + +/* + * 'write_po()' - Write a line to the .po file. + */ + +static void +write_po(FILE *po, /* I - .po file */ + const char *what, /* I - Type of string */ + const char *s) /* I - String to write */ +{ + fprintf(po, "%s \"%s\"\n", what, s); +} + + +/* + * End of "$Id: strings2po.c 7720 2008-07-11 22:46:21Z mike $". + */ diff --git a/locale/translate.c b/locale/translate.c new file mode 100644 index 0000000..2352ebe --- /dev/null +++ b/locale/translate.c @@ -0,0 +1,439 @@ +/* + * "$Id: translate.c 9048 2010-03-24 08:07:15Z mike $" + * + * HTTP-based translation program for CUPS. + * + * This program uses Google to translate the CUPS template (cups.pot) to + * several different languages. The translation isn't perfect, but it's + * a start (better than working from scratch.) + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry. + * save_messages() - Save messages to a .po file. + * translate_messages() - Translate messages using Google. + * write_string() - Write a quoted string to a file. + */ + +/* + * Include necessary headers... + */ + +#include +#include + + +/* + * Local functions... + */ + +int save_messages(cups_array_t *cat, const char *filename); +int translate_messages(cups_array_t *cat, const char *lang); +int write_string(cups_file_t *fp, const char *s); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + cups_array_t *cat; /* Message catalog */ + + + if (argc != 3) + { + fputs("Usage: translate cups_language.po language\n", stderr); + return (1); + } + + if (access(argv[1], 0)) + cat = _cupsMessageLoad("cups.pot", 1); + else + cat = _cupsMessageLoad(argv[1], 1); + + if (!cat) + { + puts("Unable to load message catalog."); + return (1); + } + + if (!translate_messages(cat, argv[2])) + { + puts("Unable to translate message catalog."); + return (1); + } + + if (!save_messages(cat, argv[1])) + { + puts("Unable to save message catalog."); + return (1); + } + + return (0); +} + + +/* + * 'save_messages()' - Save messages to a .po file. + */ + +int /* O - 1 on success, 0 on error */ +save_messages(cups_array_t *cat, /* I - Message catalog */ + const char *filename) /* I - File to save to */ +{ + _cups_message_t *m; /* Current message */ + cups_file_t *fp; /* File pointer */ + + + /* + * Open the message catalog... + */ + + if ((fp = cupsFileOpen(filename, "w")) == NULL) + return (0); + + /* + * Save the messages to a file... + */ + + for (m = (_cups_message_t *)cupsArrayFirst(cat); + m; + m = (_cups_message_t *)cupsArrayNext(cat)) + { + if (cupsFilePuts(fp, "msgid \"") < 0) + break; + + if (!write_string(fp, m->id)) + break; + + if (cupsFilePuts(fp, "\"\nmsgstr \"") < 0) + break; + + if (m->str) + { + if (!write_string(fp, m->str)) + break; + } + + if (cupsFilePuts(fp, "\"\n") < 0) + break; + } + + cupsFileClose(fp); + + return (!m); +} + + +/* + * 'translate_messages()' - Translate messages using Google. + */ + +int /* O - 1 on success, 0 on error */ +translate_messages(cups_array_t *cat, /* I - Message catalog */ + const char *lang) /* I - Output language... */ +{ + /* + * Google provides a simple translation/language tool for translating + * from one language to another. It is far from perfect, however it + * can be used to get a basic translation done or update an existing + * translation when no other resources are available. + * + * Translation requests are sent as HTTP POSTs to + * "http://translate.google.com/translate_t" with the following form + * variables: + * + * Name Description Value + * -------- ---------------------------------- ---------------- + * hl Help language? "en" + * ie Input encoding "UTF8" + * langpair Language pair "en|" + language + * oe Output encoding "UTF8" + * text Text to translate translation string + */ + + int ret; /* Return value */ + _cups_message_t *m; /* Current message */ + int tries; /* Number of tries... */ + http_t *http; /* HTTP connection */ + http_status_t status; /* Status of POST request */ + char *idptr, /* Pointer into msgid */ + buffer[65536], /* Input/output buffer */ + *bufptr, /* Pointer into buffer */ + *bufend, /* Pointer to end of buffer */ + length[16]; /* Content length */ + int bytes; /* Number of bytes read */ + + + /* + * Connect to translate.google.com... + */ + + puts("Connecting to translate.google.com..."); + + if ((http = httpConnect("translate.google.com", 80)) == NULL) + { + perror("Unable to connect to translate.google.com"); + return (0); + } + + /* + * Scan the current messages, requesting a translation of any untranslated + * messages... + */ + + for (m = (_cups_message_t *)cupsArrayFirst(cat), ret = 1; + m; + m = (_cups_message_t *)cupsArrayNext(cat)) + { + /* + * Skip messages that are already translated... + */ + + if (m->str && m->str[0]) + continue; + + /* + * Encode the form data into the buffer... + */ + + snprintf(buffer, sizeof(buffer), + "hl=en&ie=UTF8&langpair=en|%s&oe=UTF8&text=", lang); + bufptr = buffer + strlen(buffer); + bufend = buffer + sizeof(buffer) - 5; + + for (idptr = m->id; *idptr && bufptr < bufend; idptr ++) + if (*idptr == ' ') + *bufptr++ = '+'; + else if (*idptr < ' ' || *idptr == '%') + { + sprintf(bufptr, "%%%02X", *idptr & 255); + bufptr += 3; + } + else if (*idptr != '&') + *bufptr++ = *idptr; + + *bufptr++ = '&'; + *bufptr = '\0'; + + sprintf(length, "%d", (int)(bufptr - buffer)); + + /* + * Send the request... + */ + + printf("\"%s\" = ", m->id); + fflush(stdout); + + tries = 0; + + do + { + httpClearFields(http); + httpSetField(http, HTTP_FIELD_CONTENT_TYPE, + "application/x-www-form-urlencoded"); + httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, length); + + if (httpPost(http, "/translate_t")) + { + httpReconnect(http); + httpPost(http, "/translate_t"); + } + + httpWrite2(http, buffer, bufptr - buffer); + + while ((status = httpUpdate(http)) == HTTP_CONTINUE); + + if (status != HTTP_OK && status != HTTP_ERROR) + httpFlush(http); + + tries ++; + } + while (status == HTTP_ERROR && tries < 10); + + if (status == HTTP_OK) + { + /* + * OK, read the translation back... + */ + + bufptr = buffer; + bufend = buffer + sizeof(buffer) - 1; + + while ((bytes = httpRead2(http, bufptr, bufend - bufptr)) > 0) + bufptr += bytes; + + if (bytes < 0) + { + /* + * Read error, abort! + */ + + puts("READ ERROR!"); + ret = 0; + break; + } + + *bufptr = '\0'; + + /* + * Find the div containing translation + */ + + if ((bufptr = strstr(buffer, "
')) == NULL) + { + /* + * textarea doesn't end, abort! + */ + + puts("DIV SHORT DATA!"); + ret = 0; + break; + } + + bufptr ++; + + if ((bufend = strstr(bufptr, "
")) == NULL) + { + /* + * textarea doesn't close, abort! + */ + + puts("/DIV SHORT DATA!"); + ret = 0; + break; + } + + *bufend = '\0'; + + /* + * Copy the translation... + */ + + m->str = strdup(bufptr); + + /* + * Convert character entities to regular chars... + */ + + for (bufptr = strchr(m->str, '&'); + bufptr; + bufptr = strchr(bufptr + 1, '&')) + { + if (!strncmp(bufptr, "<", 4)) + { + *bufptr = '<'; + _cups_strcpy(bufptr + 1, bufptr + 4); + } + else if (!strncmp(bufptr, ">", 4)) + { + *bufptr = '>'; + _cups_strcpy(bufptr + 1, bufptr + 4); + } + else if (!strncmp(bufptr, "&", 5)) + _cups_strcpy(bufptr + 1, bufptr + 5); + } + + printf("\"%s\"\n", m->str); + } + else if (status == HTTP_ERROR) + { + printf("NETWORK ERROR (%s)!\n", strerror(httpError(http))); + ret = 0; + break; + } + else + { + printf("HTTP ERROR %d!\n", status); + ret = 0; + break; + } + } + + httpClose(http); + + return (ret); +} + + +/* + * 'write_string()' - Write a quoted string to a file. + */ + +int /* O - 1 on success, 0 on failure */ +write_string(cups_file_t *fp, /* I - File to write to */ + const char *s) /* I - String */ +{ + while (*s) + { + switch (*s) + { + case '\n' : + if (cupsFilePuts(fp, "\\n") < 0) + return (0); + break; + + case '\r' : + if (cupsFilePuts(fp, "\\r") < 0) + return (0); + break; + + case '\t' : + if (cupsFilePuts(fp, "\\t") < 0) + return (0); + break; + + case '\\' : + if (cupsFilePuts(fp, "\\\\") < 0) + return (0); + break; + + case '\"' : + if (cupsFilePuts(fp, "\\\"") < 0) + return (0); + break; + + default : + if ((*s & 255) < ' ') + { + if (cupsFilePrintf(fp, "\\%o", *s) < 0) + return (0); + } + else if (cupsFilePutChar(fp, *s) < 0) + return (0); + break; + } + + s ++; + } + + return (1); +} + + +/* + * End of "$Id: translate.c 9048 2010-03-24 08:07:15Z mike $". + */ diff --git a/man/Makefile b/man/Makefile new file mode 100644 index 0000000..6a7d7a9 --- /dev/null +++ b/man/Makefile @@ -0,0 +1,249 @@ +# +# "$Id: Makefile 9177 2010-06-22 21:21:37Z mike $" +# +# Man page makefile for CUPS. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +# +# Man pages... +# + +MAN1 = cancel.$(MAN1EXT) \ + cups-config.$(MAN1EXT) \ + cupstestdsc.$(MAN1EXT) \ + cupstestppd.$(MAN1EXT) \ + ipptool.$(MAN1EXT) \ + lp.$(MAN1EXT) \ + lpoptions.$(MAN1EXT) \ + lppasswd.$(MAN1EXT) \ + lpq.$(MAN1EXT) \ + lprm.$(MAN1EXT) \ + lpr.$(MAN1EXT) \ + lpstat.$(MAN1EXT) \ + ppdc.$(MAN1EXT) \ + ppdhtml.$(MAN1EXT) \ + ppdi.$(MAN1EXT) \ + ppdmerge.$(MAN1EXT) \ + ppdpo.$(MAN1EXT) +MAN5 = classes.conf.$(MAN5EXT) \ + client.conf.$(MAN5EXT) \ + cups-snmp.conf.$(MAN5EXT) \ + cupsd.conf.$(MAN5EXT) \ + ipptoolfile.$(MAN5EXT) \ + mailto.conf.$(MAN5EXT) \ + mime.convs.$(MAN5EXT) \ + mime.types.$(MAN5EXT) \ + ppdcfile.$(MAN5EXT) \ + printers.conf.$(MAN5EXT) \ + subscriptions.conf.$(MAN5EXT) +MAN7 = backend.$(MAN7EXT) \ + filter.$(MAN7EXT) \ + notifier.$(MAN7EXT) +MAN8 = cupsaccept.$(MAN8EXT) \ + cupsaddsmb.$(MAN8EXT) \ + cupsctl.$(MAN8EXT) \ + cupsfilter.$(MAN8EXT) \ + cups-deviced.$(MAN8EXT) \ + cups-driverd.$(MAN8EXT) \ + cups-lpd.$(MAN8EXT) \ + cups-polld.$(MAN8EXT) \ + cupsd.$(MAN8EXT) \ + cupsenable.$(MAN8EXT) \ + lpadmin.$(MAN8EXT) \ + lpinfo.$(MAN8EXT) \ + lpmove.$(MAN8EXT) \ + lpc.$(MAN8EXT) + +LANGUAGES=de fr + +# +# Make everything... +# + +all: $(MAN1) $(MAN5) $(MAN7) $(MAN8) html translations + +translations: + # Update the translations and build the translated material + #po4a --previous po4a/cups.cfg + #for lang in $(LANGUAGES); do $(MAKE) -C $$lang; done + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + $(RM) mantohtml mantohtml.o + $(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8) + for file in $(MAN1); do \ + $(RM) ../doc/help/man-`basename $$file .$(MAN1EXT)`.html; \ + done + for file in $(MAN5); do \ + $(RM) ../doc/help/man-`basename $$file .$(MAN5EXT)`.html; \ + done + for file in $(MAN7); do \ + $(RM) ../doc/help/man-`basename $$file .$(MAN7EXT)`.html; \ + done + for file in $(MAN8); do \ + $(RM) ../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \ + done + for lang in $(LANGUAGES); do $(MAKE) -C $$lang clean; done + # Make sure the PO files are updated and remove generated + # translations. + po4a --previous --rm-translations po4a/cups.cfg + $(RM) po4a/po/cups.pot + + +# +# Dummy depend target... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: all + $(INSTALL_DIR) -m 755 $(MANDIR)/man1 + for file in $(MAN1); do \ + echo Installing $$file in $(MANDIR)/man1...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man1; \ + done + $(INSTALL_DIR) -m 755 $(MANDIR)/man5 + for file in $(MAN5); do \ + echo Installing $$file in $(MANDIR)/man5...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man5; \ + done + $(INSTALL_DIR) -m 755 $(MANDIR)/man7 + for file in $(MAN7); do \ + echo Installing $$file in $(MANDIR)/man7...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man7; \ + done + $(INSTALL_DIR) -m 755 $(AMANDIR)/man$(MAN8DIR) + for file in $(MAN8); do \ + echo Installing $$file in $(AMANDIR)/man$(MAN8DIR)...; \ + $(INSTALL_MAN) $$file $(AMANDIR)/man$(MAN8DIR); \ + done + for file in accept cupsreject reject; do \ + $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ + $(LN) cupsaccept.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/$$file.$(MAN8EXT); \ + done + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + for lang in $(LANGUAGES); do $(MAKE) -C $$lang install; done + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: + for file in $(MAN1); do \ + $(RM) $(MANDIR)/man1/$$file; \ + done + -$(RMDIR) $(MANDIR)/man1 + for file in $(MAN5); do \ + $(RM) $(MANDIR)/man5/$$file; \ + done + -$(RMDIR) $(MANDIR)/man5 + for file in $(MAN7); do \ + $(RM) $(MANDIR)/man7/$$file; \ + done + -$(RMDIR) $(MANDIR)/man7 + for file in $(MAN8); do \ + $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file; \ + done + $(RM) $(AMANDIR)/man$(MAN8DIR)/accept.$(MAN8EXT) + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT) + $(RM) $(AMANDIR)/man$(MAN8DIR)/reject.$(MAN8EXT) + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + -$(RMDIR) $(AMANDIR)/man$(MAN8DIR) + for lang in $(LANGUAGES); do $(MAKE) -C $$lang uninstall; done + + +# +# Make html versions of man pages... +# + +html: $(MAN1) $(MAN5) $(MAN7) $(MAN8) mantohtml + echo Converting man pages to HTML... + for file in $(MAN1); do \ + echo " $$file..."; \ + ./mantohtml `basename $$file .$(MAN1EXT)`.man >../doc/help/man-`basename $$file .$(MAN1EXT)`.html; \ + done + for file in $(MAN5); do \ + echo " $$file..."; \ + ./mantohtml `basename $$file .$(MAN5EXT)`.man >../doc/help/man-`basename $$file .$(MAN5EXT)`.html; \ + done + for file in $(MAN7); do \ + echo " $$file..."; \ + ./mantohtml `basename $$file .$(MAN7EXT)`.man >../doc/help/man-`basename $$file .$(MAN7EXT)`.html; \ + done + for file in $(MAN8); do \ + echo " $$file..."; \ + ./mantohtml `basename $$file .$(MAN8EXT)`.man >../doc/help/man-`basename $$file .$(MAN8EXT)`.html; \ + done + +mantohtml: mantohtml.o + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ mantohtml.o + + +# +# End of "$Id: Makefile 9177 2010-06-22 21:21:37Z mike $". +# diff --git a/man/Makefile.l10n b/man/Makefile.l10n new file mode 100644 index 0000000..73e2414 --- /dev/null +++ b/man/Makefile.l10n @@ -0,0 +1,209 @@ +# +# "$Id: $" +# +# Man page makefile for the Common UNIX Printing System (CUPS). +# +# Copyright 2007 by Apple Inc. +# Copyright 1993-2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../../Makedefs + + +# +# Man pages... +# + +MAN1 = cancel.$(MAN1EXT) \ + cups-config.$(MAN1EXT) \ + cupstestdsc.$(MAN1EXT) \ + cupstestppd.$(MAN1EXT) \ + lp.$(MAN1EXT) \ + lpoptions.$(MAN1EXT) \ + lppasswd.$(MAN1EXT) \ + lpq.$(MAN1EXT) \ + lprm.$(MAN1EXT) \ + lpr.$(MAN1EXT) \ + lpstat.$(MAN1EXT) +MAN5 = classes.conf.$(MAN5EXT) \ + client.conf.$(MAN5EXT) \ + cups-snmp.conf.$(MAN5EXT) \ + cupsd.conf.$(MAN5EXT) \ + mailto.conf.$(MAN5EXT) \ + mime.convs.$(MAN5EXT) \ + mime.types.$(MAN5EXT) \ + printers.conf.$(MAN5EXT) \ + subscriptions.conf.$(MAN5EXT) +MAN7 = backend.$(MAN7EXT) \ + filter.$(MAN7EXT) +MAN8 = cupsaccept.$(MAN8EXT) \ + cupsaddsmb.$(MAN8EXT) \ + cupsctl.$(MAN8EXT) \ + cupsfilter.$(MAN8EXT) \ + cups-deviced.$(MAN8EXT) \ + cups-driverd.$(MAN8EXT) \ + cups-lpd.$(MAN8EXT) \ + cups-polld.$(MAN8EXT) \ + cupsd.$(MAN8EXT) \ + cupsenable.$(MAN8EXT) \ + lpadmin.$(MAN8EXT) \ + lpinfo.$(MAN8EXT) \ + lpmove.$(MAN8EXT) \ + lpc.$(MAN8EXT) + + +# +# Make everything... +# + +all: manpages.gz html + +# Prepare all the existing manpages, and compress them. +# But do not fail if a manpage was not generated. +manpages.gz: manpages.gz-stamp +manpages.gz-stamp: + for file in $(MAN1) $(MAN5) $(MAN7) $(MAN8); do \ + $(MAKE) $$file || true; \ + done + touch $@ + +# +# Clean all config and object files... +# + +clean: + $(RM) $(MAN1) $(MAN5) $(MAN7) $(MAN8) + for file in $(MAN1); do \ + $(RM) ../../doc/help/man-`basename $$file .$(MAN1EXT)`.$(LANGUAGE).html; \ + done + for file in $(MAN5); do \ + $(RM) ../../doc/help/man-`basename $$file .$(MAN5EXT)`.$(LANGUAGE).html; \ + done + for file in $(MAN7); do \ + $(RM) ../../doc/help/man-`basename $$file .$(MAN7EXT)`.$(LANGUAGE).html; \ + done + for file in $(MAN8); do \ + $(RM) ../../doc/help/man-`basename $$file .$(MAN8EXT)`.$(LANGUAGE).html; \ + done + for file in *.man.in; do \ + $(RM) `basename $$file .in`; \ + done + $(RM) manpages.gz-stamp + + +# +# Dummy depend target... +# + +depend: + + +# +# Install files... +# + +MANDIR := $(MANDIR)/$(LANGUAGE) +AMANDIR := $(AMANDIR)/$(LANGUAGE) + +install: all + $(INSTALL_DIR) -m 755 $(MANDIR)/man1 + for file in $(wildcard $(MAN1)); do \ + echo Installing $$file in $(MANDIR)/man1...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man1; \ + done + $(INSTALL_DIR) -m 755 $(MANDIR)/man5 + for file in $(wildcard $(MAN5)); do \ + echo Installing $$file in $(MANDIR)/man5...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man5; \ + done + $(INSTALL_DIR) -m 755 $(MANDIR)/man7 + for file in $(wildcard $(MAN7)); do \ + echo Installing $$file in $(MANDIR)/man7...; \ + $(INSTALL_MAN) $$file $(MANDIR)/man7; \ + done + $(INSTALL_DIR) -m 755 $(AMANDIR)/man$(MAN8DIR) + for file in $(wildcard $(MAN8)); do \ + echo Installing $$file in $(AMANDIR)/man$(MAN8DIR)...; \ + $(INSTALL_MAN) $$file $(AMANDIR)/man$(MAN8DIR); \ + done + if [ -f cupsreject.$(MAN8EXT) ]; then \ + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT); \ + fi + if [ -f cupsaccept.$(MAN8EXT) ]; then \ + $(LN) cupsaccept.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT); \ + fi + if [ -f cupsdisable.$(MAN8EXT) ]; then \ + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT); \ + fi + if [ -f cupsenable.$(MAN8EXT) ]; then \ + $(LN) cupsenable.$(MAN8EXT) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT); \ + fi + + +# +# Uninstall files... +# + +uninstall: + for file in $(MAN1); do \ + $(RM) $(MANDIR)/man1/$$file; \ + done + -$(RMDIR) $(MANDIR)/man1 + for file in $(MAN5); do \ + $(RM) $(MANDIR)/man5/$$file; \ + done + -$(RMDIR) $(MANDIR)/man5 + for file in $(MAN7); do \ + $(RM) $(MANDIR)/man7/$$file; \ + done + -$(RMDIR) $(MANDIR)/man7 + for file in $(MAN8); do \ + $(RM) $(AMANDIR)/man$(MAN8DIR)/$$file; \ + done + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsreject.$(MAN8EXT) + $(RM) $(AMANDIR)/man$(MAN8DIR)/cupsdisable.$(MAN8EXT) + -$(RMDIR) $(AMANDIR)/man$(MAN8DIR) + + +# +# Make html versions of man pages... +# + +MANTOHTML = ../mantohtml +html: manpages.gz $(MANTOHTML) + echo Converting man pages to HTML... + for file in $(wildcard $(MAN1)); do \ + echo " $$file..."; \ + $(MANTOHTML) `basename $$file .$(MAN1EXT)`.man >../../doc/help/man-`basename $$file .$(MAN1EXT)`.$(LANGUAGE).html; \ + done + for file in $(wildcard $(MAN5)); do \ + echo " $$file..."; \ + $(MANTOHTML) `basename $$file .$(MAN5EXT)`.man >../../doc/help/man-`basename $$file .$(MAN5EXT)`.$(LANGUAGE).html; \ + done + for file in $(wildcard $(MAN7)); do \ + echo " $$file..."; \ + $(MANTOHTML) `basename $$file .$(MAN7EXT)`.man >../../doc/help/man-`basename $$file .$(MAN7EXT)`.$(LANGUAGE).html; \ + done + for file in $(wildcard $(MAN8)); do \ + echo " $$file..."; \ + $(MANTOHTML) `basename $$file .$(MAN8EXT)`.man >../../doc/help/man-`basename $$file .$(MAN8EXT)`.$(LANGUAGE).html; \ + done + +.SUFFIXES: .man.in .man +# Keep the generated .man because they are needed for the html rule +.PRECIOUS: %.man + +.man.in.man: + sed -e 's:@CUPS_DATADIR@:$(DATADIR):' \ + -e 's:@CUPS_SERVERROOT@:$(SERVERROOT):' \ + -e 's:@CUPS_SERVERBIN@:$(SERVERBIN):' $< > $@ + +# +# End of "$Id: $". +# diff --git a/man/backend.man b/man/backend.man new file mode 100644 index 0000000..644d85d --- /dev/null +++ b/man/backend.man @@ -0,0 +1,196 @@ +.\" +.\" "$Id: backend.man 9693 2011-04-16 02:51:22Z mike $" +.\" +.\" Backend man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH backend 7 "CUPS" "15 April 2011" "Apple Inc." + +.SH NAME +backend \- cups backend transmission interfaces + +.SH SYNOPSIS +.B backend +.br +.B backend +job user title num-copies options [ +.I filename +] + +.SH DESCRIPTION +Backends are a special type of \fIfilter(7)\fR which is used to +send print data to and discover different devices on the system. + +.LP +Like filters, backends must be capable of reading from a filename +on the command-line or from the standard input, copying the +standard input to a temporary file as required by the physical +interface. + +.LP +The command name (argv[0]) is set to the device URI of the destination printer. +Starting with CUPS 1.1.22, any authentication information in argv[0] is removed, +so backend developers are urged to use the DEVICE_URI environment variable +whenever authentication information is required. The CUPS API includes a +\fIcupsBackendDeviceURI\fR function for retrieving the correct device URI. + +.LP +Back-channel data from the device should be relayed to the job +filters by writing to file descriptor 3. The CUPS API includes +the \fIcupsBackChannelWrite\fR function for this purpose. + +.SH DEVICE DISCOVERY +When run with no arguments, the backend should list the devices +and schemes it supports or is advertising to stdout. The output +consists of zero or more lines consisting of any of the following +forms: + +.nf + device-class scheme "Unknown" "device-info" + device-class device-uri "device-make-and-model" "device-info" + device-class device-uri "device-make-and-model" "device-info" "device-id" + device-class device-uri "device-make-and-model" "device-info" "device-id" "device-location" +.fi + +.LP +The \fIdevice-class\fR field is one of the following values: + +.TP 5 +direct +.br +The device-uri refers to a specific direct-access device with no +options, such as a parallel, USB, or SCSI device. + +.TP 5 +file +.br +The device-uri refers to a file on disk. + +.TP 5 +network +.br +The device-uri refers to a networked device and conforms to the +general form for network URIs. + +.TP 5 +serial +.br +The device-uri refers to a serial device with configurable baud +rate and other options. If the device-uri contains a baud value, +it represents the maximum baud rate supported by the device. + +.LP +The \fIscheme\fR field provides the URI scheme that is supported +by the backend. Backends should use this form only when the +backend supports any URI using that scheme. The \fIdevice-uri\fR +field specifies the full URI to use when communicating with the +device. + +.LP +The \fIdevice-make-and-model\fR field specifies the make and +model of the device, e.g. "Acme Foojet 2000". If the make and +model is not known, you must report "Unknown". + +.LP +The \fIdevice-info\fR field specifies additional information +about the device. Typically this includes the make and model +along with the port number or network address, e.g. "Acme Foojet +2000 USB #1". + +.LP +The optional \fIdevice-id\fR field specifies the IEEE-1284 device +ID string for the device, which is used to select a matching +driver. + +.LP +The optional \fIdevice-location\fR field specifies the physical location of +the device, which is often used to pre-populate the printer-location attribute +when adding a printer. + +.SH PERMISSIONS +Backends without world execute permissions are run as the root +user. Otherwise, the backend is run using the unprivileged user +account, typically "lp". + +.SH EXIT CODES +The following exit codes are defined for backends; C API +constants defined in the header file are defined +in parenthesis: + +.TP 5 +0 (CUPS_BACKEND_OK) +.br +The print file was successfully transmitted to the device or +remote server. + +.TP 5 +1 (CUPS_BACKEND_FAILED) +.br +The print file was not successfully transmitted to the device or +remote server. The scheduler will respond to this by canceling +the job, retrying the job, or stopping the queue depending on the +state of the error-policy attribute. + +.TP 5 +2 (CUPS_BACKEND_AUTH_REQUIRED) +.br +The print file was not successfully transmitted because valid +authentication information is required. The scheduler will +respond to this by holding the job and adding the +authentication-required job-reasons keyword. + +.TP 5 +3 (CUPS_BACKEND_HOLD) +.br +The print file was not successfully transmitted because it cannot +be printed at this time. The scheduler will respond to this by +holding the job. + +.TP 5 +4 (CUPS_BACKEND_STOP) +.br +The print file was not successfully transmitted because it cannot +be printed at this time. The scheduler will respond to this by +stopping the queue. + +.TP 5 +5 (CUPS_BACKEND_CANCEL) +.br +The print file was not successfully transmitted because one or +more attributes are not supported. The scheduler will respond to +this by canceling the job. + +.TP 5 +6 (CUPS_BACKEND_RETRY) +.br +The print file was not successfully transmitted because of a temporary issue. +The scheduler will retry the job at a future time - other jobs may print before +this one. + +.TP 5 +7 (CUPS_BACKEND_RETRY_CURRENT) +.br +The print file was not successfully transmitted because of a temporary issue. +The scheduler will retry the job immediately without allowing intervening jobs. + +.PP +All other exit code values are reserved. + +.SH SEE ALSO +\fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fIfilter(7)\fR, +.br +http://localhost:631/help + +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: backend.man 9693 2011-04-16 02:51:22Z mike $". +.\" diff --git a/man/cancel.man b/man/cancel.man new file mode 100644 index 0000000..eda61eb --- /dev/null +++ b/man/cancel.man @@ -0,0 +1,75 @@ +.\" +.\" "$Id: cancel.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cancel man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cancel 1 "CUPS" "20 March 2006" "Apple Inc." +.SH NAME +cancel - cancel jobs +.SH SYNOPSIS +.B cancel +[ -E ] [ -U +.I username +] [ -a ] [ -h +.I hostname[:port] +] [ -u +.I username +] [ +.I id +] [ +.I destination +] [ +.I destination-id +] +.SH DESCRIPTION +\fIcancel\fR cancels existing print jobs. The \fI-a\fR option will remove +all jobs from the specified destination. +.SH OPTIONS +The following options are recognized by \fIcancel\fR: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-U username +.br +Specifies the username to use when connecting to the server. +.TP 5 +-a +.br +Cancel all jobs on the named destination, or all jobs on all +destinations if none is provided. +.TP 5 +-h hostname[:port] +.br +Chooses an alternate server. +.TP 5 +-u username +.br +Cancels jobs owned by \fIusername\fR. +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", or "#". +Also, printer and class names are \fInot\fR case-sensitive. +.SH NOTES +Administrators wishing to prevent unauthorized cancellation of +jobs via the \fI-u\fR option should require authentication for +Cancel-Jobs operations in \fIcupsd.conf(5)\fR. +.SH SEE ALSO +\fIlp(1)\fR, \fIlpmove(8)\fR, \fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cancel.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/classes.conf.man b/man/classes.conf.man new file mode 100644 index 0000000..0664442 --- /dev/null +++ b/man/classes.conf.man @@ -0,0 +1,110 @@ +.\" +.\" "$Id: classes.conf.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" classes.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH classes.conf 5 "CUPS" "29 April 2009" "Apple Inc." +.SH NAME +classes.conf \- class configuration file for cups +.SH DESCRIPTION +The \fIclasses.conf\fR file defines the local printer classes that are +available. It is normally located in the \fI/etc/cups\fR directory and +is generated automatically by the \fIcupsd(8)\fR program when printer +classes are added or deleted. +.LP +Each line in the file can be a configuration directive, a blank line, +or a comment. Comment lines start with the # character. +.SH DIRECTIVES +.TP 5 + ... +.br +Defines a specific printer class. +.TP 5 + ... +.br +Defines a default printer class. +.TP 5 +Accepting Yes +.TP 5 +Accepting No +.br +Specifies whether the printer is accepting new jobs. +.TP 5 +AllowUser [ user @group ... ] +.br +Allows specific users and groups to print to the printer. +.TP 5 +DenyUser [ user @group ... ] +.br +Prevents specific users and groups from printing to the printer. +.TP 5 +Info text +.br +Specifies human-readable text describing the printer. +.TP 5 +JobSheets banner banner +.br +Specifies the banner pages to use for the printer. +.TP 5 +KLimit number +.br +Specifies the job-k-limit value for the printer. +.TP 5 +Location text +.br +Specifies human-readable text describing the location of the printer. +.TP 5 +OpPolicy name +.br +Specifies the operation policy for the printer. +.TP 5 +PageLimit number +.br +Specifies the job-page-limit value for the printer. +.TP 5 +Printer +.br +Specifies a printer that is a member of the printer class. +.TP 5 +QuotaPeriod seconds +.br +Specifies the job-quota-period value for the printer. +.TP 5 +Shared Yes +.TP 5 +Shared No +.br +Specifies whether the printer is shared. +.TP 5 +State idle +.TP 5 +State stopped +.br +Specifies the initial state of the printer (Idle or Stopped) +.TP 5 +StateMessage text +.br +Specifies the message associated with the state. +.TP 5 +StateTime seconds +.br +Specifies the date/time associated with the state. +.SH SEE ALSO +\fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, \fImime.convs(5)\fR, +\fImime.types(5)\fR, \fIprinters.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: classes.conf.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/client.conf.man.in b/man/client.conf.man.in new file mode 100644 index 0000000..6e606b1 --- /dev/null +++ b/man/client.conf.man.in @@ -0,0 +1,55 @@ +.\" +.\" "$Id: client.conf.man.in 9960 2011-09-02 22:37:14Z mike $" +.\" +.\" client.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH client.conf 5 "CUPS" "2 September 2011" "Apple Inc." +.SH NAME +client.conf \- client configuration file for cups +.SH DESCRIPTION +The \fIclient.conf\fR file configures the CUPS client and is +normally located in the \fI@CUPS_SERVERROOT@\fR or \fI~/.cups\fR +directory. Each line in the file can be a configuration +directive, a blank line, or a comment. Comment lines start with +the # character. +.SH DIRECTIVES +The following directives are understood by the client. Consult the +on-line help for detailed descriptions: +.TP 5 +Encryption IfRequested +.TP 5 +Encryption Never +.TP 5 +Encryption Required +.br +Specifies the level of encryption that is required for a particular +location. +.TP 5 +GSSServiceName name +Specifies the Kerberos service name that is used for authentication, typically +"host", "http", or "ipp". CUPS adds the remote hostname +("name@server.example.com") for you. The default name is +"@CUPS_DEFAULT_GSSSERVICENAME@". +.TP 5 +ServerName hostname-or-ip-address[:port] +.TP 5 +ServerName /domain/socket +.br +Specifies the address and optionally the port to use when connecting to the +server. \fBNote: Not supported on Mac OS X 10.7 or later.\fR +.SH SEE ALSO +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: client.conf.man.in 9960 2011-09-02 22:37:14Z mike $". +.\" diff --git a/man/cups-config.man b/man/cups-config.man new file mode 100644 index 0000000..577dd44 --- /dev/null +++ b/man/cups-config.man @@ -0,0 +1,117 @@ +.\" +.\" "$Id: cups-config.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cups-config man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cups-config 1 "CUPS" "23 October 2008" "Apple Inc." +.SH NAME +cups-config \- get cups api, compiler, directory, and link information. +.SH SYNOPSIS +.B cups-config +--api-version +.br +.B cups-config +--build +.br +.B cups-config +--cflags +.br +.B cups-config +--datadir +.br +.B cups-config +--help +.br +.B cups-config +--ldflags +.br +.B cups-config +[ +.I --image +] [ +.I --static +] --libs +.br +.B cups-config +--serverbin +.br +.B cups-config +--serverroot +.br +.B cups-config +--version +.br +.SH DESCRIPTION +\fBcups-config\fR is the CUPS program configuration utility. It should be +used by application developers to determine the necessary command-line +options for the compiler and linker, as well as determining installation +directories for filters, configuration files, and drivers. +.SH OPTIONS +.TP 5 +--api-version +.br +Displays the current API version (major.minor). +.TP 5 +--build +.br +Displays a system-specific build number. +.TP 5 +--cflags +.br +Displays the necessary compiler options. +.TP 5 +--datadir +.br +Displays the default CUPS data directory. +.TP 5 +--help +.br +Displays the program usage message. +.TP 5 +--image +.br +When used with \fI--libs\fR, adds the CUPS imaging library to the +list of displayed libraries. +.TP 5 +--ldflags +.br +Displays the necessary linker options. +.TP 5 +--libs +.br +Displays the necessary librarys to link to. +.TP 5 +--serverbin +.br +Displays the default CUPS binary directory, +where filters and backends are stored. +.TP 5 +--serverroot +.br +Displays the default CUPS configuration file directory. +.TP 5 +--static +.br +When used with \fI--libs\fR, shows the static libraries instead +of the default (shared) libraries. +.TP 5 +--version +.br +Displays the full version number of the CUPS installation +(major.minor.patch). +.SH SEE ALSO +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-config.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cups-deviced.man.in b/man/cups-deviced.man.in new file mode 100644 index 0000000..19fec7d --- /dev/null +++ b/man/cups-deviced.man.in @@ -0,0 +1,44 @@ +.\" +.\" "$Id: cups-deviced.man.in 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cups-deviced man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cups-deviced 8 "CUPS" "16 June 2008" "Apple Inc." +.SH NAME +cups-deviced \- cups device daemon +.SH SYNOPSIS +.B cups-deviced +.I request-id limit user-id options +.SH DESCRIPTION +\fIcups-deviced\fR polls the backends in +\fI@CUPS_SERVERBIN@/backend\fR for a list of available devices. +It is run by \fIcupsd(8)\fR in response to a +\fICUPS-Get-Devices\fR request. The output format is an IPP +response message. The \fIrequest-id\fR argument is the request ID +from the original IPP request, typically 1. The \fIlimit\fR +argument is the limit value from the original IPP request - 0 +means no limit. The \fIuser-id\fR argument is the +requesting-user-name value from the original IPP request. +Finally, the \fIoptions\fR argument is a space-delimited list of +attributes ("name=value name=value \...") that were passed in +with the request. Currently \fIcups-deviced\fR looks for the +\fIrequested-attributes\fR attribute and tailors the output +accordingly. +.SH SEE ALSO +backend(7), cupsd(8), cupsd.conf(5), +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-deviced.man.in 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cups-driverd.man.in b/man/cups-driverd.man.in new file mode 100644 index 0000000..e93ffa9 --- /dev/null +++ b/man/cups-driverd.man.in @@ -0,0 +1,122 @@ +.\" +.\" "$Id: cups-driverd.man.in 9419 2011-01-06 18:49:38Z mike $" +.\" +.\" cups-driverd man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cups-driverd 8 "CUPS" "6 January 2011" "Apple Inc." +.SH NAME +cups-driverd \- cups driver daemon +.SH SYNOPSIS +.B cups-driverd +cat +.I ppd-name +.br +.B cups-driverd +list +.I request_id limit options +.SH DESCRIPTION +\fIcups-driverd\fR shows or lists PPD files. It is run in +response to CUPS-Add-Modify-Printer or CUPS-Get-Devices requests. +The first form ("cups-driverd cat ppd-name") writes the named PPD +file to stdout. The output format is an uncompressed PPD file. +.LP +The second form lists the available manufacturers or PPD files to +stdout as indicated by the \fIoptions\fR argument. The output +format is an IPP response message. The \fIrequest_id\fR argument +is the request ID from the original IPP request, typically 1. The +\fIlimit\fR argument is the limit value from the original IPP +request - 0 means no limit. Finally, the \fIoptions\fR argument +is a space-delimited list of attributes ("name=value name=value +\&...") that were passed in with the request. Currently +\fIcups-driverd\fR looks for the \fIppd-make\fR and +\fIrequested-attributes\fR attributes and tailors the output +accordingly. +.SH DRIVERS +Drivers can be static PPD files under the +\fI@CUPS_DATADIR@/model\fR directory or programs under the +\fI@CUPS_SERVERBIN@/driver\fR directory. Static PPD files must +conform to the Adobe PPD File Format Specification version 4.3 +and may be compressed using the \fIgzip(1)\fR program. Driver +programs must implement the command-line interface shown in the +next section. +.SS DRIVER PROGRAMS +Driver programs provide a interface to dynamically-generated PPD +files. The following arguments are currently defined: +.TP 5 +drivername list +.br +Lists the supported PPD files to stdout. +.TP 5 +drivername cat ppdname +.br +Writes the named PPD file to stdout. +.PP +Driver programs MUST NOT query hardware or make other long-term operations that +would delay the return of a driver list. See the NOTES section below for +specific recommendations. +.SS LISTING FILES (drivername list) +When run with the single argument "list", the program must list +the available PPD files it can generate to stdout using the +following format: +.nf + "drivername:ppdname" language "make" "make and model" + "drivername:ppdname" language "make" "make and model" "1284 device id" + "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" + "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version" + "drivername:ppdname" language "make" "make and model" "1284 device id" "(PPD product)" "PostScript version" "type" +.fi +.LP +\fIDrivername\fR is the name of the driver program. \fIPpdname\fR +is the name used to select the given driver. \fILanguage\fR is +the locale associated with the default language of the PPD file, +typically "en". \fIMake\fR is the Manufacturer name from the PPD +file. \fIMake and model\fR is the NickName name from the PPD +file. \fI1284 device id\fR is the 1284DeviceId from the PPD file, +if any. \fI(PPD product)\fR is the Product string as it would appear in the PPD +file or from a PostScript query. \fIPostScript version\fR is the PSVersion +string as it would appear in the PPD file or from a PostScript query. \fIType\fR +is "postscript" for PostScript printers, "pdf" for PDF printers, "raster" for +raster printers, or "fax" for facsimile devices. +.SS WRITING FILES (drivername cat ppdname) +When the driver program is run with the "cat ppdname" arguments, +it must write the named PPD file to stdout, uncompressed. If the +named PPD file does not exist, the driver program must not write +any output to stdout and report the error to stderr instead. +.SS DRIVER ERROR MESSAGES +Error messages can be relayed back to \fIcupsd\fR by writing them +to stderr. The following prefixes are recognized: +.TP 5 +DEBUG: [drivername] +.br +Debugging messages +.TP 5 +ERROR: [drivername] +.br +Error messages +.TP 5 +INFO: [drivername] +.br +Informational messages +.SH NOTES +Due to performance considerations, driver programs have been officially +deprecated and should not be used for new development. Currently only the +CUPS web interface and \fIlpinfo(8)\fR command will request lists from all +driver programs. +.SH SEE ALSO +cupsd(8), cupsd.conf(5), cupstestppd(1), lpinfo(8), +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-driverd.man.in 9419 2011-01-06 18:49:38Z mike $". +.\" diff --git a/man/cups-lpd.man.in b/man/cups-lpd.man.in new file mode 100644 index 0000000..2959c0a --- /dev/null +++ b/man/cups-lpd.man.in @@ -0,0 +1,124 @@ +.\" +.\" "$Id: cups-lpd.man.in 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cups-lpd man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cups-lpd 8 "CUPS" "4 August 2008" "Apple Inc." +.SH NAME +cups-lpd \- receive print jobs and report printer status to lpd clients +.SH SYNOPSIS +.B cups-lpd +[ -h +.I hostname[:port] +] [ -n ] [ -o +.I option=value +] +.SH DESCRIPTION +\fIcups-lpd\fR is the CUPS Line Printer Daemon ("LPD") +mini-server that supports legacy client systems that use the LPD +protocol. \fIcups-lpd\fR does not act as a standalone network +daemon but instead operates using the Internet "super-server" +\fIinetd(8)\fR or \fIxinetd(8)\fR. If you are using \fIinetd\fR, +add the following line to the \fIinetd.conf\fR file to enable the +\fIcups-lpd\fR mini-server: +.br +.nf + + printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\ + -o document-format=application/octet-stream +.fi +.LP +.LP +\fBNote:\fR If you are using Solaris 10 or higher, you must run +the \fIinetdconv(1m)\fR program to register the changes to the +inetd.conf file. +.LP +If you are using the newer \fIxinetd(8)\fR daemon, create a file +named \fI/etc/xinetd.d/cups\fR containing the following lines: +.br +.nf + + service printer + { + socket_type = stream + protocol = tcp + wait = no + user = lp + group = sys + passenv = + server = @CUPS_SERVERBIN@/daemon/cups-lpd + server_args = -o document-format=application/octet-stream + } +.fi +.SH OPTIONS +.TP 5 +-h hostname[:port] +.br +Sets the CUPS server (and port) to use. +.TP 5 +-n +.br +Disables reverse address lookups; normally \fIcups-lpd\fR will +try to discover the hostname of the client via a reverse DNS +lookup. +.TP 5 +-o name=value +.br +Inserts options for all print queues. Most often this is used to +disable the "l" filter so that remote print jobs are filtered as +needed for printing; the examples in the previous section set the +"document-format" option to "application/octet-stream" which +forces autodetection of the print file format. +.SH PERFORMANCE +\fIcups-lpd\fR performs well with small numbers of clients and +printers. However, since a new process is created for each +connection and since each process must query the printing system +before each job submission, it does not scale to larger +configurations. We highly recommend that large configurations +use the native IPP support provided by CUPS instead. +.SH SECURITY +\fIcups-lpd\fR currently does not perform any access control +based on the settings in \fIcupsd.conf(5)\fR or in the +\fIhosts.allow(5)\fR or \fIhosts.deny(5)\fR files used by TCP +wrappers. Therefore, running \fIcups-lpd\fR on your server will +allow any computer on your network (and perhaps the entire +Internet) to print to your server. +.LP +While \fIxinetd\fR has built-in access control support, you +should use the TCP wrappers package with \fIinetd\fR to limit +access to only those computers that should be able to print +through your server. +.LP +\fIcups-lpd\fR is not enabled by the standard CUPS distribution. +Please consult with your operating system vendor to determine +whether it is enabled on your system. +.SH COMPATIBILITY +\fIcups-lpd\fR does not enforce the restricted source port +number specified in RFC 1179, as using restricted ports does not +prevent users from submitting print jobs. While this behavior is +different than standard Berkeley LPD implementations, it should +not affect normal client operations. +.LP +The output of the status requests follows RFC 2569, Mapping +between LPD and IPP Protocols. Since many LPD implementations +stray from this definition, remote status reporting to LPD +clients may be unreliable. +.SH SEE ALSO +\fIcups(1)\fR, \fIcupsd(8)\fR, \fIinetconv(1m)\fR, +\fIinetd(8)\fR, \fIxinetd(8)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-lpd.man.in 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cups-polld.man b/man/cups-polld.man new file mode 100644 index 0000000..aee7068 --- /dev/null +++ b/man/cups-polld.man @@ -0,0 +1,38 @@ +.\" +.\" "$Id: cups-polld.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cups-polld man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cups-polld 8 "CUPS" "12 February 2006" "Apple Inc." +.SH NAME +cups-polld \- cups printer polling daemon +.SH SYNOPSIS +.B cups-polld +.I address ipp-port interval browse-port +.SH DESCRIPTION +\fIcups-polld\fR polls remote servers for a list of available +printers and printer classes every \fIinterval\fR seconds. +Printer and class information is then broadcast to the localhost +interface (127.0.0.1) on the specified browse port for reception +by \fIcupsd(8)\fR. +.PP +This program is started automatically by \fIcupsd\fR for every +\fIBrowsePoll\fR directive found in the \fIcupsd.conf(5)\fR file. +.SH SEE ALSO +\fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-polld.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cups-snmp.conf.man b/man/cups-snmp.conf.man new file mode 100644 index 0000000..1c778bc --- /dev/null +++ b/man/cups-snmp.conf.man @@ -0,0 +1,73 @@ +.\" +.\" "$Id: cups-snmp.conf.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" snmp.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH snmp.conf 5 "CUPS" "31 July 2006" "Apple Inc." +.SH NAME +snmp.conf \- snmp configuration file for cups +.SH DESCRIPTION +The \fIsnmp.conf\fR file configures the CUPS SNMP printer +discovery backend and is normally located in the \fI/etc/cups\fR +directory. Each line in the file can be a configuration +directive, a blank line, or a comment. Comment lines start with +the # character. +.LP +The SNMP backend uses the SNMPv1 protocol to discover network +printers, collecting information from the Host MIB along with +intelligent port probes to determine the correct device URI and +make and model for each printer. Future versions of CUPS will +likely support the new Port Monitor MIB as well. +.SH DIRECTIVES +The following directives are understood by the SNMP backend. +Consult the on-line help for detailed descriptions: +.TP 5 +Address @IF(\fIname\fR) +.TP 5 +Address @LOCAL +.TP 5 +Address \fIaddress\fR +.br +Sends SNMP broadcast queries to the specified address(es). The +default address is "@LOCAL" which broadcasts to all LAN +interfaces. +.TP 5 +Community \fIname\fR +.br +Specifies a SNMP community to query. The default community is +"public". +.TP 5 +DebugLevel \fIN\fR +.br +Sets the debug logging level to \fIN\fR; 0 disables debug +logging, 1 enables basic logging, 2 displays SNMP values, and 3 +displays raw hex data. +.TP 5 +HostNameLookups on +.TP 5 +HostNameLookups off +.br +Specifies whether the addresses of printers should be converted +to hostnames or left as numeric IP addresses. The default is +"off". +.TP 5 +MaxRunTime \fIseconds\fR +.br +Specifies the maximum number of seconds that the SNMP backend +will scan the network for printers. +.SH SEE ALSO +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cups-snmp.conf.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupsaccept.man b/man/cupsaccept.man new file mode 100644 index 0000000..7c53d86 --- /dev/null +++ b/man/cupsaccept.man @@ -0,0 +1,79 @@ +.\" +.\" "$Id: cupsaccept.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" accept/reject man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsaccept 8 "CUPS" "12 February 2006" "Apple Inc." +.SH NAME +cupsaccept/cupsreject \- accept/reject jobs sent to a destination +.SH SYNOPSIS +.B cupsaccept +[ -E ] [ -U +.I username +] [ -h +.I hostname[:port] +] destination(s) +.br +.B cupsreject +[ -E ] [ -U +.I username +] [ -h +.I hostname[:port] +] [ -r +.I reason +] destination(s) +.SH DESCRIPTION +\fIcupsaccept\fR instructs the printing system to accept print jobs to the +specified destinations. +.LP +\fIcupsreject\fR instructs the printing system to reject print jobs to the +specified destinations. The \fI-r\fR option sets the reason for rejecting +print jobs. If not specified the reason defaults to "Reason Unknown". +.SH OPTIONS +The following options are supported by both \fIcupsaccept\fR and +\fIcupsreject\fR: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-U username +.br +Sets the username that is sent when connecting to the server. +.TP 5 +-h hostname[:port] +.br +Chooses an alternate server. +.TP 5 +-r "reason" +.br +Sets the reason string that is shown for a printer that is +rejecting jobs. +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", or "#". +Also, printer and class names are \fInot\fR case-sensitive. +.LP +The CUPS versions of \fIaccept\fR and \fIreject\fR may ask the +user for an access password depending on the printing system +configuration. This differs from the System V versions which +require the root user to execute these commands. +.SH SEE ALSO +\fIcancel(1)\fR, \fIcupsenable(8)\fR, \fIlp(1)\fR, +\fIlpadmin(8)\fR, \fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupsaccept.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupsaddsmb.man.in b/man/cupsaddsmb.man.in new file mode 100644 index 0000000..98fce09 --- /dev/null +++ b/man/cupsaddsmb.man.in @@ -0,0 +1,214 @@ +.\" +.\" "$Id: cupsaddsmb.man.in 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cupsaddsmb man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsaddsmb 8 "CUPS" "25 July 2007" "Apple Inc." +.SH NAME +cupsaddsmb \- export printers to samba for windows clients + +.SH SYNOPSIS +.B cupsaddsmb +[ -H +.I samba-server +] [ -U +.I samba-user[%samba-password] +] [ -h +.I cups-server[:port] +] [ -v ] -a +.br +.B cupsaddsmb +[ -H +.I samba-server +] [ -U +.I samba-user[%samba-password] +] [ -h +.I cups-server[:port] +] [ -v ] printer [ ... printer ] + +.SH DESCRIPTION +\fIcupsaddsmb\fR exports printers to the SAMBA software (version +2.2.0 or higher) for use with Windows clients. Depending on the +SAMBA configuration, you may need to provide a password to +export the printers. This program requires the Windows printer +driver files described below. + +.SH OPTIONS +\fIcupsaddsmb\fR supports the following options: +.TP 5 +-H samba-server +.br +Specifies the SAMBA server which defaults to the CUPS server. +.TP 5 +-U samba-user[%samba-password] +.br +Specifies the SAMBA print admin username which defaults to your +current username. If the username contains a percent (%) +character, then the text following the percent is treated as the +SAMBA password to use. +.TP 5 +-a +.br +Exports all known printers. Otherwise only the named printers are +exported. +.TP 5 +-h cups-server[:port] +.br +Specifies a different CUPS server to use. +.TP 5 +-v +.br +Specifies that verbose information should be shown. This is +useful for debugging SAMBA configuration problems. + +.SH SAMBA CONFIGURATION +\fIcupsaddsmb\fR uses the new RPC-based printing support in +SAMBA 2.2.x to provide printer drivers and PPD files to Windows +client machines. In order to use this functionality, you must +first configure the SAMBA \fIsmb.conf(5)\fR file to support +printing through CUPS and provide a printer driver download +share, as follows: +.nf + + [global] + load printers = yes + printing = cups + printcap name = cups + + [printers] + comment = All Printers + path = /var/spool/samba + browseable = no + public = yes + guest ok = yes + writable = no + printable = yes + + [print$] + comment = Printer Drivers + path = /etc/samba/drivers + browseable = yes + guest ok = no + read only = yes + write list = root +.fi +.LP +This configuration assumes a FHS-compliant installation of +SAMBA; adjust the [printers] and [print$] share paths +accordingly on your system as needed. + +.SH MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS +The base driver for Windows 2000 and higher is the Microsoft +PostScript driver, which is available on any system running +Windows 2000 or higher in the +%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\W32X86\\3 folder for 32-bit +drivers and +%WINDIR%\\SYSTEM32\\SPOOL\\DRIVERS\\X64\\3 folder for 64-bit +drivers. +.LP +The CUPS printer driver is preferred over the Microsoft driver +since it supports the page-label, job-billing, and +job-hold-until options fully on all printers. However, currently +only Windows 2000 and higher is supported by the Microsoft +driver, so you will also need to get the Adobe driver to support +Windows 95, 98, and Me clients. The Adobe and Microsoft drivers +for Windows 2000 are identical. +.LP +Once you have extracted the driver files, copy the 32-bit drivers +to the \fI@CUPS_DATADIR@/drivers\fR directory and the 64-bit +drivers to the \fI@CUPS_DATADIR@/drivers/x64\fR directory exactly +as named below: +.nf + + [Windows 2000 and higher] + ps5ui.dll + pscript.hlp + pscript.ntf + pscript5.dll +.fi +.LP +\fBNote:\fR Unlike Windows, case is significant - make sure that +you use the lowercase filenames shown above, otherwise +\fIcupsaddsmb\fR will fail to export the drivers. + +.SH CUPS POSTSCRIPT DRIVERS FOR WINDOWS +\fIcupsaddsmb\fR can use the CUPS v6 PostScript printer driver +for Windows, which is available for download from the CUPS web +site. +.LP +The CUPS printer driver is preferred over the Adobe and +Microsoft drivers since it supports the page-label, job-billing, +and job-hold-until options fully on all printers. However, +currently only Windows 2000 and higher is supported by the CUPS +driver, so you will also need to get the Adobe driver to support +Windows 95, 98, and Me clients. +.LP +Once you have extracted the driver files, copy the 32-bit drivers +to the \fI@CUPS_DATADIR@/drivers\fR directory and the 64-bit +drivers to the \fI@CUPS_DATADIR@/drivers/x64\fR directory exactly +as named below: +.nf + + [Windows 2000 and higher] + cups6.inf (from www.cups.org) + cups6.ini (from www.cups.org) + cupsps6.dll (from www.cups.org) + cupsui6.dll (from www.cups.org) + ps5ui.dll (from your Windows system) + pscript.hlp (from your Windows system) + pscript.ntf (from your Windows system) + pscript5.dll (from your Windows system) +.fi +.LP +\fBNote:\fR Unlike Windows, case is significant - make sure that +you use the lowercase filenames shown above, otherwise +\fIcupsaddsmb\fR will fail to export the drivers. + +.SH ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME +\fIcupsaddsmb\fR can use the Adobe PostScript printer driver for +Windows 95, 98, and ME, which are available for download from the +Adobe web site (http://www.adobe.com). +.LP +The Adobe driver does not support the page-label, job-billing, or +job-hold-until options. +.LP +Once you have installed the driver on a Windows system, copy the +following files to the \fI@CUPS_DATADIR@/drivers\fR directory +exactly as named below: +.nf + + [Windows 95, 98, and Me] + ADFONTS.MFM + ADOBEPS4.DRV + ADOBEPS4.HLP + ICONLIB.DLL + PSMON.DLL +.fi +.LP +\fBNote:\fR Unlike Windows, case is significant - make sure that +you use the UPPERCASE filenames shown above, otherwise +\fIcupsaddsmb\fR will fail to export the drivers. + +.SH KNOWN ISSUES +Getting the full set of Windows driver files should be easier. + +.SH SEE ALSO +\fIsmbd(8)\fR, \fIsmb.conf(5)\fR, +http://localhost:631/help +.br +http://www.cups.org/windows/ + +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupsaddsmb.man.in 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupsctl.man b/man/cupsctl.man new file mode 100644 index 0000000..411ada8 --- /dev/null +++ b/man/cupsctl.man @@ -0,0 +1,107 @@ +.\" +.\" "$Id: cupsctl.man 9457 2011-01-11 03:04:04Z mike $" +.\" +.\" cupsctl man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsctl 8 "CUPS" "10 January 2011" "Apple Inc." +.SH NAME +cupsctl \- configure cupsd.conf options +.SH SYNOPSIS +.B cupsctl +[ -E ] [-U +.I username +] [ -h +.I server[:port] +] [ --[no-]debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] +[ --[no-]remote-printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] +[ +.I name=value +] +.SH DESCRIPTION +\fIcupsctl\fR updates or queries the \fBcupsd.conf\fR file for a server. When +no changes are requested, the current configuration values are written to the +standard output in the format "name=value", one per line. +.SH OPTIONS +The following options are recognized: +.TP 5 +-E +.br +Enables encryption on the connection to the scheduler. +.TP 5 +-U \fIusername\fR +.br +Specifies an alternate username to use when authenticating with the scheduler. +.TP 5 +-h \fIserver[:port]\fR +.br +Specifies the server address. +.TP 5 +--[no-]debug-logging +.br +Enables or disables debug logging in the \fBerror_log\fR file. +.TP 5 +--[no-]remote-admin +.br +Enables or disables remote administration. +.TP 5 +--[no-]remote-any +.br +Enables or disables printing from any address, e.g. the Internet. +.TP 5 +--[no-]remote-printers +.br +Enables or disables the display of remote printers shared via the CUPS, LDAP, +or SLP protocols. +.TP 5 +--[no-]share-printers +.br +Enables or disables sharing of local printers with other computers. +.TP 5 +--[no-]user-cancel-any +.br +Allows or prevents users from canceling jobs owned by others. +.SH EXAMPLES +Display the current settings: +.nf + cupsctl +.fi +.LP +Enable debug logging: +.nf + cupsctl --debug-logging +.fi +.LP +Get the current debug logging state: +.nf + cupsctl | grep '^_debug_logging' | awk -F= '{print $2}' +.fi +.LP +Disable printer sharing: +.nf + cupsctl --no-shared-printers +.fi +.LP +Enable printing using the file: pseudo-device: +.nf + cupsctl FileDevice=Yes +.fi +.SH KNOWN ISSUES +You cannot set the Listen or Port directives using \fIcupsctl\fR. +.SH SEE ALSO +\fIcupsd.conf(5)\fR, \fIcupsd(8)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupsctl.man 9457 2011-01-11 03:04:04Z mike $". +.\" diff --git a/man/cupsd.conf.man.in b/man/cupsd.conf.man.in new file mode 100644 index 0000000..c517f0b --- /dev/null +++ b/man/cupsd.conf.man.in @@ -0,0 +1,762 @@ +.\" +.\" "$Id: cupsd.conf.man.in 9784 2011-05-18 21:33:35Z mike $" +.\" +.\" cupsd.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsd.conf 5 "CUPS" "18 May 2011" "Apple Inc." +.SH NAME +cupsd.conf \- server configuration file for cups +.SH DESCRIPTION +The \fIcupsd.conf\fR file configures the CUPS scheduler, \fIcupsd(8)\fR. It +is normally located in the \fI@CUPS_SERVERROOT@\fR directory. +.LP +Each line in the file can be a configuration directive, a blank line, +or a comment. Comment lines start with the # character. The +configuration directives are intentionally similar to those used by the +popular Apache web server software and are described below. +.SH DIRECTIVES +The following directives are understood by \fIcupsd(8)\fR. Consult the +on-line help for detailed descriptions: +.TP 5 +AccessLog filename +.TP 5 +AccessLog syslog +.br +Defines the access log filename. +.TP 5 +AccessLogLevel config +.TP 5 +AccessLogLevel actions +.TP 5 +AccessLogLevel all +.br +Specifies the logging level for the AccessLog file. +.TP 5 +Allow all +.TP 5 +Allow none +.TP 5 +Allow host.domain.com +.TP 5 +Allow *.domain.com +.TP 5 +Allow ip-address +.TP 5 +Allow ip-address/netmask +.TP 5 +Allow ip-address/mm +.TP 5 +Allow @IF(name) +.TP 5 +Allow @LOCAL +.br +Allows access from the named hosts or addresses. +.TP 5 +AuthClass User +.TP 5 +AuthClass Group +.TP 5 +AuthClass System +.br +Specifies the authentication class (User, Group, System) - +\fBthis directive is deprecated\fR. +.TP 5 +AuthGroupName group-name +.br +Specifies the authentication group - \fBthis directive is +deprecated\fR. +.TP 5 +AuthType None +.TP 5 +AuthType Basic +.TP 5 +AuthType BasicDigest +.TP 5 +AuthType Digest +.TP 5 +AuthType Negotiate +.br +Specifies the authentication type (None, Basic, BasicDigest, Digest, Negotiate) +.TP 5 +AutoPurgeJobs Yes +.TP 5 +AutoPurgeJobs No +.br +Specifies whether to purge job history data automatically when +it is no longer required for quotas. +.TP 5 +BrowseAddress ip-address +.TP 5 +BrowseAddress @IF(name) +.TP 5 +BrowseAddress @LOCAL +.br +Specifies a broadcast address for outgoing printer information packets. +.TP 5 +BrowseAllow all +.TP 5 +BrowseAllow none +.TP 5 +BrowseAllow host.domain.com +.TP 5 +BrowseAllow *.domain.com +.TP 5 +BrowseAllow ip-address +.TP 5 +BrowseAllow ip-address/netmask +.TP 5 +BrowseAllow ip-address/mm +.TP 5 +BrowseAllow @IF(name) +.TP 5 +BrowseAllow @LOCAL +.br +Allows incoming printer information packets from the named host or address. +.TP 5 +BrowseDeny all +.TP 5 +BrowseDeny none +.TP 5 +BrowseDeny host.domain.com +.TP 5 +BrowseDeny *.domain.com +.TP 5 +BrowseDeny ip-address +.TP 5 +BrowseDeny ip-address/netmask +.TP 5 +BrowseDeny ip-address/mm +.TP 5 +BrowseDeny @IF(name) +.TP 5 +BrowseDeny @LOCAL +.br +Denies incoming printer information packets from the named host or address. +.TP 5 +BrowseInterval seconds +.br +Specifies the maximum interval between printer information broadcasts. +.TP 5 +BrowseLDAPBindDN +.br +Specifies the LDAP domain name to use when registering printers. +.TP 5 +BrowseLDAPCACertFile +.br +Specifies the SSL certificate authority file to use. +.TP 5 +BrowseLDAPDN +.br +Specifies the LDAP domain name to use when discovering printers. +.TP 5 +BrowseLDAPPassword +.br +Specifies the password to use when accessing the LDAP server. +.TP 5 +BrowseLDAPServer +.br +Specifies the LDAP server to use. +.TP 5 +BrowseOrder allow,deny +.TP 5 +BrowseOrder deny,allow +.br +Specifies the order of printer information access control (allow,deny or deny,allow) +.TP 5 +BrowsePoll host-or-ip-address +.br +Specifies a server to poll for printer information. +.TP 5 +BrowsePort port +.br +Specifies the port to listen to for printer information packets. +.TP 5 +BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP] +.br +Specifies the protocols to use for printer browsing. +.TP 5 +BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP] +.br +Specifies the protocols to use for local printer browsing. +.TP 5 +BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP] +.br +Specifies the protocols to use for remote printer browsing. +.TP 5 +BrowseRelay from-address to-address +.br +Specifies that printer information packets should be relayed from one host or +network to another. +.TP 5 +BrowseShortNames Yes +.TP 5 +BrowseShortNames No +.br +Specifies whether remote printers will use short names ("printer") or not +("printer@server"). This option is ignored if more than one remote printer +exists with the same name. +.TP 5 +BrowseTimeout seconds +.br +Specifies the maximum interval between printer information updates before +remote printers will be removed from the list of available printers. +.TP 5 +BrowseWebIF Yes +.TP 5 +BrowseWebIF No +.br +Specifies whether the CUPS web interface is advertised via DNS-SD. +.TP 5 +Browsing Yes +.TP 5 +Browsing No +.br +Specifies whether or not remote printer browsing should be enabled. +.TP 5 +Classification banner +.br +Specifies the security classification of the server. +.TP 5 +ClassifyOverride Yes +.TP 5 +ClassifyOverride No +.br +Specifies whether to allow users to override the classification +of individual print jobs. +.TP 5 +ConfigFilePerm mode +.br +Specifies the permissions for all configuration files that the scheduler +writes. +.TP 5 +DataDir path +.br +Specified the directory where data files can be found. +.TP 5 +DefaultAuthType Basic +.TP 5 +DefaultAuthType BasicDigest +.TP 5 +DefaultAuthType Digest +.TP 5 +DefaultAuthType Negotiate +.br +Specifies the default type of authentication to use. +.TP 5 +DefaultEncryption Never +.TP 5 +DefaultEncryption IfRequested +.TP 5 +DefaultEncryption Required +.br +Specifies the type of encryption to use for authenticated requests. +.TP 5 +DefaultLanguage locale +.br +Specifies the default language to use for text and web content. +.TP 5 +DefaultPaperSize Auto +.TP 5 +DefaultPaperSize None +.TP 5 +DefaultPaperSize sizename +.br +Specifies the default paper size for new print queues. "Auto" uses a locale- +specific default, while "None" specifies there is no default paper size. +.TP 5 +DefaultPolicy policy-name +.br +Specifies the default access policy to use. +.TP 5 +DefaultShared Yes +.TP 5 +DefaultShared No +.br +Specifies whether local printers are shared by default. +.TP 5 +Deny all +.TP 5 +Deny none +.TP 5 +Deny host.domain.com +.TP 5 +Deny *.domain.com +.TP 5 +Deny ip-address +.TP 5 +Deny ip-address/netmask +.TP 5 +Deny ip-address/mm +.TP 5 +Deny @IF(name) +.TP 5 +Deny @LOCAL +.br +Denies access to the named host or address. +.TP 5 +DirtyCleanInterval seconds +.br +Specifies the delay for updating of configuration and state files. A value of 0 +causes the update to happen as soon as possible, typically within a few +milliseconds. +.TP 5 +DocumentRoot directory +.br +Specifies the root directory for the internal web server documents. +.TP 5 +Encryption IfRequested +.TP 5 +Encryption Never +.TP 5 +Encryption Required +.br +Specifies the level of encryption that is required for a particular +location. +.TP 5 +ErrorLog filename +.TP 5 +ErrorLog syslog +.br +Specifies the error log filename. +.TP 5 +FatalErrors none +.TP 5 +FatalErrors all -kind [... -kind] +.TP 5 +FatalErrors kind [... kind] +.br +Specifies which errors are fatal, causing the scheduler to exit. "Kind" is +"browse", "config", "listen", "log", or "permissions". +.TP 5 +FileDevice Yes +.TP 5 +FileDevice No +.br +Specifies whether the file pseudo-device can be used for new +printer queues. +.TP 5 +FilterLimit limit +.br +Specifies the maximum cost of filters that are run concurrently. +.TP 5 +FilterNice nice-value +.br +Specifies the scheduling priority ("nice" value) of filters that +are run to print a job. +.TP 5 +FontPath directory[:directory:...] +.br +Specifies the search path for fonts. +.TP 5 +Group group-name-or-number +.br +Specifies the group name or ID that will be used when executing +external programs. +.TP 5 +HideImplicitMembers Yes +.TP 5 +HideImplicitMembers No +.br +Specifies whether to hide members of implicit classes. +.TP 5 +HostNameLookups On +.TP 5 +HostNameLookups Off +.TP 5 +HostNameLookups Double +.br +Specifies whether or not to do reverse lookups on client addresses. +.TP 5 +ImplicitAnyClasses Yes +.TP 5 +ImplicitAnyClasses No +.br +Specifies whether or not to create implicit classes for local and +remote printers, e.g. "AnyPrinter" from "Printer", "Printer@server1", +and "Printer@server2". +.TP 5 +ImplicitClasses Yes +.TP 5 +ImplicitClasses No +.br +Specifies whether or not to create implicit classes from identical +remote printers. +.TP 5 +Include filename +.br +Includes the named file. +.TP 5 +JobKillDelay seconds +.br +Specifies the number of seconds to wait before killing the filters and backend +associated with a canceled or held job. +.TP 5 +JobPrivateAccess all +.TP 5 +JobPrivateAccess default +.TP 5 +JobPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+ +.br +Specifies an access list for a job's private values. The "default" access list +is "@OWNER @SYSTEM". "@ACL" maps to the printer's requesting-user-name-allowed +or requesting-user-name-denied values. +.TP 5 +JobPrivateValues all +.TP 5 +JobPrivateValues default +.TP 5 +JobPrivateValues none +.TP 5 +JobPrivateValues attribute-name-1 [ ... attribute-name-N ] +Specifies the list of job values to make private. The "default" values are +"job-name", "job-originating-host-name", and "job-originating-user-name". +.TP 5 +JobRetryInterval seconds +.br +Specifies the interval between retries of jobs in seconds. +.TP 5 +JobRetryLimit count +.br +Specifies the number of retries that are done for jobs. +.TP 5 +KeepAlive Yes +.TP 5 +KeepAlive No +.br +Specifies whether to support HTTP keep-alive connections. +.TP 5 +KeepAliveTimeout seconds +.br +Specifies the amount of time that connections are kept alive. +.TP 5 + ... +.br +Specifies the IPP operations that are being limited inside a policy. +.TP 5 + ... +.TP 5 + ... +.br +Specifies the HTTP methods that are being limited inside a location. +.TP 5 +LimitRequestBody +.br +Specifies the maximum size of any print job request. +.TP 5 +Listen ip-address:port +.TP 5 +Listen *:port +.TP 5 +Listen /path/to/domain/socket +.br +Listens to the specified address and port or domain socket path. +.TP 5 + ... +.br +Specifies access control for the named location. +.TP 5 +LogDebugHistory #-messages +.br +Specifies the number of debugging messages that are logged when an error +occurs in a print job. +.TP 5 +LogFilePerm mode +.br +Specifies the permissions for all log files that the scheduler writes. +.TP 5 +LogLevel alert +.TP 5 +LogLevel crit +.TP 5 +LogLevel debug2 +.TP 5 +LogLevel debug +.TP 5 +LogLevel emerg +.TP 5 +LogLevel error +.TP 5 +LogLevel info +.TP 5 +LogLevel none +.TP 5 +LogLevel notice +.TP 5 +LogLevel warn +.br +Specifies the logging level for the ErrorLog file. +.TP 5 +LogTimeFormat standard +.TP 5 +LogTimeFormat usecs +.br +Specifies the format of the date and time in the log files. +.TP 5 +MaxClients number +.br +Specifies the maximum number of simultaneous clients to support. +.TP 5 +MaxClientsPerHost number +.br +Specifies the maximum number of simultaneous clients to support from a +single address. +.TP 5 +MaxCopies number +.br +Specifies the maximum number of copies that a user can print of each job. +.TP 5 +MaxJobs number +.br +Specifies the maximum number of simultaneous jobs to support. +.TP 5 +MaxJobsPerPrinter number +.br +Specifies the maximum number of simultaneous jobs per printer to support. +.TP 5 +MaxJobsPerUser number +.br +Specifies the maximum number of simultaneous jobs per user to support. +.TP 5 +MaxLogSize number-bytes +.br +Specifies the maximum size of the log files before they are +rotated (0 to disable rotation) +.TP 5 +MaxRequestSize number-bytes +.br +Specifies the maximum request/file size in bytes (0 for no limit) +.TP 5 +MultipleOperationTimeout seconds +.br +Specifies the maximum amount of time to allow between files in a multiple file +print job. +.TP 5 +Order allow,deny +.TP 5 +Order deny,allow +.br +Specifies the order of HTTP access control (allow,deny or deny,allow) +.TP 5 +PageLog filename +.TP 5 +PageLog syslog +.br +Specifies the page log filename. +.TP 5 +PageLogFormat format string +.br +Specifies the format of page log lines. +.TP 5 +PassEnv variable [... variable] +.br +Passes the specified environment variable(s) to child processes. +.TP 5 + ... +.br +Specifies access control for the named policy. +.TP 5 +Port number +.br +Specifies a port number to listen to for HTTP requests. +.TP 5 +PreserveJobFiles Yes +.TP 5 +PreserveJobFiles No +.br +Specifies whether or not to preserve job files after they are printed. +.TP 5 +PreserveJobHistory Yes +.TP 5 +PreserveJobHistory No +.br +Specifies whether or not to preserve the job history after they are +printed. +.TP 5 +Printcap +.TP 5 +Printcap filename +.br +Specifies the filename for a printcap file that is updated +automatically with a list of available printers (needed for +legacy applications); specifying Printcap with no filename +disables printcap generation. +.TP 5 +PrintcapFormat bsd +.TP 5 +PrintcapFormat plist +.TP 5 +PrintcapFormat solaris +.br +Specifies the format of the printcap file. +.TP 5 +PrintcapGUI +.TP 5 +PrintcapGUI gui-program-filename +.br +Specifies whether to generate option panel definition files on +some operating systems. When provided with no program filename, +disables option panel definition files. +.TP 5 +ReloadTimeout seconds +.br +Specifies the amount of time to wait for job completion before +restarting the scheduler. +.TP 5 +RemoteRoot user-name +.br +Specifies the username that is associated with unauthenticated root +accesses. +.TP 5 +RequestRoot directory +.br +Specifies the directory to store print jobs and other HTTP request +data. +.TP 5 +Require group group-name-list +.TP 5 +Require user user-name-list +.TP 5 +Require valid-user +.br +Specifies that user or group authentication is required. +.TP 5 +RIPCache bytes +.br +Specifies the maximum amount of memory to use when converting images +and PostScript files to bitmaps for a printer. +.TP 5 +Satisfy all +.TP 5 +Satisfy any +.br +Specifies whether all or any limits set for a Location must be +satisfied to allow access. +.TP 5 +ServerAdmin user@domain.com +.br +Specifies the email address of the server administrator. +.TP 5 +ServerAlias hostname [... hostname] +.TP 5 +ServerAlias * +.br +Specifies an alternate name that the server is known by. The special name "*" +allows any name to be used. +.TP 5 +ServerBin directory +.br +Specifies the directory where backends, CGIs, daemons, and filters may +be found. +.TP 5 +ServerCertificate filename +.br +Specifies the encryption certificate to use. +.TP 5 +ServerKey filename +.br +Specifies the encryption key to use. +.TP 5 +ServerName hostname-or-ip-address +.br +Specifies the fully-qualified hostname of the server. +.TP 5 +ServerRoot directory +.br +Specifies the directory where the server configuration files can be found. +.TP 5 +ServerTokens Full +.TP 5 +ServerTokens Major +.TP 5 +ServerTokens Minimal +.TP 5 +ServerTokens Minor +.TP 5 +ServerTokens None +.TP 5 +ServerTokens OS +.TP 5 +ServerTokens ProductOnly +.br +Specifies what information is included in the Server header of HTTP +responses. +.TP 5 +SetEnv variable value +.br +Set the specified environment variable to be passed to child processes. +.TP 5 +SSLListen +.br +Listens on the specified address and port for encrypted connections. +.TP 5 +SSLOptions None +.TP 5 +SSLOptions NoEmptyFragments +.br +Sets SSL/TLS protocol options for encrypted connections. +.TP 5 +SSLPort +.br +Listens on the specified port for encrypted connections. +.TP 5 +SubscriptionPrivateAccess all +.TP 5 +SubscriptionPrivateAccess default +.TP 5 +SubscriptionPrivateAccess {user|@group|@ACL|@OWNER|@SYSTEM}+ +.br +Specifies an access list for a subscription's private values. The "default" +access list is "@OWNER @SYSTEM". "@ACL" maps to the printer's +requesting-user-name-allowed or requesting-user-name-denied values. +.TP 5 +SubscriptionPrivateValues all +.TP 5 +SubscriptionPrivateValues default +.TP 5 +SubscriptionPrivateValues none +.TP 5 +SubscriptionPrivateValues attribute-name-1 [ ... attribute-name-N ] +Specifies the list of job values to make private. The "default" values are +"notify-events", "notify-pull-method", "notify-recipient-uri", +"notify-subscriber-user-name", and "notify-user-data". +.TP 5 +SystemGroup group-name [group-name ...] +.br +Specifies the group(s) to use for System class authentication. +.TP 5 +TempDir directory +.br +Specifies the directory where temporary files are stored. +.TP 5 +Timeout seconds +.br +Specifies the HTTP request timeout in seconds. +.TP 5 +User user-name +.br +Specifies the user name or ID that is used when running external programs. +.TP 5 +WebInterface yes +.TP 5 +WebInterface no +Specifies whether the web interface is enabled. +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fImime.convs(5)\fR, +\fImime.types(5)\fR, \fIprinters.conf(5)\fR, +\fIsubscriptions.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupsd.conf.man.in 9784 2011-05-18 21:33:35Z mike $". +.\" diff --git a/man/cupsd.man.in b/man/cupsd.man.in new file mode 100644 index 0000000..820afd8 --- /dev/null +++ b/man/cupsd.man.in @@ -0,0 +1,72 @@ +.\" +.\" "$Id: cupsd.man.in 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cupsd man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsd 8 "CUPS" "9 March 2009" "Apple Inc." +.SH NAME +cupsd \- cups scheduler +.SH SYNOPSIS +.B cupsd +[ -c +.I config-file +] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ] +.SH DESCRIPTION +\fIcupsd\fR is the scheduler for CUPS. It implements a printing system based +upon the Internet Printing Protocol, version 2.1. If no options are specified +on the command-line then the default configuration file +\fI@CUPS_SERVERROOT@/cupsd.conf\fR will be used. +.SH OPTIONS +.TP 5 +-c config-file +.br +Uses the named configuration file. +.TP 5 +-f +.br +Run \fIcupsd\fR in the foreground; the default is to run in the +background as a "daemon". +.TP 5 +-F +.br +Run \fIcupsd\fR in the foreground but detach the process from the +controlling terminal and current directory. This is useful for +running \fIcupsd\fR from \fIinit(8)\fR. +.TP 5 +-h +.br +Shows the program usage. +.TP 5 +-l +.br +This option is passed to \fIcupsd\fR when it is run from +\fIlaunchd(8)\fR. +.TP 5 +-t +.br +Test the configuration file for syntax errors. +.SH COMPATIBILITY +\fIcupsd\fR implements all of the required IPP/2.1 attributes and +operations. It also implements several CUPS-specific administration +operations. +.SH SEE ALSO +\fIbackend(7)\fR, \fIclasses.conf(5)\fR, \fIcups-deviced(8)\fR, +\fIcups-driverd(8)\fR, \fIcups-lpd(8)\fR, \fIcups-polld(8)\fR, +\fIcupsd.conf(5)\fR, \fIfilter(7)\fR, \fIlaunchd(8)\fR, +\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupsd.man.in 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupsenable.man b/man/cupsenable.man new file mode 100644 index 0000000..0552f42 --- /dev/null +++ b/man/cupsenable.man @@ -0,0 +1,93 @@ +.\" +.\" "$Id: cupsenable.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cupsenable/cupsdisable man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsenable 8 "CUPS" "9 October 2008" "Apple Inc." +.SH NAME +cupsdisable, cupsenable \- stop/start printers and classes +.SH SYNOPSIS +.B cupsdisable +[ -E ] [-U +.I username +] [ -c ] [ -h +.I server[:port] +] [ -r +.I reason +] [ --hold ] destination(s) +.br +.B cupsenable +[ -E ] [-U +.I username +] [ -c ] [ -h +.I server[:port] +] [ --release ] destination(s) +.SH DESCRIPTION +\fIcupsenable\fR starts the named printers or classes. +.LP +\fIcupsdisable\fR stops the named printers or classes. The +following options may be used: +.TP 5 +-E +.br +Forces encryption of the connection to the server. +.TP 5 +-U username +.br +Uses the specified username when connecting to the server. +.TP 5 +-c +.br +Cancels all jobs on the named destination. +.TP 5 +-h server[:port] +.br +Uses the specified server and port. +.TP 5 +--hold +.br +Holds remaining jobs on the named printer. Useful for allowing the current +job to complete before performing maintenance. +.TP 5 +-r "reason" +.br +Sets the message associated with the stopped state. If no reason is specified +then the message is set to "Reason Unknown". +.TP 5 +--release +.br +Releases pending jobs for printing. Use after running \fIcupsdisable\fR with +the \fI--hold\fR option to resume printing. +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", or "#". +Also, printer and class names are \fInot\fR case-sensitive. +.LP +The System V versions of these commands are \fIdisable\fR and +\fIenable\fR. They have been renamed to avoid conflicts with the +\fIbash(1)\fR build-in commands of the same name. +.LP +The CUPS versions of \fIdisable\fR and \fIenable\fR may ask the +user for an access password depending on the printing system +configuration. This differs from the System V versions which +require the root user to execute these commands. +.SH SEE ALSO +\fIcupsaccept(8)\fR, \fIcupsreject(8)\fR, \fIcancel(1)\fR, \fIlp(1)\fR, +\fIlpadmin(8)\fR, \fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. + +.\" +.\" End of "$Id: cupsenable.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupsfilter.man b/man/cupsfilter.man new file mode 100644 index 0000000..7aa9c83 --- /dev/null +++ b/man/cupsfilter.man @@ -0,0 +1,91 @@ +.\" +.\" "$Id: cupsfilter.man 9030 2010-03-05 03:55:56Z mike $" +.\" +.\" cupsfilter man page for CUPS. +.\" +.\" Copyright 2007-2010 by Apple Inc. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupsfilter 8 "CUPS" "4 March 2010" "Apple Inc." +.SH NAME +cupsfilter \- convert a file to another format using cups filters +.SH SYNOPSIS +.B cupsfilter +[ -c +.I config-file +] [ -d +.I printer +] [ -e ] -j +.I job-id[,N] +[ -m +.I mime/type +] [ -n +.I copies +] [ -o +.I name=value +] [ -p +.I filename.ppd +] [ -t +.I title +] +.I filename +.SH DESCRIPTION +\fIcupsfilter\fR is a front-end to the CUPS filter subsystem which allows you +to convert a file to a specific format, just as if you had printed the file +through CUPS. By default, \fIcupsfilter\fR generates a PDF file. +.SH OPTIONS +.TP 5 +-c config-file +.br +Uses the named cupsd.conf configuration file. +.TP 5 +-d printer +Uses information from the named printer. +.TP 5 +-e +.br +Use every filter from the PPD file. +.TP 5 +-j job-id[,N] +.br +Converts document N from the specified job. If N is omitted, document 1 is +converted. +.TP 5 +-m mime/type +.br +Specifies the destination file type. The default file type is application/pdf. +Use printer/foo to convert to the printer format defined by the filters in the +PPD file. +.TP 5 +-n copies +.br +Specifies the number of copies to generate. +.TP 5 +-o name=value +.br +Specifies options to pass to the CUPS filters. +.TP 5 +-p filename.ppd +.br +Specifies the PPD file to use. +.TP 5 +-t title +.br +Specifies the document title. +.SH KNOWN ISSUES +\fIcupsfilter\fR currently does not use the filters defined in the PPD file. +This will be addressed in a future CUPS release. +.SH SEE ALSO +\fIcupsd.conf(5)\fR +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2010 by Apple Inc. +.\" +.\" End of "$Id: cupsfilter.man 9030 2010-03-05 03:55:56Z mike $". +.\" diff --git a/man/cupstestdsc.man b/man/cupstestdsc.man new file mode 100644 index 0000000..781c5ef --- /dev/null +++ b/man/cupstestdsc.man @@ -0,0 +1,50 @@ +.\" +.\" "$Id: cupstestdsc.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cupstestdsc man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupstestdsc 1 "CUPS" "20 March 2006" "Apple Inc." +.SH NAME +cupstestdsc \- test conformance of postscript files +.SH SYNOPSIS +.B cupstestdsc +[ -h ] filename.ps [ ... +.I filenameN.ps +] +.br +.B cupstestdsc +[ -h ] - +.SH DESCRIPTION +\fIcupstestdsc\fR tests the conformance of PostScript files to +the Adobe PostScript Language Document Structuring Conventions +Specification version 3.0. The results of testing and any other +output are sent to the standard output. The second form of the +command reads PostScript from the standard input. +.SH LIMITATIONS +\fIcupstestdsc\fR only validates the DSC comments in a PostScript +file and does not attempt to validate the PostScript code itself. +Developers must ensure that the PostScript they generate follows +the rules defined by Adobe. Specifically, all pages must be +independent of each other, code outside page descriptions may not +affect the graphics state (current font, color, transform matrix, +etc.), and device-specific commands such as setpagedevice should +not be used. +.SH SEE ALSO +http://localhost:631/help +.br +Adobe PostScript Language Document Structuring Conventions +Specification, Version 3.0. +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupstestdsc.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/cupstestppd.man b/man/cupstestppd.man new file mode 100644 index 0000000..042f4c2 --- /dev/null +++ b/man/cupstestppd.man @@ -0,0 +1,165 @@ +.\" +.\" "$Id: cupstestppd.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" cupstestppd man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH cupstestppd 1 "CUPS" "19 November 2009" "Apple Inc." +.SH NAME +cupstestppd \- test conformance of ppd files +.SH SYNOPSIS +.B cupstestppd +[ -I +.I category +] [ -R +.I rootdir +] [ -W +.I category +] [ -q ] [-r] [ -v[v] ] filename.ppd[.gz] [ ... filenameN.ppd[.gz] ] +.br +.B cupstestppd +[ -R +.I rootdir +] [ -W +.I category +] [ -q ] [-r] [ -v[v] ] - +.SH DESCRIPTION +\fIcupstestppd\fR tests the conformance of PPD files to the +Adobe PostScript Printer Description file format specification +version 4.3. It can also be used to list the supported options +and available fonts in a PPD file. The results of testing and +any other output are sent to the standard output. +.LP +The first form of \fIcupstestppd\fR tests one or more PPD files +on the command-line. The second form tests the PPD file provided +on the standard input. +.SH OPTIONS +\fIcupstestppd\fR supports the following options: +.TP 5 +-I filename +.br +Ignores all PCFileName warnings. +.TP 5 +-I filters +.br +Ignores all filter errors. +.TP 5 +-I profiles +.br +Ignores all profile errors. +.TP 5 +-R rootdir +.br +Specifies an alternate root directory for the filter, pre-filter, +and other support file checks. +.TP 5 +-W constraints +.br +Report all UIConstraint errors as warnings. +.TP 5 +-W defaults +.br +Except for size-related options, report all default option errors as warnings. +.TP 5 +-W filters +.br +Report all filter errors as warnings. +.TP 5 +-W profiles +.br +Report all profile errors as warnings. +.TP 5 +-W sizes +.br +Report all media size errors as warnings. +.TP 5 +-W translations +.br +Report all translation errors as warnings. +.TP 5 +-W all +.br +Report all of the previous errors as warnings. +.TP 5 +-W none +.br +Report all of the previous errors as errors. +.TP 5 +-q +.br +Specifies that no information should be displayed. +.TP 5 +-r +.br +Relaxes the PPD conformance requirements so that common +whitespace, control character, and formatting problems are not +treated as hard errors. +.TP 5 +-v +.br +Specifies that detailed conformance testing results should be +displayed rather than the concise PASS/FAIL/ERROR status. +.TP 5 +-vv +.br +Specifies that all information in the PPD file should be +displayed in addition to the detailed conformance testing +results. +.LP +The \fI-q\fR, \fI-v\fR, and \fI-vv\fR options are mutually exclusive. +.SH EXIT STATUS +\fIcupstestppd\fR returns zero on success and non-zero on error. The +error codes are as follows: +.TP 5 +1 +.br +Bad command-line arguments or missing PPD filename. +.TP 5 +2 +.br +Unable to open or read PPD file. +.TP 5 +3 +.br +The PPD file contains format errors that cannot be skipped. +.TP 5 +4 +.br +The PPD file does not conform to the Adobe PPD specification. +.SH EXAMPLES +The following command will test all PPD files under the current +directory and print the names of each file that does not +conform: +.nf + + find . -name \\*.ppd \\! -exec cupstestppd -q '{}' \\; -print + +.fi +The next command tests all PPD files under the current directory +and print detailed conformance testing results for the files +that do not conform: +.nf + + find . -name \\*.ppd \\! -exec cupstestppd -q '{}' \\; \\ + -exec cupstestppd -v '{}' \\; + +.fi +.SH SEE ALSO +\fIlpadmin(8)\fR, +.br +http://localhost:631/help +.br +Adobe PostScript Printer Description File Format Specification, Version 4.3. +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: cupstestppd.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/de/Makefile b/man/de/Makefile new file mode 100644 index 0000000..61025c3 --- /dev/null +++ b/man/de/Makefile @@ -0,0 +1,13 @@ +# +# "$Id: $" +# +# Man page makefile for the Common UNIX Printing System (CUPS). +# + +LANGUAGE=de + +include ../Makefile.l10n + +# +# End of "$Id: $". +# diff --git a/man/filter.man b/man/filter.man new file mode 100644 index 0000000..eef66ba --- /dev/null +++ b/man/filter.man @@ -0,0 +1,256 @@ +.\" +.\" "$Id: filter.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" filter man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH filter 7 "CUPS" "13 May 2009" "Apple Inc." +.SH NAME +filter \- cups file conversion filter interface +.SH SYNOPSIS +.B filter +job user title num-copies options [ +.I filename +] +.SH DESCRIPTION +The CUPS filter interface provides a standard method for adding support for +new document types to CUPS. Each filter is capable of converting from one +or more input formats to another format that can either be printed directly +or piped into another filter to get it to a printable format. +.LP +Filters \fBmust\fR be capable of reading from a filename on the command-line +or from the standard input, copying the standard input to a temporary +file as required by the file format. All output \fBmust\fR be sent to the +standard output. +.LP +The command name (argv[0]) is set to the name of the destination printer but is +also available in the PRINTER environment variable. + +.SH OPTIONS +Options passed on the command-line typically do not include the default choices +the printer's PPD file. In addition, some options may be specified in multiple +ways - "landscape" is a synonym for "orientation-requested=4", "media" is a +synonym for "PageSize", "PageRegion", "InputSlot", and "MediaType", and "sides" +is a synonym for the various "Duplex" options. Non-raster filters \fBmust\fR +support both explicit and implicit specification of PPD options - use the +ppdMarkDefaults and cupsMarkOptions functions in the CUPS library to use the +correct mapping, and ppdFindMarkedChoice to get the user-selected choice. +.LP +Raster filters should use option choices set through the raster page header, as +those reflect the options in effect for a given page. Options specified on the +command-line determine the default values for the entire job, which can be +overridden on a per-page basis. + +.SH LOG MESSAGES +Messages sent to stderr are generally logged to +printer-state-message attribute and the current \fIErrorLog\fR. +Each line begins with a standard prefix: + +.TP 5 +ALERT: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "alert" log level. + +.TP 5 +ATTR: attribute=value [attribute=value] +.br +Sets the named job attribute(s). Typically this will be used to +set the job-remote-id attribute. + +.TP 5 +CRIT: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "critical" log level. + +.TP 5 +DEBUG: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "debug" log level. + +.TP 5 +DEBUG2: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "debug2" log level. + +.TP 5 +EMERG: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "emergency" log level. + +.TP 5 +ERROR: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "error" log level. + +.TP 5 +INFO: message +.br +Sets the printer-state-message attribute. If the current \fILogLevel\fR +is set to "debug2", also adds the specified message to the +current \fIErrorLog\fR using the "info" log level. + +.TP 5 +NOTICE: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "notice" log level. + +.TP 5 +PAGE: page-number #-copies +.TP 5 +PAGE: total #-pages +.br +Adds an entry to the current \fIPageLog\fR. The first form adds +#-copies to the job-media-sheets-completed attribute. The second +form sets the job-media-sheets-completed attribute to #-pages. + +.TP 5 +PPD: Keyword=Value ... KeywordN=Value +.br +Sets the named keywords in the printer's PPD file. This is typically +used to update default option keywords such as DefaultPageSize and +the various installable options in the PPD file. + +.TP 5 +STATE: printer-state-reason [printer-state-reason ...] +.TP 5 +STATE: + printer-state-reason [printer-state-reason ...] +.TP 5 +STATE: - printer-state-reason [printer-state-reason ...] +.br +Sets, adds, or removes printer-state-reason keywords to the +current queue. Typically this is used to indicate media, ink, and +toner conditions on a printer. + +.TP 5 +WARNING: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "warning" log level. + +.SH ENVIRONMENT VARIABLES +The following environment variables are defined by the CUPS +server when executing the filter: + +.TP 5 +CHARSET +.br +The default text character set, typically utf-8. + +.TP 5 +CLASS +.br +When a job is submitted to a printer class, contains the name of +the destination printer class. Otherwise this environment +variable will not be set. + +.TP 5 +CONTENT_TYPE +.br +The MIME type associated with the file (e.g. +application/postscript). + +.TP 5 +CUPS_CACHEDIR +.br +The directory for semi-persistent cache files can be found. + +.TP 5 +CUPS_DATADIR +.br +The directory where data files can be found. + +.TP 5 +CUPS_FILETYPE +.br +The type of file being printed: "job-sheet" for a banner page and "document" +for a regular print file. + +.TP 5 +CUPS_SERVERROOT +.br +The root directory of the server. + +.TP 5 +DEVICE_URI +.br +The device-uri associated with the printer. + +.TP 5 +FINAL_CONTENT_TYPE +.br +The MIME type associated with the printer (e.g. +application/vnd.cups-postscript). + +.TP 5 +LANG +.br +The default language locale (typically C or en). + +.TP 5 +PATH +.br +The standard execution path for external programs that may be run by +the filter. + +.TP 5 +PPD +.br +The full pathname of the PostScript Printer Description (PPD) +file for this printer. + +.TP 5 +PRINTER +.br +The name of the printer. + +.TP 5 +RIP_CACHE +.br +The recommended amount of memory to use for Raster Image +Processors (RIPs). + +.TP 5 +SOFTWARE +.br +The name and version number of the server (typically CUPS/1.2). + +.TP 5 +TZ +.br +The timezone of the server. + +.TP 5 +USER +.br +The user executing the filter, typically "lp" or "root"; consult the +\fIcupsd.conf(5)\fR file for the current setting. + +.SH COMPATIBILITY +While the filter interface is compatible with System V interface +scripts, it will only work with the System V interface script as the +only filter. Typically the interface script will be provided via the +\fIlpadmin(8)\fR command using the \fI-i\fR option. +.SH SEE ALSO +\fIbackend(7)\fR, \fIcupsd(8)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: filter.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/fr/Makefile b/man/fr/Makefile new file mode 100644 index 0000000..8d239ba --- /dev/null +++ b/man/fr/Makefile @@ -0,0 +1,13 @@ +# +# "$Id: $" +# +# Man page makefile for the Common UNIX Printing System (CUPS). +# + +LANGUAGE=fr + +include ../Makefile.l10n + +# +# End of "$Id: $". +# diff --git a/man/ipptool.man b/man/ipptool.man new file mode 100644 index 0000000..6cf8450 --- /dev/null +++ b/man/ipptool.man @@ -0,0 +1,130 @@ +.\" +.\" "$Id: ipptool.man 9354 2010-11-10 06:48:19Z mike $" +.\" +.\" ipptool man page for CUPS. +.\" +.\" Copyright 2010 by Apple Inc. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ipptool 1 "CUPS" "9 November 2010" "Apple Inc." +.SH NAME +ipptool - perform internet printing protocol requests +.SH SYNOPSIS +.B ipptool +[ -4 ] [ -6 ] [ -C ] [ -E ] [ -I ] [ -L ] [ -S ] [ -T +.I seconds +] [ -V +.I version +] [ -X ] [ -c ] [ -d +.I name=value +] [ -f +.I filename +] [ -i +.I seconds +] [ -n +.I repeat-count +] [ -q ] [ -t ] [ -v ] +.I URI +.I filename +[ +.I ... filenameN +] +.SH DESCRIPTION +\fIipptool\fR sends IPP requests to the specified URI and tests and/or displays the results. Each named file defines one or more requests, including the expected response status, attributes, and values. Output is either a plain text, formatted text, CSV, or XML report on the standard output, with a non-zero exit status indicating that one or more tests have failed. The file format is described in \fIipptoolfile(5)\fR. +.SH OPTIONS +The following options are recognized by \fIipptool\fR: +.TP 5 +-4 +Specifies that \fIipptool\fR must connect to the printer or server using IPv4. +.TP 5 +-6 +Specifies that \fIipptool\fR must connect to the printer or server using IPv6. +.TP 5 +-C +Specifies that requests should be sent using the HTTP/1.1 "Transfer-Encoding: chunked" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files. +.TP 5 +-E +Forces TLS encryption when connecting to the server using the HTTP "Upgrade" header. +.TP 5 +-I +Specifies that \fIipptool\fR will continue past errors. +.TP 5 +-L +Specifies that requests should be sent using the HTTP/1.0 "Content-Length:" header, which is required for conformance by all versions of IPP. The default is to use "Transfer-Encoding: chunked" for requests with attached files and "Content-Length:" for requests without attached files. +.TP 5 +-S +Forces (dedicated) SSL encryption when connecting to the server. +.TP 5 +-T seconds +Specifies a timeout for IPP requests in seconds. +.TP 5 +-V version +Specifies the default IPP version to use: 1.0, 1.1, 2.0, 2.1, or 2.2. If not specified, version 1.1 is used. +.TP 5 +-X +Specifies that XML (Apple plist) output is desired instead of the plain text report. This option is incompatible with the \fI-i\fR (interval) and \fI-n\fR (repeat-count) options. +.TP 5 +-c +Specifies that CSV (comma-separated values) output is desired instead of the plain text output. +.TP 5 +-d name=value +Defines the named variable. +.TP 5 +-f filename +Defines the default request filename for tests. +.TP 5 +-i seconds +Specifies that the (last) file should be repeated at the specified interval. This option is incompatible with the \fI-X\fR (XML plist output) option. +.TP 5 +-l +Specifies that plain text output is desired. +.TP 5 +-n repeat-count +Specifies that the (last) file should be repeated the specified number of times. This option is incompatible with the \fI-X\fR (XML plist output) option. +.TP 5 +-t +Specifies that CUPS test report output is desired instead of the plain text output. +.TP 5 +-v +Specifies that all request and response attributes should be output in CUPS test mode (\fI-t\fR). This is the default for XML output. +.SH COMPATIBILITY +The \fIipptool\fR program is unique to CUPS. +.SH EXAMPLES +Get a list of completed jobs for "myprinter": +.nf + ipptool ipp://localhost/printers/myprinter get-completed-jobs.test +.fi +.LP +Send email notifications to "user@example.com" when "myprinter" changes: +.nf + ipptool -d recipient=mailto:user@example.com \ + ipp://localhost/printers/myprinter create-printer-subscription.test +.fi +.SH STANDARD FILES +The following standard files are available: +.nf + create-printer-subscription.test + get-completed-jobs.test + get-jobs.test + ipp-1.1.test + ipp-2.0.test + ipp-2.1.test + testfile.jpg + testfile.pdf + testfile.ps + testfile.txt +.fi +.SH SEE ALSO +\fIipptoolfile(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2010 by Apple Inc. +.\" +.\" End of "$Id: ipptool.man 9354 2010-11-10 06:48:19Z mike $". +.\" diff --git a/man/ipptoolfile.man b/man/ipptoolfile.man new file mode 100644 index 0000000..8a5d58e --- /dev/null +++ b/man/ipptoolfile.man @@ -0,0 +1,523 @@ +.\" +.\" "$Id: ipptoolfile.man 10023 2011-09-28 16:21:15Z mike $" +.\" +.\" ipptoolfile man page for CUPS. +.\" +.\" Copyright 2010-2011 by Apple Inc. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ipptoolfile 5 "CUPS" "28 September 2011" "Apple Inc." +.SH NAME +ipptoolfile \- ipptool file format + +.SH DESCRIPTION +The \fIipptool(1)\fR program accepts free-form plain text files that describe one or more IPP requests. Comments start with the "#" character and continue to the end of the line. Each request is enclosed by curley braces, for example: +.nf + + # This is a comment + { + # The name of the test + NAME "Print PostScript Job" + + # The request to send + OPERATION Print-Job + GROUP operation-attributes-tag + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + FILE testfile.ps + + # The response to expect + STATUS successful-ok + EXPECT attributes-charset OF-TYPE charset + EXPECT attributes-natural-language OF-TYPE naturalLanguage + EXPECT job-id OF-TYPE integer + EXPECT job-uri OF-TYPE uri + } + { + # The name of the test + NAME "Get Attributes of PostScript Job" + + # The request to send + OPERATION Get-Job-Attributes + GROUP operation-attributes-tag + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + + # The response to expect + STATUS successful-ok + EXPECT attributes-charset OF-TYPE charset + EXPECT attributes-natural-language OF-TYPE naturalLanguage + EXPECT job-id OF-TYPE integer + EXPECT job-uri OF-TYPE uri + EXPECT job-state OF-TYPE enum + EXPECT job-originating-user-name OF-TYPE name WITH-VALUE "$user" + } +.fi + +.SH TOP-LEVEL DIRECTIVES +The following directives can be used outside of a test: +.TP 5 +{ test } +Defines a test. +.TP 5 +DEFINE variable-name value +Defines the named variable to the given value. This is equivalent to specifying +"-d variable-name=value" on the \fIipptool\fR command-line. +.TP 5 +DEFINE-DEFAULT variable-name value +Defines the named variable to the given value if it does not already have a +value. +.TP 5 +IGNORE-ERRORS yes +.TP 5 +IGNORE-ERRORS no +Specifies whether, by default, \fIipptool\fR will ignore errors and continue with +subsequent tests. +.TP 5 +INCLUDE "filename" +.TP 5 +INCLUDE +Includes another test file. The first form includes a file relative to the +current test file, while the second form includes a file from the \fIipptool\fR +include directory. +.TP 5 +INCLUDE-IF-DEFINED name "filename" +.TP 5 +INCLUDE-IF-DEFINED name +Includes another test file if the named variable is defined. The first form +includes a file relative to the current test file, while the second form +includes a file from the \fIipptool\fR include directory. +.TP 5 +INCLUDE-IF-NOT-DEFINED name "filename" +.TP 5 +INCLUDE-IF-NOT-DEFINED name +Includes another test file if the named variable is not defined. The first form +includes a file relative to the current test file, while the second form +includes a file from the \fIipptool\fR include directory. +.TP 5 +SKIP-IF-DEFINED variable-name +.TP 5 +SKIP-IF-NOT-DEFINED variable-name +Specifies that the remainder of the test file should be skipped when the +variable is or is not defined. +.TP 5 +TRANSFER auto +Specifies that tests will, by default, use "Transfer-Encoding: chunked" for +requests with attached files and "Content-Length:" for requests without attached +files. +.TP 5 +TRANSFER chunked +Specifies that tests will, by default, use the HTTP/1.1 "Transfer-Encoding: +chunked" header. This is the default and is equivalent to specifying "-c" on the +\fIipptool\fR command-line. Support for chunked requests is required for +conformance with all versions of IPP. +.TP 5 +TRANSFER length +Specifies that tests will, by default, use the HTTP/1.0 "Content-Length:" +header. This is equivalent to specifying "-l" on the \fIipptool\fR command-line. +Support for content length requests is required for conformance with all +versions of IPP. +.TP 5 +VERSION 1.0 +.TP 5 +VERSION 1.1 +.TP 5 +VERSION 2.0 +.TP 5 +VERSION 2.1 +.TP 5 +VERSION 2.2 +Specifies the default IPP version number to use for the tests that follow. + +.SH TEST DIRECTIVES +The following directives are understood in a test: +.TP 5 +ATTR tag attribute-name value(s) +Adds an attribute to the test request. Values are separated by the comma (",") +character - escape commas using the "\" character. +.TP 5 +ATTR collection attribute-name { MEMBER tag member-name value(s) ... } [ ... { ... } ] +Adds a collection attribute to the test request. Member attributes follow the +same syntax as regular attributes and can themselves be nested collections. +Multiple collection values can be supplied as needed. +.TP 5 +DELAY seconds +Specifies a delay before this test will be run. +.TP 5 +DISPLAY attribute-name +Specifies that value of the named attribute should be output as part of the +test report. +.TP 5 +EXPECT attribute-name [ predicate(s) ] +.TP 5 +EXPECT ?attribute-name predicate(s) +.TP 5 +EXPECT !attribute-name +Specifies that the response must/may/must not include the named attribute. +Additional requirements can be added as predicates - see the "EXPECT PREDICATES" +section for more information on predicates. +.TP 5 +FILE filename +Specifies a file to include at the end of the request. This is typically used +when sending a test print file. +.TP 5 +GROUP tag +Specifies the group tag for subsequent attributes in the request. +.TP 5 +IGNORE-ERRORS yes +.TP 5 +IGNORE-ERRORS no +Specifies whether \fIipptool\fR will ignore errors and continue with subsequent +tests. +.TP 5 +NAME "literal string" +Specifies the human-readable name of the test. +.TP 5 +OPERATION operation-code +Specifies the operation to be performed. +.TP 5 +REQUEST-ID number +.TP 5 +REQUEST-ID random +Specifies the request-id value to use in the request, either an integer or the +word "random" to use a randomly generated value (the default). +.TP 5 +RESOURCE path +Specifies an alternate resource path that is used for the HTTP POST request. +The default is the resource from the URI provided to the \fIipptool\fR program. +.TP 5 +SKIP-IF-DEFINED variable-name +.TP 5 +SKIP-IF-NOT-DEFINED variable-name +Specifies that the current test should be skipped when the variable is or is not +defined. +.TP 5 +SKIP-PREVIOUS-ERROR yes +.TP 5 +SKIP-PREVIOUS-ERROR no +Specifies whether \fIipptool\fR will skip the current test if the previous test +resulted in an error/failure. +.TP 5 +STATUS status-code [ predicate ] +Specifies an expected response status-code value. Additional requirements can be +added as predicates - see the "STATUS PREDICATES" section for more information +on predicates. +.TP 5 +TRANSFER auto +Specifies that this test will use "Transfer-Encoding: chunked" if it has an +attached file or "Content-Length:" otherwise. +.TP 5 +TRANSFER chunked +Specifies that this test will use the HTTP/1.1 "Transfer-Encoding: chunked" +header. +.TP 5 +TRANSFER length +Specifies that this test will use the HTTP/1.0 "Content-Length:" header. +.TP 5 +VERSION 1.0 +.TP 5 +VERSION 1.1 +.TP 5 +VERSION 2.0 +.TP 5 +VERSION 2.1 +.TP 5 +VERSION 2.2 +Specifies the IPP version number to use for this test. + +.SH EXPECT PREDICATES +The following predicates are understood following the EXPECT test directive: +.TP 5 +COUNT number +Requires the EXPECT attribute to have the specified number of values. +.TP 5 +DEFINE-MATCH variable-name +Defines the variable to "1" when the EXPECT condition matches. A side-effect of +this predicate is that this EXPECT will never fail a test. +.TP 5 +DEFINE-NO-MATCH variable-name +Defines the variable to "1" when the EXPECT condition does not match. A side- +effect of this predicate is that this EXPECT will never fail a test. +.TP 5 +DEFINE-VALUE variable-name +Defines the variable to the value of the attribute when the EXPECT condition +matches. A side-effect of this predicate is that this EXPECT will never fail a test. +.TP 5 +IF-DEFINED variable-name +Makes the EXPECT conditions apply only if the specified variable is defined. +.TP 5 +IF-NOT-DEFINED variable-name +Makes the EXPECT conditions apply only if the specified variable is not +defined. +.TP 5 +IN-GROUP tag +Requires the EXPECT attribute to be in the specified group tag. +.TP 5 +OF-TYPE tag[,tag,...] +Requires the EXPECT attribute to use the specified value tag(s). +.TP 5 +REPEAT-MATCH +.TP 5 +REPEAT-NO-MATCH +Specifies that the current test should be repeated when the EXPECT condition +matches or does not match. +.TP 5 +SAME-COUNT-AS attribute-name +Requires the EXPECT attribute to have the same number of values as the specified +parallel attribute. +.TP 5 +WITH-VALUE "literal string" +Requires at least one value of the EXPECT attribute to match the literal string. +Comparisons are case-sensitive. +.TP 5 +WITH-VALUE "/regular expression/" +Requires that all values of the EXPECT attribute match the regular expression, +which must conform to the POSIX regular expression syntax. +Comparisons are case-sensitive. + +.SH STATUS PREDICATES +The following predicates are understood following the STATUS test directive: +.TP 5 +IF-DEFINED variable-name +Makes the STATUS apply only if the specified variable is defined. +.TP 5 +IF-NOT-DEFINED variable-name +Makes the STATUS apply only if the specified variable is not defined. +.TP 5 +REPEAT-MATCH +.TP 5 +REPEAT-NO-MATCH +Specifies that the current test should be repeated when the response status-code +matches or does not match the value specified by the STATUS directive. + +.SH OPERATION CODES +Operation codes correspond to the hexadecimal numbers (0xHHHH) and names from +RFC 2911 and other IPP extension specifications. Here is a complete list: +.nf + Activate-Printer + CUPS-Accept-Jobs + CUPS-Add-Modify-Class + CUPS-Add-Modify-Printer + CUPS-Authenticate-Job + CUPS-Delete-Class + CUPS-Delete-Printer + CUPS-Get-Classes + CUPS-Get-Default + CUPS-Get-Devices + CUPS-Get-Document + CUPS-Get-PPD + CUPS-Get-PPDs + CUPS-Get-Printers + CUPS-Move-Job + CUPS-Reject-Jobs + CUPS-Set-Default + Cancel-Current-Job + Cancel-Job + Cancel-Jobs + Cancel-My-Jobs + Cancel-Subscription + Close-Job + Create-Job + Create-Job-Subscription + Create-Printer-Subscription + Deactivate-Printer + Disable-Printer + Enable-Printer + Get-Job-Attributes + Get-Jobs + Get-Notifications + Get-Printer-Attributes + Get-Printer-Support-Files + Get-Printer-Supported-Values + Get-Subscription-Attributes + Get-Subscriptions + Hold-Job + Hold-New-Jobs + Pause-Printer + Pause-Printer-After-Current-Job + Print-Job + Print-URI + Promote-Job + Purge-Jobs + Release-Held-New-Jobs + Release-Job + Renew-Subscription + Reprocess-Job + Restart-Job + Restart-Printer + Resubmit-Job + Resume-Job + Resume-Printer + Schedule-Job-After + Send-Document + Send-Notifications + Send-URI + Set-Job-Attributes + Set-Printer-Attributes + Shutdown-Printer + Startup-Printer + Suspend-Current-Job + Validate-Job +.fi + +.SH STATUS CODES +Status codes correspond to the hexadecimal numbers (0xHHHH) and names from RFC +2911 and other IPP extension specifications. Here is a complete list: +.nf + client-error-attributes-not-settable + client-error-attributes-or-values-not-supported + client-error-bad-request + client-error-charset-not-supported + client-error-compression-error + client-error-compression-not-supported + client-error-conflicting-attributes + client-error-document-access-error + client-error-document-format-error + client-error-document-format-not-supported + client-error-forbidden + client-error-gone + client-error-ignored-all-notifications + client-error-ignored-all-subscriptions + client-error-not-authenticated + client-error-not-authorized + client-error-not-found + client-error-not-possible + client-error-print-support-file-not-found + client-error-request-entity-too-large + client-error-request-value-too-long + client-error-timeout + client-error-too-many-subscriptions + client-error-uri-scheme-not-supported + cups-see-other + redirection-other-site + server-error-busy + server-error-device-error + server-error-internal-error + server-error-job-canceled + server-error-multiple-document-jobs-not-supported + server-error-not-accepting-jobs + server-error-operation-not-supported + server-error-printer-is-deactivated + server-error-service-unavailable + server-error-temporary-error + server-error-version-not-supported + successful-ok + successful-ok-but-cancel-subscription + successful-ok-conflicting-attributes + successful-ok-events-complete + successful-ok-ignored-notifications + successful-ok-ignored-or-substituted-attributes + successful-ok-ignored-subscriptions + successful-ok-too-many-events +.fi + +.SH TAGS +Value and group tags correspond to the names from RFC 2911 and other IPP +extension specifications. Here are the group tags: +.nf + event-notification-attributes-tag + job-attributes-tag + operation-attributes-tag + printer-attributes-tag + subscription-attributes-tag + unsupported-attributes-tag +.fi +.LP +Here are the value tags: +.nf + admin-define + boolean + charset + collection + dateTime + default + delete-attribute + enum + integer + keyword + mimeMediaType + nameWithLanguage + nameWithoutLanguage + naturalLanguage + no-value + not-settable + octetString + rangeOfInteger + resolution + textWithLanguage + textWithoutLanguage + unknown + unsupported + uri + uriScheme +.fi + +.SH VARIABLES +The \fIipptool\fR program maintains a list of variables that can be used in any +literal string or attribute value by specifying "$variable-name". Aside from +variables defined using the "-d" option or "DEFINE" directive, the following +pre-defined variables are available: +.TP 5 +$$ +Inserts a single "$" character. +.TP 5 +$ENV[name] +Inserts the value of the named environment variable, or an empty string if the +environment variable is not defined. +.TP 5 +$filename +Inserts the filename provided to \fIipptool\fR with the "-f" option. +.TP 5 +$hostname +Inserts the hostname from the URI provided to \fIipptool\fR. +.TP 5 +$job-id +Inserts the last job-id value returned in a test response or 0 if no job-id has +been seen. +.TP 5 +$job-uri +Inserts the last job-uri value returned in a test response or an empty string if +no job-uri has been seen. +.TP 5 +$scheme +Inserts the scheme from the URI provided to \fIipptool\fR. +.TP 5 +$notify-subscription-id +Inserts the last notify-subscription-id value returnd in a test response or 0 if +no notify-subscription-id has been seen. +.TP 5 +$port +Inserts the port number from the URI provided to \fIipptool\fR. +.TP 5 +$resource +Inserts the resource path from the URI provided to \fIipptool\fR. +.TP 5 +$uri +Inserts the URI provided to \fIipptool\fR. +.TP 5 +$user +Inserts the current user's login name. +.TP 5 +$username +Inserts the username from the URI provided to \fIipptool\fR, if any. + +.SH SEE ALSO +\fIipptool(1)\fR, +.br +http://localhost:631/help + +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ipptoolfile.man 10023 2011-09-28 16:21:15Z mike $". +.\" diff --git a/man/lp.man b/man/lp.man new file mode 100644 index 0000000..b4ebea9 --- /dev/null +++ b/man/lp.man @@ -0,0 +1,258 @@ +.\" +.\" "$Id: lp.man 10042 2011-10-03 17:32:43Z mike $" +.\" +.\" lp man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lp 1 "CUPS" "3 October 2011" "Apple Inc." +.SH NAME +lp - print files +.SH SYNOPSIS +.B lp +[ -E ] [ -U +.I username +] [ -c ] [ -d +.I destination[/instance] +] [ -h +.I hostname[:port] +] [ -m ] [ -n +.I num-copies +] [ -o +.I option[=value] +] [ -q +.I priority +] [ -s ] [ -t +.I title +] [ -H +.I handling +] [ -P +.I page-list +] [ -- ] [ +.I file(s) +] +.br +.B lp +[ -E ] [ -U +.I username +] [ -c ] [ -h +.I hostname[:port] +] [ -i +.I job-id +] [ -n +.I num-copies +] [ -o +.I option[=value] +] [ -q +.I priority +] [ -t +.I title +] [ -H +.I handling +] [ -P +.I page-list +] +.SH DESCRIPTION +\fIlp\fR submits files for printing or alters a pending job. Use +a filename of "-" to force printing from the standard input. +.SH THE DEFAULT DESTINATION +CUPS provides many ways to set the default destination. The "LPDEST" and +"PRINTER" environment variables are consulted first. If neither are set, +the current default set using the \fIlpoptions(1)\fR command is used, +followed by the default set using the \fIlpadmin(8)\fR command. +.SH OPTIONS +The following options are recognized by \fIlp\fR: +.TP 5 +-- +.br +Marks the end of options; use this to print a file whose name +begins with a dash (-). +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-U username +.br +Specifies the username to use when connecting to the server. +.TP 5 +-c +.br +This option is provided for backwards-compatibility only. On +systems that support it, this option forces the print file to be +copied to the spool directory before printing. In CUPS, print +files are always sent to the scheduler via IPP which has the +same effect. +.TP 5 +-d destination +.br +Prints files to the named printer. +.TP 5 +-h hostname[:port] +.br +Chooses an alternate server. +.TP 5 +-i job-id +.br +Specifies an existing job to modify. +.TP 5 +-m +.br +Sends an email when the job is completed. +.TP 5 +-n copies +.br +Sets the number of copies to print from 1 to 100. +.TP 5 +-o "name=value [name=value ...]" +.br +Sets one or more job options. +.TP 5 +-q priority +.br +Sets the job priority from 1 (lowest) to 100 (highest). The +default priority is 50. +.TP 5 +-s +.br +Do not report the resulting job IDs (silent mode.) +.TP 5 +-t "name" +.br +Sets the job name. +.TP 5 +-H hh:mm +.TP 5 +-H hold +.TP 5 +-H immediate +.TP 5 +-H restart +.TP 5 +-H resume +.br +Specifies when the job should be printed. A value of \fIimmediate\fR will print +the file immediately, a value of \fIhold\fR will hold the job indefinitely, and +a UTC time value (HH:MM) will hold the job until the specified UTC (not local) +time. Use a value of \fIresume\fR with the \fI-i\fR option to resume a held job. +Use a value of \fIrestart\fR with the \fI-i\fR option to restart +a completed job. +.TP 5 +-P page-list +.br +Specifies which pages to print in the document. The list can +contain a list of numbers and ranges (#-#) separated by commas +(e.g. 1,3-5,16). The page numbers refer to the output pages and +not the document's original pages - options like "number-up" can +affect the numbering of the pages. +.SH COMMON JOB OPTIONS +Aside from the printer-specific options reported by the +\fIlpoptions(1)\fR command, the following generic options are +available: +.TP 5 +-o media=size +.br +Sets the page size to \fIsize\fR. Most printers support at least +the size names "a4", "letter", and "legal". +.TP 5 +-o landscape +.TP 5 +-o orientation-requested=4 +.br +Prints the job in landscape (rotated 90 degrees). +.TP 5 +-o sides=one-sided +.TP 5 +-o sides=two-sided-long-edge +.TP 5 +-o sides=two-sided-short-edge +.br +Prints on one or two sides of the paper. The value +"two-sided-long-edge" is normally used when printing portrait +(unrotated) pages, while "two-sided-short-edge" is used for +landscape pages. +.TP 5 +-o fitplot +.br +Scales the print file to fit on the page. +.TP 5 +-o number-up=2 +.TP 5 +-o number-up=4 +.TP 5 +-o number-up=6 +.TP 5 +-o number-up=9 +.TP 5 +-o number-up=16 +.br +Prints multiple document pages on each output page. +.TP 5 +-o scaling=number +.br +Scales image files to use up to \fInumber\fR percent of the page. +Values greater than 100 cause the image file to be printed across +multiple pages. +.TP 5 +-o cpi=N +.br +Sets the number of characters per inch to use when printing a +text file. The default is 10. +.TP 5 +-o lpi=N +.br +Sets the number of lines per inch to use when printing a text +file. The default is 6. +.TP 5 +-o page-bottom=N +.TP 5 +-o page-left=N +.TP 5 +-o page-right=N +.TP 5 +-o page-top=N +.br +Sets the page margins when printing text files. The values are in +points - there are 72 points to the inch. +.SH EXAMPLES +Print a double-sided legal document to a printer called "foo": +.nf + lp -d foo -o media=legal -o sides=two-sided-long-edge filename +.fi +.LP +Print an image across 4 pages: +.nf + lp -d bar -o scaling=200 filename +.fi +.LP +Print a text file with 12 characters per inch, 8 lines per inch, and +a 1 inch left margin: +.nf + lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename +.fi +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", or "#". +Also, printer and class names are \fInot\fR case-sensitive. +.LP +The "q" option accepts a different range of values than the +Solaris lp command, matching the IPP job priority values (1-100, +100 is highest priority) instead of the Solaris values (0-39, 0 +is highest priority). +.SH SEE ALSO +\fIcancel(1)\fR, \fIlpadmin(8)\fR, \fIlpmove(8)\fR, \fIlpoptions(1)\fR, +\fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lp.man 10042 2011-10-03 17:32:43Z mike $". +.\" diff --git a/man/lpadmin.man b/man/lpadmin.man new file mode 100644 index 0000000..c388f03 --- /dev/null +++ b/man/lpadmin.man @@ -0,0 +1,228 @@ +.\" +.\" "$Id: lpadmin.man 9762 2011-05-11 05:30:50Z mike $" +.\" +.\" lpadmin man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpadmin 8 "CUPS" "10 May 2011" "Apple Inc." +.SH NAME +lpadmin \- configure cups printers and classes +.SH SYNOPSIS +.B lpadmin +[ -E ] [-U +.I username +] [ -h +.I server[:port] +] -d +.I destination +.br +.B lpadmin +[ -E ] [-U +.I username +] [ -h +.I server[:port] +] -p +.I destination +[ -R +.I name-default +] +.I option(s) +.br +.B lpadmin +[ -E ] [-U +.I username +] [ -h +.I server[:port] +] -x +.I destination +.SH DESCRIPTION +\fIlpadmin\fR configures printer and class queues provided by +CUPS. It can also be used to set the server default printer or +class. +.LP +When specified before the \fI-d\fR, \fI-p\fR, or \fI-x\fR +options, the \fI-E\fR option forces encryption when connecting to +the server. +.LP +The first form of the command (\fI-d\fR) sets the default printer +or class to \fIdestination\fR. Subsequent print jobs submitted +via the \fIlp(1)\fR or \fIlpr(1)\fR commands will use this +destination unless the user specifies otherwise with the +\fIlpoptions(1)\fR command. +.LP +The second form of the command (\fI-p\fR) configures the named +printer or class. The additional options are described below. +.LP +The third form of the command (\fI-x\fR) deletes the printer or +class \fIdestination\fR. Any jobs that are pending for the +destination will be removed and any job that is currently printed +will be aborted. +.SH CONFIGURATION OPTIONS +The following options are recognized when configuring a printer +queue: +.TP 5 +-c class +.br +Adds the named \fIprinter\fR to \fIclass\fR. If \fIclass\fR does +not exist it is created automatically. +.TP 5 +-i interface +.br +Sets a System V style interface script for the printer. This +option cannot be specified with the \fI-P\fR option (PPD file) +and is intended for providing support for legacy printer drivers. +.TP 5 +-m model +.br +Sets a standard System V interface script or PPD file for the printer from the +\fImodel\fR directory or using one of the driver interfaces. Use the \fI-m\fR +option with the \fIlpinfo(8)\fR command to get a list of supported models. +.TP 5 +-o cupsIPPSupplies=true +.TP 5 +-o cupsIPPSupplies=false +.br +Specifies whether IPP supply level values should be reported. +.TP 5 +-o cupsSNMPSupplies=true +.TP 5 +-o cupsSNMPSupplies=false +.br +Specifies whether SNMP supply level (RFC 3805) values should be reported. +.TP 5 +-o job-k-limit=value +.br +Sets the kilobyte limit for per-user quotas. The value is an +integer number of kilobytes; one kilobyte is 1024 bytes. +.TP 5 +-o job-page-limit=value +.br +Sets the page limit for per-user quotas. The value is the integer +number of pages that can be printed; double-sided pages are +counted as two pages. +.TP 5 +-o job-quota-period=value +.br +Sets the accounting period for per-user quotas. The value is an +integer number of seconds; 86,400 seconds are in one day. +.TP 5 +-o job-sheets-default=banner +.TP 5 +-o job-sheets-default=banner,banner +.br +Sets the default banner page(s) to use for print jobs. +.TP 5 +-o name=value +.br +Sets a PPD option for the printer. PPD options can be listed using the \fI-l\fR +option with the \fIlpoptions(1)\fR command. +.TP 5 +-o name-default=value +.br +Sets a default server-side option for the destination. Any print-time +option can be defaulted, e.g. "-o cpi-default=17" to set the default +"cpi" option value to 17. +.TP 5 +-o port-monitor=name +.br +Sets the binary communications program to use when printing, +"none", "bcp", or "tbcp". The default program is "none". The +specified port monitor must be listed in the printer's PPD file. +.TP 5 +-o printer-error-policy=name +.br +Sets the error policy to be used when the printer backend is +unable to send the job to the printer. The name must be one of +"abort-job", "retry-job", "retry-current-job", or "stop-printer". The default +error policy is "stop-printer" for printers and "retry-current-job" for +classes. +.TP 5 +-o printer-is-shared=true/false +.br +Sets the destination to shared/published or unshared/unpublished. +Shared/published destinations are publicly announced by the server +on the LAN based on the browsing configuration in +\fBcupsd.conf\fR, while unshared/unpublished destinations are not +announced. The default value is "true". +.TP 5 +-o printer-op-policy=name +.br +Sets the IPP operation policy associated with the destination. The +name must be defined in the \fBcupsd.conf\fR in a Policy section. +The default operation policy is "default". +.TP 5 +-R name-default +.br +Deletes the named option from \fIprinter\fR. +.TP 5 +-r class +.br +Removes the named \fIprinter\fR from \fIclass\fR. If the +resulting class becomes empty it is removed. +.TP 5 +-u allow:user,user,@group +.TP 5 +-u deny:user,user,@group +.TP 5 +-u allow:all +.TP 5 +-u deny:none +.br +Sets user-level access control on a destination. Names starting with +"@" are interpreted as UNIX groups. The latter two forms turn +user-level access control off. +.TP 5 +-v "device-uri" +.br +Sets the \fIdevice-uri\fR attribute of the printer queue. If +\fIdevice-uri\fR is a filename it is automatically converted to +the form \fIfile:///file/name\fR. Use the \fI-v\fR option with the +\fIlpinfo(8)\fR command to get a list of supported device URIs and schemes. +.TP 5 +-D "info" +.br +Provides a textual description of the destination. +.TP 5 +-E +.br +Enables the destination and accepts jobs; this is the same as running the +\fIcupsaccept(8)\fR and \fIcupsenable(8)\fR programs on the destination. +.TP 5 +-L "location" +.br +Provides a textual location of the destination. +.TP 5 +-P ppd-file +.br +Specifies a PostScript Printer Description file to use with the +printer. If specified, this option overrides the \fI-i\fR option +(interface script). +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", or "#". +Also, printer and class names are \fInot\fR case-sensitive. +Finally, the CUPS version of \fIlpadmin\fR may ask the user for +an access password depending on the printing system +configuration. This differs from the System V version which +requires the root user to execute this command. +.SH LIMITATIONS +The CUPS version of \fIlpadmin\fR does not support all of the +System V or Solaris printing system configuration options. +.SH SEE ALSO +\fIcupsaccept(8)\fR, \fIcupsenable(8)\fR, \fIlpinfo(8)\fR, +\fIlpoptions(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpadmin.man 9762 2011-05-11 05:30:50Z mike $". +.\" diff --git a/man/lpc.man b/man/lpc.man new file mode 100644 index 0000000..8e5c710 --- /dev/null +++ b/man/lpc.man @@ -0,0 +1,71 @@ +.\" +.\" "$Id: lpc.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpc man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpc 8 "CUPS" "3 November 2008" "Apple Inc." +.SH NAME +lpc \- line printer control program +.SH SYNOPSIS +.B lpc +[ +.I command +[ +.I parameter(s) +] ] +.SH DESCRIPTION +\fIlpc\fR provides limited control over printer and class queues +provided by CUPS. It can also be used to query the state of +queues. +.LP +If no command is specified on the command-line, \fRlpc\fR will +display a prompt and accept commands from the standard input. +.SH COMMANDS +The \fIlpc\fR program accepts a subset of commands accepted by +the Berkeley \fIlpc\fR program of the same name: +.TP 5 +exit +.br +Exits the command interpreter. +.TP 5 +help [command] +.TP 5 +? [command] +.br +Displays a short help message. +.TP 5 +quit +.br +Exits the command interpreter. +.TP 5 +status [queue] +.br +Displays the status of one or more printer or class queues. +.SH LIMITATIONS +Since \fIlpc\fR is geared towards the Berkeley printing system, +it is impossible to use \fIlpc\fR to configure printer or class +queues provided by CUPS. To configure printer or class queues +you must use the \fIlpadmin(8)\fR command or another +CUPS-compatible client with that functionality. +.SH COMPATIBILITY +The CUPS version of \fIlpc\fR does not implement all of the +standard Berkeley or LPRng commands. +.SH SEE ALSO +\fIcancel(1)\fR, \fIcupsaccept(8)\fR, \fIcupsenable(8)\fR, +\fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpc.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpinfo.man b/man/lpinfo.man new file mode 100644 index 0000000..42bda48 --- /dev/null +++ b/man/lpinfo.man @@ -0,0 +1,115 @@ +.\" +.\" "$Id: lpinfo.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpinfo man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpinfo 8 "CUPS" "5 December 2008" "Apple Inc." +.SH NAME +lpinfo \- show available devices or drivers +.SH SYNOPSIS +.B lpinfo +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -l ] [ --device-id +.I device-id-string +] [ --exclude-schemes +.I scheme-list +] [ --include-schemes +.I scheme-list +] [ --language +.I locale +] [ --make-and-model +.I name +] [ --product +.I name +] -m +.br +.B lpinfo +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -l ] [ --exclude-schemes +.I scheme-list +] [ --include-schemes +.I scheme-list +] [ --timeout +.I seconds +] -v +.SH DESCRIPTION +\fIlpinfo\fR lists the available devices or drivers known to the +CUPS server. The first form (\fI-m\fR) lists the available +drivers, while the second form (\fI-v\fR) lists the available +devices. +.SH OPTIONS +\fIlpinfo\fR accepts the following options: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-U username +.br +Sets the username to use when connecting to the server. +.TP 5 +-h server[:port] +.br +Selects an alternate server. +.TP 5 +-l +.br +Shows a "long" listing of devices or drivers. +.TP 5 +--device-id device-id-string +.br +Specifies the IEEE-1284 device ID to match when listing drivers with the +\fI-m\fR option. +.TP 5 +--exclude-schemes scheme-list +.br +Specifies a comma-separated list of device or PPD schemes that should be +excluded from the results. Static PPD files use the "file" scheme. +.TP 5 +--include-schemes scheme-list +.br +Specifies a comma-separated list of device or PPD schemes that should be +included in the results. Static PPD files use the "file" scheme. +.TP 5 +--language locale +.br +Specifies the language to match when listing drivers with the \fI-m\fR option. +.TP 5 +--make-and-model name +.br +Specifies the make and model to match when listing drivers with the \fI-m\fR +option. +.TP 5 +--product name +.br +Specifies the product to match when listing drivers with the \fI-m\fR option. +.TP 5 +--timeout seconds +.br +Specifies the timeout when listing devices with the \fI-v\fR option. +.SH COMPATIBILITY +The \fIlpinfo\fR command is unique to CUPS. +.SH SEE ALSO +\fIlpadmin(8)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpinfo.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpmove.man b/man/lpmove.man new file mode 100644 index 0000000..b5688f4 --- /dev/null +++ b/man/lpmove.man @@ -0,0 +1,66 @@ +.\" +.\" "$Id: lpmove.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpmove man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpmove 8 "CUPS" "12 February 2006" "Apple Inc." +.SH NAME +lpmove \- move a job or all jobs to a new destination +.SH SYNOPSIS +.B lpmove +[ -E ] [ -h +.I server[:port] +] [ -U +.I username +] +.I job destination +.br +.B lpmove +[ -E ] [ -h +.I server[:port] +] [ -U +.I username +] +.I source destination +.SH DESCRIPTION +\fBlpmove\fR moves the specified \fIjob\fR or all jobs from +\fIsource\fR to \fIdestination\fR. \fIjob\fR can be the job ID +number or the old destination and job ID: +.br +.nf + + lpmove 123 newprinter + lpmove oldprinter-123 newprinter +.fi +.SH OPTIONS +The \fIlpmove\fR command supports the following options: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-U username +.br +Specifies an alternate username. +.TP 5 +-h server[:port] +.br +Specifies an alternate server. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpmove.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpoptions.man.in b/man/lpoptions.man.in new file mode 100644 index 0000000..7e5f07e --- /dev/null +++ b/man/lpoptions.man.in @@ -0,0 +1,135 @@ +.\" +.\" "$Id: lpoptions.man.in 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpoptions man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpoptions 1 "CUPS" "29 August 2008" "Apple Inc." +.SH NAME +lpoptions \- display or set printer options and defaults +.SH SYNOPSIS +.B lpoptions +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] -d +.I destination[/instance] +[ -o +.I option[=value] +] ... [ -o +.I option[=value] +] +.br +.B lpoptions +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -p +.I destination[/instance] +] -l +.br +.B lpoptions +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -o +.I option[=value] +] ... [ -o +.I option[=value] +] [ -p +.I destination[/instance] +] -r +.I option +.br +.B lpoptions +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] -x +.I destination[/instance] +.SH DESCRIPTION +\fIlpoptions\fR displays or sets printer options and defaults. +\fIlpoptions\fR shows the default printer options when run with no +arguments. Other options include: +.TP 5 +-E +.br +Enables encryption when communicating with the CUPS server. +.TP 5 +-U username +.br +Uses an alternate username. +.TP 5 +-d destination[/instance] +.br +Sets the user default printer to \fIdestination\fR. If \fIinstance\fR +is supplied then that particular instance is used. This option +overrides the system default printer for the current user. +.TP 5 +-h server[:port] +.br +Uses an alternate server. +.TP 5 +-l +.br +Lists the printer specific options and their current settings. +.TP 5 +-o option[=value] +.br +Specifies a new option for the named destination. +.TP 5 +-p destination[/instance] +.br +Sets the destination and instance, if specified, for any options +that follow. If the named instance does not exist then it is +created. +.TP 5 +-r option +.br +Removes the specified option for the named destination. +.TP 5 +-x destination[/instance] +.br +Removes the options for the named destination and instance, if +specified. If the named instance does not exist then this does +nothing. +.LP +If no options are specified using the \fI-o\fR option, then the +current options for the named printer are reported on the +standard output. +.LP +Options set with the \fIlpoptions\fR command are used by the +\fIlp(1)\fR and \fIlpr(1)\fR commands when submitting jobs. +.SH ROOT ACCOUNT OPTIONS +When run by the root user, \fIlpoptions\fR gets and sets default +options and instances for \fIall users\fR in the +@CUPS_SERVERROOT@/lpoptions file. +.SH COMPATIBILITY +The \fIlpoptions\fR command is unique to CUPS. +.SH FILES +~/.cups/lpoptions - user defaults and instances created by non-root +users. +.br +@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances +created by the root user. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpr(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpoptions.man.in 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lppasswd.man b/man/lppasswd.man new file mode 100644 index 0000000..87ade67 --- /dev/null +++ b/man/lppasswd.man @@ -0,0 +1,68 @@ +.\" +.\" "$Id: lppasswd.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpadmin man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lppasswd 1 "CUPS" "22 February 2008" "Apple Inc." +.SH NAME +lppasswd \- add, change, or delete digest passwords. +.SH SYNOPSIS +.B lppasswd +[ +.I username +] +.br +.B lppasswd +-a [ -g +.I groupname +] +.I username +.br +.B lppasswd +-x +.I username +.SH DESCRIPTION +\fIlppasswd\fR adds, changes, or deletes passwords in the CUPS +digest password file, \fIpasswd.md5\fR. When run by a normal +user, \fIlppasswd\fR will prompt for the old and new passwords. +When run by the super-user, \fIlppasswd\fR can add new accounts +(\fI-a username\fR), change existing accounts (\fIusername\fR), +or delete accounts (\fI-x username\fR) in the digest password +file. Digest usernames do not have to match local UNIX usernames. +.SH OPTIONS +\fIlppasswd\fR supports the following options: +.TP 5 +-g groupname +.br +Specifies a group other than the default system group. +.SH SECURITY ISSUES +By default, the \fIlppasswd\fR program is not installed to allow ordinary +users to change their passwords. To enable this, the \fIlppasswd\fR command +must be made setuid to root with the command: +.br +.nf +chmod u+s lppasswd +.fi +.PP +While every attempt has been made to make \fIlppasswd\fR secure against +exploits that could grant super-user privileges to unprivileged users, +paranoid system administrators may wish to use Basic authentication with +accounts managed by PAM instead. +.SH SEE ALSO +\fIlp(1)\fR, \fIlpr(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lppasswd.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpq.man b/man/lpq.man new file mode 100644 index 0000000..502d45a --- /dev/null +++ b/man/lpq.man @@ -0,0 +1,72 @@ +.\" +.\" "$Id: lpq.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpq man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpq 1 "CUPS" "16 June 2008" "Apple Inc." +.SH NAME +lpq \- show printer queue status +.SH SYNOPSIS +.B lpq +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -P +.I destination[/instance] +] [ -a ] [ -l ] [ +.I +interval +] +.SH DESCRIPTION +\fIlpq\fR shows the current print queue status on the named +printer. Jobs queued on the default destination will be shown if +no printer or class is specified on the command-line. +.LP +The \fI+interval\fR option allows you to continuously report the +jobs in the queue until the queue is empty; the list of jobs is +shown once every \fIinterval\fR seconds. +.SH OPTIONS +\fIlpq\fR supports the following options: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-P destination[/instance] +.br +Specifies an alternate printer or class name. +.TP 5 +-U username +.br +Specifies an alternate username. +.TP 5 +-a +.br +Reports jobs on all printers. +.TP 5 +-h server[:port] +.br +Specifies an alternate server. +.TP 5 +-l +.br +Requests a more verbose (long) reporting format. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpr(1)\fR, \fIlprm(1)\fR, +\fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpq.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpr.man b/man/lpr.man new file mode 100644 index 0000000..b60a265 --- /dev/null +++ b/man/lpr.man @@ -0,0 +1,122 @@ +.\" +.\" "$Id: lpr.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpr man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpr 1 "CUPS" "29 August 2008" "Apple Inc." +.SH NAME +lpr \- print files +.SH SYNOPSIS +.B lpr +[ -E ] [ -H +.I server[:port] +] [ -U +.I username +] [ -P +.I destination[/instance] +] [ -# +.I num-copies +[ -h ] [ -l ] [ -m ] [ -o +.I option[=value] +] [ -p] [ -q ] [ -r ] [ -C/J/T +.I title +] [ +.I file(s) +] +.SH DESCRIPTION +\fIlpr\fR submits files for printing. Files named on the command +line are sent to the named printer (or the default destination if no +destination is specified). If no files are listed on the command-line, +\fIlpr\fR reads the print file from the standard input. +.SH THE DEFAULT DESTINATION +CUPS provides many ways to set the default destination. The "LPDEST" and +"PRINTER" environment variables are consulted first. If neither are set, +the current default set using the \fIlpoptions(1)\fR command is used, +followed by the default set using the \fIlpadmin(8)\fR command. +.SH OPTIONS +The following options are recognized by \fIlpr\fR: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-H server[:port] +.br +Specifies an alternate server. +.TP 5 +-C "name" +.TP 5 +-J "name" +.TP 5 +-T "name" +.br +Sets the job name. +.TP 5 +-P destination[/instance] +.br +Prints files to the named printer. +.TP 5 +-U username +.br +Specifies an alternate username. +.TP 5 +-# \fIcopies\fR +.br +Sets the number of copies to print from 1 to 100. +.TP 5 +-h +.br +Disables banner printing. This option is equivalent to "-o +job-sheets=none". +.TP 5 +-l +.br +Specifies that the print file is already formatted for the +destination and should be sent without filtering. This option is +equivalent to "-o raw". +.TP 5 +-m +.br +Send an email on job completion. +.TP 5 +-o option[=value] +.br +Sets a job option. +.TP 5 +-p +.br +Specifies that the print file should be formatted with a shaded +header with the date, time, job name, and page number. This +option is equivalent to "-o prettyprint" and is only useful when +printing text files. +.TP 5 +-q +.br +Hold job for printing. +.TP 5 +-r +.br +Specifies that the named print files should be deleted after +printing them. +.SH COMPATIBILITY +The "c", "d", "f", "g", "i", "n", "t", "v", and "w" options +are not supported by CUPS and produce a warning message if used. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpadmin(8)\fR, \fIlpoptions(1)\fR, +\fIlpq(1)\fR, \fIlprm(1)\fR, \fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpr.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lprm.man b/man/lprm.man new file mode 100644 index 0000000..d64ac03 --- /dev/null +++ b/man/lprm.man @@ -0,0 +1,65 @@ +.\" +.\" "$Id: lprm.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lprm man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lprm 1 "CUPS" "28 August 2009" "Apple Inc." +.SH NAME +lprm \- cancel print jobs +.SH SYNOPSIS +.B lprm +[ -E ] [ -U +.I username +] [ -h +.I server[:port] +] [ -P +.I destination[/instance] +] [ - ] [ +.I job ID(s) +] +.SH DESCRIPTION +\fIlprm\fR cancels print jobs that have been queued for printing. +If no arguments are supplied, the current job on the default +destination is cancelled. You can specify one or more job ID +numbers to cancel those jobs or use the \fI-\fR option to cancel +all jobs. +.SH OPTIONS +The \fIlprm\fR command supports the following options: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-P destination[/instance] +.br +Specifies the destination printer or class. +.TP 5 +-U username +.br +Specifies an alternate username. +.TP 5 +-h server[:port] +.br +Specifies an alternate server. +.SH COMPATIBILITY +The CUPS version of \fIlprm\fR is compatible with the standard +Berkeley \fIlprm\fR command. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, \fIlpq(1)\fR, \fIlpr(1)\fR, +\fIlpstat(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lprm.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/lpstat.man b/man/lpstat.man new file mode 100644 index 0000000..c51c44a --- /dev/null +++ b/man/lpstat.man @@ -0,0 +1,143 @@ +.\" +.\" "$Id: lpstat.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" lpstat man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH lpstat 1 "CUPS" "10 September 2008" "Apple Inc." +.SH NAME +lpstat \- print cups status information +.SH SYNOPSIS +.B lpstat +[ -E ] [ -H ] [ -U +.I username +] [ -h +.I hostname[:port] +] [ -l ] [ -W +.I which-jobs +] [ -a [ +.I destination(s) +] ] [ -c [ +.I class(es) +] ] [ -d ] [ -o [ +.I destination(s) +] ] [ -p [ +.I printer(s) +] ] [ -r ] [ -R ] [ -s ] [ -t ] [ -u [ +.I user(s) +] ] [ -v [ +.I printer(s) +] ] +.SH DESCRIPTION +\fIlpstat\fR displays status information about the current +classes, jobs, and printers. When run with no arguments, +\fIlpstat\fR will list jobs queued by the current user. +.SH OPTIONS +The \fIlpstat\fR command supports the following options: +.TP 5 +-E +.br +Forces encryption when connecting to the server. +.TP 5 +-H +.br +Shows the server hostname and port. +.TP 5 +-R +.br +Shows the ranking of print jobs. +.TP 5 +-U username +.br +Specifies an alternate username. +.TP 5 +-W which-jobs +.br +Specifies which jobs to show, \fIcompleted\fR or +\fInot-completed\fR (the default). This option \fImust\fR appear +before the \fI-o\fR option and/or any printer names, otherwise +the default (not-completed) value will be used in the request to +the scheduler. +.TP 5 +-a [printer(s)] +.br +Shows the accepting state of printer queues. If no printers are +specified then all printers are listed. +.TP 5 +-c [class(es)] +.br +Shows the printer classes and the printers that belong to them. +If no classes are specified then all classes are listed. +.TP 5 +-d +.br +Shows the current default destination. +.TP 5 +-h server[:port] +.br +Specifies an alternate server. +.TP 5 +-l +.br +Shows a long listing of printers, classes, or jobs. +.TP 5 +-o [destination(s)] +.br +Shows the jobs queue on the specified destinations. If no destinations are +specified all jobs are shown. +.TP 5 +-p [printer(s)] +.br +Shows the printers and whether or not they are enabled for printing. If +no printers are specified then all printers are listed. +.TP 5 +-r +.br +Shows whether the CUPS server is running. +.TP 5 +-s +.br +Shows a status summary, including the default destination, a +list of classes and their member printers, and a list of printers and +their associated devices. This is equivalent to using the "-d", "-c", +and "-v" options. +.TP 5 +-t +.br +Shows all status information. This is equivalent to using the "-r", +"-d", "-c", "-v", "-a", "-p", and "-o" options. +.TP 5 +-u [user(s)] +.br +Shows a list of print jobs queued by the specified users. If no users +are specified, lists the jobs queued by the current user. +.TP 5 +-v [printer(s)] +.br +Shows the printers and what device they are attached to. If no printers +are specified then all printers are listed. +.SH COMPATIBILITY +Unlike the System V printing system, CUPS allows printer names to +contain any printable character except SPACE, TAB, "/", and "#". +Also, printer and class names are \fInot\fR case-sensitive. +.LP +The "-h", "-E", "-U", and "-W" options are unique to CUPS. +.LP +The Solaris "-f", "-P", and "-S" options are silently ignored. +.SH SEE ALSO +\fIcancel(1)\fR, \fIlp(1)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: lpstat.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/mailto.conf.man b/man/mailto.conf.man new file mode 100644 index 0000000..7f9e30d --- /dev/null +++ b/man/mailto.conf.man @@ -0,0 +1,60 @@ +.\" +.\" "$Id: mailto.conf.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" mailto.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH mailto.conf 5 "CUPS" "12 July 2006" "Apple Inc." +.SH NAME +mailto.conf \- configuration file for cups email notifier +.SH DESCRIPTION +The \fImailto.conf\fR file defines the local mail server and +email notification preferences for CUPS. +.LP +Each line in the file can be a configuration directive, a blank line, +or a comment. Comment lines start with the # character. +.SH DIRECTIVES +.TP 5 +Cc \fIcc-address@domain.com\fR +.br +Specifies an additional recipient for all email notifications. +.TP 5 +From \fIfrom-address@domain.com\fR +.br +Specifies the sender of email notifications. +.TP 5 +Sendmail \fIsendmail command and options\fR +.br +Specifies the sendmail command to use when sending email +notifications. Only one \fISendmail\fR or \fISMTPServer\fR line +may be present in the \fImailto.conf\fR file. If multiple lines +are present, only the last one is used. +.TP 5 +SMTPServer \fIservername\fR +.br +Specifies a SMTP server to send email notifications to. Only one +\fISendmail\fR or \fISMTPServer\fR line may be present in the +\fImailto.conf\fR file. If multiple lines are present, only the +last one is used. +.TP 5 +Subject \fIsubject-prefix\fR +.br +Specifies a prefix string for the subject line of an email notification. +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +\fImime.convs(5)\fR, \fImime.types(5)\fR, \fIprinters.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: mailto.conf.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/mantohtml.c b/man/mantohtml.c new file mode 100644 index 0000000..d9b0acb --- /dev/null +++ b/man/mantohtml.c @@ -0,0 +1,720 @@ +/* + * "$Id: mantohtml.c 9226 2010-08-06 12:15:50Z mike $" + * + * Man page to HTML conversion program. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2004-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Convert a man page to HTML. + * putc_entity() - Put a single character, using entities as needed. + * strmove() - Move characters within a string. + */ + +/* + * Include necessary headers. + */ + +#include +#include + + +/* + * Local functions... + */ + +static void putc_entity(int ch, FILE *fp); +static void strmove(char *d, const char *s); + + +/* + * 'main()' - Convert a man page to HTML. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *infile, /* Input file */ + *outfile; /* Output file */ + char line[1024], /* Line from file */ + *lineptr, /* Pointer into line */ + *endptr, /* Pointer to end of current */ + endchar, /* End character */ + *paren, /* Pointer to parenthesis */ + name[1024]; /* Man page name */ + int section, /* Man page section */ + pre, /* Preformatted */ + font, /* Current font */ + blist, /* In a bullet list? */ + list, /* In a list? */ + linenum; /* Current line number */ + const char *post; /* Text to add after the current line */ + static const char /* Start/end tags for fonts */ + * const start_fonts[] = { "", "", "" }, + * const end_fonts[] = { "", "", "" }; + + /* + * Check arguments... + */ + + if (argc > 3) + { + fputs("Usage: mantohtml [filename.man [filename.html]]\n", stderr); + return (1); + } + + /* + * Open files as needed... + */ + + if (argc > 1) + { + if ((infile = fopen(argv[1], "r")) == NULL) + { + perror(argv[1]); + return (1); + } + } + else + infile = stdin; + + if (argc > 2) + { + if ((outfile = fopen(argv[2], "w")) == NULL) + { + perror(argv[2]); + fclose(infile); + return (1); + } + } + else + outfile = stdout; + + /* + * Read from input and write the output... + */ + + fputs("\n" + "\n" + "\n" + "\n" + "\t\n", outfile); + + blist = 0; + font = 0; + list = 0; + linenum = 0; + pre = 0; + post = NULL; + section = -1; + + while (fgets(line, sizeof(line), infile)) + { + linenum ++; + + if (line[0] == '.') + { + /* + * Strip leading whitespace... + */ + + while (line[1] == ' ' || line[1] == '\t') + strmove(line + 1, line + 2); + + /* + * Process man page commands... + */ + + if (!strncmp(line, ".TH ", 4) && section < 0) + { + /* + * Grab man page title... + */ + + sscanf(line + 4, "%s%d", name, §ion); + + fprintf(outfile, + "\t%s(%d)\n" + "\n" + "\n" + "

%s(%d)

\n" + "%s", + name, section, name, section, start_fonts[font]); + } + else if (section < 0) + continue; + else if (!strncmp(line, ".SH ", 4) || !strncmp(line, ".SS ", 4)) + { + /* + * Grab heading... + */ + + int first = 1; + + fputs(end_fonts[font], outfile); + + if (blist) + { + fputs("\n\n", outfile); + blist = 0; + } + + if (list) + { + if (list == 1) + fputs("

Overview

\n", outfile); + else if (list) + fputs("\n", outfile); + + fputs("\n", outfile); + list = 0; + } + + line[strlen(line) - 1] = '\0'; /* Strip LF */ + + if (line[2] == 'H') + fputs("

", outfile); + + for (lineptr = line + 4; *lineptr; lineptr ++) + if (*lineptr == '\"') + continue; + else if (*lineptr == ' ') + { + putc_entity(' ', outfile); + + first = 1; + } + else + { + if (first) + putc_entity(*lineptr, outfile); + else + putc_entity(tolower(*lineptr), outfile); + + first = 0; + } + + if (line[2] == 'H') + fprintf(outfile, "

\n%s", start_fonts[font]); + else + fprintf(outfile, "\n%s", start_fonts[font]); + } + else if (!strncmp(line, ".LP", 3) || !strncmp(line, ".PP", 3)) + { + /* + * New paragraph... + */ + + fputs(end_fonts[font], outfile); + + if (blist) + { + fputs("\n\n", outfile); + blist = 0; + } + + if (list) + { + if (list == 1) + fputs("\n", outfile); + else if (list) + fputs("\n", outfile); + + fputs("\n", outfile); + list = 0; + } + + fputs("

", outfile); + font = 0; + } + else if (!strncmp(line, ".TP ", 4)) + { + /* + * Grab list... + */ + + fputs(end_fonts[font], outfile); + + if (blist) + { + fputs("\n\n", outfile); + blist = 0; + } + + if (!list) + fputs("

\n", outfile); + else if (list == 1) + fputs("\n", outfile); + else if (list) + fputs("\n", outfile); + + fputs("
", outfile); + list = 1; + font = 0; + } + else if (!strncmp(line, ".br", 3)) + { + /* + * Grab line break... + */ + + if (list == 1) + { + fputs("
\n
", outfile); + list = 2; + } + else if (list) + fputs("
\n
", outfile); + else + fputs("
\n", outfile); + } + else if (!strncmp(line, ".de ", 4)) + { + /* + * Define macro - ignore... + */ + + while (fgets(line, sizeof(line), infile)) + { + linenum ++; + + if (!strncmp(line, "..", 2)) + break; + } + } + else if (!strncmp(line, ".RS", 3)) + { + /* + * Indent... + */ + + fputs("
\n", outfile); + } + else if (!strncmp(line, ".RE", 3)) + { + /* + * Unindent... + */ + + fputs("
\n", outfile); + } + else if (!strncmp(line, ".ds ", 4) || !strncmp(line, ".rm ", 4) || + !strncmp(line, ".tr ", 4) || !strncmp(line, ".hy ", 4) || + !strncmp(line, ".IX ", 4) || !strncmp(line, ".PD", 3) || + !strncmp(line, ".Sp", 3)) + { + /* + * Ignore unused commands... + */ + } + else if (!strncmp(line, ".Vb", 3) || !strncmp(line, ".nf", 3)) + { + /* + * Start preformatted... + */ + + pre = 1; + fputs("
\n", outfile);
+      }
+      else if (!strncmp(line, ".Ve", 3) || !strncmp(line, ".fi", 3))
+      {
+       /*
+        * End preformatted...
+	*/
+
+        if (pre)
+	{
+          pre = 0;
+	  fputs("
\n", outfile); + } + } + else if (!strncmp(line, ".IP \\(bu", 8)) + { + /* + * Bullet list... + */ + + if (blist) + fputs("\n", outfile); + else + { + fputs("
    \n", outfile); + blist = 1; + } + + fputs("
  • ", outfile); + } + else if (!strncmp(line, ".IP ", 4)) + { + /* + * Indented paragraph... + */ + + if (blist) + { + fputs("
  • \n
\n", outfile); + blist = 0; + } + + fputs("

", outfile); + + for (lineptr = line + 4; isspace(*lineptr); lineptr ++); + + if (*lineptr == '\"') + { + strmove(line, lineptr + 1); + + if ((lineptr = strchr(line, '\"')) != NULL) + *lineptr = '\0'; + } + else + { + strmove(line, lineptr); + + if ((lineptr = strchr(line, ' ')) != NULL) + *lineptr = '\0'; + } + + /* + * Process the text as if it was in-line... + */ + + post = "\n
\n
"; + goto process_text; + } + else if (!strncmp(line, ".\\}", 3)) + { + /* + * Ignore close block... + */ + } + else if (!strncmp(line, ".ie", 3) || !strncmp(line, ".if", 3) || + !strncmp(line, ".el", 3)) + { + /* + * If/else - ignore... + */ + + if (strchr(line, '{') != NULL) + { + /* + * Skip whole block... + */ + + while (fgets(line, sizeof(line), infile)) + { + linenum ++; + + if (strchr(line, '}') != NULL) + break; + } + } + } +#if 0 + else if (!strncmp(line, ". ", 4)) + { + /* + * Grab ... + */ + } +#endif /* 0 */ + else if (!strncmp(line, ".B ", 3)) + { + /* + * Grab bold text... + */ + + fprintf(outfile, "%s%s%s", end_fonts[font], line + 3, + start_fonts[font]); + } + else if (!strncmp(line, ".I ", 3)) + { + /* + * Grab italic text... + */ + + fprintf(outfile, "%s%s%s", end_fonts[font], line + 3, + start_fonts[font]); + } + else if (strncmp(line, ".\\\"", 3)) + { + /* + * Unknown... + */ + + if ((lineptr = strchr(line, ' ')) != NULL) + *lineptr = '\0'; + else if ((lineptr = strchr(line, '\n')) != NULL) + *lineptr = '\0'; + + fprintf(stderr, "mantohtml: Unknown man page command \'%s\' on line %d!\n", + line, linenum); + } + + /* + * Skip continuation lines... + */ + + lineptr = line + strlen(line) - 2; + if (lineptr >= line && *lineptr == '\\') + { + while (fgets(line, sizeof(line), infile)) + { + linenum ++; + lineptr = line + strlen(line) - 2; + + if (lineptr < line || *lineptr != '\\') + break; + } + } + } + else + { + /* + * Process man page text... + */ + +process_text: + + for (lineptr = line; *lineptr; lineptr ++) + { + if (!strncmp(lineptr, "http://", 7)) + { + /* + * Embed URL... + */ + + for (endptr = lineptr + 7; + *endptr && !isspace(*endptr & 255); + endptr ++); + + endchar = *endptr; + *endptr = '\0'; + + fprintf(outfile, "%s", lineptr, lineptr); + *endptr = endchar; + lineptr = endptr - 1; + } + else if (!strncmp(lineptr, "\\fI", 3) && + (endptr = strstr(lineptr, "\\fR")) != NULL && + (paren = strchr(lineptr, '(')) != NULL && + paren < endptr) + { + /* + * Link to man page? + */ + + char manfile[1024], /* Man page filename */ + manurl[1024]; /* Man page URL */ + + + /* + * See if the man file is available locally... + */ + + lineptr += 3; + endchar = *paren; + *paren = '\0'; + + snprintf(manfile, sizeof(manfile), "%s.man", lineptr); + snprintf(manurl, sizeof(manurl), "man-%s.html?TOPIC=Man+Pages", + lineptr); + + *paren = endchar; + endchar = *endptr; + *endptr = '\0'; + + if (access(manfile, 0)) + { + /* + * Not a local man page, just do it italic... + */ + + fputs("", outfile); + while (*lineptr) + putc_entity(*lineptr++, outfile); + fputs("", outfile); + } + else + { + /* + * Local man page, do a link... + */ + + fprintf(outfile, "", manurl); + while (*lineptr) + putc_entity(*lineptr++, outfile); + fputs("", outfile); + } + + *endptr = endchar; + lineptr = endptr + 2; + } + else if (*lineptr == '\\') + { + lineptr ++; + if (!*lineptr) + break; + else if (isdigit(lineptr[0]) && isdigit(lineptr[1]) && + isdigit(lineptr[2])) + { + fprintf(outfile, "&#%d;", ((lineptr[0] - '0') * 8 + + lineptr[1] - '0') * 8 + + lineptr[2] - '0'); + lineptr += 2; + } + else if (*lineptr == '&') + continue; + else if (*lineptr == 's') + { + while (lineptr[1] == '-' || isdigit(lineptr[1])) + lineptr ++; + } + else if (*lineptr == '*') + { + lineptr += 2; + } + else if (*lineptr != 'f') + putc_entity(*lineptr, outfile); + else + { + lineptr ++; + if (!*lineptr) + break; + else + { + fputs(end_fonts[font], outfile); + + switch (*lineptr) + { + default : /* Regular */ + font = 0; + break; + case 'B' : /* Bold */ + case 'b' : + font = 1; + break; + case 'I' : /* Italic */ + case 'i' : + font = 2; + break; + } + + fputs(start_fonts[font], outfile); + } + } + } + else + putc_entity(*lineptr, outfile); + } + + if (post) + { + fputs(post, outfile); + post = NULL; + } + + if (list == 1) + { + fputs("\n

", outfile); + list = 2; + } + } + } + + fprintf(outfile, "%s\n", end_fonts[font]); + + if (blist) + { + fputs("\n\n", outfile); + } + + if (list) + { + if (list == 1) + fputs("\n", outfile); + else if (list) + fputs("
\n", outfile); + + fputs("
\n", outfile); + } + + fputs("\n" + "\n", outfile); + + /* + * Close files... + */ + + if (infile != stdin) + fclose(infile); + + if (outfile != stdout) + fclose(outfile); + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'putc_entity()' - Put a single character, using entities as needed. + */ + +static void +putc_entity(int ch, /* I - Character */ + FILE *fp) /* I - File */ +{ + if (ch == '&') + fputs("&", fp); + else if (ch == '<') + fputs("<", fp); + else + putc(ch, fp); +} + + +/* + * 'strmove()' - Move characters within a string. + */ + +static void +strmove(char *d, /* I - Destination */ + const char *s) /* I - Source */ +{ + while (*s) + *d++ = *s++; + + *d = '\0'; +} + + +/* + * End of "$Id: mantohtml.c 9226 2010-08-06 12:15:50Z mike $". + */ diff --git a/man/mime.convs.man b/man/mime.convs.man new file mode 100644 index 0000000..d55cad4 --- /dev/null +++ b/man/mime.convs.man @@ -0,0 +1,46 @@ +.\" +.\" "$Id: mime.convs.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" mime.convs man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH mime.convs 5 "CUPS" "20 March 2006" "Apple Inc." +.SH NAME +mime.convs \- mime type conversion file for cups +.SH DESCRIPTION +The \fImime.convs\fR file defines the filters that are available +for converting files from one format to another. The standard +filters support text, PDF, PostScript, HP-GL/2, and many types of +image files. +.LP +Additional filters can be added to the \fImime.convs\fR file or +(preferably) to other files in the CUPS configuration directory. +.LP +Each line in the \fImime.convs\fR file is a comment, blank, or filter +line. Comment lines start with the # character. Filter lines specify +the source and destination MIME types along with a relative cost +associated with the filter and the filter to run: +.br +.nf + +super/type super/type cost filter +application/postscript application/vnd.cups-raster 50 pstoraster +.fi +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +\fImime.types(5)\fR, \fIprinters.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: mime.convs.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/mime.types.man b/man/mime.types.man new file mode 100644 index 0000000..9c69566 --- /dev/null +++ b/man/mime.types.man @@ -0,0 +1,115 @@ +.\" +.\" "$Id: mime.types.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" mime.types man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH mime.types 5 "CUPS" "16 May 2009" "Apple Inc." +.SH NAME +mime.types \- mime type description file for cups +.SH DESCRIPTION +The \fImime.types\fR file defines the recognized file types. +.LP +Additional file types can be added to \fImime.types\fR or +(preferably) in additional files in the CUPS configuration +directory with the extension ".types". +.LP +Each line in the \fImime.types\fR file is a comment, blank, or +rule line. Comment lines start with the # character. Rule lines +start with the MIME type name and are optionally followed by a +series of file recognition rules that are used to automatically +identify print and web files: +.br +.nf + + super/type rule [ ... ruleN] +.fi +MIME type names are case-insensitive and are sorted in ascending alphanumeric +order for the purposes of matching. See the "TYPE MATCHING AND PRIORITY" +section for more information. +.LP +The rules may be grouped using parenthesis, joined using "+" for a +logical AND and "," or whitespace for a logical OR, and negated using +"!". +.SH RULES +Rules take two forms - a filename extension by itself and functions with test +values inside parenthesis. The following functions are available: +.TP 5 +match("pattern") +.br +Pattern match on filename +.TP 5 +ascii(offset,length) +.br +True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126) +.TP 5 +printable(offset,length) +.br +True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254) +.TP 5 +priority(number) +.br +Specifies the relative priority of this MIME type. The default priority is 100. +Larger values have higher priority while smaller values have lower priority. +.TP 5 +string(offset,"string") +.br +True if bytes are identical to string +.TP 5 +istring(offset,"string") +.br +True if a case-insensitive comparison of the bytes is identical +.TP 5 +char(offset,value) +.br +True if byte is identical +.TP 5 +short(offset,value) +.br +True if 16-bit integer is identical +.TP 5 +int(offset,value) +.br +True if 32-bit integer is identical +.TP 5 +locale("string") +.br +True if current locale matches string +.TP 5 +contains(offset,range,"string") +.br +True if the range contains the string +.SH STRING CONSTANTS +String constants can be specified inside quotes ("") for strings +containing whitespace and angle brackets (<>) for hexadecimal +strings. +.SH TYPE MATCHING AND PRIORITY +When CUPS needs to determine the MIME type of a given file, it checks every +MIME type defined in the .types files. When two types have the same matching +rules, the type chosen will depend on the type name and priority, with higher- +priority types being used over lower-priority ones. If the types have the same +priority, the type names are sorted alphanumerically in ascending order and the +first type is chosen. +.LP +For example, if two types "text/bar" and "text/foo" are defined as matching the +extension "doc", normally the type "text/bar" will be chosen since its name is +alphanumerically smaller than "text/foo". However, if "text/foo" also defines a +higher priority than "text/bar", "text/foo" will be chosen instead. +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +\fImime.convs(5)\fR, \fIprinters.conf(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: mime.types.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/notifier.man b/man/notifier.man new file mode 100644 index 0000000..498dfd5 --- /dev/null +++ b/man/notifier.man @@ -0,0 +1,157 @@ +.\" +.\" "$Id: notifier.man 8999 2010-02-24 01:01:04Z mike $" +.\" +.\" notifier man page for CUPS. +.\" +.\" Copyright 2007-2009 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH notifier 7 "CUPS" "12 May 2009" "Apple Inc." +.SH NAME +notifier \- cups notification interface +.SH SYNOPSIS +.B notifier +.I recipient +[ +.I user-data +] +.SH DESCRIPTION +The CUPS notifier interface provides a standard method for adding support for +new event notification methods to CUPS. Each notifier delivers one or more IPP +events from the standard input to the specified recipient. +.LP +Notifiers \fBmust\fR read IPP messages from the standard input using the +ippNew and ippReadFile functions and exit on error. Notifiers are encouraged to +exit after a suitable period of inactivity, however they may exit after reading +the first message or stay running until an error is seen. +.SH LOG MESSAGES +Messages sent to stderr are generally logged to the current \fIErrorLog\fR. +Each line begins with a standard prefix: + +.TP 5 +ALERT: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "alert" log level. + +.TP 5 +CRIT: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "critical" log level. + +.TP 5 +DEBUG: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "debug" log level. + +.TP 5 +DEBUG2: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "debug2" log level. + +.TP 5 +EMERG: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "emergency" log level. + +.TP 5 +ERROR: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "error" log level. + +.TP 5 +INFO: message +.br +Sets the printer-state-message attribute. If the current \fILogLevel\fR +is set to "debug2", also adds the specified message to the +current \fIErrorLog\fR using the "info" log level. + +.TP 5 +NOTICE: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "notice" log level. + +.TP 5 +WARNING: message +.br +Sets the printer-state-message attribute and adds the specified +message to the current \fIErrorLog\fR using the "warning" log level. + +.SH ENVIRONMENT VARIABLES +The following environment variables are defined by the CUPS server when +executing the notifier: + +.TP 5 +CHARSET +.br +The default text character set, typically utf-8. + +.TP 5 +CUPS_CACHEDIR +.br +The directory for semi-persistent cache files can be found. + +.TP 5 +CUPS_DATADIR +.br +The directory where data files can be found. + +.TP 5 +CUPS_FILETYPE +.br +The type of file being printed: "job-sheet" for a banner page and "document" +for a regular print file. + +.TP 5 +CUPS_SERVERROOT +.br +The root directory of the server. + +.TP 5 +LANG +.br +The default language locale (typically C or en). + +.TP 5 +PATH +.br +The standard execution path for external programs that may be run by +the filter. + +.TP 5 +SOFTWARE +.br +The name and version number of the server (typically CUPS/1.2). + +.TP 5 +TZ +.br +The timezone of the server. + +.TP 5 +USER +.br +The user executing the filter, typically "lp"; consult the \fIcupsd.conf(5)\fR +file for the current setting. + +.SH SEE ALSO +\fIbackend(7)\fR, \fIcupsd(8)\fR, \fIfilter(7)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2009 by Apple Inc. +.\" +.\" End of "$Id: notifier.man 8999 2010-02-24 01:01:04Z mike $". +.\" diff --git a/man/po4a/cups.cfg b/man/po4a/cups.cfg new file mode 100644 index 0000000..fff7d3f --- /dev/null +++ b/man/po4a/cups.cfg @@ -0,0 +1,40 @@ +[po4a_langs] fr de +[po4a_paths] po4a/po/cups.pot $lang:po4a/po/$lang.po + +[type: man] cupsaccept.man $lang:$lang/cupsaccept.man +[type: man] backend.man $lang:$lang/backend.man +[type: man] cancel.man $lang:$lang/cancel.man +[type: man] classes.conf.man $lang:$lang/classes.conf.man +[type: man] client.conf.man.in $lang:$lang/client.conf.man.in +[type: man] cupsaddsmb.man.in $lang:$lang/cupsaddsmb.man.in +[type: man] cups-config.man $lang:$lang/cups-config.man +[type: man] cupsctl.man $lang:$lang/cupsctl.man +[type: man] cupsd.conf.man.in $lang:$lang/cupsd.conf.man.in +[type: man] cups-deviced.man.in $lang:$lang/cups-deviced.man.in +[type: man] cupsd.man.in $lang:$lang/cupsd.man.in +[type: man] cups-driverd.man.in $lang:$lang/cups-driverd.man.in +[type: man] cupsenable.man $lang:$lang/cupsenable.man +[type: man] cupsfilter.man $lang:$lang/cupsfilter.man +[type: man] cups-lpd.man.in $lang:$lang/cups-lpd.man.in +[type: man] cups-polld.man $lang:$lang/cups-polld.man +[type: man] cups-snmp.conf.man $lang:$lang/cups-snmp.conf.man +[type: man] cupstestdsc.man $lang:$lang/cupstestdsc.man +[type: man] cupstestppd.man $lang:$lang/cupstestppd.man +[type: man] filter.man $lang:$lang/filter.man +[type: man] lpadmin.man $lang:$lang/lpadmin.man +[type: man] lpc.man $lang:$lang/lpc.man +[type: man] lpinfo.man $lang:$lang/lpinfo.man +[type: man] lp.man $lang:$lang/lp.man +[type: man] lpmove.man $lang:$lang/lpmove.man +[type: man] lpoptions.man.in $lang:$lang/lpoptions.man.in +[type: man] lppasswd.man $lang:$lang/lppasswd.man +[type: man] lpq.man $lang:$lang/lpq.man +[type: man] lpr.man $lang:$lang/lpr.man +[type: man] lprm.man $lang:$lang/lprm.man +[type: man] lpstat.man $lang:$lang/lpstat.man +[type: man] mailto.conf.man $lang:$lang/mailto.conf.man +[type: man] mime.convs.man $lang:$lang/mime.convs.man +[type: man] mime.types.man $lang:$lang/mime.types.man +[type: man] printers.conf.man $lang:$lang/printers.conf.man +[type: man] subscriptions.conf.man $lang:$lang/subscriptions.conf.man + diff --git a/man/po4a/po/de.po b/man/po4a/po/de.po new file mode 100644 index 0000000..88bb984 --- /dev/null +++ b/man/po4a/po/de.po @@ -0,0 +1,10478 @@ +# Translation of cups man pages to German +# Copyright (C) Helge Kreutzmann , 2008-2011 +# Chris Leick , 2009. +# This file is distributed under the same license as the cups package. +# +msgid "" +msgstr "" +"Project-Id-Version: cups man pages 1.4.2-3\n" +"POT-Creation-Date: 2011-06-11 17:41+0000\n" +"PO-Revision-Date: 2011-06-12 13:35+0200\n" +"Last-Translator: Helge Kreutzmann \n" +"Language-Team: de \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +# type: TH +#. type: TH +#: cupsaccept.man:15 +#, no-wrap +msgid "cupsaccept" +msgstr "cupsaccept" + +#. type: TH +#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 +#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 +#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 +#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 +#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 +#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 +#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 +#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 +#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 +#: subscriptions.conf.man:15 +#, no-wrap +msgid "CUPS" +msgstr "CUPS" + +# type: TH +#. type: TH +#: cupsaccept.man:15 cups-polld.man:15 lpmove.man:15 +#, no-wrap +msgid "12 February 2006" +msgstr "12. Februar 2006" + +# type: TH +#. type: TH +#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 +#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 +#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 +#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 +#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 +#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 +#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 +#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 +#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 +#: subscriptions.conf.man:15 +#, no-wrap +msgid "Apple Inc." +msgstr "Apple Inc." + +# type: SH +#. type: SH +#: cupsaccept.man:16 backend.man:17 cancel.man:16 classes.conf.man:16 +#: client.conf.man.in:16 cupsaddsmb.man.in:16 cups-config.man:16 +#: cupsctl.man:16 cupsd.conf.man.in:16 cups-deviced.man.in:16 cupsd.man.in:16 +#: cups-driverd.man.in:16 cupsenable.man:17 cupsfilter.man:15 +#: cups-lpd.man.in:16 cups-polld.man:16 cups-snmp.conf.man:16 +#: cupstestdsc.man:16 cupstestppd.man:16 filter.man:16 lpadmin.man:16 +#: lpc.man:16 lpinfo.man:16 lp.man:16 lpmove.man:16 lpoptions.man.in:16 +#: lppasswd.man:16 lpq.man:16 lpr.man:16 lprm.man:16 lpstat.man:16 +#: mailto.conf.man:16 mime.convs.man:16 mime.types.man:16 printers.conf.man:16 +#: subscriptions.conf.man:16 +#, no-wrap +msgid "NAME" +msgstr "NAME" + +#. type: Plain text +#: cupsaccept.man:18 +msgid "cupsaccept/cupsreject - accept/reject jobs sent to a destination" +msgstr "" +"cupsaccept/cupsreject - Druckaufträge für ein Ziel akzeptieren/ablehnen" + +# type: SH +#. type: SH +#: cupsaccept.man:18 backend.man:20 cancel.man:18 cupsaddsmb.man.in:19 +#: cups-config.man:18 cupsctl.man:18 cups-deviced.man.in:18 cupsd.man.in:18 +#: cups-driverd.man.in:18 cupsenable.man:19 cupsfilter.man:17 +#: cups-lpd.man.in:18 cups-polld.man:18 cupstestdsc.man:18 cupstestppd.man:18 +#: filter.man:18 lpadmin.man:18 lpc.man:18 lpinfo.man:18 lp.man:18 +#: lpmove.man:18 lpoptions.man.in:18 lppasswd.man:18 lpq.man:18 lpr.man:18 +#: lprm.man:18 lpstat.man:18 +#, no-wrap +msgid "SYNOPSIS" +msgstr "SYNOPSIS" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:25 +msgid "" +"B [ -E ] [ -U I ] [ -h I ] destination" +"(s)" +msgstr "" +"B [ -E ] [ -U I ] [ -h I ] Ziel(e)" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:34 +msgid "" +"B [ -E ] [ -U I ] [ -h I ] [ -r " +"I ] destination(s)" +msgstr "" +"B [ -E ] [ -U I ] [ -h I ] [ -r " +"I ] Ziel(e)" + +# type: SH +#. type: SH +#: cupsaccept.man:34 backend.man:28 cancel.man:33 classes.conf.man:18 +#: client.conf.man.in:18 cupsaddsmb.man.in:38 cups-config.man:53 +#: cupsctl.man:29 cupsd.conf.man.in:18 cups-deviced.man.in:21 cupsd.man.in:23 +#: cups-driverd.man.in:26 cupsenable.man:35 cupsfilter.man:35 +#: cups-lpd.man.in:25 cups-polld.man:21 cups-snmp.conf.man:18 +#: cupstestdsc.man:26 cupstestppd.man:34 filter.man:23 lpadmin.man:42 +#: lpc.man:25 lpinfo.man:50 lp.man:62 lpmove.man:34 lpoptions.man.in:62 +#: lppasswd.man:33 lpq.man:29 lpr.man:35 lprm.man:29 lpstat.man:39 +#: mailto.conf.man:18 mime.convs.man:18 mime.types.man:18 printers.conf.man:18 +#: subscriptions.conf.man:18 +#, no-wrap +msgid "DESCRIPTION" +msgstr "BESCHREIBUNG" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:37 +msgid "" +"I instructs the printing system to accept print jobs to the " +"specified destinations." +msgstr "" +"I weist das Drucksystem an, Druckaufträge für die angegebenen " +"Ziele zu akzeptieren." + +#. type: Plain text +#: cupsaccept.man:41 +msgid "" +"I instructs the printing system to reject print jobs to the " +"specified destinations. The I<-r> option sets the reason for rejecting print " +"jobs. If not specified the reason defaults to \"Reason Unknown\"." +msgstr "" +"I weist das Drucksystem an, Druckaufträge für die angegebenen " +"Ziele abzuweisen. Die Option I<-r> setzt den Grund für das Abweisen der " +"Druckaufträge. Falls nicht angegeben, wird der Grund auf »Reason Unknown« " +"gesetzt." + +# type: SH +#. type: SH +#: cupsaccept.man:41 cancel.man:36 cupsaddsmb.man.in:45 cups-config.man:58 +#: cupsctl.man:33 cupsd.man.in:28 cupsfilter.man:39 cups-lpd.man.in:62 +#: cupstestppd.man:44 filter.man:37 lpinfo.man:55 lp.man:70 lpmove.man:44 +#: lppasswd.man:41 lpq.man:37 lpr.man:45 lprm.man:35 lpstat.man:43 +#, no-wrap +msgid "OPTIONS" +msgstr "OPTIONEN" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:44 +msgid "" +"The following options are supported by both I and I:" +msgstr "" +"Die folgenden Optionen werden von I und I erkannt:" + +# type: TP +#. type: TP +#: cupsaccept.man:44 cancel.man:38 cupsctl.man:35 cupsenable.man:40 +#: lpadmin.man:173 lpinfo.man:57 lp.man:77 lpmove.man:46 lpoptions.man.in:66 +#: lpq.man:39 lpr.man:47 lprm.man:37 lpstat.man:45 +#, no-wrap +msgid "-E" +msgstr "-E" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:48 cancel.man:42 lpinfo.man:61 lp.man:81 lpmove.man:50 +#: lpq.man:43 lpr.man:51 lprm.man:41 lpstat.man:49 +msgid "Forces encryption when connecting to the server." +msgstr "Erzwingt Verschlüsselung bei Verbindungen zum Server." + +# type: TP +#. type: TP +#: cupsaccept.man:48 cancel.man:42 cupsenable.man:44 lpinfo.man:61 lp.man:81 +#: lpmove.man:50 lpoptions.man.in:70 lpq.man:47 lpr.man:67 lprm.man:45 +#: lpstat.man:57 +#, no-wrap +msgid "-U username" +msgstr "-U Benutzername" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:52 +msgid "Sets the username that is sent when connecting to the server." +msgstr "" +"Setzt den Benutzernamen, der bei Verbindungen zum Server gesandt werden wird." + +# type: TP +#. type: TP +#: cupsaccept.man:52 cancel.man:51 cups-lpd.man.in:63 lp.man:97 +#, no-wrap +msgid "-h hostname[:port]" +msgstr "-h Hostname[:Port]" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:56 cancel.man:55 lp.man:101 +msgid "Chooses an alternate server." +msgstr "Wählt einen alternativen Server." + +# type: TP +#. type: TP +#: cupsaccept.man:56 cupsenable.man:61 +#, no-wrap +msgid "-r \"reason\"" +msgstr "-r \"Grund\"" + +#. type: Plain text +#: cupsaccept.man:61 +msgid "" +"Sets the reason string that is shown for a printer that is rejecting jobs." +msgstr "" +"Setzt die Begründungszeichenkette, die für einen Drucker angezeigt wird, der " +"Druckaufträge abweist." + +# type: SH +#. type: SH +#: cupsaccept.man:61 cancel.man:59 cupsd.man.in:57 cupsenable.man:71 +#: cups-lpd.man.in:104 filter.man:243 lpadmin.man:188 lpc.man:59 +#: lpinfo.man:105 lp.man:245 lpoptions.man.in:119 lpr.man:110 lprm.man:53 +#: lpstat.man:127 +#, no-wrap +msgid "COMPATIBILITY" +msgstr "KOMPATIBILITÄT" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:65 cancel.man:63 cupsenable.man:75 lp.man:249 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " +"and class names are I case-sensitive." +msgstr "" +"Anders als das System V-Drucksystem erlaubt es CUPS, dass Druckernamen alle " +"druckbaren Zeichen außer Leertaste, Tabulator, »/« und »#« enthalten. Auch " +"sind Drucker- und Klassennamen I von der Groß-/Kleinschreibung." + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:70 +msgid "" +"The CUPS versions of I and I may ask the user for an access " +"password depending on the printing system configuration. This differs from " +"the System V versions which require the root user to execute these commands." +msgstr "" +"Die CUPS-Versionen von I und I könnten den Benutzer, " +"abhängig von der Konfiguration des Drucksystems, nach einem Zugriffspasswort " +"fragen. Dies unterscheidet sich von der System-V-Version, die verlangt, dass " +"der Benutzer root diese Befehle ausführt." + +# type: SH +#. type: SH +#: cupsaccept.man:70 backend.man:174 cancel.man:67 classes.conf.man:101 +#: client.conf.man.in:43 cupsaddsmb.man.in:204 cups-config.man:111 +#: cupsctl.man:97 cupsd.conf.man.in:704 cups-deviced.man.in:36 cupsd.man.in:61 +#: cups-driverd.man.in:97 cupsenable.man:84 cupsfilter.man:78 +#: cups-lpd.man.in:115 cups-polld.man:30 cups-snmp.conf.man:67 +#: cupstestdsc.man:41 cupstestppd.man:155 filter.man:248 lpadmin.man:199 +#: lpc.man:62 lpinfo.man:107 lp.man:254 lpmove.man:58 lpoptions.man.in:127 +#: lppasswd.man:60 lpq.man:63 lpr.man:113 lprm.man:56 lpstat.man:135 +#: mailto.conf.man:51 mime.convs.man:37 mime.types.man:106 +#: printers.conf.man:115 subscriptions.conf.man:80 +#, no-wrap +msgid "SEE ALSO" +msgstr "SIEHE AUCH" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:73 +msgid "I, I, I, I, I," +msgstr "I, I, I, I, I," + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:75 backend.man:178 cancel.man:71 classes.conf.man:106 +#: client.conf.man.in:45 cups-config.man:113 cupsctl.man:101 +#: cupsd.conf.man.in:710 cups-deviced.man.in:40 cupsd.man.in:68 +#: cups-driverd.man.in:101 cupsenable.man:89 cupsfilter.man:82 +#: cups-lpd.man.in:120 cups-polld.man:34 cups-snmp.conf.man:69 +#: cupstestdsc.man:43 cupstestppd.man:159 filter.man:252 lpadmin.man:204 +#: lpc.man:67 lpinfo.man:111 lp.man:259 lpmove.man:62 lpoptions.man.in:131 +#: lppasswd.man:64 lpq.man:68 lpr.man:118 lprm.man:61 lpstat.man:139 +#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:111 +#: printers.conf.man:120 subscriptions.conf.man:85 +msgid "http://localhost:631/help" +msgstr "http://localhost:631/help" + +# type: SH +#. type: SH +#: cupsaccept.man:75 backend.man:179 cancel.man:71 classes.conf.man:106 +#: client.conf.man.in:45 cupsaddsmb.man.in:210 cups-config.man:113 +#: cupsctl.man:101 cupsd.conf.man.in:710 cups-deviced.man.in:40 +#: cupsd.man.in:68 cups-driverd.man.in:101 cupsenable.man:89 cupsfilter.man:82 +#: cups-lpd.man.in:120 cups-polld.man:34 cups-snmp.conf.man:69 +#: cupstestdsc.man:46 cupstestppd.man:161 filter.man:252 lpadmin.man:204 +#: lpc.man:67 lpinfo.man:111 lp.man:259 lpmove.man:62 lpoptions.man.in:131 +#: lppasswd.man:64 lpq.man:68 lpr.man:118 lprm.man:61 lpstat.man:139 +#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:111 +#: printers.conf.man:120 subscriptions.conf.man:85 +#, no-wrap +msgid "COPYRIGHT" +msgstr "COPYRIGHT" + +# type: Plain text +#. type: Plain text +#: cupsaccept.man:76 backend.man:180 cancel.man:72 classes.conf.man:107 +#: client.conf.man.in:46 cupsaddsmb.man.in:211 cups-config.man:114 +#: cupsctl.man:102 cupsd.conf.man.in:711 cups-deviced.man.in:41 +#: cupsd.man.in:69 cups-driverd.man.in:102 cupsenable.man:91 cupsfilter.man:83 +#: cups-lpd.man.in:121 cups-polld.man:35 cups-snmp.conf.man:70 +#: cupstestdsc.man:47 cupstestppd.man:162 filter.man:253 lpc.man:68 +#: lpinfo.man:112 lpmove.man:63 lpoptions.man.in:132 lppasswd.man:65 +#: lpq.man:69 lpr.man:119 lprm.man:62 lpstat.man:140 mailto.conf.man:57 +#: mime.convs.man:43 mime.types.man:112 printers.conf.man:121 +#: subscriptions.conf.man:86 +msgid "Copyright 2007-2009 by Apple Inc." +msgstr "Copyright 2007-2009 by Apple Inc." + +# type: TH +#. type: TH +#: backend.man:15 +#, no-wrap +msgid "backend" +msgstr "Backend" + +# type: TH +#. type: TH +#: backend.man:15 +#, no-wrap +msgid "12 May 2009" +msgstr "12. Mai 2009" + +# type: Plain text +#. type: Plain text +#: backend.man:19 +msgid "backend - cups backend transmission interfaces" +msgstr "backend - CUPS Backend-Übertragungsschnittstellen" + +# type: Plain text +#. type: Plain text +#: backend.man:22 +msgid "B" +msgstr "B" + +# type: Plain text +#. type: Plain text +#: backend.man:27 +msgid "B job user title num-copies options [ I ]" +msgstr "" +"B Auftrag Benutzer Titel Anzahl-Kopien Optionen [ I ]" + +# type: Plain text +#. type: Plain text +#: backend.man:31 +msgid "" +"Backends are a special type of I which is used to send print data " +"to and discover different devices on the system." +msgstr "" +"Backends sind eine besondere Art von I, die verwendet werden, um " +"Daten zu verschiedenen Geräten auf dem System zu senden und entsprechende " +"Geräte zu ermitteln." + +# type: Plain text +#. type: Plain text +#: backend.man:37 +msgid "" +"Like filters, backends must be capable of reading from a filename on the " +"command-line or from the standard input, copying the standard input to a " +"temporary file as required by the physical interface." +msgstr "" +"Wie Filter müssen Backends in der Lage sein, aus Dateinamen auf der " +"Befehlszeile oder von der Standardeingabe zu lesen, die Standardeingabe in " +"eine temporäre Datei zu kopieren, wie dies von der physischen Schnittstelle " +"gefordert wird." + +# type: Plain text +#. type: Plain text +#: backend.man:44 +msgid "" +"The command name (argv[0]) is set to the device URI of the destination " +"printer. Starting with CUPS 1.1.22, any authentication information in argv" +"[0] is removed, so backend developers are urged to use the DEVICE_URI " +"environment variable whenever authentication information is required. The " +"CUPS API includes a I function for retrieving the " +"correct device URI." +msgstr "" +"Der Befehlsname (argv[0]) wird auf die Geräte-URI des Zieldruckers gesetzt. " +"Beginnend mit CUPS 1.1.22 wird jede Authentifizierungsinformation aus argv" +"[0] entfernt, daher wird Backend-Entwicklern empfohlen, die " +"Umgebungsvariable DEVICE_URI zu verwenden, wennimmer " +"Authentifizierungsinformationen benötigt werden. Das CUPS-API enthält eine " +"Funktion I zum Ermitteln der korrekten Geräte-URI." + +# type: Plain text +#. type: Plain text +#: backend.man:49 +msgid "" +"Back-channel data from the device should be relayed to the job filters by " +"writing to file descriptor 3. The CUPS API includes the " +"I function for this purpose." +msgstr "" +"Rückgeleitete Daten vom Gerät sollten an die Filter für die Aufträge " +"weitergeleitet werden, indem auf Dateideskriptor 3 geschrieben wird. Das " +"CUPS-API enthält für diesen Zweck die Funktion I." + +# type: SH +#. type: SH +#: backend.man:50 +#, no-wrap +msgid "DEVICE DISCOVERY" +msgstr "GERÄTE-ERMITTLUNG" + +# type: Plain text +#. type: Plain text +#: backend.man:55 +msgid "" +"When run with no arguments, the backend should list the devices and schemes " +"it supports or is advertising to stdout. The output consists of zero or more " +"lines consisting of any of the following forms:" +msgstr "" +"Beim Aufruf ohne Argumente sollte das Backend die Geräte und unterstützten " +"oder beworbenen Schemata auf Stdout aufführen. Die Ausgabe besteht aus null " +"oder mehr Zeilen, die in einer der folgenden Formen vorliegen:" + +# type: Plain text +#. type: Plain text +#: backend.man:61 +#, no-wrap +msgid "" +" device-class scheme \"Unknown\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\" \"device-location\"\n" +msgstr "" +" device-class scheme \"Unknown\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\" \"device-location\"\n" + +# type: Plain text +#. type: Plain text +#: backend.man:65 +msgid "The I field is one of the following values:" +msgstr "Das Feld I enthält einen der folgenden Werte:" + +# type: TP +#. type: TP +#: backend.man:66 +#, no-wrap +msgid "direct" +msgstr "direct" + +# type: Plain text +#. type: Plain text +#: backend.man:71 +msgid "" +"The device-uri refers to a specific direct-access device with no options, " +"such as a parallel, USB, or SCSI device." +msgstr "" +"Die Geräte-URI bezieht sich auf spezielle Geräte mit direktem Zugriff ohne " +"Optionen, wie z.B. parallele, USB- oder SCSI-Geräte." + +# type: TP +#. type: TP +#: backend.man:72 +#, no-wrap +msgid "file" +msgstr "file" + +# type: Plain text +#. type: Plain text +#: backend.man:76 +msgid "The device-uri refers to a file on disk." +msgstr "Die Geräte-URI bezieht sich auf eine Datei auf dem Speichermedium." + +# type: TP +#. type: TP +#: backend.man:77 +#, no-wrap +msgid "network" +msgstr "network" + +# type: Plain text +#. type: Plain text +#: backend.man:82 +msgid "" +"The device-uri refers to a networked device and conforms to the general form " +"for network URIs." +msgstr "" +"Die Geräte-URI bezieht sich auf ein vernetztes Gerät und folgt der " +"allgemeinen Form für vernetzte URIs." + +# type: TP +#. type: TP +#: backend.man:83 +#, no-wrap +msgid "serial" +msgstr "serial" + +# type: Plain text +#. type: Plain text +#: backend.man:89 +msgid "" +"The device-uri refers to a serial device with configurable baud rate and " +"other options. If the device-uri contains a baud value, it represents the " +"maximum baud rate supported by the device." +msgstr "" +"Die Geräte-URI bezieht sich auf ein serielles Gerät mit einer " +"konfigurierbaren Baudrate und anderen Optionen. Falls die Geräte-URI einen " +"Baud-Wert enthält, repräsentiert er die maximale vom Gerät unterstützte " +"Baudrate." + +# type: Plain text +#. type: Plain text +#: backend.man:96 +msgid "" +"The I field provides the URI scheme that is supported by the " +"backend. Backends should use this form only when the backend supports any " +"URI using that scheme. The I field specifies the full URI to use " +"when communicating with the device." +msgstr "" +"Das Feld I stellt das vom Backend unterstützte URI-Schemata bereit. " +"Backends sollten diese Form nur verwenden, wenn das Backend jede dem " +"Schemata folgende URI unterstützt. Das Feld I spezifiziert die " +"komplette URI, die bei der Kommunikation mit dem Gerät verwandt werden soll." + +# type: Plain text +#. type: Plain text +#: backend.man:101 +msgid "" +"The I field specifies the make and model of the " +"device, e.g. \"Acme Foojet 2000\". If the make and model is not known, you " +"must report \"Unknown\"." +msgstr "" +"Das Feld I spezifiziert die Marke und das Modell des " +"Gerätes, z.B. »Acme Foojet 2000«. Falls die Marke und das Modell nicht " +"bekannt ist, müssen Sie »Unknown« melden." + +# type: Plain text +#. type: Plain text +#: backend.man:107 +msgid "" +"The I field specifies additional information about the device. " +"Typically this includes the make and model along with the port number or " +"network address, e.g. \"Acme Foojet 2000 USB #1\"." +msgstr "" +"Das Feld I spezifiziert zusätzliche Informationen über das " +"Gerät. Typischerweise enthält es die Marke und das Modell zusammen mit der " +"Port-Nummer oder der Netz-Adresse, z.B. »Acme Foojet 2000 USB #1«." + +# type: Plain text +#. type: Plain text +#: backend.man:112 +msgid "" +"The optional I field specifies the IEEE-1284 device ID string for " +"the device, which is used to select a matching driver." +msgstr "" +"Das optionale Feld I spezifiziert die IEEE-1284-Geräte-ID-" +"Zeichenkette für das Gerät, die zur Auswahl des passenden Treibers verwandt " +"wird." + +# type: Plain text +#. type: Plain text +#: backend.man:117 +msgid "" +"The optional I field specifies the physical location of the " +"device, which is often used to pre-populate the printer-location attribute " +"when adding a printer." +msgstr "" +"Das optionale Feld I spezifiziert den physischen Standort " +"des Geräts. Es wird oft dazu verwandt, die Drucker-Standort-Attribute vorab " +"zu belegen, wenn ein Drucker hinzugefügt wird." + +# type: SH +#. type: SH +#: backend.man:118 +#, no-wrap +msgid "PERMISSIONS" +msgstr "RECHTE" + +# type: Plain text +#. type: Plain text +#: backend.man:122 +msgid "" +"Backends without world execute permissions are run as the root user. " +"Otherwise, the backend is run using the unprivileged user account, typically " +"\"lp\"." +msgstr "" +"Backends, denen die Ausführungsrechte für »world« (andere) fehlen, werden " +"als Benutzer root ausgeführt. Andernfalls läuft das Backend unter dem " +"unprivilegierten Benutzerkonto, typischerweise »lp«." + +# type: SH +#. type: SH +#: backend.man:123 +#, no-wrap +msgid "EXIT CODES" +msgstr "EXIT-CODES" + +# type: Plain text +#. type: Plain text +#: backend.man:127 +msgid "" +"The following exit codes are defined for backends; C API constants defined " +"in the Ecups/backend.hE header file are defined in parenthesis:" +msgstr "" +"Die folgenden Exit-Codes sind für Backends definiert; C API-Konstanten, die " +"in der Header-Datei Ecups/backend.hE definiert sind, sind in " +"Klammern definiert:" + +# type: TP +#. type: TP +#: backend.man:128 +#, no-wrap +msgid "0 (CUPS_BACKEND_OK)" +msgstr "0 (CUPS_BACKEND_OK)" + +# type: Plain text +#. type: Plain text +#: backend.man:133 +msgid "" +"The print file was successfully transmitted to the device or remote server." +msgstr "" +"Die Druckdatei wurde erfolgreich an das Gerät oder den entfernten Server " +"übertragen." + +# type: TP +#. type: TP +#: backend.man:134 +#, no-wrap +msgid "1 (CUPS_BACKEND_FAILED)" +msgstr "1 (CUPS_BACKEND_FAILED)" + +# type: Plain text +#. type: Plain text +#: backend.man:141 +msgid "" +"The print file was not successfully transmitted to the device or remote " +"server. The scheduler will respond to this by canceling the job, retrying " +"the job, or stopping the queue depending on the state of the error-policy " +"attribute." +msgstr "" +"Die Druckdatei wurde nicht erfolgreich zum Gerät oder entfernten Server " +"übertragen. Der Auftragsplaner (Scheduler) wird daraufhin den Auftrag " +"abbrechen, den Auftrag erneut versuchen oder die Warteschlange anhalten, " +"abhängig vom Zustand des Attributs »error-policy«." + +# type: TP +#. type: TP +#: backend.man:142 +#, no-wrap +msgid "2 (CUPS_BACKEND_AUTH_REQUIRED)" +msgstr "2 (CUPS_BACKEND_AUTH_REQUIRED)" + +# type: Plain text +#. type: Plain text +#: backend.man:149 +msgid "" +"The print file was not successfully transmitted because valid authentication " +"information is required. The scheduler will respond to this by holding the " +"job and adding the authentication-required job-reasons keyword." +msgstr "" +"Die Druckdatei wurde nicht erfolgreich übertragen, da gültige " +"Authentifizierungsinformationen benötigt werden. Der Auftragsplaner wird " +"darauf durch Halten des Auftrags reagieren und das Schlüsselwort " +"»authentication-required job-reasons« hinzufügen." + +# type: TP +#. type: TP +#: backend.man:150 +#, no-wrap +msgid "3 (CUPS_BACKEND_HOLD)" +msgstr "3 (CUPS_BACKEND_HOLD)" + +# type: Plain text +#. type: Plain text +#: backend.man:156 +msgid "" +"The print file was not successfully transmitted because it cannot be printed " +"at this time. The scheduler will respond to this by holding the job." +msgstr "" +"Die Druckdatei wurde nicht erfolgreich übertragen, da sie derzeit nicht " +"gedruckt werden kann. Der Auftragsplaner wird darauf durch Halten des " +"Auftrags reagieren." + +# type: TP +#. type: TP +#: backend.man:157 +#, no-wrap +msgid "4 (CUPS_BACKEND_STOP)" +msgstr "4 (CUPS_BACKEND_STOP)" + +# type: Plain text +#. type: Plain text +#: backend.man:163 +msgid "" +"The print file was not successfully transmitted because it cannot be printed " +"at this time. The scheduler will respond to this by stopping the queue." +msgstr "" +"Die Druckdatei wurde nicht erfolgreich übertragen, da sie derzeit nicht " +"gedruckt werden kann. Der Auftragsplaner wird durch Anhalten der " +"Warteschlange darauf reagieren." + +# type: TP +#. type: TP +#: backend.man:164 +#, no-wrap +msgid "5 (CUPS_BACKEND_CANCEL)" +msgstr "5 (CUPS_BACKEND_CANCEL)" + +# type: Plain text +#. type: Plain text +#: backend.man:170 +msgid "" +"The print file was not successfully transmitted because one or more " +"attributes are not supported. The scheduler will respond to this by " +"canceling the job." +msgstr "" +"Die Druckdatei wurde nicht erfolgreich übertragen, da eine oder mehrere der " +"Attribute nicht unterstützt werden. Der Auftragsplaner wird durch Abbruch " +"des Auftrages darauf reagieren." + +# type: Plain text +#. type: Plain text +#: backend.man:173 +msgid "All other exit code values are reserved." +msgstr "Alle anderen Exit-Codes sind reserviert." + +# type: Plain text +#. type: Plain text +#: backend.man:176 +msgid "I, I, I," +msgstr "I, I, I," + +# type: TH +#. type: TH +#: cancel.man:15 +#, no-wrap +msgid "cancel" +msgstr "cancel" + +# type: TH +#. type: TH +#: cancel.man:15 cupstestdsc.man:15 mime.convs.man:15 +#, no-wrap +msgid "20 March 2006" +msgstr "20. März 2006" + +# type: Plain text +#. type: Plain text +#: cancel.man:18 +msgid "cancel - cancel jobs" +msgstr "cancel - Aufträge abbrechen" + +# type: Plain text +#. type: Plain text +#: cancel.man:33 +msgid "" +"B [ -E ] [ -U I ] [ -a ] [ -h I ] [ -u " +"I ] [ I ] [ I ] [ I ]" +msgstr "" +"B [ -E ] [ -U I ] [ -a ] [ -h I ] [ -" +"u I ] [ I ] [ I ] [ I ]" + +# type: Plain text +#. type: Plain text +#: cancel.man:36 +msgid "" +"I cancels existing print jobs. The I<-a> option will remove all jobs " +"from the specified destination." +msgstr "" +"I bricht alle existierenden Druckaufträge ab. Die Option I<-a> " +"entfernt alle Druckaufträge von dem angegebenen Ziel." + +# type: Plain text +#. type: Plain text +#: cancel.man:38 +msgid "The following options are recognized by I:" +msgstr "Die folgenden Optionen werden von I erkannt:" + +# type: Plain text +#. type: Plain text +#: cancel.man:46 lp.man:85 +msgid "Specifies the username to use when connecting to the server." +msgstr "" +"Spezifiziert den Benutzernamen, der zur Kommunikation mit dem Server " +"verwandt wird." + +# type: TP +#. type: TP +#: cancel.man:46 cupsaddsmb.man.in:58 lpq.man:51 +#, no-wrap +msgid "-a" +msgstr "-a" + +# type: Plain text +#. type: Plain text +#: cancel.man:51 +msgid "" +"Cancel all jobs on the named destination, or all jobs on all destinations if " +"none is provided." +msgstr "" +"Bricht alle Aufträge auf dem benannten Ziel (oder alle Aufträge auf allen " +"Zielen, falls kein Ziel angegeben ist) ab." + +# type: TP +#. type: TP +#: cancel.man:55 lp.man:130 +#, no-wrap +msgid "-u username" +msgstr "-u Benutzername" + +# type: Plain text +#. type: Plain text +#: cancel.man:59 +msgid "Cancels jobs owned by I." +msgstr "Bricht den Auftrag von I ab." + +# type: SH +#. type: SH +#: cancel.man:63 +#, no-wrap +msgid "NOTES" +msgstr "HINWEISE" + +# type: Plain text +#. type: Plain text +#: cancel.man:67 +msgid "" +"Administrators wishing to prevent unauthorized cancellation of jobs via the " +"I<-u> option should require authentication for Cancel-Jobs operations in " +"I." +msgstr "" +"Administratoren, die das unautorisierte Abbrechen von Aufträgen über die " +"Option I<-u> verhindern möchten, sollten in I eine " +"Authentifizierung für Abbruch-Operationen einstellen." + +# type: Plain text +#. type: Plain text +#: cancel.man:69 +msgid "I, I, I," +msgstr "I, I, I," + +# type: TH +#. type: TH +#: classes.conf.man:15 +#, no-wrap +msgid "classes.conf" +msgstr "classes.conf" + +# type: TH +#. type: TH +#: classes.conf.man:15 printers.conf.man:15 +#, no-wrap +msgid "29 April 2009" +msgstr "29. April 2009" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:18 +msgid "classes.conf - class configuration file for cups" +msgstr "classes.conf - Klassenkonfigurationsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:23 +msgid "" +"The I file defines the local printer classes that are " +"available. It is normally located in the I directory and is " +"generated automatically by the I program when printer classes are " +"added or deleted." +msgstr "" +"Die Datei I definiert lokal-verfügbare Druckerklassen. Sie " +"befindet sich normalerweise im Verzeichnis I und wird automatisch " +"vom Programm I erstellt, wenn Druckerklassen hinzugefügt oder " +"gelöscht werden." + +# type: Plain text +#. type: Plain text +#: classes.conf.man:26 mailto.conf.man:24 printers.conf.man:26 +#: subscriptions.conf.man:26 +msgid "" +"Each line in the file can be a configuration directive, a blank line, or a " +"comment. Comment lines start with the # character." +msgstr "" +"Jede Zeile in der Datei kann eine Konfigurationsdirektive, eine Leerzeile " +"oder ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." + +# type: SH +#. type: SH +#: classes.conf.man:26 client.conf.man.in:24 cupsd.conf.man.in:26 +#: cups-snmp.conf.man:30 mailto.conf.man:24 printers.conf.man:26 +#: subscriptions.conf.man:26 +#, no-wrap +msgid "DIRECTIVES" +msgstr "DIREKTIVEN" + +# type: TP +#. type: TP +#: classes.conf.man:27 +#, no-wrap +msgid "EClass nameE ... E/ClassE" +msgstr "EClass NameE ... E/ClassE" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:31 +msgid "Defines a specific printer class." +msgstr "Definiert eine spezielle Druckerklasse." + +# type: TP +#. type: TP +#: classes.conf.man:31 +#, no-wrap +msgid "EDefaultClass nameE ... E/ClassE" +msgstr "EDefaultClass NameE ... E/ClassE" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:35 +msgid "Defines a default printer class." +msgstr "Definiert eine Standard-Druckerklasse." + +# type: TP +#. type: TP +#: classes.conf.man:35 printers.conf.man:35 +#, no-wrap +msgid "Accepting Yes" +msgstr "Accepting Yes" + +# type: TP +#. type: TP +#: classes.conf.man:37 printers.conf.man:37 +#, no-wrap +msgid "Accepting No" +msgstr "Accepting No" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:41 printers.conf.man:41 +msgid "Specifies whether the printer is accepting new jobs." +msgstr "Spezifiziert, ob der Drucker neue Aufträge akzeptiert." + +# type: TP +#. type: TP +#: classes.conf.man:41 printers.conf.man:41 +#, no-wrap +msgid "AllowUser [ user @group ... ]" +msgstr "AllowUser [ Benutzer @Gruppe ... ]" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:45 printers.conf.man:45 +msgid "Allows specific users and groups to print to the printer." +msgstr "Erlaubt speziellen Benutzern und Gruppen, auf dem Drucker zu drucken." + +# type: TP +#. type: TP +#: classes.conf.man:45 printers.conf.man:45 +#, no-wrap +msgid "DenyUser [ user @group ... ]" +msgstr "DenyUser [ Benutzer @Gruppe ... ]" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:49 printers.conf.man:49 +msgid "Prevents specific users and groups from printing to the printer." +msgstr "" +"Verhindert, dass bestimmte Benutzer und Gruppen auf dem Drucker drucken." + +# type: TP +#. type: TP +#: classes.conf.man:49 printers.conf.man:63 +#, no-wrap +msgid "Info text" +msgstr "Info Text" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:53 printers.conf.man:67 +msgid "Specifies human-readable text describing the printer." +msgstr "Spezifiziert menschenlesbaren Text, der den Drucker beschreibt." + +# type: TP +#. type: TP +#: classes.conf.man:53 printers.conf.man:67 +#, no-wrap +msgid "JobSheets banner banner" +msgstr "JobSheets Banner Banner" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:57 printers.conf.man:71 +msgid "Specifies the banner pages to use for the printer." +msgstr "Spezifiziert die Deckblätter, die für den Drucker zu verwenden sind." + +# type: TP +#. type: TP +#: classes.conf.man:57 printers.conf.man:71 +#, no-wrap +msgid "KLimit number" +msgstr "KLimit Nummer" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:61 printers.conf.man:75 +msgid "Specifies the job-k-limit value for the printer." +msgstr "Spezifiziert den job-k-limit-Wert für den Drucker." + +# type: TP +#. type: TP +#: classes.conf.man:61 printers.conf.man:75 +#, no-wrap +msgid "Location text" +msgstr "Location text" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:65 printers.conf.man:79 +msgid "Specifies human-readable text describing the location of the printer." +msgstr "" +"Spezifiziert menschenlesbaren Text, der den Standort des Druckers beschreibt." + +# type: TP +#. type: TP +#: classes.conf.man:65 printers.conf.man:79 +#, no-wrap +msgid "OpPolicy name" +msgstr "OpPolicy Name" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:69 printers.conf.man:83 +msgid "Specifies the operation policy for the printer." +msgstr "Spezifiziert die Betriebsrichtlinien für den Drucker." + +# type: TP +#. type: TP +#: classes.conf.man:69 printers.conf.man:83 +#, no-wrap +msgid "PageLimit number" +msgstr "PageLimit Zahl" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:73 printers.conf.man:87 +msgid "Specifies the job-page-limit value for the printer." +msgstr "Spezifiziert den job-page-limit-Wert für den Drucker." + +# type: TP +#. type: TP +#: classes.conf.man:73 +#, no-wrap +msgid "Printer" +msgstr "Drucker" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:77 +msgid "Specifies a printer that is a member of the printer class." +msgstr "Spezifiziert einen Drucker, der ein Mitglied der Druckerklasse ist." + +# type: TP +#. type: TP +#: classes.conf.man:77 printers.conf.man:91 +#, no-wrap +msgid "QuotaPeriod seconds" +msgstr "QuotaPeriod Sekunden" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:81 printers.conf.man:95 +msgid "Specifies the job-quota-period value for the printer." +msgstr "Spezifiziert den job-quota-period-Wert für den Drucker." + +# type: TP +#. type: TP +#: classes.conf.man:81 printers.conf.man:95 +#, no-wrap +msgid "Shared Yes" +msgstr "Shared Yes" + +# type: TP +#. type: TP +#: classes.conf.man:83 printers.conf.man:97 +#, no-wrap +msgid "Shared No" +msgstr "Shared No" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:87 printers.conf.man:101 +msgid "Specifies whether the printer is shared." +msgstr "Spezifiziert, ob der Drucker für andere freigegeben ist." + +# type: TP +#. type: TP +#: classes.conf.man:87 printers.conf.man:101 +#, no-wrap +msgid "State idle" +msgstr "State idle" + +# type: TP +#. type: TP +#: classes.conf.man:89 printers.conf.man:103 +#, no-wrap +msgid "State stopped" +msgstr "State stopped" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:93 printers.conf.man:107 +msgid "Specifies the initial state of the printer (Idle or Stopped)" +msgstr "" +"Spezifiziert den Anfangszustand des Druckers (Idle (im Leerlauf) oder " +"Stopped (angehalten))" + +# type: TP +#. type: TP +#: classes.conf.man:93 printers.conf.man:107 +#, no-wrap +msgid "StateMessage text" +msgstr "StateMessage Text" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:97 printers.conf.man:111 +msgid "Specifies the message associated with the state." +msgstr "Spezifiziert die einem Status zugeordnete Nachricht." + +# type: TP +#. type: TP +#: classes.conf.man:97 printers.conf.man:111 +#, no-wrap +msgid "StateTime seconds" +msgstr "StateTime Sekunden" + +# type: Plain text +#. type: Plain text +#: classes.conf.man:101 printers.conf.man:115 +msgid "Specifies the date/time associated with the state." +msgstr "Spezifiziert das mit einem Status assoziierte Datum/Uhrzeit." + +# type: Plain text +#. type: Plain text +#: classes.conf.man:104 +msgid "" +"I, I, I, I, " +"I," +msgstr "" +"I, I, I, I, " +"I," + +# type: TH +#. type: TH +#: client.conf.man.in:15 +#, no-wrap +msgid "client.conf" +msgstr "client.conf" + +# type: TH +#. type: TH +#: client.conf.man.in:15 +#, no-wrap +msgid "25 February 2006" +msgstr "25. Februar 2006" + +# type: Plain text +#. type: Plain text +#: client.conf.man.in:18 +msgid "client.conf - client configuration file for cups" +msgstr "client.conf - Clientkonfigurationsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: client.conf.man.in:24 +msgid "" +"The I file configures the CUPS client and is normally located " +"in the I<@CUPS_SERVERROOT@> or I<~/.cups> directory. Each line in the file " +"can be a configuration directive, a blank line, or a comment. Comment lines " +"start with the # character." +msgstr "" +"Die Datei I konfiguriert den CUPS-Client und befindet sich " +"normalerweise im Verzeichnis I<@CUPS_SERVERROOT@> oder I<~/.cups>. Jede " +"Zeile in der Datei kann eine Konfigurationsdirektive, eine leere Zeile oder " +"ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." + +# type: Plain text +#. type: Plain text +#: client.conf.man.in:27 +msgid "" +"The following directives are understood by the client. Consult the on-line " +"help for detailed descriptions:" +msgstr "" +"Die folgenden Direktiven werden vom Client verstanden. Schauen Sie in die " +"Online-Hilfe für detailliertere Beschreibungen:" + +# type: TP +#. type: TP +#: client.conf.man.in:27 cupsd.conf.man.in:315 +#, no-wrap +msgid "Encryption IfRequested" +msgstr "Encryption IfRequested" + +# type: TP +#. type: TP +#: client.conf.man.in:29 cupsd.conf.man.in:317 +#, no-wrap +msgid "Encryption Never" +msgstr "Encryption Never" + +# type: TP +#. type: TP +#: client.conf.man.in:31 cupsd.conf.man.in:319 +#, no-wrap +msgid "Encryption Required" +msgstr "Encryption Required" + +# type: Plain text +#. type: Plain text +#: client.conf.man.in:36 cupsd.conf.man.in:324 +msgid "" +"Specifies the level of encryption that is required for a particular location." +msgstr "" +"Spezifiziert die Verschlüsselungsstufe, die für einen bestimmten Ort " +"benötigt wird." + +# type: TP +#. type: TP +#: client.conf.man.in:36 +#, no-wrap +msgid "ServerName hostname-or-ip-address[:port]" +msgstr "ServerName Hostname-oder-IP-Adresse[:Port]" + +# type: TP +#. type: TP +#: client.conf.man.in:38 +#, no-wrap +msgid "ServerName /domain/socket" +msgstr "ServerName /Domäne/Socket" + +# type: Plain text +#. type: Plain text +#: client.conf.man.in:43 +msgid "" +"Specifies the address and optionally the port to use when connecting to the " +"server" +msgstr "" +"Spezifiziert die Adresse und optional den Port, die bei der Verbindung zum " +"Server verwandt werden sollen." + +# type: TH +#. type: TH +#: cupsaddsmb.man.in:15 +#, no-wrap +msgid "cupsaddsmb" +msgstr "cupsaddsmb" + +# type: TH +#. type: TH +#: cupsaddsmb.man.in:15 +#, no-wrap +msgid "25 July 2007" +msgstr "25. Juli 2007" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:18 +msgid "cupsaddsmb - export printers to samba for windows clients" +msgstr "cupsaddsmb - exportiere Drucker an Samba für Windows-Clients" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:28 +msgid "" +"B [ -H I ] [ -U I ] " +"[ -h I ] [ -v ] -a" +msgstr "" +"B [ -H I ] [ -U I ] [ -h I ] [ -v ] -a" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:37 +msgid "" +"B [ -H I ] [ -U I ] " +"[ -h I ] [ -v ] printer [ ... printer ]" +msgstr "" +"B [ -H I ] [ -U I ] [ -h I ] [ -v ] Drucker [ ... Drucker ]" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:44 +msgid "" +"I exports printers to the SAMBA software (version 2.2.0 or " +"higher) for use with Windows clients. Depending on the SAMBA configuration, " +"you may need to provide a password to export the printers. This program " +"requires the Windows printer driver files described below." +msgstr "" +"I exportiert Drucker an die Samba-Software (Version 2.2.0 oder " +"höher) zur Verwendung mit Windows-Clients. Abhängig von der Samba-" +"Konfiguration müssen Sie ein Passwort bereitstellen, um die Drucker zu " +"exportieren. Dieses Programm benötigt die im folgenden beschriebenen Windows-" +"Treiberdateien." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:47 +msgid "I supports the following options:" +msgstr "I unterstützt die folgenden Optionen:" + +# type: TP +#. type: TP +#: cupsaddsmb.man.in:47 +#, no-wrap +msgid "-H samba-server" +msgstr "-H Samba-Server" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:51 +msgid "Specifies the SAMBA server which defaults to the CUPS server." +msgstr "" +"Spezifiziert den Samba-Server, der standardmäßig auf den CUPS-Server gesetzt " +"wird." + +# type: TP +#. type: TP +#: cupsaddsmb.man.in:51 +#, no-wrap +msgid "-U samba-user[%samba-password]" +msgstr "-U Samba-Benutzer[%Samba-Passwort]" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:58 +msgid "" +"Specifies the SAMBA print admin username which defaults to your current " +"username. If the username contains a percent (%) character, then the text " +"following the percent is treated as the SAMBA password to use." +msgstr "" +"Spezifiziert den Benutzernamen des Samba-Druck-Administrators, standardmäßig " +"Ihr aktueller Benutzername. Falls der Benutzername ein Prozentzeichen (%) " +"enthält, wird der Text, der dem Prozentzeichen folgt, als zu verwendendes " +"Samba-Passwort behandelt." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:63 +msgid "" +"Exports all known printers. Otherwise only the named printers are exported." +msgstr "" +"Exportiert alle bekannten Drucker. Andernfalls werden nur die benannten " +"Drucker exportiert." + +# type: TP +#. type: TP +#: cupsaddsmb.man.in:63 +#, no-wrap +msgid "-h cups-server[:port]" +msgstr "-h CUPS-Server[:Port]" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:67 +msgid "Specifies a different CUPS server to use." +msgstr "Spezifiziert einen anderen zu verwendenden CUPS-Server." + +# type: TP +#. type: TP +#: cupsaddsmb.man.in:67 cupstestppd.man:105 +#, no-wrap +msgid "-v" +msgstr "-v" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:72 +msgid "" +"Specifies that verbose information should be shown. This is useful for " +"debugging SAMBA configuration problems." +msgstr "" +"Spezifiziert, dass ausführliche Informationen angezeigt werden sollen. Dies " +"ist für die Fehlersuche bei Samba-Konfigurationsproblemen nützlich." + +# type: SH +#. type: SH +#: cupsaddsmb.man.in:73 +#, no-wrap +msgid "SAMBA CONFIGURATION" +msgstr "SAMBA-KONFIGURATION" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:80 +msgid "" +"I uses the new RPC-based printing support in SAMBA 2.2.x to " +"provide printer drivers and PPD files to Windows client machines. In order " +"to use this functionality, you must first configure the SAMBA I " +"file to support printing through CUPS and provide a printer driver download " +"share, as follows:" +msgstr "" +"I verwendet die neue, RPC-basierte Druck-Unterstützung in SAMBA " +"2.2.x, um Windows-Clientmaschinen Druckertreiber und PPD-Dateien " +"bereitzustellen. Um diese Funktionalität zu benutzen, müssen Sie erst die " +"Datei I von SAMBA so konfigurieren, dass das Drucken via CUPS " +"erfolgt, und eine Freigabe für den Druckertreiber bereitstellt. Diese " +"Konfiguration sieht wie folgt aus:" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:86 +#, no-wrap +msgid "" +" [global]\n" +"\tload printers = yes\n" +"\tprinting = cups\n" +"\tprintcap name = cups\n" +msgstr "" +" [global]\n" +"\tload printers = yes\n" +"\tprinting = cups\n" +"\tprintcap name = cups\n" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:95 +#, no-wrap +msgid "" +" [printers]\n" +"\tcomment = All Printers\n" +"\tpath = /var/spool/samba\n" +"\tbrowseable = no\n" +"\tpublic = yes\n" +"\tguest ok = yes\n" +"\twritable = no\n" +"\tprintable = yes\n" +msgstr "" +" [printers]\n" +"\tcomment = Alle Drucker\n" +"\tpath = /var/spool/samba\n" +"\tbrowseable = no\n" +"\tpublic = yes\n" +"\tguest ok = yes\n" +"\twritable = no\n" +"\tprintable = yes\n" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:103 +#, no-wrap +msgid "" +" [print$]\n" +"\tcomment = Printer Drivers\n" +"\tpath = /etc/samba/drivers\n" +"\tbrowseable = yes\n" +"\tguest ok = no\n" +"\tread only = yes\n" +"\twrite list = root\n" +msgstr "" +" [print$]\n" +"\tcomment = Druckertreiber\n" +"\tpath = /etc/samba/drivers\n" +"\tbrowseable = yes\n" +"\tguest ok = no\n" +"\tread only = yes\n" +"\twrite list = root\n" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:108 +msgid "" +"This configuration assumes a FHS-compliant installation of SAMBA; adjust the " +"[printers] and [print$] share paths accordingly on your system as needed." +msgstr "" +"In dieser Konfiguration wird eine FHS-gemäße Installation von SAMBA " +"angenommen; passen Sie die [printers]- und [print$]-Freigabepfade gemäß der " +"Notwendigkeiten Ihres Systems an." + +# type: SH +#. type: SH +#: cupsaddsmb.man.in:109 +#, no-wrap +msgid "MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS" +msgstr "MICROSOFT-POSTSCRIPT-TREIBER FÜR WINDOWS" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:117 +msgid "" +"The base driver for Windows 2000 and higher is the Microsoft PostScript " +"driver, which is available on any system running Windows 2000 or higher in " +"the %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 folder for 32-bit " +"drivers and %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 folder for 64-" +"bit drivers." +msgstr "" +"Der Basis-Treiber für Windows 2000 und höher ist der Microsoft PostScript-" +"Treiber, der auf jedem System, das unter Windows 2000 oder höher läuft, im " +"Ordner %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 für 32-bit-Treiber " +"und im Ordner %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 für 64-bit-" +"Treiber verfügbar ist." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:125 +msgid "" +"The CUPS printer driver is preferred over the Microsoft driver since it " +"supports the page-label, job-billing, and job-hold-until options fully on " +"all printers. However, currently only Windows 2000 and higher is supported " +"by the Microsoft driver, so you will also need to get the Adobe driver to " +"support Windows 95, 98, and Me clients. The Adobe and Microsoft drivers for " +"Windows 2000 are identical." +msgstr "" +"Es wird empfohlen, den CUPS-Druckertreiber dem Microsoft-Treiber " +"vorzuziehen, da er auf allen Druckern die Optionen page-label, job-billing " +"und job-hold-until komplett unterstützt. Von den Microsoft-Treibern wird " +"allerdings nur Windows 2000 und höher unterstützt, daher müssen Sie sich die " +"Adobe-Treiber besorgen, um Windows 95-, 98- und Me-Clients zu unterstützen. " +"Die Adobe- und Microsoft-Treiber für Windows 2000 sind identisch." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:130 cupsaddsmb.man.in:159 +msgid "" +"Once you have extracted the driver files, copy the 32-bit drivers to the " +"I<@CUPS_DATADIR@/drivers> directory and the 64-bit drivers to the " +"I<@CUPS_DATADIR@/drivers/x64> directory exactly as named below:" +msgstr "" +"Nachdem Sie die Treiberdatei extrahiert haben, kopieren Sie die 32-Bit-" +"Treiber in das Verzeichnis I<@CUPS_DATADIR@/drivers> und die 64-Bit-Treiber " +"in das Verzeichnis I<@CUPS_DATADIR@/drivers/x64>, genau wie unten benannt:" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:137 +#, no-wrap +msgid "" +" [Windows 2000 and higher]\n" +" ps5ui.dll\n" +" pscript.hlp\n" +" pscript.ntf\n" +" pscript5.dll\n" +msgstr "" +" [Windows 2000 und höher]\n" +" ps5ui.dll\n" +" pscript.hlp\n" +" pscript.ntf\n" +" pscript5.dll\n" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:142 cupsaddsmb.man.in:175 +msgid "" +"B Unlike Windows, case is significant - make sure that you use the " +"lowercase filenames shown above, otherwise I will fail to export " +"the drivers." +msgstr "" +"B Anders als unter Windows ist die Groß-/Kleinschreibung relevant. " +"Stellen Sie sicher, dass Sie die Dateinamen wie oben klein schreiben, " +"andernfalls kann I die Treiber nicht exportieren." + +# type: SH +#. type: SH +#: cupsaddsmb.man.in:143 +#, no-wrap +msgid "CUPS POSTSCRIPT DRIVERS FOR WINDOWS" +msgstr "CUPS POSTSCRIPT-TREIBER FÜR WINDOWS" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:147 +msgid "" +"I can use the CUPS v6 PostScript printer driver for Windows, " +"which is available for download from the CUPS web site." +msgstr "" +"I kann den CUPS-v6-PostScript-Druckertreiber für Windows " +"verwenden. Dieser ist von der Website von CUPS zum Download erhältlich." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:154 +msgid "" +"The CUPS printer driver is preferred over the Adobe and Microsoft drivers " +"since it supports the page-label, job-billing, and job-hold-until options " +"fully on all printers. However, currently only Windows 2000 and higher is " +"supported by the CUPS driver, so you will also need to get the Adobe driver " +"to support Windows 95, 98, and Me clients." +msgstr "" +"Es wird empfohlen, den CUPS-Druckertreiber den Adobe- und Microsoft-Treibern " +"vorzuziehen, da er auf allen Druckern die Optionen page-label, job-billing " +"und job-hold-until komplett unterstützt. Von den CUPS-Treibern wird " +"allerdings nur Windows 2000 und höher unterstützt, daher müssen Sie sich " +"auch die Adobe-Treiber besorgen, um Windows 95-, 98- und Me-Clients zu " +"unterstützen." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:170 +#, no-wrap +msgid "" +" [Windows 2000 and higher]\n" +" cups6.inf (from www.cups.org)\n" +" cups6.ini (from www.cups.org)\n" +" cupsps6.dll (from www.cups.org)\n" +" cupsui6.dll (from www.cups.org)\n" +" ps5ui.dll (from your Windows system)\n" +" pscript.hlp (from your Windows system)\n" +" pscript.ntf (from your Windows system)\n" +" pscript5.dll (from your Windows system)\n" +msgstr "" +" [Windows 2000 und höher]\n" +" cups6.inf (von www.cups.org)\n" +" cups6.ini (von www.cups.org)\n" +" cupsps6.dll (von www.cups.org)\n" +" cupsui6.dll (von www.cups.org)\n" +" ps5ui.dll (aus Ihrem Windows-System)\n" +" pscript.hlp (aus Ihrem Windows-System)\n" +" pscript.ntf (aus Ihrem Windows-System)\n" +" pscript5.dll (aus Ihrem Windows-System)\n" + +# type: SH +#. type: SH +#: cupsaddsmb.man.in:176 +#, no-wrap +msgid "ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME" +msgstr "ADOBE POSTSCRIPT-TREIBER FÜR WINDOWS 95, 98 UND ME" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:180 +msgid "" +"I can use the Adobe PostScript printer driver for Windows 95, " +"98, and ME, which are available for download from the Adobe web site (http://" +"www.adobe.com)." +msgstr "" +"I kann die Adobe-PostScript-Druckertreiber für Windows 95, 98 " +"und ME verwenden, die von der Adobe-Website (http://www.adobe.com) " +"heruntergeladen werden können." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:183 +msgid "" +"The Adobe driver does not support the page-label, job-billing, or job-hold-" +"until options." +msgstr "" +"Der Adobe-Treiber unterstützt die Optionen page-label, job-billing oder job-" +"hold-until nicht." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:187 +msgid "" +"Once you have installed the driver on a Windows system, copy the following " +"files to the I<@CUPS_DATADIR@/drivers> directory exactly as named below:" +msgstr "" +"Sobald Sie die Treiber auf einem Windows-System installiert haben, kopieren " +"Sie die folgenden Dateien in das Verzeichnis I<@CUPS_DATADIR@/drivers> exakt " +"mit dem unten angegebenen Namen:" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:195 +#, no-wrap +msgid "" +" [Windows 95, 98, and Me]\n" +" ADFONTS.MFM\n" +" ADOBEPS4.DRV\n" +" ADOBEPS4.HLP\n" +" ICONLIB.DLL\n" +" PSMON.DLL\n" +msgstr "" +" [Windows 95, 98 und Me]\n" +" ADFONTS.MFM\n" +" ADOBEPS4.DRV\n" +" ADOBEPS4.HLP\n" +" ICONLIB.DLL\n" +" PSMON.DLL\n" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:200 +msgid "" +"B Unlike Windows, case is significant - make sure that you use the " +"UPPERCASE filenames shown above, otherwise I will fail to export " +"the drivers." +msgstr "" +"B Anders als unter Windows ist die Groß-/Kleinschreibung relevant. " +"Stellen Sie sicher, dass Sie die Dateinamen wie oben GROSS schreiben, " +"andernfalls kann I die Treiber nicht exportieren." + +# type: SH +#. type: SH +#: cupsaddsmb.man.in:201 cupsfilter.man:75 +#, no-wrap +msgid "KNOWN ISSUES" +msgstr "BEKANNTE PROBLEME" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:203 +msgid "Getting the full set of Windows driver files should be easier." +msgstr "" +"Es sollte leichter sein, den kompletten Windows-Treibersatz zu bekommen." + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:207 +msgid "I, I, http://localhost:631/help" +msgstr "I, I, http://localhost:631/help" + +# type: Plain text +#. type: Plain text +#: cupsaddsmb.man.in:209 +msgid "http://www.cups.org/windows/" +msgstr "http://www.cups.org/windows/" + +# type: TH +#. type: TH +#: cups-config.man:15 +#, no-wrap +msgid "cups-config" +msgstr "cups-config" + +# type: TH +#. type: TH +#: cups-config.man:15 +#, no-wrap +msgid "23 October 2008" +msgstr "23. Oktober 2008" + +# type: Plain text +#. type: Plain text +#: cups-config.man:18 +msgid "cups-config - get cups api, compiler, directory, and link information." +msgstr "" +"cups-config - ermittelt CUPS-API-, -Compiler-, -Verzeichnis- und -Link-" +"Informationen." + +# type: Plain text +#. type: Plain text +#: cups-config.man:21 +msgid "B --api-version" +msgstr "B --api-version" + +# type: Plain text +#. type: Plain text +#: cups-config.man:24 +msgid "B --build" +msgstr "B --build" + +# type: Plain text +#. type: Plain text +#: cups-config.man:27 +msgid "B --cflags" +msgstr "B --cflags" + +# type: Plain text +#. type: Plain text +#: cups-config.man:30 +msgid "B --datadir" +msgstr "B --datadir" + +# type: Plain text +#. type: Plain text +#: cups-config.man:33 +msgid "B --help" +msgstr "B --help" + +# type: Plain text +#. type: Plain text +#: cups-config.man:36 +msgid "B --ldflags" +msgstr "B --ldflags" + +# type: Plain text +#. type: Plain text +#: cups-config.man:43 +msgid "B [ I<--image> ] [ I<--static> ] --libs" +msgstr "B [ I<--image> ] [ I<--static> ] --libs" + +# type: Plain text +#. type: Plain text +#: cups-config.man:46 +msgid "B --serverbin" +msgstr "B --serverbin" + +# type: Plain text +#. type: Plain text +#: cups-config.man:49 +msgid "B --serverroot" +msgstr "B --serverroot" + +# type: Plain text +#. type: Plain text +#: cups-config.man:52 +msgid "B --version" +msgstr "B --version" + +# type: Plain text +#. type: Plain text +#: cups-config.man:58 +msgid "" +"B is the CUPS program configuration utility. It should be used " +"by application developers to determine the necessary command-line options " +"for the compiler and linker, as well as determining installation directories " +"for filters, configuration files, and drivers." +msgstr "" +"B ist das Konfigurations-Hilfswerkzeug des Cups-Programms. Es " +"sollte von Anwendungsentwicklern verwandt werden, um die notwendigen " +"Befehlszeilen-Optionen für den Compiler und Linker zu bestimmen, sowie die " +"Installationsverzeichnisse für Filter, Konfigurationsdateien und Treiber zu " +"ermitteln." + +# type: TP +#. type: TP +#: cups-config.man:59 +#, no-wrap +msgid "--api-version" +msgstr "--api-version" + +# type: Plain text +#. type: Plain text +#: cups-config.man:63 +msgid "Displays the current API version (major.minor)." +msgstr "Zeigt die aktuelle API-Version (Hauptversion.Unterversion) an." + +#. type: TP +#: cups-config.man:63 +#, no-wrap +msgid "--build" +msgstr "--build" + +#. type: Plain text +#: cups-config.man:67 +msgid "Displays a system-specific build number." +msgstr "Zeigt eine systemabhängige Build-Nummer." + +# type: TP +#. type: TP +#: cups-config.man:67 +#, no-wrap +msgid "--cflags" +msgstr "--cflags" + +# type: Plain text +#. type: Plain text +#: cups-config.man:71 +msgid "Displays the necessary compiler options." +msgstr "Zeigt die notwendigen Compiler-Optionen an." + +# type: TP +#. type: TP +#: cups-config.man:71 +#, no-wrap +msgid "--datadir" +msgstr "--datadir" + +# type: Plain text +#. type: Plain text +#: cups-config.man:75 +msgid "Displays the default CUPS data directory." +msgstr "Zeigt das Standard-CUPS-Datenverzeichnis an." + +# type: TP +#. type: TP +#: cups-config.man:75 +#, no-wrap +msgid "--help" +msgstr "--help" + +# type: Plain text +#. type: Plain text +#: cups-config.man:79 +msgid "Displays the program usage message." +msgstr "Zeigt die Programm-Verwendungshinweise an." + +# type: TP +#. type: TP +#: cups-config.man:79 +#, no-wrap +msgid "--image" +msgstr "--image" + +# type: Plain text +#. type: Plain text +#: cups-config.man:84 +msgid "" +"When used with I<--libs>, adds the CUPS imaging library to the list of " +"displayed libraries." +msgstr "" +"Wird dies mit I<--libs> verwandt, wird die CUPS Imaging-Bibliothek zu der " +"Liste der angezeigten Bibliotheken hinzugefügt." + +# type: TP +#. type: TP +#: cups-config.man:84 +#, no-wrap +msgid "--ldflags" +msgstr "--ldflags" + +# type: Plain text +#. type: Plain text +#: cups-config.man:88 +msgid "Displays the necessary linker options." +msgstr "Zeigt die notwendigen Linker-Optionen an." + +# type: TP +#. type: TP +#: cups-config.man:88 +#, no-wrap +msgid "--libs" +msgstr "--libs" + +# type: Plain text +#. type: Plain text +#: cups-config.man:92 +msgid "Displays the necessary librarys to link to." +msgstr "Zeigt die zum Linken notwendigen Bibliotheken an." + +# type: TP +#. type: TP +#: cups-config.man:92 +#, no-wrap +msgid "--serverbin" +msgstr "--serverbin" + +# type: Plain text +#. type: Plain text +#: cups-config.man:97 +msgid "" +"Displays the default CUPS binary directory, where filters and backends are " +"stored." +msgstr "" +"Zeigt das Standard-CUPS-Verzeichnis an, in dem Filter und Backends " +"gespeichert werden." + +# type: TP +#. type: TP +#: cups-config.man:97 +#, no-wrap +msgid "--serverroot" +msgstr "--serverroot" + +# type: Plain text +#. type: Plain text +#: cups-config.man:101 +msgid "Displays the default CUPS configuration file directory." +msgstr "Zeigt das Standard-CUPS-Konfigurationsverzeichnis an." + +# type: TP +#. type: TP +#: cups-config.man:101 +#, no-wrap +msgid "--static" +msgstr "--static" + +# type: Plain text +#. type: Plain text +#: cups-config.man:106 +msgid "" +"When used with I<--libs>, shows the static libraries instead of the default " +"(shared) libraries." +msgstr "" +"Zeigt die statischen Bibliotheken an, statt der Standard (Laufzeit-)" +"Bibliotheken, wenn mit I<--libs> verwandt." + +# type: TP +#. type: TP +#: cups-config.man:106 +#, no-wrap +msgid "--version" +msgstr "--version" + +# type: Plain text +#. type: Plain text +#: cups-config.man:111 +msgid "" +"Displays the full version number of the CUPS installation (major.minor." +"patch)." +msgstr "" +"Zeigt die vollständige Versionsnummer der CUPS-Installation an (Hauptversion." +"Unterversion.Patch)." + +# type: TH +#. type: TH +#: cupsctl.man:15 +#, no-wrap +msgid "cupsctl" +msgstr "cupsctl" + +# type: TH +#. type: TH +#: cupsctl.man:15 +#, no-wrap +msgid "5 July 2007" +msgstr "5. Juli 2007" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:18 +msgid "cupsctl - configure cupsd.conf options" +msgstr "cupsctl - konfiguriere cupsd.conf-Optionen" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:29 +msgid "" +"B [ -E ] [-U I ] [ -h I ] [ --[no-]debug-" +"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" +"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " +"[ I ]" +msgstr "" +"B [ -E ] [-U I ] [ -h I ] [ --[no-]debug-" +"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" +"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " +"[ I ]" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:33 +msgid "" +"I updates or queries the B file for a server. When no " +"changes are requested, the current configuration values are written to the " +"standard output in the format \"name=value\", one per line." +msgstr "" +"I aktualisiert die Datei B oder ermittelt aus ihr einen " +"Server. Falls keine Änderungen erbeten wurden, werden die aktuellen " +"Konfigurationsoptionen, jeweils eine pro Zeile, im Format »Name=Wert« auf " +"die Standardausgabe geschrieben." + +# type: Plain text +#. type: Plain text +#: cupsctl.man:35 +msgid "The following options are recognized:" +msgstr "Die folgenden Optionen werden erkannt:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:39 +msgid "Enables encryption on the connection to the scheduler." +msgstr "" +"Aktiviert Verschlüsselung bei der Verbindung mit dem Auftragsplaner " +"(Scheduler)." + +# type: TP +#. type: TP +#: cupsctl.man:39 +#, no-wrap +msgid "-U I" +msgstr "-U I" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:43 +msgid "" +"Specifies an alternate username to use when authenticating with the " +"scheduler." +msgstr "" +"Spezifiziert einen alternativen Benutzernamen, der bei Authentifizierung mit " +"dem Auftragsplaner verwandt werden soll." + +# type: TP +#. type: TP +#: cupsctl.man:43 +#, no-wrap +msgid "-h I" +msgstr "-h I" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:47 +msgid "Specifies the server address." +msgstr "Spezifiziert die Server-Adresse." + +# type: TP +#. type: TP +#: cupsctl.man:47 +#, no-wrap +msgid "--[no-]debug-logging" +msgstr "--[no-]debug-logging" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:51 +msgid "Enables or disables debug logging in the B file." +msgstr "" +"Aktiviert oder deaktiviert das Protokollieren von Fehlersuchemeldungen in " +"der Datei B." + +# type: TP +#. type: TP +#: cupsctl.man:51 +#, no-wrap +msgid "--[no-]remote-admin" +msgstr "--[no-]remote-admin" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:55 +msgid "Enables or disables remote administration." +msgstr "Aktiviert oder deaktiviert Administration aus der Ferne." + +# type: TP +#. type: TP +#: cupsctl.man:55 +#, no-wrap +msgid "--[no-]remote-any" +msgstr "--[no-]remote-any" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:59 +msgid "Enables or disables printing from any address, e.g. the Internet." +msgstr "" +"Aktiviert oder deaktiviert Drucken von beliebigen Adressen, z.B. aus dem " +"Internet." + +# type: TP +#. type: TP +#: cupsctl.man:59 +#, no-wrap +msgid "--[no-]remote-printers" +msgstr "--[no-]remote-printers" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:64 +msgid "" +"Enables or disables the display of remote printers shared via the CUPS, " +"LDAP, or SLP protocols." +msgstr "" +"Aktiviert oder deaktiviert die Anzeige von Druckern in der Ferne, die über " +"die Protokolle CUPS, LDAP oder SLP freigegeben sind." + +# type: TP +#. type: TP +#: cupsctl.man:64 +#, no-wrap +msgid "--[no-]share-printers" +msgstr "--[no-]share-printers" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:68 +msgid "Enables or disables sharing of local printers with other computers." +msgstr "" +"Aktiviert oder deaktiviert das gemeinsame Benutzen lokaler Drucker mit " +"anderen Computern." + +# type: TP +#. type: TP +#: cupsctl.man:68 +#, no-wrap +msgid "--[no-]user-cancel-any" +msgstr "--[no-]user-cancel-any" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:72 +msgid "Allows or prevents users from canceling jobs owned by others." +msgstr "" +"Ermöglicht Benutzern oder hindert sie daran, Aufträge anderer Benutzer " +"abzubrechen." + +# type: SH +#. type: SH +#: cupsctl.man:72 cupstestppd.man:137 lp.man:229 +#, no-wrap +msgid "EXAMPLES" +msgstr "BEISPIELE" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:74 +msgid "Display the current settings:" +msgstr "Zeige die aktuellen Einstellungen an:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:76 +#, no-wrap +msgid " cupsctl\n" +msgstr " cupsctl\n" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:79 +msgid "Enable debug logging:" +msgstr "Aktiviert Fehlersucheprotokollierung:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:81 +#, no-wrap +msgid " cupsctl --debug-logging\n" +msgstr " cupsctl --debug-logging\n" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:84 +msgid "Get the current debug logging state:" +msgstr "Den aktuellen Fehlersucheprotokollierzustand abfragen:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:86 +#, no-wrap +msgid " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" +msgstr " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:89 +msgid "Disable printer sharing:" +msgstr "Deaktiviere Druckerfreigabe:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:91 +#, no-wrap +msgid " cupsctl --no-shared-printers\n" +msgstr " cupsctl --no-shared-printers\n" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:94 +msgid "Enable printing using the file: pseudo-device:" +msgstr "Aktiviere Druckerfreigabe unter Verwendung des file:-Pseudogeräts:" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:96 +#, no-wrap +msgid " cupsctl FileDevice=Yes\n" +msgstr " cupsctl FileDevice=Yes\n" + +# type: Plain text +#. type: Plain text +#: cupsctl.man:99 +msgid "I, I," +msgstr "I, I," + +# type: TH +#. type: TH +#: cupsd.conf.man.in:15 +#, no-wrap +msgid "cupsd.conf" +msgstr "cupsd.conf" + +# type: TH +#. type: TH +#: cupsd.conf.man.in:15 +#, no-wrap +msgid "28 January 2010" +msgstr "28. Januar 2010" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:18 +msgid "cupsd.conf - server configuration file for cups" +msgstr "cupsd.conf - Server-Konfigurationsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:21 +msgid "" +"The I file configures the CUPS scheduler, I. It is " +"normally located in the I<@CUPS_SERVERROOT@> directory." +msgstr "" +"Die Datei I konfiguriert den CUPS-Auftragsplaner (Scheduler), " +"I. Sie befindet sich normalerweise im Verzeichnis " +"I<@CUPS_SERVERROOT@>." + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:26 +msgid "" +"Each line in the file can be a configuration directive, a blank line, or a " +"comment. Comment lines start with the # character. The configuration " +"directives are intentionally similar to those used by the popular Apache web " +"server software and are described below." +msgstr "" +"Jede Zeile in der Datei kann eine Konfigurationsdirektive, eine leere Zeile " +"oder ein Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«. Die " +"Konfigurationsdirektiven sind bewusst ähnlich zu denen des beliebten Apache-" +"Webservers gehalten und werden unten beschrieben." + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:29 +msgid "" +"The following directives are understood by I. Consult the on-line " +"help for detailed descriptions:" +msgstr "" +"Die folgenden Direktiven werden von I verstanden. Schauen Sie in " +"die Online-Hilfe für eine detailliertere Beschreibung:" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:29 +#, no-wrap +msgid "AccessLog filename" +msgstr "AccessLog Dateiname" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:31 +#, no-wrap +msgid "AccessLog syslog" +msgstr "AccessLog syslog" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:35 +msgid "Defines the access log filename." +msgstr "Definiert den Namen der Zugriffsprotokolldatei." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:35 +#, no-wrap +msgid "AccessLogLevel config" +msgstr "AccessLogLevel config" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:37 +#, no-wrap +msgid "AccessLogLevel actions" +msgstr "AccessLogLevel actions" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:39 +#, no-wrap +msgid "AccessLogLevel all" +msgstr "AccessLogLevel all" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:43 +msgid "Specifies the logging level for the AccessLog file." +msgstr "Spezifiziert die Protokollierungsstufe für die AccessLog-Datei." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:43 +#, no-wrap +msgid "Allow all" +msgstr "Allow all" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:45 +#, no-wrap +msgid "Allow none" +msgstr "Allow none" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:47 +#, no-wrap +msgid "Allow host.domain.com" +msgstr "Allow host.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:49 +#, no-wrap +msgid "Allow *.domain.com" +msgstr "Allow *.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:51 +#, no-wrap +msgid "Allow ip-address" +msgstr "Allow IP-Adresse" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:53 +#, no-wrap +msgid "Allow ip-address/netmask" +msgstr "Allow IP-Adresse/Netzmaske" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:55 +#, no-wrap +msgid "Allow ip-address/mm" +msgstr "Allow IP-Adresse/mm" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:57 +#, no-wrap +msgid "Allow @IF(name)" +msgstr "Allow @IF(Name)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:59 +#, no-wrap +msgid "Allow @LOCAL" +msgstr "Allow @LOCAL" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:63 +msgid "Allows access from the named hosts or addresses." +msgstr "Erlaubt Zugriff von den benannten Rechnern oder Adressen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:63 +#, no-wrap +msgid "AuthClass User" +msgstr "AuthClass User" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:65 +#, no-wrap +msgid "AuthClass Group" +msgstr "AuthClass Group" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:67 +#, no-wrap +msgid "AuthClass System" +msgstr "AuthClass System" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:72 +msgid "" +"Specifies the authentication class (User, Group, System) - B." +msgstr "" +"Spezifiziert die Authentifizierungsklasse (Benutzer, Gruppe, System) - " +"B." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:72 +#, no-wrap +msgid "AuthGroupName group-name" +msgstr "AuthGroupName Gruppenname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:77 +msgid "Specifies the authentication group - B." +msgstr "" +"Spezifiziert die Authentifizierungsgruppe - B." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:77 +#, no-wrap +msgid "AuthType None" +msgstr "AuthType None" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:79 +#, no-wrap +msgid "AuthType Basic" +msgstr "AuthType Basic" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:81 +#, no-wrap +msgid "AuthType BasicDigest" +msgstr "AuthType BasicDigest" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:83 +#, no-wrap +msgid "AuthType Digest" +msgstr "AuthType Digest" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:85 +#, no-wrap +msgid "AuthType Negotiate" +msgstr "AuthType Negotiate" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:89 +msgid "" +"Specifies the authentication type (None, Basic, BasicDigest, Digest, " +"Negotiate)" +msgstr "" +"Spezifiziert den Authentifizierungstyp (None, Basic, BasicDigest, Digest, " +"Negotiate)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:89 +#, no-wrap +msgid "AutoPurgeJobs Yes" +msgstr "AutoPurgeJobs Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:91 +#, no-wrap +msgid "AutoPurgeJobs No" +msgstr "AutoPurgeJobs No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:96 +msgid "" +"Specifies whether to purge job history data automatically when it is no " +"longer required for quotas." +msgstr "" +"Spezifiziert, ob die Verlaufsdaten des Auftrags automatisch bereinigt " +"(gelöscht) werden sollen, wenn sie nicht mehr für Quotas benötigt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:96 +#, no-wrap +msgid "BrowseAddress ip-address" +msgstr "BrowseAddress IP-Adresse" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:98 +#, no-wrap +msgid "BrowseAddress @IF(name)" +msgstr "BrowseAddress @IF(Name)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:100 +#, no-wrap +msgid "BrowseAddress @LOCAL" +msgstr "BrowseAddress @LOCAL" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:104 +msgid "Specifies a broadcast address for outgoing printer information packets." +msgstr "" +"Spezifiziert eine Broadcast-Adresse für ausgehende Druckerinformationspakete." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:104 +#, no-wrap +msgid "BrowseAllow all" +msgstr "BrowseAllow all" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:106 +#, no-wrap +msgid "BrowseAllow none" +msgstr "BrowseAllow none" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:108 +#, no-wrap +msgid "BrowseAllow host.domain.com" +msgstr "BrowseAllow host.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:110 +#, no-wrap +msgid "BrowseAllow *.domain.com" +msgstr "BrowseAllow *.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:112 +#, no-wrap +msgid "BrowseAllow ip-address" +msgstr "BrowseAllow IP-Adresse" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:114 +#, no-wrap +msgid "BrowseAllow ip-address/netmask" +msgstr "BrowseAllow IP-Adresse/Netzmaske" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:116 +#, no-wrap +msgid "BrowseAllow ip-address/mm" +msgstr "BrowseAllow IP-Adresse/mm" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:118 +#, no-wrap +msgid "BrowseAllow @IF(name)" +msgstr "BrowseAllow @IF(Name)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:120 +#, no-wrap +msgid "BrowseAllow @LOCAL" +msgstr "BrowseAllow @LOCAL" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:124 +msgid "" +"Allows incoming printer information packets from the named host or address." +msgstr "" +"Erlaubt eingehende Druckerinformationspakete von den benannten Rechnern oder " +"Adressen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:124 +#, no-wrap +msgid "BrowseDeny all" +msgstr "BrowseDeny all" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:126 +#, no-wrap +msgid "BrowseDeny none" +msgstr "BrowseDeny none" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:128 +#, no-wrap +msgid "BrowseDeny host.domain.com" +msgstr "BrowseDeny host.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:130 +#, no-wrap +msgid "BrowseDeny *.domain.com" +msgstr "BrowseDeny *.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:132 +#, no-wrap +msgid "BrowseDeny ip-address" +msgstr "BrowseDeny IP-Adresse" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:134 +#, no-wrap +msgid "BrowseDeny ip-address/netmask" +msgstr "BrowseDeny IP-Adresse/Netzmaske" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:136 +#, no-wrap +msgid "BrowseDeny ip-address/mm" +msgstr "BrowseDeny IP-Adresse/mm" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:138 +#, no-wrap +msgid "BrowseDeny @IF(name)" +msgstr "BrowseDeny @IF(Name)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:140 +#, no-wrap +msgid "BrowseDeny @LOCAL" +msgstr "BrowseDeny @LOCAL" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:144 +msgid "" +"Denies incoming printer information packets from the named host or address." +msgstr "" +"Verbietet eingehende Druckerinformationspakete von den benannten Rechnern " +"oder Adressen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:144 +#, no-wrap +msgid "BrowseInterval seconds" +msgstr "BrowseInterval Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:148 +msgid "Specifies the maximum interval between printer information broadcasts." +msgstr "" +"Gibt das maximale Intervall zwischen Druckerinformationsübertragungen an." + +#. type: TP +#: cupsd.conf.man.in:148 +#, no-wrap +msgid "BrowseLDAPBindDN" +msgstr "BrowseLDAPBindDN" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:152 +msgid "Specifies the LDAP domain name to use when registering printers." +msgstr "" +"Gibt den LDAP-Domänenname an, der zum Registrieren von Druckern benutzt wird." + +#. type: TP +#: cupsd.conf.man.in:152 +#, no-wrap +msgid "BrowseLDAPCACertFile" +msgstr "BrowseLDAPCACertFile" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:156 +msgid "Specifies the SSL certificate authority file to use." +msgstr "Gibt die SSL-Zertifizierungsautorität an, die benutzt werden soll." + +#. type: TP +#: cupsd.conf.man.in:156 +#, no-wrap +msgid "BrowseLDAPDN" +msgstr "BrowseLDAPDN" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:160 +msgid "Specifies the LDAP domain name to use when discovering printers." +msgstr "Spezifiziert die LDAP-Domäne, die benutzt wird, um Drucker zu suchen." + +#. type: TP +#: cupsd.conf.man.in:160 +#, no-wrap +msgid "BrowseLDAPPassword" +msgstr "BrowseLDAPPassword" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:164 +msgid "Specifies the password to use when accessing the LDAP server." +msgstr "" +"Gibt das Passwort an, das zum Zugriff auf den LDAP-Server benutzt werden " +"soll." + +#. type: TP +#: cupsd.conf.man.in:164 +#, no-wrap +msgid "BrowseLDAPServer" +msgstr "BrowseLDAPServer" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:168 +msgid "Specifies the LDAP server to use." +msgstr "Spezifiziert den zu verwendenden LDAP-Server." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:168 +#, no-wrap +msgid "BrowseOrder allow,deny" +msgstr "BrowseOrder allow,deny" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:170 +#, no-wrap +msgid "BrowseOrder deny,allow" +msgstr "BrowseOrder deny,allow" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:174 +msgid "" +"Specifies the order of printer information access control (allow,deny or " +"deny,allow)" +msgstr "" +"Spezifiziert die Reihenfolge der Druckerinformations-Zugriffssteuerung " +"(allow,deny (erlauben,verbieten) oder andersherum)." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:174 +#, no-wrap +msgid "BrowsePoll host-or-ip-address" +msgstr "BrowsePoll Rechner-oder-IP-Adresse" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:178 +msgid "Specifies a server to poll for printer information." +msgstr "" +"Spezifiziert den Server, der nach Druckerinformationen befragt werden soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:178 +#, no-wrap +msgid "BrowsePort port" +msgstr "BrowsePort port" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:182 +msgid "Specifies the port to listen to for printer information packets." +msgstr "" +"Spezifiziert den Port, an dem auf Druckerinformationspakete gewartet werden " +"soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:182 +#, no-wrap +msgid "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:186 +msgid "Specifies the protocols to use for printer browsing." +msgstr "" +"Spezifiziert die für das Durchsuchen der Drucker zu verwendenden Protokolle." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:186 +#, no-wrap +msgid "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:190 +msgid "Specifies the protocols to use for local printer browsing." +msgstr "" +"Spezifiziert die für das Durchsuchen der lokalen Drucker zu verwendenden " +"Protokolle." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:190 +#, no-wrap +msgid "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:194 +msgid "Specifies the protocols to use for remote printer browsing." +msgstr "" +"Spezifiziert die für das Durchsuchen der nicht-lokalen Drucker zu " +"verwendende Protokolle." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:194 +#, no-wrap +msgid "BrowseRelay from-address to-address" +msgstr "BrowseRelay von-Adresse zu-Adresse" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:199 +msgid "" +"Specifies that printer information packets should be relayed from one host " +"or network to another." +msgstr "" +"Spezifiziert, dass Druckerinformationspakete von einem Rechner oder Netz zu " +"einem anderen weitergeleitet werden sollen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:199 +#, no-wrap +msgid "BrowseShortNames Yes" +msgstr "BrowseShortNames Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:201 +#, no-wrap +msgid "BrowseShortNames No" +msgstr "BrowseShortNames No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:207 +msgid "" +"Specifies whether remote printers will use short names (\"printer\") or not " +"(\"printer@server\"). This option is ignored if more than one remote printer " +"exists with the same name." +msgstr "" +"Spezifiziert, ob nicht-lokale Drucker kurze Namen verwenden (»Drucker«) oder " +"nicht (»Drucker@Server«). Diese Option wird ignoriert, falls es mehr als " +"einen nicht-lokalen Drucker mit dem gleichen Namen gibt." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:207 +#, no-wrap +msgid "BrowseTimeout seconds" +msgstr "BrowseTimeout Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:212 +msgid "" +"Specifies the maximum interval between printer information updates before " +"remote printers will be removed from the list of available printers." +msgstr "" +"Spezifiziert das maximale Intervall zwischen " +"Druckerinformationsaktualisierungen, bevor Drucker in der Ferne aus der " +"Liste der verfügbaren Drucker entfernt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:212 +#, no-wrap +msgid "BrowseWebIF Yes" +msgstr "BrowseWebIF Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:214 +#, no-wrap +msgid "BrowseWebIF No" +msgstr "BrowseWebIF No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:218 +msgid "Specifies whether the CUPS web interface is advertised via DNS-SD." +msgstr "Gibt an, ob die CUPS-Web-Schnittstelle über DNS-SD angekündigt wird." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:218 +#, no-wrap +msgid "Browsing Yes" +msgstr "Browsing Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:220 +#, no-wrap +msgid "Browsing No" +msgstr "Browsing No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:224 +msgid "Specifies whether or not remote printer browsing should be enabled." +msgstr "" +"Spezifiziert, ob das Durchsuchen von Druckern in der Ferne aktiviert werden " +"soll oder nicht." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:224 +#, no-wrap +msgid "Classification banner" +msgstr "Classification Deckblatt" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:228 +msgid "Specifies the security classification of the server." +msgstr "Spezifiziert die Sicherheitseinstufung des Servers." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:228 +#, no-wrap +msgid "ClassifyOverride Yes" +msgstr "ClassifyOverride Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:230 +#, no-wrap +msgid "ClassifyOverride No" +msgstr "ClassifyOverride No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:235 +msgid "" +"Specifies whether to allow users to override the classification of " +"individual print jobs." +msgstr "" +"Spezifiziert, ob Benutzern erlaubt werden soll, die Einstufung individueller " +"Druckaufträge zu ändern." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:235 +#, no-wrap +msgid "ConfigFilePerm mode" +msgstr "ConfigFilePerm Modus" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:240 +msgid "" +"Specifies the permissions for all configuration files that the scheduler " +"writes." +msgstr "" +"Spezifiziert die Rechte für alle vom Auftragsplaner (Scheduler) " +"geschriebenen Konfigurationsdateien." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:240 +#, no-wrap +msgid "DataDir path" +msgstr "DataDir Pfad" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:244 +msgid "Specified the directory where data files can be found." +msgstr "" +"Spezifiziert das Verzeichnis, in dem Datendateien gefunden werden können." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:244 +#, no-wrap +msgid "DefaultAuthType Basic" +msgstr "DefaultAuthType Basic" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:246 +#, no-wrap +msgid "DefaultAuthType BasicDigest" +msgstr "DefaultAuthType BasicDigest" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:248 +#, no-wrap +msgid "DefaultAuthType Digest" +msgstr "DefaultAuthType Digest" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:250 +#, no-wrap +msgid "DefaultAuthType Negotiate" +msgstr "DefaultAuthType Negotiate" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:254 +msgid "Specifies the default type of authentication to use." +msgstr "Spezifiziert den standardmäßig zu verwendenden Authentifizierungstyp." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:254 +#, no-wrap +msgid "DefaultEncryption Never" +msgstr "DefaultEncryption Never" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:256 +#, no-wrap +msgid "DefaultEncryption IfRequested" +msgstr "DefaultEncryption IfRequested" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:258 +#, no-wrap +msgid "DefaultEncryption Required" +msgstr "DefaultEncryption Required" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:262 +msgid "Specifies the type of encryption to use for authenticated requests." +msgstr "" +"Gibt den Typ der Verschlüsselung an, der für authentifizierte Anfragen " +"benutzt werden soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:262 +#, no-wrap +msgid "DefaultLanguage locale" +msgstr "DefaultLanguage Locale (Standorteinstellung)" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:266 +msgid "Specifies the default language to use for text and web content." +msgstr "" +"Spezifiziert die Standardsprache, die für Text und Webinhalte verwandt " +"werden soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:266 +#, no-wrap +msgid "DefaultPaperSize Auto" +msgstr "DefaultPaperSize Auto" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:268 +#, no-wrap +msgid "DefaultPaperSize None" +msgstr "DefaultPaperSize None" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:270 +#, no-wrap +msgid "DefaultPaperSize sizename" +msgstr "DefaultPaperSize Größenname" + +#. type: Plain text +#: cupsd.conf.man.in:275 +msgid "" +"Specifies the default paper size for new print queues. \"Auto\" uses a " +"locale- specific default, while \"None\" specifies there is no default paper " +"size." +msgstr "" +"Gibt die Standardpapiergröße für neue Druckerwarteschlangen an. »Auto« " +"benutzt eine sprachabhängige Vorgabe, während »None« angibt, dass keine " +"Papiergröße vorgegeben ist." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:275 +#, no-wrap +msgid "DefaultPolicy policy-name" +msgstr "DefaultPolicy Richtlinienname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:279 +msgid "Specifies the default access policy to use." +msgstr "Spezifiziert die zu verwendende Standardzugriffsrichtlinie." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:279 +#, no-wrap +msgid "DefaultShared Yes" +msgstr "DefaultShared Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:281 +#, no-wrap +msgid "DefaultShared No" +msgstr "DefaultShared No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:285 +msgid "Specifies whether local printers are shared by default." +msgstr "Spezifiziert, ob lokale Drucker standardmäßig freigegeben sind." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:285 +#, no-wrap +msgid "Deny all" +msgstr "Deny all" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:287 +#, no-wrap +msgid "Deny none" +msgstr "Deny none" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:289 +#, no-wrap +msgid "Deny host.domain.com" +msgstr "Deny Rechner.Domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:291 +#, no-wrap +msgid "Deny *.domain.com" +msgstr "Deny *.domain.com" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:293 +#, no-wrap +msgid "Deny ip-address" +msgstr "Deny IP-Adresse" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:295 +#, no-wrap +msgid "Deny ip-address/netmask" +msgstr "Deny IP-Adresse/Netzmaske" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:297 +#, no-wrap +msgid "Deny ip-address/mm" +msgstr "Deny IP-Adresse/mm" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:299 +#, no-wrap +msgid "Deny @IF(name)" +msgstr "Deny @IF(Name)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:301 +#, no-wrap +msgid "Deny @LOCAL" +msgstr "Deny @LOCAL" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:305 +msgid "Denies access to the named host or address." +msgstr "Verweigert Zugriff auf die benannten Rechner oder Adressen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:305 +#, no-wrap +msgid "DirtyCleanInterval seconds" +msgstr "DirtyCleanInterval Sekunden" + +#. type: Plain text +#: cupsd.conf.man.in:311 +msgid "" +"Specifies the delay for updating of configuration and state files. A value " +"of 0 causes the update to happen as soon as possible, typically within a few " +"milliseconds." +msgstr "" +"Gibt die Verzögerungszeit für die Aktualisierung von Konfigurations- und " +"Statusdateien an. Ein Wert von 0 veranlasst, dass die Aktualisierung so " +"schnell wie möglich erfolgt, typischerweise innerhalb von wenigen " +"Millisekunden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:311 +#, no-wrap +msgid "DocumentRoot directory" +msgstr "DocumentRoot Verzeichnis" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:315 +msgid "Specifies the root directory for the internal web server documents." +msgstr "" +"Spezifiziert das Wurzelverzeichnis für die internen Webserver-Dokumente." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:324 +#, no-wrap +msgid "ErrorLog filename" +msgstr "ErrorLog Dateiname" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:326 +#, no-wrap +msgid "ErrorLog syslog" +msgstr "ErrorLog syslog" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:330 +msgid "Specifies the error log filename." +msgstr "Spezifiziert den Dateinamen des Fehlerprotokolls." + +#. type: TP +#: cupsd.conf.man.in:330 +#, no-wrap +msgid "FatalErrors none" +msgstr "FatalErrors none" + +#. type: TP +#: cupsd.conf.man.in:332 +#, no-wrap +msgid "FatalErrors all -kind [... -kind]" +msgstr "FatalErrors all -kind [... -kind]" + +#. type: TP +#: cupsd.conf.man.in:334 +#, no-wrap +msgid "FatalErrors kind [... kind]" +msgstr "FatalErrors kind [... kind]" + +#. type: Plain text +#: cupsd.conf.man.in:339 +msgid "" +"Specifies which errors are fatal, causing the scheduler to exit. \"Kind\" is " +"\"browse\", \"config\", \"listen\", \"log\", or \"permissions\"." +msgstr "" +"Gibt an, welche Fehler fatal sind und den Zeitplaner zum Beenden " +"veranlassen. »Art« ist »browse«, »config«, »log« oder »permissions«," + +# type: TP +#. type: TP +#: cupsd.conf.man.in:339 +#, no-wrap +msgid "FileDevice Yes" +msgstr "FileDevice Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:341 +#, no-wrap +msgid "FileDevice No" +msgstr "FileDevice No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:346 +msgid "" +"Specifies whether the file pseudo-device can be used for new printer queues." +msgstr "" +"Spezifiziert, ob das Pseudo-Gerät file für neue Druckerwarteschlangen " +"benutzt werden kann." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:346 +#, no-wrap +msgid "FilterLimit limit" +msgstr "FilterLimit Beschränkung" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:350 +msgid "Specifies the maximum cost of filters that are run concurrently." +msgstr "" +"Spezifiziert die maximale Belastung der Filter, die gleichzeitig laufen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:350 +#, no-wrap +msgid "FilterNice nice-value" +msgstr "FilterNice Nice-Wert" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:355 +msgid "" +"Specifies the scheduling priority (\"nice\" value) of filters that are run " +"to print a job." +msgstr "" +"Spezifiziert die Planungspriorität (»nice«-Wert) von Filtern, die laufen, um " +"einen Druckauftrag auszudrucken." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:355 +#, no-wrap +msgid "FontPath directory[:directory:...]" +msgstr "FontPath Verzeichnis[:Verzeichnis:...]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:359 +msgid "Specifies the search path for fonts." +msgstr "Spezifiziert den Suchpfad für Schriften." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:359 +#, no-wrap +msgid "Group group-name-or-number" +msgstr "Group Gruppenname-oder-nummer" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:364 +msgid "" +"Specifies the group name or ID that will be used when executing external " +"programs." +msgstr "" +"Spezifiziert den Gruppenname oder deren ID, die bei der Ausführung externer " +"Programme verwandt wird." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:364 +#, no-wrap +msgid "HideImplicitMembers Yes" +msgstr "HideImplicitMembers Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:366 +#, no-wrap +msgid "HideImplicitMembers No" +msgstr "HideImplicitMembers No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:370 +msgid "Specifies whether to hide members of implicit classes." +msgstr "Spezifiziert, ob Mitglieder impliziter Klassen versteckt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:370 +#, no-wrap +msgid "HostNameLookups On" +msgstr "HostNameLookups On" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:372 +#, no-wrap +msgid "HostNameLookups Off" +msgstr "HostNameLookups Off" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:374 +#, no-wrap +msgid "HostNameLookups Double" +msgstr "HostNameLookups Double" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:378 +msgid "Specifies whether or not to do reverse lookups on client addresses." +msgstr "" +"Spezifiziert, ob inverse Client-Adressabfragen erfolgen sollen oder nicht." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:378 +#, no-wrap +msgid "ImplicitAnyClasses Yes" +msgstr "ImplicitAnyClasses Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:380 +#, no-wrap +msgid "ImplicitAnyClasses No" +msgstr "ImplicitAnyClasses No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:386 +msgid "" +"Specifies whether or not to create implicit classes for local and remote " +"printers, e.g. \"AnyPrinter\" from \"Printer\", \"Printer@server1\", and " +"\"Printer@server2\"." +msgstr "" +"Spezifiziert, ob implizite Klassen für lokale und nicht-lokale Drucker " +"erstellt werden sollen oder nicht, z.B. »AnyPrinter« aus »Printer«, " +"»Printer@server1 und »Printer@server2«." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:386 +#, no-wrap +msgid "ImplicitClasses Yes" +msgstr "ImplicitClasses Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:388 +#, no-wrap +msgid "ImplicitClasses No" +msgstr "ImplicitClasses No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:393 +msgid "" +"Specifies whether or not to create implicit classes from identical remote " +"printers." +msgstr "" +"Spezifiziert, ob implizite Klassen aus identischen nicht-lokalen Druckern " +"erstellt werden sollen oder nicht." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:393 +#, no-wrap +msgid "Include filename" +msgstr "Include Dateiname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:397 +msgid "Includes the named file." +msgstr "Schließt die genannte Datei ein." + +#. type: TP +#: cupsd.conf.man.in:397 +#, no-wrap +msgid "JobKillDelay seconds" +msgstr "JobKillDelay Sekunden" + +#. type: Plain text +#: cupsd.conf.man.in:402 +msgid "" +"Specifies the number of seconds to wait before killing the filters and " +"backend associated with a canceled or held job." +msgstr "" +"Spezifiziert die Anzahl von Sekunden zum Warten, bevor die Filter und " +"Backends beendet werden, die mit einem abgebrochenen oder angehaltenen " +"Druckauftrag verbunden sind." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:402 +#, no-wrap +msgid "JobRetryInterval seconds" +msgstr "JobRetryInterval Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:406 +msgid "Specifies the interval between retries of jobs in seconds." +msgstr "" +"Spezifiziert das Intervall zwischen Neuversuchen von Aufträgen in Sekunden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:406 +#, no-wrap +msgid "JobRetryLimit count" +msgstr "JobRetryLimit Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:410 +msgid "Specifies the number of retries that are done for jobs." +msgstr "" +"Spezifiziert die Anzahl der Neuversuche, die für Auträge durchgeführt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:410 +#, no-wrap +msgid "KeepAlive Yes" +msgstr "KeepAlive Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:412 +#, no-wrap +msgid "KeepAlive No" +msgstr "KeepAlive No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:416 +msgid "Specifies whether to support HTTP keep-alive connections." +msgstr "Spezifiziert, ob HTTP-keep-alive-Verbindungen unterstützt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:416 +#, no-wrap +msgid "KeepAliveTimeout seconds" +msgstr "KeepAliveTimeout Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:420 +msgid "Specifies the amount of time that connections are kept alive." +msgstr "Spezifiziert die Zeit, die Verbindungen am Leben erhalten werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:420 +#, no-wrap +msgid "ELimit operationsE ... E/LimitE" +msgstr "ELimit operationsE ... E/LimitE" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:424 +msgid "Specifies the IPP operations that are being limited inside a policy." +msgstr "" +"Spezifiziert die IPP-Operationen, die innerhalb einer Richtlinie begrenzt " +"werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:424 +#, no-wrap +msgid "ELimit methodsE ... E/LimitE" +msgstr "ELimit methodsE ... E/LimitE" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:426 +#, no-wrap +msgid "ELimitExcept methodsE ... E/LimitExceptE" +msgstr "ELimitExcept methodsE ... E/LimitExceptE" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:430 +msgid "Specifies the HTTP methods that are being limited inside a location." +msgstr "" +"Spezifiziert die HTTP-Methoden, die innerhalb eines Ortes begrenzt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:430 +#, no-wrap +msgid "LimitRequestBody" +msgstr "LimitRequestBody" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:434 +msgid "Specifies the maximum size of any print job request." +msgstr "Spezifiziert die maximale Größe jedes Druckauftrags." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:434 +#, no-wrap +msgid "Listen ip-address:port" +msgstr "Listen IP-Adresse:Port" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:436 +#, no-wrap +msgid "Listen *:port" +msgstr "Listen *:Port" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:438 +#, no-wrap +msgid "Listen /path/to/domain/socket" +msgstr "Listen /pfad/zu/Domain/Socket" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:442 +msgid "Listens to the specified address and port or domain socket path." +msgstr "" +"Warten auf der angegebenen Adresse und Port oder Domain Socket-Pfad auf " +"Anfragen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:442 +#, no-wrap +msgid "ELocation /pathE ... E/LocationE" +msgstr "ELocation /pathE ... E/LocationE" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:446 +msgid "Specifies access control for the named location." +msgstr "Spezifiziert die Zugriffssteuerung für den benannten Ort." + +# type: Plain text +#. type: TP +#: cupsd.conf.man.in:446 +#, no-wrap +msgid "LogDebugHistory #-messages" +msgstr "LogDebugHistory #-messages" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:451 +msgid "" +"Specifies the number of debugging messages that are logged when an error " +"occurs in a print job." +msgstr "" +"Spezifiziert die Anzahl der Fehlersuchnachrichten, die protokolliert werden, " +"wenn ein Fehler in einem Druckauftrag auftritt." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:451 +#, no-wrap +msgid "LogFilePerm mode" +msgstr "LogFilePerm Modus" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:455 +msgid "Specifies the permissions for all log files that the scheduler writes." +msgstr "" +"Spezifiziert die Rechte für alle vom Auftragsplaner (Scheduler) " +"geschriebenen Protokolldateien." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:455 +#, no-wrap +msgid "LogLevel alert" +msgstr "LogLevel alert" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:457 +#, no-wrap +msgid "LogLevel crit" +msgstr "LogLevel crit" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:459 +#, no-wrap +msgid "LogLevel debug2" +msgstr "LogLevel debug2" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:461 +#, no-wrap +msgid "LogLevel debug" +msgstr "LogLevel debug" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:463 +#, no-wrap +msgid "LogLevel emerg" +msgstr "LogLevel emerg" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:465 +#, no-wrap +msgid "LogLevel error" +msgstr "LogLevel error" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:467 +#, no-wrap +msgid "LogLevel info" +msgstr "LogLevel info" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:469 +#, no-wrap +msgid "LogLevel none" +msgstr "LogLevel none" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:471 +#, no-wrap +msgid "LogLevel notice" +msgstr "LogLevel notice" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:473 +#, no-wrap +msgid "LogLevel warn" +msgstr "LogLevel warn" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:477 +msgid "Specifies the logging level for the ErrorLog file." +msgstr "Spezifiziert die Protokollierungsstufe für die ErrorLog-Datei." + +#. type: TP +#: cupsd.conf.man.in:477 +#, no-wrap +msgid "LogTimeFormat standard" +msgstr "LogTimeFormat standard" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:479 +#, no-wrap +msgid "LogTimeFormat usecs" +msgstr "LogTimeFormat usecs" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:483 +msgid "Specifies the format of the date and time in the log files." +msgstr "Spezifiziert das Format von Datum und Zeit in den Protokolldateien." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:483 +#, no-wrap +msgid "MaxClients number" +msgstr "MaxClients Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:487 +msgid "Specifies the maximum number of simultaneous clients to support." +msgstr "" +"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Clients." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:487 +#, no-wrap +msgid "MaxClientsPerHost number" +msgstr "MaxClientsPerHost Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:492 +msgid "" +"Specifies the maximum number of simultaneous clients to support from a " +"single address." +msgstr "" +"Spezifiziert die maximale Anzahl an simulatan zu unterstützenden Clients von " +"einer einzelnen Adresse." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:492 +#, no-wrap +msgid "MaxCopies number" +msgstr "MaxCopies Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:496 +msgid "" +"Specifies the maximum number of copies that a user can print of each job." +msgstr "" +"Spezifiziert die maximale Anzahl an Kopien, die ein Benutzer bei jedem " +"Auftrag drucken kann." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:496 +#, no-wrap +msgid "MaxJobs number" +msgstr "MaxJobs Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:500 +msgid "Specifies the maximum number of simultaneous jobs to support." +msgstr "" +"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:500 +#, no-wrap +msgid "MaxJobsPerPrinter number" +msgstr "MaxJobsPerPrinter Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:504 +msgid "" +"Specifies the maximum number of simultaneous jobs per printer to support." +msgstr "" +"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen " +"pro Drucker." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:504 +#, no-wrap +msgid "MaxJobsPerUser number" +msgstr "MaxJobsPerUser Anzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:508 +msgid "Specifies the maximum number of simultaneous jobs per user to support." +msgstr "" +"Spezifiziert die maximale Anzahl an simultan zu unterstützenden Aufträgen " +"pro Benutzer." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:508 +#, no-wrap +msgid "MaxLogSize number-bytes" +msgstr "MaxLogSize Byteanzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:513 +msgid "" +"Specifies the maximum size of the log files before they are rotated (0 to " +"disable rotation)" +msgstr "" +"Spezifiziert die maximale Größe der Protokolldateien, bevor sie rotiert " +"werden (0 für keine Rotation)." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:513 +#, no-wrap +msgid "MaxRequestSize number-bytes" +msgstr "MaxRequestSize Byteanzahl" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:517 +msgid "Specifies the maximum request/file size in bytes (0 for no limit)" +msgstr "" +"Spezifiziert die maximale Anfrage-/Dateigröße in Bytes (0 für keine " +"Begrenzung)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:517 +#, no-wrap +msgid "MultipleOperationTimeout seconds" +msgstr "MultipleOperationTimeout Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:522 +msgid "" +"Specifies the maximum amount of time to allow between files in a multiple " +"file print job." +msgstr "" +"Spezifiziert die maximal erlaubte Zeit zwischen Dateien in einem " +"Druckauftrag aus mehreren Dateien." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:522 +#, no-wrap +msgid "Order allow,deny" +msgstr "Order allow,deny" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:524 +#, no-wrap +msgid "Order deny,allow" +msgstr "Order deny,allow" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:528 +msgid "Specifies the order of HTTP access control (allow,deny or deny,allow)" +msgstr "" +"Spezifiziert die Reihenfolge der HTTP-Zugriffssteuerung (allow, deny oder " +"deny, allow)" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:528 +#, no-wrap +msgid "PageLog filename" +msgstr "PageLog Dateiname" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:530 +#, no-wrap +msgid "PageLog syslog" +msgstr "PageLog syslog" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:534 +msgid "Specifies the page log filename." +msgstr "Spezifiziert den Dateinamen des Seitenprotokolls." + +#. type: TP +#: cupsd.conf.man.in:534 +#, no-wrap +msgid "PageLogFormat format string" +msgstr "PageLogFormat format string" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:538 +msgid "Specifies the format of page log lines." +msgstr "Spezifiziert das Format der Seitenprotokollzeilen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:538 +#, no-wrap +msgid "PassEnv variable [... variable]" +msgstr "PassEnv Variable [... Variable]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:542 +msgid "Passes the specified environment variable(s) to child processes." +msgstr "Gibt die angegebene(n) Umgebungsvariable(n) an Kindprozesse weiter." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:542 +#, no-wrap +msgid "EPolicy nameE ... E/PolicyE" +msgstr "EPolicy nameE ... E/PolicyE" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:546 +msgid "Specifies access control for the named policy." +msgstr "Spezifiziert die Zugriffskontrolle für die genannte Richtlinie." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:546 +#, no-wrap +msgid "Port number" +msgstr "Port Nummer" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:550 +msgid "Specifies a port number to listen to for HTTP requests." +msgstr "" +"Spezifiziert eine Portnummer, an der auf HTTP-Anfragen gewartet werden soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:550 +#, no-wrap +msgid "PreserveJobFiles Yes" +msgstr "PreserveJobFiles Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:552 +#, no-wrap +msgid "PreserveJobFiles No" +msgstr "PreserveJobFiles No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:556 +msgid "Specifies whether or not to preserve job files after they are printed." +msgstr "" +"Spezifiziert, ob Druckauftragsdateien nach dem Druck aufgehoben werden " +"sollen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:556 +#, no-wrap +msgid "PreserveJobHistory Yes" +msgstr "PreserveJobHistory Yes" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:558 +#, no-wrap +msgid "PreserveJobHistory No" +msgstr "PreserveJobHistory No" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:563 +msgid "" +"Specifies whether or not to preserve the job history after they are printed." +msgstr "" +"Spezifiziert, ob der Verlauf des Druckauftrags nach dem Druck aufgehoben " +"werden soll." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:563 +#, no-wrap +msgid "Printcap" +msgstr "Printcap" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:565 +#, no-wrap +msgid "Printcap filename" +msgstr "Printcap Dateiname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:572 +msgid "" +"Specifies the filename for a printcap file that is updated automatically " +"with a list of available printers (needed for legacy applications); " +"specifying Printcap with no filename disables printcap generation." +msgstr "" +"Spezifiziert den Dateinnamen für eine Printcap-Datei, die automatisch mit " +"einer Liste der verfügbaren Drucker aktualisiert wird (benötigt für alte " +"Programme). Die Angabe von Printcap ohne Dateiname schaltet die Printcap-" +"Generierung aus." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:572 +#, no-wrap +msgid "PrintcapFormat bsd" +msgstr "PrintcapFormat bsd" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:574 +#, no-wrap +msgid "PrintcapFormat plist" +msgstr "PrintcapFormat plist" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:576 +#, no-wrap +msgid "PrintcapFormat solaris" +msgstr "PrintcapFormat solaris" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:580 +msgid "Specifies the format of the printcap file." +msgstr "Spezifiziert das Format der Printcap-Datei." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:580 +#, no-wrap +msgid "PrintcapGUI" +msgstr "PrintcapGUI" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:582 +#, no-wrap +msgid "PrintcapGUI gui-program-filename" +msgstr "PrintcapGUI GUI-Programmdateiname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:588 +msgid "" +"Specifies whether to generate option panel definition files on some " +"operating systems. When provided with no program filename, disables option " +"panel definition files." +msgstr "" +"Spezifiziert, ob Definitionsdateien für die Optionsleiste auf einigen " +"Betriebssystemen generiert werden. Diese Option schaltet " +"Optionsschaltflächendefinitionsdateien aus, wenn sie ohne Dateiname " +"angegeben wird." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:588 +#, no-wrap +msgid "ReloadTimeout seconds" +msgstr "ReloadTimeout Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:593 +msgid "" +"Specifies the amount of time to wait for job completion before restarting " +"the scheduler." +msgstr "" +"Spezifiziert die Zeitspanne, während der auf die Beendigung von Aufträgen " +"gewartet werden soll, bevor der Auftragsplaner (Scheduler) neu gestartet " +"wird." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:593 +#, no-wrap +msgid "RemoteRoot user-name" +msgstr "RemoteRoot Benutzername" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:598 +msgid "" +"Specifies the username that is associated with unauthenticated root accesses." +msgstr "" +"Spezifiziert den Benutzernamen, der mit nicht-authentifiziertem root-Zugang " +"assoziiert ist." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:598 +#, no-wrap +msgid "RequestRoot directory" +msgstr "RequestRoot Verzeichnis" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:603 +msgid "" +"Specifies the directory to store print jobs and other HTTP request data." +msgstr "" +"Spezifiziert das Verzeichnis, in dem Druckaufträge und andere HTTP-" +"Anfragedaten gespeichert werden sollen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:603 +#, no-wrap +msgid "Require group group-name-list" +msgstr "Require group group-name-list" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:605 +#, no-wrap +msgid "Require user user-name-list" +msgstr "Benötigt Benutzer user-name-list" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:607 +#, no-wrap +msgid "Require valid-user" +msgstr "Benötigt valid-user" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:611 +msgid "Specifies that user or group authentication is required." +msgstr "" +"Spezifiziert, dass Benutzer- oder Gruppenauthentifizierung benötigt wird." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:611 +#, no-wrap +msgid "RIPCache bytes" +msgstr "RIPCache Bytes" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:616 +msgid "" +"Specifies the maximum amount of memory to use when converting images and " +"PostScript files to bitmaps for a printer." +msgstr "" +"Spezifiziert die maximale Menge an zu verwendendem Speicher beim " +"Konvertieren von Bilder und PostScript-Dateien in Bitmaps für den Drucker." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:616 +#, no-wrap +msgid "Satisfy all" +msgstr "Satisfy all" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:618 +#, no-wrap +msgid "Satisfy any" +msgstr "Satisfy any" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:623 +msgid "" +"Specifies whether all or any limits set for a Location must be satisfied to " +"allow access." +msgstr "" +"Spezifiziert, ob alle (alle) oder eine (any) Beschränkung für einen Standort " +"erfüllt sein muss, um Zugriff zu erlauben." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:623 +#, no-wrap +msgid "ServerAdmin user@domain.com" +msgstr "ServerAdmin Benutzer@domain.com" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:627 +msgid "Specifies the email address of the server administrator." +msgstr "Spezifiziert die E-Mail-Adresse des Server-Administrators." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:627 +#, no-wrap +msgid "ServerAlias hostname" +msgstr "ServerAlias hostname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:632 +msgid "" +"Specifies an alternate name that the server is known by. The special name \"*" +"\" allows any name to be used." +msgstr "" +"Spezifiziert einen alternativen Namen, unter dem der Server bekannt ist. Der " +"besondere Name »*« erlaubt die Verwendung jedes Namens." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:632 +#, no-wrap +msgid "ServerBin directory" +msgstr "ServerBin Verzeichnis" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:637 +msgid "" +"Specifies the directory where backends, CGIs, daemons, and filters may be " +"found." +msgstr "" +"Spezifiziert das Verzeichnis, in dem Backends, CGIs, Daemons und Filter " +"gefunden werden können." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:637 +#, no-wrap +msgid "ServerCertificate filename" +msgstr "ServerCertificate Dateiname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:641 +msgid "Specifies the encryption certificate to use." +msgstr "Spezifiziert das zu verwendende Verschlüsselungszertifikat." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:641 +#, no-wrap +msgid "ServerKey filename" +msgstr "ServerKey Dateiname" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:645 +msgid "Specifies the encryption key to use." +msgstr "Spezifiziert den zu verwendenden Schlüssel für die Verschlüsselung." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:645 +#, no-wrap +msgid "ServerName hostname-or-ip-address" +msgstr "ServerName Rechnername-oder-IP-Adresse" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:649 +msgid "Specifies the fully-qualified hostname of the server." +msgstr "Spezifiziert den vollqualifizierten Rechnernamen des Servers." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:649 +#, no-wrap +msgid "ServerRoot directory" +msgstr "ServerRoot Verzeichnis" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:653 +msgid "" +"Specifies the directory where the server configuration files can be found." +msgstr "" +"Spezifiziert das Verzeichnis, in dem die Serverkonfiguration gefunden werden " +"kann." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:653 +#, no-wrap +msgid "ServerTokens Full" +msgstr "ServerTokens Full" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:655 +#, no-wrap +msgid "ServerTokens Major" +msgstr "ServerTokens Major" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:657 +#, no-wrap +msgid "ServerTokens Minimal" +msgstr "ServerTokens Minimal" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:659 +#, no-wrap +msgid "ServerTokens Minor" +msgstr "ServerTokens Minor" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:661 +#, no-wrap +msgid "ServerTokens None" +msgstr "ServerTokens None" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:663 +#, no-wrap +msgid "ServerTokens OS" +msgstr "ServerTokens OS" + +# type: TP +#. type: TP +#: cupsd.conf.man.in:665 +#, no-wrap +msgid "ServerTokens ProductOnly" +msgstr "ServerTokens ProductOnly" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:670 +msgid "" +"Specifies what information is included in the Server header of HTTP " +"responses." +msgstr "" +"Spezifiziert, welche Informationen im Server-Header von HTTP-Antworten " +"enthalten sein sollen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:670 +#, no-wrap +msgid "SetEnv variable value" +msgstr "SetEnv Variable Wert" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:674 +msgid "Set the specified environment variable to be passed to child processes." +msgstr "Setzt die angegebene Umgebungsvariable zur Weitergabe an Kindprozesse." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:674 +#, no-wrap +msgid "SSLListen" +msgstr "SSLListen" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:678 +msgid "Listens on the specified address and port for encrypted connections." +msgstr "" +"Wartet auf der angegebenen Adresse und dem Port auf verschlüsselte " +"Verbindungen." + +#. type: TP +#: cupsd.conf.man.in:678 +#, no-wrap +msgid "SSLOptions None" +msgstr "SSLOptions None" + +#. type: TP +#: cupsd.conf.man.in:680 +#, no-wrap +msgid "SSLOptions NoEmptyFragments" +msgstr "SSLOptions NoEmptyFragments" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:684 +msgid "Sets SSL/TLS protocol options for encrypted connections." +msgstr "Setzt SSL/TLS-Protokolloptionen für verschlüsselte Verbindungen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:684 +#, no-wrap +msgid "SSLPort" +msgstr "SSLPort" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:688 +msgid "Listens on the specified port for encrypted connections." +msgstr "Wartet auf dem angegebenen Port auf verschlüsselte Verbindungen." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:688 +#, no-wrap +msgid "SystemGroup group-name [group-name ...]" +msgstr "SystemGroup Gruppenname [Gruppenname ...]" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:692 +msgid "Specifies the group(s) to use for System class authentication." +msgstr "" +"Spezifiziert den/die Gruppe(n), die für Systemklassen-Authentifizierung " +"verwandt werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:692 +#, no-wrap +msgid "TempDir directory" +msgstr "TempDir Verzeichnis" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:696 +msgid "Specifies the directory where temporary files are stored." +msgstr "" +"Spezifiziert das Verzeichnis, in dem temporäre Dateien gespeichert werden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:696 +#, no-wrap +msgid "Timeout seconds" +msgstr "Timeout Sekunden" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:700 +msgid "Specifies the HTTP request timeout in seconds." +msgstr "Spezifiziert die HTTP-Zeitüberschreitung in Sekunden." + +# type: TP +#. type: TP +#: cupsd.conf.man.in:700 +#, no-wrap +msgid "User user-name" +msgstr "User Benutzername" + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:704 +msgid "" +"Specifies the user name or ID that is used when running external programs." +msgstr "" +"Spezifiziert den Benutzernamen oder die ID, die bei der Ausführung externer " +"Programme verwandt wird." + +# type: Plain text +#. type: Plain text +#: cupsd.conf.man.in:708 +msgid "" +"I, I, I, I, " +"I, I," +msgstr "" +"I, I, I, I, " +"I, I," + +# type: TH +#. type: TH +#: cups-deviced.man.in:15 +#, no-wrap +msgid "cups-deviced" +msgstr "cups-deviced" + +# type: TH +#. type: TH +#: cups-deviced.man.in:15 cups-driverd.man.in:15 lpq.man:15 +#, no-wrap +msgid "16 June 2008" +msgstr "16. Juni 2008" + +# type: Plain text +#. type: Plain text +#: cups-deviced.man.in:18 +msgid "cups-deviced - cups device daemon" +msgstr "cups-deviced - CUPS-Geräte-Daemon" + +# type: Plain text +#. type: Plain text +#: cups-deviced.man.in:21 +msgid "B I" +msgstr "B I" + +# type: Plain text +#. type: Plain text +#: cups-deviced.man.in:36 +msgid "" +"I polls the backends in I<@CUPS_SERVERBIN@/backend> for a list " +"of available devices. It is run by I in response to a I request. The output format is an IPP response message. The " +"I argument is the request ID from the original IPP request, " +"typically 1. The I argument is the limit value from the original IPP " +"request - 0 means no limit. The I argument is the requesting-user-" +"name value from the original IPP request. Finally, the I argument " +"is a space-delimited list of attributes (\"name=value name=value ...\") that " +"were passed in with the request. Currently I looks for the " +"I attribute and tailors the output accordingly." +msgstr "" +"I befragt die Backends in I<@CUPS_SERVERBIN@/backend> nach " +"einer Liste verfügbarer Geräte. Es wird von I als Reaktion auf " +"eine I-Anfrage ausgeführt. Die Ausgabe ist ein Nachricht " +"im IPP-Antwort-Format. Das Argument I ist die Anfrage-ID der " +"ursprünglichen IPP-Anfrage, typischerweise 1. Das Argument I ist der " +"Wert der Grenze von der ursprünglichen IPP-Anfrage - 0 bedeutet keine " +"Grenze. Das Argument I ist der Wert des anfragenden Benutzers " +"aus der ursprünglichen IPP-Anfrage. Schließlich ist das Argument I " +"eine leerzeichengetrennte Liste von Attributen (»Name=Wert Name=Wert«), die " +"mit der Anfrage übergeben wurde. Derzeit prüft I auf die " +"I und passt die Ausgabe entsprechend an." + +# type: Plain text +#. type: Plain text +#: cups-deviced.man.in:38 +msgid "backend(7), cupsd(8), cupsd.conf(5)," +msgstr "backend(7), cupsd(8), cupsd.conf(5)," + +# type: TH +#. type: TH +#: cupsd.man.in:15 +#, no-wrap +msgid "cupsd" +msgstr "cupsd" + +# type: TH +#. type: TH +#: cupsd.man.in:15 +#, no-wrap +msgid "9 March 2009" +msgstr "9. März 2009" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:18 +msgid "cupsd - cups scheduler" +msgstr "cupsd - Cups-Autragsplaner" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:23 +msgid "B [ -c I ] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]" +msgstr "B [ -c I ] [ -f ] [ -F ] [ -h ] [ -l ] [ -t ]" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:28 +msgid "" +"I is the scheduler for CUPS. It implements a printing system based " +"upon the Internet Printing Protocol, version 2.1. If no options are " +"specified on the command-line then the default configuration file " +"I<@CUPS_SERVERROOT@/cupsd.conf> will be used." +msgstr "" +"I ist der Auftragsplaner (Scheduler) für das Common UNIX Printing " +"System. Es implementiert ein Drucksystem, das auf dem Internet Printing " +"Protocol Version 2.1 basiert. Falls auf der Befehlszeile keine Optionen " +"angegeben werden, wird stattdessen die Standard-Konfigurationsdatei " +"I<@CUPS_SERVERROOT@/cupsd.conf> verwandt." + +# type: TP +#. type: TP +#: cupsd.man.in:29 cupsfilter.man:40 +#, no-wrap +msgid "-c config-file" +msgstr "-c Konfig-Datei" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:33 +msgid "Uses the named configuration file." +msgstr "Verwende die benannte Konfigurationsdatei." + +# type: TP +#. type: TP +#: cupsd.man.in:33 +#, no-wrap +msgid "-f" +msgstr "-f" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:38 +msgid "" +"Run I in the foreground; the default is to run in the background as a " +"\"daemon\"." +msgstr "" +"Führe I im Vordergrund aus; standardmäßig wird er im Hintergrund als " +"»Daemon« ausgeführt." + +# type: TP +#. type: TP +#: cupsd.man.in:38 +#, no-wrap +msgid "-F" +msgstr "-F" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:44 +msgid "" +"Run I in the foreground but detach the process from the controlling " +"terminal and current directory. This is useful for running I from " +"I." +msgstr "" +"Führe I im Vordergrund aus, aber kopple den Prozess von dem " +"steuernden Terminal und dem aktuellen Verzeichnis ab. Dies ist nützlich, um " +"I von I aus auszuführen." + +# type: TP +#. type: TP +#: cupsd.man.in:44 lpr.man:75 +#, no-wrap +msgid "-h" +msgstr "-h" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:48 +msgid "Shows the program usage." +msgstr "Zeigt die Programm-Verwendung." + +# type: TP +#. type: TP +#: cupsd.man.in:48 lpinfo.man:69 lpoptions.man.in:84 lpq.man:59 lpr.man:80 +#: lpstat.man:87 +#, no-wrap +msgid "-l" +msgstr "-l" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:53 +msgid "This option is passed to I when it is run from I." +msgstr "" +"Diese Option wird an I übergeben, wenn es von I " +"ausgeführt wird." + +# type: TP +#. type: TP +#: cupsd.man.in:53 lpstat.man:112 +#, no-wrap +msgid "-t" +msgstr "-t" + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:57 +msgid "Test the configuration file for syntax errors." +msgstr "Die Konfigurationsdatei auf Syntax-Fehler testen." + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:61 +msgid "" +"I implements all of the required IPP/2.1 attributes and operations. " +"It also implements several CUPS-specific administration operations." +msgstr "" +"I implementiert alle benötigten IPP/2.1-Attribute und Operationen. Es " +"implementiert auch mehrere CUPS-spezifische Administrationsoperationen." + +# type: Plain text +#. type: Plain text +#: cupsd.man.in:66 +msgid "" +"I, I, I, I, " +"I, I, I, I, I, I, I, I," +msgstr "" +"I, I, I, I, " +"I, I, I, I, I, I, I, I," + +# type: TH +#. type: TH +#: cups-driverd.man.in:15 +#, no-wrap +msgid "cups-driverd" +msgstr "cups-driverd" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:18 +msgid "cups-driverd - cups driver daemon" +msgstr "cups-driverd - CUPS-Treiber-Daemon" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:22 +msgid "B cat I" +msgstr "B cat I" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:26 +msgid "B list I" +msgstr "B list I" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:31 +msgid "" +"I shows or lists PPD files. It is run in response to CUPS-Add-" +"Modify-Printer or CUPS-Get-Devices requests. The first form (\"cups-driverd " +"cat ppd-name\") writes the named PPD file to stdout. The output format is an " +"uncompressed PPD file." +msgstr "" +"I zeigt PPD-Dateien an oder listet diese auf. Es wird als " +"Reaktion auf »CUPS-Add-Modify-Printer«- oder »CUPS-Get-Devices«-Anfragen " +"ausgeführt. Die erste Form (»cups-driverd cat PPD-Name«) schreibt die " +"benannte PPD-Datei nach Stdout. Das Ausgabeformat ist eine unkomprimierte " +"PPD-Datei." + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:43 +msgid "" +"The second form lists the available manufacturers or PPD files to stdout as " +"indicated by the I argument. The output format is an IPP response " +"message. The I argument is the request ID from the original IPP " +"request, typically 1. The I argument is the limit value from the " +"original IPP request - 0 means no limit. Finally, the I argument is " +"a space-delimited list of attributes (\"name=value name=value \\&...\") that " +"were passed in with the request. Currently I looks for the " +"I and I attributes and tailors the output " +"accordingly." +msgstr "" +"Die zweite Form listet in der Standardausgabe die verfügbaren Hersteller " +"oder PPD-Dateien auf, wie diese durch das Argument I angegeben " +"sind. Die Ausgabe erfolgt im IPP-Antwortnachrichtenformat. Das Argument " +"I ist die Anfrage-ID der ursprünglichen IPP-Anfrage, " +"typischerweise 1. Das Argument I ist der Grenzwert aus der " +"ursprünglichen IPP-Anfrage - 0 bedeutet keine Grenze. Das Argument " +"I ist schließlich eine durch Leerzeichen getrennte Liste von " +"Attributen (»Name=Wert Name=Wert \\&..«), die mit der Anfrage eingereicht " +"wurden. Derzeit schaut I nach den Attributen I und " +"I und passt die Ausgabe entsprechend an." + +# type: SH +#. type: SH +#: cups-driverd.man.in:43 +#, no-wrap +msgid "DRIVERS" +msgstr "TREIBER" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:51 +msgid "" +"Drivers can be static PPD files under the I<@CUPS_DATADIR@/model> directory " +"or programs under the I<@CUPS_SERVERBIN@/driver> directory. Static PPD files " +"must conform to the Adobe PPD File Format Specification version 4.3 and may " +"be compressed using the I program. Driver programs must implement " +"the command-line interface shown in the next section." +msgstr "" +"Treiber können statische PPD-Dateien unterhalb des Verzeichnisses " +"I<@CUPS_DATADIR@/model> oder Programme unterhalb des Verzeichnisses " +"I<@CUPS_SERVERBIN@/driver> sein. Statische PPD-Dateien müssen der Adobe PPD " +"File Format Specification Version 4.3 folgen und können mittels I " +"komprimiert sein. Treiberprogramme müssen die in dem nächsten Abschnitt " +"beschriebene Befehlszeilenschnittstelle implementieren." + +# type: SS +#. type: SS +#: cups-driverd.man.in:51 +#, no-wrap +msgid "DRIVER PROGRAMS" +msgstr "TREIBER-PROGRAMME" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:54 +msgid "" +"Driver programs provide an interface to dynamically-generated PPD files. The " +"following arguments are currently defined:" +msgstr "" +"Treiberprogramme stellen eine Schnittstelle für dynamisch-generierte PPD-" +"Dateien bereit. Die folgenden Argumente sind aktuell definiert:" + +# type: TP +#. type: TP +#: cups-driverd.man.in:54 +#, no-wrap +msgid "drivername list" +msgstr "drivername list" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:58 +msgid "Lists the supported PPD files to stdout." +msgstr "Listet die unterstützten PPD-Dateien auf der Standardausgabe auf." + +# type: TP +#. type: TP +#: cups-driverd.man.in:58 +#, no-wrap +msgid "drivername cat ppdname" +msgstr "drivername cat PPD-Name" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:62 +msgid "Writes the named PPD file to stdout." +msgstr "Schreibt die benannte PPD-Datei auf die Standardausgabe." + +# type: SS +#. type: SS +#: cups-driverd.man.in:62 +#, no-wrap +msgid "LISTING FILES (drivername list)" +msgstr "DATEIEN AUFLISTEN (Treibernamenliste)" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:66 +msgid "" +"When run with the single argument \"list\", the program must list the " +"available PPD files it can generate to stdout using the following format:" +msgstr "" +"Beim Aufruf mit dem einzelnen Argument »list« muss das Programm die " +"verfügbaren PPD-Dateien, die es auf die Standardausgabe generieren kann, im " +"folgenden Format auflisten:" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:68 +#, no-wrap +msgid " \"drivername:ppdname\" language \"make\" \"make and model\" \"1284 device id\"\n" +msgstr " »Treibername:PPD-Name« Sprache »Marke« »Marke und Modell« »1284-Geräte-ID«\n" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:77 +msgid "" +"I is the name of the driver program. I is the name used " +"to select the given driver. I is the locale associated with the " +"default language of the PPD file, typically \"en\". I is the " +"Manufacturer name from the PPD file. I is the NickName name " +"from the PPD file. I<1284 device id> is the 1284DeviceId from the PPD file, " +"if any." +msgstr "" +"I ist der Name des Treiberprogramms. I ist der Name, " +"der zur Auswahl des gegebenen Treibers verwandt wird. I ist die mit " +"der Standardsprache der PPD-Datei assoziierte Lokale (Standorteinstellung), " +"typischerweise »en«. I ist der Herstellername aus der PPD-Datei. " +"I ist der »NickName« aus der PPD-Datei. I<1284-Geräte-ID> " +"ist die 1284DeviceId aus der PPD-Datei, falls vorhanden." + +# type: SS +#. type: SS +#: cups-driverd.man.in:77 +#, no-wrap +msgid "WRITING FILES (drivername cat ppdname)" +msgstr "DATEIEN SCHREIBEN (drivername cat PPD-Name)" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:82 +msgid "" +"When the driver program is run with the \"cat ppdname\" arguments, it must " +"write the named PPD file to stdout, uncompressed. If the named PPD file does " +"not exist, the driver program must not write any output to stdout and report " +"the error to stderr instead." +msgstr "" +"Wenn das Treiberprogramm mit den Argumenten »cat PPD-Name« ausgeführt wird, " +"muss es die benannte PPD-Datei unkomprimiert nach StdOut schreiben. Falls " +"die benannte PPD-Datei nicht existiert, so darf das Treiberprogramm nichts " +"auf die Standardausgabe schreiben und muss stattdessen alle Fehler auf " +"Stderr melden." + +# type: SS +#. type: SS +#: cups-driverd.man.in:82 +#, no-wrap +msgid "DRIVER ERROR MESSAGES" +msgstr "TREIBERFEHLERMELDUNGEN" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:85 +msgid "" +"Error messages can be relayed back to I by writing them to stderr. " +"The following prefixes are recognized:" +msgstr "" +"Fehlernachrichten können an I zurückgeleitet werden, indem Sie auf " +"Stderr geschrieben werden. Die folgenden Präfixe werden erkannt:" + +# type: TP +#. type: TP +#: cups-driverd.man.in:85 +#, no-wrap +msgid "DEBUG: [drivername]" +msgstr "DEBUG: [Treibername]" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:89 +msgid "Debugging messages" +msgstr "Fehlersuchenachrichten" + +# type: TP +#. type: TP +#: cups-driverd.man.in:89 +#, no-wrap +msgid "ERROR: [drivername]" +msgstr "ERROR: [Treibername]" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:93 +msgid "Error messages" +msgstr "Fehlermeldungen" + +# type: TP +#. type: TP +#: cups-driverd.man.in:93 +#, no-wrap +msgid "INFO: [drivername]" +msgstr "INFO: [Treibername]" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:97 +msgid "Informational messages" +msgstr "Informative Nachrichten" + +# type: Plain text +#. type: Plain text +#: cups-driverd.man.in:99 +msgid "cupsd(8), cupsd.conf(5), cupstestppd(1)," +msgstr "cupsd(8), cupsd.conf(5), cupstestppd(1)," + +# type: TH +#. type: TH +#: cupsenable.man:16 +#, no-wrap +msgid "cupsenable" +msgstr "cupsenable" + +# type: TH +#. type: TH +#: cupsenable.man:16 +#, no-wrap +msgid "9 October 2008" +msgstr "9. Oktober 2008" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:19 +msgid "cupsdisable, cupsenable - stop/start printers and classes" +msgstr "cupsdisable, cupsenable - beenden/starten von Druckern und Klassen" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:28 +msgid "" +"B [ -E ] [-U I ] [ -c ] [ -h I ] [ -r " +"I ] [ --hold ] destination(s)" +msgstr "" +"B [ -E ] [-U I ] [ -c ] [ -h I ] " +"[ -r I [ --hold ] ] Ziel(e)" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:35 +msgid "" +"B [ -E ] [-U I ] [ -c ] [ -h I ] [ --" +"release ] destination(s)" +msgstr "" +"B [ -E ] [-U I ] [ -c ] [ -h I ] " +"[ --release ] Ziel(e)" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:37 +msgid "I starts the named printers or classes." +msgstr "I startet den benannten Drucker oder die benannte Klasse." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:40 +msgid "" +"I stops the named printers or classes. The following options " +"may be used:" +msgstr "" +"I beendet den benannten Drucker oder die benannte Klasse. Die " +"folgenden Optionen dürfen verwandt werden:" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:44 +msgid "Forces encryption of the connection to the server." +msgstr "Erzwingt Verschlüsselung der Verbindung zum Server." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:48 +msgid "Uses the specified username when connecting to the server." +msgstr "Verwendet den angegebenen Benutzernamen bei Verbindungen zum Server." + +# type: TP +#. type: TP +#: cupsenable.man:48 lp.man:85 +#, no-wrap +msgid "-c" +msgstr "-c" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:52 +msgid "Cancels all jobs on the named destination." +msgstr "Bricht alle Aufträge auf dem benannten Ziel ab." + +# type: TP +#. type: TP +#: cupsenable.man:52 lpinfo.man:65 lpmove.man:54 lpoptions.man.in:80 +#: lpq.man:55 lprm.man:49 lpstat.man:83 +#, no-wrap +msgid "-h server[:port]" +msgstr "-h Server[:Port]" + +# type: Plain text +#. type: Plain text +#: cupsenable.man:56 +msgid "Uses the specified server and port." +msgstr "Verwendet den angegebenen Server und Port." + +# type: TP +#. type: TP +#: cupsenable.man:56 +#, no-wrap +msgid "--hold" +msgstr "--hold" + +#. type: Plain text +#: cupsenable.man:61 +msgid "" +"Holds remaining jobs on the named printer. Useful for allowing the current " +"job to complete before performing maintenance." +msgstr "" +"Die verbleibenden Druckaufträge auf dem genannten Drucker anhalten. " +"Nützlich, um dem aktuellen Druckauftrag die Fertigstellung zu erlauben, wenn " +"danach Wartungsarbeiten durchgeführt werden sollen." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:66 +msgid "" +"Sets the message associated with the stopped state. If no reason is " +"specified then the message is set to \"Reason Unknown\"." +msgstr "" +"Setzt die dem Beendet-Zustand zugeordnete Nachricht. Falls kein Grund " +"spezifiziert ist, wird die Nachricht auf »Reason Unknown« gesetzt." + +#. type: TP +#: cupsenable.man:66 +#, no-wrap +msgid "--release" +msgstr "--release" + +#. type: Plain text +#: cupsenable.man:71 +msgid "" +"Releases pending jobs for printing. Use after running I with " +"the I<--hold> option to resume printing." +msgstr "" +"Gibt wartende Aufträge zum Drucken frei. Benutzen Sie es nach der Ausführung " +"von I mit der Option I<--hold>, um das Drucken fortzusetzen." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:79 +msgid "" +"The System V versions of these commands are I and I. They " +"have been renamed to avoid conflicts with the I build-in commands " +"of the same name." +msgstr "" +"Die System-V-Versionen dieser Befehle sind I und I. Sie " +"wurden umbenannt, um Konflikte mit den eingebauten Befehlen gleichen Namens " +"der I zu vermeiden." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:84 +msgid "" +"The CUPS versions of I and I may ask the user for an access " +"password depending on the printing system configuration. This differs from " +"the System V versions which require the root user to execute these commands." +msgstr "" +"Die CUPS-Versionen von I und I könnten den Benutzer, " +"abhängig von der Konfiguration des Drucksystems, nach einem Zugriffspasswort " +"fragen. Dies unterscheidet sich von der System-V-Version, die verlangt, dass " +"der Benutzer root diese Befehle ausführt." + +# type: Plain text +#. type: Plain text +#: cupsenable.man:87 +msgid "" +"I, I, I, I, I, " +"I," +msgstr "" +"I, I, I, I, I, " +"I," + +# type: TH +#. type: TH +#: cupsfilter.man:14 +#, no-wrap +msgid "cupsfilter" +msgstr "cupsfilter" + +# type: TH +#. type: TH +#: cupsfilter.man:14 +#, no-wrap +msgid "26 February 2009" +msgstr "26. Februar 2009" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:17 +msgid "cupsfilter - convert a file to another format using cups filters" +msgstr "" +"cupsfilter - konvertiere eine Datei in ein anderes Format mittels CUPS-Filter" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:35 +msgid "" +"B [ -c I ] [ -e ] -j I [ -m I ] [ -n I ] [ -o I ] [ -p I ] [ -t " +"I ] I<filename>" +msgstr "" +"B<cupsfilter> [ -c I<Konfig-Datei> ] [ -e ] -j I<Auftrags-ID[,N]> [ -m " +"I<MIME/Typ> ] [ -n I<Kopien> ] [ -o I<Name=Wert> ] [ -p I<Dateiname.ppd> ] " +"[ -t I<Titel> ] I<Dateiname>" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:39 +msgid "" +"I<cupsfilter> is a front-end to the CUPS filter subsystem which allows you " +"to convert a file to a specific format, just as if you had printed the file " +"through CUPS. By default, I<cupsfilter> generates a PDF file." +msgstr "" +"I<cupsfilter> ist eine Oberfläche für das CUPS-Filter-Subsystem, das es " +"erlaubt, eine Datei in ein spezielles Format umzuwandeln, als ob Sie diese " +"Datei mittels CUPS gedruckt hätten. Standardmäßig erzeugt I<cupsfilter> eine " +"PDF-Datei." + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:44 +msgid "Uses the named cupsd.conf configuration file." +msgstr "Verwendet die benannte cupsd.conf-Konfigurationsdatei." + +#. type: TP +#: cupsfilter.man:44 +#, no-wrap +msgid "-e" +msgstr "-e" + +#. type: Plain text +#: cupsfilter.man:48 +msgid "Use every filter from the PPD file." +msgstr "Verwende jeden Filter aus der PPD-Datei." + +# type: TP +#. type: TP +#: cupsfilter.man:48 +#, no-wrap +msgid "-j job-id[,N]" +msgstr "-i Auftrags-ID[,N]" + +#. type: Plain text +#: cupsfilter.man:53 +msgid "" +"Converts document N from the specified job. If N is omitted, document 1 is " +"converted." +msgstr "" +"Konvertiert Dokument aus dem spezifizierten Druckauftrag. Wenn N ausgelassen " +"wird, wird Dokument 1 konvertiert." + +# type: TP +#. type: TP +#: cupsfilter.man:53 +#, no-wrap +msgid "-m mime/type" +msgstr "-m MIME/Typ" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:59 +msgid "" +"Specifies the destination file type. The default file type is application/" +"pdf. Use printer/foo to convert to the printer format defined by the " +"filters in the PPD file." +msgstr "" +"Spezifiziert den Zieldateityp. Standardmäßig ist dies application/pdf. " +"Verwenden Sie Drucker/foo, um zu dem Druckerformat, wie es von den Filtern " +"in der PPD-Datei definiert ist, zu konvertieren." + +# type: TP +#. type: TP +#: cupsfilter.man:59 lp.man:109 +#, no-wrap +msgid "-n copies" +msgstr "-n Kopien" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:63 +msgid "Specifies the number of copies to generate." +msgstr "Spezifiziert die Anzahl der zu erstellenden Kopien." + +# type: TP +#. type: TP +#: cupsfilter.man:63 cups-lpd.man.in:73 lpadmin.man:106 +#, no-wrap +msgid "-o name=value" +msgstr "-o Name=Wert" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:67 +msgid "Specifies options to pass to the CUPS filters." +msgstr "Spezifiziert die an die CUPS-Filter zu übergebenden Optionen." + +# type: TP +#. type: TP +#: cupsfilter.man:67 +#, no-wrap +msgid "-p filename.ppd" +msgstr "-p Dateiname.ppd" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:71 +msgid "Specifies the PPD file to use." +msgstr "Spezifiziert die zu verwendende PPD-Datei." + +# type: TP +#. type: TP +#: cupsfilter.man:71 +#, no-wrap +msgid "-t title" +msgstr "-t Titel" + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:75 +msgid "Specifies the document title." +msgstr "Spezifiziert den Dokumententitel." + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:78 +msgid "" +"I<cupsfilter> currently does not use the filters defined in the PPD file. " +"This will be addressed in a future CUPS release." +msgstr "" +"I<cupsfilter> verwendet derzeit die in der PPD-Datei definierten Filter " +"nicht. Dies wird in zukünftigen Veröffentlichungen von CUPS berücksichtigt." + +# type: Plain text +#. type: Plain text +#: cupsfilter.man:80 +msgid "I<cupsd.conf(5)>" +msgstr "I<cupsd.conf(5)>" + +# type: TH +#. type: TH +#: cups-lpd.man.in:15 +#, no-wrap +msgid "cups-lpd" +msgstr "cups-lpd" + +#. type: TH +#: cups-lpd.man.in:15 +#, no-wrap +msgid "4 August 2008" +msgstr "4. August 2008" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:18 +msgid "cups-lpd - receive print jobs and report printer status to lpd clients" +msgstr "" +"cups-lpd - empfange Druckaufträge und berichte Druckerstatus an lpd-Clients" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:25 +msgid "B<cups-lpd> [ -h I<hostname[:port]> ] [ -n ] [ -o I<option=value> ]" +msgstr "B<cups-lpd> [ -h I<Rechnername[:Port]> ] [ -n ] [ -o I<Option=Wert> ]" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:33 +msgid "" +"I<cups-lpd> is the CUPS Line Printer Daemon (\"LPD\") mini-server that " +"supports legacy client systems that use the LPD protocol. I<cups-lpd> does " +"not act as a standalone network daemon but instead operates using the " +"Internet \"super-server\" I<inetd(8)> or I<xinetd(8)>. If you are using " +"I<inetd>, add the following line to the I<inetd.conf> file to enable the " +"I<cups-lpd> mini-server:" +msgstr "" +"I<cups-lpd> ist der CUPS-Line-Printer-Daemon (»LPD«)-Mini-Server, der alte " +"Client-Systeme unterstützt, die das LPD-Protokoll benutzen. I<cups-lpd> " +"agiert nicht als selbstständiger Netzwerk-Daemon, aber stattdessen benutzt " +"es den Internet-»Super-Server« I<inetd(8)> oder I<xinetd(8)>. Falls Sie " +"I<inetd> benutzen, fügen Sie die folgende Zeile zur I<inetd.conf>-Datei " +"hinzu, um den I<cups-lpd>-Mini-Server einzuschalten:" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:38 +#, no-wrap +msgid "" +" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" +" -o document-format=application/octet-stream\n" +msgstr "" +" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" +" -o document-format=application/octet-stream\n" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:44 +msgid "" +"B<Note:> If you are using Solaris 10 or higher, you must run the I<inetdconv" +"(1m)> program to register the changes to the inetd.conf file." +msgstr "" +"B<Hinweis:> Falls Sie Solaris 10 oder höher betreiben, müssen Sie das " +"Programm I<inetdconv(1m)> ausführen, um die Änderungen an der Datei inetd." +"conf zu registrieren." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:47 +msgid "" +"If you are using the newer I<xinetd(8)> daemon, create a file named I</etc/" +"xinetd.d/cups> containing the following lines:" +msgstr "" +"Falls Sie den neueren Daemon I<xinetd(8)> verwenden, erstellen Sie eine " +"Datei mit Namen I</etc/xinetd.d/cups> und dem folgenden Inhalt:" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:61 +#, no-wrap +msgid "" +" service printer\n" +" {\n" +" socket_type = stream\n" +" protocol = tcp\n" +" wait = no\n" +" user = lp\n" +"\tgroup = sys\n" +"\tpassenv =\n" +" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" +"\tserver_args = -o document-format=application/octet-stream\n" +" }\n" +msgstr "" +" service printer\n" +" {\n" +" socket_type = stream\n" +" protocol = tcp\n" +" wait = no\n" +" user = lp\n" +"\tgroup = sys\n" +"\tpassenv =\n" +" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" +"\tserver_args = -o document-format=application/octet-stream\n" +" }\n" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:67 +msgid "Sets the CUPS server (and port) to use." +msgstr "Setzt den zu benutzenden CUPS-Server (und Port)." + +# type: TP +#. type: TP +#: cups-lpd.man.in:67 +#, no-wrap +msgid "-n" +msgstr "-n" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:73 +msgid "" +"Disables reverse address lookups; normally I<cups-lpd> will try to discover " +"the hostname of the client via a reverse DNS lookup." +msgstr "" +"Deaktiviert inverse Adressabfragen, normalerweise wird I<cups-lpd> " +"versuchen, den Rechnernamen eines Clients über inverse DNS-Abfragen zu " +"ermitteln." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:81 +msgid "" +"Inserts options for all print queues. Most often this is used to disable the " +"\"l\" filter so that remote print jobs are filtered as needed for printing; " +"the examples in the previous section set the \"document-format\" option to " +"\"application/octet-stream\" which forces autodetection of the print file " +"format." +msgstr "" +"Fügt Optionen für alle Druckerwarteschlangen ein. Meistens wird dies zur " +"Deaktivierung des Filters »l« verwandt, so dass nicht-lokale Druckaufträge " +"wie für den Druck benötigt gefiltert werden. Die Beispiele im vorherigen " +"Abschnitt setzten die Option »document-format« auf »application/octet-" +"stream«, womit die automatische Erkennung des Druckdateiformats erzwungen " +"wird." + +# type: SH +#. type: SH +#: cups-lpd.man.in:81 +#, no-wrap +msgid "PERFORMANCE" +msgstr "DURCHSATZ" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:88 +msgid "" +"I<cups-lpd> performs well with small numbers of clients and printers. " +"However, since a new process is created for each connection and since each " +"process must query the printing system before each job submission, it does " +"not scale to larger configurations. We highly recommend that large " +"configurations use the native IPP support provided by CUPS instead." +msgstr "" +"I<cups-lpd> läuft gut mit einer kleinen Anzahl an Clients und Druckern. Da " +"allerdings für jede Verbindung ein Prozess erstellt wird und jeder Prozess " +"das Drucksystem vor Einreichen jedes Auftrags abfragen muss, ist es schlecht " +"an größere Konfigurationen angepasst. Wir empfehlen nachdrücklich, dass " +"große Konfigurationen die von CUPS direkt bereitgestellte IPP-Unterstützung " +"verwenden." + +# type: SH +#. type: SH +#: cups-lpd.man.in:88 +#, no-wrap +msgid "SECURITY" +msgstr "SICHERHEIT" + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:95 +msgid "" +"I<cups-lpd> currently does not perform any access control based on the " +"settings in I<cupsd.conf(5)> or in the I<hosts.allow(5)> or I<hosts.deny(5)> " +"files used by TCP wrappers. Therefore, running I<cups-lpd> on your server " +"will allow any computer on your network (and perhaps the entire Internet) to " +"print to your server." +msgstr "" +"I<cups-lpd> führt derzeit keine auf den Einstellungen in I<cupsd.conf(5)> " +"oder in den von TCP-Wrappers verwandten Dateien I<hosts.allow(5)> oder " +"I<hosts.deny(5)> basierte Zugriffskontrolle durch. Daher wird die Ausführung " +"von I<cups-lpd> auf Ihrem Server es allen Computern in Ihrem Netz (und " +"möglicherweise allen im Internet) erlauben, auf Ihrem Server zu drucken." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:100 +msgid "" +"While I<xinetd> has built-in access control support, you should use the TCP " +"wrappers package with I<inetd> to limit access to only those computers that " +"should be able to print through your server." +msgstr "" +"Obwohl I<xinetd> über eingebaute Zugriffskontrolle verfügt, sollten Sie das " +"Paket TCP-Wrappers mit I<inetd> verwenden, um den Zugriff auf solche " +"Computer zu beschränken, denen es erlaubt sein soll, über Ihren Server zu " +"drucken." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:104 +msgid "" +"I<cups-lpd> is not enabled by the standard CUPS distribution. Please " +"consult with your operating system vendor to determine whether it is enabled " +"on your system." +msgstr "" +"I<cups-lpd> wird von der Standard-CUPS-Distribution nicht aktiviert. Bitte " +"fragen Sie beim Betriebssystem-Vertreiber nach, ob es auf Ihrem System " +"aktiviert ist oder nicht." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:110 +msgid "" +"I<cups-lpd> does not enforce the restricted source port number specified in " +"RFC 1179, as using restricted ports does not prevent users from submitting " +"print jobs. While this behavior is different than standard Berkeley LPD " +"implementations, it should not affect normal client operations." +msgstr "" +"I<cups-lpd> erzwingt die in RFC 1179 spezifizierte eingeschränkte " +"Quellportnummer nicht, da eingeschränkte Ports Benutzer nicht vom Einreichen " +"von Druckaufträgen abhalten. Obwohl dieses Verhalten sich von " +"standardmäßigen Berkeley-LPD-Implementierungen unterscheidet, sollte es den " +"normalen Betrieb von Clients nicht betreffen." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:115 +msgid "" +"The output of the status requests follows RFC 2569, Mapping between LPD and " +"IPP Protocols. Since many LPD implementations stray from this definition, " +"remote status reporting to LPD clients may be unreliable." +msgstr "" +"Die Ausgabe der Statusabfragen folgt RFC 2569 »Mapping between LPD and IPP " +"Protocols«. Da viele LPD-Implementierungen von dieser Definition abweichen, " +"könnte die nicht-lokale Statusberichterstattung an LDP-Clients unzuverlässig " +"sein." + +# type: Plain text +#. type: Plain text +#: cups-lpd.man.in:118 +msgid "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," +msgstr "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," + +# type: TH +#. type: TH +#: cups-polld.man:15 +#, no-wrap +msgid "cups-polld" +msgstr "cups-polld" + +# type: Plain text +#. type: Plain text +#: cups-polld.man:18 +msgid "cups-polld - cups printer polling daemon" +msgstr "cups-polld - CUPS-Druckerabfrage-Daemon" + +# type: Plain text +#. type: Plain text +#: cups-polld.man:21 +msgid "B<cups-polld> I<address ipp-port interval browse-port>" +msgstr "B<cups-polld> I<Adresse IPP-Port Intervall Port-für-Durchsuchung>" + +# type: Plain text +#. type: Plain text +#: cups-polld.man:27 +msgid "" +"I<cups-polld> polls remote servers for a list of available printers and " +"printer classes every I<interval> seconds. Printer and class information is " +"then broadcast to the localhost interface (127.0.0.1) on the specified " +"browse port for reception by I<cupsd(8)>." +msgstr "" +"I<cups-polld> fragt alle I<interval> Sekunden ferne Server ab, um eine Liste " +"verfügbarer Drucker und Druckerklassen zu erhalten. Drucker- und " +"Klasseninformationen werden dann an die Localhost-Schnittstelle (127.0.0.1) " +"auf dem angegebenen Port für die Durchsuchung für den Empfang durch I<cupsd" +"(8)> gesendet." + +# type: Plain text +#. type: Plain text +#: cups-polld.man:30 +msgid "" +"This program is started automatically by I<cupsd> for every I<BrowsePoll> " +"directive found in the I<cupsd.conf(5)> file." +msgstr "" +"Dieses Programm wird von I<cupsd> für jede in der Datei I<cupsd.conf(5)> " +"gefundene Direktive I<BrowsePoll> gestartet." + +# type: Plain text +#. type: Plain text +#: cups-polld.man:32 +msgid "I<cupsd(8)>, I<cupsd.conf(5)>," +msgstr "I<cupsd(8)>, I<cupsd.conf(5)>," + +# type: TH +#. type: TH +#: cups-snmp.conf.man:15 +#, no-wrap +msgid "snmp.conf" +msgstr "snmp.conf" + +# type: TH +#. type: TH +#: cups-snmp.conf.man:15 +#, no-wrap +msgid "31 July 2006" +msgstr "31. Juli 2006" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:18 +msgid "snmp.conf - snmp configuration file for cups" +msgstr "snmp.conf - SNMP-Konfigurationsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:24 +msgid "" +"The I<snmp.conf> file configures the CUPS SNMP printer discovery backend and " +"is normally located in the I</etc/cups> directory. Each line in the file can " +"be a configuration directive, a blank line, or a comment. Comment lines " +"start with the # character." +msgstr "" +"Die Datei I<snmp.conf> konfiguriert das SNMP-Drucker-Ermittlungs-Backend von " +"CUPS und befindet sich normalerweise im Verzeichnis I</etc/cups>. Jede Zeile " +"in der Datei kann eine Konfigurationsdirektive, eine Leerzeile oder ein " +"Kommentar sein. Kommentarzeilen beginnen mit dem Zeichen »#«." + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:30 +msgid "" +"The SNMP backend uses the SNMPv1 protocol to discover network printers, " +"collecting information from the Host MIB along with intelligent port probes " +"to determine the correct device URI and make and model for each printer. " +"Future versions of CUPS will likely support the new Port Monitor MIB as well." +msgstr "" +"Das SNMP-Backend benutzt das SNMPv1-Protokoll, um Netzwerkdrucker zu suchen, " +"Informationen vom MIB-Host zu sammeln, zusammen mit intelligenten Port-" +"Untersuchungen, um für jeden Drucker die korrekte Geräte-URI, Hersteller und " +"Modell zu bestimmen. Zukünftige Versionen von CUPS werden wahrscheinlich " +"auch den neuen Port-Monitor MIB unterstützen." + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:33 +msgid "" +"The following directives are understood by the SNMP backend. Consult the on-" +"line help for detailed descriptions:" +msgstr "" +"Die folgenden Direktiven werden vom SNMP-Backend verstanden. Für eine " +"detaillierte Beschreibung schauen Sie bitte in die Online-Hilfe:" + +# type: TP +#. type: TP +#: cups-snmp.conf.man:33 +#, no-wrap +msgid "Address @IF(I<name>)" +msgstr "Address @IF(I<Name>)" + +# type: TP +#. type: TP +#: cups-snmp.conf.man:35 +#, no-wrap +msgid "Address @LOCAL" +msgstr "Address @LOCAL" + +# type: TP +#. type: TP +#: cups-snmp.conf.man:37 +#, no-wrap +msgid "Address I<address>" +msgstr "Address I<Adresse>" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:43 +msgid "" +"Sends SNMP broadcast queries to the specified address(es). The default " +"address is \"@LOCAL\" which broadcasts to all LAN interfaces." +msgstr "" +"Sendet SNMP-Übertragungsanfragen an die angegebene(n) Adresse(n). Die " +"Vorgabeadresse ist »@LOCAL«, die an alle LAN-Schnittstellen überträgt." + +# type: TP +#. type: TP +#: cups-snmp.conf.man:43 +#, no-wrap +msgid "Community I<name>" +msgstr "Community I<Name>" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:48 +msgid "" +"Specifies a SNMP community to query. The default community is \"public\"." +msgstr "" +"Spezifiziert die SNMP-Gemeinschaft zum Abfragen. Die Vorgabegemeinschaft ist " +"»public«." + +# type: TP +#. type: TP +#: cups-snmp.conf.man:48 +#, no-wrap +msgid "DebugLevel I<N>" +msgstr "DebugLevel I<N>" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:54 +msgid "" +"Sets the debug logging level to I<N>; 0 disables debug logging, 1 enables " +"basic logging, 2 displays SNMP values, and 3 displays raw hex data." +msgstr "" +"Setzt die Fehlersucheprotokollierstufe auf I<N>; 0 deaktiviert das " +"Fehlersucheprotokollieren, 1 aktiviert grundlegendes Protokollieren, 2 zeigt " +"SNMP-Werte und 3 zeigt rohe hexadezimale Daten." + +# type: TP +#. type: TP +#: cups-snmp.conf.man:54 +#, no-wrap +msgid "HostNameLookups on" +msgstr "HostNameLookups on" + +# type: TP +#. type: TP +#: cups-snmp.conf.man:56 +#, no-wrap +msgid "HostNameLookups off" +msgstr "HostNameLookups off" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:62 +msgid "" +"Specifies whether the addresses of printers should be converted to hostnames " +"or left as numeric IP addresses. The default is \"off\"." +msgstr "" +"Spezifiziert, ob die Druckeradressen in Rechnernamen konvertiert werden oder " +"als numerische IP-Adressen verbleiben sollen. Der Vorgabewert ist »off«." + +# type: TP +#. type: TP +#: cups-snmp.conf.man:62 +#, no-wrap +msgid "MaxRunTime I<seconds>" +msgstr "MaxRunTime I<Sekunden>" + +# type: Plain text +#. type: Plain text +#: cups-snmp.conf.man:67 +msgid "" +"Specifies the maximum number of seconds that the SNMP backend will scan the " +"network for printers." +msgstr "" +"Spezifiziert die maximale Zeit in Sekunden, für die das SNMP-Backend das " +"Netz nach Druckern durchsuchen wird." + +# type: TH +#. type: TH +#: cupstestdsc.man:15 +#, no-wrap +msgid "cupstestdsc" +msgstr "cupstestdsc" + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:18 +msgid "cupstestdsc - test conformance of postscript files" +msgstr "cupstestdsc - überprüfe Konformität von PostScript-Dateien" + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:23 +msgid "B<cupstestdsc> [ -h ] filename.ps [ ... I<filenameN.ps> ]" +msgstr "B<cupstestdsc> [ -h ] Dateiname.ps [ ... I<DateinameN.ps> ]" + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:26 +msgid "B<cupstestdsc> [ -h ] -" +msgstr "B<cupstestdsc> [ -h ] -" + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:32 +msgid "" +"I<cupstestdsc> tests the conformance of PostScript files to the Adobe " +"PostScript Language Document Structuring Conventions Specification version " +"3.0. The results of testing and any other output are sent to the standard " +"output. The second form of the command reads PostScript from the standard " +"input." +msgstr "" +"I<cupstestdsc> überprüft die Konformität von PostScript-Dateien zu der Adobe " +"PostScript Language Document Structuring Conventions Specification Version " +"3.0. Das Ergebnis des Tests und alle anderen Ausgaben werden an die " +"Standardausgabe gesandt. Die zweite Form des Befehls liest PostScript von " +"der Standardeingabe." + +# type: SH +#. type: SH +#: cupstestdsc.man:32 lpadmin.man:196 lpc.man:53 +#, no-wrap +msgid "LIMITATIONS" +msgstr "EINSCHRÄNKUNGEN" + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:41 +msgid "" +"I<cupstestdsc> only validates the DSC comments in a PostScript file and does " +"not attempt to validate the PostScript code itself. Developers must ensure " +"that the PostScript they generate follows the rules defined by Adobe. " +"Specifically, all pages must be independent of each other, code outside page " +"descriptions may not affect the graphics state (current font, color, " +"transform matrix, etc.), and device-specific commands such as setpagedevice " +"should not be used." +msgstr "" +"I<cupstestdsc> validiert nur die DSC-Kommentare in einer PostScript-Datei " +"und versucht nicht, den PostScript-Code selbst zu validieren. Entwickler " +"müssen sicherstellen, dass das von ihnen generierte PostScript den von Adobe " +"definierten Regeln folgt. Insbesondere müssen alle Seiten voneinander " +"unabhängig sein, Code außerhalb der Seitenbeschreibung sollte nicht den " +"Graphikzustand betreffen (derzeit Schrift, Farbe, Transformationsmatrix " +"usw.) und Geräte-spezifische Befehle wie setpagedevice sollten nicht " +"verwandt werden." + +# type: Plain text +#. type: Plain text +#: cupstestdsc.man:46 +msgid "" +"Adobe PostScript Language Document Structuring Conventions Specification, " +"Version 3.0." +msgstr "" +"Adobe PostScript Language Document Structuring Conventions Specification, " +"Version 3.0." + +# type: TH +#. type: TH +#: cupstestppd.man:15 +#, no-wrap +msgid "cupstestppd" +msgstr "cupstestppd" + +# type: TH +#. type: TH +#: cupstestppd.man:15 +#, no-wrap +msgid "19 November 2009" +msgstr "19. November 2009" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:18 +msgid "cupstestppd - test conformance of ppd files" +msgstr "cupstestppd - überprüfe Konformität von PPD-Dateien" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:27 +msgid "" +"B<cupstestppd> [ -I I<category> ] [ -R I<rootdir> ] [ -W I<category> ] [ -" +"q ] [-r] [ -v[v] ] filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]" +msgstr "" +"B<cupstestppd> [ -I I<Kategorie> ] [ -R I<Wurzelverz> ] [ -W I<Kategorie> ] " +"[ -q ] [-r] [ -v[v] ] Dateiname.ppd[.gz] [ ... DateinameN.ppd[.gz] ]" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:34 +msgid "" +"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] -" +msgstr "" +"B<cupstestppd> [ -R I<Wurzelverz> ] [ -W I<Kategorie> ] [ -q ] [-r] [ -v" +"[v] ] -" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:40 +msgid "" +"I<cupstestppd> tests the conformance of PPD files to the Adobe PostScript " +"Printer Description file format specification version 4.3. It can also be " +"used to list the supported options and available fonts in a PPD file. The " +"results of testing and any other output are sent to the standard output." +msgstr "" +"I<cupstestppd> überprüft die Konformität von PPD-Dateien zu der Adobe " +"PostScript Printer Description-Dateiformatspezifikation Version 4.3. Es kann " +"auch zur Auflistung der in einer PPD-Datei unterstützen Optionen und " +"verfügbaren Schriften verwandt werden. Das Ergebnis des Tests und alle " +"anderen Ausgaben werden an die Standardausgabe gesandt." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:44 +msgid "" +"The first form of I<cupstestppd> tests one or more PPD files on the command-" +"line. The second form tests the PPD file provided on the standard input." +msgstr "" +"Die erste Form von I<cupstestppd> überprüft eine oder mehrere PPD-Dateien " +"auf der Kommandozeile. Die zweite Form überprüft die auf der Standardeingabe " +"übergebene PPD-Datei." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:46 +msgid "I<cupstestppd> supports the following options:" +msgstr "I<cupstestppd> unterstützt die folgenden Optionen:" + +# type: TP +#. type: TP +#: cupstestppd.man:46 +#, no-wrap +msgid "-I filename" +msgstr "-I filename" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:50 +msgid "Ignores all PCFileName warnings." +msgstr "Ignoriert alle PCFileName-Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:50 +#, no-wrap +msgid "-I filters" +msgstr "-I filters" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:54 +msgid "Ignores all filter errors." +msgstr "Ignoriert alle Filter-Fehler." + +# type: TP +#. type: TP +#: cupstestppd.man:54 +#, no-wrap +msgid "-I profiles" +msgstr "-I profiles" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:58 +msgid "Ignores all profile errors." +msgstr "Ignoriert alle Profile-Fehler." + +# type: TP +#. type: TP +#: cupstestppd.man:58 +#, no-wrap +msgid "-R rootdir" +msgstr "-R Wurzelverz" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:63 +msgid "" +"Specifies an alternate root directory for the filter, pre-filter, and other " +"support file checks." +msgstr "" +"Spezifiziert ein alternatives Wurzelverzeichnis für die filter-, pre-filter- " +"und andere unterstützte Dateiüberprüfungen." + +# type: TP +#. type: TP +#: cupstestppd.man:63 +#, no-wrap +msgid "-W constraints" +msgstr "-W constraints" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:67 +msgid "Report all UIConstraint errors as warnings." +msgstr "Berichtet alle UIConstraint-Fehler als Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:67 +#, no-wrap +msgid "-W defaults" +msgstr "-W defaults" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:71 +msgid "" +"Except for size-related options, report all default option errors as " +"warnings." +msgstr "" +"Berichtet alle Standard-Optionsfehler, außer größenbezogene Optionen, als " +"Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:71 +#, no-wrap +msgid "-W filters" +msgstr "-W filters" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:75 +msgid "Report all filter errors as warnings." +msgstr "Berichtet alle Filterfehler als Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:75 +#, no-wrap +msgid "-W profiles" +msgstr "-W profiles" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:79 +msgid "Report all profile errors as warnings." +msgstr "Alle Profilfehler als Warnungen berichten." + +# type: TP +#. type: TP +#: cupstestppd.man:79 +#, no-wrap +msgid "-W sizes" +msgstr "-W sizes" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:83 +msgid "Report all media size errors as warnings." +msgstr "Alle Mediengrößenfehler als Warnungen berichten." + +# type: TP +#. type: TP +#: cupstestppd.man:83 +#, no-wrap +msgid "-W translations" +msgstr "-W translations" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:87 +msgid "Report all translation errors as warnings." +msgstr "Berichtet alle Übersetzungsfehler als Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:87 +#, no-wrap +msgid "-W all" +msgstr "-W all" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:91 +msgid "Report all of the previous errors as warnings." +msgstr "Berichtet alle vorhergehenden Fehler als Warnungen." + +# type: TP +#. type: TP +#: cupstestppd.man:91 +#, no-wrap +msgid "-W none" +msgstr "-W none" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:95 +msgid "Report all of the previous errors as errors." +msgstr "Berichtet alle bisherigen Fehler als Fehler" + +# type: TP +#. type: TP +#: cupstestppd.man:95 lpr.man:101 +#, no-wrap +msgid "-q" +msgstr "-q" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:99 +msgid "Specifies that no information should be displayed." +msgstr "Spezifiziert, dass keine Information angezeigt werden soll." + +# type: TP +#. type: TP +#: cupstestppd.man:99 lpr.man:105 lpstat.man:101 +#, no-wrap +msgid "-r" +msgstr "-r" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:105 +msgid "" +"Relaxes the PPD conformance requirements so that common whitespace, control " +"character, and formatting problems are not treated as hard errors." +msgstr "" +"Weicht die PPD-Konformitätsanforderungen auf, so dass typische Leerzeichen-, " +"Steuerzeichen und Formatierungsprobleme nicht als schwere Fehler behandelt " +"werden." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:110 +msgid "" +"Specifies that detailed conformance testing results should be displayed " +"rather than the concise PASS/FAIL/ERROR status." +msgstr "" +"Spezifiziert, dass detaillierte Konformitätstestergebnisse anstatt des " +"knappen »PASS/FAIL/ERROR« Statusses angezeigt werden sollen." + +# type: TP +#. type: TP +#: cupstestppd.man:110 +#, no-wrap +msgid "-vv" +msgstr "-vv" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:116 +msgid "" +"Specifies that all information in the PPD file should be displayed in " +"addition to the detailed conformance testing results." +msgstr "" +"Spezifiziert, dass alle Informationen in der PPD-Datei zusätzlich zu den " +"detaillierten Konformitätstestergebnissen angezeigt werden sollen." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:118 +msgid "The I<-q>, I<-v>, and I<-vv> options are mutually exclusive." +msgstr "" +"Die Optionen I<-q>, I<-v> und I<-vv> schließen sich gegenseitig paarweise " +"aus." + +# type: SH +#. type: SH +#: cupstestppd.man:118 +#, no-wrap +msgid "EXIT STATUS" +msgstr "EXIT-STATUS" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:121 +msgid "" +"I<cupstestppd> returns zero on success and non-zero on error. The error " +"codes are as follows:" +msgstr "" +"I<cupstestppd> liefert Null bei Erfolg und nicht-Null im Fehlerfall. Die " +"Fehlercodes lauten wie folgt:" + +# type: TP +#. type: TP +#: cupstestppd.man:121 +#, no-wrap +msgid "1" +msgstr "1" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:125 +msgid "Bad command-line arguments or missing PPD filename." +msgstr "Fehlerhafte Kommandozeilen-Argumente oder fehlender PPD-Dateiname." + +# type: TP +#. type: TP +#: cupstestppd.man:125 +#, no-wrap +msgid "2" +msgstr "2" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:129 +msgid "Unable to open or read PPD file." +msgstr "PPD-Datei kann nicht geöffnet oder gelesen werden." + +# type: TP +#. type: TP +#: cupstestppd.man:129 +#, no-wrap +msgid "3" +msgstr "3" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:133 +msgid "The PPD file contains format errors that cannot be skipped." +msgstr "" +"Die PPD-Datei enthält Formatfehler, die nicht übersprungen werden können." + +# type: TP +#. type: TP +#: cupstestppd.man:133 +#, no-wrap +msgid "4" +msgstr "4" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:137 +msgid "The PPD file does not conform to the Adobe PPD specification." +msgstr "Die PPD-Datei folgt nicht der Adobe PPD-Spezifikation." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:141 +msgid "" +"The following command will test all PPD files under the current directory " +"and print the names of each file that does not conform:" +msgstr "" +"Der folgende Befehl überprüft alle PPD-Dateien unterhalb des aktuellen " +"Verzeichnisses und gibt die Namen aller Dateien aus, die nicht der " +"Spezifikation folgen:" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:144 +#, no-wrap +msgid " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" +msgstr " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:149 +msgid "" +"The next command tests all PPD files under the current directory and print " +"detailed conformance testing results for the files that do not conform:" +msgstr "" +"Der nächste Befehl überprüft alle PPD-Dateien unterhalb des aktuellen " +"Verzeichnisse und gibt detaillierte Konformitätstestergebnisse für die " +"Dateien aus, die keine Konformität aufweisen." + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:153 +#, no-wrap +msgid "" +" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" +" -exec cupstestppd -v '{}' \\e;\n" +msgstr "" +" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" +" -exec cupstestppd -v '{}' \\e;\n" + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:157 lpinfo.man:109 +msgid "I<lpadmin(8)>," +msgstr "I<lpadmin(8)>," + +# type: Plain text +#. type: Plain text +#: cupstestppd.man:161 +msgid "" +"Adobe PostScript Printer Description File Format Specification, Version 4.3." +msgstr "" +"Adobe PostScript Printer Description File Format Specification, Version 4.3." + +# type: TH +#. type: TH +#: filter.man:15 +#, no-wrap +msgid "filter" +msgstr "filter" + +# type: TH +#. type: TH +#: filter.man:15 +#, no-wrap +msgid "13 May 2009" +msgstr "13. Mai 2009" + +# type: Plain text +#. type: Plain text +#: filter.man:18 +msgid "filter - cups file conversion filter interface" +msgstr "filter - CUPS-Datei-Umwandlungsfilter-Schnittstelle" + +# type: Plain text +#. type: Plain text +#: filter.man:23 +msgid "B<filter> job user title num-copies options [ I<filename> ]" +msgstr "B<filter> Auftrag Benutzer Titel Anz-Kopien Optionen [ I<Dateiname> ]" + +# type: Plain text +#. type: Plain text +#: filter.man:28 +msgid "" +"The CUPS filter interface provides a standard method for adding support for " +"new document types to CUPS. Each filter is capable of converting from one or " +"more input formats to another format that can either be printed directly or " +"piped into another filter to get it to a printable format." +msgstr "" +"Die CUPS-Filterschnittstelle stellt eine Standardmethode zum Hinzufügen von " +"Unterstützungen für neue Dokumententypen zu CUPS bereit. Jeder Filter ist in " +"der Lage, von einem oder mehreren Eingabeformaten in andere Ausgabeformate " +"zu konvertieren, die entweder direkt gedruckt oder an einen weiteren Filter " +"weitergeleitet werden können, der es dann in ein druckbares Format wandelt." + +# type: Plain text +#. type: Plain text +#: filter.man:33 +msgid "" +"Filters B<must> be capable of reading from a filename on the command-line or " +"from the standard input, copying the standard input to a temporary file as " +"required by the file format. All output B<must> be sent to the standard " +"output." +msgstr "" +"Filter B<müssen> in der Lage sein, aus einem Dateinamen auf der " +"Kommandozeile oder der Standardeingabe zu lesen und in letzterem Fall die " +"Standardeingabe in eine temporäre Datei zu kopieren, wie dies vom " +"Dateiformat benötigt wird. Die gesamte Ausgabe B<muss> an die " +"Standardausgabe gesandt werden." + +# type: Plain text +#. type: Plain text +#: filter.man:36 +msgid "" +"The command name (argv[0]) is set to the name of the destination printer but " +"is also available in the PRINTER environment variable." +msgstr "" +"Der Befehlsname (argv[0]) wird auf den Namen des Zieldruckers gesetzt. Er " +"ist aber auch über die Umgebungsvariable PRINTER verfügbar." + +#. type: Plain text +#: filter.man:46 +msgid "" +"Options passed on the command-line typically do not include the default " +"choices the printer's PPD file. In addition, some options may be specified " +"in multiple ways - \"landscape\" is a synonym for \"orientation-" +"requested=4\", \"media\" is a synonym for \"PageSize\", \"PageRegion\", " +"\"InputSlot\", and \"MediaType\", and \"sides\" is a synonym for the various " +"\"Duplex\" options. Non-raster filters B<must> support both explicit and " +"implicit specification of PPD options - use the ppdMarkDefaults and " +"cupsMarkOptions functions in the CUPS library to use the correct mapping, " +"and ppdFindMarkedChoice to get the user-selected choice." +msgstr "" +"Optionen, die über die Befehlszeile eingegeben wurden, enthalten " +"normalerweise die Vorgabeauswahl der PPD-Datei des Druckers. Zusätzlich " +"könnten einige Optionen auf mehreren Wegen angegeben werden. »landscape« ist " +"ein Synonym für »orientation-requested=4«, »media« ist ein Synonym für " +"»PageSize«, »PageRegion«, »InputSlot« und »MediaType« und »sides« ist ein " +"Synonym für verschiedene »Duplex«-Optionen. Nicht-Raster-Filter B<müssen> " +"beide Spezifikationen von PPD-Optionen explizit und implizit unterstützen. " +"Benutzen Sie die Funktionen ppdMarkDefaults und cupsMarkOptions in der CUPS-" +"Bibliothek, um das korrekte Abbilden zu benutzen und ppdFindMarkedChoice, um " +"die Auswahl des Benutzers zu erhalten. " + +#. type: Plain text +#: filter.man:51 +msgid "" +"Raster filters should use option choices set through the raster page header, " +"as those reflect the options in effect for a given page. Options specified " +"on the command-line determine the default values for the entire job, which " +"can be overridden on a per-page basis." +msgstr "" +"Rasterfilter sollten ausgewählte Optionen benutzen, die durch die " +"Rasterseitenkopfzeilen gesetzt wurden, da jene die tatsächlichen Optionen " +"für eine angegebene Seite wiedergeben. Auf der Befehlszeile angegebene " +"Optionen spezifizieren die Vorgabewerte für den ganzen Druckauftrag, die auf " +"seitenweiser Basis überschrieben werden können." + +# type: SH +#. type: SH +#: filter.man:52 +#, no-wrap +msgid "LOG MESSAGES" +msgstr "PROTOKOLLNACHRICHTEN" + +# type: Plain text +#. type: Plain text +#: filter.man:56 +msgid "" +"Messages sent to stderr are generally logged to printer-state-message " +"attribute and the current I<ErrorLog>. Each line begins with a standard " +"prefix:" +msgstr "" +"Nachrichten, die an stderr gesendet werden, werden generell zum Printer-" +"state-message-Attribut und das aktuelle I<ErrorLog> protokolliert werden. " +"Jede Zeile beginnt mit einer Standard-Vorsilbe:" + +# type: TP +#. type: TP +#: filter.man:57 +#, no-wrap +msgid "ALERT: message" +msgstr "ALERT: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:62 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"alert\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »alter« hinzu." + +# type: TP +#. type: TP +#: filter.man:63 +#, no-wrap +msgid "ATTR: attribute=value [attribute=value]" +msgstr "ATTR: Attribut=Wert [Attribut=Wert]" + +# type: Plain text +#. type: Plain text +#: filter.man:68 +msgid "" +"Sets the named job attribute(s). Typically this will be used to set the job-" +"remote-id attribute." +msgstr "" +"Setzt das/die beannte(n) Attribut(e). Typischerweise wird dies zum Setzen " +"des job-remote-id-Attributs benutzt." + +# type: TP +#. type: TP +#: filter.man:69 +#, no-wrap +msgid "CRIT: message" +msgstr "CRIT: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:74 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"critical\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »critical« " +"hinzu." + +# type: TP +#. type: TP +#: filter.man:75 +#, no-wrap +msgid "DEBUG: message" +msgstr "DEBUG: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:80 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"debug\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »debug« hinzu." + +# type: TP +#. type: TP +#: filter.man:81 +#, no-wrap +msgid "DEBUG2: message" +msgstr "DEBUG2: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:86 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"debug2\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »debug2« hinzu." + +# type: TP +#. type: TP +#: filter.man:87 +#, no-wrap +msgid "EMERG: message" +msgstr "EMERG: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:92 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"emergency\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »emergency« " +"hinzu." + +# type: TP +#. type: TP +#: filter.man:93 +#, no-wrap +msgid "ERROR: message" +msgstr "ERROR: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:98 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"error\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »error« hinzu." + +# type: TP +#. type: TP +#: filter.man:99 +#, no-wrap +msgid "INFO: message" +msgstr "INFO: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:105 +msgid "" +"Sets the printer-state-message attribute. If the current I<LogLevel> is set " +"to \"debug2\", also adds the specified message to the current I<ErrorLog> " +"using the \"info\" log level." +msgstr "" +"Setzt das Printer-state-message-Attribut. Wenn der aktuelle I<LogLevel> auf " +"»debug2« gesetzt ist, wird die angegebene Nachricht außerdem dem aktuellen " +"I<ErrorLog> unter Benutzung der »info«-Protokollstufe hinzugefügt." + +# type: TP +#. type: TP +#: filter.man:106 +#, no-wrap +msgid "NOTICE: message" +msgstr "NOTICE: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:111 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"notice\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »notice« hinzu." + +# type: TP +#. type: TP +#: filter.man:112 +#, no-wrap +msgid "PAGE: page-number #-copies" +msgstr "PAGE: Seitenzahl #-Kopien" + +# type: TP +#. type: TP +#: filter.man:114 +#, no-wrap +msgid "PAGE: total #-pages" +msgstr "PAGE: Gesamt #-Seiten" + +# type: Plain text +#. type: Plain text +#: filter.man:120 +msgid "" +"Adds an entry to the current I<PageLog>. The first form adds #-copies to the " +"job-media-sheets-completed attribute. The second form sets the job-media-" +"sheets-completed attribute to #-pages." +msgstr "" +"Fügt einen Eintrag zum aktuellen I<PageLog> hinzu. Die erste Form fügt #-" +"Kopien zum Attribut job-media-sheets-completed hinzu. Die zweite Form setzt " +"das Attribut job-media-sheets-completed auf #-Seiten." + +#. type: TP +#: filter.man:121 +#, no-wrap +msgid "PPD: Keyword=Value ... KeywordN=Value" +msgstr "PPD: Schlüsselwort=Wert ... SchlüsselwortN=Wert" + +#. type: Plain text +#: filter.man:127 +msgid "" +"Sets the named keywords in the printer's PPD file. This is typically used to " +"update default option keywords such as DefaultPageSize and the various " +"installable options in the PPD file." +msgstr "" +"Setzt die genannten Schlüsselworte in die PPD-Datei des Druckers. Dies wird " +"normalerweise benutzt, um Standardschlüsselwortoptionen zu aktualisieren, " +"wie DefaultPageSize und verschiedene installierbare Optionen in der PPD-" +"Datei." + +# type: TP +#. type: TP +#: filter.man:128 +#, no-wrap +msgid "STATE: printer-state-reason [printer-state-reason ...]" +msgstr "STATE: printer-state-reason [printer-state-reason ...]" + +# type: TP +#. type: TP +#: filter.man:130 +#, no-wrap +msgid "STATE: + printer-state-reason [printer-state-reason ...]" +msgstr "STATE: + printer-state-reason [printer-state-reason ...]" + +# type: TP +#. type: TP +#: filter.man:132 +#, no-wrap +msgid "STATE: - printer-state-reason [printer-state-reason ...]" +msgstr "STATE: - printer-state-reason [printer-state-reason ...]" + +# type: Plain text +#. type: Plain text +#: filter.man:138 +msgid "" +"Sets, adds, or removes printer-state-reason keywords to the current queue. " +"Typically this is used to indicate media, ink, and toner conditions on a " +"printer." +msgstr "" +"Setzt, enfernt oder fügt Printer-state-reason-Schlüsselwörter zu der " +"aktuellen Druckschlange hinzu. Typischerweise wird dies benutzt, um Medien-, " +"Tinten- und Toner-Bedingungen auf einem Drucker anzuzeigen." + +# type: TP +#. type: TP +#: filter.man:139 +#, no-wrap +msgid "WARNING: message" +msgstr "WARNING: Nachricht" + +# type: Plain text +#. type: Plain text +#: filter.man:144 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"warning\" log level." +msgstr "" +"Setzt das Attribut printer-state-message und fügt die angegebene Nachricht " +"zum aktuellen I<ErrorLog> unter Verwendung der Protokollstufe »warning« " +"hinzu." + +# type: SH +#. type: SH +#: filter.man:145 +#, no-wrap +msgid "ENVIRONMENT VARIABLES" +msgstr "UMGEBUNGSVARIABLEN" + +# type: Plain text +#. type: Plain text +#: filter.man:148 +msgid "" +"The following environment variables are defined by the CUPS server when " +"executing the filter:" +msgstr "" +"Die folgenden Umgebungsvariablen sind vom CUPS-Server beim Ausführen von " +"Filtern gesetzt:" + +# type: TP +#. type: TP +#: filter.man:149 +#, no-wrap +msgid "CHARSET" +msgstr "CHARSET" + +# type: Plain text +#. type: Plain text +#: filter.man:153 +msgid "The default text character set, typically utf-8." +msgstr "Der standard Textzeichensatz, typischerweise UTF-8." + +# type: TP +#. type: TP +#: filter.man:154 +#, no-wrap +msgid "CLASS" +msgstr "CLASS" + +# type: Plain text +#. type: Plain text +#: filter.man:160 +msgid "" +"When a job is submitted to a printer class, contains the name of the " +"destination printer class. Otherwise this environment variable will not be " +"set." +msgstr "" +"Wenn ein Druckauftrag an eine Druckerklasse gesandt wird, enthält er den " +"Namen der Bestimmungsdruckerklasse. Ansonsten wird diese Umgebungsvariable " +"nicht gesetzt." + +# type: TP +#. type: TP +#: filter.man:161 +#, no-wrap +msgid "CONTENT_TYPE" +msgstr "CONTENT_TYPE" + +# type: Plain text +#. type: Plain text +#: filter.man:166 +msgid "The MIME type associated with the file (e.g. application/postscript)." +msgstr "" +"Der MIME-Typ, der der Datei zugeordnet ist (z.B. application/postscript)." + +# type: TP +#. type: TP +#: filter.man:167 +#, no-wrap +msgid "CUPS_CACHEDIR" +msgstr "CUPS_CACHEDIR" + +# type: Plain text +#. type: Plain text +#: filter.man:171 +msgid "The directory for semi-persistent cache files can be found." +msgstr "" +"Das Verzeichnis für halb-beständige Zwischenspeicherdateien kann gefunden " +"werden." + +# type: TP +#. type: TP +#: filter.man:172 +#, no-wrap +msgid "CUPS_DATADIR" +msgstr "CUPS_DATADIR" + +# type: Plain text +#. type: Plain text +#: filter.man:176 +msgid "The directory where data files can be found." +msgstr "Das Verzeichnis, in dem Datendateien gefunden werden können." + +#. type: TP +#: filter.man:177 +#, no-wrap +msgid "CUPS_FILETYPE" +msgstr "CUPS_FILETYPE" + +#. type: Plain text +#: filter.man:182 +msgid "" +"The type of file being printed: \"job-sheet\" for a banner page and " +"\"document\" for a regular print file." +msgstr "" +"Der Typ der Datei, die gedruckt wird: »job-sheet« für ein Deckblatt und " +"»document« für eine reguläre Druckdatei." + +# type: TP +#. type: TP +#: filter.man:183 +#, no-wrap +msgid "CUPS_SERVERROOT" +msgstr "CUPS_SERVERROOT" + +# type: Plain text +#. type: Plain text +#: filter.man:187 +msgid "The root directory of the server." +msgstr "Das Wurzelverzeichnis des Servers." + +# type: TP +#. type: TP +#: filter.man:188 +#, no-wrap +msgid "DEVICE_URI" +msgstr "DEVICE_URI" + +# type: Plain text +#. type: Plain text +#: filter.man:192 +msgid "The device-uri associated with the printer." +msgstr "Die mit dem Drucker verbundene Geräte-URI." + +# type: TP +#. type: TP +#: filter.man:193 +#, no-wrap +msgid "FINAL_CONTENT_TYPE" +msgstr "FINAL_CONTENT_TYPE" + +# type: Plain text +#. type: Plain text +#: filter.man:198 +msgid "" +"The MIME type associated with the printer (e.g. application/vnd.cups-" +"postscript)." +msgstr "" +"Der MIME-Typ, der dem Drucker zugeordnet ist (z.B. application/vnd.cups-" +"postscript)." + +# type: TP +#. type: TP +#: filter.man:199 +#, no-wrap +msgid "LANG" +msgstr "LANG" + +# type: Plain text +#. type: Plain text +#: filter.man:203 +msgid "The default language locale (typically C or en)." +msgstr "Die Standardsprach-Locale (normalerweise C oder en)." + +# type: TP +#. type: TP +#: filter.man:204 +#, no-wrap +msgid "PATH" +msgstr "PATH" + +# type: Plain text +#. type: Plain text +#: filter.man:209 +msgid "" +"The standard execution path for external programs that may be run by the " +"filter." +msgstr "" +"Der Standard-Ausführungspfad für externe Programme, die vom Filter " +"ausgeführt werden dürfen." + +# type: TP +#. type: TP +#: filter.man:210 +#, no-wrap +msgid "PPD" +msgstr "PPD" + +# type: Plain text +#. type: Plain text +#: filter.man:215 +msgid "" +"The full pathname of the PostScript Printer Description (PPD) file for this " +"printer." +msgstr "" +"Der komplette Pfadname zu der PostScript Printer Description (PPD)-Datei für " +"diesen Drucker." + +# type: TP +#. type: TP +#: filter.man:216 +#, no-wrap +msgid "PRINTER" +msgstr "PRINTER" + +# type: Plain text +#. type: Plain text +#: filter.man:220 +msgid "The name of the printer." +msgstr "Der Name des Druckers." + +# type: TP +#. type: TP +#: filter.man:221 +#, no-wrap +msgid "RIP_CACHE" +msgstr "RIP_CACHE" + +# type: Plain text +#. type: Plain text +#: filter.man:226 +msgid "" +"The recommended amount of memory to use for Raster Image Processors (RIPs)." +msgstr "" +"Die empfohlene Speichermenge zum Einsatz für Raster Image Processors (RIPs)." + +# type: TP +#. type: TP +#: filter.man:227 +#, no-wrap +msgid "SOFTWARE" +msgstr "SOFTWARE" + +# type: Plain text +#. type: Plain text +#: filter.man:231 +msgid "The name and version number of the server (typically CUPS/1.2)." +msgstr "Der Name und die Versionsnummer des Servers (typischerweise CUPS/1.2)." + +# type: TP +#. type: TP +#: filter.man:232 +#, no-wrap +msgid "TZ" +msgstr "TZ" + +# type: Plain text +#. type: Plain text +#: filter.man:236 +msgid "The timezone of the server." +msgstr "Die Zeitzone des Servers." + +# type: TP +#. type: TP +#: filter.man:237 +#, no-wrap +msgid "USER" +msgstr "USER" + +# type: Plain text +#. type: Plain text +#: filter.man:242 +msgid "" +"The user executing the filter, typically \"lp\" or \"root\"; consult the " +"I<cupsd.conf(5)> file for the current setting." +msgstr "" +"Der Benutzer, der den Filter ausführt, typischerweise »lp« oder »root«; " +"schauen Sie in die Datei I<cupsd.conf(5)> für die aktuellen Einstellungen." + +# type: Plain text +#. type: Plain text +#: filter.man:248 +msgid "" +"While the filter interface is compatible with System V interface scripts, it " +"will only work with the System V interface script as the only filter. " +"Typically the interface script will be provided via the I<lpadmin(8)> " +"command using the I<-i> option." +msgstr "" +"Während die Filterschnittstelle kompatibel mit System-V-" +"Schnittstellenskripten ist, wird sie mit dem System-V-Schnittstellenskript " +"nur als einziger Filter funktionieren. Normalerweise wird das " +"Schnittstellenskript über den I<lpadmin(8)>-Befehl unter Benutzung der " +"Option I<-i> bereitgestellt." + +# type: Plain text +#. type: Plain text +#: filter.man:250 +msgid "I<backend(7)>, I<cupsd(8)>," +msgstr "I<backend(7)>, I<cupsd(8)>," + +# type: TH +#. type: TH +#: lpadmin.man:15 +#, no-wrap +msgid "lpadmin" +msgstr "lpadmin" + +# type: TH +#. type: TH +#: lpadmin.man:15 +#, no-wrap +msgid "1 September 2010" +msgstr "1. September 2010" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:18 +msgid "lpadmin - configure cups printers and classes" +msgstr "lpadmin - CUPS-Treiber und -Klassen konfigurieren" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:26 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -d I<destination>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -d I<Ziel>" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:34 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -p I<destination " +"option(s)>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -p " +"I<Zieloption(en)>" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:42 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -x I<destination>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<Benutzername> ] [ -h I<Server[:Port]> ] -x I<Ziel>" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:46 +msgid "" +"I<lpadmin> configures printer and class queues provided by CUPS. It can also " +"be used to set the server default printer or class." +msgstr "" +"I<lpadmin> konfiguriert von CUPS bereitgestellte Warteschlangen für Drucker " +"und Druckerklassen. Es kann auch zur Einstellung des Standarddruckers oder " +"der Standardklasse verwandt werden." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:50 +msgid "" +"When specified before the I<-d>, I<-p>, or I<-x> options, the I<-E> option " +"forces encryption when connecting to the server." +msgstr "" +"Wird die Option I<-E> vor den Optionen I<-d>, I<-p> oder I<-x> verwandt, so " +"erzwingt sie die Verschlüsselung bei Verbindungen zum Server." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:56 +msgid "" +"The first form of the command (I<-d>) sets the default printer or class to " +"I<destination>. Subsequent print jobs submitted via the I<lp(1)> or I<lpr(1)" +"> commands will use this destination unless the user specifies otherwise " +"with the I<lpoptions(1)> command." +msgstr "" +"Die erste Form des Befehls (I<-d>) setzt den Standarddrucker oder Klasse auf " +"I<Ziel>. Folgende Druckaufträge, die mit den Befehlen I<lp(1)> oder I<lpr(1)" +"> eingereicht werden, verwenden dieses Ziel solange der Benutzer nichts " +"anderes mit dem Befehl I<lpoptions(1)> spezifiziert hat." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:59 +msgid "" +"The second form of the command (I<-p>) configures the named printer or " +"class. The additional options are described below." +msgstr "" +"Die zweite Form des Befehls (I<-p>) konfiguriert den benannten Drucker oder " +"Klasse. Die zusätzlichen Optionen sind unten beschrieben." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:64 +msgid "" +"The third form of the command (I<-x>) deletes the printer or class " +"I<destination>. Any jobs that are pending for the destination will be " +"removed and any job that is currently printed will be aborted." +msgstr "" +"Die dritte Form des Befehls (I<-x>) löscht den Drucker oder Klasse I<Ziel>. " +"Alle Aufträge, die für dieses Ziel noch warten, werden entfernt und im Druck " +"befindliche Aufträge werden abgebrochen." + +# type: SH +#. type: SH +#: lpadmin.man:64 +#, no-wrap +msgid "CONFIGURATION OPTIONS" +msgstr "KONFIGURATIONSOPTIONEN" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:67 +msgid "The following options are recognized when configuring a printer queue:" +msgstr "" +"Die folgenden Optionen werden bei der Konfiguration einer " +"Druckerwarteschlange verstanden:" + +# type: TP +#. type: TP +#: lpadmin.man:67 +#, no-wrap +msgid "-c class" +msgstr "-c Klasse" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:72 +msgid "" +"Adds the named I<printer> to I<class>. If I<class> does not exist it is " +"created automatically." +msgstr "" +"Fügt den benannten I<Drucker> zu der I<Klasse> hinzu. Falls I<Klasse> nicht " +"existiert, so wird sie automatisch erstellt." + +# type: TP +#. type: TP +#: lpadmin.man:72 +#, no-wrap +msgid "-i interface" +msgstr "-i Schnittstelle" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:78 +msgid "" +"Sets a System V style interface script for the printer. This option cannot " +"be specified with the I<-P> option (PPD file) and is intended for providing " +"support for legacy printer drivers." +msgstr "" +"Setzt ein Schnittstellenskript im System-V-Stil für den Drucker. Diese " +"Option kann nicht mit der Option I<-P> (PPD-Datei) angegeben werden und ist " +"gedacht, um Unterstützung für alte Druckertreiber anzubieten." + +# type: TP +#. type: TP +#: lpadmin.man:78 +#, no-wrap +msgid "-m model" +msgstr "-m Modell" + +#. type: Plain text +#: lpadmin.man:84 +msgid "" +"Sets a standard System V interface script or PPD file for the printer from " +"the I<model> directory or using one of the driver interfaces. Use the I<-m> " +"option with the I<lpinfo(8)> command to get a list of supported models." +msgstr "" +"Setzt ein Standard-System-V-Schnittstellenskript oder eine PPD-Datei für den " +"Drucker aus dem Verzeichnis I<Model> oder verwendet eine der " +"Druckerschnittstellen. Verwenden Sie die Option I<-m> mit dem Befehl " +"I<lpinfo(8)>, um eine Liste der unterstützten Modelle zu erhalten." + +# type: TP +#. type: TP +#: lpadmin.man:84 +#, no-wrap +msgid "-o job-k-limit=value" +msgstr "-o job-k-limit=Wert" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:89 +msgid "" +"Sets the kilobyte limit for per-user quotas. The value is an integer number " +"of kilobytes; one kilobyte is 1024 bytes." +msgstr "" +"Setzt die Begrenzung in Kilobyte für pro-Benutzer-Quotas. Der Wert ist eine " +"Ganzzahl von Kilobytes, ein Kilobyte ist 1024 Bytes." + +# type: TP +#. type: TP +#: lpadmin.man:89 +#, no-wrap +msgid "-o job-page-limit=value" +msgstr "-o job-page-limit=Wert" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:95 +msgid "" +"Sets the page limit for per-user quotas. The value is the integer number of " +"pages that can be printed; double-sided pages are counted as two pages." +msgstr "" +"Setzt eine Seitenbegrenzung für pro-Benutzer-Quotas. Der Wert ist eine " +"Ganzzahl von Seiten, die gedruckt werden können. Doppelseitige Seiten werden " +"als zwei Seiten gezählt." + +# type: TP +#. type: TP +#: lpadmin.man:95 +#, no-wrap +msgid "-o job-quota-period=value" +msgstr "-o job-quota-period=Wert" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:100 +msgid "" +"Sets the accounting period for per-user quotas. The value is an integer " +"number of seconds; 86,400 seconds are in one day." +msgstr "" +"Setzt die Berechnungsperiode für Quotas je Benutzer. Der Wert ist eine " +"Ganzzahl von Sekunden; 86,400 Sekunden sind ein Tag." + +# type: TP +#. type: TP +#: lpadmin.man:100 +#, no-wrap +msgid "-o job-sheets-default=banner" +msgstr "-o job-sheets-default=Banner" + +# type: TP +#. type: TP +#: lpadmin.man:102 +#, no-wrap +msgid "-o job-sheets-default=banner,banner" +msgstr "-o job-sheets-default=Banner,Banner" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:106 +msgid "Sets the default banner page(s) to use for print jobs." +msgstr "Spezifiziert die Standarddeckblätter für das Drucken von Aufträgen." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:111 +msgid "" +"Sets a PPD option for the printer. PPD options can be listed using the I<-l> " +"option with the I<lpoptions(1)> command." +msgstr "" +"Setzt eine PPD-Option für den Drucker. PPD-Optionen können mittels der " +"Option I<-l> des Befehls I<lpoptions(1)> aufgelistet werden." + +# type: TP +#. type: TP +#: lpadmin.man:111 +#, no-wrap +msgid "-o name-default=value" +msgstr "-o name-default=Wert" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:117 +msgid "" +"Sets a default server-side option for the destination. Any print-time option " +"can be defaulted, e.g. \"-o cpi-default=17\" to set the default \"cpi\" " +"option value to 17." +msgstr "" +"Setzt eine Standard serverseitige Option für das Ziel. Jede Option zur " +"Druckzeit kann mit einem Standardwert belegt werden, z.B. »-o cpi-" +"default=17«, um den Standard-»cpi«-Optionswert auf 17 zu setzen." + +# type: TP +#. type: TP +#: lpadmin.man:117 +#, no-wrap +msgid "-o port-monitor=name" +msgstr "-o port-monitor=Name" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:123 +msgid "" +"Sets the binary communications program to use when printing, \"none\", \"bcp" +"\", or \"tbcp\". The default program is \"none\". The specified port monitor " +"must be listed in the printer's PPD file." +msgstr "" +"Setzt das binäre Kommunikationsprogramm, das benutzt wird, um »none«, »bcp« " +"oder »tbcp« zu drucken. Das Standardprogramm ist »none«. Der angegebene " +"Monitorport muss in der PPD-Datei des Druckers aufgelistet sein." + +# type: TP +#. type: TP +#: lpadmin.man:123 +#, no-wrap +msgid "-o printer-error-policy=name" +msgstr "-o printer-error-policy=Name" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:131 +msgid "" +"Sets the error policy to be used when the printer backend is unable to send " +"the job to the printer. The name must be one of \"abort-job\", \"retry-job" +"\", \"retry-current-job\", or \"stop-printer\". The default error policy is " +"\"stop-printer\" for printers and \"retry-current-job\" for classes." +msgstr "" +"Setzt die Fehlerrichtlinie, die benutzt wird, wenn das Drucker-Backend den " +"Druckauftrag nicht an den Drucker senden kann. Der Name muss entweder »abort-" +"job«, »retry-job«, »retry-current-job« oder »stop-printer« sein. Die " +"Standardfehlerrichtlinie ist »stop-printer« für Drucker und " +"»retry-current-job« für Klassen." + +# type: TP +#. type: TP +#: lpadmin.man:131 +#, no-wrap +msgid "-o printer-is-shared=true/false" +msgstr "-o printer-is-shared=true/false" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:139 +msgid "" +"Sets the destination to shared/published or unshared/unpublished. Shared/" +"published destinations are publically announced by the server on the LAN " +"based on the browsing configuration in B<cupsd.conf>, while unshared/" +"unpublished destinations are not announced. The default value is \"true\"." +msgstr "" +"Setzt, ob das Ziel freigegeben/veröffentlicht oder nicht freigegeben/" +"unveröffentlicht ist. Freigegebene/Veröffentlichte Ziele werden öffentlich " +"angezeigt durch den Server im LAN, der auf der Suchkonfiguration in B<cupsd." +"conf> basiert, während nicht freigegebene/unveröffentlichte Ziele nicht " +"angezeigt werden. Vorgabewert ist »true«." + +# type: TP +#. type: TP +#: lpadmin.man:139 +#, no-wrap +msgid "-o printer-op-policy=name" +msgstr "-o printer-op-policy=Name" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:145 +msgid "" +"Sets the IPP operation policy associated with the destination. The name must " +"be defined in the B<cupsd.conf> in a Policy section. The default operation " +"policy is \"default\"." +msgstr "" +"Setzt die mit dem Ziel verbundene IPP-Operationsrichtlinie. Der Name muss " +"in einem Richtlinienabschnitt der B<cupsd.conf> definiert sein. Die " +"Standardoperationsrichtlinie ist »default«." + +# type: TP +#. type: TP +#: lpadmin.man:145 +#, no-wrap +msgid "-r class" +msgstr "-r Klasse" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:150 +msgid "" +"Removes the named I<printer> from I<class>. If the resulting class becomes " +"empty it is removed." +msgstr "" +"Entfernt den benannten I<Drucker> aus der I<Klasse>. Falls die entstehende " +"Klasse dadurch leer wird, wird sie entfernt." + +# type: TP +#. type: TP +#: lpadmin.man:150 +#, no-wrap +msgid "-u allow:user,user,@group" +msgstr "-u allow:user,user,@group" + +# type: TP +#. type: TP +#: lpadmin.man:152 +#, no-wrap +msgid "-u deny:user,user,@group" +msgstr "-u deny:user,user,@group" + +# type: TP +#. type: TP +#: lpadmin.man:154 +#, no-wrap +msgid "-u allow:all" +msgstr "-u allow:all" + +# type: TP +#. type: TP +#: lpadmin.man:156 +#, no-wrap +msgid "-u deny:none" +msgstr "-u deny:none" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:162 +msgid "" +"Sets user-level access control on a destination. Names starting with \"@\" " +"are interpreted as UNIX groups. The latter two forms turn user-level access " +"control off." +msgstr "" +"Setzt die Zugriffsteuerung auf Benutzerebene für ein Ziel. Namen, die " +"mit »@« beginnen werden als UNIX-Gruppen interpretiert. Die beiden letzten " +"Formen schalten die Zugriffsteuerung auf Benutzerebene aus." + +# type: TP +#. type: TP +#: lpadmin.man:162 +#, no-wrap +msgid "-v \"device-uri\"" +msgstr "-v \"device-uri\"" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:169 +msgid "" +"Sets the I<device-uri> attribute of the printer queue. If I<device-uri> is " +"a filename it is automatically converted to the form I<file:///file/name>. " +"Use the I<-v> option with the I<lpinfo(8)> command to get a list of " +"supported device URIs and schemes." +msgstr "" +"Setzt das I<device-uri>-Attribut der Druckerwarteschlange. Falls " +"I<device-uri> ein Dateiname ist, wird er automatisch in das Format I<file:///" +"file/name> konvertiert. Benutzen Sie den Befehl I<lpinfo(8)> mit der Option " +"I<-v>, um eine Liste der unterstützten Geräte-URIs und -Schemen zu erhalten." + +# type: TP +#. type: TP +#: lpadmin.man:169 +#, no-wrap +msgid "-D \"info\"" +msgstr "-D »info«" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:173 +msgid "Provides a textual description of the destination." +msgstr "Stellt eine textuelle Beschreibung des Ziels bereit." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:178 +msgid "" +"Enables the destination and accepts jobs; this is the same as running the " +"I<cupsaccept(8)> and I<cupsenable(8)> programs on the destination." +msgstr "" +"Aktiviert das Ziel und akzeptiert Aufträge. Dies ist identisch zur Ausführung " +"der Programme I<cupsaccept(8)> und I<cupsenable(8)> für das Ziel." + +# type: TP +#. type: TP +#: lpadmin.man:178 +#, no-wrap +msgid "-L \"location\"" +msgstr "-L »Ort«" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:182 +msgid "Provides a textual location of the destination." +msgstr "Stellt den Ort des Ziel textuell bereit." + +# type: TP +#. type: TP +#: lpadmin.man:182 +#, no-wrap +msgid "-P ppd-file" +msgstr "-P PPD-Datei" + +# type: Plain text +#. type: Plain text +#: lpadmin.man:188 +msgid "" +"Specifies a PostScript Printer Description file to use with the printer. If " +"specified, this option overrides the I<-i> option (interface script)." +msgstr "" +"Spezifiziert eine PostScript Printer Description-Datei für die Verwendung " +"mit dem Drucker. Falls angegeben überschreibt diese Option die Option I<-i> " +"(Schnittstellenskript)." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:196 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " +"and class names are I<not> case-sensitive. Finally, the CUPS version of " +"I<lpadmin> may ask the user for an access password depending on the printing " +"system configuration. This differs from the System V version which requires " +"the root user to execute this command." +msgstr "" +"Anders als in einem System-V-Drucksystem erlaubt CUPS, dass Druckernamen " +"jedes druckbare Zeichen außer LEERZEICHEN, TABULATOR, »/« oder »#« " +"enthalten. Außerdem wird bei Drucker- und Klassennamen Groß- und " +"Kleinschreibung nicht unterschieden. Zu guter Letzt könnte die CUPS-Version " +"von I<lpadmin> den Benutzer abhängig von der Drucksystemkonfiguration nach " +"einem Passwort fragen. Das unterscheidet es von der System-V-Version, die " +"zur Ausführung dieses Befehls den Root-Benutzer benötigt." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:199 +msgid "" +"The CUPS version of I<lpadmin> does not support all of the System V or " +"Solaris printing system configuration options." +msgstr "" +"Die CUPS-Version von I<lpadmin> unterstützt nicht alle Optionen der System " +"V- oder Solaris-Drucksystemkonfiguration." + +# type: Plain text +#. type: Plain text +#: lpadmin.man:202 +msgid "I<cupsaccept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," +msgstr "I<cupsaccept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," + +# type: Plain text +#. type: Plain text +#: lpadmin.man:205 lp.man:260 +msgid "Copyright 2007-2010 by Apple Inc." +msgstr "Copyright 2007-2010 by Apple Inc." + +# type: TH +#. type: TH +#: lpc.man:15 +#, no-wrap +msgid "lpc" +msgstr "lpc" + +# type: TH +#. type: TH +#: lpc.man:15 +#, no-wrap +msgid "3 November 2008" +msgstr "3. November 2008" + +# type: Plain text +#. type: Plain text +#: lpc.man:18 +msgid "lpc - line printer control program" +msgstr "lpc - Zeilendrucker-Steuerprogramm (line printer control program)" + +# type: Plain text +#. type: Plain text +#: lpc.man:25 +msgid "B<lpc> [ I<command> [ I<parameter(s)> ] ]" +msgstr "B<lpc> [ I<Befehl> [ I<Parameter> ] ]" + +# type: Plain text +#. type: Plain text +#: lpc.man:29 +msgid "" +"I<lpc> provides limited control over printer and class queues provided by " +"CUPS. It can also be used to query the state of queues." +msgstr "" +"I<lpc> stellt eine eingeschränkte Steuerung von durch CUPS bereitgestellten " +"Drucker- und Druckerklassen-Warteschlangen bereit. Es kann auch zur Abfrage " +"der Zustände von Warteschlangen verwandt werden." + +# type: Plain text +#. type: Plain text +#: lpc.man:32 +msgid "" +"If no command is specified on the command-line, lpc will display a prompt " +"and accept commands from the standard input." +msgstr "" +"Falls auf der Kommandozeile kein Befehl angegeben ist, wird Lpc eine " +"Eingabeaufforderung anzeigen und Befehle von der Standardeingabe akzeptieren." + +# type: SH +#. type: SH +#: lpc.man:32 +#, no-wrap +msgid "COMMANDS" +msgstr "BEFEHLE" + +# type: Plain text +#. type: Plain text +#: lpc.man:35 +msgid "" +"The I<lpc> program accepts a subset of commands accepted by the Berkeley " +"I<lpc> program of the same name:" +msgstr "" +"Das Programm I<lpc> akzeptiert eine Teilmenge der Befehle, die vom Berkeley " +"I<lpc>-Programm gleichen Namens akzeptiert werden:" + +# type: TP +#. type: TP +#: lpc.man:35 +#, no-wrap +msgid "exit" +msgstr "exit" + +# type: Plain text +#. type: Plain text +#: lpc.man:39 lpc.man:49 +msgid "Exits the command interpreter." +msgstr "Beendet den Befehlsinterpreter." + +# type: TP +#. type: TP +#: lpc.man:39 +#, no-wrap +msgid "help [command]" +msgstr "help [Befehl]" + +# type: TP +#. type: TP +#: lpc.man:41 +#, no-wrap +msgid "? [command]" +msgstr "? [Befehl]" + +# type: Plain text +#. type: Plain text +#: lpc.man:45 +msgid "Displays a short help message." +msgstr "Zeigt eine kurze Hilfenachricht an." + +# type: TP +#. type: TP +#: lpc.man:45 +#, no-wrap +msgid "quit" +msgstr "quit" + +# type: TP +#. type: TP +#: lpc.man:49 +#, no-wrap +msgid "status [queue]" +msgstr "status [Druckwarteschlange]" + +# type: Plain text +#. type: Plain text +#: lpc.man:53 +msgid "Displays the status of one or more printer or class queues." +msgstr "" +"Zeigt den Status von einer oder mehreren Drucker- oder Druckerklassen-" +"Warteschlangen." + +# type: Plain text +#. type: Plain text +#: lpc.man:59 +msgid "" +"Since I<lpc> is geared towards the Berkeley printing system, it is " +"impossible to use I<lpc> to configure printer or class queues provided by " +"CUPS. To configure printer or class queues you must use the I<lpadmin(8)> " +"command or another CUPS-compatible client with that functionality." +msgstr "" +"Seit I<lpc> auf das Berkeley-Drucksystems abzielt, ist es unmöglich, I<lpc> " +"zu benutzen, um durch CUPS bereitgestellte Drucker- oder Druckerklassen-" +"Warteschlangen zu konfigurieren. Um Drucker- oder Druckerklassen-" +"Warteschlangen zu konfigurieren, müssen Sie den Befehl I<lpadmin(8)> oder " +"einen anderen CUPS-kompatiblen Client mit dieser Funktionalität benutzen." + +# type: Plain text +#. type: Plain text +#: lpc.man:62 +msgid "" +"The CUPS version of I<lpc> does not implement all of the standard Berkeley " +"or LPRng commands." +msgstr "" +"Die CUPS-Version von I<lpc> implementiert nicht alle Standardbefehle der " +"Berkeley- oder LPRng-Version." + +# type: Plain text +#. type: Plain text +#: lpc.man:65 +msgid "" +"I<cancel(1)>, I<cupsaccept(8)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm" +"(1)>, I<lpstat(1)>," +msgstr "" +"I<cancel(1)>, I<cupsaccept(8)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm" +"(1)>, I<lpstat(1)>," + +# type: TH +#. type: TH +#: lpinfo.man:15 +#, no-wrap +msgid "lpinfo" +msgstr "lpinfo" + +# type: TH +#. type: TH +#: lpinfo.man:15 +#, no-wrap +msgid "5 December 2008" +msgstr "5. Dezember 2008" + +# type: Plain text +#. type: Plain text +#: lpinfo.man:18 +msgid "lpinfo - show available devices or drivers" +msgstr "lpinfo - zeige verfügbare Geräte oder Drucker" + +#. type: Plain text +#: lpinfo.man:37 +msgid "" +"B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] [ --" +"device-id I<device-id-string> ] [ --exclude-schemes I<scheme-list> ] [ --" +"include-schemes I<scheme-list> ] [ --language I<locale> ] [ --make-and-model " +"I<name> ] [ --product I<name> ] -m" +msgstr "" +"B<lpinfo> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -l ] [ --" +"device-id I<Geräte-ID-Zeichenkette> ] [ --exclude-schemes I<Schemenliste> ] " +"[ --include-schemes I<Schemenliste> ] [ --language I<Locale> ] [ --make-and-" +"model I<Name> ] [ --product I<Name> ] -m" + +# type: Plain text +#. type: Plain text +#: lpinfo.man:50 +msgid "" +"B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] [ --" +"exclude-schemes I<scheme-list> ] [ --include-schemes I<scheme-list> ] [ --" +"timeout I<seconds> ] -v" +msgstr "" +"B<lpinfo> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -l ] [ --" +"exclude-schemes I<Schemenliste> ] [ --include-schemes I<Schemenliste> ] [ --" +"timeout I<Sekunden> ] -v" + +# type: Plain text +#. type: Plain text +#: lpinfo.man:55 +msgid "" +"I<lpinfo> lists the available devices or drivers known to the CUPS server. " +"The first form (I<-m>) lists the available drivers, while the second form " +"(I<-v>) lists the available devices." +msgstr "" +"I<lpinfo> listet die dem CUPS-Server bekannten verfügbaren Geräte oder " +"Treiber auf. Die erste Form (I<-m>) listet alle verfügbaren Treiber, während " +"die zweite Form (I<-v>) alle verfügbaren Geräte auflistet." + +# type: Plain text +#. type: Plain text +#: lpinfo.man:57 +msgid "I<lpinfo> accepts the following options:" +msgstr "I<lpinfo> akzeptiert die folgenden Optionen:" + +# type: Plain text +#. type: Plain text +#: lpinfo.man:65 +msgid "Sets the username to use when connecting to the server." +msgstr "" +"Setzt den Benutzernamen, der bei Verbindungen zum Server verwandt werden " +"soll." + +# type: Plain text +#. type: Plain text +#: lpinfo.man:69 +msgid "Selects an alternate server." +msgstr "Wählt einen alternativen Server aus." + +# type: Plain text +#. type: Plain text +#: lpinfo.man:73 +msgid "Shows a \"long\" listing of devices or drivers." +msgstr "Zeigt eine »lange« Auflistung von Geräten oder Treibern." + +#. type: TP +#: lpinfo.man:73 +#, no-wrap +msgid "--device-id device-id-string" +msgstr "--device-id Geräte-ID-Zeichenkette" + +#. type: Plain text +#: lpinfo.man:78 +msgid "" +"Specifies the IEEE-1284 device ID to match when listing drivers with the I<-" +"m> option." +msgstr "" +"Spezifiziert die IEEE-1284-Geräte-ID, die übereinstimmen muss, wenn " +"Gerätetreiber mit der Option I<-m> aufgelistet werden." + +#. type: TP +#: lpinfo.man:78 +#, no-wrap +msgid "--exclude-schemes scheme-list" +msgstr "--exclude-schemes Schemenliste" + +#. type: Plain text +#: lpinfo.man:83 +msgid "" +"Specifies a comma-separated list of device or PPD schemes that should be " +"excluded from the results. Static PPD files use the \"file\" scheme." +msgstr "" +"Gibt eine kommagetrennte Liste von Geräte- oder PPD-Schemen an, die aus den " +"Ergebnissen ausgeschlossen werden sollten. Statische PPD-Dateien benutzen " +"das »file«-Schema." + +#. type: TP +#: lpinfo.man:83 +#, no-wrap +msgid "--include-schemes scheme-list" +msgstr "--include-schemes Schemenliste" + +#. type: Plain text +#: lpinfo.man:88 +msgid "" +"Specifies a comma-separated list of device or PPD schemes that should be " +"included in the results. Static PPD files use the \"file\" scheme." +msgstr "" +"Spezifiziert eine kommagetrennte Liste von PPD-Schemen, die in den " +"Ergebnissen enthalten sein sollen. Statische PPD-Dateien benutzen das »file«-" +"Schema." + +# type: TP +#. type: TP +#: lpinfo.man:88 +#, no-wrap +msgid "--language locale" +msgstr "--language Locale" + +#. type: Plain text +#: lpinfo.man:92 +msgid "" +"Specifies the language to match when listing drivers with the I<-m> option." +msgstr "" +"Spezifiziert die Sprache, die übereinstimmen muss, wenn Treiber mit der " +"Option I<-m> aufgelistet werden." + +#. type: TP +#: lpinfo.man:92 +#, no-wrap +msgid "--make-and-model name" +msgstr "--make-and-model Name" + +#. type: Plain text +#: lpinfo.man:97 +msgid "" +"Specifies the make and model to match when listing drivers with the I<-m> " +"option." +msgstr "" +"Spezifiziert die Marke und Modell, die übereinstimmen müssen, wenn Treiber " +"mit der Option I<-m> aufgelistet werden." + +# type: TP +#. type: TP +#: lpinfo.man:97 +#, no-wrap +msgid "--product name" +msgstr "--product Name" + +#. type: Plain text +#: lpinfo.man:101 +msgid "" +"Specifies the product to match when listing drivers with the I<-m> option." +msgstr "" +"Spezifiziert das Produkt, das übereinstimmen muss, wenn Treiber mit der " +"Option I<-m> aufgelistet werden." + +# type: TP +#. type: TP +#: lpinfo.man:101 +#, no-wrap +msgid "--timeout seconds" +msgstr "--timeout Sekunden" + +#. type: Plain text +#: lpinfo.man:105 +msgid "Specifies the timeout when listing devices with the I<-v> option." +msgstr "" +"Spezifiziert die Zeitüberschreitung, wenn Geräte mit der Option -v " +"aufgelistet werden." + +# type: Plain text +#. type: Plain text +#: lpinfo.man:107 +msgid "The I<lpinfo> command is unique to CUPS." +msgstr "Der Befehl I<lpinfo> ist eine Besonderheit von CUPS." + +# type: TH +#. type: TH +#: lp.man:15 +#, no-wrap +msgid "lp" +msgstr "lp" + +#. type: TH +#: lp.man:15 +#, no-wrap +msgid "31 August 2010" +msgstr "31. August 2010" + +# type: Plain text +#. type: Plain text +#: lp.man:18 +msgid "lp - print files" +msgstr "lp - Dateien drucken" + +# type: Plain text +#. type: Plain text +#: lp.man:41 +msgid "" +"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -d I<destination[/instance]> ] [ -h " +"I<hostname[:port]> ] [ -m ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -" +"q I<priority> ] [ -s ] [ -t I<title> ] [ -H I<handling> ] [ -P I<page-" +"list> ] [ -- ] [ I<file(s)> ]" +msgstr "" +"B<lp> [ -E ] [ -U I<Benutzername> ] [ -c ] [ -d I<Ziel[/Instanz]> ] [ -h " +"I<Rechnername[:Port]> ] [ -m ] [ -n I<Anz-Kopien> ] [ -o I<Option[=Wert]> ] " +"[ -q I<Priorität> ] [ -s ] [ -t I<Titel> ] [ -H I<Handhabung> ] [ -P " +"I<Seitenliste> ] [ -- ] [ I<Datei(en)> ]" + +# type: Plain text +#. type: Plain text +#: lp.man:62 +msgid "" +"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -h I<hostname[:port]> ] [ -i I<job-" +"id> ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -q I<priority> ] [ -t " +"I<title> ] [ -H I<handling> ] [ -P I<page-list> ]" +msgstr "" +"B<lp> [ -E ] [ -U I<Benutzername> ] [ -c ] [ -h I<Rechnername[:Port]> ] [ -i " +"I<Auftrags-ID> ] [ -n I<Anz-Kopien> ] [ -o I<Option[=Wert]> ] [ -q " +"I<Priorität> ] [ -t I<Titel> ] [ -H I<Handhabung> ] [ -P I<Seitenliste> ]" + +# type: Plain text +#. type: Plain text +#: lp.man:65 +msgid "" +"I<lp> submits files for printing or alters a pending job. Use a filename of " +"\"-\" to force printing from the standard input." +msgstr "" +"I<lp> reicht Dateien zum Druck ein oder ändert einen anhängenden " +"Druckauftrag. Verwenden Sie als Dateinamen »-«, um das Drucken von der " +"Standardeingabe zu erzwingen." + +# type: SH +#. type: SH +#: lp.man:65 lpr.man:40 +#, no-wrap +msgid "THE DEFAULT DESTINATION" +msgstr "DAS VORGABEZIEL" + +# type: Plain text +#. type: Plain text +#: lp.man:70 lpr.man:45 +msgid "" +"CUPS provides many ways to set the default destination. The \"LPDEST\" and " +"\"PRINTER\" environment variables are consulted first. If neither are set, " +"the current default set using the I<lpoptions(1)> command is used, followed " +"by the default set using the I<lpadmin(8)> command." +msgstr "" +"CUPS stellt viele Möglichkeiten bereit, den Vorgabebeziele zu setzen. Die " +"Umgebungsvariablen »LPDEST« und »PRINTER« werden zuerst herangezogen. Wenn " +"keine von beiden gesetzt ist, wird der aktuell unter Benutzung des Befehls " +"I<lpoptions(1)> gesetzte benutzt, gefolgt von der durch den Befehl I<lpadmin" +"(8)> gesetzten Vorgabe." + +# type: Plain text +#. type: Plain text +#: lp.man:72 +msgid "The following options are recognized by I<lp>:" +msgstr "Die folgenden Optionen werden von I<lp> erkannt:" + +# type: TP +#. type: TP +#: lp.man:72 +#, no-wrap +msgid "--" +msgstr "--" + +# type: Plain text +#. type: Plain text +#: lp.man:77 +msgid "" +"Marks the end of options; use this to print a file whose name begins with a " +"dash (-)." +msgstr "" +"Markiert das Ende der Optionen; verwenden Sie dies, um eine Datei zu " +"drucken, deren Namen mit einem Bindestrich (-) beginnt." + +# type: Plain text +#. type: Plain text +#: lp.man:93 +msgid "" +"This option is provided for backwards-compatibility only. On systems that " +"support it, this option forces the print file to be copied to the spool " +"directory before printing. In CUPS, print files are always sent to the " +"scheduler via IPP which has the same effect." +msgstr "" +"Diese Option wird nur zur Rückwärtskompatibilität bereitgestellt. Auf " +"Systemen, die sie unterstützen, erzwingt die Option, dass die Druckdatei vor " +"dem Drucken in das Spool-Verzeichnis kopiert wird. In CUPS werden die " +"Dateien immer via IPP zum Auftragsplaner (Scheduler) geschickt, was den " +"gleichen Effekt bewirkt." + +# type: TP +#. type: TP +#: lp.man:93 +#, no-wrap +msgid "-d destination" +msgstr "-d Ziel" + +# type: Plain text +#. type: Plain text +#: lp.man:97 lpr.man:67 +msgid "Prints files to the named printer." +msgstr "Druckt Dateien auf den benannten Drucker." + +# type: TP +#. type: TP +#: lp.man:101 +#, no-wrap +msgid "-i job-id" +msgstr "-i Auftrags-ID" + +# type: Plain text +#. type: Plain text +#: lp.man:105 +msgid "Specifies an existing job to modify." +msgstr "Spezifiziert einen existierenden Auftrag, der geändert werden soll" + +# type: TP +#. type: TP +#: lp.man:105 lpr.man:86 +#, no-wrap +msgid "-m" +msgstr "-m" + +# type: Plain text +#. type: Plain text +#: lp.man:109 +msgid "Sends an email when the job is completed." +msgstr "Schickt eine E-Mail, wenn der Auftrag ausgeführt ist." + +# type: Plain text +#. type: Plain text +#: lp.man:113 lpr.man:75 +msgid "Sets the number of copies to print from 1 to 100." +msgstr "Setzt die Anzahl der zu druckenden Kopien zwischen 1 und 100." + +# type: TP +#. type: TP +#: lp.man:113 +#, no-wrap +msgid "-o \"name=value [name=value ...]\"" +msgstr "-o \"Name=Wert [Name=Wert ...]\"" + +# type: Plain text +#. type: Plain text +#: lp.man:117 +msgid "Sets one or more job options." +msgstr "Setzt eine oder mehrere Optionen für den Auftrag." + +# type: TP +#. type: TP +#: lp.man:117 +#, no-wrap +msgid "-q priority" +msgstr "-q Priorität" + +# type: Plain text +#. type: Plain text +#: lp.man:122 +msgid "" +"Sets the job priority from 1 (lowest) to 100 (highest). The default priority " +"is 50." +msgstr "" +"Setzt die Auftragspriorität von 1 (am niedrigsten) bis 100 (am höchsten). " +"Die Standardpriorität beträgt 50." + +# type: TP +#. type: TP +#: lp.man:122 lpstat.man:105 +#, no-wrap +msgid "-s" +msgstr "-s" + +# type: Plain text +#. type: Plain text +#: lp.man:126 +msgid "Do not report the resulting job IDs (silent mode.)" +msgstr "Die sich ergebenden Druckauftrags-IDs nicht berichten (stiller Modus)." + +# type: TP +#. type: TP +#: lp.man:126 +#, no-wrap +msgid "-t \"name\"" +msgstr "-t \"Name\"" + +# type: Plain text +#. type: Plain text +#: lp.man:130 lpr.man:63 +msgid "Sets the job name." +msgstr "Setzt den Namen des Auftrags." + +# type: Plain text +#. type: Plain text +#: lp.man:134 +msgid "Submits jobs as I<username>." +msgstr "Reicht Aufträge als I<Benutzername> ein." + +# type: TP +#. type: TP +#: lp.man:134 +#, no-wrap +msgid "-H hh:mm" +msgstr "-H hh:mm" + +# type: TP +#. type: TP +#: lp.man:136 +#, no-wrap +msgid "-H hold" +msgstr "-H hold" + +# type: TP +#. type: TP +#: lp.man:138 +#, no-wrap +msgid "-H immediate" +msgstr "-H immediate" + +# type: TP +#. type: TP +#: lp.man:140 +#, no-wrap +msgid "-H restart" +msgstr "-H restart" + +# type: TP +#. type: TP +#: lp.man:142 +#, no-wrap +msgid "-H resume" +msgstr "-H resume" + +# type: Plain text +#. type: Plain text +#: lp.man:152 +msgid "" +"Specifies when the job should be printed. A value of I<immediate> will print " +"the file immediately, a value of I<hold> will hold the job indefinitely, and " +"a time value (HH:MM) will hold the job until the specified time. Use a value " +"of I<resume> with the I<-i> option to resume a held job. Use a value of " +"I<restart> with the I<-i> option to restart a completed job." +msgstr "" +"Spezifiziert, wann der Druckauftrag gedruckt werden soll. Der Wert " +"I<immediate> führt zum sofortigen Druck. Der Wert I<hold> hält den " +"Druckauftrag auf unbestimmte Zeit an und ein Zeitwert (HH:MM) hält den " +"Druckauftrag bis zur angegebenen Uhrzeit an. Verwenden Sie den Wert " +"I<resume> mit der Option I<-i>, um einen gehaltenen Druckauftrag wieder " +"aufzunehmen. Verwenden Sie den Wert I<restart> mit der Option I<-i>, um " +"einen abgeschlossenen Druckauftrag neu zu starten." + +# type: TP +#. type: TP +#: lp.man:152 +#, no-wrap +msgid "-P page-list" +msgstr "-P Seitenliste" + +# type: Plain text +#. type: Plain text +#: lp.man:160 +msgid "" +"Specifies which pages to print in the document. The list can contain a list " +"of numbers and ranges (#-#) separated by commas (e.g. 1,3-5,16). The page " +"numbers refer to the output pages and not the document's original pages - " +"options like \"number-up\" can affect the numbering of the pages." +msgstr "" +"Spezifiziert, welche Seiten im Dokument gedruckt werden. Die Liste kann eine " +"durch Kommata getrennte Liste von Nummern und Bereichen (#-#) enthalten (z.B. " +"1,3-5,16). Die Seitennummern beziehen sich auf die Ausgabeseiten und nicht " +"auf die Originalseiten des Dokuments – Optionen wie »number-up« können die " +"Nummerierung der Seiten beeinflussen." + +# type: SH +#. type: SH +#: lp.man:160 +#, no-wrap +msgid "COMMON JOB OPTIONS" +msgstr "HÄUFIGE DRUCKAUFTRAGSOPTIONEN" + +# type: Plain text +#. type: Plain text +#: lp.man:164 +msgid "" +"Aside from the printer-specific options reported by the I<lpoptions(1)> " +"command, the following generic options are available:" +msgstr "" +"Abgesehen von druckerspezifischen Optionen, die vom Befehl I<lpoptions(1)> " +"berichtet werden, sind die folgenden allgemeinen Optionen verfügbar:" + +# type: TP +#. type: TP +#: lp.man:164 +#, no-wrap +msgid "-o media=size" +msgstr "-o media=Größe" + +# type: Plain text +#. type: Plain text +#: lp.man:169 +msgid "" +"Sets the page size to I<size>. Most printers support at least the size names " +"\"a4\", \"letter\", and \"legal\"." +msgstr "" +"Setzt die Seitengröße auf I<Größe>. Die meisten Drucker unterstützen " +"mindestens die Seitennamen »a4«, »letter« und »legal«." + +# type: TP +#. type: TP +#: lp.man:169 +#, no-wrap +msgid "-o landscape" +msgstr "-o landscape" + +# type: TP +#. type: TP +#: lp.man:171 +#, no-wrap +msgid "-o orientation-requested=4" +msgstr "-o orientation-requested=4" + +# type: Plain text +#. type: Plain text +#: lp.man:175 +msgid "Prints the job in landscape (rotated 90 degrees)." +msgstr "Druckt den Druckauftrag im Querformat (gedreht um 90 Grad)." + +# type: TP +#. type: TP +#: lp.man:175 +#, no-wrap +msgid "-o sides=one-sided" +msgstr "-o sides=one-sided" + +# type: TP +#. type: TP +#: lp.man:177 +#, no-wrap +msgid "-o sides=two-sided-long-edge" +msgstr "-o sides=two-sided-long-edge" + +# type: TP +#. type: TP +#: lp.man:179 +#, no-wrap +msgid "-o sides=two-sided-short-edge" +msgstr "-o sides=two-sided-short-edge" + +# type: Plain text +#. type: Plain text +#: lp.man:186 +msgid "" +"Prints on one or two sides of the paper. The value \"two-sided-long-edge\" " +"is normally used when printing portrait (unrotated) pages, while \"two-sided-" +"short-edge\" is used for landscape pages." +msgstr "" +"Druckt auf einer oder zwei Seiten des Papiers. Der Wert »two-sided-long-" +"edge« wird normalerweise für den Druck im Hochformat (unrotiert) verwandt, " +"während »two-sided-short-edge« für Querformatseiten eingesetzt wird." + +# type: TP +#. type: TP +#: lp.man:186 +#, no-wrap +msgid "-o fitplot" +msgstr "-o fitplot" + +# type: Plain text +#. type: Plain text +#: lp.man:190 +msgid "Scales the print file to fit on the page." +msgstr "Skaliert die Druckdatei auf Seitengröße." + +# type: TP +#. type: TP +#: lp.man:190 +#, no-wrap +msgid "-o number-up=2" +msgstr "-o number-up=2" + +# type: TP +#. type: TP +#: lp.man:192 +#, no-wrap +msgid "-o number-up=4" +msgstr "-o number-up=4" + +# type: TP +#. type: TP +#: lp.man:194 +#, no-wrap +msgid "-o number-up=6" +msgstr "-o number-up=6" + +# type: TP +#. type: TP +#: lp.man:196 +#, no-wrap +msgid "-o number-up=9" +msgstr "-o number-up=9" + +# type: TP +#. type: TP +#: lp.man:198 +#, no-wrap +msgid "-o number-up=16" +msgstr "-o number-up=16" + +# type: Plain text +#. type: Plain text +#: lp.man:202 +msgid "Prints multiple document pages on each output page." +msgstr "Druckt mehrere Dokumentenseiten auf jede Ausgabeseite." + +# type: TP +#. type: TP +#: lp.man:202 +#, no-wrap +msgid "-o scaling=number" +msgstr "-o scaling=Nummer" + +# type: Plain text +#. type: Plain text +#: lp.man:208 +msgid "" +"Scales image files to use up to I<number> percent of the page. Values " +"greater than 100 cause the image file to be printed across multiple pages." +msgstr "" +"Skaliert Bilddateien, um bis zu I<Zahl> Prozent der Seite zu benutzen. Werte " +"größer 100 veranlassen, dass das Bild über mehrere Seiten gedruckt wird." + +# type: TP +#. type: TP +#: lp.man:208 +#, no-wrap +msgid "-o cpi=N" +msgstr "-o cpi=N" + +# type: Plain text +#. type: Plain text +#: lp.man:213 +msgid "" +"Sets the number of characters per inch to use when printing a text file. The " +"default is 10." +msgstr "" +"Setzt die Anzahl von Zeichen pro Zoll beim Ausdruck einer Textdatei, " +"standardmäßig 10." + +# type: TP +#. type: TP +#: lp.man:213 +#, no-wrap +msgid "-o lpi=N" +msgstr "-o lpi=N" + +# type: Plain text +#. type: Plain text +#: lp.man:218 +msgid "" +"Sets the number of lines per inch to use when printing a text file. The " +"default is 6." +msgstr "" +"Setzt die Anzahl der Zeilen pro Zoll beim Ausdruck einer Textdatei, " +"standardmäßig 6." + +# type: TP +#. type: TP +#: lp.man:218 +#, no-wrap +msgid "-o page-bottom=N" +msgstr "-o page-bottom=N" + +# type: TP +#. type: TP +#: lp.man:220 +#, no-wrap +msgid "-o page-left=N" +msgstr "-o page-left=N" + +# type: TP +#. type: TP +#: lp.man:222 +#, no-wrap +msgid "-o page-right=N" +msgstr "-o page-right=N" + +# type: TP +#. type: TP +#: lp.man:224 +#, no-wrap +msgid "-o page-top=N" +msgstr "-o page-top=N" + +# type: Plain text +#. type: Plain text +#: lp.man:229 +msgid "" +"Sets the page margins when printing text files. The values are in points - " +"there are 72 points to the inch." +msgstr "" +"Setzt die Seitenränder beim Ausdruck von Textdateien. Die Einheit der Werte " +"sind Punkte - es gibt 72 Punkte pro Zoll." + +# type: Plain text +#. type: Plain text +#: lp.man:231 +msgid "Print a double-sided legal document to a printer called \"foo\":" +msgstr "" +"Drucke ein doppelseitiges Dokument im Format legal auf dem Drucker mit Namen " +"»foo«:" + +# type: Plain text +#. type: Plain text +#: lp.man:233 +#, no-wrap +msgid " lp -d foo -o media=legal -o sides=two-sided-long-edge filename\n" +msgstr " lp -d foo -o media=legal -o sides=two-sided-long-edge Dateiname\n" + +# type: Plain text +#. type: Plain text +#: lp.man:236 +msgid "Print an image across 4 pages:" +msgstr "Drucke ein Bild über 4 Seiten:" + +# type: Plain text +#. type: Plain text +#: lp.man:238 +#, no-wrap +msgid " lp -d bar -o scaling=200 filename\n" +msgstr " lp -d bar -o scaling=200 Dateiname\n" + +# type: Plain text +#. type: Plain text +#: lp.man:242 +msgid "" +"Print a text file with 12 characters per inch, 8 lines per inch, and a 1 " +"inch left margin:" +msgstr "" +"Drucke eine Textdatei mit 12 Zeichen pro Zoll, 8 Zeilen pro Zoll und einem " +"Rand von einem Zoll:" + +# type: Plain text +#. type: Plain text +#: lp.man:244 +#, no-wrap +msgid " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename\n" +msgstr " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 Dateiname\n" + +# type: Plain text +#. type: Plain text +#: lp.man:254 +msgid "" +"The \"q\" option accepts a different range of values than the Solaris lp " +"command, matching the IPP job priority values (1-100, 100 is highest " +"priority) instead of the Solaris values (0-39, 0 is highest priority)." +msgstr "" +"Die Option »q« akzeptiert einen anderen Bereich von Werten als der Solaris-" +"lp-Befehl, der den IPP-Druckauftragsprioritätswerten (1-100, 100 ist der " +"höchste) anstelle der Solaris-Werte (0-39, 0 ist die höchste Priorität) " +"entspricht." + +# type: Plain text +#. type: Plain text +#: lp.man:257 +msgid "" +"I<cancel(1)>, I<lpadmin(8)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," +msgstr "" +"I<cancel(1)>, I<lpadmin(8)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," + +# type: TH +#. type: TH +#: lpmove.man:15 +#, no-wrap +msgid "lpmove" +msgstr "lpmove" + +# type: Plain text +#. type: Plain text +#: lpmove.man:18 +msgid "lpmove - move a job or all jobs to a new destination" +msgstr "lpmove - verschiebe einen oder alle Aufträge zu einem neuen Ziel" + +# type: Plain text +#. type: Plain text +#: lpmove.man:26 +msgid "" +"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<job " +"destination>" +msgstr "" +"B<lpmove> [ -E ] [ -h I<Server[:Port]> ] [ -U I<Benutzername> ] I<Auftrag " +"Ziel>" + +# type: Plain text +#. type: Plain text +#: lpmove.man:34 +msgid "" +"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<source " +"destination>" +msgstr "" +"B<lpmove> [ -E ] [ -h I<Server[:Port]> ] [ -U I<Benutzername> ] I<Quelle " +"Ziel>" + +# type: Plain text +#. type: Plain text +#: lpmove.man:38 +msgid "" +"B<lpmove> moves the specified I<job> or all jobs from I<source> to " +"I<destination>. I<job> can be the job ID number or the old destination and " +"job ID:" +msgstr "" +"B<lpmove> verschiebt den spezifizierten I<Auftrag> oder alle Aufträge von " +"der I<Quelle> zum I<Ziel>. I<Auftrag> kann die Auftrags-ID-Nummer oder das " +"alte Ziel und die Auftrags-ID sein:" + +# type: Plain text +#. type: Plain text +#: lpmove.man:43 +#, no-wrap +msgid "" +" lpmove 123 newprinter\n" +" lpmove oldprinter-123 newprinter\n" +msgstr "" +" lpmove 123 Neuerdrucker\n" +" lpmove Alterdrucker-123 Neuerdrucker\n" + +# type: Plain text +#. type: Plain text +#: lpmove.man:46 +msgid "The I<lpmove> command supports the following options:" +msgstr "Der Befehl I<lpmove> unterstützt die folgenden Optionen:" + +# type: Plain text +#. type: Plain text +#: lpmove.man:54 lpq.man:51 lpr.man:71 lprm.man:49 lpstat.man:61 +msgid "Specifies an alternate username." +msgstr "Spezifiziert einen alternativen Benutzernamen." + +# type: Plain text +#. type: Plain text +#: lpmove.man:58 lpq.man:59 lpr.man:55 lprm.man:53 lpstat.man:87 +msgid "Specifies an alternate server." +msgstr "Spezifiziert einen alternativen Server." + +# type: Plain text +#. type: Plain text +#: lpmove.man:60 lpstat.man:137 +msgid "I<cancel(1)>, I<lp(1)>," +msgstr "I<cancel(1)>, I<lp(1)>," + +# type: TH +#. type: TH +#: lpoptions.man.in:15 +#, no-wrap +msgid "lpoptions" +msgstr "lpoptions" + +#. type: TH +#: lpoptions.man.in:15 lpr.man:15 +#, no-wrap +msgid "29 August 2008" +msgstr "29. August 2008" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:18 +msgid "lpoptions - display or set printer options and defaults" +msgstr "lpoptions - zeigt oder setzt Druckeroptionen und -voreinstellungen" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:31 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -d " +"I<destination[/instance]> [ -o I<option[=value]> ] ... [ -o I<option[=value]" +"> ]" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] -d I<Ziel" +"[/Instanz]> [ -o I<Option[=Wert]> ] ... [ -o I<Option[=Wert]> ]" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:40 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -p " +"I<destination[/instance]> ] -l" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -p " +"I<Ziel[/Instanz]> ] -l" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:54 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -o I<option" +"[=value]> ] ... [ -o I<option[=value]> ] [ -p I<destination[/instance]> ] -r " +"I<option>" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -o " +"I<Option[=Wert]> ] ... [ -o I<Option[=Wert]> ] [ -p I<Ziel[/Instanz]> ] -r " +"I<Option>" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:62 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -x " +"I<destination[/instance]>" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] -x I<Ziel" +"[/Instanz]>" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:66 +msgid "" +"I<lpoptions> displays or sets printer options and defaults. I<lpoptions> " +"shows the default printer options when run with no arguments. Other options " +"include:" +msgstr "" +"I<lpoptions> zeigt oder setzt die Druckeroptionen und Vorgaben. I<lpoptions> " +"zeigt die Optionen des Standarddruckers, wenn es ohne Argumente aufgerufen " +"wird. Andere Optionen sind:" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:70 +msgid "Enables encryption when communicating with the CUPS server." +msgstr "Aktiviert Verschlüsselung für die Kommunikation mit dem CUPS-Server." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:74 +msgid "Uses an alternate username." +msgstr "Benutzt einen alternativen Benutzernamen." + +# type: TP +#. type: TP +#: lpoptions.man.in:74 +#, no-wrap +msgid "-d destination[/instance]" +msgstr "-d Ziel[/Instanz]" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:80 +msgid "" +"Sets the user default printer to I<destination>. If I<instance> is supplied " +"then that particular instance is used. This option overrides the system " +"default printer for the current user." +msgstr "" +"Setzt den Benutzer-Standarddrucker auf I<Ziel>. Falls I<Instanz> angegeben " +"ist, wird diese benutzt. Diese Option überschreibt den System-" +"Standarddrucker für den aktuellen Benutzer." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:84 +msgid "Uses an alternate server." +msgstr "Verwendet einen alternativen Server." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:88 +msgid "Lists the printer specific options and their current settings." +msgstr "" +"Listet die Drucker-spezifischen Optionen und ihre aktuellen Einstellungen " +"auf." + +# type: TP +#. type: TP +#: lpoptions.man.in:88 lpr.man:90 +#, no-wrap +msgid "-o option[=value]" +msgstr "-o Option[=Wert]" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:92 +msgid "Specifies a new option for the named destination." +msgstr "Spezifiziert eine neue Option für das benannte Ziel." + +# type: TP +#. type: TP +#: lpoptions.man.in:92 +#, no-wrap +msgid "-p destination[/instance]" +msgstr "-p Ziel[/Instanz]" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:98 +msgid "" +"Sets the destination and instance, if specified, for any options that " +"follow. If the named instance does not exist then it is created." +msgstr "" +"Setzt das Ziel und die Instanz, falls angegeben, für jede folgende Option. " +"Falls die benannte Instanz nicht existiert, wird sie erstellt." + +# type: TP +#. type: TP +#: lpoptions.man.in:98 +#, no-wrap +msgid "-r option" +msgstr "-r Option" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:102 +msgid "Removes the specified option for the named destination." +msgstr "Entfernt die spezifizierte Option für das benannte Ziel." + +# type: TP +#. type: TP +#: lpoptions.man.in:102 +#, no-wrap +msgid "-x destination[/instance]" +msgstr "-x Ziel[/Instanz]" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:108 +msgid "" +"Removes the options for the named destination and instance, if specified. If " +"the named instance does not exist then this does nothing." +msgstr "" +"Entfernt die Optionen für die benannten Ziele und Instanzen, falls " +"angegeben. Falls die benannte Instanz nicht existiert, passiert nichts." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:112 +msgid "" +"If no options are specified using the I<-o> option, then the current options " +"for the named printer are reported on the standard output." +msgstr "" +"Falls nicht mittels der Option I<-o> Optionen angegeben sind, werden die " +"aktuellen Optionen für die benannten Drucker auf der Standardausgabe " +"berichtet." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:115 +msgid "" +"Options set with the I<lpoptions> command are used by the I<lp(1)> and I<lpr" +"(1)> commands when submitting jobs." +msgstr "" +"Optionen, die mit dem Befehl I<lpoptions> gesetzt werden, werden von den " +"Befehlen I<lp(1)> und I<lpr(1)> bein Einreichen von Druckaufträgen verwandt." + +# type: SH +#. type: SH +#: lpoptions.man.in:115 +#, no-wrap +msgid "ROOT ACCOUNT OPTIONS" +msgstr "ROOT-KONTOOPTIONEN" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:119 +msgid "" +"When run by the root user, I<lpoptions> gets and sets default options and " +"instances for I<all users> in the @CUPS_SERVERROOT@/lpoptions file." +msgstr "" +"Wenn I<lpoptions> vom Benutzer root ausgeführt wird, erhält und setzt es " +"Optionen und Instanzen für I<alle Benutzer> in der Datei @CUPS_SERVERROOT@/" +"lpoptions." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:121 +msgid "The I<lpoptions> command is unique to CUPS." +msgstr "Der Befehl I<lpoptions> ist eine Besonderheit von CUPS." + +# type: SH +#. type: SH +#: lpoptions.man.in:121 +#, no-wrap +msgid "FILES" +msgstr "DATEIEN" + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:124 +msgid "" +"~/.cups/lpoptions - user defaults and instances created by non-root users." +msgstr "" +"~/.cups/lpoptions - Benutzervorgaben und von Nicht-Root-Benutzern erstellte " +"Instanzen." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:127 +msgid "" +"@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances created by " +"the root user." +msgstr "" +"@CUPS_SERVERROOT@/lpoptions - systemweite Vorgaben und Instanzen, die vom " +"Root-Benutzer erstellt wurden." + +# type: Plain text +#. type: Plain text +#: lpoptions.man.in:129 +msgid "I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpr(1)>," +msgstr "I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpr(1)>," + +# type: TH +#. type: TH +#: lppasswd.man:15 +#, no-wrap +msgid "lppasswd" +msgstr "lppasswd" + +# type: TH +#. type: TH +#: lppasswd.man:15 +#, no-wrap +msgid "22 February 2008" +msgstr "22. Februar 2008" + +# type: Plain text +#. type: Plain text +#: lppasswd.man:18 +msgid "lppasswd - add, change, or delete digest passwords." +msgstr "lppasswd - ändert, löscht oder fügt Auszugspasswörter hinzu." + +# type: Plain text +#. type: Plain text +#: lppasswd.man:23 +msgid "B<lppasswd> [ I<username> ]" +msgstr "B<lppasswd> [ I<Benutzername> ]" + +# type: Plain text +#. type: Plain text +#: lppasswd.man:29 +msgid "B<lppasswd> -a [ -g I<groupname> ] I<username>" +msgstr "B<lppasswd> -a [ -g I<Gruppenname> ] I<Benutzername>" + +# type: Plain text +#. type: Plain text +#: lppasswd.man:33 +msgid "B<lppasswd> -x I<username>" +msgstr "B<lppasswd> -x I<Benutzername>" + +# type: Plain text +#. type: Plain text +#: lppasswd.man:41 +msgid "" +"I<lppasswd> adds, changes, or deletes passwords in the CUPS digest password " +"file, I<passwd.md5>. When run by a normal user, I<lppasswd> will prompt for " +"the old and new passwords. When run by the super-user, I<lppasswd> can add " +"new accounts (I<-a username>), change existing accounts (I<username>), or " +"delete accounts (I<-x username>) in the digest password file. Digest " +"usernames do not have to match local UNIX usernames." +msgstr "" +"I<lppasswd> ändert, löscht oder fügt Passwörter in der CUPS-" +"Passwortauszugsdatei I<passwd.md5> hinzu. Wenn es von einem normalen " +"Benutzer ausgeführt wird, wird I<lppasswd> nach den alten und neuen " +"Passwörtern fragen. Wenn es von einem Super-user ausgeführt wird, kann " +"I<lppasswd> neue Konten hinzufügen (I<-a Benutzername>), existierende Konten " +"ändern (I<Benutzername>) oder Konten in der Passwortauszugsdatei löschen " +"(I<-x Benutzername>). Auszüge von Benutzernamen müssen nicht lokalen UNIX-" +"Benutzernamen entsprechen." + +# type: Plain text +#. type: Plain text +#: lppasswd.man:43 +msgid "I<lppasswd> supports the following options:" +msgstr "I<lppasswd> unterstützt die folgenden Optionen:" + +# type: TP +#. type: TP +#: lppasswd.man:43 +#, no-wrap +msgid "-g groupname" +msgstr "-g Gruppenname" + +# type: Plain text +#. type: Plain text +#: lppasswd.man:47 +msgid "Specifies a group other than the default system group." +msgstr "Spezifiziert eine von der Standardsystemgruppe verschiedene Gruppe" + +# type: SH +#. type: SH +#: lppasswd.man:47 +#, no-wrap +msgid "SECURITY ISSUES" +msgstr "SICHERHEITSPROBLEME" + +# FIXME s/program is not installed to allow ordinary users to change their +# passwords/program, which allows ordinary users to change their +# passwords, is not installed/ +#. type: Plain text +#: lppasswd.man:51 +msgid "" +"By default, the I<lppasswd> program is not installed to allow ordinary users " +"to change their passwords. To enable this, the I<lppasswd> command must be " +"made setuid to root with the command:" +msgstr "" +"Standardmäßig ist das Programm I<lppasswd> nicht installiert, um normalen " +"Benutzern zu erlauben, ihre Passwörter zu ändern. Um dies einzuschalten, " +"muss der I<lppasswd>-Befehl setuid auf Root gemacht werden mit dem Befehl:" + +#. type: Plain text +#: lppasswd.man:54 +#, no-wrap +msgid "chmod u+s lppasswd\n" +msgstr "chmod u+s lppasswd\n" + +#. type: Plain text +#: lppasswd.man:60 +msgid "" +"While every attempt has been made to make I<lppasswd> secure against " +"exploits that could grant super-user privileges to unprivileged users, " +"paranoid system administrators may wish to use Basic authentication with " +"accounts managed by PAM instead." +msgstr "" +"Obwohl jeglicher Versuch unternommen wurde, I<lppasswd> gegen Exploits zu " +"sichern, die unprivilegierten Benutzern Superuser-Rechte gewähren, könnten " +"paranoide Systemadministratoren wünschen, die grundlegende Authenifizierung " +"stattdessen mit Konten zu benutzen, die von PAM verwaltet werden." + +# type: Plain text +#. type: Plain text +#: lppasswd.man:62 +msgid "I<lp(1)>, I<lpr(1)>," +msgstr "I<lp(1)>, I<lpr(1)>," + +# type: TH +#. type: TH +#: lpq.man:15 +#, no-wrap +msgid "lpq" +msgstr "lpq" + +# type: Plain text +#. type: Plain text +#: lpq.man:18 +msgid "lpq - show printer queue status" +msgstr "lpq - zeigt den Status von Druckerwarteschlangen" + +# type: Plain text +#. type: Plain text +#: lpq.man:29 +msgid "" +"B<lpq> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination[/" +"instance]> ] [ -a ] [ -l ] [ I<+interval> ]" +msgstr "" +"B<lpq> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -P I<Ziel[/" +"Instanz]> ] [ -a ] [ -l ] [ I<+Intervall> ]" + +# type: Plain text +#. type: Plain text +#: lpq.man:33 +msgid "" +"I<lpq> shows the current print queue status on the named printer. Jobs " +"queued on the default destination will be shown if no printer or class is " +"specified on the command-line." +msgstr "" +"I<lpq> zeigt den aktuellen Druckerwarteschlangenstatus auf dem benannten " +"Drucker. Aufträge, die auf dem Standardziel auf den Druck warten, werden " +"angezeigt, falls kein Drucker oder keine Druckerklasse auf der Kommandozeile " +"angegeben ist." + +# type: Plain text +#. type: Plain text +#: lpq.man:37 +msgid "" +"The I<+interval> option allows you to continuously report the jobs in the " +"queue until the queue is empty; the list of jobs is shown once every " +"I<interval> seconds." +msgstr "" +"Die Option I<+Intervall> erlaubt es Ihnen, kontinuierlich die Aufträge in " +"der Warteschlange zu berichten, bis diese leer ist; die Liste der Aufträge " +"wird einmal alle I<Intervall> Sekunden angezeigt." + +# type: Plain text +#. type: Plain text +#: lpq.man:39 +msgid "I<lpq> supports the following options:" +msgstr "I<lpq> unterstützt die folgenden Optionen:" + +# type: TP +#. type: TP +#: lpq.man:43 lpr.man:63 lprm.man:41 +#, no-wrap +msgid "-P destination[/instance]" +msgstr "-P Ziel[/Instanz]" + +# type: Plain text +#. type: Plain text +#: lpq.man:47 +msgid "Specifies an alternate printer or class name." +msgstr "Spezifiziert einen alternativen Drucker- oder Klassennamen." + +# type: Plain text +#. type: Plain text +#: lpq.man:55 +msgid "Reports jobs on all printers." +msgstr "Berichtet Aufträge auf allen Druckern." + +# type: Plain text +#. type: Plain text +#: lpq.man:63 +msgid "Requests a more verbose (long) reporting format." +msgstr "Erbittet ein ausführlicheres (langes) Berichtsformat." + +# type: Plain text +#. type: Plain text +#: lpq.man:66 +msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," +msgstr "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," + +# type: TH +#. type: TH +#: lpr.man:15 +#, no-wrap +msgid "lpr" +msgstr "lpr" + +# type: Plain text +#. type: Plain text +#: lpr.man:18 +msgid "lpr - print files" +msgstr "lpr - druckt Dateien" + +# type: Plain text +#. type: Plain text +#: lpr.man:35 +msgid "" +"B<lpr> [ -E ] [ -H I<server[:port]> ] [ -U I<username> ] [ -P I<destination[/" +"instance]> ] [ -# I<num-copies> [ -h ] [ -l ] [ -m ] [ -o I<option[=value]" +"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<title> ] [ I<file(s)> ]" +msgstr "" +"B<lpr> [ -E ] [ -H I<Server[:Port]> ] [ -U I<Benutzername> ] [ -P I<Ziel[/" +"Instanz]> ] [ -# I<Anzahl-Kopien> [ -h ] [ -l ] [ -m ] [ -o I<Option[=Wert]" +"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<Titel> ] [ I<Datei(en)> ]" + +# type: Plain text +#. type: Plain text +#: lpr.man:40 +msgid "" +"I<lpr> submits files for printing. Files named on the command line are sent " +"to the named printer (or the default destination if no destination is " +"specified). If no files are listed on the command-line, I<lpr> reads the " +"print file from the standard input." +msgstr "" +"I<lpr> reicht Dateien zum Drucken ein. Auf der Kommandozeile benannte " +"Dateien werden zum benannten Drucker (oder zum Standardziel falls kein Ziel " +"angegeben ist) gesandt. Falls auf der Kommandozeile keine Dateien aufgeführt " +"sind, liest I<lpr> die zu druckenden Dateien von der Standardeingabe." + +# type: Plain text +#. type: Plain text +#: lpr.man:47 +msgid "The following options are recognized by I<lpr>:" +msgstr "Die folgenden Optionen werden von I<lpr> erkannt:" + +# type: TP +#. type: TP +#: lpr.man:51 +#, no-wrap +msgid "-H server[:port]" +msgstr "-H Server[:Port]" + +# type: TP +#. type: TP +#: lpr.man:55 +#, no-wrap +msgid "-C \"name\"" +msgstr "-C \"Name\"" + +# type: TP +#. type: TP +#: lpr.man:57 +#, no-wrap +msgid "-J \"name\"" +msgstr "-J \"Name\"" + +# type: TP +#. type: TP +#: lpr.man:59 +#, no-wrap +msgid "-T \"name\"" +msgstr "-T \"Name\"" + +# type: TP +#. type: TP +#: lpr.man:71 +#, no-wrap +msgid "-# I<copies>" +msgstr "-# I<Kopien>" + +# type: Plain text +#. type: Plain text +#: lpr.man:80 +msgid "" +"Disables banner printing. This option is equivalent to \"-o job-sheets=none" +"\"." +msgstr "" +"Deaktiviert das Drucken von Deckblättern. Diese Option ist äquivalent zu »-o " +"job-sheets=none«." + +# type: Plain text +#. type: Plain text +#: lpr.man:86 +msgid "" +"Specifies that the print file is already formatted for the destination and " +"should be sent without filtering. This option is equivalent to \"-o raw\"." +msgstr "" +"Spezifiziert, dass die Druckdatei bereits für das Ziel formatiert ist und " +"ohne Filtern gesendet werden soll. Diese Option ist äquivalent zu »-o raw«." + +# type: Plain text +#. type: Plain text +#: lpr.man:90 +msgid "Send an email on job completion." +msgstr "Schickt eine E-Mail nach Erledigung des Auftrags." + +# type: Plain text +#. type: Plain text +#: lpr.man:94 +msgid "Sets a job option." +msgstr "Setzt eine Auftrags-Option." + +# type: TP +#. type: TP +#: lpr.man:94 +#, no-wrap +msgid "-p" +msgstr "-p" + +# type: Plain text +#. type: Plain text +#: lpr.man:101 +msgid "" +"Specifies that the print file should be formatted with a shaded header with " +"the date, time, job name, and page number. This option is equivalent to \"-o " +"prettyprint\" and is only useful when printing text files." +msgstr "" +"Spezifiziert, dass die Druckdatei mit einem schattierten Kopf mit Datum, " +"Uhrzeit, Auftragsname und Seitennummer formatiert werden soll. Diese Option " +"Ist äquivalent zu »-o prettyprint« und ist nur beim Druck von Textdateien " +"nützlich." + +# type: Plain text +#. type: Plain text +#: lpr.man:105 +msgid "Hold job for printing." +msgstr "Druckauftrag zum Drucken anhalten." + +# type: Plain text +#. type: Plain text +#: lpr.man:110 +msgid "" +"Specifies that the named print files should be deleted after printing them." +msgstr "" +"Spezifiziert, dass die benannte Druckdatei nach dem Druck gelöscht werden " +"soll." + +# type: Plain text +#. type: Plain text +#: lpr.man:113 +msgid "" +"The \"c\", \"d\", \"f\", \"g\", \"i\", \"n\", \"t\", \"v\", and \"w\" " +"options are not supported by CUPS and produce a warning message if used." +msgstr "" +"Die Optionen »c«, »d«, »f«, »g«, »i«, »n«, »t«, »v« und »w« werden von CUPS " +"nicht unterstützt und führen bei Benutzung zu einer Warnmeldung." + +# type: Plain text +#. type: Plain text +#: lpr.man:116 +msgid "" +"I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpoptions(1)>, I<lpq(1)>, I<lprm(1)" +">, I<lpstat(1)>," +msgstr "" +"I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpoptions(1)>, I<lpq(1)>, I<lprm(1)" +">, I<lpstat(1)>," + +# type: TH +#. type: TH +#: lprm.man:15 +#, no-wrap +msgid "lprm" +msgstr "lprm" + +#. type: TH +#: lprm.man:15 +#, no-wrap +msgid "28 August 2009" +msgstr "28. August 2009" + +# type: Plain text +#. type: Plain text +#: lprm.man:18 +msgid "lprm - cancel print jobs" +msgstr "lprm - Druckaufträge abbrechen" + +# type: Plain text +#. type: Plain text +#: lprm.man:29 +msgid "" +"B<lprm> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination" +"[/instance]> ] [ - ] [ I<job ID(s)> ]" +msgstr "" +"B<lprm> [ -E ] [ -U I<Benutzername> ] [ -h I<Server[:Port]> ] [ -P I<Ziel[/" +"Instanz]> ] [ - ] [ I<Auftrags-ID(s)> ]" + +# type: Plain text +#. type: Plain text +#: lprm.man:35 +msgid "" +"I<lprm> cancels print jobs that have been queued for printing. If no " +"arguments are supplied, the current job on the default destination is " +"cancelled. You can specify one or more job ID numbers to cancel those jobs " +"or use the I<-> option to cancel all jobs." +msgstr "" +"I<lprm> bricht Druckaufträge ab, die zum Drucken eingereicht wurden. Falls " +"keine Argumente angegeben werden, wird der aktuelle Auftrag auf dem " +"Standardziel abgebrochen. Sie können eine oder mehrere Aufrags-ID-Nummern " +"angeben, um diese Aufträge abzubrechen, oder die Option I<-> verwenden, um " +"alle Aufträge abzubrechen." + +# type: Plain text +#. type: Plain text +#: lprm.man:37 +msgid "The I<lprm> command supports the following options:" +msgstr "Der Befehl I<lprm> unterstützt die folgenden Optionen:" + +# type: Plain text +#. type: Plain text +#: lprm.man:45 +msgid "Specifies the destination printer or class." +msgstr "Spezifiziert den Zieldrucker oder die Zielklasse." + +# type: Plain text +#. type: Plain text +#: lprm.man:56 +msgid "" +"The CUPS version of I<lprm> is compatible with the standard Berkeley I<lprm> " +"command." +msgstr "" +"Die CUPS-Version von I<lprm> ist zum Standard-Berkeley-Befehl I<lprm> " +"kompatibel." + +# type: Plain text +#. type: Plain text +#: lprm.man:59 +msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," +msgstr "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," + +# type: TH +#. type: TH +#: lpstat.man:15 +#, no-wrap +msgid "lpstat" +msgstr "lpstat" + +# type: TH +#. type: TH +#: lpstat.man:15 +#, no-wrap +msgid "10 September 2008" +msgstr "10. September 2008" + +# type: Plain text +#. type: Plain text +#: lpstat.man:18 +msgid "lpstat - print cups status information" +msgstr "lpstat - gibt CUPS-Statusinformationen aus" + +#. type: Plain text +#: lpstat.man:39 +msgid "" +"B<lpstat> [ -E ] [ -H ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -l ] " +"[ -W I<which-jobs> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -" +"d ] [ -o [ I<destination(s)> ] ] [ -p [ I<printer(s)> ] ] [ -r ] [ -R ] [ -" +"s ] [ -t ] [ -u [ I<user(s)> ] ] [ -v [ I<printer(s)> ] ]" +msgstr "" +"B<lpstat> [ -E ] [ -H ] [ -U I<Benutzername> ] [ -h I<Rechnername[:Port]> ] " +"[ -l ] [ -W I<welche-Druckaufträge> ] [ -a [ I<Ziel(e)> ] ] [ -c [ I<Klasse" +"(n)> ] ] [ -d ] [ -o [ I<Ziel(e)> ] ] [ -p [ I<Drucker> ] ] [ -r ] [ -R ] [ -" +"s ] [ -t ] [ -u [ I<Benutzer> ] ] [ -v [ I<Drucker> ] ]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:43 +msgid "" +"I<lpstat> displays status information about the current classes, jobs, and " +"printers. When run with no arguments, I<lpstat> will list jobs queued by the " +"current user." +msgstr "" +"I<lpstat> zeigt Statusinformationen über die aktuellen Klassen, Aufträge und " +"Drucker an. Falls I<lpstat> ohne Argumente aufgerufen wird, führt es die vom " +"aktuellen Benutzer eingereichten Druckaufträge auf." + +# type: Plain text +#. type: Plain text +#: lpstat.man:45 +msgid "The I<lpstat> command supports the following options:" +msgstr "Der Befehl I<lpstat> unterstützt die folgenden Optionen:" + +#. type: TP +#: lpstat.man:49 +#, no-wrap +msgid "-H" +msgstr "-H" + +# type: Plain text +#. type: Plain text +#: lpstat.man:53 +msgid "Shows the server hostname and port." +msgstr "Zeigt den Rechnernamen und Port des Servers." + +# type: TP +#. type: TP +#: lpstat.man:53 +#, no-wrap +msgid "-R" +msgstr "-R" + +# type: Plain text +#. type: Plain text +#: lpstat.man:57 +msgid "Shows the ranking of print jobs." +msgstr "Zeigt die Rangordnung der Druckaufträge." + +# type: TP +#. type: TP +#: lpstat.man:61 +#, no-wrap +msgid "-W which-jobs" +msgstr "-W welche-Aufträge" + +# type: Plain text +#. type: Plain text +#: lpstat.man:69 +msgid "" +"Specifies which jobs to show, I<completed> or I<not-completed> (the " +"default). This option I<must> appear before the I<-o> option and/or any " +"printer names, otherwise the default (not-completed) value will be used in " +"the request to the scheduler." +msgstr "" +"Spezifiziert welche Druckaufträge angezeigt werden sollen, die " +"»I<completed>« (abgeschlossenen) oder (standardmäßig) die »I<not-" +"completed>« (nicht-abgeschlossenen). Diese Option I<muss> vor der Option I<-" +"o> und/oder allen Druckernamen aufgeführt werden, da ansonsten der " +"Vorgabewert (not-completed) für alle Anfragen am Auftragsplaner (Scheduler) " +"verwandt wird." + +# type: TP +#. type: TP +#: lpstat.man:69 +#, no-wrap +msgid "-a [printer(s)]" +msgstr "-a [Drucker]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:74 +msgid "" +"Shows the accepting state of printer queues. If no printers are specified " +"then all printers are listed." +msgstr "" +"Zeigt den Akzeptierzustand der Druckerwarteschlangen. Falls keine Drucker " +"angegeben sind, werden alle Drucker aufgeführt." + +# type: TP +#. type: TP +#: lpstat.man:74 +#, no-wrap +msgid "-c [class(es)]" +msgstr "-c [Klasse(n)]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:79 +msgid "" +"Shows the printer classes and the printers that belong to them. If no " +"classes are specified then all classes are listed." +msgstr "" +"Zeigt die Druckerklassen und die zugehörigen Drucker. Falls keine Klassen " +"angegeben sind, werden alle Klassen aufgeführt." + +# type: TP +#. type: TP +#: lpstat.man:79 +#, no-wrap +msgid "-d" +msgstr "-d" + +# type: Plain text +#. type: Plain text +#: lpstat.man:83 +msgid "Shows the current default destination." +msgstr "Zeigt das aktuelle Standardziel." + +# type: Plain text +#. type: Plain text +#: lpstat.man:91 +msgid "Shows a long listing of printers, classes, or jobs." +msgstr "Zeigt eine lange Auflistung von Druckern, Klassen oder Aufträgen." + +# type: TP +#. type: TP +#: lpstat.man:91 +#, no-wrap +msgid "-o [destination(s)]" +msgstr "-o [Ziel(e)]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:96 +msgid "" +"Shows the jobs queue on the specified destinations. If no destinations are " +"specified all jobs are shown." +msgstr "" +"Zeigt die Auftragswarteschlangen der angegebenen Ziele. Falls keine Ziele " +"angegeben sind, werden alle Aufträge gezeigt." + +# type: TP +#. type: TP +#: lpstat.man:96 +#, no-wrap +msgid "-p [printer(s)]" +msgstr "-p [Drucker]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:101 +msgid "" +"Shows the printers and whether or not they are enabled for printing. If no " +"printers are specified then all printers are listed." +msgstr "" +"Zeigt die Drucker und ob sie zum Druck aktiviert wurden. Falls keine Drucker " +"angegeben wurden, werden alle Drucker aufgeführt." + +# type: Plain text +#. type: Plain text +#: lpstat.man:105 +msgid "Shows whether the CUPS server is running." +msgstr "Zeigt, ob der CUPS-Server läuft." + +# type: Plain text +#. type: Plain text +#: lpstat.man:112 +msgid "" +"Shows a status summary, including the default destination, a list of classes " +"and their member printers, and a list of printers and their associated " +"devices. This is equivalent to using the \"-d\", \"-c\", and \"-v\" options." +msgstr "" +"Zeigt eine Statuszusammenfassung, darunter das Standardziel, eine Liste der " +"Klassen und ihrer zugehörigen Drucker und eine Liste der Drucker und der " +"zugehörigen Geräte. Dies ist äquivalent zur Verwendung der Optionen »-d«, »-" +"c« und »-v«." + +# type: Plain text +#. type: Plain text +#: lpstat.man:117 +msgid "" +"Shows all status information. This is equivalent to using the \"-r\", \"-d" +"\", \"-c\", \"-v\", \"-a\", \"-p\", and \"-o\" options." +msgstr "" +"Zeigt alle Statusinformationen. Dies ist äquivalent zur Verwendung der " +"Optionen »-r«, »-d«, »-c«, »-v«, »-a«, »-p«, and »-o«." + +# type: TP +#. type: TP +#: lpstat.man:117 +#, no-wrap +msgid "-u [user(s)]" +msgstr "-u [Benutzer]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:122 +msgid "" +"Shows a list of print jobs queued by the specified users. If no users are " +"specified, lists the jobs queued by the current user." +msgstr "" +"Zeigt eine Liste von Druckaufträgen, die von den angegebenen Benutzern " +"anstehen. Wenn keine Benutzer angegeben wurden, werden die Druckaufträge des " +"aktuellen Benutzers aufgelistet." + +# type: TP +#. type: TP +#: lpstat.man:122 +#, no-wrap +msgid "-v [printer(s)]" +msgstr "-v [Drucker]" + +# type: Plain text +#. type: Plain text +#: lpstat.man:127 +msgid "" +"Shows the printers and what device they are attached to. If no printers are " +"specified then all printers are listed." +msgstr "" +"Zeigt die Drucker und welchem Gerät sie zugeordnet sind. Wenn keine Drucker " +"angegeben sind, werden alle Drucker aufgelistet." + +# type: Plain text +#. type: Plain text +#: lpstat.man:131 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", and \"#\". Also, printer " +"and class names are I<not> case-sensitive." +msgstr "" +"Anders als in einem System-V-Drucksystem erlaubt CUPS, dass Druckernamen " +"jedes druckbare Zeichen außer LEERZEICHEN, TABULATOR, »/« oder »#« " +"enthalten. Außerdem wird bei Drucker- und Klassennamen Groß- und " +"Kleinschreibung nicht unterschieden." + +# type: Plain text +#. type: Plain text +#: lpstat.man:133 +msgid "The \"-h\", \"-E\", \"-U\", and \"-W\" options are unique to CUPS." +msgstr "" +"Die Optionen »-h«, »-E«, »-U« und »-W« sind eine Besonderheit von CUPS." + +# type: Plain text +#. type: Plain text +#: lpstat.man:135 +msgid "The Solaris \"-f\", \"-P\", and \"-S\" options are silently ignored." +msgstr "" +"Die Solaris-Optionen »-f«, »-P« und »-S« werden stillschweigend ignoriert." + +# type: TH +#. type: TH +#: mailto.conf.man:15 +#, no-wrap +msgid "mailto.conf" +msgstr "mailto.conf" + +# type: TH +#. type: TH +#: mailto.conf.man:15 +#, no-wrap +msgid "12 July 2006" +msgstr "12. Juli 2006" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:18 +msgid "mailto.conf - configuration file for cups email notifier" +msgstr "" +"mailto.conf - Konfigurationsdatei für Versender von CUPS-E-Mail-" +"Benachrichtigungen" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:21 +msgid "" +"The I<mailto.conf> file defines the local mail server and email notification " +"preferences for CUPS." +msgstr "" +"Die Datei I<mailto.conf> definiert den lokalen Mail-Server und die E-Mail-" +"Benachrichtigungseinstellungen für CUPS." + +# type: TP +#. type: TP +#: mailto.conf.man:25 +#, no-wrap +msgid "Cc I<cc-address@domain.com>" +msgstr "Cc I<cc-address@domain.com>" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:29 +msgid "Specifies an additional recipient for all email notifications." +msgstr "" +"Spezifiziert einen zusätzlichen Empfänger für alle E-Mail-Benachrichtigungen." + +# type: TP +#. type: TP +#: mailto.conf.man:29 +#, no-wrap +msgid "From I<from-address@domain.com>" +msgstr "Von I<from-address@domain.com>" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:33 +msgid "Specifies the sender of email notifications." +msgstr "Spezifiziert den Sender von E-Mail-Benachrichtigungen." + +# type: TP +#. type: TP +#: mailto.conf.man:33 +#, no-wrap +msgid "Sendmail I<sendmail command and options>" +msgstr "Sendmail I<Sendmail-Befehl und Optionen>" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:40 +msgid "" +"Specifies the sendmail command to use when sending email notifications. Only " +"one I<Sendmail> or I<SMTPServer> line may be present in the I<mailto.conf> " +"file. If multiple lines are present, only the last one is used." +msgstr "" +"Spezifiziert den Sendmail-Befehl, der benutzt wird, wenn E-Mail-" +"Benachrichtigungen versandt werden. Nur eine I<Sendmail>- oder I<SMTPServer>-" +"Zeile kann in der I<mailto.conf>-Datei vorhanden sein. Wenn mehrere Zeilen " +"vorhanden sind, wird nur die letzte benutzt." + +# type: TP +#. type: TP +#: mailto.conf.man:40 +#, no-wrap +msgid "SMTPServer I<servername>" +msgstr "SMTPServer I<Servername>" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:47 +msgid "" +"Specifies a SMTP server to send email notifications to. Only one I<Sendmail> " +"or I<SMTPServer> line may be present in the I<mailto.conf> file. If multiple " +"lines are present, only the last one is used." +msgstr "" +"Spezifiziert den SMTP-Server, der benutzt wird, um E-Mail-Benachrichtigungen " +"zu versenden. Nur eine I<Sendmail>- oder I<SMTPServer>-Zeile kann in der " +"I<mailto.conf>-Datei vorhanden sein. Wenn mehrere Zeilen vorhanden sind, " +"wird nur die letzte benutzt." + +# type: TP +#. type: TP +#: mailto.conf.man:47 +#, no-wrap +msgid "Subject I<subject-prefix>" +msgstr "Betreff I<Betreff-Vorsilbe>" + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:51 +msgid "" +"Specifies a prefix string for the subject line of an email notification." +msgstr "" +"Spezifiziert eine Vorsilbenzeichenkette für die Betreffzeile einer E-Mail-" +"Benachrichtigung." + +# type: Plain text +#. type: Plain text +#: mailto.conf.man:54 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, I<printers.conf(5)>," +msgstr "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, I<printers.conf(5)>," + +# type: TH +#. type: TH +#: mime.convs.man:15 +#, no-wrap +msgid "mime.convs" +msgstr "mime.convs" + +# type: Plain text +#. type: Plain text +#: mime.convs.man:18 +msgid "mime.convs - mime type conversion file for cups" +msgstr "mime.convs - MIME-Typ-Konvertierungsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: mime.convs.man:23 +msgid "" +"The I<mime.convs> file defines the filters that are available for converting " +"files from one format to another. The standard filters support text, PDF, " +"PostScript, HP-GL/2, and many types of image files." +msgstr "" +"Die Datei I<mime.convs> definiert die Filter, die für das Konvertieren von " +"einem Format in ein anderes verfügbar sind. Der Standardfilter unterstützt " +"text, PDF, PostScript, HP-GL/2 und viele Bilddateitypen." + +# type: Plain text +#. type: Plain text +#: mime.convs.man:26 +msgid "" +"Additional filters can be added to the I<mime.convs> file or (preferably) to " +"other files in the CUPS configuration directory." +msgstr "" +"Zusätzliche Filter können zu der Datei I<mime.convs> oder (bevorzugt) zu " +"anderen Dateien im CUPS-Konfigurationsverzeichnis hinzugefügt werden." + +# type: Plain text +#. type: Plain text +#: mime.convs.man:31 +msgid "" +"Each line in the I<mime.convs> file is a comment, blank, or filter line. " +"Comment lines start with the # character. Filter lines specify the source " +"and destination MIME types along with a relative cost associated with the " +"filter and the filter to run:" +msgstr "" +"Jede Zeile in der Datei I<mime.convs> ist ein Kommentar, leer oder eine " +"Filterzeile. Kommentardateien beginnen mit dem »#«-Zeichen. Filterzeilen " +"spezifizieren den Quell- und Ziel-MIME-Typ zusammen mit den relativen " +"Belastungen, die mit dem Filter assoziiert sind, und den auszuführenden " +"Filter:" + +# type: Plain text +#. type: Plain text +#: mime.convs.man:36 +#, no-wrap +msgid "" +"super/type super/type cost filter\n" +"application/postscript application/vnd.cups-raster 50 pstoraster\n" +msgstr "" +"super/type super/type cost filter\n" +"application/postscript application/vnd.cups-raster 50 pstoraster\n" + +# type: Plain text +#. type: Plain text +#: mime.convs.man:40 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " +"I<printers.conf(5)>," +msgstr "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " +"I<printers.conf(5)>," + +# type: TH +#. type: TH +#: mime.types.man:15 +#, no-wrap +msgid "mime.types" +msgstr "mime.types" + +# type: TH +#. type: TH +#: mime.types.man:15 +#, no-wrap +msgid "16 May 2009" +msgstr "16. Mai 2009" + +# type: Plain text +#. type: Plain text +#: mime.types.man:18 +msgid "mime.types - mime type description file for cups" +msgstr "mime.types - MIME-Typ-Beschreibungsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: mime.types.man:20 +msgid "The I<mime.types> file defines the recognized file types." +msgstr "Die Datei I<mime.types> beschreibt die erkannten Dateitypen." + +# type: Plain text +#. type: Plain text +#: mime.types.man:24 +msgid "" +"Additional file types can be added to I<mime.types> or (preferably) in " +"additional files in the CUPS configuration directory with the extension \"." +"types\"." +msgstr "" +"Zusätzliche Dateitypen können zu den I<mime.types> oder (vorzugsweise) in " +"zusätzlichen Dateien im CUPS-Konfigurationsverzeichnis mit der Endung »." +"types« hinzugefügt werden." + +# type: Plain text +#. type: Plain text +#: mime.types.man:30 +msgid "" +"Each line in the I<mime.types> file is a comment, blank, or rule line. " +"Comment lines start with the # character. Rule lines start with the MIME " +"type name and are optionally followed by a series of file recognition rules " +"that are used to automatically identify print and web files:" +msgstr "" +"Jede Zeile in der Datei I<mime.types> ist ein Kommentar, leer oder eine " +"Regelzeile. Kommentarzeilen beginnen mit dem #-Zeichen. Regelzeilen beginnen " +"mit dem MIME-Typnamen und werden optional von einer Serie von " +"Dateierkennungsregeln gefolgt, die benutzt werden, um Druck- und Web-Dateien " +"automatisch zu erkennen:" + +# type: Plain text +#. type: Plain text +#: mime.types.man:34 +#, no-wrap +msgid " super/type rule [ ... ruleN]\n" +msgstr " super/type Regel [ ... RegelN]\n" + +#. type: Plain text +#: mime.types.man:38 +msgid "" +"MIME type names are case-insensitive and are sorted in ascending " +"alphanumeric order for the purposes of matching. See the \"TYPE MATCHING AND " +"PRIORITY\" section for more information." +msgstr "" +"Bei MIME-Typnamen wird Groß- und Kleinschreibung nicht berücksichtigt. Sie " +"sind in absteigender alphanumerischer Reihenfolge für Suchzwecke sortiert. " +"Siehe den Abschnitt »TYP-ÜBEREINSTIMMUNG UND PRIORITÄT«, um weitere " +"Informationen zu erhalten." + +# type: Plain text +#. type: Plain text +#: mime.types.man:42 +msgid "" +"The rules may be grouped using parenthesis, joined using \"+\" for a logical " +"AND and \",\" or whitespace for a logical OR, and negated using \"!\"." +msgstr "" +"Die Regeln könnten durch Benutzung von Klammern gruppiert werden, zum " +"Aneinanderhängen wird »+« für ein logisches UND und »,« oder Leerzeichen für " +"ein logisches ODER und für Negation »!« benutzt." + +# type: SH +#. type: SH +#: mime.types.man:42 +#, no-wrap +msgid "RULES" +msgstr "REGELN" + +# type: Plain text +#. type: Plain text +#: mime.types.man:45 +msgid "" +"Rules take two forms - a filename extension by itself and functions with " +"test values inside parenthesis. The following functions are available:" +msgstr "" +"Regeln nehmen zwei Formen an - eine eigenständige Dateinamenerweiterung und " +"Funktionen mit Testwerten innerhalb von Klammern. Die folgenden Funktionen " +"sind verfügbar:" + +# type: TP +#. type: TP +#: mime.types.man:45 +#, no-wrap +msgid "match(\"pattern\")" +msgstr "match(\"Muster\")" + +# type: Plain text +#. type: Plain text +#: mime.types.man:49 +msgid "Pattern match on filename" +msgstr "Muster passt zu Dateiname" + +# type: TP +#. type: TP +#: mime.types.man:49 +#, no-wrap +msgid "ascii(offset,length)" +msgstr "ascii(Versatz,Länge)" + +# type: Plain text +#. type: Plain text +#: mime.types.man:53 +msgid "True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)" +msgstr "" +"Wahr, wenn Bytes gültiges druckbares ASCII sind (CR, NL, TAB, BS, 32-126)" + +# type: TP +#. type: TP +#: mime.types.man:53 +#, no-wrap +msgid "printable(offset,length)" +msgstr "printable(Versatz,Länge)" + +# type: Plain text +#. type: Plain text +#: mime.types.man:57 +msgid "" +"True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)" +msgstr "" +"Wahr, wenn Bytes gültige druckbare 8-Bit-Zeichen sind (CR, NL, TAB, BS, " +"32-126, 128-254)" + +# type: TP +#. type: TP +#: mime.types.man:57 +#, no-wrap +msgid "priority(number)" +msgstr "priority(Zahl)" + +#. type: Plain text +#: mime.types.man:62 +msgid "" +"Specifies the relative priority of this MIME type. The default priority is " +"100. Larger values have higher priority while smaller values have lower " +"priority." +msgstr "" +"Spezifiziert die relative Priorität dieses MIME-Typs. Die Vorgabepriorität " +"ist 100. Größere Werte haben höhere Priorität, während kleinere Werte eine " +"niedrigere Priorität haben." + +# type: TP +#. type: TP +#: mime.types.man:62 +#, no-wrap +msgid "string(offset,\"string\")" +msgstr "string(Versatz,\"Zeichenkette\")" + +# type: Plain text +#. type: Plain text +#: mime.types.man:66 +msgid "True if bytes are identical to string" +msgstr "Wahr, wenn Bytes der Zeichenkette entsprechen" + +# type: TP +#. type: TP +#: mime.types.man:66 +#, no-wrap +msgid "istring(offset,\"string\")" +msgstr "istring(Versatz,\"Zeichenkette\")" + +# type: Plain text +#. type: Plain text +#: mime.types.man:70 +msgid "True if a case-insensitive comparison of the bytes is identical" +msgstr "" +"Wahr, wenn ein Vergleich, der Groß-/Kleinschreibung ignoriert, identisch ist" + +# type: TP +#. type: TP +#: mime.types.man:70 +#, no-wrap +msgid "char(offset,value)" +msgstr "char(Versatz,Wert)" + +# type: Plain text +#. type: Plain text +#: mime.types.man:74 +msgid "True if byte is identical" +msgstr "Wahr, wenn Byte identisch ist" + +# type: TP +#. type: TP +#: mime.types.man:74 +#, no-wrap +msgid "short(offset,value)" +msgstr "short(Versatz,Wert)" + +# type: Plain text +#. type: Plain text +#: mime.types.man:78 +msgid "True if 16-bit integer is identical" +msgstr "Wahr, wenn 16-Bit-Ganzzahl identisch ist" + +# type: TP +#. type: TP +#: mime.types.man:78 +#, no-wrap +msgid "int(offset,value)" +msgstr "int(Versatz,Wert)" + +# type: Plain text +#. type: Plain text +#: mime.types.man:82 +msgid "True if 32-bit integer is identical" +msgstr "Wahr, wenn 32-Bit-Ganzzahl identisch ist" + +# type: TP +#. type: TP +#: mime.types.man:82 +#, no-wrap +msgid "locale(\"string\")" +msgstr "locale(\"Zeichenkette\")" + +# type: Plain text +#. type: Plain text +#: mime.types.man:86 +msgid "True if current locale matches string" +msgstr "Wahr, wenn aktuelle Locale zu Zeichenkette passt" + +# type: TP +#. type: TP +#: mime.types.man:86 +#, no-wrap +msgid "contains(offset,range,\"string\")" +msgstr "contains(Versatz,Bereich,\"Zeichenkette\")" + +# type: Plain text +#. type: Plain text +#: mime.types.man:90 +msgid "True if the range contains the string" +msgstr "Wahr, wenn der Bereich die Zeichenkette enthält" + +# type: SH +#. type: SH +#: mime.types.man:90 +#, no-wrap +msgid "STRING CONSTANTS" +msgstr "ZEICHENKETTENKONSTANTEN" + +# type: Plain text +#. type: Plain text +#: mime.types.man:94 +msgid "" +"String constants can be specified inside quotes (\"\") for strings " +"containing whitespace and angle brackets (E<lt>E<gt>) for hexadecimal " +"strings." +msgstr "" +"Zeichenkettenkonstanten können für Zeichenketten, die Leerzeichen und spitze " +"Klammern (E<lt>E<gt>) für hexadezimale Zeichenketten enthalten, innerhalb " +"von Anführungszeichen (\"\") angegeben werden." + +#. type: SH +#: mime.types.man:94 +#, no-wrap +msgid "TYPE MATCHING AND PRIORITY" +msgstr "TYP-ÜBEREINSTIMMUNG UND PRIORITÄT" + +#. type: Plain text +#: mime.types.man:101 +msgid "" +"When CUPS needs to determine the MIME type of a given file, it checks every " +"MIME type defined in the .types files. When two types have the same matching " +"rules, the type chosen will depend on the type name and priority, with " +"higher- priority types being used over lower-priority ones. If the types " +"have the same priority, the type names are sorted alphanumerically in " +"ascending order and the first type is chosen." +msgstr "" +"Wenn CUPS den MIME-Typ einer gegebenen Datei bestimmt, wird jeder MIME-Typ, " +"der in den .types-Dateien definiert ist, geprüft. Wenn zwei Typen die " +"gleichen passenden Regeln aufweisen, dann hängt der ausgewählte Typ von " +"Typname und der Priorität ab, wobei Typen höherer Priorität denen mit " +"niedriger Priorität vorgezogen werden. Wenn die Typen die gleiche Priorität " +"haben, werden die Typnamen in alphanumerischer Reihenfolge sortiert und der " +"erste ausgewählt." + +#. type: Plain text +#: mime.types.man:106 +msgid "" +"For example, if two types \"text/bar\" and \"text/foo\" are defined as " +"matching the extension \"doc\", normally the type \"text/bar\" will be " +"chosen since its name is alphanumerically smaller than \"text/foo\". " +"However, if \"text/foo\" also defines a higher priority than \"text/bar\", " +"\"text/foo\" will be chosen instead." +msgstr "" +"Wenn zum Beispiel zwei Typen »text/bar« und »text/foo« als passend zur " +"Erweiterung »doc« definiert sind, wird normalerweise »text/bar« ausgewählt, " +"weil der Name alphanumerisch kleiner ist als »text/foo«. Wenn jedoch für " +"»text/foo« außerdem eine höhere Priorität als für »text/bar« definiert ist, " +"wird stattdessen »text/foo« ausgewählt." + +# type: Plain text +#. type: Plain text +#: mime.types.man:109 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " +"I<printers.conf(5)>," +msgstr "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " +"I<printers.conf(5)>," + +# type: TH +#. type: TH +#: printers.conf.man:15 +#, no-wrap +msgid "printers.conf" +msgstr "printers.conf" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:18 +msgid "printers.conf - printer configuration file for cups" +msgstr "printers.conf - Druckerkonfigurationsdatei für CUPS" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:23 +msgid "" +"The I<printers.conf> file defines the local printers that are available. It " +"is normally located in the I</etc/cups> directory and is generated " +"automatically by the I<cupsd(8)> program when printers are added or deleted." +msgstr "" +"Die Datei I<printers.conf> definiert die verfügbaren lokalen Drucker. Sie " +"befindet sich normalerweise im Verzeichnis I</etc/cups> und wird vom " +"Programm I<cupsd(8)> automatisch beim Löschen oder Hinzufügen von Druckern " +"generiert." + +# type: TP +#. type: TP +#: printers.conf.man:27 +#, no-wrap +msgid "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" +msgstr "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:31 +msgid "Defines a specific printer." +msgstr "Definiert einen speziellen Drucker." + +# type: TP +#. type: TP +#: printers.conf.man:31 +#, no-wrap +msgid "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" +msgstr "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:35 +msgid "Defines a default printer." +msgstr "Definiert einen Standarddrucker." + +# type: TP +#. type: TP +#: printers.conf.man:49 +#, no-wrap +msgid "DeviceURI uri" +msgstr "DeviceURI uri" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:53 +msgid "Specifies the device URI for a printer." +msgstr "Spezifiziert die Geräte-URI eines Druckers." + +# type: TP +#. type: TP +#: printers.conf.man:53 +#, no-wrap +msgid "ErrorPolicy abort-job" +msgstr "ErrorPolicy abort-job" + +# type: TP +#. type: TP +#: printers.conf.man:55 +#, no-wrap +msgid "ErrorPolicy retry-current-job" +msgstr "ErrorPolicy retry-current-job" + +# type: TP +#. type: TP +#: printers.conf.man:57 +#, no-wrap +msgid "ErrorPolicy retry-job" +msgstr "ErrorPolicy retry-job" + +# type: TP +#. type: TP +#: printers.conf.man:59 +#, no-wrap +msgid "ErrorPolicy stop-printer" +msgstr "ErrorPolicy stop-printer" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:63 +msgid "Specifies the error policy for the printer." +msgstr "Spezifiziert die Fehler-Richtlinien für den Drucker." + +# type: TP +#. type: TP +#: printers.conf.man:87 +#, no-wrap +msgid "PortMonitor monitor" +msgstr "PortMonitor Monitor" + +# type: Plain text +#. type: Plain text +#: printers.conf.man:91 +msgid "Specifies the port monitor for a printer." +msgstr "Spezifiziert den Port-Monitor eines Druckers." + +# type: Plain text +#. type: Plain text +#: printers.conf.man:118 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>," +msgstr "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>," + +# type: TH +#. type: TH +#: subscriptions.conf.man:15 +#, no-wrap +msgid "subscriptions.conf" +msgstr "subscriptions.conf" + +# type: TH +#. type: TH +#: subscriptions.conf.man:15 +#, no-wrap +msgid "30 April 2006" +msgstr "30. April 2006" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:18 +msgid "subscriptions.conf - subscriptions file for cups" +msgstr "subscriptions.conf - Abonnement-Datei für CUPS" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:23 +msgid "" +"The I<subscriptions.conf> file defines the local subscriptions that are " +"active. It is normally located in the I</etc/cups> directory and is " +"generated automatically by the I<cupsd(8)> program when subscriptions are " +"created, renewed, or cancelled." +msgstr "" +"Die Datei I<subscriptions.conf> definiert die Abonnements, die lokal aktiv " +"sind. Sie liegt normalerweise im Verzeichnis I</etc/cups> und wird " +"automatisch vom I<cupsd(8)>-Programm generiert, wenn Abonnements erstellt, " +"erneuert oder beendet werden." + +# type: TP +#. type: TP +#: subscriptions.conf.man:27 +#, no-wrap +msgid "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" +msgstr "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:31 +msgid "Defines a subscription." +msgstr "Definiert ein Abonnement." + +# type: TP +#. type: TP +#: subscriptions.conf.man:31 +#, no-wrap +msgid "Events name [ ... name ]" +msgstr "Ereignisse Name [ ... Name ]" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:35 +msgid "Specifies the events that are subscribed." +msgstr "Gibt die Ereignisse an, die abonniert werden." + +# type: TP +#. type: TP +#: subscriptions.conf.man:35 +#, no-wrap +msgid "ExpirationTime unix-time" +msgstr "ExpirationTime unix-time" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:40 +msgid "" +"Specifies the expiration time of a subscription as a UNIX time value in " +"seconds since January 1st, 1970." +msgstr "" +"Spezifiziert die Ablaufzeit eines Abonnements als UNIX-Zeitwert in Sekunden " +"seit dem 1. Januar 1970." + +# type: TP +#. type: TP +#: subscriptions.conf.man:40 +#, no-wrap +msgid "Interval seconds" +msgstr "Intervallsekunden" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:45 +msgid "" +"Specifies the preferred time interval for event notifications in seconds." +msgstr "" +"Spezifiziert das bevorzugte Zeitintervall für Ereignisbenachrichtigungen in " +"Sekunden." + +# type: TP +#. type: TP +#: subscriptions.conf.man:45 +#, no-wrap +msgid "JobId job-id" +msgstr "JobId job-id" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:49 +msgid "Specifies the job ID associated with the subscription." +msgstr "Spezifiziert die mit einem Abonnement verbundene Job-ID." + +# type: TP +#. type: TP +#: subscriptions.conf.man:49 +#, no-wrap +msgid "LeaseDuration seconds" +msgstr "LeaseDuration Sekunden" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:54 +msgid "" +"Specifies the number of seconds that the subscription is valid for. If 0, " +"the subscription does not expire." +msgstr "" +"Gibt die Anzahl der Sekunden an, für die ein Abonnement gültig ist. Falls " +"der Wert 0 ist, läuft das Abonnement nicht ab." + +# type: TP +#. type: TP +#: subscriptions.conf.man:54 +#, no-wrap +msgid "NextEventId number" +msgstr "NextEventId Zahl" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:59 +msgid "Specifies the next notify-sequence-number to use for the subscription." +msgstr "" +"Spezifiziert die nächste Notify-sequence-number, die für ein Abonnement " +"benutzt wird." + +# type: TP +#. type: TP +#: subscriptions.conf.man:59 +#, no-wrap +msgid "NextSubscriptionId number" +msgstr "NextSubscriptionId Zahl" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:63 +msgid "Specifies the next subscription-id to use." +msgstr "Spezifiziert die nächste zu benutzende Subscription-ID." + +# type: TP +#. type: TP +#: subscriptions.conf.man:63 +#, no-wrap +msgid "Owner username" +msgstr "Owner Benutzername" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:67 +msgid "Specifies the user that owns the subscription." +msgstr "Spezifiziert den Benutzer, dem das Abonnement gehört." + +# type: TP +#. type: TP +#: subscriptions.conf.man:67 +#, no-wrap +msgid "PrinterName printername" +msgstr "PrinterName Druckername" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:71 +msgid "Specifies the printer or class associated with the subscription." +msgstr "" +"Gibt den Drucker oder die Klasse an, die mit dem Abonnement verbunden ist." + +# type: TP +#. type: TP +#: subscriptions.conf.man:71 +#, no-wrap +msgid "Recipient uri" +msgstr "Recipient URI" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:75 +msgid "Specifies the notify-recipient-uri value for push-type notifications." +msgstr "" +"Spezifiziert den Notify-recipient-uri-Wert für Push-type-Benachrichtigungen." + +# type: TP +#. type: TP +#: subscriptions.conf.man:75 +#, no-wrap +msgid "UserData hex-escaped-data" +msgstr "UserData hex-escaped-data" + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:80 +msgid "" +"Specifies user data to be included in event notifications. This is typically " +"the \"from\" address in mailto: notifications." +msgstr "" +"Spezifiziert Benutzerdaten, die in Ereignisbenachrichtigungen eingefügt " +"werden. Dies ist normalerweise die »Von«-Adresse in mailto:-" +"Benachrichtigungen." + +# type: Plain text +#. type: Plain text +#: subscriptions.conf.man:83 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, printers.conf(5)" +msgstr "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, printers.conf(5)" + +# type: Plain text +#~ msgid "" +#~ "Sets a standard System V interface script or PPD file from the I<model> " +#~ "directory." +#~ msgstr "" +#~ "Setzt ein Standard-System-V-Schnittstellenskript oder eine PPD-Datei aus " +#~ "dem Verzeichnis I<Modell>." + +# type: TH +#~ msgid "17 November 2008" +#~ msgstr "17. November 2008" + +# type: TH +#~ msgid "14 July 2009" +#~ msgstr "14. Juli 2009" + +# type: TP +#~ msgid "DefaultCharset charset" +#~ msgstr "DefaultCharset Zeichensatz" + +# type: Plain text +#~ msgid "Specifies the default character set to use for text." +#~ msgstr "" +#~ "Spezifiziert den standardmäßig für Text zu verwendenden Zeichensatz." + +# type: TH +#~ msgid "2 March 2009" +#~ msgstr "2. März 2009" diff --git a/man/po4a/po/fr.po b/man/po4a/po/fr.po new file mode 100644 index 0000000..d4f96ee --- /dev/null +++ b/man/po4a/po/fr.po @@ -0,0 +1,8414 @@ +# Translation of the cups manpages into French. +# +# Original translations from: +#  Gilles QUERRET <gilles.querret@nerim.net>, 2003, 2005. +# Vérifier cupsd.8 +# Nicolas François <nicolas.francois@centraliens.net>, 2007. +# +msgid "" +msgstr "" +"Project-Id-Version: cups\n" +"POT-Creation-Date: 2008-09-11 12:06+0200\n" +"PO-Revision-Date: 2008-05-02 02:50+0200\n" +"Last-Translator: Nicolas François <nicolas.francois@centraliens.net>\n" +"Language-Team: French <debian-l10n-french@lists.debian.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# type: TH +#: cupsaccept.man:15 +#, no-wrap +msgid "accept" +msgstr "accept" + +# type: TH +#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 +#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 +#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 +#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 +#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 +#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 +#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 +#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 +#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 +#: subscriptions.conf.man:15 +#, no-wrap +msgid "Common UNIX Printing System" +msgstr "Common UNIX Printing System" + +# type: TH +#: cupsaccept.man:15 classes.conf.man:15 cupsd.man.in:15 cupsenable.man:16 +#: cups-polld.man:15 lpc.man:15 lpinfo.man:15 lpmove.man:15 lpr.man:15 +#: lprm.man:15 mime.types.man:15 printers.conf.man:15 +#, no-wrap +msgid "12 February 2006" +msgstr "12 février 2006" + +# type: TH +#: cupsaccept.man:15 backend.man:15 cancel.man:15 classes.conf.man:15 +#: client.conf.man.in:15 cupsaddsmb.man.in:15 cups-config.man:15 +#: cupsctl.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 cupsd.man.in:15 +#: cups-driverd.man.in:15 cupsenable.man:16 cupsfilter.man:14 +#: cups-lpd.man.in:15 cups-polld.man:15 cups-snmp.conf.man:15 +#: cupstestdsc.man:15 cupstestppd.man:15 filter.man:15 lpadmin.man:15 +#: lpc.man:15 lpinfo.man:15 lp.man:15 lpmove.man:15 lpoptions.man.in:15 +#: lppasswd.man:15 lpq.man:15 lpr.man:15 lprm.man:15 lpstat.man:15 +#: mailto.conf.man:15 mime.convs.man:15 mime.types.man:15 printers.conf.man:15 +#: subscriptions.conf.man:15 +#, no-wrap +msgid "Apple Inc." +msgstr "Apple Inc." + +# type: SH +#: cupsaccept.man:16 backend.man:17 cancel.man:16 classes.conf.man:16 +#: client.conf.man.in:16 cupsaddsmb.man.in:16 cups-config.man:16 +#: cupsctl.man:16 cupsd.conf.man.in:16 cups-deviced.man.in:16 cupsd.man.in:16 +#: cups-driverd.man.in:16 cupsenable.man:17 cupsfilter.man:15 +#: cups-lpd.man.in:16 cups-polld.man:16 cups-snmp.conf.man:16 +#: cupstestdsc.man:16 cupstestppd.man:16 filter.man:16 lpadmin.man:16 +#: lpc.man:16 lpinfo.man:16 lp.man:16 lpmove.man:16 lpoptions.man.in:16 +#: lppasswd.man:16 lpq.man:16 lpr.man:16 lprm.man:16 lpstat.man:16 +#: mailto.conf.man:16 mime.convs.man:16 mime.types.man:16 printers.conf.man:16 +#: subscriptions.conf.man:16 +#, no-wrap +msgid "NAME" +msgstr "NOM" + +# type: Plain text +#: cupsaccept.man:18 +msgid "accept/reject - accept/reject jobs sent to a destination" +msgstr "" +"accept/reject - Accepter/refuser les travaux d'impression envoyés à une " +"destination." + +# type: SH +#: cupsaccept.man:18 backend.man:20 cancel.man:18 cupsaddsmb.man.in:19 +#: cups-config.man:18 cupsctl.man:18 cups-deviced.man.in:18 cupsd.man.in:18 +#: cups-driverd.man.in:18 cupsenable.man:19 cupsfilter.man:17 +#: cups-lpd.man.in:18 cups-polld.man:18 cupstestdsc.man:18 cupstestppd.man:18 +#: filter.man:18 lpadmin.man:18 lpc.man:18 lpinfo.man:18 lp.man:18 +#: lpmove.man:18 lpoptions.man.in:18 lppasswd.man:18 lpq.man:18 lpr.man:18 +#: lprm.man:18 lpstat.man:18 +#, no-wrap +msgid "SYNOPSIS" +msgstr "SYNOPSIS" + +# type: Plain text +#: cupsaccept.man:25 +msgid "" +"B<accept> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] destination(s)" +msgstr "" +"B<accept> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] destination" +"(s)" + +# type: Plain text +#: cupsaccept.man:34 +msgid "" +"B<reject> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -r " +"I<reason> ] destination(s)" +msgstr "" +"B<reject> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -r " +"I<raison> ] destination(s)" + +# type: SH +#: cupsaccept.man:34 backend.man:28 cancel.man:33 classes.conf.man:18 +#: client.conf.man.in:18 cupsaddsmb.man.in:38 cups-config.man:50 +#: cupsctl.man:29 cupsd.conf.man.in:18 cups-deviced.man.in:21 cupsd.man.in:23 +#: cups-driverd.man.in:26 cupsenable.man:35 cupsfilter.man:33 +#: cups-lpd.man.in:23 cups-polld.man:21 cups-snmp.conf.man:18 +#: cupstestdsc.man:26 cupstestppd.man:32 filter.man:23 lpadmin.man:42 +#: lpc.man:25 lpinfo.man:32 lp.man:62 lpmove.man:34 lpoptions.man.in:62 +#: lppasswd.man:33 lpq.man:29 lpr.man:35 lprm.man:29 lpstat.man:39 +#: mailto.conf.man:18 mime.convs.man:18 mime.types.man:18 printers.conf.man:18 +#: subscriptions.conf.man:18 +#, no-wrap +msgid "DESCRIPTION" +msgstr "DESCRIPTION" + +# type: Plain text +#: cupsaccept.man:37 +msgid "" +"I<accept> instructs the printing system to accept print jobs to the " +"specified destinations." +msgstr "" +"B<accept> envoie l'ordre au système d'impression d'accepter les travaux " +"d'impression vers les destinations spécifiées." + +# type: Plain text +#: cupsaccept.man:41 +msgid "" +"I<reject> instructs the printing system to reject print jobs to the " +"specified destinations. The I<-r> option sets the reason for rejecting print " +"jobs. If not specified the reason defaults to \"Reason Unknown\"." +msgstr "" +"B<reject> envoie l'ordre au système d'impression de refuser les travaux " +"d'impression vers les destinations spécifiées. L'option B<-r> permet de " +"spécifier la raison du rejet des travaux d'impression. Si cette raison n'est " +"pas fournie, la raison par défaut est « Reason Unknown » (« Raison inconnue »)." + +# type: SH +#: cupsaccept.man:41 cancel.man:36 cupsaddsmb.man.in:45 cups-config.man:55 +#: cupsctl.man:33 cupsd.man.in:29 cupsfilter.man:37 cups-lpd.man.in:60 +#: cupstestppd.man:42 lpinfo.man:37 lp.man:65 lpmove.man:44 lppasswd.man:41 +#: lpq.man:37 lpr.man:41 lprm.man:35 lpstat.man:43 +#, no-wrap +msgid "OPTIONS" +msgstr "OPTIONS" + +# type: Plain text +#: cupsaccept.man:44 +msgid "The following options are supported by both I<accept> and I<reject>:" +msgstr "Les options suivantes sont reconnues par B<accept> et B<reject> :" + +# type: TP +#: cupsaccept.man:44 cancel.man:38 cupsctl.man:35 cupsenable.man:40 +#: lpadmin.man:172 lpinfo.man:39 lp.man:72 lpmove.man:46 lpoptions.man.in:66 +#: lpq.man:39 lpr.man:43 lprm.man:37 lpstat.man:45 +#, no-wrap +msgid "-E" +msgstr "B<-E>" + +# type: Plain text +#: cupsaccept.man:48 cancel.man:42 lpinfo.man:43 lp.man:76 lpmove.man:50 +#: lpq.man:43 lpr.man:47 lprm.man:41 lpstat.man:49 +msgid "Forces encryption when connecting to the server." +msgstr "Forcer le chiffrement lors de la connexion au serveur." + +# type: TP +#: cupsaccept.man:48 cancel.man:42 cupsenable.man:44 lpinfo.man:43 lp.man:76 +#: lpmove.man:50 lpoptions.man.in:70 lpq.man:47 lpr.man:63 lprm.man:45 +#: lpstat.man:53 +#, no-wrap +msgid "-U username" +msgstr "B<-U> I<utilisateur>" + +# type: Plain text +#: cupsaccept.man:52 +msgid "Sets the username that is sent when connecting to the server." +msgstr "Indiquer l'utilisateur utilisé pour se connecter au serveur." + +# type: TP +#: cupsaccept.man:52 cancel.man:51 lp.man:92 +#, no-wrap +msgid "-h hostname[:port]" +msgstr "B<-h> I<serveur[:port]>" + +# type: Plain text +#: cupsaccept.man:56 cancel.man:55 lp.man:96 +msgid "Chooses an alternate server." +msgstr "Utiliser un autre serveur." + +# type: TP +#: cupsaccept.man:56 cupsenable.man:56 +#, no-wrap +msgid "-r \"reason\"" +msgstr "B<-r> I<raison>" + +# type: Plain text +#: cupsaccept.man:61 +msgid "" +"Sets the reason string that is shown for a printer that is rejecting jobs." +msgstr "" +"Configurer la raison qui est affichée par l'imprimante lorsqu'elle refuse un " +"travail." + +# type: SH +#: cupsaccept.man:61 cancel.man:59 cupsd.man.in:54 cupsenable.man:61 +#: cups-lpd.man.in:98 filter.man:208 lpadmin.man:187 lpc.man:59 lpinfo.man:55 +#: lp.man:226 lpoptions.man.in:119 lpr.man:106 lprm.man:53 lpstat.man:123 +#, no-wrap +msgid "COMPATIBILITY" +msgstr "COMPATIBILITÉ" + +# type: Plain text +#: cupsaccept.man:65 cancel.man:63 cupsenable.man:65 lp.man:230 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " +"and class names are I<not> case-sensitive." +msgstr "" +"Contrairement au système d'impression System V, les imprimantes CUPS peuvent " +"contenir n'importe quel caractère imprimable sauf ESPACE, TABULATION, « / » " +"ou « # ». De même, les noms d'imprimantes et de classes ne sont I<pas> " +"sensibles à la casse." + +# type: Plain text +#: cupsaccept.man:70 +msgid "" +"The CUPS versions of I<accept> and I<reject> may ask the user for an access " +"password depending on the printing system configuration. This differs from " +"the System V versions which require the root user to execute these commands." +msgstr "" +"Les versions CUPS d'B<accept> et B<reject> peuvent demander à l'utilisateur " +"de s'identifier suivant la configuration du système d'impression, à la " +"différence des versions System V, qui demandent le mot de passe root." + +# type: SH +#: cupsaccept.man:70 backend.man:170 cancel.man:67 classes.conf.man:109 +#: client.conf.man.in:43 cupsaddsmb.man.in:204 cups-config.man:104 +#: cupsctl.man:97 cupsd.conf.man.in:608 cups-deviced.man.in:36 cupsd.man.in:58 +#: cups-driverd.man.in:97 cupsenable.man:74 cupsfilter.man:65 +#: cups-lpd.man.in:109 cups-polld.man:30 cups-snmp.conf.man:67 +#: cupstestdsc.man:41 cupstestppd.man:133 filter.man:213 lpadmin.man:198 +#: lpc.man:62 lpinfo.man:57 lp.man:235 lpmove.man:58 lpoptions.man.in:127 +#: lppasswd.man:53 lpq.man:63 lpr.man:109 lprm.man:56 lpstat.man:131 +#: mailto.conf.man:51 mime.convs.man:37 mime.types.man:85 +#: printers.conf.man:113 subscriptions.conf.man:80 +#, no-wrap +msgid "SEE ALSO" +msgstr "VOIR AUSSI" + +# type: Plain text +#: cupsaccept.man:73 +msgid "I<cancel(1)>, I<cupsenable(8)>, I<lp(1)>, I<lpadmin(8)>, I<lpstat(1)>," +msgstr "B<cancel>(1), B<cupsenable>(8), B<lp>(1), B<lpadmin>(8), B<lpstat>(1)," + +# type: Plain text +#: cupsaccept.man:75 backend.man:174 cancel.man:71 classes.conf.man:114 +#: client.conf.man.in:45 cups-config.man:106 cupsctl.man:101 +#: cupsd.conf.man.in:614 cups-deviced.man.in:40 cupsd.man.in:65 +#: cups-driverd.man.in:101 cupsenable.man:79 cupsfilter.man:69 +#: cups-lpd.man.in:114 cups-polld.man:34 cups-snmp.conf.man:69 +#: cupstestdsc.man:43 cupstestppd.man:137 filter.man:217 lpadmin.man:203 +#: lpc.man:67 lpinfo.man:61 lp.man:239 lpmove.man:62 lpoptions.man.in:131 +#: lppasswd.man:57 lpq.man:68 lpr.man:114 lprm.man:61 lpstat.man:135 +#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:90 +#: printers.conf.man:118 subscriptions.conf.man:85 +msgid "http://localhost:631/help" +msgstr "http://localhost:631/help" + +# type: SH +#: cupsaccept.man:75 backend.man:175 cancel.man:71 classes.conf.man:114 +#: client.conf.man.in:45 cupsaddsmb.man.in:210 cups-config.man:106 +#: cupsctl.man:101 cupsd.conf.man.in:614 cups-deviced.man.in:40 +#: cupsd.man.in:65 cups-driverd.man.in:101 cupsenable.man:79 cupsfilter.man:69 +#: cups-lpd.man.in:114 cups-polld.man:34 cups-snmp.conf.man:69 +#: cupstestdsc.man:46 cupstestppd.man:139 filter.man:217 lpadmin.man:203 +#: lpc.man:67 lpinfo.man:61 lp.man:239 lpmove.man:62 lpoptions.man.in:131 +#: lppasswd.man:57 lpq.man:68 lpr.man:114 lprm.man:61 lpstat.man:135 +#: mailto.conf.man:56 mime.convs.man:42 mime.types.man:90 +#: printers.conf.man:118 subscriptions.conf.man:85 +#, no-wrap +msgid "COPYRIGHT" +msgstr "COPYRIGHT" + +# type: Plain text +#: cupsaccept.man:76 backend.man:176 cancel.man:72 classes.conf.man:115 +#: client.conf.man.in:46 cupsaddsmb.man.in:211 cupsctl.man:102 cupsd.man.in:66 +#: cupsenable.man:81 cupsfilter.man:70 cups-lpd.man.in:115 cups-polld.man:35 +#: cups-snmp.conf.man:70 cupstestdsc.man:47 cupstestppd.man:140 filter.man:218 +#: lpc.man:68 lpinfo.man:62 lp.man:240 lpmove.man:63 lpoptions.man.in:132 +#: lppasswd.man:58 lpr.man:115 lprm.man:62 lpstat.man:136 mailto.conf.man:57 +#: mime.convs.man:43 mime.types.man:91 printers.conf.man:119 +#: subscriptions.conf.man:86 +msgid "Copyright 2007 by Apple Inc." +msgstr "Copyright 2007 by Apple Inc." + +# type: TH +#: backend.man:15 +#, no-wrap +msgid "backend" +msgstr "backend" + +# type: TH +#: backend.man:15 cancel.man:15 cupstestdsc.man:15 lpoptions.man.in:15 +#: lppasswd.man:15 mime.convs.man:15 +#, no-wrap +msgid "20 March 2006" +msgstr "20 mars 2006" + +# type: Plain text +#: backend.man:19 +msgid "backend - cups backend transmission interfaces" +msgstr "backend - Programme de transmission de CUPS." + +# type: Plain text +#: backend.man:22 +msgid "B<backend>" +msgstr "B<backend>" + +# type: Plain text +#: backend.man:27 +msgid "B<backend> job user title num-copies options [ I<filename> ]" +msgstr "B<backend> travail utilisateur titre copies options [ I<fichier> ]" + +# type: Plain text +#: backend.man:31 +msgid "" +"Backends are a special type of I<filter(7)> which is used to send print data " +"to and discover different devices on the system." +msgstr "" +"Les programmes de transmission de CUPS sont des filtres particuliers " +"(consultez B<filter>(7) qui sont utilisés pour envoyer les données à " +"imprimer et découvrir les différents périphériques d'impression du système." + +# type: Plain text +#: backend.man:37 +msgid "" +"Like filters, backends must be capable of reading from a filename on the " +"command-line or from the standard input, copying the standard input to a " +"temporary file as required by the physical interface." +msgstr "" +"Comme les filtres, ils doivent être capables de lire depuis un fichier " +"fournit sur la ligne de commande ou depuis l'entrée standard, en copiant " +"l'entrée standard vers un fichier temporaire si nécessaire pour l'interface " +"physique." + +# type: Plain text +#: backend.man:46 +msgid "" +"The command name (argv[0]) is set to the device URI of the destination " +"printer. Starting with CUPS 1.1.22, any authentication information in argv" +"[0] is removed, so backend developers are urged to use the DEVICE_URI " +"environment variable whenever authentication information is required. The " +"CUPS API includes a I<cupsBackendDeviceURI> function for retrieving the " +"correct device URI." +msgstr "" +"Le nom de la commande (argv[0]) est fixé à la valeur de l'URI du " +"périphérique de l'imprimante de destination. À partir de la version 1.1.22 " +"de CUPS, les informations d'identification sont retirées de argv[0]. Il est " +"donc demandé aux développeurs des dorsaux d'utiliser la variable " +"d'environnement DEVICE_URI pour obtenir les informations d'identification " +"quand cela est nécessaire. L'API CUPS propose la fonction " +"B<cupsBackendDeviceURI> pour récupérer la valeur correcte de l'URI du " +"périphérique." + +# type: Plain text +#: backend.man:51 +msgid "" +"Back-channel data from the device should be relayed to the job filters by " +"writing to file descriptor 3. The CUPS API includes the " +"I<cupsBackChannelWrite> function for this purpose." +msgstr "" +"Les données en retour du périphérique doivent être envoyées au filtres des " +"travaux en écrivant sur le descripteur de fichiers 3. L'API CUPS propose la " +"fonction I<cupsBackChannelWrite> pour cela." + +# type: SH +#: backend.man:52 +#, no-wrap +msgid "DEVICE DISCOVERY" +msgstr "DÉCOUVERTE DES PÉRIPHÉRIQUES" + +# type: Plain text +#: backend.man:57 +msgid "" +"When run with no arguments, the backend should list the devices and schemes " +"it supports or is advertising to stdout. The output consists of zero or more " +"lines consisting of any of the following forms:" +msgstr "" +"Quand il est exécuté sans paramètre, le programme dorsal doit lister sur la " +"sortie standard les périphériques et schémas qu'il gère ou qu'il annonce. La " +"sortie consiste en zéro ou plus de lignes de la forme suivante :" + +# type: Plain text +#: backend.man:62 +#, no-wrap +msgid "" +" device-class scheme \"Unknown\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\"\n" +" device-class device-uri \"device-make-and-model\" \"device-info\" \"device-id\"\n" +msgstr "" +" classe_périphérique schéma \"Unknown\" \"info_périphérique\"\n" +" classe_périphérique uri_périphérique \"marque_et_modèle_périphérique\" \"info_périphérique\"\n" +" classe_périphérique uri_périphérique \"marque_et_modèle_périphérique\" \"info_périphérique\" \"id_périphérique\"\n" + +# type: Plain text +#: backend.man:66 +msgid "The I<device-class> field is one of the following values:" +msgstr "Le champ I<classe_périphérique> peut prendre une de ces valeurs :" + +# type: TP +#: backend.man:67 +#, no-wrap +msgid "direct" +msgstr "B<direct>" + +# type: Plain text +#: backend.man:72 +msgid "" +"The device-uri refers to a specific direct-access device with no options, " +"such as a parallel, USB, or SCSI device." +msgstr "" +"L'uri du périphérique se réfère à un accès direct au périphérique, sans " +"option, comme pour un périphérique sur port parallèle, USB ou SCSI." + +# type: TP +#: backend.man:73 +#, no-wrap +msgid "file" +msgstr "B<file>" + +# type: Plain text +#: backend.man:77 +msgid "The device-uri refers to a file on disk." +msgstr "L'uri du périphérique se réfère à un fichier sur le disque." + +# type: TP +#: backend.man:78 +#, no-wrap +msgid "network" +msgstr "B<network>" + +# type: Plain text +#: backend.man:83 +msgid "" +"The device-uri refers to a networked device and conforms to the general form " +"for network URIs." +msgstr "" +"L'uri du périphérique se réfère à un périphérique réseau et respecte les " +"formes générales des URI réseau." + +# type: TP +#: backend.man:84 +#, no-wrap +msgid "serial" +msgstr "B<serial>" + +# type: Plain text +#: backend.man:90 +msgid "" +"The device-uri refers to a serial device with configurable baud rate and " +"other options. If the device-uri contains a baud value, it represents the " +"maximum baud rate supported by the device." +msgstr "" +"L'uri du périphérique se réfère à un périphérique série avec une vitesse " +"configurable et d'autres options. Si l'uri du périphérique contient la " +"vitesse, elle représente la vitesse maximale gérée par le périphérique." + +# type: Plain text +#: backend.man:97 +msgid "" +"The I<scheme> field provides the URI scheme that is supported by the " +"backend. Backends should use this form only when the backend supports any " +"URI using that scheme. The I<device-uri> field specifies the full URI to use " +"when communicating with the device." +msgstr "" +"Le champ I<schéma> fournit le schéma d'URI géré par le dorsal. Les dorsaux " +"ne doivent utiliser cette forme que s'ils supportent toute URI utilisant ce " +"schéma. Le champ I<uri_périphérique> spécifie l'URI complète à utiliser pour " +"la communication avec le périphérique." + +# type: Plain text +#: backend.man:102 +msgid "" +"The I<device-make-and-model> field specifies the make and model of the " +"device, e.g. \"Acme Foojet 2000\". If the make and model is not known, you " +"must report \"Unknown\"." +msgstr "" +"Le champ I<marque_et_modèle_périphérique> précise la marque et le modèle du " +"périphérique, par exemple « Acme Foojet 2000 ». Si la marque et le modèle ne " +"sont pas connus, vous devez indiquer « Unknown »." + +# type: Plain text +#: backend.man:108 +msgid "" +"The I<device-info> field specifies additional information about the device. " +"Typically this includes the make and model along with the port number or " +"network address, e.g. \"Acme Foojet 2000 USB #1\"." +msgstr "" +"Le champ I<info_périphérique> ajoute des informations à propos du " +"périphérique. Typiquement cela comprend la marque et le modèle avec le " +"numéro de port ou l'adresse réseau, par exemple « Acme Foojet 2000 USB #1 »." + +# type: Plain text +#: backend.man:113 +msgid "" +"The optional I<device-id> field specifies the IEEE-1284 device ID string for " +"the device, which is used to select a matching driver." +msgstr "" +"Le champ optionnel I<id_périphérique> indique l'identifiant IEEE-1284 du " +"périphérique, qui est utilisé pour sélectionner le pilote correspondant." + +# type: SH +#: backend.man:114 +#, no-wrap +msgid "PERMISSIONS" +msgstr "PERMISSIONS" + +# type: Plain text +#: backend.man:118 +msgid "" +"Backends without world execute permissions are run as the root user. " +"Otherwise, the backend is run using the unprivileged user account, typically " +"\"lp\"." +msgstr "" +"Les dorsaux sans les droits d'exécution pour tout le monde sont exécuté en " +"tant que root. Sinon, le dorsal est exécuté en utilisant le compte non " +"privilégié, généralement « lp »." + +# type: SH +#: backend.man:119 +#, no-wrap +msgid "EXIT CODES" +msgstr "CODES DE SORTIE" + +# type: Plain text +#: backend.man:123 +msgid "" +"The following exit codes are defined for backends; C API constants defined " +"in the E<lt>cups/backend.hE<gt> header file are defined in parenthesis:" +msgstr "" +"Les dorsaux renvoient les codes de retour suivants ; les constantes définie " +"par l'API C dans E<lt>cups/backend.hE<gt> sont indiquées entre parenthèses :" + +# type: TP +#: backend.man:124 +#, no-wrap +msgid "0 (CUPS_BACKEND_OK)" +msgstr "0 (CUPS_BACKEND_OK)" + +# type: Plain text +#: backend.man:129 +msgid "" +"The print file was successfully transmitted to the device or remote server." +msgstr "" +"Le fichier à imprimer a été transmis avec succès au périphérique ou au " +"serveur distant." + +# type: TP +#: backend.man:130 +#, no-wrap +msgid "1 (CUPS_BACKEND_FAILED)" +msgstr "1 (CUPS_BACKEND_FAILED)" + +# type: Plain text +#: backend.man:137 +msgid "" +"The print file was not successfully transmitted to the device or remote " +"server. The scheduler will respond to this by canceling the job, retrying " +"the job, or stopping the queue depending on the state of the error-policy " +"attribute." +msgstr "" +"Le fichier à imprimer n'a pas été transmis correctement au périphérique ou " +"au serveur distant. L'ordonanceur annulera le travail, réessayera " +"l'impression ou stoppera la queue en fonction de l'état de l'attribut error-" +"policy." + +# type: TP +#: backend.man:138 +#, no-wrap +msgid "2 (CUPS_BACKEND_AUTH_REQUIRED)" +msgstr "2 (CUPS_BACKEND_AUTH_REQUIRED)" + +# type: Plain text +#: backend.man:145 +msgid "" +"The print file was not successfully transmitted because valid authentication " +"information is required. The scheduler will respond to this by holding the " +"job and adding the authentication-required job-reasons keyword." +msgstr "" +"Le fichier à imprimer n'a pas été transmis correctement parce que des donnée " +"d'identifications valables sont nécessaires. L'ordonanceur suspendra le " +"travail et ajoutera le mot clé authentication-required à l'attribut job-" +"reasons." + +# type: TP +#: backend.man:146 +#, no-wrap +msgid "3 (CUPS_BACKEND_HOLD)" +msgstr "3 (CUPS_BACKEND_HOLD)" + +# type: Plain text +#: backend.man:152 +msgid "" +"The print file was not successfully transmitted because it cannot be printed " +"at this time. The scheduler will respond to this by holding the job." +msgstr "" +"Le fichier à imprimer n'a pas pu être transmis parce qu'il ne pouvait pas " +"être imprimé à ce moment. L'ordonnaceur concervera le travail d'impression." + +# type: TP +#: backend.man:153 +#, no-wrap +msgid "4 (CUPS_BACKEND_STOP)" +msgstr "4 (CUPS_BACKEND_STOP)" + +# type: Plain text +#: backend.man:159 +msgid "" +"The print file was not successfully transmitted because it cannot be printed " +"at this time. The scheduler will respond to this by stopping the queue." +msgstr "" +"Le fichier à imprimer n'a pas été transmis car il ne peut pas être imprimer " +"en ce moment. L'ordonnanceur stopera la queue." + +# type: TP +#: backend.man:160 +#, no-wrap +msgid "5 (CUPS_BACKEND_CANCEL)" +msgstr "5 (CUPS_BACKEND_CANCEL)" + +# type: Plain text +#: backend.man:166 +msgid "" +"The print file was not successfully transmitted because one or more " +"attributes are not supported. The scheduler will respond to this by " +"canceling the job." +msgstr "" +"Le fichier à imprimer n'a pas été transmis parce qu'un atribut n'est pas " +"géré. L'ordonanceur répond à cela en annulant le travail d'impression." + +# type: Plain text +#: backend.man:169 +msgid "All other exit code values are reserved." +msgstr "Tous les autres codes de sortie sont réservés." + +# type: Plain text +#: backend.man:172 +msgid "I<cupsd(8)>, I<cupsd.conf(5)>, I<filter(7)>" +msgstr "B<cupsd>(8), B<cupsd.conf>(5), B<filter>(7)" + +# type: TH +#: cancel.man:15 +#, no-wrap +msgid "cancel" +msgstr "cancel" + +# type: Plain text +#: cancel.man:18 +msgid "cancel - cancel jobs" +msgstr "cancel - Annuler des travaux d'impression." + +# type: Plain text +#: cancel.man:33 +msgid "" +"B<cancel> [ -E ] [ -U I<username> ] [ -a ] [ -h I<hostname[:port]> ] [ -u " +"I<username> ] [ I<id> ] [ I<destination> ] [ I<destination-id> ]" +msgstr "" +"B<cancel> [ -E ] [ -U I<utilisateur> ] [ -a ] [ -h I<serveur[:port]> ] [ -u " +"I<utilisateur> ] [ I<id> ] [ I<destination> ] [ I<id_destination> ]" + +# type: Plain text +#: cancel.man:36 +msgid "" +"I<cancel> cancels existing print jobs. The I<-a> option will remove all jobs " +"from the specified destination." +msgstr "" +"B<cancel> annule un travail d'impression. L'option B<-a> supprime tous les " +"travaux d'impression d'une destination." + +# type: Plain text +#: cancel.man:38 +msgid "The following options are recognized by I<cancel>:" +msgstr "Les options suivantes sont reconnues par B<cancel> :" + +# type: Plain text +#: cancel.man:46 lp.man:80 +msgid "Specifies the username to use when connecting to the server." +msgstr "Spécifier l'utilisateur à utiliser pour les connexions au serveur." + +# type: TP +#: cancel.man:46 cupsaddsmb.man.in:58 lpq.man:51 +#, no-wrap +msgid "-a" +msgstr "B<-a>" + +# type: Plain text +#: cancel.man:51 +msgid "" +"Cancel all jobs on the named destination, or all jobs on all destinations if " +"none is provided." +msgstr "" +"Annuler tous les travaux sur la destination donnée, ou tous les travaux sur " +"toutes les destinations si aucune destination n'est fournie." + +# type: TP +#: cancel.man:55 lp.man:125 +#, no-wrap +msgid "-u username" +msgstr "B<-u> I<utilisateur>" + +# type: Plain text +#: cancel.man:59 +msgid "Cancels jobs owned by I<username>." +msgstr "Annuler les travaux d'impression de l'I<utilisateur>." + +# type: SH +#: cancel.man:63 +#, no-wrap +msgid "NOTES" +msgstr "NOTES" + +# type: Plain text +#: cancel.man:67 +msgid "" +"Administrators wishing to prevent unauthorized cancellation of jobs via the " +"I<-u> option should require authentication for Cancel-Jobs operations in " +"I<cupsd.conf(5)>." +msgstr "" +"Les administrateurs qui souhaitent empêcher des annulation non autorisée de " +"travaux à l'aide de l'option B<-u> devraient forcer l'identification pour " +"les opérations dans le fichier B<cupsd.conf>(5)." + +# type: Plain text +#: cancel.man:69 +msgid "I<lp(1)>, I<lpmove(8)>, I<lpstat(1)>," +msgstr "B<lp>(1), B<lpmove>(8), B<lpstat>(1)," + +# type: TH +#: classes.conf.man:15 +#, no-wrap +msgid "classes.conf" +msgstr "classes.conf" + +# type: Plain text +#: classes.conf.man:18 +msgid "classes.conf - class configuration file for cups" +msgstr "classes.conf - Fichier de configuration des classes de CUPS." + +# type: Plain text +#: classes.conf.man:23 +msgid "" +"The I<classes.conf> file defines the local printer classes that are " +"available. It is normally located in the I</etc/cups> directory and is " +"generated automatically by the I<cupsd(8)> program when printer classes are " +"added or deleted." +msgstr "" +"Le fichier I<classes.conf> définit les classes d'imprimantes disponibles. Il " +"est habituellement situé dans le répertoire I</etc/cups> et est généré " +"automatiquement par le programme B<cupsd>(8) lorsque des classes " +"d'imprimantes sont créées ou supprimées." + +# type: Plain text +#: classes.conf.man:26 mailto.conf.man:24 printers.conf.man:26 +#: subscriptions.conf.man:26 +msgid "" +"Each line in the file can be a configuration directive, a blank line, or a " +"comment. Comment lines start with the # character." +msgstr "" +"Chaque ligne du fichier est une directive de configuration, une ligne vide " +"ou un commentaire. Les commentaires commencent par le symbole #." + +# type: SH +#: classes.conf.man:26 client.conf.man.in:24 cupsd.conf.man.in:26 +#: cups-snmp.conf.man:30 mailto.conf.man:24 printers.conf.man:26 +#: subscriptions.conf.man:26 +#, no-wrap +msgid "DIRECTIVES" +msgstr "DIRECTIVES" + +# type: TP +#: classes.conf.man:27 +#, no-wrap +msgid "E<lt>Class nameE<gt> ... E<lt>/ClassE<gt>" +msgstr "E<lt>Class nomE<gt> ... E<lt>/ClassE<gt>" + +# type: Plain text +#: classes.conf.man:31 +msgid "Defines a specific printer class." +msgstr "Définir une classe d'imprimantes." + +# type: TP +#: classes.conf.man:31 +#, no-wrap +msgid "E<lt>DefaultClass nameE<gt> ... E<lt>/ClassE<gt>" +msgstr "E<lt>DefaultClass nomE<gt> ... E<lt>/ClassE<gt>" + +# type: Plain text +#: classes.conf.man:35 +msgid "Defines a default printer class." +msgstr "Définir une classe d'imprimantes par défaut." + +# type: TP +#: classes.conf.man:35 printers.conf.man:35 +#, no-wrap +msgid "Accepting Yes" +msgstr "Accepting Yes" + +# type: TP +#: classes.conf.man:37 printers.conf.man:37 +#, no-wrap +msgid "Accepting No" +msgstr "Accepting No" + +# type: Plain text +#: classes.conf.man:41 printers.conf.man:41 +msgid "Specifies whether the printer is accepting new jobs." +msgstr "Définir si l'imprimante accepte de nouveaux travaux d'impression." + +# type: TP +#: classes.conf.man:41 printers.conf.man:41 +#, no-wrap +msgid "AllowUser [ user @group ... ]" +msgstr "AllowUser [ utilisateur @groupe ... ]" + +# type: Plain text +#: classes.conf.man:45 printers.conf.man:45 +msgid "Allows specific users and groups to print to the printer." +msgstr "" +"Permettre à certains utilisateurs ou groupes d'imprimer sur l'imprimante." + +# type: TP +#: classes.conf.man:45 printers.conf.man:45 +#, no-wrap +msgid "DenyUser [ user @group ... ]" +msgstr "DenyUser [ utilisateur @groupe ... ]" + +# type: Plain text +#: classes.conf.man:49 printers.conf.man:49 +msgid "Prevents specific users and groups from printing to the printer." +msgstr "Empêcher certains utilisateurs ou groupes d'imprimer sur l'imprimante." + +# type: TP +#: classes.conf.man:49 printers.conf.man:53 +#, no-wrap +msgid "ErrorPolicy abort-job" +msgstr "ErrorPolicy abort-job" + +# type: TP +#: classes.conf.man:51 printers.conf.man:55 +#, no-wrap +msgid "ErrorPolicy retry-job" +msgstr "ErrorPolicy retry-job" + +# type: TP +#: classes.conf.man:53 printers.conf.man:57 +#, no-wrap +msgid "ErrorPolicy stop-printer" +msgstr "ErrorPolicy stop-printer" + +# type: Plain text +#: classes.conf.man:57 printers.conf.man:61 +msgid "Specifies the error policy for the printer." +msgstr "Définir la politique à appliquer en cas d'erreur pour l'imprimante." + +# type: TP +#: classes.conf.man:57 printers.conf.man:61 +#, no-wrap +msgid "Info text" +msgstr "Info texte" + +# type: Plain text +#: classes.conf.man:61 printers.conf.man:65 +msgid "Specifies human-readable text describing the printer." +msgstr "" +"Définir des informations à destination des utilisateurs pour décrir " +"l'imprimante." + +# type: TP +#: classes.conf.man:61 printers.conf.man:65 +#, no-wrap +msgid "JobSheets banner banner" +msgstr "JobSheets banner banner" + +# type: Plain text +#: classes.conf.man:65 printers.conf.man:69 +msgid "Specifies the banner pages to use for the printer." +msgstr "Définir les pages de banière à utiliser pour l'imprimante." + +# type: TP +#: classes.conf.man:65 printers.conf.man:69 +#, no-wrap +msgid "KLimit number" +msgstr "KLimit nombre" + +# type: Plain text +#: classes.conf.man:69 printers.conf.man:73 +msgid "Specifies the job-k-limit value for the printer." +msgstr "Définir la valeur job-k-limit pour l'imprimante." + +# type: TP +#: classes.conf.man:69 printers.conf.man:73 +#, no-wrap +msgid "Location text" +msgstr "Location texte" + +# type: Plain text +#: classes.conf.man:73 printers.conf.man:77 +msgid "Specifies human-readable text describing the location of the printer." +msgstr "" +"Définir des informations à destination des utilisateurs concernant la " +"localisation physique de l'imprimante." + +# type: TP +#: classes.conf.man:73 printers.conf.man:77 +#, no-wrap +msgid "OpPolicy name" +msgstr "OpPolicy nom" + +# type: Plain text +#: classes.conf.man:77 printers.conf.man:81 +msgid "Specifies the operation policy for the printer." +msgstr "Indiquer la politiques des opérations pour l'imprimante." + +# type: TP +#: classes.conf.man:77 printers.conf.man:81 +#, no-wrap +msgid "PageLimit number" +msgstr "PageLimit nombre" + +# type: Plain text +#: classes.conf.man:81 printers.conf.man:85 +msgid "Specifies the job-page-limit value for the printer." +msgstr "Définir la valeur job-page-limit pour l'imprimante." + +# type: TP +#: classes.conf.man:81 +#, no-wrap +msgid "Printer" +msgstr "Printer" + +# type: Plain text +#: classes.conf.man:85 +msgid "Specifies a printer that is a member of the printer class." +msgstr "Indiquer une imprimante qui est membre de la classe d'imprimantes." + +# type: TP +#: classes.conf.man:85 printers.conf.man:89 +#, no-wrap +msgid "QuotaPeriod seconds" +msgstr "QuotaPeriod secondes" + +# type: Plain text +#: classes.conf.man:89 printers.conf.man:93 +msgid "Specifies the job-quota-period value for the printer." +msgstr "Définir la valeur job-quota-period pour l'imprimante." + +# type: TP +#: classes.conf.man:89 printers.conf.man:93 +#, no-wrap +msgid "Shared Yes" +msgstr "Shared Yes" + +# type: TP +#: classes.conf.man:91 printers.conf.man:95 +#, no-wrap +msgid "Shared No" +msgstr "Shared No" + +# type: Plain text +#: classes.conf.man:95 printers.conf.man:99 +msgid "Specifies whether the printer is shared." +msgstr "Définir si l'imprimante est partagée." + +# type: TP +#: classes.conf.man:95 printers.conf.man:99 +#, no-wrap +msgid "State idle" +msgstr "State idle" + +# type: TP +#: classes.conf.man:97 printers.conf.man:101 +#, no-wrap +msgid "State stopped" +msgstr "State stopped" + +# type: Plain text +#: classes.conf.man:101 printers.conf.man:105 +msgid "Specifies the initial state of the printer (Idle or Stopped)" +msgstr "Définir l'état initial de l'imprimante (Idle ou Stopped)." + +# type: TP +#: classes.conf.man:101 printers.conf.man:105 +#, no-wrap +msgid "StateMessage text" +msgstr "StateMessage texte" + +# type: Plain text +#: classes.conf.man:105 printers.conf.man:109 +msgid "Specifies the message associated with the state." +msgstr "Définir le message associé à l'état." + +# type: TP +#: classes.conf.man:105 printers.conf.man:109 +#, no-wrap +msgid "StateTime seconds" +msgstr "StateTime secondes" + +# type: Plain text +#: classes.conf.man:109 printers.conf.man:113 +msgid "Specifies the date/time associated with the state." +msgstr "Indiquer la date/l'heure associée à l'état." + +# type: Plain text +#: classes.conf.man:112 +msgid "" +"I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime.types(5)>, " +"I<printers.conf(5)>," +msgstr "" +"B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime.types>(5), " +"B<printers.conf>(5)," + +# type: TH +#: client.conf.man.in:15 +#, no-wrap +msgid "client.conf" +msgstr "client.conf" + +# type: TH +#: client.conf.man.in:15 +#, no-wrap +msgid "25 February 2006" +msgstr "25 février 2006" + +# type: Plain text +#: client.conf.man.in:18 +msgid "client.conf - client configuration file for cups" +msgstr "client.conf - Fichier de configuration de CUPS." + +# type: Plain text +#: client.conf.man.in:24 +msgid "" +"The I<client.conf> file configures the CUPS client and is normally located " +"in the I<@CUPS_SERVERROOT@> or I<~/.cups> directory. Each line in the file " +"can be a configuration directive, a blank line, or a comment. Comment lines " +"start with the # character." +msgstr "" +"Le fichier I<client.conf> configure le client CUPS et est normalement situé " +"dans le répertoire I<@CUPS_SERVERROOT@> ou I<~/.cups>. Chaque ligne du " +"fichier est une directive de configuration, une ligne vide ou un " +"commentaire. Les commentaires commencent par le symbole #." + +# type: Plain text +#: client.conf.man.in:27 +msgid "" +"The following directives are understood by the client. Consult the on-line " +"help for detailed descriptions:" +msgstr "" +"Les directives suivantes sont comprises par le client. Veuillez vous " +"reporter à l'aide en ligne pour une description plus détaillée." + +# type: TP +#: client.conf.man.in:27 cupsd.conf.man.in:262 +#, no-wrap +msgid "Encryption IfRequested" +msgstr "Encryption IfRequested" + +# type: TP +#: client.conf.man.in:29 cupsd.conf.man.in:264 +#, no-wrap +msgid "Encryption Never" +msgstr "Encryption Never" + +# type: TP +#: client.conf.man.in:31 cupsd.conf.man.in:266 +#, no-wrap +msgid "Encryption Required" +msgstr "Encryption Required" + +# type: Plain text +#: client.conf.man.in:36 cupsd.conf.man.in:271 +msgid "" +"Specifies the level of encryption that is required for a particular location." +msgstr "Définir le niveau de chiffrement nécessaire pour un emplacement donné." + +# type: TP +#: client.conf.man.in:36 +#, no-wrap +msgid "ServerName hostname-or-ip-address[:port]" +msgstr "ServerName serveur-ou-adresse_ip[:port]" + +# type: TP +#: client.conf.man.in:38 +#, no-wrap +msgid "ServerName /domain/socket" +msgstr "ServerName /domaine/socket" + +# type: Plain text +#: client.conf.man.in:43 +msgid "" +"Specifies the address and optionally the port to use when connecting to the " +"server" +msgstr "" +"Définir l'adresse et éventuellement le port à utiliser pour se connecter au " +"serveur." + +# type: TH +#: cupsaddsmb.man.in:15 +#, no-wrap +msgid "cupsaddsmb" +msgstr "cupsaddsmb" + +# type: TH +#: cupsaddsmb.man.in:15 +#, no-wrap +msgid "25 July 2007" +msgstr "25 juillet 2007" + +# type: Plain text +#: cupsaddsmb.man.in:18 +msgid "cupsaddsmb - export printers to samba for windows clients" +msgstr "" +"cupsaddsmb - Exporter des imprimantes vers Samba pour les clients Windows." + +# type: Plain text +#: cupsaddsmb.man.in:28 +msgid "" +"B<cupsaddsmb> [ -H I<samba-server> ] [ -U I<samba-user[%samba-password]> ] " +"[ -h I<cups-server[:port]> ] [ -v ] -a" +msgstr "" +"B<cupsaddsmb> [ -H I<serveur_samba> ] [ -U I<utilisateur_samba[%mot-de-" +"passe_samba]> ] [ -h I<serveur_cups[:port]> ] [ -v ] -a" + +# type: Plain text +#: cupsaddsmb.man.in:37 +msgid "" +"B<cupsaddsmb> [ -H I<samba-server> ] [ -U I<samba-user[%samba-password]> ] " +"[ -h I<cups-server[:port]> ] [ -v ] printer [ ... printer ]" +msgstr "" +"B<cupsaddsmb> [ -H I<serveur_samba> ] [ -U I<utilisateur_samba[%mot-de-" +"passe_samba]> ] [ -h I<serveur_cups[:port]> ] [ -v ] imprimante [ ... " +"imprimante ]" + +# type: Plain text +#: cupsaddsmb.man.in:44 +msgid "" +"I<cupsaddsmb> exports printers to the SAMBA software (version 2.2.0 or " +"higher) for use with Windows clients. Depending on the SAMBA configuration, " +"you may need to provide a password to export the printers. This program " +"requires the Windows printer driver files described below." +msgstr "" +"B<cupsaddsmb> permet l'export d'imprimantes vers SAMBA (version 2.2.0 ou " +"supérieure) pour l'utilisation par des clients Windows. Suivant la " +"configuration de SAMBA, il est possible qu'un mot de passe soit demandé pour " +"l'export. Ce programme requiert les fichiers du driver Windows, comme " +"indiqué plus bas." + +# type: Plain text +#: cupsaddsmb.man.in:47 +msgid "I<cupsaddsmb> supports the following options:" +msgstr "B<cupsaddsmb> gère les options suivantes :" + +# type: TP +#: cupsaddsmb.man.in:47 +#, no-wrap +msgid "-H samba-server" +msgstr "B<-H> I<serveur_samba>" + +# type: Plain text +#: cupsaddsmb.man.in:51 +msgid "Specifies the SAMBA server which defaults to the CUPS server." +msgstr "Préciser le serveur SAMBA par défaut pour le serveur CUPS." + +# type: TP +#: cupsaddsmb.man.in:51 +#, no-wrap +msgid "-U samba-user[%samba-password]" +msgstr "B<-U> I<utilisateur_samba[%mot-de-passe_samba]>" + +# type: Plain text +#: cupsaddsmb.man.in:58 +msgid "" +"Specifies the SAMBA print admin username which defaults to your current " +"username. If the username contains a percent (%) character, then the text " +"following the percent is treated as the SAMBA password to use." +msgstr "" +"Spécifier le nom d'utilisateur de l'administrateur d'impression SAMBA, qui " +"est par défaut l'utilisateur courant. Si l'utilisateur contient un caractère " +"« % », ce qui suite le pourcent est considéré comme le mot de passe SAMBA à " +"utiliser." + +# type: Plain text +#: cupsaddsmb.man.in:63 +msgid "" +"Exports all known printers. Otherwise only the named printers are exported." +msgstr "" +"Exporter toutes les imprimantes connues. Sinon, seules les imprimantes " +"fournies sur la ligne de commande sont exportées." + +# type: TP +#: cupsaddsmb.man.in:63 +#, no-wrap +msgid "-h cups-server[:port]" +msgstr "B<-h> I<serveur_cups[:port]>" + +# type: Plain text +#: cupsaddsmb.man.in:67 +msgid "Specifies a different CUPS server to use." +msgstr "Définir un autre serveur CUPS à utiliser." + +# type: TP +#: cupsaddsmb.man.in:67 cupstestppd.man:83 +#, no-wrap +msgid "-v" +msgstr "B<-v>" + +# type: Plain text +#: cupsaddsmb.man.in:72 +msgid "" +"Specifies that verbose information should be shown. This is useful for " +"debugging SAMBA configuration problems." +msgstr "" +"Spécifier que des informations détaillées doivent être affichées. Ceci peut " +"être utile pour le débogage des configurations de SAMBA." + +# type: SH +#: cupsaddsmb.man.in:73 +#, no-wrap +msgid "SAMBA CONFIGURATION" +msgstr "CONFIGURATION DE SAMBA" + +# type: Plain text +#: cupsaddsmb.man.in:80 +msgid "" +"I<cupsaddsmb> uses the new RPC-based printing support in SAMBA 2.2.x to " +"provide printer drivers and PPD files to Windows client machines. In order " +"to use this functionality, you must first configure the SAMBA I<smb.conf(5)> " +"file to support printing through CUPS and provide a printer driver download " +"share, as follows:" +msgstr "" +"B<cupsaddsmb> utilise le nouveau mode d'impression RPC de SAMBA 2.2.x pour " +"fournir aux clients Windows les drivers d'impression et les fichiers PPD. " +"Pour utiliser cette fonctionnalité, vous devez configurer SAMBA (via le " +"fichier I<smb.conf>(5)) pour qu'il utilise l'impression via CUPS, et fournir " +"un driver à télécharger. Ceci est fait de la manière suivante :" + +# type: Plain text +#: cupsaddsmb.man.in:86 +#, no-wrap +msgid "" +" [global]\n" +"\tload printers = yes\n" +"\tprinting = cups\n" +"\tprintcap name = cups\n" +msgstr "" +" [global]\n" +"\tload printers = yes\n" +"\tprinting = cups\n" +"\tprintcap name = cups\n" + +# type: Plain text +#: cupsaddsmb.man.in:95 +#, no-wrap +msgid "" +" [printers]\n" +"\tcomment = All Printers\n" +"\tpath = /var/spool/samba\n" +"\tbrowseable = no\n" +"\tpublic = yes\n" +"\tguest ok = yes\n" +"\twritable = no\n" +"\tprintable = yes\n" +msgstr "" +" [printers]\n" +"\tcomment = All Printers\n" +"\tpath = /var/spool/samba\n" +"\tbrowseable = no\n" +"\tpublic = yes\n" +"\tguest ok = yes\n" +"\twritable = no\n" +"\tprintable = yes\n" + +# type: Plain text +#: cupsaddsmb.man.in:103 +#, no-wrap +msgid "" +" [print$]\n" +"\tcomment = Printer Drivers\n" +"\tpath = /etc/samba/drivers\n" +"\tbrowseable = yes\n" +"\tguest ok = no\n" +"\tread only = yes\n" +"\twrite list = root\n" +msgstr "" +" [print$]\n" +"\tcomment = Printer Drivers\n" +"\tpath = /etc/samba/drivers\n" +"\tbrowseable = yes\n" +"\tguest ok = no\n" +"\tread only = yes\n" +"\twrite list = root\n" + +# type: Plain text +#: cupsaddsmb.man.in:108 +msgid "" +"This configuration assumes a FHS-compliant installation of SAMBA; adjust the " +"[printers] and [print$] share paths accordingly on your system as needed." +msgstr "" +"Cette configuration suppose une installation de SAMBA conforme au standard " +"FHS. Modifiez les chemins des partages [printers] et [print$] suivant votre " +"installation." + +# type: SH +#: cupsaddsmb.man.in:109 +#, no-wrap +msgid "MICROSOFT POSTSCRIPT DRIVERS FOR WINDOWS" +msgstr "PILOTES POSTSCRIPT MICROSOFT POUR WINDOWS" + +# type: Plain text +#: cupsaddsmb.man.in:117 +msgid "" +"The base driver for Windows 2000 and higher is the Microsoft PostScript " +"driver, which is available on any system running Windows 2000 or higher in " +"the %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eW32X86\\e3 folder for 32-bit " +"drivers and %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 folder for 64-" +"bit drivers." +msgstr "" +"Le pilote de base de Windows 2000 et des versions ultérieures est le pilote " +"PostScript Microsoft, qui est disponible sur tous les systèmes avec " +"Windows 2000 ou une version ultérieure dans le répertoire %WINDIR%\\eSYSTEM32" +"\\eSPOOL\\eDRIVERS\\eW32X86\\e3 pour les pilotes 32 bits et dans le " +"répertoire %WINDIR%\\eSYSTEM32\\eSPOOL\\eDRIVERS\\eX64\\e3 pour les pilotes " +"64 bits." + +# type: Plain text +#: cupsaddsmb.man.in:125 +msgid "" +"The CUPS printer driver is preferred over the Microsoft driver since it " +"supports the page-label, job-billing, and job-hold-until options fully on " +"all printers. However, currently only Windows 2000 and higher is supported " +"by the Microsoft driver, so you will also need to get the Adobe driver to " +"support Windows 95, 98, and Me clients. The Adobe and Microsoft drivers for " +"Windows 2000 are identical." +msgstr "" +"Il est recommandé d'utiliser le pilote CUPS plutôt que celui de Microsoft " +"puisqu'il permet, pour toutes les imprimantes, l'étiquetage des pages, la " +"facturation des travaux et l'interruption. Cependant, seuls Windows 2000 et " +"les versions ultérieures sont supportés par le pilote Microsoft, donc vous " +"devrez utiliser le pilote Adobe pour les clients Windows 95, 98 et Me. Les " +"pilotes Adobe et Microsoft pour Windows 2000 sont identiques." + +# type: Plain text +#: cupsaddsmb.man.in:130 cupsaddsmb.man.in:159 +msgid "" +"Once you have extracted the driver files, copy the 32-bit drivers to the " +"I<@CUPS_DATADIR@/drivers> directory and the 64-bit drivers to the " +"I<@CUPS_DATADIR@/drivers/x64> directory exactly as named below:" +msgstr "" +"Après avoir extrait les fichiers du pilote, copier les pilotes 32 bits dans " +"le répertoire I<@CUPS_DATADIR@/drivers> et les pilotes 64 bits dans le " +"répertoire I<@CUPS_DATADIR@/drivers/x64>, en les nommant exactement comme " +"ceci :" + +# type: Plain text +#: cupsaddsmb.man.in:137 +#, no-wrap +msgid "" +" [Windows 2000 and higher]\n" +" ps5ui.dll\n" +" pscript.hlp\n" +" pscript.ntf\n" +" pscript5.dll\n" +msgstr "" +" [Windows 2000 et supérieurs]\n" +" ps5ui.dll\n" +" pscript.hlp\n" +" pscript.ntf\n" +" pscript5.dll\n" + +# type: Plain text +#: cupsaddsmb.man.in:142 cupsaddsmb.man.in:175 +msgid "" +"B<Note:> Unlike Windows, case is significant - make sure that you use the " +"lowercase filenames shown above, otherwise I<cupsaddsmb> will fail to export " +"the drivers." +msgstr "" +"B<Remarque :> Contrairement à Windows, la casse est importante. Assurez vous " +"d'utiliser des noms de fichiers en minuscule, comme ci-dessus. Sinon, " +"B<cupsaddsmb> échouera lors de l'export des pilotes." + +# type: SH +#: cupsaddsmb.man.in:143 +#, no-wrap +msgid "CUPS POSTSCRIPT DRIVERS FOR WINDOWS" +msgstr "PILOTES POSTSCRIPT CUPS POUR WINDOWS" + +# type: Plain text +#: cupsaddsmb.man.in:147 +msgid "" +"I<cupsaddsmb> can use the CUPS v6 PostScript printer driver for Windows, " +"which is available for download from the CUPS web site." +msgstr "" +"B<cupsaddsmb> peut utiliser les pilotes PostScript CUPS V6 pour Windows, " +"disponibles en téléchargement sur le site web de CUPS." + +# type: Plain text +#: cupsaddsmb.man.in:154 +msgid "" +"The CUPS printer driver is preferred over the Adobe and Microsoft drivers " +"since it supports the page-label, job-billing, and job-hold-until options " +"fully on all printers. However, currently only Windows 2000 and higher is " +"supported by the CUPS driver, so you will also need to get the Adobe driver " +"to support Windows 95, 98, and Me clients." +msgstr "" +"Il est recommandé d'utiliser le pilote CUPS plutôt que ceux d'Adobe et de " +"Microsoft puisqu'il permet, pour toutes les imprimantes, l'étiquetage des " +"pages, la facturation des travaux et l'interruption des travaux. Cependant, " +"seuls Windows 2000 et les versions ultérieures sont supportés le pilote " +"CUPS, donc vous devrez utiliser le pilote Adobe pour les clients Windows 95, " +"98 et Me." + +# type: Plain text +#: cupsaddsmb.man.in:170 +#, no-wrap +msgid "" +" [Windows 2000 and higher]\n" +" cups6.inf (from www.cups.org)\n" +" cups6.ini (from www.cups.org)\n" +" cupsps6.dll (from www.cups.org)\n" +" cupsui6.dll (from www.cups.org)\n" +" ps5ui.dll (from your Windows system)\n" +" pscript.hlp (from your Windows system)\n" +" pscript.ntf (from your Windows system)\n" +" pscript5.dll (from your Windows system)\n" +msgstr "" +" [Windows 2000 et supérieurs]\n" +" cups6.inf (from www.cups.org)\n" +" cups6.ini (from www.cups.org)\n" +" cupsps6.dll (from www.cups.org)\n" +" cupsui6.dll (from www.cups.org)\n" +" ps5ui.dll (from your Windows system)\n" +" pscript.hlp (from your Windows system)\n" +" pscript.ntf (from your Windows system)\n" +" pscript5.dll (from your Windows system)\n" + +# type: SH +#: cupsaddsmb.man.in:176 +#, no-wrap +msgid "ADOBE POSTSCRIPT DRIVERS FOR WINDOWS 95, 98, AND ME" +msgstr "PILOTES POSTSCRIPT ADOBE POUR WINDOWS 95, 98 et ME" + +# type: Plain text +#: cupsaddsmb.man.in:180 +msgid "" +"I<cupsaddsmb> can use the Adobe PostScript printer driver for Windows 95, " +"98, and ME, which are available for download from the Adobe web site (http://" +"www.adobe.com)." +msgstr "" +"B<cupsaddsmb> peut utiliser le pilote des imprimantes PostScript d'Adobe " +"pour Windows 95, 98 et ME, qui sont disponibles en téléchargement sur le " +"site d'Adobe (http://www.adobe.com)." + +# type: Plain text +#: cupsaddsmb.man.in:183 +msgid "" +"The Adobe driver does not support the page-label, job-billing, or job-hold-" +"until options." +msgstr "" +"Le pilote Adobe ne permet pas l'étiquetage des pages, la facturation des " +"travaux et l'interruption des travaux." + +# type: Plain text +#: cupsaddsmb.man.in:187 +msgid "" +"Once you have installed the driver on a Windows system, copy the following " +"files to the I<@CUPS_DATADIR@/drivers> directory exactly as named below:" +msgstr "" +"Une fois que vous avec les pilotes sur un système Windows, copiez les " +"fichiers suivants dans le répertoire I<@CUPS_DATADIR@/drivers>, en " +"respectant les noms indiqués :" + +# type: Plain text +#: cupsaddsmb.man.in:195 +#, no-wrap +msgid "" +" [Windows 95, 98, and Me]\n" +" ADFONTS.MFM\n" +" ADOBEPS4.DRV\n" +" ADOBEPS4.HLP\n" +" ICONLIB.DLL\n" +" PSMON.DLL\n" +msgstr "" +" [Windows 95, 98 et Me]\n" +" ADFONTS.MFM\n" +" ADOBEPS4.DRV\n" +" ADOBEPS4.HLP\n" +" ICONLIB.DLL\n" +" PSMON.DLL\n" + +# type: Plain text +#: cupsaddsmb.man.in:200 +msgid "" +"B<Note:> Unlike Windows, case is significant - make sure that you use the " +"UPPERCASE filenames shown above, otherwise I<cupsaddsmb> will fail to export " +"the drivers." +msgstr "" +"B<Remarque :> Contrairement à Windows, la casse est importante. Assurez vous " +"d'utiliser des noms de fichiers en MAJUSCULE, comme ci-dessus. Sinon, " +"B<cupsaddsmb> échouera lors de l'export des pilotes." + +# type: SH +#: cupsaddsmb.man.in:201 cupsfilter.man:62 +#, no-wrap +msgid "KNOWN ISSUES" +msgstr "PROBLÈMES CONNUS" + +# type: Plain text +#: cupsaddsmb.man.in:203 +msgid "Getting the full set of Windows driver files should be easier." +msgstr "" +"Récupérer l'ensemble complet des pilotes Windows devrait être plus simple." + +# type: Plain text +#: cupsaddsmb.man.in:207 +msgid "I<smbd(8)>, I<smb.conf(5)>, http://localhost:631/help" +msgstr "B<smbd>(8), B<smb.conf>(5), http://localhost:631/help" + +# type: Plain text +#: cupsaddsmb.man.in:209 +msgid "http://www.cups.org/windows/" +msgstr "http://www.cups.org/windows/" + +# type: TH +#: cups-config.man:15 +#, no-wrap +msgid "cups-config" +msgstr "cups-config" + +# type: TH +#: cups-config.man:15 cupsd.conf.man.in:15 cups-deviced.man.in:15 +#: cups-driverd.man.in:15 lpq.man:15 +#, no-wrap +msgid "16 June 2008" +msgstr "16 juin 2008" + +# type: Plain text +#: cups-config.man:18 +msgid "cups-config - get cups api, compiler, directory, and link information." +msgstr "" +"cups-config - Obtenir les informations sur l'API, les répertoires, la " +"compilation et l'édition des liens pour CUPS." + +# type: Plain text +#: cups-config.man:21 +msgid "B<cups-config> --api-version" +msgstr "B<cups-config> --api-version" + +# type: Plain text +#: cups-config.man:24 +msgid "B<cups-config> --cflags" +msgstr "B<cups-config> --cflags" + +# type: Plain text +#: cups-config.man:27 +msgid "B<cups-config> --datadir" +msgstr "B<cups-config> --datadir" + +# type: Plain text +#: cups-config.man:30 +msgid "B<cups-config> --help" +msgstr "B<cups-config> --help" + +# type: Plain text +#: cups-config.man:33 +msgid "B<cups-config> --ldflags" +msgstr "B<cups-config> --ldflags" + +# type: Plain text +#: cups-config.man:40 +msgid "B<cups-config> [ I<--image> ] [ I<--static> ] --libs" +msgstr "B<cups-config> [ --image ] [ --static ] --libs" + +# type: Plain text +#: cups-config.man:43 +msgid "B<cups-config> --serverbin" +msgstr "B<cups-config> --serverbin" + +# type: Plain text +#: cups-config.man:46 +msgid "B<cups-config> --serverroot" +msgstr "B<cups-config> --serverroot" + +# type: Plain text +#: cups-config.man:49 +msgid "B<cups-config> --version" +msgstr "B<cups-config> --version" + +# type: Plain text +#: cups-config.man:55 +msgid "" +"B<cups-config> is the CUPS program configuration utility. It should be used " +"by application developers to determine the necessary command-line options " +"for the compiler and linker, as well as determining installation directories " +"for filters, configuration files, and drivers." +msgstr "" +"B<cups-config> est l'utilitaire de configuration pour les programmes CUPS. " +"Il devrait être utilisé par les développeurs d'application pour déterminer " +"les options en ligne de commande pour le compilateur ou l'éditeur de liens, " +"comme pour déterminer les répertoires des filtres, fichiers de " +"configurations et pilotes." + +# type: TP +#: cups-config.man:56 +#, no-wrap +msgid "--api-version" +msgstr "B<--api-version>" + +# type: Plain text +#: cups-config.man:60 +msgid "Displays the current API version (major.minor)." +msgstr "Afficher la version d'API actuelle (majeur.mineur)." + +# type: TP +#: cups-config.man:60 +#, no-wrap +msgid "--cflags" +msgstr "B<--cflags>" + +# type: Plain text +#: cups-config.man:64 +msgid "Displays the necessary compiler options." +msgstr "Afficher les options de compilations nécessaires." + +# type: TP +#: cups-config.man:64 +#, no-wrap +msgid "--datadir" +msgstr "B<--datadir>" + +# type: Plain text +#: cups-config.man:68 +msgid "Displays the default CUPS data directory." +msgstr "Afficher le répertoire de données par défaut de CUPS." + +# type: TP +#: cups-config.man:68 +#, no-wrap +msgid "--help" +msgstr "B<--help>" + +# type: Plain text +#: cups-config.man:72 +msgid "Displays the program usage message." +msgstr "Afficher un message d'aide." + +# type: TP +#: cups-config.man:72 +#, no-wrap +msgid "--image" +msgstr "B<--image>" + +# type: Plain text +#: cups-config.man:77 +msgid "" +"When used with I<--libs>, adds the CUPS imaging library to the list of " +"displayed libraries." +msgstr "" +"Lorsqu'elle est utilisée avec B<--libs>, cette option ajoute la bibliothèque " +"de gestion des images CUPS des bibliothèques affichées." + +# type: TP +#: cups-config.man:77 +#, no-wrap +msgid "--ldflags" +msgstr "B<--ldflags>" + +# type: Plain text +#: cups-config.man:81 +msgid "Displays the necessary linker options." +msgstr "Afficher les options nécessaires pour l'édition des liens." + +# type: TP +#: cups-config.man:81 +#, no-wrap +msgid "--libs" +msgstr "B<--libs>" + +# type: Plain text +#: cups-config.man:85 +msgid "Displays the necessary librarys to link to." +msgstr "Afficher les bibliothèques nécessaires pour l'édition des liens." + +# type: TP +#: cups-config.man:85 +#, no-wrap +msgid "--serverbin" +msgstr "B<--serverbin>" + +# type: Plain text +#: cups-config.man:90 +msgid "" +"Displays the default CUPS binary directory, where filters and backends are " +"stored." +msgstr "" +"Afficher le répertoires par défaut des binaires, où se trouvent les filtres " +"et dorsaux." + +# type: TP +#: cups-config.man:90 +#, no-wrap +msgid "--serverroot" +msgstr "B<--serverroot>" + +# type: Plain text +#: cups-config.man:94 +msgid "Displays the default CUPS configuration file directory." +msgstr "Afficher le répertoire de configuration par défaut d eCUPS." + +# type: TP +#: cups-config.man:94 +#, no-wrap +msgid "--static" +msgstr "B<--static>" + +# type: Plain text +#: cups-config.man:99 +msgid "" +"When used with I<--libs>, shows the static libraries instead of the default " +"(shared) libraries." +msgstr "" +"Lorsqu'elle est utilisée avec B<--libs>, les bibliothèques statiques seront " +"affichées au lieu des bibliothèques partagées qui sont affichées par défaut." + +# type: TP +#: cups-config.man:99 +#, no-wrap +msgid "--version" +msgstr "B<--version>" + +# type: Plain text +#: cups-config.man:104 +msgid "" +"Displays the full version number of the CUPS installation (major.minor." +"patch)." +msgstr "" +"Afficher la version complète de l'installation CUPS (majeur.mineur.patch)." + +# type: Plain text +#: cups-config.man:107 cupsd.conf.man.in:615 cups-deviced.man.in:41 +#: cups-driverd.man.in:102 lpadmin.man:204 lpq.man:69 +msgid "Copyright 2007-2008 by Apple Inc." +msgstr "Copyright 2007-2008 par Apple Inc." + +# type: TH +#: cupsctl.man:15 +#, no-wrap +msgid "cupsctl" +msgstr "cupsctl" + +# type: TH +#: cupsctl.man:15 +#, no-wrap +msgid "5 July 2007" +msgstr "5 juillet 2007" + +# type: Plain text +#: cupsctl.man:18 +msgid "cupsctl - configure cupsd.conf options" +msgstr "cupsctl - Configurer les options de cupsd.conf" + +# type: Plain text +#: cupsctl.man:29 +msgid "" +"B<cupsctl> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] [ --[no-]debug-" +"logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]remote-" +"printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " +"[ I<name=value> ]" +msgstr "" +"B<cupsctl> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] [ --[no-]" +"debug-logging ] [ --[no-]remote-admin ] [ --[no-]remote-any ] [ --[no-]" +"remote-printers ] [ --[no-]share-printers ] [ --[no-]user-cancel-any ] " +"[ I<nom=valeur> ]" + +# type: Plain text +#: cupsctl.man:33 +msgid "" +"I<cupsctl> updates or queries the B<cupsd.conf> file for a server. When no " +"changes are requested, the current configuration values are written to the " +"standard output in the format \"name=value\", one per line." +msgstr "" +"I<cupsctl> met à jour ou interroge le fichier B<cupsd.conf> d'un serveur. " +"Quand aucun changement n'est demandé, les valeurs de configuration actuelles " +"sont affichées sur la sortie standard sous la forme « nom=valeur », une par " +"ligne." + +# type: Plain text +#: cupsctl.man:35 +msgid "The following options are recognized:" +msgstr "Les options suivantes sont reconnues :" + +# type: Plain text +#: cupsctl.man:39 +msgid "Enables encryption on the connection to the scheduler." +msgstr "Activer le chiffrement de la connexion à l'ordonnanceur." + +# type: TP +#: cupsctl.man:39 +#, no-wrap +msgid "-U I<username>" +msgstr "B<-U> I<utilisateur>" + +# type: Plain text +#: cupsctl.man:43 +msgid "" +"Specifies an alternate username to use when authenticating with the " +"scheduler." +msgstr "" +"Spécifier un autre utilisateur à utiliser pour l'identification auprès de " +"l'ordonnanceur." + +# type: TP +#: cupsctl.man:43 +#, no-wrap +msgid "-h I<server[:port]>" +msgstr "B<-h> I<serveur[:port]>" + +# type: Plain text +#: cupsctl.man:47 +msgid "Specifies the server address." +msgstr "Définir l'adresse du serveur." + +# type: TP +#: cupsctl.man:47 +#, no-wrap +msgid "--[no-]debug-logging" +msgstr "B<--[no-]debug-logging>" + +# type: Plain text +#: cupsctl.man:51 +msgid "Enables or disables debug logging in the B<error_log> file." +msgstr "" +"Activer ou désactiver la journalisation d'informations de débogage dans le " +"fichier B<error_log>." + +# type: TP +#: cupsctl.man:51 +#, no-wrap +msgid "--[no-]remote-admin" +msgstr "B<--[no-]remote-admin>" + +# type: Plain text +#: cupsctl.man:55 +msgid "Enables or disables remote administration." +msgstr "Activer ou désactiver l'administration à distance." + +# type: TP +#: cupsctl.man:55 +#, no-wrap +msgid "--[no-]remote-any" +msgstr "B<--[no-]remote-any>" + +# type: Plain text +#: cupsctl.man:59 +msgid "Enables or disables printing from any address, e.g. the Internet." +msgstr "" +"Activer ou désactiver l'impression depuis n'importe quelle adresse, comme " +"par exemple depuis Internet." + +# type: TP +#: cupsctl.man:59 +#, no-wrap +msgid "--[no-]remote-printers" +msgstr "B<--[no-]remote-printers>" + +# type: Plain text +#: cupsctl.man:64 +msgid "" +"Enables or disables the display of remote printers shared via the CUPS, " +"LDAP, or SLP protocols." +msgstr "" +"Activer ou désactiver l'affichage d'imprimantes distantes partagées par les " +"protocoles CUPS, LDAP ou SLP." + +# type: TP +#: cupsctl.man:64 +#, no-wrap +msgid "--[no-]share-printers" +msgstr "B<--[no-]share-printers>" + +# type: Plain text +#: cupsctl.man:68 +msgid "Enables or disables sharing of local printers with other computers." +msgstr "" +"Activer ou désactiver le partage d'imprimantes locales avec d'autres " +"ordinateurs." + +# type: TP +#: cupsctl.man:68 +#, no-wrap +msgid "--[no-]user-cancel-any" +msgstr "B<--[no-]user-cancel-any>" + +# type: Plain text +#: cupsctl.man:72 +msgid "Allows or prevents users from canceling jobs owned by others." +msgstr "" +"Permettre ou interdire aux utilisateurs d'annuler les travaux d'autres " +"utilisateurs." + +# type: SH +#: cupsctl.man:72 cupstestppd.man:115 lp.man:210 +#, no-wrap +msgid "EXAMPLES" +msgstr "EXEMPLES" + +# type: Plain text +#: cupsctl.man:74 +msgid "Display the current settings:" +msgstr "Afficher la configuration actuelle :" + +# type: Plain text +#: cupsctl.man:76 +#, no-wrap +msgid " cupsctl\n" +msgstr " cupsctl\n" + +# type: Plain text +#: cupsctl.man:79 +msgid "Enable debug logging:" +msgstr "Activer la journalisation d'informations de débogage." + +# type: Plain text +#: cupsctl.man:81 +#, no-wrap +msgid " cupsctl --debug-logging\n" +msgstr " cupsctl --debug-logging\n" + +# type: Plain text +#: cupsctl.man:84 +msgid "Get the current debug logging state:" +msgstr "Récupérer l'état de la journalisation d'informations de débogage :" + +# type: Plain text +#: cupsctl.man:86 +#, no-wrap +msgid " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" +msgstr " cupsctl | grep '^_debug_logging' | awk -F= '{print $2}'\n" + +# type: Plain text +#: cupsctl.man:89 +msgid "Disable printer sharing:" +msgstr "Désactiver le partage d'imprimantes :" + +# type: Plain text +#: cupsctl.man:91 +#, no-wrap +msgid " cupsctl --no-shared-printers\n" +msgstr " cupsctl --no-shared-printers\n" + +# type: Plain text +#: cupsctl.man:94 +msgid "Enable printing using the file: pseudo-device:" +msgstr "Activer l'impression dans le fichier « pseudo-périphérique » :" + +# type: TP +#: cupsctl.man:96 +#, no-wrap +msgid " cupsctl FileDevice=Yes\n" +msgstr " cupsctl FileDevice=Yes\n" + +# type: Plain text +#: cupsctl.man:99 +msgid "I<cupsd.conf(5)>, I<cupsd(8)>," +msgstr "B<cupsd.conf>(5), B<cupsd>(8)," + +# type: TH +#: cupsd.conf.man.in:15 +#, no-wrap +msgid "cupsd.conf" +msgstr "cupsd.conf" + +# type: Plain text +#: cupsd.conf.man.in:18 +msgid "cupsd.conf - server configuration file for cups" +msgstr "cupsd.conf - Fichier de configuration du serveur CUPS." + +# type: Plain text +#: cupsd.conf.man.in:21 +msgid "" +"The I<cupsd.conf> file configures the CUPS scheduler, I<cupsd(8)>. It is " +"normally located in the I<@CUPS_SERVERROOT@> directory." +msgstr "" +"Le fichier I<cupsd.conf> configure l'ordonnanceur CUPS, B<cupsd>(8). Il est " +"généralement situé dans le répertoire I<@CUPS_SERVERROOT@>." + +# type: Plain text +#: cupsd.conf.man.in:26 +msgid "" +"Each line in the file can be a configuration directive, a blank line, or a " +"comment. Comment lines start with the # character. The configuration " +"directives are intentionally similar to those used by the popular Apache web " +"server software and are described below." +msgstr "" +"Chaque ligne de ce fichier est soit une directive de configuration, une " +"ligne vide, ou un commentaire. Les lignes de commentaire commencent par le " +"caractère #. Les directives de configuration sont volontairement similaires " +"à celles utilisées par le serveur web Apache, et sont décrites ci-dessous." + +# type: Plain text +#: cupsd.conf.man.in:29 +msgid "" +"The following directives are understood by I<cupsd(8)>. Consult the on-line " +"help for detailed descriptions:" +msgstr "" +"Les directives suivantes sont comprises par B<cupsd>(8). Veuillez vous " +"reporter à l'aide en ligne pour une description plus détaillée." + +# type: TP +#: cupsd.conf.man.in:29 +#, no-wrap +msgid "AccessLog filename" +msgstr "AccessLog fichier" + +# type: TP +#: cupsd.conf.man.in:31 +#, no-wrap +msgid "AccessLog syslog" +msgstr "AccessLog syslog" + +# type: Plain text +#: cupsd.conf.man.in:35 +msgid "Defines the access log filename." +msgstr "Définir le fichier traçant les accès." + +# type: TP +#: cupsd.conf.man.in:35 +#, no-wrap +msgid "Allow all" +msgstr "Allow all" + +# type: TP +#: cupsd.conf.man.in:37 +#, no-wrap +msgid "Allow none" +msgstr "Allow none" + +# type: TP +#: cupsd.conf.man.in:39 +#, no-wrap +msgid "Allow host.domain.com" +msgstr "Allow serveur.domaine.com" + +# type: TP +#: cupsd.conf.man.in:41 +#, no-wrap +msgid "Allow *.domain.com" +msgstr "Allow *.domaine.com" + +# type: TP +#: cupsd.conf.man.in:43 +#, no-wrap +msgid "Allow ip-address" +msgstr "Allow adresse_ip" + +# type: TP +#: cupsd.conf.man.in:45 +#, no-wrap +msgid "Allow ip-address/netmask" +msgstr "Allow adresse_ip/masque_sous_réseau" + +# type: TP +#: cupsd.conf.man.in:47 +#, no-wrap +msgid "Allow ip-address/mm" +msgstr "Allow adresse_ip/mm" + +# type: TP +#: cupsd.conf.man.in:49 +#, no-wrap +msgid "Allow @IF(name)" +msgstr "Allow @IF(nom)" + +# type: TP +#: cupsd.conf.man.in:51 +#, no-wrap +msgid "Allow @LOCAL" +msgstr "Allow @LOCAL" + +# type: Plain text +#: cupsd.conf.man.in:55 +msgid "Allows access from the named hosts or addresses." +msgstr "Permettre l'accès depuis des machines nommées ou des adresses IP." + +# type: TP +#: cupsd.conf.man.in:55 +#, no-wrap +msgid "AuthClass User" +msgstr "AuthClass User" + +# type: TP +#: cupsd.conf.man.in:57 +#, no-wrap +msgid "AuthClass Group" +msgstr "AuthClass Group" + +# type: TP +#: cupsd.conf.man.in:59 +#, no-wrap +msgid "AuthClass System" +msgstr "AuthClass System" + +# type: Plain text +#: cupsd.conf.man.in:64 +msgid "" +"Specifies the authentication class (User, Group, System) - B<this directive " +"is deprecated>." +msgstr "" +"Définir la classe d'identification (User, Group, System). B<Cette directive " +"est obsolète.>" + +# type: TP +#: cupsd.conf.man.in:64 +#, no-wrap +msgid "AuthGroupName group-name" +msgstr "AuthGroupName groupe" + +# type: Plain text +#: cupsd.conf.man.in:69 +msgid "Specifies the authentication group - B<this directive is deprecated>." +msgstr "Définir le groupe d'identification. B<Cette directive est obsolète.>" + +# type: TP +#: cupsd.conf.man.in:69 +#, no-wrap +msgid "AuthType None" +msgstr "AuthType None" + +# type: TP +#: cupsd.conf.man.in:71 +#, no-wrap +msgid "AuthType Basic" +msgstr "AuthType Basic" + +# type: TP +#: cupsd.conf.man.in:73 +#, no-wrap +msgid "AuthType BasicDigest" +msgstr "AuthType BasicDigest" + +# type: TP +#: cupsd.conf.man.in:75 +#, no-wrap +msgid "AuthType Digest" +msgstr "AuthType Digest" + +# type: TP +#: cupsd.conf.man.in:77 +#, no-wrap +msgid "AuthType Negotiate" +msgstr "AuthType Negotiate" + +# type: Plain text +#: cupsd.conf.man.in:81 +msgid "" +"Specifies the authentication type (None, Basic, BasicDigest, Digest, " +"Negotiate)" +msgstr "" +"Définir le type d'identification (None, Basic, BasicDigest, Digest, " +"Negotiate)." + +# type: TP +#: cupsd.conf.man.in:81 +#, no-wrap +msgid "AutoPurgeJobs Yes" +msgstr "AutoPurgeJobs Yes" + +# type: TP +#: cupsd.conf.man.in:83 +#, no-wrap +msgid "AutoPurgeJobs No" +msgstr "AutoPurgeJobs No" + +# type: Plain text +#: cupsd.conf.man.in:88 +msgid "" +"Specifies whether to purge job history data automatically when it is no " +"longer required for quotas." +msgstr "" +"Définir s'il faut purger automatiquement l'historique des travaux lorsque " +"les données ne sont plus nécessaires pour l'application des quotas." + +# type: TP +#: cupsd.conf.man.in:88 +#, no-wrap +msgid "BrowseAddress ip-address" +msgstr "BrowseAddress adresse_ip" + +# type: TP +#: cupsd.conf.man.in:90 +#, no-wrap +msgid "BrowseAddress @IF(name)" +msgstr "BrowseAddress @IF(nom)" + +# type: TP +#: cupsd.conf.man.in:92 +#, no-wrap +msgid "BrowseAddress @LOCAL" +msgstr "BrowseAddress @LOCAL" + +# type: Plain text +#: cupsd.conf.man.in:96 +msgid "Specifies a broadcast address for outgoing printer information packets." +msgstr "" +"Définir une adresse où broadcaster les informations sur les imprimantes." + +# type: TP +#: cupsd.conf.man.in:96 +#, no-wrap +msgid "BrowseAllow all" +msgstr "BrowseAllow all" + +# type: TP +#: cupsd.conf.man.in:98 +#, no-wrap +msgid "BrowseAllow none" +msgstr "BrowseAllow none" + +# type: TP +#: cupsd.conf.man.in:100 +#, no-wrap +msgid "BrowseAllow host.domain.com" +msgstr "BrowseAllow serveur.domaine.com" + +# type: TP +#: cupsd.conf.man.in:102 +#, no-wrap +msgid "BrowseAllow *.domain.com" +msgstr "BrowseAllow *.domaine.com" + +# type: TP +#: cupsd.conf.man.in:104 +#, no-wrap +msgid "BrowseAllow ip-address" +msgstr "BrowseAllow adresse_ip" + +# type: TP +#: cupsd.conf.man.in:106 +#, no-wrap +msgid "BrowseAllow ip-address/netmask" +msgstr "BrowseAllow adresse_ip/masque_sous_réseau" + +# type: TP +#: cupsd.conf.man.in:108 +#, no-wrap +msgid "BrowseAllow ip-address/mm" +msgstr "BrowseAllow adresse_ip/mm" + +# type: TP +#: cupsd.conf.man.in:110 +#, no-wrap +msgid "BrowseAllow @IF(name)" +msgstr "BrowseAllow @IF(nom)" + +# type: TP +#: cupsd.conf.man.in:112 +#, no-wrap +msgid "BrowseAllow @LOCAL" +msgstr "BrowseAllow @LOCAL" + +# type: Plain text +#: cupsd.conf.man.in:116 +msgid "" +"Allows incoming printer information packets from the named host or address." +msgstr "Accepter les paquets arrivant des machines ou adresses IP indiquées." + +# type: TP +#: cupsd.conf.man.in:116 +#, no-wrap +msgid "BrowseDeny all" +msgstr "BrowseDeny all" + +# type: TP +#: cupsd.conf.man.in:118 +#, no-wrap +msgid "BrowseDeny none" +msgstr "BrowseDeny none" + +# type: TP +#: cupsd.conf.man.in:120 +#, no-wrap +msgid "BrowseDeny host.domain.com" +msgstr "BrowseDeny serveur.domaine.com" + +# type: TP +#: cupsd.conf.man.in:122 +#, no-wrap +msgid "BrowseDeny *.domain.com" +msgstr "BrowseDeny *.domaine.com" + +# type: TP +#: cupsd.conf.man.in:124 +#, no-wrap +msgid "BrowseDeny ip-address" +msgstr "BrowseDeny adresse_ip" + +# type: TP +#: cupsd.conf.man.in:126 +#, no-wrap +msgid "BrowseDeny ip-address/netmask" +msgstr "BrowseDeny adresse_ip/masque_sous_réseau" + +# type: TP +#: cupsd.conf.man.in:128 +#, no-wrap +msgid "BrowseDeny ip-address/mm" +msgstr "BrowseDeny addresse_ip/mm" + +# type: TP +#: cupsd.conf.man.in:130 +#, no-wrap +msgid "BrowseDeny @IF(name)" +msgstr "BrowseDeny @IF(nom)" + +# type: TP +#: cupsd.conf.man.in:132 +#, no-wrap +msgid "BrowseDeny @LOCAL" +msgstr "BrowseDeny @LOCAL" + +# type: Plain text +#: cupsd.conf.man.in:136 +msgid "" +"Denies incoming printer information packets from the named host or address." +msgstr "" +"Refuser les paquets d'informations sur les imprimantes arrivant de machines " +"ou d'adresses IP données." + +# type: TP +#: cupsd.conf.man.in:136 +#, no-wrap +msgid "BrowseInterval seconds" +msgstr "BrowseInterval secondes" + +# type: Plain text +#: cupsd.conf.man.in:140 +msgid "Specifies the maximum interval between printer information broadcasts." +msgstr "" +"Définir l'intervalle maximum entre les envois d'information sur les " +"imprimantes." + +# type: TP +#: cupsd.conf.man.in:140 +#, no-wrap +msgid "BrowseOrder allow,deny" +msgstr "BrowseOrder allow,deny" + +# type: TP +#: cupsd.conf.man.in:142 +#, no-wrap +msgid "BrowseOrder deny,allow" +msgstr "BrowseOrder deny,allow" + +# type: Plain text +#: cupsd.conf.man.in:146 +msgid "" +"Specifies the order of printer information access control (allow,deny or " +"deny,allow)" +msgstr "" +"Définir l'ordre du contrôle d'accès aux informations des imprimantes (allow," +"deny ou deny,allow)." + +# type: TP +#: cupsd.conf.man.in:146 +#, no-wrap +msgid "BrowsePoll host-or-ip-address" +msgstr "BrowsePoll serveur-ou-adresse_ip" + +# type: Plain text +#: cupsd.conf.man.in:150 +msgid "Specifies a server to poll for printer information." +msgstr "" +"Définir un serveur à interroger régulièrement pour les informations sur les " +"imprimantes." + +# type: TP +#: cupsd.conf.man.in:150 +#, no-wrap +msgid "BrowsePort port" +msgstr "BrowsePort port" + +# type: Plain text +#: cupsd.conf.man.in:154 +msgid "Specifies the port to listen to for printer information packets." +msgstr "" +"Définir le port utilisé pour écouter les informations sur les imprimantes." + +# type: TP +#: cupsd.conf.man.in:154 +#, no-wrap +msgid "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#: cupsd.conf.man.in:158 +msgid "Specifies the protocols to use for printer browsing." +msgstr "" +"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes." + +# type: TP +#: cupsd.conf.man.in:158 +#, no-wrap +msgid "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseLocalProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#: cupsd.conf.man.in:162 +msgid "Specifies the protocols to use for local printer browsing." +msgstr "" +"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes " +"locales." + +# type: TP +#: cupsd.conf.man.in:162 +#, no-wrap +msgid "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" +msgstr "BrowseRemoteProtocols [All] [CUPS] [DNSSD] [LDAP] [SLP]" + +# type: Plain text +#: cupsd.conf.man.in:166 +msgid "Specifies the protocols to use for remote printer browsing." +msgstr "" +"Définir les protocoles réseaux à utiliser pour la recherche d'imprimantes " +"distantes." + +# type: TP +#: cupsd.conf.man.in:166 +#, no-wrap +msgid "BrowseRelay from-address to-address" +msgstr "BrowseRelay depuis_adresse vers_adresse" + +# type: Plain text +#: cupsd.conf.man.in:171 +msgid "" +"Specifies that printer information packets should be relayed from one host " +"or network to another." +msgstr "" +"Indiquer que les informations sur les imprimantes doivent être relayés " +"depuis une machine ou un réseau vers un autre." + +# type: TP +#: cupsd.conf.man.in:171 +#, no-wrap +msgid "BrowseShortNames Yes" +msgstr "BrowseShortNames Yes" + +# type: TP +#: cupsd.conf.man.in:173 +#, no-wrap +msgid "BrowseShortNames No" +msgstr "BrowseShortNames No" + +# type: Plain text +#: cupsd.conf.man.in:179 +msgid "" +"Specifies whether remote printers will use short names (\"printer\") or not " +"(\"printer@server\"). This option is ignored if more than one remote printer " +"exists with the same name." +msgstr "" +"Définir si les imprimantes distantes utilisent les noms abrégés " +"(« imprimante ») ou non (« imprimante@serveur »). Cette option est ignorée si " +"plus d'une imprimante distante a le même nom." + +# type: TP +#: cupsd.conf.man.in:179 +#, no-wrap +msgid "BrowseTimeout seconds" +msgstr "BrowseTimeout secondes" + +# type: Plain text +#: cupsd.conf.man.in:184 +msgid "" +"Specifies the maximum interval between printer information updates before " +"remote printers will be removed from the list of available printers." +msgstr "" +"Définir l'intervalle maximum de temps entre deux mises à jour d'informations " +"des imprimantes distantes avant que celles-ci ne soient supprimées de la " +"liste des imprimantes disponibles." + +# type: TP +#: cupsd.conf.man.in:184 +#, no-wrap +msgid "Browsing Yes" +msgstr "Browsing Yes" + +# type: TP +#: cupsd.conf.man.in:186 +#, no-wrap +msgid "Browsing No" +msgstr "Browsing No" + +# type: Plain text +#: cupsd.conf.man.in:190 +msgid "Specifies whether or not remote printer browsing should be enabled." +msgstr "Définir si la recherche des imprimantes distantes doit être activée." + +# NOTE: bannière à traduire ? +# type: TP +#: cupsd.conf.man.in:190 +#, no-wrap +msgid "Classification banner" +msgstr "Classification bannière" + +# type: Plain text +#: cupsd.conf.man.in:194 +msgid "Specifies the security classification of the server." +msgstr "Définir le niveau de classification du serveur." + +# type: TP +#: cupsd.conf.man.in:194 +#, no-wrap +msgid "ClassifyOverride Yes" +msgstr "ClassifyOverride Yes" + +# type: TP +#: cupsd.conf.man.in:196 +#, no-wrap +msgid "ClassifyOverride No" +msgstr "ClassifyOverride No" + +# type: Plain text +#: cupsd.conf.man.in:201 +msgid "" +"Specifies whether to allow users to override the classification of " +"individual print jobs." +msgstr "" +"Définir si les utilisateurs sont autorisés à modifier la classification de " +"leurs travaux d'impression." + +# type: TP +#: cupsd.conf.man.in:201 +#, no-wrap +msgid "ConfigFilePerm mode" +msgstr "ConfigFilePerm mode" + +# type: Plain text +#: cupsd.conf.man.in:206 +msgid "" +"Specifies the permissions for all configuration files that the scheduler " +"writes." +msgstr "" +"Définir les permissions à utiliser pour les fichiers de configuration écrits " +"par l'ordonnanceur." + +# type: TP +#: cupsd.conf.man.in:206 +#, no-wrap +msgid "DataDir path" +msgstr "DataDir path" + +# type: Plain text +#: cupsd.conf.man.in:210 +msgid "Specified the directory where data files can be found." +msgstr "Définir le répertoire où se trouvent les fichiers de données." + +# type: TP +#: cupsd.conf.man.in:210 +#, no-wrap +msgid "DefaultAuthType Basic" +msgstr "DefaultAuthType Basic" + +# type: TP +#: cupsd.conf.man.in:212 +#, no-wrap +msgid "DefaultAuthType BasicDigest" +msgstr "DefaultAuthType BasicDigest" + +# type: TP +#: cupsd.conf.man.in:214 +#, no-wrap +msgid "DefaultAuthType Digest" +msgstr "DefaultAuthType Digest" + +# type: TP +#: cupsd.conf.man.in:216 +#, no-wrap +msgid "DefaultAuthType Negotiate" +msgstr "DefaultAuthType Negotiate" + +# type: Plain text +#: cupsd.conf.man.in:220 +msgid "Specifies the default type of authentication to use." +msgstr "Définir le type d'identification à utiliser par défaut." + +# type: TP +#: cupsd.conf.man.in:220 +#, no-wrap +msgid "DefaultCharset charset" +msgstr "DefaultCharset jeux_de_caractères" + +# type: Plain text +#: cupsd.conf.man.in:224 +msgid "Specifies the default character set to use for text." +msgstr "Définir le jeu de caractères par défaut à utiliser pour le texte." + +# type: TP +#: cupsd.conf.man.in:224 +#, no-wrap +msgid "DefaultLanguage locale" +msgstr "DefaultLanguage locale" + +# type: Plain text +#: cupsd.conf.man.in:228 +msgid "Specifies the default language to use for text and web content." +msgstr "" +"Définir la langue par défaut à utiliser pour les textes et le site web." + +# type: TP +#: cupsd.conf.man.in:228 +#, no-wrap +msgid "DefaultPolicy policy-name" +msgstr "DefaultPolicy nom" + +# type: Plain text +#: cupsd.conf.man.in:232 +msgid "Specifies the default access policy to use." +msgstr "Indiquer la politique d'accès par défaut." + +# type: TP +#: cupsd.conf.man.in:232 +#, no-wrap +msgid "DefaultShared Yes" +msgstr "DefaultShared Yes" + +# type: TP +#: cupsd.conf.man.in:234 +#, no-wrap +msgid "DefaultShared No" +msgstr "DefaultShared No" + +# type: Plain text +#: cupsd.conf.man.in:238 +msgid "Specifies whether local printers are shared by default." +msgstr "Définir si les imprimantes locales sont partagées par défaut." + +# type: TP +#: cupsd.conf.man.in:238 +#, no-wrap +msgid "Deny all" +msgstr "Deny all" + +# type: TP +#: cupsd.conf.man.in:240 +#, no-wrap +msgid "Deny none" +msgstr "Deny none" + +# type: TP +#: cupsd.conf.man.in:242 +#, no-wrap +msgid "Deny host.domain.com" +msgstr "Deny serveur.domaine.com" + +# type: TP +#: cupsd.conf.man.in:244 +#, no-wrap +msgid "Deny *.domain.com" +msgstr "Deny *.domaine.com" + +# type: TP +#: cupsd.conf.man.in:246 +#, no-wrap +msgid "Deny ip-address" +msgstr "Deny adresse_ip" + +# type: TP +#: cupsd.conf.man.in:248 +#, no-wrap +msgid "Deny ip-address/netmask" +msgstr "Deny adresse_ip/masque_sous_réseau" + +# type: TP +#: cupsd.conf.man.in:250 +#, no-wrap +msgid "Deny ip-address/mm" +msgstr "Deny adresse_ip/mm" + +# type: TP +#: cupsd.conf.man.in:252 +#, no-wrap +msgid "Deny @IF(name)" +msgstr "Deny @IF(nom)" + +# type: TP +#: cupsd.conf.man.in:254 +#, no-wrap +msgid "Deny @LOCAL" +msgstr "Deny @LOCAL" + +# type: Plain text +#: cupsd.conf.man.in:258 +msgid "Denies access to the named host or address." +msgstr "Interdire l'accès à une machine ou à une adresse IP donnée." + +# type: TP +#: cupsd.conf.man.in:258 +#, no-wrap +msgid "DocumentRoot directory" +msgstr "DocumentRoot répertoire" + +# type: Plain text +#: cupsd.conf.man.in:262 +msgid "Specifies the root directory for the internal web server documents." +msgstr "Définir le répertoire racine des documents du serveur web interne." + +# type: TP +#: cupsd.conf.man.in:271 +#, no-wrap +msgid "ErrorLog filename" +msgstr "ErrorLog fichier" + +# type: TP +#: cupsd.conf.man.in:273 +#, no-wrap +msgid "ErrorLog syslog" +msgstr "ErrorLog syslog" + +# type: Plain text +#: cupsd.conf.man.in:277 +msgid "Specifies the error log filename." +msgstr "Définir le nom du fichier traçant les erreurs." + +# type: TP +#: cupsd.conf.man.in:277 +#, no-wrap +msgid "FileDevice Yes" +msgstr "FileDevice Yes" + +# type: TP +#: cupsd.conf.man.in:279 +#, no-wrap +msgid "FileDevice No" +msgstr "FileDevice No" + +# type: Plain text +#: cupsd.conf.man.in:284 +msgid "" +"Specifies whether the file pseudo-device can be used for new printer queues." +msgstr "" +"Indiquer si un fichier de pseudo-périphérique peut être utilisé pour les " +"queues d'impression." + +# type: TP +#: cupsd.conf.man.in:284 +#, no-wrap +msgid "FilterLimit limit" +msgstr "FilterLimit limite" + +# type: Plain text +#: cupsd.conf.man.in:288 +msgid "Specifies the maximum cost of filters that are run concurrently." +msgstr "Définir le coût maximum des filtres lancés simultanément." + +# type: TP +#: cupsd.conf.man.in:288 +#, no-wrap +msgid "FilterNice nice-value" +msgstr "FilterNice priorité" + +# type: Plain text +#: cupsd.conf.man.in:293 +msgid "" +"Specifies the scheduling priority (\"nice\" value) of filters that are run " +"to print a job." +msgstr "" +"Définir la priorité (valeur «\\ nice\\ ») des filtres exécutés pour une " +"impression." + +# type: TP +#: cupsd.conf.man.in:293 +#, no-wrap +msgid "FontPath directory[:directory:...]" +msgstr "FontPath répertoire[:répertoire:...]" + +# type: Plain text +#: cupsd.conf.man.in:297 +msgid "Specifies the search path for fonts." +msgstr "Définir le chemin de recherche des polices." + +# type: TP +#: cupsd.conf.man.in:297 +#, no-wrap +msgid "Group group-name-or-number" +msgstr "Group nom_groupe-ou-identifiant_numérique" + +# type: Plain text +#: cupsd.conf.man.in:302 +msgid "" +"Specifies the group name or ID that will be used when executing external " +"programs." +msgstr "" +"Définir le nom du groupe ou l'identifiant numérique du groupe qui sera " +"utilisé lors de l'exécution de programmes externes." + +# type: TP +#: cupsd.conf.man.in:302 +#, no-wrap +msgid "HideImplicitMembers Yes" +msgstr "HideImplicitMembers Yes" + +# type: TP +#: cupsd.conf.man.in:304 +#, no-wrap +msgid "HideImplicitMembers No" +msgstr "HideImplicitMembers No" + +# type: Plain text +#: cupsd.conf.man.in:308 +msgid "Specifies whether to hide members of implicit classes." +msgstr "Définir s'il faut cacher ou non les membres des classes implicites." + +# type: TP +#: cupsd.conf.man.in:308 +#, no-wrap +msgid "HostNameLookups On" +msgstr "HostNameLookups On" + +# type: TP +#: cupsd.conf.man.in:310 +#, no-wrap +msgid "HostNameLookups Off" +msgstr "HostNameLookups Off" + +# type: TP +#: cupsd.conf.man.in:312 +#, no-wrap +msgid "HostNameLookups Double" +msgstr "HostNameLookups Double" + +# type: Plain text +#: cupsd.conf.man.in:316 +msgid "Specifies whether or not to do reverse lookups on client addresses." +msgstr "" +"Définir s'il faut effectuer des recherches de noms à partir des adresses des " +"clients." + +# type: TP +#: cupsd.conf.man.in:316 +#, no-wrap +msgid "ImplicitAnyClasses Yes" +msgstr "ImplicitAnyClasses Yes" + +# type: TP +#: cupsd.conf.man.in:318 +#, no-wrap +msgid "ImplicitAnyClasses No" +msgstr "ImplicitAnyClasses No" + +# type: Plain text +#: cupsd.conf.man.in:324 +msgid "" +"Specifies whether or not to create implicit classes for local and remote " +"printers, e.g. \"AnyPrinter\" from \"Printer\", \"Printer@server1\", and " +"\"Printer@server2\"." +msgstr "" +"Indiquer s'il faut créer des classes implicites pour les imprimantes locales " +"et distantes (par exemple « UneImprimante » pour « Imprimante », " +"« Imprimante@serveur1 » et « Imprimante@serveur2 »)." + +# type: TP +#: cupsd.conf.man.in:324 +#, no-wrap +msgid "ImplicitClasses Yes" +msgstr "ImplicitClasses Yes" + +# type: TP +#: cupsd.conf.man.in:326 +#, no-wrap +msgid "ImplicitClasses No" +msgstr "ImplicitClasses No" + +# type: Plain text +#: cupsd.conf.man.in:331 +msgid "" +"Specifies whether or not to create implicit classes from identical remote " +"printers." +msgstr "" +"Indiquer s'il faut créer une classe implicite pour les imprimantes distantes " +"identiques." + +# type: TP +#: cupsd.conf.man.in:331 +#, no-wrap +msgid "Include filename" +msgstr "Include fichier" + +# type: Plain text +#: cupsd.conf.man.in:335 +msgid "Includes the named file." +msgstr "Inclure le fichier donné." + +# type: TP +#: cupsd.conf.man.in:335 +#, no-wrap +msgid "JobRetryInterval seconds" +msgstr "JobRetryInterval secondes" + +# type: Plain text +#: cupsd.conf.man.in:339 +msgid "Specifies the interval between retries of jobs in seconds." +msgstr "" +"Indiquer l'intervalle entre deux essais d'impression d'un travail, en " +"secondes." + +# type: TP +#: cupsd.conf.man.in:339 +#, no-wrap +msgid "JobRetryLimit count" +msgstr "JobRetryLimit nombre" + +# type: Plain text +#: cupsd.conf.man.in:343 +msgid "Specifies the number of retries that are done for jobs." +msgstr "Indiquer le nombre d'essais maximum pour les travaux." + +# type: TP +#: cupsd.conf.man.in:343 +#, no-wrap +msgid "KeepAlive Yes" +msgstr "KeepAlive Yes" + +# type: TP +#: cupsd.conf.man.in:345 +#, no-wrap +msgid "KeepAlive No" +msgstr "KeepAlive No" + +# type: Plain text +#: cupsd.conf.man.in:349 +msgid "Specifies whether to support HTTP keep-alive connections." +msgstr "Définir s'il faut utiliser HTTP-Keep-Alive." + +# type: TP +#: cupsd.conf.man.in:349 +#, no-wrap +msgid "KeepAliveTimeout seconds" +msgstr "KeepAliveTimeout secondes" + +# type: Plain text +#: cupsd.conf.man.in:353 +msgid "Specifies the amount of time that connections are kept alive." +msgstr "Définir la durée pendant laquelle les connexion sont conservées." + +# type: TP +#: cupsd.conf.man.in:353 +#, no-wrap +msgid "Krb5Keytab filename" +msgstr "Krb5Keytab fichier" + +# type: Plain text +#: cupsd.conf.man.in:357 +msgid "Overrides the Kerberos key tab location." +msgstr "Changer l'emplacement du fichier de clés (« key tab ») Kerberos." + +# type: TP +#: cupsd.conf.man.in:357 +#, no-wrap +msgid "E<lt>Limit operationsE<gt> ... E<lt>/LimitE<gt>" +msgstr "E<lt>Limit operationsE<gt> ... E<lt>/LimitE<gt>" + +# type: Plain text +#: cupsd.conf.man.in:361 +msgid "Specifies the IPP operations that are being limited inside a policy." +msgstr "Indiquer les opérations IPP non autorisés dans une certaine politique." + +# type: TP +#: cupsd.conf.man.in:361 +#, no-wrap +msgid "E<lt>Limit methodsE<gt> ... E<lt>/LimitE<gt>" +msgstr "E<lt>Limit methodesE<gt> ... E<lt>/LimitE<gt>" + +# type: TP +#: cupsd.conf.man.in:363 +#, no-wrap +msgid "E<lt>LimitExcept methodsE<gt> ... E<lt>/LimitExceptE<gt>" +msgstr "E<lt>LimitExcept methodesE<gt> ... E<lt>/LimitExceptE<gt>" + +# type: Plain text +#: cupsd.conf.man.in:367 +msgid "Specifies the HTTP methods that are being limited inside a location." +msgstr "Définir les méthodes HTTP interdites pour un lieu donné." + +# type: TP +#: cupsd.conf.man.in:367 +#, no-wrap +msgid "LimitRequestBody" +msgstr "LimitRequestBody" + +# type: Plain text +#: cupsd.conf.man.in:371 +msgid "Specifies the maximum size of any print job request." +msgstr "Définir la taille maximale des demandes de travaux d'impression." + +# type: TP +#: cupsd.conf.man.in:371 +#, no-wrap +msgid "Listen ip-address:port" +msgstr "Listen adress_ip:port" + +# type: TP +#: cupsd.conf.man.in:373 +#, no-wrap +msgid "Listen *:port" +msgstr "Listen *:port" + +# type: TP +#: cupsd.conf.man.in:375 +#, no-wrap +msgid "Listen /path/to/domain/socket" +msgstr "Listen /chemin/socket/domaine" + +# type: Plain text +#: cupsd.conf.man.in:379 +msgid "Listens to the specified address and port or domain socket path." +msgstr "" +"Écouter à l'adresse et au port indiqué ou sur la socket de domaine dont le " +"chemin est indiqué." + +# type: TP +#: cupsd.conf.man.in:379 +#, no-wrap +msgid "E<lt>Location /pathE<gt> ... E<lt>/LocationE<gt>" +msgstr "E<lt>Location /cheminE<gt> ... E<lt>/LocationE<gt>" + +# type: Plain text +#: cupsd.conf.man.in:383 +msgid "Specifies access control for the named location." +msgstr "Définir les contrôles d'accès pour un lieu donné." + +# type: TP +#: cupsd.conf.man.in:383 +#, no-wrap +msgid "LogFilePerm mode" +msgstr "LogFilePerm mode" + +# type: Plain text +#: cupsd.conf.man.in:387 +msgid "Specifies the permissions for all log files that the scheduler writes." +msgstr "" +"Définir les permissions des fichiers journaux écrits par l'ordonnanceur." + +# type: TP +#: cupsd.conf.man.in:387 +#, no-wrap +msgid "LogLevel alert" +msgstr "LogLevel alert" + +# type: TP +#: cupsd.conf.man.in:389 +#, no-wrap +msgid "LogLevel crit" +msgstr "LogLevel crit" + +# type: TP +#: cupsd.conf.man.in:391 +#, no-wrap +msgid "LogLevel debug2" +msgstr "LogLevel debug2" + +# type: TP +#: cupsd.conf.man.in:393 +#, no-wrap +msgid "LogLevel debug" +msgstr "LogLevel debug" + +# type: TP +#: cupsd.conf.man.in:395 +#, no-wrap +msgid "LogLevel emerg" +msgstr "LogLevel emerg" + +# type: TP +#: cupsd.conf.man.in:397 +#, no-wrap +msgid "LogLevel error" +msgstr "LogLevel error" + +# type: TP +#: cupsd.conf.man.in:399 +#, no-wrap +msgid "LogLevel info" +msgstr "LogLevel info" + +# type: TP +#: cupsd.conf.man.in:401 +#, no-wrap +msgid "LogLevel none" +msgstr "LogLevel none" + +# type: TP +#: cupsd.conf.man.in:403 +#, no-wrap +msgid "LogLevel notice" +msgstr "LogLevel notice" + +# type: TP +#: cupsd.conf.man.in:405 +#, no-wrap +msgid "LogLevel warn" +msgstr "LogLevel warn" + +# type: Plain text +#: cupsd.conf.man.in:409 +msgid "Specifies the logging level for the ErrorLog file." +msgstr "Définir le niveau de trace pour le journal des erreurs." + +# type: TP +#: cupsd.conf.man.in:409 +#, no-wrap +msgid "MaxClients number" +msgstr "MaxClients nombre" + +# type: Plain text +#: cupsd.conf.man.in:413 +msgid "Specifies the maximum number of simultaneous clients to support." +msgstr "Définir le nombre maximum de clients simultanés." + +# type: TP +#: cupsd.conf.man.in:413 +#, no-wrap +msgid "MaxClientsPerHost number" +msgstr "MaxClientsPerHost nombre" + +# type: Plain text +#: cupsd.conf.man.in:418 +msgid "" +"Specifies the maximum number of simultaneous clients to support from a " +"single address." +msgstr "" +"Définir le nombre maximum de clients simultanés provenant de la même adresse." + +# type: TP +#: cupsd.conf.man.in:418 +#, no-wrap +msgid "MaxCopies number" +msgstr "MaxCopies nombre" + +# type: Plain text +#: cupsd.conf.man.in:422 +msgid "" +"Specifies the maximum number of copies that a user can print of each job." +msgstr "" +"Définir le nombre maximum de copies qu'un utilisateur peut effectuer pour un " +"travail d'impression." + +# type: TP +#: cupsd.conf.man.in:422 +#, no-wrap +msgid "MaxJobs number" +msgstr "MaxJobs nombre" + +# type: Plain text +#: cupsd.conf.man.in:426 +msgid "Specifies the maximum number of simultaneous jobs to support." +msgstr "Définir le nombre maximum de travaux simultanés." + +# type: TP +#: cupsd.conf.man.in:426 +#, no-wrap +msgid "MaxJobsPerPrinter number" +msgstr "MaxJobsPerPrinter nombre" + +# type: Plain text +#: cupsd.conf.man.in:430 +msgid "" +"Specifies the maximum number of simultaneous jobs per printer to support." +msgstr "Définir le nombre maximum de travaux simultanés par imprimante." + +# type: TP +#: cupsd.conf.man.in:430 +#, no-wrap +msgid "MaxJobsPerUser number" +msgstr "MaxJobsPerUser nombre" + +# type: Plain text +#: cupsd.conf.man.in:434 +msgid "Specifies the maximum number of simultaneous jobs per user to support." +msgstr "Définir le nombre maximum de travaux simultanés par utilisateur." + +# type: TP +#: cupsd.conf.man.in:434 +#, no-wrap +msgid "MaxLogSize number-bytes" +msgstr "MaxLogSize nombre_octets" + +# type: Plain text +#: cupsd.conf.man.in:439 +msgid "" +"Specifies the maximum size of the log files before they are rotated (0 to " +"disable rotation)" +msgstr "" +"Définir la taille maximale des fichiers de trace. Au-delà de cette taille, " +"les fichiers sont recyclés (0 pour supprimer la rotation des fichiers." + +# type: TP +#: cupsd.conf.man.in:439 +#, no-wrap +msgid "MaxRequestSize number-bytes" +msgstr "MaxRequestSize nombre_octets" + +# type: Plain text +#: cupsd.conf.man.in:443 +msgid "Specifies the maximum request/file size in bytes (0 for no limit)" +msgstr "" +"Définir la taille maximale des fichiers et des requêtes à imprimer. La " +"taille est exprimée en octets (0 indique qu'il n'y a pas de limite)." + +# type: TP +#: cupsd.conf.man.in:443 +#, no-wrap +msgid "Order allow,deny" +msgstr "Order allow,deny" + +# type: TP +#: cupsd.conf.man.in:445 +#, no-wrap +msgid "Order deny,allow" +msgstr "Order deny,allow" + +# type: Plain text +#: cupsd.conf.man.in:449 +msgid "Specifies the order of HTTP access control (allow,deny or deny,allow)" +msgstr "" +"Définir l'ordre pour le contrôle d'accès HTTP (allow,deny ou deny,allow)." + +# type: TP +#: cupsd.conf.man.in:449 +#, no-wrap +msgid "PageLog filename" +msgstr "PageLog fichier" + +# type: TP +#: cupsd.conf.man.in:451 +#, no-wrap +msgid "PageLog syslog" +msgstr "PageLog syslog" + +# type: Plain text +#: cupsd.conf.man.in:455 +msgid "Specifies the page log filename." +msgstr "Définir le fichier de trace des pages web visitées." + +# type: TP +#: cupsd.conf.man.in:455 +#, no-wrap +msgid "PassEnv variable [... variable]" +msgstr "PassEnv variable [... variable]" + +# type: Plain text +#: cupsd.conf.man.in:459 +msgid "Passes the specified environment variable(s) to child processes." +msgstr "Passer les variables d'environnement spécifiées aux processus fils." + +# type: TP +#: cupsd.conf.man.in:459 +#, no-wrap +msgid "E<lt>Policy nameE<gt> ... E<lt>/PolicyE<gt>" +msgstr "E<lt>Policy nomE<gt> ... E<lt>/PolicyE<gt>" + +# type: Plain text +#: cupsd.conf.man.in:463 +msgid "Specifies access control for the named policy." +msgstr "Définir les contrôles d'accès pour la politique donnée." + +# type: TP +#: cupsd.conf.man.in:463 +#, no-wrap +msgid "Port number" +msgstr "Port nombre" + +# type: Plain text +#: cupsd.conf.man.in:467 +msgid "Specifies a port number to listen to for HTTP requests." +msgstr "Définir le numéro du port où écouter les requêtes HTTP." + +# type: TP +#: cupsd.conf.man.in:467 +#, no-wrap +msgid "PreserveJobFiles Yes" +msgstr "PreserveJobFiles Yes" + +# type: TP +#: cupsd.conf.man.in:469 +#, no-wrap +msgid "PreserveJobFiles No" +msgstr "PreserveJobFiles No" + +# type: Plain text +#: cupsd.conf.man.in:473 +msgid "Specifies whether or not to preserve job files after they are printed." +msgstr "" +"Définir s'il faut conserver ou non les fichiers de travail après impression." + +# type: TP +#: cupsd.conf.man.in:473 +#, no-wrap +msgid "PreserveJobHistory Yes" +msgstr "PreserveJobHistory Yes" + +# type: TP +#: cupsd.conf.man.in:475 +#, no-wrap +msgid "PreserveJobHistory No" +msgstr "PreserveJobHistory No" + +# type: Plain text +#: cupsd.conf.man.in:480 +msgid "" +"Specifies whether or not to preserve the job history after they are printed." +msgstr "" +"Définir s'il faut conserver ou non l'historique des demandes d'impression " +"une fois qu'elles sont terminées." + +# type: TP +#: cupsd.conf.man.in:480 +#, no-wrap +msgid "Printcap" +msgstr "Printcap" + +# type: TP +#: cupsd.conf.man.in:482 +#, no-wrap +msgid "Printcap filename" +msgstr "Printcap fichier" + +# type: Plain text +#: cupsd.conf.man.in:489 +msgid "" +"Specifies the filename for a printcap file that is updated automatically " +"with a list of available printers (needed for legacy applications); " +"specifying Printcap with no filename disables printcap generation." +msgstr "" +"Définir l'emplacement du fichier printcap, contenant la liste des " +"imprimantes disponibles, et qui est mis à jour automatiquement. Ce fichier " +"est indispensable aux applications classiques. Si aucun fichier printcap " +"n'est précisé, la génération du fichier printcap sera désactivée." + +# type: TP +#: cupsd.conf.man.in:489 +#, no-wrap +msgid "PrintcapFormat bsd" +msgstr "PrintcapFormat bsd" + +# type: TP +#: cupsd.conf.man.in:491 +#, no-wrap +msgid "PrintcapFormat solaris" +msgstr "PrintcapFormat solaris" + +# type: Plain text +#: cupsd.conf.man.in:495 +msgid "Specifies the format of the printcap file." +msgstr "Définir le format du fichier printcap." + +# type: TP +#: cupsd.conf.man.in:495 +#, no-wrap +msgid "PrintcapGUI" +msgstr "PrintcapGUI" + +# type: TP +#: cupsd.conf.man.in:497 +#, no-wrap +msgid "PrintcapGUI gui-program-filename" +msgstr "PrintcapGUI fichier_interface_graphique" + +# type: Plain text +#: cupsd.conf.man.in:503 +msgid "" +"Specifies whether to generate option panel definition files on some " +"operating systems. When provided with no program filename, disables option " +"panel definition files." +msgstr "" +"Définir s'il faut générer des fichiers de définition d'options pour des " +"systèmes d'exploitation. Quand c'est fournit sans nom de fichier d'un " +"programme, il n'y a pas de fichier de définition d'options." + +# type: TP +#: cupsd.conf.man.in:503 +#, no-wrap +msgid "ReloadTimeout seconds" +msgstr "ReloadTimeout secondes" + +# type: Plain text +#: cupsd.conf.man.in:508 +msgid "" +"Specifies the amount of time to wait for job completion before restarting " +"the scheduler." +msgstr "" +"Définir le temps maximum à attendre pour la fin d'un travail avant de " +"redémarrer l'ordonnanceur." + +# type: TP +#: cupsd.conf.man.in:508 +#, no-wrap +msgid "RemoteRoot user-name" +msgstr "RemoteRoot utilisateur" + +# type: Plain text +#: cupsd.conf.man.in:513 +msgid "" +"Specifies the username that is associated with unauthenticated root accesses." +msgstr "Définir l'utilisateur associé aux accès root non identifié." + +# type: TP +#: cupsd.conf.man.in:513 +#, no-wrap +msgid "RequestRoot directory" +msgstr "RequestRoot répertoire" + +# type: Plain text +#: cupsd.conf.man.in:518 +msgid "" +"Specifies the directory to store print jobs and other HTTP request data." +msgstr "" +"Définir le répertoire où sont stockés les travaux et les données des " +"requêtes HTTP." + +# type: TP +#: cupsd.conf.man.in:518 +#, no-wrap +msgid "Require group group-name-list" +msgstr "Require group liste_groupes" + +# type: TP +#: cupsd.conf.man.in:520 +#, no-wrap +msgid "Require user user-name-list" +msgstr "Require user liste_utilisateurs" + +# type: TP +#: cupsd.conf.man.in:522 +#, no-wrap +msgid "Require valid-user" +msgstr "Require valid-user" + +# type: Plain text +#: cupsd.conf.man.in:526 +msgid "Specifies that user or group authentication is required." +msgstr "" +"Indiquer qu'une identification par utilisateur ou par groupe est nécessaire." + +# type: TP +#: cupsd.conf.man.in:526 +#, no-wrap +msgid "RIPCache bytes" +msgstr "RIPCache octets" + +# type: Plain text +#: cupsd.conf.man.in:531 +msgid "" +"Specifies the maximum amount of memory to use when converting images and " +"PostScript files to bitmaps for a printer." +msgstr "" +"Définir la taille maximale de mémoire à utiliser lors de la conversion " +"d'images ou de fichiers PostScript en fichier bitmap pour une imprimante." + +# type: TP +#: cupsd.conf.man.in:531 +#, no-wrap +msgid "Satisfy all" +msgstr "Satisfy all" + +# type: TP +#: cupsd.conf.man.in:533 +#, no-wrap +msgid "Satisfy any" +msgstr "Satisfy any" + +# type: Plain text +#: cupsd.conf.man.in:538 +msgid "" +"Specifies whether all or any limits set for a Location must be satisfied to " +"allow access." +msgstr "" +"Définir si toutes les limites (« all »), ou seulement une des limites " +"(« any ») définies pour un lieu donné doivent être satisfaites pour permettre " +"l'accès." + +# type: TP +#: cupsd.conf.man.in:538 +#, no-wrap +msgid "ServerAdmin user@domain.com" +msgstr "ServerAdmin utilisateur@domaine.com" + +# type: Plain text +#: cupsd.conf.man.in:542 +msgid "Specifies the email address of the server administrator." +msgstr "Définir l'adresse électronique de l'administrateur du serveur." + +# type: TP +#: cupsd.conf.man.in:542 +#, no-wrap +msgid "ServerBin directory" +msgstr "ServerBin répertoire" + +# type: Plain text +#: cupsd.conf.man.in:547 +msgid "" +"Specifies the directory where backends, CGIs, daemons, and filters may be " +"found." +msgstr "" +"Définir le répertoire où les applications dorsales, les CGI, les démons et " +"les filtres sont stockés." + +# type: TP +#: cupsd.conf.man.in:547 +#, no-wrap +msgid "ServerCertificate filename" +msgstr "ServerCertificate fichier" + +# type: Plain text +#: cupsd.conf.man.in:551 +msgid "Specifies the encryption certificate to use." +msgstr "Définir le certificat à utiliser pour le chiffrement." + +# type: TP +#: cupsd.conf.man.in:551 +#, no-wrap +msgid "ServerKey filename" +msgstr "ServerKey fichier" + +# type: Plain text +#: cupsd.conf.man.in:555 +msgid "Specifies the encryption key to use." +msgstr "Définir la clé de chiffrement à utiliser." + +# type: TP +#: cupsd.conf.man.in:555 +#, no-wrap +msgid "ServerName hostname-or-ip-address" +msgstr "ServerName hôte-ou-adresse_ip" + +# type: Plain text +#: cupsd.conf.man.in:559 +msgid "Specifies the fully-qualified hostname of the server." +msgstr "Définir le nom complet du serveur." + +# type: TP +#: cupsd.conf.man.in:559 +#, no-wrap +msgid "ServerRoot directory" +msgstr "ServerRoot répertoire" + +# type: Plain text +#: cupsd.conf.man.in:563 +msgid "" +"Specifies the directory where the server configuration files can be found." +msgstr "" +"Définir le répertoire où les fichiers de configuration du serveur sont " +"stockés." + +# type: TP +#: cupsd.conf.man.in:563 +#, no-wrap +msgid "ServerTokens Full" +msgstr "ServerTokens Full" + +# type: TP +#: cupsd.conf.man.in:565 +#, no-wrap +msgid "ServerTokens Major" +msgstr "ServerTokens Major" + +# type: TP +#: cupsd.conf.man.in:567 +#, no-wrap +msgid "ServerTokens Minimal" +msgstr "ServerTokens Minimal" + +# type: TP +#: cupsd.conf.man.in:569 +#, no-wrap +msgid "ServerTokens Minor" +msgstr "ServerTokens Minor" + +# type: TP +#: cupsd.conf.man.in:571 +#, no-wrap +msgid "ServerTokens None" +msgstr "ServerTokens None" + +# type: TP +#: cupsd.conf.man.in:573 +#, no-wrap +msgid "ServerTokens OS" +msgstr "ServerTokens OS" + +# type: TP +#: cupsd.conf.man.in:575 +#, no-wrap +msgid "ServerTokens ProductOnly" +msgstr "ServerTokens ProductOnly" + +# type: Plain text +#: cupsd.conf.man.in:580 +msgid "" +"Specifies what information is included in the Server header of HTTP " +"responses." +msgstr "" +"Indiquer quelles informations sont disponibles dans l'entête des réponses du " +"serveur HTTP." + +# type: TP +#: cupsd.conf.man.in:580 +#, no-wrap +msgid "SetEnv variable value" +msgstr "SetEnv variable valeur" + +# type: Plain text +#: cupsd.conf.man.in:584 +msgid "Set the specified environment variable to be passed to child processes." +msgstr "Fixer les varaibles d'environnement à passer aux processus fils." + +# type: TP +#: cupsd.conf.man.in:584 +#, no-wrap +msgid "SSLListen" +msgstr "SSLListen" + +# type: Plain text +#: cupsd.conf.man.in:588 +msgid "Listens on the specified address and port for encrypted connections." +msgstr "" +"Écouter à l'adresse et au port indiqués pour les connexions sécurisées." + +# type: TP +#: cupsd.conf.man.in:588 +#, no-wrap +msgid "SSLPort" +msgstr "SSLPort" + +# type: Plain text +#: cupsd.conf.man.in:592 +msgid "Listens on the specified port for encrypted connections." +msgstr "Écouter sur le port indiqué pour les connexions sécurisées." + +# type: TP +#: cupsd.conf.man.in:592 +#, no-wrap +msgid "SystemGroup group-name [group-name ...]" +msgstr "SystemGroup groupe [groupe ...]" + +# type: Plain text +#: cupsd.conf.man.in:596 +msgid "Specifies the group(s) to use for System class authentication." +msgstr "Définir le(s) groupe(s) à utiliser pour les identifications système." + +# type: TP +#: cupsd.conf.man.in:596 +#, no-wrap +msgid "TempDir directory" +msgstr "TempDir répertoire" + +# type: Plain text +#: cupsd.conf.man.in:600 +msgid "Specifies the directory where temporary files are stored." +msgstr "Définir le répertoire où les fichiers temporaires sont stockés." + +# type: TP +#: cupsd.conf.man.in:600 +#, no-wrap +msgid "Timeout seconds" +msgstr "Timeout secondes" + +# type: Plain text +#: cupsd.conf.man.in:604 +msgid "Specifies the HTTP request timeout in seconds." +msgstr "Définir le timeout des requêtes HTTP (en secondes)." + +# type: TP +#: cupsd.conf.man.in:604 +#, no-wrap +msgid "User user-name" +msgstr "User utilisateur" + +# type: Plain text +#: cupsd.conf.man.in:608 +msgid "" +"Specifies the user name or ID that is used when running external programs." +msgstr "" +"Définir le nom ou l'identifiant de l'utilisateur utilisé lors du lancement " +"de programmes externes." + +# type: Plain text +#: cupsd.conf.man.in:612 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<mime.convs(5)>, I<mime.types(5)>, " +"I<printers.conf(5)>, I<subscriptions.conf(5)>," +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<mime.convs>(5), B<mime.types>(5), " +"B<printers.conf>(5), B<subscriptions.conf>(5)," + +# type: TH +#: cups-deviced.man.in:15 +#, no-wrap +msgid "cups-deviced" +msgstr "cups-deviced" + +# type: Plain text +#: cups-deviced.man.in:18 +msgid "cups-deviced - cups device daemon" +msgstr "cups-deviced - Démon de périphériques CUPS." + +# type: Plain text +#: cups-deviced.man.in:21 +msgid "B<cups-deviced> I<request-id limit user-id options>" +msgstr "B<cups-deviced> I<id_requête limite id_utilisateur options>" + +# type: Plain text +#: cups-deviced.man.in:36 +msgid "" +"I<cups-deviced> polls the backends in I<@CUPS_SERVERBIN@/backend> for a list " +"of available devices. It is run by I<cupsd(8)> in response to a I<CUPS-Get-" +"Devices> request. The output format is an IPP response message. The " +"I<request-id> argument is the request ID from the original IPP request, " +"typically 1. The I<limit> argument is the limit value from the original IPP " +"request - 0 means no limit. The I<user-id> argument is the requesting-user-" +"name value from the original IPP request. Finally, the I<options> argument " +"is a space-delimited list of attributes (\"name=value name=value ...\") that " +"were passed in with the request. Currently I<cups-deviced> looks for the " +"I<requested-attributes> attribute and tailors the output accordingly." +msgstr "" +"B<cups-deviced> interroge régulièrement les dorsaux de I<@CUPS_SERVERBIN@/" +"backend> pour avoir la liste des périphériques disponibles. Il est exécuté " +"par B<cups>(8) suite à une requête I<CUPS-Get-Devices>. Le format de sortie " +"est un message de réponse IPP. Le paramètre I<request-id> correspond à " +"l'identifiant de la requête IPP initiale, typiquement 1. Le paramètre " +"I<limite> est la valeur limite de la requête initiale, 0 signifiant qu'il " +"n'y a pas de limite. Le paramètre I<user-id> est la valeur requesting-user-" +"name (utilisateur demandeur) de la requête initiale. Enfin, le paramètre " +"I<options> est une liste d'attributs séparés par des espaces (« nom=valeur " +"nom=valeur ») qui étaient passés à la requête. Actuellement, B<cups-deviced> " +"utilise les attributs I<requested-attributes> pour construire la sortie en " +"conséquence." + +# type: Plain text +#: cups-deviced.man.in:38 +msgid "backend(7), cupsd(8), cupsd.conf(5)," +msgstr "B<backend>(7), B<cupsd>(8), B<cupsd.conf>(5)," + +# type: TH +#: cupsd.man.in:15 +#, no-wrap +msgid "cupsd" +msgstr "cupsd" + +# type: Plain text +#: cupsd.man.in:18 +msgid "cupsd - common unix printing system daemon" +msgstr "cupsd - démon Common Unix Printing System." + +# type: Plain text +#: cupsd.man.in:23 +msgid "B<cupsd> [ -c I<config-file> ] [ -f ] [ -F ] [ -h ] [ -l ]" +msgstr "B<cupsd> [ -c I<fichier_configuration> ] [ -f ] [ -F ] [ -h ] [ -l ]" + +# type: Plain text +#: cupsd.man.in:29 +msgid "" +"I<cupsd> is the scheduler for the Common UNIX Printing System. It implements " +"a printing system based upon the Internet Printing Protocol, version 1.1. " +"If no options are specified on the command-line then the default " +"configuration file I<@CUPS_SERVERROOT@/cupsd.conf> will be used." +msgstr "" +"B<cupsd> est un ordonanceur pour le système Common UNIX Printing System. Il " +"fournit des outils pour un système d'impression de base sur le Internet " +"Printing Protocol, version 1.1. Si aucune option n'est spécifiée sur la " +"ligne de commande, alors le fichier de configuration par défaut " +"I<@CUPS_SERVERROOT@/cupsd.conf> sera utilisé." + +# type: TP +#: cupsd.man.in:30 cupsfilter.man:38 +#, no-wrap +msgid "-c config-file" +msgstr "B<-c> I<fichier_configuration>" + +# type: Plain text +#: cupsd.man.in:34 +msgid "Uses the named configuration file." +msgstr "Utiliser le fichier de configuration donné." + +# type: TP +#: cupsd.man.in:34 +#, no-wrap +msgid "-f" +msgstr "B<-f>" + +# type: Plain text +#: cupsd.man.in:39 +msgid "" +"Run I<cupsd> in the foreground; the default is to run in the background as a " +"\"daemon\"." +msgstr "" +"Forcer B<cupsd> à tourner au premier plan ; par défaut, cupsd tourne en " +"arrière-plan comme « démon »." + +# type: TP +#: cupsd.man.in:39 +#, no-wrap +msgid "-F" +msgstr "B<-F>" + +# type: Plain text +#: cupsd.man.in:45 +msgid "" +"Run I<cupsd> in the foreground but detach the process from the controlling " +"terminal and current directory. This is useful for running I<cupsd> from " +"I<init(8)>." +msgstr "" +"Forcer B<cupsd> à tourner en avant-plan, mais détache le processus du " +"terminal et du répertoire de travail. Cette option est utile pour lancer " +"B<cupsd> depuis B<init>(8)." + +# type: TP +#: cupsd.man.in:45 lpr.man:71 +#, no-wrap +msgid "-h" +msgstr "B<-h>" + +# type: Plain text +#: cupsd.man.in:49 +msgid "Shows the program usage." +msgstr "Afficher un message d'aide." + +# type: TP +#: cupsd.man.in:49 lpinfo.man:51 lpoptions.man.in:84 lpq.man:59 lpr.man:76 +#: lpstat.man:83 +#, no-wrap +msgid "-l" +msgstr "B<-l>" + +# type: Plain text +#: cupsd.man.in:54 +msgid "This option is passed to I<cupsd> when it is run from I<launchd(8)>." +msgstr "" +"Cette option est passée à B<cupsd> losqu'il est lancé par B<launchd>(8)." + +# type: Plain text +#: cupsd.man.in:58 +msgid "" +"I<cupsd> implements all of the required IPP/1.1 attributes and operations. " +"It also implements several CUPS-specific administration operations." +msgstr "" +"B<cupsd> fournit tous les attributs et opération de IPP/1.1. Il implémente " +"aussi plusieurs opérations d'administration spécifiques à CUPS." + +# type: Plain text +#: cupsd.man.in:63 +msgid "" +"I<backend(7)>, I<classes.conf(5)>, I<cups-deviced(8)>, I<cups-driverd(8)>, " +"I<cups-lpd(8)>, I<cups-polld(8)>, I<cupsd.conf(5)>, I<filter(7)>, I<launchd" +"(8)>, I<mime.convs(5)>, I<mime.types(5)>, I<printers.conf(5)>," +msgstr "" +"B<backend>(7), B<classes.conf>(5), B<cups-deviced>(8), B<cups-driverd>(8), " +"B<cups-lpd>(8), B<cups-polld>(8), B<cupsd.conf>(5), B<filter>(7), B<launchd>" +"(8), B<mime.convs>(5), B<mime.types>(5), B<printers.conf>(5)," + +# type: TH +#: cups-driverd.man.in:15 +#, no-wrap +msgid "cups-driverd" +msgstr "cups-driverd" + +# type: Plain text +#: cups-driverd.man.in:18 +msgid "cups-driverd - cups driver daemon" +msgstr "cups-driverd - Démon de pilotes CUPS." + +# type: Plain text +#: cups-driverd.man.in:22 +msgid "B<cups-driverd> cat I<ppd-name>" +msgstr "B<cups-driverd> cat I<nom_ppd>" + +# type: Plain text +#: cups-driverd.man.in:26 +msgid "B<cups-driverd> list I<request_id limit options>" +msgstr "B<cups-driverd> list I<id_requête limite options>" + +# type: Plain text +#: cups-driverd.man.in:31 +msgid "" +"I<cups-driverd> shows or lists PPD files. It is run in response to CUPS-Add-" +"Modify-Printer or CUPS-Get-Devices requests. The first form (\"cups-driverd " +"cat ppd-name\") writes the named PPD file to stdout. The output format is an " +"uncompressed PPD file." +msgstr "" +"B<cups-driverd> affiche ou liste les fichiers PPD. Il est exécuté en réponse " +"à des requêtes CUPS-Add-Modify-Printer ou CUPS-Get-Devices. La première " +"forme (« cups-driverd cat nom_ppd ») écrit le fichier PPD sur la sortie " +"standard. Le format de sortie est un fichier PPD non compressé." + +# type: Plain text +#: cups-driverd.man.in:43 +msgid "" +"The second form lists the available manufacturers or PPD files to stdout as " +"indicated by the I<options> argument. The output format is an IPP response " +"message. The I<request_id> argument is the request ID from the original IPP " +"request, typically 1. The I<limit> argument is the limit value from the " +"original IPP request - 0 means no limit. Finally, the I<options> argument is " +"a space-delimited list of attributes (\"name=value name=value \\&...\") that " +"were passed in with the request. Currently I<cups-driverd> looks for the " +"I<ppd-make> and I<requested-attributes> attributes and tailors the output " +"accordingly." +msgstr "" +"La seconde forme liste les fabricants ou les fichiers PPD disponibles sur la " +"sortie standard, comme demandé par le paramètre I<options>. Le format de " +"sortie est un message de réponse IPP. Le paramètre I<request-id> correspond " +"à l'identifiant de la requête IPP initiale, typiquement 1. Le paramètre " +"I<limite> est la valeur limite de la requête initiale, 0 signifiant qu'il " +"n'y a pas de limite. Enfin, le paramètre I<options> est une liste " +"d'attributs séparés par des espaces (« nom=valeur nom=valeur \\&... ») qui " +"étaient passés à la requête. Actuellement, B<cups-deviced> utilise les " +"attributs I<ppd-make> et I<requested-attributes> pour construire la sortie " +"en conséquence." + +# type: SH +#: cups-driverd.man.in:43 +#, no-wrap +msgid "DRIVERS" +msgstr "PILOTES" + +# type: Plain text +#: cups-driverd.man.in:51 +msgid "" +"Drivers can be static PPD files under the I<@CUPS_DATADIR@/model> directory " +"or programs under the I<@CUPS_SERVERBIN@/driver> directory. Static PPD files " +"must conform to the Adobe PPD File Format Specification version 4.3 and may " +"be compressed using the I<gzip(1)> program. Driver programs must implement " +"the command-line interface shown in the next section." +msgstr "" +"Les pilotes peuvent être des fichiers PPD dans le répertoire " +"I<@CUPS_DATADIR@/model> ou des programmes dans le répertoire " +"I<@CUPS_SERVERBIN@/driver>. Les fichiers PPD statiques doivent se conformer " +"aux spécifications Adobe du format de fichier PPD, version 4.3, et peuvent " +"être compressés avec le programme B<gzip>(1). Les programmes de pilotes " +"doivent gérer l'interface en ligne de commande définie dans la section " +"suivante." + +# type: SS +#: cups-driverd.man.in:51 +#, no-wrap +msgid "DRIVER PROGRAMS" +msgstr "PROGRAMMES DE PILOTES" + +# type: Plain text +#: cups-driverd.man.in:54 +msgid "" +"Driver programs provide an interface to dynamically-generated PPD files. The " +"following arguments are currently defined:" +msgstr "" +"Les programmes de pilotes fournissent une interface pour générer " +"dynamiquement des fichiers PPD. Pour l'instant, les paramètres suivants sont " +"définis :" + +# type: TP +#: cups-driverd.man.in:54 +#, no-wrap +msgid "drivername list" +msgstr "drivername list" + +# type: Plain text +#: cups-driverd.man.in:58 +msgid "Lists the supported PPD files to stdout." +msgstr "Liste, sur la sortie standard, les fichiers PPD gérés." + +# type: TP +#: cups-driverd.man.in:58 +#, no-wrap +msgid "drivername cat ppdname" +msgstr "drivername cat nom_ppd" + +# type: Plain text +#: cups-driverd.man.in:62 +msgid "Writes the named PPD file to stdout." +msgstr "Écrire le fichier PPD indiqué sur la sortie standard." + +# type: SS +#: cups-driverd.man.in:62 +#, no-wrap +msgid "LISTING FILES (drivername list)" +msgstr "LISTER LES FICHIER (nom_pilote list)" + +# type: Plain text +#: cups-driverd.man.in:66 +msgid "" +"When run with the single argument \"list\", the program must list the " +"available PPD files it can generate to stdout using the following format:" +msgstr "" +"Lorsqu'il est lancé avec l'unique paramètre « list », le programme doit " +"lister sur la sortie standard les fichiers PPD disponibles qu'il peut " +"générer, en utilisant le format suivant :" + +# type: Plain text +#: cups-driverd.man.in:68 +#, no-wrap +msgid " \"drivername:ppdname\" language \"make\" \"make and model\" \"1284 device id\"\n" +msgstr " \"nom_pilote:nom_ppd\" langue \"marque\" \"marque et modèle\" \"1284 id_périphérique\"\n" + +# type: Plain text +#: cups-driverd.man.in:77 +msgid "" +"I<Drivername> is the name of the driver program. I<Ppdname> is the name used " +"to select the given driver. I<Language> is the locale associated with the " +"default language of the PPD file, typically \"en\". I<Make> is the " +"Manufacturer name from the PPD file. I<Make and model> is the NickName name " +"from the PPD file. I<1284 device id> is the 1284DeviceId from the PPD file, " +"if any." +msgstr "" +"I<nom_pilote> est le nom du programme pilote. I<nom_ppd> est le nom utilisé " +"pour sélectionner le pilote. I<langue> est la locale associée avec la langue " +"par défaut du fichier PPD, généralement « en ». I<marque> est le nom du " +"fabriquant dans le fichier PPD. I<marque et modèle> est le nom du fichier " +"PPD. I<id_1284_périphérique> est l'identifiant 1284DeviceID du fichier PPD, " +"s'il y en a un." + +# type: SS +#: cups-driverd.man.in:77 +#, no-wrap +msgid "WRITING FILES (drivername cat ppdname)" +msgstr "ÉCRIRE LES FICHIER (nom_pilote cat nom_ppd)" + +# type: Plain text +#: cups-driverd.man.in:82 +msgid "" +"When the driver program is run with the \"cat ppdname\" arguments, it must " +"write the named PPD file to stdout, uncompressed. If the named PPD file does " +"not exist, the driver program must not write any output to stdout and report " +"the error to stderr instead." +msgstr "" +"QUand le programme pilote est lancé avec les paramètre « cat nom_ppd », il " +"écrit le fichier PPD demandé, non compressé, sur la sortie standard. Si le " +"fichier PPD demandé n'existe pas, le programme pilote ne doit rien écrire " +"sur la sortie standard, mais doit utiliser la sortie d'erreur à la place." + +# type: SS +#: cups-driverd.man.in:82 +#, no-wrap +msgid "DRIVER ERROR MESSAGES" +msgstr "MESSAGES D'ERREUR DES PILOTES" + +# type: Plain text +#: cups-driverd.man.in:85 +msgid "" +"Error messages can be relayed back to I<cupsd> by writing them to stderr. " +"The following prefixes are recognized:" +msgstr "" +"Les messages d'erreur peuvent être renvoyés à I<cupsd> en les écrivant sur " +"la sortie standard d'erreur. Les préfix suivants sont reconnus :" + +# type: TP +#: cups-driverd.man.in:85 +#, no-wrap +msgid "DEBUG: [drivername]" +msgstr "DEBUG: [drivername]" + +# type: Plain text +#: cups-driverd.man.in:89 +msgid "Debugging messages" +msgstr "Mesages de débogage." + +# type: TP +#: cups-driverd.man.in:89 +#, no-wrap +msgid "ERROR: [drivername]" +msgstr "ERROR: [nom_pilote]" + +# type: Plain text +#: cups-driverd.man.in:93 +msgid "Error messages" +msgstr "Messages d'erreur." + +# type: TP +#: cups-driverd.man.in:93 +#, no-wrap +msgid "INFO: [drivername]" +msgstr "INFO: [nom_pilote]" + +# type: Plain text +#: cups-driverd.man.in:97 +msgid "Informational messages" +msgstr "Messages d'information." + +# type: Plain text +#: cups-driverd.man.in:99 +msgid "cupsd(8), cupsd.conf(5), cupstestppd(1)," +msgstr "B<cupsd>(8), B<cupsd.conf>(5), B<cupstestppd>(1)," + +# type: TH +#: cupsenable.man:16 +#, no-wrap +msgid "cupsenable" +msgstr "cupsenable" + +# type: Plain text +#: cupsenable.man:19 +msgid "cupsdisable, cupsenable - stop/start printers and classes" +msgstr "" +"cupsdisable, cupsenable - Arrêter/démarrer des imprimantes ou classes " +"d'imprimantes." + +# type: Plain text +#: cupsenable.man:28 +msgid "" +"B<cupsdisable> [ -E ] [-U I<username> ] [ -c ] [ -h I<server[:port]> ] [ -r " +"I<reason> ] destination(s)" +msgstr "" +"B<cupsdisable> [ -E ] [-U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] " +"[ -r I<raison> ] destination(s)" + +# type: Plain text +#: cupsenable.man:35 +msgid "" +"B<cupsenable> [ -E ] [-U I<username> ] [ -c ] [ -h I<server[:port]> ] " +"destination(s)" +msgstr "" +"B<cupsenable> [ -E ] [-U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] " +"destination(s)" + +# type: Plain text +#: cupsenable.man:37 +msgid "I<cupsenable> starts the named printers or classes." +msgstr "B<cupsenable> démarre l'imprimante ou la classe d'imprimante indiquée." + +# type: Plain text +#: cupsenable.man:40 +msgid "" +"I<cupsdisable> stops the named printers or classes. The following options " +"may be used:" +msgstr "" +"B<cupsdisable> arrête l'imprimante ou la classe d'imprimante indiquée. Les " +"options suivantes peuvent être utilisées :" + +# type: Plain text +#: cupsenable.man:44 +msgid "Forces encryption of the connection to the server." +msgstr "Forcer le chiffrement de la connexion au serveur." + +# type: Plain text +#: cupsenable.man:48 +msgid "Uses the specified username when connecting to the server." +msgstr "utiliser l'utilisateur indiqué pour les connexions au serveur." + +# type: TP +#: cupsenable.man:48 lp.man:80 +#, no-wrap +msgid "-c" +msgstr "B<-c>" + +# type: Plain text +#: cupsenable.man:52 +msgid "Cancels all jobs on the named destination." +msgstr "Annuler tous les travaux sur la destination donnée." + +# type: TP +#: cupsenable.man:52 lpinfo.man:47 lpmove.man:54 lpoptions.man.in:80 +#: lpq.man:55 lprm.man:49 lpstat.man:79 +#, no-wrap +msgid "-h server[:port]" +msgstr "B<-h> I<serveur[:port]>" + +# type: Plain text +#: cupsenable.man:56 +msgid "Uses the specified server and port." +msgstr "Utiliser le serveur et le port indiqués." + +# type: Plain text +#: cupsenable.man:61 +msgid "" +"Sets the message associated with the stopped state. If no reason is " +"specified then the message is set to \"Reason Unknown\"." +msgstr "" +"Configurer le message associé avec l'état arrêté. Si aucune raison n'est " +"spécifiée, alors le message sera « Reason Unknown » (« Raison Inconnue »)." + +# type: Plain text +#: cupsenable.man:69 +msgid "" +"The System V versions of these commands are I<disable> and I<enable>. They " +"have been renamed to avoid conflicts with the I<bash(1)> build-in command of " +"the same name." +msgstr "" +"Les version System V de ces commandes sont B<disable> et B<enable>. Elles " +"ont été renommées pour éviter les conflits avec les commandes internes de " +"B<bash>(1) du même nom." + +# type: Plain text +#: cupsenable.man:74 +msgid "" +"The CUPS versions of I<disable> and I<enable> may ask the user for an access " +"password depending on the printing system configuration. This differs from " +"the System V versions which require the root user to execute these commands." +msgstr "" +"Les versions CUPS de B<disable> et B<enable> peuvent demander à " +"l'utilisateur de s'identifier suivant la configuration du système " +"d'impression, à la différence des versions System V, qui demandent le mot de " +"passe root pour exécuter ces commande." + +# type: Plain text +#: cupsenable.man:77 +msgid "I<accept(8)>, I<cancel(1)>, I<lp(1)>, I<lpadmin(8)>, I<lpstat(1)>," +msgstr "B<accept>(8), B<cancel>(1), B<lp>(1), B<lpadmin>(8), B<lpstat>(1)," + +# type: TP +#: cupsfilter.man:14 +#, no-wrap +msgid "cupsfilter" +msgstr "cupsfilter" + +# type: TH +#: cupsfilter.man:14 +#, no-wrap +msgid "19 October 2007" +msgstr "19 octobre 2007" + +# type: Plain text +#: cupsfilter.man:17 +msgid "cupsfilter - convert a file to another format using cups filters" +msgstr "" +"cupsfilter - Convertir un fichier vers un autre format en utilisant les " +"filtres CUPS" + +# type: Plain text +#: cupsfilter.man:33 +msgid "" +"B<cupsfilter> [ -c I<config-file> ] [ -m I<mime/type> ] [ -n I<copies> ] [ -" +"o I<name=value> ] [ -p I<filename.ppd> ] [ -t I<title> ] I<filename>" +msgstr "" +"B<cupsfilter> [ -c I<fichier_configuration> ] [ -m I<type/mime> ] [ -n " +"I<copies> ] [ -o I<nom=valeur> ] [ -p I<fichier.ppd> ] [ -t I<titre> ] " +"I<fichier>" + +# type: Plain text +#: cupsfilter.man:37 +msgid "" +"I<cupsfilter> is a front-end to the CUPS filter subsystem which allows you " +"to convert a file to a specific format, just as if you had printed the file " +"through CUPS. By default, I<cupsfilter> generates a PDF file." +msgstr "" +"B<cupsfilter> est une interface pour le système de filtres de CUPS qui vous " +"permet de convertir un fichier dans un format spécific, comme si vous aviez " +"imprimé le fichier avec CUPS. Par défaut, B<cupsfilter> génère un fichier " +"PDF." + +# type: Plain text +#: cupsfilter.man:42 +msgid "Uses the named cupsd.conf configuration file." +msgstr "Utiliser le fichier de configuration cupsd.conf donné." + +# type: TH +#: cupsfilter.man:42 +#, no-wrap +msgid "-m mime/type" +msgstr "B<-m> I<type/mime>" + +# type: Plain text +#: cupsfilter.man:46 +msgid "" +"Specifies the destination file type. The default file type is application/" +"pdf." +msgstr "" +"Indiquer le type du fichier de destination. La valeur par défaut est " +"application/pdf." + +# type: TP +#: cupsfilter.man:46 lp.man:104 +#, no-wrap +msgid "-n copies" +msgstr "B<-n> I<copies>" + +# type: Plain text +#: cupsfilter.man:50 +msgid "Specifies the number of copies to generate." +msgstr "Indiquer le nombre de copies à créer." + +# type: TP +#: cupsfilter.man:50 cups-lpd.man.in:67 lpadmin.man:105 +#, no-wrap +msgid "-o name=value" +msgstr "B<-o> I<nom=valeur>" + +# type: Plain text +#: cupsfilter.man:54 +msgid "Specifies options to pass to the CUPS filters." +msgstr "Indiquer les options à fournir aux filtres CUPS." + +# type: TP +#: cupsfilter.man:54 +#, no-wrap +msgid "-p filename.ppd" +msgstr "B<-p> I<fichier.ppd>" + +# type: Plain text +#: cupsfilter.man:58 +msgid "Specifies the PPD file to use." +msgstr "Définir le fichier PPD à utiliser." + +# type: TP +#: cupsfilter.man:58 +#, no-wrap +msgid "-t title" +msgstr "B<-t> I<titre>" + +# type: Plain text +#: cupsfilter.man:62 +msgid "Specifies the document title." +msgstr "Définir le titre du document." + +# type: Plain text +#: cupsfilter.man:65 +msgid "" +"I<cupsfilter> currently does not use the filters defined in the PPD file. " +"This will be addressed in a future CUPS release." +msgstr "" +"B<cupsaddsmb> n'utilise pas pour l'instant les filtres définis dans le " +"fichier PPD. Ces filtres eronts gérés dans une version future de CUPS." + +# type: TH +#: cupsfilter.man:67 +msgid "I<cupsd.conf(5)>" +msgstr "B<cupsd.conf>(5)" + +# type: TH +#: cups-lpd.man.in:15 +#, no-wrap +msgid "cups-lpd" +msgstr "cups-lpd" + +# type: TH +#: cups-lpd.man.in:15 +#, no-wrap +msgid "24 April 2006" +msgstr "24 avril 2006" + +# type: Plain text +#: cups-lpd.man.in:18 +msgid "cups-lpd - receive print jobs and report printer status to lpd clients" +msgstr "" +"cups-lpd - Recevoir les travaux d'impression et renvoyer l'état des " +"imprimantes aux clients lpd." + +# type: Plain text +#: cups-lpd.man.in:23 +msgid "B<cups-lpd> [ -n ] [ -o I<option=value> ]" +msgstr "B<cups-lpd> [ -n ] [ -o I<option=valeur> ]" + +# type: Plain text +#: cups-lpd.man.in:31 +msgid "" +"I<cups-lpd> is the CUPS Line Printer Daemon (\"LPD\") mini-server that " +"supports legacy client systems that use the LPD protocol. I<cups-lpd> does " +"not act as a standalone network daemon but instead operates using the " +"Internet \"super-server\" I<inetd(8)> or I<xinetd(8)>. If you are using " +"I<inetd>, add the following line to the I<inetd.conf> file to enable the " +"I<cups-lpd> mini-server:" +msgstr "" +"B<cups-lpd> est le mini serveur Line Printer Daemon (« LPD ») de CUPS, qui " +"gère les client classiques utilisant le protocole LPD. B<cups-lpd> ne " +"fonctionne pas lui-même comme un démon réseau, mais utilise le super-serveur " +"B<inetd>(8). Si vous utilisez B<inetd>, ajoutez la ligne suivante au fichier " +"I<inetd.conf> pour activer le démon B<cups-lpd> :" + +# type: Plain text +#: cups-lpd.man.in:36 +#, no-wrap +msgid "" +" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" +" -o document-format=application/octet-stream\n" +msgstr "" +" printer stream tcp nowait lp @CUPS_SERVERBIN@/daemon/cups-lpd cups-lpd \\e\n" +" -o document-format=application/octet-stream\n" + +# type: Plain text +#: cups-lpd.man.in:42 +msgid "" +"B<Note:> If you are using Solaris 10 or higher, you must run the I<inetdconv" +"(1m)> program to register the changes to the inetd.conf file." +msgstr "" +"B<Remarque :> si vous utilisez Solaris 10 ou une version ultérieure, vous " +"devez exécuter B<inetdconv>(1m) pour enregistrer les changements apportés au " +"fichier I<inetd.conf>." + +# type: Plain text +#: cups-lpd.man.in:45 +msgid "" +"If you are using the newer I<xinetd(8)> daemon, create a file named I</etc/" +"xinetd.d/cups> containing the following lines:" +msgstr "" +"Si vous utilisez le démon plus récent I<xinetd>(8), créez le fichier I</etc/" +"xinetd.d/cups> contenant les lignes suivantes :" + +# type: Plain text +#: cups-lpd.man.in:59 +#, no-wrap +msgid "" +" service printer\n" +" {\n" +" socket_type = stream\n" +" protocol = tcp\n" +" wait = no\n" +" user = lp\n" +"\tgroup = sys\n" +"\tpassenv =\n" +" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" +"\tserver_args = -o document-format=application/octet-stream\n" +" }\n" +msgstr "" +" service printer\n" +" {\n" +" socket_type = stream\n" +" protocol = tcp\n" +" wait = no\n" +" user = lp\n" +"\tgroup = sys\n" +"\tpassenv =\n" +" server = @CUPS_SERVERBIN@/daemon/cups-lpd\n" +"\tserver_args = -o document-format=application/octet-stream\n" +" }\n" + +# type: TP +#: cups-lpd.man.in:61 +#, no-wrap +msgid "-n" +msgstr "B<-n>" + +# type: Plain text +#: cups-lpd.man.in:67 +msgid "" +"Disables reverse address lookups; normally I<cups-lpd> will try to discover " +"the hostname of the client via a reverse DNS lookup." +msgstr "" +"Désactiver la résolution inverse des noms d'hôte ; normalement, B<cups-lpd> " +"essaie de récupérer le nom d'hôte à l'aide d'une requête DNS inverse." + +# type: Plain text +#: cups-lpd.man.in:75 +msgid "" +"Inserts options for all print queues. Most often this is used to disable the " +"\"l\" filter so that remote print jobs are filtered as needed for printing; " +"the examples in the previous section set the \"document-format\" option to " +"\"application/octet-stream\" which forces autodetection of the print file " +"format." +msgstr "" +"Insérer des options pour toutes les queues d'impression. Le plus souvent, " +"c'est utilisé pour désactiver le filtre « l » pour que les travaux distants " +"soient également filtrés correctement ; les exemples des sections " +"précédentes fixent l'option « document-format » à « application/octet-" +"stream », ce qui force l'autodétection du format des fichiers à imprimer." + +# type: SH +#: cups-lpd.man.in:75 +#, no-wrap +msgid "PERFORMANCE" +msgstr "PERFORMANCE" + +# type: Plain text +#: cups-lpd.man.in:82 +msgid "" +"I<cups-lpd> performs well with small numbers of clients and printers. " +"However, since a new process is created for each connection and since each " +"process must query the printing system before each job submission, it does " +"not scale to larger configurations. We highly recommend that large " +"configurations use the native IPP support provided by CUPS instead." +msgstr "" +"Les performances de B<cups-lpd> sont correctes avec un petit nombre de " +"clients et d'imprimantes. Cependant, comme un nouveau processus est créé " +"pour chaque connexion et comme chaque processus doit interroger le système " +"d'impression avant chaque soumission d'un travail d'impression, ça ne " +"s'étend pas facilement à des configurations plus importantes. Nous " +"recommandons d'utiliser la gestion du protocole IPP native dans CUPS pour " +"les configurations importantes." + +# type: SH +#: cups-lpd.man.in:82 +#, no-wrap +msgid "SECURITY" +msgstr "SÉCURITÉ" + +# type: Plain text +#: cups-lpd.man.in:89 +msgid "" +"I<cups-lpd> currently does not perform any access control based on the " +"settings in I<cupsd.conf(5)> or in the I<hosts.allow(5)> or I<hosts.deny(5)> " +"files used by TCP wrappers. Therefore, running I<cups-lpd> on your server " +"will allow any computer on your network (and perhaps the entire Internet) to " +"print to your server." +msgstr "" +"B<cups-lpd> n'applique pour le moment aucun des contrôles d'accès définis " +"dans les fichiers B<cupsd.conf>(5), B<hosts.allow>(5) ou B<hosts.deny>(5) " +"utilisés par les wrappers TCP. L'exécution de B<cups-lpd> sur un serveur " +"permet donc le lancement d'impressions depuis n'importe quel ordinateur de " +"votre réseau, voire même de n'importe quel ordinateur sur Internet." + +# type: Plain text +#: cups-lpd.man.in:94 +msgid "" +"While I<xinetd> has built-in access control support, you should use the TCP " +"wrappers package with I<inetd> to limit access to only those computers that " +"should be able to print through your server." +msgstr "" +"Bien que I<xinetd> possède un contrôle d'accès intégré, il est recommandé " +"d'utiliser le wrapper TCP fourni avec I<inetd> pour limiter les accès aux " +"seuls ordinateurs autorisés à lancer des impressions sur le serveur." + +# type: Plain text +#: cups-lpd.man.in:98 +msgid "" +"I<cups-lpd> is not enabled by the standard CUPS distribution. Please " +"consult with your operating system vendor to determine whether it is enabled " +"on your system." +msgstr "" +"B<cups-lpd> n'est pas activé dans la distribution standard de CUPS. Veuillez " +"consulter votre distributeur de système d'exploitation pour savoir s'il est " +"activé sur votre système." + +# type: Plain text +#: cups-lpd.man.in:104 +msgid "" +"I<cups-lpd> does not enforce the restricted source port number specified in " +"RFC 1179, as using restricted ports does not prevent users from submitting " +"print jobs. While this behavior is different than standard Berkeley LPD " +"implementations, it should not affect normal client operations." +msgstr "" +"B<cups-lpd> ne se conforme pas à la RFC 1179 concernant l'utilisation des " +"ports systèmes (1 à 1\\|024), car l'utilisation de ces ports n'empêche pas " +"un utilisateur d'envoyer un travail d'impression. Bien que ce comportement " +"soit différent de celui des implémentations LPD Berkeley, il ne devrait pas " +"affecter le déroulement correct des impressions." + +# type: Plain text +#: cups-lpd.man.in:109 +msgid "" +"The output of the status requests follows RFC 2569, Mapping between LPD and " +"IPP Protocols. Since many LPD implementations stray from this definition, " +"remote status reporting to LPD clients may be unreliable." +msgstr "" +"Le format de sortie des demandes d'état se conforme à la RFC 2569, Mapping " +"between LPD and IPP Protocols. Comme bon nombre d'implémentations LPD ne " +"suivent pas cette définition, la récupération d'état par un client LPD peut " +"être erronée." + +# type: Plain text +#: cups-lpd.man.in:112 +msgid "I<cups(1)>, I<cupsd(8)>, I<inetconv(1m)>, I<inetd(8)>, I<xinetd(8)>," +msgstr "B<cups>(1), B<cupsd>(8), B<inetconv>(1m), B<inetd>(8), B<xinetd>(8)," + +# type: TH +#: cups-polld.man:15 +#, no-wrap +msgid "cups-polld" +msgstr "cups-polld" + +# type: Plain text +#: cups-polld.man:18 +msgid "cups-polld - cups printer polling daemon" +msgstr "cups-polld - Démon d'interrogation des imprimantes CUPS." + +# type: Plain text +#: cups-polld.man:21 +msgid "B<cups-polld> I<address ipp-port interval browse-port>" +msgstr "B<cups-polld> I<adresse port-ipp intervalle port-de-navigation>" + +# type: Plain text +#: cups-polld.man:27 +msgid "" +"I<cups-polld> polls remote servers for a list of available printers and " +"printer classes every I<interval> seconds. Printer and class information is " +"then broadcast to the localhost interface (127.0.0.1) on the specified " +"browse port for reception by I<cupsd(8)>." +msgstr "" +"B<cups-polld> interroge des serveurs distants afin d'obtenir la liste des " +"imprimantes et classes d'imprimantes disponibles toutes les I<intervalle> " +"secondes. Les informations sont alors renvoyées vers l'interface locale " +"(127.0.0.1) et le port de navigation spécifié pour être récupérées par " +"B<cupsd>(8)." + +# type: Plain text +#: cups-polld.man:30 +msgid "" +"This program is started automatically by I<cupsd> for every I<BrowsePoll> " +"directive found in the I<cupsd.conf(5)> file." +msgstr "" +"Ce programme est démarré automatiquement par B<cupsd> pour chaque directive " +"« BrowsePoll » trouvée dans le fichier B<cupsd.conf>(5)." + +# type: Plain text +#: cups-polld.man:32 +msgid "I<cupsd(8)>, I<cupsd.conf(5)>," +msgstr "B<cupsd>(8), B<cupsd.conf>(5)," + +# type: TH +#: cups-snmp.conf.man:15 +#, no-wrap +msgid "snmp.conf" +msgstr "snmp.conf" + +# type: TH +#: cups-snmp.conf.man:15 +#, no-wrap +msgid "31 July 2006" +msgstr "31 juillet 2006" + +# type: Plain text +#: cups-snmp.conf.man:18 +msgid "snmp.conf - snmp configuration file for cups" +msgstr "snmp.conf - Fichier de configuration SNMP pour CUPS" + +# type: Plain text +#: cups-snmp.conf.man:24 +msgid "" +"The I<snmp.conf> file configures the CUPS SNMP printer discovery backend and " +"is normally located in the I</etc/cups> directory. Each line in the file can " +"be a configuration directive, a blank line, or a comment. Comment lines " +"start with the # character." +msgstr "" +"Le fichier I<snmp.conf> configure le service SNMP de découverte des " +"imprimantes de CUPS et se trouve normalement dans le répertoire I</etc/" +"cups>. Chaque ligne du fichier est une directive de configuration, une ligne " +"vide ou un commentaire. Les commentaires commencent par le symbole #." + +# type: Plain text +#: cups-snmp.conf.man:30 +msgid "" +"The SNMP backend uses the SNMPv1 protocol to discover network printers, " +"collecting information from the Host MIB along with intelligent port probes " +"to determine the correct device URI and make and model for each printer. " +"Future versions of CUPS will likely support the new Port Monitor MIB as well." +msgstr "" +"La gestion du SNMP utilise le protocol SNMPv1 pour découvrir les imprimantes " +"réseau, récupérer les information à partir de la MIB de l'hôte en plus de " +"sondes de ports pour déterminer l'URI correcte du périphérique, la marque et " +"le modèle pour chacune des imprimantes. Les versions futures de CUPS " +"géreront probablement également la nouvelle MIB « Port Monitor »." + +# type: Plain text +#: cups-snmp.conf.man:33 +msgid "" +"The following directives are understood by the SNMP backend. Consult the on-" +"line help for detailed descriptions:" +msgstr "" +"Les directives suivantes sont comprises par le service SNMP. Veuillez vous " +"reporter à l'aide en ligne pour une description plus détaillée." + +# type: TP +#: cups-snmp.conf.man:33 +#, no-wrap +msgid "Address @IF(I<name>)" +msgstr "Address @IF(I<nom>)" + +# type: TP +#: cups-snmp.conf.man:35 +#, no-wrap +msgid "Address @LOCAL" +msgstr "Address @LOCAL" + +# type: TP +#: cups-snmp.conf.man:37 +#, no-wrap +msgid "Address I<address>" +msgstr "Address I<adresse>" + +# type: Plain text +#: cups-snmp.conf.man:43 +msgid "" +"Sends SNMP broadcast queries to the specified address(es). The default " +"address is \"@LOCAL\" which broadcasts to all LAN interfaces." +msgstr "" +"Envoyer les reqête SNMP de broadcast à (aux) adresse(s) indiquée(s). Par " +"défaut, l'adresse est « @LOCAL », ce qui signifie que les requêtes sont " +"envoyées sur les interfaces LAN." + +# type: TP +#: cups-snmp.conf.man:43 +#, no-wrap +msgid "Community I<name>" +msgstr "Community I<nom>" + +# type: Plain text +#: cups-snmp.conf.man:48 +msgid "" +"Specifies a SNMP community to query. The default community is \"public\"." +msgstr "" +"Spécifier la communauté SNMP à interroger. La communauté par défaut est " +"« public »." + +# type: TP +#: cups-snmp.conf.man:48 +#, no-wrap +msgid "DebugLevel I<N>" +msgstr "DebugLevel I<N>" + +# type: Plain text +#: cups-snmp.conf.man:54 +msgid "" +"Sets the debug logging level to I<N>; 0 disables debug logging, 1 enables " +"basic logging, 2 displays SNMP values, and 3 displays raw hex data." +msgstr "" +"Fixer le niveau de débogage enregistré dans les journaux à I<N> ; 0 désative " +"l'enregistrement des informations pour le débogage, 1 active un " +"enregistrement basique, 2 affiche les valeurs SNMP et 3 affiche les données " +"brutes hexadécimales." + +# type: TP +#: cups-snmp.conf.man:54 +#, no-wrap +msgid "HostNameLookups on" +msgstr "HostNameLookups on" + +# type: TP +#: cups-snmp.conf.man:56 +#, no-wrap +msgid "HostNameLookups off" +msgstr "HostNameLookups off" + +# type: Plain text +#: cups-snmp.conf.man:62 +msgid "" +"Specifies whether the addresses of printers should be converted to hostnames " +"or left as numeric IP addresses. The default is \"off\"." +msgstr "" +"Définir si les adresses des imprimantes doivent être convertie en nom " +"d'hôtes ou doivent être laissées en adresses IP numérique. La valeur par " +"défaut est « off »." + +# type: TP +#: cups-snmp.conf.man:62 +#, no-wrap +msgid "MaxRunTime I<seconds>" +msgstr "MaxRunTime I<secondes>" + +# type: Plain text +#: cups-snmp.conf.man:67 +msgid "" +"Specifies the maximum number of seconds that the SNMP backend will scan the " +"network for printers." +msgstr "" +"Spécifier le nombre maximal de secondes entre les requêtes du dorsal SNMP " +"pour la découverte des imprimantes réseau." + +# type: TH +#: cupstestdsc.man:15 +#, no-wrap +msgid "cupstestdsc" +msgstr "cupstestdsc" + +# type: Plain text +#: cupstestdsc.man:18 +msgid "cupstestdsc - test conformance of postscript files" +msgstr "cupstestppd - Tester la conformité des fichiers postscript." + +# type: Plain text +#: cupstestdsc.man:23 +msgid "B<cupstestdsc> [ -h ] filename.ps [ ... I<filenameN.ps> ]" +msgstr "B<cupstestdsc> [ -h ] I<fichier.ps> [ ... I<fichierN.ps> ]" + +# type: Plain text +#: cupstestdsc.man:26 +msgid "B<cupstestdsc> [ -h ] -" +msgstr "B<cupstestdsc> [ -h ] -" + +# type: Plain text +#: cupstestdsc.man:32 +msgid "" +"I<cupstestdsc> tests the conformance of PostScript files to the Adobe " +"PostScript Language Document Structuring Conventions Specification version " +"3.0. The results of testing and any other output are sent to the standard " +"output. The second form of the command reads PostScript from the standard " +"input." +msgstr "" +"B<cupstestdsc> teste la conformité de fichiers PostScript envers la " +"spécification de format de fichier édictée par Adobe, « Adobe PostScript " +"Language Document Structuring Conventions Specification » dans sa version " +"3.0. Les résultats des tests et autres sorties sont envoyés sur la sortie " +"standard. La seconde forme de la commande lit l'entrée PostScript depuis " +"l'entrée standard." + +# type: SH +#: cupstestdsc.man:32 lpadmin.man:195 lpc.man:53 +#, no-wrap +msgid "LIMITATIONS" +msgstr "LIMITATIONS" + +# type: Plain text +#: cupstestdsc.man:41 +msgid "" +"I<cupstestdsc> only validates the DSC comments in a PostScript file and does " +"not attempt to validate the PostScript code itself. Developers must ensure " +"that the PostScript they generate follows the rules defined by Adobe. " +"Specifically, all pages must be independent of each other, code outside page " +"descriptions may not affect the graphics state (current font, color, " +"transform matrix, etc.), and device-specific commands such as setpagedevice " +"should not be used." +msgstr "" +"B<cupstestdsc> ne valide que les commentaires DSC du fichier PostScript et " +"ne cherche pas à valider le code PostScript lui-même. Les développeurs " +"doivent s'assurer que le PostScript qu'ils génèrent est conforme aux règles " +"définies par Adobe. En particulier, toutes les pages doivent être " +"indépendantes les unes des autres, le code en dehors des descriptions des " +"pages ne doit pas affecter l'état des graphiques (police, couleur, matrices " +"de transformations en cours, etc.) et les commandes spécifiques à certains " +"périphériques ne doivent pas être utilisées." + +# type: Plain text +#: cupstestdsc.man:46 +msgid "" +"Adobe PostScript Language Document Structuring Conventions Specification, " +"Version 3.0." +msgstr "" +"Adobe PostScript Language Document Structuring Conventions Specification, " +"Version 3.0." + +# type: TH +#: cupstestppd.man:15 +#, no-wrap +msgid "cupstestppd" +msgstr "cupstestppd" + +# type: TH +#: cupstestppd.man:15 +#, no-wrap +msgid "3 May 2007" +msgstr "3 mai 2007" + +# type: Plain text +#: cupstestppd.man:18 +msgid "cupstestppd - test conformance of ppd files" +msgstr "cupstestppd - Tester la conformité des fichiers PPD." + +# type: Plain text +#: cupstestppd.man:25 +msgid "" +"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] " +"filename.ppd[.gz] [ ... filenameN.ppd[.gz] ]" +msgstr "" +"B<cupstestppd> [ -R I<rép_racine> ] [ -W I<catégorie> ] [ -q ] [-r] [ -v" +"[v] ] fichier.ppd[.gz] [ ... fichierN.ppd[.gz] ]" + +# type: Plain text +#: cupstestppd.man:32 +msgid "" +"B<cupstestppd> [ -R I<rootdir> ] [ -W I<category> ] [ -q ] [-r] [ -v[v] ] -" +msgstr "" +"B<cupstestppd> [ -R I<rép_racine> ] [ -W I<catégorie> ] [ -q ] [-r] [ -v" +"[v] ] -" + +# type: Plain text +#: cupstestppd.man:38 +msgid "" +"I<cupstestppd> tests the conformance of PPD files to the Adobe PostScript " +"Printer Description file format specification version 4.3. It can also be " +"used to list the supported options and available fonts in a PPD file. The " +"results of testing and any other output are sent to the standard output." +msgstr "" +"B<cupstestppd> teste la conformité des fichiers PPD envers la spécification " +"de format de fichier édictée par Adobe, « Adobe PostScript Printer " +"Description » dans sa version 4.3. Cette commande peut également être " +"utilisée pour voir la liste des options reconnues et des polices disponibles " +"d'un fichier PPD. Toutes les sorties sont effectuées sur la sortie standard." + +# type: Plain text +#: cupstestppd.man:42 +msgid "" +"The first form of I<cupstestppd> tests one or more PPD files on the command-" +"line. The second form tests the PPD file provided on the standard input." +msgstr "" +"Le premier mode d'appel de B<cupstestppd> teste un ou plusieurs fichiers PPD " +"fournis sur la ligne de ommande Le second mode d'appel teste le fichier PPD " +"fourni sur l'entrée standard." + +# type: Plain text +#: cupstestppd.man:44 +msgid "I<cupstestppd> supports the following options:" +msgstr "B<cupstestppd> gère les options suivantes :" + +# type: TP +#: cupstestppd.man:44 +#, no-wrap +msgid "-R rootdir" +msgstr "B<-R> I<rép_racine>" + +# NOTE: support file checks? +# type: Plain text +#: cupstestppd.man:49 +msgid "" +"Specifies an alternate root directory for the filter, pre-filter, and other " +"support file checks." +msgstr "" +"Définir un autre répertoire racine pour les filtres, pré-filtres et autres " +"fichiers de vérification." + +# type: TP +#: cupstestppd.man:49 +#, no-wrap +msgid "-W constraints" +msgstr "B<-W> I<constraints>" + +# type: Plain text +#: cupstestppd.man:53 +msgid "Report all UIConstraint errors as warnings." +msgstr "Remonter toutes les erreurs UIConstraint comme des avertissements." + +# type: TP +#: cupstestppd.man:53 +#, no-wrap +msgid "-W defaults" +msgstr "B<-W> I<defaults>" + +# type: Plain text +#: cupstestppd.man:57 +msgid "" +"Except for size-related options, report all default option errors as " +"warnings." +msgstr "" +"À l'exception des options liées à la taille, remonter toutes les erreurs sur " +"les valeurs par défaut comme des avertissements." + +# type: TP +#: cupstestppd.man:57 +#, no-wrap +msgid "-W filters" +msgstr "B<-W> I<filters>" + +# type: Plain text +#: cupstestppd.man:61 +msgid "Report all filter errors as warnings." +msgstr "Remonter toutes les erreurs sur les filtres comme des avertissements." + +# type: TP +#: cupstestppd.man:61 +#, no-wrap +msgid "-W translations" +msgstr "B<-W> I<translations>" + +# type: Plain text +#: cupstestppd.man:65 +msgid "Report all translation errors as warnings." +msgstr "Remonter toutes les erreurs de conversion comme des avertissements." + +# type: TP +#: cupstestppd.man:65 +#, no-wrap +msgid "-W all" +msgstr "B<-W> I<all>" + +# type: Plain text +#: cupstestppd.man:69 +msgid "Report all of the previous errors as warnings." +msgstr "Remonter toutes les erreurs précédentes comme des avertissements." + +# type: TP +#: cupstestppd.man:69 +#, no-wrap +msgid "-W none" +msgstr "B<-W> I<none>" + +# type: Plain text +#: cupstestppd.man:73 +msgid "Report all of the previous errors as errors." +msgstr "Remonter toutes les erreurs précédentes comme des erreurs." + +# type: TP +#: cupstestppd.man:73 lpr.man:97 +#, no-wrap +msgid "-q" +msgstr "B<-q>" + +# type: Plain text +#: cupstestppd.man:77 +msgid "Specifies that no information should be displayed." +msgstr "N'afficher aucune information." + +# type: TP +#: cupstestppd.man:77 lpr.man:101 lpstat.man:97 +#, no-wrap +msgid "-r" +msgstr "B<-r>" + +# type: Plain text +#: cupstestppd.man:83 +msgid "" +"Relaxes the PPD conformance requirements so that common whitespace, control " +"character, and formatting problems are not treated as hard errors." +msgstr "" +"Réduire les exigences de conformité des PPD de telle sorte que les espaces " +"communes, les caractères de contrôle et les problèmes de format ne soient " +"pas traités comme des erreurs fatales." + +# type: Plain text +#: cupstestppd.man:88 +msgid "" +"Specifies that detailed conformance testing results should be displayed " +"rather than the concise PASS/FAIL/ERROR status." +msgstr "" +"Demander l'affichage des résultats détaillés des tests de conformité au lieu " +"des états concis PASS/FAIL/ERROR." + +# type: TP +#: cupstestppd.man:88 +#, no-wrap +msgid "-vv" +msgstr "B<-vv>" + +# type: Plain text +#: cupstestppd.man:94 +msgid "" +"Specifies that all information in the PPD file should be displayed in " +"addition to the detailed conformance testing results." +msgstr "" +"Afficher toutes les informations d'un fichier PPD en plus des résultats " +"détaillés des tests de conformité." + +# type: Plain text +#: cupstestppd.man:96 +msgid "The I<-q>, I<-v>, and I<-vv> options are mutually exclusive." +msgstr "Les options B<-q>, B<-v> et B<-vv> sont mutuellement exclusives." + +# type: SH +#: cupstestppd.man:96 +#, no-wrap +msgid "EXIT STATUS" +msgstr "CODE DE RETOUR" + +# type: Plain text +#: cupstestppd.man:99 +msgid "" +"I<cupstestppd> returns zero on success and non-zero on error. The error " +"codes are as follows:" +msgstr "" +"B<cupstestppd> renvoie 0 en cas de réussite aux tests et une valeur " +"différente de 0 en cas d'échec. Les codes d'erreur sont les suivants :" + +# type: TP +#: cupstestppd.man:99 +#, no-wrap +msgid "1" +msgstr "1" + +# type: Plain text +#: cupstestppd.man:103 +msgid "Bad command-line arguments or missing PPD filename." +msgstr "" +"Paramètres de la ligne de commandes incorrects ou fichier PPD non trouvé." + +# type: TP +#: cupstestppd.man:103 +#, no-wrap +msgid "2" +msgstr "2" + +# type: Plain text +#: cupstestppd.man:107 +msgid "Unable to open or read PPD file." +msgstr "Impossible d'ouvrir ou de lire le fichier PPD." + +# type: TP +#: cupstestppd.man:107 +#, no-wrap +msgid "3" +msgstr "3" + +# type: Plain text +#: cupstestppd.man:111 +msgid "The PPD file contains format errors that cannot be skipped." +msgstr "" +"Le fichier PPD contient des erreurs de format ne pouvant être ignorées." + +# type: TP +#: cupstestppd.man:111 +#, no-wrap +msgid "4" +msgstr "4" + +# type: Plain text +#: cupstestppd.man:115 +msgid "The PPD file does not conform to the Adobe PPD specification." +msgstr "Le fichier PPD n'est pas conforme à la spécification Adobe." + +# type: Plain text +#: cupstestppd.man:119 +msgid "" +"The following command will test all PPD files under the current directory " +"and print the names of each file that does not conform:" +msgstr "" +"La commande suivante teste tous les fichiers PPD du répertoire courant et " +"affiche le nom de ceux qui ne sont pas conformes :" + +# type: Plain text +#: cupstestppd.man:122 +#, no-wrap +msgid " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" +msgstr " find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; -print\n" + +# type: Plain text +#: cupstestppd.man:127 +msgid "" +"The next command tests all PPD files under the current directory and print " +"detailed conformance testing results for the files that do not conform:" +msgstr "" +"La commande suivante teste tous les fichiers PPD du répertoire courant et " +"affiche les résultats détaillés des tests de conformité pour les fichiers " +"qui ne sont pas conformes :" + +# type: Plain text +#: cupstestppd.man:131 +#, no-wrap +msgid "" +" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" +" -exec cupstestppd -v '{}' \\e;\n" +msgstr "" +" find . -name \\e*.ppd \\e! -exec cupstestppd -q '{}' \\e; \\e\n" +" -exec cupstestppd -v '{}' \\e;\n" + +# type: Plain text +#: cupstestppd.man:135 lpinfo.man:59 +msgid "I<lpadmin(8)>," +msgstr "B<lpadmin>(8)," + +# type: Plain text +#: cupstestppd.man:139 +msgid "" +"Adobe PostScript Printer Description File Format Specification, Version 4.3." +msgstr "" +"Adobe PostScript Printer Description File Format Specification, Version 4.3." + +# type: TP +#: filter.man:15 +#, no-wrap +msgid "filter" +msgstr "filter" + +# type: TH +#: filter.man:15 +#, no-wrap +msgid "6 July 2007" +msgstr "6 juillet 2007" + +# type: Plain text +#: filter.man:18 +msgid "filter - cups file conversion filter interface" +msgstr "" +"filter - Interface pour des filtres de conversion de fichiers pour CUPS." + +# type: Plain text +#: filter.man:23 +msgid "B<filter> job user title num-copies options [ I<filename> ]" +msgstr "B<filter> travail utilisateur titre copies options [ I<fichier> ]" + +# type: Plain text +#: filter.man:28 +msgid "" +"The CUPS filter interface provides a standard method for adding support for " +"new document types to CUPS. Each filter is capable of converting from one or " +"more input formats to another format that can either be printed directly or " +"piped into another filter to get it to a printable format." +msgstr "" +"Les filtres CUPS offrent la possibilité de gérer avec CUPS des nouveaux " +"types de documents. Chaque filtre est capable de convertir des fichiers de " +"différents formats dans un format qui est soit géré directement par CUPS ou " +"qui peut être envoyé à un autre filtre afin d'être imprimable." + +# type: Plain text +#: filter.man:33 +msgid "" +"Filters B<must> be capable of reading from a filename on the command-line or " +"from the standard input, copying the standard input to a temporary file as " +"required by the file format. All output B<must> be sent to the standard " +"output." +msgstr "" +"Les filtres B<doivent> être capables de lire depuis un fichier fournit sur " +"la ligne de commande ou depuis l'entrée standard, en copiant l'entrée " +"standard vers un fichier temporaire si nécessaire pour ce format de fichier. " +"Toutes les sorties B<doivent> être envoyées sur la sortie standard." + +# type: Plain text +#: filter.man:35 +msgid "" +"The command name (argv[0]) is set to the name of the destination printer." +msgstr "" +"Le nom de la commande (argv[0]) vaut le nom de l'imprimante de destination." + +# type: SH +#: filter.man:35 +#, no-wrap +msgid "LOG MESSAGES" +msgstr "MESSAGES JOURNALISÉS" + +# type: Plain text +#: filter.man:39 +msgid "" +"Messages sent to stderr are generally logged to printer-state-message " +"attribute and the current I<ErrorLog>. Each line begins with a standard " +"prefix:" +msgstr "" +"Les messages envoyés à la sortie d'erreur sont généralement enregistrés dans " +"l'attribut printer-state-message et dans le journal I<ErrorLog> actuel. " +"Chaque ligne commence par un préfixe standard :" + +# type: TP +#: filter.man:40 +#, no-wrap +msgid "ALERT: message" +msgstr "ALERT: message" + +# type: Plain text +#: filter.man:45 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"alert\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « alert »." + +# type: TP +#: filter.man:46 +#, no-wrap +msgid "ATTR: attribute=value [attribute=value]" +msgstr "ATTR: attribut=valeur [attribut=valeur]" + +# type: Plain text +#: filter.man:51 +msgid "" +"Sets the named job attribute(s). Typically this will be used to set the job-" +"remote-id attribute." +msgstr "" +"Définir l'attribut (les attributs) donné(s) du travail d'impression. " +"Typiquement, c'est utilisé pour fixer l'attribut job-remote-id." + +# type: TP +#: filter.man:52 +#, no-wrap +msgid "CRIT: message" +msgstr "CRIT: message" + +# type: Plain text +#: filter.man:57 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"critical\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " +"« critical »." + +# type: TP +#: filter.man:58 +#, no-wrap +msgid "DEBUG: message" +msgstr "DEBUG: message" + +# type: Plain text +#: filter.man:63 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"debug\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « debug »." + +# type: TP +#: filter.man:64 +#, no-wrap +msgid "DEBUG2: message" +msgstr "DEBUG2: message" + +# type: Plain text +#: filter.man:69 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"debug2\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " +"« debug2 »." + +# type: TP +#: filter.man:70 +#, no-wrap +msgid "EMERG: message" +msgstr "EMERG: message" + +# type: Plain text +#: filter.man:75 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"emergency\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " +"« emergency »." + +# type: TP +#: filter.man:76 +#, no-wrap +msgid "ERROR: message" +msgstr "ERROR: message" + +# type: Plain text +#: filter.man:81 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"error\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation « error »." + +# type: TP +#: filter.man:82 +#, no-wrap +msgid "INFO: message" +msgstr "INFO: message" + +# type: Plain text +#: filter.man:88 +msgid "" +"Sets the printer-state-message attribute. If the current I<LogLevel> is set " +"to \"debug2\", also adds the specified message to the current I<ErrorLog> " +"using the \"info\" log level." +msgstr "" +"Fixer l'attribut printer-state-message. Si I<LogLevel> vaut « debug2 », le " +"message est également ajouté au journal I<ErrorLog> en utilisant le niveau " +"« info »." + +# type: TP +#: filter.man:89 +#, no-wrap +msgid "NOTICE: message" +msgstr "NOTICE: message" + +# type: Plain text +#: filter.man:94 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"notice\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " +"« notice »." + +# type: TP +#: filter.man:95 +#, no-wrap +msgid "PAGE: page-number #-copies" +msgstr "PAGE: numéro_page #-copies" + +# type: TP +#: filter.man:97 +#, no-wrap +msgid "PAGE: total #-pages" +msgstr "PAGE: total #-pages" + +# type: Plain text +#: filter.man:103 +msgid "" +"Adds an entry to the current I<PageLog>. The first form adds #-copies to the " +"job-media-sheets-completed attribute. The second form sets the job-media-" +"sheets-completed attribute to #-pages." +msgstr "" +"Ajouter une entrée au fichier I<PageLog> actuel. La première forme ajoute le " +"nombre de copies à l'attribut job-media-sheets-completed. La seconde forme " +"définie l'attribut job-media-sheets-completed au nombre de pages." + +# type: TP +#: filter.man:104 +#, no-wrap +msgid "STATE: printer-state-reason [printer-state-reason ...]" +msgstr "STATE: raison-état-impimante [raison-état-impimante ...]" + +# type: TP +#: filter.man:106 +#, no-wrap +msgid "STATE: + printer-state-reason [printer-state-reason ...]" +msgstr "STATE: + raison-état-impimante [raison-état-impimante ...]" + +# type: TP +#: filter.man:108 +#, no-wrap +msgid "STATE: - printer-state-reason [printer-state-reason ...]" +msgstr "STATE: - raison-état-impimante [raison-état-impimante ...]" + +# type: Plain text +#: filter.man:114 +msgid "" +"Sets, adds, or removes printer-state-reason keywords to the current queue. " +"Typically this is used to indicate media, ink, and toner conditions on a " +"printer." +msgstr "" +"Définir, ajouter ou retirer des mots clé raison-état-impimante de la file " +"d'attente en cours. Typiquement c'est utilisé pour indiquer l'état du média, " +"de l'encre et du toner d'une imprimante." + +# type: TP +#: filter.man:115 +#, no-wrap +msgid "WARNING: message" +msgstr "WARNING: message" + +# type: Plain text +#: filter.man:120 +msgid "" +"Sets the printer-state-message attribute and adds the specified message to " +"the current I<ErrorLog> using the \"warning\" log level." +msgstr "" +"Définir l'attribut printer-state-message et ajouter le message donné au " +"journal I<ErrorLog> actuel en utilisant le niveau de journalisation " +"« warning »." + +# type: SH +#: filter.man:121 +#, no-wrap +msgid "ENVIRONMENT VARIABLES" +msgstr "VARIABLES D'ENVIRONNEMENT" + +# type: Plain text +#: filter.man:124 +msgid "" +"The following environment variables are defined by the CUPS server when " +"executing the filter:" +msgstr "" +"Les variables d'environnement suivantes sont définies par le serveur CUPS " +"pour l'exécution des filtres :" + +# type: TP +#: filter.man:125 +#, no-wrap +msgid "CHARSET" +msgstr "CHARSET" + +# type: Plain text +#: filter.man:129 +msgid "The default text character set, typically utf-8." +msgstr "" +"Définir le jeu de caractères par défaut à utiliser pour les textes, " +"typiquement utf-8." + +# type: TP +#: filter.man:130 +#, no-wrap +msgid "CLASS" +msgstr "CLASS" + +# type: Plain text +#: filter.man:136 +msgid "" +"When a job is submitted to a printer class, contains the name of the " +"destination printer class. Otherwise this environment variable will not be " +"set." +msgstr "" +"Quand un travail est soumis à une classe d'imprimantes, elle contient le nom " +"de la classe d'imprimante. Sinon, cette variable d'environnement n'est pas " +"définie." + +# type: TP +#: filter.man:137 +#, no-wrap +msgid "CONTENT_TYPE" +msgstr "CONTENT_TYPE" + +# type: Plain text +#: filter.man:142 +msgid "The MIME type associated with the file (e.g. application/postscript)." +msgstr "Le type MIME associé au fichier (par exemple application/postscript)." + +# type: TP +#: filter.man:143 +#, no-wrap +msgid "CUPS_DATADIR" +msgstr "CUPS_DATADIR" + +# type: Plain text +#: filter.man:147 +msgid "The directory where data files can be found." +msgstr "Le répertoire où se trouvent les fichiers de données." + +# type: TP +#: filter.man:148 +#, no-wrap +msgid "CUPS_SERVERROOT" +msgstr "CUPS_SERVERROOT" + +# type: Plain text +#: filter.man:152 +msgid "The root directory of the server." +msgstr "Le répertoire racine du serveur." + +# type: TP +#: filter.man:153 +#, no-wrap +msgid "DEVICE_URI" +msgstr "DEVICE_URI" + +# type: Plain text +#: filter.man:157 +msgid "The device-uri associated with the printer." +msgstr "L'uri du périphérique associé à l'imprimante." + +# type: TP +#: filter.man:158 +#, no-wrap +msgid "FINAL_CONTENT_TYPE" +msgstr "FINAL_CONTENT_TYPE" + +# type: Plain text +#: filter.man:163 +msgid "" +"The MIME type associated with the printer (e.g. application/vnd.cups-" +"postscript)." +msgstr "" +"Le type MIME associé à l'imprimante (par exemple application/vnd.cups-" +"postscript)." + +# type: TP +#: filter.man:164 +#, no-wrap +msgid "LANG" +msgstr "LANG" + +# type: Plain text +#: filter.man:168 +msgid "The default language locale (typically C or en)." +msgstr "La locale de la langue par défaut (généralement C ou en)." + +# type: TP +#: filter.man:169 +#, no-wrap +msgid "PATH" +msgstr "PATH" + +# type: Plain text +#: filter.man:174 +msgid "" +"The standard execution path for external programs that may be run by the " +"filter." +msgstr "" +"Le chemin d'exécution par défaut pour les programmes externes qui peuvent " +"être exécutés par le filtre." + +# type: TP +#: filter.man:175 +#, no-wrap +msgid "PPD" +msgstr "PPD" + +# type: Plain text +#: filter.man:180 +msgid "" +"The full pathname of the PostScript Printer Description (PPD) file for this " +"printer." +msgstr "" +"Le chemin complet vers le fichier PPD (PostScript Printer Description) de " +"cette imprimante." + +# type: TP +#: filter.man:181 +#, no-wrap +msgid "PRINTER" +msgstr "PRINTER" + +# type: Plain text +#: filter.man:185 +msgid "The name of the printer." +msgstr "Le nom de l'imprimante." + +# type: TP +#: filter.man:186 +#, no-wrap +msgid "RIP_CACHE" +msgstr "RIP_CACHE" + +# type: Plain text +#: filter.man:191 +msgid "" +"The recommended amount of memory to use for Raster Image Processors (RIPs)." +msgstr "" +"La quantité de mémoire recommandée pour les RIP (Raster Image Processors)." + +# type: TP +#: filter.man:192 +#, no-wrap +msgid "SOFTWARE" +msgstr "SOFTWARE" + +# type: Plain text +#: filter.man:196 +msgid "The name and version number of the server (typically CUPS/1.2)." +msgstr "Le nom et la version du serveur (par exemple CUPS/1.2)." + +# type: TP +#: filter.man:197 +#, no-wrap +msgid "TZ" +msgstr "TZ" + +# type: Plain text +#: filter.man:201 +msgid "The timezone of the server." +msgstr "Le fuseau horaire du serveur" + +# type: TP +#: filter.man:202 +#, no-wrap +msgid "USER" +msgstr "USER" + +# type: Plain text +#: filter.man:207 +msgid "" +"The user executing the filter, typically \"lp\" or \"root\"; consult the " +"I<cupsd.conf(5)> file for the current setting." +msgstr "" +"L'utilisateur qui exécute le filtre, typiquement « lp » ou « root » ; " +"consultez le fichier B<cupsd.conf>(5) pour le paramétrage courant." + +# type: Plain text +#: filter.man:213 +msgid "" +"While the filter interface is compatible with System V interface scripts, it " +"will only work with the System V interface script as the only filter. " +"Typically the interface script will be provided via the I<lpadmin(8)> " +"command using the I<-i> option." +msgstr "" +"Alors que l'interface des filtres est compatible avec l'interface des " +"scripts Système V, elle ne fonctionnera avec le script d'interface " +"Système V que comme unique filtre. Typiquement le script d'interface sera " +"fournit par la commande B<lpadmin>(8) en utilisant l'option B<-i>." + +# type: Plain text +#: filter.man:215 +msgid "I<backend(1)>, I<cupsd(8)>," +msgstr "B<backend>(1), B<cupsd>(8)," + +# type: TH +#: lpadmin.man:15 +#, no-wrap +msgid "lpadmin" +msgstr "lpadmin" + +# type: TH +#: lpadmin.man:15 +#, no-wrap +msgid "2 January 2008" +msgstr "2 janvier 2008" + +# type: Plain text +#: lpadmin.man:18 +msgid "lpadmin - configure cups printers and classes" +msgstr "lpadmin - Configurer les imprimantes et classes d'imprimantes CUPS." + +# type: Plain text +#: lpadmin.man:26 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -d I<destination>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -d " +"I<destination>" + +# type: Plain text +#: lpadmin.man:34 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -p I<printer " +"option(s)>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -p " +"I<imprimante option(s)>" + +# type: Plain text +#: lpadmin.man:42 +msgid "" +"B<lpadmin> [ -E ] [-U I<username> ] [ -h I<server[:port]> ] -x I<destination>" +msgstr "" +"B<lpadmin> [ -E ] [-U I<utilisateur> ] [ -h I<serveur[:port]> ] -x " +"I<destination>" + +# type: Plain text +#: lpadmin.man:46 +msgid "" +"I<lpadmin> configures printer and class queues provided by CUPS. It can also " +"be used to set the server default printer or class." +msgstr "" +"B<lpadmin> configure les imprimantes et classes d'imprimantes CUPS. Il est " +"également utilisé pour définir l'imprimante ou classe d'imprimante par " +"défaut." + +# type: Plain text +#: lpadmin.man:50 +msgid "" +"When specified before the I<-d>, I<-p>, or I<-x> options, the I<-E> option " +"forces encryption when connecting to the server." +msgstr "" +"Lorsque l'option B<-E> est spécifiée avant les options B<-d>, B<-p> ou B<-" +"x>, la communication avec le serveur est chiffrée." + +# type: Plain text +#: lpadmin.man:56 +msgid "" +"The first form of the command (I<-d>) sets the default printer or class to " +"I<destination>. Subsequent print jobs submitted via the I<lp(1)> or I<lpr(1)" +"> commands will use this destination unless the user specifies otherwise " +"with the I<lpoptions(1)> command." +msgstr "" +"La première méthode d'utilisation de la commande (avec B<-d>) définit " +"l'imprimante ou la classe par défaut. Les impressions futures demandées par " +"les commandes B<lp>(1) ou B<lpr>(1) utiliseront cette destination sauf avis " +"contraire de l'utilisateur par l'utilisation de la commande B<lpoptions>(1)." + +# type: Plain text +#: lpadmin.man:59 +msgid "" +"The second form of the command (I<-p>) configures the named printer. The " +"additional options are described below." +msgstr "" +"La seconde forme de la commande (avec B<-p>) configure l'imprimante " +"spécifiée. Les options supplémentaires sont décrites plus loin." + +# type: Plain text +#: lpadmin.man:64 +msgid "" +"The third form of the command (I<-x>) deletes the printer or class " +"I<destination>. Any jobs that are pending for the destination will be " +"removed and any job that is currently printed will be aborted." +msgstr "" +"La troisième forme de la commande (avec B<-x>) supprime l'imprimante ou " +"classe I<destination>. Tous les travaux d'impression en attente sur cette " +"destination sont supprimés, et les travaux en cours d'impression sont " +"arrêtés." + +# type: SH +#: lpadmin.man:64 +#, no-wrap +msgid "CONFIGURATION OPTIONS" +msgstr "OPTIONS DE CONFIGURATION" + +# type: Plain text +#: lpadmin.man:67 +msgid "The following options are recognized when configuring a printer queue:" +msgstr "" +"Les options suivantes sont reconnues pour la configuration d'une liste " +"d'attente :" + +# type: TP +#: lpadmin.man:67 +#, no-wrap +msgid "-c class" +msgstr "B<-c> I<classe>" + +# type: Plain text +#: lpadmin.man:72 +msgid "" +"Adds the named I<printer> to I<class>. If I<class> does not exist it is " +"created automatically." +msgstr "" +"Ajouter l'imprimante I<imprimante> à la classe I<classe>. Si la I<classe> " +"n'existe pas encore, elle est créée automatiquement." + +# type: TP +#: lpadmin.man:72 +#, no-wrap +msgid "-i interface" +msgstr "B<-i> I<interface>" + +# type: Plain text +#: lpadmin.man:78 +msgid "" +"Sets a System V style interface script for the printer. This option cannot " +"be specified with the I<-P> option (PPD file) and is intended for providing " +"support for legacy printer drivers." +msgstr "" +"Créer un script d'interface System V pour l'imprimante. Cette option ne peut " +"être utilisée en même temps que l'option B<-P> (fichier PPD) et est destinée " +"au support des imprimantes de base." + +# type: TP +#: lpadmin.man:78 +#, no-wrap +msgid "-m model" +msgstr "B<-m> I<modèle>" + +# type: Plain text +#: lpadmin.man:83 +msgid "" +"Sets a standard System V interface script or PPD file from the I<model> " +"directory." +msgstr "" +"Définir un script d'interface System V ou un fichier PPD du répertoire " +"I<modèle>." + +# type: TP +#: lpadmin.man:83 +#, no-wrap +msgid "-o job-k-limit=value" +msgstr "B<-o> B<job-k-limit>=I<valeur>" + +# type: Plain text +#: lpadmin.man:88 +msgid "" +"Sets the kilobyte limit for per-user quotas. The value is an integer number " +"of kilobytes; one kilobyte is 1024 bytes." +msgstr "" +"Définir les quotas par utilisateur en kilo-octets. La valeur est un nombre " +"entier de kilo-octets (valant 1 024 octets)." + +# type: TP +#: lpadmin.man:88 +#, no-wrap +msgid "-o job-page-limit=value" +msgstr "B<-o> B<job-page-limit>=I<valeur>" + +# type: Plain text +#: lpadmin.man:94 +msgid "" +"Sets the page limit for per-user quotas. The value is the integer number of " +"pages that can be printed; double-sided pages are counted as two pages." +msgstr "" +"Définir les quotas par utilisateur en nombre de pages. La valeur est un " +"nombre entier de pages pouvant être imprimées. Les recto-verso comptent pour " +"deux pages." + +# type: TP +#: lpadmin.man:94 +#, no-wrap +msgid "-o job-quota-period=value" +msgstr "B<-o> B<job-quota-period>=I<valeur>" + +# type: Plain text +#: lpadmin.man:99 +msgid "" +"Sets the accounting period for per-user quotas. The value is an integer " +"number of seconds; 86,400 seconds are in one day." +msgstr "" +"Définir les quotas par utilisateur en impressions par intervalle de temps. " +"La valeur est un nombre entier définissant le nombre de secondes entre " +"chaque impression. Une journée contient 86 400 secondes." + +# type: TP +#: lpadmin.man:99 +#, no-wrap +msgid "-o job-sheets-default=banner" +msgstr "B<-o> B<job-sheets-default>=I<bannière>" + +# type: TP +#: lpadmin.man:101 +#, no-wrap +msgid "-o job-sheets-default=banner,banner" +msgstr "B<-o> B<job-sheets-default>=I<bannière,bannière>" + +# type: Plain text +#: lpadmin.man:105 +msgid "Sets the default banner page(s) to use for print jobs." +msgstr "" +"Fixer la (les) pages de bannière par défaut pour les travaux d'impression." + +# type: Plain text +#: lpadmin.man:111 +msgid "" +"Sets a PPD option for the printer. PPD options can be listed using the I<-l> " +"option with the I<lpoptions(1)> command." +msgstr "" +"Définir une option PPD pour l'imprimante. La liste des options PPD peut être " +"obtenue en utilisant l'option B<-l> de la commande B<lpoptions>(1)." + +# type: TP +#: lpadmin.man:111 +#, no-wrap +msgid "-o name-default=value" +msgstr "B<-o> B<name-default>=I<valeur>" + +# type: Plain text +#: lpadmin.man:117 +msgid "" +"Sets a default server-side option for the printer. Any print-time option can " +"be defaulted, e.g. \"-o cpi-default=17\" to set the default \"cpi\" option " +"value to 17." +msgstr "" +"Définir au niveau du serveur une option par défaut pour l'imprimante. Toute " +"option pouvant être définie au moment de l'impression peut avoir une valeur " +"par défaut, par exemple \"-o cpi-default=17\" pour définir l'option \"cpi\" " +"par défaut à la valeur 17." + +# type: TP +#: lpadmin.man:117 +#, no-wrap +msgid "-o port-monitor=name" +msgstr "B<-o> B<port-monitor>=I<nom>" + +# type: Plain text +#: lpadmin.man:123 +msgid "" +"Sets the binary communications program to use when printing, \"none\", \"bcp" +"\", or \"tbcp\". The default program is \"none\". The specified port monitor " +"must be listed in the printer's PPD file." +msgstr "" +"Fixer le programme à utiliser pour les communications binaires lors de " +"l'impression : « none », « bcp » ou « tbcp ». Le programme par défaut est " +"« none ». Le moniteur de port indiqué doit être listé dans le fichier PPD de " +"l'imprimante." + +# type: TP +#: lpadmin.man:123 +#, no-wrap +msgid "-o printer-error-policy=name" +msgstr "B<-o> B<printer-error-policy>=I<nom>" + +# type: Plain text +#: lpadmin.man:130 +msgid "" +"Sets the error policy to be used when the printer backend is unable to send " +"the job to the printer. The name must be one of \"abort-job\", \"retry-job\" " +"or \"stop-printer\". The default error policy is \"stop-printer\"." +msgstr "" +"Fixer la politique à utiliser en cas d'erreur quand le dorsal responsable de " +"l'impression n'arrive pas à envoyer le travail à l'imprimante. Le nom doit " +"être soit « abort-job » (annuler l'impression), « retry-job » (réessayer) ou " +"« stop-printer » (arrêter l'imprimante). La politique par défaut en cas " +"d'erreur est « stop-printer »." + +# type: TP +#: lpadmin.man:130 +#, no-wrap +msgid "-o printer-is-shared=true/false" +msgstr "B<-o> B<printer-is-shared>=I<true/false>" + +# type: Plain text +#: lpadmin.man:138 +msgid "" +"Sets the printer to shared/published or unshared/unpublished. Shared/" +"published printers are publically announced by the server on the LAN based " +"on the browsing configuration in B<cupsd.conf>, while unshared/unpublished " +"printers are not announced. The default value is \"true\"." +msgstr "" +"Placer l'imprimante dans l'état partagée/publiée ou non partagée/non " +"publiée. Les imprimantes partagées/publiées sont annoncées publiquement par " +"le serveur sur le réseau local, en fonction de la configuration pour les " +"recherches de I<cupsd.conf>, tandis que les imprimantes non partagées/non " +"publiées ne sont pas annoncées. La valeur par défaut est « true »." + +# type: TP +#: lpadmin.man:138 +#, no-wrap +msgid "-o printer-op-policy=name" +msgstr "B<-o> B<printer-op-policy>=I<nom>" + +# type: Plain text +#: lpadmin.man:144 +msgid "" +"Sets the IPP operation policy associated with the printer. The name must be " +"defined in the B<cupsd.conf> in a Policy section. The default operation " +"policy is \"default\"." +msgstr "" +"Fixer la politique des opérations IPP associée à l'imprimante. Le nom doit " +"être définit dans I<cupsd.conf>, dans une section de type Policy. La " +"politique des opérations est par défaut « default »." + +# type: TP +#: lpadmin.man:144 +#, no-wrap +msgid "-r class" +msgstr "B<-r> I<classe>" + +# type: Plain text +#: lpadmin.man:149 +msgid "" +"Removes the named I<printer> from I<class>. If the resulting class becomes " +"empty it is removed." +msgstr "" +"Supprimer l'I<imprimante> de la I<classe>. Si la classe d'imprimante devient " +"vide, celle-ci est supprimée." + +# type: TP +#: lpadmin.man:149 +#, no-wrap +msgid "-u allow:user,user,@group" +msgstr "B<-u> B<allow>:I<utilisateur,utilisateur,@groupe>" + +# type: TP +#: lpadmin.man:151 +#, no-wrap +msgid "-u deny:user,user,@group" +msgstr "B<-u> B<deny>:I<utilisateur,utilisateur,@groupe>" + +# type: TP +#: lpadmin.man:153 +#, no-wrap +msgid "-u allow:all" +msgstr "B<-u> B<allow>:B<all>" + +# type: TP +#: lpadmin.man:155 +#, no-wrap +msgid "-u deny:none" +msgstr "B<-u> B<deny>:B<none>" + +# type: Plain text +#: lpadmin.man:161 +msgid "" +"Sets user-level access control on a printer. Names starting with \"@\" are " +"interpreted as UNIX groups. The latter two forms turn user-level access " +"control off." +msgstr "" +"Définir les accès par utilisateur sur une imprimante. Les noms commençant " +"par un « @ » sont interprétés comme des groupes UNIX. Les deux dernières " +"expressions suppriment les contrôles d'accès par utilisateur." + +# type: TP +#: lpadmin.man:161 +#, no-wrap +msgid "-v \"device-uri\"" +msgstr "B<-v> I<uri_périphérique>" + +# type: Plain text +#: lpadmin.man:168 +msgid "" +"Sets the I<device-uri> attribute of the printer queue. If I<device-uri> is " +"a filename it is automatically converted to the form I<file:///file/name>. " +"Use the I<lpinfo(8)> command to get a list of supported device URIs and " +"schemes." +msgstr "" +"Définir l'attribut B<device-uri> de la file d'attente de l'imprimante. Si " +"I<uri_périphérique> est un nom de fichier, il est converti automatiquement " +"en la forme B<file:/fichier/nom>. Utilisez la commande B<lpinfo>(8) pour " +"avoir la liste des URI de périphériques gérés et leurs schémas." + +# type: TP +#: lpadmin.man:168 +#, no-wrap +msgid "-D \"info\"" +msgstr "B<-D> I<info>" + +# type: Plain text +#: lpadmin.man:172 +msgid "Provides a textual description of the printer." +msgstr "Définir une description textuelle de l'imprimante." + +# type: Plain text +#: lpadmin.man:177 +msgid "" +"Enables the printer and accepts jobs; this is the same as running the " +"I<accept(8)> and I<cupsenable(8)> programs on the printer." +msgstr "" +"Activer l'imprimante et lui fait accepter les travaux d'impression. Ceci " +"peut également être effectué en lançant les commandes B<accept>(8) et " +"B<cupsenable>(8) avec cette imprimante." + +# type: TP +#: lpadmin.man:177 +#, no-wrap +msgid "-L \"location\"" +msgstr "B<-L> I<emplacement>" + +# type: Plain text +#: lpadmin.man:181 +msgid "Provides a textual location of the printer." +msgstr "Définir l'emplacement de l'imprimante." + +# type: TP +#: lpadmin.man:181 +#, no-wrap +msgid "-P ppd-file" +msgstr "B<-P> I<fichier-ppd>" + +# type: Plain text +#: lpadmin.man:187 +msgid "" +"Specifies a PostScript Printer Description file to use with the printer. If " +"specified, this option overrides the I<-i> option (interface script)." +msgstr "" +"Définir le fichier PPD (Postscript Printer Description) à utiliser avec " +"cette imprimante. Si cette option est spécifiée, elle annule l'option B<-i> " +"(script d'interface)." + +# type: Plain text +#: lpadmin.man:195 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", or \"#\". Also, printer " +"and class names are I<not> case-sensitive. Finally, the CUPS version of " +"I<lpadmin> may ask the user for an access password depending on the printing " +"system configuration. This differs from the System V version which requires " +"the root user to execute this command." +msgstr "" +"Contrairement au système d'impression System V, CUPS permet des noms " +"d'imprimantes contenant tout caractère imprimable sauf ESPACE, TABULATION, " +"w / » ou « # ». De plus, les noms d'imprimante et de classe ne sont I<pas> " +"sensibles à la casse. Enfin, la version CUPS de B<lpadmin> peut demander un " +"mot de passe, suivant la configuration du système, à la différence de la " +"version System V qui demande le mot de passe root lors de l'exécution de " +"cette commande." + +# type: Plain text +#: lpadmin.man:198 +msgid "" +"The CUPS version of I<lpadmin> does not support all of the System V or " +"Solaris printing system configuration options." +msgstr "" +"La version CUPS de B<lpadmin> ne reconnaît pas toutes les options de " +"configuration disponibles dans les versions System V ou Solaris." + +# type: Plain text +#: lpadmin.man:201 +msgid "I<accept(8)>, I<cupsenable(8)>, I<lpinfo(8)>, I<lpoptions(1)>," +msgstr "B<accept>(8), B<cupsenable>(8), B<lpinfo>(8), B<lpoptions>(1)," + +# type: TH +#: lpc.man:15 +#, no-wrap +msgid "lpc" +msgstr "lpc" + +# type: Plain text +#: lpc.man:18 +msgid "lpc - line printer control program" +msgstr "lpc - Programme de contrôle d'imprimantes par ligne." + +# type: Plain text +#: lpc.man:25 +msgid "B<lpc> [ I<command> [ I<parameter(s)> ] ]" +msgstr "B<lpc> [ I<commande> [ I<paramètre(s)> ] ]" + +# type: Plain text +#: lpc.man:29 +msgid "" +"I<lpc> provides limited control over printer and class queues provided by " +"CUPS. It can also be used to query the state of queues." +msgstr "" +"B<lpc> permet de contrôler partiellement des imprimantes et classes " +"d'imprimantes de CUPS. Il est également utilisé pour récupérer l'état des " +"files d'attente." + +# type: Plain text +#: lpc.man:32 +msgid "" +"If no command is specified on the command-line, lpc will display a prompt " +"and accept commands from the standard input." +msgstr "" +"Si aucune commande n'est donnée dans la ligne de commande, lpc affichera une " +"invite et prendra ses commandes depuis l'entrée standard." + +# type: SH +#: lpc.man:32 +#, no-wrap +msgid "COMMANDS" +msgstr "COMMANDES" + +# type: Plain text +#: lpc.man:35 +msgid "" +"The I<lpc> program accepts a subset of commands accepted by the Berkeley " +"I<lpc> program of the same name:" +msgstr "" +"B<lpc> reconnaît un sous-ensemble des commandes reconnues le programme " +"B<lpc> de Berkeley :" + +# type: TP +#: lpc.man:35 +#, no-wrap +msgid "exit" +msgstr "B<exit>" + +# type: Plain text +#: lpc.man:39 lpc.man:49 +msgid "Exits the command interpreter." +msgstr "Quitte l'interpréteur de commandes." + +# type: TP +#: lpc.man:39 +#, no-wrap +msgid "help [command]" +msgstr "B<help> I<[commande]>" + +# type: TP +#: lpc.man:41 +#, no-wrap +msgid "? [command]" +msgstr "B<?> I<[commande]>" + +# type: Plain text +#: lpc.man:45 +msgid "Displays a short help message." +msgstr "Afficher un message d'aide." + +# type: TP +#: lpc.man:45 +#, no-wrap +msgid "quit" +msgstr "B<quit>" + +# type: TP +#: lpc.man:49 +#, no-wrap +msgid "status [queue]" +msgstr "B<status> [I<file-attente>]" + +# type: Plain text +#: lpc.man:53 +msgid "Displays the status of one or more printer or class queues." +msgstr "" +"Afficher l'état des files d'attente d'une ou plusieurs imprimantes ou " +"classes d'imprimantes." + +# type: Plain text +#: lpc.man:59 +msgid "" +"Since I<lpc> is geared towards the Berkeley printing system, it is " +"impossible to use I<lpc> to configure printer or class queues provided by " +"CUPS. To configure printer or class queues you must use the I<lpadmin(8)> " +"command or another CUPS-compatible client with that functionality." +msgstr "" +"Étant donné que B<lpc> est spécifique au système d'impression de Berkeley, " +"il est impossible de l'utiliser pour configurer les files d'attente de CUPS. " +"Pour cela, vous devez utiliser le programme B<lpadmin>(8) ou tout autre " +"client compatible avec CUPS remplissant ces fonctions." + +# type: Plain text +#: lpc.man:62 +msgid "" +"The CUPS version of I<lpc> does not implement all of the standard Berkeley " +"or LPRng commands." +msgstr "" +"La version CUPS de B<lpc> n'implémente pas toutes les commandes des versions " +"Berkeley ou LPRng." + +# type: Plain text +#: lpc.man:65 +msgid "" +"I<accept(8)>, I<cancel(1)>, I<cupsenable(8)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)" +">, I<lpstat(1)>," +msgstr "" +"B<accept>(8), B<cancel>(1), B<cupsenable>(8), B<lp>(1), B<lpr>(1), B<lprm>" +"(1), B<lpstat>(1)," + +# type: TH +#: lpinfo.man:15 +#, no-wrap +msgid "lpinfo" +msgstr "lpinfo" + +# type: Plain text +#: lpinfo.man:18 +msgid "lpinfo - show available devices or drivers" +msgstr "lpinfo - Afficher les périphériques et pilotes disponibles." + +# type: Plain text +#: lpinfo.man:25 +msgid "B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] -m" +msgstr "" +"B<lpinfo> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] -m" + +# type: Plain text +#: lpinfo.man:32 +msgid "B<lpinfo> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -l ] -v" +msgstr "" +"B<lpinfo> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] -v" + +# type: Plain text +#: lpinfo.man:37 +msgid "" +"I<lpinfo> lists the available devices or drivers known to the CUPS server. " +"The first form (I<-m>) lists the available drivers, while the second form " +"(I<-v>) lists the available devices." +msgstr "" +"B<lpinfo> affiche la liste des périphériques ou pilotes connus par le " +"serveur CUPS. La première forme (avec B<-m>) liste les pilotes disponibles, " +"et la seconde forme (avec B<-v>) liste les périphériques disponibles." + +# type: Plain text +#: lpinfo.man:39 +msgid "I<lpinfo> accepts the following options:" +msgstr "B<lpinfo> gère les options suivantes :" + +# type: Plain text +#: lpinfo.man:47 +msgid "Sets the username to use when connecting to the server." +msgstr "Indiquer l'utilisateur utilisé pour se connecter au serveur." + +# type: Plain text +#: lpinfo.man:51 +msgid "Selects an alternate server." +msgstr "Sélectionner un autre serveur." + +# type: Plain text +#: lpinfo.man:55 +msgid "Shows a \"long\" listing of devices or drivers." +msgstr "Afficher une liste « longue » des périphériques ou pilotes." + +# type: Plain text +#: lpinfo.man:57 +msgid "The I<lpinfo> command is unique to CUPS." +msgstr "La commande B<lpinfo> est spécifique à CUPS." + +# type: TH +#: lp.man:15 +#, no-wrap +msgid "lp" +msgstr "lp" + +# type: TH +#: lp.man:15 lpstat.man:15 +#, no-wrap +msgid "23 March 2006" +msgstr "23 mars 2006" + +# type: Plain text +#: lp.man:18 +msgid "lp - print files" +msgstr "lp - Imprimer des fichiers." + +# type: Plain text +#: lp.man:41 +msgid "" +"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -d I<destination[/instance]> ] [ -h " +"I<hostname[:port]> ] [ -m ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -" +"q I<priority> ] [ -s ] [ -t I<title> ] [ -H I<handling> ] [ -P I<page-" +"list> ] [ -- ] [ I<file(s)> ]" +msgstr "" +"B<lp> [ -E ] [ -U I<utilisateur> ] [ -c ] [ -d I<destination[/instance]> ] " +"[ -h I<hostname[:port]> ] [ -m ] [ -n I<copies> ] [ -o I<option[=valeur]> ] " +"[ -q I<priorité> ] [ -s ] [ -t I<titre> ] [ -H I<méthode> ] [ -P " +"I<liste_de_pages> ] [ -- ] [ I<fichier(s)> ]" + +# type: Plain text +#: lp.man:62 +msgid "" +"B<lp> [ -E ] [ -U I<username> ] [ -c ] [ -h I<hostname[:port]> ] [ -i I<job-" +"id> ] [ -n I<num-copies> ] [ -o I<option[=value]> ] [ -q I<priority> ] [ -t " +"I<title> ] [ -H I<handling> ] [ -P I<page-list> ]" +msgstr "" +"B<lp> [ -E ] [ -U I<utilisateur> ] [ -c ] [ -h I<serveur[:port]> ] [ -i " +"I<id_travail> ] [ -n I<copies> ] [ -o I<option[=valeur]> ] [ -q " +"I<priorité> ] [ -t I<titre> ] [ -H I<méthode> ] [ -P I<liste_de_pages> ]" + +# type: Plain text +#: lp.man:65 +msgid "" +"I<lp> submits files for printing or alters a pending job. Use a filename of " +"\"-\" to force printing from the standard input." +msgstr "" +"B<lp> demande l'impression d'un fichier ou modifie un travail d'impression " +"en attente. Utiliser « - » comme fichier pour forcer l'impression à partir de " +"l'entrée standard." + +# type: Plain text +#: lp.man:67 +msgid "The following options are recognized by I<lp>:" +msgstr "Les options suivantes sont reconnues par B<lp> :" + +# type: TP +#: lp.man:67 +#, no-wrap +msgid "--" +msgstr "B<-->" + +# type: Plain text +#: lp.man:72 +msgid "" +"Marks the end of options; use this to print a file whose name begins with a " +"dash (-)." +msgstr "" +"Marquer la fin des options ; utilisez ceci pour imprimer un fichier dont le " +"nom commence par un tiret (« - »)." + +# type: Plain text +#: lp.man:88 +msgid "" +"This option is provided for backwards-compatibility only. On systems that " +"support it, this option forces the print file to be copied to the spool " +"directory before printing. In CUPS, print files are always sent to the " +"scheduler via IPP which has the same effect." +msgstr "" +"Cette option n'est fournie que pour des raisons de compatibilité avec les " +"précédentes versions. Sur les systèmes le permettant, elle force la copie du " +"fichier d'impression dans le répertoire spool avant impression. Avec CUPS, " +"les fichiers d'impression sont envoyés à l'ordonnanceur via IPP. Le résultat " +"est le même dans les deux cas." + +# type: TP +#: lp.man:88 +#, no-wrap +msgid "-d destination" +msgstr "B<-d> I<destination>" + +# type: Plain text +#: lp.man:92 lpr.man:63 +msgid "Prints files to the named printer." +msgstr "Imprimer les fichiers sur l'imprimante donnée." + +# type: TP +#: lp.man:96 +#, no-wrap +msgid "-i job-id" +msgstr "B<-i> I<id_travail>" + +# type: Plain text +#: lp.man:100 +msgid "Specifies an existing job to modify." +msgstr "Indiquer l'identifiant du travail d'impression à modifier." + +# type: TP +#: lp.man:100 lpr.man:82 +#, no-wrap +msgid "-m" +msgstr "B<-m>" + +# type: Plain text +#: lp.man:104 +msgid "Sends an email when the job is completed." +msgstr "Envoyer un courrier électronique lorsque l'impression est terminée." + +# type: Plain text +#: lp.man:108 lpr.man:71 +msgid "Sets the number of copies to print from 1 to 100." +msgstr "Nombre de copies à effectuer (de 1 à 100)." + +# type: TP +#: lp.man:108 +#, no-wrap +msgid "-o \"name=value [name=value ...]\"" +msgstr "B<-o> I<nom=valeur [nom=valeur ...]>" + +# type: Plain text +#: lp.man:112 +msgid "Sets one or more job options." +msgstr "Définir une ou plusieurs options pour le travail d'impression." + +# type: TP +#: lp.man:112 +#, no-wrap +msgid "-q priority" +msgstr "B<-q> I<priorité>" + +# type: Plain text +#: lp.man:117 +msgid "" +"Sets the job priority from 1 (lowest) to 100 (highest). The default priority " +"is 50." +msgstr "" +"Définir la priorité du travail d'impression, de 1 (minimale) à 100 " +"(maximale). La priorité par défaut est 50." + +# type: TP +#: lp.man:117 lpstat.man:101 +#, no-wrap +msgid "-s" +msgstr "B<-s>" + +# type: Plain text +#: lp.man:121 +msgid "Do not report the resulting job IDs (silent mode.)" +msgstr "Ne pas afficher le numéro du travail (mode silencieux)." + +# type: TP +#: lp.man:121 +#, no-wrap +msgid "-t \"name\"" +msgstr "B<-t> I<nom>" + +# type: Plain text +#: lp.man:125 lpr.man:59 +msgid "Sets the job name." +msgstr "Définir le I<nom> du travail." + +# type: Plain text +#: lp.man:129 +msgid "Submits jobs as I<username>." +msgstr "Envoyer les travaux d'impression en tant que I<utilisateur>." + +# type: TP +#: lp.man:129 +#, no-wrap +msgid "-H hh:mm" +msgstr "B<-H> I<hh:mm>" + +# type: TP +#: lp.man:131 +#, no-wrap +msgid "-H hold" +msgstr "B<-H hold>" + +# type: TP +#: lp.man:133 +#, no-wrap +msgid "-H immediate" +msgstr "B<-H immediate>" + +# type: TP +#: lp.man:135 +#, no-wrap +msgid "-H restart" +msgstr "B<-H restart>" + +# type: TP +#: lp.man:137 +#, no-wrap +msgid "-H resume" +msgstr "B<-H resume>" + +# type: Plain text +#: lp.man:147 +msgid "" +"Specifies when the job should be printed. A value of I<immediate> will print " +"the file immediately, a value of I<hold> will hold the job indefinitely, and " +"a time value (HH:MM) will hold the job until the specified time. Use a value " +"of I<resume> with the I<-i> option to resume a held job. Use a value of " +"I<restart> with the I<-i> option to restart a completed job." +msgstr "" +"Définir quand l'impression doit être effectuée. La valeur B<immediate> " +"effectue l'impression immédiatement, la valeur B<hold> suspend l'impression " +"indéfiniment, une heure suspend l'impression jusqu'à l'heure donnée. " +"Utilisez la valeur B<resume> avec l'option B<-i> pour reprendre un travail " +"suspendu. Utilisez la valeur B<restart> avec l'option B<-i> pour relancer un " +"travail terminé." + +# type: TP +#: lp.man:147 +#, no-wrap +msgid "-P page-list" +msgstr "B<-P> I<liste-de-pages>" + +# type: Plain text +#: lp.man:153 +msgid "" +"Specifies which pages to print in the document. The list can contain a list " +"of numbers and ranges (#-#) separated by commas (e.g. 1,3-5,16)." +msgstr "" +"Définir quelles sont les pages à imprimer. Cette liste ne peut contenir que " +"des numéros ou des portions (#-#), séparés par des virgules (par exemple : " +"1,3-5,16)." + +# type: SH +#: lp.man:153 +#, no-wrap +msgid "COMMON JOB OPTIONS" +msgstr "OPTIONS COMMUNES DES TRAVAUX" + +# type: Plain text +#: lp.man:157 +msgid "" +"Aside from the printer-specific options reported by the I<lpoptions(1)> " +"command, the following generic options are available:" +msgstr "" +"En plus des options spécifiques des imprimantes, indiquées par B<lpoptions>" +"(1), les options génériques suivantes sont disponibles :" + +# type: TP +#: lp.man:157 +#, no-wrap +msgid "-o media=size" +msgstr "B<-o> B<media>=I<taille>" + +# type: Plain text +#: lp.man:162 +msgid "" +"Sets the page size to I<size>. Most printers support at least the size names " +"\"a4\", \"letter\", and \"legal\"." +msgstr "" +"Fixer la taille du papier à I<taille>. La plupart des imprimantes gèrent au " +"moins les tailles appelées « a4 », « letter » et « legal »." + +# type: TP +#: lp.man:162 +#, no-wrap +msgid "-o landscape" +msgstr "B<-o landscape>" + +# type: TP +#: lp.man:164 +#, no-wrap +msgid "-o orientation-requested=4" +msgstr "B<-o orientation-requested>=I<4>" + +# type: Plain text +#: lp.man:168 +msgid "Prints the job in landscape (rotated 90 degrees)." +msgstr "Imprimer en mode paysage (rotation de 90 degrés)." + +# type: TP +#: lp.man:168 +#, no-wrap +msgid "-o sides=one-sided" +msgstr "B<-o sides>=B<one-sided>" + +# type: TP +#: lp.man:170 +#, no-wrap +msgid "-o sides=two-sided-long-edge" +msgstr "B<-o sides>=B<two-sided-long-edge>" + +# type: TP +#: lp.man:172 +#, no-wrap +msgid "-o sides=two-sided-short-edge" +msgstr "B<-o sides>=B<two-sided-short-edge>" + +# type: Plain text +#: lp.man:179 +msgid "" +"Prints on one or two sides of the paper. The value \"two-sided-long-edge\" " +"is normally used when printing portrait (unrotated) pages, while \"two-sided-" +"short-edge\" is used for landscape pages." +msgstr "" +"Imprimer sur une face ou en recto-verso. La valeur « B<two-sided-long-" +"edge> » (double faces, côté long) est normalement utilisée pour l'impression " +"en mode portrait (pas de rotation), et « B<two-sided-short-edge> » (double " +"faces, petit côté) pour l'impression de pages en mode paysage." + +# type: TP +#: lp.man:179 +#, no-wrap +msgid "-o fitplot" +msgstr "B<-o fitplot>" + +# type: Plain text +#: lp.man:183 +msgid "Scales the print file to fit on the page." +msgstr "Mettre le fichier à l'échelle pour qu'il prenne la taille de la page." + +# type: TP +#: lp.man:183 +#, no-wrap +msgid "-o scaling=number" +msgstr "B<-o scaling>=I<nombre>" + +# type: Plain text +#: lp.man:189 +msgid "" +"Scales image files to use up to I<number> percent of the page. Values " +"greater than 100 cause the image file to be printed across multiple pages." +msgstr "" +"Mettre les fichiers image à l'échelle de telle sorte qu'il utilise jusqu'à " +"I<nombre> pourcents de la page. Les valeurs supérieures à 100 forceront " +"l'impression des images sur plusieurs pages." + +# type: TP +#: lp.man:189 +#, no-wrap +msgid "-o cpi=N" +msgstr "B<-o cpi>=I<N>" + +# type: Plain text +#: lp.man:194 +msgid "" +"Sets the number of characters per inch to use when printing a text file. The " +"default is 10." +msgstr "" +"Fixer le nombre de caractères par pouces à utiliser pour l'impression de " +"fichiers texte. La valeur par défaut est 10." + +# type: TP +#: lp.man:194 +#, no-wrap +msgid "-o lpi=N" +msgstr "B<-o lpi>=I<N>" + +# type: Plain text +#: lp.man:199 +msgid "" +"Sets the number of lines per inch to use when printing a text file. The " +"default is 6." +msgstr "" +"Fixer le nombre de lignes par pouces à utiliser pour l'impression de " +"fichiers texte. La valeur par défaut est 6." + +# type: TP +#: lp.man:199 +#, no-wrap +msgid "-o page-bottom=N" +msgstr "B<-o page-bottom>=I<N>" + +# type: TP +#: lp.man:201 +#, no-wrap +msgid "-o page-left=N" +msgstr "B<-o page-left>=I<N>" + +# type: TP +#: lp.man:203 +#, no-wrap +msgid "-o page-right=N" +msgstr "B<-o page-right>=I<N>" + +# type: TP +#: lp.man:205 +#, no-wrap +msgid "-o page-top=N" +msgstr "B<-o page-top>=I<N>" + +# type: Plain text +#: lp.man:210 +msgid "" +"Sets the page margins when printing text files. The values are in points - " +"there are 72 points to the inch." +msgstr "" +"Fixer les marges des pages pour l'impression de fichiers texte. Les valeurs " +"sont exprimées en points ; il y a 72 points par pouces." + +# type: Plain text +#: lp.man:212 +msgid "Print a double-sided legal document to a printer called \"foo\":" +msgstr "Imprimer en recto-verso sur du papier a4 avec l'imprimante « toto »." + +# type: Plain text +#: lp.man:214 +#, no-wrap +msgid " lp -d foo -o media=legal -o sides=two-sided-long-edge filename\n" +msgstr " lp -d toto -o media=a4 -o sides=two-sided-long-edge fichier\n" + +# type: Plain text +#: lp.man:217 +msgid "Print an image across 4 pages:" +msgstr "Imprimer une image sur 4 pages :" + +# type: Plain text +#: lp.man:219 +#, no-wrap +msgid " lp -d bar -o scaling=200 filename\n" +msgstr " lp -d titi -o scaling=200 fichier\n" + +# type: Plain text +#: lp.man:223 +msgid "" +"Print a text file with 12 characters per inch, 8 lines per inch, and a 1 " +"inch left margin:" +msgstr "" +"Imprimer un fichier texte avec 12 caractères par pouces, 8 lignes par pouces " +"et une marge de gauche de 1 pouce :" + +# type: Plain text +#: lp.man:225 +#, no-wrap +msgid " lp -d bar -o cpi=12 -o lpi=8 -o page-left=72 filename\n" +msgstr " lp -d titi -o cpi=12 -o lpi=8 -o page-left=72 fichier\n" + +# type: Plain text +#: lp.man:235 +msgid "" +"The \"q\" option accepts a different range of values than the Solaris lp " +"command, matching the IPP job priority values (1-100, 100 is highest " +"priority) instead of the Solaris values (0-39, 0 is highest priority)." +msgstr "" +"L'option « B<-q> » accepte des valeurs différentes de celles utilisées par la " +"commande lp de Solaris (qui utilise les valeurs de 0 à 39, 0 étant la " +"priorité la plus élevée), correspondant aux priorités des travaux IPP (de 1 " +"à 100, 100 étant la priorité la plus élevée)." + +# type: Plain text +#: lp.man:237 +msgid "I<cancel(1)>, I<lpmove(8)>, I<lpoptions(1)>, I<lpstat(1)>," +msgstr "B<cancel>(1), B<lpmove>(8), B<lpoptions>(1), B<lpstat>(1)," + +# type: TH +#: lpmove.man:15 +#, no-wrap +msgid "lpmove" +msgstr "lpmove" + +# type: Plain text +#: lpmove.man:18 +msgid "lpmove - move a job or all jobs to a new destination" +msgstr "" +"lpmove - Déplacer un travail d'impression (ou tous) vers une nouvelle " +"destination." + +# type: Plain text +#: lpmove.man:26 +msgid "" +"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<job " +"destination>" +msgstr "" +"B<lpmove> [ -E ] [ -h I<serveur[:port]> ] [ -U I<utilisateur> ] I<travail " +"destination>" + +# type: Plain text +#: lpmove.man:34 +msgid "" +"B<lpmove> [ -E ] [ -h I<server[:port]> ] [ -U I<username> ] I<source " +"destination>" +msgstr "" +"B<lpmove> [ -E ] [ -h I<serveur[:port]> ] [ -U I<utilisateur> ] I<source " +"destination>" + +# type: Plain text +#: lpmove.man:38 +msgid "" +"B<lpmove> moves the specified I<job> or all jobs from I<source> to " +"I<destination>. I<job> can be the job ID number or the old destination and " +"job ID:" +msgstr "" +"B<lpmove> déplace le I<travail d'impression> ou tous les travaux de " +"I<source> vers I<destination>. On peut spécifier le I<travail> sous deux " +"formes : soit l'identifiant du travail d'impression, soit l'ancienne " +"destination et l'identifiant du travail. Par exemple :" + +# type: Plain text +#: lpmove.man:43 +#, no-wrap +msgid "" +" lpmove 123 newprinter\n" +" lpmove oldprinter-123 newprinter\n" +msgstr "" +" lpmove 123 NouvelleImprimante\n" +" lpmove AncienneImprimante-123 NouvelleImprimante\n" + +# type: Plain text +#: lpmove.man:46 +msgid "The I<lpmove> command supports the following options:" +msgstr "B<lpmove> gère les options suivantes :" + +# type: Plain text +#: lpmove.man:54 lpq.man:51 lpr.man:67 lprm.man:49 lpstat.man:57 +msgid "Specifies an alternate username." +msgstr "Utiliser l'I<utilisateur> donné." + +# type: Plain text +#: lpmove.man:58 lpq.man:59 lpr.man:51 lpstat.man:83 +msgid "Specifies an alternate server." +msgstr "Utiliser le serveur donné." + +# type: Plain text +#: lpmove.man:60 lpstat.man:133 +msgid "I<cancel(1)>, I<lp(1)>," +msgstr "B<cancel>(1), B<lp>(1)," + +# type: TH +#: lpoptions.man.in:15 +#, no-wrap +msgid "lpoptions" +msgstr "lpoptions" + +# type: Plain text +#: lpoptions.man.in:18 +msgid "lpoptions - display or set printer options and defaults" +msgstr "" +"lpoptions - Afficher et définir les options et paramètres par défaut d'une " +"imprimante." + +# type: Plain text +#: lpoptions.man.in:31 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -d " +"I<destination[/instance]> [ -o I<option[=value]> ] ... [ -o I<option[=value]" +"> ]" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] -d " +"I<destination[/instance]> [ -o I<option[=valeur]> ] ... [ -o I<option" +"[=valeur]> ]" + +# type: Plain text +#: lpoptions.man.in:40 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -p " +"I<destination[/instance]> ] -l" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -p " +"I<destination[/instance]> ] -l" + +# type: Plain text +#: lpoptions.man.in:54 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -o I<option" +"[=value]> ] ... [ -o I<option[=value]> ] [ -p I<destination[/instance]> ] -r " +"I<option>" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -o " +"I<option[=value]> ] ... [ -o I<option[=valeur]> ] [ -p I<destination[/" +"instance]> ] -r I<option>" + +# type: Plain text +#: lpoptions.man.in:62 +msgid "" +"B<lpoptions> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] -x " +"I<destination[/instance]>" +msgstr "" +"B<lpoptions> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] -x " +"I<destination[/instance]>" + +# type: Plain text +#: lpoptions.man.in:66 +msgid "" +"I<lpoptions> displays or sets printer options and defaults. I<lpoptions> " +"shows the default printer options when run with no arguments. Other options " +"include:" +msgstr "" +"B<lpoptions> affiche et définit les options et valeurs par défaut d'une " +"imprimante. Lorsqu'il est lancé sans arguments, B<lpoptions> affiche les " +"options. Les otpions pouvant être fournis sont :" + +# type: Plain text +#: lpoptions.man.in:70 +msgid "Enables encryption when communicating with the CUPS server." +msgstr "Activer le chiffrement pour la communication avec le serveur CUPS." + +# type: Plain text +#: lpoptions.man.in:74 +msgid "Uses an alternate username." +msgstr "Utilise un autre utilisateur." + +# type: TP +#: lpoptions.man.in:74 +#, no-wrap +msgid "-d destination[/instance]" +msgstr "B<-d> I<destination[/instance]>" + +# type: Plain text +#: lpoptions.man.in:80 +msgid "" +"Sets the default printer to I<destination>. If I<instance> is supplied then " +"that particular instance is used. This option overrides the system default " +"printer for the current user." +msgstr "" +"Définir I<destination> comme imprimante par défaut. Il est également " +"possible de fournir une I<instance>. Cette option redéfinit l'imprimante par " +"défaut de l'utilisateur en cours." + +# type: Plain text +#: lpoptions.man.in:84 +msgid "Uses an alternate server." +msgstr "Utiliser un autre serveur." + +# type: Plain text +#: lpoptions.man.in:88 +msgid "Lists the printer specific options and their current settings." +msgstr "Affiche les options spécifiques d'une imprimante et leur valeur." + +# type: TP +#: lpoptions.man.in:88 lpr.man:86 +#, no-wrap +msgid "-o option[=value]" +msgstr "B<-o> I<option[=valeur]>" + +# type: Plain text +#: lpoptions.man.in:92 +msgid "Specifies a new option for the named destination." +msgstr "Définir une nouvelle option pour la destination donnée." + +# type: TP +#: lpoptions.man.in:92 +#, no-wrap +msgid "-p destination[/instance]" +msgstr "B<-p> I<destination[/instance]>" + +# type: Plain text +#: lpoptions.man.in:98 +msgid "" +"Sets the destination and instance, if specified, for any options that " +"follow. If the named instance does not exist then it is created." +msgstr "" +"Définir la destination et l'instance, si elle est indiquée. Si l'instance " +"n'existe pas, celle-ci est créée." + +# type: TP +#: lpoptions.man.in:98 +#, no-wrap +msgid "-r option" +msgstr "B<-r> I<option>" + +# type: Plain text +#: lpoptions.man.in:102 +msgid "Removes the specified option for the named destination." +msgstr "Supprimer une option de la destination fournie en paramètre." + +# type: TP +#: lpoptions.man.in:102 +#, no-wrap +msgid "-x destination[/instance]" +msgstr "B<-x> I<destination[/instance]>" + +# type: Plain text +#: lpoptions.man.in:108 +msgid "" +"Removes the options for the named destination and instance, if specified. If " +"the named instance does not exist then this does nothing." +msgstr "" +"Supprimer toutes les options de la destination, et de l'instance si elle est " +"indiquée, fournie en paramètre. Si l'instance n'existe pas, la commande n'a " +"pas d'effet." + +# type: Plain text +#: lpoptions.man.in:112 +msgid "" +"If no options are specified using the I<-o> option, then the current options " +"for the named printer are reported on the standard output." +msgstr "" +"Si aucune option n'est fournie avec l'option B<-o>, les options actuelles de " +"l'imprimante fournie en paramètre sont affichées sur la sortie standard." + +# type: Plain text +#: lpoptions.man.in:115 +msgid "" +"Options set with the I<lpoptions> command are used by the I<lp(1)> and I<lpr" +"(1)> commands when submitting jobs." +msgstr "" +"Les options définies par la commande B<lpoptions> sont utilisées par les " +"commandes B<lp>(1) et B<lpr>(1) lors de l'envoi de travaux d'impression." + +# type: SH +#: lpoptions.man.in:115 +#, no-wrap +msgid "ROOT ACCOUNT OPTIONS" +msgstr "OPTION DU COMPTE ROOT" + +# type: Plain text +#: lpoptions.man.in:119 +msgid "" +"When run by the root user, I<lpoptions> gets and sets default options and " +"instances for I<all users> in the @CUPS_SERVERROOT@/lpoptions file." +msgstr "" +"Lorsque la commande B<lpoptions> est lancée par l'utilisateur root, les " +"options sont lues et sauvegardées pour I<tous les utilisateurs> dans le " +"fichier @CUPS_SERVERROOT@/lpoptions." + +# type: Plain text +#: lpoptions.man.in:121 +msgid "The I<lpoptions> command is unique to CUPS." +msgstr "La commande B<lpoptions> est spécifique à CUPS." + +# type: SH +#: lpoptions.man.in:121 +#, no-wrap +msgid "FILES" +msgstr "FICHIERS" + +# type: Plain text +#: lpoptions.man.in:124 +msgid "" +"~/.cups/lpoptions - user defaults and instances created by non-root users." +msgstr "" +"~/.cups/lpoptions - Fichier des valeurs par défaut et instance de " +"l'utilisateur." + +# type: Plain text +#: lpoptions.man.in:127 +msgid "" +"@CUPS_SERVERROOT@/lpoptions - system-wide defaults and instances created by " +"the root user." +msgstr "" +"@CUPS_SERVERROOT@/lpoptions - Fichier global des instance et valeurs par " +"défaut, créé par l'utilisateur root." + +# type: Plain text +#: lpoptions.man.in:129 +msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>," +msgstr "B<cancel>(1), B<lp>(1), B<lpr>(1)," + +# type: TH +#: lppasswd.man:15 +#, no-wrap +msgid "lppasswd" +msgstr "lppasswd" + +# type: Plain text +#: lppasswd.man:18 +msgid "lppasswd - add, change, or delete digest passwords." +msgstr "lppasswd - Ajouter, modifier ou supprimer des mots de passe." + +# type: Plain text +#: lppasswd.man:23 +msgid "B<lppasswd> [ I<username> ]" +msgstr "B<lppasswd> [ I<utilisateur> ]" + +# type: Plain text +#: lppasswd.man:29 +msgid "B<lppasswd> -a [ -g I<groupname> ] I<username>" +msgstr "B<lppasswd> -a [ -g I<groupe> ] I<utilisateur>" + +# type: Plain text +#: lppasswd.man:33 +msgid "B<lppasswd> -x I<username>" +msgstr "B<lppasswd> -x I<utilisateur>" + +# type: Plain text +#: lppasswd.man:41 +msgid "" +"I<lppasswd> adds, changes, or deletes passwords in the CUPS digest password " +"file, I<passwd.md5>. When run by a normal user, I<lppasswd> will prompt for " +"the old and new passwords. When run by the super-user, I<lppasswd> can add " +"new accounts (I<-a username>), change existing accounts (I<username>), or " +"delete accounts (I<-x username>) in the digest password file. Digest " +"usernames do not have to match local UNIX usernames." +msgstr "" +"B<lppasswd> ajoute, modifie ou supprime des mots de passe du fichier CUPS de " +"hachés de mots de passe, I<passwd.md5>. Lorsque ce programme est lancé par " +"un utlisateur non privilégié, B<lppasswd> demande l'ancien et le nouveau mot " +"de passe. Lorsque ce programme est lancé par un superutilisateur, il peut " +"créer de nouveaux comptes utilisateurs (B<-a> I<utilisateur>), modifier des " +"comptes existants (I<utilisateur>) ou supprimer des comptes (B<-x> " +"I<utilisateur>). Les noms d'utilisateurs ne doivent pas forcément " +"correspondre à des noms d'utilisateurs UNIX." + +# type: Plain text +#: lppasswd.man:43 +msgid "I<lppasswd> supports the following options:" +msgstr "B<lppasswd> gère les options suivantes :" + +# type: TP +#: lppasswd.man:43 +#, no-wrap +msgid "-g groupname" +msgstr "B<-g> I<groupe>" + +# type: Plain text +#: lppasswd.man:47 +msgid "Specifies a group other than the default system group." +msgstr "Définir un groupe autre que le groupe système par défaut." + +# type: SH +#: lppasswd.man:47 +#, no-wrap +msgid "SECURITY ISSUES" +msgstr "PROBLÈMES DE SÉCURITÉ" + +# type: Plain text +#: lppasswd.man:53 +#, fuzzy +#| msgid "" +#| "The I<lppasswd> command is installed setuid to root. While every attempt " +#| "has been made to make it secure against exploits that could grant super-" +#| "user privileges to unprivileged users, paranoid system administrators may " +#| "wish to disable or change the ownership of the program to an unprivileged " +#| "account. " +msgid "" +"The I<lppasswd> command is installed setuid to root. While every attempt has " +"been made to make it secure against exploits that could grant super-user " +"privileges to unprivileged users, paranoid system administrators may wish to " +"disable or change the ownership of the program to an unprivileged account." +msgstr "" +"La commande B<lppasswd> est installée avec le bit setuid activé. Toutes les " +"précautions ont été prises pour empêcher les failles permettant l'accès aux " +"privilèges du super-utilisateur par un utilisateur non privilégié. " +"Cependant, certains administrateurs systèmes paranoïaques peuvent vouloir " +"désactiver ce programme ou en modifier le propriétaire en un utilisateur non " +"privilégié." + +# type: Plain text +#: lppasswd.man:55 +msgid "I<lp(1)>, I<lpr(1)>," +msgstr "B<lp>(1), B<lpr>(1)," + +# type: TH +#: lpq.man:15 +#, no-wrap +msgid "lpq" +msgstr "lpq" + +# type: Plain text +#: lpq.man:18 +msgid "lpq - show printer queue status" +msgstr "lpq - Afficher l'état d'une file d'attente d'impression." + +# type: Plain text +#: lpq.man:29 +msgid "" +"B<lpq> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination[/" +"instance]> ] [ -a ] [ -l ] [ I<+interval> ]" +msgstr "" +"B<lpq> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -P " +"I<destination[/instance]> ] [ -a ] [ -l ] [ I<+intervalle> ]" + +# type: Plain text +#: lpq.man:33 +msgid "" +"I<lpq> shows the current print queue status on the named printer. Jobs " +"queued on the default destination will be shown if no printer or class is " +"specified on the command-line." +msgstr "" +"B<lpq> affiche l'état actuel de la file d'attente d'une imprimante donnée. " +"Si aucune imprimante ou classe d'imprimante n'est donnée dans la ligne de " +"commande, les travaux en attente sur la destination par défaut seront " +"affichés." + +# type: Plain text +#: lpq.man:37 +msgid "" +"The I<+interval> option allows you to continuously report the jobs in the " +"queue until the queue is empty; the list of jobs is shown once every " +"I<interval> seconds." +msgstr "" +"L'option I<+intervalle> permet d'afficher les travaux en attente en continu " +"jusqu'à ce qu'il n'y en ait plus. La liste est réaffichée toutes les " +"I<intervalle> secondes." + +# type: Plain text +#: lpq.man:39 +msgid "I<lpq> supports the following options:" +msgstr "B<lpq> gère les options suivantes :" + +# type: TP +#: lpq.man:43 lpr.man:59 lprm.man:41 +#, no-wrap +msgid "-P destination[/instance]" +msgstr "B<-P> I<destination[/instance]>" + +# type: Plain text +#: lpq.man:47 +msgid "Specifies an alternate printer or class name." +msgstr "Utiliser l'imprimante ou classe d'imprimante donnée." + +# type: Plain text +#: lpq.man:55 +msgid "Reports jobs on all printers." +msgstr "Afficher les travaux de toutes les imprimantes." + +# type: Plain text +#: lpq.man:63 +msgid "Requests a more verbose (long) reporting format." +msgstr "Demander un format de rapport plus bavard." + +# type: Plain text +#: lpq.man:66 +msgid "I<cancel(1)>, I<lp(1)>, I<lpr(1)>, I<lprm(1)>, I<lpstat(1)>," +msgstr "B<cancel>(1), B<lp>(1), B<lpr>(1), B<lprm>(1), B<lpstat>(1)," + +# type: TH +#: lpr.man:15 +#, no-wrap +msgid "lpr" +msgstr "lpr" + +# type: Plain text +#: lpr.man:18 +msgid "lpr - print files" +msgstr "lpr - Imprimer des fichiers." + +# type: Plain text +#: lpr.man:35 +msgid "" +"B<lpr> [ -E ] [ -H I<server[:port]> ] [ -U I<username> ] [ -P I<destination[/" +"instance]> ] [ -# I<num-copies> [ -h ] [ -l ] [ -m ] [ -o I<option[=value]" +"> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<title> ] [ I<file(s)> ]" +msgstr "" +"B<lpr> [ -E ] [ -H I<serveur[:port]> ] [ -U I<utilisateur> ] [ -P " +"I<destination[/instance]> ] [ -# I<copies> [ -h ] [ -l ] [ -m ] [ -o I<option" +"[=valeur]> ] [ -p] [ -q ] [ -r ] [ -C/J/T I<titre> ] [ I<fichier(s)> ]" + +# type: Plain text +#: lpr.man:41 +msgid "" +"I<lpr> submits files for printing. Files named on the command line are sent " +"to the named printer (or the system default destination if no destination is " +"specified). If no files are listed on the command-line, I<lpr> reads the " +"print file from the standard input." +msgstr "" +"B<lpr> demande l'impression de fichiers. Si des fichiers sont donnés dans la " +"ligne de commande, ceux-ci sont envoyés à la destination donnée (ou la " +"destination par défaut si aucune n'est fournie). Si aucun fichier n'est " +"donné dans la ligne de commande, B<lpr> lit le fichier sur l'entrée standard." + +# type: Plain text +#: lpr.man:43 +msgid "The following options are recognized by I<lpr>:" +msgstr "Les options suivantes sont gérées par B<lpr>\\ :" + +# type: TP +#: lpr.man:47 +#, no-wrap +msgid "-H server[:port]" +msgstr "B<-H> I<serveur[:port]>" + +# type: TP +#: lpr.man:51 +#, no-wrap +msgid "-C \"name\"" +msgstr "B<-C> I<nom>" + +# type: TP +#: lpr.man:53 +#, no-wrap +msgid "-J \"name\"" +msgstr "B<-J> I<nom>" + +# type: TP +#: lpr.man:55 +#, no-wrap +msgid "-T \"name\"" +msgstr "B<-T> I<nom>" + +# type: TP +#: lpr.man:67 +#, no-wrap +msgid "-# I<copies>" +msgstr "B<-#> I<copies>" + +# type: Plain text +#: lpr.man:76 +msgid "" +"Disables banner printing. This option is equivalent to \"-o job-sheets=none" +"\"." +msgstr "" +"Désasctiver l'impression de la bannière. Cette option est équivalente à « B<-" +"o job-sheets=none> »." + +# type: Plain text +#: lpr.man:82 +msgid "" +"Specifies that the print file is already formatted for the destination and " +"should be sent without filtering. This option is equivalent to \"-o raw\"." +msgstr "" +"Indiquer que le fichier est déjà formaté pour la destination et qu'aucun " +"filtre n'a besoin d'être appliqué. Cette option est équivalente à « B<-o " +"raw> »." + +# type: Plain text +#: lpr.man:86 +msgid "Send an email on job completion." +msgstr "Envoyer un courier électronique à la fin du travail d'impression." + +# type: Plain text +#: lpr.man:90 +msgid "Sets a job option." +msgstr "Définir une option pour le travail d'impression." + +# type: TP +#: lpr.man:90 +#, no-wrap +msgid "-p" +msgstr "B<-p>" + +# type: Plain text +#: lpr.man:97 +msgid "" +"Specifies that the print file should be formatted with a shaded header with " +"the date, time, job name, and page number. This option is equivalent to \"-o " +"prettyprint\" and is only useful when printing text files." +msgstr "" +"Spécifier que chaque page du fichier à imprimer doit avoir un en-tête ombré " +"contenant la date, l'heure, le nom du travail d'impression et le numéro de " +"page. Cette option est équivalente à « -oprettyprint » et n'est utile que " +"dans le cas de fichiers texte." + +# type: Plain text +#: lpr.man:101 +msgid "Hold job for printing." +msgstr "Suspendre l'impression d'un travail." + +# type: Plain text +#: lpr.man:106 +msgid "" +"Specifies that the named print files should be deleted after printing them." +msgstr "" +"Spécifier que les fichiers indiqués doivent être effacés après impression." + +# type: Plain text +#: lpr.man:109 +msgid "" +"The \"c\", \"d\", \"f\", \"g\", \"i\", \"n\", \"t\", \"v\", and \"w\" " +"options are not supported by CUPS and produce a warning message if used." +msgstr "" +"Les options « B<-c> », « B<-d> », « B<-f> », « B<-g> », « B<-i> », « B<-n> », « B<-" +"t> », « B<-v> » et « B<-w> » ne sont pas gérées par CUPS et donnent un message " +"d'avertissement lorsqu'elles sont utilisées." + +# type: Plain text +#: lpr.man:112 +msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lprm(1)>, I<lpstat(1)>," +msgstr "B<cancel>(1), B<lp>(1), B<lpq>(1), B<lprm>(1), B<lpstat>(1)," + +# type: TH +#: lprm.man:15 +#, no-wrap +msgid "lprm" +msgstr "lprm" + +# type: Plain text +#: lprm.man:18 +msgid "lprm - cancel print jobs" +msgstr "lprm - Annuler des travaux d'impression." + +# type: Plain text +#: lprm.man:29 +msgid "" +"B<lprm> [ -E ] [ -U I<username> ] [ -h I<server[:port]> ] [ -P I<destination" +"[/instance]> ] [ - ] [ I<job ID(s)> ]" +msgstr "" +"B<lprm> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -P " +"I<destination[/instance]> ] [ - ] [ I<identifiant(s) des travaux " +"d'impression> ]" + +# type: Plain text +#: lprm.man:35 +msgid "" +"I<lprm> cancels print jobs that have been queued for printing. If no " +"arguments are supplied, the current job on the default destination is " +"cancelled. You can specify one or more job ID numbers to cancel those jobs " +"or use the I<-> option to cancel all jobs." +msgstr "" +"B<lprm> annule des travaux d'impression en attente. Si aucun paramètre n'est " +"fourni, c'est le travail en cours sur la destination par défaut qui est " +"annulé. Il est possible de fournir un ou plusieurs identifiants de travaux " +"d'impression à annuler ou d'utiliser l'option B<-> pour annuler tous les " +"travaux." + +# type: Plain text +#: lprm.man:37 +msgid "The I<lprm> command supports the following options:" +msgstr "B<lprm> gère les options suivantes :" + +# type: Plain text +#: lprm.man:45 +msgid "Specifies the destination printer or class." +msgstr "Spécifier l'imprimante, ou la classe d'imprimante, de destination." + +# type: Plain text +#: lprm.man:53 +msgid "Specifies and alternate server." +msgstr "Définir un autre serveur." + +# type: Plain text +#: lprm.man:56 +msgid "" +"The CUPS version of I<lprm> is compatible with the standard Berkeley I<lprm> " +"command." +msgstr "" +"La version CUPS de B<lprm> est compatible avec la version standard Berkeley." + +# type: Plain text +#: lprm.man:59 +msgid "I<cancel(1)>, I<lp(1)>, I<lpq(1)>, I<lpr(1)>, I<lpstat(1)>," +msgstr "B<cancel>(1), B<lp>(1), B<lpq>(1), B<lpr>(1), B<lpstat>(1)," + +# type: TH +#: lpstat.man:15 +#, no-wrap +msgid "lpstat" +msgstr "lpstat" + +# type: Plain text +#: lpstat.man:18 +msgid "lpstat - print cups status information" +msgstr "lpstat - Afficher l'état de CUPS." + +# type: Plain text +#: lpstat.man:39 +msgid "" +"B<lpstat> [ -E ] [ -U I<username> ] [ -h I<hostname[:port]> ] [ -l ] [ -W " +"I<which-jobs> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -d ] " +"[ -o [ I<destination(s)> ] ] [ -p [ I<printer(s)> ] ] [ -r ] [ -R ] [ -s ] " +"[ -t ] [ -u [ I<user(s)> ] ] [ -v [ I<printer(s)> ] ]" +msgstr "" +"B<lpstat> [ -E ] [ -U I<utilisateur> ] [ -h I<serveur[:port]> ] [ -l ] [ -W " +"I<travaux> ] [ -a [ I<destination(s)> ] ] [ -c [ I<class(es)> ] ] [ -d ] [ -" +"o [ I<destination(s)> ] ] [ -p [ I<imprimante(s)> ] ] [ -r ] [ -R ] [ -s ] " +"[ -t ] [ -u [ I<utilisateur(s)> ] ] [ -v [ I<imprimante(s)> ] ]" + +# type: Plain text +#: lpstat.man:43 +msgid "" +"I<lpstat> displays status information about the current classes, jobs, and " +"printers. When run with no arguments, I<lpstat> will list jobs queued by the " +"current user." +msgstr "" +"B<lpstat> affiche l'état des classes, travaux et imprimantes. Quand " +"B<lpstat> est lancé sans arguments, la liste des travaux en attente de " +"l'utilisateur est affichée." + +# type: Plain text +#: lpstat.man:45 +msgid "The I<lpstat> command supports the following options:" +msgstr "B<lpstat> gère les options suivantes :" + +# type: TP +#: lpstat.man:49 +#, no-wrap +msgid "-R" +msgstr "B<-R>" + +# type: Plain text +#: lpstat.man:53 +msgid "Shows the ranking of print jobs." +msgstr "Afficher le rang des travaux d'impression." + +# type: TP +#: lpstat.man:57 +#, no-wrap +msgid "-W which-jobs" +msgstr "B<-W> I<travaux>" + +# type: Plain text +#: lpstat.man:65 +msgid "" +"Specifies which jobs to show, I<completed> or I<not-completed> (the " +"default). This option I<must> appear before the I<-o> option and/or any " +"printer names, otherwise the default (not-completed) value will be used in " +"the request to the scheduler." +msgstr "" +"Indiquer quels travaux afficher : B<completed> (les travaux terminés) ou " +"B<not-completed> (les travaux non terminés, par défaut). Cette option " +"I<doit> être précisée avant l'option B<-o> et/ou des noms d'imprimantes, " +"sinon la valeur par défaut (« B<not-completed> ») sera utilisée pour la " +"requête à l'ordonnanceur." + +# type: TP +#: lpstat.man:65 +#, no-wrap +msgid "-a [printer(s)]" +msgstr "B<-a> [I<imprimante(s)>]" + +# type: Plain text +#: lpstat.man:70 +msgid "" +"Shows the accepting state of printer queues. If no printers are specified " +"then all printers are listed." +msgstr "" +"Afficher si les files d'attente des imprimantes acceptent les travaux " +"d'impression. Si aucune imprimante n'est fournie dans la ligne de commande, " +"toutes les imprimantes sont affichées." + +# type: TP +#: lpstat.man:70 +#, no-wrap +msgid "-c [class(es)]" +msgstr "B<-c> [I<classe(s)>]" + +# type: Plain text +#: lpstat.man:75 +msgid "" +"Shows the printer classes and the printers that belong to them. If no " +"classes are specified then all classes are listed." +msgstr "" +"Afficher la classe d'imprimantes et ses imprimantes associées. Si aucune " +"classe n'est fournie dans la ligne de commande, toutes les classes sont " +"affichées." + +# type: TP +#: lpstat.man:75 +#, no-wrap +msgid "-d" +msgstr "B<-d>" + +# type: Plain text +#: lpstat.man:79 +msgid "Shows the current default destination." +msgstr "Affiche la destination par défaut." + +# type: Plain text +#: lpstat.man:87 +msgid "Shows a long listing of printers, classes, or jobs." +msgstr "" +"Afficher une liste détaillée des imprimantes, classes et travaux " +"d'impression." + +# type: TP +#: lpstat.man:87 +#, no-wrap +msgid "-o [destination(s)]" +msgstr "B<-o> [I<destination(s)>]" + +# type: Plain text +#: lpstat.man:92 +msgid "" +"Shows the jobs queue on the specified destinations. If no destinations are " +"specified all jobs are shown." +msgstr "" +"Afficher la file d'attente des travaux des destinations spécifiées. Si " +"aucune destination n'est fournie dans la ligne de commande, tous les travaux " +"sont affichés." + +# type: TP +#: lpstat.man:92 +#, no-wrap +msgid "-p [printer(s)]" +msgstr "B<-p> [I<imprimante(s)>]" + +# type: Plain text +#: lpstat.man:97 +msgid "" +"Shows the printers and whether or not they are enabled for printing. If no " +"printers are specified then all printers are listed." +msgstr "" +"Afficher les imprimantes et indiquer si elles sont prêtes ou non à " +"l'impression. Si aucune imprimante n'est fournie dans la ligne de commande, " +"toutes les imprimantes sont listées." + +# type: Plain text +#: lpstat.man:101 +msgid "Shows whether the CUPS server is running." +msgstr "Afficher si le serveur CUPS est actif." + +# type: Plain text +#: lpstat.man:108 +msgid "" +"Shows a status summary, including the default destination, a list of classes " +"and their member printers, and a list of printers and their associated " +"devices. This is equivalent to using the \"-d\", \"-c\", and \"-v\" options." +msgstr "" +"Afficher un résumé de l'état, comprenant la destination par défaut, la liste " +"des classes et leurs imprimantes associées, la liste des imprimantes et leur " +"périphérique. Ceci est équivalent à utiliser les options « B<-d> », « B<-c> » " +"et « B<-p> »." + +# type: TP +#: lpstat.man:108 +#, no-wrap +msgid "-t" +msgstr "B<-t>" + +# type: Plain text +#: lpstat.man:113 +msgid "" +"Shows all status information. This is equivalent to using the \"-r\", \"-d" +"\", \"-c\", \"-v\", \"-a\", \"-p\", and \"-o\" options." +msgstr "" +"Affiche toutes les informations. Ceci peut être effectué en utilisant les " +"options « B<-r> », « B<-d> », « B<-c> », « B<-d> », « B<-v> », « B<-a> », « B<-p> » " +"et « B<-o> »." + +# type: TP +#: lpstat.man:113 +#, no-wrap +msgid "-u [user(s)]" +msgstr "B<-u> [I<utilisateur(s)>]" + +# type: Plain text +#: lpstat.man:118 +msgid "" +"Shows a list of print jobs queued by the specified users. If no users are " +"specified, lists the jobs queued by the current user." +msgstr "" +"Afficher les travaux d'impression en attente pour un utilisateur. Si aucun " +"utilisateur n'est fourni dans la ligne de commande, afficher les travaux de " +"l'utilisateur qui lance la commande." + +# type: TP +#: lpstat.man:118 +#, no-wrap +msgid "-v [printer(s)]" +msgstr "B<-v> [I<imprimante(s)>]" + +# type: Plain text +#: lpstat.man:123 +msgid "" +"Shows the printers and what device they are attached to. If no printers are " +"specified then all printers are listed." +msgstr "" +"Afficher les imprimantes et à quel matériel elles sont rattachées. Si aucune " +"imprimante n'est fournie sur la ligne de commande, toutes les imprimantes " +"sont affichées." + +# type: Plain text +#: lpstat.man:127 +msgid "" +"Unlike the System V printing system, CUPS allows printer names to contain " +"any printable character except SPACE, TAB, \"/\", and \"#\". Also, printer " +"and class names are I<not> case-sensitive." +msgstr "" +"Contrairement au système d'impression System V, CUPS permet des noms " +"d'imprimantes contenant tout caractère imprimable sauf ESPACE, TABULATION, " +"« / » et « # ». De plus, les noms d'imprimante et de classe d'imprimante ne " +"sont pas sensibles à la casse." + +# type: Plain text +#: lpstat.man:129 +msgid "The \"-h\", \"-E\", \"-U\", and \"-W\" options are unique to CUPS." +msgstr "" +"Les options « B<-h> », « B<-E> », « B<-U> » et « B<-W> » sont spécifiques à CUPS." + +# type: Plain text +#: lpstat.man:131 +msgid "The Solaris \"-f\", \"-P\", and \"-S\" options are silently ignored." +msgstr "Les options « B<-f> », « B<-P> » et « B<-S> » de Solaris sont ignorées." + +# type: TH +#: mailto.conf.man:15 +#, no-wrap +msgid "mailto.conf" +msgstr "mailto.conf" + +# type: TH +#: mailto.conf.man:15 +#, no-wrap +msgid "12 July 2006" +msgstr "12 juillet 2006" + +# type: Plain text +#: mailto.conf.man:18 +msgid "mailto.conf - configuration file for cups email notifier" +msgstr "" +"mailto.conf - Fichier de configuration pour les notifications par courier " +"électronique de CUPS" + +# type: Plain text +#: mailto.conf.man:21 +msgid "" +"The I<mailto.conf> file defines the local mail server and email notification " +"preferences for CUPS." +msgstr "" +"Le fichier I<mailto.conf> configure le serveur de courriers et les " +"notifications par courrier électronique pour CUPS." + +# type: TP +#: mailto.conf.man:25 +#, no-wrap +msgid "Cc I<cc-address@domain.com>" +msgstr "Cc I<adresse_copie@domaine.com>" + +# type: Plain text +#: mailto.conf.man:29 +msgid "Specifies an additional recipient for all email notifications." +msgstr "" +"Spécifier une adresse supplémentaire à laquelle les notifications par " +"courier électronique seront envoyées." + +# type: TP +#: mailto.conf.man:29 +#, no-wrap +msgid "From I<from-address@domain.com>" +msgstr "From I<adresse_émetteur@domaine.com>" + +# type: Plain text +#: mailto.conf.man:33 +msgid "Specifies the sender of email notifications." +msgstr "Spécifier l'émetteur des notifications par courier électronique." + +# type: Plain text +#: mailto.conf.man:33 +#, no-wrap +msgid "Sendmail I<sendmail command and options>" +msgstr "Sendmail I<commande sendmail et options>" + +# type: Plain text +#: mailto.conf.man:40 +msgid "" +"Specifies the sendmail command to use when sending email notifications. Only " +"one I<Sendmail> or I<SMTPServer> line may be present in the I<mailto.conf> " +"file. If multiple lines are present, only the last one is used." +msgstr "" +"Spécifier la commande sendmail à utiliser pour l'envoie des courriers de " +"notifications. Seule une ligne B<Sendmail> ou B<SMTPServer> peut être " +"présente dans le fichier I<mailto.conf>. Si plusieurs lignes sont présentes, " +"seule la dernière est prise en compte." + +# type: TP +#: mailto.conf.man:40 +#, no-wrap +msgid "SMTPServer I<servername>" +msgstr "SMTPServer I<nom_serveur>" + +# type: Plain text +#: mailto.conf.man:47 +msgid "" +"Specifies a SMTP server to send email notifications to. Only one I<Sendmail> " +"or I<SMTPServer> line may be present in the I<mailto.conf> file. If multiple " +"lines are present, only the last one is used." +msgstr "" +"Spécifier le serveur SMTP à utiliser pour l'envoie des courriers de " +"notifications. Seule une ligne B<Sendmail> ou B<SMTPServer> peut être " +"présente dans le fichier I<mailto.conf>. Si plusieurs lignes sont présentes, " +"seule la dernière est prise en compte." + +# type: TP +#: mailto.conf.man:47 +#, no-wrap +msgid "Subject I<subject-prefix>" +msgstr "Subject I<préfix_sujet>" + +# type: Plain text +#: mailto.conf.man:51 +msgid "" +"Specifies a prefix string for the subject line of an email notification." +msgstr "Utiliser un préfixe dans les sujets des courriers de notification." + +# type: Plain text +#: mailto.conf.man:54 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, I<printers.conf(5)>," +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." +"types>(5), B<printers.conf>(5)," + +# type: TH +#: mime.convs.man:15 +#, no-wrap +msgid "mime.convs" +msgstr "mime.convs" + +# type: Plain text +#: mime.convs.man:18 +msgid "mime.convs - mime type conversion file for cups" +msgstr "mime.convs - Fichier de conversion des types MIME pour CUPS." + +# type: Plain text +#: mime.convs.man:23 +msgid "" +"The I<mime.convs> file defines the filters that are available for converting " +"files from one format to another. The standard filters support text, PDF, " +"PostScript, HP-GL/2, and many types of image files." +msgstr "" +"Le fichier I<mime.convs> définit les filtres disponibles pour convertir des " +"fichiers d'un format vers un autre. Les filtres standards concernent les " +"fichiers textes, PDF, PostScript, HP-GL/2 ainsi que de nombreux formats " +"graphiques." + +# type: Plain text +#: mime.convs.man:26 +msgid "" +"Additional filters can be added to the I<mime.convs> file or (preferably) to " +"other files in the CUPS configuration directory." +msgstr "" +"Des filtres supplémentaires peuvent être ajoutés dans le fichier I<mime." +"convs> ou (de préférence) dans d'autres fichiers du répertoire de " +"configuration de CUPS." + +# type: Plain text +#: mime.convs.man:31 +msgid "" +"Each line in the I<mime.convs> file is a comment, blank, or filter line. " +"Comment lines start with the # character. Filter lines specify the source " +"and destination MIME types along with a relative cost associated with the " +"filter and the filter to run:" +msgstr "" +"Chaque ligne du fichier I<mime.convs> est un commentaire, une ligne vide ou " +"une définition de filtre. Les commentaires commencent par le caractère #. " +"Les lignes contenant un filtre spécifient les types MIME source et cible, le " +"coût du filtre, puis le filtre lui-même :" + +# type: Plain text +#: mime.convs.man:36 +#, no-wrap +msgid "" +"super/type super/type cost filter\n" +"application/postscript application/vnd.cups-raster 50 pstoraster\n" +msgstr "" +"super/type super/type coût filtre\n" +"application/postscript application/vnd.cups-raster 50 pstoraster\n" + +# type: Plain text +#: mime.convs.man:40 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.types(5)>, " +"I<printers.conf(5)>," +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.types>(5), " +"B<printers.conf>(5)," + +# type: TH +#: mime.types.man:15 +#, no-wrap +msgid "mime.types" +msgstr "mime.types" + +# type: Plain text +#: mime.types.man:18 +msgid "mime.types - mime type description file for cups" +msgstr "mime.types - Fichier de description des types MIME de CUPS." + +# type: Plain text +#: mime.types.man:20 +msgid "The I<mime.types> file defines the recognized file types." +msgstr "" +"Le fichier I<mime.types> définit les types de fichier reconnus par CUPS." + +# type: Plain text +#: mime.types.man:24 +msgid "" +"Additional file types can be added to I<mime.types> or (preferably) in " +"additional files in the CUPS configuration directory with the extension \"." +"types\"." +msgstr "" +"D'autres types de fichiers peuvent être ajoutés au fichier I<mime.types> ou " +"(de préférence) à d'autres fichier dans le répertoire de configuration de " +"CUPS, avec l'extension « .types »." + +# type: Plain text +#: mime.types.man:30 +msgid "" +"Each line in the I<mime.types> file is a comment, blank, or rule line. " +"Comment lines start with the # character. Rule lines start with the MIME " +"type name and are optionally followed by a series of file recognition rules " +"that are used to automatically identify print and web files:" +msgstr "" +"Chaque ligne du fichier I<mime.types> est soit un commentaire, soit une " +"ligne vide, soit une règle. Les lignes définissant une règle commencent par " +"le nom du type MIME et peuvent être suivies par une liste de règles de " +"reconnaissance utilisées pour déterminer automatiquement le type du fichier :" + +# type: Plain text +#: mime.types.man:34 +#, no-wrap +msgid " super/type rule [ ... ruleN]\n" +msgstr " super/type règle [ ... règleN]\n" + +# type: Plain text +#: mime.types.man:38 +msgid "" +"The rules may be grouped using parenthesis, joined using \"+\" for a logical " +"AND and \",\" or whitespace for a logical OR, and negated using \"!\"." +msgstr "" +"Ces règles doivent être mises entre parenthèses, liées par un « + » pour " +"exprimer un ET logique, « , » ou une espace pour exprimer un OU logique. " +"Elles sont précédées de « ! » pour exprimer un NON logique." + +# type: SH +#: mime.types.man:38 +#, no-wrap +msgid "RULES" +msgstr "RÈGLES" + +# type: Plain text +#: mime.types.man:41 +msgid "" +"Rules take two forms - a filename extension by itself and functions with " +"test values inside parenthesis. The following functions are available:" +msgstr "" +"Les règles sont composées de deux parties : une extension de fichier et des " +"fonctions de test entre parenthèses. Les fonctions suivantes peuvent être " +"utilisées :" + +# type: TP +#: mime.types.man:41 +#, no-wrap +msgid "match(\"pattern\")" +msgstr "match(\"motif\")" + +# type: Plain text +#: mime.types.man:45 +msgid "Pattern match on filename" +msgstr "Reconnaissance d'un motif sur le nom du fichier" + +# type: TP +#: mime.types.man:45 +#, no-wrap +msgid "ascii(offset,length)" +msgstr "ascii(début, longueur)" + +# type: Plain text +#: mime.types.man:49 +msgid "True if bytes are valid printable ASCII (CR, NL, TAB, BS, 32-126)" +msgstr "" +"Vrai si tous les octets sont des caractères ASCII valables (CR, NL, TAB, BS, " +"32-126)." + +# type: TP +#: mime.types.man:49 +#, no-wrap +msgid "printable(offset,length)" +msgstr "printable(début, longueur)" + +# type: Plain text +#: mime.types.man:53 +msgid "" +"True if bytes are printable 8-bit chars (CR, NL, TAB, BS, 32-126, 128-254)" +msgstr "" +"Vrai si tous les octets sont des caractères 8 bits imprimables (CR, NL, TAB, " +"BS, 32-126, 128-254)." + +# type: TP +#: mime.types.man:53 +#, no-wrap +msgid "string(offset,\"string\")" +msgstr "string(début, \"chaîne\")" + +# type: Plain text +#: mime.types.man:57 +msgid "True if bytes are identical to string" +msgstr "Vrai si les octets sont identiques à « chaîne »" + +# type: TP +#: mime.types.man:57 +#, no-wrap +msgid "istring(offset,\"string\")" +msgstr "istring(début, \"chaîne\")" + +# type: Plain text +#: mime.types.man:61 +msgid "True if a case-insensitive comparison of the bytes is identical" +msgstr "Vrai si les octets sont identiques, sans prendre en compte la casse." + +# type: TP +#: mime.types.man:61 +#, no-wrap +msgid "char(offset,value)" +msgstr "char(début, valeur)" + +# type: Plain text +#: mime.types.man:65 +msgid "True if byte is identical" +msgstr "Vrai si les octets sont identiques." + +# type: TP +#: mime.types.man:65 +#, no-wrap +msgid "short(offset,value)" +msgstr "short(début, valeur)" + +# type: Plain text +#: mime.types.man:69 +msgid "True if 16-bit integer is identical" +msgstr "Vrai si les nombres entiers (16 bits) sont identiques." + +# type: TP +#: mime.types.man:69 +#, no-wrap +msgid "int(offset,value)" +msgstr "int(début, valeur)" + +# type: Plain text +#: mime.types.man:73 +msgid "True if 32-bit integer is identical" +msgstr "Vrai si les nombres entiers (32 bits) sont identiques." + +# type: TP +#: mime.types.man:73 +#, no-wrap +msgid "locale(\"string\")" +msgstr "locale(\"chaîne\")" + +# type: Plain text +#: mime.types.man:77 +msgid "True if current locale matches string" +msgstr "Vrai si les définitions de langage sont identiques." + +# type: TP +#: mime.types.man:77 +#, no-wrap +msgid "contains(offset,range,\"string\")" +msgstr "contains(début, portée, \"chaîne\")" + +# type: Plain text +#: mime.types.man:81 +msgid "True if the range contains the string" +msgstr "Vrai si la chaîne est trouvée dans la portion précisée." + +# type: SH +#: mime.types.man:81 +#, no-wrap +msgid "STRING CONSTANTS" +msgstr "CHAÎNES DE CARACTÈRES" + +# type: Plain text +#: mime.types.man:85 +msgid "" +"String constants can be specified inside quotes (\"\") for strings " +"containing whitespace and angle brackets (E<lt>E<gt>) for hexadecimal " +"strings." +msgstr "" +"Les chaînes de caractères peuvent être définies entre guillemets (\"\") pour " +"des chaînes contenant des espaces ou entre crochets (E<lt>E<gt>) pour des " +"chaînes en hexadécimal." + +# type: Plain text +#: mime.types.man:88 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, " +"I<printers.conf(5)>," +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), " +"B<printers.conf>(5)," + +# type: TH +#: printers.conf.man:15 +#, no-wrap +msgid "printers.conf" +msgstr "printers.conf" + +# type: Plain text +#: printers.conf.man:18 +msgid "printers.conf - printer configuration file for cups" +msgstr "printers.conf - Fichier de configuration des imprimantes CUPS." + +# type: Plain text +#: printers.conf.man:23 +msgid "" +"The I<printers.conf> file defines the local printers that are available. It " +"is normally located in the I</etc/cups> directory and is generated " +"automatically by the I<cupsd(8)> program when printers are added or deleted." +msgstr "" +"Le fichier I<printers.conf> définit les imprimantes locales disponibles. Il " +"est habituellement situé dans le répertoire I</etc/cups> et est généré " +"automatiquement par le programme B<cupsd>(8) lors de l'ajout ou de la " +"suppression d'imprimantes." + +# type: TP +#: printers.conf.man:27 +#, no-wrap +msgid "E<lt>Printer nameE<gt> ... E<lt>/PrinterE<gt>" +msgstr "E<lt>Printer nomE<gt> ... E<lt>/PrinterE<gt>" + +# type: Plain text +#: printers.conf.man:31 +msgid "Defines a specific printer." +msgstr "Définir une certaine imprimante." + +# type: TP +#: printers.conf.man:31 +#, no-wrap +msgid "E<lt>DefaultPrinter nameE<gt> ... E<lt>/PrinterE<gt>" +msgstr "E<lt>DefaultPrinter nomE<gt> ... E<lt>/PrinterE<gt>" + +# type: Plain text +#: printers.conf.man:35 +msgid "Defines a default printer." +msgstr "Définir une imprimante par défaut." + +# type: TP +#: printers.conf.man:49 +#, no-wrap +msgid "DeviceURI uri" +msgstr "DeviceURI uri" + +# type: Plain text +#: printers.conf.man:53 +msgid "Specifies the device URI for a printer." +msgstr "Spécifier l'URI de périphérique d'une imprimante." + +# type: TP +#: printers.conf.man:85 +#, no-wrap +msgid "PortMonitor monitor" +msgstr "PortMonitor moniteur" + +# type: Plain text +#: printers.conf.man:89 +msgid "Specifies the port monitor for a printer." +msgstr "Spécifier le moniteur de port pour l'imprimante." + +# type: Plain text +#: printers.conf.man:116 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>," +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." +"types>(5)," + +# type: TH +#: subscriptions.conf.man:15 +#, no-wrap +msgid "subscriptions.conf" +msgstr "subscriptions.conf" + +# type: TH +#: subscriptions.conf.man:15 +#, no-wrap +msgid "30 April 2006" +msgstr "30 avril 2006" + +# type: Plain text +#: subscriptions.conf.man:18 +msgid "subscriptions.conf - subscriptions file for cups" +msgstr "subscriptions.conf - Fichier des abonnements pour CUPS" + +# type: Plain text +#: subscriptions.conf.man:23 +msgid "" +"The I<subscriptions.conf> file defines the local subscriptions that are " +"active. It is normally located in the I</etc/cups> directory and is " +"generated automatically by the I<cupsd(8)> program when subscriptions are " +"created, renewed, or cancelled." +msgstr "" +"Le fichier I<subscriptions.conf> définit les abonnements locaux actifs. Il " +"est habituellement situé dans le répertoire I</etc/cups> et est généré " +"automatiquement par le programme B<cupsd>(8) lors de l'ajout, le " +"renouvellement ou l'annulation d'abonnements." + +# type: TP +#: subscriptions.conf.man:27 +#, no-wrap +msgid "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" +msgstr "E<lt>Subscription NNNE<gt> ... E<lt>/SubscriptionE<gt>" + +# type: Plain text +#: subscriptions.conf.man:31 +msgid "Defines a subscription." +msgstr "Définir un abonnement." + +# type: TP +#: subscriptions.conf.man:31 +#, no-wrap +msgid "Events name [ ... name ]" +msgstr "Events nom [ ... nom ]" + +# type: Plain text +#: subscriptions.conf.man:35 +msgid "Specifies the events that are subscribed." +msgstr "Définir les événements auquels on s'abonne." + +# type: TP +#: subscriptions.conf.man:35 +#, no-wrap +msgid "ExpirationTime unix-time" +msgstr "ExpirationTime temps_UNIX" + +# type: Plain text +#: subscriptions.conf.man:40 +msgid "" +"Specifies the expiration time of a subscription as a UNIX time value in " +"seconds since January 1st, 1970." +msgstr "" +"Définir la date d'expiration d'un abonnement. La date est indiquée en " +"utilisant le temps UNIX, c'est-à-dire en exprimée en secondes depuis le 1er " +"janvier 1970." + +# type: TP +#: subscriptions.conf.man:40 +#, no-wrap +msgid "Interval seconds" +msgstr "Interval secondes" + +# type: Plain text +#: subscriptions.conf.man:45 +msgid "" +"Specifies the preferred time interval for event notifications in seconds." +msgstr "Définir l'intervalle voulu entre les notifications, en secondes." + +# type: TP +#: subscriptions.conf.man:45 +#, no-wrap +msgid "JobId job-id" +msgstr "JobId id_travail" + +# type: Plain text +#: subscriptions.conf.man:49 +msgid "Specifies the job ID associated with the subscription." +msgstr "Indiquer l'identifiant de travail associé avec l'abonnement." + +# type: TP +#: subscriptions.conf.man:49 +#, no-wrap +msgid "LeaseDuration seconds" +msgstr "LeaseDuration secondes" + +# type: Plain text +#: subscriptions.conf.man:54 +msgid "" +"Specifies the number of seconds that the subscription is valid for. If 0, " +"the subscription does not expire." +msgstr "" +"Indiquer le nombre de secondes pendants lesquelles l'abonnement sera " +"valable. 0 permet aux abonnement de ne pas expirer." + +# type: TP +#: subscriptions.conf.man:54 +#, no-wrap +msgid "NextEventId number" +msgstr "NextEventId numéro" + +# type: Plain text +#: subscriptions.conf.man:59 +msgid "Specifies the next notify-sequence-number to use for the subscription." +msgstr "Spécifier le prochain numéro de séquence à utiliser pour l'abonnement." + +# type: TP +#: subscriptions.conf.man:59 +#, no-wrap +msgid "NextSubscriptionId number" +msgstr "NextSubscriptionId nombre" + +# type: Plain text +#: subscriptions.conf.man:63 +msgid "Specifies the next subscription-id to use." +msgstr "Indiquer le prochain identifiant d'abonnement à utiliser." + +# type: TP +#: subscriptions.conf.man:63 +#, no-wrap +msgid "Owner username" +msgstr "Owner utilisateur" + +# type: Plain text +#: subscriptions.conf.man:67 +msgid "Specifies the user that owns the subscription." +msgstr "Indiquer le propriétaire de l'abonnement." + +# type: TP +#: subscriptions.conf.man:67 +#, no-wrap +msgid "PrinterName printername" +msgstr "PrinterName imprimante" + +# type: Plain text +#: subscriptions.conf.man:71 +msgid "Specifies the printer or class associated with the subscription." +msgstr "Indiquer l'imprimante ou la classe associée à l'abonnement." + +# type: TP +#: subscriptions.conf.man:71 +#, no-wrap +msgid "Recipient uri" +msgstr "Recipient uri" + +# type: Plain text +#: subscriptions.conf.man:75 +msgid "Specifies the notify-recipient-uri value for push-type notifications." +msgstr "" +"Spécifier l'uri recevant les notifications pour les notifications de type " +"push (envoi)." + +# type: TP +#: subscriptions.conf.man:75 +#, no-wrap +msgid "UserData hex-escaped-data" +msgstr "UserData donnée_hexa_protégées" + +# type: Plain text +#: subscriptions.conf.man:80 +msgid "" +"Specifies user data to be included in event notifications. This is typically " +"the \"from\" address in mailto: notifications." +msgstr "" +"Spécifier des données utilisateur à inclure dans les notifications " +"d'événement. C'est typiquement l'adresse émettrice des mails de " +"notifications." + +# type: Plain text +#: subscriptions.conf.man:83 +msgid "" +"I<classes.conf(5)>, I<cupsd(8)>, I<cupsd.conf(5)>, I<mime.convs(5)>, I<mime." +"types(5)>, printers.conf(5)" +msgstr "" +"B<classes.conf>(5), B<cupsd>(8), B<cupsd.conf>(5), B<mime.convs>(5), B<mime." +"types>(5), B<printers.conf>(5)" + +# type: TH +#~ msgid "11 February 2006" +#~ msgstr "11 février 2006" + +# type: TP +#~ msgid "HostNameLookups Yes" +#~ msgstr "HostNameLookups Yes" + +# type: TP +#~ msgid "HostNameLookups No" +#~ msgstr "HostNameLookups No" + +# type: TH +#~ msgid "Easy Software Products" +#~ msgstr "Easy Software Products" + +# type: Plain text +#~ msgid "Copyright 1997-2006 by Easy Software Products, All Rights Reserved." +#~ msgstr "Copyright 1997-2006 Easy Software Products, Tous droits réservés." + +# type: Plain text +#~ msgid "Copyright 2006 by Easy Software Products, All Rights Reserved." +#~ msgstr "Copyright 2006 Easy Software Products, Tous droits réservés." + +# type: TH +#~ msgid "13 July 2006" +#~ msgstr "13 juillet 2006" + +# #-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-# +# type: TP +# #-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-# +# type: Plain text +# #-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-# +# type: TP +#, fuzzy +#~ msgid "TBD1" +#~ msgstr "" +#~ "#-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "RunAsUser\n" +#~ "#-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "/path/to/cups/daemon est habituellement /usr/lib/cups/daemon ou /usr/" +#~ "libexec/cups/daemon, suivant votre système d'exploitation. Vous pouvez " +#~ "trouver cette information dans le fichier cupsd.conf.\n" +#~ "#-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "-W [I<quels-travaux>]" + +# type: Plain text +#, fuzzy +#~ msgid "TBD2" +#~ msgstr "" +#~ "#-#-#-#-# cupsd.conf.5.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "Définit si l'ordonnanceur doit être lancé en tant qu'utilisateur, dont le " +#~ "nom doit être défini par la directive «\\ User\\ ».\n" +#~ "#-#-#-#-# lpstat.1.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "Définit quels sont les travaux à afficher, terminés («\\ I<completed>\\ ») " +#~ "ou en cours («\\ I<not-completed>\\ »), qui est l'option par défaut. Cette " +#~ "option B<doit> doit se trouver dans la ligne de commandes avant l'option " +#~ "I<-o> et tout nom d'imprimante. Dans le cas contraire, la valeur par " +#~ "défaut («\\ I<not-completed>\\ ») sera envoyée à l'ordonnanceur." + +# type: Plain text +#, fuzzy +#~ msgid "TBD10" +#~ msgstr "" +#~ "#-#-#-#-# cups-lpd.8.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "Dans cet exemple, le format du document est réinitialisé à la valeur " +#~ "I<application/octet-stream>, ce qui force l'auto-détection du type de " +#~ "fichier.\n" +#~ "#-#-#-#-# lpq.1.po (PACKAGE VERSION) #-#-#-#-#\n" +#~ "Pour chaque job soumis (à la suite d'un appel à lpr(1)) B<lpq> affiche le " +#~ "nom de l'utilisateur, le rang actuel dans la file d'attente, le nom des " +#~ "fichiers constituant le job, l'identificateur du job (un nombre qui doit " +#~ "être fourni à lprm(1) pour annuler le job), et la taille totale en " +#~ "octets. L'ordre de classement des jobs dépend de l'algorithme utilisé " +#~ "pour consulter le répertoire de spool, il est supposé que c'est un ordre " +#~ "FIFO (First In First Out). Les noms des fichiers constituant un job " +#~ "peuvent être indisponibles (quand lpr(1) est utilisé comme puits dans un " +#~ "pipeline) auquel cas le fichier est désigné par ``(standard input)''." + +# type: Plain text +#, fuzzy +#~ msgid "TBD11" +#~ msgstr "" +#~ "Si B<lpq> prévient s'il n'y a pas de démon présent (ceci indique un " +#~ "défaut de fonctionnement de la chaîne d'impression), la commande lpc(8) " +#~ "permet de relancer le démon d'impression." diff --git a/man/ppdc.man b/man/ppdc.man new file mode 100644 index 0000000..b613d42 --- /dev/null +++ b/man/ppdc.man @@ -0,0 +1,80 @@ +.\" +.\" "$Id: ppdc.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdc man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdc 1 "CUPS" "10 October 2008" "Apple Inc." +.SH NAME +ppdc \- cups ppd compiler +.SH SYNOPSIS +.B ppdc +[ -D +.I name[=value] +] [ -I +.I include-directory +] [ -c +.I message-catalog +] [ -d +.I output-directory +] [ -l +.I language(s) +] [-m] [-t] [ -v ] [ -z ] [ --cr ] [ --crlf ] [ --lf ] +.I source-file +.SH DESCRIPTION +\fIppdc\fR compiles PPDC source files into one or more PPD +files. +.PP +The \fI-D\fR option sets the named variable for use in the +source file. It is equivalent to using the #define directive +in the source file. +.PP +The \fI-I\fR option specifies an alternate include directory; +multiple \fI-I\fR options can be supplied to add additional +directories. +.PP +The \fI-c\fR option specifies a single message catalog file in GNU +gettext source format (filename.po) to be used for localization. +.PP +The \fI-d\fR option specifies the output directory for PPD +files. The default output directory is "ppd". +.PP +The \fI-l\fR option specifies one or more languages to use when +localizing the PPD file(s). The default language is "en" +(English). Separate multiple languages with commas, for example +"de_DE,en_UK,es_ES,es_MX,es_US,fr_CA,fr_FR,it_IT" will create PPD +files with German, UK English, Spanish (Spain, Mexico, and US), +French (France and Canada), and Italian languages in each file. +.PP +The \fI-m\fR option specifies that the output filename should be +based on the ModelName value instead of FileName or PCFilenName. +.PP +The \fI-t\fR option specifies that PPD files should be tested instead +of generated. +.PP +The \fI-v\fR option provides more verbose output, basically a +running status of which files are being loaded or written. +.PP +The \fI-z\fR option generates compressed PPD files (filename.ppd.gz). +The default is to generate uncompressed PPD files. +.PP +The \fI--cr\fR, \fI--crlf\fR, and \fI--lf\fR options specify the +line ending to use - carriage return, carriage return and line feed, +or line feed. The default is to use the line feed character alone. +.SH SEE ALSO +ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1), ppdcfile(5) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdc.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/ppdcfile.man b/man/ppdcfile.man new file mode 100644 index 0000000..fbd6358 --- /dev/null +++ b/man/ppdcfile.man @@ -0,0 +1,171 @@ +.\" +.\" "$Id: ppdcfile.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdcfile man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdcfile 5 "CUPS" "20 May 2008" "Apple Inc." +.SH NAME +ppdcfile \- cups ppd compiler source file format +.SH DESCRIPTION +The CUPS PPD compiler reads meta files that contain descriptions +of one or more PPD files to be generated by \fIppdc\fR. This man +page provides a quick reference to the supported keywords and +should be used in conjuction with the Common UNIX Printing System +Developers Manual. +.PP +The source file format is plain ASCII text that can be edited +using your favorite text editor. Comments are supported using +the C (/* ... */) and C++ (// ...) comment mechanisms. +.PP +Printer driver information can be grouped and shared using +curley braces ({ ... }); PPD files are written when a close +brace or end-of-file is seen and a PCFileName directive has been +defined. +.PP +Directives may be placed anywhere on a line and are followed by +one or more values. The following is a list of the available +directives and the values they accept: +.TP 5 +\fB#define\fR name value +.TP 5 +\fB#elif\fR {name | value} +.TP 5 +\fB#else\fR +.TP 5 +\fB#endif\fR +.TP 5 +\fB#font\fR name encoding "version" charset status +.TP 5 +\fB#if\fR {name | value} +.TP 5 +\fB#include\fR <filename> +.TP 5 +\fB#include\fR "filename" +.TP 5 +\fB#media\fR name width length +.TP 5 +\fB#media\fR "name/text" width length +.TP 5 +\fB#po\fR locale "filename.po" +.TP 5 +\fBAttribute\fR name "" value +.TP 5 +\fBAttribute\fR name keyword value +.TP 5 +\fBAttribute\fR name "keyword/text" value +.TP 5 +\fBChoice\fR name "code" +.TP 5 +\fBChoice\fR "name/text" "code" +.TP 5 +\fBColorDevice\fR boolean-value +.TP 5 +\fBColorModel\fR name colorspace colororder compression +.TP 5 +\fBColorModel\fR "name/text" colorspace colororder compression +.TP 5 +\fBColorProfile\fR resolution/mediatype gamma density matrix +.TP 5 +\fBCopyright\fR "text" +.TP 5 +\fBCustomMedia\fR name width length left bottom right top "size-code" "region-code" +.TP 5 +\fBCustomMedia\fR "name/text" width length left bottom right top "size-code" "region-code" +.TP 5 +\fBCutter\fR boolean-value +.TP 5 +\fBDarkness\fR temperature name +.TP 5 +\fBDarkness\fR temperature "name/text" +.TP 5 +\fBDriverType\fR type +.TP 5 +\fBDuplex\fR type +.TP 5 +\fBFilter\fR mime-type cost program +.TP 5 +\fBFinishing\fR name +.TP 5 +\fBFinishing\fR "name/text" +.TP 5 +\fBFont\fR * +.TP 5 +\fBFont\fR name encoding "version" charset status +.TP 5 +\fBGroup\fR name +.TP 5 +\fBGroup\fR "name/text" +.TP 5 +\fBHWMargins\fR left bottom right top +.TP 5 +\fBInputSlot\fR position name +.TP 5 +\fBInputSlot\fR position "name/text" +.TP 5 +\fBInstallable\fR name +.TP 5 +\fBInstallable\fR "name/text" +.TP 5 +\fBLocAttribute\fR name "keyword/text" value +.TP 5 +\fBManualCopies\fR boolean-value +.TP 5 +\fBManufacturer\fR "name" +.TP 5 +\fBMaxSize\fR width length +.TP 5 +\fBMediaSize\fR name +.TP 5 +\fBMediaType\fR type name +.TP 5 +\fBMediaType\fR type "name/text" +.TP 5 +\fBMinSize\fR width length +.TP 5 +\fBModelName\fR "name" +.TP 5 +\fBModelNumber\fR number +.TP 5 +\fBOption\fR name type section order +.TP 5 +\fBOption\fR "name/text" type section order +.TP 5 +\fBPCFileName\fR "filename.ppd" +.TP 5 +\fBResolution\fR colorspace bits-per-color row-count row-feed row-step name +.TP 5 +\fBResolution\fR colorspace bits-per-color row-count row-feed row-step "name/text" +.TP 5 +\fBSimpleColorProfile\fR resolution/mediatype density yellow-density red-density gamma red-adjust green-adjust blue-adjust +.TP 5 +\fBThroughput\fR pages-per-minute +.TP 5 +\fBUIConstraints\fR "*Option1 *Option2" +.TP 5 +\fBUIConstraints\fR "*Option1 Choice1 *Option2" +.TP 5 +\fBUIConstraints\fR "*Option1 *Option2 Choice2" +.TP 5 +\fBUIConstraints\fR "*Option1 Choice1 *Option2 Choice2" +.TP 5 +\fBVariablePaperSize\fR boolean-value +.TP 5 +\fBVersion\fR number +.SH SEE ALSO +ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdpo(1) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdcfile.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/ppdhtml.man b/man/ppdhtml.man new file mode 100644 index 0000000..bebf4e1 --- /dev/null +++ b/man/ppdhtml.man @@ -0,0 +1,46 @@ +.\" +.\" "$Id: ppdhtml.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdhtml man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdhtml 1 "CUPS" "10 October 2008" "Apple Inc." +.SH NAME +ppdhtml \- cups html summary generator +.SH SYNOPSIS +.B ppdhtml +[ -D +.I name[=value] +] [ -I +.I include-directory +] +.I source-file +.SH DESCRIPTION +\fIppdhtml\fR reads a driver information file and produces a +HTML summary page that lists all of the drivers in a file and +the supported options. +.PP +The \fI-D\fR option sets the named variable for use in the +source file. It is equivalent to using the #define directive +in the source file. +.PP +The \fI-I\fR option specifies an alternate include directory; +multiple \fI-I\fR options can be supplied to add additional +directories. +.SH SEE ALSO +ppdc(1), ppdcfile(5), ppdi(1), ppdmerge(1), ppdpo(1) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdhtml.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/ppdi.man b/man/ppdi.man new file mode 100644 index 0000000..610d91c --- /dev/null +++ b/man/ppdi.man @@ -0,0 +1,46 @@ +.\" +.\" "$Id: ppdi.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdi man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdi 1 "CUPS" "20 May 2008" "Apple Inc." +.SH NAME +ppdi \- import ppd files +.SH SYNOPSIS +.B ppdi +[ \-I +.I include-directory +] [ \-o +.I source-file +] +.I ppd-file +[ +.I ppd-file2 ... ppd-fileN +] +.SH DESCRIPTION +\fIppdi\fR imports one or more PPD files into a PPD compiler source file. +Multiple languages of the same PPD file are merged into a single printer +definition to facilitate accurate changes for all localizations. +.PP +The \fI-o\fR option specifies the PPD source file to update. If the source +file does not exist, a new source file is created. Otherwise the existing +file is merged with the new PPD file(s) on the command-line. If no source +file is specified, the filename "ppdi.drv" is used. +.SH SEE ALSO +ppdc(1), ppdhtml(1), ppdmerge(1), ppdpo(1), ppdcfile(5) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdi.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/ppdmerge.man b/man/ppdmerge.man new file mode 100644 index 0000000..90fee82 --- /dev/null +++ b/man/ppdmerge.man @@ -0,0 +1,47 @@ +.\" +.\" "$Id: ppdmerge.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdmerge man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdmerge 1 "CUPS" "20 May 2008" "Apple Inc." +.SH NAME +ppdmerge \- merge ppd files +.SH SYNOPSIS +.B ppdmerge +[ \-o +.I output-ppd-file +] +.I ppd-file +.I ppd-file2 +[ +.I ... ppd-fileN +] +.SH DESCRIPTION +\fIppdmerge\fR merges two or more PPD files into a single, multi-language +PPD file. +.PP +The \fI-o\fR option specifies the PPD file to create. If not specified, +the merged PPD file is written to the standard output. If the output file +already exists, the new +.SH NOTES +\fIppdmerge\fR does not check whether the merged PPD files are for the +same device. Merging of different device PPDs will yield unpredictable +results. +.SH SEE ALSO +cupsprofile(1), ppdc(1), ppdhtml(1), ppdi(1), ppdpo(1), ppdcfile(5) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdmerge.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/ppdpo.man b/man/ppdpo.man new file mode 100644 index 0000000..a3f9ac9 --- /dev/null +++ b/man/ppdpo.man @@ -0,0 +1,52 @@ +.\" +.\" "$Id: ppdpo.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" ppdpo man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2007 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH ppdpo 1 "CUPS" "10 October 2008" "Apple Inc." +.SH NAME +ppdpo \- ppd message catalog generator +.SH SYNOPSIS +.B ppdpo +[ -D +.I name[=value] +] [ -I +.I include-directory +] [ -o +.I output-file +] +.I source-file +.SH DESCRIPTION +\fIppdpo\fR extracts UI strings from PPDC source files and updates either +a GNU gettext or Mac OS X strings format message catalog source file for +translation. +.PP +The \fI-D\fR option sets the named variable for use in the +source file. It is equivalent to using the #define directive +in the source file. +.PP +The \fI-I\fR option specifies an alternate include directory; +multiple \fI-I\fR options can be supplied to add additional +directories. +.PP +The \fI-o\fR option specifies the output file. The supported extensions are +".po" or ".po.gz" for GNU gettext format message catalogs and ".strings" for +Mac OS X strings files. +.SH SEE ALSO +ppdc(1), ppdhtml(1), ppdi(1), ppdmerge(1), ppdcfile(5) +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: ppdpo.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/printers.conf.man b/man/printers.conf.man new file mode 100644 index 0000000..abda49b --- /dev/null +++ b/man/printers.conf.man @@ -0,0 +1,124 @@ +.\" +.\" "$Id: printers.conf.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" printers.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 1997-2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH printers.conf 5 "CUPS" "29 April 2009" "Apple Inc." +.SH NAME +printers.conf \- printer configuration file for cups +.SH DESCRIPTION +The \fIprinters.conf\fR file defines the local printers that are +available. It is normally located in the \fI/etc/cups\fR directory and +is generated automatically by the \fIcupsd(8)\fR program when printers +are added or deleted. +.LP +Each line in the file can be a configuration directive, a blank line, +or a comment. Comment lines start with the # character. +.SH DIRECTIVES +.TP 5 +<Printer name> ... </Printer> +.br +Defines a specific printer. +.TP 5 +<DefaultPrinter name> ... </Printer> +.br +Defines a default printer. +.TP 5 +Accepting Yes +.TP 5 +Accepting No +.br +Specifies whether the printer is accepting new jobs. +.TP 5 +AllowUser [ user @group ... ] +.br +Allows specific users and groups to print to the printer. +.TP 5 +DenyUser [ user @group ... ] +.br +Prevents specific users and groups from printing to the printer. +.TP 5 +DeviceURI uri +.br +Specifies the device URI for a printer. +.TP 5 +ErrorPolicy abort-job +.TP 5 +ErrorPolicy retry-current-job +.TP 5 +ErrorPolicy retry-job +.TP 5 +ErrorPolicy stop-printer +.br +Specifies the error policy for the printer. +.TP 5 +Info text +.br +Specifies human-readable text describing the printer. +.TP 5 +JobSheets banner banner +.br +Specifies the banner pages to use for the printer. +.TP 5 +KLimit number +.br +Specifies the job-k-limit value for the printer. +.TP 5 +Location text +.br +Specifies human-readable text describing the location of the printer. +.TP 5 +OpPolicy name +.br +Specifies the operation policy for the printer. +.TP 5 +PageLimit number +.br +Specifies the job-page-limit value for the printer. +.TP 5 +PortMonitor monitor +.br +Specifies the port monitor for a printer. +.TP 5 +QuotaPeriod seconds +.br +Specifies the job-quota-period value for the printer. +.TP 5 +Shared Yes +.TP 5 +Shared No +.br +Specifies whether the printer is shared. +.TP 5 +State idle +.TP 5 +State stopped +.br +Specifies the initial state of the printer (Idle or Stopped) +.TP 5 +StateMessage text +.br +Specifies the message associated with the state. +.TP 5 +StateTime seconds +.br +Specifies the date/time associated with the state. +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +\fImime.convs(5)\fR, \fImime.types(5)\fR, +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: printers.conf.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/man/subscriptions.conf.man b/man/subscriptions.conf.man new file mode 100644 index 0000000..4ff851c --- /dev/null +++ b/man/subscriptions.conf.man @@ -0,0 +1,89 @@ +.\" +.\" "$Id: subscriptions.conf.man 9771 2011-05-12 05:21:56Z mike $" +.\" +.\" subscriptions.conf man page for CUPS. +.\" +.\" Copyright 2007-2011 by Apple Inc. +.\" Copyright 2006 by Easy Software Products. +.\" +.\" These coded instructions, statements, and computer programs are the +.\" property of Apple Inc. and are protected by Federal copyright +.\" law. Distribution and use rights are outlined in the file "LICENSE.txt" +.\" which should have been included with this file. If this file is +.\" file is missing or damaged, see the license at "http://www.cups.org/". +.\" +.TH subscriptions.conf 5 "CUPS" "30 April 2006" "Apple Inc." +.SH NAME +subscriptions.conf \- subscriptions file for cups +.SH DESCRIPTION +The \fIsubscriptions.conf\fR file defines the local subscriptions +that are active. It is normally located in the \fI/etc/cups\fR +directory and is generated automatically by the \fIcupsd(8)\fR +program when subscriptions are created, renewed, or cancelled. +.LP +Each line in the file can be a configuration directive, a blank line, +or a comment. Comment lines start with the # character. +.SH DIRECTIVES +.TP 5 +<Subscription NNN> ... </Subscription> +.br +Defines a subscription. +.TP 5 +Events name [ ... name ] +.br +Specifies the events that are subscribed. +.TP 5 +ExpirationTime unix-time +.br +Specifies the expiration time of a subscription as a UNIX time +value in seconds since January 1st, 1970. +.TP 5 +Interval seconds +.br +Specifies the preferred time interval for event notifications in +seconds. +.TP 5 +JobId job-id +.br +Specifies the job ID associated with the subscription. +.TP 5 +LeaseDuration seconds +.br +Specifies the number of seconds that the subscription is valid +for. If 0, the subscription does not expire. +.TP 5 +NextEventId number +.br +Specifies the next notify-sequence-number to use for the +subscription. +.TP 5 +NextSubscriptionId number +.br +Specifies the next subscription-id to use. +.TP 5 +Owner username +.br +Specifies the user that owns the subscription. +.TP 5 +PrinterName printername +.br +Specifies the printer or class associated with the subscription. +.TP 5 +Recipient uri +.br +Specifies the notify-recipient-uri value for push-type notifications. +.TP 5 +UserData hex-escaped-data +.br +Specifies user data to be included in event notifications. This +is typically the "from" address in mailto: notifications. +.SH SEE ALSO +\fIclasses.conf(5)\fR, \fIcupsd(8)\fR, \fIcupsd.conf(5)\fR, +\fImime.convs(5)\fR, \fImime.types(5)\fR, \fRprinters.conf(5)\fR +.br +http://localhost:631/help +.SH COPYRIGHT +Copyright 2007-2011 by Apple Inc. +.\" +.\" End of "$Id: subscriptions.conf.man 9771 2011-05-12 05:21:56Z mike $". +.\" diff --git a/monitor/Dependencies b/monitor/Dependencies new file mode 100644 index 0000000..451a95a --- /dev/null +++ b/monitor/Dependencies @@ -0,0 +1,18 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +bcp.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +bcp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +bcp.o: ../cups/language.h ../cups/string-private.h ../config.h +bcp.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +bcp.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +bcp.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +bcp.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +bcp.o: ../cups/transcode.h ../cups/thread-private.h +tbcp.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +tbcp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +tbcp.o: ../cups/language.h ../cups/string-private.h ../config.h +tbcp.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +tbcp.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +tbcp.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +tbcp.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +tbcp.o: ../cups/transcode.h ../cups/thread-private.h diff --git a/monitor/Makefile b/monitor/Makefile new file mode 100644 index 0000000..dcb1ed0 --- /dev/null +++ b/monitor/Makefile @@ -0,0 +1,146 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Port monitor makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 2006 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# This file is subject to the Apple OS-Developed Software exception. +# + +include ../Makedefs + +TARGETS = bcp tbcp + +OBJS = bcp.o tbcp.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + $(INSTALL_DIR) -m 755 $(SERVERBIN)/monitor + for file in $(TARGETS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/monitor; \ + done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all targets... +# + +uninstall: + for file in $(TARGETS); do \ + $(RM) $(SERVERBIN)/monitor/$$file; \ + done + -$(RMDIR) $(SERVERBIN)/monitor + -$(RMDIR) $(SERVERBIN) + + +# +# bcp +# + +bcp: bcp.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ bcp.o $(LIBS) + + +# +# tbcp +# + +tbcp: tbcp.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ tbcp.o $(LIBS) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/monitor/bcp.c b/monitor/bcp.c new file mode 100644 index 0000000..e3b59d5 --- /dev/null +++ b/monitor/bcp.c @@ -0,0 +1,292 @@ +/* + * "$Id: bcp.c 9901 2011-08-17 21:01:53Z mike $" + * + * TBCP port monitor for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry... + * psgets() - Get a line from a file. + * pswrite() - Write data from a file. + */ + +/* + * Include necessary headers... + */ + +#include <cups/cups-private.h> +#include <cups/ppd.h> + + +/* + * Local functions... + */ + +static char *psgets(char *buf, size_t *bytes, FILE *fp); +static size_t pswrite(const char *buf, size_t bytes, FILE *fp); + + +/* + * 'main()' - Main entry... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* File to print */ + int copies; /* Number of copies left */ + char line[1024]; /* Line/buffer from stream/file */ + size_t linelen; /* Length of line */ + ppd_file_t *ppd; /* PPD file */ + + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (1); + } + + if (argc == 6) + { + copies = 1; + fp = stdin; + } + else + { + copies = atoi(argv[4]); + fp = fopen(argv[6], "rb"); + + if (!fp) + { + perror(argv[6]); + return (1); + } + } + + /* + * Open the PPD file as needed... + */ + + ppd = ppdOpenFile(getenv("PPD")); + + /* + * Copy the print file to stdout... + */ + + while (copies > 0) + { + copies --; + + if (ppd && ppd->jcl_begin) + fputs(ppd->jcl_begin, stdout); + if (ppd && ppd->jcl_ps) + fputs(ppd->jcl_ps, stdout); + + if (!ppd || ppd->language_level == 1) + { + /* + * Use setsoftwareiomode for BCP mode... + */ + + puts("%!PS-Adobe-3.0 ExitServer"); + puts("%%Title: (BCP - Level 1)"); + puts("%%EndComments"); + puts("%%BeginExitServer: 0"); + puts("serverdict begin 0 exitserver"); + puts("%%EndExitServer"); + puts("statusdict begin"); + puts("/setsoftwareiomode known {100 setsoftwareiomode}"); + puts("end"); + puts("%EOF"); + } + else + { + /* + * Use setdevparams for BCP mode... + */ + + puts("%!PS-Adobe-3.0"); + puts("%%Title: (BCP - Level 2)"); + puts("%%EndComments"); + puts("currentsysparams"); + puts("/CurInputDevice 2 copy known {"); + puts("get"); + puts("<</Protocol /Binary>> setdevparams"); + puts("}{"); + puts("pop pop"); + puts("} ifelse"); + puts("%EOF"); + } + + if (ppd && ppd->jcl_end) + fputs(ppd->jcl_end, stdout); + else if (!ppd || ppd->num_filters == 0) + putchar(0x04); + + /* + * Loop until we see end-of-file... + */ + + do + { + linelen = sizeof(line); + if (psgets(line, &linelen, fp) == NULL) + break; + } + while (pswrite(line, linelen, stdout) > 0); + + fflush(stdout); + } + + return (0); +} + + +/* + * 'psgets()' - Get a line from a file. + * + * Note: + * + * This function differs from the gets() function in that it + * handles any combination of CR, LF, or CR LF to end input + * lines. + */ + +static char * /* O - String or NULL if EOF */ +psgets(char *buf, /* I - Buffer to read into */ + size_t *bytes, /* IO - Length of buffer */ + FILE *fp) /* I - File to read from */ +{ + char *bufptr; /* Pointer into buffer */ + int ch; /* Character from file */ + size_t len; /* Max length of string */ + + + len = *bytes - 1; + bufptr = buf; + ch = EOF; + + while ((bufptr - buf) < len) + { + if ((ch = getc(fp)) == EOF) + break; + + if (ch == '\r') + { + /* + * Got a CR; see if there is a LF as well... + */ + + ch = getc(fp); + + if (ch != EOF && ch != '\n') + { + ungetc(ch, fp); /* Nope, save it for later... */ + ch = '\r'; + } + else + *bufptr++ = '\r'; + break; + } + else if (ch == '\n') + break; + else + *bufptr++ = ch; + } + + /* + * Add a trailing newline if it is there... + */ + + if (ch == '\n' || ch == '\r') + { + if ((bufptr - buf) < len) + *bufptr++ = ch; + else + ungetc(ch, fp); + } + + /* + * Nul-terminate the string and return it (or NULL for EOF). + */ + + *bufptr = '\0'; + *bytes = bufptr - buf; + + if (ch == EOF && bufptr == buf) + return (NULL); + else + return (buf); +} + + +/* + * 'pswrite()' - Write data from a file. + */ + +static size_t /* O - Number of bytes written */ +pswrite(const char *buf, /* I - Buffer to write */ + size_t bytes, /* I - Bytes to write */ + FILE *fp) /* I - File to write to */ +{ + size_t count; /* Remaining bytes */ + + + for (count = bytes; count > 0; count --, buf ++) + switch (*buf) + { + case 0x04 : /* CTRL-D */ + if (bytes == 1) + { + /* + * Don't quote the last CTRL-D... + */ + + putchar(0x04); + break; + } + + case 0x01 : /* CTRL-A */ + case 0x03 : /* CTRL-C */ + case 0x05 : /* CTRL-E */ + case 0x11 : /* CTRL-Q */ + case 0x13 : /* CTRL-S */ + case 0x14 : /* CTRL-T */ + case 0x1c : /* CTRL-\ */ + if (putchar(0x01) < 0) + return (-1); + if (putchar(*buf ^ 0x40) < 0) + return (-1); + break; + + default : + if (putchar(*buf) < 0) + return (-1); + break; + } + + return (bytes); +} + + +/* + * End of "$Id: bcp.c 9901 2011-08-17 21:01:53Z mike $". + */ diff --git a/monitor/tbcp.c b/monitor/tbcp.c new file mode 100644 index 0000000..481121d --- /dev/null +++ b/monitor/tbcp.c @@ -0,0 +1,285 @@ +/* + * "$Id: tbcp.c 9384 2010-11-22 07:06:39Z mike $" + * + * TBCP port monitor for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1993-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry... + * psgets() - Get a line from a file. + * pswrite() - Write data from a file. + */ + +/* + * Include necessary headers... + */ + +#include <cups/cups-private.h> +#include <cups/ppd.h> + + +/* + * Local functions... + */ + +static char *psgets(char *buf, size_t *bytes, FILE *fp); +static size_t pswrite(const char *buf, size_t bytes, FILE *fp); + + +/* + * 'main()' - Main entry... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + FILE *fp; /* File to print */ + int copies; /* Number of copies left */ + char line[1024]; /* Line/buffer from stream/file */ + size_t linelen; /* Length of line */ + + + /* + * Check command-line... + */ + + if (argc < 6 || argc > 7) + { + _cupsLangPrintf(stderr, + _("Usage: %s job-id user title copies options [file]"), + argv[0]); + return (1); + } + + if (argc == 6) + { + copies = 1; + fp = stdin; + } + else + { + copies = atoi(argv[4]); + fp = fopen(argv[6], "rb"); + + if (!fp) + { + perror(argv[6]); + return (1); + } + } + + /* + * Copy the print file to stdout... + */ + + while (copies > 0) + { + copies --; + + /* + * Read the first line... + */ + + linelen = sizeof(line); + if (psgets(line, &linelen, fp) == NULL) + { + fputs("ERROR: Empty print file!\n", stderr); + return (1); + } + + /* + * Handle leading PJL fun... + */ + + if (!strncmp(line, "\033%-12345X", 9) || !strncmp(line, "@PJL ", 5)) + { + /* + * Yup, we have leading PJL fun, so copy it until we hit a line + * with "ENTER LANGUAGE"... + */ + + while (strstr(line, "ENTER LANGUAGE") == NULL) + { + fwrite(line, 1, linelen, stdout); + + linelen = sizeof(line); + if (psgets(line, &linelen, fp) == NULL) + break; + } + } + else + { + /* + * No PJL stuff, just add the UEL... + */ + + fputs("\033%-12345X", stdout); + } + + /* + * Switch to TBCP mode... + */ + + fputs("\001M", stdout); + + /* + * Loop until we see end-of-file... + */ + + while (pswrite(line, linelen, stdout) > 0) + { + linelen = sizeof(line); + if (psgets(line, &linelen, fp) == NULL) + break; + } + + fflush(stdout); + } + + return (0); +} + + +/* + * 'psgets()' - Get a line from a file. + * + * Note: + * + * This function differs from the gets() function in that it + * handles any combination of CR, LF, or CR LF to end input + * lines. + */ + +static char * /* O - String or NULL if EOF */ +psgets(char *buf, /* I - Buffer to read into */ + size_t *bytes, /* IO - Length of buffer */ + FILE *fp) /* I - File to read from */ +{ + char *bufptr; /* Pointer into buffer */ + int ch; /* Character from file */ + size_t len; /* Max length of string */ + + + len = *bytes - 1; + bufptr = buf; + ch = EOF; + + while ((bufptr - buf) < len) + { + if ((ch = getc(fp)) == EOF) + break; + + if (ch == '\r') + { + /* + * Got a CR; see if there is a LF as well... + */ + + ch = getc(fp); + + if (ch != EOF && ch != '\n') + { + ungetc(ch, fp); /* Nope, save it for later... */ + ch = '\r'; + } + else + *bufptr++ = '\r'; + break; + } + else if (ch == '\n') + break; + else + *bufptr++ = ch; + } + + /* + * Add a trailing newline if it is there... + */ + + if (ch == '\n' || ch == '\r') + { + if ((bufptr - buf) < len) + *bufptr++ = ch; + else + ungetc(ch, fp); + } + + /* + * Nul-terminate the string and return it (or NULL for EOF). + */ + + *bufptr = '\0'; + *bytes = bufptr - buf; + + if (ch == EOF && bufptr == buf) + return (NULL); + else + return (buf); +} + + +/* + * 'pswrite()' - Write data from a file. + */ + +static size_t /* O - Number of bytes written */ +pswrite(const char *buf, /* I - Buffer to write */ + size_t bytes, /* I - Bytes to write */ + FILE *fp) /* I - File to write to */ +{ + size_t count; /* Remaining bytes */ + + + for (count = bytes; count > 0; count --, buf ++) + switch (*buf) + { + case 0x04 : /* CTRL-D */ + if (bytes == 1) + { + /* + * Don't quote the last CTRL-D... + */ + + putchar(0x04); + break; + } + + case 0x01 : /* CTRL-A */ + case 0x03 : /* CTRL-C */ + case 0x05 : /* CTRL-E */ + case 0x11 : /* CTRL-Q */ + case 0x13 : /* CTRL-S */ + case 0x14 : /* CTRL-T */ + case 0x1b : /* CTRL-[ (aka ESC) */ + case 0x1c : /* CTRL-\ */ + if (putchar(0x01) < 0) + return (-1); + if (putchar(*buf ^ 0x40) < 0) + return (-1); + break; + + default : + if (putchar(*buf) < 0) + return (-1); + break; + } + + return (bytes); +} + + +/* + * End of "$Id: tbcp.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/notifier/Dependencies b/notifier/Dependencies new file mode 100644 index 0000000..9e72321 --- /dev/null +++ b/notifier/Dependencies @@ -0,0 +1,25 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +dbus.o: ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h +dbus.o: ../cups/http.h ../cups/array.h ../cups/language.h +dbus.o: ../cups/string-private.h ../config.h +mailto.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +mailto.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +mailto.o: ../cups/language.h ../cups/string-private.h ../config.h +mailto.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +mailto.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +mailto.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +mailto.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +mailto.o: ../cups/transcode.h ../cups/thread-private.h +rss.o: ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h +rss.o: ../cups/http.h ../cups/array.h ../cups/language.h ../cups/language.h +rss.o: ../cups/string-private.h ../config.h ../cups/array.h +testnotify.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +testnotify.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testnotify.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +testnotify.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +testnotify.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +testnotify.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +testnotify.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +testnotify.o: ../cups/language-private.h ../cups/transcode.h +testnotify.o: ../cups/thread-private.h diff --git a/notifier/Makefile b/notifier/Makefile new file mode 100644 index 0000000..5fcd1e4 --- /dev/null +++ b/notifier/Makefile @@ -0,0 +1,162 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Notifier makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +NOTIFIERS = $(DBUS_NOTIFIER) mailto rss +TARGETS = $(NOTIFIERS) testnotify +OBJS = dbus.o mailto.o rss.o testnotify.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) dbus.h + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + $(INSTALL_DIR) -m 775 -g $(CUPS_GROUP) $(CACHEDIR)/rss + + +# +# Install programs... +# + +install-exec: + echo Installing notifiers in $(SERVERBIN)/notifier... + $(INSTALL_DIR) -m 755 $(SERVERBIN)/notifier + for file in $(NOTIFIERS); do \ + $(INSTALL_BIN) $$file $(SERVERBIN)/notifier; \ + done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(NOTIFIERS) $(SYMROOT); \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all targets... +# + +uninstall: + for file in $(NOTIFIERS); do \ + $(RM) $(SERVERBIN)/notifier/$$file; \ + done + -$(RMDIR) $(SERVERBIN)/notifier + -$(RMDIR) $(SERVERBIN) + -$(RMDIR) $(CACHEDIR)/rss + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# dbus +# + +dbus: dbus.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o dbus dbus.o $(DBUS_NOTIFIERLIBS) $(LIBS) + + +# +# mailto +# + +mailto: mailto.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o mailto mailto.o $(LIBS) + + +# +# rss +# + +rss: rss.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o rss rss.o $(LIBS) + + +# +# testnotify +# + +testnotify: testnotify.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o testnotify testnotify.o $(LIBS) + + +$(OBJS): ../Makedefs + +include Dependencies + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/notifier/dbus.c b/notifier/dbus.c new file mode 100644 index 0000000..13e3840 --- /dev/null +++ b/notifier/dbus.c @@ -0,0 +1,595 @@ +/* + * "$Id: dbus.c 10178 2012-01-13 23:00:22Z mike $" + * + * D-Bus notifier for CUPS. + * + * Copyright 2008-2011 by Apple Inc. + * Copyright (C) 2011 Red Hat, Inc. + * Copyright (C) 2007 Tim Waugh <twaugh@redhat.com> + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Read events and send DBUS notifications. + * acquire_lock() - Acquire a lock so we only have a single notifier running. + */ + +/* + * Include necessary headers... + */ + +#include <cups/cups.h> +#include <cups/string-private.h> +#include <fcntl.h> +#include <signal.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include <dbus/dbus.h> +#ifdef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND +# define dbus_message_append_iter_init dbus_message_iter_init_append +# define dbus_message_iter_append_string(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, v) +# define dbus_message_iter_append_uint32(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, v) +# define dbus_message_iter_append_boolean(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_BOOLEAN, v) +#endif /* HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ + + +/* + * D-Bus object: org.cups.cupsd.Notifier + * D-Bus object path: /org/cups/cupsd/Notifier + * + * D-Bus interface name: org.cups.cupsd.Notifier + * + * Signals: + * + * ServerRestarted(STRING text) + * Server has restarted. + * + * ServerStarted(STRING text) + * Server has started. + * + * ServerStopped(STRING text) + * Server has stopped. + * + * ServerAudit(STRING text) + * Security-related event. + * + * PrinterRestarted(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has restarted. + * + * PrinterShutdown(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has shutdown. + * + * PrinterStopped(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has stopped. + * + * PrinterStateChanged(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer state has changed. + * + * PrinterFinishingsChanged(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer's finishings-supported attribute has changed. + * + * PrinterMediaChanged(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer's media-supported attribute has changed. + * + * PrinterAdded(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has been added. + * + * PrinterDeleted(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has been deleted. + * + * PrinterModified(STRING text, + * STRING printer-uri, + * STRING printer-name, + * UINT32 printer-state, + * STRING printer-state-reasons, + * BOOLEAN printer-is-accepting-jobs) + * Printer has been modified. + * + * text describes the event. + * printer-state-reasons is a comma-separated list. + * If printer-uri is "" in a Job* signal, the other printer-* parameters + * must be ignored. + * If the job name is not know, job-name will be "". + */ + +/* + * Constants... + */ + +enum +{ + PARAMS_NONE, + PARAMS_PRINTER, + PARAMS_JOB +}; + + +/* + * Local functions... + */ + +static int acquire_lock(int *fd, char *lockfile, size_t locksize); + + +/* + * 'main()' - Read events and send DBUS notifications. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + ipp_t *msg; /* Event message from scheduler */ + ipp_state_t state; /* IPP event state */ + struct sigaction action; /* POSIX sigaction data */ + DBusConnection *con = NULL; /* Connection to DBUS server */ + DBusError error; /* Error, if any */ + DBusMessage *message; /* Message to send */ + DBusMessageIter iter; /* Iterator for message data */ + int lock_fd = -1; /* Lock file descriptor */ + char lock_filename[1024]; + /* Lock filename */ + + + /* + * Don't buffer stderr... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + + /* + * Validate command-line options... + */ + + if (argc != 3) + { + fputs("Usage: dbus dbus:/// notify-user-data\n", stderr); + return (1); + } + + if (strncmp(argv[1], "dbus:", 5)) + { + fprintf(stderr, "ERROR: Bad URI \"%s\"!\n", argv[1]); + return (1); + } + + /* + * Loop forever until we run out of events... + */ + + for (;;) + { + ipp_attribute_t *attr; /* Current attribute */ + const char *event; /* Event name */ + const char *signame = NULL;/* DBUS signal name */ + char *printer_reasons = NULL; + /* Printer reasons string */ + char *job_reasons = NULL; + /* Job reasons string */ + const char *nul = ""; /* Empty string value */ + int no = 0; /* Boolean "no" value */ + int params = PARAMS_NONE; + /* What parameters to include? */ + + + /* + * Get the next event... + */ + + msg = ippNew(); + while ((state = ippReadFile(0, msg)) != IPP_DATA) + { + if (state <= IPP_IDLE) + break; + } + + fprintf(stderr, "DEBUG: state=%d\n", state); + + if (state == IPP_ERROR) + fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); + + if (state <= IPP_IDLE) + { + /* + * Out of messages, free memory and then exit... + */ + + ippDelete(msg); + break; + } + + /* + * Verify connection to DBUS server... + */ + + if (con && !dbus_connection_get_is_connected(con)) + { + dbus_connection_unref(con); + con = NULL; + } + + if (!con) + { + dbus_error_init(&error); + + con = dbus_bus_get(DBUS_BUS_SYSTEM, &error); + if (!con) + dbus_error_free(&error); + else + fputs("DEBUG: Connected to D-BUS\n", stderr); + } + + if (!con) + continue; + + if (lock_fd == -1 && + acquire_lock(&lock_fd, lock_filename, sizeof(lock_filename))) + continue; + + attr = ippFindAttribute(msg, "notify-subscribed-event", + IPP_TAG_KEYWORD); + if (!attr) + continue; + + event = attr->values[0].string.text; + if (!strncmp(event, "server-", 7)) + { + const char *word2 = event + 7; /* Second word */ + + if (!strcmp(word2, "restarted")) + signame = "ServerRestarted"; + else if (!strcmp(word2, "started")) + signame = "ServerStarted"; + else if (!strcmp(word2, "stopped")) + signame = "ServerStopped"; + else if (!strcmp(word2, "audit")) + signame = "ServerAudit"; + else + continue; + } + else if (!strncmp(event, "printer-", 8)) + { + const char *word2 = event + 8; /* Second word */ + + params = PARAMS_PRINTER; + if (!strcmp(word2, "restarted")) + signame = "PrinterRestarted"; + else if (!strcmp(word2, "shutdown")) + signame = "PrinterShutdown"; + else if (!strcmp(word2, "stopped")) + signame = "PrinterStopped"; + else if (!strcmp(word2, "state-changed")) + signame = "PrinterStateChanged"; + else if (!strcmp(word2, "finishings-changed")) + signame = "PrinterFinishingsChanged"; + else if (!strcmp(word2, "media-changed")) + signame = "PrinterMediaChanged"; + else if (!strcmp(word2, "added")) + signame = "PrinterAdded"; + else if (!strcmp(word2, "deleted")) + signame = "PrinterDeleted"; + else if (!strcmp(word2, "modified")) + signame = "PrinterModified"; + else + continue; + } + else if (!strncmp(event, "job-", 4)) + { + const char *word2 = event + 4; /* Second word */ + + params = PARAMS_JOB; + if (!strcmp(word2, "state-changed")) + signame = "JobState"; + else if (!strcmp(word2, "created")) + signame = "JobCreated"; + else if (!strcmp(word2, "completed")) + signame = "JobCompleted"; + else if (!strcmp(word2, "stopped")) + signame = "JobStopped"; + else if (!strcmp(word2, "config-changed")) + signame = "JobConfigChanged"; + else if (!strcmp(word2, "progress")) + signame = "JobProgress"; + else + continue; + } + else + continue; + + /* + * Create and send the new message... + */ + + fprintf(stderr, "DEBUG: %s\n", signame); + message = dbus_message_new_signal("/org/cups/cupsd/Notifier", + "org.cups.cupsd.Notifier", + signame); + + dbus_message_append_iter_init(message, &iter); + attr = ippFindAttribute(msg, "notify-text", IPP_TAG_TEXT); + if (!attr) + goto bail; + if (!dbus_message_iter_append_string(&iter, &(attr->values[0].string.text))) + goto bail; + + if (params >= PARAMS_PRINTER) + { + char *p; /* Pointer into printer_reasons */ + size_t reasons_length; /* Required size of printer_reasons */ + int i; /* Looping var */ + int have_printer_params = 1;/* Do we have printer URI? */ + + /* STRING printer-uri or "" */ + attr = ippFindAttribute(msg, "notify-printer-uri", IPP_TAG_URI); + if (attr) + { + if (!dbus_message_iter_append_string(&iter, + &(attr->values[0].string.text))) + goto bail; + } + else + { + have_printer_params = 0; + dbus_message_iter_append_string(&iter, &nul); + } + + /* STRING printer-name */ + if (have_printer_params) + { + attr = ippFindAttribute(msg, "printer-name", IPP_TAG_NAME); + if (attr) + { + if (!dbus_message_iter_append_string(&iter, + &(attr->values[0].string.text))) + goto bail; + } + else + goto bail; + } + else + dbus_message_iter_append_string(&iter, &nul); + + /* UINT32 printer-state */ + if (have_printer_params) + { + attr = ippFindAttribute(msg, "printer-state", IPP_TAG_ENUM); + if (attr) + dbus_message_iter_append_uint32(&iter, &(attr->values[0].integer)); + else + goto bail; + } + else + dbus_message_iter_append_uint32(&iter, &no); + + /* STRING printer-state-reasons */ + if (have_printer_params) + { + attr = ippFindAttribute(msg, "printer-state-reasons", + IPP_TAG_KEYWORD); + if (attr) + { + for (reasons_length = 0, i = 0; i < attr->num_values; i++) + /* All need commas except the last, which needs a nul byte. */ + reasons_length += 1 + strlen(attr->values[i].string.text); + printer_reasons = malloc(reasons_length); + if (!printer_reasons) + goto bail; + p = printer_reasons; + for (i = 0; i < attr->num_values; i++) + { + if (i) + *p++ = ','; + + strcpy(p, attr->values[i].string.text); + p += strlen(p); + } + if (!dbus_message_iter_append_string(&iter, &printer_reasons)) + goto bail; + } + else + goto bail; + } + else + dbus_message_iter_append_string(&iter, &nul); + + /* BOOL printer-is-accepting-jobs */ + if (have_printer_params) + { + attr = ippFindAttribute(msg, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN); + if (attr) + dbus_message_iter_append_boolean(&iter, &(attr->values[0].boolean)); + else + goto bail; + } + else + dbus_message_iter_append_boolean(&iter, &no); + } + + if (params >= PARAMS_JOB) + { + char *p; /* Pointer into job_reasons */ + size_t reasons_length; /* Required size of job_reasons */ + int i; /* Looping var */ + + /* UINT32 job-id */ + attr = ippFindAttribute(msg, "notify-job-id", IPP_TAG_INTEGER); + if (!attr) + goto bail; + dbus_message_iter_append_uint32(&iter, &(attr->values[0].integer)); + + /* UINT32 job-state */ + attr = ippFindAttribute(msg, "job-state", IPP_TAG_ENUM); + if (!attr) + goto bail; + dbus_message_iter_append_uint32(&iter, &(attr->values[0].integer)); + + /* STRING job-state-reasons */ + attr = ippFindAttribute(msg, "job-state-reasons", IPP_TAG_KEYWORD); + if (attr) + { + for (reasons_length = 0, i = 0; i < attr->num_values; i++) + /* All need commas except the last, which needs a nul byte. */ + reasons_length += 1 + strlen(attr->values[i].string.text); + job_reasons = malloc(reasons_length); + if (!job_reasons) + goto bail; + p = job_reasons; + for (i = 0; i < attr->num_values; i++) + { + if (i) + *p++ = ','; + + strcpy(p, attr->values[i].string.text); + p += strlen(p); + } + if (!dbus_message_iter_append_string(&iter, &job_reasons)) + goto bail; + } + else + goto bail; + + /* STRING job-name or "" */ + attr = ippFindAttribute(msg, "job-name", IPP_TAG_NAME); + if (attr) + { + if (!dbus_message_iter_append_string(&iter, + &(attr->values[0].string.text))) + goto bail; + } + else + dbus_message_iter_append_string(&iter, &nul); + + /* UINT32 job-impressions-completed */ + attr = ippFindAttribute(msg, "job-impressions-completed", + IPP_TAG_INTEGER); + if (!attr) + goto bail; + dbus_message_iter_append_uint32(&iter, &(attr->values[0].integer)); + } + + dbus_connection_send(con, message, NULL); + dbus_connection_flush(con); + + /* + * Cleanup... + */ + + bail: + + dbus_message_unref(message); + + if (printer_reasons) + free(printer_reasons); + + if (job_reasons) + free(job_reasons); + + ippDelete(msg); + } + + /* + * Remove lock file... + */ + + if (lock_fd >= 0) + { + close(lock_fd); + unlink(lock_filename); + } + + return (0); +} + + +/* + * 'acquire_lock()' - Acquire a lock so we only have a single notifier running. + */ + +static int /* O - 0 on success, -1 on failure */ +acquire_lock(int *fd, /* O - Lock file descriptor */ + char *lockfile, /* I - Lock filename buffer */ + size_t locksize) /* I - Size of filename buffer */ +{ + const char *tmpdir; /* Temporary directory */ + + + /* + * Figure out where to put the lock file... + */ + + if ((tmpdir = getenv("TMPDIR")) == NULL) + tmpdir = "/tmp"; + + snprintf(lockfile, locksize, "%s/cups-dbus-notifier-lockfile", tmpdir); + + /* + * Create the lock file and fail if it already exists... + */ + + if ((*fd = open(lockfile, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR)) < 0) + return (-1); + else + return (0); +} + + +/* + * End of "$Id: dbus.c 10178 2012-01-13 23:00:22Z mike $". + */ diff --git a/notifier/mailto.c b/notifier/mailto.c new file mode 100644 index 0000000..cebcfbb --- /dev/null +++ b/notifier/mailto.c @@ -0,0 +1,646 @@ +/* + * "$Id: mailto.c 9793 2011-05-20 03:49:49Z mike $" + * + * "mailto" notifier for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the mailto notifier. + * email_message() - Email a notification message. + * load_configuration() - Load the mailto.conf file. + * pipe_sendmail() - Open a pipe to sendmail... + * print_attributes() - Print the attributes in a request... + */ + +/* + * Include necessary headers... + */ + +#include <cups/cups-private.h> +#include <sys/wait.h> +#include <signal.h> + + +/* + * Globals... + */ + +char mailtoCc[1024]; /* Cc email address */ +char mailtoFrom[1024]; /* From email address */ +char mailtoReplyTo[1024]; /* Reply-To email address */ +char mailtoSubject[1024]; /* Subject prefix */ +char mailtoSMTPServer[1024]; /* SMTP server to use */ +char mailtoSendmail[1024]; /* Sendmail program to use */ + + +/* + * Local functions... + */ + +void email_message(const char *to, const char *subject, + const char *text); +int load_configuration(void); +cups_file_t *pipe_sendmail(const char *to); +void print_attributes(ipp_t *ipp, int indent); + + +/* + * 'main()' - Main entry for the mailto notifier. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + ipp_t *msg; /* Event message from scheduler */ + ipp_state_t state; /* IPP event state */ + char *subject, /* Subject for notification message */ + *text; /* Text for notification message */ + cups_lang_t *lang; /* Language info */ + char temp[1024]; /* Temporary string */ + int templen; /* Length of temporary string */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* POSIX sigaction data */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Don't buffer stderr... + */ + + setbuf(stderr, NULL); + + /* + * Ignore SIGPIPE signals... + */ + +#ifdef HAVE_SIGSET + sigset(SIGPIPE, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGPIPE, SIG_IGN); +#endif /* HAVE_SIGSET */ + + /* + * Validate command-line options... + */ + + if (argc != 3) + { + fputs("Usage: mailto mailto:user@domain.com notify-user-data\n", stderr); + return (1); + } + + if (strncmp(argv[1], "mailto:", 7)) + { + fprintf(stderr, "ERROR: Bad recipient \"%s\"!\n", argv[1]); + return (1); + } + + fprintf(stderr, "DEBUG: argc=%d\n", argc); + for (i = 0; i < argc; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + + /* + * Load configuration data... + */ + + if ((lang = cupsLangDefault()) == NULL) + return (1); + + if (!load_configuration()) + return (1); + + /* + * Get the reply-to address... + */ + + templen = sizeof(temp); + httpDecode64_2(temp, &templen, argv[2]); + + if (!strncmp(temp, "mailto:", 7)) + strlcpy(mailtoReplyTo, temp + 7, sizeof(mailtoReplyTo)); + else if (temp[0]) + fprintf(stderr, "WARNING: Bad notify-user-data value (%d bytes) ignored!\n", + templen); + + /* + * Loop forever until we run out of events... + */ + + for (;;) + { + /* + * Get the next event... + */ + + msg = ippNew(); + while ((state = ippReadFile(0, msg)) != IPP_DATA) + { + if (state <= IPP_IDLE) + break; + } + + fprintf(stderr, "DEBUG: state=%d\n", state); + + if (state == IPP_ERROR) + fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); + + if (state <= IPP_IDLE) + { + /* + * Out of messages, free memory and then exit... + */ + + ippDelete(msg); + return (0); + } + + /* + * Get the subject and text for the message, then email it... + */ + + subject = cupsNotifySubject(lang, msg); + text = cupsNotifyText(lang, msg); + + fprintf(stderr, "DEBUG: subject=\"%s\"\n", subject); + fprintf(stderr, "DEBUG: text=\"%s\"\n", text); + + if (subject && text) + email_message(argv[1] + 7, subject, text); + else + { + fputs("ERROR: Missing attributes in event notification!\n", stderr); + print_attributes(msg, 4); + } + + /* + * Free the memory used for this event... + */ + + if (subject) + free(subject); + + if (text) + free(text); + + ippDelete(msg); + } +} + + +/* + * 'email_message()' - Email a notification message. + */ + +void +email_message(const char *to, /* I - Recipient of message */ + const char *subject, /* I - Subject of message */ + const char *text) /* I - Text of message */ +{ + cups_file_t *fp; /* Pipe/socket to mail server */ + const char *nl; /* Newline to use */ + char response[1024]; /* SMTP response buffer */ + + + /* + * Connect to the mail server... + */ + + if (mailtoSendmail[0]) + { + /* + * Use the sendmail command... + */ + + fp = pipe_sendmail(to); + + if (!fp) + return; + + nl = "\n"; + } + else + { + /* + * Use an SMTP server... + */ + + char hostbuf[1024]; /* Local hostname */ + + + if (strchr(mailtoSMTPServer, ':')) + fp = cupsFileOpen(mailtoSMTPServer, "s"); + else + { + char spec[1024]; /* Host:service spec */ + + + snprintf(spec, sizeof(spec), "%s:smtp", mailtoSMTPServer); + fp = cupsFileOpen(spec, "s"); + } + + if (!fp) + { + fprintf(stderr, "ERROR: Unable to connect to SMTP server \"%s\"!\n", + mailtoSMTPServer); + return; + } + + fprintf(stderr, "DEBUG: Connected to \"%s\"...\n", mailtoSMTPServer); + + cupsFilePrintf(fp, "HELO %s\r\n", + httpGetHostname(NULL, hostbuf, sizeof(hostbuf))); + fprintf(stderr, "DEBUG: >>> HELO %s\n", hostbuf); + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + goto smtp_error; + fprintf(stderr, "DEBUG: <<< %s\n", response); + + cupsFilePrintf(fp, "MAIL FROM:%s\r\n", mailtoFrom); + fprintf(stderr, "DEBUG: >>> MAIL FROM:%s\n", mailtoFrom); + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + goto smtp_error; + fprintf(stderr, "DEBUG: <<< %s\n", response); + + cupsFilePrintf(fp, "RCPT TO:%s\r\n", to); + fprintf(stderr, "DEBUG: >>> RCPT TO:%s\n", to); + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + goto smtp_error; + fprintf(stderr, "DEBUG: <<< %s\n", response); + + cupsFilePuts(fp, "DATA\r\n"); + fputs("DEBUG: DATA\n", stderr); + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + goto smtp_error; + fprintf(stderr, "DEBUG: <<< %s\n", response); + + nl = "\r\n"; + } + + /* + * Send the message... + */ + + cupsFilePrintf(fp, "Date: %s%s", httpGetDateString(time(NULL)), nl); + cupsFilePrintf(fp, "From: %s%s", mailtoFrom, nl); + cupsFilePrintf(fp, "Subject: %s %s%s", mailtoSubject, subject, nl); + if (mailtoReplyTo[0]) + { + cupsFilePrintf(fp, "Sender: %s%s", mailtoReplyTo, nl); + cupsFilePrintf(fp, "Reply-To: %s%s", mailtoReplyTo, nl); + } + cupsFilePrintf(fp, "To: %s%s", to, nl); + if (mailtoCc[0]) + cupsFilePrintf(fp, "Cc: %s%s", mailtoCc, nl); + cupsFilePrintf(fp, "Content-Type: text/plain%s", nl); + cupsFilePuts(fp, nl); + cupsFilePrintf(fp, "%s%s", text, nl); + cupsFilePrintf(fp, ".%s", nl); + + /* + * Close the connection to the mail server... + */ + + if (mailtoSendmail[0]) + { + /* + * Close the pipe and wait for the sendmail command to finish... + */ + + int status; /* Exit status */ + + + cupsFileClose(fp); + + while (wait(&status)) + { + if (errno != EINTR) + { + fprintf(stderr, "DEBUG: Unable to get child status: %s\n", + strerror(errno)); + status = 0; + break; + } + } + + /* + * Report any non-zero status... + */ + + if (status) + { + if (WIFEXITED(status)) + fprintf(stderr, "ERROR: Sendmail command returned status %d!\n", + WEXITSTATUS(status)); + else + fprintf(stderr, "ERROR: Sendmail command crashed on signal %d!\n", + WTERMSIG(status)); + } + } + else + { + /* + * Finish up the SMTP submission and close the connection... + */ + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + goto smtp_error; + fprintf(stderr, "DEBUG: <<< %s\n", response); + + /* + * Process SMTP errors here... + */ + + smtp_error: + + cupsFilePuts(fp, "QUIT\r\n"); + fputs("DEBUG: QUIT\n", stderr); + + if (!cupsFileGets(fp, response, sizeof(response)) || atoi(response) >= 500) + fprintf(stderr, "ERROR: Got \"%s\" trying to QUIT connection.\n", + response); + else + fprintf(stderr, "DEBUG: <<< %s\n", response); + + cupsFileClose(fp); + + fprintf(stderr, "DEBUG: Closed connection to \"%s\"...\n", + mailtoSMTPServer); + } +} + + +/* + * 'load_configuration()' - Load the mailto.conf file. + */ + +int /* I - 1 on success, 0 on failure */ +load_configuration(void) +{ + cups_file_t *fp; /* mailto.conf file */ + const char *server_root, /* CUPS_SERVERROOT environment variable */ + *server_admin; /* SERVER_ADMIN environment variable */ + char line[1024], /* Line from file */ + *value; /* Value for directive */ + int linenum; /* Line number in file */ + + + /* + * Initialize defaults... + */ + + mailtoCc[0] = '\0'; + + if ((server_admin = getenv("SERVER_ADMIN")) != NULL) + strlcpy(mailtoFrom, server_admin, sizeof(mailtoFrom)); + else + snprintf(mailtoFrom, sizeof(mailtoFrom), "root@%s", + httpGetHostname(NULL, line, sizeof(line))); + + strlcpy(mailtoSendmail, "/usr/sbin/sendmail", sizeof(mailtoSendmail)); + + mailtoSMTPServer[0] = '\0'; + + mailtoSubject[0] = '\0'; + + /* + * Try loading the config file... + */ + + if ((server_root = getenv("CUPS_SERVERROOT")) == NULL) + server_root = CUPS_SERVERROOT; + + snprintf(line, sizeof(line), "%s/mailto.conf", server_root); + + if ((fp = cupsFileOpen(line, "r")) == NULL) + { + if (errno != ENOENT) + { + fprintf(stderr, "ERROR: Unable to open \"%s\" - %s\n", line, + strerror(errno)); + return (1); + } + else + return (0); + } + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!value) + { + fprintf(stderr, "ERROR: No value found for %s directive on line %d!\n", + line, linenum); + cupsFileClose(fp); + return (0); + } + + if (!_cups_strcasecmp(line, "Cc")) + strlcpy(mailtoCc, value, sizeof(mailtoCc)); + else if (!_cups_strcasecmp(line, "From")) + strlcpy(mailtoFrom, value, sizeof(mailtoFrom)); + else if (!_cups_strcasecmp(line, "Sendmail")) + { + strlcpy(mailtoSendmail, value, sizeof(mailtoSendmail)); + mailtoSMTPServer[0] = '\0'; + } + else if (!_cups_strcasecmp(line, "SMTPServer")) + { + mailtoSendmail[0] = '\0'; + strlcpy(mailtoSMTPServer, value, sizeof(mailtoSMTPServer)); + } + else if (!_cups_strcasecmp(line, "Subject")) + strlcpy(mailtoSubject, value, sizeof(mailtoSubject)); + else + { + fprintf(stderr, + "ERROR: Unknown configuration directive \"%s\" on line %d!\n", + line, linenum); + } + } + + /* + * Close file and return... + */ + + cupsFileClose(fp); + + return (1); +} + + +/* + * 'pipe_sendmail()' - Open a pipe to sendmail... + */ + +cups_file_t * /* O - CUPS file */ +pipe_sendmail(const char *to) /* I - To: address */ +{ + cups_file_t *fp; /* CUPS file */ + int pid; /* Process ID */ + int pipefds[2]; /* Pipe file descriptors */ + int argc; /* Number of arguments */ + char *argv[100], /* Argument array */ + line[1024], /* Sendmail command + args */ + *lineptr; /* Pointer into line */ + + + /* + * First break the mailtoSendmail string into arguments... + */ + + strlcpy(line, mailtoSendmail, sizeof(line)); + argv[0] = line; + argc = 1; + + for (lineptr = strchr(line, ' '); lineptr; lineptr = strchr(lineptr, ' ')) + { + while (*lineptr == ' ') + *lineptr++ = '\0'; + + if (*lineptr) + { + /* + * Point to the next argument... + */ + + argv[argc ++] = lineptr; + + /* + * Stop if we have too many... + */ + + if (argc >= (int)(sizeof(argv) / sizeof(argv[0]) - 2)) + break; + } + } + + argv[argc ++] = (char *)to; + argv[argc] = NULL; + + /* + * Create the pipe... + */ + + if (pipe(pipefds)) + { + perror("ERROR: Unable to create pipe"); + return (NULL); + } + + /* + * Then run the command... + */ + + if ((pid = fork()) == 0) + { + /* + * Child goes here - redirect stdin to the input side of the pipe, + * redirect stdout to stderr, and exec... + */ + + close(0); + dup(pipefds[0]); + + close(1); + dup(2); + + close(pipefds[0]); + close(pipefds[1]); + + execvp(argv[0], argv); + exit(errno); + } + else if (pid < 0) + { + /* + * Unable to fork - error out... + */ + + perror("ERROR: Unable to fork command"); + + close(pipefds[0]); + close(pipefds[1]); + + return (NULL); + } + + /* + * Create a CUPS file using the output side of the pipe and close the + * input side... + */ + + close(pipefds[0]); + + if ((fp = cupsFileOpenFd(pipefds[1], "w")) == NULL) + { + int status; /* Status of command */ + + + close(pipefds[1]); + wait(&status); + } + + return (fp); +} + + +/* + * 'print_attributes()' - Print the attributes in a request... + */ + +void +print_attributes(ipp_t *ipp, /* I - IPP request */ + int indent) /* I - Indentation */ +{ + ipp_tag_t group; /* Current group */ + ipp_attribute_t *attr; /* Current attribute */ + char buffer[1024]; /* Value buffer */ + + + for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) + { + if ((attr->group_tag == IPP_TAG_ZERO && indent <= 8) || !attr->name) + { + group = IPP_TAG_ZERO; + fputc('\n', stderr); + continue; + } + + if (group != attr->group_tag) + { + group = attr->group_tag; + + fprintf(stderr, "DEBUG: %*s%s:\n\n", indent - 4, "", ippTagString(group)); + } + + _ippAttrString(attr, buffer, sizeof(buffer)); + + fprintf(stderr, "DEBUG: %*s%s (%s%s) %s", indent, "", attr->name, + attr->num_values > 1 ? "1setOf " : "", + ippTagString(attr->value_tag), buffer); + } +} + + +/* + * End of "$Id: mailto.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/notifier/rss.c b/notifier/rss.c new file mode 100644 index 0000000..1897e62 --- /dev/null +++ b/notifier/rss.c @@ -0,0 +1,740 @@ +/* + * "$Id: rss.c 10379 2012-03-23 22:16:22Z mike $" + * + * RSS notifier for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the test notifier. + * compare_rss() - Compare two messages. + * delete_message() - Free all memory used by a message. + * load_rss() - Load an existing RSS feed file. + * new_message() - Create a new RSS message. + * password_cb() - Return the cached password. + * save_rss() - Save messages to a RSS file. + * xml_escape() - Copy a string, escaping &, <, and > as needed. + */ + +/* + * Include necessary headers... + */ + +#include <cups/cups.h> +#include <cups/language.h> +#include <cups/string-private.h> +#include <cups/array.h> +#include <sys/select.h> + + +/* + * Structures... + */ + +typedef struct _cups_rss_s /**** RSS message data ****/ +{ + int sequence_number; /* notify-sequence-number */ + char *subject, /* Message subject/summary */ + *text, /* Message text */ + *link_url; /* Link to printer */ + time_t event_time; /* When the event occurred */ +} _cups_rss_t; + + +/* + * Local globals... + */ + +static char *rss_password; /* Password for remote RSS */ + + +/* + * Local functions... + */ + +static int compare_rss(_cups_rss_t *a, _cups_rss_t *b); +static void delete_message(_cups_rss_t *rss); +static void load_rss(cups_array_t *rss, const char *filename); +static _cups_rss_t *new_message(int sequence_number, char *subject, + char *text, char *link_url, + time_t event_time); +static const char *password_cb(const char *prompt); +static int save_rss(cups_array_t *rss, const char *filename, + const char *baseurl); +static char *xml_escape(const char *s); + + +/* + * 'main()' - Main entry for the test notifier. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + ipp_t *event; /* Event from scheduler */ + ipp_state_t state; /* IPP event state */ + char scheme[32], /* URI scheme ("rss") */ + username[256], /* Username for remote RSS */ + host[1024], /* Hostname for remote RSS */ + resource[1024], /* RSS file */ + *options; /* Options */ + int port, /* Port number for remote RSS */ + max_events; /* Maximum number of events */ + http_t *http; /* Connection to remote server */ + http_status_t status; /* HTTP GET/PUT status code */ + char filename[1024], /* Local filename */ + newname[1024]; /* filename.N */ + cups_lang_t *language; /* Language information */ + ipp_attribute_t *printer_up_time, /* Timestamp on event */ + *notify_sequence_number,/* Sequence number */ + *notify_printer_uri; /* Printer URI */ + char *subject, /* Subject for notification message */ + *text, /* Text for notification message */ + link_url[1024], /* Link to printer */ + link_scheme[32], /* Scheme for link */ + link_username[256], /* Username for link */ + link_host[1024], /* Host for link */ + link_resource[1024]; /* Resource for link */ + int link_port; /* Link port */ + cups_array_t *rss; /* RSS message array */ + _cups_rss_t *msg; /* RSS message */ + char baseurl[1024]; /* Base URL */ + fd_set input; /* Input set for select() */ + struct timeval timeout; /* Timeout for select() */ + int changed; /* Has the RSS data changed? */ + int exit_status; /* Exit status */ + + + fprintf(stderr, "DEBUG: argc=%d\n", argc); + for (i = 0; i < argc; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + + /* + * See whether we are publishing this RSS feed locally or remotely... + */ + + if (httpSeparateURI(HTTP_URI_CODING_ALL, argv[1], scheme, sizeof(scheme), + username, sizeof(username), host, sizeof(host), &port, + resource, sizeof(resource)) < HTTP_URI_OK) + { + fprintf(stderr, "ERROR: Bad RSS URI \"%s\"!\n", argv[1]); + return (1); + } + + max_events = 20; + + if ((options = strchr(resource, '?')) != NULL) + { + *options++ = '\0'; + + if (!strncmp(options, "max_events=", 11)) + { + max_events = atoi(options + 11); + + if (max_events <= 0) + max_events = 20; + } + } + + rss = cupsArrayNew((cups_array_func_t)compare_rss, NULL); + + if (host[0]) + { + /* + * Remote feed, see if we can get the current file... + */ + + int fd; /* Temporary file */ + + + if ((rss_password = strchr(username, ':')) != NULL) + *rss_password++ = '\0'; + + cupsSetPasswordCB(password_cb); + cupsSetUser(username); + + if ((fd = cupsTempFd(filename, sizeof(filename))) < 0) + { + fprintf(stderr, "ERROR: Unable to create temporary file: %s\n", + strerror(errno)); + + return (1); + } + + if ((http = httpConnect(host, port)) == NULL) + { + fprintf(stderr, "ERROR: Unable to connect to %s on port %d: %s\n", + host, port, strerror(errno)); + + close(fd); + unlink(filename); + + return (1); + } + + status = cupsGetFd(http, resource, fd); + + close(fd); + + if (status != HTTP_OK && status != HTTP_NOT_FOUND) + { + fprintf(stderr, "ERROR: Unable to GET %s from %s on port %d: %d %s\n", + resource, host, port, status, httpStatus(status)); + + httpClose(http); + unlink(filename); + + return (1); + } + + strlcpy(newname, filename, sizeof(newname)); + + httpAssembleURI(HTTP_URI_CODING_ALL, baseurl, sizeof(baseurl), "http", + NULL, host, port, resource); + } + else + { + const char *cachedir, /* CUPS_CACHEDIR */ + *server_name, /* SERVER_NAME */ + *server_port; /* SERVER_PORT */ + + + http = NULL; + + if ((cachedir = getenv("CUPS_CACHEDIR")) == NULL) + cachedir = CUPS_CACHEDIR; + + if ((server_name = getenv("SERVER_NAME")) == NULL) + server_name = "localhost"; + + if ((server_port = getenv("SERVER_PORT")) == NULL) + server_port = "631"; + + snprintf(filename, sizeof(filename), "%s/rss%s", cachedir, resource); + snprintf(newname, sizeof(newname), "%s.N", filename); + + httpAssembleURIf(HTTP_URI_CODING_ALL, baseurl, sizeof(baseurl), "http", + NULL, server_name, atoi(server_port), "/rss%s", resource); + } + + /* + * Load the previous RSS file, if any... + */ + + load_rss(rss, filename); + + changed = cupsArrayCount(rss) == 0; + + /* + * Localize for the user's chosen language... + */ + + language = cupsLangDefault(); + + /* + * Read events and update the RSS file until we are out of events. + */ + + for (exit_status = 0, event = NULL;;) + { + if (changed) + { + /* + * Save the messages to the file again, uploading as needed... + */ + + if (save_rss(rss, newname, baseurl)) + { + if (http) + { + /* + * Upload the RSS file... + */ + + if ((status = cupsPutFile(http, resource, filename)) != HTTP_CREATED) + fprintf(stderr, "ERROR: Unable to PUT %s from %s on port %d: %d %s\n", + resource, host, port, status, httpStatus(status)); + } + else + { + /* + * Move the new RSS file over top the old one... + */ + + if (rename(newname, filename)) + fprintf(stderr, "ERROR: Unable to rename %s to %s: %s\n", + newname, filename, strerror(errno)); + } + + changed = 0; + } + } + + /* + * Wait up to 30 seconds for an event... + */ + + timeout.tv_sec = 30; + timeout.tv_usec = 0; + + FD_ZERO(&input); + FD_SET(0, &input); + + if (select(1, &input, NULL, NULL, &timeout) < 0) + continue; + else if (!FD_ISSET(0, &input)) + { + fprintf(stderr, "DEBUG: %s is bored, exiting...\n", argv[1]); + break; + } + + /* + * Read the next event... + */ + + event = ippNew(); + while ((state = ippReadFile(0, event)) != IPP_DATA) + { + if (state <= IPP_IDLE) + break; + } + + if (state == IPP_ERROR) + fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); + + if (state <= IPP_IDLE) + break; + + /* + * Collect the info from the event... + */ + + printer_up_time = ippFindAttribute(event, "printer-up-time", + IPP_TAG_INTEGER); + notify_sequence_number = ippFindAttribute(event, "notify-sequence-number", + IPP_TAG_INTEGER); + notify_printer_uri = ippFindAttribute(event, "notify-printer-uri", + IPP_TAG_URI); + subject = cupsNotifySubject(language, event); + text = cupsNotifyText(language, event); + + if (printer_up_time && notify_sequence_number && subject && text) + { + /* + * Create a new RSS message... + */ + + if (notify_printer_uri) + { + httpSeparateURI(HTTP_URI_CODING_ALL, + notify_printer_uri->values[0].string.text, + link_scheme, sizeof(link_scheme), + link_username, sizeof(link_username), + link_host, sizeof(link_host), &link_port, + link_resource, sizeof(link_resource)); + httpAssembleURI(HTTP_URI_CODING_ALL, link_url, sizeof(link_url), + "http", link_username, link_host, link_port, + link_resource); + } + + msg = new_message(notify_sequence_number->values[0].integer, + xml_escape(subject), xml_escape(text), + notify_printer_uri ? xml_escape(link_url) : NULL, + printer_up_time->values[0].integer); + + if (!msg) + { + fprintf(stderr, "ERROR: Unable to create message: %s\n", + strerror(errno)); + exit_status = 1; + break; + } + + /* + * Add it to the array... + */ + + cupsArrayAdd(rss, msg); + + changed = 1; + + /* + * Trim the array as needed... + */ + + while (cupsArrayCount(rss) > max_events) + { + msg = cupsArrayFirst(rss); + + cupsArrayRemove(rss, msg); + + delete_message(msg); + } + } + + if (subject) + free(subject); + + if (text) + free(text); + + ippDelete(event); + event = NULL; + } + + /* + * We only get here when idle or error... + */ + + ippDelete(event); + + if (http) + { + unlink(filename); + httpClose(http); + } + + return (exit_status); +} + + +/* + * 'compare_rss()' - Compare two messages. + */ + +static int /* O - Result of comparison */ +compare_rss(_cups_rss_t *a, /* I - First message */ + _cups_rss_t *b) /* I - Second message */ +{ + return (a->sequence_number - b->sequence_number); +} + + +/* + * 'delete_message()' - Free all memory used by a message. + */ + +static void +delete_message(_cups_rss_t *msg) /* I - RSS message */ +{ + if (msg->subject) + free(msg->subject); + + if (msg->text) + free(msg->text); + + if (msg->link_url) + free(msg->link_url); + + free(msg); +} + + +/* + * 'load_rss()' - Load an existing RSS feed file. + */ + +static void +load_rss(cups_array_t *rss, /* I - RSS messages */ + const char *filename) /* I - File to load */ +{ + FILE *fp; /* File pointer */ + char line[4096], /* Line from file */ + *subject, /* Subject */ + *text, /* Text */ + *link_url, /* Link URL */ + *start, /* Start of element */ + *end; /* End of element */ + time_t event_time; /* Event time */ + int sequence_number; /* Sequence number */ + int in_item; /* In an item */ + _cups_rss_t *msg; /* New message */ + + + if ((fp = fopen(filename, "r")) == NULL) + { + if (errno != ENOENT) + fprintf(stderr, "ERROR: Unable to open %s: %s\n", filename, + strerror(errno)); + + return; + } + + subject = NULL; + text = NULL; + link_url = NULL; + event_time = 0; + sequence_number = 0; + in_item = 0; + + while (fgets(line, sizeof(line), fp)) + { + if (strstr(line, "<item>")) + in_item = 1; + else if (strstr(line, "</item>") && in_item) + { + if (subject && text) + { + msg = new_message(sequence_number, subject, text, link_url, + event_time); + + if (msg) + cupsArrayAdd(rss, msg); + + } + else + { + if (subject) + free(subject); + + if (text) + free(text); + + if (link_url) + free(link_url); + } + + subject = NULL; + text = NULL; + link_url = NULL; + event_time = 0; + sequence_number = 0; + in_item = 0; + } + else if (!in_item) + continue; + else if ((start = strstr(line, "<title>")) != NULL) + { + start += 7; + if ((end = strstr(start, "")) != NULL) + { + *end = '\0'; + subject = strdup(start); + } + } + else if ((start = strstr(line, "")) != NULL) + { + start += 13; + if ((end = strstr(start, "")) != NULL) + { + *end = '\0'; + text = strdup(start); + } + } + else if ((start = strstr(line, "")) != NULL) + { + start += 6; + if ((end = strstr(start, "")) != NULL) + { + *end = '\0'; + link_url = strdup(start); + } + } + else if ((start = strstr(line, "")) != NULL) + { + start += 9; + if ((end = strstr(start, "")) != NULL) + { + *end = '\0'; + event_time = httpGetDateTime(start); + } + } + else if ((start = strstr(line, "")) != NULL) + sequence_number = atoi(start + 6); + } + + if (subject) + free(subject); + + if (text) + free(text); + + if (link_url) + free(link_url); + + fclose(fp); +} + + +/* + * 'new_message()' - Create a new RSS message. + */ + +static _cups_rss_t * /* O - New message */ +new_message(int sequence_number, /* I - notify-sequence-number */ + char *subject, /* I - Subject/summary */ + char *text, /* I - Text */ + char *link_url, /* I - Link to printer */ + time_t event_time) /* I - Date/time of event */ +{ + _cups_rss_t *msg; /* New message */ + + + if ((msg = calloc(1, sizeof(_cups_rss_t))) == NULL) + return (NULL); + + msg->sequence_number = sequence_number; + msg->subject = subject; + msg->text = text; + msg->link_url = link_url; + msg->event_time = event_time; + + return (msg); +} + + +/* + * 'password_cb()' - Return the cached password. + */ + +static const char * /* O - Cached password */ +password_cb(const char *prompt) /* I - Prompt string, unused */ +{ + (void)prompt; + + return (rss_password); +} + + +/* + * 'save_rss()' - Save messages to a RSS file. + */ + +static int /* O - 1 on success, 0 on failure */ +save_rss(cups_array_t *rss, /* I - RSS messages */ + const char *filename, /* I - File to save to */ + const char *baseurl) /* I - Base URL */ +{ + FILE *fp; /* File pointer */ + _cups_rss_t *msg; /* Current message */ + char date[1024]; /* Current date */ + char *href; /* Escaped base URL */ + + + if ((fp = fopen(filename, "w")) == NULL) + { + fprintf(stderr, "ERROR: Unable to create %s: %s\n", filename, + strerror(errno)); + return (0); + } + + fputs("\n", fp); + fputs("\n", fp); + fputs(" \n", fp); + fputs(" CUPS RSS Feed\n", fp); + + href = xml_escape(baseurl); + fprintf(fp, " %s\n", href); + free(href); + + fputs(" CUPS RSS Feed\n", fp); + fputs(" " CUPS_SVERSION "\n", fp); + fputs(" 1\n", fp); + + fprintf(fp, " %s\n", + httpGetDateString2(time(NULL), date, sizeof(date))); + + for (msg = (_cups_rss_t *)cupsArrayLast(rss); + msg; + msg = (_cups_rss_t *)cupsArrayPrev(rss)) + { + fputs(" \n", fp); + fprintf(fp, " %s\n", msg->subject); + fprintf(fp, " %s\n", msg->text); + if (msg->link_url) + fprintf(fp, " %s\n", msg->link_url); + fprintf(fp, " %s\n", + httpGetDateString2(msg->event_time, date, sizeof(date))); + fprintf(fp, " %d\n", msg->sequence_number); + fputs(" \n", fp); + } + + fputs(" \n", fp); + fputs("\n", fp); + + return (!fclose(fp)); +} + + +/* + * 'xml_escape()' - Copy a string, escaping &, <, and > as needed. + */ + +static char * /* O - Escaped string */ +xml_escape(const char *s) /* I - String to escape */ +{ + char *e, /* Escaped string */ + *eptr; /* Pointer into escaped string */ + const char *sptr; /* Pointer into string */ + size_t bytes; /* Bytes needed for string */ + + + /* + * First figure out how many extra bytes we need... + */ + + for (bytes = 0, sptr = s; *sptr; sptr ++) + if (*sptr == '&') + bytes += 4; /* & */ + else if (*sptr == '<' || *sptr == '>') + bytes += 3; /* < and > */ + + /* + * If there is nothing to escape, just strdup() it... + */ + + if (bytes == 0) + return (strdup(s)); + + /* + * Otherwise allocate memory and copy... + */ + + if ((e = malloc(bytes + 1 + strlen(s))) == NULL) + return (NULL); + + for (eptr = e, sptr = s; *sptr; sptr ++) + if (*sptr == '&') + { + *eptr++ = '&'; + *eptr++ = 'a'; + *eptr++ = 'm'; + *eptr++ = 'p'; + *eptr++ = ';'; + } + else if (*sptr == '<') + { + *eptr++ = '&'; + *eptr++ = 'l'; + *eptr++ = 't'; + *eptr++ = ';'; + } + else if (*sptr == '>') + { + *eptr++ = '&'; + *eptr++ = 'g'; + *eptr++ = 't'; + *eptr++ = ';'; + } + else + *eptr++ = *sptr; + + *eptr = '\0'; + + return (e); +} + + +/* + * End of "$Id: rss.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/notifier/testnotify.c b/notifier/testnotify.c new file mode 100644 index 0000000..e8bb8f5 --- /dev/null +++ b/notifier/testnotify.c @@ -0,0 +1,127 @@ +/* + * "$Id: testnotify.c 9499 2011-01-19 21:38:13Z mike $" + * + * Test notifier for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the test notifier. + * print_attributes() - Print the attributes in a request... + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +void print_attributes(ipp_t *ipp, int indent); + + +/* + * 'main()' - Main entry for the test notifier. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + ipp_t *event; /* Event from scheduler */ + ipp_state_t state; /* IPP event state */ + + + setbuf(stderr, NULL); + + fprintf(stderr, "DEBUG: argc=%d\n", argc); + for (i = 0; i < argc; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + fprintf(stderr, "DEBUG: TMPDIR=\"%s\"\n", getenv("TMPDIR")); + + for (;;) + { + event = ippNew(); + while ((state = ippReadFile(0, event)) != IPP_DATA) + { + if (state <= IPP_IDLE) + break; + } + + if (state == IPP_ERROR) + fputs("DEBUG: ippReadFile() returned IPP_ERROR!\n", stderr); + + if (state <= IPP_IDLE) + { + ippDelete(event); + return (0); + } + + print_attributes(event, 4); + ippDelete(event); + + /* + * If the recipient URI is "testnotify://nowait", then we exit after each + * event... + */ + + if (!strcmp(argv[1], "testnotify://nowait")) + return (0); + } +} + + +/* + * 'print_attributes()' - Print the attributes in a request... + */ + +void +print_attributes(ipp_t *ipp, /* I - IPP request */ + int indent) /* I - Indentation */ +{ + ipp_tag_t group; /* Current group */ + ipp_attribute_t *attr; /* Current attribute */ + char buffer[1024]; /* Value buffer */ + + + for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) + { + if ((attr->group_tag == IPP_TAG_ZERO && indent <= 8) || !attr->name) + { + group = IPP_TAG_ZERO; + fputc('\n', stderr); + continue; + } + + if (group != attr->group_tag) + { + group = attr->group_tag; + + fprintf(stderr, "DEBUG: %*s%s:\n\n", indent - 4, "", ippTagString(group)); + } + + _ippAttrString(attr, buffer, sizeof(buffer)); + + fprintf(stderr, "DEBUG: %*s%s (%s%s) %s", indent, "", attr->name, + attr->num_values > 1 ? "1setOf " : "", + ippTagString(attr->value_tag), buffer); + } +} + + +/* + * End of "$Id: testnotify.c 9499 2011-01-19 21:38:13Z mike $". + */ diff --git a/packaging/InstallationCheck b/packaging/InstallationCheck new file mode 100755 index 0000000..4e3405c --- /dev/null +++ b/packaging/InstallationCheck @@ -0,0 +1,11 @@ +#!/bin/sh +case `uname -r` in + # Mac OS X 10.4.x + 8.*) exit 0;; + + # Mac OS X 10.5.x + 9.*) exit 0;; + + # Older Mac OS X... + *) exit 97;; +esac diff --git a/packaging/LICENSE.rtf b/packaging/LICENSE.rtf new file mode 100644 index 0000000..b348f6b --- /dev/null +++ b/packaging/LICENSE.rtf @@ -0,0 +1,434 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1011 +{\fonttbl\f0\froman\fcharset0 Times-Roman;\f1\fnil\fcharset0 LucidaGrande;\f2\fmodern\fcharset0 Courier; +\f3\fmodern\fcharset0 Courier-Oblique;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue238;} +{\*\listtable{\list\listtemplateid1\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{disc\}}{\leveltext\leveltemplateid1\'01\uc0\u8226 ;}{\levelnumbers;}\fi-360\li720\lin720 }{\listname ;}\listid1} +{\list\listtemplateid2\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid101\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid102\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\lin1440 }{\listname ;}\listid2} +{\list\listtemplateid3\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid201\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid202\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\lin1440 }{\listname ;}\listid3} +{\list\listtemplateid4\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid301\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid4} +{\list\listtemplateid5\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid401\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid5} +{\list\listtemplateid6\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid501\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid6} +{\list\listtemplateid7\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\*\levelmarker \{decimal\}.}{\leveltext\leveltemplateid601\'02\'00.;}{\levelnumbers\'01;}\fi-360\li720\lin720 }{\listname ;}\listid7}} +{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}{\listoverride\listid3\listoverridecount0\ls3}{\listoverride\listid4\listoverridecount0\ls4}{\listoverride\listid5\listoverridecount0\ls5}{\listoverride\listid6\listoverridecount0\ls6}{\listoverride\listid7\listoverridecount0\ls7}} +\margl1440\margr1440\margb1800\margt1800\vieww9000\viewh8400\viewkind0 +\deftab720 +\pard\pardeftab720\sa280\qc + +\f0\b\fs36 \cf0 CUPS License Agreement\ +\pard\pardeftab720\sa240\qc + +\b0\fs24 \cf0 Copyright 2007-2009 by Apple Inc. +\f1 \uc0\u8232 +\f0 1 Infinite Loop +\f1 \uc0\u8232 +\f0 Cupertino, CA 95014 USA +\f1 \uc0\u8232 \u8232 +\f0 WWW: {\field{\*\fldinst{HYPERLINK "http://www.cups.org/"}}{\fldrslt \cf2 \ul \ulc2 http://www.cups.org}}\ +\pard\pardeftab720\sa280\ql\qnatural + +\b\fs28 \cf0 Introduction\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0\fs24 \cf0 CUPS +\fs20 \super TM +\fs24 \nosupersub is provided under the GNU General Public License ("GPL") and GNU Library General Public License ("LGPL"), Version 2, with exceptions for Apple operating systems and the OpenSSL toolkit. A copy of the exceptions and licenses follow this introduction.\ +The GNU LGPL applies to the CUPS API library, located in the "cups" subdirectory of the CUPS source distribution and in the "cups" include directory and library files in the binary distributions. The GNU GPL applies to the remainder of the CUPS distribution, including the "pdftops" filter which is based upon Xpdf and the CUPS imaging library.\ +For those not familiar with the GNU GPL, the license basically allows you to:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls1\ilvl0\cf0 {\listtext \'95 }Use the CUPS software at no charge.\ +{\listtext \'95 }Distribute verbatim copies of the software in source or binary form.\ +{\listtext \'95 }Sell verbatim copies of the software for a media fee, or sell support for the software.\ +{\listtext \'95 }Distribute or sell printer drivers and filters that use CUPS so long as source code is made available under the GPL.\ +\pard\pardeftab720\sa240\ql\qnatural +\cf0 What this license +\b does not +\b0 allow you to do is make changes or add features to CUPS and then sell a binary distribution without source code. You must provide source for any new drivers, changes, or additions to the software, and all code must be provided under the GPL or LGPL as appropriate. The only exceptions to this are the portions of the CUPS software covered by the Apple operating system license exceptions outlined later in this license agreement.\ +The GNU LGPL relaxes the "link-to" restriction, allowing you to develop applications that use the CUPS API library under other licenses and/or conditions as appropriate for your application.\ +\pard\pardeftab720\sa280\ql\qnatural + +\b\fs28 \cf0 License Exceptions\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0\fs24 \cf0 In addition, as the copyright holder of CUPS, Apple Inc. grants the following special exceptions:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls2\ilvl0 +\b \cf0 {\listtext 1. }Apple Operating System Development License Exception +\b0 ;\ +\pard\tx940\tx1440\pardeftab720\li1440\fi-1440\ql\qnatural +\ls2\ilvl1\cf0 {\listtext 1. }Software that is developed by any person or entity for an Apple Operating System ("Apple OS-Developed Software"), including but not limited to Apple and third party printer drivers, filters, and backends for an Apple Operating System, that is linked to the CUPS imaging library or based on any sample filters or backends provided with CUPS shall not be considered to be a derivative work or collective work based on the CUPS program and is exempt from the mandatory source code release clauses of the GNU GPL. You may therefore distribute linked combinations of the CUPS imaging library with Apple OS-Developed Software without releasing the source code of the Apple OS-Developed Software. You may also use sample filters and backends provided with CUPS to develop Apple OS-Developed Software without releasing the source code of the Apple OS-Developed Software.\ +{\listtext 2. }An Apple Operating System means any operating system software developed and/or marketed by Apple Computer, Inc., including but not limited to all existing releases and versions of Apple's Darwin, Mac OS X, and Mac OS X Server products and all follow-on releases and future versions thereof.\ +{\listtext 3. }This exception is only available for Apple OS-Developed Software and does not apply to software that is distributed for use on other operating systems.\ +{\listtext 4. }All CUPS software that falls under this license exception have the following text at the top of each source file:\ +{\listtext 5. }This file is subject to the Apple OS-Developed Software exception.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls2\ilvl0 +\b \cf0 {\listtext 2. }OpenSSL Toolkit License Exception +\b0 ;\ +\pard\tx940\tx1440\pardeftab720\li1440\fi-1440\ql\qnatural +\ls2\ilvl1\cf0 {\listtext 1. }Apple Inc. explicitly allows the compilation and distribution of the CUPS software with the OpenSSL Toolkit.\ +\pard\pardeftab720\sa240\ql\qnatural +\cf0 No developer is required to provide these exceptions in a derived work.\ +\pard\pardeftab720\sa280\ql\qnatural + +\b\fs28 \cf0 Trademarks\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0\fs24 \cf0 CUPS and the CUPS logo (the "CUPS Marks") are trademarks of Apple Inc. Apple grants you a non-exclusive and non-transferable right to use the CUPS Marks in any direct port or binary distribution incorporating CUPS software and in any promotional material therefor. You agree that your products will meet the highest levels of quality and integrity for similar goods, not be unlawful, and be developed, manufactured, and distributed in compliance with this license. You will not interfere with Apple's rights in the CUPS Marks, and all use of the CUPS Marks shall inure to the benefit of Apple. This license does not apply to use of the CUPS Marks in a derivative products, which requires prior written permission from Apple Inc.\ +\pard\pardeftab720\sa280\ql\qnatural + +\b\fs28 \cf0 \page \pard\pardeftab720\sa280\ql\qnatural + +\fs36 \cf0 GNU GENERAL PUBLIC LICENSE\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0\fs24 \cf0 Version 2, June 1991\ +\pard\pardeftab720\ql\qnatural + +\f2 \cf0 Copyright 1989, 1991 Free Software Foundation, Inc.\ +59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\ +\ +Everyone is permitted to copy and distribute verbatim\ +copies of this license document, but changing it is not allowed.\ +\pard\pardeftab720\sa300\ql\qnatural + +\f0\b \cf0 Preamble\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0 \cf0 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.\ +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.\ +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.\ +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\ +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.\ +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.\ +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.\ +The precise terms and conditions for copying, distribution and modification follow.\ +\pard\pardeftab720\sa300\ql\qnatural + +\b \cf0 GNU GENERAL PUBLIC LICENSE +\f1 \uc0\u8232 +\f0 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0 +\b0 \cf0 {\listtext 1. }This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 2. }Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 3. }You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 4. }You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 5. }You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:\ +\pard\tx940\tx1440\pardeftab720\li1440\fi-1440\ql\qnatural +\ls3\ilvl1\cf0 {\listtext 1. }You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.\ +{\listtext 2. }You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.\ +{\listtext 3. }if the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 6. }These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.\ +{\listtext 7. }Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.\ +{\listtext 8. }In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 9. }You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:\ +\pard\tx940\tx1440\pardeftab720\li1440\fi-1440\ql\qnatural +\ls3\ilvl1\cf0 {\listtext 1. }Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\ +{\listtext 2. }Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\ +{\listtext 3. }Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 10. }The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.\ +{\listtext 11. }If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 12. }You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.\ +{\listtext 13. }You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.\ +{\listtext 14. }Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.\ +{\listtext 15. }If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 16. }If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.\ +{\listtext 17. }It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.\ +{\listtext 18. }This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 19. }If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.\ +{\listtext 20. }The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 21. }Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls3\ilvl0\cf0 {\listtext 22. }If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.\ +\pard\pardeftab720\sa300\ql\qnatural + +\b \cf0 NO WARRANTY\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls4\ilvl0 +\b0 \cf0 {\listtext 1. }BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\ +{\listtext 2. }IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\ +\pard\pardeftab720\sa300\ql\qnatural + +\b \cf0 END OF TERMS AND CONDITIONS\ +How to Apply These Terms to Your New Programs\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0 \cf0 If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.\ +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.\ +\pard\pardeftab720\ql\qnatural + +\f3\i \cf0 one line to give the program's name and an idea of what it does. +\f2\i0 \ +Copyright (C) +\f3\i yyyy +\f2\i0 +\f3\i name of author +\f2\i0 \ +\ +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.\ +\pard\pardeftab720\sa240\ql\qnatural + +\f0 \cf0 Also add information on how to contact you by electronic and paper mail.\ +If the program is interactive, make it output a short notice like this when it starts in an interactive mode:\ +\pard\pardeftab720\ql\qnatural + +\f2 \cf0 Gnomovision version 69, Copyright (C) +\f3\i year +\f2\i0 +\f3\i name of author +\f2\i0 \ +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\ +type `show w'. This is free software, and you are welcome\ +to redistribute it under certain conditions; type `show c' \ +for details.\ +\pard\pardeftab720\sa240\ql\qnatural + +\f0 \cf0 The hypothetical commands +\f2 `show w' +\f0 and +\f2 `show c' +\f0 should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than +\f2 `show w' +\f0 and +\f2 `show c' +\f0 ; they could even be mouse-clicks or menu items--whatever suits your program.\ +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:\ +\pard\pardeftab720\ql\qnatural + +\f2 \cf0 Yoyodyne, Inc., hereby disclaims all copyright\ +interest in the program `Gnomovision'\ +(which makes passes at compilers) written \ +by James Hacker.\ +\ +\pard\pardeftab720\ql\qnatural + +\f3\i \cf0 signature of Ty Coon +\f2\i0 , 1 April 1989\ +Ty Coon, President of Vice\ +\pard\pardeftab720\sa280\ql\qnatural + +\f0\b\fs36 \cf0 GNU LIBRARY GENERAL PUBLIC LICENSE\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0\fs24 \cf0 Version 2, June 1991\ +\pard\pardeftab720\ql\qnatural + +\f2 \cf0 Copyright (C) 1991 Free Software Foundation, Inc.\ +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA\ +Everyone is permitted to copy and distribute verbatim copies\ +of this license document, but changing it is not allowed.\ +\ +[This is the first released version of the library GPL. It is\ + numbered 2 because it goes with version 2 of the ordinary GPL.]\ +\pard\pardeftab720\sa300\ql\qnatural + +\f0\b \cf0 Preamble\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0 \cf0 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.\ +This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too.\ +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.\ +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it.\ +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights.\ +Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library.\ +Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations.\ +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.\ +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license.\ +The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such.\ +Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better.\ +However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries.\ +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library.\ +Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one.\ +\pard\pardeftab720\sa300\ql\qnatural + +\b \cf0 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\ +\pard\pardeftab720\sa240\ql\qnatural +\cf0 0. +\b0 This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you".\ +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.\ +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)\ +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.\ +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.\ + +\b 1. +\b0 You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.\ +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.\ + +\b 2. +\b0 You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 1. }The modified work must itself be a software library.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 2. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 3. }You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 4. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 5. }You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 6. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 7. }If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls5\ilvl0\cf0 {\listtext 8. }(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)\ +\pard\pardeftab720\sa240\ql\qnatural +\cf0 These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.\ +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.\ +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.\ +\pard\pardeftab720\sa240\ql\qnatural + +\b \cf0 3. +\b0 You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.\ +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.\ +This option is useful when you wish to copy part of the code of the Library into a program that is not a library.\ + +\b 4. +\b0 You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.\ +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.\ + +\b 5. +\b0 A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.\ +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.\ +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.\ +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)\ +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.\ + +\b 6. +\b0 As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.\ +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 1. }Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 2. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 3. }Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 4. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 5. }If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 6. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls6\ilvl0\cf0 {\listtext 7. }Verify that the user has already received a copy of these materials or that you have already sent this user a copy.\ +\pard\pardeftab720\sa240\ql\qnatural +\cf0 For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.\ +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.\ +\pard\pardeftab720\sa240\ql\qnatural + +\b \cf0 7. +\b0 You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls7\ilvl0\cf0 {\listtext 1. }Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\sa240\ql\qnatural +\ls7\ilvl0\cf0 {\listtext 2. }\ +\pard\tx220\tx720\pardeftab720\li720\fi-720\ql\qnatural +\ls7\ilvl0\cf0 {\listtext 3. }Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.\ +\pard\pardeftab720\sa240\ql\qnatural + +\b \cf0 8. +\b0 You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.\ + +\b 9. +\b0 You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.\ + +\b 10. +\b0 Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.\ + +\b 11. +\b0 If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.\ +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.\ +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.\ +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.\ + +\b 12. +\b0 If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.\ + +\b 13. +\b0 The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\ +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.\ + +\b 14. +\b0 If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.\ + +\b NO WARRANTY +\b0 \ + +\b 15. +\b0 BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\ + +\b 16. +\b0 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\ +\pard\pardeftab720\sa300\ql\qnatural + +\b \cf0 END OF TERMS AND CONDITIONS\ +How to Apply These Terms to Your New Libraries\ +\pard\pardeftab720\sa240\ql\qnatural + +\b0 \cf0 If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).\ +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.\ +\pard\pardeftab720\ql\qnatural + +\f3\i \cf0 one line to give the library's name and an idea of what it does. +\f2\i0 \ +Copyright (C) +\f3\i year +\f2\i0 +\f3\i name of author +\f2\i0 \ +\ +This library is free software; you can redistribute it and/or\ +modify it under the terms of the GNU Lesser General Public\ +License as published by the Free Software Foundation; either\ +version 2.1 of the License, or (at your option) any later version.\ +\ +This library 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\ +Lesser General Public License for more details.\ +\ +You should have received a copy of the GNU Lesser General Public\ +License along with this library; if not, write to the Free Software\ +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\ +\pard\pardeftab720\sa240\ql\qnatural + +\f0 \cf0 Also add information on how to contact you by electronic and paper mail.\ +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:\ +\pard\pardeftab720\ql\qnatural + +\f2 \cf0 Yoyodyne, Inc., hereby disclaims all copyright interest in\ +the library `Frob' (a library for tweaking knobs) written\ +by James Random Hacker.\ +\ +\pard\pardeftab720\ql\qnatural + +\f3\i \cf0 signature of Ty Coon +\f2\i0 , 1 April 1990\ +Ty Coon, President of Vice\ +\pard\pardeftab720\sa240\ql\qnatural + +\f0 \cf0 That's all there is to it!\ +} \ No newline at end of file diff --git a/packaging/WELCOME.rtf b/packaging/WELCOME.rtf new file mode 100644 index 0000000..aae1174 --- /dev/null +++ b/packaging/WELCOME.rtf @@ -0,0 +1,24 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1009\cocoasubrtf300 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\margl1440\margr1440\margb1800\margt1800\vieww9000\viewh8400\viewkind0 +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural\pardirnatural + +\f0\fs24 \cf0 This program will install CUPS @CUPS_VERSION@, replacing the CUPS software that is included with Mac OS X.\ +\ + +\b WARNING\ + +\b0 \ +This is pre-release software and should not be used in production environments. Because Mac OS X packages cannot be uninstalled, you will need to reinstall Mac OS X to revert to the original CUPS software.\ +\ +Please report all problems using the Bugs & Features page on the CUPS home page:\ +\ + {\field{\*\fldinst{HYPERLINK "http://www.cups.org/str.php"}}{\fldrslt http://www.cups.org/str.php}}\ +\ + +\b NO WARRANTY\ + +\b0 \ +CUPS is provided under the terms of the GNU General Public License and GNU Library General Public License versions 2. 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.\ +} \ No newline at end of file diff --git a/packaging/cups-desc.plist.in b/packaging/cups-desc.plist.in new file mode 100644 index 0000000..4d1d296 --- /dev/null +++ b/packaging/cups-desc.plist.in @@ -0,0 +1,14 @@ + + + + + IFPkgDescriptionDeleteWarning + + IFPkgDescriptionDescription + CUPS provides a portable printing layer for UNIX(r) operating systems. + IFPkgDescriptionTitle + CUPS + IFPkgDescriptionVersion + @CUPS_RELEASE@ + + diff --git a/packaging/cups-info.plist.in b/packaging/cups-info.plist.in new file mode 100644 index 0000000..d1f6134 --- /dev/null +++ b/packaging/cups-info.plist.in @@ -0,0 +1,26 @@ + + + + + IFPkgFlagAuthorizationAction + RootAuthorization + IFPkgFlagBackgroundAlignment + bottomleft + IFPkgFlagBackgroundScaling + none + IFPkgFormatVersion + 0.1 + CFBundleIdentifier + org.cups.cups + CFBundleName + CUPS + CFBundleGetInfoString + CUPS, @CUPS_VERSION@ + CFBundleShortVersionString + @CUPS_RELEASE@ + IFPkgFlagAllowBackRev + + IFPkgFlagRootVolumeOnly + + + diff --git a/packaging/cups.list.in b/packaging/cups.list.in new file mode 100644 index 0000000..e796759 --- /dev/null +++ b/packaging/cups.list.in @@ -0,0 +1,800 @@ +# +# "$Id: cups.list.in 10439 2012-04-23 23:49:19Z mike $" +# +# ESP Package Manager (EPM) file list for CUPS. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# Product information +%product CUPS +%copyright 2007-2012 by Apple Inc. +%vendor Apple Inc. +#%license LICENSE.txt +%readme LICENSE.txt +%format rpm +# Red Hat and their epochs... +%version 1:@CUPS_VERSION@ +%format !rpm +%version @CUPS_VERSION@ +%format all +%description CUPS is the standards-based, open source printing system developed by +%description Apple Inc. for OS X and other UNIX®-like operating systems. + +%format rpm +%provides lpd +%provides lpr +%provides LPRng +%replaces lpd +%replaces lpr +%replaces LPRng +%requires cups-libs 1:@CUPS_VERSION@ + +# Replace all of the old localization subpackages from CUPS 1.2/1.3 +%replaces cups-da +%replaces cups-de +%replaces cups-es +%replaces cups-et +%replaces cups-fi +%replaces cups-fr +%replaces cups-he +%replaces cups-id +%replaces cups-it +%replaces cups-ja +%replaces cups-ko +%replaces cups-nl +%replaces cups-no +%replaces cups-pl +%replaces cups-pt +%replaces cups-ru +%replaces cups-sv +%replaces cups-zh + + +%format deb +%provides cupsys +%provides cupsys-client +%provides cupsys-bsd +%requires cups-libs + +# Replace all of the old localization subpackages from CUPS 1.2/1.3 +%replaces cups-da +%replaces cups-de +%replaces cups-es +%replaces cups-et +%replaces cups-fi +%replaces cups-fr +%replaces cups-he +%replaces cups-id +%replaces cups-it +%replaces cups-ja +%replaces cups-ko +%replaces cups-nl +%replaces cups-no +%replaces cups-pl +%replaces cups-pt +%replaces cups-ru +%replaces cups-sv +%replaces cups-zh + + +%format pkg +%replaces SUNWlpmsg LP Alerts +%replaces SUNWlpr LP Print Service, (Root) +%replaces SUNWlps LP Print Service - Server, (Usr) +%replaces SUNWlpu LP Print Service - Client, (Usr) +%replaces SUNWpsu LP Print Server, (Usr) +%replaces SUNWpsr LP Print Server, (Root) +%replaces SUNWpcu LP Print Client, (Usr) +%replaces SUNWpcr LP Print Client, (Root) +%replaces SUNWppm +%replaces SUNWmp +%replaces SUNWscplp SunOS Print Compatibility + +%format inst +%replaces patch*.print_*.* 0 0 1289999999 1289999999 +%replaces maint*.print_*.* 0 0 1289999999 1289999999 +%replaces print 0 0 1289999999 1289999999 +%replaces fw_cups 0 0 1289999999 1289999999 +%incompat patch*.print_*.* 0 0 1289999999 1289999999 +%incompat maint*.print_*.* 0 0 1289999999 1289999999 +%incompat print 0 0 1289999999 1289999999 +%incompat fw_cups 0 0 1289999999 1289999999 +%requires cups.sw.libs + +# Replace all of the old localization subpackages from CUPS 1.2/1.3 +%replaces cups.sw.da +%replaces cups.sw.de +%replaces cups.sw.es +%replaces cups.sw.et +%replaces cups.sw.fi +%replaces cups.sw.fr +%replaces cups.sw.he +%replaces cups.sw.id +%replaces cups.sw.it +%replaces cups.sw.ja +%replaces cups.sw.ko +%replaces cups.sw.nl +%replaces cups.sw.no +%replaces cups.sw.pl +%replaces cups.sw.pt +%replaces cups.sw.ru +%replaces cups.sw.sv +%replaces cups.sw.zh + +%format portable +%requires cups-libs + +# Replace all of the old localization subpackages from CUPS 1.2/1.3 +%replaces cups-da +%replaces cups-de +%replaces cups-es +%replaces cups-et +%replaces cups-fi +%replaces cups-fr +%replaces cups-he +%replaces cups-id +%replaces cups-it +%replaces cups-ja +%replaces cups-ko +%replaces cups-nl +%replaces cups-no +%replaces cups-pl +%replaces cups-pt +%replaces cups-ru +%replaces cups-sv +%replaces cups-zh + +%format all + +%subpackage libs +%description Shared libraries +%format deb +%provides libcups1 +%provides libcupsys2 +%provides libcupsys2-gnutls10 +%provides libcupsimage2 +%format all + +%subpackage devel +%description Development environment +%format deb +%provides libcupsys2-dev +%provides libcupsimage2-dev +%format all + +%subpackage lpd +%description LPD support + +%subpackage + + +# +# GNU variables... +# + +$prefix=@prefix@ +$exec_prefix=@exec_prefix@ +$bindir=@bindir@ +$datarootdir=@datarootdir@ +$datadir=@datadir@ +$includedir=@includedir@ +$infodir=@infodir@ +$libdir=@libdir@ +$libexecdir=@libexecdir@ +$localstatedir=@localstatedir@ +$mandir=@mandir@ +$oldincludedir=@oldincludedir@ +$sbindir=@sbindir@ +$sharedstatedir=@sharedstatedir@ +$srcdir=@srcdir@ +$sysconfdir=@sysconfdir@ +$top_srcdir=@top_srcdir@ + +# +# ESP variables... +# + +$AMANDIR=@AMANDIR@ +$BINDIR=@bindir@ +$CACHEDIR=@CUPS_CACHEDIR@ +$DATADIR=@CUPS_DATADIR@ +$DOCDIR=@CUPS_DOCROOT@ +$INCLUDEDIR=${includedir} +$INITDIR=@INITDIR@ +$INITDDIR=@INITDDIR@ +$LIBDIR=${libdir} +$LOCALEDIR=@CUPS_LOCALEDIR@ +$LOGDIR=@CUPS_LOGDIR@ +$MANDIR=@mandir@ +$PAMDIR=@PAMDIR@ +$PMANDIR=@PMANDIR@ +$REQUESTS=@CUPS_REQUESTS@ +$SBINDIR=@sbindir@ +$SERVERBIN=@CUPS_SERVERBIN@ +$SERVERROOT=@CUPS_SERVERROOT@ +$STATEDIR=@CUPS_STATEDIR@ +$XINETD=@XINETD@ +$LIB32DIR=@LIB32DIR@ +$LIB64DIR=@LIB64DIR@ + +$IMGFILTERS=@IMGFILTERS@ +$MDNS=@MDNS@ +$PDFTOPS=@PDFTOPS@ + +$CUPS_USER=@CUPS_USER@ +$CUPS_GROUP=@CUPS_GROUP@ +$CUPS_PRIMARY_SYSTEM_GROUP=@CUPS_PRIMARY_SYSTEM_GROUP@ +$CUPS_PERM=0@CUPS_CONFIG_FILE_PERM@ + +$INSTALLSTATIC=@INSTALLSTATIC@ + +$MAN1EXT=@MAN1EXT@ +$MAN3EXT=@MAN3EXT@ +$MAN5EXT=@MAN5EXT@ +$MAN7EXT=@MAN7EXT@ +$MAN8EXT=@MAN8EXT@ +$MAN8DIR=@MAN8DIR@ + +$DSOLIBS=@DSOLIBS@ + +# Make sure the MD5 password file is now owned by CUPS_USER... +%postinstall if test -f $SERVERROOT/passwd.md5; then +%postinstall chown $CUPS_USER $SERVERROOT/passwd.md5 +%postinstall fi + +# Make sure the shared libraries are refreshed... +%subpackage libs +%system linux +%postinstall ldconfig +%system all +%subpackage + +# Server programs +%system all +# Server files +f 0555 root sys $SBINDIR/cupsd scheduler/cupsd + +d 0755 root sys $SERVERBIN - +%system darwin +d 0755 root sys $SERVERBIN/apple - +f 0555 root sys $SERVERBIN/apple/ipp backend/ipp +l 0755 root sys $SERVERBIN/apple/http ipp +l 0755 root sys $SERVERBIN/apple/https ipp +l 0755 root sys $SERVERBIN/apple/ipps ipp +%system all +d 0755 root sys $SERVERBIN/backend - +f 0500 root sys $SERVERBIN/backend/ipp backend/ipp +l 0700 root sys $SERVERBIN/backend/http ipp +l 0700 root sys $SERVERBIN/backend/https ipp +l 0700 root sys $SERVERBIN/backend/ipps ipp +f 0500 root sys $SERVERBIN/backend/lpd backend/lpd +%if DNSSD_BACKEND +f 0500 root sys $SERVERBIN/backend/dnssd backend/dnssd +l 0700 root sys $SERVERBIN/backend/mdns dnssd +%endif +%system !darwin +f 0555 root sys $SERVERBIN/backend/parallel backend/parallel +%system all +f 0555 root sys $SERVERBIN/backend/serial backend/serial +f 0555 root sys $SERVERBIN/backend/snmp backend/snmp +f 0555 root sys $SERVERBIN/backend/socket backend/socket +f 0555 root sys $SERVERBIN/backend/usb backend/usb +d 0755 root sys $SERVERBIN/cgi-bin - +f 0555 root sys $SERVERBIN/cgi-bin/admin.cgi cgi-bin/admin.cgi +f 0555 root sys $SERVERBIN/cgi-bin/classes.cgi cgi-bin/classes.cgi +f 0555 root sys $SERVERBIN/cgi-bin/help.cgi cgi-bin/help.cgi +f 0555 root sys $SERVERBIN/cgi-bin/jobs.cgi cgi-bin/jobs.cgi +f 0555 root sys $SERVERBIN/cgi-bin/printers.cgi cgi-bin/printers.cgi +d 0755 root sys $SERVERBIN/daemon - +f 0555 root sys $SERVERBIN/daemon/cups-deviced scheduler/cups-deviced +f 0555 root sys $SERVERBIN/daemon/cups-driverd scheduler/cups-driverd +f 0555 root sys $SERVERBIN/daemon/cups-polld scheduler/cups-polld +d 0755 root sys $SERVERBIN/driver - +d 0755 root sys $SERVERBIN/filter - +f 0555 root sys $SERVERBIN/filter/bannertops filter/bannertops +f 0555 root sys $SERVERBIN/filter/commandtoespcx driver/commandtoescpx +f 0555 root sys $SERVERBIN/filter/commandtopclx driver/commandtopclx +f 0555 root sys $SERVERBIN/filter/commandtops filter/commandtops +f 0555 root sys $SERVERBIN/filter/gziptoany filter/gziptoany +%if IMGFILTERS +f 0555 root sys $SERVERBIN/filter/imagetops filter/imagetops +f 0555 root sys $SERVERBIN/filter/imagetoraster filter/imagetoraster +%endif +%if PDFTOPS +f 0555 root sys $SERVERBIN/filter/pdftops filter/pdftops +%endif +f 0555 root sys $SERVERBIN/filter/pstops filter/pstops +f 0555 root sys $SERVERBIN/filter/rastertoespcx driver/rastertoescpx +f 0555 root sys $SERVERBIN/filter/rastertolabel filter/rastertolabel +l 0755 root sys $SERVERBIN/filter/rastertodymo rastertolabel +f 0555 root sys $SERVERBIN/filter/rastertoepson filter/rastertoepson +f 0555 root sys $SERVERBIN/filter/rastertohp filter/rastertohp +f 0555 root sys $SERVERBIN/filter/rastertopclx driver/rastertopclx +f 0555 root sys $SERVERBIN/filter/rastertopwg filter/rastertopwg +f 0555 root sys $SERVERBIN/filter/texttops filter/texttops +d 0755 root sys $SERVERBIN/notifier - +f 0555 root sys $SERVERBIN/notifier/mailto notifier/mailto + +%subpackage lpd +d 0755 root sys $SERVERBIN/daemon - +f 0555 root sys $SERVERBIN/daemon/cups-lpd scheduler/cups-lpd +%subpackage + +# Admin commands +d 0755 root sys $BINDIR - +l 0755 root sys $BINDIR/enable $SBINDIR/cupsaccept +l 0755 root sys $BINDIR/disable $SBINDIR/cupsaccept +d 0755 root sys $LIBDIR - +l 0755 root sys $LIBDIR/accept $SBINDIR/cupsaccept +l 0755 root sys $LIBDIR/lpadmin $SBINDIR/lpadmin +l 0755 root sys $LIBDIR/reject $SBINDIR/cupsaccept +d 0755 root sys $SBINDIR - +l 0755 root sys $SBINDIR/accept cupsaccept +f 0555 root sys $SBINDIR/cupsaccept systemv/cupsaccept +f 0555 root sys $SBINDIR/cupsaddsmb systemv/cupsaddsmb +f 0555 root sys $SBINDIR/cupsctl systemv/cupsctl +l 0755 root sys $SBINDIR/cupsdisable accept +l 0755 root sys $SBINDIR/cupsenable accept +l 0755 root sys $SBINDIR/cupsreject accept +f 0555 root sys $SBINDIR/lpadmin systemv/lpadmin +f 0555 root sys $SBINDIR/lpc berkeley/lpc +f 0555 root sys $SBINDIR/lpinfo systemv/lpinfo +f 0555 root sys $SBINDIR/lpmove systemv/lpmove +l 0755 root sys $SBINDIR/reject cupsaccept + +%system irix +l 0755 root sys /usr/etc/lpc $SBINDIR/lpc +%system all + +# User commands +d 0755 root sys $BINDIR - +f 0555 root sys $BINDIR/cancel systemv/cancel +f 0555 root sys $BINDIR/cupstestdsc systemv/cupstestdsc +f 0555 root sys $BINDIR/cupstestppd systemv/cupstestppd +f 0555 root sys $BINDIR/ipptool test/ipptool +f 0555 root sys $BINDIR/lp systemv/lp +f 0555 root sys $BINDIR/lpoptions systemv/lpoptions +f 0555 root sys $BINDIR/lppasswd systemv/lppasswd +f 0555 root sys $BINDIR/lpq berkeley/lpq +f 0555 root sys $BINDIR/lpr berkeley/lpr +f 0555 root sys $BINDIR/lprm berkeley/lprm +f 0555 root sys $BINDIR/lpstat systemv/lpstat + +%system irix +l 0755 root sys /usr/bsd/lpq $BINDIR/lpq +l 0755 root sys /usr/bsd/lpr $BINDIR/lpr +l 0755 root sys /usr/bsd/lprm $BINDIR/lprm +%system all + +# DSOs +%if DSOLIBS +%subpackage libs +%system hpux +f 0555 root sys $LIBDIR/libcups.sl.2 cups/libcups.sl.2 nostrip() +l 0755 root sys $LIBDIR/libcups.sl libcups.sl.2 +f 0555 root sys $LIBDIR/libcupscgi.sl.1 cgi-bin/libcupscgi.sl.1 nostrip() +l 0755 root sys $LIBDIR/libcupscgi.sl libcupscgi.sl.1 +f 0555 root sys $LIBDIR/libcupsdriver.sl.1 driver/libcupsdriver.sl.1 nostrip() +l 0755 root sys $LIBDIR/libcupsdriver.sl libcupsdriver.sl.1 +f 0555 root sys $LIBDIR/libcupsimage.sl.2 filter/libcupsimage.sl.2 nostrip() +l 0755 root sys $LIBDIR/libcupsimage.sl libcupsimage.sl.2 +f 0555 root sys $LIBDIR/libcupsmime.sl.1 scheduler/libcupsmime.sl.1 nostrip() +l 0755 root sys $LIBDIR/libcupsmime.sl libcupsmime.sl.1 +f 0555 root sys $LIBDIR/libcupsppdc.sl.1 ppdc/libcupsppdc.sl.1 nostrip() +l 0755 root sys $LIBDIR/libcupsppdc.sl libcupsppdc.sl.1 +%system aix +f 0555 root sys $LIBDIR/libcups_s.a cups/libcups_s.a nostrip() +f 0555 root sys $LIBDIR/libcupscgi_s.a cgi-bin/libcupscgi_s.a nostrip() +f 0555 root sys $LIBDIR/libcupsdriver_s.a driver/libcupsdriver_s.a nostrip() +f 0555 root sys $LIBDIR/libcupsimage_s.a filter/libcupsimage_s.a nostrip() +f 0555 root sys $LIBDIR/libcupsmime_s.a scheduler/libcupsmime_s.a nostrip() +f 0555 root sys $LIBDIR/libcupsppdc_s.a ppdc/libcupsppdc_s.a nostrip() +%system darwin +f 0555 root sys $LIBDIR/libcups.2.dylib cups/libcups.2.dylib nostrip() +l 0755 root sys $LIBDIR/libcups.dylib libcups.2.dylib +f 0555 root sys $LIBDIR/libcupscgi.1.dylib cgi-bin/libcupscgi.1.dylib nostrip() +l 0755 root sys $LIBDIR/libcupscgi.dylib libcupscgi.1.dylib +f 0555 root sys $LIBDIR/libcupsdriver.1.dylib driver/libcupsdriver.1.dylib nostrip() +l 0755 root sys $LIBDIR/libcupsdriver.dylib libcupsdriver.1.dylib +f 0555 root sys $LIBDIR/libcupsimage.2.dylib filter/libcupsimage.2.dylib nostrip() +l 0755 root sys $LIBDIR/libcupsimage.dylib libcupsimage.2.dylib +f 0555 root sys $LIBDIR/libcupsmime.1.dylib scheduler/libcupsmime.1.dylib nostrip() +l 0755 root sys $LIBDIR/libcupsmime.dylib libcupsmime.1.dylib +f 0555 root sys $LIBDIR/libcupsppdc.1.dylib ppdc/libcupsppdc.1.dylib nostrip() +l 0755 root sys $LIBDIR/libcupsppdc.dylib libcupsppdc.1.dylib +%system !hpux !aix !darwin +f 0555 root sys $LIBDIR/libcups.so.2 cups/libcups.so.2 nostrip() +l 0755 root sys $LIBDIR/libcups.so libcups.so.2 +f 0555 root sys $LIBDIR/libcupscgi.so.1 cgi-bin/libcupscgi.so.1 nostrip() +l 0755 root sys $LIBDIR/libcupscgi.so libcupscgi.so.1 +f 0555 root sys $LIBDIR/libcupsdriver.so.1 driver/libcupsdriver.so.1 nostrip() +l 0755 root sys $LIBDIR/libcupsdriver.so libcupsdriver.so.1 +f 0555 root sys $LIBDIR/libcupsimage.so.2 filter/libcupsimage.so.2 nostrip() +l 0755 root sys $LIBDIR/libcupsimage.so libcupsimage.so.2 +f 0555 root sys $LIBDIR/libcupsmime.so.1 scheduler/libcupsmime.so.1 nostrip() +l 0755 root sys $LIBDIR/libcupsmime.so libcupsmime.so.1 +f 0555 root sys $LIBDIR/libcupsppdc.so.1 ppdc/libcupsppdc.so.1 nostrip() +l 0755 root sys $LIBDIR/libcupsppdc.so libcupsppdc.so.1 +%system all +%subpackage +%endif + +%if LIB32DIR +%subpackage libs +f 0555 root sys $LIB32DIR/libcups.so.2 cups/libcups.32.so.2 nostrip() +l 0755 root sys $LIB32DIR/libcups.so libcups.so.2 +f 0555 root sys $LIB32DIR/libcupscgi.so.1 cgi-bin/libcupscgi.32.so.1 nostrip() +l 0755 root sys $LIB32DIR/libcupscgi.so libcupscgi.so.1 +f 0555 root sys $LIB32DIR/libcupsdriver.so.1 driver/libcupsdriver.32.so.1 nostrip() +l 0755 root sys $LIB32DIR/libcupsdriver.so libcupsdriver.so.1 +f 0555 root sys $LIB32DIR/libcupsimage.so.2 filter/libcupsimage.32.so.2 nostrip() +l 0755 root sys $LIB32DIR/libcupsimage.so libcupsimage.so.2 +f 0555 root sys $LIB32DIR/libcupsmime.so.1 scheduler/libcupsmime.32.so.1 nostrip() +l 0755 root sys $LIB32DIR/libcupsmime.so libcupsmime.so.1 +f 0555 root sys $LIB32DIR/libcupsppdc.so.1 ppdc/libcupsppdc.32.so.1 nostrip() +l 0755 root sys $LIB32DIR/libcupsppdc.so libcupsppdc.so.1 +%system all +%subpackage +%endif + +%if LIB64DIR +%subpackage libs +f 0555 root sys $LIB64DIR/libcups.so.2 cups/libcups.64.so.2 nostrip() +l 0755 root sys $LIB64DIR/libcups.so libcups.so.2 +f 0555 root sys $LIB64DIR/libcupscgi.so.1 cgi-bin/libcupscgi.64.so.1 nostrip() +l 0755 root sys $LIB64DIR/libcupscgi.so libcupscgi.so.1 +f 0555 root sys $LIB64DIR/libcupsdriver.so.1 driver/libcupsdriver.64.so.1 nostrip() +l 0755 root sys $LIB64DIR/libcupsdriver.so libcupsdriver.so.1 +f 0555 root sys $LIB64DIR/libcupsimage.so.2 filter/libcupsimage.64.so.2 nostrip() +l 0755 root sys $LIB64DIR/libcupsimage.so libcupsimage.so.2 +f 0555 root sys $LIB64DIR/libcupsmime.so.1 scheduler/libcupsmime.64.so.1 nostrip() +l 0755 root sys $LIB64DIR/libcupsmime.so libcupsmime.so.1 +f 0555 root sys $LIB64DIR/libcupsppdc.so.1 ppdc/libcupsppdc.64.so.1 nostrip() +l 0755 root sys $LIB64DIR/libcupsppdc.so libcupsppdc.so.1 +%system all +%subpackage +%endif + +# Directories +d 0755 root sys $LOGDIR - +d 0710 root $CUPS_GROUP $REQUESTS - +d 1770 root $CUPS_GROUP $REQUESTS/tmp - +d 0775 root $CUPS_GROUP $CACHEDIR - +d 0775 root $CUPS_GROUP $CACHEDIR/rss - +#d 0755 root $CUPS_GROUP $CACHEDIR/ppd - +d 0755 root $CUPS_GROUP $STATEDIR - +d 0511 root $CUPS_PRIMARY_SYSTEM_GROUP $STATEDIR/certs - + +# Data files +f 0444 root sys $LOCALEDIR/da/cups_da.po locale/cups_da.po +f 0444 root sys $LOCALEDIR/de/cups_de.po locale/cups_de.po +f 0444 root sys $LOCALEDIR/es/cups_es.po locale/cups_es.po +#f 0444 root sys $LOCALEDIR/et/cups_et.po locale/cups_et.po +f 0444 root sys $LOCALEDIR/eu/cups_eu.po locale/cups_eu.po +f 0444 root sys $LOCALEDIR/fi/cups_fi.po locale/cups_fi.po +f 0444 root sys $LOCALEDIR/fr/cups_fr.po locale/cups_fr.po +#f 0444 root sys $LOCALEDIR/he/cups_he.po locale/cups_he.po +f 0444 root sys $LOCALEDIR/id/cups_id.po locale/cups_id.po +f 0444 root sys $LOCALEDIR/it/cups_it.po locale/cups_it.po +f 0444 root sys $LOCALEDIR/ja/cups_ja.po locale/cups_ja.po +f 0444 root sys $LOCALEDIR/ko/cups_ko.po locale/cups_ko.po +f 0444 root sys $LOCALEDIR/nl/cups_nl.po locale/cups_nl.po +f 0444 root sys $LOCALEDIR/no/cups_no.po locale/cups_no.po +f 0444 root sys $LOCALEDIR/pl/cups_pl.po locale/cups_pl.po +f 0444 root sys $LOCALEDIR/pt/cups_pt.po locale/cups_pt.po +f 0444 root sys $LOCALEDIR/pt_BR/cups_pt_BR.po locale/cups_pt_BR.po +f 0444 root sys $LOCALEDIR/ru/cups_ru.po locale/cups_ru.po +f 0444 root sys $LOCALEDIR/sv/cups_sv.po locale/cups_sv.po +f 0444 root sys $LOCALEDIR/zh/cups_zh.po locale/cups_zh.po +f 0444 root sys $LOCALEDIR/zh_TW/cups_zh_TW.po locale/cups_zh_TW.po + +d 0755 root sys $DATADIR - + +d 0755 root sys $DATADIR/banners - +f 0444 root sys $DATADIR/banners/classified data/classified +f 0444 root sys $DATADIR/banners/confidential data/confidential +f 0444 root sys $DATADIR/banners/secret data/secret +f 0444 root sys $DATADIR/banners/standard data/standard +f 0444 root sys $DATADIR/banners/topsecret data/topsecret +f 0444 root sys $DATADIR/banners/unclassified data/unclassified + +d 0755 root sys $DATADIR/charsets - +f 0444 root sys $DATADIR/charsets/utf-8 data/utf-8 + +d 0755 root sys $DATADIR/data - +f 0444 root sys $DATADIR/data/psglyphs data/psglyphs +f 0444 root sys $DATADIR/data/testprint data/testprint + +d 0755 root sys $DATADIR/drv - +f 0444 root sys $DATADIR/drv/sample.drv ppdc/sample.drv + +d 0755 root sys $DATADIR/examples - +f 0444 root sys $DATADIR/examples examples/*.drv + +d 0755 root sys $DATADIR/fonts - +f 0444 root sys $DATADIR/fonts fonts/Monospace* + +d 0755 root sys $DATADIR/ipptool - +f 0444 root sys $DATADIR/ipptool/create-printer-subscription.test test/create-printer-subscription.test +f 0444 root sys $DATADIR/ipptool/get-completed-jobs.test test/get-completed-jobs.test +f 0444 root sys $DATADIR/ipptool/get-jobs.test test/get-jobs.test +f 0444 root sys $DATADIR/ipptool test/ipp-*.test +f 0444 root sys $DATADIR/ipptool test/testfile.* + +d 0755 root sys $DATADIR/mime - +f 0444 root sys $DATADIR/mime/mime.convs conf/mime.convs +f 0444 root sys $DATADIR/mime/mime.types conf/mime.types + +d 0755 root sys $DATADIR/model - + +d 0755 root sys $DATADIR/ppdc - +f 0444 root sys $DATADIR/ppdc data/*.defs +f 0444 root sys $DATADIR/ppdc data/*.h + +d 0755 root sys $DATADIR/templates - +f 0444 root sys $DATADIR/templates templates/*.tmpl + +## Template files +d 0755 root sys $DATADIR/templates/de +f 0444 root sys $DATADIR/templates/de templates/de/*.tmpl + +d 0755 root sys $DATADIR/templates/es +f 0444 root sys $DATADIR/templates/es templates/es/*.tmpl + +#d 0755 root sys $DATADIR/templates/et +#f 0444 root sys $DATADIR/templates/et templates/et/*.tmpl + +d 0755 root sys $DATADIR/templates/eu +f 0444 root sys $DATADIR/templates/eu templates/eu/*.tmpl + +#d 0755 root sys $DATADIR/templates/fr +#f 0444 root sys $DATADIR/templates/fr templates/fr/*.tmpl + +#d 0755 root sys $DATADIR/templates/he +#f 0444 root sys $DATADIR/templates/he templates/he/*.tmpl + +d 0755 root sys $DATADIR/templates/id +f 0444 root sys $DATADIR/templates/id templates/id/*.tmpl + +d 0755 root sys $DATADIR/templates/it +f 0444 root sys $DATADIR/templates/it templates/it/*.tmpl + +d 0755 root sys $DATADIR/templates/ja +f 0444 root sys $DATADIR/templates/ja templates/ja/*.tmpl + +d 0755 root sys $DATADIR/templates/pl +f 0444 root sys $DATADIR/templates/pl templates/pl/*.tmpl + +d 0755 root sys $DATADIR/templates/ru +f 0444 root sys $DATADIR/templates/ru templates/ru/*.tmpl + +#d 0755 root sys $DATADIR/templates/sv +#f 0444 root sys $DATADIR/templates/sv templates/sv/*.tmpl + +#d 0755 root sys $DATADIR/templates/zh_TW +#f 0444 root sys $DATADIR/templates/zh_TW templates/zh_TW/*.tmpl + +# Config files +d 0755 root sys $SERVERROOT - +d 0755 root $CUPS_GROUP $SERVERROOT/interfaces - +d 0755 root $CUPS_GROUP $SERVERROOT/ppd - +d 0700 root $CUPS_GROUP $SERVERROOT/ssl - +c $CUPS_PERM root $CUPS_GROUP $SERVERROOT/ conf/*.conf +f $CUPS_PERM root $CUPS_GROUP $SERVERROOT/cupsd.conf.default conf/cupsd.conf + +%if PAMDIR +d 0755 root sys $PAMDIR - +c 0644 root sys $PAMDIR/cups conf/@PAMFILE@ +%endif + +%subpackage devel +# Developer files +f 0555 root sys $BINDIR/cups-config cups-config +d 0755 root sys $INCLUDEDIR/cups - +f 0444 root sys $INCLUDEDIR/cups/adminutil.h cups/adminutil.h +f 0444 root sys $INCLUDEDIR/cups/array.h cups/array.h +f 0444 root sys $INCLUDEDIR/cups/backend.h cups/backend.h +f 0444 root sys $INCLUDEDIR/cups/cups.h cups/cups.h +f 0444 root sys $INCLUDEDIR/cups/dir.h cups/dir.h +f 0444 root sys $INCLUDEDIR/cups/driver.h driver/driver.h +f 0444 root sys $INCLUDEDIR/cups/file.h cups/file.h +f 0444 root sys $INCLUDEDIR/cups/http.h cups/http.h +f 0444 root sys $INCLUDEDIR/cups/image.h filter/image.h +f 0444 root sys $INCLUDEDIR/cups/ipp.h cups/ipp.h +f 0444 root sys $INCLUDEDIR/cups/mime.h scheduler/mime.h +f 0444 root sys $INCLUDEDIR/cups/language.h cups/language.h +f 0444 root sys $INCLUDEDIR/cups/ppd.h cups/ppd.h +f 0444 root sys $INCLUDEDIR/cups/raster.h cups/raster.h +f 0444 root sys $INCLUDEDIR/cups/transcode.h cups/transcode.h + +%if INSTALLSTATIC +f 0444 root sys $LIBDIR/libcups.a cups/libcups.a +f 0444 root sys $LIBDIR/libcupscgi.a cgi-bin/libcupscgi.a +f 0444 root sys $LIBDIR/libcupsdriver.a driver/libcupsdriver.a +f 0444 root sys $LIBDIR/libcupsimage.a filter/libcupsimage.a +f 0444 root sys $LIBDIR/libcupsmime.a scheduler/libcupsmime.a +f 0444 root sys $LIBDIR/libcupsppdc.a ppdc/libcupsppdc.a +%endif + +d 0755 root sys $DOCDIR/help - +f 0444 root sys $DOCDIR/help doc/help/api*.html +f 0444 root sys $DOCDIR/help/postscript-driver.html doc/help/postscript-driver.html +f 0444 root sys $DOCDIR/help/ppd-compiler.html doc/help/ppd-compiler.html +f 0444 root sys $DOCDIR/help/raster-driver.html doc/help/raster-driver.html +f 0444 root sys $DOCDIR/help doc/help/spec*.html +%subpackage + +# Documentation files +d 0755 root sys $DOCDIR - +f 0444 root sys $DOCDIR doc/*.css +f 0444 root sys $DOCDIR doc/*.html +d 0755 root sys $DOCDIR/help - +f 0444 root sys $DOCDIR/help/accounting.html doc/help/accounting.html +f 0444 root sys $DOCDIR/help/cgi.html doc/help/cgi.html +f 0444 root sys $DOCDIR/help/glossary.html doc/help/glossary.html +f 0444 root sys $DOCDIR/help/kerberos.html doc/help/kerberos.html +f 0444 root sys $DOCDIR/help/license.html doc/help/license.html +f 0444 root sys $DOCDIR/help/network.html doc/help/network.html +f 0444 root sys $DOCDIR/help/options.html doc/help/options.html +f 0444 root sys $DOCDIR/help/overview.html doc/help/overview.html +f 0444 root sys $DOCDIR/help/policies.html doc/help/policies.html +f 0444 root sys $DOCDIR/help/security.html doc/help/security.html +f 0444 root sys $DOCDIR/help/sharing.html doc/help/sharing.html +f 0444 root sys $DOCDIR/help/standard.html doc/help/standard.html +f 0444 root sys $DOCDIR/help/translation.html doc/help/translation.html +f 0444 root sys $DOCDIR/help/whatsnew.html doc/help/whatsnew.html +f 0444 root sys $DOCDIR/help doc/help/man-*.html +f 0444 root sys $DOCDIR/help doc/help/ref-*.html +d 0755 root sys $DOCDIR/images - +f 0444 root sys $DOCDIR/images doc/images/*.gif +f 0444 root sys $DOCDIR/images doc/images/*.jpg +f 0444 root sys $DOCDIR/images doc/images/*.png +f 0444 root sys $DOCDIR/robots.txt doc/robots.txt + +# Localized documentation files +d 0755 root sys $DOCDIR/de +f 0444 root sys $DOCDIR/de doc/de/*.html + +d 0755 root sys $DOCDIR/es +f 0444 root sys $DOCDIR/es doc/es/*.html + +#d 0755 root sys $DOCDIR/et +#f 0444 root sys $DOCDIR/et doc/et/*.html + +d 0755 root sys $DOCDIR/eu +f 0444 root sys $DOCDIR/eu doc/eu/*.html + +#d 0755 root sys $DOCDIR/fr +#f 0444 root sys $DOCDIR/fr doc/fr/*.html + +#d 0755 root sys $DOCDIR/he +#f 0444 root sys $DOCDIR/he doc/he/*.html +#f 0444 root sys $DOCDIR/he/cups.css doc/he/cups.css + +d 0755 root sys $DOCDIR/id +f 0444 root sys $DOCDIR/id doc/id/*.html + +d 0755 root sys $DOCDIR/it +f 0444 root sys $DOCDIR/it doc/it/*.html + +d 0755 root sys $DOCDIR/ja +f 0444 root sys $DOCDIR/ja doc/ja/*.html + +d 0755 root sys $DOCDIR/pl +f 0444 root sys $DOCDIR/pl doc/pl/*.html + +d 0755 root sys $DOCDIR/ru +f 0444 root sys $DOCDIR/ru doc/ru/*.html + +#d 0755 root sys $DOCDIR/sv +#f 0444 root sys $DOCDIR/sv doc/sv/*.html + +#d 0755 root sys $DOCDIR/zh_TW +#f 0444 root sys $DOCDIR/zh_TW doc/zh_TW/*.html + +# Man pages +d 0755 root sys $AMANDIR - +d 0755 root sys $AMANDIR/man$MAN8DIR - +d 0755 root sys $MANDIR - +d 0755 root sys $MANDIR/man1 - +d 0755 root sys $MANDIR/man5 - +d 0755 root sys $MANDIR/man7 - + +f 0444 root sys $MANDIR/man1/cancel.$MAN1EXT man/cancel.$MAN1EXT +f 0444 root sys $MANDIR/man1/cupstestdsc.$MAN1EXT man/cupstestdsc.$MAN1EXT +f 0444 root sys $MANDIR/man1/cupstestppd.$MAN1EXT man/cupstestppd.$MAN1EXT +f 0444 root sys $MANDIR/man1/ipptool.$MAN1EXT man/ipptool.$MAN1EXT +f 0444 root sys $MANDIR/man1/lpoptions.$MAN1EXT man/lpoptions.$MAN1EXT +f 0444 root sys $MANDIR/man1/lppasswd.$MAN1EXT man/lppasswd.$MAN1EXT +f 0444 root sys $MANDIR/man1/lpq.$MAN1EXT man/lpq.$MAN1EXT +f 0444 root sys $MANDIR/man1/lprm.$MAN1EXT man/lprm.$MAN1EXT +f 0444 root sys $MANDIR/man1/lpr.$MAN1EXT man/lpr.$MAN1EXT +f 0444 root sys $MANDIR/man1/lpstat.$MAN1EXT man/lpstat.$MAN1EXT +f 0444 root sys $MANDIR/man1/lp.$MAN1EXT man/lp.$MAN1EXT + +f 0444 root sys $MANDIR/man5/classes.conf.$MAN5EXT man/classes.conf.$MAN5EXT +f 0444 root sys $MANDIR/man5/cupsd.conf.$MAN5EXT man/cupsd.conf.$MAN5EXT +f 0444 root sys $MANDIR/man5/ipptoolfile.$MAN5EXT man/ipptoolfile.$MAN5EXT +f 0444 root sys $MANDIR/man5/mailto.conf.$MAN5EXT man/mailto.conf.$MAN5EXT +f 0444 root sys $MANDIR/man5/mime.convs.$MAN5EXT man/mime.convs.$MAN5EXT +f 0444 root sys $MANDIR/man5/mime.types.$MAN5EXT man/mime.types.$MAN5EXT +f 0444 root sys $MANDIR/man5/printers.conf.$MAN5EXT man/printers.conf.$MAN5EXT + +l 0644 root sys $AMANDIR/man$MAN8DIR/accept.$MAN8EXT cupsaccept.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsaccept.$MAN8EXT man/cupsaccept.$MAN8EXT +l 0644 root sys $AMANDIR/man$MAN8DIR/cupsreject.$MAN8EXT cupsaccept.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsaddsmb.$MAN8EXT man/cupsaddsmb.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsctl.$MAN8EXT man/cupsctl.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsfilter.$MAN8EXT man/cupsfilter.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cups-polld.$MAN8EXT man/cups-polld.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsd.$MAN8EXT man/cupsd.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/cupsenable.$MAN8EXT man/cupsenable.$MAN8EXT +l 0644 root sys $AMANDIR/man$MAN8DIR/cupsdisable.$MAN8EXT cupsenable.$MAN8EXT +l 0644 root sys $AMANDIR/man$MAN8DIR/disable.$MAN8EXT cupsenable.$MAN8EXT +l 0644 root sys $AMANDIR/man$MAN8DIR/enable.$MAN8EXT cupsenable.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/lpadmin.$MAN8EXT man/lpadmin.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/lpc.$MAN8EXT man/lpc.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/lpinfo.$MAN8EXT man/lpinfo.$MAN8EXT +f 0444 root sys $AMANDIR/man$MAN8DIR/lpmove.$MAN8EXT man/lpmove.$MAN8EXT +l 0644 root sys $AMANDIR/man$MAN8DIR/reject.$MAN8EXT cupsaccept.$MAN8EXT + +%subpackage devel +f 0444 root sys $MANDIR/man1/cups-config.$MAN1EXT man/cups-config.$MAN1EXT +f 0444 root sys $MANDIR/man1/ man/ppd*.$MAN1EXT +f 0444 root sys $MANDIR/man5/ppdcfile.$MAN5EXT man/ppdcfile.$MAN5EXT +f 0444 root sys $MANDIR/man7/backend.$MAN7EXT man/backend.$MAN7EXT +f 0444 root sys $MANDIR/man7/filter.$MAN7EXT man/filter.$MAN7EXT +f 0444 root sys $MANDIR/man7/notifier.$MAN7EXT man/notifier.$MAN7EXT + +%subpackage lpd +d 0755 root sys $AMANDIR/man$MAN8DIR - +f 0444 root sys $AMANDIR/man$MAN8DIR/cups-lpd.$MAN8EXT man/cups-lpd.$MAN8EXT +%subpackage + +# Startup scripts +%system darwin +f 0444 root sys /System/Library/LaunchDaemons/org.cups.cupsd.plist scheduler/org.cups.cupsd.plist +%preremove <. +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 1999-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# Conditional build options (--with name/--without name): +# +# dbus - Enable/disable DBUS support (default = enable) +# dnssd - Enable/disable DNS-SD support (default = disable) +# php - Enable/disable PHP support (default = enable) +# static - Enable/disable static libraries (default = enable) + +%{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}} +%{?_with_dbus: %define _dbus --enable-dbus} +%{!?_with_dbus: %define _dbus --disable-dbus} + +#%{!?_with_php: %{!?_without_php: %define _with_php --with-php}} +#%{?_with_php: %define _php --with-php} +#%{!?_with_php: %define _php --without-php} + +#%{!?_with_static: %{!?_without_static: %define _without_static --without-static}} +#%{?_with_static: %define _static --enable-static} +#%{!?_with_static: %define _static --disable-static} + +%define _unpackaged_files_terminate_build 0 + +Summary: CUPS +Name: cups +Version: 1.5.3 +Release: 11 +#Epoch: 1 +License: GPL +Group: System Environment/Daemons +#Source: http://ftp.easysw.com/pub/cups/1.5.3/cups-1.5.3-source.tar.bz2 +Source: %{name}-%{version}.tar.gz +Url: http://www.cups.org +Packager: Anonymous +Vendor: Apple Inc. + +# Use buildroot so as not to disturb the version already installed +#BuildRoot: /tmp/%{name}-root + +# Dependencies... +Requires: %{name}-libs +Requires(post): eglibc +BuildRequires: pkgconfig(gnutls) +BuildRequires: pkgconfig(poppler) = 0.20.0 +BuildRequires: pkgconfig(poppler-glib) = 0.20.0 +BuildRequires: pkgconfig(ijs) +BuildRequires: pkgconfig(lcms2) = 2.3 +BuildRequires: xpdf-tools = 3.02 +BuildRequires: libjpeg-devel +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(libusb) +BuildRequires: pkgconfig(fontconfig) +BuildRequires: pkgconfig(freetype2) +BuildRequires: libgcrypt-devel +BuildRequires: avahi-libs +BuildRequires: avahi-devel +#BuildRequires: pkgconfig(po4a) +Obsoletes: lpd, lpr, LPRng +Provides: lpd, lpr, LPRng +Obsoletes: cups-da, cups-de, cups-es, cups-et, cups-fi, cups-fr, cups-he +Obsoletes: cups-id, cups-it, cups-ja, cups-ko, cups-nl, cups-no, cups-pl +Obsoletes: cups-pt, cups-ru, cups-sv, cups-zh + +%package devel +Summary: CUPS - development environment +Group: Development/Libraries +Requires: %{name}-libs +#Requires: %{name}-libs = %{epoch}:%{version} + +%package libs +Summary: CUPS - shared libraries +Group: System Environment/Libraries +Provides: libcups1 + +%package -n cups-data +Summary: CUPS - shared libraries +Group: System Environment/Libraries + +#%package lpd +#Summary: CUPS - LPD support +#Group: System Environment/Daemons +#Requires: %{name} = %{epoch}:%{version} xinetd + +#%if %{?_with_php:1}%{!?_with_php:0} +#%package php +#Summary: CUPS - PHP support +#Group: Development/Languages +#Requires: %{name}-libs = %{epoch}:%{version} +#%endif + +%description +CUPS is the standards-based, open source printing system developed by +Apple Inc. for OS X and other UNIX®-like operating systems. + +%description devel +This package provides the CUPS headers and development environment. + +%description libs +This package provides the CUPS shared libraries. + +%description -n cups-data +This package provides CUPS configuration files + +#%description lpd +#This package provides LPD client support. + +#%if %{?_with_php:1}%{!?_with_php:0} +#%description php +#This package provides PHP support for CUPS. +#%endif + +%prep +%setup -q + +%build +%configure %{_dbus} %{_dnssd} %{_php} %{_static} \ + --without-mandir \ + --without-docdir \ + --localedir=/usr/share/cups/locale \ + --sysconfdir=/opt/etc \ + --localstatedir=/opt/var \ + --disable-mallinfo \ + --disable-libpaper \ + --disable-libusb \ + --disable-tcp-wrappers \ + --disable-acl \ + --disable-dbus \ + --without-dbusdir \ + --disable-unit-tests \ + --disable-relro \ + --enable-image \ + --enable-jpeg \ + --enable-png \ + --disable-tiff \ + --disable-slp \ + --disable-ldap \ + --enable-gssapi \ + --enable-threads \ + --enable-debug \ + --disable-cdsassl \ + --enable-gnutls \ + --disable-openssl \ + --enable-ssl \ + --enable-avahi \ + --disable-pam \ + --enable-largefile \ + --disable-launchd \ + --enable-raw-printing \ + --enable-bannertops \ + --enable-texttops \ + --disable-pap \ + --without-java --without-php --without-python --without-perl --disable-webif \ + --with-languages=en --without-smfmanifestdir \ + --with-local_protocols='CUPS dnssd' --with-printcap=/opt/etc/cups/printcap \ + --with-remote_protocols='CUPS dnssd' --with-log-level=debug + +# If we got this far, all prerequisite libraries must be here. +make -Ioprs -Iopvp -I../opvp -I../.. -I. -I.. -I/usr/include/poppler -I/usr/include/ijs + +%install +# Make sure the RPM_BUILD_ROOT directory exists. +rm -rf $RPM_BUILD_ROOT + +make BUILDROOT=$RPM_BUILD_ROOT install + +%post +#if [ ! -z "`getent group app`" ]; then + chown -R 5000:5000 /usr/lib/cups/backend/* +#fi + +if [ "$1" = configure ]; then + # Set up lpadmin group. + #if [ -z "`getent group lpadmin`" ]; then + # addgroup --system lpadmin + #fi + + db_get cupsys/backend && SELECTED=$RET + # We remove the scsi backend from the output as it got removed in CUPS 1.5.0 + list=`echo $SELECTED | sed -e 's/, /,/g' | sed -e 's/scsi,*//g' | sed -e 's/parallel,*//g' | sed -e 's/serial,*//g'` + if dpkg --compare-versions "$2" lt-nl "1.5.3-3"; then + if ! echo $list | grep -q "\bipp14\b"; then + list=`echo $list | sed -e 's/\bipp\b/ipp,ipp14/g'` + fi + fi + save_IFS=$IFS + IFS=, + (cd /usr/lib/cups/backend && rm -f http https ipp ipp14 ipps lpd socket usb snmp dnssd mdns) + for module in $list; do + ln /usr/lib/cups/backend-available/$module /usr/lib/cups/backend/$module + if [ "$module" = "ipp" ]; then + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/http + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/https + ln /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipps + fi + if [ "$module" = "dnssd" ]; then + ln /usr/lib/cups/backend/dnssd /usr/lib/cups/backend/mdns + fi + done + IFS=$save_IFS + + # Resync Debconf database with real state + list=`( cd /usr/lib/cups/backend && for f in ipp ipp14 lpd socket usb snmp dnssd; do [ -e $f ] && echo -n "$f, "; done ) | sed -e 's/, $//'` + db_set cupsys/backend $list; + + if dpkg --compare-versions "$2" lt "1.5.3-3"; then + modprobe usblp >/dev/null 2>&1 || : + fi +fi +mv /usr/lib/cups/backend/ipp /usr/lib/cups/backend/ipp15 +mv /usr/lib/cups/backend/ipp14 /usr/lib/cups/backend/ipp + +%post -n cups-data +mkdir -p /opt/var/run/cups +mkdir -p /opt/var/spool/ +mkdir -p /opt/var/spool/cups/ +mkdir -p /opt/vat/spool/cups/tmp +mkdir -p /opt/var/cache/cups +mkdir -p /opt/var/log/cups + +#if [ ! -z "`getent group app`" ]; then + chown -R 5000:5000 /opt/etc/cups/ + chown -R 5000:5000 /opt/var/run/cups/ + chown -R 5000:5000 /opt/var/spool/cups/ + chown -R 5000:5000 /opt/var/cache/cups/ + chown -R 5000:5000 /opt/var/log/cups/ + chown -R 5000:5000 /usr/lib/cups/backend/* +#fi + +if [ -e /opt/etc/default/cups ]; then + . /opt/etc/default/cups +fi + +if [ "$1" = configure ]; then + if [ ! -e /opt/etc/cups/raw.types ]; then + cat >/opt/etc/cups/raw.types </opt/etc/cups/raw.convs < /opt/etc/cups/raw.convs + else + sed 's/^application/#application/' \ + < /opt/etc/cups/raw.convs-convert > /opt/etc/cups/raw.convs + fi + rm -f /opt/etc/cups/raw.convs-convert + fi + + if [ -f /opt/etc/cups/classes.conf ]; then + chown 5000:5000 /opt/etc/cups/classes.conf ; chmod 600 /opt/etc/cups/classes.conf + fi + if [ -f /opt/etc/cups/printers.conf ]; then + chown 5000:5000 /opt/etc/cups/printers.conf ; chmod 600 /opt/etc/cups/printers.conf + fi + + # symlink snakeoil SSL certificate if present + if [ -e /opt/etc/ssl/certs/ssl-cert-snakeoil.pem -a \ + -e /opt/etc/ssl/private/ssl-cert-snakeoil.key -a \ + -n "`getent group ssl-cert`" -a ! -e /opt/etc/cups/ssl/server.crt \ + -a ! -e /opt/etc/cups/ssl/server.key -a ! -h /opt/etc/cups/ssl/server.crt \ + -a ! -h /opt/etc/cups/ssl/server.key ]; then + ln -s /opt/etc/ssl/certs/ssl-cert-snakeoil.pem /opt/etc/cups/ssl/server.crt + ln -s /opt/etc/ssl/private/ssl-cert-snakeoil.key /opt/etc/cups/ssl/server.key + fi + + APP_PROFILE=/opt/etc/apparmor.d/usr.sbin.cupsd + if [ -f "$APP_PROFILE" ]; then + # Add the local/ include + LOCAL_APP_PROFILE=/opt/etc/apparmor.d/local/usr.sbin.cupsd + + [ -e "$LOCAL_APP_PROFILE" ] || \ + [ -e /opt/etc/apparmor.d/local -a ! -d /opt/etc/apparmor.d/local ] || { + tmp=`mktemp` + cat < "$tmp" +# Site-specific additions and overrides for usr.sbin.cupsd. +# For more details, please see /etc/apparmor.d/local/README. +EOM + mkdir `dirname $LOCAL_APP_PROFILE` 2>/dev/null || true + mv -f "$tmp" "$LOCAL_APP_PROFILE" + chmod 644 "$LOCAL_APP_PROFILE" + } + + # Reload the profile, including any abstraction updates + if aa-status --enabled 2>/dev/null; then + apparmor_parser -r -T -W "$APP_PROFILE" || true + fi + fi + + # Clear cache if we upgrade to 1.4.x + if dpkg --compare-versions "$2" lt-nl "1.4.1-5"; then + rm /opt/var/cache/cups/* 2> /dev/null || : + fi + + # Clear PPD cache if we upgrade to 1.5.x + if dpkg --compare-versions "$2" lt-nl "1.5.0-3"; then + rm /opt/var/cache/cups/ppds.dat 2> /dev/null || : + fi + + # Manage printcap file and associated symlinks + if [ -e /opt/etc/cups/cupsd.conf ]; then + if [ -e /opt/etc/cups/printcap.cups ]; then + rm -f /opt/etc/cups/printcap.cups + fi + if [ -L /opt/etc/cups/printcap -a ! -e /opt/etc/cups/printcap ]; then + + printcap_file=`egrep '^Printcap ' /opt/etc/cups/cupsd.conf | awk '{print $2}' | tail -n 1` + if [ -z "$printcap_file" ]; then + printcap_file=/opt/var/run/cups/printcap + fi + if [ ! -e /opt/etc/cups/printcap -a -e $printcap_file ]; then + ln -s $printcap_file /opt/etc/cups/printcap + fi + fi + fi +fi + +if which lpstat > /dev/null 2>&1 && \ + which lpinfo > /dev/null 2>&1 && \ + which lpadmin > /dev/null 2>&1 && \ + LC_ALL=C lpstat -h /opt/var/run/cups/cups.sock -r | grep -v not > /dev/null 2>&1; then + + tempfiles= + trap 'rm -f $tempfiles; exit 0' 0 HUP INT QUIT ILL ABRT PIPE TERM + tmpfile0=`mktemp -t updateppds.XXXXXX` + tempfiles="$tempfiles $tmpfile0" + + lpinfo -h /opt/var/run/cups/cups.sock -m > $tmpfile0 + + + if [ "$1" = triggered ] || [ "$1" = configure ] ; then + # Update external drivers' queues. + # + # We log the modification dates of the file in + # /usr/share/cups/ppd-updaters/* after updating the PPDs + # according to them. These dates are more or less the creation + # dates of the driver packages. Then we only update the PPDs of + # packages, where the /usr/share/cups/ppd-updaters/* file has a + # modification date different to the logged date as this means + # that a fresh /usr/share/cups/ppd-updaters/* file and + # therefore a fresh package got installed. This avoids updating + # of PPDs when the corresponding package was not changed. + logfile=/opt/var/cache/cups/ppd-updates + touch $logfile + for driverfile in `ls /usr/share/cups/ppd-updaters`; do + driver=`echo $driverfile | perl -p -e 's/\.ppd-updater$//' | perl -p -e 's/^printer-driver-//'` + modtime=`ls -l --time-style=+%s /usr/share/cups/ppd-updaters/$driverfile | perl -p -e 's/^\s*\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)\s+(\S+)\s*$/$1\n/'` + oldmodtime=`cat $logfile | grep " $driver$" | cut -d ' ' -f 1` + if [ "$modtime" != "$oldmodtime" ]; then + echo "Updating PPD files for $driver ..." + . /usr/share/cups/ppd-updaters/${driverfile} + ppd_updater "${DRIVER_REGEXP}" "${GENNICKNAME_REGEXP}" + cat $logfile | grep -v " $driver$" > $logfile.new || touch $logfile.new + echo "$modtime $driver" >> $logfile.new + mv $logfile.new $logfile + fi + done + fi +fi +db_stop +exit 0 + +%post libs +/sbin/ldconfig + +%preun +#if test $1 = 0; then +# /sbin/service cups stop +# /sbin/chkconfig --del cups +#fi + +%postun +#if test $1 -ge 1; then +# /sbin/service cups stop +# /sbin/service cups start +#fi + +%postun libs +/sbin/ldconfig + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +#%docdir /usr/share/doc/cups +#%manifest cups.manifest +%defattr(-,root,root) + +#%if %{?_with_dbus:1}%{!?_with_dbus:0} +# DBUS +#/etc/dbus-1/system.d/* +#%endif + +# PAM +#%dir /etc/pam.d +#/etc/pam.d/* + +# RC dirs are a pain under Linux... Uncomment the appropriate ones if you +# don't use Red Hat or Mandrake... + +#/etc/init.d/* +#/etc/rc0.d/* +#/etc/rc2.d/* +#/etc/rc3.d/* +#/etc/rc5.d/* + +# OLD RedHat/Mandrake +#/etc/rc.d/init.d/* +#/etc/rc.d/rc0.d/* +#/etc/rc.d/rc2.d/* +#/etc/rc.d/rc3.d/* +#/etc/rc.d/rc5.d/* + +#/sbin/rc.d/* +#/sbin/rc.d/rc0.d/* +#/sbin/rc.d/rc2.d/* +#/sbin/rc.d/rc3.d/* +#/sbin/rc.d/rc5.d/* +/usr/bin/ppd* +/usr/bin/cancel +/usr/bin/cupstestdsc +/usr/bin/cupstestppd +/usr/bin/ipptool +/usr/bin/lp +/usr/bin/lpoptions +/usr/bin/lppasswd +/usr/bin/lpstat +%attr(0755,root,root) %dir /usr/lib/cups +%attr(0755,root,root) %dir /usr/lib/cups/backend +/usr/lib/cups/backend/dnssd +/usr/lib/cups/backend/http +/usr/lib/cups/backend/https +/usr/lib/cups/backend/ipp +/usr/lib/cups/backend/ipp14 +/usr/lib/cups/backend/ipps +/usr/lib/cups/backend/lpd +#/usr/lib/cups/backend/parallel +#/usr/lib/cups/backend/serial +/usr/lib/cups/backend/snmp +/usr/lib/cups/backend/socket +/usr/lib/cups/backend/usb +%attr(0755,root,root) %dir /usr/lib/cups/cgi-bin +/usr/lib/cups/cgi-bin/* +%attr(0755,root,root) %dir /usr/lib/cups/daemon +/usr/lib/cups/daemon/cups-deviced +/usr/lib/cups/daemon/cups-driverd +/usr/lib/cups/daemon/cups-exec +/usr/lib/cups/daemon/cups-polld +%dir /usr/lib/cups/driver +%attr(0755,root,root) %dir /usr/lib/cups/filter +%exclude /usr/lib/cups/filter/commandtoescpx +%exclude /usr/lib/cups/filter/commandtopclx +%exclude /usr/lib/cups/filter/imagetops +%exclude /usr/lib/cups/filter/imagetoraster +%exclude /usr/lib/cups/filter/pdftops +%exclude /usr/lib/cups/filter/rastertoescpx +%exclude /usr/lib/cups/filter/rastertopclx +%exclude /usr/lib/cups/filter/texttops +/usr/lib/cups/filter/* +%attr(0755,root,root) %dir /usr/lib/cups/monitor +/usr/lib/cups/monitor/* +%attr(0755,root,root) %dir /usr/lib/cups/notifier +/usr/lib/cups/notifier/* + +%attr(0755,root,root) %dir /usr/sbin/ +%attr(0755,root,root) /usr/sbin/* +%attr(-,root,root) %dir /usr/share/cups +#%dir /usr/share/cups/banners +#/usr/share/cups/banners/* +%dir /usr/share/cups/charsets +/usr/share/cups/charsets/* +#%dir /usr/share/cups/data +#/usr/share/cups/data/* +#%dir /usr/share/cups/drv +#/usr/share/cups/drv/* +%dir /usr/share/cups/fonts +/usr/share/cups/fonts/* +#%dir /usr/share/cups/ipptool +#/usr/share/cups/ipptool/* +%dir /usr/share/cups/mime +/usr/share/cups/mime/* +%dir /usr/share/cups/model +%dir /usr/share/cups/ppdc +/usr/share/cups/ppdc/* +#%dir /usr/share/cups/templates +#/usr/share/cups/templates/* +#%dir /usr/share/doc/cups +#/usr/share/doc/cups/*.* +#%dir /usr/share/doc/cups/de +#/usr/share/doc/cups/de/* +#%dir /usr/share/doc/cups/es +#/usr/share/doc/cups/es/* +#%dir /usr/share/doc/cups/eu +#/usr/share/doc/cups/eu/* +#%dir /usr/share/doc/cups/fr +#/usr/share/doc/cups/fr/* +#%dir /usr/share/doc/cups/hu +#/usr/share/doc/cups/hu/* +#%dir /usr/share/doc/cups/id +#/usr/share/doc/cups/id/* +#%dir /usr/share/doc/cups/it +#/usr/share/doc/cups/it/* +#%dir /usr/share/doc/cups/ja +#/usr/share/doc/cups/ja/* +#%dir /usr/share/doc/cups/pl +#/usr/share/doc/cups/pl/* +#%dir /usr/share/doc/cups/ru +#/usr/share/doc/cups/ru/* +#%dir /usr/share/doc/cups/help +#/usr/share/doc/cups/help/accounting.html +#/usr/share/doc/cups/help/cgi.html +#/usr/share/doc/cups/help/glossary.html +#/usr/share/doc/cups/help/kerberos.html +#/usr/share/doc/cups/help/license.html +#/usr/share/doc/cups/help/man-*.html +#/usr/share/doc/cups/help/network.html +#/usr/share/doc/cups/help/options.html +#/usr/share/doc/cups/help/overview.html +#/usr/share/doc/cups/help/policies.html +#/usr/share/doc/cups/help/ref-*.html +#/usr/share/doc/cups/help/security.html +#/usr/share/doc/cups/help/sharing.html +#/usr/share/doc/cups/help/standard.html +#/usr/share/doc/cups/help/translation.html +#/usr/share/doc/cups/help/whatsnew.html +#%dir /usr/share/doc/cups/images +#/usr/share/doc/cups/images/* +#/usr/share/locale/* + +#%dir /usr/share/man/man1 +#/usr/share/man/man1/cancel.1.gz +#/usr/share/man/man1/cupstestdsc.1.gz +#/usr/share/man/man1/cupstestppd.1.gz +#/usr/share/man/man1/ipptool.1.gz +#/usr/share/man/man1/lp.1.gz +#/usr/share/man/man1/lpoptions.1.gz +#/usr/share/man/man1/lppasswd.1.gz +#/usr/share/man/man1/lpq.1.gz +#/usr/share/man/man1/lpr.1.gz +#/usr/share/man/man1/lprm.1.gz +#/usr/share/man/man1/lpstat.1.gz +#%dir /usr/share/man/man5 +#/usr/share/man/man5/*.conf.5.gz +#/usr/share/man/man5/ipptoolfile.5.gz +#/usr/share/man/man5/mime.*.5.gz +#%dir /usr/share/man/man8 +#/usr/share/man/man8/accept.8.gz +#/usr/share/man/man8/cupsaddsmb.8.gz +#/usr/share/man/man8/cupsaccept.8.gz +#/usr/share/man/man8/cupsctl.8.gz +#/usr/share/man/man8/cupsfilter.8.gz +#/usr/share/man/man8/cupsd.8.gz +#/usr/share/man/man8/cupsdisable.8.gz +#/usr/share/man/man8/cupsenable.8.gz +#/usr/share/man/man8/cupsreject.8.gz +#/usr/share/man/man8/cups-deviced.8.gz +#/usr/share/man/man8/cups-driverd.8.gz +#/usr/share/man/man8/cups-polld.8.gz +#/usr/share/man/man8/lpadmin.8.gz +#/usr/share/man/man8/lpc.8.gz +#/usr/share/man/man8/lpinfo.8.gz +#/usr/share/man/man8/lpmove.8.gz +#/usr/share/man/man8/reject.8.gz + +# Desktop files +#/usr/share/applications/* +#/usr/share/icons/* + +%files devel +%defattr(-,root,root) +#%dir /usr/share/cups/examples +#/usr/share/cups/examples/* +#%dir /usr/share/man/man1 +#/usr/share/man/man1/cups-config.1.gz +#/usr/share/man/man1/ppd*.1.gz +#%dir /usr/share/man/man5 +#/usr/share/man/man5/ppdcfile.5.gz +#/usr/share/man/man7/backend.7.gz +#/usr/share/man/man7/filter.7.gz +#/usr/share/man/man7/notifier.7.gz +/usr/bin/cups-config +%dir /usr/include/cups +/usr/include/cups/* +/usr/lib/*.so +#%if %{?_with_static:1}%{!?_with_static:0} +#/usr/lib*/*.a +#%endif +#%dir /usr/share/doc/cups/help +#/usr/share/doc/cups/help/api*.html +#/usr/share/doc/cups/help/postscript-driver.html +#/usr/share/doc/cups/help/ppd-compiler.html +#/usr/share/doc/cups/help/raster-driver.html +#/usr/share/doc/cups/help/spec*.html + +%files libs +%defattr(-,root,root) +/usr/lib/*.so.* + +%files -n cups-data +%defattr(-,root,root) +%attr(0755,app,app) %dir /opt/etc/cups +%config(noreplace) /opt/etc/cups/*.conf +/opt/etc/cups/cupsd.conf.default +%dir /opt/etc/cups/interfaces +%attr(0755,app,app) %dir /opt/etc/cups/ppd +%attr(0700,app,app) %dir /opt/etc/cups/ssl +%attr(0755,app,app) %dir /opt/var/cache/cups +%attr(0775,app,app) %dir /opt/var/cache/cups/rss +%attr(0755,app,app) %dir /opt/var/log/cups +%attr(0755,app,app) %dir /opt/var/run/cups +%attr(0711,lp,sys) %dir /opt/var/run/cups/certs +%attr(0755,app,app) %dir /opt/var/spool/cups +%attr(1777,app,app) %dir /opt/var/spool/cups/tmp + +#%files lpd +#%defattr(-,app,app) +#/opt/etc/xinetd.d/cups-lpd +#%dir /usr/lib/cups +#%dir /usr/lib/cups/daemon +#/usr/lib/cups/daemon/cups-lpd +#%dir /usr/share/man/man8 +#/usr/share/man/man8/cups-lpd.8.gz + +#%if %{?_with_php:1}%{!?_with_php:0} +#%files php +## PHP +#/usr/lib*/php* +#%endif + + +# +# End of "$Id: cups.spec.in 10428 2012-04-23 17:46:53Z mike $". +# diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in new file mode 100644 index 0000000..004258a --- /dev/null +++ b/packaging/cups.spec.in @@ -0,0 +1,389 @@ +# +# "$Id: cups.spec.in 10428 2012-04-23 17:46:53Z mike $" +# +# RPM "spec" file for CUPS. +# +# Original version by Jason McMullan . +# +# Copyright 2007-2012 by Apple Inc. +# Copyright 1999-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# Conditional build options (--with name/--without name): +# +# dbus - Enable/disable DBUS support (default = enable) +# dnssd - Enable/disable DNS-SD support (default = disable) +# php - Enable/disable PHP support (default = enable) +# static - Enable/disable static libraries (default = enable) + +%{!?_with_dbus: %{!?_without_dbus: %define _with_dbus --with-dbus}} +%{?_with_dbus: %define _dbus --enable-dbus} +%{!?_with_dbus: %define _dbus --disable-dbus} + +%{!?_with_dnssd: %{!?_without_dnssd: %define _with_dnssd --with-dnssd}} +%{?_with_dnssd: %define _dnssd --enable-dnssd} +%{!?_with_dnssd: %define _dnssd --disable-dnssd} + +%{!?_with_php: %{!?_without_php: %define _with_php --with-php}} +%{?_with_php: %define _php --with-php} +%{!?_with_php: %define _php --without-php} + +%{!?_with_static: %{!?_without_static: %define _without_static --without-static}} +%{?_with_static: %define _static --enable-static} +%{!?_with_static: %define _static --disable-static} + +Summary: CUPS +Name: cups +Version: @CUPS_VERSION@ +Release: 0 +Epoch: 1 +License: GPL +Group: System Environment/Daemons +Source: http://ftp.cups.org/pub/cups/%{version}/cups-%{version}-source.tar.bz2 +Url: http://www.cups.org +Packager: Anonymous +Vendor: Apple Inc. + +# Use buildroot so as not to disturb the version already installed +BuildRoot: /tmp/%{name}-root + +# Dependencies... +Requires: %{name}-libs = %{epoch}:%{version} +Obsoletes: lpd, lpr, LPRng +Provides: lpd, lpr, LPRng +Obsoletes: cups-da, cups-de, cups-es, cups-et, cups-fi, cups-fr, cups-he +Obsoletes: cups-id, cups-it, cups-ja, cups-ko, cups-nl, cups-no, cups-pl +Obsoletes: cups-pt, cups-ru, cups-sv, cups-zh + +%package devel +Summary: CUPS - development environment +Group: Development/Libraries +Requires: %{name}-libs = %{epoch}:%{version} + +%package libs +Summary: CUPS - shared libraries +Group: System Environment/Libraries +Provides: libcups1 + +%package lpd +Summary: CUPS - LPD support +Group: System Environment/Daemons +Requires: %{name} = %{epoch}:%{version} xinetd + +%if %{?_with_php:1}%{!?_with_php:0} +%package php +Summary: CUPS - PHP support +Group: Development/Languages +Requires: %{name}-libs = %{epoch}:%{version} +%endif + +%description +CUPS is the standards-based, open source printing system developed by +Apple Inc. for OS X and other UNIX®-like operating systems. + +%description devel +This package provides the CUPS headers and development environment. + +%description libs +This package provides the CUPS shared libraries. + +%description lpd +This package provides LPD client support. + +%if %{?_with_php:1}%{!?_with_php:0} +%description php +This package provides PHP support for CUPS. +%endif + +%prep +%setup + +%build +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" \ + ./configure %{_dbus} %{_dnssd} %{_php} %{_static} +# If we got this far, all prerequisite libraries must be here. +make + +%install +# Make sure the RPM_BUILD_ROOT directory exists. +rm -rf $RPM_BUILD_ROOT + +make BUILDROOT=$RPM_BUILD_ROOT install + +%post +/sbin/chkconfig --add cups +/sbin/chkconfig cups on + +# Restart cupsd if we are upgrading... +if test $1 -gt 1; then + /sbin/service cups stop + /sbin/service cups start +fi + +%post libs +/sbin/ldconfig + +%preun +if test $1 = 0; then + /sbin/service cups stop + /sbin/chkconfig --del cups +fi + +%postun +if test $1 -ge 1; then + /sbin/service cups stop + /sbin/service cups start +fi + +%postun libs +/sbin/ldconfig + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%docdir /usr/share/doc/cups +%defattr(-,root,root) +%dir /etc/cups +%config(noreplace) /etc/cups/*.conf +/etc/cups/cupsd.conf.default +%dir /etc/cups/interfaces +%dir /etc/cups/ppd +%attr(0700,root,root) %dir /etc/cups/ssl + +%if %{?_with_dbus:1}%{!?_with_dbus:0} +# DBUS +/etc/dbus-1/system.d/* +%endif + +# PAM +%dir /etc/pam.d +/etc/pam.d/* + +# RC dirs are a pain under Linux... Uncomment the appropriate ones if you +# don't use Red Hat or Mandrake... + +/etc/init.d/* +/etc/rc0.d/* +/etc/rc2.d/* +/etc/rc3.d/* +/etc/rc5.d/* + +# OLD RedHat/Mandrake +#/etc/rc.d/init.d/* +#/etc/rc.d/rc0.d/* +#/etc/rc.d/rc2.d/* +#/etc/rc.d/rc3.d/* +#/etc/rc.d/rc5.d/* + +#/sbin/rc.d/* +#/sbin/rc.d/rc0.d/* +#/sbin/rc.d/rc2.d/* +#/sbin/rc.d/rc3.d/* +#/sbin/rc.d/rc5.d/* + +/usr/bin/cancel +/usr/bin/cupstestdsc +/usr/bin/cupstestppd +/usr/bin/ipptool +/usr/bin/lp* +%dir /usr/lib/cups +%dir /usr/lib/cups/backend +%if %{?_with_dnssd:1}%{!?_with_dnssd:0} +/usr/lib/cups/backend/dnssd +%endif +/usr/lib/cups/backend/http +/usr/lib/cups/backend/https +%attr(0700,root,root) /usr/lib/cups/backend/ipp +/usr/lib/cups/backend/ipps +%attr(0700,root,root) /usr/lib/cups/backend/lpd +/usr/lib/cups/backend/parallel +/usr/lib/cups/backend/serial +/usr/lib/cups/backend/snmp +/usr/lib/cups/backend/socket +/usr/lib/cups/backend/usb +%dir /usr/lib/cups/cgi-bin +/usr/lib/cups/cgi-bin/* +%dir /usr/lib/cups/daemon +/usr/lib/cups/daemon/cups-deviced +/usr/lib/cups/daemon/cups-driverd +/usr/lib/cups/daemon/cups-exec +/usr/lib/cups/daemon/cups-polld +%dir /usr/lib/cups/driver +%dir /usr/lib/cups/filter +/usr/lib/cups/filter/* +%dir /usr/lib/cups/monitor +/usr/lib/cups/monitor/* +%dir /usr/lib/cups/notifier +/usr/lib/cups/notifier/* + +/usr/sbin/* +%dir /usr/share/cups +%dir /usr/share/cups/banners +/usr/share/cups/banners/* +%dir /usr/share/cups/charsets +/usr/share/cups/charsets/* +%dir /usr/share/cups/data +/usr/share/cups/data/* +%dir /usr/share/cups/drv +/usr/share/cups/drv/* +%dir /usr/share/cups/fonts +/usr/share/cups/fonts/* +%dir /usr/share/cups/ipptool +/usr/share/cups/ipptool/* +%dir /usr/share/cups/mime +/usr/share/cups/mime/* +%dir /usr/share/cups/model +%dir /usr/share/cups/ppdc +/usr/share/cups/ppdc/* +%dir /usr/share/cups/templates +/usr/share/cups/templates/* +%dir /usr/share/doc/cups +/usr/share/doc/cups/*.* +%dir /usr/share/doc/cups/de +/usr/share/doc/cups/de/* +%dir /usr/share/doc/cups/es +/usr/share/doc/cups/es/* +%dir /usr/share/doc/cups/eu +/usr/share/doc/cups/eu/* +%dir /usr/share/doc/cups/fr +/usr/share/doc/cups/fr/* +%dir /usr/share/doc/cups/hu +/usr/share/doc/cups/hu/* +%dir /usr/share/doc/cups/id +/usr/share/doc/cups/id/* +%dir /usr/share/doc/cups/it +/usr/share/doc/cups/it/* +%dir /usr/share/doc/cups/ja +/usr/share/doc/cups/ja/* +%dir /usr/share/doc/cups/pl +/usr/share/doc/cups/pl/* +%dir /usr/share/doc/cups/ru +/usr/share/doc/cups/ru/* +%dir /usr/share/doc/cups/help +/usr/share/doc/cups/help/accounting.html +/usr/share/doc/cups/help/cgi.html +/usr/share/doc/cups/help/glossary.html +/usr/share/doc/cups/help/kerberos.html +/usr/share/doc/cups/help/license.html +/usr/share/doc/cups/help/man-*.html +/usr/share/doc/cups/help/network.html +/usr/share/doc/cups/help/options.html +/usr/share/doc/cups/help/overview.html +/usr/share/doc/cups/help/policies.html +/usr/share/doc/cups/help/ref-*.html +/usr/share/doc/cups/help/security.html +/usr/share/doc/cups/help/sharing.html +/usr/share/doc/cups/help/standard.html +/usr/share/doc/cups/help/translation.html +/usr/share/doc/cups/help/whatsnew.html +%dir /usr/share/doc/cups/images +/usr/share/doc/cups/images/* +/usr/share/locale/* + +%dir /usr/share/man/man1 +/usr/share/man/man1/cancel.1.gz +/usr/share/man/man1/cupstestdsc.1.gz +/usr/share/man/man1/cupstestppd.1.gz +/usr/share/man/man1/ipptool.1.gz +/usr/share/man/man1/lp.1.gz +/usr/share/man/man1/lpoptions.1.gz +/usr/share/man/man1/lppasswd.1.gz +/usr/share/man/man1/lpq.1.gz +/usr/share/man/man1/lpr.1.gz +/usr/share/man/man1/lprm.1.gz +/usr/share/man/man1/lpstat.1.gz +%dir /usr/share/man/man5 +/usr/share/man/man5/*.conf.5.gz +/usr/share/man/man5/ipptoolfile.5.gz +/usr/share/man/man5/mime.*.5.gz +%dir /usr/share/man/man8 +/usr/share/man/man8/accept.8.gz +/usr/share/man/man8/cupsaddsmb.8.gz +/usr/share/man/man8/cupsaccept.8.gz +/usr/share/man/man8/cupsctl.8.gz +/usr/share/man/man8/cupsfilter.8.gz +/usr/share/man/man8/cupsd.8.gz +/usr/share/man/man8/cupsdisable.8.gz +/usr/share/man/man8/cupsenable.8.gz +/usr/share/man/man8/cupsreject.8.gz +/usr/share/man/man8/cups-deviced.8.gz +/usr/share/man/man8/cups-driverd.8.gz +/usr/share/man/man8/cups-polld.8.gz +/usr/share/man/man8/lpadmin.8.gz +/usr/share/man/man8/lpc.8.gz +/usr/share/man/man8/lpinfo.8.gz +/usr/share/man/man8/lpmove.8.gz +/usr/share/man/man8/reject.8.gz + +%dir /var/cache/cups +%attr(0775,root,sys) %dir /var/cache/cups/rss +%dir /var/log/cups +%dir /var/run/cups +%attr(0711,lp,sys) %dir /var/run/cups/certs +%attr(0710,lp,sys) %dir /var/spool/cups +%attr(1770,lp,sys) %dir /var/spool/cups/tmp + +# Desktop files +/usr/share/applications/* +/usr/share/icons/* + +%files devel +%defattr(-,root,root) +%dir /usr/share/cups/examples +/usr/share/cups/examples/* +%dir /usr/share/man/man1 +/usr/share/man/man1/cups-config.1.gz +/usr/share/man/man1/ppd*.1.gz +%dir /usr/share/man/man5 +/usr/share/man/man5/ppdcfile.5.gz +/usr/share/man/man7/backend.7.gz +/usr/share/man/man7/filter.7.gz +/usr/share/man/man7/notifier.7.gz + +/usr/bin/cups-config +/usr/bin/ppd* +%dir /usr/include/cups +/usr/include/cups/* +/usr/lib*/*.so + +%if %{?_with_static:1}%{!?_with_static:0} +/usr/lib*/*.a +%endif + +%dir /usr/share/doc/cups/help +/usr/share/doc/cups/help/api*.html +/usr/share/doc/cups/help/postscript-driver.html +/usr/share/doc/cups/help/ppd-compiler.html +/usr/share/doc/cups/help/raster-driver.html +/usr/share/doc/cups/help/spec*.html + +%files libs +%defattr(-,root,root) +/usr/lib*/*.so.* + +%files lpd +%defattr(-,root,root) +/etc/xinetd.d/cups-lpd +%dir /usr/lib/cups +%dir /usr/lib/cups/daemon +/usr/lib/cups/daemon/cups-lpd +%dir /usr/share/man/man8 +/usr/share/man/man8/cups-lpd.8.gz + +%if %{?_with_php:1}%{!?_with_php:0} +%files php +# PHP +/usr/lib*/php* +%endif + + +# +# End of "$Id: cups.spec.in 10428 2012-04-23 17:46:53Z mike $". +# diff --git a/packaging/installer.gif b/packaging/installer.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ae6ea77a8c02cd6dc5e5e2a90d4fe4d495076a9 GIT binary patch literal 3392 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/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + $(INSTALL_DIR) $(DATADIR)/drv + $(INSTALL_DATA) sample.drv $(DATADIR)/drv + + +# +# Install programs... +# + +install-exec: + echo Installing PPD compiler programs... + $(INSTALL_DIR) $(BINDIR) + for file in $(EXECTARGETS); do \ + $(INSTALL_BIN) $$file $(BINDIR); \ + done + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(EXECTARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + echo Installing header files in $(INCLUDEDIR)/cups... + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + $(INSTALL_DATA) ppdc.h $(INCLUDEDIR)/cups + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) + echo Installing libraries in $(LIBDIR)... + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPSPPDC) $(LIBDIR) + if test $(LIBCUPSPPDC) = "libcupsppdc.so.1" -o $(LIBCUPSPPDC) = "libcupsppdc.sl.1"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \ + $(LN) $(LIBCUPSPPDC) $(LIBDIR)/`basename $(LIBCUPSPPDC) .1`; \ + fi + if test $(LIBCUPSPPDC) = "libcupsppdc.1.dylib"; then \ + $(RM) $(LIBDIR)/libcupsppdc.dylib; \ + $(LN) $(LIBCUPSPPDC) $(LIBDIR)/libcupsppdc.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPSPPDC) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 libcupsppdc.a $(LIBDIR) + $(RANLIB) $(LIBDIR)/libcupsppdc.a + $(CHMOD) 555 $(LIBDIR)/libcupsppdc.a + + +# +# Uninstall... +# + +uninstall: + for file in $(EXECTARGETS); do \ + $(RM) $(BINDIR)/$$file; \ + done + $(RM) $(DATADIR)/drv/sample.drv + $(RMDIR) $(DATADIR)/drv + $(RM) $(LIBDIR)/libcupsppdc.1.dylib + $(RM) $(LIBDIR)/libcupsppdc.a + $(RM) $(LIBDIR)/libcupsppdc.dylib + $(RM) $(LIBDIR)/libcupsppdc_s.a + $(RM) $(LIBDIR)/libcupsppdc.sl + $(RM) $(LIBDIR)/libcupsppdc.sl.1 + $(RM) $(LIBDIR)/libcupsppdc.so + $(RM) $(LIBDIR)/libcupsppdc.so.1 + -$(RMDIR) $(LIBDIR) + $(RM) $(INCLUDEDIR)/cups/ppdc.h + -$(RMDIR) $(INCLUDEDIR)/cups + + +# +# Automatic API help files... +# + +apihelp: + mxmldoc --section "Programming" \ + --title "PPD Compiler API" \ + --css ../doc/cups-printable.css \ + --header api-ppdc.header --intro api-ppdc.shtml \ + api-ppdc.xml \ + ppdc.h $(LIBOBJS:.o=.cxx) >../doc/help/api-ppdc.html + mxmldoc --tokens help/api-ppdc.html api-ppdc.xml >../doc/help/api-ppdc.tokens + $(RM) api-ppdc.xml + +framedhelp: + mxmldoc --framed api-ppdc \ + --section "Programming" \ + --title "PPD Compiler API" \ + --css ../doc/cups-printable.css \ + --header api-ppdc.header --intro api-ppdc.shtml \ + ppdc.h $(LIBOBJS:.o=.cxx) + + +# +# genstrings - generate GNU gettext strings. +# + +genstrings: genstrings.o libcupsppdc.so ../cups/$(LIBCUPSSTATIC) \ + sample.drv ../data/media.defs + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o genstrings genstrings.o \ + -lcupsppdc ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) \ + $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + echo Generating localization strings... + LD_LIBRARY_PATH=.:../cups/ ./genstrings >sample.c + + +# +# ppdc, the PPD compiler. +# + +ppdc: ppdc.o $(LIBCUPSPPDC) ../cups/$(LIBCUPS) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ ppdc.o -L. -lcupsppdc $(LIBS) + + +ppdc-static: ppdc.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) foo.drv foo-fr.po + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdc-static ppdc.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Testing PPD compiler... + LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -l en,fr -I ../data foo.drv + LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -l en,fr -z -I ../data foo.drv + + +# +# ppdhtml, the PPD to HTML utility. +# + +ppdhtml: ppdhtml.o $(LIBCUPSPPDC) ../cups/$(LIBCUPS) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ ppdhtml.o -L. -lcupsppdc $(LIBS) + + +# +# ppdi, import PPD files. +# + +ppdi: ppdi.o $(LIBCUPSPPDC) ../cups/$(LIBCUPS) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ ppdi.o -L. -lcupsppdc $(LIBS) + + +ppdi-static: ppdc-static ppdi.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o ppdi-static ppdi.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + echo Testing PPD importer... + $(RM) -r ppd ppd2 sample-import.drv + LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -I ../data sample.drv + LD_LIBRARY_PATH=.:../cups/ ./ppdi-static -I ../data -o sample-import.drv ppd/* + LD_LIBRARY_PATH=.:../cups/ ./ppdc-static -I ../data -d ppd2 sample-import.drv + if diff -r ppd ppd2 >/dev/null; then \ + echo PPD import OK; \ + else \ + echo PPD import FAILED; \ + exit 1; \ + fi + + +# +# ppdmerge, merge PPD files. +# + +ppdmerge: ppdmerge.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ ppdmerge.o $(LIBS) + + +# +# ppdpo, create message catalog files. +# + +ppdpo: ppdpo.o $(LIBCUPSPPDC) ../cups/$(LIBCUPS) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ ppdpo.o -L. -lcupsppdc $(LIBS) + + +# +# testcatalog, test ppdcCatalog class. +# + +testcatalog: testcatalog.o libcupsppdc.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CXX) $(LDFLAGS) -o $@ testcatalog.o -lcupsppdc \ + ../cups/$(LIBCUPSSTATIC) $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) \ + $(COMMONLIBS) $(LIBZ) + + +# +# libcupsppdc.so.1, libcupsppdc.sl.1 +# + +libcupsppdc.so.1 libcupsppdc.sl.1: $(LIBOBJS) ../cups/$(LIBCUPS) + echo Linking $@... + $(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LINKCUPS) + $(RM) `basename $@ .1` + $(LN) $@ `basename $@ .1` + + +# +# libcupsppdc.1.dylib +# + +libcupsppdc.1.dylib: $(LIBOBJS) ../cups/$(LIBCUPS) + echo Creating export list for $@... + nm $(LIBOBJS) | grep "T __" | awk '{print $$3}' | sort >t.exp + echo Linking $@... + $(DSOXX) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.0.0 \ + -compatibility_version 1.0.0 \ + -exported_symbols_list t.exp \ + $(LIBOBJS) $(LINKCUPS) + $(RM) libcupsppdc.dylib t.exp + $(LN) $@ libcupsppdc.dylib + + +# +# libcupsppdc_s.a +# + +libcupsppdc_s.a: $(LIBOBJS) ../cups/$(LIBCUPS) + echo Creating $@... + $(DSOXX) $(DSOFLAGS) -o libcupsppdc_s.o $(LIBOBJS) $(LINKCUPS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcupsppdc_s.o + + +# +# libcupsppdc.la +# + +libcupsppdc.la: $(LIBOBJS) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \ + -version-info 1:0 $(LINKCUPS) + + +# +# libcupsppdc.a +# + +libcupsppdc.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# Include dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9422 2011-01-06 22:20:15Z mike $". +# diff --git a/ppdc/api-ppdc.header b/ppdc/api-ppdc.header new file mode 100644 index 0000000..4186865 --- /dev/null +++ b/ppdc/api-ppdc.header @@ -0,0 +1,34 @@ + + +

PPD Compiler API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/ppdc.h
Library-lcupsppdc
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/ppdc/api-ppdc.shtml b/ppdc/api-ppdc.shtml new file mode 100644 index 0000000..e305dcb --- /dev/null +++ b/ppdc/api-ppdc.shtml @@ -0,0 +1,18 @@ + + +

Overview

+ +

The PPD Compiler API provides access to CUPS driver information files and +methods for generating and importing PPD files.

diff --git a/ppdc/foo-fr.po b/ppdc/foo-fr.po new file mode 100644 index 0000000..1b1561b --- /dev/null +++ b/ppdc/foo-fr.po @@ -0,0 +1,11 @@ +msgid "A Serious Error" +msgstr "La Error Serious" + +msgid "http://foo.com/serious.html" +msgstr "http://foo.com/fr/serious.html" + +msgid "Foo Letter" +msgstr "La Foo Letter" + +msgid "Foo Photo" +msgstr "La Foo Photo" diff --git a/ppdc/foo.drv b/ppdc/foo.drv new file mode 100644 index 0000000..8eb3b12 --- /dev/null +++ b/ppdc/foo.drv @@ -0,0 +1,547 @@ +// +// "$Id: foo.drv 361 2007-10-01 20:03:46Z mike $" +// +// PPD file compiler test data file for CUPS. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 1997-2003 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// + +/* + * C-style comments are supported. + */ + +// +// C++-style comments are supported. +// + +// +// Include the common media size definitions... +// +// #include directives support both to include a standard file +// and "name" or just name without the quotes for a local file. Local +// files resolve relative to the current file's path. Unlike C/C++, +// #include does not look in multiple directories, and +// #include "name" does not look in the standard directory. +// + +#include + + +// +// Include the CUPS raster definitions... +// + +#include + + +// +// Include the standard CUPS fonts... +// + +#include + + +// +// Define variables using the #define directive. In this case we +// are defining constants for the model number, which is used by +// our imaginary rastertofoo filter to determine which model-specific +// features to use/support. +// + +#define MODEL_BW 0 +#define MODEL_COLOR 1 + +#define MODEL_LASER 0 +#define MODEL_PHOTO 2 + + +// +// Media sizes are defined using the #media directive. The order of +// values is: size name/text, width, length. +// +// "Size name" is an alphanumeric string of up to 40 characters as +// defined by the Adobe PPD specification. +// +// "Size text" is a text string of up to 80 characters as defined by +// the Adobe PPD specification. +// +// "Width" and "length" are the width and length of the media size. +// Numbers by themselves represent points (72 points = 1 inch). The +// suffixes "cm", "ft", "in", "m", "mm", and "pt" are recognized to +// specify centimeters, feet, inches, meters, millimeters, and points, +// respectively. +// + +#media "FooLetter/Foo Letter" 8in 10in +#media "FooPhoto/Foo Photo" 200mm 300mm + + +// +// Message catalogs can be included using #po... +// + +#po fr foo-fr.po + + +// +// Specify that the drivers use all of the standard base fonts... +// + +Font * + + +// +// All copyright lines are put at the top of the PPD file in order +// of their appearance. Copyright text can span multiple lines and +// will be properly included in the PPD file with comment prefixes +// on each line. +// +// First an MIT-style copyright/license notice... +// + +Copyright "Copyright 2007 by Foo Industries." +Copyright " +Permission is granted for redistribution of this file as long as +this copyright notice is intact and the contents of the file are +not altered in any way from their original form. + +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. +" + +// +// Then a GPL notice... +// + +Copyright "Copyright 2007 by Foo Industries." +Copyright " +This software 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 software 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 software; if not, write to the Free +Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, +MA 02111 USA +" + + +// +// All printer drivers must define the manufacturer, model, PC +// filename, and version strings; since this test file contains +// drivers for an imaginary manufacturer "Foo", all of the drivers +// listed in this file share common manufacturer and version +// strings. +// + +Manufacturer "Foo" +Version 1.0 + + +// +// Printer drivers can access driver-specific attributes in a PPD +// file; these attributes are specified using lines of the form: +// +// Attribute name selector value +// +// "Name" is the name of the attribute and should start with either +// the "cups" prefix or the name of the vendor, e.g. "hpFoo", +// "epsonBar", etc. The name can be any alphanumeric character (a-z, +// A-Z, and 0-9) and cannot be a common prefix of another attribute, +// e.g. "fooLines" and "fooLinesPerInch" cannot be in the same file. +// +// "Selector" is a selector string containing any characters except +// colon (:). Typically this will be one or more keywords separated +// by the forward slash (/), however the empty string ("") can be used +// to omit the selector. +// +// "Value" is a quoted value string that can contain any printable +// characters except the double quote ("). Hexadecimal numbers +// inside angle brackets () can be used to substitute escape +// codes and other special characters. +// + +Attribute fooOutputFormat "" "PCL" +Attribute fooPJL Begin "<1B>%-12345X@PJL<0D0A>" +Attribute fooPJL Enter/PCL "@PJL ENTER LANGUAGE=PCL<0D0A>" +Attribute fooPJL End "<1B>%-12345X@PJL END JOB<0D0A>" + +// +// Most printer drivers use filters; exceptions include PostScript +// printers and PPD files for software RIPs. +// +// The format is: +// +// Filter mime-type cost program +// +// The "mime-type" field defines the MIME type that the filter program +// accepts; for CUPS raster printer drivers, this will be +// "application/vnd.cups-raster". +// +// The "cost" field defines the relative cost of the filter in terms of +// both CPU and memory usage, and is used to limit the number of +// simultaneous jobs in some configurations. Most raster filters should +// have a cost of 100, unless the filter does no dithering - then a cost +// of 33 is more appropriate. +// +// The "program" field defined the filter program to run; use the null +// filter "-" to define a MIME type that the printer accepts directly. +// If no path information is provided, then the program will be run +// from the standard CUPS filter directory, usually +// /usr/lib/cups/filter. +// +// When compiling PPD files for PostScript capable devices that use +// additional filters, add a null filter for the MIME type +// "application/vnd.cups-postscript" so that printer commands, user +// job filters, and page markings can be added to the PostScript +// output that is sent to the printer. +// + +Filter application/vnd.cups-raster 100 rastertofoo + + +// +// Attributes are included thusly... +// + +Attribute cupsIPPReason "com.foo-serious-error/A Serious Error" "http://foo.com/serious.html" + + +// +// Curley braces are used for grouping common data and for isolating +// individual printer models. All data values are inherited *except* +// for the PCFilename and ModelName strings. +// + +{ + // + // Define two printer drivers that support only the FooLetter and + // FooPhoto media size. One is color, the other is black-and-white. + // + // Both printers share two MediaSize definitions; the name listed + // after the MediaSize keyword must be one of the Adobe standard + // names listed in the PPD specification or any named size defined + // using the #media directive. + // + // Default options are indicated by placing an asterisk (*) before + // the keyword. + // + // For custom size and margin specification, see the next group of + // printer drivers. + // + + MediaSize FooLetter + *MediaSize FooPhoto + + + // + // These imaginary printers support printing at 300, 600x300, + // and 600 DPI. We'll use the old-style Resolution convenience + // keyword which accepts the following parameters: colorspace/ + // order, bits-per-color, row count, row feed, row step, and + // name/text. + // + // The name must be of the form NNNsuffix or NNNxMMMsuffix, + // where NNN and MMM represent the X and Y resolution in dots + // per inch. + // + + Resolution - 8 0 0 0 "300dpi/300 DPI" + Resolution - 8 0 0 0 "600x300dpi/600 x 300 DPI" + *Resolution - 8 0 0 0 "600dpi/600 DPI" + + + // + // One printer is grayscale only, and the other does grayscale + // and color. Define the grayscale color model for both printers + // using the old-style ColorModel convenience keyword which + // accepts the name/text, colorspace, color order, and compression + // parameters. + // + + ColorModel Gray/Grayscale w chunked 0 + + + { + // + // The first sub-group contains the grayscale printer, which + // only needs the model name, PC filename, and model number + // values set... + // + // The ModelName keyword defines the string that is shown to + // the user. + // + + ModelName "Mono Photo Printer" + + + // + // The ModelNumber keyword defines the cupsModelNumber + // attribute value. We use the "(name name)" notation + // to perform a bitwise OR of the #define'd constants. + // + + ModelNumber ($MODEL_BW $MODEL_PHOTO) + + + // + // The PCFileName keyword defines the filename of the PPD + // file and should be 8 characters or less + the .ppd + // extension. + // + + PCFileName "foogphot.ppd" + } + + + { + // + // The second sub-group contains the color printer, which + // needs another ColorModel definition along with the model + // name, PC filename, and model number values. For fun, we'll + // add some input slots (paper trays) as well. + // + // The ModelName keyword defines the string that is shown to + // the user. + // + + ModelName "Color Photo Printer" + + + // + // The ModelNumber keyword defines the cupsModelNumber + // attribute value. We use the "(name name)" notation + // to perform a bitwise OR of the #define'd constants. + // + + ModelNumber ($MODEL_COLOR $MODEL_PHOTO) + + + // + // The PCFileName keyword defines the filename of the PPD + // file and should be 8 characters or less + the .ppd + // extension. + // + + PCFileName "foocphot.ppd" + + + // + // This printer does color printing, too, so add it and make + // RGB the default... + // + + ColorDevice Yes + + *ColorModel RGB/Color rgb chunked 0 + + + // + // The old-style InputSlot keyword accepts tray definitions + // of the form: + // + // InputSlot position name/text + // + + InputSlot 0 "Upper/Main Paper Tray" + InputSlot 1 "LargeCapacity/Large Paper Tray" + } +} + + +{ + // + // Define two printer drivers that support two typical laser + // printers with custom page sizes. One is color, the other is + // black-and-white. + // + // Both printers share several MediaSize definitions and support + // custom page sizes from 3x5 to 13x19 inches. + // + // All US media sizes use hardware margins of 0.25 inches on the sides + // and 12 points (1/6th inch) at the top and bottom. European sizes + // and custom sizes use margins of 12 points all around. + // + // The order of the HWMargins numbers are left, bottom, right, and top. + // The current HWMargins values are used when defining each media size. + // The last HWMargins values are used for custom page size margins. + // + + HWMargins 0.25in 12pt 0.25in 12pt + + *MediaSize Letter + MediaSize Legal + MediaSize Tabloid + MediaSize TabloidExtra + + HWMargins 12pt 12pt 12pt 12pt + MediaSize A4 + MediaSize A3 + + // + // Specify that custom/variable paper sizes are supported, and the + // range of sizes that are supported... + // + + VariablePaperSize Yes + MinSize 3in 5in + MaxSize 13in 19in + + + // + // These imaginary printers support printing at 600 and 1200 DPI. + // We'll use the new Option and Choice keywords to define the + // Resolution options... + // + // Option option-name option-text option-type + // Choice choice-name choice-text code + // + // "Option-type" is the type of option: boolean, pickone, or pickmany. + // + + Option Resolution PickOne AnySetup 10 + Choice "600dpi/600 DPI" "<>setpagedevice" + Choice "1200dpi/1200 DPI" "<>setpagedevice" + + + // + // One printer is grayscale only, and the other does grayscale + // and color. Define the grayscale color model for both printers + // using the new Option and Choice keywords. + // + + Option "ColorModel/Color Mode" PickOne AnySetup 10 + Choice Gray/Grayscale "<>setpagedevice" + + + // + // Both printers provide two paper trays, which we'll define using + // the new Option and Choice keywords... + // + + Option "InputSlot/Input Slot" PickOne AnySetup 10 + Choice "Upper/Main Paper Tray" "<>setpagedevice" + Choice "LargeCapacity/Large Paper Tray" "<>setpagedevice" + + + // + // Both printers support duplexing... + // + // The Duplex keyword accepts values of "none" (no duplexing capability), + // "normal" (standard duplexing capability), and "flip" (auto-duplex that + // requires the back side to be flipped by the RIP...) + // + + Duplex normal + + + { + // + // The first sub-group contains the grayscale printer, which + // only needs the model name, PC filename, and model number + // values set... + // + // The ModelName keyword defines the string that is shown to + // the user. + // + + ModelName "Mono Laser Printer" + + + // + // The ModelNumber keyword defines the cupsModelNumber + // attribute value. We use the "(name name)" notation + // to perform a bitwise OR of the #define'd constants. + // + + ModelNumber ($MODEL_BW $MODEL_LASER) + + + // + // The PCFileName keyword defines the filename of the PPD + // file and should be 8 characters or less + the .ppd + // extension. + // + + PCFileName "fooglasr.ppd" + } + + + { + // + // The second sub-group contains the color printer, which + // needs another ColorModel definition along with the model + // name, PC filename, and model number values. + // + // The ModelName keyword defines the string that is shown to + // the user. + // + + ModelName "Color Laser Printer" + + + // + // The ModelNumber keyword defines the cupsModelNumber + // attribute value. We use the "(name name)" notation + // to perform a bitwise OR of the #define'd constants. + // + + ModelNumber ($MODEL_COLOR $MODEL_LASER) + + + // + // The PCFileName keyword defines the filename of the PPD + // file and should be 8 characters or less + the .ppd + // extension. + // + + PCFileName "fooclasr.ppd" + + + // + // This printer does color printing, too, so add it and make + // RGB the default... + // + + ColorDevice Yes + + Option "ColorModel/Color Mode" PickOne AnySetup 10 + *Choice RGB/Color "<>setpagedevice" + } +} + + +// +// End of "$Id: foo.drv 361 2007-10-01 20:03:46Z mike $". +// diff --git a/ppdc/genstrings.cxx b/ppdc/genstrings.cxx new file mode 100644 index 0000000..616e3b1 --- /dev/null +++ b/ppdc/genstrings.cxx @@ -0,0 +1,215 @@ +// +// "$Id: genstrings.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// GNU gettext message generator for the CUPS PPD Compiler. +// +// This program is used to generate a dummy source file containing all of +// the standard media and sample driver strings. The results are picked up +// by GNU gettext and placed in the CUPS message catalog. +// +// Copyright 2008-2011 by Apple Inc. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Usage: +// +// ./genstrings >sample.c +// +// Contents: +// +// main() - Main entry for the PPD compiler. +// add_ui_strings() - Add all UI strings from the driver. +// write_cstring() - Write a translation string as a valid C string to +// stdout. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include + + +// +// Local functions... +// + +static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog); +static void write_cstring(const char *s); + + +// +// 'main()' - Main entry for the PPD compiler. +// + +int // O - Exit status +main(void) +{ + ppdcSource *src; // PPD source file data + ppdcCatalog *catalog; // Catalog to hold all of the UI strings + + + // Make sure we are in the right place... + if (access("../data", 0) || access("sample.drv", 0)) + { + puts("You must run genstrings from the ppdc directory."); + return (1); + } + + // Load the sample drivers... + ppdcSource::add_include("../data"); + + src = new ppdcSource("sample.drv"); + catalog = new ppdcCatalog(NULL); + + catalog->add_message("ISOLatin1"); + catalog->add_message("English"); + + // Add the media size strings... + ppdcMediaSize *size; // Current media size + + for (size = (ppdcMediaSize *)src->sizes->first(); + size; + size = (ppdcMediaSize *)src->sizes->next()) + catalog->add_message(size->text->value); + + // Then collect all of the UI strings from the sample drivers... + ppdcDriver *d; // Current driver + + for (d = (ppdcDriver *)src->drivers->first(); + d; + d = (ppdcDriver *)src->drivers->next()) + add_ui_strings(d, catalog); + + // Finally, write all of the strings... + ppdcMessage *message; + + for (message = (ppdcMessage *)catalog->messages->first(); + message; + message = (ppdcMessage *)catalog->messages->next()) + write_cstring(message->id->value); + + src->release(); + catalog->release(); + + // Return with no errors. + return (0); +} + + +// +// 'add_ui_strings()' - Add all UI strings from the driver. +// + +static void +add_ui_strings(ppdcDriver *d, // I - Driver data + ppdcCatalog *catalog) // I - Message catalog +{ + // Add the make/model/language strings... + catalog->add_message(d->manufacturer->value); + catalog->add_message(d->model_name->value); + + // Add the group/option/choice strings... + ppdcGroup *g; // Current group + ppdcOption *o; // Current option + ppdcChoice *c; // Current choice + + for (g = (ppdcGroup *)d->groups->first(); + g; + g = (ppdcGroup *)d->groups->next()) + { + if (!g->options->count) + continue; + + if (_cups_strcasecmp(g->name->value, "General")) + catalog->add_message(g->text->value); + + for (o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + { + if (!o->choices->count) + continue; + + if (o->text->value && strcmp(o->name->value, o->text->value)) + catalog->add_message(o->text->value); + else + catalog->add_message(o->name->value); + + for (c = (ppdcChoice *)o->choices->first(); + c; + c = (ppdcChoice *)o->choices->next()) + if (c->text->value && strcmp(c->name->value, c->text->value)) + catalog->add_message(c->text->value); + else + catalog->add_message(c->name->value); + } + } + + // Add profile and preset strings... + ppdcAttr *a; // Current attribute + for (a = (ppdcAttr *)d->attrs->first(); + a; + a = (ppdcAttr *)d->attrs->next()) + { + if (a->text->value && a->text->value[0] && + (a->localizable || + !strncmp(a->name->value, "Custom", 6) || + !strncmp(a->name->value, "ParamCustom", 11) || + !strcmp(a->name->value, "APCustomColorMatchingName") || + !strcmp(a->name->value, "APPrinterPreset") || + !strcmp(a->name->value, "cupsICCProfile") || + !strcmp(a->name->value, "cupsIPPReason") || + !strcmp(a->name->value, "cupsMarkerName"))) + { + catalog->add_message(a->text->value); + + if ((a->localizable && a->value->value[0]) || + !strcmp(a->name->value, "cupsIPPReason")) + catalog->add_message(a->value->value); + } + else if (!strncmp(a->name->value, "Custom", 6) || + !strncmp(a->name->value, "ParamCustom", 11)) + catalog->add_message(a->name->value); + } +} + + +// +// 'write_cstring()' - Write a translation string as a valid C string to stdout. +// + +static void +write_cstring(const char *s) /* I - String to write */ +{ + fputs("_(\"", stdout); + if (s) + { + while (*s) + { + if (*s == '\\') + fputs("\\\\", stdout); + else if (*s == '\"') + fputs("\\\"", stdout); + else if (*s == '\t') + fputs("\\t", stdout); + else if (*s == '\n') + fputs("\\n", stdout); + else + putchar(*s); + + s ++; + } + } + puts("\");"); +} + + +// +// End of "$Id: genstrings.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc-array.cxx b/ppdc/ppdc-array.cxx new file mode 100644 index 0000000..b5060c0 --- /dev/null +++ b/ppdc/ppdc-array.cxx @@ -0,0 +1,168 @@ +// +// "$Id: ppdc-array.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Array class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcArray::ppdcArray() - Create a new array. +// ppdcArray::~ppdcArray() - Destroy an array. +// ppdcArray::add() - Add an element to an array. +// ppdcArray::first() - Return the first element in the array. +// ppdcArray::next() - Return the next element in the array. +// ppdcArray::remove() - Remove an element from the array. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcArray::ppdcArray()' - Create a new array. +// + +ppdcArray::ppdcArray(ppdcArray *a) + : ppdcShared() +{ + PPDC_NEW; + + if (a) + { + count = a->count; + alloc = count; + + if (count) + { + // Make a copy of the array... + data = new ppdcShared *[count]; + + memcpy(data, a->data, count * sizeof(ppdcShared *)); + + for (int i = 0; i < count; i ++) + data[i]->retain(); + } + else + data = 0; + } + else + { + count = 0; + alloc = 0; + data = 0; + } + + current = 0; +} + + +// +// 'ppdcArray::~ppdcArray()' - Destroy an array. +// + +ppdcArray::~ppdcArray() +{ + PPDC_DELETE; + + for (int i = 0; i < count; i ++) + data[i]->release(); + + if (alloc) + delete[] data; +} + + +// +// 'ppdcArray::add()' - Add an element to an array. +// + +void +ppdcArray::add(ppdcShared *d) +{ + ppdcShared **temp; + + + if (count >= alloc) + { + alloc += 10; + temp = new ppdcShared *[alloc]; + + memcpy(temp, data, count * sizeof(ppdcShared *)); + + delete[] data; + data = temp; + } + + data[count++] = d; +} + + +// +// 'ppdcArray::first()' - Return the first element in the array. +// + +ppdcShared * +ppdcArray::first() +{ + current = 0; + + if (current >= count) + return (0); + else + return (data[current ++]); +} + + +// +// 'ppdcArray::next()' - Return the next element in the array. +// + +ppdcShared * +ppdcArray::next() +{ + if (current >= count) + return (0); + else + return (data[current ++]); +} + + +// +// 'ppdcArray::remove()' - Remove an element from the array. +// + +void +ppdcArray::remove(ppdcShared *d) // I - Data element +{ + int i; // Looping var + + + for (i = 0; i < count; i ++) + if (d == data[i]) + break; + + if (i >= count) + return; + + count --; + d->release(); + + if (i < count) + memmove(data + i, data + i + 1, (count - i) * sizeof(ppdcShared *)); +} + + +// +// End of "$Id: ppdc-array.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-attr.cxx b/ppdc/ppdc-attr.cxx new file mode 100644 index 0000000..64b2a59 --- /dev/null +++ b/ppdc/ppdc-attr.cxx @@ -0,0 +1,66 @@ +// +// "$Id: ppdc-attr.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Attribute class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcAttr::ppdcAttr() - Create an attribute. +// ppdcAttr::~ppdcAttr() - Destroy an attribute. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcAttr::ppdcAttr()' - Create an attribute. +// + +ppdcAttr::ppdcAttr(const char *n, // I - Name + const char *s, // I - Spec string + const char *t, // I - Human-readable text + const char *v, // I - Value + bool loc) // I - Localize this attribute? + : ppdcShared() +{ + PPDC_NEW; + + name = new ppdcString(n); + selector = new ppdcString(s); + text = new ppdcString(t); + value = new ppdcString(v); + localizable = loc; +} + + +// +// 'ppdcAttr::~ppdcAttr()' - Destroy an attribute. +// + +ppdcAttr::~ppdcAttr() +{ + PPDC_DELETE; + + name->release(); + selector->release(); + text->release(); + value->release(); +} + + +// +// End of "$Id: ppdc-attr.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-catalog.cxx b/ppdc/ppdc-catalog.cxx new file mode 100644 index 0000000..bbadc5d --- /dev/null +++ b/ppdc/ppdc-catalog.cxx @@ -0,0 +1,897 @@ +// +// "$Id: ppdc-catalog.cxx 9384 2010-11-22 07:06:39Z mike $" +// +// Shared message catalog class for the CUPS PPD Compiler. +// +// Copyright 2007-2010 by Apple Inc. +// Copyright 2002-2006 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcCatalog::ppdcCatalog() - Create a shared message catalog. +// ppdcCatalog::~ppdcCatalog() - Destroy a shared message catalog. +// ppdcCatalog::add_message() - Add a new message. +// ppdcCatalog::find_message() - Find a message in a catalog... +// ppdcCatalog::load_messages() - Load messages from a .po file. +// ppdcCatalog::save_messages() - Save the messages to a .po file. +// get_utf8() - Get a UTF-8 character. +// get_utf16() - Get a UTF-16 character... +// put_utf8() - Add a UTF-8 character to a string. +// put_utf16() - Write a UTF-16 character to a file. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// Character encodings... +// + +typedef enum +{ + PPDC_CS_AUTO, + PPDC_CS_UTF8, + PPDC_CS_UTF16BE, + PPDC_CS_UTF16LE +} ppdc_cs_t; + + +// +// Local functions... +// + +static int get_utf8(char *&ptr); +static int get_utf16(cups_file_t *fp, ppdc_cs_t &cs); +static int put_utf8(int ch, char *&ptr, char *end); +static int put_utf16(cups_file_t *fp, int ch); + + +// +// 'ppdcCatalog::ppdcCatalog()' - Create a shared message catalog. +// + +ppdcCatalog::ppdcCatalog(const char *l, // I - Locale + const char *f) // I - Message catalog file + : ppdcShared() +{ + _cups_globals_t *cg = _cupsGlobals(); + // Global information + + + PPDC_NEW; + + locale = new ppdcString(l); + filename = new ppdcString(f); + messages = new ppdcArray(); + + if (l) + { + // Try loading the base messages for this locale... + char pofile[1024]; // Message catalog file + + + snprintf(pofile, sizeof(pofile), "%s/%s/cups_%s.po", cg->localedir, l, l); + + if (load_messages(pofile) && strchr(l, '_')) + { + // Try the base locale... + char baseloc[3]; // Base locale... + + + strlcpy(baseloc, l, sizeof(baseloc)); + snprintf(pofile, sizeof(pofile), "%s/%s/cups_%s.po", cg->localedir, + baseloc, baseloc); + + load_messages(pofile); + } + } + + if (f) + load_messages(f); +} + + +// +// 'ppdcCatalog::~ppdcCatalog()' - Destroy a shared message catalog. +// + +ppdcCatalog::~ppdcCatalog() +{ + PPDC_DELETE; + + locale->release(); + filename->release(); + messages->release(); +} + + +// +// 'ppdcCatalog::add_message()' - Add a new message. +// + +void +ppdcCatalog::add_message( + const char *id, // I - Message ID to add + const char *string) // I - Translation string +{ + ppdcMessage *m; // Current message + char text[1024]; // Text to translate + + + // Range check input... + if (!id) + return; + + // Verify that we don't already have the message ID... + for (m = (ppdcMessage *)messages->first(); + m; + m = (ppdcMessage *)messages->next()) + if (!strcmp(m->id->value, id)) + { + if (string) + { + m->string->release(); + m->string = new ppdcString(string); + } + return; + } + + // Add the message... + if (!string) + { + snprintf(text, sizeof(text), "TRANSLATE %s", id); + string = text; + } + + messages->add(new ppdcMessage(id, string)); +} + + +// +// 'ppdcCatalog::find_message()' - Find a message in a catalog... +// + +const char * // O - Message text +ppdcCatalog::find_message( + const char *id) // I - Message ID +{ + ppdcMessage *m; // Current message + + + if (!*id) + return (id); + + for (m = (ppdcMessage *)messages->first(); + m; + m = (ppdcMessage *)messages->next()) + if (!strcmp(m->id->value, id)) + return (m->string->value); + + return (id); +} + + +// +// 'ppdcCatalog::load_messages()' - Load messages from a .po file. +// + +int // O - 0 on success, -1 on failure +ppdcCatalog::load_messages( + const char *f) // I - Message catalog file +{ + cups_file_t *fp; // Message file + char line[4096], // Line buffer + *ptr, // Pointer into buffer + id[4096], // Translation ID + str[4096]; // Translation string + int linenum; // Line number + + + // Open the message catalog file... + if ((fp = cupsFileOpen(f, "r")) == NULL) + return (-1); + + if ((ptr = (char *)strrchr(f, '.')) == NULL) + goto unknown_load_format; + else if (!strcmp(ptr, ".strings")) + { + /* + * Read messages in Mac OS X ".strings" format, which are UTF-16 text + * files of the format: + * + * "id" = "str"; + * + * Strings files can also contain C-style comments. + */ + + ppdc_cs_t cs = PPDC_CS_AUTO; // Character set for file + int ch; // Current character from file + char *end; // End of buffer + + + id[0] = '\0'; + str[0] = '\0'; + ptr = NULL; + end = NULL; + + while ((ch = get_utf16(fp, cs)) != 0) + { + if (ptr) + { + if (ch == '\\') + { + if ((ch = get_utf16(fp, cs)) == 0) + break; + + if (ch == 'n') + ch = '\n'; + else if (ch == 't') + ch = '\t'; + } + else if (ch == '\"') + { + *ptr = '\0'; + ptr = NULL; + } + + if (ptr) + put_utf8(ch, ptr, end); + } + else if (ch == '/') + { + // Start of a comment? + if ((ch = get_utf16(fp, cs)) == 0) + break; + + if (ch == '*') + { + // Skip C comment... + int lastch = 0; + + while ((ch = get_utf16(fp, cs)) != 0) + { + if (ch == '/' && lastch == '*') + break; + + lastch = ch; + } + } + else if (ch == '/') + { + // Skip C++ comment... + while ((ch = get_utf16(fp, cs)) != 0) + if (ch == '\n') + break; + } + } + else if (ch == '\"') + { + // Start quoted string... + if (id[0]) + { + ptr = str; + end = str + sizeof(str) - 1; + } + else + { + ptr = id; + end = id + sizeof(id) - 1; + } + } + else if (ch == ';') + { + // Add string... + add_message(id, str); + id[0] = '\0'; + } + } + } + else if (!strcmp(ptr, ".po") || !strcmp(ptr, ".gz")) + { + /* + * Read messages from the catalog file until EOF... + * + * The format is the GNU gettext .po format, which is fairly simple: + * + * msgid "some text" + * msgstr "localized text" + * + * The ID and localized text can span multiple lines using the form: + * + * msgid "" + * "some long text" + * msgstr "" + * "localized text spanning " + * "multiple lines" + */ + + int which, // In msgid? + haveid, // Did we get a msgid string? + havestr; // Did we get a msgstr string? + + linenum = 0; + id[0] = '\0'; + str[0] = '\0'; + haveid = 0; + havestr = 0; + which = 0; + + while (cupsFileGets(fp, line, sizeof(line))) + { + linenum ++; + + // Skip blank and comment lines... + if (line[0] == '#' || !line[0]) + continue; + + // Strip the trailing quote... + if ((ptr = (char *)strrchr(line, '\"')) == NULL) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected quoted string on line %d of %s."), + linenum, f); + cupsFileClose(fp); + return (-1); + } + + *ptr = '\0'; + + // Find start of value... + if ((ptr = strchr(line, '\"')) == NULL) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected quoted string on line %d of %s."), + linenum, f); + cupsFileClose(fp); + return (-1); + } + + ptr ++; + + // Unquote the text... + char *sptr, *dptr; // Source/destination pointers + + for (sptr = ptr, dptr = ptr; *sptr;) + { + if (*sptr == '\\') + { + sptr ++; + if (isdigit(*sptr)) + { + *dptr = 0; + + while (isdigit(*sptr)) + { + *dptr = *dptr * 8 + *sptr - '0'; + sptr ++; + } + + dptr ++; + } + else + { + if (*sptr == 'n') + *dptr++ = '\n'; + else if (*sptr == 'r') + *dptr++ = '\r'; + else if (*sptr == 't') + *dptr++ = '\t'; + else + *dptr++ = *sptr; + + sptr ++; + } + } + else + *dptr++ = *sptr++; + } + + *dptr = '\0'; + + // Create or add to a message... + if (!strncmp(line, "msgid", 5)) + { + if (haveid && havestr) + add_message(id, str); + + strlcpy(id, ptr, sizeof(id)); + str[0] = '\0'; + haveid = 1; + havestr = 0; + which = 1; + } + else if (!strncmp(line, "msgstr", 6)) + { + if (!haveid) + { + _cupsLangPrintf(stderr, + _("ppdc: Need a msgid line before any " + "translation strings on line %d of %s."), + linenum, f); + cupsFileClose(fp); + return (-1); + } + + strlcpy(str, ptr, sizeof(str)); + havestr = 1; + which = 2; + } + else if (line[0] == '\"' && which == 2) + strlcat(str, ptr, sizeof(str)); + else if (line[0] == '\"' && which == 1) + strlcat(id, ptr, sizeof(id)); + else + { + _cupsLangPrintf(stderr, _("ppdc: Unexpected text on line %d of %s."), + linenum, f); + cupsFileClose(fp); + return (-1); + } + } + + if (haveid && havestr) + add_message(id, str); + } + else + goto unknown_load_format; + + /* + * Close the file and return... + */ + + cupsFileClose(fp); + + return (0); + + /* + * Unknown format error... + */ + + unknown_load_format: + + _cupsLangPrintf(stderr, + _("ppdc: Unknown message catalog format for \"%s\"."), f); + cupsFileClose(fp); + return (-1); +} + + +// +// 'ppdcCatalog::save_messages()' - Save the messages to a .po file. +// + +int // O - 0 on success, -1 on error +ppdcCatalog::save_messages( + const char *f) // I - File to save to +{ + cups_file_t *fp; // Message file + ppdcMessage *m; // Current message + char *ptr; // Pointer into string + int utf16; // Output UTF-16 .strings file? + int ch; // Current character + + + // Open the file... + if ((ptr = (char *)strrchr(f, '.')) == NULL) + return (-1); + + if (!strcmp(ptr, ".gz")) + fp = cupsFileOpen(f, "w9"); + else + fp = cupsFileOpen(f, "w"); + + if (!fp) + return (-1); + + // For .strings files, write a BOM for big-endian output... + utf16 = !strcmp(ptr, ".strings"); + + if (utf16) + put_utf16(fp, 0xfeff); + + // Loop through all of the messages... + for (m = (ppdcMessage *)messages->first(); + m; + m = (ppdcMessage *)messages->next()) + { + if (utf16) + { + put_utf16(fp, '\"'); + + ptr = m->id->value; + while ((ch = get_utf8(ptr)) != 0) + switch (ch) + { + case '\n' : + put_utf16(fp, '\\'); + put_utf16(fp, 'n'); + break; + case '\\' : + put_utf16(fp, '\\'); + put_utf16(fp, '\\'); + break; + case '\"' : + put_utf16(fp, '\\'); + put_utf16(fp, '\"'); + break; + default : + put_utf16(fp, ch); + break; + } + + put_utf16(fp, '\"'); + put_utf16(fp, ' '); + put_utf16(fp, '='); + put_utf16(fp, ' '); + put_utf16(fp, '\"'); + + ptr = m->string->value; + while ((ch = get_utf8(ptr)) != 0) + switch (ch) + { + case '\n' : + put_utf16(fp, '\\'); + put_utf16(fp, 'n'); + break; + case '\\' : + put_utf16(fp, '\\'); + put_utf16(fp, '\\'); + break; + case '\"' : + put_utf16(fp, '\\'); + put_utf16(fp, '\"'); + break; + default : + put_utf16(fp, ch); + break; + } + + put_utf16(fp, '\"'); + put_utf16(fp, ';'); + put_utf16(fp, '\n'); + } + else + { + cupsFilePuts(fp, "msgid \""); + for (ptr = m->id->value; *ptr; ptr ++) + switch (*ptr) + { + case '\n' : + cupsFilePuts(fp, "\\n"); + break; + case '\\' : + cupsFilePuts(fp, "\\\\"); + break; + case '\"' : + cupsFilePuts(fp, "\\\""); + break; + default : + cupsFilePutChar(fp, *ptr); + break; + } + cupsFilePuts(fp, "\"\n"); + + cupsFilePuts(fp, "msgstr \""); + for (ptr = m->string->value; *ptr; ptr ++) + switch (*ptr) + { + case '\n' : + cupsFilePuts(fp, "\\n"); + break; + case '\\' : + cupsFilePuts(fp, "\\\\"); + break; + case '\"' : + cupsFilePuts(fp, "\\\""); + break; + default : + cupsFilePutChar(fp, *ptr); + break; + } + cupsFilePuts(fp, "\"\n"); + + cupsFilePutChar(fp, '\n'); + } + } + + cupsFileClose(fp); + + return (0); +} + + +// +// 'get_utf8()' - Get a UTF-8 character. +// + +static int // O - Unicode character or 0 on EOF +get_utf8(char *&ptr) // IO - Pointer to character +{ + int ch; // Current character + + + if ((ch = *ptr++ & 255) < 0xc0) + return (ch); + + if ((ch & 0xe0) == 0xc0) + { + // Two-byte UTF-8... + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = ((ch & 0x1f) << 6) | (*ptr++ & 0x3f); + } + else if ((ch & 0xf0) == 0xe0) + { + // Three-byte UTF-8... + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = ((ch & 0x0f) << 6) | (*ptr++ & 0x3f); + + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = (ch << 6) | (*ptr++ & 0x3f); + } + else if ((ch & 0xf8) == 0xf0) + { + // Four-byte UTF-8... + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = ((ch & 0x07) << 6) | (*ptr++ & 0x3f); + + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = (ch << 6) | (*ptr++ & 0x3f); + + if ((*ptr & 0xc0) != 0x80) + return (0); + + ch = (ch << 6) | (*ptr++ & 0x3f); + } + + return (ch); +} + + +// +// 'get_utf16()' - Get a UTF-16 character... +// + +static int // O - Unicode character or 0 on EOF +get_utf16(cups_file_t *fp, // I - File to read from + ppdc_cs_t &cs) // IO - Character set of file +{ + int ch; // Current character + unsigned char buffer[3]; // Bytes + + + if (cs == PPDC_CS_AUTO) + { + // Get byte-order-mark, if present... + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + + if (buffer[0] == 0xfe && buffer[1] == 0xff) + { + // Big-endian UTF-16... + cs = PPDC_CS_UTF16BE; + + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + } + else if (buffer[0] == 0xff && buffer[1] == 0xfe) + { + // Little-endian UTF-16... + cs = PPDC_CS_UTF16LE; + + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + } + else if (buffer[0] == 0x00 && buffer[1] != 0x00) + { + // No BOM, assume big-endian UTF-16... + cs = PPDC_CS_UTF16BE; + } + else if (buffer[0] != 0x00 && buffer[1] == 0x00) + { + // No BOM, assume little-endian UTF-16... + cs = PPDC_CS_UTF16LE; + } + else + { + // No BOM, assume UTF-8... + cs = PPDC_CS_UTF8; + + cupsFileRewind(fp); + } + } + else if (cs != PPDC_CS_UTF8) + { + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + } + + if (cs == PPDC_CS_UTF8) + { + // UTF-8 character... + if ((ch = cupsFileGetChar(fp)) < 0) + return (0); + + if ((ch & 0xe0) == 0xc0) + { + // Two-byte UTF-8... + if (cupsFileRead(fp, (char *)buffer, 1) != 1) + return (0); + + if ((buffer[0] & 0xc0) != 0x80) + return (0); + + ch = ((ch & 0x1f) << 6) | (buffer[0] & 0x3f); + } + else if ((ch & 0xf0) == 0xe0) + { + // Three-byte UTF-8... + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + + if ((buffer[0] & 0xc0) != 0x80 || + (buffer[1] & 0xc0) != 0x80) + return (0); + + ch = ((((ch & 0x0f) << 6) | (buffer[0] & 0x3f)) << 6) | + (buffer[1] & 0x3f); + } + else if ((ch & 0xf8) == 0xf0) + { + // Four-byte UTF-8... + if (cupsFileRead(fp, (char *)buffer, 3) != 3) + return (0); + + if ((buffer[0] & 0xc0) != 0x80 || + (buffer[1] & 0xc0) != 0x80 || + (buffer[2] & 0xc0) != 0x80) + return (0); + + ch = ((((((ch & 0x07) << 6) | (buffer[0] & 0x3f)) << 6) | + (buffer[1] & 0x3f)) << 6) | (buffer[2] & 0x3f); + } + } + else + { + // UTF-16 character... + if (cs == PPDC_CS_UTF16BE) + ch = (buffer[0] << 8) | buffer[1]; + else + ch = (buffer[1] << 8) | buffer[0]; + + if (ch >= 0xd800 && ch <= 0xdbff) + { + // Handle multi-word encoding... + int lch; + + if (cupsFileRead(fp, (char *)buffer, 2) != 2) + return (0); + + if (cs == PPDC_CS_UTF16BE) + lch = (buffer[0] << 8) | buffer[1]; + else + lch = (buffer[1] << 8) | buffer[0]; + + if (lch < 0xdc00 || lch >= 0xdfff) + return (0); + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + } + + return (ch); +} + + +// +// 'put_utf8()' - Add a UTF-8 character to a string. +// + +static int // O - 0 on success, -1 on failure +put_utf8(int ch, // I - Unicode character + char *&ptr, // IO - String pointer + char *end) // I - End of buffer +{ + if (ch < 0x80) + { + // One-byte ASCII... + if (ptr >= end) + return (-1); + + *ptr++ = ch; + } + else if (ch < 0x800) + { + // Two-byte UTF-8... + if ((ptr + 1) >= end) + return (-1); + + *ptr++ = 0xc0 | (ch >> 6); + *ptr++ = 0x80 | (ch & 0x3f); + } + else if (ch < 0x10000) + { + // Three-byte UTF-8... + if ((ptr + 2) >= end) + return (-1); + + *ptr++ = 0xe0 | (ch >> 12); + *ptr++ = 0x80 | ((ch >> 6) & 0x3f); + *ptr++ = 0x80 | (ch & 0x3f); + } + else + { + // Four-byte UTF-8... + if ((ptr + 3) >= end) + return (-1); + + *ptr++ = 0xf0 | (ch >> 18); + *ptr++ = 0x80 | ((ch >> 12) & 0x3f); + *ptr++ = 0x80 | ((ch >> 6) & 0x3f); + *ptr++ = 0x80 | (ch & 0x3f); + } + + return (0); +} + + +// +// 'put_utf16()' - Write a UTF-16 character to a file. +// + +static int // O - 0 on success, -1 on failure +put_utf16(cups_file_t *fp, // I - File to write to + int ch) // I - Unicode character +{ + unsigned char buffer[4]; // Output buffer + + + if (ch < 0x10000) + { + // One-word UTF-16 big-endian... + buffer[0] = ch >> 8; + buffer[1] = ch; + + if (cupsFileWrite(fp, (char *)buffer, 2) == 2) + return (0); + } + else + { + // Two-word UTF-16 big-endian... + ch -= 0x10000; + + buffer[0] = 0xd8 | (ch >> 18); + buffer[1] = ch >> 10; + buffer[2] = 0xdc | ((ch >> 8) & 0x03); + buffer[3] = ch; + + if (cupsFileWrite(fp, (char *)buffer, 4) == 4) + return (0); + } + + return (-1); +} + + +// +// End of "$Id: ppdc-catalog.cxx 9384 2010-11-22 07:06:39Z mike $". +// diff --git a/ppdc/ppdc-choice.cxx b/ppdc/ppdc-choice.cxx new file mode 100644 index 0000000..e3d0dff --- /dev/null +++ b/ppdc/ppdc-choice.cxx @@ -0,0 +1,61 @@ +// +// "$Id: ppdc-choice.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Option choice class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcChoice::ppdcChoice() - Create a new option choice. +// ppdcChoice::~ppdcChoice() - Destroy an option choice. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcChoice::ppdcChoice()' - Create a new option choice. +// + +ppdcChoice::ppdcChoice(const char *n, // I - Name of choice + const char *t, // I - Text of choice + const char *c) // I - Code of choice + : ppdcShared() +{ + PPDC_NEW; + + name = new ppdcString(n); + text = new ppdcString(t); + code = new ppdcString(c); +} + + +// +// 'ppdcChoice::~ppdcChoice()' - Destroy an option choice. +// + +ppdcChoice::~ppdcChoice() +{ + PPDC_DELETE; + + name->release(); + text->release(); + code->release(); +} + + +// +// End of "$Id: ppdc-choice.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-constraint.cxx b/ppdc/ppdc-constraint.cxx new file mode 100644 index 0000000..aecd5f0 --- /dev/null +++ b/ppdc/ppdc-constraint.cxx @@ -0,0 +1,64 @@ +// +// "$Id: ppdc-constraint.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Contraint class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcConstraint::ppdcConstraint() - Create a constraint. +// ppdcConstraint::~ppdcConstraint() - Destroy a constraint. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcConstraint::ppdcConstraint()' - Create a constraint. +// + +ppdcConstraint::ppdcConstraint(const char *o1, // I - First option + const char *c1, // I - First choice + const char *o2, // I - Second option + const char *c2) // I - Second choice + : ppdcShared() +{ + PPDC_NEW; + + option1 = new ppdcString(o1); + choice1 = new ppdcString(c1); + option2 = new ppdcString(o2); + choice2 = new ppdcString(c2); +} + + +// +// 'ppdcConstraint::~ppdcConstraint()' - Destroy a constraint. +// + +ppdcConstraint::~ppdcConstraint() +{ + PPDC_DELETE; + + option1->release(); + choice1->release(); + option2->release(); + choice2->release(); +} + + +// +// End of "$Id: ppdc-constraint.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-driver.cxx b/ppdc/ppdc-driver.cxx new file mode 100644 index 0000000..5235f44 --- /dev/null +++ b/ppdc/ppdc-driver.cxx @@ -0,0 +1,1339 @@ +// +// "$Id: ppdc-driver.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// PPD file compiler definitions for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2006 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcDriver::ppdcDriver() - Create a new printer driver. +// ppdcDriver::~ppdcDriver() - Destroy a printer driver. +// ppdcDriver::find_attr() - Find an attribute. +// ppdcDriver::find_group() - Find a group. +// ppdcDriver::find_option() - Find an option. +// ppdcDriver::find_option_group() - Find an option and its group. +// ppdcDriver::set_custom_size_code() - Set the custom page size code. +// ppdcDriver::set_default_font() - Set the default font name. +// ppdcDriver::set_default_size() - Set the default size name. +// ppdcDriver::set_file_name() - Set the full filename. +// ppdcDriver::set_manufacturer() - Set the manufacturer name. +// ppdcDriver::set_model_name() - Set the model name. +// ppdcDriver::set_pc_file_name() - Set the PC filename. +// ppdcDriver::set_version() - Set the version string. +// ppdcDriver::write_ppd_file() - Write a PPD file... +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcDriver::ppdcDriver()' - Create a new printer driver. +// + +ppdcDriver::ppdcDriver(ppdcDriver *d) // I - Printer driver template + : ppdcShared() +{ + ppdcGroup *g; // Current group + + + PPDC_NEW; + + if (d) + { + // Bump the use count of any strings we inherit... + if (d->manufacturer) + d->manufacturer->retain(); + if (d->version) + d->version->retain(); + if (d->default_font) + d->default_font->retain(); + if (d->default_size) + d->default_size->retain(); + if (d->custom_size_code) + d->custom_size_code->retain(); + + // Copy all of the data from the driver template... + copyright = new ppdcArray(d->copyright); + manufacturer = d->manufacturer; + model_name = 0; + file_name = 0; + pc_file_name = 0; + type = d->type; + version = d->version; + model_number = d->model_number; + manual_copies = d->manual_copies; + color_device = d->color_device; + throughput = d->throughput; + attrs = new ppdcArray(d->attrs); + constraints = new ppdcArray(d->constraints); + filters = new ppdcArray(d->filters); + fonts = new ppdcArray(d->fonts); + profiles = new ppdcArray(d->profiles); + sizes = new ppdcArray(d->sizes); + default_font = d->default_font; + default_size = d->default_size; + variable_paper_size = d->variable_paper_size; + custom_size_code = d->custom_size_code; + left_margin = d->left_margin; + bottom_margin = d->bottom_margin; + right_margin = d->right_margin; + top_margin = d->top_margin; + max_width = d->max_width; + max_length = d->max_length; + min_width = d->min_width; + min_length = d->min_length; + + // Then copy the groups manually, since we want separate copies + // of the groups and options... + groups = new ppdcArray(); + + for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next()) + groups->add(new ppdcGroup(g)); + } + else + { + // Zero all of the data in the driver... + copyright = new ppdcArray(); + manufacturer = 0; + model_name = 0; + file_name = 0; + pc_file_name = 0; + version = 0; + type = PPDC_DRIVER_CUSTOM; + model_number = 0; + manual_copies = 0; + color_device = 0; + throughput = 1; + attrs = new ppdcArray(); + constraints = new ppdcArray(); + fonts = new ppdcArray(); + filters = new ppdcArray(); + groups = new ppdcArray(); + profiles = new ppdcArray(); + sizes = new ppdcArray(); + default_font = 0; + default_size = 0; + variable_paper_size = 0; + custom_size_code = 0; + left_margin = 0; + bottom_margin = 0; + right_margin = 0; + top_margin = 0; + max_width = 0; + max_length = 0; + min_width = 0; + min_length = 0; + } +} + + +// +// 'ppdcDriver::~ppdcDriver()' - Destroy a printer driver. +// + +ppdcDriver::~ppdcDriver() +{ + PPDC_DELETE; + + copyright->release(); + + if (manufacturer) + manufacturer->release(); + if (model_name) + model_name->release(); + if (file_name) + file_name->release(); + if (pc_file_name) + pc_file_name->release(); + if (version) + version->release(); + if (default_font) + default_font->release(); + if (default_size) + default_size->release(); + if (custom_size_code) + custom_size_code->release(); + + attrs->release(); + constraints->release(); + filters->release(); + fonts->release(); + groups->release(); + profiles->release(); + sizes->release(); +} + + +// +// 'ppdcDriver::find_attr()' - Find an attribute. +// + +ppdcAttr * // O - Attribute or NULL +ppdcDriver::find_attr(const char *k, // I - Keyword string + const char *s) // I - Spec string +{ + ppdcAttr *a; // Current attribute + + + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + if (!strcmp(a->name->value, k) && + ((!s && (!a->selector->value || !a->selector->value[0])) || + (s && a->selector->value && !strcmp(a->selector->value, s)))) + return (a); + + return (NULL); +} + + +// +// 'ppdcDriver::find_group()' - Find a group. +// + +ppdcGroup * // O - Matching group or NULL +ppdcDriver::find_group(const char *n) // I - Group name +{ + ppdcGroup *g; // Current group + + + for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next()) + if (!_cups_strcasecmp(n, g->name->value)) + return (g); + + return (0); +} + + +// +// 'ppdcDriver::find_option()' - Find an option. +// + +ppdcOption * // O - Matching option or NULL +ppdcDriver::find_option(const char *n) // I - Option name +{ + return (find_option_group(n, (ppdcGroup **)0)); +} + + +// +// 'ppdcDriver::find_option_group()' - Find an option and its group. +// + +ppdcOption * // O - Matching option or NULL +ppdcDriver::find_option_group( + const char *n, // I - Option name + ppdcGroup **mg) // O - Matching group or NULL +{ + ppdcGroup *g; // Current group + ppdcOption *o; // Current option + + + for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next()) + for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next()) + if (!_cups_strcasecmp(n, o->name->value)) + { + if (mg) + *mg = g; + + return (o); + } + + if (mg) + *mg = (ppdcGroup *)0; + + return (0); +} + + +// +// 'ppdcDriver::set_custom_size_code()' - Set the custom page size code. +// + +void +ppdcDriver::set_custom_size_code( + const char *c) // I - CustomPageSize code +{ + if (custom_size_code) + custom_size_code->release(); + + custom_size_code = new ppdcString(c); +} + + +// +// 'ppdcDriver::set_default_font()' - Set the default font name. +// + +void +ppdcDriver::set_default_font( + ppdcFont *f) // I - Font +{ + if (default_font) + default_font->release(); + + if (f) + { + f->name->retain(); + default_font = f->name; + } + else + default_font = 0; +} + + +// +// 'ppdcDriver::set_default_size()' - Set the default size name. +// + +void +ppdcDriver::set_default_size( + ppdcMediaSize *m) // I - Media size +{ + if (default_size) + default_size->release(); + + if (m) + { + m->name->retain(); + default_size = m->name; + } + else + default_size = 0; +} + + +// +// 'ppdcDriver::set_file_name()' - Set the full filename. +// + +void +ppdcDriver::set_file_name(const char *f)// I - Filename +{ + if (file_name) + file_name->release(); + + file_name = new ppdcString(f); +} + + +// +// 'ppdcDriver::set_manufacturer()' - Set the manufacturer name. +// + +void +ppdcDriver::set_manufacturer( + const char *m) // I - Model name +{ + if (manufacturer) + manufacturer->release(); + + manufacturer = new ppdcString(m); +} + + +// +// 'ppdcDriver::set_model_name()' - Set the model name. +// + +void +ppdcDriver::set_model_name( + const char *m) // I - Model name +{ + if (model_name) + model_name->release(); + + model_name = new ppdcString(m); +} + + +// +// 'ppdcDriver::set_pc_file_name()' - Set the PC filename. +// + +void +ppdcDriver::set_pc_file_name( + const char *f) // I - Filename +{ + if (pc_file_name) + pc_file_name->release(); + + pc_file_name = new ppdcString(f); +} + + +// +// 'ppdcDriver::set_version()' - Set the version string. +// + +void +ppdcDriver::set_version(const char *v) // I - Version +{ + if (version) + version->release(); + + version = new ppdcString(v); +} + + +// +// 'ppdcDriver::write_ppd_file()' - Write a PPD file... +// + +int // O - 0 on success, -1 on failure +ppdcDriver::write_ppd_file( + cups_file_t *fp, // I - PPD file + ppdcCatalog *catalog, // I - Message catalog + ppdcArray *locales, // I - Additional languages to add + ppdcSource *src, // I - Driver source + ppdcLineEnding le) // I - Line endings to use +{ + bool delete_cat; // Delete the catalog when we are done? + char query[42], // Query attribute + custom[42]; // Custom attribute + ppdcString *s; // Copyright string + ppdcGroup *g; // Current group + ppdcOption *o; // Current option + ppdcChoice *c; // Current choice + ppdcMediaSize *m; // Current media size + ppdcProfile *p; // Current color profile + ppdcFilter *f; // Current filter + ppdcFont *fn, // Current font + *bfn; // Current base font + ppdcConstraint *cn; // Current constraint + ppdcAttr *a; // Current attribute + const char *lf; // Linefeed character to use + + + // If we don't have a message catalog, use an empty (English) one... + if (!catalog) + { + catalog = new ppdcCatalog("en"); + delete_cat = true; + } + else + delete_cat = false; + + // Figure out the end-of-line string... + if (le == PPDC_LFONLY) + lf = "\n"; + else if (le == PPDC_CRONLY) + lf = "\r"; + else + lf = "\r\n"; + + // Write the standard header stuff... + cupsFilePrintf(fp, "*PPD-Adobe: \"4.3\"%s", lf); + cupsFilePrintf(fp, "*%%%%%%%% PPD file for %s with CUPS.%s", + model_name->value, lf); + cupsFilePrintf(fp, + "*%%%%%%%% Created by the CUPS PPD Compiler " CUPS_SVERSION + ".%s", lf); + for (s = (ppdcString *)copyright->first(); + s; + s = (ppdcString *)copyright->next()) + cupsFilePrintf(fp, "*%% %s%s", catalog->find_message(s->value), lf); + cupsFilePrintf(fp, "*FormatVersion: \"4.3\"%s", lf); + cupsFilePrintf(fp, "*FileVersion: \"%s\"%s", version->value, lf); + + a = find_attr("LanguageVersion", NULL); + cupsFilePrintf(fp, "*LanguageVersion: %s%s", + catalog->find_message(a ? a->value->value : "English"), lf); + + a = find_attr("LanguageEncoding", NULL); + cupsFilePrintf(fp, "*LanguageEncoding: %s%s", + catalog->find_message(a ? a->value->value : "ISOLatin1"), lf); + + cupsFilePrintf(fp, "*PCFileName: \"%s\"%s", pc_file_name->value, lf); + + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + if (!strcmp(a->name->value, "Product")) + break; + + if (a) + { + for (; a; a = (ppdcAttr *)attrs->next()) + if (!strcmp(a->name->value, "Product")) + cupsFilePrintf(fp, "*Product: \"%s\"%s", a->value->value, lf); + } + else + cupsFilePrintf(fp, "*Product: \"(%s)\"%s", model_name->value, lf); + + cupsFilePrintf(fp, "*Manufacturer: \"%s\"%s", + catalog->find_message(manufacturer->value), lf); + + if ((a = find_attr("ModelName", NULL)) != NULL) + cupsFilePrintf(fp, "*ModelName: \"%s\"%s", + catalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*ModelName: \"%s %s\"%s", + catalog->find_message(manufacturer->value), + catalog->find_message(model_name->value), lf); + else + cupsFilePrintf(fp, "*ModelName: \"%s\"%s", + catalog->find_message(model_name->value), lf); + + if ((a = find_attr("ShortNickName", NULL)) != NULL) + cupsFilePrintf(fp, "*ShortNickName: \"%s\"%s", + catalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*ShortNickName: \"%s %s\"%s", + catalog->find_message(manufacturer->value), + catalog->find_message(model_name->value), lf); + else + cupsFilePrintf(fp, "*ShortNickName: \"%s\"%s", + catalog->find_message(model_name->value), lf); + + if ((a = find_attr("NickName", NULL)) != NULL) + cupsFilePrintf(fp, "*NickName: \"%s\"%s", + catalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*NickName: \"%s %s, %s\"%s", + catalog->find_message(manufacturer->value), + catalog->find_message(model_name->value), version->value, + lf); + else + cupsFilePrintf(fp, "*NickName: \"%s, %s\"%s", + catalog->find_message(model_name->value), version->value, + lf); + + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + if (!strcmp(a->name->value, "PSVersion")) + break; + + if (a) + { + for (; a; a = (ppdcAttr *)attrs->next()) + if (!strcmp(a->name->value, "PSVersion")) + cupsFilePrintf(fp, "*PSVersion: \"%s\"%s", a->value->value, lf); + } + else + cupsFilePrintf(fp, "*PSVersion: \"(3010.000) 0\"%s", lf); + + if ((a = find_attr("LanguageLevel", NULL)) != NULL) + cupsFilePrintf(fp, "*LanguageLevel: \"%s\"%s", a->value->value, lf); + else + cupsFilePrintf(fp, "*LanguageLevel: \"3\"%s", lf); + + cupsFilePrintf(fp, "*ColorDevice: %s%s", color_device ? "True" : "False", lf); + + if ((a = find_attr("DefaultColorSpace", NULL)) != NULL) + cupsFilePrintf(fp, "*DefaultColorSpace: %s%s", a->value->value, lf); + else + cupsFilePrintf(fp, "*DefaultColorSpace: %s%s", + color_device ? "RGB" : "Gray", lf); + + if ((a = find_attr("FileSystem", NULL)) != NULL) + cupsFilePrintf(fp, "*FileSystem: %s%s", a->value->value, lf); + else + cupsFilePrintf(fp, "*FileSystem: False%s", lf); + + cupsFilePrintf(fp, "*Throughput: \"%d\"%s", throughput, lf); + + if ((a = find_attr("LandscapeOrientation", NULL)) != NULL) + cupsFilePrintf(fp, "*LandscapeOrientation: %s%s", a->value->value, lf); + else + cupsFilePrintf(fp, "*LandscapeOrientation: Plus90%s", lf); + + if ((a = find_attr("TTRasterizer", NULL)) != NULL) + cupsFilePrintf(fp, "*TTRasterizer: %s%s", a->value->value, lf); + else if (type != PPDC_DRIVER_PS) + cupsFilePrintf(fp, "*TTRasterizer: Type42%s", lf); + + struct lconv *loc = localeconv(); + + if (attrs->count) + { + // Write driver-defined attributes... + cupsFilePrintf(fp, "*%% Driver-defined attributes...%s", lf); + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + { + if (!strcmp(a->name->value, "Product") || + !strcmp(a->name->value, "PSVersion") || + !strcmp(a->name->value, "LanguageLevel") || + !strcmp(a->name->value, "DefaultColorSpace") || + !strcmp(a->name->value, "FileSystem") || + !strcmp(a->name->value, "LandscapeOrientation") || + !strcmp(a->name->value, "TTRasterizer") || + !strcmp(a->name->value, "LanguageVersion") || + !strcmp(a->name->value, "LanguageEncoding") || + !strcmp(a->name->value, "ModelName") || + !strcmp(a->name->value, "NickName") || + !strcmp(a->name->value, "ShortNickName") || + !strcmp(a->name->value, "cupsVersion")) + continue; + + if (a->name->value[0] == '?' && + (find_option(a->name->value + 1) || + !strcmp(a->name->value, "?ImageableArea") || + !strcmp(a->name->value, "?PageRegion") || + !strcmp(a->name->value, "?PageSize") || + !strcmp(a->name->value, "?PaperDimension"))) + continue; + + if (!strncmp(a->name->value, "Custom", 6) && + find_option(a->name->value + 6)) + continue; + + if (!strncmp(a->name->value, "ParamCustom", 11) && + find_option(a->name->value + 11)) + continue; + + if (!a->selector->value || !a->selector->value[0]) + cupsFilePrintf(fp, "*%s", a->name->value); + else if (!a->text->value || !a->text->value[0]) + cupsFilePrintf(fp, "*%s %s", a->name->value, a->selector->value); + else + cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value, + a->text->value); + + if (strcmp(a->value->value, "False") && + strcmp(a->value->value, "True") && + strcmp(a->name->value, "1284Modes") && + strcmp(a->name->value, "InkName") && + strcmp(a->name->value, "PageStackOrder") && + strncmp(a->name->value, "ParamCustom", 11) && + strcmp(a->name->value, "Protocols") && + strcmp(a->name->value, "ReferencePunch") && + strncmp(a->name->value, "Default", 7)) + { + cupsFilePrintf(fp, ": \"%s\"%s", a->value->value, lf); + + if (strchr(a->value->value, '\n') || strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + else + cupsFilePrintf(fp, ": %s%s", a->value->value, lf); + } + } + + if (type != PPDC_DRIVER_PS || filters->count) + { + if ((a = find_attr("cupsVersion", NULL)) != NULL) + cupsFilePrintf(fp, "*cupsVersion: %s%s", a->value->value, lf); + else + cupsFilePrintf(fp, "*cupsVersion: %d.%d%s", CUPS_VERSION_MAJOR, + CUPS_VERSION_MINOR, lf); + cupsFilePrintf(fp, "*cupsModelNumber: %d%s", model_number, lf); + cupsFilePrintf(fp, "*cupsManualCopies: %s%s", + manual_copies ? "True" : "False", lf); + + if (filters->count) + { + for (f = (ppdcFilter *)filters->first(); + f; + f = (ppdcFilter *)filters->next()) + cupsFilePrintf(fp, "*cupsFilter: \"%s %d %s\"%s", f->mime_type->value, + f->cost, f->program->value, lf); + } + else + { + switch (type) + { + case PPDC_DRIVER_LABEL : + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 " + "rastertolabel\"%s", lf); + break; + + case PPDC_DRIVER_EPSON : + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 " + "rastertoepson\"%s", lf); + break; + + case PPDC_DRIVER_ESCP : + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-command 50 " + "commandtoescpx\"%s", lf); + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 " + "rastertoescpx\"%s", lf); + break; + + case PPDC_DRIVER_HP : + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 " + "rastertohp\"%s", lf); + break; + + case PPDC_DRIVER_PCL : + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-command 50 " + "commandtopclx\"%s", lf); + cupsFilePrintf(fp, "*cupsFilter: \"application/vnd.cups-raster 50 " + "rastertopclx\"%s", lf); + break; + + default : + break; + } + } + + for (p = (ppdcProfile *)profiles->first(); + p; + p = (ppdcProfile *)profiles->next()) + { + char density[255], gamma[255], profile[9][255]; + + _cupsStrFormatd(density, density + sizeof(density), p->density, loc); + _cupsStrFormatd(gamma, gamma + sizeof(gamma), p->gamma, loc); + + for (int i = 0; i < 9; i ++) + _cupsStrFormatd(profile[i], profile[i] + sizeof(profile[0]), + p->profile[i], loc); + + cupsFilePrintf(fp, + "*cupsColorProfile %s/%s: \"%s %s %s %s %s %s %s %s %s %s " + "%s\"%s", p->resolution->value, p->media_type->value, + density, gamma, profile[0], profile[1], profile[2], + profile[3], profile[4], profile[5], profile[6], profile[7], + profile[8], lf); + } + } + + if (locales) + { + // Add localizations for additional languages... + ppdcString *locale; // Locale name + ppdcCatalog *locatalog; // Message catalog for locale + + + // Write the list of languages... + cupsFilePrintf(fp, "*cupsLanguages: \"en"); + + for (locale = (ppdcString *)locales->first(); + locale; + locale = (ppdcString *)locales->next()) + { + // Skip (US) English... + if (!strcmp(locale->value, "en") || !strcmp(locale->value, "en_US")) + continue; + + // See if we have a po file for this language... + if (!src->find_po(locale->value)) + { + // No, see if we can use the base file? + locatalog = new ppdcCatalog(locale->value); + + if (locatalog->messages->count == 0) + { + // No, skip this one... + _cupsLangPrintf(stderr, + _("ppdc: No message catalog provided for locale " + "%s."), locale->value); + continue; + } + + // Add the base file to the list... + src->po_files->add(locatalog); + } + + cupsFilePrintf(fp, " %s", locale->value); + } + + cupsFilePrintf(fp, "\"%s", lf); + } + + for (cn = (ppdcConstraint *)constraints->first(); + cn; + cn = (ppdcConstraint *)constraints->next()) + { + // First constrain 1 against 2... + if (!strncmp(cn->option1->value, "*Custom", 7) || + !strncmp(cn->option2->value, "*Custom", 7)) + cupsFilePuts(fp, "*NonUIConstraints: "); + else + cupsFilePuts(fp, "*UIConstraints: "); + + if (cn->option1->value[0] != '*') + cupsFilePutChar(fp, '*'); + + cupsFilePuts(fp, cn->option1->value); + + if (cn->choice1->value) + cupsFilePrintf(fp, " %s", cn->choice1->value); + + cupsFilePutChar(fp, ' '); + + if (cn->option2->value[0] != '*') + cupsFilePutChar(fp, '*'); + + cupsFilePuts(fp, cn->option2->value); + + if (cn->choice2->value) + cupsFilePrintf(fp, " %s", cn->choice2->value); + + cupsFilePuts(fp, lf); + + // Then constrain 2 against 1... + if (!strncmp(cn->option1->value, "*Custom", 7) || + !strncmp(cn->option2->value, "*Custom", 7)) + cupsFilePuts(fp, "*NonUIConstraints: "); + else + cupsFilePuts(fp, "*UIConstraints: "); + + if (cn->option2->value[0] != '*') + cupsFilePutChar(fp, '*'); + + cupsFilePuts(fp, cn->option2->value); + + if (cn->choice2->value) + cupsFilePrintf(fp, " %s", cn->choice2->value); + + cupsFilePutChar(fp, ' '); + + if (cn->option1->value[0] != '*') + cupsFilePutChar(fp, '*'); + + cupsFilePuts(fp, cn->option1->value); + + if (cn->choice1->value) + cupsFilePrintf(fp, " %s", cn->choice1->value); + + cupsFilePuts(fp, lf); + } + + // PageSize option... + cupsFilePrintf(fp, "*OpenUI *PageSize/Media Size: PickOne%s", lf); + cupsFilePrintf(fp, "*OrderDependency: 10 AnySetup *PageSize%s", lf); + cupsFilePrintf(fp, "*DefaultPageSize: %s%s", + default_size ? default_size->value : "Letter", lf); + + for (m = (ppdcMediaSize *)sizes->first(); + m; + m = (ppdcMediaSize *)sizes->next()) + if (m->size_code->value) + { + cupsFilePrintf(fp, "*PageSize %s/%s: \"%s\"%s", + m->name->value, catalog->find_message(m->text->value), + m->size_code->value, lf); + + if (strchr(m->size_code->value, '\n') || + strchr(m->size_code->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + else + cupsFilePrintf(fp, + "*PageSize %s/%s: \"<>setpagedevice\"%s", + m->name->value, catalog->find_message(m->text->value), + m->width, m->length, lf); + + if ((a = find_attr("?PageSize", NULL)) != NULL) + { + cupsFilePrintf(fp, "*?PageSize: \"%s\"%s", a->value->value, lf); + + if (strchr(a->value->value, '\n') || + strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + cupsFilePrintf(fp, "*CloseUI: *PageSize%s", lf); + + // PageRegion option... + cupsFilePrintf(fp, "*OpenUI *PageRegion/Media Size: PickOne%s", lf); + cupsFilePrintf(fp, "*OrderDependency: 10 AnySetup *PageRegion%s", lf); + cupsFilePrintf(fp, "*DefaultPageRegion: %s%s", + default_size ? default_size->value : "Letter", lf); + + for (m = (ppdcMediaSize *)sizes->first(); + m; + m = (ppdcMediaSize *)sizes->next()) + if (m->region_code->value) + { + cupsFilePrintf(fp, "*PageRegion %s/%s: \"%s\"%s", + m->name->value, catalog->find_message(m->text->value), + m->region_code->value, lf); + + if (strchr(m->region_code->value, '\n') || + strchr(m->region_code->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + else + cupsFilePrintf(fp, + "*PageRegion %s/%s: \"<>setpagedevice\"%s", + m->name->value, catalog->find_message(m->text->value), + m->width, m->length, lf); + + if ((a = find_attr("?PageRegion", NULL)) != NULL) + { + cupsFilePrintf(fp, "*?PageRegion: \"%s\"%s", a->value->value, lf); + + if (strchr(a->value->value, '\n') || + strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + cupsFilePrintf(fp, "*CloseUI: *PageRegion%s", lf); + + // ImageableArea info... + cupsFilePrintf(fp, "*DefaultImageableArea: %s%s", + default_size ? default_size->value : "Letter", lf); + + char left[255], right[255], bottom[255], top[255]; + + for (m = (ppdcMediaSize *)sizes->first(); + m; + m = (ppdcMediaSize *)sizes->next()) + { + _cupsStrFormatd(left, left + sizeof(left), m->left, loc); + _cupsStrFormatd(bottom, bottom + sizeof(bottom), m->bottom, loc); + _cupsStrFormatd(right, right + sizeof(right), m->width - m->right, loc); + _cupsStrFormatd(top, top + sizeof(top), m->length - m->top, loc); + + cupsFilePrintf(fp, "*ImageableArea %s/%s: \"%s %s %s %s\"%s", + m->name->value, catalog->find_message(m->text->value), + left, bottom, right, top, lf); + } + + if ((a = find_attr("?ImageableArea", NULL)) != NULL) + { + cupsFilePrintf(fp, "*?ImageableArea: \"%s\"%s", a->value->value, lf); + + if (strchr(a->value->value, '\n') || + strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + // PaperDimension info... + cupsFilePrintf(fp, "*DefaultPaperDimension: %s%s", + default_size ? default_size->value : "Letter", lf); + + char width[255], length[255]; + + for (m = (ppdcMediaSize *)sizes->first(); + m; + m = (ppdcMediaSize *)sizes->next()) + { + _cupsStrFormatd(width, width + sizeof(width), m->width, loc); + _cupsStrFormatd(length, length + sizeof(length), m->length, loc); + + cupsFilePrintf(fp, "*PaperDimension %s/%s: \"%s %s\"%s", + m->name->value, catalog->find_message(m->text->value), + width, length, lf); + } + + if ((a = find_attr("?PaperDimension", NULL)) != NULL) + { + cupsFilePrintf(fp, "*?PaperDimension: \"%s\"%s", a->value->value, lf); + + if (strchr(a->value->value, '\n') || + strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + // Custom size support... + if (variable_paper_size) + { + _cupsStrFormatd(width, width + sizeof(width), max_width, loc); + _cupsStrFormatd(length, length + sizeof(length), max_length, loc); + + _cupsStrFormatd(left, left + sizeof(left), left_margin, loc); + _cupsStrFormatd(bottom, bottom + sizeof(bottom), bottom_margin, loc); + _cupsStrFormatd(right, right + sizeof(right), right_margin, loc); + _cupsStrFormatd(top, top + sizeof(top), top_margin, loc); + + cupsFilePrintf(fp, "*MaxMediaWidth: \"%s\"%s", width, lf); + cupsFilePrintf(fp, "*MaxMediaHeight: \"%s\"%s", length, lf); + cupsFilePrintf(fp, "*HWMargins: %s %s %s %s%s", left, bottom, right, top, + lf); + + if (custom_size_code && custom_size_code->value) + { + cupsFilePrintf(fp, "*CustomPageSize True: \"%s\"%s", + custom_size_code->value, lf); + + if (strchr(custom_size_code->value, '\n') || + strchr(custom_size_code->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + else + cupsFilePrintf(fp, + "*CustomPageSize True: \"pop pop pop <>setpagedevice\"%s", lf); + + if ((a = find_attr("ParamCustomPageSize", "Width")) != NULL) + cupsFilePrintf(fp, "*ParamCustomPageSize Width: %s%s", a->value->value, + lf); + else + { + char width0[255]; + + _cupsStrFormatd(width0, width0 + sizeof(width0), min_width, loc); + _cupsStrFormatd(width, width + sizeof(width), max_width, loc); + + cupsFilePrintf(fp, "*ParamCustomPageSize Width: 1 points %s %s%s", + width0, width, lf); + } + + if ((a = find_attr("ParamCustomPageSize", "Height")) != NULL) + cupsFilePrintf(fp, "*ParamCustomPageSize Height: %s%s", a->value->value, + lf); + else + { + char length0[255]; + + _cupsStrFormatd(length0, length0 + sizeof(length0), min_length, loc); + _cupsStrFormatd(length, length + sizeof(length), max_length, loc); + + cupsFilePrintf(fp, "*ParamCustomPageSize Height: 2 points %s %s%s", + length0, length, lf); + } + + if ((a = find_attr("ParamCustomPageSize", "WidthOffset")) != NULL) + cupsFilePrintf(fp, "*ParamCustomPageSize WidthOffset: %s%s", + a->value->value, lf); + else + cupsFilePrintf(fp, "*ParamCustomPageSize WidthOffset: 3 points 0 0%s", lf); + + if ((a = find_attr("ParamCustomPageSize", "HeightOffset")) != NULL) + cupsFilePrintf(fp, "*ParamCustomPageSize HeightOffset: %s%s", + a->value->value, lf); + else + cupsFilePrintf(fp, "*ParamCustomPageSize HeightOffset: 4 points 0 0%s", lf); + + if ((a = find_attr("ParamCustomPageSize", "Orientation")) != NULL) + cupsFilePrintf(fp, "*ParamCustomPageSize Orientation: %s%s", + a->value->value, lf); + else + cupsFilePrintf(fp, "*ParamCustomPageSize Orientation: 5 int 0 0%s", lf); + } + + // All other options... + for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next()) + { + if (!g->options->count) + continue; + + if (_cups_strcasecmp(g->name->value, "General")) + cupsFilePrintf(fp, "*OpenGroup: %s/%s%s", g->name->value, + catalog->find_message(g->text->value), lf); + + for (o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + { + if (!o->choices->count) + continue; + + if (!o->text->value) + cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value, + catalog->find_message(o->name->value)); + else + cupsFilePrintf(fp, "*OpenUI *%s/%s: ", o->name->value, + catalog->find_message(o->text->value)); + + switch (o->type) + { + case PPDC_BOOLEAN : + cupsFilePrintf(fp, "Boolean%s", lf); + break; + default : + cupsFilePrintf(fp, "PickOne%s", lf); + break; + case PPDC_PICKMANY : + cupsFilePrintf(fp, "PickMany%s", lf); + break; + } + + char order[255]; + _cupsStrFormatd(order, order + sizeof(order), o->order, loc); + + cupsFilePrintf(fp, "*OrderDependency: %s ", order); + switch (o->section) + { + default : + cupsFilePrintf(fp, "AnySetup"); + break; + case PPDC_SECTION_DOCUMENT : + cupsFilePrintf(fp, "DocumentSetup"); + break; + case PPDC_SECTION_EXIT : + cupsFilePrintf(fp, "ExitServer"); + break; + case PPDC_SECTION_JCL : + cupsFilePrintf(fp, "JCLSetup"); + break; + case PPDC_SECTION_PAGE : + cupsFilePrintf(fp, "PageSetup"); + break; + case PPDC_SECTION_PROLOG : + cupsFilePrintf(fp, "Prolog"); + break; + } + + cupsFilePrintf(fp, " *%s%s", o->name->value, lf); + + if (o->defchoice) + { + // Use the programmer-supplied default... + cupsFilePrintf(fp, "*Default%s: %s%s", o->name->value, + o->defchoice->value, lf); + } + else + { + // Make the first choice the default... + c = (ppdcChoice *)o->choices->first(); + cupsFilePrintf(fp, "*Default%s: %s%s", o->name->value, c->name->value, + lf); + } + + for (c = (ppdcChoice *)o->choices->first(); + c; + c = (ppdcChoice *)o->choices->next()) + { + // Write this choice... + if (!c->text->value) + cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value, + c->name->value, catalog->find_message(c->name->value), + c->code->value, lf); + else + cupsFilePrintf(fp, "*%s %s/%s: \"%s\"%s", o->name->value, + c->name->value, catalog->find_message(c->text->value), + c->code->value, lf); + + // Multi-line commands need a *End line to terminate them. + if (strchr(c->code->value, '\n') || + strchr(c->code->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + snprintf(query, sizeof(query), "?%s", o->name->value); + + if ((a = find_attr(query, NULL)) != NULL) + { + cupsFilePrintf(fp, "*%s: \"%s\"%s", query, a->value->value, lf); + + if (strchr(a->value->value, '\n') || + strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + } + + cupsFilePrintf(fp, "*CloseUI: *%s%s", o->name->value, lf); + + snprintf(custom, sizeof(custom), "Custom%s", o->name->value); + if ((a = find_attr(custom, "True")) != NULL) + { + // Output custom option information... + cupsFilePrintf(fp, "*%s True: \"%s\"%s", custom, a->value->value, lf); + if (strchr(a->value->value, '\n') || strchr(a->value->value, '\r')) + cupsFilePrintf(fp, "*End%s", lf); + + snprintf(custom, sizeof(custom), "ParamCustom%s", o->name->value); + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + { + if (strcmp(a->name->value, custom)) + continue; + + if (!a->selector->value || !a->selector->value[0]) + cupsFilePrintf(fp, "*%s", a->name->value); + else if (!a->text->value || !a->text->value[0]) + cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value, + catalog->find_message(a->selector->value)); + else + cupsFilePrintf(fp, "*%s %s/%s", a->name->value, a->selector->value, + catalog->find_message(a->text->value)); + + cupsFilePrintf(fp, ": %s%s", a->value->value, lf); + } + } + } + + if (_cups_strcasecmp(g->name->value, "General")) + cupsFilePrintf(fp, "*CloseGroup: %s%s", g->name->value, lf); + } + + if (locales) + { + // Add localizations for additional languages... + ppdcString *locale; // Locale name + ppdcCatalog *locatalog; // Message catalog for locale + + + // Write the translation strings for each language... + for (locale = (ppdcString *)locales->first(); + locale; + locale = (ppdcString *)locales->next()) + { + // Skip (US) English... + if (!strcmp(locale->value, "en") || !strcmp(locale->value, "en_US")) + continue; + + // Skip missing languages... + if ((locatalog = src->find_po(locale->value)) == NULL) + continue; + + // Do the core stuff first... + cupsFilePrintf(fp, "*%s.Translation Manufacturer/%s: \"\"%s", + locale->value, + locatalog->find_message(manufacturer->value), lf); + + if ((a = find_attr("ModelName", NULL)) != NULL) + cupsFilePrintf(fp, "*%s.Translation ModelName/%s: \"\"%s", + locale->value, + locatalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*%s.Translation ModelName/%s %s: \"\"%s", + locale->value, + locatalog->find_message(manufacturer->value), + locatalog->find_message(model_name->value), lf); + else + cupsFilePrintf(fp, "*%s.Translation ModelName/%s: \"\"%s", + locale->value, + locatalog->find_message(model_name->value), lf); + + if ((a = find_attr("ShortNickName", NULL)) != NULL) + cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s: \"\"%s", + locale->value, + locatalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s %s: \"\"%s", + locale->value, + locatalog->find_message(manufacturer->value), + locatalog->find_message(model_name->value), lf); + else + cupsFilePrintf(fp, "*%s.Translation ShortNickName/%s: \"\"%s", + locale->value, + locatalog->find_message(model_name->value), lf); + + if ((a = find_attr("NickName", NULL)) != NULL) + cupsFilePrintf(fp, "*%s.Translation NickName/%s: \"\"%s", + locale->value, + locatalog->find_message(a->value->value), lf); + else if (_cups_strncasecmp(model_name->value, manufacturer->value, + strlen(manufacturer->value))) + cupsFilePrintf(fp, "*%s.Translation NickName/%s %s, %s: \"\"%s", + locale->value, + locatalog->find_message(manufacturer->value), + locatalog->find_message(model_name->value), + version->value, lf); + else + cupsFilePrintf(fp, "*%s.Translation NickName/%s, %s: \"\"%s", + locale->value, + locatalog->find_message(model_name->value), + version->value, lf); + + // Then the page sizes... + cupsFilePrintf(fp, "*%s.Translation PageSize/%s: \"\"%s", locale->value, + locatalog->find_message("Media Size"), lf); + + for (m = (ppdcMediaSize *)sizes->first(); + m; + m = (ppdcMediaSize *)sizes->next()) + { + cupsFilePrintf(fp, "*%s.PageSize %s/%s: \"\"%s", locale->value, + m->name->value, locatalog->find_message(m->text->value), + lf); + } + + // Next the groups and options... + for (g = (ppdcGroup *)groups->first(); g; g = (ppdcGroup *)groups->next()) + { + if (!g->options->count) + continue; + + if (_cups_strcasecmp(g->name->value, "General")) + cupsFilePrintf(fp, "*%s.Translation %s/%s: \"\"%s", locale->value, + g->name->value, + locatalog->find_message(g->text->value), lf); + + for (o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + { + if (!o->choices->count) + continue; + + cupsFilePrintf(fp, "*%s.Translation %s/%s: \"\"%s", locale->value, + o->name->value, + locatalog->find_message(o->text->value ? + o->text->value : + o->name->value), lf); + + for (c = (ppdcChoice *)o->choices->first(); + c; + c = (ppdcChoice *)o->choices->next()) + { + // Write this choice... + cupsFilePrintf(fp, "*%s.%s %s/%s: \"\"%s", locale->value, + o->name->value, c->name->value, + locatalog->find_message(c->text->value ? + c->text->value : + c->name->value), lf); + } + } + } + + // Finally the localizable attributes... + for (a = (ppdcAttr *)attrs->first(); a; a = (ppdcAttr *)attrs->next()) + { + if (!a->localizable && + (!a->text || !a->text->value || !a->text->value[0]) && + strcmp(a->name->value, "APCustomColorMatchingName") && + strcmp(a->name->value, "APPrinterPreset") && + strcmp(a->name->value, "cupsICCProfile") && + strcmp(a->name->value, "cupsIPPReason") && + strcmp(a->name->value, "cupsMarkerName") && + strncmp(a->name->value, "Custom", 6) && + strncmp(a->name->value, "ParamCustom", 11)) + continue; + + cupsFilePrintf(fp, "*%s.%s %s/%s: \"%s\"%s", locale->value, + a->name->value, a->selector->value, + locatalog->find_message(a->text && a->text->value ? + a->text->value : a->name->value), + ((a->localizable && a->value->value[0]) || + !strcmp(a->name->value, "cupsIPPReason")) ? + locatalog->find_message(a->value->value) : "", + lf); + } + } + } + + if (default_font && default_font->value) + cupsFilePrintf(fp, "*DefaultFont: %s%s", default_font->value, lf); + else + cupsFilePrintf(fp, "*DefaultFont: Courier%s", lf); + + for (fn = (ppdcFont *)fonts->first(); fn; fn = (ppdcFont *)fonts->next()) + if (!strcmp(fn->name->value, "*")) + { + for (bfn = (ppdcFont *)src->base_fonts->first(); + bfn; + bfn = (ppdcFont *)src->base_fonts->next()) + cupsFilePrintf(fp, "*Font %s: %s \"%s\" %s %s%s", + bfn->name->value, bfn->encoding->value, + bfn->version->value, bfn->charset->value, + bfn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf); + } + else + cupsFilePrintf(fp, "*Font %s: %s \"%s\" %s %s%s", + fn->name->value, fn->encoding->value, fn->version->value, + fn->charset->value, + fn->status == PPDC_FONT_ROM ? "ROM" : "Disk", lf); + + cupsFilePrintf(fp, "*%% End of %s, %05d bytes.%s", pc_file_name->value, + (int)(cupsFileTell(fp) + 25 + strlen(pc_file_name->value)), + lf); + + if (delete_cat) + catalog->release(); + + return (0); +} + + +// +// End of "$Id: ppdc-driver.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc-file.cxx b/ppdc/ppdc-file.cxx new file mode 100644 index 0000000..0e373f9 --- /dev/null +++ b/ppdc/ppdc-file.cxx @@ -0,0 +1,110 @@ +// +// "$Id: ppdc-file.cxx 10338 2012-03-07 06:05:39Z mike $" +// +// File class for the CUPS PPD Compiler. +// +// Copyright 2007-2010 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcFile::ppdcFile() - Create (open) a file. +// ppdcFile::~ppdcFile() - Delete (close) a file. +// ppdcFile::get() - Get a character from a file. +// ppdcFile::peek() - Look at the next character from a file. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcFile::ppdcFile()' - Create (open) a file. +// + +ppdcFile::ppdcFile(const char *f, // I - File to open + cups_file_t *ffp) // I - File pointer to use +{ + if (ffp) + { + fp = ffp; + cupsFileRewind(fp); + } + else + fp = cupsFileOpen(f, "r"); + + close_on_delete = !ffp; + filename = f; + line = 1; + + if (!fp) + _cupsLangPrintf(stderr, _("ppdc: Unable to open %s: %s"), f, + strerror(errno)); +} + + +// +// 'ppdcFile::~ppdcFile()' - Delete (close) a file. +// + +ppdcFile::~ppdcFile() +{ + if (close_on_delete && fp) + cupsFileClose(fp); +} + + +// +// 'ppdcFile::get()' - Get a character from a file. +// + +int +ppdcFile::get() +{ + int ch; // Character from file + + + // Return EOF if there is no open file... + if (!fp) + return (EOF); + + // Get the character... + ch = cupsFileGetChar(fp); + + // Update the line number as needed... + if (ch == '\n') + line ++; + + // Return the character... + return (ch); +} + + +// +// 'ppdcFile::peek()' - Look at the next character from a file. +// + +int // O - Next character in file +ppdcFile::peek() +{ + // Return immediaely if there is no open file... + if (!fp) + return (EOF); + + // Otherwise return the next character without advancing... + return (cupsFilePeekChar(fp)); +} + + +// +// End of "$Id: ppdc-file.cxx 10338 2012-03-07 06:05:39Z mike $". +// diff --git a/ppdc/ppdc-filter.cxx b/ppdc/ppdc-filter.cxx new file mode 100644 index 0000000..06a164c --- /dev/null +++ b/ppdc/ppdc-filter.cxx @@ -0,0 +1,60 @@ +// +// "$Id: ppdc-filter.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Filter class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcFilter::ppdcFilter() - Create a filter. +// ppdcFilter::~ppdcFilter() - Destroy a filter. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcFilter::ppdcFilter()' - Create a filter. +// + +ppdcFilter::ppdcFilter(const char *t, // I - MIME type + const char *p, // I - Filter program + int c) // I - Relative cost + : ppdcShared() +{ + PPDC_NEW; + + mime_type = new ppdcString(t); + program = new ppdcString(p); + cost = c; +} + + +// +// 'ppdcFilter::~ppdcFilter()' - Destroy a filter. +// + +ppdcFilter::~ppdcFilter() +{ + PPDC_DELETE; + + mime_type->release(); + program->release(); +} + + +// +// End of "$Id: ppdc-filter.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-font.cxx b/ppdc/ppdc-font.cxx new file mode 100644 index 0000000..909b83c --- /dev/null +++ b/ppdc/ppdc-font.cxx @@ -0,0 +1,66 @@ +// +// "$Id: ppdc-font.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Shared font class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcFont::ppdcFont() - Create a shared font. +// ppdcFont::~ppdcFont() - Destroy a shared font. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcFont::ppdcFont()' - Create a shared font. +// + +ppdcFont::ppdcFont(const char *n, // I - Name of font + const char *e, // I - Font encoding + const char *v, // I - Font version + const char *c, // I - Font charset + ppdcFontStatus s) // I - Font status + : ppdcShared() +{ + PPDC_NEW; + + name = new ppdcString(n); + encoding = new ppdcString(e); + version = new ppdcString(v); + charset = new ppdcString(c); + status = s; +} + + +// +// 'ppdcFont::~ppdcFont()' - Destroy a shared font. +// + +ppdcFont::~ppdcFont() +{ + PPDC_DELETE; + + name->release(); + encoding->release(); + version->release(); + charset->release(); +} + + +// +// End of "$Id: ppdc-font.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-group.cxx b/ppdc/ppdc-group.cxx new file mode 100644 index 0000000..5db59c8 --- /dev/null +++ b/ppdc/ppdc-group.cxx @@ -0,0 +1,103 @@ +// +// "$Id: ppdc-group.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// Group class for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcGroup::ppdcGroup() - Copy a new group. +// ppdcGroup::~ppdcGroup() - Destroy a group. +// ppdcGroup::find_option() - Find an option in a group. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcGroup::ppdcGroup()' - Create a new group. +// + +ppdcGroup::ppdcGroup(const char *n, // I - Name of group + const char *t) // I - Text of group +{ + PPDC_NEWVAL(n); + + name = new ppdcString(n); + text = new ppdcString(t); + options = new ppdcArray(); +} + + +// +// 'ppdcGroup::ppdcGroup()' - Copy a new group. +// + +ppdcGroup::ppdcGroup(ppdcGroup *g) // I - Group template +{ + PPDC_NEWVAL(g->name->value); + + g->name->retain(); + g->text->retain(); + + name = g->name; + text = g->text; + + options = new ppdcArray(); + for (ppdcOption *o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + options->add(new ppdcOption(o)); +} + + +// +// 'ppdcGroup::~ppdcGroup()' - Destroy a group. +// + +ppdcGroup::~ppdcGroup() +{ + PPDC_DELETEVAL(name ? name->value : NULL); + + name->release(); + text->release(); + options->release(); + + name = text = 0; + options = 0; +} + + +// +// 'ppdcGroup::find_option()' - Find an option in a group. +// + +ppdcOption * +ppdcGroup::find_option(const char *n) // I - Name of option +{ + ppdcOption *o; // Current option + + + for (o = (ppdcOption *)options->first(); o; o = (ppdcOption *)options->next()) + if (!_cups_strcasecmp(n, o->name->value)) + return (o); + + return (0); +} + + +// +// End of "$Id: ppdc-group.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc-import.cxx b/ppdc/ppdc-import.cxx new file mode 100644 index 0000000..1bf9b03 --- /dev/null +++ b/ppdc/ppdc-import.cxx @@ -0,0 +1,343 @@ +// +// "$Id: ppdc-import.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// PPD file import methods for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2006 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcSource::import_ppd() - Import a PPD file. +// ppd_gets() - Get a line from a PPD file. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include + + +// +// 'ppdcSource::import_ppd()' - Import a PPD file. +// + +int // O - 1 on success, 0 on failure +ppdcSource::import_ppd(const char *f) // I - Filename +{ + int i, j, k; // Looping vars + cups_file_t *fp; // File + char line[256], // Comment line + *ptr; // Pointer into line + int cost; // Cost for filter + ppd_file_t *ppd; // PPD file data + ppd_group_t *group; // PPD group + ppd_option_t *option; // PPD option + ppd_choice_t *choice; // PPD choice + ppd_attr_t *attr; // PPD attribute + ppd_const_t *constraint; // PPD UI constraint + ppd_const_t *constraint2; // Temp PPD UI constraint + ppd_size_t *size; // PPD page size + ppdcDriver *driver; // Driver + ppdcFilter *filter; // Current filter + ppdcFont *font; // Font + ppdcGroup *cgroup; // UI group + ppdcOption *coption; // UI option + ppdcChoice *cchoice; // UI choice + ppdcConstraint *cconstraint; // UI constraint + ppdcMediaSize *csize; // Media size + + + // Try opening the PPD file... + if ((ppd = ppdOpenFile(f)) == NULL) + return (0); + + // All PPD files need a PCFileName attribute... + if (!ppd->pcfilename) + { + ppdClose(ppd); + return (0); + } + + // See if the driver has already been imported... + if ((driver = find_driver(ppd->pcfilename)) == NULL) + { + // Create a new PPD file... + if ((fp = cupsFileOpen(f, "r")) == NULL) + { + ppdClose(ppd); + return (0); + } + + driver = new ppdcDriver(); + driver->type = PPDC_DRIVER_PS; + + drivers->add(driver); + + // Read the initial comments from the PPD file and use them as the + // copyright/license text... + cupsFileGets(fp, line, sizeof(line)); + // Skip *PPD-Adobe-M.m + + while (cupsFileGets(fp, line, sizeof(line))) + if (strncmp(line, "*%", 2)) + break; + else if (strncmp(line, "*%%%% ", 6)) + { + for (ptr = line + 2; isspace(*ptr); ptr ++); + + driver->add_copyright(ptr); + } + + cupsFileClose(fp); + + // Then add the stuff from the PPD file... + if (ppd->modelname && ppd->manufacturer && + !_cups_strncasecmp(ppd->modelname, ppd->manufacturer, + strlen(ppd->manufacturer))) + { + ptr = ppd->modelname + strlen(ppd->manufacturer); + + while (isspace(*ptr)) + ptr ++; + } + else + ptr = ppd->modelname; + + if (ppd->nickname) + driver->add_attr(new ppdcAttr("NickName", NULL, NULL, ppd->nickname)); + + if (ppd->shortnickname) + driver->add_attr(new ppdcAttr("ShortNickName", NULL, NULL, + ppd->shortnickname)); + + driver->manufacturer = new ppdcString(ppd->manufacturer); + driver->model_name = new ppdcString(ptr); + driver->pc_file_name = new ppdcString(ppd->pcfilename); + attr = ppdFindAttr(ppd, "FileVersion", NULL); + driver->version = new ppdcString(attr ? attr->value : NULL); + driver->model_number = ppd->model_number; + driver->manual_copies = ppd->manual_copies; + driver->color_device = ppd->color_device; + driver->throughput = ppd->throughput; + driver->variable_paper_size = ppd->variable_sizes; + driver->max_width = ppd->custom_max[0]; + driver->max_length = ppd->custom_max[1]; + driver->min_width = ppd->custom_min[0]; + driver->min_length = ppd->custom_min[1]; + driver->left_margin = ppd->custom_margins[0]; + driver->bottom_margin = ppd->custom_margins[1]; + driver->right_margin = ppd->custom_margins[2]; + driver->top_margin = ppd->custom_margins[3]; + + for (i = 0; i < ppd->num_filters; i ++) + { + strlcpy(line, ppd->filters[i], sizeof(line)); + + for (ptr = line; *ptr; ptr ++) + if (isspace(*ptr & 255)) + break; + *ptr++ = '\0'; + + cost = strtol(ptr, &ptr, 10); + + while (isspace(*ptr & 255)) + ptr ++; + + filter = new ppdcFilter(line, ptr, cost); + driver->add_filter(filter); + } + + attr = ppdFindAttr(ppd, "DefaultFont", NULL); + driver->default_font = new ppdcString(attr ? attr->value : NULL); + + // Collect media sizes... + ppd_option_t *region_option, // PageRegion option + *size_option; // PageSize option + ppd_choice_t *region_choice, // PageRegion choice + *size_choice; // PageSize choice + + region_option = ppdFindOption(ppd, "PageRegion"); + size_option = ppdFindOption(ppd, "PageSize"); + + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + { + // Don't do custom size here... + if (!_cups_strcasecmp(size->name, "Custom")) + continue; + + // Get the code for the PageSize and PageRegion options... + region_choice = ppdFindChoice(region_option, size->name); + size_choice = ppdFindChoice(size_option, size->name); + + // Create a new media size record and add it to the driver... + csize = new ppdcMediaSize(size->name, size_choice->text, size->width, + size->length, size->left, size->bottom, + size->width - size->right, + size->length - size->top, + size_choice->code, region_choice->code); + + driver->add_size(csize); + + if (!_cups_strcasecmp(size_option->defchoice, size->name)) + driver->set_default_size(csize); + } + + // Now all of the options... + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + { + cgroup = new ppdcGroup(group->name, group->text); + driver->add_group(cgroup); + + for (j = group->num_options, option = group->options; j > 0; j --, option ++) + { + if (!strcmp(option->keyword, "PageSize") || !strcmp(option->keyword, "PageRegion")) + continue; + + coption = new ppdcOption((ppdcOptType)option->ui, option->keyword, + option->text, (ppdcOptSection)option->section, + option->order); + cgroup->add_option(coption); + + for (k = option->num_choices, choice = option->choices; k > 0; k --, choice ++) + { + if (!strcmp(choice->choice, "Custom")) + continue; + + cchoice = new ppdcChoice(choice->choice, choice->text, choice->code); + coption->add_choice(cchoice); + + if (!_cups_strcasecmp(option->defchoice, choice->choice)) + coption->set_defchoice(cchoice); + } + } + } + + // Now the constraints... + for (i = ppd->num_consts, constraint = ppd->consts; + i > 0; + i --, constraint ++) + { + // Look for mirrored constraints... + for (j = i - 1, constraint2 = constraint + 1; + j > 0; + j --, constraint2 ++) + if (!strcmp(constraint->option1, constraint2->option2) && + !strcmp(constraint->choice1, constraint2->choice2) && + !strcmp(constraint->option2, constraint2->option1) && + !strcmp(constraint->choice2, constraint2->choice1)) + break; + + if (j) + continue; + + cconstraint = new ppdcConstraint(constraint->option2, constraint->choice2, + constraint->option1, constraint->choice1); + driver->add_constraint(cconstraint); + } + + for (i = 0; i < ppd->num_attrs; i ++) + { + attr = ppd->attrs[i]; + + if (!strcmp(attr->name, "Font")) + { + // Font... + char encoding[256], // Encoding string + version[256], // Version string + charset[256], // Charset string + status[256]; // Status string + ppdcFontStatus fstatus; // Status enumeration + + + if (sscanf(attr->value, "%s%*[^\"]\"%[^\"]\"%s%s", encoding, version, + charset, status) != 4) + { + _cupsLangPrintf(stderr, _("ppdc: Bad font attribute: %s"), + attr->value); + continue; + } + + if (!strcmp(status, "ROM")) + fstatus = PPDC_FONT_ROM; + else + fstatus = PPDC_FONT_DISK; + + font = new ppdcFont(attr->spec, encoding, version, charset, fstatus); + + driver->add_font(font); + } + else if (!strcmp(attr->name, "CustomPageSize")) + { + driver->set_custom_size_code(attr->value); + } + else if ((strncmp(attr->name, "Default", 7) || + !strcmp(attr->name, "DefaultColorSpace")) && + strcmp(attr->name, "ColorDevice") && + strcmp(attr->name, "Manufacturer") && + strcmp(attr->name, "ModelName") && + strcmp(attr->name, "MaxMediaHeight") && + strcmp(attr->name, "MaxMediaWidth") && + strcmp(attr->name, "NickName") && + strcmp(attr->name, "ParamCustomPageSize") && + strcmp(attr->name, "ShortNickName") && + strcmp(attr->name, "Throughput") && + strcmp(attr->name, "PCFileName") && + strcmp(attr->name, "FileVersion") && + strcmp(attr->name, "FormatVersion") && + strcmp(attr->name, "HWMargins") && + strcmp(attr->name, "VariablePaperSize") && + strcmp(attr->name, "LanguageEncoding") && + strcmp(attr->name, "LanguageVersion") && + strcmp(attr->name, "cupsFilter") && + strcmp(attr->name, "cupsFlipDuplex") && + strcmp(attr->name, "cupsLanguages") && + strcmp(attr->name, "cupsManualCopies") && + strcmp(attr->name, "cupsModelNumber") && + strcmp(attr->name, "cupsVersion")) + { + if ((ptr = strchr(attr->name, '.')) != NULL && + ((ptr - attr->name) == 2 || (ptr - attr->name) == 5)) + { + // Might be a localization attribute; test further... + if (isalpha(attr->name[0] & 255) && + isalpha(attr->name[1] & 255) && + (attr->name[2] == '.' || + (attr->name[2] == '_' && isalpha(attr->name[3] & 255) && + isalpha(attr->name[4] & 255)))) + continue; + } + + // Attribute... + driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, + attr->value)); + } + else if (!strncmp(attr->name, "Default", 7) && + !ppdFindOption(ppd, attr->name + 7) && + strcmp(attr->name, "DefaultFont") && + strcmp(attr->name, "DefaultImageableArea") && + strcmp(attr->name, "DefaultPaperDimension") && + strcmp(attr->name, "DefaultFont")) + { + // Default attribute... + driver->add_attr(new ppdcAttr(attr->name, attr->spec, attr->text, + attr->value)); + } + } + } + + return (1); +} + + +// +// End of "$Id: ppdc-import.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc-mediasize.cxx b/ppdc/ppdc-mediasize.cxx new file mode 100644 index 0000000..90831da --- /dev/null +++ b/ppdc/ppdc-mediasize.cxx @@ -0,0 +1,85 @@ +// +// "$Id: ppdc-mediasize.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Shared media size class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcMediaSize::ppdcMediaSize() - Create a new media size. +// ppdcMediaSize::~ppdcMediaSize() - Destroy a media size. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcMediaSize::ppdcMediaSize()' - Create a new media size. +// + +ppdcMediaSize::ppdcMediaSize(const char *n, // I - Name of media size + const char *t, // I - Text of media size + float w, // I - Width in points + float l, // I - Length in points + float lm, // I - Left margin in points + float bm, // I - Bottom margin in points + float rm, // I - Right margin in points + float tm, // I - Top margin in points + const char *sc, // I - PageSize code, if any + const char *rc) // I - PageRegion code, if any + : ppdcShared() +{ + PPDC_NEW; + + name = new ppdcString(n); + text = new ppdcString(t); + width = w; + length = l; + left = lm; + bottom = bm; + right = rm; + top = tm; + size_code = new ppdcString(sc); + region_code = new ppdcString(rc); + + if (left < 0.0f) + left = 0.0f; + if (bottom < 0.0f) + bottom = 0.0f; + if (right < 0.0f) + right = 0.0f; + if (top < 0.0f) + top = 0.0f; +} + + +// +// 'ppdcMediaSize::~ppdcMediaSize()' - Destroy a media size. +// + +ppdcMediaSize::~ppdcMediaSize() +{ + PPDC_DELETE; + + name->release(); + text->release(); + size_code->release(); + region_code->release(); +} + + +// +// End of "$Id: ppdc-mediasize.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-message.cxx b/ppdc/ppdc-message.cxx new file mode 100644 index 0000000..a0c9ad6 --- /dev/null +++ b/ppdc/ppdc-message.cxx @@ -0,0 +1,58 @@ +// +// "$Id: ppdc-message.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Shared message class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcMessage::ppdcMessage() - Create a shared message. +// ppdcMessage::~ppdcMessage() - Destroy a shared message. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcMessage::ppdcMessage()' - Create a shared message. +// + +ppdcMessage::ppdcMessage(const char *i, // I - ID + const char *s) // I - Text + : ppdcShared() +{ + PPDC_NEW; + + id = new ppdcString(i); + string = new ppdcString(s); +} + + +// +// 'ppdcMessage::~ppdcMessage()' - Destroy a shared message. +// + +ppdcMessage::~ppdcMessage() +{ + PPDC_DELETE; + + id->release(); + string->release(); +} + + +// +// End of "$Id: ppdc-message.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-option.cxx b/ppdc/ppdc-option.cxx new file mode 100644 index 0000000..12897fe --- /dev/null +++ b/ppdc/ppdc-option.cxx @@ -0,0 +1,129 @@ +// +// "$Id: ppdc-option.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// Option class for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcOption::ppdcOption() - Copy a new option. +// ppdcOption::~ppdcOption() - Destroy an option. +// ppdcOption::find_choice() - Find an option choice. +// ppdcOption::set_defchoice() - Set the default choice. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcOption::ppdcOption()' - Create a new option. +// + +ppdcOption::ppdcOption(ppdcOptType ot, // I - Option type + const char *n, // I - Option name + const char *t, // I - Option text + ppdcOptSection s, // I - Section + float o) // I - Ordering number + : ppdcShared() +{ + PPDC_NEW; + + type = ot; + name = new ppdcString(n); + text = new ppdcString(t); + section = s; + order = o; + choices = new ppdcArray(); + defchoice = 0; +} + + +// +// 'ppdcOption::ppdcOption()' - Copy a new option. +// + +ppdcOption::ppdcOption(ppdcOption *o) // I - Template option +{ + PPDC_NEW; + + o->name->retain(); + o->text->retain(); + if (o->defchoice) + o->defchoice->retain(); + + type = o->type; + name = o->name; + text = o->text; + section = o->section; + order = o->order; + choices = new ppdcArray(o->choices); + defchoice = o->defchoice; +} + + +// +// 'ppdcOption::~ppdcOption()' - Destroy an option. +// + +ppdcOption::~ppdcOption() +{ + PPDC_DELETE; + + name->release(); + text->release(); + if (defchoice) + defchoice->release(); + choices->release(); +} + + +// +// 'ppdcOption::find_choice()' - Find an option choice. +// + +ppdcChoice * // O - Choice or NULL +ppdcOption::find_choice(const char *n) // I - Name of choice +{ + ppdcChoice *c; // Current choice + + + for (c = (ppdcChoice *)choices->first(); c; c = (ppdcChoice *)choices->next()) + if (!_cups_strcasecmp(n, c->name->value)) + return (c); + + return (0); +} + + +// +// 'ppdcOption::set_defchoice()' - Set the default choice. +// + +void +ppdcOption::set_defchoice(ppdcChoice *c) // I - Choice +{ + if (defchoice) + defchoice->release(); + + if (c->name) + c->name->retain(); + + defchoice = c->name; +} + + +// +// End of "$Id: ppdc-option.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc-private.h b/ppdc/ppdc-private.h new file mode 100644 index 0000000..b862c58 --- /dev/null +++ b/ppdc/ppdc-private.h @@ -0,0 +1,40 @@ +// +// "$Id: ppdc-private.h 9042 2010-03-24 00:45:34Z mike $" +// +// Private definitions for the CUPS PPD Compiler. +// +// Copyright 2009-2010 by Apple Inc. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// + +#ifndef _PPDC_PRIVATE_H_ +# define _PPDC_PRIVATE_H_ + +// +// Include necessary headers... +// + +# include "ppdc.h" +# include + + +// +// Macros... +// + +# define PPDC_NEW DEBUG_printf(("%s: %p new", class_name(), this)) +# define PPDC_NEWVAL(s) DEBUG_printf(("%s(\"%s\"): %p new", class_name(), s, this)) +# define PPDC_DELETE DEBUG_printf(("%s: %p delete", class_name(), this)) +# define PPDC_DELETEVAL(s) DEBUG_printf(("%s(\"%s\"): %p delete", class_name(), s, this)) + + +#endif // !_PPDC_PRIVATE_H_ + +// +// End of "$Id: ppdc-private.h 9042 2010-03-24 00:45:34Z mike $". +// diff --git a/ppdc/ppdc-profile.cxx b/ppdc/ppdc-profile.cxx new file mode 100644 index 0000000..2cbe7eb --- /dev/null +++ b/ppdc/ppdc-profile.cxx @@ -0,0 +1,65 @@ +// +// "$Id: ppdc-profile.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Color profile class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcProfile::ppdcProfile() - Create a color profile. +// ppdcProfile::~ppdcProfile() - Destroy a color profile. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcProfile::ppdcProfile()' - Create a color profile. +// + +ppdcProfile::ppdcProfile(const char *r, // I - Resolution name + const char *m, // I - Media type name + float d, // I - Density + float g, // I - Gamma + const float *p) // I - 3x3 transform matrix + : ppdcShared() +{ + PPDC_NEW; + + resolution = new ppdcString(r); + media_type = new ppdcString(m); + density = d; + gamma = g; + + memcpy(profile, p, sizeof(profile)); +} + + +// +// 'ppdcProfile::~ppdcProfile()' - Destroy a color profile. +// + +ppdcProfile::~ppdcProfile() +{ + PPDC_DELETE; + + resolution->release(); + media_type->release(); +} + + +// +// End of "$Id: ppdc-profile.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc-shared.cxx b/ppdc/ppdc-shared.cxx new file mode 100644 index 0000000..64a4cc7 --- /dev/null +++ b/ppdc/ppdc-shared.cxx @@ -0,0 +1,88 @@ +// +// "$Id: ppdc-shared.cxx 8694 2009-06-05 16:47:19Z mike $" +// +// Shared data class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcShared::ppdcShared() - Create shared data. +// ppdcShared::~ppdcShared() - Destroy shared data. +// ppdcShared::release() - Decrement the use count and delete as needed. +// ppdcShared::retain() - Increment the use count for this data. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcShared::ppdcShared()' - Create shared data. +// + +ppdcShared::ppdcShared() +{ + use = 1; +} + + +// +// 'ppdcShared::~ppdcShared()' - Destroy shared data. +// + +ppdcShared::~ppdcShared() +{ +} + + +// +// 'ppdcShared::release()' - Decrement the use count and delete as needed. +// + +void +ppdcShared::release(void) +{ + DEBUG_printf(("%s: %p release use=%d", class_name(), this, use)); + + use --; + +#ifdef DEBUG + if (use < 0) + { + fprintf(stderr, "ERROR: Over-release of %s: %p\n", class_name(), this); + abort(); + } +#endif /* DEBUG */ + + if (use == 0) + delete this; +} + + +// +// 'ppdcShared::retain()' - Increment the use count for this data. +// + +void +ppdcShared::retain() +{ + use ++; + + DEBUG_printf(("%s: %p retain use=%d", class_name(), this, use)); +} + + +// +// End of "$Id: ppdc-shared.cxx 8694 2009-06-05 16:47:19Z mike $". +// diff --git a/ppdc/ppdc-source.cxx b/ppdc/ppdc-source.cxx new file mode 100644 index 0000000..17aadab --- /dev/null +++ b/ppdc/ppdc-source.cxx @@ -0,0 +1,3911 @@ +// +// "$Id: ppdc-source.cxx 10379 2012-03-23 22:16:22Z mike $" +// +// Source class for the CUPS PPD Compiler. +// +// Copyright 2007-2012 by Apple Inc. +// Copyright 2002-2007 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcSource::ppdcSource() - Load a driver source file. +// ppdcSource::~ppdcSource() - Free a driver source file. +// ppdcSource::add_include() - Add an include directory. +// ppdcSource::find_driver() - Find a driver. +// ppdcSource::find_include() - Find an include file. +// ppdcSource::find_po() - Find a message catalog for the given +// locale. +// ppdcSource::find_size() - Find a media size. +// ppdcSource::find_variable() - Find a variable. +// ppdcSource::get_attr() - Get an attribute. +// ppdcSource::get_boolean() - Get a boolean value. +// ppdcSource::get_choice() - Get a choice. +// ppdcSource::get_color_model() - Get an old-style color model option. +// ppdcSource::get_color_order() - Get an old-style color order value. +// ppdcSource::get_color_profile() - Get a color profile definition. +// ppdcSource::get_color_space() - Get an old-style colorspace value. +// ppdcSource::get_constraint() - Get a constraint. +// ppdcSource::get_custom_size() - Get a custom media size definition from +// a file. +// ppdcSource::get_duplex() - Get a duplex option. +// ppdcSource::get_filter() - Get a filter. +// ppdcSource::get_float() - Get a single floating-point number. +// ppdcSource::get_font() - Get a font definition. +// ppdcSource::get_generic() - Get a generic old-style option. +// ppdcSource::get_group() - Get an option group. +// ppdcSource::get_installable() - Get an installable option. +// ppdcSource::get_integer() - Get an integer value from a file. +// ppdcSource::get_measurement() - Get a measurement value. +// ppdcSource::get_option() - Get an option definition. +// ppdcSource::get_po() - Get a message catalog. +// ppdcSource::get_resolution() - Get an old-style resolution option. +// ppdcSource::get_simple_profile() - Get a simple color profile definition. +// ppdcSource::get_size() - Get a media size definition from a file. +// ppdcSource::get_token() - Get a token from a file. +// ppdcSource::get_variable() - Get a variable definition. +// ppdcSource::quotef() - Write a formatted, quoted string... +// ppdcSource::read_file() - Read a driver source file. +// ppdcSource::scan_file() - Scan a driver source file. +// ppdcSource::set_variable() - Set a variable. +// ppdcSource::write_file() - Write the current source data to a file. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include +#include +#include +#include +#include "data/epson.h" +#include "data/escp.h" +#include "data/hp.h" +#include "data/label.h" +#include "data/pcl.h" +#ifndef WIN32 +# include +#endif // !WIN32 + + +// +// Class globals... +// + +ppdcArray *ppdcSource::includes = 0; +const char *ppdcSource::driver_types[] = + { + "custom", + "ps", + "escp", + "pcl", + "label", + "epson", + "hp" + }; + + +// +// 'ppdcSource::ppdcSource()' - Load a driver source file. +// + +ppdcSource::ppdcSource(const char *f, // I - File to read + cups_file_t *ffp)// I - File pointer to use + : ppdcShared() +{ + PPDC_NEW; + + filename = new ppdcString(f); + base_fonts = new ppdcArray(); + drivers = new ppdcArray(); + po_files = new ppdcArray(); + sizes = new ppdcArray(); + vars = new ppdcArray(); + cond_state = PPDC_COND_NORMAL; + cond_current = cond_stack; + cond_stack[0] = PPDC_COND_NORMAL; + + // Add standard #define variables... +#define MAKE_STRING(x) #x + + vars->add(new ppdcVariable("CUPS_VERSION", MAKE_STRING(CUPS_VERSION))); + vars->add(new ppdcVariable("CUPS_VERSION_MAJOR", MAKE_STRING(CUPS_VERSION_MAJOR))); + vars->add(new ppdcVariable("CUPS_VERSION_MINOR", MAKE_STRING(CUPS_VERSION_MINOR))); + vars->add(new ppdcVariable("CUPS_VERSION_PATCH", MAKE_STRING(CUPS_VERSION_PATCH))); + +#ifdef WIN32 + vars->add(new ppdcVariable("PLATFORM_NAME", "Windows")); + vars->add(new ppdcVariable("PLATFORM_ARCH", "X86")); + +#else + struct utsname name; // uname information + + if (!uname(&name)) + { + vars->add(new ppdcVariable("PLATFORM_NAME", name.sysname)); + vars->add(new ppdcVariable("PLATFORM_ARCH", name.machine)); + } + else + { + vars->add(new ppdcVariable("PLATFORM_NAME", "unknown")); + vars->add(new ppdcVariable("PLATFORM_ARCH", "unknown")); + } +#endif // WIN32 + + if (f) + read_file(f, ffp); +} + + +// +// 'ppdcSource::~ppdcSource()' - Free a driver source file. +// + +ppdcSource::~ppdcSource() +{ + PPDC_DELETE; + + filename->release(); + base_fonts->release(); + drivers->release(); + po_files->release(); + sizes->release(); + vars->release(); +} + + +// +// 'ppdcSource::add_include()' - Add an include directory. +// + +void +ppdcSource::add_include(const char *d) // I - Include directory +{ + if (!d) + return; + + if (!includes) + includes = new ppdcArray(); + + includes->add(new ppdcString(d)); +} + + +// +// 'ppdcSource::find_driver()' - Find a driver. +// + +ppdcDriver * // O - Driver +ppdcSource::find_driver(const char *f) // I - Driver file name +{ + ppdcDriver *d; // Current driver + + + for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next()) + if (!_cups_strcasecmp(f, d->pc_file_name->value)) + return (d); + + return (NULL); +} + + +// +// 'ppdcSource::find_include()' - Find an include file. +// + +char * // O - Found path or NULL +ppdcSource::find_include( + const char *f, // I - Include filename + const char *base, // I - Current directory + char *n, // I - Path buffer + int nlen) // I - Path buffer length +{ + ppdcString *dir; // Include directory + char temp[1024], // Temporary path + *ptr; // Pointer to end of path + + + // Range check input... + if (!f || !*f || !n || nlen < 2) + return (0); + + // Check the first character to see if we have or "name"... + if (*f == '<') + { + // Remove the surrounding <> from the name... + strlcpy(temp, f + 1, sizeof(temp)); + ptr = temp + strlen(temp) - 1; + + if (*ptr != '>') + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid #include/#po filename \"%s\"."), n); + return (0); + } + + *ptr = '\0'; + f = temp; + } + else + { + // Check for the local file relative to the current directory... + if (base && *base && f[0] != '/') + snprintf(n, nlen, "%s/%s", base, f); + else + strlcpy(n, f, nlen); + + if (!access(n, 0)) + return (n); + else if (*f == '/') + { + // Absolute path that doesn't exist... + return (0); + } + } + + // Search the include directories, if any... + if (includes) + { + for (dir = (ppdcString *)includes->first(); dir; dir = (ppdcString *)includes->next()) + { + snprintf(n, nlen, "%s/%s", dir->value, f); + if (!access(n, 0)) + return (n); + } + } + + // Search the standard include directories... + _cups_globals_t *cg = _cupsGlobals(); // Global data + + snprintf(n, nlen, "%s/ppdc/%s", cg->cups_datadir, f); + if (!access(n, 0)) + return (n); + + snprintf(n, nlen, "%s/po/%s", cg->cups_datadir, f); + if (!access(n, 0)) + return (n); + else + return (0); +} + + +// +// 'ppdcSource::find_po()' - Find a message catalog for the given locale. +// + +ppdcCatalog * // O - Message catalog or NULL +ppdcSource::find_po(const char *l) // I - Locale name +{ + ppdcCatalog *cat; // Current message catalog + + + for (cat = (ppdcCatalog *)po_files->first(); + cat; + cat = (ppdcCatalog *)po_files->next()) + if (!_cups_strcasecmp(l, cat->locale->value)) + return (cat); + + return (NULL); +} + + +// +// 'ppdcSource::find_size()' - Find a media size. +// + +ppdcMediaSize * // O - Size +ppdcSource::find_size(const char *s) // I - Size name +{ + ppdcMediaSize *m; // Current media size + + + for (m = (ppdcMediaSize *)sizes->first(); m; m = (ppdcMediaSize *)sizes->next()) + if (!_cups_strcasecmp(s, m->name->value)) + return (m); + + return (NULL); +} + + +// +// 'ppdcSource::find_variable()' - Find a variable. +// + +ppdcVariable * // O - Variable +ppdcSource::find_variable(const char *n)// I - Variable name +{ + ppdcVariable *v; // Current variable + + + for (v = (ppdcVariable *)vars->first(); v; v = (ppdcVariable *)vars->next()) + if (!_cups_strcasecmp(n, v->name->value)) + return (v); + + return (NULL); +} + + +// +// 'ppdcSource::get_attr()' - Get an attribute. +// + +ppdcAttr * // O - Attribute +ppdcSource::get_attr(ppdcFile *fp, // I - File to read + bool loc) // I - Localize this attribute? +{ + char name[1024], // Name string + selector[1024], // Selector string + *text, // Text string + value[1024]; // Value string + + + // Get the attribute parameters: + // + // Attribute name selector value + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after %s on line %d of %s."), + loc ? "LocAttribute" : "Attribute", fp->line, fp->filename); + return (0); + } + + if (!get_token(fp, selector, sizeof(selector))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected selector after %s on line %d of %s."), + loc ? "LocAttribute" : "Attribute", fp->line, fp->filename); + return (0); + } + + if ((text = strchr(selector, '/')) != NULL) + *text++ = '\0'; + + if (!get_token(fp, value, sizeof(value))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected value after %s on line %d of %s."), + loc ? "LocAttribute" : "Attribute", fp->line, fp->filename); + return (0); + } + + return (new ppdcAttr(name, selector, text, value, loc)); +} + + +// +// 'ppdcSource::get_boolean()' - Get a boolean value. +// + +int // O - Boolean value +ppdcSource::get_boolean(ppdcFile *fp) // I - File to read +{ + char buffer[256]; // String buffer + + + if (!get_token(fp, buffer, sizeof(buffer))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected boolean value on line %d of %s."), + fp->line, fp->filename); + return (-1); + } + + if (!_cups_strcasecmp(buffer, "on") || + !_cups_strcasecmp(buffer, "yes") || + !_cups_strcasecmp(buffer, "true")) + return (1); + else if (!_cups_strcasecmp(buffer, "off") || + !_cups_strcasecmp(buffer, "no") || + !_cups_strcasecmp(buffer, "false")) + return (0); + else + { + _cupsLangPrintf(stderr, + _("ppdc: Bad boolean value (%s) on line %d of %s."), + buffer, fp->line, fp->filename); + return (-1); + } +} + + +// +// 'ppdcSource::get_choice()' - Get a choice. +// + +ppdcChoice * // O - Choice data +ppdcSource::get_choice(ppdcFile *fp) // I - File to read +{ + char name[1024], // Name + *text, // Text + code[10240]; // Code + + + // Read a choice from the file: + // + // Choice name/text code + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected choice name/text on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if (!get_token(fp, code, sizeof(code))) + { + _cupsLangPrintf(stderr, _("ppdc: Expected choice code on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + // Return the new choice + return (new ppdcChoice(name, text, code)); +} + + +// +// 'ppdcSource::get_color_model()' - Get an old-style color model option. +// + +ppdcChoice * // O - Choice data +ppdcSource::get_color_model(ppdcFile *fp) + // I - File to read +{ + char name[1024], // Option name + *text, // Text option + temp[256]; // Temporary string + int color_space, // Colorspace + color_order, // Color order + compression; // Compression mode + + + // Get the ColorModel parameters: + // + // ColorModel name/text colorspace colororder compression + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name/text combination for ColorModel on " + "line %d of %s."), fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected colorspace for ColorModel on line %d of " + "%s."), fp->line, fp->filename); + return (NULL); + } + + if ((color_space = get_color_space(temp)) < 0) + color_space = get_integer(temp); + + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected color order for ColorModel on line %d of " + "%s."), fp->line, fp->filename); + return (NULL); + } + + if ((color_order = get_color_order(temp)) < 0) + color_order = get_integer(temp); + + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected compression for ColorModel on line %d of " + "%s."), fp->line, fp->filename); + return (NULL); + } + + compression = get_integer(temp); + + snprintf(temp, sizeof(temp), + "<>" + "setpagedevice", + color_space, color_order, compression); + + return (new ppdcChoice(name, text, temp)); +} + + +// +// 'ppdcSource::get_color_order()' - Get an old-style color order value. +// + +int // O - Color order value +ppdcSource::get_color_order( + const char *co) // I - Color order string +{ + if (!_cups_strcasecmp(co, "chunked") || + !_cups_strcasecmp(co, "chunky")) + return (CUPS_ORDER_CHUNKED); + else if (!_cups_strcasecmp(co, "banded")) + return (CUPS_ORDER_BANDED); + else if (!_cups_strcasecmp(co, "planar")) + return (CUPS_ORDER_PLANAR); + else + return (-1); +} + + +// +// 'ppdcSource::get_color_profile()' - Get a color profile definition. +// + +ppdcProfile * // O - Color profile +ppdcSource::get_color_profile( + ppdcFile *fp) // I - File to read +{ + char resolution[1024], // Resolution/media type + *media_type; // Media type + int i; // Looping var + float g, // Gamma value + d, // Density value + m[9]; // Transform matrix + + + // Get the ColorProfile parameters: + // + // ColorProfile resolution/mediatype gamma density m00 m01 m02 ... m22 + if (!get_token(fp, resolution, sizeof(resolution))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected resolution/mediatype following " + "ColorProfile on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((media_type = strchr(resolution, '/')) != NULL) + *media_type++ = '\0'; + else + media_type = resolution; + + g = get_float(fp); + d = get_float(fp); + for (i = 0; i < 9; i ++) + m[i] = get_float(fp); + + return (new ppdcProfile(resolution, media_type, g, d, m)); +} + + +// +// 'ppdcSource::get_color_space()' - Get an old-style colorspace value. +// + +int // O - Colorspace value +ppdcSource::get_color_space( + const char *cs) // I - Colorspace string +{ + if (!_cups_strcasecmp(cs, "w")) + return (CUPS_CSPACE_W); + else if (!_cups_strcasecmp(cs, "rgb")) + return (CUPS_CSPACE_RGB); + else if (!_cups_strcasecmp(cs, "rgba")) + return (CUPS_CSPACE_RGBA); + else if (!_cups_strcasecmp(cs, "k")) + return (CUPS_CSPACE_K); + else if (!_cups_strcasecmp(cs, "cmy")) + return (CUPS_CSPACE_CMY); + else if (!_cups_strcasecmp(cs, "ymc")) + return (CUPS_CSPACE_YMC); + else if (!_cups_strcasecmp(cs, "cmyk")) + return (CUPS_CSPACE_CMYK); + else if (!_cups_strcasecmp(cs, "ymck")) + return (CUPS_CSPACE_YMCK); + else if (!_cups_strcasecmp(cs, "kcmy")) + return (CUPS_CSPACE_KCMY); + else if (!_cups_strcasecmp(cs, "kcmycm")) + return (CUPS_CSPACE_KCMYcm); + else if (!_cups_strcasecmp(cs, "gmck")) + return (CUPS_CSPACE_GMCK); + else if (!_cups_strcasecmp(cs, "gmcs")) + return (CUPS_CSPACE_GMCS); + else if (!_cups_strcasecmp(cs, "white")) + return (CUPS_CSPACE_WHITE); + else if (!_cups_strcasecmp(cs, "gold")) + return (CUPS_CSPACE_GOLD); + else if (!_cups_strcasecmp(cs, "silver")) + return (CUPS_CSPACE_SILVER); + else if (!_cups_strcasecmp(cs, "CIEXYZ")) + return (CUPS_CSPACE_CIEXYZ); + else if (!_cups_strcasecmp(cs, "CIELab")) + return (CUPS_CSPACE_CIELab); + else if (!_cups_strcasecmp(cs, "RGBW")) + return (CUPS_CSPACE_RGBW); + else if (!_cups_strcasecmp(cs, "ICC1")) + return (CUPS_CSPACE_ICC1); + else if (!_cups_strcasecmp(cs, "ICC2")) + return (CUPS_CSPACE_ICC2); + else if (!_cups_strcasecmp(cs, "ICC3")) + return (CUPS_CSPACE_ICC3); + else if (!_cups_strcasecmp(cs, "ICC4")) + return (CUPS_CSPACE_ICC4); + else if (!_cups_strcasecmp(cs, "ICC5")) + return (CUPS_CSPACE_ICC5); + else if (!_cups_strcasecmp(cs, "ICC6")) + return (CUPS_CSPACE_ICC6); + else if (!_cups_strcasecmp(cs, "ICC7")) + return (CUPS_CSPACE_ICC7); + else if (!_cups_strcasecmp(cs, "ICC8")) + return (CUPS_CSPACE_ICC8); + else if (!_cups_strcasecmp(cs, "ICC9")) + return (CUPS_CSPACE_ICC9); + else if (!_cups_strcasecmp(cs, "ICCA")) + return (CUPS_CSPACE_ICCA); + else if (!_cups_strcasecmp(cs, "ICCB")) + return (CUPS_CSPACE_ICCB); + else if (!_cups_strcasecmp(cs, "ICCC")) + return (CUPS_CSPACE_ICCC); + else if (!_cups_strcasecmp(cs, "ICCD")) + return (CUPS_CSPACE_ICCD); + else if (!_cups_strcasecmp(cs, "ICCE")) + return (CUPS_CSPACE_ICCE); + else if (!_cups_strcasecmp(cs, "ICCF")) + return (CUPS_CSPACE_ICCF); + else + return (-1); +} + + +// +// 'ppdcSource::get_constraint()' - Get a constraint. +// + +ppdcConstraint * // O - Constraint +ppdcSource::get_constraint(ppdcFile *fp)// I - File to read +{ + char temp[1024], // One string to rule them all + *ptr, // Pointer into string + *option1, // Constraint option 1 + *choice1, // Constraint choice 1 + *option2, // Constraint option 2 + *choice2; // Constraint choice 2 + + + // Read the UIConstaints parameter in one of the following forms: + // + // UIConstraints "*Option1 *Option2" + // UIConstraints "*Option1 Choice1 *Option2" + // UIConstraints "*Option1 *Option2 Choice2" + // UIConstraints "*Option1 Choice1 *Option2 Choice2" + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected constraints string for UIConstraints on " + "line %d of %s."), fp->line, fp->filename); + return (NULL); + } + + for (ptr = temp; isspace(*ptr); ptr ++); + + if (*ptr != '*') + { + _cupsLangPrintf(stderr, + _("ppdc: Option constraint must *name on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + option1 = ptr; + + for (; *ptr && !isspace(*ptr); ptr ++); + for (; isspace(*ptr); *ptr++ = '\0'); + + if (*ptr != '*') + { + choice1 = ptr; + + for (; *ptr && !isspace(*ptr); ptr ++); + for (; isspace(*ptr); *ptr++ = '\0'); + } + else + choice1 = NULL; + + if (*ptr != '*') + { + _cupsLangPrintf(stderr, + _("ppdc: Expected two option names on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + option2 = ptr; + + for (; *ptr && !isspace(*ptr); ptr ++); + for (; isspace(*ptr); *ptr++ = '\0'); + + if (*ptr) + choice2 = ptr; + else + choice2 = NULL; + + return (new ppdcConstraint(option1, choice1, option2, choice2)); +} + + +// +// 'ppdcSource::get_custom_size()' - Get a custom media size definition from a file. +// + +ppdcMediaSize * // O - Media size +ppdcSource::get_custom_size(ppdcFile *fp) + // I - File to read +{ + char name[1024], // Name + *text, // Text + size_code[10240], // PageSize code + region_code[10240]; // PageRegion + float width, // Width + length, // Length + left, // Left margin + bottom, // Bottom margin + right, // Right margin + top; // Top margin + + + // Get the name, text, width, length, margins, and code: + // + // CustomMedia name/text width length left bottom right top size-code region-code + if (!get_token(fp, name, sizeof(name))) + return (NULL); + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if ((width = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((length = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((left = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((bottom = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((right = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((top = get_measurement(fp)) < 0.0f) + return (NULL); + + if (!get_token(fp, size_code, sizeof(size_code))) + return (NULL); + + if (!get_token(fp, region_code, sizeof(region_code))) + return (NULL); + + // Return the new media size... + return (new ppdcMediaSize(name, text, width, length, left, bottom, + right, top, size_code, region_code)); +} + + +// +// 'ppdcSource::get_duplex()' - Get a duplex option. +// + +void +ppdcSource::get_duplex(ppdcFile *fp, // I - File to read from + ppdcDriver *d) // I - Current driver +{ + char temp[256]; // Duplex keyword + ppdcAttr *attr; // cupsFlipDuplex attribute + ppdcGroup *g; // Current group + ppdcOption *o; // Duplex option + + + // Duplex {boolean|none|normal|flip} + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected duplex type after Duplex on line %d of " + "%s."), fp->line, fp->filename); + return; + } + + if (cond_state) + return; + + if (!_cups_strcasecmp(temp, "none") || !_cups_strcasecmp(temp, "false") || + !_cups_strcasecmp(temp, "no") || !_cups_strcasecmp(temp, "off")) + { + g = d->find_group("General"); + if ((o = g->find_option("Duplex")) != NULL) + g->options->remove(o); + + for (attr = (ppdcAttr *)d->attrs->first(); + attr; + attr = (ppdcAttr *)d->attrs->next()) + if (!strcmp(attr->name->value, "cupsFlipDuplex")) + { + d->attrs->remove(attr); + break; + } + } + else if (!_cups_strcasecmp(temp, "normal") || !_cups_strcasecmp(temp, "true") || + !_cups_strcasecmp(temp, "yes") || !_cups_strcasecmp(temp, "on") || + !_cups_strcasecmp(temp, "flip") || !_cups_strcasecmp(temp, "rotated") || + !_cups_strcasecmp(temp, "manualtumble")) + { + g = d->find_group("General"); + o = g->find_option("Duplex"); + + if (!o) + { + o = new ppdcOption(PPDC_PICKONE, "Duplex", "2-Sided Printing", + !_cups_strcasecmp(temp, "flip") ? PPDC_SECTION_PAGE : + PPDC_SECTION_ANY, 10.0f); + o->add_choice(new ppdcChoice("None", "Off (1-Sided)", + "<>setpagedevice")); + o->add_choice(new ppdcChoice("DuplexNoTumble", "Long-Edge (Portrait)", + "<>setpagedevice")); + o->add_choice(new ppdcChoice("DuplexTumble", "Short-Edge (Landscape)", + "<>setpagedevice")); + + g->add_option(o); + } + + for (attr = (ppdcAttr *)d->attrs->first(); + attr; + attr = (ppdcAttr *)d->attrs->next()) + if (!strcmp(attr->name->value, "cupsFlipDuplex")) + { + if (_cups_strcasecmp(temp, "flip")) + d->attrs->remove(attr); + break; + } + + if (!_cups_strcasecmp(temp, "flip") && !attr) + d->add_attr(new ppdcAttr("cupsFlipDuplex", NULL, NULL, "true")); + + for (attr = (ppdcAttr *)d->attrs->first(); + attr; + attr = (ppdcAttr *)d->attrs->next()) + if (!strcmp(attr->name->value, "cupsBackSide")) + { + d->attrs->remove(attr); + break; + } + + if (!_cups_strcasecmp(temp, "flip")) + d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Flipped")); + else if (!_cups_strcasecmp(temp, "rotated")) + d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Rotated")); + else if (!_cups_strcasecmp(temp, "manualtumble")) + d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "ManualTumble")); + else + d->add_attr(new ppdcAttr("cupsBackSide", NULL, NULL, "Normal")); + } + else + _cupsLangPrintf(stderr, + _("ppdc: Unknown duplex type \"%s\" on line %d of %s."), + temp, fp->line, fp->filename); +} + + +// +// 'ppdcSource::get_filter()' - Get a filter. +// + +ppdcFilter * // O - Filter +ppdcSource::get_filter(ppdcFile *fp) // I - File to read +{ + char type[1024], // MIME type + program[1024], // Filter program + *ptr; // Pointer into MIME type + int cost; // Relative cost + + + // Read filter parameters in one of the following formats: + // + // Filter "type cost program" + // Filter type cost program + + if (!get_token(fp, type, sizeof(type))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected a filter definition on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((ptr = strchr(type, ' ')) != NULL) + { + // Old-style filter definition in one string... + *ptr++ = '\0'; + cost = strtol(ptr, &ptr, 10); + + while (isspace(*ptr)) + ptr ++; + + strcpy(program, ptr); + } + else + { + cost = get_integer(fp); + + if (!get_token(fp, program, sizeof(program))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected a program name on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + } + + if (!type[0]) + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid empty MIME type for filter on line %d of " + "%s."), fp->line, fp->filename); + return (NULL); + } + + if (cost < 0 || cost > 200) + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid cost for filter on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if (!program[0]) + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid empty program name for filter on line %d " + "of %s."), fp->line, fp->filename); + return (NULL); + } + + return (new ppdcFilter(type, program, cost)); +} + + +// +// 'ppdcSource::get_float()' - Get a single floating-point number. +// + +float // O - Number +ppdcSource::get_float(ppdcFile *fp) // I - File to read +{ + char temp[256], // String buffer + *ptr; // Pointer into buffer + float val; // Floating point value + + + // Get the number from the file and range-check... + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, _("ppdc: Expected real number on line %d of %s."), + fp->line, fp->filename); + return (-1.0f); + } + + val = (float)strtod(temp, &ptr); + + if (*ptr) + { + _cupsLangPrintf(stderr, + _("ppdc: Unknown trailing characters in real number \"%s\" " + "on line %d of %s."), temp, fp->line, fp->filename); + return (-1.0f); + } + else + return (val); +} + + +// +// 'ppdcSource::get_font()' - Get a font definition. +// + +ppdcFont * // O - Font data +ppdcSource::get_font(ppdcFile *fp) // I - File to read +{ + char name[256], // Font name + encoding[256], // Font encoding + version[256], // Font version + charset[256], // Font charset + temp[256]; // Font status string + ppdcFontStatus status; // Font status enumeration + + + // Read font parameters as follows: + // + // Font * + // Font name encoding version charset status + // %font name encoding version charset status + // + // "Name" is the PostScript font name. + // + // "Encoding" is the default encoding of the font: Standard, ISOLatin1, + // Special, Expert, ExpertSubset, etc. + // + // "Version" is the version number string. + // + // "Charset" specifies the characters that are included in the font: + // Standard, Special, Expert, Adobe-Identity, etc. + // + // "Status" is the keyword ROM or Disk. + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after Font on line %d of %s."), + fp->line, fp->filename); + return (0); + } + + if (!strcmp(name, "*")) + { + // Include all base fonts... + encoding[0] = '\0'; + version[0] = '\0'; + charset[0] = '\0'; + status = PPDC_FONT_ROM; + } + else + { + // Load a full font definition... + if (!get_token(fp, encoding, sizeof(encoding))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected encoding after Font on line %d of " + "%s."), fp->line, fp->filename); + return (0); + } + + if (!get_token(fp, version, sizeof(version))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected version after Font on line %d of " + "%s."), fp->line, fp->filename); + return (0); + } + + if (!get_token(fp, charset, sizeof(charset))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected charset after Font on line %d of " + "%s."), fp->line, fp->filename); + return (0); + } + + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected status after Font on line %d of %s."), + fp->line, fp->filename); + return (0); + } + + if (!_cups_strcasecmp(temp, "ROM")) + status = PPDC_FONT_ROM; + else if (!_cups_strcasecmp(temp, "Disk")) + status = PPDC_FONT_DISK; + else + { + _cupsLangPrintf(stderr, + _("ppdc: Bad status keyword %s on line %d of %s."), + temp, fp->line, fp->filename); + return (0); + } + } + +// printf("Font %s %s %s %s %s\n", name, encoding, version, charset, temp); + + return (new ppdcFont(name, encoding, version, charset, status)); +} + + +// +// 'ppdcSource::get_generic()' - Get a generic old-style option. +// + +ppdcChoice * // O - Choice data +ppdcSource::get_generic(ppdcFile *fp, // I - File to read + const char *keyword, + // I - Keyword name + const char *tattr, + // I - Text attribute + const char *nattr) + // I - Numeric attribute +{ + char name[1024], // Name + *text, // Text + command[256]; // Command string + int val; // Numeric value + + + // Read one of the following parameters: + // + // Foo name/text + // Foo integer name/text + if (nattr) + val = get_integer(fp); + else + val = 0; + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name/text after %s on line %d of %s."), + keyword, fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if (nattr) + { + if (tattr) + snprintf(command, sizeof(command), + "<>setpagedevice", + tattr, name, nattr, val); + else + snprintf(command, sizeof(command), + "<>setpagedevice", + nattr, val); + } + else + snprintf(command, sizeof(command), + "<>setpagedevice", + tattr, name); + + return (new ppdcChoice(name, text, command)); +} + + +// +// 'ppdcSource::get_group()' - Get an option group. +// + +ppdcGroup * // O - Group +ppdcSource::get_group(ppdcFile *fp, // I - File to read + ppdcDriver *d) // I - Printer driver +{ + char name[1024], // UI name + *text; // UI text + ppdcGroup *g; // Group + + + // Read the Group parameters: + // + // Group name/text + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected group name/text on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + // See if the group already exists... + if ((g = d->find_group(name)) == NULL) + { + // Nope, add a new one... + g = new ppdcGroup(name, text); + } + + return (g); +} + + +// +// 'ppdcSource::get_installable()' - Get an installable option. +// + +ppdcOption * // O - Option +ppdcSource::get_installable(ppdcFile *fp) + // I - File to read +{ + char name[1024], // Name for installable option + *text; // Text for installable option + ppdcOption *o; // Option + + + // Read the parameter for an installable option: + // + // Installable name/text + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name/text after Installable on line %d " + "of %s."), fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + // Create the option... + o = new ppdcOption(PPDC_BOOLEAN, name, text, PPDC_SECTION_ANY, 10.0f); + + // Add the false and true choices... + o->add_choice(new ppdcChoice("False", "Not Installed", "")); + o->add_choice(new ppdcChoice("True", "Installed", "")); + + return (o); +} + + +// +// 'ppdcSource::get_integer()' - Get an integer value from a string. +// + +#define PPDC_XX -1 // Bad +#define PPDC_EQ 0 // == +#define PPDC_NE 1 // != +#define PPDC_LT 2 // < +#define PPDC_LE 3 // <= +#define PPDC_GT 4 // > +#define PPDC_GE 5 // >= + +int // O - Integer value +ppdcSource::get_integer(const char *v) // I - Value string +{ + long val; // Value + long temp, // Temporary value + temp2; // Second temporary value + char *newv, // New value string pointer + ch; // Temporary character + ppdcVariable *var; // #define variable + int compop; // Comparison operator + + + // Parse the value string... + if (!v) + return (-1); + + if (isdigit(*v & 255) || *v == '-' || *v == '+') + { + // Return a simple integer value + val = strtol(v, (char **)&v, 0); + if (*v || val == LONG_MIN) + return (-1); + else + return ((int)val); + } + else if (*v == '(') + { + // Evaluate and expression in any of the following formats: + // + // (number number ... number) Bitwise OR of all numbers + // (NAME == value) 1 if equal, 0 otherwise + // (NAME != value) 1 if not equal, 0 otherwise + // (NAME < value) 1 if less than, 0 otherwise + // (NAME <= value) 1 if less than or equal, 0 otherwise + // (NAME > value) 1 if greater than, 0 otherwise + // (NAME >= value) 1 if greater than or equal, 0 otherwise + + v ++; + val = 0; + + while (*v && *v != ')') + { + // Skip leading whitespace... + while (*v && isspace(*v & 255)) + v ++; + + if (!*v || *v == ')') + break; + + if (isdigit(*v & 255) || *v == '-' || *v == '+') + { + // Bitwise OR a number... + temp = strtol(v, &newv, 0); + + if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') || + temp == LONG_MIN) + return (-1); + } + else + { + // NAME logicop value + for (newv = (char *)v + 1; + *newv && (isalnum(*newv & 255) || *newv == '_'); + newv ++) + /* do nothing */; + + ch = *newv; + *newv = '\0'; + + if ((var = find_variable(v)) != NULL) + { + if (!var->value || !var->value->value || !var->value->value[0]) + temp = 0; + else if (isdigit(var->value->value[0] & 255) || + var->value->value[0] == '-' || + var->value->value[0] == '+') + temp = strtol(var->value->value, NULL, 0); + else + temp = 1; + } + else + temp = 0; + + *newv = ch; + while (isspace(*newv & 255)) + newv ++; + + if (!strncmp(newv, "==", 2)) + { + compop = PPDC_EQ; + newv += 2; + } + else if (!strncmp(newv, "!=", 2)) + { + compop = PPDC_NE; + newv += 2; + } + else if (!strncmp(newv, "<=", 2)) + { + compop = PPDC_LE; + newv += 2; + } + else if (*newv == '<') + { + compop = PPDC_LT; + newv ++; + } + else if (!strncmp(newv, ">=", 2)) + { + compop = PPDC_GE; + newv += 2; + } + else if (*newv == '>') + { + compop = PPDC_GT; + newv ++; + } + else + compop = PPDC_XX; + + if (compop != PPDC_XX) + { + while (isspace(*newv & 255)) + newv ++; + + if (*newv == ')' || !*newv) + return (-1); + + if (isdigit(*newv & 255) || *newv == '-' || *newv == '+') + { + // Get the second number... + temp2 = strtol(newv, &newv, 0); + if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') || + temp == LONG_MIN) + return (-1); + } + else + { + // Lookup the second name... + for (v = newv, newv ++; + *newv && (isalnum(*newv & 255) || *newv == '_'); + newv ++); + + ch = *newv; + *newv = '\0'; + + if ((var = find_variable(v)) != NULL) + { + if (!var->value || !var->value->value || !var->value->value[0]) + temp2 = 0; + else if (isdigit(var->value->value[0] & 255) || + var->value->value[0] == '-' || + var->value->value[0] == '+') + temp2 = strtol(var->value->value, NULL, 0); + else + temp2 = 1; + } + else + temp2 = 0; + + *newv = ch; + } + + // Do the comparison... + switch (compop) + { + case PPDC_EQ : + temp = temp == temp2; + break; + case PPDC_NE : + temp = temp != temp2; + break; + case PPDC_LT : + temp = temp < temp2; + break; + case PPDC_LE : + temp = temp <= temp2; + break; + case PPDC_GT : + temp = temp > temp2; + break; + case PPDC_GE : + temp = temp >= temp2; + break; + } + } + } + + val |= temp; + v = newv; + } + + if (*v == ')' && !v[1]) + return ((int)val); + else + return (-1); + } + else if ((var = find_variable(v)) != NULL) + { + // NAME by itself returns 1 if the #define variable is not blank and + // not "0"... + return (var->value->value && var->value->value[0] && + strcmp(var->value->value, "0")); + } + else + { + // Anything else is an error... + return (-1); + } +} + + +// +// 'ppdcSource::get_integer()' - Get an integer value from a file. +// + +int // O - Integer value +ppdcSource::get_integer(ppdcFile *fp) // I - File to read +{ + char temp[1024]; // String buffer + + + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, _("ppdc: Expected integer on line %d of %s."), + fp->line, fp->filename); + return (-1); + } + else + return (get_integer(temp)); +} + + +// +// 'ppdcSource::get_measurement()' - Get a measurement value. +// + +float // O - Measurement value in points +ppdcSource::get_measurement(ppdcFile *fp) + // I - File to read +{ + char buffer[256], // Number buffer + *ptr; // Pointer into buffer + float val; // Measurement value + + + // Grab a token from the file... + if (!get_token(fp, buffer, sizeof(buffer))) + return (-1.0f); + + // Get the floating point value of "s" and skip all digits and decimal points. + val = (float)strtod(buffer, &ptr); + + // Check for a trailing unit specifier... + if (!_cups_strcasecmp(ptr, "mm")) + val *= 72.0f / 25.4f; + else if (!_cups_strcasecmp(ptr, "cm")) + val *= 72.0f / 2.54f; + else if (!_cups_strcasecmp(ptr, "m")) + val *= 72.0f / 0.0254f; + else if (!_cups_strcasecmp(ptr, "in")) + val *= 72.0f; + else if (!_cups_strcasecmp(ptr, "ft")) + val *= 72.0f * 12.0f; + else if (_cups_strcasecmp(ptr, "pt") && *ptr) + return (-1.0f); + + return (val); +} + + +// +// 'ppdcSource::get_option()' - Get an option definition. +// + +ppdcOption * // O - Option +ppdcSource::get_option(ppdcFile *fp, // I - File to read + ppdcDriver *d, // I - Printer driver + ppdcGroup *g) // I - Current group +{ + char name[1024], // UI name + *text, // UI text + type[256]; // UI type string + ppdcOptType ot; // Option type value + ppdcOptSection section; // Option section + float order; // Option order + ppdcOption *o; // Option + ppdcGroup *mg; // Matching group, if any + + + // Read the Option parameters: + // + // Option name/text type section order + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected option name/text on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if (!get_token(fp, type, sizeof(type))) + { + _cupsLangPrintf(stderr, _("ppdc: Expected option type on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if (!_cups_strcasecmp(type, "boolean")) + ot = PPDC_BOOLEAN; + else if (!_cups_strcasecmp(type, "pickone")) + ot = PPDC_PICKONE; + else if (!_cups_strcasecmp(type, "pickmany")) + ot = PPDC_PICKMANY; + else + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid option type \"%s\" on line %d of %s."), + type, fp->line, fp->filename); + return (NULL); + } + + if (!get_token(fp, type, sizeof(type))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected option section on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if (!_cups_strcasecmp(type, "AnySetup")) + section = PPDC_SECTION_ANY; + else if (!_cups_strcasecmp(type, "DocumentSetup")) + section = PPDC_SECTION_DOCUMENT; + else if (!_cups_strcasecmp(type, "ExitServer")) + section = PPDC_SECTION_EXIT; + else if (!_cups_strcasecmp(type, "JCLSetup")) + section = PPDC_SECTION_JCL; + else if (!_cups_strcasecmp(type, "PageSetup")) + section = PPDC_SECTION_PAGE; + else if (!_cups_strcasecmp(type, "Prolog")) + section = PPDC_SECTION_PROLOG; + else + { + _cupsLangPrintf(stderr, + _("ppdc: Invalid option section \"%s\" on line %d of " + "%s."), type, fp->line, fp->filename); + return (NULL); + } + + order = get_float(fp); + + // See if the option already exists... + if ((o = d->find_option_group(name, &mg)) == NULL) + { + // Nope, add a new one... + o = new ppdcOption(ot, name, text, section, order); + } + else if (o->type != ot) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s redefined with a different type on line " + "%d of %s."), name, fp->line, fp->filename); + return (NULL); + } + else if (g != mg) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on line " + "%d of %s."), name, fp->line, fp->filename); + return (NULL); + } + + return (o); +} + + +// +// 'ppdcSource::get_po()' - Get a message catalog. +// + +ppdcCatalog * // O - Message catalog +ppdcSource::get_po(ppdcFile *fp) // I - File to read +{ + char locale[32], // Locale name + poname[1024], // Message catalog filename + basedir[1024], // Base directory + *baseptr, // Pointer into directory + pofilename[1024]; // Full filename of message catalog + ppdcCatalog *cat; // Message catalog + + + // Read the #po parameters: + // + // #po locale "filename.po" + if (!get_token(fp, locale, sizeof(locale))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected locale after #po on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if (!get_token(fp, poname, sizeof(poname))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected filename after #po %s on line %d of " + "%s."), locale, fp->line, fp->filename); + return (NULL); + } + + // See if the locale is already loaded... + if (find_po(locale)) + { + _cupsLangPrintf(stderr, + _("ppdc: Duplicate #po for locale %s on line %d of %s."), + locale, fp->line, fp->filename); + return (NULL); + } + + // Figure out the current directory... + strlcpy(basedir, fp->filename, sizeof(basedir)); + + if ((baseptr = strrchr(basedir, '/')) != NULL) + *baseptr = '\0'; + else + strcpy(basedir, "."); + + // Find the po file... + pofilename[0] = '\0'; + + if (!poname[0] || + find_include(poname, basedir, pofilename, sizeof(pofilename))) + { + // Found it, so load it... + cat = new ppdcCatalog(locale, pofilename); + + // Reset the filename to the name supplied by the user... + cat->filename->release(); + cat->filename = new ppdcString(poname); + + // Return the catalog... + return (cat); + } + else + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to find #po file %s on line %d of %s."), + poname, fp->line, fp->filename); + return (NULL); + } +} + + +// +// 'ppdcSource::get_resolution()' - Get an old-style resolution option. +// + +ppdcChoice * // O - Choice data +ppdcSource::get_resolution(ppdcFile *fp)// I - File to read +{ + char name[1024], // Name + *text, // Text + temp[256], // Temporary string + command[256], // Command string + *commptr; // Pointer into command + int xdpi, ydpi, // X + Y resolution + color_order, // Color order + color_space, // Colorspace + compression, // Compression mode + depth, // Bits per color + row_count, // Row count + row_feed, // Row feed + row_step; // Row step/interval + + + // Read the resolution parameters: + // + // Resolution colorspace bits row-count row-feed row-step name/text + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected override field after Resolution on line " + "%d of %s."), fp->line, fp->filename); + return (NULL); + } + + color_order = get_color_order(temp); + color_space = get_color_space(temp); + compression = get_integer(temp); + + depth = get_integer(fp); + row_count = get_integer(fp); + row_feed = get_integer(fp); + row_step = get_integer(fp); + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name/text after Resolution on line %d of " + "%s."), fp->line, fp->filename); + return (NULL); + } + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + switch (sscanf(name, "%dx%d", &xdpi, &ydpi)) + { + case 0 : + _cupsLangPrintf(stderr, + _("ppdc: Bad resolution name \"%s\" on line %d of " + "%s."), name, fp->line, fp->filename); + break; + case 1 : + ydpi = xdpi; + break; + } + + // Create the necessary PS commands... + snprintf(command, sizeof(command), + "<= 0) + { + snprintf(commptr, sizeof(command) - (commptr - command), + "/cupsColorOrder %d", color_order); + commptr += strlen(commptr); + } + + if (color_space >= 0) + { + snprintf(commptr, sizeof(command) - (commptr - command), + "/cupsColorSpace %d", color_space); + commptr += strlen(commptr); + } + + if (compression >= 0) + { + snprintf(commptr, sizeof(command) - (commptr - command), + "/cupsCompression %d", compression); + commptr += strlen(commptr); + } + + snprintf(commptr, sizeof(command) - (commptr - command), ">>setpagedevice"); + + // Return the new choice... + return (new ppdcChoice(name, text, command)); +} + + +// +// 'ppdcSource::get_simple_profile()' - Get a simple color profile definition. +// + +ppdcProfile * // O - Color profile +ppdcSource::get_simple_profile(ppdcFile *fp) + // I - File to read +{ + char resolution[1024], // Resolution/media type + *media_type; // Media type + float m[9]; // Transform matrix + float kd, rd, g; // Densities and gamma + float red, green, blue; // RGB adjustments + float yellow; // Yellow density + float color; // Color density values + + + // Get the SimpleColorProfile parameters: + // + // SimpleColorProfile resolution/mediatype black-density yellow-density + // red-density gamma red-adjust green-adjust blue-adjust + if (!get_token(fp, resolution, sizeof(resolution))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected resolution/mediatype following " + "SimpleColorProfile on line %d of %s."), + fp->line, fp->filename); + return (NULL); + } + + if ((media_type = strchr(resolution, '/')) != NULL) + *media_type++ = '\0'; + else + media_type = resolution; + + // Collect the profile parameters... + kd = get_float(fp); + yellow = get_float(fp); + rd = get_float(fp); + g = get_float(fp); + red = get_float(fp); + green = get_float(fp); + blue = get_float(fp); + + // Build the color profile... + color = 0.5f * rd / kd - kd; + m[0] = 1.0f; // C + m[1] = color + blue; // C + M (blue) + m[2] = color - green; // C + Y (green) + m[3] = color - blue; // M + C (blue) + m[4] = 1.0f; // M + m[5] = color + red; // M + Y (red) + m[6] = yellow * (color + green); // Y + C (green) + m[7] = yellow * (color - red); // Y + M (red) + m[8] = yellow; // Y + + if (m[1] > 0.0f) + { + m[3] -= m[1]; + m[1] = 0.0f; + } + else if (m[3] > 0.0f) + { + m[1] -= m[3]; + m[3] = 0.0f; + } + + if (m[2] > 0.0f) + { + m[6] -= m[2]; + m[2] = 0.0f; + } + else if (m[6] > 0.0f) + { + m[2] -= m[6]; + m[6] = 0.0f; + } + + if (m[5] > 0.0f) + { + m[7] -= m[5]; + m[5] = 0.0f; + } + else if (m[7] > 0.0f) + { + m[5] -= m[7]; + m[7] = 0.0f; + } + + // Return the new profile... + return (new ppdcProfile(resolution, media_type, g, kd, m)); +} + + +// +// 'ppdcSource::get_size()' - Get a media size definition from a file. +// + +ppdcMediaSize * // O - Media size +ppdcSource::get_size(ppdcFile *fp) // I - File to read +{ + char name[1024], // Name + *text; // Text + float width, // Width + length; // Length + + + // Get the name, text, width, and length: + // + // #media name/text width length + if (!get_token(fp, name, sizeof(name))) + return (NULL); + + if ((text = strchr(name, '/')) != NULL) + *text++ = '\0'; + else + text = name; + + if ((width = get_measurement(fp)) < 0.0f) + return (NULL); + + if ((length = get_measurement(fp)) < 0.0f) + return (NULL); + + // Return the new media size... + return (new ppdcMediaSize(name, text, width, length, 0.0f, 0.0f, 0.0f, 0.0f)); +} + + +// +// 'ppdcSource::get_token()' - Get a token from a file. +// + +char * // O - Token string or NULL +ppdcSource::get_token(ppdcFile *fp, // I - File to read + char *buffer, // I - Buffer + int buflen) // I - Length of buffer +{ + char *bufptr, // Pointer into string buffer + *bufend; // End of string buffer + int ch, // Character from file + nextch, // Next char in file + quote, // Quote character used... + empty, // Empty input? + startline; // Start line for quote + char name[256], // Name string + *nameptr; // Name pointer + ppdcVariable *var; // Variable pointer + + + // Mark the beginning and end of the buffer... + bufptr = buffer; + bufend = buffer + buflen - 1; + + // Loop intil we've read a token... + quote = 0; + startline = 0; + empty = 1; + + while ((ch = fp->get()) != EOF) + { + if (isspace(ch) && !quote) + { + if (empty) + continue; + else + break; + } + else if (ch == '$') + { + // Variable substitution + empty = 0; + + for (nameptr = name; (ch = fp->peek()) != EOF;) + { + if (!isalnum(ch) && ch != '_') + break; + else if (nameptr < (name + sizeof(name) - 1)) + *nameptr++ = fp->get(); + } + + if (nameptr == name) + { + // Just substitute this character... + if (ch == '$') + { + // $$ = $ + if (bufptr < bufend) + *bufptr++ = fp->get(); + } + else + { + // $ch = $ch + _cupsLangPrintf(stderr, + _("ppdc: Bad variable substitution ($%c) on line %d " + "of %s."), ch, fp->line, fp->filename); + + if (bufptr < bufend) + *bufptr++ = '$'; + } + } + else + { + // Substitute the variable value... + *nameptr = '\0'; + var = find_variable(name); + if (var) + { + strlcpy(bufptr, var->value->value, bufend - bufptr + 1); + bufptr += strlen(bufptr); + } + else + { + if (!(cond_state & PPDC_COND_SKIP)) + _cupsLangPrintf(stderr, + _("ppdc: Undefined variable (%s) on line %d of " + "%s."), name, fp->line, fp->filename); + + snprintf(bufptr, bufend - bufptr + 1, "$%s", name); + bufptr += strlen(bufptr); + } + } + } + else if (ch == '/' && !quote) + { + // Possibly a comment... + nextch = fp->peek(); + + if (nextch == '*') + { + // C comment... + fp->get(); + ch = fp->get(); + while ((nextch = fp->get()) != EOF) + { + if (ch == '*' && nextch == '/') + break; + + ch = nextch; + } + + if (nextch == EOF) + break; + } + else if (nextch == '/') + { + // C++ comment... + while ((nextch = fp->get()) != EOF) + if (nextch == '\n') + break; + + if (nextch == EOF) + break; + } + else + { + // Not a comment... + empty = 0; + + if (bufptr < bufend) + *bufptr++ = ch; + } + } + else if (ch == '\'' || ch == '\"') + { + empty = 0; + + if (quote == ch) + { + // Ending the current quoted string... + quote = 0; + } + else if (quote) + { + // Insert the opposing quote char... + if (bufptr < bufend) + *bufptr++ = ch; + } + else + { + // Start a new quoted string... + startline = fp->line; + quote = ch; + } + } + else if ((ch == '(' || ch == '<') && !quote) + { + empty = 0; + quote = ch; + startline = fp->line; + + if (bufptr < bufend) + *bufptr++ = ch; + } + else if ((ch == ')' && quote == '(') || (ch == '>' && quote == '<')) + { + quote = 0; + + if (bufptr < bufend) + *bufptr++ = ch; + } + else if (ch == '\\') + { + empty = 0; + + if ((ch = fp->get()) == EOF) + break; + + if (bufptr < bufend) + *bufptr++ = ch; + } + else if (bufptr < bufend) + { + empty = 0; + + *bufptr++ = ch; + + if ((ch == '{' || ch == '}') && !quote) + break; + } + } + + if (quote) + { + _cupsLangPrintf(stderr, + _("ppdc: Unterminated string starting with %c on line %d " + "of %s."), quote, startline, fp->filename); + return (NULL); + } + + if (empty) + return (NULL); + else + { + *bufptr = '\0'; +// puts(buffer); + return (buffer); + } +} + + +// +// 'ppdcSource::get_variable()' - Get a variable definition. +// + +ppdcVariable * // O - Variable +ppdcSource::get_variable(ppdcFile *fp) // I - File to read +{ + char name[1024], // Name + value[1024]; // Value + + + // Get the name and value: + // + // #define name value + if (!get_token(fp, name, sizeof(name))) + return (NULL); + + if (!get_token(fp, value, sizeof(value))) + return (NULL); + + // Set the variable... + return (set_variable(name, value)); +} + + +// +// 'ppdcSource::quotef()' - Write a formatted, quoted string... +// + +int // O - Number bytes on success, -1 on failure +ppdcSource::quotef(cups_file_t *fp, // I - File to write to + const char *format, // I - Printf-style format string + ...) // I - Additional args as needed +{ + va_list ap; // Pointer to additional arguments + int bytes; // Bytes written + char sign, // Sign of format width + size, // Size character (h, l, L) + type; // Format type character + const char *bufformat; // Start of format + int width, // Width of field + prec; // Number of characters of precision + char tformat[100]; // Temporary format string for fprintf() + char *s; // Pointer to string + int slen; // Length of string + int i; // Looping var + + + // Range check input... + if (!fp || !format) + return (-1); + + // Loop through the format string, formatting as needed... + va_start(ap, format); + + bytes = 0; + + while (*format) + { + if (*format == '%') + { + bufformat = format; + format ++; + + if (*format == '%') + { + cupsFilePutChar(fp, *format++); + bytes ++; + continue; + } + else if (strchr(" -+#\'", *format)) + sign = *format++; + else + sign = 0; + + width = 0; + while (isdigit(*format)) + width = width * 10 + *format++ - '0'; + + if (*format == '.') + { + format ++; + prec = 0; + + while (isdigit(*format)) + prec = prec * 10 + *format++ - '0'; + } + else + prec = -1; + + if (*format == 'l' && format[1] == 'l') + { + size = 'L'; + format += 2; + } + else if (*format == 'h' || *format == 'l' || *format == 'L') + size = *format++; + else + size = '\0'; + + if (!*format) + break; + + type = *format++; + + switch (type) + { + case 'E' : // Floating point formats + case 'G' : + case 'e' : + case 'f' : + case 'g' : + if ((format - bufformat + 1) > (int)sizeof(tformat)) + break; + + strncpy(tformat, bufformat, format - bufformat); + tformat[format - bufformat] = '\0'; + + bytes += cupsFilePrintf(fp, tformat, va_arg(ap, double)); + break; + + case 'B' : // Integer formats + case 'X' : + case 'b' : + case 'd' : + case 'i' : + case 'o' : + case 'u' : + case 'x' : + if ((format - bufformat + 1) > (int)sizeof(tformat)) + break; + + strncpy(tformat, bufformat, format - bufformat); + tformat[format - bufformat] = '\0'; + +# ifdef HAVE_LONG_LONG + if (size == 'L') + bytes += cupsFilePrintf(fp, tformat, va_arg(ap, long long)); + else +# endif /* HAVE_LONG_LONG */ + if (size == 'l') + bytes += cupsFilePrintf(fp, tformat, va_arg(ap, long)); + else + bytes += cupsFilePrintf(fp, tformat, va_arg(ap, int)); + break; + + case 'p' : // Pointer value + if ((format - bufformat + 1) > (int)sizeof(tformat)) + break; + + strncpy(tformat, bufformat, format - bufformat); + tformat[format - bufformat] = '\0'; + + bytes += cupsFilePrintf(fp, tformat, va_arg(ap, void *)); + break; + + case 'c' : // Character or character array + if (width <= 1) + { + bytes ++; + cupsFilePutChar(fp, va_arg(ap, int)); + } + else + { + cupsFileWrite(fp, va_arg(ap, char *), width); + bytes += width; + } + break; + + case 's' : // String + if ((s = va_arg(ap, char *)) == NULL) + s = (char *)"(nil)"; + + slen = strlen(s); + if (slen > width && prec != width) + width = slen; + + if (slen > width) + slen = width; + + if (sign != '-') + { + for (i = width - slen; i > 0; i --, bytes ++) + cupsFilePutChar(fp, ' '); + } + + for (i = slen; i > 0; i --, s ++, bytes ++) + { + if (*s == '\\' || *s == '\"') + { + cupsFilePutChar(fp, '\\'); + bytes ++; + } + + cupsFilePutChar(fp, *s); + } + + if (sign == '-') + { + for (i = width - slen; i > 0; i --, bytes ++) + cupsFilePutChar(fp, ' '); + } + break; + } + } + else + { + cupsFilePutChar(fp, *format++); + bytes ++; + } + } + + va_end(ap); + + // Return the number of characters written. + return (bytes); +} + + +// +// 'ppdcSource::read_file()' - Read a driver source file. +// + +void +ppdcSource::read_file(const char *f, // I - File to read + cups_file_t *ffp) // I - File pointer to use +{ + ppdcFile *fp = new ppdcFile(f, ffp); + scan_file(fp); + delete fp; + + if (cond_current != cond_stack) + _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."), f); +} + + +// +// 'ppdcSource::scan_file()' - Scan a driver source file. +// + +void +ppdcSource::scan_file(ppdcFile *fp, // I - File to read + ppdcDriver *td, // I - Driver template + bool inc) // I - Including? +{ + ppdcDriver *d; // Current driver + ppdcGroup *g, // Current group + *mg, // Matching group + *general, // General options group + *install; // Installable options group + ppdcOption *o; // Current option + ppdcChoice *c; // Current choice + char temp[256], // Token from file... + *ptr; // Pointer into token + int isdefault; // Default option? + + + // Initialize things as needed... + if (inc && td) + { + d = td; + d->retain(); + } + else + d = new ppdcDriver(td); + + if ((general = d->find_group("General")) == NULL) + { + general = new ppdcGroup("General", NULL); + d->add_group(general); + } + + if ((install = d->find_group("InstallableOptions")) == NULL) + { + install = new ppdcGroup("InstallableOptions", "Installable Options"); + d->add_group(install); + } + + // Loop until EOF or } + o = 0; + g = general; + + while (get_token(fp, temp, sizeof(temp))) + { + if (temp[0] == '*') + { + // Mark the next choice as the default + isdefault = 1; + + for (ptr = temp; ptr[1]; ptr ++) + *ptr = ptr[1]; + + *ptr = '\0'; + } + else + { + // Don't mark the next choice as the default + isdefault = 0; + } + + if (!_cups_strcasecmp(temp, "}")) + { + // Close this one out... + break; + } + else if (!_cups_strcasecmp(temp, "{")) + { + // Open a new child... + scan_file(fp, d); + } + else if (!_cups_strcasecmp(temp, "#if")) + { + if ((cond_current - cond_stack) >= 100) + { + _cupsLangPrintf(stderr, + _("ppdc: Too many nested #if's on line %d of %s."), + fp->line, fp->filename); + break; + } + + cond_current ++; + if (get_integer(fp) > 0) + *cond_current = PPDC_COND_SATISFIED; + else + { + *cond_current = PPDC_COND_SKIP; + cond_state |= PPDC_COND_SKIP; + } + } + else if (!_cups_strcasecmp(temp, "#elif")) + { + if (cond_current == cond_stack) + { + _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."), + fp->line, fp->filename); + break; + } + + if (*cond_current & PPDC_COND_SATISFIED) + { + get_integer(fp); + *cond_current |= PPDC_COND_SKIP; + } + else if (get_integer(fp) > 0) + { + *cond_current |= PPDC_COND_SATISFIED; + *cond_current &= ~PPDC_COND_SKIP; + } + else + *cond_current |= PPDC_COND_SKIP; + + // Update the current state + int *cond_temp = cond_current; // Temporary stack pointer + + cond_state = PPDC_COND_NORMAL; + while (cond_temp > cond_stack) + if (*cond_temp & PPDC_COND_SKIP) + { + cond_state = PPDC_COND_SKIP; + break; + } + else + cond_temp --; + } + else if (!_cups_strcasecmp(temp, "#else")) + { + if (cond_current == cond_stack) + { + _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."), + fp->line, fp->filename); + break; + } + + if (*cond_current & PPDC_COND_SATISFIED) + *cond_current |= PPDC_COND_SKIP; + else + { + *cond_current |= PPDC_COND_SATISFIED; + *cond_current &= ~PPDC_COND_SKIP; + } + + // Update the current state + int *cond_temp = cond_current; // Temporary stack pointer + + cond_state = PPDC_COND_NORMAL; + while (cond_temp > cond_stack) + if (*cond_temp & PPDC_COND_SKIP) + { + cond_state = PPDC_COND_SKIP; + break; + } + else + cond_temp --; + } + else if (!_cups_strcasecmp(temp, "#endif")) + { + if (cond_current == cond_stack) + { + _cupsLangPrintf(stderr, _("ppdc: Missing #if on line %d of %s."), + fp->line, fp->filename); + break; + } + + cond_current --; + + // Update the current state + int *cond_temp = cond_current; // Temporary stack pointer + + cond_state = PPDC_COND_NORMAL; + while (cond_temp > cond_stack) + if (*cond_temp & PPDC_COND_SKIP) + { + cond_state = PPDC_COND_SKIP; + break; + } + else + cond_temp --; + } + else if (!_cups_strcasecmp(temp, "#define")) + { + // Get the variable... + get_variable(fp); + } + else if (!_cups_strcasecmp(temp, "#include")) + { + // #include filename + char basedir[1024], // Base directory + *baseptr, // Pointer into directory + inctemp[1024], // Initial filename + incname[1024]; // Include filename + ppdcFile *incfile; // Include file + int *old_current = cond_current; + // Previous current stack + + + // Get the include name... + if (!get_token(fp, inctemp, sizeof(inctemp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected include filename on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (cond_state) + continue; + + // Figure out the current directory... + strlcpy(basedir, fp->filename, sizeof(basedir)); + + if ((baseptr = strrchr(basedir, '/')) != NULL) + *baseptr = '\0'; + else + strcpy(basedir, "."); + + // Find the include file... + if (find_include(inctemp, basedir, incname, sizeof(incname))) + { + // Open the include file, scan it, and then close it... + incfile = new ppdcFile(incname); + scan_file(incfile, d, true); + delete incfile; + + if (cond_current != old_current) + _cupsLangPrintf(stderr, _("ppdc: Missing #endif at end of \"%s\"."), + incname); + } + else + { + // Can't find it! + _cupsLangPrintf(stderr, + _("ppdc: Unable to find include file \"%s\" on line %d " + "of %s."), inctemp, fp->line, fp->filename); + break; + } + } + else if (!_cups_strcasecmp(temp, "#media")) + { + ppdcMediaSize *m; // Media size + + + // Get a media size... + m = get_size(fp); + if (m) + { + if (cond_state) + m->release(); + else + sizes->add(m); + } + } + else if (!_cups_strcasecmp(temp, "#po")) + { + ppdcCatalog *cat; // Message catalog + + + // Get a message catalog... + cat = get_po(fp); + if (cat) + { + if (cond_state) + cat->release(); + else + po_files->add(cat); + } + } + else if (!_cups_strcasecmp(temp, "Attribute") || + !_cups_strcasecmp(temp, "LocAttribute")) + { + ppdcAttr *a; // Attribute + + + // Get an attribute... + a = get_attr(fp, !_cups_strcasecmp(temp, "LocAttribute")); + if (a) + { + if (cond_state) + a->release(); + else + d->add_attr(a); + } + } + else if (!_cups_strcasecmp(temp, "Choice")) + { + // Get a choice... + c = get_choice(fp); + if (!c) + break; + + if (cond_state) + { + c->release(); + continue; + } + + // Add it to the current option... + if (!o) + { + _cupsLangPrintf(stderr, + _("ppdc: Choice found on line %d of %s with no " + "Option."), fp->line, fp->filename); + break; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + } + else if (!_cups_strcasecmp(temp, "ColorDevice")) + { + // ColorDevice boolean + if (cond_state) + get_boolean(fp); + else + d->color_device = get_boolean(fp); + } + else if (!_cups_strcasecmp(temp, "ColorModel")) + { + // Get the color model + c = get_color_model(fp); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the ColorModel option... + if ((o = d->find_option("ColorModel")) == NULL) + { + // Create the ColorModel option... + o = new ppdcOption(PPDC_PICKONE, "ColorModel", "Color Mode", PPDC_SECTION_ANY, 10.0f); + g = general; + g->add_option(o); + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "ColorProfile")) + { + ppdcProfile *p; // Color profile + + + // Get the color profile... + p = get_color_profile(fp); + + if (p) + { + if (cond_state) + p->release(); + else + d->profiles->add(p); + } + } + else if (!_cups_strcasecmp(temp, "Copyright")) + { + // Copyright string + char copytemp[8192], // Copyright string + *copyptr, // Pointer into string + *copyend; // Pointer to end of string + + + // Get the copyright string... + if (!get_token(fp, copytemp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected string after Copyright on line %d " + "of %s."), fp->line, fp->filename); + break; + } + + if (cond_state) + continue; + + // Break it up into individual lines... + for (copyptr = copytemp; copyptr; copyptr = copyend) + { + if ((copyend = strchr(copyptr, '\n')) != NULL) + *copyend++ = '\0'; + + d->copyright->add(new ppdcString(copyptr)); + } + } + else if (!_cups_strcasecmp(temp, "CustomMedia")) + { + ppdcMediaSize *m; // Media size + + + // Get a custom media size... + m = get_custom_size(fp); + + if (cond_state) + { + m->release(); + continue; + } + + if (m) + d->sizes->add(m); + + if (isdefault) + d->set_default_size(m); + } + else if (!_cups_strcasecmp(temp, "Cutter")) + { + // Cutter boolean + int have_cutter; // Have a paper cutter? + + + have_cutter = get_boolean(fp); + if (have_cutter <= 0 || cond_state) + continue; + + if ((o = d->find_option("CutMedia")) == NULL) + { + o = new ppdcOption(PPDC_BOOLEAN, "CutMedia", "Cut Media", PPDC_SECTION_ANY, 10.0f); + + g = general; + g->add_option(o); + + c = new ppdcChoice("False", NULL, "<>setpagedevice"); + o->add_choice(c); + o->set_defchoice(c); + + c = new ppdcChoice("True", NULL, "<>setpagedevice"); + o->add_choice(c); + } + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "Darkness")) + { + // Get the darkness choice... + c = get_generic(fp, "Darkness", NULL, "cupsCompression"); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the cupsDarkness option... + if ((o = d->find_option_group("cupsDarkness", &mg)) == NULL) + { + // Create the cupsDarkness option... + o = new ppdcOption(PPDC_PICKONE, "cupsDarkness", "Darkness", PPDC_SECTION_ANY, 10.0f); + g = general; + g->add_option(o); + } + else if (mg != general) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on " + "line %d of %s."), "cupsDarkness", fp->line, + fp->filename); + c->release(); + continue; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "DriverType")) + { + int i; // Looping var + + + // DriverType keyword + if (!get_token(fp, temp, sizeof(temp))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected driver type keyword following " + "DriverType on line %d of %s."), + fp->line, fp->filename); + continue; + } + + if (cond_state) + continue; + + for (i = 0; i < (int)(sizeof(driver_types) / sizeof(driver_types[0])); i ++) + if (!_cups_strcasecmp(temp, driver_types[i])) + break; + + if (i < (int)(sizeof(driver_types) / sizeof(driver_types[0]))) + d->type = (ppdcDrvType)i; + else if (!_cups_strcasecmp(temp, "dymo")) + d->type = PPDC_DRIVER_LABEL; + else + _cupsLangPrintf(stderr, + _("ppdc: Unknown driver type %s on line %d of %s."), + temp, fp->line, fp->filename); + } + else if (!_cups_strcasecmp(temp, "Duplex")) + get_duplex(fp, d); + else if (!_cups_strcasecmp(temp, "Filter")) + { + ppdcFilter *f; // Filter + + + // Get the filter value... + f = get_filter(fp); + if (f) + { + if (cond_state) + f->release(); + else + d->filters->add(f); + } + } + else if (!_cups_strcasecmp(temp, "Finishing")) + { + // Get the finishing choice... + c = get_generic(fp, "Finishing", "OutputType", NULL); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the cupsFinishing option... + if ((o = d->find_option_group("cupsFinishing", &mg)) == NULL) + { + // Create the cupsFinishing option... + o = new ppdcOption(PPDC_PICKONE, "cupsFinishing", "Finishing", PPDC_SECTION_ANY, 10.0f); + g = general; + g->add_option(o); + } + else if (mg != general) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on " + "line %d of %s."), "cupsFinishing", fp->line, + fp->filename); + c->release(); + continue; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "Font") || + !_cups_strcasecmp(temp, "#font")) + { + ppdcFont *f; // Font + + + // Get a font... + f = get_font(fp); + if (f) + { + if (cond_state) + f->release(); + else + { + if (!_cups_strcasecmp(temp, "#font")) + base_fonts->add(f); + else + d->add_font(f); + + if (isdefault) + d->set_default_font(f); + } + } + } + else if (!_cups_strcasecmp(temp, "Group")) + { + // Get a group... + ppdcGroup *tempg = get_group(fp, d); + + if (!tempg) + break; + + if (cond_state) + { + if (!d->find_group(tempg->name->value)) + tempg->release(); + } + else + { + if (!d->find_group(tempg->name->value)) + d->add_group(tempg); + + g = tempg; + } + } + else if (!_cups_strcasecmp(temp, "HWMargins")) + { + // HWMargins left bottom right top + d->left_margin = get_measurement(fp); + d->bottom_margin = get_measurement(fp); + d->right_margin = get_measurement(fp); + d->top_margin = get_measurement(fp); + } + else if (!_cups_strcasecmp(temp, "InputSlot")) + { + // Get the input slot choice... + c = get_generic(fp, "InputSlot", NULL, "MediaPosition"); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the InputSlot option... + + if ((o = d->find_option_group("InputSlot", &mg)) == NULL) + { + // Create the InputSlot option... + o = new ppdcOption(PPDC_PICKONE, "InputSlot", "Media Source", + PPDC_SECTION_ANY, 10.0f); + g = general; + g->add_option(o); + } + else if (mg != general) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on " + "line %d of %s."), "InputSlot", fp->line, + fp->filename); + c->release(); + continue; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "Installable")) + { + // Get the installable option... + o = get_installable(fp); + + // Add it as needed... + if (o) + { + if (cond_state) + o->release(); + else + install->add_option(o); + + o = NULL; + } + } + else if (!_cups_strcasecmp(temp, "ManualCopies")) + { + // ManualCopies boolean + if (cond_state) + get_boolean(fp); + else + d->manual_copies = get_boolean(fp); + } + else if (!_cups_strcasecmp(temp, "Manufacturer")) + { + // Manufacturer name + char name[256]; // Model name string + + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after Manufacturer on line %d " + "of %s."), fp->line, fp->filename); + break; + } + + if (!cond_state) + d->set_manufacturer(name); + } + else if (!_cups_strcasecmp(temp, "MaxSize")) + { + // MaxSize width length + if (cond_state) + { + get_measurement(fp); + get_measurement(fp); + } + else + { + d->max_width = get_measurement(fp); + d->max_length = get_measurement(fp); + } + } + else if (!_cups_strcasecmp(temp, "MediaSize")) + { + // MediaSize keyword + char name[41]; // Media size name + ppdcMediaSize *m, // Matching media size... + *dm; // Driver media size... + + + if (get_token(fp, name, sizeof(name)) == NULL) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after MediaSize on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (cond_state) + continue; + + m = find_size(name); + + if (!m) + { + _cupsLangPrintf(stderr, + _("ppdc: Unknown media size \"%s\" on line %d of " + "%s."), name, fp->line, fp->filename); + break; + } + + // Add this size to the driver... + dm = new ppdcMediaSize(m->name->value, m->text->value, + m->width, m->length, d->left_margin, + d->bottom_margin, d->right_margin, + d->top_margin); + d->sizes->add(dm); + + if (isdefault) + d->set_default_size(dm); + } + else if (!_cups_strcasecmp(temp, "MediaType")) + { + // Get the media type choice... + c = get_generic(fp, "MediaType", "MediaType", "cupsMediaType"); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the MediaType option... + if ((o = d->find_option_group("MediaType", &mg)) == NULL) + { + // Create the MediaType option... + o = new ppdcOption(PPDC_PICKONE, "MediaType", "Media Type", + PPDC_SECTION_ANY, 10.0f); + g = general; + g->add_option(o); + } + else if (mg != general) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on " + "line %d of %s."), "MediaType", fp->line, + fp->filename); + c->release(); + continue; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "MinSize")) + { + // MinSize width length + if (cond_state) + { + get_measurement(fp); + get_measurement(fp); + } + else + { + d->min_width = get_measurement(fp); + d->min_length = get_measurement(fp); + } + } + else if (!_cups_strcasecmp(temp, "ModelName")) + { + // ModelName name + char name[256]; // Model name string + + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after ModelName on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (!cond_state) + d->set_model_name(name); + } + else if (!_cups_strcasecmp(temp, "ModelNumber")) + { + // ModelNumber number + if (cond_state) + get_integer(fp); + else + d->model_number = get_integer(fp); + } + else if (!_cups_strcasecmp(temp, "Option")) + { + // Get an option... + ppdcOption *tempo = get_option(fp, d, g); + + if (!tempo) + break; + + if (cond_state) + { + if (!g->find_option(tempo->name->value)) + tempo->release(); + } + else + { + if (!g->find_option(tempo->name->value)) + g->add_option(tempo); + + o = tempo; + } + } + else if (!_cups_strcasecmp(temp, "FileName")) + { + // FileName name + char name[256]; // Filename string + + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after FileName on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (!cond_state) + d->set_file_name(name); + } + else if (!_cups_strcasecmp(temp, "PCFileName")) + { + // PCFileName name + char name[256]; // PC filename string + + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected name after PCFileName on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (!cond_state) + d->set_pc_file_name(name); + } + else if (!_cups_strcasecmp(temp, "Resolution")) + { + // Get the resolution choice... + c = get_resolution(fp); + if (!c) + continue; + + if (cond_state) + { + c->release(); + continue; + } + + // Add the choice to the Resolution option... + if ((o = d->find_option_group("Resolution", &mg)) == NULL) + { + // Create the Resolution option... + o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY, + 10.0f); + g = general; + g->add_option(o); + } + else if (mg != general) + { + _cupsLangPrintf(stderr, + _("ppdc: Option %s defined in two different groups on " + "line %d of %s."), "Resolution", fp->line, + fp->filename); + c->release(); + continue; + } + + o->add_choice(c); + + if (isdefault) + o->set_defchoice(c); + + o = NULL; + } + else if (!_cups_strcasecmp(temp, "SimpleColorProfile")) + { + ppdcProfile *p; // Color profile + + + // Get the color profile... + p = get_simple_profile(fp); + + if (p) + { + if (cond_state) + p->release(); + else + d->profiles->add(p); + } + } + else if (!_cups_strcasecmp(temp, "Throughput")) + { + // Throughput number + if (cond_state) + get_integer(fp); + else + d->throughput = get_integer(fp); + } + else if (!_cups_strcasecmp(temp, "UIConstraints")) + { + ppdcConstraint *con; // Constraint + + + con = get_constraint(fp); + + if (con) + { + if (cond_state) + con->release(); + else + d->constraints->add(con); + } + } + else if (!_cups_strcasecmp(temp, "VariablePaperSize")) + { + // VariablePaperSize boolean + if (cond_state) + get_boolean(fp); + else + d->variable_paper_size = get_boolean(fp); + } + else if (!_cups_strcasecmp(temp, "Version")) + { + // Version string + char name[256]; // Model name string + + + if (!get_token(fp, name, sizeof(name))) + { + _cupsLangPrintf(stderr, + _("ppdc: Expected string after Version on line %d of " + "%s."), fp->line, fp->filename); + break; + } + + if (!cond_state) + d->set_version(name); + } + else + { + _cupsLangPrintf(stderr, + _("ppdc: Unknown token \"%s\" seen on line %d of %s."), + temp, fp->line, fp->filename); + break; + } + } + + // Done processing this block, is there anything to save? + if (!inc) + { + if (!d->pc_file_name || !d->model_name || !d->manufacturer || !d->version || + !d->sizes->count) + { + // Nothing to save... + d->release(); + } + else + { + // Got a driver, save it... + drivers->add(d); + } + } + else if (inc && td) + td->release(); +} + + +// +// 'ppdcSource::set_variable()' - Set a variable. +// + +ppdcVariable * // O - Variable +ppdcSource::set_variable( + const char *name, // I - Name + const char *value) // I - Value +{ + ppdcVariable *v; // Variable + + + // See if the variable exists already... + v = find_variable(name); + if (v) + { + // Change the variable value... + v->set_value(value); + } + else + { + // Create a new variable and add it... + v = new ppdcVariable(name, value); + vars->add(v); + } + + return (v); +} + + +// +// 'ppdcSource::write_file()' - Write the current source data to a file. +// + +int // O - 0 on success, -1 on error +ppdcSource::write_file(const char *f) // I - File to write +{ + cups_file_t *fp; // Output file + char bckname[1024]; // Backup file + ppdcDriver *d; // Current driver + ppdcString *st; // Current string + ppdcAttr *a; // Current attribute + ppdcConstraint *co; // Current constraint + ppdcFilter *fi; // Current filter + ppdcFont *fo; // Current font + ppdcGroup *g; // Current group + ppdcOption *o; // Current option + ppdcChoice *ch; // Current choice + ppdcProfile *p; // Current color profile + ppdcMediaSize *si; // Current media size + float left, // Current left margin + bottom, // Current bottom margin + right, // Current right margin + top; // Current top margin + int dtused[PPDC_DRIVER_MAX];// Driver type usage... + + + // Rename the current file, if any, to .bck... + snprintf(bckname, sizeof(bckname), "%s.bck", f); + rename(f, bckname); + + // Open the output file... + fp = cupsFileOpen(f, "w"); + + if (!fp) + { + // Can't create file; restore backup and return... + rename(bckname, f); + return (-1); + } + + cupsFilePuts(fp, "// CUPS PPD Compiler " CUPS_SVERSION "\n\n"); + + // Include standard files... + cupsFilePuts(fp, "// Include necessary files...\n"); + cupsFilePuts(fp, "#include \n"); + cupsFilePuts(fp, "#include \n"); + + memset(dtused, 0, sizeof(dtused)); + + for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next()) + if (d->type > PPDC_DRIVER_PS && !dtused[d->type]) + { + cupsFilePrintf(fp, "#include <%s.h>\n", driver_types[d->type]); + dtused[d->type] = 1; + } + + // Output each driver... + for (d = (ppdcDriver *)drivers->first(); d; d = (ppdcDriver *)drivers->next()) + { + // Start the driver... + cupsFilePrintf(fp, "\n// %s %s\n", d->manufacturer->value, + d->model_name->value); + cupsFilePuts(fp, "{\n"); + + // Write the copyright stings... + for (st = (ppdcString *)d->copyright->first(); + st; + st = (ppdcString *)d->copyright->next()) + quotef(fp, " Copyright \"%s\"\n", st->value); + + // Write other strings and values... + if (d->manufacturer && d->manufacturer->value) + quotef(fp, " Manufacturer \"%s\"\n", d->manufacturer->value); + if (d->model_name->value) + quotef(fp, " ModelName \"%s\"\n", d->model_name->value); + if (d->file_name && d->file_name->value) + quotef(fp, " FileName \"%s\"\n", d->file_name->value); + if (d->pc_file_name && d->pc_file_name->value) + quotef(fp, " PCFileName \"%s\"\n", d->pc_file_name->value); + if (d->version && d->version->value) + quotef(fp, " Version \"%s\"\n", d->version->value); + + cupsFilePrintf(fp, " DriverType %s\n", driver_types[d->type]); + + if (d->model_number) + { + switch (d->type) + { + case PPDC_DRIVER_ESCP : + cupsFilePuts(fp, " ModelNumber ("); + + if (d->model_number & ESCP_DOTMATRIX) + cupsFilePuts(fp, " $ESCP_DOTMATRIX"); + if (d->model_number & ESCP_MICROWEAVE) + cupsFilePuts(fp, " $ESCP_MICROWEAVE"); + if (d->model_number & ESCP_STAGGER) + cupsFilePuts(fp, " $ESCP_STAGGER"); + if (d->model_number & ESCP_ESCK) + cupsFilePuts(fp, " $ESCP_ESCK"); + if (d->model_number & ESCP_EXT_UNITS) + cupsFilePuts(fp, " $ESCP_EXT_UNITS"); + if (d->model_number & ESCP_EXT_MARGINS) + cupsFilePuts(fp, " $ESCP_EXT_MARGINS"); + if (d->model_number & ESCP_USB) + cupsFilePuts(fp, " $ESCP_USB"); + if (d->model_number & ESCP_PAGE_SIZE) + cupsFilePuts(fp, " $ESCP_PAGE_SIZE"); + if (d->model_number & ESCP_RASTER_ESCI) + cupsFilePuts(fp, " $ESCP_RASTER_ESCI"); + if (d->model_number & ESCP_REMOTE) + cupsFilePuts(fp, " $ESCP_REMOTE"); + + cupsFilePuts(fp, ")\n"); + break; + + case PPDC_DRIVER_PCL : + cupsFilePuts(fp, " ModelNumber ("); + + if (d->model_number & PCL_PAPER_SIZE) + cupsFilePuts(fp, " $PCL_PAPER_SIZE"); + if (d->model_number & PCL_INKJET) + cupsFilePuts(fp, " $PCL_INKJET"); + if (d->model_number & PCL_RASTER_END_COLOR) + cupsFilePuts(fp, " $PCL_RASTER_END_COLOR"); + if (d->model_number & PCL_RASTER_CID) + cupsFilePuts(fp, " $PCL_RASTER_CID"); + if (d->model_number & PCL_RASTER_CRD) + cupsFilePuts(fp, " $PCL_RASTER_CRD"); + if (d->model_number & PCL_RASTER_SIMPLE) + cupsFilePuts(fp, " $PCL_RASTER_SIMPLE"); + if (d->model_number & PCL_RASTER_RGB24) + cupsFilePuts(fp, " $PCL_RASTER_RGB24"); + if (d->model_number & PCL_PJL) + cupsFilePuts(fp, " $PCL_PJL"); + if (d->model_number & PCL_PJL_PAPERWIDTH) + cupsFilePuts(fp, " $PCL_PJL_PAPERWIDTH"); + if (d->model_number & PCL_PJL_HPGL2) + cupsFilePuts(fp, " $PCL_PJL_HPGL2"); + if (d->model_number & PCL_PJL_PCL3GUI) + cupsFilePuts(fp, " $PCL_PJL_PCL3GUI"); + if (d->model_number & PCL_PJL_RESOLUTION) + cupsFilePuts(fp, " $PCL_PJL_RESOLUTION"); + + cupsFilePuts(fp, ")\n"); + break; + + case PPDC_DRIVER_LABEL : + cupsFilePuts(fp, " ModelNumber "); + + switch (d->model_number) + { + case DYMO_3x0 : + cupsFilePuts(fp, "$DYMO_3x0\n"); + break; + + case ZEBRA_EPL_LINE : + cupsFilePuts(fp, "$ZEBRA_EPL_LINE\n"); + break; + + case ZEBRA_EPL_PAGE : + cupsFilePuts(fp, "$ZEBRA_EPL_PAGE\n"); + break; + + case ZEBRA_ZPL : + cupsFilePuts(fp, "$ZEBRA_ZPL\n"); + break; + + case ZEBRA_CPCL : + cupsFilePuts(fp, "$ZEBRA_CPCL\n"); + break; + + case INTELLITECH_PCL : + cupsFilePuts(fp, "$INTELLITECH_PCL\n"); + break; + + default : + cupsFilePrintf(fp, "%d\n", d->model_number); + break; + } + break; + + case PPDC_DRIVER_EPSON : + cupsFilePuts(fp, " ModelNumber "); + + switch (d->model_number) + { + case EPSON_9PIN : + cupsFilePuts(fp, "$EPSON_9PIN\n"); + break; + + case EPSON_24PIN : + cupsFilePuts(fp, "$EPSON_24PIN\n"); + break; + + case EPSON_COLOR : + cupsFilePuts(fp, "$EPSON_COLOR\n"); + break; + + case EPSON_PHOTO : + cupsFilePuts(fp, "$EPSON_PHOTO\n"); + break; + + case EPSON_ICOLOR : + cupsFilePuts(fp, "$EPSON_ICOLOR\n"); + break; + + case EPSON_IPHOTO : + cupsFilePuts(fp, "$EPSON_IPHOTO\n"); + break; + + default : + cupsFilePrintf(fp, "%d\n", d->model_number); + break; + } + break; + + case PPDC_DRIVER_HP : + cupsFilePuts(fp, " ModelNumber "); + switch (d->model_number) + { + case HP_LASERJET : + cupsFilePuts(fp, "$HP_LASERJET\n"); + break; + + case HP_DESKJET : + cupsFilePuts(fp, "$HP_DESKJET\n"); + break; + + case HP_DESKJET2 : + cupsFilePuts(fp, "$HP_DESKJET2\n"); + break; + + default : + cupsFilePrintf(fp, "%d\n", d->model_number); + break; + } + + cupsFilePuts(fp, ")\n"); + break; + + default : + cupsFilePrintf(fp, " ModelNumber %d\n", d->model_number); + break; + } + } + + if (d->manual_copies) + cupsFilePuts(fp, " ManualCopies Yes\n"); + + if (d->color_device) + cupsFilePuts(fp, " ColorDevice Yes\n"); + + if (d->throughput) + cupsFilePrintf(fp, " Throughput %d\n", d->throughput); + + // Output all of the attributes... + for (a = (ppdcAttr *)d->attrs->first(); + a; + a = (ppdcAttr *)d->attrs->next()) + if (a->text->value && a->text->value[0]) + quotef(fp, " Attribute \"%s\" \"%s/%s\" \"%s\"\n", + a->name->value, a->selector->value ? a->selector->value : "", + a->text->value, a->value->value ? a->value->value : ""); + else + quotef(fp, " Attribute \"%s\" \"%s\" \"%s\"\n", + a->name->value, a->selector->value ? a->selector->value : "", + a->value->value ? a->value->value : ""); + + // Output all of the constraints... + for (co = (ppdcConstraint *)d->constraints->first(); + co; + co = (ppdcConstraint *)d->constraints->next()) + { + if (co->option1->value[0] == '*') + cupsFilePrintf(fp, " UIConstraints \"%s %s", co->option1->value, + co->choice1->value ? co->choice1->value : ""); + else + cupsFilePrintf(fp, " UIConstraints \"*%s %s", co->option1->value, + co->choice1->value ? co->choice1->value : ""); + + if (co->option2->value[0] == '*') + cupsFilePrintf(fp, " %s %s\"\n", co->option2->value, + co->choice2->value ? co->choice2->value : ""); + else + cupsFilePrintf(fp, " *%s %s\"\n", co->option2->value, + co->choice2->value ? co->choice2->value : ""); + } + + // Output all of the filters... + for (fi = (ppdcFilter *)d->filters->first(); + fi; + fi = (ppdcFilter *)d->filters->next()) + cupsFilePrintf(fp, " Filter \"%s %d %s\"\n", + fi->mime_type->value, fi->cost, fi->program->value); + + // Output all of the fonts... + for (fo = (ppdcFont *)d->fonts->first(); + fo; + fo = (ppdcFont *)d->fonts->next()) + if (!strcmp(fo->name->value, "*")) + cupsFilePuts(fp, " Font *\n"); + else + cupsFilePrintf(fp, " Font \"%s\" \"%s\" \"%s\" \"%s\" %s\n", + fo->name->value, fo->encoding->value, + fo->version->value, fo->charset->value, + fo->status == PPDC_FONT_ROM ? "ROM" : "Disk"); + + // Output all options... + for (g = (ppdcGroup *)d->groups->first(); + g; + g = (ppdcGroup *)d->groups->next()) + { + if (g->options->count == 0) + continue; + + if (g->text->value && g->text->value[0]) + quotef(fp, " Group \"%s/%s\"\n", g->name->value, g->text->value); + else + cupsFilePrintf(fp, " Group \"%s\"\n", g->name->value); + + for (o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + { + if (o->choices->count == 0) + continue; + + if (o->text->value && o->text->value[0]) + quotef(fp, " Option \"%s/%s\"", o->name->value, o->text->value); + else + cupsFilePrintf(fp, " Option \"%s\"", o->name->value); + + cupsFilePrintf(fp, " %s %s %.1f\n", + o->type == PPDC_BOOLEAN ? "Boolean" : + o->type == PPDC_PICKONE ? "PickOne" : "PickMany", + o->section == PPDC_SECTION_ANY ? "AnySetup" : + o->section == PPDC_SECTION_DOCUMENT ? "DocumentSetup" : + o->section == PPDC_SECTION_EXIT ? "ExitServer" : + o->section == PPDC_SECTION_JCL ? "JCLSetup" : + o->section == PPDC_SECTION_PAGE ? "PageSetup" : + "Prolog", + o->order); + + for (ch = (ppdcChoice *)o->choices->first(); + ch; + ch = (ppdcChoice *)o->choices->next()) + { + if (ch->text->value && ch->text->value[0]) + quotef(fp, " %sChoice \"%s/%s\" \"%s\"\n", + o->defchoice == ch->name ? "*" : "", + ch->name->value, ch->text->value, + ch->code->value ? ch->code->value : ""); + else + quotef(fp, " %sChoice \"%s\" \"%s\"\n", + o->defchoice == ch->name ? "*" : "", + ch->name->value, + ch->code->value ? ch->code->value : ""); + } + } + } + + // Output all of the color profiles... + for (p = (ppdcProfile *)d->profiles->first(); + p; + p = (ppdcProfile *)d->profiles->next()) + cupsFilePrintf(fp, " ColorProfile \"%s/%s\" %.3f %.3f " + "%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f\n", + p->resolution->value, p->media_type->value, + p->density, p->gamma, + p->profile[0], p->profile[1], p->profile[2], + p->profile[3], p->profile[4], p->profile[5], + p->profile[6], p->profile[7], p->profile[8]); + + // Output all of the media sizes... + left = 0.0; + bottom = 0.0; + right = 0.0; + top = 0.0; + + for (si = (ppdcMediaSize *)d->sizes->first(); + si; + si = (ppdcMediaSize *)d->sizes->next()) + if (si->size_code->value && si->region_code->value) + { + // Output a custom media size... + quotef(fp, " %sCustomMedia \"%s/%s\" %.2f %.2f %.2f %.2f %.2f %.2f \"%s\" \"%s\"\n", + si->name == d->default_size ? "*" : "", si->name->value, + si->text->value, si->width, si->length, si->left, si->bottom, + si->right, si->top, si->size_code->value, + si->region_code->value); + } + else + { + // Output a standard media size... + if (fabs(left - si->left) > 0.1 || + fabs(bottom - si->bottom) > 0.1 || + fabs(right - si->right) > 0.1 || + fabs(top - si->top) > 0.1) + { + cupsFilePrintf(fp, " HWMargins %.2f %.2f %.2f %.2f\n", + si->left, si->bottom, si->right, si->top); + + left = si->left; + bottom = si->bottom; + right = si->right; + top = si->top; + } + + cupsFilePrintf(fp, " %sMediaSize %s\n", + si->name == d->default_size ? "*" : "", + si->name->value); + } + + if (d->variable_paper_size) + { + cupsFilePuts(fp, " VariablePaperSize Yes\n"); + + if (fabs(left - d->left_margin) > 0.1 || + fabs(bottom - d->bottom_margin) > 0.1 || + fabs(right - d->right_margin) > 0.1 || + fabs(top - d->top_margin) > 0.1) + { + cupsFilePrintf(fp, " HWMargins %.2f %.2f %.2f %.2f\n", + d->left_margin, d->bottom_margin, d->right_margin, + d->top_margin); + } + + cupsFilePrintf(fp, " MinSize %.2f %.2f\n", d->min_width, d->min_length); + cupsFilePrintf(fp, " MaxSize %.2f %.2f\n", d->max_width, d->max_length); + } + + // End the driver... + cupsFilePuts(fp, "}\n"); + } + + // Close the file and return... + cupsFileClose(fp); + + return (0); +} + + +// +// End of "$Id: ppdc-source.cxx 10379 2012-03-23 22:16:22Z mike $". +// diff --git a/ppdc/ppdc-string.cxx b/ppdc/ppdc-string.cxx new file mode 100644 index 0000000..6f8ef1f --- /dev/null +++ b/ppdc/ppdc-string.cxx @@ -0,0 +1,62 @@ +// +// "$Id: ppdc-string.cxx 8698 2009-06-05 20:49:06Z mike $" +// +// Shared string class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcString::ppdcString() - Create a shared string. +// ppdcString::~ppdcString() - Destroy a shared string. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcString::ppdcString()' - Create a shared string. +// + +ppdcString::ppdcString(const char *v) // I - String + : ppdcShared() +{ + PPDC_NEWVAL(v); + + if (v) + { + value = new char[strlen(v) + 1]; + strcpy(value, v); + } + else + value = 0; +} + + +// +// 'ppdcString::~ppdcString()' - Destroy a shared string. +// + +ppdcString::~ppdcString() +{ + PPDC_DELETEVAL(value); + + if (value) + delete[] value; +} + + +// +// End of "$Id: ppdc-string.cxx 8698 2009-06-05 20:49:06Z mike $". +// diff --git a/ppdc/ppdc-variable.cxx b/ppdc/ppdc-variable.cxx new file mode 100644 index 0000000..c8ecd3b --- /dev/null +++ b/ppdc/ppdc-variable.cxx @@ -0,0 +1,71 @@ +// +// "$Id: ppdc-variable.cxx 8484 2009-04-03 17:35:17Z mike $" +// +// Variable class for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// ppdcVariable::ppdcVariable() - Create a variable. +// ppdcVariable::~ppdcVariable() - Destroy a variable. +// ppdcVariable::set_value() - Set the value of a variable. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'ppdcVariable::ppdcVariable()' - Create a variable. +// + +ppdcVariable::ppdcVariable(const char *n, // I - Name of variable + const char *v) // I - Value of variable + : ppdcShared() +{ + PPDC_NEW; + + name = new ppdcString(n); + value = new ppdcString(v); +} + + +// +// 'ppdcVariable::~ppdcVariable()' - Destroy a variable. +// + +ppdcVariable::~ppdcVariable() +{ + PPDC_DELETE; + + name->release(); + value->release(); +} + + +// +// 'ppdcVariable::set_value()' - Set the value of a variable. +// + +void +ppdcVariable::set_value(const char *v) +{ + value->release(); + value = new ppdcString(v); +} + + +// +// End of "$Id: ppdc-variable.cxx 8484 2009-04-03 17:35:17Z mike $". +// diff --git a/ppdc/ppdc.cxx b/ppdc/ppdc.cxx new file mode 100644 index 0000000..da643f8 --- /dev/null +++ b/ppdc/ppdc.cxx @@ -0,0 +1,469 @@ +// +// "$Id: ppdc.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// PPD file compiler main entry for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2007 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Main entry for the PPD compiler. +// usage() - Show usage and exit. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include +#include +#include + + +// +// Local functions... +// + +static void usage(void); + + +// +// 'main()' - Main entry for the PPD compiler. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i, j; // Looping vars + ppdcCatalog *catalog; // Message catalog + const char *outdir; // Output directory + ppdcSource *src; // PPD source file data + ppdcDriver *d; // Current driver + cups_file_t *fp; // PPD file + char *opt, // Current option + *value, // Value in option + *outname, // Output filename + make_model[1024], + // Make and model + pcfilename[1024], + // Lowercase pcfilename + filename[1024]; // PPD filename + int comp, // Compress + do_test, // Test PPD files + single_language,// Generate single-language files + use_model_name, // Use ModelName for filename + verbose; // Verbosity + ppdcLineEnding le; // Line ending to use + ppdcArray *locales; // List of locales + cups_array_t *filenames; // List of generated filenames + + + _cupsSetLocale(argv); + + // Scan the command-line... + catalog = NULL; + comp = 0; + do_test = 0; + le = PPDC_LFONLY; + locales = NULL; + outdir = "ppd"; + single_language = 0; + src = new ppdcSource(); + use_model_name = 0; + verbose = 0; + filenames = cupsArrayNew((cups_array_func_t)_cups_strcasecmp, NULL); + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'D' : // Define variable + i ++; + if (i >= argc) + usage(); + + if ((value = strchr(argv[i], '=')) != NULL) + { + *value++ = '\0'; + + src->set_variable(argv[i], value); + } + else + src->set_variable(argv[i], "1"); + break; + + case 'I' : // Include directory... + i ++; + if (i >= argc) + usage(); + + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Adding include directory \"%s\"."), + argv[i]); + + ppdcSource::add_include(argv[i]); + break; + + case 'c' : // Message catalog... + i ++; + if (i >= argc) + usage(); + + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Loading messages from \"%s\"."), + argv[i]); + + if (!catalog) + catalog = new ppdcCatalog("en"); + + if (catalog->load_messages(argv[i])) + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to load localization file " + "\"%s\" - %s"), argv[i], strerror(errno)); + return (1); + } + break; + + case 'd' : // Output directory... + i ++; + if (i >= argc) + usage(); + + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Writing PPD files to directory " + "\"%s\"."), argv[i]); + + outdir = argv[i]; + break; + + case 'l' : // Language(s)... + i ++; + if (i >= argc) + usage(); + + if (strchr(argv[i], ',')) + { + // Comma-delimited list of languages... + char temp[1024], // Copy of language list + *start, // Start of current locale name + *end; // End of current locale name + + + locales = new ppdcArray(); + + strlcpy(temp, argv[i], sizeof(temp)); + for (start = temp; *start; start = end) + { + if ((end = strchr(start, ',')) != NULL) + *end++ = '\0'; + else + end = start + strlen(start); + + if (end > start) + locales->add(new ppdcString(start)); + } + } + else + { + single_language = 1; + + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Loading messages for locale " + "\"%s\"."), argv[i]); + + if (catalog) + catalog->release(); + + catalog = new ppdcCatalog(argv[i]); + + if (catalog->messages->count == 0) + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to find localization for " + "\"%s\" - %s"), argv[i], strerror(errno)); + return (1); + } + } + break; + + case 'm' : // Use ModelName for filename + use_model_name = 1; + break; + + case 't' : // Test PPDs instead of generating them + do_test = 1; + break; + + case 'v' : // Be verbose... + verbose ++; + break; + + case 'z' : // Compress files... + comp = 1; + break; + + case '-' : // --option + if (!strcmp(opt, "-lf")) + { + le = PPDC_LFONLY; + opt += strlen(opt) - 1; + break; + } + else if (!strcmp(opt, "-cr")) + { + le = PPDC_CRONLY; + opt += strlen(opt) - 1; + break; + } + else if (!strcmp(opt, "-crlf")) + { + le = PPDC_CRLF; + opt += strlen(opt) - 1; + break; + } + + default : // Unknown + usage(); + break; + } + } + else + { + // Open and load the driver info file... + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Loading driver information file \"%s\"."), + argv[i]); + + src->read_file(argv[i]); + } + + + if (src->drivers->count > 0) + { + // Create the output directory... + if (mkdir(outdir, 0777)) + { + if (errno != EEXIST) + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to create output directory %s: %s"), + outdir, strerror(errno)); + return (1); + } + } + + // Write PPD files... + for (d = (ppdcDriver *)src->drivers->first(); + d; + d = (ppdcDriver *)src->drivers->next()) + { + if (do_test) + { + // Test the PPD file for this driver... + int pid, // Process ID + fds[2]; // Pipe file descriptors + + + if (pipe(fds)) + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to create output pipes: %s"), + strerror(errno)); + return (1); + } + + if ((pid = fork()) == 0) + { + // Child process comes here... + dup2(fds[0], 0); + + close(fds[0]); + close(fds[1]); + + execlp("cupstestppd", "cupstestppd", "-", (char *)0); + + _cupsLangPrintf(stderr, + _("ppdc: Unable to execute cupstestppd: %s"), + strerror(errno)); + return (errno); + } + else if (pid < 0) + { + _cupsLangPrintf(stderr, _("ppdc: Unable to execute cupstestppd: %s"), + strerror(errno)); + return (errno); + } + + close(fds[0]); + fp = cupsFileOpenFd(fds[1], "w"); + } + else + { + // Write the PPD file for this driver... + if (use_model_name) + { + if (!_cups_strncasecmp(d->model_name->value, d->manufacturer->value, + strlen(d->manufacturer->value))) + { + // Model name already starts with the manufacturer... + outname = d->model_name->value; + } + else + { + // Add manufacturer to the front of the model name... + snprintf(make_model, sizeof(make_model), "%s %s", + d->manufacturer->value, d->model_name->value); + outname = make_model; + } + } + else if (d->file_name) + outname = d->file_name->value; + else + outname = d->pc_file_name->value; + + if (strstr(outname, ".PPD")) + { + // Convert PCFileName to lowercase... + for (j = 0; + outname[j] && j < (int)(sizeof(pcfilename) - 1); + j ++) + pcfilename[j] = tolower(outname[j] & 255); + + pcfilename[j] = '\0'; + } + else + { + // Leave PCFileName as-is... + strlcpy(pcfilename, outname, sizeof(pcfilename)); + } + + // Open the PPD file for writing... + if (comp) + snprintf(filename, sizeof(filename), "%s/%s.gz", outdir, pcfilename); + else + snprintf(filename, sizeof(filename), "%s/%s", outdir, pcfilename); + + if (cupsArrayFind(filenames, filename)) + _cupsLangPrintf(stderr, + _("ppdc: Warning - overlapping filename \"%s\"."), + filename); + else + cupsArrayAdd(filenames, strdup(filename)); + + fp = cupsFileOpen(filename, comp ? "w9" : "w"); + if (!fp) + { + _cupsLangPrintf(stderr, + _("ppdc: Unable to create PPD file \"%s\" - %s."), + filename, strerror(errno)); + return (1); + } + + if (verbose) + _cupsLangPrintf(stdout, _("ppdc: Writing %s."), filename); + } + + /* + * Write the PPD file... + */ + + ppdcArray *templocales = locales; + + if (!templocales && !single_language) + { + templocales = new ppdcArray(); + for (ppdcCatalog *tempcatalog = (ppdcCatalog *)src->po_files->first(); + tempcatalog; + tempcatalog = (ppdcCatalog *)src->po_files->next()) + { + tempcatalog->locale->retain(); + templocales->add(tempcatalog->locale); + } + } + + if (d->write_ppd_file(fp, catalog, templocales, src, le)) + { + cupsFileClose(fp); + return (1); + } + + if (templocales != locales) + templocales->release(); + + cupsFileClose(fp); + } + } + else + usage(); + + // Delete the printer driver information... + src->release(); + + // Message catalog... + if (catalog) + catalog->release(); + + // Return with no errors. + return (0); +} + + +// +// 'usage()' - Show usage and exit. +// + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: ppdc [options] filename.drv [ ... " + "filenameN.drv ]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -D name=value Set named variable to " + "value.")); + _cupsLangPuts(stdout, _(" -I include-dir Add include directory to " + "search path.")); + _cupsLangPuts(stdout, _(" -c catalog.po Load the specified " + "message catalog.")); + _cupsLangPuts(stdout, _(" -d output-dir Specify the output " + "directory.")); + _cupsLangPuts(stdout, _(" -l lang[,lang,...] Specify the output " + "language(s) (locale).")); + _cupsLangPuts(stdout, _(" -m Use the ModelName value " + "as the filename.")); + _cupsLangPuts(stdout, _(" -t Test PPDs instead of " + "generating them.")); + _cupsLangPuts(stdout, _(" -v Be verbose (more v's for " + "more verbosity).")); + _cupsLangPuts(stdout, _(" -z Compress PPD files using " + "GNU zip.")); + _cupsLangPuts(stdout, _(" --cr End lines with CR (Mac " + "OS 9).")); + _cupsLangPuts(stdout, _(" --crlf End lines with CR + LF " + "(Windows).")); + _cupsLangPuts(stdout, _(" --lf End lines with LF " + "(UNIX/Linux/Mac OS X).")); + + exit(1); +} + + +// +// End of "$Id: ppdc.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdc.h b/ppdc/ppdc.h new file mode 100644 index 0000000..121274a --- /dev/null +++ b/ppdc/ppdc.h @@ -0,0 +1,533 @@ +// +// "$Id: ppdc.h 10338 2012-03-07 06:05:39Z mike $" +// +// Definitions for the CUPS PPD Compiler. +// +// Copyright 2007-2009 by Apple Inc. +// Copyright 2002-2007 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// + +#ifndef _PPDC_H_ +# define _PPDC_H_ + +// +// Include necessary headers... +// + +# include +# include + + +// +// Macros... +// + +# define PPDC_NAME(s) const char *class_name() { return (s); } + + +// +// Enumerations... +// + +enum ppdcDrvType //// Driver type +{ + PPDC_DRIVER_CUSTOM, // Custom driver + PPDC_DRIVER_PS, // PostScript driver + PPDC_DRIVER_ESCP, // rastertoescpx driver + PPDC_DRIVER_PCL, // rastertopclx driver + PPDC_DRIVER_LABEL, // rastertolabel/rastertodymo driver + PPDC_DRIVER_EPSON, // rastertoepson driver + PPDC_DRIVER_HP, // rastertohp driver + PPDC_DRIVER_MAX // Number of driver types defined +}; + +enum ppdcFontStatus //// Load status of font +{ + PPDC_FONT_ROM, // Font is in ROM + PPDC_FONT_DISK // Font is on disk +}; + +enum ppdcOptSection //// Option section +{ + PPDC_SECTION_ANY, // AnySetup + PPDC_SECTION_DOCUMENT, // DocumentSetup + PPDC_SECTION_EXIT, // ExitServer + PPDC_SECTION_JCL, // JCLSetup + PPDC_SECTION_PAGE, // PageSetup + PPDC_SECTION_PROLOG // Prolog +}; + +enum ppdcOptType //// Option type +{ + PPDC_BOOLEAN, // True/false option + PPDC_PICKONE, // Single choice from list + PPDC_PICKMANY // Multiple choices from list +}; + +enum ppdcLineEnding //// Line endings +{ + PPDC_LFONLY, // LF only + PPDC_CRONLY, // CR only + PPDC_CRLF // CR + LF +}; + +enum ppdcCondFlags //// Condition flags +{ + PPDC_COND_NORMAL = 0, // Normal state + PPDC_COND_SKIP = 1, // Skip state + PPDC_COND_SATISFIED = 2 // At least one condition satisfied +}; + + +// +// Printer description data... +// + +class ppdcShared //// Shared Data Value +{ + private: + + int use; // Use count (delete when 0) + + public: + + ppdcShared(); + virtual ~ppdcShared(); + + virtual const char *class_name() = 0; + + void retain(); + void release(); +}; + +class ppdcArray //// Shared Array + : public ppdcShared +{ + public: + + int count, // Number of elements + alloc, // Allocated elements + current; // Current element + ppdcShared **data; // Elements + + ppdcArray(ppdcArray *a = 0); + ~ppdcArray(); + + PPDC_NAME("ppdcArray") + + void add(ppdcShared *d); + ppdcShared *first(); + ppdcShared *next(); + void remove(ppdcShared *d); +}; + +class ppdcString //// Shared String + : public ppdcShared +{ + public: + + char *value; // String value + + ppdcString(const char *v); + ~ppdcString(); + + PPDC_NAME("ppdcString") +}; + +class ppdcInteger //// Shared integer + : public ppdcShared +{ + public: + + int *value; // Integer value + + ppdcInteger(int *v) { value = v; } + + PPDC_NAME("ppdcInteger") +}; + +class ppdcMessage //// Translation message + : public ppdcShared +{ + public: + + ppdcString *id, // Translation ID + *string; // Translation string + + ppdcMessage(const char *i, const char *s); + ~ppdcMessage(); + + PPDC_NAME("ppdcMessage") +}; + +class ppdcCatalog //// Translation catalog + : public ppdcShared +{ + public: + + ppdcString *locale; // Name of locale + ppdcString *filename; // Name of translation file + ppdcArray *messages; // Array of translation messages + + ppdcCatalog(const char *l, const char *f = 0); + ~ppdcCatalog(); + + PPDC_NAME("ppdcCatalog") + + void add_message(const char *id, const char *string = NULL); + const char *find_message(const char *id); + int load_messages(const char *f); + int save_messages(const char *f); +}; + +class ppdcAttr //// Attribute + : public ppdcShared +{ + public: + + ppdcString *name, // Name of attribute + *selector, // Selector string + *text, // Text string + *value; // Value string + bool localizable; // Should this attribute be localized? + + ppdcAttr(const char *n, const char *s, const char *t, const char *v, + bool loc = false); + ~ppdcAttr(); + + PPDC_NAME("ppdcAttr") +}; + +class ppdcFont //// Shared Font + : public ppdcShared +{ + public: + + ppdcString *name, // Font name + *encoding, // Font base encoding + *version, // Font version + *charset; // Font charset + ppdcFontStatus status; // Font status (ROM or Disk) + + ppdcFont(const char *n, const char *e, const char *v, const char *c, + ppdcFontStatus s); + ~ppdcFont(); + + PPDC_NAME("ppdcFont") +}; + +class ppdcChoice //// Option Choice + : public ppdcShared +{ + public: + + ppdcString *name, // Name of choice + *text, // Human-readable text of choice + *code; // PS code of choice + + ppdcChoice(const char *n, const char *t, const char *c); + ~ppdcChoice(); + + PPDC_NAME("ppdcChoice") +}; + +class ppdcOption //// Option + : public ppdcShared +{ + public: + + ppdcOptType type; // Type of option + ppdcString *name, // Name of option + *text; // Human-readable text of option + ppdcOptSection section; // Section for option code + float order; // Order number + ppdcArray *choices; // Choices + ppdcString *defchoice; // Default choice + + ppdcOption(ppdcOptType ot, const char *n, const char *t, ppdcOptSection s, + float o); + ppdcOption(ppdcOption *o); + ~ppdcOption(); + + PPDC_NAME("ppdcOption") + + void add_choice(ppdcChoice *c) { choices->add(c); } + ppdcChoice *find_choice(const char *n); + void set_defchoice(ppdcChoice *c); +}; + +class ppdcGroup //// Group of Options + : public ppdcShared +{ + public: + + ppdcString *name, // Name of option + *text; // Human-readable text of option + ppdcArray *options; // Options + + ppdcGroup(const char *n, const char *t); + ppdcGroup(ppdcGroup *g); + ~ppdcGroup(); + + PPDC_NAME("ppdcGroup") + + void add_option(ppdcOption *o) { options->add(o); } + ppdcOption *find_option(const char *n); +}; + +class ppdcConstraint //// Constraint + : public ppdcShared +{ + public: + + ppdcString *option1, // First option + *choice1, // First choice + *option2, // Second option + *choice2; // Second choice + + ppdcConstraint(const char *o1, const char *c1, const char *o2, + const char *c2); + ~ppdcConstraint(); + + PPDC_NAME("ppdcConstraint") +}; + +class ppdcFilter //// Filter Program + : public ppdcShared +{ + public: + + ppdcString *mime_type, // MIME type + *program; // Filter program + int cost; // Relative cost of filter + + ppdcFilter(const char *t, const char *p, int c); + ~ppdcFilter(); + + PPDC_NAME("ppdcFilter") +}; + +class ppdcMediaSize //// Media Size + : public ppdcShared +{ + public: + + ppdcString *name, // Name of size + *text; // Human-readable text + float width, // Width in points + length, // Length in points + left, // Left limit in points + bottom, // Bottom limit in points + right, // Right limit in points + top; // Top limit in points + ppdcString *size_code, // PageSize code, if any + *region_code; // PageRegion code, if any + + ppdcMediaSize(const char *n, const char *t, float w, float l, + float lm, float bm, float rm, float tm, + const char *sc = 0, const char *rc = 0); + ~ppdcMediaSize(); + + PPDC_NAME("ppdcMediaSize") +}; + +class ppdcProfile //// Color Profile + : public ppdcShared +{ + public: + + ppdcString *resolution, // Resolution name + *media_type; // Media type name + float density, // Color profile density + gamma, // Color profile gamma + profile[9]; // Color profile matrix + + ppdcProfile(const char *r, const char *m, float d, float g, const float *p); + ~ppdcProfile(); + + PPDC_NAME("ppdcProfile") +}; + +class ppdcSource; + +class ppdcDriver //// Printer Driver Data + : public ppdcShared +{ + public: + + ppdcDrvType type; // Driver type + ppdcArray *copyright; // Copyright strings + ppdcString *manufacturer, // Manufacturer + *model_name, // Name of printer model + *file_name, // Output filename for PPD + *pc_file_name, // 8 character PC filename for PPD + *version; // Version number + int model_number, // Model number for driver + manual_copies, // Do manual copies? + color_device, // Support color? + throughput; // Throughput in pages per minute + ppdcArray *attrs, // Attributes + *constraints, // Constraints + *filters, // Filters + *fonts, // Fonts + *groups, // Option groups + *profiles, // Color profiles + *sizes; // Fixed sizes + ppdcString *default_font, // Default font + *default_size; // Default size option + int variable_paper_size; // Support variable sizes? + ppdcString *custom_size_code; // Custom page size code, if any + float left_margin, // Margins for device in points + bottom_margin, + right_margin, + top_margin, + max_width, // Maximum width (points) + max_length, // Maximum length (points) + min_width, // Minimum width (points) + min_length; // Minimum length (points) + + ppdcDriver(ppdcDriver *d = 0); + ~ppdcDriver(); + + PPDC_NAME("ppdcDriver") + + void add_attr(ppdcAttr *a) { attrs->add(a); } + void add_constraint(ppdcConstraint *c) { constraints->add(c); } + void add_copyright(const char *c) { + copyright->add(new ppdcString(c)); + } + void add_filter(ppdcFilter *f) { filters->add(f); } + void add_font(ppdcFont *f) { fonts->add(f); } + void add_group(ppdcGroup *g) { groups->add(g); } + void add_profile(ppdcProfile *p) { profiles->add(p); } + void add_size(ppdcMediaSize *m) { sizes->add(m); } + + ppdcAttr *find_attr(const char *k, const char *s); + ppdcGroup *find_group(const char *n); + ppdcOption *find_option(const char *n); + ppdcOption *find_option_group(const char *n, ppdcGroup **mg); + + void set_custom_size_code(const char *c); + void set_default_font(ppdcFont *f); + void set_default_size(ppdcMediaSize *m); + void set_file_name(const char *f); + void set_manufacturer(const char *m); + void set_model_name(const char *m); + void set_pc_file_name(const char *f); + void set_version(const char *v); + + int write_ppd_file(cups_file_t *fp, ppdcCatalog *catalog, + ppdcArray *locales, ppdcSource *src, + ppdcLineEnding le); +}; + +class ppdcVariable //// Variable Definition + : public ppdcShared +{ + public: + + ppdcString *name, // Name of variable + *value; // Value of variable + + ppdcVariable(const char *n, const char *v); + ~ppdcVariable(); + + PPDC_NAME("ppdcVariable") + + void set_value(const char *v); +}; + +class ppdcFile //// File +{ + public: + + bool close_on_delete; // Close file on delete? + cups_file_t *fp; // File pointer + const char *filename; // Filename + int line; // Line in file + + ppdcFile(const char *f, cups_file_t *ffp = (cups_file_t *)0); + ~ppdcFile(); + + int get(); + int peek(); +}; + +class ppdcSource //// Source File + : public ppdcShared +{ + public: + + static ppdcArray *includes; // Include directories + static const char *driver_types[]; // Driver types + + ppdcString *filename; // Filename + ppdcArray *base_fonts, // Base fonts + *drivers, // Printer drivers + *po_files, // Message catalogs + *sizes, // Predefined media sizes + *vars; // Defined variables + int cond_state, // Cummulative conditional state + *cond_current, // Current #if state + cond_stack[101]; // #if state stack + + + ppdcSource(const char *f = 0, cups_file_t *ffp = (cups_file_t *)0); + ~ppdcSource(); + + PPDC_NAME("ppdcSource") + + static void add_include(const char *d); + ppdcDriver *find_driver(const char *f); + static char *find_include(const char *f, const char *base, char *n, + int nlen); + ppdcCatalog *find_po(const char *l); + ppdcMediaSize *find_size(const char *s); + ppdcVariable *find_variable(const char *n); + ppdcAttr *get_attr(ppdcFile *fp, bool loc = false); + int get_boolean(ppdcFile *fp); + ppdcChoice *get_choice(ppdcFile *fp); + ppdcChoice *get_color_model(ppdcFile *fp); + int get_color_order(const char *co); + ppdcProfile *get_color_profile(ppdcFile *fp); + int get_color_space(const char *cs); + ppdcConstraint *get_constraint(ppdcFile *fp); + ppdcMediaSize *get_custom_size(ppdcFile *fp); + void get_duplex(ppdcFile *fp, ppdcDriver *d); + ppdcFilter *get_filter(ppdcFile *fp); + float get_float(ppdcFile *fp); + ppdcFont *get_font(ppdcFile *fp); + ppdcChoice *get_generic(ppdcFile *fp, const char *keyword, + const char *tattr, const char *nattr); + ppdcGroup *get_group(ppdcFile *fp, ppdcDriver *d); + ppdcOption *get_installable(ppdcFile *fp); + int get_integer(const char *v); + int get_integer(ppdcFile *fp); + float get_measurement(ppdcFile *fp); + ppdcOption *get_option(ppdcFile *fp, ppdcDriver *d, ppdcGroup *g); + ppdcCatalog *get_po(ppdcFile *fp); + ppdcChoice *get_resolution(ppdcFile *fp); + ppdcProfile *get_simple_profile(ppdcFile *fp); + ppdcMediaSize *get_size(ppdcFile *fp); + char *get_token(ppdcFile *fp, char *buffer, int buflen); + ppdcVariable *get_variable(ppdcFile *fp); + int import_ppd(const char *f); + int quotef(cups_file_t *fp, const char *format, ...); + void read_file(const char *f, cups_file_t *ffp = (cups_file_t *)0); + void scan_file(ppdcFile *fp, ppdcDriver *td = 0, bool inc = false); + ppdcVariable *set_variable(const char *name, const char *value); + int write_file(const char *f); +}; + + +#endif // !_PPDC_H_ + +// +// End of "$Id: ppdc.h 10338 2012-03-07 06:05:39Z mike $". +// diff --git a/ppdc/ppdhtml.cxx b/ppdc/ppdhtml.cxx new file mode 100644 index 0000000..05ddc41 --- /dev/null +++ b/ppdc/ppdhtml.cxx @@ -0,0 +1,186 @@ +// +// "$Id: ppdhtml.cxx 9636 2011-03-21 22:02:00Z mike $" +// +// PPD to HTML utility for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Main entry for the PPD to HTML utility. +// usage() - Show usage and exit. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include +#include + + +// +// Local functions... +// + +static void usage(void); + + +// +// 'main()' - Main entry for the PPD compiler. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i; // Looping var + ppdcSource *src; // PPD source file data + ppdcDriver *d; // Current driver + ppdcGroup *g, // Current group + *composite; // Composite of all drivers + ppdcOption *o, // Current option + *compo; // Composite option + ppdcChoice *c; // Current choice + char *opt; // Current option char + ppdcMediaSize *size; // Current media size + char *value; // Value in option + + + _cupsSetLocale(argv); + + // Scan the command-line... + src = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'D' : // Define variable + i ++; + if (i >= argc) + usage(); + + if ((value = strchr(argv[i], '=')) != NULL) + { + *value++ = '\0'; + + src->set_variable(argv[i], value); + } + else + src->set_variable(argv[i], "1"); + break; + + case 'I' : // Include directory... + i ++; + if (i >= argc) + usage(); + + ppdcSource::add_include(argv[i]); + break; + + default : // Unknown + usage(); + break; + } + } + else + { + // Open and load the driver info file... + src = new ppdcSource(argv[i]); + + // Create a composite group with all of the features from the + // drivers in the info file... + composite = new ppdcGroup("", ""); + + for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next()) + for (g = (ppdcGroup *)d->groups->first(); g; g = (ppdcGroup *)d->groups->next()) + for (o = (ppdcOption *)g->options->first(); o; o = (ppdcOption *)g->options->next()) + { + if ((compo = composite->find_option(o->name->value)) == NULL) + composite->add_option(new ppdcOption(o)); + } + + puts(""); + printf("Driver Summary for %s\n", argv[i]); + printf("

Driver Summary for %s

\n", argv[i]); + printf("

"); + for (compo = (ppdcOption *)composite->options->first(); compo; compo = (ppdcOption *)composite->options->next()) + printf("", compo->text->value); + puts(""); + + // Write HTML summary... + for (d = (ppdcDriver *)src->drivers->first(); d; d = (ppdcDriver *)src->drivers->next()) + { + // Write the summary for this driver... + printf(""); + + for (compo = (ppdcOption *)composite->options->first(); compo; + compo = (ppdcOption *)composite->options->next()) + if ((o = d->find_option(compo->name->value)) != NULL) + { + printf(""); + } + else + printf(""); + + puts(""); + } + + puts("
PrinterMedia Size%s
%s", d->model_name->value); + for (size = (ppdcMediaSize *)d->sizes->first(); size; + size = (ppdcMediaSize *)d->sizes->next()) + printf("%s
", size->text->value); + printf("
"); + for (c = (ppdcChoice *)o->choices->first(); c; + c = (ppdcChoice *)o->choices->next()) + printf("%s
", c->text->value); + printf("
N/A

"); + puts(""); + puts(""); + // Delete the printer driver information... + composite->release(); + src->release(); + } + + // If no drivers have been loaded, display the program usage message. + if (!src) + usage(); + + // Return with no errors. + return (0); +} + + +// +// 'usage()' - Show usage and exit. +// + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: ppdhtml [options] filename.drv " + ">filename.html")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -D name=value Set named variable to " + "value.")); + _cupsLangPuts(stdout, _(" -I include-dir Add include directory " + "to search path.")); + + exit(1); +} + + +// +// End of "$Id: ppdhtml.cxx 9636 2011-03-21 22:02:00Z mike $". +// diff --git a/ppdc/ppdi.cxx b/ppdc/ppdi.cxx new file mode 100644 index 0000000..7ca202d --- /dev/null +++ b/ppdc/ppdi.cxx @@ -0,0 +1,142 @@ +// +// "$Id: ppdi.cxx 9636 2011-03-21 22:02:00Z mike $" +// +// PPD file import utility for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Main entry for the PPD import utility. +// usage() - Show usage and exit. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include +#include +#include + + +// +// Local functions... +// + +static void usage(void); + + +// +// 'main()' - Main entry for the PPD import utility. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i; // Looping var + char *opt; // Current option + const char *srcfile; // Output file + ppdcSource *src; // PPD source file data + + + _cupsSetLocale(argv); + + // Scan the command-line... + srcfile = NULL; + src = NULL; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'o' : // Output file + if (srcfile || src) + usage(); + + i ++; + if (i >= argc) + usage(); + + srcfile = argv[i]; + break; + + case 'I' : // Include dir + i ++; + if (i >= argc) + usage(); + + ppdcSource::add_include(argv[i]); + break; + + default : // Unknown + usage(); + break; + } + } + else + { + // Open and load the driver info file... + if (!srcfile) + srcfile = "ppdi.drv"; + + if (!src) + { + if (access(srcfile, 0)) + src = new ppdcSource(); + else + src = new ppdcSource(srcfile); + } + + // Import the PPD file... + src->import_ppd(argv[i]); + } + + // If no drivers have been loaded, display the program usage message. + if (!src) + usage(); + + // Write the driver info file back to disk... + src->write_file(srcfile); + + // Delete the printer driver information... + src->release(); + + // Return with no errors. + return (0); +} + + +// +// 'usage()' - Show usage and exit. +// + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: ppdi [options] filename.ppd [ ... " + "filenameN.ppd ]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -I include-dir Add include directory to " + "search path.")); + _cupsLangPuts(stdout, _(" -o filename.drv Set driver information " + "file (otherwise ppdi.drv).")); + + exit(1); +} + + +// +// End of "$Id: ppdi.cxx 9636 2011-03-21 22:02:00Z mike $". +// diff --git a/ppdc/ppdmerge.cxx b/ppdc/ppdmerge.cxx new file mode 100644 index 0000000..c2126a5 --- /dev/null +++ b/ppdc/ppdmerge.cxx @@ -0,0 +1,379 @@ +// +// "$Id: ppdmerge.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// PPD file merge utility for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2007 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Main entry for the PPD merge utility. +// ppd_locale() - Return the locale associated with a PPD file. +// usage() - Show usage and exit. +// + +// +// Include necessary headers... +// + +#include +#include +#include + + +// +// Local functions... +// + +static const char *ppd_locale(ppd_file_t *ppd); +static void usage(void); + + +// +// 'main()' - Main entry for the PPD merge utility. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i; // Looping var + char *opt; // Current option + ppd_file_t *ppd; // PPD file + cups_array_t *ppds; // Array of PPD files + const char *inname, // First input filename + *outname; // Output filename (if any) + cups_file_t *infile, // Input file + *outfile; // Output file + cups_array_t *languages; // Languages in file + const char *locale; // Current locale + char line[1024]; // Line from file + + + _cupsSetLocale(argv); + + // Scan the command-line... + inname = NULL; + outname = NULL; + outfile = NULL; + languages = NULL; + ppds = cupsArrayNew(NULL, NULL); + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'o' : // Output file + if (outname) + usage(); + + i ++; + if (i >= argc) + usage(); + + outname = argv[i]; + break; + + default : // Unknown + usage(); + break; + } + } + else + { + // Open and load the PPD file... + if ((infile = cupsFileOpen(argv[i], "r")) == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to open %s: %s"), "ppdmerge", + argv[i], strerror(errno)); + return (1); + } + + // Open the PPD file... + if ((ppd = ppdOpen2(infile)) == NULL) + { + ppd_status_t status; // PPD open status + int curline, // Current line + linenum; // Line number + + + status = ppdLastError(&linenum); + + _cupsLangPrintf(stderr, + _("%s: Unable to open PPD file: %s on line %d."), + "ppdmerge", ppdErrorString(status), linenum); + cupsFileRewind(infile); + + line[0] = '\0'; + curline = 0; + + while (cupsFileGets(infile, line, sizeof(line))) + { + curline ++; + if (curline >= linenum) + break; + } + + _cupsLangPrintf(stderr, "%d: %s", linenum, line); + + cupsFileClose(infile); + return (1); + } + + // Figure out the locale... + if ((locale = ppd_locale(ppd)) == NULL) + { + _cupsLangPrintf(stderr, + _("ppdmerge: Bad LanguageVersion \"%s\" in %s."), + ppd->lang_version, argv[i]); + cupsFileClose(infile); + ppdClose(ppd); + return (1); + } + + if (!strcmp(locale, "en") && !inname && !outfile) + { + // Set the English PPD's filename... + inname = argv[i]; + languages = _ppdGetLanguages(ppd); + + if (outname && !strcmp(inname, outname)) + { + // Rename input filename so that we don't overwrite it... + char bckname[1024]; // Backup filename + + + snprintf(bckname, sizeof(bckname), "%s.bck", inname); + + if (rename(inname, bckname)) + { + _cupsLangPrintf(stderr, + _("ppdmerge: Unable to backup %s to %s - %s"), + inname, bckname, strerror(errno)); + return (1); + } + + inname = bckname; + } + } + else if (strcmp(locale, "en")) + { + // Save this PPD for later processing... + cupsArrayAdd(ppds, ppd); + } + else + { + // Don't need this PPD... + _cupsLangPrintf(stderr, _("ppdmerge: Ignoring PPD file %s."), + argv[i]); + ppdClose(ppd); + } + + // Close and move on... + cupsFileClose(infile); + } + + // If no PPDs have been loaded, display the program usage message. + if (!inname) + usage(); + + // Loop through the PPD files we loaded to generate a new language list... + if (!languages) + languages = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + for (ppd = (ppd_file_t *)cupsArrayFirst(ppds); + ppd; + ppd = (ppd_file_t *)cupsArrayNext(ppds)) + { + locale = ppd_locale(ppd); + + if (cupsArrayFind(languages, (void *)locale)) + { + // Already have this language, remove the PPD from the list. + ppdClose(ppd); + cupsArrayRemove(ppds, ppd); + } + else + cupsArrayAdd(languages, (void *)locale); + } + + // Copy the English PPD starting with a cupsLanguages line... + infile = cupsFileOpen(inname, "r"); + + if (outname) + { + const char *ext = strrchr(outname, '.'); + if (ext && !strcmp(ext, ".gz")) + outfile = cupsFileOpen(outname, "w9"); + else + outfile = cupsFileOpen(outname, "w"); + } + else + outfile = cupsFileStdout(); + + cupsFileGets(infile, line, sizeof(line)); + cupsFilePrintf(outfile, "%s\n", line); + if ((locale = (char *)cupsArrayFirst(languages)) != NULL) + { + cupsFilePrintf(outfile, "*cupsLanguages: \"%s", locale); + while ((locale = (char *)cupsArrayNext(languages)) != NULL) + cupsFilePrintf(outfile, " %s", locale); + cupsFilePuts(outfile, "\"\n"); + } + + while (cupsFileGets(infile, line, sizeof(line))) + { + if (strncmp(line, "*cupsLanguages:", 15)) + cupsFilePrintf(outfile, "%s\n", line); + } + + // Loop through the other PPD files we loaded to provide the translations... + for (ppd = (ppd_file_t *)cupsArrayFirst(ppds); + ppd; + ppd = (ppd_file_t *)cupsArrayNext(ppds)) + { + // Output all of the UI text for this language... + int j, k, l; // Looping vars + ppd_group_t *g; // Option group + ppd_option_t *o; // Option + ppd_choice_t *c; // Choice + ppd_coption_t *co; // Custom option + ppd_cparam_t *cp; // Custom parameter + ppd_attr_t *attr; // PPD attribute + + locale = ppd_locale(ppd); + + cupsFilePrintf(outfile, "*%% %s localization\n", ppd->lang_version); + cupsFilePrintf(outfile, "*%s.Translation ModelName/%s: \"\"\n", locale, + ppd->modelname); + + for (j = ppd->num_groups, g = ppd->groups; j > 0; j --, g ++) + { + cupsFilePrintf(outfile, "*%s.Translation %s/%s: \"\"\n", locale, + g->name, g->text); + + for (k = g->num_options, o = g->options; k > 0; k --, o ++) + { + cupsFilePrintf(outfile, "*%s.Translation %s/%s: \"\"\n", locale, + o->keyword, o->text); + + for (l = o->num_choices, c = o->choices; l > 0; l --, c ++) + cupsFilePrintf(outfile, "*%s.%s %s/%s: \"\"\n", locale, + o->keyword, c->choice, c->text); + + if ((co = ppdFindCustomOption(ppd, o->keyword)) != NULL) + { + snprintf(line, sizeof(line), "Custom%s", o->keyword); + attr = ppdFindAttr(ppd, line, "True"); + cupsFilePrintf(outfile, "*%s.Custom%s True/%s: \"\"\n", locale, + o->keyword, attr->text); + for (cp = ppdFirstCustomParam(co); cp; cp = ppdNextCustomParam(co)) + cupsFilePrintf(outfile, "*%s.ParamCustom%s %s/%s: \"\"\n", locale, + o->keyword, cp->name, cp->text); + } + } + } + + ppdClose(ppd); + } + + cupsArrayDelete(ppds); + + cupsFileClose(outfile); + + // Return with no errors. + return (0); +} + + +// +// 'ppd_locale()' - Return the locale associated with a PPD file. +// + +static const char * // O - Locale string +ppd_locale(ppd_file_t *ppd) // I - PPD file +{ + int i, // Looping var + vlen; // Length of LanguageVersion string + static char locale[255]; // Locale string + static struct // LanguageVersion translation table + { + const char *version, // LanguageVersion string */ + *language; // Language code */ + } languages[] = + { + { "chinese", "zh" }, + { "czech", "cs" }, + { "danish", "da" }, + { "dutch", "nl" }, + { "english", "en" }, + { "finnish", "fi" }, + { "french", "fr" }, + { "german", "de" }, + { "greek", "el" }, + { "hungarian", "hu" }, + { "italian", "it" }, + { "japanese", "ja" }, + { "korean", "ko" }, + { "norwegian", "no" }, + { "polish", "pl" }, + { "portuguese", "pt" }, + { "russian", "ru" }, + { "simplified chinese", "zh_CN" }, + { "slovak", "sk" }, + { "spanish", "es" }, + { "swedish", "sv" }, + { "traditional chinese", "zh_TW" }, + { "turkish", "tr" } + }; + + + for (i = 0; i < (int)(sizeof(languages) / sizeof(languages[0])); i ++) + { + vlen = strlen(languages[i].version); + + if (!_cups_strncasecmp(ppd->lang_version, languages[i].version, vlen)) + { + if (ppd->lang_version[vlen] == '-' || + ppd->lang_version[vlen] == '_') + snprintf(locale, sizeof(locale), "%s_%s", languages[i].language, + ppd->lang_version + vlen + 1); + else + strlcpy(locale, languages[i].language, sizeof(locale)); + + return (locale); + } + } + + return (NULL); +} + +// +// 'usage()' - Show usage and exit. +// + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: ppdmerge [options] filename.ppd [ ... " + "filenameN.ppd ]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -o filename.ppd[.gz] Set output file " + "(otherwise stdout).")); + + exit(1); +} + + +// +// End of "$Id: ppdmerge.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/ppdpo.cxx b/ppdc/ppdpo.cxx new file mode 100644 index 0000000..9c92252 --- /dev/null +++ b/ppdc/ppdpo.cxx @@ -0,0 +1,268 @@ +// +// "$Id: ppdpo.cxx 9793 2011-05-20 03:49:49Z mike $" +// +// PPD file message catalog program for the CUPS PPD Compiler. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 2002-2005 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Main entry for the PPD compiler. +// add_ui_strings() - Add all UI strings from the driver. +// usage() - Show usage and exit. +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" +#include +#include + + +// +// Local functions... +// + +static void add_ui_strings(ppdcDriver *d, ppdcCatalog *catalog); +static void usage(void); + + +// +// 'main()' - Main entry for the PPD compiler. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + int i; // Looping var + ppdcCatalog *catalog; // Message catalog + ppdcSource *src; // PPD source file data + ppdcDriver *d; // Current driver + char *opt; // Current option + int verbose; // Verbosity + const char *outfile; // Output file + char *value; // Value in option + + + _cupsSetLocale(argv); + + // Scan the command-line... + catalog = new ppdcCatalog("en"); + src = 0; + verbose = 0; + outfile = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'D' : // Define variable + i ++; + if (i >= argc) + usage(); + + if ((value = strchr(argv[i], '=')) != NULL) + { + *value++ = '\0'; + + src->set_variable(argv[i], value); + } + else + src->set_variable(argv[i], "1"); + break; + + case 'I' : // Include directory... + i ++; + if (i >= argc) + usage(); + + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Adding include directory \"%s\"."), + argv[i]); + + ppdcSource::add_include(argv[i]); + break; + + case 'o' : // Output file... + i ++; + if (i >= argc || outfile) + usage(); + + outfile = argv[i]; + + catalog->load_messages(outfile); + break; + + case 'v' : // Be verbose... + verbose ++; + break; + + default : // Unknown + usage(); + break; + } + } + else + { + // Open and load the driver info file... + if (verbose > 1) + _cupsLangPrintf(stdout, + _("ppdc: Loading driver information file \"%s\"."), + argv[i]); + + src = new ppdcSource(argv[i]); + + // Add UI strings... + for (d = (ppdcDriver *)src->drivers->first(); + d; + d = (ppdcDriver *)src->drivers->next()) + { + if (verbose) + _cupsLangPrintf(stderr, _("ppdc: Adding/updating UI text from %s."), + argv[i]); + + add_ui_strings(d, catalog); + } + + // Delete the printer driver information... + src->release(); + } + + // Write the message catalog... + if (!outfile) + usage(); + else + catalog->save_messages(outfile); + + catalog->release(); + + // If no drivers have been loaded, display the program usage message. + if (!src) + usage(); + + // Return with no errors. + return (0); +} + + +// +// 'add_ui_strings()' - Add all UI strings from the driver. +// + +static void +add_ui_strings(ppdcDriver *d, // I - Driver data + ppdcCatalog *catalog) // I - Message catalog +{ + // Add the make/model/language strings... + catalog->add_message(d->manufacturer->value); + catalog->add_message(d->model_name->value); + + // Add the media size strings... + ppdcMediaSize *m; // Current media size + + for (m = (ppdcMediaSize *)d->sizes->first(); + m; + m = (ppdcMediaSize *)d->sizes->next()) + catalog->add_message(m->text->value); + + // Add the group/option/choice strings... + ppdcGroup *g; // Current group + ppdcOption *o; // Current option + ppdcChoice *c; // Current choice + + for (g = (ppdcGroup *)d->groups->first(); + g; + g = (ppdcGroup *)d->groups->next()) + { + if (!g->options->count) + continue; + + if (_cups_strcasecmp(g->name->value, "General")) + catalog->add_message(g->text->value); + + for (o = (ppdcOption *)g->options->first(); + o; + o = (ppdcOption *)g->options->next()) + { + if (!o->choices->count) + continue; + + if (o->text->value) + catalog->add_message(o->text->value); + else + catalog->add_message(o->name->value); + + for (c = (ppdcChoice *)o->choices->first(); + c; + c = (ppdcChoice *)o->choices->next()) + if (c->text->value) + catalog->add_message(c->text->value); + else + catalog->add_message(c->name->value); + } + } + + // Add profile and preset strings... + ppdcAttr *a; // Current attribute + for (a = (ppdcAttr *)d->attrs->first(); + a; + a = (ppdcAttr *)d->attrs->next()) + if (a->text->value && a->text->value[0] && + (a->localizable || + !strncmp(a->name->value, "Custom", 6) || + !strncmp(a->name->value, "ParamCustom", 11) || + !strcmp(a->name->value, "APCustomColorMatchingName") || + !strcmp(a->name->value, "APPrinterPreset") || + !strcmp(a->name->value, "cupsICCProfile") || + !strcmp(a->name->value, "cupsIPPReason") || + !strcmp(a->name->value, "cupsMarkerName"))) + { + catalog->add_message(a->text->value); + + if ((a->localizable && a->value->value[0]) || + !strcmp(a->name->value, "cupsIPPReason")) + catalog->add_message(a->value->value); + } + else if (!strncmp(a->name->value, "Custom", 6) || + !strncmp(a->name->value, "ParamCustom", 11)) + catalog->add_message(a->name->value); +} + + +// +// 'usage()' - Show usage and exit. +// + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: ppdpo [options] -o filename.po filename.drv " + "[ ... filenameN.drv ]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -D name=value Set named variable to " + "value.")); + _cupsLangPuts(stdout, _(" -I include-dir Add include directory to " + "search path.")); + _cupsLangPuts(stdout, _(" -v Be verbose (more v's for " + "more verbosity).")); + + exit(1); +} + + +// +// End of "$Id: ppdpo.cxx 9793 2011-05-20 03:49:49Z mike $". +// diff --git a/ppdc/sample.drv b/ppdc/sample.drv new file mode 100644 index 0000000..010ccb2 --- /dev/null +++ b/ppdc/sample.drv @@ -0,0 +1,1254 @@ +// +// "$Id: sample.drv 9588 2011-03-07 16:53:16Z mike $" +// +// Driver info file for CUPS-supplied PPDs. +// +// Copyright 2007-2011 by Apple Inc. +// Copyright 1993-2006 by Easy Software Products. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// + +// Include necessary files... +#include +#include +#include +#include +#include + +// Localizations are provided for all of the base languages supported by +// CUPS... +//#po da "" +//#po de "" +//#po es "" +//#po et "" +//#po fi "" +//#po fr "" +//#po he "" +//#po id "" +//#po it "" +//#po ja "" +//#po ko "" +//#po nl "" +//#po no "" +//#po pl "" +//#po pt "" +//#po pt_BR "" +//#po ru "" +//#po sv "" +//#po zh "" +//#po zh_TW "" + +// MediaSize sizes used by label drivers... +#media "w81h252/Address - 1 1/8 x 3 1/2\"" 81 252 +#media "w101h252/Large Address - 1 4/10 x 3 1/2\"" 101 252 +#media "w54h144/Return Address - 3/4 x 2\"" 54 144 +#media "w167h288/Shipping Address - 2 5/16 x 4\"" 167 288 +#media "w162h540/Internet Postage 2-Part - 2 1/4 x 7 1/2\"" 162 540 +#media "w162h504/Internet Postage 3-Part - 2 1/4 x 7\"" 162 504 +#media "w41h248/File Folder - 9/16 x 3 7/16\"" 41 248 +#media "w41h144/Hanging Folder - 9/16 x 2\"" 41 144 +#media "w153h198/3.5\" Disk - 2 1/8 x 2 3/4\"" 153 198 +#media "w90h18/1.25x0.25\"" 90 18 +#media "w90h162/1.25x2.25\"" 90 162 +#media "w108h18/1.50x0.25\"" 108 18 +#media "w108h36/1.50x0.50\"" 108 36 +#media "w108h72/1.50x1.00\"" 108 72 +#media "w108h144/1.50x2.00\"" 108 144 +#media "w144h26/2.00x0.37\"" 144 26 +#media "w144h36/2.00x0.50\"" 144 36 +#media "w144h72/2.00x1.00\"" 144 72 +#media "w144h90/2.00x1.25\"" 144 90 +#media "w144h144/2.00x2.00\"" 144 144 +#media "w144h216/2.00x3.00\"" 144 216 +#media "w144h288/2.00x4.00\"" 144 288 +#media "w144h396/2.00x5.50\"" 144 396 +#media "w162h36/2.25x0.50\"" 162 36 +#media "w162h90/2.25x1.25\"" 162 90 +#media "w162h288/2.25x4.00\"" 162 288 +#media "w162h396/2.25x5.50\"" 162 396 +#media "w171h396/2.38x5.50\"" 171 396 +#media "w180h72/2.50x1.00\"" 180 72 +#media "w180h144/2.50x2.00\"" 180 144 +#media "w198h90/2.75x1.25\"" 198 90 +#media "w209h72/2.9 x 1\"" 209 72 +#media "w216h72/3.00x1.00\"" 216 72 +#media "w216h90/3.00x1.25\"" 216 90 +#media "w216h144/3.00x2.00\"" 216 144 +#media "w216h216/3.00x3.00\"" 216 216 +#media "w216h360/3.00x5.00\"" 216 360 +#media "w234h144/3.25x2.00\"" 234 144 +#media "w234h360/3.25x5.00\"" 234 360 +#media "w234h396/3.25x5.50\"" 234 396 +#media "w234h419/3.25x5.83\"" 234 419 +#media "w234h563/3.25x7.83\"" 234 563 +#media "w252h72/3.50x1.00\"" 252 72 +#media "w288h72/4.00x1.00\"" 288 72 +#media "w288h144/4.00x2.00\"" 288 144 +#media "w288h180/4.00x2.50\"" 288 180 +#media "w288h216/4.00x3.00\"" 288 216 +#media "w288h288/4.00x4.00\"" 288 288 +#media "w288h360/4.00x5.00\"" 288 360 +#media "w288h432/4.00x6.00\"" 288 432 +#media "w288h468/4.00x6.50\"" 288 468 +#media "w288h936/4.00x13.00\"" 288 936 +#media "w432h72/6.00x1.00\"" 432 72 +#media "w432h144/6.00x2.00\"" 432 144 +#media "w432h216/6.00x3.00\"" 432 216 +#media "w432h288/6.00x4.00\"" 432 288 +#media "w432h360/6.00x5.00\"" 432 360 +#media "w432h432/6.00x6.00\"" 432 432 +#media "w432h468/6.00x6.50\"" 432 468 +#media "w576h72/8.00x1.00\"" 576 72 +#media "w576h144/8.00x2.00\"" 576 144 +#media "w576h216/8.00x3.00\"" 576 216 +#media "w576h288/8.00x4.00\"" 576 288 +#media "w576h360/8.00x5.00\"" 576 360 +#media "w576h432/8.00x6.00\"" 576 432 +#media "w576h468/8.00x6.50\"" 576 468 + +// Common stuff for all drivers... +Attribute "cupsVersion" "" "1.5" +Attribute "FileSystem" "" "False" +Attribute "LandscapeOrientation" "" "Plus90" +Attribute "TTRasterizer" "" "Type42" + +Copyright "Copyright 2007-2011 by Apple Inc." +Copyright "Copyright 1997-2007 by Easy Software Products." +Copyright "" +Copyright "These coded instructions, statements, and computer programs are the" +Copyright "property of Apple Inc. and are protected by Federal copyright" +Copyright "law. Distribution and use rights are outlined in the file \"LICENSE.txt\"" +Copyright "which should have been included with this file. If this file is" +Copyright "file is missing or damaged, see the license at \"http://www.cups.org/\"." + +Font * + +Version "1.5" + +// Dymo Label Printer +{ + Manufacturer "Dymo" + ModelName "Label Printer" + Attribute NickName "" "Dymo Label Printer" + PCFileName "dymo.ppd" + DriverType label + ModelNumber $DYMO_3x0 + Throughput 8 + ManualCopies Yes + ColorDevice No + + HWMargins 2 14.9 2 14.9 + + *MediaSize w81h252 + MediaSize w101h252 + MediaSize w54h144 + MediaSize w167h288 + MediaSize w162h540 + MediaSize w162h504 + MediaSize w41h248 + MediaSize w41h144 + MediaSize w153h198 + + Resolution k 1 0 0 0 136dpi + Resolution k 1 0 0 0 203dpi + *Resolution k 1 0 0 0 300dpi + + Darkness 0 Light + Darkness 1 Medium + *Darkness 2 Normal + Darkness 3 Dark +} + +// Epson +{ + Manufacturer "Epson" + DriverType epson + ManualCopies Yes + ColorDevice No + Throughput 1 + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 1080 86400 + + // Epson 24-Pin Series + { + ModelName "24-Pin Series" + Attribute NickName "" "Epson 24-Pin Series" + PCFileName "epson24.ppd" + ModelNumber $EPSON_24PIN + + HWMargins 18 18 18 18 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + MediaSize FanFoldUS + + Resolution k 1 8 0 0 60dpi + *Resolution k 1 8 0 0 120x60dpi + Resolution k 1 24 0 0 180dpi + Resolution k 1 24 0 0 360x180dpi + Resolution k 1 48 0 0 360dpi + } + + // Epson 9-Pin Series + { + ModelName "9-Pin Series" + Attribute NickName "" "Epson 9-Pin Series" + PCFileName "epson9.ppd" + ModelNumber $EPSON_9PIN + ColorDevice No + + HWMargins 18 18 18 18 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + MediaSize FanFoldUS + + Resolution k 1 8 0 0 60x72dpi + *Resolution k 1 8 0 0 120x72dpi + Resolution k 1 8 0 0 240x72dpi + } + + // Epson Stylus Color Series + { + ModelName "Stylus Color Series" + Attribute NickName "" "Epson Stylus Color Series" + PCFileName "stcolor.ppd" + ModelNumber $EPSON_COLOR + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmyk banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson New Stylus Color Series + { + ModelName "New Stylus Color Series" + Attribute NickName "" "Epson New Stylus Color Series" + PCFileName "stcolor2.ppd" + ModelNumber $EPSON_ICOLOR + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmyk banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson Stylus Color Series + { + ModelName "Stylus Photo Series" + Attribute NickName "" "Epson Stylus Photo Series" + PCFileName "stphoto.ppd" + ModelNumber $EPSON_PHOTO + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmykcm banded 1 + ColorModel Gray/Grayscale k chunky 1 + } + + // Epson New Stylus Color Series + { + ModelName "New Stylus Photo Series" + Attribute NickName "" "Epson New Stylus Photo Series" + PCFileName "stphoto2.ppd" + ModelNumber $EPSON_IPHOTO + ColorDevice Yes + + HWMargins 8.6 39.6 8.6 25.51 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + + Resolution - 1 0 0 0 180dpi + *Resolution - 1 0 0 0 360dpi + Resolution - 1 0 0 0 720dpi + + *ColorModel CMYK cmykcm banded 1 + ColorModel Gray/Grayscale k chunky 1 + } +} + +// Generic drivers +{ + Manufacturer "Generic" + + // Generic PCL Laser Printer + { + DriverType hp + + ModelName "PCL Laser Printer" + Attribute NickName "" "Generic PCL Laser Printer" + PCFileName "generpcl.ppd" + Throughput 8 + ModelNumber $HP_LASERJET + ColorDevice No + Attribute 1284DeviceID "" "CMD:PCL;" + + UIConstraints "*Duplex *Option1 False" + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + + HWMargins 18 12 18 12 + *MediaSize Letter + MediaSize Legal + MediaSize Executive + MediaSize Tabloid + MediaSize A3 + MediaSize A4 + MediaSize A5 + MediaSize B5 + MediaSize EnvISOB5 + MediaSize Env10 + MediaSize EnvC5 + MediaSize EnvDL + MediaSize EnvMonarch + + *Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + *InputSlot 0 "Default/Printer Default" + InputSlot 8 "Tray1/Tray 1" + InputSlot 1 "Tray2/Tray 2" + InputSlot 4 "Tray3/Tray 3" + InputSlot 5 "Tray4/Tray 4" + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + Duplex Yes + Installable "Option1/Duplexer" + } + + // Generic PostScript Printer + { + DriverType ps + + ModelName "PostScript Printer" + Attribute NickName "" "Generic PostScript Printer" + PCFileName "generic.ppd" + Throughput 8 + ColorDevice Yes + Attribute PSVersion "" "(2016.0) 0" + Attribute LanguageLevel "" 2 + Attribute 1284DeviceID "" "CMD:PS;" + + UIConstraints "*Duplex *Option1 False" + + HWMargins 12 12 12 12 + *MediaSize Letter + MediaSize Legal + MediaSize Executive + MediaSize Tabloid + MediaSize A3 + MediaSize A4 + MediaSize A5 + MediaSize B5 + MediaSize EnvISOB5 + MediaSize Env10 + MediaSize EnvC5 + MediaSize EnvDL + MediaSize EnvMonarch + + Option "InputSlot/Media Source" PickOne AnySetup 10 + *Choice "Default/Printer Default" "" + Choice "Upper/Cassette" "<>setpagedevice" + Choice "Manual/Manual Feed" "<>setpagedevice" + + Duplex Yes + Installable "Option1/Duplexer" + Attribute "?Option1" "" "save currentpagedevice/Duplex known{(True)}{(False)}ifelse = flush restore" + } +} + +// HP +{ + Manufacturer "HP" + DriverType hp + + // HP DeskJet Series + { + ModelName "DeskJet Series" + Attribute NickName "" "HP DeskJet Series" + PCFileName "deskjet.ppd" + ModelNumber $HP_DESKJET + ManualCopies Yes + ColorDevice Yes + Throughput 1 + Attribute 1284DeviceID "" "MFG:HP;MDL:HP DeskJet;CMD:PCL;" + + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + + HWMargins 18 36 18 36 + *MediaSize Letter + MediaSize Legal + MediaSize Executive + MediaSize Tabloid + MediaSize A3 + MediaSize A4 + MediaSize A5 + MediaSize B5 + MediaSize EnvISOB5 + MediaSize Env10 + MediaSize EnvC5 + MediaSize EnvDL + MediaSize EnvMonarch + + ColorModel Gray/Grayscale k chunky 2 + ColorModel RGB/Color cmy banded 2 + *ColorModel CMYK kcmy banded 2 + + Resolution - 1 0 0 0 150dpi + *Resolution - 1 0 0 0 300dpi + Resolution - 1 0 0 0 600dpi + + *InputSlot 1 Tray + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + *MediaType 0 "Plain/Plain Paper" + MediaType 1 "Bond/Bond Paper" + MediaType 2 "Special/Special Paper" + MediaType 3 Transparency + MediaType 4 "Glossy/Glossy Paper" + } + + // HP LaserJet Series PCL 4/5 + { + ModelName "LaserJet Series PCL 4/5" + Attribute NickName "" "HP LaserJet Series PCL 4/5" + PCFileName "laserjet.ppd" + Throughput 8 + ModelNumber $HP_LASERJET + ColorDevice No + Attribute 1284DeviceID "" "MFG:HP;MDL:HP LaserJet;CMD:PCL;" + + UIConstraints "*Duplex *Option1 False" + UIConstraints "*PageSize A3 *InputSlot Envelope" + UIConstraints "*PageSize A4 *InputSlot Envelope" + UIConstraints "*PageSize A5 *InputSlot Envelope" + UIConstraints "*PageSize B5 *InputSlot Envelope" + UIConstraints "*PageSize Executive *InputSlot Envelope" + UIConstraints "*PageSize Legal *InputSlot Envelope" + UIConstraints "*PageSize Letter *InputSlot Envelope" + UIConstraints "*PageSize Tabloid *InputSlot Envelope" + + HWMargins 18 36 18 36 + *MediaSize Letter + MediaSize Legal + MediaSize Executive + MediaSize Tabloid + MediaSize A3 + MediaSize A4 + MediaSize A5 + MediaSize B5 + MediaSize EnvISOB5 + MediaSize Env10 + MediaSize EnvC5 + MediaSize EnvDL + MediaSize EnvMonarch + + Resolution k 1 0 0 0 150dpi + *Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + *InputSlot 0 "Default/Printer Default" + InputSlot 8 "Tray1/Tray 1" + InputSlot 1 "Tray2/Tray 2" + InputSlot 4 "Tray3/Tray 3" + InputSlot 5 "Tray4/Tray 4" + InputSlot 2 "Manual/Manual Feed" + InputSlot 3 "Envelope/Envelope Feed" + + Duplex Yes + Installable "Option1/Duplexer" + } +} + +// Intellitech IntelliBar Series Label Printer +{ + Manufacturer "Intellitech" + ModelName "IntelliBar Label Printer" + Attribute ShortNickName "" "IntelliBar Label Printer" + PCFileName "intelbar.ppd" + DriverType label + ModelNumber $INTELLITECH_PCL + Throughput 8 + ColorDevice No + + HWMargins 0 5.76 0 5.76 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 630 7128 + + UIConstraints "*inPrintMode Standard *inCutInterval" + UIConstraints "*inPrintMode Tear *inCutInterval" + UIConstraints "*inPrintMode Standard *inTearInterval" + UIConstraints "*inPrintMode Cut *inTearInterval" + + *MediaSize w288h432 + + *Resolution k 1 0 0 0 300dpi + + Group "PrinterSettings/Printer Settings" + Option "inPrintDensity/Print Density" PickOne DocumentSetup 20.0 + *Choice "Default/Printer Default" "<>setpagedevice" + Choice "-15/-15" "<>setpagedevice" + Choice "-14/-14" "<>setpagedevice" + Choice "-13/-13" "<>setpagedevice" + Choice "-12/-12" "<>setpagedevice" + Choice "-11/-11" "<>setpagedevice" + Choice "-10/-10" "<>setpagedevice" + Choice "-9/-9" "<>setpagedevice" + Choice "-8/-8" "<>setpagedevice" + Choice "-7/-7" "<>setpagedevice" + Choice "-6/-6" "<>setpagedevice" + Choice "-5/-5" "<>setpagedevice" + Choice "-4/-4" "<>setpagedevice" + Choice "-3/-3" "<>setpagedevice" + Choice "-2/-2" "<>setpagedevice" + Choice "-1/-1" "<>setpagedevice" + Choice "0/0" "<>setpagedevice" + Choice "1/1" "<>setpagedevice" + Choice "2/2" "<>setpagedevice" + Choice "3/3" "<>setpagedevice" + Choice "4/4" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "6/6" "<>setpagedevice" + Choice "7/7" "<>setpagedevice" + Choice "8/8" "<>setpagedevice" + Choice "9/9" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "11/11" "<>setpagedevice" + Choice "12/12" "<>setpagedevice" + Choice "13/13" "<>setpagedevice" + Choice "14/14" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Option "inPrintRate/Print Speed" PickOne DocumentSetup 20.0 + *Choice "Default/Printer Default" "<>setpagedevice" + Choice "15/15 mm/sec." "<>setpagedevice" + Choice "20/20 mm/sec." "<>setpagedevice" + Choice "30/30 mm/sec." "<>setpagedevice" + Choice "40/40 mm/sec." "<>setpagedevice" + Choice "60/60 mm/sec." "<>setpagedevice" + Choice "80/80 mm/sec." "<>setpagedevice" + Choice "100/100 mm/sec." "<>setpagedevice" + Choice "120/120 mm/sec." "<>setpagedevice" + Choice "150/150 mm/sec." "<>setpagedevice" + Choice "200/200 mm/sec." "<>setpagedevice" + Choice "250/250 mm/sec." "<>setpagedevice" + Choice "300/300 mm/sec." "<>setpagedevice" + Option "inPrintMode/Print Mode" PickOne DocumentSetup 20.0 + *Choice "Standard/Standard" "" + Choice "Tear/Tear" "" + Choice "Cut/Cut" "" + Option "inTearInterval/Print and Tear" PickOne DocumentSetup 20.0 + *Choice "None/Disabled" "<>setpagedevice" + Choice "1/Every Label" "<>setpagedevice" + Choice "2/Every 2 Labels" "<>setpagedevice" + Choice "3/Every 3 Labels" "<>setpagedevice" + Choice "4/Every 4 Labels" "<>setpagedevice" + Choice "5/Every 5 Labels" "<>setpagedevice" + Choice "6/Every 6 Labels" "<>setpagedevice" + Choice "7/Every 7 Labels" "<>setpagedevice" + Choice "8/Every 8 Labels" "<>setpagedevice" + Choice "9/Every 9 Labels" "<>setpagedevice" + Choice "10/Every 10 Labels" "<>setpagedevice" + Attribute CustominTearInterval True "<>setpagedevice" + Attribute ParamCustominTearInterval Interval "1 int 1 99" + Option "inCutInterval/Print and Cut" PickOne DocumentSetup 20.0 + *Choice "None/Disabled" "<>setpagedevice" + Choice "1/Every Label" "<>setpagedevice" + Choice "2/Every 2 Labels" "<>setpagedevice" + Choice "3/Every 3 Labels" "<>setpagedevice" + Choice "4/Every 4 Labels" "<>setpagedevice" + Choice "5/Every 5 Labels" "<>setpagedevice" + Choice "6/Every 6 Labels" "<>setpagedevice" + Choice "7/Every 7 Labels" "<>setpagedevice" + Choice "8/Every 8 Labels" "<>setpagedevice" + Choice "9/Every 9 Labels" "<>setpagedevice" + Choice "10/Every 10 Labels" "<>setpagedevice" + Attribute CustominCutInterval True "<>setpagedevice" + Attribute ParamCustominCutInterval Interval "1 int 1 99" +} + +// Oki +{ + Manufacturer "Oki" + DriverType epson + ManualCopies Yes + ColorDevice No + Throughput 1 + + HWMargins 18 18 18 18 + *MediaSize Letter + MediaSize Legal + MediaSize A4 + MediaSize FanFoldUS + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 1080 86400 + + // Oki 24-Pin Series + { + ModelName "24-Pin Series" + Attribute NickName "" "Oki 24-Pin Series" + PCFileName "okidat24.ppd" + ModelNumber $EPSON_24PIN + + Resolution k 1 8 0 0 60dpi + *Resolution k 1 8 0 0 120x60dpi + Resolution k 1 24 0 0 180dpi + Resolution k 1 24 0 0 360x180dpi + Resolution k 1 48 0 0 360dpi + } + + // Oki 9-Pin Series + { + ModelName "9-Pin Series" + Attribute NickName "" "Oki 9-Pin Series" + PCFileName "okidata9.ppd" + ModelNumber $EPSON_9PIN + ColorDevice No + + Resolution k 1 8 0 0 60x72dpi + *Resolution k 1 8 0 0 120x72dpi + Resolution k 1 8 0 0 240x72dpi + } +} + + +// Zebra +{ + Manufacturer "Zebra" + DriverType label + Throughput 8 + ColorDevice False + + // Zebra CPCL Label Printer + { + ModelName "CPCL Label Printer" + Attribute NickName "" "Zebra CPCL Label Printer" + PCFileName "zebracpl.ppd" + ModelNumber $ZEBRA_CPCL + + HWMargins 0 0 0 0 + MediaSize w144h72 + MediaSize w144h90 + MediaSize w144h144 + MediaSize w144h216 + MediaSize w209h72 + + HWMargins 0 0 1 0 + MediaSize w288h144 + MediaSize w288h216 + MediaSize w288h288 + *MediaSize w288h360 + MediaSize w288h432 + + VariablePaperSize Yes + HWMargins 0 0 1 0 + MinSize 36 36 + MaxSize 288 3600 + + *Resolution k 1 0 0 0 203dpi + + Group "General/General" + Option "zeMediaTracking/Media Tracking" PickOne AnySetup 20.0 + Choice "Continuous/Continuous" "" + *Choice "Web/Non-continuous (Web sensing)" "" + Choice "Mark/Non-continuous (Mark sensing)" "" + + Group "PrinterSettings/Printer Settings" + Option "Darkness" PickOne AnySetup 20.0 + *Choice "-1/Printer Default" "<>setpagedevice" + Choice "1/1" "<>setpagedevice" + Choice "2/2" "<>setpagedevice" + Choice "3/3" "<>setpagedevice" + Choice "4/4" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "6/6" "<>setpagedevice" + Choice "7/7" "<>setpagedevice" + Choice "8/8" "<>setpagedevice" + Choice "9/9" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "11/11" "<>setpagedevice" + Choice "12/12" "<>setpagedevice" + Choice "13/13" "<>setpagedevice" + Choice "14/14" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "16/16" "<>setpagedevice" + Choice "17/17" "<>setpagedevice" + Choice "18/18" "<>setpagedevice" + Choice "19/19" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "21/21" "<>setpagedevice" + Choice "22/22" "<>setpagedevice" + Choice "23/23" "<>setpagedevice" + Choice "24/24" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "26/26" "<>setpagedevice" + Choice "27/27" "<>setpagedevice" + Choice "28/28" "<>setpagedevice" + Choice "29/29" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/Printer Default" "" + Choice "1/1 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "3/3 inches/sec." "" + Choice "4/4 inches/sec." "" + Option "zeTearOffPosition/Tear-Off Adjust Position" PickOne AnySetup 20.0 + *Choice "1000/Printer Default" "<>setpagedevice" + Choice "-120/-120" "<>setpagedevice" + Choice "-115/-115" "<>setpagedevice" + Choice "-110/-110" "<>setpagedevice" + Choice "-105/-105" "<>setpagedevice" + Choice "-100/-100" "<>setpagedevice" + Choice "-95/-95" "<>setpagedevice" + Choice "-90/-90" "<>setpagedevice" + Choice "-85/-85" "<>setpagedevice" + Choice "-80/-80" "<>setpagedevice" + Choice "-75/-75" "<>setpagedevice" + Choice "-70/-70" "<>setpagedevice" + Choice "-65/-65" "<>setpagedevice" + Choice "-60/-60" "<>setpagedevice" + Choice "-55/-55" "<>setpagedevice" + Choice "-50/-50" "<>setpagedevice" + Choice "-45/-45" "<>setpagedevice" + Choice "-40/-40" "<>setpagedevice" + Choice "-35/-35" "<>setpagedevice" + Choice "-30/-30" "<>setpagedevice" + Choice "-25/-25" "<>setpagedevice" + Choice "-20/-20" "<>setpagedevice" + Choice "-15/-15" "<>setpagedevice" + Choice "-10/-10" "<>setpagedevice" + Choice "-5/-5" "<>setpagedevice" + Choice "0/0" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Choice "35/35" "<>setpagedevice" + Choice "40/40" "<>setpagedevice" + Choice "45/45" "<>setpagedevice" + Choice "50/50" "<>setpagedevice" + Choice "55/55" "<>setpagedevice" + Choice "60/60" "<>setpagedevice" + Choice "65/65" "<>setpagedevice" + Choice "70/70" "<>setpagedevice" + Choice "75/75" "<>setpagedevice" + Choice "80/80" "<>setpagedevice" + Choice "85/85" "<>setpagedevice" + Choice "90/90" "<>setpagedevice" + Choice "95/95" "<>setpagedevice" + Choice "100/100" "<>setpagedevice" + Choice "105/105" "<>setpagedevice" + Choice "110/110" "<>setpagedevice" + Choice "115/115" "<>setpagedevice" + Choice "120/120" "<>setpagedevice" + Option "zeErrorReprint/Reprint After Error" PickOne AnySetup 20.0 + *Choice "Saved/Printer Default" "" + Choice "Always/Always" "" + Choice "Never/Never" "" + } + + // Zebra EPL1 Label Printer + { + ModelName "EPL1 Label Printer" + Attribute NickName "" "Zebra EPL1 Label Printer" + PCFileName "zebraep1.ppd" + ModelNumber $ZEBRA_EPL_LINE + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 288 3600 + + MediaSize w90h18 + MediaSize w90h162 + MediaSize w108h18 + MediaSize w108h36 + MediaSize w108h72 + MediaSize w108h144 + MediaSize w144h26 + MediaSize w144h36 + MediaSize w144h72 + MediaSize w144h90 + MediaSize w144h288 + MediaSize w144h396 + MediaSize w162h36 + MediaSize w162h90 + MediaSize w162h288 + MediaSize w162h396 + MediaSize w171h396 + MediaSize w180h72 + MediaSize w180h144 + MediaSize w198h90 + MediaSize w216h72 + MediaSize w216h90 + MediaSize w216h144 + MediaSize w216h216 + MediaSize w216h360 + MediaSize w234h144 + MediaSize w234h360 + MediaSize w234h396 + MediaSize w234h419 + MediaSize w234h563 + MediaSize w252h72 + MediaSize w288h72 + MediaSize w288h144 + MediaSize w288h180 + MediaSize w288h216 + MediaSize w288h288 + *MediaSize w288h360 + MediaSize w288h432 + MediaSize w288h468 + MediaSize w288h936 + + *Resolution k 1 0 0 0 203dpi + Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + Group "PrinterSettings/Printer Settings" + Option "Darkness" PickOne AnySetup 20.0 + *Choice "-1/Printer Default" "<>setpagedevice" + Choice "1/1" "<>setpagedevice" + Choice "2/2" "<>setpagedevice" + Choice "3/3" "<>setpagedevice" + Choice "4/4" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "6/6" "<>setpagedevice" + Choice "7/7" "<>setpagedevice" + Choice "8/8" "<>setpagedevice" + Choice "9/9" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "11/11" "<>setpagedevice" + Choice "12/12" "<>setpagedevice" + Choice "13/13" "<>setpagedevice" + Choice "14/14" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "16/16" "<>setpagedevice" + Choice "17/17" "<>setpagedevice" + Choice "18/18" "<>setpagedevice" + Choice "19/19" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "21/21" "<>setpagedevice" + Choice "22/22" "<>setpagedevice" + Choice "23/23" "<>setpagedevice" + Choice "24/24" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "26/26" "<>setpagedevice" + Choice "27/27" "<>setpagedevice" + Choice "28/28" "<>setpagedevice" + Choice "29/29" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/Printer Default" "" + Choice "1/1 inch/sec." "" + Choice "1.5/1.5 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "2.5/2.5 inches/sec." "" + } + + // Zebra EPL2 Label Printer + { + ModelName "EPL2 Label Printer" + Attribute NickName "" "Zebra EPL2 Label Printer" + PCFileName "zebraep2.ppd" + ModelNumber $ZEBRA_EPL_PAGE + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 288 3600 + + MediaSize w90h18 + MediaSize w90h162 + MediaSize w108h18 + MediaSize w108h36 + MediaSize w108h72 + MediaSize w108h144 + MediaSize w144h26 + MediaSize w144h36 + MediaSize w144h72 + MediaSize w144h90 + MediaSize w144h288 + MediaSize w144h396 + MediaSize w162h36 + MediaSize w162h90 + MediaSize w162h288 + MediaSize w162h396 + MediaSize w171h396 + MediaSize w180h72 + MediaSize w180h144 + MediaSize w198h90 + MediaSize w216h72 + MediaSize w216h90 + MediaSize w216h144 + MediaSize w216h216 + MediaSize w216h360 + MediaSize w234h144 + MediaSize w234h360 + MediaSize w234h396 + MediaSize w234h419 + MediaSize w234h563 + MediaSize w252h72 + MediaSize w288h72 + MediaSize w288h144 + MediaSize w288h180 + MediaSize w288h216 + MediaSize w288h288 + *MediaSize w288h360 + MediaSize w288h432 + MediaSize w288h468 + MediaSize w288h936 + + *Resolution k 1 0 0 0 203dpi + Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + Group "General/General" + Option "MediaType/Media Type" PickOne AnySetup 20.0 + *Choice "Saved/Printer Default" "" + Choice "Thermal/Thermal Transfer Media" "<>setpagedevice" + Choice "Direct/Direct Thermal Media" "<>setpagedevice" + Group "PrinterSettings/Printer Settings" + Option "Darkness" PickOne AnySetup 20.0 + *Choice "-1/Printer Default" "<>setpagedevice" + Choice "1/1" "<>setpagedevice" + Choice "2/2" "<>setpagedevice" + Choice "3/3" "<>setpagedevice" + Choice "4/4" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "6/6" "<>setpagedevice" + Choice "7/7" "<>setpagedevice" + Choice "8/8" "<>setpagedevice" + Choice "9/9" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "11/11" "<>setpagedevice" + Choice "12/12" "<>setpagedevice" + Choice "13/13" "<>setpagedevice" + Choice "14/14" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "16/16" "<>setpagedevice" + Choice "17/17" "<>setpagedevice" + Choice "18/18" "<>setpagedevice" + Choice "19/19" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "21/21" "<>setpagedevice" + Choice "22/22" "<>setpagedevice" + Choice "23/23" "<>setpagedevice" + Choice "24/24" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "26/26" "<>setpagedevice" + Choice "27/27" "<>setpagedevice" + Choice "28/28" "<>setpagedevice" + Choice "29/29" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/Printer Default" "" + Choice "1/1 inch/sec." "" + Choice "1.5/1.5 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "2.5/2.5 inches/sec." "" + Choice "3/3 inches/sec." "" + Choice "4/4 inches/sec." "" + Choice "5/5 inches/sec." "" + Choice "6/6 inches/sec." "" + } + + // Zebra ZPL Label Printer + { + ModelName "ZPL Label Printer" + Attribute NickName "" "Zebra ZPL Label Printer" + PCFileName "zebra.ppd" + ModelNumber $ZEBRA_ZPL + + HWMargins 0 0 0 0 + VariablePaperSize Yes + MinSize 36 36 + MaxSize 576 3600 + + MediaSize w90h18 + MediaSize w90h162 + MediaSize w108h18 + MediaSize w108h36 + MediaSize w108h72 + MediaSize w108h144 + MediaSize w144h26 + MediaSize w144h36 + MediaSize w144h72 + MediaSize w144h90 + MediaSize w144h288 + MediaSize w144h396 + MediaSize w162h36 + MediaSize w162h90 + MediaSize w162h288 + MediaSize w162h396 + MediaSize w171h396 + MediaSize w180h72 + MediaSize w180h144 + MediaSize w198h90 + MediaSize w216h72 + MediaSize w216h90 + MediaSize w216h144 + MediaSize w216h216 + MediaSize w216h360 + MediaSize w234h144 + MediaSize w234h360 + MediaSize w234h396 + MediaSize w234h419 + MediaSize w234h563 + MediaSize w252h72 + MediaSize w288h72 + MediaSize w288h144 + MediaSize w288h180 + MediaSize w288h216 + MediaSize w288h288 + *MediaSize w288h360 + MediaSize w288h432 + MediaSize w288h468 + MediaSize w288h936 + MediaSize w432h72 + MediaSize w432h144 + MediaSize w432h216 + MediaSize w432h288 + MediaSize w432h360 + MediaSize w432h432 + MediaSize w432h468 + MediaSize w576h72 + MediaSize w576h144 + MediaSize w576h216 + MediaSize w576h288 + MediaSize w576h360 + MediaSize w576h432 + MediaSize w576h468 + + *Resolution k 1 0 0 0 203dpi + Resolution k 1 0 0 0 300dpi + Resolution k 1 0 0 0 600dpi + + Group "General/General" + Option "zeMediaTracking/Media Tracking" PickOne AnySetup 20.0 + Choice "Continuous/Continuous" "" + *Choice "Web/Non-continuous (Web sensing)" "" + Choice "Mark/Non-continuous (Mark sensing)" "" + Option "MediaType/Media Type" PickOne AnySetup 20.0 + *Choice "Saved/Printer Default" "" + Choice "Thermal/Thermal Transfer Media" "<>setpagedevice" + Choice "Direct/Direct Thermal Media" "<>setpagedevice" + Group "PrinterSettings/Printer Settings" + Option "Darkness" PickOne AnySetup 20.0 + *Choice "-1/Printer Default" "<>setpagedevice" + Choice "1/1" "<>setpagedevice" + Choice "2/2" "<>setpagedevice" + Choice "3/3" "<>setpagedevice" + Choice "4/4" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "6/6" "<>setpagedevice" + Choice "7/7" "<>setpagedevice" + Choice "8/8" "<>setpagedevice" + Choice "9/9" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "11/11" "<>setpagedevice" + Choice "12/12" "<>setpagedevice" + Choice "13/13" "<>setpagedevice" + Choice "14/14" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "16/16" "<>setpagedevice" + Choice "17/17" "<>setpagedevice" + Choice "18/18" "<>setpagedevice" + Choice "19/19" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "21/21" "<>setpagedevice" + Choice "22/22" "<>setpagedevice" + Choice "23/23" "<>setpagedevice" + Choice "24/24" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "26/26" "<>setpagedevice" + Choice "27/27" "<>setpagedevice" + Choice "28/28" "<>setpagedevice" + Choice "29/29" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Option "zePrintRate/Print Rate" PickOne AnySetup 20.0 + *Choice "Default/Printer Default" "" + Choice "1/1 inch/sec." "" + Choice "2/2 inches/sec." "" + Choice "3/3 inches/sec." "" + Choice "4/4 inches/sec." "" + Choice "5/5 inches/sec." "" + Choice "6/6 inches/sec." "" + Choice "7/7 inches/sec." "" + Choice "8/8 inches/sec." "" + Choice "9/9 inches/sec." "" + Choice "10/10 inches/sec." "" + Choice "11/11 inches/sec." "" + Choice "12/12 inches/sec." "" + Option "zeLabelTop/Label Top" PickOne AnySetup 20.0 + *Choice "200/Printer Default" "<>setpagedevice" + Choice "-120/-120" "<>setpagedevice" + Choice "-115/-115" "<>setpagedevice" + Choice "-110/-110" "<>setpagedevice" + Choice "-105/-105" "<>setpagedevice" + Choice "-100/-100" "<>setpagedevice" + Choice "-95/-95" "<>setpagedevice" + Choice "-90/-90" "<>setpagedevice" + Choice "-85/-85" "<>setpagedevice" + Choice "-80/-80" "<>setpagedevice" + Choice "-75/-75" "<>setpagedevice" + Choice "-70/-70" "<>setpagedevice" + Choice "-65/-65" "<>setpagedevice" + Choice "-60/-60" "<>setpagedevice" + Choice "-55/-55" "<>setpagedevice" + Choice "-50/-50" "<>setpagedevice" + Choice "-45/-45" "<>setpagedevice" + Choice "-40/-40" "<>setpagedevice" + Choice "-35/-35" "<>setpagedevice" + Choice "-30/-30" "<>setpagedevice" + Choice "-25/-25" "<>setpagedevice" + Choice "-20/-20" "<>setpagedevice" + Choice "-15/-15" "<>setpagedevice" + Choice "-10/-10" "<>setpagedevice" + Choice "-5/-5" "<>setpagedevice" + Choice "0/0" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Choice "35/35" "<>setpagedevice" + Choice "40/40" "<>setpagedevice" + Choice "45/45" "<>setpagedevice" + Choice "50/50" "<>setpagedevice" + Choice "55/55" "<>setpagedevice" + Choice "60/60" "<>setpagedevice" + Choice "65/65" "<>setpagedevice" + Choice "70/70" "<>setpagedevice" + Choice "75/75" "<>setpagedevice" + Choice "80/80" "<>setpagedevice" + Choice "85/85" "<>setpagedevice" + Choice "90/90" "<>setpagedevice" + Choice "95/95" "<>setpagedevice" + Choice "100/100" "<>setpagedevice" + Choice "105/105" "<>setpagedevice" + Choice "110/110" "<>setpagedevice" + Choice "115/115" "<>setpagedevice" + Choice "120/120" "<>setpagedevice" + Option "zePrintMode/Print Mode" PickOne AnySetup 20.0 + *Choice "Saved/Printer Default" "" + Choice "Tear/Tear-Off" "" + Choice "Peel/Peel-Off" "" + Choice "Rewind/Rewind" "" + Choice "Applicator/Applicator" "" + Choice "Cutter/Cutter" "" + Option "zeTearOffPosition/Tear-Off Adjust Position" PickOne AnySetup 20.0 + *Choice "1000/Printer Default" "<>setpagedevice" + Choice "-120/-120" "<>setpagedevice" + Choice "-115/-115" "<>setpagedevice" + Choice "-110/-110" "<>setpagedevice" + Choice "-105/-105" "<>setpagedevice" + Choice "-100/-100" "<>setpagedevice" + Choice "-95/-95" "<>setpagedevice" + Choice "-90/-90" "<>setpagedevice" + Choice "-85/-85" "<>setpagedevice" + Choice "-80/-80" "<>setpagedevice" + Choice "-75/-75" "<>setpagedevice" + Choice "-70/-70" "<>setpagedevice" + Choice "-65/-65" "<>setpagedevice" + Choice "-60/-60" "<>setpagedevice" + Choice "-55/-55" "<>setpagedevice" + Choice "-50/-50" "<>setpagedevice" + Choice "-45/-45" "<>setpagedevice" + Choice "-40/-40" "<>setpagedevice" + Choice "-35/-35" "<>setpagedevice" + Choice "-30/-30" "<>setpagedevice" + Choice "-25/-25" "<>setpagedevice" + Choice "-20/-20" "<>setpagedevice" + Choice "-15/-15" "<>setpagedevice" + Choice "-10/-10" "<>setpagedevice" + Choice "-5/-5" "<>setpagedevice" + Choice "0/0" "<>setpagedevice" + Choice "5/5" "<>setpagedevice" + Choice "10/10" "<>setpagedevice" + Choice "15/15" "<>setpagedevice" + Choice "20/20" "<>setpagedevice" + Choice "25/25" "<>setpagedevice" + Choice "30/30" "<>setpagedevice" + Choice "35/35" "<>setpagedevice" + Choice "40/40" "<>setpagedevice" + Choice "45/45" "<>setpagedevice" + Choice "50/50" "<>setpagedevice" + Choice "55/55" "<>setpagedevice" + Choice "60/60" "<>setpagedevice" + Choice "65/65" "<>setpagedevice" + Choice "70/70" "<>setpagedevice" + Choice "75/75" "<>setpagedevice" + Choice "80/80" "<>setpagedevice" + Choice "85/85" "<>setpagedevice" + Choice "90/90" "<>setpagedevice" + Choice "95/95" "<>setpagedevice" + Choice "100/100" "<>setpagedevice" + Choice "105/105" "<>setpagedevice" + Choice "110/110" "<>setpagedevice" + Choice "115/115" "<>setpagedevice" + Choice "120/120" "<>setpagedevice" + Option "zeErrorReprint/Reprint After Error" PickOne AnySetup 20.0 + *Choice "Saved/Printer Default" "" + Choice "Always/Always" "" + Choice "Never/Never" "" + } +} + +// +// End of "$Id: sample.drv 9588 2011-03-07 16:53:16Z mike $". +// diff --git a/ppdc/testcatalog.cxx b/ppdc/testcatalog.cxx new file mode 100644 index 0000000..da64b8e --- /dev/null +++ b/ppdc/testcatalog.cxx @@ -0,0 +1,63 @@ +// +// "$Id: testcatalog.cxx 8487 2009-04-03 23:58:57Z mike $" +// +// Test program for message catalog class. +// +// Copyright 2008 by Apple Inc. +// +// These coded instructions, statements, and computer programs are the +// property of Apple Inc. and are protected by Federal copyright +// law. Distribution and use rights are outlined in the file "LICENSE.txt" +// which should have been included with this file. If this file is +// file is missing or damaged, see the license at "http://www.cups.org/". +// +// Contents: +// +// main() - Open a message catalog +// + +// +// Include necessary headers... +// + +#include "ppdc-private.h" + + +// +// 'main()' - Open a message catalog +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + ppdcCatalog *catalog; // Message catalog + ppdcMessage *m; // Current message + + + if (argc != 2) + { + puts("Usage: testcatalog filename"); + return (1); + } + + // Scan the command-line... + catalog = new ppdcCatalog(NULL, argv[1]); + + printf("%s: %d messages\n", argv[1], catalog->messages->count); + + for (m = (ppdcMessage *)catalog->messages->first(); + m; + m = (ppdcMessage *)catalog->messages->next()) + printf("%s: %s\n", m->id->value, m->string->value); + + catalog->release(); + + // Return with no errors. + return (0); +} + + +// +// End of "$Id: testcatalog.cxx 8487 2009-04-03 23:58:57Z mike $". +// diff --git a/scheduler/Dependencies b/scheduler/Dependencies new file mode 100644 index 0000000..5be01ff --- /dev/null +++ b/scheduler/Dependencies @@ -0,0 +1,361 @@ +# DO NOT DELETE + +auth.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +auth.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +auth.o: ../cups/language.h ../cups/string-private.h ../config.h +auth.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +auth.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +auth.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +auth.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +auth.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +auth.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +auth.o: statbuf.h cert.h auth.h client.h policy.h printers.h +auth.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +auth.o: network.h subscriptions.h +banners.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +banners.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +banners.o: ../cups/language.h ../cups/string-private.h ../config.h +banners.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +banners.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +banners.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +banners.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +banners.o: ../cups/transcode.h ../cups/thread-private.h +banners.o: ../cups/file-private.h ../cups/cups-private.h mime.h +banners.o: ../cups/array.h ../cups/file.h sysman.h statbuf.h cert.h auth.h +banners.o: client.h policy.h printers.h ../cups/pwg-private.h classes.h job.h +banners.o: conf.h banners.h dirsvc.h network.h subscriptions.h ../cups/dir.h +cert.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cert.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +cert.o: ../cups/language.h ../cups/string-private.h ../config.h +cert.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +cert.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +cert.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +cert.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +cert.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +cert.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +cert.o: statbuf.h cert.h auth.h client.h policy.h printers.h +cert.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +cert.o: network.h subscriptions.h +classes.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +classes.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +classes.o: ../cups/language.h ../cups/string-private.h ../config.h +classes.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +classes.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +classes.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +classes.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +classes.o: ../cups/transcode.h ../cups/thread-private.h +classes.o: ../cups/file-private.h ../cups/cups-private.h mime.h +classes.o: ../cups/array.h ../cups/file.h sysman.h statbuf.h cert.h auth.h +classes.o: client.h policy.h printers.h ../cups/pwg-private.h classes.h job.h +classes.o: conf.h banners.h dirsvc.h network.h subscriptions.h +client.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +client.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +client.o: ../cups/language.h ../cups/string-private.h ../config.h +client.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +client.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +client.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +client.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +client.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +client.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +client.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +client.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +client.o: network.h subscriptions.h +conf.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +conf.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +conf.o: ../cups/language.h ../cups/string-private.h ../config.h +conf.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +conf.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +conf.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +conf.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +conf.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +conf.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +conf.o: statbuf.h cert.h auth.h client.h policy.h printers.h +conf.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +conf.o: network.h subscriptions.h +dirsvc.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +dirsvc.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +dirsvc.o: ../cups/language.h ../cups/string-private.h ../config.h +dirsvc.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +dirsvc.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +dirsvc.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +dirsvc.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +dirsvc.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +dirsvc.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +dirsvc.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +dirsvc.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +dirsvc.o: network.h subscriptions.h +env.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +env.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +env.o: ../cups/language.h ../cups/string-private.h ../config.h +env.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +env.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +env.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +env.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +env.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +env.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +env.o: statbuf.h cert.h auth.h client.h policy.h printers.h +env.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +env.o: network.h subscriptions.h +file.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +file.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +file.o: ../cups/language.h ../cups/string-private.h ../config.h +file.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +file.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +file.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +file.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +file.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +file.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +file.o: statbuf.h cert.h auth.h client.h policy.h printers.h +file.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +file.o: network.h subscriptions.h ../cups/dir.h +main.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +main.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +main.o: ../cups/language.h ../cups/string-private.h ../config.h +main.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +main.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +main.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +main.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +main.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +main.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +main.o: statbuf.h cert.h auth.h client.h policy.h printers.h +main.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +main.o: network.h subscriptions.h +ipp.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +ipp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +ipp.o: ../cups/language.h ../cups/string-private.h ../config.h +ipp.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +ipp.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +ipp.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +ipp.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +ipp.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +ipp.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +ipp.o: statbuf.h cert.h auth.h client.h policy.h printers.h +ipp.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +ipp.o: network.h subscriptions.h ../cups/ppd-private.h +listen.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +listen.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +listen.o: ../cups/language.h ../cups/string-private.h ../config.h +listen.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +listen.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +listen.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +listen.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +listen.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +listen.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +listen.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +listen.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +listen.o: network.h subscriptions.h +job.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +job.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +job.o: ../cups/language.h ../cups/string-private.h ../config.h +job.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +job.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +job.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +job.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +job.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +job.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +job.o: statbuf.h cert.h auth.h client.h policy.h printers.h +job.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +job.o: network.h subscriptions.h ../cups/backend.h ../cups/dir.h +log.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +log.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +log.o: ../cups/language.h ../cups/string-private.h ../config.h +log.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +log.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +log.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +log.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +log.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +log.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h sysman.h +log.o: statbuf.h cert.h auth.h client.h policy.h printers.h +log.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +log.o: network.h subscriptions.h +network.o: ../cups/http-private.h ../config.h ../cups/http.h +network.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h +network.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +network.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +network.o: ../cups/language.h ../cups/string-private.h +network.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +network.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +network.o: ../cups/http-private.h ../cups/language-private.h +network.o: ../cups/transcode.h ../cups/thread-private.h +network.o: ../cups/file-private.h ../cups/cups-private.h mime.h +network.o: ../cups/array.h ../cups/file.h sysman.h statbuf.h cert.h auth.h +network.o: client.h policy.h printers.h ../cups/pwg-private.h classes.h job.h +network.o: conf.h banners.h dirsvc.h network.h subscriptions.h +policy.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +policy.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +policy.o: ../cups/language.h ../cups/string-private.h ../config.h +policy.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +policy.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +policy.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +policy.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +policy.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +policy.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +policy.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +policy.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +policy.o: network.h subscriptions.h +printers.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +printers.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +printers.o: ../cups/language.h ../cups/string-private.h ../config.h +printers.o: ../cups/debug-private.h ../cups/versioning.h +printers.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +printers.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +printers.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +printers.o: ../cups/language-private.h ../cups/transcode.h +printers.o: ../cups/thread-private.h ../cups/file-private.h +printers.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +printers.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +printers.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +printers.o: network.h subscriptions.h ../cups/dir.h +process.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +process.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +process.o: ../cups/language.h ../cups/string-private.h ../config.h +process.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +process.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +process.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +process.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +process.o: ../cups/transcode.h ../cups/thread-private.h +process.o: ../cups/file-private.h ../cups/cups-private.h mime.h +process.o: ../cups/array.h ../cups/file.h sysman.h statbuf.h cert.h auth.h +process.o: client.h policy.h printers.h ../cups/pwg-private.h classes.h job.h +process.o: conf.h banners.h dirsvc.h network.h subscriptions.h +quotas.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +quotas.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +quotas.o: ../cups/language.h ../cups/string-private.h ../config.h +quotas.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +quotas.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +quotas.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +quotas.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +quotas.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +quotas.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +quotas.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +quotas.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +quotas.o: network.h subscriptions.h +select.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +select.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +select.o: ../cups/language.h ../cups/string-private.h ../config.h +select.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +select.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +select.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +select.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +select.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +select.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +select.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +select.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +select.o: network.h subscriptions.h +server.o: ../cups/http-private.h ../config.h ../cups/http.h +server.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h cupsd.h +server.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +server.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +server.o: ../cups/language.h ../cups/string-private.h ../cups/debug-private.h +server.o: ../cups/versioning.h ../cups/ppd-private.h ../cups/ppd.h +server.o: ../cups/cups.h ../cups/pwg-private.h ../cups/http-private.h +server.o: ../cups/language-private.h ../cups/transcode.h +server.o: ../cups/thread-private.h ../cups/file-private.h +server.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +server.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +server.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +server.o: network.h subscriptions.h +statbuf.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +statbuf.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +statbuf.o: ../cups/language.h ../cups/string-private.h ../config.h +statbuf.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +statbuf.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +statbuf.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +statbuf.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +statbuf.o: ../cups/transcode.h ../cups/thread-private.h +statbuf.o: ../cups/file-private.h ../cups/cups-private.h mime.h +statbuf.o: ../cups/array.h ../cups/file.h sysman.h statbuf.h cert.h auth.h +statbuf.o: client.h policy.h printers.h ../cups/pwg-private.h classes.h job.h +statbuf.o: conf.h banners.h dirsvc.h network.h subscriptions.h +subscriptions.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +subscriptions.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +subscriptions.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +subscriptions.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +subscriptions.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +subscriptions.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +subscriptions.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +subscriptions.o: ../cups/language-private.h ../cups/transcode.h +subscriptions.o: ../cups/thread-private.h ../cups/file-private.h +subscriptions.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +subscriptions.o: sysman.h statbuf.h cert.h auth.h client.h policy.h +subscriptions.o: printers.h ../cups/pwg-private.h classes.h job.h conf.h +subscriptions.o: banners.h dirsvc.h network.h subscriptions.h +sysman.o: cupsd.h ../cups/cups-private.h ../cups/cups.h ../cups/file.h +sysman.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +sysman.o: ../cups/language.h ../cups/string-private.h ../config.h +sysman.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +sysman.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +sysman.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +sysman.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +sysman.o: ../cups/transcode.h ../cups/thread-private.h ../cups/file-private.h +sysman.o: ../cups/cups-private.h mime.h ../cups/array.h ../cups/file.h +sysman.o: sysman.h statbuf.h cert.h auth.h client.h policy.h printers.h +sysman.o: ../cups/pwg-private.h classes.h job.h conf.h banners.h dirsvc.h +sysman.o: network.h subscriptions.h +filter.o: ../cups/string-private.h ../config.h ../cups/debug-private.h +filter.o: ../cups/versioning.h mime.h ../cups/array.h ../cups/ipp.h +filter.o: ../cups/file.h +mime.o: ../cups/string-private.h ../config.h ../cups/debug-private.h +mime.o: ../cups/versioning.h ../cups/dir.h ../cups/versioning.h +mime.o: mime-private.h mime.h ../cups/array.h ../cups/ipp.h ../cups/file.h +type.o: ../cups/string-private.h ../config.h ../cups/debug-private.h +type.o: ../cups/versioning.h mime.h ../cups/array.h ../cups/ipp.h +type.o: ../cups/file.h +cupsfilter.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupsfilter.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cupsfilter.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cupsfilter.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cupsfilter.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cupsfilter.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cupsfilter.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cupsfilter.o: ../cups/language-private.h ../cups/transcode.h +cupsfilter.o: ../cups/thread-private.h ../cups/file-private.h +cupsfilter.o: ../cups/cups-private.h ../cups/ppd-private.h mime.h +cupsfilter.o: ../cups/array.h ../cups/file.h +cups-deviced.o: util.h ../cups/array-private.h ../cups/array.h +cups-deviced.o: ../cups/file-private.h ../cups/cups-private.h ../cups/dir.h +cups-deviced.o: ../cups/versioning.h +cups-exec.o: ../cups/string-private.h ../config.h +cups-lpd.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cups-lpd.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +cups-lpd.o: ../cups/language.h ../cups/string-private.h ../config.h +cups-lpd.o: ../cups/debug-private.h ../cups/versioning.h +cups-lpd.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cups-lpd.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cups-lpd.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cups-lpd.o: ../cups/language-private.h ../cups/transcode.h +cups-lpd.o: ../cups/thread-private.h +cups-polld.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cups-polld.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cups-polld.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cups-polld.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cups-polld.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cups-polld.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cups-polld.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cups-polld.o: ../cups/language-private.h ../cups/transcode.h +cups-polld.o: ../cups/thread-private.h +testdirsvc.o: ../cups/cups.h ../cups/file.h ../cups/versioning.h +testdirsvc.o: ../cups/ipp.h ../cups/http.h ../cups/array.h ../cups/language.h +testdirsvc.o: ../cups/string-private.h ../config.h +testlpd.o: ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testlpd.o: ../cups/http.h ../cups/array.h ../cups/language.h +testlpd.o: ../cups/string-private.h ../config.h +testmime.o: ../cups/string-private.h ../config.h ../cups/dir.h +testmime.o: ../cups/versioning.h ../cups/debug-private.h ../cups/versioning.h +testmime.o: ../cups/ppd-private.h mime.h ../cups/array.h ../cups/ipp.h +testmime.o: ../cups/file.h +testspeed.o: ../cups/string-private.h ../config.h ../cups/cups.h +testspeed.o: ../cups/file.h ../cups/versioning.h ../cups/ipp.h ../cups/http.h +testspeed.o: ../cups/array.h ../cups/language.h ../cups/language.h +testspeed.o: ../cups/debug-private.h ../cups/versioning.h +testsub.o: ../cups/cups.h ../cups/file.h ../cups/versioning.h ../cups/ipp.h +testsub.o: ../cups/http.h ../cups/array.h ../cups/language.h +testsub.o: ../cups/debug-private.h ../cups/versioning.h +testsub.o: ../cups/string-private.h ../config.h +util.o: util.h ../cups/array-private.h ../cups/array.h ../cups/file-private.h +util.o: ../cups/cups-private.h +cups-driverd.o: util.h ../cups/array-private.h ../cups/array.h +cups-driverd.o: ../cups/file-private.h ../cups/cups-private.h ../cups/dir.h +cups-driverd.o: ../cups/versioning.h ../cups/transcode.h ../cups/language.h +cups-driverd.o: ../cups/array.h ../cups/ppd-private.h ../ppdc/ppdc.h +cups-driverd.o: ../cups/file.h diff --git a/scheduler/Makefile b/scheduler/Makefile new file mode 100644 index 0000000..765a528 --- /dev/null +++ b/scheduler/Makefile @@ -0,0 +1,582 @@ +# +# "$Id: Makefile 9766 2011-05-11 22:17:34Z mike $" +# +# Scheduler Makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +CUPSDOBJS = \ + auth.o \ + avahi.o \ + banners.o \ + cert.o \ + classes.o \ + client.o \ + conf.o \ + dirsvc.o \ + env.o \ + file.o \ + main.o \ + ipp.o \ + colord.o \ + listen.o \ + job.o \ + log.o \ + network.o \ + policy.o \ + printers.o \ + process.o \ + quotas.o \ + select.o \ + server.o \ + statbuf.o \ + subscriptions.o \ + sysman.o \ + timeout.o +LIBOBJS = \ + filter.o \ + mime.o \ + type.o +COBJS = \ + $(CUPSDOBJS) \ + $(LIBOBJS) \ + cupsfilter.o \ + cups-deviced.o \ + cups-exec.o \ + cups-lpd.o \ + cups-polld.o \ + testdirsvc.o \ + testlpd.o \ + testmime.o \ + testspeed.o \ + testsub.o \ + util.o +CXXOBJS = \ + cups-driverd.o +OBJS = \ + $(COBJS) \ + $(CXXOBJS) +LIBTARGETS = \ + $(LIBCUPSMIME) \ + libcupsmime.a + +UNITTARGETS = \ + testdirsvc \ + testlpd \ + testmime \ + testspeed \ + testsub + +PROGRAMS = \ + cupsd \ + cupsfilter \ + cups-deviced \ + cups-driverd \ + cups-exec \ + cups-lpd \ + cups-polld + +TARGETS = \ + $(LIBTARGETS) \ + $(PROGRAMS) + + +# +# Make everything... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: $(LIBTARGETS) + + +# +# Make unit tests... +# + +unittests: $(UNITTARGETS) + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) + $(RM) $(TARGETS) $(UNITTARGETS) convert + $(RM) libcupsmime.so libcupsmime.sl libcupsmime.dylib + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(COBJS:.o=.c) \ + $(CXXOBJS:.o=.cxx) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + echo Creating $(SERVERBIN)/driver... + $(INSTALL_DIR) -m 755 $(SERVERBIN)/driver + echo Creating $(SERVERROOT)... + $(INSTALL_DIR) -m 755 -g $(CUPS_GROUP) $(SERVERROOT) + echo Creating $(SERVERROOT)/interfaces... + $(INSTALL_DIR) -m 755 -g $(CUPS_GROUP) $(SERVERROOT)/interfaces + echo Creating $(SERVERROOT)/ppd... + $(INSTALL_DIR) -m 755 -g $(CUPS_GROUP) $(SERVERROOT)/ppd + if test "x`uname`" != xDarwin; then \ + echo Creating $(SERVERROOT)/ssl...; \ + $(INSTALL_DIR) -m 700 -g $(CUPS_GROUP) $(SERVERROOT)/ssl; \ + fi + if test "$(STATEDIR)" != "$(SERVERROOT)"; then \ + echo Creating $(STATEDIR)...; \ + $(INSTALL_DIR) -m 755 $(STATEDIR); \ + fi + echo Creating $(STATEDIR)/certs... + $(INSTALL_DIR) -m 511 -o $(CUPS_USER) -g $(CUPS_PRIMARY_SYSTEM_GROUP) \ + $(STATEDIR)/certs + echo Creating $(LOGDIR)... + $(INSTALL_DIR) -m 755 $(LOGDIR) + echo Creating $(REQUESTS)... + $(INSTALL_DIR) -m 710 -g $(CUPS_GROUP) $(REQUESTS) + echo Creating $(REQUESTS)/tmp... + $(INSTALL_DIR) -m 1770 -g $(CUPS_GROUP) $(REQUESTS)/tmp + echo Creating $(CACHEDIR)... + $(INSTALL_DIR) -m 775 -g $(CUPS_GROUP) $(CACHEDIR) + if test "x$(INITDIR)" != x; then \ + echo Installing init scripts...; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/init.d; \ + $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDIR)/init.d/cups; \ + for level in $(RCLEVELS); do \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \ + $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/S$(RCSTART)cups; \ + if test `uname` = HP-UX; then \ + level=`expr $$level - 1`; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc$${level}.d; \ + fi; \ + $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc$${level}.d/K$(RCSTOP)cups; \ + done; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(INITDIR)/rc0.d; \ + $(LN) ../init.d/cups $(BUILDROOT)$(INITDIR)/rc0.d/K$(RCSTOP)cups; \ + fi + if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \ + $(INSTALL_DIR) $(BUILDROOT)$(INITDDIR); \ + if test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \ + echo Installing LaunchDaemons configuration files...; \ + $(INSTALL_DATA) org.cups.cupsd.plist $(BUILDROOT)$(DEFAULT_LAUNCHD_CONF); \ + $(INSTALL_DATA) org.cups.cups-lpd.plist $(BUILDROOT)/System/Library/LaunchDaemons; \ + else \ + echo Installing RC script...; \ + $(INSTALL_SCRIPT) cups.sh $(BUILDROOT)$(INITDDIR)/cups; \ + fi \ + fi + if test "x$(SMFMANIFESTDIR)" != x; then \ + echo Installing SMF manifest in $(SMFMANIFESTDIR)...;\ + $(INSTALL_DIR) $(BUILDROOT)/$(SMFMANIFESTDIR); \ + $(INSTALL_SCRIPT) cups.xml $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \ + fi + if test "x$(XINETD)" != x; then \ + echo Installing xinetd configuration file for cups-lpd...; \ + $(INSTALL_DIR) -m 755 $(BUILDROOT)$(XINETD); \ + $(INSTALL_DATA) cups-lpd.xinetd $(BUILDROOT)$(XINETD)/cups-lpd; \ + fi + + +# +# Install programs... +# + +install-exec: + echo Installing programs in $(SBINDIR)... + $(INSTALL_DIR) -m 755 $(SBINDIR) + $(INSTALL_BIN) -m 500 cupsd $(SBINDIR) + $(INSTALL_BIN) cupsfilter $(SBINDIR) + -if test "x`uname`" = xDarwin; then \ + $(INSTALL_DIR) $(BUILDROOT)/System/Library/Printers/Libraries; \ + $(LN) $(sbindir)/cupsfilter $(BUILDROOT)/System/Library/Printers/Libraries/convert; \ + fi + echo Installing programs in $(SERVERBIN)/daemon... + $(INSTALL_DIR) -m 755 $(SERVERBIN) + $(INSTALL_DIR) -m 755 $(SERVERBIN)/daemon + $(INSTALL_BIN) cups-deviced $(SERVERBIN)/daemon + $(INSTALL_BIN) cups-driverd $(SERVERBIN)/daemon + $(INSTALL_BIN) cups-exec $(SERVERBIN)/daemon + $(INSTALL_BIN) cups-lpd $(SERVERBIN)/daemon + $(INSTALL_BIN) cups-polld $(SERVERBIN)/daemon + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(PROGRAMS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + echo Installing header files in $(INCLUDEDIR)/cups... + $(INSTALL_DIR) -m 755 $(INCLUDEDIR)/cups + $(INSTALL_DATA) mime.h $(INCLUDEDIR)/cups + + +# +# Install libraries... +# + +install-libs: $(INSTALLSTATIC) + echo Installing libraries in $(LIBDIR)... + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) $(LIBCUPSMIME) $(LIBDIR) + if test $(LIBCUPSMIME) = "libcupsmime.so.1" -o $(LIBCUPSMIME) = "libcupsmime.sl.1"; then \ + $(RM) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \ + $(LN) $(LIBCUPSMIME) $(LIBDIR)/`basename $(LIBCUPSMIME) .1`; \ + fi + if test $(LIBCUPSMIME) = "libcupsmime.1.dylib"; then \ + $(RM) $(LIBDIR)/libcupsmime.dylib; \ + $(LN) $(LIBCUPSMIME) $(LIBDIR)/libcupsmime.dylib; \ + fi + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(LIBCUPSMIME) $(SYMROOT); \ + fi + +installstatic: + $(INSTALL_DIR) -m 755 $(LIBDIR) + $(INSTALL_LIB) -m 755 libcupsmime.a $(LIBDIR) + $(RANLIB) $(LIBDIR)/libcupsmime.a + $(CHMOD) 555 $(LIBDIR)/libcupsmime.a + + +# +# Uninstall the scheduler... +# + +uninstall: + $(RM) $(SBINDIR)/cupsd + $(RM) $(SBINDIR)/cupsfilter + $(RM) $(SERVERBIN)/daemon/cups-deviced + $(RM) $(SERVERBIN)/daemon/cups-driverd + $(RM) $(SERVERBIN)/daemon/cups-exec + $(RM) $(SERVERBIN)/daemon/cups-lpd + $(RM) $(SERVERBIN)/daemon/cups-polld + $(RM) $(BUILDROOT)/System/Library/Printers/Libraries/convert + -$(RMDIR) $(STATEDIR)/certs + -$(RMDIR) $(STATEDIR) + -$(RMDIR) $(SERVERROOT)/ppd + -$(RMDIR) $(SERVERROOT)/interfaces + -$(RMDIR) $(SERVERROOT) + -$(RMDIR) $(SERVERBIN)/driver + -$(RMDIR) $(SERVERBIN)/daemon + -$(RMDIR) $(SERVERBIN) + -$(RMDIR) $(SBINDIR) + -$(RMDIR) $(REQUESTS)/tmp + -$(RMDIR) $(REQUESTS) + -$(RMDIR) $(LOGDIR) + -$(RMDIR) $(CACHEDIR) + $(RM) $(LIBDIR)/libcupsmime.1.dylib + $(RM) $(LIBDIR)/libcupsmime.a + $(RM) $(LIBDIR)/libcupsmime.dylib + $(RM) $(LIBDIR)/libcupsmime_s.a + $(RM) $(LIBDIR)/libcupsmime.sl + $(RM) $(LIBDIR)/libcupsmime.sl.1 + $(RM) $(LIBDIR)/libcupsmime.so + $(RM) $(LIBDIR)/libcupsmime.so.1 + -$(RMDIR) $(LIBDIR) + $(RM) $(INCLUDEDIR)/cups/mime.h + -$(RMDIR) $(INCLUDEDIR)/cups + echo Uninstalling startup script... + if test "x$(INITDIR)" != x; then \ + $(RM) $(BUILDROOT)$(INITDIR)/init.d/cups; \ + $(RMDIR) $(BUILDROOT)$(INITDIR)/init.d; \ + $(RM) $(BUILDROOT)$(INITDIR)/rc0.d/K00cups; \ + $(RMDIR) $(BUILDROOT)$(INITDIR)/rc0.d; \ + $(RM) $(BUILDROOT)$(INITDIR)/rc2.d/S99cups; \ + $(RMDIR) $(BUILDROOT)$(INITDIR)/rc2.d; \ + $(RM) $(BUILDROOT)$(INITDIR)/rc3.d/S99cups; \ + $(RMDIR) $(BUILDROOT)$(INITDIR)/rc3.d; \ + $(RM) $(BUILDROOT)$(INITDIR)/rc5.d/S99cups; \ + $(RMDIR) $(BUILDROOT)$(INITDIR)/rc5.d; \ + fi + if test "x$(INITDIR)" = x -a "x$(INITDDIR)" != x; then \ + if test "$(INITDDIR)" = "/System/Library/StartupItems/PrintingServices"; then \ + $(RM) $(BUILDROOT)$(INITDDIR)/PrintingServices; \ + $(RM) $(BUILDROOT)$(INITDDIR)/StartupParameters.plist; \ + $(RM) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj/Localizable.strings; \ + $(RMDIR) $(BUILDROOT)$(INITDDIR)/Resources/English.lproj; \ + elif test "$(INITDDIR)" = "/System/Library/LaunchDaemons"; then \ + $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cupsd.plist; \ + $(RM) $(BUILDROOT)$(INITDDIR)/org.cups.cups-lpd.plist; \ + $(RMDIR) $(BUILDROOT)/System/Library/StartupItems/PrintingServices; \ + else \ + $(INSTALL_SCRIPT) init/cups.sh $(BUILDROOT)$(INITDDIR)/cups; \ + fi \ + $(RMDIR) $(BUILDROOT)$(INITDDIR); \ + fi + if test "x$(SMFMANIFESTDIR)" != x; then \ + echo Uninstalling SMF manifest in $(SMFMANIFESTDIR)...;\ + $(RM) $(BUILDROOT)$(SMFMANIFESTDIR)/cups.xml; \ + fi + if test "x$(XINETD)" != x; then \ + echo Uninstalling xinetd configuration file for cups-lpd...; \ + $(RM) $(BUILDROOT)$(XINETD)/cups-lpd; \ + fi + + +# +# Automatic API help files... +# + +apihelp: + mxmldoc --section "Programming" \ + --title "MIME API" \ + --css ../doc/cups-printable.css \ + --header api-mime.header --intro api-mime.shtml \ + mime.h $(LIBOBJS:.o=.c) >../doc/help/api-mime.html + mxmldoc --tokens help/api-mime.html api-mime.xml >../doc/help/api-mime.tokens + $(RM) api-mime.xml + +framedhelp: + mxmldoc --framed api-mime \ + --section "Programming" \ + --title "MIME API" \ + --css ../doc/cups-printable.css \ + --header api-mime.header --intro api-mime.shtml \ + mime.h $(LIBOBJS:.o=.c) + + +# +# Make the scheduler executable, "cupsd". +# + +cupsd: $(CUPSDOBJS) $(LIBCUPSMIME) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsd $(CUPSDOBJS) -L. -lcupsmime \ + $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \ + $(LIBPAPER) $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBS) \ + $(LIBGSSAPI) $(LIBWRAP) + +cupsd-static: $(CUPSDOBJS) libcupsmime.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsd-static $(CUPSDOBJS) libcupsmime.a \ + $(LIBZ) $(SSLLIBS) $(LIBSLP) $(LIBLDAP) $(PAMLIBS) \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(LIBPAPER) \ + $(LIBMALLOC) $(SERVERLIBS) $(DNSSDLIBS) $(LIBGSSAPI) \ + $(LIBWRAP) + + +# +# Make the cupsfilter utility. +# + +cupsfilter: cupsfilter.o $(LIBCUPSMIME) ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsfilter cupsfilter.o -L. -lcupsmime $(LIBS) + $(RM) convert + $(LN) cupsfilter convert + + +# +# Make the device daemon, "cups-deviced". +# + +cups-deviced: cups-deviced.o util.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cups-deviced cups-deviced.o util.o $(LIBS) + + +# +# Make the driver daemon, "cups-driverd". +# + +cups-driverd: cups-driverd.o util.o ../cups/$(LIBCUPS) ../ppdc/$(LIBCUPSPPDC) + echo Linking $@... + $(CXX) $(LDFLAGS) -o cups-driverd cups-driverd.o util.o \ + -L../ppdc -lcupsppdc $(LIBS) + + +# +# Make the sandbox execution helper, "cups-exec". +# + +cups-exec: cups-exec.o + echo Linking $@... + $(CC) $(LDFLAGS) -o cups-exec cups-exec.o $(LIBS) + + +# +# Make the line printer daemon, "cups-lpd". +# + +cups-lpd: cups-lpd.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cups-lpd cups-lpd.o $(LIBS) + + +# +# Make the polling daemon, "cups-polld". +# + +cups-polld: cups-polld.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cups-polld cups-polld.o $(LIBS) + + +# +# libcupsmime.so.1, libcupsmime.sl.1 +# + +libcupsmime.so.1 libcupsmime.sl.1: $(LIBOBJS) + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS) $(LIBS) + $(RM) `basename $@ .1` + $(LN) $@ `basename $@ .1` + + +# +# libcupsmime.1.dylib +# + +libcupsmime.1.dylib: $(LIBOBJS) libcupsmime.exp + echo Linking $@... + $(DSO) $(ARCHFLAGS) $(DSOFLAGS) -o $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.0.0 \ + -compatibility_version 1.0.0 \ + -exported_symbols_list libcupsmime.exp \ + $(LIBOBJS) $(LIBS) + $(RM) libcupsmime.dylib + $(LN) $@ libcupsmime.dylib + + +# +# libcupsmime_s.a +# + +libcupsmime_s.a: $(LIBOBJS) + echo Creating $@... + $(DSO) $(DSOFLAGS) -o libcupsmime_s.o $(LIBOBJS) $(LIBS) + $(RM) $@ + $(AR) $(ARFLAGS) $@ libcupsmime_s.o + + +# +# libcupsmime.la +# + +libcupsmime.la: $(LIBOBJS) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(DSOFLAGS) -o $@ $(LIBOBJS:.o=.lo) -rpath $(LIBDIR) \ + -version-info 1:0 $(LIBS) + + +# +# libcupsmime.a +# + +libcupsmime.a: $(LIBOBJS) + echo Archiving $@... + $(RM) $@ + $(AR) $(ARFLAGS) $@ $(LIBOBJS) + $(RANLIB) $@ + + +# +# Make the test program, "testdirsvc". +# + +testdirsvc: testdirsvc.o + echo Linking $@... + $(CC) $(LDFLAGS) -o testdirsvc testdirsvc.o $(COMMONLIBS) $(NETLIBS) + + +# +# Make the test program, "testlpd". +# + +testlpd: testlpd.o ../cups/$(LIBCUPSSTATIC) cups-lpd + echo Linking $@... + $(CC) $(LDFLAGS) -o testlpd testlpd.o ../cups/$(LIBCUPSSTATIC) \ + $(COMMONLIBS) $(LIBZ) $(SSLLIBS) $(DNSSDLIBS) $(LIBGSSAPI) + + +# +# testmime +# + +testmime: testmime.o libcupsmime.a ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(ARCHFLAGS) $(LDFLAGS) -o $@ testmime.o libcupsmime.a \ + ../cups/$(LIBCUPSSTATIC) $(COMMONLIBS) $(LIBZ) $(SSLLIBS) \ + $(DNSSDLIBS) $(LIBGSSAPI) + echo Running MIME tests... + ./testmime + + +# +# Make the test program, "testspeed". +# + +testspeed: testspeed.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o testspeed testspeed.o ../cups/$(LIBCUPSSTATIC) \ + $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) $(LIBGSSAPI) + + +# +# Make the test program, "testsub". +# + +testsub: testsub.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o testsub testsub.o ../cups/$(LIBCUPSSTATIC) \ + $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) $(LIBGSSAPI) + + +# +# Lines of code computation... +# + +sloc: + echo "cupsd: \c" + sloccount $(CUPSDOBJS:.o=.c) $(LIBOBJS:.o=.c) cups-driverd.cxx cups-polld.c cups-lpd.c 2>/dev/null | grep "Total Physical" | awk '{print $$9}' + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 9766 2011-05-11 22:17:34Z mike $". +# diff --git a/scheduler/api-mime.header b/scheduler/api-mime.header new file mode 100644 index 0000000..8d5db2a --- /dev/null +++ b/scheduler/api-mime.header @@ -0,0 +1,34 @@ + + +

MIME API

+ +
+ + + + + + + + + + + + + + + + +
Headercups/mime.h
Library-lcupsmime
See AlsoProgramming: Introduction to CUPS Programming
diff --git a/scheduler/api-mime.shtml b/scheduler/api-mime.shtml new file mode 100644 index 0000000..7d3125f --- /dev/null +++ b/scheduler/api-mime.shtml @@ -0,0 +1,17 @@ + + +

Overview

+ +

The MIME API provides file typing and conversion services for CUPS.

diff --git a/scheduler/auth.c b/scheduler/auth.c new file mode 100644 index 0000000..d2aeb40 --- /dev/null +++ b/scheduler/auth.c @@ -0,0 +1,2586 @@ +/* + * "$Id: auth.c 9949 2011-08-31 04:58:33Z mike $" + * + * Authorization routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * This file contains Kerberos support code, copyright 2006 by + * Jelmer Vernooij. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddIPMask() - Add an IP address authorization mask. + * cupsdAddLocation() - Add a location for authorization. + * cupsdAddName() - Add a name to a location... + * cupsdAddNameMask() - Add a host or interface name authorization + * mask. + * cupsdAuthorize() - Validate any authorization credentials. + * cupsdCheckAccess() - Check whether the given address is allowed to + * access a location. + * cupsdCheckAuth() - Check authorization masks. + * cupsdCheckGroup() - Check for a user's group membership. + * cupsdCopyLocation() - Make a copy of a location... + * cupsdDeleteAllLocations() - Free all memory used for location + * authorization. + * cupsdFindBest() - Find the location entry that best matches the + * resource. + * cupsdFindLocation() - Find the named location. + * cupsdFreeLocation() - Free all memory used by a location. + * cupsdIsAuthorized() - Check to see if the user is authorized... + * cupsdNewLocation() - Create a new location for authorization. + * check_authref() - Check if an authorization services reference + * has the supplied right. + * compare_locations() - Compare two locations. + * copy_authmask() - Copy function for auth masks. + * cups_crypt() - Encrypt the password using the DES or MD5 + * algorithms, as needed. + * free_authmask() - Free function for auth masks. + * get_md5_password() - Get an MD5 password. + * pam_func() - PAM conversation function. + * to64() - Base64-encode an integer value... + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#ifdef HAVE_SHADOW_H +# include +#endif /* HAVE_SHADOW_H */ +#ifdef HAVE_CRYPT_H +# include +#endif /* HAVE_CRYPT_H */ +#if HAVE_LIBPAM +# ifdef HAVE_PAM_PAM_APPL_H +# include +# else +# include +# endif /* HAVE_PAM_PAM_APPL_H */ +#endif /* HAVE_LIBPAM */ +#ifdef HAVE_USERSEC_H +# include +#endif /* HAVE_USERSEC_H */ +#ifdef HAVE_MEMBERSHIP_H +# include +#endif /* HAVE_MEMBERSHIP_H */ +#ifdef HAVE_AUTHORIZATION_H +# include +# ifdef HAVE_SECBASEPRIV_H +# include +# else +extern const char *cssmErrorString(int error); +# endif /* HAVE_SECBASEPRIV_H */ +#endif /* HAVE_AUTHORIZATION_H */ +#ifdef HAVE_SYS_PARAM_H +# include +#endif /* HAVE_SYS_PARAM_H */ +#ifdef HAVE_SYS_UCRED_H +# include +typedef struct xucred cupsd_ucred_t; +# define CUPSD_UCRED_UID(c) (c).cr_uid +#else +typedef struct ucred cupsd_ucred_t; +# define CUPSD_UCRED_UID(c) (c).uid +#endif /* HAVE_SYS_UCRED_H */ +#ifdef HAVE_KRB5_IPC_CLIENT_SET_TARGET_UID +/* Not in public headers... */ +extern void krb5_ipc_client_set_target_uid(uid_t); +extern void krb5_ipc_client_clear_target(void); +#endif /* HAVE_KRB5_IPC_CLIENT_SET_TARGET_UID */ + + +/* + * Local functions... + */ + +#ifdef HAVE_AUTHORIZATION_H +static int check_authref(cupsd_client_t *con, const char *right); +#endif /* HAVE_AUTHORIZATION_H */ +static int compare_locations(cupsd_location_t *a, + cupsd_location_t *b); +static cupsd_authmask_t *copy_authmask(cupsd_authmask_t *am, void *data); +#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H) +static char *cups_crypt(const char *pw, const char *salt); +#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */ +static void free_authmask(cupsd_authmask_t *am, void *data); +static char *get_md5_password(const char *username, + const char *group, char passwd[33]); +#if HAVE_LIBPAM +static int pam_func(int, const struct pam_message **, + struct pam_response **, void *); +#elif !defined(HAVE_USERSEC_H) +static void to64(char *s, unsigned long v, int n); +#endif /* HAVE_LIBPAM */ + + +/* + * Local structures... + */ + +#if HAVE_LIBPAM +typedef struct cupsd_authdata_s /**** Authentication data ****/ +{ + char username[33], /* Username string */ + password[33]; /* Password string */ +} cupsd_authdata_t; +#endif /* HAVE_LIBPAM */ + + +/* + * Local globals... + */ + +#if defined(__hpux) && HAVE_LIBPAM +static cupsd_authdata_t *auth_data; /* Current client being authenticated */ +#endif /* __hpux && HAVE_LIBPAM */ + + +/* + * 'cupsdAddIPMask()' - Add an IP address authorization mask. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdAddIPMask( + cups_array_t **masks, /* IO - Masks array (created as needed) */ + const unsigned address[4], /* I - IP address */ + const unsigned netmask[4]) /* I - IP netmask */ +{ + cupsd_authmask_t temp; /* New host/domain mask */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddIPMask(masks=%p(%p), address=%x:%x:%x:%x, " + "netmask=%x:%x:%x:%x)", + masks, *masks, + address[0], address[1], address[2], address[3], + netmask[0], netmask[1], netmask[2], netmask[3]); + + temp.type = CUPSD_AUTH_IP; + memcpy(temp.mask.ip.address, address, sizeof(temp.mask.ip.address)); + memcpy(temp.mask.ip.netmask, netmask, sizeof(temp.mask.ip.netmask)); + + /* + * Create the masks array as needed and add... + */ + + if (!*masks) + *masks = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)copy_authmask, + (cups_afree_func_t)free_authmask); + + return (cupsArrayAdd(*masks, &temp)); +} + + +/* + * 'cupsdAddLocation()' - Add a location for authorization. + */ + +void +cupsdAddLocation(cupsd_location_t *loc) /* I - Location to add */ +{ + /* + * Make sure the locations array is created... + */ + + if (!Locations) + Locations = cupsArrayNew3((cups_array_func_t)compare_locations, NULL, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)cupsdFreeLocation); + + if (Locations) + { + cupsArrayAdd(Locations, loc); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddLocation: Added location \"%s\"", + loc->location ? loc->location : "(null)"); + } +} + + +/* + * 'cupsdAddName()' - Add a name to a location... + */ + +void +cupsdAddName(cupsd_location_t *loc, /* I - Location to add to */ + char *name) /* I - Name to add */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddName(loc=%p, name=\"%s\")", + loc, name); + + if (!loc->names) + loc->names = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + if (!cupsArrayAdd(loc->names, name)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to duplicate name for location %s: %s", + loc->location ? loc->location : "nil", strerror(errno)); + return; + } +} + + +/* + * 'cupsdAddNameMask()' - Add a host or interface name authorization mask. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdAddNameMask(cups_array_t **masks, /* IO - Masks array (created as needed) */ + char *name) /* I - Host or interface name */ +{ + cupsd_authmask_t temp; /* New host/domain mask */ + char ifname[32], /* Interface name */ + *ifptr; /* Pointer to end of name */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddNameMask(masks=%p(%p), name=\"%s\")", + masks, *masks, name); + + if (!_cups_strcasecmp(name, "@LOCAL")) + { + /* + * Deny *interface*... + */ + + temp.type = CUPSD_AUTH_INTERFACE; + temp.mask.name.name = (char *)"*"; + } + else if (!_cups_strncasecmp(name, "@IF(", 4)) + { + /* + * Deny *interface*... + */ + + strlcpy(ifname, name + 4, sizeof(ifname)); + + ifptr = ifname + strlen(ifname) - 1; + + if (ifptr >= ifname && *ifptr == ')') + { + ifptr --; + *ifptr = '\0'; + } + + temp.type = CUPSD_AUTH_INTERFACE; + temp.mask.name.name = ifname; + } + else + { + /* + * Deny name... + */ + + if (*name == '*') + name ++; + + temp.type = CUPSD_AUTH_NAME; + temp.mask.name.name = (char *)name; + } + + /* + * Set the name length... + */ + + temp.mask.name.length = strlen(temp.mask.name.name); + + /* + * Create the masks array as needed and add... + */ + + if (!*masks) + *masks = cupsArrayNew3(NULL, NULL, NULL, 0, + (cups_acopy_func_t)copy_authmask, + (cups_afree_func_t)free_authmask); + + return (cupsArrayAdd(*masks, &temp)); +} + + +/* + * 'cupsdAuthorize()' - Validate any authorization credentials. + */ + +void +cupsdAuthorize(cupsd_client_t *con) /* I - Client connection */ +{ + int type; /* Authentication type */ + const char *authorization; /* Pointer into Authorization string */ + char *ptr, /* Pointer into string */ + username[256], /* Username string */ + password[33]; /* Password string */ + cupsd_cert_t *localuser; /* Certificate username */ + char nonce[HTTP_MAX_VALUE], /* Nonce value from client */ + md5[33], /* MD5 password */ + basicmd5[33]; /* MD5 of Basic password */ + static const char * const states[] = /* HTTP client states... */ + { + "WAITING", + "OPTIONS", + "GET", + "GET", + "HEAD", + "POST", + "POST", + "POST", + "PUT", + "PUT", + "DELETE", + "TRACE", + "CLOSE", + "STATUS" + }; + + + /* + * Locate the best matching location so we know what kind of + * authentication to expect... + */ + + con->best = cupsdFindBest(con->uri, con->http.state); + con->type = CUPSD_AUTH_NONE; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAuthorize: con->uri=\"%s\", con->best=%p(%s)", + con->uri, con->best, con->best ? con->best->location : ""); + + if (con->best && con->best->type != CUPSD_AUTH_NONE) + { + if (con->best->type == CUPSD_AUTH_DEFAULT) + type = DefaultAuthType; + else + type = con->best->type; + } + else + type = DefaultAuthType; + + /* + * Decode the Authorization string... + */ + + authorization = httpGetField(&con->http, HTTP_FIELD_AUTHORIZATION); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAuthorize: Authorization=\"%s\"", + authorization); + + username[0] = '\0'; + password[0] = '\0'; + +#ifdef HAVE_GSSAPI + con->gss_uid = 0; +#endif /* HAVE_GSSAPI */ + +#ifdef HAVE_AUTHORIZATION_H + if (con->authref) + { + AuthorizationFree(con->authref, kAuthorizationFlagDefaults); + con->authref = NULL; + } +#endif /* HAVE_AUTHORIZATION_H */ + + if (!*authorization) + { + /* + * No authorization data provided, return early... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: No authentication data provided."); + return; + } +#ifdef HAVE_AUTHORIZATION_H + else if (!strncmp(authorization, "AuthRef ", 8) && + !_cups_strcasecmp(con->http.hostname, "localhost")) + { + OSStatus status; /* Status */ + int authlen; /* Auth string length */ + AuthorizationItemSet *authinfo; /* Authorization item set */ + + /* + * Get the Authorization Services data... + */ + + authorization += 8; + while (isspace(*authorization & 255)) + authorization ++; + + authlen = sizeof(nonce); + httpDecode64_2(nonce, &authlen, authorization); + + if (authlen != kAuthorizationExternalFormLength) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "External Authorization reference size is incorrect!"); + return; + } + + if ((status = AuthorizationCreateFromExternalForm( + (AuthorizationExternalForm *)nonce, &con->authref)) != 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "AuthorizationCreateFromExternalForm returned %d (%s)", + (int)status, cssmErrorString(status)); + return; + } + + username[0] = '\0'; + + if (!AuthorizationCopyInfo(con->authref, kAuthorizationEnvironmentUsername, + &authinfo)) + { + if (authinfo->count == 1 && authinfo->items[0].value && + authinfo->items[0].valueLength >= 2) + { + strlcpy(username, authinfo->items[0].value, sizeof(username)); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as \"%s\" using AuthRef", + username); + } + + AuthorizationFreeItemSet(authinfo); + } + + if (!username[0]) + { + /* + * No username in AuthRef, grab username using peer credentials... + */ + + struct passwd *pwd; /* Password entry for this user */ + cupsd_ucred_t peercred; /* Peer credentials */ + socklen_t peersize; /* Size of peer credentials */ + + peersize = sizeof(peercred); + + if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", + strerror(errno)); + return; + } + + if ((pwd = getpwuid(CUPSD_UCRED_UID(peercred))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to find UID %d for peer credentials.", + (int)CUPSD_UCRED_UID(peercred)); + return; + } + + strlcpy(username, pwd->pw_name, sizeof(username)); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as \"%s\" using " + "AuthRef + PeerCred", username); + } + + con->type = CUPSD_AUTH_BASIC; + } +#endif /* HAVE_AUTHORIZATION_H */ +#if defined(SO_PEERCRED) && defined(AF_LOCAL) + else if (!strncmp(authorization, "PeerCred ", 9) && + con->http.hostaddr->addr.sa_family == AF_LOCAL) + { + /* + * Use peer credentials from domain socket connection... + */ + + struct passwd *pwd; /* Password entry for this user */ + cupsd_ucred_t peercred; /* Peer credentials */ + socklen_t peersize; /* Size of peer credentials */ +#ifdef HAVE_AUTHORIZATION_H + const char *name; /* Authorizing name */ + + for (name = (char *)cupsArrayFirst(con->best->names); + name; + name = (char *)cupsArrayNext(con->best->names)) + if (!_cups_strncasecmp(name, "@AUTHKEY(", 9) || !_cups_strcasecmp(name, "@SYSTEM")) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "PeerCred authentication not allowed for resource."); + return; + } +#endif /* HAVE_AUTHORIZATION_H */ + + if ((pwd = getpwnam(authorization + 9)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "User \"%s\" does not exist.", + authorization + 9); + return; + } + + peersize = sizeof(peercred); + +# ifdef __APPLE__ + if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize)) +# else + if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred, &peersize)) +# endif /* __APPLE__ */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", + strerror(errno)); + return; + } + + if (pwd->pw_uid != CUPSD_UCRED_UID(peercred)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Invalid peer credentials for \"%s\" - got %d, " + "expected %d!", authorization + 9, + CUPSD_UCRED_UID(peercred), pwd->pw_uid); +# ifdef HAVE_SYS_UCRED_H + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAuthorize: cr_version=%d", + peercred.cr_version); + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAuthorize: cr_uid=%d", + peercred.cr_uid); + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAuthorize: cr_ngroups=%d", + peercred.cr_ngroups); + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAuthorize: cr_groups[0]=%d", + peercred.cr_groups[0]); +# endif /* HAVE_SYS_UCRED_H */ + return; + } + + strlcpy(username, authorization + 9, sizeof(username)); + +# ifdef HAVE_GSSAPI + con->gss_uid = CUPSD_UCRED_UID(peercred); +# endif /* HAVE_GSSAPI */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using PeerCred", + username); + + con->type = CUPSD_AUTH_BASIC; + } +#endif /* SO_PEERCRED && AF_LOCAL */ + else if (!strncmp(authorization, "Local", 5) && + !_cups_strcasecmp(con->http.hostname, "localhost")) + { + /* + * Get Local certificate authentication data... + */ + + authorization += 5; + while (isspace(*authorization & 255)) + authorization ++; + + if ((localuser = cupsdFindCert(authorization)) != NULL) + { + strlcpy(username, localuser->username, sizeof(username)); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using Local", + username); + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Local authentication certificate not " + "found!"); + return; + } + +#ifdef HAVE_GSSAPI + if (localuser->ccache) + con->type = CUPSD_AUTH_NEGOTIATE; + else +#endif /* HAVE_GSSAPI */ + con->type = CUPSD_AUTH_BASIC; + } + else if (!strncmp(authorization, "Basic", 5)) + { + /* + * Get the Basic authentication data... + */ + + int userlen; /* Username:password length */ + + + authorization += 5; + while (isspace(*authorization & 255)) + authorization ++; + + userlen = sizeof(username); + httpDecode64_2(username, &userlen, authorization); + + /* + * Pull the username and password out... + */ + + if ((ptr = strchr(username, ':')) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Missing Basic password!"); + return; + } + + *ptr++ = '\0'; + + if (!username[0]) + { + /* + * Username must not be empty... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Empty Basic username!"); + return; + } + + if (!*ptr) + { + /* + * Password must not be empty... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Empty Basic password!"); + return; + } + + strlcpy(password, ptr, sizeof(password)); + + /* + * Validate the username and password... + */ + + switch (type) + { + default : + case CUPSD_AUTH_BASIC : + { +#if HAVE_LIBPAM + /* + * Only use PAM to do authentication. This supports MD5 + * passwords, among other things... + */ + + pam_handle_t *pamh; /* PAM authentication handle */ + int pamerr; /* PAM error code */ + struct pam_conv pamdata;/* PAM conversation data */ + cupsd_authdata_t data; /* Authentication data */ + + + strlcpy(data.username, username, sizeof(data.username)); + strlcpy(data.password, password, sizeof(data.password)); + +# if defined(__sun) || defined(__hpux) + pamdata.conv = (int (*)(int, struct pam_message **, + struct pam_response **, + void *))pam_func; +# else + pamdata.conv = pam_func; +# endif /* __sun || __hpux */ + pamdata.appdata_ptr = &data; + +# ifdef __hpux + /* + * Workaround for HP-UX bug in pam_unix; see pam_func() below for + * more info... + */ + + auth_data = &data; +# endif /* __hpux */ + + pamerr = pam_start("cups", username, &pamdata, &pamh); + if (pamerr != PAM_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: pam_start() returned %d (%s)!", + pamerr, pam_strerror(pamh, pamerr)); + return; + } + +# ifdef HAVE_PAM_SET_ITEM +# ifdef PAM_RHOST + pamerr = pam_set_item(pamh, PAM_RHOST, con->http.hostname); + if (pamerr != PAM_SUCCESS) + cupsdLogMessage(CUPSD_LOG_WARN, + "cupsdAuthorize: pam_set_item(PAM_RHOST) " + "returned %d (%s)!", pamerr, + pam_strerror(pamh, pamerr)); +# endif /* PAM_RHOST */ + +# ifdef PAM_TTY + pamerr = pam_set_item(pamh, PAM_TTY, "cups"); + if (pamerr != PAM_SUCCESS) + cupsdLogMessage(CUPSD_LOG_WARN, + "cupsdAuthorize: pam_set_item(PAM_TTY) " + "returned %d (%s)!", pamerr, + pam_strerror(pamh, pamerr)); +# endif /* PAM_TTY */ +# endif /* HAVE_PAM_SET_ITEM */ + + pamerr = pam_authenticate(pamh, PAM_SILENT); + if (pamerr != PAM_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: pam_authenticate() returned %d " + "(%s)!", + pamerr, pam_strerror(pamh, pamerr)); + pam_end(pamh, 0); + return; + } + +# ifdef HAVE_PAM_SETCRED + pamerr = pam_setcred(pamh, PAM_ESTABLISH_CRED | PAM_SILENT); + if (pamerr != PAM_SUCCESS) + cupsdLogMessage(CUPSD_LOG_WARN, + "cupsdAuthorize: pam_setcred() " + "returned %d (%s)!", pamerr, + pam_strerror(pamh, pamerr)); +# endif /* HAVE_PAM_SETCRED */ + + pamerr = pam_acct_mgmt(pamh, PAM_SILENT); + if (pamerr != PAM_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: pam_acct_mgmt() returned %d " + "(%s)!", + pamerr, pam_strerror(pamh, pamerr)); + pam_end(pamh, 0); + return; + } + + pam_end(pamh, PAM_SUCCESS); + +#elif defined(HAVE_USERSEC_H) + /* + * Use AIX authentication interface... + */ + + char *authmsg; /* Authentication message */ + int reenter; /* ??? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: AIX authenticate of username " + "\"%s\"", username); + + reenter = 1; + if (authenticate(username, password, &reenter, &authmsg) != 0) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Unable to authenticate username " + "\"%s\": %s", + username, strerror(errno)); + return; + } + +#else + /* + * Use normal UNIX password file-based authentication... + */ + + char *pass; /* Encrypted password */ + struct passwd *pw; /* User password data */ +# ifdef HAVE_SHADOW_H + struct spwd *spw; /* Shadow password data */ +# endif /* HAVE_SHADOW_H */ + + + pw = getpwnam(username); /* Get the current password */ + endpwent(); /* Close the password file */ + + if (!pw) + { + /* + * No such user... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Unknown username \"%s\"!", + username); + return; + } + +# ifdef HAVE_SHADOW_H + spw = getspnam(username); + endspent(); + + if (!spw && !strcmp(pw->pw_passwd, "x")) + { + /* + * Don't allow blank passwords! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Username \"%s\" has no shadow " + "password!", username); + return; + } + + if (spw && !spw->sp_pwdp[0] && !pw->pw_passwd[0]) +# else + if (!pw->pw_passwd[0]) +# endif /* HAVE_SHADOW_H */ + { + /* + * Don't allow blank passwords! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Username \"%s\" has no password!", + username); + return; + } + + /* + * OK, the password isn't blank, so compare with what came from the + * client... + */ + + pass = cups_crypt(password, pw->pw_passwd); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAuthorize: pw_passwd=\"%s\", crypt=\"%s\"", + pw->pw_passwd, pass); + + if (!pass || strcmp(pw->pw_passwd, pass)) + { +# ifdef HAVE_SHADOW_H + if (spw) + { + pass = cups_crypt(password, spw->sp_pwdp); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAuthorize: sp_pwdp=\"%s\", crypt=\"%s\"", + spw->sp_pwdp, pass); + + if (pass == NULL || strcmp(spw->sp_pwdp, pass)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Authentication failed for " + "user \"%s\"!", + username); + return; + } + } + else +# endif /* HAVE_SHADOW_H */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Authentication failed for " + "user \"%s\"!", + username); + return; + } + } +#endif /* HAVE_LIBPAM */ + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using Basic", + username); + break; + + case CUPSD_AUTH_BASICDIGEST : + /* + * Do Basic authentication with the Digest password file... + */ + + if (!get_md5_password(username, NULL, md5)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Unknown MD5 username \"%s\"!", + username); + return; + } + + httpMD5(username, "CUPS", password, basicmd5); + + if (strcmp(md5, basicmd5)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Authentication failed for \"%s\"!", + username); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using BasicDigest", + username); + break; + } + + con->type = type; + } + else if (!strncmp(authorization, "Digest", 6)) + { + /* + * Get the username, password, and nonce from the Digest attributes... + */ + + if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "username", + username, sizeof(username)) || !username[0]) + { + /* + * Username must not be empty... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Empty or missing Digest username!"); + return; + } + + if (!httpGetSubField2(&(con->http), HTTP_FIELD_AUTHORIZATION, "response", + password, sizeof(password)) || !password[0]) + { + /* + * Password must not be empty... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Empty or missing Digest password!"); + return; + } + + if (!httpGetSubField(&(con->http), HTTP_FIELD_AUTHORIZATION, "nonce", + nonce)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: No nonce value for Digest " + "authentication!"); + return; + } + + if (strcmp(con->http.hostname, nonce)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Bad nonce value, expected \"%s\", " + "got \"%s\"!", con->http.hostname, nonce); + return; + } + + /* + * Validate the username and password... + */ + + if (!get_md5_password(username, NULL, md5)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Unknown MD5 username \"%s\"!", + username); + return; + } + + httpMD5Final(nonce, states[con->http.state], con->uri, md5); + + if (strcmp(md5, password)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdAuthorize: Authentication failed for \"%s\"!", + username); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using Digest", + username); + + con->type = CUPSD_AUTH_DIGEST; + } +#ifdef HAVE_GSSAPI + else if (!strncmp(authorization, "Negotiate", 9)) + { + int len; /* Length of authorization string */ + gss_ctx_id_t context; /* Authorization context */ + OM_uint32 major_status, /* Major status code */ + minor_status; /* Minor status code */ + gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER, + /* Input token from string */ + output_token = GSS_C_EMPTY_BUFFER; + /* Output token for username */ + gss_name_t client_name; /* Client name */ + + +# ifdef __APPLE__ + /* + * If the weak-linked GSSAPI/Kerberos library is not present, don't try + * to use it... + */ + + if (gss_init_sec_context == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "GSSAPI/Kerberos authentication failed because the " + "Kerberos framework is not present."); + return; + } +# endif /* __APPLE__ */ + + /* + * Find the start of the Kerberos input token... + */ + + authorization += 9; + while (isspace(*authorization & 255)) + authorization ++; + + if (!*authorization) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAuthorize: No authentication data specified."); + return; + } + + /* + * Decode the authorization string to get the input token... + */ + + len = strlen(authorization); + input_token.value = malloc(len); + input_token.value = httpDecode64_2(input_token.value, &len, + authorization); + input_token.length = len; + + /* + * Accept the input token to get the authorization info... + */ + + context = GSS_C_NO_CONTEXT; + client_name = GSS_C_NO_NAME; + major_status = gss_accept_sec_context(&minor_status, + &context, + GSS_C_NO_CREDENTIAL, + &input_token, + GSS_C_NO_CHANNEL_BINDINGS, + &client_name, + NULL, + &output_token, + NULL, + NULL, + NULL); + + if (output_token.length > 0) + gss_release_buffer(&minor_status, &output_token); + + if (GSS_ERROR(major_status)) + { + cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, + "cupsdAuthorize: Error accepting GSSAPI security " + "context"); + + if (context != GSS_C_NO_CONTEXT) + gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER); + return; + } + + con->have_gss = 1; + + /* + * Get the username associated with the client's credentials... + */ + + if (major_status == GSS_S_CONTINUE_NEEDED) + cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, + "cupsdAuthorize: Credentials not complete"); + else if (major_status == GSS_S_COMPLETE) + { + major_status = gss_display_name(&minor_status, client_name, + &output_token, NULL); + + if (GSS_ERROR(major_status)) + { + cupsdLogGSSMessage(CUPSD_LOG_DEBUG, major_status, minor_status, + "cupsdAuthorize: Error getting username"); + gss_release_name(&minor_status, &client_name); + gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER); + return; + } + + strlcpy(username, output_token.value, sizeof(username)); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Authorized as %s using Negotiate", + username); + + gss_release_name(&minor_status, &client_name); + gss_release_buffer(&minor_status, &output_token); + + con->type = CUPSD_AUTH_NEGOTIATE; + } + + gss_delete_sec_context(&minor_status, &context, GSS_C_NO_BUFFER); + +# if defined(SO_PEERCRED) && defined(AF_LOCAL) + /* + * Get the client's UID if we are printing locally - that allows a backend + * to run as the correct user to get Kerberos credentials of its own. + */ + + if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL) + { + cupsd_ucred_t peercred; /* Peer credentials */ + socklen_t peersize; /* Size of peer credentials */ + + peersize = sizeof(peercred); + +# ifdef __APPLE__ + if (getsockopt(con->http.fd, 0, LOCAL_PEERCRED, &peercred, &peersize)) +# else + if (getsockopt(con->http.fd, SOL_SOCKET, SO_PEERCRED, &peercred, + &peersize)) +# endif /* __APPLE__ */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get peer credentials - %s", + strerror(errno)); + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAuthorize: Using credentials for UID %d...", + CUPSD_UCRED_UID(peercred)); + con->gss_uid = CUPSD_UCRED_UID(peercred); + } + } +# endif /* SO_PEERCRED && AF_LOCAL */ + } +#endif /* HAVE_GSSAPI */ + else + { + char scheme[256]; /* Auth scheme... */ + + + if (sscanf(authorization, "%255s", scheme) != 1) + strcpy(scheme, "UNKNOWN"); + + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad authentication data \"%s ...\"", + scheme); + return; + } + + /* + * If we get here, then we were able to validate the username and + * password - copy the validated username and password to the client + * data and return... + */ + + strlcpy(con->username, username, sizeof(con->username)); + strlcpy(con->password, password, sizeof(con->password)); +} + + +/* + * 'cupsdCheckAccess()' - Check whether the given address is allowed to + * access a location. + */ + +int /* O - 1 if allowed, 0 otherwise */ +cupsdCheckAccess( + unsigned ip[4], /* I - Client address */ + char *name, /* I - Client hostname */ + int namelen, /* I - Length of hostname */ + cupsd_location_t *loc) /* I - Location to check */ +{ + int allow; /* 1 if allowed, 0 otherwise */ + + + if (!_cups_strcasecmp(name, "localhost")) + { + /* + * Access from localhost (127.0.0.1 or ::1) is always allowed... + */ + + return (1); + } + else + { + /* + * Do authorization checks on the domain/address... + */ + + switch (loc->order_type) + { + default : + allow = 0; /* anti-compiler-warning-code */ + break; + + case CUPSD_AUTH_ALLOW : /* Order Deny,Allow */ + allow = 1; + + if (cupsdCheckAuth(ip, name, namelen, loc->deny)) + allow = 0; + + if (cupsdCheckAuth(ip, name, namelen, loc->allow)) + allow = 1; + break; + + case CUPSD_AUTH_DENY : /* Order Allow,Deny */ + allow = 0; + + if (cupsdCheckAuth(ip, name, namelen, loc->allow)) + allow = 1; + + if (cupsdCheckAuth(ip, name, namelen, loc->deny)) + allow = 0; + break; + } + } + + return (allow); +} + + +/* + * 'cupsdCheckAuth()' - Check authorization masks. + */ + +int /* O - 1 if mask matches, 0 otherwise */ +cupsdCheckAuth(unsigned ip[4], /* I - Client address */ + char *name, /* I - Client hostname */ + int name_len, /* I - Length of hostname */ + cups_array_t *masks) /* I - Masks */ +{ + int i; /* Looping var */ + cupsd_authmask_t *mask; /* Current mask */ + cupsd_netif_t *iface; /* Network interface */ + unsigned netip4; /* IPv4 network address */ +#ifdef AF_INET6 + unsigned netip6[4]; /* IPv6 network address */ +#endif /* AF_INET6 */ + + + for (mask = (cupsd_authmask_t *)cupsArrayFirst(masks); + mask; + mask = (cupsd_authmask_t *)cupsArrayNext(masks)) + { + switch (mask->type) + { + case CUPSD_AUTH_INTERFACE : + /* + * Check for a match with a network interface... + */ + + netip4 = htonl(ip[3]); + +#ifdef AF_INET6 + netip6[0] = htonl(ip[0]); + netip6[1] = htonl(ip[1]); + netip6[2] = htonl(ip[2]); + netip6[3] = htonl(ip[3]); +#endif /* AF_INET6 */ + + if (!strcmp(mask->mask.name.name, "*")) + { +#ifdef __APPLE__ + /* + * Allow Back-to-My-Mac addresses... + */ + + if ((ip[0] & 0xff000000) == 0xfd000000) + return (1); +#endif /* __APPLE__ */ + + /* + * Check against all local interfaces... + */ + + cupsdNetIFUpdate(); + + for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + iface; + iface = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + { + /* + * Only check local interfaces... + */ + + if (!iface->is_local) + continue; + + if (iface->address.addr.sa_family == AF_INET) + { + /* + * Check IPv4 address... + */ + + if ((netip4 & iface->mask.ipv4.sin_addr.s_addr) == + (iface->address.ipv4.sin_addr.s_addr & + iface->mask.ipv4.sin_addr.s_addr)) + return (1); + } +#ifdef AF_INET6 + else + { + /* + * Check IPv6 address... + */ + + for (i = 0; i < 4; i ++) + if ((netip6[i] & iface->mask.ipv6.sin6_addr.s6_addr32[i]) != + (iface->address.ipv6.sin6_addr.s6_addr32[i] & + iface->mask.ipv6.sin6_addr.s6_addr32[i])) + break; + + if (i == 4) + return (1); + } +#endif /* AF_INET6 */ + } + } + else + { + /* + * Check the named interface... + */ + + for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + iface; + iface = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + { + if (strcmp(mask->mask.name.name, iface->name)) + continue; + + if (iface->address.addr.sa_family == AF_INET) + { + /* + * Check IPv4 address... + */ + + if ((netip4 & iface->mask.ipv4.sin_addr.s_addr) == + (iface->address.ipv4.sin_addr.s_addr & + iface->mask.ipv4.sin_addr.s_addr)) + return (1); + } +#ifdef AF_INET6 + else + { + /* + * Check IPv6 address... + */ + + for (i = 0; i < 4; i ++) + if ((netip6[i] & iface->mask.ipv6.sin6_addr.s6_addr32[i]) != + (iface->address.ipv6.sin6_addr.s6_addr32[i] & + iface->mask.ipv6.sin6_addr.s6_addr32[i])) + break; + + if (i == 4) + return (1); + } +#endif /* AF_INET6 */ + } + } + break; + + case CUPSD_AUTH_NAME : + /* + * Check for exact name match... + */ + + if (!_cups_strcasecmp(name, mask->mask.name.name)) + return (1); + + /* + * Check for domain match... + */ + + if (name_len >= mask->mask.name.length && + mask->mask.name.name[0] == '.' && + !_cups_strcasecmp(name + name_len - mask->mask.name.length, + mask->mask.name.name)) + return (1); + break; + + case CUPSD_AUTH_IP : + /* + * Check for IP/network address match... + */ + + for (i = 0; i < 4; i ++) + if ((ip[i] & mask->mask.ip.netmask[i]) != + mask->mask.ip.address[i]) + break; + + if (i == 4) + return (1); + break; + } + } + + return (0); +} + + +/* + * 'cupsdCheckGroup()' - Check for a user's group membership. + */ + +int /* O - 1 if user is a member, 0 otherwise */ +cupsdCheckGroup( + const char *username, /* I - User name */ + struct passwd *user, /* I - System user info */ + const char *groupname) /* I - Group name */ +{ + int i; /* Looping var */ + struct group *group; /* System group info */ + char junk[33]; /* MD5 password (not used) */ +#ifdef HAVE_MBR_UID_TO_UUID + uuid_t useruuid, /* UUID for username */ + groupuuid; /* UUID for groupname */ + int is_member; /* True if user is a member of group */ +#endif /* HAVE_MBR_UID_TO_UUID */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdCheckGroup(username=\"%s\", user=%p, groupname=\"%s\")", + username, user, groupname); + + /* + * Validate input... + */ + + if (!username || !groupname) + return (0); + + /* + * Check to see if the user is a member of the named group... + */ + + group = getgrnam(groupname); + endgrent(); + + if (group != NULL) + { + /* + * Group exists, check it... + */ + + for (i = 0; group->gr_mem[i]; i ++) + if (!_cups_strcasecmp(username, group->gr_mem[i])) + return (1); + } + + /* + * Group doesn't exist or user not in group list, check the group ID + * against the user's group ID... + */ + + if (user && group && group->gr_gid == user->pw_gid) + return (1); + +#ifdef HAVE_MBR_UID_TO_UUID + /* + * Check group membership through MacOS X membership API... + */ + + if (user && !mbr_uid_to_uuid(user->pw_uid, useruuid)) + { + if (group) + { + /* + * Map group name to UUID and check membership... + */ + + if (!mbr_gid_to_uuid(group->gr_gid, groupuuid)) + if (!mbr_check_membership(useruuid, groupuuid, &is_member)) + if (is_member) + return (1); + } + else if (groupname[0] == '#') + { + /* + * Use UUID directly and check for equality (user UUID) and + * membership (group UUID)... + */ + + if (!uuid_parse((char *)groupname + 1, groupuuid)) + { + if (!uuid_compare(useruuid, groupuuid)) + return (1); + else if (!mbr_check_membership(useruuid, groupuuid, &is_member)) + if (is_member) + return (1); + } + + return (0); + } + } + else if (groupname[0] == '#') + return (0); +#endif /* HAVE_MBR_UID_TO_UUID */ + + /* + * Username not found, group not found, or user is not part of the + * system group... Check for a user and group in the MD5 password + * file... + */ + + if (get_md5_password(username, groupname, junk) != NULL) + return (1); + + /* + * If we get this far, then the user isn't part of the named group... + */ + + return (0); +} + + +/* + * 'cupsdCopyLocation()' - Make a copy of a location... + */ + +cupsd_location_t * /* O - New location */ +cupsdCopyLocation( + cupsd_location_t *loc) /* I - Original location */ +{ + cupsd_location_t *temp; /* New location */ + + + /* + * Make a copy of the original location... + */ + + if ((temp = calloc(1, sizeof(cupsd_location_t))) == NULL) + return (NULL); + + /* + * Copy the information from the original location to the new one. + */ + + if (!loc) + return (temp); + + if (loc->location) + temp->location = _cupsStrAlloc(loc->location); + + temp->limit = loc->limit; + temp->order_type = loc->order_type; + temp->type = loc->type; + temp->level = loc->level; + temp->satisfy = loc->satisfy; + temp->encryption = loc->encryption; + + if (loc->names) + { + if ((temp->names = cupsArrayDup(loc->names)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for %d names: %s", + cupsArrayCount(loc->names), strerror(errno)); + + cupsdFreeLocation(temp); + return (NULL); + } + } + + if (loc->allow) + { + /* + * Copy allow rules... + */ + + if ((temp->allow = cupsArrayDup(loc->allow)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for %d allow rules: %s", + cupsArrayCount(loc->allow), strerror(errno)); + cupsdFreeLocation(temp); + return (NULL); + } + } + + if (loc->deny) + { + /* + * Copy deny rules... + */ + + if ((temp->deny = cupsArrayDup(loc->deny)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for %d deny rules: %s", + cupsArrayCount(loc->deny), strerror(errno)); + cupsdFreeLocation(temp); + return (NULL); + } + } + + return (temp); +} + + +/* + * 'cupsdDeleteAllLocations()' - Free all memory used for location authorization. + */ + +void +cupsdDeleteAllLocations(void) +{ + /* + * Free the location array, which will free all of the locations... + */ + + cupsArrayDelete(Locations); + Locations = NULL; +} + + +/* + * 'cupsdFindBest()' - Find the location entry that best matches the resource. + */ + +cupsd_location_t * /* O - Location that matches */ +cupsdFindBest(const char *path, /* I - Resource path */ + http_state_t state) /* I - HTTP state/request */ +{ + char uri[HTTP_MAX_URI], + /* URI in request... */ + *uriptr; /* Pointer into URI */ + cupsd_location_t *loc, /* Current location */ + *best; /* Best match for location so far */ + int bestlen; /* Length of best match */ + int limit; /* Limit field */ + static const int limits[] = /* Map http_status_t to CUPSD_AUTH_LIMIT_xyz */ + { + CUPSD_AUTH_LIMIT_ALL, + CUPSD_AUTH_LIMIT_OPTIONS, + CUPSD_AUTH_LIMIT_GET, + CUPSD_AUTH_LIMIT_GET, + CUPSD_AUTH_LIMIT_HEAD, + CUPSD_AUTH_LIMIT_POST, + CUPSD_AUTH_LIMIT_POST, + CUPSD_AUTH_LIMIT_POST, + CUPSD_AUTH_LIMIT_PUT, + CUPSD_AUTH_LIMIT_PUT, + CUPSD_AUTH_LIMIT_DELETE, + CUPSD_AUTH_LIMIT_TRACE, + CUPSD_AUTH_LIMIT_ALL, + CUPSD_AUTH_LIMIT_ALL + }; + + + /* + * First copy the connection URI to a local string so we have drop + * any .ppd extension from the pathname in /printers or /classes + * URIs... + */ + + strlcpy(uri, path, sizeof(uri)); + + if (!strncmp(uri, "/printers/", 10) || + !strncmp(uri, "/classes/", 9)) + { + /* + * Check if the URI has .ppd on the end... + */ + + uriptr = uri + strlen(uri) - 4; /* len > 4 if we get here... */ + + if (!strcmp(uriptr, ".ppd")) + *uriptr = '\0'; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: uri = \"%s\"...", uri); + + /* + * Loop through the list of locations to find a match... + */ + + limit = limits[state]; + best = NULL; + bestlen = 0; + + for (loc = (cupsd_location_t *)cupsArrayFirst(Locations); + loc; + loc = (cupsd_location_t *)cupsArrayNext(Locations)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: Location %s Limit %x", + loc->location ? loc->location : "nil", loc->limit); + + if (!strncmp(uri, "/printers/", 10) || !strncmp(uri, "/classes/", 9)) + { + /* + * Use case-insensitive comparison for queue names... + */ + + if (loc->length > bestlen && loc->location && + !_cups_strncasecmp(uri, loc->location, loc->length) && + loc->location[0] == '/' && + (limit & loc->limit) != 0) + { + best = loc; + bestlen = loc->length; + } + } + else + { + /* + * Use case-sensitive comparison for other URIs... + */ + + if (loc->length > bestlen && loc->location && + !strncmp(uri, loc->location, loc->length) && + loc->location[0] == '/' && + (limit & loc->limit) != 0) + { + best = loc; + bestlen = loc->length; + } + } + } + + /* + * Return the match, if any... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindBest: best = %s", + best ? best->location : "NONE"); + + return (best); +} + + +/* + * 'cupsdFindLocation()' - Find the named location. + */ + +cupsd_location_t * /* O - Location that matches */ +cupsdFindLocation(const char *location) /* I - Connection */ +{ + cupsd_location_t key; /* Search key */ + + + key.location = (char *)location; + + return ((cupsd_location_t *)cupsArrayFind(Locations, &key)); +} + + +/* + * 'cupsdFreeLocation()' - Free all memory used by a location. + */ + +void +cupsdFreeLocation(cupsd_location_t *loc)/* I - Location to free */ +{ + cupsArrayDelete(loc->names); + cupsArrayDelete(loc->allow); + cupsArrayDelete(loc->deny); + + _cupsStrFree(loc->location); + free(loc); +} + + +/* + * 'cupsdIsAuthorized()' - Check to see if the user is authorized... + */ + +http_status_t /* O - HTTP_OK if authorized or error code */ +cupsdIsAuthorized(cupsd_client_t *con, /* I - Connection */ + const char *owner)/* I - Owner of object */ +{ + int i, /* Looping vars */ + auth, /* Authorization status */ + type; /* Type of authentication */ + unsigned address[4]; /* Authorization address */ + cupsd_location_t *best; /* Best match for location so far */ + int hostlen; /* Length of hostname */ + char *name, /* Current username */ + username[256], /* Username to authorize */ + ownername[256], /* Owner name to authorize */ + *ptr; /* Pointer into username */ + struct passwd *pw; /* User password data */ + static const char * const levels[] = /* Auth levels */ + { + "ANON", + "USER", + "GROUP" + }; + static const char * const types[] = /* Auth types */ + { + "None", + "Basic", + "Digest", + "BasicDigest", + "Negotiate" + }; + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: con->uri=\"%s\", con->best=%p(%s)", + con->uri, con->best, con->best ? con->best->location ? + con->best->location : "(null)" : ""); + if (owner) + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: owner=\"%s\"", owner); + + /* + * If there is no "best" authentication rule for this request, then + * access is allowed from the local system and denied from other + * addresses... + */ + + if (!con->best) + { + if (!strcmp(con->http.hostname, "localhost") || + !strcmp(con->http.hostname, ServerName)) + return (HTTP_OK); + else + return (HTTP_FORBIDDEN); + } + + best = con->best; + + if ((type = best->type) == CUPSD_AUTH_DEFAULT) + type = DefaultAuthType; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: level=CUPSD_AUTH_%s, type=%s, " + "satisfy=CUPSD_AUTH_SATISFY_%s, num_names=%d", + levels[best->level], types[type], + best->satisfy ? "ANY" : "ALL", cupsArrayCount(best->names)); + + if (best->limit == CUPSD_AUTH_LIMIT_IPP) + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: op=%x(%s)", + best->op, ippOpString(best->op)); + + /* + * Check host/ip-based accesses... + */ + +#ifdef AF_INET6 + if (con->http.hostaddr->addr.sa_family == AF_INET6) + { + /* + * Copy IPv6 address... + */ + + address[0] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0]); + address[1] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1]); + address[2] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]); + address[3] = ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[3]); + } + else +#endif /* AF_INET6 */ + if (con->http.hostaddr->addr.sa_family == AF_INET) + { + /* + * Copy IPv4 address... + */ + + address[0] = 0; + address[1] = 0; + address[2] = 0; + address[3] = ntohl(con->http.hostaddr->ipv4.sin_addr.s_addr); + } + else + memset(address, 0, sizeof(address)); + + hostlen = strlen(con->http.hostname); + + auth = cupsdCheckAccess(address, con->http.hostname, hostlen, best) + ? CUPSD_AUTH_ALLOW : CUPSD_AUTH_DENY; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdIsAuthorized: auth=CUPSD_AUTH_%s...", + auth ? "DENY" : "ALLOW"); + + if (auth == CUPSD_AUTH_DENY && best->satisfy == CUPSD_AUTH_SATISFY_ALL) + return (HTTP_FORBIDDEN); + +#ifdef HAVE_SSL + /* + * See if encryption is required... + */ + + if ((best->encryption >= HTTP_ENCRYPT_REQUIRED && !con->http.tls && + _cups_strcasecmp(con->http.hostname, "localhost") && + best->satisfy == CUPSD_AUTH_SATISFY_ALL) && + !(type == CUPSD_AUTH_NEGOTIATE || + (type == CUPSD_AUTH_NONE && DefaultAuthType == CUPSD_AUTH_NEGOTIATE))) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdIsAuthorized: Need upgrade to TLS..."); + return (HTTP_UPGRADE_REQUIRED); + } +#endif /* HAVE_SSL */ + + /* + * Now see what access level is required... + */ + + if (best->level == CUPSD_AUTH_ANON || /* Anonymous access - allow it */ + (type == CUPSD_AUTH_NONE && cupsArrayCount(best->names) == 0)) + return (HTTP_OK); + + if (!con->username[0] && type == CUPSD_AUTH_NONE && + best->limit == CUPSD_AUTH_LIMIT_IPP) + { + /* + * Check for unauthenticated username... + */ + + ipp_attribute_t *attr; /* requesting-user-name attribute */ + + + attr = ippFindAttribute(con->request, "requesting-user-name", IPP_TAG_NAME); + if (attr) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdIsAuthorized: requesting-user-name=\"%s\"", + attr->values[0].string.text); + strlcpy(username, attr->values[0].string.text, sizeof(username)); + } + else if (best->satisfy == CUPSD_AUTH_SATISFY_ALL || auth == CUPSD_AUTH_DENY) + return (HTTP_UNAUTHORIZED); /* Non-anonymous needs user/pass */ + else + return (HTTP_OK); /* unless overridden with Satisfy */ + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdIsAuthorized: username=\"%s\"", + con->username); + +#ifdef HAVE_AUTHORIZATION_H + if (!con->username[0] && !con->authref) +#else + if (!con->username[0]) +#endif /* HAVE_AUTHORIZATION_H */ + { + if (best->satisfy == CUPSD_AUTH_SATISFY_ALL || auth == CUPSD_AUTH_DENY) + return (HTTP_UNAUTHORIZED); /* Non-anonymous needs user/pass */ + else + return (HTTP_OK); /* unless overridden with Satisfy */ + } + + + if (con->type != type && type != CUPSD_AUTH_NONE && +#ifdef HAVE_GSSAPI + (type != CUPSD_AUTH_NEGOTIATE || con->gss_uid <= 0) && +#endif /* HAVE_GSSAPI */ + (con->type != CUPSD_AUTH_BASIC || type != CUPSD_AUTH_BASICDIGEST)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Authorized using %s, expected %s!", + types[con->type], types[type]); + + return (HTTP_UNAUTHORIZED); + } + + strlcpy(username, con->username, sizeof(username)); + } + + /* + * OK, got a username. See if we need normal user access, or group + * access... (root always matches) + */ + + if (!strcmp(username, "root")) + return (HTTP_OK); + + /* + * Strip any @domain or @KDC from the username and owner... + */ + + if ((ptr = strchr(username, '@')) != NULL) + *ptr = '\0'; + + if (owner) + { + strlcpy(ownername, owner, sizeof(ownername)); + + if ((ptr = strchr(ownername, '@')) != NULL) + *ptr = '\0'; + } + else + ownername[0] = '\0'; + + /* + * Get the user info... + */ + + if (username[0]) + { + pw = getpwnam(username); + endpwent(); + } + else + pw = NULL; + + if (best->level == CUPSD_AUTH_USER) + { + /* + * If there are no names associated with this location, then + * any valid user is OK... + */ + + if (cupsArrayCount(best->names) == 0) + return (HTTP_OK); + + /* + * Otherwise check the user list and return OK if this user is + * allowed... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: Checking user membership..."); + +#ifdef HAVE_AUTHORIZATION_H + /* + * If an authorization reference was supplied it must match a right name... + */ + + if (con->authref) + { + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { + if (!_cups_strncasecmp(name, "@AUTHKEY(", 9) && check_authref(con, name + 9)) + return (HTTP_OK); + else if (!_cups_strcasecmp(name, "@SYSTEM") && SystemGroupAuthKey && + check_authref(con, SystemGroupAuthKey)) + return (HTTP_OK); + } + + return (HTTP_FORBIDDEN); + } +#endif /* HAVE_AUTHORIZATION_H */ + + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { + if (!_cups_strcasecmp(name, "@OWNER") && owner && + !_cups_strcasecmp(username, ownername)) + return (HTTP_OK); + else if (!_cups_strcasecmp(name, "@SYSTEM")) + { + for (i = 0; i < NumSystemGroups; i ++) + if (cupsdCheckGroup(username, pw, SystemGroups[i])) + return (HTTP_OK); + } + else if (name[0] == '@') + { + if (cupsdCheckGroup(username, pw, name + 1)) + return (HTTP_OK); + } + else if (!_cups_strcasecmp(username, name)) + return (HTTP_OK); + } + + return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED); + } + + /* + * Check to see if this user is in any of the named groups... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: Checking group membership..."); + + /* + * Check to see if this user is in any of the named groups... + */ + + for (name = (char *)cupsArrayFirst(best->names); + name; + name = (char *)cupsArrayNext(best->names)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdIsAuthorized: Checking group \"%s\" membership...", + name); + + if (!_cups_strcasecmp(name, "@SYSTEM")) + { + for (i = 0; i < NumSystemGroups; i ++) + if (cupsdCheckGroup(username, pw, SystemGroups[i])) + return (HTTP_OK); + } + else if (cupsdCheckGroup(username, pw, name)) + return (HTTP_OK); + } + + /* + * The user isn't part of the specified group, so deny access... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdIsAuthorized: User not in group(s)!"); + + return (con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED); +} + + +/* + * 'cupsdNewLocation()' - Create a new location for authorization. + * + * Note: Still need to call cupsdAddLocation() to add it to the list of global + * locations. + */ + +cupsd_location_t * /* O - Pointer to new location record */ +cupsdNewLocation(const char *location) /* I - Location path */ +{ + cupsd_location_t *temp; /* New location */ + + + /* + * Try to allocate memory for the new location. + */ + + if ((temp = calloc(1, sizeof(cupsd_location_t))) == NULL) + return (NULL); + + /* + * Initialize the record and copy the name over... + */ + + if ((temp->location = _cupsStrAlloc(location)) == NULL) + { + free(temp); + return (NULL); + } + + temp->length = strlen(temp->location); + + /* + * Return the new record... + */ + + return (temp); +} + + +#ifdef HAVE_AUTHORIZATION_H +/* + * 'check_authref()' - Check if an authorization services reference has the + * supplied right. + */ + +static int /* O - 1 if right is valid, 0 otherwise */ +check_authref(cupsd_client_t *con, /* I - Connection */ + const char *right) /* I - Right name */ +{ + OSStatus status; /* OS Status */ + AuthorizationItem authright; /* Authorization right */ + AuthorizationRights authrights; /* Authorization rights */ + AuthorizationFlags authflags; /* Authorization flags */ + + + /* + * Check to see if the user is allowed to perform the task... + */ + + if (!con->authref) + return (0); + + authright.name = right; + authright.valueLength = 0; + authright.value = NULL; + authright.flags = 0; + + authrights.count = 1; + authrights.items = &authright; + + authflags = kAuthorizationFlagDefaults | + kAuthorizationFlagExtendRights; + + if ((status = AuthorizationCopyRights(con->authref, &authrights, + kAuthorizationEmptyEnvironment, + authflags, NULL)) != 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "AuthorizationCopyRights(\"%s\") returned %d (%s)", + authright.name, (int)status, cssmErrorString(status)); + return (0); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "AuthorizationCopyRights(\"%s\") succeeded!", + authright.name); + + return (1); +} +#endif /* HAVE_AUTHORIZATION_H */ + + +/* + * 'compare_locations()' - Compare two locations. + */ + +static int /* O - Result of comparison */ +compare_locations(cupsd_location_t *a, /* I - First location */ + cupsd_location_t *b) /* I - Second location */ +{ + return (strcmp(b->location, a->location)); +} + + +/* + * 'copy_authmask()' - Copy function for auth masks. + */ + +static cupsd_authmask_t * /* O - New auth mask */ +copy_authmask(cupsd_authmask_t *mask, /* I - Existing auth mask */ + void *data) /* I - User data (unused) */ +{ + cupsd_authmask_t *temp; /* New auth mask */ + + + (void)data; + + if ((temp = malloc(sizeof(cupsd_authmask_t))) != NULL) + { + memcpy(temp, mask, sizeof(cupsd_authmask_t)); + + if (temp->type == CUPSD_AUTH_NAME || temp->type == CUPSD_AUTH_INTERFACE) + { + /* + * Make a copy of the name... + */ + + if ((temp->mask.name.name = _cupsStrAlloc(temp->mask.name.name)) == NULL) + { + /* + * Failed to make copy... + */ + + free(temp); + temp = NULL; + } + } + } + + return (temp); +} + + +#if !HAVE_LIBPAM && !defined(HAVE_USERSEC_H) +/* + * 'cups_crypt()' - Encrypt the password using the DES or MD5 algorithms, + * as needed. + */ + +static char * /* O - Encrypted password */ +cups_crypt(const char *pw, /* I - Password string */ + const char *salt) /* I - Salt (key) string */ +{ + if (!strncmp(salt, "$1$", 3)) + { + /* + * Use MD5 passwords without the benefit of PAM; this is for + * Slackware Linux, and the algorithm was taken from the + * old shadow-19990827/lib/md5crypt.c source code... :( + */ + + int i; /* Looping var */ + unsigned long n; /* Output number */ + int pwlen; /* Length of password string */ + const char *salt_end; /* End of "salt" data for MD5 */ + char *ptr; /* Pointer into result string */ + _cups_md5_state_t state; /* Primary MD5 state info */ + _cups_md5_state_t state2; /* Secondary MD5 state info */ + unsigned char digest[16]; /* MD5 digest result */ + static char result[120]; /* Final password string */ + + + /* + * Get the salt data between dollar signs, e.g. $1$saltdata$md5. + * Get a maximum of 8 characters of salt data after $1$... + */ + + for (salt_end = salt + 3; *salt_end && (salt_end - salt) < 11; salt_end ++) + if (*salt_end == '$') + break; + + /* + * Compute the MD5 sum we need... + */ + + pwlen = strlen(pw); + + _cupsMD5Init(&state); + _cupsMD5Append(&state, (unsigned char *)pw, pwlen); + _cupsMD5Append(&state, (unsigned char *)salt, salt_end - salt); + + _cupsMD5Init(&state2); + _cupsMD5Append(&state2, (unsigned char *)pw, pwlen); + _cupsMD5Append(&state2, (unsigned char *)salt + 3, salt_end - salt - 3); + _cupsMD5Append(&state2, (unsigned char *)pw, pwlen); + _cupsMD5Finish(&state2, digest); + + for (i = pwlen; i > 0; i -= 16) + _cupsMD5Append(&state, digest, i > 16 ? 16 : i); + + for (i = pwlen; i > 0; i >>= 1) + _cupsMD5Append(&state, (unsigned char *)((i & 1) ? "" : pw), 1); + + _cupsMD5Finish(&state, digest); + + for (i = 0; i < 1000; i ++) + { + _cupsMD5Init(&state); + + if (i & 1) + _cupsMD5Append(&state, (unsigned char *)pw, pwlen); + else + _cupsMD5Append(&state, digest, 16); + + if (i % 3) + _cupsMD5Append(&state, (unsigned char *)salt + 3, salt_end - salt - 3); + + if (i % 7) + _cupsMD5Append(&state, (unsigned char *)pw, pwlen); + + if (i & 1) + _cupsMD5Append(&state, digest, 16); + else + _cupsMD5Append(&state, (unsigned char *)pw, pwlen); + + _cupsMD5Finish(&state, digest); + } + + /* + * Copy the final sum to the result string and return... + */ + + memcpy(result, salt, salt_end - salt); + ptr = result + (salt_end - salt); + *ptr++ = '$'; + + for (i = 0; i < 5; i ++, ptr += 4) + { + n = (((digest[i] << 8) | digest[i + 6]) << 8); + + if (i < 4) + n |= digest[i + 12]; + else + n |= digest[5]; + + to64(ptr, n, 4); + } + + to64(ptr, digest[11], 2); + ptr += 2; + *ptr = '\0'; + + return (result); + } + else + { + /* + * Use the standard crypt() function... + */ + + return (crypt(pw, salt)); + } +} +#endif /* !HAVE_LIBPAM && !HAVE_USERSEC_H */ + + +/* + * 'free_authmask()' - Free function for auth masks. + */ + +static void +free_authmask(cupsd_authmask_t *mask, /* I - Auth mask to free */ + void *data) /* I - User data (unused) */ +{ + (void)data; + + if (mask->type == CUPSD_AUTH_NAME || mask->type == CUPSD_AUTH_INTERFACE) + _cupsStrFree(mask->mask.name.name); + + free(mask); +} + + +/* + * 'get_md5_password()' - Get an MD5 password. + */ + +static char * /* O - MD5 password string */ +get_md5_password(const char *username, /* I - Username */ + const char *group, /* I - Group */ + char passwd[33]) /* O - MD5 password string */ +{ + cups_file_t *fp; /* passwd.md5 file */ + char filename[1024], /* passwd.md5 filename */ + line[256], /* Line from file */ + tempuser[33], /* User from file */ + tempgroup[33]; /* Group from file */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_md5_password(username=\"%s\", group=\"%s\", passwd=%p)", + username, group ? group : "(null)", passwd); + + snprintf(filename, sizeof(filename), "%s/passwd.md5", ServerRoot); + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open %s - %s", filename, + strerror(errno)); + + return (NULL); + } + + while (cupsFileGets(fp, line, sizeof(line)) != NULL) + { + if (sscanf(line, "%32[^:]:%32[^:]:%32s", tempuser, tempgroup, passwd) != 3) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad MD5 password line: %s", line); + continue; + } + + if (!strcmp(username, tempuser) && + (group == NULL || !strcmp(group, tempgroup))) + { + /* + * Found the password entry! + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "Found MD5 user %s, group %s...", + username, tempgroup); + + cupsFileClose(fp); + return (passwd); + } + } + + /* + * Didn't find a password entry - return NULL! + */ + + cupsFileClose(fp); + return (NULL); +} + + +#if HAVE_LIBPAM +/* + * 'pam_func()' - PAM conversation function. + */ + +static int /* O - Success or failure */ +pam_func( + int num_msg, /* I - Number of messages */ + const struct pam_message **msg, /* I - Messages */ + struct pam_response **resp, /* O - Responses */ + void *appdata_ptr) + /* I - Pointer to connection */ +{ + int i; /* Looping var */ + struct pam_response *replies; /* Replies */ + cupsd_authdata_t *data; /* Pointer to auth data */ + + + /* + * Allocate memory for the responses... + */ + + if ((replies = malloc(sizeof(struct pam_response) * num_msg)) == NULL) + return (PAM_CONV_ERR); + + /* + * Answer all of the messages... + */ + + DEBUG_printf(("pam_func: appdata_ptr = %p\n", appdata_ptr)); + +#ifdef __hpux + /* + * Apparently some versions of HP-UX 11 have a broken pam_unix security + * module. This is a workaround... + */ + + data = auth_data; + (void)appdata_ptr; +#else + data = (cupsd_authdata_t *)appdata_ptr; +#endif /* __hpux */ + + for (i = 0; i < num_msg; i ++) + { + DEBUG_printf(("pam_func: Message = \"%s\"\n", msg[i]->msg)); + + switch (msg[i]->msg_style) + { + case PAM_PROMPT_ECHO_ON: + DEBUG_printf(("pam_func: PAM_PROMPT_ECHO_ON, returning \"%s\"...\n", + data->username)); + replies[i].resp_retcode = PAM_SUCCESS; + replies[i].resp = strdup(data->username); + break; + + case PAM_PROMPT_ECHO_OFF: + DEBUG_printf(("pam_func: PAM_PROMPT_ECHO_OFF, returning \"%s\"...\n", + data->password)); + replies[i].resp_retcode = PAM_SUCCESS; + replies[i].resp = strdup(data->password); + break; + + case PAM_TEXT_INFO: + DEBUG_puts("pam_func: PAM_TEXT_INFO..."); + replies[i].resp_retcode = PAM_SUCCESS; + replies[i].resp = NULL; + break; + + case PAM_ERROR_MSG: + DEBUG_puts("pam_func: PAM_ERROR_MSG..."); + replies[i].resp_retcode = PAM_SUCCESS; + replies[i].resp = NULL; + break; + + default: + DEBUG_printf(("pam_func: Unknown PAM message %d...\n", + msg[i]->msg_style)); + free(replies); + return (PAM_CONV_ERR); + } + } + + /* + * Return the responses back to PAM... + */ + + *resp = replies; + + return (PAM_SUCCESS); +} +#elif !defined(HAVE_USERSEC_H) + + +/* + * 'to64()' - Base64-encode an integer value... + */ + +static void +to64(char *s, /* O - Output string */ + unsigned long v, /* I - Value to encode */ + int n) /* I - Number of digits */ +{ + const char *itoa64 = "./0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + + + for (; n > 0; n --, v >>= 6) + *s++ = itoa64[v & 0x3f]; +} +#endif /* HAVE_LIBPAM */ + + +/* + * End of "$Id: auth.c 9949 2011-08-31 04:58:33Z mike $". + */ diff --git a/scheduler/auth.h b/scheduler/auth.h new file mode 100644 index 0000000..f15a6f9 --- /dev/null +++ b/scheduler/auth.h @@ -0,0 +1,152 @@ +/* + * "$Id: auth.h 9652 2011-03-25 21:25:38Z mike $" + * + * Authorization definitions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * HTTP authorization types and levels... + */ + +#define CUPSD_AUTH_DEFAULT -1 /* Use DefaultAuthType */ +#define CUPSD_AUTH_NONE 0 /* No authentication */ +#define CUPSD_AUTH_BASIC 1 /* Basic authentication */ +#define CUPSD_AUTH_DIGEST 2 /* Digest authentication */ +#define CUPSD_AUTH_BASICDIGEST 3 /* Basic authentication w/passwd.md5 */ +#define CUPSD_AUTH_NEGOTIATE 4 /* Kerberos authentication */ + +#define CUPSD_AUTH_ANON 0 /* Anonymous access */ +#define CUPSD_AUTH_USER 1 /* Must have a valid username/password */ +#define CUPSD_AUTH_GROUP 2 /* Must also be in a named group */ + +#define CUPSD_AUTH_ALLOW 0 /* Allow access */ +#define CUPSD_AUTH_DENY 1 /* Deny access */ + +#define CUPSD_AUTH_NAME 0 /* Authorize host by name */ +#define CUPSD_AUTH_IP 1 /* Authorize host by IP */ +#define CUPSD_AUTH_INTERFACE 2 /* Authorize host by interface */ + +#define CUPSD_AUTH_SATISFY_ALL 0 /* Satisfy both address and auth */ +#define CUPSD_AUTH_SATISFY_ANY 1 /* Satisfy either address or auth */ + +#define CUPSD_AUTH_LIMIT_DELETE 1 /* Limit DELETE requests */ +#define CUPSD_AUTH_LIMIT_GET 2 /* Limit GET requests */ +#define CUPSD_AUTH_LIMIT_HEAD 4 /* Limit HEAD requests */ +#define CUPSD_AUTH_LIMIT_OPTIONS 8 /* Limit OPTIONS requests */ +#define CUPSD_AUTH_LIMIT_POST 16 /* Limit POST requests */ +#define CUPSD_AUTH_LIMIT_PUT 32 /* Limit PUT requests */ +#define CUPSD_AUTH_LIMIT_TRACE 64 /* Limit TRACE requests */ +#define CUPSD_AUTH_LIMIT_ALL 127 /* Limit all requests */ +#define CUPSD_AUTH_LIMIT_IPP 128 /* Limit IPP requests */ + +#define IPP_ANY_OPERATION (ipp_op_t)0 + /* Any IPP operation */ +#define IPP_BAD_OPERATION (ipp_op_t)-1 + /* No IPP operation */ + + +/* + * HTTP access control structures... + */ + +typedef struct +{ + unsigned address[4], /* IP address */ + netmask[4]; /* IP netmask */ +} cupsd_ipmask_t; + +typedef struct +{ + int length; /* Length of name */ + char *name; /* Name string */ +} cupsd_namemask_t; + +typedef struct +{ + int type; /* Mask type */ + union + { + cupsd_namemask_t name; /* Host/Domain name */ + cupsd_ipmask_t ip; /* IP address/network */ + } mask; /* Mask data */ +} cupsd_authmask_t; + +typedef struct +{ + char *location; /* Location of resource */ + ipp_op_t op; /* IPP operation */ + int limit, /* Limit for these types of requests */ + length, /* Length of location string */ + order_type, /* Allow or Deny */ + type, /* Type of authentication */ + level, /* Access level required */ + satisfy; /* Satisfy any or all limits? */ + cups_array_t *names, /* User or group names */ + *allow, /* Allow lines */ + *deny; /* Deny lines */ + http_encryption_t encryption; /* To encrypt or not to encrypt... */ +} cupsd_location_t; + +typedef struct cupsd_client_s cupsd_client_t; + + +/* + * Globals... + */ + +VAR cups_array_t *Locations VALUE(NULL); + /* Authorization locations */ +VAR int DefaultAuthType VALUE(CUPSD_AUTH_BASIC); + /* Default AuthType, if not specified */ +#ifdef HAVE_SSL +VAR http_encryption_t DefaultEncryption VALUE(HTTP_ENCRYPT_REQUIRED); + /* Default encryption for authentication */ +#endif /* HAVE_SSL */ + + +/* + * Prototypes... + */ + +extern int cupsdAddIPMask(cups_array_t **masks, + const unsigned address[4], + const unsigned netmask[4]); +extern void cupsdAddLocation(cupsd_location_t *loc); +extern void cupsdAddName(cupsd_location_t *loc, char *name); +extern int cupsdAddNameMask(cups_array_t **masks, char *name); +extern void cupsdAuthorize(cupsd_client_t *con); +extern int cupsdCheckAccess(unsigned ip[4], char *name, + int namelen, cupsd_location_t *loc); +extern int cupsdCheckAuth(unsigned ip[4], char *name, int namelen, + cups_array_t *masks); +extern int cupsdCheckGroup(const char *username, + struct passwd *user, + const char *groupname); +extern cupsd_location_t *cupsdCopyLocation(cupsd_location_t *loc); +extern void cupsdDeleteAllLocations(void); +extern cupsd_location_t *cupsdFindBest(const char *path, http_state_t state); +extern cupsd_location_t *cupsdFindLocation(const char *location); +extern void cupsdFreeLocation(cupsd_location_t *loc); +extern http_status_t cupsdIsAuthorized(cupsd_client_t *con, const char *owner); +extern cupsd_location_t *cupsdNewLocation(const char *location); + + +/* + * End of "$Id: auth.h 9652 2011-03-25 21:25:38Z mike $". + */ diff --git a/scheduler/avahi.c b/scheduler/avahi.c new file mode 100644 index 0000000..92e491b --- /dev/null +++ b/scheduler/avahi.c @@ -0,0 +1,445 @@ +/* + * "$Id$" + * + * Avahi poll implementation for the CUPS scheduler. + * + * Copyright (C) 2010 Red Hat, Inc. + * Authors: + * Tim Waugh + * + * Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * watch_read_cb - Read callback for file descriptor + * watch_write_cb - Write callback for file descriptor + * watched_fd_add_select() - Call cupsdAddSelect() as needed + * watch_new() - Create a new file descriptor watch + * watch_free() - Free a file descriptor watch + * watch_update() - Update watched events for a file descriptor + * watch_get_events() - Get events that happened for a file descriptor + * timeout_cb() - Run a timed Avahi callback + * timeout_new() - Set a wakeup time + * timeout_update() - Update the expiration time for a timeout + * timeout_free() - Free a timeout + * compare_watched_fds() - Compare watched file descriptors for array sorting + * compare_timeouts() - Compare timeouts for array sorting + * avahi_cups_poll_new() - Create a new Avahi main loop object for CUPS + * avahi_cups_poll_free() - Free an Avahi main loop object for CUPS + * avahi_cups_poll_get() - Get the abstract poll API structure + */ + +#include + +#ifdef HAVE_AVAHI /* Applies to entire file... */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + +#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) +# include +#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ + +#ifdef HAVE_AVAHI +# include +#endif /* HAVE_AVAHI */ + + +typedef struct +{ + AvahiCupsPoll *cups_poll; + + int fd; + AvahiWatchEvent occurred; + cups_array_t *watches; +} cupsd_watched_fd_t; + +struct AvahiWatch +{ + cupsd_watched_fd_t *watched_fd; + + AvahiWatchEvent events; + AvahiWatchCallback callback; + void *userdata; +}; + +struct AvahiTimeout +{ + AvahiCupsPoll *cups_poll; + AvahiTimeoutCallback callback; + void *userdata; + cupsd_timeout_t *cupsd_timeout; +}; + +/* + * Local functions... + */ + +static AvahiWatch * watch_new(const AvahiPoll *api, + int fd, + AvahiWatchEvent events, + AvahiWatchCallback callback, + void *userdata); +static void watch_free(AvahiWatch *watch); +static void watch_update(AvahiWatch *watch, + AvahiWatchEvent events); +static AvahiWatchEvent watch_get_events(AvahiWatch *watch); +static int compare_watches(AvahiWatch *p0, + AvahiWatch *p1); + + +/* + * 'watch_read_cb' - Read callback for file descriptor + */ + +static void +watch_read_cb (void *userdata) +{ + AvahiWatch *watch; + cupsd_watched_fd_t *watched_fd = userdata; + watched_fd->occurred |= AVAHI_WATCH_IN; + for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); + watch; + watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { + if (watch->events & watched_fd->occurred) { + (watch->callback) (watch, watched_fd->fd, + AVAHI_WATCH_IN, watch->userdata); + watched_fd->occurred &= ~AVAHI_WATCH_IN; + break; + } + } +} + + +/* + * 'watch_write_cb' - Write callback for file descriptor + */ + +static void +watch_write_cb (void *userdata) +{ + AvahiWatch *watch; + cupsd_watched_fd_t *watched_fd = userdata; + watched_fd->occurred |= AVAHI_WATCH_OUT; + for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); + watch; + watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { + if (watch->events & watched_fd->occurred) { + (watch->callback) (watch, watched_fd->fd, + AVAHI_WATCH_OUT, watch->userdata); + watched_fd->occurred &= ~AVAHI_WATCH_OUT; + break; + } + } +} + + +/* + * 'watched_fd_add_select' - Call cupsdAddSelect() as needed + */ + +static int /* O - Watches? */ +watched_fd_add_select (cupsd_watched_fd_t *watched_fd) +{ + AvahiWatch *watch; + cupsd_selfunc_t read_cb = NULL, write_cb = NULL; + + for (watch = (AvahiWatch *)cupsArrayFirst(watched_fd->watches); + watch; + watch = (AvahiWatch *)cupsArrayNext(watched_fd->watches)) { + if (watch->events & (AVAHI_WATCH_IN | + AVAHI_WATCH_ERR | + AVAHI_WATCH_HUP)) { + read_cb = (cupsd_selfunc_t)watch_read_cb; + if (write_cb != NULL) + break; + } + + if (watch->events & AVAHI_WATCH_OUT) { + write_cb = (cupsd_selfunc_t)watch_write_cb; + if (read_cb != NULL) + break; + } + } + + if (read_cb || write_cb) + cupsdAddSelect (watched_fd->fd, read_cb, write_cb, watched_fd); + else + cupsdRemoveSelect (watched_fd->fd); + + return (read_cb || write_cb); +} + +/* + * 'watch_new' - Create a new file descriptor watch + */ + +static AvahiWatch * +watch_new (const AvahiPoll *api, + int fd, + AvahiWatchEvent events, + AvahiWatchCallback callback, + void *userdata) +{ + cupsd_watched_fd_t key, *watched_fd; + AvahiCupsPoll *cups_poll = api->userdata; + AvahiWatch *watch = malloc(sizeof(AvahiWatch)); + if (watch == NULL) + return (NULL); + + watch->events = events; + watch->callback = callback; + watch->userdata = userdata; + + key.fd = fd; + watched_fd = cupsArrayFind (cups_poll->watched_fds, &key); + if (watched_fd == NULL) { + watched_fd = malloc(sizeof(cupsd_watched_fd_t)); + if (watched_fd == NULL) { + free (watch); + return (NULL); + } + + watched_fd->fd = fd; + watched_fd->occurred = 0; + watched_fd->cups_poll = cups_poll; + watched_fd->watches = cupsArrayNew ((cups_array_func_t)compare_watches, + NULL); + } + + watch->watched_fd = watched_fd; + cupsArrayAdd(watched_fd->watches, watch); + watched_fd_add_select (watched_fd); + return (watch); +} + + +/* + * 'watch_free' - Free a file descriptor watch + */ + +static void +watch_free (AvahiWatch *watch) +{ + cupsd_watched_fd_t *watched_fd = watch->watched_fd; + AvahiCupsPoll *cups_poll = watched_fd->cups_poll; + + cupsArrayRemove (watched_fd->watches, watch); + free (watch); + + if (!watched_fd_add_select (watched_fd)) { + /* No more watches */ + cupsArrayRemove (cups_poll->watched_fds, watched_fd); + free (watched_fd); + } +} + + +/* + * 'watch_update' - Update watched events for a file descriptor + */ + +static void +watch_update (AvahiWatch *watch, + AvahiWatchEvent events) +{ + watch->events = events; + watched_fd_add_select (watch->watched_fd); +} + + +/* + * 'watch_get_events' - Get events that happened for a file descriptor + */ + +static AvahiWatchEvent +watch_get_events (AvahiWatch *watch) +{ + return (watch->watched_fd->occurred); +} + + +/* + * 'compare_watches' - Compare watches for array sorting + */ + +static int +compare_watches (AvahiWatch *p0, + AvahiWatch *p1) +{ + if (p0->watched_fd->fd < p1->watched_fd->fd) + return (-1); + + return ((p0->watched_fd->fd == p1->watched_fd->fd) ? 0 : 1); +} + + +/* + * 'timeout_cb()' - Run a timed Avahi callback + */ + +static void +timeout_cb (cupsd_timeout_t *cupsd_timeout, void *userdata) +{ + AvahiTimeout *timeout = userdata; + (timeout->callback) (timeout, timeout->userdata); +} + + +/* + * 'timeout_new' - Set a wakeup time + */ + +static AvahiTimeout * +timeout_new (const AvahiPoll *api, + const struct timeval *tv, + AvahiTimeoutCallback callback, + void *userdata) +{ + AvahiTimeout *timeout; + AvahiCupsPoll *cups_poll = api->userdata; + + timeout = malloc(sizeof(AvahiTimeout)); + if (timeout == NULL) + return (NULL); + + timeout->cups_poll = cups_poll; + timeout->callback = callback; + timeout->userdata = userdata; + timeout->cupsd_timeout = cupsdAddTimeout (tv, + (cupsd_timeoutfunc_t)timeout_cb, + timeout); + cupsArrayAdd (cups_poll->timeouts, timeout); + return (timeout); +} + + +/* + * 'timeout_update' - Update the expiration time for a timeout + */ + +static void +timeout_update (AvahiTimeout *timeout, + const struct timeval *tv) +{ + cupsdUpdateTimeout (timeout->cupsd_timeout, tv); +} + + +/* + * ' timeout_free' - Free a timeout + */ + +static void +timeout_free (AvahiTimeout *timeout) +{ + cupsArrayRemove (timeout->cups_poll->timeouts, timeout); + cupsdRemoveTimeout (timeout->cupsd_timeout); + free (timeout); +} + + +/* + * 'compare_watched_fds' - Compare watched file descriptors for array sorting + */ +static int +compare_watched_fds(cupsd_watched_fd_t *p0, + cupsd_watched_fd_t *p1) +{ + if (p0->fd != p1->fd) + return (p0->fd < p1->fd ? -1 : 1); + + if (p0 == p1) + return (0); + + return (p0 < p1 ? -1 : 1); +} + + +/* + * 'compare_timeouts' - Compare timeouts for array sorting + */ +static int +compare_timeouts(AvahiTimeout *p0, + AvahiTimeout *p1) +{ + /* + * Just compare pointers to make it a stable sort. + */ + + if (p0->cupsd_timeout < p1->cupsd_timeout) + return (-1); + return ((p0->cupsd_timeout == p1->cupsd_timeout) ? 0 : 1); +} + + +/* + * 'avahi_cups_poll_new' - Create a new Avahi main loop object for CUPS + */ + +AvahiCupsPoll * +avahi_cups_poll_new (void) +{ + AvahiCupsPoll *cups_poll = malloc(sizeof(AvahiCupsPoll)); + if (cups_poll == NULL) + return (NULL); + + cups_poll->watched_fds = cupsArrayNew ((cups_array_func_t)compare_watched_fds, + NULL); + cups_poll->timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, + NULL); + + cups_poll->api.userdata = cups_poll; + cups_poll->api.watch_new = watch_new; + cups_poll->api.watch_free = watch_free; + cups_poll->api.watch_update = watch_update; + cups_poll->api.watch_get_events = watch_get_events; + + cups_poll->api.timeout_new = timeout_new; + cups_poll->api.timeout_update = timeout_update; + cups_poll->api.timeout_free = timeout_free; + + return (cups_poll); +} + + +/* + * 'avahi_cups_poll_free' - Free an Avahi main loop object for CUPS + */ +void +avahi_cups_poll_free (AvahiCupsPoll *cups_poll) +{ + cupsd_watched_fd_t *watched_fd; + + for (watched_fd = (cupsd_watched_fd_t*)cupsArrayFirst(cups_poll->watched_fds); + watched_fd; + watched_fd = (cupsd_watched_fd_t*)cupsArrayNext(cups_poll->watched_fds)){ + cupsArrayClear (watched_fd->watches); + } + + cupsArrayClear (cups_poll->watched_fds); + cupsArrayClear (cups_poll->timeouts); +} + + +/* + * 'avahi_cups_poll_get' - Get the abstract poll API structure + */ + +const AvahiPoll * +avahi_cups_poll_get (AvahiCupsPoll *cups_poll) +{ + return (&cups_poll->api); +} + + +#endif /* HAVE_AVAHI ... from top of file */ + +/* + * End of "$Id$". + */ diff --git a/scheduler/avahi.h b/scheduler/avahi.h new file mode 100644 index 0000000..05f441d --- /dev/null +++ b/scheduler/avahi.h @@ -0,0 +1,49 @@ +/* + * "$Id$" + * + * Avahi poll implementation for the CUPS scheduler. + * + * Copyright (C) 2010 Red Hat, Inc. + * Authors: + * Tim Waugh + * + * Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#include + +#ifdef HAVE_AVAHI +# include +# include +#endif /* HAVE_AVAHI */ + +#ifdef HAVE_AUTHORIZATION_H +# include +#endif /* HAVE_AUTHORIZATION_H */ + + +#ifdef HAVE_AVAHI +typedef struct +{ + AvahiPoll api; + cups_array_t *watched_fds; + cups_array_t *timeouts; +} AvahiCupsPoll; +#endif /* HAVE_AVAHI */ + +/* + * Prototypes... + */ + +#ifdef HAVE_AVAHI +extern AvahiCupsPoll * avahi_cups_poll_new(void); +extern void avahi_cups_poll_free(AvahiCupsPoll *cups_poll); +extern const AvahiPoll *avahi_cups_poll_get(AvahiCupsPoll *cups_poll); +#endif /* HAVE_AVAHI */ + + +/* + * End of "$Id$". + */ diff --git a/scheduler/banners.c b/scheduler/banners.c new file mode 100644 index 0000000..7a4987f --- /dev/null +++ b/scheduler/banners.c @@ -0,0 +1,224 @@ +/* + * "$Id: banners.c 9793 2011-05-20 03:49:49Z mike $" + * + * Banner routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdFindBanner() - Find a named banner. + * cupsdLoadBanners() - Load all available banner files... + * add_banner() - Add a banner to the array. + * compare_banners() - Compare two banners. + * free_banners() - Free all banners. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include + + +/* + * Local functions... + */ + +static void add_banner(const char *name, const char *filename); +static int compare_banners(const cupsd_banner_t *b0, + const cupsd_banner_t *b1); +static void free_banners(void); + + +/* + * 'cupsdFindBanner()' - Find a named banner. + */ + +cupsd_banner_t * /* O - Pointer to banner or NULL */ +cupsdFindBanner(const char *name) /* I - Name of banner */ +{ + cupsd_banner_t key; /* Search key */ + + + key.name = (char *)name; + + return ((cupsd_banner_t *)cupsArrayFind(Banners, &key)); +} + + +/* + * 'cupsdLoadBanners()' - Load all available banner files... + */ + +void +cupsdLoadBanners(const char *d) /* I - Directory to search */ +{ + cups_dir_t *dir; /* Directory pointer */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024], /* Name of banner */ + *ext; /* Pointer to extension */ + + + /* + * Free old banner info... + */ + + free_banners(); + + /* + * Try opening the banner directory... + */ + + if ((dir = cupsDirOpen(d)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdLoadBanners: Unable to open banner directory \"%s\": %s", + d, strerror(errno)); + return; + } + + /* + * Read entries, skipping directories and backup files. + */ + + Banners = cupsArrayNew((cups_array_func_t)compare_banners, NULL); + + while ((dent = cupsDirRead(dir)) != NULL) + { + /* + * Check the file to make sure it isn't a directory or a backup + * file of some sort... + */ + + snprintf(filename, sizeof(filename), "%s/%s", d, dent->filename); + + if (S_ISDIR(dent->fileinfo.st_mode)) + continue; + + if (dent->filename[0] == '~' || + dent->filename[strlen(dent->filename) - 1] == '~') + continue; + + if ((ext = strrchr(dent->filename, '.')) != NULL) + if (!strcmp(ext, ".bck") || + !strcmp(ext, ".bak") || + !strcmp(ext, ".sav")) + continue; + + /* + * Must be a valid file; add it! + */ + + add_banner(dent->filename, filename); + } + + /* + * Close the directory... + */ + + cupsDirClose(dir); +} + + +/* + * 'add_banner()' - Add a banner to the array. + */ + +static void +add_banner(const char *name, /* I - Name of banner */ + const char *filename) /* I - Filename for banner */ +{ + mime_type_t *filetype; /* Filetype */ + cupsd_banner_t *temp; /* New banner data */ + + + /* + * See what the filetype is... + */ + + if ((filetype = mimeFileType(MimeDatabase, filename, NULL, NULL)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "add_banner: Banner \"%s\" (\"%s\") is of an unknown file " + "type - skipping!", name, filename); + return; + } + + /* + * Allocate memory... + */ + + if ((temp = calloc(1, sizeof(cupsd_banner_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "add_banner: Unable to allocate memory for banner \"%s\" - " + "skipping!", name); + return; + } + + /* + * Copy the new banner data over... + */ + + if ((temp->name = strdup(name)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "add_banner: Unable to allocate memory for banner \"%s\" - " + "skipping!", name); + free(temp); + return; + } + + temp->filetype = filetype; + + cupsArrayAdd(Banners, temp); +} + + +/* + * 'compare_banners()' - Compare two banners. + */ + +static int /* O - -1 if name0 < name1, etc. */ +compare_banners( + const cupsd_banner_t *b0, /* I - First banner */ + const cupsd_banner_t *b1) /* I - Second banner */ +{ + return (_cups_strcasecmp(b0->name, b1->name)); +} + + +/* + * 'free_banners()' - Free all banners. + */ + +static void +free_banners(void) +{ + cupsd_banner_t *temp; /* Current banner */ + + + for (temp = (cupsd_banner_t *)cupsArrayFirst(Banners); + temp; + temp = (cupsd_banner_t *)cupsArrayNext(Banners)) + { + free(temp->name); + free(temp); + } + + cupsArrayDelete(Banners); + Banners = NULL; +} + + +/* + * End of "$Id: banners.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/banners.h b/scheduler/banners.h new file mode 100644 index 0000000..2578cdd --- /dev/null +++ b/scheduler/banners.h @@ -0,0 +1,45 @@ +/* + * "$Id: banners.h 9350 2010-11-04 23:23:25Z mike $" + * + * Banner definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Banner information structure... + */ + +typedef struct /**** Banner file information ****/ +{ + char *name; /* Name of banner */ + mime_type_t *filetype; /* Filetype for banner */ +} cupsd_banner_t; + + +/* + * Globals... + */ + +VAR cups_array_t *Banners VALUE(NULL); + /* Available banner files */ + + +/* + * Prototypes... + */ + +extern cupsd_banner_t *cupsdFindBanner(const char *name); +extern void cupsdLoadBanners(const char *d); + + +/* + * End of "$Id: banners.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/cert.c b/scheduler/cert.c new file mode 100644 index 0000000..2e83a8b --- /dev/null +++ b/scheduler/cert.c @@ -0,0 +1,458 @@ +/* + * "$Id: cert.c 10262 2012-02-12 05:48:09Z mike $" + * + * Authentication certificate routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddCert() - Add a certificate. + * cupsdDeleteCert() - Delete a single certificate. + * cupsdDeleteAllCerts() - Delete all certificates... + * cupsdFindCert() - Find a certificate. + * cupsdInitCerts() - Initialize the certificate "system" and root + * certificate. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#ifdef HAVE_ACL_INIT +# include +# ifdef HAVE_MEMBERSHIP_H +# include +# endif /* HAVE_MEMBERSHIP_H */ +#endif /* HAVE_ACL_INIT */ + + +/* + * 'cupsdAddCert()' - Add a certificate. + */ + +void +cupsdAddCert(int pid, /* I - Process ID */ + const char *username, /* I - Username */ + void *ccache) /* I - Kerberos credentials or NULL */ +{ + int i; /* Looping var */ + cupsd_cert_t *cert; /* Current certificate */ + int fd; /* Certificate file */ + char filename[1024]; /* Certificate filename */ + static const char hex[] = "0123456789ABCDEF"; + /* Hex constants... */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddCert: Adding certificate for PID %d", pid); + + /* + * Allocate memory for the certificate... + */ + + if ((cert = calloc(sizeof(cupsd_cert_t), 1)) == NULL) + return; + + /* + * Fill in the certificate information... + */ + + cert->pid = pid; + strlcpy(cert->username, username, sizeof(cert->username)); + + for (i = 0; i < 32; i ++) + cert->certificate[i] = hex[CUPS_RAND() & 15]; + + /* + * Save the certificate to a file readable only by the User and Group + * (or root and SystemGroup for PID == 0)... + */ + + snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, pid); + unlink(filename); + + if ((fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create certificate file %s - %s", + filename, strerror(errno)); + free(cert); + return; + } + + if (pid == 0) + { +#ifdef HAVE_ACL_INIT + acl_t acl; /* ACL information */ + acl_entry_t entry; /* ACL entry */ + acl_permset_t permset; /* Permissions */ +# ifdef HAVE_MBR_UID_TO_UUID + uuid_t group; /* Group ID */ +# endif /* HAVE_MBR_UID_TO_UUID */ + static int acls_not_supported = 0; + /* Only warn once */ +#endif /* HAVE_ACL_INIT */ + + + /* + * Root certificate... + */ + + fchmod(fd, 0440); + fchown(fd, RunUser, SystemGroupIDs[0]); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddCert: NumSystemGroups=%d", + NumSystemGroups); + +#ifdef HAVE_ACL_INIT + if (NumSystemGroups > 1) + { + /* + * Set POSIX ACLs for the root certificate so that all system + * groups can access it... + */ + + int j; /* Looping var */ + +# ifdef HAVE_MBR_UID_TO_UUID + /* + * On MacOS X, ACLs use UUIDs instead of GIDs... + */ + + acl = acl_init(NumSystemGroups - 1); + + for (i = 1; i < NumSystemGroups; i ++) + { + /* + * Add each group ID to the ACL... + */ + + for (j = 0; j < i; j ++) + if (SystemGroupIDs[j] == SystemGroupIDs[i]) + break; + + if (j < i) + continue; /* Skip duplicate groups */ + + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, ACL_READ_DATA); + acl_set_tag_type(entry, ACL_EXTENDED_ALLOW); + mbr_gid_to_uuid((gid_t)SystemGroupIDs[i], group); + acl_set_qualifier(entry, &group); + acl_set_permset(entry, permset); + } + +# else + /* + * POSIX ACLs need permissions for owner, group, other, and mask + * in addition to the rest of the system groups... + */ + + acl = acl_init(NumSystemGroups + 3); + + /* Owner */ + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, ACL_READ); + acl_set_tag_type(entry, ACL_USER_OBJ); + acl_set_permset(entry, permset); + + /* Group */ + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, ACL_READ); + acl_set_tag_type(entry, ACL_GROUP_OBJ); + acl_set_permset(entry, permset); + + /* Others */ + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, 0); + acl_set_tag_type(entry, ACL_OTHER); + acl_set_permset(entry, permset); + + /* Mask */ + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, ACL_READ); + acl_set_tag_type(entry, ACL_MASK); + acl_set_permset(entry, permset); + + for (i = 1; i < NumSystemGroups; i ++) + { + /* + * Add each group ID to the ACL... + */ + + for (j = 0; j < i; j ++) + if (SystemGroupIDs[j] == SystemGroupIDs[i]) + break; + + if (j < i) + continue; /* Skip duplicate groups */ + + acl_create_entry(&acl, &entry); + acl_get_permset(entry, &permset); + acl_add_perm(permset, ACL_READ); + acl_set_tag_type(entry, ACL_GROUP); + acl_set_qualifier(entry, SystemGroupIDs + i); + acl_set_permset(entry, permset); + } + + if (acl_valid(acl)) + { + char *text, *textptr; /* Temporary string */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "ACL did not validate: %s", + strerror(errno)); + text = acl_to_text(acl, NULL); + for (textptr = strchr(text, '\n'); + textptr; + textptr = strchr(textptr + 1, '\n')) + *textptr = ','; + + cupsdLogMessage(CUPSD_LOG_ERROR, "ACL: %s", text); + acl_free(text); + } +# endif /* HAVE_MBR_UID_TO_UUID */ + + if (acl_set_fd(fd, acl)) + { + if (errno != EOPNOTSUPP || !acls_not_supported) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to set ACLs on root certificate \"%s\" - %s", + filename, strerror(errno)); + + if (errno == EOPNOTSUPP) + acls_not_supported = 1; + } + + acl_free(acl); + } +#endif /* HAVE_ACL_INIT */ + + RootCertTime = time(NULL); + } + else + { + /* + * CGI certificate... + */ + + fchmod(fd, 0400); + fchown(fd, User, Group); + } + + DEBUG_printf(("ADD pid=%d, username=%s, cert=%s\n", pid, username, + cert->certificate)); + + write(fd, cert->certificate, strlen(cert->certificate)); + close(fd); + + /* + * Add Kerberos credentials as needed... + */ + +#ifdef HAVE_GSSAPI + cert->ccache = (krb5_ccache)ccache; +#else + (void)ccache; +#endif /* HAVE_GSSAPI */ + + /* + * Insert the certificate at the front of the list... + */ + + cert->next = Certs; + Certs = cert; +} + + +/* + * 'cupsdDeleteCert()' - Delete a single certificate. + */ + +void +cupsdDeleteCert(int pid) /* I - Process ID */ +{ + cupsd_cert_t *cert, /* Current certificate */ + *prev; /* Previous certificate */ + char filename[1024]; /* Certificate file */ + + + for (prev = NULL, cert = Certs; cert != NULL; prev = cert, cert = cert->next) + if (cert->pid == pid) + { + /* + * Remove this certificate from the list... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdDeleteCert: Removing certificate for PID %d", pid); + + DEBUG_printf(("DELETE pid=%d, username=%s, cert=%s\n", cert->pid, + cert->username, cert->certificate)); + + if (prev == NULL) + Certs = cert->next; + else + prev->next = cert->next; + +#ifdef HAVE_GSSAPI + /* + * Release Kerberos credentials as needed... + */ + + if (cert->ccache) + krb5_cc_destroy(KerberosContext, cert->ccache); +#endif /* HAVE_GSSAPI */ + + free(cert); + + /* + * Delete the file and return... + */ + + snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, pid); + if (unlink(filename)) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename); + + return; + } +} + + +/* + * 'cupsdDeleteAllCerts()' - Delete all certificates... + */ + +void +cupsdDeleteAllCerts(void) +{ + cupsd_cert_t *cert, /* Current certificate */ + *next; /* Next certificate */ + char filename[1024]; /* Certificate file */ + + + /* + * Loop through each certificate, deleting them... + */ + + for (cert = Certs; cert != NULL; cert = next) + { + /* + * Delete the file... + */ + + snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, cert->pid); + if (unlink(filename)) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename); + + /* + * Free memory... + */ + + next = cert->next; + free(cert); + } + + Certs = NULL; + RootCertTime = 0; +} + + +/* + * 'cupsdFindCert()' - Find a certificate. + */ + +cupsd_cert_t * /* O - Matching certificate or NULL */ +cupsdFindCert(const char *certificate) /* I - Certificate */ +{ + cupsd_cert_t *cert; /* Current certificate */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)", + certificate); + for (cert = Certs; cert != NULL; cert = cert->next) + if (!_cups_strcasecmp(certificate, cert->certificate)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning %s...", + cert->username); + return (cert); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found!"); + + return (NULL); +} + + +/* + * 'cupsdInitCerts()' - Initialize the certificate "system" and root + * certificate. + */ + +void +cupsdInitCerts(void) +{ +#ifndef HAVE_ARC4RANDOM + cups_file_t *fp; /* /dev/random file */ + + + /* + * Initialize the random number generator using the random device or + * the current time, as available... + */ + + if ((fp = cupsFileOpen("/dev/urandom", "rb")) == NULL) + { + struct timeval tod; /* Time of day */ + + /* + * Get the time in usecs and use it as the initial seed... + */ + + gettimeofday(&tod, NULL); + + CUPS_SRAND((unsigned)(tod.tv_sec + tod.tv_usec)); + } + else + { + unsigned seed; /* Seed for random number generator */ + + /* + * Read 4 random characters from the random device and use + * them as the seed... + */ + + seed = cupsFileGetChar(fp); + seed = (seed << 8) | cupsFileGetChar(fp); + seed = (seed << 8) | cupsFileGetChar(fp); + CUPS_SRAND((seed << 8) | cupsFileGetChar(fp)); + + cupsFileClose(fp); + } +#endif /* !HAVE_ARC4RANDOM */ + + /* + * Create a root certificate and return... + */ + + if (!RunUser) + cupsdAddCert(0, "root", NULL); +} + + +/* + * End of "$Id: cert.c 10262 2012-02-12 05:48:09Z mike $". + */ diff --git a/scheduler/cert.h b/scheduler/cert.h new file mode 100644 index 0000000..e456a1a --- /dev/null +++ b/scheduler/cert.h @@ -0,0 +1,56 @@ +/* + * "$Id: cert.h 9350 2010-11-04 23:23:25Z mike $" + * + * Authentication certificate definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Certificate structure... + */ + +typedef struct cupsd_cert_s +{ + struct cupsd_cert_s *next; /* Next certificate in list */ + int pid; /* Process ID (0 for root certificate) */ + char certificate[33]; /* 32 hex characters, or 128 bits */ + char username[33]; /* Authenticated username */ +#ifdef HAVE_GSSAPI + krb5_ccache ccache; /* Kerberos credential cache */ +#endif /* HAVE_GSSAPI */ +} cupsd_cert_t; + + +/* + * Globals... + */ + +VAR cupsd_cert_t *Certs /* List of certificates */ + VALUE(NULL); +VAR time_t RootCertTime /* Root certificate update time */ + VALUE(0); + + +/* + * Prototypes... + */ + +extern void cupsdAddCert(int pid, const char *username, + void *ccache); +extern void cupsdDeleteCert(int pid); +extern void cupsdDeleteAllCerts(void); +extern cupsd_cert_t *cupsdFindCert(const char *certificate); +extern void cupsdInitCerts(void); + + +/* + * End of "$Id: cert.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/classes.c b/scheduler/classes.c new file mode 100644 index 0000000..3f0f50f --- /dev/null +++ b/scheduler/classes.c @@ -0,0 +1,868 @@ +/* + * "$Id: classes.c 9793 2011-05-20 03:49:49Z mike $" + * + * Printer class routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddClass() - Add a class to the system. + * cupsdAddPrinterToClass() - Add a printer to a class... + * cupsdDeletePrinterFromClass() - Delete a printer from a class. + * cupsdDeletePrinterFromClasses() - Delete a printer from all classes. + * cupsdFindAvailablePrinter() - Find an available printer in a class. + * cupsdFindClass() - Find the named class. + * cupsdLoadAllClasses() - Load classes from the classes.conf file. + * cupsdSaveAllClasses() - Save classes to the classes.conf file. + * cupsdUpdateImplicitClasses() - Update the accepting state of implicit + * classes. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + + +/* + * 'cupsdAddClass()' - Add a class to the system. + */ + +cupsd_printer_t * /* O - New class */ +cupsdAddClass(const char *name) /* I - Name of class */ +{ + cupsd_printer_t *c; /* New class */ + char uri[1024]; /* Class URI */ + + + /* + * Add the printer and set the type to "class"... + */ + + if ((c = cupsdAddPrinter(name)) != NULL) + { + /* + * Change from a printer to a class... + */ + + c->type = CUPS_PRINTER_CLASS; + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + ServerName, RemotePort, "/classes/%s", name); + cupsdSetString(&c->uri, uri); + + cupsdSetString(&c->error_policy, "retry-current-job"); + } + + return (c); +} + + +/* + * 'cupsdAddPrinterToClass()' - Add a printer to a class... + */ + +void +cupsdAddPrinterToClass( + cupsd_printer_t *c, /* I - Class to add to */ + cupsd_printer_t *p) /* I - Printer to add */ +{ + int i; /* Looping var */ + cupsd_printer_t **temp; /* Pointer to printer array */ + + + /* + * See if this printer is already a member of the class... + */ + + for (i = 0; i < c->num_printers; i ++) + if (c->printers[i] == p) + return; + + /* + * Allocate memory as needed... + */ + + if (c->num_printers == 0) + temp = malloc(sizeof(cupsd_printer_t *)); + else + temp = realloc(c->printers, sizeof(cupsd_printer_t *) * (c->num_printers + 1)); + + if (temp == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to add printer %s to class %s!", + p->name, c->name); + return; + } + + /* + * Add the printer to the end of the array and update the number of printers. + */ + + c->printers = temp; + temp += c->num_printers; + c->num_printers ++; + + *temp = p; +} + + +/* + * 'cupsdDeletePrinterFromClass()' - Delete a printer from a class. + */ + +int /* O - 1 if class changed, 0 otherwise */ +cupsdDeletePrinterFromClass( + cupsd_printer_t *c, /* I - Class to delete from */ + cupsd_printer_t *p) /* I - Printer to delete */ +{ + int i; /* Looping var */ + + + /* + * See if the printer is in the class... + */ + + for (i = 0; i < c->num_printers; i ++) + if (p == c->printers[i]) + break; + + /* + * If it is, remove it from the list... + */ + + if (i < c->num_printers) + { + /* + * Yes, remove the printer... + */ + + c->num_printers --; + if (i < c->num_printers) + memmove(c->printers + i, c->printers + i + 1, + (c->num_printers - i) * sizeof(cupsd_printer_t *)); + } + else + return (0); + + /* + * Update the IPP attributes (have to do this for member-names)... + */ + + cupsdSetPrinterAttrs(c); + + return (1); +} + + +/* + * 'cupsdDeletePrinterFromClasses()' - Delete a printer from all classes. + */ + +int /* O - 1 if class changed, 0 otherwise */ +cupsdDeletePrinterFromClasses( + cupsd_printer_t *p) /* I - Printer to delete */ +{ + int changed = 0; /* Any class changed? */ + cupsd_printer_t *c; /* Pointer to current class */ + + + /* + * Loop through the printer/class list and remove the printer + * from each class listed... + */ + + for (c = (cupsd_printer_t *)cupsArrayFirst(Printers); + c; + c = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (c->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + changed |= cupsdDeletePrinterFromClass(c, p); + + /* + * Then clean out any empty implicit classes... + */ + + for (c = (cupsd_printer_t *)cupsArrayFirst(ImplicitPrinters); + c; + c = (cupsd_printer_t *)cupsArrayNext(ImplicitPrinters)) + if (c->num_printers == 0) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Deleting implicit class \"%s\"...", + c->name); + cupsdDeletePrinter(c, 0); + changed = 1; + } + + return (changed); +} + + +/* + * 'cupsdFindAvailablePrinter()' - Find an available printer in a class. + */ + +cupsd_printer_t * /* O - Available printer or NULL */ +cupsdFindAvailablePrinter( + const char *name) /* I - Class to check */ +{ + int i; /* Looping var */ + cupsd_printer_t *c; /* Printer class */ + + + /* + * Find the class... + */ + + if ((c = cupsdFindClass(name)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to find class \"%s\"!", name); + return (NULL); + } + + if (c->num_printers == 0) + return (NULL); + + /* + * Make sure that the last printer is also a valid index into the printer + * array. If not, reset the last printer to 0... + */ + + if (c->last_printer >= c->num_printers) + c->last_printer = 0; + + /* + * Loop through the printers in the class and return the first idle + * printer... We keep track of the last printer that we used so that + * a "round robin" type of scheduling is realized (otherwise the first + * server might be saturated with print jobs...) + * + * Thanks to Joel Fredrikson for helping us get this right! + */ + + for (i = c->last_printer + 1; ; i ++) + { + if (i >= c->num_printers) + i = 0; + + if (c->printers[i]->accepting && + (c->printers[i]->state == IPP_PRINTER_IDLE || + ((c->printers[i]->type & CUPS_PRINTER_REMOTE) && !c->printers[i]->job))) + { + c->last_printer = i; + return (c->printers[i]); + } + + if (i == c->last_printer) + break; + } + + return (NULL); +} + + +/* + * 'cupsdFindClass()' - Find the named class. + */ + +cupsd_printer_t * /* O - Matching class or NULL */ +cupsdFindClass(const char *name) /* I - Name of class */ +{ + cupsd_printer_t *c; /* Current class/printer */ + + + if ((c = cupsdFindDest(name)) != NULL && + (c->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))) + return (c); + else + return (NULL); +} + + +/* + * 'cupsdLoadAllClasses()' - Load classes from the classes.conf file. + */ + +void +cupsdLoadAllClasses(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* classes.conf file */ + int linenum; /* Current line number */ + char line[4096], /* Line from file */ + *value, /* Pointer to value */ + *valueptr; /* Pointer into value */ + cupsd_printer_t *p, /* Current printer class */ + *temp; /* Temporary pointer to printer */ + + + /* + * Open the classes.conf file... + */ + + snprintf(line, sizeof(line), "%s/classes.conf", ServerRoot); + if ((fp = cupsdOpenConfFile(line)) == NULL) + return; + + /* + * Read class configurations until we hit EOF... + */ + + linenum = 0; + p = NULL; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, " or + */ + + if (p == NULL && value) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading class %s...", value); + + /* + * Since prior classes may have implicitly defined this class, + * see if it already exists... + */ + + if ((p = cupsdFindDest(value)) != NULL) + { + p->type = CUPS_PRINTER_CLASS; + cupsdSetStringf(&p->uri, "ipp://%s:%d/classes/%s", ServerName, + LocalPort, value); + cupsdSetString(&p->error_policy, "retry-job"); + } + else + p = cupsdAddClass(value); + + p->accepting = 1; + p->state = IPP_PRINTER_IDLE; + + if (!_cups_strcasecmp(line, "")) + { + if (p != NULL) + { + cupsdSetPrinterAttrs(p); + p = NULL; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!p) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "UUID")) + { + if (value && !strncmp(value, "urn:uuid:", 9)) + cupsdSetString(&(p->uuid), value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad UUID on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "AuthInfoRequired")) + { + if (!cupsdSetAuthInfoRequired(p, value, NULL)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad AuthInfoRequired on line %d of classes.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "Info")) + { + if (value) + cupsdSetString(&p->info, value); + } + else if (!_cups_strcasecmp(line, "Location")) + { + if (value) + cupsdSetString(&p->location, value); + } + else if (!_cups_strcasecmp(line, "Option") && value) + { + /* + * Option name value + */ + + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (!*valueptr) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + else + { + for (; *valueptr && isspace(*valueptr & 255); *valueptr++ = '\0'); + + p->num_options = cupsAddOption(value, valueptr, p->num_options, + &(p->options)); + } + } + else if (!_cups_strcasecmp(line, "Printer")) + { + if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + continue; + } + else if ((temp = cupsdFindPrinter(value)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown printer %s on line %d of classes.conf.", + value, linenum); + + /* + * Add the missing remote printer... + */ + + if ((temp = cupsdAddPrinter(value)) != NULL) + { + cupsdSetString(&temp->make_model, "Remote Printer on unknown"); + + temp->state = IPP_PRINTER_STOPPED; + temp->type |= CUPS_PRINTER_REMOTE; + temp->browse_time = 2147483647; + + cupsdSetString(&temp->location, "Location Unknown"); + cupsdSetString(&temp->info, "No Information Available"); + temp->hostname[0] = '\0'; + + cupsdSetPrinterAttrs(temp); + } + } + + if (temp) + cupsdAddPrinterToClass(p, temp); + } + else if (!_cups_strcasecmp(line, "State")) + { + /* + * Set the initial queue state... + */ + + if (!_cups_strcasecmp(value, "idle")) + p->state = IPP_PRINTER_IDLE; + else if (!_cups_strcasecmp(value, "stopped")) + { + p->state = IPP_PRINTER_STOPPED; + + for (i = 0 ; i < p->num_reasons; i ++) + if (!strcmp("paused", p->reasons[i])) + break; + + if (i >= p->num_reasons && + p->num_reasons < (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + p->reasons[p->num_reasons] = _cupsStrAlloc("paused"); + p->num_reasons ++; + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "StateMessage")) + { + /* + * Set the initial queue state message... + */ + + if (value) + strlcpy(p->state_message, value, sizeof(p->state_message)); + } + else if (!_cups_strcasecmp(line, "StateTime")) + { + /* + * Set the state time... + */ + + if (value) + p->state_time = atoi(value); + } + else if (!_cups_strcasecmp(line, "Accepting")) + { + /* + * Set the initial accepting state... + */ + + if (value && + (!_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "true"))) + p->accepting = 1; + else if (value && + (!_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "false"))) + p->accepting = 0; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "Shared")) + { + /* + * Set the initial shared state... + */ + + if (value && + (!_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "true"))) + p->shared = 1; + else if (value && + (!_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "false"))) + p->shared = 0; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "JobSheets")) + { + /* + * Set the initial job sheets... + */ + + if (value) + { + for (valueptr = value; + *valueptr && !isspace(*valueptr & 255); + valueptr ++); + + if (*valueptr) + *valueptr++ = '\0'; + + cupsdSetString(&p->job_sheets[0], value); + + while (isspace(*valueptr & 255)) + valueptr ++; + + if (*valueptr) + { + for (value = valueptr; + *valueptr && !isspace(*valueptr & 255); + valueptr ++); + + if (*valueptr) + *valueptr = '\0'; + + cupsdSetString(&p->job_sheets[1], value); + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "AllowUser")) + { + if (value) + { + p->deny_users = 0; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "DenyUser")) + { + if (value) + { + p->deny_users = 1; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "QuotaPeriod")) + { + if (value) + p->quota_period = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "PageLimit")) + { + if (value) + p->page_limit = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "KLimit")) + { + if (value) + p->k_limit = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "OpPolicy")) + { + if (value) + { + cupsd_policy_t *pol; /* Policy */ + + + if ((pol = cupsdFindPolicy(value)) != NULL) + { + cupsdSetString(&p->op_policy, value); + p->op_policy_ptr = pol; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad policy \"%s\" on line %d of classes.conf", + value, linenum); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "ErrorPolicy")) + { + if (value) + { + if (strcmp(value, "retry-current-job") && strcmp(value, "retry-job")) + cupsdLogMessage(CUPSD_LOG_WARN, + "ErrorPolicy %s ignored on line %d of classes.conf", + value, linenum); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of classes.conf.", linenum); + } + else + { + /* + * Something else we don't understand... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown configuration directive %s on line %d of classes.conf.", + line, linenum); + } + } + + cupsFileClose(fp); +} + + +/* + * 'cupsdSaveAllClasses()' - Save classes to the classes.conf file. + */ + +void +cupsdSaveAllClasses(void) +{ + cups_file_t *fp; /* classes.conf file */ + char filename[1024], /* classes.conf filename */ + temp[1024], /* Temporary string */ + value[2048], /* Value string */ + *name; /* Current user name */ + cupsd_printer_t *pclass; /* Current printer class */ + int i; /* Looping var */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + cups_option_t *option; /* Current option */ + + + /* + * Create the classes.conf file... + */ + + snprintf(filename, sizeof(filename), "%s/classes.conf", ServerRoot); + + if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Saving classes.conf..."); + + /* + * Write a small header to the file... + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Class configuration file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd\n"); + cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); + + /* + * Write each local class known to the system... + */ + + for (pclass = (cupsd_printer_t *)cupsArrayFirst(Printers); + pclass; + pclass = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Skip remote destinations and regular printers... + */ + + if ((pclass->type & CUPS_PRINTER_REMOTE) || + (pclass->type & CUPS_PRINTER_IMPLICIT) || + !(pclass->type & CUPS_PRINTER_CLASS)) + continue; + + /* + * Write printers as needed... + */ + + if (pclass == DefaultPrinter) + cupsFilePrintf(fp, "\n", pclass->name); + else + cupsFilePrintf(fp, "\n", pclass->name); + + cupsFilePrintf(fp, "UUID %s\n", pclass->uuid); + + if (pclass->num_auth_info_required > 0) + { + switch (pclass->num_auth_info_required) + { + case 1 : + strlcpy(value, pclass->auth_info_required[0], sizeof(value)); + break; + + case 2 : + snprintf(value, sizeof(value), "%s,%s", + pclass->auth_info_required[0], + pclass->auth_info_required[1]); + break; + + case 3 : + default : + snprintf(value, sizeof(value), "%s,%s,%s", + pclass->auth_info_required[0], + pclass->auth_info_required[1], + pclass->auth_info_required[2]); + break; + } + + cupsFilePutConf(fp, "AuthInfoRequired", value); + } + + if (pclass->info) + cupsFilePutConf(fp, "Info", pclass->info); + + if (pclass->location) + cupsFilePutConf(fp, "Location", pclass->location); + + if (pclass->state == IPP_PRINTER_STOPPED) + cupsFilePuts(fp, "State Stopped\n"); + else + cupsFilePuts(fp, "State Idle\n"); + + cupsFilePrintf(fp, "StateTime %d\n", (int)pclass->state_time); + + if (pclass->accepting) + cupsFilePuts(fp, "Accepting Yes\n"); + else + cupsFilePuts(fp, "Accepting No\n"); + + if (pclass->shared) + cupsFilePuts(fp, "Shared Yes\n"); + else + cupsFilePuts(fp, "Shared No\n"); + + snprintf(value, sizeof(value), "%s %s", pclass->job_sheets[0], + pclass->job_sheets[1]); + cupsFilePutConf(fp, "JobSheets", value); + + for (i = 0; i < pclass->num_printers; i ++) + cupsFilePrintf(fp, "Printer %s\n", pclass->printers[i]->name); + + cupsFilePrintf(fp, "QuotaPeriod %d\n", pclass->quota_period); + cupsFilePrintf(fp, "PageLimit %d\n", pclass->page_limit); + cupsFilePrintf(fp, "KLimit %d\n", pclass->k_limit); + + for (name = (char *)cupsArrayFirst(pclass->users); + name; + name = (char *)cupsArrayNext(pclass->users)) + cupsFilePutConf(fp, pclass->deny_users ? "DenyUser" : "AllowUser", name); + + if (pclass->op_policy) + cupsFilePutConf(fp, "OpPolicy", pclass->op_policy); + if (pclass->error_policy) + cupsFilePutConf(fp, "ErrorPolicy", pclass->error_policy); + + for (i = pclass->num_options, option = pclass->options; + i > 0; + i --, option ++) + { + snprintf(value, sizeof(value), "%s %s", option->name, option->value); + cupsFilePutConf(fp, "Option", value); + } + + cupsFilePuts(fp, "\n"); + } + + cupsdCloseCreatedConfFile(fp, filename); +} + + +/* + * 'cupsdUpdateImplicitClasses()' - Update the accepting state of implicit + * classes. + */ + +void +cupsdUpdateImplicitClasses(void) +{ + int i; /* Looping var */ + cupsd_printer_t *pclass; /* Current class */ + int accepting; /* printer-is-accepting-jobs value */ + + + for (pclass = (cupsd_printer_t *)cupsArrayFirst(ImplicitPrinters); + pclass; + pclass = (cupsd_printer_t *)cupsArrayNext(ImplicitPrinters)) + { + /* + * Loop through the printers to come up with a composite state... + */ + + for (i = 0, accepting = 0; i < pclass->num_printers; i ++) + if ((accepting = pclass->printers[i]->accepting) != 0) + break; + + pclass->accepting = accepting; + } +} + + +/* + * End of "$Id: classes.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/classes.h b/scheduler/classes.h new file mode 100644 index 0000000..05c0878 --- /dev/null +++ b/scheduler/classes.h @@ -0,0 +1,36 @@ +/* + * "$Id: classes.h 9350 2010-11-04 23:23:25Z mike $" + * + * Printer class definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + + +/* + * Prototypes... + */ + +extern cupsd_printer_t *cupsdAddClass(const char *name); +extern void cupsdAddPrinterToClass(cupsd_printer_t *c, + cupsd_printer_t *p); +extern int cupsdDeletePrinterFromClass(cupsd_printer_t *c, + cupsd_printer_t *p); +extern int cupsdDeletePrinterFromClasses(cupsd_printer_t *p); +extern cupsd_printer_t *cupsdFindAvailablePrinter(const char *name); +extern cupsd_printer_t *cupsdFindClass(const char *name); +extern void cupsdLoadAllClasses(void); +extern void cupsdSaveAllClasses(void); +extern void cupsdUpdateImplicitClasses(void); + + +/* + * End of "$Id: classes.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/client.c b/scheduler/client.c new file mode 100644 index 0000000..7fc6b4d --- /dev/null +++ b/scheduler/client.c @@ -0,0 +1,5204 @@ +/* + * "$Id: client.c 10338 2012-03-07 06:05:39Z mike $" + * + * Client routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * This file contains Kerberos support code, copyright 2006 by + * Jelmer Vernooij. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAcceptClient() - Accept a new client. + * cupsdCloseAllClients() - Close all remote clients immediately. + * cupsdCloseClient() - Close a remote client. + * cupsdFlushHeader() - Flush the header fields to the client. + * cupsdReadClient() - Read data from a client. + * cupsdSendCommand() - Send output from a command via HTTP. + * cupsdSendError() - Send an error message via HTTP. + * cupsdSendHeader() - Send an HTTP request. + * cupsdUpdateCGI() - Read status messages from CGI scripts and + * programs. + * cupsdWriteClient() - Write data to a client as needed. + * check_if_modified() - Decode an "If-Modified-Since" line. + * compare_clients() - Compare two client connections. + * copy_cdsa_certificate() - Copy a SSL/TLS certificate from the System + * keychain. + * data_ready() - Check whether data is available from a client. + * encrypt_client() - Enable encryption for the client... + * get_file() - Get a filename and state info. + * install_conf_file() - Install a configuration file. + * is_cgi() - Is the resource a CGI script/program? + * is_path_absolute() - Is a path absolute and free of relative elements + * (i.e. ".."). + * make_certificate() - Make a self-signed SSL/TLS certificate. + * pipe_command() - Pipe the output of a command to the remote + * client. + * valid_host() - Is the Host: field valid? + * write_file() - Send a file via HTTP. + * write_pipe() - Flag that data is available on the CGI pipe. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + +#ifdef HAVE_TCPD_H +# include +#endif /* HAVE_TCPD_H */ + + +/* + * Local functions... + */ + +static int check_if_modified(cupsd_client_t *con, + struct stat *filestats); +static int compare_clients(cupsd_client_t *a, cupsd_client_t *b, + void *data); +#ifdef HAVE_CDSASSL +static CFArrayRef copy_cdsa_certificate(cupsd_client_t *con); +#endif /* HAVE_CDSASSL */ +static int data_ready(cupsd_client_t *con); +#ifdef HAVE_SSL +static int encrypt_client(cupsd_client_t *con); +#endif /* HAVE_SSL */ +static char *get_file(cupsd_client_t *con, struct stat *filestats, + char *filename, int len); +static http_status_t install_conf_file(cupsd_client_t *con); +static int is_cgi(cupsd_client_t *con, const char *filename, + struct stat *filestats, mime_type_t *type); +static int is_path_absolute(const char *path); +#ifdef HAVE_SSL +static int make_certificate(cupsd_client_t *con); +#endif /* HAVE_SSL */ +static int pipe_command(cupsd_client_t *con, int infile, int *outfile, + char *command, char *options, int root); +static int valid_host(cupsd_client_t *con); +static int write_file(cupsd_client_t *con, http_status_t code, + char *filename, char *type, + struct stat *filestats); +static void write_pipe(cupsd_client_t *con); + + +/* + * 'cupsdAcceptClient()' - Accept a new client. + */ + +void +cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ +{ + int count; /* Count of connections on a host */ + int val; /* Parameter value */ + cupsd_client_t *con, /* New client pointer */ + *tempcon; /* Temporary client pointer */ + http_addrlist_t *addrlist, /* List of adddresses for host */ + *addr; /* Current address */ + socklen_t addrlen; /* Length of address */ + char *hostname; /* Hostname for address */ + http_addr_t temp; /* Temporary address variable */ + static time_t last_dos = 0; /* Time of last DoS attack */ +#ifdef HAVE_TCPD_H + struct request_info wrap_req; /* TCP wrappers request information */ +#endif /* HAVE_TCPD_H */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAcceptClient(lis=%p(%d)) Clients=%d", + lis, lis->fd, cupsArrayCount(Clients)); + + /* + * Make sure we don't have a full set of clients already... + */ + + if (cupsArrayCount(Clients) == MaxClients) + return; + + /* + * Get a pointer to the next available client... + */ + + if (!Clients) + Clients = cupsArrayNew(NULL, NULL); + + if (!Clients) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for clients array!"); + cupsdPauseListening(); + return; + } + + if (!ActiveClients) + ActiveClients = cupsArrayNew((cups_array_func_t)compare_clients, NULL); + + if (!ActiveClients) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for active clients array!"); + cupsdPauseListening(); + return; + } + + if ((con = calloc(1, sizeof(cupsd_client_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate memory for client!"); + cupsdPauseListening(); + return; + } + + con->http.activity = time(NULL); + con->file = -1; + con->http.hostaddr = &(con->clientaddr); + con->http.wait_value = 10000; + + /* + * Accept the client and get the remote address... + */ + + addrlen = sizeof(http_addr_t); + + if ((con->http.fd = accept(lis->fd, (struct sockaddr *)con->http.hostaddr, + &addrlen)) < 0) + { + if (errno == ENFILE || errno == EMFILE) + cupsdPauseListening(); + + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to accept client connection - %s.", + strerror(errno)); + free(con); + + return; + } + + /* + * Save the connected port number... + */ + + _httpAddrSetPort(con->http.hostaddr, _httpAddrPort(&(lis->address))); + +#ifdef AF_INET6 + /* + * Convert IPv4 over IPv6 addresses (::ffff:n.n.n.n) to IPv4 forms we + * can more easily use... + */ + + if (lis->address.addr.sa_family == AF_INET6 && + con->http.hostaddr->ipv6.sin6_addr.s6_addr32[0] == 0 && + con->http.hostaddr->ipv6.sin6_addr.s6_addr32[1] == 0 && + ntohl(con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2]) == 0xffff) + con->http.hostaddr->ipv6.sin6_addr.s6_addr32[2] = 0; +#endif /* AF_INET6 */ + + /* + * Check the number of clients on the same address... + */ + + for (count = 0, tempcon = (cupsd_client_t *)cupsArrayFirst(Clients); + tempcon; + tempcon = (cupsd_client_t *)cupsArrayNext(Clients)) + if (httpAddrEqual(tempcon->http.hostaddr, con->http.hostaddr)) + { + count ++; + if (count >= MaxClientsPerHost) + break; + } + + if (count >= MaxClientsPerHost) + { + if ((time(NULL) - last_dos) >= 60) + { + last_dos = time(NULL); + cupsdLogMessage(CUPSD_LOG_WARN, + "Possible DoS attack - more than %d clients connecting " + "from %s!", + MaxClientsPerHost, + httpAddrString(con->http.hostaddr, con->http.hostname, + sizeof(con->http.hostname))); + } + +#ifdef WIN32 + closesocket(con->http.fd); +#else + close(con->http.fd); +#endif /* WIN32 */ + + free(con); + return; + } + + /* + * Get the hostname or format the IP address as needed... + */ + + if (httpAddrLocalhost(con->http.hostaddr)) + { + /* + * Map accesses from the loopback interface to "localhost"... + */ + + strlcpy(con->http.hostname, "localhost", sizeof(con->http.hostname)); + hostname = con->http.hostname; + } + else + { + /* + * Map accesses from the same host to the server name. + */ + + if (HostNameLookups) + hostname = httpAddrLookup(con->http.hostaddr, con->http.hostname, + sizeof(con->http.hostname)); + else + { + hostname = NULL; + httpAddrString(con->http.hostaddr, con->http.hostname, + sizeof(con->http.hostname)); + } + } + + if (hostname == NULL && HostNameLookups == 2) + { + /* + * Can't have an unresolved IP address with double-lookups enabled... + */ + +#ifdef WIN32 + closesocket(con->http.fd); +#else + close(con->http.fd); +#endif /* WIN32 */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "Name lookup failed - connection from %s closed!", + con->http.hostname); + + free(con); + return; + } + + if (HostNameLookups == 2) + { + /* + * Do double lookups as needed... + */ + + if ((addrlist = httpAddrGetList(con->http.hostname, AF_UNSPEC, NULL)) + != NULL) + { + /* + * See if the hostname maps to the same IP address... + */ + + for (addr = addrlist; addr; addr = addr->next) + if (httpAddrEqual(con->http.hostaddr, &(addr->addr))) + break; + } + else + addr = NULL; + + httpAddrFreeList(addrlist); + + if (!addr) + { + /* + * Can't have a hostname that doesn't resolve to the same IP address + * with double-lookups enabled... + */ + +#ifdef WIN32 + closesocket(con->http.fd); +#else + close(con->http.fd); +#endif /* WIN32 */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "IP lookup failed - connection from %s closed!", + con->http.hostname); + free(con); + return; + } + } + +#ifdef HAVE_TCPD_H + /* + * See if the connection is denied by TCP wrappers... + */ + + request_init(&wrap_req, RQ_DAEMON, "cupsd", RQ_FILE, con->http.fd, NULL); + fromhost(&wrap_req); + + if (!hosts_access(&wrap_req)) + { +#ifdef WIN32 + closesocket(con->http.fd); +#else + close(con->http.fd); +#endif /* WIN32 */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "Connection from %s refused by /etc/hosts.allow and " + "/etc/hosts.deny rules.", con->http.hostname); + free(con); + return; + } +#endif /* HAVE_TCPD_H */ + +#ifdef AF_LOCAL + if (con->http.hostaddr->addr.sa_family == AF_LOCAL) + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAcceptClient: %d from %s (Domain)", + con->http.fd, con->http.hostname); + else +#endif /* AF_LOCAL */ + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdAcceptClient: %d from %s:%d (IPv%d)", + con->http.fd, con->http.hostname, + _httpAddrPort(con->http.hostaddr), + _httpAddrFamily(con->http.hostaddr) == AF_INET ? 4 : 6); + + /* + * Get the local address the client connected to... + */ + + addrlen = sizeof(temp); + if (getsockname(con->http.fd, (struct sockaddr *)&temp, &addrlen)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get local address - %s", + strerror(errno)); + + strcpy(con->servername, "localhost"); + con->serverport = LocalPort; + } +#ifdef AF_LOCAL + else if (_httpAddrFamily(&temp) == AF_LOCAL) + { + strcpy(con->servername, "localhost"); + con->serverport = LocalPort; + } +#endif /* AF_LOCAL */ + else + { + if (httpAddrLocalhost(&temp)) + strlcpy(con->servername, "localhost", sizeof(con->servername)); + else if (HostNameLookups) + httpAddrLookup(&temp, con->servername, sizeof(con->servername)); + else + httpAddrString(&temp, con->servername, sizeof(con->servername)); + + con->serverport = _httpAddrPort(&(lis->address)); + } + + cupsArrayAdd(Clients, con); + + /* + * Using TCP_NODELAY improves responsiveness, especially on systems with a slow + * loopback interface. Since we write large buffers when sending print files + * and requests there shouldn't be any performance penalty for this... + */ + + val = 1; + setsockopt(con->http.fd, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val)); + + /* + * Close this file on all execs... + */ + + fcntl(con->http.fd, F_SETFD, fcntl(con->http.fd, F_GETFD) | FD_CLOEXEC); + + /* + * Add the socket to the server select. + */ + + cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con); + + /* + * Temporarily suspend accept()'s until we lose a client... + */ + + if (cupsArrayCount(Clients) == MaxClients) + cupsdPauseListening(); + +#ifdef HAVE_SSL + /* + * See if we are connecting on a secure port... + */ + + if (lis->encryption == HTTP_ENCRYPT_ALWAYS) + { + /* + * https connection; go secure... + */ + + con->http.encryption = HTTP_ENCRYPT_ALWAYS; + + if (!encrypt_client(con)) + cupsdCloseClient(con); + } + else + con->auto_ssl = 1; +#endif /* HAVE_SSL */ +} + + +/* + * 'cupsdCloseAllClients()' - Close all remote clients immediately. + */ + +void +cupsdCloseAllClients(void) +{ + cupsd_client_t *con; /* Current client */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d", + cupsArrayCount(Clients)); + + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + if (cupsdCloseClient(con)) + cupsdCloseClient(con); +} + + +/* + * 'cupsdCloseClient()' - Close a remote client. + */ + +int /* O - 1 if partial close, 0 if fully closed */ +cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ +{ + int partial; /* Do partial close for SSL? */ +#ifdef HAVE_LIBSSL + SSL_CTX *context; /* Context for encryption */ + unsigned long error; /* Error code */ +#elif defined(HAVE_GNUTLS) + int error; /* Error code */ + gnutls_certificate_server_credentials *credentials; + /* TLS credentials */ +# elif defined(HAVE_CDSASSL) +#endif /* HAVE_LIBSSL */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCloseClient: %d", con->http.fd); + + /* + * Flush pending writes before closing... + */ + + httpFlushWrite(HTTP(con)); + + partial = 0; + +#ifdef HAVE_SSL + /* + * Shutdown encryption as needed... + */ + + if (con->http.tls) + { + partial = 1; + +# ifdef HAVE_LIBSSL + context = SSL_get_SSL_CTX(con->http.tls); + + switch (SSL_shutdown(con->http.tls)) + { + case 1 : + cupsdLogMessage(CUPSD_LOG_DEBUG, + "SSL shutdown successful!"); + break; + case -1 : + cupsdLogMessage(CUPSD_LOG_ERROR, + "Fatal error during SSL shutdown!"); + default : + while ((error = ERR_get_error()) != 0) + cupsdLogMessage(CUPSD_LOG_ERROR, "SSL shutdown failed: %s", + ERR_error_string(error, NULL)); + break; + } + + SSL_CTX_free(context); + SSL_free(con->http.tls); + +# elif defined(HAVE_GNUTLS) + credentials = (gnutls_certificate_server_credentials *)(con->http.tls_credentials); + + error = gnutls_bye(con->http.tls, GNUTLS_SHUT_WR); + switch (error) + { + case GNUTLS_E_SUCCESS: + cupsdLogMessage(CUPSD_LOG_DEBUG, + "SSL shutdown successful!"); + break; + default: + cupsdLogMessage(CUPSD_LOG_ERROR, + "SSL shutdown failed: %s", gnutls_strerror(error)); + break; + } + + gnutls_deinit(con->http.tls); + gnutls_certificate_free_credentials(*credentials); + free(credentials); + +# elif defined(HAVE_CDSASSL) + while (SSLClose(con->http.tls) == errSSLWouldBlock) + usleep(1000); + + SSLDisposeContext(con->http.tls); + + if (con->http.tls_credentials) + CFRelease(con->http.tls_credentials); + +# endif /* HAVE_LIBSSL */ + + con->http.tls = NULL; + } +#endif /* HAVE_SSL */ + + if (con->pipe_pid != 0) + { + /* + * Stop any CGI process... + */ + + cupsdEndProcess(con->pipe_pid, 1); + con->pipe_pid = 0; + } + + if (con->file >= 0) + { + cupsdRemoveSelect(con->file); + + close(con->file); + con->file = -1; + } + + /* + * Close the socket and clear the file from the input set for select()... + */ + + if (con->http.fd >= 0) + { + cupsArrayRemove(ActiveClients, con); + cupsdSetBusyState(); + + if (partial) + { + /* + * Only do a partial close so that the encrypted client gets everything. + */ + + shutdown(con->http.fd, 0); + cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con); + } + else + { + /* + * Shut the socket down fully... + */ + + cupsdRemoveSelect(con->http.fd); + close(con->http.fd); + con->http.fd = -1; + } + } + + if (!partial) + { + /* + * Free memory... + */ + + if (con->http.input_set) + free(con->http.input_set); + + httpClearCookie(HTTP(con)); + httpClearFields(HTTP(con)); + + cupsdClearString(&con->filename); + cupsdClearString(&con->command); + cupsdClearString(&con->options); + cupsdClearString(&con->query_string); + + if (con->request) + { + ippDelete(con->request); + con->request = NULL; + } + + if (con->response) + { + ippDelete(con->response); + con->response = NULL; + } + + if (con->language) + { + cupsLangFree(con->language); + con->language = NULL; + } + +#ifdef HAVE_AUTHORIZATION_H + if (con->authref) + { + AuthorizationFree(con->authref, kAuthorizationFlagDefaults); + con->authref = NULL; + } +#endif /* HAVE_AUTHORIZATION_H */ + + /* + * Re-enable new client connections if we are going back under the + * limit... + */ + + if (cupsArrayCount(Clients) == MaxClients) + cupsdResumeListening(); + + /* + * Compact the list of clients as necessary... + */ + + cupsArrayRemove(Clients, con); + + free(con); + } + + return (partial); +} + + +/* + * 'cupsdFlushHeader()' - Flush the header fields to the client. + */ + +int /* I - Bytes written or -1 on error */ +cupsdFlushHeader(cupsd_client_t *con) /* I - Client to flush to */ +{ + int bytes = httpFlushWrite(HTTP(con)); + + con->http.data_encoding = HTTP_ENCODE_LENGTH; + + return (bytes); +} + + +/* + * 'cupsdReadClient()' - Read data from a client. + */ + +void +cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ +{ + char line[32768], /* Line from client... */ + operation[64], /* Operation code from socket */ + version[64], /* HTTP version number string */ + locale[64], /* Locale */ + *ptr; /* Pointer into strings */ + int major, minor; /* HTTP version numbers */ + http_status_t status; /* Transfer status */ + ipp_state_t ipp_state; /* State of IPP transfer */ + int bytes; /* Number of bytes to POST */ + char *filename; /* Name of file for GET/HEAD */ + char buf[1024]; /* Buffer for real filename */ + struct stat filestats; /* File information */ + mime_type_t *type; /* MIME type of file */ + cupsd_printer_t *p; /* Printer */ + static unsigned request_id = 0; /* Request ID for temp files */ + + + status = HTTP_CONTINUE; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdReadClient(con=%p(%d)) " + "con->http.error=%d " + "con->http.used=%d, " + "con->http.state=%d " + "con->data_encoding=HTTP_ENCODE_%s, " + "con->data_remaining=" CUPS_LLFMT ", " + "con->file=%d", + con, con->http.fd, con->http.error, con->http.used, + con->http.state, + con->http.data_encoding == HTTP_ENCODE_CHUNKED ? + "CHUNKED" : "LENGTH", + CUPS_LLCAST con->http.data_remaining, con->file); + +#ifdef HAVE_SSL + if (con->auto_ssl) + { + /* + * Automatically check for a SSL/TLS handshake... + */ + + con->auto_ssl = 0; + + if (recv(con->http.fd, buf, 1, MSG_PEEK) == 1 && + (!buf[0] || !strchr("DGHOPT", buf[0]))) + { + /* + * Encrypt this connection... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdReadClient: Saw first byte %02X, auto-negotiating " + "SSL/TLS session...", buf[0] & 255); + + if (!encrypt_client(con)) + cupsdCloseClient(con); + + return; + } + } +#endif /* HAVE_SSL */ + + switch (con->http.state) + { + case HTTP_WAITING : + /* + * See if we've received a request line... + */ + + if (httpGets(line, sizeof(line) - 1, HTTP(con)) == NULL) + { + if (con->http.error && con->http.error != EPIPE) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d WAITING Closing for error %d " + "(%s)", con->http.fd, con->http.error, + strerror(con->http.error)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d WAITING Closing on EOF", + con->http.fd); + + cupsdCloseClient(con); + return; + } + + /* + * Ignore blank request lines... + */ + + if (line[0] == '\0') + break; + + /* + * Clear other state variables... + */ + + httpClearFields(HTTP(con)); + + con->http.activity = time(NULL); + con->http.version = HTTP_1_0; + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + con->http.data_encoding = HTTP_ENCODE_LENGTH; + con->http.data_remaining = 0; + con->http._data_remaining = 0; + con->operation = HTTP_WAITING; + con->bytes = 0; + con->file = -1; + con->file_ready = 0; + con->pipe_pid = 0; + con->username[0] = '\0'; + con->password[0] = '\0'; + con->uri[0] = '\0'; + + cupsdClearString(&con->command); + cupsdClearString(&con->options); + cupsdClearString(&con->query_string); + + if (con->request) + { + ippDelete(con->request); + con->request = NULL; + } + + if (con->response) + { + ippDelete(con->response); + con->response = NULL; + } + + if (con->language) + { + cupsLangFree(con->language); + con->language = NULL; + } + +#ifdef HAVE_GSSAPI + con->have_gss = 0; + con->gss_uid = 0; +#endif /* HAVE_GSSAPI */ + + /* + * Grab the request line... + */ + + switch (sscanf(line, "%63s%1023s%63s", operation, con->uri, version)) + { + case 1 : + if (line[0]) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad request line \"%s\" from %s!", + _httpEncodeURI(buf, line, sizeof(buf)), + con->http.hostname); + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + } + return; + case 2 : + con->http.version = HTTP_0_9; + break; + case 3 : + if (sscanf(version, "HTTP/%d.%d", &major, &minor) != 2) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad request line \"%s\" from %s!", + _httpEncodeURI(buf, line, sizeof(buf)), + con->http.hostname); + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + + if (major < 2) + { + con->http.version = (http_version_t)(major * 100 + minor); + if (con->http.version == HTTP_1_1 && KeepAlive) + con->http.keep_alive = HTTP_KEEPALIVE_ON; + else + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unsupported request line \"%s\" from %s!", + _httpEncodeURI(buf, line, sizeof(buf)), + con->http.hostname); + cupsdSendError(con, HTTP_NOT_SUPPORTED, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + break; + } + + /* + * Handle full URLs in the request line... + */ + + if (strcmp(con->uri, "*")) + { + char scheme[HTTP_MAX_URI], /* Method/scheme */ + userpass[HTTP_MAX_URI], /* Username:password */ + hostname[HTTP_MAX_URI], /* Hostname */ + resource[HTTP_MAX_URI]; /* Resource path */ + int port; /* Port number */ + + + /* + * Separate the URI into its components... + */ + + httpSeparateURI(HTTP_URI_CODING_MOST, con->uri, + scheme, sizeof(scheme), + userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + /* + * Only allow URIs with the servername, localhost, or an IP + * address... + */ + + if (strcmp(scheme, "file") && + _cups_strcasecmp(hostname, ServerName) && + _cups_strcasecmp(hostname, "localhost") && + !isdigit(hostname[0]) && hostname[0] != '[') + { + /* + * Nope, we don't do proxies... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad URI \"%s\" in request!", + con->uri); + cupsdSendError(con, HTTP_METHOD_NOT_ALLOWED, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + + /* + * Copy the resource portion back into the URI; both resource and + * con->uri are HTTP_MAX_URI bytes in size... + */ + + strcpy(con->uri, resource); + } + + /* + * Process the request... + */ + + if (!strcmp(operation, "GET")) + con->http.state = HTTP_GET; + else if (!strcmp(operation, "PUT")) + con->http.state = HTTP_PUT; + else if (!strcmp(operation, "POST")) + con->http.state = HTTP_POST; + else if (!strcmp(operation, "DELETE")) + con->http.state = HTTP_DELETE; + else if (!strcmp(operation, "TRACE")) + con->http.state = HTTP_TRACE; + else if (!strcmp(operation, "OPTIONS")) + con->http.state = HTTP_OPTIONS; + else if (!strcmp(operation, "HEAD")) + con->http.state = HTTP_HEAD; + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad operation \"%s\"!", operation); + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + + gettimeofday(&(con->start), NULL); + con->operation = con->http.state; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %s %s HTTP/%d.%d", + con->http.fd, operation, con->uri, + con->http.version / 100, con->http.version % 100); + + con->http.status = HTTP_OK; + + if (!cupsArrayFind(ActiveClients, con)) + { + cupsArrayAdd(ActiveClients, con); + cupsdSetBusyState(); + } + + case HTTP_OPTIONS : + case HTTP_DELETE : + case HTTP_GET : + case HTTP_HEAD : + case HTTP_POST : + case HTTP_PUT : + case HTTP_TRACE : + /* + * Parse incoming parameters until the status changes... + */ + + while ((status = httpUpdate(HTTP(con))) == HTTP_CONTINUE) + if (!data_ready(con)) + break; + + if (status != HTTP_OK && status != HTTP_CONTINUE) + { + if (con->http.error && con->http.error != EPIPE) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d FIELDS Closing for error %d " + "(%s)", con->http.fd, con->http.error, + strerror(con->http.error)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d FIELDS Closing on EOF", + con->http.fd); + + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + break; + + default : + if (!data_ready(con) && recv(con->http.fd, buf, 1, MSG_PEEK) < 1) + { + /* + * Connection closed... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d Closing on EOF", con->http.fd); + cupsdCloseClient(con); + return; + } + break; /* Anti-compiler-warning-code */ + } + + /* + * Handle new transfers... + */ + + if (status == HTTP_OK) + { + if (con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE][0]) + { + /* + * Figure out the locale from the Accept-Language and Content-Type + * fields... + */ + + if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], + ',')) != NULL) + *ptr = '\0'; + + if ((ptr = strchr(con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], + ';')) != NULL) + *ptr = '\0'; + + if ((ptr = strstr(con->http.fields[HTTP_FIELD_CONTENT_TYPE], + "charset=")) != NULL) + { + /* + * Combine language and charset, and trim any extra params in the + * content-type. + */ + + snprintf(locale, sizeof(locale), "%s.%s", + con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], ptr + 8); + + if ((ptr = strchr(locale, ',')) != NULL) + *ptr = '\0'; + } + else + snprintf(locale, sizeof(locale), "%s.UTF-8", + con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE]); + + con->language = cupsLangGet(locale); + } + else + con->language = cupsLangGet(DefaultLocale); + + cupsdAuthorize(con); + + if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "Keep-Alive", + 10) && KeepAlive) + con->http.keep_alive = HTTP_KEEPALIVE_ON; + else if (!_cups_strncasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "close", 5)) + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + + if (!con->http.fields[HTTP_FIELD_HOST][0] && + con->http.version >= HTTP_1_1) + { + /* + * HTTP/1.1 and higher require the "Host:" field... + */ + + if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing Host: field in request!"); + cupsdCloseClient(con); + return; + } + } + else if (!valid_host(con)) + { + /* + * Access to localhost must use "localhost" or the corresponding IPv4 + * or IPv6 values in the Host: field. + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Request from \"%s\" using invalid Host: field \"%s\"", + con->http.hostname, con->http.fields[HTTP_FIELD_HOST]); + + if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else if (con->operation == HTTP_OPTIONS) + { + /* + * Do OPTIONS command... + */ + + if (con->best && con->best->type != CUPSD_AUTH_NONE) + { + if (!cupsdSendHeader(con, HTTP_UNAUTHORIZED, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + + if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "Upgrade") && + con->http.tls == NULL) + { +#ifdef HAVE_SSL + /* + * Do encryption stuff... + */ + + if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + httpPrintf(HTTP(con), "Connection: Upgrade\r\n"); + httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n"); + httpPrintf(HTTP(con), "Content-Length: 0\r\n"); + httpPrintf(HTTP(con), "\r\n"); + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + if (!encrypt_client(con)) + { + cupsdCloseClient(con); + return; + } +#else + if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } +#endif /* HAVE_SSL */ + } + + if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n"); + httpPrintf(HTTP(con), "Content-Length: 0\r\n"); + httpPrintf(HTTP(con), "\r\n"); + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + } + else if (!is_path_absolute(con->uri)) + { + /* + * Protect against malicious users! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Request for non-absolute resource \"%s\"!", con->uri); + + if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + { + if (!_cups_strcasecmp(con->http.fields[HTTP_FIELD_CONNECTION], "Upgrade") && + con->http.tls == NULL) + { +#ifdef HAVE_SSL + /* + * Do encryption stuff... + */ + + if (!cupsdSendHeader(con, HTTP_SWITCHING_PROTOCOLS, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + httpPrintf(HTTP(con), "Connection: Upgrade\r\n"); + httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n"); + httpPrintf(HTTP(con), "Content-Length: 0\r\n"); + httpPrintf(HTTP(con), "\r\n"); + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + if (!encrypt_client(con)) + { + cupsdCloseClient(con); + return; + } +#else + if (!cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } +#endif /* HAVE_SSL */ + } + + if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_OK) + { + cupsdSendError(con, status, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + + if (con->http.expect && + (con->operation == HTTP_POST || con->operation == HTTP_PUT)) + { + if (con->http.expect == HTTP_CONTINUE) + { + /* + * Send 100-continue header... + */ + + if (!cupsdSendHeader(con, HTTP_CONTINUE, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + { + /* + * Send 417-expectation-failed header... + */ + + if (!cupsdSendHeader(con, HTTP_EXPECTATION_FAILED, NULL, + CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + httpPrintf(HTTP(con), "Content-Length: 0\r\n"); + httpPrintf(HTTP(con), "\r\n"); + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + } + } + + switch (con->http.state) + { + case HTTP_GET_SEND : + if (!strncmp(con->uri, "/printers/", 10) && + !strcmp(con->uri + strlen(con->uri) - 4, ".ppd")) + { + /* + * Send PPD file - get the real printer name since printer + * names are not case sensitive but filenames can be... + */ + + con->uri[strlen(con->uri) - 4] = '\0'; /* Drop ".ppd" */ + + if ((p = cupsdFindPrinter(con->uri + 10)) != NULL) + snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name); + else + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + } + else if ((!strncmp(con->uri, "/printers/", 10) || + !strncmp(con->uri, "/classes/", 9)) && + !strcmp(con->uri + strlen(con->uri) - 4, ".png")) + { + /* + * Send icon file - get the real queue name since queue names are + * not case sensitive but filenames can be... + */ + + con->uri[strlen(con->uri) - 4] = '\0'; /* Drop ".png" */ + + if (!strncmp(con->uri, "/printers/", 10)) + p = cupsdFindPrinter(con->uri + 10); + else + p = cupsdFindClass(con->uri + 9); + + if (p) + snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name); + else + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + } + else if (!WebInterface) + { + /* + * Web interface is disabled. Show an appropriate message... + */ + + if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + if ((!strncmp(con->uri, "/admin", 6) && + strncmp(con->uri, "/admin/conf/", 12) && + strncmp(con->uri, "/admin/log/", 11)) || + !strncmp(con->uri, "/printers", 9) || + !strncmp(con->uri, "/classes", 8) || + !strncmp(con->uri, "/help", 5) || + !strncmp(con->uri, "/jobs", 5)) + { + /* + * Send CGI output... + */ + + if (!strncmp(con->uri, "/admin", 6)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/admin.cgi", + ServerBin); + + cupsdSetString(&con->options, strchr(con->uri + 6, '?')); + } + else if (!strncmp(con->uri, "/printers", 9)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/printers.cgi", + ServerBin); + + if (con->uri[9] && con->uri[10]) + cupsdSetString(&con->options, con->uri + 9); + else + cupsdSetString(&con->options, NULL); + } + else if (!strncmp(con->uri, "/classes", 8)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/classes.cgi", + ServerBin); + + if (con->uri[8] && con->uri[9]) + cupsdSetString(&con->options, con->uri + 8); + else + cupsdSetString(&con->options, NULL); + } + else if (!strncmp(con->uri, "/jobs", 5)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/jobs.cgi", + ServerBin); + + if (con->uri[5] && con->uri[6]) + cupsdSetString(&con->options, con->uri + 5); + else + cupsdSetString(&con->options, NULL); + } + else + { + cupsdSetStringf(&con->command, "%s/cgi-bin/help.cgi", + ServerBin); + + if (con->uri[5] && con->uri[6]) + cupsdSetString(&con->options, con->uri + 5); + else + cupsdSetString(&con->options, NULL); + } + + if (!cupsdSendCommand(con, con->command, con->options, 0)) + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + cupsdLogRequest(con, HTTP_OK); + + if (con->http.version <= HTTP_1_0) + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + } + else if ((!strncmp(con->uri, "/admin/conf/", 12) && + (strchr(con->uri + 12, '/') || + strlen(con->uri) == 12)) || + (!strncmp(con->uri, "/admin/log/", 11) && + (strchr(con->uri + 11, '/') || + strlen(con->uri) == 11))) + { + /* + * GET can only be done to configuration files directly under + * /admin/conf... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Request for subdirectory \"%s\"!", con->uri); + + if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + else + { + /* + * Serve a file... + */ + + if ((filename = get_file(con, &filestats, buf, + sizeof(buf))) == NULL) + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + type = mimeFileType(MimeDatabase, filename, NULL, NULL); + + if (is_cgi(con, filename, &filestats, type)) + { + /* + * Note: con->command and con->options were set by + * is_cgi()... + */ + + if (!cupsdSendCommand(con, con->command, con->options, 0)) + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + cupsdLogRequest(con, HTTP_OK); + + if (con->http.version <= HTTP_1_0) + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + break; + } + + if (!check_if_modified(con, &filestats)) + { + if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + { + if (type == NULL) + strcpy(line, "text/plain"); + else + snprintf(line, sizeof(line), "%s/%s", type->super, type->type); + + if (!write_file(con, HTTP_OK, filename, line, &filestats)) + { + cupsdCloseClient(con); + return; + } + } + } + break; + + case HTTP_POST_RECV : + /* + * See if the POST request includes a Content-Length field, and if + * so check the length against any limits that are set... + */ + + if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] && + MaxRequestSize > 0 && + con->http.data_remaining > MaxRequestSize) + { + /* + * Request too large... + */ + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + else if (con->http.data_remaining < 0 || + (!con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] && + con->http.data_encoding == HTTP_ENCODE_LENGTH)) + { + /* + * Negative content lengths are invalid! + */ + + if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + /* + * See what kind of POST request this is; for IPP requests the + * content-type field will be "application/ipp"... + */ + + if (!strcmp(con->http.fields[HTTP_FIELD_CONTENT_TYPE], + "application/ipp")) + con->request = ippNew(); + else if (!WebInterface) + { + /* + * Web interface is disabled. Show an appropriate message... + */ + + if (!cupsdSendError(con, HTTP_WEBIF_DISABLED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + else if ((!strncmp(con->uri, "/admin", 6) && + strncmp(con->uri, "/admin/conf/", 12) && + strncmp(con->uri, "/admin/log/", 11)) || + !strncmp(con->uri, "/printers", 9) || + !strncmp(con->uri, "/classes", 8) || + !strncmp(con->uri, "/help", 5) || + !strncmp(con->uri, "/jobs", 5)) + { + /* + * CGI request... + */ + + if (!strncmp(con->uri, "/admin", 6)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/admin.cgi", + ServerBin); + + cupsdSetString(&con->options, strchr(con->uri + 6, '?')); + } + else if (!strncmp(con->uri, "/printers", 9)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/printers.cgi", + ServerBin); + + if (con->uri[9] && con->uri[10]) + cupsdSetString(&con->options, con->uri + 9); + else + cupsdSetString(&con->options, NULL); + } + else if (!strncmp(con->uri, "/classes", 8)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/classes.cgi", + ServerBin); + + if (con->uri[8] && con->uri[9]) + cupsdSetString(&con->options, con->uri + 8); + else + cupsdSetString(&con->options, NULL); + } + else if (!strncmp(con->uri, "/jobs", 5)) + { + cupsdSetStringf(&con->command, "%s/cgi-bin/jobs.cgi", + ServerBin); + + if (con->uri[5] && con->uri[6]) + cupsdSetString(&con->options, con->uri + 5); + else + cupsdSetString(&con->options, NULL); + } + else + { + cupsdSetStringf(&con->command, "%s/cgi-bin/help.cgi", + ServerBin); + + if (con->uri[5] && con->uri[6]) + cupsdSetString(&con->options, con->uri + 5); + else + cupsdSetString(&con->options, NULL); + } + + if (con->http.version <= HTTP_1_0) + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + } + else + { + /* + * POST to a file... + */ + + if ((filename = get_file(con, &filestats, buf, + sizeof(buf))) == NULL) + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + type = mimeFileType(MimeDatabase, filename, NULL, NULL); + + if (!is_cgi(con, filename, &filestats, type)) + { + /* + * Only POST to CGI's... + */ + + if (!cupsdSendError(con, HTTP_UNAUTHORIZED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + } + break; + + case HTTP_PUT_RECV : + /* + * Validate the resource name... + */ + + if (strncmp(con->uri, "/admin/conf/", 12) || + strchr(con->uri + 12, '/') || + strlen(con->uri) == 12) + { + /* + * PUT can only be done to configuration files under + * /admin/conf... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Request for subdirectory \"%s\"!", con->uri); + + if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + /* + * See if the PUT request includes a Content-Length field, and if + * so check the length against any limits that are set... + */ + + if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] && + MaxRequestSize > 0 && + con->http.data_remaining > MaxRequestSize) + { + /* + * Request too large... + */ + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + else if (con->http.data_remaining < 0) + { + /* + * Negative content lengths are invalid! + */ + + if (!cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + + /* + * Open a temporary file to hold the request... + */ + + cupsdSetStringf(&con->filename, "%s/%08x", RequestRoot, + request_id ++); + con->file = open(con->filename, O_WRONLY | O_CREAT | O_TRUNC, 0640); + + if (con->file < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create request file %s: %s", + con->filename, strerror(errno)); + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + + fchmod(con->file, 0640); + fchown(con->file, RunUser, Group); + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + break; + + case HTTP_DELETE : + case HTTP_TRACE : + cupsdSendError(con, HTTP_NOT_IMPLEMENTED, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + + case HTTP_HEAD : + if (!strncmp(con->uri, "/printers/", 10) && + !strcmp(con->uri + strlen(con->uri) - 4, ".ppd")) + { + /* + * Send PPD file - get the real printer name since printer + * names are not case sensitive but filenames can be... + */ + + con->uri[strlen(con->uri) - 4] = '\0'; /* Drop ".ppd" */ + + if ((p = cupsdFindPrinter(con->uri + 10)) != NULL) + snprintf(con->uri, sizeof(con->uri), "/ppd/%s.ppd", p->name); + else + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + } + else if (!strncmp(con->uri, "/printers/", 10) && + !strcmp(con->uri + strlen(con->uri) - 4, ".png")) + { + /* + * Send PNG file - get the real printer name since printer + * names are not case sensitive but filenames can be... + */ + + con->uri[strlen(con->uri) - 4] = '\0'; /* Drop ".ppd" */ + + if ((p = cupsdFindPrinter(con->uri + 10)) != NULL) + snprintf(con->uri, sizeof(con->uri), "/icons/%s.png", p->name); + else + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + } + else if (!WebInterface) + { + if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + if (httpPrintf(HTTP(con), "\r\n") < 0) + { + cupsdCloseClient(con); + return; + } + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + con->http.state = HTTP_WAITING; + break; + } + + if ((!strncmp(con->uri, "/admin", 6) && + strncmp(con->uri, "/admin/conf/", 12) && + strncmp(con->uri, "/admin/log/", 11)) || + !strncmp(con->uri, "/printers", 9) || + !strncmp(con->uri, "/classes", 8) || + !strncmp(con->uri, "/help", 5) || + !strncmp(con->uri, "/jobs", 5)) + { + /* + * CGI output... + */ + + if (!cupsdSendHeader(con, HTTP_OK, "text/html", CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + if (httpPrintf(HTTP(con), "\r\n") < 0) + { + cupsdCloseClient(con); + return; + } + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + cupsdLogRequest(con, HTTP_OK); + } + else if ((!strncmp(con->uri, "/admin/conf/", 12) && + (strchr(con->uri + 12, '/') || + strlen(con->uri) == 12)) || + (!strncmp(con->uri, "/admin/log/", 11) && + (strchr(con->uri + 11, '/') || + strlen(con->uri) == 11))) + { + /* + * HEAD can only be done to configuration files under + * /admin/conf... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Request for subdirectory \"%s\"!", con->uri); + + if (!cupsdSendError(con, HTTP_FORBIDDEN, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + break; + } + else if ((filename = get_file(con, &filestats, buf, + sizeof(buf))) == NULL) + { + if (!cupsdSendHeader(con, HTTP_NOT_FOUND, "text/html", + CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + cupsdLogRequest(con, HTTP_NOT_FOUND); + } + else if (!check_if_modified(con, &filestats)) + { + if (!cupsdSendError(con, HTTP_NOT_MODIFIED, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + cupsdLogRequest(con, HTTP_NOT_MODIFIED); + } + else + { + /* + * Serve a file... + */ + + type = mimeFileType(MimeDatabase, filename, NULL, NULL); + if (type == NULL) + strcpy(line, "text/plain"); + else + snprintf(line, sizeof(line), "%s/%s", type->super, type->type); + + if (!cupsdSendHeader(con, HTTP_OK, line, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n", + httpGetDateString(filestats.st_mtime)) < 0) + { + cupsdCloseClient(con); + return; + } + + if (httpPrintf(HTTP(con), "Content-Length: %lu\r\n", + (unsigned long)filestats.st_size) < 0) + { + cupsdCloseClient(con); + return; + } + + cupsdLogRequest(con, HTTP_OK); + } + + if (httpPrintf(HTTP(con), "\r\n") < 0) + { + cupsdCloseClient(con); + return; + } + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + con->http.state = HTTP_WAITING; + break; + + default : + break; /* Anti-compiler-warning-code */ + } + } + } + + /* + * Handle any incoming data... + */ + + switch (con->http.state) + { + case HTTP_PUT_RECV : + do + { + if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0) + { + if (con->http.error && con->http.error != EPIPE) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d PUT_RECV Closing for error " + "%d (%s)", con->http.fd, con->http.error, + strerror(con->http.error)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d PUT_RECV Closing on EOF", + con->http.fd); + + cupsdCloseClient(con); + return; + } + else if (bytes > 0) + { + con->bytes += bytes; + + if (write(con->file, line, bytes) < bytes) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdReadClient: Unable to write %d bytes to %s: %s", + bytes, con->filename, strerror(errno)); + + close(con->file); + con->file = -1; + unlink(con->filename); + cupsdClearString(&con->filename); + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + } + } + while (con->http.state == HTTP_PUT_RECV && data_ready(con)); + + if (con->http.state == HTTP_WAITING) + { + /* + * End of file, see how big it is... + */ + + fstat(con->file, &filestats); + + close(con->file); + con->file = -1; + + if (filestats.st_size > MaxRequestSize && + MaxRequestSize > 0) + { + /* + * Request is too big; remove it and send an error... + */ + + unlink(con->filename); + cupsdClearString(&con->filename); + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + + /* + * Install the configuration file... + */ + + status = install_conf_file(con); + + /* + * Return the status to the client... + */ + + if (!cupsdSendError(con, status, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + break; + + case HTTP_POST_RECV : + do + { + if (con->request && con->file < 0) + { + /* + * Grab any request data from the connection... + */ + + if ((ipp_state = ippRead(&(con->http), con->request)) == IPP_ERROR) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdReadClient: %d IPP Read Error!", + con->http.fd); + + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + else if (ipp_state != IPP_DATA) + { + if (con->http.state == HTTP_POST_SEND) + { + cupsdSendError(con, HTTP_BAD_REQUEST, CUPSD_AUTH_NONE); + cupsdCloseClient(con); + return; + } + + break; + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdReadClient: %d %d.%d %s %d", + con->http.fd, con->request->request.op.version[0], + con->request->request.op.version[1], + ippOpString(con->request->request.op.operation_id), + con->request->request.op.request_id); + con->bytes += ippLength(con->request); + } + } + + if (con->file < 0 && con->http.state != HTTP_POST_SEND) + { + /* + * Create a file as needed for the request data... + */ + + cupsdSetStringf(&con->filename, "%s/%08x", RequestRoot, + request_id ++); + con->file = open(con->filename, O_WRONLY | O_CREAT | O_TRUNC, 0640); + + if (con->file < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create request file %s: %s", + con->filename, strerror(errno)); + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + + fchmod(con->file, 0640); + fchown(con->file, RunUser, Group); + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + } + + if (con->http.state != HTTP_POST_SEND) + { + if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0) + { + if (con->http.error && con->http.error != EPIPE) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d POST_SEND Closing for " + "error %d (%s)", con->http.fd, con->http.error, + strerror(con->http.error)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d POST_SEND Closing on EOF", + con->http.fd); + + cupsdCloseClient(con); + return; + } + else if (bytes > 0) + { + con->bytes += bytes; + + if (write(con->file, line, bytes) < bytes) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdReadClient: Unable to write %d bytes to " + "%s: %s", bytes, con->filename, + strerror(errno)); + + close(con->file); + con->file = -1; + unlink(con->filename); + cupsdClearString(&con->filename); + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, + CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + } + else if (con->http.state == HTTP_POST_RECV) + return; + else if (con->http.state != HTTP_POST_SEND) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d Closing on unknown HTTP " + "state %d", con->http.fd, con->http.state); + cupsdCloseClient(con); + return; + } + } + } + while (con->http.state == HTTP_POST_RECV && data_ready(con)); + + if (con->http.state == HTTP_POST_SEND) + { + if (con->file >= 0) + { + fstat(con->file, &filestats); + + close(con->file); + con->file = -1; + + if (filestats.st_size > MaxRequestSize && + MaxRequestSize > 0) + { + /* + * Request is too big; remove it and send an error... + */ + + unlink(con->filename); + cupsdClearString(&con->filename); + + if (con->request) + { + /* + * Delete any IPP request data... + */ + + ippDelete(con->request); + con->request = NULL; + } + + if (!cupsdSendError(con, HTTP_REQUEST_TOO_LARGE, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else if (filestats.st_size == 0) + { + /* + * Don't allow empty file... + */ + + unlink(con->filename); + cupsdClearString(&con->filename); + } + + if (con->command) + { + if (!cupsdSendCommand(con, con->command, con->options, 0)) + { + if (!cupsdSendError(con, HTTP_NOT_FOUND, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + } + else + cupsdLogRequest(con, HTTP_OK); + } + } + + if (con->request) + { + cupsdProcessIPPRequest(con); + + if (con->filename) + { + unlink(con->filename); + cupsdClearString(&con->filename); + } + + return; + } + } + break; + + default : + break; /* Anti-compiler-warning-code */ + } + + if (con->http.state == HTTP_WAITING) + { + if (!con->http.keep_alive) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdReadClient: %d Closing because Keep-Alive disabled", + con->http.fd); + cupsdCloseClient(con); + } + else + { + cupsArrayRemove(ActiveClients, con); + cupsdSetBusyState(); + } + } +} + + +/* + * 'cupsdSendCommand()' - Send output from a command via HTTP. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdSendCommand( + cupsd_client_t *con, /* I - Client connection */ + char *command, /* I - Command to run */ + char *options, /* I - Command-line options */ + int root) /* I - Run as root? */ +{ + int fd; /* Standard input file descriptor */ + + + if (con->filename) + { + fd = open(con->filename, O_RDONLY); + + if (fd < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdSendCommand: %d Unable to open \"%s\" for reading: %s", + con->http.fd, con->filename ? con->filename : "/dev/null", + strerror(errno)); + return (0); + } + + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + } + else + fd = -1; + + con->pipe_pid = pipe_command(con, fd, &(con->file), command, options, root); + + if (fd >= 0) + close(fd); + + cupsdLogMessage(CUPSD_LOG_INFO, "Started \"%s\" (pid=%d)", command, + con->pipe_pid); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSendCommand: %d file=%d", + con->http.fd, con->file); + + if (con->pipe_pid == 0) + return (0); + + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + + cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con); + + con->sent_header = 0; + con->file_ready = 0; + con->got_fields = 0; + con->header_used = 0; + + return (1); +} + + +/* + * 'cupsdSendError()' - Send an error message via HTTP. + */ + +int /* O - 1 if successful, 0 otherwise */ +cupsdSendError(cupsd_client_t *con, /* I - Connection */ + http_status_t code, /* I - Error code */ + int auth_type)/* I - Authentication type */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendError(con=%p(%d), code=%d, auth_type=%d", con, + con->http.fd, code, auth_type); + +#ifdef HAVE_SSL + /* + * Force client to upgrade for authentication if that is how the + * server is configured... + */ + + if (code == HTTP_UNAUTHORIZED && + DefaultEncryption == HTTP_ENCRYPT_REQUIRED && + _cups_strcasecmp(con->http.hostname, "localhost") && + !con->http.tls) + { + code = HTTP_UPGRADE_REQUIRED; + } +#endif /* HAVE_SSL */ + + /* + * Put the request in the access_log file... + */ + + cupsdLogRequest(con, code); + + /* + * To work around bugs in some proxies, don't use Keep-Alive for some + * error messages... + * + * Kerberos authentication doesn't work without Keep-Alive, so + * never disable it in that case. + */ + + if (code >= HTTP_BAD_REQUEST && con->http.auth_type != CUPSD_AUTH_NEGOTIATE) + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + + /* + * Send an error message back to the client. If the error code is a + * 400 or 500 series, make sure the message contains some text, too! + */ + + if (!cupsdSendHeader(con, code, NULL, auth_type)) + return (0); + +#ifdef HAVE_SSL + if (code == HTTP_UPGRADE_REQUIRED) + if (httpPrintf(HTTP(con), "Connection: Upgrade\r\n") < 0) + return (0); + + if (httpPrintf(HTTP(con), "Upgrade: TLS/1.0,HTTP/1.1\r\n") < 0) + return (0); +#endif /* HAVE_SSL */ + + if (con->http.version >= HTTP_1_1 && + con->http.keep_alive == HTTP_KEEPALIVE_OFF) + { + if (httpPrintf(HTTP(con), "Connection: close\r\n") < 0) + return (0); + } + + if (code >= HTTP_BAD_REQUEST) + { + /* + * Send a human-readable error message. + */ + + char message[4096], /* Message for user */ + urltext[1024], /* URL redirection text */ + redirect[1024]; /* Redirection link */ + const char *text; /* Status-specific text */ + + + redirect[0] = '\0'; + + if (code == HTTP_UNAUTHORIZED) + text = _cupsLangString(con->language, + _("Enter your username and password or the " + "root username and password to access this " + "page. If you are using Kerberos authentication, " + "make sure you have a valid Kerberos ticket.")); + else if (code == HTTP_UPGRADE_REQUIRED) + { + text = urltext; + + snprintf(urltext, sizeof(urltext), + _cupsLangString(con->language, + _("You must access this page using the URL " + "" + "https://%s:%d%s.")), + con->servername, con->serverport, con->uri, + con->servername, con->serverport, con->uri); + + snprintf(redirect, sizeof(redirect), + "\n", + con->servername, con->serverport, con->uri); + } + else if (code == HTTP_WEBIF_DISABLED) + text = _cupsLangString(con->language, + _("The web interface is currently disabled. Run " + "\"cupsctl WebInterface=yes\" to enable it.")); + else + text = ""; + + snprintf(message, sizeof(message), + "\n" + "\n" + "\n" + "\t\n" + "\t%s - " CUPS_SVERSION "\n" + "\t\n" + "%s" + "\n" + "\n" + "

%s

\n" + "

%s

\n" + "\n" + "\n", + httpStatus(code), redirect, httpStatus(code), text); + + if (httpPrintf(HTTP(con), "Content-Type: text/html; charset=utf-8\r\n") < 0) + return (0); + if (httpPrintf(HTTP(con), "Content-Length: %d\r\n", + (int)strlen(message)) < 0) + return (0); + if (httpPrintf(HTTP(con), "\r\n") < 0) + return (0); + if (httpPrintf(HTTP(con), "%s", message) < 0) + return (0); + } + else if (httpPrintf(HTTP(con), "\r\n") < 0) + return (0); + + if (cupsdFlushHeader(con) < 0) + return (0); + + con->http.state = HTTP_WAITING; + + return (1); +} + + +/* + * 'cupsdSendHeader()' - Send an HTTP request. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdSendHeader( + cupsd_client_t *con, /* I - Client to send to */ + http_status_t code, /* I - HTTP status code */ + char *type, /* I - MIME type of document */ + int auth_type) /* I - Type of authentication */ +{ + char auth_str[1024]; /* Authorization string */ +#if 0 /* def HAVE_GSSAPI */ + static char *gss_buf = NULL; /* Kerberos auth data buffer */ + static int gss_bufsize = 0; /* Size of Kerberos auth data buffer */ +#endif /* HAVE_GSSAPI */ + + + /* + * Send the HTTP status header... + */ + + if (code == HTTP_CONTINUE) + { + /* + * 100-continue doesn't send any headers... + */ + + return (httpPrintf(HTTP(con), "HTTP/%d.%d 100 Continue\r\n\r\n", + con->http.version / 100, con->http.version % 100) > 0); + } + else if (code == HTTP_WEBIF_DISABLED) + { + /* + * Treat our special "web interface is disabled" status as "200 OK" for web + * browsers. + */ + + code = HTTP_OK; + } + + httpFlushWrite(HTTP(con)); + + con->http.data_encoding = HTTP_ENCODE_FIELDS; + + if (httpPrintf(HTTP(con), "HTTP/%d.%d %d %s\r\n", con->http.version / 100, + con->http.version % 100, code, httpStatus(code)) < 0) + return (0); + if (httpPrintf(HTTP(con), "Date: %s\r\n", httpGetDateString(time(NULL))) < 0) + return (0); + if (ServerHeader) + if (httpPrintf(HTTP(con), "Server: %s\r\n", ServerHeader) < 0) + return (0); + if (con->http.keep_alive && con->http.version >= HTTP_1_0) + { + if (httpPrintf(HTTP(con), "Connection: Keep-Alive\r\n") < 0) + return (0); + if (httpPrintf(HTTP(con), "Keep-Alive: timeout=%d\r\n", + KeepAliveTimeout) < 0) + return (0); + } + if (code == HTTP_METHOD_NOT_ALLOWED) + if (httpPrintf(HTTP(con), "Allow: GET, HEAD, OPTIONS, POST, PUT\r\n") < 0) + return (0); + + if (code == HTTP_UNAUTHORIZED) + { + if (auth_type == CUPSD_AUTH_NONE) + { + if (!con->best || con->best->type <= CUPSD_AUTH_NONE) + auth_type = DefaultAuthType; + else + auth_type = con->best->type; + } + + auth_str[0] = '\0'; + + if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST) + strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str)); + else if (auth_type == CUPSD_AUTH_DIGEST) + snprintf(auth_str, sizeof(auth_str), "Digest realm=\"CUPS\", nonce=\"%s\"", + con->http.hostname); +#ifdef HAVE_GSSAPI + else if (auth_type == CUPSD_AUTH_NEGOTIATE) + { +# ifdef AF_LOCAL + if (_httpAddrFamily(con->http.hostaddr) == AF_LOCAL) + strlcpy(auth_str, "Basic realm=\"CUPS\"", sizeof(auth_str)); + else +# endif /* AF_LOCAL */ + strlcpy(auth_str, "Negotiate", sizeof(auth_str)); + } +#endif /* HAVE_GSSAPI */ + + if (con->best && auth_type != CUPSD_AUTH_NEGOTIATE && + !_cups_strcasecmp(con->http.hostname, "localhost")) + { + /* + * Add a "trc" (try root certification) parameter for local non-Kerberos + * requests when the request requires system group membership - then the + * client knows the root certificate can/should be used. + * + * Also, for Mac OS X we also look for @AUTHKEY and add an "authkey" + * parameter as needed... + */ + + char *name, /* Current user name */ + *auth_key; /* Auth key buffer */ + size_t auth_size; /* Size of remaining buffer */ + + auth_key = auth_str + strlen(auth_str); + auth_size = sizeof(auth_str) - (auth_key - auth_str); + + for (name = (char *)cupsArrayFirst(con->best->names); + name; + name = (char *)cupsArrayNext(con->best->names)) + { +#ifdef HAVE_AUTHORIZATION_H + if (!_cups_strncasecmp(name, "@AUTHKEY(", 9)) + { + snprintf(auth_key, auth_size, ", authkey=\"%s\"", name + 9); + /* end parenthesis is stripped in conf.c */ + break; + } + else +#endif /* HAVE_AUTHORIZATION_H */ + if (!_cups_strcasecmp(name, "@SYSTEM")) + { +#ifdef HAVE_AUTHORIZATION_H + if (SystemGroupAuthKey) + snprintf(auth_key, auth_size, + ", authkey=\"%s\"", + SystemGroupAuthKey); + else +#else + strlcpy(auth_key, ", trc=\"y\"", auth_size); +#endif /* HAVE_AUTHORIZATION_H */ + break; + } + } + } + + if (auth_str[0]) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdSendHeader: %d WWW-Authenticate: %s", con->http.fd, + auth_str); + + if (httpPrintf(HTTP(con), "WWW-Authenticate: %s\r\n", auth_str) < 0) + return (0); + } + } + + if (con->language && strcmp(con->language->language, "C")) + { + if (httpPrintf(HTTP(con), "Content-Language: %s\r\n", + con->language->language) < 0) + return (0); + } + + if (type) + { + if (!strcmp(type, "text/html")) + { + if (httpPrintf(HTTP(con), + "Content-Type: text/html; charset=utf-8\r\n") < 0) + return (0); + } + else if (httpPrintf(HTTP(con), "Content-Type: %s\r\n", type) < 0) + return (0); + } + + return (1); +} + + +/* + * 'cupsdUpdateCGI()' - Read status messages from CGI scripts and programs. + */ + +void +cupsdUpdateCGI(void) +{ + char *ptr, /* Pointer to end of line in buffer */ + message[1024]; /* Pointer to message text */ + int loglevel; /* Log level for message */ + + + while ((ptr = cupsdStatBufUpdate(CGIStatusBuffer, &loglevel, + message, sizeof(message))) != NULL) + { + if (loglevel == CUPSD_LOG_INFO) + cupsdLogMessage(CUPSD_LOG_INFO, "%s", message); + + if (!strchr(CGIStatusBuffer->buffer, '\n')) + break; + } + + if (ptr == NULL && !CGIStatusBuffer->bufused) + { + /* + * Fatal error on pipe - should never happen! + */ + + cupsdLogMessage(CUPSD_LOG_CRIT, + "cupsdUpdateCGI: error reading from CGI error pipe - %s", + strerror(errno)); + } +} + + +/* + * 'cupsdWriteClient()' - Write data to a client as needed. + */ + +void +cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ +{ + int bytes, /* Number of bytes written */ + field_col; /* Current column */ + char *bufptr, /* Pointer into buffer */ + *bufend; /* Pointer to end of buffer */ + ipp_state_t ipp_state; /* IPP state value */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdWriteClient(con=%p(%d)) response=%p(%d), file=%d " + "pipe_pid=%d state=%d", + con, con->http.fd, con->response, + con->response ? con->response->state : -1, + con->file, con->pipe_pid, con->http.state); + + if (con->http.state != HTTP_GET_SEND && + con->http.state != HTTP_POST_SEND) + { + /* + * If we get called in the wrong state, then something went wrong with the + * connection and we need to shut it down... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdWriteClient: %d Closing on unknown HTTP state %d", + con->http.fd, con->http.state); + cupsdCloseClient(con); + return; + } + + if (con->pipe_pid) + { + /* + * Make sure we select on the CGI output... + */ + + cupsdAddSelect(con->file, (cupsd_selfunc_t)write_pipe, NULL, con); + + if (!con->file_ready) + { + /* + * Try again later when there is CGI output available... + */ + + cupsdRemoveSelect(con->http.fd); + return; + } + + con->file_ready = 0; + } + + if (con->response && con->response->state != IPP_DATA) + { + ipp_state = ippWrite(HTTP(con), con->response); + bytes = ipp_state != IPP_ERROR && + (con->file >= 0 || ipp_state != IPP_DATA); + } + else if ((bytes = read(con->file, con->header + con->header_used, + sizeof(con->header) - con->header_used)) > 0) + { + con->header_used += bytes; + + if (con->pipe_pid && !con->got_fields) + { + /* + * Inspect the data for Content-Type and other fields. + */ + + for (bufptr = con->header, bufend = con->header + con->header_used, + field_col = 0; + !con->got_fields && bufptr < bufend; + bufptr ++) + { + if (*bufptr == '\n') + { + /* + * Send line to client... + */ + + if (bufptr > con->header && bufptr[-1] == '\r') + bufptr[-1] = '\0'; + *bufptr++ = '\0'; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Script header: %s", con->header); + + if (!con->sent_header) + { + /* + * Handle redirection and CGI status codes... + */ + + if (!_cups_strncasecmp(con->header, "Location:", 9)) + { + if (!cupsdSendHeader(con, HTTP_SEE_OTHER, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + con->sent_header = 2; + + if (httpPrintf(HTTP(con), "Content-Length: 0\r\n") < 0) + return; + } + else if (!_cups_strncasecmp(con->header, "Status:", 7)) + { + cupsdSendError(con, (http_status_t)atoi(con->header + 7), + CUPSD_AUTH_NONE); + con->sent_header = 2; + } + else + { + if (!cupsdSendHeader(con, HTTP_OK, NULL, CUPSD_AUTH_NONE)) + { + cupsdCloseClient(con); + return; + } + + con->sent_header = 1; + + if (con->http.version == HTTP_1_1) + { + if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n") < 0) + return; + } + } + } + + if (_cups_strncasecmp(con->header, "Status:", 7)) + httpPrintf(HTTP(con), "%s\r\n", con->header); + + /* + * Update buffer... + */ + + con->header_used -= bufptr - con->header; + + if (con->header_used > 0) + memmove(con->header, bufptr, con->header_used); + + bufptr = con->header - 1; + + /* + * See if the line was empty... + */ + + if (field_col == 0) + { + con->got_fields = 1; + + if (cupsdFlushHeader(con) < 0) + { + cupsdCloseClient(con); + return; + } + + if (con->http.version == HTTP_1_1) + con->http.data_encoding = HTTP_ENCODE_CHUNKED; + } + else + field_col = 0; + } + else if (*bufptr != '\r') + field_col ++; + } + + if (!con->got_fields) + { + con->http.activity = time(NULL); + return; + } + } + + if (con->header_used > 0) + { + if (httpWrite2(HTTP(con), con->header, con->header_used) < 0) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdWriteClient: %d Closing for error %d (%s)", + con->http.fd, con->http.error, + strerror(con->http.error)); + cupsdCloseClient(con); + return; + } + + if (con->http.data_encoding == HTTP_ENCODE_CHUNKED) + httpFlushWrite(HTTP(con)); + + con->bytes += con->header_used; + + if (con->http.state == HTTP_WAITING) + bytes = 0; + else + bytes = con->header_used; + + con->header_used = 0; + } + } + + if (bytes <= 0 || + (con->http.state != HTTP_GET_SEND && con->http.state != HTTP_POST_SEND)) + { + if (!con->sent_header && con->pipe_pid) + cupsdSendError(con, HTTP_SERVER_ERROR, CUPSD_AUTH_NONE); + else + { + cupsdLogRequest(con, HTTP_OK); + + httpFlushWrite(HTTP(con)); + + if (con->http.data_encoding == HTTP_ENCODE_CHUNKED && con->sent_header == 1) + { + if (httpWrite2(HTTP(con), "", 0) < 0) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdWriteClient: %d Closing for error %d (%s)", + con->http.fd, con->http.error, + strerror(con->http.error)); + cupsdCloseClient(con); + return; + } + } + } + + con->http.state = HTTP_WAITING; + + cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con); + + if (con->file >= 0) + { + cupsdRemoveSelect(con->file); + + if (con->pipe_pid) + cupsdEndProcess(con->pipe_pid, 0); + + close(con->file); + con->file = -1; + con->pipe_pid = 0; + } + + if (con->filename) + { + unlink(con->filename); + cupsdClearString(&con->filename); + } + + if (con->request) + { + ippDelete(con->request); + con->request = NULL; + } + + if (con->response) + { + ippDelete(con->response); + con->response = NULL; + } + + cupsdClearString(&con->command); + cupsdClearString(&con->options); + cupsdClearString(&con->query_string); + + if (!con->http.keep_alive) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdWriteClient: %d Closing because Keep-Alive disabled", + con->http.fd); + cupsdCloseClient(con); + return; + } + else + { + cupsArrayRemove(ActiveClients, con); + cupsdSetBusyState(); + } + } + + con->http.activity = time(NULL); +} + + +/* + * 'check_if_modified()' - Decode an "If-Modified-Since" line. + */ + +static int /* O - 1 if modified since */ +check_if_modified( + cupsd_client_t *con, /* I - Client connection */ + struct stat *filestats) /* I - File information */ +{ + char *ptr; /* Pointer into field */ + time_t date; /* Time/date value */ + off_t size; /* Size/length value */ + + + size = 0; + date = 0; + ptr = con->http.fields[HTTP_FIELD_IF_MODIFIED_SINCE]; + + if (*ptr == '\0') + return (1); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "check_if_modified(con=%p(%d), " + "filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", + con, con->http.fd, filestats, CUPS_LLCAST filestats->st_size, + (int)filestats->st_mtime, ptr); + + while (*ptr != '\0') + { + while (isspace(*ptr) || *ptr == ';') + ptr ++; + + if (_cups_strncasecmp(ptr, "length=", 7) == 0) + { + ptr += 7; + size = strtoll(ptr, NULL, 10); + + while (isdigit(*ptr)) + ptr ++; + } + else if (isalpha(*ptr)) + { + date = httpGetDateTime(ptr); + while (*ptr != '\0' && *ptr != ';') + ptr ++; + } + else + ptr ++; + } + + return ((size != filestats->st_size && size != 0) || + (date < filestats->st_mtime && date != 0) || + (size == 0 && date == 0)); +} + + +/* + * 'compare_clients()' - Compare two client connections. + */ + +static int /* O - Result of comparison */ +compare_clients(cupsd_client_t *a, /* I - First client */ + cupsd_client_t *b, /* I - Second client */ + void *data) /* I - User data (not used) */ +{ + (void)data; + + if (a == b) + return (0); + else if (a < b) + return (-1); + else + return (1); +} + + +#ifdef HAVE_CDSASSL +/* + * 'copy_cdsa_certificate()' - Copy a SSL/TLS certificate from the System + * keychain. + */ + +static CFArrayRef /* O - Array of certificates */ +copy_cdsa_certificate( + cupsd_client_t *con) /* I - Client connection */ +{ + OSStatus err; /* Error info */ + SecKeychainRef keychain = NULL;/* Keychain reference */ + SecIdentitySearchRef search = NULL; /* Search reference */ + SecIdentityRef identity = NULL;/* Identity */ + CFArrayRef certificates = NULL; + /* Certificate array */ +# if HAVE_SECPOLICYCREATESSL + SecPolicyRef policy = NULL; /* Policy ref */ + CFStringRef servername = NULL; + /* Server name */ + CFMutableDictionaryRef query = NULL; /* Query qualifiers */ + char localname[1024];/* Local hostname */ +# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) + SecPolicyRef policy = NULL; /* Policy ref */ + SecPolicySearchRef policy_search = NULL; + /* Policy search ref */ + CSSM_DATA options; /* Policy options */ + CSSM_APPLE_TP_SSL_OPTIONS + ssl_options; /* SSL Option for hostname */ + char localname[1024];/* Local hostname */ +# endif /* HAVE_SECPOLICYCREATESSL */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "copy_cdsa_certificate: Looking for certs for \"%s\"...", + con->servername); + + if ((err = SecKeychainOpen(ServerCertificate, &keychain))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\" - %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); + goto cleanup; + } + +# if HAVE_SECPOLICYCREATESSL + servername = CFStringCreateWithCString(kCFAllocatorDefault, con->servername, + kCFStringEncodingUTF8); + + policy = SecPolicyCreateSSL(1, servername); + + if (servername) + CFRelease(servername); + + if (!policy) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference"); + goto cleanup; + } + + if (!(query = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create query dictionary"); + goto cleanup; + } + + CFDictionaryAddValue(query, kSecClass, kSecClassIdentity); + CFDictionaryAddValue(query, kSecMatchPolicy, policy); + CFDictionaryAddValue(query, kSecReturnRef, kCFBooleanTrue); + CFDictionaryAddValue(query, kSecMatchLimit, kSecMatchLimitOne); + + err = SecItemCopyMatching(query, (CFTypeRef *)&identity); + + if (err && DNSSDHostName) + { + /* + * Search for the connection server name failed; try the DNS-SD .local + * hostname instead... + */ + + snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "copy_cdsa_certificate: Looking for certs for \"%s\"...", + localname); + + servername = CFStringCreateWithCString(kCFAllocatorDefault, localname, + kCFStringEncodingUTF8); + + CFRelease(policy); + + policy = SecPolicyCreateSSL(1, servername); + + if (servername) + CFRelease(servername); + + if (!policy) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create ssl policy reference"); + goto cleanup; + } + + CFDictionarySetValue(query, kSecMatchPolicy, policy); + + err = SecItemCopyMatching(query, (CFTypeRef *)&identity); + } + + if (err) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Cannot find signing key in keychain \"%s\": %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); + goto cleanup; + } + +# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) + /* + * Use a policy to search for valid certificates whose common name matches the + * servername... + */ + + if (SecPolicySearchCreate(CSSM_CERT_X_509v3, &CSSMOID_APPLE_TP_SSL, + NULL, &policy_search)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create a policy search reference"); + goto cleanup; + } + + if (SecPolicySearchCopyNext(policy_search, &policy)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Cannot find a policy to use for searching"); + goto cleanup; + } + + memset(&ssl_options, 0, sizeof(ssl_options)); + ssl_options.Version = CSSM_APPLE_TP_SSL_OPTS_VERSION; + ssl_options.ServerName = con->servername; + ssl_options.ServerNameLen = strlen(con->servername); + + options.Data = (uint8 *)&ssl_options; + options.Length = sizeof(ssl_options); + + if (SecPolicySetValue(policy, &options)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Cannot set policy value to use for searching"); + goto cleanup; + } + + if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN, + keychain, FALSE, &search))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Cannot create identity search reference: %s (%d)", + cssmErrorString(err), (int)err); + goto cleanup; + } + + err = SecIdentitySearchCopyNext(search, &identity); + + if (err && DNSSDHostName) + { + /* + * Search for the connection server name failed; try the DNS-SD .local + * hostname instead... + */ + + snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName); + + ssl_options.ServerName = localname; + ssl_options.ServerNameLen = strlen(localname); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "copy_cdsa_certificate: Looking for certs for \"%s\"...", + localname); + + if (SecPolicySetValue(policy, &options)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Cannot set policy value to use for searching"); + goto cleanup; + } + + CFRelease(search); + search = NULL; + if ((err = SecIdentitySearchCreateWithPolicy(policy, NULL, CSSM_KEYUSE_SIGN, + keychain, FALSE, &search))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Cannot create identity search reference: %s (%d)", + cssmErrorString(err), (int)err); + goto cleanup; + } + + err = SecIdentitySearchCopyNext(search, &identity); + + } + + if (err) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Cannot find signing key in keychain \"%s\": %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); + goto cleanup; + } + +# else + /* + * Assume there is exactly one SecIdentity in the keychain... + */ + + if ((err = SecIdentitySearchCreate(keychain, CSSM_KEYUSE_SIGN, &search))) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Cannot create identity search reference (%d)", (int)err); + goto cleanup; + } + + if ((err = SecIdentitySearchCopyNext(search, &identity))) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Cannot find signing key in keychain \"%s\": %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); + goto cleanup; + } +# endif /* HAVE_SECPOLICYCREATESSL */ + + if (CFGetTypeID(identity) != SecIdentityGetTypeID()) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "SecIdentity CFTypeID failure!"); + goto cleanup; + } + + if ((certificates = CFArrayCreate(NULL, (const void **)&identity, + 1, &kCFTypeArrayCallBacks)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot create certificate array"); + goto cleanup; + } + + cleanup : + + if (keychain) + CFRelease(keychain); + if (search) + CFRelease(search); + if (identity) + CFRelease(identity); + +# if HAVE_SECPOLICYCREATESSL + if (policy) + CFRelease(policy); + if (query) + CFRelease(query); +# elif defined(HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY) + if (policy) + CFRelease(policy); + if (policy_search) + CFRelease(policy_search); +# endif /* HAVE_SECPOLICYCREATESSL */ + + return (certificates); +} +#endif /* HAVE_CDSASSL */ + + +/* + * 'data_ready()' - Check whether data is available from a client. + */ + +static int /* O - 1 if data is ready, 0 otherwise */ +data_ready(cupsd_client_t *con) /* I - Client */ +{ + if (con->http.used > 0) + return (1); +#ifdef HAVE_SSL + else if (con->http.tls) + { +# ifdef HAVE_LIBSSL + if (SSL_pending((SSL *)(con->http.tls))) + return (1); +# elif defined(HAVE_GNUTLS) + if (gnutls_record_check_pending(con->http.tls)) + return (1); +# elif defined(HAVE_CDSASSL) + size_t bytes; /* Bytes that are available */ + + if (!SSLGetBufferedReadSize(con->http.tls, &bytes) && bytes > 0) + return (1); +# endif /* HAVE_LIBSSL */ + } +#endif /* HAVE_SSL */ + + return (0); +} + + +#ifdef HAVE_SSL +/* + * 'encrypt_client()' - Enable encryption for the client... + */ + +static int /* O - 1 on success, 0 on error */ +encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ +{ +# ifdef HAVE_LIBSSL + SSL_CTX *context; /* Context for encryption */ + BIO *bio; /* BIO data */ + unsigned long error; /* Error code */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + + /* + * Verify that we have a certificate... + */ + + if (access(ServerKey, 0) || access(ServerCertificate, 0)) + { + /* + * Nope, make a self-signed certificate... + */ + + if (!make_certificate(con)) + return (0); + } + + /* + * Create the SSL context and accept the connection... + */ + + context = SSL_CTX_new(SSLv23_server_method()); + + SSL_CTX_set_options(context, SSL_OP_NO_SSLv2); /* Only use SSLv3 or TLS */ + if (SSLOptions & CUPSD_SSL_NOEMPTY) + SSL_CTX_set_options(context, SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS); + SSL_CTX_use_PrivateKey_file(context, ServerKey, SSL_FILETYPE_PEM); + SSL_CTX_use_certificate_chain_file(context, ServerCertificate); + + bio = BIO_new(_httpBIOMethods()); + BIO_ctrl(bio, BIO_C_SET_FILE_PTR, 0, (char *)HTTP(con)); + + con->http.tls = SSL_new(context); + SSL_set_bio(con->http.tls, bio, bio); + + if (SSL_accept(con->http.tls) != 1) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to encrypt connection from %s.", + con->http.hostname); + + while ((error = ERR_get_error()) != 0) + cupsdLogMessage(CUPSD_LOG_ERROR, "%s", ERR_error_string(error, NULL)); + + SSL_CTX_free(context); + SSL_free(con->http.tls); + con->http.tls = NULL; + return (0); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); + + return (1); + +# elif defined(HAVE_GNUTLS) + int status; /* Error code */ + gnutls_certificate_server_credentials *credentials; + /* TLS credentials */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + + /* + * Verify that we have a certificate... + */ + + if (access(ServerKey, 0) || access(ServerCertificate, 0)) + { + /* + * Nope, make a self-signed certificate... + */ + + if (!make_certificate(con)) + return (0); + } + + /* + * Create the SSL object and perform the SSL handshake... + */ + + credentials = (gnutls_certificate_server_credentials *) + malloc(sizeof(gnutls_certificate_server_credentials)); + if (credentials == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to encrypt connection from %s - %s", + con->http.hostname, strerror(errno)); + + return (0); + } + + gnutls_certificate_allocate_credentials(credentials); + gnutls_certificate_set_x509_key_file(*credentials, ServerCertificate, + ServerKey, GNUTLS_X509_FMT_PEM); + + gnutls_init(&con->http.tls, GNUTLS_SERVER); + gnutls_set_default_priority(con->http.tls); + + gnutls_credentials_set(con->http.tls, GNUTLS_CRD_CERTIFICATE, *credentials); + gnutls_transport_set_ptr(con->http.tls, (gnutls_transport_ptr)HTTP(con)); + gnutls_transport_set_pull_function(con->http.tls, _httpReadGNUTLS); + gnutls_transport_set_push_function(con->http.tls, _httpWriteGNUTLS); + + while ((status = gnutls_handshake(con->http.tls)) != GNUTLS_E_SUCCESS) + { + if (gnutls_error_is_fatal(status)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to encrypt connection from %s - %s", + con->http.hostname, gnutls_strerror(status)); + + gnutls_deinit(con->http.tls); + gnutls_certificate_free_credentials(*credentials); + con->http.tls = NULL; + free(credentials); + return (0); + } + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); + + con->http.tls_credentials = credentials; + return (1); + +# elif defined(HAVE_CDSASSL) + OSStatus error = 0; /* Error code */ + CFArrayRef peerCerts; /* Peer certificates */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + + con->http.tls_credentials = copy_cdsa_certificate(con); + + if (!con->http.tls_credentials) + { + /* + * No keychain (yet), make a self-signed certificate... + */ + + if (make_certificate(con)) + con->http.tls_credentials = copy_cdsa_certificate(con); + } + + if (!con->http.tls_credentials) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Could not find signing key in keychain \"%s\"", + ServerCertificate); + error = errSSLBadCert; /* errSSLBadConfiguration is a better choice, but not available on 10.2.x */ + } + + if (!error) + error = SSLNewContext(true, &con->http.tls); + + if (!error) + error = SSLSetIOFuncs(con->http.tls, _httpReadCDSA, _httpWriteCDSA); + + if (!error) + error = SSLSetConnection(con->http.tls, HTTP(con)); + + if (!error) + error = SSLSetAllowsExpiredCerts(con->http.tls, true); + + if (!error) + error = SSLSetAllowsAnyRoot(con->http.tls, true); + + if (!error) + error = SSLSetCertificate(con->http.tls, con->http.tls_credentials); + + if (!error) + { + /* + * Perform SSL/TLS handshake + */ + + while ((error = SSLHandshake(con->http.tls)) == errSSLWouldBlock) + usleep(1000); + } + + if (error) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to encrypt connection from %s - %s (%d)", + con->http.hostname, cssmErrorString(error), (int)error); + + con->http.error = error; + con->http.status = HTTP_ERROR; + + if (con->http.tls) + { + SSLDisposeContext(con->http.tls); + con->http.tls = NULL; + } + + if (con->http.tls_credentials) + { + CFRelease(con->http.tls_credentials); + con->http.tls_credentials = NULL; + } + + return (0); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); + + if (!SSLCopyPeerCertificates(con->http.tls, &peerCerts) && peerCerts) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Received %d peer certificates!", + (int)CFArrayGetCount(peerCerts)); + CFRelease(peerCerts); + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "Received NO peer certificates!"); + + return (1); + +# endif /* HAVE_LIBSSL */ +} +#endif /* HAVE_SSL */ + + +/* + * 'get_file()' - Get a filename and state info. + */ + +static char * /* O - Real filename */ +get_file(cupsd_client_t *con, /* I - Client connection */ + struct stat *filestats, /* O - File information */ + char *filename, /* IO - Filename buffer */ + int len) /* I - Buffer length */ +{ + int status; /* Status of filesystem calls */ + char *ptr; /* Pointer info filename */ + int plen; /* Remaining length after pointer */ + char language[7]; /* Language subdirectory, if any */ + + + /* + * Figure out the real filename... + */ + + language[0] = '\0'; + + if (!strncmp(con->uri, "/ppd/", 5) && !strchr(con->uri + 5, '/')) + snprintf(filename, len, "%s%s", ServerRoot, con->uri); + else if (!strncmp(con->uri, "/icons/", 7) && !strchr(con->uri + 7, '/')) + { + snprintf(filename, len, "%s/%s", CacheDir, con->uri + 7); + if (access(filename, F_OK) < 0) + snprintf(filename, len, "%s/images/generic.png", DocumentRoot); + } + else if (!strncmp(con->uri, "/rss/", 5) && !strchr(con->uri + 5, '/')) + snprintf(filename, len, "%s/rss/%s", CacheDir, con->uri + 5); + else if (!strncmp(con->uri, "/admin/conf/", 12)) + snprintf(filename, len, "%s%s", ServerRoot, con->uri + 11); + else if (!strncmp(con->uri, "/admin/log/", 11)) + { + if (!strncmp(con->uri + 11, "access_log", 10) && AccessLog[0] == '/') + strlcpy(filename, AccessLog, len); + else if (!strncmp(con->uri + 11, "error_log", 9) && ErrorLog[0] == '/') + strlcpy(filename, ErrorLog, len); + else if (!strncmp(con->uri + 11, "page_log", 8) && PageLog[0] == '/') + strlcpy(filename, PageLog, len); + else + return (NULL); + } + else if (con->language) + { + snprintf(language, sizeof(language), "/%s", con->language->language); + snprintf(filename, len, "%s%s%s", DocumentRoot, language, con->uri); + } + else + snprintf(filename, len, "%s%s", DocumentRoot, con->uri); + + if ((ptr = strchr(filename, '?')) != NULL) + *ptr = '\0'; + + /* + * Grab the status for this language; if there isn't a language-specific file + * then fallback to the default one... + */ + + if ((status = stat(filename, filestats)) != 0 && language[0] && + strncmp(con->uri, "/icons/", 7) && + strncmp(con->uri, "/ppd/", 5) && + strncmp(con->uri, "/rss/", 5) && + strncmp(con->uri, "/admin/conf/", 12) && + strncmp(con->uri, "/admin/log/", 11)) + { + /* + * Drop the country code... + */ + + language[3] = '\0'; + snprintf(filename, len, "%s%s%s", DocumentRoot, language, con->uri); + + if ((ptr = strchr(filename, '?')) != NULL) + *ptr = '\0'; + + if ((status = stat(filename, filestats)) != 0) + { + /* + * Drop the language prefix and try the root directory... + */ + + language[0] = '\0'; + snprintf(filename, len, "%s%s", DocumentRoot, con->uri); + + if ((ptr = strchr(filename, '?')) != NULL) + *ptr = '\0'; + + status = stat(filename, filestats); + } + } + + /* + * If we're found a directory, get the index.html file instead... + */ + + if (!status && S_ISDIR(filestats->st_mode)) + { + /* + * Make sure the URI ends with a slash... + */ + + if (con->uri[strlen(con->uri) - 1] != '/') + strlcat(con->uri, "/", sizeof(con->uri)); + + /* + * Find the directory index file, trying every language... + */ + + do + { + if (status && language[0]) + { + /* + * Try a different language subset... + */ + + if (language[3]) + language[0] = '\0'; /* Strip country code */ + else + language[0] = '\0'; /* Strip language */ + } + + /* + * Look for the index file... + */ + + snprintf(filename, len, "%s%s%s", DocumentRoot, language, con->uri); + + if ((ptr = strchr(filename, '?')) != NULL) + *ptr = '\0'; + + ptr = filename + strlen(filename); + plen = len - (ptr - filename); + + strlcpy(ptr, "index.html", plen); + status = stat(filename, filestats); + +#ifdef HAVE_JAVA + if (status) + { + strlcpy(ptr, "index.class", plen); + status = stat(filename, filestats); + } +#endif /* HAVE_JAVA */ + +#ifdef HAVE_PERL + if (status) + { + strlcpy(ptr, "index.pl", plen); + status = stat(filename, filestats); + } +#endif /* HAVE_PERL */ + +#ifdef HAVE_PHP + if (status) + { + strlcpy(ptr, "index.php", plen); + status = stat(filename, filestats); + } +#endif /* HAVE_PHP */ + +#ifdef HAVE_PYTHON + if (status) + { + strlcpy(ptr, "index.pyc", plen); + status = stat(filename, filestats); + } + + if (status) + { + strlcpy(ptr, "index.py", plen); + status = stat(filename, filestats); + } +#endif /* HAVE_PYTHON */ + + } + while (status && language[0]); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_file(con=%p(%d), filestats=%p, filename=%p, len=%d) = " + "%s", con, con->http.fd, filestats, filename, len, + status ? "(null)" : filename); + + if (status) + return (NULL); + else + return (filename); +} + + +/* + * 'install_conf_file()' - Install a configuration file. + */ + +static http_status_t /* O - Status */ +install_conf_file(cupsd_client_t *con) /* I - Connection */ +{ + char filename[1024]; /* Configuration filename */ + mode_t mode; /* Permissions */ + cups_file_t *in, /* Input file */ + *out; /* Output file */ + char buffer[16384]; /* Copy buffer */ + ssize_t bytes; /* Number of bytes */ + + + /* + * Open the request file... + */ + + if ((in = cupsFileOpen(con->filename, "rb")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open request file \"%s\": %s", + con->filename, strerror(errno)); + return (HTTP_SERVER_ERROR); + } + + /* + * Open the new config file... + */ + + snprintf(filename, sizeof(filename), "%s%s", ServerRoot, con->uri + 11); + if (!strcmp(con->uri, "/admin/conf/printers.conf")) + mode = ConfigFilePerm & 0600; + else + mode = ConfigFilePerm; + + if ((out = cupsdCreateConfFile(filename, mode)) == NULL) + { + cupsFileClose(in); + return (HTTP_SERVER_ERROR); + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Installing config file \"%s\"...", filename); + + /* + * Copy from the request to the new config file... + */ + + while ((bytes = cupsFileRead(in, buffer, sizeof(buffer))) > 0) + if (cupsFileWrite(out, buffer, bytes) < bytes) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to copy to config file \"%s\": %s", + filename, strerror(errno)); + + cupsFileClose(in); + cupsFileClose(out); + + snprintf(filename, sizeof(filename), "%s%s.N", ServerRoot, con->uri + 11); + cupsdRemoveFile(filename); + + return (HTTP_SERVER_ERROR); + } + + /* + * Close the files... + */ + + cupsFileClose(in); + + if (cupsdCloseCreatedConfFile(out, filename)) + return (HTTP_SERVER_ERROR); + + /* + * Remove the request file... + */ + + cupsdRemoveFile(con->filename); + cupsdClearString(&con->filename); + + /* + * If the cupsd.conf file was updated, set the NeedReload flag... + */ + + if (!strcmp(con->uri, "/admin/conf/cupsd.conf")) + NeedReload = RELOAD_CUPSD; + else + NeedReload = RELOAD_ALL; + + ReloadTime = time(NULL); + + /* + * Return that the file was created successfully... + */ + + return (HTTP_CREATED); +} + + +/* + * 'is_cgi()' - Is the resource a CGI script/program? + */ + +static int /* O - 1 = CGI, 0 = file */ +is_cgi(cupsd_client_t *con, /* I - Client connection */ + const char *filename, /* I - Real filename */ + struct stat *filestats, /* I - File information */ + mime_type_t *type) /* I - MIME type */ +{ + const char *options; /* Options on URL */ + + + /* + * Get the options, if any... + */ + + if ((options = strchr(con->uri, '?')) != NULL) + { + options ++; + cupsdSetStringf(&(con->query_string), "QUERY_STRING=%s", options); + } + + /* + * Check for known types... + */ + + if (!type || _cups_strcasecmp(type->super, "application")) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 0", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); + return (0); + } + + if (!_cups_strcasecmp(type->type, "x-httpd-cgi") && + (filestats->st_mode & 0111)) + { + /* + * "application/x-httpd-cgi" is a CGI script. + */ + + cupsdSetString(&con->command, filename); + + if (options) + cupsdSetStringf(&con->options, " %s", options); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type->super, type->type); + return (1); + } +#ifdef HAVE_JAVA + else if (!_cups_strcasecmp(type->type, "x-httpd-java")) + { + /* + * "application/x-httpd-java" is a Java servlet. + */ + + cupsdSetString(&con->command, CUPS_JAVA); + + if (options) + cupsdSetStringf(&con->options, " %s %s", filename, options); + else + cupsdSetStringf(&con->options, " %s", filename); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type->super, type->type); + return (1); + } +#endif /* HAVE_JAVA */ +#ifdef HAVE_PERL + else if (!_cups_strcasecmp(type->type, "x-httpd-perl")) + { + /* + * "application/x-httpd-perl" is a Perl page. + */ + + cupsdSetString(&con->command, CUPS_PERL); + + if (options) + cupsdSetStringf(&con->options, " %s %s", filename, options); + else + cupsdSetStringf(&con->options, " %s", filename); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type->super, type->type); + return (1); + } +#endif /* HAVE_PERL */ +#ifdef HAVE_PHP + else if (!_cups_strcasecmp(type->type, "x-httpd-php")) + { + /* + * "application/x-httpd-php" is a PHP page. + */ + + cupsdSetString(&con->command, CUPS_PHP); + + if (options) + cupsdSetStringf(&con->options, " %s %s", filename, options); + else + cupsdSetStringf(&con->options, " %s", filename); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type->super, type->type); + return (1); + } +#endif /* HAVE_PHP */ +#ifdef HAVE_PYTHON + else if (!_cups_strcasecmp(type->type, "x-httpd-python")) + { + /* + * "application/x-httpd-python" is a Python page. + */ + + cupsdSetString(&con->command, CUPS_PYTHON); + + if (options) + cupsdSetStringf(&con->options, " %s %s", filename, options); + else + cupsdSetStringf(&con->options, " %s", filename); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type->super, type->type); + return (1); + } +#endif /* HAVE_PYTHON */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 0", con, con->http.fd, filename, filestats, + type->super, type->type); + return (0); +} + + +/* + * 'is_path_absolute()' - Is a path absolute and free of relative elements (i.e. ".."). + */ + +static int /* O - 0 if relative, 1 if absolute */ +is_path_absolute(const char *path) /* I - Input path */ +{ + /* + * Check for a leading slash... + */ + + if (path[0] != '/') + return (0); + + /* + * Check for "/.." in the path... + */ + + while ((path = strstr(path, "/..")) != NULL) + { + if (!path[3] || path[3] == '/') + return (0); + + path ++; + } + + /* + * If we haven't found any relative paths, return 1 indicating an + * absolute path... + */ + + return (1); +} + + +#ifdef HAVE_SSL +/* + * 'make_certificate()' - Make a self-signed SSL/TLS certificate. + */ + +static int /* O - 1 on success, 0 on failure */ +make_certificate(cupsd_client_t *con) /* I - Client connection */ +{ +#if defined(HAVE_LIBSSL) && defined(HAVE_WAITPID) + int pid, /* Process ID of command */ + status; /* Status of command */ + char command[1024], /* Command */ + *argv[12], /* Command-line arguments */ + *envp[MAX_ENV + 1], /* Environment variables */ + infofile[1024], /* Type-in information for cert */ + seedfile[1024]; /* Random number seed file */ + int envc, /* Number of environment variables */ + bytes; /* Bytes written */ + cups_file_t *fp; /* Seed/info file */ + int infofd; /* Info file descriptor */ + + + /* + * Run the "openssl" command to seed the random number generator and + * generate a self-signed certificate that is good for 10 years: + * + * openssl rand -rand seedfile 1 + * + * openssl req -new -x509 -keyout ServerKey \ + * -out ServerCertificate -days 3650 -nodes + * + * The seeding step is crucial in ensuring that the openssl command + * does not block on systems without sufficient entropy... + */ + + if (!cupsFileFind("openssl", getenv("PATH"), 1, command, sizeof(command))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "No SSL certificate and openssl command not found!"); + return (0); + } + + if (access("/dev/urandom", 0)) + { + /* + * If the system doesn't provide /dev/urandom, then any random source + * will probably be blocking-style, so generate some random data to + * use as a seed for the certificate. Note that we have already + * seeded the random number generator in cupsdInitCerts()... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, + "Seeding the random number generator..."); + + /* + * Write the seed file... + */ + + if ((fp = cupsTempFile2(seedfile, sizeof(seedfile))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create seed file %s - %s", + seedfile, strerror(errno)); + return (0); + } + + for (bytes = 0; bytes < 262144; bytes ++) + cupsFilePutChar(fp, random()); + + cupsFileClose(fp); + + /* + * Run the openssl command to seed its random number generator... + */ + + argv[0] = "openssl"; + argv[1] = "rand"; + argv[2] = "-rand"; + argv[3] = seedfile; + argv[4] = "1"; + argv[5] = NULL; + + envc = cupsdLoadEnv(envp, MAX_ENV); + envp[envc] = NULL; + + if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL, + NULL, &pid)) + { + unlink(seedfile); + return (0); + } + + while (waitpid(pid, &status, 0) < 0) + if (errno != EINTR) + { + status = 1; + break; + } + + cupsdFinishProcess(pid, command, sizeof(command), NULL); + + /* + * Remove the seed file, as it is no longer needed... + */ + + unlink(seedfile); + + if (status) + { + if (WIFEXITED(status)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to seed random number generator - " + "the openssl command stopped with status %d!", + WEXITSTATUS(status)); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to seed random number generator - " + "the openssl command crashed on signal %d!", + WTERMSIG(status)); + + return (0); + } + } + + /* + * Create a file with the certificate information fields... + * + * Note: This assumes that the default questions are asked by the openssl + * command... + */ + + if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create certificate information file %s - %s", + infofile, strerror(errno)); + return (0); + } + + cupsFilePrintf(fp, ".\n.\n.\n%s\n.\n%s\n%s\n", + ServerName, ServerName, ServerAdmin); + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Generating SSL server key and certificate..."); + + argv[0] = "openssl"; + argv[1] = "req"; + argv[2] = "-new"; + argv[3] = "-x509"; + argv[4] = "-keyout"; + argv[5] = ServerKey; + argv[6] = "-out"; + argv[7] = ServerCertificate; + argv[8] = "-days"; + argv[9] = "3650"; + argv[10] = "-nodes"; + argv[11] = NULL; + + cupsdLoadEnv(envp, MAX_ENV); + + infofd = open(infofile, O_RDONLY); + + if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL, + NULL, &pid)) + { + close(infofd); + unlink(infofile); + return (0); + } + + close(infofd); + unlink(infofile); + + while (waitpid(pid, &status, 0) < 0) + if (errno != EINTR) + { + status = 1; + break; + } + + cupsdFinishProcess(pid, command, sizeof(command), NULL); + + if (status) + { + if (WIFEXITED(status)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server key and certificate - " + "the openssl command stopped with status %d!", + WEXITSTATUS(status)); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server key and certificate - " + "the openssl command crashed on signal %d!", + WTERMSIG(status)); + } + else + { + cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...", + ServerKey); + cupsdLogMessage(CUPSD_LOG_INFO, + "Created SSL server certificate file \"%s\"...", + ServerCertificate); + } + + return (!status); + +#elif defined(HAVE_GNUTLS) + gnutls_x509_crt crt; /* Self-signed certificate */ + gnutls_x509_privkey key; /* Encryption key */ + cups_lang_t *language; /* Default language info */ + cups_file_t *fp; /* Key/cert file */ + unsigned char buffer[8192]; /* Buffer for x509 data */ + size_t bytes; /* Number of bytes of data */ + unsigned char serial[4]; /* Serial number buffer */ + time_t curtime; /* Current time */ + int result; /* Result of GNU TLS calls */ + + + /* + * Create the encryption key... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Generating SSL server key..."); + + gnutls_x509_privkey_init(&key); + gnutls_x509_privkey_generate(key, GNUTLS_PK_RSA, 2048, 0); + + /* + * Save it... + */ + + bytes = sizeof(buffer); + + if ((result = gnutls_x509_privkey_export(key, GNUTLS_X509_FMT_PEM, + buffer, &bytes)) < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to export SSL server key - %s", + gnutls_strerror(result)); + gnutls_x509_privkey_deinit(key); + return (0); + } + else if ((fp = cupsFileOpen(ServerKey, "w")) != NULL) + { + cupsFileWrite(fp, (char *)buffer, bytes); + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_INFO, "Created SSL server key file \"%s\"...", + ServerKey); + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server key file \"%s\" - %s", + ServerKey, strerror(errno)); + gnutls_x509_privkey_deinit(key); + return (0); + } + + /* + * Create the self-signed certificate... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Generating self-signed SSL certificate..."); + + language = cupsLangDefault(); + curtime = time(NULL); + serial[0] = curtime >> 24; + serial[1] = curtime >> 16; + serial[2] = curtime >> 8; + serial[3] = curtime; + + gnutls_x509_crt_init(&crt); + if (strlen(language->language) == 5) + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0, + language->language + 3, 2); + else + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COUNTRY_NAME, 0, + "US", 2); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_COMMON_NAME, 0, + ServerName, strlen(ServerName)); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, + ServerName, strlen(ServerName)); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_ORGANIZATIONAL_UNIT_NAME, + 0, "Unknown", 7); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_STATE_OR_PROVINCE_NAME, 0, + "Unknown", 7); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_X520_LOCALITY_NAME, 0, + "Unknown", 7); + gnutls_x509_crt_set_dn_by_oid(crt, GNUTLS_OID_PKCS9_EMAIL, 0, + ServerAdmin, strlen(ServerAdmin)); + gnutls_x509_crt_set_key(crt, key); + gnutls_x509_crt_set_serial(crt, serial, sizeof(serial)); + gnutls_x509_crt_set_activation_time(crt, curtime); + gnutls_x509_crt_set_expiration_time(crt, curtime + 10 * 365 * 86400); + gnutls_x509_crt_set_ca_status(crt, 0); + gnutls_x509_crt_set_subject_alternative_name(crt, GNUTLS_SAN_DNSNAME, + ServerName); + gnutls_x509_crt_set_key_purpose_oid(crt, GNUTLS_KP_TLS_WWW_SERVER, 0); + gnutls_x509_crt_set_key_usage(crt, GNUTLS_KEY_KEY_ENCIPHERMENT); + gnutls_x509_crt_set_version(crt, 3); + + bytes = sizeof(buffer); + if (gnutls_x509_crt_get_key_id(crt, 0, buffer, &bytes) >= 0) + gnutls_x509_crt_set_subject_key_id(crt, buffer, bytes); + + gnutls_x509_crt_sign(crt, crt, key); + + /* + * Save it... + */ + + bytes = sizeof(buffer); + if ((result = gnutls_x509_crt_export(crt, GNUTLS_X509_FMT_PEM, + buffer, &bytes)) < 0) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to export SSL server certificate - %s", + gnutls_strerror(result)); + else if ((fp = cupsFileOpen(ServerCertificate, "w")) != NULL) + { + cupsFileWrite(fp, (char *)buffer, bytes); + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Created SSL server certificate file \"%s\"...", + ServerCertificate); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server certificate file \"%s\" - %s", + ServerCertificate, strerror(errno)); + + /* + * Cleanup... + */ + + gnutls_x509_crt_deinit(crt); + gnutls_x509_privkey_deinit(key); + + return (1); + +#elif defined(HAVE_CDSASSL) && defined(HAVE_WAITPID) + int pid, /* Process ID of command */ + status; /* Status of command */ + char command[1024], /* Command */ + *argv[4], /* Command-line arguments */ + *envp[MAX_ENV + 1], /* Environment variables */ + keychain[1024], /* Keychain argument */ + infofile[1024], /* Type-in information for cert */ + localname[1024], /* Local hostname */ + *servername; /* Name of server in cert */ + cups_file_t *fp; /* Seed/info file */ + int infofd; /* Info file descriptor */ + + + if (con->servername && isdigit(con->servername[0] & 255) && DNSSDHostName) + { + snprintf(localname, sizeof(localname), "%s.local", DNSSDHostName); + servername = localname; + } + else + servername = con->servername; + + /* + * Run the "certtool" command to generate a self-signed certificate... + */ + + if (!cupsFileFind("certtool", getenv("PATH"), 1, command, sizeof(command))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "No SSL certificate and certtool command not found!"); + return (0); + } + + /* + * Create a file with the certificate information fields... + * + * Note: This assumes that the default questions are asked by the certtool + * command... + */ + + if ((fp = cupsTempFile2(infofile, sizeof(infofile))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create certificate information file %s - %s", + infofile, strerror(errno)); + return (0); + } + + cupsFilePrintf(fp, + "%s\n" /* Enter key and certificate label */ + "r\n" /* Generate RSA key pair */ + "2048\n" /* Key size in bits */ + "y\n" /* OK (y = yes) */ + "b\n" /* Usage (b=signing/encryption) */ + "s\n" /* Sign with SHA1 */ + "y\n" /* OK (y = yes) */ + "%s\n" /* Common name */ + "\n" /* Country (default) */ + "\n" /* Organization (default) */ + "\n" /* Organizational unit (default) */ + "\n" /* State/Province (default) */ + "%s\n" /* Email address */ + "y\n", /* OK (y = yes) */ + servername, servername, ServerAdmin); + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Generating SSL server key and certificate..."); + + snprintf(keychain, sizeof(keychain), "k=%s", ServerCertificate); + + argv[0] = "certtool"; + argv[1] = "c"; + argv[2] = keychain; + argv[3] = NULL; + + cupsdLoadEnv(envp, MAX_ENV); + + infofd = open(infofile, O_RDONLY); + + if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL, + NULL, &pid)) + { + close(infofd); + unlink(infofile); + return (0); + } + + close(infofd); + unlink(infofile); + + while (waitpid(pid, &status, 0) < 0) + if (errno != EINTR) + { + status = 1; + break; + } + + cupsdFinishProcess(pid, command, sizeof(command), NULL); + + if (status) + { + if (WIFEXITED(status)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server key and certificate - " + "the certtool command stopped with status %d!", + WEXITSTATUS(status)); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create SSL server key and certificate - " + "the certtool command crashed on signal %d!", + WTERMSIG(status)); + } + else + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Created SSL server certificate file \"%s\"...", + ServerCertificate); + } + + return (!status); + +#else + return (0); +#endif /* HAVE_LIBSSL && HAVE_WAITPID */ +} +#endif /* HAVE_SSL */ + + +/* + * 'pipe_command()' - Pipe the output of a command to the remote client. + */ + +static int /* O - Process ID */ +pipe_command(cupsd_client_t *con, /* I - Client connection */ + int infile, /* I - Standard input for command */ + int *outfile, /* O - Standard output for command */ + char *command, /* I - Command to run */ + char *options, /* I - Options for command */ + int root) /* I - Run as root? */ +{ + int i; /* Looping var */ + int pid; /* Process ID */ + char *commptr, /* Command string pointer */ + commch; /* Command string character */ + char *uriptr; /* URI string pointer */ + int fds[2]; /* Pipe FDs */ + int argc; /* Number of arguments */ + int envc; /* Number of environment variables */ + char argbuf[10240], /* Argument buffer */ + *argv[100], /* Argument strings */ + *envp[MAX_ENV + 20]; /* Environment variables */ + char auth_type[256], /* AUTH_TYPE environment variable */ + content_length[1024], /* CONTENT_LENGTH environment variable */ + content_type[1024], /* CONTENT_TYPE environment variable */ + http_cookie[32768], /* HTTP_COOKIE environment variable */ + http_referer[1024], /* HTTP_REFERER environment variable */ + http_user_agent[1024], /* HTTP_USER_AGENT environment variable */ + lang[1024], /* LANG environment variable */ + path_info[1024], /* PATH_INFO environment variable */ + remote_addr[1024], /* REMOTE_ADDR environment variable */ + remote_host[1024], /* REMOTE_HOST environment variable */ + remote_user[1024], /* REMOTE_USER environment variable */ + script_filename[1024], /* SCRIPT_FILENAME environment variable */ + script_name[1024], /* SCRIPT_NAME environment variable */ + server_name[1024], /* SERVER_NAME environment variable */ + server_port[1024]; /* SERVER_PORT environment variable */ + ipp_attribute_t *attr; /* attributes-natural-language attribute */ + void *ccache = NULL; /* Kerberos credentials */ + + + /* + * Parse a copy of the options string, which is of the form: + * + * argument+argument+argument + * ?argument+argument+argument + * param=value¶m=value + * ?param=value¶m=value + * /name?argument+argument+argument + * /name?param=value¶m=value + * + * If the string contains an "=" character after the initial name, + * then we treat it as a HTTP GET form request and make a copy of + * the remaining string for the environment variable. + * + * The string is always parsed out as command-line arguments, to + * be consistent with Apache... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "pipe_command(con=%p(%d), infile=%d, outfile=%p, " + "command=\"%s\", options=\"%s\", root=%d)", + con, con->http.fd, infile, outfile, command, + options ? options : "(null)", root); + + argv[0] = command; + + if (options) + { + commptr = options; + if (*commptr == ' ') + commptr ++; + strlcpy(argbuf, commptr, sizeof(argbuf)); + } + else + argbuf[0] = '\0'; + + if (argbuf[0] == '/') + { + /* + * Found some trailing path information, set PATH_INFO... + */ + + if ((commptr = strchr(argbuf, '?')) == NULL) + commptr = argbuf + strlen(argbuf); + + commch = *commptr; + *commptr = '\0'; + snprintf(path_info, sizeof(path_info), "PATH_INFO=%s", argbuf); + *commptr = commch; + } + else + { + commptr = argbuf; + path_info[0] = '\0'; + + if (*commptr == ' ') + commptr ++; + } + + if (*commptr == '?' && con->operation == HTTP_GET && !con->query_string) + { + commptr ++; + cupsdSetStringf(&(con->query_string), "QUERY_STRING=%s", commptr); + } + + argc = 1; + + if (*commptr) + { + argv[argc ++] = commptr; + + for (; *commptr && argc < 99; commptr ++) + { + /* + * Break arguments whenever we see a + or space... + */ + + if (*commptr == ' ' || *commptr == '+') + { + while (*commptr == ' ' || *commptr == '+') + *commptr++ = '\0'; + + /* + * If we don't have a blank string, save it as another argument... + */ + + if (*commptr) + { + argv[argc] = commptr; + argc ++; + } + else + break; + } + else if (*commptr == '%' && isxdigit(commptr[1] & 255) && + isxdigit(commptr[2] & 255)) + { + /* + * Convert the %xx notation to the individual character. + */ + + if (commptr[1] >= '0' && commptr[1] <= '9') + *commptr = (commptr[1] - '0') << 4; + else + *commptr = (tolower(commptr[1]) - 'a' + 10) << 4; + + if (commptr[2] >= '0' && commptr[2] <= '9') + *commptr |= commptr[2] - '0'; + else + *commptr |= tolower(commptr[2]) - 'a' + 10; + + _cups_strcpy(commptr + 1, commptr + 3); + + /* + * Check for a %00 and break if that is the case... + */ + + if (!*commptr) + break; + } + } + } + + argv[argc] = NULL; + + /* + * Setup the environment variables as needed... + */ + + if (con->username[0]) + { + snprintf(auth_type, sizeof(auth_type), "AUTH_TYPE=%s", + httpGetField(HTTP(con), HTTP_FIELD_AUTHORIZATION)); + + if ((uriptr = strchr(auth_type + 10, ' ')) != NULL) + *uriptr = '\0'; + } + else + auth_type[0] = '\0'; + + if (con->request && + (attr = ippFindAttribute(con->request, "attributes-natural-language", + IPP_TAG_LANGUAGE)) != NULL) + { + switch (strlen(attr->values[0].string.text)) + { + default : + /* + * This is an unknown or badly formatted language code; use + * the POSIX locale... + */ + + strcpy(lang, "LANG=C"); + break; + + case 2 : + /* + * Just the language code (ll)... + */ + + snprintf(lang, sizeof(lang), "LANG=%s.UTF8", + attr->values[0].string.text); + break; + + case 5 : + /* + * Language and country code (ll-cc)... + */ + + snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF8", + attr->values[0].string.text[0], + attr->values[0].string.text[1], + toupper(attr->values[0].string.text[3] & 255), + toupper(attr->values[0].string.text[4] & 255)); + break; + } + } + else if (con->language) + snprintf(lang, sizeof(lang), "LANG=%s.UTF8", con->language->language); + else + strcpy(lang, "LANG=C"); + + strcpy(remote_addr, "REMOTE_ADDR="); + httpAddrString(con->http.hostaddr, remote_addr + 12, + sizeof(remote_addr) - 12); + + snprintf(remote_host, sizeof(remote_host), "REMOTE_HOST=%s", + con->http.hostname); + + snprintf(script_name, sizeof(script_name), "SCRIPT_NAME=%s", con->uri); + if ((uriptr = strchr(script_name, '?')) != NULL) + *uriptr = '\0'; + + snprintf(script_filename, sizeof(script_filename), "SCRIPT_FILENAME=%s%s", + DocumentRoot, script_name + 12); + + sprintf(server_port, "SERVER_PORT=%d", con->serverport); + + if (con->http.fields[HTTP_FIELD_HOST][0]) + { + char *nameptr; /* Pointer to ":port" */ + + snprintf(server_name, sizeof(server_name), "SERVER_NAME=%s", + con->http.fields[HTTP_FIELD_HOST]); + if ((nameptr = strrchr(server_name, ':')) != NULL && !strchr(nameptr, ']')) + *nameptr = '\0'; /* Strip trailing ":port" */ + } + else + snprintf(server_name, sizeof(server_name), "SERVER_NAME=%s", + con->servername); + + envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + + if (auth_type[0]) + envp[envc ++] = auth_type; + + envp[envc ++] = lang; + envp[envc ++] = "REDIRECT_STATUS=1"; + envp[envc ++] = "GATEWAY_INTERFACE=CGI/1.1"; + envp[envc ++] = server_name; + envp[envc ++] = server_port; + envp[envc ++] = remote_addr; + envp[envc ++] = remote_host; + envp[envc ++] = script_name; + envp[envc ++] = script_filename; + + if (path_info[0]) + envp[envc ++] = path_info; + + if (con->username[0]) + { + snprintf(remote_user, sizeof(remote_user), "REMOTE_USER=%s", con->username); + + envp[envc ++] = remote_user; + } + + if (con->http.version == HTTP_1_1) + envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.1"; + else if (con->http.version == HTTP_1_0) + envp[envc ++] = "SERVER_PROTOCOL=HTTP/1.0"; + else + envp[envc ++] = "SERVER_PROTOCOL=HTTP/0.9"; + + if (con->http.cookie) + { + snprintf(http_cookie, sizeof(http_cookie), "HTTP_COOKIE=%s", + con->http.cookie); + envp[envc ++] = http_cookie; + } + + if (con->http.fields[HTTP_FIELD_USER_AGENT][0]) + { + snprintf(http_user_agent, sizeof(http_user_agent), "HTTP_USER_AGENT=%s", + con->http.fields[HTTP_FIELD_USER_AGENT]); + envp[envc ++] = http_user_agent; + } + + if (con->http.fields[HTTP_FIELD_REFERER][0]) + { + snprintf(http_referer, sizeof(http_referer), "HTTP_REFERER=%s", + con->http.fields[HTTP_FIELD_REFERER]); + envp[envc ++] = http_referer; + } + + if (con->operation == HTTP_GET) + { + envp[envc ++] = "REQUEST_METHOD=GET"; + + if (con->query_string) + { + /* + * Add GET form variables after ?... + */ + + envp[envc ++] = con->query_string; + } + else + envp[envc ++] = "QUERY_STRING="; + } + else + { + sprintf(content_length, "CONTENT_LENGTH=" CUPS_LLFMT, + CUPS_LLCAST con->bytes); + snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s", + con->http.fields[HTTP_FIELD_CONTENT_TYPE]); + + envp[envc ++] = "REQUEST_METHOD=POST"; + envp[envc ++] = content_length; + envp[envc ++] = content_type; + } + + /* + * Tell the CGI if we are using encryption... + */ + + if (con->http.tls) + envp[envc ++] = "HTTPS=ON"; + + /* + * Terminate the environment array... + */ + + envp[envc] = NULL; + + if (LogLevel >= CUPSD_LOG_DEBUG) + { + for (i = 0; i < argc; i ++) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "[CGI] argv[%d] = \"%s\"", i, argv[i]); + for (i = 0; i < envc; i ++) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "[CGI] envp[%d] = \"%s\"", i, envp[i]); + } + + /* + * Create a pipe for the output... + */ + + if (cupsdOpenPipe(fds)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "[CGI] Unable to create pipe for %s - %s", + argv[0], strerror(errno)); + return (0); + } + + /* + * Then execute the command... + */ + + if (cupsdStartProcess(command, argv, envp, infile, fds[1], CGIPipes[1], + -1, -1, root, DefaultProfile, NULL, &pid) < 0) + { + /* + * Error - can't fork! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "[CGI] Unable to start %s - %s", argv[0], + strerror(errno)); + + cupsdClosePipe(fds); + pid = 0; + } + else + { + /* + * Fork successful - return the PID... + */ + + if (con->username[0]) + cupsdAddCert(pid, con->username, ccache); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[CGI] Started %s (PID %d)", command, pid); + + *outfile = fds[0]; + close(fds[1]); + } + + return (pid); +} + + +/* + * 'valid_host()' - Is the Host: field valid? + */ + +static int /* O - 1 if valid, 0 if not */ +valid_host(cupsd_client_t *con) /* I - Client connection */ +{ + cupsd_alias_t *a; /* Current alias */ + cupsd_netif_t *netif; /* Current network interface */ + const char *host, /* Host field */ + *end; /* End character */ + + + host = con->http.fields[HTTP_FIELD_HOST]; + + if (httpAddrLocalhost(con->http.hostaddr)) + { + /* + * Only allow "localhost" or the equivalent IPv4 or IPv6 numerical + * addresses when accessing CUPS via the loopback interface... + */ + + return (!_cups_strcasecmp(host, "localhost") || + !_cups_strncasecmp(host, "localhost:", 10) || + !_cups_strcasecmp(host, "localhost.") || + !_cups_strncasecmp(host, "localhost.:", 11) || +#ifdef __linux + !_cups_strcasecmp(host, "localhost.localdomain") || + !_cups_strncasecmp(host, "localhost.localdomain:", 22) || +#endif /* __linux */ + !strcmp(host, "127.0.0.1") || + !strncmp(host, "127.0.0.1:", 10) || + !strcmp(host, "[::1]") || + !strncmp(host, "[::1]:", 6)); + } + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + /* + * Check if the hostname is something.local (Bonjour); if so, allow it. + */ + + if ((end = strrchr(host, '.')) != NULL && + (!_cups_strcasecmp(end, ".local") || !_cups_strncasecmp(end, ".local:", 7) || + !_cups_strcasecmp(end, ".local.") || !_cups_strncasecmp(end, ".local.:", 8))) + return (1); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + /* + * Check if the hostname is an IP address... + */ + + if (isdigit(*host & 255) || *host == '[') + { + /* + * Possible IPv4/IPv6 address... + */ + + char temp[1024], /* Temporary string */ + *ptr; /* Pointer into temporary string */ + http_addrlist_t *addrlist; /* List of addresses */ + + + strlcpy(temp, host, sizeof(temp)); + if ((ptr = strrchr(temp, ':')) != NULL && !strchr(ptr, ']')) + *ptr = '\0'; /* Strip :port from host value */ + + if ((addrlist = httpAddrGetList(temp, AF_UNSPEC, NULL)) != NULL) + { + /* + * Good IPv4/IPv6 address... + */ + + httpAddrFreeList(addrlist); + return (1); + } + } + + /* + * Check for (alias) name matches... + */ + + for (a = (cupsd_alias_t *)cupsArrayFirst(ServerAlias); + a; + a = (cupsd_alias_t *)cupsArrayNext(ServerAlias)) + { + /* + * "ServerAlias *" allows all host values through... + */ + + if (!strcmp(a->name, "*")) + return (1); + + if (!_cups_strncasecmp(host, a->name, a->namelen)) + { + /* + * Prefix matches; check the character at the end - it must be ":", ".", + * ".:", or nul... + */ + + end = host + a->namelen; + + if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':'))) + return (1); + } + } + +#ifdef HAVE_DNSSD + for (a = (cupsd_alias_t *)cupsArrayFirst(DNSSDAlias); + a; + a = (cupsd_alias_t *)cupsArrayNext(DNSSDAlias)) + { + /* + * "ServerAlias *" allows all host values through... + */ + + if (!strcmp(a->name, "*")) + return (1); + + if (!_cups_strncasecmp(host, a->name, a->namelen)) + { + /* + * Prefix matches; check the character at the end - it must be ":", ".", + * ".:", or nul... + */ + + end = host + a->namelen; + + if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':'))) + return (1); + } + } +#endif /* HAVE_DNSSD */ + + /* + * Check for interface hostname matches... + */ + + for (netif = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + netif; + netif = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + { + if (!_cups_strncasecmp(host, netif->hostname, netif->hostlen)) + { + /* + * Prefix matches; check the character at the end - it must be ":", ".", + * ".:", or nul... + */ + + end = host + netif->hostlen; + + if (!*end || *end == ':' || (*end == '.' && (!end[1] || end[1] == ':'))) + return (1); + } + } + + return (0); +} + + +/* + * 'write_file()' - Send a file via HTTP. + */ + +static int /* O - 0 on failure, 1 on success */ +write_file(cupsd_client_t *con, /* I - Client connection */ + http_status_t code, /* I - HTTP status */ + char *filename, /* I - Filename */ + char *type, /* I - File type */ + struct stat *filestats) /* O - File information */ +{ + con->file = open(filename, O_RDONLY); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "write_file(con=%p(%d), code=%d, filename=\"%s\" (%d), " + "type=\"%s\", filestats=%p)", con, con->http.fd, + code, filename, con->file, type ? type : "(null)", filestats); + + if (con->file < 0) + return (0); + + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + + con->pipe_pid = 0; + + if (!cupsdSendHeader(con, code, type, CUPSD_AUTH_NONE)) + return (0); + + if (httpPrintf(HTTP(con), "Last-Modified: %s\r\n", + httpGetDateString(filestats->st_mtime)) < 0) + return (0); + if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n", + CUPS_LLCAST filestats->st_size) < 0) + return (0); + if (httpPrintf(HTTP(con), "\r\n") < 0) + return (0); + + if (cupsdFlushHeader(con) < 0) + return (0); + + con->http.data_encoding = HTTP_ENCODE_LENGTH; + con->http.data_remaining = filestats->st_size; + + if (con->http.data_remaining <= INT_MAX) + con->http._data_remaining = con->http.data_remaining; + else + con->http._data_remaining = INT_MAX; + + cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, + (cupsd_selfunc_t)cupsdWriteClient, con); + + return (1); +} + + +/* + * 'write_pipe()' - Flag that data is available on the CGI pipe. + */ + +static void +write_pipe(cupsd_client_t *con) /* I - Client connection */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "write_pipe(con=%p(%d)) CGI output on fd %d", + con, con->http.fd, con->file); + + con->file_ready = 1; + + cupsdRemoveSelect(con->file); + cupsdAddSelect(con->http.fd, NULL, (cupsd_selfunc_t)cupsdWriteClient, con); +} + + +/* + * End of "$Id: client.c 10338 2012-03-07 06:05:39Z mike $". + */ diff --git a/scheduler/client.h b/scheduler/client.h new file mode 100644 index 0000000..7beb4aa --- /dev/null +++ b/scheduler/client.h @@ -0,0 +1,137 @@ +/* + * "$Id: client.h 9652 2011-03-25 21:25:38Z mike $" + * + * Client definitions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifdef HAVE_AUTHORIZATION_H +# include +#endif /* HAVE_AUTHORIZATION_H */ + + +/* + * HTTP client structure... + */ + +struct cupsd_client_s +{ + http_t http; /* HTTP client connection */ + ipp_t *request, /* IPP request information */ + *response; /* IPP response information */ + cupsd_location_t *best; /* Best match for AAA */ + struct timeval start; /* Request start time */ + http_state_t operation; /* Request operation */ + off_t bytes; /* Bytes transferred for this request */ + int type; /* AuthType for username */ + char username[256], /* Username from Authorization: line */ + password[33], /* Password from Authorization: line */ + uri[HTTP_MAX_URI], + /* Localized URL/URI for GET/PUT */ + *filename, /* Filename of output file */ + *command, /* Command to run */ + *options, /* Options for command */ + *query_string; /* QUERY_STRING environment variable */ + int file; /* Input/output file */ + int file_ready; /* Input ready on file/pipe? */ + int pipe_pid; /* Pipe process ID (or 0 if not a pipe) */ + int sent_header, /* Non-zero if sent HTTP header */ + got_fields, /* Non-zero if all fields seen */ + header_used; /* Number of header bytes used */ + char header[2048]; /* Header from CGI program */ + cups_lang_t *language; /* Language to use */ +#ifdef HAVE_SSL + int auto_ssl; /* Automatic test for SSL/TLS */ +#endif /* HAVE_SSL */ + http_addr_t clientaddr; /* Client address */ + char servername[256];/* Server name for connection */ + int serverport; /* Server port for connection */ +#ifdef HAVE_GSSAPI + int have_gss; /* Have GSS credentials? */ + uid_t gss_uid; /* User ID for local prints */ +#endif /* HAVE_GSSAPI */ +#ifdef HAVE_AUTHORIZATION_H + AuthorizationRef authref; /* Authorization ref */ +#endif /* HAVE_AUTHORIZATION_H */ +}; + +#define HTTP(con) &((con)->http) + + +/* + * HTTP listener structure... + */ + +typedef struct +{ + int fd; /* File descriptor for this server */ + http_addr_t address; /* Bind address of socket */ + http_encryption_t encryption; /* To encrypt or not to encrypt... */ +} cupsd_listener_t; + + +/* + * Globals... + */ + +VAR int ListenBackLog VALUE(SOMAXCONN), + /* Max backlog of pending connections */ + LocalPort VALUE(631), + /* Local port to use */ + RemotePort VALUE(0); + /* Remote port to use */ +VAR http_encryption_t LocalEncryption VALUE(HTTP_ENCRYPT_IF_REQUESTED); + /* Local port encryption to use */ +VAR cups_array_t *Listeners VALUE(NULL); + /* Listening sockets */ +VAR time_t ListeningPaused VALUE(0); + /* Time when listening was paused */ +VAR cups_array_t *Clients VALUE(NULL), + /* HTTP clients */ + *ActiveClients VALUE(NULL); + /* Active HTTP clients */ +VAR char *ServerHeader VALUE(NULL); + /* Server header in requests */ +VAR int CGIPipes[2] VALUE2(-1,-1); + /* Pipes for CGI error/debug output */ +VAR cupsd_statbuf_t *CGIStatusBuffer VALUE(NULL); + /* Status buffer for pipes */ + + +/* + * Prototypes... + */ + +extern void cupsdAcceptClient(cupsd_listener_t *lis); +extern void cupsdCloseAllClients(void); +extern int cupsdCloseClient(cupsd_client_t *con); +extern void cupsdDeleteAllListeners(void); +extern int cupsdFlushHeader(cupsd_client_t *con); +extern void cupsdPauseListening(void); +extern int cupsdProcessIPPRequest(cupsd_client_t *con); +extern void cupsdReadClient(cupsd_client_t *con); +extern void cupsdResumeListening(void); +extern int cupsdSendCommand(cupsd_client_t *con, char *command, + char *options, int root); +extern int cupsdSendError(cupsd_client_t *con, http_status_t code, + int auth_type); +extern int cupsdSendHeader(cupsd_client_t *con, http_status_t code, + char *type, int auth_type); +extern void cupsdShutdownClient(cupsd_client_t *con); +extern void cupsdStartListening(void); +extern void cupsdStopListening(void); +extern void cupsdUpdateCGI(void); +extern void cupsdWriteClient(cupsd_client_t *con); + + +/* + * End of "$Id: client.h 9652 2011-03-25 21:25:38Z mike $". + */ diff --git a/scheduler/colord.c b/scheduler/colord.c new file mode 100644 index 0000000..45ce431 --- /dev/null +++ b/scheduler/colord.c @@ -0,0 +1,692 @@ +/* + * "$Id$" + * + * colord integration for the CUPS scheduler. + * + * Copyright 2011, Red Hat. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * colordRegisterPrinter() - Register profiles for a printer. + * colordUnregisterPrinter() - Unregister profiles for a printer. + * colordStart() - Get a connection to the system bus. + * colordStop() - Release any connection to the system bus + * so that added profiles and devices are + * automatically removed. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + +#ifdef HAVE_DBUS + +#include +#include + +/* + * Defines used by colord. See the reference docs for further details: + * http://colord.hughsie.com/api/ref-dbus.html + */ +#define COLORD_SCOPE_NORMAL "normal" /* System scope */ +#define COLORD_SCOPE_TEMP "temp" /* Process scope */ +#define COLORD_SCOPE_DISK "disk" /* Lives forever, as stored in DB */ + +#define COLORD_RELATION_SOFT "soft" /* Mapping is not default */ +#define COLORD_RELATION_HARD "hard" /* Explicitly mapped profile */ + +#define COLORD_SPACE_RGB "rgb" /* RGB colorspace */ +#define COLORD_SPACE_CMYK "cmyk" /* CMYK colorspace */ +#define COLORD_SPACE_GRAY "gray" /* Gray colorspace */ +#define COLORD_SPACE_UNKNOWN "unknown" /* Unknown colorspace */ + +#define COLORD_MODE_PHYSICAL "physical" /* Actual device */ +#define COLORD_MODE_VIRTUAL "virtual" /* Virtual device with no hardware */ + +#define COLORD_KIND_PRINTER "printer" /* printing output device */ + +/* the timeout for connecting to colord */ +#define COLORD_DBUS_TIMEOUT 5000 /* ms */ + +/* This is static */ +static DBusConnection *con = NULL; + +/* + * 'colordStart()' - Get a connection to the system bus. + */ + +void +colordStart(void) +{ + if (con) + return; + con = dbus_bus_get (DBUS_BUS_SYSTEM, NULL); +} + +/* + * 'colordStop()' - Release any connection to the system bus so that + * added profiles and devices are automatically removed. + */ + +void +colordStop(void) +{ + if (con == NULL) + return; + dbus_connection_unref(con); + con = NULL; +} + +/* + * 'message_dict_add_strings()' - add two strings to a dictionary. + */ + +static void +message_dict_add_strings (DBusMessageIter *dict, + const char *key, + const char *value) +{ + DBusMessageIter entry; + dbus_message_iter_open_container(dict, + DBUS_TYPE_DICT_ENTRY, + NULL, + &entry); + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &key); + dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &value); + dbus_message_iter_close_container(dict, &entry); +} + +/* + * 'colordCreateProfile()' - Create a color profile for a printer. + * + * Notes: When creating the device, we can create + */ + +static void +colordCreateProfile (cups_array_t *profiles, /* I - Profiles array */ + const char *printer_name, /* I - Printer name */ + const char *qualifier, /* I - Profile qualifier */ + const char *colorspace, /* I - Profile colorspace */ + const char **format, /* I - Profile qualifier format */ + const char *iccfile, /* I - ICC filename */ + const char *scope) /* I - The scope of the profile, e.g. + 'normal', 'temp' or 'disk' */ +{ + DBusMessage *message = NULL; /* D-Bus request */ + DBusMessage *reply = NULL; /* D-Bus reply */ + DBusMessageIter args; /* D-Bus method arguments */ + DBusMessageIter dict; /* D-Bus method arguments */ + DBusError error; /* D-Bus error */ + char *idstr; /* Profile ID string */ + size_t idstrlen; /* Profile ID allocated length */ + const char *profile_path; /* Device object path */ + char format_str[1024]; /* Qualifier format as a string */ + + /* + * Create the profile... + */ + + message = dbus_message_new_method_call("org.freedesktop.ColorManager", + "/org/freedesktop/ColorManager", + "org.freedesktop.ColorManager", + "CreateProfile"); + + /* create a profile id */ + idstrlen = strlen (printer_name) + 1 + strlen (qualifier) + 1; + idstr = malloc (idstrlen); + if (!idstr) + goto out; + snprintf (idstr, idstrlen, "%s-%s", printer_name, qualifier); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Using profile id of %s", + idstr); + + dbus_message_iter_init_append(message, &args); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &idstr); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &scope); + + /* mush the qualifier format into a simple string */ + snprintf(format_str, sizeof(format_str), "%s.%s.%s", + format[0], + format[1], + format[2]); + + /* set initial properties */ + dbus_message_iter_open_container(&args, + DBUS_TYPE_ARRAY, + "{ss}", + &dict); + message_dict_add_strings(&dict, "Qualifier", qualifier); + message_dict_add_strings(&dict, "Format", format_str); + message_dict_add_strings(&dict, "Colorspace", colorspace); + if (iccfile != NULL) + message_dict_add_strings(&dict, "Filename", iccfile); + dbus_message_iter_close_container(&args, &dict); + + /* send syncronous */ + dbus_error_init(&error); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateProfile(%s,%s)", + idstr, scope); + reply = dbus_connection_send_with_reply_and_block(con, + message, + COLORD_DBUS_TIMEOUT, + &error); + if (reply == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "failed to CreateProfile: %s:%s", + error.name, error.message); + dbus_error_free(&error); + goto out; + } + + /* get reply data */ + dbus_message_iter_init(reply, &args); + if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "incorrect reply type"); + goto out; + } + dbus_message_iter_get_basic(&args, &profile_path); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "created profile %s", + profile_path); + cupsArrayAdd(profiles, strdup(profile_path)); + +out: + if (message != NULL) + dbus_message_unref(message); + if (reply != NULL) + dbus_message_unref(reply); + free (idstr); +} + +/* + * 'colordDeviceAddProfile()' - Assign a profile to a device. + */ + +static void +colordDeviceAddProfile (const char *device_path, /* I - Device object path */ + const char *profile_path, /* I - Profile object path */ + const char *relation) /* I - Device relation, either 'soft' or 'hard' */ +{ + DBusMessage *message = NULL; /* D-Bus request */ + DBusMessage *reply = NULL; /* D-Bus reply */ + DBusMessageIter args; /* D-Bus method arguments */ + DBusError error; /* D-Bus error */ + + message = dbus_message_new_method_call("org.freedesktop.ColorManager", + device_path, + "org.freedesktop.ColorManager.Device", + "AddProfile"); + + /* send profile path as the argument */ + dbus_message_iter_init_append(message, &args); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &relation); + dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, &profile_path); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Calling %s:AddProfile(%s) [%s]", + device_path, profile_path, relation); + + /* send syncronous */ + dbus_error_init(&error); + reply = dbus_connection_send_with_reply_and_block(con, + message, + COLORD_DBUS_TIMEOUT, + &error); + if (reply == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "failed to AddProfile: %s:%s", + error.name, error.message); + dbus_error_free(&error); + goto out; + } +out: + if (message != NULL) + dbus_message_unref(message); + if (reply != NULL) + dbus_message_unref(reply); +} + +/* + * 'colordCreateDevice()' - Create a device and register profiles. + */ + +static void +colordCreateDevice (cupsd_printer_t *p, /* I - Printer */ + ppd_file_t *ppd, /* I - PPD file */ + cups_array_t *profiles, /* I - Profiles array */ + const char *colorspace, /* I - Device colorspace, e.g. 'rgb' */ + char **format, /* I - Device qualifier format */ + const char *relation, /* I - Profile relation, either 'soft' or 'hard' */ + const char *scope) /* I - The scope of the device, e.g. + 'normal', 'temp' or 'disk' */ +{ + DBusMessage *message = NULL; /* D-Bus request */ + DBusMessage *reply = NULL; /* D-Bus reply */ + DBusMessageIter args; /* D-Bus method arguments */ + DBusMessageIter dict; /* D-Bus method arguments */ + DBusError error; /* D-Bus error */ + const char *device_path; /* Device object path */ + const char *profile_path; /* Profile path */ + char *default_profile_path = NULL; + /* Default profile path */ + char device_id[1024]; /* Device ID as understood by colord */ + char format_str[1024]; /* Qualifier format as a string */ + + /* + * Create the device... + */ + + snprintf(device_id, sizeof(device_id), "cups-%s", p->name); + device_path = device_id; + + message = dbus_message_new_method_call("org.freedesktop.ColorManager", + "/org/freedesktop/ColorManager", + "org.freedesktop.ColorManager", + "CreateDevice"); + + dbus_message_iter_init_append(message, &args); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &device_path); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &scope); + + /* mush the qualifier format into a simple string */ + snprintf(format_str, sizeof(format_str), "%s.%s.%s", + format[0], + format[1], + format[2]); + + /* set initial properties */ + dbus_message_iter_open_container(&args, + DBUS_TYPE_ARRAY, + "{ss}", + &dict); + message_dict_add_strings(&dict, "Colorspace", colorspace); + message_dict_add_strings(&dict, "Mode", COLORD_MODE_PHYSICAL); + if (ppd->manufacturer != NULL) + message_dict_add_strings(&dict, "Vendor", ppd->manufacturer); + if (ppd->modelname != NULL) + message_dict_add_strings(&dict, "Model", ppd->modelname); + if (p->sanitized_device_uri != NULL) + message_dict_add_strings(&dict, "Serial", p->sanitized_device_uri); + message_dict_add_strings(&dict, "Format", format_str); + message_dict_add_strings(&dict, "Kind", COLORD_KIND_PRINTER); + dbus_message_iter_close_container(&args, &dict); + + /* send syncronous */ + dbus_error_init(&error); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling CreateDevice(%s,%s)", + device_id, scope); + reply = dbus_connection_send_with_reply_and_block(con, + message, + COLORD_DBUS_TIMEOUT, + &error); + if (reply == NULL) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "failed to CreateDevice: %s:%s", + error.name, error.message); + dbus_error_free(&error); + goto out; + } + + /* get reply data */ + dbus_message_iter_init(reply, &args); + if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_OBJECT_PATH) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "incorrect reply type"); + goto out; + } + dbus_message_iter_get_basic(&args, &device_path); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "created device %s", + device_path); + + /* add profiles */ + for (profile_path = cupsArrayFirst(profiles); + profile_path; + profile_path = cupsArrayNext(profiles)) + { + colordDeviceAddProfile (device_path, profile_path, relation); + } + +out: + free(default_profile_path); + if (message != NULL) + dbus_message_unref(message); + if (reply != NULL) + dbus_message_unref(reply); +} + +/* + * 'colordDeleteDevice()' - Delete a device + */ + +static void +colordDeleteDevice (const char *device_id) /* I - Device ID string */ +{ + DBusMessage *message = NULL; /* D-Bus request */ + DBusMessage *reply = NULL; /* D-Bus reply */ + DBusMessageIter args; /* D-Bus method arguments */ + DBusError error; /* D-Bus error */ + + /* + * Create the device... + */ + + message = dbus_message_new_method_call("org.freedesktop.ColorManager", + "/org/freedesktop/ColorManager", + "org.freedesktop.ColorManager", + "DeleteDevice"); + + dbus_message_iter_init_append(message, &args); + dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &device_id); + + /* send syncronous */ + dbus_error_init(&error); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Calling DeleteDevice(%s)", device_id); + reply = dbus_connection_send_with_reply_and_block(con, + message, + COLORD_DBUS_TIMEOUT, + &error); + if (reply == NULL) + { + /* this can happen normally on start-up */ + cupsdLogMessage(CUPSD_LOG_DEBUG, + "failed to DeleteDevice: %s:%s", + error.name, error.message); + dbus_error_free(&error); + goto out; + } +out: + if (message != NULL) + dbus_message_unref(message); + if (reply != NULL) + dbus_message_unref(reply); +} + +/* + * 'colordGetQualifierFormat()' - Get the qualifier format. + * + * Notes: Returns a value of "ColorSpace.MediaType.Resolution" by default + */ + +char ** +colordGetQualifierFormat(ppd_file_t *ppd) +{ + char **format; /* Qualifier format tuple */ + const char *tmp; /* Temporary string */ + ppd_attr_t *attr; /* Profile attributes */ + + /* create 3-tuple */ + format = calloc(3, sizeof(char*)); + + /* get 1st section */ + tmp = "cupsICCQualifier1"; + attr = ppdFindAttr(ppd, tmp, NULL); + if (attr != NULL) + tmp = attr->value; + else + { + tmp = "DefaultColorSpace"; + attr = ppdFindAttr(ppd, tmp, NULL); + } + if (attr == NULL) + { + tmp = "DefaultColorModel"; + attr = ppdFindAttr(ppd, tmp, NULL); + } + if (attr == NULL) + { + tmp = ""; + } + if (strncmp(tmp, "Default", 7) == 0) + tmp += 7; + format[0] = strdup(tmp); + + /* get 2nd section */ + tmp = "cupsICCQualifier2"; + attr = ppdFindAttr(ppd, tmp, NULL); + if (attr != NULL) + tmp = attr->value; + else + { + tmp = "DefaultMediaType"; + attr = ppdFindAttr(ppd, tmp, NULL); + } + if (attr == NULL) + { + tmp = ""; + } + if (strncmp(tmp, "Default", 7) == 0) + tmp += 7; + format[1] = strdup(tmp); + + /* get 3rd section */ + tmp = "cupsICCQualifier3"; + attr = ppdFindAttr(ppd, tmp, NULL); + if (attr != NULL) + tmp = attr->value; + else + { + tmp = "DefaultResolution"; + attr = ppdFindAttr(ppd, tmp, NULL); + } + if (attr == NULL) + { + tmp = ""; + } + if (strncmp(tmp, "Default", 7) == 0) + tmp += 7; + format[2] = strdup(tmp); + + return format; +} + +/* + * 'colordRegisterPrinter()' - Register profiles for a printer. + */ + +void +colordRegisterPrinter(cupsd_printer_t *p) /* I - printer */ +{ + char ppdfile[1024], /* PPD filename */ + iccfile[1024]; /* ICC filename */ + ppd_file_t *ppd; /* PPD file */ + cups_array_t *profiles; /* Profile paths array */ + const char *profile_key; /* Profile keyword */ + ppd_attr_t *attr; /* Profile attributes */ + const char *device_colorspace; /* Device colorspace */ + char **format; /* Qualifier format tuple */ + int i; /* Loop counter */ + + /* + * Do nothing for discovered printers as they will have local color + * correction + */ + + if (p->type & CUPS_PRINTER_DISCOVERED) + return; + + /* + * Ensure we have a DBus connection + */ + + colordStart(); + if (con == NULL) + return; + + /* + * Try opening the PPD file for this printer... + */ + + snprintf(ppdfile, sizeof(ppdfile), "%s/ppd/%s.ppd", ServerRoot, p->name); + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cannot open %s", + ppdfile); + return; + } + + /* + * Find out the qualifier format + */ + + format = colordGetQualifierFormat(ppd); + + /* + * See if we have any embedded profiles... + */ + + profiles = cupsArrayNew3 (NULL, NULL, NULL, 0, NULL, + (cups_afree_func_t) free); + profile_key = "cupsICCProfile"; + attr = ppdFindAttr(ppd, profile_key, NULL); + for (; attr; attr = ppdFindNextAttr(ppd, profile_key, NULL)) + if (attr->spec[0] && attr->value && attr->value[0]) + { + if (attr->value[0] != '/') + snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir, + attr->value); + else + strlcpy(iccfile, attr->value, sizeof(iccfile)); + + if (access(iccfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "no access to %s", + iccfile); + continue; + } + + colordCreateProfile(profiles, + p->name, + attr->spec, + COLORD_SPACE_UNKNOWN, + (const char **)format, + iccfile, + COLORD_SCOPE_TEMP); + } + + /* + * Add the grayscale profile first. We always have a grayscale profile. + */ + + colordCreateProfile(profiles, + p->name, + "Gray..", + COLORD_SPACE_GRAY, + (const char **)format, + NULL, + COLORD_SCOPE_TEMP); + + /* + * Then add the RGB/CMYK/DeviceN color profile... + */ + + device_colorspace = "unknown"; + switch (ppd->colorspace) + { + case PPD_CS_RGB : + case PPD_CS_CMY : + device_colorspace = COLORD_SPACE_RGB; + colordCreateProfile(profiles, + p->name, + "RGB..", + COLORD_SPACE_RGB, + (const char **)format, + NULL, + COLORD_SCOPE_TEMP); + break; + case PPD_CS_RGBK : + case PPD_CS_CMYK : + device_colorspace = COLORD_SPACE_CMYK; + colordCreateProfile(profiles, + p->name, + "CMYK..", + COLORD_SPACE_CMYK, + (const char **)format, + NULL, + COLORD_SCOPE_TEMP); + break; + case PPD_CS_GRAY : + device_colorspace = COLORD_SPACE_GRAY; + break; + case PPD_CS_N : + colordCreateProfile(profiles, + p->name, + "DeviceN..", + COLORD_SPACE_UNKNOWN, + (const char **)format, + NULL, + COLORD_SCOPE_TEMP); + break; + } + + /* + * Register the device with colord. + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Registering ICC color profiles for \"%s\"", + p->name); + colordCreateDevice (p, + ppd, + profiles, + device_colorspace, + format, + COLORD_RELATION_SOFT, + COLORD_SCOPE_TEMP); + + /* + * Free any memory we used... + */ + + cupsArrayDelete(profiles); + for (i=0; i<3; i++) + free(format[i]); + free(format); + + ppdClose(ppd); +} + +/* + * 'colordUnregisterPrinter()' - Unregister profiles for a printer. + */ + +void +colordUnregisterPrinter(cupsd_printer_t *p) /* I - printer */ +{ + char device_id[1024]; /* Device ID as understood by colord */ + + /* + * Ensure we have a DBus connection + */ + + colordStart(); + if (con == NULL) + return; + + /* + * Just delete the device itself, and leave the profiles registered + */ + + snprintf(device_id, sizeof(device_id), "cups-%s", p->name); + colordDeleteDevice(device_id); +} + +#endif /* HAVE_DBUS */ + +/* + * End of "$Id$". + */ diff --git a/scheduler/colord.h b/scheduler/colord.h new file mode 100644 index 0000000..262b695 --- /dev/null +++ b/scheduler/colord.h @@ -0,0 +1,22 @@ +/* + * "$Id$" + * + * colord integration for the CUPS scheduler. + * + * Copyright 2011, Red Hat. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +void colordRegisterPrinter(cupsd_printer_t *p); +void colordUnregisterPrinter(cupsd_printer_t *p); +void colordStart(void); +void colordStop(void); + +/* + * End of "$Id$". + */ diff --git a/scheduler/conf.c b/scheduler/conf.c new file mode 100644 index 0000000..36f00da --- /dev/null +++ b/scheduler/conf.c @@ -0,0 +1,4228 @@ +/* + * "$Id: conf.c 10121 2011-11-16 15:28:11Z mike $" + * + * Configuration routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddAlias() - Add a host alias. + * cupsdCheckPermissions() - Fix the mode and ownership of a file or + * directory. + * cupsdFreeAliases() - Free all of the alias entries. + * cupsdReadConfiguration() - Read the cupsd.conf file. + * get_address() - Get an address + port number from a line. + * get_addr_and_mask() - Get an IP address and netmask. + * mime_error_cb() - Log a MIME error. + * parse_aaa() - Parse authentication, authorization, and access + * control lines. + * parse_fatal_errors() - Parse FatalErrors values in a string. + * parse_groups() - Parse system group names in a string. + * parse_protocols() - Parse browse protocols in a string. + * read_configuration() - Read a configuration file. + * read_location() - Read a definition. + * read_policy() - Read a definition. + * set_policy_defaults() - Set default policy values as needed. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#include +#include +#include + +#ifdef HAVE_LIBPAPER +# include +#endif /* HAVE_LIBPAPER */ + + +/* + * Possibly missing network definitions... + */ + +#ifndef INADDR_NONE +# define INADDR_NONE 0xffffffff +#endif /* !INADDR_NONE */ + + +/* + * Configuration variable structure... + */ + +typedef enum +{ + CUPSD_VARTYPE_INTEGER, /* Integer option */ + CUPSD_VARTYPE_STRING, /* String option */ + CUPSD_VARTYPE_BOOLEAN, /* Boolean option */ + CUPSD_VARTYPE_PATHNAME /* File/directory name option */ +} cupsd_vartype_t; + +typedef struct +{ + char *name; /* Name of variable */ + void *ptr; /* Pointer to variable */ + cupsd_vartype_t type; /* Type (int, string, address) */ +} cupsd_var_t; + + +/* + * Local globals... + */ + +static const cupsd_var_t variables[] = +{ + { "AccessLog", &AccessLog, CUPSD_VARTYPE_STRING }, + { "AutoPurgeJobs", &JobAutoPurge, CUPSD_VARTYPE_BOOLEAN }, +#ifdef HAVE_DNSSD + { "BrowseDNSSDRegType", &DNSSDRegType, CUPSD_VARTYPE_STRING }, +#endif /* HAVE_DNSSD */ + { "BrowseInterval", &BrowseInterval, CUPSD_VARTYPE_INTEGER }, +#ifdef HAVE_LDAP + { "BrowseLDAPBindDN", &BrowseLDAPBindDN, CUPSD_VARTYPE_STRING }, +# ifdef HAVE_LDAP_SSL + { "BrowseLDAPCACertFile", &BrowseLDAPCACertFile, CUPSD_VARTYPE_PATHNAME }, +# endif /* HAVE_LDAP_SSL */ + { "BrowseLDAPDN", &BrowseLDAPDN, CUPSD_VARTYPE_STRING }, + { "BrowseLDAPPassword", &BrowseLDAPPassword, CUPSD_VARTYPE_STRING }, + { "BrowseLDAPServer", &BrowseLDAPServer, CUPSD_VARTYPE_STRING }, +#endif /* HAVE_LDAP */ + { "BrowseLocalOptions", &BrowseLocalOptions, CUPSD_VARTYPE_STRING }, + { "BrowsePort", &BrowsePort, CUPSD_VARTYPE_INTEGER }, + { "BrowseRemoteOptions", &BrowseRemoteOptions, CUPSD_VARTYPE_STRING }, + { "BrowseShortNames", &BrowseShortNames, CUPSD_VARTYPE_BOOLEAN }, + { "BrowseTimeout", &BrowseTimeout, CUPSD_VARTYPE_INTEGER }, + { "BrowseWebIF", &BrowseWebIF, CUPSD_VARTYPE_BOOLEAN }, + { "Browsing", &Browsing, CUPSD_VARTYPE_BOOLEAN }, + { "CacheDir", &CacheDir, CUPSD_VARTYPE_STRING }, + { "Classification", &Classification, CUPSD_VARTYPE_STRING }, + { "ClassifyOverride", &ClassifyOverride, CUPSD_VARTYPE_BOOLEAN }, + { "ConfigFilePerm", &ConfigFilePerm, CUPSD_VARTYPE_INTEGER }, + { "DataDir", &DataDir, CUPSD_VARTYPE_STRING }, + { "DefaultLanguage", &DefaultLanguage, CUPSD_VARTYPE_STRING }, + { "DefaultLeaseDuration", &DefaultLeaseDuration, CUPSD_VARTYPE_INTEGER }, + { "DefaultPaperSize", &DefaultPaperSize, CUPSD_VARTYPE_STRING }, + { "DefaultPolicy", &DefaultPolicy, CUPSD_VARTYPE_STRING }, + { "DefaultShared", &DefaultShared, CUPSD_VARTYPE_BOOLEAN }, + { "DirtyCleanInterval", &DirtyCleanInterval, CUPSD_VARTYPE_INTEGER }, + { "DocumentRoot", &DocumentRoot, CUPSD_VARTYPE_STRING }, + { "ErrorLog", &ErrorLog, CUPSD_VARTYPE_STRING }, + { "ErrorPolicy", &ErrorPolicy, CUPSD_VARTYPE_STRING }, + { "FileDevice", &FileDevice, CUPSD_VARTYPE_BOOLEAN }, + { "FilterLimit", &FilterLimit, CUPSD_VARTYPE_INTEGER }, + { "FilterNice", &FilterNice, CUPSD_VARTYPE_INTEGER }, + { "FontPath", &FontPath, CUPSD_VARTYPE_STRING }, + { "HideImplicitMembers", &HideImplicitMembers, CUPSD_VARTYPE_BOOLEAN }, + { "ImplicitClasses", &ImplicitClasses, CUPSD_VARTYPE_BOOLEAN }, + { "ImplicitAnyClasses", &ImplicitAnyClasses, CUPSD_VARTYPE_BOOLEAN }, + { "JobKillDelay", &JobKillDelay, CUPSD_VARTYPE_INTEGER }, + { "JobRetryLimit", &JobRetryLimit, CUPSD_VARTYPE_INTEGER }, + { "JobRetryInterval", &JobRetryInterval, CUPSD_VARTYPE_INTEGER }, + { "KeepAliveTimeout", &KeepAliveTimeout, CUPSD_VARTYPE_INTEGER }, + { "KeepAlive", &KeepAlive, CUPSD_VARTYPE_BOOLEAN }, +#ifdef HAVE_LAUNCHD + { "LaunchdTimeout", &LaunchdTimeout, CUPSD_VARTYPE_INTEGER }, +#endif /* HAVE_LAUNCHD */ + { "LimitRequestBody", &MaxRequestSize, CUPSD_VARTYPE_INTEGER }, + { "ListenBackLog", &ListenBackLog, CUPSD_VARTYPE_INTEGER }, + { "LogDebugHistory", &LogDebugHistory, CUPSD_VARTYPE_INTEGER }, + { "LogFilePerm", &LogFilePerm, CUPSD_VARTYPE_INTEGER }, + { "LPDConfigFile", &LPDConfigFile, CUPSD_VARTYPE_STRING }, + { "MaxActiveJobs", &MaxActiveJobs, CUPSD_VARTYPE_INTEGER }, + { "MaxClients", &MaxClients, CUPSD_VARTYPE_INTEGER }, + { "MaxClientsPerHost", &MaxClientsPerHost, CUPSD_VARTYPE_INTEGER }, + { "MaxCopies", &MaxCopies, CUPSD_VARTYPE_INTEGER }, + { "MaxEvents", &MaxEvents, CUPSD_VARTYPE_INTEGER }, + { "MaxJobs", &MaxJobs, CUPSD_VARTYPE_INTEGER }, + { "MaxJobsPerPrinter", &MaxJobsPerPrinter, CUPSD_VARTYPE_INTEGER }, + { "MaxJobsPerUser", &MaxJobsPerUser, CUPSD_VARTYPE_INTEGER }, + { "MaxLeaseDuration", &MaxLeaseDuration, CUPSD_VARTYPE_INTEGER }, + { "MaxLogSize", &MaxLogSize, CUPSD_VARTYPE_INTEGER }, + { "MaxRequestSize", &MaxRequestSize, CUPSD_VARTYPE_INTEGER }, + { "MaxSubscriptions", &MaxSubscriptions, CUPSD_VARTYPE_INTEGER }, + { "MaxSubscriptionsPerJob", &MaxSubscriptionsPerJob, CUPSD_VARTYPE_INTEGER }, + { "MaxSubscriptionsPerPrinter",&MaxSubscriptionsPerPrinter, CUPSD_VARTYPE_INTEGER }, + { "MaxSubscriptionsPerUser", &MaxSubscriptionsPerUser, CUPSD_VARTYPE_INTEGER }, + { "MultipleOperationTimeout", &MultipleOperationTimeout, CUPSD_VARTYPE_INTEGER }, + { "PageLog", &PageLog, CUPSD_VARTYPE_STRING }, + { "PageLogFormat", &PageLogFormat, CUPSD_VARTYPE_STRING }, + { "PreserveJobFiles", &JobFiles, CUPSD_VARTYPE_BOOLEAN }, + { "PreserveJobHistory", &JobHistory, CUPSD_VARTYPE_BOOLEAN }, + { "Printcap", &Printcap, CUPSD_VARTYPE_STRING }, + { "PrintcapGUI", &PrintcapGUI, CUPSD_VARTYPE_STRING }, + { "ReloadTimeout", &ReloadTimeout, CUPSD_VARTYPE_INTEGER }, + { "RemoteRoot", &RemoteRoot, CUPSD_VARTYPE_STRING }, + { "RequestRoot", &RequestRoot, CUPSD_VARTYPE_STRING }, + { "RIPCache", &RIPCache, CUPSD_VARTYPE_STRING }, + { "RootCertDuration", &RootCertDuration, CUPSD_VARTYPE_INTEGER }, + { "ServerAdmin", &ServerAdmin, CUPSD_VARTYPE_STRING }, + { "ServerBin", &ServerBin, CUPSD_VARTYPE_PATHNAME }, +#ifdef HAVE_SSL + { "ServerCertificate", &ServerCertificate, CUPSD_VARTYPE_PATHNAME }, +# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS) + { "ServerKey", &ServerKey, CUPSD_VARTYPE_PATHNAME }, +# endif /* HAVE_LIBSSL || HAVE_GNUTLS */ +#endif /* HAVE_SSL */ + { "ServerName", &ServerName, CUPSD_VARTYPE_STRING }, + { "ServerRoot", &ServerRoot, CUPSD_VARTYPE_PATHNAME }, + { "SMBConfigFile", &SMBConfigFile, CUPSD_VARTYPE_STRING }, + { "StateDir", &StateDir, CUPSD_VARTYPE_STRING }, +#ifdef HAVE_AUTHORIZATION_H + { "SystemGroupAuthKey", &SystemGroupAuthKey, CUPSD_VARTYPE_STRING }, +#endif /* HAVE_AUTHORIZATION_H */ + { "TempDir", &TempDir, CUPSD_VARTYPE_PATHNAME }, + { "Timeout", &Timeout, CUPSD_VARTYPE_INTEGER }, + { "UseNetworkDefault", &UseNetworkDefault, CUPSD_VARTYPE_BOOLEAN }, + { "WebInterface", &WebInterface, CUPSD_VARTYPE_BOOLEAN }, + { "PidFile", &PidFile, CUPSD_VARTYPE_STRING } +}; +#define NUM_VARS (sizeof(variables) / sizeof(variables[0])) + + +static const unsigned ones[4] = + { + 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff + }; +static const unsigned zeros[4] = + { + 0x00000000, 0x00000000, 0x00000000, 0x00000000 + }; + + +/* + * Local functions... + */ + +static http_addrlist_t *get_address(const char *value, int defport); +static int get_addr_and_mask(const char *value, unsigned *ip, + unsigned *mask); +static void mime_error_cb(void *ctx, const char *message); +static int parse_aaa(cupsd_location_t *loc, char *line, + char *value, int linenum); +static int parse_fatal_errors(const char *s); +static int parse_groups(const char *s); +static int parse_protocols(const char *s); +static int read_configuration(cups_file_t *fp); +static int read_location(cups_file_t *fp, char *name, int linenum); +static int read_policy(cups_file_t *fp, char *name, int linenum); +static void set_policy_defaults(cupsd_policy_t *pol); + + +/* + * 'cupsdAddAlias()' - Add a host alias. + */ + +void +cupsdAddAlias(cups_array_t *aliases, /* I - Array of aliases */ + const char *name) /* I - Name to add */ +{ + cupsd_alias_t *a; /* New alias */ + size_t namelen; /* Length of name */ + + + namelen = strlen(name); + + if ((a = (cupsd_alias_t *)malloc(sizeof(cupsd_alias_t) + namelen)) == NULL) + return; + + a->namelen = namelen; + strcpy(a->name, name); /* OK since a->name is allocated */ + + cupsArrayAdd(aliases, a); +} + + +/* + * 'cupsdCheckPermissions()' - Fix the mode and ownership of a file or directory. + */ + +int /* O - 0 on success, -1 on error, 1 on warning */ +cupsdCheckPermissions( + const char *filename, /* I - File/directory name */ + const char *suffix, /* I - Additional file/directory name */ + int mode, /* I - Permissions */ + int user, /* I - Owner */ + int group, /* I - Group */ + int is_dir, /* I - 1 = directory, 0 = file */ + int create_dir) /* I - 1 = create directory, -1 = create w/o logging, 0 = not */ +{ + int dir_created = 0; /* Did we create a directory? */ + char pathname[1024]; /* File name with prefix */ + struct stat fileinfo; /* Stat buffer */ + int is_symlink; /* Is "filename" a symlink? */ + + + /* + * Prepend the given root to the filename before testing it... + */ + + if (suffix) + { + snprintf(pathname, sizeof(pathname), "%s/%s", filename, suffix); + filename = pathname; + } + + /* + * See if we can stat the file/directory... + */ + + if (lstat(filename, &fileinfo)) + { + if (errno == ENOENT && create_dir) + { + if (create_dir > 0) + cupsdLogMessage(CUPSD_LOG_DEBUG, "Creating missing directory \"%s\"", + filename); + + if (mkdir(filename, mode)) + { + if (create_dir > 0) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create directory \"%s\" - %s", filename, + strerror(errno)); + else + syslog(LOG_ERR, "Unable to create directory \"%s\" - %s", filename, + strerror(errno)); + + return (-1); + } + + dir_created = 1; + fileinfo.st_mode = mode | S_IFDIR; + } + else + return (create_dir ? -1 : 1); + } + + if ((is_symlink = S_ISLNK(fileinfo.st_mode)) != 0) + { + if (stat(filename, &fileinfo)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is a bad symlink - %s", + filename, strerror(errno)); + return (-1); + } + } + + /* + * Make sure it's a regular file or a directory as needed... + */ + + if (!dir_created && !is_dir && !S_ISREG(fileinfo.st_mode)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a regular file.", filename); + return (-1); + } + + if (!dir_created && is_dir && !S_ISDIR(fileinfo.st_mode)) + { + if (create_dir >= 0) + cupsdLogMessage(CUPSD_LOG_ERROR, "\"%s\" is not a directory.", filename); + else + syslog(LOG_ERR, "\"%s\" is not a directory.", filename); + + return (-1); + } + + /* + * If the filename is a symlink, do not change permissions (STR #2937)... + */ + + if (is_symlink) + return (0); + + /* + * Fix owner, group, and mode as needed... + */ + + if (dir_created || fileinfo.st_uid != user || fileinfo.st_gid != group) + { + if (create_dir >= 0) + cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing ownership of \"%s\"", + filename); + + if (chown(filename, user, group) && !getuid()) + { + if (create_dir >= 0) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to change ownership of \"%s\" - %s", filename, + strerror(errno)); + else + syslog(LOG_ERR, "Unable to change ownership of \"%s\" - %s", filename, + strerror(errno)); + + return (1); + } + } + + if (dir_created || (fileinfo.st_mode & 07777) != mode) + { + if (create_dir >= 0) + cupsdLogMessage(CUPSD_LOG_DEBUG, "Repairing access permissions of \"%s\"", + filename); + + if (chmod(filename, mode)) + { + if (create_dir >= 0) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to change permissions of \"%s\" - %s", filename, + strerror(errno)); + else + syslog(LOG_ERR, "Unable to change permissions of \"%s\" - %s", filename, + strerror(errno)); + + return (1); + } + } + + /* + * Everything is OK... + */ + + return (0); +} + + +/* + * 'cupsdFreeAliases()' - Free all of the alias entries. + */ + +void +cupsdFreeAliases(cups_array_t *aliases) /* I - Array of aliases */ +{ + cupsd_alias_t *a; /* Current alias */ + + + for (a = (cupsd_alias_t *)cupsArrayFirst(aliases); + a; + a = (cupsd_alias_t *)cupsArrayNext(aliases)) + free(a); + + cupsArrayDelete(aliases); +} + + +/* + * 'cupsdReadConfiguration()' - Read the cupsd.conf file. + */ + +int /* O - 1 on success, 0 otherwise */ +cupsdReadConfiguration(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* Configuration file */ + int status; /* Return status */ + char temp[1024], /* Temporary buffer */ + mimedir[1024], /* MIME directory */ + *slash; /* Directory separator */ + cups_lang_t *language; /* Language */ + struct passwd *user; /* Default user */ + struct group *group; /* Default group */ + char *old_serverroot, /* Old ServerRoot */ + *old_requestroot; /* Old RequestRoot */ + int old_remote_port; /* Old RemotePort */ + const char *tmpdir; /* TMPDIR environment variable */ + struct stat tmpinfo; /* Temporary directory info */ + cupsd_policy_t *p; /* Policy */ + + + /* + * Save the old root paths... + */ + + old_serverroot = NULL; + cupsdSetString(&old_serverroot, ServerRoot); + old_requestroot = NULL; + cupsdSetString(&old_requestroot, RequestRoot); + + /* + * Reset the server configuration data... + */ + + cupsdDeleteAllLocations(); + + if (NumBrowsers > 0) + { + free(Browsers); + Browsers = NULL; + + NumBrowsers = 0; + } + + if (NumPolled > 0) + { + free(Polled); + + NumPolled = 0; + } + + if (NumRelays > 0) + { + for (i = 0; i < NumRelays; i ++) + cupsArrayDelete(Relays[i].from); + + free(Relays); + + NumRelays = 0; + } + + cupsdDeleteAllListeners(); + + old_remote_port = RemotePort; + RemotePort = 0; + + /* + * String options... + */ + + cupsdFreeAliases(ServerAlias); + ServerAlias = NULL; + + cupsdClearString(&ServerName); + cupsdClearString(&ServerAdmin); + cupsdSetString(&ServerBin, CUPS_SERVERBIN); + cupsdSetString(&RequestRoot, CUPS_REQUESTS); + cupsdSetString(&CacheDir, CUPS_CACHEDIR); + cupsdSetString(&DataDir, CUPS_DATADIR); + cupsdSetString(&DocumentRoot, CUPS_DOCROOT); + cupsdSetString(&AccessLog, CUPS_LOGDIR "/access_log"); + cupsdClearString(&ErrorLog); + cupsdSetString(&PageLog, CUPS_LOGDIR "/page_log"); + cupsdSetString(&PageLogFormat, + "%p %u %j %T %P %C %{job-billing} " + "%{job-originating-host-name} %{job-name} %{media} %{sides}"); + cupsdSetString(&Printcap, CUPS_DEFAULT_PRINTCAP); + cupsdSetString(&PrintcapGUI, "/usr/bin/glpoptions"); + cupsdSetString(&FontPath, CUPS_FONTPATH); + cupsdSetString(&RemoteRoot, "remroot"); + cupsdSetStringf(&ServerHeader, "CUPS/%d.%d", CUPS_VERSION_MAJOR, + CUPS_VERSION_MINOR); + cupsdSetString(&StateDir, CUPS_STATEDIR); + cupsdSetString(&PidFile, "/opt/var/run/cups/cupsd.pid"); + + if (!strcmp(CUPS_DEFAULT_PRINTCAP, "/etc/printers.conf")) + PrintcapFormat = PRINTCAP_SOLARIS; + else if (!strcmp(CUPS_DEFAULT_PRINTCAP, + "/Library/Preferences/org.cups.printers.plist")) + PrintcapFormat = PRINTCAP_PLIST; + else + PrintcapFormat = PRINTCAP_BSD; + + strlcpy(temp, ConfigurationFile, sizeof(temp)); + if ((slash = strrchr(temp, '/')) != NULL) + *slash = '\0'; + + cupsdSetString(&ServerRoot, temp); + + cupsdClearString(&Classification); + ClassifyOverride = 0; + +#ifdef HAVE_SSL +# ifdef HAVE_CDSASSL + cupsdSetString(&ServerCertificate, "/Library/Keychains/System.keychain"); +# else + cupsdSetString(&ServerCertificate, "ssl/server.crt"); + cupsdSetString(&ServerKey, "ssl/server.key"); +# endif /* HAVE_CDSASSL */ +#endif /* HAVE_SSL */ + + language = cupsLangDefault(); + + if (!strcmp(language->language, "C") || !strcmp(language->language, "POSIX")) + cupsdSetString(&DefaultLanguage, "en"); + else + cupsdSetString(&DefaultLanguage, language->language); + + cupsdClearString(&DefaultPaperSize); + + cupsdSetString(&RIPCache, "128m"); + + cupsdSetString(&TempDir, NULL); + + /* + * Find the default user... + */ + + if ((user = getpwnam(CUPS_DEFAULT_USER)) != NULL) + User = user->pw_uid; + else + { + /* + * Use the (historical) NFS nobody user ID (-2 as a 16-bit twos- + * complement number...) + */ + + User = 65534; + } + + endpwent(); + + /* + * Find the default group... + */ + + group = getgrnam(CUPS_DEFAULT_GROUP); + endgrent(); + + if (group) + Group = group->gr_gid; + else + { + /* + * Fallback to group "nobody"... + */ + + group = getgrnam("nobody"); + endgrent(); + + if (group) + Group = group->gr_gid; + else + { + /* + * Use the (historical) NFS nobody group ID (-2 as a 16-bit twos- + * complement number...) + */ + + Group = 65534; + } + } + + /* + * Numeric options... + */ + + AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS; + ConfigFilePerm = CUPS_DEFAULT_CONFIG_FILE_PERM; + FatalErrors = parse_fatal_errors(CUPS_DEFAULT_FATAL_ERRORS); + DefaultAuthType = CUPSD_AUTH_BASIC; +#ifdef HAVE_SSL + DefaultEncryption = HTTP_ENCRYPT_REQUIRED; + SSLOptions = CUPSD_SSL_NONE; +#endif /* HAVE_SSL */ + DirtyCleanInterval = DEFAULT_KEEPALIVE; + JobKillDelay = DEFAULT_TIMEOUT; + JobRetryLimit = 5; + JobRetryInterval = 300; + FileDevice = FALSE; + FilterLevel = 0; + FilterLimit = 0; + FilterNice = 0; + HostNameLookups = FALSE; + ImplicitClasses = CUPS_DEFAULT_IMPLICIT_CLASSES; + ImplicitAnyClasses = FALSE; + HideImplicitMembers = TRUE; + KeepAlive = TRUE; + KeepAliveTimeout = DEFAULT_KEEPALIVE; + ListenBackLog = SOMAXCONN; + LogDebugHistory = 99999; + LogFilePerm = CUPS_DEFAULT_LOG_FILE_PERM; + LogLevel = CUPSD_LOG_WARN; + LogTimeFormat = CUPSD_TIME_STANDARD; + MaxClients = 100; + MaxClientsPerHost = 0; + MaxLogSize = 1024 * 1024; + MaxRequestSize = 0; + MultipleOperationTimeout = DEFAULT_TIMEOUT; + ReloadTimeout = DEFAULT_KEEPALIVE; + RootCertDuration = 300; + Timeout = DEFAULT_TIMEOUT; + NumSystemGroups = 0; + WebInterface = CUPS_DEFAULT_WEBIF; + + BrowseInterval = DEFAULT_INTERVAL; + BrowsePort = ippPort(); + BrowseLocalProtocols = parse_protocols(CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS); + BrowseRemoteProtocols = parse_protocols(CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS); + BrowseShortNames = CUPS_DEFAULT_BROWSE_SHORT_NAMES; + BrowseTimeout = DEFAULT_TIMEOUT; + BrowseWebIF = FALSE; + Browsing = CUPS_DEFAULT_BROWSING; + DefaultShared = CUPS_DEFAULT_DEFAULT_SHARED; + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cupsdSetString(&DNSSDRegType, "_ipp._tcp,_cups,_universal"); +#endif /* HAVE_DNSSD */ + + cupsdSetString(&LPDConfigFile, CUPS_DEFAULT_LPD_CONFIG_FILE); + cupsdSetString(&SMBConfigFile, CUPS_DEFAULT_SMB_CONFIG_FILE); + + cupsdClearString(&BrowseLocalOptions); + cupsdClearString(&BrowseRemoteOptions); + + cupsdSetString(&ErrorPolicy, "stop-printer"); + +#ifdef HAVE_LDAP + cupsdClearString(&BrowseLDAPBindDN); + cupsdClearString(&BrowseLDAPDN); + cupsdClearString(&BrowseLDAPPassword); + cupsdClearString(&BrowseLDAPServer); +# ifdef HAVE_LDAP_SSL + cupsdClearString(&BrowseLDAPCACertFile); +# endif /* HAVE_LDAP_SSL */ +#endif /* HAVE_LDAP */ + + JobHistory = DEFAULT_HISTORY; + JobFiles = DEFAULT_FILES; + JobAutoPurge = 0; + MaxJobs = 500; + MaxActiveJobs = 0; + MaxJobsPerUser = 0; + MaxJobsPerPrinter = 0; + MaxCopies = CUPS_DEFAULT_MAX_COPIES; + + cupsdDeleteAllPolicies(); + cupsdClearString(&DefaultPolicy); + +#ifdef HAVE_AUTHORIZATION_H + cupsdClearString(&SystemGroupAuthKey); +#endif /* HAVE_AUTHORIZATION_H */ + + MaxSubscriptions = 100; + MaxSubscriptionsPerJob = 0; + MaxSubscriptionsPerPrinter = 0; + MaxSubscriptionsPerUser = 0; + DefaultLeaseDuration = 86400; + MaxLeaseDuration = 0; + +#ifdef HAVE_LAUNCHD + LaunchdTimeout = DEFAULT_TIMEOUT + 10; +#endif /* HAVE_LAUNCHD */ + + /* + * Setup environment variables... + */ + + cupsdInitEnv(); + + /* + * Read the configuration file... + */ + + if ((fp = cupsFileOpen(ConfigurationFile, "r")) == NULL) + return (0); + + status = read_configuration(fp); + + cupsFileClose(fp); + + if (!status) + return (0); + + if (!ErrorLog) + cupsdSetString(&ErrorLog, CUPS_LOGDIR "/error_log"); + + RunUser = getuid(); + + cupsdLogMessage(CUPSD_LOG_INFO, "Remote access is %s.", + RemotePort ? "enabled" : "disabled"); + + if (!RemotePort) + BrowseLocalProtocols = 0; /* Disable sharing - no remote access */ + + /* + * See if the ServerName is an IP address... + */ + + if (ServerName) + { + if (!ServerAlias) + ServerAlias = cupsArrayNew(NULL, NULL); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", ServerName); + } + else + { + if (gethostname(temp, sizeof(temp))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to get hostname: %s", + strerror(errno)); + strlcpy(temp, "localhost", sizeof(temp)); + } + + cupsdSetString(&ServerName, temp); + + if (!ServerAlias) + ServerAlias = cupsArrayNew(NULL, NULL); + + cupsdAddAlias(ServerAlias, temp); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp); + + if (HostNameLookups) + { + struct hostent *host; /* Host entry to get FQDN */ + + if ((host = gethostbyname(temp)) != NULL) + { + if (_cups_strcasecmp(temp, host->h_name)) + { + cupsdSetString(&ServerName, host->h_name); + cupsdAddAlias(ServerAlias, host->h_name); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", + host->h_name); + } + + if (host->h_aliases) + { + for (i = 0; host->h_aliases[i]; i ++) + if (_cups_strcasecmp(temp, host->h_aliases[i])) + { + cupsdAddAlias(ServerAlias, host->h_aliases[i]); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", + host->h_aliases[i]); + } + } + } + } + + /* + * Make sure we have the base hostname added as an alias, too! + */ + + if ((slash = strchr(temp, '.')) != NULL) + { + *slash = '\0'; + cupsdAddAlias(ServerAlias, temp); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added auto ServerAlias %s", temp); + } + } + + for (slash = ServerName; isdigit(*slash & 255) || *slash == '.'; slash ++); + + ServerNameIsIP = !*slash; + + /* + * Make sure ServerAdmin is initialized... + */ + + if (!ServerAdmin) + cupsdSetStringf(&ServerAdmin, "root@%s", ServerName); + + /* + * Use the default system group if none was supplied in cupsd.conf... + */ + + if (NumSystemGroups == 0) + { + if (!parse_groups(CUPS_DEFAULT_SYSTEM_GROUPS)) + { + /* + * Find the group associated with GID 0... + */ + + group = getgrgid(0); + endgrent(); + + if (group != NULL) + cupsdSetString(&SystemGroups[0], group->gr_name); + else + cupsdSetString(&SystemGroups[0], "unknown"); + + SystemGroupIDs[0] = 0; + NumSystemGroups = 1; + } + } + + /* + * Get the access control list for browsing... + */ + + BrowseACL = cupsdFindLocation("CUPS_INTERNAL_BROWSE_ACL"); + + /* + * Open the system log for cupsd if necessary... + */ + +#ifdef HAVE_VSYSLOG + if (!strcmp(AccessLog, "syslog") || + !strcmp(ErrorLog, "syslog") || + !strcmp(PageLog, "syslog")) + openlog("cupsd", LOG_PID | LOG_NOWAIT | LOG_NDELAY, LOG_LPR); +#endif /* HAVE_VSYSLOG */ + + /* + * Make sure each of the log files exists and gets rotated as necessary... + */ + + if (strcmp(AccessLog, "syslog")) + cupsdCheckLogFile(&AccessFile, AccessLog); + + if (strcmp(ErrorLog, "syslog")) + cupsdCheckLogFile(&ErrorFile, ErrorLog); + + if (strcmp(PageLog, "syslog")) + cupsdCheckLogFile(&PageFile, PageLog); + + /* + * Log the configuration file that was used... + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Loaded configuration file \"%s\"", + ConfigurationFile); + + /* + * Validate the Group and SystemGroup settings - they cannot be the same, + * otherwise the CGI programs will be able to authenticate as root without + * a password! + */ + + if (!RunUser) + { + for (i = 0; i < NumSystemGroups; i ++) + if (Group == SystemGroupIDs[i]) + break; + + if (i < NumSystemGroups) + { + /* + * Log the error and reset the group to a safe value... + */ + + cupsdLogMessage(CUPSD_LOG_NOTICE, + "Group and SystemGroup cannot use the same groups."); + cupsdLogMessage(CUPSD_LOG_INFO, "Resetting Group to \"nobody\"..."); + + group = getgrnam("nobody"); + endgrent(); + + if (group != NULL) + Group = group->gr_gid; + else + { + /* + * Use the (historical) NFS nobody group ID (-2 as a 16-bit twos- + * complement number...) + */ + + Group = 65534; + } + } + } + + /* + * Check that we have at least one listen/port line; if not, report this + * as an error and exit! + */ + + if (cupsArrayCount(Listeners) == 0) + { + /* + * No listeners! + */ + + cupsdLogMessage(CUPSD_LOG_EMERG, + "No valid Listen or Port lines were found in the " + "configuration file."); + + /* + * Commit suicide... + */ + + cupsdEndProcess(getpid(), 0); + } + + /* + * Set the default locale using the language and charset... + */ + + cupsdSetStringf(&DefaultLocale, "%s.UTF-8", DefaultLanguage); + + /* + * Update all relative filenames to include the full path from ServerRoot... + */ + + if (DocumentRoot[0] != '/') + cupsdSetStringf(&DocumentRoot, "%s/%s", ServerRoot, DocumentRoot); + + if (RequestRoot[0] != '/') + cupsdSetStringf(&RequestRoot, "%s/%s", ServerRoot, RequestRoot); + + if (ServerBin[0] != '/') + cupsdSetStringf(&ServerBin, "%s/%s", ServerRoot, ServerBin); + + if (StateDir[0] != '/') + cupsdSetStringf(&StateDir, "%s/%s", ServerRoot, StateDir); + + if (CacheDir[0] != '/') + cupsdSetStringf(&CacheDir, "%s/%s", ServerRoot, CacheDir); + +#ifdef HAVE_SSL + if (ServerCertificate[0] != '/') + cupsdSetStringf(&ServerCertificate, "%s/%s", ServerRoot, ServerCertificate); + + if (!strncmp(ServerRoot, ServerCertificate, strlen(ServerRoot)) && + cupsdCheckPermissions(ServerCertificate, NULL, 0600, RunUser, Group, + 0, 0) < 0 && + (FatalErrors & CUPSD_FATAL_PERMISSIONS)) + return (0); + +# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS) + if (ServerKey[0] != '/') + cupsdSetStringf(&ServerKey, "%s/%s", ServerRoot, ServerKey); + + if (!strncmp(ServerRoot, ServerKey, strlen(ServerRoot)) && + cupsdCheckPermissions(ServerKey, NULL, 0600, RunUser, Group, 0, 0) < 0 && + (FatalErrors & CUPSD_FATAL_PERMISSIONS)) + return (0); +# endif /* HAVE_LIBSSL || HAVE_GNUTLS */ +#endif /* HAVE_SSL */ + + /* + * Make sure that directories and config files are owned and + * writable by the user and group in the cupsd.conf file... + */ + + snprintf(temp, sizeof(temp), "%s/rss", CacheDir); + + if ((cupsdCheckPermissions(RequestRoot, NULL, 0710, RunUser, + Group, 1, 1) < 0 || + cupsdCheckPermissions(CacheDir, NULL, 0775, RunUser, + Group, 1, 1) < 0 || + cupsdCheckPermissions(temp, NULL, 0775, RunUser, + Group, 1, 1) < 0 || + cupsdCheckPermissions(StateDir, NULL, 0755, RunUser, + Group, 1, 1) < 0 || + cupsdCheckPermissions(StateDir, "certs", RunUser ? 0711 : 0511, User, + SystemGroupIDs[0], 1, 1) < 0 || + cupsdCheckPermissions(ServerRoot, NULL, 0755, RunUser, + Group, 1, 0) < 0 || + cupsdCheckPermissions(ServerRoot, "ppd", 0755, RunUser, + Group, 1, 1) < 0 || + cupsdCheckPermissions(ServerRoot, "ssl", 0700, RunUser, + Group, 1, 0) < 0 || + /* Never alter permissions of central conffile + cupsdCheckPermissions(ServerRoot, "cupsd.conf", ConfigFilePerm, RunUser, + Group, 0, 0) < 0 || + */ + cupsdCheckPermissions(ServerRoot, "classes.conf", 0600, RunUser, + Group, 0, 0) < 0 || + cupsdCheckPermissions(ServerRoot, "printers.conf", 0600, RunUser, + Group, 0, 0) < 0 || + cupsdCheckPermissions(ServerRoot, "passwd.md5", 0600, User, + Group, 0, 0) < 0) && + (FatalErrors & CUPSD_FATAL_PERMISSIONS)) + return (0); + + /* + * Update TempDir to the default if it hasn't been set already... + */ + + if (!TempDir) + { +#ifdef __APPLE__ + if ((tmpdir = getenv("TMPDIR")) != NULL && + strncmp(tmpdir, "/private/tmp", 12)) +#else + if ((tmpdir = getenv("TMPDIR")) != NULL) +#endif /* __APPLE__ */ + { + /* + * TMPDIR is defined, see if it is OK for us to use... + */ + + if (stat(tmpdir, &tmpinfo)) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to access TMPDIR (%s): %s", + tmpdir, strerror(errno)); + else if (!S_ISDIR(tmpinfo.st_mode)) + cupsdLogMessage(CUPSD_LOG_ERROR, "TMPDIR (%s) is not a directory.", + tmpdir); + else if ((tmpinfo.st_uid != User || !(tmpinfo.st_mode & S_IWUSR)) && + (tmpinfo.st_gid != Group || !(tmpinfo.st_mode & S_IWGRP)) && + !(tmpinfo.st_mode & S_IWOTH)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "TMPDIR (%s) has the wrong permissions.", tmpdir); + else + cupsdSetString(&TempDir, tmpdir); + } + + if (!TempDir) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Using default TempDir of %s/tmp...", + RequestRoot); + cupsdSetStringf(&TempDir, "%s/tmp", RequestRoot); + } + } + + /* + * Make sure the temporary directory has the right permissions... + */ + + if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot)) || + access(TempDir, 0)) + { + /* + * Update ownership and permissions if the CUPS temp directory + * is under the spool directory or does not exist... + */ + + if (cupsdCheckPermissions(TempDir, NULL, 01770, RunUser, Group, 1, 1) < 0 && + (FatalErrors & CUPSD_FATAL_PERMISSIONS)) + return (0); + } + + /* + * Update environment variables... + */ + + cupsdUpdateEnv(); + + /* + * Update default paper size setting as needed... + */ + + if (!DefaultPaperSize) + { +#ifdef HAVE_LIBPAPER + char *paper_result; /* Paper size name from libpaper */ + + if ((paper_result = systempapername()) != NULL) + cupsdSetString(&DefaultPaperSize, paper_result); + else +#endif /* HAVE_LIBPAPER */ + if (!DefaultLanguage || + !_cups_strcasecmp(DefaultLanguage, "C") || + !_cups_strcasecmp(DefaultLanguage, "POSIX") || + !_cups_strcasecmp(DefaultLanguage, "en") || + !_cups_strncasecmp(DefaultLanguage, "en.", 3) || + !_cups_strncasecmp(DefaultLanguage, "en_US", 5) || + !_cups_strncasecmp(DefaultLanguage, "en_CA", 5) || + !_cups_strncasecmp(DefaultLanguage, "fr_CA", 5)) + { + /* + * These are the only locales that will default to "letter" size... + */ + + cupsdSetString(&DefaultPaperSize, "Letter"); + } + else + cupsdSetString(&DefaultPaperSize, "A4"); + } + + /* + * Update classification setting as needed... + */ + + if (Classification && !_cups_strcasecmp(Classification, "none")) + cupsdClearString(&Classification); + + if (Classification) + cupsdLogMessage(CUPSD_LOG_INFO, "Security set to \"%s\"", Classification); + + /* + * Check the MaxClients setting, and then allocate memory for it... + */ + + if (MaxClients > (MaxFDs / 3) || MaxClients <= 0) + { + if (MaxClients > 0) + cupsdLogMessage(CUPSD_LOG_INFO, + "MaxClients limited to 1/3 (%d) of the file descriptor " + "limit (%d)...", + MaxFDs / 3, MaxFDs); + + MaxClients = MaxFDs / 3; + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Configured for up to %d clients.", + MaxClients); + + /* + * Check the MaxActiveJobs setting; limit to 1/3 the available + * file descriptors, since we need a pipe for each job... + */ + + if (MaxActiveJobs > (MaxFDs / 3)) + MaxActiveJobs = MaxFDs / 3; + + /* + * Update the MaxClientsPerHost value, as needed... + */ + + if (MaxClientsPerHost <= 0) + MaxClientsPerHost = MaxClients; + + if (MaxClientsPerHost > MaxClients) + MaxClientsPerHost = MaxClients; + + cupsdLogMessage(CUPSD_LOG_INFO, + "Allowing up to %d client connections per host.", + MaxClientsPerHost); + + /* + * Make sure that BrowseTimeout is at least twice the interval... + */ + + if (BrowseTimeout < (2 * BrowseInterval) || BrowseTimeout <= 0) + { + cupsdLogMessage(CUPSD_LOG_ALERT, "Invalid BrowseTimeout value %d.", + BrowseTimeout); + + if (BrowseInterval) + BrowseTimeout = BrowseInterval * 2; + else + BrowseTimeout = DEFAULT_TIMEOUT; + + cupsdLogMessage(CUPSD_LOG_ALERT, "Reset BrowseTimeout to %d.", + BrowseTimeout); + } + + /* + * Update the default policy, as needed... + */ + + if (DefaultPolicy) + DefaultPolicyPtr = cupsdFindPolicy(DefaultPolicy); + else + DefaultPolicyPtr = NULL; + + if (!DefaultPolicyPtr) + { + cupsd_location_t *po; /* New policy operation */ + + + if (DefaultPolicy) + cupsdLogMessage(CUPSD_LOG_ERROR, "Default policy \"%s\" not found.", + DefaultPolicy); + + cupsdSetString(&DefaultPolicy, "default"); + + if ((DefaultPolicyPtr = cupsdFindPolicy("default")) != NULL) + cupsdLogMessage(CUPSD_LOG_INFO, + "Using policy \"default\" as the default."); + else + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Creating CUPS default administrative policy:"); + + DefaultPolicyPtr = p = cupsdAddPolicy("default"); + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + + cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateAccess default"); + cupsdAddString(&(p->job_access), "@OWNER"); + cupsdAddString(&(p->job_access), "@SYSTEM"); + + cupsdLogMessage(CUPSD_LOG_INFO, "JobPrivateValues default"); + cupsdAddString(&(p->job_attrs), "job-name"); + cupsdAddString(&(p->job_attrs), "job-originating-host-name"); + cupsdAddString(&(p->job_attrs), "job-originating-user-name"); + + cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateAccess default"); + cupsdAddString(&(p->sub_access), "@OWNER"); + cupsdAddString(&(p->sub_access), "@SYSTEM"); + + cupsdLogMessage(CUPSD_LOG_INFO, "SubscriptionPrivateValues default"); + cupsdAddString(&(p->job_attrs), "notify-events"); + cupsdAddString(&(p->job_attrs), "notify-pull-method"); + cupsdAddString(&(p->job_attrs), "notify-recipient-uri"); + cupsdAddString(&(p->job_attrs), "notify-subscriber-user-name"); + cupsdAddString(&(p->job_attrs), "notify-user-data"); + + cupsdLogMessage(CUPSD_LOG_INFO, + ""); + cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); + + po = cupsdAddPolicyOp(p, NULL, IPP_CREATE_JOB); + po->order_type = CUPSD_AUTH_ALLOW; + + cupsdAddPolicyOp(p, po, IPP_PRINT_JOB); + cupsdAddPolicyOp(p, po, IPP_PRINT_URI); + cupsdAddPolicyOp(p, po, IPP_VALIDATE_JOB); + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + + cupsdLogMessage(CUPSD_LOG_INFO, + ""); + cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); + + po = cupsdAddPolicyOp(p, NULL, IPP_SEND_DOCUMENT); + po->order_type = CUPSD_AUTH_ALLOW; + po->level = CUPSD_AUTH_USER; + + cupsdAddName(po, "@OWNER"); + cupsdAddName(po, "@SYSTEM"); + cupsdLogMessage(CUPSD_LOG_INFO, "Require user @OWNER @SYSTEM"); + + cupsdAddPolicyOp(p, po, IPP_SEND_URI); + cupsdAddPolicyOp(p, po, IPP_CANCEL_JOB); + cupsdAddPolicyOp(p, po, IPP_HOLD_JOB); + cupsdAddPolicyOp(p, po, IPP_RELEASE_JOB); + cupsdAddPolicyOp(p, po, IPP_RESTART_JOB); + cupsdAddPolicyOp(p, po, IPP_PURGE_JOBS); + cupsdAddPolicyOp(p, po, IPP_SET_JOB_ATTRIBUTES); + cupsdAddPolicyOp(p, po, IPP_CREATE_JOB_SUBSCRIPTION); + cupsdAddPolicyOp(p, po, IPP_RENEW_SUBSCRIPTION); + cupsdAddPolicyOp(p, po, IPP_CANCEL_SUBSCRIPTION); + cupsdAddPolicyOp(p, po, IPP_GET_NOTIFICATIONS); + cupsdAddPolicyOp(p, po, IPP_REPROCESS_JOB); + cupsdAddPolicyOp(p, po, IPP_CANCEL_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_SUSPEND_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_RESUME_JOB); + cupsdAddPolicyOp(p, po, IPP_CANCEL_MY_JOBS); + cupsdAddPolicyOp(p, po, IPP_CLOSE_JOB); + cupsdAddPolicyOp(p, po, CUPS_MOVE_JOB); + cupsdAddPolicyOp(p, po, CUPS_AUTHENTICATE_JOB); + cupsdAddPolicyOp(p, po, CUPS_GET_DOCUMENT); + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + + cupsdLogMessage(CUPSD_LOG_INFO, + ""); + cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); + cupsdLogMessage(CUPSD_LOG_INFO, "AuthType Default"); + + po = cupsdAddPolicyOp(p, NULL, IPP_PAUSE_PRINTER); + po->order_type = CUPSD_AUTH_ALLOW; + po->type = CUPSD_AUTH_DEFAULT; + po->level = CUPSD_AUTH_USER; + + cupsdAddName(po, "@SYSTEM"); + cupsdLogMessage(CUPSD_LOG_INFO, "Require user @SYSTEM"); + + cupsdAddPolicyOp(p, po, IPP_RESUME_PRINTER); + cupsdAddPolicyOp(p, po, IPP_SET_PRINTER_ATTRIBUTES); + cupsdAddPolicyOp(p, po, IPP_ENABLE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_DISABLE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_PAUSE_PRINTER_AFTER_CURRENT_JOB); + cupsdAddPolicyOp(p, po, IPP_HOLD_NEW_JOBS); + cupsdAddPolicyOp(p, po, IPP_RELEASE_HELD_NEW_JOBS); + cupsdAddPolicyOp(p, po, IPP_DEACTIVATE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_ACTIVATE_PRINTER); + cupsdAddPolicyOp(p, po, IPP_RESTART_PRINTER); + cupsdAddPolicyOp(p, po, IPP_SHUTDOWN_PRINTER); + cupsdAddPolicyOp(p, po, IPP_STARTUP_PRINTER); + cupsdAddPolicyOp(p, po, IPP_PROMOTE_JOB); + cupsdAddPolicyOp(p, po, IPP_SCHEDULE_JOB_AFTER); + cupsdAddPolicyOp(p, po, IPP_CANCEL_JOBS); + cupsdAddPolicyOp(p, po, CUPS_ADD_PRINTER); + cupsdAddPolicyOp(p, po, CUPS_DELETE_PRINTER); + cupsdAddPolicyOp(p, po, CUPS_ADD_CLASS); + cupsdAddPolicyOp(p, po, CUPS_DELETE_CLASS); + cupsdAddPolicyOp(p, po, CUPS_ACCEPT_JOBS); + cupsdAddPolicyOp(p, po, CUPS_REJECT_JOBS); + cupsdAddPolicyOp(p, po, CUPS_SET_DEFAULT); + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + cupsdLogMessage(CUPSD_LOG_INFO, "Order Deny,Allow"); + + po = cupsdAddPolicyOp(p, NULL, IPP_ANY_OPERATION); + po->order_type = CUPSD_AUTH_ALLOW; + + cupsdLogMessage(CUPSD_LOG_INFO, ""); + cupsdLogMessage(CUPSD_LOG_INFO, ""); + } + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: NumPolicies=%d", + cupsArrayCount(Policies)); + for (i = 0, p = (cupsd_policy_t *)cupsArrayFirst(Policies); + p; + i ++, p = (cupsd_policy_t *)cupsArrayNext(Policies)) + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdReadConfiguration: Policies[%d]=\"%s\"", i, p->name); + + /* + * If we are doing a full reload or the server root has changed, flush + * the jobs, printers, etc. and start from scratch... + */ + + if (NeedReload == RELOAD_ALL || + old_remote_port != RemotePort || + !old_serverroot || !ServerRoot || strcmp(old_serverroot, ServerRoot) || + !old_requestroot || !RequestRoot || strcmp(old_requestroot, RequestRoot)) + { + mime_type_t *type; /* Current type */ + char mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE]; + /* MIME type name */ + + + cupsdLogMessage(CUPSD_LOG_INFO, "Full reload is required."); + + /* + * Free all memory... + */ + + cupsdDeleteAllSubscriptions(); + cupsdFreeAllJobs(); + cupsdDeleteAllPrinters(); + + DefaultPrinter = NULL; + + if (MimeDatabase != NULL) + mimeDelete(MimeDatabase); + + if (NumMimeTypes) + { + for (i = 0; i < NumMimeTypes; i ++) + _cupsStrFree(MimeTypes[i]); + + free(MimeTypes); + } + + /* + * Read the MIME type and conversion database... + */ + + snprintf(temp, sizeof(temp), "%s/filter", ServerBin); + snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir); + + MimeDatabase = mimeNew(); + mimeSetErrorCallback(MimeDatabase, mime_error_cb, NULL); + + MimeDatabase = mimeLoadTypes(MimeDatabase, mimedir); + MimeDatabase = mimeLoadTypes(MimeDatabase, ServerRoot); + MimeDatabase = mimeLoadFilters(MimeDatabase, mimedir, temp); + MimeDatabase = mimeLoadFilters(MimeDatabase, ServerRoot, temp); + + if (!MimeDatabase) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "Unable to load MIME database from \"%s\" or \"%s\".", + mimedir, ServerRoot); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + + cupsdLogMessage(CUPSD_LOG_INFO, + "Loaded MIME database from \"%s\" and \"%s\": %d types, " + "%d filters...", mimedir, ServerRoot, + mimeNumTypes(MimeDatabase), mimeNumFilters(MimeDatabase)); + + /* + * Create a list of MIME types for the document-format-supported + * attribute... + */ + + NumMimeTypes = mimeNumTypes(MimeDatabase); + if (!mimeType(MimeDatabase, "application", "octet-stream")) + NumMimeTypes ++; + + if ((MimeTypes = calloc(NumMimeTypes, sizeof(const char *))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for %d MIME types.", + NumMimeTypes); + NumMimeTypes = 0; + } + else + { + for (i = 0, type = mimeFirstType(MimeDatabase); + type; + i ++, type = mimeNextType(MimeDatabase)) + { + snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type); + + MimeTypes[i] = _cupsStrAlloc(mimetype); + } + + if (i < NumMimeTypes) + MimeTypes[i] = _cupsStrAlloc("application/octet-stream"); + } + + if (LogLevel == CUPSD_LOG_DEBUG2) + { + mime_filter_t *filter; /* Current filter */ + + + for (type = mimeFirstType(MimeDatabase); + type; + type = mimeNextType(MimeDatabase)) + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadConfiguration: type %s/%s", + type->super, type->type); + + for (filter = mimeFirstFilter(MimeDatabase); + filter; + filter = mimeNextFilter(MimeDatabase)) + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdReadConfiguration: filter %s/%s to %s/%s %d %s", + filter->src->super, filter->src->type, + filter->dst->super, filter->dst->type, + filter->cost, filter->filter); + } + + /* + * Load banners... + */ + + snprintf(temp, sizeof(temp), "%s/banners", DataDir); + cupsdLoadBanners(temp); + + /* + * Load printers and classes... + */ + + cupsdLoadAllPrinters(); + cupsdLoadAllClasses(); + cupsdLoadRemoteCache(); + + cupsdCreateCommonData(); + + /* + * Update the printcap file as needed... + */ + + if (Printcap && *Printcap && access(Printcap, 0)) + cupsdWritePrintcap(); + + /* + * Load queued jobs... + */ + + cupsdLoadAllJobs(); + + /* + * Load subscriptions... + */ + + cupsdLoadAllSubscriptions(); + + cupsdLogMessage(CUPSD_LOG_INFO, "Full reload complete."); + } + else + { + /* + * Not a full reload, so recreate the common printer attributes... + */ + + cupsdCreateCommonData(); + + /* + * Update all printers as needed... + */ + + cupsdUpdatePrinters(); + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + + cupsdLogMessage(CUPSD_LOG_INFO, "Partial reload complete."); + } + + /* + * Reset the reload state... + */ + + NeedReload = RELOAD_NONE; + + cupsdClearString(&old_serverroot); + cupsdClearString(&old_requestroot); + + return (1); +} + + +/* + * 'get_address()' - Get an address + port number from a line. + */ + +static http_addrlist_t * /* O - Pointer to list if address good, NULL if bad */ +get_address(const char *value, /* I - Value string */ + int defport) /* I - Default port */ +{ + char buffer[1024], /* Hostname + port number buffer */ + defpname[255], /* Default port name */ + *hostname, /* Hostname or IP */ + *portname; /* Port number or name */ + http_addrlist_t *addrlist; /* Address list */ + + + /* + * Check for an empty value... + */ + + if (!*value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad (empty) address."); + return (NULL); + } + + /* + * Grab a hostname and port number; if there is no colon and the port name + * is only digits, then we have a port number by itself... + */ + + strlcpy(buffer, value, sizeof(buffer)); + + if ((portname = strrchr(buffer, ':')) != NULL && !strchr(portname, ']')) + { + *portname++ = '\0'; + hostname = buffer; + } + else + { + for (portname = buffer; isdigit(*portname & 255); portname ++); + + if (*portname) + { + /* + * Use the default port... + */ + + sprintf(defpname, "%d", defport); + portname = defpname; + hostname = buffer; + } + else + { + /* + * The buffer contains just a port number... + */ + + portname = buffer; + hostname = NULL; + } + } + + if (hostname && !strcmp(hostname, "*")) + hostname = NULL; + + /* + * Now lookup the address using httpAddrGetList()... + */ + + if ((addrlist = httpAddrGetList(hostname, AF_UNSPEC, portname)) == NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, "Hostname lookup for \"%s\" failed.", + hostname ? hostname : "(nil)"); + + return (addrlist); +} + + +/* + * 'get_addr_and_mask()' - Get an IP address and netmask. + */ + +static int /* O - 1 on success, 0 on failure */ +get_addr_and_mask(const char *value, /* I - String from config file */ + unsigned *ip, /* O - Address value */ + unsigned *mask) /* O - Mask value */ +{ + int i, j, /* Looping vars */ + family, /* Address family */ + ipcount; /* Count of fields in address */ + unsigned ipval; /* Value */ + const char *maskval, /* Pointer to start of mask value */ + *ptr, /* Pointer into value */ + *ptr2; /* ... */ + + + /* + * Get the address... + */ + + ip[0] = ip[1] = ip[2] = ip[3] = 0x00000000; + mask[0] = mask[1] = mask[2] = mask[3] = 0xffffffff; + + if ((maskval = strchr(value, '/')) != NULL) + maskval ++; + else + maskval = value + strlen(value); + +#ifdef AF_INET6 + /* + * Check for an IPv6 address... + */ + + if (*value == '[') + { + /* + * Parse hexadecimal IPv6/IPv4 address... + */ + + family = AF_INET6; + + for (i = 0, ptr = value + 1; *ptr && i < 8; i ++) + { + if (*ptr == ']') + break; + else if (!strncmp(ptr, "::", 2)) + { + for (ptr2 = strchr(ptr + 2, ':'), j = 0; + ptr2; + ptr2 = strchr(ptr2 + 1, ':'), j ++); + + i = 6 - j; + ptr += 2; + } + else if (isdigit(*ptr & 255) && strchr(ptr + 1, '.') && i >= 6) + { + /* + * Read IPv4 dotted quad... + */ + + unsigned val[4] = { 0, 0, 0, 0 }; + /* IPv4 address values */ + + ipcount = sscanf(ptr, "%u.%u.%u.%u", val + 0, val + 1, val + 2, + val + 3); + + /* + * Range check the IP numbers... + */ + + for (i = 0; i < ipcount; i ++) + if (val[i] > 255) + return (0); + + /* + * Merge everything into a 32-bit IPv4 address in ip[3]... + */ + + ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3]; + + if (ipcount < 4) + mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff; + + /* + * If the leading words are all 0's then this is an IPv4 address... + */ + + if (!val[0] && !val[1] && !val[2]) + family = AF_INET; + + while (isdigit(*ptr & 255) || *ptr == '.') + ptr ++; + break; + } + else if (isxdigit(*ptr & 255)) + { + ipval = strtoul(ptr, (char **)&ptr, 16); + + if (*ptr == ':' && ptr[1] != ':') + ptr ++; + + if (ipval > 0xffff) + return (0); + + if (i & 1) + ip[i / 2] |= ipval; + else + ip[i / 2] |= ipval << 16; + } + else + return (0); + } + + if (*ptr != ']') + return (0); + + ptr ++; + + if (*ptr && *ptr != '/') + return (0); + } + else +#endif /* AF_INET6 */ + { + /* + * Parse dotted-decimal IPv4 address... + */ + + unsigned val[4] = { 0, 0, 0, 0 }; /* IPv4 address values */ + + + family = AF_INET; + ipcount = sscanf(value, "%u.%u.%u.%u", val + 0, val + 1, val + 2, val + 3); + + /* + * Range check the IP numbers... + */ + + for (i = 0; i < ipcount; i ++) + if (val[i] > 255) + return (0); + + /* + * Merge everything into a 32-bit IPv4 address in ip[3]... + */ + + ip[3] = (((((val[0] << 8) | val[1]) << 8) | val[2]) << 8) | val[3]; + + if (ipcount < 4) + mask[3] = (0xffffffff << (32 - 8 * ipcount)) & 0xffffffff; + } + + if (*maskval) + { + /* + * Get the netmask value(s)... + */ + + memset(mask, 0, sizeof(unsigned) * 4); + + if (strchr(maskval, '.')) + { + /* + * Get dotted-decimal mask... + */ + + if (family != AF_INET) + return (0); + + if (sscanf(maskval, "%u.%u.%u.%u", mask + 0, mask + 1, mask + 2, + mask + 3) != 4) + return (0); + + mask[3] |= ((((mask[0] << 8) | mask[1]) << 8) | mask[2]) << 8; + mask[0] = mask[1] = mask[2] = 0; + } + else + { + /* + * Get address/bits format... + */ + + i = atoi(maskval); + +#ifdef AF_INET6 + if (family == AF_INET6) + { + if (i > 128) + return (0); + + i = 128 - i; + + if (i <= 96) + mask[0] = 0xffffffff; + else + mask[0] = (0xffffffff << (i - 96)) & 0xffffffff; + + if (i <= 64) + mask[1] = 0xffffffff; + else if (i >= 96) + mask[1] = 0; + else + mask[1] = (0xffffffff << (i - 64)) & 0xffffffff; + + if (i <= 32) + mask[2] = 0xffffffff; + else if (i >= 64) + mask[2] = 0; + else + mask[2] = (0xffffffff << (i - 32)) & 0xffffffff; + + if (i == 0) + mask[3] = 0xffffffff; + else if (i >= 32) + mask[3] = 0; + else + mask[3] = (0xffffffff << i) & 0xffffffff; + } + else +#endif /* AF_INET6 */ + { + if (i > 32) + return (0); + + mask[0] = 0xffffffff; + mask[1] = 0xffffffff; + mask[2] = 0xffffffff; + + if (i < 32) + mask[3] = (0xffffffff << (32 - i)) & 0xffffffff; + else + mask[3] = 0xffffffff; + } + } + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_addr_and_mask(value=\"%s\", " + "ip=[%08x:%08x:%08x:%08x], mask=[%08x:%08x:%08x:%08x])", + value, ip[0], ip[1], ip[2], ip[3], mask[0], mask[1], mask[2], + mask[3]); + + /* + * Check for a valid netmask; no fallback like in CUPS 1.1.x! + */ + + if ((ip[0] & ~mask[0]) != 0 || + (ip[1] & ~mask[1]) != 0 || + (ip[2] & ~mask[2]) != 0 || + (ip[3] & ~mask[3]) != 0) + return (0); + + return (1); +} + + +/* + * 'mime_error_cb()' - Log a MIME error. + */ + +static void +mime_error_cb(void *ctx, /* I - Context pointer (unused) */ + const char *message) /* I - Message */ +{ + (void)ctx; + + cupsdLogMessage(CUPSD_LOG_ERROR, "%s", message); +} + + +/* + * 'parse_aaa()' - Parse authentication, authorization, and access control lines. + */ + +static int /* O - 1 on success, 0 on failure */ +parse_aaa(cupsd_location_t *loc, /* I - Location */ + char *line, /* I - Line from file */ + char *value, /* I - Start of value data */ + int linenum) /* I - Current line number */ +{ + char *valptr; /* Pointer into value */ + unsigned ip[4], /* IP address components */ + mask[4]; /* IP netmask components */ + + + if (!_cups_strcasecmp(line, "Encryption")) + { + /* + * "Encryption xxx" - set required encryption level... + */ + + if (!_cups_strcasecmp(value, "never")) + loc->encryption = HTTP_ENCRYPT_NEVER; + else if (!_cups_strcasecmp(value, "always")) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Encryption value \"%s\" on line %d is invalid in this " + "context. Using \"required\" instead.", value, linenum); + + loc->encryption = HTTP_ENCRYPT_REQUIRED; + } + else if (!_cups_strcasecmp(value, "required")) + loc->encryption = HTTP_ENCRYPT_REQUIRED; + else if (!_cups_strcasecmp(value, "ifrequested")) + loc->encryption = HTTP_ENCRYPT_IF_REQUESTED; + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown Encryption value %s on line %d.", value, linenum); + return (0); + } + } + else if (!_cups_strcasecmp(line, "Order")) + { + /* + * "Order Deny,Allow" or "Order Allow,Deny"... + */ + + if (!_cups_strncasecmp(value, "deny", 4)) + loc->order_type = CUPSD_AUTH_ALLOW; + else if (!_cups_strncasecmp(value, "allow", 5)) + loc->order_type = CUPSD_AUTH_DENY; + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown Order value %s on line %d.", + value, linenum); + return (0); + } + } + else if (!_cups_strcasecmp(line, "Allow") || !_cups_strcasecmp(line, "Deny")) + { + /* + * Allow [From] host/ip... + * Deny [From] host/ip... + */ + + while (*value) + { + if (!_cups_strncasecmp(value, "from", 4)) + { + /* + * Strip leading "from"... + */ + + value += 4; + + while (_cups_isspace(*value)) + value ++; + + if (!*value) + break; + } + + /* + * Find the end of the value... + */ + + for (valptr = value; *valptr && !_cups_isspace(*valptr); valptr ++); + + while (_cups_isspace(*valptr)) + *valptr++ = '\0'; + + /* + * Figure out what form the allow/deny address takes: + * + * All + * None + * *.domain.com + * .domain.com + * host.domain.com + * nnn.* + * nnn.nnn.* + * nnn.nnn.nnn.* + * nnn.nnn.nnn.nnn + * nnn.nnn.nnn.nnn/mm + * nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm + */ + + if (!_cups_strcasecmp(value, "all")) + { + /* + * All hosts... + */ + + if (!_cups_strcasecmp(line, "Allow")) + cupsdAddIPMask(&(loc->allow), zeros, zeros); + else + cupsdAddIPMask(&(loc->deny), zeros, zeros); + } + else if (!_cups_strcasecmp(value, "none")) + { + /* + * No hosts... + */ + + if (!_cups_strcasecmp(line, "Allow")) + cupsdAddIPMask(&(loc->allow), ones, zeros); + else + cupsdAddIPMask(&(loc->deny), ones, zeros); + } +#ifdef AF_INET6 + else if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else + else if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ + { + /* + * Host or domain name... + */ + + if (value[0] == '*') + value ++; + + if (!_cups_strcasecmp(line, "Allow")) + cupsdAddNameMask(&(loc->allow), value); + else + cupsdAddNameMask(&(loc->deny), value); + } + else + { + /* + * One of many IP address forms... + */ + + if (!get_addr_and_mask(value, ip, mask)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d.", + value, linenum); + return (0); + } + + if (!_cups_strcasecmp(line, "Allow")) + cupsdAddIPMask(&(loc->allow), ip, mask); + else + cupsdAddIPMask(&(loc->deny), ip, mask); + } + + /* + * Advance to next value... + */ + + value = valptr; + } + } + else if (!_cups_strcasecmp(line, "AuthType")) + { + /* + * AuthType {none,basic,digest,basicdigest,negotiate,default} + */ + + if (!_cups_strcasecmp(value, "none")) + { + loc->type = CUPSD_AUTH_NONE; + loc->level = CUPSD_AUTH_ANON; + } + else if (!_cups_strcasecmp(value, "basic")) + { + loc->type = CUPSD_AUTH_BASIC; + + if (loc->level == CUPSD_AUTH_ANON) + loc->level = CUPSD_AUTH_USER; + } + else if (!_cups_strcasecmp(value, "digest")) + { + loc->type = CUPSD_AUTH_DIGEST; + + if (loc->level == CUPSD_AUTH_ANON) + loc->level = CUPSD_AUTH_USER; + } + else if (!_cups_strcasecmp(value, "basicdigest")) + { + loc->type = CUPSD_AUTH_BASICDIGEST; + + if (loc->level == CUPSD_AUTH_ANON) + loc->level = CUPSD_AUTH_USER; + } + else if (!_cups_strcasecmp(value, "default")) + { + loc->type = CUPSD_AUTH_DEFAULT; + + if (loc->level == CUPSD_AUTH_ANON) + loc->level = CUPSD_AUTH_USER; + } +#ifdef HAVE_GSSAPI + else if (!_cups_strcasecmp(value, "negotiate")) + { + loc->type = CUPSD_AUTH_NEGOTIATE; + + if (loc->level == CUPSD_AUTH_ANON) + loc->level = CUPSD_AUTH_USER; + } +#endif /* HAVE_GSSAPI */ + else + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown authorization type %s on line %d.", + value, linenum); + return (0); + } + } + else if (!_cups_strcasecmp(line, "AuthClass")) + { + /* + * AuthClass anonymous, user, system, group + */ + + if (!_cups_strcasecmp(value, "anonymous")) + { + loc->type = CUPSD_AUTH_NONE; + loc->level = CUPSD_AUTH_ANON; + + cupsdLogMessage(CUPSD_LOG_WARN, + "\"AuthClass %s\" is deprecated; consider removing " + "it from line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(value, "user")) + { + loc->level = CUPSD_AUTH_USER; + + cupsdLogMessage(CUPSD_LOG_WARN, + "\"AuthClass %s\" is deprecated; consider using " + "\"Require valid-user\" on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(value, "group")) + { + loc->level = CUPSD_AUTH_GROUP; + + cupsdLogMessage(CUPSD_LOG_WARN, + "\"AuthClass %s\" is deprecated; consider using " + "\"Require user @groupname\" on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(value, "system")) + { + loc->level = CUPSD_AUTH_GROUP; + + cupsdAddName(loc, "@SYSTEM"); + + cupsdLogMessage(CUPSD_LOG_WARN, + "\"AuthClass %s\" is deprecated; consider using " + "\"Require user @SYSTEM\" on line %d.", + value, linenum); + } + else + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown authorization class %s on line %d.", + value, linenum); + return (0); + } + } + else if (!_cups_strcasecmp(line, "AuthGroupName")) + { + cupsdAddName(loc, value); + + cupsdLogMessage(CUPSD_LOG_WARN, + "\"AuthGroupName %s\" directive is deprecated; consider " + "using \"Require user @%s\" on line %d.", + value, value, linenum); + } + else if (!_cups_strcasecmp(line, "Require")) + { + /* + * Apache synonym for AuthClass and AuthGroupName... + * + * Get initial word: + * + * Require valid-user + * Require group names + * Require user names + */ + + for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++); + + if (*valptr) + *valptr++ = '\0'; + + if (!_cups_strcasecmp(value, "valid-user") || + !_cups_strcasecmp(value, "user")) + loc->level = CUPSD_AUTH_USER; + else if (!_cups_strcasecmp(value, "group")) + loc->level = CUPSD_AUTH_GROUP; + else + { + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Require type %s on line %d.", + value, linenum); + return (0); + } + + /* + * Get the list of names from the line... + */ + + for (value = valptr; *value;) + { + while (_cups_isspace(*value)) + value ++; + +#ifdef HAVE_AUTHORIZATION_H + if (!strncmp(value, "@AUTHKEY(", 9)) + { + /* + * Grab "@AUTHKEY(name)" value... + */ + + for (valptr = value + 9; *valptr != ')' && *valptr; valptr ++); + + if (*valptr) + *valptr++ = '\0'; + } + else +#endif /* HAVE_AUTHORIZATION_H */ + if (*value == '\"' || *value == '\'') + { + /* + * Grab quoted name... + */ + + for (valptr = value + 1; *valptr != *value && *valptr; valptr ++); + + value ++; + } + else + { + /* + * Grab literal name. + */ + + for (valptr = value; !_cups_isspace(*valptr) && *valptr; valptr ++); + } + + if (*valptr) + *valptr++ = '\0'; + + cupsdAddName(loc, value); + + for (value = valptr; _cups_isspace(*value); value ++); + } + } + else if (!_cups_strcasecmp(line, "Satisfy")) + { + if (!_cups_strcasecmp(value, "all")) + loc->satisfy = CUPSD_AUTH_SATISFY_ALL; + else if (!_cups_strcasecmp(value, "any")) + loc->satisfy = CUPSD_AUTH_SATISFY_ANY; + else + { + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown Satisfy value %s on line %d.", + value, linenum); + return (0); + } + } + else + return (0); + + return (1); +} + + +/* + * 'parse_fatal_errors()' - Parse FatalErrors values in a string. + */ + +static int /* O - FatalErrors bits */ +parse_fatal_errors(const char *s) /* I - FatalErrors string */ +{ + int fatal; /* FatalErrors bits */ + char value[1024], /* Value string */ + *valstart, /* Pointer into value */ + *valend; /* End of value */ + + + /* + * Empty FatalErrors line yields NULL pointer... + */ + + if (!s) + return (CUPSD_FATAL_NONE); + + /* + * Loop through the value string,... + */ + + strlcpy(value, s, sizeof(value)); + + fatal = CUPSD_FATAL_NONE; + + for (valstart = value; *valstart;) + { + /* + * Get the current space/comma-delimited kind name... + */ + + for (valend = valstart; *valend; valend ++) + if (_cups_isspace(*valend) || *valend == ',') + break; + + if (*valend) + *valend++ = '\0'; + + /* + * Add the error to the bitmask... + */ + + if (!_cups_strcasecmp(valstart, "all")) + fatal = CUPSD_FATAL_ALL; + else if (!_cups_strcasecmp(valstart, "browse")) + fatal |= CUPSD_FATAL_BROWSE; + else if (!_cups_strcasecmp(valstart, "-browse")) + fatal &= ~CUPSD_FATAL_BROWSE; + else if (!_cups_strcasecmp(valstart, "config")) + fatal |= CUPSD_FATAL_CONFIG; + else if (!_cups_strcasecmp(valstart, "-config")) + fatal &= ~CUPSD_FATAL_CONFIG; + else if (!_cups_strcasecmp(valstart, "listen")) + fatal |= CUPSD_FATAL_LISTEN; + else if (!_cups_strcasecmp(valstart, "-listen")) + fatal &= ~CUPSD_FATAL_LISTEN; + else if (!_cups_strcasecmp(valstart, "log")) + fatal |= CUPSD_FATAL_LOG; + else if (!_cups_strcasecmp(valstart, "-log")) + fatal &= ~CUPSD_FATAL_LOG; + else if (!_cups_strcasecmp(valstart, "permissions")) + fatal |= CUPSD_FATAL_PERMISSIONS; + else if (!_cups_strcasecmp(valstart, "-permissions")) + fatal &= ~CUPSD_FATAL_PERMISSIONS; + else if (_cups_strcasecmp(valstart, "none")) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown FatalErrors kind \"%s\" ignored.", valstart); + + for (valstart = valend; *valstart; valstart ++) + if (!_cups_isspace(*valstart) || *valstart != ',') + break; + } + + return (fatal); +} + + +/* + * 'parse_groups()' - Parse system group names in a string. + */ + +static int /* O - 1 on success, 0 on failure */ +parse_groups(const char *s) /* I - Space-delimited groups */ +{ + int status; /* Return status */ + char value[1024], /* Value string */ + *valstart, /* Pointer into value */ + *valend, /* End of value */ + quote; /* Quote character */ + struct group *group; /* Group */ + + + /* + * Make a copy of the string and parse out the groups... + */ + + strlcpy(value, s, sizeof(value)); + + status = 1; + valstart = value; + + while (*valstart && NumSystemGroups < MAX_SYSTEM_GROUPS) + { + if (*valstart == '\'' || *valstart == '\"') + { + /* + * Scan quoted name... + */ + + quote = *valstart++; + + for (valend = valstart; *valend; valend ++) + if (*valend == quote) + break; + } + else + { + /* + * Scan space or comma-delimited name... + */ + + for (valend = valstart; *valend; valend ++) + if (_cups_isspace(*valend) || *valend == ',') + break; + } + + if (*valend) + *valend++ = '\0'; + + group = getgrnam(valstart); + if (group) + { + cupsdSetString(SystemGroups + NumSystemGroups, valstart); + SystemGroupIDs[NumSystemGroups] = group->gr_gid; + + NumSystemGroups ++; + } + else + status = 0; + + endgrent(); + + valstart = valend; + + while (*valstart == ',' || _cups_isspace(*valstart)) + valstart ++; + } + + return (status); +} + + +/* + * 'parse_protocols()' - Parse browse protocols in a string. + */ + +static int /* O - Browse protocol bits */ +parse_protocols(const char *s) /* I - Space-delimited protocols */ +{ + int protocols; /* Browse protocol bits */ + char value[1024], /* Value string */ + *valstart, /* Pointer into value */ + *valend; /* End of value */ + + + /* + * Empty protocol line yields NULL pointer... + */ + + if (!s) + return (0); + + /* + * Loop through the value string,... + */ + + strlcpy(value, s, sizeof(value)); + + protocols = 0; + + for (valstart = value; *valstart;) + { + /* + * Get the current space/comma-delimited protocol name... + */ + + for (valend = valstart; *valend; valend ++) + if (_cups_isspace(*valend) || *valend == ',') + break; + + if (*valend) + *valend++ = '\0'; + + /* + * Add the protocol to the bitmask... + */ + + if (!_cups_strcasecmp(valstart, "cups")) + protocols |= BROWSE_CUPS; + else if (!_cups_strcasecmp(valstart, "slp")) + protocols |= BROWSE_SLP; + else if (!_cups_strcasecmp(valstart, "ldap")) + protocols |= BROWSE_LDAP; + else if (!_cups_strcasecmp(valstart, "dnssd") || + !_cups_strcasecmp(valstart, "dns-sd") || + !_cups_strcasecmp(valstart, "bonjour")) + protocols |= BROWSE_DNSSD; + else if (!_cups_strcasecmp(valstart, "lpd")) + protocols |= BROWSE_LPD; + else if (!_cups_strcasecmp(valstart, "smb")) + protocols |= BROWSE_SMB; + else if (!_cups_strcasecmp(valstart, "all")) + protocols |= BROWSE_ALL; + else if (_cups_strcasecmp(valstart, "none")) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown browse protocol \"%s\" ignored.", valstart); + + for (valstart = valend; *valstart; valstart ++) + if (!_cups_isspace(*valstart) || *valstart != ',') + break; + } + + return (protocols); +} + + +/* + * 'read_configuration()' - Read a configuration file. + */ + +static int /* O - 1 on success, 0 on failure */ +read_configuration(cups_file_t *fp) /* I - File to read from */ +{ + int i; /* Looping var */ + int linenum; /* Current line number */ + char line[HTTP_MAX_BUFFER], + /* Line from file */ + temp[HTTP_MAX_BUFFER], + /* Temporary buffer for value */ + *ptr, /* Pointer into line/temp */ + *value, /* Pointer to value */ + *valueptr; /* Pointer into value */ + int valuelen; /* Length of value */ + cupsd_var_t const *var; /* Current variable */ + http_addrlist_t *addrlist, /* Address list */ + *addr; /* Current address */ + unsigned ip[4], /* Address value */ + mask[4]; /* Netmask value */ + cupsd_dirsvc_relay_t *relay; /* Relay data */ + cupsd_dirsvc_poll_t *pollp; /* Polling data */ + cupsd_location_t *location; /* Browse location */ + cups_file_t *incfile; /* Include file */ + char incname[1024]; /* Include filename */ + struct group *group; /* Group */ + + + /* + * Loop through each line in the file... + */ + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, "Include") && value) + { + /* + * Include filename + */ + + if (value[0] == '/') + strlcpy(incname, value, sizeof(incname)); + else + snprintf(incname, sizeof(incname), "%s/%s", ServerRoot, value); + + if ((incfile = cupsFileOpen(incname, "rb")) == NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to include config file \"%s\" - %s", + incname, strerror(errno)); + else + { + read_configuration(incfile); + cupsFileClose(incfile); + } + } + else if (!_cups_strcasecmp(line, " + */ + + linenum = read_location(fp, value, linenum); + if (linenum == 0) + return (0); + } + else if (!_cups_strcasecmp(line, " + */ + + linenum = read_policy(fp, value, linenum); + if (linenum == 0) + return (0); + } + else if (!_cups_strcasecmp(line, "FatalErrors")) + FatalErrors = parse_fatal_errors(value); + else if (!_cups_strcasecmp(line, "FaxRetryInterval") && value) + { + JobRetryInterval = atoi(value); + cupsdLogMessage(CUPSD_LOG_WARN, + "FaxRetryInterval is deprecated; use " + "JobRetryInterval on line %d.", linenum); + } + else if (!_cups_strcasecmp(line, "FaxRetryLimit") && value) + { + JobRetryLimit = atoi(value); + cupsdLogMessage(CUPSD_LOG_WARN, + "FaxRetryLimit is deprecated; use " + "JobRetryLimit on line %d.", linenum); + } + else if ((!_cups_strcasecmp(line, "Port") || !_cups_strcasecmp(line, "Listen") +#ifdef HAVE_SSL + || !_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen") +#endif /* HAVE_SSL */ + ) && value) + { + /* + * Add listening address(es) to the list... + */ + + cupsd_listener_t *lis; /* New listeners array */ + + + /* + * Get the address list... + */ + + addrlist = get_address(value, IPP_PORT); + + if (!addrlist) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad %s address %s at line %d.", line, + value, linenum); + continue; + } + + /* + * Add each address... + */ + + for (addr = addrlist; addr; addr = addr->next) + { + /* + * See if this address is already present... + */ + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + if (httpAddrEqual(&(addr->addr), &(lis->address)) && + _httpAddrPort(&(addr->addr)) == _httpAddrPort(&(lis->address))) + break; + + if (lis) + { + httpAddrString(&lis->address, temp, sizeof(temp)); + cupsdLogMessage(CUPSD_LOG_WARN, + "Duplicate listen address \"%s\" ignored.", temp); + continue; + } + + /* + * Allocate another listener... + */ + + if (!Listeners) + Listeners = cupsArrayNew(NULL, NULL); + + if (!Listeners) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate %s at line %d - %s.", + line, linenum, strerror(errno)); + break; + } + + if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate %s at line %d - %s.", + line, linenum, strerror(errno)); + break; + } + + cupsArrayAdd(Listeners, lis); + + /* + * Copy the current address and log it... + */ + + memcpy(&(lis->address), &(addr->addr), sizeof(lis->address)); + lis->fd = -1; + +#ifdef HAVE_SSL + if (!_cups_strcasecmp(line, "SSLPort") || !_cups_strcasecmp(line, "SSLListen")) + lis->encryption = HTTP_ENCRYPT_ALWAYS; +#endif /* HAVE_SSL */ + + httpAddrString(&lis->address, temp, sizeof(temp)); + +#ifdef AF_LOCAL + if (lis->address.addr.sa_family == AF_LOCAL) + cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s (Domain)", temp); + else +#endif /* AF_LOCAL */ + cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d (IPv%d)", temp, + _httpAddrPort(&(lis->address)), + _httpAddrFamily(&(lis->address)) == AF_INET ? 4 : 6); + + if (!httpAddrLocalhost(&(lis->address))) + RemotePort = _httpAddrPort(&(lis->address)); + } + + /* + * Free the list... + */ + + httpAddrFreeList(addrlist); + } + else if (!_cups_strcasecmp(line, "BrowseAddress") && value) + { + /* + * Add a browse address to the list... + */ + + cupsd_dirsvc_addr_t *dira; /* New browse address array */ + + + if (NumBrowsers == 0) + dira = malloc(sizeof(cupsd_dirsvc_addr_t)); + else + dira = realloc(Browsers, (NumBrowsers + 1) * sizeof(cupsd_dirsvc_addr_t)); + + if (!dira) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate BrowseAddress at line %d - %s.", + linenum, strerror(errno)); + continue; + } + + Browsers = dira; + dira += NumBrowsers; + + memset(dira, 0, sizeof(cupsd_dirsvc_addr_t)); + + if (!_cups_strcasecmp(value, "@LOCAL")) + { + /* + * Send browse data to all local interfaces... + */ + + strcpy(dira->iface, "*"); + NumBrowsers ++; + } + else if (!_cups_strncasecmp(value, "@IF(", 4)) + { + /* + * Send browse data to the named interface... + */ + + strlcpy(dira->iface, value + 4, sizeof(Browsers[0].iface)); + + ptr = dira->iface + strlen(dira->iface) - 1; + if (*ptr == ')') + *ptr = '\0'; + + NumBrowsers ++; + } + else if ((addrlist = get_address(value, BrowsePort)) != NULL) + { + /* + * Only IPv4 addresses are supported... + */ + + for (addr = addrlist; addr; addr = addr->next) + if (_httpAddrFamily(&(addr->addr)) == AF_INET) + break; + + if (addr) + { + memcpy(&(dira->to), &(addrlist->addr), sizeof(dira->to)); + httpAddrString(&(dira->to), temp, sizeof(temp)); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Sending browsing info to %s:%d (IPv4)", + temp, _httpAddrPort(&(dira->to))); + + NumBrowsers ++; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad BrowseAddress %s at line %d.", + value, linenum); + + httpAddrFreeList(addrlist); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad BrowseAddress %s at line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "BrowseOrder") && value) + { + /* + * "BrowseOrder Deny,Allow" or "BrowseOrder Allow,Deny"... + */ + + if ((location = cupsdFindLocation("CUPS_INTERNAL_BROWSE_ACL")) == NULL) + if ((location = cupsdNewLocation("CUPS_INTERNAL_BROWSE_ACL")) != NULL) + cupsdAddLocation(location); + + if (location == NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to initialize browse access control list."); + else if (!_cups_strncasecmp(value, "deny", 4)) + location->order_type = CUPSD_AUTH_ALLOW; + else if (!_cups_strncasecmp(value, "allow", 5)) + location->order_type = CUPSD_AUTH_DENY; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown BrowseOrder value %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "BrowseProtocols") || + !_cups_strcasecmp(line, "BrowseLocalProtocols") || + !_cups_strcasecmp(line, "BrowseRemoteProtocols")) + { + /* + * "BrowseProtocols name [... name]" + * "BrowseLocalProtocols name [... name]" + * "BrowseRemoteProtocols name [... name]" + */ + + int protocols = parse_protocols(value); + + if (protocols < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown browse protocol \"%s\" on line %d.", + value, linenum); + break; + } + + if (_cups_strcasecmp(line, "BrowseLocalProtocols")) + BrowseRemoteProtocols = protocols; + if (_cups_strcasecmp(line, "BrowseRemoteProtocols")) + BrowseLocalProtocols = protocols; + } + else if ((!_cups_strcasecmp(line, "BrowseAllow") || + !_cups_strcasecmp(line, "BrowseDeny")) && value) + { + /* + * BrowseAllow [From] host/ip... + * BrowseDeny [From] host/ip... + */ + + if ((location = cupsdFindLocation("CUPS_INTERNAL_BROWSE_ACL")) == NULL) + if ((location = cupsdNewLocation("CUPS_INTERNAL_BROWSE_ACL")) != NULL) + cupsdAddLocation(location); + + + if (location == NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to initialize browse access control list."); + else + { + if (!_cups_strncasecmp(value, "from", 4)) + { + /* + * Skip leading "from"... + */ + + value += 4; + } + + while (*value) + { + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*value)) + value ++; + + if (!*value) + break; + + /* + * Find the end of the value... + */ + + for (valueptr = value; + *valueptr && !_cups_isspace(*valueptr); + valueptr ++); + + while (_cups_isspace(*valueptr)) + *valueptr++ = '\0'; + + /* + * Figure out what form the allow/deny address takes: + * + * All + * None + * *.domain.com + * .domain.com + * host.domain.com + * nnn.* + * nnn.nnn.* + * nnn.nnn.nnn.* + * nnn.nnn.nnn.nnn + * nnn.nnn.nnn.nnn/mm + * nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm + */ + + if (!_cups_strcasecmp(value, "all")) + { + /* + * All hosts... + */ + + if (!_cups_strcasecmp(line, "BrowseAllow")) + cupsdAddIPMask(&(location->allow), zeros, zeros); + else + cupsdAddIPMask(&(location->deny), zeros, zeros); + } + else if (!_cups_strcasecmp(value, "none")) + { + /* + * No hosts... + */ + + if (!_cups_strcasecmp(line, "BrowseAllow")) + cupsdAddIPMask(&(location->allow), ones, zeros); + else + cupsdAddIPMask(&(location->deny), ones, zeros); + } +#ifdef AF_INET6 + else if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else + else if (value[0] == '*' || value[0] == '.' || + !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ + { + /* + * Host or domain name... + */ + + if (!_cups_strcasecmp(line, "BrowseAllow")) + cupsdAddNameMask(&(location->allow), value); + else + cupsdAddNameMask(&(location->deny), value); + } + else + { + /* + * One of many IP address forms... + */ + + if (!get_addr_and_mask(value, ip, mask)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d.", + value, linenum); + break; + } + + if (!_cups_strcasecmp(line, "BrowseAllow")) + cupsdAddIPMask(&(location->allow), ip, mask); + else + cupsdAddIPMask(&(location->deny), ip, mask); + } + + /* + * Advance to next value... + */ + + value = valueptr; + } + } + } + else if (!_cups_strcasecmp(line, "BrowseRelay") && value) + { + /* + * BrowseRelay [from] source [to] destination + */ + + if (NumRelays == 0) + relay = malloc(sizeof(cupsd_dirsvc_relay_t)); + else + relay = realloc(Relays, (NumRelays + 1) * sizeof(cupsd_dirsvc_relay_t)); + + if (!relay) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate BrowseRelay at line %d - %s.", + linenum, strerror(errno)); + continue; + } + + Relays = relay; + relay += NumRelays; + + memset(relay, 0, sizeof(cupsd_dirsvc_relay_t)); + + if (!_cups_strncasecmp(value, "from ", 5)) + { + /* + * Skip leading "from"... + */ + + value += 5; + + /* + * Skip leading whitespace... + */ + + while (_cups_isspace(*value)) + value ++; + } + + /* + * Find the end of the from value... + */ + + for (valueptr = value; + *valueptr && !_cups_isspace(*valueptr); + valueptr ++); + + while (_cups_isspace(*valueptr)) + *valueptr++ = '\0'; + + /* + * Figure out what form the from address takes: + * + * *.domain.com + * .domain.com + * host.domain.com + * nnn.* + * nnn.nnn.* + * nnn.nnn.nnn.* + * nnn.nnn.nnn.nnn + * nnn.nnn.nnn.nnn/mm + * nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm + */ + +#ifdef AF_INET6 + if (value[0] == '*' || value[0] == '.' || + (!isdigit(value[0] & 255) && value[0] != '[')) +#else + if (value[0] == '*' || value[0] == '.' || !isdigit(value[0] & 255)) +#endif /* AF_INET6 */ + { + /* + * Host or domain name... + */ + + if (!cupsdAddNameMask(&(relay->from), value)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate BrowseRelay name at line %d - %s.", + linenum, strerror(errno)); + continue; + } + } + else + { + /* + * One of many IP address forms... + */ + + if (!get_addr_and_mask(value, ip, mask)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad netmask value %s on line %d.", + value, linenum); + break; + } + + if (!cupsdAddIPMask(&(relay->from), ip, mask)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate BrowseRelay IP at line %d - %s.", + linenum, strerror(errno)); + continue; + } + } + + /* + * Get "to" address and port... + */ + + if (!_cups_strncasecmp(valueptr, "to ", 3)) + { + /* + * Strip leading "to"... + */ + + valueptr += 3; + + while (_cups_isspace(*valueptr)) + valueptr ++; + } + + if ((addrlist = get_address(valueptr, BrowsePort)) != NULL) + { + /* + * Only IPv4 addresses are supported... + */ + + for (addr = addrlist; addr; addr = addr->next) + if (addr->addr.addr.sa_family == AF_INET) + break; + + if (addr) + { + memcpy(&(relay->to), &(addrlist->addr), sizeof(relay->to)); + + httpAddrString(&(relay->to), temp, sizeof(temp)); + + cupsdLogMessage(CUPSD_LOG_INFO, "Relaying from %s to %s:%d (IPv4)", + value, temp, _httpAddrPort(&(relay->to))); + + NumRelays ++; + } + else + { + cupsArrayDelete(relay->from); + relay->from = NULL; + + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad relay address %s at line %d.", + valueptr, linenum); + } + + httpAddrFreeList(addrlist); + } + else + { + cupsArrayDelete(relay->from); + relay->from = NULL; + + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad relay address %s at line %d.", + valueptr, linenum); + } + } + else if (!_cups_strcasecmp(line, "BrowsePoll") && value) + { + /* + * BrowsePoll address[:port] + */ + + char *portname; /* Port name */ + int portnum; /* Port number */ + struct servent *service; /* Service */ + + + /* + * Extract the port name from the address... + */ + + if ((portname = strrchr(value, ':')) != NULL && !strchr(portname, ']')) + { + *portname++ = '\0'; + + if (isdigit(*portname & 255)) + portnum = atoi(portname); + else if ((service = getservbyname(portname, NULL)) != NULL) + portnum = ntohs(service->s_port); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Lookup of service \"%s\" failed.", + portname); + continue; + } + } + else + portnum = ippPort(); + + /* + * Add the poll entry... + */ + + if (NumPolled == 0) + pollp = malloc(sizeof(cupsd_dirsvc_poll_t)); + else + pollp = realloc(Polled, (NumPolled + 1) * sizeof(cupsd_dirsvc_poll_t)); + + if (!pollp) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate BrowsePoll at line %d - %s.", + linenum, strerror(errno)); + continue; + } + + Polled = pollp; + pollp += NumPolled; + + NumPolled ++; + memset(pollp, 0, sizeof(cupsd_dirsvc_poll_t)); + + strlcpy(pollp->hostname, value, sizeof(pollp->hostname)); + pollp->port = portnum; + + cupsdLogMessage(CUPSD_LOG_INFO, "Polling %s:%d", pollp->hostname, + pollp->port); + } + else if (!_cups_strcasecmp(line, "DefaultAuthType") && value) + { + /* + * DefaultAuthType {basic,digest,basicdigest,negotiate} + */ + + if (!_cups_strcasecmp(value, "none")) + DefaultAuthType = CUPSD_AUTH_NONE; + else if (!_cups_strcasecmp(value, "basic")) + DefaultAuthType = CUPSD_AUTH_BASIC; + else if (!_cups_strcasecmp(value, "digest")) + DefaultAuthType = CUPSD_AUTH_DIGEST; + else if (!_cups_strcasecmp(value, "basicdigest")) + DefaultAuthType = CUPSD_AUTH_BASICDIGEST; +#ifdef HAVE_GSSAPI + else if (!_cups_strcasecmp(value, "negotiate")) + DefaultAuthType = CUPSD_AUTH_NEGOTIATE; +#endif /* HAVE_GSSAPI */ + else + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown default authorization type %s on line %d.", + value, linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + } +#ifdef HAVE_SSL + else if (!_cups_strcasecmp(line, "DefaultEncryption")) + { + /* + * DefaultEncryption {Never,IfRequested,Required} + */ + + if (!value || !_cups_strcasecmp(value, "never")) + DefaultEncryption = HTTP_ENCRYPT_NEVER; + else if (!_cups_strcasecmp(value, "required")) + DefaultEncryption = HTTP_ENCRYPT_REQUIRED; + else if (!_cups_strcasecmp(value, "ifrequested")) + DefaultEncryption = HTTP_ENCRYPT_IF_REQUESTED; + else + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Unknown default encryption %s on line %d.", + value, linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + } +#endif /* HAVE_SSL */ + else if (!_cups_strcasecmp(line, "User") && value) + { + /* + * User ID to run as... + */ + + if (isdigit(value[0] & 255)) + { + int uid = atoi(value); + + if (!uid) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Will not use User 0 as specified on line %d " + "for security reasons. You must use a non-" + "privileged account instead.", + linenum); + else + User = atoi(value); + } + else + { + struct passwd *p; /* Password information */ + + endpwent(); + p = getpwnam(value); + + if (p) + { + if (!p->pw_uid) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Will not use User %s (UID=0) as specified on line " + "%d for security reasons. You must use a non-" + "privileged account instead.", + value, linenum); + else + User = p->pw_uid; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown User \"%s\" on line %d, ignoring.", + value, linenum); + } + } + else if (!_cups_strcasecmp(line, "Group") && value) + { + /* + * Group ID to run as... + */ + + if (isdigit(value[0])) + Group = atoi(value); + else + { + endgrent(); + group = getgrnam(value); + + if (group != NULL) + Group = group->gr_gid; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown Group \"%s\" on line %d, ignoring.", + value, linenum); + } + } + else if (!_cups_strcasecmp(line, "SystemGroup") && value) + { + /* + * SystemGroup (admin) group(s)... + */ + + if (!parse_groups(value)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown SystemGroup \"%s\" on line %d, ignoring.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "HostNameLookups") && value) + { + /* + * Do hostname lookups? + */ + + if (!_cups_strcasecmp(value, "off") || !_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "false")) + HostNameLookups = 0; + else if (!_cups_strcasecmp(value, "on") || !_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "true")) + HostNameLookups = 1; + else if (!_cups_strcasecmp(value, "double")) + HostNameLookups = 2; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown HostNameLookups %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "AccessLogLevel") && value) + { + /* + * Amount of logging to do to access log... + */ + + if (!_cups_strcasecmp(value, "all")) + AccessLogLevel = CUPSD_ACCESSLOG_ALL; + else if (!_cups_strcasecmp(value, "actions")) + AccessLogLevel = CUPSD_ACCESSLOG_ACTIONS; + else if (!_cups_strcasecmp(value, "config")) + AccessLogLevel = CUPSD_ACCESSLOG_CONFIG; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown AccessLogLevel %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "LogLevel") && value) + { + /* + * Amount of logging to do to error log... + */ + + if (!_cups_strcasecmp(value, "debug2")) + LogLevel = CUPSD_LOG_DEBUG2; + else if (!_cups_strcasecmp(value, "debug")) + LogLevel = CUPSD_LOG_DEBUG; + else if (!_cups_strcasecmp(value, "info")) + LogLevel = CUPSD_LOG_INFO; + else if (!_cups_strcasecmp(value, "notice")) + LogLevel = CUPSD_LOG_NOTICE; + else if (!_cups_strcasecmp(value, "warn")) + LogLevel = CUPSD_LOG_WARN; + else if (!_cups_strcasecmp(value, "error")) + LogLevel = CUPSD_LOG_ERROR; + else if (!_cups_strcasecmp(value, "crit")) + LogLevel = CUPSD_LOG_CRIT; + else if (!_cups_strcasecmp(value, "alert")) + LogLevel = CUPSD_LOG_ALERT; + else if (!_cups_strcasecmp(value, "emerg")) + LogLevel = CUPSD_LOG_EMERG; + else if (!_cups_strcasecmp(value, "none")) + LogLevel = CUPSD_LOG_NONE; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogLevel %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "LogTimeFormat") && value) + { + /* + * Amount of logging to do to error log... + */ + + if (!_cups_strcasecmp(value, "standard")) + LogTimeFormat = CUPSD_TIME_STANDARD; + else if (!_cups_strcasecmp(value, "usecs")) + LogTimeFormat = CUPSD_TIME_USECS; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown LogTimeFormat %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "PrintcapFormat") && value) + { + /* + * Format of printcap file? + */ + + if (!_cups_strcasecmp(value, "bsd")) + PrintcapFormat = PRINTCAP_BSD; + else if (!_cups_strcasecmp(value, "plist")) + PrintcapFormat = PRINTCAP_PLIST; + else if (!_cups_strcasecmp(value, "solaris")) + PrintcapFormat = PRINTCAP_SOLARIS; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown PrintcapFormat %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "ServerTokens") && value) + { + /* + * Set the string used for the Server header... + */ + + struct utsname plat; /* Platform info */ + + + uname(&plat); + + if (!_cups_strcasecmp(value, "ProductOnly")) + cupsdSetString(&ServerHeader, "CUPS"); + else if (!_cups_strcasecmp(value, "Major")) + cupsdSetStringf(&ServerHeader, "CUPS/%d", CUPS_VERSION_MAJOR); + else if (!_cups_strcasecmp(value, "Minor")) + cupsdSetStringf(&ServerHeader, "CUPS/%d.%d", CUPS_VERSION_MAJOR, + CUPS_VERSION_MINOR); + else if (!_cups_strcasecmp(value, "Minimal")) + cupsdSetString(&ServerHeader, CUPS_MINIMAL); + else if (!_cups_strcasecmp(value, "OS")) + cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s)", plat.sysname); + else if (!_cups_strcasecmp(value, "Full")) + cupsdSetStringf(&ServerHeader, CUPS_MINIMAL " (%s) IPP/2.1", + plat.sysname); + else if (!_cups_strcasecmp(value, "None")) + cupsdClearString(&ServerHeader); + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown ServerTokens %s on line %d.", + value, linenum); + } + else if (!_cups_strcasecmp(line, "PassEnv") && value) + { + /* + * PassEnv variable [... variable] + */ + + for (; *value;) + { + for (valuelen = 0; value[valuelen]; valuelen ++) + if (_cups_isspace(value[valuelen]) || value[valuelen] == ',') + break; + + if (value[valuelen]) + { + value[valuelen] = '\0'; + valuelen ++; + } + + cupsdSetEnv(value, NULL); + + for (value += valuelen; *value; value ++) + if (!_cups_isspace(*value) || *value != ',') + break; + } + } + else if (!_cups_strcasecmp(line, "ServerAlias") && value) + { + /* + * ServerAlias name [... name] + */ + + if (!ServerAlias) + ServerAlias = cupsArrayNew(NULL, NULL); + + for (; *value;) + { + for (valuelen = 0; value[valuelen]; valuelen ++) + if (_cups_isspace(value[valuelen]) || value[valuelen] == ',') + break; + + if (value[valuelen]) + { + value[valuelen] = '\0'; + valuelen ++; + } + + cupsdAddAlias(ServerAlias, value); + + for (value += valuelen; *value; value ++) + if (!_cups_isspace(*value) || *value != ',') + break; + } + } + else if (!_cups_strcasecmp(line, "SetEnv") && value) + { + /* + * SetEnv variable value + */ + + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (*valueptr) + { + /* + * Found a value... + */ + + while (isspace(*valueptr & 255)) + *valueptr++ = '\0'; + + cupsdSetEnv(value, valueptr); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing value for SetEnv directive on line %d.", + linenum); + } +#ifdef HAVE_SSL + else if (!_cups_strcasecmp(line, "SSLOptions")) + { + /* + * SSLOptions options + */ + + if (!value || !_cups_strcasecmp(value, "none")) + SSLOptions = CUPSD_SSL_NONE; + else if (!_cups_strcasecmp(value, "noemptyfragments")) + SSLOptions = CUPSD_SSL_NOEMPTY; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown value \"%s\" for SSLOptions directive on " + "line %d.", value, linenum); + } +#endif /* HAVE_SSL */ + else + { + /* + * Find a simple variable in the list... + */ + + for (i = NUM_VARS, var = variables; i > 0; i --, var ++) + if (!_cups_strcasecmp(line, var->name)) + break; + + if (i == 0) + { + /* + * Unknown directive! Output an error message and continue... + */ + + if (!value) + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value for %s on line %d.", + line, linenum); + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown directive %s on line %d.", + line, linenum); + continue; + } + + switch (var->type) + { + case CUPSD_VARTYPE_INTEGER : + if (!value) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing integer value for %s on line %d.", + line, linenum); + else + { + int n; /* Number */ + char *units; /* Units */ + + + n = strtol(value, &units, 0); + + if (units && *units) + { + if (tolower(units[0] & 255) == 'g') + n *= 1024 * 1024 * 1024; + else if (tolower(units[0] & 255) == 'm') + n *= 1024 * 1024; + else if (tolower(units[0] & 255) == 'k') + n *= 1024; + else if (tolower(units[0] & 255) == 't') + n *= 262144; + } + + if (n < 0) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad negative integer value for %s on line %d.", + line, linenum); + else + *((int *)var->ptr) = n; + } + break; + + case CUPSD_VARTYPE_BOOLEAN : + if (!value) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing boolean value for %s on line %d.", + line, linenum); + else if (!_cups_strcasecmp(value, "true") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "enabled") || + !_cups_strcasecmp(value, "yes") || + atoi(value) != 0) + *((int *)var->ptr) = TRUE; + else if (!_cups_strcasecmp(value, "false") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "disabled") || + !_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "0")) + *((int *)var->ptr) = FALSE; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown boolean value %s on line %d.", + value, linenum); + break; + + case CUPSD_VARTYPE_PATHNAME : + if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing pathname value for %s on line %d.", + line, linenum); + break; + } + + if (value[0] == '/') + strlcpy(temp, value, sizeof(temp)); + else + snprintf(temp, sizeof(temp), "%s/%s", ServerRoot, value); + + if (access(temp, 0)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "File or directory for \"%s %s\" on line %d " + "does not exist.", line, value, linenum); + break; + } + + case CUPSD_VARTYPE_STRING : + cupsdSetString((char **)var->ptr, value); + break; + } + } + } + + return (1); +} + + +/* + * 'read_location()' - Read a definition. + */ + +static int /* O - New line number or 0 on error */ +read_location(cups_file_t *fp, /* I - Configuration file */ + char *location, /* I - Location name/path */ + int linenum) /* I - Current line number */ +{ + cupsd_location_t *loc, /* New location */ + *parent; /* Parent location */ + char line[HTTP_MAX_BUFFER], + /* Line buffer */ + *value, /* Value for directive */ + *valptr; /* Pointer into value */ + + + if ((parent = cupsdFindLocation(location)) != NULL) + cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate on line %d.", + location, linenum); + else if ((parent = cupsdNewLocation(location)) == NULL) + return (0); + else + { + cupsdAddLocation(parent); + + parent->limit = CUPSD_AUTH_LIMIT_ALL; + } + + loc = parent; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, "")) + return (linenum); + else if (!_cups_strcasecmp(line, "limit = 0; + while (*value) + { + for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++); + + if (*valptr) + *valptr++ = '\0'; + + if (!strcmp(value, "ALL")) + loc->limit = CUPSD_AUTH_LIMIT_ALL; + else if (!strcmp(value, "GET")) + loc->limit |= CUPSD_AUTH_LIMIT_GET; + else if (!strcmp(value, "HEAD")) + loc->limit |= CUPSD_AUTH_LIMIT_HEAD; + else if (!strcmp(value, "OPTIONS")) + loc->limit |= CUPSD_AUTH_LIMIT_OPTIONS; + else if (!strcmp(value, "POST")) + loc->limit |= CUPSD_AUTH_LIMIT_POST; + else if (!strcmp(value, "PUT")) + loc->limit |= CUPSD_AUTH_LIMIT_PUT; + else if (!strcmp(value, "TRACE")) + loc->limit |= CUPSD_AUTH_LIMIT_TRACE; + else + cupsdLogMessage(CUPSD_LOG_WARN, "Unknown request type %s on line %d.", + value, linenum); + + for (value = valptr; isspace(*value & 255); value ++); + } + + if (!_cups_strcasecmp(line, "limit = CUPSD_AUTH_LIMIT_ALL ^ loc->limit; + + parent->limit &= ~loc->limit; + } + else if (!_cups_strcasecmp(line, "
") || + !_cups_strcasecmp(line, "")) + loc = parent; + else if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + else if (!parse_aaa(loc, line, value, linenum)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown Location directive %s on line %d.", + line, linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + } + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unexpected end-of-file at line %d while reading location.", + linenum); + + return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum); +} + + +/* + * 'read_policy()' - Read a definition. + */ + +static int /* O - New line number or 0 on error */ +read_policy(cups_file_t *fp, /* I - Configuration file */ + char *policy, /* I - Location name/path */ + int linenum) /* I - Current line number */ +{ + int i; /* Looping var */ + cupsd_policy_t *pol; /* Policy */ + cupsd_location_t *op; /* Policy operation */ + int num_ops; /* Number of IPP operations */ + ipp_op_t ops[100]; /* Operations */ + char line[HTTP_MAX_BUFFER], + /* Line buffer */ + *value, /* Value for directive */ + *valptr; /* Pointer into value */ + + + /* + * Create the policy... + */ + + if ((pol = cupsdFindPolicy(policy)) != NULL) + cupsdLogMessage(CUPSD_LOG_WARN, "Duplicate on line %d.", + policy, linenum); + else if ((pol = cupsdAddPolicy(policy)) == NULL) + return (0); + + /* + * Read from the file... + */ + + op = NULL; + num_ops = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, "")) + { + if (op) + cupsdLogMessage(CUPSD_LOG_WARN, + "Missing
before on line %d.", + linenum); + + set_policy_defaults(pol); + + return (linenum); + } + else if (!_cups_strcasecmp(line, "") && op) + { + /* + * Finish the current operation limit... + */ + + if (num_ops > 1) + { + /* + * Copy the policy to the other operations... + */ + + for (i = 1; i < num_ops; i ++) + cupsdAddPolicyOp(pol, op, ops[i]); + } + + op = NULL; + } + else if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d.", linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + else if (!_cups_strcasecmp(line, "JobPrivateAccess") || + !_cups_strcasecmp(line, "JobPrivateValues") || + !_cups_strcasecmp(line, "SubscriptionPrivateAccess") || + !_cups_strcasecmp(line, "SubscriptionPrivateValues")) + { + if (op) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "%s directive must appear outside ... " + "on line %d.", line, linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + else + { + /* + * Pull out whitespace-delimited values... + */ + + while (*value) + { + /* + * Find the end of the current value... + */ + + for (valptr = value; !isspace(*valptr & 255) && *valptr; valptr ++); + + if (*valptr) + *valptr++ = '\0'; + + /* + * Save it appropriately... + */ + + if (!_cups_strcasecmp(line, "JobPrivateAccess")) + { + /* + * JobPrivateAccess {all|default|user/group list|@@ACL} + */ + + if (!_cups_strcasecmp(value, "default")) + { + cupsdAddString(&(pol->job_access), "@OWNER"); + cupsdAddString(&(pol->job_access), "@SYSTEM"); + } + else + cupsdAddString(&(pol->job_access), value); + } + else if (!_cups_strcasecmp(line, "JobPrivateValues")) + { + /* + * JobPrivateValues {all|none|default|attribute list} + */ + + if (!_cups_strcasecmp(value, "default")) + { + cupsdAddString(&(pol->job_attrs), "job-name"); + cupsdAddString(&(pol->job_attrs), "job-originating-host-name"); + cupsdAddString(&(pol->job_attrs), "job-originating-user-name"); + } + else + cupsdAddString(&(pol->job_attrs), value); + } + else if (!_cups_strcasecmp(line, "SubscriptionPrivateAccess")) + { + /* + * SubscriptionPrivateAccess {all|default|user/group list|@@ACL} + */ + + if (!_cups_strcasecmp(value, "default")) + { + cupsdAddString(&(pol->sub_access), "@OWNER"); + cupsdAddString(&(pol->sub_access), "@SYSTEM"); + } + else + cupsdAddString(&(pol->sub_access), value); + } + else /* if (!_cups_strcasecmp(line, "SubscriptionPrivateValues")) */ + { + /* + * SubscriptionPrivateValues {all|none|default|attribute list} + */ + + if (!_cups_strcasecmp(value, "default")) + { + cupsdAddString(&(pol->sub_attrs), "notify-events"); + cupsdAddString(&(pol->sub_attrs), "notify-pull-method"); + cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri"); + cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name"); + cupsdAddString(&(pol->sub_attrs), "notify-user-data"); + } + else + cupsdAddString(&(pol->sub_attrs), value); + } + + /* + * Find the next string on the line... + */ + + for (value = valptr; isspace(*value & 255); value ++); + } + } + } + else if (!op) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing directive before %s on line %d.", + line, linenum); + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + else if (!parse_aaa(op, line, value, linenum)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown Policy Limit directive %s on line %d.", + line, linenum); + + if (FatalErrors & CUPSD_FATAL_CONFIG) + return (0); + } + } + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unexpected end-of-file at line %d while reading policy " + "\"%s\".", linenum, policy); + + return ((FatalErrors & CUPSD_FATAL_CONFIG) ? 0 : linenum); +} + + +/* + * 'set_policy_defaults()' - Set default policy values as needed. + */ + +static void +set_policy_defaults(cupsd_policy_t *pol)/* I - Policy */ +{ + cupsd_location_t *op; /* Policy operation */ + + + /* + * Verify that we have an explicit policy for Validate-Job, Cancel-Jobs, + * Cancel-My-Jobs, Close-Job, and CUPS-Get-Document, which ensures that + * upgrades do not introduce new security issues... + */ + + if ((op = cupsdFindPolicyOp(pol, IPP_VALIDATE_JOB)) == NULL || + op->op == IPP_ANY_OPERATION) + { + if ((op = cupsdFindPolicyOp(pol, IPP_PRINT_JOB)) != NULL && + op->op != IPP_ANY_OPERATION) + { + /* + * Add a new limit for Validate-Job using the Print-Job limit as a + * template... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Validate-Job defined in policy %s " + "- using Print-Job's policy.", pol->name); + + cupsdAddPolicyOp(pol, op, IPP_VALIDATE_JOB); + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Validate-Job defined in policy %s " + "and no suitable template found.", pol->name); + } + + if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_JOBS)) == NULL || + op->op == IPP_ANY_OPERATION) + { + if ((op = cupsdFindPolicyOp(pol, IPP_PAUSE_PRINTER)) != NULL && + op->op != IPP_ANY_OPERATION) + { + /* + * Add a new limit for Cancel-Jobs using the Pause-Printer limit as a + * template... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Cancel-Jobs defined in policy %s " + "- using Pause-Printer's policy.", pol->name); + + cupsdAddPolicyOp(pol, op, IPP_CANCEL_JOBS); + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Cancel-Jobs defined in policy %s " + "and no suitable template found.", pol->name); + } + + if ((op = cupsdFindPolicyOp(pol, IPP_CANCEL_MY_JOBS)) == NULL || + op->op == IPP_ANY_OPERATION) + { + if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + op->op != IPP_ANY_OPERATION) + { + /* + * Add a new limit for Cancel-My-Jobs using the Send-Document limit as + * a template... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Cancel-My-Jobs defined in policy %s " + "- using Send-Document's policy.", pol->name); + + cupsdAddPolicyOp(pol, op, IPP_CANCEL_MY_JOBS); + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Cancel-My-Jobs defined in policy %s " + "and no suitable template found.", pol->name); + } + + if ((op = cupsdFindPolicyOp(pol, IPP_CLOSE_JOB)) == NULL || + op->op == IPP_ANY_OPERATION) + { + if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + op->op != IPP_ANY_OPERATION) + { + /* + * Add a new limit for Close-Job using the Send-Document limit as a + * template... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Close-Job defined in policy %s " + "- using Send-Document's policy.", pol->name); + + cupsdAddPolicyOp(pol, op, IPP_CLOSE_JOB); + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for Close-Job defined in policy %s " + "and no suitable template found.", pol->name); + } + + if ((op = cupsdFindPolicyOp(pol, CUPS_GET_DOCUMENT)) == NULL || + op->op == IPP_ANY_OPERATION) + { + if ((op = cupsdFindPolicyOp(pol, IPP_SEND_DOCUMENT)) != NULL && + op->op != IPP_ANY_OPERATION) + { + /* + * Add a new limit for CUPS-Get-Document using the Send-Document + * limit as a template... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for CUPS-Get-Document defined in policy %s " + "- using Send-Document's policy.", pol->name); + + cupsdAddPolicyOp(pol, op, CUPS_GET_DOCUMENT); + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "No limit for CUPS-Get-Document defined in policy %s " + "and no suitable template found.", pol->name); + } + + /* + * Verify we have JobPrivateAccess, JobPrivateValues, + * SubscriptionPrivateAccess, and SubscriptionPrivateValues in the policy. + */ + + if (!pol->job_access) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "No JobPrivateAccess defined in policy %s " + "- using defaults.", pol->name); + cupsdAddString(&(pol->job_access), "@OWNER"); + cupsdAddString(&(pol->job_access), "@SYSTEM"); + } + + if (!pol->job_attrs) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "No JobPrivateValues defined in policy %s " + "- using defaults.", pol->name); + cupsdAddString(&(pol->job_attrs), "job-name"); + cupsdAddString(&(pol->job_attrs), "job-originating-host-name"); + cupsdAddString(&(pol->job_attrs), "job-originating-user-name"); + } + + if (!pol->sub_access) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "No SubscriptionPrivateAccess defined in policy %s " + "- using defaults.", pol->name); + cupsdAddString(&(pol->sub_access), "@OWNER"); + cupsdAddString(&(pol->sub_access), "@SYSTEM"); + } + + if (!pol->sub_attrs) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "No SubscriptionPrivateValues defined in policy %s " + "- using defaults.", pol->name); + cupsdAddString(&(pol->sub_attrs), "notify-events"); + cupsdAddString(&(pol->sub_attrs), "notify-pull-method"); + cupsdAddString(&(pol->sub_attrs), "notify-recipient-uri"); + cupsdAddString(&(pol->sub_attrs), "notify-subscriber-user-name"); + cupsdAddString(&(pol->sub_attrs), "notify-user-data"); + } +} + + +/* + * End of "$Id: conf.c 10121 2011-11-16 15:28:11Z mike $". + */ diff --git a/scheduler/conf.h b/scheduler/conf.h new file mode 100644 index 0000000..f3c2c24 --- /dev/null +++ b/scheduler/conf.h @@ -0,0 +1,301 @@ +/* + * "$Id: conf.h 9710 2011-04-22 17:47:03Z mike $" + * + * Configuration file definitions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + + +/* + * Log levels... + */ + +typedef enum +{ + CUPSD_LOG_PPD = -4, /* Used internally for PPD keywords */ + CUPSD_LOG_ATTR, /* Used internally for attributes */ + CUPSD_LOG_STATE, /* Used internally for state-reasons */ + CUPSD_LOG_PAGE, /* Used internally for page logging */ + CUPSD_LOG_NONE, + CUPSD_LOG_EMERG, /* Emergency issues */ + CUPSD_LOG_ALERT, /* Something bad happened that needs attention */ + CUPSD_LOG_CRIT, /* Critical error but server continues */ + CUPSD_LOG_ERROR, /* Error condition */ + CUPSD_LOG_WARN, /* Warning */ + CUPSD_LOG_NOTICE, /* Normal condition that needs logging */ + CUPSD_LOG_INFO, /* General information */ + CUPSD_LOG_DEBUG, /* General debugging */ + CUPSD_LOG_DEBUG2 /* Detailed debugging */ +} cupsd_loglevel_t; + +typedef enum +{ + CUPSD_ACCESSLOG_CONFIG, /* Log config requests */ + CUPSD_ACCESSLOG_ACTIONS, /* Log config, print, and job management requests */ + CUPSD_ACCESSLOG_ALL /* Log everything */ +} cupsd_accesslog_t; + +typedef enum +{ + CUPSD_TIME_STANDARD, /* "Standard" Apache/CLF format */ + CUPSD_TIME_USECS /* Standard format with microseconds */ +} cupsd_time_t; + + +/* + * FatalErrors flags... + */ + +#define CUPSD_FATAL_NONE 0 /* No errors are fatal */ +#define CUPSD_FATAL_BROWSE 1 /* Browse bind errors are fatal */ +#define CUPSD_FATAL_CONFIG 2 /* Config file syntax errors are fatal */ +#define CUPSD_FATAL_LISTEN 4 /* Listen/Port bind errors are fatal */ +#define CUPSD_FATAL_LOG 8 /* Log file errors are fatal */ +#define CUPSD_FATAL_PERMISSIONS 16 /* File permission errors are fatal */ +#define CUPSD_FATAL_ALL ~0 /* All errors are fatal */ + + +/* + * Printcap formats... + */ + +#define PRINTCAP_BSD 0 /* Berkeley LPD format */ +#define PRINTCAP_SOLARIS 1 /* Solaris lpsched format */ +#define PRINTCAP_PLIST 2 /* Mac OS X plist format */ + + +/* + * SSL options (bits)... + */ + +#define CUPSD_SSL_NONE 0 /* No special options */ +#define CUPSD_SSL_NOEMPTY 1 /* Do not insert empty fragments */ + + +/* + * ServerAlias data... + */ + +typedef struct +{ + size_t namelen; /* Length of alias name */ + char name[1]; /* Alias name */ +} cupsd_alias_t; + + +/* + * Globals... + */ + +VAR char *ConfigurationFile VALUE(NULL), + /* Configuration file to use */ + *ServerName VALUE(NULL), + /* FQDN for server */ + *ServerAdmin VALUE(NULL), + /* Administrator's email */ + *ServerRoot VALUE(NULL), + /* Root directory for scheduler */ + *ServerBin VALUE(NULL), + /* Root directory for binaries */ + *StateDir VALUE(NULL), + /* Root directory for state data */ + *RequestRoot VALUE(NULL), + /* Directory for request files */ + *DocumentRoot VALUE(NULL); + /* Root directory for documents */ +VAR cups_array_t *ServerAlias VALUE(NULL); + /* Alias names for server */ +VAR int ServerNameIsIP VALUE(0); + /* Is the ServerName an IP address? */ +VAR int NumSystemGroups VALUE(0); + /* Number of system group names */ +VAR char *SystemGroups[MAX_SYSTEM_GROUPS] + VALUE({0}); + /* System group names */ +VAR gid_t SystemGroupIDs[MAX_SYSTEM_GROUPS] + VALUE({0}); + /* System group IDs */ +VAR char *AccessLog VALUE(NULL), + /* Access log filename */ + *ErrorLog VALUE(NULL), + /* Error log filename */ + *PageLog VALUE(NULL), + /* Page log filename */ + *CacheDir VALUE(NULL), + /* Cache file directory */ + *DataDir VALUE(NULL), + /* Data file directory */ + *DefaultLanguage VALUE(NULL), + /* Default language encoding */ + *DefaultLocale VALUE(NULL), + /* Default locale */ + *DefaultPaperSize VALUE(NULL), + /* Default paper size */ + *ErrorPolicy VALUE(NULL), + /* Default printer-error-policy */ + *RIPCache VALUE(NULL), + /* Amount of memory for RIPs */ + *TempDir VALUE(NULL), + /* Temporary directory */ + *Printcap VALUE(NULL), + /* Printcap file */ + *PrintcapGUI VALUE(NULL), + /* GUI program to use for IRIX */ + *FontPath VALUE(NULL), + /* Font search path */ + *RemoteRoot VALUE(NULL), + /* Remote root user */ + *Classification VALUE(NULL); + /* Classification of system */ +VAR uid_t User VALUE(1); + /* User ID for server */ +VAR gid_t Group VALUE(0); + /* Group ID for server */ +VAR cupsd_accesslog_t AccessLogLevel VALUE(CUPSD_ACCESSLOG_ACTIONS); + /* Access log level */ +VAR int ClassifyOverride VALUE(0), + /* Allow overrides? */ + ConfigFilePerm VALUE(0640), + /* Permissions for config files */ + LogDebugHistory VALUE(99999), + /* Amount of automatic debug history */ + FatalErrors VALUE(CUPSD_FATAL_CONFIG), + /* Which errors are fatal? */ + LogFilePerm VALUE(0644); + /* Permissions for log files */ +VAR cupsd_loglevel_t LogLevel VALUE(CUPSD_LOG_WARN); + /* Error log level */ +VAR cupsd_time_t LogTimeFormat VALUE(CUPSD_TIME_STANDARD); + /* Log file time format */ +VAR int MaxClients VALUE(100), + /* Maximum number of clients */ + MaxClientsPerHost VALUE(0), + /* Maximum number of clients per host */ + MaxCopies VALUE(CUPS_DEFAULT_MAX_COPIES), + /* Maximum number of copies per job */ + MaxLogSize VALUE(1024 * 1024), + /* Maximum size of log files */ + MaxRequestSize VALUE(0), + /* Maximum size of IPP requests */ + HostNameLookups VALUE(FALSE), + /* Do we do reverse lookups? */ + Timeout VALUE(DEFAULT_TIMEOUT), + /* Timeout during requests */ + KeepAlive VALUE(TRUE), + /* Support the Keep-Alive option? */ + KeepAliveTimeout VALUE(DEFAULT_KEEPALIVE), + /* Timeout between requests */ + ImplicitClasses VALUE(TRUE), + /* Are classes implicitly created? */ + ImplicitAnyClasses VALUE(FALSE), + /* Create AnyPrinter classes? */ + HideImplicitMembers VALUE(TRUE), + /* Hide implicit class members? */ + FileDevice VALUE(FALSE), + /* Allow file: devices? */ + FilterLimit VALUE(0), + /* Max filter cost at any time */ + FilterLevel VALUE(0), + /* Current filter level */ + FilterNice VALUE(0), + /* Nice value for filters */ + ReloadTimeout VALUE(DEFAULT_KEEPALIVE), + /* Timeout before reload from SIGHUP */ + RootCertDuration VALUE(300), + /* Root certificate update interval */ + RunUser VALUE(0), + /* User to run as, used for files */ + PrintcapFormat VALUE(PRINTCAP_BSD), + /* Format of printcap file? */ + DefaultShared VALUE(TRUE), + /* Share printers by default? */ + MultipleOperationTimeout VALUE(DEFAULT_TIMEOUT), + /* multiple-operation-time-out value */ + WebInterface VALUE(CUPS_DEFAULT_WEBIF); + /* Enable the web interface? */ +VAR cups_file_t *AccessFile VALUE(NULL), + /* Access log file */ + *ErrorFile VALUE(NULL), + /* Error log file */ + *PageFile VALUE(NULL); + /* Page log file */ +VAR char *PageLogFormat VALUE(NULL); + /* Page log format */ +VAR mime_t *MimeDatabase VALUE(NULL); + /* MIME type database */ +VAR int NumMimeTypes VALUE(0); + /* Number of MIME types */ +VAR const char **MimeTypes VALUE(NULL); + /* Array of MIME types */ + +#ifdef HAVE_SSL +VAR char *ServerCertificate VALUE(NULL); + /* Server certificate file */ +# if defined(HAVE_LIBSSL) || defined(HAVE_GNUTLS) +VAR char *ServerKey VALUE(NULL); + /* Server key file */ +# endif /* HAVE_LIBSSL || HAVE_GNUTLS */ +VAR int SSLOptions VALUE(CUPSD_SSL_NONE); + /* SSL/TLS options */ +#endif /* HAVE_SSL */ +VAR char *PidFile VALUE(NULL); + /* Debian CUPS pid file */ + +#ifdef HAVE_LAUNCHD +VAR int LaunchdTimeout VALUE(DEFAULT_KEEPALIVE); + /* Time after which an idle cupsd will exit */ +#endif /* HAVE_LAUNCHD */ + +#ifdef HAVE_AUTHORIZATION_H +VAR char *SystemGroupAuthKey VALUE(NULL); + /* System group auth key */ +#endif /* HAVE_AUTHORIZATION_H */ + + +/* + * Prototypes... + */ + +extern void cupsdAddAlias(cups_array_t *aliases, const char *name); +extern int cupsdCheckLogFile(cups_file_t **lf, const char *logname); +extern int cupsdCheckPermissions(const char *filename, + const char *suffix, int mode, + int user, int group, int is_dir, + int create_dir); +extern int cupsdCheckProgram(const char *filename, cupsd_printer_t *p); +extern void cupsdFreeAliases(cups_array_t *aliases); +extern char *cupsdGetDateTime(struct timeval *t, cupsd_time_t format); +extern void cupsdLogFCMessage(void *context, _cups_fc_result_t result, + const char *message); +#ifdef HAVE_GSSAPI +extern int cupsdLogGSSMessage(int level, int major_status, + int minor_status, + const char *message, ...); +#endif /* HAVE_GSSAPI */ +extern int cupsdLogJob(cupsd_job_t *job, int level, const char *message, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +#endif /* __GNUC__ */ +; +extern int cupsdLogMessage(int level, const char *message, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +; +extern int cupsdLogPage(cupsd_job_t *job, const char *page); +extern int cupsdLogRequest(cupsd_client_t *con, http_status_t code); +extern int cupsdReadConfiguration(void); +extern int cupsdWriteErrorLog(int level, const char *message); + + +/* + * End of "$Id: conf.h 9710 2011-04-22 17:47:03Z mike $". + */ diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c new file mode 100644 index 0000000..fc5ebeb --- /dev/null +++ b/scheduler/cups-deviced.c @@ -0,0 +1,825 @@ +/* + * "$Id: cups-deviced.c 9793 2011-05-20 03:49:49Z mike $" + * + * Device scanning mini-daemon for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Scan for devices and return an IPP response. + * add_device() - Add a new device to the list. + * compare_devices() - Compare device names to eliminate duplicates. + * get_current_time() - Get the current time as a double value in seconds. + * get_device() - Get a device from a backend. + * process_children() - Process all dead children... + * sigchld_handler() - Handle 'child' signals from old processes. + * start_backend() - Run a backend to gather the available devices. + */ + +/* + * Include necessary headers... + */ + +#include "util.h" +#include +#include +#include +#include +#include + + +/* + * Constants... + */ + +#define MAX_BACKENDS 200 /* Maximum number of backends we'll run */ + + +/* + * Backend information... + */ + +typedef struct +{ + char *name; /* Name of backend */ + int pid, /* Process ID */ + status; /* Exit status */ + cups_file_t *pipe; /* Pipe from backend stdout */ + int count; /* Number of devices found */ +} cupsd_backend_t; + + +/* + * Device information structure... + */ + +typedef struct +{ + char device_class[128], /* Device class */ + device_info[128], /* Device info/description */ + device_uri[1024]; /* Device URI */ +} cupsd_device_t; + + +/* + * Local globals... + */ + +static int num_backends = 0, + /* Total backends */ + active_backends = 0; + /* Active backends */ +static cupsd_backend_t backends[MAX_BACKENDS]; + /* Array of backends */ +static struct pollfd backend_fds[MAX_BACKENDS]; + /* Array for poll() */ +static cups_array_t *devices; /* Array of devices */ +static int normal_user; /* Normal user ID */ +static int device_limit; /* Maximum number of devices */ +static int send_class, /* Send device-class attribute? */ + send_info, /* Send device-info attribute? */ + send_make_and_model, + /* Send device-make-and-model attribute? */ + send_uri, /* Send device-uri attribute? */ + send_id, /* Send device-id attribute? */ + send_location; /* Send device-location attribute? */ +static int dead_children = 0; + /* Dead children? */ + + +/* + * Local functions... + */ + +static int add_device(const char *device_class, + const char *device_make_and_model, + const char *device_info, + const char *device_uri, + const char *device_id, + const char *device_location); +static int compare_devices(cupsd_device_t *p0, + cupsd_device_t *p1); +static double get_current_time(void); +static int get_device(cupsd_backend_t *backend); +static void process_children(void); +static void sigchld_handler(int sig); +static int start_backend(const char *backend, int root); + + +/* + * 'main()' - Scan for devices and return an IPP response. + * + * Usage: + * + * cups-deviced request_id limit options + */ + +int /* O - Exit code */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int request_id; /* Request ID */ + int timeout; /* Timeout in seconds */ + const char *server_bin; /* CUPS_SERVERBIN environment variable */ + char filename[1024]; /* Backend directory filename */ + cups_dir_t *dir; /* Directory pointer */ + cups_dentry_t *dent; /* Directory entry */ + double current_time, /* Current time */ + end_time; /* Ending time */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + cups_array_t *requested, /* requested-attributes values */ + *exclude, /* exclude-schemes values */ + *include; /* include-schemes values */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + setbuf(stderr, NULL); + + /* + * Check the command-line... + */ + + if (argc != 6) + { + fputs("Usage: cups-deviced request-id limit timeout user-id options\n", stderr); + + return (1); + } + + request_id = atoi(argv[1]); + if (request_id < 1) + { + fprintf(stderr, "ERROR: [cups-deviced] Bad request ID %d!\n", request_id); + + return (1); + } + + device_limit = atoi(argv[2]); + if (device_limit < 0) + { + fprintf(stderr, "ERROR: [cups-deviced] Bad limit %d!\n", device_limit); + + return (1); + } + + timeout = atoi(argv[3]); + if (timeout < 1) + { + fprintf(stderr, "ERROR: [cups-deviced] Bad timeout %d!\n", timeout); + + return (1); + } + + normal_user = atoi(argv[4]); + if (normal_user <= 0) + { + fprintf(stderr, "ERROR: [cups-deviced] Bad user %d!\n", normal_user); + + return (1); + } + + num_options = cupsParseOptions(argv[5], 0, &options); + requested = cupsdCreateStringsArray(cupsGetOption("requested-attributes", + num_options, options)); + exclude = cupsdCreateStringsArray(cupsGetOption("exclude-schemes", + num_options, options)); + include = cupsdCreateStringsArray(cupsGetOption("include-schemes", + num_options, options)); + + if (!requested || cupsArrayFind(requested, "all") != NULL) + { + send_class = send_info = send_make_and_model = send_uri = send_id = + send_location = 1; + } + else + { + send_class = cupsArrayFind(requested, "device-class") != NULL; + send_info = cupsArrayFind(requested, "device-info") != NULL; + send_make_and_model = cupsArrayFind(requested, "device-make-and-model") != NULL; + send_uri = cupsArrayFind(requested, "device-uri") != NULL; + send_id = cupsArrayFind(requested, "device-id") != NULL; + send_location = cupsArrayFind(requested, "device-location") != NULL; + } + + /* + * Listen to child signals... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGCHLD, sigchld_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGCHLD); + action.sa_handler = sigchld_handler; + sigaction(SIGCHLD, &action, NULL); +#else + signal(SIGCLD, sigchld_handler); /* No, SIGCLD isn't a typo... */ +#endif /* HAVE_SIGSET */ + + /* + * Try opening the backend directory... + */ + + if ((server_bin = getenv("CUPS_SERVERBIN")) == NULL) + server_bin = CUPS_SERVERBIN; + + snprintf(filename, sizeof(filename), "%s/backend", server_bin); + + if ((dir = cupsDirOpen(filename)) == NULL) + { + fprintf(stderr, "ERROR: [cups-deviced] Unable to open backend directory " + "\"%s\": %s", filename, strerror(errno)); + + return (1); + } + + /* + * Setup the devices array... + */ + + devices = cupsArrayNew((cups_array_func_t)compare_devices, NULL); + + /* + * Loop through all of the device backends... + */ + + while ((dent = cupsDirRead(dir)) != NULL) + { + /* + * Skip entries that are not executable files... + */ + + if (!S_ISREG(dent->fileinfo.st_mode) || + !isalnum(dent->filename[0] & 255) || + (dent->fileinfo.st_mode & (S_IRUSR | S_IXUSR)) != (S_IRUSR | S_IXUSR)) + continue; + + /* + * Skip excluded or not included backends... + */ + + if (cupsArrayFind(exclude, dent->filename) || + (include && !cupsArrayFind(include, dent->filename))) + continue; + + /* + * Backends without permissions for normal users run as root, + * all others run as the unprivileged user... + */ + + start_backend(dent->filename, + !(dent->fileinfo.st_mode & (S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH))); + } + + cupsDirClose(dir); + + /* + * Collect devices... + */ + + if (getenv("SOFTWARE")) + puts("Content-Type: application/ipp\n"); + + cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", "en-US"); + + end_time = get_current_time() + timeout; + + while (active_backends > 0 && (current_time = get_current_time()) < end_time) + { + /* + * Collect the output from the backends... + */ + + timeout = (int)(1000 * (end_time - current_time)); + + if (poll(backend_fds, num_backends, timeout) > 0) + { + for (i = 0; i < num_backends; i ++) + if (backend_fds[i].revents && backends[i].pipe) + { + cups_file_t *bpipe = backends[i].pipe; + /* Copy of pipe for backend... */ + + do + { + if (get_device(backends + i)) + { + backend_fds[i].fd = 0; + backend_fds[i].events = 0; + break; + } + } + while (bpipe->ptr && + memchr(bpipe->ptr, '\n', bpipe->end - bpipe->ptr)); + } + } + + /* + * Get exit status from children... + */ + + if (dead_children) + process_children(); + } + + cupsdSendIPPTrailer(); + + /* + * Terminate any remaining backends and exit... + */ + + if (active_backends > 0) + { + for (i = 0; i < num_backends; i ++) + if (backends[i].pid) + kill(backends[i].pid, SIGTERM); + } + + return (0); +} + + +/* + * 'add_device()' - Add a new device to the list. + */ + +static int /* O - 0 on success, -1 on error */ +add_device( + const char *device_class, /* I - Device class */ + const char *device_make_and_model, /* I - Device make and model */ + const char *device_info, /* I - Device information */ + const char *device_uri, /* I - Device URI */ + const char *device_id, /* I - 1284 device ID */ + const char *device_location) /* I - Physical location */ +{ + cupsd_device_t *device; /* New device */ + + + /* + * Allocate memory for the device record... + */ + + if ((device = calloc(1, sizeof(cupsd_device_t))) == NULL) + { + fputs("ERROR: [cups-deviced] Ran out of memory allocating a device!\n", + stderr); + return (-1); + } + + /* + * Copy the strings over... + */ + + strlcpy(device->device_class, device_class, sizeof(device->device_class)); + strlcpy(device->device_info, device_info, sizeof(device->device_info)); + strlcpy(device->device_uri, device_uri, sizeof(device->device_uri)); + + /* + * Add the device to the array and return... + */ + + if (cupsArrayFind(devices, device)) + { + /* + * Avoid duplicates! + */ + + free(device); + } + else + { + cupsArrayAdd(devices, device); + + if (device_limit <= 0 || cupsArrayCount(devices) < device_limit) + { + /* + * Send device info... + */ + + cupsdSendIPPGroup(IPP_TAG_PRINTER); + if (send_class) + cupsdSendIPPString(IPP_TAG_KEYWORD, "device-class", + device_class); + if (send_info) + cupsdSendIPPString(IPP_TAG_TEXT, "device-info", device_info); + if (send_make_and_model) + cupsdSendIPPString(IPP_TAG_TEXT, "device-make-and-model", + device_make_and_model); + if (send_uri) + cupsdSendIPPString(IPP_TAG_URI, "device-uri", device_uri); + if (send_id) + cupsdSendIPPString(IPP_TAG_TEXT, "device-id", + device_id ? device_id : ""); + if (send_location) + cupsdSendIPPString(IPP_TAG_TEXT, "device-location", + device_location ? device_location : ""); + + fflush(stdout); + fputs("DEBUG: Flushed attributes...\n", stderr); + } + } + + return (0); +} + + +/* + * 'compare_devices()' - Compare device names to eliminate duplicates. + */ + +static int /* O - Result of comparison */ +compare_devices(cupsd_device_t *d0, /* I - First device */ + cupsd_device_t *d1) /* I - Second device */ +{ + int diff; /* Difference between strings */ + + + /* + * Sort devices by device-info, device-class, and device-uri... + */ + + if ((diff = cupsdCompareNames(d0->device_info, d1->device_info)) != 0) + return (diff); + else if ((diff = _cups_strcasecmp(d0->device_class, d1->device_class)) != 0) + return (diff); + else + return (_cups_strcasecmp(d0->device_uri, d1->device_uri)); +} + + +/* + * 'get_current_time()' - Get the current time as a double value in seconds. + */ + +static double /* O - Time in seconds */ +get_current_time(void) +{ + struct timeval curtime; /* Current time */ + + + gettimeofday(&curtime, NULL); + + return (curtime.tv_sec + 0.000001 * curtime.tv_usec); +} + + +/* + * 'get_device()' - Get a device from a backend. + */ + +static int /* O - 0 on success, -1 on error */ +get_device(cupsd_backend_t *backend) /* I - Backend to read from */ +{ + char line[2048], /* Line from backend */ + temp[2048], /* Copy of line */ + *ptr, /* Pointer into line */ + *dclass, /* Device class */ + *uri, /* Device URI */ + *make_model, /* Make and model */ + *info, /* Device info */ + *device_id, /* 1284 device ID */ + *location; /* Physical location */ + + + if (cupsFileGets(backend->pipe, line, sizeof(line))) + { + /* + * Each line is of the form: + * + * class URI "make model" "name" ["1284 device ID"] ["location"] + */ + + strlcpy(temp, line, sizeof(temp)); + + /* + * device-class + */ + + dclass = temp; + + for (ptr = temp; *ptr; ptr ++) + if (isspace(*ptr & 255)) + break; + + while (isspace(*ptr & 255)) + *ptr++ = '\0'; + + /* + * device-uri + */ + + if (!*ptr) + goto error; + + for (uri = ptr; *ptr; ptr ++) + if (isspace(*ptr & 255)) + break; + + while (isspace(*ptr & 255)) + *ptr++ = '\0'; + + /* + * device-make-and-model + */ + + if (*ptr != '\"') + goto error; + + for (ptr ++, make_model = ptr; *ptr && *ptr != '\"'; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + } + + if (*ptr != '\"') + goto error; + + for (*ptr++ = '\0'; isspace(*ptr & 255); *ptr++ = '\0'); + + /* + * device-info + */ + + if (*ptr != '\"') + goto error; + + for (ptr ++, info = ptr; *ptr && *ptr != '\"'; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + } + + if (*ptr != '\"') + goto error; + + for (*ptr++ = '\0'; isspace(*ptr & 255); *ptr++ = '\0'); + + /* + * device-id + */ + + if (*ptr == '\"') + { + for (ptr ++, device_id = ptr; *ptr != '\"'; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + if (!*ptr) + { + fprintf(stderr, "WARNING: [cups-deviced] Possible newline in device ID \"%s\": %s\n", + backend->name, line); + *ptr = ' '; + ptr ++; + *ptr = 0; + if (!cupsFileGets(backend->pipe, ptr, sizeof(line) - (ptr - temp))) + { + cupsFileClose(backend->pipe); + backend->pipe = NULL; + fprintf(stderr, "ERROR: [cups-deviced] Bad line from \"%s\": %s\n", + backend->name, line); + return (-1); + } + } + if (!*ptr) + goto error; + } + + for (*ptr++ = '\0'; isspace(*ptr & 255); *ptr++ = '\0'); + + /* + * device-location + */ + + if (*ptr == '\"') + { + for (ptr ++, location = ptr; *ptr && *ptr != '\"'; ptr ++) + { + if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + } + + if (*ptr != '\"') + goto error; + + *ptr = '\0'; + } + else + location = NULL; + } + else + { + device_id = NULL; + location = NULL; + } + + /* + * Add the device to the array of available devices... + */ + + if (!add_device(dclass, make_model, info, uri, device_id, location)) + fprintf(stderr, "DEBUG: [cups-deviced] Found device \"%s\"...\n", uri); + + return (0); + } + + /* + * End of file... + */ + + cupsFileClose(backend->pipe); + backend->pipe = NULL; + + return (-1); + + /* + * Bad format; strip trailing newline and write an error message. + */ + + error: + + if (line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = '\0'; + + fprintf(stderr, "ERROR: [cups-deviced] Bad line from \"%s\": %s\n", + backend->name, line); + return (0); +} + + +/* + * 'process_children()' - Process all dead children... + */ + +static void +process_children(void) +{ + int i; /* Looping var */ + int status; /* Exit status of child */ + int pid; /* Process ID of child */ + cupsd_backend_t *backend; /* Current backend */ + const char *name; /* Name of process */ + + + /* + * Reset the dead_children flag... + */ + + dead_children = 0; + + /* + * Collect the exit status of some children... + */ + +#ifdef HAVE_WAITPID + while ((pid = waitpid(-1, &status, WNOHANG)) > 0) +#elif defined(HAVE_WAIT3) + while ((pid = wait3(&status, WNOHANG, NULL)) > 0) +#else + if ((pid = wait(&status)) > 0) +#endif /* HAVE_WAITPID */ + { + if (status == SIGTERM) + status = 0; + + for (i = num_backends, backend = backends; i > 0; i --, backend ++) + if (backend->pid == pid) + break; + + if (i > 0) + { + name = backend->name; + backend->pid = 0; + backend->status = status; + + active_backends --; + } + else + name = "Unknown"; + + if (status) + { + if (WIFEXITED(status)) + fprintf(stderr, + "ERROR: [cups-deviced] PID %d (%s) stopped with status %d!\n", + pid, name, WEXITSTATUS(status)); + else + fprintf(stderr, + "ERROR: [cups-deviced] PID %d (%s) crashed on signal %d!\n", + pid, name, WTERMSIG(status)); + } + else + fprintf(stderr, + "DEBUG: [cups-deviced] PID %d (%s) exited with no errors.\n", + pid, name); + } +} + + +/* + * 'sigchld_handler()' - Handle 'child' signals from old processes. + */ + +static void +sigchld_handler(int sig) /* I - Signal number */ +{ + (void)sig; + + /* + * Flag that we have dead children... + */ + + dead_children = 1; + + /* + * Reset the signal handler as needed... + */ + +#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION) + signal(SIGCLD, sigchld_handler); +#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ +} + + +/* + * 'start_backend()' - Run a backend to gather the available devices. + */ + +static int /* O - 0 on success, -1 on error */ +start_backend(const char *name, /* I - Backend to run */ + int root) /* I - Run as root? */ +{ + const char *server_bin; /* CUPS_SERVERBIN environment variable */ + char program[1024]; /* Full path to backend */ + cupsd_backend_t *backend; /* Current backend */ + char *argv[2]; /* Command-line arguments */ + + + if (num_backends >= MAX_BACKENDS) + { + fprintf(stderr, "ERROR: Too many backends (%d)!\n", num_backends); + return (-1); + } + + if ((server_bin = getenv("CUPS_SERVERBIN")) == NULL) + server_bin = CUPS_SERVERBIN; + + snprintf(program, sizeof(program), "%s/backend/%s", server_bin, name); + + if (_cupsFileCheck(program, _CUPS_FILE_CHECK_PROGRAM, !geteuid(), + _cupsFileCheckFilter, NULL)) + return (-1); + + backend = backends + num_backends; + + argv[0] = (char *)name; + argv[1] = NULL; + + if ((backend->pipe = cupsdPipeCommand(&(backend->pid), program, argv, + root ? 0 : normal_user)) == NULL) + { + fprintf(stderr, "ERROR: [cups-deviced] Unable to execute \"%s\" - %s\n", + program, strerror(errno)); + return (-1); + } + + /* + * Fill in the rest of the backend information... + */ + + fprintf(stderr, "DEBUG: [cups-deviced] Started backend %s (PID %d)\n", + program, backend->pid); + + backend_fds[num_backends].fd = cupsFileNumber(backend->pipe); + backend_fds[num_backends].events = POLLIN; + + backend->name = strdup(name); + backend->status = 0; + backend->count = 0; + + active_backends ++; + num_backends ++; + + return (0); +} + + +/* + * End of "$Id: cups-deviced.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/cups-driverd.cxx b/scheduler/cups-driverd.cxx new file mode 100644 index 0000000..cadb0e6 --- /dev/null +++ b/scheduler/cups-driverd.cxx @@ -0,0 +1,2576 @@ +/* + * "$Id: cups-driverd.cxx 10276 2012-02-13 22:48:22Z mike $" + * + * PPD/driver support for CUPS. + * + * This program handles listing and installing static PPD files, PPD files + * created from driver information files, and dynamically generated PPD files + * using driver helper programs. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Scan for drivers and return an IPP response. + * add_ppd() - Add a PPD file. + * cat_drv() - Generate a PPD from a driver info file. + * cat_ppd() - Copy a PPD file to stdout. + * copy_static() - Copy a static PPD file to stdout. + * compare_inodes() - Compare two inodes. + * compare_matches() - Compare PPD match scores for sorting. + * compare_names() - Compare PPD filenames for sorting. + * compare_ppds() - Compare PPD file make and model names for sorting. + * dump_ppds_dat() - Dump the contents of the ppds.dat file. + * free_array() - Free an array of strings. + * list_ppds() - List PPD files. + * load_drv() - Load the PPDs from a driver information file. + * load_drivers() - Load driver-generated PPD files. + * load_ppds() - Load PPD files recursively. + * load_ppds_dat() - Load the ppds.dat file. + * regex_device_id() - Compile a regular expression based on the 1284 device + * ID. + * regex_string() - Construct a regular expression to compare a simple + * string. + */ + +/* + * Include necessary headers... + */ + +#include "util.h" +#include +#include +#include +#include +#include + + +/* + * Constants... + */ + +#define PPD_SYNC 0x50504437 /* Sync word for ppds.dat (PPD7) */ +#define PPD_MAX_LANG 32 /* Maximum languages */ +#define PPD_MAX_PROD 32 /* Maximum products */ +#define PPD_MAX_VERS 32 /* Maximum versions */ + +#define PPD_TYPE_POSTSCRIPT 0 /* PostScript PPD */ +#define PPD_TYPE_PDF 1 /* PDF PPD */ +#define PPD_TYPE_RASTER 2 /* CUPS raster PPD */ +#define PPD_TYPE_FAX 3 /* Facsimile/MFD PPD */ +#define PPD_TYPE_UNKNOWN 4 /* Other/hybrid PPD */ +#define PPD_TYPE_DRV 5 /* Driver info file */ + +static const char * const ppd_types[] = /* ppd-type values */ +{ + "postscript", + "pdf", + "raster", + "fax", + "unknown", + "drv" +}; + + +/* + * PPD information structures... + */ + +typedef struct /**** PPD record ****/ +{ + time_t mtime; /* Modification time */ + off_t size; /* Size in bytes */ + int model_number; /* cupsModelNumber */ + int type; /* ppd-type */ + char filename[512], /* Filename */ + name[512], /* PPD name */ + languages[PPD_MAX_LANG][6], + /* LanguageVersion/cupsLanguages */ + products[PPD_MAX_PROD][128], + /* Product strings */ + psversions[PPD_MAX_VERS][32], + /* PSVersion strings */ + make[128], /* Manufacturer */ + make_and_model[128], /* NickName/ModelName */ + device_id[256], /* IEEE 1284 Device ID */ + scheme[128]; /* PPD scheme */ +} ppd_rec_t; + +typedef struct /**** In-memory record ****/ +{ + int found; /* 1 if PPD is found */ + int matches; /* Match count */ + ppd_rec_t record; /* PPDs.dat record */ +} ppd_info_t; + + +/* + * Globals... + */ + +cups_array_t *Inodes = NULL, /* Inodes of directories we've visited */ + *PPDsByName = NULL, /* PPD files sorted by filename and name */ + *PPDsByMakeModel = NULL;/* PPD files sorted by make and model */ +int ChangedPPD; /* Did we change the PPD database? */ + + +/* + * Local functions... + */ + +static ppd_info_t *add_ppd(const char *filename, const char *name, + const char *language, const char *make, + const char *make_and_model, + const char *device_id, const char *product, + const char *psversion, time_t mtime, + size_t size, int model_number, int type, + const char *scheme); +static int cat_drv(const char *name, int request_id); +static int cat_ppd(const char *name, int request_id); +static int cat_static(const char *name, int request_id); +static int compare_inodes(struct stat *a, struct stat *b); +static int compare_matches(const ppd_info_t *p0, + const ppd_info_t *p1); +static int compare_names(const ppd_info_t *p0, + const ppd_info_t *p1); +static int compare_ppds(const ppd_info_t *p0, + const ppd_info_t *p1); +static int dump_ppds_dat(void); +static void free_array(cups_array_t *a); +static int list_ppds(int request_id, int limit, const char *opt); +static int load_drivers(cups_array_t *include, + cups_array_t *exclude); +static int load_drv(const char *filename, const char *name, + cups_file_t *fp, time_t mtime, off_t size); +static int load_ppds(const char *d, const char *p, int descend); +static void load_ppds_dat(char *filename, size_t filesize, + int verbose); +static regex_t *regex_device_id(const char *device_id); +static regex_t *regex_string(const char *s); + + +/* + * 'main()' - Scan for drivers and return an IPP response. + * + * Usage: + * + * cups-driverd request_id limit options + */ + +int /* O - Exit code */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + /* + * Install or list PPDs... + */ + + if (argc == 3 && !strcmp(argv[1], "cat")) + return (cat_ppd(argv[2], 0)); + else if (argc == 2 && !strcmp(argv[1], "dump")) + return (dump_ppds_dat()); + else if (argc == 4 && !strcmp(argv[1], "get")) + return (cat_ppd(argv[3], atoi(argv[2]))); + else if (argc == 5 && !strcmp(argv[1], "list")) + return (list_ppds(atoi(argv[2]), atoi(argv[3]), argv[4])); + else + { + fputs("Usage: cups-driverd cat ppd-name\n", stderr); + fputs("Usage: cups-driverd dump\n", stderr); + fputs("Usage: cups-driverd get request_id ppd-name\n", stderr); + fputs("Usage: cups-driverd list request_id limit options\n", stderr); + return (1); + } +} + + +/* + * 'add_ppd()' - Add a PPD file. + */ + +static ppd_info_t * /* O - PPD */ +add_ppd(const char *filename, /* I - PPD filename */ + const char *name, /* I - PPD name */ + const char *language, /* I - LanguageVersion */ + const char *make, /* I - Manufacturer */ + const char *make_and_model, /* I - NickName/ModelName */ + const char *device_id, /* I - 1284DeviceID */ + const char *product, /* I - Product */ + const char *psversion, /* I - PSVersion */ + time_t mtime, /* I - Modification time */ + size_t size, /* I - File size */ + int model_number, /* I - Model number */ + int type, /* I - Driver type */ + const char *scheme) /* I - PPD scheme */ +{ + ppd_info_t *ppd; /* PPD */ + + + /* + * Add a new PPD file... + */ + + if ((ppd = (ppd_info_t *)calloc(1, sizeof(ppd_info_t))) == NULL) + { + fprintf(stderr, + "ERROR: [cups-driverd] Ran out of memory for %d PPD files!\n", + cupsArrayCount(PPDsByName)); + return (NULL); + } + + /* + * Zero-out the PPD data and copy the values over... + */ + + ppd->found = 1; + ppd->record.mtime = mtime; + ppd->record.size = size; + ppd->record.model_number = model_number; + ppd->record.type = type; + + strlcpy(ppd->record.filename, filename, sizeof(ppd->record.filename)); + strlcpy(ppd->record.name, name, sizeof(ppd->record.name)); + strlcpy(ppd->record.languages[0], language, + sizeof(ppd->record.languages[0])); + strlcpy(ppd->record.products[0], product, sizeof(ppd->record.products[0])); + strlcpy(ppd->record.psversions[0], psversion, + sizeof(ppd->record.psversions[0])); + strlcpy(ppd->record.make, make, sizeof(ppd->record.make)); + strlcpy(ppd->record.make_and_model, make_and_model, + sizeof(ppd->record.make_and_model)); + strlcpy(ppd->record.device_id, device_id, sizeof(ppd->record.device_id)); + strlcpy(ppd->record.scheme, scheme, sizeof(ppd->record.scheme)); + + /* + * Add the PPD to the PPD arrays... + */ + + cupsArrayAdd(PPDsByName, ppd); + cupsArrayAdd(PPDsByMakeModel, ppd); + + /* + * Return the new PPD pointer... + */ + + return (ppd); +} + + +/* + * 'cat_drv()' - Generate a PPD from a driver info file. + */ + +static int /* O - Exit code */ +cat_drv(const char *name, /* I - PPD name */ + int request_id) /* I - Request ID for response? */ +{ + const char *datadir; // CUPS_DATADIR env var + ppdcSource *src; // PPD source file data + ppdcDriver *d; // Current driver + cups_file_t *out; // Stdout via CUPS file API + char message[2048], // status-message + filename[1024], // Full path to .drv file(s) + scheme[32], // URI scheme ("drv") + userpass[256], // User/password info (unused) + host[2], // Hostname (unused) + resource[1024], // Resource path (/dir/to/filename.drv) + *pc_file_name; // Filename portion of URI + int port; // Port number (unused) + + + // Determine where CUPS has installed the data files... + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + // Pull out the path to the .drv file... + if (httpSeparateURI(HTTP_URI_CODING_ALL, name, scheme, sizeof(scheme), + userpass, sizeof(userpass), host, sizeof(host), &port, + resource, sizeof(resource)) < HTTP_URI_OK || + strstr(resource, "../") || + (pc_file_name = strrchr(resource, '/')) == NULL || + pc_file_name == resource) + { + fprintf(stderr, "ERROR: Bad PPD name \"%s\"!\n", name); + + if (request_id) + { + snprintf(message, sizeof(message), "Bad PPD name \"%s\"!", name); + + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPString(IPP_TAG_TEXT, "status-message", message); + cupsdSendIPPTrailer(); + } + + return (1); + } + + *pc_file_name++ = '\0'; + +#ifdef __APPLE__ + if (!strncmp(resource, "/Library/Printers/PPDs/Contents/Resources/", 42) || + !strncmp(resource, "/System/Library/Printers/PPDs/Contents/Resources/", 49)) + strlcpy(filename, resource, sizeof(filename)); + else +#endif // __APPLE__ + { + snprintf(filename, sizeof(filename), "%s/drv%s", datadir, resource); + if (access(filename, 0)) + snprintf(filename, sizeof(filename), "%s/model%s", datadir, resource); + } + + src = new ppdcSource(filename); + + for (d = (ppdcDriver *)src->drivers->first(); + d; + d = (ppdcDriver *)src->drivers->next()) + if (!strcmp(pc_file_name, d->pc_file_name->value) || + (d->file_name && !strcmp(pc_file_name, d->file_name->value))) + break; + + if (d) + { + ppdcArray *locales; // Locale names + ppdcCatalog *catalog; // Message catalog in .drv file + + + fprintf(stderr, "DEBUG2: [cups-driverd] %d locales defined in \"%s\"...\n", + src->po_files->count, filename); + + locales = new ppdcArray(); + for (catalog = (ppdcCatalog *)src->po_files->first(); + catalog; + catalog = (ppdcCatalog *)src->po_files->next()) + { + fprintf(stderr, "DEBUG2: [cups-driverd] Adding locale \"%s\"...\n", + catalog->locale->value); + catalog->locale->retain(); + locales->add(catalog->locale); + } + + if (request_id) + { + cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPTrailer(); + fflush(stdout); + } + + out = cupsFileStdout(); + d->write_ppd_file(out, NULL, locales, src, PPDC_LFONLY); + cupsFileClose(out); + + locales->release(); + } + else + { + fprintf(stderr, "ERROR: PPD \"%s\" not found!\n", name); + + if (request_id) + { + snprintf(message, sizeof(message), "PPD \"%s\" not found!", name); + + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPString(IPP_TAG_TEXT, "status-message", message); + cupsdSendIPPTrailer(); + } + } + + src->release(); + + return (!d); +} + + +/* + * 'cat_ppd()' - Copy a PPD file to stdout. + */ + +static int /* O - Exit code */ +cat_ppd(const char *name, /* I - PPD name */ + int request_id) /* I - Request ID for response? */ +{ + char scheme[256], /* Scheme from PPD name */ + *sptr, /* Pointer into scheme */ + line[1024], /* Line/filename */ + message[2048]; /* status-message */ + + + /* + * Figure out if this is a static or dynamic PPD file... + */ + + strlcpy(scheme, name, sizeof(scheme)); + if ((sptr = strchr(scheme, ':')) != NULL) + { + *sptr = '\0'; + + if (!strcmp(scheme, "file")) + { + /* + * "file:name" == "name"... + */ + + name += 5; + scheme[0] = '\0'; + } + } + else + scheme[0] = '\0'; + + if (request_id > 0) + puts("Content-Type: application/ipp\n"); + + if (!scheme[0]) + return (cat_static(name, request_id)); + else if (!strcmp(scheme, "drv")) + return (cat_drv(name, request_id)); + else + { + /* + * Dynamic PPD, see if we have a driver program to support it... + */ + + const char *serverbin; /* CUPS_SERVERBIN env var */ + char *argv[4]; /* Arguments for program */ + + + if ((serverbin = getenv("CUPS_SERVERBIN")) == NULL) + serverbin = CUPS_SERVERBIN; + + snprintf(line, sizeof(line), "%s/driver/%s", serverbin, scheme); + if (access(line, X_OK)) + { + /* + * File does not exist or is not executable... + */ + + fprintf(stderr, "ERROR: [cups-driverd] Unable to access \"%s\" - %s\n", + line, strerror(errno)); + + if (request_id > 0) + { + snprintf(message, sizeof(message), "Unable to access \"%s\" - %s", + line, strerror(errno)); + + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPString(IPP_TAG_TEXT, "status-message", message); + cupsdSendIPPTrailer(); + } + + return (1); + } + + /* + * Yes, let it cat the PPD file... + */ + + if (request_id) + { + cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPTrailer(); + } + + argv[0] = scheme; + argv[1] = (char *)"cat"; + argv[2] = (char *)name; + argv[3] = NULL; + + if (cupsdExec(line, argv)) + { + /* + * Unable to execute driver... + */ + + fprintf(stderr, "ERROR: [cups-driverd] Unable to execute \"%s\" - %s\n", + line, strerror(errno)); + return (1); + } + } + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'copy_static()' - Copy a static PPD file to stdout. + */ + +static int /* O - Exit code */ +cat_static(const char *name, /* I - PPD name */ + int request_id) /* I - Request ID for response? */ +{ + cups_file_t *fp; /* PPD file */ + const char *datadir; /* CUPS_DATADIR env var */ + char line[1024], /* Line/filename */ + message[2048]; /* status-message */ +#ifdef __APPLE__ + const char *printerDriver, /* Pointer to .printerDriver extension */ + *slash; /* Pointer to next slash */ +#endif /* __APPLE__ */ + + + if (name[0] == '/' || strstr(name, "../") || strstr(name, "/..")) + { + /* + * Bad name... + */ + + fprintf(stderr, "ERROR: [cups-driverd] Bad PPD name \"%s\"!\n", name); + + if (request_id) + { + snprintf(message, sizeof(message), "Bad PPD name \"%s\"!", name); + + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPString(IPP_TAG_TEXT, "status-message", message); + cupsdSendIPPTrailer(); + } + + return (1); + } + + /* + * Try opening the file... + */ + +#ifdef __APPLE__ + if (!strncmp(name, "System/Library/Printers/PPDs/Contents/Resources/", 48) || + !strncmp(name, "Library/Printers/PPDs/Contents/Resources/", 41) || + (!strncmp(name, "System/Library/Printers/", 24) && + (printerDriver = + strstr(name + 24, + ".printerDriver/Contents/Resources/PPDs")) != NULL && + (slash = strchr(name + 24, '/')) != NULL && + slash > printerDriver) || + (!strncmp(name, "Library/Printers/", 17) && + (printerDriver = + strstr(name + 17, + ".printerDriver/Contents/Resources/PPDs")) != NULL && + (slash = strchr(name + 17, '/')) != NULL && + slash > printerDriver)) + { + /* + * Map ppd-name to Mac OS X standard locations... + */ + + snprintf(line, sizeof(line), "/%s", name); + } + else + +#elif defined(__linux) + if (!strncmp(name, "lsb/usr/", 8)) + { + /* + * Map ppd-name to LSB standard /usr/share/ppd location... + */ + + snprintf(line, sizeof(line), "/usr/share/ppd/%s", name + 8); + } + else if (!strncmp(name, "lsb/opt/", 8)) + { + /* + * Map ppd-name to LSB standard /opt/share/ppd location... + */ + + snprintf(line, sizeof(line), "/opt/share/ppd/%s", name + 8); + } + else if (!strncmp(name, "lsb/local/", 10)) + { + /* + * Map ppd-name to LSB standard /usr/local/share/ppd location... + */ + + snprintf(line, sizeof(line), "/usr/local/share/ppd/%s", name + 10); + } + else + +#endif /* __APPLE__ */ + { + if ((datadir = getenv("CUPS_DATADIR")) == NULL) + datadir = CUPS_DATADIR; + + snprintf(line, sizeof(line), "%s/model/%s", datadir, name); + } + + if ((fp = cupsFileOpen(line, "r")) == NULL) + { + fprintf(stderr, "ERROR: [cups-driverd] Unable to open \"%s\" - %s\n", + line, strerror(errno)); + + if (request_id) + { + snprintf(message, sizeof(message), "Unable to open \"%s\" - %s", + line, strerror(errno)); + + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPString(IPP_TAG_TEXT, "status-message", message); + cupsdSendIPPTrailer(); + } + + return (1); + } + + if (request_id) + { + cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + cupsdSendIPPTrailer(); + } + + /* + * Now copy the file to stdout... + */ + + while (cupsFileGets(fp, line, sizeof(line))) + puts(line); + + cupsFileClose(fp); + + return (0); +} + + +/* + * 'compare_inodes()' - Compare two inodes. + */ + +static int /* O - Result of comparison */ +compare_inodes(struct stat *a, /* I - First inode */ + struct stat *b) /* I - Second inode */ +{ + if (a->st_dev != b->st_dev) + return (a->st_dev - b->st_dev); + else + return (a->st_ino - b->st_ino); +} + + +/* + * 'compare_matches()' - Compare PPD match scores for sorting. + */ + +static int +compare_matches(const ppd_info_t *p0, /* I - First PPD */ + const ppd_info_t *p1) /* I - Second PPD */ +{ + if (p1->matches != p0->matches) + return (p1->matches - p0->matches); + else + return (cupsdCompareNames(p0->record.make_and_model, + p1->record.make_and_model)); +} + + +/* + * 'compare_names()' - Compare PPD filenames for sorting. + */ + +static int /* O - Result of comparison */ +compare_names(const ppd_info_t *p0, /* I - First PPD file */ + const ppd_info_t *p1) /* I - Second PPD file */ +{ + int diff; /* Difference between strings */ + + + if ((diff = strcmp(p0->record.filename, p1->record.filename)) != 0) + return (diff); + else + return (strcmp(p0->record.name, p1->record.name)); +} + + +/* + * 'compare_ppds()' - Compare PPD file make and model names for sorting. + */ + +static int /* O - Result of comparison */ +compare_ppds(const ppd_info_t *p0, /* I - First PPD file */ + const ppd_info_t *p1) /* I - Second PPD file */ +{ + int diff; /* Difference between strings */ + + + /* + * First compare manufacturers... + */ + + if ((diff = _cups_strcasecmp(p0->record.make, p1->record.make)) != 0) + return (diff); + else if ((diff = cupsdCompareNames(p0->record.make_and_model, + p1->record.make_and_model)) != 0) + return (diff); + else if ((diff = strcmp(p0->record.languages[0], + p1->record.languages[0])) != 0) + return (diff); + else + return (compare_names(p0, p1)); +} + + +/* + * 'dump_ppds_dat()' - Dump the contents of the ppds.dat file. + */ + +static int /* O - Exit status */ +dump_ppds_dat(void) +{ + char filename[1024]; /* ppds.dat filename */ + ppd_info_t *ppd; /* Current PPD */ + + + /* + * See if we a PPD database file... + */ + + load_ppds_dat(filename, sizeof(filename), 0); + + puts("mtime,size,model_number,type,filename,name,languages0,products0," + "psversions0,make,make_and_model,device_id,scheme"); + for (ppd = (ppd_info_t *)cupsArrayFirst(PPDsByName); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(PPDsByName)) + printf("%d,%ld,%d,%d,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"," + "\"%s\",\"%s\"\n", + (int)ppd->record.mtime, (long)ppd->record.size, + ppd->record.model_number, ppd->record.type, ppd->record.filename, + ppd->record.name, ppd->record.languages[0], ppd->record.products[0], + ppd->record.psversions[0], ppd->record.make, + ppd->record.make_and_model, ppd->record.device_id, + ppd->record.scheme); + + return (0); +} + + +/* + * 'free_array()' - Free an array of strings. + */ + +static void +free_array(cups_array_t *a) /* I - Array to free */ +{ + char *ptr; /* Pointer to string */ + + + for (ptr = (char *)cupsArrayFirst(a); + ptr; + ptr = (char *)cupsArrayNext(a)) + free(ptr); + + cupsArrayDelete(a); +} + + +/* + * 'list_ppds()' - List PPD files. + */ + +static int /* O - Exit code */ +list_ppds(int request_id, /* I - Request ID */ + int limit, /* I - Limit */ + const char *opt) /* I - Option argument */ +{ + int i; /* Looping vars */ + int count; /* Number of PPDs to send */ + ppd_info_t *ppd; /* Current PPD file */ + cups_file_t *fp; /* ppds.dat file */ + char filename[1024], /* ppds.dat filename */ + model[1024]; /* Model directory */ + const char *cups_datadir; /* CUPS_DATADIR environment variable */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + cups_array_t *requested, /* requested-attributes values */ + *include, /* PPD schemes to include */ + *exclude; /* PPD schemes to exclude */ + const char *device_id, /* ppd-device-id option */ + *language, /* ppd-natural-language option */ + *make, /* ppd-make option */ + *make_and_model, /* ppd-make-and-model option */ + *model_number_str, /* ppd-model-number option */ + *product, /* ppd-product option */ + *psversion, /* ppd-psversion option */ + *type_str; /* ppd-type option */ + int model_number, /* ppd-model-number value */ + type, /* ppd-type value */ + make_and_model_len, /* Length of ppd-make-and-model */ + product_len, /* Length of ppd-product */ + send_device_id, /* Send ppd-device-id? */ + send_make, /* Send ppd-make? */ + send_make_and_model, /* Send ppd-make-and-model? */ + send_model_number, /* Send ppd-model-number? */ + send_name, /* Send ppd-name? */ + send_natural_language, /* Send ppd-natural-language? */ + send_product, /* Send ppd-product? */ + send_psversion, /* Send ppd-psversion? */ + send_type, /* Send ppd-type? */ + sent_header; /* Sent the IPP header? */ + regex_t *device_id_re, /* Regular expression for matching device ID */ + *make_and_model_re; /* Regular expression for matching make and model */ + regmatch_t re_matches[6]; /* Regular expression matches */ + cups_array_t *matches; /* Matching PPDs */ + + + fprintf(stderr, + "DEBUG2: [cups-driverd] list_ppds(request_id=%d, limit=%d, " + "opt=\"%s\"\n", request_id, limit, opt); + + /* + * See if we a PPD database file... + */ + + load_ppds_dat(filename, sizeof(filename), 1); + + /* + * Load all PPDs in the specified directory and below... + */ + + if ((cups_datadir = getenv("CUPS_DATADIR")) == NULL) + cups_datadir = CUPS_DATADIR; + + Inodes = cupsArrayNew((cups_array_func_t)compare_inodes, NULL); + + snprintf(model, sizeof(model), "%s/model", cups_datadir); + load_ppds(model, "", 1); + + snprintf(model, sizeof(model), "%s/drv", cups_datadir); + load_ppds(model, "", 1); + +#ifdef __APPLE__ + /* + * Load PPDs from standard Mac OS X locations... + */ + + load_ppds("/Library/Printers", + "Library/Printers", 0); + load_ppds("/Library/Printers/PPDs/Contents/Resources", + "Library/Printers/PPDs/Contents/Resources", 0); + load_ppds("/Library/Printers/PPDs/Contents/Resources/en.lproj", + "Library/Printers/PPDs/Contents/Resources/en.lproj", 0); + load_ppds("/System/Library/Printers", + "System/Library/Printers", 0); + load_ppds("/System/Library/Printers/PPDs/Contents/Resources", + "System/Library/Printers/PPDs/Contents/Resources", 0); + load_ppds("/System/Library/Printers/PPDs/Contents/Resources/en.lproj", + "System/Library/Printers/PPDs/Contents/Resources/en.lproj", 0); + +#elif defined(__linux) + /* + * Load PPDs from LSB-defined locations... + */ + + if (!access("/usr/local/share/ppd", 0)) + load_ppds("/usr/local/share/ppd", "lsb/local", 1); + if (!access("/usr/share/ppd", 0)) + load_ppds("/usr/share/ppd", "lsb/usr", 1); + if (!access("/opt/share/ppd", 0)) + load_ppds("/opt/share/ppd", "lsb/opt", 1); +#endif /* __APPLE__ */ + + /* + * Cull PPD files that are no longer present... + */ + + for (ppd = (ppd_info_t *)cupsArrayFirst(PPDsByName); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(PPDsByName)) + if (!ppd->found) + { + /* + * Remove this PPD file from the list... + */ + + cupsArrayRemove(PPDsByName, ppd); + cupsArrayRemove(PPDsByMakeModel, ppd); + free(ppd); + + ChangedPPD = 1; + } + + /* + * Write the new ppds.dat file... + */ + + fprintf(stderr, "DEBUG: [cups-driverd] ChangedPPD=%d\n", ChangedPPD); + + if (ChangedPPD) + { + char newname[1024]; /* New filename */ + + snprintf(newname, sizeof(newname), "%s.%d", filename, (int)getpid()); + + if ((fp = cupsFileOpen(newname, "w")) != NULL) + { + unsigned ppdsync = PPD_SYNC; /* Sync word */ + + cupsFileWrite(fp, (char *)&ppdsync, sizeof(ppdsync)); + + for (ppd = (ppd_info_t *)cupsArrayFirst(PPDsByName); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(PPDsByName)) + cupsFileWrite(fp, (char *)&(ppd->record), sizeof(ppd_rec_t)); + + cupsFileClose(fp); + + if (rename(newname, filename)) + fprintf(stderr, "ERROR: [cups-driverd] Unable to rename \"%s\" - %s\n", + newname, strerror(errno)); + else + fprintf(stderr, "INFO: [cups-driverd] Wrote \"%s\", %d PPDs...\n", + filename, cupsArrayCount(PPDsByName)); + } + else + fprintf(stderr, "ERROR: [cups-driverd] Unable to write \"%s\" - %s\n", + filename, strerror(errno)); + } + else + fputs("INFO: [cups-driverd] No new or changed PPDs...\n", stderr); + + /* + * Scan for dynamic PPD files... + */ + + num_options = cupsParseOptions(opt, 0, &options); + exclude = cupsdCreateStringsArray(cupsGetOption("exclude-schemes", + num_options, options)); + include = cupsdCreateStringsArray(cupsGetOption("include-schemes", + num_options, options)); + + load_drivers(include, exclude); + + /* + * Add the raw driver... + */ + + add_ppd("", "raw", "en", "Raw", "Raw Queue", "", "", "", 0, 0, 0, + PPD_TYPE_UNKNOWN, "raw"); + + /* + * Send IPP attributes... + */ + + requested = cupsdCreateStringsArray( + cupsGetOption("requested-attributes", num_options, + options)); + device_id = cupsGetOption("ppd-device-id", num_options, options); + language = cupsGetOption("ppd-natural-language", num_options, options); + make = cupsGetOption("ppd-make", num_options, options); + make_and_model = cupsGetOption("ppd-make-and-model", num_options, options); + model_number_str = cupsGetOption("ppd-model-number", num_options, options); + product = cupsGetOption("ppd-product", num_options, options); + psversion = cupsGetOption("ppd-psversion", num_options, options); + type_str = cupsGetOption("ppd-type", num_options, options); + + if (make_and_model) + make_and_model_len = strlen(make_and_model); + else + make_and_model_len = 0; + + if (product) + product_len = strlen(product); + else + product_len = 0; + + if (model_number_str) + model_number = atoi(model_number_str); + else + model_number = 0; + + if (type_str) + { + for (type = 0; + type < (int)(sizeof(ppd_types) / sizeof(ppd_types[0])); + type ++) + if (!strcmp(type_str, ppd_types[type])) + break; + + if (type >= (int)(sizeof(ppd_types) / sizeof(ppd_types[0]))) + { + fprintf(stderr, "ERROR: [cups-driverd] Bad ppd-type=\"%s\" ignored!\n", + type_str); + type_str = NULL; + } + } + else + type = 0; + + for (i = 0; i < num_options; i ++) + fprintf(stderr, "DEBUG2: [cups-driverd] %s=\"%s\"\n", options[i].name, + options[i].value); + + if (!requested || cupsArrayFind(requested, (void *)"all") != NULL) + { + send_name = 1; + send_make = 1; + send_make_and_model = 1; + send_model_number = 1; + send_natural_language = 1; + send_device_id = 1; + send_product = 1; + send_psversion = 1; + send_type = 1; + } + else + { + send_name = cupsArrayFind(requested, + (void *)"ppd-name") != NULL; + send_make = cupsArrayFind(requested, + (void *)"ppd-make") != NULL; + send_make_and_model = cupsArrayFind(requested, + (void *)"ppd-make-and-model") != NULL; + send_model_number = cupsArrayFind(requested, + (void *)"ppd-model-number") != NULL; + send_natural_language = cupsArrayFind(requested, + (void *)"ppd-natural-language") != NULL; + send_device_id = cupsArrayFind(requested, + (void *)"ppd-device-id") != NULL; + send_product = cupsArrayFind(requested, + (void *)"ppd-product") != NULL; + send_psversion = cupsArrayFind(requested, + (void *)"ppd-psversion") != NULL; + send_type = cupsArrayFind(requested, + (void *)"ppd-type") != NULL; + } + + /* + * Send the content type header to the scheduler; request_id can only be + * 0 when run manually since the scheduler enforces the IPP requirement for + * a request ID from 1 to 2^31-1... + */ + + if (request_id > 0) + puts("Content-Type: application/ipp\n"); + + sent_header = 0; + + if (limit <= 0 || limit > cupsArrayCount(PPDsByMakeModel)) + count = cupsArrayCount(PPDsByMakeModel); + else + count = limit; + + if (device_id || language || make || make_and_model || model_number_str || + product) + { + matches = cupsArrayNew((cups_array_func_t)compare_matches, NULL); + + if (device_id) + device_id_re = regex_device_id(device_id); + else + device_id_re = NULL; + + if (make_and_model) + make_and_model_re = regex_string(make_and_model); + else + make_and_model_re = NULL; + + for (ppd = (ppd_info_t *)cupsArrayFirst(PPDsByMakeModel); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(PPDsByMakeModel)) + { + /* + * Filter PPDs based on make, model, product, language, model number, + * and/or device ID using the "matches" score value. An exact match + * for product, make-and-model, or device-id adds 3 to the score. + * Partial matches for make-and-model yield 1 or 2 points, and matches + * for the make and language add a single point. Results are then sorted + * by score, highest score first. + */ + + if (ppd->record.type < PPD_TYPE_POSTSCRIPT || + ppd->record.type >= PPD_TYPE_DRV) + continue; + + if (cupsArrayFind(exclude, ppd->record.scheme) || + (include && !cupsArrayFind(include, ppd->record.scheme))) + continue; + + ppd->matches = 0; + + if (device_id_re && + !regexec(device_id_re, ppd->record.device_id, + (int)(sizeof(re_matches) / sizeof(re_matches[0])), + re_matches, 0)) + { + /* + * Add the number of matching values from the device ID - it will be + * at least 2 (manufacturer and model), and as much as 3 (command set). + */ + + for (i = 1; i < (int)(sizeof(re_matches) / sizeof(re_matches[0])); i ++) + if (re_matches[i].rm_so >= 0) + ppd->matches ++; + } + + if (language) + { + for (i = 0; i < PPD_MAX_LANG; i ++) + if (!ppd->record.languages[i][0]) + break; + else if (!strcmp(ppd->record.languages[i], language)) + { + ppd->matches ++; + break; + } + } + + if (make && !_cups_strcasecmp(ppd->record.make, make)) + ppd->matches ++; + + if (make_and_model_re && + !regexec(make_and_model_re, ppd->record.make_and_model, + (int)(sizeof(re_matches) / sizeof(re_matches[0])), + re_matches, 0)) + { + // See how much of the make-and-model string we matched... + if (re_matches[0].rm_so == 0) + { + if (re_matches[0].rm_eo == make_and_model_len) + ppd->matches += 3; // Exact match + else + ppd->matches += 2; // Prefix match + } + else + ppd->matches ++; // Infix match + } + + if (model_number_str && ppd->record.model_number == model_number) + ppd->matches ++; + + if (product) + { + for (i = 0; i < PPD_MAX_PROD; i ++) + if (!ppd->record.products[i][0]) + break; + else if (!_cups_strcasecmp(ppd->record.products[i], product)) + { + ppd->matches += 3; + break; + } + else if (!_cups_strncasecmp(ppd->record.products[i], product, + product_len)) + { + ppd->matches += 2; + break; + } + } + + if (psversion) + { + for (i = 0; i < PPD_MAX_VERS; i ++) + if (!ppd->record.psversions[i][0]) + break; + else if (!_cups_strcasecmp(ppd->record.psversions[i], psversion)) + { + ppd->matches ++; + break; + } + } + + if (type_str && ppd->record.type == type) + ppd->matches ++; + + if (ppd->matches) + { + fprintf(stderr, "DEBUG2: [cups-driverd] %s matches with score %d!\n", + ppd->record.name, ppd->matches); + cupsArrayAdd(matches, ppd); + } + } + } + else if (include || exclude) + { + matches = cupsArrayNew((cups_array_func_t)compare_ppds, NULL); + + for (ppd = (ppd_info_t *)cupsArrayFirst(PPDsByMakeModel); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(PPDsByMakeModel)) + { + /* + * Filter PPDs based on the include/exclude lists. + */ + + if (ppd->record.type < PPD_TYPE_POSTSCRIPT || + ppd->record.type >= PPD_TYPE_DRV) + continue; + + if (cupsArrayFind(exclude, ppd->record.scheme) || + (include && !cupsArrayFind(include, ppd->record.scheme))) + continue; + + cupsArrayAdd(matches, ppd); + } + } + else + matches = PPDsByMakeModel; + + for (ppd = (ppd_info_t *)cupsArrayFirst(matches); + count > 0 && ppd; + ppd = (ppd_info_t *)cupsArrayNext(matches)) + { + /* + * Skip invalid PPDs... + */ + + if (ppd->record.type < PPD_TYPE_POSTSCRIPT || + ppd->record.type >= PPD_TYPE_DRV) + continue; + + /* + * Send this PPD... + */ + + if (!sent_header) + { + sent_header = 1; + + cupsdSendIPPHeader(IPP_OK, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", + "en-US"); + } + + fprintf(stderr, "DEBUG2: [cups-driverd] Sending %s (%s)...\n", + ppd->record.name, ppd->record.make_and_model); + + count --; + + cupsdSendIPPGroup(IPP_TAG_PRINTER); + + if (send_name) + cupsdSendIPPString(IPP_TAG_NAME, "ppd-name", ppd->record.name); + + if (send_natural_language) + { + cupsdSendIPPString(IPP_TAG_LANGUAGE, "ppd-natural-language", + ppd->record.languages[0]); + + for (i = 1; i < PPD_MAX_LANG && ppd->record.languages[i][0]; i ++) + cupsdSendIPPString(IPP_TAG_LANGUAGE, "", ppd->record.languages[i]); + } + + if (send_make) + cupsdSendIPPString(IPP_TAG_TEXT, "ppd-make", ppd->record.make); + + if (send_make_and_model) + cupsdSendIPPString(IPP_TAG_TEXT, "ppd-make-and-model", + ppd->record.make_and_model); + + if (send_device_id) + cupsdSendIPPString(IPP_TAG_TEXT, "ppd-device-id", + ppd->record.device_id); + + if (send_product) + { + cupsdSendIPPString(IPP_TAG_TEXT, "ppd-product", + ppd->record.products[0]); + + for (i = 1; i < PPD_MAX_PROD && ppd->record.products[i][0]; i ++) + cupsdSendIPPString(IPP_TAG_TEXT, "", ppd->record.products[i]); + } + + if (send_psversion) + { + cupsdSendIPPString(IPP_TAG_TEXT, "ppd-psversion", + ppd->record.psversions[0]); + + for (i = 1; i < PPD_MAX_VERS && ppd->record.psversions[i][0]; i ++) + cupsdSendIPPString(IPP_TAG_TEXT, "", ppd->record.psversions[i]); + } + + if (send_type) + cupsdSendIPPString(IPP_TAG_KEYWORD, "ppd-type", + ppd_types[ppd->record.type]); + + if (send_model_number) + cupsdSendIPPInteger(IPP_TAG_INTEGER, "ppd-model-number", + ppd->record.model_number); + + /* + * If we have only requested the ppd-make attribute, then skip + * the remaining PPDs with this make... + */ + + if (cupsArrayFind(requested, (void *)"ppd-make") && + cupsArrayCount(requested) == 1) + { + const char *this_make; /* This ppd-make */ + + + for (this_make = ppd->record.make, + ppd = (ppd_info_t *)cupsArrayNext(matches); + ppd; + ppd = (ppd_info_t *)cupsArrayNext(matches)) + if (_cups_strcasecmp(this_make, ppd->record.make)) + break; + + cupsArrayPrev(matches); + } + } + + if (!sent_header) + { + cupsdSendIPPHeader(IPP_NOT_FOUND, request_id); + cupsdSendIPPGroup(IPP_TAG_OPERATION); + cupsdSendIPPString(IPP_TAG_CHARSET, "attributes-charset", "utf-8"); + cupsdSendIPPString(IPP_TAG_LANGUAGE, "attributes-natural-language", "en-US"); + } + + cupsdSendIPPTrailer(); + + return (0); +} + + +/* + * 'load_drv()' - Load the PPDs from a driver information file. + */ + +static int /* O - 1 on success, 0 on failure */ +load_drv(const char *filename, /* I - Actual filename */ + const char *name, /* I - Name to the rest of the world */ + cups_file_t *fp, /* I - File to read from */ + time_t mtime, /* I - Mod time of driver info file */ + off_t size) /* I - Size of driver info file */ +{ + ppdcSource *src; // Driver information file + ppdcDriver *d; // Current driver + ppdcAttr *device_id, // 1284DeviceID attribute + *product, // Current product value + *ps_version, // PSVersion attribute + *cups_fax, // cupsFax attribute + *nick_name; // NickName attribute + ppdcFilter *filter; // Current filter + ppd_info_t *ppd; // Current PPD + int products_found; // Number of products found + char uri[1024], // Driver URI + make_model[1024]; // Make and model + int type; // Driver type + + + /* + * Load the driver info file... + */ + + src = new ppdcSource(filename, fp); + + if (src->drivers->count == 0) + { + fprintf(stderr, + "ERROR: [cups-driverd] Bad driver information file \"%s\"!\n", + filename); + src->release(); + return (0); + } + + /* + * Add a dummy entry for the file... + */ + + add_ppd(name, name, "", "", "", "", "", "", mtime, size, 0, + PPD_TYPE_DRV, "drv"); + ChangedPPD = 1; + + /* + * Then the drivers in the file... + */ + + for (d = (ppdcDriver *)src->drivers->first(); + d; + d = (ppdcDriver *)src->drivers->next()) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "drv", "", "", 0, + "/%s/%s", name, + d->file_name ? d->file_name->value : + d->pc_file_name->value); + + device_id = d->find_attr("1284DeviceID", NULL); + ps_version = d->find_attr("PSVersion", NULL); + nick_name = d->find_attr("NickName", NULL); + + if (nick_name) + strlcpy(make_model, nick_name->value->value, sizeof(make_model)); + else if (_cups_strncasecmp(d->model_name->value, d->manufacturer->value, + strlen(d->manufacturer->value))) + snprintf(make_model, sizeof(make_model), "%s %s, %s", + d->manufacturer->value, d->model_name->value, + d->version->value); + else + snprintf(make_model, sizeof(make_model), "%s, %s", d->model_name->value, + d->version->value); + + if ((cups_fax = d->find_attr("cupsFax", NULL)) != NULL && + !_cups_strcasecmp(cups_fax->value->value, "true")) + type = PPD_TYPE_FAX; + else if (d->type == PPDC_DRIVER_PS) + type = PPD_TYPE_POSTSCRIPT; + else if (d->type != PPDC_DRIVER_CUSTOM) + type = PPD_TYPE_RASTER; + else + { + for (filter = (ppdcFilter *)d->filters->first(), + type = PPD_TYPE_POSTSCRIPT; + filter; + filter = (ppdcFilter *)d->filters->next()) + if (_cups_strcasecmp(filter->mime_type->value, "application/vnd.cups-raster")) + type = PPD_TYPE_RASTER; + else if (_cups_strcasecmp(filter->mime_type->value, + "application/vnd.cups-pdf")) + type = PPD_TYPE_PDF; + } + + for (product = (ppdcAttr *)d->attrs->first(), products_found = 0, + ppd = NULL; + product; + product = (ppdcAttr *)d->attrs->next()) + if (!strcmp(product->name->value, "Product")) + { + if (!products_found) + ppd = add_ppd(name, uri, "en", d->manufacturer->value, make_model, + device_id ? device_id->value->value : "", + product->value->value, + ps_version ? ps_version->value->value : "(3010) 0", + mtime, size, d->model_number, type, "drv"); + else if (products_found < PPD_MAX_PROD) + strlcpy(ppd->record.products[products_found], product->value->value, + sizeof(ppd->record.products[0])); + else + break; + + products_found ++; + } + + if (!products_found) + add_ppd(name, uri, "en", d->manufacturer->value, make_model, + device_id ? device_id->value->value : "", + d->model_name->value, + ps_version ? ps_version->value->value : "(3010) 0", + mtime, size, d->model_number, type, "drv"); + } + + src->release(); + + return (1); +} + + +/* + * 'load_drivers()' - Load driver-generated PPD files. + */ + +static int /* O - 1 on success, 0 on failure */ +load_drivers(cups_array_t *include, /* I - Drivers to include */ + cups_array_t *exclude) /* I - Drivers to exclude */ +{ + int i; /* Looping var */ + char *start, /* Start of value */ + *ptr; /* Pointer into string */ + const char *server_bin, /* CUPS_SERVERBIN env variable */ + *scheme, /* Scheme for this driver */ + *scheme_end; /* Pointer to end of scheme */ + char drivers[1024]; /* Location of driver programs */ + int pid; /* Process ID for driver program */ + cups_file_t *fp; /* Pipe to driver program */ + cups_dir_t *dir; /* Directory pointer */ + cups_dentry_t *dent; /* Directory entry */ + char *argv[3], /* Arguments for command */ + filename[1024], /* Name of driver */ + line[2048], /* Line from driver */ + name[512], /* ppd-name */ + make[128], /* ppd-make */ + make_and_model[128], /* ppd-make-and-model */ + device_id[256], /* ppd-device-id */ + languages[128], /* ppd-natural-language */ + product[128], /* ppd-product */ + psversion[128], /* ppd-psversion */ + type_str[128]; /* ppd-type */ + int type; /* PPD type */ + ppd_info_t *ppd; /* Newly added PPD */ + + + /* + * Try opening the driver directory... + */ + + if ((server_bin = getenv("CUPS_SERVERBIN")) == NULL) + server_bin = CUPS_SERVERBIN; + + snprintf(drivers, sizeof(drivers), "%s/driver", server_bin); + + if ((dir = cupsDirOpen(drivers)) == NULL) + { + fprintf(stderr, "ERROR: [cups-driverd] Unable to open driver directory " + "\"%s\": %s\n", + drivers, strerror(errno)); + return (0); + } + + /* + * Loop through all of the device drivers... + */ + + argv[1] = (char *)"list"; + argv[2] = NULL; + + while ((dent = cupsDirRead(dir)) != NULL) + { + /* + * Only look at executable files... + */ + + if (!(dent->fileinfo.st_mode & 0111) || !S_ISREG(dent->fileinfo.st_mode)) + continue; + + /* + * Include/exclude specific drivers... + */ + + if (exclude) + { + /* + * Look for "scheme" or "scheme*" (prefix match), and skip any matches. + */ + + for (scheme = (char *)cupsArrayFirst(exclude); + scheme; + scheme = (char *)cupsArrayNext(exclude)) + { + fprintf(stderr, "DEBUG: [cups-driverd] Exclude \"%s\" with \"%s\"?\n", + dent->filename, scheme); + scheme_end = scheme + strlen(scheme) - 1; + + if ((scheme_end > scheme && *scheme_end == '*' && + !strncmp(scheme, dent->filename, scheme_end - scheme)) || + !strcmp(scheme, dent->filename)) + { + fputs("DEBUG: [cups-driverd] Yes, exclude!\n", stderr); + break; + } + } + + if (scheme) + continue; + } + + if (include) + { + /* + * Look for "scheme" or "scheme*" (prefix match), and skip any non-matches. + */ + + for (scheme = (char *)cupsArrayFirst(include); + scheme; + scheme = (char *)cupsArrayNext(include)) + { + fprintf(stderr, "DEBUG: [cups-driverd] Include \"%s\" with \"%s\"?\n", + dent->filename, scheme); + scheme_end = scheme + strlen(scheme) - 1; + + if ((scheme_end > scheme && *scheme_end == '*' && + !strncmp(scheme, dent->filename, scheme_end - scheme)) || + !strcmp(scheme, dent->filename)) + { + fputs("DEBUG: [cups-driverd] Yes, include!\n", stderr); + break; + } + } + + if (!scheme) + continue; + } + else + scheme = dent->filename; + + /* + * Run the driver with no arguments and collect the output... + */ + + snprintf(filename, sizeof(filename), "%s/%s", drivers, dent->filename); + + if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !geteuid(), + _cupsFileCheckFilter, NULL)) + continue; + + argv[0] = dent->filename; + + if ((fp = cupsdPipeCommand(&pid, filename, argv, 0)) != NULL) + { + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Each line is of the form: + * + * "ppd-name" ppd-natural-language "ppd-make" "ppd-make-and-model" \ + * "ppd-device-id" "ppd-product" "ppd-psversion" + */ + + device_id[0] = '\0'; + product[0] = '\0'; + psversion[0] = '\0'; + strcpy(type_str, "postscript"); + + if (sscanf(line, "\"%511[^\"]\"%127s%*[ \t]\"%127[^\"]\"" + "%*[ \t]\"%127[^\"]\"%*[ \t]\"%255[^\"]\"" + "%*[ \t]\"%127[^\"]\"%*[ \t]\"%127[^\"]\"" + "%*[ \t]\"%127[^\"]\"", + name, languages, make, make_and_model, + device_id, product, psversion, type_str) < 4) + { + /* + * Bad format; strip trailing newline and write an error message. + */ + + if (line[strlen(line) - 1] == '\n') + line[strlen(line) - 1] = '\0'; + + fprintf(stderr, "ERROR: [cups-driverd] Bad line from \"%s\": %s\n", + dent->filename, line); + break; + } + else + { + /* + * Add the device to the array of available devices... + */ + + if ((start = strchr(languages, ',')) != NULL) + *start++ = '\0'; + + for (type = 0; + type < (int)(sizeof(ppd_types) / sizeof(ppd_types[0])); + type ++) + if (!strcmp(type_str, ppd_types[type])) + break; + + if (type >= (int)(sizeof(ppd_types) / sizeof(ppd_types[0]))) + { + fprintf(stderr, + "ERROR: [cups-driverd] Bad ppd-type \"%s\" ignored!\n", + type_str); + type = PPD_TYPE_UNKNOWN; + } + + ppd = add_ppd(filename, name, languages, make, make_and_model, + device_id, product, psversion, 0, 0, 0, type, scheme); + + if (!ppd) + { + cupsDirClose(dir); + cupsFileClose(fp); + return (0); + } + + if (start && *start) + { + for (i = 1; i < PPD_MAX_LANG && *start; i ++) + { + if ((ptr = strchr(start, ',')) != NULL) + *ptr++ = '\0'; + else + ptr = start + strlen(start); + + strlcpy(ppd->record.languages[i], start, + sizeof(ppd->record.languages[0])); + + start = ptr; + } + } + + fprintf(stderr, "DEBUG2: [cups-driverd] Added dynamic PPD \"%s\"...\n", + name); + } + } + + cupsFileClose(fp); + } + else + fprintf(stderr, "WARNING: [cups-driverd] Unable to execute \"%s\": %s\n", + filename, strerror(errno)); + } + + cupsDirClose(dir); + + return (1); +} + + +/* + * 'load_ppds()' - Load PPD files recursively. + */ + +static int /* O - 1 on success, 0 on failure */ +load_ppds(const char *d, /* I - Actual directory */ + const char *p, /* I - Virtual path in name */ + int descend) /* I - Descend into directories? */ +{ + struct stat dinfo, /* Directory information */ + *dinfoptr; /* Pointer to match */ + int i; /* Looping var */ + cups_file_t *fp; /* Pointer to file */ + cups_dir_t *dir; /* Directory pointer */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024], /* Name of PPD or directory */ + line[256], /* Line from backend */ + *ptr, /* Pointer into name */ + name[128], /* Name of PPD file */ + lang_version[64], /* PPD LanguageVersion */ + lang_encoding[64], /* PPD LanguageEncoding */ + country[64], /* Country code */ + manufacturer[256], /* Manufacturer */ + make_model[256], /* Make and Model */ + model_name[256], /* ModelName */ + nick_name[256], /* NickName */ + device_id[256], /* 1284DeviceID */ + product[256], /* Product */ + psversion[256], /* PSVersion */ + temp[512]; /* Temporary make and model */ + int install_group, /* In the installable options group? */ + model_number, /* cupsModelNumber */ + type; /* ppd-type */ + cups_array_t *products, /* Product array */ + *psversions, /* PSVersion array */ + *cups_languages; /* cupsLanguages array */ + ppd_info_t *ppd, /* New PPD file */ + key; /* Search key */ + int new_ppd; /* Is this a new PPD? */ + struct /* LanguageVersion translation table */ + { + const char *version, /* LanguageVersion string */ + *language; /* Language code */ + } languages[] = + { + { "chinese", "zh" }, + { "czech", "cs" }, + { "danish", "da" }, + { "dutch", "nl" }, + { "english", "en" }, + { "finnish", "fi" }, + { "french", "fr" }, + { "german", "de" }, + { "greek", "el" }, + { "hungarian", "hu" }, + { "italian", "it" }, + { "japanese", "ja" }, + { "korean", "ko" }, + { "norwegian", "no" }, + { "polish", "pl" }, + { "portuguese", "pt" }, + { "russian", "ru" }, + { "simplified chinese", "zh_CN" }, + { "slovak", "sk" }, + { "spanish", "es" }, + { "swedish", "sv" }, + { "traditional chinese", "zh_TW" }, + { "turkish", "tr" } + }; + + + /* + * See if we've loaded this directory before... + */ + + if (stat(d, &dinfo)) + { + if (errno != ENOENT) + fprintf(stderr, "ERROR: [cups-driverd] Unable to stat \"%s\": %s\n", d, + strerror(errno)); + + return (0); + } + else if (cupsArrayFind(Inodes, &dinfo)) + { + fprintf(stderr, "ERROR: [cups-driverd] Skipping \"%s\": loop detected!\n", + d); + return (0); + } + + /* + * Nope, add it to the Inodes array and continue... + */ + + dinfoptr = (struct stat *)malloc(sizeof(struct stat)); + memcpy(dinfoptr, &dinfo, sizeof(struct stat)); + cupsArrayAdd(Inodes, dinfoptr); + + /* + * Check permissions... + */ + + if (_cupsFileCheck(d, _CUPS_FILE_CHECK_DIRECTORY, !geteuid(), + _cupsFileCheckFilter, NULL)) + return (0); + + if ((dir = cupsDirOpen(d)) == NULL) + { + if (errno != ENOENT) + fprintf(stderr, + "ERROR: [cups-driverd] Unable to open PPD directory \"%s\": %s\n", + d, strerror(errno)); + + return (0); + } + + fprintf(stderr, "DEBUG: [cups-driverd] Loading \"%s\"...\n", d); + + while ((dent = cupsDirRead(dir)) != NULL) + { + /* + * Skip files/directories starting with "."... + */ + + if (dent->filename[0] == '.') + continue; + + /* + * See if this is a file... + */ + + snprintf(filename, sizeof(filename), "%s/%s", d, dent->filename); + + if (p[0]) + snprintf(name, sizeof(name), "%s/%s", p, dent->filename); + else + strlcpy(name, dent->filename, sizeof(name)); + + if (S_ISDIR(dent->fileinfo.st_mode)) + { + /* + * Do subdirectory... + */ + + if (descend) + { + if (!load_ppds(filename, name, 1)) + { + cupsDirClose(dir); + return (1); + } + } + else if ((ptr = filename + strlen(filename) - 14) > filename && + !strcmp(ptr, ".printerDriver")) + { + /* + * Load PPDs in a printer driver bundle. + */ + + if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_DIRECTORY, !geteuid(), + _cupsFileCheckFilter, NULL)) + continue; + + strlcat(filename, "/Contents/Resources/PPDs", sizeof(filename)); + strlcat(name, "/Contents/Resources/PPDs", sizeof(name)); + + load_ppds(filename, name, 0); + } + + continue; + } + else if ((ptr = filename + strlen(filename) - 6) > filename && + !strcmp(ptr, ".plist")) + { + /* + * Skip plist files in the PPDs directory... + */ + + continue; + } + else if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_FILE_ONLY, !geteuid(), + _cupsFileCheckFilter, NULL)) + continue; + + /* + * See if this file has been scanned before... + */ + + strcpy(key.record.filename, name); + strcpy(key.record.name, name); + + ppd = (ppd_info_t *)cupsArrayFind(PPDsByName, &key); + + if (ppd && + ppd->record.size == dent->fileinfo.st_size && + ppd->record.mtime == dent->fileinfo.st_mtime) + { + /* + * Rewind to the first entry for this file... + */ + + while ((ppd = (ppd_info_t *)cupsArrayPrev(PPDsByName)) != NULL && + !strcmp(ppd->record.filename, name)); + + /* + * Then mark all of the matches for this file as found... + */ + + while ((ppd = (ppd_info_t *)cupsArrayNext(PPDsByName)) != NULL && + !strcmp(ppd->record.filename, name)) + ppd->found = 1; + + continue; + } + + /* + * No, file is new/changed, so re-scan it... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + continue; + + /* + * Now see if this is a PPD file... + */ + + line[0] = '\0'; + cupsFileGets(fp, line, sizeof(line)); + + if (strncmp(line, "*PPD-Adobe:", 11)) + { + /* + * Nope, treat it as a driver information file... + */ + + load_drv(filename, name, fp, dent->fileinfo.st_mtime, + dent->fileinfo.st_size); + continue; + } + + /* + * Now read until we get the NickName field... + */ + + cups_languages = cupsArrayNew(NULL, NULL); + products = cupsArrayNew(NULL, NULL); + psversions = cupsArrayNew(NULL, NULL); + + model_name[0] = '\0'; + nick_name[0] = '\0'; + manufacturer[0] = '\0'; + device_id[0] = '\0'; + lang_encoding[0] = '\0'; + strcpy(lang_version, "en"); + model_number = 0; + install_group = 0; + type = PPD_TYPE_POSTSCRIPT; + + while (cupsFileGets(fp, line, sizeof(line)) != NULL) + { + if (!strncmp(line, "*Manufacturer:", 14)) + sscanf(line, "%*[^\"]\"%255[^\"]", manufacturer); + else if (!strncmp(line, "*ModelName:", 11)) + sscanf(line, "%*[^\"]\"%127[^\"]", model_name); + else if (!strncmp(line, "*LanguageEncoding:", 18)) + sscanf(line, "%*[^:]:%63s", lang_encoding); + else if (!strncmp(line, "*LanguageVersion:", 17)) + sscanf(line, "%*[^:]:%63s", lang_version); + else if (!strncmp(line, "*NickName:", 10)) + sscanf(line, "%*[^\"]\"%255[^\"]", nick_name); + else if (!_cups_strncasecmp(line, "*1284DeviceID:", 14)) + { + sscanf(line, "%*[^\"]\"%255[^\"]", device_id); + + // Make sure device ID ends with a semicolon... + if (device_id[0] && device_id[strlen(device_id) - 1] != ';') + strlcat(device_id, ";", sizeof(device_id)); + } + else if (!strncmp(line, "*Product:", 9)) + { + if (sscanf(line, "%*[^\"]\"(%255[^\"]", product) == 1) + { + /* + * Make sure the value ends with a right parenthesis - can't stop at + * the first right paren since the product name may contain escaped + * parenthesis... + */ + + ptr = product + strlen(product) - 1; + if (ptr > product && *ptr == ')') + { + /* + * Yes, ends with a parenthesis, so remove it from the end and + * add the product to the list... + */ + + *ptr = '\0'; + cupsArrayAdd(products, strdup(product)); + } + } + } + else if (!strncmp(line, "*PSVersion:", 11)) + { + sscanf(line, "%*[^\"]\"%255[^\"]", psversion); + cupsArrayAdd(psversions, strdup(psversion)); + } + else if (!strncmp(line, "*cupsLanguages:", 15)) + { + char *start; /* Start of language */ + + + for (start = line + 15; *start && isspace(*start & 255); start ++); + + if (*start++ == '\"') + { + while (*start) + { + for (ptr = start + 1; + *ptr && *ptr != '\"' && !isspace(*ptr & 255); + ptr ++); + + if (*ptr) + { + *ptr++ = '\0'; + + while (isspace(*ptr & 255)) + *ptr++ = '\0'; + } + + cupsArrayAdd(cups_languages, strdup(start)); + start = ptr; + } + } + } + else if (!strncmp(line, "*cupsFax:", 9)) + { + for (ptr = line + 9; isspace(*ptr & 255); ptr ++); + + if (!_cups_strncasecmp(ptr, "true", 4)) + type = PPD_TYPE_FAX; + } + else if (!strncmp(line, "*cupsFilter:", 12) && type == PPD_TYPE_POSTSCRIPT) + { + if (strstr(line + 12, "application/vnd.cups-raster")) + type = PPD_TYPE_RASTER; + else if (strstr(line + 12, "application/vnd.cups-pdf")) + type = PPD_TYPE_PDF; + } + else if (!strncmp(line, "*cupsModelNumber:", 17)) + sscanf(line, "*cupsModelNumber:%d", &model_number); + else if (!strncmp(line, "*OpenGroup: Installable", 23)) + install_group = 1; + else if (!strncmp(line, "*CloseGroup:", 12)) + install_group = 0; + else if (!strncmp(line, "*OpenUI", 7)) + { + /* + * Stop early if we have a NickName or ModelName attributes + * before the first non-installable OpenUI... + */ + + if (!install_group && (model_name[0] || nick_name[0]) && + cupsArrayCount(products) > 0 && cupsArrayCount(psversions) > 0) + break; + } + } + + /* + * Close the file... + */ + + cupsFileClose(fp); + + /* + * See if we got all of the required info... + */ + + if (nick_name[0]) + cupsCharsetToUTF8((cups_utf8_t *)make_model, nick_name, + sizeof(make_model), _ppdGetEncoding(lang_encoding)); + else + strcpy(make_model, model_name); + + while (isspace(make_model[0] & 255)) + _cups_strcpy(make_model, make_model + 1); + + if (!make_model[0] || cupsArrayCount(products) == 0 || + cupsArrayCount(psversions) == 0) + { + /* + * We don't have all the info needed, so skip this file... + */ + + if (!make_model[0]) + fprintf(stderr, "WARNING: Missing NickName and ModelName in %s!\n", + filename); + + if (cupsArrayCount(products) == 0) + fprintf(stderr, "WARNING: Missing Product in %s!\n", filename); + + if (cupsArrayCount(psversions) == 0) + fprintf(stderr, "WARNING: Missing PSVersion in %s!\n", filename); + + free_array(products); + free_array(psversions); + free_array(cups_languages); + + continue; + } + + if (model_name[0]) + cupsArrayAdd(products, strdup(model_name)); + + /* + * Normalize the make and model string... + */ + + while (isspace(manufacturer[0] & 255)) + _cups_strcpy(manufacturer, manufacturer + 1); + + if (!_cups_strncasecmp(make_model, manufacturer, strlen(manufacturer))) + strlcpy(temp, make_model, sizeof(temp)); + else + snprintf(temp, sizeof(temp), "%s %s", manufacturer, make_model); + + _ppdNormalizeMakeAndModel(temp, make_model, sizeof(make_model)); + + /* + * See if we got a manufacturer... + */ + + if (!manufacturer[0] || !strcmp(manufacturer, "ESP")) + { + /* + * Nope, copy the first part of the make and model then... + */ + + strlcpy(manufacturer, make_model, sizeof(manufacturer)); + + /* + * Truncate at the first space, dash, or slash, or make the + * manufacturer "Other"... + */ + + for (ptr = manufacturer; *ptr; ptr ++) + if (*ptr == ' ' || *ptr == '-' || *ptr == '/') + break; + + if (*ptr && ptr > manufacturer) + *ptr = '\0'; + else + strcpy(manufacturer, "Other"); + } + else if (!_cups_strncasecmp(manufacturer, "LHAG", 4) || + !_cups_strncasecmp(manufacturer, "linotype", 8)) + strcpy(manufacturer, "LHAG"); + else if (!_cups_strncasecmp(manufacturer, "Hewlett", 7)) + strcpy(manufacturer, "HP"); + + /* + * Fix the lang_version as needed... + */ + + if ((ptr = strchr(lang_version, '-')) != NULL) + *ptr++ = '\0'; + else if ((ptr = strchr(lang_version, '_')) != NULL) + *ptr++ = '\0'; + + if (ptr) + { + /* + * Setup the country suffix... + */ + + country[0] = '_'; + _cups_strcpy(country + 1, ptr); + } + else + { + /* + * No country suffix... + */ + + country[0] = '\0'; + } + + for (i = 0; i < (int)(sizeof(languages) / sizeof(languages[0])); i ++) + if (!_cups_strcasecmp(languages[i].version, lang_version)) + break; + + if (i < (int)(sizeof(languages) / sizeof(languages[0]))) + { + /* + * Found a known language... + */ + + snprintf(lang_version, sizeof(lang_version), "%s%s", + languages[i].language, country); + } + else + { + /* + * Unknown language; use "xx"... + */ + + strcpy(lang_version, "xx"); + } + + /* + * Record the PPD file... + */ + + new_ppd = !ppd; + + if (new_ppd) + { + /* + * Add new PPD file... + */ + + fprintf(stderr, "DEBUG2: [cups-driverd] Adding ppd \"%s\"...\n", name); + + ppd = add_ppd(name, name, lang_version, manufacturer, make_model, + device_id, (char *)cupsArrayFirst(products), + (char *)cupsArrayFirst(psversions), + dent->fileinfo.st_mtime, dent->fileinfo.st_size, + model_number, type, "file"); + + if (!ppd) + { + cupsDirClose(dir); + return (0); + } + } + else + { + /* + * Update existing record... + */ + + fprintf(stderr, "DEBUG2: [cups-driverd] Updating ppd \"%s\"...\n", name); + + memset(ppd, 0, sizeof(ppd_info_t)); + + ppd->found = 1; + ppd->record.mtime = dent->fileinfo.st_mtime; + ppd->record.size = dent->fileinfo.st_size; + ppd->record.model_number = model_number; + ppd->record.type = type; + + strlcpy(ppd->record.filename, name, sizeof(ppd->record.filename)); + strlcpy(ppd->record.name, name, sizeof(ppd->record.name)); + strlcpy(ppd->record.languages[0], lang_version, + sizeof(ppd->record.languages[0])); + strlcpy(ppd->record.products[0], (char *)cupsArrayFirst(products), + sizeof(ppd->record.products[0])); + strlcpy(ppd->record.psversions[0], (char *)cupsArrayFirst(psversions), + sizeof(ppd->record.psversions[0])); + strlcpy(ppd->record.make, manufacturer, sizeof(ppd->record.make)); + strlcpy(ppd->record.make_and_model, make_model, + sizeof(ppd->record.make_and_model)); + strlcpy(ppd->record.device_id, device_id, sizeof(ppd->record.device_id)); + strlcpy(ppd->record.scheme, "file", sizeof(ppd->record.scheme)); + } + + /* + * Add remaining products, versions, and languages... + */ + + for (i = 1; + i < PPD_MAX_PROD && (ptr = (char *)cupsArrayNext(products)) != NULL; + i ++) + strlcpy(ppd->record.products[i], ptr, + sizeof(ppd->record.products[0])); + + for (i = 1; + i < PPD_MAX_VERS && (ptr = (char *)cupsArrayNext(psversions)) != NULL; + i ++) + strlcpy(ppd->record.psversions[i], ptr, + sizeof(ppd->record.psversions[0])); + + for (i = 1, ptr = (char *)cupsArrayFirst(cups_languages); + i < PPD_MAX_LANG && ptr; + i ++, ptr = (char *)cupsArrayNext(cups_languages)) + strlcpy(ppd->record.languages[i], ptr, + sizeof(ppd->record.languages[0])); + + /* + * Free products, versions, and languages... + */ + + free_array(cups_languages); + free_array(products); + free_array(psversions); + + ChangedPPD = 1; + } + + cupsDirClose(dir); + + return (1); +} + + +/* + * 'load_ppds_dat()' - Load the ppds.dat file. + */ + +static void +load_ppds_dat(char *filename, /* I - Filename buffer */ + size_t filesize, /* I - Size of filename buffer */ + int verbose) /* I - Be verbose? */ +{ + ppd_info_t *ppd; /* Current PPD file */ + cups_file_t *fp; /* ppds.dat file */ + struct stat fileinfo; /* ppds.dat information */ + const char *cups_cachedir; /* CUPS_CACHEDIR environment variable */ + + + PPDsByName = cupsArrayNew((cups_array_func_t)compare_names, NULL); + PPDsByMakeModel = cupsArrayNew((cups_array_func_t)compare_ppds, NULL); + ChangedPPD = 0; + + if ((cups_cachedir = getenv("CUPS_CACHEDIR")) == NULL) + cups_cachedir = CUPS_CACHEDIR; + + snprintf(filename, filesize, "%s/ppds.dat", cups_cachedir); + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + /* + * See if we have the right sync word... + */ + + unsigned ppdsync; /* Sync word */ + int num_ppds; /* Number of PPDs */ + + if (cupsFileRead(fp, (char *)&ppdsync, sizeof(ppdsync)) + == sizeof(ppdsync) && + ppdsync == PPD_SYNC && + !stat(filename, &fileinfo) && + ((fileinfo.st_size - sizeof(ppdsync)) % sizeof(ppd_rec_t)) == 0 && + (num_ppds = (fileinfo.st_size - sizeof(ppdsync)) / + sizeof(ppd_rec_t)) > 0) + { + /* + * We have a ppds.dat file, so read it! + */ + + for (; num_ppds > 0; num_ppds --) + { + if ((ppd = (ppd_info_t *)calloc(1, sizeof(ppd_info_t))) == NULL) + { + if (verbose) + fputs("ERROR: [cups-driverd] Unable to allocate memory for PPD!\n", + stderr); + exit(1); + } + + if (cupsFileRead(fp, (char *)&(ppd->record), sizeof(ppd_rec_t)) > 0) + { + cupsArrayAdd(PPDsByName, ppd); + cupsArrayAdd(PPDsByMakeModel, ppd); + } + else + { + free(ppd); + break; + } + } + + if (verbose) + fprintf(stderr, "INFO: [cups-driverd] Read \"%s\", %d PPDs...\n", + filename, cupsArrayCount(PPDsByName)); + } + + cupsFileClose(fp); + } +} + + +/* + * 'regex_device_id()' - Compile a regular expression based on the 1284 device + * ID. + */ + +static regex_t * /* O - Regular expression */ +regex_device_id(const char *device_id) /* I - IEEE-1284 device ID */ +{ + char res[2048], /* Regular expression string */ + *ptr; /* Pointer into string */ + regex_t *re; /* Regular expression */ + int cmd; /* Command set string? */ + + + fprintf(stderr, "DEBUG: [cups-driverd] regex_device_id(\"%s\")\n", device_id); + + /* + * Scan the device ID string and insert class, command set, manufacturer, and + * model attributes to match. We assume that the device ID in the PPD and the + * device ID reported by the device itself use the same attribute names and + * order of attributes. + */ + + ptr = res; + + while (*device_id && ptr < (res + sizeof(res) - 6)) + { + cmd = !_cups_strncasecmp(device_id, "COMMAND SET:", 12) || + !_cups_strncasecmp(device_id, "CMD:", 4); + + if (cmd || !_cups_strncasecmp(device_id, "MANUFACTURER:", 13) || + !_cups_strncasecmp(device_id, "MFG:", 4) || + !_cups_strncasecmp(device_id, "MFR:", 4) || + !_cups_strncasecmp(device_id, "MODEL:", 6) || + !_cups_strncasecmp(device_id, "MDL:", 4)) + { + if (ptr > res) + { + *ptr++ = '.'; + *ptr++ = '*'; + } + + *ptr++ = '('; + + while (*device_id && *device_id != ';' && ptr < (res + sizeof(res) - 8)) + { + if (strchr("[]{}().*\\|", *device_id)) + *ptr++ = '\\'; + if (*device_id == ':') + { + /* + * KEY:.*value + */ + + *ptr++ = *device_id++; + *ptr++ = '.'; + *ptr++ = '*'; + } + else + *ptr++ = *device_id++; + } + + if (*device_id == ';' || !*device_id) + { + /* + * KEY:.*value.*; + */ + + *ptr++ = '.'; + *ptr++ = '*'; + *ptr++ = ';'; + } + *ptr++ = ')'; + if (cmd) + *ptr++ = '?'; + } + else if ((device_id = strchr(device_id, ';')) == NULL) + break; + else + device_id ++; + } + + *ptr = '\0'; + + fprintf(stderr, "DEBUG: [cups-driverd] regex_device_id: \"%s\"\n", res); + + /* + * Compile the regular expression and return... + */ + + if (res[0] && (re = (regex_t *)calloc(1, sizeof(regex_t))) != NULL) + { + if (!regcomp(re, res, REG_EXTENDED | REG_ICASE)) + { + fputs("DEBUG: [cups-driverd] regex_device_id: OK\n", stderr); + return (re); + } + + free(re); + } + + return (NULL); +} + + +/* + * 'regex_string()' - Construct a regular expression to compare a simple string. + */ + +static regex_t * /* O - Regular expression */ +regex_string(const char *s) /* I - String to compare */ +{ + char res[2048], /* Regular expression string */ + *ptr; /* Pointer into string */ + regex_t *re; /* Regular expression */ + + + fprintf(stderr, "DEBUG: [cups-driverd] regex_string(\"%s\")\n", s); + + /* + * Convert the string to a regular expression, escaping special characters + * as needed. + */ + + ptr = res; + + while (*s && ptr < (res + sizeof(res) - 2)) + { + if (strchr("[]{}().*\\", *s)) + *ptr++ = '\\'; + + *ptr++ = *s++; + } + + *ptr = '\0'; + + fprintf(stderr, "DEBUG: [cups-driverd] regex_string: \"%s\"\n", res); + + /* + * Create a case-insensitive regular expression... + */ + + if (res[0] && (re = (regex_t *)calloc(1, sizeof(regex_t))) != NULL) + { + if (!regcomp(re, res, REG_ICASE)) + { + fputs("DEBUG: [cups-driverd] regex_string: OK\n", stderr); + return (re); + } + + free(re); + } + + return (NULL); +} + + +/* + * End of "$Id: cups-driverd.cxx 10276 2012-02-13 22:48:22Z mike $". + */ diff --git a/scheduler/cups-exec.c b/scheduler/cups-exec.c new file mode 100644 index 0000000..6918c7f --- /dev/null +++ b/scheduler/cups-exec.c @@ -0,0 +1,108 @@ +/* + * "$Id: cups-exec.c 9931 2011-08-29 20:12:39Z mike $" + * + * Sandbox helper for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Usage: + * + * cups-exec /path/to/profile /path/to/program argv0 argv1 ... argvN + * + * Contents: + * + * main() - Apply sandbox profile and execute program. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#ifdef HAVE_SANDBOX_H +# include +# ifndef SANDBOX_NAMED_EXTERNAL +# define SANDBOX_NAMED_EXTERNAL 0x0003 +# endif /* !SANDBOX_NAMED_EXTERNAL */ +#endif /* HAVE_SANDBOX_H */ + + +/* + * 'main()' - Apply sandbox profile and execute program. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ +#ifdef HAVE_SANDBOX_H + char *sandbox_error = NULL; /* Sandbox error, if any */ +#endif /* HAVE_SANDBOX_H */ + + + /* + * Check that we have enough arguments... + */ + + if (argc < 4) + { + puts("Usage: cups-exec /path/to/profile /path/to/program argv0 argv1 ... " + "argvN"); + return (1); + } + +#ifdef HAVE_SANDBOX_H + /* + * Run in a separate security profile... + */ + + if (strcmp(argv[1], "none") && + sandbox_init(argv[1], SANDBOX_NAMED_EXTERNAL, &sandbox_error)) + { + fprintf(stderr, "DEBUG: sandbox_init failed: %s (%s)\n", sandbox_error, + strerror(errno)); + sandbox_free_error(sandbox_error); + return (1); + } +#endif /* HAVE_SANDBOX_H */ + + /* + * Close file descriptors we don't need (insurance): + * + * 0 = stdin + * 1 = stdout + * 2 = stderr + * 3 = back-channel + * 4 = side-channel + * 5-N = unused + */ + + for (i = 5; i < 1024; i ++) + close(i); + + /* + * Execute the program... + */ + + execv(argv[2], argv + 3); + + /* + * If we get here, execv() failed... + */ + + fprintf(stderr, "DEBUG: execv failed: %s\n", strerror(errno)); + return (1); +} + + +/* + * End of "$Id: cups-exec.c 9931 2011-08-29 20:12:39Z mike $". + */ diff --git a/scheduler/cups-lpd.c b/scheduler/cups-lpd.c new file mode 100644 index 0000000..7846ecf --- /dev/null +++ b/scheduler/cups-lpd.c @@ -0,0 +1,1627 @@ +/* + * "$Id: cups-lpd.c 10379 2012-03-23 22:16:22Z mike $" + * + * Line Printer Daemon interface for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Process an incoming LPD request... + * create_job() - Create a new print job. + * get_printer() - Get the named printer and its options. + * print_file() - Add a file to the current job. + * recv_print_job() - Receive a print job from the client. + * remove_jobs() - Cancel one or more jobs. + * send_state() - Send the queue state. + * smart_gets() - Get a line of text, removing the trailing CR and/or LF. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_INTTYPES_H +# include +#endif /* HAVE_INTTYPES_H */ + + +/* + * LPD "mini-daemon" for CUPS. This program must be used in conjunction + * with inetd or another similar program that monitors ports and starts + * daemons for each client connection. A typical configuration is: + * + * printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd + * + * This daemon implements most of RFC 1179 (the unofficial LPD specification) + * except for: + * + * - This daemon does not check to make sure that the source port is + * between 721 and 731, since it isn't necessary for proper + * functioning and port-based security is no security at all! + * + * - The "Print any waiting jobs" command is a no-op. + * + * The LPD-to-IPP mapping is as defined in RFC 2569. The report formats + * currently match the Solaris LPD mini-daemon. + */ + +/* + * Prototypes... + */ + +static int create_job(http_t *http, const char *dest, const char *title, + const char *docname, const char *user, + int num_options, cups_option_t *options); +static int get_printer(http_t *http, const char *name, char *dest, + int destsize, cups_option_t **options, + int *accepting, int *shared, ipp_pstate_t *state); +static int print_file(http_t *http, int id, const char *filename, + const char *docname, const char *user, + const char *format, int last); +static int recv_print_job(const char *name, int num_defaults, + cups_option_t *defaults); +static int remove_jobs(const char *name, const char *agent, + const char *list); +static int send_state(const char *name, const char *list, + int longstatus); +static char *smart_gets(char *s, int len, FILE *fp); + + +/* + * 'main()' - Process an incoming LPD request... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int num_defaults; /* Number of default options */ + cups_option_t *defaults; /* Default options */ + char line[256], /* Command string */ + command, /* Command code */ + *dest, /* Pointer to destination */ + *list, /* Pointer to list */ + *agent, /* Pointer to user */ + status; /* Status for client */ + socklen_t hostlen; /* Size of client address */ + http_addr_t hostaddr; /* Address of client */ + char hostname[256], /* Name of client */ + hostip[256], /* IP address */ + *hostfamily; /* Address family */ + int hostlookups; /* Do hostname lookups? */ + + + /* + * Don't buffer the output... + */ + + setbuf(stdout, NULL); + + /* + * Log things using the "cups-lpd" name... + */ + + openlog("cups-lpd", LOG_PID, LOG_LPR); + + /* + * Scan the command-line for options... + */ + + num_defaults = 0; + defaults = NULL; + hostlookups = 1; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'h' : /* -h hostname[:port] */ + if (argv[i][2]) + cupsSetServer(argv[i] + 2); + else + { + i ++; + if (i < argc) + cupsSetServer(argv[i]); + else + syslog(LOG_WARNING, "Expected hostname string after -h option!"); + } + break; + + case 'o' : /* Option */ + if (argv[i][2]) + num_defaults = cupsParseOptions(argv[i] + 2, num_defaults, + &defaults); + else + { + i ++; + if (i < argc) + num_defaults = cupsParseOptions(argv[i], num_defaults, + &defaults); + else + syslog(LOG_WARNING, "Expected option string after -o option!"); + } + break; + + case 'n' : /* Don't do hostname lookups */ + hostlookups = 0; + break; + + default : + syslog(LOG_WARNING, "Unknown option \"%c\" ignored!", argv[i][1]); + break; + } + } + else + syslog(LOG_WARNING, "Unknown command-line option \"%s\" ignored!", + argv[i]); + + /* + * Get the address of the client... + */ + + hostlen = sizeof(hostaddr); + + if (getpeername(0, (struct sockaddr *)&hostaddr, &hostlen)) + { + syslog(LOG_WARNING, "Unable to get client address - %s", strerror(errno)); + strcpy(hostname, "unknown"); + } + else + { + httpAddrString(&hostaddr, hostip, sizeof(hostip)); + + if (hostlookups) + httpAddrLookup(&hostaddr, hostname, sizeof(hostname)); + else + strlcpy(hostname, hostip, sizeof(hostname)); + +#ifdef AF_INET6 + if (hostaddr.addr.sa_family == AF_INET6) + hostfamily = "IPv6"; + else +#endif /* AF_INET6 */ + hostfamily = "IPv4"; + + syslog(LOG_INFO, "Connection from %s (%s %s)", hostname, hostfamily, + hostip); + } + + num_defaults = cupsAddOption("job-originating-host-name", hostname, + num_defaults, &defaults); + + /* + * RFC1179 specifies that only 1 daemon command can be received for + * every connection. + */ + + if (smart_gets(line, sizeof(line), stdin) == NULL) + { + /* + * Unable to get command from client! Send an error status and return. + */ + + syslog(LOG_ERR, "Unable to get command line from client!"); + putchar(1); + return (1); + } + + /* + * The first byte is the command byte. After that will be the queue name, + * resource list, and/or user name. + */ + + command = line[0]; + dest = line + 1; + + if (command == 0x02) + list = NULL; + else + { + for (list = dest; *list && !isspace(*list & 255); list ++); + + while (isspace(*list & 255)) + *list++ = '\0'; + } + + /* + * Do the command... + */ + + switch (command) + { + default : /* Unknown command */ + syslog(LOG_ERR, "Unknown LPD command 0x%02X!", command); + syslog(LOG_ERR, "Command line = %s", line + 1); + putchar(1); + + status = 1; + break; + + case 0x01 : /* Print any waiting jobs */ + syslog(LOG_INFO, "Print waiting jobs (no-op)"); + putchar(0); + + status = 0; + break; + + case 0x02 : /* Receive a printer job */ + syslog(LOG_INFO, "Receive print job for %s", dest); + /* recv_print_job() sends initial status byte */ + + status = recv_print_job(dest, num_defaults, defaults); + break; + + case 0x03 : /* Send queue state (short) */ + syslog(LOG_INFO, "Send queue state (short) for %s %s", dest, list); + /* no status byte for this command */ + + status = send_state(dest, list, 0); + break; + + case 0x04 : /* Send queue state (long) */ + syslog(LOG_INFO, "Send queue state (long) for %s %s", dest, list); + /* no status byte for this command */ + + status = send_state(dest, list, 1); + break; + + case 0x05 : /* Remove jobs */ + if (list) + { + /* + * Grab the agent and skip to the list of users and/or jobs. + */ + + agent = list; + + for (; *list && !isspace(*list & 255); list ++); + while (isspace(*list & 255)) + *list++ = '\0'; + + syslog(LOG_INFO, "Remove jobs %s on %s by %s", list, dest, agent); + + status = remove_jobs(dest, agent, list); + } + else + status = 1; + + putchar(status); + break; + } + + syslog(LOG_INFO, "Closing connection"); + closelog(); + + return (status); +} + + +/* + * 'create_job()' - Create a new print job. + */ + +static int /* O - Job ID or -1 on error */ +create_job(http_t *http, /* I - HTTP connection */ + const char *dest, /* I - Destination name */ + const char *title, /* I - job-name */ + const char *docname, /* I - Name of job file */ + const char *user, /* I - requesting-user-name */ + int num_options, /* I - Number of options for job */ + cups_option_t *options) /* I - Options for job */ +{ + ipp_t *request; /* IPP request */ + ipp_t *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + int id; /* Job ID */ + + + /* + * Setup the Create-Job request... + */ + + request = ippNewRequest(IPP_CREATE_JOB); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + if (title[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", + NULL, title); + + if (docname[0]) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "document-name", + NULL, docname); + + cupsEncodeOptions(request, num_options, options); + + /* + * Do the request... + */ + + snprintf(uri, sizeof(uri), "/printers/%s", dest); + + response = cupsDoRequest(http, request, uri); + + if (!response || cupsLastError() > IPP_OK_CONFLICT) + { + syslog(LOG_ERR, "Unable to create job - %s", cupsLastErrorString()); + + ippDelete(response); + + return (-1); + } + + /* + * Get the job-id value from the response and return it... + */ + + if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL) + { + id = -1; + + syslog(LOG_ERR, "No job-id attribute found in response from server!"); + } + else + { + id = attr->values[0].integer; + + syslog(LOG_INFO, "Print file - job ID = %d", id); + } + + ippDelete(response); + + return (id); +} + + +/* + * 'get_printer()' - Get the named printer and its options. + */ + +static int /* O - Number of options or -1 on error */ +get_printer(http_t *http, /* I - HTTP connection */ + const char *name, /* I - Printer name from request */ + char *dest, /* I - Destination buffer */ + int destsize, /* I - Size of destination buffer */ + cups_option_t **options, /* O - Printer options */ + int *accepting, /* O - printer-is-accepting-jobs value */ + int *shared, /* O - printer-is-shared value */ + ipp_pstate_t *state) /* O - printer-state value */ +{ + int num_options; /* Number of options */ + cups_file_t *fp; /* lpoptions file */ + char line[1024], /* Line from lpoptions file */ + *value, /* Pointer to value on line */ + *optptr; /* Pointer to options on line */ + int linenum; /* Line number in file */ + const char *cups_serverroot; /* CUPS_SERVERROOT env var */ + ipp_t *request; /* IPP request */ + ipp_t *response; /* IPP response */ + ipp_attribute_t *attr; /* IPP attribute */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + static const char * const requested[] = + { /* Requested attributes */ + "printer-info", + "printer-is-accepting-jobs", + "printer-is-shared", + "printer-name", + "printer-state" + }; + + + /* + * Initialize everything... + */ + + if (accepting) + *accepting = 0; + if (shared) + *shared = 0; + if (state) + *state = IPP_PRINTER_STOPPED; + if (options) + *options = NULL; + + /* + * See if the name is a queue name optionally with an instance name. + */ + + strlcpy(dest, name, destsize); + if ((value = strchr(dest, '/')) != NULL) + *value = '\0'; + + /* + * Setup the Get-Printer-Attributes request... + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(requested) / sizeof(requested[0])), + NULL, requested); + + /* + * Do the request... + */ + + response = cupsDoRequest(http, request, "/"); + + if (!response || cupsLastError() > IPP_OK_CONFLICT) + { + /* + * If we can't find the printer by name, look up the printer-name + * using the printer-info values... + */ + + ipp_attribute_t *accepting_attr,/* printer-is-accepting-jobs */ + *info_attr, /* printer-info */ + *name_attr, /* printer-name */ + *shared_attr, /* printer-is-shared */ + *state_attr; /* printer-state */ + + + ippDelete(response); + + /* + * Setup the CUPS-Get-Printers request... + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + (int)(sizeof(requested) / sizeof(requested[0])), + NULL, requested); + + /* + * Do the request... + */ + + response = cupsDoRequest(http, request, "/"); + + if (!response || cupsLastError() > IPP_OK_CONFLICT) + { + syslog(LOG_ERR, "Unable to get list of printers - %s", + cupsLastErrorString()); + + ippDelete(response); + + return (-1); + } + + /* + * Scan the response for printers... + */ + + *dest = '\0'; + attr = response->attrs; + + while (attr) + { + /* + * Skip to the next printer... + */ + + while (attr && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (!attr) + break; + + /* + * Get all of the attributes for the current printer... + */ + + accepting_attr = NULL; + info_attr = NULL; + name_attr = NULL; + shared_attr = NULL; + state_attr = NULL; + + while (attr && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "printer-is-accepting-jobs") && + attr->value_tag == IPP_TAG_BOOLEAN) + accepting_attr = attr; + else if (!strcmp(attr->name, "printer-info") && + attr->value_tag == IPP_TAG_TEXT) + info_attr = attr; + else if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + name_attr = attr; + else if (!strcmp(attr->name, "printer-is-shared") && + attr->value_tag == IPP_TAG_BOOLEAN) + shared_attr = attr; + else if (!strcmp(attr->name, "printer-state") && + attr->value_tag == IPP_TAG_ENUM) + state_attr = attr; + + attr = attr->next; + } + + if (info_attr && name_attr && + !_cups_strcasecmp(name, info_attr->values[0].string.text)) + { + /* + * Found a match, use this one! + */ + + strlcpy(dest, name_attr->values[0].string.text, destsize); + + if (accepting && accepting_attr) + *accepting = accepting_attr->values[0].boolean; + + if (shared && shared_attr) + *shared = shared_attr->values[0].boolean; + + if (state && state_attr) + *state = (ipp_pstate_t)state_attr->values[0].integer; + + break; + } + } + + ippDelete(response); + + if (!*dest) + { + syslog(LOG_ERR, "Unable to find \"%s\" in list of printers!", name); + + return (-1); + } + + name = dest; + } + else + { + /* + * Get values from the response... + */ + + if (accepting) + { + if ((attr = ippFindAttribute(response, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN)) == NULL) + syslog(LOG_ERR, "No printer-is-accepting-jobs attribute found in " + "response from server!"); + else + *accepting = attr->values[0].boolean; + } + + if (shared) + { + if ((attr = ippFindAttribute(response, "printer-is-shared", + IPP_TAG_BOOLEAN)) == NULL) + { + syslog(LOG_ERR, "No printer-is-shared attribute found in " + "response from server!"); + *shared = 1; + } + else + *shared = attr->values[0].boolean; + } + + if (state) + { + if ((attr = ippFindAttribute(response, "printer-state", + IPP_TAG_ENUM)) == NULL) + syslog(LOG_ERR, "No printer-state attribute found in " + "response from server!"); + else + *state = (ipp_pstate_t)attr->values[0].integer; + } + + ippDelete(response); + } + + /* + * Next look for the printer in the lpoptions file... + */ + + num_options = 0; + + if (options && shared && accepting) + { + if ((cups_serverroot = getenv("CUPS_SERVERROOT")) == NULL) + cups_serverroot = CUPS_SERVERROOT; + + snprintf(line, sizeof(line), "%s/lpoptions", cups_serverroot); + if ((fp = cupsFileOpen(line, "r")) != NULL) + { + linenum = 0; + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Make sure we have "Dest name options" or "Default name options"... + */ + + if ((_cups_strcasecmp(line, "Dest") && _cups_strcasecmp(line, "Default")) || !value) + continue; + + /* + * Separate destination name from options... + */ + + for (optptr = value; *optptr && !isspace(*optptr & 255); optptr ++); + + while (*optptr == ' ') + *optptr++ = '\0'; + + /* + * If this is our destination, parse the options and break out of + * the loop - we're done! + */ + + if (!_cups_strcasecmp(value, name)) + { + num_options = cupsParseOptions(optptr, num_options, options); + break; + } + } + + cupsFileClose(fp); + } + } + else if (options) + *options = NULL; + + /* + * Return the number of options for this destination... + */ + + return (num_options); +} + + +/* + * 'print_file()' - Add a file to the current job. + */ + +static int /* O - 0 on success, -1 on failure */ +print_file(http_t *http, /* I - HTTP connection */ + int id, /* I - Job ID */ + const char *filename, /* I - File to print */ + const char *docname, /* I - document-name */ + const char *user, /* I - requesting-user-name */ + const char *format, /* I - document-format */ + int last) /* I - 1 = last file in job */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + + + /* + * Setup the Send-Document request... + */ + + request = ippNewRequest(IPP_SEND_DOCUMENT); + + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + + if (docname) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "document-name", NULL, docname); + + if (format) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, + "document-format", NULL, format); + + if (last) + ippAddBoolean(request, IPP_TAG_OPERATION, "last-document", 1); + + /* + * Do the request... + */ + + snprintf(uri, sizeof(uri), "/jobs/%d", id); + + ippDelete(cupsDoFileRequest(http, request, uri, filename)); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + syslog(LOG_ERR, "Unable to send document - %s", cupsLastErrorString()); + + return (-1); + } + + return (0); +} + + +/* + * 'recv_print_job()' - Receive a print job from the client. + */ + +static int /* O - Command status */ +recv_print_job( + const char *queue, /* I - Printer name */ + int num_defaults, /* I - Number of default options */ + cups_option_t *defaults) /* I - Default options */ +{ + http_t *http; /* HTTP connection */ + int i; /* Looping var */ + int status; /* Command status */ + int fd; /* Temporary file */ + FILE *fp; /* File pointer */ + char filename[1024]; /* Temporary filename */ + int bytes; /* Bytes received */ + char line[256], /* Line from file/stdin */ + command, /* Command from line */ + *count, /* Number of bytes */ + *name; /* Name of file */ + const char *job_sheets; /* Job sheets */ + int num_data; /* Number of data files */ + char control[1024], /* Control filename */ + data[100][256], /* Data files */ + temp[100][1024]; /* Temporary files */ + char user[1024], /* User name */ + title[1024], /* Job title */ + docname[1024], /* Document name */ + dest[256]; /* Printer/class queue */ + int accepting, /* printer-is-accepting */ + shared, /* printer-is-shared */ + num_options; /* Number of options */ + cups_option_t *options; /* Options */ + int id; /* Job ID */ + int docnumber, /* Current document number */ + doccount; /* Count of documents */ + + + /* + * Connect to the server... + */ + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + if (!http) + { + syslog(LOG_ERR, "Unable to connect to server: %s", strerror(errno)); + + putchar(1); + + return (1); + } + + /* + * See if the printer is available... + */ + + num_options = get_printer(http, queue, dest, sizeof(dest), &options, + &accepting, &shared, NULL); + + if (num_options < 0 || !accepting || !shared) + { + if (dest[0]) + syslog(LOG_INFO, "Rejecting job because \"%s\" is not %s", dest, + !accepting ? "accepting jobs" : "shared"); + else + syslog(LOG_ERR, "Unable to get printer information for \"%s\"", queue); + + httpClose(http); + + putchar(1); + + return (1); + } + + putchar(0); /* OK so far... */ + + /* + * Read the request... + */ + + status = 0; + num_data = 0; + fd = -1; + + control[0] = '\0'; + + while (smart_gets(line, sizeof(line), stdin) != NULL) + { + if (strlen(line) < 2) + { + status = 1; + break; + } + + command = line[0]; + count = line + 1; + + for (name = count + 1; *name && !isspace(*name & 255); name ++); + while (isspace(*name & 255)) + *name++ = '\0'; + + switch (command) + { + default : + case 0x01 : /* Abort */ + status = 1; + break; + + case 0x02 : /* Receive control file */ + if (strlen(name) < 2) + { + syslog(LOG_ERR, "Bad control file name \"%s\"", name); + putchar(1); + status = 1; + break; + } + + if (control[0]) + { + /* + * Append to the existing control file - the LPD spec is + * not entirely clear, but at least the OS/2 LPD code sends + * multiple control files per connection... + */ + + if ((fd = open(control, O_WRONLY)) < 0) + { + syslog(LOG_ERR, + "Unable to append to temporary control file \"%s\" - %s", + control, strerror(errno)); + putchar(1); + status = 1; + break; + } + + lseek(fd, 0, SEEK_END); + } + else + { + if ((fd = cupsTempFd(control, sizeof(control))) < 0) + { + syslog(LOG_ERR, "Unable to open temporary control file \"%s\" - %s", + control, strerror(errno)); + putchar(1); + status = 1; + break; + } + + strcpy(filename, control); + } + break; + + case 0x03 : /* Receive data file */ + if (strlen(name) < 2) + { + syslog(LOG_ERR, "Bad data file name \"%s\"", name); + putchar(1); + status = 1; + break; + } + + if (num_data >= (int)(sizeof(data) / sizeof(data[0]))) + { + /* + * Too many data files... + */ + + syslog(LOG_ERR, "Too many data files (%d)", num_data); + putchar(1); + status = 1; + break; + } + + strlcpy(data[num_data], name, sizeof(data[0])); + + if ((fd = cupsTempFd(temp[num_data], sizeof(temp[0]))) < 0) + { + syslog(LOG_ERR, "Unable to open temporary data file \"%s\" - %s", + temp[num_data], strerror(errno)); + putchar(1); + status = 1; + break; + } + + strcpy(filename, temp[num_data]); + + num_data ++; + break; + } + + putchar(status); + + if (status) + break; + + /* + * Copy the data or control file from the client... + */ + + for (i = atoi(count); i > 0; i -= bytes) + { + if (i > sizeof(line)) + bytes = sizeof(line); + else + bytes = i; + + if ((bytes = fread(line, 1, bytes, stdin)) > 0) + bytes = write(fd, line, bytes); + + if (bytes < 1) + { + syslog(LOG_ERR, "Error while reading file - %s", + strerror(errno)); + status = 1; + break; + } + } + + /* + * Read trailing nul... + */ + + if (!status) + { + if (fread(line, 1, 1, stdin) < 1) + { + status = 1; + syslog(LOG_ERR, "Error while reading trailing nul - %s", + strerror(errno)); + } + else if (line[0]) + { + status = 1; + syslog(LOG_ERR, "Trailing character after file is not nul (%02X)!", + line[0]); + } + } + + /* + * Close the file and send an acknowledgement... + */ + + close(fd); + + putchar(status); + + if (status) + break; + } + + if (!status) + { + /* + * Process the control file and print stuff... + */ + + if ((fp = fopen(control, "rb")) == NULL) + status = 1; + else + { + /* + * Copy the default options... + */ + + for (i = 0; i < num_defaults; i ++) + num_options = cupsAddOption(defaults[i].name, + defaults[i].value, + num_options, &options); + + /* + * Grab the job information... + */ + + title[0] = '\0'; + user[0] = '\0'; + docname[0] = '\0'; + doccount = 0; + + while (smart_gets(line, sizeof(line), fp) != NULL) + { + /* + * Process control lines... + */ + + switch (line[0]) + { + case 'J' : /* Job name */ + strlcpy(title, line + 1, sizeof(title)); + break; + + case 'N' : /* Document name */ + strlcpy(docname, line + 1, sizeof(docname)); + break; + + case 'P' : /* User identification */ + strlcpy(user, line + 1, sizeof(user)); + break; + + case 'L' : /* Print banner page */ + /* + * If a banner was requested and it's not overridden by a + * command line option and the destination's default is none + * then add the standard banner... + */ + + if (cupsGetOption("job-sheets", num_defaults, defaults) == NULL && + ((job_sheets = cupsGetOption("job-sheets", num_options, + options)) == NULL || + !strcmp(job_sheets, "none,none"))) + { + num_options = cupsAddOption("job-sheets", "standard", + num_options, &options); + } + break; + + case 'c' : /* Plot CIF file */ + case 'd' : /* Print DVI file */ + case 'f' : /* Print formatted file */ + case 'g' : /* Plot file */ + case 'l' : /* Print file leaving control characters (raw) */ + case 'n' : /* Print ditroff output file */ + case 'o' : /* Print PostScript output file */ + case 'p' : /* Print file with 'pr' format (prettyprint) */ + case 'r' : /* File to print with FORTRAN carriage control */ + case 't' : /* Print troff output file */ + case 'v' : /* Print raster file */ + doccount ++; + + if (line[0] == 'l' && + !cupsGetOption("document-format", num_options, options)) + num_options = cupsAddOption("raw", "", num_options, &options); + + if (line[0] == 'p') + num_options = cupsAddOption("prettyprint", "", num_options, + &options); + break; + } + + if (status) + break; + } + + /* + * Check that we have a username... + */ + + if (!user[0]) + { + syslog(LOG_WARNING, "No username specified by client! " + "Using \"anonymous\"..."); + strcpy(user, "anonymous"); + } + + /* + * Create the job... + */ + + if ((id = create_job(http, dest, title, docname, user, num_options, + options)) < 0) + status = 1; + else + { + /* + * Then print the job files... + */ + + rewind(fp); + + docname[0] = '\0'; + docnumber = 0; + + while (smart_gets(line, sizeof(line), fp) != NULL) + { + /* + * Process control lines... + */ + + switch (line[0]) + { + case 'N' : /* Document name */ + strlcpy(docname, line + 1, sizeof(docname)); + break; + + case 'c' : /* Plot CIF file */ + case 'd' : /* Print DVI file */ + case 'f' : /* Print formatted file */ + case 'g' : /* Plot file */ + case 'l' : /* Print file leaving control characters (raw) */ + case 'n' : /* Print ditroff output file */ + case 'o' : /* Print PostScript output file */ + case 'p' : /* Print file with 'pr' format (prettyprint) */ + case 'r' : /* File to print with FORTRAN carriage control */ + case 't' : /* Print troff output file */ + case 'v' : /* Print raster file */ + /* + * Figure out which file we are printing... + */ + + for (i = 0; i < num_data; i ++) + if (!strcmp(data[i], line + 1)) + break; + + if (i >= num_data) + { + status = 1; + break; + } + + /* + * Send the print file... + */ + + docnumber ++; + + if (print_file(http, id, temp[i], docname, user, + cupsGetOption("document-format", num_options, + options), + docnumber == doccount)) + status = 1; + else + status = 0; + + break; + } + + if (status) + break; + } + } + + fclose(fp); + } + } + + cupsFreeOptions(num_options, options); + + httpClose(http); + + /* + * Clean up all temporary files and return... + */ + + unlink(control); + + for (i = 0; i < num_data; i ++) + unlink(temp[i]); + + return (status); +} + + +/* + * 'remove_jobs()' - Cancel one or more jobs. + */ + +static int /* O - Command status */ +remove_jobs(const char *dest, /* I - Destination */ + const char *agent, /* I - User agent */ + const char *list) /* I - List of jobs or users */ +{ + int id; /* Job ID */ + http_t *http; /* HTTP server connection */ + ipp_t *request; /* IPP Request */ + char uri[HTTP_MAX_URI]; /* Job URI */ + + + (void)dest; /* Suppress compiler warnings... */ + + /* + * Try connecting to the local server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + syslog(LOG_ERR, "Unable to connect to server %s: %s", cupsServer(), + strerror(errno)); + return (1); + } + + /* + * Loop for each job... + */ + + while ((id = atoi(list)) > 0) + { + /* + * Skip job ID in list... + */ + + while (isdigit(*list & 255)) + list ++; + while (isspace(*list & 255)) + list ++; + + /* + * Build an IPP_CANCEL_JOB request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri + * requesting-user-name + */ + + request = ippNewRequest(IPP_CANCEL_JOB); + + sprintf(uri, "ipp://localhost/jobs/%d", id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, agent); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/jobs")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + syslog(LOG_WARNING, "Cancel of job ID %d failed: %s\n", id, + cupsLastErrorString()); + httpClose(http); + return (1); + } + else + syslog(LOG_INFO, "Job ID %d canceled", id); + } + + httpClose(http); + + return (0); +} + + +/* + * 'send_state()' - Send the queue state. + */ + +static int /* O - Command status */ +send_state(const char *queue, /* I - Destination */ + const char *list, /* I - Job or user */ + int longstatus) /* I - List of jobs or users */ +{ + int id; /* Job ID from list */ + http_t *http; /* HTTP server connection */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_pstate_t state; /* Printer state */ + const char *jobdest, /* Pointer into job-printer-uri */ + *jobuser, /* Pointer to job-originating-user-name */ + *jobname; /* Pointer to job-name */ + ipp_jstate_t jobstate; /* job-state */ + int jobid, /* job-id */ + jobsize, /* job-k-octets */ + jobcount, /* Number of jobs */ + jobcopies, /* Number of copies */ + rank; /* Rank of job */ + char rankstr[255]; /* Rank string */ + char namestr[1024]; /* Job name string */ + char uri[HTTP_MAX_URI]; /* Printer URI */ + char dest[256]; /* Printer/class queue */ + static const char * const ranks[10] = /* Ranking strings */ + { + "th", + "st", + "nd", + "rd", + "th", + "th", + "th", + "th", + "th", + "th" + }; + static const char * const requested[] = + { /* Requested attributes */ + "job-id", + "job-k-octets", + "job-state", + "job-printer-uri", + "job-originating-user-name", + "job-name", + "copies" + }; + + + /* + * Try connecting to the local server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + syslog(LOG_ERR, "Unable to connect to server %s: %s", cupsServer(), + strerror(errno)); + printf("Unable to connect to server %s: %s", cupsServer(), strerror(errno)); + return (1); + } + + /* + * Get the actual destination name and printer state... + */ + + if (get_printer(http, queue, dest, sizeof(dest), NULL, NULL, NULL, &state)) + { + syslog(LOG_ERR, "Unable to get printer %s: %s", queue, + cupsLastErrorString()); + printf("Unable to get printer %s: %s", queue, cupsLastErrorString()); + return (1); + } + + /* + * Show the queue state... + */ + + switch (state) + { + case IPP_PRINTER_IDLE : + printf("%s is ready\n", dest); + break; + case IPP_PRINTER_PROCESSING : + printf("%s is ready and printing\n", dest); + break; + case IPP_PRINTER_STOPPED : + printf("%s is not ready\n", dest); + break; + } + + /* + * Build an IPP_GET_JOBS or IPP_GET_JOB_ATTRIBUTES request, which requires + * the following attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri or printer-uri + */ + + id = atoi(list); + + request = ippNewRequest(id ? IPP_GET_JOB_ATTRIBUTES : IPP_GET_JOBS); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, uri); + + if (id) + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", id); + else + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, list); + ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); + } + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + sizeof(requested) / sizeof(requested[0]), + NULL, requested); + + /* + * Do the request and get back a response... + */ + + jobcount = 0; + response = cupsDoRequest(http, request, "/"); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + printf("get-jobs failed: %s\n", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + /* + * Loop through the job list and display them... + */ + + for (attr = response->attrs, rank = 1; attr; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr && (attr->group_tag != IPP_TAG_JOB || !attr->name)) + attr = attr->next; + + if (!attr) + break; + + /* + * Pull the needed attributes from this job... + */ + + jobid = 0; + jobsize = 0; + jobstate = IPP_JOB_PENDING; + jobname = "untitled"; + jobuser = NULL; + jobdest = NULL; + jobcopies = 1; + + while (attr && attr->group_tag == IPP_TAG_JOB) + { + if (!strcmp(attr->name, "job-id") && + attr->value_tag == IPP_TAG_INTEGER) + jobid = attr->values[0].integer; + + if (!strcmp(attr->name, "job-k-octets") && + attr->value_tag == IPP_TAG_INTEGER) + jobsize = attr->values[0].integer; + + if (!strcmp(attr->name, "job-state") && + attr->value_tag == IPP_TAG_ENUM) + jobstate = (ipp_jstate_t)attr->values[0].integer; + + if (!strcmp(attr->name, "job-printer-uri") && + attr->value_tag == IPP_TAG_URI) + if ((jobdest = strrchr(attr->values[0].string.text, '/')) != NULL) + jobdest ++; + + if (!strcmp(attr->name, "job-originating-user-name") && + attr->value_tag == IPP_TAG_NAME) + jobuser = attr->values[0].string.text; + + if (!strcmp(attr->name, "job-name") && + attr->value_tag == IPP_TAG_NAME) + jobname = attr->values[0].string.text; + + if (!strcmp(attr->name, "copies") && + attr->value_tag == IPP_TAG_INTEGER) + jobcopies = attr->values[0].integer; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (!jobdest || !jobid) + { + if (!attr) + break; + else + continue; + } + + if (!longstatus && jobcount == 0) + puts("Rank Owner Job File(s) Total Size"); + + jobcount ++; + + /* + * Display the job... + */ + + if (jobstate == IPP_JOB_PROCESSING) + strcpy(rankstr, "active"); + else + { + snprintf(rankstr, sizeof(rankstr), "%d%s", rank, ranks[rank % 10]); + rank ++; + } + + if (longstatus) + { + puts(""); + + if (jobcopies > 1) + snprintf(namestr, sizeof(namestr), "%d copies of %s", jobcopies, + jobname); + else + strlcpy(namestr, jobname, sizeof(namestr)); + + printf("%s: %-33.33s [job %d localhost]\n", jobuser, rankstr, jobid); + printf(" %-39.39s %.0f bytes\n", namestr, 1024.0 * jobsize); + } + else + printf("%-7s %-7.7s %-7d %-31.31s %.0f bytes\n", rankstr, jobuser, + jobid, jobname, 1024.0 * jobsize); + + if (!attr) + break; + } + + ippDelete(response); + + if (jobcount == 0) + puts("no entries"); + + httpClose(http); + + return (0); +} + + +/* + * 'smart_gets()' - Get a line of text, removing the trailing CR and/or LF. + */ + +static char * /* O - Line read or NULL */ +smart_gets(char *s, /* I - Pointer to line buffer */ + int len, /* I - Size of line buffer */ + FILE *fp) /* I - File to read from */ +{ + char *ptr, /* Pointer into line */ + *end; /* End of line */ + int ch; /* Character from file */ + + + /* + * Read the line; unlike fgets(), we read the entire line but dump + * characters that go past the end of the buffer. Also, we accept + * CR, LF, or CR LF for the line endings to be "safe", although + * RFC 1179 specifically says "just use LF". + */ + + ptr = s; + end = s + len - 1; + + while ((ch = getc(fp)) != EOF) + { + if (ch == '\n') + break; + else if (ch == '\r') + { + /* + * See if a LF follows... + */ + + ch = getc(fp); + + if (ch != '\n') + ungetc(ch, fp); + + break; + } + else if (ptr < end) + *ptr++ = ch; + } + + *ptr = '\0'; + + if (ch == EOF && ptr == s) + return (NULL); + else + return (s); +} + + +/* + * End of "$Id: cups-lpd.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/scheduler/cups-lpd.xinetd.in b/scheduler/cups-lpd.xinetd.in new file mode 100644 index 0000000..05fbba7 --- /dev/null +++ b/scheduler/cups-lpd.xinetd.in @@ -0,0 +1,12 @@ +service printer +{ + disable = yes + socket_type = stream + protocol = tcp + wait = no + user = @CUPS_USER@ + group = @CUPS_GROUP@ + passenv = + server = @CUPS_SERVERBIN@/daemon/cups-lpd + server_args = -o document-format=application/octet-stream +} diff --git a/scheduler/cups-polld.c b/scheduler/cups-polld.c new file mode 100644 index 0000000..65b2e68 --- /dev/null +++ b/scheduler/cups-polld.c @@ -0,0 +1,470 @@ +/* + * "$Id: cups-polld.c 10321 2012-03-02 18:26:30Z mike $" + * + * Polling daemon for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Open sockets and poll until we are killed... + * dequote() - Remote quotes from a string. + * poll_server() - Poll the server for the given set of printers or + * classes. + * sighup_handler() - Handle 'hangup' signals to restart polling. + */ + +/* + * Include necessary headers... + */ + +#include +#include + + +/* + * Local globals... + */ + +static int restart_polling = 1; + + +/* + * Local functions... + */ + +static char *dequote(char *d, const char *s, int dlen); +static int poll_server(http_t *http, int sock, int port, int interval, + const char *prefix); +static void sighup_handler(int sig); + + +/* + * 'main()' - Open sockets and poll until we are killed... + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + http_t *http; /* HTTP connection */ + int interval; /* Polling interval */ + int sock; /* Browser sock */ + int port; /* Browser port */ + int val; /* Socket option value */ + int seconds, /* Seconds left from poll */ + remain; /* Total remaining time to sleep */ + char prefix[1024]; /* Prefix for log messages */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Catch hangup signals for when the network changes... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGHUP, sighup_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGHUP); + action.sa_handler = sighup_handler; + sigaction(SIGHUP, &action, NULL); +#else + signal(SIGHUP, sighup_handler); +#endif /* HAVE_SIGSET */ + + /* + * Don't buffer log messages... + */ + + setbuf(stderr, NULL); + + /* + * The command-line must contain the following: + * + * cups-polld server server-port interval port + */ + + if (argc != 5) + { + fputs("Usage: cups-polld server server-port interval port\n", stderr); + return (1); + } + + interval = atoi(argv[3]); + port = atoi(argv[4]); + + if (interval < 2) + interval = 2; + + snprintf(prefix, sizeof(prefix), "[cups-polld %s:%d]", argv[1], atoi(argv[2])); + + /* + * Open a broadcast socket... + */ + + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + fprintf(stderr, "ERROR: %s Unable to open broadcast socket: %s\n", prefix, + strerror(errno)); + return (1); + } + + /* + * Set the "broadcast" flag... + */ + + val = 1; + if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val))) + { + fprintf(stderr, "ERROR: %s Unable to put socket in broadcast mode: %s\n", + prefix, strerror(errno)); + + close(sock); + return (1); + } + + /* + * Loop forever, asking for available printers and classes... + */ + + for (http = NULL; !ferror(stderr);) + { + /* + * Open a connection to the server... + */ + + if (restart_polling || !http) + { + restart_polling = 0; + httpClose(http); + + if ((http = httpConnectEncrypt(argv[1], atoi(argv[2]), + cupsEncryption())) == NULL) + { + fprintf(stderr, "ERROR: %s Unable to connect to %s on port %s.\n", + prefix, argv[1], argv[2]); + } + } + + /* + * Get the printers and classes... + */ + + remain = interval; + + if (http && (seconds = poll_server(http, sock, port, interval, prefix)) > 0) + remain -= seconds; + + /* + * Sleep for any remaining time... + */ + + if (remain > 0 && !restart_polling) + sleep(remain); + } + + return (1); +} + + +/* + * 'dequote()' - Remote quotes from a string. + */ + +static char * /* O - Dequoted string */ +dequote(char *d, /* I - Destination string */ + const char *s, /* I - Source string */ + int dlen) /* I - Destination length */ +{ + char *dptr; /* Pointer into destination */ + + + if (s) + { + for (dptr = d, dlen --; *s && dlen > 0; s ++) + if (*s != '\"') + { + *dptr++ = *s; + dlen --; + } + + *dptr = '\0'; + } + else + *d = '\0'; + + return (d); +} + + +/* + * 'poll_server()' - Poll the server for the given set of printers or classes. + */ + +static int /* O - Number of seconds or -1 on error */ +poll_server(http_t *http, /* I - HTTP connection */ + int sock, /* I - Broadcast sock */ + int port, /* I - Broadcast port */ + int interval, /* I - Polling interval */ + const char *prefix) /* I - Prefix for log messages */ +{ + int seconds; /* Number of seconds */ + int count, /* Current number of printers/classes */ + max_count; /* Maximum printers/classes per second */ + ipp_t *request, /* Request data */ + *response; /* Response data */ + ipp_attribute_t *attr; /* Current attribute */ + const char *uri; /* printer-uri */ + char info[1024], /* printer-info */ + job_sheets[1024],/* job-sheets-default */ + location[1024], /* printer-location */ + make_model[1024]; + /* printer-make-and-model */ + cups_ptype_t type; /* printer-type */ + ipp_pstate_t state; /* printer-state */ + int accepting; /* printer-is-accepting-jobs */ + struct sockaddr_in addr; /* Broadcast address */ + char packet[1540]; /* Data packet */ + static const char * const attrs[] = /* Requested attributes */ + { + "job-sheets-default", + "printer-info", + "printer-is-accepting-jobs", + "printer-location", + "printer-make-and-model", + "printer-name", + "printer-state", + "printer-type", + "printer-uri-supported" + }; + + + /* + * Broadcast to 127.0.0.1 (localhost) + */ + + memset(&addr, 0, sizeof(addr)); + addr.sin_addr.s_addr = htonl(0x7f000001); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + + /* + * Build a CUPS_GET_PRINTERS request and pass along a list of the + * attributes we are interested in along with the types of printers + * (and classes) we want. + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(attrs) / sizeof(attrs[0]), + NULL, attrs); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type", 0); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_ENUM, + "printer-type-mask", + CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_NOT_SHARED); + + /* + * Do the request and get back a response... + */ + + seconds = time(NULL); + response = cupsDoRequest(http, request, "/"); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + fprintf(stderr, "ERROR: %s CUPS-Get-Printers failed: %s\n", prefix, + cupsLastErrorString()); + ippDelete(response); + restart_polling = 1; + return (-1); + } + + if (response) + { + /* + * Figure out how many printers/classes we have... + */ + + for (attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME), + max_count = 0; + attr != NULL; + attr = ippFindNextAttribute(response, "printer-name", IPP_TAG_NAME), + max_count ++); + + fprintf(stderr, "DEBUG: %s Found %d printers.\n", prefix, max_count); + + count = 0; + max_count = 2 * max_count / interval + 1; + + /* + * Loop through the printers or classes returned in the list... + */ + + for (attr = response->attrs; attr; attr = attr->next) + { + /* + * Skip leading attributes until we hit a printer... + */ + + while (attr && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (!attr) + break; + + /* + * Pull the needed attributes from this printer... + */ + + uri = NULL; + info[0] = '\0'; + job_sheets[0] = '\0'; + location[0] = '\0'; + make_model[0] = '\0'; + type = CUPS_PRINTER_REMOTE; + accepting = 1; + state = IPP_PRINTER_IDLE; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "job-sheets-default") && + (attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_KEYWORD)) + { + if (attr->num_values == 1) + snprintf(job_sheets, sizeof(job_sheets), " job-sheets=%s", + attr->values[0].string.text); + else + snprintf(job_sheets, sizeof(job_sheets), " job-sheets=%s,%s", + attr->values[0].string.text, + attr->values[1].string.text); + } + else if (!strcmp(attr->name, "printer-uri-supported") && + attr->value_tag == IPP_TAG_URI) + uri = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-info") && + attr->value_tag == IPP_TAG_TEXT) + dequote(info, attr->values[0].string.text, sizeof(info)); + else if (!strcmp(attr->name, "printer-is-accepting-jobs") && + attr->value_tag == IPP_TAG_BOOLEAN) + accepting = attr->values[0].boolean; + else if (!strcmp(attr->name, "printer-location") && + attr->value_tag == IPP_TAG_TEXT) + dequote(location, attr->values[0].string.text, sizeof(location)); + else if (!strcmp(attr->name, "printer-make-and-model") && + attr->value_tag == IPP_TAG_TEXT) + dequote(make_model, attr->values[0].string.text, sizeof(location)); + else if (!strcmp(attr->name, "printer-state") && + attr->value_tag == IPP_TAG_ENUM) + state = (ipp_pstate_t)attr->values[0].integer; + else if (!strcmp(attr->name, "printer-type") && + attr->value_tag == IPP_TAG_ENUM) + type = (cups_ptype_t)attr->values[0].integer; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (uri == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Send the printer information... + */ + + type |= CUPS_PRINTER_REMOTE; + + if (!accepting) + type |= CUPS_PRINTER_REJECTING; + + snprintf(packet, sizeof(packet), + "%x %x %s \"%s\" \"%s\" \"%s\" lease-duration=%d%s\n", + type, state, uri, location, info, make_model, interval * 2, + job_sheets); + + fprintf(stderr, "DEBUG2: %s Sending %s", prefix, packet); + + if (sendto(sock, packet, strlen(packet), 0, + (struct sockaddr *)&addr, sizeof(addr)) <= 0) + { + ippDelete(response); + perror("cups-polld"); + return (-1); + } + + /* + * Throttle the local broadcasts as needed so that we don't + * overwhelm the local server... + */ + + count ++; + if (count >= max_count) + { + /* + * Sleep for a second... + */ + + count = 0; + + sleep(1); + } + + if (!attr || restart_polling) + break; + } + + ippDelete(response); + } + + /* + * Return the number of seconds we used... + */ + + return (time(NULL) - seconds); +} + + +/* + * 'sighup_handler()' - Handle 'hangup' signals to restart polling. + */ + +static void +sighup_handler(int sig) /* I - Signal number */ +{ + (void)sig; + + restart_polling = 1; + +#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION) + signal(SIGHUP, sighup_handler); +#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ +} + + +/* + * End of "$Id: cups-polld.c 10321 2012-03-02 18:26:30Z mike $". + */ diff --git a/scheduler/cups.sh.in b/scheduler/cups.sh.in new file mode 100644 index 0000000..133bca6 --- /dev/null +++ b/scheduler/cups.sh.in @@ -0,0 +1,237 @@ +#!/bin/sh +# +# "$Id: cups.sh.in 9949 2011-08-31 04:58:33Z mike $" +# +# Startup/shutdown script for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +#### OS-Dependent Information + +# +# Linux chkconfig stuff: +# +# chkconfig: 235 99 00 +# description: Startup/shutdown script for CUPS. +# + +# +# NetBSD 1.5+ rcorder script lines. The format of the following two +# lines is very strict -- please don't add additional spaces! +# +# PROVIDE: cups +# REQUIRE: DAEMON +# + + +#### OS-Dependent Configuration + +case "`uname`" in + IRIX*) + IS_ON=/sbin/chkconfig + + if $IS_ON verbose; then + ECHO=echo + else + ECHO=: + fi + ECHO_OK=: + ECHO_ERROR=: + ;; + + *BSD*) + IS_ON=: + ECHO=echo + ECHO_OK=: + ECHO_ERROR=: + ;; + + Darwin*) + . /etc/rc.common + + if test "${CUPS:=-YES-}" = "-NO-"; then + exit 0 + fi + + IS_ON=: + ECHO=ConsoleMessage + ECHO_OK=: + ECHO_ERROR=: + ;; + + Linux*) + IS_ON=/bin/true + if test -f /etc/init.d/functions; then + . /etc/init.d/functions + ECHO=echo + ECHO_OK="echo_success" + ECHO_ERROR="echo_failure" + else + ECHO=echo + ECHO_OK=: + ECHO_ERROR=: + fi + ;; + + *) + IS_ON=/bin/true + ECHO=echo + ECHO_OK=: + ECHO_ERROR=: + ;; +esac + +#### OS-Independent Stuff + +# +# Set the timezone, if possible... This allows the scheduler and +# all child processes to know the local timezone when reporting +# dates and times to the user. If no timezone information is +# found, then Greenwich Mean Time (GMT) will probably be used. +# + +for file in /etc/TIMEZONE /etc/rc.config /etc/sysconfig/clock; do + if test -f $file; then + . $file + fi +done + +if test "x$ZONE" != x; then + TZ="$ZONE" +fi + +if test "x$TIMEZONE" != x; then + TZ="$TIMEZONE" +fi + +if test "x$TZ" != x; then + export TZ +fi + +# +# Don't use TMPDIR environment variable from init script, as that can +# cause cupsd to set TempDir to a user's temporary directory instead +# of the default... +# + +unset TMPDIR + + +# +# Make sure we have the standard program directories in the path +# since some operating systems (this means YOU HP-UX!) don't +# provide a standard path on boot-up... +# + +if test "x$PATH" = x; then + PATH="/bin:/usr/bin:/sbin:/usr/sbin" +else + PATH="/bin:/usr/bin:/sbin:/usr/sbin:$PATH" +fi + +export PATH + +# +# See if the CUPS server (cupsd) is running... +# + +case "`uname`" in + HP-UX* | AIX* | SINIX*) + pid=`ps -e | awk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'` + ;; + IRIX* | SunOS*) + pid=`ps -e | nawk '{if (match($4, ".*/cupsd$") || $4 == "cupsd") print $1}'` + ;; + UnixWare*) + pid=`ps -e | awk '{if (match($6, ".*/cupsd$") || $6 == "cupsd") print $1}'` + . /etc/TIMEZONE + ;; + OSF1*) + pid=`ps -e | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'` + ;; + Linux* | *BSD* | Darwin*) + pid=`ps ax | awk '{if (match($5, ".*/cupsd$") || $5 == "cupsd") print $1}'` + ;; + *) + pid="" + ;; +esac + +# +# Start or stop the CUPS server based upon the first argument to the script. +# + +case $1 in + start | restart | reload) + if $IS_ON cups; then + if test -x /sbin/portrelease; then + /sbin/portrelease cups + fi + + if test "$pid" != ""; then + kill -HUP $pid + else + prefix=@prefix@ + exec_prefix=@exec_prefix@ + @sbindir@/cupsd + if test $? != 0; then + $ECHO_FAIL + $ECHO "cups: unable to $1 scheduler." + exit 1 + fi + fi + $ECHO_OK + $ECHO "cups: ${1}ed scheduler." + fi + ;; + + stop) + if test "$pid" != ""; then + kill $pid + $ECHO_OK + $ECHO "cups: stopped scheduler." + fi + ;; + + status) + if test "$pid" != ""; then + echo "cups: scheduler is running." + else + echo "cups: scheduler is not running." + fi + ;; + + start_msg) + # HP-UX non-standard... + echo "Starting CUPS Server" + ;; + + stop_msg) + # HP-UX non-standard... + echo "Starting CUPS Server" + ;; + + *) + echo "Usage: cups {reload|restart|start|status|stop}" + exit 1 + ;; +esac + +# +# Exit with no errors. +# + +exit 0 + + +# +# End of "$Id: cups.sh.in 9949 2011-08-31 04:58:33Z mike $". +# diff --git a/scheduler/cups.xml.in b/scheduler/cups.xml.in new file mode 100644 index 0000000..ba614ce --- /dev/null +++ b/scheduler/cups.xml.in @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scheduler/cupsd.h b/scheduler/cupsd.h new file mode 100644 index 0000000..ef2eee1 --- /dev/null +++ b/scheduler/cupsd.h @@ -0,0 +1,276 @@ +/* + * "$Id: cupsd.h 9766 2011-05-11 22:17:34Z mike $" + * + * Main header file for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + + +/* + * Include necessary headers. + */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +# include +#else +# include +#endif /* WIN32 */ + +#include "mime.h" + +#if defined(HAVE_CDSASSL) +# include +#endif /* HAVE_CDSASSL */ + + +/* + * Some OS's don't have hstrerror(), most notably Solaris... + */ + +#ifndef HAVE_HSTRERROR +# ifdef hstrerror +# undef hstrerror +# endif /* hstrerror */ +# define hstrerror cups_hstrerror + +extern const char *cups_hstrerror(int); +#endif /* !HAVE_HSTRERROR */ + + +/* + * Common constants. + */ + +#ifndef FALSE +# define FALSE 0 +# define TRUE (!FALSE) +#endif /* !FALSE */ + + +/* + * Implementation limits... + */ + +#define MAX_ENV 100 /* Maximum number of environment strings */ +#define MAX_USERPASS 33 /* Maximum size of username/password */ +#define MAX_FILTERS 20 /* Maximum number of filters */ +#define MAX_SYSTEM_GROUPS 32 /* Maximum number of system groups */ + + +/* + * Defaults... + */ + +#define DEFAULT_HISTORY 1 /* Preserve job history? */ +#define DEFAULT_FILES 0 /* Preserve job files? */ +#define DEFAULT_TIMEOUT 300 /* Timeout during requests/updates */ +#define DEFAULT_KEEPALIVE 30 /* Timeout between requests */ +#define DEFAULT_INTERVAL 30 /* Interval between browse updates */ +#define DEFAULT_CHARSET "utf-8" /* Default charset */ + + +/* + * Global variable macros... + */ + +#ifdef _MAIN_C_ +# define VAR +# define VALUE(x) =x +# define VALUE2(x,y) ={x,y} +#else +# define VAR extern +# define VALUE(x) +# define VALUE2(x,y) +#endif /* _MAIN_C */ + + +/* + * Other stuff for the scheduler... + */ + +#include "sysman.h" +#include "statbuf.h" +#include "cert.h" +#include "auth.h" +#include "client.h" +#include "policy.h" +#include "printers.h" +#include "classes.h" +#include "job.h" +#include "conf.h" +#include "banners.h" +#include "dirsvc.h" +#include "network.h" +#include "subscriptions.h" + + +/* + * Reload types... + */ + +#define RELOAD_NONE 0 /* No reload needed */ +#define RELOAD_ALL 1 /* Reload everything */ +#define RELOAD_CUPSD 2 /* Reload only cupsd.conf */ + + +/* + * Select callback function type... + */ + +typedef void (*cupsd_selfunc_t)(void *data); + +#ifdef HAVE_AVAHI +/* + * Timeout callback function type... + */ + +typedef struct _cupsd_timeout_s cupsd_timeout_t; +typedef void (*cupsd_timeoutfunc_t)(cupsd_timeout_t *timeout, void *data); +#endif /* HAVE_AVAHI */ + + +/* + * Globals... + */ + +VAR int TestConfigFile VALUE(0), + /* Test the cupsd.conf file? */ + UseProfiles VALUE(1); + /* Use security profiles for child procs? */ +VAR int MaxFDs VALUE(0); + /* Maximum number of files */ + +VAR time_t ReloadTime VALUE(0); + /* Time of reload request... */ +VAR int NeedReload VALUE(RELOAD_ALL), + /* Need to load configuration? */ + DoingShutdown VALUE(0); + /* Shutting down the scheduler? */ +VAR void *DefaultProfile VALUE(0); + /* Default security profile */ + +#ifdef HAVE_GSSAPI +VAR int KerberosInitialized VALUE(0); + /* Has Kerberos been initialized? */ +VAR krb5_context KerberosContext VALUE(NULL); + /* Kerberos context for credentials */ +#endif /* HAVE_GSSAPI */ + +#ifdef HAVE_LAUNCH_H +VAR int Launchd VALUE(0); + /* Running from launchd */ +#endif /* HAVE_LAUNCH_H */ + +#ifdef HAVE_AVAHI +VAR cups_array_t *Timeouts; /* Timed callbacks for main loop */ +#endif /* HAVE_AVAHI */ + + + +/* + * Prototypes... + */ + +/* env.c */ +extern void cupsdInitEnv(void); +extern int cupsdLoadEnv(char *envp[], int envmax); +extern void cupsdSetEnv(const char *name, const char *value); +extern void cupsdSetEnvf(const char *name, const char *value, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +; +extern void cupsdUpdateEnv(void); + +/* file.c */ +extern void cupsdCleanFiles(const char *path, const char *pattern); +extern int cupsdCloseCreatedConfFile(cups_file_t *fp, + const char *filename); +extern void cupsdClosePipe(int *fds); +extern cups_file_t *cupsdCreateConfFile(const char *filename, mode_t mode); +extern cups_file_t *cupsdOpenConfFile(const char *filename); +extern int cupsdOpenPipe(int *fds); +extern int cupsdRemoveFile(const char *filename); + +/* main.c */ +extern int cupsdAddString(cups_array_t **a, const char *s); +extern void cupsdCheckProcess(void); +extern void cupsdClearString(char **s); +extern void cupsdFreeStrings(cups_array_t **a); +extern void cupsdHoldSignals(void); +extern char *cupsdMakeUUID(const char *name, int number, + char *buffer, size_t bufsize); +extern void cupsdReleaseSignals(void); +extern void cupsdSetString(char **s, const char *v); +extern void cupsdSetStringf(char **s, const char *f, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +; + +/* process.c */ +extern void *cupsdCreateProfile(int job_id); +extern void cupsdDestroyProfile(void *profile); +extern int cupsdEndProcess(int pid, int force); +extern const char *cupsdFinishProcess(int pid, char *name, int namelen, + int *job_id); +extern int cupsdStartProcess(const char *command, char *argv[], + char *envp[], int infd, int outfd, + int errfd, int backfd, int sidefd, + int root, void *profile, + cupsd_job_t *job, int *pid); + +/* select.c */ +extern int cupsdAddSelect(int fd, cupsd_selfunc_t read_cb, + cupsd_selfunc_t write_cb, void *data); +extern int cupsdDoSelect(long timeout); +#ifdef CUPSD_IS_SELECTING +extern int cupsdIsSelecting(int fd); +#endif /* CUPSD_IS_SELECTING */ +extern void cupsdRemoveSelect(int fd); +extern void cupsdStartSelect(void); +extern void cupsdStopSelect(void); + +/* server.c */ +extern void cupsdStartServer(void); +extern void cupsdStopServer(void); + +#ifdef HAVE_AVAHI +extern void cupsdInitTimeouts(void); +extern cupsd_timeout_t *cupsdAddTimeout (const struct timeval *tv, + cupsd_timeoutfunc_t cb, + void *data); +extern cupsd_timeout_t *cupsdNextTimeout (long *delay); +extern void cupsdRunTimeout (cupsd_timeout_t *timeout); +extern void cupsdUpdateTimeout (cupsd_timeout_t *timeout, + const struct timeval *tv); +extern void cupsdRemoveTimeout (cupsd_timeout_t *timeout); +#endif /* HAVE_AVAHI */ + +extern int cupsdRemoveFile(const char *filename); + + +/* + * End of "$Id: cupsd.h 9766 2011-05-11 22:17:34Z mike $". + */ diff --git a/scheduler/cupsfilter.c b/scheduler/cupsfilter.c new file mode 100644 index 0000000..9f21a52 --- /dev/null +++ b/scheduler/cupsfilter.c @@ -0,0 +1,1494 @@ +/* + * "$Id: cupsfilter.c 9862 2011-08-03 02:44:09Z mike $" + * + * Filtering program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the test program. + * add_printer_filter() - Add a single filters from a PPD file. + * add_printer_filters() - Add filters from a PPD file. + * check_cb() - Callback function for _cupsFileCheck. + * compare_pids() - Compare two filter PIDs... + * escape_options() - Convert an options array to a string. + * exec_filter() - Execute a single filter. + * exec_filters() - Execute filters for the given file and options. + * get_job_file() - Get the specified job file. + * open_pipe() - Create a pipe which is closed on exec. + * read_cupsd_conf() - Read the cupsd.conf file to get the filter + * settings. + * set_string() - Copy and set a string. + * sighandler() - Signal catcher for when we print from stdin... + * usage() - Show program usage... + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include "mime.h" +#include +#include +#include +#include +#include +#if defined(__APPLE__) +# include +#endif /* __APPLE__ */ + + +/* + * Local globals... + */ + +static char *DataDir = NULL;/* CUPS_DATADIR environment variable */ +static char *FontPath = NULL; + /* CUPS_FONTPATH environment variable */ +static mime_filter_t GZIPFilter = /* gziptoany filter */ +{ + NULL, /* Source type */ + NULL, /* Destination type */ + 0, /* Cost */ + "gziptoany" /* Filter program to run */ +}; +static char *Path = NULL; /* PATH environment variable */ +static char *ServerBin = NULL; + /* CUPS_SERVERBIN environment variable */ +static char *ServerRoot = NULL; + /* CUPS_SERVERROOT environment variable */ +static char *RIPCache = NULL; + /* RIP_MAX_CACHE environment variable */ +static char TempFile[1024] = ""; + /* Temporary file */ + + +/* + * Local functions... + */ + +static void add_printer_filter(const char *command, mime_t *mime, + mime_type_t *printer_type, + const char *filter); +static mime_type_t *add_printer_filters(const char *command, + mime_t *mime, const char *printer, + const char *ppdfile, + mime_type_t **prefilter_type); +static void check_cb(void *context, _cups_fc_result_t result, + const char *message); +static int compare_pids(mime_filter_t *a, mime_filter_t *b); +static char *escape_options(int num_options, cups_option_t *options); +static int exec_filter(const char *filter, char **argv, + char **envp, int infd, int outfd); +static int exec_filters(mime_type_t *srctype, + cups_array_t *filters, const char *infile, + const char *outfile, const char *ppdfile, + const char *printer, const char *user, + const char *title, int num_options, + cups_option_t *options); +static void get_job_file(const char *job); +static int open_pipe(int *fds); +static int read_cupsd_conf(const char *filename); +static void set_string(char **s, const char *val); +static void sighandler(int sig); +static void usage(const char *command, const char *opt); + + +/* + * 'main()' - Main entry for the test program. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping vars */ + const char *command, /* Command name */ + *opt, /* Current option */ + *printer; /* Printer name */ + mime_type_t *printer_type, /* Printer MIME type */ + *prefilter_type; /* Printer prefilter MIME type */ + char *srctype, /* Source type */ + *dsttype, /* Destination type */ + super[MIME_MAX_SUPER], /* Super-type name */ + type[MIME_MAX_TYPE]; /* Type name */ + int compression; /* Compression of file */ + int cost; /* Cost of filters */ + mime_t *mime; /* MIME database */ + char mimedir[1024]; /* MIME directory */ + char *infile, /* File to filter */ + *outfile; /* File to create */ + char cupsdconf[1024]; /* cupsd.conf file */ + const char *server_root; /* CUPS_SERVERROOT environment variable */ + mime_type_t *src, /* Source type */ + *dst; /* Destination type */ + cups_array_t *filters; /* Filters for the file */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + const char *ppdfile; /* PPD file */ + const char *title, /* Title string */ + *user; /* Username */ + int all_filters, /* Use all filters */ + removeppd, /* Remove PPD file */ + removeinfile; /* Remove input file */ + int status; /* Execution status */ + + + /* + * Setup defaults... + */ + + if ((command = strrchr(argv[0], '/')) != NULL) + command ++; + else + command = argv[0]; + + printer = !strcmp(command, "convert") ? "tofile" : "cupsfilter"; + mime = NULL; + srctype = NULL; + compression = 0; + dsttype = "application/pdf"; + infile = NULL; + outfile = NULL; + num_options = 0; + options = NULL; + ppdfile = NULL; + title = NULL; + user = cupsUser(); + all_filters = 0; + removeppd = 0; + removeinfile = 0; + + if ((server_root = getenv("CUPS_SERVERROOT")) == NULL) + server_root = CUPS_SERVERROOT; + + snprintf(cupsdconf, sizeof(cupsdconf), "%s/cupsd.conf", server_root); + + /* + * Process command-line arguments... + */ + + _cupsSetLocale(argv); + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case '-' : /* Next argument is a filename... */ + i ++; + if (i < argc && !infile) + infile = argv[i]; + else + usage(command, opt); + break; + + case 'a' : /* Specify option... */ + i ++; + if (i < argc) + num_options = cupsParseOptions(argv[i], num_options, &options); + else + usage(command, opt); + break; + + case 'c' : /* Specify cupsd.conf file location... */ + i ++; + if (i < argc) + { + if (!strcmp(command, "convert")) + num_options = cupsAddOption("copies", argv[i], num_options, + &options); + else + strlcpy(cupsdconf, argv[i], sizeof(cupsdconf)); + } + else + usage(command, opt); + break; + + case 'd' : /* Specify the real printer name */ + i ++; + if (i < argc) + printer = argv[i]; + else + usage(command, opt); + break; + + case 'D' : /* Delete input file after conversion */ + removeinfile = 1; + break; + + case 'e' : /* Use every filter from the PPD file */ + all_filters = 1; + break; + + case 'f' : /* Specify input file... */ + i ++; + if (i < argc && !infile) + infile = argv[i]; + else + usage(command, opt); + break; + + case 'i' : /* Specify source MIME type... */ + i ++; + if (i < argc) + { + if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) + usage(command, opt); + + srctype = argv[i]; + } + else + usage(command, opt); + break; + + case 'j' : /* Get job file or specify destination MIME type... */ + if (strcmp(command, "convert")) + { + i ++; + if (i < argc) + { + get_job_file(argv[i]); + infile = TempFile; + } + else + usage(command, opt); + + break; + } + + case 'm' : /* Specify destination MIME type... */ + i ++; + if (i < argc) + { + if (sscanf(argv[i], "%15[^/]/%255s", super, type) != 2) + usage(command, opt); + + dsttype = argv[i]; + } + else + usage(command, opt); + break; + + case 'n' : /* Specify number of copies... */ + i ++; + if (i < argc) + num_options = cupsAddOption("copies", argv[i], num_options, + &options); + else + usage(command, opt); + break; + + case 'o' : /* Specify option(s) or output filename */ + i ++; + if (i < argc) + { + if (!strcmp(command, "convert")) + { + if (outfile) + usage(command, NULL); + else + outfile = argv[i]; + } + else + num_options = cupsParseOptions(argv[i], num_options, + &options); + } + else + usage(command, opt); + break; + + case 'p' : /* Specify PPD file... */ + case 'P' : /* Specify PPD file... */ + i ++; + if (i < argc) + ppdfile = argv[i]; + else + usage(command, opt); + break; + + case 't' : /* Specify title... */ + case 'J' : /* Specify title... */ + i ++; + if (i < argc) + title = argv[i]; + else + usage(command, opt); + break; + + case 'u' : /* Delete PPD file after conversion */ + removeppd = 1; + break; + + case 'U' : /* Specify username... */ + i ++; + if (i < argc) + user = argv[i]; + else + usage(command, opt); + break; + + default : /* Something we don't understand... */ + usage(command, opt); + break; + } + } + else if (!infile) + { + if (strcmp(command, "convert")) + infile = argv[i]; + else + { + _cupsLangPuts(stderr, + _("convert: Use the -f option to specify a file to " + "convert.")); + usage(command, NULL); + } + } + else + { + _cupsLangPuts(stderr, + _("cupsfilter: Only one filename can be specified.")); + usage(command, NULL); + } + + if (!infile && !srctype) + usage(command, NULL); + + if (!title) + { + if (!infile) + title = "(stdin)"; + else if ((title = strrchr(infile, '/')) != NULL) + title ++; + else + title = infile; + } + + /* + * Load the cupsd.conf file and create the MIME database... + */ + + if (read_cupsd_conf(cupsdconf)) + return (1); + + snprintf(mimedir, sizeof(mimedir), "%s/mime", DataDir); + + mime = mimeLoadTypes(NULL, mimedir); + mime = mimeLoadTypes(mime, ServerRoot); + mime = mimeLoadFilters(mime, mimedir, Path); + mime = mimeLoadFilters(mime, ServerRoot, Path); + + if (!mime) + { + _cupsLangPrintf(stderr, + _("%s: Unable to read MIME database from \"%s\" or " + "\"%s\"."), + command, mimedir, ServerRoot); + return (1); + } + + prefilter_type = NULL; + + if (all_filters) + printer_type = add_printer_filters(command, mime, printer, ppdfile, + &prefilter_type); + else + printer_type = mimeType(mime, "application", "vnd.cups-postscript"); + + /* + * Get the source and destination types... + */ + + if (srctype) + { + sscanf(srctype, "%15[^/]/%255s", super, type); + if ((src = mimeType(mime, super, type)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Unknown source MIME type %s/%s."), + command, super, type); + return (1); + } + } + else if ((src = mimeFileType(mime, infile, infile, &compression)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Unable to determine MIME type of \"%s\"."), + command, infile); + return (1); + } + + sscanf(dsttype, "%15[^/]/%255s", super, type); + if (!_cups_strcasecmp(super, "printer")) + dst = printer_type; + else if ((dst = mimeType(mime, super, type)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Unknown destination MIME type %s/%s."), + command, super, type); + return (1); + } + + /* + * Figure out how to filter the file... + */ + + if (src == dst) + { + /* + * Special case - no filtering needed... + */ + + filters = cupsArrayNew(NULL, NULL); + cupsArrayAdd(filters, &GZIPFilter); + GZIPFilter.src = src; + GZIPFilter.dst = dst; + } + else if ((filters = mimeFilter(mime, src, dst, &cost)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: No filter to convert from %s/%s to %s/%s."), + command, src->super, src->type, dst->super, dst->type); + return (1); + } + else if (compression) + cupsArrayInsert(filters, &GZIPFilter); + + if (prefilter_type) + { + /* + * Add pre-filters... + */ + + mime_filter_t *filter, /* Current filter */ + *prefilter; /* Current pre-filter */ + cups_array_t *prefilters = cupsArrayNew(NULL, NULL); + /* New filters array */ + + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if ((prefilter = mimeFilterLookup(mime, filter->src, + prefilter_type)) != NULL) + cupsArrayAdd(prefilters, prefilter); + + cupsArrayAdd(prefilters, filter); + } + + cupsArrayDelete(filters); + filters = prefilters; + } + + /* + * Do it! + */ + + status = exec_filters(src, filters, infile, outfile, ppdfile, printer, user, + title, num_options, options); + + /* + * Remove files as needed, then exit... + */ + + if (TempFile[0]) + unlink(TempFile); + + if (removeppd && ppdfile) + unlink(ppdfile); + + if (removeinfile && infile) + unlink(infile); + + return (status); +} + + +/* + * 'add_printer_filter()' - Add a single filters from a PPD file. + */ + +static void +add_printer_filter( + const char *command, /* I - Command name */ + mime_t *mime, /* I - MIME database */ + mime_type_t *filtertype, /* I - Printer or prefilter MIME type */ + const char *filter) /* I - Filter to add */ +{ + char super[MIME_MAX_SUPER], /* Super-type for filter */ + type[MIME_MAX_TYPE], /* Type for filter */ + dsuper[MIME_MAX_SUPER], /* Destination super-type for filter */ + dtype[MIME_MAX_TYPE], /* Destination type for filter */ + dest[MIME_MAX_SUPER + MIME_MAX_TYPE + 2], + /* Destination super/type */ + program[1024]; /* Program/filter name */ + int cost; /* Cost of filter */ + size_t maxsize = 0; /* Maximum supported file size */ + mime_type_t *temptype, /* MIME type looping var */ + *desttype; /* Destination MIME type */ + mime_filter_t *filterptr; /* MIME filter */ + + + /* + * Parse the filter string; it should be in one of the following formats: + * + * source/type cost program + * source/type cost maxsize(nnnn) program + * source/type dest/type cost program + * source/type dest/type cost maxsize(nnnn) program + */ + + if (sscanf(filter, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + super, type, dsuper, dtype, &cost, program) == 6) + { + snprintf(dest, sizeof(dest), "%s/%s/%s", filtertype->type, dsuper, dtype); + + if ((desttype = mimeType(mime, "printer", dest)) == NULL) + desttype = mimeAddType(mime, "printer", dest); + } + else + { + if (sscanf(filter, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost, + program) == 4) + { + desttype = filtertype; + } + else + { + _cupsLangPrintf(stderr, _("%s: Invalid filter string \"%s\"."), command, + filter); + return; + } + } + + if (!strncmp(program, "maxsize(", 8)) + { + char *ptr; /* Pointer into maxsize(nnnn) program */ + + maxsize = strtoll(program + 8, &ptr, 10); + + if (*ptr != ')') + { + printf("testmime: Invalid filter string \"%s\".\n", filter); + return; + } + + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + } + + /* + * See if the filter program exists; if not, stop the printer and flag + * the error! + */ + + if (strcmp(program, "-")) + { + char filename[1024]; /* Full path to program */ + + if (program[0] == '/') + strlcpy(filename, program, sizeof(filename)); + else + snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin, program); + + if (_cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !geteuid(), check_cb, + (void *)command)) + return; + } + + /* + * Add the filter to the MIME database, supporting wildcards as needed... + */ + + for (temptype = mimeFirstType(mime); + temptype; + temptype = mimeNextType(mime)) + if (((super[0] == '*' && _cups_strcasecmp(temptype->super, "printer")) || + !_cups_strcasecmp(temptype->super, super)) && + (type[0] == '*' || !_cups_strcasecmp(temptype->type, type))) + { + if (desttype != filtertype) + { + filterptr = mimeAddFilter(mime, temptype, desttype, cost, program); + + if (!mimeFilterLookup(mime, desttype, filtertype)) + mimeAddFilter(mime, desttype, filtertype, 0, "-"); + } + else + filterptr = mimeAddFilter(mime, temptype, filtertype, cost, program); + + if (filterptr) + filterptr->maxsize = maxsize; + } +} + + +/* + * 'add_printer_filters()' - Add filters from a PPD file. + */ + +static mime_type_t * /* O - Printer type or NULL on error */ +add_printer_filters( + const char *command, /* I - Command name */ + mime_t *mime, /* I - MIME database */ + const char *printer, /* I - Printer name */ + const char *ppdfile, /* I - PPD file */ + mime_type_t **prefilter_type) /* O - Prefilter type */ +{ + ppd_file_t *ppd; /* PPD file data */ + _ppd_cache_t *pc; /* Cache data for PPD */ + const char *value; /* Filter definition value */ + mime_type_t *printer_type; /* Printer filter type */ + + + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + { + ppd_status_t status; /* PPD load status */ + int linenum; /* Line number */ + + status = ppdLastError(&linenum); + _cupsLangPrintf(stderr, _("%s: Unable to open PPD file: %s on line %d."), + command, ppdErrorString(status), linenum); + return (NULL); + } + + pc = _ppdCacheCreateWithPPD(ppd); + if (!pc) + return (NULL); + + printer_type = mimeAddType(mime, "printer", printer); + *prefilter_type = NULL; + + if (pc->filters) + { + for (value = (const char *)cupsArrayFirst(pc->filters); + value; + value = (const char *)cupsArrayNext(pc->filters)) + add_printer_filter(command, mime, printer_type, value); + } + else + { + add_printer_filter(command, mime, printer_type, + "application/vnd.cups-raw 0 -"); + add_printer_filter(command, mime, printer_type, + "application/vnd.cups-postscript 0 -"); + } + + if (pc->prefilters) + { + *prefilter_type = mimeAddType(mime, "prefilter", printer); + + for (value = (const char *)cupsArrayFirst(pc->prefilters); + value; + value = (const char *)cupsArrayNext(pc->prefilters)) + add_printer_filter(command, mime, *prefilter_type, value); + } + + return (printer_type); +} + + +/* + * 'check_cb()' - Callback function for _cupsFileCheck. + */ + +static void +check_cb(void *context, /* I - Context (command name) */ + _cups_fc_result_t result, /* I - Result of check */ + const char *message) /* I - Localized message */ +{ + (void)result; + + _cupsLangPrintf(stderr, _("%s: %s"), (char *)context, message); +} + + +/* + * 'compare_pids()' - Compare two filter PIDs... + */ + +static int /* O - Result of comparison */ +compare_pids(mime_filter_t *a, /* I - First filter */ + mime_filter_t *b) /* I - Second filter */ +{ + /* + * Because we're particularly lazy, we store the process ID in the "cost" + * variable... + */ + + return (a->cost - b->cost); +} + + +/* + * 'escape_options()' - Convert an options array to a string. + */ + +static char * /* O - Option string */ +escape_options( + int num_options, /* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + int i; /* Looping var */ + cups_option_t *option; /* Current option */ + int bytes; /* Number of bytes needed */ + char *s, /* Option string */ + *sptr, /* Pointer into string */ + *vptr; /* Pointer into value */ + + + /* + * Figure out the worst-case number of bytes we need for the option string. + */ + + for (i = num_options, option = options, bytes = 1; i > 0; i --, option ++) + bytes += 2 * (strlen(option->name) + strlen(option->value)) + 2; + + if ((s = malloc(bytes)) == NULL) + return (NULL); + + /* + * Copy the options to the string... + */ + + for (i = num_options, option = options, sptr = s; i > 0; i --, option ++) + { + if (!strcmp(option->name, "copies")) + continue; + + if (sptr > s) + *sptr++ = ' '; + + strcpy(sptr, option->name); + sptr += strlen(sptr); + *sptr++ = '='; + + for (vptr = option->value; *vptr;) + { + if (strchr("\\ \t\n", *vptr)) + *sptr++ = '\\'; + + *sptr++ = *vptr++; + } + } + + *sptr = '\0'; + + return (s); +} + + +/* + * 'exec_filter()' - Execute a single filter. + */ + +static int /* O - Process ID or -1 on error */ +exec_filter(const char *filter, /* I - Filter to execute */ + char **argv, /* I - Argument list */ + char **envp, /* I - Environment list */ + int infd, /* I - Stdin file descriptor */ + int outfd) /* I - Stdout file descriptor */ +{ + int pid, /* Process ID */ + fd; /* Temporary file descriptor */ +#if defined(__APPLE__) + char processPath[1024], /* CFProcessPath environment variable */ + linkpath[1024]; /* Link path for symlinks... */ + int linkbytes; /* Bytes for link path */ + + + /* + * Add special voodoo magic for MacOS X - this allows MacOS X + * programs to access their bundle resources properly... + */ + + if ((linkbytes = readlink(filter, linkpath, sizeof(linkpath) - 1)) > 0) + { + /* + * Yes, this is a symlink to the actual program, nul-terminate and + * use it... + */ + + linkpath[linkbytes] = '\0'; + + if (linkpath[0] == '/') + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s", + linkpath); + else + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s/%s", + dirname((char *)filter), linkpath); + } + else + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s", filter); + + envp[0] = processPath; /* Replace string */ +#endif /* __APPLE__ */ + + if ((pid = fork()) == 0) + { + /* + * Child process goes here... + * + * Update stdin/stdout/stderr as needed... + */ + + if (infd != 0) + { + if (infd < 0) + infd = open("/dev/null", O_RDONLY); + + if (infd > 0) + { + dup2(infd, 0); + close(infd); + } + } + + if (outfd != 1) + { + if (outfd < 0) + outfd = open("/dev/null", O_WRONLY); + + if (outfd > 1) + { + dup2(outfd, 1); + close(outfd); + } + } + + if ((fd = open("/dev/null", O_RDWR)) > 3) + { + dup2(fd, 3); + close(fd); + } + fcntl(3, F_SETFL, O_NDELAY); + + if ((fd = open("/dev/null", O_RDWR)) > 4) + { + dup2(fd, 4); + close(fd); + } + fcntl(4, F_SETFL, O_NDELAY); + + /* + * Execute command... + */ + + execve(filter, argv, envp); + + perror(filter); + + exit(errno); + } + + return (pid); +} + + +/* + * 'exec_filters()' - Execute filters for the given file and options. + */ + +static int /* O - 0 on success, 1 on error */ +exec_filters(mime_type_t *srctype, /* I - Source type */ + cups_array_t *filters, /* I - Array of filters to run */ + const char *infile, /* I - File to filter */ + const char *outfile, /* I - File to create */ + const char *ppdfile, /* I - PPD file, if any */ + const char *printer, /* I - Printer name */ + const char *user, /* I - Username */ + const char *title, /* I - Job title */ + int num_options, /* I - Number of filter options */ + cups_option_t *options) /* I - Filter options */ +{ + int i; /* Looping var */ + const char *argv[8], /* Command-line arguments */ + *envp[15], /* Environment variables */ + *temp; /* Temporary string */ + char *optstr, /* Filter options */ + content_type[1024], /* CONTENT_TYPE */ + cups_datadir[1024], /* CUPS_DATADIR */ + cups_fontpath[1024], /* CUPS_FONTPATH */ + cups_serverbin[1024], /* CUPS_SERVERBIN */ + cups_serverroot[1024], /* CUPS_SERVERROOT */ + lang[1024], /* LANG */ + path[1024], /* PATH */ + ppd[1024], /* PPD */ + printer_info[255], /* PRINTER_INFO env variable */ + printer_location[255], /* PRINTER_LOCATION env variable */ + printer_name[255], /* PRINTER env variable */ + rip_max_cache[1024], /* RIP_MAX_CACHE */ + userenv[1024], /* USER */ + program[1024]; /* Program to run */ + mime_filter_t *filter, /* Current filter */ + *next; /* Next filter */ + int current, /* Current filter */ + filterfds[2][2], /* Pipes for filters */ + pid, /* Process ID of filter */ + status, /* Exit status */ + retval; /* Return value */ + cups_array_t *pids; /* Executed filters array */ + mime_filter_t key; /* Search key for filters */ + cups_lang_t *language; /* Current language */ + cups_dest_t *dest; /* Destination information */ + + + /* + * Setup the filter environment and command-line... + */ + + optstr = escape_options(num_options, options); + + snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", + srctype->super, srctype->type); + snprintf(cups_datadir, sizeof(cups_datadir), "CUPS_DATADIR=%s", DataDir); + snprintf(cups_fontpath, sizeof(cups_fontpath), "CUPS_FONTPATH=%s", FontPath); + snprintf(cups_serverbin, sizeof(cups_serverbin), "CUPS_SERVERBIN=%s", + ServerBin); + snprintf(cups_serverroot, sizeof(cups_serverroot), "CUPS_SERVERROOT=%s", + ServerRoot); + language = cupsLangDefault(); + snprintf(lang, sizeof(lang), "LANG=%s.UTF8", language->language); + snprintf(path, sizeof(path), "PATH=%s", Path); + if (ppdfile) + snprintf(ppd, sizeof(ppd), "PPD=%s", ppdfile); + else if ((temp = getenv("PPD")) != NULL) + snprintf(ppd, sizeof(ppd), "PPD=%s", temp); + else +#ifdef __APPLE__ + if (!access("/System/Library/Frameworks/ApplicationServices.framework/" + "Versions/A/Frameworks/PrintCore.framework/Versions/A/" + "Resources/English.lproj/Generic.ppd", 0)) + strlcpy(ppd, "PPD=/System/Library/Frameworks/ApplicationServices.framework/" + "Versions/A/Frameworks/PrintCore.framework/Versions/A/" + "Resources/English.lproj/Generic.ppd", sizeof(ppd)); + else + strlcpy(ppd, "PPD=/System/Library/Frameworks/ApplicationServices.framework/" + "Versions/A/Frameworks/PrintCore.framework/Versions/A/" + "Resources/Generic.ppd", sizeof(ppd)); +#else + snprintf(ppd, sizeof(ppd), "PPD=%s/model/laserjet.ppd", DataDir); +#endif /* __APPLE__ */ + snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); + snprintf(userenv, sizeof(userenv), "USER=%s", user); + + if (printer && + (dest = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, NULL)) != NULL) + { + if ((temp = cupsGetOption("printer-info", dest->num_options, + dest->options)) != NULL) + snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", temp); + else + snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", printer); + + if ((temp = cupsGetOption("printer-location", dest->num_options, + dest->options)) != NULL) + snprintf(printer_location, sizeof(printer_location), + "PRINTER_LOCATION=%s", temp); + else + strlcpy(printer_location, "PRINTER_LOCATION=Unknown", + sizeof(printer_location)); + } + else + { + snprintf(printer_info, sizeof(printer_info), "PRINTER_INFO=%s", + printer ? printer : "Unknown"); + strlcpy(printer_location, "PRINTER_LOCATION=Unknown", + sizeof(printer_location)); + } + + snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", + printer ? printer : "Unknown"); + + argv[0] = (char *)printer; + argv[1] = "1"; + argv[2] = user; + argv[3] = title; + argv[4] = cupsGetOption("copies", num_options, options); + argv[5] = optstr; + argv[6] = infile; + argv[7] = NULL; + + if (!argv[4]) + argv[4] = "1"; + + envp[0] = ""; + envp[1] = content_type; + envp[2] = cups_datadir; + envp[3] = cups_fontpath; + envp[4] = cups_serverbin; + envp[5] = cups_serverroot; + envp[6] = lang; + envp[7] = path; + envp[8] = ppd; + envp[9] = printer_info; + envp[10] = printer_location; + envp[11] = printer_name; + envp[12] = rip_max_cache; + envp[13] = userenv; + envp[14] = NULL; + + for (i = 0; argv[i]; i ++) + fprintf(stderr, "DEBUG: argv[%d]=\"%s\"\n", i, argv[i]); + + for (i = 0; envp[i]; i ++) + fprintf(stderr, "DEBUG: envp[%d]=\"%s\"\n", i, envp[i]); + + /* + * Execute all of the filters... + */ + + pids = cupsArrayNew((cups_array_func_t)compare_pids, NULL); + current = 0; + filterfds[0][0] = -1; + filterfds[0][1] = -1; + filterfds[1][0] = -1; + filterfds[1][1] = -1; + + if (!infile) + filterfds[0][0] = 0; + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = next, current = 1 - current) + { + next = (mime_filter_t *)cupsArrayNext(filters); + + if (filter->filter[0] == '/') + strlcpy(program, filter->filter, sizeof(program)); + else + snprintf(program, sizeof(program), "%s/filter/%s", ServerBin, + filter->filter); + + if (filterfds[!current][1] > 1) + { + close(filterfds[1 - current][0]); + close(filterfds[1 - current][1]); + + filterfds[1 - current][0] = -1; + filterfds[1 - current][0] = -1; + } + + if (next) + open_pipe(filterfds[1 - current]); + else if (outfile) + { + filterfds[1 - current][1] = open(outfile, O_CREAT | O_TRUNC | O_WRONLY, + 0666); + + if (filterfds[1 - current][1] < 0) + fprintf(stderr, "ERROR: Unable to create \"%s\" - %s\n", outfile, + strerror(errno)); + } + else + filterfds[1 - current][1] = 1; + + pid = exec_filter(program, (char **)argv, (char **)envp, + filterfds[current][0], filterfds[1 - current][1]); + + if (pid > 0) + { + fprintf(stderr, "INFO: %s (PID %d) started.\n", filter->filter, pid); + + filter->cost = pid; + cupsArrayAdd(pids, filter); + } + else + break; + + argv[6] = NULL; + } + + /* + * Close remaining pipes... + */ + + if (filterfds[0][1] > 1) + { + close(filterfds[0][0]); + close(filterfds[0][1]); + } + + if (filterfds[1][1] > 1) + { + close(filterfds[1][0]); + close(filterfds[1][1]); + } + + /* + * Wait for the children to exit... + */ + + retval = 0; + + while (cupsArrayCount(pids) > 0) + { + if ((pid = wait(&status)) < 0) + continue; + + key.cost = pid; + if ((filter = (mime_filter_t *)cupsArrayFind(pids, &key)) != NULL) + { + cupsArrayRemove(pids, filter); + + if (status) + { + if (WIFEXITED(status)) + fprintf(stderr, "ERROR: %s (PID %d) stopped with status %d\n", + filter->filter, pid, WEXITSTATUS(status)); + else + fprintf(stderr, "ERROR: %s (PID %d) crashed on signal %d\n", + filter->filter, pid, WTERMSIG(status)); + + retval = 1; + } + else + fprintf(stderr, "INFO: %s (PID %d) exited with no errors.\n", + filter->filter, pid); + } + } + + cupsArrayDelete(pids); + + return (retval); +} + + +/* + * 'get_job_file()' - Get the specified job file. + */ + +static void +get_job_file(const char *job) /* I - Job ID */ +{ + long jobid, /* Job ID */ + docnum; /* Document number */ + const char *jobptr; /* Pointer into job ID string */ + char uri[1024]; /* job-uri */ + http_t *http; /* Connection to server */ + ipp_t *request; /* Request data */ + int tempfd; /* Temporary file */ + + + /* + * Get the job ID and document number, if any... + */ + + if ((jobptr = strrchr(job, '-')) != NULL) + jobptr ++; + else + jobptr = job; + + jobid = strtol(jobptr, (char **)&jobptr, 10); + + if (*jobptr == ',') + docnum = strtol(jobptr + 1, NULL, 10); + else + docnum = 1; + + if (jobid < 1 || jobid > INT_MAX) + { + _cupsLangPrintf(stderr, _("cupsfilter: Invalid job ID %d."), (int)jobid); + exit(1); + } + + if (docnum < 1 || docnum > INT_MAX) + { + _cupsLangPrintf(stderr, _("cupsfilter: Invalid document number %d."), + (int)docnum); + exit(1); + } + + /* + * Ask the server for the document file... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), + "cupsfilter"); + exit(1); + } + + request = ippNewRequest(CUPS_GET_DOCUMENT); + + snprintf(uri, sizeof(uri), "ipp://localhost/jobs/%d", (int)jobid); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "document-number", + (int)docnum); + + if ((tempfd = cupsTempFd(TempFile, sizeof(TempFile))) == -1) + { + _cupsLangPrintError("ERROR", _("Unable to create temporary file")); + httpClose(http); + exit(1); + } + + signal(SIGTERM, sighandler); + + ippDelete(cupsDoIORequest(http, request, "/", -1, tempfd)); + + close(tempfd); + + httpClose(http); + + if (cupsLastError() != IPP_OK) + { + _cupsLangPrintf(stderr, _("cupsfilter: Unable to get job file - %s"), + cupsLastErrorString()); + unlink(TempFile); + exit(1); + } +} + + +/* + * 'open_pipe()' - Create a pipe which is closed on exec. + */ + +static int /* O - 0 on success, -1 on error */ +open_pipe(int *fds) /* O - Pipe file descriptors (2) */ +{ + /* + * Create the pipe... + */ + + if (pipe(fds)) + { + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + /* + * Set the "close on exec" flag on each end of the pipe... + */ + + if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + /* + * Return 0 indicating success... + */ + + return (0); +} + + +/* + * 'read_cupsd_conf()' - Read the cupsd.conf file to get the filter settings. + */ + +static int /* O - 0 on success, 1 on error */ +read_cupsd_conf(const char *filename) /* I - File to read */ +{ + cups_file_t *fp; /* cupsd.conf file */ + const char *temp; /* Temporary string */ + char line[1024], /* Line from file */ + *ptr; /* Pointer into line */ + int linenum; /* Current line number */ + + + if ((temp = getenv("CUPS_DATADIR")) != NULL) + set_string(&DataDir, temp); + else + set_string(&DataDir, CUPS_DATADIR); + + if ((temp = getenv("CUPS_FONTPATH")) != NULL) + set_string(&FontPath, temp); + else + set_string(&FontPath, CUPS_FONTPATH); + + set_string(&RIPCache, "128m"); + + if ((temp = getenv("CUPS_SERVERBIN")) != NULL) + set_string(&ServerBin, temp); + else + set_string(&ServerBin, CUPS_SERVERBIN); + + strlcpy(line, filename, sizeof(line)); + if ((ptr = strrchr(line, '/')) != NULL) + *ptr = '\0'; + else + getcwd(line, sizeof(line)); + + set_string(&ServerRoot, line); + + if ((fp = cupsFileOpen(filename, "r")) != NULL) + { + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &ptr, &linenum)) + { + if (!_cups_strcasecmp(line, "DataDir")) + set_string(&DataDir, ptr); + else if (!_cups_strcasecmp(line, "FontPath")) + set_string(&FontPath, ptr); + else if (!_cups_strcasecmp(line, "RIPCache")) + set_string(&RIPCache, ptr); + else if (!_cups_strcasecmp(line, "ServerBin")) + set_string(&ServerBin, ptr); + else if (!_cups_strcasecmp(line, "ServerRoot")) + set_string(&ServerRoot, ptr); + } + + cupsFileClose(fp); + } + + snprintf(line, sizeof(line), + "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR ":/bin:/usr/bin", + ServerBin); + set_string(&Path, line); + + return (0); +} + + +/* + * 'set_string()' - Copy and set a string. + */ + +static void +set_string(char **s, /* O - Copy of string */ + const char *val) /* I - String to copy */ +{ + if (*s) + free(*s); + + *s = strdup(val); +} + + +/* + * 'sighandler()' - Signal catcher for when we print from stdin... + */ + +static void +sighandler(int s) /* I - Signal number */ +{ + /* + * Remove the temporary file we're using to print a job file... + */ + + if (TempFile[0]) + unlink(TempFile); + + /* + * Exit... + */ + + exit(s); +} + + +/* + * 'usage()' - Show program usage... + */ + +static void +usage(const char *command, /* I - Command name */ + const char *opt) /* I - Incorrect option, if any */ +{ + if (opt) + _cupsLangPrintf(stderr, _("%s: Unknown option \"%c\"."), command, *opt); + + if (!strcmp(command, "cupsfilter")) + { + _cupsLangPuts(stdout, _("Usage: cupsfilter [ options ] filename")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -D Remove the input file " + "when finished.")); + _cupsLangPuts(stdout, _(" -P filename.ppd Set PPD file.")); + _cupsLangPuts(stdout, _(" -U username Set username for job.")); + _cupsLangPuts(stdout, _(" -c cupsd.conf Set cupsd.conf file to " + "use.")); + _cupsLangPuts(stdout, _(" -d printer Use the named " + "printer.")); + _cupsLangPuts(stdout, _(" -e Use every filter from " + "the PPD file.")); + _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type " + "(otherwise auto-typed).")); + _cupsLangPuts(stdout, _(" -j job-id[,N] Filter file N from the " + "specified job (default is file 1).")); + _cupsLangPuts(stdout, _(" -m mime/type Set output MIME type " + "(otherwise application/pdf).")); + _cupsLangPuts(stdout, _(" -n copies Set number of copies.")); + _cupsLangPuts(stdout, _(" -o name=value Set option(s).")); + _cupsLangPuts(stdout, _(" -p filename.ppd Set PPD file.")); + _cupsLangPuts(stdout, _(" -t title Set title.")); + _cupsLangPuts(stdout, _(" -u Remove the PPD file " + "when finished.")); + } + else + { + _cupsLangPuts(stdout, _("Usage: convert [ options ]")); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -D Remove the input file " + "when finished.")); + _cupsLangPuts(stdout, _(" -J title Set title.")); + _cupsLangPuts(stdout, _(" -P filename.ppd Set PPD file.")); + _cupsLangPuts(stdout, _(" -U username Set username for job.")); + _cupsLangPuts(stdout, _(" -a 'name=value ...' Set option(s).")); + _cupsLangPuts(stdout, _(" -c copies Set number of copies.")); + _cupsLangPuts(stdout, _(" -d printer Use the named " + "printer.")); + _cupsLangPuts(stdout, _(" -e Use every filter from " + "the PPD file.")); + _cupsLangPuts(stdout, _(" -f filename Set file to be " + "converted (otherwise stdin).")); + _cupsLangPuts(stdout, _(" -i mime/type Set input MIME type " + "(otherwise auto-typed).")); + _cupsLangPuts(stdout, _(" -j mime/type Set output MIME type " + "(otherwise application/pdf).")); + _cupsLangPuts(stdout, _(" -o filename Set file to be " + "generated (otherwise stdout).")); + _cupsLangPuts(stdout, _(" -u Remove the PPD file " + "when finished.")); + } + + exit(1); +} + + +/* + * End of "$Id: cupsfilter.c 9862 2011-08-03 02:44:09Z mike $". + */ diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c new file mode 100644 index 0000000..91b123c --- /dev/null +++ b/scheduler/dirsvc.c @@ -0,0 +1,6147 @@ +/* + * "$Id: dirsvc.c 10243 2012-02-11 02:05:21Z mike $" + * + * Directory services routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdDeregisterPrinter() - Stop sending broadcast information for a local + * printer and remove any pending references to + * remote printers. + * cupsdLoadRemoteCache() - Load the remote printer cache. + * cupsdRegisterPrinter() - Start sending broadcast information for a + * printer or update the broadcast contents. + * cupsdRestartPolling() - Restart polling servers as needed. + * cupsdSaveRemoteCache() - Save the remote printer cache. + * cupsdSendBrowseList() - Send new browsing information as necessary. + * ldap_rebind_proc() - Callback function for LDAP rebind + * ldap_connect() - Start new LDAP connection + * ldap_reconnect() - Reconnect to LDAP Server + * ldap_disconnect() - Disconnect from LDAP Server + * cupsdStartAvahiClient() - Start an Avahi client if needed + * cupsdStartBrowsing() - Start sending and receiving broadcast + * information. + * cupsdStartPolling() - Start polling servers as needed. + * cupsdStopBrowsing() - Stop sending and receiving broadcast + * information. + * cupsdStopPolling() - Stop polling servers as needed. + * cupsdUpdateDNSSDName() - Update the computer name we use for + * browsing... + * cupsdUpdateLDAPBrowse() - Scan for new printers via LDAP... + * cupsdUpdateSLPBrowse() - Get browsing information via SLP. + * dequote() - Remote quotes from a string. + * dnssdAddAlias() - Add a DNS-SD alias name. + * dnssdBuildTxtRecord() - Build a TXT record from printer info. + * dnssdComparePrinters() - Compare the registered names of two printers. + * dnssdDeregisterPrinter() - Stop sending broadcast information for a + * printer. + * dnssdPackTxtRecord() - Pack an array of key/value pairs into the TXT + * record format. + * avahiPackTxtRecord() - Pack an array of key/value pairs into an + * AvahiStringList. + * dnssdRegisterCallback() - DNSServiceRegister callback. + * dnssdRegisterPrinter() - Start sending broadcast information for a + * printer or update the broadcast contents. + * dnssdStop() - Stop all DNS-SD registrations. + * dnssdUpdate() - Handle DNS-SD queries. + * get_auth_info_required() - Get the auth-info-required value to advertise. + * get_hostconfig() - Get an /etc/hostconfig service setting. + * is_local_queue() - Determine whether the URI points at a local + * queue. + * process_browse_data() - Process new browse data. + * process_implicit_classes() - Create/update implicit classes as needed. + * send_cups_browse() - Send new browsing information using the CUPS + * protocol. + * ldap_search_rec() - LDAP Search with reconnect + * ldap_freeres() - Free LDAPMessage + * ldap_getval_char() - Get first LDAP value and convert to string + * send_ldap_ou() - Send LDAP ou registrations. + * send_ldap_browse() - Send LDAP printer registrations. + * ldap_dereg_printer() - Delete printer from directory + * ldap_dereg_ou() - Remove the organizational unit. + * send_slp_browse() - Register the specified printer with SLP. + * slp_attr_callback() - SLP attribute callback + * slp_dereg_printer() - SLPDereg() the specified printer + * slp_get_attr() - Get an attribute from an SLP registration. + * slp_reg_callback() - Empty SLPRegReport. + * slp_url_callback() - SLP service url callback + * update_cups_browse() - Update the browse lists using the CUPS + * protocol. + * update_lpd() - Update the LPD configuration as needed. + * update_polling() - Read status messages from the poll daemons. + * update_smb() - Update the SMB configuration as needed. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#include + +#ifdef HAVE_DNSSD +# include +# ifdef __APPLE__ +# include +# ifdef HAVE_COREFOUNDATION +# include +# endif /* HAVE_COREFOUNDATION */ +# ifdef HAVE_SYSTEMCONFIGURATION +# include +# endif /* HAVE_SYSTEMCONFIGURATION */ +# endif /* __APPLE__ */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +# include +#endif /* HAVE_AVAHI */ + + +#ifdef HAVE_DNSSD +typedef char *cupsd_txt_record_t; +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +typedef AvahiStringList *cupsd_txt_record_t; +#endif /* HAVE_AVAHI */ + + +/* + * Local functions... + */ + +static char *dequote(char *d, const char *s, int dlen); +static char *get_auth_info_required(cupsd_printer_t *p, char *buffer, + size_t bufsize); +#ifdef __APPLE__ +static int get_hostconfig(const char *name); +#endif /* __APPLE__ */ +static int is_local_queue(const char *uri, char *host, int hostlen, + char *resource, int resourcelen); +static void process_browse_data(const char *uri, const char *host, + const char *resource, cups_ptype_t type, + ipp_pstate_t state, const char *location, + const char *info, const char *make_model, + int num_attrs, cups_option_t *attrs); +static void process_implicit_classes(void); +static void send_cups_browse(cupsd_printer_t *p); +#ifdef HAVE_LDAP +static LDAP *ldap_connect(void); +static LDAP *ldap_reconnect(void); +static void ldap_disconnect(LDAP *ld); +static int ldap_search_rec(LDAP *ld, char *base, int scope, + char *filter, char *attrs[], + int attrsonly, LDAPMessage **res); +static int ldap_getval_firststring(LDAP *ld, LDAPMessage *entry, + char *attr, char *retval, + unsigned long maxsize); +static void ldap_freeres(LDAPMessage *entry); +static void send_ldap_ou(char *ou, char *basedn, char *descstring); +static void send_ldap_browse(cupsd_printer_t *p); +static void ldap_dereg_printer(cupsd_printer_t *p); +static void ldap_dereg_ou(char *ou, char *basedn); +# ifdef HAVE_LDAP_REBIND_PROC +# if defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) +static int ldap_rebind_proc(LDAP *RebindLDAPHandle, + LDAP_CONST char *refsp, + ber_tag_t request, + ber_int_t msgid, + void *params); +# else +static int ldap_rebind_proc(LDAP *RebindLDAPHandle, + char **dnp, + char **passwdp, + int *authmethodp, + int freeit, + void *arg); +# endif /* defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) */ +# endif /* HAVE_LDAP_REBIND_PROC */ +#endif /* HAVE_LDAP */ +#ifdef HAVE_LIBSLP +static void send_slp_browse(cupsd_printer_t *p); +#endif /* HAVE_LIBSLP */ +static void update_cups_browse(void); +static void update_lpd(int onoff); +static void update_polling(void); +static void update_smb(int onoff); + + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +static cupsd_txt_record_t dnssdBuildTxtRecord(int *txt_len, cupsd_printer_t *p, + int for_lpd); +static int dnssdComparePrinters(cupsd_printer_t *a, cupsd_printer_t *b); +static void dnssdDeregisterPrinter(cupsd_printer_t *p); +static void dnssdRegisterPrinter(cupsd_printer_t *p); +static void dnssdStop(void); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_DNSSD +# ifdef HAVE_COREFOUNDATION +static void dnssdAddAlias(const void *key, const void *value, + void *context); +# endif /* HAVE_COREFOUNDATION */ +static void dnssdRegisterCallback(DNSServiceRef sdRef, + DNSServiceFlags flags, + DNSServiceErrorType errorCode, + const char *name, const char *regtype, + const char *domain, void *context); +static void dnssdUpdate(void); +#endif /* HAVE_DNSSD */ + +#ifdef HAVE_AVAHI +static AvahiStringList *avahiPackTxtRecord(char *keyvalue[][2], + int count); +static void avahi_entry_group_cb (AvahiEntryGroup *group, + AvahiEntryGroupState state, + void *userdata); +static void avahi_client_cb (AvahiClient *client, + AvahiClientState state, + void *userdata); +#endif /* HAVE_AVAHI */ + +#ifdef HAVE_LDAP +static const char * const ldap_attrs[] =/* CUPS LDAP attributes */ + { + "printerDescription", + "printerLocation", + "printerMakeAndModel", + "printerType", + "printerURI", + NULL + }; +#endif /* HAVE_LDAP */ + +#ifdef HAVE_LIBSLP +/* + * SLP definitions... + */ + +/* + * SLP service name for CUPS... + */ + +# define SLP_CUPS_SRVTYPE "service:printer" +# define SLP_CUPS_SRVLEN 15 + + +/* + * Printer service URL structure + */ + +typedef struct _slpsrvurl_s /**** SLP URL list ****/ +{ + struct _slpsrvurl_s *next; /* Next URL in list */ + char url[HTTP_MAX_URI]; + /* URL */ +} slpsrvurl_t; + + +/* + * Local functions... + */ + +static SLPBoolean slp_attr_callback(SLPHandle hslp, const char *attrlist, + SLPError errcode, void *cookie); +static void slp_dereg_printer(cupsd_printer_t *p); +static int slp_get_attr(const char *attrlist, const char *tag, + char **valbuf); +static void slp_reg_callback(SLPHandle hslp, SLPError errcode, + void *cookie); +static SLPBoolean slp_url_callback(SLPHandle hslp, const char *srvurl, + unsigned short lifetime, + SLPError errcode, void *cookie); +#endif /* HAVE_LIBSLP */ + + +/* + * 'cupsdDeregisterPrinter()' - Stop sending broadcast information for a + * local printer and remove any pending + * references to remote printers. + */ + +void +cupsdDeregisterPrinter( + cupsd_printer_t *p, /* I - Printer to register */ + int removeit) /* I - Printer being permanently removed */ +{ + /* + * Only deregister if browsing is enabled and it's a local printer... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdDeregisterPrinter(p=%p(%s), removeit=%d)", p, p->name, + removeit); + + if (!Browsing || !p->shared || + (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER))) + return; + + /* + * Announce the deletion... + */ + + if ((BrowseLocalProtocols & BROWSE_CUPS) && BrowseSocket >= 0) + { + cups_ptype_t savedtype = p->type; /* Saved printer type */ + + p->type |= CUPS_PRINTER_DELETE; + + send_cups_browse(p); + + p->type = savedtype; + } + +#ifdef HAVE_LIBSLP + if (BrowseLocalProtocols & BROWSE_SLP) + slp_dereg_printer(p); +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if (BrowseLocalProtocols & BROWSE_LDAP) + ldap_dereg_printer(p); +#endif /* HAVE_LDAP */ + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (removeit && (BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdDeregisterPrinter(p); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ +} + + +/* + * 'cupsdLoadRemoteCache()' - Load the remote printer cache. + */ + +void +cupsdLoadRemoteCache(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* remote.cache file */ + int linenum; /* Current line number */ + char line[4096], /* Line from file */ + *value, /* Pointer to value */ + *valueptr, /* Pointer into value */ + scheme[32], /* Scheme portion of URI */ + username[64], /* Username portion of URI */ + host[HTTP_MAX_HOST], + /* Hostname portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port number */ + cupsd_printer_t *p; /* Current printer */ + time_t now; /* Current time */ + + + /* + * Don't load the cache if the remote protocols are disabled... + */ + + if (!Browsing) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdLoadRemoteCache: Not loading remote cache."); + return; + } + + /* + * Open the remote.cache file... + */ + + snprintf(line, sizeof(line), "%s/remote.cache", CacheDir); + if ((fp = cupsdOpenConfFile(line)) == NULL) + return; + + /* + * Read printer configurations until we hit EOF... + */ + + linenum = 0; + p = NULL; + now = time(NULL); + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, " or + */ + + if (p == NULL && value) + { + /* + * Add the printer and a base file type... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdLoadRemoteCache: Loading printer %s...", value); + + if ((p = cupsdFindDest(value)) != NULL) + { + if (p->type & CUPS_PRINTER_CLASS) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Cached remote printer \"%s\" conflicts with " + "existing class!", + value); + p = NULL; + continue; + } + } + else + p = cupsdAddPrinter(value); + + p->accepting = 1; + p->state = IPP_PRINTER_IDLE; + p->type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; + p->browse_time = now; + p->browse_expire = now + BrowseTimeout; + + /* + * Set the default printer as needed... + */ + + if (!_cups_strcasecmp(line, " or + */ + + if (p == NULL && value) + { + /* + * Add the printer and a base file type... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdLoadRemoteCache: Loading class %s...", value); + + if ((p = cupsdFindDest(value)) != NULL) + p->type = CUPS_PRINTER_CLASS; + else + p = cupsdAddClass(value); + + p->accepting = 1; + p->state = IPP_PRINTER_IDLE; + p->type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; + p->browse_time = now; + p->browse_expire = now + BrowseTimeout; + + /* + * Set the default printer as needed... + */ + + if (!_cups_strcasecmp(line, "") || + !_cups_strcasecmp(line, "")) + { + if (p != NULL) + { + /* + * Close out the current printer... + */ + + cupsdSetPrinterAttrs(p); + + p = NULL; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!p) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "UUID")) + { + if (value && !strncmp(value, "urn:uuid:", 9)) + cupsdSetString(&(p->uuid), value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad UUID on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "Info")) + { + if (value) + cupsdSetString(&p->info, value); + } + else if (!_cups_strcasecmp(line, "MakeModel")) + { + if (value) + cupsdSetString(&p->make_model, value); + } + else if (!_cups_strcasecmp(line, "Location")) + { + if (value) + cupsdSetString(&p->location, value); + } + else if (!_cups_strcasecmp(line, "DeviceURI")) + { + if (value) + { + httpSeparateURI(HTTP_URI_CODING_ALL, value, scheme, sizeof(scheme), + username, sizeof(username), host, sizeof(host), &port, + resource, sizeof(resource)); + + cupsdSetString(&p->hostname, host); + cupsdSetString(&p->uri, value); + cupsdSetDeviceURI(p, value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "Option") && value) + { + /* + * Option name value + */ + + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (!*valueptr) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + else + { + for (; *valueptr && isspace(*valueptr & 255); *valueptr++ = '\0'); + + p->num_options = cupsAddOption(value, valueptr, p->num_options, + &(p->options)); + } + } + else if (!_cups_strcasecmp(line, "Reason")) + { + if (value) + { + for (i = 0 ; i < p->num_reasons; i ++) + if (!strcmp(value, p->reasons[i])) + break; + + if (i >= p->num_reasons && + p->num_reasons < (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + p->reasons[p->num_reasons] = _cupsStrAlloc(value); + p->num_reasons ++; + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "State")) + { + /* + * Set the initial queue state... + */ + + if (value && !_cups_strcasecmp(value, "idle")) + p->state = IPP_PRINTER_IDLE; + else if (value && !_cups_strcasecmp(value, "stopped")) + { + p->state = IPP_PRINTER_STOPPED; + cupsdSetPrinterReasons(p, "+paused"); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "StateMessage")) + { + /* + * Set the initial queue state message... + */ + + if (value) + strlcpy(p->state_message, value, sizeof(p->state_message)); + } + else if (!_cups_strcasecmp(line, "Accepting")) + { + /* + * Set the initial accepting state... + */ + + if (value && + (!_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "true"))) + p->accepting = 1; + else if (value && + (!_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "false"))) + p->accepting = 0; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "Type")) + { + if (value) + p->type = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "BrowseTime")) + { + if (value) + { + time_t t = atoi(value); + + if (t > p->browse_expire) + p->browse_expire = t; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "JobSheets")) + { + /* + * Set the initial job sheets... + */ + + if (value) + { + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (*valueptr) + *valueptr++ = '\0'; + + cupsdSetString(&p->job_sheets[0], value); + + while (isspace(*valueptr & 255)) + valueptr ++; + + if (*valueptr) + { + for (value = valueptr; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (*valueptr) + *valueptr = '\0'; + + cupsdSetString(&p->job_sheets[1], value); + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "AllowUser")) + { + if (value) + { + p->deny_users = 0; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else if (!_cups_strcasecmp(line, "DenyUser")) + { + if (value) + { + p->deny_users = 1; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of remote.cache.", linenum); + } + else + { + /* + * Something else we don't understand... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown configuration directive %s on line %d of remote.cache.", + line, linenum); + } + } + + cupsFileClose(fp); + + /* + * Do auto-classing if needed... + */ + + process_implicit_classes(); +} + + +/* + * 'cupsdRegisterPrinter()' - Start sending broadcast information for a + * printer or update the broadcast contents. + */ + +void +cupsdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdRegisterPrinter(p=%p(%s))", p, + p->name); + + if (!Browsing || !BrowseLocalProtocols || + (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER))) + return; + +#ifdef HAVE_LIBSLP +/* if (BrowseLocalProtocols & BROWSE_SLP) + slpRegisterPrinter(p); */ +#endif /* HAVE_LIBSLP */ + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if ((BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdRegisterPrinter(p); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ +} + + +/* + * 'cupsdRestartPolling()' - Restart polling servers as needed. + */ + +void +cupsdRestartPolling(void) +{ + int i; /* Looping var */ + cupsd_dirsvc_poll_t *pollp; /* Current polling server */ + + + for (i = 0, pollp = Polled; i < NumPolled; i ++, pollp ++) + if (pollp->pid) + kill(pollp->pid, SIGHUP); +} + + +/* + * 'cupsdSaveRemoteCache()' - Save the remote printer cache. + */ + +void +cupsdSaveRemoteCache(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* remote.cache file */ + char filename[1024], /* remote.cache filename */ + temp[1024], /* Temporary string */ + value[2048], /* Value string */ + *name; /* Current user name */ + cupsd_printer_t *printer; /* Current printer class */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + cups_option_t *option; /* Current option */ + + + /* + * Create the remote.cache file... + */ + + snprintf(filename, sizeof(filename), "%s/remote.cache", CacheDir); + + if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL) + return; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Saving remote.cache..."); + + /* + * Write a small header to the file... + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Remote cache file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd\n"); + + /* + * Write each local printer known to the system... + */ + + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Skip local destinations... + */ + + if (!(printer->type & CUPS_PRINTER_DISCOVERED)) + continue; + + /* + * Write printers as needed... + */ + + if (printer == DefaultPrinter) + cupsFilePuts(fp, "type & CUPS_PRINTER_CLASS) + cupsFilePrintf(fp, "Class %s>\n", printer->name); + else + cupsFilePrintf(fp, "Printer %s>\n", printer->name); + + cupsFilePrintf(fp, "BrowseTime %d\n", (int)printer->browse_expire); + + cupsFilePrintf(fp, "UUID %s\n", printer->uuid); + + if (printer->info) + cupsFilePutConf(fp, "Info", printer->info); + + if (printer->location) + cupsFilePutConf(fp, "Location", printer->location); + + if (printer->make_model) + cupsFilePutConf(fp, "MakeModel", printer->make_model); + + cupsFilePutConf(fp, "DeviceURI", printer->device_uri); + + if (printer->state == IPP_PRINTER_STOPPED) + cupsFilePuts(fp, "State Stopped\n"); + else + cupsFilePuts(fp, "State Idle\n"); + + for (i = 0; i < printer->num_reasons; i ++) + cupsFilePutConf(fp, "Reason", printer->reasons[i]); + + cupsFilePrintf(fp, "Type %d\n", printer->type); + + if (printer->accepting) + cupsFilePuts(fp, "Accepting Yes\n"); + else + cupsFilePuts(fp, "Accepting No\n"); + + snprintf(value, sizeof(value), "%s %s", printer->job_sheets[0], + printer->job_sheets[1]); + cupsFilePutConf(fp, "JobSheets", value); + + for (name = (char *)cupsArrayFirst(printer->users); + name; + name = (char *)cupsArrayNext(printer->users)) + cupsFilePutConf(fp, printer->deny_users ? "DenyUser" : "AllowUser", name); + + for (i = printer->num_options, option = printer->options; + i > 0; + i --, option ++) + { + snprintf(value, sizeof(value), "%s %s", option->name, option->value); + cupsFilePutConf(fp, "Option", value); + } + + if (printer->type & CUPS_PRINTER_CLASS) + cupsFilePuts(fp, "\n"); + else + cupsFilePuts(fp, "\n"); + } + + cupsdCloseCreatedConfFile(fp, filename); +} + + +/* + * 'cupsdSendBrowseList()' - Send new browsing information as necessary. + */ + +void +cupsdSendBrowseList(void) +{ + int count; /* Number of dests to update */ + cupsd_printer_t *p; /* Current printer */ + time_t ut, /* Minimum update time */ + to; /* Timeout time */ + + + if (!Browsing || !Printers) + return; + + /* + * Compute the update and timeout times... + */ + + to = time(NULL); + ut = to - BrowseInterval; + + /* + * Figure out how many printers need an update... + */ + + if (BrowseInterval > 0 && BrowseLocalProtocols) + { + int max_count; /* Maximum number to update */ + + + /* + * Throttle the number of printers we'll be updating this time + * around based on the number of queues that need updating and + * the maximum number of queues to update each second... + */ + + max_count = 2 * cupsArrayCount(Printers) / BrowseInterval + 1; + + for (count = 0, p = (cupsd_printer_t *)cupsArrayFirst(Printers); + count < max_count && p != NULL; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER)) && + p->shared && p->browse_time < ut) + count ++; + + /* + * Loop through all of the printers and send local updates as needed... + */ + + if (BrowseNext) + p = (cupsd_printer_t *)cupsArrayFind(Printers, BrowseNext); + else + p = (cupsd_printer_t *)cupsArrayFirst(Printers); + + for (; + count > 0; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Check for wraparound... + */ + + if (!p) + p = (cupsd_printer_t *)cupsArrayFirst(Printers); + + if (!p) + break; + else if ((p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER)) || + !p->shared) + continue; + else if (p->browse_time < ut) + { + /* + * Need to send an update... + */ + + count --; + + p->browse_time = time(NULL); + + if ((BrowseLocalProtocols & BROWSE_CUPS) && BrowseSocket >= 0) + send_cups_browse(p); + +#ifdef HAVE_LIBSLP + if (BrowseLocalProtocols & BROWSE_SLP) + send_slp_browse(p); +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if (BrowseLocalProtocols & BROWSE_LDAP) + send_ldap_browse(p); +#endif /* HAVE_LDAP */ + } + } + + /* + * Save where we left off so that all printers get updated... + */ + + BrowseNext = p; + } + + /* + * Loop through all of the printers and timeout old printers as needed... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * If this is a remote queue, see if it needs to be timed out... + */ + + if ((p->type & CUPS_PRINTER_DISCOVERED) && + !(p->type & CUPS_PRINTER_IMPLICIT) && + p->browse_expire < to) + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL, + "%s \'%s\' deleted by directory services (timeout).", + (p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer", + p->name); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Remote destination \"%s\" has timed out; " + "deleting it...", + p->name); + + cupsArraySave(Printers); + cupsdDeletePrinter(p, 1); + cupsArrayRestore(Printers); + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP | CUPSD_DIRTY_REMOTE); + } + } +} + + +#ifdef HAVE_LDAP_REBIND_PROC +# if defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) +/* + * 'ldap_rebind_proc()' - Callback function for LDAP rebind + */ + +static int /* O - Result code */ +ldap_rebind_proc( + LDAP *RebindLDAPHandle, /* I - LDAP handle */ + LDAP_CONST char *refsp, /* I - ??? */ + ber_tag_t request, /* I - ??? */ + ber_int_t msgid, /* I - ??? */ + void *params) /* I - ??? */ +{ + int rc; /* Result code */ +# if LDAP_API_VERSION > 3000 + struct berval bval; /* Bind value */ +# endif /* LDAP_API_VERSION > 3000 */ + + + (void)request; + (void)msgid; + (void)params; + + /* + * Bind to new LDAP server... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_rebind_proc: Rebind to %s", refsp); + +# if LDAP_API_VERSION > 3000 + bval.bv_val = BrowseLDAPPassword; + bval.bv_len = (BrowseLDAPPassword == NULL) ? 0 : strlen(BrowseLDAPPassword); + + rc = ldap_sasl_bind_s(RebindLDAPHandle, BrowseLDAPBindDN, LDAP_SASL_SIMPLE, + &bval, NULL, NULL, NULL); +# else + rc = ldap_bind_s(RebindLDAPHandle, BrowseLDAPBindDN, BrowseLDAPPassword, + LDAP_AUTH_SIMPLE); +# endif /* LDAP_API_VERSION > 3000 */ + + return (rc); +} + + +# else /* defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) */ +/* + * 'ldap_rebind_proc()' - Callback function for LDAP rebind + */ + +static int /* O - Result code */ +ldap_rebind_proc( + LDAP *RebindLDAPHandle, /* I - LDAP handle */ + char **dnp, /* I - ??? */ + char **passwdp, /* I - ??? */ + int *authmethodp, /* I - ??? */ + int freeit, /* I - ??? */ + void *arg) /* I - ??? */ +{ + switch (freeit) + { + case 1: + /* + * Free current values... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_rebind_proc: Free values..."); + + if (dnp && *dnp) + free(*dnp); + + if (passwdp && *passwdp) + free(*passwdp); + break; + + case 0: + /* + * Return credentials for LDAP referal... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "ldap_rebind_proc: Return necessary values..."); + + *dnp = strdup(BrowseLDAPBindDN); + *passwdp = strdup(BrowseLDAPPassword); + *authmethodp = LDAP_AUTH_SIMPLE; + break; + + default: + /* + * Should never happen... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP rebind has been called with wrong freeit value!"); + break; + } + + return (LDAP_SUCCESS); +} +# endif /* defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) */ +#endif /* HAVE_LDAP_REBIND_PROC */ + + +#ifdef HAVE_LDAP +/* + * 'ldap_connect()' - Start new LDAP connection + */ + +static LDAP * /* O - LDAP handle */ +ldap_connect(void) +{ + int rc; /* LDAP API status */ + int version = 3; /* LDAP version */ + struct berval bv = {0, ""}; /* SASL bind value */ + LDAP *TempBrowseLDAPHandle=NULL; + /* Temporary LDAP Handle */ +# if defined(HAVE_LDAP_SSL) && defined (HAVE_MOZILLA_LDAP) + int ldap_ssl = 0; /* LDAP SSL indicator */ + int ssl_err = 0; /* LDAP SSL error value */ +# endif /* defined(HAVE_LDAP_SSL) && defined (HAVE_MOZILLA_LDAP) */ + + +# ifdef HAVE_OPENLDAP +# ifdef HAVE_LDAP_SSL + /* + * Set the certificate file to use for encrypted LDAP sessions... + */ + + if (BrowseLDAPCACertFile) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "ldap_connect: Setting CA certificate file \"%s\"", + BrowseLDAPCACertFile); + + if ((rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE, + (void *)BrowseLDAPCACertFile)) != LDAP_SUCCESS) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to set CA certificate file for LDAP " + "connections: %d - %s", rc, ldap_err2string(rc)); + } +# endif /* HAVE_LDAP_SSL */ + + /* + * Initialize OPENLDAP connection... + * LDAP stuff currently only supports ldapi EXTERNAL SASL binds... + */ + + if (!BrowseLDAPServer || !_cups_strcasecmp(BrowseLDAPServer, "localhost")) + rc = ldap_initialize(&TempBrowseLDAPHandle, "ldapi:///"); + else + rc = ldap_initialize(&TempBrowseLDAPHandle, BrowseLDAPServer); + +# else /* HAVE_OPENLDAP */ + + int ldap_port = 0; /* LDAP port */ + char ldap_protocol[11], /* LDAP protocol */ + ldap_host[255]; /* LDAP host */ + + /* + * Split LDAP URI into its components... + */ + + if (!BrowseLDAPServer) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "BrowseLDAPServer not configured!"); + cupsdLogMessage(CUPSD_LOG_ERROR, "Disabling LDAP browsing!"); + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + return (NULL); + } + + sscanf(BrowseLDAPServer, "%10[^:]://%254[^:/]:%d", ldap_protocol, ldap_host, + &ldap_port); + + if (!strcmp(ldap_protocol, "ldap")) + ldap_ssl = 0; + else if (!strcmp(ldap_protocol, "ldaps")) + ldap_ssl = 1; + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unrecognized LDAP protocol (%s)!", + ldap_protocol); + cupsdLogMessage(CUPSD_LOG_ERROR, "Disabling LDAP browsing!"); + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + return (NULL); + } + + if (ldap_port == 0) + { + if (ldap_ssl) + ldap_port = LDAPS_PORT; + else + ldap_port = LDAP_PORT; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, "ldap_connect: PROT:%s HOST:%s PORT:%d", + ldap_protocol, ldap_host, ldap_port); + + /* + * Initialize LDAP connection... + */ + + if (!ldap_ssl) + { + if ((TempBrowseLDAPHandle = ldap_init(ldap_host, ldap_port)) == NULL) + rc = LDAP_OPERATIONS_ERROR; + else + rc = LDAP_SUCCESS; + +# ifdef HAVE_LDAP_SSL + } + else + { + /* + * Initialize SSL LDAP connection... + */ + + if (BrowseLDAPCACertFile) + { + rc = ldapssl_client_init(BrowseLDAPCACertFile, (void *)NULL); + if (rc != LDAP_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Failed to initialize LDAP SSL client!"); + rc = LDAP_OPERATIONS_ERROR; + } + else + { + if ((TempBrowseLDAPHandle = ldapssl_init(ldap_host, ldap_port, + 1)) == NULL) + rc = LDAP_OPERATIONS_ERROR; + else + rc = LDAP_SUCCESS; + } + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP SSL certificate file/database not configured!"); + rc = LDAP_OPERATIONS_ERROR; + } + +# else /* HAVE_LDAP_SSL */ + + /* + * Return error, because client libraries doesn't support SSL + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP client libraries do not support SSL"); + rc = LDAP_OPERATIONS_ERROR; + +# endif /* HAVE_LDAP_SSL */ + } +# endif /* HAVE_OPENLDAP */ + + /* + * Check return code from LDAP initialize... + */ + + if (rc != LDAP_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to initialize LDAP!"); + + if (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR) + cupsdLogMessage(CUPSD_LOG_ERROR, "Temporarily disabling LDAP browsing..."); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Disabling LDAP browsing!"); + + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + } + + ldap_disconnect(TempBrowseLDAPHandle); + + return (NULL); + } + + /* + * Upgrade LDAP version... + */ + + if (ldap_set_option(TempBrowseLDAPHandle, LDAP_OPT_PROTOCOL_VERSION, + (const void *)&version) != LDAP_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to set LDAP protocol version %d!", + version); + cupsdLogMessage(CUPSD_LOG_ERROR, "Disabling LDAP browsing!"); + + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + ldap_disconnect(TempBrowseLDAPHandle); + + return (NULL); + } + + /* + * Register LDAP rebind procedure... + */ + +# ifdef HAVE_LDAP_REBIND_PROC +# if defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) + + rc = ldap_set_rebind_proc(TempBrowseLDAPHandle, &ldap_rebind_proc, + (void *)NULL); + if (rc != LDAP_SUCCESS) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Setting LDAP rebind function failed with status %d: %s", + rc, ldap_err2string(rc)); + +# else + + ldap_set_rebind_proc(TempBrowseLDAPHandle, &ldap_rebind_proc, (void *)NULL); + +# endif /* defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000) */ +# endif /* HAVE_LDAP_REBIND_PROC */ + + /* + * Start LDAP bind... + */ + +# if LDAP_API_VERSION > 3000 + struct berval bval; + bval.bv_val = BrowseLDAPPassword; + bval.bv_len = (BrowseLDAPPassword == NULL) ? 0 : strlen(BrowseLDAPPassword); + + if (!BrowseLDAPServer || !_cups_strcasecmp(BrowseLDAPServer, "localhost")) + rc = ldap_sasl_bind_s(TempBrowseLDAPHandle, NULL, "EXTERNAL", &bv, NULL, + NULL, NULL); + else + rc = ldap_sasl_bind_s(TempBrowseLDAPHandle, BrowseLDAPBindDN, LDAP_SASL_SIMPLE, &bval, NULL, NULL, NULL); + +# else + rc = ldap_bind_s(TempBrowseLDAPHandle, BrowseLDAPBindDN, + BrowseLDAPPassword, LDAP_AUTH_SIMPLE); +# endif /* LDAP_API_VERSION > 3000 */ + + if (rc != LDAP_SUCCESS) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "LDAP bind failed with error %d: %s", + rc, ldap_err2string(rc)); + +# if defined(HAVE_LDAP_SSL) && defined (HAVE_MOZILLA_LDAP) + if (ldap_ssl && (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR)) + { + ssl_err = PORT_GetError(); + if (ssl_err != 0) + cupsdLogMessage(CUPSD_LOG_ERROR, "LDAP SSL error %d: %s", ssl_err, + ldapssl_err2string(ssl_err)); + } +# endif /* defined(HAVE_LDAP_SSL) && defined (HAVE_MOZILLA_LDAP) */ + + ldap_disconnect(TempBrowseLDAPHandle); + + return (NULL); + } + + cupsdLogMessage(CUPSD_LOG_INFO, "LDAP connection established"); + + return (TempBrowseLDAPHandle); +} + + +/* + * 'ldap_reconnect()' - Reconnect to LDAP Server + */ + +static LDAP * /* O - New LDAP handle */ +ldap_reconnect(void) +{ + LDAP *TempBrowseLDAPHandle = NULL; /* Temp Handle to LDAP server */ + + + /* + * Get a new LDAP Handle and replace the global Handle + * if the new connection was successful. + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Try LDAP reconnect..."); + + TempBrowseLDAPHandle = ldap_connect(); + + if (TempBrowseLDAPHandle != NULL) + { + if (BrowseLDAPHandle != NULL) + ldap_disconnect(BrowseLDAPHandle); + + BrowseLDAPHandle = TempBrowseLDAPHandle; + } + + return (BrowseLDAPHandle); +} + + +/* + * 'ldap_disconnect()' - Disconnect from LDAP Server + */ + +static void +ldap_disconnect(LDAP *ld) /* I - LDAP handle */ +{ + int rc; /* Return code */ + + + /* + * Close LDAP handle... + */ + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + rc = ldap_unbind_ext_s(ld, NULL, NULL); +# else + rc = ldap_unbind_s(ld); +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + + if (rc != LDAP_SUCCESS) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unbind from LDAP server failed with status %d: %s", + rc, ldap_err2string(rc)); +} +#endif /* HAVE_LDAP */ + + +#ifdef HAVE_AVAHI +/* + * 'cupsdStartAvahiClient()' - Start an Avahi client if needed + */ + +void +cupsdStartAvahiClient(void) +{ + int error = 0; + + if (!AvahiCupsClient && !AvahiCupsClientConnecting) + { + if (!AvahiCupsPollHandle) + AvahiCupsPollHandle = avahi_cups_poll_new (); + + if (AvahiCupsPollHandle) + { + if (avahi_client_new (avahi_cups_poll_get (AvahiCupsPollHandle), + AVAHI_CLIENT_NO_FAIL, + avahi_client_cb, NULL, + &error) != NULL) + AvahiCupsClientConnecting = 1; + else + cupsdLogMessage (CUPSD_LOG_WARN, "Avahi client failed: %d", error); + } + } +} +#endif /* HAVE_AVAHI */ + + +/* + * 'cupsdStartBrowsing()' - Start sending and receiving broadcast information. + */ + +void +cupsdStartBrowsing(void) +{ + int val; /* Socket option value */ + struct sockaddr_in addr; /* Broadcast address */ + cupsd_printer_t *p; /* Current printer */ + + + BrowseNext = NULL; + + if (!Browsing || !(BrowseLocalProtocols | BrowseRemoteProtocols)) + return; + + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_CUPS) + { + if (BrowseSocket < 0) + { + /* + * Create the broadcast socket... + */ + + if ((BrowseSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create broadcast socket - %s.", + strerror(errno)); + BrowseLocalProtocols &= ~BROWSE_CUPS; + BrowseRemoteProtocols &= ~BROWSE_CUPS; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + } + + if (BrowseSocket >= 0) + { + /* + * Bind the socket to browse port... + */ + + memset(&addr, 0, sizeof(addr)); + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_family = AF_INET; + addr.sin_port = htons(BrowsePort); + + if (bind(BrowseSocket, (struct sockaddr *)&addr, sizeof(addr))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to bind broadcast socket - %s.", + strerror(errno)); + +#ifdef WIN32 + closesocket(BrowseSocket); +#else + close(BrowseSocket); +#endif /* WIN32 */ + + BrowseSocket = -1; + BrowseLocalProtocols &= ~BROWSE_CUPS; + BrowseRemoteProtocols &= ~BROWSE_CUPS; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + } + + if (BrowseSocket >= 0) + { + /* + * Set the "broadcast" flag... + */ + + val = 1; + if (setsockopt(BrowseSocket, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to set broadcast mode - %s.", + strerror(errno)); + +#ifdef WIN32 + closesocket(BrowseSocket); +#else + close(BrowseSocket); +#endif /* WIN32 */ + + BrowseSocket = -1; + BrowseLocalProtocols &= ~BROWSE_CUPS; + BrowseRemoteProtocols &= ~BROWSE_CUPS; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + } + + if (BrowseSocket >= 0) + { + /* + * Close the socket on exec... + */ + + fcntl(BrowseSocket, F_SETFD, fcntl(BrowseSocket, F_GETFD) | FD_CLOEXEC); + + /* + * Finally, add the socket to the input selection set as needed... + */ + + if (BrowseRemoteProtocols & BROWSE_CUPS) + { + /* + * We only listen if we want remote printers... + */ + + cupsdAddSelect(BrowseSocket, (cupsd_selfunc_t)update_cups_browse, + NULL, NULL); + } + } + } + else + BrowseSocket = -1; + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_DNSSD) + { +#ifdef HAVE_DNSSD + DNSServiceErrorType error; /* Error from service creation */ +#endif /* HAVE_DNSSD */ + cupsd_listener_t *lis; /* Current listening socket */ + + +#ifdef HAVE_DNSSD + /* + * First create a "master" connection for all registrations... + */ + + if ((error = DNSServiceCreateConnection(&DNSSDRef)) + != kDNSServiceErr_NoError) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create master DNS-SD reference: %d", error); + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + else + { + /* + * Add the master connection to the select list... + */ + + int fd = DNSServiceRefSockFD(DNSSDRef); + + fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); + + cupsdAddSelect(fd, (cupsd_selfunc_t)dnssdUpdate, NULL, NULL); +#endif /* HAVE_DNSSD */ + + /* + * Then get the port we use for registrations. If we are not listening + * on any non-local ports, there is no sense sharing local printers via + * Bonjour... + */ + + DNSSDPort = 0; + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + { + if (httpAddrLocalhost(&(lis->address))) + continue; + + DNSSDPort = _httpAddrPort(&(lis->address)); + break; + } + + /* + * Create an array to track the printers we share... + */ + + if (BrowseRemoteProtocols & BROWSE_DNSSD) + DNSSDPrinters = cupsArrayNew(NULL, NULL); + + /* + * Set the computer name and register the web interface... + */ + + cupsdUpdateDNSSDName(); + +#ifdef HAVE_AVAHI + cupsdStartAvahiClient (); +#endif /* HAVE_AVAHI */ + +#ifdef HAVE_DNSSD + } +#endif /* HAVE_DNSSD */ + } +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_LIBSLP + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) + { + /* + * Open SLP handle... + */ + + if (SLPOpen("en", SLP_FALSE, &BrowseSLPHandle) != SLP_OK) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open an SLP handle; disabling SLP browsing!"); + BrowseLocalProtocols &= ~BROWSE_SLP; + BrowseRemoteProtocols &= ~BROWSE_SLP; + BrowseSLPHandle = NULL; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + + BrowseSLPRefresh = 0; + } + else + BrowseSLPHandle = NULL; +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if ((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_LDAP) + { + if (!BrowseLDAPDN) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Need to set BrowseLDAPDN to use LDAP browsing!"); + BrowseLocalProtocols &= ~BROWSE_LDAP; + BrowseRemoteProtocols &= ~BROWSE_LDAP; + + if (FatalErrors & CUPSD_FATAL_BROWSE) + cupsdEndProcess(getpid(), 0); + } + else + { + /* + * Open LDAP handle... + */ + + if ((BrowseLDAPHandle = ldap_connect()) == NULL && + (FatalErrors & CUPSD_FATAL_BROWSE)) + cupsdEndProcess(getpid(), 0); + } + + BrowseLDAPRefresh = 0; + } +#endif /* HAVE_LDAP */ + + /* + * Enable LPD and SMB printer sharing as needed through external programs... + */ + + if (BrowseLocalProtocols & BROWSE_LPD) + update_lpd(1); + + if (BrowseLocalProtocols & BROWSE_SMB) + update_smb(1); + + /* + * Register the individual printers + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER))) + cupsdRegisterPrinter(p); +} + + +/* + * 'cupsdStartPolling()' - Start polling servers as needed. + */ + +void +cupsdStartPolling(void) +{ + int i; /* Looping var */ + cupsd_dirsvc_poll_t *pollp; /* Current polling server */ + char polld[1024]; /* Poll daemon path */ + char sport[255]; /* Server port */ + char bport[255]; /* Browser port */ + char interval[255]; /* Poll interval */ + int statusfds[2]; /* Status pipe */ + char *argv[6]; /* Arguments */ + char *envp[100]; /* Environment */ + + + /* + * Don't do anything if we aren't polling... + */ + + if (NumPolled == 0 || BrowseSocket < 0) + { + PollPipe = -1; + PollStatusBuffer = NULL; + return; + } + + /* + * Setup string arguments for polld, port and interval options. + */ + + snprintf(polld, sizeof(polld), "%s/daemon/cups-polld", ServerBin); + + sprintf(bport, "%d", BrowsePort); + + if (BrowseInterval) + sprintf(interval, "%d", BrowseInterval); + else + strcpy(interval, "30"); + + argv[0] = "cups-polld"; + argv[2] = sport; + argv[3] = interval; + argv[4] = bport; + argv[5] = NULL; + + cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + + /* + * Create a pipe that receives the status messages from each + * polling daemon... + */ + + if (cupsdOpenPipe(statusfds)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create polling status pipes - %s.", + strerror(errno)); + PollPipe = -1; + PollStatusBuffer = NULL; + return; + } + + PollPipe = statusfds[0]; + PollStatusBuffer = cupsdStatBufNew(PollPipe, "[Poll]"); + + /* + * Run each polling daemon, redirecting stderr to the polling pipe... + */ + + for (i = 0, pollp = Polled; i < NumPolled; i ++, pollp ++) + { + sprintf(sport, "%d", pollp->port); + + argv[1] = pollp->hostname; + + if (cupsdStartProcess(polld, argv, envp, -1, -1, statusfds[1], -1, -1, + 0, DefaultProfile, NULL, &(pollp->pid)) < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdStartPolling: Unable to fork polling daemon - %s", + strerror(errno)); + pollp->pid = 0; + break; + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdStartPolling: Started polling daemon for %s:%d, pid = %d", + pollp->hostname, pollp->port, pollp->pid); + } + + close(statusfds[1]); + + /* + * Finally, add the pipe to the input selection set... + */ + + cupsdAddSelect(PollPipe, (cupsd_selfunc_t)update_polling, NULL, NULL); +} + + +/* + * 'cupsdStopBrowsing()' - Stop sending and receiving broadcast information. + */ + +void +cupsdStopBrowsing(void) +{ + cupsd_printer_t *p; /* Current printer */ + + + if (!Browsing || !(BrowseLocalProtocols | BrowseRemoteProtocols)) + return; + + /* + * De-register the individual printers + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (!(p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER))) + cupsdDeregisterPrinter(p, 1); + + /* + * Shut down browsing sockets... + */ + + if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_CUPS) && + BrowseSocket >= 0) + { + /* + * Close the socket and remove it from the input selection set. + */ + +#ifdef WIN32 + closesocket(BrowseSocket); +#else + close(BrowseSocket); +#endif /* WIN32 */ + + cupsdRemoveSelect(BrowseSocket); + BrowseSocket = -1; + } + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if ((BrowseLocalProtocols & BROWSE_DNSSD)) + dnssdStop(); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_LIBSLP + if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_SLP) && + BrowseSLPHandle) + { + /* + * Close SLP handle... + */ + + SLPClose(BrowseSLPHandle); + BrowseSLPHandle = NULL; + } +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if (((BrowseLocalProtocols | BrowseRemoteProtocols) & BROWSE_LDAP) && + BrowseLDAPHandle) + { + ldap_dereg_ou(ServerName, BrowseLDAPDN); + ldap_disconnect(BrowseLDAPHandle); + BrowseLDAPHandle = NULL; + } +#endif /* HAVE_OPENLDAP */ + + /* + * Disable LPD and SMB printer sharing as needed through external programs... + */ + + if (BrowseLocalProtocols & BROWSE_LPD) + update_lpd(0); + + if (BrowseLocalProtocols & BROWSE_SMB) + update_smb(0); +} + + +/* + * 'cupsdStopPolling()' - Stop polling servers as needed. + */ + +void +cupsdStopPolling(void) +{ + int i; /* Looping var */ + cupsd_dirsvc_poll_t *pollp; /* Current polling server */ + + + if (PollPipe >= 0) + { + cupsdStatBufDelete(PollStatusBuffer); + close(PollPipe); + + cupsdRemoveSelect(PollPipe); + + PollPipe = -1; + PollStatusBuffer = NULL; + } + + for (i = 0, pollp = Polled; i < NumPolled; i ++, pollp ++) + if (pollp->pid) + cupsdEndProcess(pollp->pid, 0); +} + + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +/* + * 'cupsdUpdateDNSSDName()' - Update the computer name we use for browsing... + */ + +void +cupsdUpdateDNSSDName(void) +{ +#ifdef HAVE_DNSSD + DNSServiceErrorType error; /* Error from service creation */ + char webif[1024]; /* Web interface share name */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + int ret; /* Error from service creation */ + char webif[AVAHI_LABEL_MAX]; /* Web interface share name */ +#endif /* HAVE_AVAHI */ +# ifdef HAVE_SYSTEMCONFIGURATION + SCDynamicStoreRef sc; /* Context for dynamic store */ + CFDictionaryRef btmm; /* Back-to-My-Mac domains */ + CFStringEncoding nameEncoding; /* Encoding of computer name */ + CFStringRef nameRef; /* Host name CFString */ + char nameBuffer[1024]; /* C-string buffer */ +# endif /* HAVE_SYSTEMCONFIGURATION */ + + + /* + * Only share the web interface and printers when non-local listening is + * enabled... + */ + + + if (!DNSSDPort) + return; + + /* + * Get the computer name as a c-string... + */ + +# ifdef HAVE_SYSTEMCONFIGURATION + sc = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), NULL, NULL); + + if (sc) + { + /* + * Get the computer name from the dynamic store... + */ + + cupsdClearString(&DNSSDComputerName); + + if ((nameRef = SCDynamicStoreCopyComputerName(sc, &nameEncoding)) != NULL) + { + if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer), + kCFStringEncodingUTF8)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Dynamic store computer name is \"%s\".", nameBuffer); + cupsdSetString(&DNSSDComputerName, nameBuffer); + } + + CFRelease(nameRef); + } + + if (!DNSSDComputerName) + { + /* + * Use the ServerName instead... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Using ServerName \"%s\" as computer name.", ServerName); + cupsdSetString(&DNSSDComputerName, ServerName); + } + + /* + * Get the local hostname from the dynamic store... + */ + + cupsdClearString(&DNSSDHostName); + + if ((nameRef = SCDynamicStoreCopyLocalHostName(sc)) != NULL) + { + if (CFStringGetCString(nameRef, nameBuffer, sizeof(nameBuffer), + kCFStringEncodingUTF8)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Dynamic store host name is \"%s\".", nameBuffer); + cupsdSetString(&DNSSDHostName, nameBuffer); + } + + CFRelease(nameRef); + } + + if (!DNSSDHostName) + { + /* + * Use the ServerName instead... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Using ServerName \"%s\" as host name.", ServerName); + cupsdSetString(&DNSSDHostName, ServerName); + } + + /* + * Get any Back-to-My-Mac domains and add them as aliases... + */ + + cupsdFreeAliases(DNSSDAlias); + DNSSDAlias = NULL; + + btmm = SCDynamicStoreCopyValue(sc, CFSTR("Setup:/Network/BackToMyMac")); + if (btmm && CFGetTypeID(btmm) == CFDictionaryGetTypeID()) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "%d Back to My Mac aliases to add.", + (int)CFDictionaryGetCount(btmm)); + CFDictionaryApplyFunction(btmm, dnssdAddAlias, NULL); + } + else if (btmm) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad Back to My Mac data in dynamic store!"); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "No Back to My Mac aliases to add."); + + if (btmm) + CFRelease(btmm); + + CFRelease(sc); + } + else +# endif /* HAVE_SYSTEMCONFIGURATION */ + { + cupsdSetString(&DNSSDComputerName, ServerName); + cupsdSetString(&DNSSDHostName, ServerName); + } + + /* + * Then (re)register the web interface if enabled... + */ + + if (BrowseWebIF) + { + if (DNSSDComputerName) + snprintf(webif, sizeof(webif), "CUPS @ %s", DNSSDComputerName); + else + strlcpy(webif, "CUPS Web Interface", sizeof(webif)); + +#ifdef HAVE_DNSSD + if (WebIFRef) + DNSServiceRefDeallocate(WebIFRef); + + WebIFRef = DNSSDRef; + if ((error = DNSServiceRegister(&WebIFRef, + kDNSServiceFlagsShareConnection, + 0, webif, "_http._tcp", NULL, + NULL, htons(DNSSDPort), 7, + "\006path=/", dnssdRegisterCallback, + NULL)) != kDNSServiceErr_NoError) + cupsdLogMessage(CUPSD_LOG_ERROR, + "DNS-SD web interface registration failed: %d", error); +#endif /* HAVE_DNSSD */ + +#ifdef HAVE_AVAHI + if (!AvahiCupsClient) + /* + * Client not yet running. + */ + return; + + if (AvahiWebIFGroup) + avahi_entry_group_reset (AvahiWebIFGroup); + else + AvahiWebIFGroup = avahi_entry_group_new (AvahiCupsClient, + avahi_entry_group_cb, + NULL); + + if (AvahiWebIFGroup) + { + ret = avahi_entry_group_add_service (AvahiWebIFGroup, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, /* flags */ + webif, /* name */ + "_http._tcp", /* type */ + NULL, /* domain */ + NULL, /* host */ + DNSSDPort, /* port */ + "path=/", NULL); + if (ret == 0) + ret = avahi_entry_group_commit (AvahiWebIFGroup); + + if (ret != 0) + cupsdLogMessage (CUPSD_LOG_ERROR, + "Avahi web interface registration failed: %d", ret); + } +#endif /* HAVE_AVAHI */ + } +} +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + +#ifdef HAVE_LDAP +/* + * 'cupsdUpdateLDAPBrowse()' - Scan for new printers via LDAP... + */ + +void +cupsdUpdateLDAPBrowse(void) +{ + char uri[HTTP_MAX_URI], /* Printer URI */ + host[HTTP_MAX_URI], /* Hostname */ + resource[HTTP_MAX_URI], /* Resource path */ + location[1024], /* Printer location */ + info[1024], /* Printer information */ + make_model[1024], /* Printer make and model */ + type_num[30]; /* Printer type number */ + int type; /* Printer type */ + int rc; /* LDAP status */ + int limit; /* Size limit */ + LDAPMessage *res, /* LDAP search results */ + *e; /* Current entry from search */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "UpdateLDAPBrowse: %s", ServerName); + + BrowseLDAPRefresh = time(NULL) + BrowseInterval; + + /* + * Reconnect if LDAP Handle is invalid... + */ + + if (! BrowseLDAPHandle) + { + ldap_reconnect(); + return; + } + + /* + * Search for cups printers in LDAP directory... + */ + + rc = ldap_search_rec(BrowseLDAPHandle, BrowseLDAPDN, LDAP_SCOPE_SUBTREE, + "(objectclass=cupsPrinter)", (char **)ldap_attrs, 0, &res); + + /* + * If ldap search was successfull then exit function + * and temporary disable LDAP updates... + */ + + if (rc != LDAP_SUCCESS) + { + if (BrowseLDAPUpdate && ((rc == LDAP_SERVER_DOWN) || (rc == LDAP_CONNECT_ERROR))) + { + BrowseLDAPUpdate = FALSE; + cupsdLogMessage(CUPSD_LOG_INFO, + "LDAP update temporary disabled"); + } + return; + } + + /* + * If LDAP updates were disabled, we will reenable them... + */ + + if (! BrowseLDAPUpdate) + { + BrowseLDAPUpdate = TRUE; + cupsdLogMessage(CUPSD_LOG_INFO, + "LDAP update enabled"); + } + + /* + * Count LDAP entries and return if no entry exist... + */ + + limit = ldap_count_entries(BrowseLDAPHandle, res); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "LDAP search returned %d entries", limit); + if (limit < 1) + { + ldap_freeres(res); + return; + } + + /* + * Loop through the available printers... + */ + + for (e = ldap_first_entry(BrowseLDAPHandle, res); + e; + e = ldap_next_entry(BrowseLDAPHandle, e)) + { + /* + * Get the required values from this entry... + */ + + if (ldap_getval_firststring(BrowseLDAPHandle, e, + "printerDescription", info, sizeof(info)) == -1) + continue; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, + "printerLocation", location, sizeof(location)) == -1) + continue; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, + "printerMakeAndModel", make_model, sizeof(make_model)) == -1) + continue; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, + "printerType", type_num, sizeof(type_num)) == -1) + continue; + + type = atoi(type_num); + + if (ldap_getval_firststring(BrowseLDAPHandle, e, + "printerURI", uri, sizeof(uri)) == -1) + continue; + + /* + * Process the entry as browse data... + */ + + if (!is_local_queue(uri, host, sizeof(host), resource, sizeof(resource))) + process_browse_data(uri, host, resource, type, IPP_PRINTER_IDLE, + location, info, make_model, 0, NULL); + + } + + ldap_freeres(res); +} +#endif /* HAVE_LDAP */ + + +#ifdef HAVE_LIBSLP +/* + * 'cupsdUpdateSLPBrowse()' - Get browsing information via SLP. + */ + +void +cupsdUpdateSLPBrowse(void) +{ + slpsrvurl_t *s, /* Temporary list of service URLs */ + *next; /* Next service in list */ + cupsd_printer_t p; /* Printer information */ + const char *uri; /* Pointer to printer URI */ + char host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + + + /* + * Reset the refresh time... + */ + + BrowseSLPRefresh = time(NULL) + BrowseInterval; + + /* + * Poll for remote printers using SLP... + */ + + s = NULL; + + SLPFindSrvs(BrowseSLPHandle, SLP_CUPS_SRVTYPE, "", "", + slp_url_callback, &s); + + /* + * Loop through the list of available printers... + */ + + for (; s; s = next) + { + /* + * Save the "next" pointer... + */ + + next = s->next; + + /* + * Load a cupsd_printer_t structure with the SLP service attributes... + */ + + SLPFindAttrs(BrowseSLPHandle, s->url, "", "", slp_attr_callback, &p); + + /* + * Process this printer entry... + */ + + uri = s->url + SLP_CUPS_SRVLEN + 1; + + if (!strncmp(uri, "http://", 7) || !strncmp(uri, "ipp://", 6)) + { + /* + * Pull the URI apart to see if this is a local or remote printer... + */ + + if (!is_local_queue(uri, host, sizeof(host), resource, sizeof(resource))) + process_browse_data(uri, host, resource, p.type, IPP_PRINTER_IDLE, + p.location, p.info, p.make_model, 0, NULL); + } + + /* + * Free this listing... + */ + + cupsdClearString(&p.info); + cupsdClearString(&p.location); + cupsdClearString(&p.make_model); + + free(s); + } +} +#endif /* HAVE_LIBSLP */ + + +/* + * 'dequote()' - Remote quotes from a string. + */ + +static char * /* O - Dequoted string */ +dequote(char *d, /* I - Destination string */ + const char *s, /* I - Source string */ + int dlen) /* I - Destination length */ +{ + char *dptr; /* Pointer into destination */ + + + if (s) + { + for (dptr = d, dlen --; *s && dlen > 0; s ++) + if (*s != '\"') + { + *dptr++ = *s; + dlen --; + } + + *dptr = '\0'; + } + else + *d = '\0'; + + return (d); +} + + +#ifdef HAVE_DNSSD +# ifdef HAVE_COREFOUNDATION +/* + * 'dnssdAddAlias()' - Add a DNS-SD alias name. + */ + +static void +dnssdAddAlias(const void *key, /* I - Key */ + const void *value, /* I - Value (domain) */ + void *context) /* I - Unused */ +{ + char valueStr[1024], /* Domain string */ + hostname[1024], /* Complete hostname */ + *hostptr; /* Pointer into hostname */ + + + (void)key; + (void)context; + + if (CFGetTypeID((CFStringRef)value) == CFStringGetTypeID() && + CFStringGetCString((CFStringRef)value, valueStr, sizeof(valueStr), + kCFStringEncodingUTF8)) + { + snprintf(hostname, sizeof(hostname), "%s.%s", DNSSDHostName, valueStr); + hostptr = hostname + strlen(hostname) - 1; + if (*hostptr == '.') + *hostptr = '\0'; /* Strip trailing dot */ + + if (!DNSSDAlias) + DNSSDAlias = cupsArrayNew(NULL, NULL); + + cupsdAddAlias(DNSSDAlias, hostname); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added Back to My Mac ServerAlias %s", + hostname); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad Back to My Mac domain in dynamic store!"); +} +# endif /* HAVE_COREFOUNDATION */ +#endif /* HAVE_DNSSD */ + + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +/* + * 'dnssdBuildTxtRecord()' - Build a TXT record from printer info. + */ + +static cupsd_txt_record_t /* O - TXT record */ +dnssdBuildTxtRecord( + int *txt_len, /* O - TXT record length */ + cupsd_printer_t *p, /* I - Printer information */ + int for_lpd) /* I - 1 = LPD, 0 = IPP */ +{ + int i; /* Looping var */ + char admin_hostname[256], /* .local hostname for admin page */ + adminurl_str[256], /* URL for the admin page */ + type_str[32], /* Type to string buffer */ + state_str[32], /* State to string buffer */ + rp_str[1024], /* Queue name string buffer */ + air_str[1024], /* auth-info-required string buffer */ + *keyvalue[32][2]; /* Table of key/value pairs */ + + + /* + * Load up the key value pairs... + */ + + i = 0; + + keyvalue[i ][0] = "txtvers"; + keyvalue[i++][1] = "1"; + + keyvalue[i ][0] = "qtotal"; + keyvalue[i++][1] = "1"; + + keyvalue[i ][0] = "rp"; + keyvalue[i++][1] = rp_str; + if (for_lpd) + strlcpy(rp_str, p->name, sizeof(rp_str)); + else + snprintf(rp_str, sizeof(rp_str), "%s/%s", + (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", p->name); + + keyvalue[i ][0] = "ty"; + keyvalue[i++][1] = p->make_model ? p->make_model : "Unknown"; + + snprintf(admin_hostname, sizeof(admin_hostname), + "%s.local" +#ifdef HAVE_DNSSD + "." /* terminating dot no good for Avahi */ +#endif /* HAVE_DNSSD */ + , DNSSDHostName); + httpAssembleURIf(HTTP_URI_CODING_ALL, adminurl_str, sizeof(adminurl_str), + "http", NULL, admin_hostname, DNSSDPort, "/%s/%s", + (p->type & CUPS_PRINTER_CLASS) ? "classes" : "printers", + p->name); + keyvalue[i ][0] = "adminurl"; + keyvalue[i++][1] = adminurl_str; + + keyvalue[i ][0] = "note"; + keyvalue[i++][1] = p->location ? p->location : ""; + + keyvalue[i ][0] = "priority"; + keyvalue[i++][1] = for_lpd ? "100" : "0"; + + keyvalue[i ][0] = "product"; + keyvalue[i++][1] = p->pc && p->pc->product ? p->pc->product : "Unknown"; + + keyvalue[i ][0] = "pdl"; + keyvalue[i++][1] = p->pdl ? p->pdl : "application/postscript"; + + keyvalue[i ][0] = "URF"; + keyvalue[i++][1] = "none"; + + if (get_auth_info_required(p, air_str, sizeof(air_str))) + { + keyvalue[i ][0] = "air"; + keyvalue[i++][1] = air_str; + } + + keyvalue[i ][0] = "UUID"; + keyvalue[i++][1] = p->uuid + 9; + +#ifdef HAVE_SSL + keyvalue[i ][0] = "TLS"; + keyvalue[i++][1] = "1.2"; +#endif /* HAVE_SSL */ + + keyvalue[i ][0] = "Transparent"; + keyvalue[i++][1] = "F"; + + keyvalue[i ][0] = "Binary"; + keyvalue[i++][1] = "F"; + + keyvalue[i ][0] = "Fax"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_FAX) ? "T" : "F"; + + keyvalue[i ][0] = "Color"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLOR) ? "T" : "F"; + + keyvalue[i ][0] = "Duplex"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_DUPLEX) ? "T" : "F"; + + keyvalue[i ][0] = "Staple"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_STAPLE) ? "T" : "F"; + + keyvalue[i ][0] = "Copies"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_COPIES) ? "T" : "F"; + + keyvalue[i ][0] = "Collate"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_COLLATE) ? "T" : "F"; + + keyvalue[i ][0] = "Punch"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_PUNCH) ? "T" : "F"; + + keyvalue[i ][0] = "Bind"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_BIND) ? "T" : "F"; + + keyvalue[i ][0] = "Sort"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_SORT) ? "T" : "F"; + + keyvalue[i ][0] = "Scan"; + keyvalue[i++][1] = (p->type & CUPS_PRINTER_MFP) ? "T" : "F"; + + snprintf(type_str, sizeof(type_str), "0x%X", p->type | CUPS_PRINTER_REMOTE); + snprintf(state_str, sizeof(state_str), "%d", p->state); + + keyvalue[i ][0] = "printer-state"; + keyvalue[i++][1] = state_str; + + keyvalue[i ][0] = "printer-type"; + keyvalue[i++][1] = type_str; + + /* + * Then pack them into a proper txt record... + */ + +#ifdef HAVE_DNSSD + return (dnssdPackTxtRecord(txt_len, keyvalue, i)); +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + return (avahiPackTxtRecord(keyvalue, i)); +#endif /* HAVE_AVAHI */ +} + + +/* + * 'dnssdComparePrinters()' - Compare the registered names of two printers. + */ + +static int /* O - Result of comparison */ +dnssdComparePrinters(cupsd_printer_t *a,/* I - First printer */ + cupsd_printer_t *b)/* I - Second printer */ +{ + if (!a->reg_name) + if (!b->reg_name) + return 0; + else + return -1; + else + if (!b->reg_name) + return 1; + else + return (_cups_strcasecmp(a->reg_name, b->reg_name)); +} + + +/* + * 'dnssdDeregisterPrinter()' - Stop sending broadcast information for a + * printer. + */ + +static void +dnssdDeregisterPrinter( + cupsd_printer_t *p) /* I - Printer */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdDeregisterPrinter(%s)", p->name); + +#ifdef HAVE_DNSSD + if (!DNSSDRef) + return; + + /* + * Closing the socket deregisters the service + */ + + if (p->ipp_ref) + { + DNSServiceRefDeallocate(p->ipp_ref); + p->ipp_ref = NULL; + } + + if (p->ipp_txt) + { + /* + * p->ipp_txt is malloc'd, not _cupsStrAlloc'd... + */ + + free(p->ipp_txt); + p->ipp_txt = NULL; + } + + if (p->printer_ref) + { + DNSServiceRefDeallocate(p->printer_ref); + p->printer_ref = NULL; + } + + if (p->printer_txt) + { + /* + * p->printer_txt is malloc'd, not _cupsStrAlloc'd... + */ + + free(p->printer_txt); + p->printer_txt = NULL; + } +#endif /* HAVE_DNSSD */ + +#ifdef HAVE_AVAHI + if (p->avahi_group) + { + avahi_entry_group_reset (p->avahi_group); + avahi_entry_group_free (p->avahi_group); + p->avahi_group = NULL; + + if (p->ipp_txt) + avahi_string_list_free (p->ipp_txt); + + if (p->printer_txt) + avahi_string_list_free (p->printer_txt); + + p->ipp_txt = p->printer_txt = NULL; + } +#endif /* HAVE_AVAHI */ + + /* + * Remove the printer from the array of DNS-SD printers, then clear the + * registered name... + */ + + cupsArrayRemove(DNSSDPrinters, p); + cupsdClearString(&p->reg_name); +} +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + +#ifdef HAVE_DNSSD +/* + * 'dnssdPackTxtRecord()' - Pack an array of key/value pairs into the + * TXT record format. + */ + +static char * /* O - TXT record */ +dnssdPackTxtRecord(int *txt_len, /* O - TXT record length */ + char *keyvalue[][2], /* I - Table of key value pairs */ + int count) /* I - Items in table */ +{ + int i; /* Looping var */ + int length; /* Length of TXT record */ + int length2; /* Length of value */ + char *txtRecord; /* TXT record buffer */ + char *cursor; /* Looping pointer */ + + + /* + * Calculate the buffer size + */ + + if (count <= 0) + return (NULL); + + for (length = i = 0; i < count; i++) + length += 1 + strlen(keyvalue[i][0]) + + (keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0); + + /* + * Allocate and fill it + */ + + txtRecord = malloc(length); + if (txtRecord) + { + *txt_len = length; + + for (cursor = txtRecord, i = 0; i < count; i++) + { + /* + * Drop in the p-string style length byte followed by the data + */ + + length = strlen(keyvalue[i][0]); + length2 = keyvalue[i][1] ? 1 + strlen(keyvalue[i][1]) : 0; + + *cursor++ = (unsigned char)(length + length2); + + memcpy(cursor, keyvalue[i][0], length); + cursor += length; + + if (length2) + { + length2 --; + *cursor++ = '='; + memcpy(cursor, keyvalue[i][1], length2); + cursor += length2; + } + } + } + + return (txtRecord); +} + + +/* + * 'dnssdRegisterCallback()' - DNSServiceRegister callback. + */ + +static void +dnssdRegisterCallback( + DNSServiceRef sdRef, /* I - DNS Service reference */ + DNSServiceFlags flags, /* I - Reserved for future use */ + DNSServiceErrorType errorCode, /* I - Error code */ + const char *name, /* I - Service name */ + const char *regtype, /* I - Service type */ + const char *domain, /* I - Domain. ".local" for now */ + void *context) /* I - User-defined context */ +{ + cupsd_printer_t *p = (cupsd_printer_t *)context; + /* Current printer */ + + + (void)sdRef; + (void)flags; + (void)domain; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterCallback(%s, %s) for %s (%s)", + name, regtype, p ? p->name : "Web Interface", + p ? (p->reg_name ? p->reg_name : "(null)") : "NA"); + + if (errorCode) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "DNSServiceRegister failed with error %d", (int)errorCode); + return; + } + else if (p && (!p->reg_name || _cups_strcasecmp(name, p->reg_name))) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Using service name \"%s\" for \"%s\"", + name, p->name); + + cupsArrayRemove(DNSSDPrinters, p); + cupsdSetString(&p->reg_name, name); + cupsArrayAdd(DNSSDPrinters, p); + + LastEvent |= CUPSD_EVENT_PRINTER_MODIFIED; + } +} +#endif /* HAVE_DNSSD */ + + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +/* + * 'dnssdRegisterPrinter()' - Start sending broadcast information for a printer + * or update the broadcast contents. + */ + +static void +dnssdRegisterPrinter(cupsd_printer_t *p)/* I - Printer */ +{ +#ifdef HAVE_DNSSD + DNSServiceErrorType se; /* dnssd errors */ + char *ipp_txt, /* IPP TXT record buffer */ + *printer_txt, /* LPD TXT record buffer */ + name[1024]; /* Service name */ + int ipp_len, /* IPP TXT record length */ + printer_len, /* LPD TXT record length */ + printer_port; /* LPD port number */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + int ret; /* Error code */ + AvahiStringList *ipp_txt, /* IPP TXT record */ + *printer_txt; /* LPD TXT record */ + char name[AVAHI_LABEL_MAX], /* Service name */ + fullsubtype[AVAHI_LABEL_MAX]; /* Full subtype */ + char *regtype_copy, /* Writeable copy of reg type */ + *subtype, /* Current service sub type */ + *nextsubtype; /* Next service sub type */ +#endif /* HAVE_AVAHI */ + char *nameptr; /* Pointer into name */ + const char *regtype; /* Registration type */ + + +#ifdef HAVE_DNSSD + if (!DNSSDRef) + return; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, + !p->ipp_ref ? "new" : "update"); +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + cupsdLogMessage(CUPSD_LOG_DEBUG2, "dnssdRegisterPrinter(%s) %s", p->name, + !p->avahi_group ? "new" : "update"); +#endif /* HAVE_AVAHI */ + /* + * If per-printer sharing was just disabled make sure we're not + * registered before returning. + */ + + if (!p->shared) + { + dnssdDeregisterPrinter(p); + return; + } + + /* + * The registered name takes the form of " @ "... + */ + + if (p->info && strlen(p->info) > 0) + { + if (DNSSDComputerName) + { + /* + * Make sure there is room for at least 15 characters of + * DNSSDComputerName. + */ + + assert(sizeof(name) >= 15 + 4); + nameptr = name + strlcpy(name, p->info, + sizeof(name) - 4 - + strnlen(DNSSDComputerName, 15)); + nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); + strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); + } + else + strlcpy(name, p->info, sizeof(name)); + } + else if (DNSSDComputerName) + { + /* + * Make sure there is room for at least 15 characters of + * DNSSDComputerName. + */ + + assert(sizeof(name) >= 15 + 4); + nameptr = name + strlcpy(name, p->info, + sizeof(name) - 4 - + strnlen(DNSSDComputerName, 15)); + nameptr += strlcpy(nameptr, " @ ", sizeof(name) - (nameptr - name)); + strlcpy(nameptr, DNSSDComputerName, sizeof(name) - (nameptr - name)); + } + else + strlcpy(name, p->name, sizeof(name)); + + /* + * If an existing printer was renamed, unregister it and start over... + */ + + if (p->reg_name && strcmp(p->reg_name, name)) + dnssdDeregisterPrinter(p); + + if (!p->reg_name) + { + cupsdSetString(&p->reg_name, name); + cupsArrayAdd(DNSSDPrinters, p); + } + + /* + * Register IPP and (optionally) LPD... + */ + +#ifdef HAVE_DNSSD + ipp_len = 0; /* anti-compiler-warning-code */ + ipp_txt = dnssdBuildTxtRecord(&ipp_len, p, 0); + + if (p->ipp_ref && + (ipp_len != p->ipp_len || memcmp(ipp_txt, p->ipp_txt, ipp_len))) + { + /* + * Update the existing registration... + */ + + /* A TTL of 0 means use record's original value (Radar 3176248) */ + if ((se = DNSServiceUpdateRecord(p->ipp_ref, NULL, 0, ipp_len, ipp_txt, + 0)) == kDNSServiceErr_NoError) + { + if (p->ipp_txt) + free(p->ipp_txt); + + p->ipp_txt = ipp_txt; + p->ipp_len = ipp_len; + ipp_txt = NULL; + } + else + { + /* + * Failed to update record, lets close this reference and move on... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to update IPP DNS-SD record for %s - %d", p->name, + se); + + DNSServiceRefDeallocate(p->ipp_ref); + p->ipp_ref = NULL; + } + } + + if (!p->ipp_ref) + { + /* + * Initial registration. Use the _fax-ipp regtype for fax queues... + */ + + regtype = (p->type & CUPS_PRINTER_FAX) ? "_fax-ipp._tcp" : DNSSDRegType; + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Registering DNS-SD printer %s with name \"%s\" and " + "type \"%s\"", p->name, name, regtype); + + /* + * Register the queue, dropping characters as needed until we succeed... + */ + + nameptr = name + strlen(name); + + do + { + p->ipp_ref = DNSSDRef; + if ((se = DNSServiceRegister(&p->ipp_ref, kDNSServiceFlagsShareConnection, + 0, name, regtype, NULL, NULL, + htons(DNSSDPort), ipp_len, ipp_txt, + dnssdRegisterCallback, + p)) == kDNSServiceErr_BadParam) + { + /* + * Name is too long, drop trailing characters, taking into account + * UTF-8 encoding... + */ + + nameptr --; + + while (nameptr > name && (*nameptr & 0xc0) == 0x80) + nameptr --; + + if (nameptr > name) + *nameptr = '\0'; + } + } + while (se == kDNSServiceErr_BadParam && nameptr > name); + + if (se == kDNSServiceErr_NoError) + { + p->ipp_txt = ipp_txt; + p->ipp_len = ipp_len; + ipp_txt = NULL; + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "DNS-SD IPP registration of \"%s\" failed: %d", + p->name, se); + } + + if (ipp_txt) + free(ipp_txt); + + if (BrowseLocalProtocols & BROWSE_LPD) + { + printer_len = 0; /* anti-compiler-warning-code */ + printer_port = 515; + printer_txt = dnssdBuildTxtRecord(&printer_len, p, 1); + } + else + { + printer_len = 0; + printer_port = 0; + printer_txt = NULL; + } + + if (p->printer_ref && + (printer_len != p->printer_len || + memcmp(printer_txt, p->printer_txt, printer_len))) + { + /* + * Update the existing registration... + */ + + /* A TTL of 0 means use record's original value (Radar 3176248) */ + if ((se = DNSServiceUpdateRecord(p->printer_ref, NULL, 0, printer_len, + printer_txt, + 0)) == kDNSServiceErr_NoError) + { + if (p->printer_txt) + free(p->printer_txt); + + p->printer_txt = printer_txt; + p->printer_len = printer_len; + printer_txt = NULL; + } + else + { + /* + * Failed to update record, lets close this reference and move on... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to update LPD DNS-SD record for %s - %d", + p->name, se); + + DNSServiceRefDeallocate(p->printer_ref); + p->printer_ref = NULL; + } + } + + if (!p->printer_ref) + { + /* + * Initial registration... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Registering DNS-SD printer %s with name \"%s\" and " + "type \"_printer._tcp\"", p->name, name); + + p->printer_ref = DNSSDRef; + if ((se = DNSServiceRegister(&p->printer_ref, + kDNSServiceFlagsShareConnection, + 0, name, "_printer._tcp", NULL, NULL, + htons(printer_port), printer_len, printer_txt, + dnssdRegisterCallback, + p)) == kDNSServiceErr_NoError) + { + p->printer_txt = printer_txt; + p->printer_len = printer_len; + printer_txt = NULL; + } + else + cupsdLogMessage(CUPSD_LOG_WARN, + "DNS-SD LPD registration of \"%s\" failed: %d", + p->name, se); + } + + if (printer_txt) + free(printer_txt); +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + if (!AvahiCupsClient) + /* + * Client not running yet. The client callback will call us again later. + */ + return; + + ipp_txt = dnssdBuildTxtRecord(NULL, p, 0); + printer_txt = dnssdBuildTxtRecord(NULL, p, 1); + regtype = (p->type & CUPS_PRINTER_FAX) ? "_fax-ipp._tcp" : DNSSDRegType; + + if (p->avahi_group && p->ipp_txt && ipp_txt && + !avahi_string_list_equal (p->ipp_txt, ipp_txt)) + { + /* + * Update the existing registration... + */ + + avahi_string_list_free (p->ipp_txt); + + if (p->printer_txt) + avahi_string_list_free (p->printer_txt); + + /* + * Update the service group entry. + */ + + regtype_copy = strdup (regtype); + subtype = strchr (regtype_copy, ','); + if (subtype) + *subtype = '\0'; + + cupsdLogMessage (CUPSD_LOG_DEBUG, + "Updating TXT record for %s (%s)", name, regtype_copy); + ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, name, + regtype_copy, + NULL, ipp_txt); + free (regtype_copy); + + if (ret < 0) + goto update_failed; + + p->ipp_txt = ipp_txt; + ipp_txt = NULL; + + if (BrowseLocalProtocols & BROWSE_LPD) + { + ret = avahi_entry_group_update_service_txt_strlst (p->avahi_group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, name, + "_printer._tcp", NULL, + printer_txt); + if (ret < 0) + goto update_failed; + + p->printer_txt = printer_txt; + printer_txt = NULL; + } + + ret = avahi_entry_group_commit (p->avahi_group); + if (ret < 0) + { + update_failed: + cupsdLogMessage (CUPSD_LOG_ERROR, + "Failed to update TXT record for %s: %d", + name, ret); + avahi_entry_group_reset (p->avahi_group); + avahi_entry_group_free (p->avahi_group); + p->avahi_group = NULL; + ipp_txt = p->ipp_txt; + p->ipp_txt = NULL; + } + } + + if (!p->avahi_group) + { + /* + * Initial registration. Use the _fax subtype for fax queues... + */ + + p->avahi_group = avahi_entry_group_new (AvahiCupsClient, + avahi_entry_group_cb, + p); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Registering Avahi printer %s with name \"%s\" and " + "type \"%s\"", p->name, name, regtype); + + if (!p->avahi_group) + { + ret = 0; + goto add_failed; + } + + /* + * Add each service type (DNSSDRegType may contain several, + * separated by commas). + */ + + subtype = regtype_copy = strdup (regtype); + while (subtype && *subtype) + { + nextsubtype = strchr (subtype, ','); + if (nextsubtype) + *nextsubtype++ = '\0'; + + if (subtype == regtype_copy) + { + /* + * Main type entry. + */ + + cupsdLogMessage (CUPSD_LOG_DEBUG, + "Adding TXT record for %s (%s)", name, regtype_copy); + ret = avahi_entry_group_add_service_strlst (p->avahi_group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, name, regtype_copy, + NULL, NULL, + DNSSDPort, + ipp_txt); + } + else + { + /* + * Sub-type entry. + */ + + snprintf (fullsubtype, sizeof(fullsubtype), + "%s._sub.%s", subtype, regtype_copy); + cupsdLogMessage (CUPSD_LOG_DEBUG, + "Adding TXT record for %s (%s)", name, fullsubtype); + ret = avahi_entry_group_add_service_subtype (p->avahi_group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, name, + regtype_copy, + NULL, fullsubtype); + } + + if (ret < 0) + { + free (regtype_copy); + goto add_failed; + } + + subtype = nextsubtype; + } + + free (regtype_copy); + p->ipp_txt = ipp_txt; + ipp_txt = NULL; + + if (BrowseLocalProtocols & BROWSE_LPD) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Registering Avahi printer %s with name \"%s\" and " + "type \"_printer._tcp\"", p->name, name); + + ret = avahi_entry_group_add_service_strlst (p->avahi_group, + AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, + 0, name, + "_printer._tcp", NULL, NULL, + 515, + printer_txt); + if (ret < 0) + goto add_failed; + + p->printer_txt = printer_txt; + printer_txt = NULL; + } + + ret = avahi_entry_group_commit (p->avahi_group); + + if (ret < 0) + { + add_failed: + cupsdLogMessage (CUPSD_LOG_ERROR, + "Failed to add Avahi entry for %s: %d", + name, ret); + if (p->avahi_group) + { + avahi_entry_group_reset (p->avahi_group); + avahi_entry_group_free (p->avahi_group); + p->avahi_group = NULL; + } + ipp_txt = p->ipp_txt; + p->ipp_txt = NULL; + } + } + + if (ipp_txt) + avahi_string_list_free (ipp_txt); + + if (printer_txt) + avahi_string_list_free (printer_txt); +#endif /* HAVE_AVAHI */ +} + + +/* + * 'dnssdStop()' - Stop all DNS-SD registrations. + */ + +static void +dnssdStop(void) +{ + cupsd_printer_t *p; /* Current printer */ + +#ifdef HAVE_DNSSD + if (!DNSSDRef) + return; +#endif /* HAVE_DNSSD */ + + /* + * De-register the individual printers + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + dnssdDeregisterPrinter(p); + +#ifdef HAVE_DNSSD + /* + * Shutdown the rest of the service refs... + */ + + if (WebIFRef) + { + DNSServiceRefDeallocate(WebIFRef); + WebIFRef = NULL; + } + + if (RemoteRef) + { + DNSServiceRefDeallocate(RemoteRef); + RemoteRef = NULL; + } + + cupsdRemoveSelect(DNSServiceRefSockFD(DNSSDRef)); + + DNSServiceRefDeallocate(DNSSDRef); + DNSSDRef = NULL; +#endif /* HAVE_DNSSD */ + + cupsArrayDelete(DNSSDPrinters); + DNSSDPrinters = NULL; + + DNSSDPort = 0; +} +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + +#ifdef HAVE_DNSSD +/* + * 'dnssdUpdate()' - Handle DNS-SD queries. + */ + +static void +dnssdUpdate(void) +{ + DNSServiceErrorType sdErr; /* Service discovery error */ + + + if ((sdErr = DNSServiceProcessResult(DNSSDRef)) != kDNSServiceErr_NoError) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "DNS Service Discovery registration error %d!", + sdErr); + dnssdStop(); + } +} +#endif /* HAVE_DNSSD */ + + +#ifdef HAVE_AVAHI +/* + * 'avahiPackTxtRecord()' - Pack an array of key/value pairs into an + * AvahiStringList. + */ + +static AvahiStringList * /* O - new string list */ +avahiPackTxtRecord(char *keyvalue[][2], /* I - Table of key value pairs */ + int count) /* I - Number of items in table */ +{ + AvahiStringList *strlst = NULL; + char **elements; + size_t len; + int i = 0; + + elements = malloc ((1 + count) * sizeof (char *)); + if (!elements) + goto cleanup; + + for (i = 0; i < count; i++) + { + len = (1 + strlen (keyvalue[i][0]) + + (keyvalue[i][1] ? 1 + strlen (keyvalue[i][1]) : 1)); + elements[i] = malloc (len * sizeof (char)); + if (!elements[i]) + goto cleanup; + + snprintf (elements[i], len, "%s=%s", keyvalue[i][0], keyvalue[i][1]); + } + + strlst = avahi_string_list_new_from_array ((const char **) elements, count); + +cleanup: + while (--i >= 0) + free (elements[i]); + + free (elements); + return (strlst); +} + + +/* + * 'avahi_entry_group_cb()' - Avahi entry group callback function. + */ +static void +avahi_entry_group_cb (AvahiEntryGroup *group, + AvahiEntryGroupState state, + void *userdata) +{ + char *name; + + if (userdata) + name = ((cupsd_printer_t *) userdata)->reg_name; + else + name = "CUPS web interface"; + + switch (state) + { + case AVAHI_ENTRY_GROUP_UNCOMMITED: + case AVAHI_ENTRY_GROUP_REGISTERING: + break; + + case AVAHI_ENTRY_GROUP_ESTABLISHED: + cupsdLogMessage (CUPSD_LOG_DEBUG, + "Avahi entry group established for %s", name); + break; + + default: + cupsdLogMessage (CUPSD_LOG_DEBUG, + "Avahi entry group %s has state %d", + name, state); + break; + } +} + + +/* + * 'avahi_client_cb()' - Avahi client callback function. + */ +static void +avahi_client_cb (AvahiClient *client, + AvahiClientState state, + void *userdata) +{ + cupsd_printer_t *printer; + switch (state) + { + case AVAHI_CLIENT_S_RUNNING: + /* + * Avahi client started successfully. + */ + AvahiCupsClient = client; + AvahiCupsClientConnecting = 0; + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client started"); + + cupsdUpdateDNSSDName (); + + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (Browsing && (BrowseLocalProtocols & BROWSE_DNSSD) && + (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_SCANNER))) && printer->shared) + dnssdRegisterPrinter (printer); + + break; + + case AVAHI_CLIENT_CONNECTING: + /* + * No Avahi daemon, client is waiting. + */ + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client connecting"); + break; + + case AVAHI_CLIENT_S_REGISTERING: + /* + * Not yet registered. + */ + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client registering"); + break; + + case AVAHI_CLIENT_FAILURE: + /* + * Avahi client failed, close it to allow a clean restart. + */ + cupsdLogMessage (CUPSD_LOG_ERROR, + "Avahi client failed, " + "closing client to allow a clean restart"); + + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + dnssdDeregisterPrinter (printer); + + avahi_client_free(client); + AvahiCupsClientConnecting = 0; + AvahiCupsClient = NULL; + + break; + + default: + cupsdLogMessage (CUPSD_LOG_DEBUG, "Avahi client state: %d", state); + } +} +#endif /* HAVE_AVAHI */ + + +/* + * 'get_auth_info_required()' - Get the auth-info-required value to advertise. + */ + +static char * /* O - String or NULL if none */ +get_auth_info_required( + cupsd_printer_t *p, /* I - Printer */ + char *buffer, /* I - Value buffer */ + size_t bufsize) /* I - Size of value buffer */ +{ + cupsd_location_t *auth; /* Pointer to authentication element */ + char resource[1024]; /* Printer/class resource path */ + + + /* + * If auth-info-required is set for this printer, return that... + */ + + if (p->num_auth_info_required > 0 && strcmp(p->auth_info_required[0], "none")) + { + int i; /* Looping var */ + char *bufptr; /* Pointer into buffer */ + + for (i = 0, bufptr = buffer; i < p->num_auth_info_required; i ++) + { + if (bufptr >= (buffer + bufsize - 2)) + break; + + if (i) + *bufptr++ = ','; + + strlcpy(bufptr, p->auth_info_required[i], bufsize - (bufptr - buffer)); + bufptr += strlen(bufptr); + } + + return (buffer); + } + + /* + * Figure out the authentication data requirements to advertise... + */ + + if (p->type & CUPS_PRINTER_CLASS) + snprintf(resource, sizeof(resource), "/classes/%s", p->name); + else + snprintf(resource, sizeof(resource), "/printers/%s", p->name); + + if ((auth = cupsdFindBest(resource, HTTP_POST)) == NULL || + auth->type == CUPSD_AUTH_NONE) + auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB); + + if (auth) + { + int auth_type; /* Authentication type */ + + if ((auth_type = auth->type) == CUPSD_AUTH_DEFAULT) + auth_type = DefaultAuthType; + + switch (auth_type) + { + case CUPSD_AUTH_NONE : + return (NULL); + + case CUPSD_AUTH_NEGOTIATE : + strlcpy(buffer, "negotiate", bufsize); + break; + + default : + strlcpy(buffer, "username,password", bufsize); + break; + } + + return (buffer); + } + + return ("none"); +} + + +#ifdef __APPLE__ +/* + * 'get_hostconfig()' - Get an /etc/hostconfig service setting. + */ + +static int /* O - 1 for YES or AUTOMATIC, 0 for NO */ +get_hostconfig(const char *name) /* I - Name of service */ +{ + cups_file_t *fp; /* Hostconfig file */ + char line[1024], /* Line from file */ + *ptr; /* Pointer to value */ + int state = 1; /* State of service */ + + + /* + * Try opening the /etc/hostconfig file; if we can't open it, assume that + * the service is enabled/auto. + */ + + if ((fp = cupsFileOpen("/etc/hostconfig", "r")) != NULL) + { + /* + * Read lines from the file until we find the service... + */ + + while (cupsFileGets(fp, line, sizeof(line))) + { + if (line[0] == '#' || (ptr = strchr(line, '=')) == NULL) + continue; + + *ptr++ = '\0'; + + if (!_cups_strcasecmp(line, name)) + { + /* + * Found the service, see if it is set to "-NO-"... + */ + + if (!_cups_strncasecmp(ptr, "-NO-", 4)) + state = 0; + break; + } + } + + cupsFileClose(fp); + } + + return (state); +} +#endif /* __APPLE__ */ + + +/* + * 'is_local_queue()' - Determine whether the URI points at a local queue. + */ + +static int /* O - 1 = local, 0 = remote, -1 = bad URI */ +is_local_queue(const char *uri, /* I - Printer URI */ + char *host, /* O - Host string */ + int hostlen, /* I - Length of host buffer */ + char *resource, /* O - Resource string */ + int resourcelen) /* I - Length of resource buffer */ +{ + char scheme[32], /* Scheme portion of URI */ + username[HTTP_MAX_URI]; /* Username portion of URI */ + int port; /* Port portion of URI */ + cupsd_netif_t *iface; /* Network interface */ + + + /* + * Pull the URI apart to see if this is a local or remote printer... + */ + + if (httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + username, sizeof(username), host, hostlen, &port, + resource, resourcelen) < HTTP_URI_OK) + return (-1); + + DEBUG_printf(("host=\"%s\", ServerName=\"%s\"\n", host, ServerName)); + + /* + * Check for local server addresses... + */ + + if (!_cups_strcasecmp(host, ServerName) && port == LocalPort) + return (1); + + cupsdNetIFUpdate(); + + for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + iface; + iface = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + if (!_cups_strcasecmp(host, iface->hostname) && port == iface->port) + return (1); + + /* + * If we get here, the printer is remote... + */ + + return (0); +} + + +/* + * 'process_browse_data()' - Process new browse data. + */ + +static void +process_browse_data( + const char *uri, /* I - URI of printer/class */ + const char *host, /* I - Hostname */ + const char *resource, /* I - Resource path */ + cups_ptype_t type, /* I - Printer type */ + ipp_pstate_t state, /* I - Printer state */ + const char *location, /* I - Printer location */ + const char *info, /* I - Printer information */ + const char *make_model, /* I - Printer make and model */ + int num_attrs, /* I - Number of attributes */ + cups_option_t *attrs) /* I - Attributes */ +{ + int i; /* Looping var */ + int update; /* Update printer attributes? */ + char finaluri[HTTP_MAX_URI], /* Final URI for printer */ + name[IPP_MAX_NAME], /* Name of printer */ + newname[IPP_MAX_NAME], /* New name of printer */ + *hptr, /* Pointer into hostname */ + *sptr; /* Pointer into ServerName */ + const char *shortname; /* Short queue name (queue) */ + char local_make_model[IPP_MAX_NAME]; + /* Local make and model */ + cupsd_printer_t *p; /* Printer information */ + const char *ipp_options, /* ipp-options value */ + *lease_duration, /* lease-duration value */ + *uuid; /* uuid value */ + int is_class; /* Is this queue a class? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "process_browse_data(uri=\"%s\", host=\"%s\", " + "resource=\"%s\", type=%x, state=%d, location=\"%s\", " + "info=\"%s\", make_model=\"%s\", num_attrs=%d, attrs=%p)", + uri, host, resource, type, state, + location ? location : "(nil)", info ? info : "(nil)", + make_model ? make_model : "(nil)", num_attrs, attrs); + + /* + * Determine if the URI contains any illegal characters in it... + */ + + if (strncmp(uri, "ipp://", 6) || !host[0] || + (strncmp(resource, "/printers/", 10) && + strncmp(resource, "/classes/", 9))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad printer URI in browse data: %s", uri); + return; + } + + if (strchr(resource, '?') || + (!strncmp(resource, "/printers/", 10) && strchr(resource + 10, '/')) || + (!strncmp(resource, "/classes/", 9) && strchr(resource + 9, '/'))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad resource in browse data: %s", + resource); + return; + } + + /* + * OK, this isn't a local printer; add any remote options... + */ + + ipp_options = cupsGetOption("ipp-options", num_attrs, attrs); + + if (BrowseRemoteOptions) + { + if (BrowseRemoteOptions[0] == '?') + { + /* + * Override server-supplied options... + */ + + snprintf(finaluri, sizeof(finaluri), "%s%s", uri, BrowseRemoteOptions); + } + else if (ipp_options) + { + /* + * Combine the server and local options... + */ + + snprintf(finaluri, sizeof(finaluri), "%s?%s+%s", uri, ipp_options, + BrowseRemoteOptions); + } + else + { + /* + * Just use the local options... + */ + + snprintf(finaluri, sizeof(finaluri), "%s?%s", uri, BrowseRemoteOptions); + } + + uri = finaluri; + } + else if (ipp_options) + { + /* + * Just use the server-supplied options... + */ + + snprintf(finaluri, sizeof(finaluri), "%s?%s", uri, ipp_options); + uri = finaluri; + } + + /* + * See if we already have it listed in the Printers list, and add it if not... + */ + + type |= CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED; + type &= ~CUPS_PRINTER_IMPLICIT; + update = 0; + hptr = strchr(host, '.'); + sptr = strchr(ServerName, '.'); + is_class = type & CUPS_PRINTER_CLASS; + uuid = cupsGetOption("uuid", num_attrs, attrs); + + if (!ServerNameIsIP && sptr != NULL && hptr != NULL) + { + /* + * Strip the common domain name components... + */ + + while (hptr != NULL) + { + if (!_cups_strcasecmp(hptr, sptr)) + { + *hptr = '\0'; + break; + } + else + hptr = strchr(hptr + 1, '.'); + } + } + + if (is_class) + { + /* + * Remote destination is a class... + */ + + if (!strncmp(resource, "/classes/", 9)) + snprintf(name, sizeof(name), "%s@%s", resource + 9, host); + else + return; + + shortname = resource + 9; + } + else + { + /* + * Remote destination is a printer... + */ + + if (!strncmp(resource, "/printers/", 10)) + snprintf(name, sizeof(name), "%s@%s", resource + 10, host); + else + return; + + shortname = resource + 10; + } + + if (hptr && !*hptr) + *hptr = '.'; /* Resource FQDN */ + + if ((p = cupsdFindDest(name)) == NULL && BrowseShortNames) + { + /* + * Long name doesn't exist, try short name... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "process_browse_data: %s not found...", + name); + + if ((p = cupsdFindDest(shortname)) == NULL) + { + /* + * Short name doesn't exist, use it for this shared queue. + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "process_browse_data: %s not found...", + shortname); + strlcpy(name, shortname, sizeof(name)); + } + else + { + /* + * Short name exists... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "process_browse_data: %s found, type=%x, hostname=%s...", + shortname, p->type, p->hostname ? p->hostname : "(nil)"); + + if (p->type & CUPS_PRINTER_IMPLICIT) + p = NULL; /* Don't replace implicit classes */ + else if (p->hostname && _cups_strcasecmp(p->hostname, host)) + { + /* + * Short name exists but is for a different host. If this is a remote + * queue, rename it and use the long name... + */ + + if (p->type & CUPS_PRINTER_REMOTE) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Renamed remote %s \"%s\" to \"%s@%s\"...", + is_class ? "class" : "printer", p->name, p->name, + p->hostname); + cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL, + "%s \'%s\' deleted by directory services.", + is_class ? "Class" : "Printer", p->name); + + snprintf(newname, sizeof(newname), "%s@%s", p->name, p->hostname); + cupsdRenamePrinter(p, newname); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL, + "%s \'%s\' added by directory services.", + is_class ? "Class" : "Printer", p->name); + } + + /* + * Force creation with long name... + */ + + p = NULL; + } + } + } + else if (p) + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "process_browse_data: %s found, type=%x, hostname=%s...", + name, p->type, p->hostname ? p->hostname : "(nil)"); + + if (!p) + { + /* + * Queue doesn't exist; add it... + */ + + if (is_class) + p = cupsdAddClass(name); + else + p = cupsdAddPrinter(name); + + if (!p) + return; + + cupsdClearString(&(p->hostname)); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added remote %s \"%s\"...", + is_class ? "class" : "printer", name); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL, + "%s \'%s\' added by directory services.", + is_class ? "Class" : "Printer", name); + + /* + * Force the URI to point to the real server... + */ + + p->type = type & ~CUPS_PRINTER_REJECTING; + p->accepting = 1; + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + } + + if (!p->hostname) + { + /* + * Hostname not set, so this must be a cached remote printer + * that was created for a pending print job... + */ + + cupsdSetString(&p->hostname, host); + cupsdSetString(&p->uri, uri); + cupsdSetString(&p->device_uri, uri); + update = 1; + + cupsdMarkDirty(CUPSD_DIRTY_REMOTE); + } + + /* + * Update the state... + */ + + p->state = state; + p->browse_time = time(NULL); + + if ((lease_duration = cupsGetOption("lease-duration", num_attrs, + attrs)) != NULL) + { + /* + * Grab the lease-duration for the browse data; anything less then 1 + * second or more than 1 week gets the default BrowseTimeout... + */ + + i = atoi(lease_duration); + if (i < 1 || i > 604800) + i = BrowseTimeout; + + p->browse_expire = p->browse_time + i; + } + else + p->browse_expire = p->browse_time + BrowseTimeout; + + if (type & CUPS_PRINTER_REJECTING) + { + type &= ~CUPS_PRINTER_REJECTING; + + if (p->accepting) + { + update = 1; + p->accepting = 0; + } + } + else if (!p->accepting) + { + update = 1; + p->accepting = 1; + } + + if (p->type != type) + { + p->type = type; + update = 1; + } + + if (uuid && strcmp(p->uuid, uuid)) + { + cupsdSetString(&p->uuid, uuid); + update = 1; + } + + if (location && (!p->location || strcmp(p->location, location))) + { + cupsdSetString(&p->location, location); + update = 1; + } + + if (info && (!p->info || strcmp(p->info, info))) + { + cupsdSetString(&p->info, info); + update = 1; + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP | CUPSD_DIRTY_REMOTE); + } + + if (!make_model || !make_model[0]) + { + if (is_class) + snprintf(local_make_model, sizeof(local_make_model), + "Remote Class on %s", host); + else + snprintf(local_make_model, sizeof(local_make_model), + "Remote Printer on %s", host); + } + else + snprintf(local_make_model, sizeof(local_make_model), + "%s on %s", make_model, host); + + if (!p->make_model || strcmp(p->make_model, local_make_model)) + { + cupsdSetString(&p->make_model, local_make_model); + update = 1; + } + + if (p->num_options) + { + if (!update && !(type & CUPS_PRINTER_DELETE)) + { + /* + * See if we need to update the attributes... + */ + + if (p->num_options != num_attrs) + update = 1; + else + { + for (i = 0; i < num_attrs; i ++) + if (strcmp(attrs[i].name, p->options[i].name) || + (!attrs[i].value != !p->options[i].value) || + (attrs[i].value && strcmp(attrs[i].value, p->options[i].value))) + { + update = 1; + break; + } + } + } + + /* + * Free the old options... + */ + + cupsFreeOptions(p->num_options, p->options); + } + + p->num_options = num_attrs; + p->options = attrs; + + if (type & CUPS_PRINTER_DELETE) + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, p, NULL, + "%s \'%s\' deleted by directory services.", + is_class ? "Class" : "Printer", p->name); + + cupsdExpireSubscriptions(p, NULL); + + cupsdDeletePrinter(p, 1); + cupsdUpdateImplicitClasses(); + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP | CUPSD_DIRTY_REMOTE); + } + else if (update) + { + cupsdSetPrinterAttrs(p); + cupsdUpdateImplicitClasses(); + } + + /* + * See if we have a default printer... If not, make the first network + * default printer the default. + */ + + if (DefaultPrinter == NULL && Printers != NULL && UseNetworkDefault) + { + /* + * Find the first network default printer and use it... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (p->type & CUPS_PRINTER_DEFAULT) + { + DefaultPrinter = p; + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP | CUPSD_DIRTY_REMOTE); + break; + } + } + + /* + * Do auto-classing if needed... + */ + + process_implicit_classes(); +} + + +/* + * 'process_implicit_classes()' - Create/update implicit classes as needed. + */ + +static void +process_implicit_classes(void) +{ + int i; /* Looping var */ + int update; /* Update printer attributes? */ + char name[IPP_MAX_NAME], /* Name of printer */ + *hptr; /* Pointer into hostname */ + cupsd_printer_t *p, /* Printer information */ + *pclass, /* Printer class */ + *first; /* First printer in class */ + int offset, /* Offset of name */ + len; /* Length of name */ + + + if (!ImplicitClasses || !Printers) + return; + + /* + * Loop through all available printers and create classes as needed... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers), len = 0, offset = 0, + update = 0, pclass = NULL, first = NULL; + p != NULL; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Skip implicit classes... + */ + + if (p->type & CUPS_PRINTER_IMPLICIT) + { + len = 0; + continue; + } + + /* + * If len == 0, get the length of this printer name up to the "@" + * sign (if any). + */ + + cupsArraySave(Printers); + + if (len > 0 && + !_cups_strncasecmp(p->name, name + offset, len) && + (p->name[len] == '\0' || p->name[len] == '@')) + { + /* + * We have more than one printer with the same name; see if + * we have a class, and if this printer is a member... + */ + + if (pclass && _cups_strcasecmp(pclass->name, name)) + { + if (update) + cupsdSetPrinterAttrs(pclass); + + update = 0; + pclass = NULL; + } + + if (!pclass && (pclass = cupsdFindDest(name)) == NULL) + { + /* + * Need to add the class... + */ + + pclass = cupsdAddPrinter(name); + cupsArrayAdd(ImplicitPrinters, pclass); + + pclass->type |= CUPS_PRINTER_IMPLICIT; + pclass->accepting = 1; + pclass->state = IPP_PRINTER_IDLE; + + cupsdSetString(&pclass->location, p->location); + cupsdSetString(&pclass->info, p->info); + + cupsdSetString(&pclass->job_sheets[0], p->job_sheets[0]); + cupsdSetString(&pclass->job_sheets[1], p->job_sheets[1]); + + update = 1; + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP | CUPSD_DIRTY_REMOTE); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added implicit class \"%s\"...", + name); + cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, p, NULL, + "Implicit class \'%s\' added by directory services.", + name); + } + + if (first != NULL) + { + for (i = 0; i < pclass->num_printers; i ++) + if (pclass->printers[i] == first) + break; + + if (i >= pclass->num_printers) + { + first->in_implicit_class = 1; + cupsdAddPrinterToClass(pclass, first); + } + + first = NULL; + } + + for (i = 0; i < pclass->num_printers; i ++) + if (pclass->printers[i] == p) + break; + + if (i >= pclass->num_printers) + { + p->in_implicit_class = 1; + cupsdAddPrinterToClass(pclass, p); + update = 1; + } + } + else + { + /* + * First time around; just get name length and mark it as first + * in the list... + */ + + if ((hptr = strchr(p->name, '@')) != NULL) + len = hptr - p->name; + else + len = strlen(p->name); + + if (len >= sizeof(name)) + { + /* + * If the printer name length somehow is greater than we normally allow, + * skip this printer... + */ + + len = 0; + cupsArrayRestore(Printers); + continue; + } + + strncpy(name, p->name, len); + name[len] = '\0'; + offset = 0; + + if ((first = (hptr ? cupsdFindDest(name) : p)) != NULL && + !(first->type & CUPS_PRINTER_IMPLICIT)) + { + /* + * Can't use same name as a local printer; add "Any" to the + * front of the name, unless we have explicitly disabled + * the "ImplicitAnyClasses"... + */ + + if (ImplicitAnyClasses && len < (sizeof(name) - 4)) + { + /* + * Add "Any" to the class name... + */ + + strcpy(name, "Any"); + strncpy(name + 3, p->name, len); + name[len + 3] = '\0'; + offset = 3; + } + else + { + /* + * Don't create an implicit class if we have a local printer + * with the same name... + */ + + len = 0; + cupsArrayRestore(Printers); + continue; + } + } + + first = p; + } + + cupsArrayRestore(Printers); + } + + /* + * Update the last printer class as needed... + */ + + if (pclass && update) + cupsdSetPrinterAttrs(pclass); +} + + +/* + * 'send_cups_browse()' - Send new browsing information using the CUPS + * protocol. + */ + +static void +send_cups_browse(cupsd_printer_t *p) /* I - Printer to send */ +{ + int i; /* Looping var */ + cups_ptype_t type; /* Printer type */ + cupsd_dirsvc_addr_t *b; /* Browse address */ + int bytes; /* Length of packet */ + char packet[1453], /* Browse data packet */ + uri[1024], /* Printer URI */ + location[1024], /* printer-location */ + info[1024], /* printer-info */ + make_model[1024], + /* printer-make-and-model */ + air[1024]; /* auth-info-required */ + cupsd_netif_t *iface; /* Network interface */ + + + /* + * Figure out the printer type value... + */ + + type = p->type | CUPS_PRINTER_REMOTE; + + if (!p->accepting) + type |= CUPS_PRINTER_REJECTING; + + if (p == DefaultPrinter) + type |= CUPS_PRINTER_DEFAULT; + + /* + * Remove quotes from printer-info, printer-location, and + * printer-make-and-model attributes... + */ + + dequote(location, p->location, sizeof(location)); + dequote(info, p->info, sizeof(info)); + + if (p->make_model) + dequote(make_model, p->make_model, sizeof(make_model)); + else if (p->type & CUPS_PRINTER_CLASS) + { + if (p->num_printers > 0 && p->printers[0]->make_model) + strlcpy(make_model, p->printers[0]->make_model, sizeof(make_model)); + else + strlcpy(make_model, "Local Printer Class", sizeof(make_model)); + } + else if (p->raw) + strlcpy(make_model, "Local Raw Printer", sizeof(make_model)); + else + strlcpy(make_model, "Local System V Printer", sizeof(make_model)); + + if (get_auth_info_required(p, packet, sizeof(packet))) + snprintf(air, sizeof(air), " auth-info-required=%s", packet); + else + air[0] = '\0'; + + /* + * Send a packet to each browse address... + */ + + for (i = NumBrowsers, b = Browsers; i > 0; i --, b ++) + if (b->iface[0]) + { + /* + * Send the browse packet to one or more interfaces... + */ + + if (!strcmp(b->iface, "*")) + { + /* + * Send to all local interfaces... + */ + + cupsdNetIFUpdate(); + + for (iface = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + iface; + iface = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + { + /* + * Only send to local, IPv4 interfaces... + */ + + if (!iface->is_local || !iface->port || + iface->address.addr.sa_family != AF_INET) + continue; + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + iface->hostname, iface->port, + (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s" : + "/printers/%s", + p->name); + snprintf(packet, sizeof(packet), + "%x %x %s \"%s\" \"%s\" \"%s\" %s%s uuid=%s\n", + type, p->state, uri, location, info, make_model, + p->browse_attrs ? p->browse_attrs : "", air, p->uuid); + + bytes = strlen(packet); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendBrowseList: (%d bytes to \"%s\") %s", bytes, + iface->name, packet); + + iface->broadcast.ipv4.sin_port = htons(BrowsePort); + + sendto(BrowseSocket, packet, bytes, 0, + (struct sockaddr *)&(iface->broadcast), + httpAddrLength(&(iface->broadcast))); + } + } + else if ((iface = cupsdNetIFFind(b->iface)) != NULL) + { + /* + * Send to the named interface using the IPv4 address... + */ + + while (iface) + if (strcmp(b->iface, iface->name)) + { + iface = NULL; + break; + } + else if (iface->address.addr.sa_family == AF_INET && iface->port) + break; + else + iface = (cupsd_netif_t *)cupsArrayNext(NetIFList); + + if (iface) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + iface->hostname, iface->port, + (p->type & CUPS_PRINTER_CLASS) ? "/classes/%s" : + "/printers/%s", + p->name); + snprintf(packet, sizeof(packet), + "%x %x %s \"%s\" \"%s\" \"%s\" %s%s uuid=%s\n", + type, p->state, uri, location, info, make_model, + p->browse_attrs ? p->browse_attrs : "", air, p->uuid); + + bytes = strlen(packet); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendBrowseList: (%d bytes to \"%s\") %s", bytes, + iface->name, packet); + + iface->broadcast.ipv4.sin_port = htons(BrowsePort); + + sendto(BrowseSocket, packet, bytes, 0, + (struct sockaddr *)&(iface->broadcast), + httpAddrLength(&(iface->broadcast))); + } + } + } + else + { + /* + * Send the browse packet to the indicated address using + * the default server name... + */ + + snprintf(packet, sizeof(packet), + "%x %x %s \"%s\" \"%s\" \"%s\" %s%s uuid=%s\n", + type, p->state, p->uri, location, info, make_model, + p->browse_attrs ? p->browse_attrs : "", air, p->uuid); + + bytes = strlen(packet); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendBrowseList: (%d bytes) %s", bytes, packet); + + if (sendto(BrowseSocket, packet, bytes, 0, + (struct sockaddr *)&(b->to), + httpAddrLength(&(b->to))) <= 0) + { + /* + * Unable to send browse packet, so remove this address from the + * list... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdSendBrowseList: sendto failed for browser " + "%d - %s.", + (int)(b - Browsers + 1), strerror(errno)); + + if (i > 1) + memmove(b, b + 1, (i - 1) * sizeof(cupsd_dirsvc_addr_t)); + + b --; + NumBrowsers --; + } + } +} + + +#ifdef HAVE_LDAP +/* + * 'ldap_search_rec()' - LDAP Search with reconnect + */ + +static int /* O - Return code */ +ldap_search_rec(LDAP *ld, /* I - LDAP handler */ + char *base, /* I - Base dn */ + int scope, /* I - LDAP search scope */ + char *filter, /* I - Filter string */ + char *attrs[], /* I - Requested attributes */ + int attrsonly, /* I - Return only attributes? */ + LDAPMessage **res) /* I - LDAP handler */ +{ + int rc; /* Return code */ + LDAP *ldr; /* LDAP handler after reconnect */ + + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + rc = ldap_search_ext_s(ld, base, scope, filter, attrs, attrsonly, NULL, NULL, + NULL, LDAP_NO_LIMIT, res); +# else + rc = ldap_search_s(ld, base, scope, filter, attrs, attrsonly, res); +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + + /* + * If we have a connection problem try again... + */ + + if (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP search failed with status %d: %s", + rc, ldap_err2string(rc)); + cupsdLogMessage(CUPSD_LOG_INFO, + "We try the LDAP search once again after reconnecting to " + "the server"); + ldap_freeres(*res); + ldr = ldap_reconnect(); + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + rc = ldap_search_ext_s(ldr, base, scope, filter, attrs, attrsonly, NULL, + NULL, NULL, LDAP_NO_LIMIT, res); +# else + rc = ldap_search_s(ldr, base, scope, filter, attrs, attrsonly, res); +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + } + + if (rc == LDAP_NO_SUCH_OBJECT) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "ldap_search_rec: LDAP entry/object not found"); + else if (rc != LDAP_SUCCESS) + cupsdLogMessage(CUPSD_LOG_ERROR, + "ldap_search_rec: LDAP search failed with status %d: %s", + rc, ldap_err2string(rc)); + + if (rc != LDAP_SUCCESS) + ldap_freeres(*res); + + return (rc); +} + + +/* + * 'ldap_freeres()' - Free LDAPMessage + */ + +static void +ldap_freeres(LDAPMessage *entry) /* I - LDAP handler */ +{ + int rc; /* Return value */ + + + rc = ldap_msgfree(entry); + if (rc == -1) + cupsdLogMessage(CUPSD_LOG_WARN, "Can't free LDAPMessage!"); + else if (rc == 0) + cupsdLogMessage(CUPSD_LOG_DEBUG2, "Freeing LDAPMessage was unnecessary"); +} + + +/* + * 'ldap_getval_char()' - Get first LDAP value and convert to string + */ + +static int /* O - Return code */ +ldap_getval_firststring( + LDAP *ld, /* I - LDAP handler */ + LDAPMessage *entry, /* I - LDAP message or search result */ + char *attr, /* I - the wanted attribute */ + char *retval, /* O - String to return */ + unsigned long maxsize) /* I - Max string size */ +{ + char *dn; /* LDAP DN */ + int rc = 0; /* Return code */ +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + struct berval **bval; /* LDAP value array */ + unsigned long size; /* String size */ + + + /* + * Get value from LDAPMessage... + */ + + if ((bval = ldap_get_values_len(ld, entry, attr)) == NULL) + { + rc = -1; + dn = ldap_get_dn(ld, entry); + cupsdLogMessage(CUPSD_LOG_WARN, + "Failed to get LDAP value %s for %s!", + attr, dn); + ldap_memfree(dn); + } + else + { + /* + * Check size and copy value into our string... + */ + + size = maxsize; + if (size < (bval[0]->bv_len + 1)) + { + rc = -1; + dn = ldap_get_dn(ld, entry); + cupsdLogMessage(CUPSD_LOG_WARN, + "Attribute %s is too big! (dn: %s)", + attr, dn); + ldap_memfree(dn); + } + else + size = bval[0]->bv_len + 1; + + strlcpy(retval, bval[0]->bv_val, size); + ldap_value_free_len(bval); + } +# else + char **value; /* LDAP value */ + + /* + * Get value from LDAPMessage... + */ + + if ((value = (char **)ldap_get_values(ld, entry, attr)) == NULL) + { + rc = -1; + dn = ldap_get_dn(ld, entry); + cupsdLogMessage(CUPSD_LOG_WARN, "Failed to get LDAP value %s for %s!", + attr, dn); + ldap_memfree(dn); + } + else + { + strlcpy(retval, *value, maxsize); + ldap_value_free(value); + } +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + + return (rc); +} + + +/* + * 'send_ldap_ou()' - Send LDAP ou registrations. + */ + +static void +send_ldap_ou(char *ou, /* I - Servername/ou to register */ + char *basedn, /* I - Our base dn */ + char *descstring) /* I - Description for ou */ +{ + int i; /* Looping var... */ + LDAPMod mods[3]; /* The 3 attributes we will be adding */ + LDAPMod *pmods[4]; /* Pointers to the 3 attributes + NULL */ + LDAPMessage *res, /* Search result token */ + *e; /* Current entry from search */ + int rc; /* LDAP status */ + int rcmod; /* LDAP status for modifications */ + char dn[1024], /* DN of the organizational unit we are adding */ + *desc[2], /* Change records */ + *ou_value[2]; + char old_desc[1024]; /* Old description */ + static const char * const objectClass_values[] = + { /* The 2 objectClass's we use in */ + "top", /* our LDAP entries */ + "organizationalUnit", + NULL + }; + static const char * const ou_attrs[] =/* CUPS LDAP attributes */ + { + "description", + NULL + }; + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_ou: %s", ou); + + /* + * Reconnect if LDAP Handle is invalid... + */ + + if (!BrowseLDAPHandle) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_ou: LDAP Handle is invalid. Try reconnecting..."); + ldap_reconnect(); + return; + } + + /* + * Prepare ldap search... + */ + + snprintf(dn, sizeof(dn), "ou=%s, %s", ou, basedn); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_ou: dn=\"%s\"", dn); + + ou_value[0] = ou; + ou_value[1] = NULL; + desc[0] = descstring; + desc[1] = NULL; + + mods[0].mod_type = "ou"; + mods[0].mod_values = ou_value; + mods[1].mod_type = "description"; + mods[1].mod_values = desc; + mods[2].mod_type = "objectClass"; + mods[2].mod_values = (char **)objectClass_values; + + rc = ldap_search_rec(BrowseLDAPHandle, dn, LDAP_SCOPE_BASE, NULL, + (char **)ou_attrs, 0, &res); + + /* + * If ldap search was not successfull then exit function... + */ + + if (rc != LDAP_SUCCESS && rc != LDAP_NO_SUCH_OBJECT) + return; + + /* + * Check if we need to insert or update the LDAP entry... + */ + + if (ldap_count_entries(BrowseLDAPHandle, res) > 0 && + rc != LDAP_NO_SUCH_OBJECT) + { + /* + * Printserver has already been registered, check if + * modification is required... + */ + + e = ldap_first_entry(BrowseLDAPHandle, res); + + /* + * Get the required values from this entry... + */ + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "description", old_desc, + sizeof(old_desc)) == -1) + old_desc[0] = '\0'; + + /* + * Check if modification is required... + */ + + if ( strcmp(desc[0], old_desc) == 0 ) + { + /* + * LDAP entry for the printer exists. + * Printer has already been registered, + * no modifications required... + */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_ou: No updates required for %s", ou); + } + else + { + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_ou: Replace entry for %s", ou); + + for (i = 0; i < 3; i ++) + { + pmods[i] = mods + i; + pmods[i]->mod_op = LDAP_MOD_REPLACE; + } + pmods[i] = NULL; + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rcmod = ldap_modify_ext_s(BrowseLDAPHandle, dn, pmods, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rcmod = ldap_modify_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP modify for %s failed with status %d: %s", + ou, rcmod, ldap_err2string(rcmod)); + if (rcmod == LDAP_SERVER_DOWN) + ldap_reconnect(); + } + } + } + else + { + /* + * Printserver has never been registered, + * add registration... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_ou: Add entry for %s", ou); + + for (i = 0; i < 3; i ++) + { + pmods[i] = mods + i; + pmods[i]->mod_op = LDAP_MOD_ADD; + } + pmods[i] = NULL; + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rcmod = ldap_add_ext_s(BrowseLDAPHandle, dn, pmods, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rcmod = ldap_add_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP add for %s failed with status %d: %s", + ou, rcmod, ldap_err2string(rcmod)); + if (rcmod == LDAP_SERVER_DOWN) + ldap_reconnect(); + } + } + + if (rc == LDAP_SUCCESS) + ldap_freeres(res); +} + + +/* + * 'send_ldap_browse()' - Send LDAP printer registrations. + */ + +static void +send_ldap_browse(cupsd_printer_t *p) /* I - Printer to register */ +{ + int i; /* Looping var... */ + LDAPMod mods[7]; /* The 7 attributes we will be adding */ + LDAPMod *pmods[8]; /* Pointers to the 7 attributes + NULL */ + LDAPMessage *res, /* Search result token */ + *e; /* Current entry from search */ + char *cn_value[2], /* Change records */ + *uri[2], + *info[2], + *location[2], + *make_model[2], + *type[2], + typestring[255], /* String to hold printer-type */ + dn[1024]; /* DN of the printer we are adding */ + int rc; /* LDAP status */ + int rcmod; /* LDAP status for modifications */ + char old_uri[HTTP_MAX_URI], /* Printer URI */ + old_location[1024], /* Printer location */ + old_info[1024], /* Printer information */ + old_make_model[1024], /* Printer make and model */ + old_type_string[30]; /* Temporary type number */ + int old_type; /* Printer type */ + static const char * const objectClass_values[] = + { /* The 3 objectClass's we use in */ + "top", /* our LDAP entries */ + "device", + "cupsPrinter", + NULL + }; + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_browse: %s", p->name); + + /* + * Exit function if LDAP updates has been disabled... + */ + + if (!BrowseLDAPUpdate) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_browse: Updates temporary disabled; " + "skipping..."); + return; + } + + /* + * Reconnect if LDAP Handle is invalid... + */ + + if (!BrowseLDAPHandle) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_browse: LDAP Handle is invalid. Try " + "reconnecting..."); + ldap_reconnect(); + return; + } + + /* + * Everything in ldap is ** so we fudge around it... + */ + + sprintf(typestring, "%u", p->type); + + cn_value[0] = p->name; + cn_value[1] = NULL; + info[0] = p->info ? p->info : "Unknown"; + info[1] = NULL; + location[0] = p->location ? p->location : "Unknown"; + location[1] = NULL; + make_model[0] = p->make_model ? p->make_model : "Unknown"; + make_model[1] = NULL; + type[0] = typestring; + type[1] = NULL; + uri[0] = p->uri; + uri[1] = NULL; + + /* + * Get ldap entry for printer ... + */ + + snprintf(dn, sizeof(dn), "cn=%s, ou=%s, %s", p->name, ServerName, + BrowseLDAPDN); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_ldap_browse: dn=\"%s\"", dn); + + rc = ldap_search_rec(BrowseLDAPHandle, dn, LDAP_SCOPE_BASE, NULL, + (char **)ldap_attrs, 0, &res); + + /* + * If ldap search was not successfull then exit function + * and temporary disable LDAP updates... + */ + + if (rc != LDAP_SUCCESS && rc != LDAP_NO_SUCH_OBJECT) + { + if (BrowseLDAPUpdate && + (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR)) + { + BrowseLDAPUpdate = FALSE; + cupsdLogMessage(CUPSD_LOG_INFO, + "LDAP update temporary disabled"); + } + + return; + } + + /* + * Fill modification array... + */ + + mods[0].mod_type = "cn"; + mods[0].mod_values = cn_value; + mods[1].mod_type = "printerDescription"; + mods[1].mod_values = info; + mods[2].mod_type = "printerURI"; + mods[2].mod_values = uri; + mods[3].mod_type = "printerLocation"; + mods[3].mod_values = location; + mods[4].mod_type = "printerMakeAndModel"; + mods[4].mod_values = make_model; + mods[5].mod_type = "printerType"; + mods[5].mod_values = type; + mods[6].mod_type = "objectClass"; + mods[6].mod_values = (char **)objectClass_values; + + /* + * Check if we need to insert or update the LDAP entry... + */ + + if (ldap_count_entries(BrowseLDAPHandle, res) > 0 && + rc != LDAP_NO_SUCH_OBJECT) + { + /* + * Printer has already been registered, check if + * modification is required... + */ + + e = ldap_first_entry(BrowseLDAPHandle, res); + + /* + * Get the required values from this entry... + */ + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "printerDescription", + old_info, sizeof(old_info)) == -1) + old_info[0] = '\0'; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "printerLocation", + old_location, sizeof(old_location)) == -1) + old_info[0] = '\0'; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "printerMakeAndModel", + old_make_model, sizeof(old_make_model)) == -1) + old_info[0] = '\0'; + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "printerType", + old_type_string, sizeof(old_type_string)) == -1) + old_info[0] = '\0'; + + old_type = atoi(old_type_string); + + if (ldap_getval_firststring(BrowseLDAPHandle, e, "printerURI", old_uri, + sizeof(old_uri)) == -1) + old_info[0] = '\0'; + + /* + * Check if modification is required... + */ + + if (!strcmp(info[0], old_info) && !strcmp(uri[0], old_uri) && + !strcmp(location[0], old_location) && + !strcmp(make_model[0], old_make_model) && p->type == old_type) + { + /* + * LDAP entry for the printer exists. Printer has already been registered, + * no modifications required... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_browse: No updates required for %s", p->name); + } + else + { + /* + * LDAP entry for the printer exists. Printer has already been registered, + * modify the current registration... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_browse: Replace entry for %s", p->name); + + for (i = 0; i < 7; i ++) + { + pmods[i] = mods + i; + pmods[i]->mod_op = LDAP_MOD_REPLACE; + } + pmods[i] = NULL; + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rcmod = ldap_modify_ext_s(BrowseLDAPHandle, dn, pmods, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rcmod = ldap_modify_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP modify for %s failed with status %d: %s", + p->name, rcmod, ldap_err2string(rcmod)); + if (rcmod == LDAP_SERVER_DOWN) + ldap_reconnect(); + } + } + } + else + { + /* + * No LDAP entry exists for the printer. Printer has never been registered, + * add the current registration... + */ + + send_ldap_ou(ServerName, BrowseLDAPDN, "CUPS Server"); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "send_ldap_browse: Add entry for %s", p->name); + + for (i = 0; i < 7; i ++) + { + pmods[i] = mods + i; + pmods[i]->mod_op = LDAP_MOD_ADD; + } + pmods[i] = NULL; + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rcmod = ldap_add_ext_s(BrowseLDAPHandle, dn, pmods, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rcmod = ldap_add_s(BrowseLDAPHandle, dn, pmods)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "LDAP add for %s failed with status %d: %s", + p->name, rcmod, ldap_err2string(rcmod)); + if (rcmod == LDAP_SERVER_DOWN) + ldap_reconnect(); + } + } + + if (rc == LDAP_SUCCESS) + ldap_freeres(res); +} + + +/* + * 'ldap_dereg_printer()' - Delete printer from directory + */ + +static void +ldap_dereg_printer(cupsd_printer_t *p) /* I - Printer to deregister */ +{ + char dn[1024]; /* DN of the printer */ + int rc; /* LDAP status */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_dereg_printer: Remove entry for %s", + p->name); + + /* + * Reconnect if LDAP Handle is invalid... + */ + + if (!BrowseLDAPHandle) + { + ldap_reconnect(); + return; + } + + /* + * Get dn for printer and delete LDAP entry... + */ + + snprintf(dn, sizeof(dn), "cn=%s, ou=%s, %s", p->name, ServerName, + BrowseLDAPDN); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_dereg_printer: dn=\"%s\"", dn); + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rc = ldap_delete_ext_s(BrowseLDAPHandle, dn, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rc = ldap_delete_s(BrowseLDAPHandle, dn)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_WARN, + "LDAP delete for %s failed with status %d: %s", + p->name, rc, ldap_err2string(rc)); + + /* + * If we had a connection problem (connection timed out, etc.) + * we should reconnect and try again to delete the entry... + */ + + if (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Retry deleting LDAP entry for %s after a reconnect...", p->name); + ldap_reconnect(); + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rc = ldap_delete_ext_s(BrowseLDAPHandle, dn, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rc = ldap_delete_s(BrowseLDAPHandle, dn)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + cupsdLogMessage(CUPSD_LOG_WARN, + "LDAP delete for %s failed with status %d: %s", + p->name, rc, ldap_err2string(rc)); + } + } +} + + +/* + * 'ldap_dereg_ou()' - Remove the organizational unit. + */ + +static void +ldap_dereg_ou(char *ou, /* I - Organizational unit (servername) */ + char *basedn) /* I - Dase dn */ +{ + char dn[1024]; /* DN of the printer */ + int rc; /* LDAP status */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_dereg_ou: Remove entry for %s", ou); + + /* + * Reconnect if LDAP Handle is invalid... + */ + + if (!BrowseLDAPHandle) + { + ldap_reconnect(); + return; + } + + /* + * Get dn for printer and delete LDAP entry... + */ + + snprintf(dn, sizeof(dn), "ou=%s, %s", ou, basedn); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "ldap_dereg_ou: dn=\"%s\"", dn); + +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rc = ldap_delete_ext_s(BrowseLDAPHandle, dn, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rc = ldap_delete_s(BrowseLDAPHandle, dn)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + { + cupsdLogMessage(CUPSD_LOG_WARN, + "LDAP delete for %s failed with status %d: %s", + ou, rc, ldap_err2string(rc)); + + /* + * If we had a connection problem (connection timed out, etc.) + * we should reconnect and try again to delete the entry... + */ + + if (rc == LDAP_SERVER_DOWN || rc == LDAP_CONNECT_ERROR) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Retry deleting LDAP entry for %s after a reconnect...", ou); + ldap_reconnect(); +# if defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 + if ((rc = ldap_delete_ext_s(BrowseLDAPHandle, dn, NULL, + NULL)) != LDAP_SUCCESS) +# else + if ((rc = ldap_delete_s(BrowseLDAPHandle, dn)) != LDAP_SUCCESS) +# endif /* defined(HAVE_OPENLDAP) && LDAP_API_VERSION > 3000 */ + cupsdLogMessage(CUPSD_LOG_WARN, + "LDAP delete for %s failed with status %d: %s", + ou, rc, ldap_err2string(rc)); + } + } +} +#endif /* HAVE_LDAP */ + + +#ifdef HAVE_LIBSLP +/* + * 'send_slp_browse()' - Register the specified printer with SLP. + */ + +static void +send_slp_browse(cupsd_printer_t *p) /* I - Printer to register */ +{ + char srvurl[HTTP_MAX_URI], /* Printer service URI */ + attrs[8192], /* Printer attributes */ + finishings[1024], /* Finishings to support */ + make_model[IPP_MAX_NAME * 2], + /* Make and model, quoted */ + location[IPP_MAX_NAME * 2], + /* Location, quoted */ + info[IPP_MAX_NAME * 2], /* Info, quoted */ + *src, /* Pointer to original string */ + *dst; /* Pointer to destination string */ + ipp_attribute_t *authentication; /* uri-authentication-supported value */ + SLPError error; /* SLP error, if any */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, "send_slp_browse(%p = \"%s\")", p, + p->name); + + /* + * Make the SLP service URL that conforms to the IANA + * 'printer:' template. + */ + + snprintf(srvurl, sizeof(srvurl), SLP_CUPS_SRVTYPE ":%s", p->uri); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "Service URL = \"%s\"", srvurl); + + /* + * Figure out the finishings string... + */ + + if (p->type & CUPS_PRINTER_STAPLE) + strcpy(finishings, "staple"); + else + finishings[0] = '\0'; + + if (p->type & CUPS_PRINTER_BIND) + { + if (finishings[0]) + strlcat(finishings, ",bind", sizeof(finishings)); + else + strcpy(finishings, "bind"); + } + + if (p->type & CUPS_PRINTER_PUNCH) + { + if (finishings[0]) + strlcat(finishings, ",punch", sizeof(finishings)); + else + strcpy(finishings, "punch"); + } + + if (p->type & CUPS_PRINTER_COVER) + { + if (finishings[0]) + strlcat(finishings, ",cover", sizeof(finishings)); + else + strcpy(finishings, "cover"); + } + + if (p->type & CUPS_PRINTER_SORT) + { + if (finishings[0]) + strlcat(finishings, ",sort", sizeof(finishings)); + else + strcpy(finishings, "sort"); + } + + if (!finishings[0]) + strcpy(finishings, "none"); + + /* + * Quote any commas in the make and model, location, and info strings... + */ + + for (src = p->make_model, dst = make_model; + src && *src && dst < (make_model + sizeof(make_model) - 2);) + { + if (*src == ',' || *src == '\\' || *src == ')') + *dst++ = '\\'; + + *dst++ = *src++; + } + + *dst = '\0'; + + if (!make_model[0]) + strcpy(make_model, "Unknown"); + + for (src = p->location, dst = location; + src && *src && dst < (location + sizeof(location) - 2);) + { + if (*src == ',' || *src == '\\' || *src == ')') + *dst++ = '\\'; + + *dst++ = *src++; + } + + *dst = '\0'; + + if (!location[0]) + strcpy(location, "Unknown"); + + for (src = p->info, dst = info; + src && *src && dst < (info + sizeof(info) - 2);) + { + if (*src == ',' || *src == '\\' || *src == ')') + *dst++ = '\\'; + + *dst++ = *src++; + } + + *dst = '\0'; + + if (!info[0]) + strcpy(info, "Unknown"); + + /* + * Get the authentication value... + */ + + authentication = ippFindAttribute(p->attrs, "uri-authentication-supported", + IPP_TAG_KEYWORD); + + /* + * Make the SLP attribute string list that conforms to + * the IANA 'printer:' template. + */ + + snprintf(attrs, sizeof(attrs), + "(printer-uri-supported=%s)," + "(uri-authentication-supported=%s>)," +#ifdef HAVE_SSL + "(uri-security-supported=tls>)," +#else + "(uri-security-supported=none>)," +#endif /* HAVE_SSL */ + "(printer-name=%s)," + "(printer-location=%s)," + "(printer-info=%s)," + "(printer-more-info=%s)," + "(printer-make-and-model=%s)," + "(printer-type=%d)," + "(charset-supported=utf-8)," + "(natural-language-configured=%s)," + "(natural-language-supported=de,en,es,fr,it)," + "(color-supported=%s)," + "(finishings-supported=%s)," + "(sides-supported=one-sided%s)," + "(multiple-document-jobs-supported=true)" + "(ipp-versions-supported=1.0,1.1)", + p->uri, authentication->values[0].string.text, p->name, location, + info, p->uri, make_model, p->type, DefaultLanguage, + p->type & CUPS_PRINTER_COLOR ? "true" : "false", + finishings, + p->type & CUPS_PRINTER_DUPLEX ? + ",two-sided-long-edge,two-sided-short-edge" : ""); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "Attributes = \"%s\"", attrs); + + /* + * Register the printer with the SLP server... + */ + + error = SLPReg(BrowseSLPHandle, srvurl, BrowseTimeout, + SLP_CUPS_SRVTYPE, attrs, SLP_TRUE, slp_reg_callback, 0); + + if (error != SLP_OK) + cupsdLogMessage(CUPSD_LOG_ERROR, "SLPReg of \"%s\" failed with status %d!", p->name, + error); +} + + +/* + * 'slp_attr_callback()' - SLP attribute callback + */ + +static SLPBoolean /* O - SLP_TRUE for success */ +slp_attr_callback( + SLPHandle hslp, /* I - SLP handle */ + const char *attrlist, /* I - Attribute list */ + SLPError errcode, /* I - Parsing status for this attr */ + void *cookie) /* I - Current printer */ +{ + char *tmp = 0; /* Temporary string */ + cupsd_printer_t *p = (cupsd_printer_t*)cookie; + /* Current printer */ + + + (void)hslp; /* anti-compiler-warning-code */ + + /* + * Bail if there was an error + */ + + if (errcode != SLP_OK) + return (SLP_TRUE); + + /* + * Parse the attrlist to obtain things needed to build CUPS browse packet + */ + + memset(p, 0, sizeof(cupsd_printer_t)); + + if (slp_get_attr(attrlist, "(printer-location=", &(p->location))) + return (SLP_FALSE); + if (slp_get_attr(attrlist, "(printer-info=", &(p->info))) + return (SLP_FALSE); + if (slp_get_attr(attrlist, "(printer-make-and-model=", &(p->make_model))) + return (SLP_FALSE); + if (!slp_get_attr(attrlist, "(printer-type=", &tmp)) + p->type = atoi(tmp); + else + p->type = CUPS_PRINTER_REMOTE; + + cupsdClearString(&tmp); + + return (SLP_TRUE); +} + + +/* + * 'slp_dereg_printer()' - SLPDereg() the specified printer + */ + +static void +slp_dereg_printer(cupsd_printer_t *p) /* I - Printer */ +{ + char srvurl[HTTP_MAX_URI]; /* Printer service URI */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, "slp_dereg_printer: printer=\"%s\"", p->name); + + if (!(p->type & CUPS_PRINTER_REMOTE)) + { + /* + * Make the SLP service URL that conforms to the IANA + * 'printer:' template. + */ + + snprintf(srvurl, sizeof(srvurl), SLP_CUPS_SRVTYPE ":%s", p->uri); + + /* + * Deregister the printer... + */ + + SLPDereg(BrowseSLPHandle, srvurl, slp_reg_callback, 0); + } +} + + +/* + * 'slp_get_attr()' - Get an attribute from an SLP registration. + */ + +static int /* O - 0 on success */ +slp_get_attr(const char *attrlist, /* I - Attribute list string */ + const char *tag, /* I - Name of attribute */ + char **valbuf) /* O - Value */ +{ + char *ptr1, /* Pointer into string */ + *ptr2; /* ... */ + + + cupsdClearString(valbuf); + + if ((ptr1 = strstr(attrlist, tag)) != NULL) + { + ptr1 += strlen(tag); + + if ((ptr2 = strchr(ptr1,')')) != NULL) + { + /* + * Copy the value... + */ + + *valbuf = calloc(ptr2 - ptr1 + 1, 1); + strncpy(*valbuf, ptr1, ptr2 - ptr1); + + /* + * Dequote the value... + */ + + for (ptr1 = *valbuf; *ptr1; ptr1 ++) + if (*ptr1 == '\\' && ptr1[1]) + _cups_strcpy(ptr1, ptr1 + 1); + + return (0); + } + } + + return (-1); +} + + +/* + * 'slp_reg_callback()' - Empty SLPRegReport. + */ + +static void +slp_reg_callback(SLPHandle hslp, /* I - SLP handle */ + SLPError errcode, /* I - Error code, if any */ + void *cookie) /* I - App data */ +{ + (void)hslp; + (void)errcode; + (void)cookie; + + return; +} + + +/* + * 'slp_url_callback()' - SLP service url callback + */ + +static SLPBoolean /* O - TRUE = OK, FALSE = error */ +slp_url_callback( + SLPHandle hslp, /* I - SLP handle */ + const char *srvurl, /* I - URL of service */ + unsigned short lifetime, /* I - Life of service */ + SLPError errcode, /* I - Existing error code */ + void *cookie) /* I - Pointer to service list */ +{ + slpsrvurl_t *s, /* New service entry */ + **head; /* Pointer to head of entry */ + + + /* + * Let the compiler know we won't be using these vars... + */ + + (void)hslp; + (void)lifetime; + + /* + * Bail if there was an error + */ + + if (errcode != SLP_OK) + return (SLP_TRUE); + + /* + * Grab the head of the list... + */ + + head = (slpsrvurl_t**)cookie; + + /* + * Allocate a *temporary* slpsrvurl_t to hold this entry. + */ + + if ((s = (slpsrvurl_t *)calloc(1, sizeof(slpsrvurl_t))) == NULL) + return (SLP_FALSE); + + /* + * Copy the SLP service URL... + */ + + strlcpy(s->url, srvurl, sizeof(s->url)); + + /* + * Link the SLP service URL into the head of the list + */ + + if (*head) + s->next = *head; + + *head = s; + + return (SLP_TRUE); +} +#endif /* HAVE_LIBSLP */ + + +/* + * 'update_cups_browse()' - Update the browse lists using the CUPS protocol. + */ + +static void +update_cups_browse(void) +{ + int i; /* Looping var */ + int auth; /* Authorization status */ + int len; /* Length of name string */ + int bytes; /* Number of bytes left */ + char packet[1541], /* Broadcast packet */ + *pptr; /* Pointer into packet */ + socklen_t srclen; /* Length of source address */ + http_addr_t srcaddr; /* Source address */ + char srcname[1024]; /* Source hostname */ + unsigned address[4]; /* Source address */ + unsigned type; /* Printer type */ + unsigned state; /* Printer state */ + char uri[HTTP_MAX_URI], /* Printer URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI], /* Resource portion of URI */ + info[IPP_MAX_NAME], /* Information string */ + location[IPP_MAX_NAME], /* Location string */ + make_model[IPP_MAX_NAME];/* Make and model string */ + int num_attrs; /* Number of attributes */ + cups_option_t *attrs; /* Attributes */ + + + /* + * Read a packet from the browse socket... + */ + + srclen = sizeof(srcaddr); + if ((bytes = recvfrom(BrowseSocket, packet, sizeof(packet) - 1, 0, + (struct sockaddr *)&srcaddr, &srclen)) < 0) + { + /* + * "Connection refused" is returned under Linux if the destination port + * or address is unreachable from a previous sendto(); check for the + * error here and ignore it for now... + */ + + if (errno != ECONNREFUSED && errno != EAGAIN) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Browse recv failed - %s.", + strerror(errno)); + cupsdLogMessage(CUPSD_LOG_ERROR, "CUPS browsing turned off."); + +#ifdef WIN32 + closesocket(BrowseSocket); +#else + close(BrowseSocket); +#endif /* WIN32 */ + + cupsdRemoveSelect(BrowseSocket); + BrowseSocket = -1; + + BrowseLocalProtocols &= ~BROWSE_CUPS; + BrowseRemoteProtocols &= ~BROWSE_CUPS; + } + + return; + } + + packet[bytes] = '\0'; + + /* + * If we're about to sleep, ignore incoming browse packets. + */ + + if (Sleeping) + return; + + /* + * Figure out where it came from... + */ + +#ifdef AF_INET6 + if (srcaddr.addr.sa_family == AF_INET6) + { + address[0] = ntohl(srcaddr.ipv6.sin6_addr.s6_addr32[0]); + address[1] = ntohl(srcaddr.ipv6.sin6_addr.s6_addr32[1]); + address[2] = ntohl(srcaddr.ipv6.sin6_addr.s6_addr32[2]); + address[3] = ntohl(srcaddr.ipv6.sin6_addr.s6_addr32[3]); + } + else +#endif /* AF_INET6 */ + { + address[0] = 0; + address[1] = 0; + address[2] = 0; + address[3] = ntohl(srcaddr.ipv4.sin_addr.s_addr); + } + + if (HostNameLookups) + httpAddrLookup(&srcaddr, srcname, sizeof(srcname)); + else + httpAddrString(&srcaddr, srcname, sizeof(srcname)); + + len = strlen(srcname); + + /* + * Do ACL stuff... + */ + + if (BrowseACL) + { + if (httpAddrLocalhost(&srcaddr) || !_cups_strcasecmp(srcname, "localhost")) + { + /* + * Access from localhost (127.0.0.1) is always allowed... + */ + + auth = CUPSD_AUTH_ALLOW; + } + else + { + /* + * Do authorization checks on the domain/address... + */ + + switch (BrowseACL->order_type) + { + default : + auth = CUPSD_AUTH_DENY; /* anti-compiler-warning-code */ + break; + + case CUPSD_AUTH_ALLOW : /* Order Deny,Allow */ + auth = CUPSD_AUTH_ALLOW; + + if (cupsdCheckAuth(address, srcname, len, BrowseACL->deny)) + auth = CUPSD_AUTH_DENY; + + if (cupsdCheckAuth(address, srcname, len, BrowseACL->allow)) + auth = CUPSD_AUTH_ALLOW; + break; + + case CUPSD_AUTH_DENY : /* Order Allow,Deny */ + auth = CUPSD_AUTH_DENY; + + if (cupsdCheckAuth(address, srcname, len, BrowseACL->allow)) + auth = CUPSD_AUTH_ALLOW; + + if (cupsdCheckAuth(address, srcname, len, BrowseACL->deny)) + auth = CUPSD_AUTH_DENY; + break; + } + } + } + else + auth = CUPSD_AUTH_ALLOW; + + if (auth == CUPSD_AUTH_DENY) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "update_cups_browse: Refused %d bytes from %s", bytes, + srcname); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "update_cups_browse: (%d bytes from %s) %s", bytes, + srcname, packet); + + /* + * Parse packet... + */ + + if (sscanf(packet, "%x%x%1023s", &type, &state, uri) < 3) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "update_cups_browse: Garbled browse packet - %s", packet); + return; + } + + strcpy(location, "Location Unknown"); + strcpy(info, "No Information Available"); + make_model[0] = '\0'; + num_attrs = 0; + attrs = NULL; + + if ((pptr = strchr(packet, '\"')) != NULL) + { + /* + * Have extended information; can't use sscanf for it because not all + * sscanf's allow empty strings with %[^\"]... + */ + + for (i = 0, pptr ++; + i < (sizeof(location) - 1) && *pptr && *pptr != '\"'; + i ++, pptr ++) + location[i] = *pptr; + + if (i) + location[i] = '\0'; + + if (*pptr == '\"') + pptr ++; + + while (*pptr && isspace(*pptr & 255)) + pptr ++; + + if (*pptr == '\"') + { + for (i = 0, pptr ++; + i < (sizeof(info) - 1) && *pptr && *pptr != '\"'; + i ++, pptr ++) + info[i] = *pptr; + + info[i] = '\0'; + + if (*pptr == '\"') + pptr ++; + + while (*pptr && isspace(*pptr & 255)) + pptr ++; + + if (*pptr == '\"') + { + for (i = 0, pptr ++; + i < (sizeof(make_model) - 1) && *pptr && *pptr != '\"'; + i ++, pptr ++) + make_model[i] = *pptr; + + if (*pptr == '\"') + pptr ++; + + make_model[i] = '\0'; + + if (*pptr) + num_attrs = cupsParseOptions(pptr, num_attrs, &attrs); + } + } + } + + DEBUG_puts(packet); + DEBUG_printf(("type=%x, state=%x, uri=\"%s\"\n" + "location=\"%s\", info=\"%s\", make_model=\"%s\"\n", + type, state, uri, location, info, make_model)); + + /* + * Pull the URI apart to see if this is a local or remote printer... + */ + + if (is_local_queue(uri, host, sizeof(host), resource, sizeof(resource))) + { + cupsFreeOptions(num_attrs, attrs); + return; + } + + /* + * Do relaying... + */ + + for (i = 0; i < NumRelays; i ++) + if (cupsdCheckAuth(address, srcname, len, Relays[i].from)) + if (sendto(BrowseSocket, packet, bytes, 0, + (struct sockaddr *)&(Relays[i].to), + httpAddrLength(&(Relays[i].to))) <= 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "update_cups_browse: sendto failed for relay %d - %s.", + i + 1, strerror(errno)); + cupsFreeOptions(num_attrs, attrs); + return; + } + + /* + * Process the browse data... + */ + + process_browse_data(uri, host, resource, (cups_ptype_t)type, + (ipp_pstate_t)state, location, info, make_model, + num_attrs, attrs); +} + + +/* + * 'update_lpd()' - Update the LPD configuration as needed. + */ + +static void +update_lpd(int onoff) /* - 1 = turn on, 0 = turn off */ +{ + if (!LPDConfigFile) + return; + +#ifdef __APPLE__ + /* + * Allow /etc/hostconfig CUPS_LPD service setting to override cupsd.conf + * setting for backwards-compatibility. + */ + + if (onoff && !get_hostconfig("CUPS_LPD")) + onoff = 0; +#endif /* __APPLE__ */ + + if (!strncmp(LPDConfigFile, "xinetd:///", 10)) + { + /* + * Enable/disable LPD via the xinetd.d config file for cups-lpd... + */ + + char newfile[1024]; /* New cups-lpd.N file */ + cups_file_t *ofp, /* Original file pointer */ + *nfp; /* New file pointer */ + char line[1024]; /* Line from file */ + + + snprintf(newfile, sizeof(newfile), "%s.N", LPDConfigFile + 9); + + if ((ofp = cupsFileOpen(LPDConfigFile + 9, "r")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"%s\" - %s", + LPDConfigFile + 9, strerror(errno)); + return; + } + + if ((nfp = cupsFileOpen(newfile, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create \"%s\" - %s", + newfile, strerror(errno)); + cupsFileClose(ofp); + return; + } + + /* + * Copy all of the lines from the cups-lpd file... + */ + + while (cupsFileGets(ofp, line, sizeof(line))) + { + if (line[0] == '{') + { + cupsFilePrintf(nfp, "%s\n", line); + snprintf(line, sizeof(line), "\tdisable = %s", + onoff ? "no" : "yes"); + } + else if (!strstr(line, "disable =")) + cupsFilePrintf(nfp, "%s\n", line); + } + + cupsFileClose(nfp); + cupsFileClose(ofp); + rename(newfile, LPDConfigFile + 9); + } +#ifdef __APPLE__ + else if (!strncmp(LPDConfigFile, "launchd:///", 11)) + { + /* + * Enable/disable LPD via the launchctl command... + */ + + char *argv[5], /* Arguments for command */ + *envp[MAX_ENV]; /* Environment for command */ + int pid; /* Process ID */ + + + cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + argv[0] = (char *)"launchctl"; + argv[1] = (char *)(onoff ? "load" : "unload"); + argv[2] = (char *)"-w"; + argv[3] = LPDConfigFile + 10; + argv[4] = NULL; + + cupsdStartProcess("/bin/launchctl", argv, envp, -1, -1, -1, -1, -1, 1, + NULL, NULL, &pid); + } +#endif /* __APPLE__ */ + else + cupsdLogMessage(CUPSD_LOG_INFO, "Unknown LPDConfigFile scheme!"); +} + + +/* + * 'update_polling()' - Read status messages from the poll daemons. + */ + +static void +update_polling(void) +{ + char *ptr, /* Pointer to end of line in buffer */ + message[1024]; /* Pointer to message text */ + int loglevel; /* Log level for message */ + + + while ((ptr = cupsdStatBufUpdate(PollStatusBuffer, &loglevel, + message, sizeof(message))) != NULL) + { + if (loglevel == CUPSD_LOG_INFO) + cupsdLogMessage(CUPSD_LOG_INFO, "%s", message); + + if (!strchr(PollStatusBuffer->buffer, '\n')) + break; + } + + if (ptr == NULL && !PollStatusBuffer->bufused) + { + /* + * All polling processes have died; stop polling... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "update_polling: all polling processes have exited!"); + cupsdStopPolling(); + } +} + + +/* + * 'update_smb()' - Update the SMB configuration as needed. + */ + +static void +update_smb(int onoff) /* I - 1 = turn on, 0 = turn off */ +{ + if (!SMBConfigFile) + return; + + if (!strncmp(SMBConfigFile, "samba:///", 9)) + { + /* + * Enable/disable SMB via the specified smb.conf config file... + */ + + char newfile[1024]; /* New smb.conf.N file */ + cups_file_t *ofp, /* Original file pointer */ + *nfp; /* New file pointer */ + char line[1024]; /* Line from file */ + int in_printers; /* In [printers] section? */ + + + snprintf(newfile, sizeof(newfile), "%s.N", SMBConfigFile + 8); + + if ((ofp = cupsFileOpen(SMBConfigFile + 8, "r")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"%s\" - %s", + SMBConfigFile + 8, strerror(errno)); + return; + } + + if ((nfp = cupsFileOpen(newfile, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create \"%s\" - %s", + newfile, strerror(errno)); + cupsFileClose(ofp); + return; + } + + /* + * Copy all of the lines from the smb.conf file... + */ + + in_printers = 0; + + while (cupsFileGets(ofp, line, sizeof(line))) + { + if (in_printers && strstr(line, "printable =")) + snprintf(line, sizeof(line), " printable = %s", + onoff ? "yes" : "no"); + + cupsFilePrintf(nfp, "%s\n", line); + + if (line[0] == '[') + in_printers = !strcmp(line, "[printers]"); + } + + cupsFileClose(nfp); + cupsFileClose(ofp); + rename(newfile, SMBConfigFile + 8); + } + else + cupsdLogMessage(CUPSD_LOG_INFO, "Unknown SMBConfigFile scheme!"); +} + + +/* + * End of "$Id: dirsvc.c 10243 2012-02-11 02:05:21Z mike $". + */ diff --git a/scheduler/dirsvc.h b/scheduler/dirsvc.h new file mode 100644 index 0000000..aa9bb1b --- /dev/null +++ b/scheduler/dirsvc.h @@ -0,0 +1,232 @@ +/* + * "$Id: dirsvc.h 9632 2011-03-21 02:12:14Z mike $" + * + * Directory services definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Include necessary headers... + */ + +#ifdef HAVE_LIBSLP +# include +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP +# ifdef __sun +# include +# endif /* __sun */ +# include +# ifdef HAVE_LDAP_SSL_H +# include +# endif /* HAVE_LDAP_SSL_H */ +#endif /* HAVE_LDAP */ + +#ifdef HAVE_AVAHI +# include +#endif /* HAVE_AVAHI */ + +/* + * Browse protocols... + */ + +#define BROWSE_CUPS 1 /* CUPS */ +#define BROWSE_SLP 2 /* SLPv2 */ +#define BROWSE_LDAP 4 /* LDAP */ +#define BROWSE_DNSSD 8 /* DNS Service Discovery (aka Bonjour) */ +#define BROWSE_SMB 16 /* SMB/Samba */ +#define BROWSE_LPD 32 /* LPD via xinetd or launchd */ +#define BROWSE_ALL 63 /* All protocols */ + + +/* + * Browse address... + */ + +typedef struct +{ + char iface[32]; /* Destination interface */ + http_addr_t to; /* Destination address */ +} cupsd_dirsvc_addr_t; + + +/* + * Relay structure... + */ + +typedef struct +{ + cups_array_t *from; /* Source address/name mask(s) */ + http_addr_t to; /* Destination address */ +} cupsd_dirsvc_relay_t; + + +/* + * Polling structure... + */ + +typedef struct +{ + char hostname[64]; /* Hostname (actually, IP address) */ + int port; /* Port number */ + int pid; /* Current poll server PID */ +} cupsd_dirsvc_poll_t; + + +/* + * Globals... + */ + +VAR int Browsing VALUE(TRUE), + /* Whether or not browsing is enabled */ + BrowseWebIF VALUE(FALSE), + /* Whether the web interface is advertised */ + BrowseLocalProtocols + VALUE(BROWSE_ALL), + /* Protocols to support for local printers */ + BrowseRemoteProtocols + VALUE(BROWSE_ALL), + /* Protocols to support for remote printers */ + BrowseShortNames VALUE(TRUE), + /* Short names for remote printers? */ + BrowseSocket VALUE(-1), + /* Socket for browsing */ + BrowsePort VALUE(IPP_PORT), + /* Port number for broadcasts */ + BrowseInterval VALUE(DEFAULT_INTERVAL), + /* Broadcast interval in seconds */ + BrowseTimeout VALUE(DEFAULT_TIMEOUT), + /* Time out for printers in seconds */ + UseNetworkDefault VALUE(CUPS_DEFAULT_USE_NETWORK_DEFAULT), + /* Use the network default printer? */ + NumBrowsers VALUE(0); + /* Number of broadcast addresses */ +VAR char *BrowseLocalOptions + VALUE(NULL), + /* Options to add to local printer URIs */ + *BrowseRemoteOptions + VALUE(NULL); + /* Options to add to remote printer URIs */ +VAR cupsd_dirsvc_addr_t *Browsers VALUE(NULL); + /* Broadcast addresses */ +VAR cupsd_location_t *BrowseACL VALUE(NULL); + /* Browser access control list */ +VAR cupsd_printer_t *BrowseNext VALUE(NULL); + /* Next class/printer to broadcast */ +VAR int NumRelays VALUE(0); + /* Number of broadcast relays */ +VAR cupsd_dirsvc_relay_t *Relays VALUE(NULL); + /* Broadcast relays */ +VAR int NumPolled VALUE(0); + /* Number of polled servers */ +VAR cupsd_dirsvc_poll_t *Polled VALUE(NULL); + /* Polled servers */ +VAR int PollPipe VALUE(0); + /* Status pipe for pollers */ +VAR cupsd_statbuf_t *PollStatusBuffer VALUE(NULL); + /* Status buffer for pollers */ + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +VAR char *DNSSDComputerName VALUE(NULL), + /* Computer/server name */ + *DNSSDHostName VALUE(NULL), + /* Hostname */ + *DNSSDRegType VALUE(NULL); + /* Bonjour registration type */ +VAR int DNSSDPort VALUE(0); + /* Port number to register */ +VAR cups_array_t *DNSSDPrinters VALUE(NULL); + /* Printers we have registered */ +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + +#ifdef HAVE_DNSSD +VAR cups_array_t *DNSSDAlias VALUE(NULL); + /* List of dynamic ServerAlias's */ +VAR DNSServiceRef DNSSDRef VALUE(NULL), + /* Master DNS-SD service reference */ + WebIFRef VALUE(NULL), + /* Service reference for the web interface */ + RemoteRef VALUE(NULL); + /* Remote printer browse reference */ +#endif /* HAVE_DNSSD */ + +#ifdef HAVE_AVAHI +VAR AvahiCupsPoll *AvahiCupsPollHandle VALUE(NULL); + /* AvahiCupsPoll object */ +VAR AvahiClient *AvahiCupsClient VALUE(NULL); + /* AvahiClient object */ +VAR int AvahiCupsClientConnecting VALUE(0); + /* Is AvahiClient object connecting? */ +VAR AvahiEntryGroup *AvahiWebIFGroup VALUE(NULL); + /* Web interface entry group */ +#endif /* HAVE_AVAHI */ + +#ifdef HAVE_LIBSLP +VAR SLPHandle BrowseSLPHandle VALUE(NULL); + /* SLP API handle */ +VAR time_t BrowseSLPRefresh VALUE(0); + /* Next SLP refresh time */ +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP +VAR LDAP *BrowseLDAPHandle VALUE(NULL); + /* Handle to LDAP server */ +VAR time_t BrowseLDAPRefresh VALUE(0); + /* Next LDAP refresh time */ +VAR char *BrowseLDAPBindDN VALUE(NULL), + /* LDAP login DN */ + *BrowseLDAPDN VALUE(NULL), + /* LDAP search DN */ + *BrowseLDAPPassword VALUE(NULL), + /* LDAP login password */ + *BrowseLDAPServer VALUE(NULL); + /* LDAP server to use */ +VAR int BrowseLDAPUpdate VALUE(TRUE); + /* enables LDAP updates */ +# ifdef HAVE_LDAP_SSL +VAR char *BrowseLDAPCACertFile VALUE(NULL); + /* LDAP CA CERT file to use */ +# endif /* HAVE_LDAP_SSL */ +#endif /* HAVE_LDAP */ +VAR char *LPDConfigFile VALUE(NULL), + /* LPD configuration file */ + *SMBConfigFile VALUE(NULL); + /* SMB configuration file */ + + +/* + * Prototypes... + */ + +extern void cupsdDeregisterPrinter(cupsd_printer_t *p, int removeit); +extern void cupsdLoadRemoteCache(void); +extern void cupsdRegisterPrinter(cupsd_printer_t *p); +extern void cupsdRestartPolling(void); +extern void cupsdSaveRemoteCache(void); +extern void cupsdSendBrowseList(void); +extern void cupsdStartAvahiClient(void); +extern void cupsdStartBrowsing(void); +extern void cupsdStartPolling(void); +extern void cupsdStopBrowsing(void); +extern void cupsdStopPolling(void); +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) +extern void cupsdUpdateDNSSDName(void); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ +#ifdef HAVE_LDAP +extern void cupsdUpdateLDAPBrowse(void); +#endif /* HAVE_LDAP */ +extern void cupsdUpdateSLPBrowse(void); + + +/* + * End of "$Id: dirsvc.h 9632 2011-03-21 02:12:14Z mike $". + */ diff --git a/scheduler/env.c b/scheduler/env.c new file mode 100644 index 0000000..ec12d15 --- /dev/null +++ b/scheduler/env.c @@ -0,0 +1,271 @@ +/* + * "$Id: env.c 9459 2011-01-11 03:48:42Z mike $" + * + * Environment management routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdInitEnv() - Initialize the current environment with standard + * variables. + * cupsdLoadEnv() - Copy common environment variables into an array. + * cupsdSetEnv() - Set a common environment variable. + * cupsdSetEnvf() - Set a formatted common environment variable. + * cupsdUpdateEnv() - Update the environment for the configured directories. + * clear_env() - Clear common environment variables. + * find_env() - Find a common environment variable. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + + +/* + * Local globals... + */ + +static int num_common_env = 0; /* Number of common env vars */ +static char *common_env[MAX_ENV]; /* Common env vars */ + + +/* + * Local functions... + */ + +static void clear_env(void); +static int find_env(const char *name); + + +/* + * 'cupsdInitEnv()' - Initialize the current environment with standard variables. + */ + +void +cupsdInitEnv(void) +{ + /* + * Clear existing environment variables... + */ + + clear_env(); + +#if defined(__APPLE__) + /* + * Add special voodoo magic for MacOS X - this allows MacOS X + * programs to access their bundle resources properly... + * + * This string is replaced in cupsdStartProcess()... + */ + + cupsdSetString(common_env, ""); + num_common_env = 1; +#endif /* __APPLE__ */ +} + + +/* + * 'cupsdLoadEnv()' - Copy common environment variables into an array. + */ + +int /* O - Number of environment variables */ +cupsdLoadEnv(char *envp[], /* I - Environment array */ + int envmax) /* I - Maximum number of elements */ +{ + int i; /* Looping var */ + + + /* + * Leave room for a NULL pointer at the end... + */ + + envmax --; + + /* + * Copy pointers to the environment... + */ + + for (i = 0; i < num_common_env && i < envmax; i ++) + envp[i] = common_env[i]; + + /* + * NULL terminate the environment array and return the number of + * elements we added... + */ + + envp[i] = NULL; + + return (i); +} + + +/* + * 'cupsdSetEnv()' - Set a common environment variable. + */ + +void +cupsdSetEnv(const char *name, /* I - Name of variable */ + const char *value) /* I - Value of variable */ +{ + int i; /* Index into environent array */ + + + /* + * If "value" is NULL, try getting value from current environment... + */ + + if (!value) + value = getenv(name); + + if (!value) + return; + + /* + * See if this variable has already been defined... + */ + + if ((i = find_env(name)) < 0) + { + /* + * Check for room... + */ + + if (num_common_env >= (int)(sizeof(common_env) / sizeof(common_env[0]))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdSetEnv: Too many environment variables set!"); + return; + } + + i = num_common_env; + num_common_env ++; + } + + /* + * Set the new environment variable... + */ + + cupsdSetStringf(common_env + i, "%s=%s", name, value); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetEnv: %s", common_env[i]); +} + + +/* + * 'cupsdSetEnvf()' - Set a formatted common environment variable. + */ + +void +cupsdSetEnvf(const char *name, /* I - Name of variable */ + const char *value, /* I - Printf-style value of variable */ + ...) /* I - Additional args as needed */ +{ + char v[4096]; /* Formatting string value */ + va_list ap; /* Argument pointer */ + + + /* + * Format the value string... + */ + + va_start(ap, value); + vsnprintf(v, sizeof(v), value, ap); + va_end(ap); + + /* + * Set the env variable... + */ + + cupsdSetEnv(name, v); +} + + +/* + * 'cupsdUpdateEnv()' - Update the environment for the configured directories. + */ + +void +cupsdUpdateEnv(void) +{ + /* + * Set common variables... + */ + +#define set_if_undefined(name,value) if (find_env(name) < 0) cupsdSetEnv(name,value) + + set_if_undefined("CUPS_CACHEDIR", CacheDir); + set_if_undefined("CUPS_DATADIR", DataDir); + set_if_undefined("CUPS_DOCROOT", DocumentRoot); + set_if_undefined("CUPS_FONTPATH", FontPath); + set_if_undefined("CUPS_REQUESTROOT", RequestRoot); + set_if_undefined("CUPS_SERVERBIN", ServerBin); + set_if_undefined("CUPS_SERVERROOT", ServerRoot); + set_if_undefined("CUPS_STATEDIR", StateDir); + set_if_undefined("DYLD_LIBRARY_PATH", NULL); + set_if_undefined("HOME", TempDir); + set_if_undefined("LD_ASSUME_KERNEL", NULL); + set_if_undefined("LD_LIBRARY_PATH", NULL); + set_if_undefined("LD_PRELOAD", NULL); + set_if_undefined("NLSPATH", NULL); + if (find_env("PATH") < 0) + cupsdSetEnvf("PATH", "%s/filter:" CUPS_BINDIR ":" CUPS_SBINDIR + ":/bin:/usr/bin", ServerBin); + set_if_undefined("SERVER_ADMIN", ServerAdmin); + set_if_undefined("SHLIB_PATH", NULL); + set_if_undefined("SOFTWARE", CUPS_MINIMAL); + set_if_undefined("TMPDIR", TempDir); + set_if_undefined("TZ", NULL); + set_if_undefined("USER", "root"); + set_if_undefined("VG_ARGS", NULL); +} + + +/* + * 'clear_env()' - Clear common environment variables. + */ + +static void +clear_env(void) +{ + int i; /* Looping var */ + + + for (i = 0; i < num_common_env; i ++) + cupsdClearString(common_env + i); + + num_common_env = 0; +} + + +/* + * 'find_env()' - Find a common environment variable. + */ + +static int /* O - Index or -1 if not found */ +find_env(const char *name) /* I - Variable name */ +{ + int i; /* Looping var */ + size_t namelen; /* Length of name */ + + + for (i = 0, namelen = strlen(name); i < num_common_env; i ++) + if (!strncmp(common_env[i], name, namelen) && common_env[i][namelen] == '=') + return (i); + + return (-1); +} + + +/* + * End of "$Id: env.c 9459 2011-01-11 03:48:42Z mike $". + */ diff --git a/scheduler/file.c b/scheduler/file.c new file mode 100644 index 0000000..4dcf54d --- /dev/null +++ b/scheduler/file.c @@ -0,0 +1,450 @@ +/* + * "$Id: file.c 9766 2011-05-11 22:17:34Z mike $" + * + * File functions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdCleanFiles() - Clean out old files. + * cupsdCloseCreatedConfFile() - Close a created configuration file and move + * into place. + * cupsdClosePipe() - Close a pipe as necessary. + * cupsdCreateConfFile() - Create a configuration file safely. + * cupsdOpenConfFile() - Open a configuration file. + * cupsdOpenPipe() - Create a pipe which is closed on exec. + * cupsdRemoveFile() - Remove a file using the 7-pass US DoD method. + * overwrite_data() - Overwrite the data in a file. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#include +#ifdef HAVE_REMOVEFILE +# include +#else +static int overwrite_data(int fd, const char *buffer, int bufsize, + int filesize); +#endif /* HAVE_REMOVEFILE */ + + +/* + * 'cupsdCleanFiles()' - Clean out old files. + */ + +void +cupsdCleanFiles(const char *path, /* I - Directory to clean */ + const char *pattern) /* I - Filename pattern or NULL */ +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024]; /* Filename */ + int status; /* Status from unlink/rmdir */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdCleanFiles(path=\"%s\", pattern=\"%s\")", path, + pattern ? pattern : "(null)"); + + if ((dir = cupsDirOpen(path)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open directory \"%s\" - %s", + path, strerror(errno)); + return; + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Cleaning out old files in \"%s\"...", path); + + while ((dent = cupsDirRead(dir)) != NULL) + { + if (pattern && fnmatch(pattern, dent->filename, 0)) + continue; + + snprintf(filename, sizeof(filename), "%s/%s", path, dent->filename); + + if (S_ISDIR(dent->fileinfo.st_mode)) + { + cupsdCleanFiles(filename, pattern); + + status = rmdir(filename); + } + else + status = unlink(filename); + + if (status) + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove \"%s\" - %s", filename, + strerror(errno)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "Removed \"%s\"...", filename); + } + + cupsDirClose(dir); +} + + +/* + * 'cupsdCloseCreatedConfFile()' - Close a created configuration file and move + * into place. + */ + +int /* O - 0 on success, -1 on error */ +cupsdCloseCreatedConfFile( + cups_file_t *fp, /* I - File to close */ + const char *filename) /* I - Filename */ +{ + char newfile[1024], /* filename.N */ + oldfile[1024]; /* filename.O */ + + + /* + * First close the file... + */ + + if (cupsFileClose(fp)) + return (-1); + + /* + * Then remove "filename.O", rename "filename" to "filename.O", and rename + * "filename.N" to "filename". + */ + + snprintf(newfile, sizeof(newfile), "%s.N", filename); + snprintf(oldfile, sizeof(oldfile), "%s.O", filename); + + if ((cupsdRemoveFile(oldfile) && errno != ENOENT) || + (rename(filename, oldfile) && errno != ENOENT) || + rename(newfile, filename)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to finalize \"%s\": %s", + filename, strerror(errno)); + return (-1); + } + + return (0); +} + + +/* + * 'cupsdClosePipe()' - Close a pipe as necessary. + */ + +void +cupsdClosePipe(int *fds) /* I - Pipe file descriptors (2) */ +{ + /* + * Close file descriptors as needed... + */ + + if (fds[0] >= 0) + { + close(fds[0]); + fds[0] = -1; + } + + if (fds[1] >= 0) + { + close(fds[1]); + fds[1] = -1; + } +} + + +/* + * 'cupsdCreateConfFile()' - Create a configuration file safely. + */ + +cups_file_t * /* O - File pointer */ +cupsdCreateConfFile( + const char *filename, /* I - Filename */ + mode_t mode) /* I - Permissions */ +{ + cups_file_t *fp; /* File pointer */ + char newfile[1024]; /* filename.N */ + + + snprintf(newfile, sizeof(newfile), "%s.N", filename); + if ((fp = cupsFileOpen(newfile, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create \"%s\": %s", newfile, + strerror(errno)); + } + else + { + if (!getuid() && fchown(cupsFileNumber(fp), getuid(), Group)) + cupsdLogMessage(CUPSD_LOG_WARN, "Unable to change group for \"%s\": %s", + newfile, strerror(errno)); + + if (fchmod(cupsFileNumber(fp), mode)) + cupsdLogMessage(CUPSD_LOG_WARN, + "Unable to change permissions for \"%s\": %s", + newfile, strerror(errno)); + } + + return (fp); +} + + +/* + * 'cupsdOpenConfFile()' - Open a configuration file. + * + * This function looks for "filename.O" if "filename" does not exist and does + * a rename as needed. + */ + +cups_file_t * /* O - File pointer */ +cupsdOpenConfFile(const char *filename) /* I - Filename */ +{ + cups_file_t *fp; /* File pointer */ + + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + if (errno == ENOENT) + { + /* + * Try opening the backup file... + */ + + char oldfile[1024]; /* filename.O */ + + snprintf(oldfile, sizeof(oldfile), "%s.O", filename); + fp = cupsFileOpen(oldfile, "r"); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open \"%s\": %s", filename, + strerror(errno)); + } + + return (fp); +} + + +/* + * 'cupsdOpenPipe()' - Create a pipe which is closed on exec. + */ + +int /* O - 0 on success, -1 on error */ +cupsdOpenPipe(int *fds) /* O - Pipe file descriptors (2) */ +{ + /* + * Create the pipe... + */ + + if (pipe(fds)) + { + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + /* + * Set the "close on exec" flag on each end of the pipe... + */ + + if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + fds[0] = -1; + fds[1] = -1; + + return (-1); + } + + /* + * Return 0 indicating success... + */ + + return (0); +} + + +/* + * 'cupsdRemoveFile()' - Remove a file using the 7-pass US DoD method. + */ + +int /* O - 0 on success, -1 on error */ +cupsdRemoveFile(const char *filename) /* I - File to remove */ +{ +#ifdef HAVE_REMOVEFILE + return (removefile(filename, NULL, REMOVEFILE_SECURE_7_PASS)); + +#else + int fd; /* File descriptor */ + struct stat info; /* File information */ + char buffer[512]; /* Data buffer */ + int i; /* Looping var */ + + + /* + * First open the file for writing in exclusive mode. + */ + + if ((fd = open(filename, O_WRONLY | O_EXCL)) < 0) + return (-1); + + /* + * Delete the file now - it will still be around as long as the file is + * open... + */ + + if (unlink(filename)) + { + close(fd); + return (-1); + } + + /* + * Then get the file size... + */ + + if (fstat(fd, &info)) + { + close(fd); + return (-1); + } + + /* + * Overwrite the file 7 times with 0xF6, 0x00, 0xFF, random, 0x00, 0xFF, + * and more random data. + */ + + memset(buffer, 0xF6, sizeof(buffer)); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + memset(buffer, 0x00, sizeof(buffer)); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + memset(buffer, 0xFF, sizeof(buffer)); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + CUPS_SRAND(time(NULL)); + + for (i = 0; i < sizeof(buffer); i ++) + buffer[i] = CUPS_RAND(); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + memset(buffer, 0x00, sizeof(buffer)); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + memset(buffer, 0xFF, sizeof(buffer)); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + for (i = 0; i < sizeof(buffer); i ++) + buffer[i] = CUPS_RAND(); + if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size)) + { + close(fd); + return (-1); + } + + /* + * Whew! Close the file (which will lead to the actual deletion) and + * return success... + */ + + close(fd); + return (0); +#endif /* HAVE_REMOVEFILE */ +} + + +#ifndef HAVE_REMOVEFILE +/* + * 'overwrite_data()' - Overwrite the data in a file. + */ + +static int /* O - 0 on success, -1 on error */ +overwrite_data(int fd, /* I - File descriptor */ + const char *buffer, /* I - Buffer to write */ + int bufsize, /* I - Size of buffer */ + int filesize) /* I - Size of file */ +{ + int bytes; /* Bytes to write/written */ + + + /* + * Start at the beginning of the file... + */ + + if (lseek(fd, 0, SEEK_SET) < 0) + return (-1); + + /* + * Fill the file with the provided data... + */ + + while (filesize > 0) + { + if (filesize > bufsize) + bytes = bufsize; + else + bytes = filesize; + + if ((bytes = write(fd, buffer, bytes)) < 0) + return (-1); + + filesize -= bytes; + } + + /* + * Force the changes to disk... + */ + + return (fsync(fd)); +} +#endif /* HAVE_REMOVEFILE */ + + +/* + * End of "$Id: file.c 9766 2011-05-11 22:17:34Z mike $". + */ diff --git a/scheduler/filter.c b/scheduler/filter.c new file mode 100644 index 0000000..5cde777 --- /dev/null +++ b/scheduler/filter.c @@ -0,0 +1,504 @@ +/* + * "$Id: filter.c 9705 2011-04-22 04:38:28Z mike $" + * + * File type conversion routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * mimeAddFilter() - Add a filter to the current MIME database. + * mimeFilter() - Find the fastest way to convert from one type to + * another. + * mimeFilter2() - Find the fastest way to convert from one type to + * another, including the file size. + * mimeFilterLookup() - Lookup a filter. + * mime_compare_filters() - Compare two filters. + * mime_compare_srcs() - Compare two filter source types. + * mime_find_filters() - Find the filters to convert from one type to + * another. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include "mime.h" + + +/* + * Local types... + */ + +typedef struct _mime_typelist_s /**** List of source types ****/ +{ + struct _mime_typelist_s *next; /* Next source type */ + mime_type_t *src; /* Source type */ +} _mime_typelist_t; + + +/* + * Local functions... + */ + +static int mime_compare_filters(mime_filter_t *, mime_filter_t *); +static int mime_compare_srcs(mime_filter_t *, mime_filter_t *); +static cups_array_t *mime_find_filters(mime_t *mime, mime_type_t *src, + size_t srcsize, mime_type_t *dst, + int *cost, _mime_typelist_t *visited); + + +/* + * 'mimeAddFilter()' - Add a filter to the current MIME database. + */ + +mime_filter_t * /* O - New filter */ +mimeAddFilter(mime_t *mime, /* I - MIME database */ + mime_type_t *src, /* I - Source type */ + mime_type_t *dst, /* I - Destination type */ + int cost, /* I - Relative time/resource cost */ + const char *filter) /* I - Filter program to run */ +{ + mime_filter_t *temp; /* New filter */ + + + DEBUG_printf(("mimeAddFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), cost=%d, " + "filter=\"%s\")", mime, + src, src ? src->super : "???", src ? src->type : "???", + dst, dst ? dst->super : "???", dst ? dst->type : "???", + cost, filter)); + + /* + * Range-check the input... + */ + + if (!mime || !src || !dst || !filter) + { + DEBUG_puts("1mimeAddFilter: Returning NULL."); + return (NULL); + } + + /* + * See if we already have an existing filter for the given source and + * destination... + */ + + if ((temp = mimeFilterLookup(mime, src, dst)) != NULL) + { + /* + * Yup, does the existing filter have a higher cost? If so, copy the + * filter and cost to the existing filter entry and return it... + */ + + if (temp->cost > cost) + { + DEBUG_printf(("1mimeAddFilter: Replacing filter \"%s\", cost %d.", + temp->filter, temp->cost)); + temp->cost = cost; + strlcpy(temp->filter, filter, sizeof(temp->filter)); + } + } + else + { + /* + * Nope, add a new one... + */ + + if (!mime->filters) + mime->filters = cupsArrayNew((cups_array_func_t)mime_compare_filters, NULL); + + if (!mime->filters) + return (NULL); + + if ((temp = calloc(1, sizeof(mime_filter_t))) == NULL) + return (NULL); + + /* + * Copy the information over and sort if necessary... + */ + + temp->src = src; + temp->dst = dst; + temp->cost = cost; + strlcpy(temp->filter, filter, sizeof(temp->filter)); + + DEBUG_puts("1mimeAddFilter: Adding new filter."); + cupsArrayAdd(mime->filters, temp); + cupsArrayAdd(mime->srcs, temp); + } + + /* + * Return the new/updated filter... + */ + + DEBUG_printf(("1mimeAddFilter: Returning %p.", temp)); + + return (temp); +} + + +/* + * 'mimeFilter()' - Find the fastest way to convert from one type to another. + */ + +cups_array_t * /* O - Array of filters to run */ +mimeFilter(mime_t *mime, /* I - MIME database */ + mime_type_t *src, /* I - Source file type */ + mime_type_t *dst, /* I - Destination file type */ + int *cost) /* O - Cost of filters */ +{ + DEBUG_printf(("mimeFilter(mime=%p, src=%p(%s/%s), dst=%p(%s/%s), " + "cost=%p(%d))", mime, + src, src ? src->super : "???", src ? src->type : "???", + dst, dst ? dst->super : "???", dst ? dst->type : "???", + cost, cost ? *cost : 0)); + + return (mimeFilter2(mime, src, 0, dst, cost)); +} + + +/* + * 'mimeFilter2()' - Find the fastest way to convert from one type to another, + * including file size. + */ + +cups_array_t * /* O - Array of filters to run */ +mimeFilter2(mime_t *mime, /* I - MIME database */ + mime_type_t *src, /* I - Source file type */ + size_t srcsize, /* I - Size of source file */ + mime_type_t *dst, /* I - Destination file type */ + int *cost) /* O - Cost of filters */ +{ + cups_array_t *filters; /* Array of filters to run */ + + + /* + * Range-check the input... + */ + + DEBUG_printf(("mimeFilter2(mime=%p, src=%p(%s/%s), srcsize=" CUPS_LLFMT + ", dst=%p(%s/%s), cost=%p(%d))", mime, + src, src ? src->super : "???", src ? src->type : "???", + CUPS_LLCAST srcsize, + dst, dst ? dst->super : "???", dst ? dst->type : "???", + cost, cost ? *cost : 0)); + + if (cost) + *cost = 0; + + if (!mime || !src || !dst) + return (NULL); + + /* + * (Re)build the source lookup array as needed... + */ + + if (!mime->srcs) + { + mime_filter_t *current; /* Current filter */ + + mime->srcs = cupsArrayNew((cups_array_func_t)mime_compare_srcs, NULL); + + for (current = mimeFirstFilter(mime); + current; + current = mimeNextFilter(mime)) + cupsArrayAdd(mime->srcs, current); + } + + /* + * Find the filters... + */ + + filters = mime_find_filters(mime, src, srcsize, dst, cost, NULL); + + DEBUG_printf(("1mimeFilter2: Returning %d filter(s), cost %d:", + cupsArrayCount(filters), cost ? *cost : -1)); +#ifdef DEBUG + { + mime_filter_t *filter; /* Current filter */ + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + DEBUG_printf(("1mimeFilter2: %s/%s %s/%s %d %s", filter->src->super, + filter->src->type, filter->dst->super, filter->dst->type, + filter->cost, filter->filter)); + } +#endif /* DEBUG */ + + return (filters); +} + + +/* + * 'mimeFilterLookup()' - Lookup a filter. + */ + +mime_filter_t * /* O - Filter for src->dst */ +mimeFilterLookup(mime_t *mime, /* I - MIME database */ + mime_type_t *src, /* I - Source type */ + mime_type_t *dst) /* I - Destination type */ +{ + mime_filter_t key, /* Key record for filter search */ + *filter; /* Matching filter */ + + + DEBUG_printf(("2mimeFilterLookup(mime=%p, src=%p(%s/%s), dst=%p(%s/%s))", mime, + src, src ? src->super : "???", src ? src->type : "???", + dst, dst ? dst->super : "???", dst ? dst->type : "???")); + + key.src = src; + key.dst = dst; + + filter = (mime_filter_t *)cupsArrayFind(mime->filters, &key); + DEBUG_printf(("3mimeFilterLookup: Returning %p(%s).", filter, + filter ? filter->filter : "???")); + return (filter); +} + + +/* + * 'mime_compare_filters()' - Compare two filters. + */ + +static int /* O - Comparison result */ +mime_compare_filters(mime_filter_t *f0, /* I - First filter */ + mime_filter_t *f1) /* I - Second filter */ +{ + int i; /* Result of comparison */ + + + if ((i = strcmp(f0->src->super, f1->src->super)) == 0) + if ((i = strcmp(f0->src->type, f1->src->type)) == 0) + if ((i = strcmp(f0->dst->super, f1->dst->super)) == 0) + i = strcmp(f0->dst->type, f1->dst->type); + + return (i); +} + + +/* + * 'mime_compare_srcs()' - Compare two filter source types. + */ + +static int /* O - Comparison result */ +mime_compare_srcs(mime_filter_t *f0, /* I - First filter */ + mime_filter_t *f1) /* I - Second filter */ +{ + int i; /* Result of comparison */ + + + if ((i = strcmp(f0->src->super, f1->src->super)) == 0) + i = strcmp(f0->src->type, f1->src->type); + + return (i); +} + + +/* + * 'mime_find_filters()' - Find the filters to convert from one type to another. + */ + +static cups_array_t * /* O - Array of filters to run */ +mime_find_filters( + mime_t *mime, /* I - MIME database */ + mime_type_t *src, /* I - Source file type */ + size_t srcsize, /* I - Size of source file */ + mime_type_t *dst, /* I - Destination file type */ + int *cost, /* O - Cost of filters */ + _mime_typelist_t *list) /* I - Source types we've used */ +{ + int tempcost, /* Temporary cost */ + mincost; /* Current minimum */ + cups_array_t *temp, /* Temporary filter */ + *mintemp; /* Current minimum */ + mime_filter_t *current, /* Current filter */ + srckey; /* Source type key */ + _mime_typelist_t listnode, /* New list node */ + *listptr; /* Pointer in list */ + + + DEBUG_printf(("2mime_find_filters(mime=%p, src=%p(%s/%s), srcsize=" CUPS_LLFMT + ", dst=%p(%s/%s), cost=%p, list=%p)", mime, src, src->super, + src->type, CUPS_LLCAST srcsize, dst, dst->super, dst->type, + cost, list)); + + /* + * See if there is a filter that can convert the files directly... + */ + + if ((current = mimeFilterLookup(mime, src, dst)) != NULL && + (current->maxsize == 0 || srcsize <= current->maxsize)) + { + /* + * Got a direct filter! + */ + + DEBUG_puts("3mime_find_filters: Direct filter found."); + + if ((mintemp = cupsArrayNew(NULL, NULL)) == NULL) + { + DEBUG_puts("3mime_find_filters: Returning NULL (out of memory)."); + return (NULL); + } + + cupsArrayAdd(mintemp, current); + + mincost = current->cost; + + if (!cost) + { + DEBUG_printf(("3mime_find_filters: Returning 1 filter, cost %d:", + mincost)); + DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s", + current->src->super, current->src->type, + current->dst->super, current->dst->type, + current->cost, current->filter)); + return (mintemp); + } + } + else + { + /* + * No direct filter... + */ + + mintemp = NULL; + mincost = 9999999; + } + + /* + * Initialize this node in the type list... + */ + + listnode.next = list; + + /* + * OK, now look for filters from the source type to any other type... + */ + + srckey.src = src; + + for (current = (mime_filter_t *)cupsArrayFind(mime->srcs, &srckey); + current && current->src == src; + current = (mime_filter_t *)cupsArrayNext(mime->srcs)) + { + /* + * See if we have already tried the destination type as a source + * type (this avoids extra filter looping...) + */ + + mime_type_t *current_dst; /* Current destination type */ + + if (current->maxsize > 0 && srcsize > current->maxsize) + continue; + + for (listptr = list, current_dst = current->dst; + listptr; + listptr = listptr->next) + if (current_dst == listptr->src) + break; + + if (listptr) + continue; + + /* + * See if we have any filters that can convert from the destination type + * of this filter to the final type... + */ + + listnode.src = current->src; + + cupsArraySave(mime->srcs); + temp = mime_find_filters(mime, current->dst, srcsize, dst, &tempcost, + &listnode); + cupsArrayRestore(mime->srcs); + + if (!temp) + continue; + + if (!cost) + { + DEBUG_printf(("3mime_find_filters: Returning %d filter(s), cost %d:", + cupsArrayCount(temp), tempcost)); + +#ifdef DEBUG + for (current = (mime_filter_t *)cupsArrayFirst(temp); + current; + current = (mime_filter_t *)cupsArrayNext(temp)) + DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s", + current->src->super, current->src->type, + current->dst->super, current->dst->type, + current->cost, current->filter)); +#endif /* DEBUG */ + + return (temp); + } + + /* + * Found a match; see if this one is less costly than the last (if + * any...) + */ + + tempcost += current->cost; + + if (tempcost < mincost) + { + cupsArrayDelete(mintemp); + + /* + * Hey, we got a match! Add the current filter to the beginning of the + * filter list... + */ + + mintemp = temp; + mincost = tempcost; + cupsArrayInsert(mintemp, current); + } + else + cupsArrayDelete(temp); + } + + if (mintemp) + { + /* + * Hey, we got a match! + */ + + DEBUG_printf(("3mime_find_filters: Returning %d filter(s), cost %d:", + cupsArrayCount(mintemp), mincost)); + +#ifdef DEBUG + for (current = (mime_filter_t *)cupsArrayFirst(mintemp); + current; + current = (mime_filter_t *)cupsArrayNext(mintemp)) + DEBUG_printf(("3mime_find_filters: %s/%s %s/%s %d %s", + current->src->super, current->src->type, + current->dst->super, current->dst->type, + current->cost, current->filter)); +#endif /* DEBUG */ + + if (cost) + *cost = mincost; + + return (mintemp); + } + + DEBUG_puts("3mime_find_filters: Returning NULL (no matches)."); + + return (NULL); +} + + +/* + * End of "$Id: filter.c 9705 2011-04-22 04:38:28Z mike $". + */ diff --git a/scheduler/ipp.c b/scheduler/ipp.c new file mode 100644 index 0000000..9ba0e0e --- /dev/null +++ b/scheduler/ipp.c @@ -0,0 +1,12399 @@ +/* + * "$Id: ipp.c 10274 2012-02-13 20:42:51Z mike $" + * + * IPP routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * This file contains Kerberos support code, copyright 2006 by + * Jelmer Vernooij. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdProcessIPPRequest() - Process an incoming IPP request. + * cupsdTimeoutJob() - Timeout a job waiting on job files. + * accept_jobs() - Accept print jobs to a printer. + * add_class() - Add a class to the system. + * add_file() - Add a file to a job. + * add_job() - Add a job to a print queue. + * add_job_state_reasons() - Add the "job-state-reasons" attribute based + * upon the job and printer state... + * add_job_subscriptions() - Add any subscriptions for a job. + * add_job_uuid() - Add job-uuid attribute to a job. + * add_printer() - Add a printer to the system. + * add_printer_state_reasons() - Add the "printer-state-reasons" attribute + * based upon the printer state... + * add_queued_job_count() - Add the "queued-job-count" attribute for the + * specified printer or class. + * apple_init_profile() - Initialize a color profile. + * apple_register_profiles() - Register color profiles for a printer. + * apple_unregister_profiles() - Remove color profiles for the specified + * printer. + * apply_printer_defaults() - Apply printer default options to a job. + * authenticate_job() - Set job authentication info. + * cancel_all_jobs() - Cancel all or selected print jobs. + * cancel_job() - Cancel a print job. + * cancel_subscription() - Cancel a subscription. + * check_rss_recipient() - Check that we do not have a duplicate RSS + * feed URI. + * check_quotas() - Check quotas for a printer and user. + * close_job() - Close a multi-file job. + * copy_attribute() - Copy a single attribute. + * copy_attrs() - Copy attributes from one request to another. + * copy_banner() - Copy a banner file to the requests directory + * for the specified job. + * copy_file() - Copy a PPD file or interface script... + * copy_model() - Copy a PPD model file, substituting default + * values as needed... + * copy_job_attrs() - Copy job attributes. + * copy_printer_attrs() - Copy printer attributes. + * copy_subscription_attrs() - Copy subscription attributes. + * create_job() - Print a file to a printer or class. + * create_requested_array() - Create an array for the requested-attributes. + * create_subscription() - Create a notification subscription. + * delete_printer() - Remove a printer or class from the system. + * get_default() - Get the default destination. + * get_devices() - Get the list of available devices on the + * local system. + * get_document() - Get a copy of a job file. + * get_job_attrs() - Get job attributes. + * get_jobs() - Get a list of jobs for the specified printer. + * get_notifications() - Get events for a subscription. + * get_ppd() - Get a named PPD from the local system. + * get_ppds() - Get the list of PPD files on the local + * system. + * get_printer_attrs() - Get printer attributes. + * get_printer_supported() - Get printer supported values. + * get_printers() - Get a list of printers or classes. + * get_subscription_attrs() - Get subscription attributes. + * get_subscriptions() - Get subscriptions. + * get_username() - Get the username associated with a request. + * hold_job() - Hold a print job. + * hold_new_jobs() - Hold pending/new jobs on a printer or class. + * move_job() - Move a job to a new destination. + * ppd_parse_line() - Parse a PPD default line. + * print_job() - Print a file to a printer or class. + * read_job_ticket() - Read a job ticket embedded in a print file. + * reject_jobs() - Reject print jobs to a printer. + * release_held_new_jobs() - Release pending/new jobs on a printer or + * class. + * release_job() - Release a held print job. + * renew_subscription() - Renew an existing subscription... + * restart_job() - Restart an old print job. + * save_auth_info() - Save authentication information for a job. + * send_document() - Send a file to a printer or class. + * send_http_error() - Send a HTTP error back to the IPP client. + * send_ipp_status() - Send a status back to the IPP client. + * set_default() - Set the default destination... + * set_job_attrs() - Set job attributes. + * set_printer_attrs() - Set printer attributes. + * set_printer_defaults() - Set printer default options from a request. + * start_printer() - Start a printer. + * stop_printer() - Stop a printer. + * url_encode_attr() - URL-encode a string attribute. + * url_encode_string() - URL-encode a string. + * user_allowed() - See if a user is allowed to print to a queue. + * validate_job() - Validate printer options and destination. + * validate_name() - Make sure the printer name only contains + * valid chars. + * validate_user() - Validate the user for the request. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include + +#ifdef __APPLE__ +# include +# ifdef HAVE_COLORSYNCREGISTERDEVICE +extern CFUUIDRef ColorSyncCreateUUIDFromUInt32(unsigned id); +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ +# include +# ifdef HAVE_MEMBERSHIP_H +# include +# endif /* HAVE_MEMBERSHIP_H */ +# ifdef HAVE_MEMBERSHIPPRIV_H +# include +# else +extern int mbr_user_name_to_uuid(const char* name, uuid_t uu); +extern int mbr_group_name_to_uuid(const char* name, uuid_t uu); +extern int mbr_check_membership_by_id(uuid_t user, gid_t group, int* ismember); +# endif /* HAVE_MEMBERSHIPPRIV_H */ +#endif /* __APPLE__ */ + + +/* + * Local functions... + */ + +static void accept_jobs(cupsd_client_t *con, ipp_attribute_t *uri); +static void add_class(cupsd_client_t *con, ipp_attribute_t *uri); +static int add_file(cupsd_client_t *con, cupsd_job_t *job, + mime_type_t *filetype, int compression); +static cupsd_job_t *add_job(cupsd_client_t *con, cupsd_printer_t *printer, + mime_type_t *filetype); +static void add_job_state_reasons(cupsd_client_t *con, cupsd_job_t *job); +static void add_job_subscriptions(cupsd_client_t *con, cupsd_job_t *job); +static void add_job_uuid(cupsd_job_t *job); +static void add_printer(cupsd_client_t *con, ipp_attribute_t *uri); +static void add_printer_state_reasons(cupsd_client_t *con, + cupsd_printer_t *p); +static void add_queued_job_count(cupsd_client_t *con, cupsd_printer_t *p); +#ifdef __APPLE__ +static void apple_init_profile(ppd_file_t *ppd, cups_array_t *languages, +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFMutableDictionaryRef profile, +# else + CMDeviceProfileInfo *profile, +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + unsigned id, const char *name, + const char *text, const char *iccfile); +static void apple_register_profiles(cupsd_printer_t *p); +static void apple_unregister_profiles(cupsd_printer_t *p); +#endif /* __APPLE__ */ +static void apply_printer_defaults(cupsd_printer_t *printer, + cupsd_job_t *job); +static void authenticate_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void cancel_all_jobs(cupsd_client_t *con, ipp_attribute_t *uri); +static void cancel_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void cancel_subscription(cupsd_client_t *con, int id); +static int check_rss_recipient(const char *recipient); +static int check_quotas(cupsd_client_t *con, cupsd_printer_t *p); +static ipp_attribute_t *copy_attribute(ipp_t *to, ipp_attribute_t *attr, + int quickcopy); +static void close_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void copy_attrs(ipp_t *to, ipp_t *from, cups_array_t *ra, + ipp_tag_t group, int quickcopy, + cups_array_t *exclude); +static int copy_banner(cupsd_client_t *con, cupsd_job_t *job, + const char *name); +static int copy_file(const char *from, const char *to); +static int copy_model(cupsd_client_t *con, const char *from, + const char *to); +static void copy_job_attrs(cupsd_client_t *con, + cupsd_job_t *job, + cups_array_t *ra, cups_array_t *exclude); +static void copy_printer_attrs(cupsd_client_t *con, + cupsd_printer_t *printer, + cups_array_t *ra); +static void copy_subscription_attrs(cupsd_client_t *con, + cupsd_subscription_t *sub, + cups_array_t *ra, + cups_array_t *exclude); +static void create_job(cupsd_client_t *con, ipp_attribute_t *uri); +static cups_array_t *create_requested_array(ipp_t *request); +static void create_subscription(cupsd_client_t *con, ipp_attribute_t *uri); +static void delete_printer(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_default(cupsd_client_t *con); +static void get_devices(cupsd_client_t *con); +static void get_document(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_jobs(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_job_attrs(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_notifications(cupsd_client_t *con); +static void get_ppd(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_ppds(cupsd_client_t *con); +static void get_printers(cupsd_client_t *con, int type); +static void get_printer_attrs(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_printer_supported(cupsd_client_t *con, ipp_attribute_t *uri); +static void get_subscription_attrs(cupsd_client_t *con, int sub_id); +static void get_subscriptions(cupsd_client_t *con, ipp_attribute_t *uri); +static const char *get_username(cupsd_client_t *con); +static void hold_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void hold_new_jobs(cupsd_client_t *con, ipp_attribute_t *uri); +static void move_job(cupsd_client_t *con, ipp_attribute_t *uri); +static int ppd_parse_line(const char *line, char *option, int olen, + char *choice, int clen); +static void print_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void read_job_ticket(cupsd_client_t *con); +static void reject_jobs(cupsd_client_t *con, ipp_attribute_t *uri); +static void release_held_new_jobs(cupsd_client_t *con, + ipp_attribute_t *uri); +static void release_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void renew_subscription(cupsd_client_t *con, int sub_id); +static void restart_job(cupsd_client_t *con, ipp_attribute_t *uri); +static void save_auth_info(cupsd_client_t *con, cupsd_job_t *job, + ipp_attribute_t *auth_info); +static void send_document(cupsd_client_t *con, ipp_attribute_t *uri); +static void send_http_error(cupsd_client_t *con, http_status_t status, + cupsd_printer_t *printer); +static void send_ipp_status(cupsd_client_t *con, ipp_status_t status, + const char *message, ...) +# ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 3, 4))) +# endif /* __GNUC__ */ +; +static void set_default(cupsd_client_t *con, ipp_attribute_t *uri); +static void set_job_attrs(cupsd_client_t *con, ipp_attribute_t *uri); +static void set_printer_attrs(cupsd_client_t *con, ipp_attribute_t *uri); +static void set_printer_defaults(cupsd_client_t *con, + cupsd_printer_t *printer); +static void start_printer(cupsd_client_t *con, ipp_attribute_t *uri); +static void stop_printer(cupsd_client_t *con, ipp_attribute_t *uri); +static void url_encode_attr(ipp_attribute_t *attr, char *buffer, + int bufsize); +static char *url_encode_string(const char *s, char *buffer, int bufsize); +static int user_allowed(cupsd_printer_t *p, const char *username); +static void validate_job(cupsd_client_t *con, ipp_attribute_t *uri); +static int validate_name(const char *name); +static int validate_user(cupsd_job_t *job, cupsd_client_t *con, + const char *owner, char *username, + int userlen); + + +/* + * 'cupsdProcessIPPRequest()' - Process an incoming IPP request. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdProcessIPPRequest( + cupsd_client_t *con) /* I - Client connection */ +{ + ipp_tag_t group; /* Current group tag */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *charset; /* Character set attribute */ + ipp_attribute_t *language; /* Language attribute */ + ipp_attribute_t *uri = NULL; /* Printer or job URI attribute */ + ipp_attribute_t *username; /* requesting-user-name attr */ + int sub_id; /* Subscription ID */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdProcessIPPRequest(%p[%d]): operation_id = %04x", + con, con->http.fd, con->request->request.op.operation_id); + + /* + * First build an empty response message for this request... + */ + + con->response = ippNew(); + + con->response->request.status.version[0] = + con->request->request.op.version[0]; + con->response->request.status.version[1] = + con->request->request.op.version[1]; + con->response->request.status.request_id = + con->request->request.op.request_id; + + /* + * Then validate the request header and required attributes... + */ + + if (con->request->request.any.version[0] != 1 && + con->request->request.any.version[0] != 2) + { + /* + * Return an error, since we only support IPP 1.x and 2.x. + */ + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Bad request version number %d.%d", + IPP_VERSION_NOT_SUPPORTED, con->http.hostname, + con->request->request.any.version[0], + con->request->request.any.version[1]); + + send_ipp_status(con, IPP_VERSION_NOT_SUPPORTED, + _("Bad request version number %d.%d."), + con->request->request.any.version[0], + con->request->request.any.version[1]); + } + else if (con->request->request.any.request_id < 1) + { + /* + * Return an error, since request IDs must be between 1 and 2^31-1 + */ + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Bad request ID %d", + IPP_BAD_REQUEST, con->http.hostname, + con->request->request.any.request_id); + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad request ID %d."), + con->request->request.any.request_id); + } + else if (!con->request->attrs) + { + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s No attributes in request", + IPP_BAD_REQUEST, con->http.hostname); + + send_ipp_status(con, IPP_BAD_REQUEST, _("No attributes in request.")); + } + else + { + /* + * Make sure that the attributes are provided in the correct order and + * don't repeat groups... + */ + + for (attr = con->request->attrs, group = attr->group_tag; + attr; + attr = attr->next) + if (attr->group_tag < group && attr->group_tag != IPP_TAG_ZERO) + { + /* + * Out of order; return an error... + */ + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Attribute groups are out of order", + IPP_BAD_REQUEST, con->http.hostname); + + send_ipp_status(con, IPP_BAD_REQUEST, + _("Attribute groups are out of order (%x < %x)."), + attr->group_tag, group); + break; + } + else + group = attr->group_tag; + + if (!attr) + { + /* + * Then make sure that the first three attributes are: + * + * attributes-charset + * attributes-natural-language + * printer-uri/job-uri + */ + + attr = con->request->attrs; + if (attr && attr->name && + !strcmp(attr->name, "attributes-charset") && + (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_CHARSET) + charset = attr; + else + charset = NULL; + + if (attr) + attr = attr->next; + + if (attr && attr->name && + !strcmp(attr->name, "attributes-natural-language") && + (attr->value_tag & IPP_TAG_MASK) == IPP_TAG_LANGUAGE) + language = attr; + else + language = NULL; + + if ((attr = ippFindAttribute(con->request, "printer-uri", + IPP_TAG_URI)) != NULL) + uri = attr; + else if ((attr = ippFindAttribute(con->request, "job-uri", + IPP_TAG_URI)) != NULL) + uri = attr; + else if (con->request->request.op.operation_id == CUPS_GET_PPD) + uri = ippFindAttribute(con->request, "ppd-name", IPP_TAG_NAME); + else + uri = NULL; + + if (charset) + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, + charset->values[0].string.text); + else + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, "utf-8"); + + if (language) + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, + language->values[0].string.text); + else + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, DefaultLanguage); + + if (charset && + _cups_strcasecmp(charset->values[0].string.text, "us-ascii") && + _cups_strcasecmp(charset->values[0].string.text, "utf-8")) + { + /* + * Bad character set... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "Unsupported character set \"%s\"", + charset->values[0].string.text); + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Unsupported attributes-charset value \"%s\"", + IPP_CHARSET, con->http.hostname, + charset->values[0].string.text); + send_ipp_status(con, IPP_BAD_REQUEST, + _("Unsupported character set \"%s\"."), + charset->values[0].string.text); + } + else if (!charset || !language || + (!uri && + con->request->request.op.operation_id != CUPS_GET_DEFAULT && + con->request->request.op.operation_id != CUPS_GET_PRINTERS && + con->request->request.op.operation_id != CUPS_GET_CLASSES && + con->request->request.op.operation_id != CUPS_GET_DEVICES && + con->request->request.op.operation_id != CUPS_GET_PPDS)) + { + /* + * Return an error, since attributes-charset, + * attributes-natural-language, and printer-uri/job-uri are required + * for all operations. + */ + + if (!charset) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing attributes-charset attribute"); + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Missing attributes-charset attribute", + IPP_BAD_REQUEST, con->http.hostname); + } + + if (!language) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing attributes-natural-language attribute"); + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Missing attributes-natural-language attribute", + IPP_BAD_REQUEST, con->http.hostname); + } + + if (!uri) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing printer-uri, job-uri, or ppd-name " + "attribute"); + + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Missing printer-uri, job-uri, or ppd-name " + "attribute", IPP_BAD_REQUEST, con->http.hostname); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Request attributes follow..."); + + for (attr = con->request->attrs; attr; attr = attr->next) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "attr \"%s\": group_tag = %x, value_tag = %x", + attr->name ? attr->name : "(null)", attr->group_tag, + attr->value_tag); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "End of attributes..."); + + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing required attributes.")); + } + else + { + /* + * OK, all the checks pass so far; make sure requesting-user-name is + * not "root" from a remote host... + */ + + if ((username = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + { + /* + * Check for root user... + */ + + if (!strcmp(username->values[0].string.text, "root") && + _cups_strcasecmp(con->http.hostname, "localhost") && + strcmp(con->username, "root")) + { + /* + * Remote unauthenticated user masquerading as local root... + */ + + _cupsStrFree(username->values[0].string.text); + username->values[0].string.text = _cupsStrAlloc(RemoteRoot); + } + } + + if ((attr = ippFindAttribute(con->request, "notify-subscription-id", + IPP_TAG_INTEGER)) != NULL) + sub_id = attr->values[0].integer; + else + sub_id = 0; + + /* + * Then try processing the operation... + */ + + if (uri) + cupsdLogMessage(CUPSD_LOG_DEBUG, "%s %s", + ippOpString(con->request->request.op.operation_id), + uri->values[0].string.text); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "%s", + ippOpString(con->request->request.op.operation_id)); + + switch (con->request->request.op.operation_id) + { + case IPP_PRINT_JOB : + print_job(con, uri); + break; + + case IPP_VALIDATE_JOB : + validate_job(con, uri); + break; + + case IPP_CREATE_JOB : + create_job(con, uri); + break; + + case IPP_SEND_DOCUMENT : + send_document(con, uri); + break; + + case IPP_CANCEL_JOB : + cancel_job(con, uri); + break; + + case IPP_GET_JOB_ATTRIBUTES : + get_job_attrs(con, uri); + break; + + case IPP_GET_JOBS : + get_jobs(con, uri); + break; + + case IPP_GET_PRINTER_ATTRIBUTES : + get_printer_attrs(con, uri); + break; + + case IPP_GET_PRINTER_SUPPORTED_VALUES : + get_printer_supported(con, uri); + break; + + case IPP_HOLD_JOB : + hold_job(con, uri); + break; + + case IPP_RELEASE_JOB : + release_job(con, uri); + break; + + case IPP_RESTART_JOB : + restart_job(con, uri); + break; + + case IPP_PAUSE_PRINTER : + stop_printer(con, uri); + break; + + case IPP_RESUME_PRINTER : + start_printer(con, uri); + break; + + case IPP_PURGE_JOBS : + case IPP_CANCEL_JOBS : + case IPP_CANCEL_MY_JOBS : + cancel_all_jobs(con, uri); + break; + + case IPP_SET_JOB_ATTRIBUTES : + set_job_attrs(con, uri); + break; + + case IPP_SET_PRINTER_ATTRIBUTES : + set_printer_attrs(con, uri); + break; + + case IPP_HOLD_NEW_JOBS : + hold_new_jobs(con, uri); + break; + + case IPP_RELEASE_HELD_NEW_JOBS : + release_held_new_jobs(con, uri); + break; + + case IPP_CLOSE_JOB : + close_job(con, uri); + break; + + case CUPS_GET_DEFAULT : + get_default(con); + break; + + case CUPS_GET_PRINTERS : + get_printers(con, 0); + break; + + case CUPS_GET_CLASSES : + get_printers(con, CUPS_PRINTER_CLASS); + break; + + case CUPS_ADD_PRINTER : + add_printer(con, uri); + break; + + case CUPS_DELETE_PRINTER : + delete_printer(con, uri); + break; + + case CUPS_ADD_CLASS : + add_class(con, uri); + break; + + case CUPS_DELETE_CLASS : + delete_printer(con, uri); + break; + + case CUPS_ACCEPT_JOBS : + case IPP_ENABLE_PRINTER : + accept_jobs(con, uri); + break; + + case CUPS_REJECT_JOBS : + case IPP_DISABLE_PRINTER : + reject_jobs(con, uri); + break; + + case CUPS_SET_DEFAULT : + set_default(con, uri); + break; + + case CUPS_GET_DEVICES : + get_devices(con); + break; + + case CUPS_GET_DOCUMENT : + get_document(con, uri); + break; + + case CUPS_GET_PPD : + get_ppd(con, uri); + break; + + case CUPS_GET_PPDS : + get_ppds(con); + break; + + case CUPS_MOVE_JOB : + move_job(con, uri); + break; + + case CUPS_AUTHENTICATE_JOB : + authenticate_job(con, uri); + break; + + case IPP_CREATE_PRINTER_SUBSCRIPTION : + case IPP_CREATE_JOB_SUBSCRIPTION : + create_subscription(con, uri); + break; + + case IPP_GET_SUBSCRIPTION_ATTRIBUTES : + get_subscription_attrs(con, sub_id); + break; + + case IPP_GET_SUBSCRIPTIONS : + get_subscriptions(con, uri); + break; + + case IPP_RENEW_SUBSCRIPTION : + renew_subscription(con, sub_id); + break; + + case IPP_CANCEL_SUBSCRIPTION : + cancel_subscription(con, sub_id); + break; + + case IPP_GET_NOTIFICATIONS : + get_notifications(con); + break; + + default : + cupsdAddEvent(CUPSD_EVENT_SERVER_AUDIT, NULL, NULL, + "%04X %s Operation %04X (%s) not supported", + IPP_OPERATION_NOT_SUPPORTED, con->http.hostname, + con->request->request.op.operation_id, + ippOpString(con->request->request.op.operation_id)); + + send_ipp_status(con, IPP_OPERATION_NOT_SUPPORTED, + _("%s not supported."), + ippOpString( + con->request->request.op.operation_id)); + break; + } + } + } + } + + if (con->response) + { + /* + * Sending data from the scheduler... + */ + + cupsdLogMessage(con->response->request.status.status_code + >= IPP_BAD_REQUEST && + con->response->request.status.status_code + != IPP_NOT_FOUND ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG, + "Returning IPP %s for %s (%s) from %s", + ippErrorString(con->response->request.status.status_code), + ippOpString(con->request->request.op.operation_id), + uri ? uri->values[0].string.text : "no URI", + con->http.hostname); + + if (LogLevel == CUPSD_LOG_DEBUG2) + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdProcessIPPRequest: ippLength(response)=%ld", + (long)ippLength(con->response)); + + if (cupsdSendHeader(con, HTTP_OK, "application/ipp", CUPSD_AUTH_NONE)) + { +#ifdef CUPSD_USE_CHUNKING + /* + * Because older versions of CUPS (1.1.17 and older) and some IPP + * clients do not implement chunking properly, we cannot use + * chunking by default. This may become the default in future + * CUPS releases, or we might add a configuration directive for + * it. + */ + + if (con->http.version == HTTP_1_1) + { + if (httpPrintf(HTTP(con), "Transfer-Encoding: chunked\r\n\r\n") < 0) + return (0); + + if (cupsdFlushHeader(con) < 0) + return (0); + + con->http.data_encoding = HTTP_ENCODE_CHUNKED; + } + else +#endif /* CUPSD_USE_CHUNKING */ + { + size_t length; /* Length of response */ + + + length = ippLength(con->response); + + if (con->file >= 0 && !con->pipe_pid) + { + struct stat fileinfo; /* File information */ + + + if (!fstat(con->file, &fileinfo)) + length += fileinfo.st_size; + } + + if (httpPrintf(HTTP(con), "Content-Length: " CUPS_LLFMT "\r\n\r\n", + CUPS_LLCAST length) < 0) + return (0); + + if (cupsdFlushHeader(con) < 0) + return (0); + + con->http.data_encoding = HTTP_ENCODE_LENGTH; + con->http.data_remaining = length; + + if (con->http.data_remaining <= INT_MAX) + con->http._data_remaining = con->http.data_remaining; + else + con->http._data_remaining = INT_MAX; + } + + cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, + (cupsd_selfunc_t)cupsdWriteClient, con); + + /* + * Tell the caller the response header was sent successfully... + */ + + return (1); + } + else + { + /* + * Tell the caller the response header could not be sent... + */ + + return (0); + } + } + else + { + /* + * Sending data from a subprocess like cups-deviced; tell the caller + * everything is A-OK so far... + */ + + return (1); + } +} + + +/* + * 'cupsdTimeoutJob()' - Timeout a job waiting on job files. + */ + +int /* O - 0 on success, -1 on error */ +cupsdTimeoutJob(cupsd_job_t *job) /* I - Job to timeout */ +{ + cupsd_printer_t *printer; /* Destination printer or class */ + ipp_attribute_t *attr; /* job-sheets attribute */ + int kbytes; /* Kilobytes in banner */ + + + job->pending_timeout = 0; + + /* + * See if we need to add the ending sheet... + */ + + if (!cupsdLoadJob(job)) + return (-1); + + printer = cupsdFindDest(job->dest); + attr = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); + + if (printer && + !(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) && + attr && attr->num_values > 1) + { + /* + * Yes... + */ + + cupsdLogJob(job, CUPSD_LOG_INFO, "Adding end banner page \"%s\".", + attr->values[1].string.text); + + if ((kbytes = copy_banner(NULL, job, attr->values[1].string.text)) < 0) + return (-1); + + cupsdUpdateQuota(printer, job->username, 0, kbytes); + } + + return (0); +} + + +/* + * 'accept_jobs()' - Accept print jobs to a printer. + */ + +static void +accept_jobs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer or class URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "accept_jobs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Accept jobs sent to the printer... + */ + + printer->accepting = 1; + printer->state_message[0] = '\0'; + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, + "Now accepting jobs."); + + if (dtype & CUPS_PRINTER_CLASS) + { + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" now accepting jobs (\"%s\").", + printer->name, get_username(con)); + } + else + { + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Printer \"%s\" now accepting jobs (\"%s\").", + printer->name, get_username(con)); + } + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'add_class()' - Add a class to the system. + */ + +static void +add_class(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - URI of class */ +{ + http_status_t status; /* Policy status */ + int i; /* Looping var */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_printer_t *pclass, /* Class */ + *member; /* Member printer/class */ + cups_ptype_t dtype; /* Destination type */ + ipp_attribute_t *attr; /* Printer attribute */ + int modify; /* Non-zero if we just modified */ + char newname[IPP_MAX_NAME]; /* New class name */ + int need_restart_job; /* Need to restart job? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_class(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Do we have a valid URI? + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + + if (strncmp(resource, "/classes/", 9) || strlen(resource) == 9) + { + /* + * No, return an error... + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("The printer-uri must be of the form " + "\"ipp://HOSTNAME/classes/CLASSNAME\".")); + return; + } + + /* + * Do we have a valid printer name? + */ + + if (!validate_name(resource + 9)) + { + /* + * No, return an error... + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("The printer-uri \"%s\" contains invalid characters."), + uri->values[0].string.text); + return; + } + + /* + * See if the class already exists; if not, create a new class... + */ + + if ((pclass = cupsdFindClass(resource + 9)) == NULL) + { + /* + * Class doesn't exist; see if we have a printer of the same name... + */ + + if ((pclass = cupsdFindPrinter(resource + 9)) != NULL && + !(pclass->type & CUPS_PRINTER_DISCOVERED)) + { + /* + * Yes, return an error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("A printer named \"%s\" already exists."), + resource + 9); + return; + } + + /* + * No, check the default policy and then add the class... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + pclass = cupsdAddClass(resource + 9); + modify = 0; + } + else if (pclass->type & CUPS_PRINTER_IMPLICIT) + { + /* + * Check the default policy, then rename the implicit class to "AnyClass" + * or remove it... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + if (ImplicitAnyClasses) + { + snprintf(newname, sizeof(newname), "Any%s", resource + 9); + cupsdRenamePrinter(pclass, newname); + } + else + cupsdDeletePrinter(pclass, 1); + + /* + * Add the class as a new local class... + */ + + pclass = cupsdAddClass(resource + 9); + modify = 0; + } + else if (pclass->type & CUPS_PRINTER_DISCOVERED) + { + /* + * Check the default policy, then rename the remote class to "Class"... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + snprintf(newname, sizeof(newname), "%s@%s", resource + 9, pclass->hostname); + cupsdRenamePrinter(pclass, newname); + + /* + * Add the class as a new local class... + */ + + pclass = cupsdAddClass(resource + 9); + modify = 0; + } + else if ((status = cupsdCheckPolicy(pclass->op_policy_ptr, con, + NULL)) != HTTP_OK) + { + send_http_error(con, status, pclass); + return; + } + else + modify = 1; + + /* + * Look for attributes and copy them over as needed... + */ + + need_restart_job = 0; + + if ((attr = ippFindAttribute(con->request, "printer-location", + IPP_TAG_TEXT)) != NULL) + cupsdSetString(&pclass->location, attr->values[0].string.text); + + if ((attr = ippFindAttribute(con->request, "printer-info", + IPP_TAG_TEXT)) != NULL) + cupsdSetString(&pclass->info, attr->values[0].string.text); + + if ((attr = ippFindAttribute(con->request, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN)) != NULL && + attr->values[0].boolean != pclass->accepting) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s printer-is-accepting-jobs to %d (was %d.)", + pclass->name, attr->values[0].boolean, pclass->accepting); + + pclass->accepting = attr->values[0].boolean; + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, pclass, NULL, "%s accepting jobs.", + pclass->accepting ? "Now" : "No longer"); + } + + if ((attr = ippFindAttribute(con->request, "printer-is-shared", + IPP_TAG_BOOLEAN)) != NULL) + { + if (pclass->shared && !attr->values[0].boolean) + cupsdDeregisterPrinter(pclass, 1); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s printer-is-shared to %d (was %d.)", + pclass->name, attr->values[0].boolean, pclass->shared); + + pclass->shared = attr->values[0].boolean; + } + + if ((attr = ippFindAttribute(con->request, "printer-state", + IPP_TAG_ENUM)) != NULL) + { + if (attr->values[0].integer != IPP_PRINTER_IDLE && + attr->values[0].integer != IPP_PRINTER_STOPPED) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Attempt to set %s printer-state to bad value %d."), + pclass->name, attr->values[0].integer); + return; + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", + pclass->name, attr->values[0].integer, pclass->state); + + if (attr->values[0].integer == IPP_PRINTER_STOPPED) + cupsdStopPrinter(pclass, 0); + else + { + cupsdSetPrinterState(pclass, (ipp_pstate_t)(attr->values[0].integer), 0); + need_restart_job = 1; + } + } + if ((attr = ippFindAttribute(con->request, "printer-state-message", + IPP_TAG_TEXT)) != NULL) + { + strlcpy(pclass->state_message, attr->values[0].string.text, + sizeof(pclass->state_message)); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, pclass, NULL, "%s", + pclass->state_message); + } + if ((attr = ippFindAttribute(con->request, "member-uris", + IPP_TAG_URI)) != NULL) + { + /* + * Clear the printer array as needed... + */ + + need_restart_job = 1; + + if (pclass->num_printers > 0) + { + free(pclass->printers); + pclass->num_printers = 0; + } + + /* + * Add each printer or class that is listed... + */ + + for (i = 0; i < attr->num_values; i ++) + { + /* + * Search for the printer or class URI... + */ + + if (!cupsdValidateDest(attr->values[i].string.text, &dtype, &member)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + else if (dtype & CUPS_PRINTER_CLASS) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Nested classes are not allowed.")); + return; + } + + /* + * Add it to the class... + */ + + cupsdAddPrinterToClass(pclass, member); + } + } + + set_printer_defaults(con, pclass); + + if ((attr = ippFindAttribute(con->request, "auth-info-required", + IPP_TAG_KEYWORD)) != NULL) + cupsdSetAuthInfoRequired(pclass, NULL, attr); + + /* + * Update the printer class attributes and return... + */ + + cupsdSetPrinterAttrs(pclass); + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + + if (need_restart_job && pclass->job) + { + /* + * Reset the current job to a "pending" status... + */ + + cupsdSetJobState(pclass->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + "Job restarted because the class was modified."); + } + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + + if (modify) + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, + pclass, NULL, "Class \"%s\" modified by \"%s\".", + pclass->name, get_username(con)); + + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" modified by \"%s\".", + pclass->name, get_username(con)); + } + else + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, + pclass, NULL, "New class \"%s\" added by \"%s\".", + pclass->name, get_username(con)); + + cupsdLogMessage(CUPSD_LOG_INFO, "New class \"%s\" added by \"%s\".", + pclass->name, get_username(con)); + } + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'add_file()' - Add a file to a job. + */ + +static int /* O - 0 on success, -1 on error */ +add_file(cupsd_client_t *con, /* I - Connection to client */ + cupsd_job_t *job, /* I - Job to add to */ + mime_type_t *filetype, /* I - Type of file */ + int compression) /* I - Compression */ +{ + mime_type_t **filetypes; /* New filetypes array... */ + int *compressions; /* New compressions array... */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_file(con=%p[%d], job=%d, filetype=%s/%s, " + "compression=%d)", con, con ? con->http.fd : -1, job->id, + filetype->super, filetype->type, compression); + + /* + * Add the file to the job... + */ + + if (job->num_files == 0) + { + compressions = (int *)malloc(sizeof(int)); + filetypes = (mime_type_t **)malloc(sizeof(mime_type_t *)); + } + else + { + compressions = (int *)realloc(job->compressions, + (job->num_files + 1) * sizeof(int)); + filetypes = (mime_type_t **)realloc(job->filetypes, + (job->num_files + 1) * + sizeof(mime_type_t *)); + } + + if (!compressions || !filetypes) + { + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Job aborted because the scheduler ran out of memory."); + + if (con) + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("Unable to allocate memory for file types.")); + + return (-1); + } + + job->compressions = compressions; + job->compressions[job->num_files] = compression; + job->filetypes = filetypes; + job->filetypes[job->num_files] = filetype; + + job->num_files ++; + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + + return (0); +} + + +/* + * 'add_job()' - Add a job to a print queue. + */ + +static cupsd_job_t * /* O - Job object */ +add_job(cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *printer, /* I - Destination printer */ + mime_type_t *filetype) /* I - First print file type, if any */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr, /* Current attribute */ + *auth_info; /* auth-info attribute */ + const char *val; /* Default option value */ + int priority; /* Job priority */ + cupsd_job_t *job; /* Current job */ + char job_uri[HTTP_MAX_URI]; /* Job URI */ + int kbytes; /* Size of print file */ + int i; /* Looping var */ + int lowerpagerange; /* Page range bound */ + int exact; /* Did we have an exact match? */ + ipp_attribute_t *media_col, /* media-col attribute */ + *media_margin; /* media-*-margin attribute */ + ipp_t *unsup_col; /* media-col in unsupported response */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job(%p[%d], %p(%s), %p(%s/%s))", + con, con->http.fd, printer, printer->name, + filetype, filetype ? filetype->super : "none", + filetype ? filetype->type : "none"); + + /* + * Check remote printing to non-shared printer... + */ + + if (!printer->shared && + _cups_strcasecmp(con->http.hostname, "localhost") && + _cups_strcasecmp(con->http.hostname, ServerName)) + { + send_ipp_status(con, IPP_NOT_AUTHORIZED, + _("The printer or class is not shared.")); + return (NULL); + } + + /* + * Check policy... + */ + + auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return (NULL); + } + else if (printer->num_auth_info_required == 1 && + !strcmp(printer->auth_info_required[0], "negotiate") && + !con->username[0]) + { + send_http_error(con, HTTP_UNAUTHORIZED, printer); + return (NULL); + } +#ifdef HAVE_SSL + else if (auth_info && !con->http.tls && + !httpAddrLocalhost(con->http.hostaddr)) + { + /* + * Require encryption of auth-info over non-local connections... + */ + + send_http_error(con, HTTP_UPGRADE_REQUIRED, printer); + return (NULL); + } +#endif /* HAVE_SSL */ + + /* + * See if the printer is accepting jobs... + */ + + if (!printer->accepting) + { + send_ipp_status(con, IPP_NOT_ACCEPTING, + _("Destination \"%s\" is not accepting jobs."), + printer->name); + return (NULL); + } + + /* + * Validate job template attributes; for now just document-format, + * copies, number-up, and page-ranges... + */ + + if (filetype && printer->filetypes && + !cupsArrayFind(printer->filetypes, filetype)) + { + char mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2]; + /* MIME media type string */ + + + snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, + filetype->type); + + send_ipp_status(con, IPP_DOCUMENT_FORMAT, + _("Unsupported format \"%s\"."), mimetype); + + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, + "document-format", NULL, mimetype); + + return (NULL); + } + + if ((attr = ippFindAttribute(con->request, "copies", + IPP_TAG_INTEGER)) != NULL) + { + if (attr->values[0].integer < 1 || attr->values[0].integer > MaxCopies) + { + send_ipp_status(con, IPP_ATTRIBUTES, _("Bad copies value %d."), + attr->values[0].integer); + ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, + "copies", attr->values[0].integer); + return (NULL); + } + } + + if ((attr = ippFindAttribute(con->request, "job-sheets", + IPP_TAG_ZERO)) != NULL) + { + if (attr->value_tag != IPP_TAG_KEYWORD && + attr->value_tag != IPP_TAG_NAME) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value type.")); + return (NULL); + } + + if (attr->num_values > 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Too many job-sheets values (%d > 2)."), + attr->num_values); + return (NULL); + } + + for (i = 0; i < attr->num_values; i ++) + if (strcmp(attr->values[i].string.text, "none") && + !cupsdFindBanner(attr->values[i].string.text)) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-sheets value \"%s\"."), + attr->values[i].string.text); + return (NULL); + } + } + + if ((attr = ippFindAttribute(con->request, "number-up", + IPP_TAG_INTEGER)) != NULL) + { + if (attr->values[0].integer != 1 && + attr->values[0].integer != 2 && + attr->values[0].integer != 4 && + attr->values[0].integer != 6 && + attr->values[0].integer != 9 && + attr->values[0].integer != 16) + { + send_ipp_status(con, IPP_ATTRIBUTES, _("Bad number-up value %d."), + attr->values[0].integer); + ippAddInteger(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_INTEGER, + "number-up", attr->values[0].integer); + return (NULL); + } + } + + if ((attr = ippFindAttribute(con->request, "page-ranges", + IPP_TAG_RANGE)) != NULL) + { + for (i = 0, lowerpagerange = 1; i < attr->num_values; i ++) + { + if (attr->values[i].range.lower < lowerpagerange || + attr->values[i].range.lower > attr->values[i].range.upper) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Bad page-ranges values %d-%d."), + attr->values[i].range.lower, + attr->values[i].range.upper); + return (NULL); + } + + lowerpagerange = attr->values[i].range.upper + 1; + } + } + + /* + * Do media selection as needed... + */ + + if (!ippFindAttribute(con->request, "PageRegion", IPP_TAG_ZERO) && + !ippFindAttribute(con->request, "PageSize", IPP_TAG_ZERO) && + _ppdCacheGetPageSize(printer->pc, con->request, NULL, &exact)) + { + if (!exact && + (media_col = ippFindAttribute(con->request, "media-col", + IPP_TAG_BEGIN_COLLECTION)) != NULL) + { + send_ipp_status(con, IPP_OK_SUBST, _("Unsupported margins.")); + + unsup_col = ippNew(); + if ((media_margin = ippFindAttribute(media_col->values[0].collection, + "media-bottom-margin", + IPP_TAG_INTEGER)) != NULL) + ippAddInteger(unsup_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-bottom-margin", media_margin->values[0].integer); + + if ((media_margin = ippFindAttribute(media_col->values[0].collection, + "media-left-margin", + IPP_TAG_INTEGER)) != NULL) + ippAddInteger(unsup_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-left-margin", media_margin->values[0].integer); + + if ((media_margin = ippFindAttribute(media_col->values[0].collection, + "media-right-margin", + IPP_TAG_INTEGER)) != NULL) + ippAddInteger(unsup_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-right-margin", media_margin->values[0].integer); + + if ((media_margin = ippFindAttribute(media_col->values[0].collection, + "media-top-margin", + IPP_TAG_INTEGER)) != NULL) + ippAddInteger(unsup_col, IPP_TAG_ZERO, IPP_TAG_INTEGER, + "media-top-margin", media_margin->values[0].integer); + + ippAddCollection(con->response, IPP_TAG_UNSUPPORTED_GROUP, "media-col", + unsup_col); + ippDelete(unsup_col); + } + } + + /* + * Make sure we aren't over our limit... + */ + + if (MaxJobs && cupsArrayCount(Jobs) >= MaxJobs) + cupsdCleanJobs(); + + if (MaxJobs && cupsArrayCount(Jobs) >= MaxJobs) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Too many active jobs.")); + return (NULL); + } + + if ((i = check_quotas(con, printer)) < 0) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Quota limit reached.")); + return (NULL); + } + else if (i == 0) + { + send_ipp_status(con, IPP_NOT_AUTHORIZED, _("Not allowed to print.")); + return (NULL); + } + + /* + * Create the job and set things up... + */ + + if ((attr = ippFindAttribute(con->request, "job-priority", + IPP_TAG_INTEGER)) != NULL) + priority = attr->values[0].integer; + else + { + if ((val = cupsGetOption("job-priority", printer->num_options, + printer->options)) != NULL) + priority = atoi(val); + else + priority = 50; + + ippAddInteger(con->request, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority", + priority); + } + + if (!ippFindAttribute(con->request, "job-name", IPP_TAG_NAME)) + ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_NAME, "job-name", NULL, + "Untitled"); + + if ((job = cupsdAddJob(priority, printer->name)) == NULL) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("Unable to add job for destination \"%s\"."), + printer->name); + return (NULL); + } + + job->dtype = printer->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_REMOTE); + job->attrs = con->request; + job->dirty = 1; + con->request = ippNewRequest(job->attrs->request.op.operation_id); + + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + + add_job_uuid(job); + apply_printer_defaults(printer, job); + + attr = ippFindAttribute(job->attrs, "requesting-user-name", IPP_TAG_NAME); + + if (con->username[0]) + { + cupsdSetString(&job->username, con->username); + + if (attr) + cupsdSetString(&attr->values[0].string.text, con->username); + } + else if (attr) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "add_job: requesting-user-name=\"%s\"", + attr->values[0].string.text); + + cupsdSetString(&job->username, attr->values[0].string.text); + } + else + cupsdSetString(&job->username, "anonymous"); + + if (!attr) + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, + "job-originating-user-name", NULL, job->username); + else + { + attr->group_tag = IPP_TAG_JOB; + _cupsStrFree(attr->name); + attr->name = _cupsStrAlloc("job-originating-user-name"); + } + + if (con->username[0] || auth_info) + { + save_auth_info(con, job, auth_info); + + /* + * Remove the auth-info attribute from the attribute data... + */ + + if (auth_info) + ippDeleteAttribute(job->attrs, auth_info); + } + + if ((attr = ippFindAttribute(job->attrs, "job-originating-host-name", + IPP_TAG_ZERO)) != NULL) + { + /* + * Request contains a job-originating-host-name attribute; validate it... + */ + + if (attr->value_tag != IPP_TAG_NAME || + attr->num_values != 1 || + strcmp(con->http.hostname, "localhost")) + { + /* + * Can't override the value if we aren't connected via localhost. + * Also, we can only have 1 value and it must be a name value. + */ + + switch (attr->value_tag) + { + case IPP_TAG_STRING : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + /* + * Free old strings... + */ + + for (i = 0; i < attr->num_values; i ++) + { + _cupsStrFree(attr->values[i].string.text); + attr->values[i].string.text = NULL; + if (attr->values[i].string.charset) + { + _cupsStrFree(attr->values[i].string.charset); + attr->values[i].string.charset = NULL; + } + } + + default : + break; + } + + /* + * Use the default connection hostname instead... + */ + + attr->value_tag = IPP_TAG_NAME; + attr->num_values = 1; + attr->values[0].string.text = _cupsStrAlloc(con->http.hostname); + } + + attr->group_tag = IPP_TAG_JOB; + } + else + { + /* + * No job-originating-host-name attribute, so use the hostname from + * the connection... + */ + + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, + "job-originating-host-name", NULL, con->http.hostname); + } + + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "time-at-creation", + time(NULL)); + attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, + "time-at-processing", 0); + attr->value_tag = IPP_TAG_NOVALUE; + attr = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, + "time-at-completed", 0); + attr->value_tag = IPP_TAG_NOVALUE; + + /* + * Add remaining job attributes... + */ + + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); + job->state = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_ENUM, + "job-state", IPP_JOB_STOPPED); + job->state_value = (ipp_jstate_t)job->state->values[0].integer; + job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, + "job-media-sheets-completed", 0); + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", NULL, + printer->uri); + + if ((attr = ippFindAttribute(job->attrs, "job-k-octets", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer = 0; + else + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-k-octets", 0); + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + if (!attr) + { + if ((val = cupsGetOption("job-hold-until", printer->num_options, + printer->options)) == NULL) + val = "no-hold"; + + attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-hold-until", NULL, val); + } + if (attr && strcmp(attr->values[0].string.text, "no-hold")) + { + /* + * Hold job until specified time... + */ + + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); + + job->state->values[0].integer = IPP_JOB_HELD; + job->state_value = IPP_JOB_HELD; + } + else if (job->attrs->request.op.operation_id == IPP_CREATE_JOB) + { + job->hold_until = time(NULL) + MultipleOperationTimeout; + job->state->values[0].integer = IPP_JOB_HELD; + job->state_value = IPP_JOB_HELD; + } + else + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + + if (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) || + Classification) + { + /* + * Add job sheets options... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-sheets", + IPP_TAG_ZERO)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Adding default job-sheets values \"%s,%s\"...", + printer->job_sheets[0], printer->job_sheets[1]); + + attr = ippAddStrings(job->attrs, IPP_TAG_JOB, IPP_TAG_NAME, "job-sheets", + 2, NULL, NULL); + attr->values[0].string.text = _cupsStrRetain(printer->job_sheets[0]); + attr->values[1].string.text = _cupsStrRetain(printer->job_sheets[1]); + } + + job->job_sheets = attr; + + /* + * Enforce classification level if set... + */ + + if (Classification) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Classification=\"%s\", ClassifyOverride=%d", + Classification ? Classification : "(null)", + ClassifyOverride); + + if (ClassifyOverride) + { + if (!strcmp(attr->values[0].string.text, "none") && + (attr->num_values == 1 || + !strcmp(attr->values[1].string.text, "none"))) + { + /* + * Force the leading banner to have the classification on it... + */ + + cupsdSetString(&attr->values[0].string.text, Classification); + + cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED " + "job-sheets=\"%s,none\", " + "job-originating-user-name=\"%s\"", + Classification, job->username); + } + else if (attr->num_values == 2 && + strcmp(attr->values[0].string.text, + attr->values[1].string.text) && + strcmp(attr->values[0].string.text, "none") && + strcmp(attr->values[1].string.text, "none")) + { + /* + * Can't put two different security markings on the same document! + */ + + cupsdSetString(&attr->values[1].string.text, attr->values[0].string.text); + + cupsdLogJob(job, CUPSD_LOG_NOTICE, "CLASSIFICATION FORCED " + "job-sheets=\"%s,%s\", " + "job-originating-user-name=\"%s\"", + attr->values[0].string.text, + attr->values[1].string.text, job->username); + } + else if (strcmp(attr->values[0].string.text, Classification) && + strcmp(attr->values[0].string.text, "none") && + (attr->num_values == 1 || + (strcmp(attr->values[1].string.text, Classification) && + strcmp(attr->values[1].string.text, "none")))) + { + if (attr->num_values == 1) + cupsdLogJob(job, CUPSD_LOG_NOTICE, + "CLASSIFICATION OVERRIDDEN " + "job-sheets=\"%s\", " + "job-originating-user-name=\"%s\"", + attr->values[0].string.text, job->username); + else + cupsdLogJob(job, CUPSD_LOG_NOTICE, + "CLASSIFICATION OVERRIDDEN " + "job-sheets=\"%s,%s\",fffff " + "job-originating-user-name=\"%s\"", + attr->values[0].string.text, + attr->values[1].string.text, job->username); + } + } + else if (strcmp(attr->values[0].string.text, Classification) && + (attr->num_values == 1 || + strcmp(attr->values[1].string.text, Classification))) + { + /* + * Force the banner to have the classification on it... + */ + + if (attr->num_values > 1 && + !strcmp(attr->values[0].string.text, attr->values[1].string.text)) + { + cupsdSetString(&(attr->values[0].string.text), Classification); + cupsdSetString(&(attr->values[1].string.text), Classification); + } + else + { + if (attr->num_values == 1 || + strcmp(attr->values[0].string.text, "none")) + cupsdSetString(&(attr->values[0].string.text), Classification); + + if (attr->num_values > 1 && + strcmp(attr->values[1].string.text, "none")) + cupsdSetString(&(attr->values[1].string.text), Classification); + } + + if (attr->num_values > 1) + cupsdLogJob(job, CUPSD_LOG_NOTICE, + "CLASSIFICATION FORCED " + "job-sheets=\"%s,%s\", " + "job-originating-user-name=\"%s\"", + attr->values[0].string.text, + attr->values[1].string.text, job->username); + else + cupsdLogJob(job, CUPSD_LOG_NOTICE, + "CLASSIFICATION FORCED " + "job-sheets=\"%s\", " + "job-originating-user-name=\"%s\"", + Classification, job->username); + } + } + + /* + * See if we need to add the starting sheet... + */ + + if (!(printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT))) + { + cupsdLogJob(job, CUPSD_LOG_INFO, "Adding start banner page \"%s\".", + attr->values[0].string.text); + + if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0) + { + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Aborting job because the start banner could not be " + "copied."); + return (NULL); + } + + cupsdUpdateQuota(printer, job->username, 0, kbytes); + } + } + else if ((attr = ippFindAttribute(job->attrs, "job-sheets", + IPP_TAG_ZERO)) != NULL) + job->job_sheets = attr; + + /* + * Fill in the response info... + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + con->servername, con->serverport, "/jobs/%d", job->id); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, + job_uri); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", + job->state_value); + add_job_state_reasons(con, job); + + con->response->request.status.status_code = IPP_OK; + + /* + * Add any job subscriptions... + */ + + add_job_subscriptions(con, job); + + /* + * Set all but the first two attributes to the job attributes group... + */ + + for (attr = job->attrs->attrs->next->next; attr; attr = attr->next) + attr->group_tag = IPP_TAG_JOB; + + /* + * Fire the "job created" event... + */ + + cupsdAddEvent(CUPSD_EVENT_JOB_CREATED, printer, job, "Job created."); + + /* + * Return the new job... + */ + + return (job); +} + + +/* + * 'add_job_state_reasons()' - Add the "job-state-reasons" attribute based + * upon the job and printer state... + */ + +static void +add_job_state_reasons( + cupsd_client_t *con, /* I - Client connection */ + cupsd_job_t *job) /* I - Job info */ +{ + cupsd_printer_t *dest; /* Destination printer */ + ipp_attribute_t *attr; /* job-hold attribute */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_job_state_reasons(%p[%d], %d)", + con, con->http.fd, job ? job->id : 0); + + switch (job ? job->state_value : IPP_JOB_CANCELED) + { + case IPP_JOB_PENDING : + dest = cupsdFindDest(job->dest); + + if (dest && dest->state == IPP_PRINTER_STOPPED) + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "printer-stopped"); + else + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "none"); + break; + + case IPP_JOB_HELD : + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (!attr || strcmp(attr->values[0].string.text, "no-hold")) + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-hold-until-specified"); + else + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-incoming"); + break; + + case IPP_JOB_PROCESSING : + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-printing"); + break; + + case IPP_JOB_STOPPED : + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-stopped"); + break; + + case IPP_JOB_CANCELED : + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-canceled-by-user"); + break; + + case IPP_JOB_ABORTED : + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "aborted-by-system"); + break; + + case IPP_JOB_COMPLETED : + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-state-reasons", NULL, "job-completed-successfully"); + break; + } +} + + +/* + * 'add_job_subscriptions()' - Add any subscriptions for a job. + */ + +static void +add_job_subscriptions( + cupsd_client_t *con, /* I - Client connection */ + cupsd_job_t *job) /* I - Newly created job */ +{ + int i; /* Looping var */ + ipp_attribute_t *prev, /* Previous attribute */ + *next, /* Next attribute */ + *attr; /* Current attribute */ + cupsd_subscription_t *sub; /* Subscription object */ + const char *recipient, /* notify-recipient-uri */ + *pullmethod; /* notify-pull-method */ + ipp_attribute_t *user_data; /* notify-user-data */ + int interval; /* notify-time-interval */ + unsigned mask; /* notify-events */ + + + /* + * Find the first subscription group attribute; return if we have + * none... + */ + + for (attr = job->attrs->attrs; attr; attr = attr->next) + if (attr->group_tag == IPP_TAG_SUBSCRIPTION) + break; + + if (!attr) + return; + + /* + * Process the subscription attributes in the request... + */ + + while (attr) + { + recipient = NULL; + pullmethod = NULL; + user_data = NULL; + interval = 0; + mask = CUPSD_EVENT_NONE; + + while (attr && attr->group_tag != IPP_TAG_ZERO) + { + if (!strcmp(attr->name, "notify-recipient-uri") && + attr->value_tag == IPP_TAG_URI) + { + /* + * Validate the recipient scheme against the ServerBin/notifier + * directory... + */ + + char notifier[1024], /* Notifier filename */ + scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + userpass[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + + + recipient = attr->values[0].string.text; + + if (httpSeparateURI(HTTP_URI_CODING_ALL, recipient, + scheme, sizeof(scheme), userpass, sizeof(userpass), + host, sizeof(host), &port, + resource, sizeof(resource)) < HTTP_URI_OK) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-recipient-uri \"%s\"."), recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + + snprintf(notifier, sizeof(notifier), "%s/notifier/%s", ServerBin, + scheme); + if (access(notifier, X_OK)) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("notify-recipient-uri URI \"%s\" uses unknown " + "scheme."), recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + + if (!strcmp(scheme, "rss") && !check_rss_recipient(recipient)) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("notify-recipient-uri URI \"%s\" is already used."), + recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_ATTRIBUTES); + return; + } + } + else if (!strcmp(attr->name, "notify-pull-method") && + attr->value_tag == IPP_TAG_KEYWORD) + { + pullmethod = attr->values[0].string.text; + + if (strcmp(pullmethod, "ippget")) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-pull-method \"%s\"."), pullmethod); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_ATTRIBUTES); + return; + } + } + else if (!strcmp(attr->name, "notify-charset") && + attr->value_tag == IPP_TAG_CHARSET && + strcmp(attr->values[0].string.text, "us-ascii") && + strcmp(attr->values[0].string.text, "utf-8")) + { + send_ipp_status(con, IPP_CHARSET, + _("Character set \"%s\" not supported."), + attr->values[0].string.text); + return; + } + else if (!strcmp(attr->name, "notify-natural-language") && + (attr->value_tag != IPP_TAG_LANGUAGE || + strcmp(attr->values[0].string.text, DefaultLanguage))) + { + send_ipp_status(con, IPP_CHARSET, + _("Language \"%s\" not supported."), + attr->values[0].string.text); + return; + } + else if (!strcmp(attr->name, "notify-user-data") && + attr->value_tag == IPP_TAG_STRING) + { + if (attr->num_values > 1 || attr->values[0].unknown.length > 63) + { + send_ipp_status(con, IPP_REQUEST_VALUE, + _("The notify-user-data value is too large " + "(%d > 63 octets)."), + attr->values[0].unknown.length); + return; + } + + user_data = attr; + } + else if (!strcmp(attr->name, "notify-events") && + attr->value_tag == IPP_TAG_KEYWORD) + { + for (i = 0; i < attr->num_values; i ++) + mask |= cupsdEventValue(attr->values[i].string.text); + } + else if (!strcmp(attr->name, "notify-lease-duration")) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("The notify-lease-duration attribute cannot be " + "used with job subscriptions.")); + return; + } + else if (!strcmp(attr->name, "notify-time-interval") && + attr->value_tag == IPP_TAG_INTEGER) + interval = attr->values[0].integer; + + attr = attr->next; + } + + if (!recipient && !pullmethod) + break; + + if (mask == CUPSD_EVENT_NONE) + mask = CUPSD_EVENT_JOB_COMPLETED; + + if ((sub = cupsdAddSubscription(mask, cupsdFindDest(job->dest), job, + recipient, 0)) != NULL) + { + sub->interval = interval; + + cupsdSetString(&sub->owner, job->username); + + if (user_data) + { + sub->user_data_len = user_data->values[0].unknown.length; + memcpy(sub->user_data, user_data->values[0].unknown.data, + sub->user_data_len); + } + + ippAddSeparator(con->response); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-subscription-id", sub->id); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added subscription %d for job %d", + sub->id, job->id); + } + + if (attr) + attr = attr->next; + } + + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); + + /* + * Remove all of the subscription attributes from the job request... + * + * TODO: Optimize this since subscription groups have to come at the + * end of the request... + */ + + for (attr = job->attrs->attrs, prev = NULL; attr; attr = next) + { + next = attr->next; + + if (attr->group_tag == IPP_TAG_SUBSCRIPTION || + attr->group_tag == IPP_TAG_ZERO) + { + /* + * Free and remove this attribute... + */ + + _ippFreeAttr(attr); + + if (prev) + prev->next = next; + else + job->attrs->attrs = next; + } + else + prev = attr; + } + + job->attrs->last = prev; + job->attrs->current = prev; +} + + +/* + * 'add_job_uuid()' - Add job-uuid attribute to a job. + * + * See RFC 4122 for the definition of UUIDs and the format. + */ + +static void +add_job_uuid(cupsd_job_t *job) /* I - Job */ +{ + char uuid[64]; /* job-uuid string */ + + + /* + * Add a job-uuid attribute if none exists... + */ + + if (!ippFindAttribute(job->attrs, "job-uuid", IPP_TAG_URI)) + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, "job-uuid", NULL, + _httpAssembleUUID(ServerName, RemotePort, job->dest, job->id, + uuid, sizeof(uuid))); +} + + +/* + * 'add_printer()' - Add a printer to the system. + */ + +static void +add_printer(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - URI of printer */ +{ + http_status_t status; /* Policy status */ + int i; /* Looping var */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_printer_t *printer; /* Printer/class */ + ipp_attribute_t *attr; /* Printer attribute */ + cups_file_t *fp; /* Script/PPD file */ + char line[1024]; /* Line from file... */ + char srcfile[1024], /* Source Script/PPD file */ + dstfile[1024]; /* Destination Script/PPD file */ + int modify; /* Non-zero if we are modifying */ + char newname[IPP_MAX_NAME]; /* New printer name */ + int changed_driver, /* Changed the PPD/interface script? */ + need_restart_job, /* Need to restart job? */ + set_device_uri, /* Did we set the device URI? */ + set_port_monitor; /* Did we set the port monitor? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Do we have a valid URI? + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/printers/", 10) || strlen(resource) == 10) + { + /* + * No, return an error... + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("The printer-uri must be of the form " + "\"ipp://HOSTNAME/printers/PRINTERNAME\".")); + return; + } + + /* + * Do we have a valid printer name? + */ + + if (!validate_name(resource + 10)) + { + /* + * No, return an error... + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("The printer-uri \"%s\" contains invalid characters."), + uri->values[0].string.text); + return; + } + + /* + * See if the printer already exists; if not, create a new printer... + */ + + if ((printer = cupsdFindPrinter(resource + 10)) == NULL) + { + /* + * Printer doesn't exist; see if we have a class of the same name... + */ + + if ((printer = cupsdFindClass(resource + 10)) != NULL && + !(printer->type & CUPS_PRINTER_DISCOVERED)) + { + /* + * Yes, return an error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("A class named \"%s\" already exists."), + resource + 10); + return; + } + + /* + * No, check the default policy then add the printer... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + printer = cupsdAddPrinter(resource + 10); + modify = 0; + } + else if (printer->type & CUPS_PRINTER_IMPLICIT) + { + /* + * Check the default policy, then rename the implicit printer to + * "AnyPrinter" or delete it... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + if (ImplicitAnyClasses) + { + snprintf(newname, sizeof(newname), "Any%s", resource + 10); + cupsdRenamePrinter(printer, newname); + } + else + cupsdDeletePrinter(printer, 1); + + /* + * Add the printer as a new local printer... + */ + + printer = cupsdAddPrinter(resource + 10); + modify = 0; + } + else if (printer->type & CUPS_PRINTER_DISCOVERED) + { + /* + * Check the default policy, then rename the remote printer to + * "Printer@server"... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + snprintf(newname, sizeof(newname), "%s@%s", resource + 10, + printer->hostname); + cupsdRenamePrinter(printer, newname); + + /* + * Add the printer as a new local printer... + */ + + printer = cupsdAddPrinter(resource + 10); + modify = 0; + } + else if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, + NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + else + modify = 1; + + /* + * Look for attributes and copy them over as needed... + */ + + changed_driver = 0; + need_restart_job = 0; + + if ((attr = ippFindAttribute(con->request, "printer-location", + IPP_TAG_TEXT)) != NULL) + cupsdSetString(&printer->location, attr->values[0].string.text); + + if ((attr = ippFindAttribute(con->request, "printer-info", + IPP_TAG_TEXT)) != NULL) + cupsdSetString(&printer->info, attr->values[0].string.text); + + set_device_uri = 0; + + if ((attr = ippFindAttribute(con->request, "device-uri", + IPP_TAG_URI)) != NULL) + { + /* + * Do we have a valid device URI? + */ + + http_uri_status_t uri_status; /* URI separation status */ + char old_device_uri[1024]; + /* Old device URI */ + + + need_restart_job = 1; + + uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, + attr->values[0].string.text, + scheme, sizeof(scheme), + username, sizeof(username), + host, sizeof(host), &port, + resource, sizeof(resource)); + + if (uri_status < HTTP_URI_OK) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad device-uri \"%s\"."), + attr->values[0].string.text); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "add_printer: httpSeparateURI returned %d", uri_status); + return; + } + + if (!strcmp(scheme, "file")) + { + /* + * See if the administrator has enabled file devices... + */ + + if (!FileDevice && strcmp(resource, "/dev/null")) + { + /* + * File devices are disabled and the URL is not file:/dev/null... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("File device URIs have been disabled. " + "To enable, see the FileDevice directive in " + "\"%s/cupsd.conf\"."), + ServerRoot); + return; + } + } + else + { + /* + * See if the backend exists and is executable... + */ + + snprintf(srcfile, sizeof(srcfile), "%s/backend/%s", ServerBin, scheme); + if (access(srcfile, X_OK)) + { + /* + * Could not find device in list! + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad device-uri scheme \"%s\"."), scheme); + return; + } + } + + if (printer->sanitized_device_uri) + strlcpy(old_device_uri, printer->sanitized_device_uri, + sizeof(old_device_uri)); + else + old_device_uri[0] = '\0'; + + cupsdSetDeviceURI(printer, attr->values[0].string.text); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s device-uri to \"%s\" (was \"%s\".)", + printer->name, printer->sanitized_device_uri, + old_device_uri); + + set_device_uri = 1; + } + + set_port_monitor = 0; + + if ((attr = ippFindAttribute(con->request, "port-monitor", + IPP_TAG_NAME)) != NULL) + { + ipp_attribute_t *supported; /* port-monitor-supported attribute */ + + + need_restart_job = 1; + + supported = ippFindAttribute(printer->ppd_attrs, "port-monitor-supported", + IPP_TAG_NAME); + if (supported) + { + for (i = 0; i < supported->num_values; i ++) + if (!strcmp(supported->values[i].string.text, + attr->values[0].string.text)) + break; + } + + if (!supported || i >= supported->num_values) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Bad port-monitor \"%s\"."), + attr->values[0].string.text); + return; + } + + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s port-monitor to \"%s\" (was \"%s\".)", + printer->name, attr->values[0].string.text, + printer->port_monitor ? printer->port_monitor : "none"); + + if (strcmp(attr->values[0].string.text, "none")) + cupsdSetString(&printer->port_monitor, attr->values[0].string.text); + else + cupsdClearString(&printer->port_monitor); + + set_port_monitor = 1; + } + + if ((attr = ippFindAttribute(con->request, "printer-is-accepting-jobs", + IPP_TAG_BOOLEAN)) != NULL && + attr->values[0].boolean != printer->accepting) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s printer-is-accepting-jobs to %d (was %d.)", + printer->name, attr->values[0].boolean, printer->accepting); + + printer->accepting = attr->values[0].boolean; + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, + "%s accepting jobs.", + printer->accepting ? "Now" : "No longer"); + } + + if ((attr = ippFindAttribute(con->request, "printer-is-shared", + IPP_TAG_BOOLEAN)) != NULL) + { + if (attr->values[0].boolean && + printer->num_auth_info_required == 1 && + !strcmp(printer->auth_info_required[0], "negotiate")) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Cannot share a remote Kerberized printer.")); + return; + } + + if (printer->shared && !attr->values[0].boolean) + cupsdDeregisterPrinter(printer, 1); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s printer-is-shared to %d (was %d.)", + printer->name, attr->values[0].boolean, printer->shared); + + printer->shared = attr->values[0].boolean; + } + + if ((attr = ippFindAttribute(con->request, "printer-state", + IPP_TAG_ENUM)) != NULL) + { + if (attr->values[0].integer != IPP_PRINTER_IDLE && + attr->values[0].integer != IPP_PRINTER_STOPPED) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad printer-state value %d."), + attr->values[0].integer); + return; + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Setting %s printer-state to %d (was %d.)", + printer->name, attr->values[0].integer, printer->state); + + if (attr->values[0].integer == IPP_PRINTER_STOPPED) + cupsdStopPrinter(printer, 0); + else + { + need_restart_job = 1; + cupsdSetPrinterState(printer, (ipp_pstate_t)(attr->values[0].integer), 0); + } + } + + if ((attr = ippFindAttribute(con->request, "printer-state-message", + IPP_TAG_TEXT)) != NULL) + { + strlcpy(printer->state_message, attr->values[0].string.text, + sizeof(printer->state_message)); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, "%s", + printer->state_message); + } + + if ((attr = ippFindAttribute(con->request, "printer-state-reasons", + IPP_TAG_KEYWORD)) != NULL) + { + if (attr->num_values > + (int)(sizeof(printer->reasons) / sizeof(printer->reasons[0]))) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Too many printer-state-reasons values (%d > %d)."), + attr->num_values, + (int)(sizeof(printer->reasons) / + sizeof(printer->reasons[0]))); + return; + } + + for (i = 0; i < printer->num_reasons; i ++) + _cupsStrFree(printer->reasons[i]); + + printer->num_reasons = 0; + for (i = 0; i < attr->num_values; i ++) + { + if (!strcmp(attr->values[i].string.text, "none")) + continue; + + printer->reasons[printer->num_reasons] = + _cupsStrRetain(attr->values[i].string.text); + printer->num_reasons ++; + + if (!strcmp(attr->values[i].string.text, "paused") && + printer->state != IPP_PRINTER_STOPPED) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s printer-state to %d (was %d.)", + printer->name, IPP_PRINTER_STOPPED, printer->state); + cupsdStopPrinter(printer, 0); + } + } + + if (PrintcapFormat == PRINTCAP_PLIST) + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, + "Printer \"%s\" state changed.", printer->name); + } + + set_printer_defaults(con, printer); + + if ((attr = ippFindAttribute(con->request, "auth-info-required", + IPP_TAG_KEYWORD)) != NULL) + cupsdSetAuthInfoRequired(printer, NULL, attr); + + /* + * See if we have all required attributes... + */ + + if (!printer->device_uri) + cupsdSetString(&printer->device_uri, "file:///dev/null"); + + /* + * See if we have an interface script or PPD file attached to the request... + */ + + if (con->filename) + { + need_restart_job = 1; + changed_driver = 1; + + strlcpy(srcfile, con->filename, sizeof(srcfile)); + + if ((fp = cupsFileOpen(srcfile, "rb"))) + { + /* + * Yes; get the first line from it... + */ + + line[0] = '\0'; + cupsFileGets(fp, line, sizeof(line)); + cupsFileClose(fp); + + /* + * Then see what kind of file it is... + */ + + snprintf(dstfile, sizeof(dstfile), "%s/interfaces/%s", ServerRoot, + printer->name); + + if (!strncmp(line, "*PPD-Adobe", 10)) + { + /* + * The new file is a PPD file, so remove any old interface script + * that might be lying around... + */ + + unlink(dstfile); + } + else + { + /* + * This must be an interface script, so move the file over to the + * interfaces directory and make it executable... + */ + + if (copy_file(srcfile, dstfile)) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("Unable to copy interface script - %s"), + strerror(errno)); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Copied interface script successfully"); + chmod(dstfile, 0755); + } + + snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + + if (!strncmp(line, "*PPD-Adobe", 10)) + { + /* + * The new file is a PPD file, so move the file over to the + * ppd directory and make it readable by all... + */ + + if (copy_file(srcfile, dstfile)) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("Unable to copy PPD file - %s"), + strerror(errno)); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Copied PPD file successfully"); + chmod(dstfile, 0644); + } + else + { + /* + * This must be an interface script, so remove any old PPD file that + * may be lying around... + */ + + unlink(dstfile); + } + } + } + else if ((attr = ippFindAttribute(con->request, "ppd-name", + IPP_TAG_NAME)) != NULL) + { + need_restart_job = 1; + changed_driver = 1; + + if (!strcmp(attr->values[0].string.text, "raw")) + { + /* + * Raw driver, remove any existing PPD or interface script files. + */ + + snprintf(dstfile, sizeof(dstfile), "%s/interfaces/%s", ServerRoot, + printer->name); + unlink(dstfile); + + snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + unlink(dstfile); + } + else + { + /* + * PPD model file... + */ + + snprintf(dstfile, sizeof(dstfile), "%s/interfaces/%s", ServerRoot, + printer->name); + unlink(dstfile); + + snprintf(dstfile, sizeof(dstfile), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + + if (copy_model(con, attr->values[0].string.text, dstfile)) + { + send_ipp_status(con, IPP_INTERNAL_ERROR, _("Unable to copy PPD file.")); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Copied PPD file successfully"); + chmod(dstfile, 0644); + } + } + + if (changed_driver) + { + /* + * If we changed the PPD/interface script, then remove the printer's cache + * file and clear the printer-state-reasons... + */ + + char cache_name[1024]; /* Cache filename for printer attrs */ + + snprintf(cache_name, sizeof(cache_name), "%s/%s.data", CacheDir, + printer->name); + unlink(cache_name); + + cupsdSetPrinterReasons(printer, "none"); + + /* + * (Re)register color profiles... + */ + + if (!RunUser) + { + cupsdCmsRegisterPrinter(printer); +#ifdef __APPLE__ + /* + * FIXME: ideally the ColorSync stuff would be moved to colorsync.c + * and the colorsyncRegisterProfiles() would be called from + * cupsdCmsRegisterPrinter() in printers.c + */ + apple_unregister_profiles(printer); + apple_register_profiles(printer); +#endif /* __APPLE__ */ + } + } + + /* + * If we set the device URI but not the port monitor, check which port + * monitor to use by default... + */ + + if (set_device_uri && !set_port_monitor) + { + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *ppdattr; /* cupsPortMonitor attribute */ + + + httpSeparateURI(HTTP_URI_CODING_ALL, printer->device_uri, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + snprintf(srcfile, sizeof(srcfile), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + if ((ppd = ppdOpenFile(srcfile)) != NULL) + { + for (ppdattr = ppdFindAttr(ppd, "cupsPortMonitor", NULL); + ppdattr; + ppdattr = ppdFindNextAttr(ppd, "cupsPortMonitor", NULL)) + if (!strcmp(scheme, ppdattr->spec)) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Setting %s port-monitor to \"%s\" (was \"%s\".)", + printer->name, ppdattr->value, + printer->port_monitor ? printer->port_monitor + : "none"); + + if (strcmp(ppdattr->value, "none")) + cupsdSetString(&printer->port_monitor, ppdattr->value); + else + cupsdClearString(&printer->port_monitor); + + break; + } + + ppdClose(ppd); + } + } + + /* + * Update the printer attributes and return... + */ + + cupsdSetPrinterAttrs(printer); + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + if (need_restart_job && printer->job) + { + /* + * Restart the current job... + */ + + cupsdSetJobState(printer->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + "Job restarted because the printer was modified."); + } + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + + if (modify) + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_MODIFIED, + printer, NULL, "Printer \"%s\" modified by \"%s\".", + printer->name, get_username(con)); + + cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" modified by \"%s\".", + printer->name, get_username(con)); + } + else + { + cupsdAddEvent(CUPSD_EVENT_PRINTER_ADDED, + printer, NULL, "New printer \"%s\" added by \"%s\".", + printer->name, get_username(con)); + + cupsdLogMessage(CUPSD_LOG_INFO, "New printer \"%s\" added by \"%s\".", + printer->name, get_username(con)); + } + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'add_printer_state_reasons()' - Add the "printer-state-reasons" attribute + * based upon the printer state... + */ + +static void +add_printer_state_reasons( + cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *p) /* I - Printer info */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_state_reasons(%p[%d], %p[%s])", + con, con->http.fd, p, p->name); + + if (p->num_reasons == 0) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "printer-state-reasons", NULL, "none"); + else + ippAddStrings(con->response, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "printer-state-reasons", p->num_reasons, NULL, + (const char * const *)p->reasons); +} + + +/* + * 'add_queued_job_count()' - Add the "queued-job-count" attribute for + * the specified printer or class. + */ + +static void +add_queued_job_count( + cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *p) /* I - Printer or class */ +{ + int count; /* Number of jobs on destination */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_queued_job_count(%p[%d], %p[%s])", + con, con->http.fd, p, p->name); + + count = cupsdGetPrinterJobCount(p->name); + + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "queued-job-count", count); +} + + +#ifdef __APPLE__ +/* + * 'apple_init_profile()' - Initialize a color profile. + */ + +static void +apple_init_profile( + ppd_file_t *ppd, /* I - PPD file */ + cups_array_t *languages, /* I - Languages in the PPD file */ +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFMutableDictionaryRef profile, /* I - Profile dictionary */ +# else + CMDeviceProfileInfo *profile, /* I - Profile record */ +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + unsigned id, /* I - Profile ID */ + const char *name, /* I - Profile name */ + const char *text, /* I - Profile UI text */ + const char *iccfile) /* I - ICC filename */ +{ +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFURLRef url; /* URL for profile filename */ +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + CFMutableDictionaryRef dict; /* Dictionary for name */ + char *language; /* Current language */ + ppd_attr_t *attr; /* Profile attribute */ + CFStringRef cflang, /* Language string */ + cftext; /* Localized text */ + + + (void)id; + + /* + * Build the profile name dictionary... + */ + + dict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (!dict) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to initialize profile \"%s\".", + iccfile); + return; + } + + cftext = CFStringCreateWithCString(kCFAllocatorDefault, text, + kCFStringEncodingUTF8); + + if (cftext) + { + CFDictionarySetValue(dict, CFSTR("en_US"), cftext); + CFRelease(cftext); + } + + if (languages) + { + /* + * Find localized names for the color profiles... + */ + + cupsArraySave(ppd->sorted_attrs); + + for (language = (char *)cupsArrayFirst(languages); + language; + language = (char *)cupsArrayNext(languages)) + { + if (iccfile) + { + if ((attr = _ppdLocalizedAttr(ppd, "cupsICCProfile", name, + language)) == NULL) + attr = _ppdLocalizedAttr(ppd, "APTiogaProfile", name, language); + } + else + attr = _ppdLocalizedAttr(ppd, "ColorModel", name, language); + + if (attr && attr->text[0]) + { + cflang = CFStringCreateWithCString(kCFAllocatorDefault, language, + kCFStringEncodingUTF8); + cftext = CFStringCreateWithCString(kCFAllocatorDefault, attr->text, + kCFStringEncodingUTF8); + + if (cflang && cftext) + CFDictionarySetValue(dict, cflang, cftext); + + if (cflang) + CFRelease(cflang); + + if (cftext) + CFRelease(cftext); + } + } + + cupsArrayRestore(ppd->sorted_attrs); + } + + /* + * Fill in the profile data... + */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + if (iccfile) + { + url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, + (const UInt8 *)iccfile, + strlen(iccfile), false); + + if (url) + { + CFDictionarySetValue(profile, kColorSyncDeviceProfileURL, url); + CFRelease(url); + } + } + + CFDictionarySetValue(profile, kColorSyncDeviceModeDescriptions, dict); + CFRelease(dict); + +# else + profile->dataVersion = cmDeviceProfileInfoVersion1; + profile->profileID = id; + profile->profileLoc.locType = iccfile ? cmPathBasedProfile : cmNoProfileBase; + profile->profileName = dict; + + if (iccfile) + strlcpy(profile->profileLoc.u.pathLoc.path, iccfile, + sizeof(profile->profileLoc.u.pathLoc.path)); +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ +} + + +/* + * 'apple_register_profiles()' - Register color profiles for a printer. + */ + +static void +apple_register_profiles( + cupsd_printer_t *p) /* I - Printer */ +{ + int i; /* Looping var */ + char ppdfile[1024], /* PPD filename */ + iccfile[1024], /* ICC filename */ + selector[PPD_MAX_NAME]; + /* Profile selection string */ + ppd_file_t *ppd; /* PPD file */ + ppd_attr_t *attr, /* Profile attributes */ + *profileid_attr,/* cupsProfileID attribute */ + *q1_attr, /* ColorModel (or other) qualifier */ + *q2_attr, /* MediaType (or other) qualifier */ + *q3_attr; /* Resolution (or other) qualifier */ + char q_keyword[PPD_MAX_NAME]; + /* Qualifier keyword */ + const char *q1_choice, /* ColorModel (or other) choice */ + *q2_choice, /* MediaType (or other) choice */ + *q3_choice; /* Resolution (or other) choice */ + const char *profile_key; /* Profile keyword */ + ppd_option_t *cm_option; /* Color model option */ + ppd_choice_t *cm_choice; /* Color model choice */ + int num_profiles; /* Number of profiles */ + OSStatus error = 0; /* Last error */ + unsigned device_id, /* Printer device ID */ + profile_id = 0, /* Profile ID */ + default_profile_id = 0; + /* Default profile ID */ + CFMutableDictionaryRef device_name; /* Printer device name dictionary */ + CFStringRef printer_name; /* Printer name string */ + cups_array_t *languages; /* Languages array */ +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFMutableDictionaryRef profiles, /* Dictionary of profiles */ + profile; /* Current profile info dictionary */ + CFStringRef dict_key; /* Key in factory profile dictionary */ +# else + CMDeviceScope scope = /* Scope of the registration */ + { + kCFPreferencesAnyUser, + kCFPreferencesCurrentHost + }; + CMDeviceProfileArrayPtr profiles; /* Profiles */ + CMDeviceProfileInfo *profile; /* Current profile */ +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + + /* + * Make sure ColorSync is available... + */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + if (ColorSyncRegisterDevice == NULL) + return; + +# else + if (CMRegisterColorDevice == NULL) + return; +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + /* + * Try opening the PPD file for this printer... + */ + + snprintf(ppdfile, sizeof(ppdfile), "%s/ppd/%s.ppd", ServerRoot, p->name); + if ((ppd = ppdOpenFile(ppdfile)) == NULL) + return; + + /* + * See if we have any profiles... + */ + + if ((attr = ppdFindAttr(ppd, "APTiogaProfile", NULL)) != NULL) + profile_key = "APTiogaProfile"; + else + { + attr = ppdFindAttr(ppd, "cupsICCProfile", NULL); + profile_key = "cupsICCProfile"; + } + + for (num_profiles = 0; attr; attr = ppdFindNextAttr(ppd, profile_key, NULL)) + if (attr->spec[0] && attr->value && attr->value[0]) + { + if (attr->value[0] != '/') + snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir, + attr->value); + else + strlcpy(iccfile, attr->value, sizeof(iccfile)); + + if (access(iccfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "%s: ICC Profile \"%s\" does not exist.", p->name, + iccfile); + continue; + } + + num_profiles ++; + } + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + /* + * Create a dictionary for the factory profiles... + */ + + profiles = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (!profiles) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for factory profiles."); + ppdClose(ppd); + return; + } +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + /* + * If we have profiles, add them... + */ + + if (num_profiles > 0) + { + if (profile_key[0] == 'A') + { + /* + * For Tioga PPDs, get the default profile using the DefaultAPTiogaProfile + * attribute... + */ + + if ((attr = ppdFindAttr(ppd, "DefaultAPTiogaProfile", NULL)) != NULL && + attr->value) + default_profile_id = atoi(attr->value); + + q1_choice = q2_choice = q3_choice = NULL; + } + else + { + /* + * For CUPS PPDs, figure out the default profile selector values... + */ + + if ((attr = ppdFindAttr(ppd, "cupsICCQualifier1", NULL)) != NULL && + attr->value && attr->value[0]) + { + snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value); + q1_attr = ppdFindAttr(ppd, q_keyword, NULL); + } + else if ((q1_attr = ppdFindAttr(ppd, "DefaultColorModel", NULL)) == NULL) + q1_attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL); + + if (q1_attr && q1_attr->value && q1_attr->value[0]) + q1_choice = q1_attr->value; + else + q1_choice = ""; + + if ((attr = ppdFindAttr(ppd, "cupsICCQualifier2", NULL)) != NULL && + attr->value && attr->value[0]) + { + snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value); + q2_attr = ppdFindAttr(ppd, q_keyword, NULL); + } + else + q2_attr = ppdFindAttr(ppd, "DefaultMediaType", NULL); + + if (q2_attr && q2_attr->value && q2_attr->value[0]) + q2_choice = q2_attr->value; + else + q2_choice = NULL; + + if ((attr = ppdFindAttr(ppd, "cupsICCQualifier3", NULL)) != NULL && + attr->value && attr->value[0]) + { + snprintf(q_keyword, sizeof(q_keyword), "Default%s", attr->value); + q3_attr = ppdFindAttr(ppd, q_keyword, NULL); + } + else + q3_attr = ppdFindAttr(ppd, "DefaultResolution", NULL); + + if (q3_attr && q3_attr->value && q3_attr->value[0]) + q3_choice = q3_attr->value; + else + q3_choice = NULL; + } + +# ifndef HAVE_COLORSYNCREGISTERDEVICE + /* + * Build the array of profiles... + * + * Note: This calloc actually requests slightly more memory than needed. + */ + + if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for factory profiles."); + ppdClose(ppd); + return; + } + + profiles->profileCount = num_profiles; + profile = profiles->profiles; +# endif /* !HAVE_COLORSYNCREGISTERDEVICE */ + + /* + * Loop through the profiles listed in the PPD... + */ + + languages = _ppdGetLanguages(ppd); + + for (attr = ppdFindAttr(ppd, profile_key, NULL); + attr; + attr = ppdFindNextAttr(ppd, profile_key, NULL)) + if (attr->spec[0] && attr->value && attr->value[0]) + { + /* + * Add this profile... + */ + + if (attr->value[0] != '/') + snprintf(iccfile, sizeof(iccfile), "%s/profiles/%s", DataDir, + attr->value); + else + strlcpy(iccfile, attr->value, sizeof(iccfile)); + + if (_cupsFileCheck(iccfile, _CUPS_FILE_CHECK_FILE, !RunUser, + cupsdLogFCMessage, p)) + continue; + + if (profile_key[0] == 'c') + { + cupsArraySave(ppd->sorted_attrs); + + if ((profileid_attr = ppdFindAttr(ppd, "cupsProfileID", + attr->spec)) != NULL && + profileid_attr->value && isdigit(profileid_attr->value[0] & 255)) + profile_id = (unsigned)strtoul(profileid_attr->value, NULL, 10); + else + profile_id = _ppdHashName(attr->spec); + + cupsArrayRestore(ppd->sorted_attrs); + } + else + profile_id = atoi(attr->spec); + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + profile = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (!profile) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for color profile."); + CFRelease(profiles); + ppdClose(ppd); + return; + } + + apple_init_profile(ppd, languages, profile, profile_id, attr->spec, + attr->text[0] ? attr->text : attr->spec, iccfile); + + dict_key = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, + CFSTR("%u"), profile_id); + if (dict_key) + { + CFDictionarySetValue(profiles, dict_key, profile); + CFRelease(dict_key); + } + + CFRelease(profile); + +# else + apple_init_profile(ppd, languages, profile, profile_id, attr->spec, + attr->text[0] ? attr->text : attr->spec, iccfile); + + profile ++; +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + /* + * See if this is the default profile... + */ + + if (!default_profile_id && q1_choice && q2_choice && q3_choice) + { + snprintf(selector, sizeof(selector), "%s.%s.%s", q1_choice, q2_choice, + q3_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q1_choice && q2_choice) + { + snprintf(selector, sizeof(selector), "%s.%s.", q1_choice, q2_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q1_choice && q3_choice) + { + snprintf(selector, sizeof(selector), "%s..%s", q1_choice, q3_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q1_choice) + { + snprintf(selector, sizeof(selector), "%s..", q1_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q2_choice && q3_choice) + { + snprintf(selector, sizeof(selector), ".%s.%s", q2_choice, q3_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q2_choice) + { + snprintf(selector, sizeof(selector), ".%s.", q2_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + + if (!default_profile_id && q3_choice) + { + snprintf(selector, sizeof(selector), "..%s", q3_choice); + if (!strcmp(selector, attr->spec)) + default_profile_id = profile_id; + } + } + + _ppdFreeLanguages(languages); + } + else if ((cm_option = ppdFindOption(ppd, "ColorModel")) != NULL) + { + /* + * Extract profiles from ColorModel option... + */ + + const char *profile_name; /* Name of generic profile */ + + + num_profiles = cm_option->num_choices; + +# ifndef HAVE_COLORSYNCREGISTERDEVICE + /* + * Create an array for the factory profiles... + */ + + if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for factory profiles."); + ppdClose(ppd); + return; + } + + profiles->profileCount = num_profiles; + profile = profiles->profiles; +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + for (i = cm_option->num_choices, cm_choice = cm_option->choices; + i > 0; + i --, cm_choice ++) + { + if (!strcmp(cm_choice->choice, "Gray") || + !strcmp(cm_choice->choice, "Black")) + profile_name = "Gray"; + else if (!strcmp(cm_choice->choice, "RGB") || + !strcmp(cm_choice->choice, "CMY")) + profile_name = "RGB"; + else if (!strcmp(cm_choice->choice, "CMYK") || + !strcmp(cm_choice->choice, "KCMY")) + profile_name = "CMYK"; + else + profile_name = "DeviceN"; + + snprintf(selector, sizeof(selector), "%s..", profile_name); + profile_id = _ppdHashName(selector); + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + profile = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + if (!profile) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for color profile."); + CFRelease(profiles); + ppdClose(ppd); + return; + } + + apple_init_profile(ppd, NULL, profile, profile_id, cm_choice->choice, + cm_choice->text, NULL); + + dict_key = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, + CFSTR("%u"), profile_id); + if (dict_key) + { + CFDictionarySetValue(profiles, dict_key, profile); + CFRelease(dict_key); + } + + CFRelease(profile); + +# else + apple_init_profile(ppd, NULL, profile, profile_id, cm_choice->choice, + cm_choice->text, NULL); + profile ++; +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + if (cm_choice->marked) + default_profile_id = profile_id; + } + } + else + { + /* + * Use the default colorspace... + */ + + attr = ppdFindAttr(ppd, "DefaultColorSpace", NULL); + + num_profiles = (attr && ppd->colorspace == PPD_CS_GRAY) ? 1 : 2; + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + /* + * Add the grayscale profile first. We always have a grayscale profile. + */ + + profile = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (!profile) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for color profile."); + CFRelease(profiles); + ppdClose(ppd); + return; + } + + profile_id = _ppdHashName("Gray.."); + apple_init_profile(ppd, NULL, profile, profile_id, "Gray", "Gray", NULL); + + dict_key = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%u"), + profile_id); + if (dict_key) + { + CFDictionarySetValue(profiles, dict_key, profile); + CFRelease(dict_key); + } + + CFRelease(profile); + + /* + * Then add the RGB/CMYK/DeviceN color profile... + */ + + profile = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + + if (!profile) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for color profile."); + CFRelease(profiles); + ppdClose(ppd); + return; + } + + switch (ppd->colorspace) + { + default : + case PPD_CS_RGB : + case PPD_CS_CMY : + profile_id = _ppdHashName("RGB.."); + apple_init_profile(ppd, NULL, profile, profile_id, "RGB", "RGB", + NULL); + break; + + case PPD_CS_RGBK : + case PPD_CS_CMYK : + profile_id = _ppdHashName("CMYK.."); + apple_init_profile(ppd, NULL, profile, profile_id, "CMYK", "CMYK", + NULL); + break; + + case PPD_CS_GRAY : + if (attr) + break; + + case PPD_CS_N : + profile_id = _ppdHashName("DeviceN.."); + apple_init_profile(ppd, NULL, profile, profile_id, "DeviceN", + "DeviceN", NULL); + break; + } + + if (CFDictionaryGetCount(profile) > 0) + { + dict_key = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, + CFSTR("%u"), profile_id); + if (dict_key) + { + CFDictionarySetValue(profiles, dict_key, profile); + CFRelease(dict_key); + } + } + + CFRelease(profile); + +# else + /* + * Create an array for the factory profiles... + */ + + if ((profiles = calloc(num_profiles, sizeof(CMDeviceProfileArray))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for factory profiles."); + ppdClose(ppd); + return; + } + + profiles->profileCount = num_profiles; + + /* + * Add the grayscale profile first. We always have a grayscale profile. + */ + + profile_id = _ppdHashName("Gray.."); + apple_init_profile(ppd, NULL, profiles->profiles, profile_id, "Gray", + "Gray", NULL); + + /* + * Then add the RGB/CMYK/DeviceN color profile... + */ + + switch (ppd->colorspace) + { + default : + case PPD_CS_RGB : + case PPD_CS_CMY : + profile_id = _ppdHashName("RGB.."); + apple_init_profile(ppd, NULL, profiles->profiles + 1, profile_id, + "RGB", "RGB", NULL); + break; + case PPD_CS_RGBK : + case PPD_CS_CMYK : + profile_id = _ppdHashName("CMYK.."); + apple_init_profile(ppd, NULL, profiles->profiles + 1, profile_id, + "CMYK", "CMYK", NULL); + break; + + case PPD_CS_GRAY : + if (attr) + break; + + case PPD_CS_N : + profile_id = _ppdHashName("DeviceN.."); + apple_init_profile(ppd, NULL, profiles->profiles + 1, profile_id, + "DeviceN", "DeviceN", NULL); + break; + } +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + } + + if (num_profiles > 0) + { + /* + * Make sure we have a default profile ID... + */ + + if (!default_profile_id) + default_profile_id = profile_id; /* Last profile */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + dict_key = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("%u"), + default_profile_id); + if (dict_key) + { + CFDictionarySetValue(profiles, kColorSyncDeviceDefaultProfileID, + dict_key); + CFRelease(dict_key); + } +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + /* + * Get the device ID hash and pathelogical name dictionary. + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Registering ICC color profiles for \"%s\"", + p->name); + + device_id = _ppdHashName(p->name); + device_name = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + printer_name = CFStringCreateWithCString(kCFAllocatorDefault, + p->name, kCFStringEncodingUTF8); + + if (device_name && printer_name) + { + CFDictionarySetValue(device_name, CFSTR("en_US"), printer_name); + + /* + * Register the device with ColorSync... + */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFTypeRef deviceDictKeys[] = + { /* Device keys */ + kColorSyncDeviceDescriptions, + kColorSyncFactoryProfiles, + kColorSyncDeviceUserScope, + kColorSyncDeviceHostScope + }; + CFTypeRef deviceDictVals[] = + { /* Device values */ + device_name, + profiles, + kCFPreferencesAnyUser, + kCFPreferencesCurrentHost + }; + CFDictionaryRef deviceDict; /* Device dictionary */ + CFUUIDRef deviceUUID; /* Device UUID */ + + deviceDict = CFDictionaryCreate(kCFAllocatorDefault, + (const void **)deviceDictKeys, + (const void **)deviceDictVals, + sizeof(deviceDictKeys) / + sizeof(deviceDictKeys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + deviceUUID = ColorSyncCreateUUIDFromUInt32(device_id); + + if (!deviceDict || !deviceUUID || + !ColorSyncRegisterDevice(kColorSyncPrinterDeviceClass, deviceUUID, + deviceDict)) + error = 1001; + + if (deviceUUID) + CFRelease(deviceUUID); + + if (deviceDict) + CFRelease(deviceDict); + +# else + error = CMRegisterColorDevice(cmPrinterDeviceClass, device_id, + device_name, &scope); + + /* + * Register the profiles... + */ + + if (error == noErr) + error = CMSetDeviceFactoryProfiles(cmPrinterDeviceClass, device_id, + default_profile_id, profiles); +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + } + else + error = 1000; + + /* + * Clean up... + */ + + if (error != noErr) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to register ICC color profiles for \"%s\": %d", + p->name, (int)error); + + if (printer_name) + CFRelease(printer_name); + + if (device_name) + CFRelease(device_name); + } + + /* + * Free any memory we used... + */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + CFRelease(profiles); + +# else + if (num_profiles > 0) + { + for (profile = profiles->profiles; + num_profiles > 0; + profile ++, num_profiles --) + CFRelease(profile->profileName); + + free(profiles); + } +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ + + ppdClose(ppd); +} + + +/* + * 'apple_unregister_profiles()' - Remove color profiles for the specified + * printer. + */ + +static void +apple_unregister_profiles( + cupsd_printer_t *p) /* I - Printer */ +{ + /* + * Make sure ColorSync is available... + */ + +# ifdef HAVE_COLORSYNCREGISTERDEVICE + if (ColorSyncUnregisterDevice != NULL) + { + /* + * Because we may have registered the printer profiles using a prior device + * ID-based UUID, remove both the old style UUID and current UUID for the + * printer. + */ + + CFUUIDRef deviceUUID; /* Device UUID */ + + deviceUUID = ColorSyncCreateUUIDFromUInt32(_ppdHashName(p->name)); + if (deviceUUID) + { + ColorSyncUnregisterDevice(kColorSyncPrinterDeviceClass, deviceUUID); + CFRelease(deviceUUID); + } + } + +# else + if (CMUnregisterColorDevice != NULL) + CMUnregisterColorDevice(cmPrinterDeviceClass, _ppdHashName(p->name)); +# endif /* HAVE_COLORSYNCREGISTERDEVICE */ +} +#endif /* __APPLE__ */ + + +/* + * 'apply_printer_defaults()' - Apply printer default options to a job. + */ + +static void +apply_printer_defaults( + cupsd_printer_t *printer, /* I - Printer */ + cupsd_job_t *job) /* I - Job */ +{ + int i, /* Looping var */ + num_options; /* Number of default options */ + cups_option_t *options, /* Default options */ + *option; /* Current option */ + + + /* + * Collect all of the default options and add the missing ones to the + * job object... + */ + + for (i = printer->num_options, num_options = 0, options = NULL, + option = printer->options; + i > 0; + i --, option ++) + if (!ippFindAttribute(job->attrs, option->name, IPP_TAG_ZERO)) + { + num_options = cupsAddOption(option->name, option->value, num_options, + &options); + } + + /* + * Encode these options as attributes in the job object... + */ + + cupsEncodeOptions2(job->attrs, num_options, options, IPP_TAG_JOB); + cupsFreeOptions(num_options, options); +} + + +/* + * 'authenticate_job()' - Set job authentication info. + */ + +static void +authenticate_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job URI */ +{ + ipp_attribute_t *attr, /* job-id attribute */ + *auth_info; /* auth-info attribute */ + int jobid; /* Job ID */ + cupsd_job_t *job; /* Current job */ + char scheme[HTTP_MAX_URI], + /* Method portion of URI */ + username[HTTP_MAX_URI], + /* Username portion of URI */ + host[HTTP_MAX_URI], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "authenticate_job(%p[%d], %s)", + con, con->http.fd, uri->values[0].string.text); + + /* + * Start with "everything is OK" status... + */ + + con->response->request.status.status_code = IPP_OK; + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if the job has been completed... + */ + + if (job->state_value != IPP_JOB_HELD) + { + /* + * Return a "not-possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is not held for authentication."), + jobid); + return; + } + + /* + * See if we have already authenticated... + */ + + auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); + + if (!con->username[0] && !auth_info) + { + cupsd_printer_t *printer; /* Job destination */ + + /* + * No auth data. If we need to authenticate via Kerberos, send a + * HTTP auth challenge, otherwise just return an IPP error... + */ + + printer = cupsdFindDest(job->dest); + + if (printer && printer->num_auth_info_required > 0 && + !strcmp(printer->auth_info_required[0], "negotiate")) + send_http_error(con, HTTP_UNAUTHORIZED, printer); + else + send_ipp_status(con, IPP_NOT_AUTHORIZED, + _("No authentication information provided.")); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * Save the authentication information for this job... + */ + + save_auth_info(con, job, auth_info); + + /* + * Reset the job-hold-until value to "no-hold"... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + { + attr->value_tag = IPP_TAG_KEYWORD; + cupsdSetString(&(attr->values[0].string.text), "no-hold"); + } + + /* + * Release the job and return... + */ + + cupsdReleaseJob(job); + + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, NULL, job, "Job authenticated by user"); + + cupsdLogJob(job, CUPSD_LOG_INFO, "Authenticated by \"%s\".", con->username); + + cupsdCheckJobs(); +} + + +/* + * 'cancel_all_jobs()' - Cancel all or selected print jobs. + */ + +static void +cancel_all_jobs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job or Printer URI */ +{ + int i; /* Looping var */ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type */ + char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + userpass[HTTP_MAX_URI], /* Username portion of URI */ + hostname[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + ipp_attribute_t *attr; /* Attribute in request */ + const char *username = NULL; /* Username */ + cupsd_jobaction_t purge = CUPSD_JOB_DEFAULT; + /* Purge? */ + cupsd_printer_t *printer; /* Printer */ + ipp_attribute_t *job_ids; /* job-ids attribute */ + cupsd_job_t *job; /* Job */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_all_jobs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Get the jobs to cancel/purge... + */ + + switch (con->request->request.op.operation_id) + { + case IPP_PURGE_JOBS : + /* + * Get the username (if any) for the jobs we want to cancel (only if + * "my-jobs" is specified... + */ + + if ((attr = ippFindAttribute(con->request, "my-jobs", + IPP_TAG_BOOLEAN)) != NULL && + attr->values[0].boolean) + { + if ((attr = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + username = attr->values[0].string.text; + else + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing requesting-user-name attribute.")); + return; + } + } + + /* + * Look for the "purge-jobs" attribute... + */ + + if ((attr = ippFindAttribute(con->request, "purge-jobs", + IPP_TAG_BOOLEAN)) != NULL) + purge = attr->values[0].boolean ? CUPSD_JOB_PURGE : CUPSD_JOB_DEFAULT; + else + purge = CUPSD_JOB_PURGE; + break; + + case IPP_CANCEL_MY_JOBS : + if (con->username[0]) + username = con->username; + else if ((attr = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + username = attr->values[0].string.text; + else + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing requesting-user-name attribute.")); + return; + } + + default : + break; + } + + job_ids = ippFindAttribute(con->request, "job-ids", IPP_TAG_INTEGER); + + /* + * See if we have a printer URI... + */ + + if (strcmp(uri->name, "printer-uri")) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("The printer-uri attribute is required.")); + return; + } + + /* + * And if the destination is valid... + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI? + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, + scheme, sizeof(scheme), userpass, sizeof(userpass), + hostname, sizeof(hostname), &port, + resource, sizeof(resource)); + + if ((!strncmp(resource, "/printers/", 10) && resource[10]) || + (!strncmp(resource, "/classes/", 9) && resource[9])) + { + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + if (job_ids) + { + for (i = 0; i < job_ids->num_values; i ++) + { + if (!cupsdFindJob(job_ids->values[i].integer)) + break; + } + + if (i < job_ids->num_values) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + job_ids->values[i].integer); + return; + } + + for (i = 0; i < job_ids->num_values; i ++) + { + job = cupsdFindJob(job_ids->values[i].integer); + + cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + purge == CUPSD_JOB_PURGE ? "Job purged by user." : + "Job canceled by user."); + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Selected jobs were %s by \"%s\".", + purge == CUPSD_JOB_PURGE ? "purged" : "canceled", + get_username(con)); + } + else + { + /* + * Cancel all jobs on all printers... + */ + + cupsdCancelJobs(NULL, username, purge); + + cupsdLogMessage(CUPSD_LOG_INFO, "All jobs were %s by \"%s\".", + purge == CUPSD_JOB_PURGE ? "purged" : "canceled", + get_username(con)); + } + } + else + { + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, + NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + if (job_ids) + { + for (i = 0; i < job_ids->num_values; i ++) + { + if ((job = cupsdFindJob(job_ids->values[i].integer)) == NULL || + _cups_strcasecmp(job->dest, printer->name)) + break; + } + + if (i < job_ids->num_values) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + job_ids->values[i].integer); + return; + } + + for (i = 0; i < job_ids->num_values; i ++) + { + job = cupsdFindJob(job_ids->values[i].integer); + + cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + purge == CUPSD_JOB_PURGE ? "Job purged by user." : + "Job canceled by user."); + } + + cupsdLogMessage(CUPSD_LOG_INFO, "Selected jobs were %s by \"%s\".", + purge == CUPSD_JOB_PURGE ? "purged" : "canceled", + get_username(con)); + } + else + { + /* + * Cancel all of the jobs on the named printer... + */ + + cupsdCancelJobs(printer->name, username, purge); + + cupsdLogMessage(CUPSD_LOG_INFO, "All jobs on \"%s\" were %s by \"%s\".", + printer->name, + purge == CUPSD_JOB_PURGE ? "purged" : "canceled", + get_username(con)); + } + } + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'cancel_job()' - Cancel a print job. + */ + +static void +cancel_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job or Printer URI */ +{ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_job_t *job; /* Job information */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + cupsd_jobaction_t purge; /* Purge the job? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cancel_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + if ((jobid = attr->values[0].integer) == 0) + { + /* + * Find the current job on the specified printer... + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * See if there are any pending jobs... + */ + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (job->state_value <= IPP_JOB_PROCESSING && + !_cups_strcasecmp(job->dest, printer->name)) + break; + + if (job) + jobid = job->id; + else + { + /* + * No, try stopped jobs... + */ + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (job->state_value == IPP_JOB_STOPPED && + !_cups_strcasecmp(job->dest, printer->name)) + break; + + if (job) + jobid = job->id; + else + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s."), + printer->name); + return; + } + } + } + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * Look for the "purge-job" attribute... + */ + + if ((attr = ippFindAttribute(con->request, "purge-job", + IPP_TAG_BOOLEAN)) != NULL) + purge = attr->values[0].boolean ? CUPSD_JOB_PURGE : CUPSD_JOB_DEFAULT; + else + purge = CUPSD_JOB_DEFAULT; + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * See if the job is already completed, canceled, or aborted; if so, + * we can't cancel... + */ + + if (job->state_value >= IPP_JOB_CANCELED && purge != CUPSD_JOB_PURGE) + { + switch (job->state_value) + { + case IPP_JOB_CANCELED : + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is already canceled - can\'t cancel."), + jobid); + break; + + case IPP_JOB_ABORTED : + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is already aborted - can\'t cancel."), + jobid); + break; + + default : + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is already completed - can\'t cancel."), + jobid); + break; + } + + return; + } + + /* + * Cancel the job and return... + */ + + cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + purge == CUPSD_JOB_PURGE ? "Job purged by \"%s\"" : + "Job canceled by \"%s\"", + username); + cupsdCheckJobs(); + + if (purge == CUPSD_JOB_PURGE) + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Purged by \"%s\".", jobid, + username); + else + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Canceled by \"%s\".", jobid, + username); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'cancel_subscription()' - Cancel a subscription. + */ + +static void +cancel_subscription( + cupsd_client_t *con, /* I - Client connection */ + int sub_id) /* I - Subscription ID */ +{ + http_status_t status; /* Policy status */ + cupsd_subscription_t *sub; /* Subscription */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cancel_subscription(con=%p[%d], sub_id=%d)", + con, con->http.fd, sub_id); + + /* + * Is the subscription ID valid? + */ + + if ((sub = cupsdFindSubscription(sub_id)) == NULL) + { + /* + * Bad subscription ID... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("Subscription #%d does not exist."), sub_id); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : + DefaultPolicyPtr, + con, sub->owner)) != HTTP_OK) + { + send_http_error(con, status, sub->dest); + return; + } + + /* + * Cancel the subscription... + */ + + cupsdDeleteSubscription(sub, 1); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'check_rss_recipient()' - Check that we do not have a duplicate RSS feed URI. + */ + +static int /* O - 1 if OK, 0 if not */ +check_rss_recipient( + const char *recipient) /* I - Recipient URI */ +{ + cupsd_subscription_t *sub; /* Current subscription */ + + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (sub->recipient) + { + /* + * Compare the URIs up to the first ?... + */ + + const char *r1, *r2; + + for (r1 = recipient, r2 = sub->recipient; + *r1 == *r2 && *r1 && *r1 != '?' && *r2 && *r2 != '?'; + r1 ++, r2 ++); + + if (*r1 == *r2) + return (0); + } + + return (1); +} + + +/* + * 'check_quotas()' - Check quotas for a printer and user. + */ + +static int /* O - 1 if OK, 0 if forbidden, + -1 if limit reached */ +check_quotas(cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *p) /* I - Printer or class */ +{ + char username[33], /* Username */ + *name; /* Current user name */ + cupsd_quota_t *q; /* Quota data */ +#ifdef HAVE_MBR_UID_TO_UUID + /* + * Use Apple membership APIs which require that all names represent + * valid user account or group records accessible by the server. + */ + + uuid_t usr_uuid; /* UUID for job requesting user */ + uuid_t usr2_uuid; /* UUID for ACL user name entry */ + uuid_t grp_uuid; /* UUID for ACL group name entry */ + int mbr_err; /* Error from membership function */ + int is_member; /* Is this user a member? */ +#else + /* + * Use standard POSIX APIs for checking users and groups... + */ + + struct passwd *pw; /* User password data */ +#endif /* HAVE_MBR_UID_TO_UUID */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "check_quotas(%p[%d], %p[%s])", + con, con->http.fd, p, p->name); + + /* + * Figure out who is printing... + */ + + strlcpy(username, get_username(con), sizeof(username)); + + if ((name = strchr(username, '@')) != NULL) + *name = '\0'; /* Strip @REALM */ + + /* + * Check global active job limits for printers and users... + */ + + if (MaxJobsPerPrinter) + { + /* + * Check if there are too many pending jobs on this printer... + */ + + if (cupsdGetPrinterJobCount(p->name) >= MaxJobsPerPrinter) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Too many jobs for printer \"%s\"...", + p->name); + return (-1); + } + } + + if (MaxJobsPerUser) + { + /* + * Check if there are too many pending jobs for this user... + */ + + if (cupsdGetUserJobCount(username) >= MaxJobsPerUser) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Too many jobs for user \"%s\"...", + username); + return (-1); + } + } + + /* + * Check against users... + */ + + if (cupsArrayCount(p->users) == 0 && p->k_limit == 0 && p->page_limit == 0) + return (1); + + if (cupsArrayCount(p->users)) + { +#ifdef HAVE_MBR_UID_TO_UUID + /* + * Get UUID for job requesting user... + */ + + if (mbr_user_name_to_uuid((char *)username, usr_uuid)) + { + /* + * Unknown user... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "check_quotas: UUID lookup failed for user \"%s\"", + username); + cupsdLogMessage(CUPSD_LOG_INFO, + "Denying user \"%s\" access to printer \"%s\" " + "(unknown user)...", + username, p->name); + return (0); + } +#else + /* + * Get UID and GID of requesting user... + */ + + pw = getpwnam(username); + endpwent(); +#endif /* HAVE_MBR_UID_TO_UUID */ + + for (name = (char *)cupsArrayFirst(p->users); + name; + name = (char *)cupsArrayNext(p->users)) + if (name[0] == '@') + { + /* + * Check group membership... + */ + +#ifdef HAVE_MBR_UID_TO_UUID + if (name[1] == '#') + { + if (uuid_parse(name + 2, grp_uuid)) + uuid_clear(grp_uuid); + } + else if ((mbr_err = mbr_group_name_to_uuid(name + 1, grp_uuid)) != 0) + { + /* + * Invalid ACL entries are ignored for matching; just record a + * warning in the log... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "check_quotas: UUID lookup failed for ACL entry " + "\"%s\" (err=%d)", name, mbr_err); + cupsdLogMessage(CUPSD_LOG_WARN, + "Access control entry \"%s\" not a valid group name; " + "entry ignored", name); + } + + if ((mbr_err = mbr_check_membership(usr_uuid, grp_uuid, + &is_member)) != 0) + { + /* + * At this point, there should be no errors, but check anyways... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "check_quotas: group \"%s\" membership check " + "failed (err=%d)", name + 1, mbr_err); + is_member = 0; + } + + /* + * Stop if we found a match... + */ + + if (is_member) + break; + +#else + if (cupsdCheckGroup(username, pw, name + 1)) + break; +#endif /* HAVE_MBR_UID_TO_UUID */ + } +#ifdef HAVE_MBR_UID_TO_UUID + else + { + if (name[0] == '#') + { + if (uuid_parse(name + 1, usr2_uuid)) + uuid_clear(usr2_uuid); + } + else if ((mbr_err = mbr_user_name_to_uuid(name, usr2_uuid)) != 0) + { + /* + * Invalid ACL entries are ignored for matching; just record a + * warning in the log... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "check_quotas: UUID lookup failed for ACL entry " + "\"%s\" (err=%d)", name, mbr_err); + cupsdLogMessage(CUPSD_LOG_WARN, + "Access control entry \"%s\" not a valid user name; " + "entry ignored", name); + } + + if (!uuid_compare(usr_uuid, usr2_uuid)) + break; + } +#else + else if (!_cups_strcasecmp(username, name)) + break; +#endif /* HAVE_MBR_UID_TO_UUID */ + + if ((name != NULL) == p->deny_users) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Denying user \"%s\" access to printer \"%s\"...", + username, p->name); + return (0); + } + } + + /* + * Check quotas... + */ + + if (p->k_limit || p->page_limit) + { + if ((q = cupsdUpdateQuota(p, username, 0, 0)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate quota data for user \"%s\"", + username); + return (-1); + } + + if ((q->k_count >= p->k_limit && p->k_limit) || + (q->page_count >= p->page_limit && p->page_limit)) + { + cupsdLogMessage(CUPSD_LOG_INFO, "User \"%s\" is over the quota limit...", + username); + return (-1); + } + } + + /* + * If we have gotten this far, we're done! + */ + + return (1); +} + + +/* + * 'close_job()' - Close a multi-file job. + */ + +static void +close_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + cupsd_job_t *job; /* Job */ + ipp_attribute_t *attr; /* Attribute */ + char job_uri[HTTP_MAX_URI], + /* Job URI */ + username[256]; /* User name */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "close_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (strcmp(uri->name, "printer-uri")) + { + /* + * job-uri is not supported by Close-Job! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("Close-Job doesn't support the job-uri attribute.")); + return; + } + + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + if ((job = cupsdFindJob(attr->values[0].integer)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + attr->values[0].integer); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * Add any ending sheet... + */ + + if (cupsdTimeoutJob(job)) + return; + + if (job->state_value == IPP_JOB_STOPPED) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + else if (job->state_value == IPP_JOB_HELD) + { + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + } + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + + /* + * Fill in the response info... + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + con->servername, con->serverport, "/jobs/%d", job->id); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, + job_uri); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", job->id); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", + job->state_value); + + add_job_state_reasons(con, job); + + con->response->request.status.status_code = IPP_OK; + + /* + * Start the job if necessary... + */ + + cupsdCheckJobs(); +} + + +/* + * 'copy_attribute()' - Copy a single attribute. + */ + +static ipp_attribute_t * /* O - New attribute */ +copy_attribute( + ipp_t *to, /* O - Destination request/response */ + ipp_attribute_t *attr, /* I - Attribute to copy */ + int quickcopy) /* I - Do a quick copy? */ +{ + int i; /* Looping var */ + ipp_attribute_t *toattr; /* Destination attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "copy_attribute(%p, %p[%s,%x,%x])", to, attr, + attr->name ? attr->name : "(null)", attr->group_tag, + attr->value_tag); + + switch (attr->value_tag & ~IPP_TAG_COPY) + { + case IPP_TAG_ZERO : + toattr = ippAddSeparator(to); + break; + + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + toattr = ippAddIntegers(to, attr->group_tag, attr->value_tag, + attr->name, attr->num_values, NULL); + + for (i = 0; i < attr->num_values; i ++) + toattr->values[i].integer = attr->values[i].integer; + break; + + case IPP_TAG_BOOLEAN : + toattr = ippAddBooleans(to, attr->group_tag, attr->name, + attr->num_values, NULL); + + for (i = 0; i < attr->num_values; i ++) + toattr->values[i].boolean = attr->values[i].boolean; + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + toattr = ippAddStrings(to, attr->group_tag, + (ipp_tag_t)(attr->value_tag | quickcopy), + attr->name, attr->num_values, NULL, NULL); + + if (quickcopy) + { + for (i = 0; i < attr->num_values; i ++) + toattr->values[i].string.text = attr->values[i].string.text; + } + else if (attr->value_tag & IPP_TAG_COPY) + { + for (i = 0; i < attr->num_values; i ++) + toattr->values[i].string.text = + _cupsStrAlloc(attr->values[i].string.text); + } + else + { + for (i = 0; i < attr->num_values; i ++) + toattr->values[i].string.text = + _cupsStrRetain(attr->values[i].string.text); + } + break; + + case IPP_TAG_DATE : + toattr = ippAddDate(to, attr->group_tag, attr->name, + attr->values[0].date); + break; + + case IPP_TAG_RESOLUTION : + toattr = ippAddResolutions(to, attr->group_tag, attr->name, + attr->num_values, IPP_RES_PER_INCH, + NULL, NULL); + + for (i = 0; i < attr->num_values; i ++) + { + toattr->values[i].resolution.xres = attr->values[i].resolution.xres; + toattr->values[i].resolution.yres = attr->values[i].resolution.yres; + toattr->values[i].resolution.units = attr->values[i].resolution.units; + } + break; + + case IPP_TAG_RANGE : + toattr = ippAddRanges(to, attr->group_tag, attr->name, + attr->num_values, NULL, NULL); + + for (i = 0; i < attr->num_values; i ++) + { + toattr->values[i].range.lower = attr->values[i].range.lower; + toattr->values[i].range.upper = attr->values[i].range.upper; + } + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + toattr = ippAddStrings(to, attr->group_tag, + (ipp_tag_t)(attr->value_tag | quickcopy), + attr->name, attr->num_values, NULL, NULL); + + if (quickcopy) + { + for (i = 0; i < attr->num_values; i ++) + { + toattr->values[i].string.charset = attr->values[i].string.charset; + toattr->values[i].string.text = attr->values[i].string.text; + } + } + else if (attr->value_tag & IPP_TAG_COPY) + { + for (i = 0; i < attr->num_values; i ++) + { + if (!i) + toattr->values[i].string.charset = + _cupsStrAlloc(attr->values[i].string.charset); + else + toattr->values[i].string.charset = + toattr->values[0].string.charset; + + toattr->values[i].string.text = + _cupsStrAlloc(attr->values[i].string.text); + } + } + else + { + for (i = 0; i < attr->num_values; i ++) + { + if (!i) + toattr->values[i].string.charset = + _cupsStrRetain(attr->values[i].string.charset); + else + toattr->values[i].string.charset = + toattr->values[0].string.charset; + + toattr->values[i].string.text = + _cupsStrRetain(attr->values[i].string.text); + } + } + break; + + case IPP_TAG_BEGIN_COLLECTION : + toattr = ippAddCollections(to, attr->group_tag, attr->name, + attr->num_values, NULL); + + for (i = 0; i < attr->num_values; i ++) + { + toattr->values[i].collection = attr->values[i].collection; + attr->values[i].collection->use ++; + } + break; + + default : + toattr = ippAddIntegers(to, attr->group_tag, attr->value_tag, + attr->name, attr->num_values, NULL); + + for (i = 0; i < attr->num_values; i ++) + { + toattr->values[i].unknown.length = attr->values[i].unknown.length; + + if (toattr->values[i].unknown.length > 0) + { + if ((toattr->values[i].unknown.data = + malloc(toattr->values[i].unknown.length)) == NULL) + toattr->values[i].unknown.length = 0; + else + memcpy(toattr->values[i].unknown.data, + attr->values[i].unknown.data, + toattr->values[i].unknown.length); + } + } + break; /* anti-compiler-warning-code */ + } + + return (toattr); +} + + +/* + * 'copy_attrs()' - Copy attributes from one request to another. + */ + +static void +copy_attrs(ipp_t *to, /* I - Destination request */ + ipp_t *from, /* I - Source request */ + cups_array_t *ra, /* I - Requested attributes */ + ipp_tag_t group, /* I - Group to copy */ + int quickcopy, /* I - Do a quick copy? */ + cups_array_t *exclude) /* I - Attributes to exclude? */ +{ + ipp_attribute_t *fromattr; /* Source attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "copy_attrs(to=%p, from=%p, ra=%p, group=%x, quickcopy=%d)", + to, from, ra, group, quickcopy); + + if (!to || !from) + return; + + for (fromattr = from->attrs; fromattr; fromattr = fromattr->next) + { + /* + * Filter attributes as needed... + */ + + if ((group != IPP_TAG_ZERO && fromattr->group_tag != group && + fromattr->group_tag != IPP_TAG_ZERO) || !fromattr->name) + continue; + + if (!strcmp(fromattr->name, "job-printer-uri")) + continue; + + if (exclude && + (cupsArrayFind(exclude, fromattr->name) || + cupsArrayFind(exclude, "all"))) + { + /* + * We need to exclude this attribute for security reasons; we require the + * job-id attribute regardless of the security settings for IPP + * conformance. + * + * The job-printer-uri attribute is handled by copy_job_attrs(). + * + * Subscription attribute security is handled by copy_subscription_attrs(). + */ + + if (strcmp(fromattr->name, "job-id")) + continue; + } + + if (!ra || cupsArrayFind(ra, fromattr->name)) + { + /* + * Don't send collection attributes by default to IPP/1.x clients + * since many do not support collections. Also don't send + * media-col-database unless specifically requested by the client. + */ + + if (fromattr->value_tag == IPP_TAG_BEGIN_COLLECTION && + !ra && + (to->request.status.version[0] == 1 || + !strcmp(fromattr->name, "media-col-database"))) + continue; + + copy_attribute(to, fromattr, quickcopy); + } + } +} + + +/* + * 'copy_banner()' - Copy a banner file to the requests directory for the + * specified job. + */ + +static int /* O - Size of banner file in kbytes */ +copy_banner(cupsd_client_t *con, /* I - Client connection */ + cupsd_job_t *job, /* I - Job information */ + const char *name) /* I - Name of banner */ +{ + int i; /* Looping var */ + int kbytes; /* Size of banner file in kbytes */ + char filename[1024]; /* Job filename */ + cupsd_banner_t *banner; /* Pointer to banner */ + cups_file_t *in; /* Input file */ + cups_file_t *out; /* Output file */ + int ch; /* Character from file */ + char attrname[255], /* Name of attribute */ + *s; /* Pointer into name */ + ipp_attribute_t *attr; /* Attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "copy_banner(con=%p[%d], job=%p[%d], name=\"%s\")", + con, con ? con->http.fd : -1, job, job->id, + name ? name : "(null)"); + + /* + * Find the banner; return if not found or "none"... + */ + + if (!name || !strcmp(name, "none") || + (banner = cupsdFindBanner(name)) == NULL) + return (0); + + /* + * Open the banner and job files... + */ + + if (add_file(con, job, banner->filetype, 0)) + return (-1); + + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, + job->num_files); + if ((out = cupsFileOpen(filename, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create banner job file %s - %s", + filename, strerror(errno)); + job->num_files --; + return (0); + } + + fchmod(cupsFileNumber(out), 0640); + fchown(cupsFileNumber(out), RunUser, Group); + + /* + * Try the localized banner file under the subdirectory... + */ + + strlcpy(attrname, job->attrs->attrs->next->values[0].string.text, + sizeof(attrname)); + if (strlen(attrname) > 2 && attrname[2] == '-') + { + /* + * Convert ll-cc to ll_CC... + */ + + attrname[2] = '_'; + attrname[3] = toupper(attrname[3] & 255); + attrname[4] = toupper(attrname[4] & 255); + } + + snprintf(filename, sizeof(filename), "%s/banners/%s/%s", DataDir, + attrname, name); + + if (access(filename, 0) && strlen(attrname) > 2) + { + /* + * Wasn't able to find "ll_CC" locale file; try the non-national + * localization banner directory. + */ + + attrname[2] = '\0'; + + snprintf(filename, sizeof(filename), "%s/banners/%s/%s", DataDir, + attrname, name); + } + + if (access(filename, 0)) + { + /* + * Use the non-localized banner file. + */ + + snprintf(filename, sizeof(filename), "%s/banners/%s", DataDir, name); + } + + if ((in = cupsFileOpen(filename, "r")) == NULL) + { + cupsFileClose(out); + unlink(filename); + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open banner template file %s - %s", + filename, strerror(errno)); + job->num_files --; + return (0); + } + + /* + * Parse the file to the end... + */ + + while ((ch = cupsFileGetChar(in)) != EOF) + if (ch == '{') + { + /* + * Get an attribute name... + */ + + for (s = attrname; (ch = cupsFileGetChar(in)) != EOF;) + if (!isalpha(ch & 255) && ch != '-' && ch != '?') + break; + else if (s < (attrname + sizeof(attrname) - 1)) + *s++ = ch; + else + break; + + *s = '\0'; + + if (ch != '}') + { + /* + * Ignore { followed by stuff that is not an attribute name... + */ + + cupsFilePrintf(out, "{%s%c", attrname, ch); + continue; + } + + /* + * See if it is defined... + */ + + if (attrname[0] == '?') + s = attrname + 1; + else + s = attrname; + + if (!strcmp(s, "printer-name")) + { + cupsFilePuts(out, job->dest); + continue; + } + else if ((attr = ippFindAttribute(job->attrs, s, IPP_TAG_ZERO)) == NULL) + { + /* + * See if we have a leading question mark... + */ + + if (attrname[0] != '?') + { + /* + * Nope, write to file as-is; probably a PostScript procedure... + */ + + cupsFilePrintf(out, "{%s}", attrname); + } + + continue; + } + + /* + * Output value(s)... + */ + + for (i = 0; i < attr->num_values; i ++) + { + if (i) + cupsFilePutChar(out, ','); + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + if (!strncmp(s, "time-at-", 8)) + { + struct timeval tv; /* Time value */ + + tv.tv_sec = attr->values[i].integer; + tv.tv_usec = 0; + + cupsFilePuts(out, cupsdGetDateTime(&tv, CUPSD_TIME_STANDARD)); + } + else + cupsFilePrintf(out, "%d", attr->values[i].integer); + break; + + case IPP_TAG_BOOLEAN : + cupsFilePrintf(out, "%d", attr->values[i].boolean); + break; + + case IPP_TAG_NOVALUE : + cupsFilePuts(out, "novalue"); + break; + + case IPP_TAG_RANGE : + cupsFilePrintf(out, "%d-%d", attr->values[i].range.lower, + attr->values[i].range.upper); + break; + + case IPP_TAG_RESOLUTION : + cupsFilePrintf(out, "%dx%d%s", attr->values[i].resolution.xres, + attr->values[i].resolution.yres, + attr->values[i].resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + break; + + case IPP_TAG_URI : + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + if (!_cups_strcasecmp(banner->filetype->type, "postscript")) + { + /* + * Need to quote strings for PS banners... + */ + + const char *p; + + for (p = attr->values[i].string.text; *p; p ++) + { + if (*p == '(' || *p == ')' || *p == '\\') + { + cupsFilePutChar(out, '\\'); + cupsFilePutChar(out, *p); + } + else if (*p < 32 || *p > 126) + cupsFilePrintf(out, "\\%03o", *p & 255); + else + cupsFilePutChar(out, *p); + } + } + else + cupsFilePuts(out, attr->values[i].string.text); + break; + + default : + break; /* anti-compiler-warning-code */ + } + } + } + else if (ch == '\\') /* Quoted char */ + { + ch = cupsFileGetChar(in); + + if (ch != '{') /* Only do special handling for \{ */ + cupsFilePutChar(out, '\\'); + + cupsFilePutChar(out, ch); + } + else + cupsFilePutChar(out, ch); + + cupsFileClose(in); + + kbytes = (cupsFileTell(out) + 1023) / 1024; + + if ((attr = ippFindAttribute(job->attrs, "job-k-octets", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer += kbytes; + + cupsFileClose(out); + + return (kbytes); +} + + +/* + * 'copy_file()' - Copy a PPD file or interface script... + */ + +static int /* O - 0 = success, -1 = error */ +copy_file(const char *from, /* I - Source file */ + const char *to) /* I - Destination file */ +{ + cups_file_t *src, /* Source file */ + *dst; /* Destination file */ + int bytes; /* Bytes to read/write */ + char buffer[2048]; /* Copy buffer */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_file(\"%s\", \"%s\")", from, to); + + /* + * Open the source and destination file for a copy... + */ + + if ((src = cupsFileOpen(from, "rb")) == NULL) + return (-1); + + if ((dst = cupsFileOpen(to, "wb")) == NULL) + { + cupsFileClose(src); + return (-1); + } + + /* + * Copy the source file to the destination... + */ + + while ((bytes = cupsFileRead(src, buffer, sizeof(buffer))) > 0) + if (cupsFileWrite(dst, buffer, bytes) < bytes) + { + cupsFileClose(src); + cupsFileClose(dst); + return (-1); + } + + /* + * Close both files and return... + */ + + cupsFileClose(src); + + return (cupsFileClose(dst)); +} + + +/* + * 'copy_model()' - Copy a PPD model file, substituting default values + * as needed... + */ + +static int /* O - 0 = success, -1 = error */ +copy_model(cupsd_client_t *con, /* I - Client connection */ + const char *from, /* I - Source file */ + const char *to) /* I - Destination file */ +{ + fd_set input; /* select() input set */ + struct timeval timeout; /* select() timeout */ + int maxfd; /* Max file descriptor for select() */ + char tempfile[1024]; /* Temporary PPD file */ + int tempfd; /* Temporary PPD file descriptor */ + int temppid; /* Process ID of cups-driverd */ + int temppipe[2]; /* Temporary pipes */ + char *argv[4], /* Command-line arguments */ + *envp[MAX_ENV]; /* Environment */ + cups_file_t *src, /* Source file */ + *dst; /* Destination file */ + ppd_file_t *ppd; /* PPD file */ + int bytes, /* Bytes from pipe */ + total; /* Total bytes from pipe */ + char buffer[2048]; /* Copy buffer */ + int i; /* Looping var */ + char option[PPD_MAX_NAME], /* Option name */ + choice[PPD_MAX_NAME]; /* Choice name */ + ppd_size_t *size; /* Default size */ + int num_defaults; /* Number of default options */ + cups_option_t *defaults; /* Default options */ + char cups_protocol[PPD_MAX_LINE]; + /* cupsProtocol attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "copy_model(con=%p, from=\"%s\", to=\"%s\")", + con, from, to); + + /* + * Run cups-driverd to get the PPD file... + */ + + argv[0] = "cups-driverd"; + argv[1] = "cat"; + argv[2] = (char *)from; + argv[3] = NULL; + + cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + + snprintf(buffer, sizeof(buffer), "%s/daemon/cups-driverd", ServerBin); + snprintf(tempfile, sizeof(tempfile), "%s/%d.ppd", TempDir, con->http.fd); + tempfd = open(tempfile, O_WRONLY | O_CREAT | O_TRUNC, 0600); + if (tempfd < 0 || cupsdOpenPipe(temppipe)) + return (-1); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "copy_model: Running \"cups-driverd cat %s\"...", from); + + if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1], + -1, -1, 0, DefaultProfile, NULL, &temppid)) + { + close(tempfd); + unlink(tempfile); + + return (-1); + } + + close(temppipe[1]); + + /* + * Wait up to 30 seconds for the PPD file to be copied... + */ + + total = 0; + + if (temppipe[0] > CGIPipes[0]) + maxfd = temppipe[0] + 1; + else + maxfd = CGIPipes[0] + 1; + + for (;;) + { + /* + * See if we have data ready... + */ + + FD_ZERO(&input); + FD_SET(temppipe[0], &input); + FD_SET(CGIPipes[0], &input); + + timeout.tv_sec = 30; + timeout.tv_usec = 0; + + if ((i = select(maxfd, &input, NULL, NULL, &timeout)) < 0) + { + if (errno == EINTR) + continue; + else + break; + } + else if (i == 0) + { + /* + * We have timed out... + */ + + break; + } + + if (FD_ISSET(temppipe[0], &input)) + { + /* + * Read the PPD file from the pipe, and write it to the PPD file. + */ + + if ((bytes = read(temppipe[0], buffer, sizeof(buffer))) > 0) + { + if (write(tempfd, buffer, bytes) < bytes) + break; + + total += bytes; + } + else + break; + } + + if (FD_ISSET(CGIPipes[0], &input)) + cupsdUpdateCGI(); + } + + close(temppipe[0]); + close(tempfd); + + if (!total) + { + /* + * No data from cups-deviced... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "copy_model: empty PPD file"); + unlink(tempfile); + return (-1); + } + + /* + * Read the source file and see what page sizes are supported... + */ + + if ((ppd = ppdOpenFile(tempfile)) == NULL) + { + unlink(tempfile); + return (-1); + } + + /* + * Open the destination (if possible) and set the default options... + */ + + num_defaults = 0; + defaults = NULL; + cups_protocol[0] = '\0'; + + if ((dst = cupsFileOpen(to, "rb")) != NULL) + { + /* + * Read all of the default lines from the old PPD... + */ + + while (cupsFileGets(dst, buffer, sizeof(buffer))) + if (!strncmp(buffer, "*Default", 8)) + { + /* + * Add the default option... + */ + + if (!ppd_parse_line(buffer, option, sizeof(option), + choice, sizeof(choice))) + { + ppd_option_t *ppdo; /* PPD option */ + + + /* + * Only add the default if the default hasn't already been + * set and the choice exists in the new PPD... + */ + + if (!cupsGetOption(option, num_defaults, defaults) && + (ppdo = ppdFindOption(ppd, option)) != NULL && + ppdFindChoice(ppdo, choice)) + num_defaults = cupsAddOption(option, choice, num_defaults, + &defaults); + } + } + else if (!strncmp(buffer, "*cupsProtocol:", 14)) + strlcpy(cups_protocol, buffer, sizeof(cups_protocol)); + + cupsFileClose(dst); + } + else if ((size = ppdPageSize(ppd, DefaultPaperSize)) != NULL) + { + /* + * Add the default media sizes... + */ + + num_defaults = cupsAddOption("PageSize", size->name, + num_defaults, &defaults); + num_defaults = cupsAddOption("PageRegion", size->name, + num_defaults, &defaults); + num_defaults = cupsAddOption("PaperDimension", size->name, + num_defaults, &defaults); + num_defaults = cupsAddOption("ImageableArea", size->name, + num_defaults, &defaults); + } + + ppdClose(ppd); + + /* + * Open the source file for a copy... + */ + + if ((src = cupsFileOpen(tempfile, "rb")) == NULL) + { + cupsFreeOptions(num_defaults, defaults); + unlink(tempfile); + return (-1); + } + + /* + * Open the destination file for a copy... + */ + + if ((dst = cupsFileOpen(to, "wb")) == NULL) + { + cupsFreeOptions(num_defaults, defaults); + cupsFileClose(src); + unlink(tempfile); + return (-1); + } + + /* + * Copy the source file to the destination... + */ + + while (cupsFileGets(src, buffer, sizeof(buffer))) + { + if (!strncmp(buffer, "*Default", 8)) + { + /* + * Check for an previous default option choice... + */ + + if (!ppd_parse_line(buffer, option, sizeof(option), + choice, sizeof(choice))) + { + const char *val; /* Default option value */ + + + if ((val = cupsGetOption(option, num_defaults, defaults)) != NULL) + { + /* + * Substitute the previous choice... + */ + + snprintf(buffer, sizeof(buffer), "*Default%s: %s", option, val); + } + } + } + + cupsFilePrintf(dst, "%s\n", buffer); + } + + if (cups_protocol[0]) + cupsFilePrintf(dst, "%s\n", cups_protocol); + + cupsFreeOptions(num_defaults, defaults); + + /* + * Close both files and return... + */ + + cupsFileClose(src); + + unlink(tempfile); + + return (cupsFileClose(dst)); +} + + +/* + * 'copy_job_attrs()' - Copy job attributes. + */ + +static void +copy_job_attrs(cupsd_client_t *con, /* I - Client connection */ + cupsd_job_t *job, /* I - Job */ + cups_array_t *ra, /* I - Requested attributes array */ + cups_array_t *exclude) /* I - Private attributes array */ +{ + char job_uri[HTTP_MAX_URI]; /* Job URI */ + + + /* + * Send the requested attributes for each job... + */ + + if (!cupsArrayFind(exclude, "all")) + { + if ((!exclude || !cupsArrayFind(exclude, "document-count")) && + (!ra || cupsArrayFind(ra, "document-count"))) + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, + "document-count", job->num_files); + + if ((!exclude || !cupsArrayFind(exclude, "job-media-progress")) && + (!ra || cupsArrayFind(ra, "job-media-progress"))) + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, + "job-media-progress", job->progress); + + if ((!exclude || !cupsArrayFind(exclude, "job-more-info")) && + (!ra || cupsArrayFind(ra, "job-more-info"))) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "http", + NULL, con->servername, con->serverport, "/jobs/%d", + job->id); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, + "job-more-info", NULL, job_uri); + } + + if (job->state_value > IPP_JOB_PROCESSING && + (!exclude || !cupsArrayFind(exclude, "job-preserved")) && + (!ra || cupsArrayFind(ra, "job-preserved"))) + ippAddBoolean(con->response, IPP_TAG_JOB, "job-preserved", + job->num_files > 0); + + if ((!exclude || !cupsArrayFind(exclude, "job-printer-up-time")) && + (!ra || cupsArrayFind(ra, "job-printer-up-time"))) + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, + "job-printer-up-time", time(NULL)); + } + + if (!ra || cupsArrayFind(ra, "job-printer-uri")) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + con->servername, con->serverport, + job->dtype & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_CLASS) ? + "/classes/%s" : "/printers/%s", + job->dest); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, + "job-printer-uri", NULL, job_uri); + } + + if (!ra || cupsArrayFind(ra, "job-state-reasons")) + add_job_state_reasons(con, job); + + if (!ra || cupsArrayFind(ra, "job-uri")) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + con->servername, con->serverport, "/jobs/%d", + job->id); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, + "job-uri", NULL, job_uri); + } + + copy_attrs(con->response, job->attrs, ra, IPP_TAG_JOB, 0, exclude); +} + + +/* + * 'copy_printer_attrs()' - Copy printer attributes. + */ + +static void +copy_printer_attrs( + cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *printer, /* I - Printer */ + cups_array_t *ra) /* I - Requested attributes array */ +{ + char printer_uri[HTTP_MAX_URI]; + /* Printer URI */ + char printer_icons[HTTP_MAX_URI]; + /* Printer icons */ + time_t curtime; /* Current time */ + int i; /* Looping var */ + + + /* + * Copy the printer attributes to the response using requested-attributes + * and document-format attributes that may be provided by the client. + */ + + curtime = time(NULL); + + if (!ra || cupsArrayFind(ra, "marker-change-time")) + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-change-time", printer->marker_time); + + if (printer->num_printers > 0 && + (!ra || cupsArrayFind(ra, "member-uris"))) + { + ipp_attribute_t *member_uris; /* member-uris attribute */ + cupsd_printer_t *p2; /* Printer in class */ + ipp_attribute_t *p2_uri; /* printer-uri-supported for class printer */ + + + if ((member_uris = ippAddStrings(con->response, IPP_TAG_PRINTER, + IPP_TAG_URI, "member-uris", + printer->num_printers, NULL, + NULL)) != NULL) + { + for (i = 0; i < printer->num_printers; i ++) + { + p2 = printer->printers[i]; + + if ((p2_uri = ippFindAttribute(p2->attrs, "printer-uri-supported", + IPP_TAG_URI)) != NULL) + member_uris->values[i].string.text = + _cupsStrRetain(p2_uri->values[0].string.text); + else + { + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, + sizeof(printer_uri), "ipp", NULL, con->servername, + con->serverport, + (p2->type & CUPS_PRINTER_CLASS) ? + "/classes/%s" : "/printers/%s", p2->name); + member_uris->values[i].string.text = _cupsStrAlloc(printer_uri); + } + } + } + } + + if (printer->alert && (!ra || cupsArrayFind(ra, "printer-alert"))) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_STRING, + "printer-alert", NULL, printer->alert); + + if (printer->alert_description && + (!ra || cupsArrayFind(ra, "printer-alert-description"))) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-alert-description", NULL, + printer->alert_description); + + if (!ra || cupsArrayFind(ra, "printer-current-time")) + ippAddDate(con->response, IPP_TAG_PRINTER, "printer-current-time", + ippTimeToDate(curtime)); + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + if (!ra || cupsArrayFind(ra, "printer-dns-sd-name")) + { + if (printer->reg_name) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, + "printer-dns-sd-name", NULL, printer->reg_name); + else + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, + "printer-dns-sd-name", 0); + } +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + if (!ra || cupsArrayFind(ra, "printer-error-policy")) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, + "printer-error-policy", NULL, printer->error_policy); + + if (!ra || cupsArrayFind(ra, "printer-error-policy-supported")) + { + static const char * const errors[] =/* printer-error-policy-supported values */ + { + "abort-job", + "retry-current-job", + "retry-job", + "stop-printer" + }; + + if (printer->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_CLASS)) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY, + "printer-error-policy-supported", NULL, "retry-current-job"); + else + ippAddStrings(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY, + "printer-error-policy-supported", + sizeof(errors) / sizeof(errors[0]), NULL, errors); + } + + if (!ra || cupsArrayFind(ra, "printer-icons")) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_icons, sizeof(printer_icons), + "http", NULL, con->servername, con->serverport, + "/icons/%s.png", printer->name); + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-icons", + NULL, printer_icons); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "printer-icons=\"%s\"", printer_icons); + } + + if (!ra || cupsArrayFind(ra, "printer-is-accepting-jobs")) + ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-accepting-jobs", + printer->accepting); + + if (!ra || cupsArrayFind(ra, "printer-is-shared")) + ippAddBoolean(con->response, IPP_TAG_PRINTER, "printer-is-shared", + printer->shared); + + if ((!ra || cupsArrayFind(ra, "printer-more-info")) && + !(printer->type & CUPS_PRINTER_DISCOVERED)) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), + "http", NULL, con->servername, con->serverport, + (printer->type & CUPS_PRINTER_CLASS) ? + "/classes/%s" : "/printers/%s", printer->name); + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-more-info", NULL, printer_uri); + } + + if (!ra || cupsArrayFind(ra, "printer-op-policy")) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_NAME, + "printer-op-policy", NULL, printer->op_policy); + + if (!ra || cupsArrayFind(ra, "printer-state")) + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", + printer->state); + + if (!ra || cupsArrayFind(ra, "printer-state-change-time")) + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "printer-state-change-time", printer->state_time); + + if (!ra || cupsArrayFind(ra, "printer-state-message")) + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-state-message", NULL, printer->state_message); + + if (!ra || cupsArrayFind(ra, "printer-state-reasons")) + add_printer_state_reasons(con, printer); + + if (!ra || cupsArrayFind(ra, "printer-type")) + { + int type; /* printer-type value */ + + /* + * Add the CUPS-specific printer-type attribute... + */ + + type = printer->type; + + if (printer == DefaultPrinter) + type |= CUPS_PRINTER_DEFAULT; + + if (!printer->accepting) + type |= CUPS_PRINTER_REJECTING; + + if (!printer->shared) + type |= CUPS_PRINTER_NOT_SHARED; + + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-type", + type); + } + + if (!ra || cupsArrayFind(ra, "printer-up-time")) + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "printer-up-time", curtime); + + if ((!ra || cupsArrayFind(ra, "printer-uri-supported")) && + !(printer->type & CUPS_PRINTER_DISCOVERED)) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), + "ipp", NULL, con->servername, con->serverport, + (printer->type & CUPS_PRINTER_CLASS) ? + "/classes/%s" : "/printers/%s", printer->name); + ippAddString(con->response, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-uri-supported", NULL, printer_uri); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "printer-uri-supported=\"%s\"", + printer_uri); + } + + if (!ra || cupsArrayFind(ra, "queued-job-count")) + add_queued_job_count(con, printer); + + copy_attrs(con->response, printer->attrs, ra, IPP_TAG_ZERO, 0, NULL); + if (printer->ppd_attrs) + copy_attrs(con->response, printer->ppd_attrs, ra, IPP_TAG_ZERO, 0, NULL); + copy_attrs(con->response, CommonData, ra, IPP_TAG_ZERO, IPP_TAG_COPY, NULL); +} + + +/* + * 'copy_subscription_attrs()' - Copy subscription attributes. + */ + +static void +copy_subscription_attrs( + cupsd_client_t *con, /* I - Client connection */ + cupsd_subscription_t *sub, /* I - Subscription */ + cups_array_t *ra, /* I - Requested attributes array */ + cups_array_t *exclude) /* I - Private attributes array */ +{ + ipp_attribute_t *attr; /* Current attribute */ + char printer_uri[HTTP_MAX_URI]; + /* Printer URI */ + int count; /* Number of events */ + unsigned mask; /* Current event mask */ + const char *name; /* Current event name */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "copy_subscription_attrs(con=%p, sub=%p, ra=%p, exclude=%p)", + con, sub, ra, exclude); + + /* + * Copy the subscription attributes to the response using the + * requested-attributes attribute that may be provided by the client. + */ + + if (!exclude || !cupsArrayFind(exclude, "all")) + { + if ((!exclude || !cupsArrayFind(exclude, "notify-events")) && + (!ra || cupsArrayFind(ra, "notify-events"))) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "copy_subscription_attrs: notify-events"); + + if ((name = cupsdEventName((cupsd_eventmask_t)sub->mask)) != NULL) + { + /* + * Simple event list... + */ + + ippAddString(con->response, IPP_TAG_SUBSCRIPTION, + (ipp_tag_t)(IPP_TAG_KEYWORD | IPP_TAG_COPY), + "notify-events", NULL, name); + } + else + { + /* + * Complex event list... + */ + + for (mask = 1, count = 0; mask < CUPSD_EVENT_ALL; mask <<= 1) + if (sub->mask & mask) + count ++; + + attr = ippAddStrings(con->response, IPP_TAG_SUBSCRIPTION, + (ipp_tag_t)(IPP_TAG_KEYWORD | IPP_TAG_COPY), + "notify-events", count, NULL, NULL); + + for (mask = 1, count = 0; mask < CUPSD_EVENT_ALL; mask <<= 1) + if (sub->mask & mask) + { + attr->values[count].string.text = + (char *)cupsdEventName((cupsd_eventmask_t)mask); + + count ++; + } + } + } + + if ((!exclude || !cupsArrayFind(exclude, "notify-lease-duration")) && + (!sub->job && (!ra || cupsArrayFind(ra, "notify-lease-duration")))) + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-lease-duration", sub->lease); + + if ((!exclude || !cupsArrayFind(exclude, "notify-recipient-uri")) && + (sub->recipient && (!ra || cupsArrayFind(ra, "notify-recipient-uri")))) + ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, + "notify-recipient-uri", NULL, sub->recipient); + else if ((!exclude || !cupsArrayFind(exclude, "notify-pull-method")) && + (!ra || cupsArrayFind(ra, "notify-pull-method"))) + ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, + "notify-pull-method", NULL, "ippget"); + + if ((!exclude || !cupsArrayFind(exclude, "notify-subscriber-user-name")) && + (!ra || cupsArrayFind(ra, "notify-subscriber-user-name"))) + ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_NAME, + "notify-subscriber-user-name", NULL, sub->owner); + + if ((!exclude || !cupsArrayFind(exclude, "notify-time-interval")) && + (!ra || cupsArrayFind(ra, "notify-time-interval"))) + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-time-interval", sub->interval); + + if (sub->user_data_len > 0 && + (!exclude || !cupsArrayFind(exclude, "notify-user-data")) && + (!ra || cupsArrayFind(ra, "notify-user-data"))) + ippAddOctetString(con->response, IPP_TAG_SUBSCRIPTION, "notify-user-data", + sub->user_data, sub->user_data_len); + } + + if (sub->job && (!ra || cupsArrayFind(ra, "notify-job-id"))) + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-job-id", sub->job->id); + + if (sub->dest && (!ra || cupsArrayFind(ra, "notify-printer-uri"))) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), + "ipp", NULL, con->servername, con->serverport, + "/printers/%s", sub->dest->name); + ippAddString(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, + "notify-printer-uri", NULL, printer_uri); + } + + if (!ra || cupsArrayFind(ra, "notify-subscription-id")) + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-subscription-id", sub->id); +} + + +/* + * 'create_job()' - Print a file to a printer or class. + */ + +static void +create_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + cupsd_printer_t *printer; /* Printer */ + cupsd_job_t *job; /* New job */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "create_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Create the job object... + */ + + if ((job = add_job(con, printer, NULL)) == NULL) + return; + + job->pending_timeout = 1; + + /* + * Save and log the job... + */ + + cupsdLogJob(job, CUPSD_LOG_INFO, "Queued on \"%s\" by \"%s\".", + job->dest, job->username); +} + + +/* + * 'create_requested_array()' - Create an array for the requested-attributes. + */ + +static cups_array_t * /* O - Array of attributes or NULL */ +create_requested_array(ipp_t *request) /* I - IPP request */ +{ + int i; /* Looping var */ + ipp_attribute_t *requested; /* requested-attributes attribute */ + cups_array_t *ra; /* Requested attributes array */ + char *value; /* Current value */ + + + /* + * Get the requested-attributes attribute, and return NULL if we don't + * have one... + */ + + if ((requested = ippFindAttribute(request, "requested-attributes", + IPP_TAG_KEYWORD)) == NULL) + return (NULL); + + /* + * If the attribute contains a single "all" keyword, return NULL... + */ + + if (requested->num_values == 1 && + !strcmp(requested->values[0].string.text, "all")) + return (NULL); + + /* + * Create an array using "strcmp" as the comparison function... + */ + + ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + for (i = 0; i < requested->num_values; i ++) + { + value = requested->values[i].string.text; + + if (!strcmp(value, "job-template")) + { + cupsArrayAdd(ra, "copies"); + cupsArrayAdd(ra, "copies-default"); + cupsArrayAdd(ra, "copies-supported"); + cupsArrayAdd(ra, "finishings"); + cupsArrayAdd(ra, "finishings-default"); + cupsArrayAdd(ra, "finishings-supported"); + cupsArrayAdd(ra, "job-hold-until"); + cupsArrayAdd(ra, "job-hold-until-default"); + cupsArrayAdd(ra, "job-hold-until-supported"); + cupsArrayAdd(ra, "job-priority"); + cupsArrayAdd(ra, "job-priority-default"); + cupsArrayAdd(ra, "job-priority-supported"); + cupsArrayAdd(ra, "job-sheets"); + cupsArrayAdd(ra, "job-sheets-default"); + cupsArrayAdd(ra, "job-sheets-supported"); + cupsArrayAdd(ra, "media"); + cupsArrayAdd(ra, "media-default"); + cupsArrayAdd(ra, "media-supported"); + cupsArrayAdd(ra, "multiple-document-handling"); + cupsArrayAdd(ra, "multiple-document-handling-default"); + cupsArrayAdd(ra, "multiple-document-handling-supported"); + cupsArrayAdd(ra, "number-up"); + cupsArrayAdd(ra, "number-up-default"); + cupsArrayAdd(ra, "number-up-supported"); + cupsArrayAdd(ra, "orientation-requested"); + cupsArrayAdd(ra, "orientation-requested-default"); + cupsArrayAdd(ra, "orientation-requested-supported"); + cupsArrayAdd(ra, "page-ranges"); + cupsArrayAdd(ra, "page-ranges-supported"); + cupsArrayAdd(ra, "printer-resolution"); + cupsArrayAdd(ra, "printer-resolution-default"); + cupsArrayAdd(ra, "printer-resolution-supported"); + cupsArrayAdd(ra, "print-quality"); + cupsArrayAdd(ra, "print-quality-default"); + cupsArrayAdd(ra, "print-quality-supported"); + cupsArrayAdd(ra, "sides"); + cupsArrayAdd(ra, "sides-default"); + cupsArrayAdd(ra, "sides-supported"); + } + else if (!strcmp(value, "job-description")) + { + cupsArrayAdd(ra, "date-time-at-completed"); + cupsArrayAdd(ra, "date-time-at-creation"); + cupsArrayAdd(ra, "date-time-at-processing"); + cupsArrayAdd(ra, "job-detailed-status-message"); + cupsArrayAdd(ra, "job-document-access-errors"); + cupsArrayAdd(ra, "job-id"); + cupsArrayAdd(ra, "job-impressions"); + cupsArrayAdd(ra, "job-impressions-completed"); + cupsArrayAdd(ra, "job-k-octets"); + cupsArrayAdd(ra, "job-k-octets-processed"); + cupsArrayAdd(ra, "job-media-progress"); + cupsArrayAdd(ra, "job-media-sheets"); + cupsArrayAdd(ra, "job-media-sheets-completed"); + cupsArrayAdd(ra, "job-message-from-operator"); + cupsArrayAdd(ra, "job-more-info"); + cupsArrayAdd(ra, "job-name"); + cupsArrayAdd(ra, "job-originating-user-name"); + cupsArrayAdd(ra, "job-printer-up-time"); + cupsArrayAdd(ra, "job-printer-uri"); + cupsArrayAdd(ra, "job-state"); + cupsArrayAdd(ra, "job-state-message"); + cupsArrayAdd(ra, "job-state-reasons"); + cupsArrayAdd(ra, "job-uri"); + cupsArrayAdd(ra, "number-of-documents"); + cupsArrayAdd(ra, "number-of-intervening-jobs"); + cupsArrayAdd(ra, "output-device-assigned"); + cupsArrayAdd(ra, "time-at-completed"); + cupsArrayAdd(ra, "time-at-creation"); + cupsArrayAdd(ra, "time-at-processing"); + } + else if (!strcmp(value, "printer-description")) + { + cupsArrayAdd(ra, "charset-configured"); + cupsArrayAdd(ra, "charset-supported"); + cupsArrayAdd(ra, "color-supported"); + cupsArrayAdd(ra, "compression-supported"); + cupsArrayAdd(ra, "document-format-default"); + cupsArrayAdd(ra, "document-format-supported"); + cupsArrayAdd(ra, "generated-natural-language-supported"); + cupsArrayAdd(ra, "ipp-versions-supported"); + cupsArrayAdd(ra, "job-impressions-supported"); + cupsArrayAdd(ra, "job-k-octets-supported"); + cupsArrayAdd(ra, "job-media-sheets-supported"); + cupsArrayAdd(ra, "job-settable-attributes-supported"); + cupsArrayAdd(ra, "multiple-document-jobs-supported"); + cupsArrayAdd(ra, "multiple-operation-time-out"); + cupsArrayAdd(ra, "natural-language-configured"); + cupsArrayAdd(ra, "notify-attributes-supported"); + cupsArrayAdd(ra, "notify-lease-duration-default"); + cupsArrayAdd(ra, "notify-lease-duration-supported"); + cupsArrayAdd(ra, "notify-max-events-supported"); + cupsArrayAdd(ra, "notify-events-default"); + cupsArrayAdd(ra, "notify-events-supported"); + cupsArrayAdd(ra, "notify-pull-method-supported"); + cupsArrayAdd(ra, "notify-schemes-supported"); + cupsArrayAdd(ra, "operations-supported"); + cupsArrayAdd(ra, "pages-per-minute"); + cupsArrayAdd(ra, "pages-per-minute-color"); + cupsArrayAdd(ra, "pdl-override-supported"); + cupsArrayAdd(ra, "printer-alert"); + cupsArrayAdd(ra, "printer-alert-description"); + cupsArrayAdd(ra, "printer-commands"); + cupsArrayAdd(ra, "printer-current-time"); + cupsArrayAdd(ra, "printer-driver-installer"); + cupsArrayAdd(ra, "printer-dns-sd-name"); + cupsArrayAdd(ra, "printer-info"); + cupsArrayAdd(ra, "printer-is-accepting-jobs"); + cupsArrayAdd(ra, "printer-location"); + cupsArrayAdd(ra, "printer-make-and-model"); + cupsArrayAdd(ra, "printer-message-from-operator"); + cupsArrayAdd(ra, "printer-more-info"); + cupsArrayAdd(ra, "printer-more-info-manufacturer"); + cupsArrayAdd(ra, "printer-name"); + cupsArrayAdd(ra, "printer-state"); + cupsArrayAdd(ra, "printer-state-message"); + cupsArrayAdd(ra, "printer-state-reasons"); + cupsArrayAdd(ra, "printer-settable-attributes-supported"); + cupsArrayAdd(ra, "printer-type"); + cupsArrayAdd(ra, "printer-up-time"); + cupsArrayAdd(ra, "printer-uri-supported"); + cupsArrayAdd(ra, "queued-job-count"); + cupsArrayAdd(ra, "reference-uri-schemes-supported"); + cupsArrayAdd(ra, "uri-authentication-supported"); + cupsArrayAdd(ra, "uri-security-supported"); + } + else if (!strcmp(value, "printer-defaults")) + { + char *name; /* Option name */ + + + for (name = (char *)cupsArrayFirst(CommonDefaults); + name; + name = (char *)cupsArrayNext(CommonDefaults)) + cupsArrayAdd(ra, name); + } + else if (!strcmp(value, "subscription-template")) + { + cupsArrayAdd(ra, "notify-attributes"); + cupsArrayAdd(ra, "notify-charset"); + cupsArrayAdd(ra, "notify-events"); + cupsArrayAdd(ra, "notify-lease-duration"); + cupsArrayAdd(ra, "notify-natural-language"); + cupsArrayAdd(ra, "notify-pull-method"); + cupsArrayAdd(ra, "notify-recipient-uri"); + cupsArrayAdd(ra, "notify-time-interval"); + cupsArrayAdd(ra, "notify-user-data"); + } + else + cupsArrayAdd(ra, value); + } + + return (ra); +} + + +/* + * 'create_subscription()' - Create a notification subscription. + */ + +static void +create_subscription( + cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Current attribute */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + char scheme[HTTP_MAX_URI], + /* Scheme portion of URI */ + userpass[HTTP_MAX_URI], + /* Username portion of URI */ + host[HTTP_MAX_URI], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_printer_t *printer; /* Printer/class */ + cupsd_job_t *job; /* Job */ + int jobid; /* Job ID */ + cupsd_subscription_t *sub; /* Subscription object */ + const char *username, /* requesting-user-name or + authenticated username */ + *recipient, /* notify-recipient-uri */ + *pullmethod; /* notify-pull-method */ + ipp_attribute_t *user_data; /* notify-user-data */ + int interval, /* notify-time-interval */ + lease; /* notify-lease-duration */ + unsigned mask; /* notify-events */ + ipp_attribute_t *notify_events,/* notify-events(-default) */ + *notify_lease; /* notify-lease-duration(-default) */ + + +#ifdef DEBUG + for (attr = con->request->attrs; attr; attr = attr->next) + { + if (attr->group_tag != IPP_TAG_ZERO) + cupsdLogMessage(CUPSD_LOG_DEBUG2, "g%04x v%04x %s", attr->group_tag, + attr->value_tag, attr->name); + else + cupsdLogMessage(CUPSD_LOG_DEBUG2, "----SEP----"); + } +#endif /* DEBUG */ + + /* + * Is the destination valid? + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdCreateSubscription(con=%p(%d), uri=\"%s\")", + con, con->http.fd, uri->values[0].string.text); + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), userpass, sizeof(userpass), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (!strcmp(resource, "/")) + { + dtype = (cups_ptype_t)0; + printer = NULL; + } + else if (!strncmp(resource, "/printers", 9) && strlen(resource) <= 10) + { + dtype = (cups_ptype_t)0; + printer = NULL; + } + else if (!strncmp(resource, "/classes", 8) && strlen(resource) <= 9) + { + dtype = CUPS_PRINTER_CLASS; + printer = NULL; + } + else if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if (printer) + { + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, + NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + } + else if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Get the user that is requesting the subscription... + */ + + username = get_username(con); + + /* + * Find the first subscription group attribute; return if we have + * none... + */ + + for (attr = con->request->attrs; attr; attr = attr->next) + if (attr->group_tag == IPP_TAG_SUBSCRIPTION) + break; + + if (!attr) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("No subscription attributes in request.")); + return; + } + + /* + * Process the subscription attributes in the request... + */ + + con->response->request.status.status_code = IPP_BAD_REQUEST; + + while (attr) + { + recipient = NULL; + pullmethod = NULL; + user_data = NULL; + interval = 0; + lease = DefaultLeaseDuration; + jobid = 0; + mask = CUPSD_EVENT_NONE; + + if (printer) + { + notify_events = ippFindAttribute(printer->attrs, "notify-events-default", + IPP_TAG_KEYWORD); + notify_lease = ippFindAttribute(printer->attrs, + "notify-lease-duration-default", + IPP_TAG_INTEGER); + + if (notify_lease) + lease = notify_lease->values[0].integer; + } + else + { + notify_events = NULL; + notify_lease = NULL; + } + + while (attr && attr->group_tag != IPP_TAG_ZERO) + { + if (!strcmp(attr->name, "notify-recipient-uri") && + attr->value_tag == IPP_TAG_URI) + { + /* + * Validate the recipient scheme against the ServerBin/notifier + * directory... + */ + + char notifier[1024]; /* Notifier filename */ + + + recipient = attr->values[0].string.text; + + if (httpSeparateURI(HTTP_URI_CODING_ALL, recipient, + scheme, sizeof(scheme), userpass, sizeof(userpass), + host, sizeof(host), &port, + resource, sizeof(resource)) < HTTP_URI_OK) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-recipient-uri \"%s\"."), recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + + snprintf(notifier, sizeof(notifier), "%s/notifier/%s", ServerBin, + scheme); + if (access(notifier, X_OK)) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("notify-recipient-uri URI \"%s\" uses unknown " + "scheme."), recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_URI_SCHEME); + return; + } + + if (!strcmp(scheme, "rss") && !check_rss_recipient(recipient)) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("notify-recipient-uri URI \"%s\" is already used."), + recipient); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_ATTRIBUTES); + return; + } + } + else if (!strcmp(attr->name, "notify-pull-method") && + attr->value_tag == IPP_TAG_KEYWORD) + { + pullmethod = attr->values[0].string.text; + + if (strcmp(pullmethod, "ippget")) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Bad notify-pull-method \"%s\"."), pullmethod); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_ENUM, + "notify-status-code", IPP_ATTRIBUTES); + return; + } + } + else if (!strcmp(attr->name, "notify-charset") && + attr->value_tag == IPP_TAG_CHARSET && + strcmp(attr->values[0].string.text, "us-ascii") && + strcmp(attr->values[0].string.text, "utf-8")) + { + send_ipp_status(con, IPP_CHARSET, + _("Character set \"%s\" not supported."), + attr->values[0].string.text); + return; + } + else if (!strcmp(attr->name, "notify-natural-language") && + (attr->value_tag != IPP_TAG_LANGUAGE || + strcmp(attr->values[0].string.text, DefaultLanguage))) + { + send_ipp_status(con, IPP_CHARSET, + _("Language \"%s\" not supported."), + attr->values[0].string.text); + return; + } + else if (!strcmp(attr->name, "notify-user-data") && + attr->value_tag == IPP_TAG_STRING) + { + if (attr->num_values > 1 || attr->values[0].unknown.length > 63) + { + send_ipp_status(con, IPP_REQUEST_VALUE, + _("The notify-user-data value is too large " + "(%d > 63 octets)."), + attr->values[0].unknown.length); + return; + } + + user_data = attr; + } + else if (!strcmp(attr->name, "notify-events") && + attr->value_tag == IPP_TAG_KEYWORD) + notify_events = attr; + else if (!strcmp(attr->name, "notify-lease-duration") && + attr->value_tag == IPP_TAG_INTEGER) + lease = attr->values[0].integer; + else if (!strcmp(attr->name, "notify-time-interval") && + attr->value_tag == IPP_TAG_INTEGER) + interval = attr->values[0].integer; + else if (!strcmp(attr->name, "notify-job-id") && + attr->value_tag == IPP_TAG_INTEGER) + jobid = attr->values[0].integer; + + attr = attr->next; + } + + if (notify_events) + { + for (i = 0; i < notify_events->num_values; i ++) + mask |= cupsdEventValue(notify_events->values[i].string.text); + } + + if (recipient) + cupsdLogMessage(CUPSD_LOG_DEBUG, "recipient=\"%s\"", recipient); + if (pullmethod) + cupsdLogMessage(CUPSD_LOG_DEBUG, "pullmethod=\"%s\"", pullmethod); + cupsdLogMessage(CUPSD_LOG_DEBUG, "notify-lease-duration=%d", lease); + cupsdLogMessage(CUPSD_LOG_DEBUG, "notify-time-interval=%d", interval); + + if (!recipient && !pullmethod) + break; + + if (mask == CUPSD_EVENT_NONE) + { + if (jobid) + mask = CUPSD_EVENT_JOB_COMPLETED; + else if (printer) + mask = CUPSD_EVENT_PRINTER_STATE_CHANGED; + else + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("notify-events not specified.")); + return; + } + } + + if (MaxLeaseDuration && (lease == 0 || lease > MaxLeaseDuration)) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "create_subscription: Limiting notify-lease-duration to " + "%d seconds.", + MaxLeaseDuration); + lease = MaxLeaseDuration; + } + + if (jobid) + { + if ((job = cupsdFindJob(jobid)) == NULL) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + jobid); + return; + } + } + else + job = NULL; + + if ((sub = cupsdAddSubscription(mask, printer, job, recipient, 0)) == NULL) + { + send_ipp_status(con, IPP_TOO_MANY_SUBSCRIPTIONS, + _("There are too many subscriptions.")); + return; + } + + if (job) + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added subscription #%d for job %d.", + sub->id, job->id); + else if (printer) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Added subscription #%d for printer \"%s\".", + sub->id, printer->name); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "Added subscription #%d for server.", + sub->id); + + sub->interval = interval; + sub->lease = lease; + sub->expire = lease ? time(NULL) + lease : 0; + + cupsdSetString(&sub->owner, username); + + if (user_data) + { + sub->user_data_len = user_data->values[0].unknown.length; + memcpy(sub->user_data, user_data->values[0].unknown.data, + sub->user_data_len); + } + + ippAddSeparator(con->response); + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-subscription-id", sub->id); + + con->response->request.status.status_code = IPP_OK; + + if (attr) + attr = attr->next; + } + + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); +} + + +/* + * 'delete_printer()' - Remove a printer or class from the system. + */ + +static void +delete_printer(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - URI of printer or class */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer/class */ + char filename[1024]; /* Script/PPD filename */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "delete_printer(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Do we have a valid URI? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Remove old jobs... + */ + + cupsdCancelJobs(printer->name, NULL, 1); + + /* + * Remove old subscriptions and send a "deleted printer" event... + */ + + cupsdAddEvent(CUPSD_EVENT_PRINTER_DELETED, printer, NULL, + "%s \"%s\" deleted by \"%s\".", + (dtype & CUPS_PRINTER_CLASS) ? "Class" : "Printer", + printer->name, get_username(con)); + + cupsdExpireSubscriptions(printer, NULL); + + /* + * Remove any old PPD or script files... + */ + + snprintf(filename, sizeof(filename), "%s/interfaces/%s", ServerRoot, + printer->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, + printer->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "%s/%s.png", CacheDir, printer->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "%s/%s.data", CacheDir, printer->name); + unlink(filename); + + /* + * Unregister color profiles... + */ + + cupsdCmsUnregisterPrinter(printer); +#ifdef __APPLE__ + /* + * FIXME: ideally the ColorSync stuff would be moved to colorsync.c + * and the colorsyncUnregisterPrinter() would be called from + * cupsdCmsUnregisterPrinter() in printers.c + */ + apple_unregister_profiles(printer); +#endif /* __APPLE__ */ + + if (dtype & CUPS_PRINTER_CLASS) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" deleted by \"%s\".", + printer->name, get_username(con)); + + cupsdDeletePrinter(printer, 0); + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + } + else + { + cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" deleted by \"%s\".", + printer->name, get_username(con)); + + if (cupsdDeletePrinter(printer, 0)) + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); + + /* + * Return with no errors... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_default()' - Get the default destination. + */ + +static void +get_default(cupsd_client_t *con) /* I - Client connection */ +{ + http_status_t status; /* Policy status */ + cups_array_t *ra; /* Requested attributes array */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_default(%p[%d])", con, con->http.fd); + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + if (DefaultPrinter) + { + ra = create_requested_array(con->request); + + copy_printer_attrs(con, DefaultPrinter, ra); + + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; + } + else + send_ipp_status(con, IPP_NOT_FOUND, _("No default printer.")); +} + + +/* + * 'get_devices()' - Get the list of available devices on the local system. + */ + +static void +get_devices(cupsd_client_t *con) /* I - Client connection */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *limit, /* limit attribute */ + *timeout, /* timeout attribute */ + *requested, /* requested-attributes attribute */ + *exclude, /* exclude-schemes attribute */ + *include; /* include-schemes attribute */ + char command[1024], /* cups-deviced command */ + options[2048], /* Options to pass to command */ + requested_str[256], + /* String for requested attributes */ + exclude_str[512], + /* String for excluded schemes */ + include_str[512]; + /* String for included schemes */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_devices(%p[%d])", con, con->http.fd); + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Run cups-deviced command with the given options... + */ + + limit = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER); + timeout = ippFindAttribute(con->request, "timeout", IPP_TAG_INTEGER); + requested = ippFindAttribute(con->request, "requested-attributes", + IPP_TAG_KEYWORD); + exclude = ippFindAttribute(con->request, "exclude-schemes", IPP_TAG_NAME); + include = ippFindAttribute(con->request, "include-schemes", IPP_TAG_NAME); + + if (requested) + url_encode_attr(requested, requested_str, sizeof(requested_str)); + else + strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str)); + + if (exclude) + url_encode_attr(exclude, exclude_str, sizeof(exclude_str)); + else + exclude_str[0] = '\0'; + + if (include) + url_encode_attr(include, include_str, sizeof(include_str)); + else + include_str[0] = '\0'; + + snprintf(command, sizeof(command), "%s/daemon/cups-deviced", ServerBin); + snprintf(options, sizeof(options), + "%d+%d+%d+%d+%s%s%s%s%s", + con->request->request.op.request_id, + limit ? limit->values[0].integer : 0, + timeout ? timeout->values[0].integer : 15, + (int)User, + requested_str, + exclude_str[0] ? "%20" : "", exclude_str, + include_str[0] ? "%20" : "", include_str); + + if (cupsdSendCommand(con, command, options, 1)) + { + /* + * Command started successfully, don't send an IPP response here... + */ + + ippDelete(con->response); + con->response = NULL; + } + else + { + /* + * Command failed, return "internal error" so the user knows something + * went wrong... + */ + + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("cups-deviced failed to execute.")); + } +} + + +/* + * 'get_document()' - Get a copy of a job file. + */ + +static void +get_document(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job URI */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + int docnum; /* Document number */ + cupsd_job_t *job; /* Current job */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + char filename[1024], /* Filename for document */ + format[1024]; /* Format for document */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_document(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, + job->username)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Get the document number... + */ + + if ((attr = ippFindAttribute(con->request, "document-number", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing document-number attribute.")); + return; + } + + if ((docnum = attr->values[0].integer) < 1 || docnum > job->num_files || + attr->num_values > 1) + { + send_ipp_status(con, IPP_NOT_FOUND, + _("Document #%d does not exist in job #%d."), docnum, + jobid); + return; + } + + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, jobid, + docnum); + if ((con->file = open(filename, O_RDONLY)) == -1) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open document %d in job %d - %s", docnum, jobid, + strerror(errno)); + send_ipp_status(con, IPP_NOT_FOUND, + _("Unable to open document #%d in job #%d."), docnum, + jobid); + return; + } + + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + + cupsdLoadJob(job); + + snprintf(format, sizeof(format), "%s/%s", job->filetypes[docnum - 1]->super, + job->filetypes[docnum - 1]->type); + + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_MIMETYPE, "document-format", + NULL, format); + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "document-number", + docnum); + if ((attr = ippFindAttribute(job->attrs, "document-name", + IPP_TAG_NAME)) != NULL) + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_NAME, "document-name", + NULL, attr->values[0].string.text); +} + + +/* + * 'get_job_attrs()' - Get job attributes. + */ + +static void +get_job_attrs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job URI */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + cupsd_job_t *job; /* Current job */ + cupsd_printer_t *printer; /* Current printer */ + cupsd_policy_t *policy; /* Current security policy */ + char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cups_array_t *ra, /* Requested attributes array */ + *exclude; /* Private attributes array */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_job_attrs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * Check policy... + */ + + if ((printer = job->printer) == NULL) + printer = cupsdFindDest(job->dest); + + if (printer) + policy = printer->op_policy_ptr; + else + policy = DefaultPolicyPtr; + + if ((status = cupsdCheckPolicy(policy, con, job->username)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + exclude = cupsdGetPrivateAttrs(policy, con, printer, job->username); + + /* + * Copy attributes... + */ + + cupsdLoadJob(job); + + ra = create_requested_array(con->request); + copy_job_attrs(con, job, ra, exclude); + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_jobs()' - Get a list of jobs for the specified printer. + */ + +static void +get_jobs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr; /* Current attribute */ + const char *dest; /* Destination */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cups_ptype_t dmask; /* Destination type mask */ + char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + int job_comparison; /* Job comparison */ + ipp_jstate_t job_state; /* job-state value */ + int first_job_id; /* First job ID */ + int limit; /* Maximum number of jobs to return */ + int count; /* Number of jobs that match */ + ipp_attribute_t *job_ids; /* job-ids attribute */ + cupsd_job_t *job; /* Current job pointer */ + cupsd_printer_t *printer; /* Printer */ + cups_array_t *list; /* Which job list... */ + cups_array_t *ra, /* Requested attributes array */ + *exclude; /* Private attributes array */ + cupsd_policy_t *policy; /* Current policy */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs(%p[%d], %s)", con, con->http.fd, + uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (strcmp(uri->name, "printer-uri")) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("No printer-uri in request.")); + return; + } + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (!strcmp(resource, "/") || !strcmp(resource, "/jobs")) + { + dest = NULL; + dtype = (cups_ptype_t)0; + dmask = (cups_ptype_t)0; + printer = NULL; + } + else if (!strncmp(resource, "/printers", 9) && strlen(resource) <= 10) + { + dest = NULL; + dtype = (cups_ptype_t)0; + dmask = CUPS_PRINTER_CLASS; + printer = NULL; + } + else if (!strncmp(resource, "/classes", 8) && strlen(resource) <= 9) + { + dest = NULL; + dtype = CUPS_PRINTER_CLASS; + dmask = CUPS_PRINTER_CLASS; + printer = NULL; + } + else if ((dest = cupsdValidateDest(uri->values[0].string.text, &dtype, + &printer)) == NULL) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + else + { + dtype &= CUPS_PRINTER_CLASS; + dmask = CUPS_PRINTER_CLASS; + } + + /* + * Check policy... + */ + + if (printer) + policy = printer->op_policy_ptr; + else + policy = DefaultPolicyPtr; + + if ((status = cupsdCheckPolicy(policy, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + job_ids = ippFindAttribute(con->request, "job-ids", IPP_TAG_INTEGER); + + /* + * See if the "which-jobs" attribute have been specified... + */ + + if ((attr = ippFindAttribute(con->request, "which-jobs", + IPP_TAG_KEYWORD)) != NULL && job_ids) + { + send_ipp_status(con, IPP_CONFLICT, + _("The %s attribute cannot be provided with job-ids."), + "which-jobs"); + return; + } + else if (!attr || !strcmp(attr->values[0].string.text, "not-completed")) + { + job_comparison = -1; + job_state = IPP_JOB_STOPPED; + list = Jobs; + } + else if (!strcmp(attr->values[0].string.text, "completed")) + { + job_comparison = 1; + job_state = IPP_JOB_CANCELED; + list = Jobs; + } + else if (!strcmp(attr->values[0].string.text, "aborted")) + { + job_comparison = 0; + job_state = IPP_JOB_ABORTED; + list = Jobs; + } + else if (!strcmp(attr->values[0].string.text, "all")) + { + job_comparison = 1; + job_state = IPP_JOB_PENDING; + list = Jobs; + } + else if (!strcmp(attr->values[0].string.text, "canceled")) + { + job_comparison = 0; + job_state = IPP_JOB_CANCELED; + list = Jobs; + } + else if (!strcmp(attr->values[0].string.text, "pending")) + { + job_comparison = 0; + job_state = IPP_JOB_PENDING; + list = ActiveJobs; + } + else if (!strcmp(attr->values[0].string.text, "pending-held")) + { + job_comparison = 0; + job_state = IPP_JOB_HELD; + list = ActiveJobs; + } + else if (!strcmp(attr->values[0].string.text, "processing")) + { + job_comparison = 0; + job_state = IPP_JOB_PROCESSING; + list = PrintingJobs; + } + else if (!strcmp(attr->values[0].string.text, "processing-stopped")) + { + job_comparison = 0; + job_state = IPP_JOB_STOPPED; + list = ActiveJobs; + } + else + { + send_ipp_status(con, IPP_ATTRIBUTES, + _("The which-jobs value \"%s\" is not supported."), + attr->values[0].string.text); + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, + "which-jobs", NULL, attr->values[0].string.text); + return; + } + + /* + * See if they want to limit the number of jobs reported... + */ + + if ((attr = ippFindAttribute(con->request, "limit", + IPP_TAG_INTEGER)) != NULL) + { + if (job_ids) + { + send_ipp_status(con, IPP_CONFLICT, + _("The %s attribute cannot be provided with job-ids."), + "limit"); + return; + } + + limit = attr->values[0].integer; + } + else + limit = 0; + + if ((attr = ippFindAttribute(con->request, "first-job-id", + IPP_TAG_INTEGER)) != NULL) + { + if (job_ids) + { + send_ipp_status(con, IPP_CONFLICT, + _("The %s attribute cannot be provided with job-ids."), + "first-job-id"); + return; + } + + first_job_id = attr->values[0].integer; + } + else + first_job_id = 1; + + /* + * See if we only want to see jobs for a specific user... + */ + + if ((attr = ippFindAttribute(con->request, "my-jobs", + IPP_TAG_BOOLEAN)) != NULL && job_ids) + { + send_ipp_status(con, IPP_CONFLICT, + _("The %s attribute cannot be provided with job-ids."), + "my-jobs"); + return; + } + else if (attr && attr->values[0].boolean) + strlcpy(username, get_username(con), sizeof(username)); + else + username[0] = '\0'; + + if ((ra = create_requested_array(con->request)) == NULL && + !ippFindAttribute(con->request, "requested-attributes", IPP_TAG_KEYWORD)) + { + /* + * IPP conformance - Get-Jobs has a default requested-attributes value of + * "job-id" and "job-uri". + */ + + ra = cupsArrayNew((cups_array_func_t)strcmp, NULL); + cupsArrayAdd(ra, "job-id"); + cupsArrayAdd(ra, "job-uri"); + } + + /* + * OK, build a list of jobs for this printer... + */ + + if (job_ids) + { + int i; /* Looping var */ + + for (i = 0; i < job_ids->num_values; i ++) + { + if (!cupsdFindJob(job_ids->values[i].integer)) + break; + } + + if (i < job_ids->num_values) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + job_ids->values[i].integer); + return; + } + + for (i = 0; i < job_ids->num_values; i ++) + { + job = cupsdFindJob(job_ids->values[i].integer); + + cupsdLoadJob(job); + + if (!job->attrs) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", + job->id); + continue; + } + + if (i > 0) + ippAddSeparator(con->response); + + exclude = cupsdGetPrivateAttrs(job->printer ? + job->printer->op_policy_ptr : + policy, con, job->printer, + job->username); + + copy_job_attrs(con, job, ra, exclude); + } + } + else + { + for (count = 0, job = (cupsd_job_t *)cupsArrayFirst(list); + (limit <= 0 || count < limit) && job; + job = (cupsd_job_t *)cupsArrayNext(list)) + { + /* + * Filter out jobs that don't match... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_jobs: job->id=%d, dest=\"%s\", username=\"%s\", " + "state_value=%d, attrs=%p", job->id, job->dest, + job->username, job->state_value, job->attrs); + + if (!job->dest || !job->username) + cupsdLoadJob(job); + + if (!job->dest || !job->username) + continue; + + if ((dest && strcmp(job->dest, dest)) && + (!job->printer || !dest || strcmp(job->printer->name, dest))) + continue; + if ((job->dtype & dmask) != dtype && + (!job->printer || (job->printer->type & dmask) != dtype)) + continue; + + if ((job_comparison < 0 && job->state_value > job_state) || + (job_comparison == 0 && job->state_value != job_state) || + (job_comparison > 0 && job->state_value < job_state)) + continue; + + if (job->id < first_job_id) + continue; + + cupsdLoadJob(job); + + if (!job->attrs) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: No attributes for job %d", + job->id); + continue; + } + + if (username[0] && _cups_strcasecmp(username, job->username)) + continue; + + if (count > 0) + ippAddSeparator(con->response); + + count ++; + + exclude = cupsdGetPrivateAttrs(job->printer ? + job->printer->op_policy_ptr : + policy, con, job->printer, + job->username); + + copy_job_attrs(con, job, ra, exclude); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_jobs: count=%d", count); + } + + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_notifications()' - Get events for a subscription. + */ + +static void +get_notifications(cupsd_client_t *con) /* I - Client connection */ +{ + int i, j; /* Looping vars */ + http_status_t status; /* Policy status */ + cupsd_subscription_t *sub; /* Subscription */ + ipp_attribute_t *ids, /* notify-subscription-ids */ + *sequences; /* notify-sequence-numbers */ + int min_seq; /* Minimum sequence number */ + int interval; /* Poll interval */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_notifications(con=%p[%d])", + con, con->http.fd); + + /* + * Get subscription attributes... + */ + + ids = ippFindAttribute(con->request, "notify-subscription-ids", + IPP_TAG_INTEGER); + sequences = ippFindAttribute(con->request, "notify-sequence-numbers", + IPP_TAG_INTEGER); + + if (!ids) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing notify-subscription-ids attribute.")); + return; + } + + /* + * Are the subscription IDs valid? + */ + + for (i = 0, interval = 60; i < ids->num_values; i ++) + { + if ((sub = cupsdFindSubscription(ids->values[i].integer)) == NULL) + { + /* + * Bad subscription ID... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + ids->values[i].integer); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : + DefaultPolicyPtr, + con, sub->owner)) != HTTP_OK) + { + send_http_error(con, status, sub->dest); + return; + } + + /* + * Check the subscription type and update the interval accordingly. + */ + + if (sub->job && sub->job->state_value == IPP_JOB_PROCESSING && + interval > 10) + interval = 10; + else if (sub->job && sub->job->state_value >= IPP_JOB_STOPPED) + interval = 0; + else if (sub->dest && sub->dest->state == IPP_PRINTER_PROCESSING && + interval > 30) + interval = 30; + } + + /* + * Tell the client to poll again in N seconds... + */ + + if (interval > 0) + ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "notify-get-interval", interval); + + ippAddInteger(con->response, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "printer-up-time", time(NULL)); + + /* + * Copy the subscription event attributes to the response. + */ + + con->response->request.status.status_code = + interval ? IPP_OK : IPP_OK_EVENTS_COMPLETE; + + for (i = 0; i < ids->num_values; i ++) + { + /* + * Get the subscription and sequence number... + */ + + sub = cupsdFindSubscription(ids->values[i].integer); + + if (sequences && i < sequences->num_values) + min_seq = sequences->values[i].integer; + else + min_seq = 1; + + /* + * If we don't have any new events, nothing to do here... + */ + + if (min_seq > (sub->first_event_id + cupsArrayCount(sub->events))) + continue; + + /* + * Otherwise copy all of the new events... + */ + + if (sub->first_event_id > min_seq) + j = 0; + else + j = min_seq - sub->first_event_id; + + for (; j < cupsArrayCount(sub->events); j ++) + { + ippAddSeparator(con->response); + + copy_attrs(con->response, + ((cupsd_event_t *)cupsArrayIndex(sub->events, j))->attrs, NULL, + IPP_TAG_EVENT_NOTIFICATION, 0, NULL); + } + } +} + + +/* + * 'get_ppd()' - Get a named PPD from the local system. + */ + +static void +get_ppd(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI or PPD name */ +{ + http_status_t status; /* Policy status */ + cupsd_printer_t *dest; /* Destination */ + cups_ptype_t dtype; /* Destination type */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppd(%p[%d], %p[%s=%s])", con, + con->http.fd, uri, uri->name, uri->values[0].string.text); + + if (!strcmp(uri->name, "ppd-name")) + { + /* + * Return a PPD file from cups-driverd... + */ + + char command[1024], /* cups-driverd command */ + options[1024], /* Options to pass to command */ + ppd_name[1024]; /* ppd-name */ + + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Run cups-driverd command with the given options... + */ + + snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin); + url_encode_string(uri->values[0].string.text, ppd_name, sizeof(ppd_name)); + snprintf(options, sizeof(options), "get+%d+%s", + con->request->request.op.request_id, ppd_name); + + if (cupsdSendCommand(con, command, options, 0)) + { + /* + * Command started successfully, don't send an IPP response here... + */ + + ippDelete(con->response); + con->response = NULL; + } + else + { + /* + * Command failed, return "internal error" so the user knows something + * went wrong... + */ + + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("cups-driverd failed to execute.")); + } + } + else if (!strcmp(uri->name, "printer-uri") && + cupsdValidateDest(uri->values[0].string.text, &dtype, &dest)) + { + int i; /* Looping var */ + char filename[1024]; /* PPD filename */ + + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(dest->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, dest); + return; + } + + /* + * See if we need the PPD for a class or remote printer... + */ + + snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, + dest->name); + + if ((dtype & CUPS_PRINTER_REMOTE) && access(filename, 0)) + { + con->response->request.status.status_code = CUPS_SEE_OTHER; + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, dest->uri); + return; + } + else if (dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + for (i = 0; i < dest->num_printers; i ++) + if (!(dest->printers[i]->type & + (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT))) + { + snprintf(filename, sizeof(filename), "%s/ppd/%s.ppd", ServerRoot, + dest->printers[i]->name); + + if (!access(filename, 0)) + break; + } + + if (i < dest->num_printers) + dest = dest->printers[i]; + else + { + con->response->request.status.status_code = CUPS_SEE_OTHER; + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, dest->printers[0]->uri); + return; + } + } + + /* + * Found the printer with the PPD file, now see if there is one... + */ + + if ((con->file = open(filename, O_RDONLY)) < 0) + { + send_ipp_status(con, IPP_NOT_FOUND, + _("The PPD file \"%s\" could not be opened: %s"), + uri->values[0].string.text, strerror(errno)); + return; + } + + fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); + + con->pipe_pid = 0; + + con->response->request.status.status_code = IPP_OK; + } + else + send_ipp_status(con, IPP_NOT_FOUND, + _("The PPD file \"%s\" could not be found."), + uri->values[0].string.text); +} + + +/* + * 'get_ppds()' - Get the list of PPD files on the local system. + */ + +static void +get_ppds(cupsd_client_t *con) /* I - Client connection */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *limit, /* Limit attribute */ + *device, /* ppd-device-id attribute */ + *language, /* ppd-natural-language attribute */ + *make, /* ppd-make attribute */ + *model, /* ppd-make-and-model attribute */ + *model_number, /* ppd-model-number attribute */ + *product, /* ppd-product attribute */ + *psversion, /* ppd-psverion attribute */ + *type, /* ppd-type attribute */ + *requested, /* requested-attributes attribute */ + *exclude, /* exclude-schemes attribute */ + *include; /* include-schemes attribute */ + char command[1024], /* cups-driverd command */ + options[4096], /* Options to pass to command */ + device_str[256],/* Escaped ppd-device-id string */ + language_str[256], + /* Escaped ppd-natural-language */ + make_str[256], /* Escaped ppd-make string */ + model_str[256], /* Escaped ppd-make-and-model string */ + model_number_str[256], + /* ppd-model-number string */ + product_str[256], + /* Escaped ppd-product string */ + psversion_str[256], + /* Escaped ppd-psversion string */ + type_str[256], /* Escaped ppd-type string */ + requested_str[256], + /* String for requested attributes */ + exclude_str[512], + /* String for excluded schemes */ + include_str[512]; + /* String for included schemes */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_ppds(%p[%d])", con, con->http.fd); + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Run cups-driverd command with the given options... + */ + + limit = ippFindAttribute(con->request, "limit", IPP_TAG_INTEGER); + device = ippFindAttribute(con->request, "ppd-device-id", IPP_TAG_TEXT); + language = ippFindAttribute(con->request, "ppd-natural-language", + IPP_TAG_LANGUAGE); + make = ippFindAttribute(con->request, "ppd-make", IPP_TAG_TEXT); + model = ippFindAttribute(con->request, "ppd-make-and-model", + IPP_TAG_TEXT); + model_number = ippFindAttribute(con->request, "ppd-model-number", + IPP_TAG_INTEGER); + product = ippFindAttribute(con->request, "ppd-product", IPP_TAG_TEXT); + psversion = ippFindAttribute(con->request, "ppd-psversion", IPP_TAG_TEXT); + type = ippFindAttribute(con->request, "ppd-type", IPP_TAG_KEYWORD); + requested = ippFindAttribute(con->request, "requested-attributes", + IPP_TAG_KEYWORD); + exclude = ippFindAttribute(con->request, "exclude-schemes", + IPP_TAG_NAME); + include = ippFindAttribute(con->request, "include-schemes", + IPP_TAG_NAME); + + if (requested) + url_encode_attr(requested, requested_str, sizeof(requested_str)); + else + strlcpy(requested_str, "requested-attributes=all", sizeof(requested_str)); + + if (device) + url_encode_attr(device, device_str, sizeof(device_str)); + else + device_str[0] = '\0'; + + if (language) + url_encode_attr(language, language_str, sizeof(language_str)); + else + language_str[0] = '\0'; + + if (make) + url_encode_attr(make, make_str, sizeof(make_str)); + else + make_str[0] = '\0'; + + if (model) + url_encode_attr(model, model_str, sizeof(model_str)); + else + model_str[0] = '\0'; + + if (model_number) + snprintf(model_number_str, sizeof(model_number_str), "ppd-model-number=%d", + model_number->values[0].integer); + else + model_number_str[0] = '\0'; + + if (product) + url_encode_attr(product, product_str, sizeof(product_str)); + else + product_str[0] = '\0'; + + if (psversion) + url_encode_attr(psversion, psversion_str, sizeof(psversion_str)); + else + psversion_str[0] = '\0'; + + if (type) + url_encode_attr(type, type_str, sizeof(type_str)); + else + type_str[0] = '\0'; + + if (exclude) + url_encode_attr(exclude, exclude_str, sizeof(exclude_str)); + else + exclude_str[0] = '\0'; + + if (include) + url_encode_attr(include, include_str, sizeof(include_str)); + else + include_str[0] = '\0'; + + snprintf(command, sizeof(command), "%s/daemon/cups-driverd", ServerBin); + snprintf(options, sizeof(options), + "list+%d+%d+%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + con->request->request.op.request_id, + limit ? limit->values[0].integer : 0, + requested_str, + device ? "%20" : "", device_str, + language ? "%20" : "", language_str, + make ? "%20" : "", make_str, + model ? "%20" : "", model_str, + model_number ? "%20" : "", model_number_str, + product ? "%20" : "", product_str, + psversion ? "%20" : "", psversion_str, + type ? "%20" : "", type_str, + exclude_str[0] ? "%20" : "", exclude_str, + include_str[0] ? "%20" : "", include_str); + + if (cupsdSendCommand(con, command, options, 0)) + { + /* + * Command started successfully, don't send an IPP response here... + */ + + ippDelete(con->response); + con->response = NULL; + } + else + { + /* + * Command failed, return "internal error" so the user knows something + * went wrong... + */ + + send_ipp_status(con, IPP_INTERNAL_ERROR, + _("cups-driverd failed to execute.")); + } +} + + +/* + * 'get_printer_attrs()' - Get printer attributes. + */ + +static void +get_printer_attrs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer/class */ + cups_array_t *ra; /* Requested attributes array */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_attrs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Send the attributes... + */ + + ra = create_requested_array(con->request); + + copy_printer_attrs(con, printer, ra); + + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_printer_supported()' - Get printer supported values. + */ + +static void +get_printer_supported( + cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer/class */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printer_supported(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Return a list of attributes that can be set via Set-Printer-Attributes. + */ + + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, + "printer-info", 0); + ippAddInteger(con->response, IPP_TAG_PRINTER, IPP_TAG_ADMINDEFINE, + "printer-location", 0); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_printers()' - Get a list of printers or classes. + */ + +static void +get_printers(cupsd_client_t *con, /* I - Client connection */ + int type) /* I - 0 or CUPS_PRINTER_CLASS */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr; /* Current attribute */ + int limit; /* Max number of printers to return */ + int count; /* Number of printers that match */ + cupsd_printer_t *printer; /* Current printer pointer */ + int printer_type, /* printer-type attribute */ + printer_mask; /* printer-type-mask attribute */ + char *location; /* Location string */ + const char *username; /* Current user */ + char *first_printer_name; /* first-printer-name attribute */ + cups_array_t *ra; /* Requested attributes array */ + int local; /* Local connection? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_printers(%p[%d], %x)", con, + con->http.fd, type); + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Check for printers... + */ + + if (!Printers || !cupsArrayCount(Printers)) + { + send_ipp_status(con, IPP_NOT_FOUND, _("No destinations added.")); + return; + } + + /* + * See if they want to limit the number of printers reported... + */ + + if ((attr = ippFindAttribute(con->request, "limit", + IPP_TAG_INTEGER)) != NULL) + limit = attr->values[0].integer; + else + limit = 10000000; + + if ((attr = ippFindAttribute(con->request, "first-printer-name", + IPP_TAG_NAME)) != NULL) + first_printer_name = attr->values[0].string.text; + else + first_printer_name = NULL; + + /* + * Support filtering... + */ + + if ((attr = ippFindAttribute(con->request, "printer-type", + IPP_TAG_ENUM)) != NULL) + printer_type = attr->values[0].integer; + else + printer_type = 0; + + if ((attr = ippFindAttribute(con->request, "printer-type-mask", + IPP_TAG_ENUM)) != NULL) + printer_mask = attr->values[0].integer; + else + printer_mask = 0; + + local = httpAddrLocalhost(&(con->clientaddr)); + + if ((attr = ippFindAttribute(con->request, "printer-location", + IPP_TAG_TEXT)) != NULL) + location = attr->values[0].string.text; + else + location = NULL; + + if (con->username[0]) + username = con->username; + else if ((attr = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + username = attr->values[0].string.text; + else + username = NULL; + + ra = create_requested_array(con->request); + + /* + * OK, build a list of printers for this printer... + */ + + if (first_printer_name) + { + if ((printer = cupsdFindDest(first_printer_name)) == NULL) + printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + } + else + printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + + for (count = 0; + count < limit && printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + if (!local && !printer->shared) + continue; + + if ((!type || (printer->type & CUPS_PRINTER_CLASS) == type) && + (printer->type & printer_mask) == printer_type && + (!location || + (printer->location && !_cups_strcasecmp(printer->location, location)))) + { + /* + * If HideImplicitMembers is enabled, see if this printer or class + * is a member of an implicit class... + */ + + if (ImplicitClasses && HideImplicitMembers && + printer->in_implicit_class) + continue; + + /* + * If a username is specified, see if it is allowed or denied + * access... + */ + + if (cupsArrayCount(printer->users) && username && + !user_allowed(printer, username)) + continue; + + /* + * Add the group separator as needed... + */ + + if (count > 0) + ippAddSeparator(con->response); + + count ++; + + /* + * Send the attributes... + */ + + copy_printer_attrs(con, printer, ra); + } + } + + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_subscription_attrs()' - Get subscription attributes. + */ + +static void +get_subscription_attrs( + cupsd_client_t *con, /* I - Client connection */ + int sub_id) /* I - Subscription ID */ +{ + http_status_t status; /* Policy status */ + cupsd_subscription_t *sub; /* Subscription */ + cupsd_policy_t *policy; /* Current security policy */ + cups_array_t *ra, /* Requested attributes array */ + *exclude; /* Private attributes array */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_subscription_attrs(con=%p[%d], sub_id=%d)", + con, con->http.fd, sub_id); + + /* + * Is the subscription ID valid? + */ + + if ((sub = cupsdFindSubscription(sub_id)) == NULL) + { + /* + * Bad subscription ID... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + sub_id); + return; + } + + /* + * Check policy... + */ + + if (sub->dest) + policy = sub->dest->op_policy_ptr; + else + policy = DefaultPolicyPtr; + + if ((status = cupsdCheckPolicy(policy, con, sub->owner)) != HTTP_OK) + { + send_http_error(con, status, sub->dest); + return; + } + + exclude = cupsdGetPrivateAttrs(policy, con, sub->dest, sub->owner); + + /* + * Copy the subscription attributes to the response using the + * requested-attributes attribute that may be provided by the client. + */ + + ra = create_requested_array(con->request); + + copy_subscription_attrs(con, sub, ra, exclude); + + cupsArrayDelete(ra); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'get_subscriptions()' - Get subscriptions. + */ + +static void +get_subscriptions(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer/job URI */ +{ + http_status_t status; /* Policy status */ + int count; /* Number of subscriptions */ + int limit; /* Limit */ + cupsd_subscription_t *sub; /* Subscription */ + cups_array_t *ra; /* Requested attributes array */ + ipp_attribute_t *attr; /* Attribute */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + char scheme[HTTP_MAX_URI], + /* Scheme portion of URI */ + username[HTTP_MAX_URI], + /* Username portion of URI */ + host[HTTP_MAX_URI], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_job_t *job; /* Job pointer */ + cupsd_printer_t *printer; /* Printer */ + cupsd_policy_t *policy; /* Policy */ + cups_array_t *exclude; /* Private attributes array */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_subscriptions(con=%p[%d], uri=%s)", + con, con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (!strcmp(resource, "/") || + (!strncmp(resource, "/jobs", 5) && strlen(resource) <= 6) || + (!strncmp(resource, "/printers", 9) && strlen(resource) <= 10) || + (!strncmp(resource, "/classes", 8) && strlen(resource) <= 9)) + { + printer = NULL; + job = NULL; + } + else if (!strncmp(resource, "/jobs/", 6) && resource[6]) + { + printer = NULL; + job = cupsdFindJob(atoi(resource + 6)); + + if (!job) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + atoi(resource + 6)); + return; + } + } + else if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + else if ((attr = ippFindAttribute(con->request, "notify-job-id", + IPP_TAG_INTEGER)) != NULL) + { + job = cupsdFindJob(attr->values[0].integer); + + if (!job) + { + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), + attr->values[0].integer); + return; + } + } + else + job = NULL; + + /* + * Check policy... + */ + + if (printer) + policy = printer->op_policy_ptr; + else + policy = DefaultPolicyPtr; + + if ((status = cupsdCheckPolicy(policy, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Copy the subscription attributes to the response using the + * requested-attributes attribute that may be provided by the client. + */ + + ra = create_requested_array(con->request); + + if ((attr = ippFindAttribute(con->request, "limit", + IPP_TAG_INTEGER)) != NULL) + limit = attr->values[0].integer; + else + limit = 0; + + /* + * See if we only want to see subscriptions for a specific user... + */ + + if ((attr = ippFindAttribute(con->request, "my-subscriptions", + IPP_TAG_BOOLEAN)) != NULL && + attr->values[0].boolean) + strlcpy(username, get_username(con), sizeof(username)); + else + username[0] = '\0'; + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), count = 0; + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if ((!printer || sub->dest == printer) && (!job || sub->job == job) && + (!username[0] || !_cups_strcasecmp(username, sub->owner))) + { + ippAddSeparator(con->response); + + exclude = cupsdGetPrivateAttrs(sub->dest ? sub->dest->op_policy_ptr : + policy, con, sub->dest, + sub->owner); + + copy_subscription_attrs(con, sub, ra, exclude); + + count ++; + if (limit && count >= limit) + break; + } + + cupsArrayDelete(ra); + + if (count) + con->response->request.status.status_code = IPP_OK; + else + send_ipp_status(con, IPP_NOT_FOUND, _("No subscriptions found.")); +} + + +/* + * 'get_username()' - Get the username associated with a request. + */ + +static const char * /* O - Username */ +get_username(cupsd_client_t *con) /* I - Connection */ +{ + ipp_attribute_t *attr; /* Attribute */ + + + if (con->username[0]) + return (con->username); + else if ((attr = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + return (attr->values[0].string.text); + else + return ("anonymous"); +} + + +/* + * 'hold_job()' - Hold a print job. + */ + +static void +hold_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job or Printer URI */ +{ + ipp_attribute_t *attr; /* Current job-hold-until */ + const char *when; /* New value */ + int jobid; /* Job ID */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_job_t *job; /* Job information */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_job(%p[%d], %s)", con, con->http.fd, + uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * See if the job is in a state that allows holding... + */ + + if (job->state_value > IPP_JOB_STOPPED) + { + /* + * Return a "not-possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is finished and cannot be altered."), + job->id); + return; + } + + /* + * Hold the job and return... + */ + + if ((attr = ippFindAttribute(con->request, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME); + + if (attr) + { + when = attr->values[0].string.text; + + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, + "Job job-hold-until value changed by user."); + } + else + when = "indefinite"; + + cupsdSetJobHoldUntil(job, when, 1); + cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", + username); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'hold_new_jobs()' - Hold pending/new jobs on a printer or class. + */ + +static void +hold_new_jobs(cupsd_client_t *con, /* I - Connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "hold_new_jobs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Hold pending/new jobs sent to the printer... + */ + + printer->holding_new_jobs = 1; + + cupsdSetPrinterReasons(printer, "+hold-new-jobs"); + + if (dtype & CUPS_PRINTER_CLASS) + cupsdLogMessage(CUPSD_LOG_INFO, + "Class \"%s\" now holding pending/new jobs (\"%s\").", + printer->name, get_username(con)); + else + cupsdLogMessage(CUPSD_LOG_INFO, + "Printer \"%s\" now holding pending/new jobs (\"%s\").", + printer->name, get_username(con)); + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'move_job()' - Move a job to a new destination. + */ + +static void +move_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job URI */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + cupsd_job_t *job; /* Current job */ + const char *src; /* Source printer/class */ + cups_ptype_t stype, /* Source type (printer or class) */ + dtype; /* Destination type (printer/class) */ + char scheme[HTTP_MAX_URI], /* Scheme portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_printer_t *sprinter, /* Source printer */ + *dprinter; /* Destination printer */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "move_job(%p[%d], %s)", con, con->http.fd, + uri->values[0].string.text); + + /* + * Get the new printer or class... + */ + + if ((attr = ippFindAttribute(con->request, "job-printer-uri", + IPP_TAG_URI)) == NULL) + { + /* + * Need job-printer-uri... + */ + + send_ipp_status(con, IPP_BAD_REQUEST, + _("job-printer-uri attribute missing.")); + return; + } + + if (!cupsdValidateDest(attr->values[0].string.text, &dtype, &dprinter)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * See if we have a job URI or a printer URI... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + /* + * Move all jobs... + */ + + if ((src = cupsdValidateDest(uri->values[0].string.text, &stype, + &sprinter)) == NULL) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + job = NULL; + } + else + { + /* + * Otherwise, just move a single job... + */ + + if ((job = cupsdFindJob(attr->values[0].integer)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("Job #%d does not exist."), attr->values[0].integer); + return; + } + else + { + /* + * Job found, initialize source pointers... + */ + + src = NULL; + sprinter = NULL; + } + } + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + /* + * See if the job exists... + */ + + jobid = atoi(resource + 6); + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + else + { + /* + * Job found, initialize source pointers... + */ + + src = NULL; + sprinter = NULL; + } + } + + /* + * Check the policy of the destination printer... + */ + + if ((status = cupsdCheckPolicy(dprinter->op_policy_ptr, con, + job ? job->username : NULL)) != HTTP_OK) + { + send_http_error(con, status, dprinter); + return; + } + + /* + * Now move the job or jobs... + */ + + if (job) + { + /* + * See if the job has been completed... + */ + + if (job->state_value > IPP_JOB_STOPPED) + { + /* + * Return a "not-possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is finished and cannot be altered."), + job->id); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * Move the job to a different printer or class... + */ + + cupsdMoveJob(job, dprinter); + } + else + { + /* + * Got the source printer, now look through the jobs... + */ + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + { + /* + * See if the job is pointing at the source printer or has not been + * completed... + */ + + if (_cups_strcasecmp(job->dest, src) || + job->state_value > IPP_JOB_STOPPED) + continue; + + /* + * See if the job can be moved by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + continue; + + /* + * Move the job to a different printer or class... + */ + + cupsdMoveJob(job, dprinter); + } + } + + /* + * Start jobs if possible... + */ + + cupsdCheckJobs(); + + /* + * Return with "everything is OK" status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'ppd_parse_line()' - Parse a PPD default line. + */ + +static int /* O - 0 on success, -1 on failure */ +ppd_parse_line(const char *line, /* I - Line */ + char *option, /* O - Option name */ + int olen, /* I - Size of option name */ + char *choice, /* O - Choice name */ + int clen) /* I - Size of choice name */ +{ + /* + * Verify this is a default option line... + */ + + if (strncmp(line, "*Default", 8)) + return (-1); + + /* + * Read the option name... + */ + + for (line += 8, olen --; + *line > ' ' && *line < 0x7f && *line != ':' && *line != '/'; + line ++) + if (olen > 0) + { + *option++ = *line; + olen --; + } + + *option = '\0'; + + /* + * Skip everything else up to the colon (:)... + */ + + while (*line && *line != ':') + line ++; + + if (!*line) + return (-1); + + line ++; + + /* + * Now grab the option choice, skipping leading whitespace... + */ + + while (isspace(*line & 255)) + line ++; + + for (clen --; + *line > ' ' && *line < 0x7f && *line != ':' && *line != '/'; + line ++) + if (clen > 0) + { + *choice++ = *line; + clen --; + } + + *choice = '\0'; + + /* + * Return with no errors... + */ + + return (0); +} + + +/* + * 'print_job()' - Print a file to a printer or class. + */ + +static void +print_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *format; /* Document-format attribute */ + const char *default_format; /* document-format-default value */ + cupsd_job_t *job; /* New job */ + char filename[1024]; /* Job filename */ + mime_type_t *filetype; /* Type of file */ + char super[MIME_MAX_SUPER], /* Supertype of file */ + type[MIME_MAX_TYPE], /* Subtype of file */ + mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2]; + /* Textual name of mime type */ + cupsd_printer_t *printer; /* Printer data */ + struct stat fileinfo; /* File information */ + int kbytes; /* Size of file */ + int compression; /* Document compression */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "print_job(%p[%d], %s)", con, con->http.fd, + uri->values[0].string.text); + + /* + * Validate print file attributes, for now just document-format and + * compression (CUPS only supports "none" and "gzip")... + */ + + compression = CUPS_FILE_NONE; + + if ((attr = ippFindAttribute(con->request, "compression", + IPP_TAG_KEYWORD)) != NULL) + { + if (strcmp(attr->values[0].string.text, "none") +#ifdef HAVE_LIBZ + && strcmp(attr->values[0].string.text, "gzip") +#endif /* HAVE_LIBZ */ + ) + { + send_ipp_status(con, IPP_ATTRIBUTES, + _("Unsupported compression \"%s\"."), + attr->values[0].string.text); + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, + "compression", NULL, attr->values[0].string.text); + return; + } + +#ifdef HAVE_LIBZ + if (!strcmp(attr->values[0].string.text, "gzip")) + compression = CUPS_FILE_GZIP; +#endif /* HAVE_LIBZ */ + } + + /* + * Do we have a file to print? + */ + + if (!con->filename) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("No file in print request.")); + return; + } + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, NULL, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Is it a format we support? + */ + + if ((format = ippFindAttribute(con->request, "document-format", + IPP_TAG_MIMETYPE)) != NULL) + { + /* + * Grab format from client... + */ + + if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]", super, + type) != 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Bad document-format \"%s\"."), + format->values[0].string.text); + return; + } + } + else if ((default_format = cupsGetOption("document-format", + printer->num_options, + printer->options)) != NULL) + { + /* + * Use default document format... + */ + + if (sscanf(default_format, "%15[^/]/%31[^;]", super, type) != 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Bad document-format \"%s\"."), + default_format); + return; + } + } + else + { + /* + * Auto-type it! + */ + + strcpy(super, "application"); + strcpy(type, "octet-stream"); + } + + if (!strcmp(super, "application") && !strcmp(type, "octet-stream")) + { + /* + * Auto-type the file... + */ + + ipp_attribute_t *doc_name; /* document-name attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job ???] Auto-typing file..."); + + doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME); + filetype = mimeFileType(MimeDatabase, con->filename, + doc_name ? doc_name->values[0].string.text : NULL, + &compression); + + if (!filetype) + filetype = mimeType(MimeDatabase, super, type); + + cupsdLogMessage(CUPSD_LOG_INFO, "[Job ???] Request file type is %s/%s.", + filetype->super, filetype->type); + } + else + filetype = mimeType(MimeDatabase, super, type); + + if (filetype && + (!format || + (!strcmp(super, "application") && !strcmp(type, "octet-stream")))) + { + /* + * Replace the document-format attribute value with the auto-typed or + * default one. + */ + + snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, + filetype->type); + + if (format) + { + _cupsStrFree(format->values[0].string.text); + + format->values[0].string.text = _cupsStrAlloc(mimetype); + } + else + ippAddString(con->request, IPP_TAG_JOB, IPP_TAG_MIMETYPE, + "document-format", NULL, mimetype); + } + else if (!filetype) + { + send_ipp_status(con, IPP_DOCUMENT_FORMAT, + _("Unsupported document-format \"%s\"."), + format ? format->values[0].string.text : + "application/octet-stream"); + cupsdLogMessage(CUPSD_LOG_INFO, + "Hint: Do you have the raw file printing rules enabled?"); + + if (format) + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, + "document-format", NULL, format->values[0].string.text); + + return; + } + + /* + * Read any embedded job ticket info from PS files... + */ + + if (!_cups_strcasecmp(filetype->super, "application") && + (!_cups_strcasecmp(filetype->type, "postscript") || + !_cups_strcasecmp(filetype->type, "pdf"))) + read_job_ticket(con); + + /* + * Create the job object... + */ + + if ((job = add_job(con, printer, filetype)) == NULL) + return; + + /* + * Update quota data... + */ + + if (stat(con->filename, &fileinfo)) + kbytes = 0; + else + kbytes = (fileinfo.st_size + 1023) / 1024; + + cupsdUpdateQuota(printer, job->username, 0, kbytes); + + if ((attr = ippFindAttribute(job->attrs, "job-k-octets", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer += kbytes; + + /* + * Add the job file... + */ + + if (add_file(con, job, filetype, compression)) + return; + + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, + job->num_files); + rename(con->filename, filename); + cupsdClearString(&con->filename); + + /* + * See if we need to add the ending sheet... + */ + + if (cupsdTimeoutJob(job)) + return; + + /* + * Log and save the job... + */ + + cupsdLogJob(job, CUPSD_LOG_INFO, + "File of type %s/%s queued by \"%s\".", + filetype->super, filetype->type, job->username); + cupsdLogJob(job, CUPSD_LOG_DEBUG, "hold_until=%d", (int)job->hold_until); + cupsdLogJob(job, CUPSD_LOG_INFO, "Queued on \"%s\" by \"%s\".", + job->dest, job->username); + + /* + * Start the job if possible... + */ + + cupsdCheckJobs(); +} + + +/* + * 'read_job_ticket()' - Read a job ticket embedded in a print file. + * + * This function only gets called when printing a single PDF or PostScript + * file using the Print-Job operation. It doesn't work for Create-Job + + * Send-File, since the job attributes need to be set at job creation + * time for banners to work. The embedded job ticket stuff is here + * primarily to allow the Windows printer driver for CUPS to pass in JCL + * options and IPP attributes which otherwise would be lost. + * + * The format of a job ticket is simple: + * + * %cupsJobTicket: attr1=value1 attr2=value2 ... attrN=valueN + * + * %cupsJobTicket: attr1=value1 + * %cupsJobTicket: attr2=value2 + * ... + * %cupsJobTicket: attrN=valueN + * + * Job ticket lines must appear immediately after the first line that + * specifies PostScript (%!PS-Adobe-3.0) or PDF (%PDF) format, and CUPS + * stops looking for job ticket info when it finds a line that does not begin + * with "%cupsJobTicket:". + * + * The maximum length of a job ticket line, including the prefix, is + * 255 characters to conform with the Adobe DSC. + * + * Read-only attributes are rejected with a notice to the error log in + * case a malicious user tries anything. Since the job ticket is read + * prior to attribute validation in print_job(), job ticket attributes + * will go through the same validation as IPP attributes... + */ + +static void +read_job_ticket(cupsd_client_t *con) /* I - Client connection */ +{ + cups_file_t *fp; /* File to read from */ + char line[256]; /* Line data */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + ipp_t *ticket; /* New attributes */ + ipp_attribute_t *attr, /* Current attribute */ + *attr2, /* Job attribute */ + *prev2; /* Previous job attribute */ + int foundfirstpage; /* Did we find the first page already + in the PostScript input? */ + int num_copies; /* Number of copies according to + PostScript command in input file */ + char *s, *t, buffer[10]; + + + /* + * First open the print file... + */ + + if ((fp = cupsFileOpen(con->filename, "rb")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open print file for job ticket - %s", + strerror(errno)); + return; + } + + /* + * Skip the first line... + */ + + if (cupsFileGets(fp, line, sizeof(line)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to read from print file for job ticket - %s", + strerror(errno)); + cupsFileClose(fp); + return; + } + + if (strncmp(line, "%!PS-Adobe-", 11) && strncmp(line, "%PDF-", 5)) + { + /* + * Not a DSC-compliant file, so no job ticket info will be available... + */ + + cupsFileClose(fp); + return; + } + + /* + * Read job ticket info from the file... + */ + + num_options = 0; + options = NULL; + + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Stop at the first non-ticket line... + */ + + if (strncmp(line, "%cupsJobTicket:", 15)) + break; + + /* + * Add the options to the option array... + */ + + num_options = cupsParseOptions(line + 15, num_options, &options); + } + + /* + * Read option settings embedded in the file... + */ + + foundfirstpage = 0; + + while (cupsFileGets(fp, line, sizeof(line))) + { + /* + * Stop at the second page, we read also the settings of the first PageSetup + * to work around a bug in OpenOffice.org. This app puts options intended + * for the whole document into the page setup of the first page + */ + + if (!strncmp(line, "%%Page:", 7)) + { + if (foundfirstpage == 1) + break; + foundfirstpage = 1; + } + + /* + * Add the embedded option settings to the option array... + */ + + s = NULL; + if (!strncmp(line, "%%BeginFeature:", 15)) + s = line + 15; + else if (!strncmp(line, "%%IncludeFeature:", 17)) + s = line + 17; + else if (!strncmp(line, "%%BeginNonPPDFeature:", 21)) + s = line + 21; + + if (s && (t = strstr(s, "NumCopies")) != NULL) + { + t += 9; + while ((*t == ' ') || (*t == '\t')) t++; + if (sscanf(t, "%9d", &num_copies) == 1) + { + sprintf(buffer, "%d", num_copies); + num_options = cupsAddOption("copies", buffer, num_options, &options); + } + } + else if (s) + { + while ((*s == ' ') || (*s == '\t')) s++; + if (*s == '*') s++; + t = s; + while (*t && (*t != ' ') && (*t != '\t')) t++; + if ((*t == ' ') || (*t == '\t')) *t = '='; + num_options = cupsParseOptions(s, num_options, &options); + } + + /* + * Read out "/#copies XXX def" and "/NumCopies XXX def" expressions from + * PostScript input. Some apps insert these expressions to set the + * number of copies. + */ + + s = NULL; + if ((s = strstr(line, "/#copies")) != NULL) + s += 8; + else if ((s = strstr(line, "/NumCopies")) != NULL) + s += 10; + if (s) + { + while ((*s == ' ') || (*s == '\t')) s++; + if (sscanf(s, "%9d %as ", &num_copies, &t) == 2) + { + if (!strncmp(t, "def", 3)) + { + sprintf(buffer, "%d", num_copies); + num_options = cupsAddOption("copies", buffer, num_options, &options); + } + free(t); + } + } + } + + /* + * Done with the file; see if we have any options... + */ + + cupsFileClose(fp); + + if (num_options == 0) + return; + + /* + * OK, convert the options to an attribute list, and apply them to + * the request... + */ + + ticket = ippNew(); + cupsEncodeOptions(ticket, num_options, options); + + /* + * See what the user wants to change. + */ + + for (attr = ticket->attrs; attr; attr = attr->next) + { + if (attr->group_tag != IPP_TAG_JOB || !attr->name) + continue; + + if (!strcmp(attr->name, "job-originating-host-name") || + !strcmp(attr->name, "job-originating-user-name") || + !strcmp(attr->name, "job-media-sheets-completed") || + !strcmp(attr->name, "job-k-octets") || + !strcmp(attr->name, "job-id") || + !strncmp(attr->name, "job-state", 9) || + !strncmp(attr->name, "time-at-", 8)) + continue; /* Read-only attrs */ + + if ((attr2 = ippFindAttribute(con->request, attr->name, + IPP_TAG_ZERO)) != NULL) + { + /* + * Some other value; first free the old value... + */ + + if (con->request->attrs == attr2) + { + con->request->attrs = attr2->next; + prev2 = NULL; + } + else + { + for (prev2 = con->request->attrs; prev2; prev2 = prev2->next) + if (prev2->next == attr2) + { + prev2->next = attr2->next; + break; + } + } + + if (con->request->last == attr2) + con->request->last = prev2; + + _ippFreeAttr(attr2); + } + + /* + * Add new option by copying it... + */ + + copy_attribute(con->request, attr, 0); + } + + /* + * Then free the attribute list and option array... + */ + + ippDelete(ticket); + cupsFreeOptions(num_options, options); +} + + +/* + * 'reject_jobs()' - Reject print jobs to a printer. + */ + +static void +reject_jobs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer or class URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + ipp_attribute_t *attr; /* printer-state-message text */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "reject_jobs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Reject jobs sent to the printer... + */ + + printer->accepting = 0; + + if ((attr = ippFindAttribute(con->request, "printer-state-message", + IPP_TAG_TEXT)) == NULL) + strcpy(printer->state_message, "Rejecting Jobs"); + else + strlcpy(printer->state_message, attr->values[0].string.text, + sizeof(printer->state_message)); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, + "No longer accepting jobs."); + + if (dtype & CUPS_PRINTER_CLASS) + { + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" rejecting jobs (\"%s\").", + printer->name, get_username(con)); + } + else + { + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" rejecting jobs (\"%s\").", + printer->name, get_username(con)); + } + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'release_held_new_jobs()' - Release pending/new jobs on a printer or class. + */ + +static void +release_held_new_jobs( + cupsd_client_t *con, /* I - Connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_held_new_jobs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Hold pending/new jobs sent to the printer... + */ + + printer->holding_new_jobs = 0; + + cupsdSetPrinterReasons(printer, "-hold-new-jobs"); + + if (dtype & CUPS_PRINTER_CLASS) + cupsdLogMessage(CUPSD_LOG_INFO, + "Class \"%s\" now printing pending/new jobs (\"%s\").", + printer->name, get_username(con)); + else + cupsdLogMessage(CUPSD_LOG_INFO, + "Printer \"%s\" now printing pending/new jobs (\"%s\").", + printer->name, get_username(con)); + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'release_job()' - Release a held print job. + */ + +static void +release_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job or Printer URI */ +{ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + cupsd_job_t *job; /* Job information */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "release_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if job is "held"... + */ + + if (job->state_value != IPP_JOB_HELD) + { + /* + * Nope - return a "not possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not held."), jobid); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * Reset the job-hold-until value to "no-hold"... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + { + _cupsStrFree(attr->values[0].string.text); + + attr->value_tag = IPP_TAG_KEYWORD; + attr->values[0].string.text = _cupsStrAlloc("no-hold"); + + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, + "Job job-hold-until value changed by user."); + } + + /* + * Release the job and return... + */ + + cupsdReleaseJob(job); + + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, + "Job released by user."); + + cupsdLogJob(job, CUPSD_LOG_INFO, "Released by \"%s\".", username); + + con->response->request.status.status_code = IPP_OK; + + cupsdCheckJobs(); +} + + +/* + * 'renew_subscription()' - Renew an existing subscription... + */ + +static void +renew_subscription( + cupsd_client_t *con, /* I - Client connection */ + int sub_id) /* I - Subscription ID */ +{ + http_status_t status; /* Policy status */ + cupsd_subscription_t *sub; /* Subscription */ + ipp_attribute_t *lease; /* notify-lease-duration */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "renew_subscription(con=%p[%d], sub_id=%d)", + con, con->http.fd, sub_id); + + /* + * Is the subscription ID valid? + */ + + if ((sub = cupsdFindSubscription(sub_id)) == NULL) + { + /* + * Bad subscription ID... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Subscription #%d does not exist."), + sub_id); + return; + } + + if (sub->job) + { + /* + * Job subscriptions cannot be renewed... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job subscriptions cannot be renewed.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(sub->dest ? sub->dest->op_policy_ptr : + DefaultPolicyPtr, + con, sub->owner)) != HTTP_OK) + { + send_http_error(con, status, sub->dest); + return; + } + + /* + * Renew the subscription... + */ + + lease = ippFindAttribute(con->request, "notify-lease-duration", + IPP_TAG_INTEGER); + + sub->lease = lease ? lease->values[0].integer : DefaultLeaseDuration; + + if (MaxLeaseDuration && (sub->lease == 0 || sub->lease > MaxLeaseDuration)) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "renew_subscription: Limiting notify-lease-duration to " + "%d seconds.", + MaxLeaseDuration); + sub->lease = MaxLeaseDuration; + } + + sub->expire = sub->lease ? time(NULL) + sub->lease : 0; + + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); + + con->response->request.status.status_code = IPP_OK; + + ippAddInteger(con->response, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER, + "notify-lease-duration", sub->lease); +} + + +/* + * 'restart_job()' - Restart an old print job. + */ + +static void +restart_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job or Printer URI */ +{ + ipp_attribute_t *attr; /* Current attribute */ + int jobid; /* Job ID */ + cupsd_job_t *job; /* Job information */ + char scheme[HTTP_MAX_URI], /* Method portion of URI */ + username[HTTP_MAX_URI], /* Username portion of URI */ + host[HTTP_MAX_URI], /* Host portion of URI */ + resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int port; /* Port portion of URI */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "restart_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if job is in any of the "completed" states... + */ + + if (job->state_value <= IPP_JOB_PROCESSING) + { + /* + * Nope - return a "not possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Job #%d is not complete."), + jobid); + return; + } + + /* + * See if we have retained the job files... + */ + + cupsdLoadJob(job); + + if (!job->attrs || job->num_files == 0) + { + /* + * Nope - return a "not possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d cannot be restarted - no files."), jobid); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * See if the job-hold-until attribute is specified... + */ + + if ((attr = ippFindAttribute(con->request, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME); + + if (attr && strcmp(attr->values[0].string.text, "no-hold")) + { + /* + * Return the job to a held state... + */ + + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Restarted by \"%s\" with job-hold-until=%s.", + username, attr->values[0].string.text); + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); + + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE, + NULL, job, "Job restarted by user with job-hold-until=%s", + attr->values[0].string.text); + } + else + { + /* + * Restart the job... + */ + + cupsdRestartJob(job); + cupsdCheckJobs(); + } + + cupsdLogJob(job, CUPSD_LOG_INFO, "Restarted by \"%s\".", username); + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'save_auth_info()' - Save authentication information for a job. + */ + +static void +save_auth_info( + cupsd_client_t *con, /* I - Client connection */ + cupsd_job_t *job, /* I - Job */ + ipp_attribute_t *auth_info) /* I - auth-info attribute, if any */ +{ + int i; /* Looping var */ + char filename[1024]; /* Job authentication filename */ + cups_file_t *fp; /* Job authentication file */ + char line[65536]; /* Line for file */ + cupsd_printer_t *dest; /* Destination printer/class */ + + + /* + * This function saves the in-memory authentication information for + * a job so that it can be used to authenticate with a remote host. + * The information is stored in a file that is readable only by the + * root user. The fields are Base-64 encoded, each on a separate line, + * followed by random number (up to 1024) of newlines to limit the + * amount of information that is exposed. + * + * Because of the potential for exposing of authentication information, + * this functionality is only enabled when running cupsd as root. + * + * This caching only works for the Basic and BasicDigest authentication + * types. Digest authentication cannot be cached this way, and in + * the future Kerberos authentication may make all of this obsolete. + * + * Authentication information is saved whenever an authenticated + * Print-Job, Create-Job, or CUPS-Authenticate-Job operation is + * performed. + * + * This information is deleted after a job is completed or canceled, + * so reprints may require subsequent re-authentication. + */ + + if (RunUser) + return; + + if ((dest = cupsdFindDest(job->dest)) == NULL) + return; + + /* + * Create the authentication file and change permissions... + */ + + snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); + if ((fp = cupsFileOpen(filename, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to save authentication info to \"%s\" - %s", + filename, strerror(errno)); + return; + } + + fchown(cupsFileNumber(fp), 0, 0); + fchmod(cupsFileNumber(fp), 0400); + + cupsFilePuts(fp, "CUPSD-AUTH-V2\n"); + + for (i = 0; + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + cupsdClearString(job->auth_env + i); + + if (auth_info && auth_info->num_values == dest->num_auth_info_required) + { + /* + * Write 1 to 3 auth values... + */ + + for (i = 0; + i < auth_info->num_values && + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + { + httpEncode64_2(line, sizeof(line), auth_info->values[i].string.text, + strlen(auth_info->values[i].string.text)); + cupsFilePutConf(fp, dest->auth_info_required[i], line); + + if (!strcmp(dest->auth_info_required[i], "username")) + cupsdSetStringf(job->auth_env + i, "AUTH_USERNAME=%s", + auth_info->values[i].string.text); + else if (!strcmp(dest->auth_info_required[i], "domain")) + cupsdSetStringf(job->auth_env + i, "AUTH_DOMAIN=%s", + auth_info->values[i].string.text); + else if (!strcmp(dest->auth_info_required[i], "password")) + cupsdSetStringf(job->auth_env + i, "AUTH_PASSWORD=%s", + auth_info->values[i].string.text); + else if (!strcmp(dest->auth_info_required[i], "negotiate")) + cupsdSetStringf(job->auth_env + i, "AUTH_NEGOTIATE=%s", + auth_info->values[i].string.text); + else + i --; + } + } + else if (auth_info && auth_info->num_values == 2 && + dest->num_auth_info_required == 1 && + !strcmp(dest->auth_info_required[0], "negotiate")) + { + /* + * Allow fallback to username+password for Kerberized queues... + */ + + httpEncode64_2(line, sizeof(line), auth_info->values[0].string.text, + strlen(auth_info->values[0].string.text)); + cupsFilePutConf(fp, "username", line); + + cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", + auth_info->values[0].string.text); + + httpEncode64_2(line, sizeof(line), auth_info->values[1].string.text, + strlen(auth_info->values[1].string.text)); + cupsFilePutConf(fp, "password", line); + + cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", + auth_info->values[1].string.text); + } + else if (con->username[0]) + { + /* + * Write the authenticated username... + */ + + httpEncode64_2(line, sizeof(line), con->username, strlen(con->username)); + cupsFilePutConf(fp, "username", line); + + cupsdSetStringf(job->auth_env + 0, "AUTH_USERNAME=%s", con->username); + + /* + * Write the authenticated password... + */ + + httpEncode64_2(line, sizeof(line), con->password, strlen(con->password)); + cupsFilePutConf(fp, "password", line); + + cupsdSetStringf(job->auth_env + 1, "AUTH_PASSWORD=%s", con->password); + } + +#ifdef HAVE_GSSAPI + if (con->gss_uid > 0) + { + cupsFilePrintf(fp, "uid %d\n", (int)con->gss_uid); + cupsdSetStringf(&job->auth_uid, "AUTH_UID=%d", (int)con->gss_uid); + } +#endif /* HAVE_GSSAPI */ + + /* + * Write a random number of newlines to the end of the file... + */ + + for (i = (CUPS_RAND() % 1024); i >= 0; i --) + cupsFilePutChar(fp, '\n'); + + /* + * Close the file and return... + */ + + cupsFileClose(fp); +} + + +/* + * 'send_document()' - Send a file to a printer or class. + */ + +static void +send_document(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + ipp_attribute_t *attr; /* Current attribute */ + ipp_attribute_t *format; /* Request's document-format attribute */ + ipp_attribute_t *jformat; /* Job's document-format attribute */ + const char *default_format;/* document-format-default value */ + int jobid; /* Job ID number */ + cupsd_job_t *job; /* Current job */ + char job_uri[HTTP_MAX_URI], + /* Job URI */ + scheme[HTTP_MAX_URI], + /* Method portion of URI */ + username[HTTP_MAX_URI], + /* Username portion of URI */ + host[HTTP_MAX_URI], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + mime_type_t *filetype; /* Type of file */ + char super[MIME_MAX_SUPER], + /* Supertype of file */ + type[MIME_MAX_TYPE], + /* Subtype of file */ + mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2]; + /* Textual name of mime type */ + char filename[1024]; /* Job filename */ + cupsd_printer_t *printer; /* Current printer */ + struct stat fileinfo; /* File information */ + int kbytes; /* Size of file */ + int compression; /* Type of compression */ + int start_job; /* Start the job? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "send_document(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + printer = cupsdFindDest(job->dest); + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * OK, see if the client is sending the document compressed - CUPS + * only supports "none" and "gzip". + */ + + compression = CUPS_FILE_NONE; + + if ((attr = ippFindAttribute(con->request, "compression", + IPP_TAG_KEYWORD)) != NULL) + { + if (strcmp(attr->values[0].string.text, "none") +#ifdef HAVE_LIBZ + && strcmp(attr->values[0].string.text, "gzip") +#endif /* HAVE_LIBZ */ + ) + { + send_ipp_status(con, IPP_ATTRIBUTES, _("Unsupported compression \"%s\"."), + attr->values[0].string.text); + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, + "compression", NULL, attr->values[0].string.text); + return; + } + +#ifdef HAVE_LIBZ + if (!strcmp(attr->values[0].string.text, "gzip")) + compression = CUPS_FILE_GZIP; +#endif /* HAVE_LIBZ */ + } + + /* + * Do we have a file to print? + */ + + if ((attr = ippFindAttribute(con->request, "last-document", + IPP_TAG_BOOLEAN)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Missing last-document attribute in request.")); + return; + } + + if (!con->filename) + { + /* + * Check for an empty request with "last-document" set to true, which is + * used to close an "open" job by RFC 2911, section 3.3.2. + */ + + if (job->num_files > 0 && attr->values[0].boolean) + goto last_document; + + send_ipp_status(con, IPP_BAD_REQUEST, _("No file in print request.")); + return; + } + + /* + * Is it a format we support? + */ + + if ((format = ippFindAttribute(con->request, "document-format", + IPP_TAG_MIMETYPE)) != NULL) + { + /* + * Grab format from client... + */ + + if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]", + super, type) != 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad document-format \"%s\"."), + format->values[0].string.text); + return; + } + } + else if ((default_format = cupsGetOption("document-format", + printer->num_options, + printer->options)) != NULL) + { + /* + * Use default document format... + */ + + if (sscanf(default_format, "%15[^/]/%31[^;]", super, type) != 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Bad document-format-default \"%s\"."), default_format); + return; + } + } + else + { + /* + * No document format attribute? Auto-type it! + */ + + strcpy(super, "application"); + strcpy(type, "octet-stream"); + } + + if (!strcmp(super, "application") && !strcmp(type, "octet-stream")) + { + /* + * Auto-type the file... + */ + + ipp_attribute_t *doc_name; /* document-name attribute */ + + + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Auto-typing file..."); + + doc_name = ippFindAttribute(con->request, "document-name", IPP_TAG_NAME); + filetype = mimeFileType(MimeDatabase, con->filename, + doc_name ? doc_name->values[0].string.text : NULL, + &compression); + + if (!filetype) + filetype = mimeType(MimeDatabase, super, type); + + if (filetype) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Request file type is %s/%s.", + filetype->super, filetype->type); + } + else + filetype = mimeType(MimeDatabase, super, type); + + if (filetype) + { + /* + * Replace the document-format attribute value with the auto-typed or + * default one. + */ + + snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, + filetype->type); + + if ((jformat = ippFindAttribute(job->attrs, "document-format", + IPP_TAG_MIMETYPE)) != NULL) + { + _cupsStrFree(jformat->values[0].string.text); + + jformat->values[0].string.text = _cupsStrAlloc(mimetype); + } + else + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_MIMETYPE, + "document-format", NULL, mimetype); + } + else if (!filetype) + { + send_ipp_status(con, IPP_DOCUMENT_FORMAT, + _("Unsupported document-format \"%s/%s\"."), super, type); + cupsdLogMessage(CUPSD_LOG_INFO, + "Hint: Do you have the raw file printing rules enabled?"); + + if (format) + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, + "document-format", NULL, format->values[0].string.text); + + return; + } + + if (printer->filetypes && !cupsArrayFind(printer->filetypes, filetype)) + { + snprintf(mimetype, sizeof(mimetype), "%s/%s", filetype->super, + filetype->type); + + send_ipp_status(con, IPP_DOCUMENT_FORMAT, + _("Unsupported document-format \"%s\"."), mimetype); + + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, + "document-format", NULL, mimetype); + + return; + } + + /* + * Add the file to the job... + */ + + cupsdLoadJob(job); + + if (add_file(con, job, filetype, compression)) + return; + + if (stat(con->filename, &fileinfo)) + kbytes = 0; + else + kbytes = (fileinfo.st_size + 1023) / 1024; + + cupsdUpdateQuota(printer, job->username, 0, kbytes); + + if ((attr = ippFindAttribute(job->attrs, "job-k-octets", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer += kbytes; + + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, job->id, + job->num_files); + rename(con->filename, filename); + + cupsdClearString(&con->filename); + + cupsdLogJob(job, CUPSD_LOG_INFO, "File of type %s/%s queued by \"%s\".", + filetype->super, filetype->type, job->username); + + /* + * Start the job if this is the last document... + */ + + last_document: + + if ((attr = ippFindAttribute(con->request, "last-document", + IPP_TAG_BOOLEAN)) != NULL && + attr->values[0].boolean) + { + /* + * See if we need to add the ending sheet... + */ + + if (cupsdTimeoutJob(job)) + return; + + if (job->state_value == IPP_JOB_STOPPED) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + else if (job->state_value == IPP_JOB_HELD) + { + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + } + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + + start_job = 1; + } + else + { + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (!attr || !strcmp(attr->values[0].string.text, "no-hold")) + { + job->state->values[0].integer = IPP_JOB_HELD; + job->state_value = IPP_JOB_HELD; + job->hold_until = time(NULL) + MultipleOperationTimeout; + job->dirty = 1; + + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + + start_job = 0; + } + + /* + * Fill in the response info... + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + con->servername, con->serverport, "/jobs/%d", jobid); + ippAddString(con->response, IPP_TAG_JOB, IPP_TAG_URI, "job-uri", NULL, + job_uri); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-id", jobid); + + ippAddInteger(con->response, IPP_TAG_JOB, IPP_TAG_ENUM, "job-state", + job->state_value); + add_job_state_reasons(con, job); + + con->response->request.status.status_code = IPP_OK; + + /* + * Start the job if necessary... + */ + + if (start_job) + cupsdCheckJobs(); +} + + +/* + * 'send_http_error()' - Send a HTTP error back to the IPP client. + */ + +static void +send_http_error( + cupsd_client_t *con, /* I - Client connection */ + http_status_t status, /* I - HTTP status code */ + cupsd_printer_t *printer) /* I - Printer, if any */ +{ + ipp_attribute_t *uri; /* Request URI, if any */ + + + if ((uri = ippFindAttribute(con->request, "printer-uri", + IPP_TAG_URI)) == NULL) + uri = ippFindAttribute(con->request, "job-uri", IPP_TAG_URI); + + cupsdLogMessage(status == HTTP_FORBIDDEN ? CUPSD_LOG_ERROR : CUPSD_LOG_DEBUG, + "Returning HTTP %s for %s (%s) from %s", + httpStatus(status), + con->request ? + ippOpString(con->request->request.op.operation_id) : + "no operation-id", + uri ? uri->values[0].string.text : "no URI", + con->http.hostname); + + if (printer) + { + int auth_type; /* Type of authentication required */ + + + auth_type = CUPSD_AUTH_NONE; + + if (status == HTTP_UNAUTHORIZED && + printer->num_auth_info_required > 0 && + !strcmp(printer->auth_info_required[0], "negotiate") && + con->request && + (con->request->request.op.operation_id == IPP_PRINT_JOB || + con->request->request.op.operation_id == IPP_CREATE_JOB || + con->request->request.op.operation_id == CUPS_AUTHENTICATE_JOB)) + { + /* + * Creating and authenticating jobs requires Kerberos... + */ + + auth_type = CUPSD_AUTH_NEGOTIATE; + } + else + { + /* + * Use policy/location-defined authentication requirements... + */ + + char resource[HTTP_MAX_URI]; /* Resource portion of URI */ + cupsd_location_t *auth; /* Pointer to authentication element */ + + + if (printer->type & CUPS_PRINTER_CLASS) + snprintf(resource, sizeof(resource), "/classes/%s", printer->name); + else + snprintf(resource, sizeof(resource), "/printers/%s", printer->name); + + if ((auth = cupsdFindBest(resource, HTTP_POST)) == NULL || + auth->type == CUPSD_AUTH_NONE) + auth = cupsdFindPolicyOp(printer->op_policy_ptr, + con->request ? + con->request->request.op.operation_id : + IPP_PRINT_JOB); + + if (auth) + { + if (auth->type == CUPSD_AUTH_DEFAULT) + auth_type = DefaultAuthType; + else + auth_type = auth->type; + } + } + + cupsdSendError(con, status, auth_type); + } + else + cupsdSendError(con, status, CUPSD_AUTH_NONE); + + ippDelete(con->response); + con->response = NULL; + + return; +} + + +/* + * 'send_ipp_status()' - Send a status back to the IPP client. + */ + +static void +send_ipp_status(cupsd_client_t *con, /* I - Client connection */ + ipp_status_t status, /* I - IPP status code */ + const char *message,/* I - Status message */ + ...) /* I - Additional args as needed */ +{ + va_list ap; /* Pointer to additional args */ + char formatted[1024]; /* Formatted errror message */ + + + va_start(ap, message); + vsnprintf(formatted, sizeof(formatted), + _cupsLangString(con->language, message), ap); + va_end(ap); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "%s %s: %s", + ippOpString(con->request->request.op.operation_id), + ippErrorString(status), formatted); + + con->response->request.status.status_code = status; + + if (ippFindAttribute(con->response, "attributes-charset", + IPP_TAG_ZERO) == NULL) + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_CHARSET, + "attributes-charset", NULL, "utf-8"); + + if (ippFindAttribute(con->response, "attributes-natural-language", + IPP_TAG_ZERO) == NULL) + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, + "attributes-natural-language", NULL, DefaultLanguage); + + ippAddString(con->response, IPP_TAG_OPERATION, IPP_TAG_TEXT, + "status-message", NULL, formatted); +} + + +/* + * 'set_default()' - Set the default destination... + */ + +static void +set_default(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer, /* Printer */ + *oldprinter; /* Old default printer */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_default(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(DefaultPolicyPtr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, NULL); + return; + } + + /* + * Set it as the default... + */ + + oldprinter = DefaultPrinter; + DefaultPrinter = printer; + + if (oldprinter) + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, oldprinter, NULL, + "%s is no longer the default printer.", oldprinter->name); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, + "%s is now the default printer.", printer->name); + + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS | CUPSD_DIRTY_CLASSES | + CUPSD_DIRTY_REMOTE | CUPSD_DIRTY_PRINTCAP); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Default destination set to \"%s\" by \"%s\".", + printer->name, get_username(con)); + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'set_job_attrs()' - Set job attributes. + */ + +static void +set_job_attrs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Job URI */ +{ + ipp_attribute_t *attr, /* Current attribute */ + *attr2; /* Job attribute */ + int jobid; /* Job ID */ + cupsd_job_t *job; /* Current job */ + char scheme[HTTP_MAX_URI], + /* Method portion of URI */ + username[HTTP_MAX_URI], + /* Username portion of URI */ + host[HTTP_MAX_URI], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + int event; /* Events? */ + int check_jobs; /* Check jobs? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_job_attrs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Start with "everything is OK" status... + */ + + con->response->request.status.status_code = IPP_OK; + + /* + * See if we have a job URI or a printer URI... + */ + + if (!strcmp(uri->name, "printer-uri")) + { + /* + * Got a printer URI; see if we also have a job-id attribute... + */ + + if ((attr = ippFindAttribute(con->request, "job-id", + IPP_TAG_INTEGER)) == NULL) + { + send_ipp_status(con, IPP_BAD_REQUEST, + _("Got a printer-uri attribute but no job-id.")); + return; + } + + jobid = attr->values[0].integer; + } + else + { + /* + * Got a job URI; parse it to get the job ID... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri->values[0].string.text, scheme, + sizeof(scheme), username, sizeof(username), host, + sizeof(host), &port, resource, sizeof(resource)); + + if (strncmp(resource, "/jobs/", 6)) + { + /* + * Not a valid URI! + */ + + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad job-uri \"%s\"."), + uri->values[0].string.text); + return; + } + + jobid = atoi(resource + 6); + } + + /* + * See if the job exists... + */ + + if ((job = cupsdFindJob(jobid)) == NULL) + { + /* + * Nope - return a "not found" error... + */ + + send_ipp_status(con, IPP_NOT_FOUND, _("Job #%d does not exist."), jobid); + return; + } + + /* + * See if the job has been completed... + */ + + if (job->state_value > IPP_JOB_STOPPED) + { + /* + * Return a "not-possible" error... + */ + + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job #%d is finished and cannot be altered."), jobid); + return; + } + + /* + * See if the job is owned by the requesting user... + */ + + if (!validate_user(job, con, job->username, username, sizeof(username))) + { + send_http_error(con, con->username[0] ? HTTP_FORBIDDEN : HTTP_UNAUTHORIZED, + cupsdFindDest(job->dest)); + return; + } + + /* + * See what the user wants to change. + */ + + cupsdLoadJob(job); + + check_jobs = 0; + event = 0; + + for (attr = con->request->attrs; attr; attr = attr->next) + { + if (attr->group_tag != IPP_TAG_JOB || !attr->name) + continue; + + if (!strcmp(attr->name, "attributes-charset") || + !strcmp(attr->name, "attributes-natural-language") || + !strcmp(attr->name, "document-compression") || + !strcmp(attr->name, "document-format") || + !strcmp(attr->name, "job-detailed-status-messages") || + !strcmp(attr->name, "job-document-access-errors") || + !strcmp(attr->name, "job-id") || + !strcmp(attr->name, "job-impressions-completed") || + !strcmp(attr->name, "job-k-octets") || + !strcmp(attr->name, "job-originating-host-name") || + !strcmp(attr->name, "job-originating-user-name") || + !strcmp(attr->name, "job-printer-up-time") || + !strcmp(attr->name, "job-printer-uri") || + !strcmp(attr->name, "job-sheets") || + !strcmp(attr->name, "job-state-message") || + !strcmp(attr->name, "job-state-reasons") || + !strcmp(attr->name, "job-uri") || + !strcmp(attr->name, "number-of-documents") || + !strcmp(attr->name, "number-of-intervening-jobs") || + !strcmp(attr->name, "output-device-assigned") || + !strncmp(attr->name, "date-time-at-", 13) || + !strncmp(attr->name, "job-k-octets", 12) || + !strncmp(attr->name, "job-media-sheets", 16) || + !strncmp(attr->name, "time-at-", 8)) + { + /* + * Read-only attrs! + */ + + send_ipp_status(con, IPP_ATTRIBUTES_NOT_SETTABLE, + _("%s cannot be changed."), attr->name); + + if ((attr2 = copy_attribute(con->response, attr, 0)) != NULL) + attr2->group_tag = IPP_TAG_UNSUPPORTED_GROUP; + + continue; + } + + if (!strcmp(attr->name, "job-priority")) + { + /* + * Change the job priority... + */ + + if (attr->value_tag != IPP_TAG_INTEGER) + { + send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-priority value.")); + + if ((attr2 = copy_attribute(con->response, attr, 0)) != NULL) + attr2->group_tag = IPP_TAG_UNSUPPORTED_GROUP; + } + else if (job->state_value >= IPP_JOB_PROCESSING) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job is completed and cannot be changed.")); + return; + } + else if (con->response->request.status.status_code == IPP_OK) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-priority to %d", + attr->values[0].integer); + cupsdSetJobPriority(job, attr->values[0].integer); + + check_jobs = 1; + event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | + CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED; + } + } + else if (!strcmp(attr->name, "job-state")) + { + /* + * Change the job state... + */ + + if (attr->value_tag != IPP_TAG_ENUM) + { + send_ipp_status(con, IPP_REQUEST_VALUE, _("Bad job-state value.")); + + if ((attr2 = copy_attribute(con->response, attr, 0)) != NULL) + attr2->group_tag = IPP_TAG_UNSUPPORTED_GROUP; + } + else + { + switch (attr->values[0].integer) + { + case IPP_JOB_PENDING : + case IPP_JOB_HELD : + if (job->state_value > IPP_JOB_HELD) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job state cannot be changed.")); + return; + } + else if (con->response->request.status.status_code == IPP_OK) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", + attr->values[0].integer); + cupsdSetJobState(job, attr->values[0].integer, + CUPSD_JOB_DEFAULT, + "Job state changed by \"%s\"", username); + check_jobs = 1; + } + break; + + case IPP_JOB_PROCESSING : + case IPP_JOB_STOPPED : + if (job->state_value != attr->values[0].integer) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job state cannot be changed.")); + return; + } + break; + + case IPP_JOB_CANCELED : + case IPP_JOB_ABORTED : + case IPP_JOB_COMPLETED : + if (job->state_value > IPP_JOB_PROCESSING) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Job state cannot be changed.")); + return; + } + else if (con->response->request.status.status_code == IPP_OK) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", + attr->values[0].integer); + cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, + CUPSD_JOB_DEFAULT, + "Job state changed by \"%s\"", username); + check_jobs = 1; + } + break; + } + } + } + else if (con->response->request.status.status_code != IPP_OK) + continue; + else if ((attr2 = ippFindAttribute(job->attrs, attr->name, + IPP_TAG_ZERO)) != NULL) + { + /* + * Some other value; first free the old value... + */ + + if (job->attrs->prev) + job->attrs->prev->next = attr2->next; + else + job->attrs->attrs = attr2->next; + + if (job->attrs->last == attr2) + job->attrs->last = job->attrs->prev; + + _ippFreeAttr(attr2); + + /* + * Then copy the attribute... + */ + + copy_attribute(job->attrs, attr, 0); + + /* + * See if the job-name or job-hold-until is being changed. + */ + + if (!strcmp(attr->name, "job-hold-until")) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-hold-until to %s", + attr->values[0].string.text); + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); + + if (!strcmp(attr->values[0].string.text, "no-hold")) + { + cupsdReleaseJob(job); + check_jobs = 1; + } + else + cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, + "Job held by \"%s\".", username); + + event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE; + } + } + else if (attr->value_tag == IPP_TAG_DELETEATTR) + { + /* + * Delete the attribute... + */ + + if ((attr2 = ippFindAttribute(job->attrs, attr->name, + IPP_TAG_ZERO)) != NULL) + { + if (job->attrs->prev) + job->attrs->prev->next = attr2->next; + else + job->attrs->attrs = attr2->next; + + if (attr2 == job->attrs->last) + job->attrs->last = job->attrs->prev; + + _ippFreeAttr(attr2); + + event |= CUPSD_EVENT_JOB_CONFIG_CHANGED; + } + } + else + { + /* + * Add new option by copying it... + */ + + copy_attribute(job->attrs, attr, 0); + + event |= CUPSD_EVENT_JOB_CONFIG_CHANGED; + } + } + + /* + * Save the job... + */ + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + + /* + * Send events as needed... + */ + + if (event & CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED) + cupsdAddEvent(CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED, + cupsdFindDest(job->dest), job, + "Job priority changed by user."); + + if (event & CUPSD_EVENT_JOB_STATE) + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, + job->state_value == IPP_JOB_HELD ? + "Job held by user." : "Job restarted by user."); + + if (event & CUPSD_EVENT_JOB_CONFIG_CHANGED) + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, + "Job options changed by user."); + + /* + * Start jobs if possible... + */ + + if (check_jobs) + cupsdCheckJobs(); +} + + +/* + * 'set_printer_attrs()' - Set printer attributes. + */ + +static void +set_printer_attrs(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer/class */ + ipp_attribute_t *attr; /* Printer attribute */ + int changed = 0; /* Was anything changed? */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_attrs(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Return a list of attributes that can be set via Set-Printer-Attributes. + */ + + if ((attr = ippFindAttribute(con->request, "printer-location", + IPP_TAG_TEXT)) != NULL) + { + cupsdSetString(&printer->location, attr->values[0].string.text); + changed = 1; + } + + if ((attr = ippFindAttribute(con->request, "printer-info", + IPP_TAG_TEXT)) != NULL) + { + cupsdSetString(&printer->info, attr->values[0].string.text); + changed = 1; + } + + /* + * Update the printer attributes and return... + */ + + if (changed) + { + cupsdSetPrinterAttrs(printer); + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + cupsdAddEvent(CUPSD_EVENT_PRINTER_CONFIG, printer, NULL, + "Printer \"%s\" description or location changed by \"%s\".", + printer->name, get_username(con)); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Printer \"%s\" description or location changed by \"%s\".", + printer->name, get_username(con)); + } + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'set_printer_defaults()' - Set printer default options from a request. + */ + +static void +set_printer_defaults( + cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *printer) /* I - Printer */ +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Current attribute */ + int namelen; /* Length of attribute name */ + char name[256], /* New attribute name */ + value[256]; /* String version of integer attrs */ + + + for (attr = con->request->attrs; attr; attr = attr->next) + { + /* + * Skip non-printer attributes... + */ + + if (attr->group_tag != IPP_TAG_PRINTER || !attr->name) + continue; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "set_printer_defaults: %s", attr->name); + + if (!strcmp(attr->name, "job-sheets-default")) + { + /* + * Only allow keywords and names... + */ + + if (attr->value_tag != IPP_TAG_NAME && attr->value_tag != IPP_TAG_KEYWORD) + continue; + + /* + * Only allow job-sheets-default to be set when running without a + * system high classification level... + */ + + if (Classification) + continue; + + cupsdSetString(&printer->job_sheets[0], attr->values[0].string.text); + + if (attr->num_values > 1) + cupsdSetString(&printer->job_sheets[1], attr->values[1].string.text); + else + cupsdSetString(&printer->job_sheets[1], "none"); + } + else if (!strcmp(attr->name, "requesting-user-name-allowed")) + { + cupsdFreeStrings(&(printer->users)); + + printer->deny_users = 0; + + if (attr->value_tag == IPP_TAG_NAME && + (attr->num_values > 1 || + strcmp(attr->values[0].string.text, "all"))) + { + for (i = 0; i < attr->num_values; i ++) + cupsdAddString(&(printer->users), attr->values[i].string.text); + } + } + else if (!strcmp(attr->name, "requesting-user-name-denied")) + { + cupsdFreeStrings(&(printer->users)); + + printer->deny_users = 1; + + if (attr->value_tag == IPP_TAG_NAME && + (attr->num_values > 1 || + strcmp(attr->values[0].string.text, "none"))) + { + for (i = 0; i < attr->num_values; i ++) + cupsdAddString(&(printer->users), attr->values[i].string.text); + } + } + else if (!strcmp(attr->name, "job-quota-period")) + { + if (attr->value_tag != IPP_TAG_INTEGER) + continue; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-quota-period to %d...", + attr->values[0].integer); + cupsdFreeQuotas(printer); + + printer->quota_period = attr->values[0].integer; + } + else if (!strcmp(attr->name, "job-k-limit")) + { + if (attr->value_tag != IPP_TAG_INTEGER) + continue; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-k-limit to %d...", + attr->values[0].integer); + cupsdFreeQuotas(printer); + + printer->k_limit = attr->values[0].integer; + } + else if (!strcmp(attr->name, "job-page-limit")) + { + if (attr->value_tag != IPP_TAG_INTEGER) + continue; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Setting job-page-limit to %d...", + attr->values[0].integer); + cupsdFreeQuotas(printer); + + printer->page_limit = attr->values[0].integer; + } + else if (!strcmp(attr->name, "printer-op-policy")) + { + cupsd_policy_t *p; /* Policy */ + + + if (attr->value_tag != IPP_TAG_NAME) + continue; + + if ((p = cupsdFindPolicy(attr->values[0].string.text)) != NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting printer-op-policy to \"%s\"...", + attr->values[0].string.text); + cupsdSetString(&printer->op_policy, attr->values[0].string.text); + printer->op_policy_ptr = p; + } + else + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Unknown printer-op-policy \"%s\"."), + attr->values[0].string.text); + return; + } + } + else if (!strcmp(attr->name, "printer-error-policy")) + { + if (attr->value_tag != IPP_TAG_NAME && attr->value_tag != IPP_TAG_KEYWORD) + continue; + + if (strcmp(attr->values[0].string.text, "retry-current-job") && + ((printer->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_CLASS)) || + (strcmp(attr->values[0].string.text, "abort-job") && + strcmp(attr->values[0].string.text, "retry-job") && + strcmp(attr->values[0].string.text, "stop-printer")))) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, + _("Unknown printer-error-policy \"%s\"."), + attr->values[0].string.text); + return; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting printer-error-policy to \"%s\"...", + attr->values[0].string.text); + cupsdSetString(&printer->error_policy, attr->values[0].string.text); + } + + /* + * Skip any other non-default attributes... + */ + + namelen = strlen(attr->name); + if (namelen < 9 || strcmp(attr->name + namelen - 8, "-default") || + namelen > (sizeof(name) - 1) || attr->num_values != 1) + continue; + + /* + * OK, anything else must be a user-defined default... + */ + + strlcpy(name, attr->name, sizeof(name)); + name[namelen - 8] = '\0'; /* Strip "-default" */ + + switch (attr->value_tag) + { + case IPP_TAG_DELETEATTR : + printer->num_options = cupsRemoveOption(name, + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Deleting %s", attr->name); + break; + + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + printer->num_options = cupsAddOption(name, + attr->values[0].string.text, + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting %s to \"%s\"...", attr->name, + attr->values[0].string.text); + break; + + case IPP_TAG_BOOLEAN : + printer->num_options = cupsAddOption(name, + attr->values[0].boolean ? + "true" : "false", + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting %s to %s...", attr->name, + attr->values[0].boolean ? "true" : "false"); + break; + + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + sprintf(value, "%d", attr->values[0].integer); + printer->num_options = cupsAddOption(name, value, + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting %s to %s...", attr->name, value); + break; + + case IPP_TAG_RANGE : + sprintf(value, "%d-%d", attr->values[0].range.lower, + attr->values[0].range.upper); + printer->num_options = cupsAddOption(name, value, + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting %s to %s...", attr->name, value); + break; + + case IPP_TAG_RESOLUTION : + sprintf(value, "%dx%d%s", attr->values[0].resolution.xres, + attr->values[0].resolution.yres, + attr->values[0].resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + printer->num_options = cupsAddOption(name, value, + printer->num_options, + &(printer->options)); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Setting %s to %s...", attr->name, value); + break; + + default : + /* Do nothing for other values */ + break; + } + } +} + + +/* + * 'start_printer()' - Start a printer. + */ + +static void +start_printer(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + int i; /* Temporary variable */ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_printer(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Start the printer... + */ + + printer->state_message[0] = '\0'; + + cupsdStartPrinter(printer, 1); + + if (dtype & CUPS_PRINTER_CLASS) + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" started by \"%s\".", + printer->name, get_username(con)); + else + cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" started by \"%s\".", + printer->name, get_username(con)); + + cupsdCheckJobs(); + + /* + * Check quotas... + */ + + if ((i = check_quotas(con, printer)) < 0) + { + send_ipp_status(con, IPP_NOT_POSSIBLE, _("Quota limit reached.")); + return; + } + else if (i == 0) + { + send_ipp_status(con, IPP_NOT_AUTHORIZED, _("Not allowed to print.")); + return; + } + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'stop_printer()' - Stop a printer. + */ + +static void +stop_printer(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + cupsd_printer_t *printer; /* Printer data */ + ipp_attribute_t *attr; /* printer-state-message attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_printer(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + + /* + * Stop the printer... + */ + + if ((attr = ippFindAttribute(con->request, "printer-state-message", + IPP_TAG_TEXT)) == NULL) + strcpy(printer->state_message, "Paused"); + else + { + strlcpy(printer->state_message, attr->values[0].string.text, + sizeof(printer->state_message)); + } + + cupsdStopPrinter(printer, 1); + + if (dtype & CUPS_PRINTER_CLASS) + cupsdLogMessage(CUPSD_LOG_INFO, "Class \"%s\" stopped by \"%s\".", + printer->name, get_username(con)); + else + cupsdLogMessage(CUPSD_LOG_INFO, "Printer \"%s\" stopped by \"%s\".", + printer->name, get_username(con)); + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'url_encode_attr()' - URL-encode a string attribute. + */ + +static void +url_encode_attr(ipp_attribute_t *attr, /* I - Attribute */ + char *buffer,/* I - String buffer */ + int bufsize)/* I - Size of buffer */ +{ + int i; /* Looping var */ + char *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + + + strlcpy(buffer, attr->name, bufsize); + bufptr = buffer + strlen(buffer); + bufend = buffer + bufsize - 1; + + for (i = 0; i < attr->num_values; i ++) + { + if (bufptr >= bufend) + break; + + if (i) + *bufptr++ = ','; + else + *bufptr++ = '='; + + if (bufptr >= bufend) + break; + + *bufptr++ = '\''; + + bufptr = url_encode_string(attr->values[i].string.text, + bufptr, bufend - bufptr + 1); + + if (bufptr >= bufend) + break; + + *bufptr++ = '\''; + } + + *bufptr = '\0'; +} + + +/* + * 'url_encode_string()' - URL-encode a string. + */ + +static char * /* O - End of string */ +url_encode_string(const char *s, /* I - String */ + char *buffer, /* I - String buffer */ + int bufsize) /* I - Size of buffer */ +{ + char *bufptr, /* Pointer into buffer */ + *bufend; /* End of buffer */ + static const char *hex = "0123456789ABCDEF"; + /* Hex digits */ + + + bufptr = buffer; + bufend = buffer + bufsize - 1; + + while (*s && bufptr < bufend) + { + if (*s == ' ' || *s == '%' || *s == '+') + { + if (bufptr >= (bufend - 2)) + break; + + *bufptr++ = '%'; + *bufptr++ = hex[(*s >> 4) & 15]; + *bufptr++ = hex[*s & 15]; + + s ++; + } + else if (*s == '\'' || *s == '\\') + { + if (bufptr >= (bufend - 1)) + break; + + *bufptr++ = '\\'; + *bufptr++ = *s++; + } + else + *bufptr++ = *s++; + } + + *bufptr = '\0'; + + return (bufptr); +} + + +/* + * 'user_allowed()' - See if a user is allowed to print to a queue. + */ + +static int /* O - 0 if not allowed, 1 if allowed */ +user_allowed(cupsd_printer_t *p, /* I - Printer or class */ + const char *username) /* I - Username */ +{ + struct passwd *pw; /* User password data */ + char baseuser[256], /* Base username */ + *baseptr, /* Pointer to "@" in base username */ + *name; /* Current user name */ + + + if (cupsArrayCount(p->users) == 0) + return (1); + + if (!strcmp(username, "root")) + return (1); + + if (strchr(username, '@')) + { + /* + * Strip @REALM for username check... + */ + + strlcpy(baseuser, username, sizeof(baseuser)); + + if ((baseptr = strchr(baseuser, '@')) != NULL) + *baseptr = '\0'; + + username = baseuser; + } + + pw = getpwnam(username); + endpwent(); + + for (name = (char *)cupsArrayFirst(p->users); + name; + name = (char *)cupsArrayNext(p->users)) + { + if (name[0] == '@') + { + /* + * Check group membership... + */ + + if (cupsdCheckGroup(username, pw, name + 1)) + break; + } + else if (name[0] == '#') + { + /* + * Check UUID... + */ + + if (cupsdCheckGroup(username, pw, name)) + break; + } + else if (!_cups_strcasecmp(username, name)) + break; + } + + return ((name != NULL) != p->deny_users); +} + + +/* + * 'validate_job()' - Validate printer options and destination. + */ + +static void +validate_job(cupsd_client_t *con, /* I - Client connection */ + ipp_attribute_t *uri) /* I - Printer URI */ +{ + http_status_t status; /* Policy status */ + ipp_attribute_t *attr, /* Current attribute */ + *auth_info; /* auth-info attribute */ + ipp_attribute_t *format; /* Document-format attribute */ + cups_ptype_t dtype; /* Destination type (printer/class) */ + char super[MIME_MAX_SUPER], + /* Supertype of file */ + type[MIME_MAX_TYPE]; + /* Subtype of file */ + cupsd_printer_t *printer; /* Printer */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "validate_job(%p[%d], %s)", con, + con->http.fd, uri->values[0].string.text); + + /* + * OK, see if the client is sending the document compressed - CUPS + * doesn't support compression yet... + */ + + if ((attr = ippFindAttribute(con->request, "compression", + IPP_TAG_KEYWORD)) != NULL) + { + if (strcmp(attr->values[0].string.text, "none") +#ifdef HAVE_LIBZ + && strcmp(attr->values[0].string.text, "gzip") +#endif /* HAVE_LIBZ */ + ) + { + send_ipp_status(con, IPP_ATTRIBUTES, + _("Unsupported compression \"%s\"."), + attr->values[0].string.text); + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_KEYWORD, + "compression", NULL, attr->values[0].string.text); + return; + } + } + + /* + * Is it a format we support? + */ + + if ((format = ippFindAttribute(con->request, "document-format", + IPP_TAG_MIMETYPE)) != NULL) + { + if (sscanf(format->values[0].string.text, "%15[^/]/%31[^;]", + super, type) != 2) + { + send_ipp_status(con, IPP_BAD_REQUEST, _("Bad document-format \"%s\"."), + format->values[0].string.text); + return; + } + + if ((strcmp(super, "application") || strcmp(type, "octet-stream")) && + !mimeType(MimeDatabase, super, type)) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Hint: Do you have the raw file printing rules enabled?"); + send_ipp_status(con, IPP_DOCUMENT_FORMAT, + _("Unsupported document-format \"%s\"."), + format->values[0].string.text); + ippAddString(con->response, IPP_TAG_UNSUPPORTED_GROUP, IPP_TAG_MIMETYPE, + "document-format", NULL, format->values[0].string.text); + return; + } + } + + /* + * Is the destination valid? + */ + + if (!cupsdValidateDest(uri->values[0].string.text, &dtype, &printer)) + { + /* + * Bad URI... + */ + + send_ipp_status(con, IPP_NOT_FOUND, + _("The printer or class does not exist.")); + return; + } + + /* + * Check policy... + */ + + auth_info = ippFindAttribute(con->request, "auth-info", IPP_TAG_TEXT); + + if ((status = cupsdCheckPolicy(printer->op_policy_ptr, con, NULL)) != HTTP_OK) + { + send_http_error(con, status, printer); + return; + } + else if (printer->num_auth_info_required == 1 && + !strcmp(printer->auth_info_required[0], "negotiate") && + !con->username[0]) + { + send_http_error(con, HTTP_UNAUTHORIZED, printer); + return; + } +#ifdef HAVE_SSL + else if (auth_info && !con->http.tls && + !httpAddrLocalhost(con->http.hostaddr)) + { + /* + * Require encryption of auth-info over non-local connections... + */ + + send_http_error(con, HTTP_UPGRADE_REQUIRED, printer); + return; + } +#endif /* HAVE_SSL */ + + /* + * Everything was ok, so return OK status... + */ + + con->response->request.status.status_code = IPP_OK; +} + + +/* + * 'validate_name()' - Make sure the printer name only contains valid chars. + */ + +static int /* O - 0 if name is no good, 1 if good */ +validate_name(const char *name) /* I - Name to check */ +{ + const char *ptr; /* Pointer into name */ + + + /* + * Scan the whole name... + */ + + for (ptr = name; *ptr; ptr ++) + if ((*ptr > 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || *ptr == '#') + return (0); + + /* + * All the characters are good; validate the length, too... + */ + + return ((ptr - name) < 128); +} + + +/* + * 'validate_user()' - Validate the user for the request. + */ + +static int /* O - 1 if permitted, 0 otherwise */ +validate_user(cupsd_job_t *job, /* I - Job */ + cupsd_client_t *con, /* I - Client connection */ + const char *owner, /* I - Owner of job/resource */ + char *username, /* O - Authenticated username */ + int userlen) /* I - Length of username */ +{ + cupsd_printer_t *printer; /* Printer for job */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "validate_user(job=%d, con=%d, owner=\"%s\", username=%p, " + "userlen=%d)", + job->id, con ? con->http.fd : 0, + owner ? owner : "(null)", username, userlen); + + /* + * Validate input... + */ + + if (!con || !owner || !username || userlen <= 0) + return (0); + + /* + * Get the best authenticated username that is available. + */ + + strlcpy(username, get_username(con), userlen); + + /* + * Check the username against the owner... + */ + + printer = cupsdFindDest(job->dest); + + return (cupsdCheckPolicy(printer ? printer->op_policy_ptr : DefaultPolicyPtr, + con, owner) == HTTP_OK); +} + + +/* + * End of "$Id: ipp.c 10274 2012-02-13 20:42:51Z mike $". + */ diff --git a/scheduler/job.c b/scheduler/job.c new file mode 100644 index 0000000..9150e5f --- /dev/null +++ b/scheduler/job.c @@ -0,0 +1,4776 @@ +/* + * "$Id: job.c 10420 2012-04-20 03:01:06Z mike $" + * + * Job management routines for the CUPS scheduler. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddJob() - Add a new job to the job queue. + * cupsdCancelJobs() - Cancel all jobs for the given + * destination/user. + * cupsdCheckJobs() - Check the pending jobs and start any if the + * destination is available. + * cupsdCleanJobs() - Clean out old jobs. + * cupsdContinueJob() - Continue printing with the next file in a job. + * cupsdDeleteJob() - Free all memory used by a job. + * cupsdFreeAllJobs() - Free all jobs from memory. + * cupsdFindJob() - Find the specified job. + * cupsdGetPrinterJobCount() - Get the number of pending, processing, or held + * jobs in a printer or class. + * cupsdGetUserJobCount() - Get the number of pending, processing, or held + * jobs for a user. + * cupsdLoadAllJobs() - Load all jobs from disk. + * cupsdLoadJob() - Load a single job. + * cupsdMoveJob() - Move the specified job to a different + * destination. + * cupsdReleaseJob() - Release the specified job. + * cupsdRestartJob() - Restart the specified job. + * cupsdSaveAllJobs() - Save a summary of all jobs to disk. + * cupsdSaveJob() - Save a job to disk. + * cupsdSetJobHoldUntil() - Set the hold time for a job. + * cupsdSetJobPriority() - Set the priority of a job, moving it up/down + * in the list as needed. + * cupsdSetJobState() - Set the state of the specified print job. + * cupsdStopAllJobs() - Stop all print jobs. + * cupsdUnloadCompletedJobs() - Flush completed job history from memory. + * compare_active_jobs() - Compare the job IDs and priorities of two + * jobs. + * compare_jobs() - Compare the job IDs of two jobs. + * dump_job_history() - Dump any debug messages for a job. + * free_job_history() - Free any log history. + * finalize_job() - Cleanup after job filter processes and support + * data. + * get_options() - Get a string containing the job options. + * ipp_length() - Compute the size of the buffer needed to hold + * the textual IPP attributes. + * load_job_cache() - Load jobs from the job.cache file. + * load_next_job_id() - Load the NextJobId value from the job.cache + * file. + * load_request_root() - Load jobs from the RequestRoot directory. + * set_time() - Set one of the "time-at-xyz" attributes. + * start_job() - Start a print job. + * stop_job() - Stop a print job. + * unload_job() - Unload a job from memory. + * update_job() - Read a status update from a job's filters. + * update_job_attrs() - Update the job-printer-* attributes. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#include +#include +#ifdef __APPLE__ +# include +# ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H +# include +# endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */ +#endif /* __APPLE__ */ + + +/* + * Design Notes for Job Management + * ------------------------------- + * + * STATE CHANGES + * + * pending Do nothing/check jobs + * pending-held Send SIGTERM to filters and backend + * processing Do nothing/start job + * stopped Send SIGKILL to filters and backend + * canceled Send SIGTERM to filters and backend + * aborted Finalize + * completed Finalize + * + * Finalize clears the printer <-> job association, deletes the status + * buffer, closes all of the pipes, etc. and doesn't get run until all of + * the print processes are finished. + * + * UNLOADING OF JOBS (cupsdUnloadCompletedJobs) + * + * We unload the job attributes when they are not needed to reduce overall + * memory consumption. We don't unload jobs where job->state_value < + * IPP_JOB_STOPPED, job->printer != NULL, or job->access_time is recent. + * + * STARTING OF JOBS (start_job) + * + * When a job is started, a status buffer, several pipes, a security + * profile, and a backend process are created for the life of that job. + * These are shared for every file in a job. For remote print jobs, the + * IPP backend is provided with every file in the job and no filters are + * run. + * + * The job->printer member tracks which printer is printing a job, which + * can be different than the destination in job->dest for classes. The + * printer object also has a job pointer to track which job is being + * printed. + * + * PRINTING OF JOB FILES (cupsdContinueJob) + * + * Each file in a job is filtered by 0 or more programs. After getting the + * list of filters needed and the total cost, the job is either passed or + * put back to the processing state until the current FilterLevel comes down + * enough to allow printing. + * + * If we can print, we build a string for the print options and run each of + * the filters, piping the output from one into the next. + * + * JOB STATUS UPDATES (update_job) + * + * The update_job function gets called whenever there are pending messages + * on the status pipe. These generally are updates to the marker-*, + * printer-state-message, or printer-state-reasons attributes. On EOF, + * finalize_job is called to clean up. + * + * FINALIZING JOBS (finalize_job) + * + * When all filters and the backend are done, we set the job state to + * completed (no errors), aborted (filter errors or abort-job policy), + * pending-held (auth required or retry-job policy), or pending + * (retry-current-job or stop-printer policies) as appropriate. + * + * Then we close the pipes and free the status buffers and profiles. + * + * JOB FILE COMPLETION (process_children in main.c) + * + * For multiple-file jobs, process_children (in main.c) sees that all + * filters have exited and calls in to print the next file if there are + * more files in the job, otherwise it waits for the backend to exit and + * update_job to do the cleanup. + */ + + +/* + * Local globals... + */ + +static mime_filter_t gziptoany_filter = + { + NULL, /* Source type */ + NULL, /* Destination type */ + 0, /* Cost */ + "gziptoany" /* Filter program to run */ + }; + + +/* + * Local functions... + */ + +static int compare_active_jobs(void *first, void *second, void *data); +static int compare_jobs(void *first, void *second, void *data); +static void dump_job_history(cupsd_job_t *job); +static void finalize_job(cupsd_job_t *job, int set_job_state); +static void free_job_history(cupsd_job_t *job); +static char *get_options(cupsd_job_t *job, int banner_page, char *copies, + size_t copies_size, char *title, + size_t title_size); +static size_t ipp_length(ipp_t *ipp); +static void load_job_cache(const char *filename); +static void load_next_job_id(const char *filename); +static void load_request_root(void); +static void set_time(cupsd_job_t *job, const char *name); +static void start_job(cupsd_job_t *job, cupsd_printer_t *printer); +static void stop_job(cupsd_job_t *job, cupsd_jobaction_t action); +static void unload_job(cupsd_job_t *job); +static void update_job(cupsd_job_t *job); +static void update_job_attrs(cupsd_job_t *job, int do_message); + + +/* + * 'cupsdAddJob()' - Add a new job to the job queue. + */ + +cupsd_job_t * /* O - New job record */ +cupsdAddJob(int priority, /* I - Job priority */ + const char *dest) /* I - Job destination */ +{ + cupsd_job_t *job; /* New job record */ + + + if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL) + return (NULL); + + job->id = NextJobId ++; + job->priority = priority; + job->back_pipes[0] = -1; + job->back_pipes[1] = -1; + job->print_pipes[0] = -1; + job->print_pipes[1] = -1; + job->side_pipes[0] = -1; + job->side_pipes[1] = -1; + job->status_pipes[0] = -1; + job->status_pipes[1] = -1; + + cupsdSetString(&job->dest, dest); + + /* + * Add the new job to the "all jobs" and "active jobs" lists... + */ + + cupsArrayAdd(Jobs, job); + cupsArrayAdd(ActiveJobs, job); + + return (job); +} + + +/* + * 'cupsdCancelJobs()' - Cancel all jobs for the given destination/user. + */ + +void +cupsdCancelJobs(const char *dest, /* I - Destination to cancel */ + const char *username, /* I - Username or NULL */ + int purge) /* I - Purge jobs? */ +{ + cupsd_job_t *job; /* Current job */ + + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + { + if ((!job->dest || !job->username) && !cupsdLoadJob(job)) + continue; + + if ((!dest || !strcmp(job->dest, dest)) && + (!username || !strcmp(job->username, username))) + { + /* + * Cancel all jobs matching this destination/user... + */ + + if (purge) + cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_PURGE, + "Job purged by user."); + else if (job->state_value < IPP_JOB_CANCELED) + cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, + "Job canceled by user."); + } + } + + cupsdCheckJobs(); +} + + +/* + * 'cupsdCheckJobs()' - Check the pending jobs and start any if the destination + * is available. + */ + +void +cupsdCheckJobs(void) +{ + cupsd_job_t *job; /* Current job in queue */ + cupsd_printer_t *printer, /* Printer destination */ + *pclass; /* Printer class destination */ + ipp_attribute_t *attr; /* Job attribute */ + time_t curtime; /* Current time */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d", + cupsArrayCount(ActiveJobs), Sleeping, NeedReload); + + curtime = time(NULL); + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + { + /* + * Kill jobs if they are unresponsive... + */ + + if (job->kill_time && job->kill_time <= curtime) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Stopping unresponsive job!", + job->id); + + stop_job(job, CUPSD_JOB_FORCE); + continue; + } + + /* + * Start held jobs if they are ready... + */ + + if (job->state_value == IPP_JOB_HELD && + job->hold_until && + job->hold_until < curtime) + { + if (job->pending_timeout) + { + /* + * This job is pending; check that we don't have an active Send-Document + * operation in progress on any of the client connections, then timeout + * the job so we can start printing... + */ + + cupsd_client_t *con; /* Current client connection */ + + + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + if (con->request && + con->request->request.op.operation_id == IPP_SEND_DOCUMENT) + break; + + if (con) + continue; + + if (cupsdTimeoutJob(job)) + continue; + } + + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job submission timed out."); + } + + /* + * Continue jobs that are waiting on the FilterLimit... + */ + + if (job->pending_cost > 0 && + ((FilterLevel + job->pending_cost) < FilterLimit || FilterLevel == 0)) + cupsdContinueJob(job); + + /* + * Start pending jobs if the destination is available... + */ + + if (job->state_value == IPP_JOB_PENDING && !NeedReload && +#ifndef kIOPMAssertionTypeDenySystemSleep + !Sleeping && +#endif /* !kIOPMAssertionTypeDenySystemSleep */ + !DoingShutdown && !job->printer) + { + printer = cupsdFindDest(job->dest); + pclass = NULL; + + while (printer && + (printer->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_CLASS))) + { + /* + * If the class is remote, just pass it to the remote server... + */ + + pclass = printer; + + if (pclass->state == IPP_PRINTER_STOPPED) + printer = NULL; + else if (pclass->type & CUPS_PRINTER_REMOTE) + break; + else + printer = cupsdFindAvailablePrinter(printer->name); + } + + if (!printer && !pclass) + { + /* + * Whoa, the printer and/or class for this destination went away; + * cancel the job... + */ + + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Job aborted because the destination printer/class " + "has gone away."); + } + else if (printer && !printer->holding_new_jobs) + { + /* + * See if the printer is available or remote and not printing a job; + * if so, start the job... + */ + + if (pclass) + { + /* + * Add/update a job-actual-printer-uri attribute for this job + * so that we know which printer actually printed the job... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-actual-printer-uri", + IPP_TAG_URI)) != NULL) + cupsdSetString(&attr->values[0].string.text, printer->uri); + else + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_URI, + "job-actual-printer-uri", NULL, printer->uri); + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + + if ((!(printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is local */ + printer->state == IPP_PRINTER_IDLE) || /* and idle, OR */ + ((printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is remote */ + !printer->job)) /* and not printing */ + { + /* + * Start the job... + */ + + start_job(job, printer); + } + } + } + } +} + + +/* + * 'cupsdCleanJobs()' - Clean out old jobs. + */ + +void +cupsdCleanJobs(void) +{ + cupsd_job_t *job; /* Current job */ + + + if (MaxJobs <= 0 && JobHistory) + return; + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job && (cupsArrayCount(Jobs) >= MaxJobs || !JobHistory); + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + if (job->state_value >= IPP_JOB_CANCELED && !job->printer) + cupsdDeleteJob(job, CUPSD_JOB_PURGE); +} + + +/* + * 'cupsdContinueJob()' - Continue printing with the next file in a job. + */ + +void +cupsdContinueJob(cupsd_job_t *job) /* I - Job */ +{ + int i; /* Looping var */ + int slot; /* Pipe slot */ + cups_array_t *filters = NULL,/* Filters for job */ + *prefilters; /* Filters with prefilters */ + mime_filter_t *filter, /* Current filter */ + *prefilter, /* Prefilter */ + port_monitor; /* Port monitor filter */ + char scheme[255]; /* Device URI scheme */ + ipp_attribute_t *attr; /* Current attribute */ + const char *ptr, /* Pointer into value */ + *abort_message; /* Abort message */ + ipp_jstate_t abort_state = IPP_JOB_STOPPED; + /* New job state on abort */ + struct stat backinfo; /* Backend file information */ + int backroot; /* Run backend as root? */ + int pid; /* Process ID of new filter process */ + int banner_page; /* 1 if banner page, 0 otherwise */ + int filterfds[2][2] = { { -1, -1 }, { -1, -1 } }; + /* Pipes used between filters */ + int envc; /* Number of environment variables */ + struct stat fileinfo; /* Job file information */ + char **argv = NULL, /* Filter command-line arguments */ + filename[1024], /* Job filename */ + command[1024], /* Full path to command */ + jobid[255], /* Job ID string */ + title[IPP_MAX_NAME], + /* Job title string */ + copies[255], /* # copies string */ + *options, /* Options string */ + *envp[MAX_ENV + 21], + /* Environment variables */ + charset[255], /* CHARSET env variable */ + class_name[255],/* CLASS env variable */ + classification[1024], + /* CLASSIFICATION env variable */ + content_type[1024], + /* CONTENT_TYPE env variable */ + device_uri[1024], + /* DEVICE_URI env variable */ + final_content_type[1024], + /* FINAL_CONTENT_TYPE env variable */ + lang[255], /* LANG env variable */ +#ifdef __APPLE__ + apple_language[255], + /* APPLE_LANGUAGE env variable */ +#endif /* __APPLE__ */ + auth_info_required[255], + /* AUTH_INFO_REQUIRED env variable */ + ppd[1024], /* PPD env variable */ + printer_info[255], + /* PRINTER_INFO env variable */ + printer_location[255], + /* PRINTER_LOCATION env variable */ + printer_name[255], + /* PRINTER env variable */ + *printer_state_reasons = NULL, + /* PRINTER_STATE_REASONS env var */ + rip_max_cache[255]; + /* RIP_MAX_CACHE env variable */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdContinueJob(job=%p(%d)): current_file=%d, num_files=%d", + job, job->id, job->current_file, job->num_files); + + /* + * Figure out what filters are required to convert from + * the source to the destination type... + */ + + FilterLevel -= job->cost; + + job->cost = 0; + job->pending_cost = 0; + + memset(job->filters, 0, sizeof(job->filters)); + + + if (job->printer->raw) + { + /* + * Remote jobs and raw queues go directly to the printer without + * filtering... + */ + + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw..."); + } + else + { + /* + * Local jobs get filtered... + */ + + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, job->current_file + 1); + if (stat(filename, &fileinfo)) + fileinfo.st_size = 0; + + filters = mimeFilter2(MimeDatabase, job->filetypes[job->current_file], + fileinfo.st_size, job->printer->filetype, + &(job->cost)); + + if (!filters) + { + cupsdLogJob(job, CUPSD_LOG_ERROR, + "Unable to convert file %d to printable format!", + job->current_file); + + abort_message = "Aborting job because it cannot be printed."; + abort_state = IPP_JOB_ABORTED; + + goto abort_job; + } + + /* + * Remove NULL ("-") filters... + */ + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + if (!strcmp(filter->filter, "-")) + cupsArrayRemove(filters, filter); + + if (cupsArrayCount(filters) == 0) + { + cupsArrayDelete(filters); + filters = NULL; + } + + /* + * If this printer has any pre-filters, insert the required pre-filter + * in the filters array... + */ + + if (job->printer->prefiltertype && filters) + { + prefilters = cupsArrayNew(NULL, NULL); + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if ((prefilter = mimeFilterLookup(MimeDatabase, filter->src, + job->printer->prefiltertype))) + { + cupsArrayAdd(prefilters, prefilter); + job->cost += prefilter->cost; + } + + cupsArrayAdd(prefilters, filter); + } + + cupsArrayDelete(filters); + filters = prefilters; + } + } + + /* + * Set a minimum cost of 100 for all jobs so that FilterLimit + * works with raw queues and other low-cost paths. + */ + + if (job->cost < 100) + job->cost = 100; + + /* + * See if the filter cost is too high... + */ + + if ((FilterLevel + job->cost) > FilterLimit && FilterLevel > 0 && + FilterLimit > 0) + { + /* + * Don't print this job quite yet... + */ + + cupsArrayDelete(filters); + + cupsdLogJob(job, CUPSD_LOG_INFO, + "Holding because filter limit has been reached."); + cupsdLogJob(job, CUPSD_LOG_DEBUG2, + "cupsdContinueJob: file=%d, cost=%d, level=%d, limit=%d", + job->current_file, job->cost, FilterLevel, + FilterLimit); + + job->pending_cost = job->cost; + job->cost = 0; + return; + } + + FilterLevel += job->cost; + + /* + * Add decompression/raw filter as needed... + */ + + if ((!job->printer->raw && job->compressions[job->current_file]) || + (!filters && !job->printer->remote && + (job->num_files > 1 || !strncmp(job->printer->device_uri, "file:", 5)))) + { + /* + * Add gziptoany filter to the front of the list... + */ + + if (!filters) + filters = cupsArrayNew(NULL, NULL); + + if (!cupsArrayInsert(filters, &gziptoany_filter)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to add decompression filter - %s", strerror(errno)); + + cupsArrayDelete(filters); + + abort_message = "Stopping job because the scheduler ran out of memory."; + + goto abort_job; + } + } + + /* + * Add port monitor, if any... + */ + + if (job->printer->port_monitor) + { + /* + * Add port monitor to the end of the list... + */ + + if (!filters) + filters = cupsArrayNew(NULL, NULL); + + port_monitor.src = NULL; + port_monitor.dst = NULL; + port_monitor.cost = 0; + + snprintf(port_monitor.filter, sizeof(port_monitor.filter), + "%s/monitor/%s", ServerBin, job->printer->port_monitor); + + if (!cupsArrayAdd(filters, &port_monitor)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to add port monitor - %s", strerror(errno)); + + abort_message = "Stopping job because the scheduler ran out of memory."; + + goto abort_job; + } + } + + /* + * Make sure we don't go over the "MAX_FILTERS" limit... + */ + + if (cupsArrayCount(filters) > MAX_FILTERS) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Too many filters (%d > %d), unable to print!", + cupsArrayCount(filters), MAX_FILTERS); + + abort_message = "Aborting job because it needs too many filters to print."; + abort_state = IPP_JOB_ABORTED; + + goto abort_job; + } + + /* + * Determine if we are printing a banner page or not... + */ + + if (job->job_sheets == NULL) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute."); + if ((job->job_sheets = + ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL) + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "... but someone added one without setting job_sheets!"); + } + else if (job->job_sheets->num_values == 1) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s", + job->job_sheets->values[0].string.text); + else + cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s", + job->job_sheets->values[0].string.text, + job->job_sheets->values[1].string.text); + + if (job->printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) + banner_page = 0; + else if (job->job_sheets == NULL) + banner_page = 0; + else if (_cups_strcasecmp(job->job_sheets->values[0].string.text, "none") != 0 && + job->current_file == 0) + banner_page = 1; + else if (job->job_sheets->num_values > 1 && + _cups_strcasecmp(job->job_sheets->values[1].string.text, "none") != 0 && + job->current_file == (job->num_files - 1)) + banner_page = 1; + else + banner_page = 0; + + if ((options = get_options(job, banner_page, copies, sizeof(copies), title, + sizeof(title))) == NULL) + { + abort_message = "Stopping job because the scheduler ran out of memory."; + + goto abort_job; + } + + /* + * Build the command-line arguments for the filters. Each filter + * has 6 or 7 arguments: + * + * argv[0] = printer + * argv[1] = job ID + * argv[2] = username + * argv[3] = title + * argv[4] = # copies + * argv[5] = options + * argv[6] = filename (optional; normally stdin) + * + * This allows legacy printer drivers that use the old System V + * printing interface to be used by CUPS. + * + * For remote jobs, we send all of the files in the argument list. + */ + + if (job->printer->remote) + argv = calloc(7 + job->num_files, sizeof(char *)); + else + argv = calloc(8, sizeof(char *)); + + if (!argv) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Unable to allocate argument array - %s", + strerror(errno)); + + abort_message = "Stopping job because the scheduler ran out of memory."; + + goto abort_job; + } + + sprintf(jobid, "%d", job->id); + + argv[0] = job->printer->name; + argv[1] = jobid; + argv[2] = job->username; + argv[3] = title; + argv[4] = copies; + argv[5] = options; + + if (job->printer->remote && job->num_files > 1) + { + for (i = 0; i < job->num_files; i ++) + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, i + 1); + argv[6 + i] = strdup(filename); + } + } + else + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, job->current_file + 1); + argv[6] = filename; + } + + for (i = 0; argv[i]; i ++) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "argv[%d]=\"%s\"", i, argv[i]); + + /* + * Create environment variable strings for the filters... + */ + + attr = ippFindAttribute(job->attrs, "attributes-natural-language", + IPP_TAG_LANGUAGE); + +#ifdef __APPLE__ + strcpy(apple_language, "APPLE_LANGUAGE="); + _cupsAppleLanguage(attr->values[0].string.text, + apple_language + 15, sizeof(apple_language) - 15); +#endif /* __APPLE__ */ + + switch (strlen(attr->values[0].string.text)) + { + default : + /* + * This is an unknown or badly formatted language code; use + * the POSIX locale... + */ + + strcpy(lang, "LANG=C"); + break; + + case 2 : + /* + * Just the language code (ll)... + */ + + snprintf(lang, sizeof(lang), "LANG=%s.UTF-8", + attr->values[0].string.text); + break; + + case 5 : + /* + * Language and country code (ll-cc)... + */ + + snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF-8", + attr->values[0].string.text[0], + attr->values[0].string.text[1], + toupper(attr->values[0].string.text[3] & 255), + toupper(attr->values[0].string.text[4] & 255)); + break; + } + + if ((attr = ippFindAttribute(job->attrs, "document-format", + IPP_TAG_MIMETYPE)) != NULL && + (ptr = strstr(attr->values[0].string.text, "charset=")) != NULL) + snprintf(charset, sizeof(charset), "CHARSET=%s", ptr + 8); + else + strlcpy(charset, "CHARSET=utf-8", sizeof(charset)); + + snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", + job->filetypes[job->current_file]->super, + job->filetypes[job->current_file]->type); + snprintf(device_uri, sizeof(device_uri), "DEVICE_URI=%s", + job->printer->device_uri); + snprintf(ppd, sizeof(ppd), "PPD=%s/ppd/%s.ppd", ServerRoot, + job->printer->name); + snprintf(printer_info, sizeof(printer_name), "PRINTER_INFO=%s", + job->printer->info ? job->printer->info : ""); + snprintf(printer_location, sizeof(printer_name), "PRINTER_LOCATION=%s", + job->printer->location ? job->printer->location : ""); + snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", job->printer->name); + if (job->printer->num_reasons > 0) + { + char *psrptr; /* Pointer into PRINTER_STATE_REASONS */ + size_t psrlen; /* Size of PRINTER_STATE_REASONS */ + + for (psrlen = 22, i = 0; i < job->printer->num_reasons; i ++) + psrlen += strlen(job->printer->reasons[i]) + 1; + + if ((printer_state_reasons = malloc(psrlen)) != NULL) + { + /* + * All of these strcpy's are safe because we allocated the psr string... + */ + + strcpy(printer_state_reasons, "PRINTER_STATE_REASONS="); + for (psrptr = printer_state_reasons + 22, i = 0; + i < job->printer->num_reasons; + i ++) + { + if (i) + *psrptr++ = ','; + strcpy(psrptr, job->printer->reasons[i]); + psrptr += strlen(psrptr); + } + } + } + snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); + + if (job->printer->num_auth_info_required == 1) + snprintf(auth_info_required, sizeof(auth_info_required), + "AUTH_INFO_REQUIRED=%s", + job->printer->auth_info_required[0]); + else if (job->printer->num_auth_info_required == 2) + snprintf(auth_info_required, sizeof(auth_info_required), + "AUTH_INFO_REQUIRED=%s,%s", + job->printer->auth_info_required[0], + job->printer->auth_info_required[1]); + else if (job->printer->num_auth_info_required == 3) + snprintf(auth_info_required, sizeof(auth_info_required), + "AUTH_INFO_REQUIRED=%s,%s,%s", + job->printer->auth_info_required[0], + job->printer->auth_info_required[1], + job->printer->auth_info_required[2]); + else if (job->printer->num_auth_info_required == 4) + snprintf(auth_info_required, sizeof(auth_info_required), + "AUTH_INFO_REQUIRED=%s,%s,%s,%s", + job->printer->auth_info_required[0], + job->printer->auth_info_required[1], + job->printer->auth_info_required[2], + job->printer->auth_info_required[3]); + else + strlcpy(auth_info_required, "AUTH_INFO_REQUIRED=none", + sizeof(auth_info_required)); + + envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + + envp[envc ++] = charset; + envp[envc ++] = lang; +#ifdef __APPLE__ + envp[envc ++] = apple_language; +#endif /* __APPLE__ */ + envp[envc ++] = ppd; + envp[envc ++] = rip_max_cache; + envp[envc ++] = content_type; + envp[envc ++] = device_uri; + envp[envc ++] = printer_info; + envp[envc ++] = printer_location; + envp[envc ++] = printer_name; + envp[envc ++] = printer_state_reasons ? printer_state_reasons : + "PRINTER_STATE_REASONS=none"; + envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" : + "CUPS_FILETYPE=document"; + + if (!job->printer->remote && !job->printer->raw) + { + filter = (mime_filter_t *)cupsArrayLast(filters); + + if (job->printer->port_monitor) + filter = (mime_filter_t *)cupsArrayPrev(filters); + + if (filter && filter->dst) + { + if ((ptr = strchr(filter->dst->type, '/')) != NULL) + snprintf(final_content_type, sizeof(final_content_type), + "FINAL_CONTENT_TYPE=%s", ptr + 1); + else + snprintf(final_content_type, sizeof(final_content_type), + "FINAL_CONTENT_TYPE=%s/%s", filter->dst->super, + filter->dst->type); + envp[envc ++] = final_content_type; + } + } + + if (Classification && !banner_page) + { + if ((attr = ippFindAttribute(job->attrs, "job-sheets", + IPP_TAG_NAME)) == NULL) + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + Classification); + else if (attr->num_values > 1 && + strcmp(attr->values[1].string.text, "none") != 0) + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + attr->values[1].string.text); + else + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + attr->values[0].string.text); + + envp[envc ++] = classification; + } + + if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + snprintf(class_name, sizeof(class_name), "CLASS=%s", job->dest); + envp[envc ++] = class_name; + } + + envp[envc ++] = auth_info_required; + + for (i = 0; + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + if (job->auth_env[i]) + envp[envc ++] = job->auth_env[i]; + else + break; + + if (job->auth_uid) + envp[envc ++] = job->auth_uid; + + envp[envc] = NULL; + + for (i = 0; i < envc; i ++) + if (!strncmp(envp[i], "AUTH_", 5)) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i, + envp[i][5]); + else if (strncmp(envp[i], "DEVICE_URI=", 11)) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]); + else + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i, + job->printer->sanitized_device_uri); + + if (job->printer->remote) + job->current_file = job->num_files; + else + job->current_file ++; + + /* + * Now create processes for all of the filters... + */ + + cupsdSetPrinterReasons(job->printer, "-cups-missing-filter-warning," + "cups-insecure-filter-warning"); + + for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + i ++, filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if (filter->filter[0] != '/') + snprintf(command, sizeof(command), "%s/filter/%s", ServerBin, + filter->filter); + else + strlcpy(command, filter->filter, sizeof(command)); + + if (i < (cupsArrayCount(filters) - 1)) + { + if (cupsdOpenPipe(filterfds[slot])) + { + abort_message = "Stopping job because the scheduler could not create " + "the filter pipes."; + + goto abort_job; + } + } + else + { + if (job->current_file == 1 || + (job->printer->pc && job->printer->pc->single_file)) + { + if (strncmp(job->printer->device_uri, "file:", 5) != 0) + { + if (cupsdOpenPipe(job->print_pipes)) + { + abort_message = "Stopping job because the scheduler could not " + "create the backend pipes."; + + goto abort_job; + } + } + else + { + job->print_pipes[0] = -1; + if (!strcmp(job->printer->device_uri, "file:/dev/null") || + !strcmp(job->printer->device_uri, "file:///dev/null")) + job->print_pipes[1] = -1; + else + { + if (!strncmp(job->printer->device_uri, "file:/dev/", 10)) + job->print_pipes[1] = open(job->printer->device_uri + 5, + O_WRONLY | O_EXCL); + else if (!strncmp(job->printer->device_uri, "file:///dev/", 12)) + job->print_pipes[1] = open(job->printer->device_uri + 7, + O_WRONLY | O_EXCL); + else if (!strncmp(job->printer->device_uri, "file:///", 8)) + job->print_pipes[1] = open(job->printer->device_uri + 7, + O_WRONLY | O_CREAT | O_TRUNC, 0600); + else + job->print_pipes[1] = open(job->printer->device_uri + 5, + O_WRONLY | O_CREAT | O_TRUNC, 0600); + + if (job->print_pipes[1] < 0) + { + abort_message = "Stopping job because the scheduler could not " + "open the output file."; + + goto abort_job; + } + + fcntl(job->print_pipes[1], F_SETFD, + fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC); + } + } + } + + filterfds[slot][0] = job->print_pipes[0]; + filterfds[slot][1] = job->print_pipes[1]; + } + + pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], + filterfds[slot][1], job->status_pipes[1], + job->back_pipes[0], job->side_pipes[0], 0, + job->profile, job, job->filters + i); + + cupsdClosePipe(filterfds[!slot]); + + if (pid == 0) + { + cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.", + filter->filter, strerror(errno)); + + abort_message = "Stopping job because the scheduler could not execute a " + "filter."; + + goto abort_job; + } + + cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command, + pid); + + argv[6] = NULL; + slot = !slot; + } + + cupsArrayDelete(filters); + filters = NULL; + + /* + * Finally, pipe the final output into a backend process if needed... + */ + + if (strncmp(job->printer->device_uri, "file:", 5) != 0) + { + if (job->current_file == 1 || job->printer->remote || + (job->printer->pc && job->printer->pc->single_file)) + { + sscanf(job->printer->device_uri, "%254[^:]", scheme); + snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, scheme); + + /* + * See if the backend needs to run as root... + */ + + if (RunUser) + backroot = 0; + else if (stat(command, &backinfo)) + backroot = 0; + else + backroot = !(backinfo.st_mode & (S_IWGRP | S_IXGRP | S_IWOTH | S_IXOTH)); + + argv[0] = job->printer->sanitized_device_uri; + + filterfds[slot][0] = -1; + filterfds[slot][1] = -1; + + pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], + filterfds[slot][1], job->status_pipes[1], + job->back_pipes[1], job->side_pipes[1], + backroot, job->profile, job, &(job->backend)); + + if (pid == 0) + { + abort_message = "Stopping job because the sheduler could not execute " + "the backend."; + + goto abort_job; + } + else + { + cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)", + command, pid); + } + } + + if (job->current_file == job->num_files || + (job->printer->pc && job->printer->pc->single_file)) + cupsdClosePipe(job->print_pipes); + + if (job->current_file == job->num_files) + { + cupsdClosePipe(job->back_pipes); + cupsdClosePipe(job->side_pipes); + + close(job->status_pipes[1]); + job->status_pipes[1] = -1; + } + } + else + { + filterfds[slot][0] = -1; + filterfds[slot][1] = -1; + + if (job->current_file == job->num_files || + (job->printer->pc && job->printer->pc->single_file)) + cupsdClosePipe(job->print_pipes); + + if (job->current_file == job->num_files) + { + close(job->status_pipes[1]); + job->status_pipes[1] = -1; + } + } + + cupsdClosePipe(filterfds[slot]); + + if (job->printer->remote && job->num_files > 1) + { + for (i = 0; i < job->num_files; i ++) + free(argv[i + 6]); + } + + free(argv); + if (printer_state_reasons) + free(printer_state_reasons); + + cupsdAddSelect(job->status_buffer->fd, (cupsd_selfunc_t)update_job, NULL, + job); + + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.", + job->id); + + return; + + + /* + * If we get here, we need to abort the current job and close out all + * files and pipes... + */ + + abort_job: + + FilterLevel -= job->cost; + job->cost = 0; + + for (slot = 0; slot < 2; slot ++) + cupsdClosePipe(filterfds[slot]); + + cupsArrayDelete(filters); + + if (argv) + { + if (job->printer->remote && job->num_files > 1) + { + for (i = 0; i < job->num_files; i ++) + free(argv[i + 6]); + } + + free(argv); + } + + if (printer_state_reasons) + free(printer_state_reasons); + + cupsdClosePipe(job->print_pipes); + cupsdClosePipe(job->back_pipes); + cupsdClosePipe(job->side_pipes); + + cupsdRemoveSelect(job->status_pipes[0]); + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + /* + * Update the printer and job state. + */ + + cupsdSetJobState(job, abort_state, CUPSD_JOB_DEFAULT, "%s", abort_message); + cupsdSetPrinterState(job->printer, IPP_PRINTER_IDLE, 0); + update_job_attrs(job, 0); + + if (job->history) + free_job_history(job); + + cupsArrayRemove(PrintingJobs, job); + + /* + * Clear the printer <-> job association... + */ + + job->printer->job = NULL; + job->printer = NULL; +} + + +/* + * 'cupsdDeleteJob()' - Free all memory used by a job. + */ + +void +cupsdDeleteJob(cupsd_job_t *job, /* I - Job */ + cupsd_jobaction_t action)/* I - Action */ +{ + int i; /* Looping var */ + char filename[1024]; /* Job filename */ + + + if (job->printer) + finalize_job(job, 1); + + if (action == CUPSD_JOB_PURGE) + { + /* + * Remove the job info file... + */ + + snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, + job->id); + if (Classification) + cupsdRemoveFile(filename); + else + unlink(filename); + } + + cupsdClearString(&job->username); + cupsdClearString(&job->dest); + for (i = 0; + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + cupsdClearString(job->auth_env + i); + cupsdClearString(&job->auth_uid); + + if (job->num_files > 0) + { + free(job->compressions); + free(job->filetypes); + + if (action == CUPSD_JOB_PURGE) + { + while (job->num_files > 0) + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, job->num_files); + if (Classification) + cupsdRemoveFile(filename); + else + unlink(filename); + + job->num_files --; + } + } + else + job->num_files = 0; + } + + if (job->history) + free_job_history(job); + + unload_job(job); + + cupsArrayRemove(Jobs, job); + cupsArrayRemove(ActiveJobs, job); + cupsArrayRemove(PrintingJobs, job); + + free(job); +} + + +/* + * 'cupsdFreeAllJobs()' - Free all jobs from memory. + */ + +void +cupsdFreeAllJobs(void) +{ + cupsd_job_t *job; /* Current job */ + + + if (!Jobs) + return; + + cupsdHoldSignals(); + + cupsdStopAllJobs(CUPSD_JOB_FORCE, 0); + cupsdSaveAllJobs(); + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + cupsdDeleteJob(job, CUPSD_JOB_DEFAULT); + + cupsdReleaseSignals(); +} + + +/* + * 'cupsdFindJob()' - Find the specified job. + */ + +cupsd_job_t * /* O - Job data */ +cupsdFindJob(int id) /* I - Job ID */ +{ + cupsd_job_t key; /* Search key */ + + + key.id = id; + + return ((cupsd_job_t *)cupsArrayFind(Jobs, &key)); +} + + +/* + * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing, + * or held jobs in a printer or class. + */ + +int /* O - Job count */ +cupsdGetPrinterJobCount( + const char *dest) /* I - Printer or class name */ +{ + int count; /* Job count */ + cupsd_job_t *job; /* Current job */ + + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (job->dest && !_cups_strcasecmp(job->dest, dest)) + count ++; + + return (count); +} + + +/* + * 'cupsdGetUserJobCount()' - Get the number of pending, processing, + * or held jobs for a user. + */ + +int /* O - Job count */ +cupsdGetUserJobCount( + const char *username) /* I - Username */ +{ + int count; /* Job count */ + cupsd_job_t *job; /* Current job */ + + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (!_cups_strcasecmp(job->username, username)) + count ++; + + return (count); +} + + +/* + * 'cupsdLoadAllJobs()' - Load all jobs from disk. + */ + +void +cupsdLoadAllJobs(void) +{ + char filename[1024]; /* Full filename of job.cache file */ + struct stat fileinfo, /* Information on job.cache file */ + dirinfo; /* Information on RequestRoot dir */ + + + + /* + * Create the job arrays as needed... + */ + + if (!Jobs) + Jobs = cupsArrayNew(compare_jobs, NULL); + + if (!ActiveJobs) + ActiveJobs = cupsArrayNew(compare_active_jobs, NULL); + + if (!PrintingJobs) + PrintingJobs = cupsArrayNew(compare_jobs, NULL); + + /* + * See whether the job.cache file is older than the RequestRoot directory... + */ + + snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir); + + if (stat(filename, &fileinfo)) + { + fileinfo.st_mtime = 0; + + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to get file information for \"%s\" - %s", + filename, strerror(errno)); + } + + if (stat(RequestRoot, &dirinfo)) + { + dirinfo.st_mtime = 0; + + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to get directory information for \"%s\" - %s", + RequestRoot, strerror(errno)); + } + + /* + * Load the most recent source for job data... + */ + + if (dirinfo.st_mtime > fileinfo.st_mtime) + { + load_request_root(); + + load_next_job_id(filename); + } + else + load_job_cache(filename); + + /* + * Clean out old jobs as needed... + */ + + if (MaxJobs > 0 && cupsArrayCount(Jobs) >= MaxJobs) + cupsdCleanJobs(); +} + + +/* + * 'cupsdLoadJob()' - Load a single job. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdLoadJob(cupsd_job_t *job) /* I - Job */ +{ + int i; /* Looping var */ + char jobfile[1024]; /* Job filename */ + cups_file_t *fp; /* Job file */ + int fileid; /* Current file ID */ + ipp_attribute_t *attr; /* Job attribute */ + const char *dest; /* Destination name */ + cupsd_printer_t *destptr; /* Pointer to destination */ + mime_type_t **filetypes; /* New filetypes array */ + int *compressions; /* New compressions array */ + + + if (job->attrs) + { + if (job->state_value > IPP_JOB_STOPPED) + job->access_time = time(NULL); + + return (1); + } + + if ((job->attrs = ippNew()) == NULL) + { + cupsdLogJob(job, CUPSD_LOG_ERROR, "Ran out of memory for job attributes!"); + return (0); + } + + /* + * Load job attributes... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id); + + snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id); + if ((fp = cupsFileOpen(jobfile, "r")) == NULL) + { + char newfile[1024]; /* New job filename */ + + snprintf(newfile, sizeof(newfile), "%s/c%05d.N", RequestRoot, job->id); + if ((fp = cupsFileOpen(newfile, "r")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to open job control file \"%s\": %s", + job->id, jobfile, strerror(errno)); + goto error; + } + + unlink(jobfile); + rename(newfile, jobfile); + } + + if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to read job control file \"%s\".", job->id, + jobfile); + cupsFileClose(fp); + goto error; + } + + cupsFileClose(fp); + + /* + * Copy attribute data to the job object... + */ + + if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad time-at-creation attribute in " + "control file!", job->id); + goto error; + } + + if ((job->state = ippFindAttribute(job->attrs, "job-state", + IPP_TAG_ENUM)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-state attribute in control " + "file!", job->id); + goto error; + } + + job->state_value = (ipp_jstate_t)job->state->values[0].integer; + + if (!job->dest) + { + if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", + IPP_TAG_URI)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] No job-printer-uri attribute in control file!", + job->id); + goto error; + } + + if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype), + &destptr)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to queue job for destination \"%s\"!", + job->id, attr->values[0].string.text); + goto error; + } + + cupsdSetString(&job->dest, dest); + } + else if ((destptr = cupsdFindDest(job->dest)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to queue job for destination \"%s\"!", + job->id, job->dest); + goto error; + } + + job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", + IPP_TAG_INTEGER); + job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); + + if (!job->priority) + { + if ((attr = ippFindAttribute(job->attrs, "job-priority", + IPP_TAG_INTEGER)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-priority attribute in " + "control file!", job->id); + goto error; + } + + job->priority = attr->values[0].integer; + } + + if (!job->username) + { + if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name", + IPP_TAG_NAME)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-originating-user-name " + "attribute in control file!", job->id); + goto error; + } + + cupsdSetString(&job->username, attr->values[0].string.text); + } + + /* + * Set the job hold-until time and state... + */ + + if (job->state_value == IPP_JOB_HELD) + { + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + cupsdSetJobHoldUntil(job, attr->values[0].string.text, CUPSD_JOB_DEFAULT); + else + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + } + else if (job->state_value == IPP_JOB_PROCESSING) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + + if (!job->num_files) + { + /* + * Find all the d##### files... + */ + + for (fileid = 1; fileid < 10000; fileid ++) + { + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, + job->id, fileid); + + if (access(jobfile, 0)) + break; + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "[Job %d] Auto-typing document file \"%s\"...", job->id, + jobfile); + + if (fileid > job->num_files) + { + if (job->num_files == 0) + { + compressions = (int *)calloc(fileid, sizeof(int)); + filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *)); + } + else + { + compressions = (int *)realloc(job->compressions, + sizeof(int) * fileid); + filetypes = (mime_type_t **)realloc(job->filetypes, + sizeof(mime_type_t *) * + fileid); + } + + if (!compressions || !filetypes) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Ran out of memory for job file types!", + job->id); + + ippDelete(job->attrs); + job->attrs = NULL; + + if (compressions) + free(compressions); + + if (filetypes) + free(filetypes); + + if (job->compressions) + { + free(job->compressions); + job->compressions = NULL; + } + + if (job->filetypes) + { + free(job->filetypes); + job->filetypes = NULL; + } + + job->num_files = 0; + return (0); + } + + job->compressions = compressions; + job->filetypes = filetypes; + job->num_files = fileid; + } + + job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL, + job->compressions + fileid - 1); + + if (!job->filetypes[fileid - 1]) + job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application", + "vnd.cups-raw"); + } + } + + /* + * Load authentication information as needed... + */ + + if (job->state_value < IPP_JOB_STOPPED) + { + snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id); + + for (i = 0; + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + cupsdClearString(job->auth_env + i); + cupsdClearString(&job->auth_uid); + + if ((fp = cupsFileOpen(jobfile, "r")) != NULL) + { + int bytes, /* Size of auth data */ + linenum = 1; /* Current line number */ + char line[65536], /* Line from file */ + *value, /* Value from line */ + data[65536]; /* Decoded data */ + + + if (cupsFileGets(fp, line, sizeof(line)) && + !strcmp(line, "CUPSD-AUTH-V2")) + { + i = 0; + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode value... + */ + + bytes = sizeof(data); + httpDecode64_2(data, &bytes, value); + + /* + * Assign environment variables... + */ + + if (!strcmp(line, "uid")) + { + cupsdSetStringf(&job->auth_uid, "AUTH_UID=%s", value); + continue; + } + else if (i >= (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0]))) + break; + + if (!strcmp(line, "username")) + cupsdSetStringf(job->auth_env + i, "AUTH_USERNAME=%s", data); + else if (!strcmp(line, "domain")) + cupsdSetStringf(job->auth_env + i, "AUTH_DOMAIN=%s", data); + else if (!strcmp(line, "password")) + cupsdSetStringf(job->auth_env + i, "AUTH_PASSWORD=%s", data); + else if (!strcmp(line, "negotiate")) + cupsdSetStringf(job->auth_env + i, "AUTH_NEGOTIATE=%s", data); + else + continue; + + i ++; + } + } + + cupsFileClose(fp); + } + } + + job->access_time = time(NULL); + return (1); + + /* + * If we get here then something bad happened... + */ + + error: + + ippDelete(job->attrs); + job->attrs = NULL; + + if (job->compressions) + { + free(job->compressions); + job->compressions = NULL; + } + + if (job->filetypes) + { + free(job->filetypes); + job->filetypes = NULL; + } + + job->num_files = 0; + + if (Classification) + cupsdRemoveFile(jobfile); + else + unlink(jobfile); + + return (0); +} + + +/* + * 'cupsdMoveJob()' - Move the specified job to a different destination. + */ + +void +cupsdMoveJob(cupsd_job_t *job, /* I - Job */ + cupsd_printer_t *p) /* I - Destination printer or class */ +{ + ipp_attribute_t *attr; /* job-printer-uri attribute */ + const char *olddest; /* Old destination */ + cupsd_printer_t *oldp; /* Old pointer */ + + + /* + * Don't move completed jobs... + */ + + if (job->state_value > IPP_JOB_STOPPED) + return; + + /* + * Get the old destination... + */ + + olddest = job->dest; + + if (job->printer) + oldp = job->printer; + else + oldp = cupsdFindDest(olddest); + + /* + * Change the destination information... + */ + + if (job->state_value > IPP_JOB_HELD) + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Stopping job prior to move."); + + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, oldp, job, + "Job #%d moved from %s to %s.", job->id, olddest, + p->name); + + cupsdSetString(&job->dest, p->name); + job->dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | + CUPS_PRINTER_IMPLICIT); + + if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", + IPP_TAG_URI)) != NULL) + cupsdSetString(&(attr->values[0].string.text), p->uri); + + cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job, + "Job #%d moved from %s to %s.", job->id, olddest, + p->name); + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); +} + + +/* + * 'cupsdReleaseJob()' - Release the specified job. + */ + +void +cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob(job=%p(%d))", job, + job->id); + + if (job->state_value == IPP_JOB_HELD) + { + /* + * Add trailing banner as needed... + */ + + if (job->pending_timeout) + cupsdTimeoutJob(job); + + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job released by user."); + } +} + + +/* + * 'cupsdRestartJob()' - Restart the specified job. + */ + +void +cupsdRestartJob(cupsd_job_t *job) /* I - Job */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob(job=%p(%d))", job, + job->id); + + if (job->state_value == IPP_JOB_STOPPED || job->num_files) + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job restarted by user."); +} + + +/* + * 'cupsdSaveAllJobs()' - Save a summary of all jobs to disk. + */ + +void +cupsdSaveAllJobs(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* job.cache file */ + char filename[1024], /* job.cache filename */ + temp[1024]; /* Temporary string */ + cupsd_job_t *job; /* Current job */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + + + snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir); + if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Saving job.cache..."); + + /* + * Write a small header to the file... + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd\n", temp); + cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); + + /* + * Write each job known to the system... + */ + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + { + cupsFilePrintf(fp, "\n", job->id); + cupsFilePrintf(fp, "State %d\n", job->state_value); + cupsFilePrintf(fp, "Priority %d\n", job->priority); + cupsFilePrintf(fp, "HoldUntil %d\n", (int)job->hold_until); + cupsFilePrintf(fp, "Username %s\n", job->username); + cupsFilePrintf(fp, "Destination %s\n", job->dest); + cupsFilePrintf(fp, "DestType %d\n", job->dtype); + cupsFilePrintf(fp, "NumFiles %d\n", job->num_files); + for (i = 0; i < job->num_files; i ++) + cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super, + job->filetypes[i]->type, job->compressions[i]); + cupsFilePuts(fp, "\n"); + } + + cupsdCloseCreatedConfFile(fp, filename); +} + + +/* + * 'cupsdSaveJob()' - Save a job to disk. + */ + +void +cupsdSaveJob(cupsd_job_t *job) /* I - Job */ +{ + char filename[1024], /* Job control filename */ + newfile[1024]; /* New job control filename */ + cups_file_t *fp; /* Job file */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", + job, job->id, job->attrs); + + snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, job->id); + snprintf(newfile, sizeof(newfile), "%s/c%05d.N", RequestRoot, job->id); + + if ((fp = cupsFileOpen(newfile, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to create job control file \"%s\": %s", + job->id, newfile, strerror(errno)); + return; + } + + fchmod(cupsFileNumber(fp), 0600); + fchown(cupsFileNumber(fp), RunUser, Group); + + job->attrs->state = IPP_IDLE; + + if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, + job->attrs) != IPP_DATA) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to write job control file.", job->id); + cupsFileClose(fp); + unlink(newfile); + return; + } + + if (cupsFileClose(fp)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to close job control file: %s", + job->id, strerror(errno)); + else + { + unlink(filename); + if (rename(newfile, filename)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to finalize job control file: %s", + job->id, strerror(errno)); + else + job->dirty = 0; + } +} + + +/* + * 'cupsdSetJobHoldUntil()' - Set the hold time for a job. + */ + +void +cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ + const char *when, /* I - When to resume */ + int update)/* I - Update job-hold-until attr? */ +{ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + int hour; /* Hold hour */ + int minute; /* Hold minute */ + int second = 0; /* Hold second */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetJobHoldUntil(job=%p(%d), when=\"%s\", update=%d)", + job, job->id, when, update); + + if (update) + { + /* + * Update the job-hold-until attribute... + */ + + ipp_attribute_t *attr; /* job-hold-until attribute */ + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + cupsdSetString(&(attr->values[0].string.text), when); + else + attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-hold-until", NULL, when); + + if (attr) + { + if (isdigit(when[0] & 255)) + attr->value_tag = IPP_TAG_NAME; + else + attr->value_tag = IPP_TAG_KEYWORD; + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + } + + /* + * Update the hold time... + */ + + if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required")) + { + /* + * Hold indefinitely... + */ + + job->hold_until = 0; + } + else if (!strcmp(when, "day-time")) + { + /* + * Hold to 6am the next morning unless local time is < 6pm. + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + + if (curdate->tm_hour < 18) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((29 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "evening") || !strcmp(when, "night")) + { + /* + * Hold to 6pm unless local time is > 6pm or < 6am. + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + + if (curdate->tm_hour < 6 || curdate->tm_hour >= 18) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((17 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "second-shift")) + { + /* + * Hold to 4pm unless local time is > 4pm. + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + + if (curdate->tm_hour >= 16) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((15 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "third-shift")) + { + /* + * Hold to 12am unless local time is < 8am. + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + + if (curdate->tm_hour < 8) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((23 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "weekend")) + { + /* + * Hold to weekend unless we are in the weekend. + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + + if (curdate->tm_wday == 0 || curdate->tm_wday == 6) + job->hold_until = curtime; + else + job->hold_until = curtime + + (((5 - curdate->tm_wday) * 24 + + (17 - curdate->tm_hour)) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (sscanf(when, "%d:%d:%d", &hour, &minute, &second) >= 2) + { + /* + * Hold to specified GMT time (HH:MM or HH:MM:SS)... + */ + + curtime = time(NULL); + curdate = gmtime(&curtime); + + job->hold_until = curtime + + ((hour - curdate->tm_hour) * 60 + minute - + curdate->tm_min) * 60 + second - curdate->tm_sec; + + /* + * Hold until next day as needed... + */ + + if (job->hold_until < curtime) + job->hold_until += 24 * 60 * 60; + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until=%d", + (int)job->hold_until); +} + + +/* + * 'cupsdSetJobPriority()' - Set the priority of a job, moving it up/down in + * the list as needed. + */ + +void +cupsdSetJobPriority( + cupsd_job_t *job, /* I - Job ID */ + int priority) /* I - New priority (0 to 100) */ +{ + ipp_attribute_t *attr; /* Job attribute */ + + + /* + * Don't change completed jobs... + */ + + if (job->state_value >= IPP_JOB_PROCESSING) + return; + + /* + * Set the new priority and re-add the job into the active list... + */ + + cupsArrayRemove(ActiveJobs, job); + + job->priority = priority; + + if ((attr = ippFindAttribute(job->attrs, "job-priority", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer = priority; + else + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority", + priority); + + cupsArrayAdd(ActiveJobs, job); + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); +} + + +/* + * 'cupsdSetJobState()' - Set the state of the specified print job. + */ + +void +cupsdSetJobState( + cupsd_job_t *job, /* I - Job to cancel */ + ipp_jstate_t newstate, /* I - New job state */ + cupsd_jobaction_t action, /* I - Action to take */ + const char *message, /* I - Message to log */ + ...) /* I - Additional arguments as needed */ +{ + int i; /* Looping var */ + ipp_jstate_t oldstate; /* Old state */ + char filename[1024]; /* Job filename */ + ipp_attribute_t *attr; /* Job attribute */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetJobState(job=%p(%d), state=%d, newstate=%d, " + "action=%d, message=\"%s\")", job, job->id, job->state_value, + newstate, action, message ? message : "(null)"); + + + /* + * Make sure we have the job attributes... + */ + + if (!cupsdLoadJob(job)) + return; + + /* + * Don't do anything if the state is unchanged and we aren't purging the + * job... + */ + + oldstate = job->state_value; + if (newstate == oldstate && action != CUPSD_JOB_PURGE) + return; + + /* + * Stop any processes that are working on the current job... + */ + + if (oldstate == IPP_JOB_PROCESSING) + stop_job(job, action); + + /* + * Set the new job state... + */ + + job->state->values[0].integer = newstate; + job->state_value = newstate; + + switch (newstate) + { + case IPP_JOB_PENDING : + /* + * Update job-hold-until as needed... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + { + attr->value_tag = IPP_TAG_KEYWORD; + cupsdSetString(&(attr->values[0].string.text), "no-hold"); + } + + default : + break; + + case IPP_JOB_ABORTED : + case IPP_JOB_CANCELED : + case IPP_JOB_COMPLETED : + set_time(job, "time-at-completed"); + break; + } + + /* + * Log message as needed... + */ + + if (message) + { + char buffer[2048]; /* Message buffer */ + va_list ap; /* Pointer to additional arguments */ + + va_start(ap, message); + vsnprintf(buffer, sizeof(buffer), message, ap); + va_end(ap); + + if (newstate > IPP_JOB_STOPPED) + cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, "%s", buffer); + else + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer); + + if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED) + cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer); + else + cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer); + } + + /* + * Handle post-state-change actions... + */ + + switch (newstate) + { + case IPP_JOB_PROCESSING : + /* + * Add the job to the "printing" list... + */ + + if (!cupsArrayFind(PrintingJobs, job)) + cupsArrayAdd(PrintingJobs, job); + + /* + * Set the processing time... + */ + + set_time(job, "time-at-processing"); + + case IPP_JOB_PENDING : + case IPP_JOB_HELD : + case IPP_JOB_STOPPED : + /* + * Make sure the job is in the active list... + */ + + if (!cupsArrayFind(ActiveJobs, job)) + cupsArrayAdd(ActiveJobs, job); + + /* + * Save the job state to disk... + */ + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + break; + + case IPP_JOB_ABORTED : + case IPP_JOB_CANCELED : + case IPP_JOB_COMPLETED : + if (newstate == IPP_JOB_CANCELED) + { + /* + * Remove the job from the active list if there are no processes still + * running for it... + */ + + for (i = 0; job->filters[i] < 0; i++); + + if (!job->filters[i] && job->backend <= 0) + cupsArrayRemove(ActiveJobs, job); + } + else + { + /* + * Otherwise just remove the job from the active list immediately... + */ + + cupsArrayRemove(ActiveJobs, job); + } + + /* + * Expire job subscriptions since the job is now "completed"... + */ + + cupsdExpireSubscriptions(NULL, job); + +#ifdef __APPLE__ + /* + * If we are going to sleep and the PrintingJobs count is now 0, allow the + * sleep to happen immediately... + */ + + if (Sleeping && cupsArrayCount(PrintingJobs) == 0) + cupsdAllowSleep(); +#endif /* __APPLE__ */ + + /* + * Remove any authentication data... + */ + + snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); + if (cupsdRemoveFile(filename) && errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to remove authentication cache: %s", + strerror(errno)); + + for (i = 0; + i < (int)(sizeof(job->auth_env) / sizeof(job->auth_env[0])); + i ++) + cupsdClearString(job->auth_env + i); + + cupsdClearString(&job->auth_uid); + + /* + * Remove the print file for good if we aren't preserving jobs or + * files... + */ + + if (!JobHistory || !JobFiles || action == CUPSD_JOB_PURGE) + { + for (i = 1; i <= job->num_files; i ++) + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, i); + if (Classification) + cupsdRemoveFile(filename); + else + unlink(filename); + } + + if (job->num_files > 0) + { + free(job->filetypes); + free(job->compressions); + + job->num_files = 0; + job->filetypes = NULL; + job->compressions = NULL; + } + } + + if (JobHistory && action != CUPSD_JOB_PURGE) + { + /* + * Save job state info... + */ + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + else if (!job->printer) + { + /* + * Delete the job immediately if not actively printing... + */ + + cupsdDeleteJob(job, CUPSD_JOB_PURGE); + job = NULL; + } + break; + } + + /* + * Finalize the job immediately if we forced things... + */ + + if (action >= CUPSD_JOB_FORCE && job && job->printer) + finalize_job(job, 0); + + /* + * Update the server "busy" state... + */ + + cupsdSetBusyState(); +} + + +/* + * 'cupsdStopAllJobs()' - Stop all print jobs. + */ + +void +cupsdStopAllJobs( + cupsd_jobaction_t action, /* I - Action */ + int kill_delay) /* I - Number of seconds before we kill */ +{ + cupsd_job_t *job; /* Current job */ + + + DEBUG_puts("cupsdStopAllJobs()"); + + for (job = (cupsd_job_t *)cupsArrayFirst(PrintingJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(PrintingJobs)) + { + if (kill_delay) + job->kill_time = time(NULL) + kill_delay; + + cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL); + } +} + + +/* + * 'cupsdUnloadCompletedJobs()' - Flush completed job history from memory. + */ + +void +cupsdUnloadCompletedJobs(void) +{ + cupsd_job_t *job; /* Current job */ + time_t expire; /* Expiration time */ + + + expire = time(NULL) - 60; + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + if (job->attrs && job->state_value >= IPP_JOB_STOPPED && !job->printer && + job->access_time < expire) + { + if (job->dirty) + cupsdSaveJob(job); + + unload_job(job); + } +} + + +/* + * 'compare_active_jobs()' - Compare the job IDs and priorities of two jobs. + */ + +static int /* O - Difference */ +compare_active_jobs(void *first, /* I - First job */ + void *second, /* I - Second job */ + void *data) /* I - App data (not used) */ +{ + int diff; /* Difference */ + + + (void)data; + + if ((diff = ((cupsd_job_t *)second)->priority - + ((cupsd_job_t *)first)->priority) != 0) + return (diff); + else + return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); +} + + +/* + * 'compare_jobs()' - Compare the job IDs of two jobs. + */ + +static int /* O - Difference */ +compare_jobs(void *first, /* I - First job */ + void *second, /* I - Second job */ + void *data) /* I - App data (not used) */ +{ + (void)data; + + return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); +} + + +/* + * 'dump_job_history()' - Dump any debug messages for a job. + */ + +static void +dump_job_history(cupsd_job_t *job) /* I - Job */ +{ + int i, /* Looping var */ + oldsize; /* Current MaxLogSize */ + struct tm *date; /* Date/time value */ + cupsd_joblog_t *message; /* Current message */ + char temp[2048], /* Log message */ + *ptr, /* Pointer into log message */ + start[256], /* Start time */ + end[256]; /* End time */ + cupsd_printer_t *printer; /* Printer for job */ + + + /* + * See if we have anything to dump... + */ + + if (!job->history) + return; + + /* + * Disable log rotation temporarily... + */ + + oldsize = MaxLogSize; + MaxLogSize = 0; + + /* + * Copy the debug messages to the log... + */ + + message = (cupsd_joblog_t *)cupsArrayFirst(job->history); + date = localtime(&(message->time)); + strftime(start, sizeof(start), "%X", date); + + message = (cupsd_joblog_t *)cupsArrayLast(job->history); + date = localtime(&(message->time)); + strftime(end, sizeof(end), "%X", date); + + snprintf(temp, sizeof(temp), + "[Job %d] The following messages were recorded from %s to %s", + job->id, start, end); + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); + + for (message = (cupsd_joblog_t *)cupsArrayFirst(job->history); + message; + message = (cupsd_joblog_t *)cupsArrayNext(job->history)) + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, message->message); + + snprintf(temp, sizeof(temp), "[Job %d] End of messages", job->id); + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); + + /* + * Log the printer state values... + */ + + if ((printer = job->printer) == NULL) + printer = cupsdFindDest(job->dest); + + if (printer) + { + snprintf(temp, sizeof(temp), "[Job %d] printer-state=%d(%s)", job->id, + printer->state, + printer->state == IPP_PRINTER_IDLE ? "idle" : + printer->state == IPP_PRINTER_PROCESSING ? "processing" : + "stopped"); + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); + + snprintf(temp, sizeof(temp), "[Job %d] printer-state-message=\"%s\"", + job->id, printer->state_message); + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); + + snprintf(temp, sizeof(temp), "[Job %d] printer-state-reasons=", job->id); + ptr = temp + strlen(temp); + if (printer->num_reasons == 0) + strlcpy(ptr, "none", sizeof(temp) - (ptr - temp)); + else + { + for (i = 0; + i < printer->num_reasons && ptr < (temp + sizeof(temp) - 2); + i ++) + { + if (i) + *ptr++ = ','; + + strlcpy(ptr, printer->reasons[i], sizeof(temp) - (ptr - temp)); + ptr += strlen(ptr); + } + } + cupsdWriteErrorLog(CUPSD_LOG_DEBUG, temp); + } + + /* + * Restore log file rotation... + */ + + MaxLogSize = oldsize; + + /* + * Free all messages... + */ + + free_job_history(job); +} + + +/* + * 'free_job_history()' - Free any log history. + */ + +static void +free_job_history(cupsd_job_t *job) /* I - Job */ +{ + char *message; /* Current message */ + + + if (!job->history) + return; + + for (message = (char *)cupsArrayFirst(job->history); + message; + message = (char *)cupsArrayNext(job->history)) + free(message); + + cupsArrayDelete(job->history); + job->history = NULL; +} + + +/* + * 'finalize_job()' - Cleanup after job filter processes and support data. + */ + +static void +finalize_job(cupsd_job_t *job, /* I - Job */ + int set_job_state) /* I - 1 = set the job state */ +{ + ipp_pstate_t printer_state; /* New printer state value */ + ipp_jstate_t job_state; /* New job state value */ + const char *message; /* Message for job state */ + char buffer[1024]; /* Buffer for formatted messages */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id); + + /* + * Clear the "connecting-to-device" reason, which is only valid when a printer + * is processing, along with any remote printing job state... + */ + + cupsdSetPrinterReasons(job->printer, "-connecting-to-device," + "cups-remote-pending," + "cups-remote-pending-held," + "cups-remote-processing," + "cups-remote-stopped," + "cups-remote-canceled," + "cups-remote-aborted," + "cups-remote-completed"); + + /* + * Similarly, clear the "offline-report" reason for non-USB devices since we + * rarely have current information for network devices... + */ + + if (strncmp(job->printer->device_uri, "usb:", 4)) + cupsdSetPrinterReasons(job->printer, "-offline-report"); + + /* + * Free the security profile... + */ + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + + /* + * Clear the unresponsive job watchdog timer... + */ + + job->kill_time = 0; + + /* + * Close pipes and status buffer... + */ + + cupsdClosePipe(job->print_pipes); + cupsdClosePipe(job->back_pipes); + cupsdClosePipe(job->side_pipes); + + cupsdRemoveSelect(job->status_pipes[0]); + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + /* + * Process the exit status... + */ + + if (job->printer->state == IPP_PRINTER_PROCESSING) + printer_state = IPP_PRINTER_IDLE; + else + printer_state = job->printer->state; + + switch (job_state = job->state_value) + { + case IPP_JOB_PENDING : + message = "Job paused."; + break; + + case IPP_JOB_HELD : + message = "Job held."; + break; + + default : + case IPP_JOB_PROCESSING : + case IPP_JOB_COMPLETED : + job_state = IPP_JOB_COMPLETED; + message = "Job completed."; + break; + + case IPP_JOB_STOPPED : + message = "Job stopped."; + break; + + case IPP_JOB_CANCELED : + message = "Job canceled."; + break; + + case IPP_JOB_ABORTED : + message = "Job aborted."; + break; + } + + if (job->status < 0) + { + /* + * Backend had errors... + */ + + int exit_code; /* Exit code from backend */ + + /* + * Convert the status to an exit code. Due to the way the W* macros are + * implemented on MacOS X (bug?), we have to store the exit status in a + * variable first and then convert... + */ + + exit_code = -job->status; + if (WIFEXITED(exit_code)) + exit_code = WEXITSTATUS(exit_code); + else + exit_code = job->status; + + cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)", + exit_code, + exit_code == CUPS_BACKEND_FAILED ? "failed" : + exit_code == CUPS_BACKEND_AUTH_REQUIRED ? + "authentication required" : + exit_code == CUPS_BACKEND_HOLD ? "hold job" : + exit_code == CUPS_BACKEND_STOP ? "stop printer" : + exit_code == CUPS_BACKEND_CANCEL ? "cancel job" : + exit_code < 0 ? "crashed" : "unknown"); + + /* + * Do what needs to be done... + */ + + switch (exit_code) + { + default : + case CUPS_BACKEND_FAILED : + /* + * Backend failure, use the error-policy to determine how to + * act... + */ + + if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + /* + * Queued on a class - mark the job as pending and we'll retry on + * another printer... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_PENDING; + message = "Retrying job on another printer."; + } + } + else if (!strcmp(job->printer->error_policy, "retry-current-job")) + { + /* + * The error policy is "retry-current-job" - mark the job as pending + * and we'll retry on the same printer... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_PENDING; + message = "Retrying job on same printer."; + } + } + else if ((job->printer->type & CUPS_PRINTER_FAX) || + !strcmp(job->printer->error_policy, "retry-job")) + { + if (job_state == IPP_JOB_COMPLETED) + { + /* + * The job was queued on a fax or the error policy is "retry-job" - + * hold the job if the number of retries is less than the + * JobRetryLimit, otherwise abort the job. + */ + + job->tries ++; + + if (job->tries > JobRetryLimit && JobRetryLimit > 0) + { + /* + * Too many tries... + */ + + snprintf(buffer, sizeof(buffer), + "Job aborted after %d unsuccessful attempts.", + JobRetryLimit); + job_state = IPP_JOB_ABORTED; + message = buffer; + } + else + { + /* + * Try again in N seconds... + */ + + snprintf(buffer, sizeof(buffer), + "Job held for %d seconds since it could not be sent.", + JobRetryInterval); + + job->hold_until = time(NULL) + JobRetryInterval; + job_state = IPP_JOB_HELD; + message = buffer; + } + } + } + else if (!strcmp(job->printer->error_policy, "abort-job") && + job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_ABORTED; + message = "Job aborted due to backend errors; please consult " + "the error_log file for details."; + } + else if (job->state_value == IPP_JOB_PROCESSING) + { + job_state = IPP_JOB_PENDING; + printer_state = IPP_PRINTER_STOPPED; + message = "Printer stopped due to backend errors; please " + "consult the error_log file for details."; + } + break; + + case CUPS_BACKEND_CANCEL : + /* + * Abort the job... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_ABORTED; + message = "Job aborted due to backend errors; please consult " + "the error_log file for details."; + } + break; + + case CUPS_BACKEND_HOLD : + if (job_state == IPP_JOB_COMPLETED) + { + /* + * Hold the job... + */ + + cupsdSetJobHoldUntil(job, "indefinite", 1); + + job_state = IPP_JOB_HELD; + message = "Job held indefinitely due to backend errors; please " + "consult the error_log file for details."; + } + break; + + case CUPS_BACKEND_STOP : + /* + * Stop the printer... + */ + + printer_state = IPP_PRINTER_STOPPED; + message = "Printer stopped due to backend errors; please " + "consult the error_log file for details."; + + if (job_state == IPP_JOB_COMPLETED) + job_state = IPP_JOB_PENDING; + break; + + case CUPS_BACKEND_AUTH_REQUIRED : + /* + * Hold the job for authentication... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + cupsdSetJobHoldUntil(job, "auth-info-required", 1); + + job_state = IPP_JOB_HELD; + message = "Job held for authentication."; + } + break; + + case CUPS_BACKEND_RETRY : + if (job_state == IPP_JOB_COMPLETED) + { + /* + * Hold the job if the number of retries is less than the + * JobRetryLimit, otherwise abort the job. + */ + + job->tries ++; + + if (job->tries > JobRetryLimit && JobRetryLimit > 0) + { + /* + * Too many tries... + */ + + snprintf(buffer, sizeof(buffer), + "Job aborted after %d unsuccessful attempts.", + JobRetryLimit); + job_state = IPP_JOB_ABORTED; + message = buffer; + } + else + { + /* + * Try again in N seconds... + */ + + snprintf(buffer, sizeof(buffer), + "Job held for %d seconds since it could not be sent.", + JobRetryInterval); + + job->hold_until = time(NULL) + JobRetryInterval; + job_state = IPP_JOB_HELD; + message = buffer; + } + } + break; + + case CUPS_BACKEND_RETRY_CURRENT : + /* + * Mark the job as pending and retry on the same printer... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_PENDING; + message = "Retrying job on same printer."; + } + break; + } + } + else if (job->status > 0) + { + /* + * Filter had errors; stop job... + */ + + if (job_state == IPP_JOB_COMPLETED) + { + job_state = IPP_JOB_STOPPED; + message = "Job stopped due to filter errors; please consult the " + "error_log file for details."; + } + } + + /* + * Update the printer and job state. + */ + + if (set_job_state && job_state != job->state_value) + cupsdSetJobState(job, job_state, CUPSD_JOB_DEFAULT, "%s", message); + + cupsdSetPrinterState(job->printer, printer_state, + printer_state == IPP_PRINTER_STOPPED); + update_job_attrs(job, 0); + + if (job->history) + { + if (job->status && + (job->state_value == IPP_JOB_ABORTED || + job->state_value == IPP_JOB_STOPPED)) + dump_job_history(job); + else + free_job_history(job); + } + + cupsArrayRemove(PrintingJobs, job); + + /* + * Clear the printer <-> job association... + */ + + job->printer->job = NULL; + job->printer = NULL; + + /* + * Try printing another job... + */ + + if (printer_state != IPP_PRINTER_STOPPED) + cupsdCheckJobs(); +} + + +/* + * 'get_options()' - Get a string containing the job options. + */ + +static char * /* O - Options string */ +get_options(cupsd_job_t *job, /* I - Job */ + int banner_page, /* I - Printing a banner page? */ + char *copies, /* I - Copies buffer */ + size_t copies_size, /* I - Size of copies buffer */ + char *title, /* I - Title buffer */ + size_t title_size) /* I - Size of title buffer */ +{ + int i; /* Looping var */ + size_t newlength; /* New option buffer length */ + char *optptr, /* Pointer to options */ + *valptr; /* Pointer in value string */ + ipp_attribute_t *attr; /* Current attribute */ + _ppd_cache_t *pc; /* PPD cache and mapping data */ + int num_pwgppds; /* Number of PWG->PPD options */ + cups_option_t *pwgppds, /* PWG->PPD options */ + *pwgppd, /* Current PWG->PPD option */ + *preset; /* Current preset option */ + int print_color_mode, + /* Output mode (if any) */ + print_quality; /* Print quality (if any) */ + const char *ppd; /* PPD option choice */ + int exact; /* Did we get an exact match? */ + static char *options = NULL;/* Full list of options */ + static size_t optlength = 0; /* Length of option buffer */ + + + /* + * Building the options string is harder than it needs to be, but for the + * moment we need to pass strings for command-line args and not IPP attribute + * pointers... :) + * + * First build an options array for any PWG->PPD mapped option/choice pairs. + */ + + pc = job->printer->pc; + num_pwgppds = 0; + pwgppds = NULL; + + if (pc && + !ippFindAttribute(job->attrs, + "com.apple.print.DocumentTicket.PMSpoolFormat", + IPP_TAG_ZERO) && + !ippFindAttribute(job->attrs, "APPrinterPreset", IPP_TAG_ZERO) && + (ippFindAttribute(job->attrs, "output-mode", IPP_TAG_ZERO) || + ippFindAttribute(job->attrs, "print-color-mode", IPP_TAG_ZERO) || + ippFindAttribute(job->attrs, "print-quality", IPP_TAG_ZERO))) + { + /* + * Map output-mode and print-quality to a preset... + */ + + if ((attr = ippFindAttribute(job->attrs, "print-color-mode", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "output-mode", IPP_TAG_KEYWORD); + + if (attr && !strcmp(attr->values[0].string.text, "monochrome")) + print_color_mode = _PWG_PRINT_COLOR_MODE_MONOCHROME; + else + print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + + if ((attr = ippFindAttribute(job->attrs, "print-quality", + IPP_TAG_ENUM)) != NULL && + attr->values[0].integer >= IPP_QUALITY_DRAFT && + attr->values[0].integer <= IPP_QUALITY_HIGH) + print_quality = attr->values[0].integer - IPP_QUALITY_DRAFT; + else + print_quality = _PWG_PRINT_QUALITY_NORMAL; + + if (pc->num_presets[print_color_mode][print_quality] == 0) + { + /* + * Try to find a preset that works so that we maximize the chances of us + * getting a good print using IPP attributes. + */ + + if (pc->num_presets[print_color_mode][_PWG_PRINT_QUALITY_NORMAL] > 0) + print_quality = _PWG_PRINT_QUALITY_NORMAL; + else if (pc->num_presets[_PWG_PRINT_COLOR_MODE_COLOR][print_quality] > 0) + print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + else + { + print_quality = _PWG_PRINT_QUALITY_NORMAL; + print_color_mode = _PWG_PRINT_COLOR_MODE_COLOR; + } + } + + if (pc->num_presets[print_color_mode][print_quality] > 0) + { + /* + * Copy the preset options as long as the corresponding names are not + * already defined in the IPP request... + */ + + for (i = pc->num_presets[print_color_mode][print_quality], + preset = pc->presets[print_color_mode][print_quality]; + i > 0; + i --, preset ++) + { + if (!ippFindAttribute(job->attrs, preset->name, IPP_TAG_ZERO)) + num_pwgppds = cupsAddOption(preset->name, preset->value, num_pwgppds, + &pwgppds); + } + } + } + + if (pc) + { + if (!ippFindAttribute(job->attrs, "InputSlot", IPP_TAG_ZERO) && + !ippFindAttribute(job->attrs, "HPPaperSource", IPP_TAG_ZERO)) + { + if ((ppd = _ppdCacheGetInputSlot(pc, job->attrs, NULL)) != NULL) + num_pwgppds = cupsAddOption(pc->source_option, ppd, num_pwgppds, + &pwgppds); + } + if (!ippFindAttribute(job->attrs, "MediaType", IPP_TAG_ZERO) && + (ppd = _ppdCacheGetMediaType(pc, job->attrs, NULL)) != NULL) + num_pwgppds = cupsAddOption("MediaType", ppd, num_pwgppds, &pwgppds); + + if (!ippFindAttribute(job->attrs, "PageRegion", IPP_TAG_ZERO) && + !ippFindAttribute(job->attrs, "PageSize", IPP_TAG_ZERO) && + (ppd = _ppdCacheGetPageSize(pc, job->attrs, NULL, &exact)) != NULL) + { + num_pwgppds = cupsAddOption("PageSize", ppd, num_pwgppds, &pwgppds); + + if (!ippFindAttribute(job->attrs, "media", IPP_TAG_ZERO)) + num_pwgppds = cupsAddOption("media", ppd, num_pwgppds, &pwgppds); + } + + if (!ippFindAttribute(job->attrs, "OutputBin", IPP_TAG_ZERO) && + (attr = ippFindAttribute(job->attrs, "output-bin", + IPP_TAG_ZERO)) != NULL && + (attr->value_tag == IPP_TAG_KEYWORD || + attr->value_tag == IPP_TAG_NAME) && + (ppd = _ppdCacheGetOutputBin(pc, attr->values[0].string.text)) != NULL) + { + /* + * Map output-bin to OutputBin option... + */ + + num_pwgppds = cupsAddOption("OutputBin", ppd, num_pwgppds, &pwgppds); + } + + if (pc->sides_option && + !ippFindAttribute(job->attrs, pc->sides_option, IPP_TAG_ZERO) && + (attr = ippFindAttribute(job->attrs, "sides", IPP_TAG_KEYWORD)) != NULL) + { + /* + * Map sides to duplex option... + */ + + if (!strcmp(attr->values[0].string.text, "one-sided")) + num_pwgppds = cupsAddOption(pc->sides_option, pc->sides_1sided, + num_pwgppds, &pwgppds); + else if (!strcmp(attr->values[0].string.text, "two-sided-long-edge")) + num_pwgppds = cupsAddOption(pc->sides_option, pc->sides_2sided_long, + num_pwgppds, &pwgppds); + else if (!strcmp(attr->values[0].string.text, "two-sided-short-edge")) + num_pwgppds = cupsAddOption(pc->sides_option, pc->sides_2sided_short, + num_pwgppds, &pwgppds); + } + + /* + * Map finishings values... + */ + + num_pwgppds = _ppdCacheGetFinishingOptions(pc, job->attrs, + IPP_FINISHINGS_NONE, num_pwgppds, + &pwgppds); + } + + /* + * Figure out how much room we need... + */ + + newlength = ipp_length(job->attrs); + + for (i = num_pwgppds, pwgppd = pwgppds; i > 0; i --, pwgppd ++) + newlength += 1 + strlen(pwgppd->name) + 1 + strlen(pwgppd->value); + + /* + * Then allocate/reallocate the option buffer as needed... + */ + + if (newlength == 0) /* This can never happen, but Clang */ + newlength = 1; /* thinks it can... */ + + if (newlength > optlength || !options) + { + if (!options) + optptr = malloc(newlength); + else + optptr = realloc(options, newlength); + + if (!optptr) + { + cupsdLogJob(job, CUPSD_LOG_CRIT, + "Unable to allocate " CUPS_LLFMT " bytes for option buffer!", + CUPS_LLCAST newlength); + return (NULL); + } + + options = optptr; + optlength = newlength; + } + + /* + * Now loop through the attributes and convert them to the textual + * representation used by the filters... + */ + + optptr = options; + *optptr = '\0'; + + snprintf(title, title_size, "%s-%d", job->printer->name, job->id); + strlcpy(copies, "1", copies_size); + + for (attr = job->attrs->attrs; attr != NULL; attr = attr->next) + { + if (!strcmp(attr->name, "copies") && + attr->value_tag == IPP_TAG_INTEGER) + { + /* + * Don't use the # copies attribute if we are printing the job sheets... + */ + + if (!banner_page) + snprintf(copies, copies_size, "%d", attr->values[0].integer); + } + else if (!strcmp(attr->name, "job-name") && + (attr->value_tag == IPP_TAG_NAME || + attr->value_tag == IPP_TAG_NAMELANG)) + strlcpy(title, attr->values[0].string.text, title_size); + else if (attr->group_tag == IPP_TAG_JOB) + { + /* + * Filter out other unwanted attributes... + */ + + if (attr->value_tag == IPP_TAG_NOVALUE || + attr->value_tag == IPP_TAG_MIMETYPE || + attr->value_tag == IPP_TAG_NAMELANG || + attr->value_tag == IPP_TAG_TEXTLANG || + (attr->value_tag == IPP_TAG_URI && strcmp(attr->name, "job-uuid")) || + attr->value_tag == IPP_TAG_URISCHEME || + attr->value_tag == IPP_TAG_BEGIN_COLLECTION) /* Not yet supported */ + continue; + + if (!strcmp(attr->name, "job-hold-until")) + continue; + + if (!strncmp(attr->name, "job-", 4) && + strcmp(attr->name, "job-billing") && + strcmp(attr->name, "job-impressions") && + strcmp(attr->name, "job-originating-host-name") && + strcmp(attr->name, "job-uuid") && + !(job->printer->type & CUPS_PRINTER_REMOTE)) + continue; + + if ((!strcmp(attr->name, "job-impressions") || + !strcmp(attr->name, "page-label") || + !strcmp(attr->name, "page-border") || + !strncmp(attr->name, "number-up", 9) || + !strcmp(attr->name, "page-ranges") || + !strcmp(attr->name, "page-set") || + !_cups_strcasecmp(attr->name, "AP_FIRSTPAGE_InputSlot") || + !_cups_strcasecmp(attr->name, "AP_FIRSTPAGE_ManualFeed") || + !_cups_strcasecmp(attr->name, "com.apple.print.PrintSettings." + "PMTotalSidesImaged..n.") || + !_cups_strcasecmp(attr->name, "com.apple.print.PrintSettings." + "PMTotalBeginPages..n.")) && + banner_page) + continue; + + /* + * Otherwise add them to the list... + */ + + if (optptr > options) + strlcat(optptr, " ", optlength - (optptr - options)); + + if (attr->value_tag != IPP_TAG_BOOLEAN) + { + strlcat(optptr, attr->name, optlength - (optptr - options)); + strlcat(optptr, "=", optlength - (optptr - options)); + } + + for (i = 0; i < attr->num_values; i ++) + { + if (i) + strlcat(optptr, ",", optlength - (optptr - options)); + + optptr += strlen(optptr); + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(optptr, optlength - (optptr - options), + "%d", attr->values[i].integer); + break; + + case IPP_TAG_BOOLEAN : + if (!attr->values[i].boolean) + strlcat(optptr, "no", optlength - (optptr - options)); + + strlcat(optptr, attr->name, + optlength - (optptr - options)); + break; + + case IPP_TAG_RANGE : + if (attr->values[i].range.lower == attr->values[i].range.upper) + snprintf(optptr, optlength - (optptr - options) - 1, + "%d", attr->values[i].range.lower); + else + snprintf(optptr, optlength - (optptr - options) - 1, + "%d-%d", attr->values[i].range.lower, + attr->values[i].range.upper); + break; + + case IPP_TAG_RESOLUTION : + snprintf(optptr, optlength - (optptr - options) - 1, + "%dx%d%s", attr->values[i].resolution.xres, + attr->values[i].resolution.yres, + attr->values[i].resolution.units == IPP_RES_PER_INCH ? + "dpi" : "dpc"); + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_URI : + for (valptr = attr->values[i].string.text; *valptr;) + { + if (strchr(" \t\n\\\'\"", *valptr)) + *optptr++ = '\\'; + *optptr++ = *valptr++; + } + + *optptr = '\0'; + break; + + default : + break; /* anti-compiler-warning-code */ + } + } + + optptr += strlen(optptr); + } + } + + /* + * Finally loop through the PWG->PPD mapped options and add them... + */ + + for (i = num_pwgppds, pwgppd = pwgppds; i > 0; i --, pwgppd ++) + { + *optptr++ = ' '; + strcpy(optptr, pwgppd->name); + optptr += strlen(optptr); + *optptr++ = '='; + strcpy(optptr, pwgppd->value); + optptr += strlen(optptr); + } + + cupsFreeOptions(num_pwgppds, pwgppds); + + /* + * Return the options string... + */ + + return (options); +} + + +/* + * 'ipp_length()' - Compute the size of the buffer needed to hold + * the textual IPP attributes. + */ + +static size_t /* O - Size of attribute buffer */ +ipp_length(ipp_t *ipp) /* I - IPP request */ +{ + size_t bytes; /* Number of bytes */ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Current attribute */ + + + /* + * Loop through all attributes... + */ + + bytes = 0; + + for (attr = ipp->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip attributes that won't be sent to filters... + */ + + if (attr->value_tag == IPP_TAG_NOVALUE || + attr->value_tag == IPP_TAG_MIMETYPE || + attr->value_tag == IPP_TAG_NAMELANG || + attr->value_tag == IPP_TAG_TEXTLANG || + attr->value_tag == IPP_TAG_URI || + attr->value_tag == IPP_TAG_URISCHEME) + continue; + + /* + * Add space for a leading space and commas between each value. + * For the first attribute, the leading space isn't used, so the + * extra byte can be used as the nul terminator... + */ + + bytes ++; /* " " separator */ + bytes += attr->num_values; /* "," separators */ + + /* + * Boolean attributes appear as "foo,nofoo,foo,nofoo", while + * other attributes appear as "foo=value1,value2,...,valueN". + */ + + if (attr->value_tag != IPP_TAG_BOOLEAN) + bytes += strlen(attr->name); + else + bytes += attr->num_values * strlen(attr->name); + + /* + * Now add the size required for each value in the attribute... + */ + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + /* + * Minimum value of a signed integer is -2147483647, or 11 digits. + */ + + bytes += attr->num_values * 11; + break; + + case IPP_TAG_BOOLEAN : + /* + * Add two bytes for each false ("no") value... + */ + + for (i = 0; i < attr->num_values; i ++) + if (!attr->values[i].boolean) + bytes += 2; + break; + + case IPP_TAG_RANGE : + /* + * A range is two signed integers separated by a hyphen, or + * 23 characters max. + */ + + bytes += attr->num_values * 23; + break; + + case IPP_TAG_RESOLUTION : + /* + * A resolution is two signed integers separated by an "x" and + * suffixed by the units, or 26 characters max. + */ + + bytes += attr->num_values * 26; + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_URI : + /* + * Strings can contain characters that need quoting. We need + * at least 2 * len + 2 characters to cover the quotes and + * any backslashes in the string. + */ + + for (i = 0; i < attr->num_values; i ++) + bytes += 2 * strlen(attr->values[i].string.text) + 2; + break; + + default : + break; /* anti-compiler-warning-code */ + } + } + + return (bytes); +} + + +/* + * 'load_job_cache()' - Load jobs from the job.cache file. + */ + +static void +load_job_cache(const char *filename) /* I - job.cache filename */ +{ + cups_file_t *fp; /* job.cache file */ + char line[1024], /* Line buffer */ + *value; /* Value on line */ + int linenum; /* Line number in file */ + cupsd_job_t *job; /* Current job */ + int jobid; /* Job ID */ + char jobfile[1024]; /* Job filename */ + + + /* + * Open the job.cache file... + */ + + if ((fp = cupsdOpenConfFile(filename)) == NULL) + { + load_request_root(); + return; + } + + /* + * Read entries from the job cache file and create jobs as needed. + */ + + cupsdLogMessage(CUPSD_LOG_INFO, "Loading job cache file \"%s\"...", + filename); + + linenum = 0; + job = NULL; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!_cups_strcasecmp(line, "NextJobId")) + { + if (value) + NextJobId = atoi(value); + } + else if (!_cups_strcasecmp(line, " directive on line %d!", + linenum); + continue; + } + + if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d!", linenum); + continue; + } + + jobid = atoi(value); + + if (jobid < 1) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d!", jobid, + linenum); + continue; + } + + snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid); + if (access(jobfile, 0)) + { + snprintf(jobfile, sizeof(jobfile), "%s/c%05d.N", RequestRoot, jobid); + if (access(jobfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!", + jobid); + continue; + } + } + + job = calloc(1, sizeof(cupsd_job_t)); + if (!job) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "[Job %d] Unable to allocate memory for job!", jobid); + break; + } + + job->id = jobid; + job->back_pipes[0] = -1; + job->back_pipes[1] = -1; + job->print_pipes[0] = -1; + job->print_pipes[1] = -1; + job->side_pipes[0] = -1; + job->side_pipes[1] = -1; + job->status_pipes[0] = -1; + job->status_pipes[1] = -1; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...", + job->id); + } + else if (!job) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing directive on line %d!", linenum); + continue; + } + else if (!_cups_strcasecmp(line, "")) + { + cupsArrayAdd(Jobs, job); + + if (job->state_value <= IPP_JOB_STOPPED && cupsdLoadJob(job)) + cupsArrayAdd(ActiveJobs, job); + + job = NULL; + } + else if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d!", linenum); + continue; + } + else if (!_cups_strcasecmp(line, "State")) + { + job->state_value = (ipp_jstate_t)atoi(value); + + if (job->state_value < IPP_JOB_PENDING) + job->state_value = IPP_JOB_PENDING; + else if (job->state_value > IPP_JOB_COMPLETED) + job->state_value = IPP_JOB_COMPLETED; + } + else if (!_cups_strcasecmp(line, "HoldUntil")) + { + job->hold_until = atoi(value); + } + else if (!_cups_strcasecmp(line, "Priority")) + { + job->priority = atoi(value); + } + else if (!_cups_strcasecmp(line, "Username")) + { + cupsdSetString(&job->username, value); + } + else if (!_cups_strcasecmp(line, "Destination")) + { + cupsdSetString(&job->dest, value); + } + else if (!_cups_strcasecmp(line, "DestType")) + { + job->dtype = (cups_ptype_t)atoi(value); + } + else if (!_cups_strcasecmp(line, "NumFiles")) + { + job->num_files = atoi(value); + + if (job->num_files < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d!", + job->num_files, linenum); + job->num_files = 0; + continue; + } + + if (job->num_files > 0) + { + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-001", RequestRoot, + job->id); + if (access(jobfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away!", + job->id); + job->num_files = 0; + continue; + } + + job->filetypes = calloc(job->num_files, sizeof(mime_type_t *)); + job->compressions = calloc(job->num_files, sizeof(int)); + + if (!job->filetypes || !job->compressions) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "[Job %d] Unable to allocate memory for %d files!", + job->id, job->num_files); + break; + } + } + } + else if (!_cups_strcasecmp(line, "File")) + { + int number, /* File number */ + compression; /* Compression value */ + char super[MIME_MAX_SUPER], /* MIME super type */ + type[MIME_MAX_TYPE]; /* MIME type */ + + + if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type, + &compression) != 4) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d!", linenum); + continue; + } + + if (number < 1 || number > job->num_files) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d!", + number, linenum); + continue; + } + + number --; + + job->compressions[number] = compression; + job->filetypes[number] = mimeType(MimeDatabase, super, type); + + if (!job->filetypes[number]) + { + /* + * If the original MIME type is unknown, auto-type it! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unknown MIME type %s/%s for file %d!", + job->id, super, type, number + 1); + + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, + job->id, number + 1); + job->filetypes[number] = mimeFileType(MimeDatabase, jobfile, NULL, + job->compressions + number); + + /* + * If that didn't work, assume it is raw... + */ + + if (!job->filetypes[number]) + job->filetypes[number] = mimeType(MimeDatabase, "application", + "vnd.cups-raw"); + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d!", + line, linenum); + } + + cupsFileClose(fp); +} + + +/* + * 'load_next_job_id()' - Load the NextJobId value from the job.cache file. + */ + +static void +load_next_job_id(const char *filename) /* I - job.cache filename */ +{ + cups_file_t *fp; /* job.cache file */ + char line[1024], /* Line buffer */ + *value; /* Value on line */ + int linenum; /* Line number in file */ + int next_job_id; /* NextJobId value from line */ + + + /* + * Read the NextJobId directive from the job.cache file and use + * the value (if any). + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open job cache file \"%s\": %s", + filename, strerror(errno)); + + return; + } + + cupsdLogMessage(CUPSD_LOG_INFO, + "Loading NextJobId from job cache file \"%s\"...", filename); + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!_cups_strcasecmp(line, "NextJobId")) + { + if (value) + { + next_job_id = atoi(value); + + if (next_job_id > NextJobId) + NextJobId = next_job_id; + } + break; + } + } + + cupsFileClose(fp); +} + + +/* + * 'load_request_root()' - Load jobs from the RequestRoot directory. + */ + +static void +load_request_root(void) +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + cupsd_job_t *job; /* New job */ + + + /* + * Open the requests directory... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Scanning %s for jobs...", RequestRoot); + + if ((dir = cupsDirOpen(RequestRoot)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open spool directory \"%s\": %s", + RequestRoot, strerror(errno)); + return; + } + + /* + * Read all the c##### files... + */ + + while ((dent = cupsDirRead(dir)) != NULL) + if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c') + { + /* + * Allocate memory for the job... + */ + + if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for jobs!"); + cupsDirClose(dir); + return; + } + + /* + * Assign the job ID... + */ + + job->id = atoi(dent->filename + 1); + job->back_pipes[0] = -1; + job->back_pipes[1] = -1; + job->print_pipes[0] = -1; + job->print_pipes[1] = -1; + job->side_pipes[0] = -1; + job->side_pipes[1] = -1; + job->status_pipes[0] = -1; + job->status_pipes[1] = -1; + + if (job->id >= NextJobId) + NextJobId = job->id + 1; + + /* + * Load the job... + */ + + if (cupsdLoadJob(job)) + { + /* + * Insert the job into the array, sorting by job priority and ID... + */ + + cupsArrayAdd(Jobs, job); + + if (job->state_value <= IPP_JOB_STOPPED) + cupsArrayAdd(ActiveJobs, job); + else + unload_job(job); + } + } + + cupsDirClose(dir); +} + + +/* + * 'set_time()' - Set one of the "time-at-xyz" attributes. + */ + +static void +set_time(cupsd_job_t *job, /* I - Job to update */ + const char *name) /* I - Name of attribute */ +{ + ipp_attribute_t *attr; /* Time attribute */ + + + if ((attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO)) != NULL) + { + attr->value_tag = IPP_TAG_INTEGER; + attr->values[0].integer = time(NULL); + } +} + + +/* + * 'start_job()' - Start a print job. + */ + +static void +start_job(cupsd_job_t *job, /* I - Job ID */ + cupsd_printer_t *printer) /* I - Printer to print job */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))", + job, job->id, printer, printer->name); + + /* + * Make sure we have some files around before we try to print... + */ + + if (job->num_files == 0) + { + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT, + "Aborting job because it has no files."); + return; + } + + /* + * Update the printer and job state to "processing"... + */ + + if (!cupsdLoadJob(job)) + return; + + if (!job->printer_message) + job->printer_message = ippFindAttribute(job->attrs, + "job-printer-state-message", + IPP_TAG_TEXT); + if (job->printer_message) + cupsdSetString(&(job->printer_message->values[0].string.text), ""); + + cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL); + cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0); + cupsdSetPrinterReasons(printer, "-cups-remote-pending," + "cups-remote-pending-held," + "cups-remote-processing," + "cups-remote-stopped," + "cups-remote-canceled," + "cups-remote-aborted," + "cups-remote-completed"); + + job->cost = 0; + job->current_file = 0; + job->progress = 0; + job->printer = printer; + printer->job = job; + + /* + * Setup the last exit status and security profiles... + */ + + job->status = 0; + job->profile = cupsdCreateProfile(job->id); + + /* + * Create the status pipes and buffer... + */ + + if (cupsdOpenPipe(job->status_pipes)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create job status pipes - %s.", strerror(errno)); + + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "job status pipes."); + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; + } + + job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL); + job->status_level = CUPSD_LOG_INFO; + + /* + * Create the backchannel pipes and make them non-blocking... + */ + + if (cupsdOpenPipe(job->back_pipes)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create back-channel pipes - %s.", strerror(errno)); + + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "back-channel pipes."); + + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; + } + + fcntl(job->back_pipes[0], F_SETFL, + fcntl(job->back_pipes[0], F_GETFL) | O_NONBLOCK); + fcntl(job->back_pipes[1], F_SETFL, + fcntl(job->back_pipes[1], F_GETFL) | O_NONBLOCK); + + /* + * Create the side-channel pipes and make them non-blocking... + */ + + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, job->side_pipes)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create side-channel pipes - %s.", strerror(errno)); + + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "side-channel pipes."); + + cupsdClosePipe(job->back_pipes); + + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; + } + + fcntl(job->side_pipes[0], F_SETFL, + fcntl(job->side_pipes[0], F_GETFL) | O_NONBLOCK); + fcntl(job->side_pipes[1], F_SETFL, + fcntl(job->side_pipes[1], F_GETFL) | O_NONBLOCK); + + fcntl(job->side_pipes[0], F_SETFD, + fcntl(job->side_pipes[0], F_GETFD) | FD_CLOEXEC); + fcntl(job->side_pipes[1], F_SETFD, + fcntl(job->side_pipes[1], F_GETFD) | FD_CLOEXEC); + + /* + * Now start the first file in the job... + */ + + cupsdContinueJob(job); +} + + +/* + * 'stop_job()' - Stop a print job. + */ + +static void +stop_job(cupsd_job_t *job, /* I - Job */ + cupsd_jobaction_t action) /* I - Action */ +{ + int i; /* Looping var */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_job(job=%p(%d), action=%d)", job, + job->id, action); + + FilterLevel -= job->cost; + job->cost = 0; + + if (action == CUPSD_JOB_DEFAULT && !job->kill_time) + job->kill_time = time(NULL) + JobKillDelay; + else if (action >= CUPSD_JOB_FORCE) + job->kill_time = 0; + + for (i = 0; job->filters[i]; i ++) + if (job->filters[i] > 0) + { + cupsdEndProcess(job->filters[i], action >= CUPSD_JOB_FORCE); + + if (action >= CUPSD_JOB_FORCE) + job->filters[i] = -job->filters[i]; + } + + if (job->backend > 0) + { + cupsdEndProcess(job->backend, action >= CUPSD_JOB_FORCE); + + if (action >= CUPSD_JOB_FORCE) + job->backend = -job->backend; + } + + if (action >= CUPSD_JOB_FORCE) + { + /* + * Clear job status... + */ + + job->status = 0; + } +} + + +/* + * 'unload_job()' - Unload a job from memory. + */ + +static void +unload_job(cupsd_job_t *job) /* I - Job */ +{ + if (!job->attrs) + return; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Unloading...", job->id); + + ippDelete(job->attrs); + + job->attrs = NULL; + job->state = NULL; + job->sheets = NULL; + job->job_sheets = NULL; + job->printer_message = NULL; + job->printer_reasons = NULL; +} + + +/* + * 'update_job()' - Read a status update from a job's filters. + */ + +void +update_job(cupsd_job_t *job) /* I - Job to check */ +{ + int i; /* Looping var */ + int copies; /* Number of copies printed */ + char message[CUPSD_SB_BUFFER_SIZE], + /* Message text */ + *ptr; /* Pointer update... */ + int loglevel, /* Log level for message */ + event = 0; /* Events? */ + static const char * const levels[] = /* Log levels */ + { + "NONE", + "EMERG", + "ALERT", + "CRIT", + "ERROR", + "WARN", + "NOTICE", + "INFO", + "DEBUG", + "DEBUG2" + }; + + + /* + * Get the printer associated with this job; if the printer is stopped for + * any reason then job->printer will be reset to NULL, so make sure we have + * a valid pointer... + */ + + while ((ptr = cupsdStatBufUpdate(job->status_buffer, &loglevel, + message, sizeof(message))) != NULL) + { + /* + * Process page and printer state messages as needed... + */ + + if (loglevel == CUPSD_LOG_PAGE) + { + /* + * Page message; send the message to the page_log file and update the + * job sheet count... + */ + + cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message); + + if (job->sheets) + { + if (!_cups_strncasecmp(message, "total ", 6)) + { + /* + * Got a total count of pages from a backend or filter... + */ + + copies = atoi(message + 6); + copies -= job->sheets->values[0].integer; /* Just track the delta */ + } + else if (!sscanf(message, "%*d%d", &copies)) + copies = 1; + + job->sheets->values[0].integer += copies; + + if (job->printer->page_limit) + cupsdUpdateQuota(job->printer, job->username, copies, 0); + } + + cupsdLogPage(job, message); + + if (job->sheets) + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, + "Printed %d page(s).", job->sheets->values[0].integer); + } + else if (loglevel == CUPSD_LOG_STATE) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "STATE: %s", message); + + if (!strcmp(message, "paused")) + { + cupsdStopPrinter(job->printer, 1); + return; + } + else if (cupsdSetPrinterReasons(job->printer, message)) + event |= CUPSD_EVENT_PRINTER_STATE; + + update_job_attrs(job, 0); + } + else if (loglevel == CUPSD_LOG_ATTR) + { + /* + * Set attribute(s)... + */ + + int num_attrs; /* Number of attributes */ + cups_option_t *attrs; /* Attributes */ + const char *attr; /* Attribute */ + + + cupsdLogJob(job, CUPSD_LOG_DEBUG, "ATTR: %s", message); + + num_attrs = cupsParseOptions(message, 0, &attrs); + + if ((attr = cupsGetOption("auth-info-required", num_attrs, + attrs)) != NULL) + { + cupsdSetAuthInfoRequired(job->printer, attr, NULL); + cupsdSetPrinterAttrs(job->printer); + + if (job->printer->type & CUPS_PRINTER_DISCOVERED) + cupsdMarkDirty(CUPSD_DIRTY_REMOTE); + else + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("job-media-progress", num_attrs, + attrs)) != NULL) + { + int progress = atoi(attr); + + + if (progress >= 0 && progress <= 100) + { + job->progress = progress; + + if (job->sheets) + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, + "Printing page %d, %d%%", + job->sheets->values[0].integer, job->progress); + } + } + + if ((attr = cupsGetOption("printer-alert", num_attrs, attrs)) != NULL) + { + cupsdSetString(&job->printer->alert, attr); + event |= CUPSD_EVENT_PRINTER_STATE; + } + + if ((attr = cupsGetOption("printer-alert-description", num_attrs, + attrs)) != NULL) + { + cupsdSetString(&job->printer->alert_description, attr); + event |= CUPSD_EVENT_PRINTER_STATE; + } + + if ((attr = cupsGetOption("marker-colors", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-colors", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-levels", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-levels", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-low-levels", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-low-levels", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-high-levels", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-high-levels", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-message", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-message", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-names", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-names", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + if ((attr = cupsGetOption("marker-types", num_attrs, attrs)) != NULL) + { + cupsdSetPrinterAttr(job->printer, "marker-types", (char *)attr); + job->printer->marker_time = time(NULL); + event |= CUPSD_EVENT_PRINTER_STATE; + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + } + + cupsFreeOptions(num_attrs, attrs); + } + else if (loglevel == CUPSD_LOG_PPD) + { + /* + * Set attribute(s)... + */ + + int num_keywords; /* Number of keywords */ + cups_option_t *keywords; /* Keywords */ + + + cupsdLogJob(job, CUPSD_LOG_DEBUG, "PPD: %s", message); + + num_keywords = cupsParseOptions(message, 0, &keywords); + + if (cupsdUpdatePrinterPPD(job->printer, num_keywords, keywords)) + cupsdSetPrinterAttrs(job->printer); + + cupsFreeOptions(num_keywords, keywords); + } + else + { + /* + * Strip legacy message prefix... + */ + + if (!strncmp(message, "recoverable:", 12)) + { + ptr = message + 12; + while (isspace(*ptr & 255)) + ptr ++; + } + else if (!strncmp(message, "recovered:", 10)) + { + ptr = message + 10; + while (isspace(*ptr & 255)) + ptr ++; + } + else + ptr = message; + + cupsdLogJob(job, loglevel, "%s", ptr); + + if (loglevel < CUPSD_LOG_DEBUG && + strcmp(job->printer->state_message, ptr)) + { + strlcpy(job->printer->state_message, ptr, + sizeof(job->printer->state_message)); + + event |= CUPSD_EVENT_PRINTER_STATE | CUPSD_EVENT_JOB_PROGRESS; + + if (loglevel <= job->status_level && job->status_level > CUPSD_LOG_ERROR) + { + /* + * Some messages show in the job-printer-state-message attribute... + */ + + if (loglevel != CUPSD_LOG_NOTICE) + job->status_level = loglevel; + + update_job_attrs(job, 1); + + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Set job-printer-state-message to \"%s\", " + "current level=%s", + job->printer_message->values[0].string.text, + levels[job->status_level]); + } + } + } + + if (!strchr(job->status_buffer->buffer, '\n')) + break; + } + + if (event & CUPSD_EVENT_JOB_PROGRESS) + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, + "%s", job->printer->state_message); + if (event & CUPSD_EVENT_PRINTER_STATE) + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, job->printer, NULL, + (job->printer->type & CUPS_PRINTER_CLASS) ? + "Class \"%s\" state changed." : + "Printer \"%s\" state changed.", + job->printer->name); + + + if (ptr == NULL && !job->status_buffer->bufused) + { + /* + * See if all of the filters and the backend have returned their + * exit statuses. + */ + + for (i = 0; job->filters[i] < 0; i ++); + + if (job->filters[i]) + { + /* + * EOF but we haven't collected the exit status of all filters... + */ + + cupsdCheckProcess(); + return; + } + + if (job->current_file >= job->num_files && job->backend > 0) + { + /* + * EOF but we haven't collected the exit status of the backend... + */ + + cupsdCheckProcess(); + return; + } + + /* + * Handle the end of job stuff... + */ + + finalize_job(job, 1); + + /* + * Check for new jobs... + */ + + cupsdCheckJobs(); + } +} + + +/* + * 'update_job_attrs()' - Update the job-printer-* attributes. + */ + +void +update_job_attrs(cupsd_job_t *job, /* I - Job to update */ + int do_message)/* I - 1 = copy job-printer-state message */ +{ + int i; /* Looping var */ + int num_reasons; /* Actual number of reasons */ + const char * const *reasons; /* Reasons */ + static const char *none = "none"; /* "none" reason */ + + + /* + * Get/create the job-printer-state-* attributes... + */ + + if (!job->printer_message) + { + if ((job->printer_message = ippFindAttribute(job->attrs, + "job-printer-state-message", + IPP_TAG_TEXT)) == NULL) + job->printer_message = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_TEXT, + "job-printer-state-message", + NULL, ""); + } + + if (!job->printer_reasons) + job->printer_reasons = ippFindAttribute(job->attrs, + "job-printer-state-reasons", + IPP_TAG_KEYWORD); + + /* + * Copy or clear the printer-state-message value as needed... + */ + + if (job->state_value != IPP_JOB_PROCESSING && + job->status_level == CUPSD_LOG_INFO) + cupsdSetString(&(job->printer_message->values[0].string.text), ""); + else if (job->printer->state_message[0] && do_message) + cupsdSetString(&(job->printer_message->values[0].string.text), + job->printer->state_message); + + /* + * ... and the printer-state-reasons value... + */ + + if (job->printer->num_reasons == 0) + { + num_reasons = 1; + reasons = &none; + } + else + { + num_reasons = job->printer->num_reasons; + reasons = (const char * const *)job->printer->reasons; + } + + if (!job->printer_reasons || job->printer_reasons->num_values != num_reasons) + { + /* + * Replace/create a job-printer-state-reasons attribute... + */ + + ippDeleteAttribute(job->attrs, job->printer_reasons); + + job->printer_reasons = ippAddStrings(job->attrs, + IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-printer-state-reasons", + num_reasons, NULL, NULL); + } + else + { + /* + * Don't bother clearing the reason strings if they are the same... + */ + + for (i = 0; i < num_reasons; i ++) + if (strcmp(job->printer_reasons->values[i].string.text, reasons[i])) + break; + + if (i >= num_reasons) + return; + + /* + * Not the same, so free the current strings... + */ + + for (i = 0; i < num_reasons; i ++) + _cupsStrFree(job->printer_reasons->values[i].string.text); + } + + /* + * Copy the reasons... + */ + + for (i = 0; i < num_reasons; i ++) + job->printer_reasons->values[i].string.text = _cupsStrAlloc(reasons[i]); +} + + +/* + * End of "$Id: job.c 10420 2012-04-20 03:01:06Z mike $". + */ diff --git a/scheduler/job.h b/scheduler/job.h new file mode 100644 index 0000000..130326f --- /dev/null +++ b/scheduler/job.h @@ -0,0 +1,164 @@ +/* + * "$Id: job.h 9778 2011-05-18 02:27:11Z mike $" + * + * Print job definitions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Constants... + */ + +typedef enum cupsd_jobaction_e /**** Actions for state changes ****/ +{ + CUPSD_JOB_DEFAULT, /* Use default action */ + CUPSD_JOB_FORCE, /* Force the change */ + CUPSD_JOB_PURGE /* Force the change and purge */ +} cupsd_jobaction_t; + + +/* + * Job request structure... + */ + +struct cupsd_job_s /**** Job request ****/ +{ + int id, /* Job ID */ + priority, /* Job priority */ + dirty; /* Do we need to write the "c" file? */ + ipp_jstate_t state_value; /* Cached job-state */ + int pending_timeout;/* Non-zero if the job was created and + * waiting on files */ + char *username; /* Printing user */ + char *dest; /* Destination printer or class */ + cups_ptype_t dtype; /* Destination type */ + cupsd_printer_t *printer; /* Printer this job is assigned to */ + int num_files; /* Number of files in job */ + mime_type_t **filetypes; /* File types */ + int *compressions; /* Compression status of each file */ + ipp_attribute_t *sheets; /* job-media-sheets-completed */ + time_t access_time, /* Last access time */ + kill_time, /* When to send SIGKILL */ + hold_until; /* Hold expiration date/time */ + ipp_attribute_t *state; /* Job state */ + ipp_attribute_t *job_sheets; /* Job sheets (NULL if none) */ + ipp_attribute_t *printer_message, + /* job-printer-state-message */ + *printer_reasons; + /* job-printer-state-reasons */ + int current_file; /* Current file in job */ + ipp_t *attrs; /* Job attributes */ + int print_pipes[2], /* Print data pipes */ + back_pipes[2], /* Backchannel pipes */ + side_pipes[2], /* Sidechannel pipes */ + status_pipes[2];/* Status pipes */ + cupsd_statbuf_t *status_buffer; /* Status buffer for this job */ + int status_level; /* Highest log level in a status + * message */ + int cost; /* Filtering cost */ + int pending_cost; /* Waiting for FilterLimit */ + int filters[MAX_FILTERS + 1]; + /* Filter process IDs, 0 terminated */ + int backend; /* Backend process ID */ + int status; /* Status code from filters */ + int tries; /* Number of tries for this job */ + char *auth_env[3], /* AUTH_xxx environment variables, + * if any */ + *auth_uid; /* AUTH_UID environment variable */ + void *profile; /* Security profile */ + cups_array_t *history; /* Debug log history */ + int progress; /* Printing progress */ +}; + +typedef struct cupsd_joblog_s /**** Job log message ****/ +{ + time_t time; /* Time of message */ + char message[1]; /* Message string */ +} cupsd_joblog_t; + + +/* + * Globals... + */ + +VAR int JobHistory VALUE(1); + /* Preserve job history? */ +VAR int JobFiles VALUE(0); + /* Preserve job files? */ +VAR int MaxJobs VALUE(0), + /* Max number of jobs */ + MaxActiveJobs VALUE(0), + /* Max number of active jobs */ + MaxJobsPerUser VALUE(0), + /* Max jobs per user */ + MaxJobsPerPrinter VALUE(0); + /* Max jobs per printer */ +VAR int JobAutoPurge VALUE(0); + /* Automatically purge jobs */ +VAR cups_array_t *Jobs VALUE(NULL), + /* List of current jobs */ + *ActiveJobs VALUE(NULL), + /* List of active jobs */ + *PrintingJobs VALUE(NULL); + /* List of jobs that are printing */ +VAR int NextJobId VALUE(1); + /* Next job ID to use */ +VAR int JobKillDelay VALUE(DEFAULT_TIMEOUT), + /* Delay before killing jobs */ + JobRetryLimit VALUE(5), + /* Max number of tries */ + JobRetryInterval VALUE(300); + /* Seconds between retries */ + + +/* + * Prototypes... + */ + +extern cupsd_job_t *cupsdAddJob(int priority, const char *dest); +extern void cupsdCancelJobs(const char *dest, const char *username, + int purge); +extern void cupsdCheckJobs(void); +extern void cupsdCleanJobs(void); +extern void cupsdContinueJob(cupsd_job_t *job); +extern void cupsdDeleteJob(cupsd_job_t *job, + cupsd_jobaction_t action); +extern cupsd_job_t *cupsdFindJob(int id); +extern void cupsdFreeAllJobs(void); +extern int cupsdGetPrinterJobCount(const char *dest); +extern int cupsdGetUserJobCount(const char *username); +extern void cupsdLoadAllJobs(void); +extern int cupsdLoadJob(cupsd_job_t *job); +extern void cupsdMoveJob(cupsd_job_t *job, cupsd_printer_t *p); +extern void cupsdReleaseJob(cupsd_job_t *job); +extern void cupsdRestartJob(cupsd_job_t *job); +extern void cupsdSaveAllJobs(void); +extern void cupsdSaveJob(cupsd_job_t *job); +extern void cupsdSetJobHoldUntil(cupsd_job_t *job, + const char *when, int update); +extern void cupsdSetJobPriority(cupsd_job_t *job, int priority); +extern void cupsdSetJobState(cupsd_job_t *job, + ipp_jstate_t newstate, + cupsd_jobaction_t action, + const char *message, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 4, 5))) +#endif /* __GNUC__ */ +; +extern void cupsdStopAllJobs(cupsd_jobaction_t action, + int kill_delay); +extern int cupsdTimeoutJob(cupsd_job_t *job); +extern void cupsdUnloadCompletedJobs(void); + + +/* + * End of "$Id: job.h 9778 2011-05-18 02:27:11Z mike $". + */ diff --git a/scheduler/libcupsmime.exp b/scheduler/libcupsmime.exp new file mode 100644 index 0000000..cd02a6f --- /dev/null +++ b/scheduler/libcupsmime.exp @@ -0,0 +1,22 @@ +_mimeAddFilter +_mimeAddType +_mimeAddTypeRule +_mimeDelete +_mimeDeleteFilter +_mimeDeleteType +_mimeFileType +_mimeFilter +_mimeFilter2 +_mimeFilterLookup +_mimeFirstFilter +_mimeFirstType +_mimeLoad +_mimeLoadFilters +_mimeLoadTypes +_mimeNew +_mimeNextFilter +_mimeNextType +_mimeNumFilters +_mimeNumTypes +_mimeSetErrorCallback +_mimeType diff --git a/scheduler/listen.c b/scheduler/listen.c new file mode 100644 index 0000000..ce7a26d --- /dev/null +++ b/scheduler/listen.c @@ -0,0 +1,431 @@ +/* + * "$Id: listen.c 9691 2011-04-15 23:38:13Z mike $" + * + * Server listening routines for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdDeleteAllListeners() - Delete all listeners. + * cupsdPauseListening() - Clear input polling on all listening sockets... + * cupsdResumeListening() - Set input polling on all listening sockets... + * cupsdStartListening() - Create all listening sockets... + * cupsdStopListening() - Close all listening sockets... + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + + +/* + * Make sure the IPV6_V6ONLY is defined on Linux - older versions of + * glibc don't define it even if the kernel supports it... + */ + +#if defined(__linux) && !defined(IPV6_V6ONLY) +# define IPV6_V6ONLY 26 +#endif /* __linux && !IPV6_V6ONLY */ + + +/* + * 'cupsdDeleteAllListeners()' - Delete all listeners. + */ + +void +cupsdDeleteAllListeners(void) +{ + cupsd_listener_t *lis; /* Current listening socket */ + + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + free(lis); + + cupsArrayDelete(Listeners); + Listeners = NULL; +} + + +/* + * 'cupsdPauseListening()' - Clear input polling on all listening sockets... + */ + +void +cupsdPauseListening(void) +{ + cupsd_listener_t *lis; /* Current listening socket */ + + + if (cupsArrayCount(Listeners) < 1) + return; + + if (cupsArrayCount(Clients) == MaxClients) + cupsdLogMessage(CUPSD_LOG_WARN, + "Max clients reached, holding new connections..."); + else if (errno == ENFILE || errno == EMFILE) + cupsdLogMessage(CUPSD_LOG_WARN, + "Too many open files, holding new connections for " + "30 seconds..."); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdPauseListening: Clearing input bits..."); + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + cupsdRemoveSelect(lis->fd); + + ListeningPaused = time(NULL) + 30; +} + + +/* + * 'cupsdResumeListening()' - Set input polling on all listening sockets... + */ + +void +cupsdResumeListening(void) +{ + cupsd_listener_t *lis; /* Current listening socket */ + + + if (cupsArrayCount(Listeners) < 1) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Resuming new connection processing..."); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdResumeListening: Setting input bits..."); + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + cupsdAddSelect(lis->fd, (cupsd_selfunc_t)cupsdAcceptClient, NULL, lis); + + ListeningPaused = 0; +} + + +/* + * 'cupsdStartListening()' - Create all listening sockets... + */ + +void +cupsdStartListening(void) +{ + int status; /* Bind result */ + int p, /* Port number */ + val; /* Parameter value */ + cupsd_listener_t *lis; /* Current listening socket */ + char s[256]; /* String addresss */ + const char *have_domain; /* Have a domain socket? */ + static const char * const encryptions[] = + { /* Encryption values */ + "IfRequested", + "Never", + "Required", + "Always" + }; + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartListening: %d Listeners", + cupsArrayCount(Listeners)); + + /* + * Setup socket listeners... + */ + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners), LocalPort = 0, + have_domain = NULL; + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + { + httpAddrString(&(lis->address), s, sizeof(s)); + p = _httpAddrPort(&(lis->address)); + + /* + * If needed, create a socket for listening... + */ + + if (lis->fd == -1) + { + /* + * Create a socket for listening... + */ + + lis->fd = socket(lis->address.addr.sa_family, SOCK_STREAM, 0); + + if (lis->fd == -1) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open listen socket for address %s:%d - %s.", + s, p, strerror(errno)); + +#ifdef AF_INET6 + /* + * IPv6 is often disabled while DNS returns IPv6 addresses... + */ + + if (lis->address.addr.sa_family != AF_INET6 && + (FatalErrors & CUPSD_FATAL_LISTEN)) + cupsdEndProcess(getpid(), 0); +#else + if (FatalErrors & CUPSD_FATAL_LISTEN) + cupsdEndProcess(getpid(), 0); +#endif /* AF_INET6 */ + + continue; + } + + /* + * Set things up to reuse the local address for this port. + */ + + val = 1; +#ifdef __sun + setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val)); +#else + setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val)); +#endif /* __sun */ + + /* + * Bind to the port we found... + */ + +#ifdef AF_INET6 + if (lis->address.addr.sa_family == AF_INET6) + { +# ifdef IPV6_V6ONLY + /* + * Accept only IPv6 connections on this socket, to avoid + * potential security issues and to make all platforms behave + * the same. + */ + + val = 1; +# ifdef __sun + setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&val, sizeof(val)); +# else + setsockopt(lis->fd, IPPROTO_IPV6, IPV6_V6ONLY, &val, sizeof(val)); +# endif /* __sun */ +# endif /* IPV6_V6ONLY */ + + status = bind(lis->fd, (struct sockaddr *)&(lis->address), + httpAddrLength(&(lis->address))); + } + else +#endif /* AF_INET6 */ +#ifdef AF_LOCAL + if (lis->address.addr.sa_family == AF_LOCAL) + { + mode_t mask; /* Umask setting */ + + + /* + * Remove any existing domain socket file... + */ + + unlink(lis->address.un.sun_path); + + /* + * Save the current umask and set it to 0 so that all users can access + * the domain socket... + */ + + mask = umask(0); + + /* + * Bind the domain socket... + */ + + status = bind(lis->fd, (struct sockaddr *)&(lis->address), + httpAddrLength(&(lis->address))); + + /* + * Restore the umask... + */ + + umask(mask); + } + else +#endif /* AF_LOCAL */ + status = bind(lis->fd, (struct sockaddr *)&(lis->address), + sizeof(lis->address.ipv4)); + + if (status < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to bind socket for address %s:%d - %s.", + s, p, strerror(errno)); + close(lis->fd); + lis->fd = -1; + + if (FatalErrors & CUPSD_FATAL_LISTEN) + cupsdEndProcess(getpid(), 0); + + continue; + } + + /* + * Listen for new clients. + */ + + if (listen(lis->fd, ListenBackLog) < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to listen for clients on address %s:%d - %s.", + s, p, strerror(errno)); + + close(lis->fd); + lis->fd = -1; + + if (FatalErrors & CUPSD_FATAL_LISTEN) + cupsdEndProcess(getpid(), 0); + + continue; + } + } + + fcntl(lis->fd, F_SETFD, fcntl(lis->fd, F_GETFD) | FD_CLOEXEC); + + if (p) + cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s:%d on fd %d...", + s, p, lis->fd); + else + { + cupsdLogMessage(CUPSD_LOG_INFO, "Listening to %s on fd %d...", + s, lis->fd); + + if (chmod(s, 0140777)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to change permisssions on domain socket " + "\"%s\" - %s", s, strerror(errno)); + } + + /* + * Save the first port that is bound to the local loopback or + * "any" address... + */ + + if ((!LocalPort || LocalEncryption == HTTP_ENCRYPT_ALWAYS) && p > 0 && + (httpAddrLocalhost(&(lis->address)) || + httpAddrAny(&(lis->address)))) + { + LocalPort = p; + LocalEncryption = lis->encryption; + } + +#ifdef AF_LOCAL + if (lis->address.addr.sa_family == AF_LOCAL && !have_domain) + have_domain = lis->address.un.sun_path; +#endif /* AF_LOCAL */ + } + + /* + * Make sure that we are listening on localhost! + */ + + if (!LocalPort && !have_domain) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "No Listen or Port lines were found to allow access via " + "localhost!"); + + if (FatalErrors & (CUPSD_FATAL_CONFIG | CUPSD_FATAL_LISTEN)) + cupsdEndProcess(getpid(), 0); + } + + /* + * Set the CUPS_SERVER, IPP_PORT, and CUPS_ENCRYPTION variables based on + * the listeners... + */ + + if (have_domain) + { + /* + * Use domain sockets for the local connection... + */ + + cupsdSetEnv("CUPS_SERVER", have_domain); + + LocalEncryption = HTTP_ENCRYPT_IF_REQUESTED; + } + else + { + /* + * Use the default local loopback address for the server... + */ + + cupsdSetEnv("CUPS_SERVER", "localhost"); + } + + cupsdSetEnv("CUPS_ENCRYPTION", encryptions[LocalEncryption]); + + if (LocalPort) + cupsdSetEnvf("IPP_PORT", "%d", LocalPort); + + /* + * Resume listening for connections... + */ + + cupsdResumeListening(); +} + + +/* + * 'cupsdStopListening()' - Close all listening sockets... + */ + +void +cupsdStopListening(void) +{ + cupsd_listener_t *lis; /* Current listening socket */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStopListening: closing all listen sockets."); + + cupsdPauseListening(); + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + { + if (lis->fd != -1) + { +#ifdef WIN32 + closesocket(lis->fd); +#else + close(lis->fd); +#endif /* WIN32 */ + +#ifdef AF_LOCAL + /* + * Remove domain sockets... + */ + +# ifdef HAVE_LAUNCH_H + if (lis->address.addr.sa_family == AF_LOCAL && !Launchd) +# else + if (lis->address.addr.sa_family == AF_LOCAL) +# endif /* HAVE_LAUNCH_H */ + unlink(lis->address.un.sun_path); +#endif /* AF_LOCAL */ + } + } +} + + +/* + * End of "$Id: listen.c 9691 2011-04-15 23:38:13Z mike $". + */ diff --git a/scheduler/log.c b/scheduler/log.c new file mode 100644 index 0000000..2a48a07 --- /dev/null +++ b/scheduler/log.c @@ -0,0 +1,1081 @@ +/* + * "$Id: log.c 9949 2011-08-31 04:58:33Z mike $" + * + * Log file routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdCheckLogFile() - Open/rotate a log file if it needs it. + * cupsdGetDateTime() - Returns a pointer to a date/time string. + * cupsdLogGSSMessage() - Log a GSSAPI error... + * cupsdLogJob() - Log a job message. + * cupsdLogMessage() - Log a message to the error log file. + * cupsdLogPage() - Log a page to the page log file. + * cupsdLogRequest() - Log an HTTP request in Common Log Format. + * cupsdWriteErrorLog() - Write a line to the ErrorLog. + * format_log_line() - Format a line for a log file. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#include +#include + + +/* + * Local globals... + */ + +static int log_linesize = 0; /* Size of line for output file */ +static char *log_line = NULL; /* Line for output file */ + + +/* + * Local functions... + */ + +static int format_log_line(const char *message, va_list ap); + + +/* + * 'cupsdCheckLogFile()' - Open/rotate a log file if it needs it. + */ + +int /* O - 1 if log file open */ +cupsdCheckLogFile(cups_file_t **lf, /* IO - Log file */ + const char *logname) /* I - Log filename */ +{ + char backname[1024], /* Backup log filename */ + filename[1024], /* Formatted log filename */ + *ptr; /* Pointer into filename */ + const char *logptr; /* Pointer into log filename */ + struct group *loggrp; /* Group entry of log filename */ + + + /* + * See if we have a log file to check... + */ + + if (!lf || !logname || !logname[0]) + return (1); + + /* + * Use adm group if possible, fall back to Group + */ + loggrp = getgrnam("adm"); + + /* + * Format the filename as needed... + */ + + if (!*lf || + (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize && + MaxLogSize > 0)) + { + /* + * Handle format strings... + */ + + filename[sizeof(filename) - 1] = '\0'; + + if (logname[0] != '/') + { + strlcpy(filename, ServerRoot, sizeof(filename)); + strlcat(filename, "/", sizeof(filename)); + } + else + filename[0] = '\0'; + + for (logptr = logname, ptr = filename + strlen(filename); + *logptr && ptr < (filename + sizeof(filename) - 1); + logptr ++) + if (*logptr == '%') + { + /* + * Format spec... + */ + + logptr ++; + if (*logptr == 's') + { + /* + * Insert the server name... + */ + + strlcpy(ptr, ServerName, sizeof(filename) - (ptr - filename)); + ptr += strlen(ptr); + } + else + { + /* + * Otherwise just insert the character... + */ + + *ptr++ = *logptr; + } + } + else + *ptr++ = *logptr; + + *ptr = '\0'; + } + + /* + * See if the log file is open... + */ + + if (!*lf) + { + /* + * Nope, open the log file... + */ + + if ((*lf = cupsFileOpen(filename, "a")) == NULL) + { + /* + * If the file is in CUPS_LOGDIR then try to create a missing directory... + */ + + if (!strncmp(filename, CUPS_LOGDIR, strlen(CUPS_LOGDIR))) + { + /* + * Try updating the permissions of the containing log directory, using + * the log file permissions as a basis... + */ + + int log_dir_perm = 0300 | LogFilePerm; + /* LogFilePerm + owner write/search */ + if (log_dir_perm & 0040) + log_dir_perm |= 0010; /* Add group search */ + if (log_dir_perm & 0004) + log_dir_perm |= 0001; /* Add other search */ + + cupsdCheckPermissions(CUPS_LOGDIR, NULL, log_dir_perm, RunUser, Group, + 1, -1); + + *lf = cupsFileOpen(filename, "a"); + } + + if (*lf == NULL) + { + syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, + strerror(errno)); + + if (FatalErrors & CUPSD_FATAL_LOG) + cupsdEndProcess(getpid(), 0); + + return (0); + } + } + + if (strncmp(filename, "/dev/", 5)) + { + /* + * Change ownership and permissions of non-device logs... + */ + + fchown(cupsFileNumber(*lf), RunUser, loggrp ? loggrp->gr_gid : Group); + fchmod(cupsFileNumber(*lf), LogFilePerm); + } + } + + /* + * Do we need to rotate the log? + */ + + if (strncmp(logname, "/dev/", 5) && cupsFileTell(*lf) > MaxLogSize && + MaxLogSize > 0) + { + /* + * Rotate log file... + */ + + cupsFileClose(*lf); + + strcpy(backname, filename); + strlcat(backname, ".O", sizeof(backname)); + + unlink(backname); + rename(filename, backname); + + if ((*lf = cupsFileOpen(filename, "a")) == NULL) + { + syslog(LOG_ERR, "Unable to open log file \"%s\" - %s", filename, + strerror(errno)); + + if (FatalErrors & CUPSD_FATAL_LOG) + cupsdEndProcess(getpid(), 0); + + return (0); + } + + /* + * Change ownership and permissions of non-device logs... + */ + + fchown(cupsFileNumber(*lf), RunUser, loggrp ? loggrp->gr_gid : Group); + fchmod(cupsFileNumber(*lf), LogFilePerm); + } + + return (1); +} + + +/* + * 'cupsdGetDateTime()' - Returns a pointer to a date/time string. + */ + +char * /* O - Date/time string */ +cupsdGetDateTime(struct timeval *t, /* I - Time value or NULL for current */ + cupsd_time_t format) /* I - Format to use */ +{ + struct timeval curtime; /* Current time value */ + struct tm *date; /* Date/time value */ + static struct timeval last_time = { 0, 0 }; + /* Last time we formatted */ + static char s[1024]; /* Date/time string */ + static const char * const months[12] =/* Months */ + { + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + }; + + + /* + * Make sure we have a valid time... + */ + + if (!t) + { + gettimeofday(&curtime, NULL); + t = &curtime; + } + + if (t->tv_sec != last_time.tv_sec || + (LogTimeFormat == CUPSD_TIME_USECS && t->tv_usec != last_time.tv_usec)) + { + last_time = *t; + + /* + * Get the date and time from the UNIX time value, and then format it + * into a string. Note that we *can't* use the strftime() function since + * it is localized and will seriously confuse automatic programs if the + * month names are in the wrong language! + * + * Also, we use the "timezone" variable that contains the current timezone + * offset from GMT in seconds so that we are reporting local time in the + * log files. If you want GMT, set the TZ environment variable accordingly + * before starting the scheduler. + * + * (*BSD and Darwin store the timezone offset in the tm structure) + */ + + date = localtime(&(t->tv_sec)); + + if (format == CUPSD_TIME_STANDARD) + snprintf(s, sizeof(s), "[%02d/%s/%04d:%02d:%02d:%02d %+03ld%02ld]", + date->tm_mday, months[date->tm_mon], 1900 + date->tm_year, + date->tm_hour, date->tm_min, date->tm_sec, +#ifdef HAVE_TM_GMTOFF + date->tm_gmtoff / 3600, (date->tm_gmtoff / 60) % 60); +#else + timezone / 3600, (timezone / 60) % 60); +#endif /* HAVE_TM_GMTOFF */ + else + snprintf(s, sizeof(s), "[%02d/%s/%04d:%02d:%02d:%02d.%06d %+03ld%02ld]", + date->tm_mday, months[date->tm_mon], 1900 + date->tm_year, + date->tm_hour, date->tm_min, date->tm_sec, (int)t->tv_usec, +#ifdef HAVE_TM_GMTOFF + date->tm_gmtoff / 3600, (date->tm_gmtoff / 60) % 60); +#else + timezone / 3600, (timezone / 60) % 60); +#endif /* HAVE_TM_GMTOFF */ + } + + return (s); +} + + +/* + * 'cupsdLogFCMessage()' - Log a file checking message. + */ + +void +cupsdLogFCMessage( + void *context, /* I - Printer (if any) */ + _cups_fc_result_t result, /* I - Check result */ + const char *message) /* I - Message to log */ +{ + cupsd_printer_t *p = (cupsd_printer_t *)context; + /* Printer */ + cupsd_loglevel_t level; /* Log level */ + + + if (result == _CUPS_FILE_CHECK_OK) + level = CUPSD_LOG_DEBUG2; + else + level = CUPSD_LOG_ERROR; + + if (p) + { + cupsdLogMessage(level, "%s: %s", p->name, message); + + if (result == _CUPS_FILE_CHECK_MISSING || + result == _CUPS_FILE_CHECK_WRONG_TYPE) + { + strlcpy(p->state_message, message, sizeof(p->state_message)); + + if (cupsdSetPrinterReasons(p, "+cups-missing-filter-warning")) + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message); + } + else if (result == _CUPS_FILE_CHECK_PERMISSIONS || + result == _CUPS_FILE_CHECK_RELATIVE_PATH) + { + strlcpy(p->state_message, message, sizeof(p->state_message)); + + if (cupsdSetPrinterReasons(p, "+cups-insecure-filter-warning")) + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, p, NULL, "%s", message); + } + } + else + cupsdLogMessage(level, "%s", message); +} + + +#ifdef HAVE_GSSAPI +/* + * 'cupsdLogGSSMessage()' - Log a GSSAPI error... + */ + +int /* O - 1 on success, 0 on error */ +cupsdLogGSSMessage( + int level, /* I - Log level */ + int major_status, /* I - Major GSSAPI status */ + int minor_status, /* I - Minor GSSAPI status */ + const char *message, /* I - printf-style message string */ + ...) /* I - Additional args as needed */ +{ + OM_uint32 err_major_status, /* Major status code for display */ + err_minor_status; /* Minor status code for display */ + OM_uint32 msg_ctx; /* Message context */ + gss_buffer_desc major_status_string = GSS_C_EMPTY_BUFFER, + /* Major status message */ + minor_status_string = GSS_C_EMPTY_BUFFER; + /* Minor status message */ + int ret; /* Return value */ + + + msg_ctx = 0; + err_major_status = gss_display_status(&err_minor_status, + major_status, + GSS_C_GSS_CODE, + GSS_C_NO_OID, + &msg_ctx, + &major_status_string); + + if (!GSS_ERROR(err_major_status)) + gss_display_status(&err_minor_status, minor_status, GSS_C_MECH_CODE, + GSS_C_NULL_OID, &msg_ctx, &minor_status_string); + + ret = cupsdLogMessage(level, "%s: %s, %s", message, + (char *)major_status_string.value, + (char *)minor_status_string.value); + gss_release_buffer(&err_minor_status, &major_status_string); + gss_release_buffer(&err_minor_status, &minor_status_string); + + return (ret); +} +#endif /* HAVE_GSSAPI */ + + +/* + * 'cupsdLogJob()' - Log a job message. + */ + +int /* O - 1 on success, 0 on error */ +cupsdLogJob(cupsd_job_t *job, /* I - Job */ + int level, /* I - Log level */ + const char *message, /* I - Printf-style message string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Argument pointer */ + char jobmsg[1024]; /* Format string for job message */ + int status; /* Formatting status */ + + + /* + * See if we want to log this message... + */ + + if (TestConfigFile || !ErrorLog) + return (1); + + if ((level > LogLevel || + (level == CUPSD_LOG_INFO && LogLevel < CUPSD_LOG_DEBUG)) && + LogDebugHistory <= 0) + return (1); + + /* + * Format and write the log message... + */ + + snprintf(jobmsg, sizeof(jobmsg), "[Job %d] %s", job->id, message); + + do + { + va_start(ap, message); + status = format_log_line(jobmsg, ap); + va_end(ap); + } + while (status == 0); + + if (status > 0) + { + if ((level > LogLevel || + (level == CUPSD_LOG_INFO && LogLevel < CUPSD_LOG_DEBUG)) && + LogDebugHistory > 0) + { + /* + * Add message to the job history... + */ + + cupsd_joblog_t *temp; /* Copy of log message */ + + + if ((temp = malloc(sizeof(cupsd_joblog_t) + strlen(log_line))) != NULL) + { + temp->time = time(NULL); + strcpy(temp->message, log_line); + } + + if (!job->history) + job->history = cupsArrayNew(NULL, NULL); + + if (job->history && temp) + { + cupsArrayAdd(job->history, temp); + + if (cupsArrayCount(job->history) > LogDebugHistory) + { + /* + * Remove excess messages... + */ + + temp = cupsArrayFirst(job->history); + cupsArrayRemove(job->history, temp); + free(temp); + } + } + else if (temp) + free(temp); + + return (1); + } + else if (level <= LogLevel && + (level != CUPSD_LOG_INFO || LogLevel >= CUPSD_LOG_DEBUG)) + return (cupsdWriteErrorLog(level, log_line)); + else + return (1); + } + else + return (cupsdWriteErrorLog(CUPSD_LOG_ERROR, + "Unable to allocate memory for log line!")); +} + + +/* + * 'cupsdLogMessage()' - Log a message to the error log file. + */ + +int /* O - 1 on success, 0 on error */ +cupsdLogMessage(int level, /* I - Log level */ + const char *message, /* I - printf-style message string */ + ...) /* I - Additional args as needed */ +{ + va_list ap; /* Argument pointer */ + int status; /* Formatting status */ + + + /* + * See if we want to log this message... + */ + + if ((TestConfigFile || !ErrorLog) && level <= CUPSD_LOG_WARN) + { + va_start(ap, message); + vfprintf(stderr, message, ap); + putc('\n', stderr); + va_end(ap); + + return (1); + } + + if (level > LogLevel || !ErrorLog) + return (1); + + /* + * Format and write the log message... + */ + + do + { + va_start(ap, message); + status = format_log_line(message, ap); + va_end(ap); + } + while (status == 0); + + if (status > 0) + return (cupsdWriteErrorLog(level, log_line)); + else + return (cupsdWriteErrorLog(CUPSD_LOG_ERROR, + "Unable to allocate memory for log line!")); +} + + +/* + * 'cupsdLogPage()' - Log a page to the page log file. + */ + +int /* O - 1 on success, 0 on error */ +cupsdLogPage(cupsd_job_t *job, /* I - Job being printed */ + const char *page) /* I - Page being printed */ +{ + int i; /* Looping var */ + char buffer[2048], /* Buffer for page log */ + *bufptr, /* Pointer into buffer */ + name[256]; /* Attribute name */ + const char *format, /* Pointer into PageLogFormat */ + *nameend; /* End of attribute name */ + ipp_attribute_t *attr; /* Current attribute */ + char number[256]; /* Page number */ + int copies; /* Number of copies */ + + + /* + * Format the line going into the page log... + */ + + if (!PageLogFormat) + return (1); + + strcpy(number, "1"); + copies = 1; + sscanf(page, "%255s%d", number, &copies); + + for (format = PageLogFormat, bufptr = buffer; *format; format ++) + { + if (*format == '%') + { + format ++; + + switch (*format) + { + case '%' : /* Literal % */ + if (bufptr < (buffer + sizeof(buffer) - 1)) + *bufptr++ = '%'; + break; + + case 'p' : /* Printer name */ + strlcpy(bufptr, job->printer->name, + sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + + case 'j' : /* Job ID */ + snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", job->id); + bufptr += strlen(bufptr); + break; + + case 'u' : /* Username */ + strlcpy(bufptr, job->username ? job->username : "-", + sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + + case 'T' : /* Date and time */ + strlcpy(bufptr, cupsdGetDateTime(NULL, LogTimeFormat), + sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + + case 'P' : /* Page number */ + strlcpy(bufptr, number, sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + + case 'C' : /* Number of copies */ + snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), "%d", copies); + bufptr += strlen(bufptr); + break; + + case '{' : /* {attribute} */ + if ((nameend = strchr(format, '}')) != NULL && + (nameend - format - 2) < (sizeof(name) - 1)) + { + /* + * Pull the name from inside the brackets... + */ + + memcpy(name, format + 1, nameend - format - 1); + name[nameend - format - 1] = '\0'; + + format = nameend; + + if ((attr = ippFindAttribute(job->attrs, name, + IPP_TAG_ZERO)) != NULL) + { + /* + * Add the attribute value... + */ + + for (i = 0; + i < attr->num_values && + bufptr < (buffer + sizeof(buffer) - 1); + i ++) + { + if (i) + *bufptr++ = ','; + + switch (attr->value_tag) + { + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), + "%d", attr->values[i].integer); + bufptr += strlen(bufptr); + break; + + case IPP_TAG_BOOLEAN : + snprintf(bufptr, sizeof(buffer) - (bufptr - buffer), + "%d", attr->values[i].boolean); + bufptr += strlen(bufptr); + break; + + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + strlcpy(bufptr, attr->values[i].string.text, + sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + + default : + strlcpy(bufptr, "???", + sizeof(buffer) - (bufptr - buffer)); + bufptr += strlen(bufptr); + break; + } + } + } + else if (bufptr < (buffer + sizeof(buffer) - 1)) + *bufptr++ = '-'; + break; + } + + default : + if (bufptr < (buffer + sizeof(buffer) - 2)) + { + *bufptr++ = '%'; + *bufptr++ = *format; + } + break; + } + } + else if (bufptr < (buffer + sizeof(buffer) - 1)) + *bufptr++ = *format; + } + + *bufptr = '\0'; + +#ifdef HAVE_VSYSLOG + /* + * See if we are logging pages via syslog... + */ + + if (!strcmp(PageLog, "syslog")) + { + syslog(LOG_INFO, "%s", buffer); + + return (1); + } +#endif /* HAVE_VSYSLOG */ + + /* + * Not using syslog; check the log file... + */ + + if (!cupsdCheckLogFile(&PageFile, PageLog)) + return (0); + + /* + * Print a page log entry of the form: + * + * printer user job-id [DD/MON/YYYY:HH:MM:SS +TTTT] page num-copies \ + * billing hostname + */ + + cupsFilePrintf(PageFile, "%s\n", buffer); + cupsFileFlush(PageFile); + + return (1); +} + + +/* + * 'cupsdLogRequest()' - Log an HTTP request in Common Log Format. + */ + +int /* O - 1 on success, 0 on error */ +cupsdLogRequest(cupsd_client_t *con, /* I - Request to log */ + http_status_t code) /* I - Response code */ +{ + char temp[2048]; /* Temporary string for URI */ + static const char * const states[] = /* HTTP client states... */ + { + "WAITING", + "OPTIONS", + "GET", + "GET", + "HEAD", + "POST", + "POST", + "POST", + "PUT", + "PUT", + "DELETE", + "TRACE", + "CLOSE", + "STATUS" + }; + + + /* + * Filter requests as needed... + */ + + if (AccessLogLevel < CUPSD_ACCESSLOG_ALL) + { + /* + * Eliminate simple GET, POST, and PUT requests... + */ + + if ((con->operation == HTTP_GET && + strncmp(con->uri, "/admin/conf", 11) && + strncmp(con->uri, "/admin/log", 10)) || + (con->operation == HTTP_POST && !con->request && + strncmp(con->uri, "/admin", 6)) || + (con->operation != HTTP_GET && con->operation != HTTP_POST && + con->operation != HTTP_PUT)) + return (1); + + if (con->request && con->response && + (con->response->request.status.status_code < IPP_REDIRECTION_OTHER_SITE || + con->response->request.status.status_code == IPP_NOT_FOUND)) + { + /* + * Check successful requests... + */ + + ipp_op_t op = con->request->request.op.operation_id; + static cupsd_accesslog_t standard_ops[] = + { + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_ACTIONS,/* Print-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Print-URI */ + CUPSD_ACCESSLOG_ACTIONS,/* Validate-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Create-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Send-Document */ + CUPSD_ACCESSLOG_ACTIONS,/* Send-URI */ + CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Job */ + CUPSD_ACCESSLOG_ALL, /* Get-Job-Attributes */ + CUPSD_ACCESSLOG_ALL, /* Get-Jobs */ + CUPSD_ACCESSLOG_ALL, /* Get-Printer-Attributes */ + CUPSD_ACCESSLOG_ACTIONS,/* Hold-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Release-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Restart-Job */ + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_CONFIG, /* Pause-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Resume-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Purge-Jobs */ + CUPSD_ACCESSLOG_CONFIG, /* Set-Printer-Attributes */ + CUPSD_ACCESSLOG_ACTIONS,/* Set-Job-Attributes */ + CUPSD_ACCESSLOG_CONFIG, /* Get-Printer-Supported-Values */ + CUPSD_ACCESSLOG_ACTIONS,/* Create-Printer-Subscription */ + CUPSD_ACCESSLOG_ACTIONS,/* Create-Job-Subscription */ + CUPSD_ACCESSLOG_ALL, /* Get-Subscription-Attributes */ + CUPSD_ACCESSLOG_ALL, /* Get-Subscriptions */ + CUPSD_ACCESSLOG_ACTIONS,/* Renew-Subscription */ + CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Subscription */ + CUPSD_ACCESSLOG_ALL, /* Get-Notifications */ + CUPSD_ACCESSLOG_ACTIONS,/* Send-Notifications */ + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_ALL, /* reserved */ + CUPSD_ACCESSLOG_ALL, /* Get-Print-Support-Files */ + CUPSD_ACCESSLOG_CONFIG, /* Enable-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Disable-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Pause-Printer-After-Current-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Hold-New-Jobs */ + CUPSD_ACCESSLOG_ACTIONS,/* Release-Held-New-Jobs */ + CUPSD_ACCESSLOG_CONFIG, /* Deactivate-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Activate-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Restart-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Shutdown-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* Startup-Printer */ + CUPSD_ACCESSLOG_ACTIONS,/* Reprocess-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Cancel-Current-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Suspend-Current-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Resume-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* Promote-Job */ + CUPSD_ACCESSLOG_ACTIONS /* Schedule-Job-After */ + }; + static cupsd_accesslog_t cups_ops[] = + { + CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Default */ + CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Printers */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Add-Modify-Printer */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Delete-Printer */ + CUPSD_ACCESSLOG_ALL, /* CUPS-Get-Classes */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Add-Modify-Class */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Delete-Class */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Accept-Jobs */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Reject-Jobs */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Set-Default */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Get-Devices */ + CUPSD_ACCESSLOG_CONFIG, /* CUPS-Get-PPDs */ + CUPSD_ACCESSLOG_ACTIONS,/* CUPS-Move-Job */ + CUPSD_ACCESSLOG_ACTIONS,/* CUPS-Authenticate-Job */ + CUPSD_ACCESSLOG_ALL /* CUPS-Get-PPD */ + }; + + + if ((op <= IPP_SCHEDULE_JOB_AFTER && standard_ops[op] > AccessLogLevel) || + (op >= CUPS_GET_DEFAULT && op <= CUPS_GET_PPD && + cups_ops[op - CUPS_GET_DEFAULT] > AccessLogLevel)) + return (1); + } + } + +#ifdef HAVE_VSYSLOG + /* + * See if we are logging accesses via syslog... + */ + + if (!strcmp(AccessLog, "syslog")) + { + syslog(LOG_INFO, + "REQUEST %s - %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n", + con->http.hostname, con->username[0] != '\0' ? con->username : "-", + states[con->operation], _httpEncodeURI(temp, con->uri, sizeof(temp)), + con->http.version / 100, con->http.version % 100, + code, CUPS_LLCAST con->bytes, + con->request ? + ippOpString(con->request->request.op.operation_id) : "-", + con->response ? + ippErrorString(con->response->request.status.status_code) : "-"); + + return (1); + } +#endif /* HAVE_VSYSLOG */ + + /* + * Not using syslog; check the log file... + */ + + if (!cupsdCheckLogFile(&AccessFile, AccessLog)) + return (0); + + /* + * Write a log of the request in "common log format"... + */ + + cupsFilePrintf(AccessFile, + "%s - %s %s \"%s %s HTTP/%d.%d\" %d " CUPS_LLFMT " %s %s\n", + con->http.hostname, + con->username[0] != '\0' ? con->username : "-", + cupsdGetDateTime(&(con->start), LogTimeFormat), + states[con->operation], + _httpEncodeURI(temp, con->uri, sizeof(temp)), + con->http.version / 100, con->http.version % 100, + code, CUPS_LLCAST con->bytes, + con->request ? + ippOpString(con->request->request.op.operation_id) : "-", + con->response ? + ippErrorString(con->response->request.status.status_code) : + "-"); + + cupsFileFlush(AccessFile); + + return (1); +} + + +/* + * 'cupsdWriteErrorLog()' - Write a line to the ErrorLog. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdWriteErrorLog(int level, /* I - Log level */ + const char *message) /* I - Message string */ +{ + static const char levels[] = /* Log levels... */ + { + ' ', + 'X', + 'A', + 'C', + 'E', + 'W', + 'N', + 'I', + 'D', + 'd' + }; +#ifdef HAVE_VSYSLOG + static const int syslevels[] = /* SYSLOG levels... */ + { + 0, + LOG_EMERG, + LOG_ALERT, + LOG_CRIT, + LOG_ERR, + LOG_WARNING, + LOG_NOTICE, + LOG_INFO, + LOG_DEBUG, + LOG_DEBUG + }; +#endif /* HAVE_VSYSLOG */ + + +#ifdef HAVE_VSYSLOG + /* + * See if we are logging errors via syslog... + */ + + if (!strcmp(ErrorLog, "syslog")) + { + syslog(syslevels[level], "%s", message); + return (1); + } +#endif /* HAVE_VSYSLOG */ + + /* + * Not using syslog; check the log file... + */ + + if (!cupsdCheckLogFile(&ErrorFile, ErrorLog)) + return (0); + + /* + * Write the log message... + */ + + cupsFilePrintf(ErrorFile, "%c %s %s\n", levels[level], + cupsdGetDateTime(NULL, LogTimeFormat), message); + cupsFileFlush(ErrorFile); + + return (1); +} + + +/* + * 'format_log_line()' - Format a line for a log file. + * + * This function resizes a global string buffer as needed. Each call returns + * a pointer to this buffer, so the contents are only good until the next call + * to format_log_line()... + */ + +static int /* O - -1 for fatal, 0 for retry, 1 for success */ +format_log_line(const char *message, /* I - Printf-style format string */ + va_list ap) /* I - Argument list */ +{ + int len; /* Length of formatted line */ + + + /* + * Allocate the line buffer as needed... + */ + + if (!log_linesize) + { + log_linesize = 8192; + log_line = malloc(log_linesize); + + if (!log_line) + return (-1); + } + + /* + * Format the log message... + */ + + len = vsnprintf(log_line, log_linesize, message, ap); + + /* + * Resize the buffer as needed... + */ + + if (len >= log_linesize && log_linesize < 65536) + { + char *temp; /* Temporary string pointer */ + + + len ++; + + if (len < 8192) + len = 8192; + else if (len > 65536) + len = 65536; + + temp = realloc(log_line, len); + + if (temp) + { + log_line = temp; + log_linesize = len; + + return (0); + } + } + + return (1); +} + + +/* + * End of "$Id: log.c 9949 2011-08-31 04:58:33Z mike $". + */ diff --git a/scheduler/main.c b/scheduler/main.c new file mode 100644 index 0000000..f111d48 --- /dev/null +++ b/scheduler/main.c @@ -0,0 +1,2169 @@ +/* + * "$Id: main.c 9783 2011-05-18 20:44:16Z mike $" + * + * Main loop for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the CUPS scheduler. + * cupsdAddString() - Copy and add a string to an array. + * cupsdCheckProcess() - Tell the main loop to check for dead children. + * cupsdClearString() - Clear a string. + * cupsdFreeStrings() - Free an array of strings. + * cupsdHoldSignals() - Hold child and termination signals. + * cupsdReleaseSignals() - Release signals for delivery. + * cupsdSetString() - Set a string value. + * cupsdSetStringf() - Set a formatted string value. + * launchd_checkin() - Check-in with launchd and collect the listening + * fds. + * launchd_checkout() - Update the launchd KeepAlive file as needed. + * parent_handler() - Catch USR1/CHLD signals... + * process_children() - Process all dead children... + * select_timeout() - Calculate the select timeout value. + * sigchld_handler() - Handle 'child' signals from old processes. + * sighup_handler() - Handle 'hangup' signals to reconfigure the + * scheduler. + * sigterm_handler() - Handle 'terminate' signals that stop the scheduler. + * usage() - Show scheduler usage. + */ + +/* + * Include necessary headers... + */ + +#define _MAIN_C_ +#include "cupsd.h" +#include +#include +#include + +#ifdef HAVE_LAUNCH_H +# include +# include +# define CUPS_KEEPALIVE CUPS_CACHEDIR "/org.cups.cupsd" + /* Name of the launchd KeepAlive file */ +# ifndef LAUNCH_JOBKEY_KEEPALIVE +# define LAUNCH_JOBKEY_KEEPALIVE "KeepAlive" +# endif /* !LAUNCH_JOBKEY_KEEPALIVE */ +# ifndef LAUNCH_JOBKEY_PATHSTATE +# define LAUNCH_JOBKEY_PATHSTATE "PathState" +# endif /* !LAUNCH_JOBKEY_PATHSTATE */ +# ifndef LAUNCH_JOBKEY_SERVICEIPC +# define LAUNCH_JOBKEY_SERVICEIPC "ServiceIPC" +# endif /* !LAUNCH_JOBKEY_SERVICEIPC */ +#endif /* HAVE_LAUNCH_H */ + +#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) +# include +#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ +#ifdef HAVE_NOTIFY_H +# include +#endif /* HAVE_NOTIFY_H */ + + +/* + * Local functions... + */ + +#ifdef HAVE_LAUNCHD +static void launchd_checkin(void); +static void launchd_checkout(void); +#endif /* HAVE_LAUNCHD */ +static void parent_handler(int sig); +static void process_children(void); +static void sigchld_handler(int sig); +static void sighup_handler(int sig); +static void sigterm_handler(int sig); +static long select_timeout(int fds); +static void usage(int status); +int write_pid(void); +int remove_pid(void); + + +/* + * Local globals... + */ + +static int parent_signal = 0; + /* Set to signal number from child */ +static int holdcount = 0; /* Number of times "hold" was called */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) +static sigset_t holdmask; /* Old POSIX signal mask */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ +static int dead_children = 0; + /* Dead children? */ +static int stop_scheduler = 0; + /* Should the scheduler stop? */ + + +/* + * 'main()' - Main entry for the CUPS scheduler. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char *opt; /* Option character */ + int fg; /* Run in the foreground */ + int fds; /* Number of ready descriptors */ + cupsd_client_t *con; /* Current client */ + cupsd_job_t *job; /* Current job */ + cupsd_listener_t *lis; /* Current listener */ + time_t current_time, /* Current time */ + activity, /* Client activity timer */ +#ifdef HAVE_AVAHI + avahi_client_time, /* Time for next Avahi client + check */ +#endif /* HAVE_AVAHI */ + browse_time, /* Next browse send time */ + senddoc_time, /* Send-Document time */ + expire_time, /* Subscription expire time */ + report_time, /* Malloc/client/job report time */ + event_time; /* Last event notification time */ + long timeout; /* Timeout for cupsdDoSelect() */ + struct rlimit limit; /* Runtime limit */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ +#ifdef __sgi + cups_file_t *fp; /* Fake lpsched lock file */ + struct stat statbuf; /* Needed for checking lpsched FIFO */ +#endif /* __sgi */ + int run_as_child = 0; + /* Needed for background fork/exec */ +#ifdef __APPLE__ + int use_sysman = !getuid(); + /* Use system management functions? */ +#else + time_t netif_time = 0; /* Time since last network update */ +#endif /* __APPLE__ */ +#if HAVE_LAUNCHD + int launchd_idle_exit; + /* Idle exit on select timeout? */ +#endif /* HAVE_LAUNCHD */ +#ifdef HAVE_AVAHI + cupsd_timeout_t *tmo; /* Next scheduled timed callback */ + long tmo_delay; /* Time before it must be called */ +#endif /* HAVE_AVAHI */ + + +#ifdef HAVE_GETEUID + /* + * Check for setuid invocation, which we do not support! + */ + + if (getuid() != geteuid()) + { + fputs("cupsd: Cannot run as a setuid program\n", stderr); + return (1); + } +#endif /* HAVE_GETEUID */ + + /* + * Check for command-line arguments... + */ + + fg = 0; + +#ifdef HAVE_LAUNCHD + if (getenv("CUPSD_LAUNCHD")) + { + Launchd = 1; + fg = 1; + } +#endif /* HAVE_LAUNCHD */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + for (opt = argv[i] + 1; *opt != '\0'; opt ++) + switch (*opt) + { + case 'C' : /* Run as child with config file */ + run_as_child = 1; + fg = -1; + + case 'c' : /* Configuration file */ + i ++; + if (i >= argc) + { + _cupsLangPuts(stderr, _("cupsd: Expected config filename " + "after \"-c\" option.")); + usage(1); + } + + if (argv[i][0] == '/') + { + /* + * Absolute directory... + */ + + cupsdSetString(&ConfigurationFile, argv[i]); + } + else + { + /* + * Relative directory... + */ + + char *current; /* Current directory */ + + + /* + * Allocate a buffer for the current working directory to + * reduce run-time stack usage; this approximates the + * behavior of some implementations of getcwd() when they + * are passed a NULL pointer. + */ + + if ((current = malloc(1024)) == NULL) + { + _cupsLangPuts(stderr, + _("cupsd: Unable to get current directory.")); + return (1); + } + + if (!getcwd(current, 1024)) + { + _cupsLangPuts(stderr, + _("cupsd: Unable to get current directory.")); + free(current); + return (1); + } + + cupsdSetStringf(&ConfigurationFile, "%s/%s", current, argv[i]); + free(current); + } + break; + + case 'f' : /* Run in foreground... */ + fg = 1; + break; + + case 'F' : /* Run in foreground, but disconnect from terminal... */ + fg = -1; + break; + + case 'h' : /* Show usage/help */ + usage(0); + break; + + case 'l' : /* Started by launchd... */ +#ifdef HAVE_LAUNCHD + Launchd = 1; + fg = 1; +#else + _cupsLangPuts(stderr, _("cupsd: launchd(8) support not compiled " + "in, running in normal mode.")); + fg = 0; +#endif /* HAVE_LAUNCHD */ + break; + + case 'p' : /* Stop immediately for profiling */ + fputs("cupsd: -p (startup profiling) is for internal testing " + "use only!\n", stderr); + stop_scheduler = 1; + fg = 1; + break; + + case 'P' : /* Disable security profiles */ + fputs("cupsd: -P (disable security profiles) is for internal " + "testing use only!\n", stderr); + UseProfiles = 0; + break; + +#ifdef __APPLE__ + case 'S' : /* Disable system management functions */ + fputs("cupsd: -S (disable system management) for internal " + "testing use only!\n", stderr); + use_sysman = 0; + break; +#endif /* __APPLE__ */ + + case 't' : /* Test the cupsd.conf file... */ + TestConfigFile = 1; + fg = 1; + break; + + default : /* Unknown option */ + _cupsLangPrintf(stderr, _("cupsd: Unknown option \"%c\" - " + "aborting."), *opt); + usage(1); + break; + } + else + { + _cupsLangPrintf(stderr, _("cupsd: Unknown argument \"%s\" - aborting."), + argv[i]); + usage(1); + } + + if (!ConfigurationFile) + cupsdSetString(&ConfigurationFile, CUPS_SERVERROOT "/cupsd.conf"); + + /* + * If the user hasn't specified "-f", run in the background... + */ + + if (!fg) + { + /* + * Setup signal handlers for the parent... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGUSR1, parent_handler); + sigset(SIGCHLD, parent_handler); + + sigset(SIGHUP, SIG_IGN); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGUSR1); + action.sa_handler = parent_handler; + sigaction(SIGUSR1, &action, NULL); + sigaction(SIGCHLD, &action, NULL); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGHUP, &action, NULL); +#else + signal(SIGUSR1, parent_handler); + signal(SIGCLD, parent_handler); + + signal(SIGHUP, SIG_IGN); +#endif /* HAVE_SIGSET */ + + if (fork() > 0) + { + /* + * OK, wait for the child to startup and send us SIGUSR1 or to crash + * and the OS send us SIGCHLD... We also need to ignore SIGHUP which + * might be sent by the init script to restart the scheduler... + */ + + for (; parent_signal == 0;) + sleep(1); + + if (parent_signal == SIGUSR1) + return (0); + + if (wait(&i) < 0) + { + perror("cupsd"); + return (1); + } + else if (WIFEXITED(i)) + { + fprintf(stderr, "cupsd: Child exited with status %d\n", + WEXITSTATUS(i)); + return (2); + } + else + { + fprintf(stderr, "cupsd: Child exited on signal %d\n", WTERMSIG(i)); + return (3); + } + } + +#ifdef __OpenBSD__ + /* + * Call _thread_sys_closefrom() so the child process doesn't reset the + * parent's file descriptors to be blocking. This is a workaround for a + * limitation of userland libpthread on OpenBSD. + */ + + _thread_sys_closefrom(0); +#endif /* __OpenBSD__ */ + + /* + * Since CoreFoundation and DBUS both create fork-unsafe data on execution of + * a program, and since this kind of really unfriendly behavior seems to be + * more common these days in system libraries, we need to re-execute the + * background cupsd with the "-C" option to avoid problems. Unfortunately, + * we also have to assume that argv[0] contains the name of the cupsd + * executable - there is no portable way to get the real pathname... + */ + + execlp(argv[0], argv[0], "-C", ConfigurationFile, (char *)0); + exit(errno); + } + + if (fg < 1) + { + /* + * Make sure we aren't tying up any filesystems... + */ + + chdir("/"); + +#ifndef DEBUG + /* + * Disable core dumps... + */ + + getrlimit(RLIMIT_CORE, &limit); + limit.rlim_cur = 0; + setrlimit(RLIMIT_CORE, &limit); + + /* + * Disconnect from the controlling terminal... + */ + + setsid(); + + /* + * Close all open files... + */ + + getrlimit(RLIMIT_NOFILE, &limit); + + for (i = 0; i < limit.rlim_cur && i < 1024; i ++) + close(i); + + /* + * Redirect stdin/out/err to /dev/null... + */ + + if ((i = open("/dev/null", O_RDONLY)) != 0) + { + dup2(i, 0); + close(i); + } + + if ((i = open("/dev/null", O_WRONLY)) != 1) + { + dup2(i, 1); + close(i); + } + + if ((i = open("/dev/null", O_WRONLY)) != 2) + { + dup2(i, 2); + close(i); + } +#endif /* DEBUG */ + } + + /* + * Set the timezone info... + */ + + tzset(); + +#ifdef LC_TIME + setlocale(LC_TIME, ""); +#endif /* LC_TIME */ + + /* + * Set the maximum number of files... + */ + + getrlimit(RLIMIT_NOFILE, &limit); + +#if !defined(HAVE_POLL) && !defined(HAVE_EPOLL) && !defined(HAVE_KQUEUE) + if (limit.rlim_max > FD_SETSIZE) + MaxFDs = FD_SETSIZE; + else +#endif /* !HAVE_POLL && !HAVE_EPOLL && !HAVE_KQUEUE */ +#ifdef RLIM_INFINITY + if (limit.rlim_max == RLIM_INFINITY) + MaxFDs = 16384; + else +#endif /* RLIM_INFINITY */ + MaxFDs = limit.rlim_max; + + limit.rlim_cur = MaxFDs; + + setrlimit(RLIMIT_NOFILE, &limit); + + cupsdStartSelect(); + + /* + * Read configuration... + */ + + if (!cupsdReadConfiguration()) + { + if (TestConfigFile) + printf("%s contains errors\n", ConfigurationFile); + else + syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting!", + ConfigurationFile); + return (1); + } + else if (TestConfigFile) + { + printf("%s is OK\n", ConfigurationFile); + return (0); + } + + /* + * Clean out old temp files and printer cache data. + */ + + if (!strncmp(TempDir, RequestRoot, strlen(RequestRoot))) + cupsdCleanFiles(TempDir, NULL); + + cupsdCleanFiles(CacheDir, "*.ipp"); + +#if HAVE_LAUNCHD + if (Launchd) + { + /* + * If we were started by launchd get the listen sockets file descriptors... + */ + + launchd_checkin(); + launchd_checkout(); + } +#endif /* HAVE_LAUNCHD */ + + /* + * Startup the server... + */ + + httpInitialize(); + +#ifdef HAVE_AVAHI + /* + * Initialize timed callback structures. + */ + + cupsdInitTimeouts(); +#endif /* HAVE_AVAHI */ + + cupsdStartServer(); + + /* + * Catch hangup and child signals and ignore broken pipes... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGCHLD, sigchld_handler); + sigset(SIGHUP, sighup_handler); + sigset(SIGPIPE, SIG_IGN); + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGTERM); + sigaddset(&action.sa_mask, SIGCHLD); + action.sa_handler = sigchld_handler; + sigaction(SIGCHLD, &action, NULL); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGHUP); + action.sa_handler = sighup_handler; + sigaction(SIGHUP, &action, NULL); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_IGN; + sigaction(SIGPIPE, &action, NULL); + + sigemptyset(&action.sa_mask); + sigaddset(&action.sa_mask, SIGTERM); + sigaddset(&action.sa_mask, SIGCHLD); + action.sa_handler = sigterm_handler; + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGCLD, sigchld_handler); /* No, SIGCLD isn't a typo... */ + signal(SIGHUP, sighup_handler); + signal(SIGPIPE, SIG_IGN); + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ + +#ifdef __sgi + /* + * Try to create a fake lpsched lock file if one is not already there. + * Some Adobe applications need it under IRIX in order to enable + * printing... + */ + + if ((fp = cupsFileOpen("/var/spool/lp/SCHEDLOCK", "w")) == NULL) + { + syslog(LOG_LPR, "Unable to create fake lpsched lock file " + "\"/var/spool/lp/SCHEDLOCK\"\' - %s!", + strerror(errno)); + } + else + { + fchmod(cupsFileNumber(fp), 0644); + fchown(cupsFileNumber(fp), User, Group); + + cupsFileClose(fp); + } +#endif /* __sgi */ + + if (write_pid() == 0) { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write pid file"); + return (1); + } + + /* + * Initialize authentication certificates... + */ + + cupsdInitCerts(); + + /* + * If we are running in the background, signal the parent process that + * we are up and running... + */ + + if (!fg || run_as_child) + { + /* + * Send a signal to the parent process, but only if the parent is + * not PID 1 (init). This avoids accidentally shutting down the + * system on OpenBSD if you CTRL-C the server before it is up... + */ + + i = getppid(); /* Save parent PID to avoid race condition */ + + if (i != 1) + kill(i, SIGUSR1); + } + +#ifdef __APPLE__ + /* + * Start power management framework... + */ + + if (use_sysman) + cupsdStartSystemMonitor(); +#endif /* __APPLE__ */ + + /* + * Send server-started event... + */ + +#ifdef HAVE_LAUNCHD + if (Launchd) + cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, + "Scheduler started via launchd."); + else +#endif /* HAVE_LAUNCHD */ + if (fg) + cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, + "Scheduler started in foreground."); + else + cupsdAddEvent(CUPSD_EVENT_SERVER_STARTED, NULL, NULL, + "Scheduler started in background."); + + /* + * Start any pending print jobs... + */ + + cupsdCheckJobs(); + + /* + * Loop forever... + */ + + current_time = time(NULL); +#ifdef HAVE_AVAHI + avahi_client_time = current_time; +#endif /* HAVE_AVAHI */ + browse_time = current_time; + event_time = current_time; + expire_time = current_time; + fds = 1; + report_time = 0; + senddoc_time = current_time; + + while (!stop_scheduler) + { + /* + * Check if there are dead children to handle... + */ + + if (dead_children) + process_children(); + + /* + * Check if we need to load the server configuration file... + */ + + if (NeedReload) + { + /* + * Close any idle clients... + */ + + if (cupsArrayCount(Clients) > 0) + { + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + if (con->http.state == HTTP_WAITING) + cupsdCloseClient(con); + else + con->http.keep_alive = HTTP_KEEPALIVE_OFF; + + cupsdPauseListening(); + } + + /* + * Restart if all clients are closed and all jobs finished, or + * if the reload timeout has elapsed... + */ + + if ((cupsArrayCount(Clients) == 0 && + (cupsArrayCount(PrintingJobs) == 0 || NeedReload != RELOAD_ALL)) || + (time(NULL) - ReloadTime) >= ReloadTimeout) + { + /* + * Shutdown the server... + */ + + DoingShutdown = 1; + + cupsdStopServer(); + + /* + * Read configuration... + */ + + if (!cupsdReadConfiguration()) + { + syslog(LOG_LPR, "Unable to read configuration file \'%s\' - exiting!", + ConfigurationFile); + break; + } + +#if HAVE_LAUNCHD + if (Launchd) + { + /* + * If we were started by launchd, get the listen socket file + * descriptors... + */ + + launchd_checkin(); + launchd_checkout(); + } +#endif /* HAVE_LAUNCHD */ + + /* + * Startup the server... + */ + + DoingShutdown = 0; + + cupsdStartServer(); + + /* + * Send a server-restarted event... + */ + + cupsdAddEvent(CUPSD_EVENT_SERVER_RESTARTED, NULL, NULL, + "Scheduler restarted."); + } + } + + /* + * Check for available input or ready output. If cupsdDoSelect() + * returns 0 or -1, something bad happened and we should exit + * immediately. + * + * Note that we at least have one listening socket open at all + * times. + */ + + if ((timeout = select_timeout(fds)) > 1 && LastEvent) + timeout = 1; + +#if HAVE_LAUNCHD + /* + * If no other work is scheduled and we're being controlled by + * launchd then timeout after 'LaunchdTimeout' seconds of + * inactivity... + */ + + if (timeout == 86400 && Launchd && LaunchdTimeout && !NumPolled && + !cupsArrayCount(ActiveJobs) && + (!Browsing || + (!BrowseRemoteProtocols && + (!BrowseLocalProtocols || !cupsArrayCount(Printers))))) + { + timeout = LaunchdTimeout; + launchd_idle_exit = 1; + } + else + launchd_idle_exit = 0; +#endif /* HAVE_LAUNCHD */ + + if ((fds = cupsdDoSelect(timeout)) < 0) + { + /* + * Got an error from select! + */ + +#ifdef HAVE_DNSSD + cupsd_printer_t *p; /* Current printer */ +#endif /* HAVE_DNSSD */ + + + if (errno == EINTR) /* Just interrupted by a signal */ + continue; + + /* + * Log all sorts of debug info to help track down the problem. + */ + + cupsdLogMessage(CUPSD_LOG_EMERG, "cupsdDoSelect() failed - %s!", + strerror(errno)); + + for (i = 0, con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + i ++, con = (cupsd_client_t *)cupsArrayNext(Clients)) + cupsdLogMessage(CUPSD_LOG_EMERG, + "Clients[%d] = %d, file = %d, state = %d", + i, con->http.fd, con->file, con->http.state); + + for (i = 0, lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + i ++, lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + cupsdLogMessage(CUPSD_LOG_EMERG, "Listeners[%d] = %d", i, lis->fd); + + cupsdLogMessage(CUPSD_LOG_EMERG, "BrowseSocket = %d", BrowseSocket); + + cupsdLogMessage(CUPSD_LOG_EMERG, "CGIPipes[0] = %d", CGIPipes[0]); + +#ifdef __APPLE__ + cupsdLogMessage(CUPSD_LOG_EMERG, "SysEventPipes[0] = %d", + SysEventPipes[0]); +#endif /* __APPLE__ */ + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + cupsdLogMessage(CUPSD_LOG_EMERG, "Jobs[%d] = %d < [%d %d] > [%d %d]", + job->id, + job->status_buffer ? job->status_buffer->fd : -1, + job->print_pipes[0], job->print_pipes[1], + job->back_pipes[0], job->back_pipes[1]); + +#ifdef HAVE_DNSSD + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + cupsdLogMessage(CUPSD_LOG_EMERG, "printer[%s] reg_name=\"%s\"", p->name, + p->reg_name ? p->reg_name : "(null)"); +#endif /* HAVE_DNSSD */ + + break; + } + + current_time = time(NULL); + + /* + * Write dirty config/state files... + */ + + if (DirtyCleanTime && current_time >= DirtyCleanTime) + cupsdCleanDirty(); + +#ifdef __APPLE__ + /* + * If we are going to sleep and still have pending jobs, stop them after + * a period of time... + */ + + if (SleepJobs > 0 && current_time >= SleepJobs && + cupsArrayCount(PrintingJobs) > 0) + { + SleepJobs = 0; + cupsdStopAllJobs(CUPSD_JOB_DEFAULT, 5); + } +#endif /* __APPLE__ */ + +#ifdef HAVE_AVAHI + /* + * If a timed callback is due, run it. + */ + + tmo = cupsdNextTimeout (&tmo_delay); + if (tmo && tmo_delay == 0) + cupsdRunTimeout (tmo); + + /* + * Try to restart the Avahi client every 10 seconds if needed... + */ + + if ((current_time - avahi_client_time) >= 10) + { + avahi_client_time = current_time; + cupsdStartAvahiClient(); + } +#endif /* HAVE_AVAHI */ + +#ifndef __APPLE__ + /* + * Update the network interfaces once a minute... + */ + + if ((current_time - netif_time) >= 60) + { + netif_time = current_time; + NetIFUpdate = 1; + } +#endif /* !__APPLE__ */ + +#if HAVE_LAUNCHD + /* + * If no other work was scheduled and we're being controlled by launchd + * then timeout after 'LaunchdTimeout' seconds of inactivity... + */ + + if (!fds && launchd_idle_exit) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "Printer sharing is off and there are no jobs pending, " + "will restart on demand."); + stop_scheduler = 1; + break; + } +#endif /* HAVE_LAUNCHD */ + + /* + * Resume listening for new connections as needed... + */ + + if (ListeningPaused && ListeningPaused <= current_time && + cupsArrayCount(Clients) < MaxClients) + cupsdResumeListening(); + + /* + * Expire subscriptions and unload completed jobs as needed... + */ + + if (current_time > expire_time) + { + if (cupsArrayCount(Subscriptions) > 0) + cupsdExpireSubscriptions(NULL, NULL); + + cupsdUnloadCompletedJobs(); + + expire_time = current_time; + } + + /* + * Update the browse list as needed... + */ + + if (Browsing) + { +#ifdef HAVE_LIBSLP + if ((BrowseRemoteProtocols & BROWSE_SLP) && + BrowseSLPRefresh <= current_time) + cupsdUpdateSLPBrowse(); +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if ((BrowseRemoteProtocols & BROWSE_LDAP) && + BrowseLDAPRefresh <= current_time) + cupsdUpdateLDAPBrowse(); +#endif /* HAVE_LDAP */ + } + + if (Browsing && current_time > browse_time) + { + cupsdSendBrowseList(); + browse_time = current_time; + } + +#ifndef HAVE_AUTHORIZATION_H + /* + * Update the root certificate once every 5 minutes if we have client + * connections... + */ + + if ((current_time - RootCertTime) >= RootCertDuration && RootCertDuration && + !RunUser && cupsArrayCount(Clients)) + { + /* + * Update the root certificate... + */ + + cupsdDeleteCert(0); + cupsdAddCert(0, "root", NULL); + } +#endif /* !HAVE_AUTHORIZATION_H */ + + /* + * Check for new data on the client sockets... + */ + + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + { + /* + * Process pending data in the input buffer... + */ + + if (con->http.used) + { + cupsdReadClient(con); + continue; + } + + /* + * Check the activity and close old clients... + */ + + activity = current_time - Timeout; + if (con->http.activity < activity && !con->pipe_pid) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Closing client %d after %d seconds of inactivity...", + con->http.fd, Timeout); + + cupsdCloseClient(con); + continue; + } + } + + /* + * Update any pending multi-file documents... + */ + + if ((current_time - senddoc_time) >= 10) + { + cupsdCheckJobs(); + cupsdCleanJobs(); + senddoc_time = current_time; + } + + /* + * Log statistics at most once a minute when in debug mode... + */ + + if ((current_time - report_time) >= 60 && LogLevel >= CUPSD_LOG_DEBUG) + { + size_t string_count, /* String count */ + alloc_bytes, /* Allocated string bytes */ + total_bytes; /* Total string bytes */ +#ifdef HAVE_MALLINFO + struct mallinfo mem; /* Malloc information */ + + + mem = mallinfo(); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-arena=%lu", mem.arena); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-used=%lu", + mem.usmblks + mem.uordblks); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: malloc-free=%lu", + mem.fsmblks + mem.fordblks); +#endif /* HAVE_MALLINFO */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: clients=%d", + cupsArrayCount(Clients)); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: jobs=%d", + cupsArrayCount(Jobs)); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: jobs-active=%d", + cupsArrayCount(ActiveJobs)); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: printers=%d", + cupsArrayCount(Printers)); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Report: printers-implicit=%d", + cupsArrayCount(ImplicitPrinters)); + + string_count = _cupsStrStatistics(&alloc_bytes, &total_bytes); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Report: stringpool-string-count=" CUPS_LLFMT, + CUPS_LLCAST string_count); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Report: stringpool-alloc-bytes=" CUPS_LLFMT, + CUPS_LLCAST alloc_bytes); + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Report: stringpool-total-bytes=" CUPS_LLFMT, + CUPS_LLCAST total_bytes); + + report_time = current_time; + } + + /* + * Handle OS-specific event notification for any events that have + * accumulated. Don't send these more than once a second... + */ + + if (LastEvent && (current_time - event_time) >= 1) + { +#ifdef HAVE_NOTIFY_POST + if (LastEvent & (CUPSD_EVENT_PRINTER_ADDED | + CUPSD_EVENT_PRINTER_DELETED | + CUPSD_EVENT_PRINTER_MODIFIED)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "notify_post(\"com.apple.printerListChange\")"); + notify_post("com.apple.printerListChange"); + } + + if (LastEvent & CUPSD_EVENT_PRINTER_STATE_CHANGED) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "notify_post(\"com.apple.printerHistoryChange\")"); + notify_post("com.apple.printerHistoryChange"); + } + + if (LastEvent & (CUPSD_EVENT_JOB_STATE_CHANGED | + CUPSD_EVENT_JOB_CONFIG_CHANGED | + CUPSD_EVENT_JOB_PROGRESS)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "notify_post(\"com.apple.jobChange\")"); + notify_post("com.apple.jobChange"); + } +#endif /* HAVE_NOTIFY_POST */ + + /* + * Reset the accumulated events... + */ + + LastEvent = CUPSD_EVENT_NONE; + event_time = current_time; + } + } + + /* + * Log a message based on what happened... + */ + + if (stop_scheduler) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Scheduler shutting down normally."); + cupsdAddEvent(CUPSD_EVENT_SERVER_STOPPED, NULL, NULL, + "Scheduler shutting down normally."); + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Scheduler shutting down due to program error."); + cupsdAddEvent(CUPSD_EVENT_SERVER_STOPPED, NULL, NULL, + "Scheduler shutting down due to program error."); + } + + /* + * Close all network clients... + */ + + DoingShutdown = 1; + + cupsdStopServer(); + +#ifdef HAVE_LAUNCHD + /* + * Update the launchd KeepAlive file as needed... + */ + + if (Launchd) + launchd_checkout(); +#endif /* HAVE_LAUNCHD */ + + /* + * Stop all jobs... + */ + + cupsdFreeAllJobs(); + +#ifdef __APPLE__ + /* + * Stop monitoring system event monitoring... + */ + + if (use_sysman) + cupsdStopSystemMonitor(); +#endif /* __APPLE__ */ + +#ifdef HAVE_GSSAPI + /* + * Free the scheduler's Kerberos context... + */ + +# ifdef __APPLE__ + /* + * If the weak-linked GSSAPI/Kerberos library is not present, don't try + * to use it... + */ + + if (krb5_init_context != NULL) +# endif /* __APPLE__ */ + if (KerberosContext) + krb5_free_context(KerberosContext); +#endif /* HAVE_GSSAPI */ + +#ifdef __sgi + /* + * Remove the fake IRIX lpsched lock file, but only if the existing + * file is not a FIFO which indicates that the real IRIX lpsched is + * running... + */ + + if (!stat("/var/spool/lp/FIFO", &statbuf)) + if (!S_ISFIFO(statbuf.st_mode)) + unlink("/var/spool/lp/SCHEDLOCK"); +#endif /* __sgi */ + + cupsdStopSelect(); + + remove_pid(); + + return (!stop_scheduler); +} + + +/* 'write_pid()' - Write PID file. + 'remove_pid()' - Delete PID file. +*/ +int +write_pid() +{ + FILE *f; + int fd; + int pid; + if (((fd = open(PidFile, O_RDWR|O_CREAT, 0644)) == -1) + || ((f = fdopen(fd, "r+")) == NULL) ) { + return 0; + } + pid = getpid(); + if (!fprintf(f, "%d\n", pid)) { + close(fd); + return 0; + } + fflush(f); + close(fd); + + return pid; +} + +int +remove_pid() { + return unlink(PidFile); +} + +/* + * 'cupsdAddString()' - Copy and add a string to an array. + */ + +int /* O - 1 on success, 0 on failure */ +cupsdAddString(cups_array_t **a, /* IO - String array */ + const char *s) /* I - String to copy and add */ +{ + if (!*a) + *a = cupsArrayNew3((cups_array_func_t)strcmp, NULL, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)_cupsStrAlloc, + (cups_afree_func_t)_cupsStrFree); + + return (cupsArrayAdd(*a, (char *)s)); +} + + +/* + * 'cupsdCheckProcess()' - Tell the main loop to check for dead children. + */ + +void +cupsdCheckProcess(void) +{ + /* + * Flag that we have dead children... + */ + + dead_children = 1; +} + + +/* + * 'cupsdClearString()' - Clear a string. + */ + +void +cupsdClearString(char **s) /* O - String value */ +{ + if (s && *s) + { + _cupsStrFree(*s); + *s = NULL; + } +} + + +/* + * 'cupsdFreeStrings()' - Free an array of strings. + */ + +void +cupsdFreeStrings(cups_array_t **a) /* IO - String array */ +{ + if (*a) + { + cupsArrayDelete(*a); + *a = NULL; + } +} + + +/* + * 'cupsdHoldSignals()' - Hold child and termination signals. + */ + +void +cupsdHoldSignals(void) +{ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + sigset_t newmask; /* New POSIX signal mask */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + holdcount ++; + if (holdcount > 1) + return; + +#ifdef HAVE_SIGSET + sighold(SIGTERM); + sighold(SIGCHLD); +#elif defined(HAVE_SIGACTION) + sigemptyset(&newmask); + sigaddset(&newmask, SIGTERM); + sigaddset(&newmask, SIGCHLD); + sigprocmask(SIG_BLOCK, &newmask, &holdmask); +#endif /* HAVE_SIGSET */ +} + + +/* + * 'cupsdReleaseSignals()' - Release signals for delivery. + */ + +void +cupsdReleaseSignals(void) +{ + holdcount --; + if (holdcount > 0) + return; + +#ifdef HAVE_SIGSET + sigrelse(SIGTERM); + sigrelse(SIGCHLD); +#elif defined(HAVE_SIGACTION) + sigprocmask(SIG_SETMASK, &holdmask, NULL); +#endif /* HAVE_SIGSET */ +} + + +/* + * 'cupsdSetString()' - Set a string value. + */ + +void +cupsdSetString(char **s, /* O - New string */ + const char *v) /* I - String value */ +{ + if (!s || *s == v) + return; + + if (*s) + _cupsStrFree(*s); + + if (v) + *s = _cupsStrAlloc(v); + else + *s = NULL; +} + + +/* + * 'cupsdSetStringf()' - Set a formatted string value. + */ + +void +cupsdSetStringf(char **s, /* O - New string */ + const char *f, /* I - Printf-style format string */ + ...) /* I - Additional args as needed */ +{ + char v[4096]; /* Formatting string value */ + va_list ap; /* Argument pointer */ + char *olds; /* Old string */ + + + if (!s) + return; + + olds = *s; + + if (f) + { + va_start(ap, f); + vsnprintf(v, sizeof(v), f, ap); + va_end(ap); + + *s = _cupsStrAlloc(v); + } + else + *s = NULL; + + if (olds) + _cupsStrFree(olds); +} + + +#ifdef HAVE_LAUNCHD +/* + * 'launchd_checkin()' - Check-in with launchd and collect the listening fds. + */ + +static void +launchd_checkin(void) +{ + size_t i, /* Looping var */ + count; /* Number of listeners */ + launch_data_t ld_msg, /* Launch data message */ + ld_resp, /* Launch data response */ + ld_array, /* Launch data array */ + ld_sockets, /* Launch data sockets dictionary */ + tmp; /* Launch data */ + cupsd_listener_t *lis; /* Listeners array */ + http_addr_t addr; /* Address variable */ + socklen_t addrlen; /* Length of address */ + int fd; /* File descriptor */ + char s[256]; /* String addresss */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, "launchd_checkin: pid=%d", (int)getpid()); + + /* + * Check-in with launchd... + */ + + ld_msg = launch_data_new_string(LAUNCH_KEY_CHECKIN); + if ((ld_resp = launch_msg(ld_msg)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "launchd_checkin: launch_msg(\"" LAUNCH_KEY_CHECKIN + "\") IPC failure"); + exit(EXIT_FAILURE); + return; /* anti-compiler-warning */ + } + + if (launch_data_get_type(ld_resp) == LAUNCH_DATA_ERRNO) + { + errno = launch_data_get_errno(ld_resp); + cupsdLogMessage(CUPSD_LOG_ERROR, "launchd_checkin: Check-in failed: %s", + strerror(errno)); + exit(EXIT_FAILURE); + return; /* anti-compiler-warning */ + } + + /* + * Get the sockets dictionary... + */ + + if ((ld_sockets = launch_data_dict_lookup(ld_resp, LAUNCH_JOBKEY_SOCKETS)) + == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "launchd_checkin: No sockets found to answer requests on!"); + exit(EXIT_FAILURE); + return; /* anti-compiler-warning */ + } + + /* + * Get the array of listener sockets... + */ + + if ((ld_array = launch_data_dict_lookup(ld_sockets, "Listeners")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "launchd_checkin: No sockets found to answer requests on!"); + exit(EXIT_FAILURE); + return; /* anti-compiler-warning */ + } + + /* + * Add listening fd(s) to the Listener array... + */ + + if (launch_data_get_type(ld_array) == LAUNCH_DATA_ARRAY) + { + count = launch_data_array_get_count(ld_array); + + for (i = 0; i < count; i ++) + { + /* + * Get the launchd file descriptor and address... + */ + + if ((tmp = launch_data_array_get_index(ld_array, i)) != NULL) + { + fd = launch_data_get_fd(tmp); + addrlen = sizeof(addr); + + if (getsockname(fd, (struct sockaddr *)&addr, &addrlen)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "launchd_checkin: Unable to get local address - %s", + strerror(errno)); + continue; + } + + /* + * Try to match the launchd socket address to one of the listeners... + */ + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + if (httpAddrEqual(&lis->address, &addr)) + break; + + /* + * Add a new listener If there's no match... + */ + + if (lis) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "launchd_checkin: Matched existing listener %s with fd %d...", + httpAddrString(&(lis->address), s, sizeof(s)), fd); + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "launchd_checkin: Adding new listener %s with fd %d...", + httpAddrString(&addr, s, sizeof(s)), fd); + + if ((lis = calloc(1, sizeof(cupsd_listener_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "launchd_checkin: Unable to allocate listener - " + "%s.", strerror(errno)); + exit(EXIT_FAILURE); + } + + cupsArrayAdd(Listeners, lis); + + memcpy(&lis->address, &addr, sizeof(lis->address)); + } + + lis->fd = fd; + +# ifdef HAVE_SSL + if (_httpAddrPort(&(lis->address)) == 443) + lis->encryption = HTTP_ENCRYPT_ALWAYS; +# endif /* HAVE_SSL */ + } + } + } + + launch_data_free(ld_msg); + launch_data_free(ld_resp); +} + + +/* + * 'launchd_checkout()' - Update the launchd KeepAlive file as needed. + */ + +static void +launchd_checkout(void) +{ + int fd; /* File descriptor */ + + + /* + * Create or remove the launchd KeepAlive file based on whether + * there are active jobs, polling, browsing for remote printers or + * shared printers to advertise... + */ + + if (cupsArrayCount(ActiveJobs) || NumPolled || + (Browsing && + (BrowseRemoteProtocols || + (BrowseLocalProtocols && cupsArrayCount(Printers))))) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Creating launchd keepalive file \"" CUPS_KEEPALIVE + "\"..."); + + if ((fd = open(CUPS_KEEPALIVE, O_RDONLY | O_CREAT | O_EXCL, S_IRUSR)) >= 0) + close(fd); + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Removing launchd keepalive file \"" CUPS_KEEPALIVE + "\"..."); + + unlink(CUPS_KEEPALIVE); + } +} +#endif /* HAVE_LAUNCHD */ + + +/* + * 'parent_handler()' - Catch USR1/CHLD signals... + */ + +static void +parent_handler(int sig) /* I - Signal */ +{ + /* + * Store the signal we got from the OS and return... + */ + + parent_signal = sig; +} + + +/* + * 'process_children()' - Process all dead children... + */ + +static void +process_children(void) +{ + int status; /* Exit status of child */ + int pid, /* Process ID of child */ + job_id; /* Job ID of child */ + cupsd_job_t *job; /* Current job */ + int i; /* Looping var */ + char name[1024]; /* Process name */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "process_children()"); + + /* + * Reset the dead_children flag... + */ + + dead_children = 0; + + /* + * Collect the exit status of some children... + */ + +#ifdef HAVE_WAITPID + while ((pid = waitpid(-1, &status, WNOHANG)) > 0) +#elif defined(HAVE_WAIT3) + while ((pid = wait3(&status, WNOHANG, NULL)) > 0) +#else + if ((pid = wait(&status)) > 0) +#endif /* HAVE_WAITPID */ + { + /* + * Collect the name of the process that finished... + */ + + cupsdFinishProcess(pid, name, sizeof(name), &job_id); + + /* + * Delete certificates for CGI processes... + */ + + if (pid) + cupsdDeleteCert(pid); + + /* + * Handle completed job filters... + */ + + if (job_id > 0 && (job = cupsdFindJob(job_id)) != NULL) + { + for (i = 0; job->filters[i]; i ++) + if (job->filters[i] == pid) + break; + + if (job->filters[i] || job->backend == pid) + { + /* + * OK, this process has gone away; what's left? + */ + + if (job->filters[i]) + job->filters[i] = -pid; + else + job->backend = -pid; + + if (status && status != SIGTERM && status != SIGKILL && + status != SIGPIPE && job->status >= 0) + { + /* + * An error occurred; save the exit status so we know to stop + * the printer or cancel the job when all of the filters finish... + * + * A negative status indicates that the backend failed and the + * printer needs to be stopped. + */ + + if (job->filters[i]) + job->status = status; /* Filter failed */ + else + job->status = -status; /* Backend failed */ + + if (job->state_value == IPP_JOB_PROCESSING && + job->status_level > CUPSD_LOG_ERROR) + { + char message[1024]; /* New printer-state-message */ + + + job->status_level = CUPSD_LOG_ERROR; + + snprintf(message, sizeof(message), "%s failed", name); + + if (job->printer) + { + strlcpy(job->printer->state_message, message, + sizeof(job->printer->state_message)); + } + + if (!job->attrs) + cupsdLoadJob(job); + + if (!job->printer_message && job->attrs) + { + if ((job->printer_message = + ippFindAttribute(job->attrs, "job-printer-state-message", + IPP_TAG_TEXT)) == NULL) + job->printer_message = ippAddString(job->attrs, IPP_TAG_JOB, + IPP_TAG_TEXT, + "job-printer-state-message", + NULL, NULL); + } + + if (job->printer_message) + cupsdSetString(&(job->printer_message->values[0].string.text), + message); + } + } + + /* + * If this is not the last file in a job, see if all of the + * filters are done, and if so move to the next file. + */ + + if (job->current_file < job->num_files && job->printer) + { + for (i = 0; job->filters[i] < 0; i ++); + + if (!job->filters[i] && + (!job->printer->pc || !job->printer->pc->single_file || + job->backend <= 0)) + { + /* + * Process the next file... + */ + + cupsdContinueJob(job); + } + } + else if (job->state_value >= IPP_JOB_CANCELED) + { + /* + * Remove the job from the active list if there are no processes still + * running for it... + */ + + for (i = 0; job->filters[i] < 0; i++); + + if (!job->filters[i] && job->backend <= 0) + cupsArrayRemove(ActiveJobs, job); + } + } + } + + /* + * Show the exit status as needed, ignoring SIGTERM and SIGKILL errors + * since they come when we kill/end a process... + */ + + if (status == SIGTERM || status == SIGKILL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "PID %d (%s) was terminated normally with signal %d.", + pid, name, status); + } + else if (status == SIGPIPE) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "PID %d (%s) did not catch or ignore signal %d.", + pid, name, status); + } + else if (status) + { + if (WIFEXITED(status)) + { + int code = WEXITSTATUS(status); /* Exit code */ + + if (code > 100) + cupsdLogMessage(CUPSD_LOG_DEBUG, + "PID %d (%s) stopped with status %d (%s)", pid, name, + code, strerror(code - 100)); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "PID %d (%s) stopped with status %d.", pid, name, + code); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "PID %d (%s) crashed on signal %d.", + pid, name, WTERMSIG(status)); + + if (LogLevel < CUPSD_LOG_DEBUG) + cupsdLogMessage(CUPSD_LOG_INFO, + "Hint: Try setting the LogLevel to \"debug\" to find " + "out more."); + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "PID %d (%s) exited with no errors.", + pid, name); + } + + /* + * If wait*() is interrupted by a signal, tell main() to call us again... + */ + + if (pid < 0 && errno == EINTR) + dead_children = 1; +} + + +/* + * 'select_timeout()' - Calculate the select timeout value. + * + */ + +static long /* O - Number of seconds */ +select_timeout(int fds) /* I - Number of descriptors returned */ +{ + long timeout; /* Timeout for select */ + time_t now; /* Current time */ + cupsd_client_t *con; /* Client information */ + cupsd_printer_t *p; /* Printer information */ + cupsd_job_t *job; /* Job information */ + cupsd_subscription_t *sub; /* Subscription information */ + const char *why; /* Debugging aid */ +#ifdef HAVE_AVAHI + cupsd_timeout_t *tmo; /* Timed callback */ + long tmo_delay; /* Seconds before calling it */ +#endif /* HAVE_AVAHI */ + + + /* + * Check to see if any of the clients have pending data to be + * processed; if so, the timeout should be 0... + */ + + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + if (con->http.used > 0) + return (0); + + /* + * If select has been active in the last second (fds > 0) or we have + * many resources in use then don't bother trying to optimize the + * timeout, just make it 1 second. + */ + + if (fds > 0 || cupsArrayCount(Clients) > 50) + return (1); + + /* + * Otherwise, check all of the possible events that we need to wake for... + */ + + now = time(NULL); + timeout = now + 86400; /* 86400 == 1 day */ + why = "do nothing"; + +#ifdef __APPLE__ + /* + * When going to sleep, wake up to cancel jobs that don't complete in time. + */ + + if (SleepJobs > 0 && SleepJobs < timeout) + { + timeout = SleepJobs; + why = "cancel jobs before sleeping"; + } +#endif /* __APPLE__ */ + +#ifdef HAVE_AVAHI + /* + * See if there are any scheduled timed callbacks to run. + */ + + tmo = cupsdNextTimeout (&tmo_delay); + if (tmo) + { + timeout = tmo_delay; + why = "run a timed callback"; + } +#endif /* HAVE_AVAHI */ + + /* + * Check whether we are accepting new connections... + */ + + if (ListeningPaused > 0 && cupsArrayCount(Clients) < MaxClients && + ListeningPaused < timeout) + { + if (ListeningPaused <= now) + timeout = now; + else + timeout = ListeningPaused; + + why = "resume listening"; + } + + /* + * Check the activity and close old clients... + */ + + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); + con; + con = (cupsd_client_t *)cupsArrayNext(Clients)) + if ((con->http.activity + Timeout) < timeout) + { + timeout = con->http.activity + Timeout; + why = "timeout a client connection"; + } + + /* + * Update the browse list as needed... + */ + + if (Browsing && BrowseLocalProtocols) + { +#ifdef HAVE_LIBSLP + if ((BrowseLocalProtocols & BROWSE_SLP) && (BrowseSLPRefresh < timeout)) + { + timeout = BrowseSLPRefresh; + why = "update SLP browsing"; + } +#endif /* HAVE_LIBSLP */ + +#ifdef HAVE_LDAP + if ((BrowseLocalProtocols & BROWSE_LDAP) && (BrowseLDAPRefresh < timeout)) + { + timeout = BrowseLDAPRefresh; + why = "update LDAP browsing"; + } +#endif /* HAVE_LDAP */ + + if ((BrowseLocalProtocols & BROWSE_CUPS) && NumBrowsers) + { + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + if (p->type & CUPS_PRINTER_REMOTE) + { + if ((p->browse_time + BrowseTimeout) < timeout) + { + timeout = p->browse_time + BrowseTimeout; + why = "browse timeout a printer"; + } + } + else if (p->shared && !(p->type & CUPS_PRINTER_IMPLICIT)) + { + if (BrowseInterval && (p->browse_time + BrowseInterval) < timeout) + { + timeout = p->browse_time + BrowseInterval; + why = "send browse update"; + } + } + } + } + } + + /* + * Write out changes to configuration and state files... + */ + + if (DirtyCleanTime && timeout > DirtyCleanTime) + { + timeout = DirtyCleanTime; + why = "write dirty config/state files"; + } + + /* + * Check for any active jobs... + */ + + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + { + if (job->kill_time && job->kill_time < timeout) + { + timeout = job->kill_time; + why = "kill unresponsive jobs"; + } + + if (job->state_value == IPP_JOB_HELD && job->hold_until < timeout) + { + timeout = job->hold_until; + why = "release held jobs"; + } + else if (job->state_value == IPP_JOB_PENDING && timeout > (now + 10)) + { + timeout = now + 10; + why = "start pending jobs"; + break; + } + } + +#ifdef HAVE_MALLINFO + /* + * Log memory usage every minute... + */ + + if (LogLevel >= CUPSD_LOG_DEBUG && (mallinfo_time + 60) < timeout) + { + timeout = mallinfo_time + 60; + why = "display memory usage"; + } +#endif /* HAVE_MALLINFO */ + + /* + * Expire subscriptions as needed... + */ + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (!sub->job && sub->expire && sub->expire < timeout) + { + timeout = sub->expire; + why = "expire subscription"; + } + + /* + * Adjust from absolute to relative time. If p->browse_time above + * was 0 then we can end up with a negative value here, so check. + * We add 1 second to the timeout since events occur after the + * timeout expires, and limit the timeout to 86400 seconds (1 day) + * to avoid select() timeout limits present on some operating + * systems... + */ + + timeout = timeout - now + 1; + + if (timeout < 1) + timeout = 1; + else if (timeout > 86400) + timeout = 86400; + + /* + * Log and return the timeout value... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "select_timeout(%d): %ld seconds to %s", + fds, timeout, why); + + return (timeout); +} + + +/* + * 'sigchld_handler()' - Handle 'child' signals from old processes. + */ + +static void +sigchld_handler(int sig) /* I - Signal number */ +{ + (void)sig; + + /* + * Flag that we have dead children... + */ + + dead_children = 1; + + /* + * Reset the signal handler as needed... + */ + +#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION) + signal(SIGCLD, sigchld_handler); +#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ +} + + +/* + * 'sighup_handler()' - Handle 'hangup' signals to reconfigure the scheduler. + */ + +static void +sighup_handler(int sig) /* I - Signal number */ +{ + (void)sig; + + NeedReload = RELOAD_ALL; + ReloadTime = time(NULL); + +#if !defined(HAVE_SIGSET) && !defined(HAVE_SIGACTION) + signal(SIGHUP, sighup_handler); +#endif /* !HAVE_SIGSET && !HAVE_SIGACTION */ +} + + +/* + * 'sigterm_handler()' - Handle 'terminate' signals that stop the scheduler. + */ + +static void +sigterm_handler(int sig) /* I - Signal number */ +{ + (void)sig; /* remove compiler warnings... */ + + /* + * Flag that we should stop and return... + */ + + stop_scheduler = 1; +} + + +/* + * 'usage()' - Show scheduler usage. + */ + +static void +usage(int status) /* O - Exit status */ +{ + FILE *fp = status ? stderr : stdout; /* Output file */ + + + _cupsLangPuts(fp, _("Usage: cupsd [options]")); + _cupsLangPuts(fp, _("Options:")); + _cupsLangPuts(fp, _(" -c config-file Load alternate configuration " + "file.")); + _cupsLangPuts(fp, _(" -f Run in the foreground.")); + _cupsLangPuts(fp, _(" -F Run in the foreground but " + "detach from console.")); + _cupsLangPuts(fp, _(" -h Show this usage message.")); + _cupsLangPuts(fp, _(" -l Run cupsd from launchd(8).")); + _cupsLangPuts(fp, _(" -t Test the configuration " + "file.")); + + exit(status); +} + + +/* + * End of "$Id: main.c 9783 2011-05-18 20:44:16Z mike $". + */ diff --git a/scheduler/mime-private.h b/scheduler/mime-private.h new file mode 100644 index 0000000..5891253 --- /dev/null +++ b/scheduler/mime-private.h @@ -0,0 +1,48 @@ +/* + * "$Id: mime-private.h 9750 2011-05-06 22:53:53Z mike $" + * + * Private MIME type/conversion database definitions for CUPS. + * + * Copyright 2011 by Apple Inc. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_MIME_PRIVATE_H_ +# define _CUPS_MIME_PRIVATE_H_ + +# include "mime.h" + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Prototypes... + */ + +extern void _mimeError(mime_t *mime, const char *format, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 2, 3))) +#endif /* __GNUC__ */ +; + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_MIME_PRIVATE_H_ */ + +/* + * End of "$Id: mime-private.h 9750 2011-05-06 22:53:53Z mike $". + */ diff --git a/scheduler/mime.c b/scheduler/mime.c new file mode 100644 index 0000000..fd7c12a --- /dev/null +++ b/scheduler/mime.c @@ -0,0 +1,960 @@ +/* + * "$Id: mime.c 9750 2011-05-06 22:53:53Z mike $" + * + * MIME database file routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * mimeDelete() - Delete (free) a MIME database. + * mimeDeleteFilter() - Delete a filter from the MIME database. + * mimeDeleteType() - Delete a type from the MIME database. + * _mimeError() - Show an error message. + * mimeFirstFilter() - Get the first filter in the MIME database. + * mimeFirstType() - Get the first type in the MIME database. + * mimeLoad() - Create a new MIME database from disk. + * mimeLoadFilters() - Load filter definitions from disk. + * mimeLoadTypes() - Load type definitions from disk. + * mimeNew() - Create a new, empty MIME database. + * mimeNextFilter() - Get the next filter in the MIME database. + * mimeNextType() - Get the next type in the MIME database. + * mimeNumFilters() - Get the number of filters in a MIME database. + * mimeNumTypes() - Get the number of types in a MIME database. + * mimeSetErrorCallback() - Set the callback for error messages. + * mime_add_fcache() - Add a filter to the filter cache. + * mime_compare_fcache() - Compare two filter cache entries. + * mime_delete_fcache() - Free all memory used by the filter cache. + * mime_delete_rules() - Free all memory for the given rule tree. + * mime_load_convs() - Load a xyz.convs file. + * mime_load_types() - Load a xyz.types file. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include "mime-private.h" + + +/* + * Local types... + */ + +typedef struct _mime_fcache_s /**** Filter cache structure ****/ +{ + char *name, /* Filter name */ + *path; /* Full path to filter if available */ +} _mime_fcache_t; + + +/* + * Local functions... + */ + +static const char *mime_add_fcache(cups_array_t *filtercache, const char *name, + const char *filterpath); +static int mime_compare_fcache(_mime_fcache_t *a, _mime_fcache_t *b); +static void mime_delete_fcache(cups_array_t *filtercache); +static void mime_delete_rules(mime_magic_t *rules); +static void mime_load_convs(mime_t *mime, const char *filename, + const char *filterpath, + cups_array_t *filtercache); +static void mime_load_types(mime_t *mime, const char *filename); + + +/* + * 'mimeDelete()' - Delete (free) a MIME database. + */ + +void +mimeDelete(mime_t *mime) /* I - MIME database */ +{ + mime_type_t *type; /* Current type */ + mime_filter_t *filter; /* Current filter */ + + + DEBUG_printf(("mimeDelete(mime=%p)", mime)); + + if (!mime) + return; + + /* + * Loop through filters and free them... + */ + + for (filter = (mime_filter_t *)cupsArrayFirst(mime->filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(mime->filters)) + mimeDeleteFilter(mime, filter); + + /* + * Loop through the file types and delete any rules... + */ + + for (type = (mime_type_t *)cupsArrayFirst(mime->types); + type; + type = (mime_type_t *)cupsArrayNext(mime->types)) + mimeDeleteType(mime, type); + + /* + * Free the types and filters arrays, and then the MIME database structure. + */ + + cupsArrayDelete(mime->types); + cupsArrayDelete(mime->filters); + cupsArrayDelete(mime->srcs); + free(mime); +} + + +/* + * 'mimeDeleteFilter()' - Delete a filter from the MIME database. + */ + +void +mimeDeleteFilter(mime_t *mime, /* I - MIME database */ + mime_filter_t *filter) /* I - Filter */ +{ + DEBUG_printf(("mimeDeleteFilter(mime=%p, filter=%p(%s/%s->%s/%s, cost=%d, " + "maxsize=" CUPS_LLFMT "))", mime, filter, + filter ? filter->src->super : "???", + filter ? filter->src->type : "???", + filter ? filter->dst->super : "???", + filter ? filter->dst->super : "???", + filter ? filter->cost : -1, + filter ? CUPS_LLCAST filter->maxsize : CUPS_LLCAST -1)); + + if (!mime || !filter) + return; + +#ifdef DEBUG + if (!cupsArrayFind(mime->filters, filter)) + DEBUG_puts("1mimeDeleteFilter: Filter not in MIME database."); +#endif /* DEBUG */ + + cupsArrayRemove(mime->filters, filter); + free(filter); + + /* + * Deleting a filter invalidates the source lookup cache used by + * mimeFilter()... + */ + + if (mime->srcs) + { + DEBUG_puts("1mimeDeleteFilter: Deleting source lookup cache."); + cupsArrayDelete(mime->srcs); + mime->srcs = NULL; + } +} + + +/* + * 'mimeDeleteType()' - Delete a type from the MIME database. + */ + +void +mimeDeleteType(mime_t *mime, /* I - MIME database */ + mime_type_t *mt) /* I - Type */ +{ + DEBUG_printf(("mimeDeleteType(mime=%p, mt=%p(%s/%s))", mime, mt, + mt ? mt->super : "???", mt ? mt->type : "???")); + + if (!mime || !mt) + return; + +#ifdef DEBUG + if (!cupsArrayFind(mime->types, mt)) + DEBUG_puts("1mimeDeleteFilter: Type not in MIME database."); +#endif /* DEBUG */ + + cupsArrayRemove(mime->types, mt); + + mime_delete_rules(mt->rules); + free(mt); +} + + +/* + * '_mimeError()' - Show an error message. + */ + +void +_mimeError(mime_t *mime, /* I - MIME database */ + const char *message, /* I - Printf-style message string */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Argument pointer */ + char buffer[8192]; /* Message buffer */ + + + if (mime->error_cb) + { + va_start(ap, message); + vsnprintf(buffer, sizeof(buffer), message, ap); + va_end(ap); + + (*mime->error_cb)(mime->error_ctx, buffer); + } +} + + +/* + * 'mimeFirstFilter()' - Get the first filter in the MIME database. + */ + +mime_filter_t * /* O - Filter or NULL */ +mimeFirstFilter(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("6mimeFirstFilter(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("7mimeFirstFilter: Returning NULL."); + return (NULL); + } + else + { + mime_filter_t *first = (mime_filter_t *)cupsArrayFirst(mime->filters); + /* First filter */ + + DEBUG_printf(("7mimeFirstFilter: Returning %p.", first)); + return (first); + } +} + + +/* + * 'mimeFirstType()' - Get the first type in the MIME database. + */ + +mime_type_t * /* O - Type or NULL */ +mimeFirstType(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("6mimeFirstType(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("7mimeFirstType: Returning NULL."); + return (NULL); + } + else + { + mime_type_t *first = (mime_type_t *)cupsArrayFirst(mime->types); + /* First type */ + + DEBUG_printf(("7mimeFirstType: Returning %p.", first)); + return (first); + } +} + + +/* + * 'mimeLoad()' - Create a new MIME database from disk. + * + * This function uses @link mimeLoadFilters@ and @link mimeLoadTypes@ to + * create a MIME database from a single directory. + */ + +mime_t * /* O - New MIME database */ +mimeLoad(const char *pathname, /* I - Directory to load */ + const char *filterpath) /* I - Directory to load */ +{ + mime_t *mime; /* New MIME database */ + + DEBUG_printf(("mimeLoad(pathname=\"%s\", filterpath=\"%s\")", pathname, + filterpath)); + + mime = mimeLoadFilters(mimeLoadTypes(NULL, pathname), pathname, filterpath); + DEBUG_printf(("1mimeLoad: Returning %p.", mime)); + + return (mime); +} + + +/* + * 'mimeLoadFilters()' - Load filter definitions from disk. + * + * This function loads all of the .convs files from the specified directory. + * Use @link mimeLoadTypes@ to load all types before you load the filters. + */ + +mime_t * /* O - MIME database */ +mimeLoadFilters(mime_t *mime, /* I - MIME database */ + const char *pathname, /* I - Directory to load from */ + const char *filterpath) /* I - Default filter program directory */ +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024]; /* Full filename of .convs file */ + cups_array_t *filtercache; /* Filter cache */ + + + DEBUG_printf(("mimeLoadFilters(mime=%p, pathname=\"%s\", filterpath=\"%s\")", + mime, pathname, filterpath)); + + /* + * Range check input... + */ + + if (!mime || !pathname || !filterpath) + { + DEBUG_puts("1mimeLoadFilters: Bad arguments."); + return (mime); + } + + /* + * Then open the directory specified by pathname... + */ + + if ((dir = cupsDirOpen(pathname)) == NULL) + { + DEBUG_printf(("1mimeLoadFilters: Unable to open \"%s\": %s", pathname, + strerror(errno))); + _mimeError(mime, "Unable to open \"%s\": %s", pathname, strerror(errno)); + return (mime); + } + + /* + * Read all the .convs files... + */ + + filtercache = cupsArrayNew((cups_array_func_t)mime_compare_fcache, NULL); + + while ((dent = cupsDirRead(dir)) != NULL) + { + if (strlen(dent->filename) > 6 && + !strcmp(dent->filename + strlen(dent->filename) - 6, ".convs")) + { + /* + * Load a mime.convs file... + */ + + snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->filename); + DEBUG_printf(("1mimeLoadFilters: Loading \"%s\".", filename)); + mime_load_convs(mime, filename, filterpath, filtercache); + } + } + + mime_delete_fcache(filtercache); + + cupsDirClose(dir); + + return (mime); +} + + +/* + * 'mimeLoadTypes()' - Load type definitions from disk. + * + * This function loads all of the .types files from the specified directory. + * Use @link mimeLoadFilters@ to load all filters after you load the types. + */ + +mime_t * /* O - MIME database */ +mimeLoadTypes(mime_t *mime, /* I - MIME database or @code NULL@ to create a new one */ + const char *pathname) /* I - Directory to load from */ +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024]; /* Full filename of .types file */ + + + DEBUG_printf(("mimeLoadTypes(mime=%p, pathname=\"%s\")", mime, pathname)); + + /* + * First open the directory specified by pathname... + */ + + if ((dir = cupsDirOpen(pathname)) == NULL) + { + DEBUG_printf(("1mimeLoadTypes: Unable to open \"%s\": %s", pathname, + strerror(errno))); + DEBUG_printf(("1mimeLoadTypes: Returning %p.", mime)); + _mimeError(mime, "Unable to open \"%s\": %s", pathname, strerror(errno)); + return (mime); + } + + /* + * If "mime" is NULL, make a new, empty database... + */ + + if (!mime) + mime = mimeNew(); + + if (!mime) + { + cupsDirClose(dir); + DEBUG_puts("1mimeLoadTypes: Returning NULL."); + return (NULL); + } + + /* + * Read all the .types files... + */ + + while ((dent = cupsDirRead(dir)) != NULL) + { + if (strlen(dent->filename) > 6 && + !strcmp(dent->filename + strlen(dent->filename) - 6, ".types")) + { + /* + * Load a mime.types file... + */ + + snprintf(filename, sizeof(filename), "%s/%s", pathname, dent->filename); + DEBUG_printf(("1mimeLoadTypes: Loading \"%s\".", filename)); + mime_load_types(mime, filename); + } + } + + cupsDirClose(dir); + + DEBUG_printf(("1mimeLoadTypes: Returning %p.", mime)); + + return (mime); +} + + +/* + * 'mimeNew()' - Create a new, empty MIME database. + */ + +mime_t * /* O - MIME database */ +mimeNew(void) +{ + return ((mime_t *)calloc(1, sizeof(mime_t))); +} + + +/* + * 'mimeNextFilter()' - Get the next filter in the MIME database. + */ + +mime_filter_t * /* O - Filter or NULL */ +mimeNextFilter(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("6mimeNextFilter(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("7mimeNextFilter: Returning NULL."); + return (NULL); + } + else + { + mime_filter_t *next = (mime_filter_t *)cupsArrayNext(mime->filters); + /* Next filter */ + + DEBUG_printf(("7mimeNextFilter: Returning %p.", next)); + return (next); + } +} + + +/* + * 'mimeNextType()' - Get the next type in the MIME database. + */ + +mime_type_t * /* O - Type or NULL */ +mimeNextType(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("6mimeNextType(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("7mimeNextType: Returning NULL."); + return (NULL); + } + else + { + mime_type_t *next = (mime_type_t *)cupsArrayNext(mime->types); + /* Next type */ + + DEBUG_printf(("7mimeNextType: Returning %p.", next)); + return (next); + } +} + + +/* + * 'mimeNumFilters()' - Get the number of filters in a MIME database. + */ + +int +mimeNumFilters(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("mimeNumFilters(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("1mimeNumFilters: Returning 0."); + return (0); + } + else + { + DEBUG_printf(("1mimeNumFilters: Returning %d.", + cupsArrayCount(mime->filters))); + return (cupsArrayCount(mime->filters)); + } +} + + +/* + * 'mimeNumTypes()' - Get the number of types in a MIME database. + */ + +int +mimeNumTypes(mime_t *mime) /* I - MIME database */ +{ + DEBUG_printf(("mimeNumTypes(mime=%p)", mime)); + + if (!mime) + { + DEBUG_puts("1mimeNumTypes: Returning 0."); + return (0); + } + else + { + DEBUG_printf(("1mimeNumTypes: Returning %d.", + cupsArrayCount(mime->types))); + return (cupsArrayCount(mime->types)); + } +} + + +/* + * 'mimeSetErrorCallback()' - Set the callback for error messages. + */ + +void +mimeSetErrorCallback( + mime_t *mime, /* I - MIME database */ + mime_error_cb_t cb, /* I - Callback function */ + void *ctx) /* I - Context pointer for callback */ +{ + if (mime) + { + mime->error_cb = cb; + mime->error_ctx = ctx; + } +} + + +/* + * 'mime_add_fcache()' - Add a filter to the filter cache. + */ + +static const char * /* O - Full path to filter or NULL */ +mime_add_fcache( + cups_array_t *filtercache, /* I - Filter cache */ + const char *name, /* I - Filter name */ + const char *filterpath) /* I - Filter path */ +{ + _mime_fcache_t key, /* Search key */ + *temp; /* New filter cache */ + char path[1024]; /* Full path to filter */ + + + DEBUG_printf(("2mime_add_fcache(filtercache=%p, name=\"%s\", " + "filterpath=\"%s\")", filtercache, name, filterpath)); + + key.name = (char *)name; + if ((temp = (_mime_fcache_t *)cupsArrayFind(filtercache, &key)) != NULL) + { + DEBUG_printf(("3mime_add_fcache: Returning \"%s\".", temp->path)); + return (temp->path); + } + + if ((temp = calloc(1, sizeof(_mime_fcache_t))) == NULL) + { + DEBUG_puts("3mime_add_fcache: Returning NULL."); + return (NULL); + } + + temp->name = strdup(name); + + if (cupsFileFind(name, filterpath, 1, path, sizeof(path))) + temp->path = strdup(path); + + cupsArrayAdd(filtercache, temp); + + DEBUG_printf(("3mime_add_fcache: Returning \"%s\".", temp->path)); + return (temp->path); +} + + +/* + * 'mime_compare_fcache()' - Compare two filter cache entries. + */ + +static int /* O - Result of comparison */ +mime_compare_fcache(_mime_fcache_t *a, /* I - First entry */ + _mime_fcache_t *b) /* I - Second entry */ +{ + return (strcmp(a->name, b->name)); +} + + +/* + * 'mime_delete_fcache()' - Free all memory used by the filter cache. + */ + +static void +mime_delete_fcache( + cups_array_t *filtercache) /* I - Filter cache */ +{ + _mime_fcache_t *current; /* Current cache entry */ + + + DEBUG_printf(("2mime_delete_fcache(filtercache=%p)", filtercache)); + + for (current = (_mime_fcache_t *)cupsArrayFirst(filtercache); + current; + current = (_mime_fcache_t *)cupsArrayNext(filtercache)) + { + free(current->name); + + if (current->path) + free(current->path); + + free(current); + } + + cupsArrayDelete(filtercache); +} + + +/* + * 'mime_delete_rules()' - Free all memory for the given rule tree. + */ + +static void +mime_delete_rules(mime_magic_t *rules) /* I - Rules to free */ +{ + mime_magic_t *next; /* Next rule to free */ + + + DEBUG_printf(("2mime_delete_rules(rules=%p)", rules)); + + /* + * Free the rules list, descending recursively to free any child rules. + */ + + while (rules != NULL) + { + next = rules->next; + + if (rules->child != NULL) + mime_delete_rules(rules->child); + + free(rules); + rules = next; + } +} + + +/* + * 'mime_load_convs()' - Load a xyz.convs file. + */ + +static void +mime_load_convs( + mime_t *mime, /* I - MIME database */ + const char *filename, /* I - Convs file to load */ + const char *filterpath, /* I - Path for filters */ + cups_array_t *filtercache) /* I - Filter program cache */ +{ + cups_file_t *fp; /* Convs file */ + char line[1024], /* Input line from file */ + *lineptr, /* Current position in line */ + super[MIME_MAX_SUPER], /* Super-type name */ + type[MIME_MAX_TYPE], /* Type name */ + *temp, /* Temporary pointer */ + *filter; /* Filter program */ + mime_type_t *temptype, /* MIME type looping var */ + *dsttype; /* Destination MIME type */ + int cost; /* Cost of filter */ + + + DEBUG_printf(("2mime_load_convs(mime=%p, filename=\"%s\", filterpath=\"%s\", " + "filtercache=%p)", mime, filename, filterpath, filtercache)); + + /* + * First try to open the file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + DEBUG_printf(("3mime_load_convs: Unable to open \"%s\": %s", filename, + strerror(errno))); + _mimeError(mime, "Unable to open \"%s\": %s", filename, strerror(errno)); + return; + } + + /* + * Then read each line from the file, skipping any comments in the file... + */ + + while (cupsFileGets(fp, line, sizeof(line)) != NULL) + { + /* + * Skip blank lines and lines starting with a #... + */ + + if (!line[0] || line[0] == '#') + continue; + + /* + * Strip trailing whitespace... + */ + + for (lineptr = line + strlen(line) - 1; + lineptr >= line && isspace(*lineptr & 255); + lineptr --) + *lineptr = '\0'; + + /* + * Extract the destination super-type and type names from the middle of + * the line. + */ + + lineptr = line; + while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\0') + lineptr ++; + + while (*lineptr == ' ' || *lineptr == '\t') + lineptr ++; + + temp = super; + + while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' && + (temp - super + 1) < MIME_MAX_SUPER) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + if (*lineptr != '/') + continue; + + lineptr ++; + temp = type; + + while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' && + *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + if (*lineptr == '\0' || *lineptr == '\n') + continue; + + if ((dsttype = mimeType(mime, super, type)) == NULL) + { + DEBUG_printf(("3mime_load_convs: Destination type %s/%s not found.", + super, type)); + continue; + } + + /* + * Then get the cost and filter program... + */ + + while (*lineptr == ' ' || *lineptr == '\t') + lineptr ++; + + if (*lineptr < '0' || *lineptr > '9') + continue; + + cost = atoi(lineptr); + + while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\0') + lineptr ++; + while (*lineptr == ' ' || *lineptr == '\t') + lineptr ++; + + if (*lineptr == '\0' || *lineptr == '\n') + continue; + + filter = lineptr; + + if (strcmp(filter, "-")) + { + /* + * Verify that the filter exists and is executable... + */ + + if (!mime_add_fcache(filtercache, filter, filterpath)) + { + DEBUG_printf(("mime_load_convs: Filter %s not found in %s.", filter, + filterpath)); + _mimeError(mime, "Filter \"%s\" not found.", filter); + continue; + } + } + + /* + * Finally, get the source super-type and type names from the beginning of + * the line. We do it here so we can support wildcards... + */ + + lineptr = line; + temp = super; + + while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' && + (temp - super + 1) < MIME_MAX_SUPER) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + if (*lineptr != '/') + continue; + + lineptr ++; + temp = type; + + while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' && + *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + if (!strcmp(super, "*") && !strcmp(type, "*")) + { + /* + * Force * / * to be "application/octet-stream"... + */ + + strcpy(super, "application"); + strcpy(type, "octet-stream"); + } + + /* + * Add the filter to the MIME database, supporting wildcards as needed... + */ + + for (temptype = (mime_type_t *)cupsArrayFirst(mime->types); + temptype; + temptype = (mime_type_t *)cupsArrayNext(mime->types)) + if ((super[0] == '*' || !strcmp(temptype->super, super)) && + (type[0] == '*' || !strcmp(temptype->type, type))) + mimeAddFilter(mime, temptype, dsttype, cost, filter); + } + + cupsFileClose(fp); +} + + +/* + * 'mime_load_types()' - Load a xyz.types file. + */ + +static void +mime_load_types(mime_t *mime, /* I - MIME database */ + const char *filename) /* I - Types file to load */ +{ + cups_file_t *fp; /* Types file */ + int linelen; /* Length of line */ + char line[32768], /* Input line from file */ + *lineptr, /* Current position in line */ + super[MIME_MAX_SUPER], /* Super-type name */ + type[MIME_MAX_TYPE], /* Type name */ + *temp; /* Temporary pointer */ + mime_type_t *typeptr; /* New MIME type */ + + + DEBUG_printf(("2mime_load_types(mime=%p, filename=\"%s\")", mime, filename)); + + /* + * First try to open the file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + { + DEBUG_printf(("3mime_load_types: Unable to open \"%s\": %s", filename, + strerror(errno))); + _mimeError(mime, "Unable to open \"%s\": %s", filename, strerror(errno)); + return; + } + + /* + * Then read each line from the file, skipping any comments in the file... + */ + + while (cupsFileGets(fp, line, sizeof(line)) != NULL) + { + /* + * Skip blank lines and lines starting with a #... + */ + + if (!line[0] || line[0] == '#') + continue; + + /* + * While the last character in the line is a backslash, continue on to the + * next line (and the next, etc.) + */ + + linelen = strlen(line); + + while (line[linelen - 1] == '\\') + { + linelen --; + + if (cupsFileGets(fp, line + linelen, sizeof(line) - linelen) == NULL) + line[linelen] = '\0'; + else + linelen += strlen(line + linelen); + } + + /* + * Extract the super-type and type names from the beginning of the line. + */ + + lineptr = line; + temp = super; + + while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' && + (temp - super + 1) < MIME_MAX_SUPER) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + if (*lineptr != '/') + continue; + + lineptr ++; + temp = type; + + while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' && + *lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE) + *temp++ = tolower(*lineptr++ & 255); + + *temp = '\0'; + + /* + * Add the type and rules to the MIME database... + */ + + typeptr = mimeAddType(mime, super, type); + mimeAddTypeRule(typeptr, lineptr); + } + + cupsFileClose(fp); +} + + +/* + * End of "$Id: mime.c 9750 2011-05-06 22:53:53Z mike $". + */ diff --git a/scheduler/mime.h b/scheduler/mime.h new file mode 100644 index 0000000..c9e2147 --- /dev/null +++ b/scheduler/mime.h @@ -0,0 +1,162 @@ +/* + * "$Id: mime.h 9750 2011-05-06 22:53:53Z mike $" + * + * MIME type/conversion database definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_MIME_H_ +# define _CUPS_MIME_H_ + +# include +# include +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Constants... + */ + +# define MIME_MAX_SUPER 16 /* Maximum size of supertype name */ +# define MIME_MAX_TYPE IPP_MAX_NAME /* Maximum size of type name */ +# define MIME_MAX_FILTER 256 /* Maximum size of filter pathname */ +# define MIME_MAX_BUFFER 4096 /* Maximum size of file buffer */ + + +/* + * Types/structures... + */ + +typedef enum +{ + MIME_MAGIC_NOP, /* No operation */ + MIME_MAGIC_AND, /* Logical AND of all children */ + MIME_MAGIC_OR, /* Logical OR of all children */ + MIME_MAGIC_MATCH, /* Filename match */ + MIME_MAGIC_ASCII, /* ASCII characters in range */ + MIME_MAGIC_PRINTABLE, /* Printable characters (32-255) in range */ + MIME_MAGIC_STRING, /* String matches */ + MIME_MAGIC_CHAR, /* Character/byte matches */ + MIME_MAGIC_SHORT, /* Short/16-bit word matches */ + MIME_MAGIC_INT, /* Integer/32-bit word matches */ + MIME_MAGIC_LOCALE, /* Current locale matches string */ + MIME_MAGIC_CONTAINS, /* File contains a string */ + MIME_MAGIC_ISTRING /* Case-insensitive string matches */ +} mime_op_t; + +typedef struct _mime_magic_s /**** MIME Magic Data ****/ +{ + struct _mime_magic_s *prev, /* Previous rule */ + *next, /* Next rule */ + *parent, /* Parent rules */ + *child; /* Child rules */ + short op, /* Operation code (see above) */ + invert; /* Invert the result */ + int offset, /* Offset in file */ + region, /* Region length */ + length; /* Length of data */ + union + { + char matchv[64]; /* Match value */ + char localev[64]; /* Locale value */ + char stringv[64]; /* String value */ + unsigned char charv; /* Byte value */ + unsigned short shortv; /* Short value */ + unsigned intv; /* Integer value */ + } value; +} mime_magic_t; + +typedef struct _mime_type_s /**** MIME Type Data ****/ +{ + mime_magic_t *rules; /* Rules used to detect this type */ + int priority; /* Priority of this type */ + char super[MIME_MAX_SUPER], /* Super-type name ("image", "application", etc.) */ + type[MIME_MAX_TYPE]; /* Type name ("png", "postscript", etc.) */ +} mime_type_t; + +typedef struct _mime_filter_s /**** MIME Conversion Filter Data ****/ +{ + mime_type_t *src, /* Source type */ + *dst; /* Destination type */ + int cost; /* Relative cost */ + char filter[MIME_MAX_FILTER];/* Filter program to use */ + size_t maxsize; /* Maximum file size for this filter */ +} mime_filter_t; + +typedef void (*mime_error_cb_t)(void *ctx, const char *message); + +typedef struct _mime_s /**** MIME Database ****/ +{ + cups_array_t *types; /* File types */ + cups_array_t *filters; /* Type conversion filters */ + cups_array_t *srcs; /* Filters sorted by source type */ + mime_error_cb_t error_cb; /* Error message callback */ + void *error_ctx; /* Pointer for callback */ +} mime_t; + + +/* + * Functions... + */ + +extern void mimeDelete(mime_t *mime); +extern mime_t *mimeNew(void) _CUPS_API_1_5; +extern mime_t *mimeLoad(const char *pathname, const char *filterpath); +extern mime_t *mimeLoadFilters(mime_t *mime, const char *pathname, + const char *filterpath); +extern mime_t *mimeLoadTypes(mime_t *mime, const char *pathname); + +extern mime_type_t *mimeAddType(mime_t *mime, const char *super, + const char *type); +extern int mimeAddTypeRule(mime_type_t *mt, const char *rule); +extern void mimeDeleteType(mime_t *mime, mime_type_t *mt); +extern mime_type_t *mimeFileType(mime_t *mime, const char *pathname, + const char *filename, int *compression); +extern mime_type_t *mimeFirstType(mime_t *mime); +extern mime_type_t *mimeNextType(mime_t *mime); +extern int mimeNumTypes(mime_t *mime); +extern mime_type_t *mimeType(mime_t *mime, const char *super, + const char *type); + +extern mime_filter_t *mimeAddFilter(mime_t *mime, mime_type_t *src, + mime_type_t *dst, int cost, + const char *filter); +extern void mimeDeleteFilter(mime_t *mime, mime_filter_t *filter); +extern cups_array_t *mimeFilter(mime_t *mime, mime_type_t *src, + mime_type_t *dst, int *cost); +extern cups_array_t *mimeFilter2(mime_t *mime, mime_type_t *src, + size_t srcsize, mime_type_t *dst, + int *cost); +extern mime_filter_t *mimeFilterLookup(mime_t *mime, mime_type_t *src, + mime_type_t *dst); +extern mime_filter_t *mimeFirstFilter(mime_t *mime); +extern mime_filter_t *mimeNextFilter(mime_t *mime); +extern int mimeNumFilters(mime_t *mime); +extern void mimeSetErrorCallback(mime_t *mime, mime_error_cb_t cb, + void *context) _CUPS_API_1_5; + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !_CUPS_MIME_H_ */ + +/* + * End of "$Id: mime.h 9750 2011-05-06 22:53:53Z mike $". + */ diff --git a/scheduler/network.c b/scheduler/network.c new file mode 100644 index 0000000..921ed17 --- /dev/null +++ b/scheduler/network.c @@ -0,0 +1,300 @@ +/* + * "$Id: network.c 10379 2012-03-23 22:16:22Z mike $" + * + * Network interface functions for the CUPS scheduler. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdNetIFFind() - Find a network interface. + * cupsdNetIFFree() - Free the current network interface list. + * cupsdNetIFUpdate() - Update the network interface list as needed... + * compare_netif() - Compare two network interfaces. + */ + +/* + * Include necessary headers. + */ + +#include +#include "cupsd.h" + + +/* + * Local functions... + */ + +static void cupsdNetIFFree(void); +static int compare_netif(cupsd_netif_t *a, cupsd_netif_t *b); + + +/* + * 'cupsdNetIFFind()' - Find a network interface. + */ + +cupsd_netif_t * /* O - Network interface data */ +cupsdNetIFFind(const char *name) /* I - Name of interface */ +{ + cupsd_netif_t key; /* Search key */ + + + /* + * Update the interface list as needed... + */ + + if (NetIFUpdate) + cupsdNetIFUpdate(); + + /* + * Search for the named interface... + */ + + strlcpy(key.name, name, sizeof(key.name)); + + return ((cupsd_netif_t *)cupsArrayFind(NetIFList, &key)); +} + + +/* + * 'cupsdNetIFFree()' - Free the current network interface list. + */ + +static void +cupsdNetIFFree(void) +{ + cupsd_netif_t *current; /* Current interface in array */ + + + /* + * Loop through the interface list and free all the records... + */ + + for (current = (cupsd_netif_t *)cupsArrayFirst(NetIFList); + current; + current = (cupsd_netif_t *)cupsArrayNext(NetIFList)) + { + cupsArrayRemove(NetIFList, current); + free(current); + } +} + + +/* + * 'cupsdNetIFUpdate()' - Update the network interface list as needed... + */ + +void +cupsdNetIFUpdate(void) +{ + int match; /* Matching address? */ + cupsd_listener_t *lis; /* Listen address */ + cupsd_netif_t *temp; /* New interface */ + struct ifaddrs *addrs, /* Interface address list */ + *addr; /* Current interface address */ + char hostname[1024]; /* Hostname for address */ + size_t hostlen; /* Length of hostname */ + + + /* + * Only update the list if we need to... + */ + + if (!NetIFUpdate) + return; + + NetIFUpdate = 0; + + /* + * Free the old interfaces... + */ + + cupsdNetIFFree(); + + /* + * Make sure we have an array... + */ + + if (!NetIFList) + NetIFList = cupsArrayNew((cups_array_func_t)compare_netif, NULL); + + if (!NetIFList) + return; + + /* + * Grab a new list of interfaces... + */ + + if (getifaddrs(&addrs) < 0) + return; + + for (addr = addrs; addr != NULL; addr = addr->ifa_next) + { + /* + * See if this interface address is IPv4 or IPv6... + */ + + if (addr->ifa_addr == NULL || + (addr->ifa_addr->sa_family != AF_INET +#ifdef AF_INET6 + && addr->ifa_addr->sa_family != AF_INET6 +#endif + ) || + addr->ifa_netmask == NULL || addr->ifa_name == NULL) + continue; + + /* + * Try looking up the hostname for the address as needed... + */ + + if (HostNameLookups) + httpAddrLookup((http_addr_t *)(addr->ifa_addr), hostname, + sizeof(hostname)); + else + { + /* + * Map the default server address and localhost to the server name + * and localhost, respectively; for all other addresses, use the + * numeric address... + */ + + if (httpAddrLocalhost((http_addr_t *)(addr->ifa_addr))) + strlcpy(hostname, "localhost", sizeof(hostname)); + else + httpAddrString((http_addr_t *)(addr->ifa_addr), hostname, + sizeof(hostname)); + } + + /* + * Create a new address element... + */ + + hostlen = strlen(hostname); + if ((temp = calloc(1, sizeof(cupsd_netif_t) + hostlen)) == NULL) + break; + + /* + * Copy all of the information... + */ + + strlcpy(temp->name, addr->ifa_name, sizeof(temp->name)); + temp->hostlen = hostlen; + memcpy(temp->hostname, hostname, hostlen + 1); + + if (addr->ifa_addr->sa_family == AF_INET) + { + /* + * Copy IPv4 addresses... + */ + + memcpy(&(temp->address), addr->ifa_addr, sizeof(struct sockaddr_in)); + memcpy(&(temp->mask), addr->ifa_netmask, sizeof(struct sockaddr_in)); + + if (addr->ifa_dstaddr) + memcpy(&(temp->broadcast), addr->ifa_dstaddr, + sizeof(struct sockaddr_in)); + } +#ifdef AF_INET6 + else + { + /* + * Copy IPv6 addresses... + */ + + memcpy(&(temp->address), addr->ifa_addr, sizeof(struct sockaddr_in6)); + memcpy(&(temp->mask), addr->ifa_netmask, sizeof(struct sockaddr_in6)); + + if (addr->ifa_dstaddr) + memcpy(&(temp->broadcast), addr->ifa_dstaddr, + sizeof(struct sockaddr_in6)); + } +#endif /* AF_INET6 */ + + if (!(addr->ifa_flags & IFF_POINTOPOINT) && + !httpAddrLocalhost(&(temp->address))) + temp->is_local = 1; + + /* + * Determine which port to use when advertising printers... + */ + + for (lis = (cupsd_listener_t *)cupsArrayFirst(Listeners); + lis; + lis = (cupsd_listener_t *)cupsArrayNext(Listeners)) + { + match = 0; + + if (httpAddrAny(&(lis->address))) + match = 1; + else if (addr->ifa_addr->sa_family == AF_INET && + lis->address.addr.sa_family == AF_INET && + (lis->address.ipv4.sin_addr.s_addr & + temp->mask.ipv4.sin_addr.s_addr) == + (temp->address.ipv4.sin_addr.s_addr & + temp->mask.ipv4.sin_addr.s_addr)) + match = 1; +#ifdef AF_INET6 + else if (addr->ifa_addr->sa_family == AF_INET6 && + lis->address.addr.sa_family == AF_INET6 && + (lis->address.ipv6.sin6_addr.s6_addr[0] & + temp->mask.ipv6.sin6_addr.s6_addr[0]) == + (temp->address.ipv6.sin6_addr.s6_addr[0] & + temp->mask.ipv6.sin6_addr.s6_addr[0]) && + (lis->address.ipv6.sin6_addr.s6_addr[1] & + temp->mask.ipv6.sin6_addr.s6_addr[1]) == + (temp->address.ipv6.sin6_addr.s6_addr[1] & + temp->mask.ipv6.sin6_addr.s6_addr[1]) && + (lis->address.ipv6.sin6_addr.s6_addr[2] & + temp->mask.ipv6.sin6_addr.s6_addr[2]) == + (temp->address.ipv6.sin6_addr.s6_addr[2] & + temp->mask.ipv6.sin6_addr.s6_addr[2]) && + (lis->address.ipv6.sin6_addr.s6_addr[3] & + temp->mask.ipv6.sin6_addr.s6_addr[3]) == + (temp->address.ipv6.sin6_addr.s6_addr[3] & + temp->mask.ipv6.sin6_addr.s6_addr[3])) + match = 1; +#endif /* AF_INET6 */ + + if (match) + { + temp->port = _httpAddrPort(&(lis->address)); + break; + } + } + + /* + * Add it to the array... + */ + + cupsArrayAdd(NetIFList, temp); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdNetIFUpdate: \"%s\" = %s:%d", + temp->name, temp->hostname, temp->port); + } + + freeifaddrs(addrs); +} + + +/* + * 'compare_netif()' - Compare two network interfaces. + */ + +static int /* O - Result of comparison */ +compare_netif(cupsd_netif_t *a, /* I - First network interface */ + cupsd_netif_t *b) /* I - Second network interface */ +{ + return (strcmp(a->name, b->name)); +} + + +/* + * End of "$Id: network.c 10379 2012-03-23 22:16:22Z mike $". + */ diff --git a/scheduler/network.h b/scheduler/network.h new file mode 100644 index 0000000..f16a06b --- /dev/null +++ b/scheduler/network.h @@ -0,0 +1,52 @@ +/* + * "$Id: network.h 9350 2010-11-04 23:23:25Z mike $" + * + * Network interface definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * "LICENSE" which should have been included with this file. If this + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Structures... + */ + +typedef struct cupsd_netif_s /**** Network interface data ****/ +{ + int is_local, /* Local (not point-to-point) interface? */ + port; /* Listen port */ + http_addr_t address, /* Network address */ + mask, /* Network mask */ + broadcast; /* Broadcast address */ + size_t hostlen; /* Length of hostname */ + char name[32], /* Network interface name */ + hostname[1]; /* Hostname associated with interface */ +} cupsd_netif_t; + + +/* + * Globals... + */ + +VAR int NetIFUpdate VALUE(1); + /* Network interface list needs updating */ +VAR cups_array_t *NetIFList VALUE(NULL); + /* Array of network interfaces */ + +/* + * Prototypes... + */ + +extern cupsd_netif_t *cupsdNetIFFind(const char *name); +extern void cupsdNetIFUpdate(void); + + +/* + * End of "$Id: network.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/org.cups.cups-lpd.plist.in b/scheduler/org.cups.cups-lpd.plist.in new file mode 100644 index 0000000..32067ef --- /dev/null +++ b/scheduler/org.cups.cups-lpd.plist.in @@ -0,0 +1,33 @@ + + + + + Disabled + + Label + org.cups.cups-lpd + ProgramArguments + + /usr/libexec/cups/daemon/cups-lpd + -o + document-format=application/octet-stream + + Sockets + + Listeners + + SockServiceName + printer + SockType + stream + + + UserName + @CUPS_USER@ + inetdCompatibility + + Wait + + + + diff --git a/scheduler/org.cups.cupsd.plist b/scheduler/org.cups.cupsd.plist new file mode 100644 index 0000000..ccc861d --- /dev/null +++ b/scheduler/org.cups.cupsd.plist @@ -0,0 +1,62 @@ + + + + + Label + org.cups.cupsd + EnableTransactions + + ExitTimeOut + 60 + KeepAlive + + PathState + + /private/var/spool/cups/cache/org.cups.cupsd + + + + ProgramArguments + + /usr/sbin/cupsd + -l + + + EnvironmentVariables + + CUPS_DEBUG_LOG + /var/log/cups/debug_log + CUPS_DEBUG_LEVEL + 3 + CUPS_DEBUG_FILTER + ^(http|_http|ipp|_ipp|mime).* + + ServiceIPC + + Sockets + + Listeners + + + SockNodeName + ::1 + SockServiceName + ipp + + + SockNodeName + 127.0.0.1 + SockServiceName + ipp + + + SockPathMode + 49663 + SockPathName + /private/var/run/cupsd + + + + + diff --git a/scheduler/policy.c b/scheduler/policy.c new file mode 100644 index 0000000..fb29ce0 --- /dev/null +++ b/scheduler/policy.c @@ -0,0 +1,517 @@ +/* + * "$Id: policy.c 9793 2011-05-20 03:49:49Z mike $" + * + * Policy routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * AddPolicy() - Add a policy to the system. + * cupsdAddPolicyOp() - Add an operation to a policy. + * cupsdCheckPolicy() - Check the IPP operation and username against a + * policy. + * cupsdDeleteAllPolicies() - Delete all policies in memory. + * cupsdFindPolicy() - Find a named policy. + * cupsdFindPolicyOp() - Find a policy operation. + * cupsdGetPrivateAttrs() - Get the private attributes for the current + * request. + * compare_ops() - Compare two operations. + * compare_policies() - Compare two policies. + * free_policy() - Free the memory used by a policy. + * hash_op() - Generate a lookup hash for the operation. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include + + +/* + * Local functions... + */ + +static int compare_ops(cupsd_location_t *a, cupsd_location_t *b); +static int compare_policies(cupsd_policy_t *a, cupsd_policy_t *b); +static void free_policy(cupsd_policy_t *p); +static int hash_op(cupsd_location_t *op); + + +/* + * 'AddPolicy()' - Add a policy to the system. + */ + +cupsd_policy_t * /* O - Policy */ +cupsdAddPolicy(const char *policy) /* I - Name of policy */ +{ + cupsd_policy_t *temp; /* Pointer to policy */ + + + if (!policy) + return (NULL); + + if (!Policies) + Policies = cupsArrayNew3((cups_array_func_t)compare_policies, NULL, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)free_policy); + + if (!Policies) + return (NULL); + + if ((temp = calloc(1, sizeof(cupsd_policy_t))) != NULL) + { + cupsdSetString(&temp->name, policy); + cupsArrayAdd(Policies, temp); + } + + return (temp); +} + + +/* + * 'cupsdAddPolicyOp()' - Add an operation to a policy. + */ + +cupsd_location_t * /* O - New policy operation */ +cupsdAddPolicyOp(cupsd_policy_t *p, /* I - Policy */ + cupsd_location_t *po, /* I - Policy operation to copy */ + ipp_op_t op) /* I - IPP operation code */ +{ + cupsd_location_t *temp; /* New policy operation */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddPolicyOp(p=%p, po=%p, op=%x(%s))", + p, po, op, ippOpString(op)); + + if (!p) + return (NULL); + + if (!p->ops) + p->ops = cupsArrayNew3((cups_array_func_t)compare_ops, NULL, + (cups_ahash_func_t)hash_op, 128, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)cupsdFreeLocation); + + if (!p->ops) + return (NULL); + + if ((temp = cupsdCopyLocation(po)) != NULL) + { + temp->op = op; + temp->limit = CUPSD_AUTH_LIMIT_IPP; + + cupsArrayAdd(p->ops, temp); + } + + return (temp); +} + + +/* + * 'cupsdCheckPolicy()' - Check the IPP operation and username against a policy. + */ + +http_status_t /* I - 1 if OK, 0 otherwise */ +cupsdCheckPolicy(cupsd_policy_t *p, /* I - Policy */ + cupsd_client_t *con, /* I - Client connection */ + const char *owner) /* I - Owner of object */ +{ + cupsd_location_t *po; /* Current policy operation */ + + + /* + * Range check... + */ + + if (!p || !con) + { + cupsdLogMessage(CUPSD_LOG_CRIT, "cupsdCheckPolicy: p=%p, con=%p!", p, con); + + return ((http_status_t)0); + } + + /* + * Find a match for the operation... + */ + + if ((po = cupsdFindPolicyOp(p, con->request->request.op.operation_id)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckPolicy: No matching operation, returning 0!"); + return ((http_status_t)0); + } + + con->best = po; + + /* + * Return the status of the check... + */ + + return (cupsdIsAuthorized(con, owner)); +} + + +/* + * 'cupsdDeleteAllPolicies()' - Delete all policies in memory. + */ + +void +cupsdDeleteAllPolicies(void) +{ + cupsd_printer_t *printer; /* Current printer */ + + + if (!Policies) + return; + + /* + * First clear the policy pointers for all printers... + */ + + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + printer->op_policy_ptr = NULL; + + DefaultPolicyPtr = NULL; + + /* + * Then free all of the policies... + */ + + cupsArrayDelete(Policies); + + Policies = NULL; +} + + +/* + * 'cupsdFindPolicy()' - Find a named policy. + */ + +cupsd_policy_t * /* O - Policy */ +cupsdFindPolicy(const char *policy) /* I - Name of policy */ +{ + cupsd_policy_t key; /* Search key */ + + + /* + * Range check... + */ + + if (!policy) + return (NULL); + + /* + * Look it up... + */ + + key.name = (char *)policy; + return ((cupsd_policy_t *)cupsArrayFind(Policies, &key)); +} + + +/* + * 'cupsdFindPolicyOp()' - Find a policy operation. + */ + +cupsd_location_t * /* O - Policy operation */ +cupsdFindPolicyOp(cupsd_policy_t *p, /* I - Policy */ + ipp_op_t op) /* I - IPP operation */ +{ + cupsd_location_t key, /* Search key... */ + *po; /* Current policy operation */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp(p=%p, op=%x(%s))", + p, op, ippOpString(op)); + + /* + * Range check... + */ + + if (!p) + return (NULL); + + /* + * Check the operation against the available policies... + */ + + key.op = op; + if ((po = (cupsd_location_t *)cupsArrayFind(p->ops, &key)) != NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdFindPolicyOp: Found exact match..."); + return (po); + } + + key.op = IPP_ANY_OPERATION; + if ((po = (cupsd_location_t *)cupsArrayFind(p->ops, &key)) != NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdFindPolicyOp: Found wildcard match..."); + return (po); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindPolicyOp: No match found!"); + + return (NULL); +} + + +/* + * 'cupsdGetPrivateAttrs()' - Get the private attributes for the current + * request. + */ + +cups_array_t * /* O - Array or NULL for no restrictions */ +cupsdGetPrivateAttrs( + cupsd_policy_t *policy, /* I - Policy */ + cupsd_client_t *con, /* I - Client connection */ + cupsd_printer_t *printer, /* I - Printer, if any */ + const char *owner) /* I - Owner of object */ +{ + char *name; /* Current name in access list */ + cups_array_t *access_ptr, /* Access array */ + *attrs_ptr; /* Attributes array */ + const char *username; /* Username associated with request */ + ipp_attribute_t *attr; /* Attribute from request */ + struct passwd *pw; /* User info */ + + +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdGetPrivateAttrs(policy=%p(%s), con=%p(%d), " + "printer=%p(%s), owner=\"%s\")", policy, policy->name, con, + con->http.fd, printer, printer ? printer->name : "", owner); +#endif /* DEBUG */ + + /* + * Get the access and attributes lists that correspond to the request... + */ + +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: %s", + ippOpString(con->request->request.op.operation_id)); +#endif /* DEBUG */ + + switch (con->request->request.op.operation_id) + { + case IPP_GET_SUBSCRIPTIONS : + case IPP_GET_SUBSCRIPTION_ATTRIBUTES : + case IPP_GET_NOTIFICATIONS : + access_ptr = policy->sub_access; + attrs_ptr = policy->sub_attrs; + break; + + default : + access_ptr = policy->job_access; + attrs_ptr = policy->job_attrs; + break; + } + + /* + * If none of the attributes are private, return NULL now... + */ + + if ((name = (char *)cupsArrayFirst(attrs_ptr)) != NULL && + !_cups_strcasecmp(name, "none")) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: Returning NULL."); +#endif /* DEBUG */ + + return (NULL); + } + + /* + * Otherwise check the user against the access list... + */ + + if (con->username[0]) + username = con->username; + else if ((attr = ippFindAttribute(con->request, "requesting-user-name", + IPP_TAG_NAME)) != NULL) + username = attr->values[0].string.text; + else + username = "anonymous"; + + if (username[0]) + { + pw = getpwnam(username); + endpwent(); + } + else + pw = NULL; + +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: username=\"%s\"", + username); +#endif /* DEBUG */ + + /* + * Otherwise check the user against the access list... + */ + + for (name = (char *)cupsArrayFirst(access_ptr); + name; + name = (char *)cupsArrayNext(access_ptr)) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: name=%s", name); +#endif /* DEBUG */ + + if (printer && !_cups_strcasecmp(name, "@ACL")) + { + char *acl; /* Current ACL user/group */ + + for (acl = (char *)cupsArrayFirst(printer->users); + acl; + acl = (char *)cupsArrayNext(printer->users)) + { + if (acl[0] == '@') + { + /* + * Check group membership... + */ + + if (cupsdCheckGroup(username, pw, acl + 1)) + break; + } + else if (acl[0] == '#') + { + /* + * Check UUID... + */ + + if (cupsdCheckGroup(username, pw, acl)) + break; + } + else if (!_cups_strcasecmp(username, acl)) + break; + } + } + else if (owner && !_cups_strcasecmp(name, "@OWNER") && + !_cups_strcasecmp(username, owner)) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdGetPrivateAttrs: Returning NULL."); +#endif /* DEBUG */ + + return (NULL); + } + else if (!_cups_strcasecmp(name, "@SYSTEM")) + { + int i; /* Looping var */ + + for (i = 0; i < NumSystemGroups; i ++) + if (cupsdCheckGroup(username, pw, SystemGroups[i])) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdGetPrivateAttrs: Returning NULL."); +#endif /* DEBUG */ + + return (NULL); + } + } + else if (name[0] == '@') + { + if (cupsdCheckGroup(username, pw, name + 1)) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdGetPrivateAttrs: Returning NULL."); +#endif /* DEBUG */ + + return (NULL); + } + } + else if (!_cups_strcasecmp(username, name)) + { +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: Returning NULL."); +#endif /* DEBUG */ + + return (NULL); + } + } + + /* + * No direct access, so return private attributes list... + */ + +#ifdef DEBUG + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdGetPrivateAttrs: Returning list."); +#endif /* DEBUG */ + + return (attrs_ptr); +} + + +/* + * 'compare_ops()' - Compare two operations. + */ + +static int /* O - Result of comparison */ +compare_ops(cupsd_location_t *a, /* I - First operation */ + cupsd_location_t *b) /* I - Second operation */ +{ + return (a->op - b->op); +} + + +/* + * 'compare_policies()' - Compare two policies. + */ + +static int /* O - Result of comparison */ +compare_policies(cupsd_policy_t *a, /* I - First policy */ + cupsd_policy_t *b) /* I - Second policy */ +{ + return (_cups_strcasecmp(a->name, b->name)); +} + + +/* + * 'free_policy()' - Free the memory used by a policy. + */ + +static void +free_policy(cupsd_policy_t *p) /* I - Policy to free */ +{ + cupsArrayDelete(p->job_access); + cupsArrayDelete(p->job_attrs); + cupsArrayDelete(p->sub_access); + cupsArrayDelete(p->sub_attrs); + cupsArrayDelete(p->ops); + cupsdClearString(&p->name); + free(p); +} + + +/* + * 'hash_op()' - Generate a lookup hash for the operation. + */ + +static int /* O - Hash value */ +hash_op(cupsd_location_t *op) /* I - Operation */ +{ + return (((op->op >> 6) & 0x40) | (op->op & 0x3f)); +} + + +/* + * End of "$Id: policy.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/policy.h b/scheduler/policy.h new file mode 100644 index 0000000..f718777 --- /dev/null +++ b/scheduler/policy.h @@ -0,0 +1,63 @@ +/* + * "$Id: policy.h 9352 2010-11-06 04:55:26Z mike $" + * + * Policy definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + + +/* + * Policy structure... + */ + +typedef struct +{ + char *name; /* Policy name */ + cups_array_t *job_access, /* Private users/groups for jobs */ + *job_attrs, /* Private attributes for jobs */ + *sub_access, /* Private users/groups for subscriptions */ + *sub_attrs, /* Private attributes for subscriptions */ + *ops; /* Operations */ +} cupsd_policy_t; + +typedef struct cupsd_printer_s cupsd_printer_t; + + +/* + * Globals... + */ + +VAR cups_array_t *Policies VALUE(NULL); + /* Policies */ + + +/* + * Prototypes... + */ + +extern cupsd_policy_t *cupsdAddPolicy(const char *policy); +extern cupsd_location_t *cupsdAddPolicyOp(cupsd_policy_t *p, + cupsd_location_t *po, + ipp_op_t op); +extern http_status_t cupsdCheckPolicy(cupsd_policy_t *p, cupsd_client_t *con, + const char *owner); +extern void cupsdDeleteAllPolicies(void); +extern cupsd_policy_t *cupsdFindPolicy(const char *policy); +extern cupsd_location_t *cupsdFindPolicyOp(cupsd_policy_t *p, ipp_op_t op); +extern cups_array_t *cupsdGetPrivateAttrs(cupsd_policy_t *p, + cupsd_client_t *con, + cupsd_printer_t *printer, + const char *owner); + + +/* + * End of "$Id: policy.h 9352 2010-11-06 04:55:26Z mike $". + */ diff --git a/scheduler/printers.c b/scheduler/printers.c new file mode 100644 index 0000000..d010ce0 --- /dev/null +++ b/scheduler/printers.c @@ -0,0 +1,5638 @@ +/* + * "$Id: printers.c 10295 2012-02-15 23:21:06Z mike $" + * + * Printer routines for the CUPS scheduler. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddPrinter() - Add a printer to the system. + * cupsdCreateCommonData() - Create the common printer data. + * cupsdDeleteAllPrinters() - Delete all printers from the system. + * cupsdDeletePrinter() - Delete a printer from the system. + * cupsdFindDest() - Find a destination in the list. + * cupsdFindPrinter() - Find a printer in the list. + * cupsdLoadAllPrinters() - Load printers from the printers.conf file. + * cupsdRenamePrinter() - Rename a printer. + * cupsdSaveAllPrinters() - Save all printer definitions to the + * printers.conf file. + * cupsdSetAuthInfoRequired() - Set the required authentication info. + * cupsdSetDeviceURI() - Set the device URI for a printer. + * cupsdSetPrinterAttr() - Set a printer attribute. + * cupsdSetPrinterAttrs() - Set printer attributes based upon the PPD + * file. + * cupsdSetPrinterReasons() - Set/update the reasons strings. + * cupsdSetPrinterState() - Update the current state of a printer. + * cupsdStopPrinter() - Stop a printer from printing any jobs... + * cupsdUpdatePrinterPPD() - Update keywords in a printer's PPD file. + * cupsdUpdatePrinters() - Update printers after a partial reload. + * cupsdValidateDest() - Validate a printer/class destination. + * cupsdWritePrintcap() - Write a pseudo-printcap file for older + * applications that need it... + * add_printer_defaults() - Add name-default attributes to the printer + * attributes. + * add_printer_filter() - Add a MIME filter for a printer. + * add_printer_formats() - Add document-format-supported values for a + * printer. + * compare_printers() - Compare two printers. + * delete_printer_filters() - Delete all MIME filters for a printer. + * dirty_printer() - Mark config and state files dirty for the + * specified printer. + * load_ppd() - Load a cached PPD file, updating the cache as + * needed. + * new_media_col() - Create a media-col collection value. + * write_irix_config() - Update the config files used by the IRIX + * desktop tools. + * write_irix_state() - Update the status files used by IRIX printing + * desktop tools. + * write_xml_string() - Write a string with XML escaping. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#ifdef HAVE_APPLICATIONSERVICES_H +# include +#endif /* HAVE_APPLICATIONSERVICES_H */ +#ifdef HAVE_SYS_MOUNT_H +# include +#endif /* HAVE_SYS_MOUNT_H */ +#ifdef HAVE_SYS_STATVFS_H +# include +#elif defined(HAVE_SYS_STATFS_H) +# include +#endif /* HAVE_SYS_STATVFS_H */ +#ifdef HAVE_SYS_VFS_H +# include +#endif /* HAVE_SYS_VFS_H */ +#ifdef __APPLE__ +# include +#endif /* __APPLE__ */ + +#ifdef HAVE_DBUS +# include "colord.h" +#endif /* HAVE_DBUS */ + +/* + * Local functions... + */ + +static void add_printer_defaults(cupsd_printer_t *p); +static void add_printer_filter(cupsd_printer_t *p, mime_type_t *type, + const char *filter); +static void add_printer_formats(cupsd_printer_t *p); +static int compare_printers(void *first, void *second, void *data); +static void delete_printer_filters(cupsd_printer_t *p); +static void dirty_printer(cupsd_printer_t *p); +static void load_ppd(cupsd_printer_t *p); +static void log_ipp_conformance(cupsd_printer_t *p, const char *reason); +static ipp_t *new_media_col(_pwg_size_t *size, const char *source, + const char *type); +#ifdef __sgi +static void write_irix_config(cupsd_printer_t *p); +static void write_irix_state(cupsd_printer_t *p); +#endif /* __sgi */ +static void write_xml_string(cups_file_t *fp, const char *s); + + +/* + * 'cupsdAddPrinter()' - Add a printer to the system. + */ + +cupsd_printer_t * /* O - New printer */ +cupsdAddPrinter(const char *name) /* I - Name of printer */ +{ + cupsd_printer_t *p; /* New printer */ + char uri[1024], /* Printer URI */ + uuid[64]; /* Printer UUID */ + + + /* + * Range check input... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdAddPrinter(\"%s\")", name); + + /* + * Create a new printer entity... + */ + + if ((p = calloc(1, sizeof(cupsd_printer_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_CRIT, "Unable to allocate memory for printer - %s", + strerror(errno)); + return (NULL); + } + + cupsdSetString(&p->name, name); + cupsdSetString(&p->info, name); + cupsdSetString(&p->hostname, ServerName); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + ServerName, RemotePort, "/printers/%s", name); + cupsdSetString(&p->uri, uri); + cupsdSetString(&p->uuid, _httpAssembleUUID(ServerName, RemotePort, name, 0, + uuid, sizeof(uuid))); + cupsdSetDeviceURI(p, "file:///dev/null"); + + p->state = IPP_PRINTER_STOPPED; + p->state_time = time(NULL); + p->accepting = 0; + p->shared = DefaultShared; + p->filetype = mimeAddType(MimeDatabase, "printer", name); + + cupsdSetString(&p->job_sheets[0], "none"); + cupsdSetString(&p->job_sheets[1], "none"); + + cupsdSetString(&p->error_policy, ErrorPolicy); + cupsdSetString(&p->op_policy, DefaultPolicy); + + p->op_policy_ptr = DefaultPolicyPtr; + + /* + * Insert the printer in the printer list alphabetically... + */ + + if (!Printers) + Printers = cupsArrayNew(compare_printers, NULL); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddPrinter: Adding %s to Printers", p->name); + cupsArrayAdd(Printers, p); + + if (!ImplicitPrinters) + ImplicitPrinters = cupsArrayNew(compare_printers, NULL); + + /* + * Return the new printer... + */ + + return (p); +} + + +/* + * 'cupsdCreateCommonData()' - Create the common printer data. + */ + +void +cupsdCreateCommonData(void) +{ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Attribute data */ + cups_dir_t *dir; /* Notifier directory */ + cups_dentry_t *dent; /* Notifier directory entry */ + cups_array_t *notifiers; /* Notifier array */ + char filename[1024], /* Filename */ + *notifier; /* Current notifier */ + cupsd_policy_t *p; /* Current policy */ + int k_supported; /* Maximum file size supported */ +#ifdef HAVE_STATVFS + struct statvfs spoolinfo; /* FS info for spool directory */ + double spoolsize; /* FS size */ +#elif defined(HAVE_STATFS) + struct statfs spoolinfo; /* FS info for spool directory */ + double spoolsize; /* FS size */ +#endif /* HAVE_STATVFS */ + static const int nups[] = /* number-up-supported values */ + { 1, 2, 4, 6, 9, 16 }; + static const int orients[4] =/* orientation-requested-supported values */ + { + IPP_PORTRAIT, + IPP_LANDSCAPE, + IPP_REVERSE_LANDSCAPE, + IPP_REVERSE_PORTRAIT + }; + static const char * const holds[] = /* job-hold-until-supported values */ + { + "no-hold", + "indefinite", + "day-time", + "evening", + "night", + "second-shift", + "third-shift", + "weekend" + }; + static const char * const versions[] =/* ipp-versions-supported values */ + { + "1.0", + "1.1", + "2.0", + "2.1" + }; + static const int ops[] = /* operations-supported values */ + { + IPP_PRINT_JOB, + IPP_VALIDATE_JOB, + IPP_CREATE_JOB, + IPP_SEND_DOCUMENT, + IPP_CANCEL_JOB, + IPP_GET_JOB_ATTRIBUTES, + IPP_GET_JOBS, + IPP_GET_PRINTER_ATTRIBUTES, + IPP_HOLD_JOB, + IPP_RELEASE_JOB, + IPP_RESTART_JOB, + IPP_PAUSE_PRINTER, + IPP_RESUME_PRINTER, + IPP_PURGE_JOBS, + IPP_SET_PRINTER_ATTRIBUTES, + IPP_SET_JOB_ATTRIBUTES, + IPP_GET_PRINTER_SUPPORTED_VALUES, + IPP_CREATE_PRINTER_SUBSCRIPTION, + IPP_CREATE_JOB_SUBSCRIPTION, + IPP_GET_SUBSCRIPTION_ATTRIBUTES, + IPP_GET_SUBSCRIPTIONS, + IPP_RENEW_SUBSCRIPTION, + IPP_CANCEL_SUBSCRIPTION, + IPP_GET_NOTIFICATIONS, + IPP_ENABLE_PRINTER, + IPP_DISABLE_PRINTER, + IPP_HOLD_NEW_JOBS, + IPP_RELEASE_HELD_NEW_JOBS, + IPP_CANCEL_JOBS, + IPP_CANCEL_MY_JOBS, + IPP_CLOSE_JOB, + CUPS_GET_DEFAULT, + CUPS_GET_PRINTERS, + CUPS_ADD_PRINTER, + CUPS_DELETE_PRINTER, + CUPS_GET_CLASSES, + CUPS_ADD_CLASS, + CUPS_DELETE_CLASS, + CUPS_ACCEPT_JOBS, + CUPS_REJECT_JOBS, + CUPS_SET_DEFAULT, + CUPS_GET_DEVICES, + CUPS_GET_PPDS, + CUPS_MOVE_JOB, + CUPS_AUTHENTICATE_JOB, + CUPS_GET_PPD, + CUPS_GET_DOCUMENT, + IPP_RESTART_JOB + }; + static const char * const charsets[] =/* charset-supported values */ + { + "us-ascii", + "utf-8" + }; + static const char * const compressions[] = + { /* document-compression-supported values */ + "none" +#ifdef HAVE_LIBZ + ,"gzip" +#endif /* HAVE_LIBZ */ + }; + static const char * const media_col_supported[] = + { /* media-col-supported values */ + "media-bottom-margin", + "media-left-margin", + "media-right-margin", + "media-size", + "media-source", + "media-top-margin", + "media-type" + }; + static const char * const multiple_document_handling[] = + { /* multiple-document-handling-supported values */ + "separate-documents-uncollated-copies", + "separate-documents-collated-copies" + }; + static const char * const notify_attrs[] = + { /* notify-attributes-supported values */ + "printer-state-change-time", + "notify-lease-expiration-time", + "notify-subscriber-user-name" + }; + static const char * const notify_events[] = + { /* notify-events-supported values */ + "job-completed", + "job-config-changed", + "job-created", + "job-progress", + "job-state-changed", + "job-stopped", + "printer-added", + "printer-changed", + "printer-config-changed", + "printer-deleted", + "printer-finishings-changed", + "printer-media-changed", + "printer-modified", + "printer-restarted", + "printer-shutdown", + "printer-state-changed", + "printer-stopped", + "server-audit", + "server-restarted", + "server-started", + "server-stopped" + }; + static const char * const job_creation[] = + { /* job-creation-attributes-supported */ + "copies", + "finishings", + "ipp-attribute-fidelity", + "job-hold-until", + "job-name", + "job-priority", + "job-sheets", + "media", + "media-col", + "multiple-document-handling", + "number-up", + "output-bin", + "output-mode", + "orientation-requested", + "page-ranges", + "print-quality", + "printer-resolution", + "sides" + }; + static const char * const job_settable[] = + { /* job-settable-attributes-supported */ + "copies", + "finishings", + "job-hold-until", + "job-name", + "job-priority", + "media", + "media-col", + "multiple-document-handling", + "number-up", + "output-bin", + "output-mode", + "orientation-requested", + "page-ranges", + "print-quality", + "printer-resolution", + "sides" + }; + static const char * const pdf_versions[] = + { /* pdf-versions-supported */ + "adobe-1.2", + "adobe-1.3", + "adobe-1.4", + "adobe-1.5", + "adobe-1.6", + "adobe-1.7", + "iso-19005-1_2005", + "iso-32000-1_2008", + "pwg-5102.3" + }; + static const char * const printer_settable[] = + { /* printer-settable-attributes-supported */ + "printer-info", + "printer-location" + }; + static const char * const which_jobs[] = + { /* which-jobs-supported values */ + "completed", + "not-completed", + "aborted", + "all", + "canceled", + "pending", + "pending-held", + "processing", + "processing-stopped" + }; + + + if (CommonData) + ippDelete(CommonData); + + CommonData = ippNew(); + + /* + * Get the maximum spool size based on the size of the filesystem used for + * the RequestRoot directory. If the host OS doesn't support the statfs call + * or the filesystem is larger than 2TiB, always report INT_MAX. + */ + +#ifdef HAVE_STATVFS + if (statvfs(RequestRoot, &spoolinfo)) + k_supported = INT_MAX; + else if ((spoolsize = (double)spoolinfo.f_frsize * spoolinfo.f_blocks / 1024) > + INT_MAX) + k_supported = INT_MAX; + else + k_supported = (int)spoolsize; + +#elif defined(HAVE_STATFS) + if (statfs(RequestRoot, &spoolinfo)) + k_supported = INT_MAX; + else if ((spoolsize = (double)spoolinfo.f_bsize * spoolinfo.f_blocks / 1024) > + INT_MAX) + k_supported = INT_MAX; + else + k_supported = (int)spoolsize; + +#else + k_supported = INT_MAX; +#endif /* HAVE_STATVFS */ + + /* + * This list of attributes is sorted to improve performance when the + * client provides a requested-attributes attribute... + */ + + /* charset-configured */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_CHARSET | IPP_TAG_COPY, + "charset-configured", NULL, "utf-8"); + + /* charset-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_CHARSET | IPP_TAG_COPY, + "charset-supported", sizeof(charsets) / sizeof(charsets[0]), + NULL, charsets); + + /* compression-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "compression-supported", + sizeof(compressions) / sizeof(compressions[0]), + NULL, compressions); + + /* copies-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "copies-supported", 1, MaxCopies); + + /* cups-version */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_TEXT | IPP_TAG_COPY, + "cups-version", NULL, CUPS_SVERSION + 6); + + /* generated-natural-language-supported (no IPP_TAG_COPY) */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, + "generated-natural-language-supported", NULL, DefaultLanguage); + + /* ipp-versions-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "ipp-versions-supported", sizeof(versions) / sizeof(versions[0]), + NULL, versions); + + /* ippget-event-life */ + ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "ippget-event-life", 15); + + /* job-creation-attributes-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "job-creation-attributes-supported", + sizeof(job_creation) / sizeof(job_creation[0]), + NULL, job_creation); + + /* job-hold-until-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "job-hold-until-supported", sizeof(holds) / sizeof(holds[0]), + NULL, holds); + + /* job-ids-supported */ + ippAddBoolean(CommonData, IPP_TAG_PRINTER, "job-ids-supported", 1); + + /* job-k-octets-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "job-k-octets-supported", 0, + k_supported); + + /* job-priority-supported */ + ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "job-priority-supported", 100); + + /* job-settable-attributes-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "job-settable-attributes-supported", + sizeof(job_settable) / sizeof(job_settable[0]), + NULL, job_settable); + + /* job-sheets-supported */ + if (cupsArrayCount(Banners) > 0) + { + /* + * Setup the job-sheets-supported attribute... + */ + + if (Classification && !ClassifyOverride) + attr = ippAddString(CommonData, IPP_TAG_PRINTER, + IPP_TAG_NAME | IPP_TAG_COPY, + "job-sheets-supported", NULL, Classification); + else + attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, + IPP_TAG_NAME | IPP_TAG_COPY, + "job-sheets-supported", cupsArrayCount(Banners) + 1, + NULL, NULL); + + if (attr == NULL) + cupsdLogMessage(CUPSD_LOG_EMERG, + "Unable to allocate memory for " + "job-sheets-supported attribute: %s!", strerror(errno)); + else if (!Classification || ClassifyOverride) + { + cupsd_banner_t *banner; /* Current banner */ + + + attr->values[0].string.text = _cupsStrAlloc("none"); + + for (i = 1, banner = (cupsd_banner_t *)cupsArrayFirst(Banners); + banner; + i ++, banner = (cupsd_banner_t *)cupsArrayNext(Banners)) + attr->values[i].string.text = banner->name; + } + } + else + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY, + "job-sheets-supported", NULL, "none"); + + /* jpeg-k-octets-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "jpeg-k-octets-supported", 0, + k_supported); + + /* jpeg-x-dimension-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "jpeg-x-dimension-supported", 0, + 65535); + + /* jpeg-y-dimension-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "jpeg-y-dimension-supported", 1, + 65535); + + /* media-col-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "media-col-supported", + sizeof(media_col_supported) / + sizeof(media_col_supported[0]), NULL, + media_col_supported); + + /* multiple-document-handling-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "multiple-document-handling-supported", + sizeof(multiple_document_handling) / + sizeof(multiple_document_handling[0]), NULL, + multiple_document_handling); + + /* multiple-document-jobs-supported */ + ippAddBoolean(CommonData, IPP_TAG_PRINTER, + "multiple-document-jobs-supported", 1); + + /* multiple-operation-time-out */ + ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "multiple-operation-time-out", MultipleOperationTimeout); + + /* natural-language-configured (no IPP_TAG_COPY) */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_LANGUAGE, + "natural-language-configured", NULL, DefaultLanguage); + + /* notify-attributes-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "notify-attributes-supported", + (int)(sizeof(notify_attrs) / sizeof(notify_attrs[0])), + NULL, notify_attrs); + + /* notify-lease-duration-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, + "notify-lease-duration-supported", 0, + MaxLeaseDuration ? MaxLeaseDuration : 2147483647); + + /* notify-max-events-supported */ + ippAddInteger(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "notify-max-events-supported", MaxEvents); + + /* notify-events-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "notify-events-supported", + (int)(sizeof(notify_events) / sizeof(notify_events[0])), + NULL, notify_events); + + /* notify-pull-method-supported */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "notify-pull-method-supported", NULL, "ippget"); + + /* notify-schemes-supported */ + snprintf(filename, sizeof(filename), "%s/notifier", ServerBin); + if ((dir = cupsDirOpen(filename)) != NULL) + { + notifiers = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + while ((dent = cupsDirRead(dir)) != NULL) + if (S_ISREG(dent->fileinfo.st_mode) && + (dent->fileinfo.st_mode & S_IXOTH) != 0) + cupsArrayAdd(notifiers, _cupsStrAlloc(dent->filename)); + + if (cupsArrayCount(notifiers) > 0) + { + attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "notify-schemes-supported", + cupsArrayCount(notifiers), NULL, NULL); + + for (i = 0, notifier = (char *)cupsArrayFirst(notifiers); + notifier; + i ++, notifier = (char *)cupsArrayNext(notifiers)) + attr->values[i].string.text = notifier; + } + + cupsArrayDelete(notifiers); + cupsDirClose(dir); + } + + /* number-up-supported */ + ippAddIntegers(CommonData, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "number-up-supported", sizeof(nups) / sizeof(nups[0]), nups); + + /* operations-supported */ + ippAddIntegers(CommonData, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "operations-supported", + sizeof(ops) / sizeof(ops[0]) + JobFiles - 1, ops); + + /* orientation-requested-supported */ + ippAddIntegers(CommonData, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "orientation-requested-supported", 4, orients); + + /* page-ranges-supported */ + ippAddBoolean(CommonData, IPP_TAG_PRINTER, "page-ranges-supported", 1); + + /* pdf-k-octets-supported */ + ippAddRange(CommonData, IPP_TAG_PRINTER, "pdf-k-octets-supported", 0, + k_supported); + + /* pdf-versions-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "pdf-versions-supported", + sizeof(pdf_versions) / sizeof(pdf_versions[0]), NULL, + pdf_versions); + + /* pdl-override-supported */ + ippAddString(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "pdl-override-supported", NULL, "attempted"); + + /* printer-op-policy-supported */ + attr = ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_NAME | IPP_TAG_COPY, + "printer-op-policy-supported", cupsArrayCount(Policies), + NULL, NULL); + for (i = 0, p = (cupsd_policy_t *)cupsArrayFirst(Policies); + p; + i ++, p = (cupsd_policy_t *)cupsArrayNext(Policies)) + attr->values[i].string.text = p->name; + + /* printer-settable-attributes-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "printer-settable-attributes-supported", + sizeof(printer_settable) / sizeof(printer_settable[0]), + NULL, printer_settable); + + /* server-is-sharing-printers */ + ippAddBoolean(CommonData, IPP_TAG_PRINTER, "server-is-sharing-printers", + BrowseLocalProtocols != 0 && Browsing); + + /* which-jobs-supported */ + ippAddStrings(CommonData, IPP_TAG_PRINTER, IPP_TAG_KEYWORD | IPP_TAG_COPY, + "which-jobs-supported", + sizeof(which_jobs) / sizeof(which_jobs[0]), NULL, which_jobs); +} + + +/* + * 'cupsdDeleteAllPrinters()' - Delete all printers from the system. + */ + +void +cupsdDeleteAllPrinters(void) +{ + cupsd_printer_t *p; /* Pointer to current printer/class */ + + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + p->op_policy_ptr = DefaultPolicyPtr; + cupsdDeletePrinter(p, 0); + } +} + +/* + * 'cupsdCmsRegisterPrinter()' - Registers a printer and profiles with the CMS + */ + +void +cupsdCmsRegisterPrinter(cupsd_printer_t *p) +{ +#if defined(HAVE_DBUS) + colordRegisterPrinter(p); +#endif /* defined(HAVE_DBUS) */ +} + +/* + * 'cupsdCmsUnregisterPrinter()' - Unregisters a printer and profiles with the CMS + */ + +void +cupsdCmsUnregisterPrinter(cupsd_printer_t *p) +{ +#if defined(HAVE_DBUS) + colordUnregisterPrinter(p); +#endif /* defined(HAVE_DBUS) */ +} + +/* + * 'cupsdCmsStart()' - Starts the CMS + */ + +void +cupsdCmsStart(void) +{ +#if defined(HAVE_DBUS) + colordStart(); +#endif /* defined(HAVE_DBUS) */ +} + +/* + * 'cupsdCmsStop()' - Stops the CMS + */ + +void +cupsdCmsStop(void) +{ +#if defined(HAVE_DBUS) + colordStop(); +#endif /* defined(HAVE_DBUS) */ +} + +/* + * 'cupsdDeletePrinter()' - Delete a printer from the system. + */ + +int /* O - 1 if classes affected, 0 otherwise */ +cupsdDeletePrinter( + cupsd_printer_t *p, /* I - Printer to delete */ + int update) /* I - Update printers.conf? */ +{ + int i, /* Looping var */ + changed = 0; /* Class changed? */ +#ifdef __sgi + char filename[1024]; /* Interface script filename */ +#endif /* __sgi */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeletePrinter(p=%p(%s), update=%d)", + p, p->name, update); + + /* + * Save the current position in the Printers array... + */ + + cupsArraySave(Printers); + + /* + * Stop printing on this printer... + */ + + cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, update); + + p->state = IPP_PRINTER_STOPPED; /* Force for browsed printers */ + + if (p->job) + cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + update ? "Job stopped due to printer being deleted." : + "Job stopped."); + + /* + * Unregister profiles... + */ + + cupsdCmsUnregisterPrinter(p); + + /* + * If this printer is the next for browsing, point to the next one... + */ + + if (p == BrowseNext) + { + cupsArrayFind(Printers, p); + BrowseNext = (cupsd_printer_t *)cupsArrayNext(Printers); + } + + /* + * Remove the printer from the list... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdDeletePrinter: Removing %s from Printers", p->name); + cupsArrayRemove(Printers, p); + + if (p->type & CUPS_PRINTER_IMPLICIT) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdDeletePrinter: Removing %s from ImplicitPrinters", + p->name); + cupsArrayRemove(ImplicitPrinters, p); + } + + /* + * Remove the dummy interface/icon/option files under IRIX... + */ + +#ifdef __sgi + snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui", + p->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name); + unlink(filename); + + snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name); + unlink(filename); +#endif /* __sgi */ + + /* + * If p is the default printer, assign a different one... + */ + + if (p == DefaultPrinter) + { + DefaultPrinter = NULL; + + if (UseNetworkDefault) + { + /* + * Find the first network default printer and use it... + */ + + cupsd_printer_t *dp; /* New default printer */ + + + for (dp = (cupsd_printer_t *)cupsArrayFirst(Printers); + dp; + dp = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (dp != p && (dp->type & CUPS_PRINTER_DEFAULT)) + { + DefaultPrinter = dp; + break; + } + } + } + + /* + * Remove this printer from any classes... + */ + + if (!(p->type & CUPS_PRINTER_IMPLICIT)) + { + changed = cupsdDeletePrinterFromClasses(p); + + /* + * Deregister from any browse protocols... + */ + + cupsdDeregisterPrinter(p, 1); + } + + /* + * Free all memory used by the printer... + */ + + if (p->printers != NULL) + free(p->printers); + + delete_printer_filters(p); + + for (i = 0; i < p->num_reasons; i ++) + _cupsStrFree(p->reasons[i]); + + ippDelete(p->attrs); + ippDelete(p->ppd_attrs); + + mimeDeleteType(MimeDatabase, p->filetype); + mimeDeleteType(MimeDatabase, p->prefiltertype); + + cupsdFreeStrings(&(p->users)); + cupsdFreeQuotas(p); + + cupsdClearString(&p->uri); + cupsdClearString(&p->hostname); + cupsdClearString(&p->name); + cupsdClearString(&p->location); + cupsdClearString(&p->make_model); + cupsdClearString(&p->info); + cupsdClearString(&p->job_sheets[0]); + cupsdClearString(&p->job_sheets[1]); + cupsdClearString(&p->device_uri); + cupsdClearString(&p->sanitized_device_uri); + cupsdClearString(&p->port_monitor); + cupsdClearString(&p->op_policy); + cupsdClearString(&p->error_policy); + + cupsdClearString(&p->alert); + cupsdClearString(&p->alert_description); + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + cupsdClearString(&p->pdl); +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ + + cupsArrayDelete(p->filetypes); + + if (p->browse_attrs) + free(p->browse_attrs); + + cupsFreeOptions(p->num_options, p->options); + + free(p); + + /* + * Restore the previous position in the Printers array... + */ + + cupsArrayRestore(Printers); + + return (changed); +} + + +/* + * 'cupsdFindDest()' - Find a destination in the list. + */ + +cupsd_printer_t * /* O - Destination in list */ +cupsdFindDest(const char *name) /* I - Name of printer or class to find */ +{ + cupsd_printer_t key; /* Search key */ + + + key.name = (char *)name; + return ((cupsd_printer_t *)cupsArrayFind(Printers, &key)); +} + + +/* + * 'cupsdFindPrinter()' - Find a printer in the list. + */ + +cupsd_printer_t * /* O - Printer in list */ +cupsdFindPrinter(const char *name) /* I - Name of printer to find */ +{ + cupsd_printer_t *p; /* Printer in list */ + + + if ((p = cupsdFindDest(name)) != NULL && (p->type & CUPS_PRINTER_CLASS)) + return (NULL); + else + return (p); +} + + +/* + * 'cupsdLoadAllPrinters()' - Load printers from the printers.conf file. + */ + +void +cupsdLoadAllPrinters(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* printers.conf file */ + int linenum; /* Current line number */ + char line[4096], /* Line from file */ + *value, /* Pointer to value */ + *valueptr; /* Pointer into value */ + cupsd_printer_t *p; /* Current printer */ + + + /* + * Open the printers.conf file... + */ + + snprintf(line, sizeof(line), "%s/printers.conf", ServerRoot); + if ((fp = cupsdOpenConfFile(line)) == NULL) + return; + + /* + * Read printer configurations until we hit EOF... + */ + + linenum = 0; + p = NULL; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + /* + * Decode the directive... + */ + + if (!_cups_strcasecmp(line, " or + */ + + if (p == NULL && value) + { + /* + * Add the printer and a base file type... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Loading printer %s...", value); + + p = cupsdAddPrinter(value); + p->accepting = 1; + p->state = IPP_PRINTER_IDLE; + + /* + * Set the default printer as needed... + */ + + if (!_cups_strcasecmp(line, "")) + { + if (p != NULL) + { + /* + * Close out the current printer... + */ + + cupsdSetPrinterAttrs(p); + + if (strncmp(p->device_uri, "file:", 5) && + p->state != IPP_PRINTER_STOPPED) + { + /* + * See if the backend exists... + */ + + snprintf(line, sizeof(line), "%s/backend/%s", ServerBin, + p->device_uri); + + if ((valueptr = strchr(line + strlen(ServerBin), ':')) != NULL) + *valueptr = '\0'; /* Chop everything but URI scheme */ + + if (access(line, 0)) + { + /* + * Backend does not exist, stop printer... + */ + + p->state = IPP_PRINTER_STOPPED; + snprintf(p->state_message, sizeof(p->state_message), + "Backend %s does not exist!", line); + } + } + + p = NULL; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!p) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "UUID")) + { + if (value && !strncmp(value, "urn:uuid:", 9)) + cupsdSetString(&(p->uuid), value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad UUID on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "AuthInfoRequired")) + { + if (!cupsdSetAuthInfoRequired(p, value, NULL)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad AuthInfoRequired on line %d of printers.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "Info")) + { + if (value) + cupsdSetString(&p->info, value); + } + else if (!_cups_strcasecmp(line, "MakeModel")) + { + if (value) + cupsdSetString(&p->make_model, value); + } + else if (!_cups_strcasecmp(line, "Location")) + { + if (value) + cupsdSetString(&p->location, value); + } + else if (!_cups_strcasecmp(line, "DeviceURI")) + { + if (value) + cupsdSetDeviceURI(p, value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "Option") && value) + { + /* + * Option name value + */ + + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (!*valueptr) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + else + { + for (; *valueptr && isspace(*valueptr & 255); *valueptr++ = '\0'); + + p->num_options = cupsAddOption(value, valueptr, p->num_options, + &(p->options)); + } + } + else if (!_cups_strcasecmp(line, "PortMonitor")) + { + if (value && strcmp(value, "none")) + cupsdSetString(&p->port_monitor, value); + else if (value) + cupsdClearString(&p->port_monitor); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "Reason")) + { + if (value && + strcmp(value, "connecting-to-device") && + strcmp(value, "cups-insecure-filter-warning") && + strcmp(value, "cups-missing-filter-warning")) + { + for (i = 0 ; i < p->num_reasons; i ++) + if (!strcmp(value, p->reasons[i])) + break; + + if (i >= p->num_reasons && + p->num_reasons < (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + p->reasons[p->num_reasons] = _cupsStrAlloc(value); + p->num_reasons ++; + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "State")) + { + /* + * Set the initial queue state... + */ + + if (value && !_cups_strcasecmp(value, "idle")) + p->state = IPP_PRINTER_IDLE; + else if (value && !_cups_strcasecmp(value, "stopped")) + { + p->state = IPP_PRINTER_STOPPED; + + for (i = 0 ; i < p->num_reasons; i ++) + if (!strcmp("paused", p->reasons[i])) + break; + + if (i >= p->num_reasons && + p->num_reasons < (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + p->reasons[p->num_reasons] = _cupsStrAlloc("paused"); + p->num_reasons ++; + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "StateMessage")) + { + /* + * Set the initial queue state message... + */ + + if (value) + strlcpy(p->state_message, value, sizeof(p->state_message)); + } + else if (!_cups_strcasecmp(line, "StateTime")) + { + /* + * Set the state time... + */ + + if (value) + p->state_time = atoi(value); + } + else if (!_cups_strcasecmp(line, "Accepting")) + { + /* + * Set the initial accepting state... + */ + + if (value && + (!_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "true"))) + p->accepting = 1; + else if (value && + (!_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "false"))) + p->accepting = 0; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "Type")) + { + if (value) + p->type = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "Shared")) + { + /* + * Set the initial shared state... + */ + + if (value && + (!_cups_strcasecmp(value, "yes") || + !_cups_strcasecmp(value, "on") || + !_cups_strcasecmp(value, "true"))) + p->shared = 1; + else if (value && + (!_cups_strcasecmp(value, "no") || + !_cups_strcasecmp(value, "off") || + !_cups_strcasecmp(value, "false"))) + p->shared = 0; + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "JobSheets")) + { + /* + * Set the initial job sheets... + */ + + if (value) + { + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (*valueptr) + *valueptr++ = '\0'; + + cupsdSetString(&p->job_sheets[0], value); + + while (isspace(*valueptr & 255)) + valueptr ++; + + if (*valueptr) + { + for (value = valueptr; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (*valueptr) + *valueptr = '\0'; + + cupsdSetString(&p->job_sheets[1], value); + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "AllowUser")) + { + if (value) + { + p->deny_users = 0; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "DenyUser")) + { + if (value) + { + p->deny_users = 1; + cupsdAddString(&(p->users), value); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "QuotaPeriod")) + { + if (value) + p->quota_period = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "PageLimit")) + { + if (value) + p->page_limit = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "KLimit")) + { + if (value) + p->k_limit = atoi(value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "OpPolicy")) + { + if (value) + { + cupsd_policy_t *pol; /* Policy */ + + + if ((pol = cupsdFindPolicy(value)) != NULL) + { + cupsdSetString(&p->op_policy, value); + p->op_policy_ptr = pol; + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad policy \"%s\" on line %d of printers.conf", + value, linenum); + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "ErrorPolicy")) + { + if (value) + cupsdSetString(&p->error_policy, value); + else + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + } + else if (!_cups_strcasecmp(line, "Attribute") && value) + { + for (valueptr = value; *valueptr && !isspace(*valueptr & 255); valueptr ++); + + if (!*valueptr) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of printers.conf.", linenum); + else + { + for (; *valueptr && isspace(*valueptr & 255); *valueptr++ = '\0'); + + if (!p->attrs) + cupsdSetPrinterAttrs(p); + + if (!strcmp(value, "marker-change-time")) + p->marker_time = atoi(valueptr); + else + cupsdSetPrinterAttr(p, value, valueptr); + } + } + else if (_cups_strcasecmp(line, "Filter") && + _cups_strcasecmp(line, "Prefilter") && + _cups_strcasecmp(line, "Product")) + { + /* + * Something else we don't understand (and that wasn't used in a prior + * release of CUPS... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown configuration directive %s on line %d of " + "printers.conf.", line, linenum); + } + } + + cupsFileClose(fp); +} + + +/* + * 'cupsdRenamePrinter()' - Rename a printer. + */ + +void +cupsdRenamePrinter( + cupsd_printer_t *p, /* I - Printer */ + const char *name) /* I - New name */ +{ + /* + * Remove the printer from the array(s) first... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdRenamePrinter: Removing %s from Printers", p->name); + cupsArrayRemove(Printers, p); + + if (p->type & CUPS_PRINTER_IMPLICIT) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdRenamePrinter: Removing %s from ImplicitPrinters", + p->name); + cupsArrayRemove(ImplicitPrinters, p); + } + + /* + * Rename the printer type... + */ + + mimeDeleteType(MimeDatabase, p->filetype); + p->filetype = mimeAddType(MimeDatabase, "printer", name); + + if (p->prefiltertype) + { + mimeDeleteType(MimeDatabase, p->prefiltertype); + p->prefiltertype = mimeAddType(MimeDatabase, "prefilter", name); + } + + /* + * Unregister profiles... + */ + + cupsdCmsUnregisterPrinter(p); + + /* + * Rename the printer... + */ + + cupsdSetString(&p->name, name); + + /* + * Reset printer attributes... + */ + + cupsdSetPrinterAttrs(p); + + /* + * Add the printer back to the printer array(s)... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdRenamePrinter: Adding %s to Printers", p->name); + cupsArrayAdd(Printers, p); + + if (p->type & CUPS_PRINTER_IMPLICIT) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdRenamePrinter: Adding %s to ImplicitPrinters", + p->name); + cupsArrayAdd(ImplicitPrinters, p); + } +} + + +/* + * 'cupsdSaveAllPrinters()' - Save all printer definitions to the printers.conf + * file. + */ + +void +cupsdSaveAllPrinters(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* printers.conf file */ + char filename[1024], /* printers.conf filename */ + temp[1024], /* Temporary string */ + value[2048], /* Value string */ + *ptr, /* Pointer into value */ + *name; /* Current user/group name */ + cupsd_printer_t *printer; /* Current printer class */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + cups_option_t *option; /* Current option */ + ipp_attribute_t *marker; /* Current marker attribute */ + + + /* + * Create the printers.conf file... + */ + + snprintf(filename, sizeof(filename), "%s/printers.conf", ServerRoot); + + if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm & 0600)) == NULL) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Saving printers.conf..."); + + /* + * Write a small header to the file... + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Printer configuration file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd\n"); + cupsFilePuts(fp, "# DO NOT EDIT THIS FILE WHEN CUPSD IS RUNNING\n"); + + /* + * Write each local printer known to the system... + */ + + for (printer = (cupsd_printer_t *)cupsArrayFirst(Printers); + printer; + printer = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Skip remote destinations and printer classes... + */ + + if ((printer->type & CUPS_PRINTER_DISCOVERED) || + (printer->type & CUPS_PRINTER_CLASS) || + (printer->type & CUPS_PRINTER_IMPLICIT)) + continue; + + /* + * Write printers as needed... + */ + + if (printer == DefaultPrinter) + cupsFilePrintf(fp, "\n", printer->name); + else + cupsFilePrintf(fp, "\n", printer->name); + + cupsFilePrintf(fp, "UUID %s\n", printer->uuid); + + if (printer->num_auth_info_required > 0) + { + switch (printer->num_auth_info_required) + { + case 1 : + strlcpy(value, printer->auth_info_required[0], sizeof(value)); + break; + + case 2 : + snprintf(value, sizeof(value), "%s,%s", + printer->auth_info_required[0], + printer->auth_info_required[1]); + break; + + case 3 : + default : + snprintf(value, sizeof(value), "%s,%s,%s", + printer->auth_info_required[0], + printer->auth_info_required[1], + printer->auth_info_required[2]); + break; + } + + cupsFilePutConf(fp, "AuthInfoRequired", value); + } + + if (printer->info) + cupsFilePutConf(fp, "Info", printer->info); + + if (printer->location) + cupsFilePutConf(fp, "Location", printer->location); + + if (printer->make_model) + cupsFilePutConf(fp, "MakeModel", printer->make_model); + + cupsFilePutConf(fp, "DeviceURI", printer->device_uri); + + if (printer->port_monitor) + cupsFilePutConf(fp, "PortMonitor", printer->port_monitor); + + if (printer->state == IPP_PRINTER_STOPPED) + { + cupsFilePuts(fp, "State Stopped\n"); + + if (printer->state_message) + cupsFilePutConf(fp, "StateMessage", printer->state_message); + } + else + cupsFilePuts(fp, "State Idle\n"); + + cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time); + + for (i = 0; i < printer->num_reasons; i ++) + if (strcmp(printer->reasons[i], "connecting-to-device") && + strcmp(printer->reasons[i], "cups-insecure-filter-warning") && + strcmp(printer->reasons[i], "cups-missing-filter-warning")) + cupsFilePutConf(fp, "Reason", printer->reasons[i]); + + cupsFilePrintf(fp, "Type %d\n", printer->type); + + if (printer->accepting) + cupsFilePuts(fp, "Accepting Yes\n"); + else + cupsFilePuts(fp, "Accepting No\n"); + + if (printer->shared) + cupsFilePuts(fp, "Shared Yes\n"); + else + cupsFilePuts(fp, "Shared No\n"); + + snprintf(value, sizeof(value), "%s %s", printer->job_sheets[0], + printer->job_sheets[1]); + cupsFilePutConf(fp, "JobSheets", value); + + cupsFilePrintf(fp, "QuotaPeriod %d\n", printer->quota_period); + cupsFilePrintf(fp, "PageLimit %d\n", printer->page_limit); + cupsFilePrintf(fp, "KLimit %d\n", printer->k_limit); + + for (name = (char *)cupsArrayFirst(printer->users); + name; + name = (char *)cupsArrayNext(printer->users)) + cupsFilePutConf(fp, printer->deny_users ? "DenyUser" : "AllowUser", name); + + if (printer->op_policy) + cupsFilePutConf(fp, "OpPolicy", printer->op_policy); + if (printer->error_policy) + cupsFilePutConf(fp, "ErrorPolicy", printer->error_policy); + + for (i = printer->num_options, option = printer->options; + i > 0; + i --, option ++) + { + snprintf(value, sizeof(value), "%s %s", option->name, option->value); + cupsFilePutConf(fp, "Option", value); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-colors", + IPP_TAG_NAME)) != NULL) + { + snprintf(value, sizeof(value), "%s ", marker->name); + + for (i = 0, ptr = value + strlen(value); + i < marker->num_values && ptr < (value + sizeof(value) - 1); + i ++) + { + if (i) + *ptr++ = ','; + + strlcpy(ptr, marker->values[i].string.text, + value + sizeof(value) - ptr); + ptr += strlen(ptr); + } + + *ptr = '\0'; + cupsFilePutConf(fp, "Attribute", value); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-levels", + IPP_TAG_INTEGER)) != NULL) + { + cupsFilePrintf(fp, "Attribute %s %d", marker->name, + marker->values[0].integer); + for (i = 1; i < marker->num_values; i ++) + cupsFilePrintf(fp, ",%d", marker->values[i].integer); + cupsFilePuts(fp, "\n"); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-low-levels", + IPP_TAG_INTEGER)) != NULL) + { + cupsFilePrintf(fp, "Attribute %s %d", marker->name, + marker->values[0].integer); + for (i = 1; i < marker->num_values; i ++) + cupsFilePrintf(fp, ",%d", marker->values[i].integer); + cupsFilePuts(fp, "\n"); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-high-levels", + IPP_TAG_INTEGER)) != NULL) + { + cupsFilePrintf(fp, "Attribute %s %d", marker->name, + marker->values[0].integer); + for (i = 1; i < marker->num_values; i ++) + cupsFilePrintf(fp, ",%d", marker->values[i].integer); + cupsFilePuts(fp, "\n"); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-message", + IPP_TAG_TEXT)) != NULL) + { + snprintf(value, sizeof(value), "%s %s", marker->name, + marker->values[0].string.text); + + cupsFilePutConf(fp, "Attribute", value); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-names", + IPP_TAG_NAME)) != NULL) + { + snprintf(value, sizeof(value), "%s ", marker->name); + + for (i = 0, ptr = value + strlen(value); + i < marker->num_values && ptr < (value + sizeof(value) - 1); + i ++) + { + if (i) + *ptr++ = ','; + + strlcpy(ptr, marker->values[i].string.text, + value + sizeof(value) - ptr); + ptr += strlen(ptr); + } + + *ptr = '\0'; + cupsFilePutConf(fp, "Attribute", value); + } + + if ((marker = ippFindAttribute(printer->attrs, "marker-types", + IPP_TAG_KEYWORD)) != NULL) + { + snprintf(value, sizeof(value), "%s ", marker->name); + + for (i = 0, ptr = value + strlen(value); + i < marker->num_values && ptr < (value + sizeof(value) - 1); + i ++) + { + if (i) + *ptr++ = ','; + + strlcpy(ptr, marker->values[i].string.text, + value + sizeof(value) - ptr); + ptr += strlen(ptr); + } + + *ptr = '\0'; + cupsFilePutConf(fp, "Attribute", value); + } + + if (printer->marker_time) + cupsFilePrintf(fp, "Attribute marker-change-time %ld\n", + (long)printer->marker_time); + + cupsFilePuts(fp, "\n"); + +#ifdef __sgi + /* + * Make IRIX desktop & printer status happy + */ + + write_irix_state(printer); +#endif /* __sgi */ + } + + cupsdCloseCreatedConfFile(fp, filename); +} + + +/* + * 'cupsdSetAuthInfoRequired()' - Set the required authentication info. + */ + +int /* O - 1 if value OK, 0 otherwise */ +cupsdSetAuthInfoRequired( + cupsd_printer_t *p, /* I - Printer */ + const char *values, /* I - Plain text value (or NULL) */ + ipp_attribute_t *attr) /* I - IPP attribute value (or NULL) */ +{ + int i; /* Looping var */ + + + p->num_auth_info_required = 0; + + /* + * Do we have a plain text value? + */ + + if (values) + { + /* + * Yes, grab the keywords... + */ + + const char *end; /* End of current value */ + + + while (*values && p->num_auth_info_required < 4) + { + if ((end = strchr(values, ',')) == NULL) + end = values + strlen(values); + + if ((end - values) == 4 && !strncmp(values, "none", 4)) + { + if (p->num_auth_info_required != 0 || *end) + return (0); + + p->auth_info_required[p->num_auth_info_required] = "none"; + p->num_auth_info_required ++; + + return (1); + } + else if ((end - values) == 9 && !strncmp(values, "negotiate", 9)) + { + if (p->num_auth_info_required != 0 || *end) + return (0); + + p->auth_info_required[p->num_auth_info_required] = "negotiate"; + p->num_auth_info_required ++; + + /* + * Don't allow sharing of queues that require Kerberos authentication. + */ + + if (p->shared) + { + cupsdDeregisterPrinter(p, 1); + p->shared = 0; + } + } + else if ((end - values) == 6 && !strncmp(values, "domain", 6)) + { + p->auth_info_required[p->num_auth_info_required] = "domain"; + p->num_auth_info_required ++; + } + else if ((end - values) == 8 && !strncmp(values, "password", 8)) + { + p->auth_info_required[p->num_auth_info_required] = "password"; + p->num_auth_info_required ++; + } + else if ((end - values) == 8 && !strncmp(values, "username", 8)) + { + p->auth_info_required[p->num_auth_info_required] = "username"; + p->num_auth_info_required ++; + } + else + return (0); + + values = (*end) ? end + 1 : end; + } + + if (p->num_auth_info_required == 0) + { + p->auth_info_required[0] = "none"; + p->num_auth_info_required = 1; + } + + /* + * Update the printer-type value as needed... + */ + + if (p->num_auth_info_required > 1 || + strcmp(p->auth_info_required[0], "none")) + p->type |= CUPS_PRINTER_AUTHENTICATED; + else + p->type &= ~CUPS_PRINTER_AUTHENTICATED; + + return (1); + } + + /* + * Grab values from an attribute instead... + */ + + if (!attr || attr->num_values > 4) + return (0); + + for (i = 0; i < attr->num_values; i ++) + { + if (!strcmp(attr->values[i].string.text, "none")) + { + if (p->num_auth_info_required != 0 || attr->num_values != 1) + return (0); + + p->auth_info_required[p->num_auth_info_required] = "none"; + p->num_auth_info_required ++; + + return (1); + } + else if (!strcmp(attr->values[i].string.text, "negotiate")) + { + if (p->num_auth_info_required != 0 || attr->num_values != 1) + return (0); + + p->auth_info_required[p->num_auth_info_required] = "negotiate"; + p->num_auth_info_required ++; + + /* + * Don't allow sharing of queues that require Kerberos authentication. + */ + + if (p->shared) + { + cupsdDeregisterPrinter(p, 1); + p->shared = 0; + } + + return (1); + } + else if (!strcmp(attr->values[i].string.text, "domain")) + { + p->auth_info_required[p->num_auth_info_required] = "domain"; + p->num_auth_info_required ++; + } + else if (!strcmp(attr->values[i].string.text, "password")) + { + p->auth_info_required[p->num_auth_info_required] = "password"; + p->num_auth_info_required ++; + } + else if (!strcmp(attr->values[i].string.text, "username")) + { + p->auth_info_required[p->num_auth_info_required] = "username"; + p->num_auth_info_required ++; + } + else + return (0); + } + + return (1); +} + + +/* + * 'cupsdSetDeviceURI()' - Set the device URI for a printer. + */ + +void +cupsdSetDeviceURI(cupsd_printer_t *p, /* I - Printer */ + const char *uri) /* I - Device URI */ +{ + char buffer[1024], /* URI buffer */ + *start, /* Start of data after scheme */ + *slash, /* First slash after scheme:// */ + *ptr; /* Pointer into user@host:port part */ + + + /* + * Set the full device URI.. + */ + + cupsdSetString(&(p->device_uri), uri); + + /* + * Copy the device URI to a temporary buffer so we can sanitize any auth + * info in it... + */ + + strlcpy(buffer, uri, sizeof(buffer)); + + /* + * Find the end of the scheme:// part... + */ + + if ((ptr = strchr(buffer, ':')) != NULL) + { + for (start = ptr + 1; *start; start ++) + if (*start != '/') + break; + + /* + * Find the next slash (/) in the URI... + */ + + if ((slash = strchr(start, '/')) == NULL) + slash = start + strlen(start); /* No slash, point to the end */ + + /* + * Check for an @ sign before the slash... + */ + + if ((ptr = strchr(start, '@')) != NULL && ptr < slash) + { + /* + * Found an @ sign and it is before the resource part, so we have + * an authentication string. Copy the remaining URI over the + * authentication string... + */ + + _cups_strcpy(start, ptr + 1); + } + } + + /* + * Save the sanitized URI... + */ + + cupsdSetString(&(p->sanitized_device_uri), buffer); +} + + +/* + * 'cupsdSetPrinterAttr()' - Set a printer attribute. + */ + +void +cupsdSetPrinterAttr( + cupsd_printer_t *p, /* I - Printer */ + const char *name, /* I - Attribute name */ + char *value) /* I - Attribute value string */ +{ + ipp_attribute_t *attr; /* Attribute */ + int i, /* Looping var */ + count; /* Number of values */ + char *ptr, /* Pointer into value */ + *start, /* Start of value */ + quote; /* Quote character */ + ipp_tag_t value_tag; /* Value tag for this attribute */ + + + /* + * Don't allow empty values... + */ + + if (!*value && strcmp(name, "marker-message")) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Ignoring empty \"%s\" attribute", name); + return; + } + + /* + * Count the number of values... + */ + + for (count = 1, quote = '\0', ptr = value; + *ptr; + ptr ++) + { + if (*ptr == quote) + quote = '\0'; + else if (quote) + continue; + else if (*ptr == '\\' && ptr[1]) + ptr ++; + else if (*ptr == '\'' || *ptr == '\"') + quote = *ptr; + else if (*ptr == ',') + count ++; + } + + /* + * Then add or update the attribute as needed... + */ + + if (!strcmp(name, "marker-levels") || !strcmp(name, "marker-low-levels") || + !strcmp(name, "marker-high-levels")) + { + /* + * Integer values... + */ + + if ((attr = ippFindAttribute(p->attrs, name, IPP_TAG_INTEGER)) != NULL && + attr->num_values < count) + { + ippDeleteAttribute(p->attrs, attr); + attr = NULL; + } + + if (attr) + attr->num_values = count; + else + attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, name, + count, NULL); + + if (!attr) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for printer attribute " + "(%d values)", count); + return; + } + + for (i = 0; i < count; i ++) + { + if ((ptr = strchr(value, ',')) != NULL) + *ptr++ = '\0'; + + attr->values[i].integer = strtol(value, NULL, 10); + + if (ptr) + value = ptr; + } + } + else + { + /* + * Name or keyword values... + */ + + if (!strcmp(name, "marker-types")) + value_tag = IPP_TAG_KEYWORD; + else if (!strcmp(name, "marker-message")) + value_tag = IPP_TAG_TEXT; + else + value_tag = IPP_TAG_NAME; + + if ((attr = ippFindAttribute(p->attrs, name, value_tag)) != NULL && + attr->num_values < count) + { + ippDeleteAttribute(p->attrs, attr); + attr = NULL; + } + + if (attr) + { + for (i = 0; i < attr->num_values; i ++) + _cupsStrFree(attr->values[i].string.text); + + attr->num_values = count; + } + else + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, value_tag, name, + count, NULL, NULL); + + if (!attr) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate memory for printer attribute " + "(%d values)", count); + return; + } + + for (i = 0, quote = '\0', ptr = value; i < count; i ++) + { + for (start = ptr; *ptr; ptr ++) + { + if (*ptr == quote) + *ptr = quote = '\0'; + else if (quote) + continue; + else if (*ptr == '\\' && ptr[1]) + _cups_strcpy(ptr, ptr + 1); + else if (*ptr == '\'' || *ptr == '\"') + { + quote = *ptr; + + if (ptr == start) + start ++; + else + _cups_strcpy(ptr, ptr + 1); + } + else if (*ptr == ',') + { + *ptr++ = '\0'; + break; + } + } + + attr->values[i].string.text = _cupsStrAlloc(start); + } + } +} + + +/* + * 'cupsdSetPrinterAttrs()' - Set printer attributes based upon the PPD file. + */ + +void +cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ +{ + int i, /* Looping var */ + length; /* Length of browse attributes */ + char resource[HTTP_MAX_URI]; /* Resource portion of URI */ + int num_air; /* Number of auth-info-required values */ + const char * const *air; /* auth-info-required values */ + cupsd_location_t *auth; /* Pointer to authentication element */ + const char *auth_supported; /* Authentication supported */ + ipp_t *oldattrs; /* Old printer attributes */ + ipp_attribute_t *attr; /* Attribute data */ + cups_option_t *option; /* Current printer option */ + char *name, /* Current user/group name */ + *filter; /* Current filter */ + static const char * const air_none[] = + { /* No authentication */ + "none" + }; + static const char * const air_userpass[] = + { /* Basic/Digest authentication */ + "username", + "password" + }; + + + DEBUG_printf(("cupsdSetPrinterAttrs: entering name = %s, type = %x\n", p->name, + p->type)); + + /* + * Make sure that we have the common attributes defined... + */ + + if (!CommonData) + cupsdCreateCommonData(); + + /* + * Clear out old filters, if any... + */ + + delete_printer_filters(p); + + /* + * Figure out the authentication that is required for the printer. + */ + + auth_supported = "requesting-user-name"; + num_air = 1; + air = air_none; + + if (p->num_auth_info_required > 0 && strcmp(p->auth_info_required[0], "none")) + { + num_air = p->num_auth_info_required; + air = p->auth_info_required; + } + else if ((p->type & CUPS_PRINTER_AUTHENTICATED) && + (p->type & CUPS_PRINTER_DISCOVERED)) + { + num_air = 2; + air = air_userpass; + } + + if (p->type & CUPS_PRINTER_CLASS) + snprintf(resource, sizeof(resource), "/classes/%s", p->name); + else + snprintf(resource, sizeof(resource), "/printers/%s", p->name); + + if ((auth = cupsdFindBest(resource, HTTP_POST)) == NULL || + auth->type == CUPSD_AUTH_NONE) + auth = cupsdFindPolicyOp(p->op_policy_ptr, IPP_PRINT_JOB); + + if (auth) + { + int auth_type; /* Authentication type */ + + + if ((auth_type = auth->type) == CUPSD_AUTH_DEFAULT) + auth_type = DefaultAuthType; + + if (auth_type == CUPSD_AUTH_BASIC || auth_type == CUPSD_AUTH_BASICDIGEST) + auth_supported = "basic"; + else if (auth_type == CUPSD_AUTH_DIGEST) + auth_supported = "digest"; +#ifdef HAVE_GSSAPI + else if (auth_type == CUPSD_AUTH_NEGOTIATE) + auth_supported = "negotiate"; +#endif /* HAVE_GSSAPI */ + + if (!(p->type & CUPS_PRINTER_DISCOVERED)) + { + if (auth_type != CUPSD_AUTH_NONE) + p->type |= CUPS_PRINTER_AUTHENTICATED; + else + p->type &= ~CUPS_PRINTER_AUTHENTICATED; + } + } + else if (!(p->type & CUPS_PRINTER_DISCOVERED)) + p->type &= ~CUPS_PRINTER_AUTHENTICATED; + + /* + * Create the required IPP attributes for a printer... + */ + + oldattrs = p->attrs; + p->attrs = ippNew(); + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "uri-authentication-supported", NULL, auth_supported); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "uri-security-supported", NULL, "none"); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "printer-name", NULL, + p->name); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-location", + NULL, p->location ? p->location : ""); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "printer-info", + NULL, p->info ? p->info : ""); + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-uuid", NULL, + p->uuid); + + if (cupsArrayCount(p->users) > 0) + { + if (p->deny_users) + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "requesting-user-name-denied", + cupsArrayCount(p->users), NULL, NULL); + else + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "requesting-user-name-allowed", + cupsArrayCount(p->users), NULL, NULL); + + for (i = 0, name = (char *)cupsArrayFirst(p->users); + name; + i ++, name = (char *)cupsArrayNext(p->users)) + attr->values[i].string.text = _cupsStrRetain(name); + } + + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "job-quota-period", p->quota_period); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "job-k-limit", p->k_limit); + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "job-page-limit", p->page_limit); + ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "auth-info-required", num_air, NULL, air); + + if (cupsArrayCount(Banners) > 0 && !(p->type & CUPS_PRINTER_DISCOVERED)) + { + /* + * Setup the job-sheets-default attribute... + */ + + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "job-sheets-default", 2, NULL, NULL); + + if (attr != NULL) + { + attr->values[0].string.text = _cupsStrAlloc(Classification ? + Classification : p->job_sheets[0]); + attr->values[1].string.text = _cupsStrAlloc(Classification ? + Classification : p->job_sheets[1]); + } + } + + p->raw = 0; + p->remote = 0; + + if (p->type & CUPS_PRINTER_DISCOVERED) + { + /* + * Tell the client this is a remote printer of some type... + */ + + if (strchr(p->uri, '?')) + { + /* + * Strip trailing "?options" from URI... + */ + + char *ptr; /* Pointer into URI */ + + strlcpy(resource, p->uri, sizeof(resource)); + if ((ptr = strchr(resource, '?')) != NULL) + *ptr = '\0'; + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-uri-supported", NULL, resource); + } + else + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-uri-supported", NULL, p->uri); + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "printer-more-info", + NULL, p->uri); + + if (p->make_model) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, p->make_model); + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL, + p->uri); + + p->raw = 1; + p->remote = 1; + } + else + { + /* + * Assign additional attributes depending on whether this is a printer + * or class... + */ + + if (p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + p->raw = 1; + p->type &= ~CUPS_PRINTER_OPTIONS; + + /* + * Add class-specific attributes... + */ + + if ((p->type & CUPS_PRINTER_IMPLICIT) && p->num_printers > 0 && + p->printers[0]->make_model) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, p->printers[0]->make_model); + else + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, "Local Printer Class"); + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL, + "file:///dev/null"); + + if (p->num_printers > 0) + { + /* + * Add a list of member names; URIs are added in copy_printer_attrs... + */ + + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "member-names", p->num_printers, NULL, NULL); + p->type |= CUPS_PRINTER_OPTIONS; + + for (i = 0; i < p->num_printers; i ++) + { + if (attr != NULL) + attr->values[i].string.text = _cupsStrRetain(p->printers[i]->name); + + p->type &= ~CUPS_PRINTER_OPTIONS | p->printers[i]->type; + } + } + } + else + { + /* + * Add printer-specific attributes... + */ + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, "device-uri", NULL, + p->sanitized_device_uri); + + /* + * Assign additional attributes from the PPD file (if any)... + */ + + load_ppd(p); + + /* + * Add filters for printer... + */ + + cupsdSetPrinterReasons(p, "-cups-missing-filter-warning," + "cups-insecure-filter-warning"); + + if (p->pc && p->pc->filters) + { + for (filter = (char *)cupsArrayFirst(p->pc->filters); + filter; + filter = (char *)cupsArrayNext(p->pc->filters)) + add_printer_filter(p, p->filetype, filter); + } + else if (!(p->type & CUPS_PRINTER_REMOTE)) + { + char interface[1024]; /* Interface script */ + + + snprintf(interface, sizeof(interface), "%s/interfaces/%s", ServerRoot, + p->name); + if (!access(interface, X_OK)) + { + /* + * Yes, we have a System V style interface script; use it! + */ + + snprintf(interface, sizeof(interface), "*/* 0 %s/interfaces/%s", + ServerRoot, p->name); + add_printer_filter(p, p->filetype, interface); + } + else + { + /* + * Add a filter from application/vnd.cups-raw to printer/name to + * handle "raw" printing by users. + */ + + add_printer_filter(p, p->filetype, "application/vnd.cups-raw 0 -"); + + /* + * Add a PostScript filter, since this is still possibly PS printer. + */ + + add_printer_filter(p, p->filetype, + "application/vnd.cups-postscript 0 -"); + } + } + + if (p->pc && p->pc->prefilters) + { + if (!p->prefiltertype) + p->prefiltertype = mimeAddType(MimeDatabase, "prefilter", p->name); + + for (filter = (char *)cupsArrayFirst(p->pc->prefilters); + filter; + filter = (char *)cupsArrayNext(p->pc->prefilters)) + add_printer_filter(p, p->prefiltertype, filter); + } + } + } + + /* + * Copy marker attributes as needed... + */ + + if (oldattrs) + { + ipp_attribute_t *oldattr; /* Old attribute */ + + + if ((oldattr = ippFindAttribute(oldattrs, "marker-colors", + IPP_TAG_NAME)) != NULL) + { + if ((attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "marker-colors", oldattr->num_values, NULL, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].string.text = + _cupsStrRetain(oldattr->values[i].string.text); + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-levels", + IPP_TAG_INTEGER)) != NULL) + { + if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-levels", oldattr->num_values, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].integer = oldattr->values[i].integer; + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-message", + IPP_TAG_TEXT)) != NULL) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, "marker-message", + NULL, oldattr->values[0].string.text); + + if ((oldattr = ippFindAttribute(oldattrs, "marker-low-levels", + IPP_TAG_INTEGER)) != NULL) + { + if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-low-levels", oldattr->num_values, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].integer = oldattr->values[i].integer; + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-high-levels", + IPP_TAG_INTEGER)) != NULL) + { + if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-high-levels", oldattr->num_values, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].integer = oldattr->values[i].integer; + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-names", + IPP_TAG_NAME)) != NULL) + { + if ((attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "marker-names", oldattr->num_values, NULL, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].string.text = + _cupsStrRetain(oldattr->values[i].string.text); + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-types", + IPP_TAG_KEYWORD)) != NULL) + { + if ((attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "marker-types", oldattr->num_values, NULL, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].string.text = + _cupsStrRetain(oldattr->values[i].string.text); + } + } + + ippDelete(oldattrs); + } + + /* + * Force sharing off for remote queues... + */ + + if (p->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) + p->shared = 0; + else + { + /* + * Copy the printer options into a browse attributes string we can re-use. + */ + + const char *valptr; /* Pointer into value */ + char *attrptr; /* Pointer into attribute string */ + + + /* + * Free the old browse attributes as needed... + */ + + if (p->browse_attrs) + free(p->browse_attrs); + + /* + * Compute the length of all attributes + job-sheets, lease-duration, + * and BrowseLocalOptions. + */ + + for (length = 1, i = p->num_options, option = p->options; + i > 0; + i --, option ++) + { + length += strlen(option->name) + 2; + + if (option->value) + { + for (valptr = option->value; *valptr; valptr ++) + if (strchr(" \"\'\\", *valptr)) + length += 2; + else + length ++; + } + } + + length += 13 + strlen(p->job_sheets[0]) + strlen(p->job_sheets[1]); + length += 32; + if (BrowseLocalOptions) + length += 12 + strlen(BrowseLocalOptions); + + /* + * Allocate the new string... + */ + + if ((p->browse_attrs = calloc(1, length)) == NULL) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to allocate %d bytes for browse data!", + length); + else + { + /* + * Got the allocated string, now copy the options and attributes over... + */ + + sprintf(p->browse_attrs, "job-sheets=%s,%s lease-duration=%d", + p->job_sheets[0], p->job_sheets[1], BrowseTimeout); + attrptr = p->browse_attrs + strlen(p->browse_attrs); + + if (BrowseLocalOptions) + { + sprintf(attrptr, " ipp-options=%s", BrowseLocalOptions); + attrptr += strlen(attrptr); + } + + for (i = p->num_options, option = p->options; + i > 0; + i --, option ++) + { + *attrptr++ = ' '; + strcpy(attrptr, option->name); + attrptr += strlen(attrptr); + + if (option->value) + { + *attrptr++ = '='; + + for (valptr = option->value; *valptr; valptr ++) + { + if (strchr(" \"\'\\", *valptr)) + *attrptr++ = '\\'; + + *attrptr++ = *valptr; + } + } + } + } + } + + /* + * Populate the document-format-supported attribute... + */ + + add_printer_formats(p); + + DEBUG_printf(("cupsdSetPrinterAttrs: leaving name = %s, type = %x\n", p->name, + p->type)); + + /* + * Add name-default attributes... + */ + + add_printer_defaults(p); + +#ifdef __sgi + /* + * Write the IRIX printer config and status files... + */ + + write_irix_config(p); + write_irix_state(p); +#endif /* __sgi */ + + /* + * Re-register profiles... + */ + + cupsdCmsUnregisterPrinter(p); + cupsdCmsRegisterPrinter(p); + + /* + * Let the browse protocols reflect the change + */ + + cupsdRegisterPrinter(p); +} + + +/* + * 'cupsdSetPrinterReasons()' - Set/update the reasons strings. + */ + +int /* O - 1 if something changed, 0 otherwise */ +cupsdSetPrinterReasons( + cupsd_printer_t *p, /* I - Printer */ + const char *s) /* I - Reasons strings */ +{ + int i, /* Looping var */ + changed = 0; /* Did something change? */ + const char *sptr; /* Pointer into reasons */ + char reason[255], /* Reason string */ + *rptr; /* Pointer into reason */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s); + + if (s[0] == '-' || s[0] == '+') + { + /* + * Add/remove reasons... + */ + + sptr = s + 1; + } + else + { + /* + * Replace reasons... + */ + + sptr = s; + + for (i = 0; i < p->num_reasons; i ++) + _cupsStrFree(p->reasons[i]); + + p->num_reasons = 0; + changed = 1; + + dirty_printer(p); + } + + if (!strcmp(s, "none")) + return (changed); + + /* + * Loop through all of the reasons... + */ + + while (*sptr) + { + /* + * Skip leading whitespace and commas... + */ + + while (isspace(*sptr & 255) || *sptr == ',') + sptr ++; + + for (rptr = reason; *sptr && !isspace(*sptr & 255) && *sptr != ','; sptr ++) + if (rptr < (reason + sizeof(reason) - 1)) + *rptr++ = *sptr; + + if (rptr == reason) + break; + + *rptr = '\0'; + + if (s[0] == '-') + { + /* + * Remove reason... + */ + + for (i = 0; i < p->num_reasons; i ++) + if (!strcmp(reason, p->reasons[i])) + { + /* + * Found a match, so remove it... + */ + + p->num_reasons --; + changed = 1; + _cupsStrFree(p->reasons[i]); + + if (i < p->num_reasons) + memmove(p->reasons + i, p->reasons + i + 1, + (p->num_reasons - i) * sizeof(char *)); + + if (!strcmp(reason, "paused") && p->state == IPP_PRINTER_STOPPED) + cupsdSetPrinterState(p, IPP_PRINTER_IDLE, 1); + + if (strcmp(reason, "connecting-to-device")) + dirty_printer(p); + break; + } + } + else if (p->num_reasons < (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + /* + * Add reason... + */ + + for (i = 0; i < p->num_reasons; i ++) + if (!strcmp(reason, p->reasons[i])) + break; + + if (i >= p->num_reasons) + { + if (!strncmp(reason, "cups-ipp-missing-", 17) || + !strncmp(reason, "cups-ipp-wrong-", 15)) + log_ipp_conformance(p, reason); + + if (i >= (int)(sizeof(p->reasons) / sizeof(p->reasons[0]))) + { + cupsdLogMessage(CUPSD_LOG_ALERT, + "Too many printer-state-reasons values for %s (%d)", + p->name, i + 1); + return (changed); + } + + p->reasons[i] = _cupsStrAlloc(reason); + p->num_reasons ++; + changed = 1; + + if (!strcmp(reason, "paused") && p->state != IPP_PRINTER_STOPPED) + cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, 1); + + if (strcmp(reason, "connecting-to-device")) + dirty_printer(p); + } + } + } + + return (changed); +} + + +/* + * 'cupsdSetPrinterState()' - Update the current state of a printer. + */ + +void +cupsdSetPrinterState( + cupsd_printer_t *p, /* I - Printer to change */ + ipp_pstate_t s, /* I - New state */ + int update) /* I - Update printers.conf? */ +{ + ipp_pstate_t old_state; /* Old printer state */ + static const char * const printer_states[] = + { /* State strings */ + "idle", + "processing", + "stopped" + }; + + + /* + * Can't set status of remote printers... + */ + + if (p->type & CUPS_PRINTER_DISCOVERED) + return; + + /* + * Set the new state... + */ + + old_state = p->state; + p->state = s; + + if (old_state != s) + { + cupsdAddEvent(s == IPP_PRINTER_STOPPED ? CUPSD_EVENT_PRINTER_STOPPED : + CUPSD_EVENT_PRINTER_STATE, p, NULL, + "%s \"%s\" state changed to %s.", + (p->type & CUPS_PRINTER_CLASS) ? "Class" : "Printer", + p->name, printer_states[p->state - IPP_PRINTER_IDLE]); + + /* + * Let the browse code know this needs to be updated... + */ + + BrowseNext = p; + p->state_time = time(NULL); + p->browse_time = 0; + +#ifdef __sgi + write_irix_state(p); +#endif /* __sgi */ + } + + /* + * Set/clear the paused reason as needed... + */ + + if (s == IPP_PRINTER_STOPPED) + cupsdSetPrinterReasons(p, "+paused"); + else + cupsdSetPrinterReasons(p, "-paused"); + + /* + * Clear the message for the queue when going to processing... + */ + + if (s == IPP_PRINTER_PROCESSING) + p->state_message[0] = '\0'; + + /* + * Let the browse protocols reflect the change... + */ + + if (update) + cupsdRegisterPrinter(p); + + /* + * Save the printer configuration if a printer goes from idle or processing + * to stopped (or visa-versa)... + */ + + if (update && + (old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED)) + dirty_printer(p); +} + + +/* + * 'cupsdStopPrinter()' - Stop a printer from printing any jobs... + */ + +void +cupsdStopPrinter(cupsd_printer_t *p, /* I - Printer to stop */ + int update)/* I - Update printers.conf? */ +{ + /* + * Set the printer state... + */ + + cupsdSetPrinterState(p, IPP_PRINTER_STOPPED, update); + + /* + * See if we have a job printing on this printer... + */ + + if (p->job && p->job->state_value == IPP_JOB_PROCESSING) + cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job stopped due to printer being paused."); +} + + +/* + * 'cupsdUpdatePrinterPPD()' - Update keywords in a printer's PPD file. + */ + +int /* O - 1 if successful, 0 otherwise */ +cupsdUpdatePrinterPPD( + cupsd_printer_t *p, /* I - Printer */ + int num_keywords, /* I - Number of keywords */ + cups_option_t *keywords) /* I - Keywords */ +{ + int i; /* Looping var */ + cups_file_t *src, /* Original file */ + *dst; /* New file */ + char srcfile[1024], /* Original filename */ + dstfile[1024], /* New filename */ + line[1024], /* Line from file */ + keystring[41]; /* Keyword from line */ + cups_option_t *keyword; /* Current keyword */ + + + cupsdLogMessage(CUPSD_LOG_INFO, "Updating keywords in PPD file for %s...", + p->name); + + /* + * Get the old and new PPD filenames... + */ + + snprintf(srcfile, sizeof(srcfile), "%s/ppd/%s.ppd.O", ServerRoot, p->name); + snprintf(dstfile, sizeof(srcfile), "%s/ppd/%s.ppd", ServerRoot, p->name); + + /* + * Rename the old file and open the old and new... + */ + + if (rename(dstfile, srcfile)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to backup PPD file for %s: %s", + p->name, strerror(errno)); + return (0); + } + + if ((src = cupsFileOpen(srcfile, "r")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to open PPD file \"%s\": %s", + srcfile, strerror(errno)); + rename(srcfile, dstfile); + return (0); + } + + if ((dst = cupsFileOpen(dstfile, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create PPD file \"%s\": %s", + dstfile, strerror(errno)); + cupsFileClose(src); + rename(srcfile, dstfile); + return (0); + } + + /* + * Copy the first line and then write out all of the keywords... + */ + + if (!cupsFileGets(src, line, sizeof(line))) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to read PPD file \"%s\": %s", + srcfile, strerror(errno)); + cupsFileClose(src); + cupsFileClose(dst); + rename(srcfile, dstfile); + return (0); + } + + cupsFilePrintf(dst, "%s\n", line); + + for (i = num_keywords, keyword = keywords; i > 0; i --, keyword ++) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "*%s: %s", keyword->name, keyword->value); + cupsFilePrintf(dst, "*%s: %s\n", keyword->name, keyword->value); + } + + /* + * Then copy the rest of the PPD file, dropping any keywords we changed. + */ + + while (cupsFileGets(src, line, sizeof(line))) + { + /* + * Skip keywords we've already set... + */ + + if (sscanf(line, "*%40[^:]:", keystring) == 1 && + cupsGetOption(keystring, num_keywords, keywords)) + continue; + + /* + * Otherwise write the line... + */ + + cupsFilePrintf(dst, "%s\n", line); + } + + /* + * Close files and return... + */ + + cupsFileClose(src); + cupsFileClose(dst); + + return (1); +} + + +/* + * 'cupsdUpdatePrinters()' - Update printers after a partial reload. + */ + +void +cupsdUpdatePrinters(void) +{ + cupsd_printer_t *p; /* Current printer */ + + + /* + * Loop through the printers and recreate the printer attributes + * for any local printers since the policy and/or access control + * stuff may have changed. Also, if browsing is disabled, remove + * any remote printers... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + /* + * Remove remote printers if we are no longer browsing... + */ + + if (!Browsing && + (p->type & (CUPS_PRINTER_IMPLICIT | CUPS_PRINTER_DISCOVERED))) + { + if (p->type & CUPS_PRINTER_IMPLICIT) + cupsArrayRemove(ImplicitPrinters, p); + + cupsArraySave(Printers); + cupsdDeletePrinter(p, 0); + cupsArrayRestore(Printers); + continue; + } + + /* + * Update the operation policy pointer... + */ + + if ((p->op_policy_ptr = cupsdFindPolicy(p->op_policy)) == NULL) + p->op_policy_ptr = DefaultPolicyPtr; + + /* + * Update printer attributes as needed... + */ + + if (!(p->type & CUPS_PRINTER_DISCOVERED)) + cupsdSetPrinterAttrs(p); + } +} + + +/* + * 'cupsdValidateDest()' - Validate a printer/class destination. + */ + +const char * /* O - Printer or class name */ +cupsdValidateDest( + const char *uri, /* I - Printer URI */ + cups_ptype_t *dtype, /* O - Type (printer or class) */ + cupsd_printer_t **printer) /* O - Printer pointer */ +{ + cupsd_printer_t *p; /* Current printer */ + char localname[1024],/* Localized hostname */ + *lptr, /* Pointer into localized hostname */ + *sptr, /* Pointer into server name */ + *rptr, /* Pointer into resource */ + scheme[32], /* Scheme portion of URI */ + username[64], /* Username portion of URI */ + hostname[HTTP_MAX_HOST], + /* Host portion of URI */ + resource[HTTP_MAX_URI]; + /* Resource portion of URI */ + int port; /* Port portion of URI */ + + + DEBUG_printf(("cupsdValidateDest(uri=\"%s\", dtype=%p, printer=%p)\n", uri, + dtype, printer)); + + /* + * Initialize return values... + */ + + if (printer) + *printer = NULL; + + if (dtype) + *dtype = (cups_ptype_t)0; + + /* + * Pull the hostname and resource from the URI... + */ + + httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, sizeof(hostname), + &port, resource, sizeof(resource)); + + /* + * See if the resource is a class or printer... + */ + + if (!strncmp(resource, "/classes/", 9)) + { + /* + * Class... + */ + + rptr = resource + 9; + } + else if (!strncmp(resource, "/printers/", 10)) + { + /* + * Printer... + */ + + rptr = resource + 10; + } + else + { + /* + * Bad resource name... + */ + + return (NULL); + } + + /* + * See if the printer or class name exists... + */ + + p = cupsdFindDest(rptr); + + if (p == NULL && strchr(rptr, '@') == NULL) + return (NULL); + else if (p != NULL) + { + if (printer) + *printer = p; + + if (dtype) + *dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED); + + return (p->name); + } + + /* + * Change localhost to the server name... + */ + + if (!_cups_strcasecmp(hostname, "localhost")) + strlcpy(hostname, ServerName, sizeof(hostname)); + + strlcpy(localname, hostname, sizeof(localname)); + + if (!_cups_strcasecmp(hostname, ServerName)) + { + /* + * Localize the hostname... + */ + + lptr = strchr(localname, '.'); + sptr = strchr(ServerName, '.'); + + if (sptr != NULL && lptr != NULL) + { + /* + * Strip the common domain name components... + */ + + while (lptr != NULL) + { + if (!_cups_strcasecmp(lptr, sptr)) + { + *lptr = '\0'; + break; + } + else + lptr = strchr(lptr + 1, '.'); + } + } + } + + DEBUG_printf(("localized hostname is \"%s\"...\n", localname)); + + /* + * Find a matching printer or class... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (!_cups_strcasecmp(p->hostname, localname) && + !_cups_strcasecmp(p->name, rptr)) + { + if (printer) + *printer = p; + + if (dtype) + *dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT | + CUPS_PRINTER_REMOTE | CUPS_PRINTER_DISCOVERED); + + return (p->name); + } + + return (NULL); +} + + +/* + * 'cupsdWritePrintcap()' - Write a pseudo-printcap file for older applications + * that need it... + */ + +void +cupsdWritePrintcap(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* Printcap file */ + cupsd_printer_t *p; /* Current printer */ + + +#ifdef __sgi + /* + * Update the IRIX printer state for the default printer; if + * no printers remain, then the default printer file will be + * removed... + */ + + write_irix_state(DefaultPrinter); +#endif /* __sgi */ + + /* + * See if we have a printcap file; if not, don't bother writing it. + */ + + if (!Printcap || !*Printcap) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Generating printcap %s...", Printcap); + + /* + * Open the printcap file... + */ + + if ((fp = cupsFileOpen(Printcap, "w")) == NULL) + return; + + /* + * Put a comment header at the top so that users will know where the + * data has come from... + */ + + if (PrintcapFormat != PRINTCAP_PLIST) + cupsFilePrintf(fp, "# This file was automatically generated by cupsd(8) " + "from the\n" + "# %s/printers.conf file. All changes to this file\n" + "# will be lost.\n", ServerRoot); + + /* + * Write a new printcap with the current list of printers. + */ + + switch (PrintcapFormat) + { + case PRINTCAP_BSD : + /* + * Each printer is put in the file as: + * + * Printer1: + * Printer2: + * Printer3: + * ... + * PrinterN: + */ + + if (DefaultPrinter) + cupsFilePrintf(fp, "%s|%s:rm=%s:rp=%s:\n", DefaultPrinter->name, + DefaultPrinter->info, ServerName, + DefaultPrinter->name); + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + if (p != DefaultPrinter) + cupsFilePrintf(fp, "%s|%s:rm=%s:rp=%s:\n", p->name, p->info, + ServerName, p->name); + break; + + case PRINTCAP_PLIST : + /* + * Each printer is written as a dictionary in a plist file. + * Currently the printer-name, printer-info, printer-is-accepting-jobs, + * printer-location, printer-make-and-model, printer-state, + * printer-state-reasons, printer-type, and (sanitized) device-uri. + */ + + cupsFilePuts(fp, "\n" + "\n" + "\n" + "\n"); + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + cupsFilePuts(fp, "\t\n" + "\t\tprinter-name\n" + "\t\t"); + write_xml_string(fp, p->name); + cupsFilePuts(fp, "\n" + "\t\tprinter-info\n" + "\t\t"); + write_xml_string(fp, p->info); + cupsFilePrintf(fp, "\n" + "\t\tprinter-is-accepting-jobs\n" + "\t\t<%s/>\n" + "\t\tprinter-location\n" + "\t\t", p->accepting ? "true" : "false"); + write_xml_string(fp, p->location); + cupsFilePuts(fp, "\n" + "\t\tprinter-make-and-model\n" + "\t\t"); + write_xml_string(fp, p->make_model); + cupsFilePrintf(fp, "\n" + "\t\tprinter-state\n" + "\t\t%d\n" + "\t\tprinter-state-reasons\n" + "\t\t\n", p->state); + for (i = 0; i < p->num_reasons; i ++) + { + cupsFilePuts(fp, "\t\t\t"); + write_xml_string(fp, p->reasons[i]); + cupsFilePuts(fp, "\n"); + } + cupsFilePrintf(fp, "\t\t\n" + "\t\tprinter-type\n" + "\t\t%d\n" + "\t\tdevice-uri\n" + "\t\t", p->type); + write_xml_string(fp, p->sanitized_device_uri); + cupsFilePuts(fp, "\n" + "\t\n"); + } + cupsFilePuts(fp, "\n" + "\n"); + break; + + case PRINTCAP_SOLARIS : + /* + * Each printer is put in the file as: + * + * _all:all=Printer1,Printer2,Printer3,...,PrinterN + * _default:use=DefaultPrinter + * Printer1:\ + * :bsdaddr=ServerName,Printer1:\ + * :description=Description: + * Printer2: + * :bsdaddr=ServerName,Printer2:\ + * :description=Description: + * Printer3: + * :bsdaddr=ServerName,Printer3:\ + * :description=Description: + * ... + * PrinterN: + * :bsdaddr=ServerName,PrinterN:\ + * :description=Description: + */ + + cupsFilePuts(fp, "_all:all="); + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayCurrent(Printers)) + cupsFilePrintf(fp, "%s%c", p->name, + cupsArrayNext(Printers) ? ',' : '\n'); + + if (DefaultPrinter) + cupsFilePrintf(fp, "_default:use=%s\n", DefaultPrinter->name); + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + cupsFilePrintf(fp, "%s:\\\n" + "\t:bsdaddr=%s,%s:\\\n" + "\t:description=%s:\n", + p->name, ServerName, p->name, + p->info ? p->info : ""); + break; + } + + /* + * Close the file... + */ + + cupsFileClose(fp); +} + + +/* + * 'add_printer_defaults()' - Add name-default attributes to the printer attributes. + */ + +static void +add_printer_defaults(cupsd_printer_t *p)/* I - Printer */ +{ + int i; /* Looping var */ + int num_options; /* Number of default options */ + cups_option_t *options, /* Default options */ + *option; /* Current option */ + char name[256]; /* name-default */ + + + /* + * Maintain a common array of default attribute names... + */ + + if (!CommonDefaults) + { + CommonDefaults = cupsArrayNew((cups_array_func_t)strcmp, NULL); + + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("copies-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("document-format-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("finishings-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-hold-until-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-priority-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("job-sheets-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("media-col-default")); + cupsArrayAdd(CommonDefaults, _cupsStrAlloc("number-up-default")); + cupsArrayAdd(CommonDefaults, + _cupsStrAlloc("orientation-requested-default")); + } + + /* + * Add all of the default options from the .conf files... + */ + + for (num_options = 0, options = NULL, i = p->num_options, option = p->options; + i > 0; + i --, option ++) + { + if (strcmp(option->name, "ipp-options") && + strcmp(option->name, "job-sheets") && + strcmp(option->name, "lease-duration")) + { + snprintf(name, sizeof(name), "%s-default", option->name); + num_options = cupsAddOption(name, option->value, num_options, &options); + + if (!cupsArrayFind(CommonDefaults, name)) + cupsArrayAdd(CommonDefaults, _cupsStrAlloc(name)); + } + } + + /* + * Convert options to IPP attributes... + */ + + cupsEncodeOptions2(p->attrs, num_options, options, IPP_TAG_PRINTER); + cupsFreeOptions(num_options, options); + + /* + * Add standard -default attributes as needed... + */ + + if (!cupsGetOption("copies", p->num_options, p->options)) + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, "copies-default", + 1); + + if (!cupsGetOption("document-format", p->num_options, p->options)) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, + "document-format-default", NULL, "application/octet-stream"); + + if (!cupsGetOption("job-hold-until", p->num_options, p->options)) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "job-hold-until-default", NULL, "no-hold"); + + if (!cupsGetOption("job-priority", p->num_options, p->options)) + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "job-priority-default", 50); + + if (!cupsGetOption("number-up", p->num_options, p->options)) + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "number-up-default", 1); + + if (!cupsGetOption("notify-lease-duration", p->num_options, p->options)) + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "notify-lease-duration-default", DefaultLeaseDuration); + + if (!cupsGetOption("notify-events", p->num_options, p->options)) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "notify-events-default", NULL, "job-completed"); + + if (!cupsGetOption("orientation-requested", p->num_options, p->options)) + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_NOVALUE, + "orientation-requested-default", NULL, NULL); + + if (!cupsGetOption("print-quality", p->num_options, p->options)) + ippAddInteger(p->attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "print-quality-default", IPP_QUALITY_NORMAL); +} + + +/* + * 'add_printer_filter()' - Add a MIME filter for a printer. + */ + +static void +add_printer_filter( + cupsd_printer_t *p, /* I - Printer to add to */ + mime_type_t *filtertype, /* I - Filter or prefilter MIME type */ + const char *filter) /* I - Filter to add */ +{ + char super[MIME_MAX_SUPER], /* Super-type for filter */ + type[MIME_MAX_TYPE], /* Type for filter */ + dsuper[MIME_MAX_SUPER], /* Destination super-type for filter */ + dtype[MIME_MAX_TYPE], /* Destination type for filter */ + dest[MIME_MAX_SUPER + MIME_MAX_TYPE + 2], + /* Destination super/type */ + program[1024]; /* Program/filter name */ + int cost; /* Cost of filter */ + size_t maxsize = 0; /* Maximum supported file size */ + mime_type_t *temptype, /* MIME type looping var */ + *desttype; /* Destination MIME type */ + mime_filter_t *filterptr; /* MIME filter */ + char filename[1024]; /* Full filter filename */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_filter(p=%p(%s), filtertype=%p(%s/%s), " + "filter=\"%s\")", p, p->name, filtertype, filtertype->super, + filtertype->type, filter); + + /* + * Parse the filter string; it should be in one of the following formats: + * + * source/type cost program + * source/type cost maxsize(nnnn) program + * source/type dest/type cost program + * source/type dest/type cost maxsize(nnnn) program + */ + + if (sscanf(filter, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + super, type, dsuper, dtype, &cost, program) == 6) + { + snprintf(dest, sizeof(dest), "%s/%s/%s", p->name, dsuper, dtype); + + if ((desttype = mimeType(MimeDatabase, "printer", dest)) == NULL) + { + desttype = mimeAddType(MimeDatabase, "printer", dest); + if (!p->dest_types) + p->dest_types = cupsArrayNew(NULL, NULL); + + cupsArrayAdd(p->dest_types, desttype); + } + + } + else + { + if (sscanf(filter, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost, + program) == 4) + { + desttype = filtertype; + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, "%s: invalid filter string \"%s\"!", + p->name, filter); + return; + } + } + + if (!strncmp(program, "maxsize(", 8)) + { + char *ptr; /* Pointer into maxsize(nnnn) program */ + + maxsize = strtoll(program + 8, &ptr, 10); + + if (*ptr != ')') + { + cupsdLogMessage(CUPSD_LOG_ERROR, "%s: invalid filter string \"%s\"!", + p->name, filter); + return; + } + + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + } + + /* + * Check permissions on the filter and its containing directory... + */ + + if (strcmp(program, "-")) + { + if (program[0] == '/') + strlcpy(filename, program, sizeof(filename)); + else + snprintf(filename, sizeof(filename), "%s/filter/%s", ServerBin, program); + + _cupsFileCheck(filename, _CUPS_FILE_CHECK_PROGRAM, !RunUser, + cupsdLogFCMessage, p); + } + + /* + * Add the filter to the MIME database, supporting wildcards as needed... + */ + + for (temptype = mimeFirstType(MimeDatabase); + temptype; + temptype = mimeNextType(MimeDatabase)) + if (((super[0] == '*' && _cups_strcasecmp(temptype->super, "printer")) || + !_cups_strcasecmp(temptype->super, super)) && + (type[0] == '*' || !_cups_strcasecmp(temptype->type, type))) + { + if (desttype != filtertype) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_filter: %s: adding filter %s/%s %s/%s %d " + "%s", p->name, temptype->super, temptype->type, + desttype->super, desttype->type, + cost, program); + filterptr = mimeAddFilter(MimeDatabase, temptype, desttype, cost, + program); + + if (!mimeFilterLookup(MimeDatabase, desttype, filtertype)) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_filter: %s: adding filter %s/%s %s/%s " + "0 -", p->name, desttype->super, desttype->type, + filtertype->super, filtertype->type); + mimeAddFilter(MimeDatabase, desttype, filtertype, 0, "-"); + } + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_filter: %s: adding filter %s/%s %s/%s %d " + "%s", p->name, temptype->super, temptype->type, + filtertype->super, filtertype->type, + cost, program); + filterptr = mimeAddFilter(MimeDatabase, temptype, filtertype, cost, + program); + } + + if (filterptr) + filterptr->maxsize = maxsize; + } +} + + +/* + * 'add_printer_formats()' - Add document-format-supported values for a printer. + */ + +static void +add_printer_formats(cupsd_printer_t *p) /* I - Printer */ +{ + int i; /* Looping var */ + mime_type_t *type; /* Current MIME type */ + cups_array_t *filters; /* Filters */ + ipp_attribute_t *attr; /* document-format-supported attribute */ + char mimetype[MIME_MAX_SUPER + MIME_MAX_TYPE + 2]; + /* MIME type name */ + + + /* + * Raw (and remote) queues advertise all of the supported MIME + * types... + */ + + cupsArrayDelete(p->filetypes); + p->filetypes = NULL; + + if (p->raw) + { + ippAddStrings(p->attrs, IPP_TAG_PRINTER, + (ipp_tag_t)(IPP_TAG_MIMETYPE | IPP_TAG_COPY), + "document-format-supported", NumMimeTypes, NULL, MimeTypes); + return; + } + + /* + * Otherwise, loop through the supported MIME types and see if there + * are filters for them... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "add_printer_formats: %d types, %d filters", + mimeNumTypes(MimeDatabase), mimeNumFilters(MimeDatabase)); + + p->filetypes = cupsArrayNew(NULL, NULL); + + for (type = mimeFirstType(MimeDatabase); + type; + type = mimeNextType(MimeDatabase)) + { + if (!_cups_strcasecmp(type->super, "printer")) + continue; + + snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type); + + if ((filters = mimeFilter(MimeDatabase, type, p->filetype, NULL)) != NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_formats: %s: %s needs %d filters", + p->name, mimetype, cupsArrayCount(filters)); + + cupsArrayDelete(filters); + cupsArrayAdd(p->filetypes, type); + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_formats: %s: %s not supported", + p->name, mimetype); + } + + /* + * Add the file formats that can be filtered... + */ + + if ((type = mimeType(MimeDatabase, "application", "octet-stream")) == NULL || + !cupsArrayFind(p->filetypes, type)) + i = 1; + else + i = 0; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "add_printer_formats: %s: %d supported types", + p->name, cupsArrayCount(p->filetypes) + i); + + attr = ippAddStrings(p->attrs, IPP_TAG_PRINTER, IPP_TAG_MIMETYPE, + "document-format-supported", + cupsArrayCount(p->filetypes) + i, NULL, NULL); + + if (i) + attr->values[0].string.text = _cupsStrAlloc("application/octet-stream"); + + for (type = (mime_type_t *)cupsArrayFirst(p->filetypes); + type; + i ++, type = (mime_type_t *)cupsArrayNext(p->filetypes)) + { + snprintf(mimetype, sizeof(mimetype), "%s/%s", type->super, type->type); + + attr->values[i].string.text = _cupsStrAlloc(mimetype); + } + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + { + char pdl[1024]; /* Buffer to build pdl list */ + mime_filter_t *filter; /* MIME filter looping var */ + + + /* + * We only support raw printing if this is not a Tioga PrintJobMgr based + * queue and if application/octet-stream is a known type... + */ + + for (filter = (mime_filter_t *)cupsArrayFirst(MimeDatabase->filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(MimeDatabase->filters)) + { + if (filter->dst == p->filetype && filter->filter && + strstr(filter->filter, "PrintJobMgr")) + break; + } + + pdl[0] = '\0'; + + if (!filter && mimeType(MimeDatabase, "application", "octet-stream")) + strlcat(pdl, "application/octet-stream,", sizeof(pdl)); + + /* + * Then list a bunch of formats that are supported by the printer... + */ + + for (type = (mime_type_t *)cupsArrayFirst(p->filetypes); + type; + type = (mime_type_t *)cupsArrayNext(p->filetypes)) + { + if (!_cups_strcasecmp(type->super, "application")) + { + if (!_cups_strcasecmp(type->type, "pdf")) + strlcat(pdl, "application/pdf,", sizeof(pdl)); + else if (!_cups_strcasecmp(type->type, "postscript")) + strlcat(pdl, "application/postscript,", sizeof(pdl)); + } + else if (!_cups_strcasecmp(type->super, "image")) + { + if (!_cups_strcasecmp(type->type, "jpeg")) + strlcat(pdl, "image/jpeg,", sizeof(pdl)); + else if (!_cups_strcasecmp(type->type, "png")) + strlcat(pdl, "image/png,", sizeof(pdl)); + else if (!_cups_strcasecmp(type->type, "pwg-raster")) + strlcat(pdl, "image/pwg-raster,", sizeof(pdl)); + } + } + + if (pdl[0]) + pdl[strlen(pdl) - 1] = '\0'; /* Remove trailing comma */ + + cupsdSetString(&p->pdl, pdl); + } +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ +} + + +/* + * 'compare_printers()' - Compare two printers. + */ + +static int /* O - Result of comparison */ +compare_printers(void *first, /* I - First printer */ + void *second, /* I - Second printer */ + void *data) /* I - App data (not used) */ +{ + (void)data; + + return (_cups_strcasecmp(((cupsd_printer_t *)first)->name, + ((cupsd_printer_t *)second)->name)); +} + + +/* + * 'delete_printer_filters()' - Delete all MIME filters for a printer. + */ + +static void +delete_printer_filters( + cupsd_printer_t *p) /* I - Printer to remove from */ +{ + mime_filter_t *filter; /* MIME filter looping var */ + mime_type_t *type; /* Destination types for filters */ + + + /* + * Range check input... + */ + + if (p == NULL) + return; + + /* + * Remove all filters from the MIME database that have a destination + * type == printer... + */ + + for (filter = mimeFirstFilter(MimeDatabase); + filter; + filter = mimeNextFilter(MimeDatabase)) + if (filter->dst == p->filetype || filter->dst == p->prefiltertype || + cupsArrayFind(p->dest_types, filter->dst)) + { + /* + * Delete the current filter... + */ + + mimeDeleteFilter(MimeDatabase, filter); + } + + for (type = (mime_type_t *)cupsArrayFirst(p->dest_types); + type; + type = (mime_type_t *)cupsArrayNext(p->dest_types)) + mimeDeleteType(MimeDatabase, type); + + cupsArrayDelete(p->dest_types); + p->dest_types = NULL; + + cupsdSetPrinterReasons(p, "-cups-insecure-filter-warning" + ",cups-missing-filter-warning"); +} + + +/* + * 'dirty_printer()' - Mark config and state files dirty for the specified + * printer. + */ + +static void +dirty_printer(cupsd_printer_t *p) /* I - Printer */ +{ + if (p->type & CUPS_PRINTER_DISCOVERED) + cupsdMarkDirty(CUPSD_DIRTY_REMOTE); + else if (p->type & CUPS_PRINTER_CLASS) + cupsdMarkDirty(CUPSD_DIRTY_CLASSES); + else + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + if (PrintcapFormat == PRINTCAP_PLIST) + cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); +} + + +/* + * 'load_ppd()' - Load a cached PPD file, updating the cache as needed. + */ + +static void +load_ppd(cupsd_printer_t *p) /* I - Printer */ +{ + int i, j, k; /* Looping vars */ + char cache_name[1024]; /* Cache filename */ + struct stat cache_info; /* Cache file info */ + ppd_file_t *ppd; /* PPD file */ + char ppd_name[1024]; /* PPD filename */ + struct stat ppd_info; /* PPD file info */ + int num_media; /* Number of media options */ + ppd_size_t *size; /* Current PPD size */ + ppd_option_t *duplex, /* Duplex option */ + *output_bin, /* OutputBin option */ + *output_mode, /* OutputMode option */ + *resolution; /* (Set|JCL|)Resolution option */ + ppd_choice_t *choice, /* Current PPD choice */ + *input_slot, /* Current input slot */ + *media_type; /* Current media type */ + ppd_attr_t *ppd_attr; /* PPD attribute */ + int xdpi, /* Horizontal resolution */ + ydpi; /* Vertical resolution */ + const char *resptr; /* Pointer into resolution keyword */ + _pwg_size_t *pwgsize; /* Current PWG size */ + _pwg_map_t *pwgsource, /* Current PWG source */ + *pwgtype; /* Current PWG type */ + ipp_attribute_t *attr; /* Attribute data */ + ipp_value_t *val; /* Attribute value */ + int num_finishings, /* Number of finishings */ + finishings[5]; /* finishings-supported values */ + int num_qualities, /* Number of print-quality values */ + qualities[3]; /* print-quality values */ + int num_margins, /* Number of media-*-margin-supported values */ + margins[16]; /* media-*-margin-supported values */ + const char *filter; /* Current filter */ + static const char * const sides[3] = /* sides-supported values */ + { + "one-sided", + "two-sided-long-edge", + "two-sided-short-edge" + }; + static const char * const standard_commands[] = + { /* Standard CUPS commands */ + "AutoConfigure", + "Clean", + "PrintSelfTestPage" + }; + + + /* + * Check to see if the cache is up-to-date... + */ + + snprintf(cache_name, sizeof(cache_name), "%s/%s.data", CacheDir, p->name); + if (stat(cache_name, &cache_info)) + cache_info.st_mtime = 0; + + snprintf(ppd_name, sizeof(ppd_name), "%s/ppd/%s.ppd", ServerRoot, p->name); + if (stat(ppd_name, &ppd_info)) + ppd_info.st_mtime = 1; + + ippDelete(p->ppd_attrs); + p->ppd_attrs = NULL; + + _ppdCacheDestroy(p->pc); + p->pc = NULL; + + if (cache_info.st_mtime >= ppd_info.st_mtime) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", cache_name); + + if ((p->pc = _ppdCacheCreateWithFile(cache_name, &p->ppd_attrs)) != NULL && + p->ppd_attrs) + { + /* + * Loaded successfully! + */ + + return; + } + } + + /* + * Reload PPD attributes from disk... + */ + + cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); + + cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Loading %s...", ppd_name); + + p->type &= ~CUPS_PRINTER_OPTIONS; + p->type |= CUPS_PRINTER_BW; + + finishings[0] = IPP_FINISHINGS_NONE; + num_finishings = 1; + + p->ppd_attrs = ippNew(); + + if ((ppd = ppdOpenFile(ppd_name)) != NULL) + { + /* + * Add make/model and other various attributes... + */ + + p->pc = _ppdCacheCreateWithPPD(ppd); + + ppdMarkDefaults(ppd); + + if (ppd->color_device) + p->type |= CUPS_PRINTER_COLOR; + if (ppd->variable_sizes) + p->type |= CUPS_PRINTER_VARIABLE; + if (!ppd->manual_copies) + p->type |= CUPS_PRINTER_COPIES; + if ((ppd_attr = ppdFindAttr(ppd, "cupsFax", NULL)) != NULL) + if (ppd_attr->value && !_cups_strcasecmp(ppd_attr->value, "true")) + p->type |= CUPS_PRINTER_FAX; + + ippAddBoolean(p->ppd_attrs, IPP_TAG_PRINTER, "color-supported", + ppd->color_device); + if (ppd->throughput) + { + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "pages-per-minute", ppd->throughput); + if (ppd->color_device) + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "pages-per-minute-color", ppd->throughput); + } + else + { + /* + * When there is no speed information, just say "1 page per minute". + */ + + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "pages-per-minute", 1); + if (ppd->color_device) + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "pages-per-minute-color", 1); + } + + num_qualities = 0; + + if ((output_mode = ppdFindOption(ppd, "OutputMode")) != NULL) + { + if (ppdFindChoice(output_mode, "draft") || + ppdFindChoice(output_mode, "fast")) + qualities[num_qualities ++] = IPP_QUALITY_DRAFT; + + qualities[num_qualities ++] = IPP_QUALITY_NORMAL; + + if (ppdFindChoice(output_mode, "best") || + ppdFindChoice(output_mode, "high")) + qualities[num_qualities ++] = IPP_QUALITY_HIGH; + } + else if ((ppd_attr = ppdFindAttr(ppd, "APPrinterPreset", NULL)) != NULL) + { + do + { + if (strstr(ppd_attr->spec, "draft") || + strstr(ppd_attr->spec, "Draft")) + { + qualities[num_qualities ++] = IPP_QUALITY_DRAFT; + break; + } + } + while ((ppd_attr = ppdFindNextAttr(ppd, "APPrinterPreset", + NULL)) != NULL); + + qualities[num_qualities ++] = IPP_QUALITY_NORMAL; + qualities[num_qualities ++] = IPP_QUALITY_HIGH; + } + else + qualities[num_qualities ++] = IPP_QUALITY_NORMAL; + + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "print-quality-supported", num_qualities, qualities); + + if (ppd->nickname) + { + /* + * The NickName can be localized in the character set specified + * by the LanugageEncoding attribute. However, ppdOpen2() has + * already converted the ppd->nickname member to UTF-8 for us + * (the original attribute value is available separately) + */ + + cupsdSetString(&p->make_model, ppd->nickname); + } + else if (ppd->modelname) + { + /* + * Model name can only contain specific characters... + */ + + cupsdSetString(&p->make_model, ppd->modelname); + } + else + cupsdSetString(&p->make_model, "Bad PPD File"); + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, p->make_model); + + /* + * Add media options from the PPD file... + */ + + if (ppd->num_sizes == 0 || !p->pc) + { + if (!ppdFindAttr(ppd, "APScannerOnly", NULL)) + cupsdLogMessage(CUPSD_LOG_CRIT, + "The PPD file for printer %s contains no media " + "options and is therefore invalid!", p->name); + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-default", NULL, "unknown"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-supported", NULL, "unknown"); + } + else + { + /* + * media-default + */ + + if ((size = ppdPageSize(ppd, NULL)) != NULL) + pwgsize = _ppdCacheGetSize(p->pc, size->name); + else + pwgsize = NULL; + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-default", NULL, + pwgsize ? pwgsize->map.pwg : "unknown"); + + /* + * media-col-default + */ + + if (pwgsize) + { + ipp_t *col; /* Collection value */ + + input_slot = ppdFindMarkedChoice(ppd, "InputSlot"); + media_type = ppdFindMarkedChoice(ppd, "MediaType"); + col = new_media_col(pwgsize, + input_slot ? + _ppdCacheGetSource(p->pc, + input_slot->choice) : + NULL, + media_type ? + _ppdCacheGetType(p->pc, + media_type->choice) : + NULL); + + ippAddCollection(p->ppd_attrs, IPP_TAG_PRINTER, "media-col-default", + col); + ippDelete(col); + } + + /* + * media-supported + */ + + num_media = p->pc->num_sizes; + if (p->pc->custom_min_keyword) + num_media += 2; + + if ((attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-supported", num_media, NULL, + NULL)) != NULL) + { + val = attr->values; + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes; + i > 0; + i --, pwgsize ++, val ++) + val->string.text = _cupsStrRetain(pwgsize->map.pwg); + + if (p->pc->custom_min_keyword) + { + val->string.text = _cupsStrRetain(p->pc->custom_min_keyword); + val ++; + val->string.text = _cupsStrRetain(p->pc->custom_max_keyword); + } + } + + /* + * media-size-supported + */ + + num_media = p->pc->num_sizes; + if (p->pc->custom_min_keyword) + num_media ++; + + if ((attr = ippAddCollections(p->ppd_attrs, IPP_TAG_PRINTER, + "media-size-supported", num_media, + NULL)) != NULL) + { + val = attr->values; + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes; + i > 0; + i --, pwgsize ++, val ++) + { + val->collection = ippNew(); + ippAddInteger(val->collection, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "x-dimension", pwgsize->width); + ippAddInteger(val->collection, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "y-dimension", pwgsize->length); + } + + if (p->pc->custom_min_keyword) + { + val->collection = ippNew(); + ippAddRange(val->collection, IPP_TAG_PRINTER, "x-dimension", + p->pc->custom_min_width, p->pc->custom_max_width); + ippAddRange(val->collection, IPP_TAG_PRINTER, "y-dimension", + p->pc->custom_min_length, p->pc->custom_max_length); + } + } + + /* + * media-source-supported + */ + + if (p->pc->num_sources > 0 && + (attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-source-supported", p->pc->num_sources, + NULL, NULL)) != NULL) + { + for (i = p->pc->num_sources, pwgsource = p->pc->sources, + val = attr->values; + i > 0; + i --, pwgsource ++, val ++) + val->string.text = _cupsStrRetain(pwgsource->pwg); + } + + /* + * media-type-supported + */ + + if (p->pc->num_types > 0 && + (attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-type-supported", p->pc->num_types, + NULL, NULL)) != NULL) + { + for (i = p->pc->num_types, pwgtype = p->pc->types, + val = attr->values; + i > 0; + i --, pwgtype ++, val ++) + val->string.text = _cupsStrRetain(pwgtype->pwg); + } + + /* + * media-*-margin-supported + */ + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes, num_margins = 0; + i > 0 && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); + i --, pwgsize ++) + { + for (j = 0; j < num_margins; j ++) + if (pwgsize->bottom == margins[j]) + break; + + if (j >= num_margins) + { + margins[num_margins] = pwgsize->bottom; + num_margins ++; + } + } + + if (num_margins > 0) + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-bottom-margin-supported", num_margins, margins); + else + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-bottom-margin-supported", 0); + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes, num_margins = 0; + i > 0 && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); + i --, pwgsize ++) + { + for (j = 0; j < num_margins; j ++) + if (pwgsize->left == margins[j]) + break; + + if (j >= num_margins) + { + margins[num_margins] = pwgsize->left; + num_margins ++; + } + } + + if (num_margins > 0) + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-left-margin-supported", num_margins, margins); + else + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-left-margin-supported", 0); + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes, num_margins = 0; + i > 0 && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); + i --, pwgsize ++) + { + for (j = 0; j < num_margins; j ++) + if (pwgsize->right == margins[j]) + break; + + if (j >= num_margins) + { + margins[num_margins] = pwgsize->right; + num_margins ++; + } + } + + if (num_margins > 0) + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-right-margin-supported", num_margins, margins); + else + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-right-margin-supported", 0); + + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes, num_margins = 0; + i > 0 && num_margins < (int)(sizeof(margins) / sizeof(margins[0])); + i --, pwgsize ++) + { + for (j = 0; j < num_margins; j ++) + if (pwgsize->top == margins[j]) + break; + + if (j >= num_margins) + { + margins[num_margins] = pwgsize->top; + num_margins ++; + } + } + + if (num_margins > 0) + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-top-margin-supported", num_margins, margins); + else + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-top-margin-supported", 0); + + /* + * media-col-database + */ + + num_media = p->pc->num_sizes; + if (p->pc->num_sources) + { + if (p->pc->num_types > 0) + num_media += p->pc->num_sizes * p->pc->num_sources * + p->pc->num_types; + else + num_media += p->pc->num_sizes * p->pc->num_sources; + } + else if (p->pc->num_types) + num_media += p->pc->num_sizes * p->pc->num_types; + + if ((attr = ippAddCollections(p->ppd_attrs, IPP_TAG_PRINTER, + "media-col-database", num_media, + NULL)) != NULL) + { + for (i = p->pc->num_sizes, pwgsize = p->pc->sizes, val = attr->values; + i > 0; + i --, pwgsize ++) + { + /* + * Start by adding the page size without source or type... + */ + + ppdMarkOption(ppd, "PageSize", pwgsize->map.ppd); + + val->collection = new_media_col(pwgsize, NULL, NULL); + val ++; + + /* + * Then add the specific, supported combinations of size, source, and + * type... + */ + + if (p->pc->num_sources > 0) + { + for (j = p->pc->num_sources, pwgsource = p->pc->sources; + j > 0; + j --, pwgsource ++) + { + ppdMarkOption(ppd, "InputSlot", pwgsource->ppd); + + if (p->pc->num_types > 0) + { + for (k = p->pc->num_types, pwgtype = p->pc->types; + k > 0; + k --, pwgtype ++) + { + if (!ppdMarkOption(ppd, "MediaType", pwgtype->ppd)) + { + val->collection = new_media_col(pwgsize, pwgsource->pwg, + pwgtype->pwg); + val ++; + } + } + } + else if (!ppdConflicts(ppd)) + { + val->collection = new_media_col(pwgsize, pwgsource->pwg, NULL); + val ++; + } + } + } + else if (p->pc->num_types > 0) + { + for (j = p->pc->num_types, pwgtype = p->pc->types; + j > 0; + j --, pwgtype ++) + { + if (!ppdMarkOption(ppd, "MediaType", pwgtype->ppd)) + { + val->collection = new_media_col(pwgsize, NULL, pwgtype->pwg); + val ++; + } + } + } + } + + /* + * Update the number of media-col-database values... + */ + + attr->num_values = val - attr->values; + } + } + + /* + * Output bin... + */ + + if (p->pc && p->pc->num_bins > 0) + { + attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-supported", p->pc->num_bins, + NULL, NULL); + + if (attr != NULL) + { + for (i = 0, val = attr->values; + i < p->pc->num_bins; + i ++, val ++) + val->string.text = _cupsStrAlloc(p->pc->bins[i].pwg); + } + + if ((output_bin = ppdFindOption(ppd, "OutputBin")) != NULL) + { + for (i = 0; i < p->pc->num_bins; i ++) + if (!strcmp(p->pc->bins[i].ppd, output_bin->defchoice)) + break; + + if (i >= p->pc->num_bins) + i = 0; + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-default", NULL, p->pc->bins[i].pwg); + } + else + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-default", NULL, p->pc->bins[0].pwg); + } + else if (((ppd_attr = ppdFindAttr(ppd, "DefaultOutputOrder", + NULL)) != NULL && + !_cups_strcasecmp(ppd_attr->value, "Reverse")) || + (!ppd_attr && ppd->manufacturer && /* "Compatibility heuristic" */ + (!_cups_strcasecmp(ppd->manufacturer, "epson") || + !_cups_strcasecmp(ppd->manufacturer, "lexmark")))) + { + /* + * Report that this printer has a single output bin that leaves pages face + * up. + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-supported", NULL, "face-up"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-default", NULL, "face-up"); + } + else + { + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-supported", NULL, "face-down"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-bin-default", NULL, "face-down"); + } + + /* + * output-mode and print-color-mode... + */ + + if (ppd->color_device) + { + static const char * const output_modes[] = + { + "monochrome", + "color" + }; + + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-mode-supported", 2, NULL, output_modes); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-mode-default", NULL, "color"); + + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "print-color-mode-supported", 2, NULL, output_modes); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "print-color-mode-default", NULL, "color"); + } + else + { + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-mode-supported", NULL, "monochrome"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "output-mode-default", NULL, "monochrome"); + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "print-color-mode-supported", NULL, "monochrome"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "print-color-mode-default", NULL, "monochrome"); + } + + /* + * Printer resolutions... + */ + + if ((resolution = ppdFindOption(ppd, "Resolution")) == NULL) + if ((resolution = ppdFindOption(ppd, "JCLResolution")) == NULL) + if ((resolution = ppdFindOption(ppd, "SetResolution")) == NULL) + resolution = ppdFindOption(ppd, "CNRes_PGP"); + + if (resolution) + { + /* + * Report all supported resolutions... + */ + + attr = ippAddResolutions(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-supported", + resolution->num_choices, IPP_RES_PER_INCH, + NULL, NULL); + + for (i = 0, choice = resolution->choices; + i < resolution->num_choices; + i ++, choice ++) + { + xdpi = ydpi = (int)strtol(choice->choice, (char **)&resptr, 10); + if (resptr > choice->choice && xdpi > 0 && *resptr == 'x') + ydpi = (int)strtol(resptr + 1, (char **)&resptr, 10); + + if (xdpi <= 0 || ydpi <= 0) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Bad resolution \"%s\" for printer %s.", + choice->choice, p->name); + xdpi = ydpi = 300; + } + + attr->values[i].resolution.xres = xdpi; + attr->values[i].resolution.yres = ydpi; + attr->values[i].resolution.units = IPP_RES_PER_INCH; + + if (choice->marked) + ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-default", IPP_RES_PER_INCH, + xdpi, ydpi); + } + } + else if ((ppd_attr = ppdFindAttr(ppd, "DefaultResolution", NULL)) != NULL && + ppd_attr->value) + { + /* + * Just the DefaultResolution to report... + */ + + xdpi = ydpi = (int)strtol(ppd_attr->value, (char **)&resptr, 10); + if (resptr > ppd_attr->value && xdpi > 0) + { + if (*resptr == 'x') + ydpi = (int)strtol(resptr + 1, (char **)&resptr, 10); + else + ydpi = xdpi; + } + + if (xdpi <= 0 || ydpi <= 0) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "Bad default resolution \"%s\" for printer %s.", + ppd_attr->value, p->name); + xdpi = ydpi = 300; + } + + ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-default", IPP_RES_PER_INCH, + xdpi, ydpi); + ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-supported", IPP_RES_PER_INCH, + xdpi, ydpi); + } + else + { + /* + * No resolutions in PPD - make one up... + */ + + ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-default", IPP_RES_PER_INCH, + 300, 300); + ippAddResolution(p->ppd_attrs, IPP_TAG_PRINTER, + "printer-resolution-supported", IPP_RES_PER_INCH, + 300, 300); + } + + /* + * Duplexing, etc... + */ + + ppdMarkDefaults(ppd); + + if ((duplex = ppdFindOption(ppd, "Duplex")) == NULL) + if ((duplex = ppdFindOption(ppd, "EFDuplex")) == NULL) + if ((duplex = ppdFindOption(ppd, "EFDuplexing")) == NULL) + if ((duplex = ppdFindOption(ppd, "KD03Duplex")) == NULL) + duplex = ppdFindOption(ppd, "JCLDuplex"); + + if (duplex && duplex->num_choices > 1 && + !ppdInstallableConflict(ppd, duplex->keyword, "DuplexTumble")) + { + p->type |= CUPS_PRINTER_DUPLEX; + + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-supported", 3, NULL, sides); + + if (!_cups_strcasecmp(duplex->defchoice, "DuplexTumble")) + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-default", NULL, "two-sided-short-edge"); + else if (!_cups_strcasecmp(duplex->defchoice, "DuplexNoTumble")) + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-default", NULL, "two-sided-long-edge"); + else + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-default", NULL, "one-sided"); + } + else + { + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-supported", NULL, "one-sided"); + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "sides-default", NULL, "one-sided"); + } + + if (ppdFindOption(ppd, "Collate") != NULL) + p->type |= CUPS_PRINTER_COLLATE; + + if (ppdFindOption(ppd, "StapleLocation") != NULL) + { + p->type |= CUPS_PRINTER_STAPLE; + finishings[num_finishings++] = IPP_FINISHINGS_STAPLE; + } + + if (ppdFindOption(ppd, "BindEdge") != NULL) + { + p->type |= CUPS_PRINTER_BIND; + finishings[num_finishings++] = IPP_FINISHINGS_BIND; + } + + for (i = 0; i < ppd->num_sizes; i ++) + if (ppd->sizes[i].length > 1728) + p->type |= CUPS_PRINTER_LARGE; + else if (ppd->sizes[i].length > 1008) + p->type |= CUPS_PRINTER_MEDIUM; + else + p->type |= CUPS_PRINTER_SMALL; + + if ((ppd_attr = ppdFindAttr(ppd, "APICADriver", NULL)) != NULL && + ppd_attr->value && !_cups_strcasecmp(ppd_attr->value, "true")) + { + if ((ppd_attr = ppdFindAttr(ppd, "APScannerOnly", NULL)) != NULL && + ppd_attr->value && !_cups_strcasecmp(ppd_attr->value, "true")) + p->type |= CUPS_PRINTER_SCANNER; + else + p->type |= CUPS_PRINTER_MFP; + } + + /* + * Scan the filters in the PPD file... + */ + + if (p->pc) + { + for (filter = (const char *)cupsArrayFirst(p->pc->filters); + filter; + filter = (const char *)cupsArrayNext(p->pc->filters)) + { + if (!_cups_strncasecmp(filter, "application/vnd.cups-command", 28) && + _cups_isspace(filter[28])) + { + p->type |= CUPS_PRINTER_COMMANDS; + break; + } + } + } + + if (p->type & CUPS_PRINTER_COMMANDS) + { + char *commands, /* Copy of commands */ + *start, /* Start of name */ + *end; /* End of name */ + int count; /* Number of commands */ + + if ((ppd_attr = ppdFindAttr(ppd, "cupsCommands", NULL)) != NULL) + { + for (count = 0, start = ppd_attr->value; *start; count ++) + { + while (_cups_isspace(*start)) + start ++; + + if (!*start) + break; + + while (*start && !isspace(*start & 255)) + start ++; + } + } + else + count = 0; + + if (count > 0) + { + /* + * Make a copy of the commands string and count how many commands there + * are... + */ + + attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "printer-commands", count, NULL, NULL); + + commands = strdup(ppd_attr->value); + + for (count = 0, start = commands; *start; count ++) + { + while (isspace(*start & 255)) + start ++; + + if (!*start) + break; + + end = start; + while (*end && !isspace(*end & 255)) + end ++; + + if (*end) + *end++ = '\0'; + + attr->values[count].string.text = _cupsStrAlloc(start); + + start = end; + } + + free(commands); + } + else + { + /* + * Add the standard list of commands... + */ + + ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "printer-commands", + (int)(sizeof(standard_commands) / + sizeof(standard_commands[0])), NULL, + standard_commands); + } + } + else + { + /* + * No commands supported... + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "printer-commands", NULL, "none"); + } + + /* + * Show current and available port monitors for this printer... + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor", + NULL, p->port_monitor ? p->port_monitor : "none"); + + for (i = 1, ppd_attr = ppdFindAttr(ppd, "cupsPortMonitor", NULL); + ppd_attr; + i ++, ppd_attr = ppdFindNextAttr(ppd, "cupsPortMonitor", NULL)); + + if (ppd->protocols) + { + if (strstr(ppd->protocols, "TBCP")) + i ++; + else if (strstr(ppd->protocols, "BCP")) + i ++; + } + + attr = ippAddStrings(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_NAME, + "port-monitor-supported", i, NULL, NULL); + + attr->values[0].string.text = _cupsStrAlloc("none"); + + for (i = 1, ppd_attr = ppdFindAttr(ppd, "cupsPortMonitor", NULL); + ppd_attr; + i ++, ppd_attr = ppdFindNextAttr(ppd, "cupsPortMonitor", NULL)) + attr->values[i].string.text = _cupsStrAlloc(ppd_attr->value); + + if (ppd->protocols) + { + if (strstr(ppd->protocols, "TBCP")) + attr->values[i].string.text = _cupsStrAlloc("tbcp"); + else if (strstr(ppd->protocols, "BCP")) + attr->values[i].string.text = _cupsStrAlloc("bcp"); + } + + if (ppdFindAttr(ppd, "APRemoteQueueID", NULL)) + p->type |= CUPS_PRINTER_REMOTE; + +#ifdef HAVE_APPLICATIONSERVICES_H + /* + * Convert the file referenced in APPrinterIconPath to a 128x128 PNG + * and save it as cacheDir/printername.png + */ + + if ((ppd_attr = ppdFindAttr(ppd, "APPrinterIconPath", NULL)) != NULL && + ppd_attr->value && + !_cupsFileCheck(ppd_attr->value, _CUPS_FILE_CHECK_FILE, !RunUser, + cupsdLogFCMessage, p)) + { + CGImageRef imageRef = NULL;/* Current icon image */ + CGImageRef biggestIconRef = NULL; + /* Biggest icon image */ + CGImageRef closestTo128IconRef = NULL; + /* Icon image closest to and >= 128 */ + CGImageSourceRef sourceRef; /* The file's image source */ + char outPath[HTTP_MAX_URI]; + /* The path to the PNG file */ + CFURLRef outUrl; /* The URL made from the outPath */ + CFURLRef icnsFileUrl; /* The URL of the original ICNS icon file */ + CGImageDestinationRef destRef; /* The image destination to write */ + size_t bytesPerRow; /* The bytes per row used for resizing */ + CGContextRef context; /* The CG context used for resizing */ + + snprintf(outPath, sizeof(outPath), "%s/%s.png", CacheDir, p->name); + outUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, + (UInt8 *)outPath, + strlen(outPath), + FALSE); + icnsFileUrl = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, + (UInt8 *)ppd_attr->value, + strlen(ppd_attr->value), + FALSE); + if (outUrl && icnsFileUrl) + { + sourceRef = CGImageSourceCreateWithURL(icnsFileUrl, NULL); + if (sourceRef) + { + for (i = 0; i < CGImageSourceGetCount(sourceRef); i ++) + { + imageRef = CGImageSourceCreateImageAtIndex(sourceRef, i, NULL); + if (!imageRef) + continue; + + if (CGImageGetWidth(imageRef) == CGImageGetHeight(imageRef)) + { + /* + * Loop through remembering the icon closest to 128 but >= 128 + * and then remember the largest icon. + */ + + if (CGImageGetWidth(imageRef) >= 128 && + (!closestTo128IconRef || + CGImageGetWidth(imageRef) < + CGImageGetWidth(closestTo128IconRef))) + { + CGImageRelease(closestTo128IconRef); + CGImageRetain(imageRef); + closestTo128IconRef = imageRef; + } + + if (!biggestIconRef || + CGImageGetWidth(imageRef) > CGImageGetWidth(biggestIconRef)) + { + CGImageRelease(biggestIconRef); + CGImageRetain(imageRef); + biggestIconRef = imageRef; + } + } + + CGImageRelease(imageRef); + } + + if (biggestIconRef) + { + /* + * If biggestIconRef is NULL, we found no icons. Otherwise we first + * want the closest to 128, but if none are larger than 128, we want + * the largest icon available. + */ + + imageRef = closestTo128IconRef ? closestTo128IconRef : + biggestIconRef; + CGImageRetain(imageRef); + CGImageRelease(biggestIconRef); + if (closestTo128IconRef) + CGImageRelease(closestTo128IconRef); + destRef = CGImageDestinationCreateWithURL(outUrl, kUTTypePNG, 1, + NULL); + if (destRef) + { + if (CGImageGetWidth(imageRef) != 128) + { + bytesPerRow = CGImageGetBytesPerRow(imageRef) / + CGImageGetWidth(imageRef) * 128; + context = CGBitmapContextCreate(NULL, 128, 128, + CGImageGetBitsPerComponent(imageRef), + bytesPerRow, + CGImageGetColorSpace(imageRef), + kCGImageAlphaPremultipliedFirst); + if (context) + { + CGContextDrawImage(context, CGRectMake(0, 0, 128, 128), + imageRef); + CGImageRelease(imageRef); + imageRef = CGBitmapContextCreateImage(context); + CGContextRelease(context); + } + } + + CGImageDestinationAddImage(destRef, imageRef, NULL); + CGImageDestinationFinalize(destRef); + CFRelease(destRef); + } + + CGImageRelease(imageRef); + } + + CFRelease(sourceRef); + } + } + + if (outUrl) + CFRelease(outUrl); + + if (icnsFileUrl) + CFRelease(icnsFileUrl); + } +#endif /* HAVE_APPLICATIONSERVICES_H */ + + /* + * Close the PPD and set the type... + */ + + ppdClose(ppd); + } + else if (!access(ppd_name, 0)) + { + int pline; /* PPD line number */ + ppd_status_t pstatus; /* PPD load status */ + + + pstatus = ppdLastError(&pline); + + cupsdLogMessage(CUPSD_LOG_ERROR, "PPD file for %s cannot be loaded!", + p->name); + + if (pstatus <= PPD_ALLOC_ERROR) + cupsdLogMessage(CUPSD_LOG_ERROR, "%s", strerror(errno)); + else + cupsdLogMessage(CUPSD_LOG_ERROR, "%s on line %d.", + ppdErrorString(pstatus), pline); + + cupsdLogMessage(CUPSD_LOG_INFO, + "Hint: Run \"cupstestppd %s\" and fix any errors.", + ppd_name); + } + else + { + /* + * If we have an interface script, add a filter entry for it... + */ + + char interface[1024]; /* Interface script */ + + + snprintf(interface, sizeof(interface), "%s/interfaces/%s", ServerRoot, + p->name); + if (!access(interface, X_OK)) + { + /* + * Yes, we have a System V style interface script; use it! + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, + "Local System V Printer"); + } + else if (!strncmp(p->device_uri, "ipp://", 6) && + (strstr(p->device_uri, "/printers/") != NULL || + strstr(p->device_uri, "/classes/") != NULL || + (strstr(p->device_uri, "._ipp.") != NULL && + !strcmp(p->device_uri + strlen(p->device_uri) - 5, + "/cups")))) + { + /* + * Tell the client this is really a hard-wired remote printer. + */ + + p->type |= CUPS_PRINTER_REMOTE; + + /* + * Point the printer-uri-supported attribute to the + * remote printer... + */ + + if (strchr(p->device_uri, '?')) + { + /* + * Strip trailing "?options" from URI... + */ + + char resource[HTTP_MAX_URI], /* New URI */ + *ptr; /* Pointer into URI */ + + strlcpy(resource, p->device_uri, sizeof(resource)); + if ((ptr = strchr(resource, '?')) != NULL) + *ptr = '\0'; + + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-uri-supported", NULL, resource); + } + else + ippAddString(p->attrs, IPP_TAG_PRINTER, IPP_TAG_URI, + "printer-uri-supported", NULL, p->device_uri); + + /* + * Then set the make-and-model accordingly... + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, "Remote Printer"); + + /* + * Print all files directly... + */ + + p->raw = 1; + p->remote = 1; + } + else + { + /* + * Otherwise we have neither - treat this as a "dumb" printer + * with no PPD file... + */ + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_TEXT, + "printer-make-and-model", NULL, "Local Raw Printer"); + + p->raw = 1; + } + } + + ippAddIntegers(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "finishings-supported", num_finishings, finishings); + ippAddInteger(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_ENUM, + "finishings-default", IPP_FINISHINGS_NONE); + + if (ppd && p->pc) + { + /* + * Save cached PPD attributes to disk... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "load_ppd: Saving %s...", cache_name); + + _ppdCacheWriteFile(p->pc, cache_name, p->ppd_attrs); + } + else + { + /* + * Remove cache files... + */ + + if (cache_info.st_mtime) + unlink(cache_name); + } +} + + +/* + * 'log_ipp_conformance()' - Log an IPP conformance issue with a printer. + */ + +static void +log_ipp_conformance( + cupsd_printer_t *p, /* I - Printer */ + const char *reason) /* I - Printer state reason */ +{ + const char *message; /* Message to log */ +#ifdef __APPLE__ + aslmsg aslm; /* Apple System Log message */ +#endif /* __APPLE__ */ + + + /* + * Strip the leading "cups-ipp-" from the reason and create a log message for + * it... + */ + + reason += 9; + if (!strcmp(reason, "missing-cancel-job")) + message = "Printer does not support REQUIRED Cancel-Job operation."; + else if (!strcmp(reason, "missing-get-job-attributes")) + message = "Printer does not support REQUIRED Get-Job-Attributes operation."; + else if (!strcmp(reason, "missing-print-job")) + message = "Printer does not support REQUIRED Print-Job operation."; + else if (!strcmp(reason, "missing-validate-job")) + message = "Printer does not support REQUIRED Validate-Job operation."; + else if (!strcmp(reason, "missing-get-printer-attributes")) + message = "Printer does not support REQUIRED Get-Printer-Attributes operation."; + else if (!strcmp(reason, "missing-send-document")) + message = "Printer supports Create-Job but not Send-Document operation."; + else if (!strcmp(reason, "missing-job-history")) + message = "Printer does not provide REQUIRED job history."; + else if (!strcmp(reason, "missing-job-id")) + message = "Printer does not provide REQUIRED job-id attribute."; + else if (!strcmp(reason, "missing-job-state")) + message = "Printer does not provide REQUIRED job-state attribute."; + else if (!strcmp(reason, "missing-operations-supported")) + message = "Printer does not provide REQUIRED operations-supported " + "attribute."; + else if (!strcmp(reason, "missing-printer-is-accepting-jobs")) + message = "Printer does not provide REQUIRED printer-is-accepting-jobs " + "attribute."; + else if (!strcmp(reason, "missing-printer-state-reasons")) + message = "Printer does not provide REQUIRED printer-state-reasons " + "attribute."; + else if (!strcmp(reason, "wrong-http-version")) + message = "Printer does not use REQUIRED HTTP/1.1 transport."; + else + message = "Unknown IPP conformance failure."; + + cupsdLogMessage(CUPSD_LOG_WARN, "%s: %s", p->name, message); + +#ifdef __APPLE__ + /* + * Report the failure information to Apple if the user opts into providing + * feedback to Apple... + */ + + aslm = asl_new(ASL_TYPE_MSG); + if (aslm) + { + asl_set(aslm, "com.apple.message.domain", "com.apple.printing.ipp.conformance"); + asl_set(aslm, "com.apple.message.domain_scope", "com.apple.printing.ipp.conformance"); + asl_set(aslm, "com.apple.message.signature", reason); + asl_set(aslm, "com.apple.message.signature2", + p->make_model ? p->make_model : "Unknown"); + asl_log(NULL, aslm, ASL_LEVEL_NOTICE, "%s: %s", + p->make_model ? p->make_model : "Unknown", message); + asl_free(aslm); + } +#endif /* __APPLE__ */ +} + + +/* + * 'new_media_col()' - Create a media-col collection value. + */ + +static ipp_t * /* O - Collection value */ +new_media_col(_pwg_size_t *size, /* I - media-size/margin values */ + const char *source, /* I - media-source value */ + const char *type) /* I - media-type value */ +{ + ipp_t *media_col, /* Collection value */ + *media_size; /* media-size value */ + + + media_col = ippNew(); + + media_size = ippNew(); + ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "x-dimension", size->width); + ippAddInteger(media_size, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "y-dimension", size->length); + ippAddCollection(media_col, IPP_TAG_PRINTER, "media-size", media_size); + ippDelete(media_size); + + ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-bottom-margin", size->bottom); + ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-left-margin", size->left); + ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-right-margin", size->right); + ippAddInteger(media_col, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "media-top-margin", size->top); + + if (source) + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-source", + NULL, source); + + if (type) + ippAddString(media_col, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, "media-type", + NULL, type); + + return (media_col); +} + + +#ifdef __sgi +/* + * 'write_irix_config()' - Update the config files used by the IRIX + * desktop tools. + */ + +static void +write_irix_config(cupsd_printer_t *p) /* I - Printer to update */ +{ + char filename[1024]; /* Interface script filename */ + cups_file_t *fp; /* Interface script file */ + ipp_attribute_t *attr; /* Attribute data */ + + + /* + * Add dummy interface and GUI scripts to fool SGI's "challenged" printing + * tools. First the interface script that tells the tools what kind of + * printer we have... + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/interface/%s", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePuts(fp, "#!/bin/sh\n"); + + if ((attr = ippFindAttribute(p->attrs, "printer-make-and-model", + IPP_TAG_TEXT)) != NULL) + cupsFilePrintf(fp, "NAME=\"%s\"\n", attr->values[0].string.text); + else if (p->type & CUPS_PRINTER_CLASS) + cupsFilePuts(fp, "NAME=\"Printer Class\"\n"); + else + cupsFilePuts(fp, "NAME=\"Remote Destination\"\n"); + + if (p->type & CUPS_PRINTER_COLOR) + cupsFilePuts(fp, "TYPE=ColorPostScript\n"); + else + cupsFilePuts(fp, "TYPE=MonoPostScript\n"); + + cupsFilePrintf(fp, "HOSTNAME=%s\n", ServerName); + cupsFilePrintf(fp, "HOSTPRINTER=%s\n", p->name); + + cupsFileClose(fp); + + chmod(filename, 0755); + chown(filename, User, Group); + } + + /* + * Then the member file that tells which device file the queue is connected + * to... Networked printers use "/dev/null" in this file, so that's what + * we use (the actual device URI can confuse some apps...) + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/member/%s", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePuts(fp, "/dev/null\n"); + + cupsFileClose(fp); + + chmod(filename, 0644); + chown(filename, User, Group); + } + + /* + * The gui_interface file is a script or program that launches a GUI + * option panel for the printer, using options specified on the + * command-line in the third argument. The option panel must send + * any printing options to stdout on a single line when the user + * accepts them, or nothing if the user cancels the dialog. + * + * The default options panel program is /usr/bin/glpoptions, from + * the ESP Print Pro software. You can select another using the + * PrintcapGUI option. + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/gui_interface/ELF/%s.gui", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePuts(fp, "#!/bin/sh\n"); + cupsFilePrintf(fp, "%s -d %s -o \"$3\"\n", PrintcapGUI, p->name); + + cupsFileClose(fp); + + chmod(filename, 0755); + chown(filename, User, Group); + } + + /* + * The POD config file is needed by the printstatus command to show + * the printer location and device. + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.config", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePrintf(fp, "Printer Class | %s\n", + (p->type & CUPS_PRINTER_COLOR) ? "ColorPostScript" : "MonoPostScript"); + cupsFilePrintf(fp, "Printer Model | %s\n", p->make_model ? p->make_model : ""); + cupsFilePrintf(fp, "Location Code | %s\n", p->location ? p->location : ""); + cupsFilePrintf(fp, "Physical Location | %s\n", p->info ? p->info : ""); + cupsFilePrintf(fp, "Port Path | %s\n", p->device_uri); + cupsFilePrintf(fp, "Config Path | /var/spool/lp/pod/%s.config\n", p->name); + cupsFilePrintf(fp, "Active Status Path | /var/spool/lp/pod/%s.status\n", p->name); + cupsFilePuts(fp, "Status Update Wait | 10 seconds\n"); + + cupsFileClose(fp); + + chmod(filename, 0664); + chown(filename, User, Group); + } +} + + +/* + * 'write_irix_state()' - Update the status files used by IRIX printing + * desktop tools. + */ + +static void +write_irix_state(cupsd_printer_t *p) /* I - Printer to update */ +{ + char filename[1024]; /* Interface script filename */ + cups_file_t *fp; /* Interface script file */ + int tag; /* Status tag value */ + + + if (p) + { + /* + * The POD status file is needed for the printstatus window to + * provide the current status of the printer. + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/pod/%s.status", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePrintf(fp, "Operational Status | %s\n", + (p->state == IPP_PRINTER_IDLE) ? "Idle" : + (p->state == IPP_PRINTER_PROCESSING) ? "Busy" : + "Faulted"); + cupsFilePrintf(fp, "Information | 01 00 00 | %s\n", CUPS_SVERSION); + cupsFilePrintf(fp, "Information | 02 00 00 | Device URI: %s\n", + p->device_uri); + cupsFilePrintf(fp, "Information | 03 00 00 | %s jobs\n", + p->accepting ? "Accepting" : "Not accepting"); + cupsFilePrintf(fp, "Information | 04 00 00 | %s\n", p->state_message); + + cupsFileClose(fp); + + chmod(filename, 0664); + chown(filename, User, Group); + } + + /* + * The activeicons file is needed to provide desktop icons for printers: + * + * [ quoted from /usr/lib/print/tagit ] + * + * --- Type of printer tags (base values) + * + * Dumb=66048 # 0x10200 + * DumbColor=66080 # 0x10220 + * Raster=66112 # 0x10240 + * ColorRaster=66144 # 0x10260 + * Plotter=66176 # 0x10280 + * PostScript=66208 # 0x102A0 + * ColorPostScript=66240 # 0x102C0 + * MonoPostScript=66272 # 0x102E0 + * + * --- Printer state modifiers for local printers + * + * Idle=0 # 0x0 + * Busy=1 # 0x1 + * Faulted=2 # 0x2 + * Unknown=3 # 0x3 (Faulted due to unknown reason) + * + * --- Printer state modifiers for network printers + * + * NetIdle=8 # 0x8 + * NetBusy=9 # 0x9 + * NetFaulted=10 # 0xA + * NetUnknown=11 # 0xB (Faulted due to unknown reason) + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/activeicons/%s", p->name); + + if (p->type & CUPS_PRINTER_CLASS) + unlink(filename); + else if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + if (p->type & CUPS_PRINTER_COLOR) + tag = 66240; + else + tag = 66272; + + if (p->type & CUPS_PRINTER_REMOTE) + tag |= 8; + + if (p->state == IPP_PRINTER_PROCESSING) + tag |= 1; + + else if (p->state == IPP_PRINTER_STOPPED) + tag |= 2; + + cupsFilePuts(fp, "#!/bin/sh\n"); + cupsFilePrintf(fp, "#Tag %d\n", tag); + + cupsFileClose(fp); + + chmod(filename, 0755); + chown(filename, User, Group); + } + } + + /* + * The default file is needed by the printers window to show + * the default printer. + */ + + snprintf(filename, sizeof(filename), "/var/spool/lp/default"); + + if (DefaultPrinter != NULL) + { + if ((fp = cupsFileOpen(filename, "w")) != NULL) + { + cupsFilePrintf(fp, "%s\n", DefaultPrinter->name); + + cupsFileClose(fp); + + chmod(filename, 0644); + chown(filename, User, Group); + } + } + else + unlink(filename); +} +#endif /* __sgi */ + + +/* + * 'write_xml_string()' - Write a string with XML escaping. + */ + +static void +write_xml_string(cups_file_t *fp, /* I - File to write to */ + const char *s) /* I - String to write */ +{ + const char *start; /* Start of current sequence */ + + + if (!s) + return; + + for (start = s; *s; s ++) + { + if (*s == '&') + { + if (s > start) + cupsFileWrite(fp, start, s - start); + + cupsFilePuts(fp, "&"); + start = s + 1; + } + else if (*s == '<') + { + if (s > start) + cupsFileWrite(fp, start, s - start); + + cupsFilePuts(fp, "<"); + start = s + 1; + } + } + + if (s > start) + cupsFilePuts(fp, start); +} + + +/* + * End of "$Id: printers.c 10295 2012-02-15 23:21:06Z mike $". + */ diff --git a/scheduler/printers.h b/scheduler/printers.h new file mode 100644 index 0000000..e31ceb0 --- /dev/null +++ b/scheduler/printers.h @@ -0,0 +1,191 @@ +/* + * "$Id: printers.h 9621 2011-03-18 18:42:46Z mike $" + * + * Printer definitions for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifdef HAVE_DNSSD +# include +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI +# include "avahi.h" +#endif /* HAVE_AVAHI */ +#include + + +/* + * Quota data... + */ + +typedef struct +{ + char username[33]; /* User data */ + time_t next_update; /* Next update time */ + int page_count, /* Count of pages */ + k_count; /* Count of kilobytes */ +} cupsd_quota_t; + + +/* + * Printer/class information structure... + */ + +typedef struct cupsd_job_s cupsd_job_t; + +struct cupsd_printer_s +{ + char *uri, /* Printer URI */ + *uuid, /* Printer UUID */ + *hostname, /* Host printer resides on */ + *name, /* Printer name */ + *location, /* Location code */ + *make_model, /* Make and model */ + *info, /* Description */ + *op_policy, /* Operation policy name */ + *error_policy; /* Error policy */ + cupsd_policy_t *op_policy_ptr; /* Pointer to operation policy */ + int shared; /* Shared? */ + int accepting; /* Accepting jobs? */ + int holding_new_jobs; /* Holding new jobs for printing? */ + int in_implicit_class; /* In an implicit class? */ + ipp_pstate_t state; /* Printer state */ + char state_message[1024]; /* Printer state message */ + int num_reasons; /* Number of printer-state-reasons */ + char *reasons[64]; /* printer-state-reasons strings */ + time_t state_time; /* Time at this state */ + char *job_sheets[2]; /* Banners/job sheets */ + cups_ptype_t type; /* Printer type (color, small, etc.) */ + char *browse_attrs; /* Attributes sent with browse data */ + time_t browse_expire; /* Expiration time for printer */ + time_t browse_time; /* Last time update was sent/received */ + char *device_uri; /* Device URI */ + char *sanitized_device_uri; /* Sanitized device URI */ + char *port_monitor; /* Port monitor */ + int raw; /* Raw queue? */ + int remote; /* Remote queue? */ + mime_type_t *filetype, /* Pseudo-filetype for printer */ + *prefiltertype; /* Pseudo-filetype for pre-filters */ + cups_array_t *filetypes, /* Supported file types */ + *dest_types; /* Destination types for queue */ + cupsd_job_t *job; /* Current job in queue */ + ipp_t *attrs, /* Attributes supported by this printer */ + *ppd_attrs; /* Attributes based on the PPD */ + int num_printers, /* Number of printers in class */ + last_printer; /* Last printer job was sent to */ + struct cupsd_printer_s **printers; /* Printers in class */ + int quota_period, /* Period for quotas */ + page_limit, /* Maximum number of pages */ + k_limit; /* Maximum number of kilobytes */ + cups_array_t *quotas; /* Quota records */ + int deny_users; /* 1 = deny, 0 = allow */ + cups_array_t *users; /* Allowed/denied users */ + int sequence_number; /* Increasing sequence number */ + int num_options; /* Number of default options */ + cups_option_t *options; /* Default options */ + int num_auth_info_required; /* Number of required auth fields */ + const char *auth_info_required[4]; /* Required authentication fields */ + char *alert, /* PSX printer-alert value */ + *alert_description; /* PSX printer-alert-description value */ + time_t marker_time; /* Last time marker attributes were updated */ + _ppd_cache_t *pc; /* PPD cache and mapping data */ + +#if defined(HAVE_DNSSD) || defined(HAVE_AVAHI) + char *reg_name, /* Name used for service registration */ + *pdl; /* pdl value for TXT record */ +#endif /* defined(HAVE_DNSSD) || defined(HAVE_AVAHI) */ +#ifdef HAVE_DNSSD + char *ipp_txt, /* IPP TXT record contents */ + *printer_txt; /* LPD TXT record contents */ + int ipp_len, /* IPP TXT record length */ + printer_len; /* LPD TXT record length */ + DNSServiceRef ipp_ref, /* Reference for _ipp._tcp,_cups */ + printer_ref; /* Reference for _printer._tcp */ +#endif /* HAVE_DNSSD */ +#ifdef HAVE_AVAHI + AvahiStringList *ipp_txt, /* IPP TXT record */ + *printer_txt; /* LPD TXT record */ + AvahiEntryGroup *avahi_group; /* Avahi entry group */ +#endif /* HAVE_AVAHI */ +}; + + +/* + * Globals... + */ + +VAR ipp_t *CommonData VALUE(NULL); + /* Common printer object attrs */ +VAR cups_array_t *CommonDefaults VALUE(NULL); + /* Common -default option names */ +VAR cups_array_t *Printers VALUE(NULL), + /* Printer list */ + *ImplicitPrinters VALUE(NULL); + /* Implicit class printers */ +VAR cupsd_printer_t *DefaultPrinter VALUE(NULL); + /* Default printer */ +VAR char *DefaultPolicy VALUE(NULL); + /* Default policy name */ +VAR cupsd_policy_t *DefaultPolicyPtr + VALUE(NULL); + /* Pointer to default policy */ + + +/* + * Prototypes... + */ + +extern cupsd_printer_t *cupsdAddPrinter(const char *name); +extern void cupsdCreateCommonData(void); +extern void cupsdDeleteAllPrinters(void); +extern int cupsdDeletePrinter(cupsd_printer_t *p, int update); +extern cupsd_printer_t *cupsdFindDest(const char *name); +extern cupsd_printer_t *cupsdFindPrinter(const char *name); +extern cupsd_quota_t *cupsdFindQuota(cupsd_printer_t *p, + const char *username); +extern void cupsdFreeQuotas(cupsd_printer_t *p); +extern void cupsdLoadAllPrinters(void); +extern void cupsdRenamePrinter(cupsd_printer_t *p, + const char *name); +extern void cupsdSaveAllPrinters(void); +extern int cupsdSetAuthInfoRequired(cupsd_printer_t *p, + const char *values, + ipp_attribute_t *attr); +extern void cupsdSetDeviceURI(cupsd_printer_t *p, const char *uri); +extern void cupsdSetPrinterAttr(cupsd_printer_t *p, + const char *name, char *value); +extern void cupsdSetPrinterAttrs(cupsd_printer_t *p); +extern int cupsdSetPrinterReasons(cupsd_printer_t *p, + const char *s); +extern void cupsdSetPrinterState(cupsd_printer_t *p, ipp_pstate_t s, + int update); +#define cupsdStartPrinter(p,u) cupsdSetPrinterState((p), IPP_PRINTER_IDLE, (u)) +extern void cupsdStopPrinter(cupsd_printer_t *p, int update); +extern int cupsdUpdatePrinterPPD(cupsd_printer_t *p, + int num_keywords, + cups_option_t *keywords); +extern void cupsdUpdatePrinters(void); +extern cupsd_quota_t *cupsdUpdateQuota(cupsd_printer_t *p, + const char *username, int pages, + int k); +extern const char *cupsdValidateDest(const char *uri, + cups_ptype_t *dtype, + cupsd_printer_t **printer); +extern void cupsdWritePrintcap(void); +extern void cupsdCmsRegisterPrinter(cupsd_printer_t *p); +extern void cupsdCmsUnregisterPrinter(cupsd_printer_t *p); +extern void cupsdCmsStart(void); +extern void cupsdCmsStop(void); + + +/* + * End of "$Id: printers.h 9621 2011-03-18 18:42:46Z mike $". + */ diff --git a/scheduler/process.c b/scheduler/process.c new file mode 100644 index 0000000..c1ca526 --- /dev/null +++ b/scheduler/process.c @@ -0,0 +1,656 @@ +/* + * "$Id: process.c 9790 2011-05-19 22:40:03Z mike $" + * + * Process management routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdCreateProfile() - Create an execution profile for a subprocess. + * cupsdDestroyProfile() - Delete an execution profile. + * cupsdEndProcess() - End a process. + * cupsdFinishProcess() - Finish a process and get its name. + * cupsdStartProcess() - Start a process. + * compare_procs() - Compare two processes. + * cupsd_requote() - Make a regular-expression version of a string. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include +#ifdef __APPLE__ +# include +#endif /* __APPLE__ */ + + +/* + * Process structure... + */ + +typedef struct +{ + int pid, /* Process ID */ + job_id; /* Job associated with process */ + char name[1]; /* Name of process */ +} cupsd_proc_t; + + +/* + * Local globals... + */ + +static cups_array_t *process_array = NULL; + + +/* + * Local functions... + */ + +static int compare_procs(cupsd_proc_t *a, cupsd_proc_t *b); +#ifdef HAVE_SANDBOX_H +static char *cupsd_requote(char *dst, const char *src, size_t dstsize); +#endif /* HAVE_SANDBOX_H */ + + +/* + * 'cupsdCreateProfile()' - Create an execution profile for a subprocess. + */ + +void * /* O - Profile or NULL on error */ +cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */ +{ +#ifdef HAVE_SANDBOX_H + cups_file_t *fp; /* File pointer */ + char profile[1024], /* File containing the profile */ + cache[1024], /* Quoted CacheDir */ + request[1024], /* Quoted RequestRoot */ + root[1024], /* Quoted ServerRoot */ + temp[1024]; /* Quoted TempDir */ + const char *nodebug; /* " (with no-log)" for no debug */ + + + if (!UseProfiles) + { + /* + * Only use sandbox profiles as root... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); + + return (NULL); + } + + if ((fp = cupsTempFile2(profile, sizeof(profile))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create security profile: %s", + strerror(errno)); + return (NULL); + } + + fchown(cupsFileNumber(fp), RunUser, Group); + fchmod(cupsFileNumber(fp), 0640); + + cupsd_requote(cache, CacheDir, sizeof(cache)); + cupsd_requote(request, RequestRoot, sizeof(request)); + cupsd_requote(root, ServerRoot, sizeof(root)); + cupsd_requote(temp, TempDir, sizeof(temp)); + + nodebug = LogLevel < CUPSD_LOG_DEBUG ? " (with no-log)" : ""; + + cupsFilePuts(fp, "(version 1)\n"); + cupsFilePuts(fp, "(allow default)\n"); + cupsFilePrintf(fp, + "(deny file-write* file-read-data file-read-metadata\n" + " (regex" + " #\"^%s$\"" /* RequestRoot */ + " #\"^%s/\"" /* RequestRoot/... */ + ")%s)\n", + request, request, nodebug); + if (!RunUser) + cupsFilePrintf(fp, + "(deny file-write* file-read-data file-read-metadata\n" + " (regex" + " #\"^/Users$\"" + " #\"^/Users/\"" + ")%s)\n", nodebug); + cupsFilePrintf(fp, + "(deny file-write*\n" + " (regex" + " #\"^%s$\"" /* ServerRoot */ + " #\"^%s/\"" /* ServerRoot/... */ + " #\"^/private/etc$\"" + " #\"^/private/etc/\"" + " #\"^/usr/local/etc$\"" + " #\"^/usr/local/etc/\"" + " #\"^/Library$\"" + " #\"^/Library/\"" + " #\"^/System$\"" + " #\"^/System/\"" + ")%s)\n", + root, root, nodebug); + /* Specifically allow applications to stat RequestRoot */ + cupsFilePrintf(fp, + "(allow file-read-metadata\n" + " (regex" + " #\"^%s$\"" /* RequestRoot */ + "))\n", + request); + cupsFilePrintf(fp, + "(allow file-write* file-read-data file-read-metadata\n" + " (regex" + " #\"^%s$\"" /* TempDir */ + " #\"^%s/\"" /* TempDir/... */ + " #\"^%s$\"" /* CacheDir */ + " #\"^%s/\"" /* CacheDir/... */ + " #\"^%s/Library$\"" /* RequestRoot/Library */ + " #\"^%s/Library/\"" /* RequestRoot/Library/... */ + " #\"^/Library/Application Support/\"" + " #\"^/Library/Caches/\"" + " #\"^/Library/Preferences/\"" + " #\"^/Library/Printers/.*/\"" + " #\"^/Users/Shared/\"" + "))\n", + temp, temp, cache, cache, request, request); + cupsFilePrintf(fp, + "(deny file-write*\n" + " (regex" + " #\"^/Library/Printers/PPDs$\"" + " #\"^/Library/Printers/PPDs/\"" + " #\"^/Library/Printers/PPD Plugins$\"" + " #\"^/Library/Printers/PPD Plugins/\"" + ")%s)\n", nodebug); + if (job_id) + { + /* + * Allow job filters to read the spool file(s)... + */ + + cupsFilePrintf(fp, + "(allow file-read-data file-read-metadata\n" + " (regex #\"^%s/([ac]%05d|d%05d-[0-9][0-9][0-9])$\"))\n", + request, job_id, job_id); + } + else + { + /* + * Allow email notifications from notifiers... + */ + + cupsFilePuts(fp, + "(allow process-exec\n" + " (literal \"/usr/sbin/sendmail\")\n" + " (with no-sandbox)\n" + ")\n"); + } + + cupsFileClose(fp); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = \"%s\"", + job_id, profile); + return ((void *)strdup(profile)); + +#else + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); + + return (NULL); +#endif /* HAVE_SANDBOX_H */ +} + + +/* + * 'cupsdDestroyProfile()' - Delete an execution profile. + */ + +void +cupsdDestroyProfile(void *profile) /* I - Profile */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteProfile(profile=\"%s\")", + profile ? (char *)profile : "(null)"); + +#ifdef HAVE_SANDBOX_H + if (profile) + { + unlink((char *)profile); + free(profile); + } +#endif /* HAVE_SANDBOX_H */ +} + + +/* + * 'cupsdEndProcess()' - End a process. + */ + +int /* O - 0 on success, -1 on failure */ +cupsdEndProcess(int pid, /* I - Process ID */ + int force) /* I - Force child to die */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdEndProcess(pid=%d, force=%d)", pid, + force); + + if (!pid) + return (0); + + if (!RunUser) + { + /* + * When running as root, cupsd puts child processes in their own process + * group. Using "-pid" sends a signal to all processes in the group. + */ + + pid = -pid; + } + + if (force) + return (kill(pid, SIGKILL)); + else + return (kill(pid, SIGTERM)); +} + + +/* + * 'cupsdFinishProcess()' - Finish a process and get its name. + */ + +const char * /* O - Process name */ +cupsdFinishProcess(int pid, /* I - Process ID */ + char *name, /* I - Name buffer */ + int namelen, /* I - Size of name buffer */ + int *job_id) /* O - Job ID pointer or NULL */ +{ + cupsd_proc_t key, /* Search key */ + *proc; /* Matching process */ + + + key.pid = pid; + + if ((proc = (cupsd_proc_t *)cupsArrayFind(process_array, &key)) != NULL) + { + if (job_id) + *job_id = proc->job_id; + + strlcpy(name, proc->name, namelen); + cupsArrayRemove(process_array, proc); + free(proc); + } + else + { + if (job_id) + *job_id = 0; + + strlcpy(name, "unknown", namelen); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdFinishProcess(pid=%d, name=%p, namelen=%d, " + "job_id=%p(%d)) = \"%s\"", pid, name, namelen, job_id, + job_id ? *job_id : 0, name); + + return (name); +} + + +/* + * 'cupsdStartProcess()' - Start a process. + */ + +int /* O - Process ID or 0 */ +cupsdStartProcess( + const char *command, /* I - Full path to command */ + char *argv[], /* I - Command-line arguments */ + char *envp[], /* I - Environment */ + int infd, /* I - Standard input file descriptor */ + int outfd, /* I - Standard output file descriptor */ + int errfd, /* I - Standard error file descriptor */ + int backfd, /* I - Backchannel file descriptor */ + int sidefd, /* I - Sidechannel file descriptor */ + int root, /* I - Run as root? */ + void *profile, /* I - Security profile to use */ + cupsd_job_t *job, /* I - Job associated with process */ + int *pid) /* O - Process ID */ +{ + int i; /* Looping var */ + const char *exec_path = command; /* Command to be exec'd */ + char *real_argv[103], /* Real command-line arguments */ + cups_exec[1024]; /* Path to "cups-exec" program */ + int user; /* Command UID */ + cupsd_proc_t *proc; /* New process record */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* POSIX signal handler */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ +#if defined(__APPLE__) + char processPath[1024], /* CFProcessPath environment variable */ + linkpath[1024]; /* Link path for symlinks... */ + int linkbytes; /* Bytes for link path */ +#endif /* __APPLE__ */ + + + *pid = 0; + + /* + * Figure out the UID for the child process... + */ + + if (RunUser) + user = RunUser; + else if (root) + user = 0; + else + user = User; + + /* + * Check the permissions of the command we are running... + */ + + if (_cupsFileCheck(command, _CUPS_FILE_CHECK_PROGRAM, !RunUser, + cupsdLogFCMessage, job ? job->printer : NULL)) + return (0); + +#if defined(__APPLE__) + if (envp) + { + /* + * Add special voodoo magic for Mac OS X - this allows Mac OS X + * programs to access their bundle resources properly... + */ + + if ((linkbytes = readlink(command, linkpath, sizeof(linkpath) - 1)) > 0) + { + /* + * Yes, this is a symlink to the actual program, nul-terminate and + * use it... + */ + + linkpath[linkbytes] = '\0'; + + if (linkpath[0] == '/') + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s", + linkpath); + else + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s/%s", + dirname((char *)command), linkpath); + } + else + snprintf(processPath, sizeof(processPath), "CFProcessPath=%s", command); + + envp[0] = processPath; /* Replace string */ + } +#endif /* __APPLE__ */ + + /* + * Use helper program when we have a sandbox profile... + */ + + if (profile) + { + snprintf(cups_exec, sizeof(cups_exec), "%s/daemon/cups-exec", ServerBin); + + real_argv[0] = cups_exec; + real_argv[1] = profile; + real_argv[2] = (char *)command; + + for (i = 0; + i < (int)(sizeof(real_argv) / sizeof(real_argv[0]) - 4) && argv[i]; + i ++) + real_argv[i + 3] = argv[i]; + + real_argv[i + 3] = NULL; + + argv = real_argv; + exec_path = cups_exec; + } + + /* + * Block signals before forking... + */ + + cupsdHoldSignals(); + + if ((*pid = fork()) == 0) + { + /* + * Child process goes here; update stderr as needed... + */ + + if (errfd != 2) + { + if (errfd < 0) + errfd = open("/dev/null", O_WRONLY); + + if (errfd != 2) + { + dup2(errfd, 2); + close(errfd); + } + } + + /* + * Put this process in its own process group so that we can kill any child + * processes it creates. + */ + +#ifdef HAVE_SETPGID + if (!RunUser && setpgid(0, 0)) + exit(errno + 100); +#else + if (!RunUser && setpgrp()) + exit(errno + 100); +#endif /* HAVE_SETPGID */ + + /* + * Update the remaining file descriptors as needed... + */ + + if (infd != 0) + { + if (infd < 0) + infd = open("/dev/null", O_RDONLY); + + if (infd != 0) + { + dup2(infd, 0); + close(infd); + } + } + + if (outfd != 1) + { + if (outfd < 0) + outfd = open("/dev/null", O_WRONLY); + + if (outfd != 1) + { + dup2(outfd, 1); + close(outfd); + } + } + + if (backfd != 3 && backfd >= 0) + { + dup2(backfd, 3); + close(backfd); + fcntl(3, F_SETFL, O_NDELAY); + } + + if (sidefd != 4 && sidefd >= 0) + { + dup2(sidefd, 4); + close(sidefd); + fcntl(4, F_SETFL, O_NDELAY); + } + + /* + * Change the priority of the process based on the FilterNice setting. + * (this is not done for root processes...) + */ + + if (!root) + nice(FilterNice); + + /* + * Reset group membership to just the main one we belong to. + */ + + if (!RunUser && setgid(Group)) + exit(errno + 100); + + if (!RunUser && setgroups(1, &Group)) + exit(errno + 100); + + /* + * Change user to something "safe"... + */ + + if (!RunUser && user && setuid(user)) + exit(errno + 100); + + /* + * Change umask to restrict permissions on created files... + */ + + umask(077); + + /* + * Unblock signals before doing the exec... + */ + +#ifdef HAVE_SIGSET + sigset(SIGTERM, SIG_DFL); + sigset(SIGCHLD, SIG_DFL); + sigset(SIGPIPE, SIG_DFL); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = SIG_DFL; + + sigaction(SIGTERM, &action, NULL); + sigaction(SIGCHLD, &action, NULL); + sigaction(SIGPIPE, &action, NULL); +#else + signal(SIGTERM, SIG_DFL); + signal(SIGCHLD, SIG_DFL); + signal(SIGPIPE, SIG_DFL); +#endif /* HAVE_SIGSET */ + + cupsdReleaseSignals(); + + /* + * Execute the command; if for some reason this doesn't work, log an error + * exit with a non-zero value... + */ + + if (envp) + execve(exec_path, argv, envp); + else + execv(exec_path, argv); + + exit(errno + 100); + } + else if (*pid < 0) + { + /* + * Error - couldn't fork a new process! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to fork %s - %s.", command, + strerror(errno)); + + *pid = 0; + } + else + { + if (!process_array) + process_array = cupsArrayNew((cups_array_func_t)compare_procs, NULL); + + if (process_array) + { + if ((proc = calloc(1, sizeof(cupsd_proc_t) + strlen(command))) != NULL) + { + proc->pid = *pid; + proc->job_id = job ? job->id : 0; + _cups_strcpy(proc->name, command); + + cupsArrayAdd(process_array, proc); + } + } + } + + cupsdReleaseSignals(); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " + "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " + "profile=%p, job=%p(%d), pid=%p) = %d", + command, argv, envp, infd, outfd, errfd, backfd, sidefd, + root, profile, job, job ? job->id : 0, pid, *pid); + + return (*pid); +} + + +/* + * 'compare_procs()' - Compare two processes. + */ + +static int /* O - Result of comparison */ +compare_procs(cupsd_proc_t *a, /* I - First process */ + cupsd_proc_t *b) /* I - Second process */ +{ + return (a->pid - b->pid); +} + + +#ifdef HAVE_SANDBOX_H +/* + * 'cupsd_requote()' - Make a regular-expression version of a string. + */ + +static char * /* O - Quoted string */ +cupsd_requote(char *dst, /* I - Destination buffer */ + const char *src, /* I - Source string */ + size_t dstsize) /* I - Size of destination buffer */ +{ + int ch; /* Current character */ + char *dstptr, /* Current position in buffer */ + *dstend; /* End of destination buffer */ + + + dstptr = dst; + dstend = dst + dstsize - 2; + + while (*src && dstptr < dstend) + { + ch = *src++; + + if (strchr(".?*()[]^$\\", ch)) + *dstptr++ = '\\'; + + *dstptr++ = ch; + } + + *dstptr = '\0'; + + return (dst); +} +#endif /* HAVE_SANDBOX_H */ + + +/* + * End of "$Id: process.c 9790 2011-05-19 22:40:03Z mike $". + */ diff --git a/scheduler/quotas.c b/scheduler/quotas.c new file mode 100644 index 0000000..5051756 --- /dev/null +++ b/scheduler/quotas.c @@ -0,0 +1,244 @@ +/* + * "$Id: quotas.c 9793 2011-05-20 03:49:49Z mike $" + * + * Quota routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdFindQuota() - Find a quota record. + * cupsdFreeQuotas() - Free quotas for a printer. + * cupsdUpdateQuota() - Update quota data for the specified printer and user. + * add_quota() - Add a quota record for this printer and user. + * compare_quotas() - Compare two quota records... + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + + +/* + * Local functions... + */ + +static cupsd_quota_t *add_quota(cupsd_printer_t *p, const char *username); +static int compare_quotas(const cupsd_quota_t *q1, + const cupsd_quota_t *q2); + + +/* + * 'cupsdFindQuota()' - Find a quota record. + */ + +cupsd_quota_t * /* O - Quota data */ +cupsdFindQuota( + cupsd_printer_t *p, /* I - Printer */ + const char *username) /* I - User */ +{ + cupsd_quota_t *q, /* Quota data pointer */ + match; /* Search data */ + char *ptr; /* Pointer into username */ + + + if (!p || !username) + return (NULL); + + strlcpy(match.username, username, sizeof(match.username)); + if ((ptr = strchr(match.username, '@')) != NULL) + *ptr = '\0'; /* Strip @domain/@KDC */ + + if ((q = (cupsd_quota_t *)cupsArrayFind(p->quotas, &match)) != NULL) + return (q); + else + return (add_quota(p, username)); +} + + +/* + * 'cupsdFreeQuotas()' - Free quotas for a printer. + */ + +void +cupsdFreeQuotas(cupsd_printer_t *p) /* I - Printer */ +{ + cupsd_quota_t *q; /* Current quota record */ + + + if (!p) + return; + + for (q = (cupsd_quota_t *)cupsArrayFirst(p->quotas); + q; + q = (cupsd_quota_t *)cupsArrayNext(p->quotas)) + free(q); + + cupsArrayDelete(p->quotas); + + p->quotas = NULL; +} + + +/* + * 'cupsdUpdateQuota()' - Update quota data for the specified printer and user. + */ + +cupsd_quota_t * /* O - Quota data */ +cupsdUpdateQuota( + cupsd_printer_t *p, /* I - Printer */ + const char *username, /* I - User */ + int pages, /* I - Number of pages */ + int k) /* I - Number of kilobytes */ +{ + cupsd_quota_t *q; /* Quota data */ + cupsd_job_t *job; /* Current job */ + time_t curtime; /* Current time */ + ipp_attribute_t *attr; /* Job attribute */ + + + if (!p || !username) + return (NULL); + + if (!p->k_limit && !p->page_limit) + return (NULL); + + if ((q = cupsdFindQuota(p, username)) == NULL) + return (NULL); + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdUpdateQuota: p=%s username=%s pages=%d k=%d", + p->name, username, pages, k); + + curtime = time(NULL); + + if (curtime < q->next_update) + { + q->page_count += pages; + q->k_count += k; + + return (q); + } + + if (p->quota_period) + curtime -= p->quota_period; + else + curtime = 0; + + q->next_update = 0; + q->page_count = 0; + q->k_count = 0; + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + { + /* + * We only care about the current printer/class and user... + */ + + if (_cups_strcasecmp(job->dest, p->name) != 0 || + _cups_strcasecmp(job->username, q->username) != 0) + continue; + + /* + * Make sure attributes are loaded; we always call cupsdLoadJob() to ensure + * the access_time member is updated so the job isn't unloaded right away... + */ + + if (!cupsdLoadJob(job)) + continue; + + if ((attr = ippFindAttribute(job->attrs, "time-at-completion", + IPP_TAG_INTEGER)) == NULL) + if ((attr = ippFindAttribute(job->attrs, "time-at-processing", + IPP_TAG_INTEGER)) == NULL) + attr = ippFindAttribute(job->attrs, "time-at-creation", + IPP_TAG_INTEGER); + + if (attr->values[0].integer < curtime) + { + /* + * This job is too old to count towards the quota, ignore it... + */ + + if (JobAutoPurge && !job->printer && job->state_value > IPP_JOB_STOPPED) + cupsdDeleteJob(job, CUPSD_JOB_PURGE); + + continue; + } + + if (q->next_update == 0) + q->next_update = attr->values[0].integer + p->quota_period; + + if ((attr = ippFindAttribute(job->attrs, "job-media-sheets-completed", + IPP_TAG_INTEGER)) != NULL) + q->page_count += attr->values[0].integer; + + if ((attr = ippFindAttribute(job->attrs, "job-k-octets", + IPP_TAG_INTEGER)) != NULL) + q->k_count += attr->values[0].integer; + } + + return (q); +} + + +/* + * 'add_quota()' - Add a quota record for this printer and user. + */ + +static cupsd_quota_t * /* O - Quota data */ +add_quota(cupsd_printer_t *p, /* I - Printer */ + const char *username) /* I - User */ +{ + cupsd_quota_t *q; /* New quota data */ + char *ptr; /* Pointer into username */ + + + if (!p || !username) + return (NULL); + + if (!p->quotas) + p->quotas = cupsArrayNew((cups_array_func_t)compare_quotas, NULL); + + if (!p->quotas) + return (NULL); + + if ((q = calloc(1, sizeof(cupsd_quota_t))) == NULL) + return (NULL); + + strlcpy(q->username, username, sizeof(q->username)); + if ((ptr = strchr(q->username, '@')) != NULL) + *ptr = '\0'; /* Strip @domain/@KDC */ + + cupsArrayAdd(p->quotas, q); + + return (q); +} + + +/* + * 'compare_quotas()' - Compare two quota records... + */ + +static int /* O - Result of comparison */ +compare_quotas(const cupsd_quota_t *q1, /* I - First quota record */ + const cupsd_quota_t *q2) /* I - Second quota record */ +{ + return (_cups_strcasecmp(q1->username, q2->username)); +} + + +/* + * End of "$Id: quotas.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/select.c b/scheduler/select.c new file mode 100644 index 0000000..99a2325 --- /dev/null +++ b/scheduler/select.c @@ -0,0 +1,951 @@ +/* + * "$Id: select.c 9350 2010-11-04 23:23:25Z mike $" + * + * Select abstraction functions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddSelect() - Add a file descriptor to the list. + * cupsdDoSelect() - Do a select-like operation. + * cupsdIsSelecting() - Determine whether we are monitoring a file + * descriptor. + * cupsdRemoveSelect() - Remove a file descriptor from the list. + * cupsdStartSelect() - Initialize the file polling engine. + * cupsdStopSelect() - Shutdown the file polling engine. + * compare_fds() - Compare file descriptors. + * find_fd() - Find an existing file descriptor record. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + +#ifdef HAVE_EPOLL +# include +# include +#elif defined(HAVE_KQUEUE) +# include +# include +#elif defined(HAVE_POLL) +# include +#elif defined(__hpux) +# include +#else +# include +#endif /* HAVE_EPOLL */ + + +/* + * Design Notes for Poll/Select API in CUPSD + * ----------------------------------------- + * + * SUPPORTED APIS + * + * OS select poll epoll kqueue /dev/poll + * -------------- ------ ------ ------ ------ --------- + * AIX YES YES NO NO NO + * FreeBSD YES YES NO YES NO + * HP-UX YES YES NO NO NO + * IRIX YES YES NO NO NO + * Linux YES YES YES NO NO + * MacOS X YES YES NO YES NO + * NetBSD YES YES NO YES NO + * OpenBSD YES YES NO YES NO + * Solaris YES YES NO NO YES + * Tru64 YES YES NO NO NO + * Windows YES NO NO NO NO + * + * + * HIGH-LEVEL API + * + * typedef void (*cupsd_selfunc_t)(void *data); + * + * void cupsdStartSelect(void); + * void cupsdStopSelect(void); + * void cupsdAddSelect(int fd, cupsd_selfunc_t read_cb, + * cupsd_selfunc_t write_cb, void *data); + * void cupsdRemoveSelect(int fd); + * int cupsdDoSelect(int timeout); + * + * + * IMPLEMENTATION STRATEGY + * + * 0. Common Stuff + * a. CUPS array of file descriptor to callback functions + * and data + temporary array of removed fd's. + * b. cupsdStartSelect() creates the arrays + * c. cupsdStopSelect() destroys the arrays and all elements. + * d. cupsdAddSelect() adds to the array and allocates a + * new callback element. + * e. cupsdRemoveSelect() removes from the active array and + * adds to the inactive array. + * f. _cupsd_fd_t provides a reference-counted structure for + * tracking file descriptors that are monitored. + * g. cupsdDoSelect() frees all inactive FDs. + * + * 1. select() O(n) + * a. Input/Output fd_set variables, copied to working + * copies and then used with select(). + * b. Loop through CUPS array, using FD_ISSET and calling + * the read/write callbacks as needed. + * c. cupsdRemoveSelect() clears fd_set bit from main and + * working sets. + * d. cupsdStopSelect() frees all of the memory used by the + * CUPS array and fd_set's. + * + * 2. poll() - O(n log n) + * a. Regular array of pollfd, sorted the same as the CUPS + * array. + * b. Loop through pollfd array, call the corresponding + * read/write callbacks as needed. + * c. cupsdAddSelect() adds first to CUPS array and flags the + * pollfd array as invalid. + * d. cupsdDoSelect() rebuilds pollfd array as needed, calls + * poll(), then loops through the pollfd array looking up + * as needed. + * e. cupsdRemoveSelect() flags the pollfd array as invalid. + * f. cupsdStopSelect() frees all of the memory used by the + * CUPS array and pollfd array. + * + * 3. epoll() - O(n) + * a. cupsdStartSelect() creates epoll file descriptor using + * epoll_create() with the maximum fd count, and + * allocates an events buffer for the maximum fd count. + * b. cupsdAdd/RemoveSelect() uses epoll_ctl() to add + * (EPOLL_CTL_ADD) or remove (EPOLL_CTL_DEL) a single + * event using the level-triggered semantics. The event + * user data field is a pointer to the new callback array + * element. + * c. cupsdDoSelect() uses epoll_wait() with the global event + * buffer allocated in cupsdStartSelect() and then loops + * through the events, using the user data field to find + * the callback record. + * d. cupsdStopSelect() closes the epoll file descriptor and + * frees all of the memory used by the event buffer. + * + * 4. kqueue() - O(n) + * b. cupsdStartSelect() creates kqueue file descriptor + * using kqueue() function and allocates a global event + * buffer. + * c. cupsdAdd/RemoveSelect() uses EV_SET and kevent() to + * register the changes. The event user data field is a + * pointer to the new callback array element. + * d. cupsdDoSelect() uses kevent() to poll for events and + * loops through the events, using the user data field to + * find the callback record. + * e. cupsdStopSelect() closes the kqueue() file descriptor + * and frees all of the memory used by the event buffer. + * + * 5. /dev/poll - O(n log n) - NOT YET IMPLEMENTED + * a. cupsdStartSelect() opens /dev/poll and allocates an + * array of pollfd structs; on failure to open /dev/poll, + * revert to poll() system call. + * b. cupsdAddSelect() writes a single pollfd struct to + * /dev/poll with the new file descriptor and the + * POLLIN/POLLOUT flags. + * c. cupsdRemoveSelect() writes a single pollfd struct to + * /dev/poll with the file descriptor and the POLLREMOVE + * flag. + * d. cupsdDoSelect() uses the DP_POLL ioctl to retrieve + * events from /dev/poll and then loops through the + * returned pollfd array, looking up the file descriptors + * as needed. + * e. cupsdStopSelect() closes /dev/poll and frees the + * pollfd array. + * + * PERFORMANCE + * + * In tests using the "make test" target with option 0 (keep cupsd + * running) and the "testspeed" program with "-c 50 -r 1000", epoll() + * performed 5.5% slower than select(), followed by kqueue() at 16% + * slower than select() and poll() at 18% slower than select(). Similar + * results were seen with twice the number of client connections. + * + * The epoll() and kqueue() performance is likely limited by the + * number of system calls used to add/modify/remove file + * descriptors dynamically. Further optimizations may be possible + * in the area of limiting use of cupsdAddSelect() and + * cupsdRemoveSelect(), however extreme care will be needed to avoid + * excess CPU usage and deadlock conditions. + * + * We may be able to improve the poll() implementation simply by + * keeping the pollfd array sync'd with the _cupsd_fd_t array, as that + * will eliminate the rebuilding of the array whenever there is a + * change and eliminate the fd array lookups in the inner loop of + * cupsdDoSelect(). + * + * Since /dev/poll will never be able to use a shadow array, it may + * not make sense to implement support for it. ioctl() overhead will + * impact performance as well, so my guess would be that, for CUPS, + * /dev/poll will yield a net performance loss. + */ + +/* + * Local structures... + */ + +typedef struct _cupsd_fd_s +{ + int fd, /* File descriptor */ + use; /* Use count */ + cupsd_selfunc_t read_cb, /* Read callback */ + write_cb; /* Write callback */ + void *data; /* Data pointer for callbacks */ +} _cupsd_fd_t; + + +/* + * Local globals... + */ + +static cups_array_t *cupsd_fds = NULL; +#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) +static cups_array_t *cupsd_inactive_fds = NULL; +static int cupsd_in_select = 0; +#endif /* HAVE_EPOLL || HAVE_KQUEUE */ + +#ifdef HAVE_KQUEUE +static int cupsd_kqueue_fd = -1, + cupsd_kqueue_changes = 0; +static struct kevent *cupsd_kqueue_events = NULL; +#elif defined(HAVE_POLL) +static int cupsd_alloc_pollfds = 0, + cupsd_update_pollfds = 0; +static struct pollfd *cupsd_pollfds = NULL; +# ifdef HAVE_EPOLL +static int cupsd_epoll_fd = -1; +static struct epoll_event *cupsd_epoll_events = NULL; +# endif /* HAVE_EPOLL */ +#else /* select() */ +static fd_set cupsd_global_input, + cupsd_global_output, + cupsd_current_input, + cupsd_current_output; +#endif /* HAVE_KQUEUE */ + + +/* + * Local functions... + */ + +static int compare_fds(_cupsd_fd_t *a, _cupsd_fd_t *b); +static _cupsd_fd_t *find_fd(int fd); +#define release_fd(f) { \ + (f)->use --; \ + if (!(f)->use) free((f));\ + } +#define retain_fd(f) (f)->use++ + + +/* + * 'cupsdAddSelect()' - Add a file descriptor to the list. + */ + +int /* O - 1 on success, 0 on error */ +cupsdAddSelect(int fd, /* I - File descriptor */ + cupsd_selfunc_t read_cb, /* I - Read callback */ + cupsd_selfunc_t write_cb,/* I - Write callback */ + void *data) /* I - Data to pass to callback */ +{ + _cupsd_fd_t *fdptr; /* File descriptor record */ +#ifdef HAVE_EPOLL + int added; /* 1 if added, 0 if modified */ +#endif /* HAVE_EPOLL */ + + + /* + * Range check input... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddSelect(fd=%d, read_cb=%p, write_cb=%p, data=%p)", + fd, read_cb, write_cb, data); + + if (fd < 0) + return (0); + + /* + * See if this FD has already been added... + */ + + if ((fdptr = find_fd(fd)) == NULL) + { + /* + * No, add a new entry... + */ + + if ((fdptr = calloc(1, sizeof(_cupsd_fd_t))) == NULL) + return (0); + + fdptr->fd = fd; + fdptr->use = 1; + + if (!cupsArrayAdd(cupsd_fds, fdptr)) + { + cupsdLogMessage(CUPSD_LOG_EMERG, "Unable to add fd %d to array!", fd); + free(fdptr); + return (0); + } + +#ifdef HAVE_EPOLL + added = 1; + } + else + added = 0; +#else + } +#endif /* HAVE_EPOLL */ + +#ifdef HAVE_KQUEUE + { + struct kevent event; /* Event data */ + struct timespec timeout; /* Timeout value */ + + + timeout.tv_sec = 0; + timeout.tv_nsec = 0; + + if (fdptr->read_cb != read_cb) + { + if (read_cb) + EV_SET(&event, fd, EVFILT_READ, EV_ADD, 0, 0, fdptr); + else + EV_SET(&event, fd, EVFILT_READ, EV_DELETE, 0, 0, fdptr); + + if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) + { + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", + strerror(errno)); + return (0); + } + } + + if (fdptr->write_cb != write_cb) + { + if (write_cb) + EV_SET(&event, fd, EVFILT_WRITE, EV_ADD, 0, 0, fdptr); + else + EV_SET(&event, fd, EVFILT_WRITE, EV_DELETE, 0, 0, fdptr); + + if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) + { + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", + strerror(errno)); + return (0); + } + } + } + +#elif defined(HAVE_POLL) +# ifdef HAVE_EPOLL + if (cupsd_epoll_fd >= 0) + { + struct epoll_event event; /* Event data */ + + + event.events = 0; + + if (read_cb) + event.events |= EPOLLIN; + + if (write_cb) + event.events |= EPOLLOUT; + + event.data.ptr = fdptr; + + if (epoll_ctl(cupsd_epoll_fd, added ? EPOLL_CTL_ADD : EPOLL_CTL_MOD, fd, + &event)) + { + close(cupsd_epoll_fd); + cupsd_epoll_fd = -1; + cupsd_update_pollfds = 1; + } + } + else +# endif /* HAVE_EPOLL */ + + cupsd_update_pollfds = 1; + +#else /* select() */ + /* + * Add or remove the file descriptor in the input and output sets + * for select()... + */ + + if (read_cb) + FD_SET(fd, &cupsd_global_input); + else + { + FD_CLR(fd, &cupsd_global_input); + FD_CLR(fd, &cupsd_current_input); + } + + if (write_cb) + FD_SET(fd, &cupsd_global_output); + else + { + FD_CLR(fd, &cupsd_global_output); + FD_CLR(fd, &cupsd_current_output); + } +#endif /* HAVE_KQUEUE */ + + /* + * Save the (new) read and write callbacks... + */ + + fdptr->read_cb = read_cb; + fdptr->write_cb = write_cb; + fdptr->data = data; + + return (1); +} + + +/* + * 'cupsdDoSelect()' - Do a select-like operation. + */ + +int /* O - Number of files or -1 on error */ +cupsdDoSelect(long timeout) /* I - Timeout in seconds */ +{ + int nfds; /* Number of file descriptors */ + _cupsd_fd_t *fdptr; /* Current file descriptor */ +#ifdef HAVE_KQUEUE + int i; /* Looping var */ + struct kevent *event; /* Current event */ + struct timespec ktimeout; /* kevent() timeout */ + + + cupsd_in_select = 1; + + if (timeout >= 0 && timeout < 86400) + { + ktimeout.tv_sec = timeout; + ktimeout.tv_nsec = 0; + + nfds = kevent(cupsd_kqueue_fd, NULL, 0, cupsd_kqueue_events, MaxFDs, + &ktimeout); + } + else + nfds = kevent(cupsd_kqueue_fd, NULL, 0, cupsd_kqueue_events, MaxFDs, NULL); + + cupsd_kqueue_changes = 0; + + for (i = nfds, event = cupsd_kqueue_events; i > 0; i --, event ++) + { + fdptr = (_cupsd_fd_t *)event->udata; + + if (cupsArrayFind(cupsd_inactive_fds, fdptr)) + continue; + + retain_fd(fdptr); + + if (fdptr->read_cb && event->filter == EVFILT_READ) + (*(fdptr->read_cb))(fdptr->data); + + if (fdptr->use > 1 && fdptr->write_cb && event->filter == EVFILT_WRITE && + !cupsArrayFind(cupsd_inactive_fds, fdptr)) + (*(fdptr->write_cb))(fdptr->data); + + release_fd(fdptr); + } + +#elif defined(HAVE_POLL) + struct pollfd *pfd; /* Current pollfd structure */ + int count; /* Number of file descriptors */ + + +# ifdef HAVE_EPOLL + cupsd_in_select = 1; + + if (cupsd_epoll_fd >= 0) + { + int i; /* Looping var */ + struct epoll_event *event; /* Current event */ + + + if (timeout >= 0 && timeout < 86400) + nfds = epoll_wait(cupsd_epoll_fd, cupsd_epoll_events, MaxFDs, + timeout * 1000); + else + nfds = epoll_wait(cupsd_epoll_fd, cupsd_epoll_events, MaxFDs, -1); + + if (nfds < 0 && errno != EINTR) + { + close(cupsd_epoll_fd); + cupsd_epoll_fd = -1; + } + else + { + for (i = nfds, event = cupsd_epoll_events; i > 0; i --, event ++) + { + fdptr = (_cupsd_fd_t *)event->data.ptr; + + if (cupsArrayFind(cupsd_inactive_fds, fdptr)) + continue; + + retain_fd(fdptr); + + if (fdptr->read_cb && (event->events & (EPOLLIN | EPOLLERR | EPOLLHUP))) + (*(fdptr->read_cb))(fdptr->data); + + if (fdptr->use > 1 && fdptr->write_cb && + (event->events & (EPOLLOUT | EPOLLERR | EPOLLHUP)) && + !cupsArrayFind(cupsd_inactive_fds, fdptr)) + (*(fdptr->write_cb))(fdptr->data); + + release_fd(fdptr); + } + + goto release_inactive; + } + } +# endif /* HAVE_EPOLL */ + + count = cupsArrayCount(cupsd_fds); + + if (cupsd_update_pollfds) + { + /* + * Update the cupsd_pollfds array to match the current FD array... + */ + + cupsd_update_pollfds = 0; + + /* + * (Re)allocate memory as needed... + */ + + if (count > cupsd_alloc_pollfds) + { + int allocfds = count + 16; + + + if (cupsd_pollfds) + pfd = realloc(cupsd_pollfds, allocfds * sizeof(struct pollfd)); + else + pfd = malloc(allocfds * sizeof(struct pollfd)); + + if (!pfd) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "Unable to allocate %d bytes for polling!", + (int)(allocfds * sizeof(struct pollfd))); + + return (-1); + } + + cupsd_pollfds = pfd; + cupsd_alloc_pollfds = allocfds; + } + + /* + * Rebuild the array... + */ + + for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds), pfd = cupsd_pollfds; + fdptr; + fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_fds), pfd ++) + { + pfd->fd = fdptr->fd; + pfd->events = 0; + + if (fdptr->read_cb) + pfd->events |= POLLIN; + + if (fdptr->write_cb) + pfd->events |= POLLOUT; + } + } + + if (timeout >= 0 && timeout < 86400) + nfds = poll(cupsd_pollfds, count, timeout * 1000); + else + nfds = poll(cupsd_pollfds, count, -1); + + if (nfds > 0) + { + /* + * Do callbacks for each file descriptor... + */ + + for (pfd = cupsd_pollfds; count > 0; pfd ++, count --) + { + if (!pfd->revents) + continue; + + if ((fdptr = find_fd(pfd->fd)) == NULL) + continue; + + retain_fd(fdptr); + + if (fdptr->read_cb && (pfd->revents & (POLLIN | POLLERR | POLLHUP))) + (*(fdptr->read_cb))(fdptr->data); + + if (fdptr->use > 1 && fdptr->write_cb && + (pfd->revents & (POLLOUT | POLLERR | POLLHUP))) + (*(fdptr->write_cb))(fdptr->data); + + release_fd(fdptr); + } + } + +#else /* select() */ + struct timeval stimeout; /* Timeout for select() */ + int maxfd; /* Maximum file descriptor */ + + + /* + * Figure out the highest file descriptor number... + */ + + if ((fdptr = (_cupsd_fd_t *)cupsArrayLast(cupsd_fds)) == NULL) + maxfd = 1; + else + maxfd = fdptr->fd + 1; + + /* + * Do the select()... + */ + + cupsd_current_input = cupsd_global_input; + cupsd_current_output = cupsd_global_output; + + if (timeout >= 0 && timeout < 86400) + { + stimeout.tv_sec = timeout; + stimeout.tv_usec = 0; + + nfds = select(maxfd, &cupsd_current_input, &cupsd_current_output, NULL, + &stimeout); + } + else + nfds = select(maxfd, &cupsd_current_input, &cupsd_current_output, NULL, + NULL); + + if (nfds > 0) + { + /* + * Do callbacks for each file descriptor... + */ + + for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds); + fdptr; + fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_fds)) + { + retain_fd(fdptr); + + if (fdptr->read_cb && FD_ISSET(fdptr->fd, &cupsd_current_input)) + (*(fdptr->read_cb))(fdptr->data); + + if (fdptr->use > 1 && fdptr->write_cb && + FD_ISSET(fdptr->fd, &cupsd_current_output)) + (*(fdptr->write_cb))(fdptr->data); + + release_fd(fdptr); + } + } + +#endif /* HAVE_KQUEUE */ + +#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) + /* + * Release all inactive file descriptors... + */ + +# ifndef HAVE_KQUEUE + release_inactive: +# endif /* !HAVE_KQUEUE */ + + cupsd_in_select = 0; + + for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_inactive_fds); + fdptr; + fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_inactive_fds)) + { + cupsArrayRemove(cupsd_inactive_fds, fdptr); + release_fd(fdptr); + } +#endif /* HAVE_EPOLL || HAVE_KQUEUE */ + + /* + * Return the number of file descriptors handled... + */ + + return (nfds); +} + + +#ifdef CUPSD_IS_SELECTING +/* + * 'cupsdIsSelecting()' - Determine whether we are monitoring a file + * descriptor. + */ + +int /* O - 1 if selecting, 0 otherwise */ +cupsdIsSelecting(int fd) /* I - File descriptor */ +{ + return (find_fd(fd) != NULL); +} +#endif /* CUPSD_IS_SELECTING */ + + +/* + * 'cupsdRemoveSelect()' - Remove a file descriptor from the list. + */ + +void +cupsdRemoveSelect(int fd) /* I - File descriptor */ +{ + _cupsd_fd_t *fdptr; /* File descriptor record */ +#ifdef HAVE_EPOLL + struct epoll_event event; /* Event data */ +#elif defined(HAVE_KQUEUE) + struct kevent event; /* Event data */ + struct timespec timeout; /* Timeout value */ +#elif defined(HAVE_POLL) + /* No variables for poll() */ +#endif /* HAVE_EPOLL */ + + + /* + * Range check input... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRemoveSelect(fd=%d)", fd); + + if (fd < 0) + return; + + /* + * Find the file descriptor... + */ + + if ((fdptr = find_fd(fd)) == NULL) + return; + +#ifdef HAVE_EPOLL + if (epoll_ctl(cupsd_epoll_fd, EPOLL_CTL_DEL, fd, &event)) + { + close(cupsd_epoll_fd); + cupsd_epoll_fd = -1; + cupsd_update_pollfds = 1; + } + +#elif defined(HAVE_KQUEUE) + timeout.tv_sec = 0; + timeout.tv_nsec = 0; + + if (fdptr->read_cb) + { + EV_SET(&event, fd, EVFILT_READ, EV_DELETE, 0, 0, fdptr); + + if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) + { + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", + strerror(errno)); + goto cleanup; + } + } + + if (fdptr->write_cb) + { + EV_SET(&event, fd, EVFILT_WRITE, EV_DELETE, 0, 0, fdptr); + + if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) + { + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", + strerror(errno)); + goto cleanup; + } + } + +#elif defined(HAVE_POLL) + /* + * Update the pollfds array... + */ + + cupsd_update_pollfds = 1; + +#else /* select() */ + FD_CLR(fd, &cupsd_global_input); + FD_CLR(fd, &cupsd_global_output); + FD_CLR(fd, &cupsd_current_input); + FD_CLR(fd, &cupsd_current_output); +#endif /* HAVE_EPOLL */ + +#ifdef HAVE_KQUEUE + cleanup: +#endif /* HAVE_KQUEUE */ + + /* + * Remove the file descriptor from the active array and add to the + * inactive array (or release, if we don't need the inactive array...) + */ + + cupsArrayRemove(cupsd_fds, fdptr); + +#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) + if (cupsd_in_select) + cupsArrayAdd(cupsd_inactive_fds, fdptr); + else +#endif /* HAVE_EPOLL || HAVE_KQUEUE */ + + release_fd(fdptr); +} + + +/* + * 'cupsdStartSelect()' - Initialize the file polling engine. + */ + +void +cupsdStartSelect(void) +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSelect()"); + + cupsd_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL); + +#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) + cupsd_inactive_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL); +#endif /* HAVE_EPOLL || HAVE_KQUEUE */ + +#ifdef HAVE_EPOLL + cupsd_epoll_fd = epoll_create(MaxFDs); + cupsd_epoll_events = calloc(MaxFDs, sizeof(struct epoll_event)); + cupsd_update_pollfds = 0; + +#elif defined(HAVE_KQUEUE) + cupsd_kqueue_fd = kqueue(); + cupsd_kqueue_changes = 0; + cupsd_kqueue_events = calloc(MaxFDs, sizeof(struct kevent)); + +#elif defined(HAVE_POLL) + cupsd_update_pollfds = 0; + +#else /* select() */ + FD_ZERO(&cupsd_global_input); + FD_ZERO(&cupsd_global_output); +#endif /* HAVE_EPOLL */ +} + + +/* + * 'cupsdStopSelect()' - Shutdown the file polling engine. + */ + +void +cupsdStopSelect(void) +{ + _cupsd_fd_t *fdptr; /* Current file descriptor */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSelect()"); + + for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds); + fdptr; + fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_fds)) + free(fdptr); + + cupsArrayDelete(cupsd_fds); + cupsd_fds = NULL; + +#if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) + cupsArrayDelete(cupsd_inactive_fds); + cupsd_inactive_fds = NULL; +#endif /* HAVE_EPOLL || HAVE_KQUEUE */ + +#ifdef HAVE_KQUEUE + if (cupsd_kqueue_events) + { + free(cupsd_kqueue_events); + cupsd_kqueue_events = NULL; + } + + if (cupsd_kqueue_fd >= 0) + { + close(cupsd_kqueue_fd); + cupsd_kqueue_fd = -1; + } + + cupsd_kqueue_changes = 0; + +#elif defined(HAVE_POLL) +# ifdef HAVE_EPOLL + if (cupsd_epoll_events) + { + free(cupsd_epoll_events); + cupsd_epoll_events = NULL; + } + + if (cupsd_epoll_fd >= 0) + { + close(cupsd_epoll_fd); + cupsd_epoll_fd = -1; + } +# endif /* HAVE_EPOLL */ + + if (cupsd_pollfds) + { + free(cupsd_pollfds); + cupsd_pollfds = NULL; + cupsd_alloc_pollfds = 0; + } + + cupsd_update_pollfds = 0; + +#else /* select() */ + FD_ZERO(&cupsd_global_input); + FD_ZERO(&cupsd_global_output); +#endif /* HAVE_EPOLL */ +} + + +/* + * 'compare_fds()' - Compare file descriptors. + */ + +static int /* O - Result of comparison */ +compare_fds(_cupsd_fd_t *a, /* I - First file descriptor */ + _cupsd_fd_t *b) /* I - Second file descriptor */ +{ + return (a->fd - b->fd); +} + + +/* + * 'find_fd()' - Find an existing file descriptor record. + */ + +static _cupsd_fd_t * /* O - FD record pointer or NULL */ +find_fd(int fd) /* I - File descriptor */ +{ + _cupsd_fd_t *fdptr, /* Matching record (if any) */ + key; /* Search key */ + + + cupsArraySave(cupsd_fds); + + key.fd = fd; + fdptr = (_cupsd_fd_t *)cupsArrayFind(cupsd_fds, &key); + + cupsArrayRestore(cupsd_fds); + + return (fdptr); +} + + +/* + * End of "$Id: select.c 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/server.c b/scheduler/server.c new file mode 100644 index 0000000..ace9cc9 --- /dev/null +++ b/scheduler/server.c @@ -0,0 +1,184 @@ +/* + * "$Id: server.c 9632 2011-03-21 02:12:14Z mike $" + * + * Server start/stop routines for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdStartServer() - Start the server. + * cupsdStopServer() - Stop the server. + */ + +/* + * Include necessary headers... + */ + +#include +#include "cupsd.h" +#include +#ifdef HAVE_NOTIFY_H +# include +#endif /* HAVE_NOTIFY_H */ + + +/* + * Local globals... + */ + +static int started = 0; /* Did we start the server already? */ + + +/* + * 'cupsdStartServer()' - Start the server. + */ + +void +cupsdStartServer(void) +{ + /* + * Create the default security profile... + */ + + DefaultProfile = cupsdCreateProfile(0); + + /* + * Startup all the networking stuff... + */ + + cupsdStartListening(); + cupsdStartBrowsing(); + cupsdStartPolling(); + + /* + * Create a pipe for CGI processes... + */ + + if (cupsdOpenPipe(CGIPipes)) + cupsdLogMessage(CUPSD_LOG_ERROR, + "cupsdStartServer: Unable to create pipes for CGI status!"); + else + { + CGIStatusBuffer = cupsdStatBufNew(CGIPipes[0], "[CGI]"); + + cupsdAddSelect(CGIPipes[0], (cupsd_selfunc_t)cupsdUpdateCGI, NULL, NULL); + } + + /* + * Mark that the server has started and printers and jobs may be changed... + */ + + LastEvent = CUPSD_EVENT_PRINTER_CHANGED | CUPSD_EVENT_JOB_STATE_CHANGED | + CUPSD_EVENT_SERVER_STARTED; + started = 1; + + cupsdSetBusyState(); +} + + +/* + * 'cupsdStopServer()' - Stop the server. + */ + +void +cupsdStopServer(void) +{ + if (!started) + return; + + /* + * Close all network clients and stop all jobs... + */ + + cupsdCloseAllClients(); + cupsdStopListening(); + cupsdStopPolling(); + cupsdStopBrowsing(); + cupsdStopAllNotifiers(); + cupsdDeleteAllCerts(); + + if (Clients) + { + cupsArrayDelete(Clients); + Clients = NULL; + } + + /* + * Close the pipe for CGI processes... + */ + + if (CGIPipes[0] >= 0) + { + cupsdRemoveSelect(CGIPipes[0]); + + cupsdStatBufDelete(CGIStatusBuffer); + close(CGIPipes[1]); + + CGIPipes[0] = -1; + CGIPipes[1] = -1; + } + +#ifdef HAVE_NOTIFY_POST + /* + * Send one last notification as the server shuts down. + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "notify_post(\"com.apple.printerListChange\") last"); + notify_post("com.apple.printerListChange"); +#endif /* HAVE_NOTIFY_POST */ + + /* + * Close all log files... + */ + + if (AccessFile != NULL) + { + cupsFileClose(AccessFile); + + AccessFile = NULL; + } + + if (ErrorFile != NULL) + { + cupsFileClose(ErrorFile); + + ErrorFile = NULL; + } + + if (PageFile != NULL) + { + cupsFileClose(PageFile); + + PageFile = NULL; + } + + /* + * Delete the default security profile... + */ + + cupsdDestroyProfile(DefaultProfile); + DefaultProfile = NULL; + + /* + * Write out any dirty files... + */ + + if (DirtyFiles) + cupsdCleanDirty(); + + started = 0; +} + + +/* + * End of "$Id: server.c 9632 2011-03-21 02:12:14Z mike $". + */ diff --git a/scheduler/statbuf.c b/scheduler/statbuf.c new file mode 100644 index 0000000..cb75877 --- /dev/null +++ b/scheduler/statbuf.c @@ -0,0 +1,330 @@ +/* + * "$Id: statbuf.c 9350 2010-11-04 23:23:25Z mike $" + * + * Status buffer routines for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdStatBufDelete() - Destroy a status buffer. + * cupsdStatBufNew() - Create a new status buffer. + * cupsdStatBufUpdate() - Update the status buffer. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#include + + +/* + * 'cupsdStatBufDelete()' - Destroy a status buffer. + */ + +void +cupsdStatBufDelete(cupsd_statbuf_t *sb) /* I - Status buffer */ +{ + /* + * Range check input... + */ + + if (!sb) + return; + + /* + * Close the status pipe and free memory used... + */ + + close(sb->fd); + + free(sb); +} + + +/* + * 'cupsdStatBufNew()' - Create a new status buffer. + */ + +cupsd_statbuf_t * /* O - New status buffer */ +cupsdStatBufNew(int fd, /* I - File descriptor of pipe */ + const char *prefix, /* I - Printf-style prefix string */ + ...) /* I - Additional args as needed */ +{ + cupsd_statbuf_t *sb; /* New status buffer */ + va_list ap; /* Argument list */ + + + /* + * Range check input... + */ + + if (fd < 0) + return (NULL); + + /* + * Allocate the status buffer... + */ + + if ((sb = calloc(1, sizeof(cupsd_statbuf_t))) != NULL) + { + /* + * Assign the file descriptor... + */ + + sb->fd = fd; + + /* + * Format the prefix string, if any. This is usually "[Job 123]" + * or "[Sub 123]", and so forth. + */ + + if (prefix) + { + /* + * Printf-style prefix string... + */ + + va_start(ap, prefix); + vsnprintf(sb->prefix, sizeof(sb->prefix), prefix, ap); + va_end(ap); + } + else + { + /* + * No prefix string... + */ + + sb->prefix[0] = '\0'; + } + } + + return (sb); +} + + +/* + * 'cupsdStatBufUpdate()' - Update the status buffer. + */ + +char * /* O - Line from buffer, "", or NULL */ +cupsdStatBufUpdate( + cupsd_statbuf_t *sb, /* I - Status buffer */ + int *loglevel, /* O - Log level */ + char *line, /* I - Line buffer */ + int linelen) /* I - Size of line buffer */ +{ + int bytes; /* Number of bytes read */ + char *lineptr, /* Pointer to end of line in buffer */ + *message; /* Pointer to message text */ + + + /* + * Check if the buffer already contains a full line... + */ + + if ((lineptr = strchr(sb->buffer, '\n')) == NULL) + { + /* + * No, read more data... + */ + + if ((bytes = read(sb->fd, sb->buffer + sb->bufused, + CUPSD_SB_BUFFER_SIZE - sb->bufused - 1)) > 0) + { + sb->bufused += bytes; + sb->buffer[sb->bufused] = '\0'; + + /* + * Guard against a line longer than the max buffer size... + */ + + if ((lineptr = strchr(sb->buffer, '\n')) == NULL && + sb->bufused == (CUPSD_SB_BUFFER_SIZE - 1)) + lineptr = sb->buffer + sb->bufused; + } + else if (bytes < 0 && errno == EINTR) + { + /* + * Return an empty line if we are interrupted... + */ + + *loglevel = CUPSD_LOG_NONE; + line[0] = '\0'; + + return (line); + } + else + { + /* + * End-of-file, so use the whole buffer... + */ + + lineptr = sb->buffer + sb->bufused; + *lineptr = '\0'; + } + + /* + * Final check for end-of-file... + */ + + if (sb->bufused == 0 && bytes == 0) + lineptr = NULL; + } + + if (!lineptr) + { + /* + * End of file... + */ + + *loglevel = CUPSD_LOG_NONE; + line[0] = '\0'; + + return (NULL); + } + + /* + * Terminate the line and process it... + */ + + *lineptr++ = '\0'; + + /* + * Figure out the logging level... + */ + + if (!strncmp(sb->buffer, "EMERG:", 6)) + { + *loglevel = CUPSD_LOG_EMERG; + message = sb->buffer + 6; + } + else if (!strncmp(sb->buffer, "ALERT:", 6)) + { + *loglevel = CUPSD_LOG_ALERT; + message = sb->buffer + 6; + } + else if (!strncmp(sb->buffer, "CRIT:", 5)) + { + *loglevel = CUPSD_LOG_CRIT; + message = sb->buffer + 5; + } + else if (!strncmp(sb->buffer, "ERROR:", 6)) + { + *loglevel = CUPSD_LOG_ERROR; + message = sb->buffer + 6; + } + else if (!strncmp(sb->buffer, "WARNING:", 8)) + { + *loglevel = CUPSD_LOG_WARN; + message = sb->buffer + 8; + } + else if (!strncmp(sb->buffer, "NOTICE:", 7)) + { + *loglevel = CUPSD_LOG_NOTICE; + message = sb->buffer + 7; + } + else if (!strncmp(sb->buffer, "INFO:", 5)) + { + *loglevel = CUPSD_LOG_INFO; + message = sb->buffer + 5; + } + else if (!strncmp(sb->buffer, "DEBUG:", 6)) + { + *loglevel = CUPSD_LOG_DEBUG; + message = sb->buffer + 6; + } + else if (!strncmp(sb->buffer, "DEBUG2:", 7)) + { + *loglevel = CUPSD_LOG_DEBUG2; + message = sb->buffer + 7; + } + else if (!strncmp(sb->buffer, "PAGE:", 5)) + { + *loglevel = CUPSD_LOG_PAGE; + message = sb->buffer + 5; + } + else if (!strncmp(sb->buffer, "STATE:", 6)) + { + *loglevel = CUPSD_LOG_STATE; + message = sb->buffer + 6; + } + else if (!strncmp(sb->buffer, "ATTR:", 5)) + { + *loglevel = CUPSD_LOG_ATTR; + message = sb->buffer + 5; + } + else if (!strncmp(sb->buffer, "PPD:", 4)) + { + *loglevel = CUPSD_LOG_PPD; + message = sb->buffer + 4; + } + else + { + *loglevel = CUPSD_LOG_DEBUG; + message = sb->buffer; + } + + /* + * Skip leading whitespace in the message... + */ + + while (isspace(*message & 255)) + message ++; + + /* + * Send it to the log file as needed... + */ + + if (sb->prefix[0]) + { + if (*loglevel > CUPSD_LOG_NONE && + (*loglevel != CUPSD_LOG_INFO || LogLevel >= CUPSD_LOG_DEBUG)) + { + /* + * General status message; send it to the error_log file... + */ + + if (message[0] == '[') + cupsdLogMessage(*loglevel, "%s", message); + else + cupsdLogMessage(*loglevel, "%s %s", sb->prefix, message); + } + else if (*loglevel < CUPSD_LOG_NONE && LogLevel >= CUPSD_LOG_DEBUG) + cupsdLogMessage(CUPSD_LOG_DEBUG2, "%s %s", sb->prefix, sb->buffer); + } + + /* + * Copy the message to the line buffer... + */ + + strlcpy(line, message, linelen); + + /* + * Copy over the buffer data we've used up... + */ + + if (lineptr < sb->buffer + sb->bufused) + _cups_strcpy(sb->buffer, lineptr); + + sb->bufused -= lineptr - sb->buffer; + + if (sb->bufused < 0) + sb->bufused = 0; + + return (line); +} + + +/* + * End of "$Id: statbuf.c 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/statbuf.h b/scheduler/statbuf.h new file mode 100644 index 0000000..acb793d --- /dev/null +++ b/scheduler/statbuf.h @@ -0,0 +1,49 @@ +/* + * "$Id: statbuf.h 9350 2010-11-04 23:23:25Z mike $" + * + * Status buffer definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + + +/* + * Constants... + */ + +#define CUPSD_SB_BUFFER_SIZE 2048 /* Bytes for job status buffer */ + + +/* + * Types and structures... + */ + +typedef struct /**** Status buffer */ +{ + int fd; /* File descriptor to read from */ + char prefix[64]; /* Prefix for log messages */ + int bufused; /* How much is used in buffer */ + char buffer[CUPSD_SB_BUFFER_SIZE]; /* Buffer */ +} cupsd_statbuf_t; + + +/* + * Prototypes... + */ + +extern void cupsdStatBufDelete(cupsd_statbuf_t *sb); +extern cupsd_statbuf_t *cupsdStatBufNew(int fd, const char *prefix, ...); +extern char *cupsdStatBufUpdate(cupsd_statbuf_t *sb, int *loglevel, + char *line, int linelen); + + +/* + * End of "$Id: statbuf.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c new file mode 100644 index 0000000..ee89ee0 --- /dev/null +++ b/scheduler/subscriptions.c @@ -0,0 +1,1642 @@ +/* + * "$Id: subscriptions.c 10262 2012-02-12 05:48:09Z mike $" + * + * Subscription routines for the CUPS scheduler. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdAddEvent() - Add an event to the global event cache. + * cupsdAddSubscription() - Add a new subscription object. + * cupsdDeleteAllSubscriptions() - Delete all subscriptions. + * cupsdDeleteSubscription() - Delete a subscription object. + * cupsdEventName() - Return a single event name. + * cupsdEventValue() - Return the event mask value for a name. + * cupsdExpireSubscriptions() - Expire old subscription objects. + * cupsdFindSubscription() - Find a subscription by ID. + * cupsdLoadAllSubscriptions() - Load all subscriptions from the .conf file. + * cupsdSaveAllSubscriptions() - Save all subscriptions to the .conf file. + * cupsdStopAllNotifiers() - Stop all notifier processes. + * cupsd_compare_subscriptions() - Compare two subscriptions. + * cupsd_delete_event() - Delete a single event... + * cupsd_send_dbus() - Send a DBUS notification... + * cupsd_send_notification() - Send a notification for the specified + * event. + * cupsd_start_notifier() - Start a notifier subprocess... + * cupsd_update_notifier() - Read messages from notifiers. + */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#ifdef HAVE_DBUS +# include +# ifdef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND +# define dbus_message_append_iter_init dbus_message_iter_init_append +# define dbus_message_iter_append_string(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_STRING, &(v)) +# define dbus_message_iter_append_uint32(i,v) dbus_message_iter_append_basic(i, DBUS_TYPE_UINT32, &(v)) +# endif /* HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ +#endif /* HAVE_DBUS */ + + +/* + * Local functions... + */ + +static int cupsd_compare_subscriptions(cupsd_subscription_t *first, + cupsd_subscription_t *second, + void *unused); +static void cupsd_delete_event(cupsd_event_t *event); +#ifdef HAVE_DBUS +static void cupsd_send_dbus(cupsd_eventmask_t event, cupsd_printer_t *dest, + cupsd_job_t *job); +#endif /* HAVE_DBUS */ +static void cupsd_send_notification(cupsd_subscription_t *sub, + cupsd_event_t *event); +static void cupsd_start_notifier(cupsd_subscription_t *sub); +static void cupsd_update_notifier(void); + + +/* + * 'cupsdAddEvent()' - Add an event to the global event cache. + */ + +void +cupsdAddEvent( + cupsd_eventmask_t event, /* I - Event */ + cupsd_printer_t *dest, /* I - Printer associated with event */ + cupsd_job_t *job, /* I - Job associated with event */ + const char *text, /* I - Notification text */ + ...) /* I - Additional arguments as needed */ +{ + va_list ap; /* Pointer to additional arguments */ + char ftext[1024]; /* Formatted text buffer */ + ipp_attribute_t *attr; /* Printer/job attribute */ + cupsd_event_t *temp; /* New event pointer */ + cupsd_subscription_t *sub; /* Current subscription */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdAddEvent(event=%s, dest=%p(%s), job=%p(%d), text=\"%s\", ...)", + cupsdEventName(event), dest, dest ? dest->name : "", + job, job ? job->id : 0, text); + + /* + * Keep track of events with any OS-supplied notification mechanisms... + */ + + LastEvent |= event; + +#ifdef HAVE_DBUS + cupsd_send_dbus(event, dest, job); +#endif /* HAVE_DBUS */ + + /* + * Return if we aren't keeping events... + */ + + if (MaxEvents <= 0) + { + cupsdLogMessage(CUPSD_LOG_WARN, + "cupsdAddEvent: Discarding %s event since MaxEvents is %d!", + cupsdEventName(event), MaxEvents); + return; + } + + /* + * Then loop through the subscriptions and add the event to the corresponding + * caches... + */ + + for (temp = NULL, sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + { + /* + * Check if this subscription requires this event... + */ + + if ((sub->mask & event) != 0 && + (sub->dest == dest || !sub->dest) && + (sub->job == job || !sub->job)) + { + /* + * Need this event, so create a new event record... + */ + + if ((temp = (cupsd_event_t *)calloc(1, sizeof(cupsd_event_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_CRIT, + "Unable to allocate memory for event - %s", + strerror(errno)); + return; + } + + temp->event = event; + temp->time = time(NULL); + temp->attrs = ippNew(); + temp->job = job; + + if (dest) + temp->dest = dest; + else if (job) + temp->dest = dest = cupsdFindPrinter(job->dest); + + /* + * Add common event notification attributes... + */ + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_CHARSET, + "notify-charset", NULL, "utf-8"); + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_LANGUAGE, + "notify-natural-language", NULL, "en-US"); + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-subscription-id", sub->id); + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-sequence-number", sub->next_event_id); + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_KEYWORD, + "notify-subscribed-event", NULL, cupsdEventName(event)); + + if (sub->user_data_len > 0) + ippAddOctetString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + "notify-user-data", sub->user_data, + sub->user_data_len); + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "printer-up-time", time(NULL)); + + va_start(ap, text); + vsnprintf(ftext, sizeof(ftext), text, ap); + va_end(ap); + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_TEXT, + "notify-text", NULL, ftext); + + if (dest) + { + /* + * Add printer attributes... + */ + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_URI, + "notify-printer-uri", NULL, dest->uri); + + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, + "printer-name", NULL, dest->name); + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, + "printer-state", dest->state); + + if (dest->num_reasons == 0) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "printer-state-reasons", NULL, + dest->state == IPP_PRINTER_STOPPED ? "paused" : "none"); + else + ippAddStrings(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "printer-state-reasons", + dest->num_reasons, NULL, + (const char * const *)dest->reasons); + + ippAddBoolean(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + "printer-is-accepting-jobs", dest->accepting); + } + + if (job) + { + /* + * Add job attributes... + */ + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "notify-job-id", job->id); + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_ENUM, + "job-state", job->state_value); + + if ((attr = ippFindAttribute(job->attrs, "job-name", + IPP_TAG_NAME)) != NULL) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_NAME, + "job-name", NULL, attr->values[0].string.text); + + switch (job->state_value) + { + case IPP_JOB_PENDING : + if (dest && dest->state == IPP_PRINTER_STOPPED) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "printer-stopped"); + else + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "none"); + break; + + case IPP_JOB_HELD : + if (ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_KEYWORD) != NULL || + ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME) != NULL) + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-hold-until-specified"); + else + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-incoming"); + break; + + case IPP_JOB_PROCESSING : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-printing"); + break; + + case IPP_JOB_STOPPED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-stopped"); + break; + + case IPP_JOB_CANCELED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-canceled-by-user"); + break; + + case IPP_JOB_ABORTED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "aborted-by-system"); + break; + + case IPP_JOB_COMPLETED : + ippAddString(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, + IPP_TAG_KEYWORD, "job-state-reasons", NULL, + "job-completed-successfully"); + break; + } + + ippAddInteger(temp->attrs, IPP_TAG_EVENT_NOTIFICATION, IPP_TAG_INTEGER, + "job-impressions-completed", + job->sheets ? job->sheets->values[0].integer : 0); + } + + /* + * Send the notification for this subscription... + */ + + cupsd_send_notification(sub, temp); + } + } + + if (temp) + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); + else + cupsdLogMessage(CUPSD_LOG_DEBUG, "Discarding unused %s event...", + cupsdEventName(event)); +} + + +/* + * 'cupsdAddSubscription()' - Add a new subscription object. + */ + +cupsd_subscription_t * /* O - New subscription object */ +cupsdAddSubscription( + unsigned mask, /* I - Event mask */ + cupsd_printer_t *dest, /* I - Printer, if any */ + cupsd_job_t *job, /* I - Job, if any */ + const char *uri, /* I - notify-recipient-uri, if any */ + int sub_id) /* I - notify-subscription-id or 0 */ +{ + cupsd_subscription_t *temp; /* New subscription object */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription(mask=%x, dest=%p(%s), job=%p(%d), " + "uri=\"%s\")", + mask, dest, dest ? dest->name : "", job, job ? job->id : 0, + uri ? uri : "(null)"); + + if (!Subscriptions) + Subscriptions = cupsArrayNew((cups_array_func_t)cupsd_compare_subscriptions, + NULL); + + if (!Subscriptions) + { + cupsdLogMessage(CUPSD_LOG_CRIT, + "Unable to allocate memory for subscriptions - %s", + strerror(errno)); + return (NULL); + } + + /* + * Limit the number of subscriptions... + */ + + if (MaxSubscriptions > 0 && cupsArrayCount(Subscriptions) >= MaxSubscriptions) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached MaxSubscriptions %d " + "(count=%d)", MaxSubscriptions, + cupsArrayCount(Subscriptions)); + return (NULL); + } + + if (MaxSubscriptionsPerJob > 0 && job) + { + int count; /* Number of job subscriptions */ + + for (temp = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), + count = 0; + temp; + temp = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (temp->job == job) + count ++; + + if (count >= MaxSubscriptionsPerJob) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached MaxSubscriptionsPerJob %d " + "for job #%d (count=%d)", MaxSubscriptionsPerJob, + job->id, count); + return (NULL); + } + } + + if (MaxSubscriptionsPerPrinter > 0 && dest) + { + int count; /* Number of printer subscriptions */ + + for (temp = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions), + count = 0; + temp; + temp = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (temp->dest == dest) + count ++; + + if (count >= MaxSubscriptionsPerPrinter) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdAddSubscription: Reached " + "MaxSubscriptionsPerPrinter %d for %s (count=%d)", + MaxSubscriptionsPerPrinter, dest->name, count); + return (NULL); + } + } + + /* + * Allocate memory for this subscription... + */ + + if ((temp = calloc(1, sizeof(cupsd_subscription_t))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_CRIT, + "Unable to allocate memory for subscription object - %s", + strerror(errno)); + return (NULL); + } + + /* + * Fill in common data... + */ + + if (sub_id) + { + temp->id = sub_id; + + if (sub_id >= NextSubscriptionId) + NextSubscriptionId = sub_id + 1; + } + else + { + temp->id = NextSubscriptionId; + + NextSubscriptionId ++; + } + + temp->mask = mask; + temp->dest = dest; + temp->job = job; + temp->pipe = -1; + temp->first_event_id = 1; + temp->next_event_id = 1; + + cupsdSetString(&(temp->recipient), uri); + + /* + * Add the subscription to the array... + */ + + cupsArrayAdd(Subscriptions, temp); + + /* + * For RSS subscriptions, run the notifier immediately... + */ + + if (uri && !strncmp(uri, "rss:", 4)) + cupsd_start_notifier(temp); + + return (temp); +} + + +/* + * 'cupsdDeleteAllSubscriptions()' - Delete all subscriptions. + */ + +void +cupsdDeleteAllSubscriptions(void) +{ + cupsd_subscription_t *sub; /* Subscription */ + + + if (!Subscriptions) + return; + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + cupsdDeleteSubscription(sub, 0); + + cupsArrayDelete(Subscriptions); + Subscriptions = NULL; +} + + +/* + * 'cupsdDeleteSubscription()' - Delete a subscription object. + */ + +void +cupsdDeleteSubscription( + cupsd_subscription_t *sub, /* I - Subscription object */ + int update) /* I - 1 = update subscriptions.conf */ +{ + /* + * Close the pipe to the notifier as needed... + */ + + if (sub->pipe >= 0) + close(sub->pipe); + + /* + * Remove subscription from array... + */ + + cupsArrayRemove(Subscriptions, sub); + + /* + * Free memory... + */ + + cupsdClearString(&(sub->owner)); + cupsdClearString(&(sub->recipient)); + + cupsArrayDelete(sub->events); + + free(sub); + + /* + * Update the subscriptions as needed... + */ + + if (update) + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); +} + + +/* + * 'cupsdEventName()' - Return a single event name. + */ + +const char * /* O - Event name */ +cupsdEventName( + cupsd_eventmask_t event) /* I - Event value */ +{ + switch (event) + { + default : + return (NULL); + + case CUPSD_EVENT_PRINTER_RESTARTED : + return ("printer-restarted"); + + case CUPSD_EVENT_PRINTER_SHUTDOWN : + return ("printer-shutdown"); + + case CUPSD_EVENT_PRINTER_STOPPED : + return ("printer-stopped"); + + case CUPSD_EVENT_PRINTER_FINISHINGS_CHANGED : + return ("printer-finishings-changed"); + + case CUPSD_EVENT_PRINTER_MEDIA_CHANGED : + return ("printer-media-changed"); + + case CUPSD_EVENT_PRINTER_ADDED : + return ("printer-added"); + + case CUPSD_EVENT_PRINTER_DELETED : + return ("printer-deleted"); + + case CUPSD_EVENT_PRINTER_MODIFIED : + return ("printer-modified"); + + case CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED : + return ("printer-queue-order-changed"); + + case CUPSD_EVENT_PRINTER_STATE : + case CUPSD_EVENT_PRINTER_STATE_CHANGED : + return ("printer-state-changed"); + + case CUPSD_EVENT_PRINTER_CONFIG : + case CUPSD_EVENT_PRINTER_CONFIG_CHANGED : + return ("printer-config-changed"); + + case CUPSD_EVENT_PRINTER_CHANGED : + return ("printer-changed"); + + case CUPSD_EVENT_JOB_CREATED : + return ("job-created"); + + case CUPSD_EVENT_JOB_COMPLETED : + return ("job-completed"); + + case CUPSD_EVENT_JOB_STOPPED : + return ("job-stopped"); + + case CUPSD_EVENT_JOB_CONFIG_CHANGED : + return ("job-config-changed"); + + case CUPSD_EVENT_JOB_PROGRESS : + return ("job-progress"); + + case CUPSD_EVENT_JOB_STATE : + case CUPSD_EVENT_JOB_STATE_CHANGED : + return ("job-state-changed"); + + case CUPSD_EVENT_SERVER_RESTARTED : + return ("server-restarted"); + + case CUPSD_EVENT_SERVER_STARTED : + return ("server-started"); + + case CUPSD_EVENT_SERVER_STOPPED : + return ("server-stopped"); + + case CUPSD_EVENT_SERVER_AUDIT : + return ("server-audit"); + + case CUPSD_EVENT_ALL : + return ("all"); + } +} + + +/* + * 'cupsdEventValue()' - Return the event mask value for a name. + */ + +cupsd_eventmask_t /* O - Event mask value */ +cupsdEventValue(const char *name) /* I - Name of event */ +{ + if (!strcmp(name, "all")) + return (CUPSD_EVENT_ALL); + else if (!strcmp(name, "printer-restarted")) + return (CUPSD_EVENT_PRINTER_RESTARTED); + else if (!strcmp(name, "printer-shutdown")) + return (CUPSD_EVENT_PRINTER_SHUTDOWN); + else if (!strcmp(name, "printer-stopped")) + return (CUPSD_EVENT_PRINTER_STOPPED); + else if (!strcmp(name, "printer-finishings-changed")) + return (CUPSD_EVENT_PRINTER_FINISHINGS_CHANGED); + else if (!strcmp(name, "printer-media-changed")) + return (CUPSD_EVENT_PRINTER_MEDIA_CHANGED); + else if (!strcmp(name, "printer-added")) + return (CUPSD_EVENT_PRINTER_ADDED); + else if (!strcmp(name, "printer-deleted")) + return (CUPSD_EVENT_PRINTER_DELETED); + else if (!strcmp(name, "printer-modified")) + return (CUPSD_EVENT_PRINTER_MODIFIED); + else if (!strcmp(name, "printer-queue-order-changed")) + return (CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED); + else if (!strcmp(name, "printer-state-changed")) + return (CUPSD_EVENT_PRINTER_STATE_CHANGED); + else if (!strcmp(name, "printer-config-changed")) + return (CUPSD_EVENT_PRINTER_CONFIG_CHANGED); + else if (!strcmp(name, "printer-changed")) + return (CUPSD_EVENT_PRINTER_CHANGED); + else if (!strcmp(name, "job-created")) + return (CUPSD_EVENT_JOB_CREATED); + else if (!strcmp(name, "job-completed")) + return (CUPSD_EVENT_JOB_COMPLETED); + else if (!strcmp(name, "job-stopped")) + return (CUPSD_EVENT_JOB_STOPPED); + else if (!strcmp(name, "job-config-changed")) + return (CUPSD_EVENT_JOB_CONFIG_CHANGED); + else if (!strcmp(name, "job-progress")) + return (CUPSD_EVENT_JOB_PROGRESS); + else if (!strcmp(name, "job-state-changed")) + return (CUPSD_EVENT_JOB_STATE_CHANGED); + else if (!strcmp(name, "server-restarted")) + return (CUPSD_EVENT_SERVER_RESTARTED); + else if (!strcmp(name, "server-started")) + return (CUPSD_EVENT_SERVER_STARTED); + else if (!strcmp(name, "server-stopped")) + return (CUPSD_EVENT_SERVER_STOPPED); + else if (!strcmp(name, "server-audit")) + return (CUPSD_EVENT_SERVER_AUDIT); + else + return (CUPSD_EVENT_NONE); +} + + +/* + * 'cupsdExpireSubscriptions()' - Expire old subscription objects. + */ + +void +cupsdExpireSubscriptions( + cupsd_printer_t *dest, /* I - Printer, if any */ + cupsd_job_t *job) /* I - Job, if any */ +{ + cupsd_subscription_t *sub; /* Current subscription */ + int update; /* Update subscriptions.conf? */ + time_t curtime; /* Current time */ + + + curtime = time(NULL); + update = 0; + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if ((!sub->job && !dest && sub->expire && sub->expire <= curtime) || + (dest && sub->dest == dest) || + (job && sub->job == job)) + { + cupsdLogMessage(CUPSD_LOG_INFO, "Subscription %d has expired...", + sub->id); + + cupsdDeleteSubscription(sub, 0); + + update = 1; + } + + if (update) + cupsdMarkDirty(CUPSD_DIRTY_SUBSCRIPTIONS); +} + + +/* + * 'cupsdFindSubscription()' - Find a subscription by ID. + */ + +cupsd_subscription_t * /* O - Subscription object */ +cupsdFindSubscription(int id) /* I - Subscription ID */ +{ + cupsd_subscription_t sub; /* Subscription template */ + + + sub.id = id; + + return ((cupsd_subscription_t *)cupsArrayFind(Subscriptions, &sub)); +} + + +/* + * 'cupsdLoadAllSubscriptions()' - Load all subscriptions from the .conf file. + */ + +void +cupsdLoadAllSubscriptions(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* subscriptions.conf file */ + int linenum; /* Current line number */ + char line[1024], /* Line from file */ + *value, /* Pointer to value */ + *valueptr; /* Pointer into value */ + cupsd_subscription_t *sub; /* Current subscription */ + int hex; /* Non-zero if reading hex data */ + int delete_sub; /* Delete subscription? */ + + + /* + * Open the subscriptions.conf file... + */ + + snprintf(line, sizeof(line), "%s/subscriptions.conf", ServerRoot); + if ((fp = cupsdOpenConfFile(line)) == NULL) + return; + + /* + * Read all of the lines from the file... + */ + + linenum = 0; + sub = NULL; + delete_sub = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!_cups_strcasecmp(line, "NextSubscriptionId") && value) + { + /* + * NextSubscriptionId NNN + */ + + i = atoi(value); + if (i >= NextSubscriptionId && i > 0) + NextSubscriptionId = i; + } + else if (!_cups_strcasecmp(line, " + */ + + if (!sub && value && isdigit(value[0] & 255)) + { + sub = cupsdAddSubscription(CUPSD_EVENT_NONE, NULL, NULL, NULL, + atoi(value)); + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "")) + { + if (!sub) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + + if (delete_sub) + cupsdDeleteSubscription(sub, 0); + + sub = NULL; + delete_sub = 0; + } + else if (!sub) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + } + else if (!_cups_strcasecmp(line, "Events")) + { + /* + * Events name + * Events name name name ... + */ + + if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + + while (*value) + { + /* + * Separate event names... + */ + + for (valueptr = value; !isspace(*valueptr) && *valueptr; valueptr ++); + + while (isspace(*valueptr & 255)) + *valueptr++ = '\0'; + + /* + * See if the name exists... + */ + + if ((sub->mask |= cupsdEventValue(value)) == CUPSD_EVENT_NONE) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown event name \'%s\' on line %d of subscriptions.conf.", + value, linenum); + break; + } + + value = valueptr; + } + } + else if (!_cups_strcasecmp(line, "Owner")) + { + /* + * Owner + */ + + if (value) + cupsdSetString(&sub->owner, value); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "Recipient")) + { + /* + * Recipient uri + */ + + if (value) + cupsdSetString(&sub->recipient, value); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "JobId")) + { + /* + * JobId # + */ + + if (value && isdigit(*value & 255)) + { + if ((sub->job = cupsdFindJob(atoi(value))) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Job %s not found on line %d of subscriptions.conf.", + value, linenum); + delete_sub = 1; + } + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "PrinterName")) + { + /* + * PrinterName name + */ + + if (value) + { + if ((sub->dest = cupsdFindDest(value)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Printer \'%s\' not found on line %d of subscriptions.conf.", + value, linenum); + delete_sub = 1; + } + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "UserData")) + { + /* + * UserData encoded-string + */ + + if (value) + { + for (i = 0, valueptr = value, hex = 0; i < 63 && *valueptr; i ++) + { + if (*valueptr == '<' && !hex) + { + hex = 1; + valueptr ++; + } + + if (hex) + { + if (isxdigit(valueptr[0]) && isxdigit(valueptr[1])) + { + if (isdigit(valueptr[0])) + sub->user_data[i] = (valueptr[0] - '0') << 4; + else + sub->user_data[i] = (tolower(valueptr[0]) - 'a' + 10) << 4; + + if (isdigit(valueptr[1])) + sub->user_data[i] |= valueptr[1] - '0'; + else + sub->user_data[i] |= tolower(valueptr[1]) - 'a' + 10; + + valueptr += 2; + + if (*valueptr == '>') + { + hex = 0; + valueptr ++; + } + } + else + break; + } + else + sub->user_data[i] = *valueptr++; + } + + if (*valueptr) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Bad UserData \'%s\' on line %d of subscriptions.conf.", + value, linenum); + } + else + sub->user_data_len = i; + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "LeaseDuration")) + { + /* + * LeaseDuration # + */ + + if (value && isdigit(*value & 255)) + { + sub->lease = atoi(value); + sub->expire = sub->lease ? time(NULL) + sub->lease : 0; + } + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "Interval")) + { + /* + * Interval # + */ + + if (value && isdigit(*value & 255)) + sub->interval = atoi(value); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "ExpirationTime")) + { + /* + * ExpirationTime # + */ + + if (value && isdigit(*value & 255)) + sub->expire = atoi(value); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else if (!_cups_strcasecmp(line, "NextEventId")) + { + /* + * NextEventId # + */ + + if (value && isdigit(*value & 255)) + sub->next_event_id = sub->first_event_id = atoi(value); + else + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Syntax error on line %d of subscriptions.conf.", + linenum); + break; + } + } + else + { + /* + * Something else we don't understand... + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unknown configuration directive %s on line %d of subscriptions.conf.", + line, linenum); + } + } + + cupsFileClose(fp); +} + + +/* + * 'cupsdSaveAllSubscriptions()' - Save all subscriptions to the .conf file. + */ + +void +cupsdSaveAllSubscriptions(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* subscriptions.conf file */ + char filename[1024], /* subscriptions.conf filename */ + temp[1024]; /* Temporary string */ + cupsd_subscription_t *sub; /* Current subscription */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + unsigned mask; /* Current event mask */ + const char *name; /* Current event name */ + int hex; /* Non-zero if we are writing hex data */ + + + /* + * Create the subscriptions.conf file... + */ + + snprintf(filename, sizeof(filename), "%s/subscriptions.conf", ServerRoot); + + if ((fp = cupsdCreateConfFile(filename, ConfigFilePerm)) == NULL) + return; + + cupsdLogMessage(CUPSD_LOG_INFO, "Saving subscriptions.conf..."); + + /* + * Write a small header to the file... + */ + + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + + cupsFilePuts(fp, "# Subscription configuration file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd\n"); + + cupsFilePrintf(fp, "NextSubscriptionId %d\n", NextSubscriptionId); + + /* + * Write every subscription known to the system... + */ + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + { + cupsFilePrintf(fp, "\n", sub->id); + + if ((name = cupsdEventName((cupsd_eventmask_t)sub->mask)) != NULL) + { + /* + * Simple event list... + */ + + cupsFilePrintf(fp, "Events %s\n", name); + } + else + { + /* + * Complex event list... + */ + + cupsFilePuts(fp, "Events"); + + for (mask = 1; mask < CUPSD_EVENT_ALL; mask <<= 1) + if (sub->mask & mask) + cupsFilePrintf(fp, " %s", cupsdEventName((cupsd_eventmask_t)mask)); + + cupsFilePuts(fp, "\n"); + } + + if (sub->owner) + cupsFilePrintf(fp, "Owner %s\n", sub->owner); + if (sub->recipient) + cupsFilePrintf(fp, "Recipient %s\n", sub->recipient); + if (sub->job) + cupsFilePrintf(fp, "JobId %d\n", sub->job->id); + if (sub->dest) + cupsFilePrintf(fp, "PrinterName %s\n", sub->dest->name); + + if (sub->user_data_len > 0) + { + cupsFilePuts(fp, "UserData "); + + for (i = 0, hex = 0; i < sub->user_data_len; i ++) + { + if (sub->user_data[i] < ' ' || + sub->user_data[i] > 0x7f || + sub->user_data[i] == '<') + { + if (!hex) + { + cupsFilePrintf(fp, "<%02X", sub->user_data[i]); + hex = 1; + } + else + cupsFilePrintf(fp, "%02X", sub->user_data[i]); + } + else + { + if (hex) + { + cupsFilePrintf(fp, ">%c", sub->user_data[i]); + hex = 0; + } + else + cupsFilePutChar(fp, sub->user_data[i]); + } + } + + if (hex) + cupsFilePuts(fp, ">\n"); + else + cupsFilePutChar(fp, '\n'); + } + + cupsFilePrintf(fp, "LeaseDuration %d\n", sub->lease); + cupsFilePrintf(fp, "Interval %d\n", sub->interval); + cupsFilePrintf(fp, "ExpirationTime %ld\n", (long)sub->expire); + cupsFilePrintf(fp, "NextEventId %d\n", sub->next_event_id); + + cupsFilePuts(fp, "\n"); + } + + cupsdCloseCreatedConfFile(fp, filename); +} + + +/* + * 'cupsdStopAllNotifiers()' - Stop all notifier processes. + */ + +void +cupsdStopAllNotifiers(void) +{ + cupsd_subscription_t *sub; /* Current subscription */ + + + /* + * See if we have started any notifiers... + */ + + if (!NotifierStatusBuffer) + return; + + /* + * Yes, kill any processes that are left... + */ + + for (sub = (cupsd_subscription_t *)cupsArrayFirst(Subscriptions); + sub; + sub = (cupsd_subscription_t *)cupsArrayNext(Subscriptions)) + if (sub->pid) + { + cupsdEndProcess(sub->pid, 0); + + close(sub->pipe); + sub->pipe = -1; + } + + /* + * Close the status pipes... + */ + + if (NotifierPipes[0] >= 0) + { + cupsdRemoveSelect(NotifierPipes[0]); + + cupsdStatBufDelete(NotifierStatusBuffer); + + close(NotifierPipes[0]); + close(NotifierPipes[1]); + + NotifierPipes[0] = -1; + NotifierPipes[1] = -1; + NotifierStatusBuffer = NULL; + } +} + + +/* + * 'cupsd_compare_subscriptions()' - Compare two subscriptions. + */ + +static int /* O - Result of comparison */ +cupsd_compare_subscriptions( + cupsd_subscription_t *first, /* I - First subscription object */ + cupsd_subscription_t *second, /* I - Second subscription object */ + void *unused) /* I - Unused user data pointer */ +{ + (void)unused; + + return (first->id - second->id); +} + + +/* + * 'cupsd_delete_event()' - Delete a single event... + * + * Oldest events must be deleted first, otherwise the subscription cache + * flushing code will not work properly. + */ + +static void +cupsd_delete_event(cupsd_event_t *event)/* I - Event to delete */ +{ + /* + * Free memory... + */ + + ippDelete(event->attrs); + free(event); +} + + +#ifdef HAVE_DBUS +/* + * 'cupsd_send_dbus()' - Send a DBUS notification... + */ + +static void +cupsd_send_dbus(cupsd_eventmask_t event,/* I - Event to send */ + cupsd_printer_t *dest,/* I - Destination, if any */ + cupsd_job_t *job) /* I - Job, if any */ +{ + DBusError error; /* Error, if any */ + DBusMessage *message; /* Message to send */ + DBusMessageIter iter; /* Iterator for message data */ + const char *what; /* What to send */ + static DBusConnection *con = NULL; /* Connection to DBUS server */ + + + /* + * Figure out what to send, if anything... + */ + + if (event & CUPSD_EVENT_PRINTER_ADDED) + what = "PrinterAdded"; + else if (event & CUPSD_EVENT_PRINTER_DELETED) + what = "PrinterRemoved"; + else if (event & CUPSD_EVENT_PRINTER_CHANGED) + what = "QueueChanged"; + else if (event & CUPSD_EVENT_JOB_CREATED) + what = "JobQueuedLocal"; + else if ((event & CUPSD_EVENT_JOB_STATE) && job && + job->state_value == IPP_JOB_PROCESSING) + what = "JobStartedLocal"; + else + return; + + /* + * Verify connection to DBUS server... + */ + + if (con && !dbus_connection_get_is_connected(con)) + { + dbus_connection_unref(con); + con = NULL; + } + + if (!con) + { + dbus_error_init(&error); + + con = dbus_bus_get(getuid() ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &error); + if (!con) + { + dbus_error_free(&error); + return; + } + } + + /* + * Create and send the new message... + */ + + message = dbus_message_new_signal("/com/redhat/PrinterSpooler", + "com.redhat.PrinterSpooler", what); + + dbus_message_append_iter_init(message, &iter); + if (dest) + dbus_message_iter_append_string(&iter, dest->name); + if (job) + { + dbus_message_iter_append_uint32(&iter, job->id); + dbus_message_iter_append_string(&iter, job->username); + } + + dbus_connection_send(con, message, NULL); + dbus_connection_flush(con); + dbus_message_unref(message); +} +#endif /* HAVE_DBUS */ + + +/* + * 'cupsd_send_notification()' - Send a notification for the specified event. + */ + +static void +cupsd_send_notification( + cupsd_subscription_t *sub, /* I - Subscription object */ + cupsd_event_t *event) /* I - Event to send */ +{ + ipp_state_t state; /* IPP event state */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsd_send_notification(sub=%p(%d), event=%p(%s))", + sub, sub->id, event, cupsdEventName(event->event)); + + /* + * Allocate the events array as needed... + */ + + if (!sub->events) + { + sub->events = cupsArrayNew3((cups_array_func_t)NULL, NULL, + (cups_ahash_func_t)NULL, 0, + (cups_acopy_func_t)NULL, + (cups_afree_func_t)cupsd_delete_event); + + if (!sub->events) + { + cupsdLogMessage(CUPSD_LOG_CRIT, + "Unable to allocate memory for subscription #%d!", + sub->id); + return; + } + } + + /* + * Purge an old event as needed... + */ + + if (cupsArrayCount(sub->events) >= MaxEvents) + { + /* + * Purge the oldest event in the cache... + */ + + cupsArrayRemove(sub->events, cupsArrayFirst(sub->events)); + + sub->first_event_id ++; + } + + /* + * Add the event to the subscription. Since the events array is + * always MaxEvents in length, and since we will have already + * removed an event from the subscription cache if we hit the + * event cache limit, we don't need to check for overflow here... + */ + + cupsArrayAdd(sub->events, event); + + /* + * Deliver the event... + */ + + if (sub->recipient) + { + for (;;) + { + if (sub->pipe < 0) + cupsd_start_notifier(sub); + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "sub->pipe=%d", sub->pipe); + + if (sub->pipe < 0) + break; + + event->attrs->state = IPP_IDLE; + + while ((state = ippWriteFile(sub->pipe, event->attrs)) != IPP_DATA) + if (state == IPP_ERROR) + break; + + if (state == IPP_ERROR) + { + if (errno == EPIPE) + { + /* + * Notifier died, try restarting it... + */ + + cupsdLogMessage(CUPSD_LOG_WARN, + "Notifier for subscription %d (%s) went away, " + "retrying!", + sub->id, sub->recipient); + cupsdEndProcess(sub->pid, 0); + + close(sub->pipe); + sub->pipe = -1; + continue; + } + + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to send event for subscription %d (%s)!", + sub->id, sub->recipient); + } + + /* + * If we get this far, break out of the loop... + */ + + break; + } + } + + /* + * Bump the event sequence number... + */ + + sub->next_event_id ++; +} + + +/* + * 'cupsd_start_notifier()' - Start a notifier subprocess... + */ + +static void +cupsd_start_notifier( + cupsd_subscription_t *sub) /* I - Subscription object */ +{ + int pid; /* Notifier process ID */ + int fds[2]; /* Pipe file descriptors */ + char *argv[4], /* Command-line arguments */ + *envp[MAX_ENV], /* Environment variables */ + user_data[128], /* Base-64 encoded user data */ + scheme[256], /* notify-recipient-uri scheme */ + *ptr, /* Pointer into scheme */ + command[1024]; /* Notifier command */ + + + /* + * Extract the scheme name from the recipient URI and point to the + * notifier program... + */ + + strlcpy(scheme, sub->recipient, sizeof(scheme)); + if ((ptr = strchr(scheme, ':')) != NULL) + *ptr = '\0'; + + snprintf(command, sizeof(command), "%s/notifier/%s", ServerBin, scheme); + + /* + * Base-64 encode the user data... + */ + + httpEncode64_2(user_data, sizeof(user_data), (char *)sub->user_data, + sub->user_data_len); + + /* + * Setup the argument array... + */ + + argv[0] = command; + argv[1] = sub->recipient; + argv[2] = user_data; + argv[3] = NULL; + + /* + * Setup the environment... + */ + + cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); + + /* + * Create pipes as needed... + */ + + if (!NotifierStatusBuffer) + { + /* + * Create the status pipe... + */ + + if (cupsdOpenPipe(NotifierPipes)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create pipes for notifier status - %s", + strerror(errno)); + return; + } + + NotifierStatusBuffer = cupsdStatBufNew(NotifierPipes[0], "[Notifier]"); + + cupsdAddSelect(NotifierPipes[0], (cupsd_selfunc_t)cupsd_update_notifier, + NULL, NULL); + } + + if (cupsdOpenPipe(fds)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create pipes for notifier %s - %s", + scheme, strerror(errno)); + return; + } + + /* + * Make sure the delivery pipe is non-blocking... + */ + + fcntl(fds[1], F_SETFL, fcntl(fds[1], F_GETFL) | O_NONBLOCK); + + /* + * Create the notifier process... + */ + + if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1], + -1, -1, 0, DefaultProfile, NULL, &pid) < 0) + { + /* + * Error - can't fork! + */ + + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to fork for notifier %s - %s", + scheme, strerror(errno)); + + cupsdClosePipe(fds); + } + else + { + /* + * Fork successful - return the PID... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG, "Notifier %s started - PID = %d", + scheme, pid); + + sub->pid = pid; + sub->pipe = fds[1]; + sub->status = 0; + + close(fds[0]); + } +} + + +/* + * 'cupsd_update_notifier()' - Read messages from notifiers. + */ + +void +cupsd_update_notifier(void) +{ + char message[1024]; /* Pointer to message text */ + int loglevel; /* Log level for message */ + + + while (cupsdStatBufUpdate(NotifierStatusBuffer, &loglevel, + message, sizeof(message))) + { + if (loglevel == CUPSD_LOG_INFO) + cupsdLogMessage(CUPSD_LOG_INFO, "%s", message); + + if (!strchr(NotifierStatusBuffer->buffer, '\n')) + break; + } +} + + +/* + * End of "$Id: subscriptions.c 10262 2012-02-12 05:48:09Z mike $". + */ diff --git a/scheduler/subscriptions.h b/scheduler/subscriptions.h new file mode 100644 index 0000000..20d59b7 --- /dev/null +++ b/scheduler/subscriptions.h @@ -0,0 +1,166 @@ +/* + * "$Id: subscriptions.h 9350 2010-11-04 23:23:25Z mike $" + * + * Subscription definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Event mask enumeration... + */ + +typedef enum +{ + /* Individual printer events... */ + CUPSD_EVENT_PRINTER_STATE = 0x0001, /* Sent after generic printer state change */ + CUPSD_EVENT_PRINTER_RESTARTED = 0x0002, + /* Sent after printer restarted */ + CUPSD_EVENT_PRINTER_SHUTDOWN = 0x0004,/* Sent after printer shutdown */ + CUPSD_EVENT_PRINTER_STOPPED = 0x0008, /* Sent after printer stopped */ + + CUPSD_EVENT_PRINTER_CONFIG = 0x0010, /* Send after add/modify changes attrs */ + CUPSD_EVENT_PRINTER_FINISHINGS_CHANGED = 0x0020, + /* Sent after finishings-supported changed */ + CUPSD_EVENT_PRINTER_MEDIA_CHANGED = 0x0040, + /* Sent after media-supported changed */ + CUPSD_EVENT_PRINTER_ADDED = 0x0080, /* Sent after printer added */ + CUPSD_EVENT_PRINTER_DELETED = 0x0100, /* Sent after printer deleted */ + CUPSD_EVENT_PRINTER_MODIFIED = 0x0200,/* Sent after printer modified */ + CUPSD_EVENT_PRINTER_QUEUE_ORDER_CHANGED = 0x0400, + /* Sent when the order of jobs is changed */ + + /* Convenience printer event groupings... */ + CUPSD_EVENT_PRINTER_STATE_CHANGED = 0x000f, + /* STATE + RESTARTED + SHUTDOWN + STOPPED */ + CUPSD_EVENT_PRINTER_CONFIG_CHANGED = 0x0070, + /* CONFIG + FINISHINGS_CHANGED + MEDIA_CHANGED */ + CUPSD_EVENT_PRINTER_CHANGED = 0x07ff, /* All of the above */ + + /* Individual job events... */ + CUPSD_EVENT_JOB_STATE = 0x0800, /* Any state change */ + CUPSD_EVENT_JOB_CREATED = 0x1000, /* Send after job is created */ + CUPSD_EVENT_JOB_COMPLETED = 0x2000, /* Sent after job is completed */ + CUPSD_EVENT_JOB_STOPPED = 0x4000, /* Sent after job is stopped */ + CUPSD_EVENT_JOB_CONFIG_CHANGED = 0x8000, + /* Sent after set-job-attributes */ + CUPSD_EVENT_JOB_PROGRESS = 0x10000, /* Sent for each page */ + + /* Convenience job event grouping... */ + CUPSD_EVENT_JOB_STATE_CHANGED = 0x7800, + /* STATE + CREATED + COMPLETED + STOPPED */ + + /* Server events... */ + CUPSD_EVENT_SERVER_RESTARTED = 0x20000,/* Sent after server restarts */ + CUPSD_EVENT_SERVER_STARTED = 0x40000, /* Sent when server first starts */ + CUPSD_EVENT_SERVER_STOPPED = 0x80000, /* Sent when server is stopped */ + CUPSD_EVENT_SERVER_AUDIT = 0x100000, /* Security-related stuff */ + + /* Everything and nothing... */ + CUPSD_EVENT_NONE = 0, /* Nothing */ + CUPSD_EVENT_ALL = 0x1fffff /* Everything */ +} cupsd_eventmask_t; + + +/* + * Notiification support structures... + */ + +typedef struct cupsd_event_s /**** Event structure ****/ +{ + cupsd_eventmask_t event; /* Event */ + time_t time; /* Time of event */ + ipp_t *attrs; /* Notification message */ + cupsd_printer_t *dest; /* Associated printer, if any */ + cupsd_job_t *job; /* Associated job, if any */ +} cupsd_event_t; + +typedef struct cupsd_subscription_s /**** Subscription structure ****/ +{ + int id; /* subscription-id */ + unsigned mask; /* Event mask */ + char *owner; /* notify-subscriber-user-name */ + char *recipient; /* notify-recipient-uri, if applicable */ + unsigned char user_data[64]; /* notify-user-data */ + int user_data_len; /* Length of notify-user-data */ + int lease; /* notify-lease-duration */ + int interval; /* notify-time-interval */ + cupsd_printer_t *dest; /* notify-printer-uri, if any */ + cupsd_job_t *job; /* notify-job-id, if any */ + int pid; /* Process ID of notifier */ + int pipe; /* Pipe to notifier */ + int status; /* Exit status of notifier */ + time_t last; /* Time of last notification */ + time_t expire; /* Lease expiration time */ + int first_event_id, /* First event-id in cache */ + next_event_id; /* Next event-id to use */ + cups_array_t *events; /* Cached events */ +} cupsd_subscription_t; + + +/* + * Globals... + */ + +VAR int MaxSubscriptions VALUE(100), + /* Overall subscription limit */ + MaxSubscriptionsPerJob VALUE(0), + /* Per-job subscription limit */ + MaxSubscriptionsPerPrinter VALUE(0), + /* Per-printer subscription limit */ + MaxSubscriptionsPerUser VALUE(0), + /* Per-user subscription limit */ + NextSubscriptionId VALUE(1), + /* Next subscription ID */ + DefaultLeaseDuration VALUE(86400), + /* Default notify-lease-duration */ + MaxLeaseDuration VALUE(0); + /* Maximum notify-lease-duration */ +VAR cups_array_t *Subscriptions VALUE(NULL); + /* Active subscriptions */ + +VAR int MaxEvents VALUE(100); /* Maximum number of events */ + +VAR unsigned LastEvent VALUE(0); /* Last event(s) processed */ +VAR int NotifierPipes[2] VALUE2(-1, -1); + /* Pipes for notifier error/debug output */ +VAR cupsd_statbuf_t *NotifierStatusBuffer VALUE(NULL); + /* Status buffer for pipes */ + + +/* + * Prototypes... + */ + +extern void cupsdAddEvent(cupsd_eventmask_t event, cupsd_printer_t *dest, + cupsd_job_t *job, const char *text, ...); +extern cupsd_subscription_t * + cupsdAddSubscription(unsigned mask, cupsd_printer_t *dest, + cupsd_job_t *job, const char *uri, + int sub_id); +extern void cupsdDeleteAllSubscriptions(void); +extern void cupsdDeleteSubscription(cupsd_subscription_t *sub, int update); +extern const char * + cupsdEventName(cupsd_eventmask_t event); +extern cupsd_eventmask_t + cupsdEventValue(const char *name); + +extern cupsd_subscription_t * + cupsdFindSubscription(int id); +extern void cupsdExpireSubscriptions(cupsd_printer_t *dest, + cupsd_job_t *job); +extern void cupsdLoadAllSubscriptions(void); +extern void cupsdSaveAllSubscriptions(void); +extern void cupsdStopAllNotifiers(void); + + +/* + * End of "$Id: subscriptions.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/sysman.c b/scheduler/sysman.c new file mode 100644 index 0000000..bd7052b --- /dev/null +++ b/scheduler/sysman.c @@ -0,0 +1,1037 @@ +/* + * "$Id: sysman.c 10273 2012-02-13 20:30:23Z mike $" + * + * System management functions for the CUPS scheduler. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdCleanDirty() - Write dirty config and state files. + * cupsdMarkDirty() - Mark config or state files as needing a + * write. + * cupsdSetBusyState() - Let the system know when we are busy + * doing something. + * cupsdAllowSleep() - Tell the OS it is now OK to sleep. + * cupsdStartSystemMonitor() - Start monitoring for system change. + * cupsdStopSystemMonitor() - Stop monitoring for system change. + * sysEventThreadEntry() - A thread to receive power and computer + * name change notifications. + * sysEventPowerNotifier() - Handle power notification events. + * sysEventConfigurationNotifier() - Computer name changed notification + * callback. + * sysEventTimerNotifier() - Handle delayed event notifications. + * sysUpdate() - Update the current system state. + */ + + +/* + * Include necessary headers... + */ + +#include "cupsd.h" +#ifdef HAVE_VPROC_TRANSACTION_BEGIN +# include +#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ +#ifdef __APPLE__ +# include +# ifdef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H +# include +# endif /* HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */ +#endif /* __APPLE__ */ + + +/* + * The system management functions cover disk and power management which + * are primarily used on portable computers. + * + * Disk management involves delaying the write of certain configuration + * and state files to minimize the number of times the disk has to spin + * up. + * + * Power management support is currently only implemented on MacOS X, but + * essentially we use four functions to let the OS know when it is OK to + * put the system to sleep, typically when we are not in the middle of + * printing a job. + * + * Once put to sleep, we invalidate all remote printers since it is common + * to wake up in a new location/on a new wireless network. + */ + +/* + * Local globals... + */ + +#ifdef kIOPMAssertionTypeDenySystemSleep +static IOPMAssertionID dark_wake = 0; /* "Dark wake" assertion for sharing */ +#endif /* kIOPMAssertionTypeDenySystemSleep */ + + +/* + * 'cupsdCleanDirty()' - Write dirty config and state files. + */ + +void +cupsdCleanDirty(void) +{ + if (DirtyFiles & CUPSD_DIRTY_PRINTERS) + cupsdSaveAllPrinters(); + + if (DirtyFiles & CUPSD_DIRTY_CLASSES) + cupsdSaveAllClasses(); + + if (DirtyFiles & CUPSD_DIRTY_REMOTE) + cupsdSaveRemoteCache(); + + if (DirtyFiles & CUPSD_DIRTY_PRINTCAP) + cupsdWritePrintcap(); + + if (DirtyFiles & CUPSD_DIRTY_JOBS) + { + cupsd_job_t *job; /* Current job */ + + cupsdSaveAllJobs(); + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + if (job->dirty) + cupsdSaveJob(job); + } + + if (DirtyFiles & CUPSD_DIRTY_SUBSCRIPTIONS) + cupsdSaveAllSubscriptions(); + + DirtyFiles = CUPSD_DIRTY_NONE; + DirtyCleanTime = 0; + + cupsdSetBusyState(); +} + + +/* + * 'cupsdMarkDirty()' - Mark config or state files as needing a write. + */ + +void +cupsdMarkDirty(int what) /* I - What file(s) are dirty? */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdMarkDirty(%c%c%c%c%c%c)", + (what & CUPSD_DIRTY_PRINTERS) ? 'P' : '-', + (what & CUPSD_DIRTY_CLASSES) ? 'C' : '-', + (what & CUPSD_DIRTY_REMOTE) ? 'R' : '-', + (what & CUPSD_DIRTY_PRINTCAP) ? 'p' : '-', + (what & CUPSD_DIRTY_JOBS) ? 'J' : '-', + (what & CUPSD_DIRTY_SUBSCRIPTIONS) ? 'S' : '-'); + + if (what == CUPSD_DIRTY_PRINTCAP && !Printcap) + return; + + DirtyFiles |= what; + + if (!DirtyCleanTime) + DirtyCleanTime = time(NULL) + DirtyCleanInterval; + + cupsdSetBusyState(); +} + + +/* + * 'cupsdSetBusyState()' - Let the system know when we are busy doing something. + */ + +void +cupsdSetBusyState(void) +{ + int i; /* Looping var */ + cupsd_job_t *job; /* Current job */ + cupsd_printer_t *p; /* Current printer */ + int newbusy; /* New busy state */ + static int busy = 0; /* Current busy state */ + static const char * const busy_text[] = + { /* Text for busy states */ + "Not busy", + "Dirty files", + "Printing jobs", + "Printing jobs and dirty files", + "Active clients", + "Active clients and dirty files", + "Active clients and printing jobs", + "Active clients, printing jobs, and dirty files" + }; +#ifdef HAVE_VPROC_TRANSACTION_BEGIN + static vproc_transaction_t vtran = 0; /* Current busy transaction */ +#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ + + + /* + * Figure out how busy we are... + */ + + newbusy = (DirtyCleanTime ? 1 : 0) | + (cupsArrayCount(ActiveClients) ? 4 : 0); + + for (job = (cupsd_job_t *)cupsArrayFirst(PrintingJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(PrintingJobs)) + { + if ((p = job->printer) != NULL) + { + for (i = 0; i < p->num_reasons; i ++) + if (!strcmp(p->reasons[i], "connecting-to-device")) + break; + + if (!p->num_reasons || i >= p->num_reasons) + break; + } + } + + if (job) + newbusy |= 2; + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "cupsdSetBusyState: newbusy=\"%s\", busy=\"%s\"", + busy_text[newbusy], busy_text[busy]); + + /* + * Manage state changes... + */ + + if (newbusy != busy) + { + busy = newbusy; + +#ifdef HAVE_VPROC_TRANSACTION_BEGIN + if (busy && !vtran) + vtran = vproc_transaction_begin(NULL); + else if (!busy && vtran) + { + vproc_transaction_end(NULL, vtran); + vtran = 0; + } +#endif /* HAVE_VPROC_TRANSACTION_BEGIN */ + } + +#ifdef kIOPMAssertionTypeDenySystemSleep + if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake."); + IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep, + kIOPMAssertionLevelOn, + CFSTR("org.cups.cupsd"), &dark_wake); + } + else if (cupsArrayCount(PrintingJobs) == 0 && dark_wake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion."); + IOPMAssertionRelease(dark_wake); + dark_wake = 0; + } +#endif /* kIOPMAssertionTypeDenySystemSleep */ +} + + +#ifdef __APPLE__ +/* + * This is the Apple-specific system event code. It works by creating + * a worker thread that waits for events from the OS and relays them + * to the main thread via a traditional pipe. + */ + +/* + * Include MacOS-specific headers... + */ + +# include +# include +# include +# include +# include + + +/* + * Constants... + */ + +# define SYSEVENT_CANSLEEP 0x1 /* Decide whether to allow sleep or not */ +# define SYSEVENT_WILLSLEEP 0x2 /* Computer will go to sleep */ +# define SYSEVENT_WOKE 0x4 /* Computer woke from sleep */ +# define SYSEVENT_NETCHANGED 0x8 /* Network changed */ +# define SYSEVENT_NAMECHANGED 0x10 /* Computer name changed */ + + +/* + * Structures... + */ + +typedef struct cupsd_sysevent_s /*** System event data ****/ +{ + unsigned char event; /* Event bit field */ + io_connect_t powerKernelPort; /* Power context data */ + long powerNotificationID; /* Power event data */ +} cupsd_sysevent_t; + + +typedef struct cupsd_thread_data_s /*** Thread context data ****/ +{ + cupsd_sysevent_t sysevent; /* System event */ + CFRunLoopTimerRef timerRef; /* Timer to delay some change * + * notifications */ +} cupsd_thread_data_t; + + +/* + * Local globals... + */ + +static pthread_t SysEventThread = NULL; + /* Thread to host a runloop */ +static pthread_mutex_t SysEventThreadMutex = { 0 }; + /* Coordinates access to shared gloabals */ +static pthread_cond_t SysEventThreadCond = { 0 }; + /* Thread initialization complete condition */ +static CFRunLoopRef SysEventRunloop = NULL; + /* The runloop. Access must be protected! */ +static CFStringRef ComputerNameKey = NULL, + /* Computer name key */ + BTMMKey = NULL, /* Back to My Mac key */ + NetworkGlobalKeyIPv4 = NULL, + /* Network global IPv4 key */ + NetworkGlobalKeyIPv6 = NULL, + /* Network global IPv6 key */ + NetworkGlobalKeyDNS = NULL, + /* Network global DNS key */ + HostNamesKey = NULL, + /* Host name key */ + NetworkInterfaceKeyIPv4 = NULL, + /* Netowrk interface key */ + NetworkInterfaceKeyIPv6 = NULL; + /* Netowrk interface key */ +static cupsd_sysevent_t LastSysEvent; /* Last system event (for delayed sleep) */ + + +/* + * Local functions... + */ + +static void *sysEventThreadEntry(void); +static void sysEventPowerNotifier(void *context, io_service_t service, + natural_t messageType, + void *messageArgument); +static void sysEventConfigurationNotifier(SCDynamicStoreRef store, + CFArrayRef changedKeys, + void *context); +static void sysEventTimerNotifier(CFRunLoopTimerRef timer, void *context); +static void sysUpdate(void); + + +/* + * 'cupsdAllowSleep()' - Tell the OS it is now OK to sleep. + */ + +void +cupsdAllowSleep(void) +{ + cupsdCleanDirty(); + + IOAllowPowerChange(LastSysEvent.powerKernelPort, + LastSysEvent.powerNotificationID); +} + + +/* + * 'cupsdStartSystemMonitor()' - Start monitoring for system change. + */ + +void +cupsdStartSystemMonitor(void) +{ + int flags; /* fcntl flags on pipe */ + + + if (cupsdOpenPipe(SysEventPipes)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "System event monitor pipe() failed - %s!", + strerror(errno)); + return; + } + + cupsdAddSelect(SysEventPipes[0], (cupsd_selfunc_t)sysUpdate, NULL, NULL); + + /* + * Set non-blocking mode on the descriptor we will be receiving notification + * events on. + */ + + flags = fcntl(SysEventPipes[0], F_GETFL, 0); + fcntl(SysEventPipes[0], F_SETFL, flags | O_NONBLOCK); + + /* + * Start the thread that runs the runloop... + */ + + pthread_mutex_init(&SysEventThreadMutex, NULL); + pthread_cond_init(&SysEventThreadCond, NULL); + pthread_create(&SysEventThread, NULL, (void *(*)())sysEventThreadEntry, NULL); +} + + +/* + * 'cupsdStopSystemMonitor()' - Stop monitoring for system change. + */ + +void +cupsdStopSystemMonitor(void) +{ + CFRunLoopRef rl; /* The event handler runloop */ + + + if (SysEventThread) + { + /* + * Make sure the thread has completed it's initialization and + * stored it's runloop reference in the shared global. + */ + + pthread_mutex_lock(&SysEventThreadMutex); + + if (!SysEventRunloop) + pthread_cond_wait(&SysEventThreadCond, &SysEventThreadMutex); + + rl = SysEventRunloop; + SysEventRunloop = NULL; + + pthread_mutex_unlock(&SysEventThreadMutex); + + if (rl) + CFRunLoopStop(rl); + + pthread_join(SysEventThread, NULL); + pthread_mutex_destroy(&SysEventThreadMutex); + pthread_cond_destroy(&SysEventThreadCond); + } + + if (SysEventPipes[0] >= 0) + { + cupsdRemoveSelect(SysEventPipes[0]); + cupsdClosePipe(SysEventPipes); + } +} + + +/* + * 'sysEventThreadEntry()' - A thread to receive power and computer name + * change notifications. + */ + +static void * /* O - Return status/value */ +sysEventThreadEntry(void) +{ + io_object_t powerNotifierObj; + /* Power notifier object */ + IONotificationPortRef powerNotifierPort; + /* Power notifier port */ + SCDynamicStoreRef store = NULL;/* System Config dynamic store */ + CFRunLoopSourceRef powerRLS = NULL,/* Power runloop source */ + storeRLS = NULL;/* System Config runloop source */ + CFStringRef key[6], /* System Config keys */ + pattern[2]; /* System Config patterns */ + CFArrayRef keys = NULL, /* System Config key array*/ + patterns = NULL;/* System Config pattern array */ + SCDynamicStoreContext storeContext; /* Dynamic store context */ + CFRunLoopTimerContext timerContext; /* Timer context */ + cupsd_thread_data_t threadData; /* Thread context data for the * + * runloop notifiers */ + + + /* + * Register for power state change notifications + */ + + bzero(&threadData, sizeof(threadData)); + + threadData.sysevent.powerKernelPort = + IORegisterForSystemPower(&threadData, &powerNotifierPort, + sysEventPowerNotifier, &powerNotifierObj); + + if (threadData.sysevent.powerKernelPort) + { + powerRLS = IONotificationPortGetRunLoopSource(powerNotifierPort); + CFRunLoopAddSource(CFRunLoopGetCurrent(), powerRLS, kCFRunLoopDefaultMode); + } + else + DEBUG_puts("sysEventThreadEntry: error registering for system power " + "notifications"); + + /* + * Register for system configuration change notifications + */ + + bzero(&storeContext, sizeof(storeContext)); + storeContext.info = &threadData; + + store = SCDynamicStoreCreate(kCFAllocatorDefault, CFSTR("cupsd"), + sysEventConfigurationNotifier, &storeContext); + + if (!ComputerNameKey) + ComputerNameKey = SCDynamicStoreKeyCreateComputerName(kCFAllocatorDefault); + + if (!BTMMKey) + BTMMKey = SCDynamicStoreKeyCreate(kCFAllocatorDefault, + CFSTR("Setup:/Network/BackToMyMac")); + + if (!NetworkGlobalKeyIPv4) + NetworkGlobalKeyIPv4 = + SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault, + kSCDynamicStoreDomainState, + kSCEntNetIPv4); + + if (!NetworkGlobalKeyIPv6) + NetworkGlobalKeyIPv6 = + SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault, + kSCDynamicStoreDomainState, + kSCEntNetIPv6); + + if (!NetworkGlobalKeyDNS) + NetworkGlobalKeyDNS = + SCDynamicStoreKeyCreateNetworkGlobalEntity(kCFAllocatorDefault, + kSCDynamicStoreDomainState, + kSCEntNetDNS); + + if (!HostNamesKey) + HostNamesKey = SCDynamicStoreKeyCreateHostNames(kCFAllocatorDefault); + + if (!NetworkInterfaceKeyIPv4) + NetworkInterfaceKeyIPv4 = + SCDynamicStoreKeyCreateNetworkInterfaceEntity(kCFAllocatorDefault, + kSCDynamicStoreDomainState, + kSCCompAnyRegex, + kSCEntNetIPv4); + + if (!NetworkInterfaceKeyIPv6) + NetworkInterfaceKeyIPv6 = + SCDynamicStoreKeyCreateNetworkInterfaceEntity(kCFAllocatorDefault, + kSCDynamicStoreDomainState, + kSCCompAnyRegex, + kSCEntNetIPv6); + + if (store && ComputerNameKey && HostNamesKey && + NetworkGlobalKeyIPv4 && NetworkGlobalKeyIPv6 && NetworkGlobalKeyDNS && + NetworkInterfaceKeyIPv4 && NetworkInterfaceKeyIPv6) + { + key[0] = ComputerNameKey; + key[1] = BTMMKey; + key[2] = NetworkGlobalKeyIPv4; + key[3] = NetworkGlobalKeyIPv6; + key[4] = NetworkGlobalKeyDNS; + key[5] = HostNamesKey; + + pattern[0] = NetworkInterfaceKeyIPv4; + pattern[1] = NetworkInterfaceKeyIPv6; + + keys = CFArrayCreate(kCFAllocatorDefault, (const void **)key, + sizeof(key) / sizeof(key[0]), + &kCFTypeArrayCallBacks); + + patterns = CFArrayCreate(kCFAllocatorDefault, (const void **)pattern, + sizeof(pattern) / sizeof(pattern[0]), + &kCFTypeArrayCallBacks); + + if (keys && patterns && + SCDynamicStoreSetNotificationKeys(store, keys, patterns)) + { + if ((storeRLS = SCDynamicStoreCreateRunLoopSource(kCFAllocatorDefault, + store, 0)) != NULL) + { + CFRunLoopAddSource(CFRunLoopGetCurrent(), storeRLS, + kCFRunLoopDefaultMode); + } + else + DEBUG_printf(("sysEventThreadEntry: SCDynamicStoreCreateRunLoopSource " + "failed: %s\n", SCErrorString(SCError()))); + } + else + DEBUG_printf(("sysEventThreadEntry: SCDynamicStoreSetNotificationKeys " + "failed: %s\n", SCErrorString(SCError()))); + } + else + DEBUG_printf(("sysEventThreadEntry: SCDynamicStoreCreate failed: %s\n", + SCErrorString(SCError()))); + + if (keys) + CFRelease(keys); + + if (patterns) + CFRelease(patterns); + + /* + * Set up a timer to delay the wake change notifications. + * + * The initial time is set a decade or so into the future, we'll adjust + * this later. + */ + + bzero(&timerContext, sizeof(timerContext)); + timerContext.info = &threadData; + + threadData.timerRef = + CFRunLoopTimerCreate(kCFAllocatorDefault, + CFAbsoluteTimeGetCurrent() + (86400L * 365L * 10L), + 86400L * 365L * 10L, 0, 0, sysEventTimerNotifier, + &timerContext); + CFRunLoopAddTimer(CFRunLoopGetCurrent(), threadData.timerRef, + kCFRunLoopDefaultMode); + + /* + * Store our runloop in a global so the main thread can use it to stop us. + */ + + pthread_mutex_lock(&SysEventThreadMutex); + + SysEventRunloop = CFRunLoopGetCurrent(); + + pthread_cond_signal(&SysEventThreadCond); + pthread_mutex_unlock(&SysEventThreadMutex); + + /* + * Disappear into the runloop until it's stopped by the main thread. + */ + + CFRunLoopRun(); + + /* + * Clean up before exiting. + */ + + if (threadData.timerRef) + { + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), threadData.timerRef, + kCFRunLoopDefaultMode); + CFRelease(threadData.timerRef); + } + + if (threadData.sysevent.powerKernelPort) + { + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), powerRLS, + kCFRunLoopDefaultMode); + IODeregisterForSystemPower(&powerNotifierObj); + IOServiceClose(threadData.sysevent.powerKernelPort); + IONotificationPortDestroy(powerNotifierPort); + } + + if (storeRLS) + { + CFRunLoopRemoveSource(CFRunLoopGetCurrent(), storeRLS, + kCFRunLoopDefaultMode); + CFRunLoopSourceInvalidate(storeRLS); + CFRelease(storeRLS); + } + + if (store) + CFRelease(store); + + pthread_exit(NULL); +} + + +/* + * 'sysEventPowerNotifier()' - Handle power notification events. + */ + +static void +sysEventPowerNotifier( + void *context, /* I - Thread context data */ + io_service_t service, /* I - Unused service info */ + natural_t messageType, /* I - Type of message */ + void *messageArgument) /* I - Message data */ +{ + int sendit = 1; /* Send event to main thread? * + * (0 = no, 1 = yes, 2 = delayed */ + cupsd_thread_data_t *threadData; /* Thread context data */ + + + threadData = (cupsd_thread_data_t *)context; + + (void)service; /* anti-compiler-warning-code */ + + switch (messageType) + { + case kIOMessageCanSystemPowerOff: + case kIOMessageCanSystemSleep: + threadData->sysevent.event |= SYSEVENT_CANSLEEP; + break; + + case kIOMessageSystemWillRestart: + case kIOMessageSystemWillPowerOff: + case kIOMessageSystemWillSleep: + threadData->sysevent.event |= SYSEVENT_WILLSLEEP; + break; + + case kIOMessageSystemHasPoweredOn: + /* + * Because powered on is followed by a net-changed event, delay + * before sending it. + */ + + sendit = 2; + threadData->sysevent.event |= SYSEVENT_WOKE; + break; + + case kIOMessageSystemWillNotPowerOff: + case kIOMessageSystemWillNotSleep: +# ifdef kIOMessageSystemWillPowerOn + case kIOMessageSystemWillPowerOn: +# endif /* kIOMessageSystemWillPowerOn */ + default: + sendit = 0; + break; + } + + if (sendit == 0) + IOAllowPowerChange(threadData->sysevent.powerKernelPort, + (long)messageArgument); + else + { + threadData->sysevent.powerNotificationID = (long)messageArgument; + + if (sendit == 1) + { + /* + * Send the event to the main thread now. + */ + + write(SysEventPipes[1], &threadData->sysevent, + sizeof(threadData->sysevent)); + threadData->sysevent.event = 0; + } + else + { + /* + * Send the event to the main thread after 1 to 2 seconds. + */ + + CFRunLoopTimerSetNextFireDate(threadData->timerRef, + CFAbsoluteTimeGetCurrent() + 2); + } + } +} + + +/* + * 'sysEventConfigurationNotifier()' - Network configuration change notification + * callback. + */ + +static void +sysEventConfigurationNotifier( + SCDynamicStoreRef store, /* I - System data (unused) */ + CFArrayRef changedKeys, /* I - Changed data */ + void *context) /* I - Thread context data */ +{ + cupsd_thread_data_t *threadData; /* Thread context data */ + + + threadData = (cupsd_thread_data_t *)context; + + (void)store; /* anti-compiler-warning-code */ + + CFRange range = CFRangeMake(0, CFArrayGetCount(changedKeys)); + + if (CFArrayContainsValue(changedKeys, range, ComputerNameKey) || + CFArrayContainsValue(changedKeys, range, BTMMKey)) + threadData->sysevent.event |= SYSEVENT_NAMECHANGED; + else + { + threadData->sysevent.event |= SYSEVENT_NETCHANGED; + + /* + * Indicate the network interface list needs updating... + */ + + NetIFUpdate = 1; + } + + /* + * Because we registered for several different kinds of change notifications + * this callback usually gets called several times in a row. We use a timer to + * de-bounce these so we only end up generating one event for the main thread. + */ + + CFRunLoopTimerSetNextFireDate(threadData->timerRef, + CFAbsoluteTimeGetCurrent() + 5); +} + + +/* + * 'sysEventTimerNotifier()' - Handle delayed event notifications. + */ + +static void +sysEventTimerNotifier( + CFRunLoopTimerRef timer, /* I - Timer information */ + void *context) /* I - Thread context data */ +{ + cupsd_thread_data_t *threadData; /* Thread context data */ + + + (void)timer; + + threadData = (cupsd_thread_data_t *)context; + + /* + * If an event is still pending send it to the main thread. + */ + + if (threadData->sysevent.event) + { + write(SysEventPipes[1], &threadData->sysevent, + sizeof(threadData->sysevent)); + threadData->sysevent.event = 0; + } +} + + +/* + * 'sysUpdate()' - Update the current system state. + */ + +static void +sysUpdate(void) +{ + int i; /* Looping var */ + cupsd_sysevent_t sysevent; /* The system event */ + cupsd_printer_t *p; /* Printer information */ + + + /* + * Drain the event pipe... + */ + + while (read((int)SysEventPipes[0], &sysevent, sizeof(sysevent)) + == sizeof(sysevent)) + { + if (sysevent.event & SYSEVENT_CANSLEEP) + { + /* + * If there are active printers that don't have the connecting-to-device + * printer-state-reason then cancel the sleep request (i.e. this reason + * indicates a job that is not yet connected to the printer)... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + if (p->job) + { + for (i = 0; i < p->num_reasons; i ++) + if (!strcmp(p->reasons[i], "connecting-to-device")) + break; + + if (!p->num_reasons || i >= p->num_reasons) + break; + } + } + + if (p) + { + cupsdLogMessage(CUPSD_LOG_INFO, + "System sleep canceled because printer %s is active", + p->name); + IOCancelPowerChange(sysevent.powerKernelPort, + sysevent.powerNotificationID); + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "System wants to sleep"); + IOAllowPowerChange(sysevent.powerKernelPort, + sysevent.powerNotificationID); + } + } + + if (sysevent.event & SYSEVENT_WILLSLEEP) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "System going to sleep"); + + Sleeping = 1; + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + if (p->type & CUPS_PRINTER_DISCOVERED) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Deleting remote destination \"%s\"", p->name); + cupsArraySave(Printers); + cupsdDeletePrinter(p, 0); + cupsArrayRestore(Printers); + } + else + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Deregistering local printer \"%s\"", p->name); + cupsdDeregisterPrinter(p, 0); + } + } + + cupsdCleanDirty(); + +#ifdef kIOPMAssertionTypeDenySystemSleep + /* + * Remove our assertion as needed since the user wants the system to + * sleep (different than idle sleep)... + */ + + if (dark_wake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Releasing dark wake assertion."); + IOPMAssertionRelease(dark_wake); + dark_wake = 0; + } +#endif /* kIOPMAssertionTypeDenySystemSleep */ + + /* + * If we have no printing jobs, allow the power change immediately. + * Otherwise set the SleepJobs time to 15 seconds in the future when + * we'll take more drastic measures... + */ + + if (cupsArrayCount(PrintingJobs) == 0) + IOAllowPowerChange(sysevent.powerKernelPort, + sysevent.powerNotificationID); + else + { + /* + * If there are active printers that don't have the connecting-to-device + * printer-state-reason then delay the sleep request (i.e. this reason + * indicates a job that is not yet connected to the printer)... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + if (p->job) + { + for (i = 0; i < p->num_reasons; i ++) + if (!strcmp(p->reasons[i], "connecting-to-device")) + break; + + if (!p->num_reasons || i >= p->num_reasons) + break; + } + } + + if (p) + { + LastSysEvent = sysevent; + SleepJobs = time(NULL) + 10; + } + else + { + IOAllowPowerChange(sysevent.powerKernelPort, + sysevent.powerNotificationID); + } + } + } + + if (sysevent.event & SYSEVENT_WOKE) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "System woke from sleep"); + IOAllowPowerChange(sysevent.powerKernelPort, + sysevent.powerNotificationID); + Sleeping = 0; + +#ifdef kIOPMAssertionTypeDenySystemSleep + if (cupsArrayCount(PrintingJobs) > 0 && !dark_wake) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Asserting dark wake."); + IOPMAssertionCreateWithName(kIOPMAssertionTypeDenySystemSleep, + kIOPMAssertionLevelOn, + CFSTR("org.cups.cupsd"), &dark_wake); + } +#endif /* kIOPMAssertionTypeDenySystemSleep */ + + cupsdCheckJobs(); + } + + if (sysevent.event & SYSEVENT_NETCHANGED) + { + if (!Sleeping) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "System network configuration changed"); + + /* + * Resetting browse_time before calling cupsdSendBrowseList causes + * browse packets to be sent for local shared printers. + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + p->browse_time = 0; + + cupsdSendBrowseList(); + cupsdRestartPolling(); + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "System network configuration changed; " + "ignored while sleeping"); + } + + if (sysevent.event & SYSEVENT_NAMECHANGED) + { + if (!Sleeping) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Computer name or BTMM domains changed"); + + /* + * De-register the individual printers... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + cupsdDeregisterPrinter(p, 1); + + /* + * Update the computer name and BTMM domain list... + */ + + cupsdUpdateDNSSDName(); + + /* + * Now re-register them... + */ + + for (p = (cupsd_printer_t *)cupsArrayFirst(Printers); + p; + p = (cupsd_printer_t *)cupsArrayNext(Printers)) + { + p->browse_time = 0; + cupsdRegisterPrinter(p); + } + } + else + cupsdLogMessage(CUPSD_LOG_DEBUG, + "Computer name or BTMM domains changed; ignored while " + "sleeping"); + } + } +} +#endif /* __APPLE__ */ + + +/* + * End of "$Id: sysman.c 10273 2012-02-13 20:30:23Z mike $". + */ diff --git a/scheduler/sysman.h b/scheduler/sysman.h new file mode 100644 index 0000000..b47655f --- /dev/null +++ b/scheduler/sysman.h @@ -0,0 +1,64 @@ +/* + * "$Id: sysman.h 9350 2010-11-04 23:23:25Z mike $" + * + * System management definitions for the CUPS scheduler. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +/* + * Constants... + */ + +#define CUPSD_DIRTY_NONE 0 /* Nothing is dirty */ +#define CUPSD_DIRTY_PRINTERS 1 /* printers.conf is dirty */ +#define CUPSD_DIRTY_CLASSES 2 /* classes.conf is dirty */ +#define CUPSD_DIRTY_REMOTE 4 /* remote.cache is dirty */ +#define CUPSD_DIRTY_PRINTCAP 8 /* printcap is dirty */ +#define CUPSD_DIRTY_JOBS 16 /* jobs.cache or "c" file(s) are dirty */ +#define CUPSD_DIRTY_SUBSCRIPTIONS 32 /* subscriptions.conf is dirty */ + +/* + * Globals... + */ + +VAR int DirtyFiles VALUE(CUPSD_DIRTY_NONE), + /* What files are dirty? */ + DirtyCleanInterval VALUE(DEFAULT_KEEPALIVE); + /* How often do we write dirty files? */ +VAR time_t DirtyCleanTime VALUE(0); + /* When to clean dirty files next */ +VAR int Sleeping VALUE(0); + /* Non-zero if machine is entering or * + * in a sleep state... */ +VAR time_t SleepJobs VALUE(0); + /* Time when all jobs must be * + * canceled for system sleep. */ +#ifdef __APPLE__ +VAR int SysEventPipes[2] VALUE2(-1,-1); + /* System event notification pipes */ +#endif /* __APPLE__ */ + + +/* + * Prototypes... + */ + +extern void cupsdAllowSleep(void); +extern void cupsdCleanDirty(void); +extern void cupsdMarkDirty(int what); +extern void cupsdSetBusyState(void); +extern void cupsdStartSystemMonitor(void); +extern void cupsdStopSystemMonitor(void); + + +/* + * End of "$Id: sysman.h 9350 2010-11-04 23:23:25Z mike $". + */ diff --git a/scheduler/testdirsvc.c b/scheduler/testdirsvc.c new file mode 100644 index 0000000..3ffaf3b --- /dev/null +++ b/scheduler/testdirsvc.c @@ -0,0 +1,324 @@ +/* + * "$Id: testdirsvc.c 9691 2011-04-15 23:38:13Z mike $" + * + * Browsing test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Simulate one or more remote printers. + * usage() - Show program usage... + */ + +/* + * Include necessary headers... + */ + +#include +#include + + +/* + * Local functions... + */ + +static void usage(void); + + +/* + * 'main()' - Simulate one or more remote printers. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, /* Looping var */ + printer, /* Current printer */ + num_printers, /* Number of printers */ + pclass, /* Current printer class */ + num_pclasses, /* Number of printer classes */ + server, /* Current server */ + num_servers, /* Number of servers */ + count, /* Number of printers sent this cycle */ + interval, /* Browse Interval */ + lease, /* Browse lease-duration */ + continuous, /* Run continuously? */ + port, /* Browse port */ + sock, /* Browse socket */ + val, /* Socket option value */ + seconds, /* Seconds until next cycle */ + verbose; /* Verbose output? */ + const char *options; /* Options for URIs */ + time_t curtime; /* Current UNIX time */ + struct tm *curdate; /* Current date and time */ + struct sockaddr_in addr; /* Broadcast address */ + char packet[1540]; /* Data packet */ + static const char * const names[26] = /* Printer names */ + { + "alpha", + "bravo", + "charlie", + "delta", + "echo", + "foxtrot", + "golf", + "hotel", + "india", + "juliet", + "kilo", + "lima", + "mike", + "november", + "oscar", + "papa", + "quebec", + "romeo", + "sierra", + "tango", + "uniform", + "victor", + "wiskey", + "x-ray", + "yankee", + "zulu" + }; + + + /* + * Process command-line arguments... + */ + + num_printers = 10; + num_pclasses = 5; + num_servers = 1; + interval = 30; + lease = 60; + port = 0; + verbose = 0; + continuous = 0; + options = NULL; + + for (i = 1; i < argc; i ++) + { + if (!strcmp(argv[i], "-c")) + continuous = 1; + else if (!strcmp(argv[i], "-i")) + { + i ++; + if (i < argc) + interval = atoi(argv[i]); + else + usage(); + + continuous = 1; + } + else if (!strcmp(argv[i], "-l")) + { + i ++; + if (i < argc) + lease = atoi(argv[i]); + else + usage(); + } + else if (!strcmp(argv[i], "-o")) + { + i ++; + if (i < argc) + options = argv[i]; + else + usage(); + } + else if (!strcmp(argv[i], "-C")) + { + i ++; + if (i < argc) + num_pclasses = atoi(argv[i]); + else + usage(); + } + else if (!strcmp(argv[i], "-p")) + { + i ++; + if (i < argc) + num_printers = atoi(argv[i]); + else + usage(); + } + else if (!strcmp(argv[i], "-s")) + { + i ++; + if (i < argc) + num_servers = atoi(argv[i]); + else + usage(); + } + else if (!strcmp(argv[i], "-v")) + verbose = 1; + else if (isdigit(argv[i][0] & 255)) + { + port = atoi(argv[i]); + } + else + usage(); + } + + if ((num_printers <= 0 && num_pclasses <= 0) || num_servers <= 0 || + interval <= 0 || lease < 1 || port <= 0) + usage(); + + /* + * Open a broadcast socket... + */ + + if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) + { + perror("Unable to open broadcast socket"); + return (1); + } + + /* + * Set the "broadcast" flag... + */ + + val = 1; + if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &val, sizeof(val))) + { + perror("Unable to put socket in broadcast mode"); + + close(sock); + return (1); + } + + /* + * Broadcast to 127.0.0.1 (localhost) + */ + + memset(&addr, 0, sizeof(addr)); + addr.sin_addr.s_addr = htonl(0x7f000001); + addr.sin_family = AF_INET; + addr.sin_port = htons(port); + + /* + * Send virtual printers continuously until we are stopped. + */ + + for (;;) + { + /* + * Start a new cycle of N printers... + */ + + printf("Sending %d printers from %d servers...\n", num_printers, + num_servers); + + count = num_servers * (num_printers + num_pclasses) / interval + 1; + curtime = time(NULL); + curdate = localtime(&curtime); + seconds = interval; + + for (i = 0, printer = 0; printer < num_printers; printer ++) + { + for (server = 0; server < num_servers; server ++, i ++) + { + if (i == count) + { + seconds --; + i = 0; + sleep(1); + curtime = time(NULL); + curdate = localtime(&curtime); + } + + snprintf(packet, sizeof(packet), + "%x %x ipp://testserver-%d/printers/%s-%d \"Server Room %d\" " + "\"Test Printer %d\" \"Acme Blazer 2000\"%s%s " + "lease-duration=%d\n", + CUPS_PRINTER_REMOTE, IPP_PRINTER_IDLE, server + 1, + names[printer % 26], printer / 26 + 1, server + 1, + printer + 1, options ? " ipp-options=" : "", + options ? options : "", lease); + + if (verbose) + printf("[%02d:%02d:%02d] %s", curdate->tm_hour, curdate->tm_min, + curdate->tm_sec, packet); + + if (sendto(sock, packet, strlen(packet), 0, + (struct sockaddr *)&addr, sizeof(addr)) < 0) + perror("Unabled to send packet"); + } + } + + + for (i = 0, pclass = 0; pclass < num_pclasses; pclass ++) + { + for (server = 0; server < num_servers; server ++, i ++) + { + if (i == count) + { + seconds --; + i = 0; + sleep(1); + curtime = time(NULL); + curdate = localtime(&curtime); + } + + snprintf(packet, sizeof(packet), + "%x %x ipp://testserver-%d/classes/class-%s-%d \"Server Room %d\" " + "\"Test Class %d\" \"Acme Blazer 2000\"%s%s " + "lease-duration=%d\n", + CUPS_PRINTER_REMOTE | CUPS_PRINTER_CLASS, IPP_PRINTER_IDLE, + server + 1, names[pclass % 26], pclass / 26 + 1, server + 1, + pclass + 1, options ? " ipp-options=" : "", + options ? options : "", lease); + + if (verbose) + printf("[%02d:%02d:%02d] %s", curdate->tm_hour, curdate->tm_min, + curdate->tm_sec, packet); + + if (sendto(sock, packet, strlen(packet), 0, + (struct sockaddr *)&addr, sizeof(addr)) < 0) + perror("Unabled to send packet"); + } + } + + if (!continuous) + break; + + /* + * Sleep for any remaining time... + */ + + if (seconds > 0) + sleep(seconds); + } + + return (0); +} + + +/* + * 'usage()' - Show program usage... + */ + +static void +usage(void) +{ + puts("Usage: testdirsvc [-c] [-i interval] [-l lease-duration] " + "[-o ipp-options] [-p printers] " + "[-C classes] [-s servers] [-v] port"); + exit(0); +} + + +/* + * End of "$Id: testdirsvc.c 9691 2011-04-15 23:38:13Z mike $". + */ diff --git a/scheduler/testlpd.c b/scheduler/testlpd.c new file mode 100644 index 0000000..a7302ca --- /dev/null +++ b/scheduler/testlpd.c @@ -0,0 +1,550 @@ +/* + * "$Id: testlpd.c 9042 2010-03-24 00:45:34Z mike $" + * + * cups-lpd test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Simulate an LPD client. + * do_command() - Send the LPD command and wait for a response. + * print_job() - Submit a file for printing. + * print_waiting() - Print waiting jobs. + * remove_job() - Cancel a print job. + * status_long() - Show the long printer status. + * status_short() - Show the short printer status. + * usage() - Show program usage... + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Local functions... + */ + +static int do_command(int outfd, int infd, const char *command); +static int print_job(int outfd, int infd, char *dest, char **args); +static int print_waiting(int outfd, int infd, char *dest); +static int remove_job(int outfd, int infd, char *dest, char **args); +static int status_long(int outfd, int infd, char *dest, char **args); +static int status_short(int outfd, int infd, char *dest, char **args); +static void usage(void); + + +/* + * 'main()' - Simulate an LPD client. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int status; /* Test status */ + char *op, /* Operation to test */ + **opargs, /* Remaining arguments */ + *dest; /* Destination */ + int cupslpd_argc; /* Argument count for cups-lpd */ + char *cupslpd_argv[1000]; /* Arguments for cups-lpd */ + int cupslpd_stdin[2], /* Standard input for cups-lpd */ + cupslpd_stdout[2], /* Standard output for cups-lpd */ + cupslpd_pid, /* Process ID for cups-lpd */ + cupslpd_status; /* Status of cups-lpd process */ + + + /* + * Collect command-line arguments... + */ + + op = NULL; + opargs = NULL; + dest = NULL; + cupslpd_argc = 1; + cupslpd_argv[0] = (char *)"cups-lpd"; + + for (i = 1; i < argc; i ++) + if (!strncmp(argv[i], "-o", 2)) + { + cupslpd_argv[cupslpd_argc++] = argv[i]; + + if (!argv[i][2]) + { + i ++; + + if (i >= argc) + usage(); + + cupslpd_argv[cupslpd_argc++] = argv[i]; + } + } + else if (argv[i][0] == '-') + usage(); + else if (!op) + op = argv[i]; + else if (!dest) + dest = argv[i]; + else + { + opargs = argv + i; + break; + } + + if (!op || + (!strcmp(op, "print-job") && (!dest || !opargs)) || + (!strcmp(op, "remove-job") && (!dest || !opargs)) || + (strcmp(op, "print-job") && strcmp(op, "print-waiting") && + strcmp(op, "remove-job") && strcmp(op, "status-long") && + strcmp(op, "status-short"))) + { + printf("op=\"%s\", dest=\"%s\", opargs=%p\n", op, dest, opargs); + usage(); + } + + /* + * Run the cups-lpd program using pipes... + */ + + cupslpd_argv[cupslpd_argc] = NULL; + + pipe(cupslpd_stdin); + pipe(cupslpd_stdout); + + if ((cupslpd_pid = fork()) < 0) + { + /* + * Error! + */ + + perror("testlpd: Unable to fork"); + return (1); + } + else if (cupslpd_pid == 0) + { + /* + * Child goes here... + */ + + dup2(cupslpd_stdin[0], 0); + close(cupslpd_stdin[0]); + close(cupslpd_stdin[1]); + + dup2(cupslpd_stdout[1], 1); + close(cupslpd_stdout[0]); + close(cupslpd_stdout[1]); + + execv("./cups-lpd", cupslpd_argv); + + perror("testlpd: Unable to exec ./cups-lpd"); + exit(errno); + } + else + { + close(cupslpd_stdin[0]); + close(cupslpd_stdout[1]); + } + + /* + * Do the operation test... + */ + + if (!strcmp(op, "print-job")) + status = print_job(cupslpd_stdin[1], cupslpd_stdout[0], dest, opargs); + else if (!strcmp(op, "print-waiting")) + status = print_waiting(cupslpd_stdin[1], cupslpd_stdout[0], dest); + else if (!strcmp(op, "remove-job")) + status = remove_job(cupslpd_stdin[1], cupslpd_stdout[0], dest, opargs); + else if (!strcmp(op, "status-long")) + status = status_long(cupslpd_stdin[1], cupslpd_stdout[0], dest, opargs); + else if (!strcmp(op, "status-short")) + status = status_short(cupslpd_stdin[1], cupslpd_stdout[0], dest, opargs); + else + { + printf("Unknown operation \"%s\"!\n", op); + status = 1; + } + + /* + * Kill the test program... + */ + + close(cupslpd_stdin[1]); + close(cupslpd_stdout[0]); + + while (wait(&cupslpd_status) != cupslpd_pid); + + printf("cups-lpd exit status was %d...\n", cupslpd_status); + + /* + * Return the test status... + */ + + return (status); +} + + +/* + * 'do_command()' - Send the LPD command and wait for a response. + */ + +static int /* O - Status from cups-lpd */ +do_command(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + const char *command) /* I - Command line to send */ +{ + int len; /* Length of command line */ + char status; /* Status byte */ + + + printf("COMMAND: %02X %s", command[0], command + 1); + + len = strlen(command); + + if (write(outfd, command, len) < len) + { + puts(" Write failed!"); + return (-1); + } + + if (read(infd, &status, 1) < 1) + puts("STATUS: ERROR"); + else + printf("STATUS: %d\n", status); + + return (status); +} + + +/* + * 'print_job()' - Submit a file for printing. + */ + +static int /* O - Status from cups-lpd */ +print_job(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + char *dest, /* I - Destination */ + char **args) /* I - Arguments */ +{ + int fd; /* Print file descriptor */ + char command[1024], /* Command buffer */ + control[1024], /* Control file */ + buffer[8192]; /* Print buffer */ + int status; /* Status of command */ + struct stat fileinfo; /* File information */ + char *jobname; /* Job name */ + int sequence; /* Sequence number */ + int bytes; /* Bytes read/written */ + + + /* + * Check the print file... + */ + + if (stat(args[0], &fileinfo)) + { + perror(args[0]); + return (-1); + } + + if ((fd = open(args[0], O_RDONLY)) < 0) + { + perror(args[0]); + return (-1); + } + + /* + * Send the "receive print job" command... + */ + + snprintf(command, sizeof(command), "\002%s\n", dest); + if ((status = do_command(outfd, infd, command)) != 0) + { + close(fd); + return (status); + } + + /* + * Format a control file string that will be used to submit the job... + */ + + if ((jobname = strrchr(args[0], '/')) != NULL) + jobname ++; + else + jobname = args[0]; + + sequence = (int)getpid() % 1000; + + snprintf(control, sizeof(control), + "Hlocalhost\n" + "P%s\n" + "J%s\n" + "ldfA%03dlocalhost\n" + "UdfA%03dlocalhost\n" + "N%s\n", + cupsUser(), jobname, sequence, sequence, jobname); + + /* + * Send the control file... + */ + + bytes = strlen(control); + + snprintf(command, sizeof(command), "\002%d cfA%03dlocalhost\n", + bytes, sequence); + + if ((status = do_command(outfd, infd, command)) != 0) + { + close(fd); + return (status); + } + + bytes ++; + + if (write(outfd, control, bytes) < bytes) + { + printf("CONTROL: Unable to write %d bytes!\n", bytes); + close(fd); + return (-1); + } + + printf("CONTROL: Wrote %d bytes.\n", bytes); + + if (read(infd, command, 1) < 1) + { + puts("STATUS: ERROR"); + close(fd); + return (-1); + } + else + { + status = command[0]; + + printf("STATUS: %d\n", status); + } + + /* + * Send the data file... + */ + + snprintf(command, sizeof(command), "\003%d dfA%03dlocalhost\n", + (int)fileinfo.st_size, sequence); + + if ((status = do_command(outfd, infd, command)) != 0) + { + close(fd); + return (status); + } + + while ((bytes = read(fd, buffer, sizeof(buffer))) > 0) + { + if (write(outfd, buffer, bytes) < bytes) + { + printf("DATA: Unable to write %d bytes!\n", bytes); + close(fd); + return (-1); + } + } + + write(outfd, "", 1); + + close(fd); + + printf("DATA: Wrote %d bytes.\n", (int)fileinfo.st_size); + + if (read(infd, command, 1) < 1) + { + puts("STATUS: ERROR"); + close(fd); + return (-1); + } + else + { + status = command[0]; + + printf("STATUS: %d\n", status); + } + + return (status); +} + + +/* + * 'print_waiting()' - Print waiting jobs. + */ + +static int /* O - Status from cups-lpd */ +print_waiting(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + char *dest) /* I - Destination */ +{ + char command[1024]; /* Command buffer */ + + + /* + * Send the "print waiting jobs" command... + */ + + snprintf(command, sizeof(command), "\001%s\n", dest); + + return (do_command(outfd, infd, command)); +} + + +/* + * 'remove_job()' - Cancel a print job. + */ + +static int /* O - Status from cups-lpd */ +remove_job(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + char *dest, /* I - Destination */ + char **args) /* I - Arguments */ +{ + int i; /* Looping var */ + char command[1024]; /* Command buffer */ + + /* + * Send the "remove jobs" command... + */ + + snprintf(command, sizeof(command), "\005%s", dest); + + for (i = 0; args[i]; i ++) + { + strlcat(command, " ", sizeof(command)); + strlcat(command, args[i], sizeof(command)); + } + + strlcat(command, "\n", sizeof(command)); + + return (do_command(outfd, infd, command)); +} + + +/* + * 'status_long()' - Show the long printer status. + */ + +static int /* O - Status from cups-lpd */ +status_long(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + char *dest, /* I - Destination */ + char **args) /* I - Arguments */ +{ + char command[1024], /* Command buffer */ + buffer[8192]; /* Status buffer */ + int bytes; /* Bytes read/written */ + + + /* + * Send the "send short status" command... + */ + + if (args) + snprintf(command, sizeof(command), "\004%s %s\n", dest, args[0]); + else + snprintf(command, sizeof(command), "\004%s\n", dest); + + bytes = strlen(command); + + if (write(outfd, command, bytes) < bytes) + return (-1); + + /* + * Read the status back... + */ + + while ((bytes = read(infd, buffer, sizeof(buffer))) > 0) + { + fwrite(buffer, 1, bytes, stdout); + fflush(stdout); + } + + return (0); +} + + +/* + * 'status_short()' - Show the short printer status. + */ + +static int /* O - Status from cups-lpd */ +status_short(int outfd, /* I - Command file descriptor */ + int infd, /* I - Response file descriptor */ + char *dest, /* I - Destination */ + char **args) /* I - Arguments */ +{ + char command[1024], /* Command buffer */ + buffer[8192]; /* Status buffer */ + int bytes; /* Bytes read/written */ + + + /* + * Send the "send short status" command... + */ + + if (args) + snprintf(command, sizeof(command), "\003%s %s\n", dest, args[0]); + else + snprintf(command, sizeof(command), "\003%s\n", dest); + + bytes = strlen(command); + + if (write(outfd, command, bytes) < bytes) + return (-1); + + /* + * Read the status back... + */ + + while ((bytes = read(infd, buffer, sizeof(buffer))) > 0) + { + fwrite(buffer, 1, bytes, stdout); + fflush(stdout); + } + + return (0); +} + + +/* + * 'usage()' - Show program usage... + */ + +static void +usage(void) +{ + puts("Usage: testlpd [options] print-job printer filename [... filename]"); + puts(" testlpd [options] print-waiting [printer or user]"); + puts(" testlpd [options] remove-job printer [user [job-id]]"); + puts(" testlpd [options] status-long [printer or user]"); + puts(" testlpd [options] status-short [printer or user]"); + puts(""); + puts("Options:"); + puts(" -o name=value"); + + exit(0); +} + + +/* + * End of "$Id: testlpd.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/scheduler/testmime.c b/scheduler/testmime.c new file mode 100644 index 0000000..de49544 --- /dev/null +++ b/scheduler/testmime.c @@ -0,0 +1,531 @@ +/* + * "$Id: testmime.c 9862 2011-08-03 02:44:09Z mike $" + * + * MIME test program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry for the test program. + * add_ppd_filter() - Add a printer filter from a PPD. + * add_ppd_filters() - Add all filters from a PPD. + * print_rules() - Print the rules for a file type... + * type_dir() - Show the MIME types for a given directory. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include "mime.h" + + +/* + * Local functions... + */ + +static void add_ppd_filter(mime_t *mime, mime_type_t *filtertype, + const char *filter); +static void add_ppd_filters(mime_t *mime, ppd_file_t *ppd); +static void print_rules(mime_magic_t *rules); +static void type_dir(mime_t *mime, const char *dirname); + + +/* + * 'main()' - Main entry for the test program. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping vars */ + const char *filter_path; /* Filter path */ + char super[MIME_MAX_SUPER], /* Super-type name */ + type[MIME_MAX_TYPE]; /* Type name */ + int compression; /* Compression of file */ + int cost; /* Cost of filters */ + mime_t *mime; /* MIME database */ + mime_type_t *src, /* Source type */ + *dst; /* Destination type */ + struct stat srcinfo; /* Source information */ + ppd_file_t *ppd; /* PPD file */ + cups_array_t *filters; /* Filters for the file */ + mime_filter_t *filter; /* Current filter */ + + + mime = NULL; + src = NULL; + dst = NULL; + ppd = NULL; + filter_path = "../filter:" CUPS_SERVERBIN "/filter"; + + srcinfo.st_size = 0; + + for (i = 1; i < argc; i ++) + if (!strcmp(argv[i], "-d")) + { + i ++; + + if (i < argc) + { + mime = mimeLoad(argv[i], filter_path); + + if (ppd) + add_ppd_filters(mime, ppd); + } + } + else if (!strcmp(argv[i], "-f")) + { + i ++; + + if (i < argc) + filter_path = argv[i]; + } + else if (!strcmp(argv[i], "-p")) + { + i ++; + + if (i < argc) + { + ppd = ppdOpenFile(argv[i]); + + if (mime) + add_ppd_filters(mime, ppd); + } + } + else if (!src) + { + if (!mime) + mime = mimeLoad("../conf", filter_path); + + if (ppd) + add_ppd_filters(mime, ppd); + + src = mimeFileType(mime, argv[i], NULL, &compression); + stat(argv[i], &srcinfo); + + if (src) + printf("%s: %s/%s%s\n", argv[i], src->super, src->type, + compression ? " (gzipped)" : ""); + else if ((src = mimeType(mime, "application", "octet-stream")) != NULL) + printf("%s: application/octet-stream\n", argv[i]); + else + { + printf("%s: unknown\n", argv[i]); + if (mime) + mimeDelete(mime); + return (1); + } + } + else + { + sscanf(argv[i], "%15[^/]/%31s", super, type); + dst = mimeType(mime, super, type); + + filters = mimeFilter2(mime, src, srcinfo.st_size, dst, &cost); + + if (!filters) + { + printf("No filters to convert from %s/%s to %s.\n", src->super, + src->type, argv[i]); + } + else + { + int first = 1; /* First filter shown? */ + + printf("Filter cost = %d\n", cost); + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if (!strcmp(filter->filter, "-")) + continue; + + if (first) + { + first = 0; + fputs(filter->filter, stdout); + } + else + printf(" | %s", filter->filter); + } + + putchar('\n'); + + cupsArrayDelete(filters); + } + } + + if (!mime) + { + mime = mimeLoad("../conf", filter_path); + if (ppd) + add_ppd_filters(mime, ppd); + } + + if (!src) + { + puts("MIME database types:"); + for (src = mimeFirstType(mime); src; src = mimeNextType(mime)) + { + printf("\t%s/%s (%d):\n", src->super, src->type, src->priority); + print_rules(src->rules); + puts(""); + } + + puts(""); + + puts("MIME database filters:"); + for (filter = mimeFirstFilter(mime); filter; filter = mimeNextFilter(mime)) + printf("\t%s/%s to %s/%s: %s (%d)\n", + filter->src->super, filter->src->type, + filter->dst->super, filter->dst->type, + filter->filter, filter->cost); + + type_dir(mime, "../doc"); + } + + return (0); +} + + +/* + * 'add_printer_filter()' - Add a printer filter from a PPD. + */ + +static void +add_ppd_filter(mime_t *mime, /* I - MIME database */ + mime_type_t *filtertype, /* I - Filter or prefilter MIME type */ + const char *filter) /* I - Filter to add */ +{ + char super[MIME_MAX_SUPER], /* Super-type for filter */ + type[MIME_MAX_TYPE], /* Type for filter */ + dsuper[MIME_MAX_SUPER], /* Destination super-type for filter */ + dtype[MIME_MAX_TYPE], /* Destination type for filter */ + dest[MIME_MAX_SUPER + MIME_MAX_TYPE + 2], + /* Destination super/type */ + program[1024]; /* Program/filter name */ + int cost; /* Cost of filter */ + size_t maxsize = 0; /* Maximum supported file size */ + mime_type_t *temptype, /* MIME type looping var */ + *desttype; /* Destination MIME type */ + mime_filter_t *filterptr; /* MIME filter */ + + + DEBUG_printf(("add_ppd_filter(mime=%p, filtertype=%p(%s/%s), filter=\"%s\")", + mime, filtertype, filtertype->super, filtertype->type, filter)); + + /* + * Parse the filter string; it should be in one of the following formats: + * + * source/type cost program + * source/type cost maxsize(nnnn) program + * source/type dest/type cost program + * source/type dest/type cost maxsize(nnnn) program + */ + + if (sscanf(filter, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + super, type, dsuper, dtype, &cost, program) == 6) + { + snprintf(dest, sizeof(dest), "test/%s/%s", dsuper, dtype); + + if ((desttype = mimeType(mime, "printer", dest)) == NULL) + desttype = mimeAddType(mime, "printer", dest); + } + else + { + if (sscanf(filter, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, &cost, + program) == 4) + { + desttype = filtertype; + } + else + { + printf("testmime: Invalid filter string \"%s\".\n", filter); + return; + } + } + + if (!strncmp(program, "maxsize(", 8)) + { + char *ptr; /* Pointer into maxsize(nnnn) program */ + + maxsize = strtoll(program + 8, &ptr, 10); + + if (*ptr != ')') + { + printf("testmime: Invalid filter string \"%s\".\n", filter); + return; + } + + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + } + + /* + * Add the filter to the MIME database, supporting wildcards as needed... + */ + + for (temptype = mimeFirstType(mime); + temptype; + temptype = mimeNextType(mime)) + if (((super[0] == '*' && _cups_strcasecmp(temptype->super, "printer")) || + !_cups_strcasecmp(temptype->super, super)) && + (type[0] == '*' || !_cups_strcasecmp(temptype->type, type))) + { + if (desttype != filtertype) + { + DEBUG_printf(("add_ppd_filter: Adding filter %s/%s %s/%s %d %s", + temptype->super, temptype->type, desttype->super, + desttype->type, cost, program)); + filterptr = mimeAddFilter(mime, temptype, desttype, cost, program); + + if (!mimeFilterLookup(mime, desttype, filtertype)) + { + DEBUG_printf(("add_printer_filter: Adding filter %s/%s %s/%s 0 -", + desttype->super, desttype->type, filtertype->super, + filtertype->type)); + mimeAddFilter(mime, desttype, filtertype, 0, "-"); + } + } + else + { + DEBUG_printf(("add_printer_filter: Adding filter %s/%s %s/%s %d %s", + temptype->super, temptype->type, filtertype->super, + filtertype->type, cost, program)); + filterptr = mimeAddFilter(mime, temptype, filtertype, cost, program); + } + + if (filterptr) + filterptr->maxsize = maxsize; + } +} + + +/* + * 'add_ppd_filters()' - Add all filters from a PPD. + */ + +static void +add_ppd_filters(mime_t *mime, /* I - MIME database */ + ppd_file_t *ppd) /* I - PPD file */ +{ + _ppd_cache_t *pc; /* Cache data for PPD */ + const char *value; /* Filter definition value */ + mime_type_t *filter, /* Filter type */ + *prefilter; /* Pre-filter type */ + + + pc = _ppdCacheCreateWithPPD(ppd); + if (!pc) + return; + + filter = mimeAddType(mime, "printer", "test"); + + if (pc->filters) + { + for (value = (const char *)cupsArrayFirst(pc->filters); + value; + value = (const char *)cupsArrayNext(pc->filters)) + add_ppd_filter(mime, filter, value); + } + else + { + add_ppd_filter(mime, filter, "application/vnd.cups-raw 0 -"); + add_ppd_filter(mime, filter, "application/vnd.cups-postscript 0 -"); + } + + if (pc->prefilters) + { + prefilter = mimeAddType(mime, "prefilter", "test"); + + for (value = (const char *)cupsArrayFirst(pc->prefilters); + value; + value = (const char *)cupsArrayNext(pc->prefilters)) + add_ppd_filter(mime, prefilter, value); + } +} + + +/* + * 'print_rules()' - Print the rules for a file type... + */ + +static void +print_rules(mime_magic_t *rules) /* I - Rules to print */ +{ + int i; /* Looping var */ + static char indent[255] = "\t"; /* Indentation for rules */ + + + if (rules == NULL) + return; + + while (rules != NULL) + { + printf("%s[%p] ", indent, rules); + + if (rules->invert) + printf("NOT "); + + switch (rules->op) + { + case MIME_MAGIC_MATCH : + printf("match(%s)", rules->value.matchv); + break; + case MIME_MAGIC_LOCALE : + printf("locale(%s)", rules->value.localev); + break; + case MIME_MAGIC_ASCII : + printf("ascii(%d,%d)", rules->offset, rules->length); + break; + case MIME_MAGIC_PRINTABLE : + printf("printable(%d,%d)", rules->offset, rules->length); + break; + case MIME_MAGIC_STRING : + printf("string(%d,", rules->offset); + for (i = 0; i < rules->length; i ++) + if (rules->value.stringv[i] < ' ' || + rules->value.stringv[i] > 126) + printf("<%02X>", rules->value.stringv[i]); + else + putchar(rules->value.stringv[i]); + putchar(')'); + break; + case MIME_MAGIC_CHAR : + printf("char(%d,%d)", rules->offset, rules->value.charv); + break; + case MIME_MAGIC_SHORT : + printf("short(%d,%d)", rules->offset, rules->value.shortv); + break; + case MIME_MAGIC_INT : + printf("int(%d,%d)", rules->offset, rules->value.intv); + break; + case MIME_MAGIC_CONTAINS : + printf("contains(%d,%d,", rules->offset, rules->region); + for (i = 0; i < rules->length; i ++) + if (rules->value.stringv[i] < ' ' || + rules->value.stringv[i] > 126) + printf("<%02X>", rules->value.stringv[i]); + else + putchar(rules->value.stringv[i]); + putchar(')'); + break; + default : + break; + } + + if (rules->child != NULL) + { + if (rules->op == MIME_MAGIC_OR) + puts("OR ("); + else + puts("AND ("); + + strcat(indent, "\t"); + print_rules(rules->child); + indent[strlen(indent) - 1] = '\0'; + printf("%s)\n", indent); + } + else + putchar('\n'); + + rules = rules->next; + } +} + + +/* + * 'type_dir()' - Show the MIME types for a given directory. + */ + +static void +type_dir(mime_t *mime, /* I - MIME database */ + const char *dirname) /* I - Directory */ +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + char filename[1024]; /* File to type */ + mime_type_t *filetype; /* File type */ + int compression; /* Compressed file? */ + mime_type_t *pstype; /* application/vnd.cups-postscript */ + cups_array_t *filters; /* Filters to pstype */ + mime_filter_t *filter; /* Current filter */ + int cost; /* Filter cost */ + + + dir = cupsDirOpen(dirname); + if (!dir) + return; + + pstype = mimeType(mime, "application", "vnd.cups-postscript"); + + while ((dent = cupsDirRead(dir)) != NULL) + { + if (dent->filename[0] == '.') + continue; + + snprintf(filename, sizeof(filename), "%s/%s", dirname, dent->filename); + + if (S_ISDIR(dent->fileinfo.st_mode)) + type_dir(mime, filename); + + if (!S_ISREG(dent->fileinfo.st_mode)) + continue; + + filetype = mimeFileType(mime, filename, NULL, &compression); + + if (filetype) + { + printf("%s: %s/%s%s\n", filename, filetype->super, filetype->type, + compression ? " (compressed)" : ""); + + filters = mimeFilter(mime, filetype, pstype, &cost); + + if (!filters) + puts(" No filters to convert application/vnd.cups-postscript."); + else + { + printf(" Filter cost = %d\n", cost); + + filter = (mime_filter_t *)cupsArrayFirst(filters); + printf(" %s", filter->filter); + + for (filter = (mime_filter_t *)cupsArrayNext(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + printf(" | %s", filter->filter); + + putchar('\n'); + + cupsArrayDelete(filters); + } + } + else + printf("%s: unknown%s\n", filename, compression ? " (compressed)" : ""); + } + + cupsDirClose(dir); +} + + +/* + * End of "$Id: testmime.c 9862 2011-08-03 02:44:09Z mike $". + */ diff --git a/scheduler/testspeed.c b/scheduler/testspeed.c new file mode 100644 index 0000000..1fe0a33 --- /dev/null +++ b/scheduler/testspeed.c @@ -0,0 +1,365 @@ +/* + * "$Id: testspeed.c 9042 2010-03-24 00:45:34Z mike $" + * + * Scheduler speed test for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Send multiple IPP requests and report on the average response + * time. + * do_test() - Run a test on a specific host... + * usage() - Show program usage... + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include +#include + + +/* + * Local functions... + */ + +static int do_test(const char *server, int port, + http_encryption_t encryption, int requests, + int verbose); +static void usage(void); + + +/* + * 'main()' - Send multiple IPP requests and report on the average response + * time. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char *server, /* Server to use */ + *ptr; /* Pointer to port in server */ + int port; /* Port to use */ + http_encryption_t encryption; /* Encryption to use */ + int requests; /* Number of requests to send */ + int children; /* Number of children to fork */ + int good_children; /* Number of children that exited normally */ + int pid; /* Child PID */ + int status; /* Child status */ + time_t start, /* Start time */ + end; /* End time */ + double elapsed; /* Elapsed time */ + int verbose; /* Verbosity */ + + + /* + * Parse command-line options... + */ + + requests = 100; + children = 5; + server = (char *)cupsServer(); + port = ippPort(); + encryption = HTTP_ENCRYPT_IF_REQUESTED; + verbose = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + for (ptr = argv[i] + 1; *ptr; ptr ++) + switch (*ptr) + { + case 'c' : /* Number of children */ + i ++; + if (i >= argc) + usage(); + + children = atoi(argv[i]); + break; + + case 'r' : /* Number of requests */ + i ++; + if (i >= argc) + usage(); + + requests = atoi(argv[i]); + break; + + case 'E' : /* Enable encryption */ + encryption = HTTP_ENCRYPT_REQUIRED; + break; + + case 'v' : /* Verbose logging */ + verbose ++; + break; + + default : + usage(); + break; + } + } + else + { + server = argv[i]; + + if (server[0] != '/' && (ptr = strrchr(server, ':')) != NULL) + { + *ptr++ = '\0'; + port = atoi(ptr); + } + } + + /* + * Then create child processes to act as clients... + */ + + if (children > 0) + { + printf("testspeed: Simulating %d clients with %d requests to %s with " + "%sencryption...\n", children, requests, server, + encryption == HTTP_ENCRYPT_IF_REQUESTED ? "no " : ""); + } + + start = time(NULL); + + if (children < 1) + return (do_test(server, port, encryption, requests, verbose)); + else if (children == 1) + good_children = do_test(server, port, encryption, requests, verbose) ? 0 : 1; + else + { + char options[255], /* Command-line options for child */ + reqstr[255], /* Requests string for child */ + serverstr[255]; /* Server:port string for child */ + + + snprintf(reqstr, sizeof(reqstr), "%d", requests); + + if (port == 631 || server[0] == '/') + strlcpy(serverstr, server, sizeof(serverstr)); + else + snprintf(serverstr, sizeof(serverstr), "%s:%d", server, port); + + strlcpy(options, "-cr", sizeof(options)); + + if (encryption == HTTP_ENCRYPT_REQUIRED) + strlcat(options, "E", sizeof(options)); + + if (verbose) + strlcat(options, "v", sizeof(options)); + + for (i = 0; i < children; i ++) + { + fflush(stdout); + + if ((pid = fork()) == 0) + { + /* + * Child goes here... + */ + + execlp(argv[0], argv[0], options, "0", reqstr, serverstr, (char *)NULL); + exit(errno); + } + else if (pid < 0) + { + printf("testspeed: Fork failed: %s\n", strerror(errno)); + break; + } + else + printf("testspeed: Started child %d...\n", pid); + } + + /* + * Wait for children to finish... + */ + + puts("testspeed: Waiting for children to finish..."); + + for (good_children = 0;;) + { + pid = wait(&status); + + if (pid < 0 && errno != EINTR) + break; + + printf("testspeed: Ended child %d (%d)...\n", pid, status / 256); + + if (!status) + good_children ++; + } + } + + /* + * Compute the total run time... + */ + + if (good_children > 0) + { + end = time(NULL); + elapsed = end - start; + i = good_children * requests; + + printf("testspeed: %dx%d=%d requests in %.1fs (%.3fs/r, %.1fr/s)\n", + good_children, requests, i, elapsed, elapsed / i, i / elapsed); + } + + /* + * Exit with no errors... + */ + + return (0); +} + + +/* + * 'do_test()' - Run a test on a specific host... + */ + +static int /* O - Exit status */ +do_test(const char *server, /* I - Server to use */ + int port, /* I - Port number to use */ + http_encryption_t encryption, /* I - Encryption to use */ + int requests, /* I - Number of requests to send */ + int verbose) /* I - Verbose output? */ +{ + int i; /* Looping var */ + http_t *http; /* Connection to server */ + ipp_t *request; /* IPP Request */ + struct timeval start, /* Start time */ + end; /* End time */ + double reqtime, /* Time for this request */ + elapsed; /* Elapsed time */ + int op; /* Current operation */ + static ipp_op_t ops[4] = /* Operations to test... */ + { + IPP_PRINT_JOB, + CUPS_GET_PRINTERS, + CUPS_GET_CLASSES, + IPP_GET_JOBS + }; + + + /* + * Connect to the server... + */ + + if ((http = httpConnectEncrypt(server, port, encryption)) == NULL) + { + printf("testspeed(%d): unable to connect to server - %s\n", (int)getpid(), + strerror(errno)); + return (1); + } + + /* + * Do multiple requests... + */ + + for (elapsed = 0.0, i = 0; i < requests; i ++) + { + /* + * Build a request which requires the following attributes: + * + * attributes-charset + * attributes-natural-language + * + * In addition, IPP_GET_JOBS needs a printer-uri attribute. + */ + + op = ops[i & 3]; + request = ippNewRequest(op); + + gettimeofday(&start, NULL); + + if (verbose) + printf("testspeed(%d): %.6f %s ", (int)getpid(), elapsed, + ippOpString(op)); + + switch (op) + { + case IPP_GET_JOBS : + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/printers/"); + + default : + ippDelete(cupsDoRequest(http, request, "/")); + break; + + case IPP_PRINT_JOB : + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/printers/test"); + ippDelete(cupsDoFileRequest(http, request, "/printers/test", + "../data/testprint.ps")); + break; + } + + gettimeofday(&end, NULL); + + reqtime = (end.tv_sec - start.tv_sec) + + 0.000001 * (end.tv_usec - start.tv_usec); + elapsed += reqtime; + + switch (cupsLastError()) + { + case IPP_OK : + case IPP_NOT_FOUND : + if (verbose) + { + printf("succeeded: %s (%.6f)\n", cupsLastErrorString(), reqtime); + fflush(stdout); + } + break; + + default : + if (!verbose) + printf("testspeed(%d): %s ", (int)getpid(), + ippOpString(ops[i & 3])); + + printf("failed: %s\n", cupsLastErrorString()); + httpClose(http); + return (1); + } + } + + httpClose(http); + + printf("testspeed(%d): %d requests in %.1fs (%.3fs/r, %.1fr/s)\n", + (int)getpid(), i, elapsed, elapsed / i, i / elapsed); + + return (0); +} + + +/* + * 'usage()' - Show program usage... + */ + +static void +usage(void) +{ + puts("Usage: testspeed [-c children] [-h] [-r requests] [-v] [-E] " + "hostname[:port]"); + exit(0); +} + + + +/* + * End of "$Id: testspeed.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/scheduler/testsub.c b/scheduler/testsub.c new file mode 100644 index 0000000..bff8e8b --- /dev/null +++ b/scheduler/testsub.c @@ -0,0 +1,522 @@ +/* + * "$Id: testsub.c 9042 2010-03-24 00:45:34Z mike $" + * + * Scheduler notification tester for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Subscribe to the . + * print_attributes() - Print the attributes in a request... + * sigterm_handler() - Flag when the user hits CTRL-C... + * usage() - Show program usage... + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include + + +/* + * Local globals... + */ + +static int terminate = 0; + + +/* + * Local functions... + */ + +static void print_attributes(ipp_t *ipp, int indent); +static void sigterm_handler(int sig); +static void usage(void); + + +/* + * 'main()' - Subscribe to the . + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + const char *uri; /* URI to use */ + int num_events; /* Number of events */ + const char *events[100]; /* Events */ + int subscription_id, /* notify-subscription-id */ + sequence_number, /* notify-sequence-number */ + interval; /* Interval between polls */ + http_t *http; /* HTTP connection */ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* Current attribute */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Actions for POSIX signals */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET */ + + + /* + * Parse command-line... + */ + + num_events = 0; + uri = NULL; + + for (i = 1; i < argc; i ++) + if (!strcmp(argv[i], "-E")) + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + else if (!strcmp(argv[i], "-e")) + { + i ++; + if (i >= argc || num_events >= 100) + usage(); + + events[num_events] = argv[i]; + num_events ++; + } + else if (!strcmp(argv[i], "-h")) + { + i ++; + if (i >= argc) + usage(); + + cupsSetServer(argv[i]); + } + else if (uri || strncmp(argv[i], "ipp://", 6)) + usage(); + else + uri = argv[i]; + + if (!uri) + usage(); + + if (num_events == 0) + { + events[0] = "all"; + num_events = 1; + } + + /* + * Connect to the server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + perror(cupsServer()); + return (1); + } + + /* + * Catch CTRL-C and SIGTERM... + */ + +#ifdef HAVE_SIGSET /* Use System V signals over POSIX to avoid bugs */ + sigset(SIGINT, sigterm_handler); + sigset(SIGTERM, sigterm_handler); +#elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + + sigemptyset(&action.sa_mask); + action.sa_handler = sigterm_handler; + sigaction(SIGINT, &action, NULL); + sigaction(SIGTERM, &action, NULL); +#else + signal(SIGINT, sigterm_handler); + signal(SIGTERM, sigterm_handler); +#endif /* HAVE_SIGSET */ + + /* + * Create the subscription... + */ + + if (strstr(uri, "/jobs/")) + { + request = ippNewRequest(IPP_CREATE_JOB_SUBSCRIPTION); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + } + else + { + request = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + } + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + ippAddStrings(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, "notify-events", + num_events, NULL, events); + ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, + "notify-pull-method", NULL, "ippget"); + + response = cupsDoRequest(http, request, uri); + if (cupsLastError() >= IPP_BAD_REQUEST) + { + fprintf(stderr, "Create-%s-Subscription: %s\n", + strstr(uri, "/jobs") ? "Job" : "Printer", cupsLastErrorString()); + ippDelete(response); + httpClose(http); + return (1); + } + + if ((attr = ippFindAttribute(response, "notify-subscription-id", + IPP_TAG_INTEGER)) == NULL) + { + fputs("ERROR: No notify-subscription-id in response!\n", stderr); + ippDelete(response); + httpClose(http); + return (1); + } + + subscription_id = attr->values[0].integer; + + printf("Create-%s-Subscription: notify-subscription-id=%d\n", + strstr(uri, "/jobs/") ? "Job" : "Printer", subscription_id); + + ippDelete(response); + + /* + * Monitor for events... + */ + + sequence_number = 0; + + while (!terminate) + { + /* + * Get the current events... + */ + + printf("\nGet-Notifications(%d,%d):", subscription_id, sequence_number); + fflush(stdout); + + request = ippNewRequest(IPP_GET_NOTIFICATIONS); + + if (strstr(uri, "/jobs/")) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "notify-subscription-ids", subscription_id); + if (sequence_number) + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "notify-sequence-numbers", sequence_number + 1); + + response = cupsDoRequest(http, request, uri); + + printf(" %s\n", ippErrorString(cupsLastError())); + + if (cupsLastError() >= IPP_BAD_REQUEST) + fprintf(stderr, "Get-Notifications: %s\n", cupsLastErrorString()); + else if (response) + { + print_attributes(response, 0); + + for (attr = ippFindAttribute(response, "notify-sequence-number", + IPP_TAG_INTEGER); + attr; + attr = ippFindNextAttribute(response, "notify-sequence-number", + IPP_TAG_INTEGER)) + if (attr->values[0].integer > sequence_number) + sequence_number = attr->values[0].integer; + } + + if ((attr = ippFindAttribute(response, "notify-get-interval", + IPP_TAG_INTEGER)) != NULL && + attr->values[0].integer > 0) + interval = attr->values[0].integer; + else + interval = 5; + + ippDelete(response); + sleep(interval); + } + + /* + * Cancel the subscription... + */ + + printf("\nCancel-Subscription:"); + fflush(stdout); + + request = ippNewRequest(IPP_CANCEL_SUBSCRIPTION); + + if (strstr(uri, "/jobs/")) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, uri); + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, + "notify-subscription-id", subscription_id); + + ippDelete(cupsDoRequest(http, request, uri)); + + printf(" %s\n", ippErrorString(cupsLastError())); + + if (cupsLastError() >= IPP_BAD_REQUEST) + fprintf(stderr, "Cancel-Subscription: %s\n", cupsLastErrorString()); + + /* + * Close the connection and return... + */ + + httpClose(http); + + return (0); +} + + +/* + * 'print_attributes()' - Print the attributes in a request... + */ + +static void +print_attributes(ipp_t *ipp, /* I - IPP request */ + int indent) /* I - Indentation */ +{ + int i; /* Looping var */ + ipp_tag_t group; /* Current group */ + ipp_attribute_t *attr; /* Current attribute */ + ipp_value_t *val; /* Current value */ + static const char * const tags[] = /* Value/group tag strings */ + { + "reserved-00", + "operation-attributes-tag", + "job-attributes-tag", + "end-of-attributes-tag", + "printer-attributes-tag", + "unsupported-attributes-tag", + "subscription-attributes-tag", + "event-attributes-tag", + "reserved-08", + "reserved-09", + "reserved-0A", + "reserved-0B", + "reserved-0C", + "reserved-0D", + "reserved-0E", + "reserved-0F", + "unsupported", + "default", + "unknown", + "no-value", + "reserved-14", + "not-settable", + "delete-attr", + "admin-define", + "reserved-18", + "reserved-19", + "reserved-1A", + "reserved-1B", + "reserved-1C", + "reserved-1D", + "reserved-1E", + "reserved-1F", + "reserved-20", + "integer", + "boolean", + "enum", + "reserved-24", + "reserved-25", + "reserved-26", + "reserved-27", + "reserved-28", + "reserved-29", + "reserved-2a", + "reserved-2b", + "reserved-2c", + "reserved-2d", + "reserved-2e", + "reserved-2f", + "octetString", + "dateTime", + "resolution", + "rangeOfInteger", + "begCollection", + "textWithLanguage", + "nameWithLanguage", + "endCollection", + "reserved-38", + "reserved-39", + "reserved-3a", + "reserved-3b", + "reserved-3c", + "reserved-3d", + "reserved-3e", + "reserved-3f", + "reserved-40", + "textWithoutLanguage", + "nameWithoutLanguage", + "reserved-43", + "keyword", + "uri", + "uriScheme", + "charset", + "naturalLanguage", + "mimeMediaType", + "memberName" + }; + + + for (group = IPP_TAG_ZERO, attr = ipp->attrs; attr; attr = attr->next) + { + if ((attr->group_tag == IPP_TAG_ZERO && indent <= 8) || !attr->name) + { + group = IPP_TAG_ZERO; + putchar('\n'); + continue; + } + + if (group != attr->group_tag) + { + group = attr->group_tag; + + putchar('\n'); + for (i = 4; i < indent; i ++) + putchar(' '); + + printf("%s:\n\n", tags[group]); + } + + for (i = 0; i < indent; i ++) + putchar(' '); + + printf("%s (", attr->name); + if (attr->num_values > 1) + printf("1setOf "); + printf("%s):", tags[attr->value_tag]); + + switch (attr->value_tag) + { + case IPP_TAG_ENUM : + case IPP_TAG_INTEGER : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %d", val->integer); + putchar('\n'); + break; + + case IPP_TAG_BOOLEAN : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %s", val->boolean ? "true" : "false"); + putchar('\n'); + break; + + case IPP_TAG_RANGE : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %d-%d", val->range.lower, val->range.upper); + putchar('\n'); + break; + + case IPP_TAG_DATE : + { + time_t vtime; /* Date/Time value */ + struct tm *vdate; /* Date info */ + char vstring[256]; /* Formatted time */ + + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + { + vtime = ippDateToTime(val->date); + vdate = localtime(&vtime); + strftime(vstring, sizeof(vstring), "%c", vdate); + printf(" (%s)", vstring); + } + } + putchar('\n'); + break; + + case IPP_TAG_RESOLUTION : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" %dx%d%s", val->resolution.xres, val->resolution.yres, + val->resolution.units == IPP_RES_PER_INCH ? "dpi" : "dpc"); + putchar('\n'); + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXTLANG : + case IPP_TAG_NAMELANG : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_URI : + case IPP_TAG_URISCHEME : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_MIMETYPE : + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + printf(" \"%s\"", val->string.text); + putchar('\n'); + break; + + case IPP_TAG_BEGIN_COLLECTION : + putchar('\n'); + + for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++) + { + if (i) + putchar('\n'); + print_attributes(val->collection, indent + 4); + } + break; + + default : + printf("UNKNOWN (%d values)\n", attr->num_values); + break; + } + } +} + + +/* + * 'sigterm_handler()' - Flag when the user hits CTRL-C... + */ + +static void +sigterm_handler(int sig) /* I - Signal number (unused) */ +{ + (void)sig; + + terminate = 1; +} + + +/* + * 'usage()' - Show program usage... + */ + +static void +usage(void) +{ + puts("Usage: testsub [-E] [-e event ... -e eventN] [-h hostname] URI"); + exit(0); +} + + + +/* + * End of "$Id: testsub.c 9042 2010-03-24 00:45:34Z mike $". + */ diff --git a/scheduler/timeout.c b/scheduler/timeout.c new file mode 100644 index 0000000..71387a1 --- /dev/null +++ b/scheduler/timeout.c @@ -0,0 +1,215 @@ +/* + * "$Id$" + * + * Timeout functions for the Common UNIX Printing System (CUPS). + * + * Copyright (C) 2010 Red Hat, Inc. + * Authors: + * Tim Waugh + * + * Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdInitTimeouts() - Initialise timeout structure. + * cupsdAddTimeout() - Add a timed callback. + * cupsdNextTimeout() - Find the next enabled timed callback. + * cupsdUpdateTimeout() - Adjust the time of a timed callback or disable it. + * cupsdRemoveTimeout() - Discard a timed callback. + * compare_timeouts() - Compare timed callbacks for array sorting. + */ + +#include + +#ifdef HAVE_AVAHI /* Applies to entire file... */ + +/* + * Include necessary headers... + */ + +#include "cupsd.h" + +#if defined(HAVE_MALLOC_H) && defined(HAVE_MALLINFO) +# include +#endif /* HAVE_MALLOC_H && HAVE_MALLINFO */ + +#ifdef HAVE_AVAHI +# include +#endif /* HAVE_AVAHI */ + + +struct _cupsd_timeout_s +{ + struct timeval when; + int enabled; + cupsd_timeoutfunc_t callback; + void *data; +}; + +/* + * Local functions... + */ + +/* + * 'compare_timeouts()' - Compare timed callbacks for array sorting. + */ + +static int +compare_addrs (void *p0, void *p1) +{ + if (p0 == p1) + return (0); + if (p0 < p1) + return (-1); + return (1); +} + +static int +compare_timeouts (cupsd_timeout_t *p0, cupsd_timeout_t *p1) +{ + int addrsdiff = compare_addrs (p0, p1); + int tvdiff; + + if (addrsdiff == 0) + return (0); + + if (!p0->enabled || !p1->enabled) + { + if (!p0->enabled && !p1->enabled) + return (addrsdiff); + + return (p0->enabled ? -1 : 1); + } + + tvdiff = avahi_timeval_compare (&p0->when, &p1->when); + if (tvdiff != 0) + return (tvdiff); + + return (addrsdiff); +} + + +/* + * 'cupsdInitTimeouts()' - Initialise timeout structures. + */ + +void +cupsdInitTimeouts(void) +{ + Timeouts = cupsArrayNew ((cups_array_func_t)compare_timeouts, NULL); +} + + +/* + * 'cupsdAddTimeout()' - Add a timed callback. + */ + +cupsd_timeout_t * /* O - Timeout handle */ +cupsdAddTimeout(const struct timeval *tv, /* I - Absolute time */ + cupsd_timeoutfunc_t cb, /* I - Callback function */ + void *data) /* I - User data */ +{ + cupsd_timeout_t *timeout; + + timeout = malloc (sizeof(cupsd_timeout_t)); + if (timeout != NULL) + { + timeout->enabled = (tv != NULL); + if (tv) + { + timeout->when.tv_sec = tv->tv_sec; + timeout->when.tv_usec = tv->tv_usec; + } + + timeout->callback = cb; + timeout->data = data; + cupsArrayAdd (Timeouts, timeout); + } + + return timeout; +} + + +/* + * 'cupsdNextTimeout()' - Find the next enabled timed callback. + */ + +cupsd_timeout_t * /* O - Next enabled timeout or NULL */ +cupsdNextTimeout(long *delay) /* O - Seconds before scheduled */ +{ + cupsd_timeout_t *first = cupsArrayFirst (Timeouts); + struct timeval curtime; + + if (first && !first->enabled) + first = NULL; + + if (first && delay) + { + gettimeofday (&curtime, NULL); + if (avahi_timeval_compare (&curtime, &first->when) > 0) + { + *delay = 0; + } else { + *delay = 1 + first->when.tv_sec - curtime.tv_sec; + if (first->when.tv_usec < curtime.tv_usec) + (*delay)--; + } + } + + return (first); +} + + +/* + * 'cupsdRunTimeout()' - Run a timed callback. + */ + +void +cupsdRunTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ +{ + if (!timeout) + return; + timeout->enabled = 0; + if (!timeout->callback) + return; + timeout->callback (timeout, timeout->data); +} + +/* + * 'cupsdUpdateTimeout()' - Adjust the time of a timed callback or disable it. + */ + +void +cupsdUpdateTimeout(cupsd_timeout_t *timeout, /* I - Timeout */ + const struct timeval *tv) /* I - Absolute time or NULL */ +{ + cupsArrayRemove (Timeouts, timeout); + timeout->enabled = (tv != NULL); + if (tv) + { + timeout->when.tv_sec = tv->tv_sec; + timeout->when.tv_usec = tv->tv_usec; + } + cupsArrayAdd (Timeouts, timeout); +} + + +/* + * 'cupsdRemoveTimeout()' - Discard a timed callback. + */ + +void +cupsdRemoveTimeout(cupsd_timeout_t *timeout) /* I - Timeout */ +{ + cupsArrayRemove (Timeouts, timeout); + free (timeout); +} + + +#endif /* HAVE_AVAHI ... from top of file */ + +/* + * End of "$Id$". + */ diff --git a/scheduler/type.c b/scheduler/type.c new file mode 100644 index 0000000..d2e32b2 --- /dev/null +++ b/scheduler/type.c @@ -0,0 +1,1216 @@ +/* + * "$Id: type.c 9793 2011-05-20 03:49:49Z mike $" + * + * MIME typing routines for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * mimeAddType() - Add a MIME type to a database. + * mimeAddTypeRule() - Add a detection rule for a file type. + * mimeFileType() - Determine the type of a file. + * mimeType() - Lookup a file type. + * mime_compare_types() - Compare two MIME super/type names. + * mime_check_rules() - Check each rule in a list. + * mime_patmatch() - Pattern matching. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include "mime.h" + + +/* + * Local types... + */ + +typedef struct _mime_filebuf_s /**** File buffer for MIME typing ****/ +{ + cups_file_t *fp; /* File pointer */ + int offset, /* Offset in file */ + length; /* Length of buffered data */ + unsigned char buffer[MIME_MAX_BUFFER];/* Buffered data */ +} _mime_filebuf_t; + + +/* + * Local functions... + */ + +static int mime_compare_types(mime_type_t *t0, mime_type_t *t1); +static int mime_check_rules(const char *filename, _mime_filebuf_t *fb, + mime_magic_t *rules); +static int mime_patmatch(const char *s, const char *pat); + + +/* + * Local globals... + */ + +#ifdef DEBUG +static const char * const debug_ops[] = + { /* Test names... */ + "NOP", /* No operation */ + "AND", /* Logical AND of all children */ + "OR", /* Logical OR of all children */ + "MATCH", /* Filename match */ + "ASCII", /* ASCII characters in range */ + "PRINTABLE", /* Printable characters (32-255) */ + "STRING", /* String matches */ + "CHAR", /* Character/byte matches */ + "SHORT", /* Short/16-bit word matches */ + "INT", /* Integer/32-bit word matches */ + "LOCALE", /* Current locale matches string */ + "CONTAINS", /* File contains a string */ + "ISTRING" /* Case-insensitive string matches */ + }; +#endif /* DEBUG */ + + +/* + * 'mimeAddType()' - Add a MIME type to a database. + */ + +mime_type_t * /* O - New (or existing) MIME type */ +mimeAddType(mime_t *mime, /* I - MIME database */ + const char *super, /* I - Super-type name */ + const char *type) /* I - Type name */ +{ + mime_type_t *temp; /* New MIME type */ + size_t typelen; /* Length of type name */ + + + DEBUG_printf(("mimeAddType(mime=%p, super=\"%s\", type=\"%s\")", mime, super, + type)); + + /* + * Range check input... + */ + + if (!mime || !super || !type) + { + DEBUG_puts("1mimeAddType: Returning NULL (bad arguments)."); + return (NULL); + } + + /* + * See if the type already exists; if so, return the existing type... + */ + + if ((temp = mimeType(mime, super, type)) != NULL) + { + DEBUG_printf(("1mimeAddType: Returning %p (existing).", temp)); + return (temp); + } + + /* + * The type doesn't exist; add it... + */ + + if (!mime->types) + mime->types = cupsArrayNew((cups_array_func_t)mime_compare_types, NULL); + + if (!mime->types) + { + DEBUG_puts("1mimeAddType: Returning NULL (no types)."); + return (NULL); + } + + typelen = strlen(type) + 1; + + if ((temp = calloc(1, sizeof(mime_type_t) - MIME_MAX_TYPE + typelen)) == NULL) + { + DEBUG_puts("1mimeAddType: Returning NULL (out of memory)."); + return (NULL); + } + + strlcpy(temp->super, super, sizeof(temp->super)); + memcpy(temp->type, type, typelen); + temp->priority = 100; + + cupsArrayAdd(mime->types, temp); + + DEBUG_printf(("1mimeAddType: Returning %p (new).", temp)); + return (temp); +} + + +/* + * 'mimeAddTypeRule()' - Add a detection rule for a file type. + */ + +int /* O - 0 on success, -1 on failure */ +mimeAddTypeRule(mime_type_t *mt, /* I - Type to add to */ + const char *rule) /* I - Rule to add */ +{ + int num_values, /* Number of values seen */ + op, /* Operation code */ + logic, /* Logic for next rule */ + invert; /* Invert following rule? */ + char name[255], /* Name in rule string */ + value[3][255], /* Value in rule string */ + *ptr, /* Position in name or value */ + quote; /* Quote character */ + int length[3]; /* Length of each parameter */ + mime_magic_t *temp, /* New rule */ + *current; /* Current rule */ + + + DEBUG_printf(("mimeAddTypeRule(mt=%p(%s/%s), rule=\"%s\")", mt, + mt ? mt->super : "???", mt ? mt->type : "???", rule)); + + /* + * Range check input... + */ + + if (!mt || !rule) + return (-1); + + /* + * Find the last rule in the top-level of the rules tree. + */ + + for (current = mt->rules; current; current = current->next) + if (!current->next) + break; + + /* + * Parse the rules string. Most rules are either a file extension or a + * comparison function: + * + * extension + * function(parameters) + */ + + logic = MIME_MAGIC_NOP; + invert = 0; + + while (*rule != '\0') + { + while (isspace(*rule & 255)) + rule ++; + + if (*rule == '(') + { + DEBUG_puts("1mimeAddTypeRule: New parenthesis group"); + logic = MIME_MAGIC_NOP; + rule ++; + } + else if (*rule == ')') + { + DEBUG_puts("1mimeAddTypeRule: Close paren..."); + if (current == NULL || current->parent == NULL) + return (-1); + + current = current->parent; + + if (current->parent == NULL) + logic = MIME_MAGIC_OR; + else + logic = current->parent->op; + + rule ++; + } + else if (*rule == '+' && current != NULL) + { + if (logic != MIME_MAGIC_AND && + current != NULL && current->prev != NULL) + { + /* + * OK, we have more than 1 rule in the current tree level... Make a + * new group tree and move the previous rule to it... + */ + + if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL) + return (-1); + + temp->op = MIME_MAGIC_AND; + temp->child = current; + temp->parent = current->parent; + current->prev->next = temp; + temp->prev = current->prev; + + current->prev = NULL; + current->parent = temp; + + DEBUG_printf(("1mimeAddTypeRule: Creating new AND group %p.", temp)); + } + else if (current->parent) + { + DEBUG_printf(("1mimeAddTypeRule: Setting group %p op to AND.", + current->parent)); + current->parent->op = MIME_MAGIC_AND; + } + + logic = MIME_MAGIC_AND; + rule ++; + } + else if (*rule == ',') + { + if (logic != MIME_MAGIC_OR && current != NULL) + { + /* + * OK, we have two possibilities; either this is the top-level rule or + * we have a bunch of AND rules at this level. + */ + + if (current->parent == NULL) + { + /* + * This is the top-level rule; we have to move *all* of the AND rules + * down a level, as AND has precedence over OR. + */ + + if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL) + return (-1); + + DEBUG_printf(("1mimeAddTypeRule: Creating new AND group %p inside OR " + "group.", temp)); + + while (current->prev != NULL) + { + current->parent = temp; + current = current->prev; + } + + current->parent = temp; + temp->op = MIME_MAGIC_AND; + temp->child = current; + + mt->rules = current = temp; + } + else + { + /* + * This isn't the top rule, so go up one level... + */ + + DEBUG_puts("1mimeAddTypeRule: Going up one level."); + current = current->parent; + } + } + + logic = MIME_MAGIC_OR; + rule ++; + } + else if (*rule == '!') + { + DEBUG_puts("1mimeAddTypeRule: NOT"); + invert = 1; + rule ++; + } + else if (isalnum(*rule & 255)) + { + /* + * Read an extension name or a function... + */ + + ptr = name; + while (isalnum(*rule & 255) && (ptr - name) < (sizeof(name) - 1)) + *ptr++ = *rule++; + + *ptr = '\0'; + + if (*rule == '(') + { + /* + * Read function parameters... + */ + + rule ++; + for (num_values = 0; + num_values < (sizeof(value) / sizeof(value[0])); + num_values ++) + { + ptr = value[num_values]; + + while ((ptr - value[num_values]) < (sizeof(value[0]) - 1) && + *rule != '\0' && *rule != ',' && *rule != ')') + { + if (isspace(*rule & 255)) + { + /* + * Ignore whitespace... + */ + + rule ++; + continue; + } + else if (*rule == '\"' || *rule == '\'') + { + /* + * Copy quoted strings literally... + */ + + quote = *rule++; + + while (*rule != '\0' && *rule != quote && + (ptr - value[num_values]) < (sizeof(value[0]) - 1)) + *ptr++ = *rule++; + + if (*rule == quote) + rule ++; + else + return (-1); + } + else if (*rule == '<') + { + rule ++; + + while (*rule != '>' && *rule != '\0' && + (ptr - value[num_values]) < (sizeof(value[0]) - 1)) + { + if (isxdigit(rule[0] & 255) && isxdigit(rule[1] & 255)) + { + if (isdigit(*rule)) + *ptr = (*rule++ - '0') << 4; + else + *ptr = (tolower(*rule++) - 'a' + 10) << 4; + + if (isdigit(*rule)) + *ptr++ |= *rule++ - '0'; + else + *ptr++ |= tolower(*rule++) - 'a' + 10; + } + else + return (-1); + } + + if (*rule == '>') + rule ++; + else + return (-1); + } + else + *ptr++ = *rule++; + } + + *ptr = '\0'; + length[num_values] = ptr - value[num_values]; + + if (*rule != ',') + { + num_values ++; + break; + } + + rule ++; + } + + if (*rule != ')') + return (-1); + + rule ++; + + /* + * Figure out the function... + */ + + if (!strcmp(name, "match")) + op = MIME_MAGIC_MATCH; + else if (!strcmp(name, "ascii")) + op = MIME_MAGIC_ASCII; + else if (!strcmp(name, "printable")) + op = MIME_MAGIC_PRINTABLE; + else if (!strcmp(name, "string")) + op = MIME_MAGIC_STRING; + else if (!strcmp(name, "istring")) + op = MIME_MAGIC_ISTRING; + else if (!strcmp(name, "char")) + op = MIME_MAGIC_CHAR; + else if (!strcmp(name, "short")) + op = MIME_MAGIC_SHORT; + else if (!strcmp(name, "int")) + op = MIME_MAGIC_INT; + else if (!strcmp(name, "locale")) + op = MIME_MAGIC_LOCALE; + else if (!strcmp(name, "contains")) + op = MIME_MAGIC_CONTAINS; + else if (!strcmp(name, "priority") && num_values == 1) + { + mt->priority = atoi(value[0]); + continue; + } + else + return (-1); + } + else + { + /* + * This is just a filename match on the extension... + */ + + snprintf(value[0], sizeof(value[0]), "*.%s", name); + length[0] = strlen(value[0]); + op = MIME_MAGIC_MATCH; + } + + /* + * Add a rule for this operation. + */ + + if ((temp = calloc(1, sizeof(mime_magic_t))) == NULL) + return (-1); + + temp->invert = invert; + if (current != NULL) + { + temp->parent = current->parent; + current->next = temp; + } + else + mt->rules = temp; + + temp->prev = current; + + if (logic == MIME_MAGIC_NOP) + { + /* + * Add parenthetical grouping... + */ + + DEBUG_printf(("1mimeAddTypeRule: Making new OR group %p for " + "parenthesis.", temp)); + + temp->op = MIME_MAGIC_OR; + + if ((temp->child = calloc(1, sizeof(mime_magic_t))) == NULL) + return (-1); + + temp->child->parent = temp; + temp->child->invert = temp->invert; + temp->invert = 0; + + temp = temp->child; + logic = MIME_MAGIC_OR; + } + + DEBUG_printf(("1mimeAddTypeRule: Adding %p: %s, op=MIME_MAGIC_%s(%d), " + "logic=MIME_MAGIC_%s, invert=%d.", temp, name, + debug_ops[op], op, debug_ops[logic], invert)); + + /* + * Fill in data for the rule... + */ + + current = temp; + temp->op = op; + invert = 0; + + switch (op) + { + case MIME_MAGIC_MATCH : + if (length[0] > (sizeof(temp->value.matchv) - 1)) + return (-1); + strcpy(temp->value.matchv, value[0]); + break; + case MIME_MAGIC_ASCII : + case MIME_MAGIC_PRINTABLE : + temp->offset = strtol(value[0], NULL, 0); + temp->length = strtol(value[1], NULL, 0); + if (temp->length > MIME_MAX_BUFFER) + temp->length = MIME_MAX_BUFFER; + break; + case MIME_MAGIC_STRING : + case MIME_MAGIC_ISTRING : + temp->offset = strtol(value[0], NULL, 0); + if (length[1] > sizeof(temp->value.stringv)) + return (-1); + temp->length = length[1]; + memcpy(temp->value.stringv, value[1], length[1]); + break; + case MIME_MAGIC_CHAR : + temp->offset = strtol(value[0], NULL, 0); + if (length[1] == 1) + temp->value.charv = value[1][0]; + else + temp->value.charv = (unsigned char)strtol(value[1], NULL, 0); + + DEBUG_printf(("1mimeAddTypeRule: CHAR(%d,0x%02x)", temp->offset, + temp->value.charv)); + break; + case MIME_MAGIC_SHORT : + temp->offset = strtol(value[0], NULL, 0); + temp->value.shortv = (unsigned short)strtol(value[1], NULL, 0); + break; + case MIME_MAGIC_INT : + temp->offset = strtol(value[0], NULL, 0); + temp->value.intv = (unsigned)strtol(value[1], NULL, 0); + break; + case MIME_MAGIC_LOCALE : + if (length[0] > (sizeof(temp->value.localev) - 1)) + return (-1); + + strcpy(temp->value.localev, value[0]); + break; + case MIME_MAGIC_CONTAINS : + temp->offset = strtol(value[0], NULL, 0); + temp->region = strtol(value[1], NULL, 0); + if (length[2] > sizeof(temp->value.stringv)) + return (-1); + temp->length = length[2]; + memcpy(temp->value.stringv, value[2], length[2]); + break; + } + } + else + break; + } + + return (0); +} + + +/* + * 'mimeFileType()' - Determine the type of a file. + */ + +mime_type_t * /* O - Type of file */ +mimeFileType(mime_t *mime, /* I - MIME database */ + const char *pathname, /* I - Name of file to check on disk */ + const char *filename, /* I - Original filename or NULL */ + int *compression) /* O - Is the file compressed? */ +{ + _mime_filebuf_t fb; /* File buffer */ + const char *base; /* Base filename of file */ + mime_type_t *type, /* File type */ + *best; /* Best match */ + + + DEBUG_printf(("mimeFileType(mime=%p, pathname=\"%s\", filename=\"%s\", " + "compression=%p)", mime, pathname, filename, compression)); + + /* + * Range check input parameters... + */ + + if (!mime || !pathname) + { + DEBUG_puts("1mimeFileType: Returning NULL."); + return (NULL); + } + + /* + * Try to open the file... + */ + + if ((fb.fp = cupsFileOpen(pathname, "r")) == NULL) + { + DEBUG_printf(("1mimeFileType: Unable to open \"%s\": %s", pathname, + strerror(errno))); + DEBUG_puts("1mimeFileType: Returning NULL."); + return (NULL); + } + + fb.offset = -1; + fb.length = 0; + + /* + * Figure out the base filename (without directory portion)... + */ + + if (filename) + { + if ((base = strrchr(filename, '/')) != NULL) + base ++; + else + base = filename; + } + else if ((base = strrchr(pathname, '/')) != NULL) + base ++; + else + base = pathname; + + /* + * Then check it against all known types... + */ + + for (type = (mime_type_t *)cupsArrayFirst(mime->types), best = NULL; + type; + type = (mime_type_t *)cupsArrayNext(mime->types)) + if (mime_check_rules(base, &fb, type->rules)) + { + if (!best || type->priority > best->priority) + best = type; + } + + /* + * Finally, close the file and return a match (if any)... + */ + + if (compression) + { + *compression = cupsFileCompression(fb.fp); + DEBUG_printf(("1mimeFileType: *compression=%d", *compression)); + } + + cupsFileClose(fb.fp); + + DEBUG_printf(("1mimeFileType: Returning %p(%s/%s).", best, + best ? best->super : "???", best ? best->type : "???")); + return (best); +} + + +/* + * 'mimeType()' - Lookup a file type. + */ + +mime_type_t * /* O - Matching file type definition */ +mimeType(mime_t *mime, /* I - MIME database */ + const char *super, /* I - Super-type name */ + const char *type) /* I - Type name */ +{ + mime_type_t key, /* MIME type search key */ + *mt; /* Matching type */ + + + DEBUG_printf(("mimeType(mime=%p, super=\"%s\", type=\"%s\")", mime, super, + type)); + + /* + * Range check input... + */ + + if (!mime || !super || !type) + { + DEBUG_puts("1mimeType: Returning NULL."); + return (NULL); + } + + /* + * Lookup the type in the array... + */ + + strlcpy(key.super, super, sizeof(key.super)); + strlcpy(key.type, type, sizeof(key.type)); + + mt = (mime_type_t *)cupsArrayFind(mime->types, &key); + DEBUG_printf(("1mimeType: Returning %p.", mt)); + return (mt); +} + + +/* + * 'mime_compare_types()' - Compare two MIME super/type names. + */ + +static int /* O - Result of comparison */ +mime_compare_types(mime_type_t *t0, /* I - First type */ + mime_type_t *t1) /* I - Second type */ +{ + int i; /* Result of comparison */ + + + if ((i = _cups_strcasecmp(t0->super, t1->super)) == 0) + i = _cups_strcasecmp(t0->type, t1->type); + + return (i); +} + + +/* + * 'mime_check_rules()' - Check each rule in a list. + */ + +static int /* O - 1 if match, 0 if no match */ +mime_check_rules( + const char *filename, /* I - Filename */ + _mime_filebuf_t *fb, /* I - File to check */ + mime_magic_t *rules) /* I - Rules to check */ +{ + int n; /* Looping var */ + int region; /* Region to look at */ + int logic, /* Logic to apply */ + result, /* Result of test */ + intv; /* Integer value */ + short shortv; /* Short value */ + unsigned char *bufptr; /* Pointer into buffer */ + + + DEBUG_printf(("4mime_check_rules(filename=\"%s\", fb=%p, rules=%p)", filename, + fb, rules)); + + if (rules == NULL) + return (0); + + if (rules->parent == NULL) + logic = MIME_MAGIC_OR; + else + logic = rules->parent->op; + + result = 0; + + while (rules != NULL) + { + /* + * Compute the result of this rule... + */ + + switch (rules->op) + { + case MIME_MAGIC_MATCH : + result = mime_patmatch(filename, rules->value.matchv); + break; + + case MIME_MAGIC_ASCII : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->length) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Test for ASCII printable characters plus standard control chars. + */ + + if ((rules->offset + rules->length) > (fb->offset + fb->length)) + n = fb->offset + fb->length - rules->offset; + else + n = rules->length; + + bufptr = fb->buffer + rules->offset - fb->offset; + while (n > 0) + if ((*bufptr >= 32 && *bufptr <= 126) || + (*bufptr >= 8 && *bufptr <= 13) || + *bufptr == 26 || *bufptr == 27) + { + n --; + bufptr ++; + } + else + break; + + result = (n == 0); + break; + + case MIME_MAGIC_PRINTABLE : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->length) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Test for 8-bit printable characters plus standard control chars. + */ + + if ((rules->offset + rules->length) > (fb->offset + fb->length)) + n = fb->offset + fb->length - rules->offset; + else + n = rules->length; + + bufptr = fb->buffer + rules->offset - fb->offset; + + while (n > 0) + if (*bufptr >= 128 || + (*bufptr >= 32 && *bufptr <= 126) || + (*bufptr >= 8 && *bufptr <= 13) || + *bufptr == 26 || *bufptr == 27) + { + n --; + bufptr ++; + } + else + break; + + result = (n == 0); + break; + + case MIME_MAGIC_STRING : + DEBUG_printf(("5mime_check_rules: string(%d, \"%s\")", rules->offset, + rules->value.stringv)); + + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->length) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + + DEBUG_printf(("5mime_check_rules: loaded %d byte fb->buffer at %d, starts " + "with \"%c%c%c%c\".", + fb->length, fb->offset, fb->buffer[0], fb->buffer[1], + fb->buffer[2], fb->buffer[3])); + } + + /* + * Compare the buffer against the string. If the file is too + * short then don't compare - it can't match... + */ + + if ((rules->offset + rules->length) > (fb->offset + fb->length)) + result = 0; + else + result = (memcmp(fb->buffer + rules->offset - fb->offset, + rules->value.stringv, rules->length) == 0); + DEBUG_printf(("5mime_check_rules: result=%d", result)); + break; + + case MIME_MAGIC_ISTRING : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->length) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Compare the buffer against the string. If the file is too + * short then don't compare - it can't match... + */ + + if ((rules->offset + rules->length) > (fb->offset + fb->length)) + result = 0; + else + result = (_cups_strncasecmp((char *)fb->buffer + rules->offset - + fb->offset, + rules->value.stringv, rules->length) == 0); + break; + + case MIME_MAGIC_CHAR : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Compare the character values; if the file is too short, it + * can't match... + */ + + if (fb->length < 1) + result = 0; + else + result = (fb->buffer[rules->offset - fb->offset] == + rules->value.charv); + break; + + case MIME_MAGIC_SHORT : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + 2) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Compare the short values; if the file is too short, it + * can't match... + */ + + if (fb->length < 2) + result = 0; + else + { + bufptr = fb->buffer + rules->offset - fb->offset; + shortv = (bufptr[0] << 8) | bufptr[1]; + result = (shortv == rules->value.shortv); + } + break; + + case MIME_MAGIC_INT : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + 4) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Compare the int values; if the file is too short, it + * can't match... + */ + + if (fb->length < 4) + result = 0; + else + { + bufptr = fb->buffer + rules->offset - fb->offset; + intv = (((((bufptr[0] << 8) | bufptr[1]) << 8) | + bufptr[2]) << 8) | bufptr[3]; + result = (intv == rules->value.intv); + } + break; + + case MIME_MAGIC_LOCALE : +#if defined(WIN32) || defined(__EMX__) || defined(__APPLE__) + result = (strcmp(rules->value.localev, + setlocale(LC_ALL, "")) == 0); +#else + result = (strcmp(rules->value.localev, + setlocale(LC_MESSAGES, "")) == 0); +#endif /* __APPLE__ */ + break; + + case MIME_MAGIC_CONTAINS : + /* + * Load the buffer if necessary... + */ + + if (fb->offset < 0 || rules->offset < fb->offset || + (rules->offset + rules->region) > (fb->offset + fb->length)) + { + /* + * Reload file buffer... + */ + + cupsFileSeek(fb->fp, rules->offset); + fb->length = cupsFileRead(fb->fp, (char *)fb->buffer, + sizeof(fb->buffer)); + fb->offset = rules->offset; + } + + /* + * Compare the buffer against the string. If the file is too + * short then don't compare - it can't match... + */ + + if ((rules->offset + rules->length) > (fb->offset + fb->length)) + result = 0; + else + { + if (fb->length > rules->region) + region = rules->region - rules->length; + else + region = fb->length - rules->length; + + for (n = 0; n < region; n ++) + if ((result = (memcmp(fb->buffer + rules->offset - fb->offset + n, + rules->value.stringv, + rules->length) == 0)) != 0) + break; + } + break; + + default : + if (rules->child != NULL) + result = mime_check_rules(filename, fb, rules->child); + else + result = 0; + break; + } + + /* + * If the logic is inverted, invert the result... + */ + + if (rules->invert) + result = !result; + + /* + * OK, now if the current logic is OR and this result is true, the this + * rule set is true. If the current logic is AND and this result is false, + * the the rule set is false... + */ + + DEBUG_printf(("5mime_check_rules: result of test %p (MIME_MAGIC_%s) is %d", + rules, debug_ops[rules->op], result)); + + if ((result && logic == MIME_MAGIC_OR) || + (!result && logic == MIME_MAGIC_AND)) + return (result); + + /* + * Otherwise the jury is still out on this one, so move to the next rule. + */ + + rules = rules->next; + } + + return (result); +} + + +/* + * 'mime_patmatch()' - Pattern matching. + */ + +static int /* O - 1 if match, 0 if no match */ +mime_patmatch(const char *s, /* I - String to match against */ + const char *pat) /* I - Pattern to match against */ +{ + /* + * Range check the input... + */ + + if (s == NULL || pat == NULL) + return (0); + + /* + * Loop through the pattern and match strings, and stop if we come to a + * point where the strings don't match or we find a complete match. + */ + + while (*s != '\0' && *pat != '\0') + { + if (*pat == '*') + { + /* + * Wildcard - 0 or more characters... + */ + + pat ++; + if (*pat == '\0') + return (1); /* Last pattern char is *, so everything matches... */ + + /* + * Test all remaining combinations until we get to the end of the string. + */ + + while (*s != '\0') + { + if (mime_patmatch(s, pat)) + return (1); + + s ++; + } + } + else if (*pat == '?') + { + /* + * Wildcard - 1 character... + */ + + pat ++; + s ++; + continue; + } + else if (*pat == '[') + { + /* + * Match a character from the input set [chars]... + */ + + pat ++; + while (*pat != ']' && *pat != '\0') + if (*s == *pat) + break; + else + pat ++; + + if (*pat == ']' || *pat == '\0') + return (0); + + while (*pat != ']' && *pat != '\0') + pat ++; + + if (*pat == ']') + pat ++; + + continue; + } + else if (*pat == '\\') + { + /* + * Handle quoted characters... + */ + + pat ++; + } + + /* + * Stop if the pattern and string don't match... + */ + + if (*pat++ != *s++) + return (0); + } + + /* + * Done parsing the pattern and string; return 1 if the last character + * matches and 0 otherwise... + */ + + return (*s == *pat); +} + + +/* + * End of "$Id: type.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/util.c b/scheduler/util.c new file mode 100644 index 0000000..9bc8077 --- /dev/null +++ b/scheduler/util.c @@ -0,0 +1,471 @@ +/* + * "$Id: util.c 9793 2011-05-20 03:49:49Z mike $" + * + * Mini-daemon utility functions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cupsdCompareNames() - Compare two names. + * cupsdCreateStringsArray() - Create a CUPS array of strings. + * cupsdExec() - Run a program with the correct environment. + * cupsdPipeCommand() - Read output from a command. + * cupsdSendIPPGroup() - Send a group tag. + * cupsdSendIPPHeader() - Send the IPP response header. + * cupsdSendIPPInteger() - Send an integer attribute. + * cupsdSendIPPString() - Send a string attribute. + * cupsdSendIPPTrailer() - Send the end-of-message tag. + */ + +/* + * Include necessary headers... + */ + +#include "util.h" +#include +#include +#include +#ifdef __APPLE__ +# include +extern char **environ; +#endif /* __APPLE__ */ + + +/* + * 'cupsdCompareNames()' - Compare two names. + * + * This function basically does a _cups_strcasecmp() of the two strings, + * but is also aware of numbers so that "a2" < "a100". + */ + +int /* O - Result of comparison */ +cupsdCompareNames(const char *s, /* I - First string */ + const char *t) /* I - Second string */ +{ + int diff, /* Difference between digits */ + digits; /* Number of digits */ + + + /* + * Loop through both names, returning only when a difference is + * seen. Also, compare whole numbers rather than just characters, too! + */ + + while (*s && *t) + { + if (isdigit(*s & 255) && isdigit(*t & 255)) + { + /* + * Got a number; start by skipping leading 0's... + */ + + while (*s == '0') + s ++; + while (*t == '0') + t ++; + + /* + * Skip equal digits... + */ + + while (isdigit(*s & 255) && *s == *t) + { + s ++; + t ++; + } + + /* + * Bounce out if *s and *t aren't both digits... + */ + + if (isdigit(*s & 255) && !isdigit(*t & 255)) + return (1); + else if (!isdigit(*s & 255) && isdigit(*t & 255)) + return (-1); + else if (!isdigit(*s & 255) || !isdigit(*t & 255)) + continue; + + if (*s < *t) + diff = -1; + else + diff = 1; + + /* + * Figure out how many more digits there are... + */ + + digits = 0; + s ++; + t ++; + + while (isdigit(*s & 255)) + { + digits ++; + s ++; + } + + while (isdigit(*t & 255)) + { + digits --; + t ++; + } + + /* + * Return if the number or value of the digits is different... + */ + + if (digits < 0) + return (-1); + else if (digits > 0) + return (1); + else if (diff) + return (diff); + } + else if (tolower(*s) < tolower(*t)) + return (-1); + else if (tolower(*s) > tolower(*t)) + return (1); + else + { + s ++; + t ++; + } + } + + /* + * Return the results of the final comparison... + */ + + if (*s) + return (1); + else if (*t) + return (-1); + else + return (0); +} + + +/* + * 'cupsdCreateStringsArray()' - Create a CUPS array of strings. + */ + +cups_array_t * /* O - CUPS array */ +cupsdCreateStringsArray(const char *s) /* I - Comma-delimited strings */ +{ + if (!s || !*s) + return (NULL); + else + return (_cupsArrayNewStrings(s)); +} + + +/* + * 'cupsdExec()' - Run a program with the correct environment. + * + * On Mac OS X, we need to update the CFProcessPath environment variable that + * is passed in the environment so the child can access its bundled resources. + */ + +int /* O - exec() status */ +cupsdExec(const char *command, /* I - Full path to program */ + char **argv) /* I - Command-line arguments */ +{ +#ifdef __APPLE__ + int i, j; /* Looping vars */ + char *envp[500], /* Array of environment variables */ + cfprocesspath[1024], /* CFProcessPath environment variable */ + linkpath[1024]; /* Link path for symlinks... */ + int linkbytes; /* Bytes for link path */ + + + /* + * Some Mac OS X programs are bundled and need the CFProcessPath environment + * variable defined. If the command is a symlink, resolve the link and point + * to the resolved location, otherwise, use the command path itself. + */ + + if ((linkbytes = readlink(command, linkpath, sizeof(linkpath) - 1)) > 0) + { + /* + * Yes, this is a symlink to the actual program, nul-terminate and + * use it... + */ + + linkpath[linkbytes] = '\0'; + + if (linkpath[0] == '/') + snprintf(cfprocesspath, sizeof(cfprocesspath), "CFProcessPath=%s", + linkpath); + else + snprintf(cfprocesspath, sizeof(cfprocesspath), "CFProcessPath=%s/%s", + dirname((char *)command), linkpath); + } + else + snprintf(cfprocesspath, sizeof(cfprocesspath), "CFProcessPath=%s", command); + + envp[0] = cfprocesspath; + + /* + * Copy the rest of the environment except for any CFProcessPath that may + * already be there... + */ + + for (i = 1, j = 0; + environ[j] && i < (int)(sizeof(envp) / sizeof(envp[0]) - 1); + j ++) + if (strncmp(environ[j], "CFProcessPath=", 14)) + envp[i ++] = environ[j]; + + envp[i] = NULL; + + /* + * Use execve() to run the program... + */ + + return (execve(command, argv, envp)); + +#else + /* + * On other operating systems, just call execv() to use the same environment + * variables as the parent... + */ + + return (execv(command, argv)); +#endif /* __APPLE__ */ +} + + +/* + * 'cupsdPipeCommand()' - Read output from a command. + */ + +cups_file_t * /* O - CUPS file or NULL on error */ +cupsdPipeCommand(int *pid, /* O - Process ID or 0 on error */ + const char *command, /* I - Command to run */ + char **argv, /* I - Arguments to pass to command */ + int user) /* I - User to run as or 0 for current */ +{ + int fd, /* Temporary file descriptor */ + fds[2]; /* Pipe file descriptors */ + + + /* + * First create the pipe... + */ + + if (pipe(fds)) + { + *pid = 0; + return (NULL); + } + + /* + * Set the "close on exec" flag on each end of the pipe... + */ + + if (fcntl(fds[0], F_SETFD, fcntl(fds[0], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + *pid = 0; + + return (NULL); + } + + if (fcntl(fds[1], F_SETFD, fcntl(fds[1], F_GETFD) | FD_CLOEXEC)) + { + close(fds[0]); + close(fds[1]); + + *pid = 0; + + return (NULL); + } + + /* + * Then run the command... + */ + + if ((*pid = fork()) < 0) + { + /* + * Unable to fork! + */ + + *pid = 0; + close(fds[0]); + close(fds[1]); + + return (NULL); + } + else if (!*pid) + { + /* + * Child comes here... + */ + + if (!getuid() && user) + setuid(user); /* Run as restricted user */ + + if ((fd = open("/dev/null", O_RDONLY)) > 0) + { + dup2(fd, 0); /* pipe */ + close(fds[1]); + + cupsdExec(command, argv); + exit(errno); + } + + /* + * Parent comes here, open the input side of the pipe... + */ + + close(fds[1]); + + return (cupsFileOpenFd(fds[0], "r")); +} + + +/* + * 'cupsdSendIPPGroup()' - Send a group tag. + */ + +void +cupsdSendIPPGroup(ipp_tag_t group_tag) /* I - Group tag */ +{ + /* + * Send IPP group tag (1 byte)... + */ + + putchar(group_tag); +} + + +/* + * 'cupsdSendIPPHeader()' - Send the IPP response header. + */ + +void +cupsdSendIPPHeader( + ipp_status_t status_code, /* I - Status code */ + int request_id) /* I - Request ID */ +{ + /* + * Send IPP/1.1 response header: version number (2 bytes), status code + * (2 bytes), and request ID (4 bytes)... + * + * TODO: Add version number (IPP/2.x and IPP/1.0) support. + */ + + putchar(1); + putchar(1); + + putchar(status_code >> 8); + putchar(status_code); + + putchar(request_id >> 24); + putchar(request_id >> 16); + putchar(request_id >> 8); + putchar(request_id); +} + + +/* + * 'cupsdSendIPPInteger()' - Send an integer attribute. + */ + +void +cupsdSendIPPInteger( + ipp_tag_t value_tag, /* I - Value tag */ + const char *name, /* I - Attribute name */ + int value) /* I - Attribute value */ +{ + size_t len; /* Length of attribute name */ + + + /* + * Send IPP integer value: value tag (1 byte), name length (2 bytes), + * name string (without nul), value length (2 bytes), and value (4 bytes)... + */ + + putchar(value_tag); + + len = strlen(name); + putchar(len >> 8); + putchar(len); + + fputs(name, stdout); + + putchar(0); + putchar(4); + + putchar(value >> 24); + putchar(value >> 16); + putchar(value >> 8); + putchar(value); +} + + +/* + * 'cupsdSendIPPString()' - Send a string attribute. + */ + +void +cupsdSendIPPString( + ipp_tag_t value_tag, /* I - Value tag */ + const char *name, /* I - Attribute name */ + const char *value) /* I - Attribute value */ +{ + size_t len; /* Length of attribute name */ + + + /* + * Send IPP string value: value tag (1 byte), name length (2 bytes), + * name string (without nul), value length (2 bytes), and value string + * (without nul)... + */ + + putchar(value_tag); + + len = strlen(name); + putchar(len >> 8); + putchar(len); + + fputs(name, stdout); + + len = strlen(value); + putchar(len >> 8); + putchar(len); + + fputs(value, stdout); +} + + +/* + * 'cupsdSendIPPTrailer()' - Send the end-of-message tag. + */ + +void +cupsdSendIPPTrailer(void) +{ + putchar(IPP_TAG_END); + fflush(stdout); +} + + +/* + * End of "$Id: util.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/scheduler/util.h b/scheduler/util.h new file mode 100644 index 0000000..0080914 --- /dev/null +++ b/scheduler/util.h @@ -0,0 +1,71 @@ +/* + * "$Id: util.h 9755 2011-05-09 22:53:31Z mike $" + * + * Mini-daemon utility definitions for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2005 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPSD_UTIL_H_ +# define _CUPSD_UTIL_H_ + +/* + * Include necessary headers... + */ + +# include +# include +# include + + +/* + * C++ magic... + */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + + +/* + * Types... + */ + +typedef int (*cupsd_compare_func_t)(const void *, const void *); + + +/* + * Prototypes... + */ + +extern int cupsdCompareNames(const char *s, const char *t); +extern cups_array_t *cupsdCreateStringsArray(const char *s); +extern int cupsdExec(const char *command, char **argv); +extern cups_file_t *cupsdPipeCommand(int *pid, const char *command, + char **argv, int user); +extern void cupsdSendIPPGroup(ipp_tag_t group_tag); +extern void cupsdSendIPPHeader(ipp_status_t status_code, + int request_id); +extern void cupsdSendIPPInteger(ipp_tag_t value_tag, + const char *name, int value); +extern void cupsdSendIPPString(ipp_tag_t value_tag, + const char *name, const char *value); +extern void cupsdSendIPPTrailer(void); + + +# ifdef __cplusplus +} +# endif /* __cplusplus */ + +#endif /* !_CUPSD_UTIL_H_ */ + +/* + * End of "$Id: util.h 9755 2011-05-09 22:53:31Z mike $". + */ diff --git a/scripting/perl/CUPS.pm b/scripting/perl/CUPS.pm new file mode 100644 index 0000000..5f2ed5f --- /dev/null +++ b/scripting/perl/CUPS.pm @@ -0,0 +1,144 @@ +package CUPS; + +use 5.006; +use strict; +use warnings; +use Carp; + +require Exporter; +require DynaLoader; +use AutoLoader; + +our @ISA = qw(Exporter DynaLoader); + +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. + +# This allows declaration use CUPS ':all'; +# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK +# will save memory. +our %EXPORT_TAGS = ( 'all' => [ qw( + CUPS_DATE_ANY + CUPS_VERSION + HTTP_MAX_BUFFER + HTTP_MAX_HOST + HTTP_MAX_URI + HTTP_MAX_VALUE + IPP_MAX_NAME + IPP_MAX_VALUES + IPP_PORT + PPD_MAX_LINE + PPD_MAX_NAME + PPD_MAX_TEXT + PPD_VERSION +) ] ); + +our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); + +our @EXPORT = qw( + CUPS_DATE_ANY + CUPS_VERSION + HTTP_MAX_BUFFER + HTTP_MAX_HOST + HTTP_MAX_URI + HTTP_MAX_VALUE + IPP_MAX_NAME + IPP_MAX_VALUES + IPP_PORT + PPD_MAX_LINE + PPD_MAX_NAME + PPD_MAX_TEXT + PPD_VERSION +); +our $VERSION = '1.2'; + +sub AUTOLOAD { + # This AUTOLOAD is used to 'autoload' constants from the constant() + # XS function. If a constant is not found then control is passed + # to the AUTOLOAD in AutoLoader. + + my $constname; + our $AUTOLOAD; + ($constname = $AUTOLOAD) =~ s/.*:://; + croak "& not defined" if $constname eq 'constant'; + my $val = constant($constname, @_ ? $_[0] : 0); + if ($! != 0) { + if ($! =~ /Invalid/ || $!{EINVAL}) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } + else { + croak "Your vendor has not defined CUPS macro $constname"; + } + } + { + no strict 'refs'; + # Fixed between 5.005_53 and 5.005_61 + if ($] >= 5.00561) { + *$AUTOLOAD = sub () { $val }; + } + else { + *$AUTOLOAD = sub { $val }; + } + } + goto &$AUTOLOAD; +} + +bootstrap CUPS $VERSION; + +# Preloaded methods go here. + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ +# Below is stub documentation for your module. You better edit it! + +=head1 NAME + +CUPS - Perl extension for blah blah blah + +=head1 SYNOPSIS + + use CUPS; + blah blah blah + +=head1 DESCRIPTION + +Stub documentation for CUPS, created by h2xs. It looks like the +author of the extension was negligent enough to leave the stub +unedited. + +Blah blah blah. + +=head2 EXPORT + +None by default. + +=head2 Exportable constants + + CUPS_DATE_ANY + CUPS_VERSION + HTTP_MAX_BUFFER + HTTP_MAX_HOST + HTTP_MAX_URI + HTTP_MAX_VALUE + IPP_MAX_NAME + IPP_MAX_VALUES + IPP_PORT + PPD_MAX_LINE + PPD_MAX_NAME + PPD_MAX_TEXT + PPD_VERSION + + +=head1 AUTHOR + +A. U. Thor, Ea.u.thor@a.galaxy.far.far.awayE + +=head1 SEE ALSO + +L. + +=cut diff --git a/scripting/perl/CUPS.xs b/scripting/perl/CUPS.xs new file mode 100644 index 0000000..efaf6dc --- /dev/null +++ b/scripting/perl/CUPS.xs @@ -0,0 +1,270 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include +#include +#include +#include +#include + +static int +not_here(char *s) +{ + croak("%s not implemented on this architecture", s); + return -1; +} + +static double +constant_PPD_M(char *name, int len, int arg) +{ + if (5 + 3 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[5 + 3]) { + case 'L': + if (strEQ(name + 5, "AX_LINE")) { /* PPD_M removed */ +#ifdef PPD_MAX_LINE + return PPD_MAX_LINE; +#else + goto not_there; +#endif + } + case 'N': + if (strEQ(name + 5, "AX_NAME")) { /* PPD_M removed */ +#ifdef PPD_MAX_NAME + return PPD_MAX_NAME; +#else + goto not_there; +#endif + } + case 'T': + if (strEQ(name + 5, "AX_TEXT")) { /* PPD_M removed */ +#ifdef PPD_MAX_TEXT + return PPD_MAX_TEXT; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant_P(char *name, int len, int arg) +{ + if (1 + 3 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[1 + 3]) { + case 'M': + if (!strnEQ(name + 1,"PD_", 3)) + break; + return constant_PPD_M(name, len, arg); + case 'V': + if (strEQ(name + 1, "PD_VERSION")) { /* P removed */ +#ifdef PPD_VERSION + return PPD_VERSION; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant_H(char *name, int len, int arg) +{ + if (1 + 8 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[1 + 8]) { + case 'B': + if (strEQ(name + 1, "TTP_MAX_BUFFER")) { /* H removed */ +#ifdef HTTP_MAX_BUFFER + return HTTP_MAX_BUFFER; +#else + goto not_there; +#endif + } + case 'H': + if (strEQ(name + 1, "TTP_MAX_HOST")) { /* H removed */ +#ifdef HTTP_MAX_HOST + return HTTP_MAX_HOST; +#else + goto not_there; +#endif + } + case 'U': + if (strEQ(name + 1, "TTP_MAX_URI")) { /* H removed */ +#ifdef HTTP_MAX_URI + return HTTP_MAX_URI; +#else + goto not_there; +#endif + } + case 'V': + if (strEQ(name + 1, "TTP_MAX_VALUE")) { /* H removed */ +#ifdef HTTP_MAX_VALUE + return HTTP_MAX_VALUE; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant_IPP_M(char *name, int len, int arg) +{ + if (5 + 3 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[5 + 3]) { + case 'N': + if (strEQ(name + 5, "AX_NAME")) { /* IPP_M removed */ +#ifdef IPP_MAX_NAME + return IPP_MAX_NAME; +#else + goto not_there; +#endif + } + case 'V': + if (strEQ(name + 5, "AX_VALUES")) { /* IPP_M removed */ +#ifdef IPP_MAX_VALUES + return IPP_MAX_VALUES; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant_I(char *name, int len, int arg) +{ + if (1 + 3 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[1 + 3]) { + case 'M': + if (!strnEQ(name + 1,"PP_", 3)) + break; + return constant_IPP_M(name, len, arg); + case 'P': + if (strEQ(name + 1, "PP_PORT")) { /* I removed */ +#ifdef IPP_PORT + return IPP_PORT; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant_C(char *name, int len, int arg) +{ + if (1 + 4 >= len ) { + errno = EINVAL; + return 0; + } + switch (name[1 + 4]) { + case 'D': + if (strEQ(name + 1, "UPS_DATE_ANY")) { /* C removed */ +#ifdef CUPS_DATE_ANY + return CUPS_DATE_ANY; +#else + goto not_there; +#endif + } + case 'V': + if (strEQ(name + 1, "UPS_VERSION")) { /* C removed */ +#ifdef CUPS_VERSION + return CUPS_VERSION; +#else + goto not_there; +#endif + } + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + +static double +constant(char *name, int len, int arg) +{ + errno = 0; + switch (name[0 + 0]) { + case 'C': + return constant_C(name, len, arg); + case 'H': + return constant_H(name, len, arg); + case 'I': + return constant_I(name, len, arg); + case 'P': + return constant_P(name, len, arg); + } + errno = EINVAL; + return 0; + +not_there: + errno = ENOENT; + return 0; +} + + +MODULE = CUPS PACKAGE = CUPS + + +double +constant(sv,arg) + PREINIT: + STRLEN len; + INPUT: + SV * sv + char * s = SvPV(sv, len); + int arg + CODE: + RETVAL = constant(s,len,arg); + OUTPUT: + RETVAL + diff --git a/scripting/perl/Makefile.PL b/scripting/perl/Makefile.PL new file mode 100644 index 0000000..f5e4bdd --- /dev/null +++ b/scripting/perl/Makefile.PL @@ -0,0 +1,17 @@ +use ExtUtils::MakeMaker; +# See lib/ExtUtils/MakeMaker.pm for details of how to influence +# the contents of the Makefile that is written. +WriteMakefile( + 'NAME' => 'CUPS', + 'VERSION_FROM' => 'CUPS.pm', # finds $VERSION + 'PREREQ_PM' => {}, # e.g., Module::Name => 1.1 + ($] >= 5.005 ? ## Add these new keywords supported since 5.005 + (ABSTRACT_FROM => 'CUPS.pm', # retrieve abstract from module + AUTHOR => 'A. U. Thor ') : ()), + 'LIBS' => ['-lcups '], # e.g., '-lm' + 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' + # Insert -I. if you add *.h files later: + 'INC' => '', # e.g., '-I/usr/include/other' + # Un-comment this if you add C files to link with later: + # 'OBJECT' => '$(O_FILES)', # link all the C files too +); diff --git a/scripting/perl/README b/scripting/perl/README new file mode 100644 index 0000000..1605c77 --- /dev/null +++ b/scripting/perl/README @@ -0,0 +1,35 @@ +CUPS version 1.2 +================ + +The README is used to introduce the module and provide instructions on +how to install the module, any machine dependencies it may have (for +example C compilers and installed libraries) and any other information +that should be provided before the module is installed. + +A README file is required for CPAN modules since CPAN extracts the +README file from a module distribution so that people browsing the +archive can use it get an idea of the modules uses. It is usually a +good idea to provide version information here so that people can +decide whether fixes for the module are worth downloading. + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires these other modules and libraries: + + blah blah blah + +COPYRIGHT AND LICENCE + +Put the correct copyright and licence information here. + +Copyright (C) 2002 A. U. Thor blah blah blah + diff --git a/scripting/perl/test.pl b/scripting/perl/test.pl new file mode 100644 index 0000000..acf3191 --- /dev/null +++ b/scripting/perl/test.pl @@ -0,0 +1,17 @@ +# Before `make install' is performed this script should be runnable with +# `make test'. After `make install' it should work as `perl test.pl' + +######################### + +# change 'tests => 1' to 'tests => last_test_to_print'; + +use Test; +BEGIN { plan tests => 1 }; +use CUPS; +ok(1); # If we made it this far, we're ok. + +######################### + +# Insert your test code below, the Test module is use()ed here so read +# its man page ( perldoc Test ) for help writing this test script. + diff --git a/scripting/php/Dependencies b/scripting/php/Dependencies new file mode 100644 index 0000000..d48a560 --- /dev/null +++ b/scripting/php/Dependencies @@ -0,0 +1,7 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +phpcups.o: ../../cups/string-private.h ../../config.h phpcups.h +phpcups.o: ../../cups/cups.h ../../cups/file.h ../../cups/versioning.h +phpcups.o: ../../cups/ipp.h ../../cups/http.h ../../cups/array.h +phpcups.o: ../../cups/language.h ../../cups/language.h +phpcups.o: ../../cups/debug-private.h ../../cups/versioning.h diff --git a/scripting/php/Makefile b/scripting/php/Makefile new file mode 100644 index 0000000..a10f4f4 --- /dev/null +++ b/scripting/php/Makefile @@ -0,0 +1,153 @@ +# +# "$Id: Makefile 3572 2003-04-08 19:56:25Z mike $" +# +# PHP Makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2007 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../../Makedefs + + +# +# Where to install and how to compile the PHP module... +# + +PHPDIR = $(BUILDROOT)`$(PHPCONFIG) --extension-dir` +OPTIONS = $(PHPOPTIONS) + + +# +# Object files... +# + +OBJS = phpcups.o + + +# +# Targets in this directory... +# + +PHPCUPS = phpcups.so + + +# +# Make all targets... +# + +all: $(PHPCUPS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Remove object and target files... +# + +clean: + $(RM) $(OBJS) $(PHPCUPS) + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I../.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + echo Installing $(PHPCUPS) in $(PHPDIR) + $(INSTALL_DIR) $(PHPDIR) + $(INSTALL_LIB) $(PHPCUPS) $(PHPDIR) + if test "x$(SYMROOT)" != x; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp $(PHPCUPS) $(SYMROOT); \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall object and target files... +# + +uninstall: + $(RM) $(PHPDIR)/$(PHPCUPS) + -$(RMDIR) $(PHPDIR) + + +# +# phpcups.so +# + +phpcups.so: $(OBJS) ../../Makedefs + echo Linking $@... + if test `uname` = Darwin; then \ + DSOFLAGS="-bundle -flat_namespace -undefined suppress $(RC_CFLAGS)"; \ + else \ + DSOFLAGS="$(DSOFLAGS)"; \ + fi; \ + echo $(DSO) $$DSOFLAGS $(ARCHFLAGS) -o $@ $(OBJS) -L../../cups $(LIBS); \ + $(DSO) $$DSOFLAGS $(ARCHFLAGS) -o $@ $(OBJS) -L../../cups $(LIBS) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 3572 2003-04-08 19:56:25Z mike $". +# diff --git a/scripting/php/README b/scripting/php/README new file mode 100644 index 0000000..e4ab27d --- /dev/null +++ b/scripting/php/README @@ -0,0 +1,157 @@ +README - 02/25/2006 +------------------- + +INTRODUCTION + + This directory contains a dynamically loadable CUPS extension + module for PHP 4 and 5. The CUPS 1.2 module has been + substantially updated to provide an API more consistent with + the C API and is NOT compatible with the CUPS 1.1 module. + + +COMPILING AND INSTALLING + + Run "make" to compile the PHP CUPS extension: + + make + + To install it, type: + + make install + + +RESOURCES AND SUPPORT + + Questions should be reported to the CUPS newsgroups/mailing + lists at: + + http://www.cups.org/newsgroups.php + + Bug reports and enhancement requests can be submitted via the + form at: + + http://www.cups.org/str.php + + +QUICK REFERENCE DOCUMENTATION + + In lieu of actual documentation, the following definitions + can be used as a quick reference to the supported functions: + + + CUPS_CANCEL_JOB + + Cancels a job on the named destination: + + bool cups_cancel_job(string dest, int id) + + The return value is TRUE on success and FALSE on failure. + + Example: + + if (!cups_cancel_job("myprinter", 123)) + print("Unable to cancel job: " . cups_last_error_string() . "\n"); + + + CUPS_GET_DESTS + + Gets a list of available destinations: + + array cups_get_dests() + + The return value is an array of objects with the following + properties: + + name The name of the printer or class + instance The instance of the printer or class + is_default TRUE if the printer or class is the default destination + options Associative array of options and their values + + Example: + + $dest = cups_get_dests(); + + + CUPS_GET_JOBS + + Gets a list of jobs: + + array cups_get_jobs(string dest, bool myjobs, int completed) + + The "dest" string can be blank for jobs on all destinations. + Pass TRUE for "myjobs" to only get jobs for the current user. + The "completed" argument can be 0 for pending jobs, 1 for + completed jobs, and -1 for all jobs. + + The return value is an array of objects with the following + properties: + + id The job ID + dest Printer or class name + title Title/job name + user User the submitted the job + format Document format + state Job state + size Size in kilobytes + priority Priority (1-100) + completed_time Time the job was completed + creation_time Time the job was created + processing_time Time the job was processed + + Example: + + $jobs = cups_get_jobs("", FALSE, -1); + + + CUPS_LAST_ERROR + + Returns the IPP status code for the most recent request: + + int cups_last_error() + + Example: + + $error = cups_last_error(); + + + CUPS_LAST_ERROR_STRING + + Returns the IPP status-message string for the most recent request: + + string cups_last_error_string() + + Example: + + $message = cups_last_error_string(); + + + CUPS_PRINT_FILE + + Prints a single file to a printer or class: + + int cups_print_file(string dest, string filename, string title, + array options) + + The return value is the job ID or 0 if there was an error. + + Example: + + $options = array("name" => "value", "name2" => "value2"); + $id = cups_print_file("dest", "filename", "title", $options); + + + CUPS_PRINT_FILES + + Prints one or more files to a printer or class: + + int cups_print_files(string dest, array files, string title, + array options); + + The return value is the job ID or 0 if there was an error. + + Example: + + $files = array("file1", "file2", "file3"); + $options = array("name" => "value", "name2" => "value2"); + $id = cups_print_file("dest", $files, "title", $options); + diff --git a/scripting/php/phpcups.c b/scripting/php/phpcups.c new file mode 100644 index 0000000..dbd1f26 --- /dev/null +++ b/scripting/php/phpcups.c @@ -0,0 +1,487 @@ +/* + * "$Id: phpcups.c 10197 2012-01-27 16:34:04Z mike $" + * + * Printing utilities for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * cups_convert_options() - Convert a PHP options array to a CUPS options array. + * zm_startup_phpcups() - Initialize the CUPS module. + * zif_cups_cancel_job() - Cancel a job. + * zif_cups_get_dests() - Get a list of printers and classes. + * zif_cups_get_jobs() - Get a list of jobs. + * zif_cups_last_error() - Return the last IPP status code. + * zif_cups_last_error_string() - Return the last IPP status + * zif_cups_print_file() - Print a single file. + * zif_cups_print_files() - Print multiple files. + */ + +/* + * Include necessary headers... + */ + +#include +#include "php.h" +#include "php_ini.h" +#include "ext/standard/info.h" +#include "phpcups.h" + + +/* + * PHP function list... + */ + +zend_function_entry phpcups_functions[] = +{ + PHP_FE(cups_cancel_job, NULL) + PHP_FE(cups_get_dests, NULL) + PHP_FE(cups_get_jobs, NULL) + PHP_FE(cups_last_error, NULL) + PHP_FE(cups_last_error_string, NULL) + PHP_FE(cups_print_file, NULL) + PHP_FE(cups_print_files, NULL) + {NULL, NULL, NULL} +}; + + +/* + * PHP module info... + */ + +zend_module_entry phpcups_module_entry = +{ + STANDARD_MODULE_HEADER, + "phpcups", + phpcups_functions, + PHP_MINIT(phpcups), + NULL, + NULL, + NULL, + NULL, + CUPS_SVERSION, + STANDARD_MODULE_PROPERTIES +}; + + +ZEND_GET_MODULE(phpcups) + + +/* + * 'cups_convert_options()' - Convert a PHP options array to a CUPS options array. + */ + +static int /* O - Number of options */ +cups_convert_options( + zval *optionsobj, /* I - Options array object */ + cups_option_t **options) /* O - Options */ +{ + int num_options; /* Number of options */ + HashTable *ht; /* Option array hash table */ + Bucket *current; /* Current element in array */ + zval *value; /* Current value in array */ + char temp[255]; /* String value for numbers */ + + + ht = Z_ARRVAL_P(optionsobj); + num_options = 0; + + for (current = ht->pListHead; current; current = current->pListNext) + { + value = (zval *)current->pDataPtr; + + switch (Z_TYPE_P(value)) + { + case IS_LONG : + sprintf(temp, "%ld", Z_LVAL_P(value)); + num_options = cupsAddOption(current->arKey, temp, num_options, + options); + break; + + case IS_DOUBLE : + sprintf(temp, "%g", Z_DVAL_P(value)); + num_options = cupsAddOption(current->arKey, temp, num_options, + options); + break; + + case IS_BOOL : + num_options = cupsAddOption(current->arKey, + Z_BVAL_P(value) ? "true" : "false", + num_options, options); + break; + + case IS_STRING : + num_options = cupsAddOption(current->arKey, Z_STRVAL_P(value), + num_options, options); + break; + } + } + + return (num_options); +} + + +/* + * 'zm_startup_phpcups()' - Initialize the CUPS module. + */ + +PHP_MINIT_FUNCTION(phpcups) +{ + REGISTER_LONG_CONSTANT("CUPS_PRINTER_LOCAL", CUPS_PRINTER_LOCAL, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_CLASS", CUPS_PRINTER_CLASS, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_REMOTE", CUPS_PRINTER_REMOTE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_BW", CUPS_PRINTER_BW, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLOR", CUPS_PRINTER_COLOR, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_DUPLEX", CUPS_PRINTER_DUPLEX, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_STAPLE", CUPS_PRINTER_STAPLE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_COPIES", CUPS_PRINTER_COPIES, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_COLLATE", CUPS_PRINTER_COLLATE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_PUNCH", CUPS_PRINTER_PUNCH, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_COVER", CUPS_PRINTER_COVER, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_BIND", CUPS_PRINTER_BIND, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_SORT", CUPS_PRINTER_SORT, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_SMALL", CUPS_PRINTER_SMALL, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_MEDIUM", CUPS_PRINTER_MEDIUM, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_LARGE", CUPS_PRINTER_LARGE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_VARIABLE", CUPS_PRINTER_VARIABLE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_IMPLICIT", CUPS_PRINTER_IMPLICIT, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_DEFAULT", CUPS_PRINTER_DEFAULT, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_FAX", CUPS_PRINTER_FAX, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_REJECTING", CUPS_PRINTER_REJECTING, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_DELETE", CUPS_PRINTER_DELETE, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_NOT_SHARED", CUPS_PRINTER_NOT_SHARED, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_AUTHENTICATED", CUPS_PRINTER_AUTHENTICATED, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_COMMANDS", CUPS_PRINTER_COMMANDS, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_DISCOVERED", CUPS_PRINTER_DISCOVERED, CONST_CS); + REGISTER_LONG_CONSTANT("CUPS_PRINTER_OPTIONS", CUPS_PRINTER_OPTIONS, CONST_CS); + + REGISTER_LONG_CONSTANT("IPP_OK", IPP_OK, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_SUBST", IPP_OK_SUBST, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_CONFLICT", IPP_OK_CONFLICT, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_SUBSCRIPTIONS", IPP_OK_IGNORED_SUBSCRIPTIONS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_IGNORED_NOTIFICATIONS", IPP_OK_IGNORED_NOTIFICATIONS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_TOO_MANY_EVENTS", IPP_OK_TOO_MANY_EVENTS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_BUT_CANCEL_SUBSCRIPTION", IPP_OK_BUT_CANCEL_SUBSCRIPTION, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OK_EVENTS_COMPLETE", IPP_OK_EVENTS_COMPLETE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_REDIRECTION_OTHER_SITE", IPP_REDIRECTION_OTHER_SITE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_BAD_REQUEST", IPP_BAD_REQUEST, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_FORBIDDEN", IPP_FORBIDDEN, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_NOT_AUTHENTICATED", IPP_NOT_AUTHENTICATED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_NOT_AUTHORIZED", IPP_NOT_AUTHORIZED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_NOT_POSSIBLE", IPP_NOT_POSSIBLE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_TIMEOUT", IPP_TIMEOUT, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_NOT_FOUND", IPP_NOT_FOUND, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_GONE", IPP_GONE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_REQUEST_ENTITY", IPP_REQUEST_ENTITY, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_REQUEST_VALUE", IPP_REQUEST_VALUE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT", IPP_DOCUMENT_FORMAT, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES", IPP_ATTRIBUTES, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_URI_SCHEME", IPP_URI_SCHEME, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_CHARSET", IPP_CHARSET, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_CONFLICT", IPP_CONFLICT, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_COMPRESSION_NOT_SUPPORTED", IPP_COMPRESSION_NOT_SUPPORTED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_COMPRESSION_ERROR", IPP_COMPRESSION_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_DOCUMENT_FORMAT_ERROR", IPP_DOCUMENT_FORMAT_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_DOCUMENT_ACCESS_ERROR", IPP_DOCUMENT_ACCESS_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_ATTRIBUTES_NOT_SETTABLE", IPP_ATTRIBUTES_NOT_SETTABLE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_SUBSCRIPTIONS", IPP_IGNORED_ALL_SUBSCRIPTIONS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_TOO_MANY_SUBSCRIPTIONS", IPP_TOO_MANY_SUBSCRIPTIONS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_IGNORED_ALL_NOTIFICATIONS", IPP_IGNORED_ALL_NOTIFICATIONS, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_PRINT_SUPPORT_FILE_NOT_FOUND", IPP_PRINT_SUPPORT_FILE_NOT_FOUND, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_INTERNAL_ERROR", IPP_INTERNAL_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_OPERATION_NOT_SUPPORTED", IPP_OPERATION_NOT_SUPPORTED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_SERVICE_UNAVAILABLE", IPP_SERVICE_UNAVAILABLE, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_VERSION_NOT_SUPPORTED", IPP_VERSION_NOT_SUPPORTED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_DEVICE_ERROR", IPP_DEVICE_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_TEMPORARY_ERROR", IPP_TEMPORARY_ERROR, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_NOT_ACCEPTING", IPP_NOT_ACCEPTING, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_PRINTER_BUSY", IPP_PRINTER_BUSY, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_ERROR_JOB_CANCELLED", IPP_ERROR_JOB_CANCELLED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_MULTIPLE_JOBS_NOT_SUPPORTED", IPP_MULTIPLE_JOBS_NOT_SUPPORTED, CONST_CS); + REGISTER_LONG_CONSTANT("IPP_PRINTER_IS_DEACTIVATED", IPP_PRINTER_IS_DEACTIVATED, CONST_CS); + + return (SUCCESS); +} + +/* + * 'zif_cups_cancel_job()' - Cancel a job. + */ + +PHP_FUNCTION(cups_cancel_job) +{ + char *dest; /* Destination */ + int dest_len, /* Length of destination */ + id; /* Job ID */ + + + if (ZEND_NUM_ARGS() != 2 || + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sl", &dest, &dest_len, &id)) + { + WRONG_PARAM_COUNT; + } + + RETURN_LONG(cupsCancelJob(dest, id)); +} + + +/* + * 'zif_cups_get_dests()' - Get a list of printers and classes. + */ + +PHP_FUNCTION(cups_get_dests) +{ + int i, j, /* Looping vars */ + num_dests; /* Number of destinations */ + cups_dest_t *dests, /* Destinations */ + *dest; /* Current destination */ + cups_option_t *option; /* Current option */ + zval *destobj, /* Destination object */ + *optionsobj; /* Options object */ + + + if (ZEND_NUM_ARGS() != 0) + { + WRONG_PARAM_COUNT; + } + + if ((num_dests = cupsGetDests(&dests)) <= 0) + { + RETURN_NULL(); + } + + if (array_init(return_value) == SUCCESS) + { + for (i = 0, dest = dests; i < num_dests; i ++, dest ++) + { + MAKE_STD_ZVAL(destobj); + + if (object_init(destobj) == SUCCESS) + { + /* + * Add properties to the destination for each of the cups_dest_t + * members... + */ + + add_property_string(destobj, "name", dest->name, 1); + add_property_string(destobj, "instance", + dest->instance ? dest->instance : "", 1); + add_property_long(destobj, "is_default", dest->is_default); + + /* + * Create an associative array for the options... + */ + + MAKE_STD_ZVAL(optionsobj); + + if (array_init(optionsobj) == SUCCESS) + { + for (j = 0, option = dest->options; + j < dest->num_options; + j ++, option ++) + add_assoc_string(optionsobj, option->name, option->value, 1); + + add_property_zval(destobj, "options", optionsobj); + } + + add_index_zval(return_value, i, destobj); + } + } + } + + cupsFreeDests(num_dests, dests); +} + + +/* + * 'zif_cups_get_jobs()' - Get a list of jobs. + */ + +PHP_FUNCTION(cups_get_jobs) +{ + char *dest; /* Destination */ + int dest_len, /* Length of destination */ + myjobs, /* Only show my jobs? */ + completed; /* Show completed jobs? */ + int i, /* Looping var */ + num_jobs; /* Number of jobs */ + cups_job_t *jobs, /* Jobs */ + *job; /* Current job */ + zval *jobobj; /* Job object */ + + + + + if (ZEND_NUM_ARGS() != 3 || + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sll", &dest, &dest_len, &myjobs, &completed)) + { + WRONG_PARAM_COUNT; + } + + if (!*dest) + dest = NULL; + + if ((num_jobs = cupsGetJobs(&jobs, dest, myjobs, completed)) <= 0) + { + RETURN_NULL(); + } + + if (array_init(return_value) == SUCCESS) + { + for (i = 0, job = jobs; i < num_jobs; i ++, job ++) + { + MAKE_STD_ZVAL(jobobj); + + if (object_init(jobobj) == SUCCESS) + { + /* + * Add properties to the job for each of the cups_job_t + * members... + */ + + add_property_long(jobobj, "id", job->id); + add_property_string(jobobj, "dest", job->dest, 1); + add_property_string(jobobj, "title", job->title, 1); + add_property_string(jobobj, "user", job->user, 1); + add_property_string(jobobj, "format", job->format, 1); + add_property_long(jobobj, "state", job->state); + add_property_long(jobobj, "size", job->size); + add_property_long(jobobj, "priority", job->priority); + add_property_long(jobobj, "completed_time", job->completed_time); + add_property_long(jobobj, "creation_time", job->creation_time); + add_property_long(jobobj, "processing_time", job->processing_time); + + add_index_zval(return_value, i, jobobj); + } + } + } + + cupsFreeJobs(num_jobs, jobs); +} + + +/* + * 'zif_cups_last_error()' - Return the last IPP status code. + */ + +PHP_FUNCTION(cups_last_error) +{ + if (ZEND_NUM_ARGS() != 0) + { + WRONG_PARAM_COUNT; + } + + RETURN_LONG(cupsLastError()); +} + + +/* + * 'zif_cups_last_error_string()' - Return the last IPP status-message. + */ + +PHP_FUNCTION(cups_last_error_string) +{ + if (ZEND_NUM_ARGS() != 0) + { + WRONG_PARAM_COUNT; + } + + RETURN_STRING((char *)cupsLastErrorString(), 1); +} + + +/* + * 'zif_cups_print_file()' - Print a single file. + */ + +PHP_FUNCTION(cups_print_file) +{ + char *dest; /* Destination */ + int dest_len; /* Length of destination */ + char *filename; /* Filename */ + int filename_len; /* Length of filename */ + char *title; /* Title */ + int title_len; /* Length of title */ + zval *optionsobj; /* Array of options */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + int id; /* Job ID */ + + + if (ZEND_NUM_ARGS() != 4 || + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sssa", &dest, &dest_len, + &filename, &filename_len, + &title, &title_len, &optionsobj)) + { + WRONG_PARAM_COUNT; + } + + num_options = cups_convert_options(optionsobj, &options); + + id = cupsPrintFile(dest, filename, title, num_options, options); + + cupsFreeOptions(num_options, options); + + RETURN_LONG(id); +} + + +/* + * 'zif_cups_print_files()' - Print multiple files. + */ + +PHP_FUNCTION(cups_print_files) +{ + char *dest; /* Destination */ + int dest_len; /* Length of destination */ + zval *filesobj; /* Files array */ + int num_files; /* Number of files */ + const char *files[1000]; /* Files */ + char *title; /* Title */ + int title_len; /* Length of title */ + zval *optionsobj; /* Array of options */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + HashTable *ht2; /* Option array hash table */ + Bucket *current; /* Current element in array */ + int id; /* Job ID */ + + + if (ZEND_NUM_ARGS() != 4 || + zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sasa", &dest, &dest_len, &filesobj, + &title, &title_len, &optionsobj)) + { + WRONG_PARAM_COUNT; + } + + ht2 = Z_ARRVAL_P(filesobj); + num_files = 0; + + for (current = ht2->pListHead; current; current = current->pListNext) + { + files[num_files ++] = Z_STRVAL_P(((zval *)current->pDataPtr)); + + if (num_files >= (int)(sizeof(files) / sizeof(files[0]))) + break; + } + + num_options = cups_convert_options(optionsobj, &options); + + id = cupsPrintFiles(dest, num_files, files, title, num_options, options); + + cupsFreeOptions(num_options, options); + + RETURN_LONG(id); +} + + +/* + * End of "$Id: phpcups.c 10197 2012-01-27 16:34:04Z mike $". + */ diff --git a/scripting/php/phpcups.h b/scripting/php/phpcups.h new file mode 100644 index 0000000..9cd9f88 --- /dev/null +++ b/scripting/php/phpcups.h @@ -0,0 +1,67 @@ +/* + * "$Id: phpcups.h 9771 2011-05-12 05:21:56Z mike $" + * + * PHP module include file for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef PHPCUPS_H +# define PHPCUPS_H + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include +# include +# if defined(WIN32) || defined(__EMX__) +# include +# else +# include +# endif /* WIN32 || __EMX__ */ + + +/* + * Zend definitions... + */ + +extern zend_module_entry phpcups_module_entry; +# define phpext_phpcups_ptr &phpcups_module_entry + +# ifdef PHP_WIN32 +# define PHP_PHPCUPS_API __declspec(dllexport) +# else +# define PHP_PHPCUPS_API +# endif + +# ifdef ZTS +# include "TSRM.h" +# endif + +PHP_MINIT_FUNCTION(phpcups); + +PHP_FUNCTION(cups_cancel_job); +PHP_FUNCTION(cups_get_dests); +PHP_FUNCTION(cups_get_jobs); +PHP_FUNCTION(cups_last_error); +PHP_FUNCTION(cups_last_error_string); +PHP_FUNCTION(cups_print_file); +PHP_FUNCTION(cups_print_files); + +#endif /* !PHPCUPS_H */ + + +/* + * End of "$Id: phpcups.h 9771 2011-05-12 05:21:56Z mike $". + */ diff --git a/scripting/php/phpcups.php b/scripting/php/phpcups.php new file mode 100755 index 0000000..0fe5719 --- /dev/null +++ b/scripting/php/phpcups.php @@ -0,0 +1,60 @@ +#!/usr/bin/php -f + "100", + "page-label" => "testfile.jpg"))); + +print("cups_print_files(\"test\", array(\"../../test/testfile.jpg\", " + ."\"../../test/testfile.ps\"), \"testfiles\", ...):\n"); +print_r(cups_print_files("test", array("../../test/testfile.jpg", + "../../test/testfile.ps"), + "testfiles", + array("scaling" => "100", + "page-label" => "testfile.jpg"))); + +// +// End of "$Id: phpcups.php 3603 2003-04-11 18:42:52Z mike $". +// +?> diff --git a/systemv/Dependencies b/systemv/Dependencies new file mode 100644 index 0000000..f40f77b --- /dev/null +++ b/systemv/Dependencies @@ -0,0 +1,113 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +cancel.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cancel.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +cancel.o: ../cups/language.h ../cups/string-private.h ../config.h +cancel.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +cancel.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +cancel.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +cancel.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +cancel.o: ../cups/transcode.h ../cups/thread-private.h +cupsaccept.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupsaccept.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cupsaccept.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cupsaccept.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cupsaccept.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cupsaccept.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cupsaccept.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cupsaccept.o: ../cups/language-private.h ../cups/transcode.h +cupsaccept.o: ../cups/thread-private.h +cupsaddsmb.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupsaddsmb.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cupsaddsmb.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cupsaddsmb.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cupsaddsmb.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cupsaddsmb.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cupsaddsmb.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cupsaddsmb.o: ../cups/language-private.h ../cups/transcode.h +cupsaddsmb.o: ../cups/thread-private.h ../cups/adminutil.h +cupsctl.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupsctl.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +cupsctl.o: ../cups/language.h ../cups/string-private.h ../config.h +cupsctl.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +cupsctl.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +cupsctl.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +cupsctl.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +cupsctl.o: ../cups/transcode.h ../cups/thread-private.h ../cups/adminutil.h +cupstestdsc.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupstestdsc.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cupstestdsc.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cupstestdsc.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cupstestdsc.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cupstestdsc.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cupstestdsc.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cupstestdsc.o: ../cups/language-private.h ../cups/transcode.h +cupstestdsc.o: ../cups/thread-private.h +cupstestppd.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +cupstestppd.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +cupstestppd.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +cupstestppd.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +cupstestppd.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +cupstestppd.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +cupstestppd.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +cupstestppd.o: ../cups/language-private.h ../cups/transcode.h +cupstestppd.o: ../cups/thread-private.h ../cups/dir.h ../cups/ppd-private.h +cupstestppd.o: ../cups/raster.h ../cups/ppd.h +lp.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lp.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lp.o: ../cups/language.h ../cups/string-private.h ../config.h +lp.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lp.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lp.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lp.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lp.o: ../cups/transcode.h ../cups/thread-private.h +lpadmin.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpadmin.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpadmin.o: ../cups/language.h ../cups/string-private.h ../config.h +lpadmin.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpadmin.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpadmin.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpadmin.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpadmin.o: ../cups/transcode.h ../cups/thread-private.h +lpinfo.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpinfo.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpinfo.o: ../cups/language.h ../cups/string-private.h ../config.h +lpinfo.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpinfo.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpinfo.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpinfo.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpinfo.o: ../cups/transcode.h ../cups/thread-private.h +lpmove.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpmove.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpmove.o: ../cups/language.h ../cups/string-private.h ../config.h +lpmove.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpmove.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpmove.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpmove.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpmove.o: ../cups/transcode.h ../cups/thread-private.h +lpoptions.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpoptions.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +lpoptions.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +lpoptions.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +lpoptions.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +lpoptions.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +lpoptions.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +lpoptions.o: ../cups/language-private.h ../cups/transcode.h +lpoptions.o: ../cups/thread-private.h +lppasswd.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lppasswd.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lppasswd.o: ../cups/language.h ../cups/string-private.h ../config.h +lppasswd.o: ../cups/debug-private.h ../cups/versioning.h +lppasswd.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +lppasswd.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +lppasswd.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +lppasswd.o: ../cups/language-private.h ../cups/transcode.h +lppasswd.o: ../cups/thread-private.h ../cups/md5-private.h +lpstat.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +lpstat.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +lpstat.o: ../cups/language.h ../cups/string-private.h ../config.h +lpstat.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +lpstat.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +lpstat.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +lpstat.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +lpstat.o: ../cups/transcode.h ../cups/thread-private.h diff --git a/systemv/Makefile b/systemv/Makefile new file mode 100644 index 0000000..f218d03 --- /dev/null +++ b/systemv/Makefile @@ -0,0 +1,293 @@ +# +# "$Id: Makefile 8983 2010-02-13 02:20:23Z mike $" +# +# System V commands makefile for CUPS. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +TARGETS = cancel cupsaccept cupsaddsmb cupsctl cupstestdsc cupstestppd \ + lp lpadmin lpinfo lpmove lpoptions lppasswd lpstat +OBJS = cancel.o cupsaccept.o cupsaddsmb.o cupsctl.o cupstestdsc.o \ + cupstestppd.o lp.o lpadmin.o lpinfo.o lpmove.o lpoptions.o \ + lppasswd.o lpstat.o + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all object files... +# + +clean: + $(RM) $(OBJS) $(TARGETS) + $(RM) accept cupsdisable cupsenable cupsreject reject + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + + +# +# Install programs... +# + +install-exec: + echo Installing System V admin printing commands in $(SBINDIR) + $(INSTALL_DIR) -m 755 $(SBINDIR) + $(INSTALL_BIN) cupsaccept $(SBINDIR) + $(INSTALL_BIN) cupsaddsmb $(SBINDIR) + $(INSTALL_BIN) cupsctl $(SBINDIR) + $(INSTALL_BIN) lpadmin $(SBINDIR) + $(INSTALL_BIN) lpinfo $(SBINDIR) + $(INSTALL_BIN) lpmove $(SBINDIR) + $(RM) $(SBINDIR)/accept + $(LN) cupsaccept $(SBINDIR)/accept + $(RM) $(SBINDIR)/cupsdisable + $(LN) cupsaccept $(SBINDIR)/cupsdisable + $(RM) $(SBINDIR)/cupsenable + $(LN) cupsaccept $(SBINDIR)/cupsenable + $(RM) $(SBINDIR)/cupsreject + $(LN) cupsaccept $(SBINDIR)/cupsreject + $(RM) $(SBINDIR)/reject + $(LN) cupsaccept $(SBINDIR)/reject + echo Installing System V user printing commands in $(BINDIR) + $(INSTALL_DIR) -m 755 $(BINDIR) + $(INSTALL_BIN) cancel $(BINDIR) + $(INSTALL_BIN) cupstestdsc $(BINDIR) + $(INSTALL_BIN) cupstestppd $(BINDIR) + $(INSTALL_BIN) lp $(BINDIR) + $(INSTALL_BIN) lpoptions $(BINDIR) + $(INSTALL_BIN) lpstat $(BINDIR) + $(INSTALL_BIN) lppasswd $(BINDIR) + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + for file in $(TARGETS); do \ + cp $$file $(SYMROOT); \ + done \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall all targets... +# + +uninstall: + $(RM) $(BINDIR)/cancel + $(RM) $(BINDIR)/cupstestdsc + $(RM) $(BINDIR)/cupstestppd + $(RM) $(BINDIR)/lp + $(RM) $(BINDIR)/lpoptions + $(RM) $(BINDIR)/lppasswd + $(RM) $(BINDIR)/lpstat + -$(RMDIR) $(BINDIR) + $(RM) $(SBINDIR)/accept + $(RM) $(SBINDIR)/cupsaccept + $(RM) $(SBINDIR)/cupsaddsmb + $(RM) $(SBINDIR)/cupsaccept + $(RM) $(SBINDIR)/cupsdisable + $(RM) $(SBINDIR)/cupsenable + $(RM) $(SBINDIR)/cupsreject + $(RM) $(SBINDIR)/lpadmin + $(RM) $(SBINDIR)/lpinfo + $(RM) $(SBINDIR)/lpmove + $(RM) $(SBINDIR)/reject + -$(RMDIR) $(SBINDIR) + + +# +# cancel +# + +cancel: cancel.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cancel cancel.o $(LIBS) + + +# +# cupsaccept +# + +cupsaccept: cupsaccept.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsaccept cupsaccept.o $(LIBS) + for file in accept cupsenable cupsdisable cupsreject reject; do \ + $(RM) $$file; \ + $(LN) cupsaccept $$file; \ + done + + +# +# cupsaddsmb +# + +cupsaddsmb: cupsaddsmb.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsaddsmb cupsaddsmb.o $(LIBS) + + +# +# cupsctl +# + +cupsctl: cupsctl.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o cupsctl cupsctl.o $(LIBS) + + +# +# cupstestdsc +# + +cupstestdsc: cupstestdsc.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ cupstestdsc.o $(LIBS) + + +# +# cupstestppd +# + +cupstestppd: cupstestppd.o ../cups/$(LIBCUPS) ../filter/$(LIBCUPSIMAGE) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ cupstestppd.o $(LINKCUPSIMAGE) $(IMGLIBS) $(LIBS) + +cupstestppd-static: cupstestppd.o ../cups/$(LIBCUPSSTATIC) ../filter/libcupsimage.a + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ cupstestppd.o ../filter/libcupsimage.a \ + ../cups/$(LIBCUPSSTATIC) $(IMGLIBS) $(LIBGSSAPI) $(LIBS) $(LIBZ) + + +# +# lp +# + +lp: lp.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lp lp.o $(LIBS) + + +# +# lpadmin +# + +lpadmin: lpadmin.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpadmin lpadmin.o $(LIBZ) $(LIBS) + + +# +# lpinfo +# + +lpinfo: lpinfo.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpinfo lpinfo.o $(LIBS) + + +# +# lpmove +# + +lpmove: lpmove.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpmove lpmove.o $(LIBS) + + +# +# lpoptions +# + +lpoptions: lpoptions.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpoptions lpoptions.o $(LIBZ) $(LIBS) + + +# +# lppasswd +# + +lppasswd: lppasswd.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lppasswd lppasswd.o $(LIBZ) $(LIBS) + + +# +# lpstat +# + +lpstat: lpstat.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o lpstat lpstat.o $(LIBS) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 8983 2010-02-13 02:20:23Z mike $". +# diff --git a/systemv/cancel.c b/systemv/cancel.c new file mode 100644 index 0000000..cbebf11 --- /dev/null +++ b/systemv/cancel.c @@ -0,0 +1,376 @@ +/* + * "$Id: cancel.c 9793 2011-05-20 03:49:49Z mike $" + * + * "cancel" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and cancel jobs. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * 'main()' - Parse options and cancel jobs. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + http_t *http; /* HTTP connection to server */ + int i; /* Looping var */ + int job_id; /* Job ID */ + int num_dests; /* Number of destinations */ + cups_dest_t *dests; /* Destinations */ + char *dest, /* Destination printer */ + *job, /* Job ID pointer */ + *user; /* Cancel jobs for a user */ + int purge; /* Purge or cancel jobs? */ + char uri[1024]; /* Printer or job URI */ + ipp_t *request; /* IPP request */ + ipp_t *response; /* IPP response */ + ipp_op_t op; /* Operation */ + + + _cupsSetLocale(argv); + + /* + * Setup to cancel individual print jobs... + */ + + op = IPP_CANCEL_JOB; + purge = 0; + dest = NULL; + user = NULL; + http = NULL; + num_dests = 0; + dests = NULL; + + + /* + * Process command-line arguments... + */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-' && argv[i][1]) + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + + if (http) + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'a' : /* Cancel all jobs */ + purge = 1; + op = IPP_PURGE_JOBS; + break; + + case 'h' : /* Connect to host */ + if (http != NULL) + { + httpClose(http); + http = NULL; + } + + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), argv[0]); + return (1); + } + else + cupsSetServer(argv[i]); + } + break; + + case 'u' : /* Username */ + op = IPP_PURGE_JOBS; + + if (argv[i][2] != '\0') + user = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-u\" option."), argv[0]); + return (1); + } + else + user = argv[i]; + } + break; + + default : + _cupsLangPrintf(stderr, + _("%s: Error - unknown option \"%c\"."), + argv[0], argv[i][1]); + return (1); + } + else + { + /* + * Cancel a job or printer... + */ + + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if (!strcmp(argv[i], "-")) + { + /* + * Delete the current job... + */ + + dest = ""; + job_id = 0; + } + else if (cupsGetDest(argv[i], NULL, num_dests, dests) != NULL) + { + /* + * Delete the current job on the named destination... + */ + + dest = argv[i]; + job_id = 0; + } + else if ((job = strrchr(argv[i], '-')) != NULL && isdigit(job[1] & 255)) + { + /* + * Delete the specified job ID. + */ + + dest = NULL; + op = IPP_CANCEL_JOB; + job_id = atoi(job + 1); + } + else if (isdigit(argv[i][0] & 255)) + { + /* + * Delete the specified job ID. + */ + + dest = NULL; + op = IPP_CANCEL_JOB; + job_id = atoi(argv[i]); + } + else + { + /* + * Bad printer name! + */ + + _cupsLangPrintf(stderr, + _("%s: Error - unknown destination \"%s\"."), + argv[0], argv[i]); + return (1); + } + + /* + * For Solaris LP compatibility, ignore a destination name after + * cancelling a specific job ID... + */ + + if (job_id && (i + 1) < argc && + cupsGetDest(argv[i + 1], NULL, num_dests, dests) != NULL) + i ++; + + /* + * Open a connection to the server... + */ + + if (http == NULL) + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Unable to connect to server."), argv[0]); + return (1); + } + + /* + * Build an IPP request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + job-id *or* job-uri + * [requesting-user-name] + */ + + request = ippNewRequest(op); + + if (dest) + { + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", dest); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", + job_id); + } + else + { + sprintf(uri, "ipp://localhost/jobs/%d", job_id); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, + uri); + } + + if (user) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); + } + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + if (op == IPP_PURGE_JOBS) + ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", purge); + + /* + * Do the request and get back a response... + */ + + if (op == IPP_PURGE_JOBS && (!user || _cups_strcasecmp(user, cupsUser()))) + response = cupsDoRequest(http, request, "/admin/"); + else + response = cupsDoRequest(http, request, "/jobs/"); + + if (response == NULL || + response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0], + op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", + cupsLastErrorString()); + + if (response) + ippDelete(response); + + return (1); + } + + ippDelete(response); + } + + if (num_dests == 0 && op == IPP_PURGE_JOBS) + { + /* + * Open a connection to the server... + */ + + if (http == NULL) + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to contact server."), argv[0]); + return (1); + } + + /* + * Build an IPP request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + job-id *or* job-uri + * [requesting-user-name] + */ + + request = ippNewRequest(op); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, "ipp://localhost/printers/"); + + if (user) + { + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, user); + ippAddBoolean(request, IPP_TAG_OPERATION, "my-jobs", 1); + } + else + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + ippAddBoolean(request, IPP_TAG_OPERATION, "purge-jobs", purge); + + /* + * Do the request and get back a response... + */ + + response = cupsDoRequest(http, request, "/admin/"); + + if (response == NULL || + response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s failed: %s"), argv[0], + op == IPP_PURGE_JOBS ? "purge-jobs" : "cancel-job", + cupsLastErrorString()); + + if (response) + ippDelete(response); + + return (1); + } + + ippDelete(response); + } + + return (0); +} + + +/* + * End of "$Id: cancel.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/systemv/cupsaccept.c b/systemv/cupsaccept.c new file mode 100644 index 0000000..8423b11 --- /dev/null +++ b/systemv/cupsaccept.c @@ -0,0 +1,239 @@ +/* + * "$Id: cupsaccept.c 9384 2010-11-22 07:06:39Z mike $" + * + * "cupsaccept", "cupsdisable", "cupsenable", and "cupsreject" commands for + * CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and accept/reject jobs or disable/enable printers. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * 'main()' - Parse options and accept/reject jobs or disable/enable printers. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char *command, /* Command to do */ + uri[1024], /* Printer URI */ + *reason; /* Reason for reject/disable */ + ipp_t *request; /* IPP request */ + ipp_op_t op; /* Operation */ + int cancel; /* Cancel jobs? */ + + + _cupsSetLocale(argv); + + /* + * See what operation we're supposed to do... + */ + + if ((command = strrchr(argv[0], '/')) != NULL) + command ++; + else + command = argv[0]; + + cancel = 0; + + if (!strcmp(command, "cupsaccept") || !strcmp(command, "accept")) + op = CUPS_ACCEPT_JOBS; + else if (!strcmp(command, "cupsreject") || !strcmp(command, "reject")) + op = CUPS_REJECT_JOBS; + else if (!strcmp(command, "cupsdisable") || !strcmp(command, "disable")) + op = IPP_PAUSE_PRINTER; + else if (!strcmp(command, "cupsenable") || !strcmp(command, "enable")) + op = IPP_RESUME_PRINTER; + else + { + _cupsLangPrintf(stderr, _("%s: Don't know what to do."), command); + return (1); + } + + reason = NULL; + + /* + * Process command-line arguments... + */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), command); +#endif /* HAVE_SSL */ + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), command); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'c' : /* Cancel jobs */ + cancel = 1; + break; + + case 'h' : /* Connect to host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), command); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + case 'r' : /* Reason for cancellation */ + if (argv[i][2] != '\0') + reason = argv[i] + 2; + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected reason text after " + "\"-r\" option."), command); + return (1); + } + + reason = argv[i]; + } + break; + + case '-' : + if (!strcmp(argv[i], "--hold")) + op = IPP_HOLD_NEW_JOBS; + else if (!strcmp(argv[i], "--release")) + op = IPP_RELEASE_HELD_NEW_JOBS; + else + { + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%s\"."), + command, argv[i]); + return (1); + } + break; + + default : + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), + command, argv[i][1]); + return (1); + } + } + else + { + /* + * Accept/disable/enable/reject a destination... + */ + + request = ippNewRequest(op); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", argv[i]); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + if (reason != NULL) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, + "printer-state-message", NULL, reason); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, + _("%s: Operation failed: %s"), + command, ippErrorString(cupsLastError())); + return (1); + } + + /* + * Cancel all jobs if requested... + */ + + if (cancel) + { + /* + * Build an IPP_PURGE_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + */ + + request = ippNewRequest(IPP_PURGE_JOBS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + return (1); + } + } + } + + return (0); +} + + +/* + * End of "$Id: cupsaccept.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/systemv/cupsaddsmb.c b/systemv/cupsaddsmb.c new file mode 100644 index 0000000..959e8ac --- /dev/null +++ b/systemv/cupsaddsmb.c @@ -0,0 +1,303 @@ +/* + * "$Id: cupsaddsmb.c 9636 2011-03-21 22:02:00Z mike $" + * + * "cupsaddsmb" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2001-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Export printers on the command-line. + * export_dest() - Export a destination to SAMBA. + * usage() - Show program usage and exit... + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include + + +/* + * Local globals... + */ + +int Verbosity = 0; +const char *SAMBAUser, + *SAMBAPassword, + *SAMBAServer; + + +/* + * Local functions... + */ + +int export_dest(http_t *http, const char *dest); +void usage(void); + + +/* + * 'main()' - Export printers on the command-line. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j; /* Looping vars */ + int status; /* Status from export_dest() */ + int export_all; /* Export all printers? */ + http_t *http; /* Connection to server */ + int num_dests; /* Number of printers */ + cups_dest_t *dests; /* Printers */ + + + _cupsSetLocale(argv); + + /* + * Parse command-line arguments... + */ + + export_all = 0; + http = NULL; + SAMBAUser = cupsUser(); + SAMBAPassword = NULL; + SAMBAServer = NULL; + + for (i = 1; i < argc; i ++) + if (!strcmp(argv[i], "-E")) + { +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + } + else if (!strcmp(argv[i], "-H")) + { + i ++; + if (i >= argc) + usage(); + + SAMBAServer = argv[i]; + } + else if (!strcmp(argv[i], "-U")) + { + char *sep; /* Separator for password */ + + + i ++; + if (i >= argc) + usage(); + + SAMBAUser = argv[i]; + + if ((sep = strchr(argv[i], '%')) != NULL) + { + /* + * Nul-terminate the username at the first % and point the + * password at the rest... + */ + + *sep++ = '\0'; + + SAMBAPassword = sep; + } + } + else if (!strcmp(argv[i], "-a")) + export_all = 1; + else if (!strcmp(argv[i], "-h")) + { + i ++; + if (i >= argc) + usage(); + + cupsSetServer(argv[i]); + } + else if (!strcmp(argv[i], "-v")) + Verbosity = 1; + else if (argv[i][0] != '-') + { + if (!http) + { + /* + * Connect to the server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), + argv[0]); + exit(1); + } + } + + if (SAMBAServer == NULL) + { + SAMBAServer = cupsServer(); + + if (SAMBAServer[0] == '/') /* Use localhost instead of domain socket */ + SAMBAServer = "localhost"; + } + + if ((status = export_dest(http, argv[i])) != 0) + return (status); + } + else + usage(); + + /* + * Connect to the server... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, _("%s: Unable to connect to server."), argv[0]); + exit(1); + } + + /* + * See if the user specified "-a"... + */ + + if (export_all) + { + /* + * Export all printers... + */ + + if (SAMBAServer == NULL) + { + SAMBAServer = cupsServer(); + + if (SAMBAServer[0] == '/') /* Use localhost instead of domain socket */ + SAMBAServer = "localhost"; + } + + num_dests = cupsGetDests2(http, &dests); + + for (j = 0, status = 0; j < num_dests; j ++) + if (!dests[j].instance) + { + if ((status = export_dest(http, dests[j].name)) != 0) + break; + } + + cupsFreeDests(num_dests, dests); + + if (status) + return (status); + } + + return (0); +} + + +/* + * 'export_dest()' - Export a destination to SAMBA. + */ + +int /* O - 0 on success, non-zero on error */ +export_dest(http_t *http, /* I - Connection to server */ + const char *dest) /* I - Destination to export */ +{ + int status; /* Status of export */ + char ppdfile[1024], /* PPD file for printer drivers */ + prompt[1024]; /* Password prompt */ + int tries; /* Number of tries */ + + + /* + * Get the Windows PPD file for the printer... + */ + + if (!cupsAdminCreateWindowsPPD(http, dest, ppdfile, sizeof(ppdfile))) + { + _cupsLangPrintf(stderr, + _("cupsaddsmb: No PPD file for printer \"%s\" - %s"), + dest, cupsLastErrorString()); + return (1); + } + + /* + * Try to export it... + */ + + for (status = 0, tries = 0; !status && tries < 3; tries ++) + { + /* + * Get the password, as needed... + */ + + if (!SAMBAPassword) + { + snprintf(prompt, sizeof(prompt), + _cupsLangString(cupsLangDefault(), + _("Password for %s required to access %s via " + "SAMBA: ")), + SAMBAUser, SAMBAServer); + + if ((SAMBAPassword = cupsGetPassword(prompt)) == NULL) + break; + } + + status = cupsAdminExportSamba(dest, ppdfile, SAMBAServer, + SAMBAUser, SAMBAPassword, + Verbosity ? stderr : NULL); + + if (!status && cupsLastError() == IPP_NOT_FOUND) + break; + } + + unlink(ppdfile); + + return (!status); +} + + +/* + * 'usage()' - Show program usage and exit... + */ + +void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: cupsaddsmb [options] printer1 ... printerN")); + _cupsLangPuts(stdout, _(" cupsaddsmb [options] -a")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, _(" -E Encrypt the connection to " + "the server.")); + _cupsLangPuts(stdout, _(" -H samba-server Use the named SAMBA " + "server.")); + _cupsLangPuts(stdout, _(" -U samba-user Authenticate using the " + "named SAMBA user.")); + _cupsLangPuts(stdout, _(" -a Export all printers.")); + _cupsLangPuts(stdout, _(" -h cups-server Use the named CUPS " + "server.")); + _cupsLangPuts(stdout, _(" -v Be verbose (show " + "commands).")); + + exit(1); +} + + +/* + * End of "$Id: cupsaddsmb.c 9636 2011-03-21 22:02:00Z mike $". + */ diff --git a/systemv/cupsctl.c b/systemv/cupsctl.c new file mode 100644 index 0000000..2f28bc4 --- /dev/null +++ b/systemv/cupsctl.c @@ -0,0 +1,235 @@ +/* + * "$Id: cupsctl.c 9636 2011-03-21 22:02:00Z mike $" + * + * Scheduler control program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 2006-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Get/set server settings. + * usage() - Show program usage. + */ + +/* + * Include necessary headers... + */ + +#include +#include + + +/* + * Local functions... + */ + +static void usage(const char *opt); + + +/* + * 'main()' - Get/set server settings. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, /* Looping var */ + num_settings; /* Number of settings */ + cups_option_t *settings; /* Settings */ + const char *opt; /* Current option character */ + http_t *http; /* Connection to server */ + + + /* + * Process the command-line... + */ + + _cupsSetLocale(argv); + + num_settings = 0; + settings = NULL; + + for (i = 1; i < argc; i ++) + { + if (argv[i][0] == '-') + { + if (argv[i][1] == '-') + { + if (!strcmp(argv[i], "--debug-logging")) + num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-debug-logging")) + num_settings = cupsAddOption(CUPS_SERVER_DEBUG_LOGGING, "0", + num_settings, &settings); + else if (!strcmp(argv[i], "--remote-admin")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-remote-admin")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ADMIN, "0", + num_settings, &settings); + else if (!strcmp(argv[i], "--remote-any")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-remote-any")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_ANY, "0", + num_settings, &settings); + else if (!strcmp(argv[i], "--remote-printers")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-remote-printers")) + num_settings = cupsAddOption(CUPS_SERVER_REMOTE_PRINTERS, "0", + num_settings, &settings); + else if (!strcmp(argv[i], "--share-printers")) + num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-share-printers")) + num_settings = cupsAddOption(CUPS_SERVER_SHARE_PRINTERS, "0", + num_settings, &settings); + else if (!strcmp(argv[i], "--user-cancel-any")) + num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "1", + num_settings, &settings); + else if (!strcmp(argv[i], "--no-user-cancel-any")) + num_settings = cupsAddOption(CUPS_SERVER_USER_CANCEL_ANY, "0", + num_settings, &settings); + else + usage(argv[i]); + } + else + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'E' : + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + break; + + case 'U' : + i ++; + if (i >= argc) + usage(NULL); + + cupsSetUser(argv[i]); + break; + + case 'h' : + i ++; + if (i >= argc) + usage(NULL); + + cupsSetServer(argv[i]); + break; + + default : + usage(opt); + break; + } + } + } + else if (strchr(argv[i], '=')) + num_settings = cupsParseOptions(argv[i], num_settings, &settings); + else + usage(argv[i]); + } + + if (cupsGetOption("Listen", num_settings, settings) || + cupsGetOption("Port", num_settings, settings)) + { + _cupsLangPuts(stderr, _("cupsctl: Cannot set Listen or Port directly.")); + return (1); + } + + /* + * Connect to the server using the defaults... + */ + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) == NULL) + { + _cupsLangPrintf(stderr, _("cupsctl: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + + /* + * Set the current configuration if we have anything on the command-line... + */ + + if (num_settings > 0) + { + if (!cupsAdminSetServerSettings(http, num_settings, settings)) + { + _cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString()); + return (1); + } + } + else if (!cupsAdminGetServerSettings(http, &num_settings, &settings)) + { + _cupsLangPrintf(stderr, "cupsctl: %s", cupsLastErrorString()); + return (1); + } + else + { + for (i = 0; i < num_settings; i ++) + _cupsLangPrintf(stdout, "%s=%s", settings[i].name, settings[i].value); + } + + cupsFreeOptions(num_settings, settings); + return (0); +} + + +/* + * 'usage()' - Show program usage. + */ + +static void +usage(const char *opt) /* I - Option character/string */ +{ + if (opt) + { + if (*opt == '-') + _cupsLangPrintf(stderr, _("cupsctl: Unknown option \"%s\""), opt); + else + _cupsLangPrintf(stderr, _("cupsctl: Unknown option \"-%c\""), *opt); + } + + _cupsLangPuts(stdout, _("Usage: cupsctl [options] [param=value ... " + "paramN=valueN]")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _(" -E Enable encryption.")); + _cupsLangPuts(stdout, _(" -U username Specify username.")); + _cupsLangPuts(stdout, _(" -h server[:port] Specify server " + "address.")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _(" --[no-]debug-logging Turn debug logging " + "on/off.")); + _cupsLangPuts(stdout, _(" --[no-]remote-admin Turn remote " + "administration on/off.")); + _cupsLangPuts(stdout, _(" --[no-]remote-any Allow/prevent access " + "from the Internet.")); + _cupsLangPuts(stdout, _(" --[no-]remote-printers Show/hide remote " + "printers.")); + _cupsLangPuts(stdout, _(" --[no-]share-printers Turn printer sharing " + "on/off.")); + _cupsLangPuts(stdout, _(" --[no-]user-cancel-any Allow/prevent users to " + "cancel any job.")); + + exit(1); +} + + +/* + * End of "$Id: cupsctl.c 9636 2011-03-21 22:02:00Z mike $". + */ diff --git a/systemv/cupstestdsc.c b/systemv/cupstestdsc.c new file mode 100644 index 0000000..f773f1f --- /dev/null +++ b/systemv/cupstestdsc.c @@ -0,0 +1,442 @@ +/* + * "$Id: cupstestdsc.c 9384 2010-11-22 07:06:39Z mike $" + * + * DSC test program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 2006 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry for test program. + * check() - Check a file for conformance. + * usage() - Show program usage. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static int check_file(const char *filename); +static void usage(void); + + +/* + * 'main()' - Main entry for test program. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int status; /* Status of tests */ + int num_files; /* Number of files tested */ + + + _cupsSetLocale(argv); + + /* + * Collect command-line arguments... + */ + + for (i = 1, num_files = 0, status = 0; i < argc; i ++) + if (argv[i][0] == '-') + { + if (argv[i][1]) + { + /* + * Currently the only supported option is "-h" (help)... + */ + + usage(); + } + else + { + num_files ++; + status += check_file("(stdin)"); + } + } + else + { + num_files ++; + status += check_file(argv[i]); + } + + if (!num_files) + usage(); + + return (status); +} + + +/* + * 'check()' - Check a file for conformance. + */ + +static int /* O - 0 on success, 1 on failure */ +check_file(const char *filename) /* I - File to read from */ +{ + int i; /* Looping var */ + cups_file_t *fp; /* File */ + char line[1024]; /* Line from file */ + int ch; /* Current character */ + size_t bytes; /* Length of line */ + int status; /* Status of test */ + int linenum; /* Line number */ + int binary; /* File contains binary data? */ + float version; /* DSC version */ + int lbrt[4]; /* Bounding box */ + char page_label[256]; /* Page label string */ + int page_number; /* Page number */ + int last_page_number; /* Last page number seen */ + int level; /* Embedded document level */ + int saw_bounding_box, /* %%BoundingBox seen? */ + saw_pages, /* %%Pages seen? */ + saw_end_comments, /* %%EndComments seen? */ + saw_begin_prolog, /* %%BeginProlog seen? */ + saw_end_prolog, /* %%EndProlog seen? */ + saw_begin_setup, /* %%BeginSetup seen? */ + saw_end_setup, /* %%EndSetup seen? */ + saw_page, /* %%Page seen? */ + saw_trailer, /* %%Trailer seen? */ + saw_long_line; /* Saw long lines? */ + + + /* + * Open the file... + */ + + if (!strcmp(filename, "(stdin)")) + fp = cupsFileStdin(); + else + fp = cupsFileOpen(filename, "r"); + + if (!fp) + { + perror(filename); + return (1); + } + + /* + * Scan the file... + */ + + binary = 0; + last_page_number = 0; + level = 0; + linenum = 0; + saw_begin_prolog = 0; + saw_begin_setup = 0; + saw_bounding_box = 0; + saw_end_comments = 0; + saw_end_prolog = 0; + saw_end_setup = 0; + saw_long_line = 0; + saw_page = 0; + saw_pages = 0; + saw_trailer = 0; + status = 0; + version = 0.0f; + + /* TODO: Fixme */ + printf("%s: ", filename); + fflush(stdout); + + while ((bytes = cupsFileGetLine(fp, line, sizeof(line))) > 0) + { + linenum ++; + + if (bytes > 255) + { + if (!saw_long_line) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, + _(" Line %d is longer than 255 characters (%d).\n" + " REF: Page 25, Line Length"), + linenum, (int)bytes); + } + + saw_long_line ++; + } + + if (linenum == 1) + { + if (strncmp(line, "%!PS-Adobe-", 11)) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + _cupsLangPuts(stdout, + _(" Missing %!PS-Adobe-3.0 on first line.\n" + " REF: Page 17, 3.1 Conforming Documents")); + cupsFileClose(fp); + return (1); + } + else + version = atof(line + 11); + } + else if (level > 0) + { + if (!strncmp(line, "%%BeginDocument:", 16)) + level ++; + else if (!strncmp(line, "%%EndDocument", 13)) + level --; + } + else if (saw_trailer) + { + if (!strncmp(line, "%%Pages:", 8)) + { + if (atoi(line + 8) <= 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, + _(" Bad %%%%Pages: on line %d.\n" + " REF: Page 43, %%%%Pages:"), + linenum); + } + else + saw_pages = 1; + } + else if (!strncmp(line, "%%BoundingBox:", 14)) + { + if (sscanf(line + 14, "%d%d%d%d", lbrt + 0, lbrt + 1, lbrt + 2, + lbrt + 3) != 4) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, _(" Bad %%%%BoundingBox: on line %d.\n" + " REF: Page 39, %%%%BoundingBox:"), + linenum); + } + else + saw_bounding_box = 1; + } + } + else if (!saw_end_comments) + { + if (!strncmp(line, "%%EndComments", 13)) + saw_end_comments = 1; + else if (line[0] != '%') + saw_end_comments = -1; + else if (!strncmp(line, "%%Pages:", 8)) + { + if (strstr(line + 8, "(atend)")) + saw_pages = -1; + else if (atoi(line + 8) <= 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, _(" Bad %%%%Pages: on line %d.\n" + " REF: Page 43, %%%%Pages:"), + linenum); + } + else + saw_pages = 1; + } + else if (!strncmp(line, "%%BoundingBox:", 14)) + { + if (strstr(line, "(atend)")) + saw_bounding_box = -1; + else if (sscanf(line + 14, "%d%d%d%d", lbrt + 0, lbrt + 1, lbrt + 2, + lbrt + 3) != 4) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, _(" Bad %%%%BoundingBox: on line %d.\n" + " REF: Page 39, %%%%BoundingBox:"), + linenum); + } + else + saw_bounding_box = 1; + } + } + else if (saw_begin_prolog && !saw_end_prolog) + { + if (!strncmp(line, "%%EndProlog", 11)) + saw_end_prolog = 1; + } + else if (saw_begin_setup && !saw_end_setup) + { + if (!strncmp(line, "%%EndSetup", 10)) + saw_end_setup = 1; + } + else if (saw_end_comments) + { + if (!strncmp(line, "%%Page:", 7)) + { + if (sscanf(line + 7, "%255s%d", page_label, &page_number) != 2 || + page_number != (last_page_number + 1) || page_number < 1) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPrintf(stdout, _(" Bad %%%%Page: on line %d.\n" + " REF: Page 53, %%%%Page:"), + linenum); + } + else + { + last_page_number = page_number; + saw_page = 1; + } + } + else if (!strncmp(line, "%%BeginProlog", 13)) + saw_begin_prolog = 1; + else if (!strncmp(line, "%%BeginSetup", 12)) + saw_begin_setup = 1; + else if (!strncmp(line, "%%BeginDocument:", 16)) + level ++; + else if (!strncmp(line, "%%EndDocument", 13)) + level --; + else if (!strncmp(line, "%%Trailer", 9)) + saw_trailer = 1; + } + + for (i = 0; !binary && i < bytes; i ++) + { + ch = line[i]; + + if ((ch < ' ' || (ch & 0x80)) && ch != '\n' && ch != '\r' && ch != '\t') + binary = 1; + } + } + + if (saw_bounding_box <= 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Missing or bad %%BoundingBox: comment.\n" + " REF: Page 39, %%BoundingBox:")); + } + + if (saw_pages <= 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Missing or bad %%Pages: comment.\n" + " REF: Page 43, %%Pages:")); + } + + if (!saw_end_comments) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Missing %%EndComments comment." + " REF: Page 41, %%EndComments")); + } + + if (!saw_page) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Missing or bad %%Page: comments.\n" + " REF: Page 53, %%Page:")); + } + + if (level < 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Too many %%EndDocument comments.")); + } + else if (level > 0) + { + if (!status) + _cupsLangPuts(stdout, _("FAIL")); + + status ++; + _cupsLangPuts(stdout, _(" Too many %%BeginDocument comments.")); + } + + if (saw_long_line > 1) + _cupsLangPrintf(stderr, + _(" Saw %d lines that exceeded 255 characters."), + saw_long_line); + + if (!status) + _cupsLangPuts(stdout, _("PASS")); + + if (binary) + _cupsLangPuts(stdout, _(" Warning: file contains binary data.")); + + if (version < 3.0f) + _cupsLangPrintf(stdout, + _(" Warning: obsolete DSC version %.1f in file."), + version); + + if (saw_end_comments < 0) + _cupsLangPuts(stdout, _(" Warning: no %%EndComments comment in file.")); + + cupsFileClose(fp); + + return (status); +} + + +/* + * 'usage()' - Show program usage. + */ + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: cupstestdsc [options] filename.ps [... " + "filename.ps]")); + _cupsLangPuts(stdout, _(" cupstestdsc [options] -")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _(" -h Show program usage")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _("Note: this program only validates the DSC comments, " + "not the PostScript itself.")); + + exit(1); +} + + +/* + * End of "$Id: cupstestdsc.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/systemv/cupstestppd.c b/systemv/cupstestppd.c new file mode 100644 index 0000000..10555c8 --- /dev/null +++ b/systemv/cupstestppd.c @@ -0,0 +1,3958 @@ +/* + * "$Id: cupstestppd.c 10362 2012-03-19 15:31:53Z mike $" + * + * PPD test program for CUPS. + * + * Copyright 2007-2012 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * PostScript is a trademark of Adobe Systems, Inc. + * + * This file is subject to the Apple OS-Developed Software exception. + * + * Contents: + * + * main() - Main entry for test program. + * check_basics() - Check for CR LF, mixed line endings, and blank + * lines. + * check_constraints() - Check UIConstraints in the PPD file. + * check_case() - Check that there are no duplicate groups, options, + * or choices that differ only by case. + * check_defaults() - Check default option keywords in the PPD file. + * check_duplex() - Check duplex keywords in the PPD file. + * check_filters() - Check filters in the PPD file. + * check_profiles() - Check ICC color profiles in the PPD file. + * check_sizes() - Check media sizes in the PPD file. + * check_translations() - Check translations in the PPD file. + * show_conflicts() - Show option conflicts in a PPD file. + * test_raster() - Test PostScript commands for raster printers. + * usage() - Show program usage. + * valid_path() - Check whether a path has the correct capitalization. + * valid_utf8() - Check whether a string contains valid UTF-8 text. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#ifdef WIN32 +# define X_OK 0 +#endif /* WIN32 */ + + +/* + * Error warning overrides... + */ + +enum +{ + WARN_NONE = 0, + WARN_CONSTRAINTS = 1, + WARN_DEFAULTS = 2, + WARN_FILTERS = 4, + WARN_PROFILES = 8, + WARN_TRANSLATIONS = 16, + WARN_DUPLEX = 32, + WARN_SIZES = 64, + WARN_FILENAME = 128, + WARN_ALL = 255 +}; + + +/* + * Error codes... + */ + +enum +{ + ERROR_NONE = 0, + ERROR_USAGE, + ERROR_FILE_OPEN, + ERROR_PPD_FORMAT, + ERROR_CONFORMANCE +}; + + +/* + * Line endings... + */ + +enum +{ + EOL_NONE = 0, + EOL_CR, + EOL_LF, + EOL_CRLF +}; + + +/* + * File permissions... + */ + +#define MODE_WRITE 0022 /* Group/other write */ +#define MODE_MASK 0555 /* Owner/group/other read+exec/search */ +#define MODE_DATAFILE 0444 /* Owner/group/other read */ +#define MODE_DIRECTORY 0555 /* Owner/group/other read+search */ +#define MODE_PROGRAM 0555 /* Owner/group/other read+exec */ + + +/* + * Local functions... + */ + +static void check_basics(const char *filename); +static int check_constraints(ppd_file_t *ppd, int errors, int verbose, + int warn); +static int check_case(ppd_file_t *ppd, int errors, int verbose); +static int check_defaults(ppd_file_t *ppd, int errors, int verbose, + int warn); +static int check_duplex(ppd_file_t *ppd, int errors, int verbose, + int warn); +static int check_filters(ppd_file_t *ppd, const char *root, int errors, + int verbose, int warn); +static int check_profiles(ppd_file_t *ppd, const char *root, int errors, + int verbose, int warn); +static int check_sizes(ppd_file_t *ppd, int errors, int verbose, int warn); +static int check_translations(ppd_file_t *ppd, int errors, int verbose, + int warn); +static void show_conflicts(ppd_file_t *ppd, const char *prefix); +static int test_raster(ppd_file_t *ppd, int verbose); +static void usage(void); +static int valid_path(const char *keyword, const char *path, int errors, + int verbose, int warn); +static int valid_utf8(const char *s); + + +/* + * 'main()' - Main entry for test program. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line args */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j, k, m, n; /* Looping vars */ + int len; /* Length of option name */ + char *opt; /* Option character */ + const char *ptr; /* Pointer into string */ + int files; /* Number of files */ + int verbose; /* Want verbose output? */ + int warn; /* Which errors to just warn about */ + int ignore; /* Which errors to ignore */ + int status; /* Exit status */ + int errors; /* Number of conformance errors */ + int ppdversion; /* PPD spec version in PPD file */ + ppd_status_t error; /* Status of ppdOpen*() */ + int line; /* Line number for error */ + char *root; /* Root directory */ + int xdpi, /* X resolution */ + ydpi; /* Y resolution */ + ppd_file_t *ppd; /* PPD file record */ + ppd_attr_t *attr; /* PPD attribute */ + ppd_size_t *size; /* Size record */ + ppd_group_t *group; /* UI group */ + ppd_option_t *option; /* Standard UI option */ + ppd_group_t *group2; /* UI group */ + ppd_option_t *option2; /* Standard UI option */ + ppd_choice_t *choice; /* Standard UI option choice */ + struct lconv *loc; /* Locale data */ + static char *uis[] = { "BOOLEAN", "PICKONE", "PICKMANY" }; + static char *sections[] = { "ANY", "DOCUMENT", "EXIT", + "JCL", "PAGE", "PROLOG" }; + + + _cupsSetLocale(argv); + loc = localeconv(); + + /* + * Display PPD files for each file listed on the command-line... + */ + + ppdSetConformance(PPD_CONFORM_STRICT); + + verbose = 0; + ppd = NULL; + files = 0; + status = ERROR_NONE; + root = ""; + warn = WARN_NONE; + ignore = WARN_NONE; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-' && argv[i][1]) + { + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'I' : /* Ignore errors */ + i ++; + + if (i >= argc) + usage(); + + if (!strcmp(argv[i], "none")) + ignore = WARN_NONE; + else if (!strcmp(argv[i], "filename")) + ignore |= WARN_FILENAME; + else if (!strcmp(argv[i], "filters")) + ignore |= WARN_FILTERS; + else if (!strcmp(argv[i], "profiles")) + ignore |= WARN_PROFILES; + else if (!strcmp(argv[i], "all")) + ignore = WARN_FILTERS | WARN_PROFILES; + else + usage(); + break; + + case 'R' : /* Alternate root directory */ + i ++; + + if (i >= argc) + usage(); + + root = argv[i]; + break; + + case 'W' : /* Turn errors into warnings */ + i ++; + + if (i >= argc) + usage(); + + if (!strcmp(argv[i], "none")) + warn = WARN_NONE; + else if (!strcmp(argv[i], "constraints")) + warn |= WARN_CONSTRAINTS; + else if (!strcmp(argv[i], "defaults")) + warn |= WARN_DEFAULTS; + else if (!strcmp(argv[i], "duplex")) + warn |= WARN_DUPLEX; + else if (!strcmp(argv[i], "filters")) + warn |= WARN_FILTERS; + else if (!strcmp(argv[i], "profiles")) + warn |= WARN_PROFILES; + else if (!strcmp(argv[i], "sizes")) + warn |= WARN_SIZES; + else if (!strcmp(argv[i], "translations")) + warn |= WARN_TRANSLATIONS; + else if (!strcmp(argv[i], "all")) + warn = WARN_ALL; + else + usage(); + break; + + case 'q' : /* Quiet mode */ + if (verbose > 0) + { + _cupsLangPuts(stderr, + _("cupstestppd: The -q option is incompatible " + "with the -v option.")); + return (1); + } + + verbose --; + break; + + case 'r' : /* Relaxed mode */ + ppdSetConformance(PPD_CONFORM_RELAXED); + break; + + case 'v' : /* Verbose mode */ + if (verbose < 0) + { + _cupsLangPuts(stderr, + _("cupstestppd: The -v option is incompatible " + "with the -q option.")); + return (1); + } + + verbose ++; + break; + + default : + usage(); + break; + } + } + else + { + /* + * Open the PPD file... + */ + + if (files && verbose >= 0) + puts(""); + + files ++; + + if (argv[i][0] == '-') + { + /* + * Read from stdin... + */ + + ppd = ppdOpen(stdin); + + if (verbose >= 0) + printf("%s:", (ppd && ppd->pcfilename) ? ppd->pcfilename : "(stdin)"); + } + else + { + /* + * Read from a file... + */ + + if (verbose >= 0) + printf("%s:", argv[i]); + + ppd = ppdOpenFile(argv[i]); + } + + if (ppd == NULL) + { + error = ppdLastError(&line); + + if (error <= PPD_ALLOC_ERROR) + { + status = ERROR_FILE_OPEN; + + if (verbose >= 0) + { + _cupsLangPuts(stdout, _(" FAIL")); + _cupsLangPrintf(stdout, + _(" **FAIL** Unable to open PPD file - %s"), + strerror(errno)); + } + } + else + { + status = ERROR_PPD_FORMAT; + + if (verbose >= 0) + { + _cupsLangPuts(stdout, _(" FAIL")); + _cupsLangPrintf(stdout, + _(" **FAIL** Unable to open PPD file - " + "%s on line %d."), + ppdErrorString(error), line); + + switch (error) + { + case PPD_MISSING_PPDADOBE4 : + _cupsLangPuts(stdout, + _(" REF: Page 42, section " + "5.2.")); + break; + case PPD_MISSING_VALUE : + _cupsLangPuts(stdout, + _(" REF: Page 20, section " + "3.4.")); + break; + case PPD_BAD_OPEN_GROUP : + case PPD_NESTED_OPEN_GROUP : + _cupsLangPuts(stdout, + _(" REF: Pages 45-46, section " + "5.2.")); + break; + case PPD_BAD_OPEN_UI : + case PPD_NESTED_OPEN_UI : + _cupsLangPuts(stdout, + _(" REF: Pages 42-45, section " + "5.2.")); + break; + case PPD_BAD_ORDER_DEPENDENCY : + _cupsLangPuts(stdout, + _(" REF: Pages 48-49, section " + "5.2.")); + break; + case PPD_BAD_UI_CONSTRAINTS : + _cupsLangPuts(stdout, + _(" REF: Pages 52-54, section " + "5.2.")); + break; + case PPD_MISSING_ASTERISK : + _cupsLangPuts(stdout, + _(" REF: Page 15, section " + "3.2.")); + break; + case PPD_LINE_TOO_LONG : + _cupsLangPuts(stdout, + _(" REF: Page 15, section " + "3.1.")); + break; + case PPD_ILLEGAL_CHARACTER : + _cupsLangPuts(stdout, + _(" REF: Page 15, section " + "3.1.")); + break; + case PPD_ILLEGAL_MAIN_KEYWORD : + _cupsLangPuts(stdout, + _(" REF: Pages 16-17, section " + "3.2.")); + break; + case PPD_ILLEGAL_OPTION_KEYWORD : + _cupsLangPuts(stdout, + _(" REF: Page 19, section " + "3.3.")); + break; + case PPD_ILLEGAL_TRANSLATION : + _cupsLangPuts(stdout, + _(" REF: Page 27, section " + "3.5.")); + break; + default : + break; + } + + check_basics(argv[i]); + } + } + + continue; + } + + /* + * Show the header and then perform basic conformance tests (limited + * only by what the CUPS PPD functions actually load...) + */ + + errors = 0; + ppdversion = 43; + + if (verbose > 0) + _cupsLangPuts(stdout, + _("\n DETAILED CONFORMANCE TEST RESULTS")); + + if ((attr = ppdFindAttr(ppd, "FormatVersion", NULL)) != NULL && + attr->value) + ppdversion = (int)(10 * _cupsStrScand(attr->value, NULL, loc) + 0.5); + + if ((attr = ppdFindAttr(ppd, "cupsFilter2", NULL)) != NULL) + { + do + { + if (strstr(attr->value, "application/vnd.cups-raster")) + { + if (!test_raster(ppd, verbose)) + errors ++; + break; + } + } + while ((attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) != NULL); + } + else + { + for (j = 0; j < ppd->num_filters; j ++) + if (strstr(ppd->filters[j], "application/vnd.cups-raster")) + { + if (!test_raster(ppd, verbose)) + errors ++; + break; + } + } + + /* + * Look for default keywords with no matching option... + */ + + if (!(warn & WARN_DEFAULTS)) + errors = check_defaults(ppd, errors, verbose, 0); + + if ((attr = ppdFindAttr(ppd, "DefaultImageableArea", NULL)) == NULL) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED DefaultImageableArea\n" + " REF: Page 102, section 5.15.")); + } + + errors ++; + } + else if (ppdPageSize(ppd, attr->value) == NULL && + strcmp(attr->value, "Unknown")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** BAD DefaultImageableArea %s\n" + " REF: Page 102, section 5.15."), + attr->value); + } + + errors ++; + } + else + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS DefaultImageableArea")); + } + + if ((attr = ppdFindAttr(ppd, "DefaultPaperDimension", NULL)) == NULL) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED DefaultPaperDimension\n" + " REF: Page 103, section 5.15.")); + } + + errors ++; + } + else if (ppdPageSize(ppd, attr->value) == NULL && + strcmp(attr->value, "Unknown")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** BAD DefaultPaperDimension %s\n" + " REF: Page 103, section 5.15."), + attr->value); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS DefaultPaperDimension")); + + for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++) + for (k = 0, option = group->options; + k < group->num_options; + k ++, option ++) + { + /* + * Verify that we have a default choice... + */ + + if (option->defchoice[0]) + { + if (ppdFindChoice(option, option->defchoice) == NULL && + strcmp(option->defchoice, "Unknown")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** BAD Default%s %s\n" + " REF: Page 40, section 4.5."), + option->keyword, option->defchoice); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPrintf(stdout, + _(" PASS Default%s"), + option->keyword); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** REQUIRED Default%s\n" + " REF: Page 40, section 4.5."), + option->keyword); + } + + errors ++; + } + } + + if ((attr = ppdFindAttr(ppd, "FileVersion", NULL)) != NULL) + { + for (ptr = attr->value; *ptr; ptr ++) + if (!isdigit(*ptr & 255) && *ptr != '.') + break; + + if (*ptr) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** Bad FileVersion \"%s\"\n" + " REF: Page 56, section 5.3."), + attr->value); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS FileVersion")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED FileVersion\n" + " REF: Page 56, section 5.3.")); + } + + errors ++; + } + + if ((attr = ppdFindAttr(ppd, "FormatVersion", NULL)) != NULL) + { + ptr = attr->value; + if (*ptr == '4' && ptr[1] == '.') + { + + for (ptr += 2; *ptr; ptr ++) + if (!isdigit(*ptr & 255)) + break; + } + + if (*ptr) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** Bad FormatVersion \"%s\"\n" + " REF: Page 56, section 5.3."), + attr->value); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS FormatVersion")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED FormatVersion\n" + " REF: Page 56, section 5.3.")); + } + + errors ++; + } + + if (ppd->lang_encoding != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS LanguageEncoding")); + } + else if (ppdversion > 40) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED LanguageEncoding\n" + " REF: Pages 56-57, section 5.3.")); + } + + errors ++; + } + + if (ppd->lang_version != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS LanguageVersion")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED LanguageVersion\n" + " REF: Pages 57-58, section 5.3.")); + } + + errors ++; + } + + if (ppd->manufacturer != NULL) + { + if (!_cups_strncasecmp(ppd->manufacturer, "Hewlett-Packard", 15) || + !_cups_strncasecmp(ppd->manufacturer, "Hewlett Packard", 15)) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD Manufacturer (should be " + "\"HP\")\n" + " REF: Page 211, table D.1.")); + } + + errors ++; + } + else if (!_cups_strncasecmp(ppd->manufacturer, "OkiData", 7) || + !_cups_strncasecmp(ppd->manufacturer, "Oki Data", 8)) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD Manufacturer (should be " + "\"Oki\")\n" + " REF: Page 211, table D.1.")); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS Manufacturer")); + } + else if (ppdversion >= 43) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED Manufacturer\n" + " REF: Pages 58-59, section 5.3.")); + } + + errors ++; + } + + if (ppd->modelname != NULL) + { + for (ptr = ppd->modelname; *ptr; ptr ++) + if (!isalnum(*ptr & 255) && !strchr(" ./-+", *ptr)) + break; + + if (*ptr) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** BAD ModelName - \"%c\" not " + "allowed in string.\n" + " REF: Pages 59-60, section 5.3."), + *ptr); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS ModelName")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED ModelName\n" + " REF: Pages 59-60, section 5.3.")); + } + + errors ++; + } + + if (ppd->nickname != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS NickName")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED NickName\n" + " REF: Page 60, section 5.3.")); + } + + errors ++; + } + + if (ppdFindOption(ppd, "PageSize") != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS PageSize")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED PageSize\n" + " REF: Pages 99-100, section 5.14.")); + } + + errors ++; + } + + if (ppdFindOption(ppd, "PageRegion") != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS PageRegion")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED PageRegion\n" + " REF: Page 100, section 5.14.")); + } + + errors ++; + } + + if (ppd->pcfilename != NULL) + { + if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS PCFileName")); + } + else if (!(ignore & WARN_FILENAME)) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED PCFileName\n" + " REF: Pages 61-62, section 5.3.")); + } + + errors ++; + } + + if (ppd->product != NULL) + { + if (ppd->product[0] != '(' || + ppd->product[strlen(ppd->product) - 1] != ')') + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD Product - not \"(string)\".\n" + " REF: Page 62, section 5.3.")); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS Product")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED Product\n" + " REF: Page 62, section 5.3.")); + } + + errors ++; + } + + if ((attr = ppdFindAttr(ppd, "PSVersion", NULL)) != NULL && + attr->value != NULL) + { + char junkstr[255]; /* Temp string */ + int junkint; /* Temp integer */ + + + if (sscanf(attr->value, "(%[^)])%d", junkstr, &junkint) != 2) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD PSVersion - not \"(string) " + "int\".\n" + " REF: Pages 62-64, section 5.3.")); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS PSVersion")); + } + else + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED PSVersion\n" + " REF: Pages 62-64, section 5.3.")); + } + + errors ++; + } + + if (ppd->shortnickname != NULL) + { + if (strlen(ppd->shortnickname) > 31) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD ShortNickName - longer " + "than 31 chars.\n" + " REF: Pages 64-65, section 5.3.")); + } + + errors ++; + } + else if (verbose > 0) + _cupsLangPuts(stdout, _(" PASS ShortNickName")); + } + else if (ppdversion >= 43) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED ShortNickName\n" + " REF: Page 64-65, section 5.3.")); + } + + errors ++; + } + + if (ppd->patches != NULL && strchr(ppd->patches, '\"') && + strstr(ppd->patches, "*End")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** BAD JobPatchFile attribute in file\n" + " REF: Page 24, section 3.4.")); + } + + errors ++; + } + + /* + * Check for page sizes without the corresponding ImageableArea or + * PaperDimension values... + */ + + if (ppd->num_sizes == 0) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPuts(stdout, + _(" **FAIL** REQUIRED PageSize\n" + " REF: Page 41, section 5.\n" + " REF: Page 99, section 5.14.")); + } + + errors ++; + } + else + { + for (j = 0, size = ppd->sizes; j < ppd->num_sizes; j ++, size ++) + { + /* + * Don't check custom size... + */ + + if (!strcmp(size->name, "Custom")) + continue; + + /* + * Check for ImageableArea... + */ + + if (size->left == 0.0 && size->bottom == 0.0 && + size->right == 0.0 && size->top == 0.0) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** REQUIRED ImageableArea for " + "PageSize %s\n" + " REF: Page 41, section 5.\n" + " REF: Page 102, section 5.15."), + size->name); + } + + errors ++; + } + + /* + * Check for PaperDimension... + */ + + if (size->width <= 0.0 && size->length <= 0.0) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** REQUIRED PaperDimension " + "for PageSize %s\n" + " REF: Page 41, section 5.\n" + " REF: Page 103, section 5.15."), + size->name); + } + + errors ++; + } + } + } + + /* + * Check for valid Resolution, JCLResolution, or SetResolution values... + */ + + if ((option = ppdFindOption(ppd, "Resolution")) == NULL) + if ((option = ppdFindOption(ppd, "JCLResolution")) == NULL) + option = ppdFindOption(ppd, "SetResolution"); + + if (option != NULL) + { + for (j = option->num_choices, choice = option->choices; + j > 0; + j --, choice ++) + { + /* + * Verify that all resolution options are of the form NNNdpi + * or NNNxNNNdpi... + */ + + xdpi = strtol(choice->choice, (char **)&ptr, 10); + if (ptr > choice->choice && xdpi > 0) + { + if (*ptr == 'x') + ydpi = strtol(ptr + 1, (char **)&ptr, 10); + else + ydpi = xdpi; + } + else + ydpi = xdpi; + + if (xdpi <= 0 || xdpi > 99999 || ydpi <= 0 || ydpi > 99999 || + strcmp(ptr, "dpi")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** Bad %s choice %s\n" + " REF: Page 84, section 5.9"), + option->keyword, choice->choice); + } + + errors ++; + } + } + } + + if ((attr = ppdFindAttr(ppd, "1284DeviceID", NULL)) && + strcmp(attr->name, "1284DeviceID")) + { + if (verbose >= 0) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" **FAIL** %s must be 1284DeviceID\n" + " REF: Page 72, section 5.5"), + attr->name); + } + + errors ++; + } + + errors = check_case(ppd, errors, verbose); + + if (!(warn & WARN_CONSTRAINTS)) + errors = check_constraints(ppd, errors, verbose, 0); + + if (!(warn & WARN_FILTERS) && !(ignore & WARN_FILTERS)) + errors = check_filters(ppd, root, errors, verbose, 0); + + if (!(warn & WARN_PROFILES) && !(ignore & WARN_PROFILES)) + errors = check_profiles(ppd, root, errors, verbose, 0); + + if (!(warn & WARN_SIZES)) + errors = check_sizes(ppd, errors, verbose, 0); + + if (!(warn & WARN_TRANSLATIONS)) + errors = check_translations(ppd, errors, verbose, 0); + + if (!(warn & WARN_DUPLEX)) + errors = check_duplex(ppd, errors, verbose, 0); + + if ((attr = ppdFindAttr(ppd, "cupsLanguages", NULL)) != NULL && + attr->value) + { + /* + * This file contains localizations, check for conformance of the + * base translation... + */ + + if ((attr = ppdFindAttr(ppd, "LanguageEncoding", NULL)) != NULL) + { + if (!attr->value || strcmp(attr->value, "ISOLatin1")) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Bad LanguageEncoding %s - " + "must be ISOLatin1."), + attr->value ? attr->value : "(null)"); + + errors ++; + } + + if (!ppd->lang_version || strcmp(ppd->lang_version, "English")) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Bad LanguageVersion %s - " + "must be English."), + ppd->lang_version ? ppd->lang_version : "(null)"); + + errors ++; + } + + /* + * Loop through all options and choices... + */ + + for (option = ppdFirstOption(ppd); + option; + option = ppdNextOption(ppd)) + { + /* + * Check for special characters outside A0 to BF, F7, or F8 + * that are used for languages other than English. + */ + + for (ptr = option->text; *ptr; ptr ++) + if ((*ptr & 0x80) && (*ptr & 0xe0) != 0xa0 && + (*ptr & 0xff) != 0xf7 && (*ptr & 0xff) != 0xf8) + break; + + if (*ptr) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Default translation " + "string for option %s contains 8-bit " + "characters."), + option->keyword); + + errors ++; + } + + for (j = 0; j < option->num_choices; j ++) + { + /* + * Check for special characters outside A0 to BF, F7, or F8 + * that are used for languages other than English. + */ + + for (ptr = option->choices[j].text; *ptr; ptr ++) + if ((*ptr & 0x80) && (*ptr & 0xe0) != 0xa0 && + (*ptr & 0xff) != 0xf7 && (*ptr & 0xff) != 0xf8) + break; + + if (*ptr) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Default translation " + "string for option %s choice %s contains " + "8-bit characters."), + option->keyword, + option->choices[j].choice); + + errors ++; + } + } + } + } + } + + /* + * Final pass/fail notification... + */ + + if (errors) + status = ERROR_CONFORMANCE; + else if (!verbose) + _cupsLangPuts(stdout, _(" PASS")); + + if (verbose >= 0) + { + check_basics(argv[i]); + + if (warn & WARN_DEFAULTS) + errors = check_defaults(ppd, errors, verbose, 1); + + if (warn & WARN_CONSTRAINTS) + errors = check_constraints(ppd, errors, verbose, 1); + + if ((warn & WARN_FILTERS) && !(ignore & WARN_FILTERS)) + errors = check_filters(ppd, root, errors, verbose, 1); + + if ((warn & WARN_PROFILES) && !(ignore & WARN_PROFILES)) + errors = check_profiles(ppd, root, errors, verbose, 1); + + if (warn & WARN_SIZES) + errors = check_sizes(ppd, errors, verbose, 1); + else + errors = check_sizes(ppd, errors, verbose, 2); + + if (warn & WARN_TRANSLATIONS) + errors = check_translations(ppd, errors, verbose, 1); + + if (warn & WARN_DUPLEX) + errors = check_duplex(ppd, errors, verbose, 1); + + /* + * Look for legacy duplex keywords... + */ + + if ((option = ppdFindOption(ppd, "JCLDuplex")) == NULL) + if ((option = ppdFindOption(ppd, "EFDuplex")) == NULL) + option = ppdFindOption(ppd, "KD03Duplex"); + + if (option) + _cupsLangPrintf(stdout, + _(" WARN Duplex option keyword %s may not " + "work as expected and should be named Duplex.\n" + " REF: Page 122, section 5.17"), + option->keyword); + + /* + * Look for default keywords with no corresponding option... + */ + + for (j = 0; j < ppd->num_attrs; j ++) + { + attr = ppd->attrs[j]; + + if (!strcmp(attr->name, "DefaultColorSpace") || + !strcmp(attr->name, "DefaultColorSep") || + !strcmp(attr->name, "DefaultFont") || + !strcmp(attr->name, "DefaultHalftoneType") || + !strcmp(attr->name, "DefaultImageableArea") || + !strcmp(attr->name, "DefaultLeadingEdge") || + !strcmp(attr->name, "DefaultOutputOrder") || + !strcmp(attr->name, "DefaultPaperDimension") || + !strcmp(attr->name, "DefaultResolution") || + !strcmp(attr->name, "DefaultScreenProc") || + !strcmp(attr->name, "DefaultTransfer")) + continue; + + if (!strncmp(attr->name, "Default", 7) && + !ppdFindOption(ppd, attr->name + 7)) + _cupsLangPrintf(stdout, + _(" WARN %s has no corresponding " + "options."), + attr->name); + } + + if (ppdversion < 43) + { + _cupsLangPrintf(stdout, + _(" WARN Obsolete PPD version %.1f.\n" + " REF: Page 42, section 5.2."), + 0.1f * ppdversion); + } + + if (!ppd->lang_encoding && ppdversion < 41) + { + _cupsLangPuts(stdout, + _(" WARN LanguageEncoding required by PPD " + "4.3 spec.\n" + " REF: Pages 56-57, section 5.3.")); + } + + if (!ppd->manufacturer && ppdversion < 43) + { + _cupsLangPuts(stdout, + _(" WARN Manufacturer required by PPD " + "4.3 spec.\n" + " REF: Pages 58-59, section 5.3.")); + } + + /* + * Treat a PCFileName attribute longer than 12 characters as + * a warning and not a hard error... + */ + + if (!(ignore & WARN_FILENAME) && ppd->pcfilename) + { + if (strlen(ppd->pcfilename) > 12) + { + _cupsLangPuts(stdout, + _(" WARN PCFileName longer than 8.3 in " + "violation of PPD spec.\n" + " REF: Pages 61-62, section " + "5.3.")); + } + + if (!_cups_strcasecmp(ppd->pcfilename, "unused.ppd")) + _cupsLangPuts(stdout, + _(" WARN PCFileName should contain a " + "unique filename.\n" + " REF: Pages 61-62, section " + "5.3.")); + } + + if (!ppd->shortnickname && ppdversion < 43) + { + _cupsLangPuts(stdout, + _(" WARN ShortNickName required by PPD " + "4.3 spec.\n" + " REF: Pages 64-65, section 5.3.")); + } + + /* + * Check the Protocols line and flag PJL + BCP since TBCP is + * usually used with PJL... + */ + + if (ppd->protocols) + { + if (strstr(ppd->protocols, "PJL") && + strstr(ppd->protocols, "BCP") && + !strstr(ppd->protocols, "TBCP")) + { + _cupsLangPuts(stdout, + _(" WARN Protocols contains both PJL " + "and BCP; expected TBCP.\n" + " REF: Pages 78-79, section 5.7.")); + } + + if (strstr(ppd->protocols, "PJL") && + (!ppd->jcl_begin || !ppd->jcl_end || !ppd->jcl_ps)) + { + _cupsLangPuts(stdout, + _(" WARN Protocols contains PJL but JCL " + "attributes are not set.\n" + " REF: Pages 78-79, section 5.7.")); + } + } + + /* + * Check for options with a common prefix, e.g. Duplex and Duplexer, + * which are errors according to the spec but won't cause problems + * with CUPS specifically... + */ + + for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++) + for (k = 0, option = group->options; + k < group->num_options; + k ++, option ++) + { + len = (int)strlen(option->keyword); + + for (m = 0, group2 = ppd->groups; + m < ppd->num_groups; + m ++, group2 ++) + for (n = 0, option2 = group2->options; + n < group2->num_options; + n ++, option2 ++) + if (option != option2 && + len < (int)strlen(option2->keyword) && + !strncmp(option->keyword, option2->keyword, len)) + { + _cupsLangPrintf(stdout, + _(" WARN %s shares a common " + "prefix with %s\n" + " REF: Page 15, section " + "3.2."), + option->keyword, option2->keyword); + } + } + } + + if (verbose > 0) + { + if (errors) + _cupsLangPrintf(stdout, _(" %d ERRORS FOUND"), errors); + else + _cupsLangPuts(stdout, _(" NO ERRORS FOUND")); + } + + /* + * Then list the options, if "-v" was provided... + */ + + if (verbose > 1) + { + _cupsLangPrintf(stdout, + "\n" + " language_level = %d\n" + " color_device = %s\n" + " variable_sizes = %s\n" + " landscape = %d", + ppd->language_level, + ppd->color_device ? "TRUE" : "FALSE", + ppd->variable_sizes ? "TRUE" : "FALSE", + ppd->landscape); + + switch (ppd->colorspace) + { + case PPD_CS_CMYK : + _cupsLangPuts(stdout, " colorspace = PPD_CS_CMYK"); + break; + case PPD_CS_CMY : + _cupsLangPuts(stdout, " colorspace = PPD_CS_CMY"); + break; + case PPD_CS_GRAY : + _cupsLangPuts(stdout, " colorspace = PPD_CS_GRAY"); + break; + case PPD_CS_RGB : + _cupsLangPuts(stdout, " colorspace = PPD_CS_RGB"); + break; + default : + _cupsLangPuts(stdout, " colorspace = "); + break; + } + + _cupsLangPrintf(stdout, " num_emulations = %d", + ppd->num_emulations); + for (j = 0; j < ppd->num_emulations; j ++) + _cupsLangPrintf(stdout, " emulations[%d] = %s", + j, ppd->emulations[j].name); + + _cupsLangPrintf(stdout, " lang_encoding = %s", + ppd->lang_encoding); + _cupsLangPrintf(stdout, " lang_version = %s", + ppd->lang_version); + _cupsLangPrintf(stdout, " modelname = %s", ppd->modelname); + _cupsLangPrintf(stdout, " ttrasterizer = %s", + ppd->ttrasterizer == NULL ? "None" : ppd->ttrasterizer); + _cupsLangPrintf(stdout, " manufacturer = %s", + ppd->manufacturer); + _cupsLangPrintf(stdout, " product = %s", ppd->product); + _cupsLangPrintf(stdout, " nickname = %s", ppd->nickname); + _cupsLangPrintf(stdout, " shortnickname = %s", + ppd->shortnickname); + _cupsLangPrintf(stdout, " patches = %d bytes", + ppd->patches == NULL ? 0 : (int)strlen(ppd->patches)); + + _cupsLangPrintf(stdout, " num_groups = %d", ppd->num_groups); + for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++) + { + _cupsLangPrintf(stdout, " group[%d] = %s", + j, group->text); + + for (k = 0, option = group->options; k < group->num_options; k ++, option ++) + { + _cupsLangPrintf(stdout, + " options[%d] = %s (%s) %s %s %.0f " + "(%d choices)", + k, option->keyword, option->text, uis[option->ui], + sections[option->section], option->order, + option->num_choices); + + if (!strcmp(option->keyword, "PageSize") || + !strcmp(option->keyword, "PageRegion")) + { + for (m = option->num_choices, choice = option->choices; + m > 0; + m --, choice ++) + { + size = ppdPageSize(ppd, choice->choice); + + if (size == NULL) + _cupsLangPrintf(stdout, + " %s (%s) = ERROR%s", + choice->choice, choice->text, + !strcmp(option->defchoice, choice->choice) + ? " *" : ""); + else + _cupsLangPrintf(stdout, + " %s (%s) = %.2fx%.2fin " + "(%.1f,%.1f,%.1f,%.1f)%s", + choice->choice, choice->text, + size->width / 72.0, size->length / 72.0, + size->left / 72.0, size->bottom / 72.0, + size->right / 72.0, size->top / 72.0, + !strcmp(option->defchoice, choice->choice) + ? " *" : ""); + } + } + else + { + for (m = option->num_choices, choice = option->choices; + m > 0; + m --, choice ++) + { + _cupsLangPrintf(stdout, " %s (%s)%s", + choice->choice, choice->text, + !strcmp(option->defchoice, choice->choice) + ? " *" : ""); + } + } + } + } + + _cupsLangPrintf(stdout, " num_consts = %d", + ppd->num_consts); + for (j = 0; j < ppd->num_consts; j ++) + _cupsLangPrintf(stdout, + " consts[%d] = *%s %s *%s %s", + j, ppd->consts[j].option1, ppd->consts[j].choice1, + ppd->consts[j].option2, ppd->consts[j].choice2); + + _cupsLangPrintf(stdout, " num_profiles = %d", + ppd->num_profiles); + for (j = 0; j < ppd->num_profiles; j ++) + _cupsLangPrintf(stdout, + " profiles[%d] = %s/%s %.3f %.3f " + "[ %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f ]", + j, ppd->profiles[j].resolution, + ppd->profiles[j].media_type, + ppd->profiles[j].gamma, ppd->profiles[j].density, + ppd->profiles[j].matrix[0][0], + ppd->profiles[j].matrix[0][1], + ppd->profiles[j].matrix[0][2], + ppd->profiles[j].matrix[1][0], + ppd->profiles[j].matrix[1][1], + ppd->profiles[j].matrix[1][2], + ppd->profiles[j].matrix[2][0], + ppd->profiles[j].matrix[2][1], + ppd->profiles[j].matrix[2][2]); + + _cupsLangPrintf(stdout, " num_fonts = %d", ppd->num_fonts); + for (j = 0; j < ppd->num_fonts; j ++) + _cupsLangPrintf(stdout, " fonts[%d] = %s", + j, ppd->fonts[j]); + + _cupsLangPrintf(stdout, " num_attrs = %d", ppd->num_attrs); + for (j = 0; j < ppd->num_attrs; j ++) + _cupsLangPrintf(stdout, + " attrs[%d] = %s %s%s%s: \"%s\"", j, + ppd->attrs[j]->name, ppd->attrs[j]->spec, + ppd->attrs[j]->text[0] ? "/" : "", + ppd->attrs[j]->text, + ppd->attrs[j]->value ? + ppd->attrs[j]->value : "(null)"); + } + + ppdClose(ppd); + } + + if (!files) + usage(); + + return (status); +} + + +/* + * 'check_basics()' - Check for CR LF, mixed line endings, and blank lines. + */ + +static void +check_basics(const char *filename) /* I - PPD file to check */ +{ + cups_file_t *fp; /* File pointer */ + int ch; /* Current character */ + int col, /* Current column */ + whitespace; /* Only seen whitespace? */ + int eol; /* Line endings */ + int linenum; /* Line number */ + int mixed; /* Mixed line endings? */ + + + if ((fp = cupsFileOpen(filename, "r")) == NULL) + return; + + linenum = 1; + col = 0; + eol = EOL_NONE; + mixed = 0; + whitespace = 1; + + while ((ch = cupsFileGetChar(fp)) != EOF) + { + if (ch == '\r' || ch == '\n') + { + if (ch == '\n') + { + if (eol == EOL_NONE) + eol = EOL_LF; + else if (eol != EOL_LF) + mixed = 1; + } + else if (ch == '\r') + { + if (cupsFilePeekChar(fp) == '\n') + { + cupsFileGetChar(fp); + + if (eol == EOL_NONE) + eol = EOL_CRLF; + else if (eol != EOL_CRLF) + mixed = 1; + } + else if (eol == EOL_NONE) + eol = EOL_CR; + else if (eol != EOL_CR) + mixed = 1; + } + + if (col > 0 && whitespace) + _cupsLangPrintf(stdout, + _(" WARN Line %d only contains whitespace."), + linenum); + + linenum ++; + col = 0; + whitespace = 1; + } + else + { + if (ch != ' ' && ch != '\t') + whitespace = 0; + + col ++; + } + } + + if (mixed) + _cupsLangPuts(stdout, + _(" WARN File contains a mix of CR, LF, and " + "CR LF line endings.")); + + if (eol == EOL_CRLF) + _cupsLangPuts(stdout, + _(" WARN Non-Windows PPD files should use lines " + "ending with only LF, not CR LF.")); + + cupsFileClose(fp); +} + + +/* + * 'check_constraints()' - Check UIConstraints in the PPD file. + */ + +static int /* O - Errors found */ +check_constraints(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int i; /* Looping var */ + const char *prefix; /* WARN/FAIL prefix */ + ppd_const_t *c; /* Current UIConstraints data */ + ppd_attr_t *constattr; /* Current cupsUIConstraints attribute */ + const char *vptr; /* Pointer into constraint value */ + char option[PPD_MAX_NAME], + /* Option name/MainKeyword */ + choice[PPD_MAX_NAME], + /* Choice/OptionKeyword */ + *ptr; /* Pointer into option or choice */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + ppd_option_t *o; /* PPD option */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + + /* + * See what kind of constraint data we have in the PPD... + */ + + if ((constattr = ppdFindAttr(ppd, "cupsUIConstraints", NULL)) != NULL) + { + /* + * Check new-style cupsUIConstraints data... + */ + + for (; constattr; + constattr = ppdFindNextAttr(ppd, "cupsUIConstraints", NULL)) + { + if (!constattr->value) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Empty cupsUIConstraints %s"), + prefix, constattr->spec); + + if (!warn) + errors ++; + + continue; + } + + for (i = 0, vptr = strchr(constattr->value, '*'); + vptr; + i ++, vptr = strchr(vptr + 1, '*')); + + if (i == 0) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Bad cupsUIConstraints %s: \"%s\""), + prefix, constattr->spec, constattr->value); + + if (!warn) + errors ++; + + continue; + } + + cupsArraySave(ppd->sorted_attrs); + + if (constattr->spec[0] && + !ppdFindAttr(ppd, "cupsUIResolver", constattr->spec)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing cupsUIResolver %s"), + prefix, constattr->spec); + + if (!warn) + errors ++; + } + + cupsArrayRestore(ppd->sorted_attrs); + + num_options = 0; + options = NULL; + + for (vptr = strchr(constattr->value, '*'); + vptr; + vptr = strchr(vptr, '*')) + { + /* + * Extract "*Option Choice" or just "*Option"... + */ + + for (vptr ++, ptr = option; *vptr && !isspace(*vptr & 255); vptr ++) + if (ptr < (option + sizeof(option) - 1)) + *ptr++ = *vptr; + + *ptr = '\0'; + + while (isspace(*vptr & 255)) + vptr ++; + + if (*vptr == '*') + choice[0] = '\0'; + else + { + for (ptr = choice; *vptr && !isspace(*vptr & 255); vptr ++) + if (ptr < (choice + sizeof(choice) - 1)) + *ptr++ = *vptr; + + *ptr = '\0'; + } + + if (!_cups_strncasecmp(option, "Custom", 6) && !_cups_strcasecmp(choice, "True")) + { + _cups_strcpy(option, option + 6); + strcpy(choice, "Custom"); + } + + if ((o = ppdFindOption(ppd, option)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing option %s in " + "cupsUIConstraints %s: \"%s\""), + prefix, option, constattr->spec, constattr->value); + + if (!warn) + errors ++; + + continue; + } + + if (choice[0] && !ppdFindChoice(o, choice)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing choice *%s %s in " + "cupsUIConstraints %s: \"%s\""), + prefix, option, choice, constattr->spec, + constattr->value); + + if (!warn) + errors ++; + + continue; + } + + if (choice[0]) + num_options = cupsAddOption(option, choice, num_options, &options); + else + { + for (i = 0; i < o->num_choices; i ++) + if (_cups_strcasecmp(o->choices[i].choice, "None") && + _cups_strcasecmp(o->choices[i].choice, "Off") && + _cups_strcasecmp(o->choices[i].choice, "False")) + { + num_options = cupsAddOption(option, o->choices[i].choice, + num_options, &options); + break; + } + } + } + + /* + * Resolvers must list at least two options... + */ + + if (num_options < 2) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s cupsUIResolver %s does not list at least " + "two different options."), + prefix, constattr->spec); + + if (!warn) + errors ++; + } + + /* + * Test the resolver... + */ + + if (!cupsResolveConflicts(ppd, NULL, NULL, &num_options, &options)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s cupsUIResolver %s causes a loop."), + prefix, constattr->spec); + + if (!warn) + errors ++; + } + + cupsFreeOptions(num_options, options); + } + } + else + { + /* + * Check old-style [Non]UIConstraints data... + */ + + for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++) + { + if (!_cups_strncasecmp(c->option1, "Custom", 6) && + !_cups_strcasecmp(c->choice1, "True")) + { + strcpy(option, c->option1 + 6); + strcpy(choice, "Custom"); + } + else + { + strcpy(option, c->option1); + strcpy(choice, c->choice1); + } + + if ((o = ppdFindOption(ppd, option)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing option %s in " + "UIConstraints \"*%s %s *%s %s\"."), + prefix, c->option1, + c->option1, c->choice1, c->option2, c->choice2); + + if (!warn) + errors ++; + } + else if (choice[0] && !ppdFindChoice(o, choice)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing choice *%s %s in " + "UIConstraints \"*%s %s *%s %s\"."), + prefix, c->option1, c->choice1, + c->option1, c->choice1, c->option2, c->choice2); + + if (!warn) + errors ++; + } + + if (!_cups_strncasecmp(c->option2, "Custom", 6) && + !_cups_strcasecmp(c->choice2, "True")) + { + strcpy(option, c->option2 + 6); + strcpy(choice, "Custom"); + } + else + { + strcpy(option, c->option2); + strcpy(choice, c->choice2); + } + + if ((o = ppdFindOption(ppd, option)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing option %s in " + "UIConstraints \"*%s %s *%s %s\"."), + prefix, c->option2, + c->option1, c->choice1, c->option2, c->choice2); + + if (!warn) + errors ++; + } + else if (choice[0] && !ppdFindChoice(o, choice)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Missing choice *%s %s in " + "UIConstraints \"*%s %s *%s %s\"."), + prefix, c->option2, c->choice2, + c->option1, c->choice1, c->option2, c->choice2); + + if (!warn) + errors ++; + } + } + } + + return (errors); +} + + +/* + * 'check_case()' - Check that there are no duplicate groups, options, + * or choices that differ only by case. + */ + +static int /* O - Errors found */ +check_case(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Errors found */ + int verbose) /* I - Verbosity level */ +{ + int i, j; /* Looping vars */ + ppd_group_t *groupa, /* First group */ + *groupb; /* Second group */ + ppd_option_t *optiona, /* First option */ + *optionb; /* Second option */ + ppd_choice_t *choicea, /* First choice */ + *choiceb; /* Second choice */ + + + /* + * Check that the groups do not have any duplicate names... + */ + + for (i = ppd->num_groups, groupa = ppd->groups; i > 1; i --, groupa ++) + for (j = i - 1, groupb = groupa + 1; j > 0; j --, groupb ++) + if (!_cups_strcasecmp(groupa->name, groupb->name)) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Group names %s and %s differ only " + "by case."), + groupa->name, groupb->name); + + errors ++; + } + + /* + * Check that the options do not have any duplicate names... + */ + + for (optiona = ppdFirstOption(ppd); optiona; optiona = ppdNextOption(ppd)) + { + cupsArraySave(ppd->options); + for (optionb = ppdNextOption(ppd); optionb; optionb = ppdNextOption(ppd)) + if (!_cups_strcasecmp(optiona->keyword, optionb->keyword)) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Option names %s and %s differ only " + "by case."), + optiona->keyword, optionb->keyword); + + errors ++; + } + cupsArrayRestore(ppd->options); + + /* + * Then the choices... + */ + + for (i = optiona->num_choices, choicea = optiona->choices; + i > 1; + i --, choicea ++) + for (j = i - 1, choiceb = choicea + 1; j > 0; j --, choiceb ++) + if (!strcmp(choicea->choice, choiceb->choice)) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Multiple occurrences of %s " + "choice name %s."), + optiona->keyword, choicea->choice); + + errors ++; + + choicea ++; + i --; + break; + } + else if (!_cups_strcasecmp(choicea->choice, choiceb->choice)) + { + if (!errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** %s choice names %s and %s " + "differ only by case."), + optiona->keyword, choicea->choice, choiceb->choice); + + errors ++; + } + } + + /* + * Return the number of errors found... + */ + + return (errors); +} + + +/* + * 'check_defaults()' - Check default option keywords in the PPD file. + */ + +static int /* O - Errors found */ +check_defaults(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int j, k; /* Looping vars */ + ppd_attr_t *attr; /* PPD attribute */ + ppd_option_t *option; /* Standard UI option */ + const char *prefix; /* WARN/FAIL prefix */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + ppdMarkDefaults(ppd); + if (ppdConflicts(ppd)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Default choices conflicting."), prefix); + + show_conflicts(ppd, prefix); + + if (!warn) + errors ++; + } + + for (j = 0; j < ppd->num_attrs; j ++) + { + attr = ppd->attrs[j]; + + if (!strcmp(attr->name, "DefaultColorSpace") || + !strcmp(attr->name, "DefaultFont") || + !strcmp(attr->name, "DefaultHalftoneType") || + !strcmp(attr->name, "DefaultImageableArea") || + !strcmp(attr->name, "DefaultLeadingEdge") || + !strcmp(attr->name, "DefaultOutputOrder") || + !strcmp(attr->name, "DefaultPaperDimension") || + !strcmp(attr->name, "DefaultResolution") || + !strcmp(attr->name, "DefaultTransfer")) + continue; + + if (!strncmp(attr->name, "Default", 7)) + { + if ((option = ppdFindOption(ppd, attr->name + 7)) != NULL && + strcmp(attr->value, "Unknown")) + { + /* + * Check that the default option value matches a choice... + */ + + for (k = 0; k < option->num_choices; k ++) + if (!strcmp(option->choices[k].choice, attr->value)) + break; + + if (k >= option->num_choices) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s %s %s does not exist."), + prefix, attr->name, attr->value); + + if (!warn) + errors ++; + } + } + } + } + + return (errors); +} + + +/* + * 'check_duplex()' - Check duplex keywords in the PPD file. + */ + +static int /* O - Errors found */ +check_duplex(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Error found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int i; /* Looping var */ + ppd_option_t *option; /* PPD option */ + ppd_choice_t *choice; /* Current choice */ + const char *prefix; /* Message prefix */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + /* + * Check for a duplex option, and for standard values... + */ + + if ((option = ppdFindOption(ppd, "Duplex")) != NULL) + { + if (!ppdFindChoice(option, "None")) + { + if (verbose >= 0) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s REQUIRED %s does not define " + "choice None.\n" + " REF: Page 122, section 5.17"), + prefix, option->keyword); + } + + if (!warn) + errors ++; + } + + for (i = option->num_choices, choice = option->choices; + i > 0; + i --, choice ++) + if (strcmp(choice->choice, "None") && + strcmp(choice->choice, "DuplexNoTumble") && + strcmp(choice->choice, "DuplexTumble") && + strcmp(choice->choice, "SimplexTumble")) + { + if (verbose >= 0) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + _cupsLangPrintf(stdout, + _(" %s Bad %s choice %s.\n" + " REF: Page 122, section 5.17"), + prefix, option->keyword, choice->choice); + } + + if (!warn) + errors ++; + } + } + + return (errors); +} + + +/* + * 'check_filters()' - Check filters in the PPD file. + */ + +static int /* O - Errors found */ +check_filters(ppd_file_t *ppd, /* I - PPD file */ + const char *root, /* I - Root directory */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + ppd_attr_t *attr; /* PPD attribute */ + const char *ptr; /* Pointer into string */ + char super[16], /* Super-type for filter */ + type[256], /* Type for filter */ + dstsuper[16], /* Destination super-type for filter */ + dsttype[256], /* Destination type for filter */ + program[1024], /* Program/filter name */ + pathprog[1024]; /* Complete path to program/filter */ + int cost; /* Cost of filter */ + const char *prefix; /* WARN/FAIL prefix */ + struct stat fileinfo; /* File information */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + /* + * cupsFilter + */ + + for (attr = ppdFindAttr(ppd, "cupsFilter", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsFilter", NULL)) + { + if (strcmp(attr->name, "cupsFilter")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "cupsFilter"); + + if (!warn) + errors ++; + } + + if (!attr->value || + sscanf(attr->value, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, + &cost, program) != 4) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad cupsFilter value \"%s\"."), + prefix, attr->value); + + if (!warn) + errors ++; + } + else if (strcmp(program, "-")) + { + if (program[0] == '/') + snprintf(pathprog, sizeof(pathprog), "%s%s", root, program); + else + { + if ((ptr = getenv("CUPS_SERVERBIN")) == NULL) + ptr = CUPS_SERVERBIN; + + if (*ptr == '/' || !*root) + snprintf(pathprog, sizeof(pathprog), "%s%s/filter/%s", root, ptr, + program); + else + snprintf(pathprog, sizeof(pathprog), "%s/%s/filter/%s", root, ptr, + program); + } + + if (stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "cupsFilter", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_PROGRAM) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "cupsFilter", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("cupsFilter", pathprog, errors, verbose, warn); + } + } + + /* + * cupsFilter2 + */ + + for (attr = ppdFindAttr(ppd, "cupsFilter2", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsFilter2", NULL)) + { + if (strcmp(attr->name, "cupsFilter2")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "cupsFilter2"); + + if (!warn) + errors ++; + } + + if (!attr->value || + sscanf(attr->value, "%15[^/]/%255s%*[ \t]%15[^/]/%255s%d%*[ \t]%1023[^\n]", + super, type, dstsuper, dsttype, &cost, program) != 6) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad cupsFilter2 value \"%s\"."), + prefix, attr->value); + + if (!warn) + errors ++; + } + else if (strcmp(program, "-")) + { + if (strncmp(program, "maxsize(", 8) && + (ptr = strchr(program + 8, ')')) != NULL) + { + ptr ++; + while (_cups_isspace(*ptr)) + ptr ++; + + _cups_strcpy(program, ptr); + } + + if (program[0] == '/') + snprintf(pathprog, sizeof(pathprog), "%s%s", root, program); + else + { + if ((ptr = getenv("CUPS_SERVERBIN")) == NULL) + ptr = CUPS_SERVERBIN; + + if (*ptr == '/' || !*root) + snprintf(pathprog, sizeof(pathprog), "%s%s/filter/%s", root, ptr, + program); + else + snprintf(pathprog, sizeof(pathprog), "%s/%s/filter/%s", root, ptr, + program); + } + + if (stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "cupsFilter2", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_PROGRAM) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "cupsFilter2", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("cupsFilter2", pathprog, errors, verbose, warn); + } + } + + /* + * cupsPreFilter + */ + + for (attr = ppdFindAttr(ppd, "cupsPreFilter", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsPreFilter", NULL)) + { + if (strcmp(attr->name, "cupsPreFilter")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "cupsPreFilter"); + + if (!warn) + errors ++; + } + + if (!attr->value || + sscanf(attr->value, "%15[^/]/%255s%d%*[ \t]%1023[^\n]", super, type, + &cost, program) != 4) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad cupsPreFilter value \"%s\"."), + prefix, attr->value ? attr->value : ""); + + if (!warn) + errors ++; + } + else if (strcmp(program, "-")) + { + if (program[0] == '/') + snprintf(pathprog, sizeof(pathprog), "%s%s", root, program); + else + { + if ((ptr = getenv("CUPS_SERVERBIN")) == NULL) + ptr = CUPS_SERVERBIN; + + if (*ptr == '/' || !*root) + snprintf(pathprog, sizeof(pathprog), "%s%s/filter/%s", root, ptr, + program); + else + snprintf(pathprog, sizeof(pathprog), "%s/%s/filter/%s", root, ptr, + program); + } + + if (stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "cupsPreFilter", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_PROGRAM) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "cupsPreFilter", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("cupsPreFilter", pathprog, errors, verbose, warn); + } + } + +#ifdef __APPLE__ + /* + * APDialogExtension + */ + + for (attr = ppdFindAttr(ppd, "APDialogExtension", NULL); + attr != NULL; + attr = ppdFindNextAttr(ppd, "APDialogExtension", NULL)) + { + if (strcmp(attr->name, "APDialogExtension")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "APDialogExtension"); + + if (!warn) + errors ++; + } + + snprintf(pathprog, sizeof(pathprog), "%s%s", root, + attr->value ? attr->value : "(null)"); + + if (!attr->value || stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "APDialogExtension", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DIRECTORY) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "APDialogExtension", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("APDialogExtension", pathprog, errors, verbose, + warn); + } + + /* + * APPrinterIconPath + */ + + if ((attr = ppdFindAttr(ppd, "APPrinterIconPath", NULL)) != NULL) + { + if (strcmp(attr->name, "APPrinterIconPath")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "APPrinterIconPath"); + + if (!warn) + errors ++; + } + + snprintf(pathprog, sizeof(pathprog), "%s%s", root, + attr->value ? attr->value : "(null)"); + + if (!attr->value || stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "APPrinterIconPath", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DATAFILE) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "APPrinterIconPath", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("APPrinterIconPath", pathprog, errors, verbose, + warn); + } + + /* + * APPrinterLowInkTool + */ + + if ((attr = ppdFindAttr(ppd, "APPrinterLowInkTool", NULL)) != NULL) + { + if (strcmp(attr->name, "APPrinterLowInkTool")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "APPrinterLowInkTool"); + + if (!warn) + errors ++; + } + + snprintf(pathprog, sizeof(pathprog), "%s%s", root, + attr->value ? attr->value : "(null)"); + + if (!attr->value || stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "APPrinterLowInkTool", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DIRECTORY) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "APPrinterLowInkTool", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("APPrinterLowInkTool", pathprog, errors, verbose, + warn); + } + + /* + * APPrinterUtilityPath + */ + + if ((attr = ppdFindAttr(ppd, "APPrinterUtilityPath", NULL)) != NULL) + { + if (strcmp(attr->name, "APPrinterUtilityPath")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "APPrinterUtilityPath"); + + if (!warn) + errors ++; + } + + snprintf(pathprog, sizeof(pathprog), "%s%s", root, + attr->value ? attr->value : "(null)"); + + if (!attr->value || stat(pathprog, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "APPrinterUtilityPath", pathprog); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DIRECTORY) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "APPrinterUtilityPath", pathprog); + + if (!warn) + errors ++; + } + else + errors = valid_path("APPrinterUtilityPath", pathprog, errors, verbose, + warn); + } + + /* + * APScanAppBundleID and APScanAppPath + */ + + if ((attr = ppdFindAttr(ppd, "APScanAppPath", NULL)) != NULL) + { + if (strcmp(attr->name, "APScanAppPath")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad spelling of %s - should be %s."), + prefix, attr->name, "APScanAppPath"); + + if (!warn) + errors ++; + } + + if (!attr->value || stat(attr->value, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "APScanAppPath", + attr->value ? attr->value : ""); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DIRECTORY) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "APScanAppPath", attr->value); + + if (!warn) + errors ++; + } + else + errors = valid_path("APScanAppPath", attr->value, errors, verbose, + warn); + + if (ppdFindAttr(ppd, "APScanAppBundleID", NULL)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Cannot provide both " + "APScanAppPath and APScanAppBundleID."), + prefix); + + if (!warn) + errors ++; + } + } +#endif /* __APPLE__ */ + + return (errors); +} + + +/* + * 'check_profiles()' - Check ICC color profiles in the PPD file. + */ + +static int /* O - Errors found */ +check_profiles(ppd_file_t *ppd, /* I - PPD file */ + const char *root, /* I - Root directory */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int i; /* Looping var */ + ppd_attr_t *attr; /* PPD attribute */ + const char *ptr; /* Pointer into string */ + const char *prefix; /* WARN/FAIL prefix */ + char filename[1024]; /* Profile filename */ + struct stat fileinfo; /* File information */ + int num_profiles = 0; /* Number of profiles */ + unsigned hash, /* Current hash value */ + hashes[1000]; /* Hash values of profile names */ + const char *specs[1000]; /* Specifiers for profiles */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + for (attr = ppdFindAttr(ppd, "cupsICCProfile", NULL); + attr; + attr = ppdFindNextAttr(ppd, "cupsICCProfile", NULL)) + { + /* + * Check for valid selector... + */ + + for (i = 0, ptr = strchr(attr->spec, '.'); ptr; ptr = strchr(ptr + 1, '.')) + i ++; + + if (!attr->value || i < 2) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad cupsICCProfile %s."), + prefix, attr->spec); + + if (!warn) + errors ++; + + continue; + } + + /* + * Check for valid profile filename... + */ + + if (attr->value[0] == '/') + snprintf(filename, sizeof(filename), "%s%s", root, attr->value); + else + { + if ((ptr = getenv("CUPS_DATADIR")) == NULL) + ptr = CUPS_DATADIR; + + if (*ptr == '/' || !*root) + snprintf(filename, sizeof(filename), "%s%s/profiles/%s", root, ptr, + attr->value); + else + snprintf(filename, sizeof(filename), "%s/%s/profiles/%s", root, ptr, + attr->value); + } + + if (stat(filename, &fileinfo)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, _(" %s Missing %s file \"%s\"."), + prefix, "cupsICCProfile", filename); + + if (!warn) + errors ++; + } + else if (fileinfo.st_uid != 0 || + (fileinfo.st_mode & MODE_WRITE) || + (fileinfo.st_mode & MODE_MASK) != MODE_DATAFILE) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad permissions on %s file \"%s\"."), + prefix, "cupsICCProfile", filename); + + if (!warn) + errors ++; + } + else + errors = valid_path("cupsICCProfile", filename, errors, verbose, warn); + + /* + * Check for hash collisions... + */ + + hash = _ppdHashName(attr->spec); + + if (num_profiles > 0) + { + for (i = 0; i < num_profiles; i ++) + if (hashes[i] == hash) + break; + + if (i < num_profiles) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s cupsICCProfile %s hash value " + "collides with %s."), prefix, attr->spec, + specs[i]); + + if (!warn) + errors ++; + } + } + + /* + * Remember up to 1000 profiles... + */ + + if (num_profiles < 1000) + { + hashes[num_profiles] = hash; + specs[num_profiles] = attr->spec; + num_profiles ++; + } + } + + return (errors); +} + + +/* + * 'check_sizes()' - Check media sizes in the PPD file. + */ + +static int /* O - Errors found */ +check_sizes(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int i; /* Looping var */ + ppd_size_t *size; /* Current size */ + int width, /* Custom width */ + length; /* Custom length */ + const char *prefix; /* WARN/FAIL prefix */ + ppd_option_t *page_size, /* PageSize option */ + *page_region; /* PageRegion option */ + _pwg_media_t *pwg_media; /* PWG media */ + char buf[1024]; /* PapeSize name that is supposed to be */ + const char *ptr; /* Pointer into string */ + int width_2540ths, /* PageSize width in 2540ths */ + length_2540ths; /* PageSize length in 2540ths */ + int is_ok; /* Flag for PageSize name verification */ + double width_tmp, /* Width after rounded up */ + length_tmp, /* Length after rounded up */ + width_inch, /* Width in inches */ + length_inch, /* Length in inches */ + width_mm, /* Width in millimeters */ + length_mm; /* Length in millimeters */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + if ((page_size = ppdFindOption(ppd, "PageSize")) == NULL && warn != 2) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Missing REQUIRED PageSize option.\n" + " REF: Page 99, section 5.14."), + prefix); + + if (!warn) + errors ++; + } + + if ((page_region = ppdFindOption(ppd, "PageRegion")) == NULL && warn != 2) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Missing REQUIRED PageRegion option.\n" + " REF: Page 100, section 5.14."), + prefix); + + if (!warn) + errors ++; + } + + for (i = ppd->num_sizes, size = ppd->sizes; i > 0; i --, size ++) + { + /* + * Check that the size name is standard... + */ + + if (!strcmp(size->name, "Custom")) + { + /* + * Skip custom page size... + */ + + continue; + } + + if (warn != 2 && size->name[0] == 'w' && + sscanf(size->name, "w%dh%d", &width, &length) == 2) + { + /* + * Validate device-specific size wNNNhNNN should have proper width and + * length... + */ + + if (fabs(width - size->width) >= 1.0 || + fabs(length - size->length) >= 1.0) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Size \"%s\" has unexpected dimensions " + "(%gx%g)."), + prefix, size->name, size->width, size->length); + + if (!warn) + errors ++; + } + } + + /* + * Verify that the size is defined for both PageSize and PageRegion... + */ + + if (warn != 2 && !ppdFindChoice(page_size, size->name)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Size \"%s\" defined for %s but not for " + "%s."), + prefix, size->name, "PageRegion", "PageSize"); + + if (!warn) + errors ++; + } + else if (warn != 2 && !ppdFindChoice(page_region, size->name)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Size \"%s\" defined for %s but not for " + "%s."), + prefix, size->name, "PageSize", "PageRegion"); + + if (!warn) + errors ++; + } + + /* + * Verify that the size name is Adobe standard name if it's a standard size + * and the dimentional name if it's not a standard size. Suffix should be + * .Fullbleed, etc., or numeric, e.g., Letter, Letter.Fullbleed, + * Letter.Transverse, Letter1, Letter2, 4x8, 55x91mm, 55x91mm.Fullbleed, etc. + */ + + if (warn != 0) + { + is_ok = 1; + width_2540ths = (size->length > size->width) ? + _PWG_FROMPTS(size->width) : + _PWG_FROMPTS(size->length); + length_2540ths = (size->length > size->width) ? + _PWG_FROMPTS(size->length) : + _PWG_FROMPTS(size->width); + pwg_media = _pwgMediaForSize(width_2540ths, length_2540ths); + + if (pwg_media && pwg_media->ppd) + { + size_t ppdlen = strlen(pwg_media->ppd); + /* Length of standard PPD name */ + + strlcpy(buf, pwg_media->ppd, sizeof(buf)); + + if (size->left == 0 && size->bottom == 0 && + size->right == size->width && size->top == size->length) + { + snprintf(buf, sizeof(buf), "%s.Fullbleed", pwg_media->ppd); + if (_cups_strcasecmp(size->name, buf)) + { + /* + * Allow an additional qualifier such as ".WithTab"... + */ + + size_t buflen = strlen(buf);/* Length of full bleed name */ + + if (_cups_strncasecmp(size->name, buf, buflen) || + size->name[buflen] != '.') + is_ok = 0; + } + } + else if (strcmp(size->name, buf) && size->width > size->length) + { + if (!strcmp(pwg_media->ppd, "DoublePostcardRotated")) + strlcpy(buf, "DoublePostcard", sizeof(buf)); + else + snprintf(buf, sizeof(buf), "%sRotated", pwg_media->ppd); + + if (strcmp(size->name, buf)) + { + snprintf(buf, sizeof(buf), "%s.Transverse", pwg_media->ppd); + if (strcmp(size->name, buf)) + is_ok = 0; + } + } + else if (!strncmp(size->name, pwg_media->ppd, ppdlen)) + { + /* + * Check for a proper qualifier (number, "Small", or .something)... + */ + + ptr = size->name + ppdlen; + + if (isdigit(*ptr & 255)) + { + for (ptr ++; *ptr; ptr ++) + { + if (!isdigit(*ptr & 255)) + { + is_ok = 0; + break; + } + } + } + else if (*ptr != '.' && *ptr && strcmp(ptr, "Small")) + is_ok = 0; + } + else + { + /* + * Check for EnvSizeName as well... + */ + + if (strncmp(pwg_media->ppd, "Env", 3)) + snprintf(buf, sizeof(buf), "Env%s", pwg_media->ppd); + + if (strcmp(size->name, buf)) + is_ok = 0; + } + + if (!is_ok) + _cupsLangPrintf(stdout, + _(" %s Size \"%s\" should be the Adobe " + "standard name \"%s\"."), + prefix, size->name, buf); + } + else + { + width_tmp = (fabs(size->width - ceil(size->width)) < 0.1) ? + ceil(size->width) : size->width; + length_tmp = (fabs(size->length - ceil(size->length)) < 0.1) ? + ceil(size->length) : size->length; + + if (fmod(width_tmp, 18.0) == 0.0 || fmod(length_tmp, 18.0) == 0.0) + { + width_inch = width_tmp / 72.0; + length_inch = length_tmp / 72.0; + + snprintf(buf, sizeof(buf), "%gx%g", width_inch, length_inch); + } + else + { + width_mm = size->width / 72.0 * 25.4; + length_mm = size->length / 72.0 * 25.4; + + snprintf(buf, sizeof(buf), "%.0fx%.0fmm", width_mm, length_mm); + } + + if (size->left == 0 && size->bottom == 0 && + size->right == size->width && size->top == size->length) + strlcat(buf, ".Fullbleed", sizeof(buf)); + else if (size->width > size->length) + strlcat(buf, ".Transverse", sizeof(buf)); + + if (_cups_strcasecmp(size->name, buf)) + { + size_t buflen = strlen(buf); /* Length of proposed name */ + + if (_cups_strncasecmp(size->name, buf, buflen) || + strcmp(size->name + buflen, "in")) + _cupsLangPrintf(stdout, + _(" %s Size \"%s\" should be \"%s\"."), + prefix, size->name, buf); + } + } + } + } + + return (errors); +} + + +/* + * 'check_translations()' - Check translations in the PPD file. + */ + +static int /* O - Errors found */ +check_translations(ppd_file_t *ppd, /* I - PPD file */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + int j; /* Looping var */ + ppd_attr_t *attr; /* PPD attribute */ + cups_array_t *languages; /* Array of languages */ + int langlen; /* Length of language */ + char *language, /* Current language */ + keyword[PPD_MAX_NAME], /* Localization keyword (full) */ + llkeyword[PPD_MAX_NAME],/* Localization keyword (base) */ + ckeyword[PPD_MAX_NAME], /* Custom option keyword (full) */ + cllkeyword[PPD_MAX_NAME]; + /* Custom option keyword (base) */ + ppd_option_t *option; /* Standard UI option */ + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + char ll[3]; /* Base language */ + const char *prefix; /* WARN/FAIL prefix */ + const char *text; /* Pointer into UI text */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + if ((languages = _ppdGetLanguages(ppd)) != NULL) + { + /* + * This file contains localizations, check them... + */ + + for (language = (char *)cupsArrayFirst(languages); + language; + language = (char *)cupsArrayNext(languages)) + { + langlen = (int)strlen(language); + if (langlen != 2 && langlen != 5) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad language \"%s\"."), + prefix, language); + + if (!warn) + errors ++; + + continue; + } + + if (!strcmp(language, "en")) + continue; + + strlcpy(ll, language, sizeof(ll)); + + /* + * Loop through all options and choices... + */ + + for (option = ppdFirstOption(ppd); + option; + option = ppdNextOption(ppd)) + { + if (!strcmp(option->keyword, "PageRegion")) + continue; + + snprintf(keyword, sizeof(keyword), "%s.Translation", language); + snprintf(llkeyword, sizeof(llkeyword), "%s.Translation", ll); + + if ((attr = ppdFindAttr(ppd, keyword, option->keyword)) == NULL && + (attr = ppdFindAttr(ppd, llkeyword, option->keyword)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Missing \"%s\" translation " + "string for option %s."), + prefix, language, option->keyword); + + if (!warn) + errors ++; + } + else if (!valid_utf8(attr->text)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad UTF-8 \"%s\" translation " + "string for option %s."), + prefix, language, option->keyword); + + if (!warn) + errors ++; + } + + snprintf(keyword, sizeof(keyword), "%s.%s", language, + option->keyword); + snprintf(llkeyword, sizeof(llkeyword), "%s.%s", ll, + option->keyword); + + for (j = 0; j < option->num_choices; j ++) + { + /* + * First see if this choice is a number; if so, don't require + * translation... + */ + + for (text = option->choices[j].text; *text; text ++) + if (!strchr("0123456789-+.", *text)) + break; + + if (!*text) + continue; + + /* + * Check custom choices differently... + */ + + if (!_cups_strcasecmp(option->choices[j].choice, "Custom") && + (coption = ppdFindCustomOption(ppd, + option->keyword)) != NULL) + { + snprintf(ckeyword, sizeof(ckeyword), "%s.Custom%s", + language, option->keyword); + + if ((attr = ppdFindAttr(ppd, ckeyword, "True")) != NULL && + !valid_utf8(attr->text)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad UTF-8 \"%s\" " + "translation string for option %s, " + "choice %s."), + prefix, language, + ckeyword + 1 + strlen(language), + "True"); + + if (!warn) + errors ++; + } + + if (_cups_strcasecmp(option->keyword, "PageSize")) + { + for (cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + cparam; + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params)) + { + snprintf(ckeyword, sizeof(ckeyword), "%s.ParamCustom%s", + language, option->keyword); + snprintf(cllkeyword, sizeof(cllkeyword), "%s.ParamCustom%s", + ll, option->keyword); + + if ((attr = ppdFindAttr(ppd, ckeyword, + cparam->name)) == NULL && + (attr = ppdFindAttr(ppd, cllkeyword, + cparam->name)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Missing \"%s\" " + "translation string for option %s, " + "choice %s."), + prefix, language, + ckeyword + 1 + strlen(language), + cparam->name); + + if (!warn) + errors ++; + } + else if (!valid_utf8(attr->text)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad UTF-8 \"%s\" " + "translation string for option %s, " + "choice %s."), + prefix, language, + ckeyword + 1 + strlen(language), + cparam->name); + + if (!warn) + errors ++; + } + } + } + } + else if ((attr = ppdFindAttr(ppd, keyword, + option->choices[j].choice)) == NULL && + (attr = ppdFindAttr(ppd, llkeyword, + option->choices[j].choice)) == NULL) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Missing \"%s\" " + "translation string for option %s, " + "choice %s."), + prefix, language, option->keyword, + option->choices[j].choice); + + if (!warn) + errors ++; + } + else if (!valid_utf8(attr->text)) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s Bad UTF-8 \"%s\" " + "translation string for option %s, " + "choice %s."), + prefix, language, option->keyword, + option->choices[j].choice); + + if (!warn) + errors ++; + } + } + } + } + + /* + * Verify that we have the base language for each localized one... + */ + + for (language = (char *)cupsArrayFirst(languages); + language; + language = (char *)cupsArrayNext(languages)) + if (language[2]) + { + /* + * Lookup the base language... + */ + + cupsArraySave(languages); + + strlcpy(ll, language, sizeof(ll)); + + if (!cupsArrayFind(languages, ll) && + strcmp(ll, "zh") && strcmp(ll, "en")) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s No base translation \"%s\" " + "is included in file."), prefix, ll); + + if (!warn) + errors ++; + } + + cupsArrayRestore(languages); + } + + /* + * Free memory used for the languages... + */ + + _ppdFreeLanguages(languages); + } + + return (errors); +} + + +/* + * 'show_conflicts()' - Show option conflicts in a PPD file. + */ + +static void +show_conflicts(ppd_file_t *ppd, /* I - PPD to check */ + const char *prefix) /* I - Prefix string */ +{ + int i, j; /* Looping variables */ + ppd_const_t *c; /* Current constraint */ + ppd_option_t *o1, *o2; /* Options */ + ppd_choice_t *c1, *c2; /* Choices */ + + + /* + * Loop through all of the UI constraints and report any options + * that conflict... + */ + + for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++) + { + /* + * Grab pointers to the first option... + */ + + o1 = ppdFindOption(ppd, c->option1); + + if (o1 == NULL) + continue; + else if (c->choice1[0] != '\0') + { + /* + * This constraint maps to a specific choice. + */ + + c1 = ppdFindChoice(o1, c->choice1); + } + else + { + /* + * This constraint applies to any choice for this option. + */ + + for (j = o1->num_choices, c1 = o1->choices; j > 0; j --, c1 ++) + if (c1->marked) + break; + + if (j == 0 || + !_cups_strcasecmp(c1->choice, "None") || + !_cups_strcasecmp(c1->choice, "Off") || + !_cups_strcasecmp(c1->choice, "False")) + c1 = NULL; + } + + /* + * Grab pointers to the second option... + */ + + o2 = ppdFindOption(ppd, c->option2); + + if (o2 == NULL) + continue; + else if (c->choice2[0] != '\0') + { + /* + * This constraint maps to a specific choice. + */ + + c2 = ppdFindChoice(o2, c->choice2); + } + else + { + /* + * This constraint applies to any choice for this option. + */ + + for (j = o2->num_choices, c2 = o2->choices; j > 0; j --, c2 ++) + if (c2->marked) + break; + + if (j == 0 || + !_cups_strcasecmp(c2->choice, "None") || + !_cups_strcasecmp(c2->choice, "Off") || + !_cups_strcasecmp(c2->choice, "False")) + c2 = NULL; + } + + /* + * If both options are marked then there is a conflict... + */ + + if (c1 != NULL && c1->marked && c2 != NULL && c2->marked) + _cupsLangPrintf(stdout, + _(" %s \"%s %s\" conflicts with \"%s %s\"\n" + " (constraint=\"%s %s %s %s\")."), + prefix, o1->keyword, c1->choice, o2->keyword, c2->choice, + c->option1, c->choice1, c->option2, c->choice2); + } +} + + +/* + * 'test_raster()' - Test PostScript commands for raster printers. + */ + +static int /* O - 1 on success, 0 on failure */ +test_raster(ppd_file_t *ppd, /* I - PPD file */ + int verbose) /* I - Verbosity */ +{ + cups_page_header2_t header; /* Page header */ + + + ppdMarkDefaults(ppd); + if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, 0)) + { + if (!verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Default option code cannot be " + "interpreted: %s"), cupsRasterErrorString()); + + return (0); + } + + /* + * Try a test of custom page size code, if available... + */ + + if (!ppdPageSize(ppd, "Custom.612x792")) + return (1); + + ppdMarkOption(ppd, "PageSize", "Custom.612x792"); + + if (cupsRasterInterpretPPD(&header, ppd, 0, NULL, 0)) + { + if (!verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" **FAIL** Default option code cannot be " + "interpreted: %s"), cupsRasterErrorString()); + + return (0); + } + + return (1); +} + + +/* + * 'usage()' - Show program usage. + */ + +static void +usage(void) +{ + _cupsLangPuts(stdout, _("Usage: cupstestppd [options] filename1.ppd[.gz] " + "[... filenameN.ppd[.gz]]")); + _cupsLangPuts(stdout, _(" program | cupstestppd [options] -")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _("Options:")); + _cupsLangPuts(stdout, ""); + _cupsLangPuts(stdout, _(" -I {filename,filters,none,profiles}")); + _cupsLangPuts(stdout, _(" Ignore specific warnings.")); + _cupsLangPuts(stdout, _(" -R root-directory Set alternate root.")); + _cupsLangPuts(stdout, _(" -W {all,none,constraints,defaults,duplex," + "filters,profiles,sizes,translations}")); + _cupsLangPuts(stdout, _(" Issue warnings instead of " + "errors.")); + _cupsLangPuts(stdout, _(" -q Run silently.")); + _cupsLangPuts(stdout, _(" -r Use 'relaxed' open mode.")); + _cupsLangPuts(stdout, _(" -v Be slightly verbose.")); + _cupsLangPuts(stdout, _(" -vv Be very verbose.")); + + exit(ERROR_USAGE); +} + + +/* + * 'valid_path()' - Check whether a path has the correct capitalization. + */ + +static int /* O - Errors found */ +valid_path(const char *keyword, /* I - Keyword using path */ + const char *path, /* I - Path to check */ + int errors, /* I - Errors found */ + int verbose, /* I - Verbosity level */ + int warn) /* I - Warnings only? */ +{ + cups_dir_t *dir; /* Current directory */ + cups_dentry_t *dentry; /* Current directory entry */ + char temp[1024], /* Temporary path */ + *ptr; /* Pointer into temporary path */ + const char *prefix; /* WARN/FAIL prefix */ + + + prefix = warn ? " WARN " : "**FAIL**"; + + /* + * Loop over the components of the path, checking that the entry exists with + * the same capitalization... + */ + + strlcpy(temp, path, sizeof(temp)); + + while ((ptr = strrchr(temp, '/')) != NULL) + { + /* + * Chop off the trailing component so temp == dirname and ptr == basename. + */ + + *ptr++ = '\0'; + + /* + * Try opening the directory containing the base name... + */ + + if (temp[0]) + dir = cupsDirOpen(temp); + else + dir = cupsDirOpen("/"); + + if (!dir) + dentry = NULL; + else + { + while ((dentry = cupsDirRead(dir)) != NULL) + { + if (!strcmp(dentry->filename, ptr)) + break; + } + + cupsDirClose(dir); + } + + /* + * Display an error if the filename doesn't exist with the same + * capitalization... + */ + + if (!dentry) + { + if (!warn && !errors && !verbose) + _cupsLangPuts(stdout, _(" FAIL")); + + if (verbose >= 0) + _cupsLangPrintf(stdout, + _(" %s %s file \"%s\" has the wrong " + "capitalization."), prefix, keyword, path); + + if (!warn) + errors ++; + + break; + } + } + + return (errors); +} + + +/* + * 'valid_utf8()' - Check whether a string contains valid UTF-8 text. + */ + +static int /* O - 1 if valid, 0 if not */ +valid_utf8(const char *s) /* I - String to check */ +{ + while (*s) + { + if (*s & 0x80) + { + /* + * Check for valid UTF-8 sequence... + */ + + if ((*s & 0xc0) == 0x80) + return (0); /* Illegal suffix byte */ + else if ((*s & 0xe0) == 0xc0) + { + /* + * 2-byte sequence... + */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + } + else if ((*s & 0xf0) == 0xe0) + { + /* + * 3-byte sequence... + */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + } + else if ((*s & 0xf8) == 0xf0) + { + /* + * 4-byte sequence... + */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + + s ++; + + if ((*s & 0xc0) != 0x80) + return (0); /* Missing suffix byte */ + } + else + return (0); /* Bad sequence */ + } + + s ++; + } + + return (1); +} + + +/* + * End of "$Id: cupstestppd.c 10362 2012-03-19 15:31:53Z mike $". + */ diff --git a/systemv/lp.c b/systemv/lp.c new file mode 100644 index 0000000..af47132 --- /dev/null +++ b/systemv/lp.c @@ -0,0 +1,723 @@ +/* + * "$Id: lp.c 9636 2011-03-21 22:02:00Z mike $" + * + * "lp" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and send files for printing. + * restart_job() - Restart a job. + * set_job_attrs() - Set job attributes. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions. + */ + +int restart_job(const char *command, int job_id); +int set_job_attrs(const char *command, int job_id, int num_options, + cups_option_t *options); + + +/* + * 'main()' - Parse options and send files for printing. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j; /* Looping vars */ + int job_id; /* Job ID */ + char *printer, /* Printer name */ + *instance, /* Instance name */ + *val, /* Option value */ + *title; /* Job title */ + int priority; /* Job priority (1-100) */ + int num_copies; /* Number of copies per file */ + int num_files; /* Number of files to print */ + const char *files[1000]; /* Files to print */ + cups_dest_t *dest; /* Selected destination */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + int end_options; /* No more options? */ + int silent; /* Silent or verbose output? */ + char buffer[8192]; /* Copy buffer */ + + +#ifdef __sun + /* + * Solaris does some rather strange things to re-queue remote print + * jobs. On bootup, the "lp" command is run as "printd" to re-spool + * any remote jobs in /var/spool/print. Since CUPS doesn't need this + * nonsense, we just need to add the necessary check here to prevent + * lp from causing boot problems... + */ + + if ((val = strrchr(argv[0], '/')) != NULL) + val ++; + else + val = argv[0]; + + if (!strcmp(val, "printd")) + return (0); +#endif /* __sun */ + + _cupsSetLocale(argv); + + silent = 0; + printer = NULL; + dest = NULL; + num_options = 0; + options = NULL; + num_files = 0; + title = NULL; + job_id = 0; + end_options = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-' && argv[i][1] && !end_options) + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after \"-U\" " + "option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'c' : /* Copy to spool dir (always enabled) */ + break; + + case 'd' : /* Destination printer or class */ + if (argv[i][2] != '\0') + printer = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected destination after " + "\"-d\" option."), argv[0]); + return (1); + } + + printer = argv[i]; + } + + if ((instance = strrchr(printer, '/')) != NULL) + *instance++ = '\0'; + + if ((dest = cupsGetNamedDest(NULL, printer, instance)) != NULL) + { + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, + options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + break; + + case 'f' : /* Form */ + if (!argv[i][2]) + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected form after \"-f\" " + "option."), + argv[0]); + return (1); + } + } + + _cupsLangPrintf(stderr, _("%s: Warning - form option ignored."), + argv[0]); + break; + + case 'h' : /* Destination host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), argv[0]); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + case 'i' : /* Change job */ + if (argv[i][2]) + val = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Expected job ID after \"-i\" option."), + argv[0]); + return (1); + } + + val = argv[i]; + } + + if (num_files > 0) + { + _cupsLangPrintf(stderr, + _("%s: Error - cannot print files and alter " + "jobs simultaneously."), argv[0]); + return (1); + } + + if (strrchr(val, '-') != NULL) + job_id = atoi(strrchr(val, '-') + 1); + else + job_id = atoi(val); + + if (job_id < 0) + { + _cupsLangPrintf(stderr, _("%s: Error - bad job ID."), argv[0]); + break; + } + break; + + case 'm' : /* Send email when job is done */ +#ifdef __sun + case 'p' : /* Notify on completion */ +#endif /* __sun */ + case 'w' : /* Write to console or email */ + { + char email[1024]; /* EMail address */ + + + snprintf(email, sizeof(email), "mailto:%s@%s", cupsUser(), + httpGetHostname(NULL, buffer, sizeof(buffer))); + num_options = cupsAddOption("notify-recipient-uri", email, + num_options, &options); + } + + silent = 1; + break; + + case 'n' : /* Number of copies */ + if (argv[i][2] != '\0') + num_copies = atoi(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected copies after " + "\"-n\" option."), argv[0]); + return (1); + } + + num_copies = atoi(argv[i]); + } + + sprintf(buffer, "%d", num_copies); + num_options = cupsAddOption("copies", buffer, num_options, + &options); + break; + + case 'o' : /* Option */ + if (argv[i][2] != '\0') + num_options = cupsParseOptions(argv[i] + 2, num_options, + &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected option=value after " + "\"-o\" option."), argv[0]); + return (1); + } + + num_options = cupsParseOptions(argv[i], num_options, &options); + } + break; + +#ifndef __sun + case 'p' : /* Queue priority */ +#endif /* !__sun */ + case 'q' : /* Queue priority */ + if (argv[i][2] != '\0') + priority = atoi(argv[i] + 2); + else + { + if ((i + 1) >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected priority after " + "\"-%c\" option."), argv[0], argv[i][1]); + return (1); + } + + i ++; + + priority = atoi(argv[i]); + } + + /* + * For 100% Solaris compatibility, need to add: + * + * priority = 99 * (39 - priority) / 39 + 1; + * + * However, to keep CUPS lp the same across all platforms + * we will break compatibility this far... + */ + + if (priority < 1 || priority > 100) + { + _cupsLangPrintf(stderr, + _("%s: Error - priority must be between 1 and " + "100."), argv[0]); + return (1); + } + + sprintf(buffer, "%d", priority); + num_options = cupsAddOption("job-priority", buffer, num_options, + &options); + break; + + case 's' : /* Silent */ + silent = 1; + break; + + case 't' : /* Title */ + if (argv[i][2] != '\0') + title = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected title after " + "\"-t\" option."), argv[0]); + return (1); + } + + title = argv[i]; + } + break; + + case 'y' : /* mode-list */ + if (!argv[i][2]) + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected mode list after " + "\"-y\" option."), argv[0]); + return (1); + } + } + + _cupsLangPrintf(stderr, + _("%s: Warning - mode option ignored."), argv[0]); + break; + + case 'H' : /* Hold job */ + if (argv[i][2]) + val = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hold name after " + "\"-H\" option."), argv[0]); + return (1); + } + + val = argv[i]; + } + + if (!strcmp(val, "hold")) + num_options = cupsAddOption("job-hold-until", "indefinite", + num_options, &options); + else if (!strcmp(val, "resume") || + !strcmp(val, "release")) + num_options = cupsAddOption("job-hold-until", "no-hold", + num_options, &options); + else if (!strcmp(val, "immediate")) + { + num_options = cupsAddOption("job-hold-until", "no-hold", + num_options, &options); + num_options = cupsAddOption("job-priority", "100", + num_options, &options); + } + else if (!strcmp(val, "restart")) + { + if (job_id < 1) + { + _cupsLangPrintf(stderr, + _("%s: Need job ID (\"-i jobid\") before " + "\"-H restart\"."), argv[0]); + return (1); + } + + if (restart_job(argv[0], job_id)) + return (1); + } + else + num_options = cupsAddOption("job-hold-until", val, + num_options, &options); + break; + + case 'P' : /* Page list */ + if (argv[i][2]) + val = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected page list after " + "\"-P\" option."), argv[0]); + return (1); + } + + val = argv[i]; + } + + num_options = cupsAddOption("page-ranges", val, num_options, + &options); + break; + + case 'S' : /* character set */ + if (!argv[i][2]) + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected character set after " + "\"-S\" option."), argv[0]); + return (1); + } + } + + _cupsLangPrintf(stderr, + _("%s: Warning - character set option ignored."), + argv[0]); + break; + + case 'T' : /* Content-Type */ + if (!argv[i][2]) + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected content type after " + "\"-T\" option."), argv[0]); + return (1); + } + } + + _cupsLangPrintf(stderr, + _("%s: Warning - content type option ignored."), + argv[0]); + break; + + case '-' : /* Stop processing options */ + end_options = 1; + break; + + default : + _cupsLangPrintf(stderr, _("%s: Error - unknown option \"%c\"."), + argv[0], argv[i][1]); + return (1); + } + else if (!strcmp(argv[i], "-")) + { + if (num_files || job_id) + { + _cupsLangPrintf(stderr, + _("%s: Error - cannot print from stdin if files or a " + "job ID are provided."), argv[0]); + return (1); + } + + break; + } + else if (num_files < 1000 && job_id == 0) + { + /* + * Print a file... + */ + + if (access(argv[i], R_OK) != 0) + { + _cupsLangPrintf(stderr, _("%s: Error - unable to access \"%s\" - %s"), + argv[0], argv[i], strerror(errno)); + return (1); + } + + files[num_files] = argv[i]; + num_files ++; + + if (title == NULL) + { + if ((title = strrchr(argv[i], '/')) != NULL) + title ++; + else + title = argv[i]; + } + } + else + _cupsLangPrintf(stderr, _("%s: Error - too many files - \"%s\"."), + argv[0], argv[i]); + + /* + * See if we are altering an existing job... + */ + + if (job_id) + return (set_job_attrs(argv[0], job_id, num_options, options)); + + /* + * See if we have any files to print; if not, print from stdin... + */ + + if (printer == NULL) + { + if ((dest = cupsGetNamedDest(NULL, NULL, NULL)) != NULL) + { + printer = dest->name; + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + } + + if (printer == NULL) + { + val = NULL; + + if ((printer = getenv("LPDEST")) == NULL) + { + if ((printer = getenv("PRINTER")) != NULL) + { + if (!strcmp(printer, "lp")) + printer = NULL; + else + val = "PRINTER"; + } + } + else + val = "LPDEST"; + + if (printer && !cupsGetNamedDest(NULL, printer, NULL)) + _cupsLangPrintf(stderr, + _("%s: Error - %s environment variable names " + "non-existent destination \"%s\"."), argv[0], val, + printer); + else if (cupsLastError() == IPP_NOT_FOUND) + _cupsLangPrintf(stderr, + _("%s: Error - no default destination available."), + argv[0]); + else + _cupsLangPrintf(stderr, _("%s: Error - scheduler not responding."), + argv[0]); + + return (1); + } + + if (num_files > 0) + job_id = cupsPrintFiles(printer, num_files, files, title, num_options, options); + else if ((job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, printer, + title ? title : "(stdin)", + num_options, options)) > 0) + { + http_status_t status; /* Write status */ + const char *format; /* Document format */ + ssize_t bytes; /* Bytes read */ + + + if (cupsGetOption("raw", num_options, options)) + format = CUPS_FORMAT_RAW; + else if ((format = cupsGetOption("document-format", num_options, + options)) == NULL) + format = CUPS_FORMAT_AUTO; + + status = cupsStartDocument(CUPS_HTTP_DEFAULT, printer, job_id, NULL, + format, 1); + + while (status == HTTP_CONTINUE && + (bytes = read(0, buffer, sizeof(buffer))) > 0) + status = cupsWriteRequestData(CUPS_HTTP_DEFAULT, buffer, bytes); + + if (status != HTTP_CONTINUE) + { + _cupsLangPrintf(stderr, _("%s: Error - unable to queue from stdin - %s."), + argv[0], httpStatus(status)); + return (1); + } + + if (cupsFinishDocument(CUPS_HTTP_DEFAULT, printer) != IPP_OK) + job_id = 0; + } + + if (job_id < 1) + { + _cupsLangPrintf(stderr, "%s: %s", argv[0], cupsLastErrorString()); + return (1); + } + else if (!silent) + _cupsLangPrintf(stdout, _("request id is %s-%d (%d file(s))"), + printer, job_id, num_files); + + return (0); +} + + +/* + * 'restart_job()' - Restart a job. + */ + +int /* O - Exit status */ +restart_job(const char *command, /* I - Command name */ + int job_id) /* I - Job ID */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* URI for job */ + + + request = ippNewRequest(IPP_RESTART_JOB); + + sprintf(uri, "ipp://localhost/jobs/%d", job_id); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "job-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'set_job_attrs()' - Set job attributes. + */ + +int /* O - Exit status */ +set_job_attrs(const char *command, /* I - Command name */ + int job_id, /* I - Job ID */ + int num_options,/* I - Number of options */ + cups_option_t *options) /* I - Options */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* URI for job */ + + + if (num_options == 0) + return (0); + + request = ippNewRequest(IPP_SET_JOB_ATTRIBUTES); + + sprintf(uri, "ipp://localhost/jobs/%d", job_id); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "job-uri", NULL, uri); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + cupsEncodeOptions(request, num_options, options); + + ippDelete(cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/jobs")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "%s: %s", command, cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * End of "$Id: lp.c 9636 2011-03-21 22:02:00Z mike $". + */ diff --git a/systemv/lpadmin.c b/systemv/lpadmin.c new file mode 100644 index 0000000..f51ec1e --- /dev/null +++ b/systemv/lpadmin.c @@ -0,0 +1,1521 @@ +/* + * "$Id: lpadmin.c 9793 2011-05-20 03:49:49Z mike $" + * + * "lpadmin" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and configure the scheduler. + * add_printer_to_class() - Add a printer to a class. + * default_printer() - Set the default printing destination. + * delete_printer() - Delete a printer from the system. + * delete_printer_from_class() - Delete a printer from a class. + * delete_printer_option() - Delete a printer option. + * enable_printer() - Enable a printer. + * get_printer_type() - Determine the printer type and URI. + * set_printer_options() - Set the printer options and/or file. + * validate_name() - Make sure the printer name only contains + * valid chars. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static int add_printer_to_class(http_t *http, char *printer, char *pclass); +static int default_printer(http_t *http, char *printer); +static int delete_printer(http_t *http, char *printer); +static int delete_printer_from_class(http_t *http, char *printer, + char *pclass); +static int delete_printer_option(http_t *http, char *printer, + char *option); +static int enable_printer(http_t *http, char *printer); +static cups_ptype_t get_printer_type(http_t *http, char *printer, char *uri, + size_t urisize); +static int set_printer_options(http_t *http, char *printer, + int num_options, cups_option_t *options, + char *file); +static int validate_name(const char *name); + + +/* + * 'main()' - Parse options and configure the scheduler. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + http_t *http; /* Connection to server */ + char *printer, /* Destination printer */ + *pclass, /* Printer class name */ + *val; /* Pointer to allow/deny value */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + char *file; /* New PPD file/interface script */ + + + _cupsSetLocale(argv); + + http = NULL; + printer = NULL; + num_options = 0; + options = NULL; + file = NULL; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'c' : /* Add printer to class */ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (printer == NULL) + { + _cupsLangPuts(stderr, + _("lpadmin: Unable to add a printer to the class:\n" + " You must specify a printer name " + "first.")); + return (1); + } + + if (argv[i][2]) + pclass = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected class name after \"-c\" " + "option.")); + return (1); + } + + pclass = argv[i]; + } + + if (!validate_name(pclass)) + { + _cupsLangPuts(stderr, + _("lpadmin: Class name can only contain printable " + "characters.")); + return (1); + } + + if (add_printer_to_class(http, printer, pclass)) + return (1); + break; + + case 'd' : /* Set as default destination */ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected printer name after \"-d\" " + "option.")); + return (1); + } + + printer = argv[i]; + } + + if (!validate_name(printer)) + { + _cupsLangPuts(stderr, + _("lpadmin: Printer name can only contain " + "printable characters.")); + return (1); + } + + if (default_printer(http, printer)) + return (1); + + i = argc; + break; + + case 'h' : /* Connect to host */ + if (http) + { + httpClose(http); + http = NULL; + } + + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected hostname after \"-h\" " + "option.")); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + case 'i' : /* Use the specified interface script */ + if (argv[i][2]) + file = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected interface after \"-i\" " + "option.")); + return (1); + } + + file = argv[i]; + } + break; + + case 'E' : /* Enable the printer */ + if (printer == NULL) + { +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + + if (http) + httpEncryption(http, HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + } + + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (enable_printer(http, printer)) + return (1); + break; + + case 'm' : /* Use the specified standard script/PPD file */ + if (argv[i][2]) + num_options = cupsAddOption("ppd-name", argv[i] + 2, num_options, + &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected model after \"-m\" " + "option.")); + return (1); + } + + num_options = cupsAddOption("ppd-name", argv[i], num_options, + &options); + } + break; + + case 'o' : /* Set option */ + if (argv[i][2]) + num_options = cupsParseOptions(argv[i] + 2, num_options, &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected name=value after \"-o\" " + "option.")); + return (1); + } + + num_options = cupsParseOptions(argv[i], num_options, &options); + } + break; + + case 'p' : /* Add/modify a printer */ + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected printer after \"-p\" " + "option.")); + return (1); + } + + printer = argv[i]; + } + + if (!validate_name(printer)) + { + _cupsLangPuts(stderr, + _("lpadmin: Printer name can only contain " + "printable characters.")); + return (1); + } + break; + + case 'r' : /* Remove printer from class */ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (printer == NULL) + { + _cupsLangPuts(stderr, + _("lpadmin: Unable to remove a printer from the " + "class:\n" + " You must specify a printer name " + "first.")); + return (1); + } + + if (argv[i][2]) + pclass = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected class after \"-r\" " + "option.")); + return (1); + } + + pclass = argv[i]; + } + + if (!validate_name(pclass)) + { + _cupsLangPuts(stderr, + _("lpadmin: Class name can only contain printable " + "characters.")); + return (1); + } + + if (delete_printer_from_class(http, printer, pclass)) + return (1); + break; + + case 'R' : /* Remove option */ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (printer == NULL) + { + _cupsLangPuts(stderr, + _("lpadmin: Unable to delete option:\n" + " You must specify a printer name " + "first.")); + return (1); + } + + if (argv[i][2]) + val = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected name after \"-R\" " + "option.")); + return (1); + } + + val = argv[i]; + } + + if (delete_printer_option(http, printer, val)) + return (1); + break; + + case 'U' : /* Username */ + if (argv[i][2] != '\0') + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'u' : /* Allow/deny users */ + if (argv[i][2]) + val = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected allow/deny:userlist after " + "\"-u\" option.")); + return (1); + } + + val = argv[i]; + } + + if (!_cups_strncasecmp(val, "allow:", 6)) + num_options = cupsAddOption("requesting-user-name-allowed", + val + 6, num_options, &options); + else if (!_cups_strncasecmp(val, "deny:", 5)) + num_options = cupsAddOption("requesting-user-name-denied", + val + 5, num_options, &options); + else + { + _cupsLangPrintf(stderr, + _("lpadmin: Unknown allow/deny option \"%s\"."), + val); + return (1); + } + break; + + case 'v' : /* Set the device-uri attribute */ + if (argv[i][2]) + num_options = cupsAddOption("device-uri", argv[i] + 2, + num_options, &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected device URI after \"-v\" " + "option.")); + return (1); + } + + num_options = cupsAddOption("device-uri", argv[i], + num_options, &options); + } + break; + + case 'x' : /* Delete a printer */ + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected printer or class after " + "\"-x\" option.")); + return (1); + } + + printer = argv[i]; + } + + if (!validate_name(printer)) + { + _cupsLangPuts(stderr, + _("lpadmin: Printer name can only contain " + "printable characters.")); + return (1); + } + + if (delete_printer(http, printer)) + return (1); + + i = argc; + break; + + case 'D' : /* Set the printer-info attribute */ + if (argv[i][2]) + num_options = cupsAddOption("printer-info", argv[i] + 2, + num_options, &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected description after " + "\"-D\" option.")); + return (1); + } + + num_options = cupsAddOption("printer-info", argv[i], + num_options, &options); + } + break; + + case 'I' : /* Set the supported file types (ignored) */ + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected file type(s) after \"-I\" " + "option.")); + return (1); + } + + _cupsLangPuts(stderr, + _("lpadmin: Warning - content type list ignored.")); + break; + + case 'L' : /* Set the printer-location attribute */ + if (argv[i][2]) + num_options = cupsAddOption("printer-location", argv[i] + 2, + num_options, &options); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected location after \"-L\" " + "option.")); + return (1); + } + + num_options = cupsAddOption("printer-location", argv[i], + num_options, &options); + } + break; + + case 'P' : /* Use the specified PPD file */ + if (argv[i][2]) + file = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("lpadmin: Expected PPD after \"-P\" option.")); + return (1); + } + + file = argv[i]; + } + break; + + default : + _cupsLangPrintf(stderr, + _("lpadmin: Unknown option \"%c\"."), argv[i][1]); + return (1); + } + else + { + _cupsLangPrintf(stderr, _("lpadmin: Unknown argument \"%s\"."), + argv[i]); + return (1); + } + + /* + * Set options as needed... + */ + + if (num_options || file) + { + if (!http) + { + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + } + + if (printer == NULL) + { + _cupsLangPuts(stderr, + _("lpadmin: Unable to set the printer options:\n" + " You must specify a printer name first.")); + return (1); + } + + if (set_printer_options(http, printer, num_options, options, file)) + return (1); + } + + if (printer == NULL) + { + _cupsLangPuts(stdout, + _("Usage:\n" + "\n" + " lpadmin [-h server] -d destination\n" + " lpadmin [-h server] -x destination\n" + " lpadmin [-h server] -p printer [-c add-class] " + "[-i interface] [-m model]\n" + " [-r remove-class] [-v device] " + "[-D description]\n" + " [-P ppd-file] [-o name=value]\n" + " [-u allow:user,user] " + "[-u deny:user,user]")); + } + + if (http) + httpClose(http); + + return (0); +} + + +/* + * 'add_printer_to_class()' - Add a printer to a class. + */ + +static int /* O - 0 on success, 1 on fail */ +add_printer_to_class(http_t *http, /* I - Server connection */ + char *printer, /* I - Printer to add */ + char *pclass) /* I - Class to add to */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr, /* Current attribute */ + *members; /* Members in class */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + DEBUG_printf(("add_printer_to_class(%p, \"%s\", \"%s\")\n", http, + printer, pclass)); + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", pclass); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + response = cupsDoRequest(http, request, "/"); + + /* + * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * member-uris + */ + + request = ippNewRequest(CUPS_ADD_MODIFY_CLASS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * See if the printer is already in the class... + */ + + if (response != NULL && + (members = ippFindAttribute(response, "member-names", + IPP_TAG_NAME)) != NULL) + for (i = 0; i < members->num_values; i ++) + if (_cups_strcasecmp(printer, members->values[i].string.text) == 0) + { + _cupsLangPrintf(stderr, + _("lpadmin: Printer %s is already a member of class " + "%s."), printer, pclass); + ippDelete(request); + ippDelete(response); + return (0); + } + + /* + * OK, the printer isn't part of the class, so add it... + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + + if (response != NULL && + (members = ippFindAttribute(response, "member-uris", + IPP_TAG_URI)) != NULL) + { + /* + * Add the printer to the existing list... + */ + + attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, + "member-uris", members->num_values + 1, NULL, NULL); + for (i = 0; i < members->num_values; i ++) + attr->values[i].string.text = + _cupsStrAlloc(members->values[i].string.text); + + attr->values[i].string.text = _cupsStrAlloc(uri); + } + else + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_URI, "member-uris", NULL, + uri); + + /* + * Then send the request... + */ + + ippDelete(response); + + ippDelete(cupsDoRequest(http, request, "/admin/")); + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'default_printer()' - Set the default printing destination. + */ + +static int /* O - 0 on success, 1 on fail */ +default_printer(http_t *http, /* I - Server connection */ + char *printer) /* I - Printer name */ +{ + ipp_t *request; /* IPP Request */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + DEBUG_printf(("default_printer(%p, \"%s\")\n", http, printer)); + + /* + * Build a CUPS_SET_DEFAULT request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + + request = ippNewRequest(CUPS_SET_DEFAULT); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'delete_printer()' - Delete a printer from the system... + */ + +static int /* O - 0 on success, 1 on fail */ +delete_printer(http_t *http, /* I - Server connection */ + char *printer) /* I - Printer to delete */ +{ + ipp_t *request; /* IPP Request */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + DEBUG_printf(("delete_printer(%p, \"%s\")\n", http, printer)); + + /* + * Build a CUPS_DELETE_PRINTER request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + request = ippNewRequest(CUPS_DELETE_PRINTER); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/printers/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'delete_printer_from_class()' - Delete a printer from a class. + */ + +static int /* O - 0 on success, 1 on fail */ +delete_printer_from_class( + http_t *http, /* I - Server connection */ + char *printer, /* I - Printer to remove */ + char *pclass) /* I - Class to remove from */ +{ + int i, j, k; /* Looping vars */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr, /* Current attribute */ + *members; /* Members in class */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + DEBUG_printf(("delete_printer_from_class(%p, \"%s\", \"%s\")\n", http, + printer, pclass)); + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, sizeof(uri), "ipp", NULL, + "localhost", 0, "/classes/%s", pclass); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(http, request, "/classes/")) == NULL || + response->request.status.status_code == IPP_NOT_FOUND) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + ippDelete(response); + + return (1); + } + + /* + * See if the printer is already in the class... + */ + + if ((members = ippFindAttribute(response, "member-names", IPP_TAG_NAME)) == NULL) + { + _cupsLangPuts(stderr, _("lpadmin: No member names were seen.")); + + ippDelete(response); + + return (1); + } + + for (i = 0; i < members->num_values; i ++) + if (!_cups_strcasecmp(printer, members->values[i].string.text)) + break; + + if (i >= members->num_values) + { + _cupsLangPrintf(stderr, + _("lpadmin: Printer %s is not a member of class %s."), + printer, pclass); + + ippDelete(response); + + return (1); + } + + if (members->num_values == 1) + { + /* + * Build a CUPS_DELETE_CLASS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + */ + + request = ippNewRequest(CUPS_DELETE_CLASS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + } + else + { + /* + * Build a CUPS_ADD_MODIFY_CLASS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * member-uris + */ + + request = ippNewRequest(CUPS_ADD_MODIFY_CLASS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + /* + * Delete the printer from the class... + */ + + members = ippFindAttribute(response, "member-uris", IPP_TAG_URI); + attr = ippAddStrings(request, IPP_TAG_PRINTER, IPP_TAG_URI, + "member-uris", members->num_values - 1, NULL, NULL); + + for (j = 0, k = 0; j < members->num_values; j ++) + if (j != i) + attr->values[k ++].string.text = + _cupsStrAlloc(members->values[j].string.text); + } + + /* + * Then send the request... + */ + + ippDelete(response); + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'delete_printer_option()' - Delete a printer option. + */ + +static int /* O - 0 on success, 1 on fail */ +delete_printer_option(http_t *http, /* I - Server connection */ + char *printer, /* I - Printer */ + char *option) /* I - Option to delete */ +{ + ipp_t *request; /* IPP request */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + /* + * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which + * requires the following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * option with deleteAttr tag + */ + + if (get_printer_type(http, printer, uri, sizeof(uri)) & + (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + request = ippNewRequest(CUPS_ADD_MODIFY_CLASS); + else + request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_DELETEATTR, option, 0); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'enable_printer()' - Enable a printer... + */ + +static int /* O - 0 on success, 1 on fail */ +enable_printer(http_t *http, /* I - Server connection */ + char *printer) /* I - Printer to enable */ +{ + ipp_t *request; /* IPP Request */ + char uri[HTTP_MAX_URI]; /* URI for printer/class */ + + + DEBUG_printf(("enable_printer(%p, \"%s\")\n", http, printer)); + + /* + * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which + * require the following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * printer-state + * printer-is-accepting-jobs + */ + + if (get_printer_type(http, printer, uri, sizeof(uri)) & + (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + request = ippNewRequest(CUPS_ADD_MODIFY_CLASS); + else + request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + ippAddInteger(request, IPP_TAG_PRINTER, IPP_TAG_ENUM, "printer-state", + IPP_PRINTER_IDLE); + ippAddBoolean(request, IPP_TAG_PRINTER, "printer-is-accepting-jobs", 1); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'get_printer_type()' - Determine the printer type and URI. + */ + +static cups_ptype_t /* O - printer-type value */ +get_printer_type(http_t *http, /* I - Server connection */ + char *printer, /* I - Printer name */ + char *uri, /* I - URI buffer */ + size_t urisize) /* I - Size of URI buffer */ +{ + ipp_t *request, /* IPP request */ + *response; /* IPP response */ + ipp_attribute_t *attr; /* printer-type attribute */ + cups_ptype_t type; /* printer-type value */ + + + /* + * Build a GET_PRINTER_ATTRIBUTES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requested-attributes + * requesting-user-name + */ + + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL, "localhost", + ippPort(), "/printers/%s", printer); + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", NULL, "printer-type"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + /* + * Do the request... + */ + + response = cupsDoRequest(http, request, "/"); + if ((attr = ippFindAttribute(response, "printer-type", + IPP_TAG_ENUM)) != NULL) + { + type = (cups_ptype_t)attr->values[0].integer; + + if (type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + httpAssembleURIf(HTTP_URI_CODING_ALL, uri, urisize, "ipp", NULL, + "localhost", ippPort(), "/classes/%s", printer); + } + else + type = CUPS_PRINTER_LOCAL; + + ippDelete(response); + + return (type); +} + + +/* + * 'set_printer_options()' - Set the printer options. + */ + +static int /* O - 0 on success, 1 on fail */ +set_printer_options( + http_t *http, /* I - Server connection */ + char *printer, /* I - Printer */ + int num_options, /* I - Number of options */ + cups_option_t *options, /* I - Options */ + char *file) /* I - PPD file/interface script */ +{ + ipp_t *request; /* IPP Request */ + const char *ppdfile; /* PPD filename */ + int ppdchanged; /* PPD changed? */ + ppd_file_t *ppd; /* PPD file */ + ppd_choice_t *choice; /* Marked choice */ + char uri[HTTP_MAX_URI], /* URI for printer/class */ + line[1024], /* Line from PPD file */ + keyword[1024], /* Keyword from Default line */ + *keyptr, /* Pointer into keyword... */ + tempfile[1024]; /* Temporary filename */ + cups_file_t *in, /* PPD file */ + *out; /* Temporary file */ + const char *protocol, /* Old protocol option */ + *customval, /* Custom option value */ + *boolval; /* Boolean value */ + int wrote_ipp_supplies = 0, /* Wrote cupsIPPSupplies keyword? */ + wrote_snmp_supplies = 0;/* Wrote cupsSNMPSupplies keyword? */ + + + DEBUG_printf(("set_printer_options(http=%p, printer=\"%s\", num_options=%d, " + "options=%p, file=\"%s\")\n", http, printer, num_options, + options, file)); + + /* + * Build a CUPS_ADD_MODIFY_PRINTER or CUPS_ADD_MODIFY_CLASS request, which + * requires the following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requesting-user-name + * other options + */ + + if (get_printer_type(http, printer, uri, sizeof(uri)) & + (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + request = ippNewRequest(CUPS_ADD_MODIFY_CLASS); + else + request = ippNewRequest(CUPS_ADD_MODIFY_PRINTER); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, uri); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, + "requesting-user-name", NULL, cupsUser()); + + /* + * Add the options... + */ + + cupsEncodeOptions2(request, num_options, options, IPP_TAG_PRINTER); + + if ((protocol = cupsGetOption("protocol", num_options, options)) != NULL) + { + if (!_cups_strcasecmp(protocol, "bcp")) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor", + NULL, "bcp"); + else if (!_cups_strcasecmp(protocol, "tbcp")) + ippAddString(request, IPP_TAG_PRINTER, IPP_TAG_NAME, "port-monitor", + NULL, "tbcp"); + } + + if (file) + ppdfile = file; + else if (request->request.op.operation_id == CUPS_ADD_MODIFY_PRINTER) + ppdfile = cupsGetPPD(printer); + else + ppdfile = NULL; + + if (ppdfile != NULL) + { + /* + * Set default options in the PPD file... + */ + + ppd = ppdOpenFile(ppdfile); + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, num_options, options); + + if ((out = cupsTempFile2(tempfile, sizeof(tempfile))) == NULL) + { + _cupsLangPrintError(NULL, _("lpadmin: Unable to create temporary file")); + ippDelete(request); + if (ppdfile != file) + unlink(ppdfile); + return (1); + } + + if ((in = cupsFileOpen(ppdfile, "r")) == NULL) + { + _cupsLangPrintf(stderr, + _("lpadmin: Unable to open PPD file \"%s\" - %s"), + ppdfile, strerror(errno)); + ippDelete(request); + if (ppdfile != file) + unlink(ppdfile); + cupsFileClose(out); + unlink(tempfile); + return (1); + } + + ppdchanged = 0; + + while (cupsFileGets(in, line, sizeof(line))) + { + if (!strncmp(line, "*cupsIPPSupplies:", 17) && + (boolval = cupsGetOption("cupsIPPSupplies", num_options, + options)) != NULL) + { + wrote_ipp_supplies = 1; + cupsFilePrintf(out, "*cupsIPPSupplies: %s\n", + (!_cups_strcasecmp(boolval, "true") || + !_cups_strcasecmp(boolval, "yes") || + !_cups_strcasecmp(boolval, "on")) ? "True" : "False"); + } + else if (!strncmp(line, "*cupsSNMPSupplies:", 18) && + (boolval = cupsGetOption("cupsSNMPSupplies", num_options, + options)) != NULL) + { + wrote_snmp_supplies = 1; + cupsFilePrintf(out, "*cupsSNMPSupplies: %s\n", + (!_cups_strcasecmp(boolval, "true") || + !_cups_strcasecmp(boolval, "yes") || + !_cups_strcasecmp(boolval, "on")) ? "True" : "False"); + } + else if (strncmp(line, "*Default", 8)) + cupsFilePrintf(out, "%s\n", line); + else + { + /* + * Get default option name... + */ + + strlcpy(keyword, line + 8, sizeof(keyword)); + + for (keyptr = keyword; *keyptr; keyptr ++) + if (*keyptr == ':' || isspace(*keyptr & 255)) + break; + + *keyptr++ = '\0'; + while (isspace(*keyptr & 255)) + keyptr ++; + + if (!strcmp(keyword, "PageRegion") || + !strcmp(keyword, "PageSize") || + !strcmp(keyword, "PaperDimension") || + !strcmp(keyword, "ImageableArea")) + { + if ((choice = ppdFindMarkedChoice(ppd, "PageSize")) == NULL) + choice = ppdFindMarkedChoice(ppd, "PageRegion"); + } + else + choice = ppdFindMarkedChoice(ppd, keyword); + + if (choice && strcmp(choice->choice, keyptr)) + { + if (strcmp(choice->choice, "Custom")) + { + cupsFilePrintf(out, "*Default%s: %s\n", keyword, choice->choice); + ppdchanged = 1; + } + else if ((customval = cupsGetOption(keyword, num_options, + options)) != NULL) + { + cupsFilePrintf(out, "*Default%s: %s\n", keyword, customval); + ppdchanged = 1; + } + else + cupsFilePrintf(out, "%s\n", line); + } + else + cupsFilePrintf(out, "%s\n", line); + } + } + + if (!wrote_ipp_supplies && + (boolval = cupsGetOption("cupsIPPSupplies", num_options, + options)) != NULL) + { + cupsFilePrintf(out, "*cupsIPPSupplies: %s\n", + (!_cups_strcasecmp(boolval, "true") || + !_cups_strcasecmp(boolval, "yes") || + !_cups_strcasecmp(boolval, "on")) ? "True" : "False"); + } + + if (!wrote_snmp_supplies && + (boolval = cupsGetOption("cupsSNMPSupplies", num_options, + options)) != NULL) + { + cupsFilePrintf(out, "*cupsSNMPSupplies: %s\n", + (!_cups_strcasecmp(boolval, "true") || + !_cups_strcasecmp(boolval, "yes") || + !_cups_strcasecmp(boolval, "on")) ? "True" : "False"); + } + + cupsFileClose(in); + cupsFileClose(out); + ppdClose(ppd); + + /* + * Do the request... + */ + + ippDelete(cupsDoFileRequest(http, request, "/admin/", + ppdchanged ? tempfile : file)); + + /* + * Clean up temp files... (TODO: catch signals in case we CTRL-C during + * lpadmin) + */ + + if (ppdfile != file) + unlink(ppdfile); + unlink(tempfile); + } + else + { + /* + * No PPD file - just set the options... + */ + + ippDelete(cupsDoRequest(http, request, "/admin/")); + } + + /* + * Check the response... + */ + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, _("%s: %s"), "lpadmin", cupsLastErrorString()); + + return (1); + } + else + return (0); +} + + +/* + * 'validate_name()' - Make sure the printer name only contains valid chars. + */ + +static int /* O - 0 if name is no good, 1 if name is good */ +validate_name(const char *name) /* I - Name to check */ +{ + const char *ptr; /* Pointer into name */ + + + /* + * Scan the whole name... + */ + + for (ptr = name; *ptr; ptr ++) + if (*ptr == '@') + break; + else if ((*ptr >= 0 && *ptr <= ' ') || *ptr == 127 || *ptr == '/' || + *ptr == '#') + return (0); + + /* + * All the characters are good; validate the length, too... + */ + + return ((ptr - name) < 128); +} + + +/* + * End of "$Id: lpadmin.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/systemv/lpinfo.c b/systemv/lpinfo.c new file mode 100644 index 0000000..5bda1c8 --- /dev/null +++ b/systemv/lpinfo.c @@ -0,0 +1,498 @@ +/* + * "$Id: lpinfo.c 9384 2010-11-22 07:06:39Z mike $" + * + * "lpinfo" command for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and show information. + * device_cb - Device callback. + * show_devices() - Show available devices. + * show_models() - Show available PPDs. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static void device_cb(const char *device_clas, const char *device_id, + const char *device_info, + const char *device_make_and_model, + const char *device_uri, const char *device_location, + void *user_data); +static int show_devices(int long_status, int timeout, + const char *include_schemes, + const char *exclude_schemes); +static int show_models(int long_status, + const char *device_id, const char *language, + const char *make_model, const char *product, + const char *include_schemes, + const char *exclude_schemes); + + +/* + * 'main()' - Parse options and show status information. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + int long_status; /* Long listing? */ + const char *device_id, /* 1284 device ID */ + *language, /* Language */ + *make_model, /* Make and model */ + *product, /* Product */ + *include_schemes, /* Schemes to include */ + *exclude_schemes; /* Schemes to exclude */ + int timeout; /* Device timeout */ + + + _cupsSetLocale(argv); + + long_status = 0; + device_id = NULL; + language = NULL; + make_model = NULL; + product = NULL; + include_schemes = CUPS_INCLUDE_ALL; + exclude_schemes = CUPS_EXCLUDE_NONE; + timeout = CUPS_TIMEOUT_DEFAULT; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'h' : /* Connect to host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("Error: need hostname after \"-h\" option.")); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + case 'l' : /* Show long listing */ + long_status = 1; + break; + + case 'm' : /* Show models */ + if (show_models(long_status, device_id, language, make_model, + product, include_schemes, exclude_schemes)) + return (1); + break; + + case 'v' : /* Show available devices */ + if (show_devices(long_status, timeout, include_schemes, + exclude_schemes)) + return (1); + break; + + case '-' : /* --something */ + if (!strcmp(argv[i], "--device-id")) + { + i ++; + + if (i < argc) + device_id = argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected 1284 device ID string " + "after \"--device-id\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--device-id=", 12) && argv[i][12]) + { + device_id = argv[i] + 12; + } + else if (!strcmp(argv[i], "--exclude-schemes")) + { + i ++; + + if (i < argc) + exclude_schemes = argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected scheme list after " + "\"--exclude-schemes\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--exclude-schemes=", 18) && argv[i][18]) + { + exclude_schemes = argv[i] + 18; + } + else if (!strcmp(argv[i], "--include-schemes")) + { + i ++; + + if (i < argc) + include_schemes = argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected scheme list after " + "\"--include-schemes\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--include-schemes=", 18) && argv[i][18]) + { + include_schemes = argv[i] + 18; + } + else if (!strcmp(argv[i], "--language")) + { + i ++; + if (i < argc) + language = argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected language after " + "\"--language\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--language=", 11) && argv[i][11]) + { + language = argv[i] + 11; + } + else if (!strcmp(argv[i], "--make-and-model")) + { + i ++; + if (i < argc) + make_model= argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected make and model after " + "\"--make-and-model\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--make-and-model=", 17) && argv[i][17]) + { + make_model = argv[i] + 17; + } + else if (!strcmp(argv[i], "--product")) + { + i ++; + if (i < argc) + product = argv[i]; + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected product string after " + "\"--product\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--product=", 10) && argv[i][10]) + { + product = argv[i] + 10; + } + else if (!strcmp(argv[i], "--timeout")) + { + i ++; + if (i < argc) + timeout = atoi(argv[i]); + else + { + _cupsLangPuts(stderr, + _("lpinfo: Expected timeout after " + "\"--timeout\".")); + return (1); + } + } + else if (!strncmp(argv[i], "--timeout=", 10) && argv[i][10]) + { + timeout = atoi(argv[i] + 10); + } + else + { + _cupsLangPrintf(stderr, _("lpinfo: Unknown option \"%s\"."), + argv[i]); + return (1); + } + break; + + default : + _cupsLangPrintf(stderr, _("lpinfo: Unknown option \"%c\"."), + argv[i][1]); + return (1); + } + else + { + _cupsLangPrintf(stderr, _("lpinfo: Unknown argument \"%s\"."), + argv[i]); + return (1); + } + + return (0); +} + + +/* + * 'device_cb()' - Device callback. + */ + +static void +device_cb( + const char *device_class, /* I - device-class string */ + const char *device_id, /* I - device-id string */ + const char *device_info, /* I - device-info string */ + const char *device_make_and_model, /* I - device-make-and-model string */ + const char *device_uri, /* I - device-uri string */ + const char *device_location, /* I - device-location string */ + void *user_data) /* I - User data */ +{ + int *long_status; /* Show verbose info? */ + + + /* + * Display the device... + */ + + long_status = (int *)user_data; + + if (*long_status) + { + _cupsLangPrintf(stdout, + _("Device: uri = %s\n" + " class = %s\n" + " info = %s\n" + " make-and-model = %s\n" + " device-id = %s\n" + " location = %s"), + device_uri, device_class, device_info, + device_make_and_model, device_id, device_location); + } + else + _cupsLangPrintf(stdout, "%s %s", device_class, device_uri); +} + + +/* + * 'show_devices()' - Show available devices. + */ + +static int /* O - 0 on success, 1 on failure */ +show_devices( + int long_status, /* I - Long status report? */ + int timeout, /* I - Timeout */ + const char *include_schemes, /* I - List of schemes to include */ + const char *exclude_schemes) /* I - List of schemes to exclude */ +{ + if (cupsGetDevices(CUPS_HTTP_DEFAULT, timeout, include_schemes, + exclude_schemes, device_cb, &long_status) != IPP_OK) + { + _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_models()' - Show available PPDs. + */ + +static int /* O - 0 on success, 1 on failure */ +show_models( + int long_status, /* I - Long status report? */ + const char *device_id, /* I - 1284 device ID */ + const char *language, /* I - Language */ + const char *make_model, /* I - Make and model */ + const char *product, /* I - Product */ + const char *include_schemes, /* I - List of schemes to include */ + const char *exclude_schemes) /* I - List of schemes to exclude */ +{ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *ppd_device_id, /* Pointer to ppd-device-id */ + *ppd_language, /* Pointer to ppd-natural-language */ + *ppd_make_model, /* Pointer to ppd-make-and-model */ + *ppd_name; /* Pointer to ppd-name */ + cups_option_t option; /* in/exclude-schemes option */ + + + /* + * Build a CUPS_GET_PPDS request... + */ + + request = ippNewRequest(CUPS_GET_PPDS); + + if (device_id) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-device-id", + NULL, device_id); + if (language) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE, "ppd-language", + NULL, language); + if (make_model) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-make-and-model", + NULL, make_model); + if (product) + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_TEXT, "ppd-product", + NULL, product); + + if (include_schemes) + { + option.name = "include-schemes"; + option.value = (char *)include_schemes; + + cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); + } + + if (exclude_schemes) + { + option.name = "exclude-schemes"; + option.value = (char *)exclude_schemes; + + cupsEncodeOptions2(request, 1, &option, IPP_TAG_OPERATION); + } + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + /* + * Loop through the device list and display them... + */ + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a PPD... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this PPD... + */ + + ppd_device_id = "NONE"; + ppd_language = NULL; + ppd_make_model = NULL; + ppd_name = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "ppd-device-id") && + attr->value_tag == IPP_TAG_TEXT) + ppd_device_id = attr->values[0].string.text; + else if (!strcmp(attr->name, "ppd-natural-language") && + attr->value_tag == IPP_TAG_LANGUAGE) + ppd_language = attr->values[0].string.text; + else if (!strcmp(attr->name, "ppd-make-and-model") && + attr->value_tag == IPP_TAG_TEXT) + ppd_make_model = attr->values[0].string.text; + else if (!strcmp(attr->name, "ppd-name") && + attr->value_tag == IPP_TAG_NAME) + ppd_name = attr->values[0].string.text; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (ppd_language == NULL || ppd_make_model == NULL || ppd_name == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the device... + */ + + if (long_status) + { + _cupsLangPrintf(stdout, + _("Model: name = %s\n" + " natural_language = %s\n" + " make-and-model = %s\n" + " device-id = %s"), + ppd_name, ppd_language, ppd_make_model, ppd_device_id); + } + else + _cupsLangPrintf(stdout, "%s %s", ppd_name, ppd_make_model); + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpinfo: %s", cupsLastErrorString()); + + return (1); + } + + return (0); +} + + +/* + * End of "$Id: lpinfo.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/systemv/lpmove.c b/systemv/lpmove.c new file mode 100644 index 0000000..516ef76 --- /dev/null +++ b/systemv/lpmove.c @@ -0,0 +1,213 @@ +/* + * "$Id: lpmove.c 9384 2010-11-22 07:06:39Z mike $" + * + * "lpmove" command for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and move jobs. + * move_job() - Move a job. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static int move_job(http_t *http, const char *src, int jobid, + const char *dest); + + +/* + * 'main()' - Parse options and show status information. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + http_t *http; /* Connection to server */ + const char *job; /* Job name */ + int jobid; /* Job ID */ + int num_dests; /* Number of destinations */ + cups_dest_t *dests; /* Destinations */ + const char *src, /* Original queue */ + *dest; /* New destination */ + + + _cupsSetLocale(argv); + + dest = NULL; + dests = NULL; + job = NULL; + jobid = 0; + num_dests = 0; + src = NULL; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'h' : /* Connect to host */ + if (argv[i][2] != '\0') + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPuts(stderr, + _("Error: need hostname after \"-h\" option.")); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + default : + _cupsLangPrintf(stderr, _("lpmove: Unknown option \"%c\"."), + argv[i][1]); + return (1); + } + else if (!jobid && !src) + { + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((job = strrchr(argv[i], '-')) != NULL && + cupsGetDest(argv[i], NULL, num_dests, dests) == NULL) + jobid = atoi(job + 1); + else if (isdigit(argv[i][0] & 255) && + !cupsGetDest(argv[i], NULL, num_dests, dests)) + jobid = atoi(argv[i]); + else + src = argv[i]; + } + else if (dest == NULL) + dest = argv[i]; + else + { + _cupsLangPrintf(stderr, _("lpmove: Unknown argument \"%s\"."), argv[i]); + return (1); + } + + if ((!jobid && !src) || !dest) + { + _cupsLangPuts(stdout, _("Usage: lpmove job/src dest")); + return (1); + } + + http = httpConnectEncrypt(cupsServer(), ippPort(), cupsEncryption()); + + if (http == NULL) + { + _cupsLangPrintf(stderr, _("lpmove: Unable to connect to server: %s"), + strerror(errno)); + return (1); + } + + return (move_job(http, src, jobid, dest)); +} + + +/* + * 'move_job()' - Move a job. + */ + +static int /* O - 0 on success, 1 on error */ +move_job(http_t *http, /* I - HTTP connection to server */ + const char *src, /* I - Source queue */ + int jobid, /* I - Job ID */ + const char *dest) /* I - Destination queue */ +{ + ipp_t *request; /* IPP Request */ + char job_uri[HTTP_MAX_URI], /* job-uri */ + printer_uri[HTTP_MAX_URI]; /* job-printer-uri */ + + + if (!http) + return (1); + + /* + * Build a CUPS_MOVE_JOB request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * job-uri/printer-uri + * job-printer-uri + * requesting-user-name + */ + + request = ippNewRequest(CUPS_MOVE_JOB); + + if (jobid) + { + snprintf(job_uri, sizeof(job_uri), "ipp://localhost/jobs/%d", jobid); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, + job_uri); + } + else + { + httpAssembleURIf(HTTP_URI_CODING_ALL, job_uri, sizeof(job_uri), "ipp", NULL, + "localhost", 0, "/printers/%s", src); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + job_uri); + } + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), + "ipp", NULL, "localhost", 0, "/printers/%s", dest); + ippAddString(request, IPP_TAG_JOB, IPP_TAG_URI, "job-printer-uri", + NULL, printer_uri); + + /* + * Do the request and get back a response... + */ + + ippDelete(cupsDoRequest(http, request, "/jobs")); + + if (cupsLastError() > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpmove: %s", cupsLastErrorString()); + return (1); + } + else + return (0); +} + + +/* + * End of "$Id: lpmove.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/systemv/lpoptions.c b/systemv/lpoptions.c new file mode 100644 index 0000000..438fcf2 --- /dev/null +++ b/systemv/lpoptions.c @@ -0,0 +1,565 @@ +/* + * "$Id: lpoptions.c 9793 2011-05-20 03:49:49Z mike $" + * + * Printer option program for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Main entry. + * list_group() - List printer-specific options from the PPD group. + * list_options() - List printer-specific options from the PPD file. + * usage() - Show program usage and exit. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static void list_group(ppd_file_t *ppd, ppd_group_t *group); +static void list_options(cups_dest_t *dest); +static void usage(void); + + +/* + * 'main()' - Main entry. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, j; /* Looping vars */ + int changes; /* Did we make changes? */ + int num_options; /* Number of options */ + cups_option_t *options; /* Options */ + int num_dests; /* Number of destinations */ + cups_dest_t *dests; /* Destinations */ + cups_dest_t *dest; /* Current destination */ + char *printer, /* Printer name */ + *instance, /* Instance name */ + *option; /* Current option */ + + + _cupsSetLocale(argv); + + /* + * Loop through the command-line arguments... + */ + + dest = NULL; + num_dests = 0; + dests = NULL; + num_options = 0; + options = NULL; + changes = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + { + switch (argv[i][1]) + { + case 'd' : /* -d printer */ + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + if (i >= argc) + usage(); + + printer = argv[i]; + } + + if ((instance = strrchr(printer, '/')) != NULL) + *instance++ = '\0'; + + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if (num_dests == 0 || !dests || + (dest = cupsGetDest(printer, instance, num_dests, + dests)) == NULL) + { + _cupsLangPuts(stderr, _("lpoptions: Unknown printer or class.")); + return (1); + } + + /* + * Set the default destination... + */ + + for (j = 0; j < num_dests; j ++) + dests[j].is_default = 0; + + dest->is_default = 1; + + cupsSetDests(num_dests, dests); + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, + options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + break; + + case 'h' : /* -h server */ + if (argv[i][2]) + cupsSetServer(argv[i] + 2); + else + { + i ++; + if (i >= argc) + usage(); + + cupsSetServer(argv[i]); + } + break; + + case 'E' : /* Encrypt connection */ + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); + break; + + case 'l' : /* -l (list options) */ + if (dest == NULL) + { + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) + dest = dests; + } + + if (dest == NULL) + _cupsLangPuts(stderr, _("lpoptions: No printers.")); + else + list_options(dest); + + changes = -1; + break; + + case 'o' : /* -o option[=value] */ + if (dest == NULL) + { + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) + dest = dests; + + if (dest == NULL) + { + _cupsLangPuts(stderr, _("lpoptions: No printers.")); + return (1); + } + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + + if (argv[i][2]) + num_options = cupsParseOptions(argv[i] + 2, num_options, &options); + else + { + i ++; + if (i >= argc) + usage(); + + num_options = cupsParseOptions(argv[i], num_options, &options); + } + + changes = 1; + break; + + case 'p' : /* -p printer */ + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + if (i >= argc) + usage(); + + printer = argv[i]; + } + + if ((instance = strrchr(printer, '/')) != NULL) + *instance++ = '\0'; + + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((dest = cupsGetDest(printer, instance, num_dests, dests)) == NULL) + { + num_dests = cupsAddDest(printer, instance, num_dests, &dests); + dest = cupsGetDest(printer, instance, num_dests, dests); + + if (dest == NULL) + { + _cupsLangPrintf(stderr, + _("lpoptions: Unable to add printer or " + "instance: %s"), + strerror(errno)); + return (1); + } + } + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + break; + + case 'r' : /* -r option (remove) */ + if (dest == NULL) + { + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) == NULL) + dest = dests; + + if (dest == NULL) + { + _cupsLangPuts(stderr, _("lpoptions: No printers.")); + return (1); + } + + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, + options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + + if (argv[i][2]) + option = argv[i] + 2; + else + { + i ++; + if (i >= argc) + usage(); + + option = argv[i]; + } + + for (j = 0; j < num_options; j ++) + if (!_cups_strcasecmp(options[j].name, option)) + { + /* + * Remove this option... + */ + + num_options --; + + if (j < num_options) + memcpy(options + j, options + j + 1, + sizeof(cups_option_t) * (num_options - j)); + break; + } + + changes = 1; + break; + + case 'x' : /* -x printer */ + if (argv[i][2]) + printer = argv[i] + 2; + else + { + i ++; + if (i >= argc) + usage(); + + printer = argv[i]; + } + + if ((instance = strrchr(printer, '/')) != NULL) + *instance++ = '\0'; + + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if ((dest = cupsGetDest(printer, instance, num_dests, + dests)) != NULL) + { + cupsFreeOptions(dest->num_options, dest->options); + + /* + * If we are "deleting" the default printer, then just set the + * number of options to 0; if it is also the system default + * then cupsSetDests() will remove it for us... + */ + + if (dest->is_default) + { + dest->num_options = 0; + dest->options = NULL; + } + else + { + num_dests --; + + j = dest - dests; + if (j < num_dests) + memcpy(dest, dest + 1, (num_dests - j) * sizeof(cups_dest_t)); + } + } + + cupsSetDests(num_dests, dests); + dest = NULL; + changes = -1; + break; + + default : + usage(); + } + } + else + usage(); + + if (num_dests == 0) + num_dests = cupsGetDests(&dests); + + if (dest == NULL) + { + if ((dest = cupsGetDest(NULL, NULL, num_dests, dests)) != NULL) + { + for (j = 0; j < dest->num_options; j ++) + if (cupsGetOption(dest->options[j].name, num_options, options) == NULL) + num_options = cupsAddOption(dest->options[j].name, + dest->options[j].value, + num_options, &options); + } + } + + if (dest == NULL) + return (0); + + if (changes > 0) + { + /* + * Set printer options... + */ + + cupsFreeOptions(dest->num_options, dest->options); + + dest->num_options = num_options; + dest->options = options; + + cupsSetDests(num_dests, dests); + } + else if (changes == 0) + { + char buffer[10240], /* String for options */ + *ptr; /* Pointer into string */ + + num_options = dest->num_options; + options = dest->options; + + for (i = 0, ptr = buffer; + ptr < (buffer + sizeof(buffer) - 1) && i < num_options; + i ++) + { + if (i) + *ptr++ = ' '; + + if (!options[i].value[0]) + strlcpy(ptr, options[i].name, sizeof(buffer) - (ptr - buffer)); + else if (strchr(options[i].value, ' ') != NULL || + strchr(options[i].value, '\t') != NULL) + snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=\'%s\'", + options[i].name, options[i].value); + else + snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s=%s", + options[i].name, options[i].value); + + ptr += strlen(ptr); + } + + _cupsLangPuts(stdout, buffer); + } + + return (0); +} + +/* + * 'list_group()' - List printer-specific options from the PPD group. + */ + +static void +list_group(ppd_file_t *ppd, /* I - PPD file */ + ppd_group_t *group) /* I - Group to show */ +{ + int i, j; /* Looping vars */ + ppd_option_t *option; /* Current option */ + ppd_choice_t *choice; /* Current choice */ + ppd_group_t *subgroup; /* Current subgroup */ + char buffer[10240], /* Option string buffer */ + *ptr; /* Pointer into option string */ + + + for (i = group->num_options, option = group->options; i > 0; i --, option ++) + { + if (!_cups_strcasecmp(option->keyword, "PageRegion")) + continue; + + snprintf(buffer, sizeof(buffer), "%s/%s:", option->keyword, option->text); + + for (j = option->num_choices, choice = option->choices, + ptr = buffer + strlen(buffer); + j > 0 && ptr < (buffer + sizeof(buffer) - 1); + j --, choice ++) + { + if (!_cups_strcasecmp(choice->choice, "Custom")) + { + ppd_coption_t *coption; /* Custom option */ + ppd_cparam_t *cparam; /* Custom parameter */ + static const char * const types[] = + { /* Parameter types */ + "CURVE", + "INTEGER", + "INVCURVE", + "PASSCODE", + "PASSWORD", + "POINTS", + "REAL", + "STRING" + }; + + + if ((coption = ppdFindCustomOption(ppd, option->keyword)) == NULL || + cupsArrayCount(coption->params) == 0) + snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom", + choice->marked ? "*" : ""); + else if (!_cups_strcasecmp(option->keyword, "PageSize") || + !_cups_strcasecmp(option->keyword, "PageRegion")) + snprintf(ptr, sizeof(buffer) - (ptr - buffer), + " %sCustom.WIDTHxHEIGHT", choice->marked ? "*" : ""); + else + { + cparam = (ppd_cparam_t *)cupsArrayFirst(coption->params); + + if (cupsArrayCount(coption->params) == 1) + snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %sCustom.%s", + choice->marked ? "*" : "", types[cparam->type]); + else + { + const char *prefix; /* Prefix string */ + + + if (choice->marked) + prefix = " *{"; + else + prefix = " {"; + + while (cparam) + { + snprintf(ptr, sizeof(buffer) - (ptr - buffer), "%s%s=%s", prefix, + cparam->name, types[cparam->type]); + cparam = (ppd_cparam_t *)cupsArrayNext(coption->params); + prefix = " "; + ptr += strlen(ptr); + } + + if (ptr < (buffer + sizeof(buffer) - 1)) + strlcpy(ptr, "}", sizeof(buffer) - (ptr - buffer)); + } + } + } + else if (choice->marked) + snprintf(ptr, sizeof(buffer) - (ptr - buffer), " *%s", choice->choice); + else + snprintf(ptr, sizeof(buffer) - (ptr - buffer), " %s", choice->choice); + + ptr += strlen(ptr); + } + + _cupsLangPuts(stdout, buffer); + } + + for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; i --, subgroup ++) + list_group(ppd, subgroup); +} + + +/* + * 'list_options()' - List printer-specific options from the PPD file. + */ + +static void +list_options(cups_dest_t *dest) /* I - Destination to list */ +{ + int i; /* Looping var */ + const char *filename; /* PPD filename */ + ppd_file_t *ppd; /* PPD data */ + ppd_group_t *group; /* Current group */ + + + if ((filename = cupsGetPPD(dest->name)) == NULL) + { + _cupsLangPrintf(stderr, _("lpoptions: Unable to get PPD file for %s: %s"), + dest->name, cupsLastErrorString()); + return; + } + + if ((ppd = ppdOpenFile(filename)) == NULL) + { + unlink(filename); + _cupsLangPrintf(stderr, _("lpoptions: Unable to open PPD file for %s."), + dest->name); + return; + } + + ppdMarkDefaults(ppd); + cupsMarkOptions(ppd, dest->num_options, dest->options); + + for (i = ppd->num_groups, group = ppd->groups; i > 0; i --, group ++) + list_group(ppd, group); + + ppdClose(ppd); + unlink(filename); +} + + +/* + * 'usage()' - Show program usage and exit. + */ + +static void +usage(void) +{ + _cupsLangPuts(stdout, + _("Usage: lpoptions [-h server] [-E] -d printer\n" + " lpoptions [-h server] [-E] [-p printer] -l\n" + " lpoptions [-h server] [-E] -p printer -o " + "option[=value] ...\n" + " lpoptions [-h server] [-E] -x printer")); + + exit(1); +} + + +/* + * End of "$Id: lpoptions.c 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/systemv/lppasswd.c b/systemv/lppasswd.c new file mode 100644 index 0000000..32dc950 --- /dev/null +++ b/systemv/lppasswd.c @@ -0,0 +1,489 @@ +/* + * "$Id: lppasswd.c 9384 2010-11-22 07:06:39Z mike $" + * + * MD5 password program for CUPS. + * + * Copyright 2007-2010 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Add, change, or delete passwords from the MD5 password file. + * usage() - Show program usage. + */ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include + +#ifndef WIN32 +# include +# include +#endif /* !WIN32 */ + + +/* + * Operations... + */ + +#define ADD 0 +#define CHANGE 1 +#define DELETE 2 + + +/* + * Local functions... + */ + +static void usage(FILE *fp); + + +/* + * 'main()' - Add, change, or delete passwords from the MD5 password file. + */ + +int /* O - Exit status */ +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i; /* Looping var */ + char *opt; /* Option pointer */ + const char *username; /* Pointer to username */ + const char *groupname; /* Pointer to group name */ + int op; /* Operation (add, change, delete) */ + const char *passwd; /* Password string */ + FILE *infile, /* Input file */ + *outfile; /* Output file */ + char line[256], /* Line from file */ + userline[17], /* User from line */ + groupline[17], /* Group from line */ + md5line[33], /* MD5-sum from line */ + md5new[33]; /* New MD5 sum */ + char passwdmd5[1024], /* passwd.md5 file */ + passwdold[1024], /* passwd.old file */ + passwdnew[1024]; /* passwd.tmp file */ + char *newpass, /* new password */ + *oldpass; /* old password */ + int flag; /* Password check flags... */ + int fd; /* Password file descriptor */ + int error; /* Write error */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + cups_lang_t *lang; /* Language info */ +#if defined(HAVE_SIGACTION) && !defined(HAVE_SIGSET) + struct sigaction action; /* Signal action */ +#endif /* HAVE_SIGACTION && !HAVE_SIGSET*/ + + + _cupsSetLocale(argv); + lang = cupsLangDefault(); + + /* + * Check to see if stdin, stdout, and stderr are still open... + */ + + if (fcntl(0, F_GETFD, &i) || + fcntl(1, F_GETFD, &i) || + fcntl(2, F_GETFD, &i)) + { + /* + * No, return exit status 2 and don't try to send any output since + * someone is trying to bypass the security on the server. + */ + + return (2); + } + + /* + * Find the server directory... + */ + + snprintf(passwdmd5, sizeof(passwdmd5), "%s/passwd.md5", cg->cups_serverroot); + snprintf(passwdold, sizeof(passwdold), "%s/passwd.old", cg->cups_serverroot); + snprintf(passwdnew, sizeof(passwdnew), "%s/passwd.new", cg->cups_serverroot); + + /* + * Find the default system group... + */ + + if (getgrnam(CUPS_DEFAULT_GROUP)) + groupname = CUPS_DEFAULT_GROUP; + else + groupname = "unknown"; + + endgrent(); + + username = NULL; + op = CHANGE; + + /* + * Parse command-line options... + */ + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + for (opt = argv[i] + 1; *opt; opt ++) + switch (*opt) + { + case 'a' : /* Add */ + op = ADD; + break; + case 'x' : /* Delete */ + op = DELETE; + break; + case 'g' : /* Group */ + i ++; + if (i >= argc) + usage(stderr); + + groupname = argv[i]; + break; + case 'h' : /* Help */ + usage(stdout); + break; + default : /* Bad option */ + usage(stderr); + break; + } + else if (!username) + username = argv[i]; + else + usage(stderr); + + /* + * See if we are trying to add or delete a password when we aren't logged in + * as root... + */ + + if (getuid() && getuid() != geteuid() && (op != CHANGE || username)) + { + _cupsLangPuts(stderr, + _("lppasswd: Only root can add or delete passwords.")); + return (1); + } + + /* + * Fill in missing info... + */ + + if (!username) + username = cupsUser(); + + oldpass = newpass = NULL; + + /* + * Obtain old and new password _before_ locking the database + * to keep users from locking the file indefinitely. + */ + + if (op == CHANGE && getuid()) + { + if ((passwd = cupsGetPassword(_("Enter old password:"))) == NULL) + return (1); + + if ((oldpass = strdup(passwd)) == NULL) + { + _cupsLangPrintf(stderr, + _("lppasswd: Unable to copy password string: %s"), + strerror(errno)); + return (1); + } + } + + /* + * Now get the new password, if necessary... + */ + + if (op != DELETE) + { + if ((passwd = cupsGetPassword( + _cupsLangString(lang, _("Enter password:")))) == NULL) + return (1); + + if ((newpass = strdup(passwd)) == NULL) + { + _cupsLangPrintf(stderr, + _("lppasswd: Unable to copy password string: %s"), + strerror(errno)); + return (1); + } + + if ((passwd = cupsGetPassword( + _cupsLangString(lang, _("Enter password again:")))) == NULL) + return (1); + + if (strcmp(passwd, newpass) != 0) + { + _cupsLangPuts(stderr, + _("lppasswd: Sorry, passwords don't match.")); + return (1); + } + + /* + * Check that the password contains at least one letter and number. + */ + + flag = 0; + + for (passwd = newpass; *passwd; passwd ++) + if (isdigit(*passwd & 255)) + flag |= 1; + else if (isalpha(*passwd & 255)) + flag |= 2; + + /* + * Only allow passwords that are at least 6 chars, have a letter and + * a number, and don't contain the username. + */ + + if (strlen(newpass) < 6 || strstr(newpass, username) != NULL || flag != 3) + { + _cupsLangPuts(stderr, _("lppasswd: Sorry, password rejected.")); + _cupsLangPuts(stderr, _("Your password must be at least 6 characters " + "long, cannot contain your username, and must " + "contain at least one letter and number.")); + return (1); + } + } + + /* + * Ignore SIGHUP, SIGINT, SIGTERM, and SIGXFSZ (if defined) for the + * remainder of the time so that we won't end up with bogus password + * files... + */ + +#ifndef WIN32 +# if defined(HAVE_SIGSET) + sigset(SIGHUP, SIG_IGN); + sigset(SIGINT, SIG_IGN); + sigset(SIGTERM, SIG_IGN); +# ifdef SIGXFSZ + sigset(SIGXFSZ, SIG_IGN); +# endif /* SIGXFSZ */ +# elif defined(HAVE_SIGACTION) + memset(&action, 0, sizeof(action)); + action.sa_handler = SIG_IGN; + + sigaction(SIGHUP, &action, NULL); + sigaction(SIGINT, &action, NULL); + sigaction(SIGTERM, &action, NULL); +# ifdef SIGXFSZ + sigaction(SIGXFSZ, &action, NULL); +# endif /* SIGXFSZ */ +# else + signal(SIGHUP, SIG_IGN); + signal(SIGINT, SIG_IGN); + signal(SIGTERM, SIG_IGN); +# ifdef SIGXFSZ + signal(SIGXFSZ, SIG_IGN); +# endif /* SIGXFSZ */ +# endif +#endif /* !WIN32 */ + + /* + * Open the output file. + */ + + if ((fd = open(passwdnew, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0) + { + if (errno == EEXIST) + _cupsLangPuts(stderr, _("lppasswd: Password file busy.")); + else + _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"), + strerror(errno)); + + return (1); + } + + if ((outfile = fdopen(fd, "w")) == NULL) + { + _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"), + strerror(errno)); + + unlink(passwdnew); + + return (1); + } + + setbuf(outfile, NULL); + + /* + * Open the existing password file and create a new one... + */ + + infile = fopen(passwdmd5, "r"); + if (infile == NULL && errno != ENOENT && op != ADD) + { + _cupsLangPrintf(stderr, _("lppasswd: Unable to open password file: %s"), + strerror(errno)); + + fclose(outfile); + + unlink(passwdnew); + + return (1); + } + + /* + * Read lines from the password file; the format is: + * + * username:group:MD5-sum + */ + + error = 0; + userline[0] = '\0'; + groupline[0] = '\0'; + md5line[0] = '\0'; + + if (infile) + { + while (fgets(line, sizeof(line), infile) != NULL) + { + if (sscanf(line, "%16[^:]:%16[^:]:%32s", userline, groupline, md5line) != 3) + continue; + + if (strcmp(username, userline) == 0 && + strcmp(groupname, groupline) == 0) + break; + + if (fputs(line, outfile) == EOF) + { + _cupsLangPrintf(stderr, + _("lppasswd: Unable to write to password file: %s"), + strerror(errno)); + error = 1; + break; + } + } + + if (!error) + { + while (fgets(line, sizeof(line), infile) != NULL) + if (fputs(line, outfile) == EOF) + { + _cupsLangPrintf(stderr, + _("lppasswd: Unable to write to password file: %s"), + strerror(errno)); + error = 1; + break; + } + } + } + + if (op == CHANGE && + (strcmp(username, userline) || strcmp(groupname, groupline))) + { + _cupsLangPrintf(stderr, + _("lppasswd: user \"%s\" and group \"%s\" do not exist."), + username, groupname); + error = 1; + } + else if (op != DELETE) + { + if (oldpass && + strcmp(httpMD5(username, "CUPS", oldpass, md5new), md5line) != 0) + { + _cupsLangPuts(stderr, _("lppasswd: Sorry, password doesn't match.")); + error = 1; + } + else + { + snprintf(line, sizeof(line), "%s:%s:%s\n", username, groupname, + httpMD5(username, "CUPS", newpass, md5new)); + if (fputs(line, outfile) == EOF) + { + _cupsLangPrintf(stderr, + _("lppasswd: Unable to write to password file: %s"), + strerror(errno)); + error = 1; + } + } + } + + /* + * Close the files... + */ + + if (infile) + fclose(infile); + + if (fclose(outfile) == EOF) + error = 1; + + /* + * Error out gracefully as needed... + */ + + if (error) + { + _cupsLangPuts(stderr, _("lppasswd: Password file not updated.")); + + unlink(passwdnew); + + return (1); + } + + /* + * Save old passwd file + */ + + unlink(passwdold); + if (link(passwdmd5, passwdold) && errno != ENOENT) + { + _cupsLangPrintf(stderr, + _("lppasswd: failed to backup old password file: %s"), + strerror(errno)); + unlink(passwdnew); + return (1); + } + + /* + * Install new password file + */ + + if (rename(passwdnew, passwdmd5) < 0) + { + _cupsLangPrintf(stderr, _("lppasswd: failed to rename password file: %s"), + strerror(errno)); + unlink(passwdnew); + return (1); + } + + return (0); +} + + +/* + * 'usage()' - Show program usage. + */ + +static void +usage(FILE *fp) /* I - File to send usage to */ +{ + if (getuid()) + _cupsLangPuts(fp, _("Usage: lppasswd [-g groupname]")); + else + _cupsLangPuts(fp, + _("Usage: lppasswd [-g groupname] [username]\n" + " lppasswd [-g groupname] -a [username]\n" + " lppasswd [-g groupname] -x [username]")); + + exit(1); +} + + +/* + * End of "$Id: lppasswd.c 9384 2010-11-22 07:06:39Z mike $". + */ diff --git a/systemv/lpstat.c b/systemv/lpstat.c new file mode 100644 index 0000000..534be06 --- /dev/null +++ b/systemv/lpstat.c @@ -0,0 +1,2054 @@ +/* + * "$Id: lpstat.c 10064 2011-10-07 21:41:07Z mike $" + * + * "lpstat" command for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2006 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + * + * Contents: + * + * main() - Parse options and show status information. + * check_dest() - Verify that the named destination(s) exists. + * match_list() - Match a name from a list of comma or space-separated + * names. + * show_accepting() - Show acceptance status. + * show_classes() - Show printer classes. + * show_default() - Show default destination. + * show_devices() - Show printer devices. + * show_jobs() - Show active print jobs. + * show_printers() - Show printers. + * show_scheduler() - Show scheduler status. + */ + +/* + * Include necessary headers... + */ + +#include + + +/* + * Local functions... + */ + +static void check_dest(const char *command, const char *name, + int *num_dests, cups_dest_t **dests); +static int match_list(const char *list, const char *name); +static int show_accepting(const char *printers, int num_dests, + cups_dest_t *dests); +static int show_classes(const char *dests); +static void show_default(cups_dest_t *dest); +static int show_devices(const char *printers, int num_dests, + cups_dest_t *dests); +static int show_jobs(const char *dests, const char *users, int long_status, + int ranking, const char *which); +static int show_printers(const char *printers, int num_dests, + cups_dest_t *dests, int long_status); +static void show_scheduler(void); + + +/* + * 'main()' - Parse options and show status information. + */ + +int +main(int argc, /* I - Number of command-line arguments */ + char *argv[]) /* I - Command-line arguments */ +{ + int i, /* Looping var */ + status; /* Exit status */ + int num_dests; /* Number of user destinations */ + cups_dest_t *dests; /* User destinations */ + int long_status; /* Long status report? */ + int ranking; /* Show job ranking? */ + const char *which; /* Which jobs to show? */ + char op; /* Last operation on command-line */ + + + _cupsSetLocale(argv); + + /* + * Parse command-line options... + */ + + num_dests = 0; + dests = NULL; + long_status = 0; + ranking = 0; + status = 0; + which = "not-completed"; + op = 0; + + for (i = 1; i < argc; i ++) + if (argv[i][0] == '-') + switch (argv[i][1]) + { + case 'D' : /* Show description */ + long_status = 1; + break; + + case 'E' : /* Encrypt */ +#ifdef HAVE_SSL + cupsSetEncryption(HTTP_ENCRYPT_REQUIRED); +#else + _cupsLangPrintf(stderr, + _("%s: Sorry, no encryption support."), + argv[0]); +#endif /* HAVE_SSL */ + break; + + case 'H' : /* Show server and port */ + if (cupsServer()[0] == '/') + _cupsLangPuts(stdout, cupsServer()); + else + _cupsLangPrintf(stdout, "%s:%d", cupsServer(), ippPort()); + break; + + case 'P' : /* Show paper types */ + op = 'P'; + break; + + case 'R' : /* Show ranking */ + ranking = 1; + break; + + case 'S' : /* Show charsets */ + op = 'S'; + if (!argv[i][2]) + i ++; + break; + + case 'U' : /* Username */ + if (argv[i][2]) + cupsSetUser(argv[i] + 2); + else + { + i ++; + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected username after " + "\"-U\" option."), + argv[0]); + return (1); + } + + cupsSetUser(argv[i]); + } + break; + + case 'W' : /* Show which jobs? */ + if (argv[i][2]) + which = argv[i] + 2; + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - need \"completed\", " + "\"not-completed\", or \"all\" after " + "\"-W\" option."), + argv[0]); + return (1); + } + + which = argv[i]; + } + + if (strcmp(which, "completed") && strcmp(which, "not-completed") && + strcmp(which, "all")) + { + _cupsLangPrintf(stderr, + _("%s: Error - need \"completed\", " + "\"not-completed\", or \"all\" after " + "\"-W\" option."), + argv[0]); + return (1); + } + break; + + case 'a' : /* Show acceptance status */ + op = 'a'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_accepting(argv[i] + 2, num_dests, dests); + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + + check_dest(argv[0], argv[i], &num_dests, &dests); + + status |= show_accepting(argv[i], num_dests, dests); + } + else + { + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); + } + + status |= show_accepting(NULL, num_dests, dests); + } + break; + +#ifdef __sgi + case 'b' : /* Show both the local and remote status */ + op = 'b'; + + if (argv[i][2]) + { + /* + * The local and remote status are separated by a blank line; + * since all CUPS jobs are networked, we only output the + * second list for now... In the future, we might further + * emulate this by listing the remote server's queue, but + * for now this is enough to make the SGI printstatus program + * happy... + */ + + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + puts(""); + status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which); + } + else + { + _cupsLangPrintf(stderr, + _("%s: Error - expected destination after " + "\"-b\" option."), + argv[0]); + + return (1); + } + break; +#endif /* __sgi */ + + case 'c' : /* Show classes and members */ + op = 'c'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_classes(argv[i] + 2); + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + + check_dest(argv[0], argv[i], &num_dests, &dests); + + status |= show_classes(argv[i]); + } + else + status |= show_classes(NULL); + break; + + case 'd' : /* Show default destination */ + op = 'd'; + + if (num_dests != 1 || !dests[0].is_default) + { + cupsFreeDests(num_dests, dests); + + dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, NULL, NULL); + num_dests = dests ? 1 : 0; + } + + show_default(dests); + break; + + case 'f' : /* Show forms */ + op = 'f'; + if (!argv[i][2]) + i ++; + break; + + case 'h' : /* Connect to host */ + if (argv[i][2]) + cupsSetServer(argv[i] + 2); + else + { + i ++; + + if (i >= argc) + { + _cupsLangPrintf(stderr, + _("%s: Error - expected hostname after " + "\"-h\" option."), + argv[0]); + return (1); + } + + cupsSetServer(argv[i]); + } + break; + + case 'l' : /* Long status or long job status */ +#ifdef __sgi + op = 'l'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_jobs(argv[i] + 2, NULL, 3, ranking, which); + } + else +#endif /* __sgi */ + long_status = 2; + break; + + case 'o' : /* Show jobs by destination */ + op = 'o'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_jobs(argv[i] + 2, NULL, long_status, ranking, + which); + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + + check_dest(argv[0], argv[i], &num_dests, &dests); + + status |= show_jobs(argv[i], NULL, long_status, ranking, which); + } + else + status |= show_jobs(NULL, NULL, long_status, ranking, which); + break; + + case 'p' : /* Show printers */ + op = 'p'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_printers(argv[i] + 2, num_dests, dests, + long_status); + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + + check_dest(argv[0], argv[i], &num_dests, &dests); + + status |= show_printers(argv[i], num_dests, dests, long_status); + } + else + { + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); + } + + status |= show_printers(NULL, num_dests, dests, long_status); + } + break; + + case 'r' : /* Show scheduler status */ + op = 'r'; + + show_scheduler(); + break; + + case 's' : /* Show summary */ + op = 's'; + + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); + } + + show_default(cupsGetDest(NULL, NULL, num_dests, dests)); + status |= show_classes(NULL); + status |= show_devices(NULL, num_dests, dests); + break; + + case 't' : /* Show all info */ + op = 't'; + + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); + } + + show_scheduler(); + show_default(cupsGetDest(NULL, NULL, num_dests, dests)); + status |= show_classes(NULL); + status |= show_devices(NULL, num_dests, dests); + status |= show_accepting(NULL, num_dests, dests); + status |= show_printers(NULL, num_dests, dests, long_status); + status |= show_jobs(NULL, NULL, long_status, ranking, which); + break; + + case 'u' : /* Show jobs by user */ + op = 'u'; + + if (argv[i][2]) + status |= show_jobs(NULL, argv[i] + 2, long_status, ranking, + which); + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + status |= show_jobs(NULL, argv[i], long_status, ranking, which); + } + else + status |= show_jobs(NULL, NULL, long_status, ranking, which); + break; + + case 'v' : /* Show printer devices */ + op = 'v'; + + if (argv[i][2]) + { + check_dest(argv[0], argv[i] + 2, &num_dests, &dests); + + status |= show_devices(argv[i] + 2, num_dests, dests); + } + else if ((i + 1) < argc && argv[i + 1][0] != '-') + { + i ++; + + check_dest(argv[0], argv[i], &num_dests, &dests); + + status |= show_devices(argv[i], num_dests, dests); + } + else + { + if (num_dests <= 1) + { + cupsFreeDests(num_dests, dests); + num_dests = cupsGetDests(&dests); + } + + status |= show_devices(NULL, num_dests, dests); + } + break; + + default : + _cupsLangPrintf(stderr, + _("%s: Error - unknown option \"%c\"."), + argv[0], argv[i][1]); + return (1); + } + else + { + status |= show_jobs(argv[i], NULL, long_status, ranking, which); + op = 'o'; + } + + if (!op) + status |= show_jobs(NULL, cupsUser(), long_status, ranking, which); + + return (status); +} + + +/* + * 'check_dest()' - Verify that the named destination(s) exists. + */ + +static void +check_dest(const char *command, /* I - Command name */ + const char *name, /* I - List of printer/class names */ + int *num_dests, /* IO - Number of destinations */ + cups_dest_t **dests) /* IO - Destinations */ +{ + const char *dptr; /* Pointer into name */ + char *pptr, /* Pointer into printer */ + printer[1024]; /* Current printer/class name */ + + + /* + * Load the destination list as necessary... + */ + + if (*num_dests <= 1) + { + if (*num_dests) + cupsFreeDests(*num_dests, *dests); + + if (strchr(name, ',')) + *num_dests = cupsGetDests(dests); + else + { + strlcpy(printer, name, sizeof(printer)); + if ((pptr = strchr(printer, '/')) != NULL) + *pptr++ = '\0'; + + if ((*dests = cupsGetNamedDest(CUPS_HTTP_DEFAULT, printer, pptr)) == NULL) + { + _cupsLangPrintf(stderr, + _("%s: Invalid destination name in list \"%s\"."), + command, name); + exit(1); + } + else + { + *num_dests = 1; + return; + } + } + } + + /* + * Scan the name string for printer/class name(s)... + */ + + for (dptr = name; *dptr;) + { + /* + * Skip leading whitespace and commas... + */ + + while (isspace(*dptr & 255) || *dptr == ',') + dptr ++; + + if (!*dptr) + break; + + /* + * Extract a single destination name from the name string... + */ + + for (pptr = printer; !isspace(*dptr & 255) && *dptr != ',' && *dptr;) + { + if ((pptr - printer) < (sizeof(printer) - 1)) + *pptr++ = *dptr++; + else + { + _cupsLangPrintf(stderr, + _("%s: Invalid destination name in list \"%s\"."), + command, name); + exit(1); + } + } + + *pptr = '\0'; + + /* + * Check the destination... + */ + + if (!cupsGetDest(printer, NULL, *num_dests, *dests)) + { + _cupsLangPrintf(stderr, + _("%s: Unknown destination \"%s\"."), command, printer); + exit(1); + } + } +} + + +/* + * 'match_list()' - Match a name from a list of comma or space-separated names. + */ + +static int /* O - 1 on match, 0 on no match */ +match_list(const char *list, /* I - List of names */ + const char *name) /* I - Name to find */ +{ + const char *nameptr; /* Pointer into name */ + + + /* + * An empty list always matches... + */ + + if (!list || !*list) + return (1); + + if (!name) + return (0); + + while (*list) + { + /* + * Skip leading whitespace and commas... + */ + + while (isspace(*list & 255) || *list == ',') + list ++; + + if (!*list) + break; + + /* + * Compare names... + */ + + for (nameptr = name; + *nameptr && *list && tolower(*nameptr & 255) == tolower(*list & 255); + nameptr ++, list ++); + + if (!*nameptr && (!*list || *list == ',' || isspace(*list & 255))) + return (1); + + while (*list && !isspace(*list & 255) && *list != ',') + list ++; + } + + return (0); +} + + +/* + * 'show_accepting()' - Show acceptance status. + */ + +static int /* O - 0 on success, 1 on fail */ +show_accepting(const char *printers, /* I - Destinations */ + int num_dests, /* I - Number of user-defined dests */ + cups_dest_t *dests) /* I - User-defined destinations */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *printer, /* Printer name */ + *message; /* Printer device URI */ + int accepting; /* Accepting requests? */ + time_t ptime; /* Printer state time */ + struct tm *pdate; /* Printer state date & time */ + char printer_state_time[255];/* Printer state time */ + static const char *pattrs[] = /* Attributes we need for printers... */ + { + "printer-name", + "printer-state-change-time", + "printer-state-message", + "printer-is-accepting-jobs" + }; + + + DEBUG_printf(("show_accepting(printers=\"%s\")\n", printers)); + + if (printers != NULL && !strcmp(printers, "all")) + printers = NULL; + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + DEBUG_puts("show_accepting: request succeeded..."); + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + /* + * Loop through the printers returned in the list and display + * their devices... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a printer... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this printer... + */ + + printer = NULL; + message = NULL; + accepting = 1; + ptime = 0; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-state-change-time") && + attr->value_tag == IPP_TAG_INTEGER) + ptime = (time_t)attr->values[0].integer; + else if (!strcmp(attr->name, "printer-state-message") && + attr->value_tag == IPP_TAG_TEXT) + message = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-is-accepting-jobs") && + attr->value_tag == IPP_TAG_BOOLEAN) + accepting = attr->values[0].boolean; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (printer == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the printer entry if needed... + */ + + if (match_list(printers, printer)) + { + pdate = localtime(&ptime); + strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate); + + if (accepting) + _cupsLangPrintf(stdout, _("%s accepting requests since %s"), + printer, printer_state_time); + else + { + _cupsLangPrintf(stdout, _("%s not accepting requests since %s -"), + printer, printer_state_time); + _cupsLangPrintf(stdout, _("\t%s"), + (message == NULL || !*message) ? + "reason unknown" : message); + } + + for (i = 0; i < num_dests; i ++) + if (!_cups_strcasecmp(dests[i].name, printer) && dests[i].instance) + { + if (accepting) + _cupsLangPrintf(stdout, _("%s/%s accepting requests since %s"), + printer, dests[i].instance, printer_state_time); + else + { + _cupsLangPrintf(stdout, + _("%s/%s not accepting requests since %s -"), + printer, dests[i].instance, printer_state_time); + _cupsLangPrintf(stdout, _("\t%s"), + (message == NULL || !*message) ? + "reason unknown" : message); + } + } + } + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_classes()' - Show printer classes. + */ + +static int /* O - 0 on success, 1 on fail */ +show_classes(const char *dests) /* I - Destinations */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP Request */ + *response, /* IPP Response */ + *response2; /* IPP response from remote server */ + http_t *http2; /* Remote server */ + ipp_attribute_t *attr; /* Current attribute */ + const char *printer, /* Printer class name */ + *printer_uri; /* Printer class URI */ + ipp_attribute_t *members; /* Printer members */ + char method[HTTP_MAX_URI], /* Request method */ + username[HTTP_MAX_URI], /* Username:password */ + server[HTTP_MAX_URI], /* Server name */ + resource[HTTP_MAX_URI]; /* Resource name */ + int port; /* Port number */ + static const char *cattrs[] = /* Attributes we need for classes... */ + { + "printer-name", + "printer-uri-supported", + "member-names" + }; + + + DEBUG_printf(("show_classes(dests=\"%s\")\n", dests)); + + if (dests != NULL && !strcmp(dests, "all")) + dests = NULL; + + /* + * Build a CUPS_GET_CLASSES request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_CLASSES); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(cattrs) / sizeof(cattrs[0]), + NULL, cattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + DEBUG_puts("show_classes: request succeeded..."); + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + /* + * Loop through the printers returned in the list and display + * their devices... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + printer = NULL; + printer_uri = NULL; + members = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer = attr->values[0].string.text; + + if (!strcmp(attr->name, "printer-uri-supported") && + attr->value_tag == IPP_TAG_URI) + printer_uri = attr->values[0].string.text; + + if (!strcmp(attr->name, "member-names") && + attr->value_tag == IPP_TAG_NAME) + members = attr; + + attr = attr->next; + } + + /* + * If this is a remote class, grab the class info from the + * remote server... + */ + + response2 = NULL; + if (members == NULL && printer_uri != NULL) + { + httpSeparateURI(HTTP_URI_CODING_ALL, printer_uri, method, sizeof(method), + username, sizeof(username), server, sizeof(server), + &port, resource, sizeof(resource)); + + if (!_cups_strcasecmp(server, cupsServer())) + http2 = CUPS_HTTP_DEFAULT; + else + http2 = httpConnectEncrypt(server, port, cupsEncryption()); + + /* + * Build an IPP_GET_PRINTER_ATTRIBUTES request, which requires the + * following attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requested-attributes + */ + + request = ippNewRequest(IPP_GET_PRINTER_ATTRIBUTES); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, printer_uri); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + sizeof(cattrs) / sizeof(cattrs[0]), + NULL, cattrs); + + if ((response2 = cupsDoRequest(http2, request, "/")) != NULL) + members = ippFindAttribute(response2, "member-names", IPP_TAG_NAME); + + if (http2) + httpClose(http2); + } + + /* + * See if we have everything needed... + */ + + if (printer == NULL) + { + if (response2) + ippDelete(response2); + + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the printer entry if needed... + */ + + if (match_list(dests, printer)) + { + _cupsLangPrintf(stdout, _("members of class %s:"), printer); + + if (members) + { + for (i = 0; i < members->num_values; i ++) + _cupsLangPrintf(stdout, "\t%s", members->values[i].string.text); + } + else + _cupsLangPuts(stdout, "\tunknown"); + } + + if (response2) + ippDelete(response2); + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_default()' - Show default destination. + */ + +static void +show_default(cups_dest_t *dest) /* I - Default destination */ +{ + const char *printer, /* Printer name */ + *val; /* Environment variable name */ + + + if (dest) + { + if (dest->instance) + _cupsLangPrintf(stdout, _("system default destination: %s/%s"), + dest->name, dest->instance); + else + _cupsLangPrintf(stdout, _("system default destination: %s"), + dest->name); + } + else + { + val = NULL; + + if ((printer = getenv("LPDEST")) == NULL) + { + if ((printer = getenv("PRINTER")) != NULL) + { + if (!strcmp(printer, "lp")) + printer = NULL; + else + val = "PRINTER"; + } + } + else + val = "LPDEST"; + + if (printer) + _cupsLangPrintf(stdout, + _("lpstat: error - %s environment variable names " + "non-existent destination \"%s\"."), + val, printer); + else + _cupsLangPuts(stdout, _("no system default destination")); + } +} + + +/* + * 'show_devices()' - Show printer devices. + */ + +static int /* O - 0 on success, 1 on fail */ +show_devices(const char *printers, /* I - Destinations */ + int num_dests, /* I - Number of user-defined dests */ + cups_dest_t *dests) /* I - User-defined destinations */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr; /* Current attribute */ + const char *printer, /* Printer name */ + *uri, /* Printer URI */ + *device; /* Printer device URI */ + static const char *pattrs[] = /* Attributes we need for printers... */ + { + "printer-name", + "printer-uri-supported", + "device-uri" + }; + + + DEBUG_printf(("show_devices(printers=\"%s\")\n", printers)); + + if (printers != NULL && !strcmp(printers, "all")) + printers = NULL; + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + DEBUG_puts("show_devices: request succeeded..."); + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + /* + * Loop through the printers returned in the list and display + * their devices... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + printer = NULL; + device = NULL; + uri = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer = attr->values[0].string.text; + + if (!strcmp(attr->name, "printer-uri-supported") && + attr->value_tag == IPP_TAG_URI) + uri = attr->values[0].string.text; + + if (!strcmp(attr->name, "device-uri") && + attr->value_tag == IPP_TAG_URI) + device = attr->values[0].string.text; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (printer == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the printer entry if needed... + */ + + if (match_list(printers, printer)) + { +#ifdef __osf__ /* Compaq/Digital like to do it their own way... */ + char scheme[HTTP_MAX_URI], /* Components of printer URI */ + username[HTTP_MAX_URI], + hostname[HTTP_MAX_URI], + resource[HTTP_MAX_URI]; + int port; + + + if (device == NULL) + { + httpSeparateURI(HTTP_URI_CODING_ALL, uri, scheme, sizeof(scheme), + username, sizeof(username), hostname, + sizeof(hostname), &port, resource, sizeof(resource)); + _cupsLangPrintf(stdout, + _("Output for printer %s is sent to remote " + "printer %s on %s"), + printer, strrchr(resource, '/') + 1, hostname); + } + else if (!strncmp(device, "file:", 5)) + _cupsLangPrintf(stdout, + _("Output for printer %s is sent to %s"), + printer, device + 5); + else + _cupsLangPrintf(stdout, + _("Output for printer %s is sent to %s"), + printer, device); + + for (i = 0; i < num_dests; i ++) + if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance) + { + if (device == NULL) + _cupsLangPrintf(stdout, + _("Output for printer %s/%s is sent to " + "remote printer %s on %s"), + printer, dests[i].instance, + strrchr(resource, '/') + 1, hostname); + else if (!strncmp(device, "file:", 5)) + _cupsLangPrintf(stdout, + _("Output for printer %s/%s is sent to %s"), + printer, dests[i].instance, device + 5); + else + _cupsLangPrintf(stdout, + _("Output for printer %s/%s is sent to %s"), + printer, dests[i].instance, device); + } +#else + if (device == NULL) + _cupsLangPrintf(stdout, _("device for %s: %s"), + printer, uri); + else if (!strncmp(device, "file:", 5)) + _cupsLangPrintf(stdout, _("device for %s: %s"), + printer, device + 5); + else + _cupsLangPrintf(stdout, _("device for %s: %s"), + printer, device); + + for (i = 0; i < num_dests; i ++) + if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance) + { + if (device == NULL) + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), + printer, dests[i].instance, uri); + else if (!strncmp(device, "file:", 5)) + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), + printer, dests[i].instance, device + 5); + else + _cupsLangPrintf(stdout, _("device for %s/%s: %s"), + printer, dests[i].instance, device); + } +#endif /* __osf__ */ + } + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_jobs()' - Show active print jobs. + */ + +static int /* O - 0 on success, 1 on fail */ +show_jobs(const char *dests, /* I - Destinations */ + const char *users, /* I - Users */ + int long_status, /* I - Show long status? */ + int ranking, /* I - Show job ranking? */ + const char *which) /* I - Show which jobs? */ +{ + int i; /* Looping var */ + ipp_t *request, /* IPP Request */ + *response; /* IPP Response */ + ipp_attribute_t *attr, /* Current attribute */ + *reasons; /* Job state reasons attribute */ + const char *dest, /* Pointer into job-printer-uri */ + *username, /* Pointer to job-originating-user-name */ + *title, /* Pointer to job-name */ + *message; /* Pointer to job-printer-state-message */ + int rank, /* Rank in queue */ + jobid, /* job-id */ + size; /* job-k-octets */ + time_t jobtime; /* time-at-creation */ + struct tm *jobdate; /* Date & time */ + char temp[255], /* Temporary buffer */ + date[255]; /* Date buffer */ + static const char *jattrs[] = /* Attributes we need for jobs... */ + { + "job-id", + "job-k-octets", + "job-name", + "job-originating-user-name", + "job-printer-state-message", + "job-printer-uri", + "job-state-reasons", + "time-at-creation" + }; + + + DEBUG_printf(("show_jobs(dests=\"%s\", users=\"%s\", long_status=%d, " + "ranking=%d, which=\"%s\")\n", dests, users, long_status, + ranking, which)); + + if (dests != NULL && !strcmp(dests, "all")) + dests = NULL; + + /* + * Build a IPP_GET_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * requested-attributes + * requesting-user-name + * which-jobs + */ + + request = ippNewRequest(IPP_GET_JOBS); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", + NULL, "ipp://localhost/"); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(jattrs) / sizeof(jattrs[0]), + NULL, jattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", + NULL, which); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + /* + * Loop through the job list and display them... + */ + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + rank = -1; + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_JOB) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + jobid = 0; + size = 0; + username = NULL; + dest = NULL; + jobtime = 0; + title = "no title"; + message = NULL; + reasons = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_JOB) + { + if (!strcmp(attr->name, "job-id") && + attr->value_tag == IPP_TAG_INTEGER) + jobid = attr->values[0].integer; + else if (!strcmp(attr->name, "job-k-octets") && + attr->value_tag == IPP_TAG_INTEGER) + size = attr->values[0].integer; + else if (!strcmp(attr->name, "time-at-creation") && + attr->value_tag == IPP_TAG_INTEGER) + jobtime = attr->values[0].integer; + else if (!strcmp(attr->name, "job-printer-state-message") && + attr->value_tag == IPP_TAG_TEXT) + message = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-printer-uri") && + attr->value_tag == IPP_TAG_URI) + { + if ((dest = strrchr(attr->values[0].string.text, '/')) != NULL) + dest ++; + } + else if (!strcmp(attr->name, "job-originating-user-name") && + attr->value_tag == IPP_TAG_NAME) + username = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-name") && + attr->value_tag == IPP_TAG_NAME) + title = attr->values[0].string.text; + else if (!strcmp(attr->name, "job-state-reasons") && + attr->value_tag == IPP_TAG_KEYWORD) + reasons = attr; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (dest == NULL || jobid == 0) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the job... + */ + + rank ++; + + if (match_list(dests, dest) && match_list(users, username)) + { + jobdate = localtime(&jobtime); + snprintf(temp, sizeof(temp), "%s-%d", dest, jobid); + + if (long_status == 3) + { + /* + * Show the consolidated output format for the SGI tools... + */ + + if (!strftime(date, sizeof(date), "%b %d %H:%M", jobdate)) + strcpy(date, "Unknown"); + + _cupsLangPrintf(stdout, "%s;%s;%d;%s;%s", + temp, username ? username : "unknown", + size, title ? title : "unknown", date); + } + else + { + if (!strftime(date, sizeof(date), "%c", jobdate)) + strcpy(date, "Unknown"); + + if (ranking) + _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s", + rank, temp, username ? username : "unknown", + 1024.0 * size, date); + else + _cupsLangPrintf(stdout, "%-23s %-13s %8.0f %s", + temp, username ? username : "unknown", + 1024.0 * size, date); + if (long_status) + { + if (message) + _cupsLangPrintf(stdout, _("\tStatus: %s"), message); + + if (reasons) + { + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) + { + if (i) + snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s", + reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, + sizeof(alerts)); + + aptr += strlen(aptr); + } + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); + } + + _cupsLangPrintf(stdout, _("\tqueued for %s"), dest); + } + } + } + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_printers()' - Show printers. + */ + +static int /* O - 0 on success, 1 on fail */ +show_printers(const char *printers, /* I - Destinations */ + int num_dests, /* I - Number of user-defined dests */ + cups_dest_t *dests, /* I - User-defined destinations */ + int long_status) /* I - Show long status? */ +{ + int i, j; /* Looping vars */ + ipp_t *request, /* IPP Request */ + *response, /* IPP Response */ + *jobs; /* IPP Get Jobs response */ + ipp_attribute_t *attr, /* Current attribute */ + *jobattr, /* Job ID attribute */ + *reasons; /* Job state reasons attribute */ + const char *printer, /* Printer name */ + *message, /* Printer state message */ + *description, /* Description of printer */ + *location, /* Location of printer */ + *make_model, /* Make and model of printer */ + *uri; /* URI of printer */ + ipp_attribute_t *allowed, /* requesting-user-name-allowed */ + *denied; /* requestint-user-name-denied */ + ipp_pstate_t pstate; /* Printer state */ + cups_ptype_t ptype; /* Printer type */ + time_t ptime; /* Printer state time */ + struct tm *pdate; /* Printer state date & time */ + int jobid; /* Job ID of current job */ + char printer_uri[HTTP_MAX_URI], + /* Printer URI */ + printer_state_time[255];/* Printer state time */ + _cups_globals_t *cg = _cupsGlobals(); /* Global data */ + static const char *pattrs[] = /* Attributes we need for printers... */ + { + "printer-name", + "printer-state", + "printer-state-message", + "printer-state-reasons", + "printer-state-change-time", + "printer-type", + "printer-info", + "printer-location", + "printer-make-and-model", + "printer-uri-supported", + "requesting-user-name-allowed", + "requesting-user-name-denied" + }; + static const char *jattrs[] = /* Attributes we need for jobs... */ + { + "job-id", + "job-state" + }; + + + DEBUG_printf(("show_printers(printers=\"%s\", num_dests=%d, dests=%p, " + "long_status=%d)\n", printers, num_dests, dests, long_status)); + + if (printers != NULL && !strcmp(printers, "all")) + printers = NULL; + + /* + * Build a CUPS_GET_PRINTERS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * requested-attributes + * requesting-user-name + */ + + request = ippNewRequest(CUPS_GET_PRINTERS); + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", sizeof(pattrs) / sizeof(pattrs[0]), + NULL, pattrs); + + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name", + NULL, cupsUser()); + + /* + * Do the request and get back a response... + */ + + if ((response = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + DEBUG_puts("show_printers: request succeeded..."); + + if (response->request.status.status_code > IPP_OK_CONFLICT) + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + ippDelete(response); + return (1); + } + + /* + * Loop through the printers returned in the list and display + * their status... + */ + + for (attr = response->attrs; attr != NULL; attr = attr->next) + { + /* + * Skip leading attributes until we hit a job... + */ + + while (attr != NULL && attr->group_tag != IPP_TAG_PRINTER) + attr = attr->next; + + if (attr == NULL) + break; + + /* + * Pull the needed attributes from this job... + */ + + printer = NULL; + ptime = 0; + ptype = CUPS_PRINTER_LOCAL; + pstate = IPP_PRINTER_IDLE; + message = NULL; + description = NULL; + location = NULL; + make_model = NULL; + reasons = NULL; + uri = NULL; + jobid = 0; + allowed = NULL; + denied = NULL; + + while (attr != NULL && attr->group_tag == IPP_TAG_PRINTER) + { + if (!strcmp(attr->name, "printer-name") && + attr->value_tag == IPP_TAG_NAME) + printer = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-state") && + attr->value_tag == IPP_TAG_ENUM) + pstate = (ipp_pstate_t)attr->values[0].integer; + else if (!strcmp(attr->name, "printer-type") && + attr->value_tag == IPP_TAG_ENUM) + ptype = (cups_ptype_t)attr->values[0].integer; + else if (!strcmp(attr->name, "printer-state-message") && + attr->value_tag == IPP_TAG_TEXT) + message = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-state-change-time") && + attr->value_tag == IPP_TAG_INTEGER) + ptime = (time_t)attr->values[0].integer; + else if (!strcmp(attr->name, "printer-info") && + attr->value_tag == IPP_TAG_TEXT) + description = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-location") && + attr->value_tag == IPP_TAG_TEXT) + location = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-make-and-model") && + attr->value_tag == IPP_TAG_TEXT) + make_model = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-uri-supported") && + attr->value_tag == IPP_TAG_URI) + uri = attr->values[0].string.text; + else if (!strcmp(attr->name, "printer-state-reasons") && + attr->value_tag == IPP_TAG_KEYWORD) + reasons = attr; + else if (!strcmp(attr->name, "requesting-user-name-allowed") && + attr->value_tag == IPP_TAG_NAME) + allowed = attr; + else if (!strcmp(attr->name, "requesting-user-name-denied") && + attr->value_tag == IPP_TAG_NAME) + denied = attr; + + attr = attr->next; + } + + /* + * See if we have everything needed... + */ + + if (printer == NULL) + { + if (attr == NULL) + break; + else + continue; + } + + /* + * Display the printer entry if needed... + */ + + if (match_list(printers, printer)) + { + /* + * If the printer state is "IPP_PRINTER_PROCESSING", then grab the + * current job for the printer. + */ + + if (pstate == IPP_PRINTER_PROCESSING) + { + /* + * Build an IPP_GET_JOBS request, which requires the following + * attributes: + * + * attributes-charset + * attributes-natural-language + * printer-uri + * limit + * requested-attributes + */ + + request = ippNewRequest(IPP_GET_JOBS); + + request->request.op.operation_id = IPP_GET_JOBS; + request->request.op.request_id = 1; + + ippAddStrings(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, + "requested-attributes", + sizeof(jattrs) / sizeof(jattrs[0]), NULL, jattrs); + + httpAssembleURIf(HTTP_URI_CODING_ALL, printer_uri, sizeof(printer_uri), + "ipp", NULL, "localhost", 0, "/printers/%s", printer); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, + "printer-uri", NULL, printer_uri); + + if ((jobs = cupsDoRequest(CUPS_HTTP_DEFAULT, request, "/")) != NULL) + { + /* + * Get the current active job on this queue... + */ + + ipp_jstate_t jobstate = IPP_JOB_PENDING; + jobid = 0; + + for (jobattr = jobs->attrs; jobattr; jobattr = jobattr->next) + { + if (!jobattr->name) + { + if (jobstate == IPP_JOB_PROCESSING) + break; + else + continue; + } + + if (!strcmp(jobattr->name, "job-id") && + jobattr->value_tag == IPP_TAG_INTEGER) + jobid = jobattr->values[0].integer; + else if (!strcmp(jobattr->name, "job-state") && + jobattr->value_tag == IPP_TAG_ENUM) + jobstate = jobattr->values[0].integer; + } + + if (jobstate != IPP_JOB_PROCESSING) + jobid = 0; + + ippDelete(jobs); + } + } + + /* + * Display it... + */ + + pdate = localtime(&ptime); + strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate); + + switch (pstate) + { + case IPP_PRINTER_IDLE : + _cupsLangPrintf(stdout, + _("printer %s is idle. enabled since %s"), + printer, printer_state_time); + break; + case IPP_PRINTER_PROCESSING : + _cupsLangPrintf(stdout, + _("printer %s now printing %s-%d. " + "enabled since %s"), + printer, printer, jobid, printer_state_time); + break; + case IPP_PRINTER_STOPPED : + _cupsLangPrintf(stdout, + _("printer %s disabled since %s -"), + printer, printer_state_time); + break; + } + + if ((message && *message) || pstate == IPP_PRINTER_STOPPED) + { + if (!message || !*message) + _cupsLangPuts(stdout, _("\treason unknown")); + else + _cupsLangPrintf(stdout, "\t%s", message); + } + + if (long_status > 1) + { + _cupsLangPuts(stdout, _("\tForm mounted:")); + _cupsLangPuts(stdout, _("\tContent types: any")); + _cupsLangPuts(stdout, _("\tPrinter types: unknown")); + } + + if (long_status) + { + _cupsLangPrintf(stdout, _("\tDescription: %s"), + description ? description : ""); + + if (reasons) + { + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) + { + if (i) + snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s", + reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, + sizeof(alerts)); + + aptr += strlen(aptr); + } + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); + } + } + if (long_status > 1) + { + _cupsLangPrintf(stdout, _("\tLocation: %s"), + location ? location : ""); + + if (ptype & CUPS_PRINTER_REMOTE) + { + _cupsLangPuts(stdout, _("\tConnection: remote")); + + if (make_model && !strstr(make_model, "System V Printer") && + !strstr(make_model, "Raw Printer") && uri) + _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"), + uri); + } + else + { + _cupsLangPuts(stdout, _("\tConnection: direct")); + + if (make_model && strstr(make_model, "System V Printer")) + _cupsLangPrintf(stdout, + _("\tInterface: %s/interfaces/%s"), + cg->cups_serverroot, printer); + else if (make_model && !strstr(make_model, "Raw Printer")) + _cupsLangPrintf(stdout, + _("\tInterface: %s/ppd/%s.ppd"), + cg->cups_serverroot, printer); + } + _cupsLangPuts(stdout, _("\tOn fault: no alert")); + _cupsLangPuts(stdout, _("\tAfter fault: continue")); + /* TODO update to use printer-error-policy */ + if (allowed) + { + _cupsLangPuts(stdout, _("\tUsers allowed:")); + for (j = 0; j < allowed->num_values; j ++) + _cupsLangPrintf(stdout, "\t\t%s", + allowed->values[j].string.text); + } + else if (denied) + { + _cupsLangPuts(stdout, _("\tUsers denied:")); + for (j = 0; j < denied->num_values; j ++) + _cupsLangPrintf(stdout, "\t\t%s", + denied->values[j].string.text); + } + else + { + _cupsLangPuts(stdout, _("\tUsers allowed:")); + _cupsLangPuts(stdout, _("\t\t(all)")); + } + _cupsLangPuts(stdout, _("\tForms allowed:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tBanner required")); + _cupsLangPuts(stdout, _("\tCharset sets:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tDefault pitch:")); + _cupsLangPuts(stdout, _("\tDefault page size:")); + _cupsLangPuts(stdout, _("\tDefault port settings:")); + } + + for (i = 0; i < num_dests; i ++) + if (!_cups_strcasecmp(printer, dests[i].name) && dests[i].instance) + { + switch (pstate) + { + case IPP_PRINTER_IDLE : + _cupsLangPrintf(stdout, + _("printer %s/%s is idle. " + "enabled since %s"), + printer, dests[i].instance, + printer_state_time); + break; + case IPP_PRINTER_PROCESSING : + _cupsLangPrintf(stdout, + _("printer %s/%s now printing %s-%d. " + "enabled since %s"), + printer, dests[i].instance, printer, jobid, + printer_state_time); + break; + case IPP_PRINTER_STOPPED : + _cupsLangPrintf(stdout, + _("printer %s/%s disabled since %s -"), + printer, dests[i].instance, + printer_state_time); + break; + } + + if ((message && *message) || pstate == IPP_PRINTER_STOPPED) + { + if (!message || !*message) + _cupsLangPuts(stdout, _("\treason unknown")); + else + _cupsLangPrintf(stdout, "\t%s", message); + } + + if (long_status > 1) + { + _cupsLangPuts(stdout, _("\tForm mounted:")); + _cupsLangPuts(stdout, _("\tContent types: any")); + _cupsLangPuts(stdout, _("\tPrinter types: unknown")); + } + + if (long_status) + { + _cupsLangPrintf(stdout, _("\tDescription: %s"), + description ? description : ""); + + if (reasons) + { + char alerts[1024], /* Alerts string */ + *aptr; /* Pointer into alerts string */ + + for (i = 0, aptr = alerts; i < reasons->num_values; i ++) + { + if (i) + snprintf(aptr, sizeof(alerts) - (aptr - alerts), " %s", + reasons->values[i].string.text); + else + strlcpy(alerts, reasons->values[i].string.text, + sizeof(alerts)); + + aptr += strlen(aptr); + } + + _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts); + } + } + if (long_status > 1) + { + _cupsLangPrintf(stdout, _("\tLocation: %s"), + location ? location : ""); + + if (ptype & CUPS_PRINTER_REMOTE) + { + _cupsLangPuts(stdout, _("\tConnection: remote")); + + if (make_model && !strstr(make_model, "System V Printer") && + !strstr(make_model, "Raw Printer") && uri) + _cupsLangPrintf(stdout, _("\tInterface: %s.ppd"), uri); + } + else + { + _cupsLangPuts(stdout, _("\tConnection: direct")); + + if (make_model && strstr(make_model, "System V Printer")) + _cupsLangPrintf(stdout, + _("\tInterface: %s/interfaces/%s"), + cg->cups_serverroot, printer); + else if (make_model && !strstr(make_model, "Raw Printer")) + _cupsLangPrintf(stdout, + _("\tInterface: %s/ppd/%s.ppd"), + cg->cups_serverroot, printer); + } + _cupsLangPuts(stdout, _("\tOn fault: no alert")); + _cupsLangPuts(stdout, _("\tAfter fault: continue")); + /* TODO update to use printer-error-policy */ + if (allowed) + { + _cupsLangPuts(stdout, _("\tUsers allowed:")); + for (j = 0; j < allowed->num_values; j ++) + _cupsLangPrintf(stdout, "\t\t%s", + allowed->values[j].string.text); + } + else if (denied) + { + _cupsLangPuts(stdout, _("\tUsers denied:")); + for (j = 0; j < denied->num_values; j ++) + _cupsLangPrintf(stdout, "\t\t%s", + denied->values[j].string.text); + } + else + { + _cupsLangPuts(stdout, _("\tUsers allowed:")); + _cupsLangPuts(stdout, _("\t\t(all)")); + } + _cupsLangPuts(stdout, _("\tForms allowed:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tBanner required")); + _cupsLangPuts(stdout, _("\tCharset sets:")); + _cupsLangPuts(stdout, _("\t\t(none)")); + _cupsLangPuts(stdout, _("\tDefault pitch:")); + _cupsLangPuts(stdout, _("\tDefault page size:")); + _cupsLangPuts(stdout, _("\tDefault port settings:")); + } + } + } + + if (attr == NULL) + break; + } + + ippDelete(response); + } + else + { + _cupsLangPrintf(stderr, "lpstat: %s", cupsLastErrorString()); + return (1); + } + + return (0); +} + + +/* + * 'show_scheduler()' - Show scheduler status. + */ + +static void +show_scheduler(void) +{ + http_t *http; /* Connection to server */ + + + if ((http = httpConnectEncrypt(cupsServer(), ippPort(), + cupsEncryption())) != NULL) + { + _cupsLangPuts(stdout, _("scheduler is running")); + httpClose(http); + } + else + _cupsLangPuts(stdout, _("scheduler is not running")); +} + + +/* + * End of "$Id: lpstat.c 10064 2011-10-07 21:41:07Z mike $". + */ diff --git a/templates/Makefile b/templates/Makefile new file mode 100644 index 0000000..fe2d982 --- /dev/null +++ b/templates/Makefile @@ -0,0 +1,204 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Template makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1993-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Template files... +# + +FILES = \ + add-class.tmpl \ + add-printer.tmpl \ + add-rss-subscription.tmpl \ + admin.tmpl \ + choose-device.tmpl \ + choose-make.tmpl \ + choose-model.tmpl \ + choose-serial.tmpl \ + choose-uri.tmpl \ + class.tmpl \ + class-added.tmpl \ + class-confirm.tmpl \ + class-deleted.tmpl \ + class-jobs-header.tmpl \ + class-modified.tmpl \ + classes.tmpl \ + classes-header.tmpl \ + command.tmpl \ + edit-config.tmpl \ + error.tmpl \ + error-op.tmpl \ + header.tmpl \ + help-header.tmpl \ + help-trailer.tmpl \ + help-printable.tmpl \ + job-cancel.tmpl \ + job-hold.tmpl \ + job-move.tmpl \ + job-moved.tmpl \ + job-release.tmpl \ + job-restart.tmpl \ + jobs.tmpl \ + jobs-header.tmpl \ + list-available-printers.tmpl \ + modify-class.tmpl \ + modify-printer.tmpl \ + norestart.tmpl \ + option-boolean.tmpl \ + option-conflict.tmpl \ + option-header.tmpl \ + option-pickmany.tmpl \ + option-pickone.tmpl \ + option-trailer.tmpl \ + pager.tmpl \ + printer.tmpl \ + printer-accept.tmpl \ + printer-added.tmpl \ + printer-configured.tmpl \ + printer-confirm.tmpl \ + printer-default.tmpl \ + printer-deleted.tmpl \ + printer-jobs-header.tmpl \ + printer-modified.tmpl \ + printer-purge.tmpl \ + printer-reject.tmpl \ + printer-start.tmpl \ + printer-stop.tmpl \ + printers.tmpl \ + printers-header.tmpl \ + restart.tmpl \ + samba-export.tmpl \ + samba-exported.tmpl \ + search.tmpl \ + set-printer-options-header.tmpl \ + set-printer-options-trailer.tmpl \ + subscription-added.tmpl \ + subscription-canceled.tmpl \ + test-page.tmpl \ + trailer.tmpl \ + users.tmpl + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: $(INSTALL_LANGUAGES) + $(INSTALL_DIR) -m 755 $(DATADIR)/templates + for file in $(FILES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/templates; \ + done + +install-languages: + for lang in $(LANGUAGES); do \ + if test -d $$lang; then \ + $(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \ + for file in $(FILES); do \ + $(INSTALL_DATA) $$lang/$$file $(DATADIR)/templates/$$lang >/dev/null 2>&1 || true; \ + done \ + fi \ + done + +install-langbundle: + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: $(UNINSTALL_LANGUAGES) + for file in $(FILES); do \ + $(RM) $(DATADIR)/templates/$$file; \ + done + -$(RMDIR) $(DATADIR)/templates + +uninstall-languages: + for lang in $(LANGUAGES); do \ + for file in $(FILES); do \ + $(RM) $(DATADIR)/templates/$$lang/$$file; \ + done \ + $(RMDIR) $(DATADIR)/templates/$$lang; \ + done + +uninstall-langbundle: + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/templates/add-class.tmpl b/templates/add-class.tmpl new file mode 100644 index 0000000..eaf52d7 --- /dev/null +++ b/templates/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Add Class

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(May contain any printable characters except "/", "#", and space)
Description:
+(Human-readable description such as "HP LaserJet with Duplexer")
Location:
+(Human-readable location such as "Lab 1")
Members: + +
+ +
+
\ No newline at end of file diff --git a/templates/add-printer.tmpl b/templates/add-printer.tmpl new file mode 100644 index 0000000..361958b --- /dev/null +++ b/templates/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Add Printer

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(May contain any printable characters except "/", "#", and space)
Description:
+(Human-readable description such as "HP LaserJet with Duplexer")
Location:
+(Human-readable location such as "Lab 1")
Connection:{device_uri}
Sharing: +Share This Printer
+ +
+
\ No newline at end of file diff --git a/templates/add-rss-subscription.tmpl b/templates/add-rss-subscription.tmpl new file mode 100644 index 0000000..17e3fa0 --- /dev/null +++ b/templates/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Add RSS Subscription

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(May contain any printable characters except space, "/", "?", and "#")
Queue:
Events:Job Created
+Job Completed
+Job Stopped
+Job Options Changed
    Queue Stopped
+Queue Added
+Queue Modified
+Queue Deleted
    Server Started
+Server Stopped
+Server Restarted
+Server Security Auditing
Maximum Events in Feed:
+ +
diff --git a/templates/admin.tmpl b/templates/admin.tmpl new file mode 100644 index 0000000..477da13 --- /dev/null +++ b/templates/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Printers

+ +

+

+
+
+{have_samba?
:} +

+ +

Classes

+ +

+

+
+

+ +

Jobs

+ +

+

+

+ +
          + +

Server

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Server Settings\:

+ +

Advanced
+ + + Show printers shared by other systems
+        Protocols\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Share printers connected to this system
+        Max clients\: +
+        Protocols\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Allow printing from the Internet
+         Advertise web interface
+ Allow remote administration
+{have_gssapi? Use Kerberos authentication (FAQ)
:} + Allow users to cancel any job (not just their own)
+ Preserve job history
+        Number of jobs\: +
+         Preserve job print files
+ Save debugging information for troubleshooting
+        Max log file size\: +

+ +:

Server Settings:

+ +

Advanced
+ + Show printers shared by other systems
+ Share printers connected to this system
+         Allow printing from the Internet
+ Allow remote administration
+{have_gssapi? Use Kerberos authentication (FAQ)
:} + Allow users to cancel any job (not just their own)
+ Save debugging information for troubleshooting

+ +} +

+ +
} + +
+ +
+ +

RSS Subscriptions

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NameEventsQueue Name
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:All Queues}
:} diff --git a/templates/choose-device.tmpl b/templates/choose-device.tmpl new file mode 100644 index 0000000..c5ab251 --- /dev/null +++ b/templates/choose-device.tmpl @@ -0,0 +1,53 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Add Printer}

+ +{CUPS_GET_DEVICES_DONE?
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Current Connection\: +{current_device_uri}
Local Printers\: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Discovered Network Printers\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Other Network Printers\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
:

Looking for printers...

} + +
diff --git a/templates/choose-make.tmpl b/templates/choose-make.tmpl new file mode 100644 index 0000000..65096ad --- /dev/null +++ b/templates/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Add Printer}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{printer_name}
Description:{printer_info}
Location:{printer_location}
Connection:{device_uri}
Sharing: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Share This Printer
Make: + +
 
Or Provide a PPD File:
+ +
+
\ No newline at end of file diff --git a/templates/choose-model.tmpl b/templates/choose-model.tmpl new file mode 100644 index 0000000..992cd01 --- /dev/null +++ b/templates/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Add Printer}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{printer_name}
Description:{printer_info}
Location:{printer_location}
Connection:{device_uri}
Sharing: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Share This Printer
Make:{PPD_MAKE}
Model: + +
Or Provide a PPD File:
+ +
+
\ No newline at end of file diff --git a/templates/choose-serial.tmpl b/templates/choose-serial.tmpl new file mode 100644 index 0000000..56a14a4 --- /dev/null +++ b/templates/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Add Printer}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Connection:{device_uri}
Baud Rate:
Parity:
Data Bits:
Flow Control:
+ +
+
\ No newline at end of file diff --git a/templates/choose-uri.tmpl b/templates/choose-uri.tmpl new file mode 100644 index 0000000..45d84de --- /dev/null +++ b/templates/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Add Printer}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Connection:
Examples: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

See "Network +Printers" for the correct URI to use with your printer.

+ +
+ +
+
\ No newline at end of file diff --git a/templates/class-added.tmpl b/templates/class-added.tmpl new file mode 100644 index 0000000..c062a16 --- /dev/null +++ b/templates/class-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Add Class

+ +

Class {printer_name} has been added +successfully. + +

diff --git a/templates/class-confirm.tmpl b/templates/class-confirm.tmpl new file mode 100644 index 0000000..5f0277c --- /dev/null +++ b/templates/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Delete Class {printer_name}

+ +

Warning: Are you sure you want to delete class +{printer_name}?

+ +

+ +
diff --git a/templates/class-deleted.tmpl b/templates/class-deleted.tmpl new file mode 100644 index 0000000..a4ad46a --- /dev/null +++ b/templates/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Delete Class {printer_name}

+ +

Class {printer_name} has been deleted successfully. + +

\ No newline at end of file diff --git a/templates/class-jobs-header.tmpl b/templates/class-jobs-header.tmpl new file mode 100644 index 0000000..ba46f10 --- /dev/null +++ b/templates/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Jobs

+
diff --git a/templates/class-modified.tmpl b/templates/class-modified.tmpl new file mode 100644 index 0000000..fe42c90 --- /dev/null +++ b/templates/class-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modify Class {printer_name}

+ +

Class {printer_name} has been +modified successfully. + +

\ No newline at end of file diff --git a/templates/class.tmpl b/templates/class.tmpl new file mode 100644 index 0000000..477e0e8 --- /dev/null +++ b/templates/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, +{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, +{server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Description:{printer_info}
Location:{printer_location}
Members:{?member_uris=?None:{member_uris}}
Defaults:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/classes-header.tmpl b/templates/classes-header.tmpl new file mode 100644 index 0000000..7ac98fb --- /dev/null +++ b/templates/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?No classes:Showing {#printer_name} of {total} class{total=1?:es}}.

diff --git a/templates/classes.tmpl b/templates/classes.tmpl new file mode 100644 index 0000000..51e454f --- /dev/null +++ b/templates/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Queue Name : Queue Name }DescriptionLocationMembersStatus
{printer_name}{printer_info}{printer_location}{?member_uris=?None:{member_uris}}{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/command.tmpl b/templates/command.tmpl new file mode 100644 index 0000000..9a87439 --- /dev/null +++ b/templates/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} On {printer_name}

+ +

{job_state>5?:Busy Indicator }Printer command job +{job_state=3?pending:{job_state=4?held: +{job_state=5?processing:{job_state=6?stopped: +{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/de/add-class.tmpl b/templates/de/add-class.tmpl new file mode 100644 index 0000000..2753bb9 --- /dev/null +++ b/templates/de/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Klasse hinzufügen

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)
Beschreibung:
+(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")
Ort:
+(Für Menschen lesbarer Ort wie "Lab 1")
Mitglieder: + +
+ +
+
diff --git a/templates/de/add-printer.tmpl b/templates/de/add-printer.tmpl new file mode 100644 index 0000000..15380b9 --- /dev/null +++ b/templates/de/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Drucker hinzufügen

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(Darf alle druckbaren Zeichen außer "/", "#", und Leerzeichen enthalten)
Beschreibung:
+(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")
Ort:
+(Für Menschen lesbarer Ort wie "Lab 1")
Verbindung:{device_uri}
Freigabe: +Diesen Drucker freigeben
+ +
+
diff --git a/templates/de/add-rss-subscription.tmpl b/templates/de/add-rss-subscription.tmpl new file mode 100644 index 0000000..6b92fac --- /dev/null +++ b/templates/de/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

RSS Subskription hinzufügen

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:
+(Darf alle druckbaren Zeichen außer Leerzeichen, "/", "?", und "#" enthalten)
Warteschlange:
Ereignisse:Auftrag Erstellt
+Auftrag Abgeschlossen
+Auftrag Gestoppt
+Auftrags Parameter Geändert
    Warteschlange Gestoppt
+Warteschlange Hinzugefügt
+Warteschlange Geändert
+Warteschlange Gelöscht
    Server Gestartet
+Server Gestoppt
+Server Neu Gestartet
+Server Sicherheits Prüfung
Maximale Ereignisse in Durchführung:
+ +
diff --git a/templates/de/admin.tmpl b/templates/de/admin.tmpl new file mode 100644 index 0000000..1ad1326 --- /dev/null +++ b/templates/de/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Drucker

+ +

+

+
+
+{have_samba?
:} +

+ +

Klassen

+ +

+

+
+

+ +

Druckaufträge

+ +

+

+

+ +
          + +

Server

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Erweiterte Servereinstellungen\:

+ +

Erweitert
+ + + Zeige freigegebene Drucker von anderen Systemen
+        Protokolle\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Freigeben von Druckern welche mit diesem System verbunden sind
+        Klienten maximal\: +
+        Protokolle\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Erlaube Drucken vom Internet aus
+         Veröffentliche Webinterface
+ Erlaube entfernte Verwaltung
+{have_gssapi? Benutze Kerberos Authentifizierung (FAQ)
:} + Erlaube Benutzern jeden Auftrag abzubrechen (nicht nur die Eigenen)
+ Auftragsverlauf aufbewahren
+        Anzahl der Aufträge\: +
+         Dateien von Druckaufträgen aufbewahren
+ Speichere Fehlerinformationen für Fehlersuche
+        Maximale Größe der Protokolldatei\: +

+ +:

Grundlegende Servereinstellungen:

+ +

Erweitert
+ + Zeige freigegebene Drucker von anderen Systemen
+ Freigeben von Druckern welche mit diesem System verbunden sind
+         Erlaube Drucken vom Internet aus
+ Erlaube entfernte Verwaltung
+{have_gssapi? Benutze Kerberos Authentifizierung (FAQ)
:} + Erlaube Benutzern jeden Auftrag abzubrechen (nicht nur die Eigenen)
+ Speichere Fehlerinformationen für Fehlersuche

+ +} +

+ +
} + +
+ +
+ +

RSS Subskriptionen

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NameEreignisWarteschlange
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Alle Warteschlangen}
:} diff --git a/templates/de/choose-device.tmpl b/templates/de/choose-device.tmpl new file mode 100644 index 0000000..3be8a35 --- /dev/null +++ b/templates/de/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

+ +{CUPS_GET_DEVICES_DONE?:

Suche nach Druckern...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Aktuelle Verbindung: +{current_device_uri}
Lokale Drucker: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}
+:}} +
Entdeckte Netzwerkdrucker: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}
+:}:}} +
Andere Netzwerkdrucker: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unbekannt?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/de/choose-make.tmpl b/templates/de/choose-make.tmpl new file mode 100644 index 0000000..6d572a6 --- /dev/null +++ b/templates/de/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{printer_name}
Beschreibung:{printer_info}
Ort:{printer_location}
Verbindung:{device_uri}
Freigabe: +Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} freigeben
Marke: + +
 
Oder stellen Sie eine PPD Datei bereit:
+ +
+
diff --git a/templates/de/choose-model.tmpl b/templates/de/choose-model.tmpl new file mode 100644 index 0000000..2f5bb18 --- /dev/null +++ b/templates/de/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name:{printer_name}
Beschreibung:{printer_info}
Ort:{printer_location}
Verbindung:{device_uri}
Freigabe: +Diesen Drucker {?printer_is_shared=?nicht:{?printer_is_shared=0?nicht:}} freigeben
Marke:{PPD_MAKE}
Modell: + +
Oder stellen Sie eine PPD Datei bereit:
+ +
+
diff --git a/templates/de/choose-serial.tmpl b/templates/de/choose-serial.tmpl new file mode 100644 index 0000000..a6f0044 --- /dev/null +++ b/templates/de/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Verbindung:{device_uri}
Baud Rate:
Parität:
Daten Bits:
Flußkontrolle:
+ +
+
diff --git a/templates/de/choose-uri.tmpl b/templates/de/choose-uri.tmpl new file mode 100644 index 0000000..0633fd6 --- /dev/null +++ b/templates/de/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?{printer_name} ändern:Drucker hinzufügen}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Verbindung:
Beispiele: +
+    http://Hostname:631/ipp/
+    http://Hostname:631/ipp/Anschluss1
+
+    ipp://Hostname/ipp/
+    ipp://Hostname/ipp/Anschluss1
+
+    lpd://Hostname/Warteschlange
+
+    socket://Hostname
+    socket://Hostname:9100
+
+ +

Bitte lesen Sie "Netzwerk +Drucker" um die korrekte URI für Ihren Drucker zu benutzen.

+ +
+ +
+
diff --git a/templates/de/class-added.tmpl b/templates/de/class-added.tmpl new file mode 100644 index 0000000..3b05769 --- /dev/null +++ b/templates/de/class-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Klasse hinzufügen

+ +

Die Klasse {printer_name} wurde erfolgreich +hinzugefügt. + +

diff --git a/templates/de/class-confirm.tmpl b/templates/de/class-confirm.tmpl new file mode 100644 index 0000000..5e0223c --- /dev/null +++ b/templates/de/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Klasse {printer_name} löschen

+ +

Warnung: Sind Sie sicher, dass Sie die Klasse +{printer_name} löschen wollen?

+ +

+ +
diff --git a/templates/de/class-deleted.tmpl b/templates/de/class-deleted.tmpl new file mode 100644 index 0000000..9357924 --- /dev/null +++ b/templates/de/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Klasse {printer_name} löschen

+ +

Die Klasse {printer_name} wurde erfolgreich gelöscht. + +

diff --git a/templates/de/class-jobs-header.tmpl b/templates/de/class-jobs-header.tmpl new file mode 100644 index 0000000..4f3de93 --- /dev/null +++ b/templates/de/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Aufträge

+
diff --git a/templates/de/class-modified.tmpl b/templates/de/class-modified.tmpl new file mode 100644 index 0000000..b5ad0da --- /dev/null +++ b/templates/de/class-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Klasse {printer_name} ändern

+ +

Die Klasse {printer_name} wurde +erfolgreich geändert. + +

diff --git a/templates/de/class.tmpl b/templates/de/class.tmpl new file mode 100644 index 0000000..61a89dc --- /dev/null +++ b/templates/de/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}, +{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert}, +{server_is_sharing_printers=0?Nicht:{printer_is_shared=0?Nicht:}} Freigegeben{default_name={printer_name}?, Standarddrucker:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Beschreibung:{printer_info}
Ort:{printer_location}
Mitglieder:{?member_uris=?None:{member_uris}}
Standardeinstellungen:job-sheets={job_sheets_default} +media={media_default?{media_default}:unbekannt} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/de/classes-header.tmpl b/templates/de/classes-header.tmpl new file mode 100644 index 0000000..5fa4d4a --- /dev/null +++ b/templates/de/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Keine Klassen:Zeige {#printer_name} von {total} Klasse{total=1?:n}}.

diff --git a/templates/de/classes.tmpl b/templates/de/classes.tmpl new file mode 100644 index 0000000..1a919a8 --- /dev/null +++ b/templates/de/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Wartweschlange : Warteschlange }BeschreibungOrtMitgliederStatus
{printer_name}{printer_info}{printer_location}{?member_uris=?Keine:{member_uris}}{printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/de/command.tmpl b/templates/de/command.tmpl new file mode 100644 index 0000000..45e8dce --- /dev/null +++ b/templates/de/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} auf {printer_name}

+ +

{job_state>5?:Busy Indicator }Drucker Befehlsauftrag +{job_state=3?unerledigt:{job_state=4?gehalten: +{job_state=5?verarbeite:{job_state=6?gestoppt: +{job_state=7?gelöscht:{job_state=8?abgebrochen:beendet}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/de/edit-config.tmpl b/templates/de/edit-config.tmpl new file mode 100644 index 0000000..f291313 --- /dev/null +++ b/templates/de/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Konfigurationsdatei ändern

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/de/error-op.tmpl b/templates/de/error-op.tmpl new file mode 100644 index 0000000..d47e730 --- /dev/null +++ b/templates/de/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Error

+ +

Fehler:

+ +
Unbekannte Operation "{op}"!
+ +
diff --git a/templates/de/error.tmpl b/templates/de/error.tmpl new file mode 100644 index 0000000..1a7f650 --- /dev/null +++ b/templates/de/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Error

+ +

{?message?{message}:Fehler:}

+ +
{error}
+ +
diff --git a/templates/de/header.tmpl.in b/templates/de/header.tmpl.in new file mode 100644 index 0000000..09a4816 --- /dev/null +++ b/templates/de/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/de/option-conflict.tmpl b/templates/de/option-conflict.tmpl new file mode 100644 index 0000000..eac3c0d --- /dev/null +++ b/templates/de/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Error: The following options are conflicting:

+ + + +

Bitte ändern sie eine oder mehrere Einstellungen um die Konflikte zu lösen.

diff --git a/templates/de/option-header.tmpl b/templates/de/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/de/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Startseite    Verwaltung    Klassen    Online-Hilfe    Aufträge    Drucker  
 
diff --git a/templates/de/help-header.tmpl b/templates/de/help-header.tmpl new file mode 100644 index 0000000..a2d68a5 --- /dev/null +++ b/templates/de/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Suche in +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}: + +

+ +
+ + + + +{QUERY?

Suchergebnisse in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:allen Dokumenten}}\:

+{QTEXT?:} +:

Keine Übereinstimmung gefunden.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

CUPS Hilfeseiten

+ +

Dies ist das CUPS online Hilfesystem. Geben Sie Ihren Suchbegriff +oben ein oder klicken Sie auf einen der Dokumentationslinks +um sich die Online Hilfe Informationen anzeigen zu lassen.

+ +

Wenn Sie noch unerfahren im Umgang mit CUPS sind, lesen Sie die "CUPS Übersicht". +Erfahrene Benutzer sollten "Was ist neu in CUPS +1.4" lesen.

+ +

Die CUPS Webseite bietet +ebenfalls viele Angebote inklusive Diskussionsforen fü Benutzer, +Antworten auf häufig gestellte Fragen, und ein Formular für +Fehlerberichte und Wünsche.

} diff --git a/templates/de/help-printable.tmpl b/templates/de/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/de/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/de/help-trailer.tmpl b/templates/de/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/de/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/de/job-cancel.tmpl b/templates/de/job-cancel.tmpl new file mode 100644 index 0000000..9bf6f38 --- /dev/null +++ b/templates/de/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Auftrag {job_id} löschen

+ +

Auftrag {job_id} wurde gelöscht. + +

diff --git a/templates/de/job-hold.tmpl b/templates/de/job-hold.tmpl new file mode 100644 index 0000000..aaddb20 --- /dev/null +++ b/templates/de/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Auftrag {job_id} anhalten

+ +

Auftrag {job_id} wurde vom Drucken abgehalten. + +

diff --git a/templates/de/job-move.tmpl b/templates/de/job-move.tmpl new file mode 100644 index 0000000..67c57dd --- /dev/null +++ b/templates/de/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}

+ + + + + + + + + + +
Neues Ziel: + +
+ +
+ +
diff --git a/templates/de/job-moved.tmpl b/templates/de/job-moved.tmpl new file mode 100644 index 0000000..ad9624e --- /dev/null +++ b/templates/de/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Auftrag {job_id} verschieben:Alle Aufträge verschieben}

+ +

{job_id?Auftrag {job_id}:Alle Aufträge} nach +{job_printer_name} verschoben.

+ +
diff --git a/templates/de/job-release.tmpl b/templates/de/job-release.tmpl new file mode 100644 index 0000000..e1d4227 --- /dev/null +++ b/templates/de/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Auftrag {job_id} freigeben

+ +

Auftrag {job_id} wurde zum Drucken freigegeben. + +

diff --git a/templates/de/job-restart.tmpl b/templates/de/job-restart.tmpl new file mode 100644 index 0000000..b487697 --- /dev/null +++ b/templates/de/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Auftrag {job_id} neu starten

+ +

Auftrag {job_id} wurde neu gestartet. + +

diff --git a/templates/de/jobs-header.tmpl b/templates/de/jobs-header.tmpl new file mode 100644 index 0000000..6565af4 --- /dev/null +++ b/templates/de/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Keine Aufträge:Zeige {#job_id} von {total} {?which_jobs=?aktiven:{which_jobs=all?:beendeten}} {total=1?Auftrag:Aufträgen}}.

diff --git a/templates/de/jobs.tmpl b/templates/de/jobs.tmpl new file mode 100644 index 0000000..94a60b0 --- /dev/null +++ b/templates/de/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NameBenutzerGrößeSeitenStatusKontrolle
{job_printer_name}-{job_id} {?job_name=?Unbekannt:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Unbekannt:{?job_media_sheets_completed}} {job_state=3?unerledigt seit
{time_at_creation}:{job_state=4?angehalten seit
{time_at_creation}: +{job_state=5?verarbeitet seit
{time_at_processing}:{job_state=6?gestoppt: +{job_state=7?gelöscht am
{time_at_completed}:{job_state=8?abgebrochen:beendet am
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/de/list-available-printers.tmpl b/templates/de/list-available-printers.tmpl new file mode 100644 index 0000000..08a0452 --- /dev/null +++ b/templates/de/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Verfügbare Drucker

+ +{#device_uri=0?

Keine Drucker gefunden.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/de/modify-class.tmpl b/templates/de/modify-class.tmpl new file mode 100644 index 0000000..2e0bae8 --- /dev/null +++ b/templates/de/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Klasse {printer_name} ändern

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Beschreibung:
Ort:
Mitglieder: + +
+ +
+
diff --git a/templates/de/modify-printer.tmpl b/templates/de/modify-printer.tmpl new file mode 100644 index 0000000..d128471 --- /dev/null +++ b/templates/de/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

{printer_name} ändern

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Beschreibung:
+(Für Menschen lesbare Beschreibung wie "HP LaserJet with Duplexer")
Ort:
+(Für Menschen lesbarer Ort wie "Lab 1")
Verbindung:{device_uri}
Freigabe: +Diesen Drucker freigeben
+ +
+
diff --git a/templates/de/norestart.tmpl b/templates/de/norestart.tmpl new file mode 100644 index 0000000..fb22b15 --- /dev/null +++ b/templates/de/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Change Settings

+ +

Der Server wurde nicht neu gestartet, da die Konfiguration +nicht geändert wurde...

+ +
diff --git a/templates/de/option-boolean.tmpl b/templates/de/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/de/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/de/option-pickmany.tmpl b/templates/de/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/de/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/de/option-pickone.tmpl b/templates/de/option-pickone.tmpl new file mode 100644 index 0000000..111397c --- /dev/null +++ b/templates/de/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/de/option-trailer.tmpl b/templates/de/option-trailer.tmpl new file mode 100644 index 0000000..87adedb --- /dev/null +++ b/templates/de/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/de/pager.tmpl b/templates/de/pager.tmpl new file mode 100644 index 0000000..6bc63d6 --- /dev/null +++ b/templates/de/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/de/printer-accept.tmpl b/templates/de/printer-accept.tmpl new file mode 100644 index 0000000..25045fa --- /dev/null +++ b/templates/de/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Aufträge von {is_class?Klasse:Drucker} {printer_name} akzeptieren

+ +

{is_class?Klasse:Drucker} {printer_name} +aktzeptiert jetzt Aufträge.

+ +
diff --git a/templates/de/printer-added.tmpl b/templates/de/printer-added.tmpl new file mode 100644 index 0000000..fe712be --- /dev/null +++ b/templates/de/printer-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Drucker hinzufügen

+ +

Drucker {printer_name} wurde erfolgreich +hinzufügt. + +

diff --git a/templates/de/printer-configured.tmpl b/templates/de/printer-configured.tmpl new file mode 100644 index 0000000..60e27c2 --- /dev/null +++ b/templates/de/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Standardeinstellungen für {printer_name} festlegen

+ +

Standardeinstellungen für {OP=set-class-options?Klasse :Drucker }{printer_name} +wurden erfolgreich gesetzt. + +

diff --git a/templates/de/printer-confirm.tmpl b/templates/de/printer-confirm.tmpl new file mode 100644 index 0000000..030f652 --- /dev/null +++ b/templates/de/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Drucker {printer_name} löschen

+ +

Warnung: Sind Sie sicher, dass Sie den Drucker +{printer_name} löschen wollen?

+ +

+ +
diff --git a/templates/de/printer-default.tmpl b/templates/de/printer-default.tmpl new file mode 100644 index 0000000..ac2221f --- /dev/null +++ b/templates/de/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

{is_class?Klasse:Drucker} {printer_name} als Standard festlegen

+ +

{is_class?Klasse:Drucker} {printer_name} +wurde zum Standarddrucker für diesen Server gemacht.

+ +
Notiz: Die Einstellungen des Standarddruckers +welche von Benutzern mittels dem lpoptions Befehl gesetzt wurden, +überschreiben diese Einstellung.
+ +
diff --git a/templates/de/printer-deleted.tmpl b/templates/de/printer-deleted.tmpl new file mode 100644 index 0000000..6046113 --- /dev/null +++ b/templates/de/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Drucker {printer_name} löschen

+ +

Drucker {printer_name} wurde erfolgreich gelöscht. + +

diff --git a/templates/de/printer-jobs-header.tmpl b/templates/de/printer-jobs-header.tmpl new file mode 100644 index 0000000..4f3de93 --- /dev/null +++ b/templates/de/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Aufträge

+
diff --git a/templates/de/printer-modified.tmpl b/templates/de/printer-modified.tmpl new file mode 100644 index 0000000..b6e10bd --- /dev/null +++ b/templates/de/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Drucker {printer_name} ändern

+ +

Drucker {printer_name} wurde +erfolgreich geändert. + +

diff --git a/templates/de/printer-purge.tmpl b/templates/de/printer-purge.tmpl new file mode 100644 index 0000000..1ff63ac --- /dev/null +++ b/templates/de/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Aufträge für {is_class?die Klasse:den Drucker} {printer_name} verwerfen

+ +

Aufträge für {is_class?die Klasse:den Drucker} {printer_name} +wurden verworfen.

+ +
diff --git a/templates/de/printer-reject.tmpl b/templates/de/printer-reject.tmpl new file mode 100644 index 0000000..1a5de73 --- /dev/null +++ b/templates/de/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Aufträge für {is_class?die Klasse:den Drucker} {printer_name} ablehnen

+ +

{is_class?Die Klasse:Der Drucker} {printer_name} +akzeptiert keine weiteren Aufträge.

+ +
diff --git a/templates/de/printer-start.tmpl b/templates/de/printer-start.tmpl new file mode 100644 index 0000000..7a78568 --- /dev/null +++ b/templates/de/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?Die Klasse:Den Drucker} {printer_name} fortfahren

+ +

{is_class?Die Klassen:Der Drucker} {printer_name} +wird fortgesetzt.

+ +
diff --git a/templates/de/printer-stop.tmpl b/templates/de/printer-stop.tmpl new file mode 100644 index 0000000..b304bd9 --- /dev/null +++ b/templates/de/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?Die Klasse:Den Drucker} {printer_name} anhalten

+ +

{is_class?Die Klasse:Der Drucker} {printer_name} +wurde angehalten.

+ +
diff --git a/templates/de/printer.tmpl b/templates/de/printer.tmpl new file mode 100644 index 0000000..ffc58e9 --- /dev/null +++ b/templates/de/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}, +{printer_is_accepting_jobs=0?Aufträge werden ablehnt:Aufträge werden akzeptiert}, +{server_is_sharing_printers=0?Nicht:{printer_is_shared=0?Nicht:}} freigegeben{default_name={printer_name}?, Standarddrucker:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Beschreibung:{printer_info}
Ort:{printer_location}
Treiber:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Verbindung:{device_uri}
Einstellungen:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/de/printers-header.tmpl b/templates/de/printers-header.tmpl new file mode 100644 index 0000000..d07f783 --- /dev/null +++ b/templates/de/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Keine Drucker:Zeige {#printer_name} von {total} Drucker}.

diff --git a/templates/de/printers.tmpl b/templates/de/printers.tmpl new file mode 100644 index 0000000..2180a08 --- /dev/null +++ b/templates/de/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Queue Name : Queue Name }BeschreibungOrtMarke und ModellStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Frei:{printer_state=4?Beschäftigt:Angehalten}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/de/restart.tmpl b/templates/de/restart.tmpl new file mode 100644 index 0000000..245300f --- /dev/null +++ b/templates/de/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Einstellungen ändern

+ +

Bitte warten Sie während der Server neu startet...

+ +
diff --git a/templates/de/samba-export.tmpl b/templates/de/samba-export.tmpl new file mode 100644 index 0000000..ab2b0c6 --- /dev/null +++ b/templates/de/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Drucker für Samba freigeben

+ +{error?

Kann Drucker nicht für Samba freigeben\:

+
{error}
+

Consult the Fehlerprotokoll Datei um mehr Informationen zu erhalten.

: +

Diese Seite erlaubt es Ihnen Drucker für Samba bereitzustellen +damit auf diese mittels Windows Clients über die Desktopsymbole +Netzwerk Nachbarn oder Netzwerkumgebung +zugegriffen werden kann. Sie müssen zuerst einen +Windows PostScript Druckerteiber installieren wie diese in der Hilfe für cupsaddsmb(8) beschrieben ist.

} + + + + + + + + + + + + + + + + + + +
Drucker: +
+ Alle Drucker freigeben +
Samba Benutzername: (benötigt)
Samba Passwort: (benötigt)
+ +
diff --git a/templates/de/samba-exported.tmpl b/templates/de/samba-exported.tmpl new file mode 100644 index 0000000..cf5db88 --- /dev/null +++ b/templates/de/samba-exported.tmpl @@ -0,0 +1 @@ +

Drucker wurden erfolgreich für Samba freigegeben.

diff --git a/templates/de/search.tmpl b/templates/de/search.tmpl new file mode 100644 index 0000000..a462ae0 --- /dev/null +++ b/templates/de/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Suche in +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Klassen:{SECTION=jobs?Aufträgen:Drucker}}}: +

+ +
diff --git a/templates/de/set-printer-options-header.tmpl b/templates/de/set-printer-options-header.tmpl new file mode 100644 index 0000000..75f9f4f --- /dev/null +++ b/templates/de/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Standardeinstellungen für {printer_name} festlegen

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/de/set-printer-options-trailer.tmpl b/templates/de/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/de/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/de/subscription-added.tmpl b/templates/de/subscription-added.tmpl new file mode 100644 index 0000000..fe4f1cd --- /dev/null +++ b/templates/de/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskription {subscription_name} wurde erfolgreich hinzugefügt.

+ +
diff --git a/templates/de/subscription-canceled.tmpl b/templates/de/subscription-canceled.tmpl new file mode 100644 index 0000000..56f7a97 --- /dev/null +++ b/templates/de/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskription #{notify_subscription_id} wurde gekündigt.

+ +
diff --git a/templates/de/test-page.tmpl b/templates/de/test-page.tmpl new file mode 100644 index 0000000..82ce971 --- /dev/null +++ b/templates/de/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Print Test Page On {printer_name}

+ +

Testseite gesendet; Auftrags ID ist +{printer_name}-{job_id}.

+ +
diff --git a/templates/de/trailer.tmpl b/templates/de/trailer.tmpl new file mode 100644 index 0000000..7a9e847 --- /dev/null +++ b/templates/de/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS und das CUPS Logo sind +eingetragene Warenzeichen der Apple Inc. CUPS +ist urheberrechtlich geschützt 2007-2012 von Apple Inc, alle Rechte vorbehalten. + + + diff --git a/templates/de/users.tmpl b/templates/de/users.tmpl new file mode 100644 index 0000000..0704e87 --- /dev/null +++ b/templates/de/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Erlaubte Benutzer für {printer_name}

+ + + + + + + + + + +
Benutzer: + +
+Erlaube diesen Benutzern zu drucken +Verweigere diesen Benutzern zu drucken +
+ +
+ +
+
diff --git a/templates/edit-config.tmpl b/templates/edit-config.tmpl new file mode 100644 index 0000000..8947382 --- /dev/null +++ b/templates/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Edit Configuration File

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/error-op.tmpl b/templates/error-op.tmpl new file mode 100644 index 0000000..feaed0f --- /dev/null +++ b/templates/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Error

+ +

Error:

+ +
Unknown operation "{op}"!
+ +
diff --git a/templates/error.tmpl b/templates/error.tmpl new file mode 100644 index 0000000..ff30a4c --- /dev/null +++ b/templates/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Error

+ +

{?message?{message}:Error:}

+ +
{error}
+ +
diff --git a/templates/es/add-class.tmpl b/templates/es/add-class.tmpl new file mode 100644 index 0000000..f7e79fa --- /dev/null +++ b/templates/es/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Añadir clase

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:
+(Puede contener cualquier carácter imprimible excepto "/", "#", y espacio)
Descripción:
+(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
+(Ubicación fácilmente leíble tal como "Lab 1")
Miembros: + +
+ +
+
diff --git a/templates/es/add-printer.tmpl b/templates/es/add-printer.tmpl new file mode 100644 index 0000000..eedc3db --- /dev/null +++ b/templates/es/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Añadir impresora

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:
+(Puede contener cualquier carácter imprimible excepto "/", "#", y espacio)
Descripción:
+(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
+(Ubicación fácilmente leíble tal como "Lab 1")
Conexión:{device_uri}
Compartición: +Compartir esta impresora
+ +
+
diff --git a/templates/es/add-rss-subscription.tmpl b/templates/es/add-rss-subscription.tmpl new file mode 100644 index 0000000..d17c86e --- /dev/null +++ b/templates/es/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Añadir subscripción RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:
+(Puede contener cualquier carácter imprimible excepto espacio, "/", "?", y "#"))
Cola:
Eventos:Trabajo creado
+Trabajo completado
+Trabajo parado
+Opciones de trabajo cambiadas
    Cola parada
+Cola añadida
+Cola modificada
+Cola borrada
    Servidor iniciado
+Servidor parado
+Servidor reiniciado
+Auditoría de seguridad del servidor
Número máximo de eventos del canal:
+ +
diff --git a/templates/es/admin.tmpl b/templates/es/admin.tmpl new file mode 100644 index 0000000..53e5d34 --- /dev/null +++ b/templates/es/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Impresoras

+ +

+

+
+
+{have_samba?
:} +

+ +

Clases

+ +

+

+
+

+ +

Trabajos

+ +

+

+

+ +
          + +

Servidor

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Configuración del servidor\:

+ +

Avanzada
+ + + Mostrar impresoras compartidas por otros sistemas
+        Protocolos\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Compartir impresoras conectadas a este sistema
+        Número máximo de clientes\: +
+        Protocolos\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Permitir la impresión desde Internet
+         Anunciar la interfaz web
+ Permitir administración remota
+{have_gssapi? Usar autentificación Kerberos (FAQ)
:} + Permitir a los usuarios cancelar cualquier trabajo (no sólo los suyos propios)
+ Preservar el historial de trabajos
+        Número de trabajos\: +
+         Preservar los archivos de impresión de trabajos
+ Guardar información de depuración para búsqueda de problemas
+        Tamaño máximo del archivo de registro\: +

+ +:

Configuración del servidor:

+ +

Avanzada
+ + Mostrar impresoras compartidas por otros sistemas
+ Compartir impresoras conectadas a este sistema
+         Permitir la impresión desde Internet
+ Permitir administración remota
+{have_gssapi? Usar autentificación Kerberos (FAQ)
:} + Permitir a los usuarios cancelar cualquier trabajo (no sólo los suyos propios)
+ Guardar información de depuración para búsqueda de problemas

+ +} +

+ +
} + +
+ +
+ +

Subscripciones RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NombreEventosNombre de la cola
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Todas las colas}
:} diff --git a/templates/es/choose-device.tmpl b/templates/es/choose-device.tmpl new file mode 100644 index 0000000..9f314fd --- /dev/null +++ b/templates/es/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

+ +{CUPS_GET_DEVICES_DONE?:

Buscando impresoras...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Conexión actual: +{current_device_uri}
Impresoras locales: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Impresoras en red descubiertas: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Otras impresoras en red: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/es/choose-make.tmpl b/templates/es/choose-make.tmpl new file mode 100644 index 0000000..c846de4 --- /dev/null +++ b/templates/es/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:{printer_name}
Descripción:{printer_info}
Ubicación:{printer_location}
Conexión:{device_uri}
Compartición: +{?printer_is_shared=?No:{?printer_is_shared=0?No:}} compartir esta impresora
Marca: + +
 
O proporcione un archivo PPD:
+ +
+
diff --git a/templates/es/choose-model.tmpl b/templates/es/choose-model.tmpl new file mode 100644 index 0000000..497d4b1 --- /dev/null +++ b/templates/es/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nombre:{printer_name}
Descripción:{printer_info}
Ubicación:{printer_location}
Conexión:{device_uri}
Compartición: +{?printer_is_shared=?No:{?printer_is_shared=0?No:}} compartir esta impresora
Marca:{PPD_MAKE}
Modelo: + +
O proporcione un archivo PPD:
+ +
+
diff --git a/templates/es/choose-serial.tmpl b/templates/es/choose-serial.tmpl new file mode 100644 index 0000000..1f734b9 --- /dev/null +++ b/templates/es/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Conexión:{device_uri}
Baudios:
Paridad:
Bits de datos:
Control de flujo:
+ +
+
diff --git a/templates/es/choose-uri.tmpl b/templates/es/choose-uri.tmpl new file mode 100644 index 0000000..46ea17b --- /dev/null +++ b/templates/es/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?Modificar {printer_name}:Añadir impresora}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Conexión:
Ejemplos: +
+    http://nombre_ordenador:631/ipp/
+    http://nombre_ordenador:631/ipp/puerto1
+
+    ipp://nombre_ordenador/ipp/
+    ipp://nombre_ordenador/ipp/puerto1
+
+    lpd://nombre_ordenador/cola
+
+    socket://nombre_ordenador
+    socket://nombre_ordenador:9100
+
+ +

Vea "Impresoras +en red" para escoger el URI adecuado a usar con su impresora.

+ +
+ +
+
\ No newline at end of file diff --git a/templates/es/class-added.tmpl b/templates/es/class-added.tmpl new file mode 100644 index 0000000..867c8d9 --- /dev/null +++ b/templates/es/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Añadir clase

+ +

Se ha añadido con éxito la clase {printer_name}. + +

diff --git a/templates/es/class-confirm.tmpl b/templates/es/class-confirm.tmpl new file mode 100644 index 0000000..a30ff72 --- /dev/null +++ b/templates/es/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Borrar clase {printer_name}

+ +

Advertencia: ¿Está seguro de querer borrar la clase +{printer_name}?

+ +

+ +
diff --git a/templates/es/class-deleted.tmpl b/templates/es/class-deleted.tmpl new file mode 100644 index 0000000..ced78ad --- /dev/null +++ b/templates/es/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Borrar clase {printer_name}

+ +

Se ha borrado con éxito la clase {printer_name}. + +

\ No newline at end of file diff --git a/templates/es/class-jobs-header.tmpl b/templates/es/class-jobs-header.tmpl new file mode 100644 index 0000000..f25951b --- /dev/null +++ b/templates/es/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Trabajos

+
diff --git a/templates/es/class-modified.tmpl b/templates/es/class-modified.tmpl new file mode 100644 index 0000000..d5ae2a7 --- /dev/null +++ b/templates/es/class-modified.tmpl @@ -0,0 +1,6 @@ +
+ +

Modificar clase {printer_name}

+ +

Se ha modificado con éxito la clase {printer_name}. +

\ No newline at end of file diff --git a/templates/es/class.tmpl b/templates/es/class.tmpl new file mode 100644 index 0000000..5eea4f1 --- /dev/null +++ b/templates/es/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}}, +{printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos}, +{server_is_sharing_printers=0?no:{printer_is_shared=0?no:}} compartida{default_name={printer_name}?, predeterminada del servidor:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Descripción:{printer_info}
Ubicación:{printer_location}
Miembros:{?member_uris=?Ninguno:{member_uris}}
Opciones predeterminadas:job-sheets={job_sheets_default} +media={media_default?{media_default}:desconocido} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/es/classes-header.tmpl b/templates/es/classes-header.tmpl new file mode 100644 index 0000000..714ab89 --- /dev/null +++ b/templates/es/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?No hay clases:Mostrando {#printer_name} de {total} clase{total=1?:s}}.

diff --git a/templates/es/classes.tmpl b/templates/es/classes.tmpl new file mode 100644 index 0000000..6fde7bf --- /dev/null +++ b/templates/es/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nombre de la cola : Nombre de la cola }DescripciónUbicaciónMiembrosEstado
{printer_name}{printer_info}{printer_location}{?member_uris=?Ninguna:{member_uris}}{printer_state=3?Inactiva:{printer_state=4?Procesando:En pausa}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/es/command.tmpl b/templates/es/command.tmpl new file mode 100644 index 0000000..ba50560 --- /dev/null +++ b/templates/es/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} en {printer_name}

+ +

{job_state>5?:Indicador de ocupado }Trabajo de comando de impresora +{job_state=3?pendiente:{job_state=4?retenido: +{job_state=5?procesando:{job_state=6?parado: +{job_state=7?cancelado:{job_state=8?anulado:completado}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/es/edit-config.tmpl b/templates/es/edit-config.tmpl new file mode 100644 index 0000000..a0c6634 --- /dev/null +++ b/templates/es/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Editar archivo de configuración

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/es/error-op.tmpl b/templates/es/error-op.tmpl new file mode 100644 index 0000000..d584108 --- /dev/null +++ b/templates/es/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

Error en {?printer_name}: {?title}

+ +

Error:

+ +
Operación desconocida "{op}".
+ +
diff --git a/templates/es/error.tmpl b/templates/es/error.tmpl new file mode 100644 index 0000000..650bc32 --- /dev/null +++ b/templates/es/error.tmpl @@ -0,0 +1,9 @@ +
+ +

Error en {?printer_name}: {?title}

+ +

{?message?{message}:Error:}

+ +
{error}
+ +
diff --git a/templates/es/header.tmpl.in b/templates/es/header.tmpl.in new file mode 100644 index 0000000..b6c63b4 --- /dev/null +++ b/templates/es/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/es/option-conflict.tmpl b/templates/es/option-conflict.tmpl new file mode 100644 index 0000000..adeb436 --- /dev/null +++ b/templates/es/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Error: Las siguientes opciones están en conflicto:

+ + + +

Cambie una o más de las opciones para resolver el problema.

diff --git a/templates/es/option-header.tmpl b/templates/es/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/es/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Inicio    Administración    Clases    Ayuda en línea    Trabajos    Impresoras  
 
diff --git a/templates/es/help-header.tmpl b/templates/es/help-header.tmpl new file mode 100644 index 0000000..d513ca3 --- /dev/null +++ b/templates/es/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Buscar en +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:todos los documentos}}: + +

+ +
+ + + + +{QUERY?

Buscar resultados en {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:todos los documentos}}\:

+{QTEXT?:} +:

No hay coincidencias.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Ayuda en línea

+ +

Esta es la interfaz de ayuda en línea de CUPS. Introduzca las palabras +a buscar aquí encima o haga clic en cualquiera de los enlaces de la +documentación para visualizar la información de ayuda en línea.

+ +

Si es nuevo en CUPS, lea la página "Información general de CUPS". Los usuarios veteranos +deberían leer la página "Qué hay de nuevo en CUPS +1.4".

+ +

La página de inicio de CUPS también +proporciona muchos recursos, incluyendo foros de discusión de usuarios, respuestas +a preguntas frecuentes, y un formulario para el envío de informes de errores y +peticiones de mejoras.

} diff --git a/templates/es/help-printable.tmpl b/templates/es/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/es/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/es/help-trailer.tmpl b/templates/es/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/es/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/es/job-cancel.tmpl b/templates/es/job-cancel.tmpl new file mode 100644 index 0000000..6a41427 --- /dev/null +++ b/templates/es/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Cancelar trabajo {job_id}

+ +

Se ha cancelado el Trabajo {job_id}. + +

diff --git a/templates/es/job-hold.tmpl b/templates/es/job-hold.tmpl new file mode 100644 index 0000000..3136f9d --- /dev/null +++ b/templates/es/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Retener trabajo {job_id}

+ +

Se ha retenido el Trabajo {job_id}. + +

diff --git a/templates/es/job-move.tmpl b/templates/es/job-move.tmpl new file mode 100644 index 0000000..e6aac39 --- /dev/null +++ b/templates/es/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Mover trabajo {job_id}:Mover todos los trabajos}

+ + + + + + + + + + +
Nuevo destino: + +
+ +
+ +
diff --git a/templates/es/job-moved.tmpl b/templates/es/job-moved.tmpl new file mode 100644 index 0000000..8eb7a98 --- /dev/null +++ b/templates/es/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Mover trabajo {job_id}:Mover todos los trabajos}

+ +

Se {job_id?ha movido el Trabajo {job_id}:han movido todos los trabajos} a +{job_printer_name}.

+ +
diff --git a/templates/es/job-release.tmpl b/templates/es/job-release.tmpl new file mode 100644 index 0000000..d925e5f --- /dev/null +++ b/templates/es/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Liberar trabajo {job_id}

+ +

Se ha liberado el Trabajo {job_id}. + +

diff --git a/templates/es/job-restart.tmpl b/templates/es/job-restart.tmpl new file mode 100644 index 0000000..ee6c8e5 --- /dev/null +++ b/templates/es/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Reimprimir trabajo {job_id}

+ +

Se ha reiniciado el Trabajo {job_id}. + +

diff --git a/templates/es/jobs-header.tmpl b/templates/es/jobs-header.tmpl new file mode 100644 index 0000000..fe8b51f --- /dev/null +++ b/templates/es/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?No hay trabajos:Mostrando {#job_id} de {total} trabajo{total=1?:s}{?which_jobs=? activo{total=1?:s}:{which_jobs=all?: completado{total=1?:s}}}}.

diff --git a/templates/es/jobs.tmpl b/templates/es/jobs.tmpl new file mode 100644 index 0000000..e1bc195 --- /dev/null +++ b/templates/es/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NombreUsuarioTamañoPáginasEstadoControl
{job_printer_name}-{job_id} {?job_name=?Desconocido:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Desconocido:{?job_media_sheets_completed}} {job_state=3?pendiente desde
{time_at_creation}:{job_state=4?retenido desde
{time_at_creation}: +{job_state=5?en proceso desde
{time_at_processing}:{job_state=6?parado: +{job_state=7?cancelado el
{time_at_completed}:{job_state=8?anulado:completado el
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/es/list-available-printers.tmpl b/templates/es/list-available-printers.tmpl new file mode 100644 index 0000000..51e0eb9 --- /dev/null +++ b/templates/es/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Impresoras disponibles

+ +{#device_uri=0?

No se encuentran impresoras.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/es/modify-class.tmpl b/templates/es/modify-class.tmpl new file mode 100644 index 0000000..a50b2bb --- /dev/null +++ b/templates/es/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Modificar clase {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Descripción:
Ubicación:
Miembros: + +
+ +
+
\ No newline at end of file diff --git a/templates/es/modify-printer.tmpl b/templates/es/modify-printer.tmpl new file mode 100644 index 0000000..3c09da0 --- /dev/null +++ b/templates/es/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Modificar {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Descripción:
+(Descripción fácilmente leíble tal como "HP LaserJet de doble cara")
Ubicación:
+(Ubicación fácilmente leíble tal como "Lab 1")
Conexión:{device_uri}
Compartida: +Compartir esta impresora
+ +
+
diff --git a/templates/es/norestart.tmpl b/templates/es/norestart.tmpl new file mode 100644 index 0000000..ac0f96b --- /dev/null +++ b/templates/es/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Cambiar especificaciones

+ +

No se ha reiniciado el servidor debido a que no se han hecho +cambios en la configuración...

+ +
diff --git a/templates/es/option-boolean.tmpl b/templates/es/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/es/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/es/option-pickmany.tmpl b/templates/es/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/es/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/es/option-pickone.tmpl b/templates/es/option-pickone.tmpl new file mode 100644 index 0000000..40fd124 --- /dev/null +++ b/templates/es/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/es/option-trailer.tmpl b/templates/es/option-trailer.tmpl new file mode 100644 index 0000000..ff8f2b2 --- /dev/null +++ b/templates/es/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + \ No newline at end of file diff --git a/templates/es/pager.tmpl b/templates/es/pager.tmpl new file mode 100644 index 0000000..5f27c10 --- /dev/null +++ b/templates/es/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/es/printer-accept.tmpl b/templates/es/printer-accept.tmpl new file mode 100644 index 0000000..63fab1b --- /dev/null +++ b/templates/es/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Aceptar trabajos de la {is_class?clase:impresora} {printer_name}

+ +

La {is_class?clase:impresora} {printer_name} +ahora acepta trabajos.

+ +
diff --git a/templates/es/printer-added.tmpl b/templates/es/printer-added.tmpl new file mode 100644 index 0000000..88c565b --- /dev/null +++ b/templates/es/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Añadir impresora

+ +

Se ha añadido con éxito la impresora {printer_name}. + +

diff --git a/templates/es/printer-configured.tmpl b/templates/es/printer-configured.tmpl new file mode 100644 index 0000000..d382264 --- /dev/null +++ b/templates/es/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Cambiar opciones predeterminadas de {printer_name}

+ +

Se han establecido con éxito las opciones predeterminadas de la +{OP=set-class-options?clase :impresora }{printer_name}. + +

diff --git a/templates/es/printer-confirm.tmpl b/templates/es/printer-confirm.tmpl new file mode 100644 index 0000000..1de104a --- /dev/null +++ b/templates/es/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Borrar impresora {printer_name}

+ +

Advertencia: ¿Está seguro de querer borrar la impresora +{printer_name}?

+ +

+ +
diff --git a/templates/es/printer-default.tmpl b/templates/es/printer-default.tmpl new file mode 100644 index 0000000..68b61f2 --- /dev/null +++ b/templates/es/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

Poner la {is_class?clase:impresora} {printer_name} como predeterminada

+ +

Se ha puesto como predeterminada en el servidor la {is_class?clase:impresora} {printer_name}.

+ +
Nota: cualquier opción de usuario +que haya sido activada por mediación del comando +lpoptions tiene mayor preferencia que este ajuste +predeterminado.
+ +
diff --git a/templates/es/printer-deleted.tmpl b/templates/es/printer-deleted.tmpl new file mode 100644 index 0000000..8bf7db6 --- /dev/null +++ b/templates/es/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Borrar impresora {printer_name}

+ +

Se ha borrado con éxito la impresora {printer_name}. + +

diff --git a/templates/es/printer-jobs-header.tmpl b/templates/es/printer-jobs-header.tmpl new file mode 100644 index 0000000..f25951b --- /dev/null +++ b/templates/es/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Trabajos

+
diff --git a/templates/es/printer-modified.tmpl b/templates/es/printer-modified.tmpl new file mode 100644 index 0000000..9035dce --- /dev/null +++ b/templates/es/printer-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Modificar impresora {printer_name}

+ +

Se ha modificado con éxito la impresora {printer_name}. + +

\ No newline at end of file diff --git a/templates/es/printer-purge.tmpl b/templates/es/printer-purge.tmpl new file mode 100644 index 0000000..b26bb46 --- /dev/null +++ b/templates/es/printer-purge.tmpl @@ -0,0 +1,8 @@ +
+ +

Purgar trabajos de la {is_class?clase:impresora} {printer_name}

+ +

Se han purgado todos los trabajos de la {is_class?clase:impresora} {printer_name}.

+ +
\ No newline at end of file diff --git a/templates/es/printer-reject.tmpl b/templates/es/printer-reject.tmpl new file mode 100644 index 0000000..637e13e --- /dev/null +++ b/templates/es/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Rechazar trabajos de la {is_class?clase:impresora} {printer_name}

+ +

La {is_class?clase:impresora} {printer_name} +ya no acepta trabajos.

+ +
diff --git a/templates/es/printer-start.tmpl b/templates/es/printer-start.tmpl new file mode 100644 index 0000000..117afcd --- /dev/null +++ b/templates/es/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Reanudar la {is_class?clase:impresora} {printer_name}

+ +

La {is_class?clase:impresora} {printer_name} +ha sido reanudada.

+ +
\ No newline at end of file diff --git a/templates/es/printer-stop.tmpl b/templates/es/printer-stop.tmpl new file mode 100644 index 0000000..af37494 --- /dev/null +++ b/templates/es/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Pausar la {is_class?clase:impresora} {printer_name}

+ +

La {is_class?clase:impresora} {printer_name} +ha sido puesta en pausa.

+ +
\ No newline at end of file diff --git a/templates/es/printer.tmpl b/templates/es/printer.tmpl new file mode 100644 index 0000000..f7642ac --- /dev/null +++ b/templates/es/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?inactiva:{printer_state=4?procesando:en pausa}}, +{printer_is_accepting_jobs=0?rechazando trabajos:aceptando trabajos}, +{server_is_sharing_printers=0?no:{printer_is_shared=0?no:}} compartida{default_name={printer_name}?, predeterminada del servidor:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Descripción:{printer_info}
Ubicación:{printer_location}
Controlador:{printer_make_and_model} ({color_supported=1?color:escala de grises}{sides_supported?, dúplex:})
+
Conexión:{device_uri}
Opciones predeterminadas:job-sheets={job_sheets_default} +media={media_default?{media_default}:desconocido} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/es/printers-header.tmpl b/templates/es/printers-header.tmpl new file mode 100644 index 0000000..7280687 --- /dev/null +++ b/templates/es/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?No hay impresoras:Mostrando {#printer_name} de {total} impresora{total=1?:s}}.

diff --git a/templates/es/printers.tmpl b/templates/es/printers.tmpl new file mode 100644 index 0000000..6b97fd9 --- /dev/null +++ b/templates/es/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nombre de la cola : Nombre de la cola }DescripciónUbicaciónMarca y modeloEstado
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inactiva:{printer_state=4?Procesando:En pausa}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/es/restart.tmpl b/templates/es/restart.tmpl new file mode 100644 index 0000000..607351d --- /dev/null +++ b/templates/es/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Cambiar especificaciones

+ +

Por favor espere mientras se reinicia el servidor...

+ +
diff --git a/templates/es/samba-export.tmpl b/templates/es/samba-export.tmpl new file mode 100644 index 0000000..0036372 --- /dev/null +++ b/templates/es/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Exportar impresoras a Samba

+ +{error?

No se han podido exportar las impresoras a Samba\:

+
{error}
+

Consulte el archivo error_log para más información.

: +

Esta página le permite exportar las impresoras a Samba para que +los clientes Windows puedan acceder a ellas por los iconos de su +escritorio Entorno de red o Sitios de red. Debe haber instalado +previamente el controlador de impresora PostScript de Windows +como se describe en la página del manual +cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Impresoras: +
+ Exportar todas las impresoras +
Nombre de usuario Samba: (necesario)
Contraseña Samba: (necesaria)
+ +
diff --git a/templates/es/samba-exported.tmpl b/templates/es/samba-exported.tmpl new file mode 100644 index 0000000..a54925d --- /dev/null +++ b/templates/es/samba-exported.tmpl @@ -0,0 +1 @@ +

Se han exportado las impresoras a samba con éxito.

diff --git a/templates/es/search.tmpl b/templates/es/search.tmpl new file mode 100644 index 0000000..3f43068 --- /dev/null +++ b/templates/es/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Buscar en +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?clases:{SECTION=jobs?trabajos:impresoras}}}: +

+ +
diff --git a/templates/es/set-printer-options-header.tmpl b/templates/es/set-printer-options-header.tmpl new file mode 100644 index 0000000..8a2740b --- /dev/null +++ b/templates/es/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Establecer opciones predeterminadas de {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/es/set-printer-options-trailer.tmpl b/templates/es/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/es/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/es/subscription-added.tmpl b/templates/es/subscription-added.tmpl new file mode 100644 index 0000000..87ce96a --- /dev/null +++ b/templates/es/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Se ha añadido con éxito la subscripción {subscription_name}.

+ +
diff --git a/templates/es/subscription-canceled.tmpl b/templates/es/subscription-canceled.tmpl new file mode 100644 index 0000000..d6ac171 --- /dev/null +++ b/templates/es/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

La subscripción #{notify_subscription_id} ha sido cancelada.

+ +
diff --git a/templates/es/test-page.tmpl b/templates/es/test-page.tmpl new file mode 100644 index 0000000..763dab5 --- /dev/null +++ b/templates/es/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Imprimir página de prueba en {printer_name}

+ +

Página de prueba enviada; el número del trabajo es el +{printer_name}-{job_id}.

+ +
diff --git a/templates/es/trailer.tmpl b/templates/es/trailer.tmpl new file mode 100644 index 0000000..a199245 --- /dev/null +++ b/templates/es/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS y el logo de CUPS son marcas registradas de +Apple, Inc. Los derechos de copia de CUPS +2007-2012 son de Apple Inc. Todos los derechos reservados. + + + diff --git a/templates/es/users.tmpl b/templates/es/users.tmpl new file mode 100644 index 0000000..a8a645e --- /dev/null +++ b/templates/es/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Usuarios permitidos para {printer_name}

+ + + + + + + + + + +
Usuarios: + +
+Permitir a estos usuarios imprimir +Evitar que estos usuarios impriman +
+ +
+ +
+
diff --git a/templates/eu/add-class.tmpl b/templates/eu/add-class.tmpl new file mode 100644 index 0000000..bd7436a --- /dev/null +++ b/templates/eu/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Gehitu klasea

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Izena:
+(Inprimatu daitekeen edozein karaktere eduki dezake, "/", "#" eta zuriunea izan ezik)
Deskripzioa:
+(Gizakiek irakurtzeko deskripzioa, adibidez "HP LaserJet Duplexatzailearekin")
Kokalekua:
+(Gizakiek irakurtzeko kokalekua, adibidez "Lab 1")
Kideak: + +
+ +
+
diff --git a/templates/eu/add-printer.tmpl b/templates/eu/add-printer.tmpl new file mode 100644 index 0000000..d4bf8b2 --- /dev/null +++ b/templates/eu/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Gehitu inprimagailua

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Izena:
+(Inprimatu daitekeen edozein karaktere eduki dezake, "/", "#" eta zuriunea izan ezik)
Deskripzioa:
+(izakiek irakurtzeko deskripzioa, adibidez "HP LaserJet Duplexatzailearekin")
Kokalekua:
+(izakiek irakurtzeko kokalekua, adibidez "Lab 1")
Konexioa:{device_uri}
Partekatzea: +Partekatu inprimagailu hau
+ +
+
diff --git a/templates/eu/add-rss-subscription.tmpl b/templates/eu/add-rss-subscription.tmpl new file mode 100644 index 0000000..86025a2 --- /dev/null +++ b/templates/eu/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Gehitu RSS harpidetza

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Izena:
+(Inprimatu daitekeen edozein karaktere eduki dezake, "/", "#" eta zuriunea izan ezik)
Ilara:
Gertaerak:Lana sortuta
+Lana burututa
+Lana geldituta
+Lanaren aukerak aldatuta
    Ilara geldituta
+Ilara gehituta
+Ilara aldatuta
+Ilara ezabatuta
    Zerbitzaria abiarazita
+Zerbitzaria geldituta
+Zerbitzaria berrabiarazita
+Zerbitzariko segurtasun auditoretza
Gehienezko gertaerak iturrian:
+ +
diff --git a/templates/eu/admin.tmpl b/templates/eu/admin.tmpl new file mode 100644 index 0000000..8b5ecdd --- /dev/null +++ b/templates/eu/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Inprimagailuak

+ +

+

+
+
+{have_samba?
:} +

+ +

Klaseak

+ +

+

+
+

+ +

Lanak

+ +

+

+

+ +
          + +

Zerbitzaria

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Zerbitzariaren ezarpenak\:

+ +

Aurreratua
+ + + Erakutsi beste sistemekin partekatutako inprimagailuak
+        Protokoloak\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Partekatu sistema honekin konektatutako inprimagailuak
+        Gehienezko bezeroak\: +
+        Protokoloak\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Baimendu Internetetik inprimatzea
+         Jakinarazi web interfazea
+ Baimendu urruneko administrazioa
+{have_gssapi? Erabili Kerberos autentifikazioa (MEG)
:} + Baimendu erabiltzaileek edozein lan bertan uztea (beraien lanetaz gain)
+ Mantendu lanen historia
+        Lan kopurua\: +
+         Mantendu lanen inprimatzeko fitxategiak
+ Gorde arazketako informazioa arazoak konpontzeko
+        Egunkari fitxategiaren gehienezko tamaina\: +

+ +:

Zerbitzariaren ezarpenak:

+ +

Aurreratua
+ + Erakutsi beste sistemekin partekatutako inprimagailuak
+ Partekatu sistema honekin konektatutako inprimagailuak
+         Baimendu Internetetik inprimatzea
+ Baimendu urruneko administrazioa
+{have_gssapi? Erabili Kerberos autentifikazioa (MEG)
:} + Baimendu erabiltzaileek edozein lan bertan uztea (beraien lanetaz gain)
+ Gorde arazketako informazioa arazoak konpontzeko

+ +} +

+ +
} + +
+ +
+ +

RSS harpidetzak

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
IzenaGertaerakIlararen izena
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Ilara guztiak}
:} diff --git a/templates/eu/choose-device.tmpl b/templates/eu/choose-device.tmpl new file mode 100644 index 0000000..36b7b86 --- /dev/null +++ b/templates/eu/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Aldatu {printer_name}:Gehitu inprimagailua}

+ +{CUPS_GET_DEVICES_DONE?:

Inprimagailuak bilatzen...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Uneko konexioa: +{current_device_uri}
Inprimagailu lokalak: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Aurkitutako sareko inprimagailuak: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Beste sareko inprimagailuak: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/eu/choose-make.tmpl b/templates/eu/choose-make.tmpl new file mode 100644 index 0000000..9fb3897 --- /dev/null +++ b/templates/eu/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Aldatu {printer_name}:Gehitu inprimagailua}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Izena:{printer_name}
Deskripzioa:{printer_info}
Kokalekua:{printer_location}
Konexioa:{device_uri}
Partekatzea: +{?printer_is_shared=?Ez:{?printer_is_shared=0?Ez:}} partekatu inprimagailu hau
Marka: + +
 
edo eman PPD fitxategia:
+ +
+
diff --git a/templates/eu/choose-model.tmpl b/templates/eu/choose-model.tmpl new file mode 100644 index 0000000..5824932 --- /dev/null +++ b/templates/eu/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Aldatu {printer_name}:Gehitu inprimagailua}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Izena:{printer_name}
Deskripzioa:{printer_info}
Kokalekua:{printer_location}
Konexioa:{device_uri}
Partekatzea: +{?printer_is_shared=?Ez:{?printer_is_shared=0?Ez:}} partekatu inprimagailu hau
Marka:{PPD_MAKE}
Modeloa: + +
edo eman PPD fitxategia:
+ +
+
diff --git a/templates/eu/choose-serial.tmpl b/templates/eu/choose-serial.tmpl new file mode 100644 index 0000000..a4dbba2 --- /dev/null +++ b/templates/eu/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Aldatu {printer_name}:Gehitu inprimagailua}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Konexioa:{device_uri}
Baudio-emaria:
Paritatea:
Datuen bit-ak:
Fluxu-kontrola:
+ +
+
diff --git a/templates/eu/choose-uri.tmpl b/templates/eu/choose-uri.tmpl new file mode 100644 index 0000000..4b1fd67 --- /dev/null +++ b/templates/eu/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?Aldatu {printer_name}:Gehitu inprimagailua}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Konexioa:
Adibideak: +
+    http://ostalari_izena:631/ipp/
+    http://ostalari_izena:631/ipp/ataka1
+
+    ipp://ostalari_izena/ipp/
+    ipp://ostalari_izena/ipp/ataka1
+
+    lpd://ostalari_izena/ilara
+
+    socket://ostalari_izena
+    socket://ostalari_izena:9100
+
+ +

Ikusi "Sareko inprimagailuak" URI zuzena erabiltzeko inprimagailuarekin.

+ +
+ +
+
diff --git a/templates/eu/class-added.tmpl b/templates/eu/class-added.tmpl new file mode 100644 index 0000000..e0dfa89 --- /dev/null +++ b/templates/eu/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Gehitu klasea

+ +

{printer_name} klasea ongi gehitu da. + +

diff --git a/templates/eu/class-confirm.tmpl b/templates/eu/class-confirm.tmpl new file mode 100644 index 0000000..f4a1a6f --- /dev/null +++ b/templates/eu/class-confirm.tmpl @@ -0,0 +1,9 @@ +
+ +

Ezabatu {printer_name} klasea

+ +

Abisua: ziur zaude {printer_name} klasea ezabatu nahi duzula?

+ +

+ +
diff --git a/templates/eu/class-deleted.tmpl b/templates/eu/class-deleted.tmpl new file mode 100644 index 0000000..5e39282 --- /dev/null +++ b/templates/eu/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Ezabatu {printer_name} klasea

+ +

{printer_name} klasea ongi ezabatu da. + +

diff --git a/templates/eu/class-jobs-header.tmpl b/templates/eu/class-jobs-header.tmpl new file mode 100644 index 0000000..8914475 --- /dev/null +++ b/templates/eu/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Lanak

+
diff --git a/templates/eu/class-modified.tmpl b/templates/eu/class-modified.tmpl new file mode 100644 index 0000000..9397bcc --- /dev/null +++ b/templates/eu/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Aldatu {printer_name} klasea

+ +

{printer_name} klasea ongi aldatu da. + +

diff --git a/templates/eu/class.tmpl b/templates/eu/class.tmpl new file mode 100644 index 0000000..b3c68ca --- /dev/null +++ b/templates/eu/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Inaktiboa:{printer_state=4?Prozesatzen:Pausatuta}}, +{printer_is_accepting_jobs=0?Lanak ukatzen:Lanak onartzen}, +{default_name={printer_name}?, zerbitzariaren lehenetsiak:} partekatuta {server_is_sharing_printers=0?ez:{printer_is_shared=0?ez:}} daude)

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Deskripzioa:{printer_info}
Kokalekua:{printer_location}
Kideak:{?member_uris=?Bat ere ez:{member_uris}}
Aukera lehenetsiak:job-sheets={job_sheets_default} +papera={media_default?{media_default}:ezezaguna} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/eu/classes-header.tmpl b/templates/eu/classes-header.tmpl new file mode 100644 index 0000000..a8e24b4 --- /dev/null +++ b/templates/eu/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Klaserik ez:{#printer_name}/{total} klase erakusten}.

diff --git a/templates/eu/classes.tmpl b/templates/eu/classes.tmpl new file mode 100644 index 0000000..4cab599 --- /dev/null +++ b/templates/eu/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Ilararen izena : Ilararen izena }DeskripzioaKokalekuaKideakEgoera
{printer_name}{printer_info}{printer_location}{?member_uris=?Bat ere ez:{member_uris}}{printer_state=3?Inaktibo:{printer_state=4?Prozesatzen:Pausatuta}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/eu/command.tmpl b/templates/eu/command.tmpl new file mode 100644 index 0000000..0157b34 --- /dev/null +++ b/templates/eu/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} {printer_name} inprimagailuan

+ +

{job_state>5?:Lanpetuta egoeraren adierazlea }Inprimagailuaren lanaren komandoa +{job_state=3?zain:{job_state=4?eutsita: +{job_state=5?processing:{job_state=6?geldituta: +{job_state=7?bertan behera utzita:{job_state=8?abortatuta:burututa}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/eu/edit-config.tmpl b/templates/eu/edit-config.tmpl new file mode 100644 index 0000000..4b2ba7b --- /dev/null +++ b/templates/eu/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Editatu konfigurazioko fitxategia

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/eu/error-op.tmpl b/templates/eu/error-op.tmpl new file mode 100644 index 0000000..605cc63 --- /dev/null +++ b/templates/eu/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?printer_name} errorea: {?title}

+ +

Errorea:

+ +
"{op}" eragiketa ezezaguna.
+ +
diff --git a/templates/eu/error.tmpl b/templates/eu/error.tmpl new file mode 100644 index 0000000..76dc6a0 --- /dev/null +++ b/templates/eu/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?printer_name} errorea: {?title}

+ +

{?message?{message}:Errorea:}

+ +
{error}
+ +
diff --git a/templates/eu/header.tmpl.in b/templates/eu/header.tmpl.in new file mode 100644 index 0000000..19a04e0 --- /dev/null +++ b/templates/eu/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/eu/option-conflict.tmpl b/templates/eu/option-conflict.tmpl new file mode 100644 index 0000000..617858c --- /dev/null +++ b/templates/eu/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Errorea: honako aukerak gatazkan daude:

+ + + +

Aldatu aukera bat edo gehiago gatazkak ebazteko.

diff --git a/templates/eu/option-header.tmpl b/templates/eu/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/eu/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Hasiera    Administrazioa    Klaseak    Lineako laguntza    Lanak    Inprimagailuak  
 
diff --git a/templates/eu/help-header.tmpl b/templates/eu/help-header.tmpl new file mode 100644 index 0000000..c87c767 --- /dev/null +++ b/templates/eu/help-header.tmpl @@ -0,0 +1,49 @@ +
+
+{TOPIC?:} + +

Bilatu +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:dokumentu guztietan}}: + +

+ +
+ + + + +{QUERY?

Bilaketaren emaitzak {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:dokumentu guztietan}}\:

+{QTEXT?:} +:

Ez da bat datorrenik aurkitu.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Lineako laguntza

+ +

Hau CUPSen lineako laguntzaren interfazea da. Sartu bilatzeko hitzak gainean +edo klik egin dokumentazioaren edozein esteketan lineako laguntzaren informazioa bistaratzeko.

+ +

CUPSekin hasiberria bazara, irakurri "CUPSen gainbegiraketa" orrialdea. Erabiltzaile adituek + "CUPS 1.4 bertsioko berrikuntzak" orrialdea irakurri beharko lukete.

+ +

CUPSen webgune nagusiak +hainbat baliabide eskaintzen ditu: erabiltzaileek eztabaidatzeko foruak, maiz egindako +galderei (MEG edo FAQ) erantzunak, eta akatsei buruz berri emateko edo eginbideak eskatzeko +inprimakia.

} diff --git a/templates/eu/help-printable.tmpl b/templates/eu/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/eu/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/eu/help-trailer.tmpl b/templates/eu/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/eu/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/eu/job-cancel.tmpl b/templates/eu/job-cancel.tmpl new file mode 100644 index 0000000..ec432eb --- /dev/null +++ b/templates/eu/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Utzi {job_id} lana

+ +

{job_id} lana bertan behera utzi da. + +

diff --git a/templates/eu/job-hold.tmpl b/templates/eu/job-hold.tmpl new file mode 100644 index 0000000..177ac16 --- /dev/null +++ b/templates/eu/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Eutsi {job_id} lana

+ +

{job_id} lana inprimatzetik eutsi da. + +

diff --git a/templates/eu/job-move.tmpl b/templates/eu/job-move.tmpl new file mode 100644 index 0000000..f337353 --- /dev/null +++ b/templates/eu/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Aldatu {job_id} lana lekuz:Aldatu lan guztiak lekuz}

+ + + + + + + + + + +
Helburu berria: + +
+ +
+ +
diff --git a/templates/eu/job-moved.tmpl b/templates/eu/job-moved.tmpl new file mode 100644 index 0000000..47f31ca --- /dev/null +++ b/templates/eu/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Aldatu {job_id} lana lekuz:Aldatu lan guztiak lekuz}

+ +

{job_id?{job_id} lana hona eraman da:Lan guztiak hona eraman dira}: +{job_printer_name}.

+ +
diff --git a/templates/eu/job-release.tmpl b/templates/eu/job-release.tmpl new file mode 100644 index 0000000..40f7f2b --- /dev/null +++ b/templates/eu/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Askatu {job_id} lana

+ +

{job_id} lana inprimatzetik askatu egin da. + +

diff --git a/templates/eu/job-restart.tmpl b/templates/eu/job-restart.tmpl new file mode 100644 index 0000000..5868c50 --- /dev/null +++ b/templates/eu/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Inprimatu berriro {job_id} lana

+ +

{job_id} lana berriro hasi da. + +

diff --git a/templates/eu/jobs-header.tmpl b/templates/eu/jobs-header.tmpl new file mode 100644 index 0000000..664f0eb --- /dev/null +++ b/templates/eu/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Lanik ez: {#job_id}/{total} lan {?which_jobs=?aktiboak:{which_jobs=all?:burututakoak}} erakusten}.

diff --git a/templates/eu/jobs.tmpl b/templates/eu/jobs.tmpl new file mode 100644 index 0000000..3071f6d --- /dev/null +++ b/templates/eu/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }IzenaErabiltzaileaTamainaOrrialdeakEgoeraKontrola
{job_printer_name}-{job_id} {?job_name=?Ezezaguna:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Ezezaguna:{?job_media_sheets_completed}} {job_state=3?noiztik zain
{time_at_creation}:{job_state=4?noiztik eutsita
{time_at_creation}: +{job_state=5?noiztik prozesatzen
{time_at_processing}:{job_state=6?geldituta: +{job_state=7?bertan behera utzita
{time_at_completed}:{job_state=8?abortatuta:burututa
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/eu/list-available-printers.tmpl b/templates/eu/list-available-printers.tmpl new file mode 100644 index 0000000..c8a397f --- /dev/null +++ b/templates/eu/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Inprimagailu erabilgarriak

+ +{#device_uri=0?

Ez da inprimagailurik aurkitu.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/eu/modify-class.tmpl b/templates/eu/modify-class.tmpl new file mode 100644 index 0000000..bce6503 --- /dev/null +++ b/templates/eu/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Aldatu {printer_name} klasea

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Deskripzioa:
Kokalekua:
Kideak: + +
+ +
+
diff --git a/templates/eu/modify-printer.tmpl b/templates/eu/modify-printer.tmpl new file mode 100644 index 0000000..33a350d --- /dev/null +++ b/templates/eu/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Aldatu {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Deskripzioa:
+(Gizakiek irakurtzeko deskripzioa, adibidez "HP LaserJet duplexatzailearekin")
Kokalekua:
+(Gizakiek irakurtzeko kokalekua, adibidez "Lab 1")
Konexioa:{device_uri}
Partekatzea: +Partekatu inprimagailu hau
+ +
+
diff --git a/templates/eu/norestart.tmpl b/templates/eu/norestart.tmpl new file mode 100644 index 0000000..5ed12b6 --- /dev/null +++ b/templates/eu/norestart.tmpl @@ -0,0 +1,7 @@ +
+ +

Aldatu ezarpenak

+ +

Zerbitzaria ez da berrabiarazi konfigurazioaren aldaketarik ez delako egin...

+ +
diff --git a/templates/eu/option-boolean.tmpl b/templates/eu/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/eu/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/eu/option-pickmany.tmpl b/templates/eu/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/eu/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/eu/option-pickone.tmpl b/templates/eu/option-pickone.tmpl new file mode 100644 index 0000000..0e57a50 --- /dev/null +++ b/templates/eu/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/eu/option-trailer.tmpl b/templates/eu/option-trailer.tmpl new file mode 100644 index 0000000..d80296a --- /dev/null +++ b/templates/eu/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/eu/pager.tmpl b/templates/eu/pager.tmpl new file mode 100644 index 0000000..901b0ff --- /dev/null +++ b/templates/eu/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/eu/printer-accept.tmpl b/templates/eu/printer-accept.tmpl new file mode 100644 index 0000000..5bc9da6 --- /dev/null +++ b/templates/eu/printer-accept.tmpl @@ -0,0 +1,8 @@ +
+ +

Onartu lanak {printer_name} {is_class?klasean:inprimagailuan}

+ +

{printer_name} {is_class?klasea:inprimagailua} +lanak onartzen ari da orain.

+ +
diff --git a/templates/eu/printer-added.tmpl b/templates/eu/printer-added.tmpl new file mode 100644 index 0000000..17e9c02 --- /dev/null +++ b/templates/eu/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Gehitu inprimagailua

+ +

{printer_name} inprimagailua ongi gehitu da. + +

diff --git a/templates/eu/printer-configured.tmpl b/templates/eu/printer-configured.tmpl new file mode 100644 index 0000000..66e6f41 --- /dev/null +++ b/templates/eu/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Ezarri {printer_name}(r)en aukera lehenetsiak

+ +

{OP=set-class-options?{printer_name} klasea:{printer_name} inprimagailua}ren +aukera lehenetsiak ongi ezarri dira. + +

diff --git a/templates/eu/printer-confirm.tmpl b/templates/eu/printer-confirm.tmpl new file mode 100644 index 0000000..d72d240 --- /dev/null +++ b/templates/eu/printer-confirm.tmpl @@ -0,0 +1,9 @@ +
+ +

Ezabatu {printer_name} inprimagailua

+ +

Abisua: ziur zaude {printer_name} inprimagailua ezabatzea nahi duzula?

+ +

+ +
diff --git a/templates/eu/printer-default.tmpl b/templates/eu/printer-default.tmpl new file mode 100644 index 0000000..0834a3a --- /dev/null +++ b/templates/eu/printer-default.tmpl @@ -0,0 +1,11 @@ +
+ +

Ezarri {printer_name} {is_class?klasea:inprimagailua} lehenetsi gisa

+ +

{printer_name} +{is_class?klasea:inprimagailua} zerbitzarian inprimagailu lehenetsi gisa ezarri da.

+ +
Oharra: lpoptions komandoaren bidez ezarritako edozein +erabiltzailek ezarpen lehenetsi hau gainidatz dezake.
+ +
diff --git a/templates/eu/printer-deleted.tmpl b/templates/eu/printer-deleted.tmpl new file mode 100644 index 0000000..b2b7207 --- /dev/null +++ b/templates/eu/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Ezabatu {printer_name} inprimagailua

+ +

{printer_name} inprimagailua ongi ezabatu da. + +

diff --git a/templates/eu/printer-jobs-header.tmpl b/templates/eu/printer-jobs-header.tmpl new file mode 100644 index 0000000..8914475 --- /dev/null +++ b/templates/eu/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Lanak

+
diff --git a/templates/eu/printer-modified.tmpl b/templates/eu/printer-modified.tmpl new file mode 100644 index 0000000..80aa65b --- /dev/null +++ b/templates/eu/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Aldatu {printer_name} inprimagailua

+ +

{printer_name} inprimagailua +ongi aldatu da. + +

diff --git a/templates/eu/printer-purge.tmpl b/templates/eu/printer-purge.tmpl new file mode 100644 index 0000000..0977c8b --- /dev/null +++ b/templates/eu/printer-purge.tmpl @@ -0,0 +1,8 @@ +
+ +

Kendu lanak {printer_name} {is_class?klasetik:inprimagailutik}

+ +

{printer_name} +{is_class?klaseko:inprimagailuko} lan guztiak kendu dira.

+ +
diff --git a/templates/eu/printer-reject.tmpl b/templates/eu/printer-reject.tmpl new file mode 100644 index 0000000..178ef8b --- /dev/null +++ b/templates/eu/printer-reject.tmpl @@ -0,0 +1,8 @@ +
+ +

Ukatu lanak {printer_name} {is_class?klasean:inprimagailuan}

+ +

{printer_name} +{is_class?klaseak:inprimagailuak} ez du lan gehiago onartuko.

+ +
diff --git a/templates/eu/printer-start.tmpl b/templates/eu/printer-start.tmpl new file mode 100644 index 0000000..4403344 --- /dev/null +++ b/templates/eu/printer-start.tmpl @@ -0,0 +1,8 @@ +
+ +

Jarraitu {printer_name} {is_class?klasea:inprimagailua}

+ +

{printer_name} +{is_class?klaseak:inprimagailuak} jarraitu egin du.

+ +
diff --git a/templates/eu/printer-stop.tmpl b/templates/eu/printer-stop.tmpl new file mode 100644 index 0000000..2338e87 --- /dev/null +++ b/templates/eu/printer-stop.tmpl @@ -0,0 +1,8 @@ +
+ +

Pausatu {printer_name} {is_class?klasea:inprimagailua}

+ +

{printer_name} +{is_class?klasea:inprimagailua} pausatu egin da.

+ +
diff --git a/templates/eu/printer.tmpl b/templates/eu/printer.tmpl new file mode 100644 index 0000000..ac984eb --- /dev/null +++ b/templates/eu/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?inaktibo:{printer_state=4?prozesatzen:pausatuta}}, +{printer_is_accepting_jobs=0?lanak ukatzen:lanak onartzen}, +{default_name={printer_name}?, Zerbitzariaren lehenetsia:} partekatuta {server_is_sharing_printers=0?ez:{printer_is_shared=0?ez:}} dago)

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Deskripzioa:{printer_info}
Kokalekua:{printer_location}
Kontrolatzailea:{printer_make_and_model} ({color_supported=1?kolorea:gris-eskala}{sides_supported?, 2 aldeetan inprimatzea:})
+
Konexioa:{device_uri}
Lehenetsiak:lanen orriak={job_sheets_default} +euskarria={media_default?{media_default}:ezezaguna} +{sides_default?aldeak={sides_default}:}
+ +
diff --git a/templates/eu/printers-header.tmpl b/templates/eu/printers-header.tmpl new file mode 100644 index 0000000..ba6d22f --- /dev/null +++ b/templates/eu/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Inprimagailurik ez:{#printer_name}/{total} inprimagailu erakusten}.

diff --git a/templates/eu/printers.tmpl b/templates/eu/printers.tmpl new file mode 100644 index 0000000..5415891 --- /dev/null +++ b/templates/eu/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Ilararen izena : Ilararen izena }DeskripzioaKokalekuaMarka eta modeloaEgoera
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inaktibo:{printer_state=4?Prozesatzen:Pausatuta}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/eu/restart.tmpl b/templates/eu/restart.tmpl new file mode 100644 index 0000000..d599c22 --- /dev/null +++ b/templates/eu/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Aldatu ezarpenak

+ +

Itxaron zerbitzaria berrabiatzen den bitartean...

+ +
diff --git a/templates/eu/samba-export.tmpl b/templates/eu/samba-export.tmpl new file mode 100644 index 0000000..b6851f8 --- /dev/null +++ b/templates/eu/samba-export.tmpl @@ -0,0 +1,54 @@ + + +
+ + + +

Esportatu inprimagailuak Samba-ra

+ +{error?

Ezin dira inprimagailuak Samba-ra esportatu\:

+
{error}
+

Begiratu error_log fitxategia informazio gehiagorako.

: +

+Orrialde honek inprimagailuak Samba-ra esportatzea baimentzen du, horrela +Windows sistemako bezeroek inprimagailu horiek atzi daitezke haien +mahaigaineko Auzoko sareak edo Sareko lekuak ikonoen bidez. +Aurrenik Windows-eko inprimagailuen PostScript kontrolatzaileak instalatu +behar dira, cupsaddsmb(8) eskuliburuko orrialdean +azaltzen den bezala.

} + + + + + + + + + + + + + + + + + +
Inprimagailuak: +
+ Esportatu inprimagailu guztiak +
Samba-ko erabiltzaile-izena: (beharrezkoa)
Samba-ko pasahitza: (beharrezkoa)
+ +
diff --git a/templates/eu/samba-exported.tmpl b/templates/eu/samba-exported.tmpl new file mode 100644 index 0000000..3a8f658 --- /dev/null +++ b/templates/eu/samba-exported.tmpl @@ -0,0 +1 @@ +

Inprimagailuak ongi esportatu dira Samba-ra.

diff --git a/templates/eu/search.tmpl b/templates/eu/search.tmpl new file mode 100644 index 0000000..4211735 --- /dev/null +++ b/templates/eu/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Bilatu +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?klasetan:{SECTION=jobs?lanetan:inprimgailuetan}}}: +

+ +
diff --git a/templates/eu/set-printer-options-header.tmpl b/templates/eu/set-printer-options-header.tmpl new file mode 100644 index 0000000..89b548b --- /dev/null +++ b/templates/eu/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Ezarri {printer_name}(r)en aukera lehenetsiak

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/eu/set-printer-options-trailer.tmpl b/templates/eu/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/eu/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/eu/subscription-added.tmpl b/templates/eu/subscription-added.tmpl new file mode 100644 index 0000000..43ee5fc --- /dev/null +++ b/templates/eu/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

{subscription_name} harpidetza ongi landu da.

+ +
diff --git a/templates/eu/subscription-canceled.tmpl b/templates/eu/subscription-canceled.tmpl new file mode 100644 index 0000000..71b0dbd --- /dev/null +++ b/templates/eu/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

{notify_subscription_id}. harpidetza bertan behera utzi da.

+ +
diff --git a/templates/eu/test-page.tmpl b/templates/eu/test-page.tmpl new file mode 100644 index 0000000..bf5c77a --- /dev/null +++ b/templates/eu/test-page.tmpl @@ -0,0 +1,7 @@ +
+ +

Inprimatu probako orrialdea hemen: {printer_name}

+ +

Probako orrialdea bidalita; lanaren IDa {printer_name}-{job_id} da.

+ +
diff --git a/templates/eu/trailer.tmpl b/templates/eu/trailer.tmpl new file mode 100644 index 0000000..381e2fe --- /dev/null +++ b/templates/eu/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS eta CUPSen logotipoa Apple Inc.en +marka errejistratuak dira. CUPSen copyright-a: 2007-2012 Apple +Inc. eskubide guztiak gordeta. + + + diff --git a/templates/eu/users.tmpl b/templates/eu/users.tmpl new file mode 100644 index 0000000..ba0ee96 --- /dev/null +++ b/templates/eu/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

{printer_name}(e)n baimendutako erabiltzaile guztiak

+ + + + + + + + + + +
Erabiltzaileak: + +
+Baimendu erabiltzaileak inprimatzea +Saihestu erabiltzaile hauek inprimatzetik +
+ +
+ +
+
diff --git a/templates/fr/add-class.tmpl b/templates/fr/add-class.tmpl new file mode 100644 index 0000000..7cde5fb --- /dev/null +++ b/templates/fr/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Ajouter une classe

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Nom:
+(Peux contenir n'importe quel caractère sauf "/", "#", et espace)
Description:
+(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement:
+(Emplacement compréhensible comme "Lab 1")
Membres: + +
+ +
+
diff --git a/templates/fr/add-printer.tmpl b/templates/fr/add-printer.tmpl new file mode 100644 index 0000000..2dc87be --- /dev/null +++ b/templates/fr/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Ajouter une imprimante

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom:
+(Peux contenir n'importe quel caractère sauf "/", "#", et espace)
Description:
+(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement:
+(Emplacement compréhensible comme "Lab 1")
Connexion:{device_uri}
Partage: +Partager cette imprimante
+ +
+
diff --git a/templates/fr/add-rss-subscription.tmpl b/templates/fr/add-rss-subscription.tmpl new file mode 100644 index 0000000..99969b0 --- /dev/null +++ b/templates/fr/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

S'abonner à un flux RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom:
+(Peux contenir n'importe quel caractère sauf "/", "#", et espace)
File:
Evénements:Tâches crées
+Tâches finies
+Tâches stoppées
+Options de tâche modifiées
    Files arrêtées
+File ajoutée
+File modifiée
+File supprimée
    Serveur démarré
+Serveur arrêté
+Serveur redémarré
+Audit de sécurité du serveur
Nombre maximum d'événements:
+ +
diff --git a/templates/fr/admin.tmpl b/templates/fr/admin.tmpl new file mode 100644 index 0000000..e681022 --- /dev/null +++ b/templates/fr/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Imprimantes

+ +

+

+
+
+{have_samba?
:} +

+ +

Classes

+ +

+

+
+

+ +

Tâches

+ +

+

+

+ +
          + +

Serveur

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Paramètres du serveur\:

+ +

Avancé
+ + + Afficher les imprimantes partagées par d'autres systèmes
+        Protocoles\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Partager les imprimantes connectées à ce système
+        Nombre maximum de clients\: +
+        Protocoles\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Autoriser l'impression depuis Internet
+         Annoncer l'interface Web
+ Autoriser l'administration à distance
+{have_gssapi? Utiliser l'authentification Kerberos (FAQ)
:} + Autoriser les utilisateurs à annuler n'importe quelle tâche (Pas seulement les leurs)
+ Conserver l'historique des tâches
+        Nombre de tâches\: +
+         Conserver les fichiers d'impression des tâches
+ Enregistrer les informations de debug pour la résolution de problèmes
+        Taille maximum du fichier de log\: +

+ +:

Paramètres du Serveur:

+ +

Avancé
+ + Afficher les imprimantes partagées par d'autres systèmes
+ Partager les imprimantes connectées à ce système
+         Autoriser l'impression depuis Internet
+ Autoriser l'administration à distance
+{have_gssapi? Utiliser l'authentification Kerberos (FAQ)
:} + Autoriser les utilisateurs à annuler n'importe quelle tâche (Pas seulement les leurs)
+ Enregistrer les informations de debug pour la résolution de problèmes

+ +} +

+ +
} + +
+ +
+ +

Abonnements RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NomEvénementsNom de la File
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Toutes les Files}
:} diff --git a/templates/fr/choose-device.tmpl b/templates/fr/choose-device.tmpl new file mode 100644 index 0000000..2bcb430 --- /dev/null +++ b/templates/fr/choose-device.tmpl @@ -0,0 +1,53 @@ +
+ +

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

+ +{CUPS_GET_DEVICES_DONE?
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Connexion courante\: +{current_device_uri}
Imprimantes locales\: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Imprimantes Réseaux Découvertes\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Autres Imprimantes Réseaux\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
:

Recherche en cours...

} + +
diff --git a/templates/fr/choose-make.tmpl b/templates/fr/choose-make.tmpl new file mode 100644 index 0000000..5f97938 --- /dev/null +++ b/templates/fr/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom:{printer_name}
Description:{printer_info}
Emplacement:{printer_location}
Connexion:{device_uri}
Partage: +{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette Imprimante
Marque: + +
 
Ou donner un fichier PPD:
+ +
+
diff --git a/templates/fr/choose-model.tmpl b/templates/fr/choose-model.tmpl new file mode 100644 index 0000000..7a2ce53 --- /dev/null +++ b/templates/fr/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nom:{printer_name}
Description:{printer_info}
Emplacement:{printer_location}
Connexion:{device_uri}
Partage: +{?printer_is_shared=?Ne pas:{?printer_is_shared=0?Ne pas:}} Partager cette imprimante
Marque:{PPD_MAKE}
Modèle: + +
Ou donner un fichier PPD:
+ +
+
diff --git a/templates/fr/choose-serial.tmpl b/templates/fr/choose-serial.tmpl new file mode 100644 index 0000000..8d5d67d --- /dev/null +++ b/templates/fr/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Connexion:{device_uri}
Baud/s:
Parité:
Bits de données:
Contrôle de flux:
+ +
+
diff --git a/templates/fr/choose-uri.tmpl b/templates/fr/choose-uri.tmpl new file mode 100644 index 0000000..2abe5f4 --- /dev/null +++ b/templates/fr/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?Modifier {printer_name}:Ajouter une imprimante}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Connexion:
Exemples: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

Cf. "Imprimantes Réseaux" pour construire l'URI à employée avec votre imprimante.

+ +
+ +
+
diff --git a/templates/fr/class-added.tmpl b/templates/fr/class-added.tmpl new file mode 100644 index 0000000..c961a55 --- /dev/null +++ b/templates/fr/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Ajouter une Classe

+ +

La classe {printer_name} a été ajoutée avec succès. + +

diff --git a/templates/fr/class-confirm.tmpl b/templates/fr/class-confirm.tmpl new file mode 100644 index 0000000..276ec34 --- /dev/null +++ b/templates/fr/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Supprimer la classe {printer_name}

+ +

Attention: Etes-vous sur(e) de vouloir supprimer la classe +{printer_name}?

+ +

+ +
diff --git a/templates/fr/class-deleted.tmpl b/templates/fr/class-deleted.tmpl new file mode 100644 index 0000000..297ecc1 --- /dev/null +++ b/templates/fr/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Supprimer la classe {printer_name}

+ +

La classe {printer_name} a été supprimée avec succès. + +

diff --git a/templates/fr/class-jobs-header.tmpl b/templates/fr/class-jobs-header.tmpl new file mode 100644 index 0000000..551f47e --- /dev/null +++ b/templates/fr/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Tâches

+
diff --git a/templates/fr/class-modified.tmpl b/templates/fr/class-modified.tmpl new file mode 100644 index 0000000..49ec8d0 --- /dev/null +++ b/templates/fr/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Modifier la Classe {printer_name}

+ +

La classe {printer_name} a été modifiée avec succès. + +

diff --git a/templates/fr/class.tmpl b/templates/fr/class.tmpl new file mode 100644 index 0000000..0d6d891 --- /dev/null +++ b/templates/fr/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?En attente:{printer_state=4?En cours d'impression:Arrêté}}, +{printer_is_accepting_jobs=0?Rejette les tâches:Accepte les tâches}, +{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partagée{default_name={printer_name}?, Imprimante par défaut:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Description:{printer_info}
Emplacement:{printer_location}
Membres:{?member_uris=?None:{member_uris}}
Défauts:job-sheets={job_sheets_default} +media={media_default?{media_default}:inconnu} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/fr/classes-header.tmpl b/templates/fr/classes-header.tmpl new file mode 100644 index 0000000..ddeb7a5 --- /dev/null +++ b/templates/fr/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Pas de classes:Affichage de {#printer_name} classe{total>1?s:}} sur {total}.

diff --git a/templates/fr/classes.tmpl b/templates/fr/classes.tmpl new file mode 100644 index 0000000..0a04ebe --- /dev/null +++ b/templates/fr/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nom de la file : Nom de la file }DescriptionEmplacementMembresÉtat
{printer_name}{printer_info}{printer_location}{?member_uris=?Aucun:{member_uris}}{printer_state=3?Inoccupé:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/fr/command.tmpl b/templates/fr/command.tmpl new file mode 100644 index 0000000..bcd0f90 --- /dev/null +++ b/templates/fr/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} sur {printer_name}

+ +

{job_state>5?:Busy Indicator }Commandes de tâche d'impression +{job_state=3?en attente:{job_state=4?retenu: +{job_state=5?en cours d'impression:{job_state=6?arrêté: +{job_state=7?annulé:{job_state=8?annulé:terminé}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/fr/edit-config.tmpl b/templates/fr/edit-config.tmpl new file mode 100644 index 0000000..62d1414 --- /dev/null +++ b/templates/fr/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Edition du Fichier de Configuration

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/fr/error-op.tmpl b/templates/fr/error-op.tmpl new file mode 100644 index 0000000..ba5c91c --- /dev/null +++ b/templates/fr/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Erreur

+ +

Erreur:

+ +
Opération inconnue "{op}"!
+ +
diff --git a/templates/fr/error.tmpl b/templates/fr/error.tmpl new file mode 100644 index 0000000..23e8509 --- /dev/null +++ b/templates/fr/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Erreur

+ +

{?message?{message}:Erreur:}

+ +
{error}
+ +
diff --git a/templates/fr/header.tmpl.in b/templates/fr/header.tmpl.in new file mode 100644 index 0000000..7b12eea --- /dev/null +++ b/templates/fr/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/fr/option-conflict.tmpl b/templates/fr/option-conflict.tmpl new file mode 100644 index 0000000..7077aac --- /dev/null +++ b/templates/fr/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Erreur: Les options suivantes sont incompatibles entre elles:

+ + + +

Veuillez modifier une ou plusieurs de ces options pour résoudre les conflits.

diff --git a/templates/fr/option-header.tmpl b/templates/fr/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/fr/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Accueil    Administration    Classes    Aide En Ligne   Tâches    Imprimantes  
 
diff --git a/templates/fr/help-header.tmpl b/templates/fr/help-header.tmpl new file mode 100644 index 0000000..b86150a --- /dev/null +++ b/templates/fr/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Rechercher dans +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}: + +

+ +
+ + + + +{QUERY?

Résultats de la recherche dans {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:tous les documents}}\:

+{QTEXT?:} +:

Aucun résultat trouvé.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Aide en ligne

+ +

Voici l'interface d'aide en ligne de CUPS. Entrez ci-dessus les mots à rechercher +ou cliquez sur un lien ci-contre pour afficher l'aide en ligne du document.

+ + +

Si vous êtes un nouvel utilisateur de CUPS, lisez la page "Présentation de CUPS". Il est conseillé aux utilisateurs +habitués de lire la page "Quoi de neuf dans CUPS +1.5" page.

+ +

La page d'accueil de CUPS donne aussi +accès à de nombreuses ressources, comme des forums de discussion pour les +utilisateurs, des réponses aux questions fréquentes, et un formulaire pour +soumettre des rapports de bug ou des demandes pour de nouvelles fonctionnalités.

} diff --git a/templates/fr/help-printable.tmpl b/templates/fr/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/fr/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/fr/help-trailer.tmpl b/templates/fr/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/fr/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/fr/job-cancel.tmpl b/templates/fr/job-cancel.tmpl new file mode 100644 index 0000000..ab54269 --- /dev/null +++ b/templates/fr/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Annuler la Tâche {job_id}

+ +

La tâche {job_id} a été annulée. + +

diff --git a/templates/fr/job-hold.tmpl b/templates/fr/job-hold.tmpl new file mode 100644 index 0000000..7c85916 --- /dev/null +++ b/templates/fr/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Retenir la tâche {job_id}

+ +

La tâche {job_id} a été retenue. + +

diff --git a/templates/fr/job-move.tmpl b/templates/fr/job-move.tmpl new file mode 100644 index 0000000..4cca760 --- /dev/null +++ b/templates/fr/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Transférer la tâche {job_id}:Transférer toutes les tâches}

+ + + + + + + + + + +
Nouvelle destination: + +
+ +
+ +
diff --git a/templates/fr/job-moved.tmpl b/templates/fr/job-moved.tmpl new file mode 100644 index 0000000..ba28d33 --- /dev/null +++ b/templates/fr/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Transférer la tâche {job_id}:Transférer toutes les tâches}

+ +

{job_id?Job {job_id}:Toutes les tâches} transférée(s) vers +{job_printer_name}.

+ +
diff --git a/templates/fr/job-release.tmpl b/templates/fr/job-release.tmpl new file mode 100644 index 0000000..4bfc1b9 --- /dev/null +++ b/templates/fr/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Libérer la Tâche {job_id}

+ +

La tâche {job_id} a été libérée. + +

diff --git a/templates/fr/job-restart.tmpl b/templates/fr/job-restart.tmpl new file mode 100644 index 0000000..0858840 --- /dev/null +++ b/templates/fr/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Réimprimer la Tâche {job_id}

+ +

La tâche {job_id} a été relancée. + +

diff --git a/templates/fr/jobs-header.tmpl b/templates/fr/jobs-header.tmpl new file mode 100644 index 0000000..c863005 --- /dev/null +++ b/templates/fr/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Pas de tâche:Affichage de {#job_id} tâche{total>1?s:}} {?which_jobs=?active{total>1?s:}:{which_jobs=all?:terminée{total>1?s:}}} {total=0?:sur {total}} .

diff --git a/templates/fr/jobs.tmpl b/templates/fr/jobs.tmpl new file mode 100644 index 0000000..4ac0934 --- /dev/null +++ b/templates/fr/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NomUtilisateurTaillePagesÉtatContrôle
{job_printer_name}-{job_id} {?job_name=?Inconnu:{job_name}} {?job_originating_user_name=?Withheld:{job_originating_user_name}} {job_k_octets}k {job_media_sheets_completed=0?Inconnu:{?job_media_sheets_completed}} {job_state=3?en attente depuis
{time_at_creation}:{job_state=4?retenu depuis
{time_at_creation}: +{job_state=5?en cours d'impression depuis
{time_at_processing}:{job_state=6?arrêté: +{job_state=7?annulé â
{time_at_completed}:{job_state=8?annulé:terminé à
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/fr/list-available-printers.tmpl b/templates/fr/list-available-printers.tmpl new file mode 100644 index 0000000..dcc9937 --- /dev/null +++ b/templates/fr/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Imprimantes Disponibles

+ +{#device_uri=0?

Aucune imprimante trouvée.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/fr/modify-class.tmpl b/templates/fr/modify-class.tmpl new file mode 100644 index 0000000..e01b9b4 --- /dev/null +++ b/templates/fr/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Modifier la Classe {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Description:
Emplacement:
Membres: + +
+ +
+
diff --git a/templates/fr/modify-printer.tmpl b/templates/fr/modify-printer.tmpl new file mode 100644 index 0000000..03e1b66 --- /dev/null +++ b/templates/fr/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Modifier {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Description:
+(Description compréhensible comme "HP LaserJet Recto/Verso")
Emplacement:
+(Emplacement compréhensible comme "Lab 1")
Connexion:{device_uri}
Partage: +Partager cette imprimante
+ +
+
diff --git a/templates/fr/norestart.tmpl b/templates/fr/norestart.tmpl new file mode 100644 index 0000000..95965c6 --- /dev/null +++ b/templates/fr/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Modifier les Paramètres

+ +

Le serveur n'a pas été redémarré car la configuration +n'a pas été modifiée...

+ +
diff --git a/templates/fr/option-boolean.tmpl b/templates/fr/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/fr/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/fr/option-pickmany.tmpl b/templates/fr/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/fr/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/fr/option-pickone.tmpl b/templates/fr/option-pickone.tmpl new file mode 100644 index 0000000..74901c3 --- /dev/null +++ b/templates/fr/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/fr/option-trailer.tmpl b/templates/fr/option-trailer.tmpl new file mode 100644 index 0000000..5dad006 --- /dev/null +++ b/templates/fr/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/fr/pager.tmpl b/templates/fr/pager.tmpl new file mode 100644 index 0000000..c4e7ba5 --- /dev/null +++ b/templates/fr/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/fr/printer-accept.tmpl b/templates/fr/printer-accept.tmpl new file mode 100644 index 0000000..cc25a09 --- /dev/null +++ b/templates/fr/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Accepte les Tâches sur {is_class?la classe:l'imprimante} {printer_name}

+ +

{is_class?La classe:L'imprimante} {printer_name} +accepte désormais les tâches d'impression.

+ +
diff --git a/templates/fr/printer-added.tmpl b/templates/fr/printer-added.tmpl new file mode 100644 index 0000000..a585368 --- /dev/null +++ b/templates/fr/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Ajouter une imprimante

+ +

L'imprimante {printer_name} a été ajoutée avec succès. + +

diff --git a/templates/fr/printer-configured.tmpl b/templates/fr/printer-configured.tmpl new file mode 100644 index 0000000..79ccb15 --- /dev/null +++ b/templates/fr/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Définir les options par défaut pour {printer_name}

+ +

{OP=set-class-options?Class :l'imprimante }{printer_name} + a été configurée avec succès. + +

diff --git a/templates/fr/printer-confirm.tmpl b/templates/fr/printer-confirm.tmpl new file mode 100644 index 0000000..715ddd1 --- /dev/null +++ b/templates/fr/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Supprimer l'imprimante {printer_name}

+ +

Warning: Etes-vous sûr(e) de vouloir supprimer l'imprimante +{printer_name}?

+ +

+ +
diff --git a/templates/fr/printer-default.tmpl b/templates/fr/printer-default.tmpl new file mode 100644 index 0000000..c0c16bb --- /dev/null +++ b/templates/fr/printer-default.tmpl @@ -0,0 +1,11 @@ +
+ +

Définir {is_class?la classe:l'imprimante} {printer_name} comme imprimante par défaut

+ +

{is_class?La classe:L'imprimante} {printer_name} +a été définie comme imprimante par défaut du serveur.

+ +
NB: Tout paramètre utilisateur défini via la commande lpoptions sera prioritaire sur le paramètre défini içi.
+ +
diff --git a/templates/fr/printer-deleted.tmpl b/templates/fr/printer-deleted.tmpl new file mode 100644 index 0000000..43af955 --- /dev/null +++ b/templates/fr/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Supprimer l'imprimante {printer_name}

+ +

L'imprimante {printer_name} a été supprimée avec succès. + +

diff --git a/templates/fr/printer-jobs-header.tmpl b/templates/fr/printer-jobs-header.tmpl new file mode 100644 index 0000000..551f47e --- /dev/null +++ b/templates/fr/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Tâches

+
diff --git a/templates/fr/printer-modified.tmpl b/templates/fr/printer-modified.tmpl new file mode 100644 index 0000000..fd40342 --- /dev/null +++ b/templates/fr/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modifier l'Imprimante {printer_name}

+ +

L'imprimante {printer_name} a été +modifiée avec succès. + +

diff --git a/templates/fr/printer-purge.tmpl b/templates/fr/printer-purge.tmpl new file mode 100644 index 0000000..07b0fcd --- /dev/null +++ b/templates/fr/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Purger les Tâches sur {is_class?la classe:l'imprimante} {printer_name}

+ +

Toutes les tâches de {is_class?la classe:l'imprimante} {printer_name} +ont été purgées.

+ +
diff --git a/templates/fr/printer-reject.tmpl b/templates/fr/printer-reject.tmpl new file mode 100644 index 0000000..36edcb8 --- /dev/null +++ b/templates/fr/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Rejeter les Tâches sur {is_class?Classe:Imprimante} {printer_name}

+ +

{is_class?La classe:L'imprimante} {printer_name} +n'accepte plus les tâches d'impression.

+ +
diff --git a/templates/fr/printer-start.tmpl b/templates/fr/printer-start.tmpl new file mode 100644 index 0000000..c1cf7b4 --- /dev/null +++ b/templates/fr/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Démarrer {is_class?la classe:l'imprimante} {printer_name}

+ +

{is_class?La classe:L'imprimante} {printer_name} +a été démarrée.

+ +
diff --git a/templates/fr/printer-stop.tmpl b/templates/fr/printer-stop.tmpl new file mode 100644 index 0000000..3226110 --- /dev/null +++ b/templates/fr/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Arrêter {is_class?la classe:l'imprimante} {printer_name}

+ +

{is_class?La classe:L'imprimante} {printer_name} +a été arrêtée.

+ +
diff --git a/templates/fr/printer.tmpl b/templates/fr/printer.tmpl new file mode 100644 index 0000000..3ea015d --- /dev/null +++ b/templates/fr/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Innocupée:{printer_state=4?En cours d'impression:En pause}}, +{printer_is_accepting_jobs=0?Rejette les tâches:Accepte les tâches}, +{server_is_sharing_printers=0?Non:{printer_is_shared=0?Non:}} Partagée{default_name={printer_name}?, Imprimante par défaut:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Description:{printer_info}
Emplacement:{printer_location}
Pilote:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Connexion:{device_uri}
Défauts:job-sheets={job_sheets_default} +media={media_default?{media_default}:inconnu} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/fr/printers-header.tmpl b/templates/fr/printers-header.tmpl new file mode 100644 index 0000000..fe6753f --- /dev/null +++ b/templates/fr/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Pas d'imprimante:Affichage de {#printer_name} sur {total} imprimante{total>1?s:}}.

diff --git a/templates/fr/printers.tmpl b/templates/fr/printers.tmpl new file mode 100644 index 0000000..2abc59c --- /dev/null +++ b/templates/fr/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nom de la file : Nom de la file }DescriptionEmplacementMarque et ModèleÉtat
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Inoccupée:{printer_state=4?En cours d'impression:En pause}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/fr/restart.tmpl b/templates/fr/restart.tmpl new file mode 100644 index 0000000..da164b7 --- /dev/null +++ b/templates/fr/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Modifier les Paramètres

+ +

Veuillez patienter pendant que le serveur redémarre...

+ +
diff --git a/templates/fr/samba-export.tmpl b/templates/fr/samba-export.tmpl new file mode 100644 index 0000000..e10e429 --- /dev/null +++ b/templates/fr/samba-export.tmpl @@ -0,0 +1,53 @@ + + +
+ + + +

Exporter les Imprimantes vers Samba

+ +{error?

Impossible d'exporter les imprimantes vers Samba\:

+
{error}
+

Consulter le fichier error_log pour plus d'informations.

: +

Cette page vous permet d'exporter des imprimantes vers Samba de sorte que des +clients Windows puissent y accéder via l'ic&oacirc;ne Voisinage réseau ou +Favoris réseau du bureau. Vous devez au préalable installer les +pilotes Windows d'imprimante PostScript : cf. la page man cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Imprimantes: +
+ Exporter toutes les imprimantes +
Utilisateur Samba: (required)
Mot de passe Samba: (required)
+ +
diff --git a/templates/fr/samba-exported.tmpl b/templates/fr/samba-exported.tmpl new file mode 100644 index 0000000..d4ad778 --- /dev/null +++ b/templates/fr/samba-exported.tmpl @@ -0,0 +1 @@ +

Les imprimantes ont été exportées vers Samba avec succès.

diff --git a/templates/fr/search.tmpl b/templates/fr/search.tmpl new file mode 100644 index 0000000..50b1b4e --- /dev/null +++ b/templates/fr/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Rechercher dans +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?les classes:{SECTION=jobs?les tâches:les imprimantes}}}: +

+ +
diff --git a/templates/fr/set-printer-options-header.tmpl b/templates/fr/set-printer-options-header.tmpl new file mode 100644 index 0000000..12e0b1d --- /dev/null +++ b/templates/fr/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Définir les Options pour {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/fr/set-printer-options-trailer.tmpl b/templates/fr/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/fr/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/fr/subscription-added.tmpl b/templates/fr/subscription-added.tmpl new file mode 100644 index 0000000..54ffe8f --- /dev/null +++ b/templates/fr/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

L'abonnement au flux RSS {subscription_name} a été ajouté avec succès.

+ +
diff --git a/templates/fr/subscription-canceled.tmpl b/templates/fr/subscription-canceled.tmpl new file mode 100644 index 0000000..d453611 --- /dev/null +++ b/templates/fr/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

L'abonnement #{notify_subscription_id}au flux RSS a été annulé.

+ +
diff --git a/templates/fr/test-page.tmpl b/templates/fr/test-page.tmpl new file mode 100644 index 0000000..8be7c6f --- /dev/null +++ b/templates/fr/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Imprimer une Page de Test sur {printer_name}

+ +

La page de test a été envoyée; l'identifiant de la tâche est +{printer_name}-{job_id}.

+ +
diff --git a/templates/fr/trailer.tmpl b/templates/fr/trailer.tmpl new file mode 100644 index 0000000..c92c9dc --- /dev/null +++ b/templates/fr/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS et le logo CUPS sont des marques déposées de +Apple Inc. CUPS est sous copyright 2007-2012 Apple +Inc. Tous droits réservés. + + + diff --git a/templates/fr/users.tmpl b/templates/fr/users.tmpl new file mode 100644 index 0000000..cb9a052 --- /dev/null +++ b/templates/fr/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Utilisateurs autorisés à utiliser {printer_name}

+ + + + + + + + + + +
Utilisateurs: + +
+Autoriser ces utilisateurs à imprimer +Empêcher ces utilisateurs d'imprimer +
+ +
+ +
+
diff --git a/templates/header.tmpl.in b/templates/header.tmpl.in new file mode 100644 index 0000000..a383725 --- /dev/null +++ b/templates/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + +
+ + + + + + + + + + + + + +
  Home    Administration    Classes    Online Help    Jobs    Printers  
 
diff --git a/templates/help-header.tmpl b/templates/help-header.tmpl new file mode 100644 index 0000000..70d8d50 --- /dev/null +++ b/templates/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Search in +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}: + +

+ +
+ + + + +{QUERY?

Search Results in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:All Documents}}\:

+{QTEXT?:} +:

No matches found.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Online Help

+ +

This is the CUPS online help interface. Enter search words +above or click on any of the documentation links to display +online help information.

+ +

If you are new to CUPS, read the "Overview of CUPS" page. Veteran users +should read the "What's New in CUPS +1.5" page.

+ +

The CUPS home page also +provides many resources including user discussion forums, answers +to frequently-asked questions, and a form for submitting bug +reports and feature requests.

} diff --git a/templates/help-printable.tmpl b/templates/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/help-trailer.tmpl b/templates/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/hu/add-class.tmpl b/templates/hu/add-class.tmpl new file mode 100644 index 0000000..fcfec00 --- /dev/null +++ b/templates/hu/add-class.tmpl @@ -0,0 +1,41 @@ +
+ +

Osztály hozzáadása

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Név:
+(Tetszőleges nyomtatható karaktert tartalmazhat, kivéve a „/”, „#” és szóköz karaktereket)
Leírás:
+(Közérthető leírás, mint például „HP LaserJet duplexerrel”)
Hely:
+(Közérthető hely, mint például „1-es labor”)
Tagok: + +
+
+ +
+
\ No newline at end of file diff --git a/templates/hu/add-printer.tmpl b/templates/hu/add-printer.tmpl new file mode 100644 index 0000000..6400699 --- /dev/null +++ b/templates/hu/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Nyomtató hozzáadása

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Név:
+(Tetszőleges nyomtatható karaktert tartalmazhat, kivéve a „/”, „#” és szóköz karaktereket)
Leírás:
+(Közérthető leírás, mint például „HP LaserJet duplexerrel”)
Hely:
+(Közérthető hely, mint például „1-es labor”)
Kapcsolat:{device_uri}
Megosztás: Nyomtató megosztása
+ +
+
\ No newline at end of file diff --git a/templates/hu/add-rss-subscription.tmpl b/templates/hu/add-rss-subscription.tmpl new file mode 100644 index 0000000..7d66a29 --- /dev/null +++ b/templates/hu/add-rss-subscription.tmpl @@ -0,0 +1,58 @@ +
+ + + +

RSS-hírforrás hozzáadása

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Név:
+(Tetszőleges nyomtatható karaktert tartalmazhat, kivéve a szóközt, +a „/”, „?”, és „#” karaktereket)
Sor:
Események:Feladat létrehozva
+Feladat befejeződött
+Feladat leállítva
+Feladat beállításai módosítva
    Sor leállítva
+Sor hozzáadva
+Sor módosítva
+Sor törölve
    Kiszolgáló elindítva
+Kiszolgáló leállítva
+Kiszolgáló újraindítva
+Kiszolgáló biztonsági megfigyelése
Események maximális száma a hírforrásban:
+ +
diff --git a/templates/hu/admin.tmpl b/templates/hu/admin.tmpl new file mode 100644 index 0000000..6e495a0 --- /dev/null +++ b/templates/hu/admin.tmpl @@ -0,0 +1,134 @@ + + +
+ +

Nyomtatók

+ +

+

+
+
+
+
+{have_samba?
:} +

+ +

Osztályok

+ +

+

+
+
+

+ +

Feladatok

+ +

+

+

+ +
          + +

Kiszolgáló

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Kiszolgálóbeállítások\:

+ +

Speciális
+ + + Más +rendszerek által megosztott nyomtatók megjelenítése
+        Protokollok\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ A +rendszerhez csatlakozó nyomtatók megosztása
+        Kliensek max.\: +
+        Protokollok\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Nyomtatás engedélyezése az internetről
+         Webes felület hirdetése
+ Távoli +adminisztráció engedélyezése
+{have_gssapi? Kerberos +hitelesítés használata (FAQ)
:} + A +felhasználók bármely feladatot megszakíthatják (nem csak a sajátjukat)
+ Feladatelőzmények megőrzése
+        Feladatok száma\: +
+         Feladatok nyomtatási fájljainak megőrzése
+ Hibakeresési +információk mentése hibaelhárításhoz
+        Naplófájlméret max.\: +

+ +:

Kiszolgálóbeállítások:

+ +

Speciális +
+ + Más +rendszerek által megosztott nyomtatók megjelenítése
+ A +rendszerhez csatlakozó nyomtatók megosztása
+         Nyomtatás engedélyezése az internetről
+ Távoli +adminisztráció engedélyezése
+{have_gssapi? Kerberos +hitelesítés használata (FAQ)
:} + A +felhasználók bármely feladatot megszakíthatják (nem csak a sajátjukat)
+ Hibakeresési +információk mentése hibaelhárításhoz

+ +} +

+ +
} + +
+ +
+ +

RSS-hírforrások

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NévEseményekSor neve
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Minden +sor}
:} diff --git a/templates/hu/choose-device.tmpl b/templates/hu/choose-device.tmpl new file mode 100644 index 0000000..2491e04 --- /dev/null +++ b/templates/hu/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?{printer_name} módosítása:Nyomtató +hozzáadása}

+ +{CUPS_GET_DEVICES_DONE?
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Jelenlegi kapcsolat\: +{current_device_uri}
Helyi nyomtatók\: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Feltérképezett hálózati nyomtatók\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Egyéb hálózati nyomtatók\: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
:

Nyomtatók keresése...

} + +
diff --git a/templates/hu/choose-make.tmpl b/templates/hu/choose-make.tmpl new file mode 100644 index 0000000..e554a6d --- /dev/null +++ b/templates/hu/choose-make.tmpl @@ -0,0 +1,65 @@ +
+ +

{op=modify-printer?{printer_name} módosítása:Nyomtató +hozzáadása}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Név:{printer_name}
Leírás:{printer_info}
Hely:{printer_location}
Kapcsolat:{device_uri}
Megosztás: +{?printer_is_shared=?Nincs megosztva:{?printer_is_shared=0?:Nyomtató megosztása}}
Gyártó: + +
 
Vagy adjon meg egy PPD-fájlt:
+ +
+
\ No newline at end of file diff --git a/templates/hu/choose-model.tmpl b/templates/hu/choose-model.tmpl new file mode 100644 index 0000000..34a455d --- /dev/null +++ b/templates/hu/choose-model.tmpl @@ -0,0 +1,61 @@ +
+ +

{op=modify-printer?{printer_name} módosítása:Nyomtató hozzáadása}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Név:{printer_name}
Leírás:{printer_info}
Hely:{printer_location}
Kapcsolat:{device_uri}
Megosztás: +{?printer_is_shared=?Nincs megosztva:{?printer_is_shared=0?:Nyomtató +megosztása}}
Gyártó:{PPD_MAKE}
Modell: + +
Vagy adjon meg egy PPD-fájlt:
+ +
+
\ No newline at end of file diff --git a/templates/hu/choose-serial.tmpl b/templates/hu/choose-serial.tmpl new file mode 100644 index 0000000..a661cfd --- /dev/null +++ b/templates/hu/choose-serial.tmpl @@ -0,0 +1,53 @@ +
+ +

{op=modify-printer?{printer_name} módosítása:Nyomtató +hozzáadása}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kapcsolat:{device_uri}
Adatátviteli sebesség:
Paritás:
Adatbitek:
Folyamvezérlés:
+ +
+
\ No newline at end of file diff --git a/templates/hu/choose-uri.tmpl b/templates/hu/choose-uri.tmpl new file mode 100644 index 0000000..687c744 --- /dev/null +++ b/templates/hu/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?{printer_name} módosítása:Nyomtató +hozzáadása}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Kapcsolat:
Példák: +
+    http://gépnév:631/ipp/
+    http://gépnév:631/ipp/port1
+
+    ipp://gépnév/ipp/
+    ipp://gépnév/ipp/port1
+
+    lpd://gépnév/nyomtatásisor
+
+    socket://gépnév
+    socket://gépnév:9100
+
+ +

A nyomtatóval használandó helyes URI-címért nézze meg a „Hálózati nyomtatók” oldalt.

+ +
+ +
+
\ No newline at end of file diff --git a/templates/hu/class-added.tmpl b/templates/hu/class-added.tmpl new file mode 100644 index 0000000..a313c42 --- /dev/null +++ b/templates/hu/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Osztály hozzáadása

+ +

A(z) {printer_name} osztály +sikeresen hozzáadva. +

diff --git a/templates/hu/class-confirm.tmpl b/templates/hu/class-confirm.tmpl new file mode 100644 index 0000000..89b5b7c --- /dev/null +++ b/templates/hu/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

{printer_name} osztály törlése

+ +

Figyelmeztetés: Biztosan törli a következő osztályt: +{printer_name}?

+ +

+ +
diff --git a/templates/hu/class-deleted.tmpl b/templates/hu/class-deleted.tmpl new file mode 100644 index 0000000..b6743c7 --- /dev/null +++ b/templates/hu/class-deleted.tmpl @@ -0,0 +1,6 @@ +
+ +

{printer_name} osztály törlése

+ +

A(z) {printer_name} osztály sikeresen törölve. +

\ No newline at end of file diff --git a/templates/hu/class-jobs-header.tmpl b/templates/hu/class-jobs-header.tmpl new file mode 100644 index 0000000..0ed221c --- /dev/null +++ b/templates/hu/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Feladatok

+
diff --git a/templates/hu/class-modified.tmpl b/templates/hu/class-modified.tmpl new file mode 100644 index 0000000..b344c92 --- /dev/null +++ b/templates/hu/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

{printer_name} osztály módosítása

+ +

A(z) {printer_name} osztály +sikeresen módosítva. +

\ No newline at end of file diff --git a/templates/hu/class.tmpl b/templates/hu/class.tmpl new file mode 100644 index 0000000..92f2ac1 --- /dev/null +++ b/templates/hu/class.tmpl @@ -0,0 +1,48 @@ +
+

{printer_name} +({printer_state=3?Tétlen:{printer_state=4?Feldolgozás:Szüneteltetve}}, +{printer_is_accepting_jobs=0?visszautasítja a feladatokat:elfogad +feladatokat}, +{server_is_sharing_printers=0?nem:{printer_is_shared=0?nem:}} +megosztott{default_name={printer_name}?, kiszolgáló alapértelmezettje:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Leírás:{printer_info}
Hely:{printer_location}
Tagok:{?member_uris=?Nincs:{member_uris}}
Alapértelmezések:job-sheets={job_sheets_default} +media={media_default?{media_default}:ismeretlen} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/hu/classes-header.tmpl b/templates/hu/classes-header.tmpl new file mode 100644 index 0000000..7ed2742 --- /dev/null +++ b/templates/hu/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Nincsenek osztályok:{total} osztályból {#printer_name} megjelenítve.

diff --git a/templates/hu/classes.tmpl b/templates/hu/classes.tmpl new file mode 100644 index 0000000..86c6fbc --- /dev/null +++ b/templates/hu/classes.tmpl @@ -0,0 +1,15 @@ +{#printer_name=0?: + + + + + +{[printer_name] +} + +
{ORDER=dec? +Sor neve : Sor neve +} +LeírásHelyTagokÁllapot
{printer_name}{printer_info}{printer_location}{?member_uris=?Nincs:{member_uris}}{printer_state=3?Tétlen:{printer_state=4?Feldolgozás:Szüneteltetve}}{printer_state_message? +- "{printer_state_message}":}
} diff --git a/templates/hu/command.tmpl b/templates/hu/command.tmpl new file mode 100644 index 0000000..4d198ba --- /dev/null +++ b/templates/hu/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} ezen: {printer_name}

+ +

{job_state>5?:Foglalt jelzés }Nyomtató parancs feladat +{job_state=3?függőben:{job_state=4?felfüggesztve: +{job_state=5?feldolgozás:{job_state=6?leállítva: +{job_state=7?megszakítva:{job_state=8?félbeszakítva:befejeződött}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/hu/edit-config.tmpl b/templates/hu/edit-config.tmpl new file mode 100644 index 0000000..430ef34 --- /dev/null +++ b/templates/hu/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Konfigurációs fájl szerkesztése

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/hu/error-op.tmpl b/templates/hu/error-op.tmpl new file mode 100644 index 0000000..bbd267a --- /dev/null +++ b/templates/hu/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} hiba

+ +

Hiba:

+ +
Ismeretlen művelet: "{op}"!
+ +
diff --git a/templates/hu/error.tmpl b/templates/hu/error.tmpl new file mode 100644 index 0000000..7366c86 --- /dev/null +++ b/templates/hu/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} hiba

+ +

{?message?{message}:Hiba:}

+ +
{error}
+ +
diff --git a/templates/hu/header.tmpl.in b/templates/hu/header.tmpl.in new file mode 100644 index 0000000..6d123f3 --- /dev/null +++ b/templates/hu/header.tmpl.in @@ -0,0 +1,34 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/hu/option-conflict.tmpl b/templates/hu/option-conflict.tmpl new file mode 100644 index 0000000..4a540ee --- /dev/null +++ b/templates/hu/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Hiba: A következő beállítások ütköznek:

+ + + +

Az ütközés feloldása érdekében módosítsa legalább az egyik beállítást.

diff --git a/templates/hu/option-header.tmpl b/templates/hu/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/hu/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Kezdőoldal    Adminisztráció    Osztályok    Online súgó    Feladatok    Nyomtatók  
 
diff --git a/templates/hu/help-header.tmpl b/templates/hu/help-header.tmpl new file mode 100755 index 0000000..4cd362f --- /dev/null +++ b/templates/hu/help-header.tmpl @@ -0,0 +1,52 @@ +
+
+{TOPIC?:} + +

Keresés itt\: +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:minden dokumentáció}}: + +

+ +
+ + + + +{QUERY?

Találatok itt\: {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:minden +dokumentáció}}\:

+{QTEXT?:} +:

Nincs találat.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Online súgó

+ +

Ez a CUPS online súgófelülete. Adja meg fentebb a keresőkifejezéseket, +vagy kattintson a dokumentációs linkekre az online súgóinformációk +megjelenítéséhez.

+ +

Ha új CUPS felhasználó, olvassa el a „CUPS bemutatása” oldalt. A tapasztalt +felhasználóknak „A CUPS 1.5 újdonságai” +oldal elolvasását ajánljuk.

+ +

A CUPS honlapja is számos (angol +nyelvű) információforrást biztosít, beleértve a felhasználói fórumokat, +válaszokat a gyakran feltett kérdésekre és egy űrlapot hibajelentések és +szolgáltatáskérések beküldéséhez.

} diff --git a/templates/hu/help-printable.tmpl b/templates/hu/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/hu/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/hu/help-trailer.tmpl b/templates/hu/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/hu/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/hu/job-cancel.tmpl b/templates/hu/job-cancel.tmpl new file mode 100644 index 0000000..4534641 --- /dev/null +++ b/templates/hu/job-cancel.tmpl @@ -0,0 +1,6 @@ +
+ +

{job_id}. feladat megszakítása

+ +

A(z) {job_id}. feladat megszakítva. +

diff --git a/templates/hu/job-hold.tmpl b/templates/hu/job-hold.tmpl new file mode 100644 index 0000000..78e15a1 --- /dev/null +++ b/templates/hu/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

{job_id}. feladat felfüggesztése

+ +

A(z) {job_id}. feladat +nyomtatása felfüggesztve. +

diff --git a/templates/hu/job-move.tmpl b/templates/hu/job-move.tmpl new file mode 100644 index 0000000..7a822c3 --- /dev/null +++ b/templates/hu/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Feladat mozgatása {job_id}:Minden feladat mozgatása}

+ + + + + + + + + + +
Új cél: + +
+ +
+ +
diff --git a/templates/hu/job-moved.tmpl b/templates/hu/job-moved.tmpl new file mode 100644 index 0000000..0d4fc32 --- /dev/null +++ b/templates/hu/job-moved.tmpl @@ -0,0 +1,10 @@ +
+ +

{job_id?Feladat mozgatása {job_id}:Minden feladat +mozgatása}

+ +

{job_id?A(z) {job_id}. feladat:Minden +feladat} átmozgatva ide: {job_printer_name}.

+ +
diff --git a/templates/hu/job-release.tmpl b/templates/hu/job-release.tmpl new file mode 100644 index 0000000..6e788af --- /dev/null +++ b/templates/hu/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

{job_id}. feladat kiadása

+ +

A(z) {job_id}. feladat nyomtatásra +kiadva. +

diff --git a/templates/hu/job-restart.tmpl b/templates/hu/job-restart.tmpl new file mode 100644 index 0000000..c0fee69 --- /dev/null +++ b/templates/hu/job-restart.tmpl @@ -0,0 +1,6 @@ +
+ +

{job_id}. feladat újranyomtatása

+ +

A(z) {job_id}. feladat újraindítva. +

diff --git a/templates/hu/jobs-header.tmpl b/templates/hu/jobs-header.tmpl new file mode 100644 index 0000000..21d4647 --- /dev/null +++ b/templates/hu/jobs-header.tmpl @@ -0,0 +1,7 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Nincsenek feladatok:{total} +{?which_jobs=?aktív:{which_jobs=all?:befejezett}} feladatból {#job_id} +megjelenítve.

diff --git a/templates/hu/jobs.tmpl b/templates/hu/jobs.tmpl new file mode 100644 index 0000000..4cc60a2 --- /dev/null +++ b/templates/hu/jobs.tmpl @@ -0,0 +1,40 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? +Azonosító : Azonosító +} +NévFelhasználóMéretOldalakÁllapotVezérlés
{job_printer_name}-{job_id} {?job_name=?Ismeretlen:{job_name}} {?job_originating_user_name=?Visszatartott:{job_originating_user_name}} {job_k_octets}k {job_media_sheets_completed=0?Ismeretlen:{?job_media_sheets_completed}} {job_state=3?függőben ezóta
{time_at_creation}:{job_state=4?felfüggesztve ezóta
{time_at_creation}: {job_state=5?feldolgozás ezóta
{time_at_processing}:{job_state=6?megállítva: +{job_state=7?megszakítva
{time_at_completed}:{job_state=8?félbeszakítva:befejezve
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/hu/list-available-printers.tmpl b/templates/hu/list-available-printers.tmpl new file mode 100644 index 0000000..b7f32a3 --- /dev/null +++ b/templates/hu/list-available-printers.tmpl @@ -0,0 +1,12 @@ +
+ +

Elérhető nyomtatók

+ +{#device_uri=0?

Nem találhatók nyomtatók.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/hu/modify-class.tmpl b/templates/hu/modify-class.tmpl new file mode 100644 index 0000000..a687f99 --- /dev/null +++ b/templates/hu/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

{printer_name} osztály módosítása

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Leírás:
Hely:
Tagok: + +
+ +
+
\ No newline at end of file diff --git a/templates/hu/modify-printer.tmpl b/templates/hu/modify-printer.tmpl new file mode 100644 index 0000000..76c2b7f --- /dev/null +++ b/templates/hu/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

{printer_name} módosítása

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Leírás:
+(Közérthető leírás, mint például „HP LaserJet duplexerrel”)
Hely:
+(Közérthető hely, mint például „1-es labor”)
Kapcsolat:{device_uri}
Megosztás: Nyomtató megosztása
+ +
+
diff --git a/templates/hu/norestart.tmpl b/templates/hu/norestart.tmpl new file mode 100644 index 0000000..7f7849d --- /dev/null +++ b/templates/hu/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Beállítások módosítása

+ +

A kiszolgáló nem lett újraindítva, mivel a beállításokat nem +módosította...

+ +
diff --git a/templates/hu/option-boolean.tmpl b/templates/hu/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/hu/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/hu/option-pickmany.tmpl b/templates/hu/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/hu/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/hu/option-pickone.tmpl b/templates/hu/option-pickone.tmpl new file mode 100644 index 0000000..31f4616 --- /dev/null +++ b/templates/hu/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/hu/option-trailer.tmpl b/templates/hu/option-trailer.tmpl new file mode 100644 index 0000000..f6e3231 --- /dev/null +++ b/templates/hu/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + \ No newline at end of file diff --git a/templates/hu/pager.tmpl b/templates/hu/pager.tmpl new file mode 100644 index 0000000..6f0cca8 --- /dev/null +++ b/templates/hu/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/hu/printer-accept.tmpl b/templates/hu/printer-accept.tmpl new file mode 100644 index 0000000..5a44e9d --- /dev/null +++ b/templates/hu/printer-accept.tmpl @@ -0,0 +1,10 @@ +
+ +

Feladatok elfogadása a(z) {printer_name} +{is_class?osztályban:nyomtatón}

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} már elfogadja a feladatokat.

+ +
diff --git a/templates/hu/printer-added.tmpl b/templates/hu/printer-added.tmpl new file mode 100644 index 0000000..93548eb --- /dev/null +++ b/templates/hu/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Nyomtató hozzáadása

+ +

A(z) {printer_name} nyomtató +sikeresen hozzáadva. +

diff --git a/templates/hu/printer-configured.tmpl b/templates/hu/printer-configured.tmpl new file mode 100644 index 0000000..e7a0b50 --- /dev/null +++ b/templates/hu/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

{printer_name} alapértelmezett beállításainak megadása

+ +

{OP=set-class-options?A(z) +osztály:A(z) }{printer_name} +nyomtató alapértelmezett beállításai sikeresen megadva. +

diff --git a/templates/hu/printer-confirm.tmpl b/templates/hu/printer-confirm.tmpl new file mode 100644 index 0000000..f8f7992 --- /dev/null +++ b/templates/hu/printer-confirm.tmpl @@ -0,0 +1,9 @@ +
+ +

{printer_name} törlése

+ +

Figyelmeztetés: Biztosan törli a következő nyomtatót: {printer_name}?

+ +

+ +
diff --git a/templates/hu/printer-default.tmpl b/templates/hu/printer-default.tmpl new file mode 100644 index 0000000..95a5fc1 --- /dev/null +++ b/templates/hu/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

{printer_name} {is_class?osztály:nyomtató} beállítása alapértelmezettként

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} alapértelmezett nyomtatóvá téve a kiszolgálón.

+ +
Megjegyzés: Az lpoptions parancs segítségével +beállított felhasználói alapértelmezések felülbírálják ezt az +alapértelmezett beállítást.
+ +
diff --git a/templates/hu/printer-deleted.tmpl b/templates/hu/printer-deleted.tmpl new file mode 100644 index 0000000..54419c1 --- /dev/null +++ b/templates/hu/printer-deleted.tmpl @@ -0,0 +1,6 @@ +
+ +

{printer_name} törlése

+ +

A(z) {printer_name} nyomtató sikeresen törölve. +

diff --git a/templates/hu/printer-jobs-header.tmpl b/templates/hu/printer-jobs-header.tmpl new file mode 100644 index 0000000..0ed221c --- /dev/null +++ b/templates/hu/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Feladatok

+
diff --git a/templates/hu/printer-modified.tmpl b/templates/hu/printer-modified.tmpl new file mode 100644 index 0000000..7152c0f --- /dev/null +++ b/templates/hu/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

{printer_name} nyomtató módosítása

+ +

A(z) {printer_name} nyomtató +sikeresen módosítva. + +

\ No newline at end of file diff --git a/templates/hu/printer-purge.tmpl b/templates/hu/printer-purge.tmpl new file mode 100644 index 0000000..c9dd670 --- /dev/null +++ b/templates/hu/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Feladatok eltávolítása a(z) {printer_name} {is_class?osztályból:nyomtatóról}

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} összes feladata eltávolítva.

+ +
\ No newline at end of file diff --git a/templates/hu/printer-reject.tmpl b/templates/hu/printer-reject.tmpl new file mode 100644 index 0000000..cf5bf1e --- /dev/null +++ b/templates/hu/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Feladatok visszautasítása a(z) {printer_name} {is_class?osztályban:nyomtatón}

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} már nem fogad el feladatokat.

+ +
diff --git a/templates/hu/printer-start.tmpl b/templates/hu/printer-start.tmpl new file mode 100644 index 0000000..3a23c6b --- /dev/null +++ b/templates/hu/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

{printer_name} {is_class?osztály:nyomtató} folytatása

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} működése folytatódik.

+ +
\ No newline at end of file diff --git a/templates/hu/printer-stop.tmpl b/templates/hu/printer-stop.tmpl new file mode 100644 index 0000000..7f95e72 --- /dev/null +++ b/templates/hu/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

{printer_name} {is_class?osztály:nyomtató} szüneteltetése

+ +

A(z) {printer_name} +{is_class?osztály:nyomtató} működése szünetel.

+ +
\ No newline at end of file diff --git a/templates/hu/printer.tmpl b/templates/hu/printer.tmpl new file mode 100644 index 0000000..c4a4dce --- /dev/null +++ b/templates/hu/printer.tmpl @@ -0,0 +1,52 @@ +
+ +

{printer_name} +({printer_state=3?Tétlen:{printer_state=4?Feldolgozás:Szüneteltetve}}, +{printer_is_accepting_jobs=0?visszautasítja a feladatokat:elfogad +feladatokat}, +{server_is_sharing_printers=0?nem:{printer_is_shared=0?nem:}} +megosztott{default_name={printer_name}?, kiszolgáló alapértelmezettje:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Leírás:{printer_info}
Hely:{printer_location}
Illesztőprogram:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Kapcsolat:{device_uri}
Alapértelmezések:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
\ No newline at end of file diff --git a/templates/hu/printers-header.tmpl b/templates/hu/printers-header.tmpl new file mode 100644 index 0000000..c6f4bb7 --- /dev/null +++ b/templates/hu/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Nincsenek nyomtatók:{total} nyomtatóból {#printer_name} megjelenítve.

diff --git a/templates/hu/printers.tmpl b/templates/hu/printers.tmpl new file mode 100644 index 0000000..9f2b4c4 --- /dev/null +++ b/templates/hu/printers.tmpl @@ -0,0 +1,16 @@ +{#printer_name=0?: + + + + + +{[printer_name] +} + +
{ORDER=dec? +Sor neve : Sor neve +} +LeírásHelyGyártó és típusÁllapot
{printer_name}{printer_info}{printer_location}{printer_make_and_model} +{printer_state=3?Tétlen:{printer_state=4?Feldolgozás:Szüneteltetve}}{printer_state_message? +- "{printer_state_message}":}
} diff --git a/templates/hu/restart.tmpl b/templates/hu/restart.tmpl new file mode 100644 index 0000000..ab02d61 --- /dev/null +++ b/templates/hu/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Beállítások módosítása

+ +

Kis türelmet a kiszolgáló újraindulásáig...

+ +
diff --git a/templates/hu/samba-export.tmpl b/templates/hu/samba-export.tmpl new file mode 100644 index 0000000..c7dd115 --- /dev/null +++ b/templates/hu/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Nyomtatók exportálása Samba megosztáshoz

+ +{error?

Nem lehet exportálni a nyomtatókat a Samba megosztáshoz\:

+
{error}
+

További információkért lásd az +error_log fájlt.

: +

Ezen az oldalon exportálhatja nyomtatóit a Samba rendszerbe, így a +Windows kliensek elérhetik azokat az asztaluk Hálózatok +vagy Hálózati helyek ikonjai segítségével. Ehhez elsőként +telepítenie kell a Windows PostScript nyomtató-illesztőprogramokat, a +cupsaddsmb(8) +kézikönyvoldal által leírt módon.

} + + + + + + + + + + + + + + + + + + +
Nyomtatók: +
+ Minden nyomtató exportálása +
Samba felhasználónév: (szükséges)
Samba jelszó: (szükséges)
+ +
diff --git a/templates/hu/samba-exported.tmpl b/templates/hu/samba-exported.tmpl new file mode 100644 index 0000000..a488dec --- /dev/null +++ b/templates/hu/samba-exported.tmpl @@ -0,0 +1 @@ +

A nyomtatók sikeresen exportálva a Samba rendszerbe.

diff --git a/templates/hu/search.tmpl b/templates/hu/search.tmpl new file mode 100644 index 0000000..50d498e --- /dev/null +++ b/templates/hu/search.tmpl @@ -0,0 +1,11 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Keresés +{SEARCH_DEST?itt\: {SEARCH_DEST}:{SECTION=classes?osztályok +között:{SECTION=jobs?feladatok között:nyomtatók között}}}: +

+ +
diff --git a/templates/hu/set-printer-options-header.tmpl b/templates/hu/set-printer-options-header.tmpl new file mode 100644 index 0000000..6964bfc --- /dev/null +++ b/templates/hu/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

{printer_name} alapértelmezett beállításainak megadása

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/hu/set-printer-options-trailer.tmpl b/templates/hu/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/hu/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/hu/subscription-added.tmpl b/templates/hu/subscription-added.tmpl new file mode 100644 index 0000000..8bc8891 --- /dev/null +++ b/templates/hu/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

A(z) {subscription_name} hírforrás sikeresen felvéve.

+ +
diff --git a/templates/hu/subscription-canceled.tmpl b/templates/hu/subscription-canceled.tmpl new file mode 100644 index 0000000..0e13c9d --- /dev/null +++ b/templates/hu/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

A(z) {notify_subscription_id}. hírforrás törölve.

+ +
diff --git a/templates/hu/test-page.tmpl b/templates/hu/test-page.tmpl new file mode 100644 index 0000000..1f440a7 --- /dev/null +++ b/templates/hu/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Tesztoldal nyomtatása a következőn: {printer_name}

+ +

Tesztoldal elküldve; a feladatazonosító: {printer_name}-{job_id}.

+ +
diff --git a/templates/hu/trailer.tmpl b/templates/hu/trailer.tmpl new file mode 100644 index 0000000..8ab73c3 --- /dev/null +++ b/templates/hu/trailer.tmpl @@ -0,0 +1,8 @@ +
 
A CUPS és a CUPS logó az Apple Inc. védjegyei. CUPS copyright +2007-2012 Apple Inc. Minden jog fenntartva.
+ + diff --git a/templates/hu/users.tmpl b/templates/hu/users.tmpl new file mode 100644 index 0000000..846f492 --- /dev/null +++ b/templates/hu/users.tmpl @@ -0,0 +1,34 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Engedélyezett felhasználók ehhez: {printer_name}

+ + + + + + + + + + +
Felhasználók: + +
+Nyomtatás engedélyezése ezen +felhasználóknak +Nyomtatás megtiltása ezen +felhasználóknak +
+ +
+ +
+
diff --git a/templates/id/add-class.tmpl b/templates/id/add-class.tmpl new file mode 100644 index 0000000..55f90ad --- /dev/null +++ b/templates/id/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Tambah Kelas

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Nama:
+(Karakter apa saja yang dapat dicetak, kecuali "/", "#", dan spasi)
Deskripsi:
+(Deskripsi yang mudah dibaca, seperti "HP LaserJet dengan Duplexer")
Lokasi:
+(Lokasi yang mudah dibaca, seperti "Lab 1")
Anggota: + +
+ +
+
diff --git a/templates/id/add-printer.tmpl b/templates/id/add-printer.tmpl new file mode 100644 index 0000000..5c7c7cc --- /dev/null +++ b/templates/id/add-printer.tmpl @@ -0,0 +1,43 @@ +
+ +

Add Printer

+ +
+ + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nama:
+(Karakter apa saja yang dapat dicetak, kecuali "/", "#", dan spasi)
Deskripsi:
+(Deskripsi yang mudah dibaca, seperti "HP LaserJet dengan Duplexer")
Location:
+(Lokasi yang mudah dibaca, seperti "Lab 1")
Koneksi:{device_uri}
Berbagi: +Berbagi Pencetak Ini
+ +
+
diff --git a/templates/id/add-rss-subscription.tmpl b/templates/id/add-rss-subscription.tmpl new file mode 100644 index 0000000..bf8f964 --- /dev/null +++ b/templates/id/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Tambah Subskripsi RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nama:
+(Karakter apa saja yang dapat dicetak, kecuali "/", "#", dan spasi)
Antrian:
Kejadian:Tugas Dibuat
+Tugas Selesai
+Tugas Berhenti
+Opsi Tugas Berubah
    Antrian Berhenti
+Antrian Ditambah
+Antrian Berubah
+Antrian Dihapus
    Server Dimulai
+Server Berhenti
+Server Dijalankan Ulang
+Audit Keamanan Server
Maksimal Kejadian dalam Berita:
+ +
diff --git a/templates/id/admin.tmpl b/templates/id/admin.tmpl new file mode 100644 index 0000000..a19a00a --- /dev/null +++ b/templates/id/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Pencetak

+ +

+

+
+
+{have_samba?
:} +

+ +

Kelas

+ +

+

+
+

+ +

Tugas

+ +

+

+

+ +
          + +

Server

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Pengaturan Server\:

+ +

Lanjutan
+ + + Lihat pencetak yang dibagikan oleh sistem lain
+        Protokol\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Bagikan pencetak yang terhubung ke sistem ini
+        Klien maks.\: +
+        Protokol\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Perbolehkan mencetak dari Internet
+         Advertise web interface
+ Perbolehkan administrasi dari jarak jauh
+{have_gssapi? Gunakan otentikasi Kerberos (FAQ)
:} + Perbolehkan pengguna biasa untuk membatalkan semua tugas (termasuk tugas orang lain)
+ Catat histori tugas
+        Banyaknya tugas\: +
+         Catat berkas tugas cetak
+ Simpan informasi kesalahan untuk mencari dan memecahkan masalah
+        Ukuran maks. berkas log\: +

+ +:

Pengaturan Server:

+ +

Lanjutan
+ + Lihat pencetak yang dibagikan oleh sistem lain
+ Bagikan pencetak yang terhubung ke sistem ini
+         Perbolehkan mencetak dari Internet
+ Perbolehkan administrasi dari jarak jauh
+{have_gssapi? Gunakan otentikasi Kerberos (FAQ)
:} + Perbolehkan pengguna biasa untuk membatalkan semua tugas (termasuk tugas orang lain)
+ Save debugging information for troubleshooting

+ +} +

+ +
} + +
+ +
+ +

Subskripsi RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NamaKejadianNama Antrian
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Semua Antrian}
:} diff --git a/templates/id/choose-device.tmpl b/templates/id/choose-device.tmpl new file mode 100644 index 0000000..8f812a5 --- /dev/null +++ b/templates/id/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Ubah {printer_name}:Tambah Pencetak}

+ +{CUPS_GET_DEVICES_DONE?:

Mencari pencetak...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Koneksi yang Ada: +{current_device_uri}
Pencetak Lokal: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Pencetak Jaringan yang Ditemukan: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Pencetak Jaringan Lainnya: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/id/choose-make.tmpl b/templates/id/choose-make.tmpl new file mode 100644 index 0000000..d04338f --- /dev/null +++ b/templates/id/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Ubah {printer_name}:Tambah Pencetak}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nama:{printer_name}
Deskripsi:{printer_info}
Lokasi:{printer_location}
Koneksi:{device_uri}
Berbagi: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Share This Printer
Buatan: + +
 
Atau, Sediakan Berkas PPD:
+ +
+
diff --git a/templates/id/choose-model.tmpl b/templates/id/choose-model.tmpl new file mode 100644 index 0000000..c4cfdb9 --- /dev/null +++ b/templates/id/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Tambah Pencetak}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nama:{printer_name}
Deskripsi:{printer_info}
Lokasi:{printer_location}
Koneksi:{device_uri}
Berbagi: +{?printer_is_shared=?Jangan:{?printer_is_shared=0?Jangan:}} Berbagi Pencetak Ini
Pembuat:{PPD_MAKE}
Model: + +
Atau Sediakan Berkas PPD:
+ +
+
diff --git a/templates/id/choose-serial.tmpl b/templates/id/choose-serial.tmpl new file mode 100644 index 0000000..19de16c --- /dev/null +++ b/templates/id/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Tambah Pencetak}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Koneksi:{device_uri}
Kecepatan Data:
Paritas:
Bit Data:
Kendali Aliran Data:
+ +
+
diff --git a/templates/id/choose-uri.tmpl b/templates/id/choose-uri.tmpl new file mode 100644 index 0000000..4391b91 --- /dev/null +++ b/templates/id/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Tambah Pencetak}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Koneksi:
Contoh: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

Lihat "Pencetak Jaringan" untuk URI yang tepat bagi pencetak Anda.

+ +
+ +
+
diff --git a/templates/id/class-added.tmpl b/templates/id/class-added.tmpl new file mode 100644 index 0000000..12c408f --- /dev/null +++ b/templates/id/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Tambah Kelas

+ +

Kelas {printer_name} telah berhasil ditambahkan. + +

diff --git a/templates/id/class-confirm.tmpl b/templates/id/class-confirm.tmpl new file mode 100644 index 0000000..3805b91 --- /dev/null +++ b/templates/id/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Hapus Kelas {printer_name}

+ +

Peringatan: Anda yakin untuk menghapus kelas +{printer_name}?

+ +

+ +
diff --git a/templates/id/class-deleted.tmpl b/templates/id/class-deleted.tmpl new file mode 100644 index 0000000..30320cb --- /dev/null +++ b/templates/id/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Hapus Kelas {printer_name}

+ +

Kelas {printer_name} telah berhasil dihapus. + +

diff --git a/templates/id/class-jobs-header.tmpl b/templates/id/class-jobs-header.tmpl new file mode 100644 index 0000000..e6ca447 --- /dev/null +++ b/templates/id/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Tugas

+
diff --git a/templates/id/class-modified.tmpl b/templates/id/class-modified.tmpl new file mode 100644 index 0000000..d2fdded --- /dev/null +++ b/templates/id/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Ubah Kelas {printer_name}

+ +

Kelas {printer_name} telah berhasil diubah. + +

diff --git a/templates/id/class.tmpl b/templates/id/class.tmpl new file mode 100644 index 0000000..af21787 --- /dev/null +++ b/templates/id/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Idle:{printer_state=4?Memproses:Ditahan}}, +{printer_is_accepting_jobs=0?Menolak Tugas:Menerima Tugas}, +{server_is_sharing_printers=0?Jangan:{printer_is_shared=0?Jangan:}} Berbagi{default_name={printer_name}?, Server Baku:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Deskripsi:{printer_info}
Lokasi:{printer_location}
Anggota:{?member_uris=?None:{member_uris}}
Baku:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/id/classes-header.tmpl b/templates/id/classes-header.tmpl new file mode 100644 index 0000000..da891a3 --- /dev/null +++ b/templates/id/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Tidak ada kelas:Menampilkan {#printer_name} dari {total} kelas{total=1?:}}.

diff --git a/templates/id/classes.tmpl b/templates/id/classes.tmpl new file mode 100644 index 0000000..c8e9b5f --- /dev/null +++ b/templates/id/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nama Antrian : Nama Antrian }DeskripsiLokasiAnggotaStatus
{printer_name}{printer_info}{printer_location}{?member_uris=?Nihil:{member_uris}}{printer_state=3?Idle:{printer_state=4?Memproses:Ditahan}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/id/command.tmpl b/templates/id/command.tmpl new file mode 100644 index 0000000..b38d2c9 --- /dev/null +++ b/templates/id/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} Pada {printer_name}

+ +

{job_state>5?:Indikator Kesibukan }Perintah tugas pencetak +{job_state=3?pending:{job_state=4?held: +{job_state=5?processing:{job_state=6?stopped: +{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/id/edit-config.tmpl b/templates/id/edit-config.tmpl new file mode 100644 index 0000000..6701f84 --- /dev/null +++ b/templates/id/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Sunting Berkas Konfigurasi

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/id/error-op.tmpl b/templates/id/error-op.tmpl new file mode 100644 index 0000000..2611c5d --- /dev/null +++ b/templates/id/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

Kesalahan {?title} {?printer_name}

+ +

Kesalahan:

+ +
Operasi tak dikenal "{op}"!
+ +
diff --git a/templates/id/error.tmpl b/templates/id/error.tmpl new file mode 100644 index 0000000..c74bd70 --- /dev/null +++ b/templates/id/error.tmpl @@ -0,0 +1,9 @@ +
+ +

Kesalahan {?title} {?printer_name}

+ +

{?message?{message}:Kesalahan:}

+ +
{error}
+ +
diff --git a/templates/id/header.tmpl.in b/templates/id/header.tmpl.in new file mode 100644 index 0000000..b45d870 --- /dev/null +++ b/templates/id/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/id/option-conflict.tmpl b/templates/id/option-conflict.tmpl new file mode 100644 index 0000000..71e2bcc --- /dev/null +++ b/templates/id/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Kesalahan: Opsi berikut ini konflik:

+ + + +

Silakan ubah satu atau lebih opsi yang ada untuk memperbaiki masalah ini.

diff --git a/templates/id/option-header.tmpl b/templates/id/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/id/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Home    Administrasi    Kelas    Bantuan Langsung    Tugas    Pencetak  
 
diff --git a/templates/id/help-header.tmpl b/templates/id/help-header.tmpl new file mode 100644 index 0000000..e28b527 --- /dev/null +++ b/templates/id/help-header.tmpl @@ -0,0 +1,47 @@ +
+
+{TOPIC?:} + +

Mencari di +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Semua Dokumen}}: + +

+ +
+ + + + +{QUERY?

Hasil Pencarian di {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Semua Dokumen}}\:

+{QTEXT?:} +:

Tidak ada yang cocok.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Bantuan Langsung

+ +

Ini adalah antarmuka bantuan langsung milik CUPS. Masukkan kata yang hendak dicari pada kotak +di atas atau klik salah satu taut dokumen untuk melihat informasi bantuan langsung tersebut.

+ +

Apabila Anda adalah pengguna baru CUPS, bacalah halaman "Ikhtisar CUPS". Bagi yang sudah berpengalaman, dapat +membaca halaman "Apa yang Baru di CUPS +1.4".

+ +

Laman CUPS juga menyediakan berbagai sumber termasuk forum, jawaban untuk pertanyaan-pertanyaan yang sering diajukan, serta formulir untuk mengirim laporan kode hama dan permintaan fitur baru.

} diff --git a/templates/id/help-printable.tmpl b/templates/id/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/id/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/id/help-trailer.tmpl b/templates/id/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/id/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/id/job-cancel.tmpl b/templates/id/job-cancel.tmpl new file mode 100644 index 0000000..d3d6047 --- /dev/null +++ b/templates/id/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Batalkan Tugas {job_id}

+ +

Tugas {job_id} telah dibatalkan. + +

diff --git a/templates/id/job-hold.tmpl b/templates/id/job-hold.tmpl new file mode 100644 index 0000000..ab2dd59 --- /dev/null +++ b/templates/id/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Tahan Tugas {job_id}

+ +

Tugas {job_id} telah ditahan untuk dicetak. + +

diff --git a/templates/id/job-move.tmpl b/templates/id/job-move.tmpl new file mode 100644 index 0000000..9ec881a --- /dev/null +++ b/templates/id/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Pindahkan Tugas {job_id}:Pindahkan Semua Tugas}

+ + + + + + + + + + +
Tujuan Baru: + +
+ +
+ +
diff --git a/templates/id/job-moved.tmpl b/templates/id/job-moved.tmpl new file mode 100644 index 0000000..c52c312 --- /dev/null +++ b/templates/id/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Pindahkan Tugas {job_id}:Pindahkan Semua Tugas}

+ +

{job_id?Tugas {job_id}:Semua tugas} dipindahkan ke +{job_printer_name}.

+ +
diff --git a/templates/id/job-release.tmpl b/templates/id/job-release.tmpl new file mode 100644 index 0000000..a447ae1 --- /dev/null +++ b/templates/id/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Lepaskan Tugas {job_id}

+ +

Tugas {job_id} telah dilepas untuk dicetak. + +

diff --git a/templates/id/job-restart.tmpl b/templates/id/job-restart.tmpl new file mode 100644 index 0000000..c54601c --- /dev/null +++ b/templates/id/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Cetak Ulang Tugas {job_id}

+ +

Tugas {job_id} telah dilaksanakan ulang. + +

diff --git a/templates/id/jobs-header.tmpl b/templates/id/jobs-header.tmpl new file mode 100644 index 0000000..3cba80c --- /dev/null +++ b/templates/id/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Tidak ada tugas:Menampilkan {#job_id} dari {total} tugas {?which_jobs=?yang aktif:{which_jobs=all?:yang diselesaikan}} {total=1?:}}.

diff --git a/templates/id/jobs.tmpl b/templates/id/jobs.tmpl new file mode 100644 index 0000000..1cd13a0 --- /dev/null +++ b/templates/id/jobs.tmpl @@ -0,0 +1,36 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NamaPenggunaUkuranHalamanStatusKontrol
{job_printer_name}-{job_id} {?job_name=?Tak Dikenal:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Tak Dikenal:{?job_media_sheets_completed}} {job_state=3?ditunda sejak
{time_at_creation}:{job_state=4?ditahan sejak
{time_at_creation}: +{job_state=5?diproses sejak
{time_at_processing}:{job_state=6?dihentikan: +{job_state=7?dibatalkan pada
{time_at_completed}:{job_state=8?dibatalkan:diselesaikan pada
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/id/list-available-printers.tmpl b/templates/id/list-available-printers.tmpl new file mode 100644 index 0000000..f3ca39f --- /dev/null +++ b/templates/id/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Pencetak yang Ada

+ +{#device_uri=0?

Tidak ada pencetak.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/id/modify-class.tmpl b/templates/id/modify-class.tmpl new file mode 100644 index 0000000..db2d65e --- /dev/null +++ b/templates/id/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Ubah Kelas {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Deskripsi:
Lokasi:
Anggota: + +
+ +
+
diff --git a/templates/id/modify-printer.tmpl b/templates/id/modify-printer.tmpl new file mode 100644 index 0000000..9bdb0c4 --- /dev/null +++ b/templates/id/modify-printer.tmpl @@ -0,0 +1,38 @@ +
+ +

Ubah {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Deskripsi:
+(Deskripsi yang mudah dibaca, seperti "HP LaserJet dengan Pendupleks")
Lokasi:
+(Deskripsi yang mudah dibaca, seperti "Lab 1")
Koneksi:{device_uri}
Berbagi: +Berbagi Pencetak Ini
+ +
+
diff --git a/templates/id/norestart.tmpl b/templates/id/norestart.tmpl new file mode 100644 index 0000000..f39d9f2 --- /dev/null +++ b/templates/id/norestart.tmpl @@ -0,0 +1,7 @@ +
+ +

Ubah Pengaturan

+ +

Server tidak dijalankan ulang karena tidak ada perubahan yang terjadi...

+ +
diff --git a/templates/id/option-boolean.tmpl b/templates/id/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/id/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/id/option-pickmany.tmpl b/templates/id/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/id/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/id/option-pickone.tmpl b/templates/id/option-pickone.tmpl new file mode 100644 index 0000000..8ee71b3 --- /dev/null +++ b/templates/id/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/id/option-trailer.tmpl b/templates/id/option-trailer.tmpl new file mode 100644 index 0000000..a403a98 --- /dev/null +++ b/templates/id/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/id/pager.tmpl b/templates/id/pager.tmpl new file mode 100644 index 0000000..00b6340 --- /dev/null +++ b/templates/id/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/id/printer-accept.tmpl b/templates/id/printer-accept.tmpl new file mode 100644 index 0000000..bba229a --- /dev/null +++ b/templates/id/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Terima Tugas dari {is_class?Kelas:Pencetak} {printer_name}

+ +

{is_class?Kelas:Pencetak} {printer_name} +kini menerima tugas.

+ +
diff --git a/templates/id/printer-added.tmpl b/templates/id/printer-added.tmpl new file mode 100644 index 0000000..636496a --- /dev/null +++ b/templates/id/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Tambah Pencetak

+ +

Pencetak {printer_name} telah berhasil ditambahkan. + +

diff --git a/templates/id/printer-configured.tmpl b/templates/id/printer-configured.tmpl new file mode 100644 index 0000000..c2c8179 --- /dev/null +++ b/templates/id/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Atur Opsi Baku untuk {printer_name}

+ +

Opsi baku {OP=set-class-options?kelas :pencetak }{printer_name} +telah berhasil ditetapkan. + +

diff --git a/templates/id/printer-confirm.tmpl b/templates/id/printer-confirm.tmpl new file mode 100644 index 0000000..e6d89d6 --- /dev/null +++ b/templates/id/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Hapus Pencetak {printer_name}

+ +

Peringatan: Anda yakin untuk menghapus +{printer_name}?

+ +

+ +
diff --git a/templates/id/printer-default.tmpl b/templates/id/printer-default.tmpl new file mode 100644 index 0000000..2bbedae --- /dev/null +++ b/templates/id/printer-default.tmpl @@ -0,0 +1,11 @@ +
+ +

Atur {is_class?Kelas:Pencetak} {printer_name} sebagai Baku

+ +

{is_class?Kelas:Pencetak} {printer_name} +telah dijadikan pencetak utama pada server.

+ +
Catatan: Semua pengguna yang diatur melalui perintah lpoptions akan ditimpa oleh pengaturan ini.
+ +
diff --git a/templates/id/printer-deleted.tmpl b/templates/id/printer-deleted.tmpl new file mode 100644 index 0000000..e4492ea --- /dev/null +++ b/templates/id/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Hapus Pencetak {printer_name}

+ +

Pencetak {printer_name} telah berhasil dihapus. + +

diff --git a/templates/id/printer-jobs-header.tmpl b/templates/id/printer-jobs-header.tmpl new file mode 100644 index 0000000..e6ca447 --- /dev/null +++ b/templates/id/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Tugas

+
diff --git a/templates/id/printer-modified.tmpl b/templates/id/printer-modified.tmpl new file mode 100644 index 0000000..16a7ad3 --- /dev/null +++ b/templates/id/printer-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Ubah Pencetak {printer_name}

+ +

Pencetak {printer_name} telah berhasil diubah. + +

diff --git a/templates/id/printer-purge.tmpl b/templates/id/printer-purge.tmpl new file mode 100644 index 0000000..5dff3ef --- /dev/null +++ b/templates/id/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Bersihkan Tugas untuk {is_class?Kelas:Pencetak} {printer_name}

+ +

{is_class?Kelas:Pencetak} {printer_name} +telah dibersihkan dari semua tugas.

+ +
diff --git a/templates/id/printer-reject.tmpl b/templates/id/printer-reject.tmpl new file mode 100644 index 0000000..616dbf0 --- /dev/null +++ b/templates/id/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Tolak Tugas untuk {is_class?Kelas:Pencetak} {printer_name}

+ +

{is_class?Kelas:Pencetak} {printer_name} +tidak lagi menerima tugas.

+ +
diff --git a/templates/id/printer-start.tmpl b/templates/id/printer-start.tmpl new file mode 100644 index 0000000..ca3d95a --- /dev/null +++ b/templates/id/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Menjalankan Ulang {is_class?Kelas:Pencetak} {printer_name}

+ +

{is_class?Kelas:Pencetak} {printer_name} +telah dijalankan lagi.

+ +
diff --git a/templates/id/printer-stop.tmpl b/templates/id/printer-stop.tmpl new file mode 100644 index 0000000..ca022e0 --- /dev/null +++ b/templates/id/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Menghentikan {is_class?Kelas:Pencetak} {printer_name}

+ +

{is_class?Kelas:Pencetak} {printer_name} +telah dihentikan.

+ +
diff --git a/templates/id/printer.tmpl b/templates/id/printer.tmpl new file mode 100644 index 0000000..4c56b67 --- /dev/null +++ b/templates/id/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Menganggur:{printer_state=4?Memproses:Berhenti}}, +{printer_is_accepting_jobs=0?Menolak Tugas:Menerima Tugas}, +{server_is_sharing_printers=0?Tidak:{printer_is_shared=0?Tidak:}} Berbagi{default_name={printer_name}?, Server Baku:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Deskripsi:{printer_info}
Lokasi:{printer_location}
Penggerak:{printer_make_and_model} ({color_supported=1?warna:skala abu-abu}{sides_supported?, cetak 2-sisi:})
+
Koneksi:{device_uri}
Baku:job-sheets={job_sheets_default} +media={media_default?{media_default}:tak dikenal} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/id/printers-header.tmpl b/templates/id/printers-header.tmpl new file mode 100644 index 0000000..b1a00fc --- /dev/null +++ b/templates/id/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Tidak ada pencetak:Menampilkan {#printer_name} dari {total} pencetak{total=1?:}}.

diff --git a/templates/id/printers.tmpl b/templates/id/printers.tmpl new file mode 100644 index 0000000..3aa4d0d --- /dev/null +++ b/templates/id/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nama Antrian : Nama Antrian }DeskripsiLokasiPembuat dan ModelStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Menganggur:{printer_state=4?Memproses:Berhenti}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/id/restart.tmpl b/templates/id/restart.tmpl new file mode 100644 index 0000000..fde1b06 --- /dev/null +++ b/templates/id/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Ubah Pengaturan

+ +

Silakan tunggu selagi server dijalankan ulang...

+ +
diff --git a/templates/id/samba-export.tmpl b/templates/id/samba-export.tmpl new file mode 100644 index 0000000..4d9e175 --- /dev/null +++ b/templates/id/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Ekspor Pencetak ke Samba

+ +{error?

Tak dapat mengekspor pencetak ke Samba\:

+
{error}
+

Rujuklah berkas error_log untuk informasi lebih lanjut.

: +

Di halaman ini, Anda dapat mengekspor pencetak untuk Samba, sehingga +klien Windows dapat mengakses pencetak-pencetak tersebut melalui ikon +Network Neighborhood atau Network Places yang ada +di desktop mereka. Namun, sebelumnya Anda harus memasang penggerak +pencetak PostScript Windows seperti yang dijelaskan pada halaman +manual cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Pencetak: +
+ Ekspor Semua Pencetak +
Nama Pengguna Samba: (diperlukan)
Sandi Samba: (diperlukan)
+ +
diff --git a/templates/id/samba-exported.tmpl b/templates/id/samba-exported.tmpl new file mode 100644 index 0000000..8fa8111 --- /dev/null +++ b/templates/id/samba-exported.tmpl @@ -0,0 +1 @@ +

Pencetak berhasil diekspor ke Samba.

diff --git a/templates/id/search.tmpl b/templates/id/search.tmpl new file mode 100644 index 0000000..9dc2e5d --- /dev/null +++ b/templates/id/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Cari di +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Kelas:{SECTION=jobs?Tugas:Pencetak}}}: +

+ +
diff --git a/templates/id/set-printer-options-header.tmpl b/templates/id/set-printer-options-header.tmpl new file mode 100644 index 0000000..017e2c4 --- /dev/null +++ b/templates/id/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Atur Opsi Baku untuk {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/id/set-printer-options-trailer.tmpl b/templates/id/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/id/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/id/subscription-added.tmpl b/templates/id/subscription-added.tmpl new file mode 100644 index 0000000..70abc79 --- /dev/null +++ b/templates/id/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskripsi {subscription_name} telah berhasil ditambahkan.

+ +
diff --git a/templates/id/subscription-canceled.tmpl b/templates/id/subscription-canceled.tmpl new file mode 100644 index 0000000..ba7b0e1 --- /dev/null +++ b/templates/id/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskripsi #{notify_subscription_id} telah dibatalkan.

+ +
diff --git a/templates/id/test-page.tmpl b/templates/id/test-page.tmpl new file mode 100644 index 0000000..5b1492e --- /dev/null +++ b/templates/id/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Cetak Halaman Uji pada {printer_name}

+ +

Halaman uji telah dikirim; ID tugas adalah +{printer_name}-{job_id}.

+ +
diff --git a/templates/id/trailer.tmpl b/templates/id/trailer.tmpl new file mode 100644 index 0000000..c604f34 --- /dev/null +++ b/templates/id/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS dan logo CUPS adalah merek dagang dari +Apple Inc. Hak Cipta CUPS adalah 2007-2012 Apple +Inc. Semua hak terpelihara. + + + diff --git a/templates/id/users.tmpl b/templates/id/users.tmpl new file mode 100644 index 0000000..fe91070 --- /dev/null +++ b/templates/id/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Pengguna yang Diperbolehkan Bagi {printer_name}

+ + + + + + + + + + +
Pengguna: + +
+Perbolehkan pengguna ini untuk mencetak +Larang pengguna ini untuk mencetak +
+ +
+ +
+
diff --git a/templates/it/add-class.tmpl b/templates/it/add-class.tmpl new file mode 100644 index 0000000..cff0d45 --- /dev/null +++ b/templates/it/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Aggiungi classe

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Nome:
+(Può contenere qualsiasi carattere stampabile eccetto "/", "#", e spazio)
Descrizione:
+(Descrizione esplicativa del tipo "HP LaserJet con Duplexer")
Posizione:
+(Posizione esplicativa del tipo "Laboratorio 1")
Membri: + +
+ +
+
diff --git a/templates/it/add-printer.tmpl b/templates/it/add-printer.tmpl new file mode 100644 index 0000000..3bf0906 --- /dev/null +++ b/templates/it/add-printer.tmpl @@ -0,0 +1,43 @@ +
+ +

Aggiungi stampante

+ +
+ + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome:
+(Può contenere qualsiasi carattere stampabile eccetto "/", "#", e spazio)
Descrizione:
+(Descrizione esplicativa del tipo "HP LaserJet con Duplexer")
Posizione:
+(Posizione esplicativa del tipo "Laboratorio 1")
Connessione:{device_uri}
Condivisione: +Condividi la stampante
+ +
+
diff --git a/templates/it/add-rss-subscription.tmpl b/templates/it/add-rss-subscription.tmpl new file mode 100644 index 0000000..c85e45f --- /dev/null +++ b/templates/it/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Aggiungi iscrizione RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome:
+(Può contenere qualsiasi carattere eccetto spazio, "/", "?", e "#")
Coda:
Eventi:Stampa creata
+Stampa completata
+Stampa fermata
+Opzioni di stampa modificate
    Coda fermata
+Coda aggiunta
+Coda modificata
+Coda eliminata
    Server avviato
+Server fermato
+Server riavviato
+Controllo di sicurezza del server
N. massimo di eventi nella fonte:
+ +
diff --git a/templates/it/admin.tmpl b/templates/it/admin.tmpl new file mode 100644 index 0000000..7f7e44b --- /dev/null +++ b/templates/it/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Stampanti

+ +

+

+
+
+{have_samba?
:} +

+ +

Classi

+ +

+

+
+

+ +

Stampe

+ +

+

+

+ +
          + +

Server

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Impostazioni del server\:

+ +

Avanzate
+ + + Mostra stampanti condivise da altri sistemi
+        Protocolli\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Condividi le stampanti connesse al sistema
+        N. massimo di client\: +
+        Protocolli\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Consenti stampa da Internet
+         Pubblica l'interfaccia web
+ Consenti amministrazione remota
+{have_gssapi? Usa autenticazione Kerberos (FAQ)
:} + Consenti agli utenti di annullare ogni stampa (non solo le proprie)
+ Mantieni lo storico delle stampe
+        Numero di stampe\: +
+         Conserva i file di stampa
+ Salva informazioni di debug per la risoluzione di problemi
+        Dim. massima file di registro\: +

+ +:

Impostazioni server:

+ +

Avanzate
+ + Mostra stampanti condivise da altri sistemi
+ Condividi stampanti connesse al sistema
+         Consenti la stampa da Internet
+ Consenti amministrazione remota
+{have_gssapi? Utilizza autenticazione Kerberos (FAQ)
:} + Consenti agli utenti di annullare ogni stampa (non solo le proprie)
+ Salva le informazioni di debug per la risoluzione di problemi

+ +} +

+ +
} + +
+ +
+ +

Iscrizioni RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NomeEventiNome coda
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Tutte le code}
:} diff --git a/templates/it/choose-device.tmpl b/templates/it/choose-device.tmpl new file mode 100644 index 0000000..3420fdf --- /dev/null +++ b/templates/it/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Modifica {printer_name}:Aggiungi stampante}

+ +{CUPS_GET_DEVICES_DONE?:

Ricerca stampanti...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Connessione attuale: +{current_device_uri}
Stampanti locali: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Stampanti di rete rilevate: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Altre stampante di reti: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/it/choose-make.tmpl b/templates/it/choose-make.tmpl new file mode 100644 index 0000000..3bb4c78 --- /dev/null +++ b/templates/it/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Aggiungi stampante}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome:{printer_name}
Descrizione:{printer_info}
Posizione:{printer_location}
Connessione:{device_uri}
Condivisione: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Condividi questa stampante
Crea: + +
 
Or Provide a PPD File:
+ +
+
diff --git a/templates/it/choose-model.tmpl b/templates/it/choose-model.tmpl new file mode 100644 index 0000000..d7e9357 --- /dev/null +++ b/templates/it/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Aggiungi stampante}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nome:{printer_name}
Descrizione:{printer_info}
Posizione:{printer_location}
Connessione:{device_uri}
Condivisione: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Condividi stampante
Crea:{PPD_MAKE}
Modello: + +
O fornisci un file PPD:
+ +
+
diff --git a/templates/it/choose-serial.tmpl b/templates/it/choose-serial.tmpl new file mode 100644 index 0000000..106393a --- /dev/null +++ b/templates/it/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modifica {printer_name}:Aggiungi stampante}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Connessione:{device_uri}
Velocità:
Parità:
Data Bits:
Flow Control:
+ +
+
diff --git a/templates/it/choose-uri.tmpl b/templates/it/choose-uri.tmpl new file mode 100644 index 0000000..81b153a --- /dev/null +++ b/templates/it/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?Modifica {printer_name}:Aggiungi stampante}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Connection:
Esempi: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

Vedere "Stampanti di +rete" per l'URI corretto da utilizzare la stampante.

+ +
+ +
+
diff --git a/templates/it/class-added.tmpl b/templates/it/class-added.tmpl new file mode 100644 index 0000000..fcccaa3 --- /dev/null +++ b/templates/it/class-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Aggiungi classe

+ +

Class {printer_name} è stata aggiunta +correttamente. + +

diff --git a/templates/it/class-confirm.tmpl b/templates/it/class-confirm.tmpl new file mode 100644 index 0000000..4e99f45 --- /dev/null +++ b/templates/it/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Elimina classe {printer_name}

+ +

Warning: Sei sicuro di voler eliminare la classe +{printer_name}?

+ +

+ +
diff --git a/templates/it/class-deleted.tmpl b/templates/it/class-deleted.tmpl new file mode 100644 index 0000000..ce23654 --- /dev/null +++ b/templates/it/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Elimina classe {printer_name}

+ +

La classe {printer_name} è stata eliminata correttamente. + +

diff --git a/templates/it/class-jobs-header.tmpl b/templates/it/class-jobs-header.tmpl new file mode 100644 index 0000000..12a936e --- /dev/null +++ b/templates/it/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Stampe

+
diff --git a/templates/it/class-modified.tmpl b/templates/it/class-modified.tmpl new file mode 100644 index 0000000..04d4c84 --- /dev/null +++ b/templates/it/class-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modifica classe {printer_name}

+ +

La classe {printer_name} è stata +modificata correttamente. + +

diff --git a/templates/it/class.tmpl b/templates/it/class.tmpl new file mode 100644 index 0000000..0089c93 --- /dev/null +++ b/templates/it/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, +{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, +{server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Descrizione:{printer_info}
Posizione:{printer_location}
Membri:{?member_uris=?None:{member_uris}}
Predefiniti:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/it/classes-header.tmpl b/templates/it/classes-header.tmpl new file mode 100644 index 0000000..943537f --- /dev/null +++ b/templates/it/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Nessuna classe:Mostrat{total=1?a:e} {#printer_name} di {total} class{total=1?e:i}}.

\ No newline at end of file diff --git a/templates/it/classes.tmpl b/templates/it/classes.tmpl new file mode 100644 index 0000000..bfa5bdf --- /dev/null +++ b/templates/it/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nome coda : Nome coda }DescrizionePosizioneMembriStato
{printer_name}{printer_info}{printer_location}{?member_uris=?None:{member_uris}}{printer_state=3?In attesa:{printer_state=4?Elaborazion in corso:Sospesa}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/it/command.tmpl b/templates/it/command.tmpl new file mode 100644 index 0000000..80d44f6 --- /dev/null +++ b/templates/it/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} su {printer_name}

+ +

{job_state>5?:Indicatore di occupato }Printer command job +{job_state=3?pendente:{job_state=4?held: +{job_state=5?elaborazione in corso:{job_state=6?fermata: +{job_state=7?annullata:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/it/edit-config.tmpl b/templates/it/edit-config.tmpl new file mode 100644 index 0000000..c8d8ea8 --- /dev/null +++ b/templates/it/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Modifica file di configurazione

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/it/error-op.tmpl b/templates/it/error-op.tmpl new file mode 100644 index 0000000..c6cdfa8 --- /dev/null +++ b/templates/it/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Errore

+ +

Errore:

+ +
Operazione sconosciuta "{op}"!
+ +
diff --git a/templates/it/error.tmpl b/templates/it/error.tmpl new file mode 100644 index 0000000..b0e7a4b --- /dev/null +++ b/templates/it/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Errore

+ +

{?message?{message}:Error:}

+ +
{error}
+ +
diff --git a/templates/it/help-header.tmpl b/templates/it/help-header.tmpl new file mode 100644 index 0000000..39c39e5 --- /dev/null +++ b/templates/it/help-header.tmpl @@ -0,0 +1,50 @@ +
+
+{TOPIC?:} + +

Cerca in +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Tutti i documenti}}: + +

+ +
+ + + + +{QUERY?

Cerca risultati in {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Tutti i documenti}}\:

+{QTEXT?:} +:

Nessuna corrispondenza trovata.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Guida in linea

+ +

Questa è l'interfaccia di guida in linea di CUPS. Inserisci in alto i termini da ricercare +o fai clic su qualsiasi collegamento della documentazione per visualizzare +informazioni della guida in linea.

+ +

Se sei nuovo di CUPS, leggi la pagina "Panoramica di CUPS". Gli utenti esperti +dovrebbero leggere la pagina "Cosa c'è di nuovo in CUPS +1.4".

+ +

La pagina principale di CUPS fornisce +inoltre molte risorse tra le quali forum di discussione per gli utenti, risposte +alle domande frequenti, e un modulo per segnalare bug e richiede nuove funzionalità.

} diff --git a/templates/it/help-printable.tmpl b/templates/it/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/it/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/it/help-trailer.tmpl b/templates/it/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/it/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/it/job-cancel.tmpl b/templates/it/job-cancel.tmpl new file mode 100644 index 0000000..766881e --- /dev/null +++ b/templates/it/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Annulla la stampa {job_id}

+ +

La stampa {job_id} è stata annullata. + +

diff --git a/templates/it/job-hold.tmpl b/templates/it/job-hold.tmpl new file mode 100644 index 0000000..ac2d819 --- /dev/null +++ b/templates/it/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Blocca la stampa {job_id}

+ +

La stampa {job_id} è stata bloccata. + +

diff --git a/templates/it/job-move.tmpl b/templates/it/job-move.tmpl new file mode 100644 index 0000000..0a52ba2 --- /dev/null +++ b/templates/it/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Sposta la stampa {job_id}:Sposta tutte le stampe}

+ + + + + + + + + + +
Nuova destinazione: + +
+ +
+ +
diff --git a/templates/it/job-moved.tmpl b/templates/it/job-moved.tmpl new file mode 100644 index 0000000..98be4fe --- /dev/null +++ b/templates/it/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Sposta stampa {job_id}:Sposta tutte le stampe}

+ +

{job_id?La stampa {job_id}:Tutte le stampe} {job_id?è stata:sono state} spostat{job_id?a:e} su +{job_printer_name}.

+ +
diff --git a/templates/it/job-release.tmpl b/templates/it/job-release.tmpl new file mode 100644 index 0000000..c6520fd --- /dev/null +++ b/templates/it/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Rilascia la stampa {job_id}

+ +

La stampa {job_id} è stata rilasciata. + +

diff --git a/templates/it/job-restart.tmpl b/templates/it/job-restart.tmpl new file mode 100644 index 0000000..59d9aa6 --- /dev/null +++ b/templates/it/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Ripeti la stampa {job_id}

+ +

La stampa {job_id} è stata riavviata. + +

diff --git a/templates/it/jobs-header.tmpl b/templates/it/jobs-header.tmpl new file mode 100644 index 0000000..38538d1 --- /dev/null +++ b/templates/it/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Nessuna stampa:Mostrat{total=1?a:e} {#job_id} di {total} stamp{total=1?a:e} {?which_jobs=?attiva:{which_jobs=all?:completata}} }.

diff --git a/templates/it/jobs.tmpl b/templates/it/jobs.tmpl new file mode 100644 index 0000000..494c1ee --- /dev/null +++ b/templates/it/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NomeUtenteDimensionePagineStatoControllo
{job_printer_name}-{job_id} {?job_name=?Unknown:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Unknown:{?job_media_sheets_completed}} {job_state=3?pending since
{time_at_creation}:{job_state=4?held since
{time_at_creation}: +{job_state=5?processing since
{time_at_processing}:{job_state=6?stopped: +{job_state=7?canceled at
{time_at_completed}:{job_state=8?aborted:completed at
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/it/list-available-printers.tmpl b/templates/it/list-available-printers.tmpl new file mode 100644 index 0000000..147d610 --- /dev/null +++ b/templates/it/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Stampanti disponibili

+ +{#device_uri=0?

Nessuna stampante trovata.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/it/modify-class.tmpl b/templates/it/modify-class.tmpl new file mode 100644 index 0000000..065f2b9 --- /dev/null +++ b/templates/it/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Modifica classe {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Descrizione:
Posizione:
Membri: + +
+ +
+
\ No newline at end of file diff --git a/templates/it/modify-printer.tmpl b/templates/it/modify-printer.tmpl new file mode 100644 index 0000000..a6303f2 --- /dev/null +++ b/templates/it/modify-printer.tmpl @@ -0,0 +1,38 @@ +
+ +

Modifica {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Descrizione:
+(Descrizione esplicativa del tipo "HP LaserJet con Duplexer")
Posizione:
+(Posizione esplicativa del tipo "Laboratorio 1")
Connessione:{device_uri}
Condivisione: +Condividi stampante
+ +
+
diff --git a/templates/it/norestart.tmpl b/templates/it/norestart.tmpl new file mode 100644 index 0000000..924d533 --- /dev/null +++ b/templates/it/norestart.tmpl @@ -0,0 +1,7 @@ +
+ +

Cambia impostazioni

+ +

Il server non è stato riavviato poiché nessuna modifica è stata apportata alla configurazione...

+ +
diff --git a/templates/it/option-boolean.tmpl b/templates/it/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/it/option-boolean.tmpl @@ -0,0 +1,6 @@ + +{keytext}: + +{[choices]{text}} + + diff --git a/templates/it/option-conflict.tmpl b/templates/it/option-conflict.tmpl new file mode 100644 index 0000000..6d3b975 --- /dev/null +++ b/templates/it/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Errore: Le seguenti opzioni sono in conflitto:

+ + + +

Cambia una o più opzioni per risolvere i conflitti.

diff --git a/templates/it/option-header.tmpl b/templates/it/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/it/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ + diff --git a/templates/it/option-pickmany.tmpl b/templates/it/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/it/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/it/option-pickone.tmpl b/templates/it/option-pickone.tmpl new file mode 100644 index 0000000..c21fc71 --- /dev/null +++ b/templates/it/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/it/option-trailer.tmpl b/templates/it/option-trailer.tmpl new file mode 100644 index 0000000..ddbde0b --- /dev/null +++ b/templates/it/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ +
\ No newline at end of file diff --git a/templates/it/pager.tmpl b/templates/it/pager.tmpl new file mode 100644 index 0000000..019646f --- /dev/null +++ b/templates/it/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/it/printer-accept.tmpl b/templates/it/printer-accept.tmpl new file mode 100644 index 0000000..bbf718a --- /dev/null +++ b/templates/it/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Accetta stampe su {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +accetta stampe.

+ +
diff --git a/templates/it/printer-added.tmpl b/templates/it/printer-added.tmpl new file mode 100644 index 0000000..682dfa7 --- /dev/null +++ b/templates/it/printer-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Aggiungi stampante

+ +

Printer {printer_name} è stata aggiunta correttamente. + +

diff --git a/templates/it/printer-configured.tmpl b/templates/it/printer-configured.tmpl new file mode 100644 index 0000000..cfcbf65 --- /dev/null +++ b/templates/it/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Imposta le opzioni predefinite per {printer_name}

+ +

{OP=set-class-options?Class :Printer }{printer_name} +default options have been set successfully. + +

diff --git a/templates/it/printer-confirm.tmpl b/templates/it/printer-confirm.tmpl new file mode 100644 index 0000000..e23071c --- /dev/null +++ b/templates/it/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Elimina stampante {printer_name}

+ +

Avviso: Sei sicuro di voler eliminare la stampante +{printer_name}?

+ +

+ +
diff --git a/templates/it/printer-default.tmpl b/templates/it/printer-default.tmpl new file mode 100644 index 0000000..fe44138 --- /dev/null +++ b/templates/it/printer-default.tmpl @@ -0,0 +1,12 @@ +
+ +

Imposta {is_class?Class:Printer} {printer_name} come predefinita

+ +

{is_class?Class:Printer} {printer_name} +è la stampante predefinita su questo server.

+ +
Note: Qualsiasi utente predefinito impostato attraverso +il comando lpoptions scavalcherà questa impostazione predefinita.
+ +
diff --git a/templates/it/printer-deleted.tmpl b/templates/it/printer-deleted.tmpl new file mode 100644 index 0000000..4698805 --- /dev/null +++ b/templates/it/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Elimina la stampante {printer_name}

+ +

La stampante {printer_name} è stata eliminata correttamente. + +

diff --git a/templates/it/printer-jobs-header.tmpl b/templates/it/printer-jobs-header.tmpl new file mode 100644 index 0000000..12a936e --- /dev/null +++ b/templates/it/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Stampe

+
diff --git a/templates/it/printer-modified.tmpl b/templates/it/printer-modified.tmpl new file mode 100644 index 0000000..2a34e89 --- /dev/null +++ b/templates/it/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modifica la stampante {printer_name}

+ +

La stampante {printer_name} è stata +modificata correttamente. + +

\ No newline at end of file diff --git a/templates/it/printer-purge.tmpl b/templates/it/printer-purge.tmpl new file mode 100644 index 0000000..8cf7c14 --- /dev/null +++ b/templates/it/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Purge Jobs On {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +has been purged of all jobs.

+ +
\ No newline at end of file diff --git a/templates/it/printer-reject.tmpl b/templates/it/printer-reject.tmpl new file mode 100644 index 0000000..02f4ce9 --- /dev/null +++ b/templates/it/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Rifiuta stampe su {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +non accetta alcuna stampa.

+ +
diff --git a/templates/it/printer-start.tmpl b/templates/it/printer-start.tmpl new file mode 100644 index 0000000..b7f2edc --- /dev/null +++ b/templates/it/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Ripristina {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +è stata ripristinata.

+ +
\ No newline at end of file diff --git a/templates/it/printer-stop.tmpl b/templates/it/printer-stop.tmpl new file mode 100644 index 0000000..ef09118 --- /dev/null +++ b/templates/it/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Sospendi {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +è stata sospesa.

+ +
\ No newline at end of file diff --git a/templates/it/printer.tmpl b/templates/it/printer.tmpl new file mode 100644 index 0000000..78fc08b --- /dev/null +++ b/templates/it/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, +{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, +{server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Description:{printer_info}
Location:{printer_location}
Driver:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Connection:{device_uri}
Defaults:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
\ No newline at end of file diff --git a/templates/it/printers-header.tmpl b/templates/it/printers-header.tmpl new file mode 100644 index 0000000..e10112d --- /dev/null +++ b/templates/it/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Nessuna stampante:Mostrat{total=1?a:e} {#printer_name} di {total} stampant{total=1?e:i}}.

diff --git a/templates/it/printers.tmpl b/templates/it/printers.tmpl new file mode 100644 index 0000000..87efb6d --- /dev/null +++ b/templates/it/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nome coda : Nome coda }DescrizionePosizioneMarca e modelloStato
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/it/restart.tmpl b/templates/it/restart.tmpl new file mode 100644 index 0000000..3d64248 --- /dev/null +++ b/templates/it/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Cambia impostazioni

+ +

Attendi il riavvio del server...

+ +
diff --git a/templates/it/samba-export.tmpl b/templates/it/samba-export.tmpl new file mode 100644 index 0000000..bce7469 --- /dev/null +++ b/templates/it/samba-export.tmpl @@ -0,0 +1,54 @@ + + +
+ + + +

Esporta stampanti a Samba

+ +{error?

Impossibile esportare stampanti a Samba\:

+
{error}
+

Consulta il file error_log per ulteriori informazioni.

: +

Questa pagina ti consente di esportare stampanti a Samba in modo che +i client Windows possano accedervi dalle icone Risorse di rete +sui loro desktop. Devi installare preventivamente i driver per stampanti +Windows PostScript come descritto nella pagina di manuale cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Stampanti: +
+ Esporta tutte le stampanti +
Nome utente Samba: (richiesto)
Password Samba: (richiesto)
+ +
diff --git a/templates/it/samba-exported.tmpl b/templates/it/samba-exported.tmpl new file mode 100644 index 0000000..d75f2d8 --- /dev/null +++ b/templates/it/samba-exported.tmpl @@ -0,0 +1 @@ +

Stampanti esportate a samba correttamente.

diff --git a/templates/it/search.tmpl b/templates/it/search.tmpl new file mode 100644 index 0000000..c71a9dd --- /dev/null +++ b/templates/it/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Cerca in +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classi:{SECTION=jobs?Stampe:Stampanti}}}: +

+ +
diff --git a/templates/it/set-printer-options-header.tmpl b/templates/it/set-printer-options-header.tmpl new file mode 100644 index 0000000..b0867ce --- /dev/null +++ b/templates/it/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Imposta opzioni predefinite per {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/it/set-printer-options-trailer.tmpl b/templates/it/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/it/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/it/subscription-added.tmpl b/templates/it/subscription-added.tmpl new file mode 100644 index 0000000..baec73d --- /dev/null +++ b/templates/it/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

L'iscrizione {subscription_name} è stata aggiunta correttamente.

+ +
diff --git a/templates/it/subscription-canceled.tmpl b/templates/it/subscription-canceled.tmpl new file mode 100644 index 0000000..b8a94aa --- /dev/null +++ b/templates/it/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

L'iscrizione #{notify_subscription_id} è stata annullata.

+ +
diff --git a/templates/it/test-page.tmpl b/templates/it/test-page.tmpl new file mode 100644 index 0000000..409ebf6 --- /dev/null +++ b/templates/it/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Stampa pagina di prova su {printer_name}

+ +

Pagina di prova inviata; l'ID della stampa è +{printer_name}-{job_id}.

+ +
diff --git a/templates/it/trailer.tmpl b/templates/it/trailer.tmpl new file mode 100644 index 0000000..100c3a1 --- /dev/null +++ b/templates/it/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS e il logo CUPS sono marchi di +Apple Inc. CUPS è un copyright 2007-2012 Apple +Inc. Tutti i diritti sono riservati. + + + diff --git a/templates/it/users.tmpl b/templates/it/users.tmpl new file mode 100644 index 0000000..34d8adb --- /dev/null +++ b/templates/it/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Utenti autorizzati per {printer_name}

+ + + + + + + + + + +
Utenti: + +
+Consenti a questi utenti di stampare +Vieta a questi utenti di stampare +
+ +
+ +
+
diff --git a/templates/ja/add-class.tmpl b/templates/ja/add-class.tmpl new file mode 100644 index 0000000..11108cc --- /dev/null +++ b/templates/ja/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

クラスの追加

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
名前:
+("/"、"#"、スペースを除く文字を含めることができます)
説明:
+("HP LaserJet with Duplexer" のように人が読みやすい説明)
場所:
+("Lab 1" のように人が読みやすい場所)
メンバー: + +
+ +
+
diff --git a/templates/ja/add-printer.tmpl b/templates/ja/add-printer.tmpl new file mode 100644 index 0000000..f054254 --- /dev/null +++ b/templates/ja/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

新しいプリンターの追加

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
名前:
+("/"、"#"、スペースを除く文字を含めることができます)
説明:
+("HP LaserJet with Duplexer" のように人が読みやすい説明)
場所:
+("Lab 1" のように人が読みやすい場所)
接続:{device_uri}
共有: +このプリンターを共有する
+ +
+
diff --git a/templates/ja/add-rss-subscription.tmpl b/templates/ja/add-rss-subscription.tmpl new file mode 100644 index 0000000..c5afeb0 --- /dev/null +++ b/templates/ja/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

RSS 購読を追加

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
名前:
+("/"、"?"、"#"、スペースを除く文字を含めることができます)
キュー:
イベント:ジョブが作成された
+ジョブが完了した
+ジョブが停止した
+ジョブオプションが変更された
    ã‚­ãƒ¥ãƒ¼ãŒåœæ­¢ã—た
+キューが追加された
+キューが変更された
+キューが削除された
    ã‚µãƒ¼ãƒãƒ¼ãŒé–‹å§‹ã—た
+サーバーが停止した
+サーバーが再起動した
+サーバーのセキュリティを監査中
フィード内の最大イベント数:
+ +
diff --git a/templates/ja/admin.tmpl b/templates/ja/admin.tmpl new file mode 100644 index 0000000..e1e0229 --- /dev/null +++ b/templates/ja/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

プリンター

+ +

+

+
+
+{have_samba?
:} +

+ +

クラス

+ +

+

+
+

+ +

ジョブ

+ +

+

+

+ +
          + +

サーバー

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

サーバー設定\:

+ +

詳細
+ + + ほかのシステムで共有されているプリンターを表示
+        ãƒ—ロトコル\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ このシステムに接続されているプリンターを共有
+        æœ€å¤§ã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆæ•°\: +
+        ãƒ—ロトコル\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         インターネットからの印刷を許可
+         ウェブインターフェイスを公開
+ リモート管理を許可
+{have_gssapi? Kerberos 認証を使用 (FAQ)
:} + 所有者以外のユーザーにもジョブのキャンセルを許可
+ ジョブの履歴を保存
+        æœ€å¤§ã‚¸ãƒ§ãƒ–æ•°\: +
+         ジョブの印刷ファイルを保存
+ トラブルシューティングのためにデバッグ情報を保存
+        æœ€å¤§ãƒ­ã‚°ãƒ•ã‚¡ã‚¤ãƒ«ã‚µã‚¤ã‚º\: +

+ +:

サーバー設定\:

+ +

詳細
+ + ほかのシステムで共有されているプリンターを表示
+ このシステムに接続されているプリンターを共有
+         インターネットからの印刷を許可
+ リモート管理を許可
+{have_gssapi? Kerberos 認証を使用 (FAQ)
:} + 所有者以外のユーザーにもジョブのキャンセルを許可
+ トラブルシューティングのためにデバッグ情報を保存

+ +} +

+ +
} + +
+ +
+ +

RSS 購読

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
名前イベントキュー名
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:すべてのキュー}
:} diff --git a/templates/ja/choose-device.tmpl b/templates/ja/choose-device.tmpl new file mode 100644 index 0000000..05700c3 --- /dev/null +++ b/templates/ja/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?{printer_name}の変更:プリンターの追加}

+ +{CUPS_GET_DEVICES_DONE?:

プリンターを探しています...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
現在の接続: +{current_device_uri}
ローカルプリンター: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
発見されたネットワークプリンター: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
その他のネットワークプリンター: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
\ No newline at end of file diff --git a/templates/ja/choose-make.tmpl b/templates/ja/choose-make.tmpl new file mode 100644 index 0000000..c800d98 --- /dev/null +++ b/templates/ja/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?{printer_name}の変更:プリンターの追加}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名前:{printer_name}
説明:{printer_info}
場所:{printer_location}
接続:{device_uri}
共有: +このプリンターを共有{?printer_is_shared=?しない:{?printer_is_shared=0?しない:する}}
メーカー: + +
 
または PPD ファイルを提供:
+ +
+
diff --git a/templates/ja/choose-model.tmpl b/templates/ja/choose-model.tmpl new file mode 100644 index 0000000..20011b4 --- /dev/null +++ b/templates/ja/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?{printer_name}の追加:プリンターの追加}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
名前:{printer_name}
説明:{printer_info}
場所:{printer_location}
接続:{device_uri}
共有: +このプリンターを共有{?printer_is_shared=?しない:{?printer_is_shared=0?しない:する}}
メーカー:{PPD_MAKE}
モデル: + +
または PPD ファイルを提供:
+ +
+
diff --git a/templates/ja/choose-serial.tmpl b/templates/ja/choose-serial.tmpl new file mode 100644 index 0000000..924b84a --- /dev/null +++ b/templates/ja/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?{printer_name}の変更:プリンターの追加}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
接続:{device_uri}
ボーレート:
パリティ:
データビット:
フロー制御:
+ +
+
\ No newline at end of file diff --git a/templates/ja/choose-uri.tmpl b/templates/ja/choose-uri.tmpl new file mode 100644 index 0000000..48978ed --- /dev/null +++ b/templates/ja/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?{printer_name}の変更:プリンターの追加}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
接続:
例: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

あなたのプリンターにふさわしい URI については、"ネットワークプリンター"を参照してください。

+ +
+ +
+
\ No newline at end of file diff --git a/templates/ja/class-added.tmpl b/templates/ja/class-added.tmpl new file mode 100644 index 0000000..284aa9f --- /dev/null +++ b/templates/ja/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

クラスの追加

+ +

クラス {printer_name} は正しく追加されました。 + +

diff --git a/templates/ja/class-confirm.tmpl b/templates/ja/class-confirm.tmpl new file mode 100644 index 0000000..e50b6a9 --- /dev/null +++ b/templates/ja/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

クラス {printer_name} の削除

+ +

警告: 本当にクラス +{printer_name} を削除しても良いですか?

+ +

+ +
diff --git a/templates/ja/class-deleted.tmpl b/templates/ja/class-deleted.tmpl new file mode 100644 index 0000000..4156937 --- /dev/null +++ b/templates/ja/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

クラス {printer_name} の削除

+ +

クラス {printer_name} は正しく削除されました。 + +

diff --git a/templates/ja/class-jobs-header.tmpl b/templates/ja/class-jobs-header.tmpl new file mode 100644 index 0000000..1d5d887 --- /dev/null +++ b/templates/ja/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

ジョブ

+
diff --git a/templates/ja/class-modified.tmpl b/templates/ja/class-modified.tmpl new file mode 100644 index 0000000..ef14ee4 --- /dev/null +++ b/templates/ja/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

クラス {printer_name} の変更

+ +

Class {printer_name} は正しく変更されました。 + +

diff --git a/templates/ja/class.tmpl b/templates/ja/class.tmpl new file mode 100644 index 0000000..c284076 --- /dev/null +++ b/templates/ja/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?待機中:{printer_state=4?処理中:停止}}, +{printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中}, +{server_is_sharing_printers=0?非:{printer_is_shared=0?非:}}共有{default_name={printer_name}?, デフォルトプリンター:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
説明:{printer_info}
場所:{printer_location}
メンバー:{?member_uris=?None:{member_uris}}
デフォルト:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/ja/classes-header.tmpl b/templates/ja/classes-header.tmpl new file mode 100644 index 0000000..506603c --- /dev/null +++ b/templates/ja/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?クラスはありません:{total} 個のクラスのうち {#printer_name} 個を表示中}。

diff --git a/templates/ja/classes.tmpl b/templates/ja/classes.tmpl new file mode 100644 index 0000000..82d13d6 --- /dev/null +++ b/templates/ja/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? キュー名 : キュー名 }説明場所メンバー状態
{printer_name}{printer_info}{printer_location}{?member_uris=?None:{member_uris}}{printer_state=3?待機中:{printer_state=4?処理中:停止}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/ja/command.tmpl b/templates/ja/command.tmpl new file mode 100644 index 0000000..3b8afbf --- /dev/null +++ b/templates/ja/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{printer_name} の {title}

+ +

{job_state>5?:Busy Indicator }プリンタージョブ +{job_state=3?ペンディング中:{job_state=4?ホールド中: +{job_state=5?処理中:{job_state=6?停止中: +{job_state=7?キャンセル:{job_state=8?破棄:完了}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/ja/edit-config.tmpl b/templates/ja/edit-config.tmpl new file mode 100644 index 0000000..a05a554 --- /dev/null +++ b/templates/ja/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

設定ファイルの設定

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/ja/error-op.tmpl b/templates/ja/error-op.tmpl new file mode 100644 index 0000000..81c8fbb --- /dev/null +++ b/templates/ja/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} エラー

+ +

エラー:

+ +
"{op}" は未知の操作です!
+ +
diff --git a/templates/ja/error.tmpl b/templates/ja/error.tmpl new file mode 100644 index 0000000..f10c388 --- /dev/null +++ b/templates/ja/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} エラー

+ +

{?message?{message}:エラー:}

+ +
{error}
+ +
diff --git a/templates/ja/header.tmpl.in b/templates/ja/header.tmpl.in new file mode 100644 index 0000000..ec64a74 --- /dev/null +++ b/templates/ja/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/ja/option-conflict.tmpl b/templates/ja/option-conflict.tmpl new file mode 100644 index 0000000..4f782ac --- /dev/null +++ b/templates/ja/option-conflict.tmpl @@ -0,0 +1,7 @@ +

エラー: 以下のオプションは競合します:

+ + + +

競合を解決するために、1 つ以上のオプションを変更してください。

diff --git a/templates/ja/option-header.tmpl b/templates/ja/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/ja/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  ãƒ›ãƒ¼ãƒ     ç®¡ç†    ã‚¯ãƒ©ã‚¹    ãƒ˜ãƒ«ãƒ—    ã‚¸ãƒ§ãƒ–   ãƒ—リンター 
 
diff --git a/templates/ja/help-header.tmpl b/templates/ja/help-header.tmpl new file mode 100644 index 0000000..ee0e5f0 --- /dev/null +++ b/templates/ja/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

+{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメント}内を検索: + +

+ +
+ + + + +{QUERY?

{HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:すべてのドキュメントの検索結果}}\:

+{QTEXT?:} +:

マッチするものは見つかりませんでした。

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

オンラインヘルプ

+ +

これは、CUPS のオンラインヘルプインターフェイスです。 +オンラインヘルプ情報を表示するには、検索語句を上に入力するか、 +ドキュメントリンクのいずれかをクリックしてください。

+ +

あなたが CUPS について初心者なら、 "CUPS の概要" を読んでください。 +上級ユーザーは、 "CUPS 1.4 の新機能" +を読むべきです。

+ +

CUPS ホームページ でも、ユーザー +ディスカッションフォーラム、FAQ、バグ報告や機能リクエストを申請する +フォームといった、多くのリソースを提供しています。

} + diff --git a/templates/ja/help-printable.tmpl b/templates/ja/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/ja/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/ja/help-trailer.tmpl b/templates/ja/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/ja/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/ja/job-cancel.tmpl b/templates/ja/job-cancel.tmpl new file mode 100644 index 0000000..16e44d8 --- /dev/null +++ b/templates/ja/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

ジョブ {job_id}のキャンセル

+ +

ジョブ {job_id} はキャンセルされました。 + +

diff --git a/templates/ja/job-hold.tmpl b/templates/ja/job-hold.tmpl new file mode 100644 index 0000000..4aec1b2 --- /dev/null +++ b/templates/ja/job-hold.tmpl @@ -0,0 +1,6 @@ +
+ +

ジョブ {job_id} の保留

+ +

ジョブ {job_id} は印刷を保留されました。 +

diff --git a/templates/ja/job-move.tmpl b/templates/ja/job-move.tmpl new file mode 100644 index 0000000..54da7e0 --- /dev/null +++ b/templates/ja/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?ジョブ {job_id} の移動:すべてのジョブの移動}

+ + + + + + + + + + +
新しい宛先: + +
+ +
+ +
diff --git a/templates/ja/job-moved.tmpl b/templates/ja/job-moved.tmpl new file mode 100644 index 0000000..d6b3445 --- /dev/null +++ b/templates/ja/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?ジョブ {job_id} の移動:すべてのジョブの移動}

+ +

{job_id?ジョブ {job_id}:すべてのジョブ} は +{job_printer_name}に移動しました。

+ +
diff --git a/templates/ja/job-release.tmpl b/templates/ja/job-release.tmpl new file mode 100644 index 0000000..fd9f89d --- /dev/null +++ b/templates/ja/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

ジョブ {job_id} の解放

+ +

ジョブ {job_id} は印刷から解放されました。 + +

diff --git a/templates/ja/job-restart.tmpl b/templates/ja/job-restart.tmpl new file mode 100644 index 0000000..493a4ac --- /dev/null +++ b/templates/ja/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

ジョブ {job_id} の再印刷

+ +

ジョブ {job_id} は再印刷されました。 + +

diff --git a/templates/ja/jobs-header.tmpl b/templates/ja/jobs-header.tmpl new file mode 100644 index 0000000..76095b4 --- /dev/null +++ b/templates/ja/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?ジョブはありません:{total} 個の{?which_jobs=?アクティブな:{which_jobs=all?:完了した}}ジョブのうち {#job_id} 個を表示中}。

diff --git a/templates/ja/jobs.tmpl b/templates/ja/jobs.tmpl new file mode 100644 index 0000000..bff543a --- /dev/null +++ b/templates/ja/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }名前ユーザーサイズページ状態制御
{job_printer_name}-{job_id} {?job_name=?未知:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?不明:{?job_media_sheets_completed}} {job_state=3?{time_at_creation}
から保留中:{job_state=4?held since
{time_at_creation}: +{job_state=5?{time_at_processing}
から処理中:{job_state=6?stopped: +{job_state=7?{time_at_completed}
にキャンセル:{job_state=8?{time_at_completed}に中断:に完了}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/ja/list-available-printers.tmpl b/templates/ja/list-available-printers.tmpl new file mode 100644 index 0000000..f70b5aa --- /dev/null +++ b/templates/ja/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

利用可能なプリンター

+ +{#device_uri=0?

プリンターが見つかりません。

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/ja/modify-class.tmpl b/templates/ja/modify-class.tmpl new file mode 100644 index 0000000..a41010f --- /dev/null +++ b/templates/ja/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

クラス {printer_name} の変更

+ +
+ + + + + + + + + + + + + + + + + + + + + +
説明:
場所:
メンバー: + +
+ +
+
\ No newline at end of file diff --git a/templates/ja/modify-printer.tmpl b/templates/ja/modify-printer.tmpl new file mode 100644 index 0000000..d8ef5f0 --- /dev/null +++ b/templates/ja/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

プリンター {printer_name} の変更

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
説明:
+("HP LaserJet with Duplexer" のように人が読みやすい説明)
場所:
+("Lab 1" のように人が読みやすい場所)
接続:{device_uri}
共有: +このプリンターを共有する
+ +
+
diff --git a/templates/ja/norestart.tmpl b/templates/ja/norestart.tmpl new file mode 100644 index 0000000..4740433 --- /dev/null +++ b/templates/ja/norestart.tmpl @@ -0,0 +1,7 @@ +
+ +

設定変更

+ +

設定に何も変更が行われなかったため、サーバーは再起動されませんでした...

+ +
diff --git a/templates/ja/option-boolean.tmpl b/templates/ja/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/ja/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/ja/option-pickmany.tmpl b/templates/ja/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/ja/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/ja/option-pickone.tmpl b/templates/ja/option-pickone.tmpl new file mode 100644 index 0000000..514e2ab --- /dev/null +++ b/templates/ja/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/ja/option-trailer.tmpl b/templates/ja/option-trailer.tmpl new file mode 100644 index 0000000..da2db1e --- /dev/null +++ b/templates/ja/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + \ No newline at end of file diff --git a/templates/ja/pager.tmpl b/templates/ja/pager.tmpl new file mode 100644 index 0000000..ebba3a0 --- /dev/null +++ b/templates/ja/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/ja/printer-accept.tmpl b/templates/ja/printer-accept.tmpl new file mode 100644 index 0000000..f13c662 --- /dev/null +++ b/templates/ja/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} のジョブの受け付け

+ +

{is_class?クラス:プリンター} {printer_name} +はジョブを受け付けるようになりました。

+ +
diff --git a/templates/ja/printer-added.tmpl b/templates/ja/printer-added.tmpl new file mode 100644 index 0000000..c07a832 --- /dev/null +++ b/templates/ja/printer-added.tmpl @@ -0,0 +1,6 @@ +
+ +

プリンターの追加

+ +

プリンター {printer_name} は正しく追加されました。 +

diff --git a/templates/ja/printer-configured.tmpl b/templates/ja/printer-configured.tmpl new file mode 100644 index 0000000..d6b2bf1 --- /dev/null +++ b/templates/ja/printer-configured.tmpl @@ -0,0 +1,7 @@ +
+ +

{printer_name} のデフォルトオプションの設定

+ +

{OP=set-class-options?クラス :プリンター }{printer_name} のデフォルトオプションは正しく設定されました。 + +

diff --git a/templates/ja/printer-confirm.tmpl b/templates/ja/printer-confirm.tmpl new file mode 100644 index 0000000..6fdb52c --- /dev/null +++ b/templates/ja/printer-confirm.tmpl @@ -0,0 +1,9 @@ +
+ +

プリンター {printer_name} の削除

+ +

警告: 本当にプリンター {printer_name} を削除してよいですか?

+ +

+ +
diff --git a/templates/ja/printer-default.tmpl b/templates/ja/printer-default.tmpl new file mode 100644 index 0000000..aa04c2e --- /dev/null +++ b/templates/ja/printer-default.tmpl @@ -0,0 +1,12 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} をデフォルトに設定

+ +

{is_class?クラス:プリンター} {printer_name} +をサーバーのデフォルトプリンターに設定しました。

+ +
注意: lpoptions コマンドで設定されたユーザーのデフォルトは、このサーバーのデフォルト設定を上書きします。 +
+ +
diff --git a/templates/ja/printer-deleted.tmpl b/templates/ja/printer-deleted.tmpl new file mode 100644 index 0000000..17cf44c --- /dev/null +++ b/templates/ja/printer-deleted.tmpl @@ -0,0 +1,6 @@ +
+ +

プリンター {printer_name} の削除

+ +

プリンター {printer_name} は正しく削除されました。 +

diff --git a/templates/ja/printer-jobs-header.tmpl b/templates/ja/printer-jobs-header.tmpl new file mode 100644 index 0000000..1d5d887 --- /dev/null +++ b/templates/ja/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

ジョブ

+
diff --git a/templates/ja/printer-modified.tmpl b/templates/ja/printer-modified.tmpl new file mode 100644 index 0000000..63997bb --- /dev/null +++ b/templates/ja/printer-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

プリンター {printer_name} の変更

+ +

プリンター {printer_name} は正しく変更されました。 + +

diff --git a/templates/ja/printer-purge.tmpl b/templates/ja/printer-purge.tmpl new file mode 100644 index 0000000..0546412 --- /dev/null +++ b/templates/ja/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} ジョブの全削除

+ +

{is_class?クラス:プリンター} {printer_name} +はすべてのジョブを削除しました。

+ +
diff --git a/templates/ja/printer-reject.tmpl b/templates/ja/printer-reject.tmpl new file mode 100644 index 0000000..ba7cc52 --- /dev/null +++ b/templates/ja/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} のジョブの拒否

+ +

{is_class?クラス:プリンター} {printer_name} +はジョブを受け付けなくなりました。

+ +
diff --git a/templates/ja/printer-start.tmpl b/templates/ja/printer-start.tmpl new file mode 100644 index 0000000..5c0eea1 --- /dev/null +++ b/templates/ja/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} の再開

+ +

{is_class?クラス:プリンター} {printer_name} +は再開しました。

+ +
diff --git a/templates/ja/printer-stop.tmpl b/templates/ja/printer-stop.tmpl new file mode 100644 index 0000000..8499b2e --- /dev/null +++ b/templates/ja/printer-stop.tmpl @@ -0,0 +1,8 @@ +
+ +

{is_class?クラス:プリンター} {printer_name} の停止

+ +

{is_class?クラス:プリンター} {printer_name} +は停止しました。

+
diff --git a/templates/ja/printer.tmpl b/templates/ja/printer.tmpl new file mode 100644 index 0000000..fbd9c5a --- /dev/null +++ b/templates/ja/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?待機中:{printer_state=4?処理中:一時停止中}}, +{printer_is_accepting_jobs=0?ジョブを拒否中:ジョブを受け付け中}, +{server_is_sharing_printers=0?非:{printer_is_shared=0?非:}}共有{default_name={printer_name}?, デフォルトプリンター:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
説明:{printer_info}
場所:{printer_location}
プリンタードライバー:{printer_make_and_model} ({color_supported=1?カラー:白黒}{sides_supported?, 両面可:})
+
接続先:{device_uri}
デフォルト設定:バナー={job_sheets_default} +用紙サイズ={media_default?{media_default}:unknown} +{sides_default?両面指定={sides_default}:}
+ +
diff --git a/templates/ja/printers-header.tmpl b/templates/ja/printers-header.tmpl new file mode 100644 index 0000000..1342eff --- /dev/null +++ b/templates/ja/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?プリンターはありません:{total} 台のプリンターのうち {#printer_name} 台を表示中}。

diff --git a/templates/ja/printers.tmpl b/templates/ja/printers.tmpl new file mode 100644 index 0000000..3fb9a37 --- /dev/null +++ b/templates/ja/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? キュー名:キュー名}説明場所メーカーとモデル状態
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?待機:{printer_state=4?Processing:停止中}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/ja/restart.tmpl b/templates/ja/restart.tmpl new file mode 100644 index 0000000..ec74fac --- /dev/null +++ b/templates/ja/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

設定の変更

+ +

サーバーが再起動するあいだ、しばらくお待ちください...

+ +
diff --git a/templates/ja/samba-export.tmpl b/templates/ja/samba-export.tmpl new file mode 100644 index 0000000..74b7991 --- /dev/null +++ b/templates/ja/samba-export.tmpl @@ -0,0 +1,56 @@ + + +
+ + + +

プリンターを Samba にエクスポート

+ +{error?

プリンターを Samba にエクスポートできません\:

+
{error}
+

より詳細な情報については error_log ファイルを参照してください。

: +

このページは、Windows クライアントがデスクトップ上の +マイネットワーク や ネットワークの場所 +アイコン経由でアクセスできるよう、プリンターの Samba +へのエクスポートを許可します。cupsaddsmb(8) man ページに書かれているように、 +事前に Windows PostScript ドライバーをインストールしておく必要があります。 +

} + + + + + + + + + + + + + + + + + + +
プリンター: +
+ すべてのプリンターをエクスポート +
Samba のユーザー名: (required)
Samba のパスワード: (required)
+ +
diff --git a/templates/ja/samba-exported.tmpl b/templates/ja/samba-exported.tmpl new file mode 100644 index 0000000..f67ddd9 --- /dev/null +++ b/templates/ja/samba-exported.tmpl @@ -0,0 +1 @@ +

プリンターは Samba に正しくエクスポートされました。

diff --git a/templates/ja/search.tmpl b/templates/ja/search.tmpl new file mode 100644 index 0000000..3e81995 --- /dev/null +++ b/templates/ja/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

+{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?クラス:{SECTION=jobs?ジョブ:プリンター}}} 内を検索: +

+ +
diff --git a/templates/ja/set-printer-options-header.tmpl b/templates/ja/set-printer-options-header.tmpl new file mode 100644 index 0000000..b5896f0 --- /dev/null +++ b/templates/ja/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

{printer_name} のデフォルトオプション変更

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/ja/set-printer-options-trailer.tmpl b/templates/ja/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/ja/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/ja/subscription-added.tmpl b/templates/ja/subscription-added.tmpl new file mode 100644 index 0000000..e4ab98c --- /dev/null +++ b/templates/ja/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

{subscription_name} の購読は正しく追加されました。

+ +
diff --git a/templates/ja/subscription-canceled.tmpl b/templates/ja/subscription-canceled.tmpl new file mode 100644 index 0000000..8787dad --- /dev/null +++ b/templates/ja/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

購読 #{notify_subscription_id} はキャンセルされました。

+ +
diff --git a/templates/ja/test-page.tmpl b/templates/ja/test-page.tmpl new file mode 100644 index 0000000..6cdaa87 --- /dev/null +++ b/templates/ja/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

{printer_name} のテストページ印刷

+ +

テストページを送信しました; ジョブ ID は +{printer_name}-{job_id} です。

+ +
diff --git a/templates/ja/trailer.tmpl b/templates/ja/trailer.tmpl new file mode 100644 index 0000000..123a197 --- /dev/null +++ b/templates/ja/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS and the CUPS logo are trademarks of +Apple Inc. CUPS is copyright 2007-2012 Apple +Inc. All rights reserved. + + + diff --git a/templates/ja/users.tmpl b/templates/ja/users.tmpl new file mode 100644 index 0000000..b998c6b --- /dev/null +++ b/templates/ja/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

{printer_name} に許可するユーザー

+ + + + + + + + + + +
ユーザー: + +
+これらのユーザーの印刷を許可 +これらのユーザーの印刷を禁止 +
+ +
+ +
+
diff --git a/templates/job-cancel.tmpl b/templates/job-cancel.tmpl new file mode 100644 index 0000000..3e8fd4d --- /dev/null +++ b/templates/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Cancel Job {job_id}

+ +

Job {job_id} has been canceled. + +

diff --git a/templates/job-hold.tmpl b/templates/job-hold.tmpl new file mode 100644 index 0000000..58ce97f --- /dev/null +++ b/templates/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Hold Job {job_id}

+ +

Job {job_id} has been held from printing. + +

diff --git a/templates/job-move.tmpl b/templates/job-move.tmpl new file mode 100644 index 0000000..6ef0ff1 --- /dev/null +++ b/templates/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Move Job {job_id}:Move All Jobs}

+ + + + + + + + + + +
New Destination: + +
+ +
+ +
diff --git a/templates/job-moved.tmpl b/templates/job-moved.tmpl new file mode 100644 index 0000000..c4db096 --- /dev/null +++ b/templates/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Move Job {job_id}:Move All Jobs}

+ +

{job_id?Job {job_id}:All jobs} moved to +{job_printer_name}.

+ +
diff --git a/templates/job-release.tmpl b/templates/job-release.tmpl new file mode 100644 index 0000000..8eb9a96 --- /dev/null +++ b/templates/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Release Job {job_id}

+ +

Job {job_id} has been released for printing. + +

diff --git a/templates/job-restart.tmpl b/templates/job-restart.tmpl new file mode 100644 index 0000000..b91ced9 --- /dev/null +++ b/templates/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Reprint Job {job_id}

+ +

Job {job_id} has been restarted. + +

diff --git a/templates/jobs-header.tmpl b/templates/jobs-header.tmpl new file mode 100644 index 0000000..e7547ba --- /dev/null +++ b/templates/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?No jobs:Showing {#job_id} of {total} {?which_jobs=?active:{which_jobs=all?:completed}} job{total=1?:s}}.

diff --git a/templates/jobs.tmpl b/templates/jobs.tmpl new file mode 100644 index 0000000..625059f --- /dev/null +++ b/templates/jobs.tmpl @@ -0,0 +1,36 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? ID : ID }NameUserSizePagesStateControl
{job_printer_name}-{job_id} {?job_name=?Unknown:{job_name}} {?job_originating_user_name=?Withheld:{job_originating_user_name}} {job_k_octets}k {job_media_sheets_completed=0?Unknown:{?job_media_sheets_completed}} {job_state=3?pending since
{time_at_creation}:{job_state=4?held since
{time_at_creation}: +{job_state=5?processing since
{time_at_processing}:{job_state=6?stopped: +{job_state=7?canceled at
{time_at_completed}:{job_state=8?aborted:completed at
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/list-available-printers.tmpl b/templates/list-available-printers.tmpl new file mode 100644 index 0000000..a594439 --- /dev/null +++ b/templates/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Available Printers

+ +{#device_uri=0?

No printers found.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/modify-class.tmpl b/templates/modify-class.tmpl new file mode 100644 index 0000000..31f7b9c --- /dev/null +++ b/templates/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Modify Class {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Description:
Location:
Members: + +
+ +
+
\ No newline at end of file diff --git a/templates/modify-printer.tmpl b/templates/modify-printer.tmpl new file mode 100644 index 0000000..bdf3df6 --- /dev/null +++ b/templates/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Modify {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Description:
+(Human-readable description such as "HP LaserJet with Duplexer")
Location:
+(Human-readable location such as "Lab 1")
Connection:{device_uri}
Sharing: +Share This Printer
+ +
+
diff --git a/templates/norestart.tmpl b/templates/norestart.tmpl new file mode 100644 index 0000000..6b31203 --- /dev/null +++ b/templates/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Change Settings

+ +

The server was not restarted because no changes were made to +the configuration...

+ +
diff --git a/templates/option-boolean.tmpl b/templates/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/option-boolean.tmpl @@ -0,0 +1,6 @@ + +{keytext}: + +{[choices]{text}} + + diff --git a/templates/option-conflict.tmpl b/templates/option-conflict.tmpl new file mode 100644 index 0000000..3772295 --- /dev/null +++ b/templates/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Error: The following options are conflicting:

+ + + +

Please change one or more of the options to resolve the conflicts.

diff --git a/templates/option-header.tmpl b/templates/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ + diff --git a/templates/option-pickmany.tmpl b/templates/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/option-pickone.tmpl b/templates/option-pickone.tmpl new file mode 100644 index 0000000..890ef4e --- /dev/null +++ b/templates/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/option-trailer.tmpl b/templates/option-trailer.tmpl new file mode 100644 index 0000000..17c9281 --- /dev/null +++ b/templates/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ +
\ No newline at end of file diff --git a/templates/pager.tmpl b/templates/pager.tmpl new file mode 100644 index 0000000..ebd688d --- /dev/null +++ b/templates/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/pl/add-class.tmpl b/templates/pl/add-class.tmpl new file mode 100644 index 0000000..d1f4b66 --- /dev/null +++ b/templates/pl/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Dodawanie klasy

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Członkowie: + +
+ +
+
diff --git a/templates/pl/add-printer.tmpl b/templates/pl/add-printer.tmpl new file mode 100644 index 0000000..45b50a0 --- /dev/null +++ b/templates/pl/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Dodawanie drukarki

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Połączenie:{device_uri}
Współdzielenie: +Współdzielenie tej drukarki
+ +
+
diff --git a/templates/pl/add-rss-subscription.tmpl b/templates/pl/add-rss-subscription.tmpl new file mode 100644 index 0000000..f11ba61 --- /dev/null +++ b/templates/pl/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Dodawanie subskrypcji RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz spacji, "/", "?" i "#")
Kolejka:
Zdarzenia:Utworzono zadanie
+Ukończono zadanie
+Zatrzymano zadanie
+Zmieniono opcje zadania
    Zatrzymano kolejkę
+Dodano kolejkę
+Zmodyfikowano kolejkę
+Usunięto kolejkę
    Uruchomiono serwer
+Zatrzymano serwer
+Ponownie uruchomiono serwer
+Audytowanie bezpieczeństwa serwera
Maksymalna liczba zdarzeń w kanale:
+ +
diff --git a/templates/pl/admin.tmpl b/templates/pl/admin.tmpl new file mode 100644 index 0000000..b997357 --- /dev/null +++ b/templates/pl/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Drukarki

+ +

+

+
+
+{have_samba?
:} +

+ +

Klasy

+ +

+

+
+

+ +

Zadania

+ +

+

+

+ +
          + +

Serwery

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Ustawienia serwera\:

+ +

Zaawansowane
+ + + Wyświetlanie drukarek współdzielonych przez inne systemy
+        Protokoły\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Współdzielenie drukarek podłączonych do tego systemu
+        Maksymalna liczba klientów\: +
+        Protokoły\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Zezwolenie na drukowanie z Internetu
+         Rozgłaszanie interfejsu WWW
+ Zezwolenie na zdalną administrację
+{have_gssapi? Używanie uwierzytelniania Kerberosa (FAQ)
:} + Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)
+ Przechowywanie plików zadań
+        Liczba zadań\: +
+         Przechowywanie plików wydruków zadań
+ Zapisywanie informacji debugowania do naprawiania problemów
+        Maksymalny rozmiar pliku dziennika\: +

+ +:

Ustawienia serwera:

+ +

Zaawansowane
+ + Wyświetlanie drukarek współdzielonych przez inne systemy
+ Współdzielenie drukarek połączonych do tego systemu
+         Zezwolenie na drukowanie z Internetu
+ Zezwolenie na zdalną administrację
+{have_gssapi? Używanie uwierzytelniania Kerberosa (FAQ)
:} + Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)
+ Zapisywanie informacji debugowania do naprawiania problemów

+ +} +

+ +
} + +
+ +
+ +

Subskrypcje RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NameZdarzeniaNazwa kolejki
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Wszystkie kolejki}
:} diff --git a/templates/pl/choose-device.tmpl b/templates/pl/choose-device.tmpl new file mode 100644 index 0000000..4457456 --- /dev/null +++ b/templates/pl/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +{CUPS_GET_DEVICES_DONE?:

Wyszukiwanie drukarek...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Bieżące połączenie: +{current_device_uri}
Lokalne drukarki: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Wykryte drukarki sieciowe: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Inne drukarki sieciowe: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/pl/choose-make.tmpl b/templates/pl/choose-make.tmpl new file mode 100644 index 0000000..c0ec622 --- /dev/null +++ b/templates/pl/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Dodawanie drukarki}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:{printer_name}
Opis:{printer_info}
Położenie:{printer_location}
Połączenie:{device_uri}
Współdzielenie: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Współdzielenie tej drukarki
Producent: + +
 
Lub podaj plik PPD:
+ +
+
diff --git a/templates/pl/choose-model.tmpl b/templates/pl/choose-model.tmpl new file mode 100644 index 0000000..9438cee --- /dev/null +++ b/templates/pl/choose-model.tmpl @@ -0,0 +1,60 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:{printer_name}
Opis:{printer_info}
Położenie:{printer_location}
Połączenie:{device_uri}
Współdzielenie: +{?printer_is_shared=?Nie:{?printer_is_shared=0?Nie:}} współdziel tej drukarki
Producent:{PPD_MAKE}
Model: + +
Lub podaj plik PPD:
+ +
+
diff --git a/templates/pl/choose-serial.tmpl b/templates/pl/choose-serial.tmpl new file mode 100644 index 0000000..8bbf8c8 --- /dev/null +++ b/templates/pl/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Połączenie:{device_uri}
Prędkość w baudach:
Równorzędność:
Bity danych:
Kontrola przepływu:
+ +
+
diff --git a/templates/pl/choose-uri.tmpl b/templates/pl/choose-uri.tmpl new file mode 100644 index 0000000..88201b9 --- /dev/null +++ b/templates/pl/choose-uri.tmpl @@ -0,0 +1,44 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Połączenie:
Przykłady: +
+    http://nazwakomputera:631/ipp/
+    http://nazwakomputera:631/ipp/port1
+
+    ipp://nazwakomputera/ipp/
+    ipp://nazwakomputera/ipp/port1
+
+    lpd://nazwakomputera/kolejka
+
+    socket://nazwakomputera
+    socket://nazwakomputera:9100
+
+ +

Proszę zobaczyć "Drukarki +sieciowe", aby uzyskać poprawne URI dla drukarki.

+ +
+ +
+
diff --git a/templates/pl/class-added.tmpl b/templates/pl/class-added.tmpl new file mode 100644 index 0000000..2bee7d8 --- /dev/null +++ b/templates/pl/class-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Dodawanie klasy

+ +

Klasa {printer_name} została pomyślnie +dodana. + +

diff --git a/templates/pl/class-confirm.tmpl b/templates/pl/class-confirm.tmpl new file mode 100644 index 0000000..55cb5ed --- /dev/null +++ b/templates/pl/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Usuwanie klasy {printer_name}

+ +

Ostrzeżenie: Usunąć klasę +{printer_name}?

+ +

+ +
diff --git a/templates/pl/class-deleted.tmpl b/templates/pl/class-deleted.tmpl new file mode 100644 index 0000000..1a78c90 --- /dev/null +++ b/templates/pl/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Usuwanie klasy {printer_name}

+ +

Klasa {printer_name} została pomyślnie usunięta. + +

diff --git a/templates/pl/class-jobs-header.tmpl b/templates/pl/class-jobs-header.tmpl new file mode 100644 index 0000000..83dcfbc --- /dev/null +++ b/templates/pl/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Zadania

+
diff --git a/templates/pl/class-modified.tmpl b/templates/pl/class-modified.tmpl new file mode 100644 index 0000000..be91caa --- /dev/null +++ b/templates/pl/class-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modyfikowanie klasy {printer_name}

+ +

Klasa {printer_name} została +pomyślnie zmodyfikowana. + +

diff --git a/templates/pl/class.tmpl b/templates/pl/class.tmpl new file mode 100644 index 0000000..5c015ac --- /dev/null +++ b/templates/pl/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymane}}, +{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań}, +{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Opis:{printer_info}
Położenie:{printer_location}
Członkowie:{?member_uris=?None:{member_uris}}
Domyślne:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/pl/classes-header.tmpl b/templates/pl/classes-header.tmpl new file mode 100644 index 0000000..8482fd1 --- /dev/null +++ b/templates/pl/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Brak klas:Wyświetlanie {#printer_name} z {total} klas{total=1?:es}}.

diff --git a/templates/pl/classes.tmpl b/templates/pl/classes.tmpl new file mode 100644 index 0000000..1d8c766 --- /dev/null +++ b/templates/pl/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nazwa kolejki : Nazwa kolejki }OpisPołożenieMembersStan
{printer_name}{printer_info}{printer_location}{?member_uris=?Brak:{member_uris}}{printer_state=3?Idle:{printer_state=4?Przetwarzanie:Wstrzymane}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/pl/command.tmpl b/templates/pl/command.tmpl new file mode 100644 index 0000000..9a87439 --- /dev/null +++ b/templates/pl/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} On {printer_name}

+ +

{job_state>5?:Busy Indicator }Printer command job +{job_state=3?pending:{job_state=4?held: +{job_state=5?processing:{job_state=6?stopped: +{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/pl/edit-config.tmpl b/templates/pl/edit-config.tmpl new file mode 100644 index 0000000..3688ee2 --- /dev/null +++ b/templates/pl/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Modyfikowanie pliku konfiguracji

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/pl/error-op.tmpl b/templates/pl/error-op.tmpl new file mode 100644 index 0000000..b9e5f71 --- /dev/null +++ b/templates/pl/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Błąd

+ +

Błąd:

+ +
Nieznana operacja "{op}"!
+ +
diff --git a/templates/pl/error.tmpl b/templates/pl/error.tmpl new file mode 100644 index 0000000..f999293 --- /dev/null +++ b/templates/pl/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Błąd

+ +

{?message?{message}:Błąd:}

+ +
{error}
+ +
diff --git a/templates/pl/header.tmpl.in b/templates/pl/header.tmpl.in new file mode 100644 index 0000000..ca1774b --- /dev/null +++ b/templates/pl/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/pl/option-conflict.tmpl b/templates/pl/option-conflict.tmpl new file mode 100644 index 0000000..708ba4c --- /dev/null +++ b/templates/pl/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Błąd: następujące opcje są w konflikcie ze sobą:

+ + + +

Proszę zmienić jedną lub więcej opcji, aby rozwiązać konflikt.

diff --git a/templates/pl/option-header.tmpl b/templates/pl/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/pl/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Strona domowa    Administracja    Klasy    Pomoc online    Zadania    Drukarki  
 
diff --git a/templates/pl/help-header.tmpl b/templates/pl/help-header.tmpl new file mode 100644 index 0000000..98b2167 --- /dev/null +++ b/templates/pl/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Wyszukaj w +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}: + +

+ +
+ + + + +{QUERY?

Wyniki wyszukiwania w {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}\:

+{QTEXT?:} +:

Nie znaleziono.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Pomoc online

+ +

To jest interfejs pomocy online CUPS. Należy podać wyszukiwane słowa +powyżej lub kliknąć jeden z odnośników do dokumentacji, aby wyświetlić +informacje o pomocy online.

+ +

Nowi użytkownicy CUPS powinni przeczytać stronę "Przegląd CUPS". Zaawansowani użytkownicy +powinni przeczytać stronę "Co nowego w CUPS +1.4".

+ +

Strona domowa CUPS także +dostarcza wiele zasobów, w tym fora dyskusyjne użytkowników, odpowiedzi +na najczęściej zadawane pytania oraz formularz do wysyłania raportów +błędów i próśb o nowe funkcje.

} diff --git a/templates/pl/help-printable.tmpl b/templates/pl/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/pl/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/pl/help-trailer.tmpl b/templates/pl/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/pl/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/pl/job-cancel.tmpl b/templates/pl/job-cancel.tmpl new file mode 100644 index 0000000..bcfffcf --- /dev/null +++ b/templates/pl/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Anulowanie zadania {job_id}

+ +

Zadanie {job_id} zostało anulowane. + +

diff --git a/templates/pl/job-hold.tmpl b/templates/pl/job-hold.tmpl new file mode 100644 index 0000000..8827d9e --- /dev/null +++ b/templates/pl/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Wstrzymywanie zadania {job_id}

+ +

Drukowanie zadania {job_id} zostało wstrzymane. + +

diff --git a/templates/pl/job-move.tmpl b/templates/pl/job-move.tmpl new file mode 100644 index 0000000..bd77bee --- /dev/null +++ b/templates/pl/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Przenoszenie zadanie {job_id}:Przenoszenie wszystkich zadań}

+ + + + + + + + + + +
Nowe miejsce docelowe: + +
+ +
+ +
diff --git a/templates/pl/job-moved.tmpl b/templates/pl/job-moved.tmpl new file mode 100644 index 0000000..bd3db76 --- /dev/null +++ b/templates/pl/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Przenoszenie zadania {job_id}:Przenoszenie wszystkich zadań}

+ +

{job_id?Zadanie {job_id}:Wszystkie zadania} zostało przeniesione do +{job_printer_name}.

+ +
diff --git a/templates/pl/job-release.tmpl b/templates/pl/job-release.tmpl new file mode 100644 index 0000000..09bffda --- /dev/null +++ b/templates/pl/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Zwalnianie zadania {job_id}

+ +

Drukowanie zadania {job_id} zostało zwolnione. + +

diff --git a/templates/pl/job-restart.tmpl b/templates/pl/job-restart.tmpl new file mode 100644 index 0000000..6edf8b2 --- /dev/null +++ b/templates/pl/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Ponowne drukowanie zadania {job_id}

+ +

Zadanie {job_id} zostało ponownie uruchomione. + +

diff --git a/templates/pl/jobs-header.tmpl b/templates/pl/jobs-header.tmpl new file mode 100644 index 0000000..ea8718d --- /dev/null +++ b/templates/pl/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Brak zadań:Wyświetlanie {#job_id} z {total} {?which_jobs=?aktywnych:{which_jobs=all?:zakończonych}} zadań{total=1?:s}}.

diff --git a/templates/pl/jobs.tmpl b/templates/pl/jobs.tmpl new file mode 100644 index 0000000..665bdff --- /dev/null +++ b/templates/pl/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? Identyfikator : Identyfikator }NazwaUżytkownikRozmiarStronyStanKontrola
{job_printer_name}-{job_id} {?job_name=?Unknown:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Unknown:{?job_media_sheets_completed}} {job_state=3?oczekiwanie od
{time_at_creation}:{job_state=4?wstrzymane od
{time_at_creation}: +{job_state=5?przetwarzanie od
{time_at_processing}:{job_state=6?zatrzymano: +{job_state=7?anulowano o
{time_at_completed}:{job_state=8?przerwano:zakończono o
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/pl/list-available-printers.tmpl b/templates/pl/list-available-printers.tmpl new file mode 100644 index 0000000..aad6a49 --- /dev/null +++ b/templates/pl/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Dostępne drukarki

+ +{#device_uri=0?

Nie znaleziono drukarek.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/pl/modify-class.tmpl b/templates/pl/modify-class.tmpl new file mode 100644 index 0000000..b8a2130 --- /dev/null +++ b/templates/pl/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Modyfikowanie klasy {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Opis:
Położenie:
Członkowie: + +
+ +
+
diff --git a/templates/pl/modify-printer.tmpl b/templates/pl/modify-printer.tmpl new file mode 100644 index 0000000..a63f478 --- /dev/null +++ b/templates/pl/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Modyfikowanie {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Połączenie:{device_uri}
Współdzielenie: +Share This Printer
+ +
+
diff --git a/templates/pl/norestart.tmpl b/templates/pl/norestart.tmpl new file mode 100644 index 0000000..d29b0f4 --- /dev/null +++ b/templates/pl/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Zmienianie ustawień

+ +

Serwer nie został ponownie uruchomiony, ponieważ nie wprowadzono żadnych zmian do +konfiguracji...

+ +
diff --git a/templates/pl/option-boolean.tmpl b/templates/pl/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/pl/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/pl/option-pickmany.tmpl b/templates/pl/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/pl/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/pl/option-pickone.tmpl b/templates/pl/option-pickone.tmpl new file mode 100644 index 0000000..598fe10 --- /dev/null +++ b/templates/pl/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/pl/option-trailer.tmpl b/templates/pl/option-trailer.tmpl new file mode 100644 index 0000000..21eec56 --- /dev/null +++ b/templates/pl/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/pl/pager.tmpl b/templates/pl/pager.tmpl new file mode 100644 index 0000000..ce3515e --- /dev/null +++ b/templates/pl/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/pl/printer-accept.tmpl b/templates/pl/printer-accept.tmpl new file mode 100644 index 0000000..6589b60 --- /dev/null +++ b/templates/pl/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Akceptowanie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +akceptują zadania.

+ +
diff --git a/templates/pl/printer-added.tmpl b/templates/pl/printer-added.tmpl new file mode 100644 index 0000000..e217ee4 --- /dev/null +++ b/templates/pl/printer-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Dodawanie drukarki

+ +

Drukarka {printer_name} została +pomyślnie dodana. + +

diff --git a/templates/pl/printer-configured.tmpl b/templates/pl/printer-configured.tmpl new file mode 100644 index 0000000..994ed34 --- /dev/null +++ b/templates/pl/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Ustawianie domyślnych opcji dla {printer_name}

+ +

Domyślne opcje {OP=set-class-options?klasy :drukarki }{printer_name} +zostały pomyślnie ustawione. + +

diff --git a/templates/pl/printer-confirm.tmpl b/templates/pl/printer-confirm.tmpl new file mode 100644 index 0000000..73f8601 --- /dev/null +++ b/templates/pl/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Usuwanie drukarki {printer_name}

+ +

Ostrzeżenie: usunąć drukarkę +{printer_name}?

+ +

+ +
diff --git a/templates/pl/printer-default.tmpl b/templates/pl/printer-default.tmpl new file mode 100644 index 0000000..541de9d --- /dev/null +++ b/templates/pl/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

Ustawianie {is_class?klasy:drukarki} {printer_name} jako domyślnej

+ +

{is_class?Klasa:Drukarka} {printer_name} +została ustawiona jako domyślna drukarka serwera.

+ +
Uwaga: każda domyśla opcja użytkownika ustawiona przez +polecenie lpoptions zostanie zastąpiona tym domyślnym +ustawieniem.
+ +
diff --git a/templates/pl/printer-deleted.tmpl b/templates/pl/printer-deleted.tmpl new file mode 100644 index 0000000..26e170b --- /dev/null +++ b/templates/pl/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Usuwanie drukarki {printer_name}

+ +

Drukarka {printer_name} została pomyślnie usunięta. + +

diff --git a/templates/pl/printer-jobs-header.tmpl b/templates/pl/printer-jobs-header.tmpl new file mode 100644 index 0000000..83dcfbc --- /dev/null +++ b/templates/pl/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Zadania

+
diff --git a/templates/pl/printer-modified.tmpl b/templates/pl/printer-modified.tmpl new file mode 100644 index 0000000..9bf074d --- /dev/null +++ b/templates/pl/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modyfikowanie drukarki {printer_name}

+ +

Drukarka {printer_name} została +pomyślnie zmodyfikowana. + +

diff --git a/templates/pl/printer-purge.tmpl b/templates/pl/printer-purge.tmpl new file mode 100644 index 0000000..0652175 --- /dev/null +++ b/templates/pl/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Czyszczenie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wyczyszczona ze wszystkich zadań.

+ +
diff --git a/templates/pl/printer-reject.tmpl b/templates/pl/printer-reject.tmpl new file mode 100644 index 0000000..038f8ba --- /dev/null +++ b/templates/pl/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Odrzucanie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +nie akceptuje zadań.

+ +
diff --git a/templates/pl/printer-start.tmpl b/templates/pl/printer-start.tmpl new file mode 100644 index 0000000..e291f49 --- /dev/null +++ b/templates/pl/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Wznawianie {is_class?klasy:drukarki} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wznowiona.

+ +
diff --git a/templates/pl/printer-stop.tmpl b/templates/pl/printer-stop.tmpl new file mode 100644 index 0000000..06f94f6 --- /dev/null +++ b/templates/pl/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Wstrzymywanie {is_class?klasy:drukarki} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wstrzymana.

+ +
diff --git a/templates/pl/printer.tmpl b/templates/pl/printer.tmpl new file mode 100644 index 0000000..c62b857 --- /dev/null +++ b/templates/pl/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}}, +{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań}, +{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Opis:{printer_info}
Położenie:{printer_location}
Sterownik:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Połączenie:{device_uri}
Domyślne:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/pl/printers-header.tmpl b/templates/pl/printers-header.tmpl new file mode 100644 index 0000000..6a06c7f --- /dev/null +++ b/templates/pl/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Brak drukarek:Wyświetlanie {#printer_name} z {total} drukarek{total=1?:s}}.

diff --git a/templates/pl/printers.tmpl b/templates/pl/printers.tmpl new file mode 100644 index 0000000..810ecb4 --- /dev/null +++ b/templates/pl/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nazwa kolejki : Nazwa kolejki }OpisPołożenieProducent i modelStan
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/pl/restart.tmpl b/templates/pl/restart.tmpl new file mode 100644 index 0000000..6965e6b --- /dev/null +++ b/templates/pl/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Zmienianie ustawień

+ +

Proszę czekać, trwa ponowne uruchamianie serwera...

+ +
diff --git a/templates/pl/samba-export.tmpl b/templates/pl/samba-export.tmpl new file mode 100644 index 0000000..691a30b --- /dev/null +++ b/templates/pl/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Eksportowanie drukarek do Samby

+ +{error?

Nie można wyeksportować drukarek do Samby\:

+
{error}
+

Proszę zobaczyć plik error_log, aby uzyskać więcej informacji.

: +

Ta strona umożliwia wyeksportowanie drukarek do Samby, aby +klienci Windows mogli mieć do nich dostęp przez ikonę Otoczenie +sieciowe lub Miejsca sieciowe na pulpitach. +Należy wcześniej zainstalować sterowniki drukarki Windows PostScript, +tak jak opisano na stronie podręcznika cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Drukarki: +
+ Wyeksportuj wszystkie drukarki +
Nazwa użytkownika Samby: (wymagana)
Hasło Samby: (wymagane)
+ +
diff --git a/templates/pl/samba-exported.tmpl b/templates/pl/samba-exported.tmpl new file mode 100644 index 0000000..55ba028 --- /dev/null +++ b/templates/pl/samba-exported.tmpl @@ -0,0 +1 @@ +

Pomyślnie wyeksportowano drukarki do Samby.

diff --git a/templates/pl/search.tmpl b/templates/pl/search.tmpl new file mode 100644 index 0000000..0851d85 --- /dev/null +++ b/templates/pl/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Znajdź w +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?klasach:{SECTION=jobs?zadaniach:drukarkach}}}: +

+ +
diff --git a/templates/pl/set-printer-options-header.tmpl b/templates/pl/set-printer-options-header.tmpl new file mode 100644 index 0000000..58e5b85 --- /dev/null +++ b/templates/pl/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Ustawianie domyślnych opcji dla {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/pl/set-printer-options-trailer.tmpl b/templates/pl/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..c1183e1 --- /dev/null +++ b/templates/pl/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/pl/subscription-added.tmpl b/templates/pl/subscription-added.tmpl new file mode 100644 index 0000000..af87082 --- /dev/null +++ b/templates/pl/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskrypcja {subscription_name} została pomyślnie dodana.

+ +
diff --git a/templates/pl/subscription-canceled.tmpl b/templates/pl/subscription-canceled.tmpl new file mode 100644 index 0000000..58ce44c --- /dev/null +++ b/templates/pl/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskrypcja #{notify_subscription_id} została usunięta.

+ +
diff --git a/templates/pl/test-page.tmpl b/templates/pl/test-page.tmpl new file mode 100644 index 0000000..346a6d2 --- /dev/null +++ b/templates/pl/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Drukowanie strony próbnej na {printer_name}

+ +

Wysłano stronę próbną; identyfikator zadania to +{printer_name}-{job_id}.

+ +
diff --git a/templates/pl/trailer.tmpl b/templates/pl/trailer.tmpl new file mode 100644 index 0000000..63c69a7 --- /dev/null +++ b/templates/pl/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS i logo CUPS +są znakami handlowymi Apple Inc. CUPS +copyright 2007-2012 Apple Inc. Wszystkie prawa zastrzeżone. + + + diff --git a/templates/pl/users.tmpl b/templates/pl/users.tmpl new file mode 100644 index 0000000..5cb7549 --- /dev/null +++ b/templates/pl/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Zezwoleni użytkownicy dla {printer_name}

+ + + + + + + + + + +
Użytkownicy: + +
+Pozwól tym użytkownikom drukować +Nie pozwalaj tym użytkownikom drukować +
+ +
+ +
+
diff --git a/templates/printer-accept.tmpl b/templates/printer-accept.tmpl new file mode 100644 index 0000000..3e987ce --- /dev/null +++ b/templates/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Accept Jobs On {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +is now accepting jobs.

+ +
diff --git a/templates/printer-added.tmpl b/templates/printer-added.tmpl new file mode 100644 index 0000000..9a6e798 --- /dev/null +++ b/templates/printer-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Add Printer

+ +

Printer {printer_name} has been added +successfully. + +

diff --git a/templates/printer-configured.tmpl b/templates/printer-configured.tmpl new file mode 100644 index 0000000..6f8104e --- /dev/null +++ b/templates/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Set Default Options for {printer_name}

+ +

{OP=set-class-options?Class :Printer }{printer_name} +default options have been set successfully. + +

diff --git a/templates/printer-confirm.tmpl b/templates/printer-confirm.tmpl new file mode 100644 index 0000000..fce9e34 --- /dev/null +++ b/templates/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Delete Printer {printer_name}

+ +

Warning: Are you sure you want to delete printer +{printer_name}?

+ +

+ +
diff --git a/templates/printer-default.tmpl b/templates/printer-default.tmpl new file mode 100644 index 0000000..72a7b5e --- /dev/null +++ b/templates/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

Set {is_class?Class:Printer} {printer_name} As Default

+ +

{is_class?Class:Printer} {printer_name} +has been made the default printer on the server.

+ +
Note: Any user default that has been set via +the lpoptions command will override this default +setting.
+ +
diff --git a/templates/printer-deleted.tmpl b/templates/printer-deleted.tmpl new file mode 100644 index 0000000..d8a31ae --- /dev/null +++ b/templates/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Delete Printer {printer_name}

+ +

Printer {printer_name} has been deleted successfully. + +

diff --git a/templates/printer-jobs-header.tmpl b/templates/printer-jobs-header.tmpl new file mode 100644 index 0000000..ba46f10 --- /dev/null +++ b/templates/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Jobs

+
diff --git a/templates/printer-modified.tmpl b/templates/printer-modified.tmpl new file mode 100644 index 0000000..b61e8e3 --- /dev/null +++ b/templates/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modify Printer {printer_name}

+ +

Printer {printer_name} has been +modified successfully. + +

\ No newline at end of file diff --git a/templates/printer-purge.tmpl b/templates/printer-purge.tmpl new file mode 100644 index 0000000..8cf7c14 --- /dev/null +++ b/templates/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Purge Jobs On {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +has been purged of all jobs.

+ +
\ No newline at end of file diff --git a/templates/printer-reject.tmpl b/templates/printer-reject.tmpl new file mode 100644 index 0000000..5f1c791 --- /dev/null +++ b/templates/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Reject Jobs On {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +is no longer accepting jobs.

+ +
diff --git a/templates/printer-start.tmpl b/templates/printer-start.tmpl new file mode 100644 index 0000000..3eaed13 --- /dev/null +++ b/templates/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Resume {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +has been resumed.

+ +
\ No newline at end of file diff --git a/templates/printer-stop.tmpl b/templates/printer-stop.tmpl new file mode 100644 index 0000000..b74e871 --- /dev/null +++ b/templates/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Pause {is_class?Class:Printer} {printer_name}

+ +

{is_class?Class:Printer} {printer_name} +has been paused.

+ +
\ No newline at end of file diff --git a/templates/printer.tmpl b/templates/printer.tmpl new file mode 100644 index 0000000..78fc08b --- /dev/null +++ b/templates/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?Idle:{printer_state=4?Processing:Paused}}, +{printer_is_accepting_jobs=0?Rejecting Jobs:Accepting Jobs}, +{server_is_sharing_printers=0?Not:{printer_is_shared=0?Not:}} Shared{default_name={printer_name}?, Server Default:})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Description:{printer_info}
Location:{printer_location}
Driver:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Connection:{device_uri}
Defaults:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
\ No newline at end of file diff --git a/templates/printers-header.tmpl b/templates/printers-header.tmpl new file mode 100644 index 0000000..5196be1 --- /dev/null +++ b/templates/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?No printers:Showing {#printer_name} of {total} printer{total=1?:s}}.

diff --git a/templates/printers.tmpl b/templates/printers.tmpl new file mode 100644 index 0000000..e0a3228 --- /dev/null +++ b/templates/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Queue Name : Queue Name }DescriptionLocationMake and ModelStatus
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Idle:{printer_state=4?Processing:Paused}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/restart.tmpl b/templates/restart.tmpl new file mode 100644 index 0000000..bdfca87 --- /dev/null +++ b/templates/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Change Settings

+ +

Please stand by while the server restarts...

+ +
diff --git a/templates/ru/Makefile b/templates/ru/Makefile new file mode 100644 index 0000000..4a80de1 --- /dev/null +++ b/templates/ru/Makefile @@ -0,0 +1,201 @@ +# +# "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $" +# +# Template makefile for CUPS. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1993-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + +# +# Template files... +# + +FILES = \ + add-class.tmpl \ + add-printer.tmpl \ + add-rss-subscription.tmpl \ + admin.tmpl \ + choose-device.tmpl \ + choose-make.tmpl \ + choose-model.tmpl \ + choose-serial.tmpl \ + choose-uri.tmpl \ + class.tmpl \ + class-added.tmpl \ + class-confirm.tmpl \ + class-deleted.tmpl \ + class-jobs-header.tmpl \ + class-modified.tmpl \ + classes.tmpl \ + classes-header.tmpl \ + command.tmpl \ + edit-config.tmpl \ + error.tmpl \ + error-op.tmpl \ + header.tmpl \ + help-header.tmpl \ + help-trailer.tmpl \ + help-printable.tmpl \ + job-cancel.tmpl \ + job-hold.tmpl \ + job-move.tmpl \ + job-moved.tmpl \ + job-release.tmpl \ + job-restart.tmpl \ + jobs.tmpl \ + jobs-header.tmpl \ + list-available-printers.tmpl \ + modify-class.tmpl \ + modify-printer.tmpl \ + norestart.tmpl \ + option-boolean.tmpl \ + option-conflict.tmpl \ + option-header.tmpl \ + option-pickmany.tmpl \ + option-pickone.tmpl \ + option-trailer.tmpl \ + pager.tmpl \ + printer.tmpl \ + printer-accept.tmpl \ + printer-added.tmpl \ + printer-configured.tmpl \ + printer-confirm.tmpl \ + printer-default.tmpl \ + printer-deleted.tmpl \ + printer-jobs-header.tmpl \ + printer-modified.tmpl \ + printer-purge.tmpl \ + printer-reject.tmpl \ + printer-start.tmpl \ + printer-stop.tmpl \ + printers.tmpl \ + printers-header.tmpl \ + restart.tmpl \ + samba-export.tmpl \ + samba-exported.tmpl \ + search.tmpl \ + set-printer-options-header.tmpl \ + set-printer-options-trailer.tmpl \ + subscription-added.tmpl \ + subscription-canceled.tmpl \ + test-page.tmpl \ + trailer.tmpl \ + users.tmpl + + +# +# Make everything... +# + +all: + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all config and object files... +# + +clean: + + +# +# Dummy depend... +# + +depend: + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: $(INSTALL_LANGUAGES) + $(INSTALL_DIR) -m 755 $(DATADIR)/templates + for file in $(FILES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/templates; \ + done + +install-languages: + for lang in $(LANGUAGES); do \ + if test -d $$lang; then \ + $(INSTALL_DIR) -m 755 $(DATADIR)/templates/$$lang; \ + for file in $(FILES); do \ + $(INSTALL_DATA) $$lang/$$file $(DATADIR)/templates/$$lang 2>/dev/null || true; \ + done \ + fi \ + done + + + +# +# Install programs... +# + +install-exec: + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Uninstall files... +# + +uninstall: $(UNINSTALL_LANGUAGES) + for file in $(FILES); do \ + $(RM) $(DATADIR)/templates/$$file; \ + done + -$(RMDIR) $(DATADIR)/templates + +uninstall-languages: + for lang in $(LANGUAGES); do \ + for file in $(FILES); do \ + $(RM) $(DATADIR)/templates/$$lang/$$file; \ + done \ + $(RMDIR) $(DATADIR)/templates/$$lang; \ + done + + +# +# End of "$Id: Makefile 9771 2011-05-12 05:21:56Z mike $". +# diff --git a/templates/ru/add-class.tmpl b/templates/ru/add-class.tmpl new file mode 100644 index 0000000..41a7f98 --- /dev/null +++ b/templates/ru/add-class.tmpl @@ -0,0 +1,40 @@ +
+ +

Новая группа

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + +
Название:
+(может содержать любые символы кроме «/», «#» и пробела)
Описание:
+(расширенное описание группы, например, «Дуплексный принтер»)
Расположение:
+(местоположение группы, например, «Кабинет 55»)
Состав группы: + +
+ +
+
diff --git a/templates/ru/add-printer.tmpl b/templates/ru/add-printer.tmpl new file mode 100644 index 0000000..2d04018 --- /dev/null +++ b/templates/ru/add-printer.tmpl @@ -0,0 +1,47 @@ +
+ +

Добавление принтера

+ +
+ + + + + + +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Название:
+(может содержать любые символы кроме «/», «#» и пробела)
Описание:
+(расширенное описание принтера, например, «HP LaserJet с дуплексной печатью»)
Расположение:
+(местоположение принтера, например, «Кабинет 55»)
Подключение:{device_uri}
Совместный доступ: +Разрешить совместный доступ к этому принтеру
+ +
+
\ No newline at end of file diff --git a/templates/ru/add-rss-subscription.tmpl b/templates/ru/add-rss-subscription.tmpl new file mode 100644 index 0000000..6ff4ff2 --- /dev/null +++ b/templates/ru/add-rss-subscription.tmpl @@ -0,0 +1,44 @@ +
+ + + +

Добавление подписки по RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Название:
+(может содержать любые символы кроме «/», «#» и пробела)
Очередь:
События:Новое задание
+Задание напечатано
+Задание остановлено
+Изменены параметров задания
    ÐžÑ‡ÐµÑ€ÐµÐ´ÑŒ остановлена
+Очередь добавлена
+Очередь изменена
+Очередь удалена
    Ð¡ÐµÑ€Ð²ÐµÑ€ запущен
+Сервер остановлен
+Сервер перезапущен
+Проверка безопасности сервера
Количество событий в ленте:
+ +
diff --git a/templates/ru/admin.tmpl b/templates/ru/admin.tmpl new file mode 100644 index 0000000..22d9de0 --- /dev/null +++ b/templates/ru/admin.tmpl @@ -0,0 +1,110 @@ + + +
+ +

Принтеры

+ +

+

+
+
+{have_samba?
:} +

+ +

Группы

+ +

+

+
+

+ +

Задания

+ +

+

+

+ +
          + +

Сервер

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ + +{ADVANCEDSETTINGS?

Параметры сервера\:

+ +

Дополнительные параметры
+ + + Показать принтеры, использующиеся в других системах
+        ÐŸÑ€Ð¾Ñ‚околы\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Разрешить совместный доступ к принтерам, подключенным к этой системе
+        ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ðµ количество клиентов\: +
+        ÐŸÑ€Ð¾Ñ‚околы\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Разрешить печать из Интернета
+         Анонсировать веб-интерфейс
+ Разрешить удаленное администрирование
+{have_gssapi? Разрешить аунтентификацию Kerberos (FAQ)
:} + Разрешить пользователям отменять любое задание (не только их собственное)
+ Вести журнал заданий
+        ÐšÐ¾Ð»Ð¸Ñ‡ÐµÑÑ‚во заданий\: +
+         Сохранять содержимое заданий
+Сохранять отладочную информацию в журнале
+        ÐœÐ°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¹ размер журнала ошибок\: +

+ +:

Параметры сервера:

+ +

Дополнительные параметры
+ + Показать принтеры, использующиеся в других системах
+ Разрешить совместный доступ к принтерам, подключенным к этой системе
+         Разрешить печать из Интернета
+ Разрешить удаленное администрирование
+{have_gssapi? Разрешить аунтентификацию Kerberos (FAQ)
:} + Разрешить пользователям отменять любое задание (не только их собственное)
+ Сохранять отладочную информацию в журнале

+ +} +

+ +
} + +
+ +
+ +

Подписка по RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
НазваниеСобытияОчередь
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Все очереди}
:} diff --git a/templates/ru/choose-device.tmpl b/templates/ru/choose-device.tmpl new file mode 100644 index 0000000..3df36db --- /dev/null +++ b/templates/ru/choose-device.tmpl @@ -0,0 +1,54 @@ +
+ +

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

+ +{CUPS_GET_DEVICES_DONE?:

Поиск принтеров...

} + +
+ + +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Текущее подключение: +{current_device_uri}
Локальные принтеры: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Обнаруженные сетевые принтеры: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Другие сетевые принтеры: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
\ No newline at end of file diff --git a/templates/ru/choose-make.tmpl b/templates/ru/choose-make.tmpl new file mode 100644 index 0000000..a87d6bf --- /dev/null +++ b/templates/ru/choose-make.tmpl @@ -0,0 +1,64 @@ +
+ +

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

+ +
+ + +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Название:{printer_name}
Описание:{printer_info}
Расположение:{printer_location}
Подключение:{device_uri}
Совместный доступ: +{?printer_is_shared=?Нет совместного доступа:{?printer_is_shared=0?Нет совместного доступа:Разрешен совместный доступ}} к этому принтеру
Создать: + +
 
или использовать файл PPD:
+ +
+
\ No newline at end of file diff --git a/templates/ru/choose-model.tmpl b/templates/ru/choose-model.tmpl new file mode 100644 index 0000000..9d434f1 --- /dev/null +++ b/templates/ru/choose-model.tmpl @@ -0,0 +1,59 @@ +
+ +

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

+ +
+ + +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Название:{printer_name}
Описание:{printer_info}
Расположение:{printer_location}
Подключение:{device_uri}
Совместный доступ: +{?printer_is_shared=?Нет совместного доступа:{?printer_is_shared=0?Нет совместного доступа:Разрешен совместный доступ}} к этому принтеру
Создать:{PPD_MAKE}
Модель: + +
или использовать файл PPD:
+ +
+
\ No newline at end of file diff --git a/templates/ru/choose-serial.tmpl b/templates/ru/choose-serial.tmpl new file mode 100644 index 0000000..21e4bf8 --- /dev/null +++ b/templates/ru/choose-serial.tmpl @@ -0,0 +1,52 @@ +
+ +

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Подключение:{device_uri}
Скорость передачи:
Печать страниц:
Биты данных:
Управление:
+ +
+
\ No newline at end of file diff --git a/templates/ru/choose-uri.tmpl b/templates/ru/choose-uri.tmpl new file mode 100644 index 0000000..17e5e94 --- /dev/null +++ b/templates/ru/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?Изменение {printer_name}:Добавление принтера}

+ +
+ + +{printer_name?:} + + + + + + + + + + + + + + + +
Подключение:
Примеры: +
+    http://hostname:631/ipp/
+    http://hostname:631/ipp/port1
+
+    ipp://hostname/ipp/
+    ipp://hostname/ipp/port1
+
+    lpd://hostname/queue
+
+    socket://hostname
+    socket://hostname:9100
+
+ +

Смотрите раздел «Сетевые принтеры» для выяснения правильного адреса вашего принтера.

+ +
+ +
+
\ No newline at end of file diff --git a/templates/ru/class-added.tmpl b/templates/ru/class-added.tmpl new file mode 100644 index 0000000..298dfb9 --- /dev/null +++ b/templates/ru/class-added.tmpl @@ -0,0 +1,7 @@ +
+ +

Новая группа

+ +

Группа «{printer_name}» успешно добавлена. + +

diff --git a/templates/ru/class-confirm.tmpl b/templates/ru/class-confirm.tmpl new file mode 100644 index 0000000..5bef5bf --- /dev/null +++ b/templates/ru/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Удаление группы {printer_name}

+ +

Предупреждение: вы действительно хотите удалить группу +«{printer_name}»?

+ +

+ +
diff --git a/templates/ru/class-deleted.tmpl b/templates/ru/class-deleted.tmpl new file mode 100644 index 0000000..0ddd4d5 --- /dev/null +++ b/templates/ru/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Удаление группы {printer_name}

+ +

Группа «{printer_name}» успешно удалена. + +

\ No newline at end of file diff --git a/templates/ru/class-jobs-header.tmpl b/templates/ru/class-jobs-header.tmpl new file mode 100644 index 0000000..8487cbb --- /dev/null +++ b/templates/ru/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Задания

+
diff --git a/templates/ru/class-modified.tmpl b/templates/ru/class-modified.tmpl new file mode 100644 index 0000000..94df570 --- /dev/null +++ b/templates/ru/class-modified.tmpl @@ -0,0 +1,7 @@ +
+ +

Изменение группы {printer_name}

+ +

Группа «{printer_name}» успешно изменена. + +

\ No newline at end of file diff --git a/templates/ru/class.tmpl b/templates/ru/class.tmpl new file mode 100644 index 0000000..47891ce --- /dev/null +++ b/templates/ru/class.tmpl @@ -0,0 +1,44 @@ +
+

{printer_name} +({printer_state=3?в ожидании:{printer_state=4?печать:приостановлен}}, +{printer_is_accepting_jobs=0?не принимает задания:принимает задания}, +{server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}})

+ +
+ + + +
+ +
+ + + + + +
+ + + + + + +
Описание:{printer_info}
Расположение:{printer_location}
Состав:{?member_uris=?Нет принтеров:{member_uris}}
По умолчанию:job-sheets={job_sheets_default} +media={media_default?{media_default}:неизвестный} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/ru/classes-header.tmpl b/templates/ru/classes-header.tmpl new file mode 100644 index 0000000..53b3db3 --- /dev/null +++ b/templates/ru/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Нет групп:Группа {#printer_name} из {total}.

diff --git a/templates/ru/classes.tmpl b/templates/ru/classes.tmpl new file mode 100644 index 0000000..151ccad --- /dev/null +++ b/templates/ru/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Очередь : Очередь }ОписаниеРасположениеСоставСтатус
{printer_name}{printer_info}{printer_location}{?member_uris=?Нет принтеров:{member_uris}}{printer_state=3?В ожидании:{printer_state=4?Печатает:Приостановлена}}{printer_state_message?: {printer_state_message}:}
} diff --git a/templates/ru/command.tmpl b/templates/ru/command.tmpl new file mode 100644 index 0000000..4dc7b4e --- /dev/null +++ b/templates/ru/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} для {printer_name}

+ +

{job_state>5?:Индикатор занятости }Обработка задания +{job_state=3?в очереди:{job_state=4?удерживается: +{job_state=5?обрабатывается:{job_state=6?остановлено: +{job_state=7?отменено:{job_state=8?прервано:завершено}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/ru/edit-config.tmpl b/templates/ru/edit-config.tmpl new file mode 100644 index 0000000..d194059 --- /dev/null +++ b/templates/ru/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Редактирование конфигурационного файла

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/ru/error-op.tmpl b/templates/ru/error-op.tmpl new file mode 100644 index 0000000..29fce86 --- /dev/null +++ b/templates/ru/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} — ошибка

+ +

Ошибка:

+ +
Неизвестная операция «{op}»!
+ +
diff --git a/templates/ru/error.tmpl b/templates/ru/error.tmpl new file mode 100644 index 0000000..9a780b1 --- /dev/null +++ b/templates/ru/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} — ошибка

+ +

{?message?{message}:Ошибка:}

+ +
{error}
+ +
diff --git a/templates/ru/header.tmpl.in b/templates/ru/header.tmpl.in new file mode 100644 index 0000000..4fbdbe0 --- /dev/null +++ b/templates/ru/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} — CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/ru/option-conflict.tmpl b/templates/ru/option-conflict.tmpl new file mode 100644 index 0000000..9497fb7 --- /dev/null +++ b/templates/ru/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Ошибка: следующие параметры конфликтуют:

+ + + +

Измените один или несколько параметров для того, чтобы избежать конфликта.

diff --git a/templates/ru/option-header.tmpl b/templates/ru/option-header.tmpl new file mode 100644 index 0000000..464726a --- /dev/null +++ b/templates/ru/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  ÐÐ°Ñ‡Ð°Ð»Ð¾    ÐÐ´Ð¼Ð¸Ð½Ð¸ÑÑ‚рирование    Ð“руппы    Ð¡Ð¿Ñ€Ð°Ð²ÐºÐ°    Ð—адания    ÐŸÑ€Ð¸Ð½Ñ‚еры  
 
diff --git a/templates/ru/help-header.tmpl b/templates/ru/help-header.tmpl new file mode 100644 index 0000000..6adbae3 --- /dev/null +++ b/templates/ru/help-header.tmpl @@ -0,0 +1,46 @@ +
+
+{TOPIC?:} + +

Поиск +{HELPTITLE?в {HELPTITLE}:{TOPIC?в {TOPIC}:по справке}}: + +

+ +
+ + + + +{QUERY?

Результаты поиска в {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:всей справке}}\:

+{QTEXT?:} +:

Не найдено совпадений.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Справка

+ +

Это справка CUPS. Введите выше слова для поиска в справке и нажмите «Поиск», чтобы показать результаты поиска.

+ +

Если вы пока мало знакомы с CUPS, прочтите раздел «Введение в CUPS». Опытные пользователи +могут обратиться к разделу «Что нового в CUPS 1.4».

+ +

Веб-сайт CUPS содержит большое количество ресурсов для пользователей, включая форум, ответы +на часто задаваемые вопросы и форму для регистрации ошибок и пожеланий.

} diff --git a/templates/ru/help-printable.tmpl b/templates/ru/help-printable.tmpl new file mode 100644 index 0000000..2463c16 --- /dev/null +++ b/templates/ru/help-printable.tmpl @@ -0,0 +1,9 @@ + + + + + {HELPTITLE} + + + + diff --git a/templates/ru/help-trailer.tmpl b/templates/ru/help-trailer.tmpl new file mode 100644 index 0000000..4c1ebed --- /dev/null +++ b/templates/ru/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/ru/job-cancel.tmpl b/templates/ru/job-cancel.tmpl new file mode 100644 index 0000000..cba5644 --- /dev/null +++ b/templates/ru/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Отмена задания {job_id}

+ +

Задание {job_id} отменено. + +

diff --git a/templates/ru/job-hold.tmpl b/templates/ru/job-hold.tmpl new file mode 100644 index 0000000..162e4a4 --- /dev/null +++ b/templates/ru/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Приостановка задания {job_id}

+ +

Задание {job_id} приостановлено. + +

diff --git a/templates/ru/job-move.tmpl b/templates/ru/job-move.tmpl new file mode 100644 index 0000000..598e4db --- /dev/null +++ b/templates/ru/job-move.tmpl @@ -0,0 +1,27 @@ +
+ +
+ + +{job_id?:} + +

{job_id?Перемещение задания {job_id}:Перемещение всех заданий}

+ + + + + + + + + + +
Переместить на принтер: + +
+ +
+ +
diff --git a/templates/ru/job-moved.tmpl b/templates/ru/job-moved.tmpl new file mode 100644 index 0000000..1755491 --- /dev/null +++ b/templates/ru/job-moved.tmpl @@ -0,0 +1,7 @@ +
+ +

{job_id?Перемещение задания {job_id}:Перемещение всех заданий}

+ +

{job_id?Задание {job_id}:Все задания} перемещены на принтер «{job_printer_name}».

+ +
diff --git a/templates/ru/job-release.tmpl b/templates/ru/job-release.tmpl new file mode 100644 index 0000000..876c85b --- /dev/null +++ b/templates/ru/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Разблокирование задания {job_id}

+ +

Задания {job_id} разблокировано. + +

diff --git a/templates/ru/job-restart.tmpl b/templates/ru/job-restart.tmpl new file mode 100644 index 0000000..490fc3a --- /dev/null +++ b/templates/ru/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Перезапуск задания {job_id}

+ +

Задание {job_id} запущено заново. + +

diff --git a/templates/ru/jobs-header.tmpl b/templates/ru/jobs-header.tmpl new file mode 100644 index 0000000..d9ee960 --- /dev/null +++ b/templates/ru/jobs-header.tmpl @@ -0,0 +1,6 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Нет заданий:Задание {#job_id} из {total} {?which_jobs=?активных:{which_jobs=all?:завершенных}}.

+ diff --git a/templates/ru/jobs.tmpl b/templates/ru/jobs.tmpl new file mode 100644 index 0000000..c2226f6 --- /dev/null +++ b/templates/ru/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? Номер : ID }НазваниеПользовательРазмерСтраницСтатусУправление
{job_printer_name}-{job_id} {?job_name=?Неизвестное:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Неизвестно:{?job_media_sheets_completed}} {job_state=3?В очереди
{time_at_creation}:{job_state=4?Приостановлено с
{time_at_creation}: +{job_state=5?Создано
{time_at_processing}:{job_state=6?Остановлено: +{job_state=7?Отменено
{time_at_completed}:{job_state=8?Прервано:Завершено
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/ru/list-available-printers.tmpl b/templates/ru/list-available-printers.tmpl new file mode 100644 index 0000000..1615628 --- /dev/null +++ b/templates/ru/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Доступные принтеры

+ +{#device_uri=0?

Не обнаружено ни одного принтера.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/ru/modify-class.tmpl b/templates/ru/modify-class.tmpl new file mode 100644 index 0000000..a85698a --- /dev/null +++ b/templates/ru/modify-class.tmpl @@ -0,0 +1,34 @@ +
+ +

Изменение группы {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Описание:
Расположение:
Состав группы: + +
+ +
+
\ No newline at end of file diff --git a/templates/ru/modify-printer.tmpl b/templates/ru/modify-printer.tmpl new file mode 100644 index 0000000..6277b5d --- /dev/null +++ b/templates/ru/modify-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Изменение принтера {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Описание:
+(расширенное описание принтера, например, «HP LaserJet с дуплексной печатью»)
Расположение:
+(местоположение принтера, например, «Кабинет 55»)
Подключение:{device_uri}
Совместный доступ: +Разрешить совместный доступ к этому принтеру
+ +
+
diff --git a/templates/ru/norestart.tmpl b/templates/ru/norestart.tmpl new file mode 100644 index 0000000..0b74c03 --- /dev/null +++ b/templates/ru/norestart.tmpl @@ -0,0 +1,7 @@ +
+ +

Применение изменений

+ +

Сервер не был перезапущен, поскольку не произошло изменений в конфигурации...

+ +
diff --git a/templates/ru/option-boolean.tmpl b/templates/ru/option-boolean.tmpl new file mode 100644 index 0000000..e832ee1 --- /dev/null +++ b/templates/ru/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/ru/option-pickmany.tmpl b/templates/ru/option-pickmany.tmpl new file mode 100644 index 0000000..0da75e5 --- /dev/null +++ b/templates/ru/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/ru/option-pickone.tmpl b/templates/ru/option-pickone.tmpl new file mode 100644 index 0000000..49a9929 --- /dev/null +++ b/templates/ru/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/ru/option-trailer.tmpl b/templates/ru/option-trailer.tmpl new file mode 100644 index 0000000..15a3142 --- /dev/null +++ b/templates/ru/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/ru/pager.tmpl b/templates/ru/pager.tmpl new file mode 100644 index 0000000..fb1d2fa --- /dev/null +++ b/templates/ru/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/ru/printer-accept.tmpl b/templates/ru/printer-accept.tmpl new file mode 100644 index 0000000..24d100d --- /dev/null +++ b/templates/ru/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Прием заданий {is_class?в группу:на принтер} {printer_name}

+ +

{is_class?Группа:Принтер} {printer_name} +теперь принимает задания.

+ +
diff --git a/templates/ru/printer-added.tmpl b/templates/ru/printer-added.tmpl new file mode 100644 index 0000000..eda0748 --- /dev/null +++ b/templates/ru/printer-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Добавление принтера

+ +

Принтер «{printer_name}» успешно +добавлен. + +

diff --git a/templates/ru/printer-configured.tmpl b/templates/ru/printer-configured.tmpl new file mode 100644 index 0000000..33c4c14 --- /dev/null +++ b/templates/ru/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Настройки по умолчанию для {printer_name}

+ +

{OP=set-class-options?Группа :Принтер }{printer_name} +теперь используют параметры по умолчанию. + +

diff --git a/templates/ru/printer-confirm.tmpl b/templates/ru/printer-confirm.tmpl new file mode 100644 index 0000000..c57356d --- /dev/null +++ b/templates/ru/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Удаление принтера {printer_name}

+ +

Предупреждение: вы действительно хотите удалить принтер +«{printer_name}»?

+ +

+ +
diff --git a/templates/ru/printer-default.tmpl b/templates/ru/printer-default.tmpl new file mode 100644 index 0000000..6297d79 --- /dev/null +++ b/templates/ru/printer-default.tmpl @@ -0,0 +1,12 @@ +
+ +

Установка {is_class?группы:принтера} {printer_name} по умолчанию

+ +

{is_class?Группа:Принтер} {printer_name} +установлены на сервере по умолчанию для новых заданий.

+ +
Примечание: вы можете переопределить это поведение с помощью команды + lpoptions.
+ +
diff --git a/templates/ru/printer-deleted.tmpl b/templates/ru/printer-deleted.tmpl new file mode 100644 index 0000000..97fd8bd --- /dev/null +++ b/templates/ru/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Удаление принтера {printer_name}

+ +

Принтер «{printer_name}» успешно удален. + +

diff --git a/templates/ru/printer-jobs-header.tmpl b/templates/ru/printer-jobs-header.tmpl new file mode 100644 index 0000000..8487cbb --- /dev/null +++ b/templates/ru/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Задания

+
diff --git a/templates/ru/printer-modified.tmpl b/templates/ru/printer-modified.tmpl new file mode 100644 index 0000000..be27e5e --- /dev/null +++ b/templates/ru/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Изменение принтера {printer_name}

+ +

Параметры принтера «{printer_name}» успешно +изменены. + +

\ No newline at end of file diff --git a/templates/ru/printer-purge.tmpl b/templates/ru/printer-purge.tmpl new file mode 100644 index 0000000..44fda0d --- /dev/null +++ b/templates/ru/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Очистка всех заданий для {is_class?группы:принтера} {printer_name}

+ +

Все задания для {is_class?группы:принтера} «{printer_name}» +очищены.

+ +
diff --git a/templates/ru/printer-reject.tmpl b/templates/ru/printer-reject.tmpl new file mode 100644 index 0000000..488203c --- /dev/null +++ b/templates/ru/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Отмена заданий для {is_class?группы:принтера} {printer_name}

+ +

{is_class?Группа:Принтер} «{printer_name}» +больше не принимает задания.

+ +
diff --git a/templates/ru/printer-start.tmpl b/templates/ru/printer-start.tmpl new file mode 100644 index 0000000..69ffa7e --- /dev/null +++ b/templates/ru/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Возобновить работу {is_class?группы:принтера} {printer_name}

+ +

{is_class?Группа:Принтер} «{printer_name}» +теперь принимают задания.

+ +
diff --git a/templates/ru/printer-stop.tmpl b/templates/ru/printer-stop.tmpl new file mode 100644 index 0000000..3fecd1e --- /dev/null +++ b/templates/ru/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Приостановить {is_class?группу:принтер} {printer_name}

+ +

{is_class?Группа:Принтер} «{printer_name}» +{is_class?была приостановлена:был приостановлен}.

+ +
diff --git a/templates/ru/printer.tmpl b/templates/ru/printer.tmpl new file mode 100644 index 0000000..5128d00 --- /dev/null +++ b/templates/ru/printer.tmpl @@ -0,0 +1,47 @@ +
+ +

{printer_name} +({printer_state=3?в ожидании:{printer_state=4?печать:приостановлен}}, +{printer_is_accepting_jobs=0?не принимает задания:принимает задания}, +{server_is_sharing_printers=0?нет совместного доступа:{printer_is_shared=0?нет совместного доступа:разрешен совместный доступ}})

+ +
+ + + +
+ +
+ + + + +
+ + + + + + +
Описание:{printer_info}
Расположение:{printer_location}
Драйвер:{printer_make_and_model} ({color_supported=1?цветной:черно-белый}{sides_supported?, дуплексная печать:})
+
Подключение:{device_uri}
По умолчанию:job-sheets={job_sheets_default} +media={media_default?{media_default}:неизвестный} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/ru/printers-header.tmpl b/templates/ru/printers-header.tmpl new file mode 100644 index 0000000..8662459 --- /dev/null +++ b/templates/ru/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Нет принтеров:Принтер {#printer_name} из {total}.

diff --git a/templates/ru/printers.tmpl b/templates/ru/printers.tmpl new file mode 100644 index 0000000..6946586 --- /dev/null +++ b/templates/ru/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Очередь : Очередь }ОписаниеРасположениеДрайверСтатус
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?В ожидании:{printer_state=4?Печатает:Приостановлен}}{printer_state_message?: {printer_state_message}:}
} diff --git a/templates/ru/restart.tmpl b/templates/ru/restart.tmpl new file mode 100644 index 0000000..1b8132d --- /dev/null +++ b/templates/ru/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Применение изменений параметров

+ +

Дождитесь перезагрузки сервера...

+ +
diff --git a/templates/ru/samba-export.tmpl b/templates/ru/samba-export.tmpl new file mode 100644 index 0000000..22a3acb --- /dev/null +++ b/templates/ru/samba-export.tmpl @@ -0,0 +1,54 @@ + + +
+ + + +

Экспорт принтеров в Samba

+ +{error?

Невозможно экспортировать принтеры в Samba\:

+
{error}
+

Посмотрите файл «error_log».

: +

Эта страница позволяет добавить принтеры в Samba так, чтобы +клиенты Windows могли получить доступ к ним через значок Сетевое окружение на их +рабочем столе. Вы должны установить на Windows драйвер принтера PostScript +как описано на странице руководства cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Принтеры: +
+ Экспортировать все принтеры +
Имя пользователя Samba: (обязательный параметр)
Пароль Samba: (обязательный параметр)
+ +
diff --git a/templates/ru/samba-exported.tmpl b/templates/ru/samba-exported.tmpl new file mode 100644 index 0000000..179b2ad --- /dev/null +++ b/templates/ru/samba-exported.tmpl @@ -0,0 +1 @@ +

Принтеры успешно экспортированы в Samba.

diff --git a/templates/ru/search.tmpl b/templates/ru/search.tmpl new file mode 100644 index 0000000..6426659 --- /dev/null +++ b/templates/ru/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Поиск +{SEARCH_DEST?на {SEARCH_DEST}:{SECTION=classes?группы:{SECTION=jobs?задания:принтера}}}: +

+ +
diff --git a/templates/ru/set-printer-options-header.tmpl b/templates/ru/set-printer-options-header.tmpl new file mode 100644 index 0000000..e5c79dd --- /dev/null +++ b/templates/ru/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Установить параметры по умолчанию для {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/ru/set-printer-options-trailer.tmpl b/templates/ru/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/ru/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/ru/subscription-added.tmpl b/templates/ru/subscription-added.tmpl new file mode 100644 index 0000000..6727217 --- /dev/null +++ b/templates/ru/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Подписка «{subscription_name}» была успешно добавлена.

+ +
diff --git a/templates/ru/subscription-canceled.tmpl b/templates/ru/subscription-canceled.tmpl new file mode 100644 index 0000000..205f993 --- /dev/null +++ b/templates/ru/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Подписка «#{notify_subscription_id}» была отменена.

+ +
diff --git a/templates/ru/test-page.tmpl b/templates/ru/test-page.tmpl new file mode 100644 index 0000000..7330b80 --- /dev/null +++ b/templates/ru/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Печать пробной страницы на {printer_name}

+ +

Пробная страница отправлена на печать. Номер задания « +{printer_name}-{job_id}».

+ +
diff --git a/templates/ru/trailer.tmpl b/templates/ru/trailer.tmpl new file mode 100644 index 0000000..b8bd468 --- /dev/null +++ b/templates/ru/trailer.tmpl @@ -0,0 +1,6 @@ + +  +CUPS а также логотип CUPS являются зарегистрированными торговыми марками Apple Inc. Авторские права на CUPS принадлежат (2007-2012) компании Apple Inc. Все права защищены. + + + diff --git a/templates/ru/users.tmpl b/templates/ru/users.tmpl new file mode 100644 index 0000000..c5b3575 --- /dev/null +++ b/templates/ru/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Доступ пользователей на {printer_name}

+ + + + + + + + + + +
Пользователи: + +
+Разрешить этим пользователям печать +Запретить этим пользователям печать +
+ +
+ +
+
diff --git a/templates/samba-export.tmpl b/templates/samba-export.tmpl new file mode 100644 index 0000000..6515a4d --- /dev/null +++ b/templates/samba-export.tmpl @@ -0,0 +1,55 @@ + + +
+ + + +

Export Printers to Samba

+ +{error?

Unable to export printers to Samba\:

+
{error}
+

Consult the error_log file for more information.

: +

This page allows you to export printers to Samba so that +Windows clients can access them through the Network +Neighborhood or Network Places icons on their +desktop. You must previously install the Windows PostScript +printer drivers as described in the cupsaddsmb(8) man page.

} + + + + + + + + + + + + + + + + + + +
Printers: +
+ Export All Printers +
Samba Username: (required)
Samba Password: (required)
+ +
diff --git a/templates/samba-exported.tmpl b/templates/samba-exported.tmpl new file mode 100644 index 0000000..6fa8eb4 --- /dev/null +++ b/templates/samba-exported.tmpl @@ -0,0 +1 @@ +

Printers exported to samba successfully.

diff --git a/templates/search.tmpl b/templates/search.tmpl new file mode 100644 index 0000000..755269e --- /dev/null +++ b/templates/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Search in +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?Classes:{SECTION=jobs?Jobs:Printers}}}: +

+ +
diff --git a/templates/set-printer-options-header.tmpl b/templates/set-printer-options-header.tmpl new file mode 100644 index 0000000..3e7db46 --- /dev/null +++ b/templates/set-printer-options-header.tmpl @@ -0,0 +1,26 @@ +
+ +

Set Default Options for {printer_name}

+ +
+ + + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/set-printer-options-trailer.tmpl b/templates/set-printer-options-trailer.tmpl new file mode 100644 index 0000000..11adc70 --- /dev/null +++ b/templates/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/subscription-added.tmpl b/templates/subscription-added.tmpl new file mode 100644 index 0000000..c288b36 --- /dev/null +++ b/templates/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Subscription {subscription_name} has been added successfully.

+ +
diff --git a/templates/subscription-canceled.tmpl b/templates/subscription-canceled.tmpl new file mode 100644 index 0000000..86f2c10 --- /dev/null +++ b/templates/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Subscription #{notify_subscription_id} has been canceled.

+ +
diff --git a/templates/test-page.tmpl b/templates/test-page.tmpl new file mode 100644 index 0000000..59e314a --- /dev/null +++ b/templates/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Print Test Page On {printer_name}

+ +

Test page sent; job ID is +{printer_name}-{job_id}.

+ +
diff --git a/templates/trailer.tmpl b/templates/trailer.tmpl new file mode 100644 index 0000000..123a197 --- /dev/null +++ b/templates/trailer.tmpl @@ -0,0 +1,8 @@ + +  +CUPS and the CUPS logo are trademarks of +Apple Inc. CUPS is copyright 2007-2012 Apple +Inc. All rights reserved. + + + diff --git a/templates/users.tmpl b/templates/users.tmpl new file mode 100644 index 0000000..0889f3f --- /dev/null +++ b/templates/users.tmpl @@ -0,0 +1,30 @@ +
+ +
+ + + +{IS_CLASS?:} + +

Allowed Users For {printer_name}

+ + + + + + + + + + +
Users: + +
+Allow these users to print +Prevent these users from printing +
+ +
+ +
+
diff --git a/test/4.1-requests.test b/test/4.1-requests.test new file mode 100644 index 0000000..e2eb79c --- /dev/null +++ b/test/4.1-requests.test @@ -0,0 +1,159 @@ +# +# "$Id: 4.1-requests.test 9084 2010-04-07 06:54:31Z mike $" +# +# Verify that the server requires the following attributes: +# +# attributes-charset +# attributes-natural-language +# printer-uri/job-uri +# +{ + # The name of the test... + NAME "No Attributes" + + # The operation to use + OPERATION get-jobs + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Charset Attribute" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Language Attribute" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR language attributes-natural-language en + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Language + Charset Attributes" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR language attributes-natural-language en + ATTR charset attributes-charset utf-8 + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Charset + Language Attributes" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Charset + Language + Printer URI Attributes" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Charset + Language + Job URI Attributes" + + # The operation to use + OPERATION get-jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri job-uri $scheme://$hostname:$port/jobs + + # What statuses are OK? + STATUS client-error-bad-request + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Bad IPP Version" + + # The operation to use + OPERATION get-jobs + + # The version number to use + VERSION 0.0 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri ipp://localhost/printers + + # What statuses are OK? + STATUS server-error-version-not-supported +} +# +# End of "$Id: 4.1-requests.test 9084 2010-04-07 06:54:31Z mike $" +# diff --git a/test/4.2-cups-printer-ops.test b/test/4.2-cups-printer-ops.test new file mode 100644 index 0000000..5fa828e --- /dev/null +++ b/test/4.2-cups-printer-ops.test @@ -0,0 +1,327 @@ +# +# "$Id: 4.2-cups-printer-ops.test 9084 2010-04-07 06:54:31Z mike $" +# +# Verify that the CUPS printer operations work. +# +{ + # The name of the test... + NAME "Add Printer Test1" + + # The operation to use + OPERATION cups-add-printer + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + FILE testhp.ppd + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Verify Printer Test1 Added" + + # The operation to use + OPERATION get-printer-attributes + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Delete Printer Test1" + + # The operation to use + OPERATION cups-delete-printer + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Verify Printer Test1 Deleted" + + # The operation to use + OPERATION get-printer-attributes + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS client-error-not-found + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Subscribe to Printer Events" + + # The operation to use + OPERATION Create-Printer-Subscription + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/ + ATTR name requesting-user-name $user + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:// + ATTR keyword notify-events printer-added,printer-modified,printer-deleted + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT notify-subscription-id +} +{ + # The name of the test... + NAME "Add Printer Test2" + + # The operation to use + OPERATION cups-add-printer + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test2 + + FILE testhp.ppd + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Verify Printer Test2 Added" + + # The operation to use + OPERATION get-printer-attributes + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test2 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Modify Printer Test2" + + # The operation to use + OPERATION cups-add-printer + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test2 + + GROUP printer + ATTR uri device-uri file:/tmp/Test2 + ATTR enum printer-state 3 + ATTR boolean printer-is-accepting-jobs true + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Re-Add Printer Test1" + + # The operation to use + OPERATION cups-add-printer + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + GROUP printer + ATTR uri device-uri file:/tmp/Test1 + ATTR enum printer-state 3 + ATTR boolean printer-is-accepting-jobs true + + FILE testps.ppd + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Verify Printer Test1 Re-Added" + + # The operation to use + OPERATION get-printer-attributes + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Get Default Printer with no default set" + + # The operation to use + OPERATION cups-get-default + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + + # What statuses are OK? + STATUS client-error-not-found + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Set Default Printer to Test1" + + # The operation to use + OPERATION cups-set-default + RESOURCE /admin/ + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Get Default Printer" + + # The operation to use + OPERATION cups-get-default + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT printer-name + EXPECT printer-uri-supported +} +{ + # The name of the test... + NAME "Get IPP/2.x Attributes for Printer Test1" + + # The operation to use + OPERATION get-printer-attributes + RESOURCE / + + # The IPP version to use + VERSION 2.0 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT media-col-default +} + +# +# End of "$Id: 4.2-cups-printer-ops.test 9084 2010-04-07 06:54:31Z mike $" +# diff --git a/test/4.3-job-ops.test b/test/4.3-job-ops.test new file mode 100644 index 0000000..e82de18 --- /dev/null +++ b/test/4.3-job-ops.test @@ -0,0 +1,330 @@ +# +# "$Id: 4.3-job-ops.test 9084 2010-04-07 06:54:31Z mike $" +# +# Verify that the IPP job operations work. +# +{ + # The name of the test... + NAME "Print PostScript Job with bad job-sheets value to Test1" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + ATTR name job-sheets "none\,none" + + FILE testfile.ps + + # What statuses are OK? + STATUS client-error-bad-request +} +{ + # The name of the test... + NAME "Print PostScript Job to Test1" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + FILE testfile.ps + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id +} +{ + # The name of the test... + NAME "Get Job Attributes" + + # The operation to use + OPERATION get-job-attributes + RESOURCE /jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR integer job-id $job-id + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id + EXPECT job-uri + EXPECT job-state +} +{ + # The name of the test... + NAME "Print JPEG Job to Test2" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test2 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test2 + ATTR name requesting-user-name $user + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:/// + + FILE testfile.jpg + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id + EXPECT notify-subscription-id +} +{ + # The name of the test... + NAME "Get Job Attributes" + + # The operation to use + OPERATION get-job-attributes + RESOURCE /jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test2 + ATTR integer job-id $job-id + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id + EXPECT job-uri + EXPECT job-state +} +{ + # The name of the test... + NAME "Print Text Job to Test1" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + FILE testfile.txt + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id +} +{ + # The name of the test... + NAME "Print PDF Job to Test1" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + GROUP job + ATTR keyword job-hold-until weekend + + FILE testfile.pdf + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id +} +{ + # The name of the test... + NAME "Hold Job on Test1" + + # The operation to use + OPERATION hold-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Release Job on Test1" + + # The operation to use + OPERATION release-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Print Held Image Job to Test1" + + # The operation to use + OPERATION print-job + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + GROUP job + ATTR keyword job-hold-until indefinite + + FILE testfile.jpg + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-id +} +{ + # The name of the test... + NAME "Cancel Job" + + # The operation to use + OPERATION cancel-job + RESOURCE /jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri job-uri $method://$hostname:$port/jobs/$job-id + ATTR name requesting-user-name $user + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Get Job List on Test1" + + # The operation to use + OPERATION get-jobs + RESOURCE /printers/Test1 + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $method://$hostname:$port/printers/Test1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT !job-printer-uri +} +{ + # The name of the test... + NAME "Get All Jobs" + + # The operation to use + OPERATION get-jobs + RESOURCE /jobs + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/ + ATTR keyword requested-attributes all + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT job-uri + EXPECT job-id + EXPECT job-state + EXPECT job-printer-uri +} + +# +# End of "$Id: 4.3-job-ops.test 9084 2010-04-07 06:54:31Z mike $" +# diff --git a/test/4.4-subscription-ops.test b/test/4.4-subscription-ops.test new file mode 100644 index 0000000..720add8 --- /dev/null +++ b/test/4.4-subscription-ops.test @@ -0,0 +1,153 @@ +# +# "$Id: 4.4-subscription-ops.test 9352 2010-11-06 04:55:26Z mike $" +# +# Verify that the CUPS subscription operations work. +# +{ + # The name of the test... + NAME "Add Printer Subscription w/Lease" + + # The operation to use + OPERATION Create-Printer-Subscription + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:// + ATTR keyword notify-events printer-state-changed + ATTR integer notify-lease-duration 5 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT notify-subscription-id + DISPLAY notify-subscription-id +} +{ + # The name of the test... + NAME "Verify Subscription Expiration" + + # Delay test for 7 seconds to allow lease to expire... + DELAY 7 + + # The operation to use + OPERATION Get-Subscription-Attributes + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 + ATTR integer notify-subscription-id $notify-subscription-id + ATTR name requesting-user-name $user + + # What statuses are OK? + STATUS client-error-not-found + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} +{ + # The name of the test... + NAME "Add 2 Printer Subscriptions w/Lease" + + # The operation to use + OPERATION Create-Printer-Subscription + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:// + ATTR keyword notify-events printer-state-changed + ATTR integer notify-lease-duration 5 + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:// + ATTR keyword notify-events printer-config-changed + ATTR integer notify-lease-duration 5 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT notify-subscription-id + DISPLAY notify-subscription-id +} +{ + # The name of the test... + NAME "List Printer Subscriptions" + + # The operation to use + OPERATION Get-Subscriptions + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language + EXPECT notify-subscription-id + DISPLAY notify-subscription-id + EXPECT notify-printer-uri + DISPLAY notify-printer-uri + EXPECT notify-events + DISPLAY notify-events +} +{ + # The name of the test... + NAME "Check MaxSubscriptions limits" + + # The operation to use + OPERATION Create-Printer-Subscription + RESOURCE / + + # The attributes to send + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $scheme://$hostname:$port/printers/Test1 + ATTR name requesting-user-name $user + + GROUP subscription + ATTR uri notify-recipient-uri testnotify:// + ATTR keyword notify-events printer-state-changed + ATTR integer notify-lease-duration 5 + + # What statuses are OK? + STATUS client-error-too-many-subscriptions + + # What attributes do we expect? + EXPECT attributes-charset + EXPECT attributes-natural-language +} + +# +# End of "$Id: 4.4-subscription-ops.test 9352 2010-11-06 04:55:26Z mike $" +# diff --git a/test/5.1-lpadmin.sh b/test/5.1-lpadmin.sh new file mode 100644 index 0000000..f169961 --- /dev/null +++ b/test/5.1-lpadmin.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# +# "$Id: 5.1-lpadmin.sh 8266 2009-01-19 23:10:15Z mike $" +# +# Test the lpadmin command. +# +# Copyright 2007-2009 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "Add Printer Test" +echo "" +echo " lpadmin -p Test3 -v file:/dev/null -E -m drv:///sample.drv/deskjet.ppd" +../systemv/lpadmin -p Test3 -v file:/dev/null -E -m drv:///sample.drv/deskjet.ppd 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Modify Printer Test" +echo "" +echo " lpadmin -p Test3 -v file:/tmp/Test3 -o PageSize=A4" +../systemv/lpadmin -p Test3 -v file:/tmp/Test3 -o PageSize=A4 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Delete Printer Test" +echo "" +echo " lpadmin -x Test3" +../systemv/lpadmin -x Test3 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.1-lpadmin.sh 8266 2009-01-19 23:10:15Z mike $". +# diff --git a/test/5.2-lpc.sh b/test/5.2-lpc.sh new file mode 100644 index 0000000..b690805 --- /dev/null +++ b/test/5.2-lpc.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# +# "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $" +# +# Test the lpc command. +# +# Copyright 2007 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPC Test" +echo "" +echo " lpc status" +../berkeley/lpc status 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.2-lpc.sh 6649 2007-07-11 21:46:42Z mike $". +# diff --git a/test/5.3-lpq.sh b/test/5.3-lpq.sh new file mode 100644 index 0000000..05f66a9 --- /dev/null +++ b/test/5.3-lpq.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# +# "$Id: 5.3-lpq.sh 8144 2008-11-19 19:23:12Z mike $" +# +# Test the lpq command. +# +# Copyright 2007 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPQ Test" +echo "" +echo " lpq -P Test1" +../berkeley/lpq -P Test1 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.3-lpq.sh 8144 2008-11-19 19:23:12Z mike $". +# diff --git a/test/5.4-lpstat.sh b/test/5.4-lpstat.sh new file mode 100644 index 0000000..a5e9f44 --- /dev/null +++ b/test/5.4-lpstat.sh @@ -0,0 +1,44 @@ +#!/bin/sh +# +# "$Id: 5.4-lpstat.sh 8498 2009-04-13 17:03:15Z mike $" +# +# Test the lpstat command. +# +# Copyright 2007-2009 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPSTAT Test" +sleep 10 +echo "" +echo " lpstat -t" +../systemv/lpstat -t 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPSTAT Test" +echo "" +echo " lpstat -H" +server="`../systemv/lpstat -H 2>&1`" +if test $? != 0 -o "x$server" != xlocalhost:8631; then + echo " FAILED ($server)" + exit 1 +else + echo " PASSED ($server)" +fi +echo "" + +# +# End of "$Id: 5.4-lpstat.sh 8498 2009-04-13 17:03:15Z mike $". +# diff --git a/test/5.5-lp.sh b/test/5.5-lp.sh new file mode 100644 index 0000000..942d11b --- /dev/null +++ b/test/5.5-lp.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# +# "$Id: 5.5-lp.sh 10090 2011-10-25 22:39:56Z mike $" +# +# Test the lp command. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LP Default Test" +echo "" +echo " lp testfile.pdf" +../systemv/lp testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LP Destination Test" +echo "" +echo " lp -d Test2 testfile.jpg" +../systemv/lp -d Test2 testfile.jpg 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LP Options Test" +echo "" +echo " lp -d Test1 -P 1-4 -o job-sheets=classified,classified testfile.pdf" +../systemv/lp -d Test1 -P 1-4 -o job-sheets=classified,classified testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LP Flood Test ($1 times in parallel)" +echo "" +echo " lp -d Test1 testfile.jpg" +echo " lp -d Test2 testfile.jpg" +i=0 +while test $i -lt $1; do + j=1 + while test $j -le $2; do + ../systemv/lp -d test-$j testfile.jpg 2>&1 + j=`expr $j + 1` + done + + ../systemv/lp -d Test1 testfile.jpg 2>&1 & + ../systemv/lp -d Test2 testfile.jpg 2>&1 & + lppid=$! + + i=`expr $i + 1` +done +wait $lppid +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +./waitjobs.sh + +# +# End of "$Id: 5.5-lp.sh 10090 2011-10-25 22:39:56Z mike $". +# diff --git a/test/5.6-lpr.sh b/test/5.6-lpr.sh new file mode 100644 index 0000000..b49e5dc --- /dev/null +++ b/test/5.6-lpr.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# +# "$Id: 5.6-lpr.sh 10090 2011-10-25 22:39:56Z mike $" +# +# Test the lpr command. +# +# Copyright 2007-2011 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPR Default Test" +echo "" +echo " lpr testfile.pdf" +../berkeley/lpr testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPR Destination Test" +echo "" +echo " lpr -P Test2 testfile.jpg" +../berkeley/lpr -P Test2 testfile.jpg 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPR Options Test" +echo "" +echo " lpr -P Test1 -o number-up=4 -o job-sheets=standard,none testfile.pdf" +../berkeley/lpr -P Test1 -o number-up=4 -o job-sheets=standard,none testfile.pdf 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPR Flood Test ($1 times in parallel)" +echo "" +echo " lpr -P Test1 testfile.jpg" +echo " lpr -P Test2 testfile.jpg" +i=0 +while test $i -lt $1; do + j=1 + while test $j -le $2; do + ../berkeley/lpr -P test-$j testfile.jpg 2>&1 + j=`expr $j + 1` + done + + ../berkeley/lpr -P Test1 testfile.jpg 2>&1 & + ../berkeley/lpr -P Test2 testfile.jpg 2>&1 & + lprpid=$! + + i=`expr $i + 1` +done +wait $lppid +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +./waitjobs.sh + +# +# End of "$Id: 5.6-lpr.sh 10090 2011-10-25 22:39:56Z mike $". +# diff --git a/test/5.7-lprm.sh b/test/5.7-lprm.sh new file mode 100644 index 0000000..bcb7211 --- /dev/null +++ b/test/5.7-lprm.sh @@ -0,0 +1,47 @@ +#!/bin/sh +# +# "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $" +# +# Test the lprm command. +# +# Copyright 2007 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPRM Current Test" +echo "" +echo " lpr -o job-hold-until=indefinite testfile.jpg" +../berkeley/lpr -o job-hold-until=indefinite testfile.jpg 2>&1 +echo " lprm" +../berkeley/lprm 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPRM Destination Test" +echo "" +echo " lpr -P Test1 -o job-hold-until=indefinite testfile.jpg" +../berkeley/lpr -P Test1 -o job-hold-until=indefinite testfile.jpg 2>&1 +echo " lprm Test1" +../berkeley/lprm Test1 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.7-lprm.sh 7409 2008-03-29 00:26:03Z mike $". +# diff --git a/test/5.8-cancel.sh b/test/5.8-cancel.sh new file mode 100644 index 0000000..7cf31b0 --- /dev/null +++ b/test/5.8-cancel.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# +# "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $" +# +# Test the cancel command. +# +# Copyright 2007-2008 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "Cancel Destination Test" +echo "" +echo " lp -d Test1 -o job-hold-until=indefinite testfile.jpg" +../systemv/lp -d Test1 -o job-hold-until=indefinite testfile.jpg 2>&1 +echo " cancel Test1" +../systemv/cancel Test1 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "Cancel All Test" +echo "" +echo " cancel -a" +../systemv/cancel -a 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.8-cancel.sh 7409 2008-03-29 00:26:03Z mike $". +# diff --git a/test/5.9-lpinfo.sh b/test/5.9-lpinfo.sh new file mode 100644 index 0000000..1902aeb --- /dev/null +++ b/test/5.9-lpinfo.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# +# "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $" +# +# Test the lpinfo command. +# +# Copyright 2007-2008 by Apple Inc. +# Copyright 1997-2005 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +echo "LPINFO Devices Test" +echo "" +echo " lpinfo -v" +../systemv/lpinfo -v 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPINFO Drivers Test" +echo "" +echo " lpinfo -m" +../systemv/lpinfo -m 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +echo "LPINFO Drivers Test" +echo "" +echo " lpinfo -m | grep -q sample.drv" +../systemv/lpinfo -m | grep -q sample.drv 2>&1 +if test $? != 0; then + echo " FAILED" + exit 1 +else + echo " PASSED" +fi +echo "" + +# +# End of "$Id: 5.9-lpinfo.sh 7711 2008-07-02 04:39:27Z mike $". +# diff --git a/test/Dependencies b/test/Dependencies new file mode 100644 index 0000000..3289144 --- /dev/null +++ b/test/Dependencies @@ -0,0 +1,20 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. + +ippserver.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +ippserver.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h +ippserver.o: ../cups/array.h ../cups/language.h ../cups/string-private.h +ippserver.o: ../config.h ../cups/debug-private.h ../cups/versioning.h +ippserver.o: ../cups/ppd-private.h ../cups/ppd.h ../cups/cups.h +ippserver.o: ../cups/pwg-private.h ../cups/http-private.h ../cups/http.h +ippserver.o: ../cups/md5-private.h ../cups/ipp-private.h ../cups/ipp.h +ippserver.o: ../cups/language-private.h ../cups/transcode.h +ippserver.o: ../cups/thread-private.h +ipptool.o: ../cups/cups-private.h ../cups/cups.h ../cups/file.h +ipptool.o: ../cups/versioning.h ../cups/ipp.h ../cups/http.h ../cups/array.h +ipptool.o: ../cups/language.h ../cups/string-private.h ../config.h +ipptool.o: ../cups/debug-private.h ../cups/versioning.h ../cups/ppd-private.h +ipptool.o: ../cups/ppd.h ../cups/cups.h ../cups/pwg-private.h +ipptool.o: ../cups/http-private.h ../cups/http.h ../cups/md5-private.h +ipptool.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/language-private.h +ipptool.o: ../cups/transcode.h ../cups/thread-private.h +ipptool.o: ../cups/file-private.h ../cups/cups-private.h diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..0acc0b4 --- /dev/null +++ b/test/Makefile @@ -0,0 +1,205 @@ +# +# "$Id: Makefile 10317 2012-03-01 00:05:55Z mike $" +# +# IPP test makefile for CUPS. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 1997-2006 by Easy Software Products, all rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +include ../Makedefs + + +# +# Sample test files. +# + +DATAFILES = \ + color.jpg \ + document-a4.pdf \ + document-a4.ps \ + document-letter.pdf \ + document-letter.ps \ + gray.jpg \ + onepage-a4.pdf \ + onepage-a4.ps \ + onepage-letter.pdf \ + onepage-letter.ps \ + testfile.jpg \ + testfile.pdf \ + testfile.ps \ + testfile.txt +TESTFILES = \ + create-printer-subscription.test \ + get-completed-jobs.test \ + get-jobs.test \ + get-printer-attributes.test \ + ipp-1.1.test \ + ipp-2.0.test \ + ipp-2.1.test \ + ipp-2.2.test +OBJS = \ + ippserver.o \ + ipptool.o +TARGETS = \ + ippserver \ + ipptool \ + ipptool-static + + +# +# Make all targets... +# + +all: $(TARGETS) + + +# +# Make library targets... +# + +libs: + + +# +# Make unit tests... +# + +unittests: + + +# +# Clean all object files... +# + +clean: + $(RM) $(TARGETS) $(OBJS) + + +# +# Update dependencies (without system header dependencies...) +# + +depend: + makedepend -Y -I.. -fDependencies $(OBJS:.o=.c) >/dev/null 2>&1 + + +# +# Install all targets... +# + +install: all install-data install-headers install-libs install-exec + + +# +# Install data files... +# + +install-data: + echo Installing sample ipptool files in $(DATADIR)/ipptool... + $(INSTALL_DIR) -m 755 $(DATADIR)/ipptool + for file in $(DATAFILES); do \ + $(INSTALL_COMPDATA) $$file $(DATADIR)/ipptool; \ + done + for file in $(TESTFILES); do \ + $(INSTALL_DATA) $$file $(DATADIR)/ipptool; \ + done + + +# +# Install programs... +# + +install-exec: + echo Installing ipptool in $(BINDIR)... + $(INSTALL_DIR) -m 755 $(BINDIR) + $(INSTALL_BIN) ipptool $(BINDIR) + if test "x$(SYMROOT)" != "x"; then \ + $(INSTALL_DIR) $(SYMROOT); \ + cp ipptool $(SYMROOT); \ + fi + + +# +# Install headers... +# + +install-headers: + + +# +# Install libraries... +# + +install-libs: + + +# +# Unnstall all targets... +# + +uninstall: + echo Uninstalling sample ipptool files from $(DATADIR)/ipptool... + for file in $(DATAFILES); do \ + $(RM) $(DATADIR)/ipptool/$$file; \ + done + for file in $(TESTFILES); do \ + $(RM) $(DATADIR)/ipptool/$$file; \ + done + -$(RMDIR) $(DATADIR)/ipptool + + +# +# ippserver +# + +ippserver: ippserver.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ ippserver.o ../cups/$(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# ippserver-shared +# + +ippserver-shared: ippserver.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ ippserver.o $(LIBS) + + +# +# ipptool +# + +ipptool: ipptool.o ../cups/$(LIBCUPS) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ ipptool.o $(LIBS) + + +# +# ipptool-static +# + +ipptool-static: ipptool.o ../cups/$(LIBCUPSSTATIC) + echo Linking $@... + $(CC) $(LDFLAGS) -o $@ ipptool.o ../cups/$(LIBCUPSSTATIC) \ + $(LIBGSSAPI) $(SSLLIBS) $(DNSSDLIBS) $(COMMONLIBS) $(LIBZ) + + +# +# Dependencies... +# + +include Dependencies + + +# +# End of "$Id: Makefile 10317 2012-03-01 00:05:55Z mike $". +# diff --git a/test/color.jpg b/test/color.jpg new file mode 100644 index 0000000000000000000000000000000000000000..46cbfd78f93cf1e5ae620d318c65c605c16be3f1 GIT binary patch literal 90720 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%0D#6{@>(YEu4G~ zTiC|(w-cN_2IRt01IHyxjUz~G>Q-TS_Y!b!HbLn*x3OaKUZ;ZI+2k4Gw-?sMZvH-> z){GQm(=uRA3UN}ywUWEZ-}CxX{{W;>v4FzNm{T%#O#Ojuxoe%bY;q%;A z&xM(PkGzlM)S11FZZDNkpOUQp!Lwb&;<7el=gm88Xa4|FLLre^h^a{b0CvFRn!YM{ zSy_jYp1P6^BMl;D_(EG;^quyJw!J%1V~SU|SJLds*<&m6Q2l>Kf7C;2Pves0yp%7= z{5(E370ct41E#TfrjX~_hAu~3S%;R_9j0x)VcWa)N=pBJY-$wKR#JXi&t=vb8xkq4pI>%O6+Q9}O0k^to*_sO0W; z+ZgjyYJI$NV0w^Q0+Q9SmBESBa5M_6T;4)pV12x@{au`4Z>Y;Bb-u94H?mUxGV)g5 zIu}(B`0^iY*Y$3H#s|1u{{YzXToZW)9>gVHY)(>4U928tGj#65@@vi>xhmS?^NTu= z4;wXk(~|Tw%Kkn|vv`&O@y6%Wrl&5fKXV$G)bjW3?fd-&)J}!_C>|%0A7F+sScZ^` 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

DEpV_0N+Fft$UwC&(Ro8phhU+677iXyAr14kO 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 literal 0 HcmV?d00001 diff --git a/test/create-job-format.test b/test/create-job-format.test new file mode 100644 index 0000000..87d94a5 --- /dev/null +++ b/test/create-job-format.test @@ -0,0 +1,56 @@ +# Print a test page using create-job + send-document, specifying the +# document format. +{ + # The name of the test... + NAME "Print test page using create-job" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION create-job + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + + GROUP job + ATTR integer copies 1 + + # What statuses are OK? + STATUS ok + STATUS ok-subst + + # What attributes do we expect? + EXPECT job-id + EXPECT job-uri +} +{ + # The name of the test... + NAME "... and send-document" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION send-document + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + ATTR mimetype document-format application/postscript + ATTR boolean last-document true + + FILE ../data/testprint.ps + + # What statuses are OK? + STATUS ok + STATUS ok-subst +} diff --git a/test/create-job-sheets.test b/test/create-job-sheets.test new file mode 100644 index 0000000..d15bb7d --- /dev/null +++ b/test/create-job-sheets.test @@ -0,0 +1,55 @@ +# Test create-job + send-document with job-sheets attribute +{ + # The name of the test... + NAME "Print test page using create-job" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION create-job + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + + GROUP job + ATTR integer copies 1 + ATTR name job-sheets standard + + # What statuses are OK? + STATUS ok + STATUS ok-subst + + # What attributes do we expect? + EXPECT job-id + EXPECT job-uri +} +{ + # The name of the test... + NAME "... and send-document" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION send-document + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + ATTR boolean last-document true + + FILE ../data/testprint.ps + + # What statuses are OK? + STATUS ok + STATUS ok-subst +} diff --git a/test/create-job-timeout.test b/test/create-job-timeout.test new file mode 100644 index 0000000..514924d --- /dev/null +++ b/test/create-job-timeout.test @@ -0,0 +1,54 @@ +# Print a test page using create-job + send-document, but don't send +# last-document = true +{ + # The name of the test... + NAME "Print test page using create-job" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION create-job + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + + GROUP job + ATTR integer copies 1 + ATTR name job-sheets unclassified,unclassified + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT job-id + EXPECT job-uri +} +{ + # The name of the test... + NAME "... and send-document" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION send-document + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + ATTR mimetype document-format application/octet-stream + + FILE ../data/testprint.ps + + # What statuses are OK? + STATUS successful-ok +} diff --git a/test/create-job.test b/test/create-job.test new file mode 100644 index 0000000..61336c6 --- /dev/null +++ b/test/create-job.test @@ -0,0 +1,52 @@ +# Print a test page using create-job + send-document +{ + # The name of the test... + NAME "Print test page using create-job" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION create-job + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR name requesting-user-name $user + + GROUP job + ATTR integer copies 1 + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT job-id + EXPECT job-uri +} +{ + # The name of the test... + NAME "... and send-document" + + # The resource to use for the POST + # RESOURCE /admin + + # The operation to use + OPERATION send-document + + # Attributes, starting in the operation group... + GROUP operation + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + ATTR integer job-id $job-id + ATTR name requesting-user-name $user + ATTR boolean last-document true + + FILE ../data/testprint.ps + + # What statuses are OK? + STATUS successful-ok +} diff --git a/test/create-printer-subscription.test b/test/create-printer-subscription.test new file mode 100644 index 0000000..19f5c85 --- /dev/null +++ b/test/create-printer-subscription.test @@ -0,0 +1,49 @@ +# +# "$Id: create-printer-subscription.test 9084 2010-04-07 06:54:31Z mike $" +# +# Create a printer subscription. +# +# Copyright 2007-2010 by Apple Inc. +# Copyright 2001-2006 by Easy Software Products. All rights reserved. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# +# Usage: +# +# ./ipptool -d recipient=uri printer-uri create-printer-subscription.test +# + + +{ + # The name of the test... + NAME "Create a printer subscription" + + # The operation to use + OPERATION Create-Printer-Subscription + + # The attributes to send + GROUP operation-attributes-tag + ATTR charset attributes-charset utf-8 + ATTR language attributes-natural-language en + ATTR uri printer-uri $uri + + GROUP subscription-attributes-tag + ATTR uri notify-recipient $recipient + ATTR keyword notify-events printer-state-changed + + # What statuses are OK? + STATUS successful-ok + + # What attributes do we expect? + EXPECT notify-subscription-id OF-TYPE integer WITH-VALUE >0 + DISPLAY notify-subscription-id +} + + +# +# End of "$Id: create-printer-subscription.test 9084 2010-04-07 06:54:31Z mike $" +# diff --git a/test/document-a4.pdf b/test/document-a4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bd91ca91e4a30f3fc7034acffb40acd84d80e36a GIT binary patch literal 1062429 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

{UJ$ZIa;zRm>FA=1(y&0iF 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 )_spvC_AHV;bi3w8mSk(u2G9N=F(*6tu%N`p1-u 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�$y_# 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 z z)IAvxpSAT5oJc_lTxqVK&cB1o1*~3Z&dq^O0L{k`Rdy_H($*oX-RtMbfVkE=L7yRPR-4`&*&*|KsSoD~ zco=uD_v`g~zMf;)!vHU#!vFj7;e*J>+9*dh`ejso?lXH1JJ&}{&bW7|k1$n17}cIi z#rq^4TYV-gHZE5e9wEp;45hRXtV>>j&0mi&?GGnNag<%mwf94Y)rgEyMqLC9$3E~o zm_7yLNPUeo-=shdMw1=r-m<6lBnEHK6L69@-~2uV$M{>I(TpG0`XcIjvPQoVg&G%W ztBV=v0=O`^hNN`-*u?YScaAr!h$$o%jmS4ovw6`Y_S)8vdfhn(J)}6L5ITa(IoeU{ zMpZ)P7T^E`J#r>8U2S>D46P#=X(@;Kf4Qk9vzD^>D>m3`57YNC9n%+wh1N0xxr_0j z|I!LC;F1a2Wy^8&8NKv4F;qfBtc(?1=BZ?$75Ej*RKlE7E#%Qq+q zwY1X54IDaN3f{&r!l7D_xsTc>>vtLE95s4k^a5qbFB;>q><;YmH8uOAy1 zyVrFn)OUZKST`>56CAI9uywJSnOr0O^;?$Y=)k*i38g=xKg>Dlmcg2=S2cO*_w%4d zi}Nor;mM#sJDkC`+)?Z)pq7%8cB8Q*DFt6vo_uM{N%`V&3e>Q<~S{rxW{$) zkF&$De{_yQxH_HYp~(PGPnzy~nrmDbP4$wzFGD6hWe-eF-lloetyt*>{E-RXq9JY3 zhH!Y3H@ zLwp#0rc2Tz`{pS2l&UT$GqmRQv!H2Tp|Zir^7%398!!AAuLRc92goDIem4$$kWn_5 z@DpPJLvacV>k}Tk@RLcUu*US)e5TXxxi_-#4)>-F_yJ=;bKmG3rP55lc!t|1Y8|7} z@gZR@H?KYs!KB=eTfttGc4lFy+5ijk;ua6rG~j=b_~*)z@aKC%L$6~;HDN0dkDpkX zxlWGhXkm;bu=hvD)>;1-gB#g^p;;gWMMu)pg#iZN3M(4yY5LRf{79cwFUsTQrNl_qS>G zkrkLp!jbmouhA6X&WP59yu*o}JMsfp1qX%#o~0+7GZdCN*qJ$2@S9s(SaC zFn+iCF87ZjU6~F_V2j1@7VL5lIG|P5r)WX0!`Xj4kwKzQX)WN(-?>pCGegy6fzz%9 z<@PUichtoo^>){ykXvv)_z+olm!B{VB2!&B2ES@_u!O?~e8 z>$T5w&8z1Mp0NFPPh@}2lz)cU`U-}2=FV+CiV)e2Gt-2tD84=KyX+hKx?Ujz^Q>g= zz;)nlz-E%-W->5tNmqTc^Db7GV{22_iMRmO1M?B=wYv6NxO7D4^Fl2wrBFo1bImkhY&`Lr7)Mo0Id!v$-H|0%1brt zccmb&NathvBs6zCg!*YkAp_N=!N#<{04MpSN4i4J(9oBdmR(K}Vy}z? zI7cL93&Kji|2R9##8?-R*H(J)c(b!{+B}SsDY-#FKlJcLHx?;K8dRoj3iWQ8*1apf zW9|7ebd0yi*H2e|X1P>xeMZ*F3irDtYsfXx<@wXE^@W*l!;Bn4v>qT$A+vNF)-SsKTnu2a;46d3Cc+T;~rg&9pY!d|41x|c1#Eks5*6C;VbL5h$RlryF*hVHVfV~bM_P}%(&BFi@Q z=2c>3NA1El;qEYJk*Z72(1cAF%&mj*?S;WX-+}&@ki9a6gbCI0YT5aZaS$`or7r{l z^1RG!qwH99P=&YDSb5lOQZ_CAWq}fF>P`anHsCz{SnCQJJ`~AiMb?sI2NFOlUva50 z5JLs`RB`gK$!_(OKpU@DGDcy7m8y#P(+m6PpI6UL4Qp23n7#AujZCmi1>rsS#p_E2 zmH-3z<6TTa%C7YOjHB8@_XlZ1clK=hn>oB(o9QqG*q1M4N`Uu8ztK2=7EQdz7mt|A zCV*L?et8$j%HEushkF<}*5Vhx=LDAqrQFg|U_{`R@Sh#Da6?x~R0?MF&$UW zTDvU6p^?I5)HAlAj#_H4SAIs$IJsE z(H~%y_?GA3T+cIJiN49!1}RdWv|MfEH6}ol7Qz@dAlk}kJ295LgBe9Es56BB+@lQ% zugJ)oismAlpHz-%y2=6qwJ2=Gc5c#ZsS^DbUm*_buT~j>yhku+>uX}svi!bu-ux$O zK|7vAO&QUX#vftr@@#>k)b?l^63QJ5f60eofB}C*P(Z!*D0- z5)ak66Vp_F3thzKA?Y|8bhcm1*Lce7U~kIL>fpE%4iqQ-;DoZcea>$v(!3b`XtjA? zU@17QURpoonCrMPtBC$z_xW+rB1-MSS*>>-?#Xu&X=U?UhPib}h!_E=95)X=*raiW zlF4?HHiPD*4Ig3*mIYW$SwwymCH(ssJzw`@d570QV)t9H`{%Q`qA~im@fmjOpj^M5 z|Hh|6YL4~OlW04Rz0Z!l>ys*{3{5jLzvPSO+i5B+g_1oT!H`GRiY|{h`-58*SjAgzClgp_OCv)=LYO6mw zc2jr`QEyid`#{=GxBwrMY>5%PEw=h;_wOeA4fx9}WmdzTLkh(dAT8h5Wb%WFoCWHqp2ZL8oEGGXU8+vs8>;%sI}Fl$;bkcq;hI!d*F7ianX5g^h>Fw# zeyw1g8q{a61xr*l0SwF3koomvK?shSx8O$n|JJ&0a-5m$Y+*b+u)A5{dz0lcq| z#uWD$D&jOBE@OVf?9b;vFEas;bh5Kn8G)@bQXJ5&0cpH}?mEF_hU?7QriRuHOC}C9 zp$j;ZRjiW0c+SU+zV; zpC211%l!npQFvWrrk5EPz;RdbDK!E2-?u(LGqxY&%)~z{jKmn1B8Fg?uj1b`5|_yQ zqs|xO#t&H?zUCTKr{#%{_X(Gk9e%j+${gM9Fxtwx`HFE@L+l+FcC z*$YFo-A8^ByjVAwMA;M)woO=efWdhSZL2V>!~^n@#)__!F!{)5(&LlxIWe~#rDjQL zY>1!3S1;@9_LkfztgEY9>?6es9eJ6D%fUT{6%xj!muX*VT#_~Qj8%O>fpH-IMH2J>g{O`O zLSO%90a@3L3VeY`OSsFZ5Y>f>|)@_}g#Ox1)s5%Skac z@(jdN-?3xA@k`?fXcxxWTa|)ST79TL=fWtR!WnSVh1`YuU_3{B?awiR6*u3t8wjjG zw3-)P<;ySFCS_(*#mSY+^x2D;9B=O7@@u=zj6>=q?Dg;}(j!PR@WtHVM7ak_J-^&@YigkW>t6I-=r6~E;=9d}Z{;he9;r!!OFB`}m=x^GEYKYW6$`ZkK zj@e`7V&6wW=-)X2sb|PW^=&t!x@j=Gv~`lzuj?7WYw#xa&bx3U%>g&sX@v>WW4lnU zjm0lB>rBh2l|_S~Oez`owhslKtR##ZypOW(3#|oJ!s>8Alq9y+(J*G{dcRp=^a*B0 zq^x|LY}E_ZuXgQJgTZ&^3H4=iI#0crr`YXb`?~n4p&;vkRIq-m|vy|0yC$4pEcRG>Ptx zDO6m7w<}q){#L3_R(=5Qvs{>+d+N_MZp(3J8B|?eV2^-UL1H26Fi1{_f0&1{xPjY~ zyS}^kURtkVBvJpV&8Z=GKP33}=}a^Jt(go<%M^m+2Zj zA++uW{GI*81=i`v0T%A?h2YnaWj){+(>UqwQl9y!8PI7oD^UN1T*UBT7BRUIF)O$e z{QWUo6ZuS8x=F@`n)shDgH4;+NVrKxpGKgYZ1lgc^SXrydxZ+GsY6Qr_0SJg4x^^O z8%}Mmtc8ZvLypu!12wJtcwR5^7Cp0L<>vmk0Hqedw6p)r z3|kAJXXD|bJ3-AN!T`S*ZCa{sJ1rW~1(9jT*8Y(c$34KlOmQRQ7HRw(_xK|PS+`Vs zVn~jLyHeKH;2aY`Yn%@n>5revKUd$jJVahk1`ebEod zQW$Y3lfR*+rO2USsCxJ~6yy~hd_(AM<)DtRkF`odwcR zJF}v>R}Kyxw`h33(LP>L?BMA!GkAaZ{c6PxeTUb@nO-G1DqDrk`Bgx!oY{AN39Aev z64KT*^!CcPL0^xaau53{`4x-j-hI9X`l`SFpabA$-=nS8|C^Kia2TezJBc1xDf;Pm z${M`J-$8l0d~xzO2gHnz_Pz6fz;akpSVlS|bL?C4a(E8lZ8Uu9Awgah(-uU$PD9iDtTKD~U(@1bQICL~12*dJ zzx@)mzlBXLk3)>{fp=>EduW|?%_&+}k$k_25~+qAKz49&?fjyeE`$6Mn9zkM!%Czi z@z<7(z@r?9J`Bmm$Qc8@Qi8C>zw#-a4V9YP{e{#y4g-O{X+zw9mv0 zPH!*qQozrkoUvBQJdockxh91VY<7VaG4wdWCf+`ZgH9`D zZ?%On$*6tsEyqPH7}WmG+kA*NSAyvbJ&rZ>plP+-^B~dFPXMm}gHxLUXENS2dyC~> z$4a;0=!Dqb`}kTkyzk4@YJu_wRrUq_eDmou;*tqcYFH-=wFKOo0%ZQ4yidLXVw)b? zxNyfpQmQ*Q`W)Gf>IE-;N6Iz}fW6r#gQ^iSWh~JB9#;i?ydp%HcXX?H_rJx`rG1aG zz+`WD4`m8yW=E0??>61(Ml=Id4=%++=wKv|G4E}iPrW=x6KxF8jq_G%Mzr|rFBe9u zs7W$5oHV?*76^1k?!-ZO*qx1tO3*aer;{%Yyi34p6)@}|3;$bjB10+n^bkxpxg(E6 z?;Zvcn-gQ?w^jy;@I$q^4;fjXpSAQxQoTFP(Xsu+33advo2?^LmK*{GRS2Gi1oEI3 zge)I+fh?E1)CPoJ`r)bI!s7qpk~1EnNgh_+@D;DnJkiX7{{8Y|Yk#tU47@F!Mv=p5*-0N1%Vn z8Gf`CLqp!P9|k^%k&mLiWMTEN0~=a0{_N!IH;)I_A-UJZXz*qilhI#Mcndnly?G~L z4B*pViWIwO*UUrxz=IExjNntPjq}>H(3MvQwe+QR75L5H8Y`1#-6Q3#l$tL8PQKT- zKlJUZ3dH}nl#?%>=Ng;j8Nu5H97(n*byd^-t?b-))a&J|K*=z_IWz0$_7%~BK z|NV5hfnS*@rjY14DWP9v1%6C=eJ5~QCGz%XMU@E>HVh&Nvzyjd2kL@5oc0ih!y96A_)Fr9b@mUj3 zUycruZSI99o@5}0QsR88KwK#7f_`w@2X3!}wme2DH_$==mmwFs;ADJgh9F~lO2+eH zPZ~zW3AwlHAMX10=hv?l1hP5>raRV(-t(AKoun2u^cA}`&1QNtLCAmo1CDDTMq!;| zO`9PJO3 zhq?0b7`0CcEZyw(*UcwnbhcJFQ+*_{Ua49f;j~hH?U>Qn{>-KN5t?iwNd9YNn0r;Y zGaz0{JPvZKU=w-8a}lPam8#yIKP=4Q^Hry@X1H+8;_~CH_gghIKVPahk7+E^zs1js z>j>Oe)?QYrk7e5d)FogG`c72CFU&=M-|W;?y#@Qo)KX%WEwZtjc&^-qO>J=}y!s#a z)@w0vMkqmX==IqOa~B*cjkkXH;>#T+ZNd?!S}2Z9YG-MH7*MGuzK;s~G@NlGnWT~Z zY;Im*&ErE%44O%$4>3WjK42HypxnnRsvRYJ$k_eZLWS)vK0kv-ubUJj8ld~Qf1{TB zLou8%t-}#6?E%f^h&c}HD%SUd+QZ?S&7I*D-JUNpcaAsR_TsKY>*4#FJ{HfVs7Y9X z9`tMfPJRjWN?JIvKQFr?ucV_eP|iQ@AF1DcQpf>L!?NJR31$`AHUxhQdxYm+*`y}SONULr?<{Okxbp;MFUc$R^~6_dFRKx;=K?ziQ@t0xda=m$~0H5!1{>?9??jo>2~OMH}T-64?!bLRk|2E+H@|)1y+_JadT$i(=?+B~4A6 zn^_{Uk zShvqN7VmM$vor=3t|#SH=vS_+G38-9gpqq0vnyZ2s1)ohe(2V|)M*q~Y8p_s+PdKm z>E<}oJ`0tC&~tSp5=R;qhg+zw`IxfYgIIhup^u`B)co}19-?2>OzED5oi*3tVq zy%_&z!e1oq!Zx&!biuox{^&G}YWDqf!acmyk}2cRBvm79R@?xEY-ViM)vw}xY(-vR zfRH?f?x4wG_eG#<1@x)Vs(x1M1a0h`jNI0j@>+dNguZFL@tRW3^KnckCQ32SY=KGIoRsy3m&-oZ7Qw?;R zTg~Jlt({XwmktCLbg~n)n(cnNNX;3NP;48`2N{v1xD#sj!vyN`L}34bXA00 zA|FaLs@Gn>jP!YTDFDZ|vk6Lx4s@Gk>?VO`*ghsq73pe0CFj_U!|edkg=t#gST4a$ zHcH(`bs;x_vIjKeQ+Dkqk;x}`U6Fk7EDHV-{IASCzCAiYsjLfb|G zOzRGZ>)k^f;PpphOKX;4>Z%fs&UbUV2VZHgb!3Hz{EL5x%lzu^`1xqDB}e}C8fImc zBjm~s#u8kb5*hgo!q8?SD*_c6Hjx?(^t0?53{`8+4~h8@&{rHMPw9hRJB5O|EN^a9u5D* zei9-a5#J2j2x~T=TL6#mO=o|;e%oCTU+8~}YrOKE3{JsD62$~U`vD$hb2j|r0EIFo z&KsFskcT&IR39Iwrm~>w8kVO8;^&kf9u0(7^wP3OeChf0!NODcu_w0R4FPkf!O^Pv zwsg&$jLFh9yR0+C1ZWLINY26+smmt&shbALdMq zc~Hz)edBYQ1CwdZ8>)9hT<;5Hy<#DfDs)mPG)A)zm6u{vG%aA}rLyP2{S;|Nq|a>_ zu)feE8y|urAYmr*sGPbn_-Jst^U@3WUYGbyS#jf>zo@j7slEZ^V^YC9>|QVO99ddCBzfFe~_dT7mhwvmi^Ur>a)*EBa*$+Q&Im@3)OE_ za4!M;rTIdIYg%;MX#pb+a2h;BsoDhmhuPqePYXWQ+OPd5de(B0hYBb= zV#B^AopisM$BAF;jyN>$;zWTR-aOFAe!0_c1+$y~!DHLW4v_gIf8Xe}^gVZnIYEbQ z7u)uXX3;?}Kr!_F({1b>gjr6gwHyq(u8m zaxM8ebc+A6{<7)x8DCL&&c1*#6?3qYG7#;V(j&r0eUz6bxR$=8C^2P=8%g7X!_Kf- z-l1L|a~{ZUU~7Y9G{A;=Sq{oWrGWq^zC}0EQr0(AjLt%J52n$C3=(#cc#Hkh!v`2u z)8m+tF{Ij$19NN%VIjO?ci!?Si6a3YTu16LS!v(+JyH~}+q!ZZ&|_p_4k83D4~>NW zMC*?Kh>@S9bmebYA`ei{5=av#8e+SX6y)Cp);)g>;D?#1I{w9k>tM(0S=EbR+6(jZT193y~r z)9=MqLA1y~7SO$n1NY{GFptk|i2e9TXVULP_xqQ7`Il}oKxN_vCga4zsBj9nQ2s+? z-~xRZ@yG>t1kw(DfK)-CJxty0$N*ao^foybQn6p5egIeg5yckp!!29=)p289a zbLOs_p&3{V4C69%_>6`8?&3KmL}Y zOEP*1O`!r$56tuGkOL#+E|X>$Ah7s|VR^#o@s5pVA(I|L*@S#@$0n#}`W5{H=R0+o zOjoE+@M-C&ucYCX$2n=H(i`apf1k2D2FF_B?Qe%YSwQ@aB#vYSz<9#CaF>Z}mwvW$ z31}`!|K(o>sA9S>MrO(CRm`bxsJO%+`naXiN}rW2&qf>2a)O? zy`co3NhA);TbeWhug~che~T*SRUaPpQqp3A{r+L*+JeC@e5d1^T8HAz!(r&E_07It zD$hT^iZ{g}gK*hI*DCmqQAP|e?aCl4NBnJx+SiGIun+F8{h|p@r4L-a$ z9eIEc{k~X0&$`4GmC)o>b#&agBGI3wk|m0feH@H$IC`kR!fibk;q~CTtKkd(k1mBB zQ-cvG#Li2f(Q9f3uQW+UJY33%k_}i%5(K@+>6Q4Is(LooCrAM(3EiRJugJ%D1XX3m8!hREP{6Y8vFe zMQCw#zZ1B3bpx`0uk$|Kpi|kA(ak&VAJLS^iO3oREW`O&Bl^|bc-=F8xC zHKo7(;Z#%6d+aa8$5W4BB45R1q|$Z(e=W|WuHOf`lxkftHJ{qt&bKG{Ssre(Jp2Ek zS)%4XcDeLw4zEHP;JJ@m0rqv0DyT_DI_L#VjQ09V(Q{b))%H3LYMh@tLjBRoZc*aJ(q4 zB(MGm^Wo;|h-HnmTgDJ>!Qr%_YAL`!26@d9U(x7tAa_Ppit`=D!$5B$HCeR1J%P~~ zs#VGD<6tDsrIB&$zft_-YAovPV{BP2f@(4=^7b>x{MT(MnpukQaV`o#x$>MRT&4EvtwydG@c-yCl2@MH?= zv1(YJfgIq)er#+M#UD0^*eE_G4jAUmH+^GX1}bAdZ#JpUco9dhB&B^~`{8_pu1$z%FEiI^dC9n7M z<$!f-TW@LyF(-wGlC$5gg%TWGin=I-EqnFG?wg7}&kt7|)61La0;FEL*Qv=H<8-Yc zw67r|2^-GYBo$%4+}B4Yr_O~1s-yaGGk&MW^NItcg_45P2_q&`Eb9^&%}oln6VLH|2rIUX(Y?h+$F|IhjQ%v6{F>bRkP3r%hw7*N^+22On7 zw$Imz^cQFkIzv30P9JtK!PIq0v=%Z!vOFk_IYV}Fl0lx(lK4>5wXct{hE&O(lu!KK z^wIFBX@T6>4ZU+SEj1>W7-l_ei1ZeI9Mnx>-&02}PGx^jQXXba$$k)ZWvra0JB|i^ zV1O(xyWF&ya)NpfEUBW_qf1?h=fPr6JVd(YchVw&o42L*@ng53z*edf173an1F~<-3xLv)t4WdVOx{GG)Ow#M(!K82XacX!5I%B81>S73-SjSI^qnHvab@izeHEB z7piVgzu;*)ncFxX?9age#FL6SdYVEX?Vs*SoNW}@4K4i7G^F?a0bbR7AH~)~-VfgR zpTPMXEJihJ8ZyuhBChF4>g;U+B#bgtlbN_qBl_SG(E=%N0~m|1e~W$9=DM zmbnoH_UE|E-36^~Bg3~rsp^XS5-?!-`=-{k6Yot(7e;vE6I``^h*g~jgN@T27z=04 z=9ZXnjO^I<_cLTZD@k^ArkWCr$v8)iUJ(%gHx9b?#u1ZT^ALxsBRR>QlhU{ZDVbtExk)!Bn2<>(ysYy;b^3 zOYWbJtNH@e$rbHrkuv4c3gugfLy73TAl`mkvg&_AWz1LA;oDaZ%83DO#5OR#Ac$v= zdcGNJ*an>2kuE%;FSxj8a156e5VsPfeEcqfI0E-t}JX&%JShvl6S zq+Pj|g05V)@G9%~*63xEciSBQ#gfWTx|Mhjz^TExF)VxG{TSU#x=zHZd@K}qpIMT6 zNRE!xePR^e4kUhToHzA0b)KE=mMd@^Z>qC6n)>{^bjIx9qjEwh3H?_BDMr}qZbhLU z!CC==1`%b04h{|{;0dSL6=2(b05hu-awvJcV!1hHJ7B3fP&D^p+UoG+kIWm9LNxbE z*JshoJ$>0n%z21wUBJ}L5p!%6%FVa&6_=^s2Sq?A~)AB^}k0+Ukk20h~ok{#WPu4|J$mOAIgE~(Il%g z#Dz(SL;ZCTYLdXaA^KG$8={Q#3~=hBZ^zK?V0K?5I2E$*UE$GVh|+zuK~?9di000X zHUhQNi}u?%K8z7A*_Cjs9q*~!nY<73kQXs45F=G^HJ_sZw%%S{#C#8#0!$V$GOr;K z4@CGZWUp3Q*=ej@<{i!DSt$$a!q~GNfObW;K~K|x{bl4iF4>Z*r27Qylj;H*uKzK< zs;P*nm4oCy8p-|$*t4y(#bc83cC;BYTa^q(Qa$pf**lwt9hQk6~DSBofH#=s<%+E1Fe5*=K*juOm< z^%nR|`_4Cuzd4?eZspu8cMh5YT3+s9&iZ2d_HZYtXV5+h>YLEXWK)YcK#ra0!t!{` zpD7-~XP&!?hF|kl`IdsUf)FyEvM9R2njP2zKiJ_56qhqT-^Wx@nqm8}6Y3;X>XhOo zRL6c&a*CMDXU=56)gDx8sSq=mh?mwWc8KXkTy`x8HjhzOw`~8!Nb&&)(HOh+z)v zK`vweSzXr>Xt#_RD)Mx0gcu)u+~bflymylX=q}6LCGl7F3feP97q`|~U#s-ucT3V2 zKN&{v>6}ecu8I!cQ?jZ*fz4HrN zG;74pTg89EuRK^-o^-}~*xtH*e+Xt!2^t4a@;|SqE=Jt4bT(z!L|lJAtRp;uj=o-a z4XemEFgyJzXyo4N1ee7;OfSvZ5SN;T?kQdEY^#=uLhWF;pgIgbZ8soiQ23!01r#6&!)PQoQ3AvfN7#4z5O*j7jvaYe#Nw+w*^hYTwRIn*!QI zrmii>5ml@!8M$5r{tyzXqLDFd5y?e1n!ldPPEPGc5imbva%Xx>J=Rh#A-e{Q4ho)a zGASlT$Pym6g2>VX;69aa?NN|D3~jsNND z5ApkM`HPFOg;5^4qScdUL7sT_lV%=00)myF2R0LpyTc#-vDAOY<@@#uQ z8E?(K=xx&5A{QpAkZfA#E-9642F^FhZmFfNT-CEq+-lGbK}a3LoY zyc3&D9{V&kXT(PrGq=j)R$(8C)u{+6w6+J8YZ?&Dm1Im%6#W#d_7o?RYXVg`kQG4^ zLLo(M+xim%N{(RatmrGS#m>bE*g`3Nf<4reoXZTsMncNAuIh7#0}HVFKRjM}u`|LE z0^#^PdWjVF<`v$mkKwe-e)I{dNepM3 zatdl40Q>o$HaGgovtsNR)sOrCtl5!ENmdLb%yCylX{aPHkL^2O(>zqeORW8B_&wjG zxwK&Af|a!k5ncyTJ*<$SJ#Dnfx}rPE%m||K~+49$d??1SzU5Gv+2{vf6`*Btp^l- zcPUKj&pyrJJe0yn8(w%(ZuS2X@|bTWZ4Zn}?A|#ajC?=;ctHCY=j6G9`~@_u9X6d) zE5a`uFh9hvv094;pJ~y;PqwmfD>@@C*{628L||D)^$Vu*n&^W zmU6%sK*satWhibHm5l33*a9rx+~OuT1l|2;ZNi1GHl%{F#Xdq8q*;W~=LCB3WHa-! z8N)~pb=}DRmt1?gbO1G&R2NRVMh@2J%}B;EV`T5NBd?RAfS#APqqdqcv7ldTW+-Di zS{bcNeg{B^>Qb|Z)Fk;LKCY$YHVCrS?;p$8AcE#>1o@u2hjMAb+v(ZX7Er|tl+#E7 zhaAH4qvqcWh(-euo+f2iw9G@pNO1Cc#S4u+zP}hhO*;pRn^vrU9#p3!;|d!pBpFHG zR3xU4*86zl1=M8Bm1X(AZ`YeK1^1U_a{n}C7c(E?FDGBIY%VOlK|nE@h4E{$EF<7e zkUeaG{a#3pyCNx>VakK=Ftcsozi{h*DB+P=dv+b8v%*U;`ANhZ8JLM}=LOE$k^lOq zB~4a_y|7Jmn%Vky95iGxzVFIHb-NaY58uAirLkSHPnSZ*%M+s=Xv|rgbg-kPioqj|G1jXMsH`0yEr*nWpFjRzY z6)2C%q10(k2{#w&)|C@(Zjvcf1WE{^Gr>dYdo;J4wHawKqdo7-Gq!zLZtfT3HY{FIqRqKaD$0f<}bh zb~eMm%Jszisk;H7REnyaLa1Hcrz?TEd7@xGoJ2+5(YSi@D9d<7 z;Kw%T$p1_u1@-Lw4jhOD8gG6ei*xSb;6M~G1(kx}sMw)Vr*RTX;*x?C2TX)q0^a5_ zXB19PrWb#sVftlbWg%h>ilZe3o%TO2M*Wqb7|_)sB}0*}-sHUn0;Clw5BE zmV1n(fjbuhpAZX`^m-8syQ77xJak@{g>S2fS(WHZ9A(}LO}KpR$}P%Ix*zw2hu$Hb zOCfAru!G#(|7_U#Q9aDY%h>d+u4eUxwH8LM&KzMW`h{{ae=l0gA1;QXa~i+X8I;kH zr~N!WD}Tff>yv~3ncxd9Qx67o=sy9IRjt0TR<_wQv(sr@ya?Xm567#sp%8l8^XfdQ zR@Iwda>M7Y-T-nh*?E~-Oj;+NMF%Ey3qg8dqwAs;rAybi5RwNw52Z-gNl!q};#-f6 zA~00vPCDv4BfM^V(kyP7RPqKCTLrM=RBEy&O;|Vfb;vUU2yuiTj;~)QTq07Fm`DR%UnF1L*nQttrl{uJrrp>4?Xz7^^l|jjq3P zPVgd(YXS8YhCs+bW%=D(6Y@1X9~ZJwRYxlAy?ZD#{%lbx@kT>(#g%|DW<$HpYe$|Hs`Vt6Dz`gh}w(MPcJiO ziAJ0-(su6rv=nfvEm*g(z1SIk%f_FsQub`PQrSE7CD*CBd|%L#{fV-lV~D@sm2A$O zML;Ef0k?qp=X5#{1e7G!y6XpATw7ubDnuIHN9~!g$&JQ2uBtJ*IEsyA7`_+mK}&@L zQ$Rb=q(zh6@0gt=c_{RV^H+7$fkc7Ew;`eCE((f0j1rQLan?+)pY?uL0(+(F^K{LA zFZD#R;6EQ?%L@|gKc^^-T>7V}y5Z0ydFR6GQ4f-yn~d>F*CqfvPuE>fr@;yS-;bXj zp+6UBNa};4tsr$_SGN)$%yl@Duz{R;zdx|^3{%IqBH#H=f;0QmJ(;# zAq0*ogtN|L%ImC7JFE+z00q);U(C1nMg@?4`uo!bQU8F`qq{11-+z0wxX#RY5Q(s` zLS*~%Br7n#^h=1PP5#4$e0>s!XiiPL0J}vi_J`1u6H2lR6VD!&4P!h=Z-No2Eltv= z1TLvY0E_sjX5?6eo>KA)Xe;ItYqJfCYxp>>s?jbCU$3h&)M8$<|6*^jF%!^^0+JqZ z00juH?c6^@bj4#FseiGn+P8{wImduFMDkTIjeM4>>1=`x;7dOmt5|Ze>zWvZ17l(; zRn&f5;$@Itt}C^d_b@k}?_9C6|F1!GQ84MpU0qc#vuRx?Fa-ypqQ1u$j+uz7$vJnG zE`6|Bt~bm7-cUf6&a+=wwyb@~{POQpmTPCUNtd+OwT$}9FP9H5in+q~?1sHuf2lNB zZdct62N)cg!fE}RX=l8C{w*KP||n^r}mHy3+-5vHU~GMb6Izf((StX z;D*JaPo1aI1cZb;7&H7oimp2z>i>`59cO;+Rg{^%Dn!;|bMfRs3f6ioh&W%f-HY{qv0d?*Ht9Vg z5lpAAfB|_~#u@*KuYa<^57hY%ga8Y;%>{xODIj!HrehVBC!;iO&hfzBjyg?rmWGk1 zleo*Ay;EcQ{JxJ`Se;ljut0}fxw8s72TjP!-ktA@llHTBt5UvIeiHa5egL)VI+02Z z#W`<8sr3-psUf={0Q3ubsp-3($@GTl5N9+qhDg}>}58Ci` z-8>o3dcs=E&v_nGpbQ;TCmf;u;z?Fp?-$V2HA5^30gk?#U9Il_vGdu&?~k@yuGFs% zEx0eY2yW+muz!I^vki9~BUwRcd>ouoZAW`0qQ=nJ8$ZGm^lh&Lg$C`&-)72y(Z^ec0*q6@=NZ8lXe1#J5PhI zrA{Zrej%5?QR0BZhbDwiPuV1JvZ;})37i1j67l7FYI9$dtsjePsZJQqZ}t#4(~-R)~1#^2%FCs*0N4= zugr3ZzWB_vCX_|!k(0Ja%ZZt(JEm|Bw2>KEX-DRYxCciSF z0UAwxt)O8*E*T-?sF}XPDZ0g4?*D}oH+8HFTw|#?g%xtiqn;9KV!$6r8KbkBsrw$F z;MTxx|0RlvyiP&^_LZMwLPzGYQh#ZQ2geh&$r!1<`c)VI`buu`_XNd~Tzk&4d1~Bv z7mn~8zr5#C)%p69GzD$3p{=ePMUYdFE2;29ckLM?&}Ni&zIB-A{bUD7XTkZ**}4Sq z*F#jURebAYmNDUL3Hdis9P^TYpIp7-Xk}9=M^XS~6_9VL>LV_C#r2^6y zyH4rnGhBXe^JS-!4~w1~!9x%qOT^#MtW##z!(&bJ`qIl|6q6tIF<=++*ardkRlv~o z@(~gqfwopFhgFN^f;M@57h#(LoOuD9<4do`hNB3zRKWJmJglB0`A^$7;FaB}3tq&Du#d$;e%&F&ou4@;jQ)%GSfr&`1*Q4CvR-`_Xbe<$f zsIB>i5N`%UvLnq1{+8e3M5559qNmIQxGnc4k!&GCjL!?zZwBB~3#dzTbBXkYY1Pkl ztn97dA%_A+Hh9sSwRk^-T>UCoK!KYQun`nv`2*-2jf7*tBX#^|Sm8jvZ-jMY!@EBK%sOGoibPS(+pVRIn&7yav>X*>e2)7oJ8VlaRM4jJP|38Xyu zG(7p{M_%jJod_HG&Ayz#4~47l0+lf_C9j^jWT}&tHzYRXMOD;URx)Zhv)FG4@QEQoM zL~UyW=*NKnz4cSA!py~QSIcwY6Q`eCQ51@@S>f!7-vdiFgA4C>dhX0MdYwKx+p1sq z{F0fG%0LK;_4!olnzC8u`R87CCyfKQId^ld{#1HCZ+F5eSy5f7?XQSazuvs|ac|AGF z>dp>*a$|Ef1m9OBxBfa)y0(^a3fJds=^mp^4736vk62qXF=+IM{9T%YPfF%<4hzW0a0S5MsJNzd*+GLbr|iwXgU-GX6+P}pi_R4bc&u9iYy4Lj#5n)2u^ zgnYDsFboJbvU{cr`rBoBb|Zu(OMuajVg7MY+s^6DqJo_TW|? zj#oVPrT|#zaAjZK8N|!b0BTNoT=lDL5+6Qh$gXeHMJu9iH2%@+EO3ia?!1ZoPwU}Z zrV;4@MbkwFk7cq|Al{0B2gz-3RPX4T>+Y&jA*t7b%nh{s<>~qYCIXpffJZBW@2L}} z-l{|I168M>-Qb1cT`5RvvEdnke}Bw{Wh6+#dwe8`2h9?qiTNRGhzbY_!T%Qu429%k&9{|cu-c^H{!{tv+~bbAGTXOsU_9cxh< zrVx9UNYeS?*ZZlul7{+rG6h;DtH@oC2fHal|D^+#-*s-T^rq_)hLv$WpfNh^ySe%* zRVHq`0uK0zUknge$u~>hgnAUZW@-kk`|g%e=A+96&yI(F1@su(wUgi*Bbc6Eh{jiM z-rh@fDEfTXZ{*oKUDHoyYWqYu4`a5%Z#kpi(qfr}(0zXYr9p0yBGVIMmWJPNhToAh zwFk4K^R#07L~8}P<1H$Rjbh2LM!lkK=HINZYK?F=yH`|eNCgAtziRKkUG$aH^of!IGP**FmG5u(q6a}z0 zQ)Ai6quj{Yq2wqb_CG2c37MzTx(U=_Hx|WGV^ERmoiN6@#0bF3C%UNk)^}w&r%@{( znj{lrrSto{M6*|lrLUswrpZb=l*H~)^3bnwtt}7Rj%k1AJK+t&JHEK&!12C9+-GZH zAVe_GT+(V4%_Kp`z~ktT(m6#p5^y5D)zqE`1iZ2f2sY{=Do3?^4=hKu;jQD+-`-(F zJ@ES)qnjli!;EL)Q8RthvtaiCsEe(o!Rx3kkOKLzIQ^E0+m?4DkPNNJ!R%WVeKv;1 zgPd{c+{ZjRIq&FATMM2@ye(VIb7LjG&A@_G8+Tmf9{K@MU_?eWQzC>}rp zG_Xd}&Cx^%qXv(O$k|gH9q^$}^PJG^@(hiQf74#hYM%`O{|oD8TiO z=FR4#-AlJ!4JI#igxhcKv&5+R%J`VUoUi^y3-wk(j1}JTGZ?o;m1L_{zz3bIXvxzAt)1HDO$Ha+-W)RM^#~N`3r{vH zPtt*LkxvRO2lZU{U*iw_x76yy&{C-pmY(h_)4A@_le3^0ilP`?TR+UppyKDFWll;AZyT5eJ}(Tz%J}CE%irEvZu^*6 z`pmswN$^Rx%ld~Hu&;lHyt36Zw1mxPAUMb>S*Fw}WRJfi<^w(u?3rk{TmKJE5XMm#`KZ|~6fWW_BChpuYlM2Rv zSOY)ODBVJnU{@AcjoM+FB!HhZY z%e!y>7jHyE0XD_sz$LJSuC3F}5mI0}AO;Jj1`d=FggaSVLtjPS5rS|6wpeA%(S4Gy zs@dkE<&JO&@&-cOhAw`WRaKA9DL@lg#I%yEMq83a`o}1)!shW{m3_sK3kfWTv^&$T zg$}AhlloeDVU)^z@iMr}`D`rbGy3s$23c{SgoytmX-R0^t-P0cZ)^(t*gMGEJ3$sO z4ly~REMxttX}Gri{M;IaG&NP!8n`;2KC^=Mmr?{Z!;3Hwbow{C=4m zEHp1AG5y=`hmBY*q!Spc9U6Ny2%HPzE*?REo^L6H_~%*kSrgbE%4WYxe{**u__Vl|vZ4*u#nay_by()<^tVO#`51&SVv zevHB*rCz@C@ZFrN$YaV+m96DpZ}>KcKzzN~V-dsqK0Np)^H5$k^K3`%vE?G-D3fZi zLlRjf-^jb3>~XslKranq*T-Tl53E|G6u~A;&PiQnCB?5v*2d@6{48gGhT`Lw;PUd} z{o4@a-4?j2$a^S2j7eT3nfR$2A>I#TOw?}h;9G$S)JKttW^)P_&N?~<3QN?4RPbj$ zFm0VRQ4fI+{)nNjDM_0j%8&0aOpcpex|w|K(O<=}3;Zmc@zF;%$6u}9JG=b$)RPdW zJ1m(nf{p-I$ zZ-&q9B2AfKxVV$N=1r}}fzLHsApl%k&$}viLO^uq1^xLa*T4F|SY9~k8ZkOL#*BS& z;7X@*YLx(IzLKSnDjTBO?*WFBiDHW=cw$KAUv6V++yw{T#{BmDAl@UDkKZ{zP{Fffh5wtPFYNn~d?m=>3a)fg5R=_H7&cMcFrlo_6;Ou> zUcqSgVYRbN3l44kTOmj$xz>F^iw>8{f%nm}$A?}?|7pkZ*0q+_fTqo@sadt@fz)J2 z4={b{w@#F(DD&2IusV!Ayr-EEG&){+HB$=K;*QPGJ+{)1ZYb*0;X@4mV0gy|55;r_M1cJKJG zh5VzIP1xp0FD*oyxWIWfzrp(U%YfOIc*^hCJWBn%p{)CR{jtn*T*5{*~PqgMP)ea7XX3U2md2 z@5sILh$Q%a!i!f1cVZ3hG8ZmO@(>@ei4xzvl@i)YN!i(d{=`-#fYW;Pu-x8AyjKMYUUtdyR5}Z41HG1i_%KI~GK5ttwp{X^Z!6x|c@&;+U!P9vO;*#5b zAL|bJ);m6YA#q!GkceJ}pproGuwpcVuEM~M*HE^Je|zT}IH#6lQhT=0ZUaqq&t5kp z?WXgY#5lHqKlpu7Q4TI_PuH)J;n%_M($By&1u8W?WL3r$+IV;F)>%RFZ#Cs_E_v|- zg>vx8eOgEH46^*^7L2d+(+mYVR5t%xqfw}*;R`4EMsk0h5n_ybAl8+hvem2YC8~Zb zWD6p}WQtsG)9BtBC+~f+A{1lMQ^=6a9ofu364H=i5$#Q-70Sy4PTmTz(&g=LTq;Bp_&5(>LS!sl-{-e1gaPLrsf$ zZMK%hD3|EI0sV!+rvialWdk#9VW0YVS10&Sn&Iv+(w_7LD}gSM3; zw=smNmr94uWWKji@2=yYkXUUq@mVyK6X_DzABI<;^x|@f|8$!FT6-_qzj}6G?y%;qpSwkdmkG2=K7^` zS+SK@MRAxJ6}+5;djGsHMn{PK0qlLT!=Eqy9~|>XzPLjh|Bo0fj%(koFdH=60>Y z8%F+}A$or*m*=!JyYQI`$GZb5 zqU4{mpI5b>Bx;i}@77Vdh6J+m6=sSpca!2~ir~~E$wySU$X_9MI715339|R!)0o;6U3ab1EEhNCWss?)D%PCTVjzIr9R~4>U`%9W{5MCIL zhQMch@Jo${&u>2kyfPG@#C~KS6%drB=E=^tvMsu>$-i_cvT$gyk1;$Xd2#gL^ggBG z5vjoeh2a6Y(IL4Y3LyTGLabVJ9w$I)mUO3=YMxD4?mp*2LXq-#^8*?hell+CNJ1uH zP0o(%VPsG5s*3n{c~ti<1Q1c~12)jc9TCVE7#;Fe*LyaL@4g|Hm%pqc3NI&Kv%!#~ zVVQ|&KY`hY3{L4JGdf{!c{!)Rtk+m{psB)d$yPb$MPCokshwkn)Hm*|D=n)%*Njbp zzRO20gZR_FL3E}D@Yjs!Wh>%v0ER^dyPj|R*n#{~EU<0kP{wA}R2kF#9S`o}!IFFjqWG#xCzo_6PQ zI4}EO&(h#_P9b{n>(!Qgw~VA7+tRZjH~F&_s*S+Y&?eXKW*-NU)o|Ji9P${FZhv*r zSP6IrOuv#cART!$sXTQ z+91%T8UH&Xr(}I+4=xT2Ig{Yo-$p{PffPWf?ooz0Hrez~M9rwK0jutTR3b${gj`wBo78}03Z?|lKxzB)nGy}FDjk!}E@VM0v^f^~htxRVmz(QH4;xYGgV=N30> zkW*_wQMl@Nk%;swcpCzPV8y+air|P3rZz9xJrX%|5#4nXws$sLSZ->`d97?Grss1? z^jZ*ure+F{VOLX_0CA*eXAoPcf|tn7l+Hg)s|-`Fz6Z(W*xl0HjHXtw*NN-+s4`?} zE2-s1>`>VAe9MRLeQ7_cs{N?o--3XGh?c}lNG{~_s|H2E2}(^A(7g1Xbr9I%=>)E> zyw1+vrl(KWf)~J{(5*YGDD>>0ds#8hesKac9G{6J#ws^SuQ@=l2~v(fYKzkH9y*qi zCeVrOiwR|9d_Mi-QK>p&8%5a~;fEs_4z=3DGQ~31b zABA6cjuAX^Qe=$mbCR5}gE&&31dL*%b<+|UP3Nu#Y z`zVYX6v=z+wtWBF_Z9tnzo*E?^bGuOe5fTnMZYW)fMGL;W(^mYGw)mmoaGgaOxyz} zISSx`Ye#*Vo2+{8%EP-#`2xvF5q;`Qw$(((h!+wJx=v?WKG?^^FqX1}U%&l4H@l+u zBkP2G9k+4d5Dc8yPanBzBKK;meU8+xH{|@~!zYpLsPv;x!9;`h6 ze!NAqJ0k_h_VJxnXZp>340gD`r)0X-*Z;`|=7^-J@sg0JjUuznVQGt?7bo{jYa7+$ zXSRj@wZKqwiGbr3V@G2D{d}=s#u`0PzZX`dT-C8O=Fhqe*|~0+D{B9;eOhYmWTA6l ztFLA|Swb-xzWhn;*CdtluT;CVvZJ5N(h*t;_GD($GYKNNtLUy3`OwN(`M$xOrAkK0(Pa)Pi5BJNM``iH70Imj=yL!*k?YZ8L^McWOyEL#Kg31inE;LB z?V{Qd!}!W@ZLCfNSRsi02~~=|V};nApty}yz!5)Sk1Y-e;|p!YvF+0*DJ2#uKLr;) zNyl4fK+{)a9(Zrmn&`sz0^kq<)n9q|&@#vb zqt&6{!!t%^fAZL%@LXZG)uTIG0soZR0bepJ8e*r9g19;jaHt~$R3%Iiz0?0?Y1K5F zcbPkf-xa=W1!{kK^}^Dp34j0-cD$&E^vDn3u0WPWy*6=ua^w+KEi8&Z8ZfJLHD69h}Jp2W<+)2QTY6u z_a&`>n@&eTj=W=ya0}$8LfNKE5sjr4wR{3%rl(V%=S$-X##iiG%*!w2Tu3Uk0N& zORX+LsMnBPAxZrmW9c1ZMO+oTTwDf`HYt%dG0J0=$`3$qxt$Q22N4Lij?6~EZqVji zne$y9TwG|LkroP~;aSEW@?)Qv>Oy}v&=5;Ht;2ua>4nMiOj0tVDc@L`Mtpbx&~dXf zuy`@8=2*ax>A$9WOo3Tn;Vm z33lh$p71!8mrlN1b}l^n){EVHFug}yXyl_O>ipw7n~m(APS9fdd7|`D@Pv zy~5NEW)-xB^Eewm$;DMx_L`CWq%^0n$)Iph%>rJaUxLlKy9MXr4x!HC#e zF=e%5PKA_XMDkQq^^%JV8eoo@iP9Fz-wrezY=3${N!6LjV%b<00jo()w0qp zMGV5MXJ+Q~<2txFGR;rKfXfeR+{7$z%wK``9pk;_LPetRHm#Su@bG^R!5o+@WpBt& z>S^^}veiUpJ2K^mUt#y=L;l!7m42TR-&SOaG^4(D#pe*L6t9&PadG1E)oyIC>mbe! zeti_UtW3T{WNm;wc!CR_5X?{CjBGi7k`A617*6+*o34h6)KDOMk14tuC}Zc?-ROiUATOK+NZWow?*c*`pmkCt|GRW}SpH z`>y@`?A+ItC6lx}xMYJ2Tlv#f$RD(SR8B~yS_hZ#%?dg4KDki!2RaZ%r_AoBQo*~I z>96?+Lav`%IuBY#Zj^wNAm`zHR@L%e0i3*?MR3snvfSj+tmvUp47kHH)l6q54*|Tq z-nx<6=TtVTi`^4v*%S%LV+$ri608B9;=_P2mm3t2d}0E{PlS9Xbv;dMbnCQWs+c7D zFD2Ny!HCO)B5J=m@GaHCa)&pc*4JhyBeou~*3%+vB0OwzKdsi@Bon>#`#3A0BMx6v z_r!2T;`jNVjroB5896ZSS2;rxb@*)nZKs6~pZim#&&{j)STdqvCbCm4w2})y-T}RA zQ@9Kv1TLODCwq5Kk3gEaxVuQ2*5FQjUkDIs{qd$?pX(`x4GzetfzI1d{06(P2p>@h zxzqUvJDeMNR0Ecje3gd$UHWV%%;}2O8rq6+hI^JA(kn@93ho0NY%eJjerEC?5^U)Kg*xQ`pD5io?tA@NG$F`D!PJ-%W6< zTTMN6n+jx@-K4>lm9+C2)3G_eN)&lRrWF)G$bJC1ihZ#@E}AzJ4|Xpi3oH+QSS+{u zx_vz}L!HHnot@m@(?fV=$Nerz|84Q~Kp^Xl(T^5(SAkt}&brXE7e(>bj(_PP7g3J7 zXue8_jlgS-{9m^}$$i)ve5EL|`d!D5QEyqcA5G0)jv^EN3Cdv?<|d!Ry#lnZmY8>m zDR+CgCPnM?Tv@Z0LH{K8^s5u4c{E#Z2t7m?7R)UAKJd+@kB;c|)iJjvBK=~M;1tp5 zBaZ<@>$Y)+zSF>66c%yN7X3*K|6&#RCD1cd+p1evjdu4^yUmFV_){y|fFVypHl64X zO-y1Q;GSbZYCy@|AGY}9KOpCi>$f{~7Hcn?*r$*va(1r!pWC)yDLb^2biVo~^@A?5 zhVxxWlpz@mL}nm$|C#TQc>N=}YYt0nPNu5#!nBgmHYhB@XshJP_^&_Rd+~G_nQVto z9A-lyWUt4DeF%YU7wG*awiTGNL6(I$`FqA%6gCcZw1!UGLWBUoDv}F9b5KPJ67VW! zjnXoI-NRpqQ@i=^J?@0v$34EGSi}?U!!Rsmo2cGaHtPFq@+#cy`!xUPr5Ice!5N$e zZ+bN*;M|zLK6$d(@!ofvHv%~-q*|#-yTJq&5j_;>Qm|6W^img>fTeonht$z9Qd2ZN z?f%>yCw#_Y!t$v0krEDFQJj~RU!p!|@gL(TNaO;k(Su_j!wG?C+KugGM+61(qi6x~ zAG@}#R~1i0E56)&Ca8jsLFEhlDS_@M5V3SC6-3-;v~Q=lM?s^b-#Z0iT&*-Tjw1`L zeJV!6$Zp_GCN1OJ3Uo)j|2==!3jF+e=A2mcuhNUTV(QmBnIhQoRTP?Z25FL?b07|c z;O=2FN$Z|oa$sE*F+S5hPG=nYHLfq$3{oEx-+Pn?(bnAOtMINYG4G0ZsjZ5%ISMyJ z?diM0Lc?=*akp=N%bnNE_!)g8DXr)Fy}ultM>Q-IV0(Jfvu!9_;c=GSI4xWIc60OF zTh`@T{IW31h&IDlX2AxD?&imwvaFw%sRd+cg=B6ehQjyB1<#)pE2u&7R!|IW@sCTS zZ!WzMWCqz8KzE>!%Vn?gLLIBa2Au#olJ}q-AX$b$AK4EV&1fnT7ONwpt?yZpTn(6;LT~5Ffu!t+Et;|)Ki68?%oAPf%)5WzMPeR_h-i&^BLv9y;!77rR99) zamL>Giqv;9M$CnnG23Fw>2brN&hQAZkHaM#4PLH3?T)N_jSe9H?R34pciZ*OPm6^P zUoXMEJdJMh=hIcJ-N|oulQ?$2KihpOysrAdD=TWg=@Y|1_TqoGP{x>7N)sW}z|>Ph zq!5uUVIurLvFCZcY5n)}9t`aWz2zDB+*SQL=SLz}s{4lSuwQ|GZ?e{t&w3Lq1lh!W$z#4E!2}9H z$XOOm4$d(pf?_<1MhM~#CFOf46iuns3R}HBp|wWp0DCOjYObs|&P2$#y3a^U!^9p9 zDTLq7nDxyQWufqXrh*p`uPse0pt6G=$M>i{DnLhTpJvhn#M1TmP5@Ut*V#QgsJ%!h z5)54*)``=j-9~=JaiTz+xe(yXAQT6Z%h`-v$&Ka)p&>NXqEWmsZ6o&(TRa`~l9<`g zjiwgV6dWgsMx$_6)G9NWm1$G^JyG`p%{!#n;>s_E~(@gm=JsJuxTX%Zq32>x!!Jz9LJT0-5n!q<_)=GSWue}zb7>xyfQyG43; zfk#Q$ijWIGT~POU)de&A_RdeuDvNBR0g2GpH*$ZzyS!49smp7q&knXx?zsB=`F(sm zXRqde9S<||+MUZdaBLJxDlzW}L3@CF2|AYy%9>|b({4HKoYIJbW_hP4ZD><2A4>HS zO^();Q44D);YT$LUlwA1-Q}(ww$_sD$=;~Hjv=_Y;_6-fC2al`Wp zu?x-7(kqgoB9weDb3~qXwh@t&%-8=Fnr%N$Z>Wa9e9qXan$vX#6E_*!;)WCMI`%F{9Vei%7^RE}K+Q=i7`4yKp zH=9ITY-Khr!Kkx6=UVo<{~9Tjh!*e=3#{KQ)S1P2Na#+ud@u=w}kq?DjHYmI$90}LWxp9&@LcsY6 z$j<&hlZ7eRQ~shv|FP@hr_=uIf7`YBau2__i+u796}E|dB>B^9!``^G(6r>&%g{b_ zcCmF%Owk%L?Ns)Nmda*%A&pu zDCY3wKB&4Q?g*1X(JL@Yq*#+Hu$0=U@_%Gq6}|mHT`ew=M_r>C9LC2QP<1+gcHliU zA!c$)Ab|XL9il9j0aj`xg3EMxqmL)c7GrOLS%bpS(XcZO~E& ziCWcLel^3*oOQ{7)t&D|hY*-KK^v3ch|THFmGu-nsGI> zuBU08Jwi$!AnOYiR;tHl^{gC)#p{?t$?N^eZkqRO2n6f?8r~@vZtSbVKD~coEwq=t z^Q)(BL$*q8yC+}^_&53|HD1JTGh$QJvTnbtW1tQGeZCpYHGL~OUFUS2bziKZl$_*N;l`>I1~l_d0>vldN?zfI~ktkfO4-!hYShIyy~icJD>GgTN$8 zA4Sv--pU-h54M;R0yMj2FRzzAl#z=(rs-?6v0Wz6|DrSWx(TFGr4aC!-POLniE}_c zPCB0Mi$!Pl2LevhYCg6|-$$p(6Af%j-_P&|J4fGDxKdZ7zn|pW{8~A(!Fv<0PZ@U) z*bFiS#Iu2?Jr#oJ z#GzbYJEjRyB!{H->d(K>?D_Fu;eTATuZMDBev^|#(=N}4g|#OyL#owEc1FU}L|uOb zqa&{t&IYMmv@dbPu}Jel+*bDGig`Df=LbUGwf~CM7=!$P_X(nd$m^$v8IpEr|9dx= z-}n=TaxG$ietY-&aBBP6KT-D@QI=B6k|K)<kMZWx=kjgfn`L>2ls6`fxe| zP}1JG`{fWJ{)SU66|7Et5NM_rB+OY3p$-9%r)(&ySvBFp64_CS9mv(RDyPUAq7|7H zjhGdRDo)bLb)YX`!7884l4E!=O4}sW##uhtrtf>K0&WzHjS-rQj`=2;G`Wq68NbB2 z=Qq!97hMGGzW?rztpHgqkD%?^{NTtw=9gFI*SSPpJHw9MV-WHBlBYw6nW%DRG zPGou8B2XyN=b<#v?mOKfc3Wp84@QM_yMHj%@oU9A^L$I&A(5oXBcS^_Urb&q`EqP$ zF=6Bl(v#=3L(JhQQxnSMyT`L-S!#n{W8d>>2|k5@wcV^!IQrSp{O& zI^8B#=YaweVSh8E!hjnIP&a5#p{dOw&ng^mgh*${ZnK}%bqa!ql%1Bu6k>cm%yq`* zj@SA$h`b_8E7eg_>D7rrhy!#nOu+gLA`W**#5#nuhDx1m=j>8PAl=Cl{{tVtS)1gV zofb!M8EF#6?p5`!KtlnmLug4m#;Vw>gQio%P*lh{3Q_bFZxat$!+zpZl=nr^e1Guh)eC^OgIZ=`B^E zN2kI2Xy+b#j-k_Z=ZxSg1-TKHikX!H}{39lxcBkaVx2`Lo^MXUa8utuRk3sCM|)=RngvX`P;;0{6L}+2Pl5pUrB#1 z$)unB<=N6-cqzI+;(PgWSTsQtJ5=I_Z1NgodnOXJzEL^jVtl@Pyoo^6?(;@|MpU^@ zfdjvY^W3|OpMPY2`tquB&!}l8!3hQKUzX9jh1J7V1V{j?umOc@<-84%*%U0|`K887 zg|C3=eViQ*b_ekIc$rY7@aPlV3ZJS#wkqy+Y{FJJ@;qj{A?42?jWHx?Mo;w=v0n%u z!>M^Z`oXu*zC16r1Mvk5#-7I%Ssq&k>g>K^3cfhk9WV#hlXBQkr8}cjRs27Wk|CBIX zDK9nTziqhdDyfHjtlHd=d3E5uJLRxzr`VnFi$B$X|Dx`};U~N0);EVH8roZW_!s@p zp7RhXkHn^;XpfPya9wk59>c)UTmA4+liR&_U#c>`9?4Sji~Vx;MJ;!-@2WcBN(^bG z5kkMZEjD@NEr$31bk-IPX14yk*|Y98qOwI^|CN0K_qXl?`}v#0imnZk)v5r-A6%=+ zbLeLIbtdA6!POK)NGZDBrs2q z>hL>w&kd0M^#@r;s|RsYFd)P9yv}rI2kJE*yb)rn;J_v<2$Edp-*LkyWPhns_gxG3 z92ChYf5q+1lElqKSNrgOcs=>wyuY!xYDhIgl|QzkdS@adqJEEMgD|nI7V*qvHxEDR zXN7G!ilai5R_i$BC9g;zP8!FsC(io`-{EIT|FosZsA+ z9>cz}W2f$vMXXP_2T6Zl>7_DOX}zSe+bJk^lI8H_6(rAjW<1Fs-7u=v8-hKm=)82D z*k^5X7u(!D5yr!j9hw~Td~?*&1nMP5Nw z^3t-!?1cUgy|q6H8f%pX0bi$rjfBA|)>(xgQi+l}=h$L9t&aVjVKdwv)husYa&}vA zY2N)hYp{UcenBc!`^ilWi+}OVnPKT+u?fNZr-9{fgm1OITT<2UP<=aLVzhUnJM*Uy z@7EYvRa%#yNm+i#Vk2Ms>}lC=07lE zr4-^;_V&%zK%pIcxv!;q*c%mg{0E=a_f$(b?FZ-v%peAl;LM?$B?sSA{Ek^!M2i-mioQ1YlN-6FW6yd#wCQD|Mf zKXXr$mrV<^EWAMAZwV$qFtF6UtZLAP?zd2vhz&l?Z!Xts$53q4G6J+Jz)n2h zy$C3@bj`M4eTAD$zKWGU7_;b>t1;#ckGw==J3lOLhYAa@rs!R=3xB;S_=cLPzmF3EpWE4mYBMU(_p0R=@i!&#M~D* zKb}*wdwZ%rhtGnR)d5<&1-+mf>#&}5*y_D`A`5-l7v@h_sge-VmnGX>GRSne)Cto> z3bOJ?_!dGzstx&=63-9@*u=-U*=>g9Sd+b-HzrMY|D+?8^hZYYP9EKGB|kB(i9@8? zd^?@^!6%)0tv04nT~Ga;C`D$U5Dqt8ZbI@bJ58AY-)hk2Cd*lXwMdP8U{x}Tan+D6 zdoE25J1kU~2?EsVS}4HtG4tQanJxmF6C@ju+ymwA6(ypcG|3i|}K#=uMemOsZsVV$Kp$SR^KabsGcA|g(-sG7= z$N8QVlt9#;QPqhS20W+>T-2A3hKpi03-UcXg$a@jENPgo(6eu!oB>jRggtX;QD*TA zcbP`1gS+e^F}MIiPkk4+ef{Dn^DV0^W>d7nZsl!*{=H`wONZxOrR~h-0fcp#%y&?fLdwfthT1>f^kvYM8`i~vyY~5V_>_XQE_nm@ezuE4L zYe8~R%=BH4`1OX=k?*Gfaa|&5aJ|p0cZbs84k;Z|f%GjUN%(o>h6aWSg_*SP8_u#1 z;5;G5x*ktlpb1r~ZsGMUSl591$VhL(MtH&9N&Z%uc3-FrlTfS8=GFdtls>KJ=Lih? zHfY;IO^ox&C<7C9%1ES&6XEr{y_p`fGbD<5^(P<2|E2ygO{S^t*toD9r&*X2J{iw2iIwe7Rhqlyt9^f&CP7O&_TDSJSScp+Q-rv0_Wc+fe?)kj z=g<4HJAd8V{<(KAEA9HT5y7I=g!KL% zF#dY}NcU;IK)#tl7)}gy1Avd^YCRL*6yZvTKGw2ZIvM)zPThq1X`ZM5Z0_DL36D_T zEZp|Fa3yM#y%0_+7i8ac?2kV6%3=}?pAO%wH z-g(^)L*Z`vJ2yqgaiJ+qG^@M)BL+B~LqOvXdi5F$1}KvP*9$E(u&eY2(&KAWLIILh z(@u6P8Ja}P1p)5yn!b;DUE|f7eHZsIpxBmB!McFm<50_qoYjC?5=FkwE}&OBj{g4gF9{JllArbH@R!7UCb z*V`&wswE~#+L5X{5M>B^u0M#~p;o~bfY=^w_rV`{wAAwWV7Y{O^t-Uh=&-i(LcW2A zK7lFE6_1*KH|MuRSpC77p*|Rlu9U;CUwAJlC=dm#CMrk@NwC?_HM6)^b~e3Z)a6r`u@bC7Da!gTtcjF9q{JK(zeN9*nygr~{MK$M z%5gG?418jD*?)M#&V%G)b_9)Xr?*- zUJl_8TSarRFMg&!?ddyG%-EFl^ZmQCo{ZN4(HtNuBXtm|4lReTzD|1fyjPe!K(oW; zaR{hU`yWMD;TKic26yQWX^=)K0cpvlQ$kW2LFstuW|t60Y*pPB-2cBWq>WUH!itVN-X9mKXw3Xc+L}X znc~;^i6LQWKV|+EOGExIN!0d2wa1=8n-{m-!>7%ievjtQ0Xg{b_dB^bJK1sDOH$vj zQK}x9i6FF*On(UKA#`~w`VrXwm(rqH(g~$f14~14&*#PTZ0`5;4kXy$L%TvA`j`(| zB+3kJN~u_5caLVQX%BjuQzVAV=;mftnnp7)D=oRUdpq;o@ViGgnsD!?Z_)na1)bT- zIpir)4Nmxo@Kf7FuYc4DhCwNXyAl`LLKh5SC$vlETFcAoQVz1LoWUZBPY&$YC4H4G z3A&6qHi2&63qh?UH_*p9)Hwo@^;nK(yBmV_*?8P^wH3$*1f)w~G{DR4u(8O>ge_iX6aZPI|0n2@ZDuAjjdHYCq^Py%3 z%DDr*57*~EsboUr%9iIf{jN&Cfo)SV*gC#VyL>D|`ui`&4L;!qeO)balk zG0IFi2J}$oMf;ZOUjY0!3=?kphQLh@jq10*0WJPC8t>@6;`~oP`JXCgmahb~EVaks zThdKCImL2Q*YXRKsF|yTgog_;h0~Th2R$xv$9?|&h=ezN_nK{Dl{4rbcRdXnlftgl zjLJEK)IVhc{Y^#%xnTes{+hnc1vg2@1p#QwmF!2@P~`=A7FVaqh+HaES;Q{aawuE5 zgJ7+4`94ZBuzSUhxBQG57QCZi zax_YrAq(yy^Hlho7Wt%E&Og{|n8EhsJJcBS;tc8|e`fv@m^mf^@9kL%LnuaTNPny+ z$Y%ay9)Dd?AGN$G|1J9W%ENq*0mowx!o=nm=sTK~rM(WuXu`Rzvfp%H_E+Ri$ca*W zYq7jx^*c(=PflMs(#FTP+;wG?>o=hm>_FXK2kUH2zCtn&D-(-D1BbUSr(G(X89W`@BN@~&|Q(a(wtGop2 z2{RBA6oo(Z1eSk+Ha&#*>zBqj|ClP<^eUM9R(k4vK869##u)3+`+kv##z2!foiMSpEM|L(hsnZ49Z!L{xN z+}B?gy*A||sEZ1FC_--HsdXS=IO?n@@brrL@-io5aA? zP4v3%*iDlxB*n#WRHb)j&H;nuwtv%bfJ_#4b5C;E5g0qFY=Nh(fU?PI$!+Gn_@Nl? z;^Q<#mqqZ4lC|zwbq@LVs7K(a&fq8%t=*>gjIO8lw&g3bIpJ!a|H6=+6Yz8DBi@w^ zZd(g@)LF|J0sHV`lOh2GKcK~M@i;<)fwX&h*yAThPzcEY;tEm*fW)ZSygvdL~hN9DCMZ@NJKD;P>ufRR)G+als} z_kWSGT;M4IL2miaEe?NEm52hL}dipoT^^J)aR}&YpiS<`&!&iCb zv6dpj@04l25)uRDvNjco7U0QzK1f+uB?8)eA>ZXtzjU(yGj98842#DC)aL?K6lkg+!Y|`tATdgEvj%G~BBD+&K z|1d*2?qnZ-_&-F&i&WZz0}tEjJMqMY|1#Df!!s3+Jj=#%~ba7Z>EbliCPFS+_e@~$Cj z4+WFy%+3D`u#R~Q2ryfPtlgxso&b_N_chp(liqocQV___)A-{OWMTKB$NK^mjtf{E zzg(TLHY}R^EI!rebo8Hiv&8RD(lbq~aaIME{zontdF9{VekIi&a;LgtejRL1qK9OH zvg0Zxp)52%nC@?V69>?TJU-01lOuer9(8N2TMHx0RkY4(xoM{^4USSj932}?JuY%U zmt&p|Ikrd0wrUvNkSDQ^T3Qb)Z6p|^AjFy8gs3ed9|>#~LhgW;_T^O>q>q&7n%mMr zyDr^pPP`Kr+(|?1vyqAH=UaRnvV)sp0Qk2*u-Oma92Fhhvh4)UwP1o#4~&Raoml%Bu>Y6JP9V1d}Yl8_zB2F)2aQ+iQ zyZtW#_=5A_48Q~k8$?3F5ub_vZeFC#e2Rgd1iG13qbI^^U(zXdiv#$>@4Y#fxr!D) zqN3K)L^@}?Sr8DX-xlK}W3^3|6Pd(UM)++Km-*QZdwI^vqdXE@t$=D!IH=z6UE0RZ38CCl=lOJQ1G9TU8ZmFdknq z_T|-hEXN2ApC%!fYL6=6E7fa0bz%k1M4GuohRGDt$zi;WPme=$F7y;**2iP*dSmR) zDKS6h)Ya$O+v^hI6CqNn4;%c$K3YEmeSTjLR-Ckam!(20SRCcMgF;t;#fA_IY1+FQ z-5x-a=BDJaZ$*myVJGCw@K&j-mKAYewNca>&R+72fl*yj_^pI=qJN?2rMBxBgUN~r zzBr#=5@P^xGv3%J#&tvmTbzI3~HecKuvs`ySzu?WqMYEOV0RC8I*FxC7`&yRq5^h&bfPD<(*TW3MaYem)A)UMNO74#5%h~_Um>!`(NXJ z{JmZQ*(2s$+bYo`ldpz#87I_^>vS#CNwpz>K+PkCz{6ZoOMck&wkxBIIfjZu+yxt41t3hbPQ!y9!C-Gzc0Y zklf!d#3>ChN2A6$M_VL`H9&x7g|xQ&!xaA{dO3mX>djxF{0$Sy_>Y1F$;eL`=SjYC zVHx73S}Tc8V8L!$~fR{E`9sMN(&>(>#0!sT5x77smyrS+8xcU%AO< z8l`+l{bWpG1jB@6&6M}X0AmHRCfmLiPe&?;8yL{VMrs7yL#fTtpgBOZ%htRuK(@|9 zv)MzlE=Z|a@`VXCnFir`M1aX-8?Ez>_>V5VBCZrQ54NdSdiODcAE!K9U&(W7g#E*6 zME63~q?f)r(q{@OHxg_18C1$a6{q#F7EBxJ1@4||+&_3bRw%Bvl@ao=3w z+#J{(bxO@y#DA5RRzx1ej@(k2PKuowK26-5?xIaFC(d?2I}Wa=U!0zf1q5G)vj-Cu zvUjnpUA8}VtjwRD4}6CiHs4FZN&fTVy6g45oBz6}i|$5z^OF9+=A`+Plko1Vj0>u_ zpD%X;&w$D=!mD4=Mm?u&#nW}^IX4Fy-*{qd?S z{po-l6g*#{dT3CB=B-h#A9fNIxv^S3UP}x5h6(3Nc_a4xw?$?#S&=Mv33(ycoxS_> z43gzZthhq8j3R?i=zISd5W@_2gZYUi+!Xd|pUQQ9>v8SF(W|l2?0y1tJ@DJlouw`dvf2>j_14xZyKo&pe=*yoWvhL zVDHa;<8WHSKJ@B!O7~#zEkl=o(b-Sf;A>^W7rsp2(Dp%z>g{njC#PKxsy~BXDPm}E z5vFl(mBm^srFW!FoANaG#p-C1_UNsk_q%YjX)C^kiPZABOi+JqZRs6cs#&uWVpKBlxAeO335%FrBgo{*ZL_ve~QTK z_bM51)OkL!O!=V_Kh1CeFNPKK$nJxiWZN$0ALv9KBt#c4oNY~d-b|1VNKV|*gJF{(gJhp;R+CZw$gG$8x>;A#SV$P%kp|h`dxqCYKMgs1940xh0`2 zs{^3|;ePLfkgOROTqM;nS+2WEV|Qk0nLNA;ztl#&`ioO#TRTfF)&Xr44h&9m3(c$* zK_{uQXG|2{dZt3_(N8G05g}(4=_uCy<**ToCUG$mcRSWgW5GnM zR{Q}0WP&J_hqbwvUm{@CTxIPHfQgl~2)0)U;v-!7KW2H()3-hEd`WEV6~|)nVk9io zf@}Eem&^Pk)a+376R}-tEb@Dv((kMOJ11T8#ncx;2lc@kV&~5%Qf~WV+A6j5#q(Yr zCsW<3;7{bU^giEsWyA)>9jP8V(6L!enKyWWuhU&Twm(UAl{GPz`vn=%I@!F93m(dS z4Pgd4@rR{ihRrT7mhsE!8!mXJFN$z~U%iGl!h`Zk=3T0eg}yloDZ2Z8*ZankT7`!# zrkqrsl)oP?`!!ODY*_9`2WUe59e`#QtCU_sxy9{wuY%;6?|8`GiEb1ZsS*&)XA^9D z%~P33lcbFQDi3p;9UJX)W1gHbsJj?j4wZ$WSA-#4_~1Sz8VUpqtEwLtKI#<;dLJ!N z-#pkH`8?JooUlVLUT+^Zj6qD7d>`?Gapo?;+_UJ0)sHojyZEI49n$17*4za`CvUSn zkh!@xk5`l3@LW8^h#Np0f8P~gahCNMYQ9VvXw8q9Z!J~Vt+Q3y)FRX+zMZ`F`Q*}I zBmZ=I2E4W12~-})=J#4i7x-kUNvp$tRmQq-C983e7cpO>dNTcMlkLVXDPU%lLEpF~ z`rnUY)<(`>ahBeM)5ZOUA=jMV^5uWi9fS+ByzE~(i!Wf7s|{}FmXnp(VQ@M~>-MX^ zJJXHANyIZ?1(_{zjw`4bovD|x5hkkYQe5bLW>L(y{z zV`R*tTt5$U{SJwuM{P6DFE*UhZ{e|Ja^K>59;=Y-Z9!uM{ua-#JNdV7raB%E)vH~d z-GXc@E&~=t5W$a1Yd#VpNbju6#hAH6vN^}FIdzdEKOS$)d+6rAz{UCVqyO-lr6{v5 zc?616h4N6 zz{|S`#+t?x!Ikln+jDt}1J8Pl+H#P3jr0A!#0^#bq4!%-Xx znFM6^9wKiNVEBkZf)P>tb_?*Pykj(bWEu5FrL>y~m2$s7g_qFjFF5$P1w{aQ z1``B*2q>=QLFHJSM!^C?Q8N!cDF|u72(E~eaX#RCg5RK5Aa{GAsv6=$jNes|UKvDy z1j?Sm$c_r>EbIb}5^KG4UhxMcSn{YE6VRdG9z8R{2Ap~U)}ILFuZa0gvkDmug2js- zAdIq+WXXBB$>*aYB31FFex1I) zmF~AIyWx;vjsC-9hvAIo9UoR#f96B6Z!}WDBZD-x6}f{B3}sH)zCF+ZCjvito%M1=3N4As zsnNL{;NlGIby_(~6>meJ&PU~iyuuWyyF&Xv;%PNenmY1NxdW)A`ttM+4M*QgwOz2rCnHmG(%Q&oe z4^N!luJ!X_1&cCM+7pK8oi1~pdDAy<(jIkk7`Qye%{00u)clP1E;=$jb+!Ed>>v)o zB|Za_2Yrk!NyvJ-$6e+r_Cb~0-2WaPNYh-$oe<}$iSXGf^%d?kL?Xa<7Z^0Q+o0SD zxb@!lq3XnsFJKR=>%cKr0&a+fkGhJo+0RBURc+c4+d**zA7?&##bvI0aRKTMt|?bF zoVBq#5crY4_1Ai#{GHc)V!=-f<2mlJQ;OXU?AWa<&IzCGr%Z&jmwB#u3x23f*6Qjz zAt&zKy|OGCmwCzf2#EGU*v&0p8S0lg7_qq?e;Q|G+#DwBHuIQV{Kp&^_nqXX-TxUoo}srpsZD@a))MRGFj zR}JD%FR)pYLIud4rZFUz60)ag}VQgOxX2YdU{STuDk9RvxB~KgNr=i>ZpkM02dwyhI7#wKT zSaKMFQ0BYEOJ)mc(yP$fG>8lN-^$Jyc@LnwuRPWcLQC0d^;Eknr^6OH~ z6GQ$-@-hRB0{xti)7s8!fjndm!5{>2`gKLRXDkunAC*ATSJn<}o^gqqOGGtm1?nHR zjy>%i>q}E#I;m3jCijtCPSmZu;bek7k5G7G62CkxP7yp|`ReS)WU1 z7g>wFZcoHs=Gg4g)a^;hz!^SzdGVI~lgNU-bfyrQA}xL&R+!3i@W*6qnqTOa@Ckm15LB4;(L0P*1~qQrR%e)0l9&qV~@Fx^)~ z=D>pjH*am1q2i}rhXtp{>cPHGr;n_S!CDWD9ILQ6d|J^a=YyM8s7=a0p^#LrI9pSvn72O195C?F%pk7l3OdhFlUgJ9Yeiup^ zjN#d=m|~s0yB*&u~;gEvE*re3%NnV)!{L=A%N&Ueprh$e2v{lNP~Zij5j+LLmCpr@Hc1 zzr2n&T!@i6ahs3}KSHSD%JHI2*e~dzS626TX_Z5LOK|W{uaUz49%E6B-;p;V=vl(u z$WMP(Ui_&R6J7`A--Yx6BI+8E;CqXzQGHJLt$Ko9K7b@pY#L$)Osx5G>Lu7sO;)eNV5P!^nvB4k@O!BEL(SBvP( zu15r|UF81uA{%ved)U~?H;Xij8usc+|2p^`$6(dzjMLi*`|g8HmAK9eKfm$k7i*Qn zws7?kh2kzcRD$_&472@l`=zW753nRva=^f=Ucax_UU$+(%ZzK`vc_l`X!WMV$oWZS zd2Id~poq|9$8JswHkX)ccUsEsDTK)I`!4Km0IS&o*{Psl0jj^E9r zw3H^HyO!a6y{(>!U;IijspVHv3tM8#OP%HyZBAMP%`cO7tm?jK>|IuyLq>N(=A|aK zdrdY~lm&7aIe*A(Lp7q8g%X25{pb*kdh*V`>UqAcHL{i9odmeSF7`<;N^X;7krv#U#ze>i20;*Tcsu<9j@oL=3V}%PKkfeb4qrY-9&X2p7U%HA|I9vc zUoN>$r+B;(#`ZM8#;ceR!_D6C4d!oSqes<-r`49#TakmKb+AzApp&Y<{}X7yxg@(7 zR8>Y=bfQhI1Fujb$EzCU3~Zz_BT#+MxCOE2%T%}+WCuF?FM||gP$4P6cF$B*UnxpI zwZL3h6*g$K?ZBIpGH7*dv>N=6MxnbIY=<$N)~-hN>S%rp;U*OgvIG0G*;nv@kYb=a zi}|6%f0G!0e|I==wPa$EPUvLBiXbGsk$Nkez%Q>y=yMD3gmKoM^B)3DM?CN(TAnNk zyV=kOS&Td_BNG9XXmbaBI%9m#4y0To*^6a}ifV#b2TY-NT8_eD?_Xg(hx{IV;;S4{ zNQFv`tOM5<%1GB&Om{U%D*fG1U^W5vkblHJVM9b+|L-1d*;ql+-DIKg+Qv3v?)(La zZUJY;@wYOmCGVa{L%aC=H=<_M@spWUYGFnH7bYmJ=|XfEU!&YAtBrh%I2C~9`#1g= z`+%hJ*sLu2Vp-kb*8Bs^VyR>yQB;+!ohFYF%cZ8Yb;OJr@ZRW6rA>kzeq_^U4z$Mm zy#NpNfH^(s6@9_w)t|3>!N6&H>N6yywop1M3s|eCgrx`^Z>ZJZ3e59M+&B32!|No;&IY5d_}Hxu#TeYzy5y0e4z zC%hqed6ao#YPZ^#w?z@J$-?%|!5~)VM217HnDcxkzZZ)BQ!Jg&Ul#;TS#{KJEU71n zh!nl4xXi)g;#~Y$xJi3d#(T7baWf`z)F(g3&dzC(<95HkF_3E8dAf9F>eu7A{USHj zFwnIoRL63=NJfa%SUp5yHuTIbaaB~yANoZT>rB2~p7;?MHwO%xF-=Vfq$NnPc)ELd z7veQ{3Ye|U$20%hYV5!N@e^S8%peorDU1-W(#)P_du6vt=~bs5v8QOgmF+fN$?rcv z4awJ{)z^KT`MvB=ZkFn#&(Bj%9>evgQd6)@M}wc5bcsoE(h7qFI?v$4>Q&`@YU!Hdc}RFFRpwV&toG`R0Q@A|I^h!r0l3 z*wRbKfL+4)zRNiKqa^Q5y9K>xkPXb;85B@W)xPq1xi<0pX`W4|a;a0g}xz(Z~589;vrF2`-R&PCj_e!ZcY4eZ>VseLe4U z86RdGxd;|j*&*-OJd5K4^;Npc`h!0Wt}yhjGnOKAkE| z^M8^6zy}(-fnV(1W*5)Tpo~LCX)%uw=uE6u@X=A3*M-F%Ul%vEBU3Puj> z3)((@pwF>TcC5*7GFVrZ(kl>Tq{T@DlK&5AH5EVp&9aLMP0-TqYiJOl_(G_80Bs9T zY81#9d&1}K(yJ(t9fogJ20~;Ds_OVpO1+!to@_}Mkf033tw0Y4W})}niI8>Z$$|xU z_n@?8u&>%-L$DEo44EcMfu?{lL^}_%Txb zr1i4XnmMqDhYJuJ<3Cnn22py~H2oYjbrPg7iQOB~AO{~ zaLFRI5n7%iZ;cXfb}Ro}Hh)tz;jXoGo_Df05)%I7BQ#pA*j-qRrei5*CSJ}>02pLx-|W)hU$7Uc=?SDUt&)(?ql(-?BTJ!o5bkjRWkB0mi7)oy?R7JR38b zh9nK{F^y5p7!3`gl78%W*62xAh>)%K@It%XUmU05Dtt_CWGu|RWZzZ4u3V|yUQxI7 zVx;-EB@4`!)g*PqsrzZine8bdf!wMgAoqJ=V9>yJNsJ5kY=@!C&zhyH_oskKO?3<` z?F>hT6ILCic-TwT*(Gs$O(76=YQcDRzbtzy>iy7Bdj$O;zBT!EuTKhBLYzkZ;mU}| z(KuPS$R^J2QmM&kvn_?w`J$57-?41?nquj8G!#~!8bU6Pnh7i+LF z6{J-2z)-iH;){r1y;09zilD@H8NC1&Q5*RjQ~rLxXChoj#Skz38Q5&J#XCg0g4mTAEee&y((D-KeHcdM8NOtTCv8LY z#^uKE*G^FJ;O1}hS$wG!?#?;E&bc_3qtCn-F$TL?l)Hx4bKK%biWK*4DekR*?mcPl z-(xjHXco2liP(~F1Z%@M=Ysa%e!DnLpGeBhfAz-@p*mFv!VA_+-j}3>8sCTEJ zwzF(Yw}^MwWN4Orj@#ylrxd|n2jQ~@=2RcHK=%!-DSYui(4jJqtC9y-$D2$5Aw;t7 zyu_pQj(s$NEc|ix^s%G^F1`8r8z?>iI8PjO^=|8GTnqHdb}wGNE}gf|>UAtwE@}U# zt3$!c@nx%y6;shI&|5M$hr?3${2!Byz4q~XDcb@0GS&9LK3eAD+*ff18#QMa**6VDDzyT5_eRvXfz zNGfC2zRUmRZpY`T8Kt?pUFwDm3~Uv@H1-grr$A^Qx0K-iqzTj%{}AjOVuAL5HzE@> zG$0y4{q^i-+G#H<6%m1aBo`3s;LbA?hcD6(Mx?V!ggYWpOu7b+#bgQ`l|?YP8WW7N z0WASyAUK*1QvhhR=C@2gJYIO_tJKFa%zHAVMJiNlQo-lk4A}HwK7$YibdR016!iH9 z@a$zO24IV~_7`vq+pCHH?WZ4pCWkc8$K}7@M`g(hvkok93Z}y`M~TO;7r^VZA|ygc{+3Tosox=g6;`@5)pYtoN50 zIxf-S$y_eV*fO{#I_K@*r&|e`ph`iQRmI`vJ;fB;Y+Ijx6$^-jAjp0^Ju3*@WDNrO zeu+DaUfiN*tWz`nY3P*BE=eYG&!+gZNTGH6m-y^N_Q&~@6}$^d-g{YLTm-;!0-)M| zu7Lz9k!s1!ri+fnVSEN|KL6^D4lWdAJfL%+nd83q6SEV>JS$q4Kv}E&Xpf1WZdAwl z7_O0bg}1r!zMTz&o2kxShBoNqv5NF46XmA@*MCLh<$@(MM#)^1h~Ko+g$a)Kf(v(l z2GVnON}v9f%HL=xxAi7?M=sCOcdRlrj?i{Yx7o*VI!sbam4Bhp>A&IFII8z;5Tfys z)_Yt-eC&LKJMpE|*ppQ#(fa$2i6$P|% z1%>439)zbH3h}x1E3P3J;IEi?eo3a^IFes-V5kcG{~>OTbC2JOD-bNu7M6sHKpUWK zoitb}mR>JrR^7^G@qI_rrcc(a%h+bf7&x&8h5z1V&Kk_%o%Jx&Olw!2eW;}ino|!- zG4$uGxp@O$R`j2a=yVw{7uI$e8cJK_DB)Hui5?=RDEPFL{CQ4Q*5{Y9gao6~gw~^M#ALeuY-^gBA0s7tuD z&Si9aIQTgYW$;!SgS4+dvYW2mZ;E-|?P~2x8SvicNm-6#@i~3H}*cO73bNz0r5gV%PM*cKlKz8SblH|htdDxj@_hSbH_`% zQxuZrr#C~I3?v#XNdb{>F3FfQgOx6nBcV1VtI(=TDCIi9K!J~PX^o--3F#OA9-+-8 zB=^u-yAf^NJLsdG*d402(hgXAOWzZ+e-M@|99itJ-U{u=jDqEaZBL*%HBL zhy#pO0ky5c2!Hpk9CjtsC&gfC0+KPFMD@ zD$6+{&hC>I3Zl7aT;SGtBBaxdep^Jo)hLDqRLc4-+nAfesRR5~OHconjZ*}o2F zIDc3STY*Eit}EzQW_O-)sqvwCqTV$q*SdI-3Z3D{w;T-ve=AkJ4r1fmmPlLZM1iN} zb@l*xt?S5~17fjB#yc5{we^*}AhQn=e@IOTKIldak!mQ^SS4#vE;Gmf{X*8bp&-Mm zrj5S|F5-B{TrjNQSqCG!P@eT^p7yQ!oxSr>Q(h;)8Lhi49(%!IWASif;c!#zk19fh z>lX$>k{Oy2UY)qkVHbX>??4NZ%`=z;r3%oXkepbtD}{=CeIRNU!AHp!b+7vCmugQ@ z`5WBKW;<5);o+DgN~MG-`8?9}q{wm3zBIiLCV#;JjnaeSQd&l4xqI$ibMm1Nz-RDL z(}xSXzLb^$(-peD6}lI2Q3e0@NJQqBK;3Omjjh0pP4}`-ef>6RC7CL_bo^_kQr^Xs z0UfjfmCphSvpwtQ_TTqJpwrMbPiIqF*UfV{;ZsPYsQXv0Y)Ajve?hh#2R`bwKkDOQ zO9bEviCxm`h~*#Er3+B^O|9K!n2A>Frq;Lw)j7B2#QnGe1_l{x9wXlaVmEs*Eg=AL zS-5C%dV9B)_n0MN>N2X!n;;=I)v#_Cxk!}p__jT!iCM;Q|HrHAuT{I|F{7Q-Z|Q!lpPdLnIK=;|vzM}FBlap3rZ}W@FEw&#nzx%93IyT7N1@= zg3#NX$iYLvy&ZDe?9H?p>;M4YOlk9@ykJ1iCPh2DEb_1RS=h~Kmg7&?>XRYU<@I^v zwXTeI(puL_hui!|FgkxF=!D`qR{Z{OjE z%_?jPX)hionK*VMzTiwqyCAR^m#smI`USHk|9VPf;=2M%aH?SG`v}5l+^MX@(w{v+kmBU zcQ$A)Lk|3qsz5TLUv9=eLk`BEMk8&2ctIV@sp$5O(HPV~n-d4x@j1F@{uVSSeuxY3 z!FJv5Q77}TxAgs~GEaBn_cQ2ydJ`4`{(7cM zl6gToO!|Ul2eJkw2b)Aatkyz}T2=rLYebVS%%OdB+eZGYW=@P|-TP$t`|gwrYCByk zI^DV9Em3~IxY!$Ue@8<4%;5(-2Mv22Mdl$$K8zwO^;w1zVaWj23x)g5W@Tgo-Zf(N z{U6LI*z4IDjj^LQvB?n`F{&OKg?$23M%?=Y9Q&dsDvS(FLGDZY71Lu7sqMCl#=&7> zR2P~#w`h2m8Le zp4#aMBB$?gUClY=Vda!$VBK-4>D-x`6@SBr&I%4LdfcptLm2o{vPC1{7D zl4LgJz+r>7avu^#Ah=tr25A!p$rHx(#6pGxB8CG(hJ($r7()GtQ=?+5@T1L|6b}4H!X|N zIGBD{Clxvo?1mwP#yX{uTp#7iZ|_%W1Pr}FQK3Yw35NrDXQ!T zC3>`E2!K*P(j&&0ZfvOb{}Po@HSvn-kMVJsRge50SFN*sF*hxDBtX?Z7oX!=AUP@H zUzzD%KZ=Pmh{K$PoH)UYW8LxORtYWI-wnh&tx7tiqB~K|fheZ^8Ok6JFpm2#NuPd+ ze}Hdo`>v#-HWVF$ePob^=qIM5+lBk!<`DvsS;MaRNt~@zOS;MQFhw1A+x6k|- z(bpE&UN~kgnY;4RM?Eg9Zpu)fmWdOWid@-a-YvU;&4r&3wO0VI3@t0Qgdv3WD~a$UC5h0`PevCh}6ieW=Ici=m9 z)Wvw7`?A{X8iE=*vUgvjO0Nhjl|a=&1xM_N8oO7$+ZG^X+6*Nq5v_MPP*#xvE}3=) z>AEDlg%eT$tjqU5q%hZjuP1T}R9UYfpwqB_2#W{!s_}xWEY%IE^7V%8CewrqH1I-; z0IC$*WOtE348;NX7J(QbL{a^)qs*_m!G2{%$kiTe=M|yg&I2de|0(5&E0k@oKsJbT z9oSzf{>;p~4wzl4ok22DF>qk*`!EEti}3Tgg4L$dW&VU4;FYFYH=rwjZ2c7XWG1`@ zjj5ZNr=1N%DL>up{p$% zf4SE~tM5=8Py)d@NCdMT{g*_oG>(;=$ZMAD%K}vmf>CXl#=m4D6^?`~&T%4ZxH(HF zoa%8GeXE9{2ys?8GEA`qjQdr0ti^PORKzew>!uZL3u!PhIV6m;Lsq zs70-Zv(jDH8~?7KM*(hJTlpb-@&*Uq=pITv)M)~PAIm({cIv-1FQ$0@#BjFtzI&5Zb^`zTA(5CJQO03x`o!nkvfduR*sW2Hnw#twYj~Zz zY-KECSn+u%1~cT#$d4uuyN;bVF1mpM@=lJhsMKAzAa-VdG$91hwY_NKIrc^Au7x4zvQcu2T_N~^S7urpdf z09H`s^PVF{OM!j8o8pKkBhbvZP1bpl7YMEgdamo*QZr<%zVQWgPbUA{2H zpE5$ocW-4wDf0_i!yvQkR*!zVPSbOFQ?pGPi!)$Yu!mbq9^-DgZR@Geuf}!UKj=Jt z7tU}YM+JWF8RWsfz4PpTUv;=ub~n;_jF>vxyR4HcoNjPIHO4?*?!dxcT*S#E+P`TRss66FX28&U*;v zg4FvuvLIH|wuv}nSlQTL$~=qjD?F+V(K-^CoJ!K-jBk5Bs4UR*8gxwA6*LKJo6shK zUPIN%n##n=iiBI6ob?~W?-yI&CPLD3xk!p*eq~tU;=`!0t=zu7Pv_h!A;UHATwXE|a7%--%`-c${71FH0FcEl z#K=DWB1Of9utWlrL6yz*!a!R7Cja#|3D`0?tF1%bY_h8CXxe~y&rvz{nk+|SI_FQr z&Oc1`$E3J+r(Li~+g(NFJ!%w*Laoq|{QLWN-AKK!v5e>zdLQNT7m&}P*lb?N==%4W zbmg1sdAyO>IB1I60TVrC=W^M0oP%L9M>R68n2nK(%{eiCKbm(Lu{btzD(-J( z0>fQRe`-0Ui^_UN+3M9Qe@v7BcdW`|Jb+uaUhh__RDO#tbFcmCFy&G=&6=ZWh*dk= z{kmNh3QSUqQbI^qoc>8F01Dtoj6 z^YI|MWiTeh_;*Z1Nh~A#`iqNJ+z#*ZJbN-YbCO9*S*O3Q$KT@O=)H(~j=U~OJk*>; zLx_y@Bx!u9^0U+~O+6`9U_wIo$J@#BbXsAVSqE*r%71_w?T`g$Snk`T=){Bmr8lJ5 z&fwl{M(i&jc-fi`MFp~C*yLFXPhEL4wO2spH?ql|goCX?<2(N4-XYm{d$GN)C1aQA z_I;bnV{1T`^_IoB)hSPYLmp&7{$Wu1DEDzPWrs0fvJ&~DYA#Ye1u~|Ce7$|uj(ZVc zJ?9!x+wxF1+g_WdF{gok(~)@*OVG~7l;i3nKD~FPO>xgbCy^dQ|LT|K%!l3nxogd- znn+c6)?nTpaFsZc#y+$vT@Q|ia$JAC$-PlD?Z-wc{7Lv1_~c@C(;C!&dn1S(0>&|V zPFK5*E;lj9PsjX%uhR!@OC$kg-eN9Mdsj;W;=%iW99?x-Q~%rEMmIVemwC16BiV@_`KRFAllQ(uf9s)r9r0#GVO0e8NRC5UxTWe6hayh zPVl|l1gy?0S%Sw!%XE>ZJl5^`MPS_GFNGv>XYj;@b^9Ug2JZ6tK89)lNNe!!1#l{@ zAzC+MY$eS!I!F+@Q8yY zA^+mS-UD>@qKdofw(e{93dvSIl56fGAD1IpY2>=tcL)zGho8DqL*+Tvz^p~3;9;iY z-*Evh%9v8zm8i&W!Uq$nuZGyEr799x#2#Q7XFt_m0XHM;^nek0p!7RD;slY&*VZpT zf!5$&?$YaUBRioXocxp zai^4cR}d7}P8R>~25~#x*4KAw8_N1_^gJZXIA ziCs-mRzVuGP|e$J30XV^b-J~D6E<4}^#VRPep03y36$M5(pcfT4w4X7G~6pk7Y*OR z4RxK4t6W2?Ymac}U`Vd`VlleN(7o^-?&xN7;l_AM<>rwSNEbRLK{l>y|l3n4g?~qfAoX$-!~fcPG>2*G(>9Xhm)+YoY+`Lr5N(4P-)E!|6dao%i1CQ~)0jz)))n^v#EH9KwOw1-GuUzk$2I z-w_kTrc=c%dnW&Je_^WEuRTiZm@^#WcM|`Tq%zp9T0Ql;EcZo^voJe9*>ARW@&sV!}tm&snW6Mt|` z^V&KmidJx=|9L^5N-8I2fm%oVxrKwXPf(z;nSB@^Wm3fF?R{q*yASmb6-Ts{R*4f% z4mL6YCfvR}X|M;@{_O{~As7xSiPf-`rx!$@{*CF(GXl;w=sNL(EO2D+N|p*5w!$pz znr!suFZ~gXxkpMGqtoV(f}lycs5P(rW8>Oe{p5o^w%lsv&0Jo-V}UH_eB_;<@a0L^ zypy^HAg_kSgiq}Z*5f+5BG!KSKU&y9osrd+EP3-E@-b{Sl(&82m;Z?OYUS^hBei&@ zDDeEXW3Aq13Xu*wEe@ssw&Q(WpM5b;8+w>T*x@p`QixoES$Az-;e=n^GF>N?XKby) zA)IH*vFS;nFyCF;hV?T| z?#hTPp-=x}{((p80y1DYYN?0^DyJm9h&a*j7`kVeKko>Bfhv{~_(UoP!;H+ zP@NM0@>E&KVR+MwvRsq_A1qCMuT(LQlg9pkJx6*=6s8v_jeGfbqYn59RNq3Y@8e(L zbf!2fIL;OLzh-14?g0wX&Nsde6ww2MvHS0)E(AfimK~_0gjbP)Z5-qgvg{b>tD$`{ zNKNFgLq)BB#ezhe(D|@Apik~_z3_ic#(Gi3g9Olja4m2HRtt?AR7kNnYyN@63T^o^L(4c1gcR_$tRt2cw-5l98Z3Ah`t7?UxAkNxFAlOVo`U@!{N=JMmE)U3Xk zM-2`V7}Aq;tNKtcF?QKXgI$%cofj!vlBis1DqcpE;{Xo^Ine29+vkO(B)B++Gc6+S z2HsppISYIoIJgtuo?e5oDTa85_;|C>QTZiSpVlSR2`R>tzGGC&-BhJ-l-w$hcM?^~ zPgK;yL<3)F21N^0WRN>w^%#+$2z(BOgYWm|a1qoIB(QSa!N?utq86g0Y^hy_F~SACm6dC7k@ zEl)dJo|b;Krxk|?8Z|7%J=M_SdU^O7oQgsi|C-@5zN1$Vd6rpr2k3_=}A!}m919eL*)>M7)0>HGXOs_Y0KSZ zvqRlQPRk(}tGb08{AtJfB>~k-40NOGwB~rE$@wEAIn@Fpb(8(gK_ftw8y1N(6)i{k zuk9&x3Zu;04nuCE#;KgT5aCO=O@?g1)AgH4JR!LBHfHf|Gr&I!w)!I2g|I_<|9l2S zz#JL>LWt-si+_Tp)1sUjOK68HMutCX_MuJE-{&qOufYka3a6TcG+;z0BwPZrFpYc2 zV{>h2>uaW7CV*^7?q9*Nz!BVbi%~mVQVLqXq@;peW_Z;CPLBw724AMmDv*J&>O}p1 z^uNr=Dx}YTQ2hB!pjXzh;Xak3qhF;nG($S+^j@#Ghuy|QMg>HNnUO>{jg{cMYlXw^ z5N7rMwWNHA7bz#aLBNV*C{dLUv&n07M?l*Fd~l?$ z4~Q8r$$~9kCz@c7-ulJ^i7r$P3TsageE=H8tE^vighI4@0&Uj03PNyJ7Et6ZPRJeu zupS@|FtDM=qZ>J!Yp3H;e-W$A`#9?5$xL>-=^3CW6;e;ejxO#4jxXSdZ}`Kj22;~! zQ?3F>A~}A0ny9~s{;&K*dibCDgC&fj+Y4yImSak6e$0qEy|#MN`t!Z{&PlEV8I|c< zL@b$N{c;?JN)bd8VGh!IjE4W7dAe*S<5E-j{=I-j1#aqD zgO?J_x0-3yyJ~dVDYg+DVJum(V<~TV>8y^vF!V1{Ua+>&rb2hZsuGM(PJ0oaEqsh>lh>i-Gx z>|K$Gp}xnF%t}msxdQpS5^~)2rmm{C<#ovGK^NV4znR}HuPxkb{lJLZYgx`xxt&`C zcJ88Eey%by*!*c&*YU;DxNTY8J28Ycp)GQhQ7eCrvFYoWRB*t=u07R(9!r?3Sb%oz zpI*`?tbvYtW{_5-gHNPGNTjMdxKgHQ8RjgjXD_PfypTQaVOanE?1i|2&$ql>;k8X3 zuYRwk6zAlbp+vrQX>8@d7&XtlrXlO5(jcV4C$s;X!glEn+(mu_!m&NbuP5C_0M|>K zQRVk~XD{#eXLM9<(@EwL+>J|a zLE*+-aIc4790}aXo~DK?+k=QpNmv$KM_tY)VnWXMC0(DcAX>9do=OVpugRg49T?sW*dS`b)f`N4oc&v zFMN6JKFzaO%?O=+HV)h~2RVR&A`GuI;`1pUYA~3a;Qn(wvisveY^}5Q(o%2^_)tPq4}0w2aIGU#@>!R?0yAq6c84t7DCNffWpC8gc*jN zY>!q?geW)c$3GuM3|wx#Xsu)iN{XhHb+BUq^&mtCOvd3{=p8(a;y`IaD;hu;f>?pX zzfkrlxV{Q#8`=+~GQY%SxI>Pm|3()`~pKjSeq2lfXT;et<5YjB-9TVoTU zZb(gs>V$F8{O8okDrIq1aIB^kO8BSu7=yGU$)T75>l486-XRB?2s;?}Ghtgdow#7+ z>ivT?k)Flb-sQ+0H{}ngMp2*q5pbKi*K);)W#t)?vK|RJXNp|GZ4Mk!S!pJzK*CM5 zqSwCs7b*5dJZ~mj)4cY{l7&WaWwdV?iDG4&M*_yy&0TN;pZY&)c zt*o3{o{xSs>N%KuasPAPQ&SNy4+6#)HZHNlr<&OgZx3U)Dw?!XZpqC2MiPylz5B%F zW5ldm;4GBX)XxW^#1eQ({#CjCAg-<&cLu#qk6kaSdxK9u0y~4{Z+y;>)+qPL1OEK+ zk0CJKNp!PUvUoeOUW6H^#VvW!Hgs65?oYcmOZ#NI$iMe;44wc`Nlps+i+vrhfVaj3 zdkSt{)yC-tWW(5Ak+a*TP)@3+PpPFFsHIP+QR&BD=@%XU2XuYJ*eCaFP{bj=@&L^- z-cFPkYV1eV;3-7N^P=WV4w~=A>NoWT!QbM-zrFLSEyQ{~KAL75$&D_z(4yc(!<$nv zSJpRY+|4F~`P@z^>Z>;Cg;K0tNTx0%i(GnKsC5aa?yuwxS?Ua6Ph^^Ra30R;0EK$o z?9)wh%cuSZQ?PHyvHX>P)_?6@G#o9LQWPM9gm`$CubQgfd6Qh11*Kfwe%X;3;$?nx z`}onK)~@SjO|0!kx39leW1D1nskBFMcypLXIX4P+?}#s5aYJDZ63or90N!N??1d0J z6ffRyAb7dmrcA1rdz^f|YE85BX$zOD22f!=@2k8msy&M>ZZ!l&0SC7Ri3|!;Nog?y zM_xk^W^SjsxC1Q(_W`gr0rnez5r11i{utRAyNTDp5adJVk0Ie<)%jfhPK9Th9_!WgyUNhCs&nM z;Ik?YnxPMM^m_-;;_Gi&ZL@!$E!3D9G2IzOb&s6q)4N!0@v%B2x)*Hzs%rjc-ZQ2) zS!3J}T!)>;;*C7StNPS5(Sl=g0((r5yZ_*OzZ3_GjP*@?q}i}vUdC4^L&!M5W2$d) ziLL`olnKBvWz>Hm#MtZ&cUn8Qjj|d$uG+F*M-*Nq;kEYZRbc}9c*yJ9#?!^TD9f6k z=icvawxvIAi2fY=GeXw^`bB)mTd<)0Dtcm6g<;4aGHr9O&y`v5$D|(9a~F*#mW9eI zCXOhbWX{*%I`Pid*z;TKsk1V|GN=3PG!t46=;mP!_q$#{3w^r_fvNIBCdP2Sq)As= zwK{G5)KKR*x4-uom+9UtZ4N8`?qf}{aAm>=w9^9K1k9aCx;{M^4P+5tI{KEKCfW4M zp9xkl5QV?~es;{_U^ifH`quN{mw z$Rv9GYw*Y~X;Fi&p0Co>E}kFPyMs@K(B*OMwMmWE+U5o-`P{sIS`-B;GmS6fxH1J3 zn}!k!@)%s+vN;GQe4~B%>^XssXlAxS)Ng$H;icp)wuhwS_uiT`Of~84nH8fVoVur! zKfN&-A=zr<^S0W0CRF?&5ie_AUi~m5cZ*}xduY@be>mcriSn7!;?j$br5B4!0ucy7 zPS@BOMLw@6It9Uo+IKofFHOgU9X-D~vc4|0+O4oG(rRmn3ia$-_mrW)%BzHgr<|PP zyP|VMl+MkvGsS8$vujKSnZ~J@UA8Cd`^foj|`*lJaSOOM}zTE7dDTI8-I_G z9Srj-xW)W8gt^ujMWmZy{rXSG`xxL4Y@p9@gM2Q}ZAWlpk3FZ>^CoFVxlr28lYaIThzC!c?w zdFWkB(xY46p})C8LaLMr=Pv{wOrM&f*HlBOo z$J2H)1#$?@VC3ZM@3DfJX9c}ZbMZfGDEGgR?@!@>%ek3jy#CD)XoA}x^45BQRQPQ# zx5+mDu;SQU{9Tsi+=Kj(uejh*li)`$3r9kQjUofWOQ=2<4>6YWlYr>yh&CCo8DG&8 z+Ws%TRVr#L2&+OrBrG+m&U4CX+!LtC#ew%JWOS<2+fdd!d+98z>s0SVeQtQ*!=MAZ zfY%2W=0jfTP7aL+!Gp-T+&fMJ5MLH1XBd0^rH8C8qoU-?Z*GHsD z|F;IW5JY^E{;q#p0Hn^Y-^bOK1b=YR*@+lG5~)z|U4)@w^w z@&+g(AZRKSOwtrIKNxj&as{XG*SK962t-#l@RU?=wJZG;79`gjmUS?gd(c2jiEWy4 z17r6R{lA<@4mU_@cuA5>N;c5^)-Rdvi>io0Yg3*VZf-dK+Z)3pd(*np{>Q6+srDJ0 zq-9_fl3=OAOW~`EKZqg12OO{A7?XFIoq~i!0ENag&O~@^2phwib%Vs7!h6w8+Hoeg z8ZbdIv<>av+;X{-a$H&Em$DtxGR8!ji7UUyYZH7=!Z?XZ{=&7&t7#`_KNy{_=`1nEYV#(cn<+tWa3;&rMMYc{WOP9>_d0Eh*@Voa*=AOO* z*^{~!c~mV83RkUS@P%J!o5y$Cj=xO~Oy_cOHCSj&L|z6dy`s&sU(WikI6X1A{G;@Y zM_}{E(3)t;88w+D2%F-nzP7bVkGc5^_LoyKK6w&c*;&3{WnH2k`6qF_F5p-oJcDKZ zOSrDfl4jg)vmpba8EH|25Og1W0|bvH?_ocK@%a6~Z>GI+)Qyk-*R!cDvYBNr(=vXfm_y|rUG znxoh(GT|co-W74VY}pIBna~!3U1np&A}SKQ3$$)LL`3wO1LjFA^Lt=z={NmBDarg|u{XxJn z3RqrPJHZq!UKRk=H(9u=n}csxdKSi`5e_>07SRg*iV@#i(W@4*LNtU}DZ1Mkx|^5V zA=O5>?A}*cEuW8GNZo`8#FBEwX~s?nKN-vpQ9obzxu5+p>hzM z^l2o$9wg3Kocxy}UEpJPczUJ{p~Ku7fmWA;Z*jqr zRo5v!>|`dlA{fQf|2!uGv36t}1qe?R;`#l=XrO@s$%4t{jl~0e?)9$xh5J050&vf* zU?WH`#Qi>!eMSXUM2%2nAynF|BcJX;$XZrY*6~x;Jt7u1jH}wRacG=q>_mC%dDyFZ zG)oFs=&-@+o;&M5Y-KF>W%%UF_z42wf*5$wPz&x4hG0I0cZI-r>=_ld(iYqLj@Qp+ z+ELP;ve|yzV;qddTkpZWaPyG*HP$s~A#i7h@vKU#`X${5dv4QzYYa2ovTfZqxGL0Rb;zg+nVFwR%sZ7LIzFY7jgKbo>Rl}m7SDOWSHLoxp?SLI@j}pKcKX*-c=Ot$g`os_#L!Ke0ah9<1be*V(Pou>#E_+Dg%M04IYxx z3er+1;=gVx8kb0T!u$nBJ*$I}Pd178bZ2x~k^j%Z5PM%y9)?pIVdj4?v-YL)CqbDaSlg z!8PLj%&sMGR`7}E^Mabh_xf~pl?lzGsf|Aqf1j{Bfj3+gGaz*TwJ}r%=TzWfToU9RCm7Og4xqW#&xCE2JVF`JU(@BF zqe!*xl4h_24&Y$=cSKQ1qmbkouUvLMAR32E_pA zZ&IOnDc{(Dk2u#D2ij7ou#G&EDBR>swR1RUhUHI_K4bl#)eh z%oG$wO%*&ff{Uc_1YYU1z4^-H6Yju}33;v<_<$~*XdQ|ygs$V-~7at0b^6^e{TD*Gy z){)}r$n$3U|K`gFxjzjo@Tiy##_1-LHY5=jFmKB|o1Yd%&i1YjERE;y9N7Qc>A&#X zM9=$NoVILSFPzrXd{-8FvP`!r{Si-SP5kYVcdvl|2PT&$Y>6LkxY6%n{s z)Y*B)pT3VjTBSH}GJ1F4#!<9_7%rv`&P`;U=I<>$ZXYVTx_j`JCqR-59c?DNV29ZW z&*mkXFCM%#qq-7pAXr)$x^ZMZTXi)pswoCs`L_BV&QRq}D6$JWgf{2+hdn#maCkX^ zcsKD?u)G_Z?(g+(J>O$WuX;F*`KG}82Zn3ot8Dgbno5qhys1TxQVRb|$>&V@_UlFS z^cfU7h=Vxe2pAMpu!Yy&R7m;1@D-L!xJQfFeW?tn%(SsU^Du*HpC|QN`gKvZBUzT? z{3|T&0NhsML%-TMV31hrp8~K{nG&&l*+A=JeW)(BXrxi>lWc47KcVM%Y*P-DjnO`b zli7#soMnu+rn&(Q*!hvb@0mBF=BHPqd#$+!o&w@%NBOGDC2Kd-2I>B|t23hJQ?C@J zg=u-`)?WDN59dNM=faQ|k39o75=ic+hwdgxC1;W`e8&33mF+>9KRP?335_5hcT(UzGOl=;ovik+*?Zlbzr>zEGC4N!xseZ!mRL1rxtFo~)YSa|~>Wsi{-S<|jz{4A(8I zpr}wp?jN!nZTwGhnuZ=ic@%pVSwA2OR2U%IZK3WZosF~-8;S%e2oNVtDJ+>pi zc7hnsIGj9+X?c;E2ggVz+VSzi1J}WmhV|f|Pq;4uA0)A5WrJ1Ciw~8eA1j%k={WQx z&xtdmV22u0ahZ;l*^-Yb(p-mgr6~}3y4_82rw7I(XLn1(4m0TtS;ACVI4DHfvP)YFR^oWUm%=>YxbIsiFlj(1 zr+8n?=)M$d_yRug@$H|ldBAm>2SL!kSkVMb=9BBe*H{mZPD8r2qQ~C-D4dp44bkDt z!U26JPOpL6Wr^#NiO_b~$372?3`5zMsHYcnO25LmrJt}b=Hu|vaBJPRjskzDhg;h?b1_4< zhv36yD~)bM+T{VyLRsxOv}GDt(&)h}s!J1%(|w|Tadq1{I9+@C0|Olli3Z}IAz1&) zJ{@X98>~p$K00G<#_2=EYO%xcOn{0-?0P1)-*vm{3jP; zRk?lM@l9h7O7GM9FN4z?$cQKtt|I&*KWi`7*lG|XEjy&o)Cr>b)t2eZ_h^Nzsue_x zO*G>$!4+&sFM}S>xr*Sc#9Yb2YU6*?#i#C%&OL-K+~?2%ucL!s<0>p{f+6-A5o~;K z;acGXMoBONj$#*%jd)kxNt_8MwFA~FE=5@5{$ z{ZIH^e;~v`as<*0z{ZX#z<9#GMm3VUv-2bVe+B$o&nqyn3D*jnXJKvvkpt%L#3d62 zBTs61a=v38KR0AHupSeBOe#3M!#ENR#*Q2+#6Eq_Nt#23_m-*Wx;LYD43$+g)L4^{ zbeO>Wkq4K6cF`QjTIOr zyVJ^9iC~WHr$>`Mx>L7dVhai zj&p1}>e!Ly?`yWhUOX~l@4pcc)}N@@^kPuRCS(_jOZ{$@80=$aiaZdfm3qt|`>~R# z!?dB(aiZ^V*vz^-NpDJl*(G}E)o0Qpc66u^)BV#oWEX$rx6kZS*2Q?71vce`Ln5V1P)y(2a8 zVngyr*U=bz>$Luk*WUru$QIkEq`|ZjVf%!Y_*79i;tj@rW_M_JdcdgJS4VDXA<#TJ!f~&4hN-xQ?mzug z-@qip+NNozSJ=_ULx(?<{r*oag1&N_f_mT~?kmlbpSG54#iD?eWVz-O3_LtfI{0-8 zVDj^X5?IG$tr?$IecC`H6OOCq%3S@5qwwADn)8>DnC3?=aU`0R4P;9 zm@@MOt1u${LP-@+s~ud6O`7{=+-F}+Ze|$K;tV0JIkzn)gdo7__t^>Y1m^d19JY;@ zSa%IIz7C28qBT5Ep^h3(W2G(5XxeS@*o)bd5La}DWwXn~gAl7PaKFU5iiyf{WMwf@ zt3>HjIP0|$TNR`(imOQJTY4cT7@ccG@HXvBx#<1!uN*Jg@TV*k!b{lyK{g-boo+=| z$-*7J7HRHR-YZ)y<{;1`?i!p0{4j$t<4LRsm!(M=IvdwiS!re|_4UrJ9K(VA$yCU0MY09yH<{sbAT_Z9g&6p-lu^xhYnlXObD8d=0Fo(TY z;IM*bY|?r6hp6mty=qN%@=J0G(BkMVTFu6T9NP8BAlc=K(6pF% zPX?T-geB{Jv;M3@D2}QVGkW&*)Q#8do$}WSo0^c_2rJOUe=nMUJSNNHs^E#$Nu?^d zhs)Yn@H8kNk9i}k^(InJif#2R%irF086Tw&-%SDoc_jA3>Mr50`%nB8=xJ|J9ly|53a9+Y$=PBf3Byp*i8^%X7{ZaBfAJ zB%3*JCpx_+Dnjf#aBmC3{$_O(adJfQVhwm3L=M8{dk|&-Zc;&@H{(RT*eq*;5 z`H15Zz%PLS2@i^r3mqXpnAOPM88n5nmO!74-E2fmmW8QhaAVrvU%X+Y)jNBWPQs88 zkG@CSee7S4S-;(bULwCj%(3~NxL;Dji+PU4?-{*AkzDFN+YfCBBdhLqDYHBuC?RU(3g z@eqCmVc9LZZ-_sE5&&GAkamCLX54de7wTTIvaHbE73c3Nas8XW&!YM{v_=B$P_|xH zI|B`v!l93yvN7gAaEb_Z9p=;zoWUcEW7b`ROoTo`tG4HOqmx&>Y1WM@RuO0YaqLlm zZkiW6#R&%*2!bBRhkao8H^bJCJ~-bH`ll=N3~?wDR!=lE&chG=41)*I-gSHvC&og} zoZmQrtoQ>eVtt#_nh{x@T`}!C1EyJn4~9fv>q=E?waoOJ)2l5!n&^6!fSDq8>LS?1 z?JA)kiXDPjp3z#pA=NAR_eF-7<1&h_SbFaLQ{qGICH{j&{>JCi;9)aF^Jk_9^z4#`GWq6QXWT_a~n%S;#B&tZ57?6ovFkDFyfy zn-tJbLEG?d0gwO)MohqflSztBs|%qrqY27y)^4ag4!L^M2Y_dvxepW9)03f3(Q{|8 zdmE%tbRY{Pjud48aT!FsvZWT!*(Fe+`=lOqI^FlurQ{|O-h7t*6!kEXB&$E>75X3= z{t~zr#!$J`kPY+-MXbSSf19$BR(+wweZKrAG%-1;uI_DqYeT=q$t-~&UxP*cg9{6) z`6+$|DB{nWX5TaMN;#ItwdRR1DAr(GeOI((mh&4& zKA8NsEBp&71Y!n#5xddCy&C^%n->wPV#OY3O>!lS*pC6-YMecA8Wg<#aforHvwv%# zM{b~Xz$J!_gi{U}@R4qc0GbwJx@y0$Qjnw?WzOzXufe~JR6hSlGFhRy&&4P+@}q*N zfh>XmR3Mt|hJP}hNuXl-FkV|@Qx_MsO!ncy22^B(@g8{ejnvr_6ShY)v06hPj#It{ z50ZK}gBVe*8-E2rZAf3*@x6+FF^uT>`>_j#v4wHYWR~|_9E4opZ9Q#{Qx|50tAY>Z z=3k+G8IP{1$=su5M-_RMh4V_3s7uz*et7Oik?d=AJ4pu5+MhS_X)^rsLL~(fFGK=> zH5gL~dr*$U)(a0xtPjh&q0hU!GbnrZb>H7d{Ii!|QHT4_5J%_=uy2%7;5q%|xCjh_ zyofxxqWLl1r>0BUSolC3YsX%KR{>`e5Ahz#$rxV6LGP@hk#+Jbu2KFpZb}zBaAD3c z+2=v6*}mTkn^l#~UJmV!Nc<*!c0IiPr(qij*N>vdWPmr2KKb+Xg0Q!x&g?_!>vg

6~CWyyu(Rq_7lHWrvv@?d` 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

  • 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

    -^_eJ)2WNr->J|^egCQ?aA(JO^=wTTN4+# z)ALJD`eV$}@X3oBm-ZuFvA=U0wpHJ}HTUj0h&$iYdkY?H)DWwhl?wp*qZ@WcphcQ?+--ZdQBzuI7IRLB-F{=NgHF{F(-c@ zrFGBj>9o9xOpwZ0(zgk^`-05UZ^z}xA8a+R$f3cp*FvZ~19U$u8{QV^#cyz>mDe!n zw4u<+){Z3Bl#AdGd`9)*Qxk#aA6%w!`bYE32T57d%C>$g)&`GJ(sq~#L)=(aH$%#K zpVak+7l2db-wT^kX>On1o|R{ZyhHsi=W45&oHsMm^p_32@1fem9ehGmWrP&gHB40| zl^bWnZ3WR^Xiu%OResv?`m{rxW11(sqMvpi7*-LFRMqF3;+w85eUT?;5!xqiv zMXB`T$(Ybv8tknlA5O-|Zo%5kvGo=(tY8u9KTynEz>+r`1&=*#05+ryy; zB`*U%#uiA9B()lCWP>)mZ)k>lg1K5Tvu(CzPFLfRga!Fb_h;IqgUy`gozIFP9$%!# zB)<&o>AMj4cw^5*P-j@h7GF2{=2oVZirBd)Jv@pgHV?mbl2oy?fQWw^l*KDKEe*nH zO#B?tJ*+-oK1^@SfV&l`r?g5g80&{H#%jO58b3~RUjcyDqR;&M+@wwvLihYkyPy8x zjm|y+lEPK7q~oziqz#H3n7wQ zr+9`esqV ziEl2iaWo+5#>sD45xmsN8JZ}IV{qe=2d#2n1Al9u9r)A6heY^iqg(2p8N68J(BrrQ z>8@_fpXl>iK=>bMn3Cj>e4qyG;2QKV+LG(X{t@sFiJ*L3e+*gpqej#)}RmYbTZ+OJ5APa%aSthyf40s<;kIS>T*K9mrs@zzWxz^&j zklWj%5?$hqfXW$@b0GP!NEyJ$2O;p|$8va1eM((U-1wJI@eI;fTiq?uu`^7Ft2EKI zxMHF?%X1+zyB0y0 zY~^#GZ66ExbHyGP_@M)67uqTCcAYpHmFz4nt|pK|uN%UH40&|MLj0h!b6%O@KNU;i zi%oUyZf&%|b!vXi_PJKtM~*U9DUfd36$?8Oq!-?Kz~lqM;nDB@9@yR9Ukfc~#2SUf zaq0^!QcDasEZ`(bv~F0C{_Zn?xeVFwUZLR)Geo}D?IyAC7lbXen`=qp)a>lwj%jc1 zKKXcLQb_W)6DzPNcPQl61o6S5SjGK^Z(*zJ-c+lr%+~=ekO-Pj-W}s{8zTWA$-E$!TZ?QW<*jv!fv$pJ3e`L>Kz4~V}IZoVSk*xT!ua_Sa$Fk5N%Mo49O zpb_ng7`EWZSjg-onTWw)r#(lF_@~8QB=~c$u9d8KUqjQrDqL$fR#HPFM*5OMBP!B6 zM$D42U%3wKBxK5P!)O5dH~S(PoShwJg8stdJx=y-wZm&XF$VJ#$TRb+MhNJ7;PJuc zu9L*N#m2p+_*2DD_)6OHczz{jK2VYw z!H!QeadrfffF~mr>$+#e7^2c$NCa`t(Ags#MI%61;#VO;#hii2$*Ue2 z@umK+;yZmR&KMwy@S|Qzvj}c&A93>oi)j!~d9v{5%YNBd4-ZZhEV6C`wshzt?C zntW+$v9xWy1cuf#DF?1M9)0sx{B0a>;VY94_Bbob^%&1u<9sCXLE&#ATMq0 z+Pe=FT&x}xcL0g#Q47YkXYN zJ^_B;9uVXN2_RdQp377sH%;M>l^1VN37`+N{8#?~1rYdq<8RxC!=5_u zNY!;O4|qRHFkd>rVUkBYZjLv>`AInk1lQO80R6YVAN)$t^sPq9=T*~Y)T8qww7b#n zp}2{6aAu6AV<$N~v5fOyIrx|MebeRt0D{kW9vJMcEi@bb37=51h80*tLmYt%rZ7u1 zn~r%UN2eco_-Dd47Mk-~+{DVUM8X}NTcG^Cr~~E?+Y|P(@MPZyyg{J&S6YKn*Yzt| zEFg^`FXS`e7Hz<71M}%!AMC&JlSlCnz`qJu4MH0`-73{AW`cI|U8O~rNZeppA?O4 zaT3a7XUiPqbM9yZ)-A0}H!w+WC}6>4M@9@fbp%(Rd=2<5uKYguo$(t`@pLIYkBaUf zxzp}qlrWW7d67zWRt&?hTJAJo18KTF)K@xwj}?hU1N|LJE1>)@4!Q`!NXe zoz%>rkDXMLjGv_da#}{48(S*Ktff0+<~;g(*T&!QQ0;TY7alI~wv2R}Rh#=rU1^fX zA$6Z=7+JStY2AU2p7r-tjgngEakaT3W@7m~?)Uubx4nE-C6rnx!+kz!kSwVzR}5Q>7Y4sczu@Iq1()o@@a{CYjauWzaktsZ{{Y9p z7V{ntVwm$i_G7(%U+WilI+wu7XPt!7i-_%F!TFFNI6nPxKpEEe!ebj=p^*_=cYaCq zu3N_7H;L?5IE}o*r>7iNww&ae}0Ks}bICy{dgT45nZQ*~1PvU#cEp&`Xmqy8AQZU{~IWLZzp~fF3sjH; zb>Z8r5zk1Q{{YoqEB^olgSK@40D^1$GPlx^0km7K*gFAXJb>}|*W_P~{{Z0T-`ZEk zHu{BymxX=~S!o)S4Qp|4{hNIxrZyODl9@)B1E+Xf z;hu}|v3xnE%<{u!d!$`WG-2Gkui6%M&Pz8YJ~B8spbzN}NVIp;S#FS*KX@LM^Jncp zrVAh1>)?FJWo*fBsm&W)vBZe49D{25^S6rpiI@HkjQyx)@X}dYXden~uGErlb!N)%->x%w)C;tG0 zmHz;0%ZR+CxcFMc{{YKx_(f(}6X-tIwEi^PulP9=_O8?*5hkPX+TB3G^1Lf2Ok;01 zM~~KkKU{y{o>!YZKjYhoEdot*;t=zoL77UVe|QeR{;K*g$U<*Om;lAoJcP;VyS;xh zx}W?M{{Z%o)c*jqo>1np2jeWU;}*E<^j z0Q?n~_N>?ZXr3aU<0ijnsY4n?<=If1@dv`Y zjX;S%v;0FGfmn~3e8_`vdXMX0Q%P{5;z=!`+N*+vMly4c!+1}_mSLL{Ce?w%Nm6X zabu@X3n)3-$Zf`X9FRfB859BiE$g<>%d09$q#NeAz&KAaNF;C+^z|gy#Xs;$-65aj z5A6+WqsJ|nu?B3b7#!0V8(qa!Kcq0sS+0A70b!$#jOIXoh zYpBGmcBm`2c1alnrfd0s{k(0S&;AM>@zrJl8GLuC0;`jc^+vqgLGdQN;LjVu;(rTk zdc~KDAa;^1VBbwW-Mf*?$1Kj}SnfRvK{C(nmU&MYs)UI`HcU!xAy+-nU z32!GMRitbHGQk%(01`7m9RC2s1`=snQ!(pzGUvbD6tn0Tx~1F6rQhsE+M!#HG5$4I z#|@bDwHW^ZkEdb}J%w~07;;)8@`M;>_dL)AUjxEyQ%#O%{qpKDM=JdVLjwXmlI#KvPYb< zZMj{dPT66CF`hd5SLr#{AoyS7%}ZJFRmJ|LrAJ``Ot(?3#CDR%5J+8Ii-6=T1 z3)i3rq4+Dp8ikzJ8i&LkLA3ju!*KH4Sl>w2MmND(8L|7u`^W<48^Pd{P1k&VplUuj zZwo`F_-94cptg!z`-ifSUzI|_+3u&{NTcUm3;@9LPEBxrBlwLR+U1HqqoH5l=|(&4 zJ}dhfTH4;-W>6e$04#;s1Zv#$IKbkrq46(P@qdA2xA<~wFMM06>XELeb*fJCq%f;C z=!*l%LL?a{ZWQfOd7uwl_+P0(;BOddI>xi%%YPMJ_%$SGXMC6%Rt~?vFNL^d^B9N2 zZTWM^slF>o;YRV!u@8st^p79-nRJ_^g685$6xrA&$DdD2nF%t&(#nCE2;Rz0ILPvo z;@Nx+;pDc`?C)l>vy|I;HfZua-NddoDm#s;8dfFAZUItCfHPw6$NnIL#gl7xIyIx- zx^0I|iUqkJXM_ZjS3*v}4sru!*bI6Q3OcThYvC<+@OVDMPt^Qjs_C&=>u$6CvfIP= za;q6Ft!~P$IAimws|74J=C^(d>Xu#%w$SvAHq$}B@MeQ0rSzI^p2(V9_ox{WSV%D} z3AnI`5tj_-I2iLy2U5}eMe!v(GvkjD{{Ugyc$-mxYgbDjlq{2EvZKi?V+aXS2~oTa zs7cOir@hndJRK#SpTqrrUmo}~L$WV@5VKodKJ>f0F<(0d;2stwgn8`~LtFcxS`f&DNO)s2V*z z9j&9af-R_FA(=wPuZP}M+CbY>V2bGf0BMgGS^PTq@uArGa(iR0L8U+=H#Y5W6n8UA zBTH`(WhA?0R2&eYN%f!)Me!z;Z*QUM+IIV0Hr2H2845*ktsRVcd?=H?(STg_Voh>3 zdedmPQ{KUMVSgWovm911x0wyXnNgKmKzEWPF|!ar13Xt-W8u9o#$RV1DbzGw3M-vH z#yh=ASlC)=gqB$y!EMDCZ#g{m?_3_Yrs%de8nhn|{8T($3>us<+RJCBwY{C>PFYw4 zbtQ)KjDNgxP6Yr~(N(qo03X|H-x*@kFU8Z97SXi!>oj;{87jC~fhED~$yO&VfhLu$ zT=jJ}c0sn)32X zku~kREwgFc2He~N=X8TOCNO?dqXYuOyYQ`zi}*`Z`yQoWFEn+wwicRf4=h(Q%loL1 z$Z%R$E(ilS8%_W;0Uo>I7uGb(7n0rVwBHk7T(nX`LtNaWF%lF+2Vroa?guKTj1Ihi zjdT(J015TS{3M$7%-2@%t+t(SVPq~X?IR3S%&b9KL2bTRlyXxz71;Q`JFO?gHVNS! zP)DcQMLv{mi1u2xVh3| zh9B(9bXen3&np7*Ork~#i?k+70Cti9{{Rm75;!5b({DUSJ5Ov_-%mb|ZE-B6Q!5R^ zu>qCPv5=tT4ZLEY@f6nn1ijQ6>sHbCocd5k?5Zjgm{UYEt8v{9Ba_1N$7~yqq?O27a{5Jzj zwY9mDOIW8cr23?U30^>1NL~3|>=czi+j+$RX!!HQ8efDy6I)5)%NZ5Qa z2KVC}Ep^s9KZ-nEWv57W7`#t+;#c!*mrc?J#F(ARAjuCRs;1q}0)k24*EOl=mXmm+ zO3-Jx)NXYcbqOxDOM7_HC$cP2+T4}}if#m-d~V?4fHb@d;yqX57PF@5pAVq0n@P2p zE~_&_&@1i1jiXjvADCh_55PN^bj-dy)%*eQ}& zB$CPY+0Yo{Kz1&E^Drck39ie;`gWV)JF5%rC&rpB(bCUU%X@5XYivT7Ijp_&-*@wZEA(zqFKD2A3h2`JP(m|io+j`o!v6pq-}qPIbY4Ex zJZl_^l56j$Lb@VF8AW?LOO4-YxpLA4^9ITvdnP8Syi^~jeyBhkPO{bt^7f(>EGLSH_+(%WS)JUipMEgS|PSs z8G+8lV4yAz;>ROs&2~TVQ`B2O_#xkf(I=YdP2(F0)>&IDL+UKx9(#Sq+d*G=J14QSVY6z?pwy;|mbD8J*zb8KOj?oyz?$&Zm$i>S}u03Q6@_|pZRo+E=r zkz){_-eye6HwOi==yUnd2G7CPMer@&PY-(GaD9b+J^ug%d)D-y2!FvzydkRizW)GE z(lq-WBUN{}yt-R>l$EytZ(;`H^I&(uuaf>1YCdnnrFc32085mW9nNu6>v~*z%yG7_ zYXp&@$ugqMih2MQff>O(`_KpMkAi<`e*wq;00l_4@n?yAcj3S6Cet1@yBEk{j(6Ot z2_WD$0U15`ueCIf+N0q=h;FC5w)mIe=#tf(IXa|4)Tj)=Wx2pAPC8^)^GE*x3Xa&q zMYL8Zl3v$RlW0B=7+~)rb2me%rqayjlA_X%c9@JMiN}V{dDxN%o7> zw*BLh0FQYa$GETOqr*Q0zpyUkxU{v?CX_bhd<1nE>_GW?_QhJ({u)|e>sZub(8b)q zNU8Q^npRQ4CvuWUY5@M4Z2tgi?}d2Pgr5?83%5bqH4wVY1li;QH~icJ7=Cro-h6EE zMbsXCpW`13U0TH&uJzTRWlv&v``7Z9pJ?Yoq z1+=!didfRbvkZau2u26{p+rRj1ji-p5&2@De%)lH?Zybg2FfvFa;B?Mt z1NDFY4o3L9;qQoE1^7i_@b|=87PKJOF0Utw!umUhgc~WAH(-R}PV54EkzbyE8G+^S z1--e96u8w=FxbfZgtc&*55uTDEjOHvYao>1w06Ex+_9@5T%Vho z&$*dQnP9Dv-hel4d}RjszS92fp4AP{jMbvq7%U4GIPcA4MRFtqY(VF+tB{tBfp}sA zxg5|1zxYW@Nf}+^1C;{+{c2D6NffZyfD_Z@=Azl=DJYoFZuHc+jc}xZ-8=C>7hv%q z34)}b_fBee@i03?YWM?_<(_LA>M0Kv@|7g#sp(Ry{NsF#&N%Bp7t>jj`%NT?CfTrp z1ZM>Lkyo2hxVSr(33(j;?DJT$z}HfbK3ND(IAR4#3dVs@$WAhH#(*^%OSVPCBoa9J z2+dCvlg4o801TW8z?wUW$lTIx?eiW7^ryC+7`9_R?Zf@9v;opv-M#@v1dc#GX%R6+Ti~71P+6o4h>ygk>0tse#4%)lv&B_?J`r*rNMpcmcdA6qJ0+HXyssb;XYD%*n3b1H{y*#d+}{7Y9kiR z&AV_p&IeCwzu>PM%?`H(mD`uLpZ9s-7~7~h{0RI-XX`n5&Ae(pWf@>8Y_uk@ySARm z{KrQdvOZD9e>wo|beoUuA!uP$xi`9mns%zj z&c{!@jY*x>FEAIJ5RGnJZ!E-?a2Ii41$+~P-b{vBTt>iUmBy;}((6;~5+pBp z%*%1+s97579iK-`#rX}!=ou7^FygjYz^DMD6eiWBYlSqcmV?_xxcEOf! zE!;e5y+b^#t_rUsxYa&9TzC)Sb=}UF;I;9U?~Amkw4e0IP5qyP+UE!48}l5H24K$a z2;H?=+lujPuZtfLW7H(^PQRze;vb5d*oRMw#$x2!X{wH>>uk&na=4O3jtL|?2k*~9 zE1uPLR?~F*jThmBT6Fp@mnE#;H@=TpEVc$0EYOL5P+)>ZE#~3;`4yvJ049Jw*+BX~ z?8$d)d#D?oOHc64yjPlq{N~8L%w>`0nn=Mhe84dvWDeb`KMdK=@khiS4%2kM5NbCU zNefs<3f@KbW|C(`Gcf^LX&yzyVTe~fffbWw<4qI9{{XU7+THEMdWMZRfns~9ZuY?y z+)KE$l5AB79Zp!N0A%B(e7ED>OH#De4~RY+hqL&LscI3$;rJrde7m@8(jw7Z#bQW@ z?KoKkA=~6Y()G%a53GJZ_^-f!2fjGmcqabWQ$8W^?~|u$w{5BUt7|%q%RGvWvMBIb zr6W1nwQvBfZjOSuZr3=vqSxL{W_Q^2^AAGOA*X0>yK@oDLJh zpAj^l8u(@WG4Rjg4~L<6&#dRrmm&utb)i|=fgQz+@#=8NJ=c(8C2j+d%6E|D4CF4}oj@q)e-ibt1NZZn{@v`$;@oBp8V`{gaA=EEkN3@RCD~M*1B;}z^phQ^) zRP^AsJ$f&LJ|OT#*NS!R8(Hu`xcGx~_jdB@n#@FK-Wb!#j&p5eX%GhP;_gRNBc|k1 zj0*yagaVY7_TLQj9SZjQ#MUpRc%ItpSo;(a{h=)sx&&!wC}WCQa!hc5TmV>{@HOtd zd8BI|0e=#B=EPiFNi?ktHdbpT)vlcE0w(9>OvO;QMNkJMo;dG~x-OydCs@`bx6`!i ztr`ZkMlstpjpf9_Jh|sUSVRPF0y7dmP)e>xJGxiw_o!=^_ptb)>MbJ9JucSI!_(-y zFC~IBEKlwv9!V*bc$L`U*s)RvARL~V@sC~jZQ=PK_!YDnoGgwhem1b;h9W?ENzDf@+X=B;ILII(yjQP z#P%8|!yg!UM@iJ|A{w5NH-~Ozwvsq+7FiI0ECUx1$e;-mY08Eq;FCZJ@%!Ta@5C>R zH@++Qa@SuGbY;7>(=^Mg1QIr)^BAL55o}hCVvrYaFPRsBFfma0yI;5P*Tp{&=za>g zzwrl)>>{|fp7f6<*)IT$IdE47R9OfB0#QI?fL6T19SZkczwosG03G#9yB`?%df~1- zH)o`o>{`*V@xv@lxtDUM2wX95-nKD-J*&n3J-5`a{0HGbfLGckhoSgNdyPSw&rSZ) zxYne35Z~Nt2X^PVmPBpNxZAmjCy_uNU1jm7!%+B2*G<+hv=140Hp=Go>l55aV24h+ zfb2HcByHOw%42w=2QnYtj+q^Yg|GZK<9`QedLN76lE=Wh9;0hEn`I5w{qnxkByn6Y zZ?r(D#xa)LlYxvHqw%f}hrb-YAK%OI8tcLupM!OcUTCCUI>{rG`$?m45j>Y>H%O?e zU4PVpw}Z`I(YzI)>b@J$B++b{&>_$(*H zi9RrY!5=&;;x@XryE@N{bl3AOp%B5h?TxfTfDNbs`FQDGJLCJUW5VLo#9DN#70twQ zK>D<{$+F#J8(+z0KR(`fFd1Wk*w19OnFx2 zNzO<-f^k3}lfFIiVqJV&*7a`(T|?zdbVL)|Ce(HEVnSDrnMN7)2D$sItpbj$U#Qr4HEs0>U#ez$DMBsjPLJuA4jdEv|fMS~r zo=?q>KyzJ|sRO=-*)tvIk?YSxStn02+IdNh#D~FL91rI}8OOvI+Jp%tw=;ko5u0wm zj%vO4jPGQ-z_^*Ve5yoYdV5z@HI$74yy}J20!}*MewCA{Xp3{GM;M_$j!kZ9T7ULx7m-qLHF1U+*bi!{tJ@@Y zUVW@aJ->Mm@pIOIGv|$3CeBGdl$J3F@J>#9no#X5XL$Rgk4ix*#t$vir2uKGEQ^o^ zF~$W~fV^`y-~c=?eltW9uF$McBc(-kE5_;N1B~=P;XoG}QzH15amD5MX!*fIH9xwzHVYFu7BX3h+m^YAeqbxDV9<@2tmN&rU z0g^$<=723p_kc`;o^#MtE<-*6=hB|DiAN!bJ%uvrWQYRCl5v120mzD3O7H;S)8tL6 z8=Mk1W73%q?;{N0sn1XGslhC~{;KQFIetxFdX3@-%W`_w5QXD5=t zV0Px8XBlX=rgvutoX`Sa>2X|ac;Jk-?xb+Xwrahmg45o?XM&G2lG}L6!qi;hT6Ybcmw!-d0*ZvaN=kY$P@iS0|?Us?+>0~CH{#TN-n4R`Cq8vs6WgBw)0X6a- zpW)k^e+t`PO}ObAo#gRa%4Ak|k|`8U2cS5 zLe}2T;vTm8Mzns-9B|$FlUm3*3dq?E80RCNMrZ=2nd5&1Xj)b6w}d_o*rtc1YU`-n z>Mx*4Zw1ZGr~(wWx7r%vm;hoCD=7(_j_L6~!5#|u$#bP^UOMn*ynIc0I~_G7VF+SG5g}FH-eBvR^b1dnzYx4Ntx9z-9eA$t%UW&rx2IN>E*Btt zlEMI23;`v&)_;ipJ^1TJ@Rje|H7!o-Rny)nmN~CpSgx5HG2ub(qiz@y0pfr?L9VR) zIqpLg%pMLf-Brb5t78tJMhB-VgYM+n1PvWV(TW>Cv<9`}Ss@z*Gv^Mbgg6;)KRmfQw z#WJqk02CaRA6fwPp9_A*nzw;`F9co(@aDIqSx0d4Yx=&M35HA7ScvkWvna&I!Ahhb zyTdt?86z$Dcl#)K_r)50rT+kiejV%9nr+pi$>HrET#^W|5I^~{eGb0g> zIj<-2uZ{d?@XJE-bbl9kf#q2qd#Ab9?yer-y8`??rvzkxPi$it6x~b5_jDm%#oZ@xAT7u`~QVzi6P6C0$wW522Y@XaNPg?G@uK;P)!&|u8hRVr|6oE&4S3z;BJY8a`{e*+_CdX zewe`~wDli`9}xUq;xYdK3A9pOTw2^qsm_pUw$^%nn;uabHMK_soGOHDN>O)!<2kPm z(tIss`m{EdFQ-j>=v)ZUC9R`lm)o2i=b+?)jEdXwuftsz!wEFHo#&YvLMIIC7>(or z5>_$D9ft0?B7i+}#eOBfu<_=HYyFGht4{+Zz_pqijdBIGx{X1V4&qFbA)g<)Zzyq+ z$AEZkPfPKC{3cQ~8h^t@mdX6>FGs!cOb>3#Ux|g%#!@12y@3)wPQmhx$H}}Yd;b6l zosG7o;}fK%#nk0=#6qKDF9qE};fEc#=~wmbHrCni;oKjkprT zgVAX>o(1rKh%I5V@h`#+F6&g&AhLU?H5p@?J7o;4rXq~W7jRL#B<^-Nubnkdiy9`Y zWjyieu?Tc#V`CSZq2wqAJjm2xvU*^i-RqeC-LSm)l|H-TJDX#DC7_Do<3>m1?-Rk|wLU0(Lee#JXD+!1+V0HdNsiZSkcP-10O|(^aq51Q0qTA| z@Xn>;ZA#|JekJ%3ZEa!)7Q$hS^)f(HvU9%$Avp&ag=St z?-RlAUYFqi01ZK{d^hmj&Zt8q5M4;IgMlgYuz>vsTJr5V!)ZXFB>dd^^IpB-i9&oE z@TpV5x1Lektl6LmZ)MGtaRm9IJvt}hR37!#&f!1^aCV&TBigp*urF^5F6L%%$Jk@H zt#kUri)}vP&|!BHxNn>Bpbly|rCZi`SgQk&LGSHehvCg*`%gwwaze@*V&vqu1#ks7 z$%u-as6M%_gTrt3Pv7Np6X$8;JaIrBJ=?nJ>bVR-7$?%J7=_G{GV>&0Z6M$&J$S2E zbA7%z{?3e>uy8s7RjoqXTuL%XW(9x3fFFB$+I}6?-5x`@Z#C zM!Z{y*r#3GF!|1KeUEwocAs$|v6)>-jLVSO?Ti}lwJ!_L;i-Hz8?rnS zJeMl@$=YM(Pt!HUJ%Mc{;)%(3m!aSu)!+Duj0Z<)$&q5QkYJpG*aPJvfIfSg;HB1i z+<6|=9o55KOCgblcs)9rf=3eGv0Q)#0L?xY-61SFC#RvH2fn2(>m+g&Qy&Y)Hr9@i zixjBWWbSZN9Y8&+5_@tkBMLAH>*#&!a?A)-o?L?-(}CNbXal5$16!$(0;mDN;2O{I zqA0R~fIG~b5Do=vStp%s^7L#{>Xyb!ZGd!(w#78yNr?B`cy(g9D#XYPf^;WnnKbYU2Yv2#|3eW`cs9#V~L16e<95PT*sFYEzUX~wMI+q zGku@}Gk`IS)1;M^7{$4P9V)u7oESEQrDSOm zNhFL(2@yTI{wB3nK|Xdi(!Fv0C<4p}1&AGZ`qYaX7Dpi9ag6a%+qvG@AgRVZee+Vp zWZ80_u)0~>5w~u{uBsUIN z?hH1bIOsn*0O;fbNbwd3&phWfE|op4wCdW@kegW}1O9s8gwMAp^r$1e5<+5@G!sVu z05b!|G1DKdCC!kzhAC$e2t~w2gSIywP6j#89D4Mi2x5&#hGUN2SpLkHHz938Y?cyT zce7`zxfxU5zRmG(g|r_US*^^P#F6VOZh}c-Rs{$_wR43X!A{Tqn&n3D|r^(uDtgGCU8yyvCau!ex0kJ)Vw{Wy`|KP7VSmZ zN7`7B89~Cb{{TVwil?vm3h^e68|$4ltR2f1NjAtZMhF?}?cWA~D#PNv7U3PWCDz?H ztF(eu-cCCD6UTnFg{bO!J@%lI!)dRy@a`}fbvGUP;dlgd^sSvw!}ri>cGn+ljbgiU zm{d$Q-his|3G1JFp+AO$-E6qI^CXQvWf5&vJ;v<)C;@H!OQdQVVSRevTb5YWg}(hw z1rd)2L1TfNrwl)Bei@$4jc?d7!ldV@1Ek^qP<;Sd9_Vh0@6C}nLsFhy-< zV3JQEcSDxRNygxM{ReDN1_1buFK;d3zgG=w zA!uCBB+Uzs2GUO+=b#m=JbOLvvo+gTMSk)O$uyy)4nV+T&mP}emOq9T&9$I)Y)Wtn z<<2_u)PGvg(;|jDL0~3JXoi1uq>Q)s&$r`18d@f+9=R2Wi$c=Y1yc~jD=f*mvPN5$ z&s-nQw{(3wLelm4r14&lZ8)8_8<+WAlc6Z!@H=g+OPv_S6gMk$3)-RDB;s9wa7F;> z&JVqDJ{I_+1;>wVB-a*XwYhf)ZWCycf#pJW;AiVV9+UA4!M+{S{7Cn2;Y)kXCgqHg zeX3@C_*`V|I6Vb(H)-MZ(Ivgod?%q=MGF7}%OkTB*J|`2XTB@bu0Fx2Tgzd09qfN= zZz|oKE3_@a0B6^+{&mY<_+sP3a@^W#QNiU&FPy8e07fy41IXi^lmX3H_^QBNo7fZ$PN$9++=6cqVVRdFK;fR*L3UK)^a3;e%$D>r#v{%%)DnO=~C-A8>|&C zEJ=_nBm&(x7EpSe@HpvIw8+iIt11sPM(v&Gn9r!m=V|HFiU8A&*vq0@K9{3t$#-b1 zH_jOzLRjGBxA%C@wOE<%+Q8pwmbx-4ZC6PkJBjI)+ z2*^?Y0P3t2Yx_+}uOhT*Vpxkx!q^CuvtS$#UNM^K=d_mA!b^QlK_*a{C5?8KC#hmO zsO&xJJ1r)C4@Wa;?Qn^7nRQu4*@k{nRQ3FL_n-`$dAvh3ZdT=Oga{ldDx@iFZ5SM5 zjEv^G%^7@msOkGWDQ@i1mW5(yQb`E_midVJkEf><&skhF*3BXaRgu~w8vNd5hmc6m zP*2d4?Ol(;zlz%CgL(EFsMglSBW>dI`jgMKbu(PF*3m-fF&M^uJ*%77R2AHT zuvmgRb3hpISTuJ-Bx7jBY(Wo^YRu#xPi{Y*WbK)+m7Hz#=eNCdb~cMHk#JvOkRfd2 zKa~Jj@bQttDzOB|#!qb3m$qiUa>Q_Y1JbEjKiO{W@fj$P<+1P0Xxqpp9%Czh__GZ1 ze+mGpcP1r>m)eW>^U2R@=kG2W>h?uv-5(@pjCv7Ty6cnXD(#J;0JmbA|-TE5Tx6@>bOLx3dsdC$pXQ&5~MF2r}XXMRp%pH948w4Mh+db=hP7C|Mqy!_5 zDlZjCrb|{<85tuTGg8_}k15}PG3h`X`fK@i3Rk*}{&fbUeJeyFwtcK5&U)gTVJs;hQp2bowJp3$ESTgK#z&!` z3rOQ(5{5*&84c*i@`os0?`M z0T`+__iN_uVh%XZy;YZ4oXB=R%6JQmkEoyv{{Uw({N?bwf#C9g3bz!+ixnV%c=a`q znzN<1n93M}ag)hDv{`GCC}7Ky#PWE>0CXbf%1rL#8ONw`)V_3!E3r+(KT5ZuYL|W=)Yk7woI@?R-Sc#D{n9&w=|CIs zh~t?N0a*z+W65F%Ao^Cng%;vhjRT@cV`ts85TpZw2d_2GOL{epUQ5&h%^9}{+48Ey zeAqq4f1PRQ8q#=mB5Rcno?(kS$P5@9Hh-l6SBlKo_rOz9-T<~ z*VqZBCbssGUdF8hK^%-o1(aJ$K?&222qvO<& zy!+SOI!)!gz8ul5;nO9%GTFqlOB9O<$wk8v)rNY|2QT97QKkDms;Pp~96nJB?jT`z ze=36aQA-<0Uf#}InK)+21-kY)+3w6}F_xywH6pO-7f@lwBsqrNQB zEG(|M2&Z9)WPzWrVb2r+=921=&nQKKb8} z1Ix7gS+7wR);aG5xF%4jM!}rq4!@0LO(JU^B4^bgol2EdF{#2J$^2X1y?PH0+X5ThO2b|n%tD&@$!29R5`Qr@C zTx90}8s;@kdh=Gfnp=xoxQvVnuv3Rq$vk$iane2+&3UVNx^%W_N#3$32Pt_LJP_~dXGD`bdTXue5OaYAZoY#4zC60wOb1)?EKduo)fi|c^D`NE1qZrn(=SJ zjVDdj^$P*1N2TgP>E?vA)uTQ64JO&F}xvhNHfE;5I5rqR81mtm6eiMGiJ_X1gCiu@S;Qo)tH{Sz#XUq=Uq2VhU&xZ65kff2bg(zDxeX_#ah>=OMNcd-$+RX z#0$I1Rpw$(0Ar{;9=NZpJXQYy1l!W|Z5&@{pBg?HUQZ$^{>s03ZKXvAJ7btP$OynW z2c|0@!XL0Nh%WUQ-tWX84CjhPZTD85CXe?CjH-ETGEO)wPBV-FlRzIf_%A`!ykD$E z1H%b1t1ZLD*pZT_J@Jl}W5(KG(clV*poQ9_2WtiDHvKz&E7vto4@dAp@9lJrO)oC( zE&`T^WBH`@Wo+P%qaTfVhmS6oR76{8ZJ5a68By5ENjW@YfyoAdIqfR(ZJ?TOv8-|+ z5=I$Skhg57anPRm0-(_RHt-QNH*&``r+cHgc!}!#b>#m5o+|dEu4y-#e30BtZEZ0n zO0?Uyo&xPS$o~Ku$iDGiy{vJIX>INXN{Mh$V++9CamGj^*S!F3$#ZQj$%05z2MFP@ zm&c}he>%BR%NE+YAXu*SS#BeC z+#E-3B&?YoG7zptcqgrRhsHf;PqoyexcHi|8@W(2z1qx@x|QPrTV^mj4h4Ik{1j7A zj^q9asrxG@hV5t2uGP*1}T1{6|UX;>H>pP!|94}^R_ zCZpktdxw=#ZJ@@@xpR&?^ya;j;q+xbA9yUHwnmPwzc1cx$BF=3%OeIPxFH#{@{Z@y zxy^7Z?DG1l+)u9+&}*8xy}uq{0Tl>k!TC?QAEk3QXLRJ;Fd%OFq#AFoPXH&caSlVmI!J)o)# z+*?ENJDj6=dQIRos`0i zsGUd|$o2Zr1;{SGVUVmDv4!`h>e4NwuCs=OMm}LD%a3}|f_pCzTg5k!GQ(qISi`-r&yd8Ddez&l%ZDY)^anjEEh;czE(qs^9mQQ)LH__*KouEfx`=s_HsRAI ztqkoSym9IS9%`M`#36q$VZ8@VYIK|g89C1!&;-h4;F(>>(pio2H+dNV^Tg$WJuT>y7eIT({xu)lQcQ;>MnKPMp&ilrw-bVK$MmFj6U(+1>(2)?0W4X%x?rO!2P9HYZr1P4 z;-{U}Eu>9t4#jYCa!xwbk0wvday{q*3!A(m7~cR5p-9d>>5#}ojmXIz#W(D)=K%-Y zBx66qYTPy_m3|2H8O;DT#_!0J1mPTD@#$JEr>kU_Ts9oB87oo2YZQ>E$jY38M|!r( zu24!d9^7G91pCkhn{5)+mLRI`;kn%0dh=O2wd+S7_~2!ZOdP1n`*ZJCt{zMKH1g&0 z1WktONgRwHZk0Kgd%^)}L~H{RxQ#|R1b6z-1qdzCzRGST0y&g39DT~@byR^gcsC~a zM2YgAOLO1z6`Z;P+}yxpW@~J7{nf`|R=h_bT>;YE`DGn2bHKw20HLUAQ`q=xQM8(Q z4w-K6eH>d?WHYo(vO1h+agU5=9^9J!IruaCA$b1);zz(ghkhrupHGWQ@jr*HwTnY+ z%Pi4HA_ft-URCkb6NRtM?Ni~D@B1|B9zI=ID3`?3_*pDM1@iXke{K6oe!0onjs`jF zU$lR*V)(A#_6+zvY2Y0rPPn#D3TehjZ?2LSF3^MWADNVe#LI zyft@ir+hxW{?xX)g>EPNVze>awn8!z`#@vMk&+vMz|C!VPxc@2E|se379SCI$9rVrrp%WB~$=$ zkT(vMrGIVWFA~dh;du1#>=`VM6I2{M!Vm~$WBa*EblrtH9E?y0%N`W}0D^vaqgcFz zc#p+a_OQ$vWPsQiE@W;V<|n&Y!R8mrwCKT-B_#IA!un+FGU3 z#@RR}RAt9Oo(6N1#eF-c=vs}8lUwQ@CDht&I!`@r4X80X5%+;yf;#7(^);TGW#ZP7 zYY!6KM|d#D$-Mp9QaB1o$ye$+O%Nq|CP#{{Uo-9Z(Uu zOFM1fw2TwMKGmV(FW3SF8g%+*sp4ymF7@^i4ZJeTY=8~zE&%d(9EBY44lC*r@NQO~ z`u(-dPDrLJ9mSbgX7eKhJ0%+jM(5_|j=a}b;vGxF<4?4gK-6wL+r?XDwTjnuyxUMI za_BIOFhLo~=hA>aMAm=cm|9ndwC}Wk!ey%4TI$M&{UKm=gAIY^Y~hsl-N-mN6@}t| z_$Q};&Fs)$c*9w?v_c|;q-k>;r+`B+<96b4$KCJNzQNP}73vywgi`AeS-zUs9zsg@ zQNT&h@nE{QzCg`r>h@MzY>s?+ZK3J9O#cA5igRrRyo?AKkIpy<#DTXXEHEeo<4^cx z+kGl`cJW@MZ!KVo*84)e`6?od#&AD4Nm&n_fJNi?#Aj! zVU1zq=UG^VWZFR=%dLG|7r;pTW#Q$rwAE9=`pwy5vlw7&siItu-9p8cSOb!K=b;=| zO`-e-(L5a*L!enL{r$8mi7n;FoYy!27Hooc=Omn*dQb=F<9^J(4*t`yIs`g}&~V^l z!eY{>Cwl_8M#ejloB}=bZGUCo4r-!1{{ReM__{4V9F0Nmw3woZGPVg>NgJae@c27V zTKyVN0cqALb2o?W^t9DJQ$4ow@thBpcAv};04JKoxUh#w(hbIuW#Q{MZlxwj$s401 z@BFwtoab)<_A~+TxqF`HUl6 zfrZH2GEW42ywYnH8a>67k!pH{gpiOH*5~XdX(Jqc;p>5b%5mx_1M{a_@NJ}?BwH^Y zcrGaCVk1?%ZI3Vqpl3KM$6h|P-Am!$h8W#k=$dpIMax@x5Uh6LW{01@*W@LsgFh|}Y0UUhZrvw_~bq|3*41OQoUCD2yc$yWS zGcfY*h2^BGoD_&Y=U$`bUcIx50Q|Z5%i%fx974c}@8HJksUU(-mWluyixZES65I@u zm;(l?YhSbXh@V@rT?@rO4&t-CPqkXfapL%4GC)R0%IHXZ5KL{;J$qN){yX>st9bXs zm%s3-{28M|43Z0pt-NV*E#f=Jlv$M`kN^lcT!!1|xW#f_82UncfImKdCukO*4{RnrFY#}Jrk2T+&kd)F;GRg?j?msv zP)IoH53M`HnrDXYv}ta&e~I4+A+fkYBBAkfwd8G{b8KP(PCDU^eJk|i;ot0|;BSVW z7{80c-?Q(51aR%2?Uu`EZ|ximJV zcM?0)QU1z$ls86Z@ve()WvH~4?Wqq7>J!1Su!Uq&!JS(lE2&Y_k6+PSNAN^iw6f`* zB04I_Uftx9Tt^F_{oeR4)8n?gmfYLRs)W++3EdNat1QZ+Y3N%V zSJk?Y!u>B#irPOJcxvHA{Ju!F(=VG;MO<#mVUVCKc+LRi*UjJXU;9Y>H~T956MZf_ z%L!od1;a%hz*L^oZku#=kc6tTkUA6FngINqyw+b+*ZffT5E~nd?Ly{bY{Y)!b;It9 zBaf5ramUNY72o(eSv3Cu1^7?QOs3!xN71C=~u}N!l1Nm`zk_Cw47z3dm#<_dgKwUvj*dW zIuTtw`k$3%c5WPCZS?wAHK9&q)o`e;inz`)0QIfA_g}Lhw>wx4nESv`1`L-bRwxcU z!WEUfeJSTpNFzaNe5PVpjOTqvs4RCjGRVx4?E9qfbKf;$CD z6^U~(nKN##2+#0$pa*HT@@Oq5+e6|;1TbNYVyC|G1h()6f;4>RC606XR($^eYr2Se zk+;joOk`DLf8jp0)gXcVo6BTbV+=SaxX;qP7VA*^e~ZeK zyuqd-0;KYxy8bvd=Klb*Ou;-&szrt#Vk)i)A2Rcw*1Z|C7m9CPMo6?p9lwas2h6%$ znX^HF0_1U1?<(h~6_2K06F=^Q6wcQ6J&kCYut^6$%77u%FfV~`<6d#V6)B%;h69nu z(x_?|k(;!^=REVpHD@e-Q<082;F(av{DI$w;^9<#Wa%lp` z1N^}UJ;yluQp|xsI0b`bKu01RN&Xc?q%Hjocp_y|{t39(cQHryNq#IF zMqzTniEj<%S7tGSKZ`lf81G-SfACAs*@ExHAF#*6UlQ6ejl5gotv>HiEvsB&>Hf~B zvUxb!69rHQkOW>_OB2wlR2N8@p%Vbaorr!J`)I3Sy6|>bK(;w{N z3b)&?)?(;E1>9igDmrx?Y4*PbpwqNjXYk#%ly?_5Uv9Y)T-;6?ZUdDra)g1~gXvoO zr^cW7L_Bw-X`Uz2ZY>9iC2M#t1o263X9IT3h9@KfM;w4_r;6dMFQ3eWc@v!cl4L7> zQ~|{w1YAdKli0_mt)yAro>a3lD`z;#7{TWsr9i(8Tf@RDtqR*fwLuq@-(=Gs5K#XB z5yOs0Tzi`DEcHnA>*H;PXs0=hZs>c8v8UZNwC!l|N??ZX9*yIqy zxZ^)cp5Ni4TuHNC)qLBS{$wiv185@!d-ME2S64Oi>Q-N7*5ZZBS`9 z4Mw^Fp7p1^w_zlOp$sGo>*_rXb;iZ@Mk#Q?FCZ93Twwc;YJ7T1Up@m1d)PS0UcZic z27ox*UxxO!(oZFW*@qBY5;9Jc@DAt*>^her$IT447HS&)1%Z)_^$~z8z^(=<5!Z zZJRM+gx~RJISP$ z&^%Wl{P77%-}U~6k}WZ8Am5}S#WqixlDj)d--+Y!pbl40_)DVrcf-(FBpQsGWFrvD zCi7;9Hze;PaT(`7(x~{C;LnG39T}k2n^1TigGY2+M>J#(GE|P8k56jsW1e_i$)!s6 z%rYd0X60eugZEFkt2W6D@H^N==8^uk+C}+BeUC%>PzRdF@Q?c<#2>Z6sC}9@5X~%D z8(46X7}&Paf$A%QvWH8&n^BKhwv)qpvIYA$*!L>jDaZ`MOfXWw4WtgE74Q01i(zDr zbf^&{o3F~2lR;b2`{g7eK1@;*w#y%2*{Y@8#1F9CphWF zZfe>Nsqp4lZ9H(7x{cnWb>-Vd971T>c92*y{nP4S0C9|(icLP}PqLEb&iy_Uw57|o zVUT11az1ZNPzNt-@MA{3xScNaXmm@nx;I;UnFMlR4WI>J2_WOHMSQ9M00#qF$7}Eh z;75n_;WD4?ONb$f36=6}CPh)W<=-v<&m@swZP?ulc@SPTqZ@+EEm*0UKwp@zJmaoF z;8(>T@NuraH-$U{@GoD|V}e;U-9qO6)m(2+v_WdpMp=J|WjbUW_aI8dV(w0d>qX`hI}m~!J+fCnB@R<2a;6RmEUU8c!uit zR@IBisp_)JeRSoxXPQ@;usa>{H{pu(+Zmfq@UMplDz^Gm3J+ge0E5L^oL4tnnU#rN z3XGKY_O4d?^r!Q;8+G1gEz3MnL0i%8e>V=#n-sE+eTW~qfGgWT2&>SteW(;t1{b&PnN!bY}?swy@Qn-{y z7szr5#&cC)Rx$?5bsPazCcFL6BmxgRM|uFUCHC1#Ir@r@Ysl_X5U>mfW6o-f_aahq za6JuFwzpwEX4|oPbIG6&MEE;&+GOu}A!dx<$87jGWDK~^=0$pg2e;PI?#W4Hghobl zxT_q0I`f}`Rw=0XBVB3EGk+hJf4Wgsf&BQdOS_S7^{ZpIE@B{o+Y|xvBoldYltYAm zzNA#LT!D`$oy1`CS?fAu8OIr?2}e`;&;-okr34;*>B(?Yb~(X39+gd{{qQ;T#X321 zIXn~j&;{{$SmlpwQ&RcVoUt_oGb+Tq#(l@rXn1_|jv8gS|%x{fk$hnmlZ z%&d8v}<9F{%(I@SbQ zqkW(>fp9ph&}xxLPSzhxPzJKyV!nW2?BvXL=sqXd2uPi2wN!-JZ{m11%8@?L&!LC_+FuL#x%WQlz zb*))z#wLgN$#rcIf+kna0{LTUQVBhBEBYM&0D?c=*!Y9~361b}$lS>l%sv-^aFcRT^wzniTNZTiCG@?}5(KkWfu(0}|ASK{TDhkxLoe*?6s@3h6#FT6IbZEG#p zlQfGPlxEsU$P7TwazLODpgueJPf+nMfGsX;w9Bi@?+ofznyMrx&Ygr(4dyVToS|W~ z9&6N~wu@2H9yUo3ZUhpz0xc#5a!1D<^-1EaP`wF@$?;LjPrWf^iu;aV25E&Z0p4%0`_fI-OVn&LFu z`7SNK*Kc*BY0^keMb+vlLH**p_|0%WJ@G$}Z0@DH_-W!lhG2&%%c&eJ!~OK11l%NcB+@@vujJ@K1DzOl2p)^$A}!ngNGOxF6P)uV0n z+R;kN-<<$@Rh8%VglQ5Orc1TMz17s!zI7lRj{h31*_)$L;ea6@WJi| z{{W3253DXzhC{8}#$5g?^#Z_f3wVI&X?ntgr~?2guOe5uNdp?RCRy& zEl2G0X9CLK8?-x=LU4$ZJh=Q8fIhpq)vk4E#A)Y2BwQ;P*+Y9{xT&<8!eo(eV0FGf zEON8S9?p97`M#C$7PJ2V1a@B7sFQo{{Z94CN&9rv< z8s@x3{{ROdd?vTQv$@iIG4WF3-A*O3x6|#T5(ATo9%dNFA91t#&@QBHEV3Ok^&9-g8FSlpR)$fRr`Ht6IxZ1)xBU$YJJY2OGuM)xWExvtzX1Gd0FrFu4%e1hT?jgm*U zvyIib%dbK``JfMsmR;R?_Z1+?9mhQ8opojtJ4&DDO#$SKY<&+IJ?H=}w}XOyl%>e# zkU;3iBay-9r7x8D!0XqF0CY#pat7g%NUT@@I{VVBg-^}L*MUwDJcJcdp192bCqdXB zLr;!XB5mvYxdq-j@_?rpL_@jt=9JKN5$Fv64Cw(9?~yn~wPRf!sGHfF4O>^7iXQdFWR( z*jz-Im^$F&EGk%=?ByCC-gg=Q015z4CD>(wr4hITYV_;HNbSnL)^4ryoiHghu5_BafvjhF2RwIjeS>M6#AkvvUgn01njMyVs{mo=*zh#1*aN za>{ZD2S1ms08v?_3xqB+!2r|6v&@g>0s!ZeoSNN_!#6jmtt+H&xR!NKne+Yb*{jj` zP?c@+H$5;hKpe8#PFU_6aon1*1+2F4%3K_6{Q0hwcpanw#d9k5!vI08jVrq*KZRP4@^PeTpS*%8-yl zDu?;FInO!HE7deV23uOH#<4?>O}Vc@@aMwxyI76Ax+_RB3d5eCPLu)jt9Ylx^TYe= zuM#qzqwV*EAN-3|55%om71g!PPB7njA6%UqJqTnoG81JX|L!}T+C2)Sm!{pFCEV60Q|WB0EGVfOAT6)l2(-uGUqM51=*lufiV){0R7}yFMN1eh$CM8MP3{9O!@AjzAmm#Q=XUx>kn` z-MRk8(`@chatTEfZTh#(>+4+0$qG5Jsj@?QtT z&06o}kHa#CW3(yK8BTu~ffc1~@I%G%KxDG;ezzQ7d73RM<8RmHiodNWz7Tk2kDA^Y z)0#|R7PgC#{{Vc|gYe%=8%@85^yt+)2ooTEF+d;5UWM=j#r`z5p6|mx61vr4hE|4Y z?X=T&u}Hi!J1lHfm!Vd{9l)!)KkT>TeR|~E=za}1H+=s9ql+lgX8I(kroXF84~5nq z47{52!kR9ZV09aXYp9~NRQpVgf#w~fm%tpJpmS1qyY_R?J|f%f@g9SuOwY>5APXut zsA0(bCOR@g1m}L%FfLjgJO53`ZR*Lh=~BYz2Fz?O9b z>TqjkO#c9a1pd)_j#_^YEJv_wkavDK;=iL^D@ec6bjwRkYW=k;zaM*(3RH+=5&mM!N0Dn4KPy8Fn`$yf%!&1<+$YU*qku@JTBe5W& zRzVt|^C4mS@7sz-NKCGy(km z>tFC~*T=XtLOeZf;r&K*kRL8v{{XU*J){c%0Ff1|;h*?6gW~q9qua^iyX$Q#;nXzN z@mJS z6`t#IustvW{{UM3;)BA_+uF!&;tWFaQ@_|s+TsFvBuAT zbLAvsF49aD6n7+^1pt34{{S2R0AwGFzq96{EFT#>1>$W9t>SBmjn1CZBoVGRGd;6R z02$8a*uM4U2J!Bu^6ehpXU0dBD#}RuDLC(6)ZdH#Eq>456!?I?Dc3d6248r-Hj_wO ziy2byQJ96?*2QDVafKf%WN<6~XzVQdg{{V;o01W(7_MJxMA-VB~gyPd> z`wr)xH+$WYn9?A^FpHAkIV`{$0Q`5lhT_%%Ea)CSGT~baPi8%jwMzs-SocY3B8+a` z$p*hqJUROf{5k!kwBH+PUJCd{r}!OWyiH}bx#rko)8Z;$?3Xc3CB40?9l?+(mE&Sa zjIe6rz9oObH9iGv7B(Is_%HFJP5#W*Y(&=9dVh#wyq3k*LlZNs(U-eG!ya0&JKJV@ zU<32Y>g5(ZHL4+D!#i}S4V<$8=?L0JLF{YqYrps;Hj}FV0A^e0KNfsRYdh)2{%g&D z;iblzV{}Pvu%ea{t1iRl1G-4VDJn8E=f4sE0N{^b8~h2aUd66yS_`!tsl+ent`+eEuZmKdA` z&U)9pc<=rR_wkRwcTm`Plfie=PjJN}8frG6K~N6D@u!y=IU^41oF7cr74b{phmXDj z>yM#)Uht=gd^;p1T2<6EhuXk^a*U;;ZU`W&FgeCa1ON{-HW5uX5;Th4af(>%W0>vS zRk+~upT@Q$V|%N#5nI^a7k$gXNl5?B-ksq)w|m&6xOTLSm7z@h$}^k;=|CSSHk#0?i=@i1 z-mE#}{QA_k_7Rk0l|(ohZol`45<^?HME)~=$mv+6QFxEcYduw=&AiDRsl1j~A22?+?MfOc z1d{n@Jrn>*WA1Z|PzEi|9^6rD;r!{v?qq96Rbq-pS%~Ne><_JK z#)8sMG5p8d%K%D|=yEE>&BRxzu-(OPggHre6q5vf*KYje=72d^zSHF}l_d)Q0CkET zr2T5nmv1bjq+mw)3VG$v_}0zbUQ)*zTqKZzoJI4D{xvP|JZ3@-W4^U|{fQ z0w4HBE+UB<`)os~Ea3he)iDK-dylu=A3tu`5hMUH^**3hl38DASI2o`3jNEC!2tCj z{(`Mr%c*M??D|w~J469yjZonFfO*C{PzGc^5gLRFE$#=HK4*;l%nmx@q?h5%_3+sv z#|p2_xsG%A4wcksdUuGBt6Z2NiJK)PK+gXFi0NGtX$IyEw~_DMK473={&WGw>0Sql z!58giWSlM?x`XeI)vu-K;#B_tMLu$pc9_?ID{(wDMaKQ|?L2v0Z6A=$TZ_ZRc#C)) z@!o(j7sG7;<|3SDIO3filaca|&%JaJczu+p8OKajn6wvasMEa6kYMGu-!}4|Vu$ z`)d4L_*)v<_)A*XC5!>G*Hd-6wo&iAvnciiSJ1x>zu>Q$y}3mA)8Tsyw2f6B>qoc{ zwtal5eo}pdX1*O7)ux{kiSCwp8|4gcHWBU=b^25`-YPfItb~@>xKcRT+i}R_iU9p& z_;>#R1qb+X@dcue)5KPqWz?;=?E0|#BLnCezDE2Fdk&YWTxxb}bEHpcG&2p$Bt>LW zJ(y$~{5ox7HIbmWw);b-GDNxgasARU#ardE8;H_=vQEtNNsO13k;62 zxM* z;&+E)hChrNMv3A$RAHqGY%aF;!ClDb>K4A8_$B`U1z7k~@j5YW<4tOR1z)!wPOlar zl>Y#+I%N;(Kp#+vCRsAFKzn6|NupI+U;b?9oe zllZs6v9sPKzlfktvP8aI`1*7vy9K*vMlUKZJwY_FA--k{I_}5tf&~C`ULW|cr|UOM z4b1atw>jn;q}apr>s^Jon&EfFDP=t50fSjukAUp8_)6-DZE~x@c3+u)A6kb=_+~VM zr$p5*VTq0rT2C@Rpay_88DuQW^Ap#R+M{%4IF-udsHI;HUO~8}&zkCfV51!RVAOXy zH2!98z$3rSKnnJ#y4(lPTq?P&%pa z=qLg!dq~yyPjxo(FjqJO=~FF~3m##TSLY>5W}PmZ6Q}x86Pykkr>#kArd!4G!80yS zc7xaRpbYoZVVZy6VY$Er{{T9Q>qEDQhK*3;`=>bi*0Sj8CoFj5<~bCvrokFzW!O&# zjyDPmAO%r)d5K?&|a!C4B9~OKr(7bKo$#lOPX|@`sopLtKZF3Nk8Aqcj z>OH6f^Zx+j*M|NG>wY(VL&ExZ#P0@P*a#zrZ53?evnJv*6cRxcyYhi!*aRS^8|KGR z^UkrOc$2|;@<*+WOIrT`glh5ae7Qtd^50yvqDx7|HTKW#S^oe8 zxUumrli}HaWlK*EczkIZ$<#G12J$C5eyMKjwrF8xIkhY?^8mvc0YN#h0r=PZI`|La z$HhMmSWBc@{20-EDQ^y$VW{fYk~NjZzs(?m*_)LL%eb)*xRp{@AW#Q6@XzB+DI4e> zFw;C;J^lRm_Q|8(qv@JwN0}dz3XP~iIO7$*_Z|xP!K3Lv4dSr1@UM?7 zWrM?3x<80-QcJ6p0i+hzCox4FXuaDk!;*4AtdEKpzYjh*Y5F^h-xnVk>KF2Po;uaM zO?6{yZymcUB<~%ZM8=XTfEx;-T#`;sZ2U~{{2#R^iTpWvW8p}=Lj|i{_;ej}QaX$3 z(AsW@+@voWPa*?`j$i{xl{sJmpbk+!6I@?-8SK1QqiQK2;0fh3AmOOH2w zsdh}2+k|AyWbt03`!PwZcoX2xrQkn`egL`g4}+UhxU|;pbv+*D&f4N6KRe#4g*Pd+ ze4`j_xlBGsHD|`3v38NG{6M+*i}2gR(Rf2n)pW&s>9ns6$>hLb5u0`X&6VCuXtsg2 zBNpWai)S2*tuw^89}qq-d@(onji>nM#Mc5FZ9Zp2i^+y1#7)o0 zk}v@7!jMIKpTh5tzYD$|TFc`M%IMWlsV=HOj} z8(AMU;%Byte3C0~2c9u}bN>JYtJ8F^6ze}}@Ok)iG#aeX$!Tk<-ORdmxKa{m()u8d zC3a1yMn@_)4o_#{-`W@AH|+%4_ks1F3+nzE(|j#)=W9M3@ND+~0N9qXm04j~1+STM z(nYmE*yqL9xOjTCDz4yzb1Q zZlBEB!~njaA1CWR1=T(Wc!ux7o-=~_3*9Sg1-#Rwu$9q)D*jA>Fj6yuKn;RL8a30& z4DQ1_&&!WYR=@2z;u~Fe<8O%Wd?|DG>q|i$lV5*oT7>Wvcbok8`5xR+I@}8AUjDDKbXXx=NZd%syej74Q^@m z5oxLI`;fG!?&l*Ua(VTj3G|!q?3*N)#EWR^++`fS&|a8W@qnX@l5xnQ=fv7puabl8 zv)m1_38dJLM@$ir53XwEwwWHie?8sx&8po@idsJ~NU^R5$__bRKZ~5_wL#)v4?$-< zv)oLRGZh|ML>0$w6b^o)6aklcYX*(1TUzUumh+kBUDLe8d7Fm`uy9AAtJj*InV`q^ zJvpO|+bg<1m?0jgxux);{{U!eUPN<88?yOv{iZF=A?OrjWDfiazp4B@kKw+X_N$xA zMw!S%9kgVy9*Q|9o~QAk3{6K+R<(|4*L-kecEC3g!8l{ae!NsS*P3yK&Ybc)Ncf@7h8=%8?clX@W`f~?a5-fgGJc(@WQ~92-Pj*$ z0O1$l)VG%o_u8b)Tjm)|kbfGlr+h0*T}(%NsN61dlttQG@f`(v35rQm<_8%$ZM{9e z`t-U~QA2*>-Bp_bo8{<#8UW7IyfT_?szYxR>|f(%C5if)wAx^bA(*5*^u}{t0E9j_ zMse4QY{?_WR@ob-2W-#=2lj2`jHcEkk3F1K$n@KY;|A=;F~P%Pw1$puqaSH57IbvU*MYOr&Wo&{<_q00vmh`h7df=D%X zEhA<#7-j>L>p&THns!_FU?vA~&*xJnne%+_yFB8jp4h-i^Gs?FAPm$;L>EjMCkT4v z@JRYl1d&=80cl-TM@)`t^^^$lF^z%1&j*uLlSa-9NJ@`h^`m3t>Eq=uZK(}I8)hpkJm#rw1PJ$>SiOUwdmuUk(bSMBY{AdFUNz!cec;vRZ zyiw*h<$a}?k3o^Zs}{QcnR$5jx?ZI$?X8|vN4sy( z`g_+eqx@FVwVBdOE7iM=;OG1m z-@`sINZ|OL;eB_*bAqWY#j*?QQcr)E5)WJvUrYQm{i3`j@kZTS;m?XReMp{>B*7+M ztWSmq@UO=GKjH?nq}+IA5baRSIY{qzhSYlmHr>V_9yFKj=v0lZQqQa11>G? zdcyXIkj%rV$_!8gE<8|f zGy98#=QvZ(<4FgJ*~pFv_P9MuZpYM9?xS0&Sr|4LXX{z=cy*$b%WnH|+;v(2* z!k$zxB-a)3ANET4UGbxQpA~!u;hkz}vFA0_l9rbpoUS*1Gy(HZ!%qWv>*CkLs~;2m zGJ;P4>KB)ucZej@RWDn__G|#fiDnVou~ULsaxg#*!LDn?f3lyC{3r3&#_!@zrQppg z;ntBPmsSrQi1ML;jQKYk+&$&O?P)W%JZ=F?VCU{X0Q@cR_rh-m+GrmObejziNYj@V z);3Xyp@?!YEVMs|-wD1Ud_dQ=zdiKdvs^(vw5%IDX1R7$ zg%lFOBxPctg${V250-yvPZzhwjUDx$gTEhqDXn-W<3PHz)cijMwe`KVv~m;=a$ecQ zaG1QN#`SWt7Tnm#A3pqDu(Z%3@ims8dE>8#YvWt1WV+OJZxh|gbE`^-n@qEr6{k-n zREX5G0f>eM(O%o}@Aj^>@aM&7HN98iCZneK;s{#aT_;`CVT~Qbs`+Nx$`?^@<~q5V zhV86{xCb7I@gM#Q6Yzh>S|RXv{1iIQ&q`e)ST$W7#T3Tc^5GD<8f@tT?|AlamkZyJ_-I(Q zckLDNPr|m^*NAUEEX$_dy_T1EZ{pc+Ah`hqs@Ll?`4)2(45eZ@k}^5Y0QT({;)bo@ z?*eKX9=UnoKkY4U>Kg^qt}W!<9I{CuHa8d6@_m{aBMOWe<78}LNOCKf_@(gf4}-o6 z(sV!C)5g9JdtFc+J4vw9d|3*|awJX3xP&T-U6}SQwBrJRK2i9k;Q4$5@q@&g1;vCq zeD>0SZIV$ifr<=*;oouHoczS|&2joXPj2^$uD`mGLjlm9;=2!y))x8~?E&IQyd?2U zr`k^xcFz_3cc~;|B;-#SD&U;->Co~kk<%ob`$p{Ej0xq#Ds*1BGy&oIM}@UrM(#p~ z`#v(oqMGUxB(9+S+~@xQt?61`EYad^Cf+?uRu^7p&c@2iB{{|$jy{IHXZs>JUxsoI zKu=17Z7L{VBWXCs7-Jt=0Q27j_)yKF#M-rr2%}=w&E@TskMBPn{VS%AKzURbSrHUx zl^OP}X)G83*@`s>BWGXC)k#)aOL^kIsNG?sSHn#U#klTt%K^U`YP}fdSlN zv-JpPw{~EybQA`PIhcSL9;Ltf)zGt_vzEGdSN`Z2thqG_XJ_0P#hwR3XaYNZO5x#O zCK!@W;tSaK=Bz%YacyePkk8X;OqwFpE#esw5hqf8Drx8AF)A@V!V+i$E?*Yj8PEk_ z$BYqyTDo-CbFtkTo!sYe;+TwNeY1{7AnoF;3#f-K%2_)MiU6>F{v3e4G6zbLnKuxD zn4U)j)mR+5vq$r1pd+dFr^J)2giM78_sdWOyDkU|Zy3vRN$d2*RGPuGy;?ahBr6#h z3m?o_=b;^{b-#7ourf$T8Ro0#x~S5no=rti%Ir!K*=%fpHY-=*C2zWr>l7FaSS$Jn|1}y%&Y_i)0b_hFi-kpng!%hC+Rf08zCX zdx0sEW^KQBX(0X>t81^qhy|i;bJH^{)Q_!auX0gFInuWP;*fC@y02r{uT$K=kQA7XJX@ zBA-#yBTo#yt+dE;raMj;4w=dPb5LCPqVD2<_^K|ht{Mi;E$m9OANH8wH>c%Y6dwTY zw8xP6UsH`;OLgd`RK zVEBRI{{Ro_NUo&GV+u&DSCHFJAd1`2z9M`j@#{n{E$wvjIS+AYA}#E4y*{FVJXSmC zZJi$4E0l0JR9)b6-`1&kyW-H(wAG609a{2K1SC+}GZE}cgZWp{I@g7M7hCD=sp+0A z({xE885aM&H+^c2@Gfzb@~cXJyZnqa+jCjzxO+!#~=?LV`K9 zJxfp3V$>%BHWyauG)lS2*jMHQpGxbs--y2sJ|*q6y0J&SBzbKOqeU{F_;G?i8UXp* zTS)ZN6nfnHg`LWgurf05@BBbyR$a`mERvlUP!5HQ13NJz*A?_OrQz8$n?oOiwM}DL zwqb#$>zY5?A^I$%<{wrZx;4g`CGU(p7ve7r-9`%;bcgfpW&Z$c%53B5Kp!^z zK(e}v{T{o#9l5TW`@)(>h;C;@V> z6jCwm8%d0xY5@A5;Wzvj&*E2vo*4c(_#;K}J(*G-=TDH>-V@v9HE;ci>HPMb@n4P{Hi(QeeaCr!{INmujW#j9ZYz0J-P% zujgyS{yOoW!yRZ%@Ya1xPhroQZ!^IzdjTR5pTrvaf8aO#702U`febMCmsGX!6^b3d zX4b7zSx6p}#6u6oO#pty#cGif9Jw8OV-$iIQACR*F)`qRd0}4)cnkgu!{OCrgX52Y z^=%=>1Kw#*_Um;W$&Uh0zyn`K{2c!Pf`R-K{h)4=*WvGuG&wZ}!8TWnY_3!vSf#^I z2d`Vt8g7n9cRAx~e^F5CHe2)dIj&-CbB4x6U5;p=guRO+!rd4!W%`0CS5S^t0&t{b zoO*ju1uYWIA(5k!Sqry6GkneXiq>5*P-o4PC(zY%Bpz_UAPhE0=RTBb<~>tMxwMYz z>dCGmc-H3Cw#@+}@5aOs78EBTDVS%l@M|p3jyhJ!6TNRL7 z%5fud$a94~QAhy%$I>)Qf7!P8$6giqlc{+64~d$-rdw9LwAXKS3y3XLe&j;8VcJaZ zEWTFJ&KzJUru<|5pF9)$Tj+Xzm+-s9KN9?12B~zGcTxC{#jwo}grZgvPQ=dMdh(J- zg%UV<2LJ*`=nw5r`wVzf_Kfil{3KV<>Xv>aXoMFxR#$Hy+Tj50SrMwipN0Mf{4CRa3*)~Q_@`Nq!xP1(THWg!CYz}0+FL2v8HVx&Sgr(XhG%i-C?vLe z)Ed9-FXF!zYB%@av_Frg@OGVLs@hxGYCaXx?XNX$LS(pT5MLR5#4xmF7_4fHs9f#< zWO%6fQ{i8Pehk(0ABvi8tKgp;>UR&UX_~59eUw_9tYK!m5#n_We8Q>>hjGBJi@+ZM zPl7xJH;Y@x-UIld<95_y5Zqbm_ZJ#;QCuKKhwSo6``J(p?%Sgyob(`oV0e#G(*75G zUBB@+jV(MG@t@(&y04^tmRnnkD`?R{F0EyUW;xtLxeLxgz!~}f0OD`_6PMt}k9=Is z;iveY;4c>VgHroNorj8M({40tYeyy0IUX!b@EDU3M)RzN6-HHuA5iK(9MbG{3r#yl z(QY(fiFz)kKHVj>P*_=CBL4741ay#Qt2YKY~dS4S#F zMleNImr;%=Gci=((L)k{N{)XHL#W(lON56Ug3D1$Wfq?(Rk(^{8P5rTe>wmsM42-R z?l0GNb5yRh^Rp_uSf5;z^cAHP;_7i6Oo@&%Q`fbsNWQo$Tn`n0yK3(GuFd7@SvH#q$0ZD6FqX0`-@ z&z9X!(9i^PX=!t~hQg7K4l!AmIwgby=8%KzIVa!NovU6=DBU{YcOPSqPAUbCMhfvG zpJIB@1PyH*O^BGt2Sb7>(Vd_GrJVFQtI^Ff3^XW0`vXXu<&>E=rp}lgiU6*;UKtNP zz^Ot7j2;))Jxxfdx=_a~dQ+a%qbPNJp5)L34H|I!+yU5UIjdi91~3+Lj)WG#{HbG( zH{dH|a(NuorXMf{jz5%e1_9!L9cgm6D5-BGep?LhKR4@J)>>uWrC}N!NJ|j=s_by5 z@vJ+0FDfvi5WE~zV-Vv`sa1*rYIAtm!cTVp61^ zOjlLlp9ouO^0VJGwj}etS(xMwpc>=6GpO2JT!hr&mFHqHEMNkM)Pitp(|kFmr`d=% zvdgrRK3qR;i{5}Vbo)eE3h3tc;uHX3GZP-<=RJR&GH(r8-Q0$>7x2uSh~>E2K|S-D zyQ1oLMNgY5hKQKRZW}#HfIUAt-)MA(gU!6Ndzjf&eay6e{-%H-@ZW_kKFG&iwABMf zODVUUI&e7Su5;eBu09eMv|FzW-A^YWid~=~hBDng>COl1T0Rz4pHa7$z_(`G9K3f) zfN{_OeQUmh;#9g~`F|1gRe?)m?NF}d{HO!SwB)zbonY~niFp*6{{UYL`Ovm|X*s-5*jjcx(GVQjQV5t*^kE5I^2tnfI#px`%>% zC3ymTN%&VCym7YEf2YOfz?l9bIAQr!9WUcgh<*s$G(I(hLD$yp_epW3P3BFsbr|Ou zuSfWM`$K#__?w`{<5#z|p7C}FwFt~IV?2Yq-;A07>O3EN@Ymvojt_?|{4Y8~%xLPN z;{;%iK8w($z-ek!#_ z08IvMr^YjuMi?g^lmUkP<=8DW@`Tc z8U7Z0XOGL*^Z|P-kCx&qHjYF;@8A$c0DODnKZiah@D0Nc8|Zq4glqo*EhUVY+uS(H z- zG5kvSRUNLU8lBf#WG@M0(>PqM0C-HdFFb7}%#sjul_!tHRxYoi+3G9%=+U--P%`cz z^U!*F=DW-94z1p%Z8Z3%vz3p?m!L%7Oq^z$ulx}4eu1Z(tN#EGUe9F1KWK$S(UI$v zB+vzKhQGBB#h-z4M1Bu={{Y1n5W?T_>hqhMb{^?A;0LmiUrhWY{{VvW{7&#v!w<(l z2J;)Q%;cdd9D{zeF3)?!f-li$xmV3Mh1XCrkN*2QWt5*I47k;{iecQgd+a{ zKgieMJpTajQ6Jhr#2yN`@VCVu5zFE~2;5sVGuqs052s#SZpIn!?3HE#al$BEpS;!U zKeLbg7h}g?1pGzee+vH7S1`@sy9ky!d`JDCCabG3RmRD}kk20<>ku@9jG-A|0sASf zYK^1m7dMc@cXsyCJfaIl-8|btJ0o0;%yED-$*(c}nZIe+{{U${2LAw1*E}`juK?Xz z-yJ#hUleHu*5t6sS!0z;B&h3y!yTkx;PF#@3;nVF8Gg|^3^$(!{CnZ=5qZk4qAQeH zIp-TVAlIh(Pja4R*(FHF-Z;eoW9wfJ{3qf&Unj+SMxTDMznF`4Y_fpfpf^f_^GUFi zPG~f{8v^DZDl_DwsZcPvDhC+jgVViiT-#gSLQ>)=95U>1>z(7@)~c?bYiA)AuE`R| zg^3g>Omx8X9+Uy|SC2nn_wl{W>~m{+?Y57psg@rP+pH5@g{}>RklaF5jBg*^l`?iR`w@aYjUEv#e{HGmMhf#w?#iJaEr-=YCVDl1K0}bejZ={0H*4Qq_>bV4s($}AAA1LpYTrGi)gO( zZ-v)3qB6|l#fxEAum!)1ueE%E;-3S*hp*+b*3xThs16Kr0g?VS`&WNqrfQpokCi(f z8Fq8|V!S{0j{TN&ABgtS%d6?p!brl*h!w%@&L{)&zJCl!AX7F(XPkkP`3j+T;dNGH z6vX%W#xeL;wR~{>o;8nyI;65flHKX0zE_NW(dggfUR$YZabN9QYjlOqM>%FcT=bw0 zZY>E-$IUc(J(Yn@~>8PX3P*mfc-Az?%FeE#U;Caf7&;?d69BK9| znOTYK0uTPZD{1%62z~5NrzWJH)mcFRhF*CT+2BDDB54DX4lqFcO#m?3$pb3fPbepz zwQdmw%+b8yNbnz#o$|_khxMun3ePC}MCAwfy5hHdJ>l4b86dbHFvjB_dH`jl!0R$k zB02KY$^!>Hob&osZFcg}l$MDeMaKbi_;Ff)+3#topEBv3xZN>j#zrtP=zpbV>a*^- zSfGeVk@8<|F+dpPt->5{PJUHUjMJdg);27zNAbM<5Xl5!65Sy zmvGM`pTiUY(18?nI6b=6d#8Q7RbQ`B+N~~=EQ-cSN&<2--jM140B4M~)x>dyCFHwt%&#emAi$0ySUt!c0JiC#CkNj$H-3gwsCvA{n{%~X`Vl&VV*_30}_aC5kkahDOquQ}2^qwt=W#TuQQC%oHyw%6U)m zHNt3J1F1jS)|YWL#ni9`O`tTV=Hs599ix7uYxPs#t-5fiRp4~frXal$K-hmt!taPjW zN^6H+1aTO7^bN)hZfYmRx+l+R9Gcafgl~pdEg}Kb9Pygu^dF3RrJ9qi+KcOTPz}UH z2FI`+{p+{z*N!wFi28Nah26u?Z+RJpNMv&qgdAik1QGS?ngHDJ&xmw=V(QinO5*EG zl1%-jXPCtBoMddr4l~9&jwYkm)LKf?`e!mdx)?$4VS(OaneXaMmy z?6U&t(@EhAy;jChyJKT7n4>-V3Q4lmWqfJMb^TzlvTaI$ww6yR+2vfUPyVd6uUv4|V`cj&p)=de^95 ze##yKniLah>Sf!+s_e2JI*!%lo+9v`z2g4>7}@EbF7Sq-r-G9u)VOv*yw z6(HaeGP&U9x;gwg@fYEGq`wa}DK*=pmp6v* zhzecp+FNbe>$?@`x@U~EUmj^9TQ#-RqH&P0u#sPb*z_mg)_^!&C&Awgd~am3_-@Ba zo;flb$w15py7d)9T>X&z9ezc|h}Rlz!jfZ}%5xh>?XdN%-w^yDlg8;K?}fYzulP$< zSW@IO%?u>76PUqO3;^)L4h8Kq0#kxJlrveZFyMq#d5B&6Ayif;I z2ZH=%@c!t>p~+$68wfxx1=M~_;2iK9p*(aIwV`}!@Uv^O+WcYg{ho(z=z$`=(+adQ z4z1_%uBY(EJLar-JNBLMrm;Lr;!9i44_uZRHwr{~{{VZTuESbe4;EN6K^>2XwAn@s zX(F*udXNu)Zj=F`W$^pqpN{Ms>>5Uks6gZ8k_~|VVz6~T*rUTYXYC&jFLfUd-w&A# za_>z0qi{uXKk(0<7rwiae*s@=z7o|5&Jo#T&-`f zZN9#TiU8D~!v6pjeiAs6dmR(Tb`bvn6d1O;1JvV!Y1V(Wr-k(`Np$ZYY5IqUZ+8VT z-@roW)IKmqc&h#t{krsRP{U*6Sme>}%l*rMQ+KdE8`ihHRpVcWe-SM);!C|6=t?k4 zNT(l-09n_(5#i5?`Y>zzT`N?wkZ?Stk-mY)df;wLvPs?$dU#Fw!&~bb5u1ii@rJdJGnedcj50DY03Wp zEnt*GK0Qd}6F?l-jr;@RI2Fgmj|KQ^;tiM>YuzXdTjd_O^{*K5U&5b;ULn_PY&<>U zi{Aq4`irzyx?hOmDw4PxiX?{|;2!6td&RfyJMh=yv|!w7w_X|4GF7EUAraKzjmyEo z&S@{TF9!IQ6t?lEwV`;zzz>nGVggn7+y`0!`E$o#vX74Z7X!??OnUvAl10{-;^A@Y zf%8|LTv$Do!$qoF%V{t;WRw`)f8ZyY`j<|N;opWnBx?F6!4DpIuftmV#F~+?EiKK6 zMjJtccqmupIpQDL-%h*KCcU4;TK1wOaOzFmh^YAi zPQmi}3}XlDKoM!9Oz~VVd+^gyjw{$OiFInsl3TViIZ_yXGhU(a_x7>3o7Sn&SLD;VVCfw!dT2qn0#xGPsZ(&gYWZ zKBu*4vP&>42g(meCnZnPfIi*$HU9tw@z(TrXn$z01j(pG?f|^eWf7ZkfCw?U1%^RA zN#_;yPr={#D+j>uj5l#bXX7YzOUZDe%T`9TkQ3{;0D0~WemmUhMs&r?1`UCLMoBf1 zs(5A#lF_tbl=dVMKp)X>hP+9o_=dteuMFN;-$39x%LL0Je)^=-y$`QZ3>@ejve2JXcF00+EPuXuTo=Vi6q2#@`^iLSuNdv{cSlZU)0;O}ga;$mu6ao3irZXzbwHYU!&fh#ZWm z9D8Q4XSE+^+ZD!ML!b4zAp7H`0C`@a@TLt)>Pw%~?lcxj+4CQKZTlgpoVA>yAQ?e)Iv6ZQGPzN0~#PCBQnlkZ&lk;*um1|D87YgZd515i*Dh1B(u4?wZt=nkV z3c8dgLR$;9a(%i{1*E#Pqx&^wf&=q{<6+OB80kP6_X6D{-iR9E2Hl{HFSoTZnnqyu zvBpU38wGvp)}y5xS=D1Gj97=y@%;$?wLPV%h%eeUup{_*IR5||0I3(6#}W|P<-7j? zI+_a`Cz>&Rb2LmoVUvYE)cGS>=Kasgso0)PIO)(yFk(P#0LN}f#Q-*YYXAUCtCs_@ zKz~03CT@lXZ3Xr)Fa zqgEYQlhUVvBgj0YeZ*trAEjrP4-&|B=RBV6Mx*8GHgUlh+MtcuOUWA)Cmi4~IUMz% z4z|Zbjp9|33x=0DV9Wp?m22BtqC{b}Hw!VsF828sJ^A9fRB0q=w(1j?UIbw9GwN~8 zbozCb?w>CAhES-#d9jx#zghs_I#X%4vAyfWV~uwf19w5tfyG;}xM(e&>I;ajCnT7m zPn4c{&U$?-J59Peq)xEIJ1);K{K1pc9Q7X6t3QZz?LuXa@zrL6JU9`BJG*C&awq~l zKgDUSTuTO|iv+x^X*k+RBf&fdj+Iu2^qnX0z1{{Zn#8-pV_L};Mh5y0t^cs{u1fHZV_4Nbg25iZgV!H=7Q zh)5mDJt_@DU2P{+X)oo5>gG@ZxV0>dxar6p26I*QOKp1Sm}Y+2@4`PDyho;KD0G|XwM%&M7)!M~kFac4MQ8g$ z_=eo(I}>KoE?9YoWSQWvJu8CKHE69Yid&eGqCAkflkA?Dp=;GaPIh9y|MHwqN$a zx6}1IC_HavbA1M*A&wi1I7ty8d#_Jk zd8@uI@dl0K?*`9u`XnABxLJfgRlLfDh;SqeCjdIG;sM4;#ztrZtAhUk#y%*wY=2?i zSxzzKl@lgDwa-QSKKQoVTKivtuB@~>mTkps#L*qNWB3qoj zt)%xHNwj2uq~MX>we-)79wzu@qzs2<#AxzC5+wC(=@#;7$NH^e?8I%V84y`0}|)1F%!Q=kRy+G$G*4G$G6~3pa_o}`+@cxP7TL}-0Ezwbvbbq-MO2@v? zKKHgL0(&nFXj;wQm!wmI6oOdQ)h5jPH z&}U#zl&(sC0CcZ9)x0S$!d+f_-v<0avC?fI18fe({HZg^V#I)_Dmn}v_0nlywNHsW z1stvMm&4F&w$b3ld8IyOXwEQM8v}P-p;*W*pk<(GS*6rgzF@k(J9>CW% zW8*s|x{}AonwN>J=25kymD)8^?VbPh#cTL`Q1CQ5lH1?u?PYWb-4>`!WsjgIt$K%s{{U+L0Ea$3jZ))MZ5rY53{tMf z2C%$$KZ1NqV>GerdPb{iNy^H~#GK%O-LZ-QkHx+P@Mns=H)&y~d_2%~TRW@R1T3nj=Un3; z=QZUz^nMxegfr@10`Z0Bi#@(y%7xlkc8MqxYsDW9)nnIJP4NY!pfb$? z*()z>)CT!x_^x_$|-ww-zsFBv@q!Ck2T(02S|D zPk_8*;N3Ig)&Bs9JZqV~xfyyi|2K$pf5MoBUk(2jOoB=yzKE%+|ghhT9T7!VfJMCyb+TNhDxnt}Dm9 zL-BXPM)co&J+;;RJAJ=@nPDM~bJ&&WX}VACv*PUr_GmmoEuV>W$J!$o7W-#W-+4J! z=e`91SoqEHBG>kQw$fAL#J(BUthLERHmN*5P21&n4Z|NOJSZm_Vi&0u%=nk#ufvT? z#b0aIwGR^b2T{5KR@Uve*htvmA~yrqa{4^;7ogDo$$4-DM3#e~ww zmbZ|pjet1h5XXbZe$~%>Z2h3(_{npiL#SA3=SI`@G`+mCxU>%UF{t7tlyaD0t(+Wy zM|uFsoAzh%5Vf9f1K!$rk_DB@y2%<&>(p%k{ohW9j%$e4bbId%T=`xk)2^&$0E|k7 zbL-cyT5ra!b6NPRWS8L$ns@@zc;|v^M3IE0!78k?BLn5I8-W;g$of?ug&!P#H+X+i zw$pwuzlQurprUP&t`p3;M8*|TO`tbHkW?IZGyyv_cY0Kk#d8AOZdFKprXo~5UwGhS z)4pnx+DAKsvAoRj#dSK(-kq#UTE|GYv1Z94C%_+tQC&Dfg8`X-v;pG(02pI79w4>y z#|h4H)Q0~6>(z)6WwnM<#Y#rY{_amhTK+Nc%$oJ0jjEDcT)Fv&MI`>6Dluym_Adb@ zG*Pv_zghtOn$tgP9}6UGy56T~W6lh5u;sl?W$RzG7K^WH5-y3V=;3fSL=}n{8n7 zkcv&X4v_5iVwgerr39;D-`KBt=5XuKt+ZyKh(V|yD8Bbrq? z9Z%A}3|lGVBhQ*iB*sYHf+{Pm74AY0IzsGmv(74i{Zs+i+YAed$N{t0KAFX3O{_rCnGB(&1cn=Nu=~&i zjeBctdKUF|jkp76B+|_q-pWpy5NLqL_8&L56`vDb>a!}eE_V-=cI2N^>^@xU>J?Qz)%Kfi&=D^4_p;oN=Q}2LP81jAJ(y~ZZ&H=Wqn2mNFR;zxCKYDitg>y zM`i{T;2vKEc>ZvF+!vAHS=uRS*V&;?sfGS)*Gu|TK>?nfN|09s4gV2#XH zs3b6)Nsr+@g;=wh@8%~-Xg2f;lI|nwY8$Iz0Cd$#DVLV=z&nqr$65fU?9w~5@q$wz z?HNDrk=WInJvFC=WwU0Ba04uHx7Uu;+nq_(3fsgTcJQYPukKAvr!!s1-fQ_xi^O36 z0H4l)DqT-;YRpXW%FD@YXOC)-6-d z+WgI#LncQ-pVa>VN&wf=zRLyDOKk+44UR;(3+hPjb6pyEk!7^NLXajRk*G`_}{t@URiryH)`78HW zW1#fM6(zp2cXub2Z0%F+Dokq6hLmxf8pg8KBuL6!z^xjUa^U>&jO6j}#cNw%%J*z# zYgWtdff^tTN_vdvC#?W7<~=ytnRRHHStBs3DQP&)cIVuIT`q; z*=69y**l*jpH6$$JRUEE=`mT|*jvpdxnQAA2x5NmBdsIe$!!@+)QB|0ZdEar_Mi*X z__j?x&E}5yE=k^~4(1u-kUI6|p*r1$w-4H{)g_iT+&^`LoMSt>lj>^_v{By3_HIFO zuqk7P$9z?o;Cbxhc*zn*g^5)86rS1jK9m7_`&J9~VQun6nP&3A22V`-{uK&LER;3m zO>qDl#AJXJ`jBd_oo=@+9lg}fvW$|2c9bWaXVQzqJQoWL3mY&ae;Ehp-RJ^yuj$J% zlk5ujGo8CzEHjPo*za!b4hV5uCCI|`vAuSK9$t?YvYfL zG)+D@bQ7o9hn2r~BL*zpNdt_WbKi=@@ZPhc>$bAmY7rPGF?o#yubB`MM+`??gT`t4 zhM8d%)vV&!PITEk%VJ{=$i+(KTlh}WN8>;p4d2FHf5aDXHnK}yK#cI4bp;f3I3uAw zDRnO!Yd7~+{$bJ{Yx&M_>O%t8C1fgGtL=xfFG4-D%X%%{ViGV$&GjH?qyaT-G{+!<2S zG?>V6$7m{4VEWdDm%wW;3~RF7YJMg0mac9>?q$>(FEbvZJPv?zFi&~_^qp^Aywtow z6!-UfkCmsKw)kT!sIUNr$s3doM$wLWs=9xOVe#IT_PsLaS+W=R$i;g z?deHAy?b-3#5C(Ut>Cjwtt_#Z^N_C?C!DS`nh)Ac*pZCP%ee{4pc(Fc{U`&2)VwLB z_#;Ko^xqWtqIq>#*{$HdxR80!D;_dfz0n4-I&e!+LGa&91S1dvL6t zL=Zbi61H*31pK)z6x8{7qhtIT%Q8 z(MZlC+D;1p0JZN;o;)Tt7S9Ld{!{^38XJf=ENZ>a878X;BFFBdEu4@PV<*=YWa*a; z{{SATCmfs%?g!SPX$&k@?iOBgo`dT^6)iMon(^ln2;(X?1kUC4&umqjve3#_5@rXE z6aqggy=|vlYOaxKQ9Q39+7So0B%Z>w55q4JCev@FTsr3@g(iSG_#E7vZ9}yDz@DD8 zpXiq|Otx}F&kOCCAq1miI6j8AVE8}cGNa7Xr+5DVo{YOodm6xRf^Fen6kh7{==b)Q z+KQsw$~Op~Xuu^$8OMIS3IKdELkf{1IX%xxhUk`uHtInGjQ;?hYo_qe!il_Ms`?e> zr2c0`^D~<08}?lBTb11saz0Pu&$R$~P2QDtdW+_~I|ur}gB49G49-MLb*QPh@!Qz->4YD20{4Q}^##E3HG0l?04 zU0#Fm#e8Wuk!h+}tcRpC4UA5G>$0%@k9*C*u7akqf*2_lF zHJweZ*c+)~hy;ic$KLz>dE1gJ%C)bIJ~r0;W|P`XJU11&{{W9k$CVVQ7<|Q~T(KZy zfyPgx4>7XTq}Hsy)pSAoVs8OhFv01ARdvav z)AY|ULXxiXtU%;(-mhu;6}N>oX|ydmFDBPbaUHy3b1@K*3LWQ`1Q2p*m-Zp7=Y@AK znvIdzH?077rohE_B$q+sfM9bbaDS~jO>)A;lpsm6PT)ovy|Z6%YySYT{)fG!@a3#! z2qcGH`Tqb4W`p}0=yFbE)grM906Ro~Hhln~500%hjXryIHmC{4c7hHnjlQ!6pp3Dk zjHQlLsY8)pb^idv9QZa%rD^R<4xPBQc1RzMJS;btYc8Oc`+&$|gs?wa`y0c51AHl~Pqt-Q4szhe7ao|ctIydZ z!c(Sf>`VUuBbosCcIQ)VH6BZ89_8Dh3A~OwdQ?{O-A`sV!6wte3<(3;zUhnhY4G)= zdn41K01&wwPCqVdV@Ca)ye5|AEugo8S8tTK=QIKERfLhn5%TS2E(gts&IzjbBK{dO zXQ#{&k5LXt9^6;ode^|e4`_Eg%vN78`=|!yJ9%dO4aQ^uW4=7p58b}JAy!= zOJlA`>OPg?zZQRFrM;d>{1XvF5Z$l>15gLb_BwsvhHayfgm+_hCRI(cW7zll8lLY{ zw!4sdE|7w!F*=oI`sTVX8|b&*0K4)$O=l!L^6sQAJ!=YoFvq^p;#HVu9oz9V0YNP- zt+b&PiUfe=fkw*nSqF8aGcCMs0-eCG0{{9aHxc z#qzQ+0bkuo?LZabwNY$d)+p_AxjQ4mlk0&|n+Vtyn4sJ??g&V&Rnud4G9wq-2-_Ll zwMIiejTsXpZ@shE=Evhe6`x46NKA9ITU!n`gM*Ga9jeFnY*AP{F2JC22MT?OrpaSI zvYTw1$c(N@?oWPu3Z-x1_45kc-g%Ck6$FKEZnOYRX4f{cn4KKA01ie6YOnTd>lilM zLeeWAn~ZUuf~_Eu(UKfW4*V}4sQ&;Oey4pUx*xOekxO8=U;hAA09T67%Z-DOJC!ZT z_Q|VIUBh&uIYHc@Z_57wTCb-pWm;>ZrNBE=pUtSXF1M{CvMek)P%xx=&<3K}+u6(v zE{n8$s;Rh-b6Q7E7ZI0^;0ci7!CSR1lLCxml;oE5$0Ls7ppx$1Nxb$&yCi&!i-YxL$6x1Cyb@{?!6LqeqL2@a4}Ww?WTuUmhRZB6Do!-0o>U2IG_%Q=( zI}&<&WY$T#j`qcN&g+>1N~pw`TL9pCj(8)jL#C8{O6K=SNp1B@^+c9=Brh2Yo(lHs z+N9F0=druIOG62;-t6I!${W&c@R^UAx;U;U`=LgS5_K*yqA6_)ggif0!cT@5JEG6$GFc- z&;?yL#X1g^c)lM?OUN~W7?v3>5t&%Jb-O5MSv+$O6rfphYhi44t- zn@>2$O60Xud*WHFuf7^;Crq%n62|^yDLi-MBN8i;O5>6`XP;`!(SK-t72?$8zmin` z!JTbdSnXslaJU(jlLeyzvyylK1JKY1q-j1Xk5;+7vD5C2-OifP$9E8Ox&p`L>%U*R1rv75HA} z9bpqx({2H_o97H&bA}zb&nB|;?MPVJ$oH2oaF)aU8Ew~Zmk>}kXFoaPsjgo_@i&e& z+asrZNYG-nzIjT+ab~fFw}j<{vPMn`{sO8=$e32leN#Zr&n}4NBKZ@erEs=2#v;`xIa%0WXe(=jlKm&!%`@$4T%E+Q--zT-B|t zgWN%;s_(s#N8E@x1CyKvAPn+Fc6x8Xtq;dq99LFR$!OE2`+o1-nIE&(oF83vR-LY@Q(axP_p^6B`^mg@jr=ZblEby{o^^5cW^pIT zS1`3M7sHN8)%F+PP*)dHaI-HBtUu6iULWz2@yA`eiuX5Op!`1v&Ec!p@lBS81;^#M z=UyjyC_oVLPMLrT0Gx`b?dQtfaYmO=UeBncx41Q!5wCPr|Jk0nMXo#T+c zB`_fLa6U8dn1%#$O7CJ37^xZZnw0Vk3w$wmSoZb7vLShBw{tMRE2GRXH^TKT4C>_> zknlK&I%5Yfvoe_UMsfw^HO`)o%F^jpJR3QC!*`RQWuXf;!2H~dUm;Mq+)MKB`Cf3` ziZ#8(NZ$6FW!Qery~!kAoq}kfow~Q_i8_+{n^^C?j@#{(UC?7uB~{ob zo9}=aKWx3C!QRh)-qFTOvR1>6zAaS-^3mHky->|Y&qkA}?D&#jl$d0#_P6VxDh#g1 zJ=UQg-fNyjp=0#+7f<$<#Euim4JZq2YxSwo_IcQ{d>=FxirrZeN145r9cQ^-;*$1| zx{%73QR;`>s<&l-%<&%;9^jtI2Nknq#n#!z@*mMk^}kuTCM;qyZ4xHpS((3=)eH>{ z&ho~`vnN6%xgu{-C{IoGn;1(77WVDgZmZEB^2=ZN<{`5S-K|jRbmg1#gku=jf~++A zih78Mp=x8MSK#pT-$8bm%gUFY=WU`|@>NLvvbCalJ;azYk(7!OMl%3Hva`Wain48u zCQ}~T947(9-Kr4~kZgC+M`>uO_bz$)YX7@6|$0za##3+-A8UavcR%PX7Q z?9Ix2)RVBuT7aoR+fCKL`eZM*36XOZXIYlrtw|1eI)IrW?Ivr3z3y}~v70!coXum4 zvJrdw%U?WF_vT)hL&@99lEw!SIwf>xIQ!@Imci-T7xf~Yhm?x>nqC{`E+AV=yZ@^z z%;1SWeB3t~1Y1VqAVv0uVEZn$=V!mhIS-xh+B)l2oz7W|7(7HR#fLcvbyB#;O~f74 zlvf0S%MA>!>OXO{h7;gC+86p7QIKHb-GTK(I+2w4_2B#ql z$2@^`_VIg%8nYh4cBMx5luC_4x(3eu^_1XD7f_3t?HEj?VTLJ8Yi>Twvf4DU^w;fq zj_ak-38tD)h^n^+R``1pG^H^4iL(FeE|? zu8|XERPm-#yYbmq;CBOB%Si(7vj$OkJ_^Fe`c>tHs&#n>?Zc^K222-2pq{-O-b5w9 zIfwTGC)|%p7jw?_A!NLmemL<#^Y1%=P{{Pl2J*MY`w%0~Q<3piM^IjMU1KL=uURhZ z>0g>r%iQr6c}10Q$tH;f`+_K>$fPCl+MhxmgNUetXTFM1Kb*CyZl_>G_oi33R{C33L7!dO>aeG{Rr)xF*e z@k)XFAuNl^tWHph0XDVfnhb4rb|(aVyPp#V=5P4T8FR5OEQ6N%Jg~dbAwuL{Lh^3Ajl<$SxQlbe9Lzrn1P=_^A~3p+$WV^8c~?GNS@VqjtzDDZ-k}#3Ezawv zq$6uH<|Y!UtP-NzHO8N&Gmnw2I0I`V51?aS;z}hbGu6^F+n-D6`))n%d)!SZrt_1l zPM1cL5us}*4Yum58&+!zxiiV?B0rB%>23Kur>r+lGU^ne!uK#CzGvc#U*8_ojk9DT zM)Fzq@^=LLZt^~o&%R9}RSjcyd|ZlgN=#G$o(JLG<&z`B9)MnGhs{@Z=>lbTKHOk^ z?vLgVUv;!+=F0A?E(^w)3rBx2%Yn|)3}3)77hbGunabEv4?xC4B~HLm3> zCFgOy*5TdGyRc5v|Z;L>ODq>Q9M7*Sz6S!O5)o{)CGrHk*+0qdqbgR z5r@qg5qSY}H$6LrJa1nYHO)R1fmK?1I=`tji^0_c-0q5%Y>BIB3*AzNp238bkG9~0 z45A)i8Ftx^YiY_Y-@uCZ_0s{=bB($si$w{#-+#sv2pjVeKFziYr0%9sGOEeNv@P=f zHWxf-G}T+zU$*|Fz5W%eas}N`T1wFJv!~wWsg8?By~;Ex{P7Z5(g6(i1_LhM!9M@N z;&uS~lbymecb~>4-ChqZx*btKPOi+sEgpNN#@&w6{LNo03(ix!FAAA>g=ZCDdqqY4 zFLwJGcil2#3>DYdEJ;f$E-N=Blr7Ntu@l^xPLn0cJ$joldBpj#E&pipS=^K{#D^o%pza)TM%lQU5Sf?DR5zvmu|QG zzBtV(-8SI8TGcay2z+c8B9vyvC+n(ro5?fvSxD`5*XIud_`rvVYNK78i zLp9#n@()|ymS$h$A^EXSb^O7A6`Okx0d(|@BOFQr^BI4+AMGG&^@o^q=Hl<~_Vkhz zL^-LN(yg5~JVIM!O;J6H>5$(pk%rl_J|XBZAbVDp!O{~AhDQJT!Mf8NC=(%DPrSbl zAXiB=a6i;%p1@Ca0Awuh;>Y$7Y_*yHIX6PEXM5k&@_X0xS3HAE*L;@-WK)(M?n<1_ zCXY)uQca)BHoVVc6i@Kk-|3`T``HyB=n`iiyI=YNk`*tuGgbfoRW)cEHhU*WoXJt< ztFNj@l4m)35DioxuG9U#WDK?`e{f%{8^NwTDE)5%ke1K!^@dZed57c}hRCnH*x&P`st{rD8PT z5xqi2L9g|Id}TwhQG3-ly|UrJIm^O+ljmqm3}TaE5yd{(GHq|%67JpqT;FE%Gi*ov5h?2T-zqO|uW2@kG)WGEAxV6Q>bow8v&;tM znhW!c#9S^{9qqBNI1%OIHffFfG~g=d3e&(%`S1~CmeC=V|IHUXBe&u_IF$D)4)sH{ zeEK6i>^kwsG?DS2=Gga)Qja@*Vt!LcRK%P$I;d-cAJs&jwT%PBx*ThKgT*dKF+KiX zQNVi=G_^onXC7F#tRFqWTr#w*cw!x| z9&K2zm(}#sbQ^A6Rj8SKU`)azcHCAA9Ot(O)aH;H<7tk)p`EC19soh{Pv zDd@0z94#E%u_-W_eXfpjUA)EpNMJscz?ze8zmsuc5cjl~+e;kTq+@p88;>nwF6W|U zql0P@cyE61T_e_d&CBo}x>auyx=2}-b#e2y zVxQ)ZbzsOS4P%ebOKIXEF^X8zU$~=$dOiE1PYeCIm|si9?djp`0XYN~i=2MvfKyNsa zV=!3An#SRU(&U$q@5NkPc9|#Qk4Q{{ig|s5dH|BWxm` zIg?9zY}==l43Q+HFU1=4*my%^s%?&>QePGbqn?_&I~$@v zjcN93;8QlngsaxhBZH(nF>2rWlLy@BCw*kwIff~ijnh6ic;RgW<>t$n*R)JQp!l^XLq3x$_=P1Jph@*N%b z^vf}}nCz;b5I&I7F(ck^56~I@`g+{#-^vFKWbwX)Xl8Hf;_7T>WcQz(gRwOt4=V{X z$$v5=(2IqQotcBFnU~XUcX2dwHnTVJL}ZdC zF*mYxF+*gM{ojnB;D2jj|8Fh-Tgg`sS4mY@BUk9-Vj?6gjLiSJ5SdJj{-3<6ypf9y z36p|@J@g?FY1RL`dPOC95*9=zQThLrIolc8BL2S`;`nbvi2vJ?mZGt>nTad3!*0f| z|MLP8&~G6!{pa(4Ug$q{i8^?Y=#nu1pKkm&<>299WaWl-jD(w=g^`=*Ke=y+|7QS5 zc>XgoDu_&SX7(1YmLxpT8m(+y&74V?By6GYC2nToU}{DJ?b`p2wZ}3X0D8gve+)n8 ze>+X`e^bD?b}qnG=K4au7K*0<~P_m`aw|GroM zmxK8C+wVKYZ(EWNd)0&QFW0vY(rZHb`Gm{W{+9>2elK&x@7V8y4?i3Hw-w)?2OrjS zRO=ns$5`Llemwl$cx#G(uYP|RylfYG9W)z$`S<36X!m}^^sL-q^R}nx{{~$#iQjL3 z2)(jxKi3kqFHCN9=6<++rI4&_FJ8I-^6%Nsr!#Ej-bBpT;EL2Z*Z2MHyyW~~(^u&0 z?0vLv=gsp5@$a|(aRZ0byH^9{jcSwk6UVNxcZAzl&KCn61^V}s2R{aBdw>5>U;hXH zklel~f8Uqa%#a>v+Lya*V*c3KR0xcuf0xDef7jsq`_6jyj@>Kp78>y6*U;H{Cl&Rc z^zV5u=Y4bDU?8{dSm3Seg^6`uNa)O9_5OsE_f0_Mjm0^B>%GkD`ML0lY54f{bq447 znbPIe;W2*4e{sWqS7`j6{OtMFat94t>#}p{v3lgWV@*h!kMSVH<8Bcd6(7gV(~E{0=6O-6WN<`wo}Daq$h#*C2>V3+;t2 zC<%E;6YIto!O*ORKaB)y%QH{UO(_Xfh83jyj~{M89@p51us4przgh*C7L~oczyCrj z2>Hu^E(_!R;I|9D8iJbg+H<0SM!3c{_zzk_B@6XLFC8Dyv=bI;F|>+>gIbBYQXwWh zqSErvyMnophSW9?dIjy|c)?rgrF2L2cAWIK`cJ`fM`<26tt+rGXm`+5k9F48$}O-(jkx zZs`_~fK15+&G23LRJ86J0IecdJ&DFh(t(iaI>jBYV(HxP@cAMSxoWsJL2*~a-W(d5%Zx2%~mZ4Q@iSi{UUIS zy&8qz{17^7tmp!rlbPq47hGDkUN5D)%jfXImnYJ)#%n<1>YWtgz>k`FxYZ_Yv1})} zGWbLZDW0;-tYi-0P0lSTsSGu=Wul=SBXlvJzCZ&b_?Q@}K~9LLA-@6xab$z4Vf@U^ zXoMp}CU06E1{;}`2|`9PTDO;ke7vpUvA1ACz}yw?GCBId2k~Tr^rYXQt09na)=o;6 zKteDfIU;|(u~s&->qY>qc*?;xWUodbVYem{RY$@!-Tn)hVwou63?Crw_CstZ>v&U7 zqF#egoo)=!7Uvz6jU92^j1={&OGd^eI$Xv}P=UNdLvL~NtOusCBX2Df<&+WgMOelJ zfqlLWz~HL84XJxHH^XYr|2m-=elvY0|Y|jtel@MrzTRRgX}q)G~FO zRlG#6Hh-}4Nt3!kvQ zngB3ob)H8fqz08%w5zDsfZz1s0usg@?~tqyW)XUa#YC@!Z7nLBlSs0+cJoRIbq-yp zdYrercE9TX$xD@r;b)IEXDAAK%B0qeNC|mnhFH<1N z>H3=0y0;ouuc5a;X|wl9Ek2}=4WLzV_J-c25ZGuh0N&&-2nU&te@_0-EyJf8OOqdda`Hi5NXPO%k(zBE2^50aa?=EPER0>MnNz0Jbiv+6JrQ&%LV( zq7>6C>?-tw0K-yu+n&T!%=wkchm7xyS!xikxhRfgn|>M5xw~Y52#*ruPK-gS%APQ9 zQC2}HgmOrO7OOXj7Bp>j9af8%CdbpYZ(OpB7m+f<0u zQCy?!+ot>UH^Z8B;JGIHw;Ip90SVn8`yuNCr>8F!D%L~C2RoQrWgPQo=6hb_ETbC4 z7syI9RS%D>um#q85#7TGPA_mr9~zyfuN-Rhr)h`w#OIu4*f$K@DZq;-vVapJX5Wobtevy;>%96dxa7dU_%t36H4urO!$z!YPrm1sL170>K&_$ z6XG9derB@#vF5%un9d&LNipmApZhRkbNjRBnarfhjkC?Mj08NJ69_v$299Kxqask3=)+21=)Ongmz6S-xv*$WrcwqN{-_A9wjIi9%BFw~J zse~6e-=1e_q67~anOfvYRh1|V1Qb<#`PDcqXliXM9N+N5Wtcy0u7_@iKu>(ga}}jl z&1)2c`9Z8Ma**TIuO6UTW_$4P+y>-U+C$Rty6!%Ius#|CG22#)Z-9i6mO)64lPaod z8Lxj=1P{BSju@BL>AM1DSG4QRvInfiHkCtg66M}>WGepD8$wFU9ewNb#I#i{_A(m5 z|FSV}JlSA=nmmJu)hOKlP4k$n$-RnluhT2#O{P1*RQXg;4<%uOO?~DY0Yk(DiaKE{ zbX{fPRDxxyz@Lran4aIi&^?~J_CI|?a&**%%haG26WO-=Mht*ya*paqv_H@u(l2v> ztZ2t9`rW!%3N}B{av_l=QP86Zs)&zBWX=A0fG z9@pJC=ztS#0DYx_aRfw1$NmRCS$W!BWos_?ZY$I0hVMv@yn9Tf4Vl1LC0#{A^C=w6 zM{|+BdQK=4mm+`v`50^ou6AURAiWX=;Zh?28*HoMl4!B&ZVW&yP|toK&Hzh@kEp%} zV4O1_4KJ{nXSEII=2)2}KWzIMkZ z*>gt1Kz6UsBeOYa+eqi0+%y$Tcvu8&fwk<`p2h_zb^MsWtjLSz??tNS+TCkO@zv^G z%Rn-%Wcp649LS6sGSA^ivO{Y$^Hag)0ptzL#+l1VOhltCm6Ivo`E<=zqCvtkkXNL#_4ch&vFbYPWxD zs9R;F=7_9}Kb2x^VB%1;s=SPU(X?s;GLUu_ZK-w=}3p0~oZpN3KP#1=+q1y20v@d3NV2sv12R!mMW+Y0g=m~q1ipKiM z5XKfO24r)&lXNAn>SCjvi-%YdMwUjLQZO;|0Ng!vV*n)G>|eT{O?bl$j`L`HwP54Q zp3P=-Xama0@jh#0tNevTuyf4uBL%pb6$U0+_yy)*G}BA{iyTAr7!aaz=8pDiDfxg8WjT{aeYc?3VjIKN8Fg6$-P$H&QU)mwrmLG>P{FP|*%mxG< zx53<(hIQb7Ry)%?D!Mzih4(NLY)yY0~p&1C2kwngH4L36`u zPN@~9f?C|_({x%K4wu90^oL#6>r^R}YjR7hnBPYEvk0xOh&`}3$3@Znu^c((a4H!~ zGk!1#9g-rP+GqWPs{+>ePChMy$`5o7x##ZY4I+f`8tTiQ?YkXnTAlxtwZ?{|_|9Pv zL@seXV*{MZIL&nANFMfs0pcS$-0Eq-+YC;7LWLz`+h5TbVGS5Itu?K&y|m9L<+8j; z8_;}^VpfuE=329|qt(VwUjk71GYahrjn+37!Vw8ME_971f2b4hR7~}wL=w27?o>OV z{CN3arwvR+j%6}CLG@@PXh86jHBIOt+>BI(LfS83Pi~AeY@IN&7Jsc!CX#oNWO|u4 zoDLH=g7BlZyXd7Rr}T~$O0}V7(7?ZyLiBUsUnM;x!^^z*>~tAbeYu9S&I7nC@ie#h zlkH(^ii#?tr5;uWI)WxgWJ<0aa7=!w8$tt4bm?4nc9lfWG3N#>iH2s}uOyH1i}sun z!n+;^pRy5=P~RO@b=2rREry&Uv9%WA1T3L7KY;|>{3svN#_Y6|#a5}f7YjoN&+vpszWue_lsP=2-&-_R=w!d1HNJc~= z<7{8Ecs0>=n!l+YP!RX|$Y;A0T$!@1-NKDqrKB*qQS6aW*kuge!c_Q?+(OrBi|*z? zSNT+@EAevb-*vx6q@KIDcQ`e1t%xyS4Pjzp`*2sbjgPlYtp?1!%E)Pfc+@(Kee6g2 zHQG79KYfCzADR&F&OPowbk(%7RE~2U%$YYfU@%lrKq?;d_-$x}E9>sMK{dXHkKGbT zF4i=vw4;rH--u*5=9w56^*3U{$(3*x?~-w|=}WCfZt}mrTyKjU;pk{d$5h>lA|>me zSGPJN63S^bEWQ6MYS#@YCyy=p^Qh(^*tMm0J#6lE9SF-q!l`k;21{bxYQU$wPX7>e z7QD3O(FD*`ZS<{qLV~W7Pz``C&>Z!VJXQimvf0i!Ca-}Ej zwN7ooiR;g({pPH_T104%bttB{XFyVwtQ#PNNKJhmii#P_(T*x$CtQm#r*VcGwih4T zOq1_qqP3NP+PXrPwH3#KXf#Nb!H&ggmA=afDZF<&Sgs96!_D6`y1|2F=k`n|UANlgFNY|(dy`@I~Tt3@-0k4 zEF?#3ZG}#pMBmc|X@mX&wjlHyQh%gs4oO&i&A~~u!ekZGnY^_lc#t(@Rr8=k3qrRdwAHd8hTU8A&hn1F~r3sel z_+9O|s7?3)kGlKcMA!s_mbmviTLG7Zx}7mK-JHe-Inh|n4d`_B`SX+Fq+;I;RYP;R zhUDO)CJ#oN#s|rf@Y7Cl!FY+>mB>+eN=nW%2|$}hk9f1pb4R~~_bMeE*x6Io>QoUF zHn0*Y9~%n+tqV?~rFv%yXim51k&`tp{^!@Z{I^u|eCmX6M5v5Da6Yb*TYf>1u(gDp zKY15;X($yhZKb@Vv{MD_Dm#k+HHz!=GZV#7u}~EN$%SykS!N3AOrJ|9zc^6GP3$Ll z=dX>2;eYoH=>4J_Hr*hw69`b=sf6Hr2wLt9kt=VTSsCNWC_=ZBCd4vHWK#7U@KZ!& zBQF<53_(eg$)9wx^EvYtkIkghqI;tt+~s zBn#T@uswA|agMm}Z54tBdn9Tn4`L3dMgT@>qUyV?pm3Px(Oul5M1=0uJ3z%!c?T$f z<26}4)fG{uH6cHBdZ{#*lXL{G(O(O8_DgB3K{kaD9NKXy?^VyTuGa@LEs281V3-n< z#lpEtSO<)|#Ecd8onFAA8{ySd!MGDb9Fp-Uwb`B>PTsf(p>)2DNS`({5omx}kuOSl zHyDUmpO*vq3289>Bj-ch#af?!LhGm~J23+U?&?L?rl=Cd?ZJJ~W$@%yamK8)Y$%b{ zF0MTSN>F4=#1i`?7-Anv6M9`kcjt=AJsp5 z5TDD9mX-*j&7FMHobAN0&hC?^dbjf%14$|1SB#`hQMN?z8wHbO4_cquB|}&0gtO37 z0Vnm^IQ;7oDPJ)f*Q7QWX(aMazs6~VNHwMbQNx<}4n`qGc90JDq`w!${rJNPpGzs% zmF>0`k)UK^IFSN#12*qPme)F=hc6c1`)E7G#mVjrBDq!w3sFySreH|?&Lxl-DizNzh_O=kXND=#7U`XLE;fN5@l9~Ng!iJ`@^-eMyu(;~^BEf~% zUW3w`5HxVg($)~CpnAIRFWXIw30M*{GoFepTq{8jkuH4TN3GX$xVCH@S);-{fNHB0 zA^{LNMEP9+kOR%2 z+;lR0Ku&%w-G2>Is~HY}Q8->sqa2E5E^uC4{?^rwX-x-SfQ;O;7OZ@I=kR3!X^m(p z$MxBcC7g-T9T$Nal;TN?n)F*?Oo{jjHgLY4)Xs&(t5n7z!K65lA3s3%uL|7?3kvFRRTO;X zM4GRGEwyGj8P7qf=`Dj_Pm3l@*aQbk0HOQiF3G2!(N zFt*fjD?Cx?4i>#{yJ>XQK4heXQ)z+jOj0G`5(jG$z3qLqh{x>&dom+^Af zg18{{lM?)kL0qvCo`r7tXgp2zF)v+B012suaG-ZrwhMl&gwMaAzP4;=`e!rvYB`35 z_|DRMRSqWX4_@{C?r$yFgdsf+{&G*@Raw3f4{kvd^E7rehJVsE?|GI$9_wNia-@Xch<^ zBJo~SV)49Y5(7h@ujqDN(n#RR1$8KQ$MZiU-Ub7K@P4dS$Lf9idLWD!)9Hpkz9d_) z?T(Bg(r*n%=2GPed(#~|rshuk@d|5PNnqsURavAz9!h)DzB`cOTD+yd`1@3qqHJ|P zs3wr{;Qgj|bpwJ8tlCo!ctdqa@3!D>Rm2x%$Ck@=J>$$o-f9q~jw$`I3?~aM1rHM+ zjN_k-h&KU-k18bp2uD5-zX^6tDeifgo|y9&IFoi&OU>0gTzpaROR#=13`7SQW*y6y zjopj%byrKs5e~C5sd9|5t%?1~dXiRwdxMPr#ZV=F6e%s8EU3ffDAXXuPL9o}g{Kyh zVn#a7*O>hE6#@k4ikD`2cViA3yR46McZI`rU6IM`sWDRlM&rn#@-BdRAqZ8CFnS)! zoB^>G)Djzm_)dm_@6^~1+L^aB*XazmG|kZVlkNgDfYAm4yTL?EG{)3u#K1bRoYUw% z45}Xoz0}v7TXEdSy?Md4?<`Rn2}B+p$?m@m4{S2kIw%oXQuDGs3uytn?F zMr`|u(26+bW%EOKqOtL3Wl!$>nd1=?m@x3{5mVQ;NWHpNUj$@k@g^A9Sr{0A&Yf{e zje2(Hn|?7D+3oc%Sk*o(0T%v)o(uG7yW>QE;W1%l=V>65mbvSY7e&Hd zfU++=JmWMG&5yUww8&U+f%3}WY4q8PZa5Frx)oaCHE}okZZDz)(ONW)Hu$c9fSvI9 z>kv$Y#$2VLOqh}k?WM}X;6yH$H9a!yVE!<7l5q^Naf zN8O{nVo{7Ufg`YOlt6U80osQrCRDnlB-r}btvM{gO__N}5CG?;)o-d2y~+ zWsP1%7B&l~)W^aYN7vG)U=S1tXa&a-aw=ldSs}zUwjZ&fZ-+^SgGR&y*7*T#h&P0U zfAA8VlB2z?;~Nl6A`WJWXtDjt}2pY3GPheT1t-QS7yjiD?z%wqXMG6{K|RH38~ck`^d#l=@kwyl}2vnh9)P8g|F@=DzZol>F5?<&cFR z7qS(68RDN4nhSk&47#9lwLcnBZ~t=LF3$d#Ni0w7Zv2A9-QH5%s8vqltdf>YmJ~5I z>giyS1>~%yQixMaym_7TZhsdakM}zLtQTCK4sJ~*cia77qcHITzyaF|QfQc~*-PN& z^5eavrYd zE5wAtuE%=!HaYgv96*mcpDd7z86gMjR(r6)KN;|e8ERs>d%@QDo>-6I&2K6+#qGV> zpQE@8H;{9#`za8&0V7(Qn|`>Kh(UpIWQFsvE3q-nx|APDJkEB}M_>QW&a%q%Zjz9i zDRSQAP6K8rC-+~m$~IJ1K~78Rg94271#6?MdkGGFEM!a9E>YR;9FitsvC(Ux*9z=+ zFL|oF(dL1%HP$qL)DQR6W||)XVO|JFJrHN(?Y=z9gLdTE71@PFB5K*pe~(o_;Bd~y zA1=NMYtpcfZtJqmzRXM4?e{Y9bqA78MD*MghAjIJbEo{e~jXMH9~3Wa--1o6Wy1pRdlMzGaoUpQ%Nv=OBFoOY!$d2$-T^peNfT8dft z@TEfM603sD$T|r_e-nR2^+<#`J40-fVF}Q5pshZNh9qfpvtm}SeS{84EAUtsFw2a4 z8L)gg>bV-5`4XC3v}ap9b=0!0RNJpmIO77e#>K^VK7LPRO|hkm$*f3Kof?HM*mW9d zz_7pB$KDWL70wj?#*GKjka;d~YgjVY;=7IK`@jnF9q>tu8V_L+lS;?PPwR1FWEu|@ z!EvGoi4jenE=M-Qc62&31qd##y#P9$qNGtf8uwsL7*hNY53o_+LwuZ;880}SP%|T@ zI|sKsC6a}MWYyZzQ6cb%=4NhUGbmaXu45PL|1IcNtNq-?T*|@cNoGsT-n)0qCKl-Sgo0M) zbgL?LDZJCKBGdX48BHhYlSu)o=+1T<=^9e|6Lyy~1;SA&d%dY#Nw&Y2MhDN9?Zk@%d#zw0y{nmH~2h){3@u zTS5RNeX*w>Wq4Ta>sU}fzgUzM@7aL7fY@^6x460%3n{eWtKj`VIF4BXMh_(3=RjOU z#*t9y07$%N^&}b}#;1RrAspdksdMtks!xb*^f>8C48ZZM=-C(CGPUAaDD++v%mPQ% zqO$U6N=-+gZj<*+plXVtM>$DCU`KgYV=?IpmHB&2!pc=?ZQG0WUQyIb}YR_ekX&GQ>Q+TPKDj)sFq?(fQ6k-N;{rKzk+ zL}DG22{Hu|?2+4F7sq%&EOE)rN7t!hBRGQ+a^*#$btHH!Th?D_BiZ?8eDgZMjus+N z8L0&Qh~9_1WY?4m9^RIRVyjY=R+4i7F9&=aof4m%)pu9Wr-~l_8jT*G{8`RoPDmNgdFZTs)ynXEAPIA@VXOtgDZ9)h7#kBJToaPlP(nWpP@49% z5Q%ZMK>C{OzU|R2SzR4i7(NOg;EYeuT+i%Gu>rfN&>+#Yq8r%QWZiCPne`ON-ePD8 znJL*KgY1~n6ui<*ld+K9dIkD(Ka&uM>$=!9q^FDVM6GN^2y1KHKG|}U)tL$oDKIbq zXfG8aji&{fjkGE!R`Alu&8#F#^D&plOd&qf^UbhU)M<`4@|;~fu}l|=2VKTYWOd`D zBu^LjiXIor#hViyX!&l_N|!~bt2`J!ULnm=sJ!7H8Hm+&x9ocO)AFjO+!Zi!10OIC zPP0b_(`Q!h-vcgL?)1ev{fQSA%Op8omev4yvokFA#yer{cmbIdg1wV=2##*`s*soc zK==H%5Pyr{qb%ZA zmXTp3DACsRLurOf{^$Nu6-HX>9AFv_17LRy7N#u40YE{^70Z*wtOivFah5d>%`1ag zME76*U_oI$Mtha%F+v-`xl-+NL&PkkkAJTMYd=#miM=4yljK&ULvBc*n#fNqat*)9 zTT?NLJZ2e{;`V9aZySre!(30YL|{inM}52HT9g+Ws4{sY;(E*$_} zldgjMKMc`r?77pi)gOO{5BcV3s=?3PQB*XmP_|h_N9?1ND7?7;XW8&kg!OkJ{~(TZ zQ$36kN6`&^9wzQb*NUJ8ML?Nqy!r(`B6p1d2-&+RHW72SmPE^OB}lsF&RK3I_F*m5mg|Cz4n3 zADFh_$?z0zhwhFZAnL?KLXYHOWI|U3rc=poRXBr+Z+D^rW{gPd&-YH;lQ-P~Ox&Mt zf5XC{ic@-S0>#@s^R_(zVuw)B3l+|yV92ZhmAjZZ91P#}i)@*+W#UQu7xGukU}EY0 z>>yrb+#}C?&pf=R;txfid()Tz8oy#nk0L@Uxxb6_Ujo7^CfWe=>c{Z@85qV~aE1#` z%<_f|+3uhHOvotK;8_}w0{SBdSoWa_f&@H_4b>+FzG#+4a;Bi;OfVVxTSLT%Hg<|) z`9)|-p_?WQHM~uEO@<7l-jH9&i6fQ!Xe*_VAz3}xl|zz4d2>#UtWp##iCkVJb|u24 zyg5uG;zeJa;DZGFuh!c6R(rP=vAI^-#$n(tW~6Ia8ACMnW>nRPq`}lDA-N&T6+0;% zuy3krSQ+HBYkz@8P3IpjR7+n1MV-`#1_qil5V8nqe+G4J_nB4(Nq>ZzR5ZFbrwCAo zho|M@?n1J^GUfm*cTQ45tE^#UKu&xLW`F`$#4z`Hwxgd#>J|{(kWBR0ZJ4t?M@9={D zq~Wv``#>h;R(C7G+*>7Pjx=3NxjG8=$)CA^^IN}5^rW*;LBFOdclf_SK7q+RO)jj9 zf8nWdPzm%V$#14Tir9ktf464HWVNvrp(UC^Cu{N4ZmnVjcc~9m=qa4ZtCMd+!1gSQ ztLH#pL`oQHd96g0)Ij=*hDodo7o${(s$kb?utS2!t$x(u7M#8TbABX4yb)92&7BA)2?e|P{>e8vA6A~~?@(!3_?Hcg z0=|wysfUVqk}+X+B^Pw}36L9`Dy8mmH%{%HRE%8QC%hCk*}LVUB1yIle8L9o)s6+_ zyJP1dK@_-(f@G7L+X+2iE ztP@dKu+=pxCAsc4>ulVg5?bo-|G_$A2uqK)>kf8DBw{^|*}3pJ3LIem(Wki5eogjKnr#9|YUy5skPJPB zo>czsr#Ps1mzpK}7~V{+(Hd+bwxs3TLi_HQ5F_YSPLT}Nhf+FbDWxvEtZ8z9!W8;% zn{W_8rX|qSY+buf4s2}zRKSZ;bWU`2UXLYnM#D(b*dpK|FRl`*4LF_!J1*w(+aFx^ zj_8J>575!nwvkcQP9@K*bsb&r%kt!4rs`fWbbZ~sJEGt8ne;^puv^vGNCfpgWg>vxEbdq52x(@>d+$D-m{Lk4X&NCz{xZlR9tnqr;LonDGoG-l>y`(Pp| zVM4v+u4uSQUuHn#hXEcFaXm1cVMD;JrPI+jS~K=8t;Yt=b*dPn7d4ckN!adP;OY$8 zIi9re6|6ns>a*Yr+%Qsl1I4mLOfB&e`-&Bp3OkFObQ8qh00o}1}cia|Pf+N$Bjkeo54r!`r^&vB$6$;U8@i*!NZFNS;x)W0S| zVit@o9GcN2Tz#eWSO>K?vS4I<+>+39)IU#7Rm|2TNWft>;5UQ>wL0y)pReHtXmwp$ zdv+`bSc;pNltYDCu62hBpB%7ZH7CpXstQJJBl(Vg!Y7YvPO6$D(?TWvDzDi5; z)k0*`)p__0RjE8LVWHE^7;j`BxT|&zxr@e0NG6sl$07erEsG%!-D_t`yqvb73T*A& zT^jzW{t&0^;!mhiAmGUSb+e+UFCdZOe|BW%$W3|Qp5b{HR7pe|_Xwzx#jhc<@b43~ zSj#6ZN+t8f74|Zlq>8>U5#fT7!9A<>4iFZ?H6+2 z_94!GnB(;f)@D(bR8w%V4|BtZ;!$}3?Pis97dA+f3+LRGMou~s;W0%RhMVYdZ8}wn z4U7_o>*{!sppDi4McZ3PwH1YJz6l{X1oz_ZP$W=XgOpONNO5;BQlMyYcN*M_6l)8` zU5a}t6faiXp}?Ge_kMG~wPx0unRVCvK~8cw*~!V-d!N1E_j!IBE}^#3>CVlD(9y)~ zwa;}ky;yCda{E?pL6UuCAG${WJfwb$^&B+bt+P&rg{RXqsTFf_f7hwL!XEDPG=GiH zv>gm*xsiJlO(|ML$%~=O#O`HsorfSSX*-rm5@^uoL1CI=XG?SJECzev1m%PX2VQ6n zw)=w8QX2i;HIjtaiow&{MxYI-P&V#cAOS87Q&PR4h&DT#Igz%vBivcR2_k@HrS_<+ zu5hzS;{)z@c6R0{zp00%OEYN5g!+Q&=EMU+((c_a?#`sTtvZ-FZd7`vf}Az))RU<+ z{Fq58lIqqRTLH9+`R!^{Mw5@HT_L=5&^eZ6pkH;{L@T(W^u3eDy=A=dB_+lL8xjTq zvjhedx3oIO2usFT9S!Srq?&xbm_Em0n`C&pI5sh+?EaV*m<`I#x`yLGvRQa6p?dgot#hhm;FsVzQqHeE9}lA{eiV>oO#S@RD^=es6@aU ziOZrPhEV=m8Sjs9EL2mcZ)CdSgFWa|kyqWRGLHPm^@0`F!CKn=FKK7%ux38icjYC& z(nU+=9eSDG1o@6GL9JZM#O6SI?sv|ofT4U(vddd5!!#+C1;s9Z%q?J|yJm|@sU8SH zrQKy>Vaf>?cedI8s zM`BE=0Rr$=OqQijBfT4F4U2rUr)`@>22@m^Ks*;j7!ld_XsyojLCUQJWlJ z_fTdK#J~PVt)_ z5i@qdh$;mv%K?NFddbj3G<;sHxB{vDsS$zxW-=1cv4)b$jW8}qAkZlz~h>$Wh9HD%G1vBeeb^a4XBJFVw}Qh zgy`~kb#E4XKzgq}85$UuuLLX!d!q0)R(9Ru@lhMRFu&%F=0d#jW7r#T<(fk`g%0{#s zduOjGy#jEIQoSi1I))dJ5f1h}A@vwC$|5PGD=4p@d(|U`ua(2rPC}uzqSiutx3X1?6jsd!840>lgJxB- z>TQ#!p}>HTxbl>Pd_{R$IcLnJc$W!V^OPI(=(qe z)_R+sJB8$6jMIB!qJjOkfj(h5gYetzeCEF1q=F_%x}b^0pIoAjn(O6WC!xZ4oEDU5 zT#IG>^j3c&5LqddaXlzDs5$nJJFVOEcO|-GT+;BYPKjbMub}JshiuX_J35!3Dvq z_bAD43ft)lkhePZq%L~evq&7~AL71-PR{D@8R)MiJB1dN0w)Z--I=Jp+JXsQRpx0u zryW?0bo+cu6;Uc$0we8Q#Y0Ot#CGhALYT*j7_LV)!qoJvv2lb5y#l_WzNZW?)vv#y z+xKAYUYFrV*lMgxmfs}9*EbPUBj_;^vBYV!(iL5HHJ!R$mMaEtzH!!0FKhwPY)Hkv zQ~Xg@#k#cZZnE$CHC==|Fe`q>Kaep&T=w1^zZRiDy_rN?{?m0prc>>Ag$OW}j4?jm zQDlf0Nn$SBz+s9Pv8|mya&!fvp3(#+#k)Drvww*?67iyO#iMIV%Dx^3=Y%G}fID%s zNYSdnR*`!52F->*;x=LaEoJ{xvun;p_FA#M-<5~NboO>+CPD*2wNiAk*1qtYoN-A+1j%n5cwukF^m*YE!^YJ zF8YWjSy_F6=QiLLo`g6LpQIEH{M2;EN{~DJ^@)VY~9Z1>VY8;sc=7j zN7qXk%8t9uuXHzbmz80F=#`yh1x3$-S6Pfp`E89X2&HpO7p2m5rbZT^Wbny$^?7vH znF{e`mb8q@$I~%I?3ma*U;1!eyBX$ih^S-Mg)LRgY*r# zdsQl#%4%o&D-h-QRL#6`@cNRAeOoX(R!xVI z|ApXnTKeh86d_@tPU{zxn$Oz(98C&Ndh#DFNR~bd*R<)z*O$PbDVr%uT>}k(OKDN= zbFq)9xUF#l3?1~8MsOY&jKH$(sxXe6{~WLxhe8J4kpOD8Cxf!-t$66E;ao3U#L;BV zxP!VrO$};$fkXAnBM4w$R$)Wv$q9`L8Ddf4Bjh)&#vf2*T-i%lQLqL>h5aWSe$OVk zQ}DZSKGbrN6WHw^Bo@}Ybvd;?0nVF6cpOEX$PhQDEB)DOqG zNwB;vcGQ(K=&(TJJ@{F*H|K?Wg`fnHgR9)LK*9=X*+xmp|K zXAah&<*)exR9n>VA98)0;xH{}Kt4AJK9BB0dR}F#~L!Vx> z{V;3Orvm~4YPVIn;JP42rM+fWV>K>DhBy}+gL|%7f6eMzb&IDTNq7w-4np4$-Isg{VeF;)Nq4-bN7xgE z$-FhJ82OdIpg5C_QMEzSpjgKZC$7BT=EbwPWZWcCI~71NQA)CONQx7z({J+}Bl#=L zUdpYmSp219@{6`thM=j*iun!5)TB{#F<@r#+>BaO$#2VwjUT%JPlP;}k(gHNw&YY) zk2y}q8h;{6ulT+2!c)M3B)Nb9n8V@)SbBOIH^9oH4B}-EF1N(Fjt$y@>A%=yWHB{+ zMjfnwmJLvR7fcA_#iw$S#zq}gY|K#rqiuF-=q1pQZ zY$7c&B_#I7FeFT=%k46s9K)%^`Uq{cNtqXa5%5hFNZX#E6fk3v&xeh_F}`#L4MQ%b zK!7^#jWXyzVw-c4MtEkJ7USHPUg^bj~h1g5*PQQXeg6cZcoyVE!470OZ3^$!& zR_T9fIaw$jYPTWOv_^ciRe>t&$CGg@Z4?5^1a_}6S>;&RU#Z*mhH_~}kph8qhoGbs zRu&4<-XTxfk0z8)3mw2Uf!0-B5@JGXOuPjSVCU4Yucy4Ld^F-Jy+(PM33<%`%MN{L z*?G=3Xl%mLqF!i0QDdf*7?XeF&+ zK3A1Bt08(lNk@f-^ zMZ<9TdTrL~K`5M+CVYHrY7KMPX#M&q zN!VyC#J|W=f`0PVdP4$HZgxmbPMu(E_)%ZwMO^^GNk073HW;`PO}4dRC_~P_gN1(Z zreelf*B9?s4F7;sn|Qh&q2;?XRFgfSW+lAzY`j+|8D?q_%DVE2)KFw)#dm?(xW;#- zmM%j$fP6l2?MLlJ;moPVy8<n4G)nx~b5C{HEJFD|zz->j2(ex`kK6GM2r!<;&tl=UlsdYr3zu2fbN|Pg9WR#*eoCnc| z(76HSfq_3!Zy>%Tq64Fn_#b%)0}#Vf~%BKq~(XTiuJ6wZocD&|YCW z%&f(5Qk(9{vd=TICr7;be2!Nf*>DYenrBG{lOw)WvPRm~OxQRq9aidyvPsiZ!{1?N z&LcvA1qLmm>SD*)NIywK`XkI(x>Xh&HV0cFqh|gUh04WL8V+RNKH8on8i}uQbu|(7 z)a1Bct~L<{K(O#I^}G*CHS%{?!pyL(LQX#LITqk>1rWXGPHnz)BMLJTUGEJ}kGEdF zj6f%jK=qUe+SsI`Stx0c&9c(%ku6p3?h}2#66AxF03!M-H8~mh{-G%DZ)9TEx-Hxf zi^!D(mpnp|*zECTezxoqJ@n497F8k2@e+XNpgZ-==EB?coPH#)ZfEz}Do20U=h9o{ zyH3i351}!{uztDb19#|d+*F7Qn1|zQ1_S%9V0O*-_d!YKg(s6v7+foQpz@hL`uJX0qY@iGS$4CAhihIH`D#gSYb%kw<ocPHSYcK?u0l zf_;o@Vna~?{}45?#u*g+b_KoGX972@R2>=$?%hBtLe_KsY9XiLH#;*!X?6adKxp1* z!IR$dBA!qG#DyX|#5lP}$I{6!U5zmQl^T|{rD7UB|;SAXusG5zJCigtBjRWZfp3DU8iYWD(%oRzrJn6FhOD{hC8FrNFk3ELG_j~;LX zIv1JV_I{Rh35}QUavF0V69$@J3QkS(&JGSZ-Ml!w$9BQzqCR9L325tHBBFLOBmZ3nLl@S42(P&{^>><@{KKBkvOx!9>dnP;*3JC zX7ABR;!?Mw{H1*9)si9sKT6Fo^CHS zIxHcQMfKE7SQ>un7Z?-e%f0N4jhQ5-&pq+7oBF1rnhwuxZ-U9~T;CWU!D%xumle@G zILI~oIXshwV-UiXwHLvnE-ZEW;ngs}m-9qK>xg~wP|gl?FY9y`{(B%`Y)6DD1I{YoG=m$%hW7n?#=5a_E2sr(uyM+X z<^KTBiPdV^Pn=}Mws0CsV-n*VP|y^YOGfLpKUGMmphn~QfWN@&RZ`ol zuGoIB=>K&UdvI{uAV@BZlG6RfjK`ssoZN73IcuN1oZO-B8|FH~Y{c2#vHkB=ev^=` zBT`Q~)>Zbo=g|m8iNUwIIUXV`Ejc18xhaJuX-eE0me!tc#L~xi3`A-?XO@hK)6XBC&p5 zC*P8V6JeuNF!4)m$l1oKT`zfgY}U69L~#Qc9*_D^_8SuZN^k7#xH2Tm_pDi&V_Fri z77|t>h@jgyp#CS^yUb)`Q3wX!bWP3YQXReD(s~D9@m4ra>9h6gK66G}jIlDG5T;2X zPQqdCILSof6$#3r^lSQFg~aP1w)CYy<`X!WQSQP`KT|=nT^_Ag?69i0j#yA!;Dk+Fu805i;i0%>wufiip2iZUC5KBs5}NKvi|q>*$bte@}iU z13FE)cH(WGJvfHm;Ky-`$ju@Lv3(LI$hQtuX|ZpcN3zuS+I+g*;@CETUJ*iDZN{z6 zm0e$(3)RzK;D#-+7isdhF(oTY*7la$uyO|xt~*6-jxqNBBpfQ%$;7W^PEs>~et#~G zoge1Iig6&p&~+KS_yX!{0QlG94^eYm-8UC-Z>O!-VjGF#;>Q33wGx@%jC2cGGT;dK z{24*2_u*MoN?A7@?Mq%il`(ZS#mpAw=ZI&M<+{QW%s`yT?67o)>85jVH8w9foikx( zmHeh&yz-Tl8RqT{rr`1BXtL?To;EtM%NHRP&V0}>rc z`di}W772-Rv5iZyLLY!p{GOE^TukhO8-Wmja~tO_1l8BRd>i`L_ma*%Fq+@Q_xNB==>o za*q<9w{OCCw$(B9VXuwMRo?bDq-;7IvJT`fmf|_%F`TaHN`}8{77Fg-ajF=8Jd#KJBSYx2$Q`kz|0mj)Lnym53IizHHwpYbK^wRow*SE&Q9GnG2L{y zTYb@eioMouk8ifd8LcyNBE$vsC!p{EwIE5>4aSNVM;z%VL2p~Eg)av$NGz7d5AFJ7 zZ60_gqp&ws(~Id$IKq=rp-AaK%O*OF!Wxj{+SePevg-O7^BfcH z>PF9*UvhOS6#E6|={>6hB05WL6X%vs%&S8_XOivXe@ACA?9hwQd)b_k;uYyBQtHai z)L>j`hEzN;j)CJZK_$%7aH@u$WWnZAhcN>g`a+p@QKgps@q?s0OPO^Gp$FtrM7{(= z3p?iSzZ~Jxw)|#+=7GGHIHMt-y2X`oO>N7|jfzp#VWJdZ zT=H6c=SCZyr4NGH_0<$M`uCxX_TAHmyOmGxZlvD*{nSDA_#hQ)ax=g2?%_u1b;l7| z#VfNa>cxW>?;f{Lc;6fD?~F@nHa#}HySW^Hm

    LfA{zCZ^Wl}r!S-)woU$C&mVPM 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 $o5ujLS+}9+k@7HEc-z7cEpePRBLx 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 + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%BeginResource: font T3_35_0 +8 dict begin +/FontType 3 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/FontBBox [-1 -210 777 728] def +/Encoding 256 array def + 0 1 255 { Encoding exch /.notdef put } for +/BuildGlyph { + exch /CharProcs get exch + 2 copy known not { pop /.notdef } if + get exec +} bind def +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +} bind def +/CharProcs 23 dict def +CharProcs begin +/B { +673 0 73 0 673 716 setcachedevice +q +73.25 715.82812 m +73.25 715.82812 359.375 715.82812 359.375 715.82812 c +359.375 715.82812 444.34375 715.82812 486.07813 708.73438 c +486.07813 708.73438 527.82812 701.65625 560.78125 679.1875 c +560.78125 679.1875 593.75 656.73438 615.71875 619.375 c +615.71875 619.375 637.70312 582.03125 637.70312 535.64062 c +637.70312 535.64062 637.70312 485.35938 610.59375 443.35938 c +610.59375 443.35938 583.5 401.375 537.10938 380.375 c +537.10938 380.375 602.54688 361.32812 637.70312 315.42188 c +637.70312 315.42188 672.85938 269.53125 672.85938 207.51562 c +672.85938 207.51562 672.85938 158.6875 650.14062 112.54688 c +650.14062 112.54688 627.4375 66.40625 588.125 38.8125 c +588.125 38.8125 548.82812 11.23438 491.21875 4.89062 c +491.21875 4.89062 455.07812 0.98438 316.89062 0 c +316.89062 0 73.25 0 73.25 0 c +73.25 0 73.25 715.82812 73.25 715.82812 c +73.25 715.82812 73.25 715.82812 73.25 715.82812 c +h +217.78125 596.6875 m +217.78125 596.6875 217.78125 431.15625 217.78125 431.15625 c +217.78125 431.15625 312.5 431.15625 312.5 431.15625 c +312.5 431.15625 396.96875 431.15625 417.48438 433.59375 c +417.48438 433.59375 454.59375 437.98438 475.82813 459.21875 c +475.82813 459.21875 497.07812 480.46875 497.07812 515.14062 c +497.07812 515.14062 497.07812 548.34375 478.76563 569.09375 c +478.76563 569.09375 460.45312 589.84375 424.3125 594.23438 c +424.3125 594.23438 402.82812 596.6875 300.78125 596.6875 c +300.78125 596.6875 217.78125 596.6875 217.78125 596.6875 c +217.78125 596.6875 217.78125 596.6875 217.78125 596.6875 c +h +217.78125 312.01562 m +217.78125 312.01562 217.78125 120.60938 217.78125 120.60938 c +217.78125 120.60938 351.5625 120.60938 351.5625 120.60938 c +351.5625 120.60938 429.6875 120.60938 450.6875 125 c +450.6875 125 482.90625 130.85938 503.17188 153.5625 c +503.17188 153.5625 523.4375 176.26562 523.4375 214.35938 c +523.4375 214.35938 523.4375 246.57812 507.8125 269.03125 c +507.8125 269.03125 492.1875 291.5 462.64063 301.75 c +462.64063 301.75 433.10938 312.01562 334.46875 312.01562 c +334.46875 312.01562 217.78125 312.01562 217.78125 312.01562 c +h +f* +Q +} def +/C { +671 0 47 -12 671 728 setcachedevice +q +530.76562 263.1875 m +530.76562 263.1875 670.90625 218.75 670.90625 218.75 c +670.90625 218.75 638.67188 101.5625 563.71875 44.67188 c +563.71875 44.67188 488.76562 -12.20312 373.53125 -12.20312 c +373.53125 -12.20312 230.95312 -12.20312 139.15625 85.20312 c +139.15625 85.20312 47.35938 182.625 47.35938 351.5625 c +47.35938 351.5625 47.35938 530.28125 139.64062 629.15625 c +139.64062 629.15625 231.9375 728.03125 382.32812 728.03125 c +382.32812 728.03125 513.67188 728.03125 595.70312 650.39062 c +595.70312 650.39062 644.53125 604.5 668.95312 518.5625 c +668.95312 518.5625 525.875 484.375 525.875 484.375 c +525.875 484.375 513.1875 540.04688 472.90625 572.26562 c +472.90625 572.26562 432.625 604.5 375 604.5 c +375 604.5 295.40625 604.5 245.84375 547.35938 c +245.84375 547.35938 196.29688 490.23438 196.29688 362.3125 c +196.29688 362.3125 196.29688 226.5625 245.125 168.9375 c +245.125 168.9375 293.95312 111.32812 372.07812 111.32812 c +372.07812 111.32812 429.6875 111.32812 471.1875 147.95313 c +471.1875 147.95313 512.70312 184.57812 530.76562 263.1875 c +h +f* +Q +} def +/G { +717 0 48 -12 717 728 setcachedevice +q +405.76562 263.1875 m +405.76562 263.1875 405.76562 383.79688 405.76562 383.79688 c +405.76562 383.79688 717.28125 383.79688 717.28125 383.79688 c +717.28125 383.79688 717.28125 98.64062 717.28125 98.64062 c +717.28125 98.64062 671.875 54.6875 585.6875 21.23438 c +585.6875 21.23438 499.51562 -12.20312 411.14062 -12.20312 c +411.14062 -12.20312 298.82812 -12.20312 215.32812 34.90625 c +215.32812 34.90625 131.84375 82.03125 89.84375 169.67188 c +89.84375 169.67188 47.85938 257.32812 47.85938 360.35938 c +47.85938 360.35938 47.85938 472.17188 94.73438 559.07812 c +94.73438 559.07812 141.60938 646 231.9375 692.39062 c +231.9375 692.39062 300.78125 728.03125 403.32812 728.03125 c +403.32812 728.03125 536.625 728.03125 611.57812 672.125 c +611.57812 672.125 686.53125 616.21875 708.01562 517.57812 c +708.01562 517.57812 564.45312 490.71875 564.45312 490.71875 c +564.45312 490.71875 549.3125 543.45312 507.5625 573.96875 c +507.5625 573.96875 465.82812 604.5 403.32812 604.5 c +403.32812 604.5 308.59375 604.5 252.6875 544.4375 c +252.6875 544.4375 196.78125 484.375 196.78125 366.21875 c +196.78125 366.21875 196.78125 238.76562 253.42188 175.04688 c +253.42188 175.04688 310.0625 111.32812 401.85938 111.32812 c +401.85938 111.32812 447.26562 111.32812 492.92188 129.14062 c +492.92188 129.14062 538.57812 146.96875 571.29688 172.35937 c +571.29688 172.35937 571.29688 263.1875 571.29688 263.1875 c +571.29688 263.1875 405.76562 263.1875 405.76562 263.1875 c +h +f* +Q +} def +/M { +762 0 71 0 762 716 setcachedevice +q +70.79688 0 m +70.79688 0 70.79688 715.82812 70.79688 715.82812 c +70.79688 715.82812 287.10938 715.82812 287.10938 715.82812 c +287.10938 715.82812 417 227.54688 417 227.54688 c +417 227.54688 545.40625 715.82812 545.40625 715.82812 c +545.40625 715.82812 762.20312 715.82812 762.20312 715.82812 c +762.20312 715.82812 762.20312 0 762.20312 0 c +762.20312 0 627.9375 0 627.9375 0 c +627.9375 0 627.9375 563.48438 627.9375 563.48438 c +627.9375 563.48438 485.84375 0 485.84375 0 c +485.84375 0 346.6875 0 346.6875 0 c +346.6875 0 205.07812 563.48438 205.07812 563.48438 c +205.07812 563.48438 205.07812 0 205.07812 0 c +205.07812 0 70.79688 0 70.79688 0 c +h +f* +Q +} def +/R { +717 0 73 0 717 716 setcachedevice +q +73.25 0 m +73.25 0 73.25 715.82812 73.25 715.82812 c +73.25 715.82812 377.4375 715.82812 377.4375 715.82812 c +377.4375 715.82812 492.1875 715.82812 544.1875 696.53125 c +544.1875 696.53125 596.1875 677.25 627.4375 627.92188 c +627.4375 627.92188 658.6875 578.60938 658.6875 515.14062 c +658.6875 515.14062 658.6875 434.57812 611.32812 382.07812 c +611.32812 382.07812 563.96875 329.59375 469.73438 315.92188 c +469.73438 315.92188 516.60938 288.57812 547.125 255.85938 c +547.125 255.85938 577.64062 223.14062 629.39062 139.65625 c +629.39062 139.65625 716.79688 0 716.79688 0 c +716.79688 0 543.95312 0 543.95312 0 c +543.95312 0 439.45312 155.76563 439.45312 155.76563 c +439.45312 155.76563 383.79688 239.26562 363.28125 260.98438 c +363.28125 260.98438 342.78125 282.71875 319.82812 290.76562 c +319.82812 290.76562 296.875 298.82812 247.07812 298.82812 c +247.07812 298.82812 217.78125 298.82812 217.78125 298.82812 c +217.78125 298.82812 217.78125 0 217.78125 0 c +217.78125 0 73.25 0 73.25 0 c +73.25 0 73.25 0 73.25 0 c +h +217.78125 413.09375 m +217.78125 413.09375 324.70312 413.09375 324.70312 413.09375 c +324.70312 413.09375 428.71875 413.09375 454.59375 421.875 c +454.59375 421.875 480.46875 430.67188 495.10938 452.15625 c +495.10938 452.15625 509.76562 473.64062 509.76562 505.85938 c +509.76562 505.85938 509.76562 542 490.46875 564.20312 c +490.46875 564.20312 471.1875 586.42188 436.03125 592.28125 c +436.03125 592.28125 418.45312 594.73438 330.5625 594.73438 c +330.5625 594.73438 217.78125 594.73438 217.78125 594.73438 c +217.78125 594.73438 217.78125 413.09375 217.78125 413.09375 c +h +f* +Q +} def +/T { +590 0 21 0 590 716 setcachedevice +q +233.89062 0 m +233.89062 0 233.89062 594.73438 233.89062 594.73438 c +233.89062 594.73438 21.48438 594.73438 21.48438 594.73438 c +21.48438 594.73438 21.48438 715.82812 21.48438 715.82812 c +21.48438 715.82812 590.32812 715.82812 590.32812 715.82812 c +590.32812 715.82812 590.32812 594.73438 590.32812 594.73438 c +590.32812 594.73438 378.42188 594.73438 378.42188 594.73438 c +378.42188 594.73438 378.42188 0 378.42188 0 c +378.42188 0 233.89062 0 233.89062 0 c +h +f* +Q +} def +/Y { +668 0 -1 0 668 716 setcachedevice +q +260.75 0 m +260.75 0 260.75 301.26562 260.75 301.26562 c +260.75 301.26562 -1.46875 715.82812 -1.46875 715.82812 c +-1.46875 715.82812 167.96875 715.82812 167.96875 715.82812 c +167.96875 715.82812 336.42188 432.625 336.42188 432.625 c +336.42188 432.625 501.46875 715.82812 501.46875 715.82812 c +501.46875 715.82812 667.96875 715.82812 667.96875 715.82812 c +667.96875 715.82812 404.78125 300.29688 404.78125 300.29688 c +404.78125 300.29688 404.78125 0 404.78125 0 c +404.78125 0 260.75 0 260.75 0 c +h +f* +Q +} def +/a { +522 0 36 -12 522 530 setcachedevice +q +174.3125 360.35938 m +174.3125 360.35938 49.8125 382.8125 49.8125 382.8125 c +49.8125 382.8125 70.79688 458.01562 122.0625 494.14062 c +122.0625 494.14062 173.34375 530.28125 274.42188 530.28125 c +274.42188 530.28125 366.21875 530.28125 411.14062 508.54688 c +411.14062 508.54688 456.0625 486.8125 474.35938 453.35938 c +474.35938 453.35938 492.67188 419.92188 492.67188 330.5625 c +492.67188 330.5625 491.21875 170.40625 491.21875 170.40625 c +491.21875 170.40625 491.21875 102.04687 497.79688 69.57812 c +497.79688 69.57812 504.39062 37.10938 522.46875 0 c +522.46875 0 386.71875 0 386.71875 0 c +386.71875 0 381.34375 13.67188 373.53125 40.53125 c +373.53125 40.53125 370.125 52.73438 368.65625 56.64062 c +368.65625 56.64062 333.5 22.46875 293.45312 5.375 c +293.45312 5.375 253.42188 -11.71875 208.01562 -11.71875 c +208.01562 -11.71875 127.9375 -11.71875 81.78125 31.73437 c +81.78125 31.73437 35.64062 75.20312 35.64062 141.60938 c +35.64062 141.60938 35.64062 185.54688 56.64062 219.96875 c +56.64062 219.96875 77.64062 254.39062 115.48438 272.70312 c +115.48438 272.70312 153.32812 291.01562 224.60938 304.6875 c +224.60938 304.6875 320.79688 322.75 357.90625 338.375 c +357.90625 338.375 357.90625 352.04688 357.90625 352.04688 c +357.90625 352.04688 357.90625 391.60938 338.375 408.45312 c +338.375 408.45312 318.84375 425.29688 264.65625 425.29688 c +264.65625 425.29688 228.03125 425.29688 207.51562 410.89062 c +207.51562 410.89062 187.01562 396.48438 174.3125 360.35938 c +174.3125 360.35938 174.3125 360.35938 174.3125 360.35938 c +h +357.90625 249.03125 m +357.90625 249.03125 331.54688 240.23438 274.40625 228.03125 c +274.40625 228.03125 217.28125 215.82812 199.70312 204.10938 c +199.70312 204.10938 172.85938 185.0625 172.85938 155.76563 c +172.85938 155.76563 172.85938 126.95312 194.34375 105.95312 c +194.34375 105.95312 215.82812 84.96875 249.03125 84.96875 c +249.03125 84.96875 286.14062 84.96875 319.82812 109.375 c +319.82812 109.375 344.73438 127.9375 352.54688 154.78125 c +352.54688 154.78125 357.90625 172.35937 357.90625 221.6875 c +357.90625 221.6875 357.90625 249.03125 357.90625 249.03125 c +h +f* +Q +} def +/d { +547 0 41 -12 547 716 setcachedevice +q +547.35938 0 m +547.35938 0 419.92188 0 419.92188 0 c +419.92188 0 419.92188 76.17188 419.92188 76.17188 c +419.92188 76.17188 388.1875 31.73437 344.96875 10 c +344.96875 10 301.76562 -11.71875 257.8125 -11.71875 c +257.8125 -11.71875 168.45312 -11.71875 104.73438 60.29688 c +104.73438 60.29688 41.01562 132.32813 41.01562 261.23438 c +41.01562 261.23438 41.01562 393.0625 103.03125 461.67188 c +103.03125 461.67188 165.04688 530.28125 259.76562 530.28125 c +259.76562 530.28125 346.6875 530.28125 410.15625 458.01562 c +410.15625 458.01562 410.15625 715.82812 410.15625 715.82812 c +410.15625 715.82812 547.35938 715.82812 547.35938 715.82812 c +547.35938 715.82812 547.35938 0 547.35938 0 c +547.35938 0 547.35938 0 547.35938 0 c +h +181.15625 270.51562 m +181.15625 270.51562 181.15625 187.5 204.10938 150.39062 c +204.10938 150.39062 237.3125 96.6875 296.875 96.6875 c +296.875 96.6875 344.23438 96.6875 377.4375 136.96875 c +377.4375 136.96875 410.64062 177.25 410.64062 257.32812 c +410.64062 257.32812 410.64062 346.6875 378.40625 385.98438 c +378.40625 385.98438 346.1875 425.29688 295.90625 425.29688 c +295.90625 425.29688 247.07812 425.29688 214.10938 386.46875 c +214.10938 386.46875 181.15625 347.65625 181.15625 270.51562 c +h +f* +Q +} def +/e { +519 0 32 -12 519 530 setcachedevice +q +372.07812 165.04688 m +372.07812 165.04688 508.79688 142.09375 508.79688 142.09375 c +508.79688 142.09375 482.42188 66.89062 425.53125 27.57812 c +425.53125 27.57812 368.65625 -11.71875 283.20312 -11.71875 c +283.20312 -11.71875 147.95312 -11.71875 83.01562 76.65625 c +83.01562 76.65625 31.73437 147.46875 31.73437 255.375 c +31.73437 255.375 31.73437 384.28125 99.10938 457.28125 c +99.10938 457.28125 166.5 530.28125 269.53125 530.28125 c +269.53125 530.28125 385.25 530.28125 452.14062 453.85938 c +452.14062 453.85938 519.04688 377.4375 516.10938 219.73438 c +516.10938 219.73438 172.35938 219.73438 172.35938 219.73438 c +172.35938 219.73438 173.82812 158.6875 205.5625 124.75 c +205.5625 124.75 237.3125 90.82812 284.67188 90.82812 c +284.67188 90.82812 316.89062 90.82812 338.85938 108.40625 c +338.85938 108.40625 360.84375 125.98438 372.07812 165.04688 c +372.07812 165.04688 372.07812 165.04688 372.07812 165.04688 c +h +379.89062 303.71875 m +379.89062 303.71875 378.42188 363.28125 349.125 394.28125 c +349.125 394.28125 319.82812 425.29688 277.82812 425.29688 c +277.82812 425.29688 232.90625 425.29688 203.60938 392.57812 c +203.60938 392.57812 174.3125 359.85938 174.8125 303.71875 c +174.8125 303.71875 379.89062 303.71875 379.89062 303.71875 c +h +f* +Q +} def +/f { +362 0 12 0 362 728 setcachedevice +q +11.71875 518.5625 m +11.71875 518.5625 87.89062 518.5625 87.89062 518.5625 c +87.89062 518.5625 87.89062 557.625 87.89062 557.625 c +87.89062 557.625 87.89062 623.04688 101.79688 655.26562 c +101.79688 655.26562 115.71875 687.5 153.07812 707.76562 c +153.07812 707.76562 190.4375 728.03125 247.5625 728.03125 c +247.5625 728.03125 306.15625 728.03125 362.3125 710.45312 c +362.3125 710.45312 343.75 614.75 343.75 614.75 c +343.75 614.75 311.03125 622.5625 280.76562 622.5625 c +280.76562 622.5625 250.98438 622.5625 238.03125 608.64062 c +238.03125 608.64062 225.09375 594.73438 225.09375 555.17188 c +225.09375 555.17188 225.09375 518.5625 225.09375 518.5625 c +225.09375 518.5625 327.64062 518.5625 327.64062 518.5625 c +327.64062 518.5625 327.64062 410.64062 327.64062 410.64062 c +327.64062 410.64062 225.09375 410.64062 225.09375 410.64062 c +225.09375 410.64062 225.09375 0 225.09375 0 c +225.09375 0 87.89062 0 87.89062 0 c +87.89062 0 87.89062 410.64062 87.89062 410.64062 c +87.89062 410.64062 11.71875 410.64062 11.71875 410.64062 c +11.71875 410.64062 11.71875 518.5625 11.71875 518.5625 c +h +f* +Q +} def +/g { +547 0 41 -210 547 530 setcachedevice +q +59.07812 -34.1875 m +59.07812 -34.1875 215.82812 -53.21875 215.82812 -53.21875 c +215.82812 -53.21875 219.73438 -80.5625 233.89062 -90.82812 c +233.89062 -90.82812 253.42188 -105.46875 295.40625 -105.46875 c +295.40625 -105.46875 349.125 -105.46875 375.98438 -89.35938 c +375.98438 -89.35938 394.04688 -78.60938 403.32812 -54.6875 c +403.32812 -54.6875 409.67188 -37.59375 409.67188 8.29687 c +409.67188 8.29687 409.67188 83.98438 409.67188 83.98438 c +409.67188 83.98438 348.14062 0 254.39062 0 c +254.39062 0 149.90625 0 88.875 88.375 c +88.875 88.375 41.01562 158.20312 41.01562 262.20312 c +41.01562 262.20312 41.01562 392.57812 103.75 461.42188 c +103.75 461.42188 166.5 530.28125 259.76562 530.28125 c +259.76562 530.28125 355.95312 530.28125 418.45312 445.79688 c +418.45312 445.79688 418.45312 518.5625 418.45312 518.5625 c +418.45312 518.5625 546.875 518.5625 546.875 518.5625 c +546.875 518.5625 546.875 53.21875 546.875 53.21875 c +546.875 53.21875 546.875 -38.57812 531.73438 -83.98438 c +531.73438 -83.98438 516.60938 -129.39062 489.26562 -155.26562 c +489.26562 -155.26562 461.92188 -181.15625 416.26563 -195.79688 c +416.26563 -195.79688 370.60938 -210.45312 300.78125 -210.45312 c +300.78125 -210.45312 168.95312 -210.45312 113.76562 -165.28125 c +113.76562 -165.28125 58.59375 -120.125 58.59375 -50.78125 c +58.59375 -50.78125 58.59375 -43.95312 59.07812 -34.1875 c +59.07812 -34.1875 59.07812 -34.1875 59.07812 -34.1875 c +h +181.64062 270.01562 m +181.64062 270.01562 181.64062 187.5 213.625 149.17188 c +213.625 149.17188 245.60938 110.84375 292.48438 110.84375 c +292.48438 110.84375 342.78125 110.84375 377.4375 150.14062 c +377.4375 150.14062 412.10938 189.45312 412.10938 266.60938 c +412.10938 266.60938 412.10938 347.17188 378.90625 386.23438 c +378.90625 386.23438 345.70312 425.29688 294.92188 425.29688 c +294.92188 425.29688 245.60938 425.29688 213.625 386.96875 c +213.625 386.96875 181.64062 348.64062 181.64062 270.01562 c +h +f* +Q +} def +/h { +543 0 71 0 543 716 setcachedevice +q +208.5 715.82812 m +208.5 715.82812 208.5 452.64062 208.5 452.64062 c +208.5 452.64062 274.90625 530.28125 367.1875 530.28125 c +367.1875 530.28125 414.54688 530.28125 452.625 512.70312 c +452.625 512.70312 490.71875 495.125 510 467.78125 c +510 467.78125 529.29688 440.4375 536.375 407.23438 c +536.375 407.23438 543.45312 374.03125 543.45312 304.20312 c +543.45312 304.20312 543.45312 0 543.45312 0 c +543.45312 0 406.25 0 406.25 0 c +406.25 0 406.25 273.92188 406.25 273.92188 c +406.25 273.92188 406.25 355.46875 398.4375 377.4375 c +398.4375 377.4375 390.625 399.42188 370.84375 412.35938 c +370.84375 412.35938 351.07812 425.29688 321.29688 425.29688 c +321.29688 425.29688 287.10938 425.29688 260.25 408.6875 c +260.25 408.6875 233.40625 392.09375 220.95312 358.64062 c +220.95312 358.64062 208.5 325.20312 208.5 259.76562 c +208.5 259.76562 208.5 0 208.5 0 c +208.5 0 71.29688 0 71.29688 0 c +71.29688 0 71.29688 715.82812 71.29688 715.82812 c +71.29688 715.82812 208.5 715.82812 208.5 715.82812 c +h +f* +Q +} def +/i { +209 0 72 0 209 716 setcachedevice +q +71.78125 588.875 m +71.78125 588.875 71.78125 715.82812 71.78125 715.82812 c +71.78125 715.82812 208.98438 715.82812 208.98438 715.82812 c +208.98438 715.82812 208.98438 588.875 208.98438 588.875 c +208.98438 588.875 71.78125 588.875 71.78125 588.875 c +71.78125 588.875 71.78125 588.875 71.78125 588.875 c +h +71.78125 0 m +71.78125 0 71.78125 518.5625 71.78125 518.5625 c +71.78125 518.5625 208.98438 518.5625 208.98438 518.5625 c +208.98438 518.5625 208.98438 0 208.98438 0 c +208.98438 0 71.78125 0 71.78125 0 c +h +f* +Q +} def +/l { +209 0 72 0 209 716 setcachedevice +q +71.78125 0 m +71.78125 0 71.78125 715.82812 71.78125 715.82812 c +71.78125 715.82812 208.98438 715.82812 208.98438 715.82812 c +208.98438 715.82812 208.98438 0 208.98438 0 c +208.98438 0 71.78125 0 71.78125 0 c +h +f* +Q +} def +/n { +543 0 71 0 543 530 setcachedevice +q +543.45312 0 m +543.45312 0 406.25 0 406.25 0 c +406.25 0 406.25 264.65625 406.25 264.65625 c +406.25 264.65625 406.25 348.64062 397.45312 373.29688 c +397.45312 373.29688 388.67188 397.95312 368.89062 411.625 c +368.89062 411.625 349.125 425.29688 321.29688 425.29688 c +321.29688 425.29688 285.64062 425.29688 257.3125 405.76562 c +257.3125 405.76562 229 386.23438 218.5 354 c +218.5 354 208.01562 321.78125 208.01562 234.85938 c +208.01562 234.85938 208.01562 0 208.01562 0 c +208.01562 0 70.79688 0 70.79688 0 c +70.79688 0 70.79688 518.5625 70.79688 518.5625 c +70.79688 518.5625 198.25 518.5625 198.25 518.5625 c +198.25 518.5625 198.25 442.39062 198.25 442.39062 c +198.25 442.39062 266.10938 530.28125 369.14062 530.28125 c +369.14062 530.28125 414.54688 530.28125 452.14062 513.92188 c +452.14062 513.92188 489.75 497.5625 509.03125 472.17188 c +509.03125 472.17188 528.32812 446.78125 535.89062 414.54688 c +535.89062 414.54688 543.45312 382.32812 543.45312 322.26562 c +543.45312 322.26562 543.45312 0 543.45312 0 c +h +f* +Q +} def +/o { +575 0 40 -12 575 530 setcachedevice +q +40.04688 266.60938 m +40.04688 266.60938 40.04688 334.96875 73.73438 398.92188 c +73.73438 398.92188 107.42188 462.89062 169.1875 496.57812 c +169.1875 496.57812 230.95312 530.28125 307.125 530.28125 c +307.125 530.28125 424.8125 530.28125 500 453.85938 c +500 453.85938 575.20312 377.4375 575.20312 260.75 c +575.20312 260.75 575.20312 143.0625 499.26563 65.67188 c +499.26563 65.67188 423.34375 -11.71875 308.10938 -11.71875 c +308.10938 -11.71875 236.8125 -11.71875 172.10938 20.5 c +172.10938 20.5 107.42188 52.73438 73.73438 114.98438 c +73.73438 114.98438 40.04688 177.25 40.04688 266.60938 c +40.04688 266.60938 40.04688 266.60938 40.04688 266.60938 c +h +180.67188 259.28125 m +180.67188 259.28125 180.67188 182.125 217.28125 141.10937 c +217.28125 141.10937 253.90625 100.09375 307.625 100.09375 c +307.625 100.09375 361.32812 100.09375 397.70312 141.10937 c +397.70312 141.10937 434.07812 182.125 434.07812 260.25 c +434.07812 260.25 434.07812 336.42188 397.70312 377.4375 c +397.70312 377.4375 361.32812 418.45312 307.625 418.45312 c +307.625 418.45312 253.90625 418.45312 217.28125 377.4375 c +217.28125 377.4375 180.67188 336.42188 180.67188 259.28125 c +h +f* +Q +} def +/p { +574 0 68 -197 574 530 setcachedevice +q +67.875 518.5625 m +67.875 518.5625 195.79688 518.5625 195.79688 518.5625 c +195.79688 518.5625 195.79688 442.39062 195.79688 442.39062 c +195.79688 442.39062 220.70312 481.45312 263.1875 505.85938 c +263.1875 505.85938 305.67188 530.28125 357.42188 530.28125 c +357.42188 530.28125 447.75 530.28125 510.73438 459.46875 c +510.73438 459.46875 573.73438 388.67188 573.73438 262.20312 c +573.73438 262.20312 573.73438 132.32813 510.25 60.29688 c +510.25 60.29688 446.78125 -11.71875 356.45312 -11.71875 c +356.45312 -11.71875 313.48438 -11.71875 278.5625 5.375 c +278.5625 5.375 243.65625 22.46875 205.07812 63.96875 c +205.07812 63.96875 205.07812 -197.26562 205.07812 -197.26562 c +205.07812 -197.26562 67.875 -197.26562 67.875 -197.26562 c +67.875 -197.26562 67.875 518.5625 67.875 518.5625 c +67.875 518.5625 67.875 518.5625 67.875 518.5625 c +h +203.60938 268.0625 m +203.60938 268.0625 203.60938 180.67188 238.28125 138.92188 c +238.28125 138.92188 272.95312 97.17188 322.75 97.17188 c +322.75 97.17188 370.60938 97.17188 402.34375 135.5 c +402.34375 135.5 434.07812 173.82812 434.07812 261.23438 c +434.07812 261.23438 434.07812 342.78125 401.35938 382.32812 c +401.35938 382.32812 368.65625 421.875 320.3125 421.875 c +320.3125 421.875 270.01562 421.875 236.8125 383.04688 c +236.8125 383.04688 203.60938 344.23438 203.60938 268.0625 c +h +f* +Q +} def +/r { +402 0 66 0 402 530 setcachedevice +q +203.125 0 m +203.125 0 65.92188 0 65.92188 0 c +65.92188 0 65.92188 518.5625 65.92188 518.5625 c +65.92188 518.5625 193.35938 518.5625 193.35938 518.5625 c +193.35938 518.5625 193.35938 444.82812 193.35938 444.82812 c +193.35938 444.82812 226.07812 497.07812 252.20312 513.67188 c +252.20312 513.67188 278.32812 530.28125 311.53125 530.28125 c +311.53125 530.28125 358.40625 530.28125 401.85938 504.39062 c +401.85938 504.39062 359.375 384.76562 359.375 384.76562 c +359.375 384.76562 324.70312 407.23438 294.92188 407.23438 c +294.92188 407.23438 266.10938 407.23438 246.09375 391.35938 c +246.09375 391.35938 226.07812 375.48438 214.59375 333.98438 c +214.59375 333.98438 203.125 292.48438 203.125 160.15625 c +203.125 160.15625 203.125 0 203.125 0 c +h +f* +Q +} def +/t { +321 0 15 -12 321 702 setcachedevice +q +309.57812 518.5625 m +309.57812 518.5625 309.57812 409.1875 309.57812 409.1875 c +309.57812 409.1875 215.82812 409.1875 215.82812 409.1875 c +215.82812 409.1875 215.82812 200.20312 215.82812 200.20312 c +215.82812 200.20312 215.82812 136.71875 218.5 126.21875 c +218.5 126.21875 221.1875 115.71875 230.70312 108.875 c +230.70312 108.875 240.23438 102.04687 253.90625 102.04687 c +253.90625 102.04687 272.95312 102.04687 309.07812 115.23438 c +309.07812 115.23438 320.79688 8.79688 320.79688 8.79688 c +320.79688 8.79688 272.95312 -11.71875 212.40625 -11.71875 c +212.40625 -11.71875 175.29688 -11.71875 145.5 0.73438 c +145.5 0.73438 115.71875 13.1875 101.79688 32.95312 c +101.79688 32.95312 87.89062 52.73438 82.51562 86.42187 c +82.51562 86.42187 78.125 110.35938 78.125 183.10938 c +78.125 183.10938 78.125 409.1875 78.125 409.1875 c +78.125 409.1875 15.14062 409.1875 15.14062 409.1875 c +15.14062 409.1875 15.14062 518.5625 15.14062 518.5625 c +15.14062 518.5625 78.125 518.5625 78.125 518.5625 c +78.125 518.5625 78.125 621.57812 78.125 621.57812 c +78.125 621.57812 215.82812 701.65625 215.82812 701.65625 c +215.82812 701.65625 215.82812 518.5625 215.82812 518.5625 c +215.82812 518.5625 309.57812 518.5625 309.57812 518.5625 c +h +f* +Q +} def +/u { +541 0 69 -12 541 519 setcachedevice +q +413.09375 0 m +413.09375 0 413.09375 77.64063 413.09375 77.64063 c +413.09375 77.64063 384.76562 36.14062 338.625 12.20312 c +338.625 12.20312 292.48438 -11.71875 241.21875 -11.71875 c +241.21875 -11.71875 188.96875 -11.71875 147.45312 11.23438 c +147.45312 11.23438 105.95312 34.1875 87.39062 75.6875 c +87.39062 75.6875 68.84375 117.1875 68.84375 190.4375 c +68.84375 190.4375 68.84375 518.5625 68.84375 518.5625 c +68.84375 518.5625 206.0625 518.5625 206.0625 518.5625 c +206.0625 518.5625 206.0625 280.28125 206.0625 280.28125 c +206.0625 280.28125 206.0625 170.90625 213.625 146.23438 c +213.625 146.23438 221.1875 121.57812 241.20312 107.17188 c +241.20312 107.17188 261.23438 92.78125 292 92.78125 c +292 92.78125 327.15625 92.78125 354.98438 112.0625 c +354.98438 112.0625 382.8125 131.34375 393.0625 159.90625 c +393.0625 159.90625 403.32812 188.48438 403.32812 299.8125 c +403.32812 299.8125 403.32812 518.5625 403.32812 518.5625 c +403.32812 518.5625 540.53125 518.5625 540.53125 518.5625 c +540.53125 518.5625 540.53125 0 540.53125 0 c +540.53125 0 413.09375 0 413.09375 0 c +h +f* +Q +} def +/w { +777 0 4 0 777 519 setcachedevice +q +168.45312 0 m +168.45312 0 4.39062 518.5625 4.39062 518.5625 c +4.39062 518.5625 137.70312 518.5625 137.70312 518.5625 c +137.70312 518.5625 234.85938 178.71875 234.85938 178.71875 c +234.85938 178.71875 324.21875 518.5625 324.21875 518.5625 c +324.21875 518.5625 456.54688 518.5625 456.54688 518.5625 c +456.54688 518.5625 542.96875 178.71875 542.96875 178.71875 c +542.96875 178.71875 642.09375 518.5625 642.09375 518.5625 c +642.09375 518.5625 777.34375 518.5625 777.34375 518.5625 c +777.34375 518.5625 610.84375 0 610.84375 0 c +610.84375 0 479 0 479 0 c +479 0 389.65625 333.5 389.65625 333.5 c +389.65625 333.5 301.76562 0 301.76562 0 c +301.76562 0 168.45312 0 168.45312 0 c +h +f* +Q +} def +/y { +540 0 7 -210 540 519 setcachedevice +q +6.84375 518.5625 m +6.84375 518.5625 152.82812 518.5625 152.82812 518.5625 c +152.82812 518.5625 276.85938 150.39062 276.85938 150.39062 c +276.85938 150.39062 397.95312 518.5625 397.95312 518.5625 c +397.95312 518.5625 540.04688 518.5625 540.04688 518.5625 c +540.04688 518.5625 356.9375 19.53125 356.9375 19.53125 c +356.9375 19.53125 324.21875 -70.79688 324.21875 -70.79688 c +324.21875 -70.79688 306.15625 -116.21875 289.79688 -140.14062 c +289.79688 -140.14062 273.4375 -164.0625 252.1875 -178.95312 c +252.1875 -178.95312 230.95312 -193.84375 199.95312 -202.14062 c +199.95312 -202.14062 168.95312 -210.45312 129.89062 -210.45312 c +129.89062 -210.45312 90.32812 -210.45312 52.25 -202.15625 c +52.25 -202.15625 40.04688 -94.73438 40.04688 -94.73438 c +40.04688 -94.73438 72.26562 -101.07812 98.14062 -101.07812 c +98.14062 -101.07812 146 -101.07812 168.9375 -73 c +168.9375 -73 191.89062 -44.92188 204.10938 -1.46875 c +204.10938 -1.46875 6.84375 518.5625 6.84375 518.5625 c +h +f* +Q +} def +end +currentdict end +/T3_35_0 exch definefont pop +%%EndResource +/F35_0 /T3_35_0 1 1 +[ /B/C/G/M/R/T/Y/a + /d/e/f/g/h/i/l/n + /o/p/r/t/u/w/y/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright + /parenleft/parenright/asterisk/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +%%BeginResource: font T3_82_0 +8 dict begin +/FontType 3 def +/FontMatrix [0.001 0 0 0.001 0 0] def +/FontBBox [-46 -210 769 729] def +/Encoding 256 array def + 0 1 255 { Encoding exch /.notdef put } for +/BuildGlyph { + exch /CharProcs get exch + 2 copy known not { pop /.notdef } if + get exec +} bind def +/BuildChar { + 1 index /Encoding get exch get + 1 index /BuildGlyph get exec +} bind def +/CharProcs 43 dict def +CharProcs begin +/comma { +189 0 83 -142 189 100 setcachedevice +q +88.875 0 m +88.875 0 88.875 100.09375 88.875 100.09375 c +88.875 100.09375 188.96875 100.09375 188.96875 100.09375 c +188.96875 100.09375 188.96875 0 188.96875 0 c +188.96875 0 188.96875 -55.17188 169.4375 -89.10938 c +169.4375 -89.10938 149.90625 -123.04688 107.42188 -141.60938 c +107.42188 -141.60938 83.01562 -104 83.01562 -104 c +83.01562 -104 110.84375 -91.79688 124.01562 -68.10938 c +124.01562 -68.10938 137.20312 -44.4375 138.67188 0 c +138.67188 0 88.875 0 88.875 0 c +h +f* +Q +} def +/hyphen { +302 0 32 215 302 303 setcachedevice +q +31.73437 214.84375 m +31.73437 214.84375 31.73437 303.21875 31.73437 303.21875 c +31.73437 303.21875 301.76562 303.21875 301.76562 303.21875 c +301.76562 303.21875 301.76562 214.84375 301.76562 214.84375 c +301.76562 214.84375 31.73437 214.84375 31.73437 214.84375 c +h +f* +Q +} def +/period { +191 0 91 0 191 100 setcachedevice +q +90.82812 0 m +90.82812 0 90.82812 100.09375 90.82812 100.09375 c +90.82812 100.09375 190.92188 100.09375 190.92188 100.09375 c +190.92188 100.09375 190.92188 0 190.92188 0 c +190.92188 0 90.82812 0 90.82812 0 c +h +f* +Q +} def +/one { +373 0 109 0 373 719 setcachedevice +q +372.5625 0 m +372.5625 0 284.67188 0 284.67188 0 c +284.67188 0 284.67188 560.0625 284.67188 560.0625 c +284.67188 560.0625 252.9375 529.78125 201.42188 499.5 c +201.42188 499.5 149.90625 469.23438 108.89062 454.10938 c +108.89062 454.10938 108.89062 539.0625 108.89062 539.0625 c +108.89062 539.0625 182.625 573.73438 237.79688 623.04688 c +237.79688 623.04688 292.96875 672.35938 315.92188 718.75 c +315.92188 718.75 372.5625 718.75 372.5625 718.75 c +372.5625 718.75 372.5625 0 372.5625 0 c +h +f* +Q +} def +/two { +503 0 29 0 503 719 setcachedevice +q +503.42188 84.46875 m +503.42188 84.46875 503.42188 0 503.42188 0 c +503.42188 0 30.28125 0 30.28125 0 c +30.28125 0 29.29688 31.73437 40.53125 61.03125 c +40.53125 61.03125 58.59375 109.375 98.39062 156.25 c +98.39062 156.25 138.1875 203.125 213.375 264.65625 c +213.375 264.65625 330.07812 360.35938 371.09375 416.26562 c +371.09375 416.26562 412.10938 472.17188 412.10938 521.96875 c +412.10938 521.96875 412.10938 574.21875 374.75 610.10938 c +374.75 610.10938 337.40625 646 277.34375 646 c +277.34375 646 213.875 646 175.78125 607.90625 c +175.78125 607.90625 137.70312 569.82812 137.20312 502.4375 c +137.20312 502.4375 46.875 511.71875 46.875 511.71875 c +46.875 511.71875 56.15625 612.79688 116.70312 665.76562 c +116.70312 665.76562 177.25 718.75 279.29688 718.75 c +279.29688 718.75 382.32812 718.75 442.375 661.625 c +442.375 661.625 502.4375 604.5 502.4375 520.01562 c +502.4375 520.01562 502.4375 477.04688 484.85938 435.54688 c +484.85938 435.54688 467.28125 394.04688 426.51563 348.14062 c +426.51563 348.14062 385.75 302.25 291.01562 222.17188 c +291.01562 222.17188 211.92188 155.76563 189.45312 132.07812 c +189.45312 132.07812 167 108.40625 152.34375 84.46875 c +152.34375 84.46875 503.42188 84.46875 503.42188 84.46875 c +h +f* +Q +} def +/three { +511 0 42 -13 511 719 setcachedevice +q +42 188.96875 m +42 188.96875 129.89062 200.6875 129.89062 200.6875 c +129.89062 200.6875 145.01562 125.98438 181.39062 93.01562 c +181.39062 93.01562 217.78125 60.0625 270.01562 60.0625 c +270.01562 60.0625 332.03125 60.0625 374.75 103.03125 c +374.75 103.03125 417.48438 146 417.48438 209.46875 c +417.48438 209.46875 417.48438 270.01562 377.92188 309.32812 c +377.92188 309.32812 338.375 348.64062 277.34375 348.64062 c +277.34375 348.64062 252.4375 348.64062 215.32812 338.875 c +215.32812 338.875 225.09375 416.01562 225.09375 416.01562 c +225.09375 416.01562 233.89062 415.04688 239.26562 415.04688 c +239.26562 415.04688 295.40625 415.04688 340.32812 444.34375 c +340.32812 444.34375 385.25 473.64062 385.25 534.67188 c +385.25 534.67188 385.25 583.01562 352.53125 614.75 c +352.53125 614.75 319.82812 646.48438 268.0625 646.48438 c +268.0625 646.48438 216.79688 646.48438 182.60938 614.25 c +182.60938 614.25 148.4375 582.03125 138.67188 517.57812 c +138.67188 517.57812 50.78125 533.20312 50.78125 533.20312 c +50.78125 533.20312 66.89062 621.57812 124.01562 670.15625 c +124.01562 670.15625 181.15625 718.75 266.10938 718.75 c +266.10938 718.75 324.70312 718.75 374.01562 693.59375 c +374.01562 693.59375 423.34375 668.45312 449.46875 625 c +449.46875 625 475.59375 581.54688 475.59375 532.71875 c +475.59375 532.71875 475.59375 486.32812 450.6875 448.23438 c +450.6875 448.23438 425.78125 410.15625 376.95312 387.70312 c +376.95312 387.70312 440.4375 373.04688 475.59375 326.90625 c +475.59375 326.90625 510.75 280.76562 510.75 211.42188 c +510.75 211.42188 510.75 117.67187 442.39062 52.48438 c +442.39062 52.48438 374.03125 -12.70312 269.53125 -12.70312 c +269.53125 -12.70312 175.29688 -12.70312 113.03125 43.45312 c +113.03125 43.45312 50.78125 99.60938 42 188.96875 c +h +f* +Q +} def +/four { +508 0 13 0 508 716 setcachedevice +q +323.25 0 m +323.25 0 323.25 171.39063 323.25 171.39063 c +323.25 171.39063 12.70313 171.39063 12.70313 171.39063 c +12.70313 171.39063 12.70313 251.95312 12.70313 251.95312 c +12.70313 251.95312 339.35938 715.82812 339.35938 715.82812 c +339.35938 715.82812 411.14062 715.82812 411.14062 715.82812 c +411.14062 715.82812 411.14062 251.95312 411.14062 251.95312 c +411.14062 251.95312 507.8125 251.95312 507.8125 251.95312 c +507.8125 251.95312 507.8125 171.39063 507.8125 171.39063 c +507.8125 171.39063 411.14062 171.39063 411.14062 171.39063 c +411.14062 171.39063 411.14062 0 411.14062 0 c +411.14062 0 323.25 0 323.25 0 c +323.25 0 323.25 0 323.25 0 c +h +323.25 251.95312 m +323.25 251.95312 323.25 574.70312 323.25 574.70312 c +323.25 574.70312 99.125 251.95312 99.125 251.95312 c +99.125 251.95312 323.25 251.95312 323.25 251.95312 c +h +f* +Q +} def +/semicolon { +189 0 83 -142 189 519 setcachedevice +q +88.875 418.45312 m +88.875 418.45312 88.875 518.5625 88.875 518.5625 c +88.875 518.5625 188.96875 518.5625 188.96875 518.5625 c +188.96875 518.5625 188.96875 418.45312 188.96875 418.45312 c +188.96875 418.45312 88.875 418.45312 88.875 418.45312 c +88.875 418.45312 88.875 418.45312 88.875 418.45312 c +h +88.875 0 m +88.875 0 88.875 100.09375 88.875 100.09375 c +88.875 100.09375 188.96875 100.09375 188.96875 100.09375 c +188.96875 100.09375 188.96875 0 188.96875 0 c +188.96875 0 188.96875 -55.17188 169.4375 -89.10938 c +169.4375 -89.10938 149.90625 -123.04688 107.42188 -141.60938 c +107.42188 -141.60938 83.01562 -104 83.01562 -104 c +83.01562 -104 110.84375 -91.79688 124.01562 -68.10938 c +124.01562 -68.10938 137.20312 -44.4375 138.67188 0 c +138.67188 0 88.875 0 88.875 0 c +h +f* +Q +} def +/A { +668 0 -1 0 668 716 setcachedevice +q +-1.46875 0 m +-1.46875 0 273.4375 715.82812 273.4375 715.82812 c +273.4375 715.82812 375.48438 715.82812 375.48438 715.82812 c +375.48438 715.82812 668.45312 0 668.45312 0 c +668.45312 0 560.54688 0 560.54688 0 c +560.54688 0 477.04688 216.79688 477.04688 216.79688 c +477.04688 216.79688 177.73438 216.79688 177.73438 216.79688 c +177.73438 216.79688 99.125 0 99.125 0 c +99.125 0 -1.46875 0 -1.46875 0 c +-1.46875 0 -1.46875 0 -1.46875 0 c +h +205.07812 293.95312 m +205.07812 293.95312 447.75 293.95312 447.75 293.95312 c +447.75 293.95312 373.04688 492.1875 373.04688 492.1875 c +373.04688 492.1875 338.875 582.51562 322.26562 640.625 c +322.26562 640.625 308.59375 571.78125 283.6875 503.90625 c +283.6875 503.90625 205.07812 293.95312 205.07812 293.95312 c +h +f* +Q +} def +/C { +683 0 50 -12 683 728 setcachedevice +q +587.89062 250.98438 m +587.89062 250.98438 682.625 227.04688 682.625 227.04688 c +682.625 227.04688 652.82812 110.35938 575.4375 49.07812 c +575.4375 49.07812 498.04688 -12.20312 386.23438 -12.20312 c +386.23438 -12.20312 270.51562 -12.20312 198 34.90625 c +198 34.90625 125.48438 82.03125 87.64062 171.39063 c +87.64062 171.39063 49.8125 260.75 49.8125 363.28125 c +49.8125 363.28125 49.8125 475.09375 92.53125 558.34375 c +92.53125 558.34375 135.25 641.60938 214.10938 684.8125 c +214.10938 684.8125 292.96875 728.03125 387.70312 728.03125 c +387.70312 728.03125 495.125 728.03125 568.35938 673.34375 c +568.35938 673.34375 641.60938 618.65625 670.40625 519.53125 c +670.40625 519.53125 577.15625 497.5625 577.15625 497.5625 c +577.15625 497.5625 552.25 575.6875 504.875 611.32812 c +504.875 611.32812 457.51562 646.96875 385.75 646.96875 c +385.75 646.96875 303.21875 646.96875 247.79688 607.42188 c +247.79688 607.42188 192.39063 567.875 169.92188 501.21875 c +169.92188 501.21875 147.46875 434.57812 147.46875 363.76562 c +147.46875 363.76562 147.46875 272.46875 174.07812 204.34375 c +174.07812 204.34375 200.6875 136.23438 256.82812 102.53125 c +256.82812 102.53125 312.98438 68.84375 378.42188 68.84375 c +378.42188 68.84375 458.01562 68.84375 513.1875 114.73438 c +513.1875 114.73438 568.35938 160.64062 587.89062 250.98438 c +h +f* +Q +} def +/D { +669 0 77 0 669 716 setcachedevice +q +77.15625 0 m +77.15625 0 77.15625 715.82812 77.15625 715.82812 c +77.15625 715.82812 323.73438 715.82812 323.73438 715.82812 c +323.73438 715.82812 407.23438 715.82812 451.17188 705.5625 c +451.17188 705.5625 512.70312 691.40625 556.15625 654.29688 c +556.15625 654.29688 612.79688 606.45312 640.875 531.98438 c +640.875 531.98438 668.95312 457.51562 668.95312 361.8125 c +668.95312 361.8125 668.95312 280.28125 649.90625 217.28125 c +649.90625 217.28125 630.85938 154.29688 601.07812 113.03125 c +601.07812 113.03125 571.29688 71.78125 535.89062 48.09375 c +535.89062 48.09375 500.48438 24.42188 450.4375 12.20312 c +450.4375 12.20312 400.39062 0 335.45312 0 c +335.45312 0 77.15625 0 77.15625 0 c +77.15625 0 77.15625 0 77.15625 0 c +h +171.875 84.46875 m +171.875 84.46875 324.70312 84.46875 324.70312 84.46875 c +324.70312 84.46875 395.51562 84.46875 435.79688 97.65625 c +435.79688 97.65625 476.07812 110.84375 500 134.76562 c +500 134.76562 533.6875 168.45312 552.48438 225.34375 c +552.48438 225.34375 571.29688 282.23438 571.29688 363.28125 c +571.29688 363.28125 571.29688 475.59375 534.42188 535.89062 c +534.42188 535.89062 497.5625 596.1875 444.82812 616.70312 c +444.82812 616.70312 406.73438 631.34375 322.26562 631.34375 c +322.26562 631.34375 171.875 631.34375 171.875 631.34375 c +171.875 631.34375 171.875 84.46875 171.875 84.46875 c +h +f* +Q +} def +/E { +613 0 79 0 613 716 setcachedevice +q +79.10938 0 m +79.10938 0 79.10938 715.82812 79.10938 715.82812 c +79.10938 715.82812 596.6875 715.82812 596.6875 715.82812 c +596.6875 715.82812 596.6875 631.34375 596.6875 631.34375 c +596.6875 631.34375 173.82812 631.34375 173.82812 631.34375 c +173.82812 631.34375 173.82812 412.10938 173.82812 412.10938 c +173.82812 412.10938 569.82812 412.10938 569.82812 412.10938 c +569.82812 412.10938 569.82812 328.125 569.82812 328.125 c +569.82812 328.125 173.82812 328.125 173.82812 328.125 c +173.82812 328.125 173.82812 84.46875 173.82812 84.46875 c +173.82812 84.46875 613.28125 84.46875 613.28125 84.46875 c +613.28125 84.46875 613.28125 0 613.28125 0 c +613.28125 0 79.10938 0 79.10938 0 c +h +f* +Q +} def +/F { +565 0 82 0 565 716 setcachedevice +q +82.03125 0 m +82.03125 0 82.03125 715.82812 82.03125 715.82812 c +82.03125 715.82812 564.9375 715.82812 564.9375 715.82812 c +564.9375 715.82812 564.9375 631.34375 564.9375 631.34375 c +564.9375 631.34375 176.76562 631.34375 176.76562 631.34375 c +176.76562 631.34375 176.76562 409.67188 176.76562 409.67188 c +176.76562 409.67188 512.70312 409.67188 512.70312 409.67188 c +512.70312 409.67188 512.70312 325.20312 512.70312 325.20312 c +512.70312 325.20312 176.76562 325.20312 176.76562 325.20312 c +176.76562 325.20312 176.76562 0 176.76562 0 c +176.76562 0 82.03125 0 82.03125 0 c +h +f* +Q +} def +/I { +188 0 93 0 188 716 setcachedevice +q +93.26562 0 m +93.26562 0 93.26562 715.82812 93.26562 715.82812 c +93.26562 715.82812 187.98438 715.82812 187.98438 715.82812 c +187.98438 715.82812 187.98438 0 187.98438 0 c +187.98438 0 93.26562 0 93.26562 0 c +h +f* +Q +} def +/L { +521 0 73 0 521 716 setcachedevice +q +73.25 0 m +73.25 0 73.25 715.82812 73.25 715.82812 c +73.25 715.82812 167.96875 715.82812 167.96875 715.82812 c +167.96875 715.82812 167.96875 84.46875 167.96875 84.46875 c +167.96875 84.46875 520.51562 84.46875 520.51562 84.46875 c +520.51562 84.46875 520.51562 0 520.51562 0 c +520.51562 0 73.25 0 73.25 0 c +h +f* +Q +} def +/M { +757 0 74 0 757 716 setcachedevice +q +74.21875 0 m +74.21875 0 74.21875 715.82812 74.21875 715.82812 c +74.21875 715.82812 216.79688 715.82812 216.79688 715.82812 c +216.79688 715.82812 386.23438 208.98438 386.23438 208.98438 c +386.23438 208.98438 409.67188 138.1875 420.40625 103.03125 c +420.40625 103.03125 432.625 142.09375 458.5 217.78125 c +458.5 217.78125 629.89062 715.82812 629.89062 715.82812 c +629.89062 715.82812 757.32812 715.82812 757.32812 715.82812 c +757.32812 715.82812 757.32812 0 757.32812 0 c +757.32812 0 666.01562 0 666.01562 0 c +666.01562 0 666.01562 599.125 666.01562 599.125 c +666.01562 599.125 458.01562 0 458.01562 0 c +458.01562 0 372.5625 0 372.5625 0 c +372.5625 0 165.53125 609.375 165.53125 609.375 c +165.53125 609.375 165.53125 0 165.53125 0 c +165.53125 0 74.21875 0 74.21875 0 c +h +f* +Q +} def +/N { +640 0 76 0 640 716 setcachedevice +q +76.17188 0 m +76.17188 0 76.17188 715.82812 76.17188 715.82812 c +76.17188 715.82812 173.34375 715.82812 173.34375 715.82812 c +173.34375 715.82812 549.3125 153.8125 549.3125 153.8125 c +549.3125 153.8125 549.3125 715.82812 549.3125 715.82812 c +549.3125 715.82812 640.14062 715.82812 640.14062 715.82812 c +640.14062 715.82812 640.14062 0 640.14062 0 c +640.14062 0 542.96875 0 542.96875 0 c +542.96875 0 167 562.5 167 562.5 c +167 562.5 167 0 167 0 c +167 0 76.17188 0 76.17188 0 c +h +f* +Q +} def +/P { +624 0 77 0 624 716 setcachedevice +q +77.15625 0 m +77.15625 0 77.15625 715.82812 77.15625 715.82812 c +77.15625 715.82812 347.17188 715.82812 347.17188 715.82812 c +347.17188 715.82812 418.45312 715.82812 456.0625 708.98438 c +456.0625 708.98438 508.79688 700.20312 544.4375 675.53125 c +544.4375 675.53125 580.07812 650.875 601.79688 606.4375 c +601.79688 606.4375 623.53125 562.01562 623.53125 508.79688 c +623.53125 508.79688 623.53125 417.48438 565.42188 354.25 c +565.42188 354.25 507.32812 291.01562 355.46875 291.01562 c +355.46875 291.01562 171.875 291.01562 171.875 291.01562 c +171.875 291.01562 171.875 0 171.875 0 c +171.875 0 77.15625 0 77.15625 0 c +77.15625 0 77.15625 0 77.15625 0 c +h +171.875 375.48438 m +171.875 375.48438 356.9375 375.48438 356.9375 375.48438 c +356.9375 375.48438 448.73438 375.48438 487.29688 409.65625 c +487.29688 409.65625 525.875 443.84375 525.875 505.85938 c +525.875 505.85938 525.875 550.78125 503.17188 582.76562 c +503.17188 582.76562 480.46875 614.75 443.35938 625 c +443.35938 625 419.4375 631.34375 354.98438 631.34375 c +354.98438 631.34375 171.875 631.34375 171.875 631.34375 c +171.875 631.34375 171.875 375.48438 171.875 375.48438 c +h +f* +Q +} def +/Q { +741 0 43 -56 741 729 setcachedevice +q +619.625 76.65625 m +619.625 76.65625 685.54688 31.25 741.21875 10.25 c +741.21875 10.25 713.375 -55.67188 713.375 -55.67188 c +713.375 -55.67188 636.23438 -27.82812 559.57812 32.23438 c +559.57812 32.23438 479.98438 -12.20312 383.79688 -12.20312 c +383.79688 -12.20312 286.625 -12.20312 207.51562 34.67188 c +207.51562 34.67188 128.42188 81.54688 85.6875 166.5 c +85.6875 166.5 42.96875 251.46875 42.96875 357.90625 c +42.96875 357.90625 42.96875 463.875 85.9375 550.78125 c +85.9375 550.78125 128.90625 637.70312 208.25 683.10938 c +208.25 683.10938 287.59375 728.51562 385.75 728.51562 c +385.75 728.51562 484.85938 728.51562 564.45312 681.39062 c +564.45312 681.39062 644.04688 634.28125 685.79688 549.5625 c +685.79688 549.5625 727.54688 464.84375 727.54688 358.40625 c +727.54688 358.40625 727.54688 270.01562 700.6875 199.45312 c +700.6875 199.45312 673.82812 128.90625 619.625 76.65625 c +619.625 76.65625 619.625 76.65625 619.625 76.65625 c +h +411.14062 197.75 m +411.14062 197.75 493.17188 174.8125 546.39062 129.39062 c +546.39062 129.39062 629.89062 205.5625 629.89062 358.40625 c +629.89062 358.40625 629.89062 445.3125 600.34375 510.25 c +600.34375 510.25 570.79688 575.20312 513.90625 611.07812 c +513.90625 611.07812 457.03125 646.96875 386.23438 646.96875 c +386.23438 646.96875 280.28125 646.96875 210.45312 574.45312 c +210.45312 574.45312 140.625 501.95312 140.625 357.90625 c +140.625 357.90625 140.625 218.26562 209.71875 143.54688 c +209.71875 143.54688 278.8125 68.84375 386.23438 68.84375 c +386.23438 68.84375 437.01562 68.84375 481.9375 87.89062 c +481.9375 87.89062 437.5 116.70313 388.1875 128.90625 c +388.1875 128.90625 411.14062 197.75 411.14062 197.75 c +h +f* +Q +} def +/S { +615 0 45 -12 615 728 setcachedevice +q +44.92188 229.98438 m +44.92188 229.98438 134.28125 237.79688 134.28125 237.79688 c +134.28125 237.79688 140.625 184.07812 163.8125 149.65625 c +163.8125 149.65625 187.01562 115.23438 235.84375 93.98438 c +235.84375 93.98438 284.67188 72.75 345.70312 72.75 c +345.70312 72.75 399.90625 72.75 441.40625 88.85938 c +441.40625 88.85938 482.90625 104.98438 503.17188 133.0625 c +503.17188 133.0625 523.4375 161.14062 523.4375 194.34375 c +523.4375 194.34375 523.4375 228.03125 503.90625 253.17188 c +503.90625 253.17188 484.375 278.32812 439.45312 295.40625 c +439.45312 295.40625 410.64062 306.64062 312 330.3125 c +312 330.3125 213.375 354 173.82812 375 c +173.82812 375 122.5625 401.85938 97.40625 441.65625 c +97.40625 441.65625 72.26562 481.45312 72.26562 530.76562 c +72.26562 530.76562 72.26562 584.96875 103.03125 632.07812 c +103.03125 632.07812 133.79688 679.20312 192.875 703.60938 c +192.875 703.60938 251.95312 728.03125 324.21875 728.03125 c +324.21875 728.03125 403.8125 728.03125 464.59375 702.39062 c +464.59375 702.39062 525.39062 676.76562 558.10938 626.95312 c +558.10938 626.95312 590.82812 577.15625 593.26562 514.15625 c +593.26562 514.15625 502.4375 507.32812 502.4375 507.32812 c +502.4375 507.32812 495.125 575.20312 452.875 609.85938 c +452.875 609.85938 410.64062 644.53125 328.125 644.53125 c +328.125 644.53125 242.1875 644.53125 202.875 613.03125 c +202.875 613.03125 163.57812 581.54688 163.57812 537.10938 c +163.57812 537.10938 163.57812 498.53125 191.40625 473.64062 c +191.40625 473.64062 218.75 448.73438 334.21875 422.60938 c +334.21875 422.60938 449.70312 396.48438 492.67188 376.95312 c +492.67188 376.95312 555.17188 348.14062 584.95312 303.95312 c +584.95312 303.95312 614.75 259.76562 614.75 202.15625 c +614.75 202.15625 614.75 145.01562 582.03125 94.48438 c +582.03125 94.48438 549.3125 43.95312 488.03125 15.875 c +488.03125 15.875 426.76562 -12.20312 350.09375 -12.20312 c +350.09375 -12.20312 252.9375 -12.20312 187.25 16.10937 c +187.25 16.10937 121.57812 44.4375 84.21875 101.3125 c +84.21875 101.3125 46.875 158.20312 44.92188 229.98438 c +h +f* +Q +} def +/U { +642 0 79 -12 642 716 setcachedevice +q +546.875 715.82812 m +546.875 715.82812 641.60938 715.82812 641.60938 715.82812 c +641.60938 715.82812 641.60938 302.25 641.60938 302.25 c +641.60938 302.25 641.60938 194.34375 617.1875 130.85938 c +617.1875 130.85938 592.78125 67.39062 529.04688 27.59375 c +529.04688 27.59375 465.32812 -12.20312 361.8125 -12.20312 c +361.8125 -12.20312 261.23438 -12.20312 197.26562 22.45312 c +197.26562 22.45312 133.29688 57.125 105.95312 122.79688 c +105.95312 122.79688 78.60938 188.48438 78.60938 302.25 c +78.60938 302.25 78.60938 715.82812 78.60938 715.82812 c +78.60938 715.82812 173.34375 715.82812 173.34375 715.82812 c +173.34375 715.82812 173.34375 302.73438 173.34375 302.73438 c +173.34375 302.73438 173.34375 209.46875 190.67188 165.28125 c +190.67188 165.28125 208.01562 121.09375 250.25 97.17188 c +250.25 97.17188 292.48438 73.25 353.51562 73.25 c +353.51562 73.25 458.01562 73.25 502.4375 120.60938 c +502.4375 120.60938 546.875 167.96875 546.875 302.73438 c +546.875 302.73438 546.875 715.82812 546.875 715.82812 c +h +f* +Q +} def +/V { +659 0 4 0 659 716 setcachedevice +q +281.73438 0 m +281.73438 0 4.39062 715.82812 4.39062 715.82812 c +4.39062 715.82812 106.9375 715.82812 106.9375 715.82812 c +106.9375 715.82812 292.96875 195.79687 292.96875 195.79687 c +292.96875 195.79687 315.4375 133.29687 330.5625 78.60937 c +330.5625 78.60937 347.17188 137.20312 369.14062 195.79687 c +369.14062 195.79687 562.5 715.82812 562.5 715.82812 c +562.5 715.82812 659.1875 715.82812 659.1875 715.82812 c +659.1875 715.82812 378.90625 0 378.90625 0 c +378.90625 0 281.73438 0 281.73438 0 c +h +f* +Q +} def +/a { +514 0 36 -12 514 530 setcachedevice +q +404.29688 63.96875 m +404.29688 63.96875 355.46875 22.46875 310.29688 5.375 c +310.29688 5.375 265.14062 -11.71875 213.375 -11.71875 c +213.375 -11.71875 127.9375 -11.71875 82.03125 30.03125 c +82.03125 30.03125 36.14062 71.78125 36.14062 136.71875 c +36.14062 136.71875 36.14062 174.8125 53.46875 206.29688 c +53.46875 206.29688 70.79688 237.79688 98.875 256.82812 c +98.875 256.82812 126.95312 275.875 162.10938 285.64062 c +162.10938 285.64062 187.98438 292.48438 240.23438 298.82812 c +240.23438 298.82812 346.6875 311.53125 396.96875 329.10938 c +396.96875 329.10938 397.46875 347.17188 397.46875 352.04688 c +397.46875 352.04688 397.46875 405.76562 372.5625 427.73438 c +372.5625 427.73438 338.875 457.51562 272.46875 457.51562 c +272.46875 457.51562 210.45312 457.51562 180.90625 435.78125 c +180.90625 435.78125 151.375 414.0625 137.20312 358.89062 c +137.20312 358.89062 51.26562 370.60938 51.26562 370.60938 c +51.26562 370.60938 62.98438 425.78125 89.84375 459.71875 c +89.84375 459.71875 116.70312 493.65625 167.48438 511.96875 c +167.48438 511.96875 218.26562 530.28125 285.15625 530.28125 c +285.15625 530.28125 351.5625 530.28125 393.0625 514.65625 c +393.0625 514.65625 434.57812 499.03125 454.10938 475.34375 c +454.10938 475.34375 473.64062 451.65625 481.45312 415.53125 c +481.45312 415.53125 485.84375 393.0625 485.84375 334.46875 c +485.84375 334.46875 485.84375 217.28125 485.84375 217.28125 c +485.84375 217.28125 485.84375 94.73438 491.45313 62.25 c +491.45313 62.25 497.07812 29.78125 513.67188 0 c +513.67188 0 421.875 0 421.875 0 c +421.875 0 408.20312 27.34375 404.29688 63.96875 c +404.29688 63.96875 404.29688 63.96875 404.29688 63.96875 c +h +396.96875 260.25 m +396.96875 260.25 349.125 240.71875 253.42188 227.04688 c +253.42188 227.04688 199.21875 219.23438 176.75 209.46875 c +176.75 209.46875 154.29688 199.70312 142.09375 180.90625 c +142.09375 180.90625 129.89062 162.10938 129.89062 139.15625 c +129.89062 139.15625 129.89062 104 156.5 80.5625 c +156.5 80.5625 183.10938 57.125 234.375 57.125 c +234.375 57.125 285.15625 57.125 324.70312 79.34375 c +324.70312 79.34375 364.26562 101.5625 382.8125 140.14063 c +382.8125 140.14063 396.96875 169.92188 396.96875 228.03125 c +396.96875 228.03125 396.96875 260.25 396.96875 260.25 c +h +f* +Q +} def +/b { +515 0 65 -12 515 716 setcachedevice +q +146.96875 0 m +146.96875 0 65.4375 0 65.4375 0 c +65.4375 0 65.4375 715.82812 65.4375 715.82812 c +65.4375 715.82812 153.32812 715.82812 153.32812 715.82812 c +153.32812 715.82812 153.32812 460.45312 153.32812 460.45312 c +153.32812 460.45312 208.98438 530.28125 295.40625 530.28125 c +295.40625 530.28125 343.26562 530.28125 385.98438 510.98438 c +385.98438 510.98438 428.71875 491.70312 456.29688 456.78125 c +456.29688 456.78125 483.89062 421.875 499.51562 372.5625 c +499.51562 372.5625 515.14062 323.25 515.14062 267.09375 c +515.14062 267.09375 515.14062 133.79688 449.21875 61.03125 c +449.21875 61.03125 383.29688 -11.71875 291.01562 -11.71875 c +291.01562 -11.71875 199.21875 -11.71875 146.96875 64.9375 c +146.96875 64.9375 146.96875 0 146.96875 0 c +146.96875 0 146.96875 0 146.96875 0 c +h +146 263.1875 m +146 263.1875 146 169.92188 171.39062 128.42188 c +171.39062 128.42188 212.89062 60.54688 283.6875 60.54688 c +283.6875 60.54688 341.3125 60.54688 383.29688 110.59375 c +383.29688 110.59375 425.29688 160.64062 425.29688 259.76562 c +425.29688 259.76562 425.29688 361.32812 385.01562 409.67188 c +385.01562 409.67188 344.73438 458.01562 287.59375 458.01562 c +287.59375 458.01562 229.98438 458.01562 187.98438 407.95312 c +187.98438 407.95312 146 357.90625 146 263.1875 c +h +f* +Q +} def +/c { +491 0 39 -12 491 530 setcachedevice +q +404.29688 189.9375 m +404.29688 189.9375 490.71875 178.71875 490.71875 178.71875 c +490.71875 178.71875 476.5625 89.35938 418.20312 38.8125 c +418.20312 38.8125 359.85938 -11.71875 274.90625 -11.71875 c +274.90625 -11.71875 168.45312 -11.71875 103.75 57.85938 c +103.75 57.85938 39.0625 127.4375 39.0625 257.32812 c +39.0625 257.32812 39.0625 341.3125 66.89062 404.29688 c +66.89062 404.29688 94.73438 467.28125 151.60938 498.78125 c +151.60938 498.78125 208.5 530.28125 275.39062 530.28125 c +275.39062 530.28125 359.85938 530.28125 413.5625 487.54688 c +413.5625 487.54688 467.28125 444.82812 482.42188 366.21875 c +482.42188 366.21875 396.96875 353.03125 396.96875 353.03125 c +396.96875 353.03125 384.76562 405.28125 353.75 431.64062 c +353.75 431.64062 322.75 458.01562 278.8125 458.01562 c +278.8125 458.01562 212.40625 458.01562 170.89062 410.40625 c +170.89062 410.40625 129.39062 362.79688 129.39062 259.76562 c +129.39062 259.76562 129.39062 155.28125 169.42188 107.90625 c +169.42188 107.90625 209.46875 60.54688 273.92188 60.54688 c +273.92188 60.54688 325.6875 60.54688 360.34375 92.28125 c +360.34375 92.28125 395.01562 124.03125 404.29688 189.9375 c +h +f* +Q +} def +/d { +484 0 34 -12 484 716 setcachedevice +q +402.34375 0 m +402.34375 0 402.34375 65.4375 402.34375 65.4375 c +402.34375 65.4375 353.03125 -11.71875 257.32812 -11.71875 c +257.32812 -11.71875 195.3125 -11.71875 143.3125 22.45312 c +143.3125 22.45312 91.3125 56.64062 62.75 117.92188 c +62.75 117.92188 34.1875 179.20313 34.1875 258.79688 c +34.1875 258.79688 34.1875 336.42188 60.0625 399.65625 c +60.0625 399.65625 85.9375 462.89062 137.6875 496.57812 c +137.6875 496.57812 189.45312 530.28125 253.42188 530.28125 c +253.42188 530.28125 300.29688 530.28125 336.90625 510.5 c +336.90625 510.5 373.53125 490.71875 396.48438 458.98438 c +396.48438 458.98438 396.48438 715.82812 396.48438 715.82812 c +396.48438 715.82812 483.89062 715.82812 483.89062 715.82812 c +483.89062 715.82812 483.89062 0 483.89062 0 c +483.89062 0 402.34375 0 402.34375 0 c +402.34375 0 402.34375 0 402.34375 0 c +h +124.51562 258.79688 m +124.51562 258.79688 124.51562 159.1875 166.5 109.85937 c +166.5 109.85937 208.5 60.54688 265.625 60.54688 c +265.625 60.54688 323.25 60.54688 363.53125 107.65625 c +363.53125 107.65625 403.8125 154.78125 403.8125 251.46875 c +403.8125 251.46875 403.8125 357.90625 362.79688 407.70312 c +362.79688 407.70312 321.78125 457.51562 261.71875 457.51562 c +261.71875 457.51562 203.125 457.51562 163.8125 409.65625 c +163.8125 409.65625 124.51562 361.8125 124.51562 258.79688 c +h +f* +Q +} def +/e { +515 0 37 -12 515 530 setcachedevice +q +420.90625 167 m +420.90625 167 511.71875 155.76563 511.71875 155.76563 c +511.71875 155.76563 490.23438 76.17188 432.125 32.21875 c +432.125 32.21875 374.03125 -11.71875 283.6875 -11.71875 c +283.6875 -11.71875 169.92188 -11.71875 103.26562 58.34375 c +103.26562 58.34375 36.625 128.42188 36.625 254.89062 c +36.625 254.89062 36.625 385.75 104 458.01562 c +104 458.01562 171.39062 530.28125 278.8125 530.28125 c +278.8125 530.28125 382.8125 530.28125 448.73438 459.46875 c +448.73438 459.46875 514.65625 388.67188 514.65625 260.25 c +514.65625 260.25 514.65625 252.4375 514.15625 236.8125 c +514.15625 236.8125 127.4375 236.8125 127.4375 236.8125 c +127.4375 236.8125 132.32812 151.375 175.78125 105.95312 c +175.78125 105.95312 219.23438 60.54688 284.1875 60.54688 c +284.1875 60.54688 332.51562 60.54688 366.6875 85.9375 c +366.6875 85.9375 400.875 111.32812 420.90625 167 c +420.90625 167 420.90625 167 420.90625 167 c +h +132.32812 309.07812 m +132.32812 309.07812 421.875 309.07812 421.875 309.07812 c +421.875 309.07812 416.01562 374.51562 388.67188 407.23438 c +388.67188 407.23438 346.6875 458.01562 279.78125 458.01562 c +279.78125 458.01562 219.23438 458.01562 177.96875 417.48438 c +177.96875 417.48438 136.71875 376.95312 132.32812 309.07812 c +h +f* +Q +} def +/f { +313 0 9 0 313 728 setcachedevice +q +86.92188 0 m +86.92188 0 86.92188 450.20312 86.92188 450.20312 c +86.92188 450.20312 9.28125 450.20312 9.28125 450.20312 c +9.28125 450.20312 9.28125 518.5625 9.28125 518.5625 c +9.28125 518.5625 86.92188 518.5625 86.92188 518.5625 c +86.92188 518.5625 86.92188 573.73438 86.92188 573.73438 c +86.92188 573.73438 86.92188 625.98438 96.1875 651.375 c +96.1875 651.375 108.89062 685.54688 140.875 706.78125 c +140.875 706.78125 172.85938 728.03125 230.46875 728.03125 c +230.46875 728.03125 267.57812 728.03125 312.5 719.23438 c +312.5 719.23438 299.3125 642.57812 299.3125 642.57812 c +299.3125 642.57812 271.96875 647.46875 247.5625 647.46875 c +247.5625 647.46875 207.51562 647.46875 190.90625 630.375 c +190.90625 630.375 174.3125 613.28125 174.3125 566.40625 c +174.3125 566.40625 174.3125 518.5625 174.3125 518.5625 c +174.3125 518.5625 275.39062 518.5625 275.39062 518.5625 c +275.39062 518.5625 275.39062 450.20312 275.39062 450.20312 c +275.39062 450.20312 174.3125 450.20312 174.3125 450.20312 c +174.3125 450.20312 174.3125 0 174.3125 0 c +174.3125 0 86.92188 0 86.92188 0 c +h +f* +Q +} def +/g { +489 0 32 -210 489 530 setcachedevice +q +49.8125 -42.96875 m +49.8125 -42.96875 135.25 -55.67188 135.25 -55.67188 c +135.25 -55.67188 140.625 -95.21875 165.04688 -113.28125 c +165.04688 -113.28125 197.75 -137.70312 254.39062 -137.70312 c +254.39062 -137.70312 315.4375 -137.70312 348.64062 -113.28125 c +348.64062 -113.28125 381.84375 -88.875 393.5625 -44.92188 c +393.5625 -44.92188 400.39062 -18.0625 399.90625 67.875 c +399.90625 67.875 342.28125 0 256.34375 0 c +256.34375 0 149.42188 0 90.82812 77.14062 c +90.82812 77.14062 32.23438 154.29688 32.23438 262.20312 c +32.23438 262.20312 32.23438 336.42188 59.07812 399.17188 c +59.07812 399.17188 85.9375 461.92188 136.95312 496.09375 c +136.95312 496.09375 187.98438 530.28125 256.84375 530.28125 c +256.84375 530.28125 348.64062 530.28125 408.20312 456.0625 c +408.20312 456.0625 408.20312 518.5625 408.20312 518.5625 c +408.20312 518.5625 489.26562 518.5625 489.26562 518.5625 c +489.26562 518.5625 489.26562 70.3125 489.26562 70.3125 c +489.26562 70.3125 489.26562 -50.78125 464.59375 -101.3125 c +464.59375 -101.3125 439.9375 -151.85938 386.46875 -181.15625 c +386.46875 -181.15625 333.01562 -210.45312 254.89062 -210.45312 c +254.89062 -210.45312 162.10938 -210.45312 104.98438 -168.70312 c +104.98438 -168.70312 47.85938 -126.95312 49.8125 -42.96875 c +49.8125 -42.96875 49.8125 -42.96875 49.8125 -42.96875 c +h +122.5625 268.5625 m +122.5625 268.5625 122.5625 166.5 163.07812 119.625 c +163.07812 119.625 203.60938 72.75 264.65625 72.75 c +264.65625 72.75 325.20312 72.75 366.21875 119.375 c +366.21875 119.375 407.23438 166.01562 407.23438 265.625 c +407.23438 265.625 407.23438 360.84375 364.98438 409.17188 c +364.98438 409.17188 322.75 457.51562 263.1875 457.51562 c +263.1875 457.51562 204.59375 457.51562 163.57812 409.90625 c +163.57812 409.90625 122.5625 362.3125 122.5625 268.5625 c +h +f* +Q +} def +/h { +488 0 66 0 488 716 setcachedevice +q +65.92188 0 m +65.92188 0 65.92188 715.82812 65.92188 715.82812 c +65.92188 715.82812 153.8125 715.82812 153.8125 715.82812 c +153.8125 715.82812 153.8125 458.98438 153.8125 458.98438 c +153.8125 458.98438 215.32812 530.28125 309.07812 530.28125 c +309.07812 530.28125 366.70312 530.28125 409.17188 507.5625 c +409.17188 507.5625 451.65625 484.85938 469.96875 444.8125 c +469.96875 444.8125 488.28125 404.78125 488.28125 328.60938 c +488.28125 328.60938 488.28125 0 488.28125 0 c +488.28125 0 400.39062 0 400.39062 0 c +400.39062 0 400.39062 328.60938 400.39062 328.60938 c +400.39062 328.60938 400.39062 394.53125 371.82812 424.5625 c +371.82812 424.5625 343.26562 454.59375 291.01562 454.59375 c +291.01562 454.59375 251.95312 454.59375 217.53125 434.32812 c +217.53125 434.32812 183.10938 414.0625 168.45312 379.39062 c +168.45312 379.39062 153.8125 344.73438 153.8125 283.6875 c +153.8125 283.6875 153.8125 0 153.8125 0 c +153.8125 0 65.92188 0 65.92188 0 c +h +f* +Q +} def +/i { +154 0 66 0 154 716 setcachedevice +q +66.40625 614.75 m +66.40625 614.75 66.40625 715.82812 66.40625 715.82812 c +66.40625 715.82812 154.29688 715.82812 154.29688 715.82812 c +154.29688 715.82812 154.29688 614.75 154.29688 614.75 c +154.29688 614.75 66.40625 614.75 66.40625 614.75 c +66.40625 614.75 66.40625 614.75 66.40625 614.75 c +h +66.40625 0 m +66.40625 0 66.40625 518.5625 66.40625 518.5625 c +66.40625 518.5625 154.29688 518.5625 154.29688 518.5625 c +154.29688 518.5625 154.29688 0 154.29688 0 c +154.29688 0 66.40625 0 66.40625 0 c +h +f* +Q +} def +/j { +153 0 -46 -210 153 716 setcachedevice +q +65.4375 613.76562 m +65.4375 613.76562 65.4375 715.82812 65.4375 715.82812 c +65.4375 715.82812 153.32812 715.82812 153.32812 715.82812 c +153.32812 715.82812 153.32812 613.76562 153.32812 613.76562 c +153.32812 613.76562 65.4375 613.76562 65.4375 613.76562 c +65.4375 613.76562 65.4375 613.76562 65.4375 613.76562 c +h +-45.90625 -201.17188 m +-45.90625 -201.17188 -29.29688 -126.46875 -29.29688 -126.46875 c +-29.29688 -126.46875 -2.9375 -133.29688 12.20312 -133.29688 c +12.20312 -133.29688 39.0625 -133.29688 52.25 -115.46875 c +52.25 -115.46875 65.4375 -97.65625 65.4375 -26.375 c +65.4375 -26.375 65.4375 518.5625 65.4375 518.5625 c +65.4375 518.5625 153.32812 518.5625 153.32812 518.5625 c +153.32812 518.5625 153.32812 -28.32812 153.32812 -28.32812 c +153.32812 -28.32812 153.32812 -124.03125 128.42188 -161.625 c +128.42188 -161.625 96.6875 -210.45312 22.95312 -210.45312 c +22.95312 -210.45312 -12.70313 -210.45312 -45.90625 -201.17188 c +h +f* +Q +} def +/l { +152 0 64 0 152 716 setcachedevice +q +63.96875 0 m +63.96875 0 63.96875 715.82812 63.96875 715.82812 c +63.96875 715.82812 151.85938 715.82812 151.85938 715.82812 c +151.85938 715.82812 151.85938 0 151.85938 0 c +151.85938 0 63.96875 0 63.96875 0 c +h +f* +Q +} def +/m { +769 0 66 0 769 530 setcachedevice +q +65.92188 0 m +65.92188 0 65.92188 518.5625 65.92188 518.5625 c +65.92188 518.5625 144.53125 518.5625 144.53125 518.5625 c +144.53125 518.5625 144.53125 445.79688 144.53125 445.79688 c +144.53125 445.79688 168.95312 483.89062 209.46875 507.07813 c +209.46875 507.07813 250 530.28125 301.76562 530.28125 c +301.76562 530.28125 359.375 530.28125 396.23438 506.34375 c +396.23438 506.34375 433.10938 482.42188 448.25 439.45312 c +448.25 439.45312 509.76562 530.28125 608.40625 530.28125 c +608.40625 530.28125 685.54688 530.28125 727.04688 487.54688 c +727.04688 487.54688 768.5625 444.82812 768.5625 355.95312 c +768.5625 355.95312 768.5625 0 768.5625 0 c +768.5625 0 681.15625 0 681.15625 0 c +681.15625 0 681.15625 326.65625 681.15625 326.65625 c +681.15625 326.65625 681.15625 379.39062 672.60938 402.57812 c +672.60938 402.57812 664.0625 425.78125 641.59375 439.9375 c +641.59375 439.9375 619.14062 454.10938 588.875 454.10938 c +588.875 454.10938 534.1875 454.10938 498.04688 417.71875 c +498.04688 417.71875 461.92188 381.34375 461.92188 301.26562 c +461.92188 301.26562 461.92188 0 461.92188 0 c +461.92188 0 374.03125 0 374.03125 0 c +374.03125 0 374.03125 336.92188 374.03125 336.92188 c +374.03125 336.92188 374.03125 395.51562 352.54688 424.8125 c +352.54688 424.8125 331.0625 454.10938 282.23438 454.10938 c +282.23438 454.10938 245.125 454.10938 213.625 434.57812 c +213.625 434.57812 182.125 415.04688 167.96875 377.4375 c +167.96875 377.4375 153.8125 339.84375 153.8125 269.04688 c +153.8125 269.04688 153.8125 0 153.8125 0 c +153.8125 0 65.92188 0 65.92188 0 c +h +f* +Q +} def +/n { +487 0 66 0 487 530 setcachedevice +q +65.92188 0 m +65.92188 0 65.92188 518.5625 65.92188 518.5625 c +65.92188 518.5625 145.01562 518.5625 145.01562 518.5625 c +145.01562 518.5625 145.01562 444.82812 145.01562 444.82812 c +145.01562 444.82812 202.15625 530.28125 310.0625 530.28125 c +310.0625 530.28125 356.9375 530.28125 396.23438 513.42188 c +396.23438 513.42188 435.54688 496.57812 455.07812 469.23438 c +455.07812 469.23438 474.60938 441.89062 482.42188 404.29688 c +482.42188 404.29688 487.3125 379.89062 487.3125 318.84375 c +487.3125 318.84375 487.3125 0 487.3125 0 c +487.3125 0 399.42188 0 399.42188 0 c +399.42188 0 399.42188 315.4375 399.42188 315.4375 c +399.42188 315.4375 399.42188 369.14062 389.15625 395.75 c +389.15625 395.75 378.90625 422.35938 352.78125 438.23438 c +352.78125 438.23438 326.65625 454.10938 291.5 454.10938 c +291.5 454.10938 235.35938 454.10938 194.57812 418.45312 c +194.57812 418.45312 153.8125 382.8125 153.8125 283.20312 c +153.8125 283.20312 153.8125 0 153.8125 0 c +153.8125 0 65.92188 0 65.92188 0 c +h +f* +Q +} def +/o { +519 0 33 -12 519 530 setcachedevice +q +33.20312 259.28125 m +33.20312 259.28125 33.20312 403.32812 113.28125 472.65625 c +113.28125 472.65625 180.17188 530.28125 276.375 530.28125 c +276.375 530.28125 383.29688 530.28125 451.17188 460.20312 c +451.17188 460.20312 519.04688 390.14062 519.04688 266.60938 c +519.04688 266.60938 519.04688 166.5 489.01563 109.125 c +489.01563 109.125 458.98438 51.76562 401.60938 20.01562 c +401.60938 20.01562 344.23438 -11.71875 276.375 -11.71875 c +276.375 -11.71875 167.48438 -11.71875 100.34375 58.10938 c +100.34375 58.10938 33.20312 127.9375 33.20312 259.28125 c +33.20312 259.28125 33.20312 259.28125 33.20312 259.28125 c +h +123.53125 259.28125 m +123.53125 259.28125 123.53125 159.67188 166.98438 110.10938 c +166.98438 110.10938 210.45312 60.54688 276.375 60.54688 c +276.375 60.54688 341.79688 60.54688 385.25 110.34375 c +385.25 110.34375 428.71875 160.15625 428.71875 262.20312 c +428.71875 262.20312 428.71875 358.40625 385.01562 407.95312 c +385.01562 407.95312 341.3125 457.51562 276.375 457.51562 c +276.375 457.51562 210.45312 457.51562 166.98438 408.20312 c +166.98438 408.20312 123.53125 358.89062 123.53125 259.28125 c +h +f* +Q +} def +/p { +516 0 66 -199 516 530 setcachedevice +q +65.92188 -198.73438 m +65.92188 -198.73438 65.92188 518.5625 65.92188 518.5625 c +65.92188 518.5625 146 518.5625 146 518.5625 c +146 518.5625 146 451.17188 146 451.17188 c +146 451.17188 174.3125 490.71875 209.95312 510.5 c +209.95312 510.5 245.60938 530.28125 296.39062 530.28125 c +296.39062 530.28125 362.79688 530.28125 413.57812 496.09375 c +413.57812 496.09375 464.35938 461.92188 490.23438 399.65625 c +490.23438 399.65625 516.10938 337.40625 516.10938 263.1875 c +516.10938 263.1875 516.10938 183.59375 487.54688 119.875 c +487.54688 119.875 458.98438 56.15625 404.53125 22.21875 c +404.53125 22.21875 350.09375 -11.71875 290.04688 -11.71875 c +290.04688 -11.71875 246.09375 -11.71875 211.17188 6.82812 c +211.17188 6.82812 176.26562 25.39062 153.8125 53.71875 c +153.8125 53.71875 153.8125 -198.73438 153.8125 -198.73438 c +153.8125 -198.73438 65.92188 -198.73438 65.92188 -198.73438 c +65.92188 -198.73438 65.92188 -198.73438 65.92188 -198.73438 c +h +145.51562 256.34375 m +145.51562 256.34375 145.51562 156.25 186.03125 108.39062 c +186.03125 108.39062 226.5625 60.54688 284.1875 60.54688 c +284.1875 60.54688 342.78125 60.54688 384.51562 110.10938 c +384.51562 110.10938 426.26562 159.67188 426.26562 263.67188 c +426.26562 263.67188 426.26562 362.79688 385.5 412.10938 c +385.5 412.10938 344.73438 461.42188 288.09375 461.42188 c +288.09375 461.42188 231.9375 461.42188 188.71875 408.9375 c +188.71875 408.9375 145.51562 356.45312 145.51562 256.34375 c +h +f* +Q +} def +/q { +484 0 35 -199 484 530 setcachedevice +q +396.48438 -198.73438 m +396.48438 -198.73438 396.48438 55.17187 396.48438 55.17187 c +396.48438 55.17187 375.98438 26.375 339.10938 7.32813 c +339.10938 7.32813 302.25 -11.71875 260.75 -11.71875 c +260.75 -11.71875 168.45312 -11.71875 101.79688 62.01563 c +101.79688 62.01563 35.15625 135.75 35.15625 264.15625 c +35.15625 264.15625 35.15625 342.28125 62.25 404.29688 c +62.25 404.29688 89.35938 466.3125 140.875 498.29688 c +140.875 498.29688 192.39063 530.28125 253.90625 530.28125 c +253.90625 530.28125 350.09375 530.28125 405.28125 449.21875 c +405.28125 449.21875 405.28125 518.5625 405.28125 518.5625 c +405.28125 518.5625 484.375 518.5625 484.375 518.5625 c +484.375 518.5625 484.375 -198.73438 484.375 -198.73438 c +484.375 -198.73438 396.48438 -198.73438 396.48438 -198.73438 c +396.48438 -198.73438 396.48438 -198.73438 396.48438 -198.73438 c +h +125.48438 260.75 m +125.48438 260.75 125.48438 160.64062 167.46875 110.59375 c +167.46875 110.59375 209.46875 60.54688 268.0625 60.54688 c +268.0625 60.54688 324.21875 60.54688 364.75 108.15625 c +364.75 108.15625 405.28125 155.76563 405.28125 252.9375 c +405.28125 252.9375 405.28125 356.45312 362.54688 408.6875 c +362.54688 408.6875 319.82812 460.9375 262.20312 460.9375 c +262.20312 460.9375 205.07812 460.9375 165.28125 412.34375 c +165.28125 412.34375 125.48438 363.76562 125.48438 260.75 c +h +f* +Q +} def +/r { +347 0 65 0 347 530 setcachedevice +q +64.9375 0 m +64.9375 0 64.9375 518.5625 64.9375 518.5625 c +64.9375 518.5625 144.04688 518.5625 144.04688 518.5625 c +144.04688 518.5625 144.04688 439.9375 144.04688 439.9375 c +144.04688 439.9375 174.3125 495.125 199.95312 512.70312 c +199.95312 512.70312 225.59375 530.28125 256.34375 530.28125 c +256.34375 530.28125 300.78125 530.28125 346.6875 501.95312 c +346.6875 501.95312 316.40625 420.40625 316.40625 420.40625 c +316.40625 420.40625 284.1875 439.45312 251.95312 439.45312 c +251.95312 439.45312 223.14062 439.45312 200.1875 422.10938 c +200.1875 422.10938 177.25 404.78125 167.48438 374.03125 c +167.48438 374.03125 152.82812 327.15625 152.82812 271.48438 c +152.82812 271.48438 152.82812 0 152.82812 0 c +152.82812 0 64.9375 0 64.9375 0 c +h +f* +Q +} def +/s { +461 0 31 -12 461 530 setcachedevice +q +30.76563 154.78125 m +30.76563 154.78125 117.67188 168.45312 117.67188 168.45312 c +117.67188 168.45312 125 116.21875 158.4375 88.375 c +158.4375 88.375 191.89062 60.54688 251.95312 60.54688 c +251.95312 60.54688 312.5 60.54688 341.79688 85.20312 c +341.79688 85.20312 371.09375 109.85937 371.09375 143.0625 c +371.09375 143.0625 371.09375 172.85938 345.21875 189.9375 c +345.21875 189.9375 327.15625 201.65625 255.375 219.73438 c +255.375 219.73438 158.6875 244.14062 121.32813 261.95312 c +121.32813 261.95312 83.98438 279.78125 64.6875 311.28125 c +64.6875 311.28125 45.40625 342.78125 45.40625 380.85938 c +45.40625 380.85938 45.40625 415.53125 61.28125 445.0625 c +61.28125 445.0625 77.15625 474.60938 104.5 494.14062 c +104.5 494.14062 125 509.28125 160.39062 519.78125 c +160.39062 519.78125 195.79688 530.28125 236.32812 530.28125 c +236.32812 530.28125 297.35938 530.28125 343.5 512.70312 c +343.5 512.70312 389.65625 495.125 411.625 465.09375 c +411.625 465.09375 433.59375 435.0625 441.89062 384.76562 c +441.89062 384.76562 355.95312 373.04688 355.95312 373.04688 c +355.95312 373.04688 350.09375 413.09375 322.01562 435.54688 c +322.01562 435.54688 293.95312 458.01562 242.67188 458.01562 c +242.67188 458.01562 182.125 458.01562 156.25 437.98438 c +156.25 437.98438 130.375 417.96875 130.375 391.10938 c +130.375 391.10938 130.375 374.03125 141.10938 360.35938 c +141.10938 360.35938 151.85938 346.1875 174.8125 336.92188 c +174.8125 336.92188 187.98438 332.03125 252.4375 314.45312 c +252.4375 314.45312 345.70312 289.54688 382.5625 273.67188 c +382.5625 273.67188 419.4375 257.8125 440.42188 227.53125 c +440.42188 227.53125 461.42188 197.26562 461.42188 152.34375 c +461.42188 152.34375 461.42188 108.40625 435.78125 69.57812 c +435.78125 69.57812 410.15625 30.76563 361.8125 9.51562 c +361.8125 9.51562 313.48438 -11.71875 252.4375 -11.71875 c +252.4375 -11.71875 151.375 -11.71875 98.39062 30.26562 c +98.39062 30.26562 45.40625 72.26562 30.76563 154.78125 c +h +f* +Q +} def +/t { +271 0 18 -7 271 700 setcachedevice +q +257.8125 78.60937 m +257.8125 78.60937 270.51562 0.98438 270.51562 0.98438 c +270.51562 0.98438 233.40625 -6.84375 204.10938 -6.84375 c +204.10938 -6.84375 156.25 -6.84375 129.875 8.29687 c +129.875 8.29687 103.51562 23.4375 92.76562 48.09375 c +92.76562 48.09375 82.03125 72.75 82.03125 151.85938 c +82.03125 151.85938 82.03125 450.20312 82.03125 450.20312 c +82.03125 450.20312 17.57812 450.20312 17.57812 450.20312 c +17.57812 450.20312 17.57812 518.5625 17.57812 518.5625 c +17.57812 518.5625 82.03125 518.5625 82.03125 518.5625 c +82.03125 518.5625 82.03125 646.96875 82.03125 646.96875 c +82.03125 646.96875 169.4375 699.70312 169.4375 699.70312 c +169.4375 699.70312 169.4375 518.5625 169.4375 518.5625 c +169.4375 518.5625 257.8125 518.5625 257.8125 518.5625 c +257.8125 518.5625 257.8125 450.20312 257.8125 450.20312 c +257.8125 450.20312 169.4375 450.20312 169.4375 450.20312 c +169.4375 450.20312 169.4375 146.96875 169.4375 146.96875 c +169.4375 146.96875 169.4375 109.375 174.07812 98.625 c +174.07812 98.625 178.71875 87.89062 189.20312 81.54688 c +189.20312 81.54688 199.70312 75.20312 219.23438 75.20312 c +219.23438 75.20312 233.89062 75.20312 257.8125 78.60937 c +h +f* +Q +} def +/u { +484 0 64 -12 484 519 setcachedevice +q +405.76562 0 m +405.76562 0 405.76562 76.17188 405.76562 76.17188 c +405.76562 76.17188 345.21875 -11.71875 241.21875 -11.71875 c +241.21875 -11.71875 195.3125 -11.71875 155.51562 5.85938 c +155.51562 5.85938 115.71875 23.4375 96.4375 50.04688 c +96.4375 50.04688 77.15625 76.65625 69.34375 115.23438 c +69.34375 115.23438 63.96875 141.10937 63.96875 197.26562 c +63.96875 197.26562 63.96875 518.5625 63.96875 518.5625 c +63.96875 518.5625 151.85938 518.5625 151.85938 518.5625 c +151.85938 518.5625 151.85938 230.95312 151.85938 230.95312 c +151.85938 230.95312 151.85938 162.10938 157.23438 138.1875 c +157.23438 138.1875 165.53125 103.51562 192.375 83.73438 c +192.375 83.73438 219.23438 63.96875 258.79688 63.96875 c +258.79688 63.96875 298.34375 63.96875 333 84.23438 c +333 84.23438 367.67188 104.5 382.07812 139.40625 c +382.07812 139.40625 396.48438 174.3125 396.48438 240.71875 c +396.48438 240.71875 396.48438 518.5625 396.48438 518.5625 c +396.48438 518.5625 484.375 518.5625 484.375 518.5625 c +484.375 518.5625 484.375 0 484.375 0 c +484.375 0 405.76562 0 405.76562 0 c +h +f* +Q +} def +/v { +488 0 13 0 488 519 setcachedevice +q +209.96875 0 m +209.96875 0 12.70313 518.5625 12.70313 518.5625 c +12.70313 518.5625 105.46875 518.5625 105.46875 518.5625 c +105.46875 518.5625 216.79688 208.01562 216.79688 208.01562 c +216.79688 208.01562 234.85938 157.71875 250 103.51562 c +250 103.51562 261.71875 144.53125 282.71875 202.15625 c +282.71875 202.15625 397.95312 518.5625 397.95312 518.5625 c +397.95312 518.5625 488.28125 518.5625 488.28125 518.5625 c +488.28125 518.5625 292 0 292 0 c +292 0 209.96875 0 209.96875 0 c +h +f* +Q +} def +end +currentdict end +/T3_82_0 exch definefont pop +%%EndResource +/F82_0 /T3_82_0 1 1 +[ /comma/hyphen/period/one/two/three/four/semicolon + /A/C/D/E/F/I/L/M + /N/P/Q/S/U/V/a/b + /c/d/e/f/g/h/i/j + /l/m/n/o/p/q/r/s + /t/u/v/plus/comma/hyphen/period/slash + /zero/one/two/three/four/five/six/seven + /eight/nine/colon/semicolon/less/equal/greater/question + /at/A/B/C/D/E/F/G + /H/I/J/K/L/M/N/O + /P/Q/R/S/T/U/V/W + /X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore + /quoteleft/a/b/c/d/e/f/g + /h/i/j/k/l/m/n/o + /p/q/r/s/t/u/v/w + /x/y/z/braceleft/bar/braceright/asciitilde/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/exclamdown/cent/sterling/fraction/yen/florin/section + /currency/quotesingle/quotedblleft/guillemotleft/guilsinglleft/guilsinglright/fi/fl + /.notdef/endash/dagger/daggerdbl/periodcentered/.notdef/paragraph/bullet + /quotesinglbase/quotedblbase/quotedblright/guillemotright/ellipsis/perthousand/.notdef/questiondown + /.notdef/grave/acute/circumflex/tilde/macron/breve/dotaccent + /dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron + /emdash/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef + /.notdef/AE/.notdef/ordfeminine/.notdef/.notdef/.notdef/.notdef + /Lslash/Oslash/OE/ordmasculine/.notdef/.notdef/.notdef/.notdef + /.notdef/ae/.notdef/.notdef/.notdef/dotlessi/.notdef/.notdef + /lslash/oslash/oe/germandbls/.notdef/.notdef/.notdef/.notdef] +pdfMakeFont +false pdfSetup +595 842 pdfSetupPaper +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0.706376 translate +0.9983 0.9983 scale +0 0 596 842 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 595.28 841.89 re +W +q +q +[1 0 0 1 0 0] cm +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 72 805.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\016) +[6.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.34766 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01367 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36133 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.69141 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.36523 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.03906 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.70508 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.70898 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.70898 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.375 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.04297 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.7168 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.71289 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.38672 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.7207 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.38867 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.38867 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.0625 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.73633 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.73633 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.41016 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.41016 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.74414 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41797 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.75195 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.42578 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.75586 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.42969 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.10352 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.76953 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.44336 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.10938 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.10938 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.10938 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.77539 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.44922 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.00586 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00781 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01172 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.68555 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.69336 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69336 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36719 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.04102 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.71484 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.38086 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37695 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.72461 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05859 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.73242 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.72852 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.39648 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.0625 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73633 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.73633 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.41016 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74023 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.74805 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.74805 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42188 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.0957 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76953 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.43555 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.43164 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.10547 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.7793 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.11328 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67969 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.6875 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.36133 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.03516 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.70312 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.37695 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.05078 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.72461 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.39844 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.40625 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.08008 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.75391 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.41992 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.09375 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.42383 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.41992 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.09375 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.76758 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.44141 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.44141 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.11523 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.44922 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.11523 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.78906 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.78906 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.12305 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.79688 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.79688 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.46484 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.46484 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.13086 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.79883 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.47266 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.46875 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.14258 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 7.33008 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.67578 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.3418 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.34961 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.02344 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69727 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37109 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.04492 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.05273 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72266 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.05664 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.73047 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.06445 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73828 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40625 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.08008 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.75391 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41992 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08594 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75977 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.42773 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42383 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.09766 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77148 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.76758 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.43359 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.76758 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.44141 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.10742 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.78125 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.45508 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12891 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.80273 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.47656 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.69141 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.69531 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70312 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37695 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.04492 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.71875 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39258 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.72656 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.40039 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06641 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.73242 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.40625 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.08008 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.75391 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.42188 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08789 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.76172 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.76953 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.10352 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.77734 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.77344 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.76953 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.44336 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.11719 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.45117 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.125 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.45508 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12891 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.46289 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.13086 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.79688 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.4707 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.00586 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01367 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.02148 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.05078 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.72461 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39844 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.07227 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.74609 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.08008 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.74609 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.41992 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.09375 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.42773 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.10156 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.76953 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.76562 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.43945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.11328 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.78711 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.45312 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.78711 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.46094 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.12695 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.46094 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.13477 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.80859 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.80469 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.13867 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.8125 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.80859 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.47461 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.14844 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.82227 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35156 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35156 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01953 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69336 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36719 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36719 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.375 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04102 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38086 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.38086 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.05469 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.7207 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.39453 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.72852 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.72461 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39844 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.39844 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.06641 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.73242 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.40625 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.07227 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.73828 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41211 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.74219 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.73828 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.41211 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.07812 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.75195 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.75195 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.42578 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.09961 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.77344 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00977 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68359 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35742 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.02539 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70312 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.71094 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.04492 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71875 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.39258 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06641 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.73242 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.40625 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.07422 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.4082 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08203 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74805 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41406 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.42188 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.0957 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.76172 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.43555 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.10156 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.43555 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.10938 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.7832 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.79102 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.79102 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.45703 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79102 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.46484 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.13867 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.35156 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.35156 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.69141 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35742 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.03125 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.36523 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.03906 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.03516 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70898 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04297 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.7168 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39062 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.06445 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.39453 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.06836 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07617 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.42383 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.09766 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.42773 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42773 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.10156 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.77539 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.44141 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.44141 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.11523 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.78125 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.78906 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.78906 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.46289 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00391 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35156 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.68555 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35938 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.35547 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.0293 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.69727 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36328 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.03711 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.03711 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70312 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.37695 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05078 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.72461 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.72656 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.39258 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.06641 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.73242 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.39844 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.40625 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.40234 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.07617 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.41016 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.74414 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.41016 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.74414 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.41797 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.0918 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.75781 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.76562 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43945 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.11328 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.45508 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12891 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.12891 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.67383 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.01367 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.67969 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.34766 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.02148 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36133 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.02734 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70898 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38281 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.05469 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05078 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.72461 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39844 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.39844 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.07227 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74609 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41406 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08008 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.42773 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.10156 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.09766 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.43164 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.09766 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.43164 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.42773 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.09375 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09375 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.76758 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.10156 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.77539 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.44141 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.11523 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.11523 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.78906 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.78516 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.45898 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34375 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36133 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04297 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70898 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04297 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.03906 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.70508 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.70508 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.37109 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.04492 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.04492 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.71289 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.37891 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.05273 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.71875 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.38477 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39258 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.72656 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.72266 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.38867 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.38867 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.72266 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.38867 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.0625 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.73633 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.74414 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.07812 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.75195 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.74805 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.42188 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.0957 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.42578 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.09961 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.09961 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.43359 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.66602 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.00586 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.35352 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.02734 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70117 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.375 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70898 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38281 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05273 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.72656 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.73242 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.73633 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.40234 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.06836 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74219 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41602 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.41992 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.09375 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.76367 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.43164 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.43164 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.10547 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.77148 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.44531 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.7793 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.45312 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.12695 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.46094 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.68555 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.68555 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35938 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.35547 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.0293 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36328 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.03711 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.70312 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70312 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70312 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37695 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.05078 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.38477 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73242 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40625 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.08008 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08789 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.08398 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.75781 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.0918 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.42578 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.0918 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.42578 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.09961 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.77344 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.78125 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.45508 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.12891 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.125 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.45898 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.4668 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.46289 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.13672 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.4707 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.14453 -219.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.36133 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.03516 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.70898 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.70508 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.37305 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04688 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.7207 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.7207 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.39453 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.06836 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.74414 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.41797 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.41406 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08789 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.75586 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.42969 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.76367 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.10352 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10352 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.4375 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.11133 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.44531 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.11914 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.79297 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.45898 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.13281 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.79883 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.79883 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.79883 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.46484 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.13867 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.36133 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37695 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.71094 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.38477 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.71484 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.38086 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.38867 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.05469 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.7207 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.39453 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.06836 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.73438 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.4082 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.07617 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74219 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.41602 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74609 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74609 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.41992 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41992 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.08594 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.75195 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.08594 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.75977 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.43359 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.76758 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.44141 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.11523 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.78906 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.0293 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.36914 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.04297 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.37695 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.05078 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.71875 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.71484 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38867 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0625 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.73633 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.40234 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.41016 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07617 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.41016 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.08398 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75781 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.75391 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.76172 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.75781 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42383 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.09766 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.77148 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.43945 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.43555 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.10938 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.7832 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.11719 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79102 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.79102 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45898 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.13281 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.80664 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80664 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.80664 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.48047 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.81445 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.48828 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.99609 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.66211 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.33594 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.00195 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00195 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.67578 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.3418 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.01562 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.34961 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.3457 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.01953 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.01953 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.6875 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.35352 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.02734 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.70117 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.375 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.70898 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.375 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.38281 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.05664 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.72266 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.39648 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.39648 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07031 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.06641 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74023 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.4082 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.4082 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.08203 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.74805 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.41406 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.74805 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.41602 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.41992 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.09375 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.76758 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76758 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.44141 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.10742 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.77344 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.44727 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.78125 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.78125 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.45508 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.66992 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.35156 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.69922 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.69922 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.37305 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.04688 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.04297 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.05078 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.72461 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.39844 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.06445 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.07227 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.07227 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.74609 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.41211 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.08594 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.75977 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.09375 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.76758 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.10156 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.10938 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.10938 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.7832 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.45703 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.13086 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.79688 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.79297 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.4668 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.14062 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.47461 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.14844 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.14453 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.8125 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.47852 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.15234 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.82617 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.00391 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67773 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.67383 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.33984 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.00781 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.3418 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.00781 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.68164 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.68164 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.34766 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.02148 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.69531 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.36914 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.03711 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.03711 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.70312 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.37109 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.04492 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.04102 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.71484 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.38281 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.7168 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.39062 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.38672 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.38281 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.05664 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.73047 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.06445 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.73828 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.06836 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.74219 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.41602 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.08398 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.75781 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.75391 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.42773 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.42773 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.09375 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.76758 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.35547 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.0293 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.70312 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.37695 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.05078 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.72461 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.39258 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.05859 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.73242 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0625 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.0625 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.73633 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.40234 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.06836 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.40234 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.07617 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.75 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.08398 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.75781 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.43164 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.10547 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.11328 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.78711 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.46094 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.13477 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.80859 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.14258 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.80859 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.48242 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.15625 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.49023 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.16406 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.83203 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.82812 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.50195 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.17578 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.84961 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.51562 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.84961 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.52344 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.18945 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.52344 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.19727 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.87109 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.86719 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.20117 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.875 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.87109 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.53711 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.21094 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.88477 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.55273 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.54883 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.22266 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.89648 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.23047 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.9043 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.9043 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.57227 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.24609 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.91992 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.91992 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.91992 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.59375 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.92773 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.60156 -324.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.99609 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.66211 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.33594 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.00195 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00195 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.67578 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.3418 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.01562 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.34961 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.3457 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.01953 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.01953 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.6875 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.02148 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.0293 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.70312 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.36914 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.04297 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.03906 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.71289 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.38672 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.7207 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.39453 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.72461 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39844 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.07227 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.73828 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.73828 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.4043 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.07812 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.75195 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.08203 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.75586 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.42969 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.0957 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76172 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.76953 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.44336 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.77734 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.77734 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.44336 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.44336 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.11719 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.11328 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.10938 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.7832 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.45117 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.45508 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.12891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.79492 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.46094 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.13477 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.80859 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.14258 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.81641 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.81641 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.49023 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.16406 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.17188 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.8457 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.51953 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.19336 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.85938 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.19336 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.86719 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.54102 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.20898 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.20508 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.875 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.54883 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.54883 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.88281 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.87891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.54492 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.54492 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.87891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.54492 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.21875 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.89258 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.70508 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37891 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.05273 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38672 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.06055 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.39453 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.06836 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73242 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40625 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.07227 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74609 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.74609 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.41992 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.09375 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.76758 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.77539 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10938 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.7832 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.7793 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45312 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.78711 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.46094 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.79492 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12891 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.80273 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.79883 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.47266 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.13867 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.47266 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.14648 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.82031 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.49414 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.49414 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.82812 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.50195 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.50195 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.16992 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\024) +[7.704 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.83594 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.50391 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.17773 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.85156 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.52539 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.19336 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.18945 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.86328 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.53711 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.21094 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.21875 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.55273 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.22656 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.89258 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.55859 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.23242 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.23242 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.90039 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.57422 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.24219 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.57617 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.57227 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.23828 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.23828 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.57227 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.23828 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.91211 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.58594 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33008 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33398 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.00781 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.67383 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.02148 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.69531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.69531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36914 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.7168 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39062 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39062 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.06445 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.73047 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.39648 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73047 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73047 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.4043 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07031 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73633 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.4043 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.07812 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75195 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.42578 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.09375 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42773 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.10156 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.76758 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.43359 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.10742 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.44141 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.10742 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.10352 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.77734 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.45117 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.44727 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.12109 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.78711 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.46094 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12891 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80273 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.47656 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.15039 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.81836 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.81836 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.49219 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.49219 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.82617 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.49219 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.16602 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.83984 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.50586 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.17969 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.50977 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.17578 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.84961 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.84961 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.52344 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.85742 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.85742 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.53125 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.53125 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.86523 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.53125 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.20508 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87891 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.54492 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.21875 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.21484 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 7.78711 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.45312 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.45312 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.12695 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.12305 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.79688 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.13086 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.80469 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.80078 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.80078 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.80859 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.48242 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.47852 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.15234 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.82617 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.49414 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.49414 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.16797 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.16406 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.83008 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.50391 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.83789 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.51172 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.17969 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.17578 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.84961 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.18359 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.17969 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.85352 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.18359 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.85742 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.53125 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.20508 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.53906 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.20703 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.88086 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.54688 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.88086 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.87695 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.54297 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.54297 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.2168 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.55078 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.22461 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.55859 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.55859 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.23242 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.89844 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.56445 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.89844 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.56641 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.23242 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.90625 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.58008 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.91406 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.58789 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.26172 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.92773 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.59375 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.26758 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.94141 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.27539 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.94922 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.94922 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.62305 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.29688 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.30469 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.9707 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.64453 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.97852 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.65234 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.64844 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.32227 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.99609 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67773 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.35156 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.01953 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.68555 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35938 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.35547 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.0293 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70312 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36914 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.70312 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37695 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.70703 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.37305 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.38086 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04688 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.7207 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.7168 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.39062 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.7207 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.39453 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.0625 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.73633 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.73242 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.40625 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.07422 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.74023 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41406 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.08789 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.08398 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.75781 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.43164 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.09961 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.77344 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43945 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.11328 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.46094 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.12695 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.46094 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.12891 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.79492 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.46875 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.13477 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.80078 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.47461 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.80469 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.47852 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.14453 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.47852 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.47461 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.14062 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.14062 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.81445 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.14844 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.82227 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.48828 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.16211 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.1582 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.83203 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.50586 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.83984 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.51367 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.84375 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.84375 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.51758 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.19141 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.85742 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.19141 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.52539 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.19141 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.19141 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.85938 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.86328 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.53711 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35352 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01953 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35352 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.02734 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.70117 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.375 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.04883 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.05664 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.73047 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.4043 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.07031 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.4043 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.73828 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.41211 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.4082 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.08203 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08203 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08203 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.75586 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75195 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.74805 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42188 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.0957 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.10352 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.77734 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.45117 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.44727 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.78125 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.11523 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.78125 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.11523 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.78906 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.12305 -414.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.00586 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.68359 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.35742 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.69141 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.35742 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.02344 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.69727 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37109 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.36719 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04102 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.70898 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38281 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.05664 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73047 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.72656 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40039 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.73438 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73047 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.73828 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.41211 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.74609 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.74219 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.41602 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.08203 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.74805 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.41406 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.74805 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.74805 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.42188 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.08789 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76172 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.43555 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.76953 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.44336 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.77734 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.45117 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.11914 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.45312 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.12695 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.80078 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.80078 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.4668 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.14062 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.81445 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.14844 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.82227 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.83008 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.49609 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.16211 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.83594 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.50977 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.17578 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.84961 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.51758 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.51367 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.1875 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.86133 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.85742 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.52344 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.85742 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.53125 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.20508 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.87109 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.20508 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.53906 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.21289 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.87891 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.54492 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.87891 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.55273 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.00391 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.33789 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01172 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.3418 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.3418 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.01562 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.01562 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.01562 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.68164 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.35547 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.02148 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.68945 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36328 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.03711 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70312 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.70312 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.36914 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.04297 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.7168 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.05078 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.71875 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.38477 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.05859 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.73242 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.06641 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74023 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.41406 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.08789 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.08789 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42188 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.0957 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.42969 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.42969 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.0957 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.0957 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.76953 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.76562 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76172 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.76953 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.76953 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.44336 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.11719 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.79102 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.45703 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.13086 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.13086 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.79883 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.58594 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.25195 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.25195 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.92578 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.92188 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.5957 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.92969 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.60352 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.9375 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.61133 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.61133 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.2793 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.27539 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.94141 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.94141 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.61523 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.61523 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.2832 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.2832 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.94922 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.61719 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.29102 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.28711 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.96094 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.62891 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.30273 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.96875 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.63477 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.30859 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 473.98242 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 480.65625 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.68164 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.68555 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35938 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.36719 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.04102 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.04883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.72266 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.38867 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.38867 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38867 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38867 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.05469 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.72266 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39648 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39258 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.73438 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.07422 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08203 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08203 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75586 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.42188 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.08789 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.75391 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.75391 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41992 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.75391 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.42773 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.10156 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.76758 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.77539 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.44922 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.12305 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79688 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.46289 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.13672 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.81055 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.14453 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.81836 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.49219 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.1582 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.49219 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.49219 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.1582 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49219 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.16602 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.17383 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.84766 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.52148 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.1875 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.85547 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.52148 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.19531 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.86133 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.52734 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.53516 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.20898 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.88281 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.54883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.88281 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.2168 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.89062 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.55664 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.22266 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.55664 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.23047 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.9043 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.57031 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.24414 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.57812 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.24609 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\014) +[6.78 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.57617 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.25 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.25 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.25 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.34375 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01758 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35742 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.35352 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.02148 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.69531 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36914 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04297 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37695 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.05078 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.38477 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.06641 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74023 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41406 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.76172 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.76953 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.44336 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.11719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.11719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.78516 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45898 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.13281 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.79883 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.47266 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.13867 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.13867 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.13867 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.80469 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.47852 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.48633 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.15234 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.16016 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.82617 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.5 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.5 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.17383 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.16992 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.83789 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.8418 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.83789 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.51172 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.17773 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.18555 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.51953 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.19336 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.18945 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.18555 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.85938 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.5332 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.54102 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.87109 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.86719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.54102 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.875 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.87109 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.54492 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.875 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.54883 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.22266 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.21875 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.89258 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.89258 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.68555 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.35938 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.69531 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.05078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.7168 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.38281 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.05664 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.73047 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.4043 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.73438 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.4082 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.08203 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.74805 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.07812 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.74414 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.75195 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.75195 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.42578 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.09961 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.76562 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.76562 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.43945 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.10547 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.7793 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.44727 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.44336 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79102 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.45312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.78711 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.45312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.46094 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.12695 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.80078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.80859 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.48242 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.81641 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.49023 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.48633 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.48633 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.48633 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.48242 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.15625 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.82227 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.49609 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.49609 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.16992 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.84375 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.51758 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.52539 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.52539 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.19922 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.19531 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.19531 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.86914 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.20312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.20312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.86914 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.20312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.87695 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.88477 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.55078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.33594 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00977 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.00586 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.67383 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.33984 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01367 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.67969 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.3457 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.35352 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.34961 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.01562 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.01562 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.68945 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.02344 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.35742 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.03125 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.02734 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.36133 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.03516 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.36914 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.03711 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.03711 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.71094 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.38477 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.38477 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.05859 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.73242 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.40625 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.08008 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.74805 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.42188 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.0957 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.76953 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.4375 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.77148 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.44531 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.11914 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.11914 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.78516 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.45898 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.13281 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.4668 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.14062 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.80664 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.48047 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.1543 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.82812 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.49414 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.82812 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.49609 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.16992 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.84375 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.83984 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17383 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.50781 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.17383 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.50781 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.18164 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.51172 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.51953 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.51562 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.18945 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.52344 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.19727 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.19727 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\024) +[7.704 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33398 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00781 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.68164 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01172 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.3457 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01172 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.3457 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.34961 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.3457 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.01953 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.35352 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.02734 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.36133 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.03516 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.04297 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.7168 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.39062 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.06445 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.73828 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74609 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41992 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.09375 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.76758 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.43359 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.10742 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.78125 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.11523 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.78906 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.46289 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.13672 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.80469 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.80469 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.47852 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.14453 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.81055 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.47656 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.47656 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.14258 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.47656 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.15039 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.82422 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.49023 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.49805 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.83203 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.50586 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.17188 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.83789 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.17188 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.8457 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.51172 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.17773 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.85156 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.84766 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.84766 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.52148 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.51758 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.19141 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.86523 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.19922 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86719 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.87109 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.86719 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.54102 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.20703 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.21484 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.54883 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.21484 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.88867 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.88867 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.55469 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.22852 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.90234 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.57617 -549.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.36133 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.70312 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.37305 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04688 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.7207 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.38672 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.7207 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.39453 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.06055 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.73438 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.4082 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.08203 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.74805 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.08203 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08789 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.0918 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.75781 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.42383 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.09766 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.77148 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.44531 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.77539 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.44922 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.44531 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.11914 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.78711 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.78711 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.46094 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.12695 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.80078 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.13477 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.80859 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.48242 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.81641 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.48438 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.48828 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.16211 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.16992 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.84375 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.83984 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.51367 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.51367 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.17969 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85352 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.52734 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.19531 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.5293 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.20312 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.19922 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.5332 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.20703 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.53711 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.21094 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.88477 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.55078 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.88477 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.55859 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.23242 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.22852 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.5625 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.89648 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.5625 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.89648 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.57031 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.90039 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.90039 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.57422 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.24805 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.92188 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.5957 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.26953 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.60352 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 474.26953 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 480.26953 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.70312 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.37695 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.05078 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.72461 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.39844 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.40625 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.40625 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.08008 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.75391 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.42773 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.10156 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.77539 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.10938 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.77539 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.10938 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.7832 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.7793 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.45312 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.78711 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.45508 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.12891 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.125 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.79883 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.47266 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.46875 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.47656 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.15039 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.82422 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.82031 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.1543 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.48828 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.1543 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.48828 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.16211 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.49219 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.16602 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.83984 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.17383 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.18164 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.51562 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.18945 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.85547 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.52148 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.85547 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.52148 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.5293 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.20312 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.19922 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.19922 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.87305 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.54102 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.54492 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.21875 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.88477 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.55078 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.22461 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.89844 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.23242 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.90625 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.90625 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.58008 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.25391 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.26172 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.93555 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.60156 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.26758 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.94141 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.9375 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.9375 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.61133 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.60742 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.28125 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.95508 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70117 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.375 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04883 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.72266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38867 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.0625 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39648 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.06445 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.06836 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.74219 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.4082 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.07422 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.42188 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.75586 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.42969 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.42969 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.10352 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.77734 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.78516 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.78516 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.45117 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.78516 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45898 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.4668 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.14062 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.80664 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.47266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.14062 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.14844 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.82227 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.49609 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.83008 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.83789 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.83398 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.50781 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.17383 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.84766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.84766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.18164 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.84766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.85547 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.5293 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.20312 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.20312 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.53711 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.21094 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.54102 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.21484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.22266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.22266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.88867 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.22266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.89648 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.9043 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.57812 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.24414 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.91016 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.24414 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.91211 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.9082 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.58203 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.25586 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.25195 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.91797 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.36133 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.36133 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.02539 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69922 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.69922 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.70703 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.38086 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.71484 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.05469 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72852 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.40234 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.07617 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.75 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.42383 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08789 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08398 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.75 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08398 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.75 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.42383 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.09766 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.77148 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.43945 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.11328 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.7793 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.45312 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.7832 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.11719 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79102 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.45703 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12305 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79688 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13086 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.13086 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.80469 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.4707 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.13672 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.80273 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.80273 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46875 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.80273 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.47656 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.15039 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.81641 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.82422 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.49805 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.16406 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.83789 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.51172 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.17969 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.17969 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.85352 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.85352 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.1875 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86133 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.85742 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.53125 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.20508 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.53906 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.21289 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87891 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.87891 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.87891 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.55273 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.22656 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.90039 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.23047 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.9043 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33008 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33398 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.33008 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.00391 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.67773 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.67773 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.35156 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.02539 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.69336 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.69336 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.36719 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.04102 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.71484 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.39648 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.73047 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.39648 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.07031 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.07031 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73633 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41016 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08398 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.75781 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.42578 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.0918 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.76562 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.76172 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.43555 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.43164 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09961 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.76562 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.77344 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.77344 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.44727 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.44336 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.11719 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.79102 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.12109 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.78711 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.46094 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.46094 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.79492 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46875 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.80273 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.80273 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.47656 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.15039 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.15039 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.82422 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.49805 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.17188 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.8457 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.51367 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.1875 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.86133 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.5293 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.19531 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.86914 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.53516 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.20117 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.20898 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.88281 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.54883 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.88281 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.87891 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.54492 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.54492 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.21875 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.55273 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.21875 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.89258 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.89258 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.22656 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.23438 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.99609 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.66211 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.66992 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00391 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.66602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.33984 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01367 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.67969 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.3457 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.01172 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.01953 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.68555 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.35938 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.35938 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0332 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.69922 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.36523 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.36523 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.0332 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.82031 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.48633 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.48633 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.16016 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.15625 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.83008 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.16406 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.83789 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.51172 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.18555 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.18555 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.51953 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.19336 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.52734 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.52734 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.20117 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.86719 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.54102 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.875 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.54883 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.22266 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.89062 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.89062 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.56445 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.89453 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.56836 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.23438 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.9082 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.57422 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.9082 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.58203 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.25586 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.26367 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.9375 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.61133 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.27734 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.27734 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.94336 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.61719 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.29102 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.625 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.29297 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.29688 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.9707 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.9707 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.64453 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.31836 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.99219 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.66602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.33203 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.33203 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.33203 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.00391 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.67383 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.34766 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.68164 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.35547 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.68555 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.01953 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.69336 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.69336 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.35938 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.02539 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.69141 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.69141 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.35742 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.69141 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.35742 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.03125 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.70508 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.70117 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.375 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.04883 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.38281 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.05078 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.38477 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39258 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.72656 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.40039 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.39648 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.39258 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.06641 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.74023 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.07422 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.74805 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.74414 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.41211 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.08594 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.75977 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.42578 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.75586 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.42969 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.4375 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.11133 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.10742 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.78125 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.78125 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.44727 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.12109 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.12891 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.80273 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.47656 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.47266 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.80664 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.14062 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.80664 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.14062 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.81445 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.14844 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.81641 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.48242 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.15625 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.15625 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.49023 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.16406 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.49805 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.83203 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.50586 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.17188 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.83789 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.17188 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.8457 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.51953 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.51953 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.19336 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.86719 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.86328 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.99609 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.66211 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.33594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00391 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.00391 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.67773 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.35156 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.02539 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38086 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.05469 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.7207 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.39453 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06055 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.06055 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06055 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.72656 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.40039 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.4082 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74219 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41602 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.41211 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.08594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.75195 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.08594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.75977 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.42578 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.42578 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.42578 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.42578 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.0918 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.42578 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.09961 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.10742 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.10352 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.77734 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.77734 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.77734 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.45117 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.11914 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\014) +[6.78 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.44922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.12305 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.12305 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.12305 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.13086 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.80469 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.4707 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.14453 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.81836 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.49219 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.1582 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.82617 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.49219 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.48828 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.16211 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.83594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.83203 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.50586 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.17188 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.8457 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.51367 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.84766 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.52148 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.51758 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.51367 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.1875 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.86133 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.19531 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.86914 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.86523 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.5332 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.19922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.86523 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.53906 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.53906 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.68164 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.35547 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.0293 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.69727 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.03125 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.70508 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.70508 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.37109 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.70508 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.70508 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.70508 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37891 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.37891 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.04492 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.71875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.39258 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.40039 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.07422 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.08203 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.41406 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74805 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.42188 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.41797 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.42578 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.75977 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.43359 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42969 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.10352 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.77734 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.45117 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.125 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.79297 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.4668 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.14062 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.4707 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.4707 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.14453 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.81836 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.49219 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.16602 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.83203 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.83984 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.51367 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.1875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.1875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.52148 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.51758 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.19141 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85938 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.5332 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.20703 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.53711 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.20312 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.87695 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.87695 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.55078 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.22461 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.55859 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.23242 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.56641 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.24023 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.90625 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.90234 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.57617 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.25 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.92383 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.59766 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.27148 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.27148 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67773 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.35156 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.69922 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.37305 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.03906 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.03906 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.04688 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.7207 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38672 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.06055 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.73438 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.40039 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.40039 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.40039 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06641 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.39648 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.39648 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.07031 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.74414 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.74414 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.41797 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.41797 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75195 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.42578 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.75977 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.43359 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76367 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.42969 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.10352 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.77734 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.44531 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.11914 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45312 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.45312 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.11914 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.11914 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.79297 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.78906 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.78516 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.79297 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.4668 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46289 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.46289 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46289 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.46289 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.13672 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.81055 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.48438 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.15039 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.14648 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.82031 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.49414 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.82812 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.50195 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.83203 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.50586 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.83984 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.50781 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.84961 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.52344 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.52344 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.85742 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.52344 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.19727 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.87109 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.53711 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.21094 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.00586 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67969 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.35352 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35742 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.03125 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.70508 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37109 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.04492 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.375 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04883 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05664 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.05273 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71875 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.71875 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.39258 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.72656 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40039 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40039 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.07422 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07031 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.07031 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.74414 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75195 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.75195 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.42578 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.43359 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.76758 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.44141 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.11523 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.78906 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.45508 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.12891 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79688 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.46289 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12891 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.80273 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.47656 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.47266 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.48047 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.1543 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.82031 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.49414 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.49023 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.16406 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.83789 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.17188 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.8457 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.8418 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 360 805.89] cm +q +0 -300 200 300 re +W* +[200 0 0 300 0 -300] cm +/DeviceRGB setcolorspace +<< + /ImageType 1 + /Width 512 + /Height 768 + /ImageMatrix [512 0 0 -768 0 768] + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /DataSource currentfile + /ASCII85Decode filter + << >> /FlateDecode filter +>> +pdfIm +Gas`+LN4>:en+d[1Ms-tPpADPK_M(p4*V=nHgeYCQWI2[f/*F?s81qM,XG&Q0bGok +/jYSV:mKTqkM2P`]Pf+Z?-.C\C%k*>.>^-^0rI.rPf?rI&_C4=\Irp6K7Ig\GHl7< +^?iKF]5/F(kE=HgF!18P7-^D`b+!!5e/q7P'D6UM)[s-F[]32kQ&=mqoMRHT$%\P[:')]]6fXc=)PgCf$<5dMtXG8/;fN'l!-.[gfX +UTUQI'TJ!_?C!ILnlB&IBLnRdEN:C"\&G#hP]Z3=2SPZI[8Mm*;V=cX4)mtNXos`O +U)m$+c6.4[[f,HRu"je\%uID$D;]afhH\ak?2K*@#Mt3PbH^8719ls8Co62W&s%jD5tT]^$$`8t +:5S:W_f61)p<+2keZ.*,k-D2%*G]!5]$I_NpML-3)kioa)O2W^MI]VV:+JUWUWOA% +\Y:EXdMBuo@RXM$C!1W>W&1kD/KLduoq:*f=1UFhmV#719sLP?[o=L%<3eq[RB%jD +20l&K8QWi5N_F^s!+4lg&pc]JOVFfn:oqc2Fa:NkW&0diQE&ZieiLBg=5W3ZRXJ[] +?tp4sS^CJVZI>B3p2B[C2i!%?UZ(&!kl,,jE&r8,"4O1>l-mWcPR2U@![;\\N']>g$s<-3$'(K#CBk*hsGX]6*IuRX`(\L +ekX3+PNI&DdYaH^;,\iOBn]7*TX!H7[JXX`%TnRjJ",X* +G5B$\JAiY<#DV2c!c.WJ0aR.>rB"CHB/G*l^i."Am.e$CfB06ng'_]t/-r?3Trh(7 +)dq&#=rDm.d-t3(f9VlW>kOJa*_XIh0"XfMkVs^V?a(N?1LmOCZ\6U +`o9[_5#nLU<$6H7:*#-H#NG*a\9&jrm7UUfddEfFGUORS8o>-X[muq^a.#lFiqK@? ++3qf3/nAmn0?ekM(*rT`\nY=k2 +j>K339QtC'XkRsX1!SM9M;(.9R79s3ct=5$S&*Ha)@%hBd+0IU`<+X_co_cr(!A.E +'ps_M`%5B[M-:%Z&b@8a!ooA^'Jt>+aNtI_5qens#'HJe(:=#YU?,=_Y-g[PVsF," +Xan,+1j$X4?GtW[=p?]3(rj$3nSKt?nV_$X]Aqtt34U=h8R&*\/Rk6TJ76G+#&2O/ +D&B,YrIh=LqFOiou#3D6oL"HM,?r$N[lI`'dKQFVH(Q/ +<\qptDpm?B8i'2AM+L#Cq<,D+)>@=W[@VJr@s/073]>ssY]CQA&)*?O[WfI/\(Bg3 +]Osn2$PE&@iQ.Oc,kZC0fbiXOt@8?BW, +l1A^;]DB\MQ,YjeoRFJ'",Hr?5>PM7BM(;Gc%_aP^V!U4_uC^^Ak`X42]A0A!%.`+ +"TIjJADO8[fP[+534s5->^J+nGhV>3sk=M*U1pqM$Za-[ku7KB7b(Bio/0a.iMT:!8UL\XO@ +PPZ"I`D>I5muGFI8#,;\j?FP)N/%5Br-LN=2P]$\mF8Scs)$']m@=!5r8/!R=TelO +!8?lE[m2mZrG6W%q6(q:$iYq6)89rs0W4XXP!AcWj0K;KrrIc`o99*A!=N2&riJEY +^Tl]Rj;n)e?'fQp8H'`OTg8fHrlK5(nrts1YqgfK:#iSJ:]FW#+&7`_5" +:D!U,'-k8;Y'kjCq#;[Uq&Yq'->$PB!;N1:s+L^YL]HEp"aiA*ldpb)?H77WqJOq. +6id,qo.NF5!(Mf^0T94l;8UIR+CtSK1b]$Wr2+qc#iL(qraufS;g"j-!;R:i5OmJ- +.J9G8+b)sR6iP+FAoT]LH.TUdIm*$1-1'qpqZ_j96kRISaL:HMH4-l/hKVfQ3)AGC +i3)[\NiRBUSu$+B)()OG+b/0iL<HIZ)R'?k&PgF44cMl$lXND57G>oRGSt"Y#oF,d5]? +FeMEtWSi8hJ,E+Qs/-ARn:,%g1Uk+rhA=*0SHESU_>j8"s.@T4n'<;P0,.bGQ!^^o +he_Rbm@)oPg>AI4J%P?f\TrYu(]Y>d\rZu>aT%H&o>uiip7kRdhPkj@lG9%/E8re! +S;+#d"N^UA&%$7$`do`:Ik_"2ao<]n"`@gNJJTbc04.0K0ao!%V#Ul)=?WGbe-L-u +#([hN+Fh]:`dZDoMODM)$c$3c[/qKTYbhV5&49?_!#At00TD7X@1&A+8P].S6T:]O +bfpYZ;0=7\+B[_9s$rLQd/qP(!%Htn8gq_O`M3:nB]`m@C)Z-SHGpcJ-AqhV@kDS* +NS.>V*0>[.nt#f<i[qQ,=pE=ql7]Il:&PX>n-Y^,,(!@C_Prdp9Q2^2C4.S3Vgir&P4/lM$G;f^X"'D +?``7R_#I[<061B8$M*pP2QiV:51]uhr]1"6;?)EJJ)pW-=]=J\?`iQP1dV>,s!\!l +r)`kN1n"BM%0bfgrm0/ke,h?(Q_g+5,[D,%s$?ib-jUEhkl5Bf?0c7j4mgGgO/4^_ +*aTo'[qKO^Gjje%!VT$SUPLHahM[) +r84ZGiVus3fS'0\VH1tBs0pE'np_>PNu?%='EOco('i'u"8\..5a!3X%Z&(]I4;N' +HsmQ-HRpbX)0@iOh/o&%*qKG&+@L_[Cerb$^akC[;rcU&Sc=[\Q_EJfp4(Z5qd5G7 +nm%SB;^>.!Nofdu.JusdT_(G:s4W%6`VG"..%VDMB?(YIs)[GRL$\cKm*iKb&HMhu +rnj5LP5Hj+s6@u>@ipm67u-5Z;tIi!HZEfg*P+=fDW];uWC&mi)Sqf!!9X;sbLlRC +s3o=1a0Ye;rdt1=i\,n6?3.6-J:_/CiDY8Y!"f3Uk6Hu7?QdS-@1Y.'?cdcui>"0T +"N#c]Je9dIil6G!i6;c]0r!rGs2S7'chUoPs0Due1AUZ2'#FUCKH0R_Z2YX$5D^kH +X@Jk%b>QV[p`K'ffp8C794?RQphDg6[H,)-#/'u^IW8Z+om2&sLR'`aokI4PmAU:' +A+9%Zr@_qcPguM(>S=sSa$Nf5&nXsM1d-/r.^S$Q%8nb +n:*'galh3I=Ob4fQ)\^SJ*)60s/H"\rI9;VH8o)e!&D1eS3Q0>#la"6#HmiWs*Kqm +niu3mlYlC65P)Xdh(Z>'VIn'Ys#3RTcmfmks(9:'9H0EL@k28,5lMa?aIe@jaM/\I +mRCU`>qh'UJ60Smj6.ZV6iXL`Id[6Eb6/_Y,H/5!)K$4e_;T9[c!qmrIiegC#gA3V +nir$4pn&a\r!uCpIF4b341%#[->QPXCoZQ]13'9a>cPk,R+XDF-$S#lC'Le7RSBYPns/WRda@,GfmCJ>,1/d;%!@=D%T8F'hU[4!Pl +,Zqtac*da,a`+>M9Jke7Fu%QA#DS_^H.k09WeOBm0J$lAH$)?L@:Zd`XEK]V!QkIc +">h69V\HP;\/8=@\:9CgrtN'@?do-fS3LYVD_d?LKRG:`?U`k:p.Edt=je[Xq\deS +,SlP`YVAls.R@(,:.R04hPiM\3a2Gq&bb=>^R;"olX1X3c=Vnf>bKn7('p[d6.]Eh>!Fc[U+Crd=*^ +'+V;'gM1R=o'[)h!:kobo-I6h]b6=,KYkp+i,Ud[s0!ONi\;&CT1lGni]efBrt,p7 +r5C)`.kO?#/ZlJ#20^1fn&srf$R>eh\*tGFr_6P'_>>=_-RpERV'N7/V<%YW8(o%7 +7MGH*VF:V]8(sGpl#pIKm9+(=lV5P`WuIonr<-8"efbMm7K"pd)!#d\7498scn)O8 +!V+E>peBQ@\"N\L,6\_*T2MhAAmN14h!`[oG8^-IhR?VrbDJ"h*6q))ZRKHZdR(b*(B)\47HXD)1p.6R;->`qAGjcS"b@ +`ILk%Dr1gcroAPF3X'NaR^ER/O?=Rb,U2eioFLk,dSq_X:ocA:2*Ld8<1u@X/XR3`udl#&CXgYLj2R]'O7buFiklL]h059_U%3hI5 +f@A@(>"Z[V+JEHIO6]sU'?S!.gZladISTn4rF'Ml'L)ZGrZ]hTd3QTPTDU@L!4;bV +6id%T.Xs4'eY1$kio1RJs(W+pL%aL*GqVFd0DZbT;Y:qX*^*ADlUidHdAb5LeN&C7 +@oK2,jJ`OLIj0=mM&hFm"c58'!]%gUr3<&>/?Ku:R`D_ZM5#2D+.gWpBC_O5q<`mq +r_a4/s*qIm5.fIH*iT(-fD%LR*H1`2@P`L"rc`PQND7ISJ#+7AoT6iGs,l%=?MT'h +Y`f$CgK3s,DVrJc%rj+E9Pi)Xc@8N)$S8.T\;bF_Ec[pWFDDl(NZo5?.I]L\OI:9O +8cI'8O-h7K$[Obt2o@VoE?,*&4cfI'c +oeeX8+"@9O%kX"C,I)HSIiu8^&%i8Rd/pDhU7umKSb)jgq*.qc036#QJ$CUY20f/= +n5T;nk$Nf>:[bBonAiYls-5)&s)Ls;s&U`;Q$PgGl,a/TjeDcf6Tt&@^iJ&aH5Q!3 +%(EINkuq[Ne"gk"f?@W#0d-qEAL"AVOrb%S\kZS^8BXW)eTCVlAgd[=YPd:fg:n:ap/%79-IgY*UteXV]Kp]W.E! +$ahB$Sc?=XNUk_$#&,))7"/bD&\&L9l;J,"9/%#M$%p8^b503`4i9H>d9%] +K2-ClnomYL*XV"Z=YccQn:)pb9ZL/dUcP.!(,EHf?rNkX2t2&f$YpOGLs/E3je +pV3$c^RG(-:[74"/b=J?0UMf_5I&[55lR;R'*mFl+7a(DO7%X?o^uIF5QAVi!)8"I +s&0'9s+:.Lj:HD-j7.depS!%l"8Q1BQ5rR&Fc +qs7^O8,pPDpj-fTjtd#hBT3fm\TNuuJGEQnhkhE"knnUBi2-GsJ&206^pYBcg[G[T +k)X?77CNHAr/3Z`\)4*,!#C1dKbV%VmgqF_D2J>Q<=6P>PH]bY,d96i,6(Rp+NU2Q +h[Q%\14MBaisBF'@1>Xj1T]OA.>.t?L1RKK%0#]bQ/qs?:soZ,&HO/,nioRY9E2'7 +s"sNn7sOij6gCaSS9AfrSSJPPCZBd6t. +q,?Acq4l5jo+d79]K&ru7`s:IYuq%d]6I,RUStW_<<$%bL]BH./tc6B=3HIn7>,^:smnIgXp/'XdreJI(cC$fhE5Q2"rIVeVR* +SZ8r#1Ua<<3=)b!IGVljU\Q'ASE<0^pMHq9h<82Jl'Ug"g]Ckcer +TrX1"Q'gqcgSDY9$,@a$Q\Cs8TS''@Zla;/_KKYG+ca.0&W\L.Q,g%=$,7Z!)Hpn>MKLMkZi>$i2q6NL +;Xco@:ZePYL_ht&qOb.qjSu5"'P[uTs5AIK^XCY_\bloo[/`9A[X]1Zs6&e-"ogCG +Et!_GE_u_lSSe*J>O70ncj]r`qSl!kRD7.tesdRA#?9J-'1`.k^Z%QXY:2N_"c!HGm7P(r +\07,C(,%aL?W$e=<)a[LaF +k">GoV1*@7IW4L73q_EpbOF2%r8KGZopWX$>JBp8i2b2pjkBXcC\m*H5.MQdJPUIO +LQ29"3`Q)Xr"!YU^.ek4%pdN\(Zta&rP/<*rX\JQZ'p/4J80Pu!Z'nt+h^M\n0/>R +&BXm+`84d/QTu*)"b\K.E&Bj5s(TD4KC_,!0:jW36L[3(7uGTKDmB/2Fq[2g3a#(1 +8;.=_1$u"\*)-5Q"ePi.Gr$iP8:af4dLM'6MZ>@5patEXqO`ZG2:$@6cf@:tWeda# +1[SLA3`d*q&,E!qpKalrCb$[t=tHtJc&/MYmV!'j5EoSRY+qRqKD]59j\Y^mr9s6l +-3&bYrs3!3$i\Hd2mNhjkDTA3]J35@LT1M[(=`4:JFA))7oA; +dYLVP/&Nut397aD8c'!#KNl@o0t/^ms0]-5&Pt"D=:fH:,PqfH0@e]b+V5Pq"As'&b,&-(889`DGS +\mF">C78m;c2L3_62p.a5m@;?ZRYN1=o]<=SH%=mj4sZ='EOa(pYgU>$XfV):SSsX +s6p'>rtAH5;Zs`M":6"JBE;G2p+b/]VYT9Xni+7D5?I69m6Nt@78O>ANo/V$=E&-S +ciP&@\ei+R#:aQhUS\ +1M-/Wd5b/!cdhObpe!?S;W$+`[s%.k:&X/"U87hIdY!Tu"!eE-6hgZD-_C;*0g2hS +^"@mcG2SSXHl(ispn&a;YaU^edS +mc/Zt:a84jpjb1#2K9\l(+)enBd-_3qYut^FV$I[L2o4\i/a/K;h,HZ6iI-?r!u,A +$c&nGl*LDB'!qc-G(>s-(fp_*'WC;b3;Hnjs,Y%@s20@"jKD#=r4d#)j^9Z*oP-C2 +Yo:,S]fod5>cgE,U/Z6JO;$4bZ;+3L+%[W*o*A0C=r6:pJjhq/QiOp +b$%L?W`;(T+,a`(eK&=Y;_@ee_#LlBdqi\;FnOd\ERqS(;Lc@V0\q5K*B`-tI_7]: +FF3l[mYp1X(16LU5<\L`]K`rrDBf5J7;4[V0&lh6d.-:\rQe?m:W_pPAqP"oM:G'j +g+KB%2.Nh-jtLpn`bn6&0'ZjD<_h8fB]+te>Z6Z]M]lXqTZm43)6YOSP/eTk\4mAE +G"KOtMqXt_J1)1VH-DttPqCYUfQ(XI]Ne)CDE7Wep8bMcaBt-jW,kg15,QRPFN'K) +r*RSab'E%&s$lc*.8VI.i.%J%IAU2q'eWiL8BFY<]7=]m1&b=*0A^RA)p=VL_j8@!k5S[=77hb.hH3_8[Z +_#Jc[fH.L0E%m4tX:^]NRrol3c +Io&+k_uJ8.AaNaU4BJr9Pe@Iti'IPGUM.EI1%#SR:-Ilf.dXtVY8M`#[X@XK_.Wc` +Y5"/dJ+#6Z]$9SB?Pg?5CZ[HJ*C_s\[i)uscJ^UCs1p5chtX[!K3NPnmCUFl\<$'? +p'!W*GWmJK5,Is;V[pS`be]),5/:Wi:YEVrRA9N@6](l0!m*Uj!b`d"'AK'HGDM^o +6h!;^!>.q]kPGWnq0s6d_#Jr_:\U([2]D]E!YgR"36;,5":tSZIgQ7g.:<]eJ72+X +7WB.ReoUWtkOK_keO?Yimp=8Kf@!Dk_Qal]XTYh.!gh(R#NWWlno*"mh7d>P#-qj1 +aZj-7=d6Zcn.'"o#_p\6X?cd4fG`hC88]]YU/[_AIjY1^<$*+-K+s +e;('D8DRZ&5lOiJr5nu(2Qk:(Q)52bYL\!p5Pr3uBQho(&`g,7:Bgb;DC3Bf^bBZl +LCO3XBq;Z@mfo`UpJB_Ag4)=Mq(Oo/G]WTCp)O)3Ee!oXiTf0mmFN`_[gtCVrVb^B +A@paKQF#R]i(_ks2fo)iJ)^=nRGcDffLda%dE3uO-!durka"rVP+c+0\+=p5^R8]/ +".6h=eWb^OU0jJ+AfL/@O##`nV&Th%57-[s!ait64@tkpiDd`9Ea3.MGY?6CN:($i(Uu\me!5:)P5T9%F:Jg*f!Vb7i09?E"Qf%TkbKd!59]eD5lThoDU,R=9R^<-J4TZlkWqG= +h[And3"*Z"K^qDo;]l)9F,=:.PlJO3L&&cZp.&B=$q!+/i0F@9JY88PJ8"fg9s5'+ +#8O_Zlr"u.KGItCs(DFH&-Q>8^O327s6CK$eqL\`Y3qm^qNmYu'q`h?n&bJ`r)s%NECS\*f4 +r;RVi"&H3#LY2T9@LkRIpVHUp(\j.Rr1#hMcp!$Ra35,>!*oR^!e;JFA,eI$LBmmh +;$Qs5Ge9BJl-(Hm2YhjmjtcB(1,Bq!lGNXNI>9sR6IYT\4C[;]$8d?,JrbGTS0@t( +DZh=j$c(3tZ9t>aY\ZT!"`l-.#6Ct>'c<&1ao?h_^o&Y:s,1p#BE*a'9-NK1W,Ess +'p\BR7U=U2WD\hXUIJkJ'6m^3hp;G^jfsg?I*D`IoZ-q\]tW +EW6aIr[f/c=!@FCRM<08MJb`7bo8](@k4=0p0in`64<0^6CLe;;t?pZ*`^LfbdpbA +`i0)TLOu\.Gm(?Ji.R`rW1eM<]FN@bA]h-L2fMp8q`jCZr\$Z]`MajK0-q(sIjJs3 +B$AeqWKoKp$DqRpLb&D\.,h0RcjLDM1/FmF/!LqIOu?BRA4t:`$5%e=a^=Oe/16k_ +T+T7b$G?F^!H_6'Q2bP$<:4EM?!XRN=Rc@Ap\ksM">RFL)7%NE1L)pUrQfn9U%mf* +s1:MfJ$#j7,G:b\EUkauj^b=hQi&T9:D#jO!2TZ>i')EOrkF@G"TQf[ +!.;>*(Y]P;Qh,LMMs!_=o'Z_joE5Kq^O<6HRAW;k:-G6ms'rmIjbSFV5Z[VP!@"2u +B.6*tDFiUlb53=cJEhW;Rf#AU0_p?qHbJ>MAY#Q[KD@as=G_?)U;!IGI&2p3D`4Hj +^2c&>rpOqSot%(ugdn>EUJ[9SDhN[+jA5ac7TVp]eS&bFSleX]@ir=B* +=$"b:kC8Z0^ter^;!t>Cs)U#^jT^ouV']h?rga#Y9"h(f%^^knDD9HHa"$NT^MYs\ +dI87W+&n5PMJ60MO/lL6qT_fVn#h*.e33ZT5P[8urA6Y63'.'r^A'h$r&V04]sT'g +IXcJ=qoSNsa/^jhk>+$lZgLl#TZi-k,4<2N*Ij*Zrdkn.+8hrT=`,K2mBimWd<8FS +P[HYOX[R?^&CZ*EX"Lt@"W'79#I8Maf$9dM%g#2NWQmJ&Lk%=[pP`=mj&MphJZs*m +n1F?>Q^U?nKB1@a+H9F=Vp5IQq&o/+Eh)rtjBp)6R/Au&ImF#5@0BC6PY),[q31ib +,n3D325q3paL_o.q[I=$#.*;o$)1_b13CT>tUW**p +V/O^d?toU`i,6OCs7\g*#;H0*G2WBD]+JEeLArLu;`)kh0_q=bTGuTR"S;bBJ?/^B +,Cnk$[0@D8q7uo9'\J$8B+#r]EF`.$,(KbE@-Ip?T^+CWXpkit63Og*0-``=#^B*q +.gG&F+TFn1UBP=9Wd4VOBSSLks)nL33OI_aWOm<;ao<%U,^^a:"TL\k>OT70i6GhD +rc_T*IkYo3LmS*j;>bq4Iu46s5PUU.JGBBE$ect9ra57E@.BLX=e:Zo>Qc$0-4_1r +LPUKXpq?a)!6'MN#\8B&#Or=t$X"ftq/aju@Wr9Cr;/ZImoftf\%F2J!;;4/NWoaa +TB+N$t6&T25I*gjPiW^PjiF;:p)(Ps;AM' +InmM'8mhTCn,K4(>,t/iXf/67ePq148jHVSCPp^^cMZH`CV,==[tOdl+FsJ,BEoA, +%3g=`"-4)U]W.K'!U*12RsP6dO%U^.!@N@S@Np0Dq`c1RP5g6q+9(Hhs#b'"W!-9? +";tRR!(@nV(A/eWdcZM!>`m,m;cKYel=AJg^cVcg +hmWUT5ICKf[YEjMmHNg**t-2_p]#=WOSMcOs&]$2Nds@`s#+^K2#Bc5s5NrhdJr"( +H2l.h9`A0&@ibYa!J\^%nimt49VMsD^+fS"\I^ii`7RXY3\1De/ta0=mf`?qra!n@ +mEh&HBILf&KDE<4'\FH3G>S353WJ-k:1FO8p`Zfh(tST>T?AEd*8(N1!L*YAJ>V3( +-j>80TG4%4Th#2""S6\#faFtR^JKG)#M&j+s1=WO_3L=)!UPQ?SNXRC`bDr*)=Q@X +H]K&;_FL0sjP*i@YH[$dHCI/&gitA+(LuIe)1*oR5(WCrAb#f@r]_P$InC^oT@6?\k!5j>,'K"c@ngFH]]kX5E&H(Ehn39?,bqE]Ai02cqA`S>uJ>Q,r\<[,* +6,tWK":-IG4cAn"q3:Auab:#Q9KUj)/lD1CP`)[\Zg7:q(sX3ujSb4Ne(n[o7HO)T +5/3'!588D_n@tO?r7?<^hZ)Q%.$=S2gmK5r]AY9T.">C!/h8g@,l`0d`D(U<64;-[ +CK_CRi.!?\eE$WZ(BJ*ms6SY0K)]Q[e*61Q'B==Lm#T]1J[.4r%u9H?5We5rVd8>m +AS1op(csbVUpr34mG:h9n#H]OTlp_0lUMJFj2^9gbC\"GV828NmH`!dp#58\4kh4\ +0K[#7m<+\#kWrYqp[hj +*"a6h,+@l1N^sorAgI0"76B +MSd3=+R&h/"9Q?2&I=,@#t<^('2.<&gLt=NQj'F\etaSkEf4es +QFgtG"2i^p./5Zm1"%u#]%091"]6B,C'/=TbKHN)H5L"nER-8a=)5B>+SN]0/m#`u[eTq?,!8Dj[obI9r\#Bp:K7F4Np3l_^n->MK=)V1!;i5'X"G +5#tFMWi+d'rT$oCr(HeL>MoF&D#8A?!2%7I:]6JKh-*Io1=pGS[\#h-nb9E^+$'(b +8jJ%FTGj-I!nsYM=1QnJ]r:tiGr;/#>rM_CJ.d(,nEo3N+S9[H34Y&iEYKVHVF#8=LP9ptnum>8Q5(TO)0%*@U*1 +d(Vb"Y:J\@+J7i=(:9LB-CI^XZ9TJSaeN!1,U3es2aaR(E-`an=q;rKN79=T5SsXC +nsbK1,ZU/,/+QA6OfPPHuQh8C5>d]jJRfV,k92n",=g(%e@ZurjT +k0[*1TFhb70-uKWMNU[?f]&&j<\II/JGQ+RH)9b1BmWpm^.gi)@Y]-(%O7?$:#O$& +"uOuIo2l$QH8skfmsU-"h_&p7gUXlOSmK>(f$Q?R4_K*W!RqKR.,8&`DLL8`rZ1J> +gj9Is5D9X)7h.aOO2/fgnYc0(QfK%ZRQCJ33r,4."gn&j3Vt[\rd4Y8hh""Ff;r-eSq<(+R/Sp-)J*`9qt.fXNigoSX[*SGD-(_!7shIa+%?EK(l +q=R^%/K.nAs+^Yo!9B2IJB:%P(B0@?hnf>SIj2K3q54TEaIb]gq9o9gru_(Z_ep9-X8+Pugk3e3!q[o$HAh1g%YnZk+4jh+hs%.F>m6.:JXZL$l>ZLn +(nJ"KE!GF"-\5Y#liM?(AJucWY`*/,JR7)=W)L+UL57T +=V)MZQ#c5YBIU,8$1cDW-j"EL9fB%IkL>+`iu(uV.hhj,S"BdK5[=@I!p'Al8W!du +jaWGCIDAq`?nVJ-k5Upg*ZP!@AL;GNj[HT(@i.$&X-Ukg$q(MUEhR?5Y^VAVK ++FirH&H#=2_Yb[/niu22rkB!1$N=Css6%OGt:s&XgJM/NP:Yo!L. +$;^j:'EK9hN">Gg8cag"]?!0_,Z/OHHiK.YQ=7Qk%.O8bqjriKOoIKD2<7Oa7KDNL +Sc<9YqnMBX\%IU,O21u#h[Y&&J#`NiY*Frm-%!=g$]?KK8[GG\G1;.qC,AEM/8KGf +X4>a0EAa4g9uN>BTm,RIT('?_jD?19/fJ)Kq$$RAF/t5iB4jEoZ>tSa5>5:c^g9n&M4"D5L&`t-Z8OfGPM@#^2QV/!%8!lRYU@BM9s9UE?#spd1pg/7Si9g@;DGCV%WBpN)RKJZT,J:AWa7iGI,UbLSH%-crqEA]#54X(7b),O +ANrP"Pbo39+c#TtT,*_M!@%B,]pYLJO^:!9DN +gN?eFQ^45glAlr:!i@UDTj=k_:]@!0TBFMCKDH\6I+uRrY]JisJ'"+NPQ1>cnPB-# +MLW_IHiHJ.MkKiPoKPbEnaDVMr)Rig?]0(N!XOY`+U*NApn@`f9E"n5rtGLICYo*_ +gVG`6&;-fE5hkpHK]4(QY%;1J'G2HaF#3)&)/-Mt/-W0o>S+sV,,"+_038)5s/]in +k?H2d7-2ofUEo05)>b9aT&cuj.2smGHod5j<%%- +Mkua@ae'nEK)DVCY;CP#ZQoG?b$UP0OT4'66YgGrTa2JRfH\90m,OhuIs0RYgOKR& +a&f_'`_Kmi)]FGU'-a+,1UPojAlIN!X(k?H;W-7.%F_h'643ehF8k%t,lcWS4qRWf +#Us_"4a=%M4ge&B\'H,MVg",Q;9@TfX6VK3gANpQnPe6B&+fpZJ:(b8(g=$Hq +TF7^pFI`BoceWX,MsMOP"s!^`rbr;Jq7h)i+SjXe7Y293HcZ5F/H^?@5[P%k)A.$8 +Anf90NMND=ZF81cbr!mu41Ealq4BB#F$-k#WL>\F1AXm<#E!540(T.c57RFd<:Qb> +SruTB1([$7K?;A'@Y80M,/>"!TccT'K[X`i,d[Q$jF7mD,_#giG@o)!<;El[s8HPR +J,Xl(&)g=AgD9b6,2bQ_Z]/H_$1IoMm[2f3`h39A>6'!C]^(< +"E<^e6Mm;N&*EFIi8fC/ao@%lcUb=).X1-*7)37=#SAb^2ZcO$`<]lG"Y=`rpg96s +G)(boW7j,%DUUH/g6Q$rETm90"(6=e3K/@ach[U\_u$(/m#]Qd(7bE_h[pFbs#^65 +\.-(T.6sXO$4*?r?S)0[s-*B&r&"HL208SF+8MPQs$('Vpq?#.,(NRApq@?uiT1#/ +rhgMspk5(XqO\s^r6GZ6\5/XBne&\5^OE;bH'MBj!]<4'cYuM[KEr,S&0M%C?5]TT +4:#%Z5hZJ!CB_c`p"(lUR/u:-WN1-e2eC-tWDr +>l`UbnGFdMGaf/VWs7XmTRp'lD$7'd^OH10)skuS +_P^XHd=@0@=SNF:L;e(N5@S;[c-<2`'sk=](-qj(m>Mded["OU#bVlFA52_*r,4!] +oq`A7CRDK$9kuL5FXEqVVjRK_.9.pm!7@SdP*C\7P#,Blq>94UCrUK._>j=cHI;a@rlP1VIs/CZQiA4sT8raRnt19c:/'P,`fE#DrepcR1"#LY +K_PN5@.+'^c=j79YVc7>HIl9bYUY5fnsX0IkQ5)e^RS1"aT(Ve^tATmSG]uJ$i.Q` +q7e!rs0EYqKe@nI"jJ(na0bl(+/Ao:aA>&%p5-ntr"%u]5NLm$`W+%iMMM-0OP0q( +MuZJ$=5*at?U3F_&0aA!(F1Pb'W=("22AX.e288X[R8ql)S/ZjJ*nppe!OX^aa]FW +Y8&VbT-*"gFs$[0i'+rd$iUDa)@69!@po$;AUe[fI;&XJpu#ZCn5JrbI#]4s9q6Z" +c(@,q20Jn&q>prbs"/Rdr1:7n4)b.kJqKt7qbP=/o)DM)nNS=t^qYd;n9`"N>Mf'h +mcn$M&q%r/HqBr[:7Vt`r@^P=\;q]d7Wf9?emlsiuH +fV^T4T1F5:KgGlEgpcj]r`,L$2Tpf9Jeh+j\Bh#]7R +^Aq!7)ej@VD6B^/]`42LHs2k0Bep'<3iPk#<:%biLb"nnj77.o7fEY/fOcglqYp^U +$[VMr6'`uL1)1O2s0iE%Np0"2chtO:QiGJ)+\uGD2GWr=7H"4AqWcT:B`)g-p\uuD +^H^Q;+9"CsJ$Wpb/s>N"1JuEJ$]4B/hl]!.,>.; +aT)8t!fgoM'6'F#7;DnUFD,*%KG9g!Jc'G\7jNT#s&Ap6r(lS+a7RcL"+U[P@3\$' +nGSA$3ts`:J43e`6-ZC0ErL!eoPKqGq;5cME=A92/])-X:;;\eo"Qlo!De8piZYi3 +(co/;m0c%0;+i"h7=5KjJ1GsW-\%LjO?^*JI#4JWq+:S#B.j4T]b8O"m1UcFrtM$B +s!bJ]r_n!&q6;'HLAur5TG2qV.0=I:jaW/<#Q31Vn395.?KQC,nk?_bK8731:*LnZH=9O:DHn5q4m_7/UsquL]#!_@t47qncuk?XkqlW +pNDHLZZ`2]\p9'Z8dNg'2RsN8%ntfAKq8#])[8YS4?r%4]5:KQDQ)P:F]H7q$>sqa ++.-\HbG9"oi=KWYQ1I!DgjqNK<:dM&^Z@is*#+1N78>m72T1SRXLW5MSTc. +EUp:[NMWGER*ZZ/\nk928SHRm%7l&'$:+U\Qi]ZbZ>`b]MFiFt#m`r;rl>u`6rsD# +!BL8n8j3&9=d5i-b$7Z)YA8F`pFQ!O[5$T7r_3(#pV/EF(PG#$n!Z@!E2R"S2k)#b7],48OJbe2?K`=?qDk*lU0YJ8,3:DJ) +i$j%%n/,Rfo5b<59'Ce5n!oaC6KJaF'.EiOrepdU/IUar8c+G.-fP*_Z$Kq3krm1IBMLJDK,[hcC+4Sg=gh`V[%+_H!6D)*4&qR+NiW#5$]EiHHTS4RT +0`T":Sj2@U0g#/k,EH_d@p=I-TUU>jJ$]Dr5ZCO`4b>^b2/03=9Z;[i&3#,E>ap^e +!$;4rFY]gh6rgLj*(2$W:dc31Ma8JmabYi4Ip[F8?kJ@"LZ2#,SH$R5S2?h(P5hjg +[G_("f8KuCrZADordt/qq4imu*qb`dh2C'9oPhBZh]EWMh:fki8MfGbiT*e,"X#o2B`9Q="7C0%qr@IN^asI0DNa2,r2DL#rZW$] +"B+/1IW?Aj]nr8@ruqD(mR:I]0RrX-]MG)Ha=uJ'm)bcm`<`uos4&6?KF#A[L]H]A +E#hBVLQS]m*FVl^rk))$aA?c(9'?Gg:bY06%C`%m0nQRKe8t3i4D)G0'EQ(E*T>d# +BqGu,KtmX2FSISNkgNs)&^PZ)pj'2P]_Xi0Y:^U#,J-[8]VcY25.E4ajUuqo%I(s4NB>>Qe$=.T#j.MlPqt%?DFW?Nrgp]3N._ +iDkJI6S[r,-UY?*g[.R9m>X_\\PQDNVVYksb:l0YT8K_G,#nTW9-rJ-dRt^R=it9A +1O8,4cMT2'rbQ^/o.5iW%;iD>qEPrU*^qASkBUV4sE*VQm#Of(Jq&ahTt% +=iN%'^S4*o5L-J=JA\;LSS=PjJ%3RX#Y6%g]?Cjbi&5dQ.=_[@V9nd;3cQ0>T5q[U +g&Dt2rYb]2HeCl-.Bm+gMQ;1p/YM4f2FcYh\,lJihriMtTASH7=G^)*M@(G,`ljG: +B&B0&TDR%\6pR7?#`F4VA.'j5MskhQH^t,F#ah7F05M1B!br$_2/XnaN;sOjEcHLc +VTVB8l%gZ$<[K#L33J'fLb'O/"9Y./+(PL@W;kIt@1gVRCBR%1"DgJh]`/Y!s.?Rj +IW"2geolPVopmm!S?]/+94Eq&,abp*!>%9SS27r3flGC3GijDJJ%b=)X*^TJ;P%+c +<*'a-4<@.ChR1s1j2'f0oRF/+Y8mZYRgZn"^XcWJ2*Y@D".n];R\-.#rmh;;jUH5" +p@RA3nbF+r!LCLis).ROVgZ:url5S#r81\\24(-=9/Uda@a(,0R=[Eq3\u\G6!=+- +-i#.,A'#8k!A^A59Q2oMT7Qe=,,""hVct8G#/Y;YqG#rn!9GgMg'&HuOgG4kd!d@H +-%Z!?6T`M'B_s8Q:\c2e5^^(g("g(hDdW:J'O^pU-BRA&q(mp.70L8[D/-VADP2r^ +8d9d/mu@QtrhZdDaq;EF_L,lB+oi7D>Z.[K^:/_+_S^a]?JC+B`nIri8gBWdFZLX0B;R%ld)>^!/pu&hhBb`8hZ!i +6HX>Ai7^n5ohGX7/:G!1].$G."TiETLf]6:*.o\jU1:?6T?TH0F7u$'D-F[7:([pP ++r\+,-(]rdrL5\p#p?GO>Kt)%b +k+.EVAg?`3Y\Q;`R\Dm_SE#"-Ut7KlEK.K!Y;cT6bPCGIrNX95&VG:es'L%=,Q>ai +7mJI+s3JXTF31./"n=poODn^'e?YCp99mdXD>MP6b6e"EHCrU[J#hD[Ciq\*SQ3Z/%;WM_!;YOH5O*_4s2in=?.Kl7M[.;] +s($'u%0A='59aK96i^Kn&-!;,,:NHb0!M0aBEbbpX$HNr'jP27GD"WY[!r\E"db@b +lcAD(m,"[\!;SF,!)r-=n+ei-^S^11mWG-b<,rb*19#gpk\%(WOr4Y +]q^gA;*!f0qOa)M=*d@#IqZT>[F2cq`=jZ?3VJcW/`(T3'0tZ_aM2YmGP1HTUL@oe +(7JfM]kFP//@i,2PFbQ_B(?-'s"_Fjm@'kO1"C@:n:*6163MBSMk(-.!+;WB=R$&k +)4:PS'M'&lLGgbOlS8O;s#Zq9-0Y`'`V5djbg$:2AV2H +HpPdX?`-gYWAs^GmV<;,_uaH=^fVd7RIX.+Zu6.Zr:BE-_5BbQl@4c!K`>+>41*!> +!:UJ#qn:>d_re^k^'6ODI4^8*X0<3DG`c59GJR!eDa8P;!pqd^U,rEKJ[_nT:ZB!Y +,duSYm,#a+DIV?%9bp.J&HV(2(#Cep;IHKg=_tSal7NGLJ^Ti`K7LrFlKsf+,\k\X +p?e0SA"hpbi2p4#3hLnqn"=7ikLAm+;W_rS.lSm@iHE!*Uq16',61O8,#a"VK^ac. +rOgkIMicBS@9ENd`V,_g'1]@pQOP$Nrh"4Sm5o`a[qkpq7fcfn%n2#;!_O\.qZ"f' +s'l>Mrn!_O+^74s5nJ8<05lVF/rOi;9.h5_J3aO8]]:l>eXe_W +[g[@LAn/PUSgn?mZcQ:JfS`/]H.;jFmX#`D5G94h;s/qs:]CBd=R8m9nKCH#T-cqq;"+_D@9)5#7M0LA\C.Q[H8\TeS0;Gbc9b`&[i"s.f@mFijY/J)Pmu^N6`9 +BD["G\6*VAQN9TAZaWJBT6!+HboR&j`b*uTBNQ2'7JOVp>,p^$nen2^c$1!gi74j4 +=grM<$a$_2Q8c1GQ:AsJ<;d>eK;NRd,<"um)$,hK05*KZXp`g*:a" +mU)pfoJuYFh!s0DoQSpd+$IYo%+tOlZN#Qc"#rK]&>7sOU-C4,kti>V`#To?^Z&Q" +2>8;n\e^#u5l7BW4klRUIT`qFjLB_e8+[>d@MH%G$!+^6_`/!aX]Z.rG4[?f#'Q"kM;nc.\ljPRX7m+iZSDi`TO +pUPT[".-Lds!dkqIXQkTkZo5prn[0_XoB@-2>2O5^0Icl<65+%@`\WMe&BA\H0Kem +s2jaUMLY33If^mD;b>kgb)6OmKE"6o4&6IHL\XYRWngjrh]F"k+LU)5YCg_'6d!0I +QMiN;F_m]KIiCH\*.aUCiH=3HAqA)*\.(6t_4/M0&`$sR`a4RiS[Yl[:Z?`\8UQuZ +H^c"*#iHD)e1B7dNc%^2';E8#rP5H,pc(Gp8:-0nNsOg[_fQr^3/Lfns4JU[C4Q$> +)GY2.hmcaeeM$"`2?6_e2JR47nCB0,^6WuCs1.K/s3#PV?U[N_N0OA:nH0tT`3B8Q +gP9XL3+)XTkIa1Y?eYa9r2'G^%fnM^J3j3jrI<#ipKOKoja@/M'Yq[PW8$u&)b'k> +MG7/9S]?rFAZ=fn/rTH@L*E;Se,sut;pd<)0N)%c +PM*lB1,9IQ^5*"Y8d:n6!`*:A-df`)8FR3@s%)3J,k@"@SE(bf5#,^^JOJX?,6'Kk +H]f**#H?-A/:X=Ts+L$ZHH=">s'5K2/f(;`4#\+OGJ2D7>XJY$c;uCtK`!nJf$4Hp +^X4o9,H,Hn2QXdqbDjqB2/b)/bj9iWJ60mj3edk3`E%,4rD3*9`8$A*[_pZsBF,U? +@iIE0`$f"r`S(j(dG\7Q'K!/6lf\$Da%5*s<:q/fm[:G'1jnlHF7<9*naF+WdC`5Z-!=h8qA/c9Cq&%!5@fbk6:E5*GjdB +W;>!rO;J@)]Ej4FZH'gD"n:RYaMRs0?.(a*31D/m46JlqN;Oc@9SVnDnA!jEaqi++er(erK:G/f1cS#h+(Q/5]"RNLBgTBmEX0p>kXuDiN +jSu4pr\'O2`KCh@JagFGL5Li@A8F:=SO2iWs0MW5^<)%P;Ym"15ks4:s-Ed&0uL_) +$a(oW&$EAClVd_qn-5T/s#dTba?Ouq"5CkVhSbK4-;O?Xi11NIUqe.kklBR0R02qM +lqhtamk^R_%R*V"7KhWUiI@#:X^Ni4X'sqB*$W[ZKr[5 +r)s$Is4m4.o)BkQpd=Thr0TMG5G_.enNZ)am3b7A+Tr%2+QQM==0_]WUT_Fgm!Tq( +_#MPFYj-^Wj0N'=(HDPOr'+<`@jCeN:ZpF/Ga@aXJ(?e^oB7\Gh1P\K7"G%DhnY%& +JhC].bM$PaVc0STM<*'o?kajr8,=eNh2kOc=)rCcD)O;;$BHQd,O*R5<9STWoIM&0 +'FT@$%C,gQU%hD/*[ai-Jn4S3!mE=Y&+bEqjeHYZ7BZVFhg!->k?GX<%I`;>YP-1- +ra0(5\#rcar">$?G(6?:^*Mc8rhnbjX)DB6crq._?YWSARcW(GEOh=CLnAI&5Xa:- +X'2G`<*?.99[/s$*Z=Z9hqUMEp&ci1-pWUh'`Y35QY:qHFG]sG&_T,SD6sDG24p`3 +eVPHba._N(?,s_OSG_4sL&f^,Z9RLqJ@OUl:j#o?a[>jaJ!Ri-!jkMu5H'"4rsLaQ +08Xg;@L0b$-:@hYjY&'nNHquVkL+"6]!QNBFZ,S.bf0gkZe;9e-=WSUgEqN\;#pXn +Ca7fc=74P(Y*0ZHdL6!AGQD&^,_*<#Q14gPcc?#,KE"*>b`hSnc^HRD,=o7\N(]6Z"^Hr'.gJn1poe-g6 +s5(_$^VAOhm;tBnmImFBs)l<\PsnRMPQ0miis]4Lao7>k-ADIIg&I.`_E.p!hHBQ% +g8iDDp!Wm%!)9cN6`Zk#h?9C25ZI`EIlF_EoCk],YEf-)r0[DcC*.hdY^s:Rdl6ea +OTJ#cHjMu.Sq;0Cdnf!OT>lp;muiICr!.HYmu$Ks9cnn0R6u_D">U8438!9MJ9DVL +B*84l,9ZFh'.>e7[[hLQ?.V[?>YFF2IU78"/ucalXQ4s1U&DI7%If4(P7[@M;:$hPD[L^PGEVO&?pnnOgT92:/qu.]&#g%@#l$jQOs8W&D +&]"AN=.Y,>ia;An*p0YrbQ4R2(WCmKBnZ)cr.b53!i5baD;mVdpmbA.;?T[k:F8(' +@/fr;/'tI=3Ybr&TIZl%$H`*KHo;Y/c@j3DOjS";74.RV)0qa.5)MioJGH2-+9*IK +HCRYBWSCF&i]dV<$i.^<+B/6+j\OC`l[PN(X`i@s(A<7T@_$incJ%aED"_eU!I]7( +hS!%W?ESB'Q[n^X]tN'7/N"J?_Z+BO6\%dKZ'[=VBTJeUElA1]2f$uFFg57XBI=Rl +s'$(N41pM-?M^9jNpsH""%rXnmudX:ao;r'r%Ed)<<$%6[#8H7/bFXh]*UiF +\Lr]i%OqDO/8D/o/IX3cFje:g*<'h8k33"/`uNo6`r^s;s:Y]U0V+3kT"s#dq=;h4]'4lACd(E7^H +H,#%1+'3eQ6N01rNsO_ETPl:-jdq&$eFS\QY6_s>"!%S"* +b[48lcY35@nt?#.gXgrIs7u$lTEr&4-a$Ks=3L)_qg>*j2er7rJ0F^rs"CVVBn(^/>="#Y0b2pAbiWQ4 +)ZT\p?NTpc+mOPrB)c!+s!t:"7.pR.r#Z3'q*X10r_M^9RCjtQ0P=%EHtBQb>:MR4 +Wi\/PJ#g&*hu=Ys9#Dar^Th-Ng[=n;o_e9UIrYBMs4?S;[G$N1J#R6ns5u37]CeDa +57s8ns2R8jdPF6&i0agt]NuahWIu%fU#fGpnm?0%2PpFFrfQU>kS>t9Ir(`-J&V>I +H.qd@2;lrZSK]2%.cHhgUB/.+/kp_ZEIT\O;'f*5QhAmn+'_62?J+;+RbQB5R1-T0bbFC^/&Q7;n;U=hY=Qt"5C<$ +6';1MBEuD((Yl_,f?F!eO*@&@NU2*C?=^%]k;dpm_DT(2o)C=^+No6-s%fV(V>aO^ +"DAVOglDI&\DYZD:j!nrrZ=OY3Y=(,Il>''rt:h$_IWp=`BSQqlDK9sIhaUHK+J3W +d00Jb,67`++b6S:Sb,-:^l\T>DBnrJl6Wd +R$]EO`cI!!>k1lAq/JIc;*+4uSTo`/8>VnunXn)ialK(k$]d*_&$r+Qkq\AM5Kd%k +b1BscC9PeQ;,Cp;`TC:%2$qFm)59PI4B(jLA$#A>J9'?/q/Z@A]mHT?rS[Ts$hSAg +HT*Jr"+*,.lEm(:4!D.QUi%FB#";tK0-\dA3F +N:GM'-j"ft<7H3*5'ld^s59%&oq/ofIgS48&jH2.ip7aikOZRD=P5DrZY"A2ECRFO +QHg72fsqB53e3Yci\j&PN0'8D(.K;MLq@-B(*<;n,mY&(,#Ah'$a_*K"nF=Yb]8UZ ++"JL3O0)G8/<1]GKTF+TLL^=9;;^=_cf%OT3r0[i$ClL^.=cu"cS=]L)Z^!&W8B`R +n;N'K'9U(0/2WQHd)j_(,V!YZ2QP0c%/IQH=Bm8>(+YXrQrth`Ze=2QGBZ-^]l&>7 +GCG'grpopHlK4>A^3),GIYk0+GmJB:hZs,J?E^]iD=;RMg[4-(X0L?VXk0Uh[E<6\ +Zs549PmZ)/DBYX[ACH9,8tSlDki.69>Wb+f%o11DdkT`Z_D;:WmQ"sQ036/=$jEi2 +lsHQsIqZA)=`$XZ440$gGR[G^+,Jp+lTDIs&Ub*@@u&Zm@rN/1q8;Ji)4tmKp,Vn) +D-'R"I*(P#4&DIYcG%L^!F@rc3PNWc+:&MZP-8o70CgJ$OL'A\8V+-sg)AsbK""<_ ++E/4T'[,>9id>J5`/->XSNGn6\.3kZ54da"1/73:Ur:NA(C[0 +aOn7'gV-=O$BBn=!7V8kC^9!qiTOTud)L3Ir@5$pl!IGnL(oRG6-j*B*LFK_2W#4u +cBRr#`Q=`opeT_JCO#JGY5pJ-7Srgt+TJI..!p(_cTIfs;KU5">k:Y:4c"W_Eu&F" +OlIa_RF<&$ru$_:&acZrR5R4ls*SjOr@`C*s(@KjAap<,B+%Kj7IX`gr$52aZIPl$ +s/"ETr%I>bNW>pT-^qBis0T7n,/D>5+T7A,s5M;kj]ak;^egI@kAQOlJS=%njqKA*%"]Z&/'#f3Yl'^*;g^a) +oY5ce;r'110s-q[@jYEk+-'[L:s5mq*^"qu? +_#Kt^C\BuWNX-1F@"2#Mg>\b%58X9NoA1Mf6iMVt?S/Ioci9u3/fC3U_Z,0)o"TB< +pjZ'/^KV6EB>)=E6iM!of"833IWPf;!dM.TaF>;c^Ib"N>kW4V08oWLs1c/NC]DQd +["%dLf(i=sV<.$ufcBX,ad7_1#JfMJ4/IHE,H+NCqZ%5t-G]e8mAn6`#hhHX%`s$:6S2=i>l+eF(`?k +otQ:_`W'-)s+^PB"PC,\r]bkAplFcUrVpSR8%Bik]W(aWH-$#6[upXHG3W64pqL:1 +iA2ROr2'F_IM5O%^dh@OHBu;m!d"tMh_e\[/,fe?Ir595NlTiQc*X=0UADVCf2WGk +Y+.f]9GLG=n:*VZP"j=QTHKeS#-uopl0QkmmTI!f/6@4f/V1t\4 ++8EUVd429LE`Vm`X__GGK1me45q0a+.]roMPXjY=9ZZFu="b>WA*EH6&J#_`+_pH!ZWp9#tGS+R6Ts(ZPa +;HPF1((2!Q5&JTB9pq5#/M=k27Wli">Tu.snBWDoFI=K"T60BAJ+c*Ws%C'0?M7M4 +YI'#`5rZC"rWfg[LWk5J;#/$,[ja)IkkPXWYN;=td-"U(J":Y/PBVM?pO&NQ1O/r. +i#8J;`dA4fFtI&9D-n"t%'i.,M*qnO$AatA$FfP26JZ"Afj[4ZNA,_'-dgPi]@buP +fH%l9.Tr6k4qUHO("AH#jS>!VfGe1!o'#io>gUAd(q!bs/O/Z#MD&HUA" +oOK+&Q;(c2Ja`TAONl]Klm@UA/C$@gI$n +]mP:>I!N8GENsh=^=MUfFupZ4J$ZkD+*7.*8&/%'eZ8pAJ8322.@\Kq;nZQg-[!D4 +Xqi_"K1i0@q5c1AIk.0sjJ6&>nPK7XrD2`DUROOF^DU.VGo,um5O/kJJGm6mpO;9h +r,4:mphS+I6/)#pD]^XbB5&lU.XsAV:]rI`bpD;rq=inL+ALq/i8L4.EZM,A&/5`74*W4E*kalCpeP3":.OfL(WTY!2&:rH +]ou=nA3;iBPl=GqZ712SD(*:$>lU.V;3Rb78!T*<*QEiCn+cq\"Pet:LB\^t'#*P7 +Igds@qraO%^".)1\^P8/\*NP`B!]'G_g&Dmb/HUC?d(-qpkSn@#u`Hobf3>EW%erD +UdOXd+VQQ*]`qL9#*SLe_ukCY4SggUaF'Nu^aChKLBB`(;gAu(\.Yq&[=*Mk$;W7j +rr`)sXB,3cn.?4!lTA/Og)l\HI4Ve0h>dA_gAH44hNn-?#Q:i_J:[_^+p+3NJ_/8[ +Vu8^V&*TF])?G)^"n_:deSgP_+:\IA+;!\%<'1j%<<&T8dN.G0WO-LdGr!rE=R&J9 +`rF%^7M#NcZa6L`F=B.GaH,HSi];SkOjAM&jSp4j=8i0XIK/mM!<1:S,%-"qo,m2o +T2KaEgsT+(LkFMuSOGa'Jc2dCr8m(eV;UW^p$u_Vnp9uoC0a6C3r?\Jgh8RrL&X)8 +jn4Y4s',;aHA89s.QL/4?nRd>TN3n7de\?I:@W)GETjI1]\g3To<3=b]FeOCqS2E' +D5j#AL?S$A8mZI#"nUs(EYXo8=:gfuG;^Z&!$: +lCEn0VV(q5k^4_SbGkJ2m0s@h`;jI0c.^e=-b.]EDNk)^H`5n#a^=ZNY562jnGi=+ +%K+PBgBU"Ci`GYeQbB/PmNLZKDstOB>5:*,l]?V0YYrXt=*%$"XL4R$/>atPUcG'O +jPo<,e-,S[_K6\GiA\UQZn:!C8>#,Ir1@sIF&#Z]ALb78'efBt&R5?m!6AMMp&k-2 +G.IB\s50\K\bX/1*NfA17f`JeA_mUF9C=j5JEhV4q\d'H=RlRi$(Lt8MXRIC+&DBS +eHdeYor0Ej3r);$ +%]S:m]I)`i$1k4g^[R\gs*Ges7moVc6fnVj^Sqr%5=dSuA8l*I@bIA3!3!0%[Hdp,/X<6lIt=^<=4=3f-V +o97/1Gd05s0>7SYJ"cX7^@7Zk?RS/#iZI;arVpsf!]'FM=\=7M>]UmhrrN%)C?d2K +=sisX3WrRH.:=k5fMqcuZ\lmIrkB3\E-8L1ID'WC[0cl*GIRF>c!GatK*\-4^=)pV +rGO9c/`j@=S418./euX]Js#sQSh9a#.S*e$&gF"7>Nr/G5Jfmu;n>CPi*'4r@c27jJ#N=*Oq17t[]a+:S:B9uPg#E=_k0&XZ,oB2apQp4#8? +/>Pt9N2;\AXQHXm_GZ$a07pgE$"Lm-YW!O3PG=M#e`$3f$>ALMh7!Fa5r_XTRE"'R6Kpn5lSY#k*"K9 +B58Uk5RW)=N#r+)dO?A*>Q<`S/,p^1DI5!aqqiFbr.E(# ++8FoP09SqO$hBY`+1_rF(B4M3Wpp$$jF74+q\IM+B#8'A]Ce;tdIe+mT:lpK +r!fd$&[XnPcjH82+X9gt$l\q75gBo)5pKoN6j-n&?slA6L^&uK7"B1k065WoQON!2 +ZPhq:qJ;msZ3hA:BjbXeWC("n,iMVchr.m106PT0eRQnW)Od +@k@)ARpYA!7FhDQq]_umQU/m$EnC=ll2Q>E7Cu^qs!#>m+Pn\4(>p>9,[\#`R+eMW +o&heJX$ZdcrrUXKOM?>EY?Y'Lhk,e>ScmHS$-6Ib<.Z7nNs3BjUS3mVnEG292ASHF +LqBPBs+H`ac[l,FiV@:hT8sou#p]F/&B`Pi@P)5HP@8&3fm)'P`pVBdqi./)eimUS ++SJ)(#iQ;6eN9&e-^q79NP04HVc2Dh=12;obsl]dO^A4`ghJ^Q>Y-T6;cZ^e/qS+k +TboX'+r7m%!V4P=^KEQ7_e"Ms(&tn)./p(Clc=D0;?PI$IuXD&SUXB(ci09[^0:QO +;k*f+^'+$,WpkQ:AVXp>r+u8&.g,"Y>"D#2q6;!&.DS5'1`VU@!^Km/6u,3Xi6/4- +AO$==Zi&MP?Y=4CI$5.Q:ZUK&d]l/.3'Q:]=^%5]4losQZqUYB]2>?pd#d':o5I_df:T-D'h!UtTr +CLHu4Hj0THGQ#O!d"D\Ob(%M4;Z=q&Tb/XOisD0:JcA_((=5oo-qI>81S>YZ/?_sqfDgYWp5S4T)HH#l]#UjcoLRLFM +;u%!q=*_gbB@=2S+p(5jg3C%i_3[A%)frt&%0=Dd0'6nqJKk0on!pTU/iQ)rC?,5< +PPpOc!6ZJ>hJV0+mTa,d>[D6Qs8/@(p-8;$g8.O=^R\_MA="c;$_0T<8K/6BKrhGE +f&pN6FJ>scQA,D=7="Zt](q]j:PZCar5 +E5-T;r0Q:n[KAMg-Y@jsZG"K7`X6lM'N>kJ'e]K>r9J!r'Ef?SCY/JtlMj9b%8$a/ +#)sbq@Y4<)9S&'\[ZN#1kU#SFAI*67RlZo;ao,q8GWj%F(It;>YU^3=-=9ML^q@-6&E"8)Sl,3FMt;]IOlpJ#T#HDSlFM25X=* +J@ZnCBH.V'ffjr=JW^)J;i-b=%Gn]e=.M^9%/d9Jl[E][>M03/"'W['Aml^qs39nF +,I:9D03=@g8qP8_`%7a`R;TnV(Eu-D7DH+cU\"!_*p%bX5,k#55C@EWc"dLDJ)=uk +YR^\Kjfe?lZBIqWJ2Re2s.OiFo)H9\kjq=df"Nh#?@Jl."X,#5s%>MV+UJ+k#iMQk +;>'i`ED+"r3Pi2DZYp0\?:r@e$GOg?^WP6:OPt8(4JhuGjgTL?T&@5NKD@E@s#sqj +;q*X:l27>0_?\kCd=.gc!3P!?q'AB]>l=Vl49dnNO9P[R5%!8uH.na.k$.a[C]:#[ +TXF?WT51>VV"r^>>jt,Xi02e'jKI@O(><0GRXYLpQh%lu0#IO7Y6g".J5M.'T:t^4 +p&ZQiruqCuSZl8i^S)B#&lB;Eq31hI&9%tI3$W1S\S>Lfi'mLWm%#YOBArl\HRe?M +jSGMIho[K,ZOh:gT>P;kO#\9#D9pZ(dB%2j@%UGVH-uO=Bd*Or"NVdZ +,@KGZolH,jmmI0%$aBXW;Z:6IKR;Z[a8Y6@r;c_%)ZfFmM!n'<:^"`2-]*KGa<#r&[tKS*#%kK8W3_6*]cEO/l)f>$;gp)/3l4(Y,2sg3^Z/BQj,Uj +27OQSE:A%S\c[_[fCpD/V5iu(>]buZ]-lN?jf3AQTqkN`O5GtI8ADgn.rBEeS+pb! +=ul/''E1cZeWSKu@^.-W*pn.9XmL0j1\#Ejds1o%l?K\;M5KkeBYF3^:ctXX2q>[(p#c!@ZB`F]aLc,EI +"T26lbGbM1J4tO_b:\g*mtu"nPk:HX'57+VI&$7TecE]NaWIbYV>n@B=[Ka"p6R?# +c^[?T\`Yad(hJ1tk(IqsEN=ka5I1s`"Y6b.as3^k7l;NeHIDcPOIo66(#aicc#Q>MO@$2,KBWj6SX0(e. +;F$0E4"ss2RnuIcN<[@:+P(MD6>7+)(4"A]Vj_ +l+g!84.Z,jQMgTJcd_Sk3!E:W/,Vp;b:-rB^[>6Xr"/r=pB$'L3QFPYoS'dnJBij< +"9d'M&il_^TbI-\1QF2;K3Z;i;n@T1?o8"=s3"#YLoPd^"efWJh=n[[FDB7FTC-FA +qS*1)+6s7`8d$-[nHIgA(b!]U>rY:#P2;[hOCLD-qFEI*N@@YfR0a[F!0Ka:6% +-P@7!\S![(\i_JbdM9Xq;Ubt%EH=!GWM^LN-p40almhQE5hD)Ue9tZV!>j9l-s_c8 +%PQR,N%05FhGUk"*`?+ipF^6.pl5%rYlB'hbta:4A_*@8[74o=O^+k5Q>?#eCXrn7=5 +s-rZ&IIjfC5?AdfCjmg_btP:gl;q3d"6U1Er+\dD5:hr6L]8Z8"G?dPs5=Y?HaScf +n1TED-#F3DD[#%W6hR"br&ubo@t)WNr1&!1S9I)O9E]28d"ifmnm;@:%Ycn>INMYh +cbf]?Fs']`mrI<:Z=mSr8X6]sZ3F>(?THtM?,$NPi=Gajq-!]EeL"Ue9jT<9_%go$ +=I'DgF2il5DB.o*!*AF%oE:a+b7+k26-YR+[DkXKa=Uk[Jp4$62tS4 +MZ5K_kCSaneJG4M/!-onUoRuJ;k)"\V@3(M6@H"5dlloE4R9-2HCLc6i;\_i%AiiL +]?To]]m5$Iq>0qss/*PXeV4#^]<+fls&Nj9?!%j@?\/7#0bZ%_Hpga^kbJg+s/F@] +dPmH]9c*_K-3&?UBPIZ$jT"/$P^b3.a8[+[S-&HHhsst8mL7\k^JnIXU15hAR#%:s +pE0CZFnc2&(Y&G^d+RcGjh6F__ +<3A9QYKbqq^Ql"fX4.s/[08Z)!>km.hlL2BDVi%Z)Yj>Is5rl;qZ!9arpM^&aT(Ap +AoSRbVnu?]s/7i6&OS1PbD,/c0`r$<_>gLMABHinnP/.o1R4US&^Uq=+9IdV4tZ.= +pn'ce%D"n/q1G!uIisc4UKN,)dp-qX;!3U0*kMs^j?ER6a7_S5!kA5lE'?uX?Y!Cd +FD9d'8\Opm)$TL@5fG5)Lr/QT'/SPP-u1"lqS.'^!:::V2%5nF=+oT)Ta3&3reGRj +_c`'_R*kc&,61Ne'UmT>bCkm&V>gS`+L=k]s*/-Ts,/s;o];aN'K-EuTTGjTG*MGVe6!s?X*?$ +lt;(60E'5_I&-R@rp5+`J"W4gAbi+Z%gdjAQ4BV9^3o`X,79YGn&\oU!Rh#B)2nhh +m\icP2;8HpE!e:&s8S=-%M3:;0^nVJI(pp+L]"?Wr)EVZ0`PGY_tcP=d3.BM./:_= +ARfb.+2ZXHc6r"Slqb?EQe9bfrX\jtDMAdZB(J`ckPdmmX*pWtH,NZ8OQLJ-kJ;fM +f@Ku%q+ZHLo691@+QQ>_+ML/u>OuZT#'[!:FA"h^c3PXF`]%MW6M4=io(^SW^$a^]ACcZJ2aER9#pX('f-i`:L +r#t/!CXi.\7=a]6YnoZ1h5cP;GRHdY^*N['&HMj;p)iokbF]Q%SleV*7L=EJb$Wg- +^^EFc?(g3II,RVY5PmZh0M9nKE?Q@t(Q[ +cZ<=hXQ'7tEikO-#OV:i/%,fb6iMIOD^2b#p^VMh?bp6;-aN;)JGHU<5I^U[GCEZn +D_n;D7@ljC9''E!K5AmqTTu5cR/TDfDJRV?h+0T&6emZ*I06_ +k?#qL$L^UJl#WK9?d%9Jn)CP0I$gOscY1QVRm1_]*eQM]i)BJ+reSpZD&> +c,C:js*S&:s%[E`r@dGc`W,T6[=IfknpeN[9*KJ&n3$Uj%ueL*UC#g.6pTTfi:g+HT_KrSR)r&?a!,$P>YEq\Pgp.1?7D:V8')LB!M^JFe8( +,5CLrei'#(cP>gO2$33i!bd>hEi#`$s4hDeOT.tok2MN&G[sVp5eX(".tXt,::Q2R3CCN*S5"*h@)mGd6-\9hB2\]?<# +n#&*jWV'S4'6KEW^%cn$]%W1G[)1"gn="BEQaj<6iEp2c5,."A@e`%sd.OTkOl4[c +RaW=bD',/FPH=0#S:.W_1[ib\++,[$s'93?UgHgaP5Kg4KiRQJI:SQ)2uN]i(=7L0 +s0E<#W1s@[nkg]`PXN=%=?5kL`A^K4$XeF4Jc@_3AEW-(rr8r_BZC02*)PsNML`oY +(-kXl$NFnK+$3k4qr"OET%<^EL3E@m;@+F=#QOCY*a7*hi@R0q6+KcojmHlUFfk]. +Lj6o=W;4[YT8EM"jZhi+R[9uMPR&,sIlCj)LP[2SF3WT:(`A?a]DbkTkEGhudCFF" +f88`r@D/0FLArcQ$iq^P\J6arna'hhSXbs?"O.kDs)u6*.dAtpK`@rb`C]hHh"O$( +Q9Rp+4qp*k49P-%`sbC%Gm++BQH'W7EV=mj4=_U@NsH;a+TFiU/f^@>`2=74R=*[a +D_Le0fAM,s!o.U!?gV*(mVq\loXD!7gVWt=rorp]2Z\d%& +/2.k4]o7;F-G?T\T$`.6VB2OSiS%`*r:#0l[T_EE<+NmRl[N(n.fA02OT1efCX]uP +nuSKn/A$mEf4;bsEPVQ4p:pXoO.inpdooSgU\)Yb,(M;%5GLjjjXbpAs$?1i>TG(/ +6&_Q:;etVcP6**O!Ta:OM5b`o>hI(<:b]-R!P`=HO*@ER,c1d13TB)0grV[R +Uqd:R)5FM_;"feQaOk+2G1pQ"GKp5//E%T98bD=!60!Cn2e(itWr.]2!<78K)hSD] +)35I[m_J3+`Rj%Jq"g<;:U'a?I"3#HTAS?%7!;5u+";`,Xn1VNoKOM%lYQe?s"j&X +Wk&4A9e#jc"O$g-Zum8>\Vfg,MqBYOT:]<_^WS^S@"mcLo7Lt7r.2<&cXjl`^T@?I +WTSd%5=`M-qd2^(#Vc[r,CbBo?qi)R0>](R,?0&8.[62(^^D=`05U+,_Z#nRlq79g +h7Y"F!N?"DhO+Z#eGja:c`m4RHS?l@6T\WXG]5[qGF9q3O7.@ik&NWka:%m#9$J?011*WBT>ED4&7XhM6 +[Xd<9@X/(j8hWHDoFW)E=*Tl\4@0DE70)#hdrahgWq_P3)hF3lO-@PLahgTK3"@^_ +8W\T&6"qC'036lduEr5Q> +kOs<'VLNR6h7r/jF8s#4gk>])s0jInc/NK5YgUUoeAPf\<1&rLV&1s'Hoek/gndZS +kL,sTP]o1VR>?)WUV78hB+$L +PU3*i*D'PG[I%69XAZT"[jG5rDIX+c4IaJQ7\V8+]SD".SGq4)r/8o"8!iQ98_`:4 +j.i,S<3-6\MS0!_,^H29dnIB5SE>ti-s.sk0(Hg(d])J+P@"F!&,@#;N1b-+i;.r% +$\W_1%`H]snZffUU]VG;n8LXQ$TK06n:u&*+F_LMl"$r-Rg3N:Nga-aoC=BZU0C^m +)QJ6b/RV$NJ83/)^CpW@c1l<0Z-lCM1>VT6;RC(5^nZjDb]gm'IYYH_mTgY(b<9fM +G^Z&/h?\">He6qVE0]*b/lGp3'$oY$H#1/1=]G_;IY8I*6`i]#pF=N5+hi)ELV)V. +[XS\V-P##\N]p#UJ!rFo/7SdpJ*QX"k6nT/:CuG#dIZmYmj_Z#QMX$$8F(?Tr+bkj +>3qSZK))Yes/@(8W=f-/iW#nArMAKKB@Hb(VXN,+i7CGSjPLBpMi)9?YdWKAC0s&# +cpib;U%k9l77tK,\kb1pQbadM.`$Vo*A86GPl/`Y7H3K^n#*g"i;Pb"r[I0MoDW"! +./4f4ZL`Rgn,X#>-PrBe,U[a]Cjs1:(TQ*D,:V=D,cL2Z[)q'FGpNt9p<^G0.^FL: +=hfr6J2a`-$,4%a^N:?"j876n,XP.s+11b*0H'RK@qtmlTc"uRM`!W.7W?'_S>c[h +6.J3=n<_Y!([_(-:cHO>V@h8Xp`.*@;Z$EWRH<=dl*^$1!.TJ36NI*k8UVt["6(8a +F[7n_RfmA+rr(&E5;VfD[KRrTcRkgaq4A6Jn0CF.q%oVdjSt'YJ]JP'Z_a(+E@t>@ +,6BWG>s("1NR"$t`pLK;:O"@RS587+`QCN\[G:#Lp3Z,grJf#"(2Ej7hTg7^n#H7' +nlP.,V>oGPd/7f4:]@P5r/]",kh#"27ef44RO('Pie"(b\9BLl*D-#qZbaaMA-W$O +,kT?WTq+"u_\UT)/O3YXT+P&9^g-Vl3hQ,+=m<4GY6*#\.`Y'+^gWr$1"AD_P'\P= +UpWJE_uF]urRkcZPKWKCQfGgo[L\P0V]"6iS:-:'K;iWJM[h$7-j@PFTP1[Ks)MQ2 +Dtoqa2$$+\IK+BYcg-/_qd3JQFKBsgp_YGZm7)i50Yj#&H:ILCo6b70qnMJSPb"8D +LfFE+!X&H]'`VCrIk[7[9rrH#CQLcPh=N$Oo4+5:C$GQh#psJ"c:YoUke9&.oKNV(S2p%KA'j1;?lh^Xf.jq1%&mbcf8> +ONtU*CN(@:8dqgT)J"MY2?N=DT-N9\]]U)R>Tc'ob'Ek8s.@^fpbg?Z,!= +B.r^hS,BSNUQn'E?LeEY5,n$0YT`ru:ME`SEs:0hNU-'PHXfG'om&62FrU?NL/hM#_*&+E))X(&unW;qqG#TDqjc&"$ndZ/@'p-p//jPUO18 +jBj2@A')T4.Sk!d:^Rp"155NlAi^nNGD.F2rXjp(`"S`$-?\g-Tkp^X(L-9lDF[)[ +GN5F,.C?j:g"FjN^L,m^eS+rk?!(t+Q?ff44^kJ4(91e!/NsIX$9hD>X\YM4,b/6l +m[AsD`eFH5P2=TnIlngC.RdrHr58Q:'GAsug+dXnA<`RbX+%X9U$ajs-)1j@j&]mu +\8T/W+c;#_cdJK9ckkJ9$2_o]abTB#oB>p]-bi"O6r*at4oIn!p+0u$V_4&J!q;4X +\fHM8l8P]_7!#!@b\k16I_"U)O>3HO?UfRor&N>$m;%j$=$/.+?ZVV"BBH)/gp!7d +FJ]11%0hEeX#$d5XB\rR_#G.9Z/SY6WiLC6?d)LDPQ*p3W;+-$nNX5$CrM3RI&3$/ +V7G=@3d'e#pEi9+*!#S/$4+ah\^>Aeft$8A5J;Ikr"&U1-HQ3'Yq8#Q0>,U/>IB0s +b5OU9Y4i$6KQ-p9?rM(XhS+s8YkFph=oP%h:Hm$n^<>4obLo,+3u#d9ShJ8n2S\8O +9&TS]!8?%ns/120k=1sFrbF;:;h/1B]1-I`@/aO!EC.fT1\j,nIl>'ms$JB5pU-1F +-i\)(L;+T."G&H4^ctHmp:geB,(TVFB*@;3Rr&'G;`9n&28=;^0;#rXmG1f-pO"g[ +h\(,B$etR0[Cl#CF>J8O6QFL^EMo#(!rm&p'Y*W3MsrJXAH%n8,V\`T/TmZqrYP-T +YQ$Tan2\ibJFpUPPq[1K7l'<.h"1PRNd/YFYrVSd%KXj0`0N!JoPumsbl/]kJ9&"( +W1KVN"FsBaUf`!jrD->lGQ"/TIjfQY`,a).GlH`JmU\L>'$lO=p:juB&Wk;a`7#Bn +(s;htB4/Xm*"PH7@jsS=T._cqX4AVP!:ARHngA(-& +13?D@r5V;7f;&1G6s&LAQc-=JAZ'^mdLHW$bH9-S@'L`Jkl@upb_!&IH"PN]S*.GN%ID)-%]duIgRokTS6:sK>0=_.==q4Cmim!f33 +KK")R:^Un%runc'#I$@u5N'ch2R*3kM4Q%n +e:U3eckO96qk'uC%55OFpJHB2n?9GQ^_$SHEs,%lIuXLI#cQ4gl33*gH2BfO:F03- +9B=&B>5<6??co!ZR=FNIo=sguJQpI#o&_Q3)E\)_H&94oU +Y!U=eo3kJdTtkGhbo#Rnn@af&IEai,r3*.+W:L+)+-uEoOT3.HoKW9&:)X.<,iu5# +"lTB@p4YRmCju1Hrf>>ss7_^m5a)8ml9ZUd>P3JEnNTGBjNgBs@gG=u^oIFp\OV7l +9JjpTNTE?]AR>a5J/e`k5qnSFN^o89!mu!pGgmNN&&kGVl1n<0O=OKaQ,Q4&V:D@I +kdFN=mBqCU'/feYHQ2)P(Ti[TqSmet]iSNqs4]R)Il"KkikHP2ikMMi5OUK#d9^PM +/8nIHgVuOr0c"tn-!]IZcT!,A&>E&q?BSF*-8],=m9X`#QL5pJ[oIjiAA'9<`M +R*\SZF^eAqZ3]1C"f+C>\BkMK.R&:;1Quj>L29Z@LOXFfrP#7 +2NkDmLo\-'ZkL0dr^U8Qo:Ps,X8U"cnanq@>5]lEA^+$,rjsBV%0eH[\^ZE+>>>i^ +q6b/K:_;9<'#(rgIR`n3]1bKb?_QU:f"EEE_iBIHl>=^diGs0?dL%Wd6V@D4ZpZ:M +cEuVI^%cnO4qf?)jL`"$i/hnE"e:T4/7[.7l0o*]?+\I%`[ +7/'[V+2IfuV^Y(6jF;r=%S*s"UUUHd>(ZKu6"s3aRI +q()IEf.fU[l"8Eu#s0Wj- +#a"s^oPt(j'VKTB]JWA&%H1^pJ!Z>h565dPQYc69/%9',?dA.5q$Ze4]^`/2q8&&; +ji4n>V#OTs7-J(Zo/84e^Dm=16rp/^g&M#DPrh4$J=4]"p)0_#q$$=jnB\H@H.E^b +rsf!dNEUDY[qCITj$o=CBID&tPHo;Z$[Cn_']^kHA`d(#3g@&09+?IQ6NH\,A>UE> +VZ)'SPp;ro>[d[,dS"%6UFn+qNe8`[pT3TJ]bT#K!HBDK#B8dZ!S4u9Ul/:^4qe/CA( +.L?&5gh)rU235<9[EoIM1kHVHMhje0+]_!#i8=3p6j]_oo\YqT^WPMB9-L#LPfO,<3!*4]F?5rSRRN6e#Q9/Pem6O" +mm-k+s/fp.+O':\\TTQ?rI=2VpjXE9+acjGY^A)*<[>Q^f#uu\5If&J=Ff!&<:bJ/ +Fj]nkq,_ucm!j9j&,Ui9!Wpj+N?@_@S*L$)s#C/5s*/Q(M#(&mh_5mUQ?M!3bSV74>s0uFccuems,Rp&,OGG>EA.QX.6`mn-gbOf +0p1gt8-T[q1n&h6c+J`*UR>0`WX$Z$BVmbOY=ob41V*&jhNQW\6jDeG8S7+k=^sX6 +B)gJ`.u8^VF1'h+#2RikF4jZNs">=\OFP$VVY,E`.,0Y"Ql,ncsHL+`fQ6 +G0HdYBBZMQKCP0c[34S(1U1Koj8tO1kSQfT4#>X8cF.b7mJM>nVsi[UTNa,DMO'1[ +_I[En:[qo-.,o[FZESG9>JA=a>bm\3'.`j=N"eM['Rd;*f3%,+M>-Lh>d+1oZ2[$p +qu6s^rYW$@/TU\I@2m0=KGmYFf;U&Ds3W53dDmoa.YiiHD2H.=Cs5S&F`3I-2ib +/T*T+@fJ7R^ZY[T\`-keaT"tV%t$uN@NE*+q=?`uVnC^g$k@GZjA47=OT3oi2uN\] +,P57dr&ni1)&N:5r7m*[?W9$a"LJjBCrQDXR`U%'QiDQ! +p4N2(bq4"&Q-! +r'+QgpPOa^U*5jWlNI6sJXWG;Xh[>t#oF%.N!8P+:EBuqL4cdJ8=C!EZ]$TU+qi99 +!e^Pq&1mg:]*K6*!Bp_f#JqQ*m5#i/(jQ#+c$nT*#PJfAqZ-Ga!K$nB>7q4.KVE$# +s$TnN*0S;t@X*o$`SlW/%Ds^k?]P'1>nkqQ8N109NC2sMiCq]k[Wutn"^\*]3q0Rr +gN^;P1tb!O3rb\),>CO!6RGp%p=6"P[4)'!f-MDEIKc/*(bs,WH?iU?".2A/R:[3Zc=Z_hM#GtFBK\9nR +>bZ3rhD?$cSn1b)QjJ>LRRTD^)2B2t!'u$qC[`R\l8N>B5D&q&L7^Hu^N/RfldJ") +d7,hT"iWp%=rIGb,/ginjeq$]00.$Vk^P_Os2Y&0^3;FC#m'e^:]/PTahMT?TZBuY +s7;"?28oOUJa`W?8O41Kj)U6X.W&4*9*7frGp(Gs,dj`a2ro%d2ujQp-9NlDhU]g( +'l4!m!d][W61P`\%P^3HOSF0`T=+#tmGS$C@F%-'5K4'N%sq&@Eg<%)*ru<'63-^DdPAqO8_T6dDa2M#62mep +BZ0o-pcl67lamPp^V@Sa1u"p$!/L]4OWXYX-P,:+7KN.1epj+H63':KcbXB+3fMh? +))8c3!<1"^^^09]qV@6N2kU?M"$;(MD*Q+VJ'4r>gUlN#(Hp*`p$gj5q[)lFeld&M +-L^tKb8k2rc-nSD&V3)@bs,WT*4Id:s%he6a3JT+q+j*;.$MppJ=Q#gr,7qb&q0t] +ICg1(i?tt`363o\n9gZPJ%kq]/lC=Sc?LV5q:m>:HCt6+0*,_l(^\t(!@7'q(Os7# +,9AS%5Oq&:*-ka9I*I=aJ)e&RIPalVs5Y[!s)8PH+,>@idP+@5Jo=q&n'ML0^>e[ +EE=N)ieXk`Vg7K&rmj((%jj/eJ:G#nJ)SoWg9(5XNBfWYrcGRN/bnq2T?JAa"NgZTAFaq=Sko7R&cej.MRuh$mf+mX!e:l( +/U=#gcU$SX2;L,4-)6F0/o.H4*P^]rg +0Dg)'c?1aaOT.o(G:j6`+U\<%s%\aTKD_)78obRhG8VU*VL>&*;$/u?M[t)Q4eK?# +lX%SSOEDQR\KTp%c6)SIN;?=>I:3'7@FrVWqg??RFOYYg+oV_/A!#agRE,Z&/$0YtRLB@CGFi\:B +T=.>\'j]8^+jS?n'[\=j_Bg=6IXjOWrssb:_=6B.E,s8"P^E4U'knP>=0siT1I'Lk +:\'"*r"Fnd-b[b1<"":(5f6!oSh'nU#T+&.62j,!>+(>6-,QK("N2Jp,=(l%)uZ"X +HkHj;lt8NSKlH/rq>bI=J*V]Ai(*4n-gomp:[g)l!*BDTr54B6=@SAn&ncr1kojar +/Vtd,n[LCkP=1Q2OoM38l?KZOQ2pECN7Fa4Ps.m,DbZ-UeX;u=\-S=>V!KDj- +W'3'Ir"%iGs"nNjfr"eK_sg2 +P!5N8nu%,5q3aIg+2a@]pa4sMl!<1m%g55j?S0.RaGj^4TP'9;9M&.?+7TckQE;ZHtu!#XiM$E3m/?9._/(%FMi"\9@6[%GBsr(iaSZiX1?('=8\ +')YNl!*X&8O+e:CN-p;@?ps6u"T\Nl+b4tR$U5s]+<85sB0YrC++aI*_%42pO'I5H +*J**-K-.ZkaT&EYV[roWm,MK\30pX:UlkSkr'2_V9dE-3(a+Z(AWa2BbQ>'U>D5C/ +U]sA_&5\RJf0U/oJKUFsigIO^!;YOH5IoJs@TS5"EdXW\(&4EOErK\Vjid^b!e^:A +>!>^gb\a[Xcmf2#ILe47S:7Q;YmDh%`1LHKRb4e*C'h0N`[5i +\Ia;>ZUmXpDu(Z(7Q(*Kk8l):O=3ATH(nFoG=T8qg\DE>;m?(+iR"ptmp-7lXTk%Y +rYsMf=T2JJs6[=Q5lJHU)F!PMr9n9g=T0AY0c5A`6f\cJ%\o>=O?>Mu&lnqY>2\Y4 +)qFY;D!/]ZGWfKlo=)fiqXZtJSYQGl[I>Mr4g/7\`?!(h!VKjZD#b^%>:u+*01X8sZZ\hU\$=Nm8K)\bcH&@:e:n3%^ +!"K%gn,o!T1rt%a#SI)d"F'tiir&g$id\be49G=Kiaj84<*#5(P%:lH<(`)i"?Kd]ciNAh7l)Su?!q4fHO,7WmV4n4$M=%f^i +M`RlRrt1/5Aupk.'Ti6Fru$e1jA-pB!"H<_8@Tg$H7=4sr0E#H.VVnYCoDt7m8@KM +MMqe2"e]k$FQ]A%(]"rK+[*E#J_CE[c%NQLgf$p*?'cue//rbfSYohic2KK+6q-ad/P!2(@ +PrmjGQTm`J!KkSJS%ns:s+g(=T8%l$g91Ksr^YmjWqioMG*!3u(&W_,oo"FteImBR +-)O2Y_#LVG5YD)U/I;HQQA.+E.ajJX/I_a0p(j;8:+5@GpJ-K?+CnrHTA*qB1nlGgr\P9g0@_cY)bho-/j +1^##9)@]r3GYs/ZCBa`*'KF4eYl@"hhNO1rEh)cmVB*HT`^q4*q%4)6[/fn"r=Ep& +ikHHBr*B>$q=?+',RVoc?rC[4rhiTnN=X#-ccP&Qm"S4rXDs`WD2#>>J&8'q@*R4p +=EX?,2gH3UD;]fYS>hoXn7_sqkN%^%T83#&2SYBh5"4A0+Fg[8Ka/4ln=a,o1T+A> +@Srfi>j+J>#>K6&KE#q0V`a-l#uCQ[gu*SeIh"\MrfH:fgY44ZCAsTq&to5ZC_J+b +\L:8c#l)RDmX:Tgk9S1A+R>m0$WV&[%Q. +b>Ad4/'`kQ)7D<Ye)B:akMAROoNgB +hZ3Ga2\uYgP37T#qBh=h!:m&e#OPHos3]*UT`)P!EtJ?nAfXB/cJr?bd0KftIgg&k +0WtmGs7ssTci$iDc2Vjo;K4HgXKdW)T9o@4N#V'&%<[>os6DrLr3@S;5td=W),WQ^ +hSdbPO>Y4e7e)R3!XtQp6Pb\j.uFBbo;DTNkP8*VpHu`Es&8_,s!M&<<,HeM#UBNa +80FS1J,g\.0+IenL:l%ZIr\FEj5L!d7/it<]`1PNd_*=(&SOZ;>A&L`o*b^E!9@KO +c.5UECF1:VP7[tOJ;LKE*=-6OTX+H.'; +1*@?!`0mV.>Fc2S!I1ZS@5u[@^]Trg*NDg;dIi)?Ine?i'6dH=b!5YcCmIT`i-to% +r^1E,@Sd73qB\EB,1J9"5QDB>U'BMt@p0%N`??K&N@4qfe#]j^<=WPUMBPL_L]\[g +)KRd/$BMf5e.&VN>R*s4l9P>Yp,\_L2W77sl^4dl(pPuLhnj\j:]83in6<6qB,8D" +fI['^ZMiQks%U<(0rod:eI(:S#mp]8rkR?`rA&,:,(JC!?NX.)k@ZY[M#<$M5:1l_ +dXm?.k1W[**=W$keXXsY3<.0P;3Mtui;]g/m=8W8p(P7ABRGJ&$M$t&81AYj*!u^m +hXh*g!mm9%/%6&k\GhJXs(Clt*A7B4QZ;Wq^[18knTV)>\lXL>,Qn+*JR7Ve$8)$L +8FjO@oRm'Urf;t%3o^11KFuj2ReBWk5)3j$#dAsT#q*9)^8T.<_d6n`=6\473qFnj +I?r)>9-p`=Oc-Rg(NtnaZ2\+JV.=e81u$o-I`bEYcR8p,\DIcH#^"?.qk&NAr0jej +j[)5j^&H>jqu#k)?Df4-:$+K3F/o:3rc&[oH'iObp`J,qklL;R7R.@P-iRIqoO7?8 +/_N2\41ki8INnes[3't-cS;<#72Y>%]Pgt[.\b!&jnZ#,UD+goJ8=)`4oA^_XBC]@ +M:4p+!"\QBKnKGH]U-](QiDsNjA4ni'L[M:918\R63&l-+l]GZ3X%dm-&t#T#q*1n ++P[J17/d`BZCWOFST$+-Y\Lu#Y9>h=Pj:UZ/-OZCK,q`/&8D=0R$K`:69rEsaIfT( +M:>9h+Ts2IZB9rR3%Q,.#_sUUCq)56.7YO(;A<[a5mRJj#D8ZD".t2F4l27TSe(5f +hh(ma$n)'g\hoNu"90`HV=?rV4Bksh^8C*5&nps-6W@Z!D,6r +L$/M)K@3jm!?iT2e0N]#CoEAEErKH`3`&17qPoaN.P-&Qg@hp'E9/2;+-M-=s59P0 +0H^Gmqc.)JTG0a!@/?_dJ1QXG!1KF:L*u;,#f&65a@l]k[9,lP'M!5N5Y8^7l;Vai +Wa@uNa+KI_`ItpM_VP?eH'7m00jAGEfFZS+"57cP'M/1DPO>%oVLNX=Id2.Tg2HeK +2*?n4bMsKQom]Xc0CV3@Ur+!1>lsN':Hj?!iIf#NPs8g2KY7>e%:lCdN<4h5kC0(7 +'H.%'0m!$d9`aPZ439]H^L%UTM#hilU.l)7"t:Q^J^,JZCWQWggep(kUB']=^`@jJ +1\MT1SEIWd!Ur=pIkBEb/pfJ:Mj1mcO7k[g*Ma[CcQFR?^?SFj6iQP:aIZ\$a+N_Z`1hb;m*k@,slKr4U +^j;TZ;Wi,<:YH04+n@"3!,XQ'&Msi&]_'kFHUGUGlU!i(IhDhNm/lAI&+ZXt8!uTf +ru9gG27I>>H,os_3^8`k5R[RE0mt'R(5?nWr#KRMXr9s6,K)P^(aPRa/a;9+ejc;qI`tH@r=@nl3Acp#2 +Y:Sb:#e1"d]>3a3n9K\9O"fK,5mX._#ON3)it*?R+eU/'apT:^q5XhCs.66D>Cl44 +[ECl80oJ0Gp*lp=kN"iM,4a(W?R9@^(#a_DfO-S9]d0uUUe[%1E;o%0WH5qpf=n"q +^[U?h__uOT9EV-@rpHQFl:]-j(Q%+tp;u+lR5fQFV,lh!PJhNUb7-".d/HK[I +;c\-[-<&UTS,\-:_>fVpKDa=g]k^:pp&B&'$.'7!GgJ* +P?bO_B'c-:/>l(g=TU:?GDQ(jjPS&glK=H5q"P\_!]1\^Va0>@s*$fFof,>;:QGea +A8F\#'aVnVhbO)Fj:?e7aV"Rp5lR_WKDeU25K*T/_h\)\epJh;on3ooc)@d'8'Qk( +LA:fJ`"M]:BTT(`;A'/]H8-RQOq(XU.B=_2a[9ophu=R9H^C7-i5-f?I/gg4I/fBA +0T>s;+TIh2K$(jDs7cl"0PhO*&.!fR>mM]]&r6Uf*>&^@[85Y1k`BmWo=u_5alVu# +H6"7q"9;)gp1:+2L$aOp@#aDU@H!ccA[Z`DBj"g^kLfXa0L,\*/M.)+@q!b%6igBn +KZh_K5c?XT/7O6mRD>SZn$149d-Gu8$[`Lr4q:()-5%WHA9g45N_U-R.\]U>,Z)K) +o9T^;V*8OKf22tOS`KlR7F5L@I5^1q>6Ki#3$&"/fTT!-LJgRK8CUgEQ +F!m7BGj!dcBt=o01=r:WCi="ggES8/nDT%s&K!Gc?lI'Z%D]KN3AXd^$rj_@5;B0f +WRLgPdIL(Va3Ql.?hu@hAdfc:ohQd#8sK6hC(n1ugk6aQa:eQ3@^4Mnl0=#1%2g0_ +L\iH18WtQ:&otUt>]g=[qVZ8;C<64es!Xk$26s314P(p"2]OXe:tUB`Ao8a+M`^ +F=sr:DhgOdeT-XlPL_)Uf7R-qqkpQ=ZhCs68'RQ([VR$f[.Q%TEREFq54@j*oG8JG?e;_Z\a@kK"o9Cm=bnpe0RZS&AGa&U_7oT(&jjJkgH-MF>)`0WK_s=< +eHVf&AG\;1WjQNt;QP((1:S?*A$ijF4a.cie:Okr7(9"f=HG<)B2#odrDlgCQnfX, +$kNU9duOBcF#WDI(d`QMOGZ7s\t?sZ\"V;-qq/<"p1a9L7HaM9bM$OnqGl_4Zi7?K +QGmM9b\>RLR"jL94&#L3'#Bd!j#!Gi9(a:&p$h*8b'KSb'QB9jhgZ;'o/(f9T2WEW@h;L.D's1b&5q_(((&mi4o^8/ +,$#l";W(:!O`$M9j:gT0GH2""LD7C8'.7Y6PZ=*C/=QG[aV[ot'1$L^6KCoBq#fqk +Gc,s9gpY/0/qoc2,)u1kTRJeVQ35TE"V(RSs5O\Gom`D^9en$Bd$&G,EQJ/6k^r0j,QreUQ&J5KHA)LeIi8At +4t.'9bMYDK;oCh>MulpPr#`?t_RSsYRUiKc$N:;%'8ZZ[c4B^I6kg78csEqG9)YC/ +kP\2>IullbcMo:m-AK$euXeint,"gA2&BW?.0P,+[FbPj@ZWqi=1\MatG!bq0Zms-\J/)HKN2erjZ;-$ +Cp718:MN't1#l"CYoC"L4&PT5GH6W2hrgTg"l>=+pQL?FZuJ( +7.;NA^C=^L22T#,jAF\,;=j-Oe'^h*r+Y3.H1TI0a3oZfk/KQ1&S@*`pbqi!k:#IY +K+sL,s$7?%P'/=&5)4,V_)ind5R?<:&`=4>k6?52/;P;,(ih;H!X]_Fr%UJ@ocJW9 +&E!L5"DkCk#Q_mDCVbAgGP'-?]#"D;rg#Gds%--6Ps=q+amq;mo:N"PiO^S30aMYD0Xh,6*XApI:ql=H0Zi +/()qE(soo,CWM3[.UY"U"-EQ#U1(\H5l;^6MNRpeO2:jHhtJP?I#@hD/rE,VUQNtA +>8@O1TULqN39W!gfq3M+:Y`B&\$aju/+MR+H2Wc/J?td@T)qXceftCoJUk[jW)jW) +aC9$ie0U*cA/GIMnn5$Z#0WVn8f>=$eOkI_*4Ycrb!+JR^0Y53"=OEb!lu")gj<.b +s6".roq[e,30X1\K`Jd'Mi'W_(.?IJW5+GZmE#2FZE-e@eQ)B%-'#eH-M;:#"ISgG +Z!2_C[f4clr`R&3YH7`P\?7ZbPFuZO7L\k+oc-eSD,sRGYK6WT@4MFFYUB\'e;\.1 +L'O497L*hP%rV0G-,k?h^k[XET)TbtK,[4hhni+e\MkH!rWFBZIK7*d@B^PH,[RD>kRpn/<:!jKlddRo:;Z;H5U*Bh2L-+r/&$PW:O +T!5Rqg"L&/SWg5A$"qeqZ[12.2s5(KG;h.!RMNT]X2/se-.'(9m+MfI5j?IcSlM*" +q107`DXS*MJ2LB@)X3$I+'=R4Cbj`#TQrcc=Cq*ah6rO0SWm\ED$IE]U]b5E>sMEt +\g0FM#6/VR:f$l&5[s3k!j<9hNpVuG"tJ=QX2#bYD;>a$O!cV%(, +;Y_]2iWPQse-:Z2`+.s<6NHjs&J0coBfH*kp48$&5_rWt5f-c_69q7EjnJ]aBg9Z\ +[(jn0!V!<2m/kk5*PcEk%9SY"/1"I8j,FTRk$g3Sd;"+9!<8f?!:C+e11cSU1$^KE +&ASm((^`H=6:F.!LoUCs?W"o9,iEtMo(Q7Egm5uub7g5=`,.+!g<6JqK=N9.JQiE8 +o036SO1;#grmHUd+:gPEXA'bA84-MY+bM&9P;4%J5`MH-pF/P\s7m4fo09:AP,iMX +s-&1PcN![2GBE3g\`"i9r'?D`+gM'hm=@:tUZfMZZpDt1i.!Qr_,(lu9,MN"Hgn:_ +hufbNQNlhQXJVUOXM=7,J)rP:&CN^tlH6sCTYZRjSqVP/^<&8.XIag3US45HridBn +2":H.XKMf+s+cPUFRs\bI2R17$H2['q',?7p@Z'#!d4DP5SG_uI?fg']e_)Uh\Rt' +=9E('gYK@'lX(/N;8Jl=KB4\4c`].)9h)h6 +-oW!-iNKPeXe9l5m]XR_*E?J(;,S +e$sO*Z[>`aGZm%P>Wm()$\;^MTPNnTf/6D#F8ir/j@3dF'B$nYV%Z`+VfW!Y +4oZm(U(jX!M!t1I6?o^6q&oaS?*MK]o=9X0aIi;nCoI\Carpm!BG>u0r4X:aW?hHJ +i.3ae!b(/;Nj))?M4"MR1\bK3Q:Ueq`T_=,%e\dJk']D6nR3r +\E!To]#BG2'14[*d@N!PZ[gB*+o0=!K5u-#!bjkSs$.G5*N2B<^e"H^A7'J$:_6P5 +'5C)C8%fLOor,$*9OBqsY*lTFNgm%W3InShRjLggPNJ_k;qn[YCW=jgCK<*W1i$^Z +QH?@J2K)_m>9;f/X'UX)/OZ%/_];t?JZY#WQW7lW8r*WnJ(3,skVkjG7_JikK_r6q +qRrQ^ckST!-SGlQ8$;'<4+-)u*=%5;XRA.66t_r$VZ!<>5@`JA)g7CUXb72D!XKl7 +^d0)^bV1CVjtOZD7UqeDbbZh:TcI:"#'L1?Vio.@`QE>RqF/rgZ!n;3^j4bg8_)1k&J<07JHX/j5)<<`g(K'N:@lU1jcM,]pN\%@Qb-(%p@(^6r-,L!"\^i*sM'b +$98&--4scmq'bJMbsblq&T0EOo#J5#+a=Yg$_biNn84GHj,Ej`m5dd!#l=r*?JMt& +[1Kbkk,kk%P;R6`BFB@e+7fI3hZ$u4?rZ"`E&E-.s(f/\l1jFHLff!$qU&J(@j7Y;?BT-t"Z?9P#AW.IfW4 +&[GFLH8VJ.1h8EP&O(!3jSM/Z!r7bYs$bjqptF()K`g-aT=]i@[fgZ-\=>e3K?PG% +foGc8]!p]_g[TXs=A?49(6a^cM$AD7!<8*J7+n+1j2$n_^DQm06@]:UJc_O!IeQ4% +l[dshaQIg3[6O4a62Q^JAtTE\rU2M,]$4eM99J-.,[`,43Q`4P"m`06jCdks$i^/rZh5DVNrS(F +s28FGV9ecgCO-UP$&7"'i."_t"Sli0,ENH%jeKC:S-pM9UQ&[BGm1!)OO*ES59pU* +VENED'Q_:(oY-oE!no3f1%`0kE(BmgXp:5\T/`IMq@KB)#nYL?_h/RE3[fgnLr908 +<`L#<<^p&?Qr4VsMW60(#m$!r4KO8K+AE#H([2nkMFq/cJ +FtN"V-uprp?j'oF$; +k3]C!-Xt_>c24U,JCX%AFV"U&"X/E5Irdi75_UX.BM-0J+:=Y#ABs"'9OgB^%fAL4 +cos2a@EM0K:Ws?B'b`JiiP,>YI44n]`?1]LVlaf7Q@/XDbg6V,q,@<7]a[+(dn?b+ +F:k,E\IakP^Yf%kp:luuIJRC/s#*^ibFcNP5gR)Wcaddd*ftlo/gC:Uf`]]ms)V-P +(fNlE=<9;`Jc(.taq/7D,)"QuYp*k3pWFF!)Gidd@qlFhW)3[os/2r-P5HR)gL]%; +A6MFYrrA2]:94s+oB.1+GN6BpIpb([\WI$Kf2="(/16pQ&rgE:5cR*0&_%)NAL]L0 +MH$N:&Lr\B8tm^:']V7#6bi5Dcg`GBrr\@tg\S]sIcrU#*Y\?2NDK!<^Qe2:+RBm5 +6NDrE`;co3Luf00(PSqW,_(^Xj<$'I"%<,lM-g_S(XfV8O85Dq8G7OIr_KtQa\Wm: +P^q@2?\^:aa7UNLrls*nc'ZLJCD1E[UhuE.4*AKkKJ(0JU5>6+LW9Y=OhpV8i'Ztk +YO1%n[d3rHS,".2p4)eiJ*sZB3ahbC@Xg`4fYX,OW1lJMA][-U?NS!]E!Jo($q$Z90%ftbX!&0#9M=P;=a`0-)I.:M6P9CH%6n:Xq$cujBO_8["%LK3IfaGF4)dlfTP'-9!$SK(>G@[3nq(Z +KVM^`HT#$&IC'>h#<*MPb5"oZB5g"c[XGV0K6ooEM;.dS)Sad]?DqJ=Q-1fb[be!T +^)MIrV=*uXn_gfho>WK]e1c&\cC?pnBC=9K2gsa^*d^e_^7c3Yp;!*1[S0qp-I4P* +B74if4_l]sG@#L^]l)_Te["mKcd!U:%c2AI_"5b#oum3^PH(JFqSeB(Q)jb`l_^5r +L(3'0fASgIff-X/(VuN':hYbAK.sdMr+K^A^^c#"bUtFUU0>]'X:]LBhqrcQ7\Yje&kQi6**P'dR%k;l:UjX/ +&HWi6ke@)=48f#Kp`D=c9M:sCmj-![BW25hNdAOF->c'LjA5]7;uI%IquX\6IT(sH +=H9b,6@lo_o%-s;S#Qn\Z4]K+0*)"ci^PZt5A:^>s%>n0.eWi?&?m&?#4:m!PlR2$ +2i8aW#Bg_C^il`)1XuXP!*DuS0.!&&@c78I=9;0O't=iT1;X;>"JcnL!g:BWR(k33 +/I?c]M>sjV&O,MJO82_`l%.Uact.I[1->Wn`[?;W<:$rUqTVG0bEJ$i"T,rmFd3X3 +7m'*>lP9!661=Jr:B"_;;<$&]r#.:V/V`6qj/*1Yr^9CYUE#h^`VC%IMH%Dq?j)gKaL-t;$8h\^ ++oWQJ`qhbb9<:7 +%Z6t_jcP,RE;u,Xnd3cHb4Z.o?89nV"[X[Nh@V/G1o7EA8G(*SI4_4BrDR!fKb!!T +7r54N^"o"-C!@WAO'F.^YEUipaK@>>XlEKBo?UT@T!b`W[&dRl/j6>/5HUJ;W#f9/ +Z?%eAEgpplm+V29\,:!&5ORh$#QKEO[rCKE(@GOhoKii9$0mT-mRpLD<^$DoHh"[a +om,`?/*618X_2!a?2h#,k',PFYI(4"WOH2Iet22oYB=oQqO+88.H&4QG\^TqeB]59 +`c'CccW!Or?-CjE/'f0D?8h2!epR7iAcMA1SJP!N03XZ[RMX:cB+LgPLXN0&L:)s) +Q-8IcbIYsaL@&VJgTW;TgO8VtrNkt+\"EJ>cMYRaIQ%ORP8W"^Pe/(bQljm.!'^VU +@f\\*aG2hh*FUn,#B1A2!?cl0/J,D=&-1%'i,Gdi_Ebo+m=Rqh$.SbN:&atZa#Uns +aF?@;X8E)Wi.&iJ(HonE="ih9Urbjks+I@k*;^gC)eZ[PanJ$1LROSp7tLU0r_M_X +)?N>,#Q?)c-.AGWZAmp`7;aLD-[C.A7/dKC1-Z=9AXn.V:WW@H,,?md)Ti&P^'m=n +^aS[k.Keb/6Cfg/'`a1n_!6S]]dR>$"3CKh$&!h.Y!\J%SOEH%c74A5J!0CJs'tZh +`R)LtUjG&S"9.1No^4&Q_>f1jFSBOUAL2mo^gaqWHrKUe*UN^l@Mrm5S1"TJ.!*dGouqM9e)\+-`Df[r6bD]0R.)XhO4lqpK$)X"_\9<-WlIq2gK)H*Qpr=+ki +@74<82[N<=Z<;_`k2RDm:f^p*bCLg7%anA9Xat6""l-mHrf`rg)?jfGcXm"7]J+47 +jmEUGcE@IN\lsW;!.'6I!.Q$[)rG:W%`l][OY.6-m$GYUU0(c6XKOa`We`,t=_/KG ++-lo.9#rL@It<^Y?_A#4M9agsB?RY[]/JU)k`2i*VUhc&2WUY!U7i%Td#N5?UjDmM +DZ6_`p..)i+ITs.c@4c(J(&c@ +^&%REe`k\I,OX!aX+YIV#!rk&ljj3L +]`2CH!:k@!5NRTL,+k^A_#LL2N._1m5MuM:5_,&J"A8ZI3;FAPr1EgMTTpZ"%ur\'@_cMnM"XXm6u/!ERK7"In40[s#=kU@&9QEdI\:g[q8V_$UJ@bN-% +k3>KA9=CaBZ;%[ZkLpl2m<>HelI&o-i@XT@B)0gMPLS@.(`V">qPb$Qaiob(e-%PfD7'\4t@oVRuDZa +_0u=QhR-GrjT!u9l.@)hG)X8Cii6_W;SIN%>eH4Oh:AdDBNfi;[.8A.rqG]a[p;)a +HM>-NT7#5'rMFf-GFJ+Vg5XDtG@*7E^M_bZ%mP!hHJPfS +>J9O-C@PlkqMY3PX6TAUMUaN9npu&b83.:\8!T^8NU+1KS&VQHXTu%6&)X`7I,/l7 +qn^J5)d`L"qtXlUdj&dCh5=NdFT<@Hj]VYh*`N0EU>a.EK"+)DcOU-]hHGGf!YkEk +*,6Vea8U9&V',t$$iGJc\)Xg.2L`M=?4/N<^AK^Ur0P%u$Z=M-X*9kIqdTRmnt2uY +e,bZ?cu3OeONVL@BFtl,'?]aY(&tfr!1`u%hu@q@/Y_'meGR3bl$N;W5l28^ImhF3 +_2&Hr+0u:3+!5%R +JeWkeLNH.3#s04Q#`!>GV%7Gr[1je:"jpHOuD6]^Jof3%)i +4n5#"M>[2K-\U:js,I$rVZ>dRr?!^$H2a/'ikG\?rXf+i&0N.Y^E`b?rg0nmP45,$ +JjTN>q8^Gc,6,9=F)#Cp\C3R4PQ0Hq3h6*kq4B?bN*C&DTQ3cMS?d@PcZ\*1]N),I +uJUI;?KDCH?lThRq5hm&1#e9#k2GDRrV$g#"qRcn_>4L-KFo +d"JQYf/7,]%Hp31#+^>cdoYH$Ir;To]&(gD/-/U;6=%cc!!rnR(r?1g0RDm`g9%,;b4FJ"iJanP8TR-DN`r +"g=J\06A.7/aH1U)]()sH[<@qH) +i(mZA&MBTjX(_$.[Wkr]Hr[fN]Q"%`D;'HhEq#t!phf3a[s]X]%:4I$I/TW%b:ihG +(Z(!C[pdhEJHjd2<%G]>J)@efb!VjI\)TcMpc' ++nkqE;O-i<@OmH3!jM]/Q=>he,65uBW1%2CJERS71)(F6r.9T'&9Co@+Eb.X+Y^@! +T^=I;!gk'T9b0D,#Au]A@sI2n4U1KkmM(.qrf=Q=+tc12/VI1,4NBRo&W#V"`[9^B +hl@RTr%H1f?]+'Zj*uR)SIuM(5KNl=s"ekgB+"QtaU_2*jDSoYnjb9!kjob/s'Y25 +6ef,EI8\fRVs.IQ=)TR::K8(3qmX<-4o_\JfcRhDs4$T:07>MR3q2-Ujir"%c[RX] +rhK;6\!F_:L@pnE\L[X"TeWgFT]?f`@+5XqVIK% +L#*Dr#0LWogn^_#1V%0??UJ0fr1A>WLB)@C!0/(is6hpS/]FQ8Y/uHo^Pl0Y0R]dV +Z@Yp\Jj#C8/eQh]B:GnWXW937R[#eoIRj%1Hi.$ugf;Pi7GH%8c1"26I&/g.=e(") +s1!)[Y9^OT+M@6+h0]oCHc.Odat.uU>(77@.i[=n*JN#EKSdsrba*Ku900X`Sm3h+ +CmILk*sS&qnr3Us)#7n76FH4-'\ousf)kp:Cu7j\@jTR;&Q\>rD.f0aF3WG1Nr>H9 +]lW`/M/`HiEr8TbFt923f_qGpO)rGi+^M2DLgUd-fj5@4Xj[J5'gWn8$]?c&S +gQ,]!mQfM+=nCM%SL<=%?%#atn4^(fT6=MHEa?/%=ZuLY2L?p@3\Hm)c73IuMW\E5 +EE*C]\p@;ar2a?"7J"f;/OuGBS\48Lqu+>+&%ZEC^]&TWgMblnT6o_oS@1;!hib0i +hQ'oTp5fhNU&\I/^ajhsL&`,4kXpCJ!cik-J3ZVo9c+83+;!JmJ:ggMW;f_)s4o"D +]&A!#o3_#Tk-*ac+!ps*s"f[qHc^a>TqLbipHNA"^^F$DO[$EVm]QSPr3bOok0=S^ +(BRDX:sT(RrXgj`"+N?C5d\k(57IYcR@'V:eY3;V$KRiR^U>-Dq,mUrpIj4\T;Ki1 +W;u`-rtG4com\:WA,[RUF!Vr6"[\=I%nZb]ir):Bn9PdK*Cc9($#g%CImSua5RD<] +JG=UWd=tC!+TFCY,sX'=#aUO+d$7]NT.&s,N4R0Jrt5-l#T!P7(gD!q>3*.TL(F@= +-[:W3Eg_C`^easuq7hO(TD0M,gs8U.>r;<2Rr2+_JAT?0S\I_SaB25ah +mL/3AIk(I)9+-m^Ql`N.Z>HX0B=cJ,qR*N6B>!qE_t[UmlLQ!WTu)7c-,=VfLY;oo<^j%!D5#"aVbEWT9qAcIL!nVjj7$e\Gj1F-r,8,N5M*5+l'r;%FpA1e'6Y1qNFCA4pm]4^-"A)YA2B_\Q;i`Wpj +N=5R;lfQGn/aMl:pOJU4lW83:2[t[`3k*u>m!d?(o"+8I[Vk9*Ad_WQOQTul(G;QU +8#7H.AYWo"A*8Hc$d$Ukg&/BiiOideWFG"eG4g"$hA>RW?Z^hu:VKi"I]pH\U[cV' +k0JPGGlG^nG%(i]gBSP.]lUpE,u6H";#m7",U1#SJZ]L@iQ"8MSqqPOW[%N#MjnDp +..D`Sq0mZm]_B8X5QditRpjti?&>8TTkQFbb+9m3QNYN^S/!57*P*S4Q]XmYlAQ96MBC?q=FMk6'hT$s'`AB +r(lVXf`0r9rEo,%rs+e:K&R:gInYFn_dG1+oY1@i8Qbt_.JZ""q%1ogae-2ZWX8Ta +.f]@rBhS2pC[e0Kn"jaeXm,J)j6[r=0E9i%l7[R(rn?u/LX)A2]!$VI]>6W,F8r;U +%=J-kjl_-D^A\Y\kC5::nSe7WrbVSnc]0[Xk^N'(kNpVN[5AekmaVa?G%=T))-p1\ +d$W1$gU0HEFBBr::(??''@+^l&06i7&-@B<=qT:a&]c!b3""RQnU#HhP<\I5g/eRe +N3Y@k,7eriRFFp;h@F3f/5YFF.8<\5C$jpk!R%uQ-;8r$Ft'?fLB +jUua5.(!"hhC_IfPboSR?[WL?/fELrT@bP1>5g@hqCi?hkd`+L=;7BW&tOKqbS@IB +VQUMi'C8c0)M]"85)$;a8-i0FIidLfb!n?rbT*8rt&JAV%F4Ra*iq=[Rrc^U7c +eNQ5>M#@)JkK1IL$m6.(NCVf^Q?#5JoT"G$3,A,QBD!b*Y= +s1MNQhZ(\=l@8dGJFEMs=.!r,`#Rmks.pDFXDTO3rWhTg+FiC#SGAKUbp>YG0bAAk +E+ON33?]dMb*Y\P.R,Oogb"ED,64P>'E"KgrtH\/;UkVY&Gu,uh#B%h`]j%ci;SnqVQU+r6TZbL]6JoWGd:5^AL:qndimt+*q;nqnP;_ +^`R];raPZn0D_mPB)M?e/V!OKa7'#Fq;i]h[pPN3caBO;"25YZW&aYa8C8^/pR.YKVjd"S +9shA<\+`V+(m^XS#HaukcM=N\`A@>VM/`/f1^>""N.]ur8htI!_1f2A@VKNG8RSrj +fbGdAbEIhpR,pi#XjZQ2q<2!ZEq'fTku23m$/,d>.#tGH8!f+NP7Ke9T@tYWYtk5: +4T-5br,:B6%g1:Qf]'[2M>X6'q4MS*juVoN)%ZDcKiBRoJHLhpg).Ecc(I09KDCK0NAQ-ojk(1jIemLK< +^N?5Q\?9.egMu^_fBMVHr>3^_YFB^m2!hl:Y.YOOg^9?"8nLhV-Vc0=Ns(Z>rF>ZY +O`Z%Z1ik(5]2U>qY2B2XrTn_kk?iB#^[9nSU3lWOf@`+*BCN\8pY*foN<_,=F$!De +pjXX;6A/-%^k/VN]L0S&5u<)&LMfBKp[EA90EVT.[4r*k,RWTZh/TIq=qTJFRP>R] +nC\/@nGH'K!6>iOc`dAqS=a$e5Xcb\+u4';:#5UWs2T*4:UYSKr4*<`gj-'s +qELVd&HAL:TW(?Ma4n>0&"t>r&lS*E+TPi$ +eoEP7K)2*ZPu@Dks'tj4iW(l$ofo#I5l?Zi5N(K2!L&cC5GXVLFg;"]m41.=kPIKr +-RJ[4pn-.>7%8\9X/XHrH:oJ'$:Lf0OVp#TQM(Vpa0_gYhPOHh7lDWL2k=1QTtgP1 +ht'(??U>$KbTG9Jhl1P.em6qmGSJpP.#o@f5NKNSj`% +iV3A5jbNlfnYcDmIJ[+/BA[te?9+AHFNj*ei93F!b3[iGaMK=mKhi`T:HZ6(JW32!od?Hpio&=aNmSC1j1j!#rDGfMYGR$23*.2W +-9j@D5At-uD"IV:Bqj%ih`<[6oLoKi.uqFjPPp1^G1Da>&nd7odhgP-k>ft9U;Uq< +BYQ=2?TrR.0n1P,\Z+D4dC=NH>f`4+.OWPqe(=00=1.@%pb*NrhDQCfW7neE +CqX\5qK;,slgDH!c0Mk3lS%ACccbKhb@Y+G/NeG:F^-bC<&VEk0tes)4]X*UaVR5A +a0GmDGBcukrC,c*Q`^/Rg,D4a>^Or1rMKPgX5^i;gA3S\R=i#j[UQl]Db;L +1d:q4Vu>)f?cYUkr&E1)ht0-Jni)egoOYDmL\dVN!W#Ekm%^W&+X$ah(i9G/]03]n +^K)?:aSVS;?J,:fper;bjF8-NA@_Pt"?9)T&!I*;'u0tS*jdeh4!9VMJRCRr]bTj8 +O0u12>#qA27e@*n1W`UU#LR\c)3631X@tT'@^`S@[?NuZ6.f?RZ5*]8.Y+&_+pWRL +p(GAJ`jgm,em3GHmIsSuI0*(G7M,/!@QksNpaTEb-(,6uAjeT^Musgsiil/">%MC< +Va2BPb8FSc8?2`XJa-']sbrfeV]Cf@C6uqh2(]_V>/h@&dRZVG2QsJ,$G: +q&a^^^/A88Y4)5aY++l@YCGGPrMSN,J+*F(Djo#OXF:%qs-rJ(hu6(?`LhKAqd\Na +IiEY22r0u'YeL!AY&F>Ys7_"cIIh+7=+>CCok4:@hg(g.2XVW1NNLff7odf:t.)_of!@;Se,c +3i]>K3s&qETFjUMZEUp/)6@KIlejS:W4fr.W[\MO4q=U8JkBIE>86=bVn9!.c19E= +jC.r8:!_8Zp8.*/q.og(NGS-qFSWIVohrBr<4[l8+ejh,MP8;S`)]HM?SZpUT3*U: +/j'QG4GduX%daRW(I&505>(:,A.L32[YlpL+,:UqAQF^ub=/AZ^K;2EojutEQ#,kkeM7,3o52b;MqYQl +RWcD]h0n%jrMF#`R=#=X_.WG1D]nG*GCg]FY%dKk1uT7cLr,Gl^Y#(hVBpPCkDs6*UjAgAS:0=/-js9 +b9S(#CG&W1_856+"qf4FLQrFbjt\^%)`$b7`ndk-LXcIe9Yk=cOK8pMUP=baE?f:' +B?fbDFY.-.$T[-f,@j*Hr<)>E^q`E9[DAsue7e$sY@$kdQMd0ThnYCV[HQu]\A*Wn +F2m#jm:r86[\7L-\=]Fk8Q7Qa,Y-A+d2O3De-V;Td1%eKLlq<8gt(1 +,]6#*YbFTabTm=c7KF&Tan_98kYqLXKT-"Q_*"(UPKk?1Z&qFpc&CAl,`;^t[*Aee>CGX[>r4a4c +!rpT$CT!S8lMm)A:uHiqN6=N*s0*%?>.JOCJGfcSBg:\VXLeU6(30A(PeHa6@b\?[ +qpW7!es>Dq[E9[=35cIC#_XX@q<9@o7qDnX +rs)>Em*uG.n/2^-0C1KNHAs$j>^HlGV`r/#(&+\KH^/&9;$$1dUi>`q[W,WdqljW* +C&ZBkajri$k'?C7,O*d;]Y-$!pE*"f?HJ8#9(nlJG+L.+?BlMCXuLa*\b"[&r_dh# +[IO58bP>r.frM.5BD1^SR[K.%T1<)=,?(s!Z5X-LC5Wb*$R*gYf#n[Eo26LfM7&4/ +]7L,OZ]F53hd.m-`3r55,@%JW&2&LQU*0mm8qM-b/J&W$C(%T&"\JKKXiX57P;-ia +e/BbsfO^2afqn=E$)]C;W@^1^Qs[4h(L340<^m#<9^bT:CPD.ZB6lJhJIQL9R0%V`L]Sm>K3V9oeBjF`9"/Ij_XR +Q/c32qDJrg>KMN5kM$lL5l7>#;1S[a9)gBaZcrsG-P%;qNut5m*2cO!Vi>R?6A"6( +N:33qC7`#a4<;s5)rEg)EWQ*)PCgsaJJGU(1*H@MH`7)Pr6_XriB?&I;:Z.r(?+mL +J,ED2!I<[BcH&l9baQQ;X!i+Y1B@;;:*@2BRuR4S6DKWbfb"jKi&/S,F`^#)?-J^=rdI,,5r7MA,_\TGmVPjX%R,.Tl(CZT2pXVHkG"D&Rs[:#Q/LNsXa<-dFOIqVo +%fAi&0^GdloeojAPmJ3+W\^nqo^#a%VbW^XX%>^C^FGF_.["SiP,_0=_#e?Y;_M8R +:'#0!k5ig,$i#MQO(Z:mK>:Y7plB'7F_e=0FF6nn(AIMq +9l2mNNBmA-%Rg1*`n0CMf#s6A;4ARAK`+:rN,+PpLj`)>F"SD"4@Joj$/7#m=QKi3 +]:9fYN`cos*C*PDo"![$W)=mR=3DF<&gk\kMg"btF/_&P]iN'gcK'8V9,:-g2Y)Ub +"n%f.hM(%)-'!%tg:\?d>bud*=M\R[%kM+>m[C"r:WBe<`O=%=3[U6]+`;s<] +&rendf,Cu6-R$!j'&6(`G`#IuWFDiqS*)&HCW_ +"q):*:)ZON/VXqUri'*R'A"/]3`#'I6JHqjW96NGs$gH^Gf4K/s$?M.@FjXgd_J/g +e.HWqKKj`3S35_j+6?2Q(67a=L(B0>=-_WMAYmkC6%YYX4::uE$N0p'fqdCAO[ko$ +d0dR5,b-O_O:d;R(D(a4%9b"ZBH!`V;?OuD#-(9^ZBo%ngP\?" +^=Jghd[n5#SUgsWZ_+q53dkk[rS4ir>L>YXdlVS=os3Z44A\YP//dmAUtck+Uc]&9 +C4F8Yj`8T)"9a*,b9U\0)0/h%@kJ/$!8%Fe9@sEJ#j)fdl&[t\lnVbP,d'`Z?R;RR +F'.R0N^:UfL`+`0E5[r#DCtWJFEi@H%OU**7KLQJ$X-`g:9K;!KVb!!%_OI":i$R1`)9kpn_!U3Fj0\?/UsZlOO`aE,M;AJL2bWCca<0FA\_)*#+tJKu +pg6`5=A'\8rblcSqgeY;U"bt[CPi#!H..Nd;eRq+jP+M>quB4s<4FKLCB^G`=<`O%]0`"&ZJ/Q!B(L4agP6C7C?r_Zk +?4a=U"mmU%HWe^!g2AJDJIrH/]0rT)KkM"XpK-OqlhdaRq@WX&.M79IXiLb.-fFG$ +_-[W?a8AFVbU<>7ML^2d\X#!-EN`Z9$Gt$-C0)`lr^Z)PW1NTBrouC.*/k=*1&jaY8H+Oa +r9&??dCa_%4XH9kM#9kKUPdp(VL_(ON`GUW!OZYVs&WuFCU>8['?it+K@&-_O6c]h +r0qP^AigI$MV_UW,fFT)ZPoi(%JMrgm)m:9INme5`:U.6q?Z +8SUt>a9&RR+I(t6K_`q#Q[hmI#V!+fN6[#DnfRPB-bB%r&J]cQJ%%T\eTOWsDA.os +$2?#95'+HiS.?Cn!SQO)a:@c'-AC3AkG^#(05Ea$Qp@Q>VE +*^Cq=epRJRG5g'9pLjC!9C)SkH=Ti\mh"Y>8i%FI.X8QK1[G/ZlfLZ^Jm$C-8Z>_#0i^6]2A*nPU8+n7k3<(C +X+8rlQ/8"0Qk7fLkBPU(!uo+Nj`KBbJnoqd\&db8e1XXEQfHkoV0Fp9_&C3!l+g2E +he[Dd9N:n&>RS?^s&L/E*UZF->9WbHrm/N*!<8rGm3=P.iSdU4'>,Z:Zds2m$M`NW +K@]R07GXU-D4^k,V:D4$!m,//2kft5%? +0!O/i>h9Cj#NC6[(r\3If*Tk([`!1'E"=+r?-=t6@F[EpQ>^\riQlXF*0q?grSCT2qWaTLi86-'t[ +23'GHJcCg7*+ht'c58csa?ObKcH^EBolc:Kg$E=l;sN#N6P_BL#\% +0Z=!+*p.tH5NY1_k_9]/5JWoD*CKr'fBH/1Lfslao=r+0Bf*jfR])l+1QCsj.GfQ@GDQ(pGMQP)9X.r!Sbl9"B0KLJH.lG +5$YMKFb!\C?Eh_op.'#&Q,bjOEcrVn.3;3!/Y0=as +8`Q8\Z^EPPQSuRL27Sb/Rpe?jBK^l6i;\1@cWjH$'#b$+/7=J">GZXIia)0'h4W0J +k(0"E+GfNBURQi7_mc("W&d?6RZ6bUO(s6$^jkhWs7PZkCM":Y?dZ905NTn"R&DqYMb$A.EWTEuY!%n3C9JN%RgCW=Ec9 +m@**2665?e8.2q0[)H%S@#Ye@N)=M5OG)(34@0 +:fkjD&`aJq@3AQB![:FPZEs!-h/?icE%s+rJHJSIK,s&BrMf$nSYEeaZQQb]0[ +LbU_;g^k!#!+#qEcqta(E/h%[;!SR1TE\mg@_O-P,VuRU&utamfMD"/g/::R60%*q +c*^7'5>j?d/8heb!uB6o5o.g8=?rVsV#Ut)YQ[uOeWm#]Q)9*9e.nm5"b;.'2>Kg' +$`G5%q2^5U&cZqO\#V;H1l21ji'.J<+2W@=o:,>+s1ns`g.+"B9-,\d@JDpD;R`rR +Y.XQaIh]p+I&JIo[57qe;gL"k.\D-VepHqe:][).TTB\YJfeUPqLs +rt0bI=>16:,N7.4E+3/5)DASr<0G>1?"+Nkqf`hF8c4XSO%!q`_j_F3>#CnEVb`ZF +dS!hkRG36aP[F_U(P&<3XOVRc_A:prUcri@I+en2,N5d8`"()pXIu[$,(G^+1DidZpnq!YP%H)e/Tp@LoTUK6#\"skeT,*d6NZnr3. +r,3d`*t%cpn]fXpAh+V<6HB#EQ(M*5q(_e_koeo682XYRQ>-p!^X:1*r\p;[Ra"FK +L;YEE;PPS46'YQU9PUY&BrFS*01uHVW%U`A.o+)"J?j]QPQIN&NJbZCO:.^EnG`st +;'V`kFNf4?rXo0)U0_o$dio"q"6\&b7@=)rA"FWMOob0Z6,45nheS=`.k>7jRu\;Z +B0!;Znl?gTf,b:NSk4*tjmPD^fY/lj50MbBceWjjLOfE_6f-3`aT:D9FT7&*qg%T6 +nGbr6cKg)\T2kVM<8N%%EVGI`hHSP/\*EPqq?LC/mgMuVR\"sb5PSp*pTaS]WF^Fe +f\M`kfcUjZ`6!a=[T^mUM\bpW +@4\9uP1fpXiVLsWrLL+WHVMNkWqt$L+TASA$7nFDr3,rpXS]I8o,e,Is*$qt2uZWM +s.,n]4&,/S#64@rn[R.qAiG+(nQ3Ef%Bs2(9oL-E,RF9Mj2Md+.JU,]A_p[Mg#4%=)!'jPjVZ]8l`[87]nUB8%!6> +IIL=bQ7%]BM&QR6fM!.arh&c$JcB]F:$KE`3H7PCJ&iQ2rZ>aH(#]693a?im4gQB' +R[87G/#rbe3D"\4]p%7C)6j>6M0_!@63R+@iRH[5+d,:tlI"aEH?J4RXi.2kc_h2S +/q_qjPS0i9Fr=,A*j'K$dB5Bo&HX$GJO_K=$)-.?W,kRZ<[h:e[X=^\^gk^bf^mmA +WSIp-i&jR:S)_Yaq\5Ks-8k(i@X>$32IR3k=7)fuN0f=fE.MgBh_$4re# +(P7,;[jh?@EY&QWciAtJDIcBjC]Qp1k]0OVj?K%B>R4%fq?Ic9G`RMBW4nF$Vmqs(A)@!;LKmopX>jNQH%K"9:WI+-.S_(4`2lL&$c\TLhpr1=1RO%>5YE +ECAk`!=NSGdD,feXGdoV':!tWrt5&IFUV/"FY#kLk#uq$2%/rhMVV`S2d=re(+r]S +X,4%\D.98$WEGeAUeG[)88KhQBdcUao:Jif$E1BU)/X05:BH5U!:_/7E`V@u_bbLO +#n;S[\.c0C49LRed0N".g?`^jW5g<0RO*C5>lr03**88;HYkk8q^1mKsaPAZn94D*=&#hNb::/,%9M#PW8IT'#FS00"3?Zi)(l +s1*CCV.:*7JEOIIc_R&6'Y@`RDbH-6$[>a%kAB>6#OV=ke_SiW1U)D%/?dpp+U`Pa +pSoTjYBfu2g;hNU[l9S)*i[8MSn5u81?Khar,k>dQI!qIi\9bbHl?%>+Jd.r\l-UG +$85XLRmT[Y0f7Q_%6n0c*O!SFXVBQhbeC+&^1BirCZEV#jR$a\U##@oS]&X@KRnd* +!5O)Mi;u`opWbL`BFeX$%hNajn^@TIgn8pX#bEj`Gem'i4(*-$er;gYf3F)+NcjWs?]V)94/ZAQ8'odGk#=kdbHr^K!?]CI$e3Y'Z;nKV*XGhRa+d!EddPf'/YU/!M+Mq3PTpj\et\s"*:rZ>^rgs-`?q!Y&q_iY$bl6*d0 +0t,1GT?m1jQW=8i$?BW@aaY<.7k=dRIj,o5q.'DJ.C2+$,-5rfG)'7W5L0nhKVKG_ +[n]7\gnW1!?bcm)eE9/ed&3*$Bk;_H]O$Sl=&[JD.rlS$\r@&pOdV39S,>!N7rP;A^7>iL5]lj*)k&`oZ][YZ4-F.8(T]rf'RYRt7N#d4<6 +,$gkQJ:V"adrH"n!ZJKIo&s+fDI[8A]Du?34>hlh?]VE5;KF.Jgu6qhAp%e>GWhBQ +b_u+?pd\LQ\!l!F@J+:N]ilcF5JVcK+WpJD;3qNF["-6.!/UPt1h<^.c(:ks$rr3O +_(&lMA>Anln3jY_8@8A$[e3P'ql]_`?.n`Qjdi%:kgn:S$5%%'=Su>:F6Oau$55MV:3.h_e'qKg9sPiED--L%oqWjkXBj +[[GuhVB=a2`UL"W4HiXEj#@2kaRC:>WrJ3UrRZ/GkMk'.,n8bpf6rqIqVDdr@3:MI +!<.TNrfbj?n[On$W#FQSVS4-oSf`rEdC#21p).Jg"LS@'+6=`3:,!fpJ7VmplJtEK +T8NpK2h;,``-*\0](,X9>\lK((r1VF\omXWdr\:<3m4ptfT5gR*F*.Netj#]r"8rd\NMEV +Dl'PI/?cZ2hc4"J.BW*)CBGf_l+E_FpOlR%.r@%4Io04h&0^ZdI8*\SOiE!so"T\H4s&C&_J'nBb +Hhbc:pl?&=aS,Iiql.@)Wc[*J)EP[O,PDqi_de(Aj%1+ +^QGVt,7B;R/:],L&S6Gkq'#Oj;F:We@pQA?#Im#V"6?\m>&A)2L"0pM3D>qY"/eT2 +Ba-@k,r@-_9pM72ns$#WjMoWDL6AA/il&F&"FQGjBPVQq!TA`_:Dt@kCRU,ZM!g_r +R/b*L7t)lc2roLZ-7"p4(\8_4j<1*Y.fPoJ]`ncG;(/?nb?R(gKMR/.o3+`CZ"2js +B`R[kjH/bT>"?s]Jn^IBK6%Bo^"6n=212qr2'83 +?Q5VbCjc#Zk2^O\_1m-+2d9kS-L'"33WZiL/Zs[q/'jrR_A5s#?mnH[J:BSO$E=ZU +K+">fIDnOK!1L?7b*p%r'L6L6O0%WmF%h)AA,]PZ +T%eRf#iK(eV;2$%*^]f[9(OmQ"8G)LCBsi+r"#[_]k[1E1&.o@LLTNqBF_7sOk<\g +#eWV,h\62UT;?YR7(:C[ZqfJVT=j#7F/sR5g+aQ&0c/;!(PDJn0:8K@N^YgW(25qd +gqYOd!4&<#KV9,u5JVb)ARm`:jFfI;Q@\M*5?[<<4u5q-eRnM)`P%P"ShaGmOh@m-`*]A^0"6h+f8l9,ba!B(.6Yk>rhVCM +6A]ohco\@KNKl=2'ikh\RKnam_'5_jW7#%I$s'BUWcG;Gcu$kk1C?C\7Nj#k?!9h/ +2@H_[K&_CM&5$`iV02"N47oMF:.#91aXGqb($-&6GO\a6bpGc4Op"` +5O.hUg?0=\nlnX$+=s2Ie"Y4Xa4OhZGo"I)$81st,JZkOmaW!9fFtN*Lc@/?:2cis +:?=pN33m`2Nqm[E\Rm/$7E#9%"83&lZTqeW2@/2qT$]fnchqDkJGG6X!:t]7?85cQ +2uYoH),=[F[k7f5pg4<7aSR"X>BNW` +J(,]0:IY+jrKfhV%2$>45Hp[arZafAQ%Ni8=KU+17hl-UAn(oB*@=gfOm16!d!%n, +ff75+G*A)Cc]#5qTj_9d5pr@4a$`:IPkp1c&1E_A\0$/FrrN+)C-f7Fk&7tr*kmm[]u\kob2%IuhK^9tI\"6/:P=-qh>'Wd +mh`n;:PSc81j@ejNkc$O0g>QTnGK'\nP>I+^XbRI[GfMgg'9jm5PWlYn&.1#&=]^u +"e%8k,qlt`PP0k.F=aWr\<^aGQY".&oA]iME()^uRh_?UZ?08q#$iOJWd3"'A4g,o +er8*uTU<<]4h[IG]V"3@8b9,5qcApbQaq"l-_pb6bW^j_Jc@5opHi]J3n:ohrWhArT_?Q6gE3bEs"hppDcsJT8f^,]C*7HkV?heO@DI5;/+A%KeNLt;)5fNI +f;m^l+Sbi;R0RW_+oWRCCPM#mi`eo^R`6a-UX;f/M4!G)R$QF8[[H@Al):JAX4.)&_IW9 +CX2UAYmZ5VML0(bRU? +Ph4/][Oj"8CZYQG_VhG'BY.sSTP3a9Ir8=O]q%6i+W=Y0*aZr+>fcV4A[RM/e-r.@ +r+UIQ]%4i%q\3dpH+?EiK7G%Qqed(^;_Mh5$8M,qf-$=3VBqM_Y"Je<(d9DG7.NQ) +a"RN1*'b\B"*OtF7k,5Q'8O,eaAmad/YJpoU#j]i6C0%PI:<5L::MEPTK8]6H9lZS +"08G`61,O5q2^OE8+?PBL=0N0"8kFrr"E/bQK,H2]G?$IAtOq3CImpB-D<&eiMLna +4ccQAr;YnDhXaP0q7OZG#jbKp**'e(>+:N>YgV5V%#:8(7e#H_Cl4UkCCo!_4Wuu@W2Li`=K2D@pHf:Z;m>5NT6-fBqq;Tl9XiKG7#K#;p +o%Qqc)op(\kIfn8P5Po:-Z:9>?]+To!hP(2a@,?k1O,-T):7^b?q:kr+plX^?4:_I=3fQf"b#-o@Tm%.OKXZ +(/d^Np!]E*1-W)SAH?coAO_sV@c;6*B$uq^1eeUr5(u4gD)j!a]e,\(#^/.i;Zbma)$,VBTD@_,C6PQ7lc,"'9nOI=9n!gE-*>O]DHA$86`eYWrH>_poZGu_`CD(R&7>g1HXdPcG]q\"Kfpmc//2c +*r+WBdl%nG4W%0T**YWChZE]tMQ.bTB`sfU+J,3a"o^T\@p;E?<"Jt9)7XE%]hp_3 +ZXNc4,GYO*S'4gb-DHquiPdOroCU>Q"Q*P6!9X;VdcbT6peLYgnGanX')6r@$T)qK +)n@2^\g(N@a]UY?c6!<=:*_X9Z?afZGig,]Fusn[?Jup*[/%(j@nM1TrsSWR'"DBY +5lB5kgr,(8O#e4D]'X5r#iP/JB=+^r&Z(a1?"I0P`S&N\M*#)'c7^$$2_>ehD^kX3 +WoZ^3NQM9/A!E&2';,@tsGd5SsX+/.9k +W)^NN7L,ca2dPgq;u.sOSFEZR)4cKjLOn'WbDY?nNZ(9&^/"W'7gEB^d;6p +ao.rBpuB(OOk@Dc-kd*fZ.d_:1?S&VZbk^`6I0H#&Ji1]LDE-'A-$2JEmQ0L&8"+O +5?=CH#[+rV9g/p`m8DklcmnThd3`1dOlnQ5o]X[DXU]JOj;+is,Q@#.+o%O@)#fLq +`;e3HTAT1r;00SR[Mg'`N[f@eS^q\T[omD3-@2/DdA@/Rg9b\;S'\At-*+-ld8?Ln +-qbar"6$4ZM*rQW$3*R)^l8hCpLDGI;".i;lVd<$Bc9=3759E?1?JhqK6dk'4,reP +]sLikm8`>[22,@JM7:.9 +l$LsoNuF5dr2`EbZD'rHDj=nQ.Pn'(7(SYQ)9=]XP`-ST-?iD/ +L`Ph,4/r0o.K6a9J`Xh$-&ubqehp+h#6$82ghUa+2LAhqk22'jmDSh/@m%Bnr]N_8 +0)dM#H5A$dW&d=j/MgWfEBWp#4qP6D7UeTl!:YIbY%p/.I3dNtO+n,#WX&OtI&$*( +>1rkfb40UoocK"]^L'S!J'8,lK,<$e/oUa#T^g3WSuYHhmjG'YZg9=&rtMMH0#9D7 +lTjXSY$/M?c/9(a;,r]#N)5s."&\`D\%lGk#&`!%hQ.a/ERB=,jUX1#4g8BV=i$3cJ>5B +K@5U/ilO@&jL/T87m+2G1UAa'434!Vi6Ui_VhkEZj4bHh)lWpInQVu6)_'gj#m#98 +7qo*A\Ak+R>LO$]'bh\2hq-h7Xu*ILDCH\Ikd:C5?\sJY)S<8jbMpsV+j7j[f@'?3$Z5: +L+i']EfM!2V2?:.j$ja\&\cce2ANnm""=5[!2J-Wg;AbQTZ=hOJHb]03-]e"fEEnY +IkMZ?h@;SE.g'2r+H6Bm5@am+M#X5mEY._iUfmd#rqG/fK2s_KIgH%cFfCq#cuD2= +'Li6'\HMgBs-r[TUA0f7s(G;\iI_*Sei81Eao<^bAc;f0gM5ti[@t`=HS(KogsA,u +k[4E3KEXd5T@'gZD]i4EmjKRYNs6ig%T1j^M")e+ZN0%f_u_ZbJOL?(!<*uRR?0^i +q+pX(6TZLM=%nAB7HaaE'!1R4$BWc:bB%BU]UBIGBjk5KZn>;(c.,Rc[,8us"o^lr +Hq1\k/m*BC>(%`%H6Si./mEfS\c#KT)u0G,Z1CApqF\7(HBY]4->3@dE;tp]i3i>< +\,]XHCY?PYK&cSO-Z;XR?59*F.D>=MoC,i)UL-\*IaR$P7=FVX\d-!<*rThC:]@K] +g&J(!"8^"7n6tG0M.V45bgXcg,rj5d!qI0!B]to(.*A:$*taA\k#"B4]P(,]Aor%D +NH2k[b)BFS2k`C:Hr8lebF_#WNS[DN4lK*VA^0RR9Wfb(XJHE$q1aa?H"J_*!)$!% +@!mkgYf5nbU'A&8^"Y9ubp`<=`OAJNDUS]Ts%@>pR/\[101>d>rrouL%J=-8:/e_Y +s/4kg7Ut.!inK5u>#6H"S$gQ1oUT>hp0Q.RHs$aQLOd/-b?WdD"LcX0%:@6r^Jo_: +[!bm4\Rcb@WL9QiTLltYmO=HC51)Gam0m7'oDWFtr*]'nB^*8Lir;8CS`d")Gd@`. ++E4G488.L]IJ?;)co%leCJF:'j5>uaU$G^oIp=*7NGb/XZpJpi95Rm@orN32JH$2\ +mj/C:^(;aRLRBrF]W"'N,T,WGk4Abl%.O;2B_kgf$2d"&0;%AZS]M[Do+k-mQ;85g +?icp+`V`W=InXGFl,3Df_mK/BV4`?57Qudl5E[X@`jS6ueZKCu+0K8pX":lp5iO4D ++"OHtXDi&VN,4f@mmtKBA`J-cM4NG,D;jt"IrL<1]IauRaVkBNnjbUEL/ue%MokD+ +<6m$IYf%KO:%aQe3sQYJIVN^AV7Q>S\b\gm4fY`=?f5oo,O8'6# +Y@4fg`+*phe(Uk$TJgS5]:"QODkOQ'l0Z%irjSko^jiHZ1-?g#Y)j$e&C\rm,7[9] +5XlRk?jZT=Gr3;YK],_:JCFnXfAuX=EkBk8f0kr`[o8XJD34HV/teIk +eHKi%Z+%Bil0]58g?kW>c/R^]b]XDBP5h2L +0`MM:j,5\PMDAWo7.@r>o>`W&onrBTF&KSV:pV;cKpWG0J!MsP%^ZT*pNVT8WDi+3 +_jfnAm?HN9)^>)1U@Rd/jpl9*rG+.U9o/_B]fT)_]stiY*=YTVocN,l9N:n*FN5TM +"T^hi"pk"=_Y-\lG6%Z@Lo"Y?s"qCs[;1S9)N&9KIrFcMZ3'gYoQbo9B4>74U]Aul +psjldk/3 +eI9DR&BbDMh_f3=L>@((k.P6s>qlS50_\q^qS(P`rt50IfK`qDF^q[N@kl4AW;+gI +(9kmH>2hNn&mX0_J]"jWUXZPSmL[>:8!"g(boC7g_Zp1\s-ZgKg%4sWZbZT&P/T61 +g)]G#4iQ]CI,TPEk'>(g=i&6P_=Cq3!q:\=D=QmXD$GR\,l*(93=%hpq2^gALn98P +e*rrG5]M%Ll`O*AToY.k8f5umk0&=2d#RmR'pc2&$7[90Ll&IPY?.W8p.8tX< +\(o,Eb:7]O'm>jRFf83lLb7<)W__RQHiAeB0t9+J1S5*Q8O`1l"!9/ss.AnTAGuc+ +,8L>7s%sM%_8bubG(@&SP++d0$QtjEV-oHQcP6=Vrf`6#J$Y;u2Z2bu5^n=boPW[D +(@_@@!l@9(+<<6>r_-#bYh4Uq&$ZN#pcj`3b9Gn@^'l[lp=jV8Q5krWkVd%b$j*>X +O)d9u)QMhs'(KQQ,ktGS!VfoT4orPCe7)gn)VM&TW1Fc-r5!-VL5l6I/jKG!+<5ra +%f[/^<)_OdBK4oT&`f#AXGZJPa*$.8?.Sd'F*sl7Y1#r/0[MihN-7@t9hU8N%^IIl +3m_gfQD4MhphhZn[["-=,qMOm`t:Au&K61[Z&`Dod+n5ePa:<.7k"T@=WJ7T%OG:B +6Ut_oeDp-U+E++!UFl`Ykg9`6?O1LDQVQ86;fisNg/J5=apNWPDQ(?5UM*n6oPI0J +)lZ2d4s(/Fmt_d?"k+"f4qt2N*p'IeQ#&PrYnbt''m2,?2=8@UOIn0Th._YFPq:Rhd+Qi;Th35SkTDrYNr'>Dt +?@2OLq>>1)a+(?Xr(m3r^KI2E'tiIalKCOmb-#\o5A.'P=/=iOuDjH!5;m)H[!I0T08!IU/KcARd%i3/4!Rrfcu2gZe_) +9_Y-'i^gG&bZd8+SiBI_geAYk:E&(\+.d+jVIDV&Lcu-7/2(8;(qsjeG;%7V'CFY: +Eo!Vcn$*'tBPqo]/>a*U5BYG+)Wi_:/%!#"Q@C8j?p;;;-5Q!a"=on;F96/(j4]Wo +*J;`KhB-Uk+"^dU.I6sUX8AZfrX5_(1L\P#`";aRI8e_iF[baXg>E_#G]_sk'o\nt +MUi9hj[@]E]6EaVXm_.t%tsu!jLpH%In*tKK=oO#';go).&:2(c1CRL-&X>5*Fg"q.#i-+,,;]sR<8hT,^>,5a1B +(4UF10Xd0.$ISiV7fPqis&tk00u4<&:@a!N/uAaedXj8HhD%Kh-`4J9@df73frl0l +^WN\V,.lpne(%gr4#n$>U"1YAmOFC.OVU2u#@]S+0X0IVe5F5r3'N)CL_[-4$938j\4.&k3_G34Q-ZQb88',X +ck(UndEiZY`W>c"A.a/fi1EeGH^HB7"tEck4n/r,#ETd.5^3S*NC^`02SSE60LHWF +8b!$.cNrhM,A=-2LQEEn+TB,$N-b%!hie-@&(j`D&DY)(_nT9F'uBq2b.\#HBrN?)TVgritcadtN:Qoa9Rh%qWt(G%`cYJ$$64qXn] +(9R]9T1QKMqGb0>r-t6Ep*si&`.-_u.fLiVJc'HWO5B">^+VPH=E`kUq476pB-3E% +_#M0+%$1+rK +:-K3=Ik!55b#3/Cn=oN\.'bC=?3[McSPkUd""Hp>8#kXK`^IXZB(KH^pc\WC +*WF,4hnPd>ELa@YR^II)5'<;P]U([dOZ^:B4KuWnbf4k%1LG5?hXeKWF`1)]gG,;% +>CCkGSjW>Sk5RQG&,;3H:]^Ankq6q+222qBO5Wn,"us;"jj\!O)[hV^O.4s&isc%&4L)rrH.*Y>kW$ +_#dm!lMJ^3ghlFHB%)@Am2'_VJJ'C)tX(pRIXoGsQ +/7:<3EL+uQ)P].80tK9qI9R-3*m9%r3d.#J[@K:_`Yeaa3(TMArknU8s5Sq83K&r/ +X67pmqspT\MT'r&nfKg[&+Q9rJ4og\ +\s*8(r^U,leg:;/(3$N'-k(Sf9Fu%c_>GZ-aIjUZpMIo='&q%Xq2^6\9QC#di.%X? +nK4I]aGL]$+'F,V7IhP<^KjD9[8kX/s4]"@`0H#[(')2K,lutEOT,j[ql:j[bU%oA +5!=K^_1,c:s3^WMK)b>t'[##9+>0VCaU"kI(tdR3r9+Jq8c1;EtF9"A=16nglB +$7\NC"7Q>B8GKZ[V70Io0`U*hq2^FrUq62m/d(tKEbWJ+b(=#878T\/i2U-n+3^i- +PrNA$>mnN`'u"TLD.#At+5jo)2KFm:M5!2M4RiB(2gpb%!.$%qK&HZCcGi3P3Y_9S +[eiV&q,Fs&8?i)H^]$^,onp6X,(9-0k5#J5p4rS+O+jM#'Lsf&H`uOXmg>+>Pb'', +.(fAGk4.?Vrr5L')"%G#5sH7TranJG^gA[Ss(6cWpSp_:Q+MCr_t-IFjbgb^6"Lom +Tf@[eT0XpNU(sQF6GQru),gYRO?puaV^^&-"f^"g[-3\&Ru6jjEaG9!(%:9dmcF]A +Luo`aQd0ZLDJ'L:(/5g-Q;7Z7B:6*Hl%o@Dab/n.K.C3V%!e7#o,pnk:\%jLV[Aq:=HIpE'PLX7&\4a=;Z,,PZ@R:17>q%l$( +&H%U.2#D`PaPR'sn,#S0q%"p)pSo9b%g)lXr&>W-\V7Z +'&>61Fb%87:t_J!D!lfe4A?bZ9Uj\q%W*I"D'tAcAk_+(S@b7JGFlL(q>X:&nlW0r +5d:C\5FD#ZP3mTB]-jG%-fmGaQ(*gb[iUcMS%)Kp)[jb4NZH)RBuKk]`0[V$0@s/a!4?@.Pf"W>YdDL2R?n=/Oehs:k<)Ga,( +;aYP!Mn,CbAKCVXIR,`s0U%Zl&I!h@jPcIjW[&n%0JtI9NKKPs"9+Xar`GO/;isa0 +F&F?]NJI=nVqDIPZ^2`qc5d3\%f#(>r.S(cd[faXPK_F,oHCF=pr@7tp9-4+X#(*= +4iC2N&+G&n`jpBD\T=P73%fH20m#\L?]0\Qh[.+`NrPHF:>e?Af9nf6j95P`'rH>? +d>*$6`1mslGcYDDhDIcBo\ZSbMQVYh^%IhTS.!,/F5PB_bNnnjDrq"3E=f+6*;Vg"_4sQ%rp4G>!-UbP"^,Yd\F_hff2T:;!)+"%"Y,1s&14q[di3$a<,BIfMI:+^LF=VcQ1C`8,[$KF\ +Pj!ad/LG_/'7B*prQC%h=]XuJ]6BdueKTB&5>s)b2\ +3]1@tb^YC*ZU6Bf_BhGoScNRPYZ#cuI+]:AEg]]I&4 +8V$gqJ+bjCk*454g=4r;fgj`=O+h?\qub.dSd56Z&YcuNNs4iFKq#9a]C.$Nmt@)\,H-+`qpjc +k^XMG"+R^@Jb]96`9EG.9dmO$d9ogo:`B-s*edMD2P1elsKtEGWLmJTs@gD7.&Dr'a5Z3,F +j.$lG+r51dQk?BenpdA290D'Xk"S.1sf>'7_rP*5,VK%@I%UU46^R=$7il[CBo7P.WgWG3c*H4)r#bt]5+*A3K<#qZ9a[sIqDV:Wi0dH",8etp]2e=32a+n +MZ63K.DHR14r7D;Ok3qlDS9B16W+7:CO3:1IiBn@r;SD,MY]'%$b/ +n6_f,M>s^3KGH.p<3q;gJnQ6aXSJM8i6'D;grT7Tj8oJanbOoq"c=lSeF5&1=?QDW +KJ<4Y=ttf>JC['cb.$$_[CC.sU_-&;:l:2D3O+6r,\1j4f< +J!Z1PQ[Jo6I3q^b"X"W.F3*BL*?$98q'Rr[n#0Wh\@2m?%jLh!-Ie]X&:TGK!6>[k +Rr^:`EUOCqItoKubl8C$In0^(_YbdG(r:\3[X`<3#RU95B8RueJ@LF:Oo377$<]W1 +CDFD^r$1tY"8m'n`e=.08+<,Xr,:1`41$hL&0liZ!3D7nOTM1&;-\_Q8D""5Zq"T` +=,?m:8j91J.;2e>JH&`I$NU+:P^/j0c*4j04M-#([<%ek"2?T&o\s2n>F^7MmdN,] +n1\kK4EKp5@hS2-("sRmd]E\$C5#\DM)mi+Q38erYbq>!.W@:i>,P2 +>LDl^N3t%g\]:e>2sG*c!K\#2o>(D#MVB6DOFAfGqmGeW01rVIkPqhO"[U@.nGb6, +Dq6;N=W[KQ\c8:E&)LuDQ]cY8hrM3$.VW?,X4c`+Bf'Pd9hEp\gpC0PEdUGfHs'oP +;0%U>N=&#M:V0JiH:,ZE#DKVHU:DN-dRiTL*PoUFSE2iFWKZr\Yd6F."gkWgRKicK +aW(E^_u$YTgUeH[]hV!F!:YK%l<0&1=hE5onNZ"tIHZbVYer_3J2$[Oq3U)fiC-I#@N$-_6om$SS**Jq=3.@JK$J.!l,OW2K5]XE8:`6a6b"b!oO8)%Ij@)JDd%N +qh#&[pd6)'?O`N:L$dT)q]O/:BD3Jo%Klb25JH"N]<*W0p\s^>\^TA+*+krs[UdKh +=_7jmgQKdhA7fFcAnGY66d7bMhjJiK^Z_eJ[]CmFSltA^B-#1$,:iKNWN*XUeOEC8 +3e(O)1^&F*+7oLfHN#[CnLS;O-?0@eIhX\aS1o)_>Wbk7*@b-@s$rNC;r,TMB&u9A +F(CkG9PqTCmmrFO[mmdYi`gs&R>GTX(J/6bh#uH$6)Z!/8!%O*e5fIbu49(E`?k[O\#U.=; +eftn,'Dt@[l#a!kjo6.lhsnHBPli5iJ$t:8/dlWp!,h9r/*UUL[-8/Upu5"$+M^2' +5H)sJma>Ce&1%0^I;1/9J*;9?c)H!s;Jf#SK"hV7NWS&,TC:c(r)[>8\.`$O#6*Y: +?m5b^]()E\ir>SI>f,t`+B4`elf*D.-E/9.Y;G(=4Pd1lbnoudbX*KVr21,(-Y*-W +RckJUQO>JtF\J,*P\C6)"l/X?"2aQJ"!:f +(VgVH7]h,u=bAC*&@q?lEqQ>`S_rLTJ(GbAh0AKd/#i[L/,]eq#>RE./DpSpK<0EL +AF:PZ%sRj4fcPo[r#g'n9h_HRWORN,@]tUG2j$G1"!(*BnGP0bWWg1&9Hi@mZeBT(Ha(@TW$F:JO&"7,fK()),n:-1M*aB"f"9.>? +5i^@o6/N=5s"LE]^o)Fm[h.a4r3(RDK+t!:IKGTQ<;K9gpVu"TAV6'cir:_;C@sg7 +Bq"'?0CmjE)-'t6G(;e^45T$b$32=nn1R+9pWN[r]sN=u\CC45%DmQ:J%'W>pY0L\ +f:/92hh#9/fa+u*p^`g%TU35XD[&;XA9[M5#'P[;_#H".aKBWD./lo4LX05G/m]p. +>fJG1PHS60c^uN-T$%q#s$t5.,Lu(AB'i^,EhQi-r)_/bUeFN&b?GB)#fBiJ@BHt/ +1gMq$^*t;#/L.t[1U\esW[BU"$bRTPUYRo8$:/njn%Xn#30H7V#R&7Kkr@<`pDgm8pB67e1m1*.h(5*f8p +>&(]d[GGVjZ<)ca+%on6Xs,m'5V9>^fFE`#N?!NeJOK_A*@YZ;:iQgOaW,hW3>+'] +/+Ua5a$"L6rA.a?-Q;-Z#4f>n`;apM!F-E02oZ0mI751N>#G^%\@66WAL=6E9Ke.C5ECTZPJeQB\g;aW([ +Z>u_IgaGJdf8Eo3^WQ\gJ&Zsj_12/!ru#2=D^E$R%phNR_11N1K`+?-IK9E-FPgPs +:FRFiJ#cq5`OEeFk=boHr'qN!AS*(a)lTD:"/AI1!#AD6!@)!=Bj%rA/7AR1G8>^t +"^qcedYNtgBS5b)+;FQF`53;:UlF\:R)Y=>f&ag(ace5PK4"`/P#fZ02e3r0_WH,= +rDHJX)S]pKfJY.IiH,m.:i7LE:,N#p5CbGbFAJN\qKm?EefJ4+/@DCOYL(TWt,,;4Sb?*r*QnU +J#7e"ISDiuS*^:Ps)Z?!BCj\gnou7YT_u&ApN^_<7qg2#W*Jco,:baB7gbTsNY9*d +(\fBJW(D@DZ0_?',(G,mU55Q(4tG^9Q4quUOu=p;f8jIKBIeH!fWf,V69K]L)aB1L +3/j9^NL8L`%daRKJcG5G0@6198QEh5JF2u`=oZ'9T=UHB4-n8QgS%NS)hW_!+K:cY:;%E-l,.D-Dh)HM/"CDXG39XGnkFLN03X9\V +&R*jA[FCHL[(_,C!:BfA3$3S?B,8#Ao?Q[pb3er.pN\iH4S+:u`T+=_ECSImWueX` +C]UkHTJiqXFD_9U5]X=e);>pf5k)N)4FS2,EumMl&M\WrYju,*E@kN"ra."r?-*nd +<6HYHKgWi=Oa?h"[/B\![C1]*Kc;-d&*6.&5FHYZB7CsIiOb_U#U5c_\+ +C%7b&\=SYtXt6q(d#sq".6se*gRDpr0O'i"9bYp>,GL&eI`%&AHV6K*-0SPLFKZ&+ +2F;_UV&`qEX--e>s/M`)?-isnd29Q;Jm""$'m!QU3+u\S>fQmaqoMjOUp<1!GqZ;, +McSWmn#1\FbB^+pr"*B0Ls:/_Dn6aZs%[n>3;[[CPWu9"f^Tfc*l0 +&+Safk1V5#GsY2u>*s4:E0qIP!u(-Y.81$r87@.tVB?PCBH#2J0X2!ZXFdYOn*H7; +qhkDKpttW!23ShE^n:&#J?R6"^l=M.jUQcaU$;'(0?XBm$9B>@!I+H3?9gUXM:c.u +<1/VtLW]d4#R.`r&!Y(4)S_]sMn;"Ps(a/jOH]^DJ^l2CQNblBSFE^SAQ2i0V$Od< +ZA'!$1DR^?=Ml];,6#4:+Lk`RN@DBg/?;E0VaAa0\3&X+NF3.6Jp[D8!5;*ns&CKk +fE-U',s#J>NcukRPQ.L&pF6^TJ'K)7fu-?&C]TLm'Y;1Oq(`$NM[T;hjeqo`rWDWj +qbH\qn1V(nQOkXSqNZNg5H-Ki^F[@=_Fsu1ROD0J3XB@!G^UQuaO&'88c`2s20\XZ +!WH1NI\E47!0*6$IqXZs"O#U,>#it&9&$)Gks.,6(I,sYsqLPrU7Z\T;'q$a)1a;[.?r-2XpaefW?6* +2h"NWr^4C!2uO>!!WQZ?q#@X;_#b__+P)$>>XO>8S3rAZVeu(fJpOkR$_sOW? +Ct*,e&3!5B*@6.T0D:DB:_F*6X+YCjK%Igoe: +DdE*S=sGu"/jO)p@Pd.2gAaa'em2aZp`D_VG)&t2M1pK6+huHnJ9p-:un0YQf/#1iXYLhAi5q`?,K,m=P$UugD.Kf,>J4'1[ +lVfK&.Y^J8Q%OH(O9e*45Suck7/N&X[(]/QLOVVg55Bh[KtUf9n.,4sp^Zdcd$XUD +`d(`$BS4jCc07A*%Klb*`1oDWd;A.38]9sekk%m)!ZL'^[!%Y?HBGj\PJ$fg^@Y1. +EiiY.@7TZ&[hcPoN#9F!LPM!?@5[Ia::LA^bENFnIu0[b +Lf&Pd#e8fR[[.OOQO5;P(E"o>5ik%MKn8W]dcKi\l(#s-EdC$o=6&"M/:deN,bbG& +jM/r&rcc4$28(^We%p,sBW]*2!QY"7^rq@slC%a/k!@c/%tMGC`:8Z\>u+,5qiHhjjr/@/^g4!,`Q;liM=TK#cp0mju7_ +7JmB*V>5\4jA..sH^eB)eX'[XD^jn1s.u]DR/c8['#agcs%3s,_FOjh'S+gU7<>Si +]CDLA"PrU_7"abh72g`8s2>loaMiX*KeBH)+5X()+4k)k)LB\/F/WqKgrNZ@s.$0= +6.EKaCKM<.XUElbH/0E*rB#V)h4WVADVp"apf';'(-HR`SNILD*V+sdT%g@G6f'6" +J9MSu_#N01=>@h65SP$k'mI3LFh>%a%la@0DQ9[4%/H3YK=Dk-11[M +\+ND2m]VI/nDUR.SR9oo^M=AZ@6+Q"pj_NeJ#&V6@6OE8AU?S7\,K*:mLQRJpL6hB +\Z$*kd_D,Z5E*hYMDI#!8HK+7s3ZugEC)nJ^Of75i*RdVV%EMP,SY%0Rhi"$.!al# +HK-mb;LnT':iq0F-tqh#h07'jAf=-7*CS.=gj::bfbP+e8k1i9]a3Y_g1a1HQuCM3 +V1.4+CA`4nU3HQjIg`d%&ug>JedQ6onDBW8d-@1b"TmE?W/^;#\0!Ii6.YDc6FS/raXe;L1A<=A/j +`PCV]am"&8"TeXRDZT.s +i+X;(78;Whr$1:N.7Pn6$K?P#itA\HL!^Bms)([5TjVD,1]mSFbMof6i;Zs4%"`ua +1;s2/M2N1lW;Zn8s0Z>#;Rpm#?T_;jSEe]ZN9dsMXnTi+C]3sLg?)8X7)'nGadQ5V(m1Jf3.PH+I/UF6D +I%tnuf&jVEQl\YorZ]ei+=SS:lU$P1d;d.I>eA97ceql,.Wod'gEq[ +Wu*/P=To9!NrPbMA.8S$.V=Aq!*#p(W7%uO#j*?D7re'0`ihG0\b"^;C,jM/OoRrb4BAE%7R@k,o +K@kE=&E:IR!^oIl$!9HT3nVE$:miX5o=mj<2.O"cViG-,(QY;g%qiV6cgX8bKYTNpQ*jFKJ@j=Y^fiLVjuqJjHJ(;+-kJO-2(2orA#4cJV]Q>Ulh.&[J(:!f+IVP +iKL1U'.<^?PJG!J_;Jbk&CJXFH;?X5!'COT3!^S[k4c!!\s?H8_!kdib&MIhW)qOE +gWFg1\ogpBOq0S`J4=47lZ)$9iK!qOE[%P)HiZqK$Y[Osp"ubEi@#"TMEpdA +r5s?Bj8l!+s37aqRbuc_?_O/INGiXhIWj5e_:q.K.@Xbs/9BR43,S8gB&N[l"c_`b +1F7hT9.&kf^iN$L!9oR`oQqB?Fo\4"!$D!nq)Wl<4+Do_4Qo^/n@o5c7P:1'+2R +*[EBZW)h3&C[Y.Z5Gdds2BCSAp>0@t+5"X1N1#Y0eGR'=287TZ#AQhgFnU4(MJ:@n +Buri^VOO]FT%&uZ?1(*Sd>YS_N`WWG3_oE9GeY-E]cl]FPB6m"=*^>e6!^EDBi*Ok +Y@U/L1<41#imuBD)J9-;`u.kgs%`eVN!7]4s$=I#DVq/uYP^:sHa?dKh5g1*(F^Y+ +NjL`oG=+Y4+YC=SDbJe,;dq> +-^Q)uo6$ikK9&AqEbHlZ!Y-I*DPH82BQb*H,Q=I#\:B![F#IorL5M7sV7S)8](7"P +?V/@:O?mjGZ2etks&RbU+<:I]s!J0S'e3mM(GL`'qDjWZ?b_C&Wpf`/_#/Dn?cT8! +"7"RiL;7O+b9brB!MA"5,$&rFA_]O[Ya=tB07NiVFCtUi(4s;TiT*5.L]Hote=nOu +Xu$B"cB6>lG7u18<`Gq.Q>2(a=qQ=*#igX6MJqE=GBX&GcET>p_"p"hF.MtGGQ'u! +ru_%)&j^tjU"7S6M]X+7r)B9i$Xj&O+,kWX_#iPI8dGIt92^-lruq/]o%uj86N$R* +KIu-:'EB3^,F/=3cH2cuTn!c@Wrs\!&(0_3,$-Ea(=4M7n:g24Khi:2?i_?\$b)ju)q";i +i45Ii2Lt_?,]!SVIne]#$UF63o'Yt(h*9Eds3Mebh/N;][p/k8_ +3&1#[:tt`\`^^*j@kLl6opu.]J6^F='REj_LD_?/:(VY"G^_+`=Xiuqi#aL8,P85s +3HGL\kOJpM:Hh0a!<:G,VVm;P_:X%[aG";Y?i8rIe60n:-_Q$sN:A_#+-J:kRsYb^Wmt_=9bT*PlJ.ngs$T>rY3R +S"s'qq36j6=,cs>6W,U5.Ne42k^?),l>O#_4L85JACSB"_0(95h!:HelfFLG<%kQB +!IAP:Nb*D"/@,r:#<]$pp^an8K^lR--S^%N'Q3c[$8MR-hr]'rc2m86r.g+X!)E;f +WkaJR"'ZO#Xg>)U\604'ggG>EZFb\fqZ:lF@kW'Hm>2:?4:.K<&"*LuInEnX9h+3Y +A^E#Pe>U]`0U.G<^SQgR-Q*N!''gV+.pt@bWGj +Xd8#`>>e*`>Z4[6;cYm3s)40H),l:>"V\/+1Qn2J'NOiNfKF-V.OEifkR<& +%1UL/::_tHs+^R+!h;4L`d]OpS-&O_(4c4A/\o>TQSAH1Pog2.NrMekIffVB._$C! +2+BJYKZbYg#ds(DWqrl1c=e.mWq5`HV55EoVWM+bp5QJ!rNcC/:\]aWKS7nHC*8,C-ng:OMA)PQLD.:@TsI +ZN/oJ(5@=Ld1>kfr$O&RmYIAPs.'pUE]o$SpfnZuIt:K#!r.BR(NApe=b%ipl,gj'=%VFs$->;QQuk9d4V(VPXp;U*raW-nun;LJ#8fc<3M8c<#47b +b'OthG!@8F^<#e/BR7l]4UEn$kGI,Ic@-@h:5[FR--9C]EY(e["T0W5$D8+0W.a"G +rp*0Oba,.%=tp9%K]<$9\LW:3VnA-"hWUe\oL(HVJGYgm-VhUD8&=D>n;277Qf!S= +?qjPb6.;&fi;`G=Wb()-%8,A)X_!XG1ejqS1'?\?qZ-Y!C)p]3Ob)Wu5VB:XDM;bR +`4KiGhLIq:^G5q2n$6YJ%E/:A^86HGKfu$k-s!g?3cOTTqd,M'2[\_hBTAp^lqU;l^K!]o16b1#EU+I0MYqi/O8'qfONe)";qRqr;E9&9Tl6pKF3-+.,@cfFlr[NXj$>)a)/%Gm0G4=TJH,8!5#P8LbKSPh +=ks5\)dh<6?W_&L>0 +rshqU0/Pcu0gCu#4q4V(8F)/><@1:p1aK]Y4&>13YGF:%<8`7tO^^8r0`2O_oi)b* +1Y(P[`.+d[^jh\UAKR6Ms4o4+Q[o&u$NT;2aa"5N?28.2=4(8&E.]V]`4d$aWCBS2^]gmj!/i6= +M+S1I``greR\c,.3qCja_peqjHZ@s +%4\q&g_ZEM.Q716bJjK:'7t_1!Ta9Yr$O&R$ie&u;$dN[p[6<1(Fu$]_'&Nnr!3!5 +We-.o_'LSJ!l,(@_4A^1H"Hqoh!DRfnM4Y;4DOL:B)F?!(APX1C#:&`DGk4-)(h@aBohGUZ2*Lq0m(0\!m&g7:81+pYRA8haam-L9EnCEYUKR-:.;Hi;XNG?SZ^? +4EM8mE@_tlQ-:5*7P1WIS]>B+^EW<2? +CId0d-Q1PG*_(32,m,+G?HiG7TJj#Xe;g$IZcMQfjCOKS4j#=.[fS)\p^^L-^q\dA +(q77L=k.:E+p$qNHJQcoMPgYTiCe%]UBK=qOTePA[6?$^IcaO(D9e%bdt9@9pQFUP +MA#n):ObSSm9+8FP8L>j6j5TG.lt!`.C;W5Fm+5n3\hb&Q*1Gf;h4]%"cs>3j1.5N +Cb6OB5=:/"T;?PE5>+Ge"j#TCSbui\!/Omqh#b;E5FDlTLAqb6=8X`L)ZEh=ItAD/ +f67!D>CG:YIi&-#$qqZ+hn_P8)qA*tfj+J<"'f6S)`n)nmejhP5F^=!K:_3Hr4DJ` +!;MVqdhCAX.Q;obR*jFJiEBi4s#l'J;!@%Lji:#_k#fmMX +$g/$&Ts0bF45Lb[!/!`B;CqL-[]ojstlN.%3Ld^B/13k2a4UEIh)G;7QT*?+A%%TSI +NplN7G'I]am6%Eair=#5>2]G!bAtgV*+EV"ZZbO-H^#WjE,2GHE[Rs +da6hoLu+8]F`Zn=[%!<$"n9IhE@U62#LPa)^RlA6#T>(U!rSrE'js;r!oRhprh)80 +ir9)T$`e',=T%"8%313pOUm1B+,3Q3L/+J7D]ocQ&MlYpf0@C/53b$ikVdtkW;'0X +s%p7PC>-D/DI/f6hJ&9?lh>n7SR(!Z=*(rVoS06-37Q0s)NQ4>Vaie/l; +32g>U?9^`TS#/,rk#m[BN*F-K5+GL?DVb0QXJ +,;'ct,094*JH)83T2t_Eq2$ZR1O&@u1.VX=qI>'Bu0A +U`cc:j<-SN`3/#!s"X>??3'^f"+8T8?Q"MK!6\pS761Ij`IB95c%7]0pfCSnJ&6[o +pcG#8V`W*ZJA9oni1FX-&b(#8her#/2e'HHK^SjJs%?%7_#H0B0CZ_Ks"47jr/\I# +r$VK1-ub@u%ab[$ao;F="Q\QlM,NX"J$`oF]PLNrHR5)j#oPmambNleKtl`ua9@Cq +=")V"N*;$RQYG9FbeY;h04Y*1!BgF4X@$%W$"q%R"ZkcT+$rjJRRS^`OTr%:)(,T",+qo)aHRO>;3Jbl&rXs!_LCVsor^OXm'`[XLj(L%lb-s.>_n +d,.k#^WC^!VV/_D>F]/'QT\1"n&M<]&$\9`UcfAq+,6XVOJR2X9oo+)7kD^_1-@n] +:H6NNd1@F#n7ZjVQ^6fGiq\00W.a"p@26ho8`9WhfM.2%dIFT*q2=11F4%LUs(!o'S$[?LU?Erc`CR=KVA5C+X[OWS_HVUpBr)"ithJ>\A$'LCeE +ls0m*5JWm&nd]cOO5I@\DS\\T5e-e(nDE7:*X.V"PAq0j_#L16.H(6:D#@T"lqb`= +mh6MpCXt]72i7CW4JVu?ntf:Pk+uYh3c4c6\.&<8Obj%`Ze+BhRMn';VNf_F913o; +@Z<7V5!>\j;q.\#.j#C9H2``/p<]=AAHM?W?\eFFcl`^H)^>9* +kJ&,$5@>SN*t.#!U%!hQ2R*.?rrDk2\URX8$*GoIis3sVE[k+51*nV0/i:#Yi)B<]4qucuhcnX-+)GGTV`6:0H:bu4\ons=& +1K'#_J->oL\U%Vp%ciV'Z:0CI^QSqNma +K5gbW>5uS?0lU&f%"F@+_f;UWn^]/K`!>Q=$]1$P--f@\E`BlcC0A83UkkuL<2a?p +0tQ>"K'dN-p;3(#V#X#Z!s_]`#EdJ>U1$=')RF"?d]c2YfVQ&!U*X2heeP?7X=c2Y +I:bG-s&q+",Fl7L)EA6H4:LF8k)S4"cb5BA^'S0E'XRa2_Z#>3NSEq;d$8/0=uuO5 +Gj[r_i]H\SQ!b6s:,r2LMV:Ao*jt[!I.qj8_/IKP^T.nEORN43\GuS.(]R9Pr_LGR +625E\'8-6\]^;<7EaP:20KeBEW:`H8j[!R[LEOQgAUY1up''Hg3INOV?P5Q*'nL8;I7Q0ij"MH(*-.g#59?H8"Gk>6! +GniAe,+^n4NZr\/9qFnqJH&-&@>IGjkcL%tFVA(=PMW\TrllD+Y'"L6P$d5rX`Ze* +H\pD_Js_%=h@.4bSdVmKD$S;1ZV^N#,bdB="K?-uec::"d+dQ"5I;5KfXDhB#=-6G +C;hI#Egg/p:Tmu7[B-\rel_=Or#Tqe,H)7g%:Jr^'9OC*hFD]!=u@c7;/9H#-q:k, +-iD+78JV"-heeZc$^Lg##[oO%UbscNL!,F@77uSe]5rVX^;i[]s'sFn2J]go8Z0me +Vn`Eg6Df;5+6"&SU1Sn>YQ(ENpoN*Ne=W^QO6,t7o$*5a_bZ$#>Q+,>rRtoErZ<"* +2d'(c[erU)>]iY49hJl+H<@R,Z7[H3`Mi.P=b[T1-6nCK_csPp?'&s^'.&F.OTX:P +?)'YN".5?"@@ +N3bX&[!G,*r3-!u#aFTdT)LPnm;Zt=PITslae6e3L5pec^:;Bj7AN:8tooE;R.&03t\j7 +_gZJY4XZ'jccJqZjiGiD0KbpQG@h1MabYQJ;%4gY91?$PN@Y(A5`(4rVP]Vm.%gnV +Pn9L:4JKM^!<7's%6ddgTiLEW20rH.JR3,bJEfk9`Y:nK-(r6"!oY)7"O61I:fA9C +!R+^T__pMU3e^^*kcWXWWj&cZ/=c8a7Y#[]PSsYo&7dood]PpC-?Bn&TU]OnG#Ekf +@%+0A7Xd*7i1H@Obom3*OHY?N?/WI'V[6`#?P`hHrYOf$M[^Zhb--NbMYUQSGQ&C_ +^@:#g$?3l>5g)$X]Iue@Mj:45+lq_t=9',B!/!445bZT+aQS?R?OY.+id]1%d!t#h +X$qbi*A:d;c;t&H;--"F'nY@.f<4,rWeIu58Y0,N:rsgl-rhJj[mb"#+pp4qqi?Fe +kPV;Pfu.%SaEcdhEQm4@FDQli]tnGfV_nMT[jWhT[.]-fSo$so(;11P^WZ!#V0@Lp +S9'Gcrl;,>,Ci"*i.s16-CB=n)XRT`6'Hf%A..R`g$=_gn:fVYKj34mnGg09+nppW +HHmDA&PRT[?31N09tp@kErT4[cJMUu_#IbN\,VS4N;:6*D_JVuaM&`*_8#Y/8;9VO +ikJ!:`?W=l:mCg<$UPT%#9q%fRJCQMbpt9')K'*nbq+U;7kkBC7ZlS;7,sPInm1V! +a3^)IZIR^f70#O86ASsi-%Fo@4E2nl6*-8ET8BI@6t;&QdKqT2blsRfpI7(E,=19'JM^>YC]"[P(ICg($$'uS1aU*f]%(WZ!&<9!4G8m +%i>QBca"IdR<9)=,9pSRiZ8U$N5ihek&K96%"HV4V0\/!#=>R*ci>^$?4pGGB"!;t +&.K^B\(P&BquJK5Pk]nsVD\t:X3c-6ecQtXNaIQ;"8j<,!Y5H_ODipQQd.J[B<%49 +jmFMHhL"Yd[:UKTs%1!*PP*udF*c8t=0%C`8WB`FNNKL>2VMVEb_gSOIPkMcm#q$p^\tWn=Ok0o +U%l8Y[2e1CaRO=F,daCTc#fn_%Q,\2m?=U@ajZ?%s+P.(ceZ$*2$F@sILL_!G@iTj +.g[X\d3%;=OT5p?0`U+!q-U;$K)Rk3/(KIU +XPNYoHH=#WVX@Y&9*3h3hV.Y5J;Irk!oI!W4b6kSX<0 +nXSrj%^poS`34j]!;+NkGsnJ7V#UYu$T'uis$@_2oAA6s#;plrSH"?DmdMl%AV#`` +!Pj2,#+Ptu!WG)?$=nP;)F$PP+S\[P;1#k!h$ke5n/o=$ +Lu!7T=TH/$1iNHi&+TZ;G8U+)'JosF]T#2*^-4u(gk7:c80RPr#QDK%c/2')Jc@\5 +!9tW3LG"5!hhu,3b8/Jk0]i9ennlJJ/Gra4L#n(NC[s0A00`2A#*!Urmu +(CVpXq&moT.)bsYC@RBf4XAqeTG.p1d6jT$i1$<2/`*0ZWlu5$Y]AD4!@:b,],K4E +Xdjb\9=,`I?Fc3Bj3=X&]TJDniu_ +5>S8HVpkbI8%_G;*C.Z`=O"?25JsQ'rf?juJ>7#[S1_Y[3nN&%CRfQe%5_W=TY\VI +;/uhD#RG*omuJDabgPe(63Fc=b.eQ_"=!kkn-]Mq,?O +fR5:j65sBdVZ?VG&W;ahJWBp5i>hn+!<*)u0-b+I@cjk(kASnOW:L*nJ84,8C@?dq +o2`2:URQOIgA'';7aup"#7TisRSY,VNA\;`'\R:nm*t6Sj>g0/Q#gAnX0U$'Ld?hX +:*YLR_Kts/HOaS7LU,l+knlI0-LHH\+-I=_SH/[9:)gk.`P?Z0$L`rLrN#G-We!)t +>qaVl!<94bR2o'Z3aQ@i]ZKL0[(!foC3brpn15$#s2I!c&G`g3jtutse5A)\hAXj+ +&lQK*[,$d7IiJjc2uaEj="o4_80jhGA3WkCa<12Ls%6Sf6rW2]*/Z<2;]/6i>_eo8 +B7tMjCff*V'bn:&5=ah)V=oYYIDgU=%0Cu0-i[1Gbl96)5JSAFT92A_7!:&B"r9I[ +Juo%V:B5S=@K&@[!hqr%[oqp!rYK7IGPjsBT0)g8(eI(1TVGNP:n7iM!7uT0ruq/= +!WT,A(]T'aTE[1moA?A[CLFKnW?thWUQsY#1jO6r$G/d@'.X.N]F6j5L'"@r&!ciiZ0$76d$C&s?V5,V>2]Yi.)a841 +P\%#8-B:Ctp-QRsVN4%j+;3EFFRO632An+4Pf>:I'9F=2O/kN9gqIjgn-N`8PLQm2 +m5SSI>QbL',&e/SGg%00Y$Qn/'&.ldi]q0UrprNRQsW"`!G#:Bg6;L/PWO +C_-Y!6[V'b"R7eMRTXCM4M>Vi!7cSM"55[o*>&7G,lfk"4q$^(&;:!i!GIr6[0h.< +:9FflK>:j05&ece-/_"8$'5g,$(>kODMO`nK@L!bs#.K%O5#"2*k;QEK(K:$eq:a> +JH';L/B%RN1VeK2T\dX@hBjdZWtnJG$V-)>9@`G8ota/k`d@+>X^V(4A`m"Wq+'38 +?J9Y%3i,k!JWA]Y,ML]=DP_e-.=3\MC+Z`>;q?.(4E_c0FW*/Y*&_aIhRt#^FVrPN +,U8>@n\u^Ha6+K$]#jDIj`R:V&A:Mln<8H['A4-!Dtk`,^O&X($%srdc:;a;jdTP8Q!WHkr!<+8_b^9a@)HN]+Ng`N@s,!0Tap?L=BCP@*s#1L(1btLnba&rDCFZsL +_JVu"'S*]u+uKu7ro5kFC]QDm9K*>ej0Cnh4r-?R +#Mh@D!'0j^@/`+aCWVtDR49:T[aHNriU*dQPo!Jmg)F6]U#$U\%k.MB)ucU2?sbBJ +jF9Dol^A4ZV*u$^n%gQ+aBud0p-h?hlKHPUshl[N4LRXUh +WfNm/08!opLWnS-O.V+:+,5?dO$^k[,m/LGDQnXCG!#18;Lg&kr0KTG5b>,UQ]&Rj51T,^Ei4F6[Ntk]iamIRf.Z/m>$L^++dF? +OBR,>[XBg84VHBgMJXE.2NKQ8I@92Jf_U\JIEYE6bV=G5%3?_BF'4r-8/=RUc/n$U +(e^R1=34s];0+rlXFHHe^D"qeT3=9u,FZ:)9n7coVrBF1!eSL#1@;.Q"]#d/+$C71 +Zd0SlY'"=mn/pT'6>bIgp$OTIf?(.!oX5JMl2h*NrsH(ILqQCpJj=!V.(^4'="o4p +@Yc]V,tr)V@5^l*Q\,IW,7rB-c1'Z4791W_eBi!Y[SKp[`;C1=KAZrS!J!Bq@Y"4a +;)*t._#bbY#P+WaTqj.Xr(dl>$G_/\&S*0js3ZRNe39UH-)b=+LCQ1OBA$`;(H^[g +JD"4_:':ML6K^UHZ5I*X@.IP\$'3t3c!CDMitpT#0&J"ZS?(e4d*0OqCX)ikh=6Pp +NVC"ui;Y1jc3MPWLTIiTPhoHOVU65dV%9cX`XTmu9ICQ--If,M2/gZacGHH^,N^0$ +3"MQ>#p"cQ@m@=2ir9,Fi4aGH?SK.7lWPOY42=MF'(g\^i!rC&4C/8uRj"u0J_0^j +_)DObr7s$3\mOWB]ZLGd]uk5FP]Cg#a_s<7.Y=p'gRpU?0Vlfa!2Tm@Y(MThAq^8CWqPM'9=: +lhh`;;LtA'OOGsbIVB_(%(00>S6VH&rqFZ"\=ScWO5]Q1[!3Lb!+5gF8JEB2pW*3P +*^Nm.1'PPnIh;YY61AXib#8"`UE$*H(:Ja@ +X`&d9LTgd9@`SWChB`@J/A1uZB?_OtSGu^Q$A/;85[l,eg'!+QaX2'7noG0P\HVLh +NeAO%+t#$(&C_j]XMiY[`/J#Vbe+IS]a>cC#ou,6*B=BG3t7fM@@4:^:tWN)e@-IF +Ysh/u_2o&kZF`BIK`FT_+gYt?[pdgnI`K4jN&(_TE6.<-jpk^R;1"(ZiQK!UD8?t^ +Ij(Dn%\CD"bsKL2p4%hBIu[W_]]18NoS>;N`ZMsYc2AKoq)?hfU]A01ck-8b*CtHt +)ED$pd$"'-*:Q2c*YIdl$iEG`EfXjY+A@,!P4gR\m=);,^.bG@!WV$\:BUX#q8`UiK]DR-_#bbG +7sgt@1[ouLM%fs\Jn*cdJRE/VdCr6A!;J5D2m6'is*#;cX/+lp.UkRIohQ&__pdS% +4/r=b^]K$rpja4H$c)t,BO5=/"8kHH%\T$&oHju*i'1[.\S@^6K1GHL"a99Rd,H^I +5sQDE5Yo9("]848o-Gb4BE/KN,GfRH%I(P+tnCP.m:V +_)ICJ\,!]jE]Th(JC%_;n,0=I\]rGVRU0Mif\c%`h<^EUifi3WDf6e1=2.K^H(qS$ +9?M^JJElQR<]audd]gr/g#R86q@E';!cgt`J2Z*q +b!pH*Ja1&NBqJ!3s3hnKM&iDM&KnGW91/WLnh$IYeZ@,e[TI3_G)P+3ArpF6ZI&$1 +,u,C3L>^$^N-a!%g:nOH/mt>p?G%KgpSNR55QLh,62*JD's*4.5Fn;9%`i+0s#C"m +$pb!O:s4lT`HP0]$_J)6DIV`]UM"KXQYtpNM#YJS1[PNQr)IZactn3]DZ+8*pc2jY +A,>'&gnWo:fl;:d;e19(A5%31F\#M]'Ku`9>mIZdo8'ZpE6uNt"D"(p(Xfi%)/9lo +NcQb@fTl)H$JJPUNU,A[/UfYJ+5S_bdR9V-S#+\1q,`UPPXl7i*p.A]]``2k.G2@'HfQ!Q6&hAeV.8] +!T=94mNc%oG'0Oc]gN2m6b>K=cH:XE +RTcJ[JEeu@HL2OJ].C`t&ZReG.>?FT0u#a,/,i`iFf7S/"1O,c0JT+-iXCY@pqTt) +Q=F`d+93?^OTuQgGrg0+qfWST*TCEU46Du-$Ws/-^r]a/O +6NKX@!3gu?"hu0_<0/X8roY["+9a0Pk7kl='uoeOA,(J"gKJ.JT![s:2fpX>]FLF@ +#TH!oNLb_r?:QXKs5C/":Gd;?*Bt/F+*)Z.rk%M,X;t@)DF!AKZP2>Jck`Tp_ma'H +epbL(4lc0An;"0"kW&(2?ka/u)`e5/1qH;W+o$g,!;I(+Y^fO.BJ'!K3dW$?6jpqA +Ma&M(HqmfD'MiNM;B5\93]N.iWIC:jq/?1+@_"-b]-!Jj0@]P8eD_'l8jJF?T_+"k +F:WB&LQkmQ#e#&8XH,au%sb#WJZ2H@=`7lhN81JDiS1TY:XXO4s'*V;NHbO"s$8bo +/"X\rof46&[92#Q?B<&G^nWMr"m^PkI70f/C$bQemSZ +s&jj$%M"G*&]dab7'"*ks*qg;7-5np%;Z9.Dm7s(\a;2%./o"#*r*LeC.G>06(Pg# +"\/Fl[2/O%j'/o`DqY?'A[\eKgV>6WG(inLpkoA8'ZX&U1WB=U44\<(0Q00mSkra-lPCJ*^T+LTP6pKMb?g+]f_Y`4J&JB!K)bi%\NMUO:_0C(W:GRBHQ-:eiRQe2Y7(P` +8oFGtPPmdfJVTulRAT2Q1?W(Nm\>$:VZ.3Aq("iIZ:p<-a0UH3-ZM/-@K?C]c]T<0 +&H;e1'lT%k(]+&Ba^m-dKb'Gco\>RRHVKI+.%-='oRfs[BUkhA!L]L*Fco;+M.BFX +Jq"9i58XD9"?.GGHs.Nc/,7/HCbaGH=BZWQ5TCZ^r9j&%(4uMRc3OFM8ONpDO,Eru +Ee3'ho,k#4:J?hgUI0tCs,H)3'9*R_56ql&GQ([C-rhaH:lU>@r,9s0^Z%Id!Nq;V +"54b`a8C.\+nZ?EWT_hsXVpZDb!aHs,[*[(U%)Olc=L?7'B&=_p;I+.]D1j#JBS-# +[K'Mgh&8_7CK_,k/LKCkZ/+N5"lMea`IEYtL\[!`s*S15!B.R0)Vfrd:WZ]DeF9rsuu\RXt0\JH[G' +$^4H(+"Y3i`.NTT-jd`)-ph#W*``pl59!qC&`*_ADYl_PkG#5^&G1ag0-3P2J,&AU +kesWC@%0B"-lP5\N?&03*q=QcR&pqt+)nj.!l,D.fKBfGn'aAlW,3+Gmo!?83W6aC +Gjq5Y(4o>-,M/)->jVR_UO1\hE/Y0Qa=T\T[7P9.I>t$>1 +PBMCMgA>$XG8;uAs"_LcQRM1u8Do!_]jT%X_.c,e=<9l-h@E3NJ7tRAp,E=\!:^!h +A-X8c!T4@M:INdS]MoE5je9cj4hof'jWpSp-=e+ks'E5)?9EQZR_4n\]pDEB%S$DQ +Y([O%_GR&>h8DB/UL9;fi1eSXD#.GY%(o4P[!%!"]Qa=EdYZh5?gm'aCucQoAQl:2h@D2 +:W\Le#A(r<1&8-gBGke(&AULfau:W`0/\o'M=S,FP>`_)/Q$&gJPT\^^iJU&&cX)B +a\hha"X*e[rS@9VCnR"0WMOnJj8a;^MZ4!6$NU+00_9//9[MTYb9[u)?+BstIu^%gVrZO] +6$>+E:Wp;,rrX5f(?Rh.Ijm#II,R<]:9:WNJ<&AJ\G2+GIK9BSpnLdE:B(+mq9ouS +5j8S=G8B,'"2?W!5D&oaq&99\NF.g&<35aGd=HL?ap_69F:c*-88aPSm`Y!N^CC]d +,=[1e(2.r#WL3^a`Le?Y313j0K\@`GREgZ5ie5+Q-t-+h<*P$$1pM9]Y&u+tpJ<_6,@3S?h/N8jJ&^?^ +3R2bOn%>X\gjQV.BRrIT/801,`@SF$8IR1_AnK.-AnGXeZ6Y>Zj50['S'4SRPF>+@ +-<$+s8u:[RQtLhcX0'(]\MI1We5r9sX]DK6s.6XLqn?hHo#J1%Hc#J.?IQL5gJ,#o +6`Wtt*uP*^7h,X!/gGm2""=ER,2th#:Bpp5k!4CbT320g#T:IDGj\5?l>L+cIoYk8 +-2[c@s5:Z=oHG7P:K<`.4Ru$hlj:P,4n;0B'8->,)X\_tR^Q.`[S*'T#PcWe'CgR@ +(8V3a0F1BMquaDHXjB57p+)cWO7$!IqNEP'ZY3S[ +[a=/4CF/n8MKZ*Pp)SB\WoS,O`diJJ&GR$"s-"5kXmQcNE>p.TS4?$3"RG.n:bPQSD\es0n6# +X8&Me.3$%a*I^PH?h/-91J+N&M4O4?h@=?`OEDS$LC_)=cTLGG*V#a@'n*^.0QH)6 +E?ZGanEf%Um=KN:H8hC@f'L$=A$QW,/XO7W62k;F1'me"H6+YncZ<93 +1Rdtl\7%G_%Jo>6#2(T3W9dmg4K2FE1/BL3:c#1P-NYcH&dm`7#A.cHANZ8jW/8@g +>\u^FJ)',N"W"O[]s87Y$c[R"r5D/tfs",WJM!">VrZhCIs,dAqN](AKs%/_$O<_]4_ZCDL +6a,NAbQTE]:U0urg$@80iENPV[?fo/68m]j#QJ`:r;9[m-.tQ-"dfIlZIq`KR35PN4UhJQ +k.[+9K)b0[J6cT>YU%;i._tkN>i$o$)O&c)"nf"@g=JL"p-g3QNW]1PIC/YfTs*YO +HdUoB2sp6dmk_]<2SqV$in-rs,\+:Q\0I55P42 +@6tFUh]I#ob)HS$d]"U=)?VoKMT3INQN']hl^-@+miGJct%=n/J&Z# +g:'oiA@m$I/;WI:9OB$T^k8tF"r]r2$fJdP0Ank7;lD4/TE3qZbIJEI_2:JCillW+gj9+UjdDA$i?joN\I7jd +r(EffK7L^YFPjQWgTtZoe@F\l7Amp@q_kOfn0-"[2W42F&'j)t@TYhdU(l4qk9[gf +$@6%np)+S:(`%)HZZGH?;o&EV6^jChC66n\OSS.&6QM,n0DUS+,IJVBPd,u552 +r!P?6$FPHnZibC!jkr@'HZTA+I#su2!:C5:Jr@,O&82Rj.)>F3rP8G"]ng.rYZerC +$GGqPqm>5,R.:esNoEK>kc;QsgHpC=St@/m]'J3Q!ZlsJg<]2>^4LBsTT?jju(kUunaUm>^mlb!)p>74j:cOQW_ ++?/'cnUEhM`W+*?J%ToDJk\f\=8#4j7@\idnlP?'n5o/[p[LI$0@$(=+PN>Ds4lQt +46=NX%rkg!:%'XmE%5tQ,@Dq5#G2T/O`P28oo^'!*ZL^8Kd +[^`i-S8r[t\TP\bV#7-RfhKN'OYYPOq5'*3HfKl`Wms2\j="k`Jc]VjSaP\doiA1QD +J:7s[r+EtlZ@L,K`@g2FoUhrDC/P$rnW?>1RWlmV\k,cn:/UaXI4Ruho>oGPbg[9% +CUi?GplDIJ8Iq@b*s\sZ2.-2T?+J:1FC2OsSS"qN=74P0DW?5ds's*C@n1&^'`=T7 +N.V(2hU@;\:UiI<[Un'rC"&$WgSsAD.fSlB3ro1aQQEpL_EAIDjjMCRrgRN$RM_k; +X]cSAGO2qcS3"H87/2<4RVfZos54qX5AaF[@8sW[W8Fgnh6q%PYf(Td!WO`A=qZMm +YTERUM\1R:EK`Gr3*q0I:N/W9JB-@4!ZFGDYK%`/>l,t][VaoFm+Z[HgU->"Z0FN[ +iD/m!7R-ZA?22^:Me>>)Y4=AEobm#\:!h=2d,K3Cb*?H/;r$e`gs1]=NJ"H8gjDoS +rgpE=SM7encoYoB>5p^^oW`nLA^OiBkkfma,LEl\ +:#R>1PY>FT-c,g7YO5-2Y&,gQo8=\%0ufN`"!?GPG?+d;`Z5$GkfX+]CMk&5[>e*nWZm9*K!EFFo";%)j$qSBB9(]d84+BBM78&,9>q%me$'P^5JFVX`KO[W&5 +WXQefFVP@uZsJ$tlVLGrYQ;VOU(H=6@Go>A&;54+-HY8^iI@L<,PJSEiD7T*[oMr_44KG0TCG-K-;9U%OoMBnX)sa=j8WE[Vu$?o#l(Y3 +I#%`UdC)Iu^Z3(LPE1n,[kW@nWAIVrpogt'[#IkCmY +B+BB;LkDTd`5`nX0JABj.#PA[NY7XG>B9$S?^FM\*VbRBS-loP7a24 +moVCg=LTMS5'@u.EZ/IM5pA/FmH8+RoCa!BYC$^hrGlB,8)K=npNs +j0)m<(\7Ci=%+!VP,(=*+SZ38;]kf\htKfUM#b3HO_;f]NslIN=?qV,>Ip\IL8K=/ +L56HC%55L=Nf^!t<21DCmG3%>S%\>spuJ]%mRD+!=iiP8]B:BtJ++P5J+#,opn'U- +IrLk[r*]Vm*`W&-,"'r>4FCPg^LGbVrSl)Oo@L#=&**](>9=F$.)"Th\a@t[k1DD, +gH#RkfsIj5G6%*is0b9RmAdR4SM[L>iOu+BA%N5D)o<%4%J8WLBp77>rk!==(2hBn +Hc)FY!9'3rH73>3gjCj-F9:tsUHQ]%3dnG)?%[G]loU>=bRDX67d+/S"kD- +^/LBT@ir\M+([u!7ur$e[QOGr]a"2C8'%:gBUci8YaI@IAbH(;ZT$pJC*;X?K8*t9 +#,U-/$9OjB[lhiNI[\a\1pbFLLT0NP`p4uYFkZA.3cR%21$+j]asU%t3YC;"SpCB* +nlilf5N#oD,cF+l8ij!ITCF")WXCtUAo%1(46VCXBk@-lKt:]:*Q;YSJnf5Cm3u&Sr,g;9*AjgUU]s5`ggT9,#iTXR7sI,Xq![\o!qt;Aeh-e; +s-'7E9J"\KOsQFP5N70Y!iV"VJ:EI33_fX\1YQ(FNB8cZsO. +02KX=$KNk`ZnBV-@MWpP"^'T@!*47AjKV^8S1%]eK_aI#%jsRm-oS9=Xh#.BSbsb2[:g@VhEfs)AN"lj*HFs%5:-Q,br;7(Q>d3*1bHs1'R4 +2C7>58-(1BghJ.@3o:)>n(J9o +4,ohYNa58tcfJ*'dMWUH;?M^B/O9bLi6\/6r*SJCJc>s5<9c]Pl?mO)F(3aJADMst +J&Cp7(;CIOs,Kf4U?+b_JJ6X4nGdC)J*joTEIFN^=1;o9XRk;ECP +E>ao3ZoI5'\_(&\tlQA%td6 +B20*fc?(7\Ft;AaIq\,,)pO:D1N,_[%rLf>)?5g#+?ie3fn,Qh?!U#2-@;#5lACcd'`>hZYIql +rpMgjj)6lI]3)AC871,ZB[o"XhQUIIpWsELirpS++'7qRNein0SrsL2hG'tg-"og5$T_&`)%s`PY1erHk:>@HTut]j=WTLC:qIc2 +F;Q]U/=CeP21"7:[,KQMlT'8:ic_t]Nh(ET*kRL#4,t@C%"Ia`^6";D8]OROdjMlY +V]OkG0)^,t?2N4/HT""mra>isJplt1/bA*f@6lu?E99=? +occ'd-X#/OT;2^dA2UQdqlg'-n3>s,:\k1^[/40DpH?qGH"O"%K)Z_RDG[p5CR1hg +.4t:Y7ulEBguH1Y`1NZL.9+#sbE[i^;3JH+D* +V+Cgii'2Z+/isp(&9KP;U*Tg/T@JG\aWUQfT)jF6!>,1@p)s@lFRNMBD[6;TXdb[E +g0*B_h524_s13(=Lg_`GL01#$r6r:Be;#DfK%S@S;l6t/B!59hNLR@ni;Xi=-u2*; +%uVTDEUDY(mY,F-gQ6D+=LQK_>;kiZftLBi_9<(c[jQt=]3,n-0CTphm(;srq^Ebo +`IhHs_R:JcDXd\Y[f=d$m"HU%ZLGtcktF!`kqdhJ +1NVeBF"*M@(QY0`NkG*)gir);F6u-](uBe!'p]\D9Sr) +fUr9uJ4sUkYcRF6K)`\?UXCdTP)`V_m7'O(qWWP1CTVi[?8oFZBhH'f;QWu!Q"C0o +?`"QEVA!:9)\2l1C'?n&gZJY8r$Od5gd2"FcNO#1)="LIm=7P%d'DgH'a@Mm04P@^ +!cmqoq+j?cocf=d,*39k4(S'h'YOk_.1*B&%sa`gC6BZP,_4giGWe(s"#C& +a+WpPT/D+kc4>c?gmh`@MKB)(q$6pM12KS2Q17)A`G*2`QY\I-MBY1Xi'%0ZSRX]-d-Z7_0G@4g_71"7CC +"b3I3etFG9\N8:J!qr\T>a[)%?"!bP'Mbl_.YUfHKMuldD/l@/a+("2_8/KI`Co1' +S,P5@P/RrpKe(:+\QAf^A/tV@OmF1#NuYb)*K,X_>_Wc[BpdMW9AbS-s+MO8pAZ8+ +485>Vnf%>^1'.hckI8;0=b#r3bqI[dF4s:L$C$1P=uU +U1qRA?Y/PiT(=N4B/a29X!%FDaVsdTWI`C^\bj=1qrB,c\SjZ)^WKSP6mM(pZbc[+ +T=km+]@.D.4V-QP".tPLhGF%N:XVUkF>XSp!eC;bCirh^ +p9ecE]9c5rk)C:@#TQt@!r`E_4c%<*+IY4g3-I"Tms#r+,Ydas0$KbI_gO33+ku2i;^28 +D>F>6Dre:g'Cc#9Y]Aj?F=s&XRIC,ri;]_=bqJTdr:uS)E#uK0'K'3oV`pm-d]"njH$nbPrX5?G([4JupXGIMk!D-)hKSb1 +Z[^l7n&Tq8fPLm#&aMa'\J=N*TuCC)-9CO*>WZXt2eDiSh=Nob)gkfArM$h#=[A*g +q2"N7[qT!9/q\Z5gF%gtr6ni@V`!ZaT%mqN3'b@Gj@oUc4P*n0r_t +`&7[n4es<181g6-+8KG^8FpqTMP#Th)b*gG`DesX.aejKf9>=\KbZaDJ-G$"#*p)p +oZJc=6P<#i"U/?2"_#F(ITFERpA'0Wm*mLt!3([l4`_&k[h)6Q?5!$ZhNK)#p!-Yl8Z2rWjS'chNRZ^R1Ke8am7c](c4ds&C\EjFP@7dgAmV'@;3kfsP%IX_DF`];(kEtHa*cW.=AP/EmFAaa6VVF]82fCU;3WYV:QKSOH^qU6 +Q(g#^f!RWkSuiC9#c_B>l=*.=0qQoMmdL:R"4^6Y'aji,=P'iL.fPZ&3L9r,h?AR. +7F\CBFra,.cQuNAZIocZR7$f"?GJ*Y4(S(u5#^W.1[dcmH]A3?%fM/8_pn/,%10lS +&sd!]^h!1mPEc#B+]-(o='Y3M$P^h;W4pB'"EMfep;)i;B$NGO`C"aq`$ +4XNC?bkrqsqVX-UUQ\jOB3FAh7EId+-N<@to"ZdKJL'?>-ZoId+\DdF.ZbI3rRDMU +HY.''k@o8'CPpR.fe5BCgk%s.X;pU$l+C&=(TFsLWE!tgs\d]d^B;Yj) +AO4e>ft16Me#$."Y$Di\^3/_sGNl$r#k`f;"NK,W0mLNn=oF4XqkeefU7`C]HmPFEu7p1,f;Kl,SAWmUbuhs-M0*dShoWEMT>LSjR%'[V]7B*Ro,\LAFd- +bqE3Bm!h*6oBV):A0k))BC2;1oMqJgGG-e:J@71)ke)-WmN!>T>P'rVAc?6I$j9:i:4:3\=I +\aL12a?BNrM"[48M=YTm6krKBCCT=(?A+S.$UZrTroZKTcI\EDkt:Q>.D!0-HUCFV +rB/6>N/L"2Mh;1%Egm\uD6CW-a3Pr60$':K1Od(G^_V4K[\#r0&s[l)rZhDDXq>WN +!8-F0g,'GD>l81&cO)D#'5(`#9X"M7+i'm5_LrC17@UQr@9#%ZeZi^DEI^:BFb8j" +oHkX=]oFndodq_FgYT-hiBp("-\C%!i$sHV*=7tAD'-]"a]1f665:*L$>p54L&KtX +7/fgRLFS5=Wd%i1m,/-BDmt.L>%WLlAq^Ua$3;NCS!MtWJH"+$rkO$6TeO8H?#7dU +?^U++<:N1+SG6G2`RW`'\Ro_.btIPnu$rj"(0sW39)bKJeBHiB>>?`fT!dTSIDj +_!ZA(JR`u4D0_?j2m^r'P=o&;6[?$r>6V0hG#Rq'>68bk*TpH@iD:9V>T)p**oTp- +mSXiHlOHWnNb[8V)VFX%55$$ZP>!,55Enh^:bS.Q^n:/sb]ApWGrZCdrrbKG$2Q;+ +7]JXFnti^a@X*sU,H&@FNrOmCh&Bscl_Y,\ArYR-bm0OT8-';%T@j_r#eLQuM>tqr +9cpF1J+T>/8Ls59ru^b1kWOuW&/OcWC]9OLi`BKes3NAp0pRRR3$5Yo\R.I35I_+2 +4O#JSP:Z$4O4='p8b_#'mWg)Wfoq_M+*^&$56_',s2bmI?fKU7X$(@A;4f7E6= +Y6".MYj5W$BN_TVA"p-O[N4;kMIdI7i!%%*@.i.0c0q@\Qi9WZTrXe![P$Q?0&p"t->m\tO1,MGX7X90FWrqjp$@=IeI-ZQ7fDI&jH+1s.sN,!n%,'#V)]7`lJ`?WH%9V +:P&ET9qAM'L1"5lk&4A_&,qWZe042IGui@rT9%pFmq#'$Sb^EEI$3!TP7.h,r.jS1 +;ZM=2Xa]9AV[7nR],+%]cf-FG7$MI;b&nr&@]ck4>q-*@C&0(@O1j]pos5>,T;:nC +Uumr>+j&/sJcBQdB;qJsnp,>B5t'DtLn^f)4M;#&5d$+Ub1D]Q[kI(U/q"Zi0+Bch +$@,bk-n(0]Qce^erQTE^"Z_$ZDBf]W9ua(\OAq;miA2d:c,"d.p.=fM&c\&*5PVGK +r:#(4ho_;rPD5M'3)$>+/r;>4M_\iZ^j69m:@bT>qHLX)0RoR"r[s22:&?UT@]URCWnYcP9[$NZD^;1QDB', +Js'XFi"$t=-qRkg+bZpA:f4lJ@2rE8IZ--P/eDa!;IQ@1K>2F,jde-EG:^O\\H>eP +Bic)7:_r"p*pLZRYBQ\BrmA+K+-<[cG-?o!W.m;2=%#."`jc$G:h>ka[DM$JOB6dZ +@Nr=,?IlXOgUH9-I,I)0,+kZ0r5co)atSeN]m*JHp=+^UhB1/3-Z0U-p[kH:"D\8C ++`0^`LBiAu`5^")[Ok[LNSYfWLGk.X:TV/mf_(fgp*(M:[-BcXmQIp!3,p"u[aa8Q['_SUdIc2$$S +m=>Q@:Z*cHq4U=LI8TQ`pQPn,^d$ik\H&pce48q0RblsePbT\M;0U>dF3f0nN;+K' +m3ho[(@>IU/mW_G;>nP%I8^H2Xjni+_(^TB!5+CT8GBmu-d0>OSA^c(*-%*J,'A]ktkPoCNB]Lq`0,l."/Hm$m;?Sc9kc^k)F +r(dhWB3g&eQN,HJJia.O_4T_:`rEpF=2g5iQ=>Kpg9X]*WE%[ +IlqqT=35pmj*t@1J6BZ0ps7mEps3h-\:P74rr`7/k(P)7)9!rS1\fkh5?Yej.mHj" +W)+6/"9(jfiQA1[F"O_\NlEDsBcKBN>.GJXUFMNBph&0^/ +)TSmL19!i$XiiPg. +!5RL&,1<_?ar]1"8=,bn;/MP!FgP4MZl?LS'BF?=q(&4FCEbmtLA8.N"Umqc-b[\> +gfl\L8+rb-#I;H=l.D^(k^1X4F0Blen%On1J(QR'#uD-3D/h]NNH=LEM>qf=/:_:4 +GhOTO6VIT0hi#MKSH]SjqY%`dZUV`[=4"NqgA'O)Mu#Zjp)Mh/KE(D2L(Am- +:I21Cguhc'elSKO/!'L!YNZ_JfRXD^Lqje*C>]0l($fHc).EHWbM\7Ho=.*:*:M^@-10,h/$n$9 +/6W7K2g`#MhLMgPn:q0D'o:,-FQm<5hfe3i[6h5oTg!/)k<-QTO$A6r&:'.3%pf_7 +?fh+f+o#EKCKn&\?U\-Alo;9;BDb7t6d+7KPAoBJT[iAD[7gOb9>3R_bB;>V>$NNLchBJn#DI]npSA;8rcB=4kXFg87i]64g +rsR2Ap\9mJ&GXQqJ&%Z`@LgIs@%*Y1"VCSb$L3`kJc$5[S(*G1WZ3iH)_`f^Hs'5* +f?7lSOp8>XVRPi%i!L]:UY]4HB=&LdE_6T7gKnGK)5OojQ;F=q;tVDnV#Z$qWFf8[ +'+4(6oKkfi0L%kJ1[^BPbQBfBs*,eZRp#pUBa<+Th^>,%J:&@@ebo(bF7j!M!I6^L +q)SOFH4b)?1WP,TpF;>!AMtj.r.5J'fljt(8`m#/ +]JO!WEe&31s8No8<(UIG&!]2VWp4I,2Z3 +/,g+XDg-R-*W@kK6V?o>#XJBpE'\1TO,:]f8-T#Io0;`:ebiG=cL.k/1AKbg59bTs +IjO\H_$`f*I#'f"SQZT@5=mE!aC!0!%$FQ,-1IP]6d*fM79GKG-p]R=1B(9jMIC#G +bEb9.J\l%e`QuTI?;-SHB,W9X*%l[H4(uerY0Si%bMZBuR9-9UbEMbC!`](f##Ug3 +KM(5U?i`^$S78uZ+PN-FI=<^d2eETS1[LIK\M:?WJ&Kfuo5hm&-+ +FD5ZC73l#$Mpb7JbSjb$4gsH[MU/4E@;=X#dCQmfYY+YU;VW5n"n%bg\]gE;58?u(fb^KDan(_"?nn6)8 +m1u?`G""k#rdU9`b3t>Ynui(`hZDDk!^K9c^A'6dMe;IpG/plNcts?l?Xs!mICh%H#1=+<,@Y#f +Bu:UmCcdse9o.3uIgCN,Z13K7d1EI*nt'nE[nilDh5Y=Khn3gXK,<=Kmm6G=CV.#\ +>7S@4%UF<+HVHP%B%Kes+,A,fldcdYAc,?s+3.gf:iPT5l-t^Mr0@<1L#;0ls4Xm\ +lK>sJ?UEAYLTUIe]CS1"s!DIS-t6W7[D(37Z0$=*X]AE'LY+l!dJ,)3CQt^.G/gj&ma5,PG9._r)as=ckH=Q<;29"m#h(q4'bdB +pcht5OKB5'0$r:?@0lc%&HD(:k!+hmjBn]M$O!lWab.=h]trqJ@b9%9lN/PX=Z=JOqWo'2hK4B\)nQ#QNJ3cb'+Y +%-KA?hZj";r-YFkbj8@=r\PCG#%`Mr=RlDDr)HX4N!Zh"fY?O_"Y9SQMEd("WlY3I +i]jXX0alp.70oimSuR_b_GB@iNu-$$1,"JAWD59d8:TKaVr(kZCq<;a[R,2C8p@g< +Dn0%qWD[rS6?fG'J#)j.J'lI54QD04Z@Jrs6"p\rs0h\i'dTX8q5*VGH72E+9hQSGFhKS0eZYDr\GN(W1j>7"QG8Yt6I$QC6 +pL!kCV/\3)05LI#3ksX7^cirlFpd0.s8(>teSbI-!&C9j=MP0NnRZ-=c,7W(J)d*t +-Po2G8Io(d*]X-Ns)A,es6Q9G#`lK.4EAVBpJCG\YoEIf'06YsdG+/"_*@JiPM[kM +s'Gj$IZ\Qd)X+,gcSX5\A"6#=\W3sF(4Bkj8K&9&4M5=Y8&N(mHXHkE%`;MfmQJVI +;igHc#?q-2IYn*!;+1)!@[A%i2/iI0\D)/iJU8S>=;Lg!<@UQ#iHcZ[-=#8Xl"3d5BIcp$S2XRWVY].LYq[2 +9-:l0&dgOX@*,j:%NsD&a_8kto>%4.nc,TEi!0Db*`J;o"jGa)/0O:DQ`jZiDgi,I +p`-g?/TgYYf^`A^G/=3>M-I;M*Hd)ceLtCSFFu(b7a*sDIudk=r/jWYEEsU;/ml3# +Kg4Z5pr=VKB0AK*I4(-YS9g1]]?l)U?)MRnrC@(bh2p61Z_P8+Jp5`3PM\30hDeqK +48?Iims4Gr@7ef:Ji9/.OM=p'_1-45G4I_sA@Onje#Z;s]H392Y#bcI0Co0n`rG0; +)%BB*l^oK2UCV%nQ)q*ENn+.UIC\'=WQ +b*#t@b(Q/qMbGQAb)huHV+]%]`&q-e$F^S.kf[I_Jc;M@s)7^_BE+kI#Cj\l-A_[p +M#Sf\s5ai'!A"C^h0r`4XE=V\i!C4pQhZ&S([)t!?QO)k`p&fek(TMAJe4-_:fHSd +njDqsJO7KY+-dqu"Xs1bOW>`u=Mb"Br&L`+6FTr;J]\%W +V#4a@"omMqEe"XdEStDL,5FY^AsE\+lI0']k3.d=lV(CDXB01Te7`[KBl2I9Emi[? +d9g=Xku`Or[ZqeiFVf3%NPd?r_6f[/E#/p +FP"*BgTCo+l)mrL,&lhMi&guFF6BZ]s3qOCrsmA+Ngsb`AVJ_i@p$(UX'`,F#4i@1 +#H5N"3^@O9*I>ME4HkNF30G5b=#]p-c<9-:==#Q)coY>RK:RJVsIu!V$(SId"ST&(`tr?>.dg@*T#_92AAq>sC.r*kgf'\R@F]h0L&MiJ_;#k\J#c7m@>:CCVG%!\B1pIT`4Tn@ +08jA40'7`bWSDMJ8/3d8=7uS:piFqor)Y`bpd>!-09!plro+YAGT?NRMA2orr_-l1 +nDCSsdYs.cX,>uCDP+>G%=D7g2qH+BQN-m;i]hY:lONid$3a3/J$.:B>N[1)Rt:U` +!XeEeP51Zk%thWY*U.#KT\SLYBO"u6Xg!PI$`G+JnK5UIhrXmoj^=,KI-?mroVj1\ +busQa1OqsX:]Uq!8;*WYRTH(gqDQm.4o&-",o2X,V8e$+S?6KKN9fK7J':,P!(+*6%.bauTs89/j]I'g+cE''h?]ub:8[PQi +YiK')L(nQ5*c#*pk>W&V;A&678I>DY(>r4+l,qpkX:Q,#],$14'SSR]s$N>L_jgaW +NrPjE8.jce&`m=:m8atH:'dLP2K[NX]cu_*aj* +1[i9nShhHVj(G*[F3c!ffhgAWhMogl,1*.u/\\P-&;P\bWg@Hai`R&.Imo1]]*/,j +E;ZX0.<#a*+cqRV^UeN*H1io'F_uF8^f)Y%jplkarWi88G*p?`3=G:Wk\r4j%e53%.H +4a1-e+*o.+BDg)'m#gtnS`@Iteif@>Mi+R..IdA@+n-C"2hCuV*`LSM?FG5+?2ZD1 ++q"\/7KRVm4aH$^!rVf[qcWlQ[=\H2=_b9U40W/@"Ud;2S"pb6[N#/%Euru>n(D^G +LCW*oGFX"'=9)f9A2,5&[S7!G%>"P#7WiJ^bs4Ge&$!P0^jeD$iS4t%n(Dp&WGf6\ +FflrHE9VuY&H?#?[]R0OmQFikjt1g8+FV9)m1Q&d^ZR?XD*%?+F)/^pZJdHuIVdDEiAT4)jU]]HAkM/N/EJi0="fRB9B\MJ>VMop%h7`T>]:E`%h$C ++VC[(MCd/7.+"]SScsE`=\nrN[H4nRph)^TVEL/U5PATXJo]B=@0$P#IO0;k7J[$F +\cE]&JSAGl`*lJ=Qb?;4&h/H\M&&p>>H@?\Eo8YUQ,k +K0mdAdGV?9DCjLYfn[lE;Hos3iBLrUekA(92E;@M&8)?9\,1YGJ!^3%Nu\2q\&#g> +i/\Bar25Z5)?Zo`Ap2Kn]mEiY*F"p\,7%B`d(V'HI+#=B_TqG;+ZF& +i6P@>k#N>Y";M)%E>IJ9'(/p=iEdSi7[nuRS1>eSCST^#@pEcDS=9VuLViX@i]G`n +qRUq5YGh\OHA>'e+2;@?Y%c@%E8Pg56o9)S48$F"nCY/7^&.;e4*A2#EudE?6a(T. +Q[8=L;hminqj6^*AhLmQFaiK(D6M_BY=2B/!V$,X4!BO^f;IWM"5g@hT:lA_ppPGB +b]=DJ1cPKa!S&(]+]na:`GZ4&j-3K`U?c/cEmFtJFJ0uK=J+#5*A)GIhM&b6VleZh'gp$)Ks4OF?[Sn!:gi_qK%I<_9 +HQ&$*(YlH4>r$i;aj"u0jMA_CgCD"@CaY^Vle8bA[L`-`^jks!rt"+=]_I'L+SZK0 +n(I?7o3:+9*t9jl)X0er@il,8;NKRad^DO;VHkS:4)u3,@KN0RCXB:\leWke?LXQs +3;CeIOKZHbl[Yh$i3c?(lSh,1ha068#-WH9h#&)&1@NdrXW(39'2ba(5k)GQeaP/T +('kK1ds@#Jr+BmPf,$1'G;nN,H9kp"ro"AO;`$[E4S.ENI$`Tc6mpC;#+6&Wb@>[p +-0t7BIcI6W]*ZrqUT`rP?e#Rt..;FbfWCdtTpO<2Q-u=sfW(Rpq')l[0YbZ,!:V)i +Q1p]4GJ5V;jG*oS#S@#W_1*pr#f(!PE?KarAjh?!34tnR4,OqBCPRQ33L]qMlLIUX +BpPVI8)"RK=c]DI%qWP*JX3V;)dK%<6WU-7c.A7nCJ.S`ASKkIBhp!'g0Q3H4pd9t +nt(Uo\0a)V'U<-)Ts$h7e0Wkq,fcOD)do6f2pW2-AGVbV8-RZZ,!Q<^M\ImM&Ji4b ++PN\:k:8Lka;OmZGPSG"s&o@D`7U%HM#SX6TD5TDA,Jjdcf0F8NQ%k`@9OO70#4JP +WZI`].9jC>p4?[`s%8=O&2NB+Y?%.j$(??$nN#VAV+Y=p[O:,T(FGu^L5 +W[Z2GP?DBFmp36pRjgOLID0EZ!L9,drU6Ks[f%QYXm51Y +AASE%N:Qg=94t?_XkL8N3-?4Pp)H):^N](C.Zis=6:^O;%X)jHF_Dr6HhuNQAj:8U +i"t>R&2f-*d.nefh=I.Jj&+G/Y:l'XCS)JZ*@[OCnX\>*)Vu9k*Q]Xh?,uI]TJtMP +iB7G.,KOLj!4:XTj$0,Sjh$$nR=]8F>N"5=_:u^-mJIm8$i]1D0;m&TJSUUXR0B(( +-23$)s0YMD5MAWb[uLF@$1WMf6ONM8m^]4PG9clInAopO/-/%]&1IVSTCpR5rE7.> +Cui(pNF,%2_>c#r1%H(WBP0NXpb>"Vf>#G:T\ffp^'CbBC\UI%p-XUD(A>(#2Rm2_ +9^sRJ*Ph[Wq]S)hKDX/a<@;RW8ei2`JLuX`)P-"SaL:CJs/jutC:2<'MqnuR/Xt:/ +=]0060HV,7rs=Et6NI+GDHD>^Hq@= +RFh(`s0*R=6/$jHbegWO_s@s(9?(Mu\Hi,goR[%?G(\s1gq6;Kl&U9D0R>eL)nbf' +A.;#t3H4Y$i:?W`omQXDVeJ&O?RN3[4a9M"HlY*CCY0st-#fG[c!LMO^Im(+nQVo_ +I^K)9bC]amY6d*ii7MNJaUnt&Yj7#OE1EWdt`Z +KE&&L1)n`,_#Nic=ZnEZ@HE+g-2f10"/_oIAnAY&A`,d]TBlO.nM7<.APT:7.9!blMWLAu<9kg,P:ZOmPfZ.;qpO*\sqj!R>\,%F/q^\[oUa;VH +`F>;Q1s@60WEY'Ta%Xa9lGl +V,+n34PjD+C@s5BiOSB;OXG6Rt5asms>#?&.KO(P!2k,]@=f+H_q +D>ULB1TLd+nhZPa;U$<8U/4&3?P';j^Zf&!F2KW@H"Xr/E&!g?_O/Xu44H;I9NCH\ +kH,X"RFn*&Q3F3li:m..A'B_\%2\pma\VDmR?ROsNFJ;T<\U.0\hK>BLfY=20Ae$> +n&X'%0@j:/6KJ1)ZMEA/pA=lun)o0AI./54+8ptga8^VXd6A.(rbJ^k03oJtc"c_5 +[5VlDB$-\S'H"8h^NuGg;OM9'Q=a0[C0I$?N'B42]P>PFm`7/l(K_*,2#jV(q3QW>0(Y=Tn_^p?Y(#r:'$#j4P5em#Rh5Q+DhG(@hX^_/n:$`(OE.JY +EsDR"[d?R#5T\lF[;OA]KmiIJ\oZW?&!8c+LD59sn'VHfd;ghj()p;4f*$b.H-KP[ +R_=`b3cZ;C\&%6;[h/tpD7[:/WRQut^;OS"810:8r($Yq]7Djl\71KI&>$3TB\g&[ +_I)[koRZ_C9pAjSAr@/oWY<_K4idO2@Jdc]pG(TEh1+B?EeWD\k6-6RTDUXn`Ug"e +l0BI,pi[[^E"dnH@,X4eH:Uk5W=`I6)-!UJfPHXslo4]8$(L^L+LqU>^WKTlb;R09 +:Hlt'Te#Y?9'>tOjH"MFT5N8+?lbcHmXR[`&T/7]5Pu!m^`VghU.#I,rY^16\EUV6 +UUgKDMSYXdiP/;U[ok5h;'WVG-[joaiK.44LjA4jY8mS2Z) +-A;.9C,&7tIZ[[+*Q.Z5']@frphH?JW*EP(TH7@2*a&>n\j0f,8MVC`Auj&EeGT`^ +k\)[.?c^KAKKF_a"WHr:2*%7iTe8o;pPmW58#hJ7+*`OqpP?=,M>4D676A$!-GJ.p +Tg9=K,YtD+Kt`fV9U*HEF6),a,9__[-lG`\Ai96o=@!'`t'9U#"qjT=!d +:IGKrperlml +=J3&uTt^F#_0P(SDk0,m]>"1BC&"V+4F[<[Rsb-@-6E,hj,a5hk[PIG5P72=gA^lA +8U[d;CU$3=[.md:Y$j\p;-fVf?+M1YT4-*0rN[sBjZnCE:qkmZT&FYVbPpjp4ded1 +kpENHI$Fk7-TT$FWY1iC!oi!Ni]NTCj#q>L]tjZJ(g>QDNt`gj%0PFY? +rMlgF.(dAFIE4O#an?1g'=XXg_?$B']3`kEP4nKd458T2:>@3m4f;cJ!7(8#(EO45LVs' +CkY$3ecc,@!FDouZj$F2rkF/(rt;V/'4I\p?i3tX`)D(R77mM%9)+Tkj?MA;rgB#? +ZNJa'3;t_=>sNW;r(m=F)&>Juhfl,L'Xd8Sr@)\,0D/Q-elVlGf\+<\PuI2]IaV#@ +b4m'X!UL"sL7deMAc0o(Lt][b`+B5lkT$rg/Id@4]Cplh2Z8!2"%SA]+?@.8)[T$dHeSOEBO6h(+V57qk+HEcSZ!fL5#H$5OqHo/4i\0N`#CFW(DU_p]TCDMH'2* +IM`pn^cu*XYg>56bW;KL3Mk!4YV35^5J4?\35%WkPi_.ul=G["T:>OiS0BmaPo4/U +9X5u,3F[H?R,FUqa8,s:mnac!\Nh&c@*Tt`r"'oLr^1sbSF0P\_u:bQ?])@a/)#'F +\%KihF(PH&&6g&\pNXuEV-]2^-,D]OT9FPLO;Z,H&BonHr#,Mj"&(`FfYRlq?NaJm +Jh3U;EWOAU@&o5_Z2iI5JQY6U\94C[-9o?_=,;U;gtn5=XE#&A3T3;J@QM=q$3.U@ +*u4]lq+ilT1q?2hT5oH//cLKm'e5.l@pV!hkk4(Qc]kDGeNGm-q"[S[:]ITthZ#A% +i4i%coRG.MphpP$rnG*>s"UGF^J@)ncf:)dj"Rch8"\PcNnum)YL]3re*Sf5g62-A ++oQ[b`m_AtVd6jZ"q.#^(;H4fIQgc15F&E2RJ1M[pVft;;.$1lB:;srWh;Q/ib^IG +mf3`o8T:\iF0:OEXbdiKpt$g:W@WSiT+us8,%r-e!rc"TJq("?!H*u#clO>k&Q#Ot +5igh`(Z+3fhrp@g-%%L[olf$%HeWIT2dktd((e3)/>&B;CE4/@p$rGn%$Oj(Op4X= +k4nTg,s*lE-d`+r1rX_2Ia`+dk4Rp +!!+%R#&jMfFS@HIHbY;Q+ioRHR;cS=BkVj)N2 +q94UF3R2&cSH +&_5o%-_`=R<J-'D?Ni'0%:AoR)dTh!fDZu%8gCuL-bMbjA:S$+ +'0>_hf]jjA\W>0a=>Ni>r+;qjcXh8VhpYY0o*=?mJ)i/:p0hgfM3R=D`"i2aj`f=U +Rqqdd>qBU4hbBQQRGg)bR_0[qXQh[AlnKo?3hGKAl=RNiB6?G^"oRn>VCZN'"]`HP +AR#Ot":OFB=[5(K?Y%U\YNHe58*&"hs,:AD+2n1tSg=C9M#>*hW[Epbs%>18_>h0g +'\MTK8b:GCq&4;C^HaTJi-%R`*ln:39j*XJ3:W\)jfs;mL,;3@,>ucBm#fs#^/*ZS +T.kCZN+QIlAn\JN:l;D1fFkPp'^Lbe+JMLp,-6"YCnVYNO?9R/o*2WcuSgLJ-`T+*I9;;p?gJeTVd +W"b:3n3=kfQN,McpbVp,eIVX0D"&E,PI8]/NO#'ReK1Q)=3oRb$'aOiP2U=G%?uHh +guoa%d!4S\C:5Q-Y>#QOP@U]7U! +p>8s$ri[WUs#LMqGkaK64o2#H_:cGI411+b.^[6RFLlO8=u5h51Y)ACZptIFVMfT[ +8p$ClFI#RA((59I$[$+QT2"Aa$t[3=c89<0(Gr!m2PaI*,rsO'')ub,?#&BT<;aK5 +Ih=&>+fL(RI+M8M$i"'C!f77N6q@@BBRmt!;W1T2 +S3]Q*&NRlYBB\,FPB5#0#pbTtJ.Oa(S/[oe"[W5%,gC#irTs4C]PDl-?GDtRB/\'' +lDsbge>!oYof:@_e$L$HOS!n"lIN(X8\&c'3FG]AAlgqSf"1.u[iI62'0L6T*.Jj: +]GW[a6[LZVE43Inj@"`EIsc;W.l[?a*U^s1elP +fL9/a630FZ,T$%o5(jUMpqPjLQ&VQSEGu&2s4d%F:W(d;prb>D$a4fuQd"PaL(L#k +i:s69P*7*SRip`/-05ssirY+%F@q^:K4t9Prb!YSP(R.e*KpOBO".[GOlrK\rqt=F +!\40SrkI@tZ.B.%7UO",T=oQe`S^EC)H(\<2+F^#\[otC46qN\HWVTc_D;Z-r\kho +JH,+K>d;9SJ((rTQPuO+lSAYZ5]5qOSR6n_pf7)dD`RKngU>Cs5/7dB`IE]r2r/e! +8Zqe!@!pG.o!9*C(g@jlei.&_K +RID:M^nk\_\n0RmiLWCqnGep2cnk0;03nB@nUD/M`o1k0KK8d)Yk0D[C"'i!a#L\3 +/c<$a[of5.UCk2cl9FIXSj>CA.9l!EA9hR[YLrVo$8DN`hZbanr(k)DIK(H%[Fi.t +$iZ`'+Mdu:VLI=e0)#41fCg+`p);h&f.G%CcHX"6XdjS5 +r,1P(d"$D\XCL(N?-S1J(#aZ2X\pnR!W.odZ9duU5pu'99q;5W21K)]cY`>'J3WU3 +.iJPQ5H$u(9+?K*pn(:a(-o^.L#c=S&J2M8N3#n)Q`]QX@/n@GbqWX-1le0a1+2pE@%3XHk3t3 +0D@">a"2_PX?\l^a9f,o$*h^O>@l3aZPbY]/=UIQFnYjXJ'q^rW\Il@5Mti-"b5V5 +q\raHM)YS0]Rm`:M\9-YLKT2bJ,O<&5F2P7k*.F9nBY]QL&D:,dWNI368<=U):\F= +Gk(n85ri?RG"5A8\.b]W>(G6/#lhXt2sJ5$?;RSSq"4KaH\uO&`AGkPR:NOA$%!HF +/4X)Q'!6X:8I'nJ'#h8jZ:>EN/m>H.]3!u67qKFs.K>TWWLjN/J$GaCF-6$SQ^.U> +P4J?['u)i5n:(Z'53n;Yg*!_-UAuaY=Qth%6ESNqXo<-jO[A0/;RQ>+)bUo)6ksI0 +PqieWWRcIec%uLSU"il.fbQ0-2N;E/n+lF((*Ma(AH>lns.CP=+$p`./d27T9*?:^ +4Ki5.:GL0+;?2USm^E?@28#ReoWX*7.EsK!O6eBPm-d\12G?1r>]dgh1HRe6qn^1j +]\./u`4T17\BBL:L[&=&nm8ZN%fN[cK;r(4qISE:fO=!r.C=K4B%IMi/iN+GYQTXP +T:d&%!a^qapeUn(MskeO?NU3kL&_$9F238J.d20!,!6*/!3i*D(I=[6f=i!.$1nG< +F"dZ9o8?lKJi>q-!O;:*G9=b\!"cAncNK`07;Q39KJ0n-(E>P;Hkj6jQFFTieQ]-q +QR[]I!+KK/6*X<_K`;VK6]b*7"o*I!&]0HjL/Og\("-MW>19%4hH_)gD(EmB([W<[,Og3*o%p<*:3c(ZW9?.>CqX!, +U6c7&e^#K$ml)bP`t@Y&8_]\BX/\?^i.!2Q!6.Hu`e>F&"YG%'/VZ:$s*Cf3Hg:.q +[1XF#;]?0DlY\'+e]+i.=u6#8:2Go-4Rg*^O]/'o/QV!JWH&BsfEJ:64B4F>^=j>" ++mc,bcNWJ*`T#)"K1LW]iib'AZ`g%+5EG]LMlK`J!U%nkT8Va0:cpk6ic8'(Nq +.RH23N)a;`BSD!L6mr0`C5*Lm8)0pe4Uaocp5,a;@i,"Ijp-4p"?C+KfTEJ#R/]Rb +Cho-"s*[s3j.[!Ke[h_udkH5a_Qps5A+k +[L`0e:'&<&VsMDYomO`-"rk9&UE&tZS=%R1a:VP88"*Js)`;6mp(qJh<[_kCQ[R74 +osRNaDhk.'2l6$B3Mg'gANgpPJ%i)`X*']"YGqM#V#"F+b5XZ-"=_,nFj%L8Q8u$F +=K>;g]ra;"VEJ%]4'eR=?`C;8V7BX'Z!MQ_UIo[pp5R<(p%8[Zj\ieV,/`AePMTQF +[VVFfFIW.V[f6a8YF`N/n9,3up6WgEPXj^%T@,ES;SI>]h]MZT.=caOhlSZXo,]jO ++X=9K+Etoq_1Zb$S58aT_u2%=VBm]+gi2Z9naBiXlWF`9?M*K:'O\fJhPa0AT[iG$ +>ErL'mL8F=Si"0>ZR,"mArQ13RQ#(DFWYi<_1-"2g:knc;87uq +4e_u+0,VQ)jt`%i"apPrc<`_FXar+8RpZT_hB'K3B=rAkJA2e7>uJ(>;HgW:!!WS_ +Mms<\?l1g7\G*o499/4QeAdtKd5c^HN4&.1GlBg=nMAJ1j++DSS!f["Tuh>(na^RZ +!^o[@`(N*<9@L*Q<5orRI;0<)4D$)>;5-*lF +k8Fp3T*3J)`SO$,2M/dbi-"OdTK.i.E>Q:b#WW';)DHGoLW,0rGDo,pf'L$"*I@J9 +7tL\Bbctj__QO'94U8I0#/C:2r?%d(4YJAQM!WiG_nc:PlUOm.[8Y*>#ld>RmE>4* +4!#6n"6:!J#9YdON9eK0f;Z/>G\$9u%B'NJHN76:gT.'[M3sg5+Y]MdYlT +V'ZQ/?tUI/iSM!%g]@>nmN]L'*K'cf/^KG7\!CU'VBq"P=mLDjf(X^prC.NM7MXbU +jc/Q9O0f96[5&l5+0_ib,*-^un:/OM2Xl45jt8cI&&A>D9M;?`J>2I9`SJ!1gC83I +nu#Lg,W=qaJaVhL!<9)VU&k6.l4LK_UMBH7.Q&E.Ph;h44:(p`C2A_(F-K#lr^@`A +_LJj-3)>0jTuKW##m,+r]\*Yk4;n0<3Eiq_2,DMX,O63kitF!,``@4o.l_N[gr&7P +"`f'>)8?HrO=4,d3;)3Sp##t\O@1rq,++9SGWdXZ270SB1pnYUW[oDP5L_KYmZbPn +8S;6?ro^S(5p,Y^O(1Vphh&YYLl[O^`<&]\MXr"k`=mL7qLJ'9@ec-[]ALt^?a-EK +Db5dHlK+BKYYf[I1='Bt!qqJVknZ8:Lk-b*XUp%^=.$62P8n<@n-;h[[nGc6"96aM +Gdd),5?A6Ma`Cnlio>Re#j872^c_L!^&t)Np`F17*(VEh;)KEq5*Pms3*S$VVeqpc +Y`*YV"pO?t7GM+dI&!udh5Y/Ug,RXFA>R!kq7..6[G0,*lE7m>\b;TNO2!dUnIOeI +ros"H0@hG!]-['(*JH`E./daNl'JH.5@0NQ_5tMgN6-N];!-4:aj[-Q7s,pBeR%.E +F)@];PDuT'GOA^#\p+,6^*Mo6Xjll(RA5-"#C#9QWo_jU'pjeX-4@6Xnr-bY/aLlf +W`'n4cQ&2)t#sKc;$ODCb=;28:Nrf7WJZ9nWa=2(:KF^22$G9$L+:Gu. +TX&OogDi[=4)LKh^VK%G#'VX([B55X/-iQ.\i3>Eel1qg\&Rn'<\bUA>D=Rj9YZIg,:*I^k +!;-=iD#S),$5d^b83dZ58$M@+?$aUtGg"ojbM%=YZ?d;!%%hd]S/noHP:+2kQ!u$g +qSp^(`QtG=n*@8X=QmQ#k*4ULhUEABP,!8OE9D1#@[G^s_mstr2eif)NA+.emSeJ_2I;;k8\7aL*$h%kU%?bE9 +?l<>ci!WX*Z>3[QBECPP<"@#Gec0i!#9]r!Fm[q,lid;Po,cb.BOdo*&L^P:0 +Nc;-is++8O$i9K5BDrcir.I95N%oZ!3d8f8T6>*#=(^@@A`*gQD+YGq8HLt99+g'NfZ?N%Lc,sgh? +[r9g)9Bb"dBCg)j]RJ/;Bu9NALsb$Uj-jDoW\3\u2YHtXmG^=IiW8)f*lF.,e&jD7 +g0r/d+F#YM;`eN5)d\2>!4)[3Z6%KC(;i6Ws*]m&3mD25#_GQ;!GXLOn#4:XC;g5R +b>c?WJ=g,K`[OpNjf.`iPW1Zqls+*Qok1>`^pdQ+(,boCIWZ[t7OY_AaSX$!qM*,> +pp+c[St$a$T#Qq7A'2AUV[pmL^@V]6^lb!l!q*nB]Em+CuV1'Qk9X@'?71n"SOD^=Z\'ALB4lQm18If(/ +2(RdW=0Ot+ANYWq@>*/iC&^E*I?k8T'"*_bauIa0GZQBRRZ!ej8Bd.IkF1RTbc^4n +=QH`=+o#ZR,*5qL(n+Ibp!pl@MO./m.>SsEjbVpXnMr%HtF(3=DZKpbn.(g"cA +hbUcX0NFl095V=4=]d;kI7NSeKBo/FZgj_$)95?^n[f."7[*0L,AO3FYJl-j7DVi=T0FV=TG,S#A#ohs*TV9bW-ViA/3LC-^YZd"($GE^#DGGY*'r?;2t"VCZ77Um7u(&u1" +^;9gnJQGF1D\\2`---nBG&DtoXK`!uN37:mml"s#M[hIkf7I3Gn:/9R?0L"Mm+/f6 +dC8.#\ed33mb*4c"!*kCllI]]2$g=(9CITK`0197O<8`*#jBkOT3fkA'feI(rZG^!Pj3S:uFS3s571e?G+BQc#^DKq<[Y25GSUT/oCKWI>%WIcMbQY*W0^<,c1K7[iV'S8*e&t +^_,=FZ'ED3@26Ot Vh34!L9a/+:'!Cq+t3-Cd:Nr]3hlrk3blIIMTpDpjf]C[2V +@^-3?kEI]B_-9%bcTYo64_;mO&?IF0G=(e(U)7.0&sRClqn^Oa"4m78@,Y8PkQPH/ +ir:gl`L!9>nFqk1pDed71[pG+rZsi!Nt)+Q6[8+fL)\BMk6 +o>04$#j'!7Sf`;&q +^:K2;rjBoK#;.,_o*#0m$3)`.\8(.\-i>>-!&8sXc[s[B5m71_e<@eS,k0-URfiAH +r,a_+Fl#_J>N/(`KR[I8d.deLfJi,%9NW"5F#YIpj[E1besVO9WfBaMe3!Sj9=NI&Wtc-48\]X$nQ2:5s)I7ds.#ALfs9,jX--iXaSpHll.r&U +T+=o8gf=@@L@Quc$9qfopqa>mGK8hEDGV*"i3NpXb>t$tO/-,>8\Jf'3bsk'eL(1% +?1tT_R5_7RQS%dk/P;p8MGGTV6Mc_)7j9%I_,E[r--cO]Od:IlD=gh7HbPdPd!k_<^6#*iqE1!Cj"&/X+63 +j,Z>n+f=)g(rjAtJ^_DaWnW"8EQo8jF&p'X?81M][1ajVnNuc-gu3RqTF0rUV/sp3 +QJ'qaB<4O"iAkO&6W!`9^BqL4XPklaHf`-q^os[K&.nG3"ltfD_,KhCOojSAAZuI" +ImENA=*VZTI&*C$0?HkPa8I[,InK-j!lR^`-V-:o83:>-Vi5hcS6r_;J!R`+:4Z78 +9)luGb;/NX`8mu/oukF!pu@lq^P$#;q^$.aR/]9j)7"dZbgeN9%`1c(5uL)F:O[$$GsGor\aA7g7I+0^IYa>p#ld&m#m^7?A<0YP2eY?@]9[#t +Q;'l^s%E,?1p:,-GkBX$E6#'kir=Gq@>Orm>hai0\8fN:%-%;0lW2q.WVfSAh2.9/ +;^X]b`n;()laEo^o>WYW(>q3(s1ZOhVW648auu)_B>.k'SqC6*D8?/lC@)Dus1ef! +$/j&>s.=?KShh^c0P1e4e%=u:*rD*EQ/EidhZ?6=lqdNq4e#6b(14;DT@:hUK-t"1 +bao%lA*4A4iJHIeOUkdjVM6FWDgV2A$X`5,SlKM22VqT3cG@?KW2n16,&1-&N)eoj +XaAM4%j:3D$Q.BslI75:i#e;u;`DGqNCs$U98@CbNa(+o=ks6Ug"daX][Lds%YE:; +DO#A/(UWJiJfa2bk>/-U/u\:emK0nrR=tK>M6'MhPcJ-,^Jm@tj9E@aPuXd&-8@^g +s3NUAi)GD\AAs'5V8*3;T3-BB.!\Uio?4]QA0C6:KunU,fRF'S.;+[".u+0i@6T'0 +?=unlZQu&+lt_W/.2l"9P:tt8PGKPn*N&$>VW,d#p5.3'#ZpP*8iq\T46KaemX$m^*)gBgBlP*Y^aaDYdos]>^h]'9.?aGp1=I/em:$ReOEpjJPh]42[4&Gq:Y2\n. +j?FI&s*RE+^Lh'W@nQI,A$USK./f]#RD8$QIbQ.X7dt,Yo\3^:s0!5G"T;&Ur*OUt +I+G,&0(AG*daJHDHSoQ4Wgf2``nc?Gc.Q\d.1UQb*.\'6$]O(p7D(S<5E\7^o6/=m +rrN+qOktck`<*e@JM5%@!Z_29(^Bp4.HU?^B*kGECA1Z)O5biu0lq]H'ArrH]Wj'> +n2>?0QT;=k(uGPOqgoCg$/KroB\i/g2gB^#?ps)'Zf'WIi6o!je;0=O?+YYY4-%"$ +c@\XT@uic,&V.)*a:B^"F99tZ#'V5On6c]N1a6nB<&sXK=!;u@T +J0>'j_lpp)@Vpl5!2%JYJ1Q5^kI!VpKZGHHCa3RF?>tQ/q;\t=s"U#^*PD#*FS0e? +g)KlL26gTX)0]uHZ2Tc(6AE-[VLj:1D?Rb70[\KX@aG/r'.'3c!n-2cZfK6Q0C0(k +;Xheon>sABZcD=BN"s$dhB^_+:72K._H4PWh?_\'44>X");U10LX)79<)PKO%d3ag +Zg@0:6KfE"aFG:l?k%"+CNc8Y)P5Np@*pfH>/+h0[R7rhckt!=GE\nJ_LI\R)drKH +kO=4Cqn,MVP1fdC`tmStI.!.lgO[ZVn:08jA(SC!-P"NniU:@&\ol>uPLTWa*BU]7 +\j>h='`S\t6D?>YY3q +ocO'k4qF4$iBQt6_iUj7k4l/nD7M8T;qWm,`Aurlf4NjG'@nGs9qY:PL/+96j1u2W +0in/R-@u2!iaXP];cCO&rdlM.4aigf^$t4(4)7eI#[MsM?!DL?,hn)o[\n,iUfe]@ +s20S8+SbET..#J9,MO80c0p[[<0#hH4_e:dBjD,!a"5$scG6Q>@FNsUAl\?QDcG/Y +S(FO$e#JndY+Oa8?(D9oed.7:&!#$C!;K'"#"GWio9;B5MB;H8-Fg;cGaU8MZ60-I*6QE,P"(99[%uq +!TKQort,3/mmQr+>87Gq$br._7QU@a_NoZ;lD2;rCcpH0s,-^tQ=Pn:=_("oI[q>d +>8G+@0#/)6*s`t*M`+-M[Y4\F$sO8l(."Ub`j-pcTc[G<&Qh:Fh][Vb031..J)ih: +gd!eGkJ+h4/;@:;b8>j2dP-%s8D+QYj10#\/PufH?NW49f_WuBU^[7Bd +k7QtI:J1Us?KtT9WS_U7]\AWuc[WnumjS*B6hUnMoIknR5@'BMnZ9qF->!0n9Em]B ++,6T-#l]9ehZ@Ig7:E8C7m7GF3%/K@M-bf`OU+kIk^/$K@X#S>: +0[.3qi*I\u0'J"\J$a4 +8"\K@(g6Cs?hGGp$ln(15Z:eV)-llLST:[$GAP--R"&n!qqWepld6/6@E8@ +)u_m@(9g-\!PUOb,D9I@#P`eb6TkgF54P7)%hYB<$87!3JH)eiCH-s227FM[ggs`Z +,o6OnI[Z4>MDSL%Sn+h7"_oBR^E3C:@\?@GTPcR_Bi@$GTRAf +hc.WXj@tCN,IfKM].X!C9cGDgC@FuaCF:eU;Li'AIPU"mc*_?DWbKG\FiOZ$qjVaL +K`<=s#Q#(d[dSJN*V^&G;3To,GOu^Wri]M5m(&4W62dTg6]++\CZO-Yn(J0I?aY?i +7@aUDqna1^gYd"Wj4Fh=5GA2GEA-LPjeI79Y/cR9,lU%%*.!/N4G<`5q@"X.1Hqp` +W +@sr:4WWr5_6'ZiurduO4i!9nlpDO`glP4q2otUX7+6d<5_uFd!lK:"fVW6;\61"m7mVg^$YR$]8$UNDfB_aLbf5qQ_N(XE1>I +,7'ZtP&Ol8F'sH5&'X3.3:eHO_Binn30VoHM`#Gi#=>C\#Yd +#YhB1AsS0tQE]^K\Y`qcj"e>[=dX%t\.t$Jqg(']2l8`c#_1hG7?Q/T&Qel`i1#oZ +D-nMPFd\T'oReo%Q5N@(ZG2u?^=E+c($=sR=u!3m0*CTmq*=p]IgZfMq1/M==94M&" +Zb&/6F`5CldCMt0e`@;2s2\.-$!c!G4`]aD$lM3OoEEKIrsrlK+:eP9_hXhou" +Sd"JuMo^Cf!i-,=r)H!4(=fB#iUQ1HWE)e#on!-m)7f?r]1U(,J09[KL(O,ed?lH& +q%CM:0E#lHmq&`e1X=PhEs3c]Q[Ib^@rnmf1K2F\6cLcbed!`K8^rFgL8\ +\H^n&A$*CPMo^4MZ]I0I*U.SVT5120:g5K3]uRUQqadu'dCa29Y]e9o%@d&SH6EI- +H4Dgl$lHK^rK-OK^jU1RWFsVc:2!tCB&@^gJVt.ACtc@3IDGjlf1rFIqi2\D:%#O` +6i=^bgj.h4\0gU6i!#cRgK(V06TA&/+) +lR#O*))A-3d(A,;>7MQ0X;X%04(`dDi'1q(J',&$Q_mp;U299-RTB,"QN?ooonn(f +$OQb.%#_aio7?qdg6iC/1EYgkTW%hXGhZ:EqR1_F*M)C$/O?'K)fPCaE:_U?=j"qs +7=$lM=sYRa,qr%N0NB\I8]<>d_39X?5",1+$n4]DZkH`b$-424jT*.W?db>miQT"' +`0YS&QM!dJoM8#?$gdI:8:)4%DM9tnFP +QhP,b\?dGD37;+7Bck4l";O\;1+QW>mA%NX^;2,1aZ$sm+KdIZY`.gC_SsDq,WS9f +Of#YIlPj..&`tA6s$k[3g]@WJ#8MnrjpMIpc)K*-(4^fIf,>Tf.$<(*EYAn6C>f*s +n4.oRMYS=mrmkQLa7riVqH:i6>K$hL-NoV/O$-L8`tCNnKbFCF6;207GNdQX_$#/- +pi`jZ5E>iVV15ipoo!C\?a!$%s8TSVo;@#iGPcFLp>l7\,>7Q6lIRO!^KS5JX$t.& +/P,kOmeVuV-3!@l`/eLV_%(q(..q)De5)AUI^UNlP9m1M0?O3$:B"TJ(&hWDrbqWJ +5AO>JdA4'LV^8E&(bRQ0a>9jBE3)X>X%KT@7f_Z@mT3V#@`Wk&O7Gj9YDiOAE6$oJ +I(pl.D\35P^_Q?QGlen["(dGLG#$adErX=AX_5bf8#`Q$l#S4D,-ZU2n6=fE)*;"K"nVW +1Xr@iOs_-9/JX?rl^KBaSLT\e_@gFnW%>_J6..Y_`\piJ0jVd6id]#`$C'>PUhS(C +8Vd4@i;]:6*T6rjT'.q'FN.Op'J+\K/\9m!XAN^;jm3/!kr#8!ONq+U\=8/D%r$=j +o\i7A3`s;l1]L#Pk.s33[".c`Mrm$p\kW'Fi'1&/U]=rV0nd@C7c=<49+V#l?$_1d +&!eg9Mej>Uh7@fErQEc/GS]bu^[9TpkWM2js*`T4Senn[+*e7rs0j#R&;1jZ*BJ`N +&H(uXGDiPkQcp?Rs,k3p44Kr;"MY<4J`%XF^L>O&G,t/SYo!&N"m\BK]S7T6a0f7t +'5P=1;]ZCUQ>r&0VL0,<0\IC*b"eGBO"T@/-XcXJke\e1dH!JN*r#PkKnf3=$#(?UmcL!U.c3]8c^e`lUr^5c(V-/K4^K!'u>!$Fq4(DPTCYuA[ +gcT@n*sD*u#_N(/r?>(!@7e(S%KugmFL]r$#i^=>r`aMd)KiC5!oCi07Pj1e:_H]M(gE?1e-4!2u].sRt40VbWh18 +3VEUgpqPuVRG2FqV(;,kJ-c'=e-00k_i'a+(&msVQ/Bd]6iI2Z5lcBhrrN*AM#Y9m +aCb,rk*&GBeFZZ%Z.q@OSI\.e:0)ArDY3D +/!8>"efk$Zq884,Z%+KOAH0.ko7p&>hl]TNHKG"d_J>C_#_'<,n[!r85@9Y*Uu:EO +'#.\8r*it&McGV[=/CBiP5C)4iBQH=raee&mtVVVW_;%5jHX8a!OHF_ +^Z6qsJ>``Ra9'60/d1M03kXVj+%Q0tF&pRh +bEj1\=9-p%./lTpWFPl0R;YT5,mdOnD>/k*c'EG>JLg^'pBX9j`:e>WN=_!WE2d+j(Ni +rhQq.-g,i9OO6W]p-$$Jh'1dliVbX'Q5ukU_LFZLE5VK9]:K,*::N.of:ohK".>M" +mL(W7/R-hF3O`k;p'RoE8B)V%41&n`5@aooDBjoX,J1+,LU>n_g&V&1J?scG!;nbr +4'/O+_&(dFkZG0;ZsrhBSm_IlblX_FK=]Y$4!6UEV"O1;FqO^lRQ"aSDr:NGZ$44h +$VJ`3-3=+d+f"YcXcKQiC[H@o"\kka1?Y)qT53S1hC/BVIAY;BE69]=ba7#d6rj4@ +4:%=mrKt)@#O`cKaFiDf':)I=Ui/rg%c5qJ(h>[_7gN&5AFLfAp(T;TX[Q5L9N3a44opfA)=b\J\8Dah)t":o;4T=(C;>LL_lgVCMeI +.to6AGs]^T(''b4Pbaf,RPXu4'2QK5-frR=G2Z=CcQhN,@o[o>PQF`_Yu6g_(7]`( +;5hbA:WZ\3(Z/VcWq4@ip`M\.:]hNlQYHluD[;I))UYCS)_i'd@Op!h.^]m=ZkCN( +'?^".M[a,'%3c.=,77*gnr:Q0/>C:)-'fJrMHE!U8R<2Abs+V*_=%2G_7&kIMC@igNN2A)KkK%J( +8j'iba_AY"I&lRs^E:2hD_i6Gs%F^:X*(E!Ca/n/[k7RU*>sD-+1>a0#OpW4,l@mq +Z&F9>JESp9aks3lJ$COqMmZ+7Cfp+):%.bt,!W7?Q +g$W>KkOH2W(d[Qe$rMEL=m"jL`kb6deo'3Ye)^1SR&/iqjeIWcII?_k)ijuZH*bi7 +QVShpcNMG3gkB7`dUU;V:>ds2!,;!a%%^_s*ggtq[-5oB'f`GVh'o^LJ;Ej=^#uBH +ck1-aM>,Nk^r<4&9)sH8r96j"(BBg)d]q*8?[YP=-Pl3A3If1XHmMkuSVOD$0#KV= +ZR)l,2hDKh5Ih\k0#5A5CY7epDC];DSTC,?pr=i.9Yg,f=lA(HM"!N?nX7_q;r8I_ +1;R6$n(8'hI]/O"G:b(I3ZqKFYBjb.q'XA_^jkNlC%jSYVZ]Tg,Y>k&)H]8-Jm4h@ +B;VKV\81d/k_1tc40PE'0-[i27;SRdQ;0G]kPY-KrmE=R141l;VoWfI11^A_c3j%_ +3"Polej6eROh]NMi'fC>'F2Q:&*uAdYNDq&4eZT-3X"WQIdnlV(9R>XG@]1)B?@.k +6@BgSkL-bQh7-oo#:[Hs907M)'*%FKqS3/_W:1kps)B%Z.lm1a#Q>gVp&X756Z<'N +!kA;WJPGHfGnX9[]L#fuJ\;=t#KRUj_'#=o%"WS=gXjZ<+T=U0lN/(eota]3^N`&: +#5IWl%1P;KgbfBk2YH"L.L(8G?**A,bNln#bldbpK'1EHYr27mj8V.;3V_W02mP4X +MuYUCp`1OQ#KXe-j?E'MCdVZ@gUq"eE6Z+.eaARH\pFW$Ke)&7^K$m?G.DqE;; +[Hcf+QNj">&%6o*6L]J+1]39Ai3#h"[19r!5J168EBMRm_kqS8etff-O7cDY:.QZDId_OQOGs!ATM +LUe&1K?>C?-s;d4.6r0C-&B3YAH@plp\_Mu>4BkCb%@*WT/Aq&*FJ>$K4C+*=b&L2 +\,>\RE61dc@KBiPh\YY[14h%O#M[#V^R^bf'_^pmFmYD[m7_hhWP6"b>Mk#Ya4OldC:oH\F8PC#qgRS;_%ZEHh.&'s;m`D^f7m/Oncc(_6ar)R +SqFiYa0a5=cfrn$&S]sK(;0,nA:_#dd3W^r3^OP_s%2;oJq%#Da;'.B\a__,o2X9E +#l+FOZOCaSrdPj#$0W_r(U+(!,:(-h$cW.D+Z%G2VU&?P&H#n@YQ=nBE#uT8(;*&d +6(Wc;?a3Wrj_fV//3:2o;i/]r,QOd7.IWb**.[sRo`Y^oPkIY2E_2R;_Hn?&f*kfk +/-XWFH1tQHhZnI!O87h>ijW77mCnG13tL4rcG;g@kPW;#@7&$sW.Ceg^cdMR5N@VD +"i-Ci!I3#VfEW'6;Z)+7&0;u`HK$`8gCmfr_#cN3gEHQ'1o\M0^nh;2O(Z(2r>Voq +qqa]u!YGBqBqg.MC*<)fdpAg7 +"kt@Hs,(=XWcJQbhl[RL06Cq5(BFG%+u!_0f4A(8Bi$p.I@]#126=Zbr3%LQ\E +8%RAakLTg,%.ToZ*:JAEE*JD%\HTI[Nj(fd[c-r=JcalA%e]\[eaT`Q#:uG +IR9l&;MA7oWG,7mBhY3tI">TtOb'1L=AWlTF5&8-Napj-J&Z=dXd&2QnUF,`F_R(/ +Bt-kThbD>pp\HB108VM5bSR<:b,RGV\k$6%T)Y*cr_ioH^V#+7c%C?G*#'&j3WHYN$SYo08N!!(p`^&u@9&$3/,(1Nra# +:gH=#s2biQ4Jmk#B8#-aU)W4#oh#BHOoM[Fg>c1[',8I7A;(1b]B.Y:h>cPYbK#+g +qoM'^?iU+q`;a,/q"^r>k8V3d$&J;)Z[!S5^F]ma!.d<&s#4;W[fs3Bi +Z8C.0(g"U:&cMn1Mk^:LXoSLME46G\%H1)'p#_$TjE&$*fcC<5[sXKW%biRnj.=6a +/E-k7LN98$mQSa_]?K#ZRBuK9GPt[e`m]Uk(Q%H2i`BL*MOmh/;&:\b`s&)Vd9@/iKAIsBIhoM7*k$h% +p=pC%NAL;!LF"(5`m7qF8()bU,\ZJJ+3ornRg"?BDgADQLa.GK.<)3$Mn#gS[HkRF6(t`I+P>nACZ(kg2d=P#&Rc*\`^6p!5K\j +543B6mTHr6LA7D1+,Bd(i'=1tWloM5XollLpj_AY^Lbs$Ujip7s*`W3Y^chRSc^qH +h?KQ,`f?G($accd4arD,/P42@jM"um;"W)"TAe\$!V:IDhuX9]/L.nY[NQV,m.tR`6An;F?l(BBj$uG^jc?Q"Q?E]o+ +Vj2F$/%&D.N\'n(;MtPS=0%,,BLUG97b6@R\?@!&k@Q](\j2ZdTd?YgNs>1,(rY=^ +O/pimXjW-,d"+Gf:o)CWD-tdIDR"@eOZ"#]K049'-sqTqp^^Lp[UK4B/>,6SUe$K: +V\E+(c#5:3Wn*.Z<+/)^%k>0,.oG7AWo+G&>U$AncW95kBu!dcPj:_=h2JJ`:V(2+ +VA>*=OR71)g?eddKX-2jI`3CqTYX"cf +XNLcB*u9?`"m1%d&8jt"+5r::rflpN&_('#31e";1Y5B(Lo[T8Tk%Z$Zu`('+:4_ktqUnYUib +T8jWB*Qu2Z<^7ZSrb5a8f@qc>>uURF-0=Si.Kf]XGGpVuJ"k`&2r=W1?_)"1&SFrR +CJtpa/*9(5s,-iZK`B#"\F;"5N0_M.cf;V"ZYue[a/kfMXe!J561BB>S3CK.4Q.k5Erl9Ha6`U8mc#s_ +epDStF)'$6C+E\>,C"$g5.]t62IKZJ@Ss[L?ao@XETl'`n`3X;M%cN7dm0GnLgtn5 +bqF=rMnX/M(;8^Gi"R3W1@Q@k:H`%drkF:lLB&7nqj/aehbH@g>i:jY!cN>*&d&)/ +l.?[Wr!+I^l-NC"kU@1nM?OtBj#_SR4%:\O&7^40(P1F^YoH.95m.-QkB'rPTo4W.cUsRO_gU6u8BIX^$U_]G?;e's,.3i1;^^s&mFu-"HHsDuG:%"Rmc@+2@s!aocS` +*.8e^$fCp'%!Ap"%WGNm+UrLQ=h<5p>\cKFpS(ecC6&ej[3kafY(qHiSh(R +blOq`a/P&M2HFW(h"nH"gYjN@9/\p\i(9-B<$3Q.bf]+XENKK&K:'6W#PnCO@QoSVUW*K0 +c[aN@FOKBj2tf:4+lZq]dDhmHFX$*')$qrDe@R9V;9`s]r.,( +]!%;_mIlM@eS)tPBLPdUJ4-&8N=3>"&QZ"S5TQRg^Abe^VS!b.R30TJacGCrdgofU,(g.^]ebDK0\KK+Bp!70WuBB4rY#YN9:Q9G3(PurA&Bi/8jJSDZNadA+'7,BDsW4mMTAV)D2(! +GX5[sn=/,%(g6SMhXh]=#o_P.)IE+'S?g&HM_388-UAtQ""'TE9V)%+^$qL;r$P-A +n2_CZGg9Fqrh"8`8Gj"g+l9/,j5*m/"OG_,[q+2pT4QBdM.Qt"fSUi&diRk +iWZ,J'[IQnVh(dG@:A/c1&i\@j_`X"=9(7R:t+PM-q+LL!_Z^C_47!9C8b0nad8`7 +b6=feqP;=1K$m1gW0DY'Uhc-hF-7f[!02eqEQsdA/s6TK%;GVpH2Z3fh+n^X?Ua?e +KWc$fIhocl.8PUQM\q?goEE;q^;\u[e,sn:#NL7`YQ3Ho6er-[?jP_^:N-F,fSRWc +n/o#Rehh/]&*%^NXO.RVhtJ07?1FD%\@3J$O/L"c4hE>-f'V`EHaN6$[qn-L6Fabq +e8s\*\Du(YkR-)d3q8SfKECXli7oX@5J2OUr7SOI!<00)+TLD?f=hoI'jLb6:ULLO +DqMK?de]S\$lqD'DHJ_Kkgj#/hmj[=MEP.pj1p5Zi8,c`VT,+iM/kN=MY>hd[-N_I +8)])5@EUdsJ$mkp1"huV-J4p.H$s=:S5_1Dc7"l$H +03$mECP6+STbCJ$)d]Z`?*4uj>;*]g-b`8!Y!OWFpj^mBTo/]oQMXIIupPO8a%dU[Lp*r55@H58Hh< +:@TFa&,P)l`W'5f!jEZO/qK!FU?fR!^@nV(:O]_D0j"FO!5Dm)qX_/^]7%X_!VTb:;D?;1?i@[H5$Sj5kSmGrKNfX_oMTQ,K+'rYNR8(WB8A +5?.b7NM9E@]3c$F`0nqR"Y((.;CR-350"tAl'BN^b$]NBF52qhcIm$C.L(5^k0@;U +pfZbAlg-dms$c>V>!U6]o@UH`d@uu4ld)=o-fN6E"MuD__>snF".Vi24dj(4S`id]$5i-2qpgO,KtpGRKpFVJEpk8_-&5]25UlH(S7 +ErQsH!cf`W%#?7RBT@L2?ZR#:\VmY99:&nr;[g=8ChW?j3YB/^;U3.079.&)4&:m. ++leb=Mu18>s/FMuY[hGYYQ-3W8NL?)8B*YsaXctO>IRW+bP8Wo;Kb5s4EqOGpH!?\ +Ps@b4:O*D#s!#ts\oJ+,5jC93*ViDOqr>-p^GT&s==a/V$(-,&2*k,j263#\K6o+. +;B(t/5k+g+D]$R1mXj30E,NEr44\noH?PgJ+oYiV\\DnN@*>5GE4t;aND9D4*PhA9 +fDZH;po]#U`:ela8$mhQBB2:EMo_odclV,[I&g\pZuO-hA'^j,n/nrd4_MG*"j$gp +Q@7p'A0j9\2G>#"m+R$jO(mF3ipHPbXa7DIR?nW2E)YgL'!@_%??=h.[_.R9K6Z1s +i&CPgG7&m#,&iDr42E-b4HLY_$rN4edF;F4EV58`%g;n4Im!5.C7I5`Rl@k_n=S42 +lI74%18pSJWZr7-ON=gEp^cFmZu&pPWYaAG/_NkLg>?GYl]4m[JE:qFNC"7%U2&T>/p!NB[O/b +p!\`ikM50oJ=/RS#dtXt;EIU#L?BO\B&LG%8(Y1n+2k>&5!q"%Wa^Q;^f)5ie?1,=2BgX6-/+G&Y$DKisdrREhsWk +14EpmA0&5+0ZaGpLJ"RIjn1OQ-$$V-fERgtGL[r,",QRnTU?qK7QD9KX,35=Y+\REs5 +i7.YBD/@7qHcN#NYu;HlnaK0OFpR?aCg)Ahqp%?o[V\?p#E)&oJ9TrO^10*h_Nl4^ +s,]j'"b;HFgGZ-:((G!oFRQ<#2B:Fp4EDThl90+Mh6Z.r\`DGrUmmZ'5u3h+NVUZf +TlJ6(n>YU+)6j)V_:'dGPL"V'T6Ld:GiGU)-_=i#O%S^cPNZu;Uf424Xq_c(39)W* +89qG$A`!R*s,ps2ZuO@#IatB7jcFXgY>4VHjaCP9ZL]me#h2p?S(<)4'ucPRj4K&"&]IRK"9sH!gZ_nAQd\ +i",@-K74/8*%[cNAobR[16B9<9\G%^`R@o +r8P.7:5X[GTMd#?j9Ap(`eBIgN)\?c3!EZ?Zl<)8`fb:L>]X:E3&.TuYccZ#,TI!9 +cER`E8]nch9"o!H^,a>%"_s`bC/!Q8^,iGs/$`&#k,qI,X\Mcb:29aPN&nYrg7.=a +#+7><)0_%gWf3,l%22A,U*)b#dLN>/O01B5Y.Bl)W]!GZHRkrL/A&nY]A>QS4tume +LK6%;0D+59rI\!XLCQrbq]>prB$W&1R], +H"\nEnCP5S^Y)9TrYYZ2fVnTF"]#Esr*1%j +GTQLD9`^4Q6GWUcXpG#U8`7&cHs^jfIQ^'neMIn@_!gF\ridO?QXsTMrL\6ZDc;2( +#CkW\nE6>I^Kl?a$f8cCE?9L?ir2GrpTN9r\!`::V/jJaMX@D6jb^Q.s)TFXF/+\7 +@k@1[D:'-G.-r'qUeNSHE1=^@X+FaFllb&A5jPdBi4g`15L\@Bc-nkqb:^WW1@5P2s%U$U"U1MZ(;:C2,rK:1XQJJlA +Mp<@7:4*%&C4P4tK@atc4Ql5\J=GKi94,%Bk\\6b=MTbTqq?PiAc2C-p`cLQ0;@') +a)8SMh?:XNQ@M(X=T)kE.!k63Z2f7Z0Uhq!^\l68#9c%a(P;Zm]7,R.&"JD-Hs!R= +QJR9G^P(MbX1DQ2oiY6%3d.,[&*@lu41"DQd6sQQ"8jIHBTdNe+.%(7(*I2k=[;UB +@oNWCVb[sb@Ye6a$?W#_$-b +Uc/4XV$#4T\/^J&>Bps0SRJcE@%h7KQJW#+M)O9L0"J-Ba-GJbN53fRs@Z?`k#2;L`X +s%fa%:@&4/CqEbc>M5<"!5f3W:YGnfphO#ODE\Bbm(#hqqm4W(`m.jlkWH@4C*.Qk +F:RLTj';(Wko/KYEOP6oQb'SLZ;b'N&CJ*\'Qcl#RT\o/N=DWN6X +jXk:tg\adibX^=(:Wt*V^1Dt^FkgJRi'1`Qn=L^!^17!af5,0)<1/8QL!X;*W)EHT +8t#Gm\`g35km[*k^<'MI'p`k@UQ$Q.(10;?`]hq6:rZXNigfg +WROULlI'HA&t)K\'n/&p_)ck8>.Gf@Mu_lK_LB/ms.p;mjH&ms,=qQ(3;.?g"]Orb +](@+n=s+RP'am8Zn=KY::D;YN.,"4;"fN:[8c:JPf+7H-KkF`^]U`&KoM%5+tlQeISUpuT94k4S$A]oZI +eO2PA8Dn-WM_#SMmoBde2\KG@'#*$hq!JFHa"4t)Se_%nU'oR#bB]9$_O7NN&q3nTt!c +HFZna\^?YS(o)["PG20;P$#o5=Ng7PlcNo,njr)P#ck7MS!$V6U0u0=5b!?*gDiGi +/3dpS!/A6sWh3_2[s<_;I>WesZB'-[O"&o0W\H2f)q2&255c[6oj-k.:"&/mm./>q +m8p7l0+rI^A%"%b2P8$-?,ph&LFqrhZhB"(-P>.o.,OQ_'aW)<6C(Apk74#[[VSD6 +rZF&?b%>nCZBo(R_DZ(p2ecANCZ:`2/t1@pflZRB&"U:-SpTHc)dqU@$idW$!UGgK +4:bVD'u"Z&bXI_IIG's\]U)L]0-]#>LSMPU2\BgaiN"V!f-">=c]6sq*u%[9c!7bu +p?a1,YX$pOJZI]1E!([c^-,X-hR4IbEg_12^[NFdnPok`Fm/Cm05;JHM&XXOt][VA=`Vu%KF\7FCGM=7?`>.m\'*%"q2+89JO/lqlY93 +I5aaQf1B2Mj0rAaDSHP3GT40lg5l!ZQhSX+p\8#=%bf=*3JW +Q9t(hWo-qID:'0.)W!17=X5ju.@%dcBT-PA@5Am#YChac-ZH +eJr$En:-YU^1Ym#A(Zcbpd$KgN4S^7So#@PXQq^IAP77t2&i?g"/F-dX2-BGJR/.- +Soo6A3BLHh2I"s3%g(otVR/\DZ>/#UYLgkHX^UHJ7u4!)E]MJ,F5[>>hn0E(Tk+nE1k5tI +;Pt!^9f6TrldnppCW:Ls7S+?4RUnVhq0gBh"2s1RmICPjlM9=)bjEg!n'NWKf.D9F +S_p93e"N$9ChLo0"4c_uP+.^SSJp1pO<^E2+\0VleYJF--^Oi&LO9,^#0(6X6eGbH +*6VICg%>qa`06`5h:[1-T@bd1cOBR:(DR\O\%U"Bb_'/ZDc6V-]AB +Un-(-@_dE"H?-,g8r[G'Kk_Si>>7encqGt=A/&`'((k%LLe6^nRH6L*[FW;+5&$ho +*]\fJH"#dH@"W9FPIqH!:68do+:2_R*N##49$.RmbmL5A#O=[;T+Pmi'm[lZ+PjC9 +mIX5GN'QZT)1p9<%7']%'bK.Sr8DAnOJ2OiJ8!f<@j`Uu%u"Ws+7A"#gY6eYTC^VP +hWr(uhn'pqGD2\o$[@..i,080']VZBG1DXod>rBuIpTon5J]o%p`Jt'"n7Ro-K4ku +Em^S-OKs7i702u0iR/1?O%*jXAog@A918KAJsS'B\(u^5"ps0/-iAqJs#EU-2dDJ0 +X?k&`rjNoq^[I'Z@ojNBs,ZREJ(mBhL\UmnMl?4<.i/02a8,a^R."ZTK[30`IkaRj +eHFiTCr2h-"oc^Z65r47V#J+"i6PV*J(f;B]B)PtRXb6FQIL,5-!keR*ApFXWZFp$ +-p5[NXf!Ta-'/LDan[[Pr)d]"S5F:=GtETVH%Jb9S5j-jD,lN(=?o<>9mMD/=h&E^ZTgOQ@4u*T.[C>;InS\5 +:0`:2\Fh%cq`8-j/Dr!io/qEn4C\+1Eqq8L#4O +!-IV9E9`%d_!TeaUW,C`/E"tB@,@BW("=AO*Hd@UFJ$P9.rH(LBpg5XP:H6i+mtFAifGEo'ebHqJ)^\AksD7]_Udtgp1%]gcf=.o-EOpQ +f_Hr`i*F:HS)=`pT8u@jhYA`fGFcEf@DD;8!<.W?PA@,5Sbjt0!J(7MTJK[#RI`8( +(M5N5oNp*aR8KuO;m0?%[\K*mN;mQeV@b_WLM;-O6/,KB'*NNW@)k$Go,lku*oS])YX\daqR-C9c3<"4qIdEGsOPT#sC +)O\*)`FSbA#P`LYjnA!#UEQOK+s`p\Ok-V($N+gCVR6sQD&V[6BGg5j#1^X1V3ib. +8:7a?YtT,19Mh-TB^QPKlmKO#Z@8H'BjZ6K!<'0HlpI[A8c)mmlTe;t?VsI7eFqeJ +8(-*udK]IgqVZ);")$OVj,#_1+"REe?Q^/BMZ:!@V=KaK.WI>aA.T6#\>b395YS=* +V#p\?d?8T\SOR@R&7G:pdB,M0Ih9`::C=hcD2eg!!%1C',<@CRiE?6X=j/ts +q#=^s:W<.%jCXeCC67LM9lr];!!,="+3?qfpn-oMPMr@/k>//bO`-&S(OEP[ICXBMk(+(T46sim(Va[JBj03I\ +HMG9a#lAo&o#ntZ(J/DGB\PHp>Ls1N0,(d$`:$r!XBe8r]StORM;>s+"eD;"@7Us4 +j"21p4QhcqBD*@C5Wa.&":UaYD*J:A0MANP[V0#+Dd0J[8(AHS1"fHKQ%YTQ0 +S9qSfFraR'S'*^SeOM..7B@[;k&-7OPD$m@,>^Ld5)_#9q" +Rmc,f`1=C-H]Sh_D00`E'-HdVcSNQ>b0/RPl"k6\Gm%1?nr?mo_bWd]&^4 +/=KTh!WK9$=s4(%1dmHjn/mShp^`F)8bLif2W4VDl*D-'2L$4_O7msa)cq,#QF(B\ +r\M"m482IA_+1\,g>G[`YRV2"s8&k`g.`Q@Eo?tTHJJe9GnZY]]^%O6:+e%.oe(^S +Q7cu/UmliO4E]UAL&*pD9EG(;lmE=G7NgO>[i@B4)hA]2dhF[(j$K>(75Ntii-3$4 +&)V,!VZHQWY>Yu$T@BqZ<@d<8.KK5SX-LomeLh`KY#ol:bZa0=Rd`@&8$RF?kh3>cD`HgALQ\57:Ed'0jKHT@?BF8^_L];NB_q[_^r]6'AYW +&iN"(:r%Jns$o1jLjA%gr22dQ9Rl&c,Nk-T,74MRr6Z.-E\%3_WKLAaL<*`$*"N'7 +(dX't7Y=H>N@(c.3P%sCWD5Ui<\oB-6*F=IA#dQ!W$X6!l&Cqo7PdN;G=J?CBS#Es +#+(E(YJa$dcOtHR+qNiL+4m4eLE(g8lp-3i:eF3]2CL^b(Z:AET+(X1"I%78og'\j ++'AT`J(t*EpjZuY^;cND(kY#&^B*j(IguBs_LKZ)&%qsm(529$FU)r_7Q]g`AK`03 +Rhp$Z!NlVLSGs_CLEXpe.)j^jf`cEtlj,:o$is7V'R)C?X>ib))'Rb'n?@]I?oD5. +\O:8;7eEGNhV0+N:PSZDCBB*;_Cl]"^K;-HrJCl"qsQTZs4e@h-Wn0ukWa8;63#T" +!<3#EZI&&"r4cbSIPsdunpg@ls+``=T69aRejK4P01lA]Qk]B;)m';A%o;8I=9j]? +YD@\5FbE:`W]8e>1rQsNfWHpT4tk7uSHoTXcO)F[>ThM9No=K? +k\ZdPCWu:Q8@Q!FF\1]u2=:69*ehn27a.Jp/Nus4\P?DCNaKDY#N0O5LgGQC[J;"e +!tWHRaG9cY6l:U@(P.Lr_(2_,eo-/k+IIp8!*nI#F_9*GGg-T?nlW6dL&Yd%NEUMm +qKHcQG&.BVm>"POIVc#/)YiO>]CoT\&[[MN^4iWis$6Y_fC@U^iQF`Q#QueI$?.'1 +]*RJL7pKGMiU@N]?O/nV`V>KiS:RT@Hl'!b\M"%](Pi_`e8H6"O(K'[N<#EM4_J.! +/\V^!I1`]:(1E=/bbO[^NHO;?atftH]H9BPEWG7B$!AU4gX70'U)cPP\hIF6-Ma6% +ML^!;4\M5o3F0FHetMpTNVeaMr@Vdp/Ds7`f'BQ*[ulLHYC*looWUFB"V(2b^X"gLeb;gIu4E<77KFKg+":Lm2/Q5j( +o\6fKHOd1TJ`//F;O1e^-FFQiGbG#(Ieu16A"D%EF^lW!<5CReQ1dF_qt;m[Ei9VLXOmB"_FFm1Au4+T>GR +Y)sX3iQVhd[]I*Ok)HM6M5BtFE^_!!AA._BH`mNS-gi3lDA-*SXAf#$,HHr:ld8)C +_.2f)@pHDNIT?n=^^_KX6'8oW"%<-%U8:=:^`UW.)H&/Yd]QoL +2D1K+ED9YVpu;GN:MX$-P*g'+_iube0DkCB'm2%h%]C0%OoL5C-'[g_1* +)V6VI$Q.;BlVc&H4sP3#qpT=N"$%#c$pF0oH^5)27?a=.UP(Zqf+mHPG!<6coh-N +*807dR39)"2rG^^JEVb`;3.6a*]aEsfa"5mc?@%umD>]k`]e?uIu$,n0ck[-mXXmN +;LfCj#dAh7Kd^=mijhZj[;l=N5co?)SH]N+2kVMjKLU)fK1:0>AnI#l)H/5]7O8tc +WI^E>0;`M2,GYX#l[B2Ki`_@ofiAiX8gtoru^eR[fDruGK$2(.IXpiqhHeS +DuTbDs'qR;/HGSGh?*=6/-Oqa#K=8N61B2js(S(E$kJP$G@R)";6l*gJd_6h&7iGC +%aBWjl`XG,U0Jf=UcV._0MR._/$N>4FBgKiU0[!Kr;rUOnNl[EEt70\MZUY!(AuXM +aBpjE+klt:NYiQ3Mk\LhgLC38'`%'`n=Ot"IQPUMMfHJ'$kRm?_tX*>rpR6=ID;?A +#G$6,knEi>=QnA#K\t#Cs*e;DGDh'fk6_*)=Ub**q>C159hTn]7,mkqM5-@AM#Tp7 +]ih?eFOc6_C2#H"1mqO=@U)J`X%Kd1VHVNHg=FYf)H(D:PHF-`/Si0(i[cTibf_6U +bJJ-KTI@kson!Z.cODYU$*_P@[S?@EptmpU`us'a36T^`dPbXkYB7s7@`NCrgNS%_ +B6_mLA1(d_0R2_:S9#:^KfC(1s#b\r1'g/_R"+DA3UiF=SbapC"nHOtbJls.cC-l\O(- +iQJF"Gjb]8htSkB46)%n)fOR@c_]gm$cm+Rf]UPAEM,3U7h1`E^H`P7!V;HH.):>a +#a!fG5ceD9QZ@o4MkkY)pt(KeE?Y>I203mYJYe-&I4LO/T_F[;d5n*A;?3;3_jXm^ +D?5)dQd-%\l`*_/O\,;Pp$f\@52]Y.e4-$$rNKm7V.rP15/?goAn:*p&H@f6W +XAUm*_&jkNJ3T]uCXf_#g,c.hJAQb-4kKe\J!LQX;?OSu"8kZQ+-lF&LrC%]("6\? +)?c^5MN<9*eL_Zi0#H1h$V0ioj'Z&9pe^_trR*uP5mK+RZ@EF$;&H$USG\or)1_Z\ +;V!Y;]O#VB^(CY1It3$VCg`)R:9^+6:?YmWnWjg7MRFA +k0&J?abIYi?.KfC+Sgk,U9mGWA%0O7NZf8>iO5Og9Shdt\df[Ak.&d5H&0oPPnc-XZL9GTs[g@lYAINn"&]cZZh'gCi&Du#f\$ttH +m@AG:E-M*Cht[e?FeF?SZ@FT,!#Oo@qaK)kOhe4WVH7JV/t'`plgFW.CEKkK88T*V'R" +^'Iqo']:0Em4r_\1l/d,4hL/G$QfU["7SPKRQL8S*@6?U+"sPP@g,\7aCcR#J6Ddi +)-F[K+;Z+WLptXd1$aPWoYPtC9umZ^#LD()^5I6&Sn!P\':5t8bLYB;EN+?2FCE3X +;;6=%lW>SdSGtG(^R-$9fIB>:2"dFh9u*.9Dn4e(GE^6tS[;>#N64EiN;#e["tg<["^p>(9iF$ +i4j0MU1+k_IsAG&rT48Uc'VO,ZV3ctKP.H\"7o+ZL3r*KfCY3Cn.#;^i53(0*BQ+F +4##nfSYAi*+ftarfJ)MkV6of8Ro_$Z9A7X8digD#]_`[=X*.+;CeCIs:Hitf\St6; +Hs4!kN`rnWXlgTZ/fQ[olCf4^B^2sR"7RDRcR.8g))P+Sf1h?B"uJraQ1G729;]e\ +/A:=Gc-fHefdNg&KVlPcB(`.d%Zh$D20,=gkJ5?(cE/)qC;YZa?#"*@lD\Vg3kug? +0gEGq_L<'c+*W8tpt*S7!<:5RUR4[D[47"j&<-dR'r!rnb-8J,9d'DhS4jGHPsM(s8BG'%gN&`[fDruM67&,#J4s2QM9:gF5jFq^UX8S ++TMU++?e#ti6DBX;*OW.47Ym%l@XWeR9i@M"dh(#c0=Y.a_mu4DWkaf2YiK*mR&H4 +;QkpRk_ORFS16^f-+7,R32dV*C(^<@kMCE;"[?K'r:_`a"TQ7"$3$Q.JNp9n_^+a7 +'nJTQo)E8qi3-qj5^uqNpP/qOhm3',29# +oQD.s1O^#tFV6fb +(bg4T1ir"JG8A-1#[R]6+*l2'q/LrbcU1_5aLa''>E7_KXt4DDXMJ'mUR=#ScLikn(\s8<]uk<X&a?]33#sd)E!TXCf*:gN-[`. +3mDH9`WH=-%Y-"D]5?fAo<`65qsaG^h7@l@q4)1Kr"7e#gTV\Uq$1sa[t#Lc)tto%)+W$VeJ`7EETIS'?Xc"82^!BbW3r5C%Vf=rl;9$hf6nu +=\AY*@0=OMUAaq6Ep]AL'Au*M_h>69[fCXR>JGWAMY?t,BNG98qpe=^k(h$-;Q"Q& +=OaO?2lMc!quZ[+s#"in206B01@^'K;0"[7!RK9%4-\3ULku)5C,?LWJ/u!.ktS1V +nrL!M!r87)nGn'G=\(9H>plCM1DShT.3AZiLE!lc&#rNb0:._#TqbTfpT4*(,fG18C^P\t3$]3Rs&/Z+ +Zmc\n!^O.6Pm$k5-8D8fNK2;F*u3UX!HpNM_T>ZUD8p +$-+n)03[dlgarO(s3W+lkB$R9_>2F;s#l\ZY(,O's'^cQ%h"%T//%rh`;c_]_>c=; +pVdR"(DDK%*[6!_NM:iOs1;1CRsY;$9ekV%1;YuMq>R.Ts820dA-%=9?VL%jMCnV( +\U0sT7=WHH_rAGY-iUDMo!mrC8sM6F=FNA>D((=pSPAOre86%(kcR%L0=(fq:4ZTIJHj0%uC)AQT^[=<(jVk\ldQB9qgs +OQ9!1GoP5'bd2/VC7IZ%%_ZX1,J0OG4!'Sim\>Qo';n.FB>HBZIT)%$Zc<*)VZFFD +IkK+C.V.d!GlBgU#Bg*p35kiDcBF$$djQaXi4]P(_hY[jHS+U<:[He/*87[k/B2ib +L3Ljs%]m^TFq@T!Q:"jlI:*(GNoR&oO4W`Tqt,Rq3",$LO*Z6Zo:C`@?%oDt-_:Po +60*OR5-sQ3JWC5WgHImTHria$F%(L7;*.Uh"Y^"&/)WWsJcBto#=AA*hMYJ'F(jEr +;9uu,i406][3%H4FmV>9j1"MTa=?Hkm5>?5ml?=8CDIY@q(m[DP=04"`N9fm/5da0 +l1Z3]7;^Kpf[Id_P(`I+71<*`9^)W0Mb_OKESQVe=qTro[(Tcg4dN%Q!VKE.kWp`g6[s43a;LNZXZ"m8KYElZ[3-RcbA8JH&kP +4l2]Ah%2I/LThZS5He4J7WB;iDGjYMQ-70YEnJORbG;^0Q#a<23MZXZqAn>?:g41iHM*_Mm>;[CX\]9fbLNWLdVmqGF$Y]cNU)h[:&Ur; +KWZlR]O97!B[EtOD;aX.Y_]-ks(Uk8(9%XY:^Ms3#VR.KW<2i*BpB3m.`TS1 +&H#=;=,^jYNG4]q5MlGqIo%AnQ^H6q`9:/q)pl_Heh.jgQVC:+LIfAdRe`_i-%fA) +h5V>UC71XXN%U)H&FdG;-+O=Dl@ns-@(UjV2.-7e5beYqHiY6*q`mio`+fI[!.]Q. +[;o0)C.a*_"&usL^6!_'&u:fN9l1g!#*Hj$BM+WBnZ>]=$qRp73T#HoRSM_$'l +U@Z.$@&I8KF`ra1'GQVJ#QNd_\d$=&,D9i!oSpQ*W4fu']8IG_oFJ0/d:`$ +@sFH:ZO't71iFDIm=0Dc;IdY/ScjlVL=fb>kYh3:\$r0`*n;J +>1KC%'"R6.jiKWmTfgb2Y1@!`p/%@+@%Q4OT&+EMGpJG5QDZg9M_ph(,#@8t`j3]2 +RC`?bg&l%MrH.V:,YECb\LEPD)bm:=1T1R7cM'3?n3NU+P2-Qa0'8Sq%YaW5Cs+0. +6dM4Mn?+/)ctd7NF6^])Fl\U**6:-l#i'X_aFEF_i#fCP*P(f)AF7sJO>psA%PT)-Z`\NioplS+@fo/q2dK#mc9II=Z/D.bk" +-*H%V?mV/rF/VU!(C-Q]J2[tOnm?\X]_X*s"`)CD[qRS$Dr/6I3Ukg@qBbDL4o7!B +nR]MaC]EL3O2WV.1eRc"IA2LaQ#R8E!Z-C% +M?DUi'1]E6o%KL[jZ%ZrgqTcEZUa6_rq"WSg%(s>:V95MNo_1&E4!u3?(Cops)l#P +=d>-Vl0N,pr$>eU(>.6ABK,Lh)?BckjL/W//YIGp#JkeCd_;NsgsBm@q"$>B\E]?; +C?78B"WZV:n:D[/E/dmh$K+Xo.CL["W7nH(^7s2oOX]D5Q`Q?bSUg`uUkT&THE77& +N+Rdl[&@7lUK5Z@Y8gUrmZkm8<[jKgXhj^i24toe3e0G!Z\"rX4f)-bJeS2ls2CEh +PRXXZ5ib/,>ZH.Y7B0=#CB8:Wsm2arf(])V6PY+VbK& +Q[noi$Lg>hO;`Y@OYZfUZJ3pn[5'I1RHSsNGQ9oqqeu]HBH].B['N'#l5=iikQWnj +P<,HF4$HoMS6VhR";Uu(h1UUVHM(6FI\gKTD?k,4f)2?a_B&F9L`-]ciC$fo3Dm6E*- +SIneW.9/nfKtN$T>t'W^lHuVSdn<8k!fa!l@VCLb2ac8XY2B?[P46g#ZB)rEm`A7V +Za@S"CnkdY6Rr5noDD>3"3B^MA4@u8*i_^@-A0\-T-2ss+C22O^j\n+5-FWmIM)To +IT3m3oetsQGCF$!#Nk%^J/<^lQ[hanXT.2nrn@p$:'Mi2s3^O2\-q(!HPRD!^(V5c +pAOLNpT)(^e@Rk1\-k\c;aKZ^W%0aCb:q2i(s*.@!_U%b::?cqD?-pu=LC%RTeg#$ +39C-UVDpMAFMEcR`[&33k5Ro3i:hs/Ilq`>o4c$JYp!02s5a[H0;]n1-iA@^nFKL^ +#ihSM%\cZ]&DM]DJagoV_Rh#+Rr!Xs)W;ruE1BHY90k3",)brnOT1eD_P]!`T61P> +A:T3U#YYO%A5)L!ERF4`M1<3?!r.8p+LtYJ@&`c)Vau7`?[95E30g[.;*^X&<6$k% +W51+9S1R^4/(0e<][]=\Bsp9J-;P;\L<1FpGWKh$$;)]'V1li5#Iq?XQfDrV`a`C5n)AsF2Hg\68-=H5\Rs46+VSH?DlY99fbSG6D(3KfO-\tmE$X9:Q_=t(q +%kMCW-8]]eRYY[4W,4#V"4sgNla34$d10MRD1LJ3DLorc(nrX_o&\[+c#uB[Ul2YgJ6#>^!WA3(XAO$qrq%;&QJH_kWYY_mH\u5GCV=K +r86#m!:0gfQZS^Aj;+n)'0:Go'n65_PKG2HMM2WAUEVp'fE(ut@Z.m?]!\1KNQMQe +EesbcD*Mu(67bQP5'Yke_ +*T.GD!;E&<\]r(bHI^M7@N#Mil;Ztd"eeBpMTL+q&**thH]=hA[C@F"8>%nZ!@a)C +'-=^'8iapTE/Ar"Pjl`t(DoHNPS="h(ZU?*]IZds%rUn69\Fsg-[tRFGtR&kaq;,j +<$FV^MQqk-ObLq$Kuu[b.cL1Q;0f1HH0WeVMI,PiSfgQS(p\]1$6^;0Ja#cjd>AF] +W`D[qjuKR[Ku'Wh+lp!AmBePS4Tn0L"m][rf>[OrU'DS6>Q)V32?iUI\,$WDpj8>/ +]][$YIMV^,rTBLE[oi^>aGUlF@6>n7bjSh[kX2$Vcj+-S0:N#O;oA$\s,kS@I.Im& +s5STE!U8GFR9nA_+%i->DF'q-=f=eYQtfok;L?(30MQjS?#hAiAA(P/\<:f6:O(X: +s"0',#6fQ5,5AK9JY,a.K7MK:)r^\9&DrNQpca&EpVS&d+*J7qX&IsR*W2PHK)8DuST)G`"Q:I=\\L4r!2f7*"lVZbmerg=hN*!YIl^9uknsG] +8+6CajHfg!gEfT6,^,UMf.%j48tRXKb:XP\J.^_.03/')PUJ/L.'Ad`YEgYiej*e= +CLnurV(0[-8ol+*p[LnA"9G[c]QZml#TQ"l:%Z95*ISgY=N:[Iu-_\,bXpPIjkj)eON! +`]]u;diL?m"IkAYU&27tier=5Zu7=FGNQq+p6\&:@Y6>l_r#J/n(E`hgQ!?/O/"l0 +:+Y`;f[RGVldQ4I[J.L`!MLs[W1iGQqrU49nBPr==5eI63s#9:[HKi^+$"IV4nkS( +cb0WeIN,fr`c(OH2sM3-l,-[]YHN9ebtXNu'NDOgLcQR3tQCd3Qt7 +KMBn6X:kp&Fn3r3O93dP^Qu+qEPgR&;4C)g)fL>[DLB"Y%:*TIpg=-#2Nrn3UBd*[ +a#7G#6`Z=old6(FeuA'3Z,Q4Cq8fg*[^TLMEVHps9gTn!<[&r)o6#+:4^SOf:UXo]:212O;H%f^f +I*n*t)-=51UJNZC,^W[r')2u@-e5D6eA-3&^M-?QEF#nZ7AXU&[M41D8#kM3pgc,H0I/0A]m+h+$MIJ4Z)@,m85pq8<)q]/ZZH7>ci`@ +obn,8+UcpVk^[#nUW!B&"8kFbs%1bh=WQ#0D,.iSRTp50PL0kiNa.8%j3('he<6FH(c0nTU"Ub=I:["'=;9IjT +_]Kp)?PqA,9a;e&kZ,moe&q)*VY@$%[&VL=AE2Fo(dn-grVFM#RTXJGR6^a`[59"U +LK8R/.2UK"b%ZRMeMBHbC2()u1r):W5d^Y=!m.ibWK70H+ooGDW)emYTc.",(mQ`j +Q7Wc?ocu4cg,J,eB=sH:-k>YB7);(n_>g2bEe4+*8Imu#,A>LhF;]"OS8YujIthD4 +>Vd+I1DGEXZMpgYIVEg'RIYnHEWPED<=HscL(8`FUce?FHL-nBj-oJU5$?0n0'A?@ +m@PRCS15JBVX2?"o8'/DVHV[6H&>6T#_>'O$k)4i@m_+>lQJ&ZV0= +Wg=J0U8.r11'.p!;Z+Rn5@7RkAb_[D532b@'%!!Ca6Gnh49&gjhJT=NqKFTUI%&c;i3i8Z;1o[Y1?k'e8%b"?bGC8#ar[aP95deNCfWaQXa[QWojk9&nNk^cK1^7#>:Hma0"kTe +BYF?67^;STJ]r/KgjG^Q<2SYGWldSaHS)L5?G;RB[2!_TFZ+MP% +I63`X#1qWW2k6eSSB#e8a*52:G5Wd!6fu^h<\@i>Nl%+UK@kr&m#)GCA^D(D$gKft +j>@%(54b@/pR/p#Bi"9!Mshil^kqA.l?MPMHgJg;EgSk73jiT`LAJ]Qp9'gV4p.;: +rS*Y:qt;85L@7"sgir`%SAfCfhX/5p)sQHJ%G:bC,ipuhr84atg9i!A]`?7[n#Ha< +oJ*e@')6tA`^U'Ir4-I3BJ8Qa2Pp@@&/Urir$lgM:&*F45.i]K8`9W?c/=`EfWj`f +\.;oKH&ZqX\oaE%F.5.2)4m^)0I7oAml@0M44$B4'1L+Y`CuI@9p6kt;^BS$@ce(2 +b=iLp)SpIN[cZVGec29aHnBgA?-Lk=/.6\=^4',e!gA3H4gCP?YSc(Om>("ie]=HG +0O.E@-K+%5C_6AkDDo#"e$c'h>YqGj;lKp!6i<";fS/XcB'l*leVmbTU0?Y.W=C-J +aiE)-"m+0Dc"_K66`1e)_*?:nSQNptY?4f(K!9`/YBa-]"uIi70J/j-W)1""=>V[t +c^)j_<@ctSD;6DeX_BIjLe);bea&;&B[h#:.q]pb_2g-]PqGmjg1;LL"mh,bS9"Ft +DE9U\HB"FVN'g'UD*N)Z20N^m!9St?s'ReO>)bV.N`DY4"nc'W5K*TFHHdt)-D"NG +Mc`0?<&CFP2PF"M2ZWkHIFRrkL&L'nM!ZRs.a^;\?L.HG9T5:&u:l +F/Y'SPe';Ieg8e23J7/g_ckt_Ro2DFSGPu?G>Ptd>c3NLWLD5o2Glqf, +,=$_FdSWmK\3Qqnj-`NZYZVo,+m3Lcnq18S(!h`;13k,0. +&-9u[re'.kG':MR%EK&4d%m8i9ZdA7"8OG]i[Y^P6!0gEW_ai_:Grp^cZneH#IZkf +8p]Qips9H_JL"qT+?s+FZC\%9rcC/m<-_i*JmUQ,m)jkf7=Vn#2kmdEDi1W?U9k.R +#qI3n4@7=NmYQ#O6O-.1@dgqK4[adYPC8mqjHun(P+pl-;[?*[%nTUe8Ps\A:gDJ> +/bAnAMo&2/,IK0)kY7bt9nC[7r-Qbr"YV%]V[K"? +$6DSADMJL9q$V9"pm57]Q9E"epbmbe"^KH.?PX3g/AOH`hb!T_5Mo7lq0t4Hn:P-] +i;\'X)^MXcJD\P@;PLsA;lr6RC<_.+oM1`5e,^6;bp8T2Se35jkHZ3$ci1g50 +7D72rh>Qq+FFR?cn?ho*6+tcFc2HZPWT3Q)H_o0V-.5Ei135JHPA,pQ8W'XTC?;/- +>^oY+QYrfZRGjrKC[44CQ*q7PZ4].0iPSiCTAFUXg@LokpRBqKA-):Qr4r>jQo2qg ++9a_2i#qiim6I=+rh'"\?(.^*K2mJQ]pCnjW+1nSm#glJ(]iJ<@`s.4_fPnNT)XFV +J%kM?m5J@:S[N:1t5si8LB@#?nOD'0i +4`70VTt)l0YV6XD]Yk?YqI/-06C,A%^%IBCNAj%+E/e/h_(D_e?/%Ye.abr3b_CWRJejoB;d`cig>\<%9:paH[ob7i/R,5iZ6G;C!iX-.#$sL:DApYU,iJ +=s`Qc&O,^k"/Q!):Y:(7^%"!!AHAu%cbAi>$Ggim;]Z`D[^\\kjN$d(bW>.>K19Blu0g.dY7n?a.=N^MnA +7'tl6Y$=)`:]N,P5\WL^*3f8ME.2%*nK.d=WtJ_F=TEDi8s]im57:Zs=J.S3mJn$, +@aVo%e]@t&T[lBt5H.d@Ulml//=Fkf@-cFMWQZg)$@r/4B#0RT_5(s/Md-Sdmnq5B +P=b.>9H-gS*R`/YVO$&?OpUF&bT"n\l6YP9U,J]JD<_E(4ZWap\qU*/73I+F4G@DN +%7#B]']=Hs0cc2QidVLBs#$f*C\2gj3*\Ib*:9d5_4<-[S0N;@t2L.+3XdK +^]KZ@HR(iG`'om_:;rS2^o&XXd?XW.Q2PBR4pc6NYtnWbA6`T>SRSC#i#]&K&"Op4 +57NsdpQMriOL,G.D]ekl,uNAH=l(MtfdfYE,>$]S=jG: +hr([.Ii&#-@DVsKr&=M7s%.)t^jfVXli5VGs1@CNJ'.o-/H0&<^V`5f^cj1#N=>PSar0BQn3e.j[!i0Jgcm5EK%g9P0%D1e"Eg-R]GPjMoXjcX]U!jPO;r(>g_X +5-,C0WY]p9+oq-4H8jfH55t$Co6n*/msBHc+THYt#bSI9^UB\ +LJ6[%>'NmA]M\U,8c2#`peA*59oBkPFs#e$ok%-78b]Ed%I1E^dZmjLNFPC7A>QCq"%C850)MaAY(nVcnBMg]Z26(Xq4^UunAsEO@+6hJgD#gF?$(1kU-N+j.V.,!iI.h7u +2T[.F05,@K,Va)'KPd02'j]H;8&C_2B0L$5pb$:V)t_s)VB!7,gB%b5'EGoALaRJgFk@"Q!A:bo>s@S&BWE>kt[Q):&8) +brWZ;]NcVur(HU7$aTSLdQ)8P;_85+/![6:<33'"_NbB(f;`.%mJY[]?e-/AA*^K$nGP5D#sRn;q?d_S"uoeh0*`lY$*tj +^oDQ.=9--dWANa336"7W_ts^be0!rE@RT?KJ[tabX-gY\MHCWKO)Z +1IJ.Xi*S7><=DYtO@lE" +n4-8A+4u-2Uhk[ZCkD+#TiQ1XAq$K:JJ(uaO)-"OS<=W#1K8r]57KBU7('Fhf& +9ja?4!.u9.0F13.pW7Mtc4.#"O0H]^6Hs%]j)q\<[F1e*&H&Fpl=<;Ge&*UP@:Ve* +:f;V<%O74.)GHt4).`pih=gblJ+=!%p1a;ec(AA%s+eETcN!WCJ;h;GE#6#Gj;%E< +_uIL<$bEA?rG*XN48@jsO*)`Nn>"f]A))Y5]'(2f5K81FUoRg&W)7H:;,O8X<!YP3pflOeQo-2O?A +po6dHU/C-=.0)E.'g/N5\ni"-hBI9p.fQGRltqO1f/f$XmM%t=0(G"7,X1LVGge,3 +Y"eh"ZhW:$Z"p6#8L:m9k]3@F-V&QIEPF_@VBK-J/5.W[:c$Qn1YkDCgYT0ehQb7Z +_%,a4$(BQY?JP:Iht*DmnK-?oS3.3g+,)>;7BBf`Xe/*kSb]%*cQfrtrc8kVo@G.u +9>>a'ZsJ0@_>i#/%bI*jHGNV.ih\:E/I-N>n3l4(l1D^7jIZ%_^F">*nGAc_i(Am]f/SU7Z'?)R26=\$c=I>96oruOSs%[6eZL`>O, +BCXc<$_MJ%[;b1bHg&=-ECX"Od&$KlF5Qd0rek\]&^pCqL)2J7g#V +#L;dB%IT\Z*n^smfT!Q7S-'S;n`2qNE.t_;/Y9T"X]fjj/#-WJ,_GE45WTcLF`H#s!DLZD8c:Oi+;ZbYHY>5kR`FG +jJhN+n:0>on'#edZu7gLA3G6N2Z`[9(.5mcFfhMUof@p#V\D`'pfs@Z-Xf._,DtSH'gVb+FR!>DbQ2: +'Qu.DB9Pe=CetO#o'(WA0RrLMH2VjUg3OHgruS_!9='(ANOb`h];=2jVV\POhRKH9 +]V^Cg!01geZpO;Y>i(-Mp+uO"6)B/>NH2i6S8R_q:(9k&P)]251]ZJ8rf\ViYZf_I +=ul)%6EO^!ULFjB7W"UCDZ]nkl8L=7[B>t*K+"o+X')6U.BV#Q,'Z`:R!Sb=:?dFT +eYE]/%Q[?7T@>K'kuQa._Lnk6K5-)b)C8nG"sLcGn:+7Z([d&9Mm.W'KmfBn]ip-9 +1^c@#3B^OL^"PpTQ`m`SMDNHPrDSSHE-J2eLU`,tmS[&p'h.)!!QQ&l +5Tg*e8R'V$h*(-]h>PVmO1\usI_#@*6g.4YpYN=Wl`=#O;=NQ=httLOrH>$N2T>&q +H-M)sXbJk'-60[Z(qqhK_h&?eD_Of([t(ZMV)MRg2HjYlr$tJYTN[7a4T&Ea9I +HNbgDpa`kl6\tQ51sX,,?HTV`B3RjeR7D6k,Io/K>dKe[lZeElK2#"[FcPL,6ku4" +.J33aME[0KEoa$!ZK!Ner-8]TFoo`;O%IZWVe&?Nk/Q&YUMY(IXl&W?%`*WaKH'F\ +5:k_eg!=#2rlP`@_"BVchqn8oir>,E*3K@b8j0EXLYf`fn/iG8#5]P*<>o9FD'es< +,l0MFanQD+`jcgS]9^FG>`3g?_0#$>[btd;8@_o^V8q.:<&X&=3;oXQnXXjgWu_l\ +qaX2LNKQLJ-%@XC!rd]#,E)JhYno:Mj"fs%#J6I[XX7G6Ok<>=2W]i']eR>LN.1lg +T>S[p?t1Rg&J&^1)&o;["-2$<'/nj%NI,*_Q`urF`-ZJrH[-H=&0Ecm5&\KUl,14S +_S-m3IQ:*t@S$K^6%ojHQ/:t0!"4&..KAH5ohc+m@2&Ip3r.`W\]69/J:3+FDWUV= +P[F/7J(1A!qQO&kFcQSBH^.t2.)"nEJ).7'\m=S!AqfE-ML5$e)ccIP-$"&1o&:XS +_0!qf7(oU&Zf4OA]HC_cq,^i]VnB0+1JJH +YdtLYE&VlR.suY%;Yl?Wni14nfIgsbLmD*8nZt9-dk^Khelk.d'-NY^aQiIaPR]U!o3jEg! +%-.Zm,7D"0hX[8l%[[J"mtE)HOXha5o[XJ$Gc\T'-k-W")G?I&B<%aeVWqAn3R]Mg6^Xg)9[?5 +,%OX^r5VV(nC=k#Q.*]5>_)jMI^);M(_VUn<_^c7orD[6_#G]D'`Y@@2_CFubo)gA +C)6mD+mat]U6YnEC?EcSk:c%a0'\eJC)>.\QHU84c^C$B)AJ(Zf`JQtM-f&3#.&o# +^4^ef*M`/\F.^Cf^N=MbK':%Md=W)W)mmo&Nh*ZHDh,eXS(=`H26L(?bo'L,(t:1+ +"97*kbaTr=X+:3o>qTKJ4^_5GCg&BpjT`MMaJW-#tT7c`2]6,/H#rsR+h$SJR>!b1I6Tlh[-]G-Lc]NAuS3U'X'iD:tUIgooh +!k[_(>4!TK%U9"Mhm$a:HqtPBR,F_^MX.a_(NT[UD2i&NNms3G),.j7!,FL_@&(17P'p>'c#u +As%Eea#u0G7!P\,:dt#Q_F2G7'SEIqc,(/6%b$T3B['sFE"\_oZ#kg"oAXG/Z*p/> +leH/(YQ2`GZD3trU><,L4EJDG60p:lS5@;t?Y0>3_J&+q=Js;dqeJm+ +N\o5$9RRLCCTd0Zm0^8g)WcSUq.D:DpGtheoasA,+oIWrr131>k'(\do8Em.d_>S2OaOQ7nS\&WR[M`X2d/=.BIeF6?Fl$Ag_bB.m^HQ03sX+=UgtU#b?AT21GVP#E(LX-FP.r +p0qVW$[;5EO^a"oN7E*oHZ'i@WmSbDtSW[_K,FmCS_(S*0PcB?%A5 +#hDc]Dk,d)SeKoO*1XHUPM4j&I:@<]*,k;/E;,OR^i/cD54,B>^:sg&]rRmPbYh4hDLWPF>^iA.>UJ][ +VS[$_eK\)IM^_Ft;09oW4e=W>M6 +.7aL502:nBR+XYU]&Po_m5f3*C38q>fZjf1"`WoeDs-cVQ:F0tF<+6ZPIa?A15TGm +XR3DEX'0UXb50hNC"9;)NC^[#b+N:jXAl:G*`YcHC1^9+jIu6oXeI,:g1B=@S#-WK +9!q:SoI=cF*,\ZhCf1@D^JHLLUn0cJa.>8V-;mPB9l&ocC1PV'jXfWW9/UbPFhp\m +(X+?S=ujH0l(]0=]pae#.KOA6M0,IB=74ptp73gU:nPZtY4I +]PQH7@!6D+lM?Z4j+MRn=MVRXc&11384b.e.X;6;,=]WS"pJK``T-)l'$JEHS!kel +C8k5#ZumDeNUR0Fbc?CDjV#a?YuMh%]P>ZtJnJ4<[;Q+@4#V\&BFXRYO9/Z#>??W^ +%`A9#ZQas#RE26,/-%M=;__`]-A-f]aM*CI;$Od1BF1kCO-u7A(`*T`P`46qn7f9s +\&L.K/KWjqk1c-n=Mgk]PZBU,:t9>]K";.g(3WmsG$F-R=`HN?\D;<3pgp^2e$SEf +WNDJS/XG)_VJ3H8WE#fEV2!2,!sUfJBuh\[Aq=>fA/'bnAf?ACoRkf-!BGIT=o*Rb +\iuPYI[PriBnh'fSL\[ukG$L%LT?pR;a00BI,#7[hDIj?/Qh7^T].CBKbIOQ4abdb +r06G3$;LmWBA!LJV&%8f.qZ&/@YmN)@)(JJZ,SQ,c6fU30"]7TXmC9VpO#54coH!6 +>9:s?2q]r>acaiS.:>+L0^M(#M7/KIj>$!]M0=sajM]eba4]Rq`gbFU/CFY/MqWD7PO?s.\bR#g;F8[peh`L;"O20S:c +T/8(5gEus3(P23O533_,o`lWX/Dt`"b',)[YC!7@[8B-#7Xh7eplLF$A.[APZ0.K*2WXX9^YQF4Qs8%OV(9i:Kp[j@VX>X]X%?)DG5(D.n'L!'lH!$WbVA`T, +\X6#RSrPh?>K#D0m!n:bZ$/[In&:(?s0b9>^`R[QWYqr7Qo3)+f1tX5:$G\0(tC5W +f?Kf78e!8jFUCW]$\n<]qXsIUAu.b&i4mp=@`#Ekd]s'.@*5cEA5YU/<%9RS'3itB +/8N9XWWe\G6JM>c]1,=)+@gsLJ!SrImY0=p!W:!_9DB8Kj-HN.lZ.M?N8Oa[^0R#N +Z$(_J%H'H_=Z1/#/mBR#"S`KH(CllJN`qd1fiR\`CNrTsK6@tSNg56?AOH0V+Ktk( +s.FL;QT:/B\DO.d?5dc2l*2Z;rcd&XpGs"2>NL$1jP2GSQ%gtbWRbQ[)6eYk&EfAt +1WiEp-)QO<-4**fEI%DCC$G`Pg4#\'/ajDHM[\-WTL@=OE@PV<'okd6SVU*+&HY84 +]LRLb431dSbt$1)?cgJeaTF'o7UIIfX3.$JWZM/^Xs#:_0rh/#[Jc"W'.U)I/+$8N +BPI."TT"2Plt_Wlf4^[8Qcr(*KX,YBAV!p@UX'Z0]^h8V\OlMM,hm\^'$btEr;VEL +3UugYIp"ft#QEo)34#BA"oM0q+'!c=)udT'"9j)MMZ7THrYupZ3g?]pYVXT)[hj=M +HM\aAo0RF\)J(s_rt4Ygao<'B!\;Ws.*eS=_7c;re6uD$@8Dfd#Ai`:$_%UE +`\1fWmT>)Vn`+r^2pKDF^?E@]gPpX46i*UJr)":+_bLj.FXQ-j-O0FOQhXE" +l&u.rk`TKc-8+c,cg^-sk!#>R3Y^KXW!VqpEe;"Vei9l;=OK=#.B_qjGk&TYGfM2*kQE(RJH)RRFRVDGrC8GlnZ)ZjJ"6Q. +r$+`G!bS&0c[c6^]HZ4E.)7D7G6(5;p+M@ho9mNmK^O0Xk<58OBJU#fhAl*3e-/,: +GV[f,M;j[BkE\kcKD7ZhkY\4#j_i0/#8sQaB5YCT^ADgGqSV7%pL7327P-b06@0'< +#fbPSqe*i/?=UeN*KU3sSg2u26ap?I+oBoWXU*a(mbP*]`VD1:.@`/o64pM'SJ6[* +PH$'a17gOrVj7MU([D't=eeS?^1s*)P5'KW[HOn[cZDpN4k^3fmKD*>]7Y&t,^%#"I"+MSb@#6k.XF2g)d#*hOB +@\-Uan:/r\B[!8O?s5$80*h91c-%CK'u5 +95Ld4r$Ums&!%%MeOjYX;<2X&+'$B@.gG?-b`D?;T*t%%6k6UYnuTu(/P6'C+<:CM +OCqiBE2XY^WuSPs#7DAiW.m\?(X.I."'26Pp03iAfHFT%$g>!a_>d7-heAM1CmgaA)N8-AYocf`mM?n+Z[,"g%p86g>3.YB4;QM`[[R;Q9PsInI-_U +LJ^0#W9urN2h.!s+5+VolA?kU#.+X2._5i*Gm2;f!,j1X/'>$O.P=e&S,u^H+WZA= +5+AS2&*@oW0rN]YF58^_`?VkBL"#>2D0@OHF=jHc@b7/DWkBrQF/+j$r."P2p+--;ZTs;( +s.98$o&GH3n+aC5@fM=L%/rdfV>cOurZ_f\9REh@,D,q-o9k%;/:U0%^nDVE%_.Oj +OU7.7.EFLqa9D?GT'0%hFM=@+d$&=cj-WG3oN/)8G8mq3hp?V_8,^n&eLu3jh[>]u +R#q>V6LGAJ`1KGNhiD:)NXu36+#RQs]$Q5(P>d>%1"g<`!1;LL)i/Xnc)$o0aPB)9?(n$]j!gL>tt+$ +JH-JTBaaY!%IB:%_T2&^&)540g4B0T&%f',HE^1kYYY/$cN]4cq7cr3&sC!G;*_l0 +;aFenhbP6W]1M:s'9mD]e?=Oi06hN0%`uEA9mPSfh7lG8Y**!@QCGup!rdBu2&bKH +b9K]k_3Vn:Ud4f&5?h(on#B$s`Nu+$R>Znh>D\7K&saRdcTb'pI?M&6.-^F+C[2"2 +rI4[m:<_KgeEm.TftGJ;qk;GTIgOIC_-aXp!n9YuH@o$7T"Rs"dc!b#.M+0>g/7nE +VkK$a@Cug\1'Q_HLI[!bT&ss_)8CnNbG +!;M;#ht2r4oY1>6N*lZ?ib*f`"u"ngWFbJ:VXV=kk\:r&rh0_pmJsgOlne=eJ**1! +/>N8R!K[J$T7g%Rn!5KhU2o_PaSl@ZMh($oDpc7>UNb#oc8mm@W5c*IF*VfhZDbgm +aDNF@,a\T3F/`JK7(5HchD8Br>7[:c=OabEZ7Eqo&XjjjsetbX4 +?R!j)O!ppsO/7]?1O(CN+o1mfjWoCl](fD$XBl4/!6^,4s)R&tN)no#5rCcpegph# +Mc,_,V,&PK9dQm*F=mf>#P])a?bYj` +nMlVkP,%&IH`f_?NZE?1R^VV;f$,-Wj1ltk.@\g:=YN2'T/!F9cmo.lo5k=is#e1c +M%'8*ZSJ4gWPG;tA6L-7X+Zi^i/\-C!n20h%b.4BCfL]UJGQq"/dTZ_[m9"-YUG;! +!@!#D5E#Z%;NT82$lf:q@FCieb->8\=$:;$#,m=8+"REOJ"Cp7^`OU)CocJod$RN2 +n6\Ga'09J>[BDnL!9o#$on[Gg#_/^I[eS6f/TV5D!g^AMmR*:r!q?<%Zc2\ +Y+4f1lo'/eRqp,gpS']%G1ATRF[0&Oo]<(UO)cS\KLm[dF=E#ic&[(n96B/ID)j-T +SG\mF)\Bel-Mq0F+&BdQ!.b+(r',9(fj6?og`9HkfV&lVhjj^lF7%0BX_V;DZ/C[E +i'6K1F4:TmOT07Mq9^./kXiKRIOCFG*<]=H[^-$L+Ir$nPCrpkUR.-qkb+._-W"Q^ +F()._=T\*MV(i_[D_oBjRjg/+4KZYC4MZ5O[pSURq +nGd\p_RG0MB-#X*#4+c=[a2d--XdAp)#l@bdu@=:6/`e.VN?WCN#5@/&h-qG4I3"+ +V*d:_%-))2Kf[9VJH(TEKJn1qJ'g]$+V7k=-JqJ9%^H?nnk&;:P!6#l5o/tK2=0un +m%`n!lXoL+/)aJIp:;:AW!gHA2gs?AK@lM8`,Bmrmfhe0M^^k]a?NF]5X.t@J"/RL +n#*,!Rj-hfIY.EUM#=*"$7Wck?HUGLb!@7`Z^S1'.R0K-4I2u#ajRa9CJYpe!rU@N +Zq9es@es1S#LUtP:k+-r?[lBu`B$YrQaHOD\TkoO5"M&%?nFT<]mGi]k<>6=n7hs;1^*@H +k!d+gdpj>0pcB;1gZO7!:Q2Hdp"qqn]R>8,E#%T:(_VD;ZTsktiCEAZIh4c?k7bJ3G^ba$eZl`Z\b5>9ct"c1#3SqkTUp6Xd:5kiS3*h4,Prnhj5 +hfS;@Frf4Sl._HQD;KCWfQ/"aTlo1rDRjIf5H/"I;?2p'=gL`R$(mA0]jd*>iq'*` +Z9TpoVofiSL`KE+ns#;*l<2Rs"cN4g.n5dX!qW(I)UbY-)OKb"\_4VQ3m&Qd`@j./""j>'!&A9'ppEE=7kG_gbT6h%*ZH+2JGBd +k_\d'IBPs3LA.6bDd,);fJ[YM2;L*l=Y`6d%H_d`B!ohEoI;$ZLHGXP]Kj):9TqQ8 +SN!Lh*mr)nR$CHMiXr]+G"gGaKeiU>sIe*?+/lo +,IX`n1FXA#a9VJBo-`q*,rV#B!E4N8VX3V6hu\;lM@oFmi'0nC*&9+_kHaA<2(8I5 +Wts1M7C5,65;42*"bs,%d&)>'%1&OCZ7-m"/fqAK)6tn;Zq'WS!8AZFKTdpWnPDpjjT?4mU9)X?n*ailjuF&"[T*Uq^15k +lT>OBkTl4pB7Pl+^T*']ME:&u+e6UO50uc+hgb]>q%b +f;#@`V5VXqgZDJ^iEXgq>h/7>d;g_Op0pq1?V">\Kp"ju@[:;>P'%Ac[OAts.)EGJ +_3rK>k:mutPAJ#o>fmnptu#UreUS0*ArF/l3JMJbMn3LF-NL*#l[E0BQ#gYJ;1BNPT1*V +V]CU+j9S?dF9&QI*T>P5&18$N+'2n;ESu<]bG?qIet$V5/ZR">1`s+X\_0Kk: ++'XYrDC&b=C#gXXniMPi=65[uQ,Ha(W'Kt[FkHR#KNCkNY^hegYYRq +`kLIFILqZl&sN>L8cI`aktb4:+/XmES=tK40LPZ>Benn-C!mO@"OQlVjDW#uY6C0: +a/H3=.5*a/nKFG&;QeG=L0=gL].V*r,g8)(cn`f%-J?E`)'r+dKL"^r5hA\:O))QD +1X*jkXQ`6VV>^1C#P#-IN7n0jV>ZXJ%p5k;N0T"ue=uJ^q!:c6,R"-lCl`eKJe<.W +%7EWEmfuO\$c9W5SJgte)i$4u.-OO\!id%NN3WPiJF*^GZlO*TLg'kBm)&5ib$J:J`sBC8pT$7$,N,^^]@*>#mQ +&3oIE.t-b/I4':0a]0crS71IQ^^@aq[-?!6kkt3sDs?,hM="7>(&+j3PMBW12huW- +S)fu'oLL4CREsoJ15#ir=W] +ir)Ne]ed=u-V&>BqDXtV2JCoN0)_7l4^5)&gMVGOY5S7cKD1p_ck;FO_i/#X:oe!H +W-$%h*;C&\s+G:(8.0;3N[Q7FeX0hr$,_Y*@nI%iAYr!]F'=JXY?/)A=LtG4%*Y%Z +j"0D[//si!BQBme3AVaiqb +>pZe8H6s;H9I2Zo?qrLj.N\nV5JAral,e?Wfs +kuAjgar_)#/4BfY[oh$5sj-X#42d@prc]h7NEr_CeK,VniJGp +gN_]C.0V?<<%T*#kuItRd)pn%p\r27quU&HTlFO[B;!"\<+m9(V)PY`8N +8+VoV +NNWN+I[j73Gt.J1Zc[ccZr(lTA%-H4,i)2_sj$8GZub>?73=p1u\U"FltAO^C<+p.fAgb@T!Cs%O; +&k_#:_ff.XK+.%O*:g`;jEHIemhB4!Q!s,\@dhlu"d$M$5&/&#mD-I"7JjsZNFG,2 +PPu\u5[sl;bGq5GpnVHE=k;,K(&jiEZBrh%9t& +1:m0XkFO$XIa#BG^mmJWRb:K.H]YVEQa$*9n`HVAQ+b7aFOX[KdMK;r^E`lBme`[M +Q318Q2nTDP4N-u&O+Mk35N716guHK;LZ,08,Ws"(M!nU`hDm`Z8d:u)!bbMWrP[(6 +3WAFm!Ed./Ns&en!rd+D'nYr5+#ae!"8Tb:2SDQ##^iM"r(k1qEC'()r-oWr]]1do +gDsD7HVi`#io-@knsb(G[.$1c%P6PcQ-%jgj(kg2M[jU5*3\7Bmb0lWI!BOLkEKr_ +oZ4[dA%N5GKRAW9S]E'AbjUimG0Q\iU_"Noj_-YbGHUksR<-pIV9H\H\b/_Q.e*J/ +R.V7-kgJ.ZWtUPt:&t<<:CKHI5'5,YGD"JWjkOpDhR2Ut%?hg!^'Ch>pDc7lL>ng:_aa48Un'bX!#i^T2CLD?S>jJ'Hlcq^_jHWGp6TNa7R +Ps;+:4/L)ke_n_g'hf^mR8V3>.C"QK%'_9\W1:qmNuM.o!"/f+"8kG`)Jk60kB.,c +C7-)_d>^a!*(Xq&G"g,[m+CD]hJH'd7/J?%GNh9&p2,"*)K-NpY8Gfa>6F_5MgD3- +g;WYe753$O'MlQ#BQ6ORn/p#u)Uut8pkoRh-Okt:qLp&S@577YBO&D1/0*+l)Dabs +!:ZVbWgU5sS[,5aF_I:dCmqVI&=SsT9a\q"nqZlu+G!ZMfR^sRhH;^M?&d1Xif@BY +fXcfU>S-:T +6534I?kT5R2Fd4APfhZ-Q.+,1nF0tgW_]<`>dmY^YXd0`M2$QpCf9t&ABU2a=2"c;k)QL[i,qg\4e$^4+%N*;aZXo:q$n +D\d_\=p%.QO89%W4/E-@-O8'uK' +J)\Y$5=GIEPPk7qiE6JqPDQCf&1.I`TsKF$H9JG$E[_^@1\A\rhVgfbD82ibDcU7a%[Mu4um +n0AfsQB/^-+hgm+.SIEl+F_s0!<.K$:&Ll\q"ldFEV/E#im1N^?Y2iYRmW_P5_#=P +rHWtdo/uP=o3_SER0?t_c!eEfhoYZnRo.$-]nC%cfRrLcN>frKZ%@Y(16AB\P,MS& +D8ZlAcg\D;n[2(]^+;?/)rq(u:C_Qi%!4,q4#n4GGrom4H-Y6D.9d=N2kQls4@r`W +(O3e`mB0b@h0p9SZK3H?51-i[HslOcJ,edZIVfF7pjLVN"mlB4HM&>^%`pVb;-BKH +V1Z"+7o>*B:SLn*!q=2^nBQA^VSE9$Sjhgo[UaND_#cO@nrO$r(4tttG(B\nS)/aD +^1)UWr&CJbp`0LA!.[:If5GsgE)*hRYjsRGf!C1%GS[Lo:Bo,5q9?\p>QFE;Ih&$q +pQ_J5]tVtAr+EhIp+N/KN47U=ef:,[m91W#h`E-/FFNNFQ-&F"6^*Oqod\qrf\%7g +1RmHs:.14o'#?c"AB1RYV.!,ic1DmadLZ@:?ggAs!P37 +_IK"Ls$?JE&Z(j(IR8h:j-tU4SV3W]1:'^QTbK'4Q +0`o/NmRGY6)Gn;\) +bZD+=2LOH4HN:Kf:q?i[^QH.(i&,aQt'R"GR8b@PjqEJtHO$Eaupf7O[4AG;,!*dI$l:e +dO)NA3XOqbh=*8G+GTHP7&A'5MO.^E<4S0bHoYNt;Olac)!Zf7q$Rc'Vl3oo;Oi8g=\?W>I/@@b!jUHU4BA@A76De%1'DREMhU@T[8/$G`m`iW&r?^Z,q+EtSEq"`Rp@36V*cbRS\[ +$?c6rq@A&A'=WKNQbPZ>P^Sj'pm!^Cr)I6NSH&BSr\sbQTgPN&FFZSZ^m?Y8Ur^W< +1I!>4/g\@8PT4QO?@_Vh-7KP6[.$GZLX@lol'W,YTVBA'71%#X&magekT*e9UP6/* +'p^fE%IRNRHJ3Z2omllT@k']6e:*uerR7"ZT-b9O-rC'FJ(mct[$C8i2=YYeEANSV?H^aRp^PW[.CH9ZcFSb0O%!RK3W+#?ujYgsl9XZVNR +q'^8ll\]*CjNn=;D;M8PrakUug$p-]daeM'HUiIg*>dSG*>OKg>XmA,?3(E606dO* +>MKaZftBFdhe-Qed_r9:r3bR[G>@b<08LbM^NFo8/7@fA32?P!_lp`ReEUhi:BDV_ +[#P8&0GiLGJH*+_TP-Q3$!cCkfF"@$ciQD*K:RIQP0Dr=n2+fuh]!;aGj%9s(@]gd +qS@G#.adM3H^iU#C=g$ln%O:/p[F=KSJ4-@a1'9rPk35@4P=9>CpHtD`@41"R6e&M +-_V4sMr6IBZ0qS?Kb'?uSjtHK(O$+0:pB<+Ja_+f"i7Y1^m8d)NZ7!X*W(#1s-@0X +L0`P>gU:sSc:pA;44^O\lAAQQE*PD-WgsYs'l2mQN.AfI9c9%NL<+j43NA,YdRsob +;2>se,Y`(;TJJ^NfJ=GV5^ot9\l9tk7P/sj/OQV$#k7$!7=iIWOX$(rSp[V)[L4W_ +:'U\nC#f9oB='Z$$Lu@J!Cc)0.0M.:d?KJjMS8R%"n3S(iBR(rn(W!Q=C,4\.tq[: +VLHd[DB[ZWbcs9L*(VpK2"N)U_3\\nCZc+?AFsZ5O6X!(L0UF$*l)-WQRC99*7rFW +e)EW-0WN+NkniiKMT1X6,o.4TdV%q4(MJg"NXZYfQ)"3O6TT%gH0Kun3PZ_>J13NF +KTdL:!6>\p(L'kt"m$k`J1L]h(QNJFNR*o/Sq8')Juf!CbfeM;sGp_ +?s[W6GftSVq,(M1g6c,bB2DP$our1]UHfP3[A@m`TLG;q(K3OpphAc;1h/0Wj#%qqM<82pi(6O9eY9EtYU\)4$\Iq8N +3*i'<H7(T@W#OidZe!IM,P. +(o)Q99E)Gh!!2lrLO=kKSd?U%S0^,C$"`7$[PjGMLdfEoi=mi%8r-Lj`$uAY<=-lZ +KOde.>oUu<`OLY)M&E;@S5Tcc:TLoeHTqp3E_X2#Q,7`I% +_!WLW&$h"P\YSDb`-83eYHFR?VdFV1^)s$G^r--o_Yu;Zr7a%8rr95krl6eUn&n*9 +s*KIj[q.%0JL*>'cO5t%c4PMgb'bceJ&s'd4A:!tLN%3bY[(&==Wp"8TYen'k[\DX +`TWYAR:Z\-V"e+@q:MNLF\9:2!/Wsu^Kn.[@oAt8Ej/JGO<`N+WBSC1b,X4B=a67C +q+erCGI(fqO:8u*qSS]>]s-1F&bF>CQ6(h*DI!mXT,a.3BB'*onR;n#Y)3^@VOrSr +4Utc5:ZLJpHLYTU3<('iU-num!>4O4W,>DH_?7Q`HeqYB.-Q6onc-7@j3/?fri4QM +N2Yo1&F/N^n!BRK7=?=jV;;u-(Vgsjn+]M!n^Be0NIWBbbE)dUSqJYG!;Jg.PRbe. +"[LC$Q6?jm]/"MJAa68Pb]CO%]JJTNkMW4ah\rV6anGSB;s/e^r.Bpeh/d'VDU!TU +aX*bS\X6S:JX/cI9HhfI.8D=Z/R.'V"f#AP$epRXq&jhA_pj\/dHFXr%:+>s2#kdL +qU&mEmYTn>f7>NOJPE'1gNIFXCi=.D[0-=cCsW=C&%ZW6Zt`Ks2Iogod>_Fk*._:j +5V62^/:1&N$2?_5+$$D:fgcM:-3O`R_Ze2A8I]d/InhM4(<&,W?!7Lu7&Kf13C?CIjB9-_;%V]R9 +lK&9[3!0%`OU`4$JP_aok@W)27iOu7kLTt[lR/4M +/c\Xq(o8k0'5gN0I^BK!>60k9O(I:+A*#,@C=&ZehlcU5kHqN9]:r=^G,&IMh?^XE +.';W3YW%M +9*_$15[timU[HYpcW\\W9*GTmJbeNOHI8,bam",na]aPQ[>>R!P*>:-PAQNH4(g0i +c[5E3?KmsLm?nB#(PL?M"r3ED?RUak>nH&4NHO5-fQ._m3!o9YF%ue-'CUmE5\DH( +A0okPr[1f[_u]l]pci$W#JGDt@pYZ-"TKSIs&f+0s7$dG2k5n45[KhY9^]CoE'i=j +q1#a`n>>s_^A`b"5/17uGoQ`Bs7,mac%/ZZm*#tl`?,ZP"Ro3P"og$FpmR9B;=OUo +;Bm2JBi-]`Ae\NO_URg@_#G%enPY*3?'8uE#/*7Q<`j0$=(-3K61<`dp:K/$4s!Pt +H;+#/EL#GQQ%%XArglp`Af)Q0J),oD0-ra%+l/)%:ABotO-=0md +Tjj.A=L9h!YDP%lZ".]&9c)"(a#HOjYpg:/U<4+L\&DMj0Lu6@4UK"R8`LU@M)QdS +`TI*GM9r(1lt/5c*eW9[JH]GBnd3W8d9c;ibnqoAe5-'0eg^B4e)Z#&;'G`7f*_1X +Wt`oF'#iEJ%u$U4B]6.3)7_Lq.W[.mRs36>/>b0Xfrd&i2T +cOVqU$F!4o[n6:;8G0:i,=qF2"f9;cf#l97dF&)03SnXJ!F[dCVM"63k?2"B1Ul5c +fmL_?QL4])mR>DaMI(NKG8&ujkE/Cj,*sEuLKrd*L%2(H@f(C;7b!)-[t(s1E^#X@ ++4ku*4BTDJaCV1:V1W0O4k\5RXXb%>"ZFX6DP%qR4#IFu$/!LNT1SrIZ#%NQ$l4BJ +a'R+$.Qn\4$h-B^#in/=^`S"SI";I.(\!1ZGSYgI%Ef@bPSXJH+'b?@$[?c9qO-dl +U]?H.:HUZc3]PA.r3(M,)/0=FbHB +&T*nIOBb^;g=;Q7Xckpd5C-a6*5eC#-EsnY@(-Ulkmdjf>2NP!<6PsI.`HGA*G5,).3K?g0%q>=Zjr&^.'I< +=N9j8Xt[fX+%U<[odQ +"AN'"9NbF)9hQX@OI.9`:KZ-Ip@3a_;VV%.8(8biA61_Md^!nfHd3'Ppk++j!.Q`: +@FF96P\W)#IgHSWOWULQ%9Sl&SEfpW=pY!+rkf3\]f*jFrt0PlhlVXr;@E(+F)JakE+Yan^(H>!n*?G/KD>Hsp`INUDbBa[]H%%P3<,3@k_I!(0`>kfb)iN!ZhDjk +oiF;V^DTlHC0:;$@E%\i'bLB9aKP6_%r:%@\Q9)j<mY.sJH"-j7Bd +]sop:+,.qu[J(2;+F"sb"i*E`P91kgj!atC/%5'u@c_%n19pm_!5InaEVGV%Q$k_I +!&"?Oh`uKAZq."L*C]Z:eWa!^M)rRSNV=*)]o6:: +q>^5IAFIb;Y/_s/s'*e)GO4)9ba[2.RdO@ehQ^b.AT<.9m`'+5QFk`"Djf0-BGX=l +El[9?JH+Z0)3=ph<)Uc$R6q",^ +-:sKOUrk,!7>=&[)W391%j.,G)^Y`>"cOs"N@W"8(;Q,p'.Pdbe5E+])$B/DUW*W5 +lK=d^5lS[&h)Md)]A:j=KO26eDq=T2<]nJj3$o +F\%3DW59J(80-5QLN--RGt9e!$(dCO*s="mn6]^&+>tbblK?Jr_"WHB6N+5f@u:^$]gZDkb1LeZ9d,S&F'!p&m859Pe]j,q+b^_&hA%b3o/CEhAVi%pIek>VO.(]gE4"86;3Q3A;+H#:R3 +2iQB@#2.W$1'ap3G`Hoo>!:3GG20ftB3RN:>D$,-__7`AJu5%V-Ks(NIe9Q=WD*QB +[W:0;>2jX@g:_dOULi#_Fl>_M5+hO`SN2./r`$r/\Xq?0rG.`(02\E1H,7B=$k=*e. +1%tFJa9;S.kWF@-;be;q/"W=M8'?^rc]#-NMNq1gLpq$;+`UtRE;h'eOhi.&56u*, +aE@SD&]b"RrgZe4:8eP!VjT;I=T5`I) +0BmWoruWh:>T-N)?!.Z4>['e)l!h3[L?o9:ZPuN?3gDnn;>dMbqF.Uc(VQd*kN`oMSSIM" +!Oe7g>`9s"09Oso8>X=.\iLT[O&g]r-q&P?0p#!;=26"jr(kZ^!<6!iYRCUbgBci. +&W4f:;@BSKL/;fD?)J9=S^E47H!pRu#QlH2_l!d8i!!c/$S\P%[Mk-BVBGk*r;Wc< +qs4O\9eYJG;%PS/H"Z#]`TGE_c=PbjqMFqKOk$KM.MtG.D[@\SKMh=!&eA +5=o2;O'fC=1]&kDBeOf3ESS]cptW3cS*r(MKAKD:o5=IEfYNK5Q)?>JfE9kOp7=JS +PQId\9qD?l(Ei%iK(tC2!5=El3-s[T_E-n#jA#+F0ET&b%\=&5(2mIkDdPbr`AZ&$ +h`EIm]m];_?2-jjB;G=QJ4H:]O$K&KACZ8#dLbp1`rWOAH.8acM_CfB5*&qLcb_=C +UR1o+?%@Q#&d\K/q+SQqR="?RI<8>*s7F[8HhVA\q^oGRFkcUaVqt_RrnB%W4JV7H +3Bn!s1(+0lE+*/bBd=T)Zd,AnOtbX.gVg!@iJ/;OmkRoe96qR%]5d1%rTJhMh>DC: +]M%]]`A9*Kh_JouY\;&PJ'/15e#)rLH/52i$1OQW7E>9o)Hl*8l(^kP;<M@[pt$fOs7 +L.M;!r^R5.UX=78>R]W,HLg.%PV0Ab:7^<`<=]kB(Pc^F'^2S6W]!Z0fQ+KAhs/49 +?KFn@]LDM;"c]Se/bZi#SjX`%U5TkYVDN>5ePaH;;F]0!q\0\K<>i[maZQ]T;2sX& +R2pe^PaTE;"[F!RaQ.,J$[$O0qK\`:o2;PZO[+s`WgP`AP9VpFMN#=So#;gV0J8eL +0*=q9=+J'ik3O$UVA4KrOtjj`M#8D(&6ma+hA#Qt?h!=\ncP),q=sdsU]A2CoSdRl +e?&n[!1a'5g9kpuRRtgPZ.h-lbTWQJMa-ik0rN/8X8FUAHm!p>ITDA5Aqs5)U^90( +RL/.(YRc:P*GEm37HspiK+8USf`_)qN9bUh8a9Ka6aak;#%)%10=ftjml'Ri$CX39 +Z$qc5,47chP%QDjOi*i3''M=T3K]>0!I6D[>f?4m7lo\o^dABd +1SYt?iIB6D.YP8VhjF9-eHA(+r2I.foCMUa#K?0ZO!<*5E;*u$'&W26T@O]tG0L&'E5YqM$#ORu:,c([44`SG%=2I\Ze4>= +CcRYt2d+0#13=Q'o60KTIdEsedN9g?T;BL+Su;R/"\&Cjs*roqnc-@AbQ$n:ikO'0 +s*76@q#@f<`BQ"(r,J&!rIjI&isHk=;."KFpKAthlJrc)PU8Md"iEEPO.J&jQj\R[:B$#0a#2mlk99`+U(LLEm4$\an'[m#S*It +C"P#,I?D&MHB3LKh42_+l*hb>c8u'Q2^/Of,gr#mK1B-;sKqH<=I"u_)4kAHPn[H:A*_3Dc&aY9*!m0n:S](?= +I1BNrfJq/\EuV]=EqoWF0n,PbYkb&qq%q>+n;dDF1GD;"2!3[lANMepTf'6?nld1\8#<0CMo_'4NuO?oO4c^);j=F?C>qD*3tXc,Pp +"@dH0KIZ/s%<'TS:tl\BVD[CL\':@"/6g[WS(B3\JH+hVQ0#D2rN\HV4Foi!80qQC +RE\f-),X'I,`;Cg7 +HCVQ[O^AlriuA:&U\"M9EL5u)Y0Fb3Hqe5C>UO%_K/Q.Cp8'GQ=;Q.Kk1q`4mP*VOSTVp@q\j_$#7tFJa9X +C`h#QrUS%@%/u0_Hfe+I_74Hhs/,8;HLU]5nCVL>kj?I]gJRn!nBq'iJ`W8MGt'/7 +TsQ+,^*dBkj,j8'Mj\R5GHc.ZP^h=&EdcR'rg%>+oQhGM?j1]lOM@X2rt!e8)`?LP^rcFs5Up[_#MG(in$Mn +:IhAPpQM4l:j/>Lpu7?bXko\Eh%Hnu'lHtfAB#+`9(fO-j*sOK/]6HeYG@E@CR=7# +#o8W`DoqLT8IhUFqHL6&9sXo'ZS+Dj#DC?C>@/+]^W9Q-SA+h^qu?0Y*^F^^=1\Fr +DDF%G$%tR#d*UjLLd]NKFA=YQB2B^"+:pQRL*l'l%5^'PPgd=/I;R=%S!iFW^DY@V +B:M,grbM6o>l!+FYPRP6T`qBtDUn4Qf%PJS/U?1VH'nhdoMHj3I$J +Vfs=3!TVL?ZNh(URh/];>Lr^V`nY@Np*&IXZ$3kd+b:_i:*,-c*J?`"T@a[DHkno" +:'Aq@pZXI=bdg*l4?T5jAe/Qra8uF_!8snqZJ-XqHe*-/XBk:$G3YI(Dcja$^>UOG +$eY2B#L-'Oi/a?,!.V3Qr+Z3Cg(EC/LcYdomHHP<^k^t]n4,uj6Vr+:pqI7AKko$. +D=NW[a9(/o%p]!TS\'*L[;S.8XBX7,)O8Pb4ISJ.GhKGnC0`o/PlF^POX#?3!V,') +K,O7dQXU\h"INUSAs0"U]FrZ^0kU,"B,9;k&30OAB+XjQIB=/6@)]-867H9On.>0j +]RIu8iPW26kk7Km_W?Qr(J?%MG:-0s%VR,D<2(N8GE@+;ADf\c5p`a5cFlR4bd6`@]A?S&+:Rq_Tog$bLSS/[jl1%o!V5*55V1DOupH!`O:t%G_;50sehY=%'UR@o81UDM&3Z@eF-M +qSA!TUCl8/60h%6@G=\Q3o3eeJc_N?,JY\%Nof;]:P%fkf4s6#iuKuDgbA3R$kI<3QPoO`Bt%^$]GDdl;HV7CAC!SqBJ-B75-0/UXA]bg]tb=X$ecbVEj7qI` +)?4ur(4V8Ba9'*=IlJ20J:1h^9HZ&tTnJY=f.>8k?.C8C-`;p+ruHGetYs1`B&( +^J0)j/!kAgMq5]-b"'^+)?38/$H+&5@]5`#KEbNYJZ4:lcX=$SW!#XH^sXlD:]f_! +P]n"g2aT%3KuR5O.JB-\JHaO)s0!(?IH9PSMJLTHcSFV>ga@P?c%#'rXk:C3OWaT% +H:71Fdn5+[;uWO[)=`2Zq+jnRA,cL?\* +>\*^M1OLiq""ji]%:e0HUq'b[%:O'n7p[Pr^.hmYQ*bWE-NUnQ>hp2KluHb534$F# +6d?[sD5[O0,Gkra;m4jFDn2&*XG%1dKl:+WG7enO!N>quaG&u?mfbb2S,pIL5(.0- +Hu(ll!e/6AhU2dlj>g]N,[1ithsqiAneg)&*S@sZ^NHSqrJ#R]8rLWm#n78_'a*+9 +WSXkYS\U@FY5p$h%RR(cKqJngBJ4%.>@p$Cb6U=n-C\$jMFmm%BK5LY/be+]>?tIB +](]_eT^>t>>A.JuGjf7jrq3E7LR&CMg.c>TiqXs#\rXjR+&-#l)l&X>?;,[9Umc-3*/(\^1\+#mb[T8lk,eQ%OHRjAo,'t3qM)qNiZ:lW$&X8 +'5s0MDj4b`b-5[Snm3o*!Nc\P]c*Di%=Y4&Ue$'fUVn&ro7ti+4Y!fKq4KX/?OO]^ +$1ig"TL10,6SYB:%U:-^:P/`b+B#)m$gjODk[%`k +/2Om`&a_*2]j':6'u@sF\"TCb?Gm,nj'9]cZHA'1K^bVYV.K`-+oFja-Up-B7bT0: +/WlqrtGF+&A\+6*c@5T#-u&s+?d[:fE-$k +UZRVrs"XM=1B(KHH)'uD8+:^[s#U&[s68rA@NP2lbjc"3a8I)GO?)/!qQdg7HiD(- +_LF\cni6OLs&40n.6MiYiYE*OY`5J^a$a+Le'QLN$jJ#M@uB[ULcO?4%on/*A@CVu +^<5#TdXDeeYS_^a5^7:@FHB#FP25^Ui=SS3dFb'`>O:cH/3sMNX(#N.=9&[!,K]bC +jSb>M!@l#12,]57.9r')djB*1&I#bA\?htV"(Ku0&-6#Yr?>,X]GP(F-gqpu>tGpGFFUjf08\eE.+gL@`n`);=`iV]TpN +mRCMV%l01>2&1G,$%,Hmrg,YE(JqRGkn;bF,1HE5h>8s`iF@Itj__m)0a4Hda<^C4 +^)Q:`)kXa1ebq7Cm[O!RpG)![KbCL!'^[`>9*oY@n:skR79p\R"@q$RQ\k +WWHLJ(>eQs57!Q>E0jofk4.LCcWBb,f8Nk>JkVekk=aM[;uof*J/u:1cG*g]nE#0Z +gnj2@H$hUP+9&_-3?WGVDr'bc].QEOa]q2g"jlc=ctWD>G=![d6RIiFQhNkeARgP9 +nC?B$n)6F5iI10W6_Da.mu]O0;m6/??ho[%H4<1>hf7u(Sn(VsM??,C<^!X*1 +;m^VP$S5]?Z#.ac@@:#uBMq$.:t0\=Hh^kFZq3i]?=kWUM^@0j@('=aR#@Nq?mkc' +POKPAdFXnFQXGW3e,+\`gYUbUSfJ'f`):@;r5H]tL*\X%pZD/:0,YHW +66W"/!feB`s(K6QGXa?)>UO*=*7M+.mijRB<#DS6UIq_SpO,AMGp7I7P\=DnFEi[K +Dc6.Ej\]s27l@;R:!g)dl;e=1-i#Y64R+Z13m8V'TMmJ9M\H:,.nB;H +ZJ%0=okG(_0S`cI"hK;/#XL$\1S2(h]4Y7md48Zb":EX +ab+nBK6lcf-Y)(IlW#.`[CKQjL%(oEXPn8)n(GAQF8#kI$;cAr+:CelXtscdRL-*o +;Yr*%)hrk0b6>SGme9sU"6'O/*t2;F9-M>mb9nEQgQt2c+16Fsah1uh)@PXl^\-VA +Vb.6R^h9>4k`mWB+*O_&Fa,n2n7]o:+d<:m#2(lF)3"j2,*SaMb>N`HGhBG5/L&9I +2ZS%!dc$U0eY#LSW_qOA+e'i%pbmAWfTf5l1#WgCCkPqrUfdbiR`(GIAVT>KYg$*tq0ZqW!'QNkjrbQ> +XeI&=i"tl)RmJpU@@5h_?Rce\X,0$jRA_p)WP4IlZ?B;uVgu!YKKZq;3/$cSj$0.8 +a281rStnCp,)#Z3>qAS]UOQDJp6UsR:rWQ:#f18/:j#+7('43V5"PbRa64-KoSG"$ +=K3NBgA)s$8NOVM+OS48!FDkY- +4FKns)uq^A:"__-n4+H?,bE?D"?4B555oDX/89Ld@D_Z;pn\c]bE2a2,t_O<'nN1` +hY]1lg`ClUQT=r%-[F"/4(KKB!$_IOGgBan^gHne;n4GON'6TQ7hN%/f"pg:;(X\m\UJD;2QmXVs,Lkgr8pH%phg-^)s>h-r&C!G3gs +0(=^DI*rmW$F!0K=t\S%k)[p=ml7XlkqfM0-P$%Y[lqY7f6]DmRo)PpY[gMD!;O?'g/MP1c*5%ScDEW2;g*6YT; +%1:so9#9nP&HM*&1:KtAX@il*3knaa+d*B(ORm66Gr63s)@9a;Edh:$6"9YODRj05 +^K?-AWm7PD$HXOF`=O[jO>K9XEk_7T'rU%CZZ:oZ]ucIPIHl3b1:(>Q1J$[#WRATa +i-CRS<>gd2oL?70#'+7LH3E`P9a:_aOIoj_9!;*LW0Rsp;i5Bh@uAbK3`Y3eF]&G: +13u\A^s@Ti^uq7L!muj:uqWMEkVN*b>A*kg>p_h&2i]3q^W3f0NTe*1=oh#9qM +I2D@IPJSY8OSjmX*tD0ji`F$M"cV(S#sp_h*sD%r=/mF'K>t)oi>BU^o'kc%eZrVq +#9qVY%Jo>^H5W9?$O/2TN7q;@=d9G#5Jc;Ck"mek[,>1RJ$TXC5N,EFh_5p>p\OiXAOF)qUH!H-k +.,-S0FX#-YM/W,Gs)B'k^t3aKliLj15J5/j!!I-<_LM1WM>o$`+=\dFQN+^a!(c@J +QM=V`^(?A?n/(-j7Jg0gs.d6*4:a6]BJ-d;Mn]Rf@1Gb*S79Ahs@TiV^aJ +It@MQpm^;*I#e($Ci^/`IGd?**uA#Z-p#4C(iF>8/i_>pr_(_WNH/_L$CH-Ng_3C: +>(*C8;`Q=#G8)tC8@sRDi;^-1,fK]kCd!WZ&l"g+P"#N7gMW-'X9h]),bIEdIi0^Q +9o0Fa8-i)15bV^>9HB&<_IttIlNDC<$@J->,lh$ImK1H2/mt[AZ&D=XXpJ->8U0Mg +C:H\Dq[gdm$.$Grk;b4].Tq@c(rtA.f6&7.n+.+cVPCf1I\?&@sFKjI?8-V+B'rq\uuFrf*K=a]`\tZgW$ca +jEPr-ckGU%)toFB?c5Up`3$b6PJ0VQ4AVL'Mk8V]c`FH"2sG!QGb70F^mo\iR"d!X ++7tl*oW<*2UL4gA!,;N75&LB$IjFk1h@"WqT0&^jm"J5e%dC=X!m_a*Y?@$4gm*)b +j]@T9])cEB*dsN\")GAl=.Qr^^]e!?em3XS>^FuVq]OspR@f%lq'Y[Vs7en*7J`QWVH]$8^ZRoJqR\>b\Cf'Wk47P?janEC&DTe.)Nr\`)`6d(X,q5ck*n:+4-cHPN8M14F#3?WhAXFAR(hRsf? +4-O;47l1m+'r+03N-==(7`>YkJ!GU].FIr7B)dNprrBAV`uOF+?!EQq`TiCWAXZ/X +etEq8>4cPlYp-<@k_JcE*cl$>UAg3E4qQY%SGueNBU&o*=[_RhJjCYZ.h'n*\K&9@ +oPinYd=P^(LfXG(3a,%(;??tcd\Rf;XVB0a`b8>FeL=!RL'J*",1@I\Bu'aLD$JJk +FfODCb$c$\TLr*QUFHYq6ED'RXV'B9+s,\"Y/(AB[qbD_r#OM=imS3^\u>dE1B@40 +dht;]Z\L1JoUjBCeP9f/N9`Tig1QN!J+5/,^ZXUi@EJ]M0&R&JVdhVr!<3Y3;Y4F& +MXqp>)074Hd62iOIb_1@1j-21T(n0sTR4J[YiU7EeZ&>`EuBDg%ji9rV]BNllmg'C +X+9]$n>EJ>b[%CWYiC?5%iTX?+0d7^8'GME^sgnMkFEP<\!r`?g8+0(Mf-cI/r`Nl +/SdP@bMKAe!MYRHSs=i?-/Y9tmiI<]mrImtV#?R_Y*I*%F]RZ0[q@X3A34CNPs;Q, +(g;t=>DnnPNLuE3:+^"4H]oLMnT[JR&![!;G.@ZYi.$Ks3fRd/LAZ#*[fBYtE.QLl +_T@kR,g1(P7r1\tTd/(e2>fb\nAc>p^\%Pg^@:#(@N-qQD'(/ +!QXD36;\=I8Ko%j%@(YQ2dUI(#]+i,n8f4+/PEU=P!9',5J\\ +2&Z=WIlXP"O+XGslV[W1U&:comb&98[1^Hh]?6m/)VqAr:%9USUJ;W2FE8YudmG`6 +qO9tOQj\>A;1;J1J/R8%":`r]l7t5oNs3i/80:I"NsSngc.@X2B12@'7/+G)MXn34 +p9fbNYYOk5Y)\=/&N1WIc[Lg[IilAp5&pC0o)(fE_Ej(O=o@hSIt""E],[t +R=!%]GU$=:adN`usGgW!,(sM1Os]^@+4::3GOe56JoU +s3H;E8VH88;[5VKpalIbY2[u9,5cIfJH*WKcE6E'HagqK/q#D.#56i!5R/>4#OqVo +MmaV[2XO`"XW%eSG9:((#7K1kCKN>FT=S8_Un9"uRGN$XpfKO)$bII@=`Ue=$r!!Z +e76[mitF(9@2;5^F$B/M5'(@#KMT8fQo]1.H$6lBf=:CIBDD=#mijQ/8APdA.W1X:eR7jSKe+<_@CGd^n85FgIV! +:aL;f8q:f=Lb:Pg]0`HTs%M@Z==F=H02h:TPOl`gh]_G!r"fqIgPGr]nQmejM[$:g +_*=2m`lH@[LcRBZKZK[q@T`^#T810e;`Lkp)cC8A6Y2rV'.KTL`2s@i%4\(Eas$FM +@CQItW7$\5!O\#(7K4h@^Iie/9"D``V2/0N8(7]JRV\)jX&FZ"6=r-T10W2<5^ju\ +f`![@6YA4PFYip?AFuB`([GZ)l=[M<`IkaEdg%P]*Op3pmfL'U"s4D3h[=tPs0r1K +E@;cIH3tR57'2iElZE2?YQ2HuB\^<'^9*Gogi$4;2D/Z!b\b^$Xui3,C61;`nHd3# +@p_$/=#9/=46oj)j&eD'<'>`5:?(%3R^lT0N\G'P#/:9tC0Nl2AfmR__,*Q>Y6EmEcMk=/V8$#O\dp=VS*ClVdZa!QRO +EQnG)=MWPLrsShT/FXC*YP7i<7o96+r#bVkp^bTp#XcK)T,\!>8d_q!n@/;rs.d6N +pg+ZKVn"AY;]u+HgaJ!YY%BoV5LT`0D^+4+&e9D_^\J]F;e1Z2;=]dG*Q-bqQ"'t! +rhmkarcmuuk!'-mO5M*jM8k;T:]pfrYsHBd60H]acJGCg0'DK+->3j"B[#V&cB#MA:iXPKZ6;')j94, +@PPH]:`&0XU;^Jj/qSSs=e^lTEkq]S6c-)3A7!4FN3N0nm'/-CGE^DA5qeR_>54"qF-Y07F^r]eao*9 +r#oei/-,JFSgQt-_]/um!1K4q63G\es%k%m^]O#pNu%k*"LpMnr',4'6*DIXcN:#Q +]LTCnLOoIeDZ)XLIClZ\)`PAfS]0?dICnnLk]6+-paJ][bE25Xh+ggCt.`R88 +6hgo]6e$U/U\jkhhR..$>L&dpDZ/Js]/R;Z*EkDgRXtL3?,uZVWu]s'NDbZaWC=dr +nY78@r(cXh>#j\e"og.5[2@,XK3_lIo][VaY+,M31X&\+]&s%b>OM!9n;2)$,qlqZ +?b#ap?>86&Y$3W+11tQUp.YJXWU'q^$o!8nrHn-j"n:K8?N0`Alk,5a!S*tucY5"Q)+hJ!Wd'=I[u7%Xgb780D/J@4)q[FqeQ87u:D+ +b$R-!4f+]+8EL>\1PSjG!t+ZAq8c=-n2@,I-H-PcTK4D!3i-5_7qrdUCDCh*#cgl1 +W`&>88p%8"o57G6LGGPlNRORMCaY"HCP7POkT/S@?ib$/(3P'63N?:2Z1h398:2UM +Hnr,,<,1TQKGL]Bc;Q1J\sWZ`mu//"%N,ui)AS7!5/>)90_H$FPLlh3 +Dq(J8O&HdhrRkt/#i0Z"_&W_.-2.rud!si.>d_92Cq?`6*>[Y^R)?f,VbR]8SeQ]EEer'7kfs0Pc +[H],Cna2S;F=_dJY6PK<#7mtloIP\_g@#4-93Dp+p@J])Aq`I__Olns8(V2tf&EQn +A#:&r1YW4Gl\U6EaaI)ZoprtT1(N\8a!HLVRh\B:M71\Ag1>=Gcp0DLQ$fIh*JWD% +r'.W?itK7YXlGE>\;pko`J&HgQ$4-1Zc1EOcS,]tf,# +kPp>8%mgm3=r^fi&3u3bUr3FB8e!]"O45cCSna/3mSD<#a]2[s:urO3.E>)KkiT+@2P?+TJ'7FT/XjiX[Qn^Ko:_O'1"_SQ%fg_>ClY'-sQm6LD_\b2^r^#$YR52T]SN*cVW+r'GB4:E&g +n/HZ827Re0Hh4*?p^^5OpM))FJ+$FicHT*p#If!hDMl7Ep9&RVfsOAM[B#Vd!.Qi. +hmsj14R1m1HoQ@+]h:H$T$/fbn4CV>"dg`oG_&0-"[sqJjC&kI%"\s6><]=45L\b$ +qbFeEle?Do=gtA72g[$b:c,A"G>:)8njMWMG5B^VS-=Ol$g6u2&PS_;):_D&<_jI0 +0Ymfo'uT?.IPl-eB_/.MeLD=2EWsWqbX?QmX8A-2]n0IXMLU[VA2cN]9g5@CKn_8[ +G0'KdP2(Tfc#R\Bb.d965-:2J]3J`&3O2;I;5<,XLu""5)UL2j:o9E;W(DTZ+@gH5 +HX'k/Y=9HT7guHF"r&8.'[QuVAmi>N@'tS6fMJ\Z5`J*h3j@)SiH1hQGpgnGJns+=no+NB$6r]pI&gN#ROjL(GES+X*H +l65js?9se[>f.YWEM-,laG,WH>eJ[eP61#-a<*9h!#hUrT!GM$FD>'od0Ki4P`kVq^:Wa_`iJk!/9l3;ED8e-/a3LkX:Tqc58`Q[K +ihn_ukG@DFZUl_N0h(cjW/#JuqlFRW":dEnX3;u]X=3tI.&Tb1;`=MF0)I,#5T[fL +kPl&D+H:*#cEbHDhAK\D)Ctm?fDPZbDZB/UJl"6KJG`dDh`N4'%%a-Q?qO=YR>h1. +^jgn71&h:R&H3:>h2Q"82ds991L3_iaQs00LL>tV+"2e0M'$CXg\aXZ2uL]c:h9J_ +s-irfs8O2?U[cb2kQVq&;TPd:bEtP0Ck,B'nG3!ll-Wpo_er0taF[h#`&`TSH6o/q*ujAmJ5+s\eF8/%]T!X,b5f'\Js>u`>],o)lD +Q@@t-/F=(9!kLop3DY=V+QXRtc%(muSsXqWP^A7OG?GCr!MEn5&H8kC?!c/S"L]^( +m&$J]Dg;'Wqc<'M@`#;QM>oT=nG=*bhb-rJ[%njt5LLWTFagg$q-Od*^J-6=iW#fb +Q#BjV?IYtAPcIE7jX9M\#I;lAP#'RsT7+X9]LTSu'lK6M/;&G&M(l_EkYDBW7gE.j +]i>)4:7qoL)e=i/;=HN`/HFV,p=2oY(uCR_0s.Mu2/]A?/1%\Y@[rm#"&'Q[rj; +r\$G!1.t2C30UV?SMI(flVRs+:^n:?%Ngprk`uTnOUnNp#cLYjX&JYh;t-fPpT>\8 +f#\.T."n=?V"4N0W^2Wer_4kkSQb!fIuu(iS]pLEo,"Kj!RO[?q1$a6ZWf)`h_6.8s+j7gYXuqbjWUiH(_.E)K[4q` +q*3t;3Hl52iTG,95i;n<"/s$J7]i;5;tLtE%[n++?Fo$kQdp++^$AoEr3f1T-^.SB +;qC(%%^jL3RT?T#9!>XQi+:3J"uKmm!HeG@L,#/Qn.E2&*nVtP&23m'/GXFkL%ar]LKD@i[b.?:K#paDpkE0m;`M?/2nkV<[@K"VP;'BV +569J0S_6W)>#-0l808^?X_Mk:CbS+/l#lssb),X/n!lmuc@i!rF +LZb&B]9:(BR`Vl@$i&EZNl_gS?lnR"s6)L7L,H+Ue,i.'D=opSq1MZIra1G18Gb01 +!VYIY8d[=J%&>!hrgUn'=iC)5UO:8ghA!\jku%5"2eICRJ)S04QR]e8iF7D2s/!=F +1Hg\Jru;pS3IW;7r#u!]G(,n%pA@`tr5Z;F=Q98!\,(U!s0(CBo"QaAi\sF!"0@0, +2R,PK_#Le"Mg$BSauHuW0rKR%o=8$DpU0]e[,3uHH!@_%F7G@h\SEf:_h/jf+V +A/Z)$c4fb$&ahpT2^4QT@8C^DR]BP[.lIrtc*4It,f5Ie,5a#WW?hC/1D(/ts"Q"t +Rn8=kc_F56J!R,7^D1SgJ#VT!QOs)pI7E=b@g`5qUa4^dU\;8bFg$D0qFGbs^1)S` +Ak/;%D=!*WT)O07jm38:'QDA`UZasn^Teos1b-lMBWrNrY@PogUi:q0\A;jN'j>I@ +!MAgn.6E5l`V6\CEIFrS4F$V0iIk%;Ti>p.))p&E&8iC*:/).?aRT"@@]%IA\%GJ$ +HqrGl/oC&u`qD>oRic\&hPY5(9AOu^[/MOM$<=mrppISNX*>e,aI7P&SjWDlY'^nr +q@,Q@.mJntqf0h@\A13"_FrT>\,`N4co.SCI)"#of]8@u&:T$EkZ-^ACDsclj]2'q +k]Q+UF8q)&c]QcDh&pZf:$:@BfjQU[hmq:Pmk\o2Ri6s?H@Z6mRj-7o:j@R"m!92F +h+!n6_#dXX>;iXmn)!Ed^!VOU[<'fjFj$J$pI`L*PtnQ69rl9Fe#F_SMDb"j?/)5n +l\6_Gns.B/k7%g=o[(&?)E$Y?U.6\F)iYa,8GZ!]=MSVld4cK6N&g(7@J@EG%Xn[' +4*24@gEQMs2m$1CpL*,o^>quEgmRNnPNgPo1ZlLTo^cZik=k,N:MT'OS;7t1Z!6<7 +g6BGm'RVEf2p7$NO,;@V,YAATr.&0YWU*HZlJ/&neuKJ3XWH&ji8:LRe>3l/.IZ"d +nn_BHmo8roWI&fgGsN1lJ9eTEq6d2U1oLRA,WY$q[OdROS"S$B:,SXS?8B]qeP;\_ +a,Z=Nh+E-E.KMno+oS3u:-q2J<$)I]mIn!VgWh;h>U=F@JQ];i),RGUJo +mQR&gYFdOs5%igO]tOmK"tpc&)&3T!'`kZbr"#2:h$\_Fm0CN(r3\TMm?Y_\N=4A( +B.U(M'(K2*ScMkfSUd-8/U1+R!MmX +3Oh;^PhnHd:f.fH?,R2pBAG+pEk3'(SLZD;&Qn0$*HImW!;SGGp1WPhVXu8AA-Y6o +@gg(X+QJ@`r"/ia92GiK3h6KDh% +T.8B?>c%@n$IY!X#X9phIX4E[VF:F>IDm!_9)EiIRL)[TIVH]ab76QptC +ZGZ*/Z$ZnE7j7#ab25'RbVt^2]nfI8,8?U[9.5Hk9`#"e]GaQ$D;p/F73s +p>`'(s&FjQT+9kqoTK3%(uVUigKA+G^MLAD'&N?^YBdO*T2PZT$)Lu;.K6t]n].3C +n!_du8m,)i3\M[u])"IV[^;F&)A1LUhpAcYHl +c3pmF$FW8.ZK)3lJT0*H!c3.5p=oX0,^9X&kJ0`H%4Bek+)6?fEfhJZFLZI&k`tK7 +mhU*/C4bYlo&;S7)^"(j5,PF\3-Y>UXITmdRr;6V?6ubg8Q^[ei+)?/o;KVk[VSg. +06ndEH7+pYs$+K*Iu`7`pk&_Ms5=.;T2)#@SK2&3aBAMX?@'q$K_JQ1ZY0@uA-+@F +##@AmR=6/2s+)d#L:d;B\b%(np)n$hf5H&SD.(o)B>_9(qf`"JF5P9&hEC'$IJ<^C +n"H*IA'Y7s+RnF_kjZE.:^]N'!#Dg,dOi/`[cH)RG.hDOC<,J%G'NF[5nc=]XQnDR +)E2K$p?^PBXIE88C6hR:p/eDbK2AW7]Y$ +3S,dnLsuOc)d3uiHdkEp<<l%4j&"N1q$YU[=Y/f=djaGn56Yb/ampV70 +Qo/78'Fc;-@f#,n_So/^;ee$cWe*FRi%?=Z?=i#CL#="ME%C'P6hICCpT@KfJc&kD +Ee+jrP2KM4F9CZ,'0PR@I-TgAS!3u)r#uT==I\!=_s&;mC5Mqlb4K:W>)Na$6_,IM +&TjY$!K"3odHhutLl;i[J80Y!WVpJ9L(3a/0,4t%.d4Wl+*;nm$Qo-GW?0\UB(Z:) +qSLcDagM!@/%#bF24tiA$N0`S0FRf;E6FXX;"scIitc44G1ACW<=nUrk'(]I^"'jZ +g]lEg\:kE=!;u$HC'"G^cTCL5gYJV./-]`A(4Dpc.GcW3k, +Jq)G2H:\'N8C)$q+)![AB7iBi+IITi4gu`-fSga+Nh5*'S/tHVbcHA%o`-0?PG>@%2jr5unj) +9AB\+Gn.@43<4Q@9K!f5PK'h]QV<_4ESYP<$&F#Ahs\I95rF+M*a5Mr)b,]!B! +:O<*4UYusFpO=a@b3t[l?>-hJhr9-MT5:]hcOp1e!c6itXce:[Z9jNX+q;`KB3U%e +#8=LX1H!eT20TG8?9ZkdopGZkN"#XaY$0r!C:Ts;&WnP6hj)<3HDp>I5iG_7_R"?< +om">O'K-]*0H>*m10j# +D\gF/Sl#[ds7;';s6`h\Yt4CPZdSGKeVtsA$cVDkGLQjQ<9mFWQH,RJjQP^R/u42i +-3d\m"B'gBJfmZbYUNaI#r\!XJ6?tJWi_<&O(<;_DNH`%L*3aQXkCMfE'%rj4bt2+ +71e_q*F^$*AfVh.%Ib0'=NFp94"Q"KkT^JK]V`s4lB_?dg;S,3E3$cL1p1DRp?r +\dn):$lng;B&C=,hk"'0Y']&t2nHF1>u0KFN/rq8B0h%OT^+/bHDEJ]Q>a.641;I3e=MVeAX@:t#)4f!nPA,[70jVr'%`O5>H2hX=X]!C%&S>$n +);W=c((`)5@Rar"2D+4^,NkGHV\q(DmX89T".Go87!I/Y-f/Z;\DD;D]1pPHQ?]/7 +F(nPADB]eZ/$jdKuluh?ML[\6!.KWX3QcEo)e5rZX3<8?BWI4rr1Sc"p;gku8%- +^h;*NS@nC>^PGYF`0P+#eZX)DQZeF8g(Cl&9qZAN'/\FpCS3hR)Lr\DU0on=QthSHb-oWeP7TlAE#l/pjt/G]p4cp8iOtfDL^Qp2>]r +mXu$dKb&%LL,L7\efstB+pUBViP"Q9T`a8toD"$Q"Nauer*I8,DUR$X_UqoekYC.4 +?L$2:;lI`MpN@Jf1U=lf1Vo6HAlgoGWZf9,!FMf(47>C\td +RiK/%C_s$mNmQpUrs8Dd,Q=SsD12J74Qkc&5DK*fr5[]E^jl!Qm(c\K\CK!f[h((J +5NM"':p\(O8j]arI#pp)JEb\`(OCSWJ%Yd`qRZ\OCB5Hhj8#>+DXo[b6%T(N=b0F) +Tk:QJ-NK\:Y(l^q +5h8[U@@O3pGDh"H@WK9Ft1*]*I +0/:EeR%_LY>"<%W/(X/B2oSUT$KZG/8MBY^70>cT-6W)A8AFGVs3FOG#lhZ361Dp= +I\NTDZ8lj%! +rX6V[j295ho/N1+*5at#AJ\.O:Q)`&0/U2(RC/R;r\e9SF6`=W&sqLQXa\LJr1(7n +?2h[$o:F(:@/G$-*pB*CXnPEQn)@F+`(Jp[Fb(hmJko3&#Zj1qQGEao>2VnJX2'31 +L?&GXnIp-.1N2qjNq=??iH<'iYSuun"31(f-_JlM?a5sSE2@L*bKn(=p\ZE4I)aO- +n?)]7X53):U93`egWhsoY5S6hB[duc!;N\7GR4?cJ>Nq_:E7G&Ks%t.DdMa3EG1Zl +2M-JZ&H5`_l^(>H+S.tqhkJ\SegXU4FRt4,P4O_[7Lte;5EK2t,W0hVTNaC$,$V-$ +XATJ@8%=kMhpD]^um)?>j#F<^R09d4GS%:MHY$ +C*cVg`Cun[8('u!5Fjf]14A.Mg5&dWY6kO0h^mql7s'/O\G?K;.DSUu.%!1t1'&29 +6o&Q*EZ7*d)EL6(;tU]aICn#,>)9?!Vo"57"P8b%CD@lTQ*+.t=)&&N)AG@#<4sA& +h8mU[;m=FbGqD(SqV\a:PSJ]G,^W'7U7W.LUZK0i(#XmpEk1C%b7dYe]9?u;lmh',1G:HJGat8b!@V:]M:=m +Q[2?'H5(5tkSAMF\*meb)"e1Z9'SdftRl^:3=fah6`m5(V^VJ<_mr?9q>fZ0F +$l:.Ys$pG-;e5_Js(1!mPYkp6r$22>JH#p4$@\'SkJ++uK:5"irpTY9KG*3i`#B`AslU(N*>3Lqi^V"13=gfB3+HbDO6HW4jnR]7Xjr. +q0eO`k8N?@CX>K5T7ACgQfd&CfXi?Eo=NX]%^qd[8Rmus\AWqP9]V6l\mlK,;&?1` +&hB\c7:q2c1[L5ap5"ShZ+t)oYh!$9rP$op"DM#3\=G2N4I>iW#`X00LIT-FG7oDU +6i-J[ibui%IQ+D"a#R.M5FV;MW%K%[7fJH_[9noWs(P$sJ+or?UeCC82V"/%WW<'q +LDgj#Fo$/TFekS.Mpj-kT"Dnfc\T5q&o*R@@M'Dm*?ArB3s"mMkbOS"MrOh1d1M]. +L`A%9'o3Z?_24rpR$J]rPsmK=6rI-/Et6ZNbHg35/HlQ0!R3fsjqJVW-'@39\FfcYQdSd2@e7=:^+KDTQT5&Z?[&>$D\b(M]dO7=MQl^AZu.G +]YGnu6`4:F9YC^#m3$NB9CUS_`68Udj=Nmu7X"+WS$9G)6*nnNa*2G4Cu4AYF)#'s +-JH#\]C.rYb\R!hGO.!`>m(-B"FcgKfYPrXB\BV_m9ADI=50PE9hX(19,=p5bISFH +3[pnOag_E#ri/Nn^jd$?!RjYomdlKO%IVQ6]=3%!AF2_JZ9(V&7l8n)#P^W;eK3Ab\'I$TM*D%6cGg#_5!FV;2_td&mQsJJcBUfnm8^2Y!@I2 +-/Bq9lJu7:'g.qLHs;j;3n;(jqucuRPp76(!DRT#X\-E(npVTO!g/@:7#p\5(Q-`< +*GXA1AOa!M%4n09bj3]9(2LtbS4k!NPD0&.GPV`0q@2lps+cSl7nno^bTDdB+&5X* +B<7`NgJrf:X=L2"T8oC*))6OBr#[dGmQHooH7BrbGJ7J5U3t7pHLXT0#cJ7&#N,^a +fA/h6mTn#FRc2.%q\nBWPQ4A.>8FE9SY+>7D_le*_?1oJc0?bI6ddk +:t4t8+nA,5DU8T=r6GKZgROCKpIrV5(5prU4FR:kdU#?d5-]]I'/ +Q+btlopc>&?Jf_mj!J4$,HfoEQ4lm`dFRO`ZTOq$T$T<$8BhfMja7Y.IC',.YfdeA +Adb-U1Wgb&bSFAnF.I>r=5]LcEQhrTA?d+0RJ%L,]6(W$)U0TddMdcdGs'N)5Jobk +p*7]U5CZU7&N1b2!ef7b(*L3m(mP(\r8@hSIft7.=oZO#ElrsSk_ +b`=Z3ITc^4qO2fRs5m\Ms6ocE%PfiadF\\aAJ,6hDio.3s.cO.Io*`'&d8,.%'bN% ++!5#,(M"=(CnDR2O;)Gr&T2rN@9paTW/*3EMDsfm\M0+R0TiD#STeu9^A;RfH1QUP +hF",la2D%jfXip*6Rh`>$jkkl^'&Rp%e?lq9Z6tm"GPMWdKfpgLLP+LU`(%9W=rXe9rp! +IsZof?'8N>oVjpbMqO&IWF;,,67MFJ<\YcK!.P"J=*'QV6.$9DHupi#UM342dZO;] +.PK4T-4:BWAf8Rl"psKOI%#17b;P+C&4aL,5^,tshb7Tdb@"XJB4&pA3bS"gZFFfJ +%'Ko0U%KRK'V+V$3o=?rWRdn2h@1D)3M:gK[#uC\^WQ1!4U:XK] +258#]&]"D^"eTP?gCH$n638GD1X%)6c,7g@?j7pEEM]18^#JGYdsbbC8E8PafSt4: +c!&P\Ef=0FB*!=1=]H$:eLJ1r/)@p0Z;)WNN5s4a#atfg]Ct7/.4Ta:/$PB(/XGu> +.Cll8]%.O5=(*^W0pbKmf,A5pC'F>]bdCXBT*NG%Al^s7\HHS!2TTeu +SH7dfT=[1"nd'UDi%K)K>JA[qi)g4f^N_Xh)WEkTgK8f`Qpc#:c[V^>J +[XELG!r@(lqR;%\2hD6as(fH!)rZ>Gi>qdY/phDi27gmLggCV0Z%mo.JGgMI`0P@O +6SJ_uNh5$$*84&T4NNsUaBa+X0AX=R%'b::\#VIHDC%BO.+5A^@s1XUS0p#4(/V;] +AiVus>Wu&GJ==_AcP0JlnguX$G$.[;=b<^-;)aSi=0dNTfg:J\BKL`o0)%sJa!mMF +#k5n1O2M!bs2UNL`VXUY+?9^6OCUhB9t/=F+8DHKC&9dfAbk6SM#T7/7JQUGZXn[e +!.UEP"ciA=n,GoKTRcO>i+)cH(;TJtOn#&qo,iWXJ.P=HW9KEJ7%,1AZB4T@O_p,s +4UV50r(i6Z`;'p9%(/h9[K6@TL=df*3$a2;VFEOVd[fg3*D?0Njg!D0M:AtEe#q2Y +]p\$gZOJ:&[:erA0AP$%1:pYZ`F(p@%NOS>)d*??T7< +YO<#e5:3$`T.S^1!rVpds"uA-LC'51c2dc"r`c,rk9USAJD\Xer-Cim=5t2!s*s66 +s-\]@9rm"6HM.5/p!q*OZ\;RMGpc#uH4A!Z.Uii/o(B=l7VQu)`%Xf2W'tO$%F5"6 +M0WcJ?A)/W-IA!tn&%'(5"9e>*QNo:fokn"rqPRr:$ +3W)?=\8uC%;Hh!JoF,lg$M2OQp!*s8]G':I0?iTsW:-9bUr&5/&tdMU/rWuC[(a=' +qp?'!1Y7(rGOJ%IgE3a[O*X*9%tAp*`QnltJe/Zb^5KBpVi%D`V+iqE0/A.\&^SV%dkMZ:@CZ-jn(A%Y#L_a?N:[e&hDu'n#[s^CM +R=5g[n:A%C5#Ur$AF?um3cYU^^rCNeb#MsQ>IRHSkg3sa?Zu#c3^2]W]6V"-N<")e +-c45&JOfa3>MnSN%]NJ,'"(2DVLQ0E8dMOihN=X`H1nM +-;Wf#S]mQ`I:l-dBM#sHrlgqTPNi)h?Z,u$f")me/s/G3VDp:dUWgquR4ZN9aL3WT +1NUc6OtAIG1K/+F)>;A4#C>*qf@T`)ICF.MqsJ_/ZBCa6e(Zt(2qD)SCaW^?qjV[+ +0^#rj;MP7d%'n369N*'V,4,=70p$3,;N#=^FQV3Mb`@2<33];d\#WgE2uF7`R?gC2 +&LYms`6V(Rjs2DI@`cFc99Re=Z$7nVce/j(+(X<;.-iXa5q\t'LJZ'CA4hpoWt(p]P=QT,O(Sj?FJ/+' +OT,FYO%N8=,a(YC;FdQs_m4CZrg,/D!;g+eHUK<06DX\WIn?hYafoC)TR,:iITE?Z +?51hdR*ho8cXGq05+/KI8S5_b2S@tC#G:Kg2/V3SB\N`/a)ut]]]!Y`$VCD,qfV37 +=SoNI3tC)Zm=5;ZrdBR96`5JKGOCS4qp_*^&MSYK13FHqFW*Ab*'AK`r6>/;dBNF" +8IH=[3:5m?rhg(/B8L\bn^@__1OF,j7u?gReCEmWq'T=g:\$E8'Q%+iYOCUKc-Y1s +#rrHW@Fa5=3/(GD(#] +i=[7hm$n$+r6p6,!C6NH\G*a%:]dk`\1&H1J`=!iPo?"9;od%:DHtG.7>,.JD^5'I]f(>2-(7_T9oI3iXLCYs$-9CfJkb@#a>>)s"qAG +,MXV%g+JG"?^fnLQ%Z26Z"U!Q\#8J6V5a.7Pl#1;@gncFVY"uA`'U?bC8Sdi->GaQ +3mBrqA4+u%aNI9<)&%._L,r!sm3\TO.&`tQBKd#s,XS8'W.A>MV`0*X"/a'N?"Jnp +1kM`eTK6S]d1U3'LB]l&UO`J^Z-YclFIe85=b?GH)"EA6`1K&GIi:cTgD&ebcO'N1 +-/nm7-MmaZMZ9k30i.rLqmt_[b[:,UUEX'#7,R`q4Du%MC(`\.&R?n%S]R5ZB$,5E +'q8)C<[Xm]':%%Ai,7E$&:KZ<"967^!,qd`"'n,K_C.:Y,ULSi--@&1+-7CVPY*d0 +P"a>\k1!Lke/2t91l`>c:W;(d"Z`IU].j.f1OM?kI!kP`r!WFT$GHB/4ackWr:4(o +o,Rr(D1`17_'RYU,o/eCj#[!3P$!_RuEdG*T))nPauDrmtE +dZ*GfRENO2_[,2M)-iEumMg(d)s#*]f@t;8@>H`/Xq<"<2Obs+u:g70AB;Q=]HqVPfoV]c,LFffP'"lj@)i'_&5dE5BhLld6g:-\'[e7Y;B3W&Y5qZYB.WnT@F[;Lfs +$j_Rgrr]i0^7>Pu?;RG*!eL9)KOVL/`">k`KHthFN76#$1g*0[Ff1&^dI?[h8L(muCYcgjs/mAiV$iSR0Y_0#5li51JF&3&06GSZ26%A!G?K"-[2?#-+ +s4,7VciQ:=6r.kD":VBj@6PrVt=AR`pq*4?GcYr`b$hAf(q@>7TkP63c +5LJCBgV,fA;iG/!qk"d;PT4@u&nh^O:Ck@J,40CVN^X7l-&Kn^8[c%Kf!WVSogr&R(no)_',t'lF8&R#Kfn6u7ttRrQM,&pfh! +RRr#VLsU)de/na7qa%@PW5nVq=t<:S)62Bn=_iV6C^)b"6(O#I`sY$O/?hEnNiCBB +0(M^slK9MTht/$Vo)GnWk^T5bs*kgfs5u0(s8TJQ!W;s^eqO-@Kb)9)cSNFf*68%6 +/G*@9k[c.8\d<^eMqol%/eeSPAP!:aAQi!mCD%_RO<3OR.l/F/[SBf7;$u.gO:6XU +Hjioh-R4SKOer-:s3t_gHheVY&kud0P:WY#9-F8!#TP_WSegb<_KutbL"+&'>*;dQ +8ZC7V`-g1`9H4!O,QDR)h^h-u*!;g<]ta^:n7'Y@1LMpMhNN.J,p'j7K^M4C +Hc"@GR-iK;lS%`X2h?nMhUl=:F"Ft#Aq*\>R+-ac=[Gi%WWWRc&k#, +i1;ui_#"1N@o#3703mHJ^#tE[s,UDScWiq7*/BPo"/f2ua!Mh>Q(L54qE=UV[gc,O +XB8@M=\pNX?goLHNi75Y)J1`H91K6C2i^gi[,YHXbX;Ti/D!^fXL1XXI)6'iJ*IBa`?<$W>IXEU&]d +b+';o6njRZ$0^FDD9)/:Im'D'dijhT8@B4Y!Ta8< +OELf'>)fej6/+:A*82O%HDEteAD2WYl5'op'+4.>#j$q5%gkgMA,Q2urAtR^ +!"KbTZp-*.";T:N"CXOqhh;F*_1_Li7"Qmr=>YJ)RQ;U[2CtH:'o*V*LLli8rsq?8 +"Ql=U.@AX6=jSdnf.I:O?s:6g;RLKA;?!LdiRl&"@AS@3>W,(f`/'S%XdTEga+.aM +-D5REm/oUG&!RQEHghoGr=,h$*tdJQ)482-e8sj/Hhc$)oYPYPI-%?^d'_3`D:$dd +hrq$](ZbTlUDKQBY20akmpano@ci7A0B8A%j-OZs=0E:(JG`4&VGH2a/s@*tP2Qsk +buhSPhn3Q=?84@`kUS%QV9P7`dFaoMJRq>S;VNU3k&o&c8e`3Ir&OOlQCu-9XHQ\X-)aeJ'MJnH4XUC2g_1u(M +6a@"X5ZXt/ArIITpQ?S/_2:'^7[O2niMO7(*^BT&"7RK'5HbCorm1H/s/]ml+6u.Z +pPVI&s7:cc+7to\s+gV'pY5uTr?NHe?N3g2"mA*6)?Bls=Q$#On2,a-TD\8.rVqZN +^MO!M6M5TdJ't(`i:[--p`JAmNAkAo)?Z@kn+*@nB-_m5!JDS*@PE1u0`c2^NODS0 +gZKnDjsJdEVqC*.XRhY"ne6uij7W##>'Vi;Gu:T<&YeAq6&Ys[+#";G2]@\p#t&`#+TNl01P!O<"f&^-dB0"]H5Au7*MNUj.Q3&S/.gnY +:`U&&'^g!m7XS(>@=h]ok_+])bPh@8CKp([S?HnBX6qpN+&\`[m5#B-##+#6SUAmW,_T"^m=Iq5(_907Tf +]FQr`,Al3Kf:S6b?cDKH,&Y;b"[E>af_po9r@rcuIGEs4o%)"*`>AC!@pqJ('2__s/8%\gE'p<5e,mgNg!eBKr;tr;O@LU-PDE145Ue"PAI4GP +'rfuh(UiX-IH&V!C>$/#>.>]E\0)TuUImSs9Oiks.=Sn[[4<hr&,FdA`cZ\"bn(@QQP +g@XadoU\$_:7VS"CjWWC44[,12U1"MD0h3^#>SP/cWiK.0'k+GaYV8j;m4SiT,@!VggcWbC7^Eoa9f0UA;+/uLKik.>(X-]hYbC(iHj0cqWVFC ++HFgd/ZE0E.A>nR?rN.gdfT1+IQ@J/T6?*q%_Vf$U[u1^Zi4;4$A!Ft?$JF2R,;29 +lu!C'@0e!$Rh37B!PIC++-NFIJKj$HHQ,:odu3%!<%/(#f8ig-Lnn^HBD,OQ"$JmY];55o)L+b+,+C(T>.jC@t!%Gp1pj&8g9#M^R$@%Y#,< +jGdjH7Q#Ib)a)KTcKGTsW!%l(Z:#I4@7i(JjjqL6>@`XJeDlB&#scg)#].FHa(_KA +>iaX3j=dXV^[">ej"UMJ9FC^`XPgk=$iK=Ri4gjRs(tp&^Fb?@j,D'Oa0EB$`W"'n +pt1@Mh'qoj8`[BNA>N[FCb@/*?2T7O7n^Z@S8ki3_7SJqZA>)U4L]Slk +;*b-==f`2A63ElcSPT>R!;J=7n/?.1N>AK[Q.0>0S+UL,:0Dt:F8Vm(lDMLgchTLA +F0C'C]_de3ooaS/hL?ucrK;Bt1&LlYjr'9\LQ(h#)4-sOYJ-f>IV)l5U7],s*l"T= +59k)0-*2`Hln3>S2/2ADi][VK*u"A,Pn.>hTVhs'Ies"9/K!+5(]FC^5u: +qG-D^c>/<3*GbCA5(Wn#4ii&n"kIA48*]!&sD0@*M=u"kA1]6@cHF\W,iecU,$Q0s3l3Qc4qT'2Lm1J]jCfsDIP'QaCZDsR +gR`lUaoge=9Z")_r/)J>:7O!g)E/rY2_Ud[0+g,dL`bUe"TE=.HSo9&.oAdHO:hX. +97t/rODHiG5m:GeM,1U?caj-4CId&8Tri'+`WZXm9S@F5;P"&KB0l)W(nGJl/IEbk +_C(WX8Z$"IdieI$+h^&OlTqmp2e:;:=gmkR<[00]q&S`T2YH!`5h7fS@kHaEdf'FO +]lo'W-d&tq^ls`e?t4hDK^ilpcjn-p)s,t6n-+An.hX]d:7d\B)A>a`i$7m`7f`Cj +0nZ4]+gH9PE.#DC$,@-I(_hV#J-#Z\ajS0C1FF7*:T5,T4t<($.@OY!"$,H]f6Q`jo^Y6a`$ +EJo@j\AaB9\auUcOQTuK/mkG+JUbdc[+/fJe_@I-Vt?69g+mp0VQH@9c5t##*YDfj +84,HnS?7Tr^g7`P0Ud>&1OKfkFr35e*&2gT5(%l&g'\tU$05n-YQ5[DS?8HXm?$:t +:q1)l13Zi#*a +HN>160]2h)oJ5RNT*N^BJH+tc=T79*5lSF65MpcNPDt&Os0p&J).X:!$pY)S`>ao6 +9N+L5oL/QbMF1F%;\m>,,KZ5hD[@CSM_UqqlDEPu')\"$maBLC@K]mIJi/j%NZjmd +P"ZFd-4nW/atSHgbb7-l6idc(aL+Lu=sNWXW-fP+^(%*X(0tU/.Bpc*=C^nQ0mOQ4 +Gnu#-QIl73^/>rJee-a'Np?:'%#5t',Pfn(TE@773Y2%`')?SVic"]js"M[kh^/L+ +AHr#bF+XES&+`T'fRK8(rk!0D57M*eEJ33B#eoL6ilQ\N%$pp<[Q$?SZAg2299CeL +5KG'aA45`>_Mr8esmI.pS=oc)K0qomN5l0u71cT0TaEh@a%]R%mb +J&aMPHsp<1AmTn:\bJ]WI@klm?P>u_I2TNeK!b?4Yl:)uo.D*ZJ+#hueuS#jGJqCc +;*3+@2d\sjK9ta5)c)'PcM_A$ml,MFgqSPnBD2d":OSP#Gq=IWE/*Bo>B8#.K,5"B +n9eO]p8S#K0lGpbZ57Ijh%0F5NpDIu!1S)skVd>6QN6NK9snoO!3:ug.gdRq1@WZa +3H=ni'Q[E7^*$1A'hb#.V+uqGB;HKPZLg.;g9b\=TQ"_TJ6*4k6&2f[+F+#6!<=9N +5Vm`4^?jXPiQ.[1j`1)P:[U,b+p-d36%%kY[t8?*BW@4f%rl18mY,'gl`(O9uY!8V7^Z8=;;*,a2Rf +!>8-rM?=\D74(?d!@^tU)"\0o3!/e:#a!eFef`2[+d6(n/%>pOf[iDIeW=>WA5\+8 +D%a59LjF::]6.RfqQ\mn@K0X7h_)93-d&>+"/#B/`(#_Z`(roNNetde@7gEbBT>=\ +=-rtO*"aD+$Gkln&Kl0%&dH8efTJgY;Q3n=q#&I6;DtaBOT18[mdu.%WG`9"&0flP$[A_cn]C$I*]"E4pgh$IY2"nup?ZSr!` +fDU'JrVMq/gD7G+k1gn'SSH2^X%./pj1)*\gY,6bl7#u_Zq^M#?,O:YB=a^@7L1V&gmf*f"Aee%1h-_oYX0os67mK3)gQsX +(q_jO,Kq>p_OPgV-o29uNjiPQRbc;80k:LS0nOL]61E"BPT\fC5Wq`$??2\>J.eLc +7tKQ>rr4YMmr%WIhlQhpO?E"1mqqR/c2V5J_k$hBq&_g#:GdTK5*LtUFSl(mq1VDg +k7JMGO;MVnP%[.ZfJ&J*=ikh\MCgt'7uO]IN\QA$dj#$1`VQN&]#]ZZ9))Ttq\Y-8 +km2TLnG0)Y!`T`).Std*'Vtk"X$X)V&5a)bC*Q81a>dI!]V.TRM,:L_5`1D+RL,9p +/-qo<#d_ao1+X`W/B+qIZ%Y/gC+$_B%og"[E\J1^*edoqJG,E#I"@X7d$IeO+8X?6 +cfP&EEU5nc@K1$KqgVCOs0#"F^Rr=@Bgh.q6UJQ[$bbg?]5&(oBFmA+&RHt&SM(PH +aHke\bI,g[lVeM@aNAcr[EM`i7[/@*UiBRkH#iQU8Y0U*8sE1nPUSK0r-e^E&M;_, +'no9kZd0)'0*qrd$R^'0)'^RVa/mt;biQIlXVZ80YB'>DB'_[Un(^buT;V+iU@,^g +*IPpfI\1WL2IlJKpAQT)js=S^-+LSAU7b+'\P.]^WX^-dWPoRN72;glJr63h*Mudn +W^J-G:otd=V%s5$5a?(X`M8g+#D@tiEA_Kq+kuRIOT)_jSR2`M^D:)PY4rnt5@tpa +/\([,n)dRBp%s[U+TDu:(SDGmd4[\]SH?OPc2\rc7k`!=f+Eqm +iQEm1qsVTRDb*B:M'qa_V_=e9cb*GS.J71 +'1nXX9j:Y1:0d[;ItPD:j54$@^:- +GjLf:&2=-O&8>5pDG6QW/eu27no$n*e3R,H#d&3%"9g#@5k'n5,,luIF@`i;`jeH> +V]MgD$`TIYaroYU+;B@h;]ppALbB7t:Z[or<\U7X'PWY>-GL0,q&gVSXlVJZODnr) +RWS(&e0.OZ+JVO0dgD%?2.ZV%ZE8aueW<'#UgAc)D\R6QM#-fN\9IJRp0g,]KtQ-% +Xt>_Cn:*)u#TF]l,S/=P@/^3+.(2AtCjp3E\-QMBKJXrBki\#kk)\pB,5$f3%nIsd +UaX,'o2f?#Nq_('%c9+UWh1gqQ\E?%c +0YnD=+d5^=B5]$XT11KJ,-AP`_]8i<`>XcqCKMPlB9V7$! +T8&;q":sts%W$H5Y.:tm4#P@;ek]N%N0oiM9hNDWWr^,8jY0`s>g'E]MfQUhA]:$* +"n,M?/Sb>b'>\06rBt$`,O)ImB5\=MFEb/'8T"de,+-$p=g]#7WhKtY0 +!-eSciE-Y+_$[FM0_$iiA,n=Q3(Bhm1W5e$Cm5NBO:e;/$ISqu+>l\O3VZfC)$&dT +s7c?hJ*DG*J(Xeh#'"PW!2>q`4;%AFs080l6kB7RqENgQPQ89dp\V_<.f_^3hd?BZ +mXKg#oD\_*0*M2RrX>MBDuP)]U1"DJN1+3A9hA%ehMc8@5gEXKEsC?Tc_4,/mN9Ag,@)PY8KKaL)U/GJl]=i+qq:2i'sJOUI#m +D?f[3"T>&1nYm9!]0=Hr%e9S:3#;#HEU;SB$N+n2s48F1T*L$5FUPtM&@uS@3.!3h +Xcpgs:9mfo4o6l4gY&L8qKCq6f\#PZDPaOl]gh4[#(92Q![bdkLI`shQk'tY0HC(u<3b/1:D1+3LLgsdlUJ!7?9.Wr$02X)5 +WtS,`!O:Ma5rbeH?ln;Xe>!#_b2IjX2+",HYui0\6nu,LM:?='[iIBr/8b'.f&!=[ +_k.=qr#_=+6g!LNX=KD4J'PY)P'I0)2>cXibhJalf>.EYW+Q*:'_oh`"OEFqh:nlf +V_L7d#R@PiLMob^JG4%+$66g/Ye<2+h;-ZBEWtpJP^?"5q5J`$Ro?eacrQ# +b)g?A-tNT\P(F6;5R8VXd;^!s$jK?;;JIoV.Zi(i,,CVT.2lAB#?#=KZ05Hu">$2f:&r[2;E,\C"0HAFecT.cq"0="Y%VI)0O/"Ha)J)Gg< +r."=Q6Ipg+k*U8eOEB3L'U9o2b)rR,A`uMPXRSgVF'<-*#'F\cop`tGqe#69(>Yl( +4XV@SRs+4([dTZo!rq^mG+@4Z"$ekcm)2)0kQbi%\^r8!s.S3*Z1l=^nBE-=DA\(l;\S2to>79=?\fBh7XD46f. +)HUaE.SgB8A%IQVFF5AJe(iRBjK +dQHX>38sKH0]UY:irHg-G1a*4fWq[;UpA1J[*uClfds>O0"9:[[llDI7"G][Vugo; +/.XD2^BmSa&M)3f,M4h/`/FpL#66md1Iks +5lLT:!X?:AqaggCs(DB'j<*i!pgXXJ_,VSK"mfYgK_^Q+iEctB+9^mSqWfH`[k.E* +r^WUDJ+s9\h#GW\fDkZ9s6mQCJJ\+!qoS:h;GrM'W2=[*,pUZt::3\e[Rs,u8rg5' +L)WPcl%O@r"?iP1(fIdGA_r#^7ghfN7u +2%/5&(-8T1gF3qA/J/#Os)=iG+&fn=qQMG@[>:W@7F4VedJ^Kg*i#23!/3[s0dm/A +@@!lo7RI$qG:4E]a#IH)c!jXGWF-##Q[n`-Q[g<]]^26U,GpOBN +"feAGF]+n[WCVqLX@XhgLqY7B:d(OP'rFYVZ9fe)[jY4Q(1"(<-rVEmW5n!M7V,3N ++6ug;]Gh@egh2T-%lkFJF0@gk>f4#N=JtVTB-5SU5%RuJc$BHhs#&g@KRf[4=+Ds2 +M_ETOYKZ<>dr3&!]>VV=jF^NRql^:;04T4A'C^_^T,7>8&)SLV(CuQDGTXQl->NE\ +-p0KU7gM(uR6%Yr]6#%-F.[m>1&p$Wk14h;aI3Q)^p.>:O[7U5I`K0"f9'4nM%pst +JK<5-?/r)9PKnTON]k),D6:fp[Fu)O8s&j%.2As7(Tfg@?]`HuQ"J<5dcVkno+I!n +R>_;@k-R\EKMWkZ5@t$;4X1h'/P2=oTE$^,849llGiZac5_fb2LdT9S5b\RH@Zc3: +TQ8PjER'DddB6otU0@K)6l["9i:7ON":8=aE"65o+3(L>c`IQ&cUTB25[mS]Ta6*` +,RQt0@&O?I%_m)d=u?skAO$bSBFtj]!D!d[%tPi6#kCAM$'InP-tt.VRNX'g^46^8 +eVT\Yju75!R^(so4\F;5;J+T1eQe>2+]>ibnYd.J<";'m6)leOoX[Gl\cgi?s18D> +RuoT<&.\KM+7%)^%NUfWrE/Z"o)nRtL4nKVFl:U$NsY&>L%M+WqE[t$8/N$eO%Q;[ +8L4JK;Uc9rg8HQ47#&gKA.D0b@-pU`!X@cMA'3I\l@k-W($k]R4!m]!k,h.>?)L^d +`ths9-K$PU%BsKm#"$,!:"P5Mn!R\cZ")[jo>$XSn?pU;Q1rpbpD>RN^C$FD$X:+M +?\$IGiho'KE#L]Zj>RKkHghs/G4"%)l.pNsa/+.'[:e*n(HaXI3d2V@p7)@Q"PJ"d +#Fp#J?2+l$p^WkkER4Q8?\>Mk=Y^p8;OGQBA,p&Z"7])Ye'/MiE(PE*mtFq*L*O!bqe +-QF$oChhYS-#DnQ!K3+)Zf2"l16-'OO&8KX@:>pSHAts/Q#93b"hi/<]?;kBeM$O! +(G3\Z4kn"/bM+?!gHNO,0#Q9f_[i+%CWZ-':\Qe@%l=AS!EOWI;0nUHp?f;KR-EdTQ,"&d9lB!]PmfIfDas(rreEH%0?5&2uK!>K+QsY^uMWr +TAZUXq`d@G\,M.1^I5s%s5=i^pVXaJ,a7j[e%bNC,ocF[61P$TVpij,FE85RP"Duh +;6=OH9+&cl5/m`H5L`odf1FN1qLOj(N/`RZ`Buq4"T^DNPc6XZ9GB5uKrd]c)c7GV +1!!B8%L4nT#TIKbN=j!-!02m%P]dTcrBq/KLc?)lBeMAb^dhU)\*OP\_tu +[$&S@'.nFfDtHF+i%Ym5_+b,U;Ll9X6G7,!IdB?!dYIW]>MtQpfKXA0s"G_jo75cr +*e>,Ef]u#cP8^-IEhU`enWeKafc79E%-\hECbo(jMXm^-XI`#5@`7QKk)VDoM`.^aX:XbBn +dLWKoRn&]seYo0*Q^UMK7^3`*:a8/"SWp#fS#7#2aAIf<^>Bq8'WQj'W.okB:o573 +XqM27AQj`o*E&_OI&U^_iM2bkq=%:)nrR)O&TRY.H0n>gd80S)58QHXP&pGZFo4;f +n.QIQ/,aPc'`\O>G8[mJq$Z6Z',p,b-A:Pq=Ca/tcN(TN_I\b_6a68-M&Ma@&556n7:A'_4OUJU$r,A'g7@kSJ@- +'CfnV3&W#KRLlp0#eM.,&$C0@QpfG[(d+]#V#;:LQk<1.OFKKEk^Yoh(YZV3(!&K7 +ahbt,$-*L5`fJmsrddQA9;DtfVSWYS6lJRQ0dOXT;Ig8%80<2C1Ta]^XBi8O=M&4o +G[SsACu0VUfm.&SZ#A(!D:#Y`hlp[:^CXr/Ee*HYk.bkI"7r.sEc-iB)MR20.\4$J>+6m'u`W\FaVuotVT>SU/*KY&j''9-;OXhYm>&9E1+nqq.H\ +kW3\@bW0k,SpCeeHZ0!u5/S1cUISWX]V!!/#]no-Jd?SXF(iUR^#mbLjY6`GI"sch +_=HLX#:71LNXp?WCN/*n"6@f"s/IGnc&8pm_Z?B7FWUVB@*uMt_5VejMG +=!s+LiguU%IQB6XqMJ->%nXd`8S1R'/%G_.nOaV6(*E0f[,>u1`$%\N99@J8 +0lNMB?b4V!p@J6#JH'fq!l*n(Iq9";keTH$(V"8q4KO7GHC#".(\=H"1F7gE1;.CB +:!$"mM(/]!WYm()-;fsBWsp_9Jc?YIQLnQ),LDb8mni26e/+Z=9rVJmkrto'?D];Z +`\/<#9HT!a*;/I[`C&t5p8P+rqaY7[A0)KoI46ktJeZIir6QWh2fJV:^+Lh +fR+:>r\Ale/o]ppA*1X>o#uRTb\lLsB)'eloYtVCg0sW1j4K@a#iOL."%'f7HIIU< +o8ZTC^4+\-@F)25bb7?"So+pD=0lmF[:\f'`OpTtPZ5Z0'PgU!HBY +kJV("rmRT5;kig"r/lW!cp:>Z#8+a@"`ac6L.0"8AYT't6EBl$EtCf?kReC>MhSBD +&;gaM<_-F'BSMO^&sm-b1L`Z1!^/S+6BjGPi_kV6bf<8OTd@d-i\=OYG6l>M +P'U:QYt)\X$&R#^A*(pR!^ZcOiG=Wi +XpA`@1]]9SOuOjXjp8lLhZbB)@/imIL?(-[*or9Zk07S+/F-B@):n3o2]ST +>'D$W2BMtS)`DTteZJ%7YNXMSQo+55[fc[!=g];4p0;kOhKY)Fo:LCO3.9sK!B>/` +*]WlbY57_C5/WA1JC=IMhV#R0&A4>sVh+gDHbm`TS.jL?pqD:%i3(N/i4sL)cu&!f +IH\af(i\Cf[-'/gi\u#r0X:)ch=VW?pDVo[j;rUX"$eiuFU*JP%6s=7E:-qRls@'f +>]T%3E9Nh$mf7m)=kf5[S*"Eie!,"8K]V5kZe?Rt8rc1tf=6^??cLYM))NmS)\hsY +k5kk[$[Z`j*p`"=l_M!-jg?&i2JTQ:[HJ'g[-C//M<,e@jdoml?GRpO!CbjOq-L57*fepF2?9VP/^qap +mVbf/Z:GH[j3:It$9"^TK5BEne^oK>@n-,G!J)BDpFh`FIM2bkJ&qZHs8PCa!8]7t +!&"J*&chY*I0oBZs8TS1&8@4EDTE1dN0sK6QiF;tpoXR!6pi<;+Icf16aOq/iNcC% +b]jLF_'C2JOPm;Um\/Tl;fjpZZI9MqHluf@K/T#`Ru!i`Y`Rsjq:g]JD+)aZU)4hH +$r3>=7LEo],E.g$[[%ZEabe`mMZKn##Q\`_$JDD733%kHX%WVa'M+2@=iRj_HV,eb<5!"($9?XqF`3n07/#7Q&070#o_#i'j?Q">-%ok7Y_juP_$=A5$9>/6jor6,F/i9T5Q)_9X*T9V$i1*TJNn,%f,qB9&`6%O4H'UW-%8PLg*[ +:D,U).GHd1]=4bd2lV/5eGUb/qld:XSu83pa>aA&J":r^4S'9*K'-:WmrH]>FEit[ +"TlUoA*8`\ECF*H86\8OS='`NBJRm_;G/E7+dZjh'PkX>_ug\Tq[A,S[2jUG)nE96Ssg/UlZV^\F<"tFmeNOY,g)h +Wl!N,9+$A/dchDXe1i()@FBf7GtKVr<[-dW,8fk61PR37$cJ(r7?4#BGo`0^d."E, +&\7B3EW65lLI.eV.\oa'Lkd,WJfo.\,YCL=eB)u0.Rm0(qb7BB:L_0G&`I5WJW$rH +CB53ajr-(X<%Kll_,_>lc/!9m)J0@e4TGWA-T#*Sh5Og.O7\aMEY]e!Y +B%,i2^3T=aC"&2IbGfdQTlK+iG1EU)`N"+CL-b3]EW)?jj"8I:4hH^^2tjZBd#IcR +i6n.u8q8/,^-d\4?(9,L-h`\_^ogE+^)aj2!+ZSXId#,hhG7D]!@Q/4n-''jI/rbc +^M>M'3-H?*G98hd)[7rcE,R.dr!smdm6`lfmXp:dgg*u>d/0,%s-c=LW^G*eF8r,\ +^q(37@VF5fCX&k"!&pIQD-siG*B\-2Gi#07g8obYW-Z=jB$.Ij]['\tK%J$!r1E&*;9j6f>"[#'W!2;`2 +(B(KJX]dNW7$X:;'U:058)eTM7bC-:fom];W65*"\riiOUafVsKhZr_26kppY0J?( +eh+GLR9\dDck;QIW:c1S$6\KC#IE4@l!BCLr`57K@j(fi+G6HiIr%PmD50SNDJ)1eL-,_2le.C^@_#-Ipn0s\p +@p5,=I0m^4s36)l!?_`Rif&+m`#5J:N'IZi9uH(ig;$O$dc2mo2^San`Hl6OfIM:d +90$[Ci04BrA^RC7#ZE_S7f`?h$\=fi$++Uu`b-sMD_E8A-RE:R/Hk,FbR^q@(U[;* +^aVkWX<*5W*fAW5'"(dUG>oB&eWfXP;$bTKN&"F/0N2H6aHa;-Ziu;F`!EH?#TT]L +h3C7olS1W3nbq0oq'2BtGAMO&k?#+-:]8r?h=(lWo*40u.Zq8Nn^2aKrX?nlRUT3Q +66/M*2#^?YS9bB*1G)do&ZZG/5BrCa!:*O15]8c#J_m]O)VJau?W'q.;q@QdX^@1J +>O%Q[$PuZ](JuutjQ11J_G.nq/S4$u8*\f,g?+=#"2K!Crj1+&i;]_5SUU3oH1ETR +nkI-WgW\,j=_I2E:-W80IE4VIPRB.fI*=d&T6^>`kNlLJafG&df,=H==hCjmpRa3! +%YteYmYspF=llZJ;NQI.;Ms"],oWR'2+%;;a9&cj@a18A[IDsATt-g'GSH[C*0d3< +SG+G=i)+au_lu77I*':)dRV]8!elGX=a\m)6FTPKN-kL`EVq_7nSR"RkOdfM?PAHL+s6eX55?+HqO)U'2KJOP +IKa9]_#M&6i,d]$];V:`JZE^@2kG@LhRUs]56A]ZlZrcia,^qSt!%3 +NVZHC](a`ZG?(-Ko0BAL=;PiU%K(^Khm0$3\?"JlXkL"V>eV>Q4"JRC&5V:p@tt4t +-:Hl@`Q0/)bXk^0`=bEAQk58[+b5LAB-Vdcn!bf9U"op+I,Ip[HqlO9>TVTQ&YU%o +OpZfF_2q21,S:>3(J.^>C&)hggr;e"#"=11Uf=2m'YZK;>r(3p+\WMn![MH$jFKk.%X3]$GqtRJeWkL$`0AS1+Ye^2=asoo%CH:(69WF +)T]Dp@ETG["b.RO2Mctp)%d;s'al,%JqW$n'>=Y4erB;+JRD#.]O*c&pn',R2'.3mf[HsBkll%g"lITtn;_3d2OWE$#+2QW"^q)W72-:jV#b +D9iEh$NOMaD7Z#bgK(E0Q>u;B7B>!.lh4nZc3:8W.?fL3rL-0m\cm`?3J3bhj*C]D +.bUU`e\'Sq--N/SMoIdKL+20:EJ#aVW+jedEQ+S:.9j!#5dq$GY>Y_jdk9k3bj3g% +mo%Ks<6OXZa9M9NkB(GogJf%BO(^+[N)n3q7Wi=6.]l/tX\sjVX[0#98?L640%EK@ +<$A-^L!ZXu.A@ji6EW^?LKLoX'H.e*B1q0,,\!;X`4V7EK$kA&FQJ<0/Q0,>XjJl8 +`P%ol[%K?%^D0Ntp(!u^4&J.WW4nQh5&a#_"s.DRV`pm_:^_@3@T7e?sr^gI!]CBFF[bQ$N4 +n6Q#Xr"%]V9sT>,a(5l7l![&#C +*cItoB.Cs/Q)aHhl\c=G:#t2E@@e2&]s!0>D&;tW\%nWgr-ua%psUAC+,9uJ`tA6t +/+g8Kn?u?\Y[2RR>]d&DU,P`B,u(Zpj^Aa(TeQIC(/^>W7SgSHk8D/:3gA?tOr&OZ@9?uXsXE36`/&7LQX3[3sT/'2+YmrrOG'InkR-j:DN#Ur]/ +W`5%]GSF()+.au#>5]k`?&pl2:q[snH'Yi0NjePAIdi26pa,Uk,A$U:_X>I_^!DN? +5>t=l-Ct4B"6][uGP[/8oKIU$@k8T$I[>$I$i/ic@J:H"gD7Tja=T@Y`9r,4fmAe; +IM8sZdV%gTqqR1[,iI7!$3Yr"LPZDon@@Z-V<-(3g#/,%qnf#p9Y1[OUu&D\d^Z@S +GYb)S?b:;bYPH8Dm81-3?bLIF;:XBQU(sNk"Zb_@"D(ghIS>PS,"NUc,#='8""&[m +A([.\JLIZd5X3C-kck6Kh?#\q68hOD>Vk*B;8BW1hkEZ_1`>s7"t:XIORRcglleYZ +5oGQEC8IG3PIPrg`e8-&^Rd"LY$'dCh]bQ[0G`Y@`1hU,+,n2Hc6YaE)e=F=`8-[$ +]r71k\P<%"kWuZse8,V3PJht\GS#Y8iNT@ ++.@?';Nt(D+:qA*r6dtYm/I,1SH>%$Pp!5$e@Z9n<iCfRWnEGDsPoTCY(,<="J&b/8:A&C6l[NJQ;#m +?,rpm-[]4RYmW[Tm5oKm>IU_<[]S8,E?4qb>t5Cfrk,MTA,;H8 +]&c&/F\>3sbCJc$[Kihq]`Z&s[mk8%H;:)%?B88j\*EuhfR#lkQ)&3-)j>=IJL#8r +P/nMWK*0bnS9)su5TgY,c8fAi-Kgn?0ZGFEgYg`?dkfHoVXL$/F4*,4TE!Z/]4^QB +s1NWYB@SJKD6Tq9qg#rVg/XUND1c(kUI&Fj@U-T_FJX(]3B!TO(KE(,;^rkrVNb2V +RTuk]=K!4+V\#,k(f@;a5,ssO&4DimcGTt7YW`pah[I..%Hj97jcq=WR4.250BO0# +iYEcu)BnT,R*Rs$a>$`4KqdRlXW()NPL/YaBlHWnIMtV"n0HH%1ub2mHDH2,-Mkl` +G-!b;?'=m]rt?:L7pgP6pl#1"UC8"1s"sjkTkVCqY+PU$s3S[Z]5F2^3d;M@kC$XT[pI9CQ7^aS-=3/a;%t1F(93JW +O%]&-9CPu@o2(?d+iQT%9t#ONmM"+a=gC<\fh*7AMk8W1R<]Z(F5T9h+#rpK?jci3 +.VS*,I/YC#i?W.M[!r^rHk`j\-?Sc;FQk?$kotB:12,ohd.13'icX&)g\Bm>nZ2-= +eq)S/m15%8:gaBti\j$>Y271"I#_G0P-FdCIcXkZihrUFYK8l`VR'Z;QhGkXuuC1u%jPUK&aaTgqO"m*l3k/[^:bPBR/"_9_NA_j\( +4TP-%:hc7IXDlWc]9O'ru@$9606c?^;B5=&_e8<%GCW9@jpMQPJ`-MHTPVe-Se]$j:nP +_R_].]/]c$\bs%K]K/&Y4#rhbfq,SA4D`u^CLoj6>F$GP7>O5n$aG5QOG.B/F-F\$ +8g&`Wi/k8)'XZl^<^mW%K")1sU4bCU&^6-aUWX)*9tBV)Naf^<'$>dPYfM-pp5h@? +NsB]+0(qZ!_F9U*FhZoSSbm7ahqMV.5tCW@?0!,"qY/gGYDTlO$^)qT"q1]Y`0a<1(><:u2b+6:1Lg:CeL +]PGs$D:#XUWa@.)D&P6K))eUZlB[5`bG=XpM8p`C$53U +j:)Y-qK;D'mF010cA6qkY[0&+?>/L3knfAL<(r]]:RG/aP@dhD(,Z(s*&]3R:c)W` +%.k-P?g,?[K[e*,dE:\#am:0]G7nsXol<,&nlk_M/YpT[,-=TfX[XhKc%o]"Q<::0 +?_e7(M\""I_1.Lh7>g%mMP5_2+b^83k^TE!Tg6=i37Md/G]*r?P:#TgQ?#Z`FA.j< +a]&VI0MZM6P$RO@RV*]Z@::$cCD^YZ#^W4r*nU;jqqO\Vf5m%),HiDq#T+jP$ +T_gtO:CT'P$SY0D1J[Hu89?#p4OjeF;t[V_F#C`qd1ilbi3C+==GX2K$R"SZLcI+t +,(u)FZ(CXO%\A1:75oVmdh"0#^e_X+5BcRF +C>f9p+'.m7'FBb2MR99R<5qMmKh98faMn$,`-NoQ\u@'flGl+IV)gTDLM+p\pT,`< +m3\pIN*1QD^3gd'n2b7V,\6TpK>!rBKA`08coGcJ7.;[NIQq66V>on5s6PmJgf`RP +FjS#&^r>&i`T+2%PORhCnEGjeq5^I5lfaW.0l-5f2Ll;mS%$ca2c8nfJKR4a+D1R1 +IcX5nk#]_!Q^"'8EN='YD8IXh+`Rn"M;Nj+*3S0EX[/hS7F#fJp5VA=H>\gAWLa)= +OGWSR_Y[p(Ht^r71hi!ZXCim:,9,g.Klt_]\^Bs81`<35S0Jd7a@q.9=k>3pF,#p# +QF'9pc8-:*PDf+Z`VO1V]Ws9=nS;*^m5N0o[Vn.tlG![r^'S$?'X@H[@f'ZVf#PQ8 +OSi=d754b$n&g!L`G2r9*;* +_ashPi2'#sY!LgVI`FXOI:)aESp&;[7M?L9qeGdcau.pGQ,&-%ag+V>!]C9c`b2Kr +d$J=MQO6Ym]EQd>4+Lf^12r44G=4oAFjD6 +M[!5*8lj+JFqYdgR;k`bIRbiJ9r!C!,`,g_RmZ0I&$$a%64sp^j@0gp`!fOoKr`+I +[-Ff;Q)X8]9R8jU^W-qSEoPsa`_O)f.rhZJpM'ZfOR?,BbZ6:PQV.1J8!O$/UAZQA +ZI&_V%-IE,5)hc:."#l4gJ!cU9i\eTa.66R]/8R`%`_O'T/Jf^:_C).3Y>(f5S0sRME'Ti@%!c:hi +3e:)!_P[p&-Vr]7bA)_mHI[@3ot/6:4!sWIArXu['hb?C1^irV[L?o$*J<'O_n%_= +l4&AL-L:LcX86u)L(.?6btRLlB1'F_bHQ!@W!PMc`0qF3l352f6VB,[+B1#XThG4&\sS96u"+#PO#G/gg'4u/Z>0N.s46i+cS +H:@eNJjI'OLku.15-uuM$[[$eqZqm/LdaJFI%ZC^gSLOoWD-5_8[FfN]Lbbgr;T1>'/(LBQ8ss^!WD[8pC,BHeJUDF>Hr.Od8:dco +HK9un3))H$//Cd?M_$Z]eD!o[*5YV@*($b9K5>\X'R6;4IpYA21%A?@#M]2og*bgm +0"U3BGOkL6f(d5a)S\`A_uEoTqEO2;7]?8Es+C6#BNJJor;V9E:C\ZJl@7sTfVq&h +.@tkLb6snTL-JKB[ScNL_E."=4]^RO`GsReZ<@SZQMcOb&,N6&R1Ng[N;DEuPgs$/ +btO;L46I2t6E.Uq?jEq*/^r'BNd[',&-`M;qae#;rGaRum<2=tIliQKj3oC'O4DBn;i +U6a*"Q`oH#Qnp`&'_>^QBGm?](_5?:E.IlW2@2O(m:4<$Qa@b;HT+Mmm;F\.$M]eX +nqW1Uhdme#:[Flp^*g*i-S-9.9V9ALSOLkBq=Y9P<]95A92q[mA-0)Jr*eMT_72i> +ABXaYbBhS+Sra!k1+ju6=eKm$VeK%)TZrRI7`@Kd8NCBj*&AI8O'GeWO/=FuW,d,eYf$5W4O2Oc%2qdr%4B"hnp,+b@bI]Yr.*Q$ZM!o?Y! +?M3(p2=0`?gqKnBU!JG0HGj:uZ/ebbar!Fqp)%Sg1LN=L2O;]51`]C/PQ_ +@*Pcm_kNR@VIdr.=i6tR/XV$F=9e/O@E"I[ff66]<57K5#,PgaAPhZE`^^G1TcH$> +)q'L:l%ib.oRSaWat_ps!.k2CI>75aJ,rP&!0V!ks+P>3d&W?<&b(BSdRu"V-D6D+ +F_KsHCLq^'dlRj-G2;Kp@b,T@>*Du*BYV_5#Q,,23pi^i!kF#L!c-MGWmjt*P`i=k0q!&Zfc#u1G%jrP +ij'YP``Uq[$A@*sLHHbH_9Xr&^t@q+cM9`Yc[=Z+.=X$9i+]"t/]ci@mb]4=3=e=Q +8b&9Bo:+`m9k?^dnA<1)+_*)'2l)-9V"jVZq=S\.qD,pBEoP(GP3,BbpJn&[[)KpW +6uq\jg\n\Gj6sY&69\GSr^/d5TDNp5D3X3JVYL.#>4A0)pjO:Bql**DCFel.3o5KE +hN`K)@B/O4Z?1@KSfWQ=i]kjk*g/%qhD48NqaaE66.XQOe:lNEMoQ.)Vt'*9nJgYJ +lR-[&Y@EoZi`G!T/YC%dT#IJF3*aJ,]M2RZQaljO]_+I6pDnPB.V\c8C#_5d=9CeF +,d2Wl*.FQn]M74s:#5b5f`?5FV.34-rI4JPP2k=@UE9/pL>3RS$MW;Q?L_JTeiOhEeiF&nPZ*P3qP +-f,*Q_g(@uDrK8oq1B3:"dYROJ<'`s++;aZ4]cOVQEHfS+5;giZKQoHG[im]Ed./s +HMH99i7PF2PsNHNDY'0;j.9!rYbb[8Tj5:-<5#8-^+N=ik$Q0kD..L:215BQ/oO$2 +@nJ:p=s@NMP)LTUZ62Z,PGQRHV,-%_LF'h7L&JUX>aj=e[rFJgE*1`]&\I*TT&W-9 +`haZPAXn(WGN:Lja](Yh%ZsHu;"SBjf&EfmMTs$J`!d6ReQM.(DDgAt?>P-[9-PV; +iYMd(T,PZI1nt!(5-5q(#fibsm>f82[-E#adWc:JiQ/9j/H(!tb/ZF,=gdJB9K/G9> +FYAX%Ic'MFF.X.tnJTIVsp,:89GL +:5`#NRG+W2a5[ks"fLO,65q6J9XlG^\9tXI.T"Y +9QX27F\mGp^V._:K1'lO:GI`Jcj[B`$+,fgd$&KN(U]Ui\>/'4JR%Gip\$@OZ9: +;M`jqLr3D`dn5kF8rV@7,A8MPA1Am9L)2_6&Mq7]JFebs"\kfsc*0M]=Pbk/T=qa)[E(I&Z9'\Wc\>6TkB4_>g,`!rk!1*qK6, ++b;lM$@_`>mp/*6lS>F="\368D9:FKrqD\7o2(HecqUirfG0^[RFZkL3dXV)HV<%< +Qb)]>H1`Y4jW\j7/7nc.C#^m]o/qs+Pps3U?>Cg;0]26YLDdpS%PQq%C32DSN$L"#mRr7Rla> +Il&%GCg9lhNtURc@](#j]>gB,3pu*2)^H5uLM+^(Uu=GaE,Jg!?@!+]T1!'8Cc#PTbcmo1^qOt62^:XZK^kFNpXR*G(jkB/D@ +#jU!:Xk[\SFrQ(m^h8-.r[PJp^mGpi#l*>aG2ok*hKAA.A`:XCnZDc6RI(i1q-`L) +DXu;i%jD#-6c72T6H_Qlr?\.S8%T?W?q[mGlMi_h_$Yq2-;!+1A?SX;RAR\.`+[,`EcWQg.\aPgTBbZIRd]BPK"gpS%.9mXmr3h=H2p[W8,%NDt[)eW4eK4a=Mp60I +aLis5\Z*suEA:#BOt%/(0'(G6jj_IddAA-\R>;h';(0#N?GTAb];&`LC0&OJTT8n@ +"0Y?"T6i`)>:m$o4hl=]LLULC@uHH;+>.OG&)&Cl8L9?f-B1VCNef&Vi_iiWF1)?# +>K"rih3&MDibA(E=j=#c[B)f>qMIc!Z3l"OOhRMmZm;9MWa)p.;S&T#ZD(C6U/_@J +BN2.8QZ$SS<-jmQWWk%:IPDN3XfU[ESt3=nISmg$[[D?85^`W*L]:XKu' +76;0WSTRb6FTKKKJ1gWsgESt4;#-;?q^K?,#)$p`9b,[HGjA5>%=hCgoOu]A8"I.[ +lERciOVZR\"&U-L*`mWqVp]c1MBV]tOh:OIV''4jK^SFh(1T^UGY.KE0p[74A-=IR +I$T!u^`:[9K);tZN%PI12[C>^KT0rFJ;L@`RCnWh$ND>FDEfAK%"%En5gGccjE2O7 +\W5cq]u[qsMu9b-ggB6_r]8C(+4KTV1a_k,508lQ'%]jPLR"TLq')RjiTFa6Z5BRr +E-\`"-HTC:mD6J::YJ;9k\9VAgQZQRk$;nLT.b:!EO9aI2GBd2BFeDVO_CUTAJ; +"od&p`!3)1pnUK+V+Z,I@!j^`?KpJ;)3Q&/(j@)idNq9?=bajnW;M2dWFso4ca'@< +A7?N6,jdB5*s%dsa)E=t_EM3%8X?SDL!(71_#!]hVeeM1H/n_[3dC4Df^-53\T^>t +kfJGPk:U$&hmtGQF^D_03d:+=lKZdHHi)Jpl^8F0a^_Z>A!=_Bj1a,km>$@\ +,Q3p6XibL?dOk-T*R0aaNT(\lS9^N]3BV.QWb=te^+>PS.%NJ]Mk?>mRDFU'iM.bT +&MJD-qtYlb+UB@QB(/AbMQ&E,KGjd=DOus<41=sdL3,g@'>[W88B%f)Ks9N&g#PI3 +Hn^Hq9cbB)N!op[IV;dZ?*!ZbRR2u;Z4J>[F!'q%/QdL>0^NdiT+9ddO(Vfq6@NZN +q+Ze$(56raRA[q;DF7aYUjLq.l5bs\Wr1K3Aj8C:gWL.XRE,,s;rkQ>p"j)8.>#bk +55M_ln"6LhIicW-cm/=oJa9P%@l'[kLU?W,[%L>Q +C03H-<&AJt%%Ui*_?"*eP7`GA6"2!Y(&4-W@(9+i:WR*R*$Q-6k[;mG*=b?N5AX.Q +Al:a*?FKd9C$o +.7]Z(6rp>,qD33.?V^ +^L<#_2aQ$s"HDq6&-4+;!>l(ZTa7+F"jQ-'D3Xius52l^?Q3*s +rrW#fW:5:4@fJJ>qU\lQJ"PfudtmL3HGi!iMI&.Hn!=A6jTppq`&^dB.Uo4<_)PVk +C@"+'e!l4`lru4K0l7Q')-k+Y`V!W`$T`sUHq_;q0pd!O06@/kfHA/daS;-R +qB%u'I2\%\%_lTtIa'j&+s6a_Ob3EOpmAVtrr8/T&q8T5FGPZWi$N$uD:0bW>8m.C +DUQnRV%;&r(`/\i/\d75=pl17GA81I:t]]Wf0i4a;i/ba$%`GULq;"[4Ynd`=]eH\ +egjD9N@+H0aM9c4`>elHKEG5k+^Nlp,5)"-'7U9a`?.srm5)]IZc&GGLtGXNlk8!Q +.;TKjOo^!LbdBr8D`e7WrMHb#k2-=nS[hIc\P-?jcb4s.JBPgaV__D8-I2!J:[KKh +D+9&4GSu)OH!UK8R@WS(_mGCk4\6&na5<,n)4cqQ&HU>&+:,&Y31::a_tJ' +@7\/.77M6)Lla^8jb!!sYR:STE=OuG%6EDP?$NRDF=qV''0c>*#09Lfl-El957]68 +(5Z*p+r-urKKo??3mW)6k[l=%O?^$DQ$AiQoeMa(],(&uq=n39V!/ba>^X>JAKi*S +Xl)B]i&GYllkcYMXcP";A2dl\]O'Oj"4BF-arTW&Xe^bh;C.A2Z"IY#ZXT>T9Sql` +40*ABn!Zp/,P?Z@O_>dEKN'3)>PoMX'EjW=U6pS3'XA?E3Qs#+mT8;V?]A/hh6Etg +\#\J.DWLKU&IBJAMOp,.RD:*X9?%#h1+A-=e7D&eYUE.q#["m?c!f"C#nR(.;Wjl* +o=2/A9_&=@]Hj,_TjG73!&c59R+RaB+n=/V+XA.C$:#?A*]+Z9+hH5;,A?pHL](t>?K":T&-p1_m) +!Nl8#?2>Ze#CoRA2SE0JX%+BJJGoqY*2$XdY>76h=-ML9OUWBU)?rdjr'+pmb+&hX +1PQ/`*AoI<0Im>,0A88l)]&r$'a*BA@*#9gfXM>NIniB>*o0QaZBW%EB4?b0g6&XGjbc92e"4,T!:o[KXX4%L-:FJ>$[6p_%O>NuFH&j5T]JcF-.*=JD< +)^>kl/T2SFpUdGC2C]bKWh'tESebLIr^S%M6N-pd2p;:c=X_-a +)Z]o5r."Q-2,K>O!L+]>PAg$l`W'I=n@s;/"4^L(R4)Q=OH,up1:IX_rJ:[#6QsBC +!1ipE(Lf66AiC@c28fcnCV/#H7T'5r9r,.DUS8tW?CK>CD[5NU9EAK_"9iYoh=,8 +"[>BI!*K)!5#VubKs/il!U<<+i'/u5O&l.G8%31;hgQ@>l6TC.d!h\V1J`&jNct1H +'g8o),2`Q^!\!s0)FWR3I(UbD!Zt@LDc=).Ui)ql6@8Nr[eh@\O1@Mp)7OQ'200`l +FVlmBl.%lmZsiHA8\8tc[8oVf63sAPR[@lj\9!Op;l[blMPO/\c4be[,3k7:p*:\<@IlS]i"eK8PU]Mblc="`<-.,L;mhSb\^9,B3jEgELW^gi;tj;%Kd((ohUH*kMq[?HR+r61d==8dY-K/aq"1k +eb>3j8A9<@8fsPA^[ID:<@BU@M,Z]/b&*8YDe,-ME`@3p[fC\V`cYB,q5PF@=!W#s +.t6$!q4SmS:ak#^`(;="\baAo7I[3]V4V+.*7@56iWV7RGlH?0IS)QkiBhoP\31C[ +!!J-H\5HK"=Y._k*,7ptR\a9-,4n8/X1CBRS%2g."hhMo6AMAsV]Z=daWm1O;5n47 +JglLE`KUQ%jCqlYKN&q;7#"gfP[kEZIT@q8=u(5*1jMt]FUjV?JBM8^a^Ncr9+(J& +Ek0XY)DHlA:1;U`AS?/U[!@@a790299(ntl\jc\D.7+SV9e0aMa_/jHdO4+^J8p:E +1&9%%)(PK'!I.m8]tT +.&M,AkZ4SQW2'I-lI9.JN)$4VG(nF(Gma%G0""D&V-Q*h6\WsfRb"H1m8-Am=&*O0 +U-)M1YM`kZ[sAh:V3VE>pqK#]OFH_u;9?=>fn`KK0P+*FAQ:a" +;@LPEYV@%*P@bOcQISpreYAuVkW.'\V9Dbd5libI\oi';'USuU?DGAddukNe79u_E +%`0kL`<:LV:)8@D4%dZ]0IZ-A/8QWp1h^M[lf=]Db3;f>Zr/C'@nTgrMW?">jJ!e3 +.[3lY7:GkB*3I:;bCln98br+tUSs-"M)6iA*>/K8ON'h/c.=5e:g@<[sGo2liT.#:t3UYELV7C\:&pl$L& +$nt$+Iq*1Yn@phUi%CW$SdZ^V8-*%=/dTL3J`DJE5beA+D_3JY='jh!P2Kgb!Co"b +Ij/O&*Da:3mfJpU,bOaF%I5*_=oU6$oUh?,s#hn+?SfS!3\KuQ%>k,3-1nX"o=0fj +X-@fd7slFb\iE'f4:IPm+Ii)OZJIfn+glSWH$h,Wl6'j@3,\8D]F"i6H1Le8Ac"T4 +$iGL:K$Naj-#I"QGM]7c"6cUf$G&YB&cl15oAL$dSX6nF]Dm_.n1j=g/+kcA5,@NI +N%JFFm"jpr$4YVT#1.C*jJ:%mcOkcf?-K5fMq=lGFZ4) +hK[@qn=I73T=oE>]R2JXjtM)J3-5%/)C"+hVZ2Wif5'ET;q'#N#-E[!VO*bE].2A. +8lb`qeM$$aG4F\k1*sQBU)eX?"tkBGS%UG#qt%"utLu1^)N*+aB=BHTS=d$ad7ST0u(pbP@Th=NZh3X +;J5+>B,/nY>5i\<$P31sD0Q:V`:[S\fW7O"iB'2pP! +$S<%U2b:tHitGW3;Hi.Fl`b@d;DHN"eX5PMZ&!/b8@Yc6)rHL/T_p# +#u.]s9sVl+Wrf+bL"(,aQk#3pQ>lp +FE9NdEe$%gH7(H9\TW.s:3NsEAfDnk9>@-b:tVG3;m2BfX%fSA:8uf<.TMKX;2D2N +7Mgtk+Aer$<1k;%XV"TI'[uP2,POJhN:DNc;\Mr"D280']:5e2Y8,I&9\70KbLK5& +fgZ^,B^i7U@"uPuMuRq9rumH2+9Kof5em,%L["gU2][YQ#mjpks5Eub+>?C]2$24= +NRK!Oh"6f&&]"G-#Kd?2EcIu/#a/k_)S_UiV_dJ\'+r/h#kbq97"?,@R3\sjL>P7Z +h[m\D.fHLE^Ph9g0>hQUbBKSp?!1KL4LYc[#HgEB_"@p>Jrc-^r^->$!\UL#JHVR' +qg<7pr:>bM8%Eh-H4o5\r^cti-hWP_[M[J1uZJSr^U\8O(&]j9V,m> +1(hEMoM)s;A(SFfcf%NXd1cE)F8N5k#K(2_6^JK>=P>fr\qWl2OA"8*,B'X%CoE-Ul\/Y/Ld/Nk +4JcaNWaS%XX6>'g_7381KWI?QMcM7N/Ah +%c_XHrIie>`&f'I;3d5LB?;_\WSrD9U(Xc(7K!+gd;g#Nl@lTjE6KRuXCVaoG0'(! +EU@YF2[q*`Si6VH=cMnIn<`g2]6QLH.EHf>bAF#uBpn0S(33I!n`-:plRJ;LG9fTr +aYVkH$i^St)HCF1eLi0o')YK+W +0tT^`$_`I&\Wd79/9F3@CfD[) +82(;d((+K_-mscFQF((oQm'<0;;m07TnG_GkSN"d6NXM[_XW&+0nU[T_\*:S,1/d; +EC6,'&SrG?bG]g*\.\UkFQ@s?$s`._M!bk7l4o6F&rl/jM8'/eef&M+4o\ +1Kr2I7`!FiJ^?HOn9X&L3Y@T[iGbGn3"/as_?Uu5Z1X875Qde-'KZ:)#Jf;X15VZD +kVUDF)s*5tYd"1Mi+!ck^/?-fW03*k/:^tj'1"CR69Lu/19t./U/W\F6o;8A34Md5 +#[6GY8q`MJ=")HrdW%rqE,dc1Qj3A>-5CR'HsDSEC6q\-X'.R2Thaq)ao\6Rm.Y1+ +GA1YU$Ol;85TKD.EZkM\oaCWgncq^>5T_/aT865UF_[[ab+ZEOFE>(e$@3/=g3%I? +[B^_$W6@57eh*iLbc]NiQ)g!><>3P5P0-c<.TI-T'k41CacHSf@mZXFI'pIHop@K: +9&68L6JI;eKDRjPqEB+Gcj0HM2;Ck^4\TtRc#m;C2'$O5*,Uq1XAr*sS*TtorQgl2 +-_UJ=('3WOTZi7c-n!8QB<>9;SN&RaG]uKK(Ej+_mmB_@-)LD$V>?Ci&O9`Uf)HkB +LB#`X%8r^=P8uKD+0(E>j:fdW1&;NVRR6u\4RQ*`:1>d#6kLA8<\#n*.rf_?%%!q- +NsUQq(rL3Njg136Z,UhA_t2O>\KAub5*FrO+HKtZ`t(:oiIQoJja!IHo0$+4#Fs=t +4OaO%LjU(aq-1N,B&^<1l"mh/m([CIqo:moIiT4&pDJg;SJ(hKYim08Ljsk+I+9@D +?bs@9cTdREgmoot+!F_QDc#V0598RaOjq.:0R]%eI[%'ZT"'3>\p9aKGb23ucM=8P +*[e%]-#B4Zot\&!/*G=GQa*$HZ0N2\CKGKp^ifS;]>SR]p0IUAFmR[ZbiZO)mC1JI +f28"rEP!;+pYX#/"46j;5.HU0L&M>J9=XeG_CgcNcp>K$nUV/iP'9*emX7XZATiT" +'Qi%621O=4!%%U@`(fC.J1kUi^J\G;R!m1`&Vdsn9\G3[!!"%t'4[F1g@&a2hbdb: +P.*)S=0LW7i9u%.Z[NLoH5XC#S[4.6oC.IC0rsbPf.J6_:IAcFPG"mBhpG`]T$:mg +M[pasb_fU^.-:6nHuWN)QmYV\KdPeI'6g6E4@p97PTY?,8aIKel=%:!rA:d+W?O5L +_Ud)2M:tiqm\^EIb7M!Ujg0qX[>[O*.GTt7n,[qAe2c:3'?BMkQ[uWk6PiOQc6!Rf +gC9e3*BCMK3OK\b0cN)1l93S]37;YhUK.=tXnn;Tq7_6mY&)CDI-q2&CK3D9=I)]d +Q_CP);H@?BQfQ&nM;`C?a^9I[c^k$#c)p^G_)$>N/maV%S53>AXdV80EtO[>G0FGs +`*64e_+`rF#NEp\crH/A73l1GWAbMAej]F@OgS<5ejjOVQ7Sku8>n@C@YMI52#Z4) +FOIt=>Jd_90Ad_a2%[p8P:s>//bd,CCHYD_0=*#*\Z5838+]dbcWV*.?SF5VNdPTg +r392\["@Ib_p\Rt+LdoBhVsR&HZE0@+m>)/3lbe8hg$*s/rb'3#[&K!)`6VM"o%IT +[/VhRJ(5b7Tj@&0Xc$gME`42AiY+=&@"fF;*d]$nVQ\]FdK_(kDn$l=6 +C3ZEP?rXoP(_cN`k49JKp)`;b)@.FT^_e12Hg-QW;*[qK`IGXr>l]LP$B\S0oB@IugA(f57MhK^R +#M8JLeI.*g$AUKqKXZb+[R`ls84Gb/:?]KW469AOjAUDjded$#qUMnV1pUJeB(TeJ +okS.MC?H#hjpi$pL5>ZCUk21edW+;VFS1ra5GVArI&\8lk4UFk&*k%K\)YKPgBs=/ +lU)-=W<%n%Cfeen;l)WYTscGK2_.ekjHHWU&hC1@APuC%R)fo^La%tC'!X-($\UhR +KgVQ1$O"l]r!Pn[njNV<`']&1WJE#dqBPK^Pu?#[f[sATI%\6;mQXa3U)>"Z>O9!LuD>s>F.0X^$q--&&+ +grRLakaUGb9smgtS*E%=BK=eF3nPiEZW;')fCUdBr'1/+=T?o_eGfZKs-]V^eGn`9 +YZA-;cMu;lN!LPT_dAbpIu9R)e,SZ_LOQ62+m"P]l9eS@J!)fUc4CYg,nd/pj,%8e +Q!eSD7ik4W\M&fl8@%$9@^j?t=^jBCUcHh(^#6Eh@l\CG>RtDU*m=*+bOaH2F$E^` +[TDAh*#*Xh.W@I!E]L1>];kBfjmT>qkc69PXtN>Xa5>h#3ulAN8O^osmX2-Ls*][< ++8\IAr'-5Lr\Pbm@un]dAs'DifQ5g/N0Q-4t@ +i&kiK,'f23K*UGq)MD8/_3hntJG +$cE%>"@<,PPJ<*Bss.6M(,DC@&Xm4/ +7O$ddZ`'/&qPNZ#1G54,H7b/lNNLdFt2%)-@R^*dUrO-9>,-hH.e'n27[ +Db_(R8f"[('Jtm21I2U,NY=++ju/1[23-iUMrc[Oj=gqU@gGK-S!8gmok6fI>3>9: +W'>=d3cu9OlkH$P\i5(I4a(^#EbROQDUNMkW^"q24Ots2V,=t);S9&8ZltdJMU,VF +AM$JbX^LD_E>Fa#LQ>`kN*=a$hRi+R3ACHG?gtM,l_7S@0L!.7c`)omrX87C73&>P +#5SH$L(h\I[4K4L3;'+=fiM.DOT68;&VQ*Q8QS=rU.((MA6+oik@/_V6J+TRrIOPOU0@fB699-`J@d4. +4"\I$C6JAAcM-oUm^L*^*T"G7rbPm>8:LoN7_<`j,5kf&gd!!F@uQ?L,9,ke><0cA +S'Z*MjF5j]ot*E$hfKeWV&RkdGRHNRX4T"-\?-ZON&ircH9#:-Gl>5L4PTY&G)JSS +PkCN`LJE[1NXPWCo(`c8HOY"@69E!E"q:*LNXGOio6Cf7HGC'bE4bl8G]\#=pC$cg +#e9R7HZnqk[e%&l5?ANoI3\S33eRe(]j#"kSI#6 +Q-C/4:Df?l)OJ:T::$8:o@Cs:5cA62RYY"Y@@0p$P4k3oC!0l6? +9*[MbZI*03P\Kg]PR;53.42W.,!8XX3*.@J8(aFd'TagXPTpm4/J+:"'UU6f"@,5: +MMFP=<(Y,0@%sZ@d6JE^mF9:sf#bqJn=`92R@-7`.PQ%=Tr1HqEncG]c!$O;3p`DdYRSla#fA!06ht7L81@m?SENr>]\'fFUd<9$ps/EC5ptsIk)>rr? +ni-Sqhq)J_T/$@5!<7Pics"FAL +\.V`3C8Ns;`'8"GjOkh#<>oC\\H@bOW$iS^&o\4iohn7nGg*,sg60+\4EhralOtGCR_I"B2 +h@sce'U>tqh"NjLkotQ=*UV*Kh"I59NJka2e+iUbV"Kqi25pFK'"0G+pWm;m:;U)Y +6C4l"<_e75TQ;$W"@.aa7HhlsnFC;?dMY##E9/Q_m4rYR.VRjjfZsB`NN;!&\"RU+ +_DeV8m;3Q5^t*?R$j:`M')$4,?@n7^#d33s@0?V)!3pPWL;"f*3Yi`F5UZUTEtCF? +\&f0aqb3WS`1ZR]LZ&PY_3gg?QaCrK]6P@sg0_OLfmj+H;:lM-0N%U#>_2nuV\*^[ +ETlt5cm&)MI,mG3j=tfBM4WdXiA#E=3dL!QET/g(l8WtN0R3)sJ+#\l^0T($_\]Kt +p$LW)=>d:S2lW=o/*Kr-WK[f@'_]`aEm*HhR`8bPcXRj9@hHUq)T?D1cDDDt7LWk[ +"bKl7"'@F4fX4%*F[EWp_&U%;Ct_2A3['<*32.(?ON?dSPrRYuU[2jpjs-3/a%uS. +*!S%^LT_d/?f(012JRM3W-b:DF.c[@UJe`6r`:LQPKVjF/R6-SY$pqQE7p`OfrGH/ +b:9bq$Jp[DY>^4D2tirgC6#XcI`';oFb7%BR!W<]:Q%W+k.PW@dR[l1SBLHXQatb< +Eg`Q2M/Vr!O7Gt&W=Rb=U^)Okf;TC$lXc)LGs4HZrNT#i-!bUOL]=)Di4P36]7/_2 +`mq41Pnm99VNNoG(3(@],Nfe(LNu3LhT,a%R7Tp"F4l$a[J87IZ'^>P<$D9$NVW$[ +mGA?4])rY,s"kVHalU9O;>AqGGZH,6==E^Eamc2Ep]!'bH!%qgP)ap(`W+G)oX7`r +,29?B;C7T+ZC9O\T&$E'bHuuXW0Q,CNT4F\o!jt@E=h.nUC],5o,JEa)WuCocft:X +h78=6=W`FJ&.ck>jTYOf?4P".Rm=[:V-@m`h`P/-!a^L+#\/o +ojZ^'UqGu::Oi$lL4X==Otk,_L"3Jc[!aa]D$3:eL"1.dYU0X&Vcp +;^B8Q`I';:"+n=]TM7YcR6ZOs+Te>909?Yq`.jO32NH=d;O_dUaeEMZ>-TincA:'6 +Qqb3Um:E6bAuYCG9[26ae'1PkotR?/]sX#uQ&:L1QDZ1R%Ggi\!Q@:uhoAdDq*'KA/nebu^+Z:Rg09S't0&gL#^d9V7e` +_cu\jUW";mM*mTWO]U6&(F?`_l@a%Z"JFuTfZ*luJa9[HoOSnX3_OKI;kc9L[+lb\ +(ZW1qDL%eeF.'Ud7G3=!s#=WN0RW[EC@+afl?VCO)0tNlH1).G"]=$piL_c2pN8o,ph@[1?^OMk]tuSbOb+HI&5\/78:X]aNW*oO!%d[.Z+sr@24: +_JeDWJ)NLtnKMoYJcGuY.+)7\!cR+BY%"g>LkCVaNRRCIPHYcm!Jghi+u%IHI!usF +q5nt(=p)7+a)##"DhIYL>USlC`b_27Y.kHQ6k(6Lr$H[Y""]&@28BBi=k"WuP^t5`PpdE-3-MD` +2U*(,2%icF6'M`\XSOat(G'Y%4I^7U-_:Rg4S,(gjuiCjEp?bFkY/V]>c6VEB'YS" +e%S0/6cJ2CnkDW[22AL!8+I1N'T9C71)L@B\($U#1_Z2:K5!roCW^'AE^&Ljp-%F3 +NC%#3G]K&A_ZK5e-tGILj[C3i=&W"H>W2@teYbN!VK:ELIDYg\0YJ8%F%\ +KL1L(K9mj9M>Zeb]Io+YG#Ra6(mB3jEL],1(uAa2ml&2E5/cjr%!0#SYrN54\LpF+ +0$&dUiN4%1o-L58Wci!HJ6tBnf8sCmLiCS:E87We#%nT\nePboLiPq_g+*o_X-SpU +W`QQCQ9aiFC0,NshCcu/C'LXbS$nH<+h_drS_p^nfQ/%cG8f:[(uBEQhK'amEuj.X +*o1uX!I`BUWO=S^_SE?)PY.OKIX<_Wrd+a%T5On^^fd?YQi1S"j5eV'f\OE +\AD3i6Ie(^q.$eAij:])2=^3?C^Jh*G\qi@*bUuQ=/#^sNYQbl42*ipR7K`3ZB3mi +r+RJ'FYiL8:7`984>6Q@Xuj2?>(sD"`Kj+bV@1AT;l%!6bZD,D+6K_2gcrEmhRuV; +\4UCak$KBPSu6C2VJW)=lorNRGas5%OgK=tY^[D&FVRWaN[@,bIiZ.@*CU(%`b]%g +%h4WmlNm>e#T:,^T`Ir@;(_t&SqL![_Wak6i$.8DN-Z/JnN;-hH0k6_KO(M[TFc@9 +]Q\F@qe>'@<@f.hCu?LtIL2$u[#Ma%8&.e!9Agt"-Z,UfLs0'?cVjLDVXD2i5.F2> +I?qD?,S#:s`oBVd<IMISEr^@+g/7@S%ht!0Wl-sqQ`,jn"q`Kc%_MQ_] +E9]3.jui[bEULn^k+T]bOo5u5Cem%!SN4'Ggp7jN0cSiQ5hRpWh(\8m)n,i)UZQis +RRsX0*neaAOf2/!^O3\0(9:.V@Zc3t9>_Vpis_)Qp$Ui3i`W\)%Y/Mg=pUiBK#gHd +aiABL`j!QQ+Lf6"d5XOs5gZT<0kaHDIFY-@a1C<`Ie]&cppji1PtB;3e,B`-hK/(U +$gjNYc-?^ik&](a';`!%Ku-"Kg`<6g>KZ]>E`n=[8b8+ZgBIs;!t&+hh!7@mm]hTq +Z>isF#qh"SOTIpa_6VP8m"`-'^L,Fg)oI%d$Sb$\GYde[ZjV8hT_RK! +m-e$K^0+;-1I^D$l^E<9)#qZRqf%SUDo_]]Xk`aHZ2ODi:2S:t7?uh?Z.Nb*s$%@O +J"p4s0HdW+KKO&3phJm8Dhh?MDjJ"/2Q@R'D&6"ejKfrfEpr%1mc/?Q_`LWaqp('% +9F?$+Q,8l`r$H]*QhVQ_fus]R*!Yqn(sj=3Es/BX@!=rrE:%4Xl="o)j`53J[;/75 +4#rfm31\e`SQa^;#D*f0^E>6^E=`H^P#]O(F!8?+?HnjLq&n-#3ppOf +87XQ7V)F,VJ`bQTVcGTb^HsuX8g^ZD2BA`Z8ZBFf>Uag)=t6LD4L%L0^.C?h4]=Th +\Pk]"9DMo+r4P#alujeUQ1Mfn\hjaUeaqKpF'=gr29;WGaeUl:Ai2*omnbYS2en^8 +D4S+P)f`&5F%cuu1(1D9$ae=R[o*J0&$T++[8ut.ud;.GO5@#riKO4WI&X2U3ubFP?IRBDHDe&/*IE?sji-gGa0e`4e/j!q@pW:OKc +$"k8S?sCCd[T17c<5j8ha*$(ZFkOocd`B+/01;iVR4B!nbnY/T<>p`(U1SL3bbUl. ++$I6No/Ms--u%d*Fo?=B`oE"pY^jb3]20))+`MmS)j:56.E>6DG9QRmNhbILDI#bL +>_\Gna-"k!dIa?aoI!MC-fL<]^fA`Z<:GNS_Z.J7\TcL+O6C])9ejmaIQ_p-gmtW(-Zjrn6NL)&L*?bG0$QU:**.(l@g)<9 +k"/D.cS\+:rK2jGKO2(/SJ@!B\0FLh!`*S,0C)^^2mI`e_Z,BKae,M@3sGB[?\FYo +/B&`Q@E;V-o"g.'T/K[KF^X_Q`T3bMqo^FV?hS>c3Hk2@Nn1+d4MTcRs.;*\?d:2d +):L%b8'Xb$2D`=L,ES7_r4cT>q%Hp()kuD_!Nq>ajC'e6VGlif#/)WBc\*Cb3['9U3XXr%r +p<>.s9o*(2cCpfbXd./-$0TgSjjCp/h(KrM6K,'*_9/5lM945.]u6::KTqBJt8qRfTO3 +5M7J$P%n.']qFaVYT@`o-B07LfeN9W/,[/c$_Z?>W!&(Ct0 +ra5b7"Ah(n98[">c*s)!pG,nFE4K_Eh2:IB%aOlg%8$nU^m3rDT26cjd])BgieCA7bOk4q0O\c +3N];AmHWnWTI-MZHMOp/\[5Pne->%,62g@Oh>2,dk"2J:TtmZbCS)_J6cf90X>N9@ +_#jPY<;m!i0otI1f\s66X +WE=b7E.X3[]V.U'!GB%GHa4fARPFf50jBquP%01#2aVPE=RqDRo8M@C:"\kQj0FVG +;2gWZIC=6'>c',+8"VrrJ3?D`2+ruV$SL_NVs&+HlZ8m?EG&L[5B(.O$/ceZk$L[B +T]C*05N"`(i&n1$ITXXs=2Rh7&gUJ6:)461h\5=70dJ+/mq+/BB-07\H$FUq\fERi +CgGFsO>l4H9_KRa#bF28,+U!\Tj@!Y%\G$8?,c7pNno-sa*84m_t5#b)h8P$ld'hg +_fuN_*O'kL]a24G1m!(u7!n:0Id+7\iOo:FE8eJ=64.H#WV7%j#bb4r"X!n;$!KD" +>_V5YZLl=Zl<-(M`;DZ>',k6`kMc'>0H+mB`;iiHMID#[*/CVH7pO(jTO)j]6%9MB +K;.B]Gl9?68d,)1GY/YP.ZU!;"ut#@n*5bmdNeM*1XBY-0deUFa3I(0X*5m1]?Glh +T6`&=_S^:Ro2u:E+6gBG57`,KJ=d16bHhI.%`\,0NTVHAq!5*]a]I?"(S7FD[m_Y8 +BdB'jSJ,/C$83>m?49 +.\[#"P>s7Rd7Q^3;fTBm=Z,[-ZkD$@j)M(a/;mso+r>mQ5Z*VqR$P&22%"VQ98!_q +78G?Yc75_)Q-otZa`I%;7)cNYV,X10o&uX#/lAe^;3(sFg/SbT\Ql/fJngDf@NGej +-lZ'bbhK,9g89E`\:^"qYmbsb2qfLgjgV[6Gs-'8gMn?-l5]P@OX:1mP +IJgoKU622pM8R4#'=X/Q,r6komu?-u*tug?8ES2ijip@40I\2<(!fO>bfc5'a?E^f +.:6,U=]MRO.G$1$<\Gk%/Lo'/6W?Yb9g^Ut`Ou +fL@W2a&k5h=Z,LHAHmS&T\9h$C^2C)]qG2Z%KJVq@bM-=?U0:2Dm)E:6@t+BSL_]# +i%J'Q5.^Cec)MlFVVNrDG%f'JA=M9:KH34jBf?<7&H?=b:9<2_hR"Wr[HU%Y +h-kim3kF?3afH1G;1l(l!5SmJ=L7C+FrBtVg[qXPF[O)nWu-ja:rkntg@d6[Nb^#r +[*Mi2NuHUABpWsXPdDptYEDL,&rluS-kM7a&.!b.)I%JKTgCi[69raUH]i&%!m+k-rZo42>DWT:iXdVQ9 +)F@8IKD3&M'C.nV>sB8;Vud%&1jmQtHnEirXYbGW;+CnteHiS7$?t!VE70_hdYi:s +_*I`)Fi))s5Pbod5?L1>^[?R^!C6Yas0)H9s*qCYBoHatPS%"_@A%eXNs8_%I2A.W +4.0VPM'S#6a];lm<[,Xd]IB0%RFYX;D=C!&X:K-0C'UQ[&SZ>qD09?*ojD_0_RFjM +>p8WDjAUI@cF-T&!<4K6#i)9&>O7J^neG\HfT6$\UT>7D!"[f/"=@mVb6XBD_$l +,K:#WND2GO"d5R5P*$2'=X+])bO0fE?N#huZ,?'bZP^hR/8-[='(YXMF\(+-a*nZG +GS7Q,*D+3MnH[A5l4Zr:lbUQ"i!%k +7lt-#"fsgq)?FFN=;h^1E#QB4&OnhmV.($SU#-g6!:+nKZN5Ms&P76_ZOKeC70cp* +!7D=K$(lV/3d]dOfQVj.Hu-u@AD;EPf62PfD?@+ipf3C1LhK#fs4W[Pea)/$-R%gE +`GL*d\G(I3m`X8-kL!seer0;TM"#WE7+)'K4:YZ3$LR189qj +-mp5HbdL1LU6L:Djro%rLd;V^$6YJ)Bt<(M##u=h%:]07*lMX0Lo6i +&0tIcYh/%2J-iAI")6=PW\onk4-hK8A18OEDc1:'?Fdq<4jO6P6h6m>n3D3m3A*T- +MqH?*DLXdIpA'C6M]UI44ilebr*Rd-IPmhgnZ_(O3U:PhqdGlm,ni;>Ac#q/r)!oD +;M@37kL_@V4sP#r2N.TKMX>*gZ;ZPV\?56jRbU@rdc$!57,Y7a`P*Zi5AidD%,\U0 +=5#/:3NJ9id=18RIb?Bo'L!fKHncuB?CfenPg$eBA;_^O"2B'sT6;TO:+)dhKZL60 +\M5X&lSu:%=>\24XZAkZJQ9GsB@O_3e:8Ap+QgqMf'R_F/l%I6DP',,J-#Y2+i/s8 +reQ$;n3MWH+l7l<^4]@WPS)l=&YZR/iUe:EZpF]@@K*WBreqH'N)@E<@mX=^,58"S +o*LS6"Gu+a\]Qek3_]R?'Pj#!C6t4O0`[rHf!,>:1n[IqA#_6fFP(V\V/\<1DB@ma/c1A'qa_oJX[l\bb(RTCK,a5Y_ +UR"?dk%3RR!'TDp&3]i5aT*X)[oh5t#9.%=?l$HeuC-5'N.&5dm,VYYI&X^l7# +o\DEZoN(dpGPWG4s)O]Y9=l=1_Hr?MU>-f-W5^Ju1EhcfQZeE)f[A&,P +W_SQ%+ku:U^rgK*J05LMaS,RL2:3kGAnleWlMaiL^=Km>i;-LS +d6iIJFRFHhr2TenR6c.,!E]Zts/#`!@2?hEeo1G8U.moQM^&[hJp$\`[(laKh,H0M +j\kKAPO0Vn*5p"54^"- +ffN.6f+IYqiA>M>B/*Um0E"lf(#hXfofO)Y\jm!lUDVoKO!?&c_(5$B+S`u`$O:RU +gQ%J%%MS:jnfWMfloWN53>92M^lKQ6Y!BW0,%JEtKBtf4?3/XOW_2QJ%?Ukm"""D:o^C/g!+jKWI_ZYAO-C#n5P +F'2N6=k*!RPX7dE(ssp%ZjP3h@KENG/oj#]&bb5tZ9^Ip&3ara6Q&1sfoTH3ks6EQ +[;_CF2u^2jai>]^0,b;7R^Dj39'=Ni2W%>9?B48Fa!2&E8_#QA%OAjgo=q/t8!d?0is3XQRjlC>\%if)8M-Zl6Jh_r#R?I5!/G +]T;0dh"4sl*PQZ0(35?^d5-=+mtF(SqmumaC3rH!NrXj +NfZQ0fMTB$0tsG,hS]HOKFrdb0qi\gr-;42psR.bmS+&O9SqoW8/09>(XLqe+\7qP +aB*ug0<;lmP1Z=PE.Xr!b`TG@Nj$i7MJh7%9SG/@Y9 +JZucP)^8LnjDcrRZ4/_ulC +W@$i[bo8Ql]T_`/<2.1t&.0km>C=3SE!u:tSL,g0\TdY01 +Z?aKj:"Ou.gRMF<\3\ZL:0F38;2aeSC5M!V\)I_u,Dq1!b!]_\LdY;!NiA:=XHJIC +P_uZ-:8k[d:j+3-W/s`T,Rn?Wg2,6R>:2NUf#R6;`Nc>;s0P\C1Q:= +Y2a#ol"d'UB;r_sIoS]PPlPU,-j[91%^jalF3k+-LiguE(Pm+]rcL5Of)M$8Vtb#) +#O&kMIrlDjR)-C;TZi)iHLFl8jG00?79H8\5G/C8N=-s>:^[QX0+?:Ro@;.[<6oYb +8op+fFhX().\5O<-c\_"f9`\ZT;O#lUEtT$56;Sqq*\a>'qo0Bd'HglpK9HG=;goc +)gM]P&#&&/e6IZmKi$6$W2ZlZ<-32``?a%!"PdAn>?`dsXUe=oJQ-t>/V,HYiTpZg +CkQW][=#fM!kt3<0#e!reInS/@bJS&q4;E%`jf7/d:R19e]/R"P9e.f_BL4EH6ZjG +^nIu75,;(&mX]1ZiU+^d4)qsFfd)p(%Gs@4I4*F:CY<7==/NGN:T'kW"EV^\\(C`E1os&?gN6hr7FD*g09F +*km18$8?g1Sq3ns5nQDt%O41EVa.up30\FqZj'po6r55#qNHqf((WM5qsH6Wd"X(' +/U6D?E#!`CGp'bQ6=BW5Ds9$-"<%41:s+\MlE_&mbLgZj(GTU4'kI(^kof>r&iYBn +GIQF%g3u83k=s+eS!][pM8P$b`$4`abOlEGAA1OE^gF_igVCcZTG2L90n +G\l#^W7Q*`h79T>ZDCf!;_$Nu.AnR.O^rLp`)EON`D6b/NU]MtE!6]VqtK[X]S4\4 +O5G;7hlEBqZ_%IC)"$:$ki&c3iNVS+Y\`JZD._8#5r:s]"RQdZD&,O%""0'qj:T=' +7\J*pDB[SCcp_\0r6?)\%\J_"I57qr*QdkrCCZt2S*a;J>Vld-((#tFTmJlMdZGp% +gtsY2I6gj-@UA?=)",RYhI"R8IosGViNU[)1soBWS@_eBj'MHJWH)>YDa3RKGhU%* +i=PGU60-c(nLnKChi-MY-a1CB18,j:YDQRr7t6QD^N +/+lCWmQ=%+3YKAl/1,>Mf.HjH&BEC\P(+URre51X`OO??o1"45oD+61]&7FkMK%2= +CD7tUV6!R;]ZLb(Z6b;n*F>q/`N#KJVA!UoK6-BjF6U_l%'b/?E;GW9"V'Df#B55= +*20-tiF?+)j4ob14AjQ/G@uV.V?E)p7*m6nj$K`Oin;sr%eGj;96X!!Z4BLsAL,7c +++cK?tK`HLLDQunFL>H+Le)\u]fl^f-O_-OYr@*?-2 +_l@q0VLQX8B\-Z0ig/s3]OX9SRmNYSV''rqgh&lNp1HaiACd701CZt`sWCg/W2AZBt'XA7TY +B(_*`'g]I#W*clE<537tL`I6kUK'+H;71'GISklk"U6"K-3@5RDUF"RP9kPOfWnB' +P$oT")ed3ahaGn0?.Ekg(jAj%H>)HS'FXC3Ybs[lVQf;gZ=kJO\'13t:)I"BlW9bN +HrLJgA^\c?ic9Iiob5.MZ/3)>-6M)Qo=J`76<7 +!%f['4^,gAWd4QO'g;OBEMh$1k(]InRQe/`^/g]d>TbOsIqp@mTE&^-+h"QCR!/-:_H,?^O\=M!BI-k=V`#Cm!.BY'O0H9Pp"j=+nt;<%]b3L(Q2U(IctJ +Rm4Hu\.mY#V%rSe+ehjhTiN>9)TnZ@t9D@PtB%1ISJi +V)sY9\,L;+N9rTbmlF203K3F\Nc%u/m90tfgPd18'-B9[]`VT4\h.5rI4rF$B4:FF +&K>*Y9[R0X.f;CC'YqH[m&oq:!6P/!e'u)^iM#EsV#&,"VQ?rr[2l3S*@eN^<,LMoCtb#Rfp",HOt,=S.b^-.gD%ui'$I/.k"nKf +a^Q+]aWgI[Ki1M?$-W7oo3=RLc@B%mhas?Y.#[sFinB#E`hE^M,AIK.`em+E:Q1 +s2h(\BCjQ$g/n,Z9DD]uhnP40^RUSa@e.et`sP$Qk^>94rH*ke40%@#CZ8\phg4"2 +]^A9RT0`I\.eCWdT=e\7>/Y +8oZ1VUcVBr7u(`m?h1L'os[lJh\3PM[k.Oi]&'J/_=r`(^0]@h@`eQBCN1`@@C8]G +BuoZc]PIbL9Js"i"-71[?EK4)TF^KRJ9MrCG9>i6)WgT[iU@q%&"M\h*G#TuB+LQq +Nh#*fSE,KniJo8U`tJU9M8I@jJr'jJ)2f,1huZR"\P#hGA;.=3V/ik^"\#tjU07XV +)HjBV?l4+9%GRidD#hhb*Irg8B&#[07?nsfRWiRMFTYV7[PbCWFe^k)75O8Hma<\6 +^]iR`$n)@r$b#F,GF86AjZ'p=13VS>IcNM7kW-*?0tQO3!ZZHF*V`;Jpe1^D4p59N +B4fV>FN\;*,2HabmPY>e\.8U>Qi:">NYS&WAZJjpFk`?j-TJuS/LYcMfqN?>]QG6* +gq4XqHPViQ\!E[e0rKZ,7/h<`ErD^u_kMV/S:1o$X&hIY.o9'8H\WLsXdHJgk>"?# +C'I]I>=\tCCHASug+=SPAcRbiF+H2iYb%G/S).`"FsmJI$^`\b*&k#>1N+iU\Z9$RlVp.h[mCr6 +=Y[PCUnlnO4Oqk=^r"%G9%26Y'D12.>h..edGIP;`#kNdA??G[UBMDE@]()]VtJsD +O7iO'pg`oFY[)d`rZA$4UJl^"/HgO#s6k8bo"lsK,KrIR$R/:PU5TGR%,V]#T,4Ms +';UoXVj?;>SDgB5l)t4(K\e>>'W[9.lq-?/bi2aIAYBh_HY(9$/TOjPgb^0-gQD6B +OH4aN:\p2LqN+LGd=ZhrK=pG6?F;"2>ES*naA!n";2Lf*5Rn,57Q*TT6rqbK;B!_f +.Ou[#D'9_1?H>\gk2%KuTU+G<0"j,@+ukZ;fT\!d*N`EW?rcCV=)T)+WLl"^P!r"j +De1T(VtE"&V<4e2QE)@a.:k=dV7.p%2_3a%=&5N(6Ods#7D21%ijq\t,='_`T +h58eoa!o:IS$(3KVb*ltkl8T0j!;NSFMiE8drp[f2+fbGUfn1F=cEEn[c9G-@gn9h +:!6tH!ETaNVB.c3TM0l\kVs#6"LWFlB/khO]?ZT_rpZ>&/i00ub`;Y0Mh(KD5k7o/ +oeM?o3+V%r@f(<7(+B*e#hk38%;;DM\=to)Z%kC"ETfGc_op]WB2NaN)R&//T#>P3 +9AFr`I"7Bi#BoT!Id7/JpdohJqoOrkKCXX\*5#&#H^VD8@D]iNM2)Z",jYX%a7$^! +f`c7[2p_l6!L.5J[-%J>9981)NcRl"QYm1lh%q_LLhBJhk73/$gM,TeAG@Cm,`+*n#p1k?k1n9l +foB1Qj.ndL4sP_JSqUGia/[(/ZfN"/69&gbfWoUPBAu>)C.7j>G^@&b-k7L'60dj! +-V\ojHf\T.E'nh0^[OI +mpfJl@r*hTHiWL%Tj'loO@_YpPFi>!]Nmb?%B&/:fm::d +a"Z1pBZ7N#c*j*Xhn.2#eH&0B[;K?XCg/f7,+1BQ9H+b,C)?MX62uK^_g7Jcj,-tq +PQU-c!W)"TTi68K;hd__cdi93apI+f0tdep_g8%Sl[hFGJmK\3"u\SpSiCH:9[mi# +lI<`EA]#9;)R(//)5)/'$3E;D#2O],^E0J0W/'dc1hTcHXBj8JP[,OKOhpFSalf-G +ka*G2O=M!9,9*'t)ff:/4C'T7Y,(MLREu$2fHQ`n1ASQ,L,hW8jgc.X+\'Jc2Hika +nu`HpY*R4Zk5'YK`dX4gb^fb:58t&]>I5W23>TCm#f$a0#V=h$1YtP`hG*%t/eGbN +.A6\AHKg"56'):R@>8Ip+(fIVglT&YKHZF!D$1Qk)!-L@kCoCV"lr1@k!p9O72Y)U +)?P0rqY.mLZU;)U"#\L/<71l51'3^sK2d^P`2hm8[j6e=B(F:1ENb_5m8U;PWb8k[ +AprO]qHbi0a+J3#O0F$iNr*u,pY?P,[hET89]EgTi:u[Va&cbU?]K/T2T5T75Q4@n +mR8YLFWJXs3O3"DC_bsnH$Dq6k=Qd#Ld/S/F/,*-ec-90`F@e_,2piE!d3b%;m.5?^$IsMs<='!nDT/jF%78Z +^dHGeA+/Lm+4;Ck'lX2\FpM1RY(G4H#Eu>Yf!,fk&:A0].R>K'=mY2B9ms*(\ZILfIjB^F<3t+]:YAl +0?S[N..N?3NF/i259Oop9]Z6L<:-$mR_Ls@KEj[\&Gb@Dr/30cH8[MlN]\fSs21#r +5I^:2C,qWDOe#sAUItGU(%.ffrN[L=Aq9cR?EW1G.XaLV]3WL!diip4UJdtG'Ss#[ +#RH^$M,Y[Cl4C@87'D6f\-XnRiiiUV#=e5iP?e+9gnD'%;6p=D"TGoViT(1$ZmCin +-'[S$Ul&5a9%RT(eeG.*8p)u@7Y%RF +^T(O5h,u!+PZSj?i`?\df@:.SF/GPjZ1$= +3O\$,%R>[*!HDT'HOA7%]ms7AS)32@QI!L(cT&E72OU3"1dH'EUS@CBmCLYe`7>r> +k,&e;n,h&c-kfWUS!T*QQ;&9a:jm5KeqQMaDHaf&6GHpEVIINLQ=*`O@8J[g:e/lN +6B?uTW1Hm?T/URi0PXoPD1e@.eZ8j`+"Vr8=YlgU#uq2.4a\/M!.$OdFqQ+-PX#bY +0rU_lYFa+CQo(u2f.Lr>b:/cLa;"8Bi-%iQF\`Y@8eL[K<<&Am5g^a*0E]]%s2tK3LR9_038 +\4l;%/aRd:DS+4\g;!#MfPr-dno$R@cAsb=T/lW11qE!1"7.u\2P"Ijgh&9VJ6Nu$ +UYlWTjH.\T"F5dgn4%6X(=W(BQRV8F[,J]sm(:M*F=/->&Di;Zf@#NM10=ORs4@VJ +Z.B%X,J_LGi,ria!C2F*rKf-gokij++!5NMjB`ZpTF+)(E8WHA4E[Mu +P1@/U-)s6(!RUj`M(2n+U3u9Ml*gA>*Qc`bGL/cbVabqJG3Q4/nt%mRXiZ7!MME4N +Vc"fck'?o;3ID,!StgP.*]BJt2VT3PeMMFuIo]G+Pr_$h.N;p19`7D`18BYD]81[7P\[amoqVqE=G^:j+Wo$LJ$giu,=D-j +1UCF@NBmN9FWt0+V#PHZs)ORg\-mRVi;VJf`jaGZB2CJ0#^oL4qJk]DVaUO1jote! +-i`d*KqAkj5+UY\IoP>J]6\CMKm(Y$m6]mDOqi5h.JVkpjCUT]>E&"M#.]cW^fgZ@H,40WkhXeDW?dT?d/QOse0WL!L^U[i!4Y?08g4V>bR:6KErr=/ +iUfRdHOHQN`*8YY6>saW'?Vmn.:ou#n_f:r6Q;VlDiMOQA^_+F5.]].7/_6H +5M^$]'Ad$o6O/aHNV4'[6N^#dPA&;F#W+%J$l\%ShMsQO$O![nd%iis"7:`-p["h4sdOP=>E_KY14%".SXt)a1O&oc +ot;n6?-VHd/JPlL<.%A>IE^*LTNDrE*!f@O[R3gnNcXBm-F0'1;-^G9'3J6F>3o2:@)@1I@A5,1Oc0K^/$_lFA8t +>q!3`cF[A?J(2\ce'7SuM#GeBcJQk:IQPmIq^%gU=1J:9cLY*mcem;6s%_^.`a?j# +IjO[gk`NT;W'Peo`W#*Umeo?)o+([e1]F21rMUXL?-^,^`k>Nt`@0]A((6=`DGTFg +o\Z"6b7o;b/tJ1KT+\;m'V_.Q*cnEJ(8-g.XI/:NPjY`HlDpB=VZ:j3ZBohie=!0m9hJEM)'.,614T7$.@q[+6@m:>nqNrC:L@ +3mSdmbWkYASbfJhO-obC73EK7!88RpnA[s^9:/+W"2Q,Zd!k2jF;D6,cCA6p'"e:O +IiX4Q).8mD&M"MIK3-Gtj,heaVCqpg$`b;pSLYo32/ZJ=CLAGA@Ml<.G$`.(57cX: +$\X''.j*3-a25CMijIslQ2C-?o/tM(V[ddgG#KbHPNR*FVj8"[BWpsq,GX4QHMtGo +SNA<<^oh/4SjLVl>iWP7_gtM[rggWQ4*CGK[1M)fjfW.USlE\;7*3/@ +l'Y,bY!MWEDB)"gQ7*BM,TaZL*PHDBR)&#Pb8j.7%A)Pe*9$MV([u1u[k#J!`8a7V +n[C=e]W3<,UVQ_;NVQ/Cd\H\Sml0K\4(*)-WOS),J(>n:%GC6J>Ac&*\"5$k=f_Ru +7J40Fs.GP:Z46QE3<+n&g^i`!J([frf9,'"2ar3ujno"Fa<1,PrdLmHhCQug!nZma +UqbfO\K8]&+n315iV:Zdd"aF4f2*7p\@u/^pgIJ'K5pVZ-[:-p;Lg:DqiRfD/C-A% ++',U.CZk_CbOjg,n^AES76TgB.C*0.4"leHdqVX-TUqm",8ctQDF\>;U1Bt:N?V6E(;1ji4,tPTG(Vm%UO00-U+h>^ +&6Q`!pWScg/9'N?f^jha?ujR4@iAk7B*RpVCaBm^"/,[)QQZ>I%'MB"pIPSCK7pf9 +=MV+5\p?XA)9sI'?Vp+98cHM_A_3Yj)eeo=@Iq,t$W4YV;Y2Eond3"("j>%[UZ*`_ +Ee8!W\p'6Rj.(#IU4*ctTFj:q;R9h3[<,*='Vp1aY7;L#_")los(A^=Ap%jm14a+h +%NNg\2GC/QTu5,Ye`0gJ;gL6'.+:d]K0)J1*[ktYRG-AbdTCbrc1J]$N5\jYD94`H`di8a +EF]7mAqoM*cOiP;5;c8oWW/u`0g\T+\,*Fa#_`>E9&ABMp=!'t9b6ZE&c?:**5A') +qI,6La*%BrdJ3aP+o(Z+^cr^l5B$,jCPs:gba88-6PoMZQ1(UccJQlfr,s"YknsEE +!6;E@r+-95Bdp6C!_Oe5IU!PJ]3jJe[5I(#jh0&qVuN"*C;d[$,nHd[c@J*PH*5+4*.H +62u.7;*b.)@gC9!])?gm-F"O37/P&Hn\BSPciZ+Sl+h'PifOb-0^75."WD_/F-m,= +%04$@Es/uSJEC?lnt1.Z!:TP%)U)M1,*qVkO*MA3-ic=gpKtN@7/*7^$DsDI)FJ%= +!%@kI)"f3oh4*CJK`!g"Fr%B0L!K:c5Ds+.`,'r3]^$dD5iJmkWGq0'im,`#D0Q%5 +^5Ulq*PW%:?c6kkDZMpbI3B4D]LM)^@#Mo"(UrG(aAkWCPOg +(H-q&Ml@AROV>VUaT#$E#*6-;G#d;E6f-AIO4?:O*%__0c'gTp33?JTIAG* +Y=+M'MP(sKL/d-GB$#d"k.4eQ>s;b(,'dHTSM#,Y.[RIgRB\;jGFh$JL+d.<+CmaQ +^K\L[RR8_LOg%2@<=fWjEMPa"H8/L>u'OZ+k.4IC%)i4U(TC*SrI$pqNXs +hMeaf:?);4`:J#4jg-8lhl_le36V!(,K6ie7%X#q+4"qVZS(m2"1^)Iq*(5*"Y]Yq +1@)Emgb66XYIfM7W];,d,JRG\rd!,VcSW?$J(AEZ2d)NO/J?Z?Qd&p(L^)rJ:1Z9>Dr[n/,Bn(gHb< +Hh9-rg_<7@Jc"jDDpg1db-*)8#p_ml^Edh1"$7WSiRY\f&L[[#Q6c#;-1dJ!MO()s +Yus?XMUb[k3gs7$Z@(2sC^!D(H:>)N=fH"-Xb!S(]Va'^OeUU=@G&OQl%'6bnpDc) +!6qa=XOjbTdt@aU^k-kQ0X"Lbbc0. +eP3G?qgq)*l&J-cDW?L9KSP"t&A](S]r(NdTaI/r\c;crJj&#%I6Z`*s6QmA3Y8O[ +4UL3Me,gcl)pCU$*RAGu,JXB;/aUFlq-qNuTt[0Z%'A6Vdl>b8i0fMKeh"Fh`q<77 +%jpt-VbP%8!W@egFABGV7\b-!UMgO?tQ:?+;E+uRUA=/sV^O^R$\JF9(hI_Yt>(BuQ +?]D&bk`0Top6n\R7h:h[FO`f=s7+TcHQ98n*iAt].6qf'!*ojAXHsTPl9Ak]R/YtN +1''-4NACWpJFl+%ZiC1N4jX`iLt!R'e6pOc+SFe\bXg9Q(r&n5P&I$fLer,=1f(,-;mJSe\ft9(0BQ#U +KPX,RC3m75Eg1r\KLB:6aPB\[jDaL^#d*l@c.Gj8N0mH7W%cKC!0*?g4g9HQ7uL^J +];tAe43kc3+6#Z&Kd3e3/Z3U"h(Vq2Re^0KCtXedgJ@/tcQ9XA+1`*Z>\<`#M7ZN( +qeeg'Y6O*dTIZq^eHcmg:-l#MK*UpX6T*l-^[06ipS\ +Mq&!`3\R];W"f58r1A^\4:\%c:W"'26Re@q'G11T0jDt6[mC&!Q"?ni8(2CD)]$,N +FNF&N8S@I&!TO.UmdBtoq[h^=C'r24!R)A,7:FDD!"+:HE9=l(+k2u($L%L's0]n] +/!k-H(Tr[hr4nT`dZsF@\_ZV?/HPMDd[G,e5'^m*G%rj]Ait+65PS'e(W?>=[I$3c +/HPQUl?B(>G9g&1hn36GC;+6/Nc`Nq]KcO)ksC8L ++\fCu-<%,uQE_^&8eamd&rmmE(!snf?HSrXM27QEJf7mG1'j%[`A-@&RNmf&80P)n +aFH'%k)PrJnU=2/q49)1U._W:%*;C9-GoRs3n5n<"V5@10BZmF6<3ttN;Z`u!rk[' +,Op.T5X&C;Iba&`l]1m5dp+P\OB:J`a$fj'Md4#"^%Ginji^Z_^E+hR8!AB[MZ7]s +j=a#D^YJ&PBj^:.5P!JQmKXBn+'+%92^2=Gm#T:L2KFoRqLjA\ST0jbn5+ +#h575(2C0fQlsM>>kY6iRuc(DT[F&YS:=_lq5W"a6J8/uh.dMi7,[d/@!*i9plbiT +-JADl7tcQPrZf^toPi%PG9 +4.*mVk7$Q=J.<6;'>OYZr9"RmM$H>b?%2nm!GF[P!eUKG!ChSL,rgs;i):YOanC?D +Via^*aXstNWq4l3r=I4sE5R-lCt6"0N\3Is[V/gLBUCTX,+;NX(fnp!f$#!h5UO6R +ciRqZS0fN]A]ur>d!d#9c1\QGJN99i7HTHEX(EAOle_ZC(Y3;jeZ(!1f7S_"B\-$o +erFHD%]GWcWL!7YQ1SjVp1P-@"+$eO"Af];Bb]&FB,&EVV25!q8pDURH,b]O`eq>n +]?2n*h(Q7Y0g&:W^dh&Hhaf95<6O/u_p9pf5bMFa&Epk0VZ0a/5GnIK!N)g^q\uF.)$$Z8"t>#t +!&Tl:oof6\Oos6u!gSrNj\nJ\1SU+LUP7IkM@=(QR`uRL/`GE`A:)tEEo"S&h>le.p3j=-h%)>obPnk?] +bfn;TbfgoIS=!btAs=mjP&8m8A]r;f`/2CYVVH9^1/;QGST^n0cIJ-@TC;`n[J%2t +>'_`tWO)=ZpR\]e1?!8*p;M:4oC;[M!r9rk]O[<*"S:COj0X'Ue9LBQG_:s"PH9#( +ZoHunrIe:*Ufc*i8FuFZens9c%,]VVYM"O>gLl[bW=614M6)iA?L9)E&,uNZ[`J-iA3r0YD`F +bQQjA%/>_k+r;=j/V+Jk9tp?G=V##.@7@k>;9O1#(-hq/EuKm?h=1%92sk+rQ&]_\ +p)nABE=1_'VsHKPi-umFp[\mPakhXd;6)@>s)D>[V#fBXV]gQtgl#K`(q9,oBasc$ +rqE0'EUlWE^ELgJ_/jf%AoIR?1EU"R'`<;OhtLU8o;(8dUB11_fTUman(Neo=H;5p +6^PPQrl9c,q`8TK)GQ\NFW1nTUFUjuOFTK*7/2,/onN\2n9Is-"nI7nO9!7g"1>-L +e`(H=U0U+)Y"HsA@`=@Jd=u,h#3!RV7es&f+\O_3<\0dcOuP!,g*>ZZ-KpPKab4&R +QC%Z'RpQWB>%;Z7bAA%OAL?EAKj8FS)k2l+[a#8n+rS.ad6'%F5:fjf09L\bYXO\&S]:cfCW_,mF,0-[l\;P3/ebsUFr8j%*0;Irr +Z@2W2bQig7`e8pj7"]*J_oDKL8HR:<@d0)NWKX&j1l4o;1_N)tS=`:b5=^LE?K+'I +p=!LH;keQ$@_#FsH.1ahBG)+oV(U5.$g-LX)0/ekjfSVdlK.W;AT[%>=f#$-lA[gs +$7;He?DD7AX.$"j`R9=A^OAJXDI04VXa5,23].=OeGfo,%7@m=_74(0*&W,GfQZ@g +qeqAlGM/PrJ1Z!)Ja^N3r&Y7Yme]_OZ3S_G?2(TE2^1<_G8jsp3qVA?[ZCXmH/d@3 +5e4,EgNS5h5_onlMCOG;8(KebRh0>j7CI+JLu^i36;_G.W5)9[$ueD/_g]\VCQ8*^ +!oRJmqgnY]iS2%8=+*WTs0-,roW>V3_2_k'=>`=%^!EW_]?cW1dQIk+IYK'k\+of2O7/ONg +Q4P`_#Ff@\QtD!gB7q+6L$NA@BOsZ5kJV&(9@Tt9ODN7-*m0h<\0OBojBF(lgon]b +[rX\#KbT(7dn0PBB8(hCMYt&A;Lj788H-=Trl:&;T0(J6]/"$rEbB`>BA:jaDFj]> +/GetNi4%/:T2C8+,)SMM&\?`6J)%iO<$TMdJB2)0jI/Ee'pXL]&G[gmB<#92$4Fsfu[u3M&Meeg0&EAJFn*"PXN4'.%Ql! +bNhGXrP9:QJc0pZN%O\f6j)c[:@890r^So[?Bc]'8`Zr43Ha)GFt[7kY4(-t%iSj- +Ka]Vd-lf`q@>"HWh$oa`jYMP35/!lpptfMQWS@D.GCpa2W$Z$r"QD`.12$f$!O&>N +mHO[%S+@F;`M-8&#LUUb#[RWlI[[L$)Z`7c&$ukW)ncLiE&Vt)%Qp/hnlFnuMsNUB +1NmW],Bg!r%$/R4$LcG%i@Xa/K2$S-p(*?`*>.d*XMFl*iUA(2l%,K(4CR8qll'd@ +J.ODYlHa_56\"/Y&'TODNHW?b)Sp.YNW\s_%Je(cjM5;4f89`Hk;\A53\NX=BZ$L73PlgnMHC=psG +c1csp4rQA)0rX`C?LG5#9?V&pHZ5Hpr5 +>EekmPOPB-o>>"AZU9@0DeYb*Z2JKF%?6".'`)c@i(KC2(G*rU[Ud*YOTb[`D-ult +Wo,ZWcasiWYF*`[cNo$2,k[[\cMW0Z=$+$.H?MsMlq$S2,Nn3#Cp/Zd#H$(Ul^FHn +eUCVBIF`$fGF@JWYOk?6WkAmocDdq]<"ZOP*2Z"dUQ*\l8A51aZn +V_0#PWdN0HC]mTdJh.mu$N:2Q-\UO""li/OnRTH]MJ+J.,^i!=N@^;d(.s@)>VLjW +OGm5V%'jgf75P68,&^BE**)Rb\6/1#630fcJ1>nk>jB1ZbbZbBX&Oe)ELDaFnc`RV +.hr/`<(^kXEWAP=GY4a$TiXERUSbQ"`=QaMT)0R%LQH^NQ5lN%hRUNo# +*j+`V&^W&qf"B_>G,\cR\5i-8LZ,WVe'$jaBbqIMdmZDT7(fhDI*Tn>kK!jnRA:<\ +<:n4rEW@npd[;$'G;^7!J^;J4:=U-7B$'2*W0pEB`1E +0,60NVZ<#aA'>&D +OqGtcWT>H>EYGgd'D3Ima@Oh+MUB0MCf_8e58dM:(.-mORbA1#]Q.a7J-s%=48tHb ++&qiggFN?Bn%2Fn)5PU&W@o:$5s+V3htEV[gV.&!3<1YHaWK3>q+_#7ElO+5@0;o! +SgHR[=bE(`pLf5G:&Bja]tjHBa>7]O,QKeAW#1fZ!%l5CiKaGAG;s%,;:6quqJ"aE +^%eH$$-TOSRGX!8iTj)-4M1ro!"Zl3\=G)J%(ljjT!A6;eh3,BfTc]h9=P?Lqkl)5 +bR\riYk:,%j*C:ne&^'0+fkobrkIJVo?`tUcXZ[WoAiV9b"XtgOU^QrC(.pfFPh=^ +=23qFYj]Z+mm+)B5c=3M\*H;["`UEjEidr?83g1JJ4$`aIF[&@>0RunAc(aML[+QE +b16:#n?ts:O`ot1iVJ<,oehT,.qmpN/;;u"K[4RihnPMqBop5]PS_S9D!/.h&@Z>< +1p.J?bnO&ritaQ2^b#8bL1%]=L17o/Kmkdeo3tPbW(:V_9l;>FYb*;NS;7XM?rM't +;*"=NOoGNHi:DE3:FDt<\ZYe4:"c0%-%;ALs(#*q1C-i9,_%s"r4&O!T0&p"h][A& +-h?)jh"rqrYLfS!3DfO)+oKeIiL:RYO/Kts^7fOibN/IQp0n/OG7=A'V>8r)d]Ya\ +s4ih;IU;GC'm?pRpU#MGT52GZGC=pHFM6S-n^4<*f6"pVB9b\,Mq9BKkOE%]J*cqS +kG(r&_d'0!AKh5*KS"drmp5#pm>HSS5<,!*Lk/.N(9!'1nCETuk5I +9?0uMA&j:uaW`GQU@D3fj@SkUMJ1Fk8E,k%lE!Z+>qV0bSNS3]_b`D?<4OudI"@u= +BjRol8[pgZ?9hH"4KX!f5q$8Y(#bP3X_-it0siD1o6N8e7Lb91olKse9S6NaS7+"u +W")k>IeBdKeZ"E<,efHP&2!Lc[f\BVpaOn-8b2@6]S=qYD=b!pY;h"9)R2:]]>M +PVisanGfNS0IY,EgAp!tD$Y&1Sp0HfAjNAYVZYrY3QlT3'l\CJ_Zj'?7JjUT`3a5! +!&#N"rl9Te9*".m_b@[#i.'f(iS6N@[Z$T]BcB"1"UQ$q.3$bcJLk3IW+&T'Y7M==c*BD58kDTKH%Fg< +VRgbBk&E#N&Pe/[UKhp#fi*ONq2_FVR[5JmJ!uGglP+kT"U&A-+(Cf`o)D8]Xo]^H +=!GlsU+EH:>N-9W'5X*XJrg^`JnX$`[?@B])^Y:u,l-^Oq.V2[BI!h^VhD"EKdgY( +WSE:FX[s(>:DFnkiZHM,VI/If0>en93,Q^-oO@9LErV-AoApD\=HDN[aiP&==+IV,loAu^/PZ:8/pc@n[R$V?$L +"L[SAc--mXlnglH%PEDPr1IOB:[E&V[n +IcAehKZ,m-J=BW8=U&^#G1I6#"5n;-rZMG1)*oIP&k2el8Xn&c2kS*,!1q025E8uo +(qOrVGi>eIrRcPpaE@'Nq_WmLq3Lt=0L&>3LR+^6ce!!o#[fE8dq%s6n_fNqcb=Q- +i)mI(?`W]^'2V8GcUHs,`So86t?i]]/U+k'W26qqlgY&fYa6aD6D +*JTu%@"C("`&NgAlHiV^LaV#UP^)V&GKse.XPFAU%HgiQ`?mpV_eZRHpSbhHQ%%/8 +h/C;>oEr8WMZ0l`o'<$g+7"f6mV.-d&:T[t4XX`HX@f$H[f65sd5Tg;T.Gf2=q^jQ +>N(KOEKGh!k,#h[QiCl&qWt*L5I\$a*96pb0(h5!kj6geh^:JR:LUFD4C?=Th5TSi +0#es@#l]7gk0n=n]b2c+0'D1&WE0b1^Fn8)B]m,SM,!e=hR]HVUe9p161*!FXnL6: +0(NJjHrH2^[NFRO)A.'9$@*6f]gi3QLA8FY\\&,l +r;*u%qDeEL3W02nK84\L +D*,3HHIf41!3bj@9cJZ`(JGbKF/BBtbEc/?mL@4N/a%\%kM]_@d="e'OT2o8n=&q[ +U]\-]5MP]-[A>ZM^`NEco-Nl%P5"o(TE:2hm.mBS3.(M_HU5N@uDH[*p>Rs +fjbkCpr#=f+bn%XMJ[VPE=%.sN/cQhqKJlWtedm`5lUagi@R!d(8s>FX?T/i[qQV$#ZY+:A/m@%.m-YY"bR/L]iK^aVZaq?6,8Q%r##M^ +5l8ZPL;<_D55OeU\oHT\ESamh^4ZW=e\hILjC#sV;!#Q5_3-4_RQ1;t,i4)G:?i"! +iB#"k"a8CO,iInepAR&7X%AndB6jO&'_mq>ptM7Y^U>Ca$F%FfQII#Bih-[o/-pYs +'7;Y\nD:D-K20/@-@sEVJYb,.l?1L:9B'eKZ;he-f@+lfVeTk@BOmnMdZ`3;OoVLb +8ZJ3#C@G\EMH5&':0P4]Y^Ki0rl$kqMt+@ir+@9jVkn*=,\s!4d4YrNljHLZ$Z&<( ++Q+'dG9!1LqbQYW;@`W'[t^m1/A)mb&rCuT]&ZM$8#m7H%._rMP?rWc$$Bk@ll$2PNU>qlHiI<(e4`%qu,>7u+fD_FEieJBTpjN%k +Re59ihG:1ET/+?VP-FZuS6rHMs*CdBe[iuJH-u(=P[5qt^J2PY?'G/">N>$ns)VT=4]Cm\)I'u!Z]m-!l%_E8;?(s^ +rbfF3Aq@gS6Y9-+-!.Ck2pR7DDq=i(dc+K2kuU:=>8N5O$"4!Bih\d.Q+W9f>geV! +Ai"&QJsge4$=IHdR!C&keVRFQ@u=#b7t4Ej=G +ImiGsR/Ed8`@F@P/#*FTj/U_/Zu464.VQDY%)Z9,H!pVgqn=;9d9GJf\%K`k]nh%' +6T_FQ>H[pT%HlS:qi5sfp'$oqQ>Pf:9c)9iMe1MP$@.1-ESYIKpJTab+2TDBJ-8+; +^CH.Z3=9"#nNYAan3:Faa$J4EU$R^\J-p52MP'BSqN.$!L02a)q1$@$+"m%$LsJ5= +EQ!WGVS\&M$>,SG?!Ah/9 +<9m#:=j;cM%H.7pPG18>_B/)r+l-%l%YeY-=J'TtYYEB8_#^=ONRAAJLdGl,nYM^YrqEq>f7Tlg(gd0&o=Te4)Dc/],j +i0P1PJ#nPp$LmL92Dui[B12rFiMS]0YG_/&P5$1f5AB68XlWd$_8j(21KZ'VEF,q# +;rLo;`d%jM;tSL9[$-\1;j%E#8S[LH.N-?#R469]W@F=8C7kq`l$B!(3=u*9kZp_E +LI)km\euAhg%!eJ,OKe%;]$ZXMs_UI<3EeF=$2;#Pq!:mlB`&J'o +L\8HD[dQ9el_4=eNZG;0]Un^CJ;2\L,Hjl2M-XI'Yn<#5P[T!)qd.if[]BCe*/p?lT3Vc3Re-;BK=FW3m^8D +^p.M;Ym+qGhH$Z4<2eGK\Zqi5Z7L3BXbgWn13gltb/? +C/f*`MRIW1T%I,I(gNJl:S!VDR$ET&9)F^8]gr@ANN1Q$dP>\WAqFHGgmF'LB +rg0tNc\O\*:('9-_X@)):PUse-1cPk/G%Vnj@KGsWs8HLh>$>srn1TEhj08b1.W-BXhp&[\F4@p``,aC;@ +F-.l55:i*^+I3,n(X;@_alsVblP2qROiZi(cg;FkDAUCrFGf/g.pO)p/"Y*;T@0d3 +25sfaC0>Rj?Zkd?GOOA]*o-E3DKu`p+=>,V]]5pdMbZE[@F()m)VkIR]';3C-?S/8 +JX@F:GWd`Hp&_;Dp +RK9b[0rIL@GPd&;oC[p,BM47c43L_r;rIZmB/]Rtl/DQ$;?/WhSGuO$%FTXs5lsju +JBrgXWrOaQs1a1/Mb?nq$]+O5!lXmQ`qgN?Hg*tEl:/:!"2`m$_H\t9h))u3eK_`V +,.pl!]G7/gQ-t'aErlIsLBnTLo2itOGGK2okNil"aeUS]bo^U3Pk=K +2#fM@!^F!c5Q^qq0)ka&`:*&VTALE^gW5QroA<)_7'dSa(d +;cG@pCL'Ul3gX<=Rr"1QA8j!Q]KS<6&mDs/f>b8rlUO-'?5$Q2UH>%m[bEV*04IG[ +$kTo*$D,00m%,aBbbHY9G&8T\r)(fLO??;2!/N.%cPL,n_:(oJ1Vi(MX>G#'I:FZ- +2tK.?'E1QKZC=#bA)*#NipP9>A!\5`XlEp45QsoWR!74`rOY0[M")U( +nPRpO1,TMOU'k=8qH]`HqnA$$?M*"?ZoakcGFb_Bm)KX=M>NTTR#g1g5KDp)A(-Q- +j+/GMhIFI[gVsLX%D.2k%s=>%FkU`uFPP=0":5&[37+a6;_D\(?9-H;gt0(k06:Pr +nbS.@[<8>*GJ1TFo,?E6\?Vc+]V]^d7J/E7.?>[:1*N,^Pt`88NgpXfS.b-\m\8MbYW-;.I.L +cZ:ec$&g0<'8bB?7^3I/V>#nPHaVLaDX8Slf9]EF^TFH+h)>'&+lVdJmQYmEIU8@* +44X:u-1^;Zd#[L-5Aq/57Ml&??Leh0HD;C*9#Q24;uYgqi9+CJcPL0->F.K7P5K,_ +lqnGRcO3?Xa-+4+8t>:Zh6!u]Fi7rri]H7"/HOMHT0!*Sb8?*):pPc@amn_n9[09?,e:Z.U*fP<-"JS;>c/4ChU,*E5!&5&gWU]SWSa^h)EWbBDJ6k33ZRj*tR +/t,KMbGE!6Q;VLTF7tV3Hrg&[c4I8C_Prn/T2goJRRF;_ZTE+5p51er;\V2 +0Q7ZAof"i;V#eph0Dfu95Q'F1,suJZ/!0RqlMrEUFR3;=mp'B+>?UbRd5h:s% +@uqg`ctmt9DL7=Y\rWR1?du;Og%$0dW7 +m)H!ONFA@sI>!c$oqHp6)aqkQU3.KuY*j+X7^?b53>f0'*Hu4boP5raO,L9KNj6!L +F#&Ysd#W4srkJ9doIp2&`;0H5OThuX!abKu?e<,1rjTN[D&)GT#`/'&MtGGWnC.bc +f*ZZL$usYr"M53F+g1)RY,WX_8g/'ZU$deXT#.HjU,i2s(B]AK6?qg*Ge2=JM>:D` +X.0Q/fQKE$d_Ya`O6aajf-b+Cc_go\Aao]/+S_"/Z%&p4,:ncO1,&49XPd0Dr%H+c +hX9F9f>bR0,JYcBU_O6"cLY+EO=JA<]oo+[Q`-1?W0=&7]#`k0OY\4WJQT`iFRFV1\0k2o'G] +0)A=\HB)ihO5nL"GV@^#rsV["Geef^mVle^0>L:$hXkmJGIX:ICr^.@Rj"F11pi"^ +ir"9C6A'e1pN&NX=h5E]N!Asp/@#MsTV26?E>;2a:L&78[Z.UP5*$-'\$Pc/pq?&V +3Nu"Pl/2H_aUMR+OLTm[GhGqWScu>gR%`c[n:QhFKJ29N$'<=1o,e4cmtAoWK[-9b +QJi3r%I0-*eEr0sWdSMG!n^Na#^EBd>+I"#lq.(4`$:c!A(tuc$c#PhDH`"S1`JV5 ++1br:HtkZ`a*cg*C#9SniD\3sA)6h\NKs[+[U$<':$%gD`A4+\3LL6cm99N*1k&h/ +^8t5:X\lZ(\8c&(I:&mo8`:"T3e(0SD,r]/=upetE,J8E&lg-4`"u22odB;j[d`OJ +n>dpFinbZB,DMUrJclR'Jrkd4L34id^INB0WASSb(;-Z*'kh(DXr'0RD^&5&^gC]f +89qg:Dl$!]H(O?/;;sC;qM.G4J#j7-p,$*9EUDSt4rED[@o)b^L[tI/;#&@#iTu-C +fd#=Z8,?RD83@pTH;OCSo9h5:KAI>%mcoZShIWfILG1RQPrm.1c0.bY_ +]D4X]i;.;KlgH>JG8nK@j1&^,6l$.5+*MA"'oBSlZp2/;nNRtqYG_YdCXeq6M13r% +r3A]O0T/aYM-]2XY&SJ?#cUm8"uVcZ,A,V^))kuMXW5>$g_Ku3Xok'G+G]h*VoLKX +pFqpegC#WYPUC^72[',/!98H(AH$7cK.nEVJfd")P5#^1"VRdYl'#T0J1:$$8b'GB +M0$!YQ^CB6!/A?J=;M5X/<.e@c)LqA<"@%n<6T&Uc=p;-@F_>clIO8Ff?LY(*p/G# +)>\Ia_a_4'h2G[bP[N!%@o.*FEnn&(pS& +iR\3o$fLcuO;@n2"5&mn;o_1&8*C/.$J=kg"1AI*BA%I7X?%.K3u4s1_Z(j +mlduD3O%b.O")"'E#V.S/UlpCGX%S.k>#.#UKtID2"9J,Sr6KPPAiZShVKp4"[U1k[4,,'l41Xm"1_C=g#MBi$cs=[$:p4_EA4[V?ekDAoj`,Io\[K%b.]Ur6Kla&lK_ +3LIcF)FQ[O!;X[FkhuB2i+hi?r1E8LLK)(00E^bLIbbTJQM]8c_#JfpJ0Z8m;a9&9 +0?cdBe6OH?9fq!-/'(.8crgJ%!%3B5UUn48C4NXJ^QYD,Pr?g`6;_W<&[\HJInG\nT$N-NnF +344\^NJn^Fb\3QK=AT#bG+s;+P%Ib#/unh@;9qs:cV>eI->?bC2n9O\eJ=`KNNB#S +[4tt7,TrE=!7PeHmQO>=-DQ_XpX+,%nqPK/MT=A<#C4L*'"Rsc;0T]$pV!K]e8l[V +;%Gc9fN5tSTEV60,G!l1l'juGgEEo5W=D6Sj)--+?!YQu&A._kp-30Ror&Zb5Mo1; +6)HfERt,iWCTr;Q[e2V.)e^LN1u%ELf:96+H)?IEuou`,>LkHL-YLn^InF@,R>B +cV-5Di`XVU@*UUua[DH/124oVd@@`\*=]R.[<%M.5 +8nWt@Yb\HRb?nFSc/7$lT9W-I.qR/idnjSu*ANHI%Ulf*SGLjJZr/Vi5>9]E6W;gK +5QZV8j=mZ"a5@]_k6n5 +hj+[7VhkAa/:4h'qYQT$8#(Gbab$-Znc$>`s+\hlgPY?9LPf`*[Ee2U^-gk*1s#4G +Zj6g75AVa?SXTRg:\teds3Ed4O=C+3U@eDir(h+6^TFR7\SLp7U]S\X)4V9$:t%*j +.^iD-EnV]+F?nhd]tc`.C4C-3I7;]dL2-AFJE)PGfl&7f^E'Ud%b7TkP3S,`)3VIH +k;VeeFme5\ke`k%3UD)HqejWO(NUV8g]fIaIa"W1F6c>CcX@^sK/lBNLt>0Y6qu$]#8e&p/]->;N0aZXD4cB[OmX +X(Rf#:E,Qt%<"p*r3'( +N1u?=T^gi'oZ?G1,]A$m[QMPP7p#pPE?<'aO`2HD$!:duXFUpVRl3qYf>5V:DL(Uo +D2lhpcntj9ds7?uH,o(IDOg`8KbRq9Uj>;@E_rr[e?F[@>hsWqN2:nP,iRXC'6=d +n^@GEr;WWC(^GL%J:o&hoSitV\nWJ"Ba)"]qR^G93>6e2e9r=er1#Tk*7V[g<<,4+ +8j;qU55'"\p9K5Z@c:&p0eVJ-Y!Uh0I$]8k.mgcc@lXso^ +9@V*YdEP;7a[t'pSmpNHQ:+M_TR*t?=L?GVg?7h7B-"SH4GO^S->'oI.mE#_cS=5Q +EsX`GiueB'/n8*,'DTi@Si_5TSUBK^EU5tOp)kIQ:EBa7!DYsnmtB,-"juam1%%QW +_g3\hE>jCcq&`#2h>gUXjKXfTM=W_GpmA^S9>H1E%H)`g6QuLiM-IjCF5B=U3<.ln +S;3=0,QK`I(B?MH@9BX^]L^kq +SY[Dr/\n"S5ra5&ETGQsW9%Y(91T-^Afh12:OUWth\4>X;g.?U4V-6KYM"]fF+D;; +F&+p]*k9MNGFlH[5B1-iEa[8)U!^A9W8H0@>$%c[,h)nYmq]?3s.`Sloh`DK8%359 +]jO.f_MZ@p3CTU6Cmnn[]\K>@\I7_Df@K%V(F8R[ealQgMUs]U8KuPlK&IAp;'[]O +K_^XL]Sk#bBmY;:0a/-&!s/lS-k!VGE[L'Ac(f+j6&41>?.1h"soiO +.s=?jiNei[OQ'hQX>`Rg/6cf%OQV&trtj->?VH?+72,T=629VSa`$;eIp#YIAQf#E +3J"*afI(1]Wth>3[Y-i3_nK<@qp.FK?ha4WR1oIH?0Ts(mD!S_DEbb5=H4GgZP,/6uMK,t#Yu;iTZXOMGr\+st(mR%' +N7[5%Ltl=S**u!K#oMdn"VcYAA]:`6sE];rdX("hh=CO!lA>qgNCmnn@3g@r"C)9dlWp+]O9Lj1qNfW;u +CG&^:?:>1]\`/3e_)=E3_"mb20W^?P!&hM<[XG,:YHQe2-jpo(_\Y)#tLs22*g&VcbDgRF[\<)7@+kfH+eEj`-Rm*V6ZiW#]aTFcm^+V6^ +#71C'Xu,jK#4VZ*I4'KOZ0]tuhZ_4@f?Ti71"[PpkRu[b$f)`RG9ZU%7\_40_#-0* +p8q8Rh'B=m@0ll*X+lTa##%[9bR;!60(kT=)7D(;L$ZUR@`Yosd(Ei/WJ^'"=;@Hn +D!)^LA"DOg&a+!&-N9'KdJIk]:\HUFr_N(88bFufEs2-t'F73HO@^Lr!hgsN"98L. +$%C07^.t[nq`t,\+FfpT4meKiD%m!l[L/ULBQ^eHpU6:[ZBasfQO\,##^$lBp>F7& +jM)>P?]iReT#3@)Ocrh%/`4A;C9Wmklqok-4+3V@%eKU8K)`/K^/n6\T2PGJ*om-* +M"a=Kn)H=_P6SalC-cHg&?.q%n%;Um[`$])ST@A;=`MSe$#5k7ROPN,8^V9hW2@S5 +V8]06+?`I'P(Kc'oupskX>lFAFH-2tq8-goNi;<4LlMYBG+)FqKM`oC\9uGpSnZX[ +,!PHV39NFko,@h[B4(Ur6+XPb1:#st[-TofmQ13us3lt7krQQGK!=9-hK,7?o9nISo#.;#>c<&nAF;bEihMm[HP&r!eDnH6`CI1+D!Qfj]SQX> +V[9DK@kV.\K^))A?4SoBRL%?W]GlDY$RFY5_Womt)mDMc?[2o!aF4^b**5)o'(8bJ +&@V'RN.nl/5Ob)Oj%?jnNs:%RQk/O#G&6HNChYcql*_VsG8tA(3FB+(:SVVk\Rnj8 +E`K@aYUj.uOssY#]uH3e=HG1<<%J1C?]`%8,^4Z&Y)"B2b*4F/d4744/nN2d;#/Qe +H.-JZ.:f$3@87?-J6+t=>75&lLfl'GW/'4S28t>f#+na%+Q399&qe![B86>&/EMAaao8Om +IWf)Yk7+9."$GJF1k4/>rcV#sP<&!e\)bgUlC:!ord8&EK.3s)$\ElbeNJ9AnE[OA +X[_ZZ!Pr[kdN=UU:PT)1#N6NY387:p4#6S_.eNmrn,ltjF0apu6V;9>M*CCdHea:& +fJ!/BT@@)iUA(.1Dc^nm>qc5`c=,9iZ^t6@<76OI'#7J*h]UuuW*NVh]=+MWI?ebo +=ZrCRRQ2mb6P3+b'MkX4D4ejoj!T,9C&H(Og^*rfB+,(SLF``;J"/`4Lb!_'1RuN$ +1!YP8`ULEGj2.c@TbOe'#.asLaTVU@$>7e`c7R+DA4iJdQS2gh'[gP"R7\b5WYP-j +Pm\M<9=g*57]i`2D6STp!+<-Ng4moZfJN&!0kt#OCg8i7>rHS,0Pk'*4%1\;[kJ71 +([*V6m0o=^\l7@bA*]Xp#La:8@4jT_UA889aE6Fg +CCH28oc-3gSq&e;a-Cc$T7.Esh"@1FHgOSrZ2;fhItnSQhh?1=JIL1nY<-^;e'P+3 +hn![nQG^M@oC0Kk(`HiF5)bA`SGF%lqNb@k!Q_q0G@JUJ%%D+KM06#,-.ehj&)r=& +$!*.?'c18:_%ilaA]K?*gE*#S)=nWPs$Jq5`H]5%IDm'\!j[>_89ekIP0.# +bHCH_#rTm4L"/"=bUbuq![iI>7hq\FJ@C.\cMS`l9#1@Bed?67iGc2fFgmM#!;YH>$ZX^BAD(r.!.0fX25cQoVpR)/&hlP%oD#a-C#+&NeWC+M +YjXX_.^8;/h=[2io:sniF>tTpd"`O#4Pe7 +U63.DK:%?_EJoXg'3drn3#bVOn2B.d.h"ae!MF$cf8&4,d+nGYk]hr"j$^P +!!;jFS[\J&JLJP%,mo^+W1$q3Rn(cB*hGC@\QE+,L.[^sb +%dTQ]`Kj]P\h^3LfnRY/j2($* +Z0bf,\!rY4?F'KGgLIQ^B.QbmYE&A=V"nbf^f35#;iX"Wj7mjmr7-JMQ]pDnbXoMg +kPk@1in:U,P90'hRc)jN7/1E(oR:%FrbYm"qdoS1[g4XbKKkjbs.:P/Z\J`t%upR$ +:\+aPqkmHEZb*)!/kE`j'7R]WmrPeMha[E+*0f53_-U!h?VN%hQ=39@4GW#BX?;H0 +Kfs.5IB-B-E?jqs&s^)*b+EiZIbWlV1u3Y5?q$@RAL]#Z.q`_!'l9q;C_L^QlJC1D +00V'B\SY?SV-CC%?*^>1`)OCjOO'gjhB\@H-'gG>OYJAP4tW9[/W^,$N+a-2'Z%^b +mV!RbgbH]Od6ugo]LS>5Q3@G!Kki4c[QBRC.7<2$Z3JaW +=k%-c$"3!@4!:DD*E0R^;7@%Pr`)>4Jd105:!6:Z;@H(rbID9*]PYcl'u(u\2e`mnQ]O_NXYim`el52A]\jZTBS +lG33c!E32DkV*6d)a\baTc_G:G?i,th'fms$[@jG]HF1$D**dYq/8>)mR-&RgUlTu +`nB:H6u-V.+NQWphUgS?&0HK,*!At'pesEZrd.HaIP18Is6$IFk&%^1q!`TQZ"P@# +1!)W/_N27iS\#^Km1cT*Wcd?dIFF-t44Cd!C"kdbdkYT;%fAP%R'*X"Jt0-QOGnA$_N,Q""R-K(GcR]@W!)m_g1@+?\n?J!/Ht +7dP:UG&ROf0B$$C`_3id3,hX".9!<1;)Bq4*QUH&8f?8&BKn[I2(i,[+]9mU6MZ+& +5[&bcH6OLc;'nLs[5cUF,p[9Q]prV=4(D:6Zu&;4+$Ct&go9W-A"+OW]0=0nTS\<: +EV-lZG5Ks7*J8LPAJ@$65JS>]J),Y]r4hPU!KfV95@DZo%+ui+4!'W':\]'aoT8d$ +s,R6Ga=/s-"qlFg3BW'Kg^.WLNaSDG0&e8SGhLE4%6c!X5Iu=Y^[s&p=Yr6:fg,P\ +;2][g0]'9s)`?R%J-Z"6,N,s/?H2Dgf`rV^*kdcBK3Nj-mB_eCOl=VjWLL,I'n6UY +T:K5gK35dM](HhT'%VU#@=9YLja#)@Zfn6`;2\3o=f4HjgTK`I(hirjMKm=1FQuBt +gioDREi)$@U7Bqth6@g0C#$%sd0-hkVH=;[<2nVLDqnBo#OE'AG6i>\Wn!145l;-p +;7sWG;N0Df1s1$LY&CGPGb59W++0'@du6`#ue^g!3/isM(aQ6S4+(6 +lk>2skL!#Ce3bo]DbSNCMp$gVCgg*tO4s1gk\'ieKB0'm<]S,IVf]n>o(M:(9E>>*e6iF":&d +AP(gl))5YJ$]9TB6TSsJ.Wnbj_M2OYQJ2"KSSNS,7=.K_%S^\5bhMR?FJ%9/*h"r+ +>1@JZPV;?.?dQC.<'/E&3_,O_SX%W3I)aPB +%^0l6!+aaA5C)Tg7I[/Sm;L_QDqO`"3Y%nKAkmuos%E(!Mfq7a:'4]Q_lNKZ5jW8= +_s=HM)fESG0+n6tJN^aS^_W(5U_0Pmggq$0#>blB?AO$JKSi3X:&!eBYe<__U4F]2>cGYeb3^pm)@dB\5F]"-_.]&06Vf=YY8Z@'N_O_@fTi`=gq +;3pY7#iqWEC6d^d(@Qhn^(B\DUI5+>!;WOsqnGr6W97se#Gh0`V#-Y@r1>&&Rf>02 +9sVW0Zbt%.,0]YQ/C2:;HJ0h-!7$?r+/aP>r'gLg:?F;AVG[Ca1MPK'RE=G-&-G69XJQtG=U+i28=O->6Cb-Bl\W!eN\9?$!_^b"b"*V9_K09!R"*Rq% +*E?K/V&X:&Y_=T4;\s^Lc3ndWLt/:mQ,JPm`i,_&.OR_7-Ujs6q8\/f7Ye"^L9#k4 +r%A@INCOVC+"L9Q@+,^W2&]FQl-dk!ltT7#Q[G3hA3 +b6sViGk218!gNFG>o&"R5"(63:6N\>)de:APO9Jl3 +SR#4:^c0?S+-g!WhcMqW>Aqa@mR8_bO';^L^E9q:6@H;=)f1'&T-XRqj6Ok:Ut=)0 +OF)'('&GD;#Y>+pp\NWY47?eL^.@/$2$2ragaN;2"S0T)*k-72V[;DPU?V0hlgOn% +qZf+d+6=MkOL5VQJ^4pW.t/5#s&m:g_dMV4+50G5b)n4Mct3-HldTd`nXDFH-[+PE +lmEk,;bh2LDjh+WR1(,T%rCQSXJn.]W7J/Qf5D6>[pC0R[iB.l*U0pu0#51,Y2<3X +`VG!PY%1h;FA'#h;l+S)rn=Bhoju+#9+"`;d[-gWZ6pr]-7*0"V;irB&nf/3VaXN- +b!ff7,gS4+0%1O*8E*4+_If,gm;i>TZ+LG#gqrJa]\XKK?;e.8Q+PE\)tM&;B/reW)nj/V0)2@T$'nLn1b^1U(4k[nq#d&DJj/"VqXS<^W?,?;O@]`bT' +!<1Enhj`u/"i[P6nlP!bYKTOESman93moc\2l'_AQl@#8LS(_1o-0q6XbQN(u7!"_6)fB%+"qd/rB) +#Eh$EV!=1=l'9S_2DEAoB8gW(%;R?`WlF]]WCF9oAdr:gl7mo@P#:>NE>@0&P%%H$ +R'81hRMPV\>\I0]Wf^)k+VA'4&mZn*H!N8<81^W+,-F6j\R$S_:$[21iRMB.OpS1h +.D*0*qg,8:/]G;UC0aVVCmk%]?Lm>fnJb^@+RTAq:s2*(3r+?RDVokYcY[dUPmH#` +);0-NJLgd1pi[P.E?!a*+Mh[GIULWB@,7\uafK!gV@2HmfqE?%Fa2(C2%-(#"4s4U +%nI$snb[!A)=7T)-#o2u:B?=QAA2H44KagcW,;F%Dl3-6>r9r2qj3TOH +fL^(!U=qM"RQ&Z3gLk>,VX.M6XII9hXeSo+_#JiFA]&+[_o>\$es2GmXW;lB&tLTf +>V&c8XHMA`:q)dh)8uH0*_*sCa9'H338)J#`S35ga!B3e'EDQ+cp!rp;=G+?T,D+0 +'l'$TB)[PYo:mmfq(KZh?V7PF[o3::fugq\.(EC&4'Tf-S1J4lc!SB)>h[J&&r4/g +PeF''SV`T%M%%2V=N80Jdb.%*_c/JF7QA4Q38^)&=pRo0$s-L;#;M!dHBDj6!*^o3 +fXSc&;2ufa@V`s8=s<',!>jcY-RG*p3/=[f;n*uF]JNLN9!i,DUfpZ`E^H-c>aS\g +R!NkQ>#Ycj!5O(W5Y<$UJ&(k66>^NE3O*`b#*"Vsoc!pJ#>?+*bT02,*(M`$7Ec_V +;%Ge/O'F+=Ng(PSik!CMZ:3*FFl.qkn@JQ0X?3S\6a%pEq`t;Wh'`8Fo'\VZi!tSh +jehLj8H8j:!C[`g_9=k!IhFfgG41sAm6K@,`/M=%$hqLS:Eq!F?[`]ucM$rtAo=P' +.t7.4C_4(NUO*9i+"+6U8pWYrrGhD^o5rKkq`J`Ym>O3DHW^UBB-.2%"+\CBbQ/h% +p`]\'fKOR$QNg\_n/rf+q`uSuR6)MO+2'd\'>>LDJdgXIeC+RZp@9/&a+R;AYR=kN"6OjU.Dr"Udp=QIO6e1id;&.4!$V/lCqL?K4p,ZV2Mo +DbSfAM_@G(VN`4RAKs8$O%gp/4%5mQDeQO=A!).@K9O5_50))sm(59q+'2.-&'I0T +:jG>^pghD8h/UP8\F^e' +F<0"UmTR'$"8s.f0C.5peB8u%LQHrh'N=_RS:&.8E4`te!(60(?+pm,>u8-6dJg4F +l*OnS0L&#"113`5.S]0][,Q4s;A!3B'F:>)<^qj?e#ZZuY%$Wp_hYE52(n+EcKhb$ +6?R$TFfL#jWTn&Y)W_\+Z7523s$P@a5dckgq;0_RM)IBW,]]'$":,<&&35Q:P=[Ym +R2cXT-5]G%3TloRcJVZ%?(Gc.]4\^P];L#<9meb#hS-QR:VZ@&lbC`VaMOcRL>RLL +IEpMmgo,>E(fUq5+#Sb&^URJuCWrSjd]sL;It3#%Y,E:@fP=UCB3a;1:sroOfPO^n +l7jk3YUgm5WaJ!X=q.cF*471ZScNPQW5c96SH<05Mlh8RBe.u#, +/SO7dTmMjR$iJnU_qM`GkhC1Bh57PtgU?M'Zu)"1(C7W!7no&M:r"s +51[[Y]6=5c)#opFro^JH'EJ0"6&2"b/Ygd_QS-MXr17nH]GMeqsC)OogK^+lnka +S('.HN,[OQ8.*NE/akc_'`Wsd"9i0sE1UO8!5a8)@kRX](,BDV)5Q2,A[940gP_,S"]FK3^+ +dt]0)_S%ZjX\hE-&Y^$!Ns^JM1]6?uHk_,/!FBO?*pS9(Su7m`]*??s6c75K*F99K +aAjAMj7EZdZ$P,2Q$eJ_V=HDZ]FM.(b[GSihcchI&8,Kr-PoQlmo-jka +g5?:'nG,f60&"**mbjQ^qqoC8rZlq'HNbAE!lB[S^5lMhRlp;#4CALu/cZL_cf=_K +)S6Asro[d`Tr?b/I#2q=AX;$h?;.b5!!Vq)b%aCDtM8'[]Y$=k1Foh2jd/aH9cpQ:8s/Pn%1_>9J`sLNY)LgGEJ))Ajh2)!9=8;6^ +,lV@HjZaN?hcEC?f-%il&c-XRbg5#iIaN`E@9hf!(R9L&2YtH3Kg/7(rGGm! +3+mD5,CNTAIe#g93N:.\5#1KD3UU +(XM=]c=ito@0$0Ii;\I2rjZRsM!";+Xh7Nur,LQ0EEr#:s)o6h^k0PkH1P)n-C*%, +Q#d]oB.[FbRmG8*"p+ac;;n0V_1:M9IY6DVK7#A);:Dg:_kK?4_ENV3*eU1.K9@DL +Q\/n8k\C*kc_M73?rdd'+MPACZEVqC^X'QshkFf"ZFJelGQ;)+6n[pO'Xa@jf&9M" +lT1d4S5OZWBjD\O +&/2LSfJG7ChLZ-:3OGRUaS7h#kV`IVm"7/QJqld0.qAluF#eP.(r7bQZiLM`9#II\ +)pj7T*KV?GnNZMmK`5S:>!$3bHIDN[34WeR\n]=OKhmd`j8a__T6L$H%>*O#9E+ +U]Bu75]UnL/Va5r#ht;/]?DZqUPR'(fQ0gS3U+0Z1OLPK*+7?%7o?W[@;5^Pflbh`IT +5o,!jk7R#eK(H1nCL?9OYAY'bY^9^G-.]O7SaZpL5g7f7kfjY9_=#t:QeTku/5lOI +phA^gp]=L]8,477oonTV=98<.!UpD.0$k93F4dQ3=M^T3I*cd2msGr/H-a7sS-.TZ +ceNQ=cC#otpAOkHh)kD?4^uHo9b5hQ#BX]B!'2D"mLhRi/6agq>.*bW>JLLS9cH>f +AoD,6266u\Ds=u>e#ZYO/R)7."q+O6.Tf\"Jm;\`.;r?4G=q#NPYCYFIdVbeb+W[f +V'GH!'Vf*Gf6b):&A;rr]KtV\j*?P0rY&JL_igTk#Vd2o$UQ+a!YS`@i4egaE]QMEXTu.t,B[!> +IbB7A7d8rcue*4n[ch-KOX9jSsW3pVW$EpEMG#f-A&rQ2T1!k#[ND +hbQH8QOVUi:(;Z^A)'#a?W8KPAY/lqVrkH/g-9:M5:B"8C(^6%II7%q2?2!NqG4^S +r\D[nY2*VD"ITX!X/61EQ(.esNq0ZCidX%_q,J_Lg^0=)4K&h?/4*;SKZkA=8Speq +*]i6[b*mPA)ttcR>ND5Ae$;!/iYfEr'^9?m,:^7A +auR@3B`()sPrGmJ[%LJ->1>30_NcbmPX@>0RQ#s\^NL9*art6f]'$G*Un7 +`QdPU[CF_,NO\0BI]3rt8]"4uK\3P]XJ_+aZW.&6[)8pq&fYYmH<=_\:0%7Ob!A'" +[:Xqe2,:*;-GQ"UWLYEe/X%-)mG%=T)n,-lpnh%hgTGtnOi-*3D;^6($iE43JKo7X +0R?M8LL=C72_A4J?*eJ(TQR?/X\E"R$c%Z".k(="p]j4!<`j%]l89(*;eX"@H(NSD +6[am_J'@=:s3V(,[j1O"&UX.&^bhm"edh()3^J3N8uWb<]c#n\e/2cIBkB25H\pq\ +9"aX,IMF&))^/5u+^>ucYVoIj-:IKKTQjIeGc@l[!Dbh9-h5DR1<)[FbZ3?B8]fFa +fumOKdo?j]n&eXSEDgl>Wd;1SH+U-Kgf8bcd_X27Mp&X/gZ\=2@.^i(RGZ5^pX#T=HA!,eIt0bNrZN;!omFUo +`<-#pf-q!r!VlOeUS),KaWJR5b[0lV+k4O>q`oL15@:bVIIVp8NW$\&i:"LP!ko'& +s)#OaBB_:07_R8:VQ1+)&q[!*uSX2Ohf=^q*7ll&7IM0*^o;K?pKPl5Z +]RC*Xcu%p(1Nl%NhmMe'ZgHTmGA[sqiVCj7mu/uKaW*OCO.K1'N[P!VjIRqia.?#o +0m2]E2Mh#3"ckXMmQ.di3AbLQ*LJbQ(r"\OX'*oO=oe,oQh*.i?Z)g/YH!h;"Y;.a +/]g._;(\5u#u]:^EV1B$Z(I*S:rG,`,k]?iQZ[j<52gOZ\&@;adZDqP7ER/)am +LK$G[5"!hp&;:Z`g)G>$+Y:PD6lWsbpu,;\N5+V_qSP)eWue&71D\[H=OKU_fs/]FO0cdg)'g8]det4/h@E?\DftYb!rV)WB +J$*SeWXJWO=Q482`I?\9pqpm(?[&RKH!][K%nuu0Lmq.nmo'";)9TF:lG"B@qW4CF +4%L[/*e&@7YahlGi?Qn6/Fn#@Ndi+Wh+U5fil"k2+3c)VT=X+`1oL9MM!8iI>uuD% +=V%?e*pSsrilVl3RKr!J%nLgKYt<^riX;le1b$a1 +&]Z:3AuHh(;OmP^aeRK6VM:>l7![Y6/0At]h92b^Z7(6V@[QXoJl"=7?+XRpZt\.# +7HrU7l.iT3!c;&KK+9^&R;efsdkR[c>A^p6E&$thdBm-OK;6*QC)_Iu7d5RG$(tC +-n[^'Kc'2h*U?"OochHOOCEU>A,V4'!@2'%Ej/haW-q8tWmh;hH5&5"L6`lj&'B^) +Aj*E>PT<99M77,Z'^4-==T"4_!6%j]c2q:d7/juOJ3O24GXG%1,7n6i)R+.9PK%.7 +055%fLgVc/Yn2%%M0i1?_q:#[S>?j',r7\PEkKB^!VQF9Kmk474OHK6MT=JaSQ(.85^k(N'h=9>Q_WR"UuLgDioQoqj/1o' +WT90^$e(rh&1o5K<)j0si#hOc&@1j] +FS4sU%=#DVSc($Om:R"mhhH!!+RHl:SG=#+EoT.jQFBX3fV-/XqnNMRjHMZF`Yq!Q +O2:i0G\,@$H]-[mDqfJ,)8L?)5BtHj]5a@Tj3Csd7uqM6pT6LfLn+d:/P#TE,HKC$ +e$kg$Fdr4bCHAYbeLT3.X4G[Xi/0D"1>kAB!jHR@_"qeG[<+trH/0nHQ4n?('QcV7 +h.QMT3X;1d\K3_/Y'jGS?I%0jrn":bRl3IR<_rSa4c1Q0dKFZa,2,g=oH4NL$OY=8 +&;CHGT1/V:Wo*:-BYTt4Htk??8J59WJfLRZ/]@ujKd-EIP2?f1s*;H?GN5]9YE4[2 +L];//p:CplV[g\J@c5"'UDMAe#Y:XaXJ'pR;qh^N;QN96D\I;gIoSZ:'dN+bVL;oNsd9GV*mHg9+1kqRMO21!.ZI2>$E/p-A:BFNA%OGS14j4@VTB?iZ\m&i^%k976]a/3S$ +WcjMSV/$9:4pd7BO[#M%e"`#PVj,`0P231)e#2`K?TWa6[h&\X#OIN:QXJi]VG&M\ +NQMKGK`M-Me$9:+'6=3Ud5tB;`lC9Z8@T@WY.[p_>Xl`&XK]7;M +E[KNeJ7T_cBFYAjZ3YY4O*7dUi_G=$+NAbkj1T:CI-_LElk9FKM8>FP&A+_l];OU% +@")9)/L-^U&P^H-EQEMoc\ccDA]N9+'53bR&uiDJT*>/md/rBXjM)+8!OcUG2Pr6: +Jq&BGN"o+1gd'-n#;NuPOe+C)=6d-a,`VFBb]%#Z,>kIp"IJc5LFNtYPRV1S`,R(9 +>ou6$I$EV>Ole*TlM`3N9etBj.a_BKhF/pJ=Xqp(1;HK4MkfLY<-DlP3AM9h=\9ep +;jkU$@aZ"M_25;\lD3L\)r[=l)B$%XT;aI)Y,n$4acBN'--Rh7:Sp3@E,*q"EZ+ +NUi%;MVNS.)h189,p[)R+MKhshA"#"G+[Yeq#@.P^6PAC_\+$b6q1FDIV31Sp@1H2 +j)5meIQ+(srM8CZQLJ7(.XXIapV4-grj6/1+5<=#)('`G1&B7)pg$,Pq[(NjQcR5D +LYm5=r;2T]s1YN/]7/cm+/IX5R86>el-f@e'&hRGXb0[VmlP)F[&Er)"8@R*PMZli +c9;h8ejPEnT#+$fYLKcPaOaEI]BR1^f1:1ZAUY2nHPC"4)F,1Z>F,WZ\&pb@b':Q2 +@9!\u?R"W4Lf$$=nlCRr-:7/6j7GNU*0P=\IN1_P_:h-gr7W5K(co +MI$-@HJqftr5[a+GCEK"StfrRTd+a<+fkL%dBuJ[hk@Dng,*[YlW5WQ(/1d+%4Xhi +9*[<^qpb2J<,t$bZb'2B5i(]c]pblK%-\Km;?.Uh-lb0q0gg1CJZfnK/)f*-np1^c +#L)dcN3bSTZFUIN]1nplR,rH/kHs3R3fJ.7NH0?h$O-p6_q*oo`:@>'fq;>:RrJJ- +=YH[J4gda:):Y=Ig7jqaXIiLpRS^'Xm&b_?""pG'32=kHj/m<9]jYZ.;-Fd@@$(5Z +PFVZm4Jg%Q\V?39WuD'.k6Y;g#SOfl&;):m;6iqgW]kQYbQ_No1ZOfL%9>AK-tLcNnJH%WsiajeO5l#=NKC[nfQ=MOVD'Y*"O9Y]Ri=nuYjc+@n%CDu)[&&6$@maNn +@m(,+I0l'n,i)(ICSTg!YO"VT%UqU3j[_j\;:Is&&AscnG*7](PRZ`qL2^]%3RZc# +.H,@A[*IWX(4(tq%]C\n)R!1aTA\:clcI1X!5%-sh<%1m],pr7[Kg2$E% +I2_u#5'%XuB+;XPo"!NINVQEUNAdoh9##?8[DVSkhGV?c)=Lr^J +"8HBd^]=8peDW4\TaUbV9?7:X]gqjX,Kod*l`NUr!XKhDq"?lBQtit +*PL0DmA_1t=*m!3\$[]peB3@BC[*4h.aOI3db".i%P6(Q/X+c1UR*Qa2f*m!q*fZG +&pE^*J'8DW[L:t:7iYIfH&oiQ1cBPlGf>qo:RR5Ha;/2(O(1 +Nk94/IG^dgh4WWNq\4K@Wq$%d`I'eRQO>6mqLn(HG?\jgP(hdBj0V6(?8b^U92'XoKtaVW)Bin/ +O:^YX+k2G.WY)qU#Gt3+m5cQ'"4I1^;LpDDD@Jr))T93&+he\aZjAP#`#.;CN'VHU +5#JL,)8@o&i*"mg?(9V:C>f@WGKDUMffXTcQSGY62Q;s)V4G53:qgl(E+[^J8ngG4 +kd]Pm?+BUap^Z0b:Y^Ut!<;M_B($pVm_WVoLX1A`\bpU"b1Dd!pVDbHI^>A);\pM8 +a3I&m:4q`TK,<=Z;g.UaU\C##Hd:n@A+gqqGAND1f'r@]AhPNj?]5nfp?L_JX(>^S +<_3O=B]esFo)"E(5`c'>)PQFP"odZds#Y1f5lNs*Jptn[DR6t[mGpc'@G[l$dB7bcNadL][UY

    M=;7eYMf#CQ=83=^V#?.#Oo)#mCEVL\\KhgS\T2U;6grE+i1;nk>o +L\#*('&'K9Gi_G&=?Q2H"'tLk5[XVk$h-*&Yqu=1D(d_WptQ[!rAnHqoVK%gFnj+- +oYuY6>PGBA\'\tm&^/dg/"jMQFa+qes)lBi0H]=>#Wp]14q&J#FW5j;*5hKCd?CN3 +';mJCfQujh#d-HJRQHi5og;^onmnRP#]Jq'fgC8f:#nBL.:-fG4'oQjtT&:T+JbH)SCq< +39A*6q]q`:@h'LlfC;Y&9k&8PcSfHFa4)Ia<\Y!I!A.3>9Ml0N7*6D[0R+_;N]]'. +P;GdkVn1lY'_NdTnS0q4,"8;0'cD1ZRL)=+$H2[Z,f_.*?EoUFe;(f0)9CGq)VmXTAqnt_,MVl*J>^[suQA^.BXn.;S^#+khHu)dYVF0VJS<3aA +aS[-G%"C!F\!be.54&r18Va&PPb$/p2sV$uQmDeg$D?`3'-71^d18 +7Ap=JY!!uaIW>,=7ijgS4ba](VDVj!E(N^BBj67B/Rmro^3C5s122n9C7$qk=h8NT +]k^Ys6u4ikD*4IJ*\uKqh>5I2LH^C;h1s9\"](`cO'h[A?O'?^LX(;R>Ik8tJ7K8* +FV;95m12Z?ETo?(iBD;D2?GLMkqmeT4F6obeHfkrit6b%agMDcBAFdR\9,9PN!MI]N"?8LpXn+M67, +!9/A3q"lV#qCE!ZnAW*'q*=pKSWnHFVj3\W0=;F"krc)eV:HSseEEf0kp1dcBZ*qb +``-]lQE#\)WJ+F6ibFGc.s7S%oTC^^ilb;18sQ0pe=nJ#A#g$tX%_P(b[O4=,G2!H +qMX&%Lm!!lA.N+#Q`.=$TH-gi'(h9O+QZLu)q@R%l6>AuR:_!TJN^h^)o]RZYX[f$ +c&h8B(i;@ac>E&78ipCNW+b!hJcP^=RmT5tK7Nt`Nl-5\k_37A[))1bG3[uD%W",t +Tju7_m0aEffJ;Cb-5U"Q?JuD>T!E'u-8eS'UXoW\BQZ-'qFQJ=&c4M>oXYW0>n=?; +`@AW`p7fa4YeVtQ_:ascR;;CFa>P?_/iAlV(2fHSBogefZ=<'$EK'7/Ap,@C-]+6! +iVbQEhD=;,liZif9k4.0$Id[^l)[5$"W3U1n@Q7\3SGs7$h,`5#.";uV(>XK!rbOo +!;n2_b4,3[B;-b`Ua'BB-1rM_AIUJ-5fVM5ju?LZA+X(-K:qREUX$9rFJUIsdhTN` +MV]lf0;cAu6c"\Sj?Zl@@&g^l("'7X0$C'5e*Rkjm*o^WC,A"tR[kXahi=dG@k@qk +,Kir$jV[^L&TV+\C&r4t$6H>WhB'hr?:o[\ZD##':V8QC"$*,PMtV53cEe9>doS/# +=3fimcQ^c>b7KQ'\kGH+&(0j&o,'ORSND_:G6\$g\W)*,d_"s/$5S.dD#CrBqd\:a +]=N@K4,Yuc8,Kabi=FTB7/g<'IB\5@s2?Y.#!QKK!,k@([di,LA+75>?,i?2o@^jr +YQ&Ot7BHUaJcDC4Lm=G8FO\oTRg@n:1Pgk3&)eIp!<-)i#l(?"5',?["E^T%b;_DO +'&rq,c^?;EBn64F^SU[4:VI2Q?8L3GH$DQ^6OcKbG46qo"8Iq;#&p-DjA);Qa"H%T +&G]Zga04]:+:.sBD$Q*CI4$;I$g9%5lNH*j:?X__FWZfoN_/&7!Eatfi;]D->Cca1 +ET.2c41'FACDVEZS9F"Y +Elpr+[=5\una)(!F7,-Y0C?.>6._k=K^9*\"H(4eg>,@FgLNbUR1J(,]+OV3\gq?_`rLC^=mui,]DDm]; +XCNLGM2JL9&rEX0Esq'5=SD4(Cknb'4XC\AEJ4!]Lb4->dm`7;,Hk(b]@?BL6I$7* +I3p4%-Qfrr4EBa(E#B>qQkYURH5o-m'/^sIfI,Y..cf$63&Vo/#)(cdcoW>Tqnu`c +6sP%,?$jLPqB,5S'Z6hJ@n)`XkAf`*etq[j06UH9Fr_N6D9CJ;9%J)VGE#rM>.rV, +^Y(!L4f5V-0fmUNqbaA?Ns"7b4@_\=]ZD,-l._j7i;`\YQ&cMmmm@o[KBM\)AoDpX +n@!,9nb9]\:VO1(]k>+ac8gLnN^N!tA"YWed1c-rm3&Kl2=,:.2]/*d2"X>_Z@117 +V/_OnAr9DJJUc?c<7HoNDqE6KdR^KAIJ-.ll!*hF-Cp)R>ZRnSAs`%/n,cG$78]+[ +5($LOS-EF"9C6t35!4@%kp=$oJ,3&%Y#=Ehi4W#9k(Qi8R7;G#H<@Fe8?#d7Z#TsQ +i"%;8$8#-^.FF/(e.!i]M9*^4LIom@7#<$F+U`3CU:2Ng9a$,?498?YM#B,4f0\l_ +f1'b^KM4obRS;1WM8^-O<>.8Da,-(FUoG`hgK!"j9ksP8]mJM-CQmJW@G_R\-FIX4 +Ta/7ZMGDXqbl9iokT1OF?tdT#O?ZZOkg4bM^^V;;$c!#Hce:;Yp9>r2O;`X,T^sS" +rQCH!)4Q?eqjJtbRn6Z@\3n`,IGGaH@>%M6MD&Wf(%o+;e9\"R\ctA,U83H=+kf_Q +E^6lO9?i?lAgbrGPN\WS42Cc)eecgPVQu*-fZ!(p=Fp07)&s2M'VmH\o(,kGp-0>N +@^#,l;$&c2I'EZ.$NU0)/`\)>Fuk'_m+LB2JU!;"C7ScXZ!:+J+@%r1$"%(\iLE]83kC!#gL* +6/^MFTof1T!#N@j2da.?#0^Kh?I7ZDd@9%q=CE<2r;1.u"OP43;?1fu"Sf0.n,+$9 +q&sbdS`e)/3.)g"DC_A=$Qs*P5c9uXj!d:WDNbn);jSQS!<68B-"h=-0t[OS%g`:q +!Zi9crulXS;s;fa+^;b^H_7,bpXq?8r\ta]BaF^q\^#Zr=SU$Kq49Zp:*2X*+2T?+ +o+-PL^d#6p4t$)2;b(b>A!`G=F#&&Km#9R+r85?@+5kuqlG#@+6-"OnWKceM^"?16 +hbYk/QH`["/`)S=\YE'1VjVa;T(12OpLhdJmoaqVG0.3g)>DDoa4,cZI,(knntB(/ +JU,hT+aRI.)kY]\lQ1U*E"HFjJsZog7Y6Gm(d^J!c9il+5cVmr3a5N.7N@8M6CKn9 +*H&rA]#*?H>5cW,mADPGMb9i?NH1XP+0X`fajR,_n:YcE +pqtHud?)JjJQ$S4;fY_[;UIX:+g$@!N=Y5I#e^s][67oA#We!fps,jl:W`o:b(Yet +":n-/:FaE1BVir:ASbOO*&?ihltb0p?E@k-Ds>$l1T#-Q; +B6:M\F3*Q*@J=-?No#+YhZkdh"ea'Eh$2.+s5/OSh$-Wh&".b\N4sQ"2[up@HAC\9 +S^5M3Ds#>hp==`]MDotK0a9]5RQ0o/3,p$'EZO$"%Ue"5lp4.B0\X"h?0cV%Kr-lb +q?b%)!L&ZVrTA%/3=T`Fe]N`A>1KPD)UFjpdsI%GpR;n>=VZ$^k-pc?[[?6d=lqT2 +kIrgqC,!qL0[6OT8[$,sX#l+(;gk+PoTg+!aO?Pb@,OqW;Pt +QKprP0m_Q-cQ+,B%M;;[82"S32=mWT-/4/s$9H]37s/:s6m2^6DB*Uc5^`?f@WPq^ +]Dq)65hBF`!QY=#\c!B=;=a<_`aK%F?"^le3"Bf0]B;1K;bdd#Nm0BH%_gY0**\/r +Y<,<%]q!4t?sSc6Hh9 +.:BlpQ5mt>>M_\JSm\K^2H@!%.l(q*3VKIX\sa!obDiXc_:EX>X+M"o1=TTs)GU]8 +2I2kJ=(TgFkqkhXn?2okVi`h'aiY<\P+B"D[?V`g>T-#7PU9O)gC\"q2DTB31m992 +@E>)Wi1fT+Wl"@.o(JCD%o<]Ae;s5[cLAg)L-'QK7LTGbTCAtTpHWWuDR"Pt=bCB8 +5j-uWSUW>e@j%:r[Q/b<,:Rliisrp.I!O]]5OIJrrZeTq9UH3Xo1(iNr("dhqT`CB +/R@i]^>&n3"D#N,!e6dCkrXZ;+(0NoY]or(Q +BGHp75%O&]Loh2]lX*(tIhT6].=;eG1`Em@T*VcFla6_=n$DZ6GNBKVjdkSO20\?> +ET4uPnrbkM65r+o+5F?m40\*6[dUu(%:)ke0)0jGmMV44oSHf;k`suN-$eF#fR7Se +\qb&d8&OZB5k)Ob;SK82[]NZ;+d]qjo6a7eF]YF';!lfD5Q1Ei,S,LgCbs0NY6]h>2NUXju +0/98mKe+!&qX]U,Dhb>th*moL,>HJIOjT(ZOd->c..k>HYZ@ZkIYIlD;5s0)"oDAR +lDH9V+/XrI6pDXs'!@lP8*(Zh1dh/P:=?Y=dM#e\/(rrbg0\LI7DX*=Wj0 +_:8j\cfkR+.Y\Ci#0k9./Bc$a4H>emLmWT)1A*&'=t4bt5(6NrF[A!381J@>d_B#9 +X&Zs3)0'C+E#Ou3SlQ/d;"PinnJRVaR8jZf;iHI4@9iNJP[a38>0a^.nN-*g-LTEm +@J.?Sh18/r^1#i[8]/)=qmCS@27_nuVWWWfF[YX[[d-%goNs\?gj"d/YToq3!iGF= +Ao7[Ic@&0c"/g$gVXHi`mmH8UKBKB>BQ-V?CRMV.$["K1I0E"QTp8(MQEAtJ!i!L=eD(1(GcStb?g +&'`o59g&X'>nN:9LZAS0::;@M>U-mf0<*D[A&tr`b3J'siROH@m/m+.$Dha[TlljP +[DV?#434](G$2Ki1]k>kqZ)!Lrq@C&ciUNMjH%2eq=*S>_@".T#6Fj+plic7WNBP2 +C\7%#%Q_mU_n1-GVeat`Do6@$_e!qXgUlh+Zfogllql0SW9X,Wl1D1%MrWs?467bL +jX3(Z$Tile"pFPn)(Z>RF:a3*dS.^-.j+YmQ=`4pMS=X[#QK;Q]?sTm=9-rJd?0Bb +!).2(^ZN;5nc.*g/Ff +$k^2]':>uhcIR.$BY1N,?!/'_r1+\YC^3ZM>oht?"%<7-IOa&n8DVQpd?^_E6Vnn- +aB=s(>F7raR7RuBUi#U!'Ts0TaH;h7Leq?DF:ehuNYA +Yh#I/*4/Gq5'QM;Fl^`mhCjkZYt>N"J;nY@qXfY!1fl2-I`+D +(.8!8'DDOkOP_#7V-C^rp\q3q0aFiD"JBo/^`XV-CP,laYGmI*.j_lF(uT)(G"pp%8Knnn\)[48,]iE`SqF +[nP%':XdAoH-AaRl%g/i&Y^M%F@-5G\&-p+8KK7bn'\ps0?D8rA\6:%iOqaY`Z#t=/']d/GF)K])T0SZl:CF +7M86)8%,$&rd38[pBs$3?8_b<+\jglm,\>M+Z99+[AYOnW:@n/ZVnUYMD6%WnLH@j +(8N-e,pVR6&f-]eB,.abPZ)3p'8ND/HGodZ*r1#:HSl,8RfsZMU?m>#QO-fe#q=`@ +K\r.fi98)J8^Y%naj_X$S2njB2>sNqPIb8q7W]WJIN>4i=6:NiB'iY8S_&OdCN:N, +^mT&c)5[(Zg4/PCJ&^_7G8du1)7XW-](-oUi/Jb(%39a**V2`qrPpRCVJa95DSm9o +6g)bt!VeI;5#X^q&3BF"C\#nd)P)TC4nYXs34bUG4UF1@7+9I4cPaehO17Pjj%\sW +Ja:[s90YIgOk%1_BO7>iTLU*oQ+b0@9q#cj=t'pG:TG2h.ck,Te=JS`B/LXi2OQ\r +-,&NM.ISMt_qIg9WAdMS_khrkR`3$"J,7kEZ._1:cM6WSrO/!-*NQ+O!*X0AS(Ll%V"WOnOcRu!KEYc3tF-1<#)(Vp>"jJTkb +@bH9HQ08F3\1YJX"3/:n()>P([ln+<4#^qS8O<]])HpMVh` +_#fX%`_a4*+1mS"r/\5rh/_iari`(QLjLh,&^41B=/hb[?(9W`2=I-EJDPGKThV`\ +"/#B0cg`U5i>o\l7G#fs:Aq,8j+)W-nPf2AVlka">`)FLMUEL?oc/-@-F5Ca"Y.Z< +`4ul,0?\AccfUO(Z:_IU-/#3srae)pbQ@c)&bt\g^B\&th*K#>VX.cqLnt)&Ook-F +5u=4Wb1iE/rm_c<\lp#q=;XW!j.rer1*F6DS<]\I'i#6W+DYO6@r3hg+Y(n,<7'R\ +!N!I78'TL[*TY&aE.\jTV<5]qF(D4i*)p&NC(.*LSY?J-5L!4D,(G-X[C%IiO&n(q +QSUOc1,4qI23p-ZPI@c]+lHqZ]`+o]NjJ.L:bqt.TS9'6\lRsu4k +^%ASsd'Mi\KC8F(?2iW+"q0Pok5=NFoB/=/&FBSb%p\%bHO@C_L!A8(]GTRfD'biX +JF=J(FqgG2bAZ,(7Hc9"6i5MJ0mZ>4!50h/jYMZeBae7Wo3XQMR(DG)"/95cDsYak +]2%5S:h$1/I(X*q+d!:>JaD;ED##[j/7\X,m*3c=te-\l%tmX>T% +rl!F?iB*Yu\%W4+"JH-Rhs*;[nji^;&3PFL=GQQbhWfHKKaXf8,CV/%;jYTNV_P8/ +dKsP#9E?o#&)+jl[m*2;PbubUt\kY9jd8Q%,1_&G5nI(cI\mFq'oiB%l>28 +XkRBS,Kg",Wppacn["D)f&a2]]jSiRCS\d`)Z +k&1C?HGu@A2hcZ-Y6(RE$b-J0^@\&/n=)Q7)8GY^^YqoDqbBNH!:(ZJJ+UJ6\c;#Q +n*Id7e?8Q,J`k[PES0c-LWsd#p)$5rF?0#G%UeC?D`P2,fY3n(ekY74&"C;sd!jiQ +O\r%S$s__e@VhH[e8*=I2hpS!q##SrQ\3N6m5?98jJ$fi=VnWEg%'D-TqK<7T[#Cm +NEJ`GT=R*n$]#gMW62A6C`XWgY0I=gi2(U36&H +9(sEJ"qK;LLA27RA!bl_!A;/.fln=kEur5ra6l!^`eRS-S-MgJIg%mVIX%(2^V]>? +jn*DohC_amcnT'iSi+O']&O(3J),$j2.1eXG\fB^Hp):d1N[ZnIpgs3D99>f3\e&e +M-$"[/l$I98n43`H^&)e(Zd^>j\bX@m0iLKJG8VN=&CVb)DP$I20*%14Ze/E@t +^-!3DE=+J;3&p^Om,r(V<2o5s1l`qN"g\21lK;FQr`L?I-;i1,8qC_#B4ijkjV0*K +D^ku-?th#`0U*e#a]f_,'+O"d59%e./JY30AZ!/0'+M)8\?WGh*&YC!:jG*:](7M( +b>JQQi:C=;$id1a.MS&//Q%'i<$;g;/M.]29V`+,*uc%Z1,b@R23G8QON(MHO@V/# +G-Ws)1u1Hdc'%1/'g,a_4M;GVGfp"J[BMoUcnNFp#fZF$Mnt4V]o[e.YIQgjR3RcL +A*9OQQ_AQBSo&d,L3N8T07R2UgV2uH0-DqMG]Ad/!c3oT!$6]O!9S_o.J0J4-YVC_ +%'BN>U9k/%6OnA#2??K@a/nm9Muh/-2P'noLu-Ob5Mlb)QNd9WdLYo#=oMjW"n2m* +*[#\%ddS?LfYoMtHjF#m%mn0YZm2sH&pgRAJ#*rfq%UC0.:rt$&Jhj.l0H8T&ATA= +i9T%/:XOOX6T75_D;>H#@lKb5Dh)@!.h-n45`7l$^5I3J"VJ>._XONp$r:JiWY%Q +'p[3!NQNKZRM/r^WBR>'rAU&iDm)hR08pj1FfY6o?\/baoQnHNh_nX;XqUj'[H]E6:#6[)N3aSuRjmG^5RPGl%3PN`Sk^Y1UI893+&OOT +oNhh:\u"0ueDo.;d[0(EQY"XTQ#jB6T5Q,jc:Z(%8gg\iB.PKC/h1JWX(fN:Mf"AlkMDJNp=Q*&;43% +\_#K5fBAXs`2WLL3P[je)O94@"`K!"&VA)R$B+sjrQqYICbcT+iC$>0T68GK54TQF +G8Z)/s28seFQbWAm1eo+]!p?ukkGm=gFB%2agPW8:d&\rfk4:6VOIa(e4p/`.$9M1 +I2#L++'te/=KRqF@%>ndT%cshl*Dr`AQB>j?\/Hg'D&iW7:6/3s&uc$(Bt0`.KPYE +:4<_Q^jf]G$LlqCgtG,S!#>S4G7h7B$qfgfoAGJ@s&E+gL?$&r]7#[d`pYS:[n?*pAbE5epTJiOD$Ne:#ELMC +N%OjdY5"'[q@9TOFg$(72C(Je8d^$0`\#AEU-X7*7sU+rnT/SV5,4ddTfA)>&cRjh +G:ptuQK3)d5M6!OJH^G[IpP/Dq!ZI,ojXl04"1&M$@pqA:+N +PQOX;`KY@_P'?"[H[*^0n.bhH)F4BB_;TDHO`D=*Q@i&fgVH6=*n.b!h&-K0_3EPR +X^L-2J3:E::[:JgpO8 +pd=P3[T7IAjM,@(bADh=?W?O,!9D14pnB]j"6Rr]+CH7>9g70_!Z'bHkL+;J532=c +?q_Xe2W'4kh=-L%?hl?_k<-RZd&,1[&E3(e=,+I^gAab8&Zf=cm!XcK#Pb&U`K=AK +Tkj/Lh?GRL\"EJhgY(4u!H8V>/?E7l(^_PTkY2*H\MMioF"XI#kK,5uoZ65Xho1WW +kU!Og\='Se+!/X?04[g3*q^D!T])2Kc(P[9nKNeLO\N.lXkC*u`Y$ +Rl"K@[9f=[?^`fX(cIoChAkk5Sf-+O)q:MFefJU.TBXjqBY?ke5ca08kN.h'eWk:U +'tO=lVXBmVIn?Wo2_:@oN9V0eFpO<.Aa!uo%b22V*!+NIa2TQcL0bC$S.I+r,3=L! +\dM(7b:4====77pHDi"/48Bl&"Sn,TX09`mkQa3Z[GGJ&"Z^US!B&,Oc*F?aI38?OO%64/_n^U +gsU\cD,@]Y>^p//HskWZh9J20[N5u`N_$8gp>'A?rX6d*41E?+hD=VGZa\f?f3[M8 +)oUbac3"WJ+*.5gS-RG65.ol8G2tf4lAN4Rg.0>)'%?mBlE,^!g9NT^[$WFWQJ#_@ +@5=$%Q""?k/6QMHR6d,bMj]u2WT4adAqirYe^[r2'g49-s)cRT9Z0W;=Z_\Jhs6,riKl(?../Jn\98j +5tBO`(ZDF^TMFjK&/A\Qd0:="e6R,?Tc:$WJk158oZhR"mI@umh0oera3R!CW4_:m +I,-jHP$&^eZ?c9m]::sSjW4>[4e\2HU99G&g]E$1+>8P`oJF5N`gP6nfArHsoOO/q +7&(j3TS]NX>iRN08N9q@#_3;uJ73\gTmqf,i%Hbo&fLp!)OqN^3Lu'!cd<+N15`%d +-T0TJDn9ODnLO&geM%b\AM3=%=;BlulVS\nfNs@NG:=1Dd\rH?_;U'%3k7hShW:Em +^q8A>[*Hi5!saKq#Z;h-Jj(Y-p<15TafuGo<'u-Y?n#0\O^FOTjM_Ih.YkS +DdWYB0=B.L2/)s;"oaJV.6e%RlH"MSJ):W16PYbi^]O96BAO.,5cXlL/0N^SblWS[ +rj2Y:n3?i0%4LMC*T#[.qMYM)lDt)6)/'g&k"(;OTuFXJ8FD"S52AlUoEL.ShEn(M +]EAUM;;K%iBTN9,h+.Yb6C^\8XD9BD8QYEG&/sgN*,P*4DgV?Q;'8)*^ki_:VuPh- +BW+pAeC!Is.uaKb.e)>]caOZ:fo)%V;H#\VZ>?jfX_ZA`HST?4aho%r*'0UJ0tBlE +J9YBdlToSU\nt8.$[T'_5cKB##l[tNaJ8WsnH8'p!G-Y>3k>FkVkE?!HfbJJFnjX& +c0d?a[qV%1e-Q\0?9EV%4XQU%KM4[#*_,g1N$!NO#JrJQG67Xt!.b<(&R`KLO^\*R +K8P'5B1oKiU:6O'Ck!>2h&+0$!/g%L2<_:>!X1%k.TCdJeU4RU#5H(9]\n4P&hPa" +l(\&^Tp]56I1\I.oXPqK[cWuql@ZL$S6cH;80E=UnN8QColW$LE]n<"(m@SWNE;&N^E;O'ggY8*U?g0qm +1'VnhDCsS-:R\*gl]Xj3j&^%#ZduuZ/+,QakXu]j`PsNe33u#C6`.\V9UoI@SnGTj +HRqoFnd$iJLHC2Go#DXX\2ZkG&_mrLrpT6gJ+%HD2]3($j6jqIL4m(O +Fnu!FnWWu_0&ZJ!kJKA.IiUP`h-s=OL3jtY?0m/QRc:7M\4eDXWt2Ad%X//=)c&U@ +.C!!rYV%cMh*:!TN">/9jaY2#m@N2)41LJMoE3g,!kQT#g@QS]i*u-<#7S/iT:4]1 +lGX07E5jKK;NET8DkkgY>2iX7F)B_)]s?nO]'afl`O8h8g8sq\+n`JtEPDW/+Rs,O +G,\hjWgU(DR^OddZcj:FbNpqp4[1,-1eJguaI]jo?39/;`5/j,h;bfjo?)g^Fd_-( +jmi6='DL$i*cD7jDZr@XlXg^.$eiYqm)8Vb`XhEuLA.[B0,W_fGVefA$QgK^8=VnP +:$g:upD@E;lj9c+7nk)Zk"b:6VtPgCH_Tc\V!7j=fn5ML&/saZL%ZX5@#Q*[`o*o2 +@SFFB:;5f7]FiA?hBjj_FoYhK7W9K;h<3,NJZ\j;'cBq+L:)t;#aN43Pe*ag$;uqT +oNW%'F=-)B>hJF`s43m-(]+%J4$@>N30iC//nd.=D6c]L1f&\Pi/2%4IG`2FVpDdJ +f0^b/Mnd[ZF1F*(j\]"U(&t!8%q1b].E*i!aUBgZM%l>1"91ANTe)rM&B=pV5qKo= +VEk4&+HU4Q^c)T'$#ul^qYnT_rb6[EH,`_C(8OD]mT#U\-[qoM!i,`rVM":fLUYB7 +H8P.ZR^`rH_CuUB<(.YSON+aH1L!Op-IaAh;T#*]j@uZ55Ee57"*geW9`Y!SbScM2 +4f@Dd_HU4;n?-/89/*rB4M@/oTZLHdk,t_*(??>HMY,;Yb5:R;20Z+?2hCQPN$#EF +@U;L&>!$W$-8np;5VN0G&5c\T(>t-S +!'AI4b5uAPTDO3\Iol]Z*C/3^'G:EHI`trA;"PVe&A/_k@NQ][5`U#b-b++DmQA'B +K`0"D+-;N_?36uO=9+iQ_4l;'+U'"#Obp6Z"D=rh\7eC6i'03F0egQFCnT&+ZUZ/B +3-iplFQTYnJA:2qjF:FO;'O\J6F5i/m=>4n,!0e->?\%.C:6KASonW@l$K/[3FTO) +0EJps<:CbiW_>[-AloQH#l?L3L2Ol$/@JV$f*>Bad3Gf$&`'4>ma]>NDoM?aU3\Y9 +]c^l[Y:?tVRkTYH&H95j`"DVFis3tW0r/5o5s^D=O[i'gW60qGYGMbIE@1AmB-@EY +k$tFlO9L$Qftd5/:]@UqrAI^e`."%)qiIkoFp,J.'a9$.=6OgVU&,r'Pe_Z'X&HG9 +&cTBDq:g;Ma(!Scb,ru)S*u6"E!LYSYo93%>97n=s.V"]rE=a"!UpT'R.jah2sKX` +iajYi5Y6_:#r7*nC!ofA)kSos?diRndP_+)?^'*VLt4`rQ9R(dhN0)XUBbreHFJO! +.o&8._Pg6oKP4;(ilQr46flEJmFdNUi1?:o",ERu015VDKak[(+*nSYpbJLTs&@%q +a_.:Fj6_X$Sbo>=&!"%>pcUe4Bm\h9m+'5'pHear6@*!nFmk#IHP+g(M;7hAp=O#p +o*t0N)705IUSJ3E`f_chbp$^s:H3$TfPSaCCiHZ[B9e%Sben_WRRCDcN5'!AInBYC +a3^8iCkXgU3HO9FEL]m^*\Knm7l8Yh);?OsE)Z!%s7ps,f13k)]^P##h$_.a,iH%h +(1/0;I^s+)gMHfIL@$(2rd,)lD>q&J5gob6UT,V^^$2o:-Ko`FD7p[e=+jL1>/%`0 +o!7N('fTA4cKq]Jcsm1UF(7f]0!59mrVT4)o-7]2\F=A\65pDa%i>/^+JR%9r\6&' +fo`cVF3^Sh=RKIo3S(Fs;RKn:Z/O9HIH&84mrc2,KltF*M=VIMqt1Em"1.]' +'0GQ;I@YOA'0G!SD8F/NBPL=*Z^W]Xf>CS/C/LDGTjS5P+>HC[BFkf;*72b#R1l5V +`]/@.IJ2_CG7#nZ`P5UW'#[6.Ig8N^7$[@_"Zt'bL6^7P1dcjA8NIV2mR,J5f@eM4 +UM!bWHlCaflQ3R$?+%sq0G2q%o.,l@lAUE5Cbo:doC)I?4nc'p$Yt!EDg2gngN"X= +e]RRD1UIol^*30[ncL5Baa!_.]s@sFG\FI$Qa7\G67ADj(l(m8eU +?"$0:ZKL'6aR))eh06/Epgi],i;N>IkGWf0r#f_l7iV[o5ScVU<)G!,&/0(r\,!@W +_?JlD#5B*Z=@F*8b;sL.rAa5dHHWcQE +W6UgYj@r@6GBB00hlfcWra39&K>8PU^6*]SR?"S'-4\&qlcmr1Alq6#?%?BefYYX +!;-Nl1D.F\+,fY2?3][)"cIJq`&]W0DA`;*9Fm*^8Shorm1FF"pQ(W%^l]PZ])b*a2B%t +aaZ4tJ]G57#d':Y/nq;VWEChk3VFc`a0$`YLIB`p"ar/WY_G'3+V"M52fsg=aE=F_ +`:lXC&(cf.*dA&:J!:P`%k-s2MT@D]<4=X\q*oYa"koo,/muNjE6"^*!)3( +?,$XKg*r>c!retk;TrfpAag_FI:q2V7m2Z+=3r*GBWY_=6e^8W9Q]\bk[Un$Mu5g2 +QJPH9?Gm:_9n%8;419d5D4Z$YmJh8enC^Q%qbB].B&Ia?^5O'.&3ouI0`I4=T"$Om=Zg>[1M`49A&);(&M9J_bSXlN)Q*1p19Tr6Xi/oB +i&iWZKO$M]5Bdl;qPJ?UNQF#$N5OTuoaCopc,*2WK5nD?4^=?q0$_BZ#)A\lMH/72 +GLH+i[LedYa)?7_g*jJmdNe5L>CX.o^J]T/IGOXI)^2:pRCAa,[G'Z<3>VXCM=GN] +]`3&5Z(0cn_$0T/IdhiZVu<)Qn:.g'DVJCO4*"rg8i1:M19-s)F@7s%_!K[2l,JF# +*Pls`7Ve?K#@>OOe:mY5(NNb_uV[FJ15Em]0^SM=`LN3i`6R*!;taE]qKJY +[,uU!l>dbbbkAOJg2OfcJUQ(^8`JF/i-Z$*p17Sg@9_H(RaZ&B2/HSYBiDb,Edkph +P2[=o^K'9=EQ.[EBNp_.U5j,9SgNNZIV%p3D`N9^QdG0k")54$7$VLSB&" +PIA#cOD\`7a9X&Ec?8.rZpd5gIp4A]#nk:7C"h:Eo +K_TI*$3F.6)?qul!n\iN/E='QUU+4#1BPHMhu`.4U%p&13]lI5pWWN+"ckgh]6rna +rN@f,5MV'.=3#L%Y7^F8NTleK%W92q.7dt$.C!(-"CPS.)Za@_TOEj/=ecq;M%/=C +>dtp>cR:b_)U?t^B10q8:^X+biYbJAU,Hq(.rT;QDg&"V]=7R`KBheBc0WUiaB+fZ +&H(F%A0MCp@KHM426]r?:F!EXJT//^J%k>h`6?OYSg^"%LfQbI#=SiB:bF]PX +F#NM97/d2dJ3^0.@&r3^bOBJO.(g;a5Fu6lr27s`==bg@hZ:^r@`Pi4pP^YabT++O +/>&7#q!O)uL"'c$]E'm&E/QTP/,1(hk$r$f@f4jAQ?lCi+;1JjK37Fe'tsqJ%k\uc +GeP'I#?&V9J.$lhJAf*74=O\< +hXR +k.Zup4qm,9`D1ljeI@DUeXk6WJRhX'aA?;/0X]]6fRUq'ebaB9nfbFs" +nSdCg>&hU;Ch%d^q7ZLD,;,B_m]#$.`"YQh3Xusa_aPI,LZ38@4_'5/!Q3-C@\cfI +a&Vq;":H(&ArZ2^a!%A5ArVEf +B^$`[g9=a.bRPa'fOU%O#;""HrP3o)Q=BKMV7?5eaG3^QpH_II7uR0>F-1[_#_iF7 +pRZ,Gl;McE[A;Jbc\20l@O^B);4CAg +I<_;AZS%c7--j[.isOAAMD_3gNN**p^jg4`dUq'n2LSVi1-M5bet(\"r4gt0]$NdV +fM'$17(^j^\:1#um6'E$!t02gO)k]L3sCDo"btb+#9Q)L@,W28M8;D%bT\UTngFH/'O0K[SaFAS3sgTN.EV9$ +kq8Bl?rMXUE#;P&%F9b1+2Gdcs]8T=g0!*h(LFiXI1T.K&"&Q?X +RKpN$?Np#8eHO^"$^A5!?O>]iRiEm:J!':(lLq"J>dF1%F:40?@#((5aU^N6aa^f, +j'O;1^a\3JYB-PDEn5`as-.6&cXKHHej1!e-2Vb5_<63qF:J]XZ,e#9N,Q\(h^`l3 +b.%CS^@Q,kqH`COgZ2qmf2VRX`)Y;$PW!SR(uL/gfEq".N#Xqg+*\[[#NXL,IC^0G +E>[C//q3-hH0Qo&&Wr]spl2`SKsL3)0T5]J5Q)pLoL8!%@;u7id)"Oc!(BTG#j_(TrT0mU\iD8JJbgg9VP0.'-6L5Riq +*5RbW3"F4X$$S41c_eLr-LHV/1/:%?LD/Zd=XLXP@pFYq_g)dY+i1FuoPsmaV>1)I +aEl6+.($sQ,s$Wq"rcYDj#.5gG:ss5o#1-LbV?h;U##7FGj9#;V',GtK"M]!Lp<_^ +A]qHk,N:Seg_Hm,OsPS=]-3NM:0h&1X'E%oVt%:&jk$O&^9lkS./16Ep:1MGT_,rFo=h6o +]t**M?#fd#+FVr7b.QKJAZsZRO3;UIocobK]gfP"k!bKb(%[IKPfKuANdS8OoMB\i +(-K5CpdFHJ7"4,ZR^G6K89)'I<lNg>8Oe2*I;eVs2o"?lZD3iam^64Vjf_BSq#g*ID`2N +JjX.H"[CV#S7=t21T.,)&4F+N+8F/@$AZ]0?ks(.RmmZ7U-LiI#S(#S%f7EuE0a'4 +h(T,Q1(%J/q*Q?fBG/D<59nYg8CnBt1QEq@9;o=.>]r]Ojd"]j;:b,]%\7eTIRb%L +<0>P&4$F'I&SsjZUPT/kY`^gEOqU>C[&G).Y`.)D9^5hkN%ArqfD$#"_76!k,\QhM +35]e)W16)K(,(8IYe_4s8AE]C?[og;ZaH4Ogd8Nt7(V)C]iIq>MK\dC0%Da12:-pS +5^qOL!,>.iq'Z)kr(T%0o'>5k<0#I5(6?;HYp@&_-n^kLOj3F;A@\Nm>Z0h3a])mb +eO`;Tifd3r*`bDEM%Sc9`nM.NCdGl4\3N+uIsccpr)pWR$Etn23)UrjBecbAJfBaX +_8!IHj.4Ee8`f`DEICc187J0OOQW%QoapUT\/[F;c]cUB(-lH@+q('T&1Po0"F#6` +9/tcO38>i'`6(hBGs4$_4Ze-Kjj!q6I=jDMj\A>PW%Wpb2Mdg0`cW^CHJor=)Y$KB +eZ"LRY))G/L:;(h4Hi3V9(AGkdEe*J]pjZU8<%iX@p>1+X:Rok*_&6*=]=8F\c^i& +Y_l9(JRB(?s.d56(\"3%]@kWaffqO.6%o7BFnh*5.oq,%fE;5j1!%64j8YH$c*rR) +d+<:ig]u-"7\I^KnjbJu]'0*>M&)R!qHBm"I0TZerTGI8hs4k9g5?B]91V5:cnR9E +,CRYdpmSGGdErC!.T5ad%i0`@"co8u!?Jg]Hp:VDT+h[^a[$g`9Z2Z+%L +nNL^ID8b)MOJ*K,K:i_eK5VqfM0urWU@og3*@EL<=d4K.O]6)FLGLABdfTQ7; +(L(Ql/-T[MN3gaHfbWN$b&LaS$r8e?]UFk*-YKcB'c)g,aB3;V\%f +l7qAl)=sHZaH(;F:\5E([es?o4q/G`%2-;E$MR#Tk689F7>4qR,Q\p& +(M"RgjIXuMU9I.geE8.]o?q,-f8naPpt]'C\[pdC&VP0*Mpd'7"9(.HH'9rc(8.PuD__P?R['#,98W%.HM7o!pcp[MPL(kBAObNpoP +\)CPQH5*.r82oIP%;c*:>YjPd/O_gm&&1%DHtsqi)PdA^@CO6DDi=g)mJ"BBIC?[J +T]LGqbFR[)%1^M!k0,Ye/2/1(%p*&t+3?;F#P'727tIn2Quj!-i@La#XspXYbRnqI +`Q/3B`dqC4!.dFd5gMYd0-E\J.*"<[e1.W@J^WhFHIFb;O\b4L5k?3!mTOG]7a*Z" +CmR1(23ChVp7P=$pd&V!^GLCQ,67keThYBnN'=[<*Eo6L02R!skrhZ4J<\ca@Z>'2 +;bGo:Jhncac,ePdC>S;FnVtiBWZ+st$]XeE(@m/kC23nTpto7N^/@b?:lg.a;GXr% +#GPJ)A&8u1EfU&Rlu/mlfP`=!CFhba^76j6D(LW_-pZr[f&t$5$bZ'*SiL'M/@K=T +b;kRHPX9F`U,aTa*A@k/-TEmA*,0X&8u*IF/0MkC:%\X@*"r2:IjiZp']MN?FJ6ad +Z&.mrRO@ShQ/_u-#Gq%i;Ybd@!hX#;[tsK!jEW$A4nsDK0&Ma&GRFSpRR4>Jr"h>4Kl1@A +,+)k`RU]*ICJL0s?D2R_WI%XZhouSp5Z6E#Vdl8\U#8U\cj"'_&NO?'6:1U:`chOJ +-)#2A+`492O-]_dX9:]?M!P+?=HDlTNUDlToOu>k=Da+b2R^SlfORaUBqqUsOD#5A +m"=RQKa[Bj?a,>i7]3A]BpKb'X";ANN)`+t?m!7+!'AOHi;YQ.$@5pPpfOEh:o=%l +^'TmV(`oK"5l.HJ"n5#6+A`kfq9N^rb6oG[s&Pr8c@YjuWW@MOCWK#Z,MqV,I\%[W +djEcV:l%=+>M7RL'g$oEg]bO75NU#EVP+&j#l?i`TfN/)nABLZ!FbO6 +H0,hB2>2;14+X=O3rsU+6"M4XlFP%\"[k@@D;iD +$V,*Si>[g\f,L6^4`[8,GOi%gn-rXDI9a]8rTL9d_,WJX4If!W^4*Ma!>gM9ic%ke +1!:-[OVDmperbO$-K4U'oIMcj%+:,T!ZWg5LHBG@2._r`ANAHqAPJX."8mq6'1Yd9_^Cs+?=!/:?1kq=jO#_k=4:q_#b&!#=`S@V +S\2WVgpS6Q^)PM*+4dh=d^^CjCb)_1pob$<;[0\0,Y +FIP4p`>utHKY>=o_ka76d3Q:0"sFg`ZMLt.,bR:+)lq)o+F'lZoPMt\2e`@$6J"\3 +]/95\,l5Vl`1poAUF#i5KuaKTiO:Q@O+gholX8WcY^knfc0bN'G>FI4\>0oX;ZZk_ +I\'sb=9.?nE>XLML;YkWjdLj1FeRGl*2?=o]W6A``b8X[="K"?MiC&K7_sJI^dQ(* +TqQt!Tmqqk:o8MOW?nCXP$2eK]B5R8FfKUI(_VC(P,O0,kbf@sTP(Qt/k(0&/7EK\ +^4._P!*_D;+:bN9#+(.-#kVr[#EVC&LU>8S202g??;U/-'S9IVihSVLEhKMmBmIPf +)Lb<]XgskNgkb[n,5BcP+NSK#UGUMbS*L?Y[c\Xt67o+G();"%76XG2#seKEdTFll +U?MG?@"*3G*ZhOmT+cW*/#kK@?RYOr8G(+BGi\GNEk&9?*+s5AA;5.\ +6q=H]7]Z\Dg5_'"-&">l6QHFu8Amb`63+S0K,lCL/p+`F45PT_7]$)5Cu:lS#GiaC +Jl35pP6>2`M&rBZO2OG1&5N9Ai5Xce0fUfD!`Xnq!l[$Wj;a`K&/f7&&Tooe*6n;4 +7p:U:=^[AA>f'>Dr^deC.`7RtZDT#&o0i#g,**/;F&';6?D^Y=N^ljjA]M)JIc@l;]@u#><_PVX`)1,aNOT0HS +$sU;k=/("FU;3XSYj!9\5K<`lQ!4gtlf*D=(SqN_GQ;aeFA0@8r3&nAZHr>e&A\<5 +hSuGp3F"c_-m/om?G?*1G((l+*s(N!M'1V/_/T@?Z12"V[M<;s+("OT%TqqFJ3sN% +if$`%-TP)nrEGk(rJi>lVBdKHc\ +0T.m[;kM2'he5Yb3WQ;`V?#5WEKacST[0Ej?TF&Ebgl]fE9gHfgABCMhf9H]b>E`M +c>9)c^ZO%U@9^3iZs%'I-+C(Dg/LToMSKVNCh`s//'aD)(+HpDS5Cg,MG)']:#Z#t +6CDWNZ;&Vt;<"CVE6NjiCQdIi+a@VD5CR<:]>UrO>UtKH;rGYa&&EmGIeHH]g1&iD> +!jk`E_^9tYLa+;O+HE,!S33_sp$3t)LUT;(O9f7es1'tIuqIu5KtT=dhn]i&mK6>CUOo5G0T84<](q;@5doG +Eqo$en9`=jO&kc;bP5_.pl:WlY'#-DE`i3ZA;;G5B.Y0q*=86u')M_/9)>oZ1:^!t +Q#K2<_L^7ucF*<V8PXnuTb_U9# +,e+6'?:bPIN;r-iT+$9(-sc&'0(_jQH6nJ7*o\FUU!O7e(V92Nh7s*E>Z\-0)U!t. +GE&L[`=VEHibe4jee%FCi%62Ck#$A]kZA4Kr8S)a7'\\(D?KB@E?46e>CjjIHSLF[lqS&WL+1U6gjXgVL3YtY,17/=Pj"\&K9cu`*`)ABpdpY*kb!C)[W59o\ +G6V3]'^[5BOhB[,]MD^ZS%&U^7k9"XKicJYcth51#NcZ_"`\9)B&kghq@dB'1NOH+ +NO+AX?O)#AY'o<2!rq.3(Z/.,h@O=,6P_qUqoW1>K`g"Z"EFXH0.7[X>N3kRo%Zb# +!keE$^%V3]NIPQ>s&ll)H]I)Y]&`U5q-S/Q?Ni7Vdl5mKRj>H*'__2l]3:Ku3T0qk +dB[>i&rCb=e@n[e?aFEE1hN%1@4>N+.Tio*?F2=l[]Y_EQS"S;cC'L?/2NSce!@(- +-BG$"\Yh%VkOlE+DAu&/1T(YMZU`6lh<&^gSW4^:(ge26rF(]=[AulBHMNatMBIiT:6$V!fB]jQ[1Mu>3D0RGtIl"ZK1N!1Di$Eg:%;Q`^O:H*l +ar3RuM(mZjrE;O[.\Tp2*n\m-#hTg8@f(b$Ki8QACY=>TB"rrG/LPaZ&3JJWSk05/ +$JcVOQ3m(u^R?sWjUIq?=;-It8Y`nc1GA?dhA!*+/mN[a\%%tmUDAok&kD#Q!@b?V +c5_pDHIfn?O<&G[f>6U1fTf*"G=K@P0Lkl9Hu?QUC0a..SZloeq2Z% +R@V'',QKH5o&tZ;F49\6:i&f9uA3uoQ4Le#MPHcJ]XRRV! +ciU+X3ViJKf&QT(>B<68&$&THed*n#@lBmU2qBdRCM;o3Q^WTIlF;R`6 +-ecNOCh",pU>q9nA$)J7bctlS\-*0@kpVC7PYS]"ZgE$#-^Mh#8`Z;-qED_>pPKeg#%J%@u1?7#@7Ri;QaFDr34GHcYa`;4SM[gF]We$>FI9cDd6:*&=sJH`[e;HE +a/UbbrfsX5s3FT8p\Cbr#L3/_a8kcQ8qHo_cP>.EV-##k)LngEr_g95K0^%>u(Z0;"hQdo'1ZmOjB3nN6?]f!:"b%-,6&>=< +l1`,UT3'r8_#HQ=knRe'20fZ70(>F(jopJIUOgV@P`T!i0r]4,,0B3DT\Zsqjb1ZO(A1GI=Fso420%?dWE?cN`BfGa=/Yu2A9Uk]p$'?rt-Yc%Pd`cO!*no?pdPK4h +3S*Hj?H+"tB,K-68&(rVHB^$A(G.T\c.`*BR!I85 +M0R*>e76^=_^2\U&UR2SrFUX9ldU(GMX?W%Q/4GF:+a82\168dCV?oh*kS-8]Y*4N +,58[I4P$MpIT:j0FlPljiq2o7cusq(>^%AQ<.U)gcJF`i4AZ/E>X*XL_5DFoY--Z^ +CX$5950.$`adh*ZRF-hg +[Z[Ogr6Yu)^cJl9NSM'>H+lc5!8t$mT;,)2fdC;%Y#Dr58KApu$S5[0m.O96[@s8E +h>l&%]#4RG4hpQ.7rFUr+i>ipbq)?I!o[Mf5P^@s@h=TUWuoPE$/h6T?u5!kRXf5d +cn,TW^]JU1&;n!u&'Z=&JQ(dDab?N08*(RV(E18Z)\X0m\^t-8mWmr;S>[84^G6aL +B,Z8H-MeblQK'#;7m0u^Ha4LF^(BmPM:O0h%BlT;X_&"pkO^=e\'5`HSLD1u='F-S +??3B<&&J:"H?rL1UT'!q>Y/][LJU5'Ht>ugAO9*Ol!,Z77sfVh6#:Ce6>[bt5Ir0X +&(jCpN2TD\.o-U':Cbo(*1.8:84"dBKpAM2Pbr\X8s6m'$OW'Po7X:)!al&n*7kn% +9+oKPW2gH\9b04jcaTAG>.!%hQ7$;!a=3jG>F=K+SLS[)&p\#a3+lgUk2b/2jLQ*Bq3I>=Wlkpc +T>VQjQVL',>Tr`WYX]s4J.J<[^r*FI#tURR#/oa.SGAqmCp],]LZ>Jid\%g'B&n3,3\2l +2][QPGd3)G(nalZ;DlJomkm0Dq*1-[^^*3p'!>UXD[L';-GYgP.a]8UK\pNfJ$7`- +[;m5-&,N&9#7X;5?if/-XW`.p&JSnBk:#2bTbASH@n-1i>M^"2q60"gYGfo'.9!Ea +1I,u:kIit$mk+uI.cqg8dPFr +;5j:lJ`\J0;K_-qWq6$DRi3.Is#*F+!fIiUF-^B1Fu9Wi(8XZfh"f`q7Gat/nsi^_ +`!N/RGdh5:[X,ijDUkn+hDAlb+CiZr87c/)YeMs\PcH*1DUM1M=@^T*@P%`2k=uUj +Ng$A'U8LdWCiR!8(/)P@Q3bpFN@[tHL4qVao=/:sEG+^t!]pj$qofnJL5\kjb+Lq4 +a>!UZ^4/2hSu$AI_c]s.H&Yt)ce7D3fbVc$C,IUq>OIhS$WED`._A?&?uAtC_fQ82p7ghjuTJg5CTd(<$) +I:e(N]/5@;Zbl$cp=Kh6mkkgN]G!gQ7 +Q6tOPgAdj)Uhr&rCHLOd3j`01ga3PZ]G8tj#_'/AGAZ.2r.nYG\G`raNu#^6S#S:= +JcFXE]D1RdZ$d2?mu`>*r]>eLc+#rR8&,.BCl^=Q"4/2/;Lj451ccsc(AUWArHq8i +pL]=A$ned')$^u1&P[,#Vfu'O&(29f&goQ<+ZZqHc/B5G,k:7E)IZa9=IY/5QB;RX[X$V7^^61[3N +OZKplNa]e:gY?p)TX=_AJ0sU7$r^Jbec*>9nEs_LcmTMK-HrnX`g2ql.`0JFc-:QNk>\bXC>p +N.-FTS;_eY:[Xb85F]oG2I6/eWp8/;e]"6)qX3qF-Y9it9>oH*7$hX+/[a)_F-MD/ +>%8G`WJ&u1*8aSIY:[^pQ6]EFOK.mbC3!cuF2D[t6S#JeW\^EM1*S6t,:_-Y605(S +A`Ada;34NrAO95W%jcs_W\TW:B)#E&qin"(Q_f!CVg&r64UOTK3IKEu^>&Zs!PAO? +HFtIS%Ma\,D'EYU%eM/^&1bbSPMjG.]*i8kg9`jg6R3d9L +/V2OqXtR*3!:2qIqQnaMQfce/GRI7:k\gC1)[i51#S3U,]ERM\7gRp8(]WFnQ`BF+ +eQ\ZH2S[gZs&-<2@t=U2.dcC+2.cmY&p"2s%XtH?pjR)sSqP/")ScN*WS.OapoS#k +0Am#1g/!""G?MLlT3N6\XF1ZF6mPkq@*\1<-=0NH?]ZYmdUmWqrp3k[m!Hb3B+CXp +>X*6E^'[oT,tZIl?iJL*,jG&&q%p:M3u@Hdiq`m4EXI%.9a$#_5VBj9]OrjL"b;"@ +&1.pE;ii."-C042JH!VdrhEla?cDnlcenR^;u'([qHL,^DZuU0>,_8:RF7V9^#jEC +maNAgY#SYte(E9OmE_t<hOI`"e@&9:>c2Og3:0SOSrgE$.r)C"Se%Jcj683Uj+K-[*^o$U-AaN*U6VKF:CNug +E/jqu7%A81M=.E +:/1%lNJm5$$a.J7hDK(d'sk?&F#J^[G/a(H`F&^VO$F[X8n +>ji_JBV.Bgd6;6%0X-P^M]%3CJ"JcJ5TemW&+-\m[qUJ`KPo`JH6.h,-\ro,%4?oqe]E#fn +j9"+c'n9=;*8O5YgeF8"bZ]=V0*1VGs5+P`h\8ZnF&qui(O%YNG1,Q_`KOKaR"@E0 +_q64%TN1!XfpMZs;)bC^DNEapgcSS=@DaNJ-\DSuRDbt,`h@Pe +(3kC!eB]]H.*1"7olCR/WCB/rRW1$;DA#8p$,Tq4B*=nm/E97uYM2-N(&I0pbCIrHL(#F,[Bff2K'lna_ip'e@_mT9B2/;"g +YB)\rDHB+s>C"o^R]H`oM0CJ[\&p_5jkQ./??;+1^4oTg9rtH>Sh$Sc(K)4C8bIB( +Es6!;Kb5X,YpJ)Anr3@d[&C"sTZXWlZ;c;Vr05P@EA4=J.2]9rPSd4F#V>*_PmDu( +pn=Os+0*FH?Cc5?.ano5!%ad"m=tl+-+`7cH=ZU%;d$9F%+cc)Mid9,(;M1T1D64F +EK3`KOYI8,&i870*UCio\-j]+)#r'qhAH96P)b.prh->,hlKfGN&7_[S^Ps"JH%'t +8BJt[BJ)gUn\6lNm6kMHOQjQ1CFnTq;f*-H.99F5&,:3kp(7.[P$F06O(O=+JH+:? +:0Djc\bXMSq*$+Da3'=$?d9t)Zgt#g0$3,Aaf+qW:L#&;bN!r6jFIb,0DteqjM!Kd +rsE7$/jMMe<2+(\!jDd//h_I3[.#tbjWJsRi;Yi.EKIT5Qa-6.#L24;2*#%FW2)4F +#,k$dR*f*Q,+&GOIr+6P2&BDm':R$?rDp<.0`P1c"8p43^.e4. +7/"/`o;PUs=+ED@s-MGF&7c#"ra*).mG.,BSRoU[?`SD/MgttYJZkIhH^2$eR(VoH +;t<+VqBf_>FZMR9I[)IruG\=4a$`[F86X/qQE4' +#iH4/n2YLMHa<:q<8"J>EmSHL^K?@u+A)E4JEHmH$`(OojM*(bhK)^^$fE@B$:o*& +Mso:6Qe!2BVp)FO%7Sas\LYtU.o,b1p8Cug +b-P7+6LL3^_.,Ct8DZ%M36kB]E7\<(,Td\nI-jCi"p0n7;+Hc%`T14h9O +M[3saM)23]Z^\;GPrKO/?-;8P[ICM:4Dt4`pQ+4hpUn-"FA_!r[H:XBo=H.8\h8!7 +-?6T'i`-!p0^D[l@pcJ";RYX_4Dg@mlrZ/U;h3GNc-f'ud^tKaD0j^pVT_4ScF@Et +BZ[M_F8YV.fpb(DYGo2f640B-^U36H6g];#m;kdE!]AbsqqP,@GbR7r5^N@Z.c^Y^ +:EZ7dNp-T>"4_VTq_mu8b4*H?d)TALO0q8t2bm\Epg%-H^E>[_?0-Q3&bo0DnlUNo +^)>O\2E<,VA)t[h!4.2-ih2T##U0/?@-RoFEfW,QNpTk8G0!#)'Of>G;gW2)mtc]Q +XPo+Pq%INBKEaal_;qJ$&mf<4,EN;3klY$\#6gqC'oN\ci/6(kL`Kk+$>,?hd4M-2 +TMNNE<,mZ#r%U_g2FWh!8M`H-ZeK28JGoGJ---I#jK?5>?%/3JFHAMtP<,g?6;%Mj +!E*+i)S'XKd#%:B+o]ku_S]AWq_I9T5f1K5*pMe;lo\3UL2h%,,sc>gNU\)*s'$TR +i0d$t8q>h<5rB.I)Me5>E.L9Y!2a`Ib;>;r(mR@i>IO +(B=h61^aqb#,RcDVATVO)i#5s7Md#a<>ZD8/=8$?JnlEQGJ22scEp>:4J%LY3m)`p +T6'C6H.C0.Uhf/X=6nnMSVq8H8%MeiYH)9e<:an*ii4M=X%MEQ$]4%e8bLaCkHZ>4 +E^EB>6OL-g"_mMGag'sLi>(@YV;frMaeo1:`CWA7_Ebn#V?23350q!"(Jrt+PaCBnPNn?q +m[KL0S!!,knNS8S)[(eX<0*hS=$a,*=(KY>];('fL''-%7'WF^NWSeiFA,_/L)$1h +c0*e,-JFAGNaf9"37TfJeMTGE2F#Zf+Od;^rbiqL;/EeC*"tT$@T`JX5S+D-U +>Q0_oN4Q^!8jB1Ehks#LL7c6D.0#a>q'/u6H_0N3>ik-*aa*sF#Urle.F_nVClu!`>,1T!U-=$AkL9Tn +hefS1\bd+q8#seug=EO@]-e\;T6R_cr3>tFIJ*+lEh=;.j0uKbT'jVkC_BV8Umg'H +&\A8)Ta?4[);Yj)EFDdX,"C#gn_8aPrhki]>S/*LbUj8-`[i0&Ss-K@(uT +pWC!oEaJbQo=9P-[DqFe@.bso6XU6_U+(1$6)rpMRf#OaoKsNXg[7nJ\s'M4S[PIh +)3Y>t0/+Hm;'*t\Sh@'La>(,Q+-GY.`DVb\pr-7jI6/iHZf&.=+:j\q)lQ_:ck\a[ZE=NeZU9%F+`1 +3:fZh.-$eYoP`)kJ*PYba^=ljI-L7--ogLYHJCaH6ia+Fj8Rd(_FW=*&_%*)'>\4m +:so[BagoHD.7Za>a26LWU:@e>"o@beone[J3NY3p4"_7l4mO0/?6#\FHWYI&\WV9H +0)^07_V(rBo9Ccfb*($a7@c%5KU^]J2;k1I"JYQ/.F2)3C.&8Oao0aY7X..*s3iqcUr7hdP[RE-3YW^R +4dKVPb4*mFd^cbqRs4C3[2O!Z@bbh+S^fZpuC_R8cnq.tX +"b?hb7s*-*c[mb@Cq!=AZ<[7#9_,JUL99WHr5YE/U8VFO8crHbkgLa%LGClOs*^m- +'mN4\H4'S%[tSQ+(4,hi:PHOcr(R=?BgN8;8X)%T:RsL>>rYBChbTh*9L8gU5>-]d +^5*P;E_rccQ+Q`:DrVj*paoG>R_B)Qs,JDDoTqm)n/pR!HCD5In+fV-nct0hq#?p< +IS1D#rY&>Ic.N03V4_;VH\UaN6H.j*1k2^]r_&+7k>M-5.TCBY@tEhkT'2Lbkq>`h +/)6r[<4C5Z8SiNP@Wl'mg7U,aY6NXJ^=*\i4ue\pVr9E8$PiBMgTt +=>XSc18`(ppttrmZ0qsI82km#T/C1Z]O4dHBn':Gfrjl3&3D_B?9m).KQ^G5%TI%$nNO48u +\-FP3g*abbGLn(Nf0VQ#,.j0d](hCn9@;Rrnb4uk*fBH>1@hAs49GGQO1V`cE,R&! +G<*2=IU#@6&>mdhDl>!umN?]cZqFQUVX_-`b6J3OqZV@)@nKE9'P-iSUd&$XHT7XF +G;?=:/@N70qfKMS?AUius$Rk"BGg,)#[KYG=#W,%6r;HS!-K\Y2ZcB2&kk8#%`0:q +_%)'*c[8[+5*bo.0.>dpn"_2BhuZKj:16aV(5P$nKKBd)dg\u8!VZU;DumiG+CkL# +_C3IAW5leia!-nk,$Ds]8ot_^%5Z9IOtIU6>dNFsqH!6$?0^D!h(#:-X285F_)59Q +cBYHJ'2;:@+;;pCF.,[-BF +/@+9Za`42M7#EpYf<^Y,E`*nJE/n&qkE)5pA4KD'*Kl`gOT/Gl8*6EHr!+mJU*UqO +S6RRbQ8pu9JBe4`Uo#'.U_mP0#P)M>(^'R?GS:_;%"gcu@[WQq7:B:QB\"/X'p!dK +0]/U\j&!U60.uoG/TY\Y$>_#d&#<7MinDs=#I*/old66pU3bcJLk#&2/fU#Tij?b3 +N%$bq#-%Y0(3Of\AQQ7^gGhn9fp7:lXdd9g\-KB +h86W!?mgH?$W)=bXT\_)1!YCol@Z=>O)f]OqJEA2_s*`dp"Ss#2"2gbSG1&2ohQm4 +;%Ih,%"$-I/Nodf_R0"'/2WW.QaF+q>1psfkC\/QMQiC[EEfj^%:$_#HL-n($"""b=82U"gQ;uaS@X4 +GnBsfou]0Dcgjfq(C]Te]+WlA_#G.El6X-l23[<"o6M,MXW)u&(Y5^+/DAYbR?8g: +8>;bdBlJnQW_a;F'*iNC*SGfZp53@O15>a^HKGD,b*2u=pqL6>3ibam3K>%B)E7Y< +ifY?o;4mZ@s*_pc.R&(!rQHB[k@j*m7\^ac7D#j"gH(bA3JH-Hi4m:rL;NK#Na&F8 +Tln\d_#PV\^G2n>-0a%!FIO.VW6dh?NYQI== +&(nh#N\-*]&>8![Wn[O9HniW).uM6!;D3fRYMt +F9ab0O8?C]!UW4WRXbl<]@X]b5Mo$3;Sa84"MDk:KRudZl+/7"OnH5M%Aa3mghoG +hf:6J1+!b$-LhN(3e;R.e0HedP7[(Jl6`De+>t)FT\Z.50)di7LlQ;7 +".*iM-tkG*Z\dd5!N,4?_L/LGK.2 +j,>eBNA1,@nKqe@=Z4qa48U9Ks1CH%.b-;8Bu+?6E`r)>q)1Z(X3q')dR(F+'!IH2 +[kgIe/[U0S9'JJ2eoFNHO>%*j7?Tcb`W7Fs_2U9_'K$%d)?L9XV2d(q1J5M8\:?DW +$?H4ZjD)mHp@8daGGtFFg+p,(#M[[ZD=tsCr1JK;`?2S]+7_aG5M15SaT>BI!92sD6;r+NTPYKk!PF1qf:527C'BB +i@Fd$%TFNd_#[35a&iRb3i!-+oC%k1_B1X/'ABfH +>1Ggd`Jp9uY.ClLV^ds_m[=#ltGhoe6??r,cm<(n]Z;]Sr(MnY"frQ69 +g*gaZ&3'T2ntL$YM@je'-jBC\Ee6>k**<0:#OQRW`b2kO3r24pXrDMk+$_Y.%7O!;mAq;1q.:e;H]^YC!]pH/7$SodBn1X2FgX +JE/.h!,Y0aYV^5_(i`n&eK^!$W/,mJ$h%BkDHh4r.Ib&'$+Qml!-`Z5$[W-pTSsi, +>(as1LQs#;[^U'Eb; +VFVS&UlD<.a&+(SbV=&;3UsA=oN4L$=j')+Hmtn)0sl!c\8Z>KrrM/^o50[q?8?P`-FrsqNrPU$1L8'l;XYQ,5Z6/3'epnO`"Nqk%D%nJep +R%t[cX;@D$(CYHe77"qM:m-81`A!<`R`mS.'j>2`gSU4gA5l\Ec<+#k>;PP>k2$Fo +)eV(bV,t'E\//<$FnE%UAkF@*\Kii*0IO.s]?ULm+/1rl*e9lDp\A1UB)33PqKuK0 +Ja4\3ir>Y0s5t#fTu[=XV@["JXe+^5=[3]0m0G2dZRa>//',0ZP&8kT)b,Qn*mTq; +C6b,p8P-A39g[*VZBNOSOtF"=XE2fdX+*aQ4Y>-F5lgo=F,77E]_4/_d?9c+aj.;+ +jk6l:[S47Q'%7nYm_GLK"95@2[ZkUo*3plIA4[o2B4dS5o0HRT)Zfb+"B.)',`?3% +PBAW.a"01D,fY&79)6qQb'n,([U7c +D.g%eaNGL=OsX\tOLT=e?Tq"bfL_Ie:RHEn]_Et1s#P9?o(`[11?^`@DcrQ[rTBEQkELu#*8+\V\%h)T +^Z-emaB-#a#[cb3^aHq\r4pt]Ke!9#s&$3$HenZSOS0V's*=FZ05(%Y;SNYVn=O?c +r*H(GS%Gs>4!Y-BWt+KYH$@Fp3g;8a^jiW.'rf.uU&"LqKA'=hdp"^HKm&eOG*`A5 +N=1IuZcC7%:QtkW=&5Do19LZQYF2"O/TE>eY+!p.ra.UdgTkKXO%8Ri,P^#!'j*@i +R?S*t',I-Zq"@[N0gkN_s292b%T(N.,m^a3Y +c)#%GAEe9q-+/7$X9j%*VL6[rGhSs,`jC';m/3ejrdul0HG7TE3(b9D^Qi6Tr5ks5 +Vi(nC>MHl_gV2KAQaR?m-K+o]e^Y,@)f#+Bi4h&2JNU#8'0E.L*`.R_JfP+[g;*sN +IlQA47m#-&mG!DGo*K*k(8Q%`d`?=K\2<4(W_`MLBC!-)LFDY`1o*VWg8g%n=2pn> +5`1q;=j![&DEni8XU#P/j\_(LOaY#ppa@TF5s:peT%2oG.>_!?UqtUFT$=M:K$\i` ++a;m7'[s*R)HGMj=Z@G'C66'6+GdnT9B.fus2RjK\!6Tlg +O;?%AQ=INcdiOB<_rBIV28\96Y'1A?hEIKNHQqGB6rMW19(sO4HR8:?>"5]On5u&4 ++j-=>PGcrqBf1$FLTuZDl>]jJ=F=iNp_pm@EC*=!7p35KZ,@cmcnL`])b8A:U?Y83 +)+`T.WCI'+"VSTD9DHXGpl?j>Y"):, ++7i8f*WSfe>!O_t6SFC/(dg#L@%9o!S]'WZV\_E+arJJ;[Q2l]e7oq;SIM^;RFrHb +4&aqka(r?0i&9ZT.ruA^E[#a2@7@_h"^+,6/h)<@o]Hi^jl?;!RD,'@)*XGY1OOK4 +^4kg#8H7!8Nu%6RnGb('%?"%EAcT!=U?W"=VQ<.*/jC-eYcof$$f< +#0mSK$Ve%%CAYtId]@KC$ +F;l"5QHcdHZ(Mj4$a9^@@-6.iF)CNSXKon_,iVAsh@tVYI'g/N6nnTVr(V7=bpYS" +.26iR5E08DB:Ao$\K"Zlc`t"4\t[-WZIljl`4N+pUSciI$Z.\l=64*qs)k19V;H%Bo"8RQJmP\bYOf_`r<)3%/kt*ENO](@+7=>o+RQB!OHr2E`8t8+ +s+%cY,"M,X>OW'9!rP8R6-jg`iqREulec=_?Yeiu!r8Hun-1sRHg<7Nn.SlT +XnG--s2VYtJ"2#ZpPViIG2^QHNJG9>5Q'R.iNJO$Dt@$(&k=ffBETpP+RO5Ojjkl' +\0\Fq&m8Po1;C2.gotU:)NqkhUIFFu$l6'fZ=3<+l,8^i"iI?_M[$mem>Pp#h\6Kn +EPqA6`lU%&-gSSMi$pF!5`8'Sf>J.n>IN/7Cp"33dH@$6RcmY'J$IM(>iBa-l>OGd:/5Ph3*6'pi4aGOlWc#;j[1@CIYtIUU5`M +e5]f:a9g:KYP_NaVX2Y%3BAN/=OVp89gZ%a?r_6J.r(QS!.<_>`j91,Vd&Q>]'%qQ +FLWL"\>F@aP#XZ5Gl@^L:edc0V:>!:)m9R%g2a' +NY'7IYL4Xeb-2dK\X,IoRl.)j9IV_aod)u%')H)_0%J03GF(9jCa.j>I? +P)%ToO4K-iX',1_nFu'bpZBolc_oQf:[Xg6n!K+!=A66F:[7&>4Bf]5^aG&Ha/-<[ +nsh-f+PfLZ-61Bn0hs,8@oEo)U^2>_)6l]Jc2GZOuf.\Dh0I#7*1flUk +kIk2`<6uY1$(T-^2 +Mc@,r#0.p?D4Y'A6/Yn-$E^UlmIH-OE[r/DQ$.Gt@C88nX6mF.953ba,gpC!;HZaC +Q[Gee-]gh."Sh0[48^i"ZdQNAZ#SW*S5012(\DYDf=liC`1d*9W4g%85?Ye4&e@[o +!bVjGYnE^aj8?(n^]F4;PjJGs!9AEu3X;UT@DPXHADf$&3%J0e2)W900@L]XYO2&A +^a()uZd[/:ai:[j4_jn77e-jDc6/`ib0)^+;6>(bl[5Q=Rq9KGf`Sgn<<-2@@SlEi +g"+hZ(0RGsOS/_P=r@A=Jc+23'+Fkrs1,"PGpd;_$Td+,_(fN-D7TI["U.Z?V05jM +NjY])Q).e%Q(Bju*bS,n0,B5tian.9SegmC7(<9=r%\OEWFK'*Q_o]kE0"S?$15CN +$":snn:*N8&`=2Y+0LCke\+(/OFNn-MY_'C0S1Y@qV33s[T+ +PTDo3CV04u"4l$EHY]+UEI_ELbM\$2jp>Jh.<4`dp?&i0U6h\K-Q2j\["YCqr0P@0 +[lI[M;'k,_M-ahu^4N_q%K+$5[k,p2%[mds?'4,6U&;MHg%WJLMTDDC6Z2/D5( +7gSkHZ:-tlWILstnn[@9ms+-,*9jqK$2cc-`t*m0^Q^-q.[L+B;?c.]Hi3Q&t9h, +bA6F@NI9cml]r??N_O9WgFBCMJ_cSOKA)/ljg2PK!.W)fo*3`d#1]3ONFKrOS(?c= +!X'9O^]cFe$Z3%;*3W#+RK^.O"g/X`)RY2$<9"?LG5) +K=O&*gojE(3kDeZdtKMN;Z@MprABl=N?.o^9)EBrVjg;f2@/J-hAljXSNF"A17Mm0 +?(9!N;deL97V'*;UKs3M2Ztbbk>#>h[qT-W^:%p)I`qEtr.hIY2tAQHcC18q4*c7r +[UIa]p9@3ZYWc^X"CkQ#3k:?V6GKI2,D:Fk9 +GsmdNO=lCV'*R1RHag2)hqe^M.g^L"L`"d(s#:8mKXL-tQI!GKIkg5ZgFJ0L;^S3+ +045I9oEf[&Pd\L0A,'/79]&I`S]/D_i! +B:@g_Q:.T=-I7u_ksTHL3'0[pGXu^i-e=e\-Wd*6()'IYOF7JBI(:L.s$8b6+;Z,M +Pj/4i!rgFDr%r>0.af^,K6V)oQjV8h5/I8_"dIr,)Tt:*b.Q#dH@cbXqV_3U"g"Qa9"+r>cM!,kLXfE1c/89Ou_(>&b;2q8W# +T,2Po0Dl2mo[iH*j4k'\6BZ%kN`cD5S4C'0B3M'"D/@sV=b$U,@S=nLcH/*RZj5^q +q8o$o=a8tCJk7R4M$!V$0`h'%W-Kbuh>XOD*-2V1NluPp.!@'hFf[':W@RSA/9S/! +nZ&V]3)f(j=RL[4+S8tpCV?B.OuWm1fANRc+0$T3"N%o%H!$4j%cJMfs(V!.aM4:P +"BPlc^hqF.I9ApC!r+u5fQpjTH;^sRYobOTdja*seLCRu9C7"2XKaRC+.LB4m/hU" +^Br"(R/`jHKdD5MP6:(a_*i/9dF_gK$4-$9e#rBa;E++Ik"Ir>d!q2>4^@#SNe_jq>J/Rk`P#/>q6=F@ +ZhcP[k3#0VQWHs@//m+HX=pM8S!ED#[d5W>'#=))VSu]#ogO^cPLKWL?gQ:JAUb?p +p*4()1?QeedV3uGW@FQ1jaU=p`a6eha2Ws;fSN@ap)1,@(fe%2\ +;*-XNm$hNDQa^8T-&soa?6/olh>9BAqjr#]NZE0+2O.R[`2-tmZ$jfp7HAH(_r\2V +ZYdm^He#E5q;dN0X'7*Of/G6uY$,+7Ys,d1H%+W0b*($F-/5c4(=a(q7DSs&j*B,9 +-%,T9n:`l\1M`"F$K&I'UV"?j4$gP8n#fBOelA3:9o!>GpRT"5LPN.0q^E2?eUbht +Uj5MtRj%OB"iOi_U@;K#gsBBYS;&^$r-q%9g*+^k"eb+)$%j/O@sPqq0YA3E5n(?6 +iHIfUIpWqAT)$7hhu\FQH2;#jb(qG`4l02:NC-hLD[,6PO-RZp@8@6'Z;>-q7cojt +/kQs_NOZ_?gbBo'%bLB@#H4JKC_)ch.`,[QEC,U'?HX&8"eDnhW:!)q3:UK +eF)#>#?-IBj0@Fu"oS!SlhF=cemki%P`0;kF%VNO0VVu,*U4Pdo6f" +g*DDf(f!#KTc$7JEe/&/^]Lh6,>%_D"Pkao3].I@5^%[BW>D(u)[$mAlES.cj+0cL +!g*j1$cJ9W/0sV-BZ>mJ,(-8%,1A&l!e +WL&)$.ZmSZM_64YQ":-gn;.)J7)XR#/cS-4RJrfoIlQ[`)#s2+]KS(McRS^6$c'iE +l!gL@KaLW""i(2b(V;WqgqX!VfO+a*Pr+8:$7Z&`ZVd2g:_Cg,8$E%&i8C`1,%)%" +(do;iad,]-@?Kq:g4R9oS/FIeT,N-2')!V7oJ9\'kH(Vco+R0#i:IA4#"96T6ABad +gR?BmA?r;(9PZ!(Q;4oc;QM9,`osY+39N$:Gfr0T9jCabqZ%n:4`KF1o`Qg +DS]dcj`@PK>l2B)kFtk@P&cnhEjrV8pY#t`WZ'LS)NW@T4q4pVNRar\8hqc-(Uc)R +28gAKjJXbH#lZPO;UK/9#lb80%(6=1S[Eu2q,QT1BdimBjsk-=^g,^Ah`/ucq4In` +Jk`%IrY9)-DT.i/6BH*CV^5BS5PJ+Vq[AqMS:u^Uo)%4bH8[0#n74bJW4jobIp])N^0L?F7/h%s +j:+oWY"4FM!C)l"J#V6&^0()%V<2^H]0DR[^+WN9?_dmS-r@Wd9>2oUrEQW!F+rbs +$ME\?nH:e!&3$U!I]2si +!3(+qrN=#:6gf1<>X7Gu\m]l$c0?dO>Ns\3o'VaR[;OW&><(:iD,A,/D%Jcc6+1,Y +Bim,N,I5(imFComs46@d[MK'IN?[,X!.T]2:%UZ1hrc2WIh.Z +"4(ZYc`?sr/%dJ`g`!"!B,'c8AR;jqTm**I5$W;L'^/PRN9\t'.jpA>%=NesqO4dg +bLn^$R6SMo4O2e;/6O[f[!iluTjq1!`C[4mETLh>/!9"'r]fo; +hT$2U"qDq:q'`Mmk!Y&VkOd]2=: +M0G:InA0!Uhd0F"h#G+8j7^(?N=DBC;RbD9O[IGmV_gtYh.@Tj]n`3\$NTr(dRBim +dYL'eolg0W=Ml1o(0giSJSiho133LKk,4qnNKU7>otWYihOSFgSH@\1:_Wogd4V*! +E>/c[p`Jo5SuOUH59hgS_nm;):.l7PKEcs6DJW2\s87 +2A5E`EC6b]WND+Ln4nF1mo%$?`InK^R1E@Tm]7#gXV(G2nO&56"#C6Hdto)dWU5UX +IJi_-TJaTZ39Tg4p5"5][$a#R33g0WeEI/f7[XRfa>BH#P/K)8B:6[>r4rFO7^4cp +D,F[X%0HNA)ao5\&G:Ol@OFLI2879a\'UY^4Gg6LA)(N-?(_kSLg_UJi*o#D5upN" +.2[\%-B/!#g-PdB!:G@-5O]bt+.PrdV5(5P)X]j+L@0YsM6U0a%IE>.WV>th7OCVITCJqr)k:eKT/.2[:MSZTqe#h#0c5[4Ns#EJG +YQ21281)h;1KsKDHB&l)T93d3UfsEl%h))h$WRaCSo%neI;tAo^qZu!UUo7HFG4@5 +Q"s*R922O$I@Y;)]mE,;qlTFB;>M0/1pJAl+>IaBY+IJa"?.Jr*LCD6A']O"X1+U1 +OG^W^bM'b'm63hp?OX^TnmdUX=H!/Sh&bDg8`9jmi!]9t$H+Uh[>2^\BYs4%[X\n( +B5TijD!f[&j?Q8UR[UYdIu5Rk)0l7(F.Y(8Zk)Y-&Eaem1RcP,6fQ70_WnJOARI^= +Id-uBs$43Go:3>g,&?RGc3ArLZn0N=^#]OWE40(,f!//hhm0^6hICd8DZ^H2*_-.`f%T<55_2?`ID0C"Y]jQUNt0!4j@.i^s>2=T/fSk]H-ub +4/dW^Y^cOLmuH]Si4mL0?0^&p[(X"^FUbXWd]7.&d\^rLd%u$0]Q)NtbgOW)6G"ST +9?W4Wq*jB]p*%fPkaHf'>4q/F[AT$k&9iSFT%I@FN3[bS"n4^'/'SP#OB9o&%J +Ul3d2FmEgY[MN!3cE5c,KQt7>KoYBB=k:o%f?RQ$$le@'*i0A2F6BXjq=YV*SZXU" +2m#/#bC$pG6664.`hu[AK%S^(*DEJiS^7.-25b,_C!;J+'lrQUb +5SYE$I\]^Vhnr5Wr`9c1eE!#\b+\r6S340Dn-EJcOF/RgB?d=^/7@;GCFe%rEBW^"hdniK;`GIeU1d +4rh:-TH[s3qQNedY56&X9@5!n[3W!=?dK +i3&dl@UEI#;Glg]?00O3jaF_[oh<&'ID,C> +HG;6F*bQBrDH97<0l*+qI1"u@Ou/pXccYdA^jj0!A-CV+]kG;2g7O#[\NeOa#Car6I%:"$?cBn[;^Qn&M>!'0 +=.l2d!U%ju1>8as_H3s#PcP<'91/oG=In"n>pal'qP +UR'*%1NWEjI`;HQ+ER&jC#p'uJ8N7kVmi#pZu04nq)2TYD#ko,_aF%1^+3360^N:> +OobQDs&"!M+t8s-UFcKHo`4o^ZkFS`rZK;^ms*9!H.!4"#f*pL[f9BXnEZKp^RdI\ +rPI%`DL)K_lcg5q[(Q4.jFlV.^olns!$VAOmB,$kF49IBXM+'eu8/OG2V8" +k^.U0j+>eBK#[,Bb5$eAp7g!C8a4]O(jYRq<6pHP)/[j5\da;W7K%gP?-:sM]TqLs +i;]MmDuM_?cj#:=3$j*PrVq/jENrK1ZI=Ylm&oF-e'AfSo"htQ6!.j +1:LI;Y?!7THO`18^]IIFX]!1TV2+c/Y59fMGFQ[[%4jd4gEpsQ[cMUV_u::a?d&HW +bB?sQD4:[R[u_!MS6N?`4(DF9](7NG$*LC,'^Wf"m\NYYr:`a'qh/*#`7,)+nJ3#]lV=cDch4KPiSqufZ*8*@mEoU$4eNTU`pYAS/ +E'H/FGA08+p.STc#3:&Ws)@=a^=[LZalc1B0$Y'`f8'q`jN$bjXid&5jA(VRa#:4. +f<[tKahqmt/JIuI1EL"/8FK^"pIqB+Fp4EsB*VGP7gn7D-F/Wj+JQ2:',W'9<9#s, +8UR+$>cpp4.*":ogZX.R!0jH)#"gf[b:j?[CRRFb.bkkq-Q@dd)2'@#"ioj2`TdY: +8iYduU?e"l!d1$Yr?dd&9c32@'ZVV^B:i-9Lau7p.jHC*kJS,K6@$*!141X]nl,$* +@9!:TitQ)+f_Q*ppM%%Umn_BGU?+Td%/Un;$^/1gQ`GNu=hr!3O2_fnF%'tC!h=fS +JE:%VFK/b1K*@M&fmsl+T3GR/[,kJ:t*dl,Pe0I-S0`;!-O_t\/$UkO:>q'7QH!oX*8 +s(n\]RqBLanfP\4hnH&9WP$5.W$4O9Sg4+AU@gj/@p +kM2Nl@YXJiiE:=anKA(pY+/qDbFX),T9ke54sd`":N#^s4[V. +HgS.imtqg0H@S3cIU)1Bn;83T**Zp"q]7s*jXo +YLfEH=6ob`e+VUI2SK)_c1W+O;f\43P*]L;QX6K6n&::T6k&I9%IOAlX*l'<]^@!C +]69%u>?1g>7oO[AppO'qUso[s!UTla$2[alD.kX*Uc"27;Vl4jTugf8FC1 +7YU.CV<`8XisiQTeSWWEQ1+CDO^/28*V2ac>K1epj4!>jeW\lE8%p6C*Q_U9/J&a5 +Y8A!-)&-p)eZ9Zj4Zl1rXlIORZ/C%ARBL,IjcFIImQ4)[fa5>BpUl>`V-Is-HJdQP +m8WsJ$.-*IH#La:pX&ZnY'YrZYuBc8Xn:gTG]tS64/KZn!m_fi*_fP)AuTFLcim/: +?*h/SB%I1Lk1a.uFD1dTCF?YL:7>1d3&U8tcOC^*4OPa-I'S(Kor?*2%Ir7;_$4k0Qh=` +lL&J%#A?-qp3Q'G@iNH]\F.DbD'S#aO+OP-pft>lfl5j7 +lsRV_?LMq[TspoY4!1BWl:n?qNQU]^.dP!CIuJ/Ia`o3\N1j/S=lWu6\;3 +d>`fC\O@ALjG[p;Nc&A<04d>;caZ31IV1LJ[55>,_4FM=RSdgW@iNB3JI@hl15t5o +ra5alI]rg0EGVca'&8!7dO9id&kt3?,T&u`NM>p^;&P*#35#Tf5pSks'`IMHrU9sg +0Mn9*8?@8ZN*]>>O\^T.WRPF/jJ1\X'Cj%2.90EY.bD&=0O/He.KI56(fHS3;FD!D +_?ZD>_BJr3$NDBq!eC<<"e`hamJbH3)um<.[a\)K"Kfd9s))1YWZ=oO4RPg"< +bFhtdF)CKR/?*1'4H]l(RUm!,B4dWcfX[:f/cPkN+>2-SOCMA9Fb&sg;=%Chk#>RH +>$^/g=*s4KSR5m?kCp8!QQ#e*S.33bk]cI-kH4Tj&RO9C\Q>.Q/g3nT'd-7AJR>M7 +p7n2DKuSHg1T/%jA/R2obZQ6#?B`Xk"9.Hb^`gf-SoV92YW%]["gn#; +PP@oZI#RmI17,5IqbJs`%l4um':7V;TJleQ(n5GGBT`bI)"APA/2m9K=8GbJ$fCrOQD7a&=]3JCHhGcKo/"LSGGdSs4Y<@m3 +fFMk(1p%I\eVVNh2@O=I^L7Y&6(U8,"o(_aX&b0PpdSg6-M?]E[0+IUcft5oFKG&J +ZmsSQD:B)^iB$^Q_[#`14(2D5^Y;S8m.oFd(>?CdIp;;g>N=8?mG2u2Wc-duHe5Z$ +j4^:%I%^2F/+^A)p:DXECYn]p.J@YEG]nnuD[W,j"V,ANLDGF6Wr7(SbuN^%VVA41 +kA,JB9@HpSVQK-]Xm-*!M[,56VJT'9]P`W)g=JK*5m\\+lBI&e<(.6E@g5d@2ot]D +pBC!PRkCf^/hL!$Hb8gC:l'Z++D&h\adgoL$Q96KX&IAM>sV`!-tPY2RT'Ce8X"L( +1],ksR`n@Qm3,mT$A%$/#t=It'EW[VQ6j$&Z&/ri]4pjE-@#li]F[VIe +23`ogNKCbVi=A?(I@FogG+Ua6:n0Wn`=:#=8&,;4;d`ulX3#e]0mDeJ>38.T(;nm. +ipLWYoO-L(,igZ\@0in+\YM;#Z+#M*DYEp6^?-@)=bh'(hl4e['5n<= +cF"tZ\#/\!;bQPTS/G+Ut3(@nrdHm;aoZ;Co@5"(+ES.j>.agNhDZ7+!Z=b&HT:H?^\rL+Jk +,pNt05L38`iq6HGk@[btcbKUL4us+%*Ce+_oZ5AC8OjU8]$)]=-3^]g'q:'j#W&fh +l.Iu%/1[q)&DStG/Qk)7X;hW+Im2DG9=*X+/BK@)Q\ae1'o=cgLaeOQtCH2p$`$m]l#4fMg?+\iIAPA=N$5Oa[Ro!Zi +"90,#1WkYZmTp)$UB&lBH,:get,c?T@5`*ZT!Hf +fT9HVrn%$fjbG>Y]*dZ+,10%?D?,Y>6P#gt`36]1fD/m_W`(>GTgT(Fs1)SDP5kC\ +fk\#-Hj%NOScr)lJc%`6Du[4g(EMX$J,&npVuO9t!bM@(LO[)8lp#B]AY9":o&ak5 +Hg_?\c`*t,r*SQg!;mAUB(hB8pCjIui[/iD`jS6i[Y+Fc"8dWKC9K]cLKaiWRumRB +6Mbmnqc*Z10("s?gT'WuaSuVA%Z&Sqm5HT"Y$5-Cg>5f=ZqFZNd9"ilhXTeGRY/oFgQ#:GR[gpLB +$D6HnZ$-_q3g\(V6mq:hVIp#9oa?(7P=OlDa66_sV(/Opb=3e9#/L6p!n5W9-h8nR +p_W-rZbE[+I'` +XjDi=DQP&/WB7_3,>W:-hu`+^9\(Dt!0A:MERr]gApS:6SrmM=ppLo=h!IjstD8AU]lo4GH>kBDiMp58\#79YtXa9lP2 +kehI%4_#AsD8C@;2Uiq/1nIi*n/q3cdj+rWW&7AjB`ESD5M\/QC7LBd+&C:BbPTmK +=$JF[+>M%^%ZDN95<;M'$46gUMa2NJf5:>,'JH*BLliYC+ncfK; +1-Ytm?@iD@hAtW@`[4I!pEr5*A@YCJ.=I/1KrQm +o[FN_U9QW2>Nb2&kNCR(a>R6$>>rYb!pJ=g!.Xbr$NCejN;l"$;BaMdQjru&.kS'/ +/p=3IF0Deqpd0=TDk; +_E[N3g\_BI(FP3Z2Cnu]g0=a6Q8j/PXs/3a^Xf+$H:aLZkF09AbN9'Nh5=+SNJu`X5*Sf`U8f+.ej,X +=9+`*pVl]q.l>#lliG`>rkG#\qr`ZG^L&tukLJbqFoBi4f:E*Bs4R;go]t&*J#gr/ +is=PhemIO@^<,,SPI#G"JOW6!,Y`-r:[H(slpZtN&Hh`g2SWNa[ ++pNVuMGs8f?Ca?r/]V&qG-u[pbc,a.juQ&qfV3>q%<`k:Bp6-:86fBGG'a$)8rkU$ +q]1sB>r?AI"r;_i=894`,C2WAMe_Eu[E!-DbO'/ec@+B$tQI*)[g,3MHZY<=DAR*!D?T5/m#lL;Tb(0CC2m3Dacfc+IS",UC?$ra"](C8e +ToL/bF"?Zk?^9j-:5>@mcPk][%;a)@f7_u9$$`]AGQ18(KDhGqQ-\h],,s +XOpkp38`G1#QD2jICgbRSP)_E(7cAAD/2Yc9#1R@CsGBHht4LnlIrQ+dN\>JJgpbk +fSptR-',$(`mop@P)p`9kA@.!,eeJGUPJPA-?dk9[^AhVp.2MOKP>#?-oP[CQI%!T +lkdW':o00<&LM_l'<60AF5D$6FVrkj*L%h0MA&IfUANM.mda00T(fn.i-BCg^J,Vl +Ilhpp)`OWb)aW-us&_m`'IF9H;hd_4K3N>/r$gjD@iCN(.P\ +Na;`bTUsT*"RFED^S[hIB4Mo9aC[\^/d8WhAcE_LXgJ#8dIQ05j1j.H/.3UVg_p,"%=or*T+8Ba&-VpGdMU\e"qUW=c0^Z*-=usDC$*?G +dKg-R01eY2(FBR6P/ktboCrnhnmct!PUpYY'`og?+EdPY%Y5.6!#UJ:^Q/Df/cb;" +X^PM%iC9*WQfmqiZo(S7Wf4S5,L15j/;"*km/ZWGV$)>[bZCUbWc3%6R>X0%V'eiU +ca:`8?Y[W"Tba3`9.rgd069)/0LXg(-*N[[[..JGk?"ae=#@;1#Le$["OISZDF:"F +=0-XH.".O;Hr2GAIN`9:PtD>ruYP8iRR(YXaSAf1,G>/&gq\fQ/6jfmtE6BkTG3?`AY5WD2RSk +LlU[AW[&hml6*+='0ArEBBGGfIK.0nDoq_6be3CJf6Wa-,_V-Dhf\=umC+MoaT''U +IkTMABD@].s&]$qs1\7"^[CFjr;UE[oDedQjaU8nHXFMcU1!#Z(`=7]$(?,\.XoKD +5(l7W5.S_&KdoQM+5%iuD%joG*doN9::4"^n6^44$?3]?g5/k7HZY\O^M6WZHMoSX +ZYe12obtsJq[i`AQQPLo)mn1UE(=o]HIKH+BiVK_*A-g_rp/t+9uAM&S(:<'Fq#D! +FYi2Q7ZM+1c9C*tnOioF +FLu+I+_8[0(2it+!ro_l](Aa7>L#sTT&9cH)Q,3_kO=LUhk#>pCQI%Z/hK,RV@BS, +[8X9OX\\38[HZPSiRXuMDVT?:dC;&I?.q7(3oj=9&Gq%YhuZPQ.V71R)ii/^cE._K +C73!"AXe&<(1h"=F8EUH*B90AFm7J_u&-p]k +>m_P#,6k7dp$^AW7oen1IF&,<&-t`Z$G^!rFKZ?=2<8'a<,n*4o=)KS,M +E.N:DlOpmH!GVa,q[BTLK^bdk>h7kXZft)*mBP`p0@=e9/H941U4 +J%[-$C15>or0XO1d8t@_0'>]+k3st._ldVA0'2RTjD`FV"eJ>!*(qH'Q%]$UK(g'9 +Y"'ZVN^VNeBQ&ad>CFf+3XYcinSBmA4&!-d15I?^UTqkj^@mMT?pBb3N$9Eb*+FI;=BT^W>@Ls(C+Mt)q&oC5]@">L]d#JOJ99=2l5[`q@P +aNh>"OE[f`hsts)9mM@c=@g_AJ#%psW1p73$6h9-oM%??* +IC7#5d+M^m*)c9b0lUkdE)t#K2MB=lLX0lBcY`p3*/6#Xi3"%(/FG=WFTdN=+p/.& +;+hl46L#sC*FmM7J7`r5K1lZ%Ju6#foB)m=cP'kCPNC*ndcZIMf;Wf;1Vr@_,l*39 +`2Tc/dPYr!Zu8i"cNV,aN>DoD_\f@uCr\Z$rut3q[WEfEIni:."+SSHs-@Hq-!U*r +6Oe@*U3r@W7gju6:ACP/sCG +7C2]6PL?F)jk?^(m*U'Qe&Ho8CJIS8@cc0:d-^nS1O/Y3HhM:/\*>Oa[V_IWS2q)HSXX:[DV)IL +O4:LQ_n/S)gUlFuVK?MW!V9BpC0)s%QE=o_cHSu-N[=QM$b!H9%Wu7Ha7E>m-8+*= +q+KkknN=1Pf]M_89;BG!G1jTAeZD.*djE+YDijj=bY]WHg'A,$Y[UhGk0OB7H[m'h +U5pP(`f6M1/^B$8JbJ@Y8O>RU$uH"ipF?N_8j]/92N6c+!iK&bEA_Aq_k)A[=b?#u +T*5At9ig%RQJJ%+hJM`e1#]f_"5g4)p+#8mFPn*b(lEof8tV'h[>Jgfi4@Kq]rUo\ +YtrQK?T\#gr"M#*#_&Kl80e]c;U(G(u*?.h9K50 +L_D],.e9c4V4J,g3R8;-V8o)L7\@YPU<_[^d:\7iVod>a:j!=nM@tE%G/lVRSQ[1I +<"1T)&(@RLBXOVBqL6Y1dfkuOE&K5,jqpmAju78!WQ[* +(ZWCd-L`Yhrt?V1,t)#=!WSAC/cl"$"a1b4f%Cq,g"G!JF0Cnj=kq0+/^JVl06F-@ +E<-!q^[:rtbdX:-hOYJ5SK>+46DqUJBS/)*Ln$5Pei]-X=38-rqRD24,kFN1>*QbW +1>b:#J(GmPGE"Yt_4K3\c"hsN#4;P]!XN!aL-qc/1S>E&kJ.7E\8so^6dX&##W`cJ +-XpMF^TbTjULcOgo:M?:S,'68:M:"Y>4NLq&u9)5_97!g(3Xsr#Q3]^Lugf!'(Gp$ +P2]Vr%,_X3!!3OQOX()<0Q5cnOXP^AL][U;Bkk.AO'ge&PT7]Em74:1T#Ih"Ap)Yd +K,rkWO+5@$!WV%iC#>egJG_&'CZ`V9nE%uaVG1K4W`T'rQKDJ5m]T&@s*j:l5K`a# +j3HV5Qj.s;o)TJcs*^jfi;^5^r??<2-[p%oD!iudksb4ol4F[RIMsb$#b6M[^d+C9 +OiB5f@@dF[_0]SEX\WlmWO#(`2tLDFf;J<+;7a0Wll.5$FT?]hA#mb\;0qo_lD7#: +8B`C`;6/d^i:if=^(h]'7WD;ED2c0JsE)Y>iae03Q%fV7*G^Z>\,n +21FQ"_6R'VgT#=3=$&A*S=ZfD4BhJp49uqX\igXTQ(^0WB+5l]>VPhFguoR5^ZYXP +Q`1A5Z6a,kk>/"br0a+.Z&QS)8i_2U&Tb\].rRGSHCmF5+!TF4%di0YG5[*KDI'mB +rHfRf3gUn_GQ.\XA..#$j$0p:1LP=hgp1cOg:$2c9V96>*QYmE8"I(Hr-C2K^$r)T +FRN+QFDF%N+S.6h<_MfF!WEFeFoXL(^oC>nMGsJJD9\gJ6a2*W+*+:*QRuOU/$Z/. +n7[rr2(^o@Y.-=hMBR#@W.P;_aM8eE;b(rJ_+gQioDo/fp%NH"/+tFK'jkm5c8uOD'C:k;1H;i1=1TS,5&(Fre4BcoLWjH#9G$eKT +3E&g9;u1b<:]"Y&QIT(,pZ_An4pQLSb7fKi!kRV +kS&B\0BO6,jt$i6++'0>E/L'.L4.r;UVjiUK_\$SXIl.E:=5Os1X+EAFpiO\-g>LR +j),gJ]YZ,>g/(:3l`s=.$j:3 +WgrdV-P2!,=:hdcb\33kEW5DEPT1;cc_EXa +7_2tO*&2h&$l\E?_*hK,KE%T@.nllNid[=/-HbqdB\tIPY^_TTrAgHp$nNMRkX9gf +a[kjaLf!]K:GhY^(O!V'J+FEMT+lEN&:H8fp7cj32a-"Q,KV,[rH_5ie_KMl7G4!' +3VKq&ST![Oh(E^r015Z@/G#kn+uSNd[:f$'U0O@7/^h5X8cr+\N8Cg3mTu^uaVg:? +atWbbhB;NmaCl]0M:B)[l-QYH[Xo:'9WR]m6H$LpM#U9QC^,p#K-tfs)+aYe:&uJS +kj13O(1-SV"s'3,1.$.$Z@^A7TM9?%VDWU\Q711D-e.3sLrTao92Bg`gEBB]J6=Gk +Ke5KJ7YCM%Dnn+>*j+(R?[\KVraYd/=9(JY3Eu)-;hOp;!kf9.cNOYHqbL^5#LP;: +pp(e:nE#Q2`N)DgO/X(:'%-4Z!;9bU[D78?!?gPmaG84%AN\Zbn2f70a+"MhdcIOHE&/0CQ-JKHR$7#:l5EP6&o0M'G07?(Ri,>\Yr.A6(Ae3PBj=N(sT +q*@X,cmHCQB3\"KPi@$4`lkSlBSP->Fht2"hPkDrG[rTE$@u&sjL?[SI$reR6Z*\8 +Jd'YU"UmKM(V*Ktip+LihJ$HR4LmoEEi\3SY_"O]8Jo15=1BpR.%c"s!11lL"oK:I_QSFV]%gT=n\pK>Turh6;tlsqRp +SOpra:t""k,c5c0dj(IK$Cm/c3.[ggNmVsHBWC+]jR>s&rLNr0%Zi(KTD0KuZ28&4 +&GSK++38ATIg"'^G,c92^FIR?1=+oc[dDm%Rld%hGLETCP&H^[!+Z,,#rbK9d9J@R +0Ch_aeCB/,/&;1dO>@II'8TuraWoW&R,O*mQAiSYkEOqQNJ#gB]Fs.b6HB@Gq +P>,c8iJb)]VOFtB:h!JIT\)*OA#TuVkXmIs;q#Kpa0b'[D +rCd.@0880L$atN0ebrNbr;4b;Ik*>S;R-Jqs.>S&rl9Yh^Qe$2J5>n8:V!Lg.5GE* +i_I_GMkmaf"NhPM!VhRK,F8&5$]!]>Xh\@qfLR(8HOm(2HF0hCmF_U;?[D,0lBTE*H+dFkf!T;BV+]k&Y'!$^>!VE+ +%e/)\G3Ren!WFDRkg6n`XBF'Ts4;2=CcaQ@h:i?uXTk8,K2!kr3:+4uFrf5)UuA+ +<=\L)HOgB,050DCKZRNdkcXXk=Fef,#G$;.e?\2fB-[q#cl)`Zli(QbQBj4t_[S*/ +\i%2g[8.lLjmF.)DX@f"DW!b%n5,O!G:L6eTF-cAf<70`%\G3<5ES0W\QilVX)r8\ +\2UV%2b?-#+GW;jYYOP;4E$,LUH8KT5^W8lbAPQ;gF!@&2DrdeaX^c9^mj#6&FW(@ +CkYWZ:@8NhH`mF3hR#RhPp01hqq!8!C??q[ItKqt_&NJSfOTt4LclA;2rsd7D!)_> +HeG`:g7`-$^3\Y<@F;DalJ&!V$ILI.Cc@S(E\&-u5mp'eh(hms)S$B;!"+8pNs;fg +\1+?Ka]UqZ8%9ds +g[4Qi^'W$\R[N_,iV%t]=^IjIB5f?fa[!id@:<$ZXj#(JUrJ1AQKk93)?He3-De%0 +^$B[LYVochQe54akcRMFY0Q9Y>h&fKk$V32E+T#6A^8Z?4LfQ9UihnK[MB/fF5lI_ +@d\r*\kuDXe0oXOT#5:`2FYf@9Fi<9Wb#*"efTVXD_BhWm]':Zr0&hr)SkUqt^UF>h51l"W%I3d>dMLlO6 +Fu1]fh6Hu]`DGo2s)265iA&;&4&@K]()0-A1$`??[g)X!nQ$rf)\qTqQ+9Xiq2Y2j +m-\Fhhp&C,8@q`jC2kW?ikm1+^qsmg`GmhoU+[qM#FSAY::raYp,"CXLL),9Il +BjWqqPY'928!*u-*JHg&bSp!nNW4N*$#mh!!Uu(G5#;F\.0fNX/EppNj1FNJPG";9 +1U4c/j$M&1LRsRi>lt!QnujD20:OO9+mP45qQecUdUKDUa'D80]Teh13BR1SI_&6^ +WdSlE@nEtS;2SpNg6I9^MhNUH99UqX;VWbNI"t'29SBduY^.W&%HBWr6lu*brS,q< +'C40,F_[8#f!@X`:lpE5E5Gc8ep1N4N7\["#7^-T9S7G\BR#"[HJ'.KKR.R)Nq"hl +/fA,!Fp2YW;`C::8>#H!qn-KMJCqZ)fk/JL"=t]"YNuKGmfkBFq=Od[L>W5+m!Fj- +o/_9/Jq2gqHo(RArr`(H8lqG052:N(-UEVr3K.-j(:/lJKbu8SrubJHQLQS5q`8En +hSHk;#KZqs]WM2^hYUO!_-ceXhIZ!15'R=J+0bc/?2\i5lEt=Nn?3""!;rJ[FeE*a +Fo_DOrV[KmdcZ*[4U2>pnfK,/+""2(9ToSV&)pX`A!bFF8%abG4V(aZi6E:8p'I,h +qg02(0iBA.IR@>2rAp8dPs^>T^2;]&;scNJ7376:Do<1OrVG)N>@ihS!.UPPpU5:L +dAqK/VIAj]*P`a_hQ9l>hQ(\a#&=2HJGbJ4n(OU\l%JO:nCP0o.p^l&RK3>F0A^'H +;Q6p>g2^rWHZY_PDm\ueEpVB2GA/'Z\(u??I"aZM*SKs,\W-$M^5<4^PXEVJ,4!?N2bZXWsG%)!g6-kCET3 +)!f6*\_<.j_oR[ed.(DmfJD+>+aJIUIq6`D;!Zg?TASkg^P9!Ra0rX9GC5.( +?:(T1TV?uJWV>Z)iItI`J/Yh,62btLUlc,$5.."Zj57&Z%`gan5]B6XgT/1#(oS[X +1RDI0goGkV\O#B2]])mLFM;k\Gi"T`V;/%fc+/;@VgT65-1P`)5`STO+JXZ])V,bP +>K[fH39-M#@C^Hc`2RaqV.n2P'>=V9"98+i(;U9b\MLgi#rQ@31LP#T#d'5Q15FG; +6:h"3!l4h1eu5)n#h"H$lFGBD5S:L+?sH=j6,WT6m6LYRV`JdJ3QG==^5b=S-4&#p +dU''>PYlHc]M&g,6:6OLXV/3X]pcn/BmlJ;E,@,d%N/KLi/Ymh,AXq(H.]&RDLOBN +C5LIC2>`@4PAuY`$2;S6kLsYEHIOn_?T1QXl#\M)E&"ZV)eSXQ6Im5]2-/C_oS4[( +LEhCtUH,ePAS%DI3?@kB>:Kg$eHmh8M;SR)O-4j*P'^qQHYR$$C198?OufX"HQM;@ +<+Yg[cg$"EeajocqgN9uASTPDPg6mt*T[Tu[hHAl-$PY#[cbUgVT.-)8(L0#X82\Y +Y_X2m8e!9W<6J#@0Ep;$S3P!]B"#o#gIMBp([qZrA@mplh&3&+Z.SI([TBuXS^G(17.XBpNs@TFe=c +cNQZZJ;/\cYEVF^.ct*^#sOX"r'Tf1,9f2$X9YcLpJ+3JI!r!=0J0=asa>=9D +3Bm$)7glhi*ciV:>Thul7cL8Gj=<5^(3p3eH#_EGdFWGL0'1*Eabr6G)ga>!jr>'g +AI5f9r59cHSLJ`;R,#AGJ:DfmOuVV^=8FoiGg!lY.hZk+Wb]G8/fc!N@Le:>-PJ*IhgVEJ0kRSIIF,S,P5c9p)O +W/m:=Z[MUAk'$?8I3'p90koZBU@K\\nSZ*P)?)4;qsUHifA>BlN'HKC^!4p<9&;6T +qgXla[L&>Pp1rRKBEA,45AmtrrO/)LC,s&PkDSYZ>] +5>>=,Q7RHP%&F1gdHYKJRT=t)O8P9\T\5m/C#Hag-Uq;QK'%0b@@^IaK\g#/IZ6]" +KR]!M^c$&XaIY8PL-]S3*h\VETg@_l[I#J4X+21Y,r]SjXQn1k!V\d[7irEQC3P@* +9rF9dLK;Lo#*3)tNrT=8pZPI8[D@K37TH@lASEq@GpY7Kq%?`jhQAfaeH?+)5D\=)Yomfs)g)M +s/#2U!<0%VjK*`q[sGVfEhQTW6?)BA/e__"r&9]:'RbgBV:@\dRsGi-q_Vj[O>HQo +0ti>Y!U@/-_#">Prf#]dH\<7]G'qJ_'O8H;2lLrde2XgKS6M9(brX`'i4k;4p=k0& +BZVK6r8<=Ecp/HNi%+d&jPJ]JcVA_XnEGKc>I78<:T)&G8`J,Ao4jb=W#e0-13U)C +/7?AjBu?uG6g3'`KM-4UB[mQpgDo?![-N;jNDQPXN,MQ_TT3,nWaBj^>k@F81!tT& +,B%`UCt9.]X67gn_Ikep-HsZo<'_0il@=I;"DC/9=#,Le_%Rc=@rg-3]\"&M"s]4- +&]plF?3p7djMe821QJl,2@jG:+2`k5qKKiTQ$TmAj*N^6"6f)bdp#Dch.tMH\1[Wc +!<;50)X"A";L4BdBFl3?cP9$(LB7CCa;OW;,8?>F-N._WrG(K.Wi%s#M`e"pI;6b- +[?K+/1")U6cb*#nSE^K=Q)>75ruegu+f3GeCm=[%5.Pj:UiNR'G44h2[X4u*%hi.h +-+,s2l?ScF>:&K](uP9?[d-eFDeb-^S`);Y%m\fg_(8SPA!DQcTIY=N=ZO(g)) +C9EA//.4fp$*Q#Ae`DM9A-Q,3YjVmc[j(rIH)qW2Z\6LO%\aaCdL%su*&]7(M9fT+ +V_GcI(h`semF>e$7l%1[W:$o)k8:K,nC^Ka\:P+XagQT&*?tOPi"%S!T22im-^fDA +'C('c"RotZg$[b1Zi.dpplp1PA.Dmic0I.o_=s>L^*Q?9nPRDH-#p` +:]=QBThupOn;AN!)<$UC#\Qha)^a;)o0hA8Of\#H3@BCXkU8H5XO'C4*;:XZ!88Y/ +IQ;t/`Phd,^jf0!.-=E2gr6Y1oB7*6.3mhE*g3aWSJ +rCIEsLS#jO49kcegEjepH10$-fB.@f`d-1I=k@DNbN!Id6 +:csY>faC1="_J-mS$*"]T_Fk#+?s965>1^$s1dY69GN6C9r\Qqs"[.PJni08_WU)e +*BM<9C_+BI!<7K3eh:Uh5F34;r;Urp#inJX5$M9OV7VeW@$_XW;)$4j!%3>e[T,8Yn1l(?Y+@U);bAI!58Y7edWU)0DUbe=?h32Fl:A&l$+7ZC`Q&D6Xr +h'^M9OlpnD;b#cb/oD)T!r."d-Su44oBFa;qXoeE4\MTF%]ROeHKplT0F5EY%:KOT +!6?g5DdW,$![@[QfOI]piqh`M?!>AnV!CJDVH*(CWFO3:\`2kSjYGF817&3QJ(G0? +6qulNEbg=n^.BD5UH34IoHG\h[@u']gc>.Lli'$tDU%B]:[\c&GsK\B4^>@&1V/B& +p_U*pc`4P)lC\H#+Bg=rU^mO3A`URJqVVQjFIb8tM+A@D%Ml8^[@e&";6Yhl"XK>H +%O"cTOgKX.90NGt#341*(FT-Dk4qELJN,J_lkqUYCf +53hmR0B75W"?+J&*f>e3;nfZW/s"_gmo3UaIrloFODo[npAS#\Q)NnQccr3X],<2c +8SqIa*L2K;%hcMC$+fQDG2A8a[GR$`]:7;ROj[6ie:(WK>T2Epb&8ikfA@";],=dN +)H^8Xn?A#I+HLe$LOM1O;4^(eR7\r#,Se>Y$=`LM;:o]VD\gqX/(cM?m0VDM,r=B9 +)G`5'Ea)?Sd34t>(eoTQDp'M2JUmc_<;UWtN="tFI"ERk&eB!er@@\0T5"D2!:tFI +]HQh[nqZ0KF*.I8!/cA;!D3QJodBNUZ'IZS+J3G#hH*X-cfR]'\Wp]J2oGK@Q??39 +jb"O$#:r&BJBcnLCZ'\2U=Ge;bDLP&o%;,EUFm8Oc=D!V-^2<%oDLH"q.PRA-HH6% +Ck2o#5^U4qs0;9ia4_aS5^RtI&HBXbNps-2Eik?Er`^Bt3sEs+E-jEb']]2'_!e

    OLpP491T;O1dXt;- +"eNdB30k6Q9lA&(TUaA=H/YZYU+]Qe>IDJV#=FCs.1L@nDDA;@%bio%dlckq5OI#U +mTr-9no37Mi=)hp9PmrU\'>3ajcPbl\9X0%Y__!pRTb$2Y3rQqgL1I>p:,AQR?fXG +#b'KW>D=X6N*r!]Zl?Si$q@MZ(bCD'gEC#nn@UK'&X*&XX;&#`]`_.hYJW2Xm@0I( +I$b;%O[@RT%::q4o!!GU?[WY:Ihj=2nA:O9T==o +d(=BO#^cuBgV8thrDmM5JIB-4<<<-W(91)m]^*B5GIa39 +T/)X,j-Cka^IjT]o0m.c+.8JCZ@fBXVd/a8:OE_bYT#(K%@T)i07bm]`ss'eL4T8; +a%i2'E#Um7,E6AM@lj=ZSi!h5h'I,Z!=LUVUV6`Dp19.cR;Lu]9*ar+@fNmoYeb6K +jXl.c!M8+dDF[?S54W(HKk?FsBW4Z94>h?Y_5]p]3/GDWCX3g1+_9q&Q_(,CK6s3- +#)M:<_gAne"(1#qHg?FPP7?EhQb4aL[U\T)cK89JJ*Er\\W`H!?Ug*)&[hC^f'8+/ +Q1#(2^+3C_2Ljh5dE8GoeT7RnB[Nh8oGF6ScZTf.h\$HLQ(*_G,G_M0^f6O*;c5%=hn\O5)f!I]E`1;-JPfY`^8HM/99'70DQh:kpn +?(6L2*HOnA+&UsL?if#@#rQ].>[S40@((S#f2egO2R33g$9PVR8Ol[3D]_K&9ZBnH>S88HbsuaBoS: +:s+,_*;[0!i*ehHIP(_E08E\m8\:Bc.nLm#-5,o[Z%^SSGnJoDI.(mCG=I[,HD"=X +a"*;7P"bU@+M5RU>S@AqEB'juXCF?n#mG[5;^C&D6unbf1.qON]O_r--CeH[Nd!0- +!r"uhG[#:iU]/@=bZ2II"ZMPaR-'Ffbou\2bkq_@o5I_1s%n1Qi.%EG%?B&J"P/tL +hW65YrepK'iMYg\[snG6M#ki[cQgDqp5_:_Ipu5PSb) +j#[t,h*)4Sa+RQ'!j?*cY$jY7TJc`]2JDSE)GL6^Qj_j,*^TTD_>bp>BDIs074>Hl +0H3t$J-El:rZMIBQO(Tf.+Tis6m1\u9[J(VajSSp!o-F'@@'9b+"b:0eF76f&Q_p, +(P)F?_*92aN[;!F9jrF=cM/`=qPR$0k?51<1-gd_A-[Qf(k2:1L5$\Pm_(RfQW:`iEp:%?@GK!eT99!n=>GQUQ +C]OE3V#Ri)p\1u\T*dJ_ABCEU8qI",js]-LD#BYQ#P`ooq7f^*]hMCnHO@P'9[2?> +E^)t)c'\e2Dpu]8K[FZ'aJNa^b-g!^1Ur&ZgEqntdDt3Ki4it/]0ki5WQ4[M@J`"= +3i."Z/(RMIS_J\[&GXZ=$"I/R6&kp&VN2;VX5(>2^decf]Fk2&cDFen4BSq*&mqc( +g"&M&Z/\(/=RPLUMN,(u%^jgmL$9%t,s2,NN +AIO$I)U]b@IY0bU,k[p2f0#OfIN=>A[A#25dh_[(0(g^/:'5'8T/-ch!)_Nf!G_[Z-^DUtKc +Mu`O&oPBZdG"DNlUtBho^2&qfVkOIKW4c"/.-NuD'5E)Y-!\WF5LLai'5]$'RFpS[ +bCTt#KDMC;")DLGhRUIofn#`_ +*;=QPHQ'dbL$"t#FV>;uq-s`VTGY=71sXc"aS*n%+M8$I2W5oc&ADCgEH?%K*EP\P\c1Ka*.7XA/W%^RK$An@o-<6MRAim\tfR'A:Uu;p!oB +q#6]Mnl_nK-MRcli9CRHLKS$[YW2JFQKXUrF[8,/Zm$pDj%i8! +Du"M5s61rMs7=W(k@6k3a+PX*o<*K#IffYf6i\X'LY@q<"eQA0r"-pD90Dmj"Nhf! +8Uj8SI\)EYP(pkb?nlUp_]K%DaC0Rf(NoR_Jn&"!F"f:lRb]gHm[N7D/HiK,0j@_3 +7d!nPK>]-#KM!E`d29Q*P0j^9?O@ZI6qsW?B3!>8RV4Mb,\7KXR7!Hpj4]SDIII[7 +)8H`M*([$kc_LGGr5IKj(%VD8,^D(qXjB'QQi]=U@I\'-Glh%SJd4Pf@/aTanpZ8V +W@68FdG+fOI+6'?#^#X`b@p^@3$n&9KK=B)Y+#sh7pEIN`X.XcYq>l-n6b>)]]Rk@p?VnJ_tTo( +@]#.&^ji1^045l8Y6OuQp?6r%5rp)2g-,^bgq'.t!3+d8!<,bCU-nL=&N=Oq(*<=4 +4S9TFpD<3/-au[A"4HD)?a%JO8`j3W-?d*/'$4r2Xe*5>IdWfmj?:H];`Q)[#c@Ta +Z?!69IeM@Had\I^$A&4--V>1NhcdX>Du!jVc`u-W(ddL"M\OBpbV/=h5BAIV1O^q6 +am4'=cWP#g;.B@L] +b25$[\q;gk@*Q)j_7"O+XVk7AD+MVegZHeu$d^fji(7LA8AQ>OXjIBH"@.V;\1Y.n +QRkPl@sBff%Vl(iS)Mim\4(9$_FB&hQ/&j-l]MlWU\RpIG-QDSP[htJh4n,>-W%$< +I+lC?bf<,T@o3Va2.F%bd]92<.B#C;!MBU$gH5rlq%\4Z,'[Xh2[Y`>L1Ht[/)68P +OPsbGhZC2q*nLhu#I@OPFtEErc24u,iHlF_$_6qdTVgtH\l%%,8SH?Oq16nrEg5EC +T-0ZLD=5\"Wm-TN>fqCq)H'QLqC"S0[NMY05NH6*rG_l*5n49E5FZpWPC>HM$J;OQ +-J]uPF>a]'&WeN&rV +"H"Nd7M-Xb$&I+R1-FD>$q,'oiU'@F"`\N?>^otnIMg@mLNS+PTQ#B+oTVq>/AS@E +]>3kMro(\K)W>&uD\J#9rlBQsNn97E_FXe*68&:aRDA)R#0QrVF"OE_X=J@/JH,@! +mI$gEn.5"A#sD?,E%7?&/=lW3$K5cOs-M+SIggN\)Jk8gcaeW6\r$g)Ni7uHrE>u8 +s&&"4*u+^lD'8j'm"aFW@MXRq%5_AoiBPO-"$R@XrFI2@>97LV-Gp'o +;ggB7fV=k15G\U6Ik1H6j'_c`OP"hrUEjZ'Nmf?cl<4VaQguJ8ftmbV>rT2!Y1(U4 +G\T68#[.Q"?Y&g]0RG)HKCZfT3G2lf5(LK_G=E[3Fp.8'/-G(-a3"ff$_Zmc`SK/] +o,R2)Gj.uA!YjI;r.TdE,p<-Wkg^J(&FY2>M#;5`0Oi/j$h+i9kR-PmYeSLg"G$r2 +T(5t@k4<78+P5,b;/'dm[=L4D#hB"ED_kD^ZIEg!d5[2td3J_l[k-A4/1hP;D_b;\ +$asC)C1$(:JH'Q2N:0@J_#JV4](^oIpGn^-VQDut/3cotn:-e:q.&"PWtagIKG@&W +Y7maN;j9L65nPJ3]=jr7n6t7-r><N\43A"r2U#i2Z8c>PIMjp[<`A+Bl6G+&u0n +bktPkL&g[76D&up+Ejh*]lmIn?OQc:(XV)o>I9M%I.)qoWuR%pH4=\tfbP443X@Tm +dBgh$[*_VJhBi%HF&n?gS/UHPSabcT?a+5N-qFq(]#G_SZ\B1$!Jp])IA$ETXrCVR +SMm-nrrTiI("?1;M9UhoIJhMojFWmX\jAl-!T4c0j?C@IuU +h[ZW0S(+cEl.[NYl\&G,:?YlZp)j_Ci3S)7HB4HC2N:3Yh'ME:H-i3.G\B6N:`2AD +iJOG),Ee/)Q,)5[#20=_2Bg(a/.al*Y\hkA`Yi7a*2?@NfWl@J3ZHk])Up`>XqCK\ +%=:$i-lqn6_XYkH`jEqp=hNKlXGU9VSP7=]N1d3CJ:!-KW\d%f)@^d=KlT83HrGR1 +R=MmeLFnMU.uWu3)84S3TF\ +ZD&c@js<0!A31jS2O%`^((]TF_`<@Z3!V(]mN4dnGPK++Etr*"[I$28MmYHi_1*OC +qHu$d-N24%4rJoWR)s#8r3m"'[:9#8Ye4lWq]:fl?c_/3.upsGQY'6_D>f=k&$kR6 +s&3_ai[r;t(\1\KZRB0.j1e4)IMq>?LM2`%,+LiPn/lla_>h:A+0G?/qnHspae*2E +S&;uYr]Cko6VZQ,Fl<1CPfK,qIc&*(^Z3^:o9nbc""m%H?A])EjF9%UHOYgU"cORi +CK_)aFpXDO4"gk&CP)Sc"R:14_H2T(09Z6o!r3N.0hHg@k5/PlHn^uFQjdn,]&/WD +lk`6X01l;\^<8^j_Br'44BN(2Rq7U4"HG)=NN@0@(BOeRkoJ7&[Q.OC9#-NFG]\Ma +2;qn,i`-A%= +idN`,r'5Tbq#U%Oqa2%gpVRe@Z!W(u:I`O#Ld7ND9Fh.#Add8Q/O8\'06ibT0V-Ob +2YZeuTAa0)s,WQtcqdg0T5lc,F1(Ja_Tj/M$G[S,QEFKKqdQqXkA?@?f3To%-rscIMJH%NEni:X].;oMbKAE1\#ddf8&NZ-\5H#rj +)JS6dUsTY?*iVfE*9',)aF)k/(4B(J)F]hnKV8ji4tU3ai&A%%eh)+51fk>u!?,== +f"2If0fYS@uOX]F=SMFR#1& +4f/)!rNR"ReOKZrO4n1cZ%6]<bCi)ARjX4C:6bUJm&-] +!B"EkN)`XodnrTN%Q9,qAj1iA^rt*II+F[J3[i&CU8_./pU&c:$-Pr/8*d%%c\>f9 +Q8Gg?+8prucps>e&I!4]Y+)MT%E8r=#lIrC5/;[!ndu^i#2cV^NbIW$3`G>s3HOs_ +V`_u'JqDPTXV#p)=/fmp!4K6B)E-B`iFC\W'5\O0-XP-]Ms!CBpS5L<`oX/1mLt)8A13XYD=R_M8LS#S$668O"H:_ +#Mk>.n1WpNQ%]#KLNs\V^%+NQ$A.()!o.iWDWr_8<46iTb:/kDB^3Bh2W;[&mEPPf +_k0T1%jfn_&8a`5Sc9c_+;AT5l=X`Rrs'_H6gQb:qHk!&pT\'">rc:>4MX2Zs&p6: +KE&CL%KV#*rd.eR]hUtY0;O;,.u^pHP@@OWBa#fuUKkb;arLLYF1%Ad1?/a5%LrYXboFYs)"/FiTkqDgb*@O1,W<5=ctTW9djf42AC5]OH;EM6In68&XiQW(aS +Vsl;aL7CsD3$-E@+eE^*!WQ/_ru[DP5"kQ/P2q6eoYi*O@T#nA5Kb"0l"/kh0.+U* +8/_eu:W&EY5(?82TB;KAn-A+/U+,rS(q"FBd5=Yc&5tXQM=&d+bu=U9e(A8p7r?#Y +"43uN2$=?7PYVt2)o2GR3#_'ZKhc?,1D'?U"k%$4$K/\p_4a,Kk(l6F#D4MaGlg$4 +q*c8a\)0$1$fk[K%[hsMq(Vi$YU)R5*d?Qb]j3gnp5ep3`@FbD`[!C;qf@M;]S7)B +oh&*ZR\r*.s%Sdd"T89[++h2bD1UYW3]d*(V];oC"+l"'\dnl5^WKf2Q7=s-XR*nZ +!5@<$.K<^jphMVLmJ'TafS]<$P3bo+m)L@T_#L;X"b_BpWEnBY?C9C3AM<**q[q$J +_!)XHp*ed+n +b("AgqVfL<'kpW7&HV;XE;aIgRlm_@'!AijYISbB#DM)+B`7c:IKOm[&] +/Gh6d%#f$M`hqrmp\Z[,mXEL18+c_H\borl$u2U\;\ee[H60MNG/04eNJ)!jH"<7& +G0$)#naURo"7Q@%I);k"s$84N9((LB(Y"rk2=74Ml8[gY^e"t\F8!,(BtD_]+>%G( +734@r@c%Z_g^Tj+Q`6CJEpA0-?p[F(>!kI.7hrPj)7u>/X/ZVFO4(c^Y'S7;(1S$c +"Gq&te?;Tc(fiFi"%R<]FV\3oePX4#]MRb<"r=H$n-$sKPD%WjCH,hnrZJT>b9ZjK +EcOAY!YG@mPRf9/2`RReE3t!l'0<*&6Um^W&j_M97ZEdf1<',VK:PAfP\e^QP?kY>S@uMk(D:0M_Lntk&GVN +5/At4i.M;^9\;kra#YC%,CPC?+oZX.^:%DM>^o8H^V*4ITMU-=hd\n'ce>JX>C]l7 +(Zpn>pYl/H"[\SjTZIUlG_Z9+)n*3jn=SZgS56eZ&pPumd\8kg+8i=bZUOf8D39T7&0upLU)rOU.k[I)dI?p.#,^5o(P3IaI$QockX3!Ug +n)9mch#r38dp?G65=G?q'oDl9P5'GNq1gZDKa9TPs(YN[2%\bskRHI"!q/T@pM'd( +EY92HIjl]9S:GZCQ>nIEo]K>nQO/+JUj.%HO6a-#dHDcn&;D\.2\hHbcN&9 +R;@`&(C>u^Z*K!Q["-W4?kW5fh@EsZnE2GlW87iK#@ITki<9dsbqm#pm_/)-W`2=o)BTGGEOP#lA?2]8)LAue-E:MYQsrcO7t=f)gb-@C`\TdTnl;nPY,H]_iB +bb$:DN*h%*\FMP!rO4!,hb(B7AYIX<5^q(l[.X1X.`f!c^h)N%YN+4Epl!/==`^ba +eEer&"oN.g3WaicA^;8ckfi3qk02<4`FiV[q`OKug('Q/YU7o=!MG=90E>)QPQk@Q +EPVRbGFocPke%2PN.Ek"5onG&72kIT-@Prb!pt@-l2tmJp[(d(i4F03P<.Kl*]pmj +g*+30fKAs#A&,sB_+Qj(&bs6;@5pu.%RF1)3 +QrqUj"*r +CA.?I7]Vp+Z9[[Zr\"h<-C>g;[&+^e_]l-mM;:?gCRo"F:.;NAjEEH"BAEu/'upjm +j8AIXI#;D2Mk^-#q*gF;Kb5@QH0'g.'_'n!\K7E6:_+[u7Z_sdOCqaY7nS;9'&pZ1 +'%7R@TKC1mdI@UL,c#+*!uh!U4%A.ud$R&C3=P3TK$4b4s1iU?-Qmnj^LJYtCC`'S +5P>'9^\QX/2XteT!:g*,$6m>O8d!qj\V!]I&+[-epfO$]:N?5^l[LOLI5NDM`[ub\ +K60cEs5Q3\i."b0_n?J6Ee/?>mnte*LLd#1@\(kb9rJM)n.TVp_LLK$Uu31^6S(D' +pj_B)B>B"=i3S\obmt#_+*&Cn$2u%MIiD(Wo+t:(5?i'Bh:B!9J'3qLD;%80'LE6g +AnD8#P/Suq[`iP8%[ZuJ9p:=VbY4190sd8sEM,>TgcNOQ1#BJ7G2/U7raX0GYq=.^ +/_e&'R;:&)B?\3I`5=Sa#l`Nr1KJ62r(LpBF8 +M^\l`-1/G[GOYLJZZd&BC=37PXHHmuooS+$+j09%e-8onRj+O<]ZP3cj.Y]6BIaF+ +56cU/69V-^9c(3W<:]Re- +d0D#Zte$GjL4oN.=NFd;W"L&"lV%f!f,VagS#:8!Kn1?28mHr_M4 +1.Qji1Ggqm!1iVRMu_X6GZ/ZgkmSC,'[s-\@#-82c'Zl;9^RST3)]W*8_lX\>>id( +BlKY-[`Fc[ZR'ek#_[gbCa&K*;L=q0*mb:!>c0B_B/Xm?N]]Fr4ou>sr3sVO.X`D[ +^$dtVgU:eU06rFl[VRRuhjN31Q8H*<)OVn2/iFV-@+&-BcRnj!$3Va3YBA]]6r2TJ# +D=G,Lo"M0qpp&kSZKqC_Wa17\\---q(\I+2fP3`T:\]pI`YmJC9Pe?8Y(>SR-5QB?.g#N-?bX@10R%&!S^^jkc#BE?hTV=m6C.6S6P1sBo.Cn+?I[EhMgJ1So>*s2,BP.EO@ +9gDcKj:g$f+fWFOCiM4VBA!Af8uFSM:7om@-DBDbBIkC'ccALE]o3B$_ZSUeBGq2e +4!*l=j:73W0).jPOuqS\BI*8D(3$?@1c:cZX.aX/CB)d!20S=ZRFl1DD/n!ME;nnY +2e-m$AbBf*4XtcEP1$=!WmNGYW?(K?4lH.j(oB0S@1VH3%s@EMb..>[jMt#-Rl9B5 +.cld>Xk(^0[r?XY!jp0(*NNDfmab9?+W!t:)HF.f%BE.Hm$,uRVeBoc?FPgHY$a1a +1)_D\!ON%KXa),(8]GE_:9,6Yf16eP;HbXfFbAoh&B%l^J6*;UGXHpGU(<-74nsBm_4MM)RGr^`*I#/HHKLs[gt2Ab +J$&4Q@]tY8OXsP/@MK6tX8j1#a,P#=F[NFGRpN#G&E8T]j&E>uc +!?s/ucdN&O#D%4Cm1'EYKFlWV^bmM1h>DrDH,L64Ws"QJh5XT_^tUu7f,pk-O?#:eci/k3EY#s)2Uo>uuB$bn"+2)B9m357f&WD;\W +`&Gl'>,4`lisE-20on?sDtSe?R7qLOIhOn^">,DGrsO'$cB(sY2Np-%aY2rW//hkG +7$Df!iU>1uZ!o"d!s/=,"nS7^#5HMV9[*hj5lqfWPRo?J._n5=!!JStTN7e[!au"Y +r*]El/j3m&H_ohLQ$'.WKQmEK&%>.?bD#5@1B#KEl`9@#&:`N'qCc_m?TL,a3]=.o+:Hi%12W?s:o-e0jJl=jObYi>W]_CRrgI##T2XF(Bm`Ll6'iI`u_RMq]H&ma+I\l +-hYas#LMC=o'diG%.Xd16AIJ+%PJ]*9^7&OSp\A>YL1_,aT^u!-?01d5Bq*GDaPFK +,*/BmV=[lal__Pfff@m[m,"]pIWV*j4lc4^)YeQnj,)=P^?jVc_#NASYGt@rCd._$ +nDAEcefOkaSpphA[9imsq6]GQK*g0'7:(*G]&k(/c$M0H>p:A^a^6Y?qWF32(K\gV +/%!+lIo`#i1F>'VMC"_@T%:R"*SqQ+JH(BddJ=p*]hlGcQTsR\2CT;\0cbG=cPtd\ +5H\dqpVQ=1?ip*f_]=F2/[1tXCaa6/^friZ=[V\fA7LXo=[gPC`..WFP+hl4FZ\hqJ@eIhJg:!WousQR!WFSm8iARJQS[= +IO%^6TH_tPl0Usk0)V!Y:-G]m*>V1[5WsJQeS.0;M'sAOC'P#qK$tn+[EH));GO!? +;`DpJ/>ojN;VT5_9uC[f&o,+5njH*!/8$e3fa[*/hY*K.^14C]&e_BZ+PKn06sUGE +4k^]GhW)'_?-SGhPI$8dRf2@[a +579U0Z"5"9hYDTTF8NN2gpuTRd)qCc.eqt00f923;&Z+r+RMFo.9#150Ga7 +jd!s]bi*g/E]ip'*ebT6U_RF9&QBI3bO-G +b:)E0)!19Qin\TP9j>d#7q'0^LAfbsnu&#*Cu>e*"ljd_Uf2pn^Y"3LcA[lgdF`id +"Q0klJ`[$pd4G'H/ENm6Z^.BBaOP.ikuY4AJ9PB_4L'G^jL\4>bQ2P8@;?i=YJBF<#G,Zm>GTGp&P,BI^9%"J+KrL +BYRGVfXX$@5?HuR?Z^mUm$&F)\'GB$Vg0N1\W]f>oNPn\SLW[7Xul[XbLtL/5#`G- +I*8eWACaj?n*@k/All-*rPm[4LtjCBF:G`0ID0 +-PU-R$Mjd0j +LM*RgM]=QI_*I9Na&e+'BPK,?"F_RBkAEWB&]% +.Wp+`>lkOCk=ISbd^?HEA`D&lI0.,S;dud^W`Br3BT^h09l*gWnI*-^/tgK.dU;fp +iXDncHi.C;f[[7QYH-"KA3#._If<.AM;P[R8F\p/?GC1VmMQ*K-p@PHqt.q$5G2>* +MneZ_Wm]NNUmb,G4Ha_b.oQH%";,5f"a+\ +'YM,30oC/hERMiXUjcg"YE_*J"s2:1aW5A?L4RPK6QN_dR,/8b!.q82WgES=Pm9K, +-a_T+]?kXR@],dIV^FiX>Gk56Zr+GOPTJ='.)!erlSYK5U]?tt,QRDmn^%MnrdPbp +)Q&@^2I_G%V%"J^A+kOifQi*-mJqp.eZ2>];l)=fZQYT*DUKi?^b=!L*5Dg(_"VbV +p,Vmm7Vnb)i3,giK3R]05kAsiUG8rV6_;&Oq#!#cE-j/2p/Ls"*N<2,g+\rc"HOuU +C(6t3D_]X$XK6:QBE>4Em_S?n;d-Obe2pEshB]!Wb8IEsDO4DVWtP-I3:15J-4.(s +N)hTCf1@s#1Zpa2DN`[8_.Xm&[&`afAS%EV=Cp*_8SDrg.ls:9G**_J`Bbl^Yes`) +GZ:oa+NbNEV=`[Y=pRMN27//PJkCI4Tm/eWSC@Nnd3!0hJq('Z"BKZU>Md7j$KNN< +E"W4l+CbfVhJY(6r4N\m"[@GpfEjaR&b#I;Yi:&`8/e^4TVT>(Ha8k5+Yo8Z7#BR% +:SL)Ar8D)R.dU7jWTa8^$Er47!P_tN +qX&#?cMnj]j4.j6p@urr7pqj0!WM]'dE1;%Ae)O-fU@jO)Z,3l[c[%=3I_jj=Z=XZ +I;k,Z] +jAS:f-[hAGo"I*OSXaBfgh?G6-oZsfE5MX;!1a(9^rJ[p]7.YIpHALW7ClPh\5\.p +.fK'jl0$ed/E;+"DMc%aRLZd"=i]d3B1QX@eMb7.9d$hN +7\*[lF4h55U'Z?1&Dk5Ba#icDALcjGaQMU'*mJk:NPRh7\Dm;m):lB-C.0ZYRg4MO +,AV+[?OgMmO$G-!C:43;G-_dL3DRBY:)D4TE\a#8mI5 +.c\N;'ATp>aUB9jX*Wns\ToE$"g?on&),]hbLr(@+;s:P=7FlrBE#L1G^e$CEWH#e +Fif687PCO3"Mk%M,mJJF2da7QPr?IfJT#1>'r%.h)90`)?adb4/okN]Cifds9dRta +04Xl"&Ej*C*Kbi+4pYt3'VLE#'%^QNmk>E%*K8qprWEKQ]NpG`;\%sJ,&_k#2$3\_ +k"WY!$!X95TF[aiQ0^4eF4'5s'N%m1?S3^pWKBE(``;cKVi;^06SKm'Lo%Yns+(#oa +m$dYG0D5ctJcCIg[rc!4;P3h\mJVf(k^b&@Z/55+ilpdS52q"$0Br',R&f[F"96,! +(jj.X>"SPg`AIhgs&l2_BqaKsU$8`ne#IY-/ouCHIRXktNb"D,5ug2:aUOhh6_FGS +DeEcC7#FG0W$A:Z(56ll%B9TU>-N_iZi!Z3CE"'I@=Z+Y3PN^()4Y8i"H;&JK9-Z^ +.,@E73$X>!deO:X=Ei]<)-f>c#iomM>UQL@)>7Ubk7;]'/Xd'+KeBdP8jeg"<=*f& +e4#Cb>?/:NX"C)qVBOff3;2-Xf3=Q'&"$X;S12TIR#qT +0?bBDZ?cu0%S^[o?HE_eWh^sd)2)V;JaqV_mf<_K1&HP%3bgSpH?d!M2FVZX<9V5K +O'd4YIQuobO!4O-,Jh,FPA2]A:3gl^,,Ibk;?n!LTElY@k_rViZ\I0@!>k=6#(12g +9h.:a_#Hu0o+[s"amIR`H9_OrK'mVNdl=1!_Q'6h2G%&213UhTX(?n130`8B&U$d) +g0/R3]q1O5OVr_9FEir09K^08Y`7IHN;5baPgVqni/^q9dt2VhJg%?ZIgl;nq&qMW +I'Ac\5HMN<&*H/=*_a:,Jq(GbhI8[c1.HNTg2GU7a8+[U_L(bWi9pg_kT,TTE,jjP +q2b"9AgR:>!;n#6S3O/3@/^3+Do.tUjU(hq^2PnPk[RZQnU0&IC;J#1o$75:+g! +(S18Bj*MrecT4F$SgL\UE+>M[B:j8(H(oojgo10ZrelS&$d#$X9BS%EaQ9#c39^Nb_RnJUmb*`*3T5Y(#a^,K6?.ZOBc*Npg]c\S +'rZrbDuR@6PXi>d+S`S.r3*u31;^.UbbY@b?si0/%t=pYl_XM?6@.&rJ%*GpqNJ-j +)^>:/Sb/hEIn4mpN2Rh88Dp.kSihNeBh5Jr[/ +#nTeUE$\Q]0^sR\2ibn)APTAiW7H!S.sXb&16-(0AgWP];Io^E7E>>/g+TM(kmHHM*p/N(&r07JBS]`nsZlP*jK>&`k!?]\: +0"$%\2mT$UG[@P&;.Tgk"8VtBF8G]Db@ZHGX&AuWP53X>ZpF35'aJ"1<1(*$d:$QN +qE!2a)R>NKChaAn7O4/#M\P+FS[8u""I:jjn=$ai2;Xf@*]'!7!A";uO7-%cAuX@e +Ph>fh2J3rn"U#^i1=jij]g.A0/+2W,5dJ0H"gJ(,KDu2U4'=r:Hn!i2cQ9Ql%o/>9 +WkLL#8alPt*o=+j++BY)hoXJdM3U`8ET$jQL3tLEJI65Wj'/n\D2)kZ/"9<&1F=rZ +_]IN0Rb)e:\ql,2n%5p?Nu(-OD4us^JF'bC_N6*_s@7#j[>WZ<]&-rKUrl +g5J(o(*!7Nd_9"c=ilf.6RKkp>NSMnl3$=--W6[oXYW8j&gKRE9[=.(n'Kb;$E3B,&Tdt4WFuK +X[6cXU#_mgO=;"SsPKod&>(0i#>*iUD$4#^4CN4.)X^W$(Kf +I-U5'eet^gH!$Ve!=t=-OF=QnH)?C@&ue7hdG0EL1S`a3,$_Du>S-hN#_c]?ic"t7 +^EiGg$#n^a!5NqM,h`sPB`IfaVuV:m0)X]-E7_Blf?t4sdNCkf^qo:DhK9-)i#)_3 ++8!PMg7A"X+Q_!qHEDePUuun&s382b")$--T.ob)NPZ:>G^Li.jq+4B^[mkn"js-0 +4(_t34#j"nDh7h24.o`jCeff+a.R$^@ccKa5B@P&/9$^ep&?Jgj6*iNrbH(kLugB4 +(k,9^d"8ALo@$?5nGINVkHh5_XXdETs(h>Q/(T\p1NNI0"p"FV9@g"PL1`d<*')pY +legR2.%Jr6TqQfL\f,UusflsTl@4i,;/t:6)?FBt6+eE&JCm8U7neCRf +,5;u?Ss>cVfQ3>I,CoUI.5^JRl(*?Ep,G&3XaJqoTme^dM:u!s)'K^r$A"DZl%De= +'H5RYjQ9DuIrLu:#*Q6[N>gTG-:g-Hd)75m$p=P0Eu6J00nudo4Z5q$;MGn\M98>V +UNZ2Ng0Z0:k_&0nJMjb?*F%=OM>` +`(oUGa42]Xn'=ln<`jdM^cNmXHh5&_$Xp0_YZ?*9SLq'8lZ5R:qV1P(?gGCSGPXOG +GWr@%]5'BM7s"\'*rjK9:JAK`gWu2c\=`]\4"7uF)t1gqIjFQ=Hdj.Xq25F4s8LUC +igOGjh!htpps2PO][a&lfs4-Q]!a)Ug_@mIR:Gj\Yt^o)pqP%F>0g54bLLHA.Miu? +dj\SO$#R!Tm2#9]G5=QF]uEUcgW)K!$hsI:'!BuN;?1kR?Q@c@?2-823nqu^&T/e88^/[G0J;<*4.p-,T#;[ +!j1#"HF.C'TETS.-p5;2g^Y*Jh#EBYnd-3b5jA=o!E9;q>I]NC`D"g\Y)_f&$XJG+S!+JeX1.B?UgCk.UfRRVRF'*WOGH/Dt$8h2)SjjOgu+b902 +W5krb$:r!Xi8i31"p"J8q7hJF>&qI$T98%8J\uu@J03^1o7)h=HP1jm+*[Kuo,h?8 +kPQ.lnT_D>j1ie;2g`9,$,1o\+#j4>5(!3W,6>m`j8Rs-o[-LmA)uhe,4^Rgp8K"a +B7DK*qX#IVrjd/'i7H/dhj'eFOa[-?j.jKd".=]CAH'=d0Yc6Fr9&Fp'6q-F&H?%T +I_c!^,%!9Ne-dc<@X5O?cF^oFai=^%T>@W;q4ntkX=McO>o8#5-fIl3nRs!>P61U& +6I*,.JQIEL.p(q3bk!67%iJ^g:lZ?f*Qq):,*"[N'sUOOKR1RJ#8;,F$2G`t_@T'( +S%p;b[4L)BKkP+g.Z8D?^#mnfU90 +a2dqLZUSY)7[%UeO?$4C77Ch#P1l_)1b5PBC0J*$dB@-kBXe/!N8^1PfmJp&5$,Ig +#J`.ren01@pc8q=K/E]s!<.-FCZDsU_&p(5_qKR6StEt_I+fBo1;ifS$UB0Sb-Y9F +=Xht+<>sg79lIdW!OiR?k5Y5l44o!9r4r4>\-;&FaTN];,,!Eci*WQibFY0cN2Y_T +jRK/TjD*9,F6$!%Y:>M2^1%?H"8lM4\*mS.4hY=X^2/P-"\j8bIJWV:-^]C6fLg^8 +.8RZ]W7o$*dlf394>#(-$`)7Qd1*@,.p"gYPCOZZ'-`HR'cS;`RELehFfIb;fR>n_ +^&l#j74d=Ge3D40c`tKk`,8g5f#0$lrsN;T;Q^@K'9\%QT`j/bP)+iH:)j(DPrl38ktq342YfLeO@,g*JXm]Q;R3/53HtW*I +A(ps>%J]D^^uY$`m_U!8cTOqj,=bkL1SikC=?#/Xq6pIMY7D2J]c2Ig@-lJe`-qZ7 +dS9I\4m1e=^GER7@57SPE3p6f? +&EGq&rn4[H\^^%Y_4PM2:Z_h'2Kj_,dfJmjR40ijeHM`>@[WcGW26kj);VWNZ2"fb +K7hSQ#?E/Sf1tbT%"A\'nL7a=C;1(I09aa<)>ZlBp;f_kZ&uX!j(LnaC'PXgN"-?) +_B6l@s1u/`.:&fm'R"6[$qNicb@K6meC?eE5+2jNm/[O/Fod?&Df9)CGB,$[b*G2a +k7?kASLRNqNnON-9P`0V3W],N(MKlM3^hO.07gj'4c"9RWBJCg()4kbMM)1*pd9R] +pUTbi4b&b#hjo_=Y>2/&#r&0alI&m9JGli%h#An(/V*eVPa\kQa3rJK.8#eg<"BV7 +ATpIk$G\fD$idY6N;=uLdo:YJ,cP::g*'t59e[L+l#fmI_\B:W_JU4Pe]93YrkU!8 +:6*XFKtNEA4kf(q#3.eX\D)KphN/gdEq/#H^ECo30>)S"s7hJr*f:R-hceRH@o!.c +Z2P=$=K +?Z;\u_l$>lM>5E-!9laTqMC`,O2^WZZD-1hL$m+iFqFnPiF:dh6>d>X0:5QI9IL5l +'F28.\%mKLnh@G6o2[KJbC$hU]<`c'?WiU4ap#XfX$Y4>IsEG)K3LXGCE^83'RLnr +23]qbreH`fLt3EbD8:N&WHf\m#""X(-muL)l$XIF^REWTi=FR]`b,\?oD+:*!rZlJ +EALB"Fr(Vf`?kX^o>YeF04l`s7$GDI0ZcTZKffNf9OOn89lf-kYQ4UkeXlR\eSKeG +TgZ4jB`s4+IF\%8>^ceT9BObS_b-2&^"SFhs()R#&tSj3Ck#c'SEGs,7Z6g#=J_53 +^Fl+*;5+0f_sP4>D?"\-Yu>5hWAXkYT3o';n@/Die_KJok?m(6p&E>f9rl7%Kfo0/ +JTAG'[tV5c7`Cu;;o!??mgT"#A&LhU>SP6Z?TZ5?AcXsc>_89AVM4%g#4eV^JdHu- +As$N"e-mdY3N^=flC6mqY%E;1BYhs=@f%/Rii2`))1W+/A=>7:U^j+oaL!+8'mR^: +9N2Z/G:l]]kE>ZM+a&OdH>@oo#%+qgPWgbI5(dd44n_jRGa58]i@3s"'53l#1:k:A +gWl0kjc%iK/V^b_QINp6N"IGB8a#iGg&L"tD!,VFa)lQ]1SW,0->PmF\EB3&%gp$65e?r$dae)$Dgi8t +dtaoh$'>>;?bX1UI/U2?ferAEV.ljEo^?P8dfL!RJ%S#&&m)@^;QL0=Md4a]E&g:: +pPdhI;52I+r/#^Q^^R2T;ga'B^O@E*GqlYCb&0#?H`+3Gp<3gfDpTsRRMV#h\\0>% +cSTPCXSs2H@]/qYFeQTunGh]hjGuSfJ6)u,N9ZU15m)P. +Bq<_3!V#oBUdc*(7?c;W0A;elSU,;qhPJ[nl2o']&_lDE28F]EjC:^u5T1X/5mMlB +r4brcC)9NT$K]Qb.>rEP^.D:l8T!)-3`P@GMUWt1\K/a%Zj6/s-5,R6n=]qAQQ?98 +d%WSL2K`c(T%"'r[*l16"()!-#oN3E2'2OJ/E24-W<%E'l#"SMAiUHkIlnhiO:Z1n +!oR+B<]?.E.jI!'q$.Xb:si+`@lY;&cVCg%4oU#Kb70>8t-r41VK+4\*7Y6Wjsme?\9SoSD4ET;AT$,"Z;:UZlg[]aJ4NuQk@3WT(jGnDIf +#cT0XZ(DW&4skq)71jsl-2HmkHJn\u\AR!6+6?Bbc"EY"jI[sEn1)QP0$b5!BT4DV_&j`5=Ju;TDj6Y4Q3t%+\Ppf/8Y#_%ja%pG4#`Z@c`TA' +(AVr=!9_+%Tj+MG__lba2$Z,@bu3@qcBO=AYDfNKKg.>jZolO%grrjt0s8(mEc=PaBZ$O)c[9TY6/6&d+l.LU?+-Nr"N3"0H^YZ^Rh2'k7@(>/C<(< +_ktq$FA,@R76OBR2=oLbMts#!qNZFCn:+Im^6g'4-cO/T!.V@@,b/&r9[%.E6Y+jC +m][q59cmVUNGFqTn)"[ND4T@3>I:mMic*t^O +hr+"-ZhQ[=ptRY14pM!J6Q/\523VA(eK2j0IR!5^_:6X5@rED\pu+cd;^k)M.XA952S(VhD +J0jp1MVuf4ESY5Mo/se,_J1s6\q$`>X9j!IQJXon/"Od%K.I#qh?8u&NmG"cnVU.B +/;h=e9qV^f0adY?G$lJ;)cJgpPD@'l)*2K^A4f8O5j1UBE]_-"^!BC-fPl@];dI +EJhg0gg1Gb'=HgF[fHGZgEs9^NQaVC$Q`sp)&!0:X[c)T$UG\?Rl\(``'kPB2]?pb +aQHU-f?](u^WE2kWfnAZWQj_8Ado&X!D67b4LKX$=9fH]9J;r,lfP?&HEOG +pnJkgoVP3+NKOc(Y'i(->u'XGcru1'[6sST&aD^im@fEdN7p[1p;ek0Ia9F`NK;4. +#4)MBL'oAYAmtbsO;U..Ke@>u,Q=Ie>JC".hcn`! +XVh$No(6T;As^:/I7io>2&cnE7ddi3Abb@.:)7>_!W"^(i#V ++8#(_&f:BV1[25.`pr?5W#Z&kJo,ae'/3NY-k,,krH.p`1Q3I-d;@p0Ckc&RN>0 +RH./^o[!)RVi-6MV'9i66G>r2kDLn^#nc]+IdBp,fXpLcI9_8'Tq@e[q![C7jc:Z0 +2p`QUCrCjN@3D?GY/Q4U-q]'t\-bKcKVAp-2rRpK3C8B\n@p4gdKI&%&D*pi!X-gK +_GKus5d[gr*'h%!H_r%$C,GUgSCfccfE`XWXd@!bB[_9doH>G)f:5,9Vbb4reHl"f +GnZ*I)J%Y3[F:Oa#AXUQa2,@#_6&nc@:bLe=@3S7`,lcH5PSapSH!Yab/FDk`,r0! +/safDb83gZ5lUG7AcVgOXAS0+c"W^Gl^(;G1hs1VY?GC_u:OKJEq3+7b,"egQu):ojcF%jHh]3!'%& +AUq5tncC=a^d@;i[g_a2B$PG:(W>Nb`!T#?8/eji2]4tuVc10-\J$K]ZCMX,?fdS2 +Tkm@]$2i]C:2[9]i2^3qBi[bl)sjim3Jn\hQT"^!<7pRUG3:'Yh\'4)%XR>pBO"*r +7FPA5\nC$6VrKg;IeQ<,I66Q\$X2g%Y&a_(iaMP-@dq*M%=C8WeM8/m@e-^$H2l<5 +XR)k`bc_P?0#&5&eWHZ2hN.]uB\H2T6j*22^ONK#q?@)Vo]hnD7ChZ.Z!f.Y]p:6W +c&g1Y],iJS8J!b,:bqJ=1&brHF-W\c.9e]#]t;Fj?/d`0dN=nAc$"Q>M;<%2%p29< +&9cIB>de`$@sn#U!,Z\84T]mBg9.:F_;?;?<'2OuJA47W"UQlE3fW2Q1tA&EV+j9d +?Sp1'2I`RIXW(.nu6N&p1V'ldp%#?UfYIOMs>RMQ;l[f.)t'Pf\'JP^6>E +K9B>t7KsFi5Q[h(NPL#d59=d'IlNkQpkJfcPA.-+>+:c54@lT.(o>j*(lq\@7KoPS +`p6W1*3RK`+ZCT2SEu$ODB\,250TFO5oE6[HYjOKZoJ*E6[Y;M2t5Om3):SViUunZ +c`WJP;3/cP900F.ml,(?Kg,^qM8LEe&W%Q]57G7AL]?4+nXK"Knj<[lIGX*N^@HpO +O1d0;:uH?a_uW*+6SW!kd?BUP1(jQ$.e*5Dg^!WSkDc.HfDTVfHi7&em]3EfeVm;C +1%-lF#c)Ntm?Fs@#QWc&-,XZ1eJjeUTN5uYDfe6pG_-M$$,QK`=3nc:*Zks+&%Mf` +gE1Y=@!^I\]VK%H3pQ3>,Wo9\nc\`Sn1Wk/c=Bd:b9DDTNBYPlIYZnN`q"32qRQsF +dHgk<+%e..`;[B2lgG&U0*i[cJ-oZb(PLcj!iS@]nF"j-6nu,W:_`0r;&JFn*9L9? +i`[BkW!GdgN[[LbW/EVPXXk1j\5[bpY"@VFR?&^oLJ]GRe.)qm91oDS2/Hi_)4AB3 +cENqrNge3CQ_Hi=IPKU6&j +U7mQJm*@0*BLZOH)Z7#r[11Q*Gtb=p[=(V#qRfZ'W^OV8u/APFfHV)u6!24i#X +lC2FGX_+e +h/e>#cUG=s6Q7VnNI&@o"/i?[IUDm;6-?SG;JmIGqYEb2O%3,e\A`TF?$Z+>l@4;S +hS*m_\RPB8gA\D-\5T21ade"u!$kr(6]O+DK3SD*`[)enrjS#jH<-j!c<%2]9d1>1 +[Q@#;1XlW1$E.N2fEW$sjn7:^L1dfgAe#a>"htQBFi,.%W]JBGT')0\E^rig*h<7* +mKgN=J?f1S(tsmV%be.]+Oi8*YsTT36lXm:*sXKtU/`!eZ,ONsdZHW,Y!]-cS%ra- +W1>8M4*JWD)i]9>G(\sJ1E;T_5lrB"*e9]Hd_!cR?=;T3l@j`r#RduZb!b8=%?taQ8uk(J&[DC"W=rPb2N3>SkjeT\ +@OV$>7/4I;kXVY+3^mM;19#FHiJBDbiFLp]8-G1a(MK521ru&_?dLL5@@6n9S8qt&X3n.4-Fl;1idm6WL?_0u.*bb]jI;_$ +.o$Qc`VY1p#HNnEgY(o"!.jRSqJblYs7^,@m,-R03-DKhS)#A,SA6uJ@LrHbhL7+s +e5IU*!;h-@LCYQt04_h#s$77_$aJGP.+X.qisjn`gZBSbs$818=K\n6Is@,T-P,us +^E4JBKUVC-(?;_Nd2+_Lcn(RAWrqcr%g;n3EQ.+m;NGb8?X.#fSeqDj.tBn!5Y*t( +83[X_GN&FlZ+l_+J+Gl,Yi-'HN(-qi+MMt>r\&irXh*b +=>o2-!WS(@9TQJQYEB',pJZbXdn>Vpc(UUL/ +mo&QQW6hF_2ksNUXApnulT%p4g%@Ck)lgB+Ds*0b3(&cJ:M6Au&9E-fV'7ch'?YK.WDj6C_`LKc9SYlSY3l`3Dpqm9h!m]D7([76D +e_?AQ=Ri,1$M4h967l#bC2?n;SsGhsZBSbW_>620_e:/f/m;D0f7F"n6bkd9%SC70 +;,Q(n/fGppg)j`9JA+-9[j73aO9a"W/b[h_A]hehO:dI[rX4Qp.mnSX='^>D^VIn37@R[D;f&HI#hoRjm:CFBmQUF_%(#ZqMI. +9gS\YptQnei^^Q"Dmlm]\X8DbPbI?_cKXgV>@8K@h\tter4b%^`>[TB$\(:tq>L90 +iih79h#&;^k0`7n%OZ^L.-[4F'CVG&/sd+Hmk=Cd5<)tuM)O&eWjKDe0`]aTs*,<0 +qu:qX'-&n+bF4#YD&6k_Dq,j'Wd&8_-s:0UcdTLBUh1RBq.ZPh7Cd_60PFnh)48)a +eps/KA7ptInKhjQS2CY^+7Kb\?t0W'"]t1OU4,;)3WJkZ-7TIYHU&LbY$5V=Z'$iH +>nV6d'ibM.2^Gk`>6)j+2fgl4\u/FE'IhtC)qDk2[.-aYbsJh&cJ:m=gh@pUR>C79 +n4/ZS:Xf\F]$tn5HM96,W=jHIBsABI5:`$[1FK8U&ITCTrd]U!88VONX.I`LfJbUt +5muThh55<3i!ChqE2t1kU:jsa3u[JlW)HnJj6MFds6T@WIDG=GiBXaN/WIE@:9GilDJGm<[LBEAD7T4(ldN68\BMg1k!UU&s)hJ#V +N5c0)_Z]XpK_.N)D4G-\8oo>*(Ye@sY6gseZf6E-Wp#$6i:,XdruUIqfJDB2%*T"23aU6Nt`Yt%rJ#H0hhPR@W6"]Rc;n8q)$AN[5- +`En5!2aW%%Lp;m]a3P262hiO&NrT08^kEmiJ<8g+4+dqc-NJ!*K+J_%\c_ZL!aNqH +h2;?ii/p$NK\R,_ESpkB[UL>f/&!AL;p,CpbmI@DQI_a(n'S!CQl4pB[a`/3K7m=P +mBu&7/sRrQco%5.hr9Xs*3FUSSO8Y.cX^/@H4'g3;i]Sp#U>nZchLuWtn\1;h=4T"5!&4GG#XEN_5D\$@Q42q@:3'>$RB(aB@KbpucVqZ(\63NNb`UY* +,Ok0:P-9I"#W3VS2f9?L_4#s6TefMs#p;>mgL;=`eRFaq!W55:_#LV!.=kH>_?kbC +OpE'SJ6:$_grS$IMtK`U8TS@-2QULC[B90ATXjgpphi<56oLf<31)8 +)Zn^!9`6/XCk4X[_B,6pGM1GKVo%j]BcV8brWRWJ6?8DInF:UJk;$NU*k"HX=We7$ +VY"U)*fQ`e8UBN3;p]$$ABS5*cYRFdFC`!8Ud= +H24rKG(?mBn]$k_#lAk^^VC7_A;ih"!_EOa?]j&oB,2Tm&3<^i+h_0Fd\9?K +eu#m.OI>?]$=J='PD\.hUNUG#1/WfN\S38aEIYdk5+g^t!_.eA(_?Lb.]u73gc1Qq +.uS`Uhl8N<<_71+dFo`XZo/euALt6<0_rge9$Iq;iF(+4iPbU,Bod649A%K6N2?n^ +PD!7(7X@$[Y*C\F7Kq$MV=![0]:rEbbW*A]"TOE?%0#d8B`FrTg0WAO*3csIk/@&- +1"Dk6_]L*f$:^6bc@6i53<,CbQ=>"jhCS?t+9(_#!5;pW\+9,tMa)\AdJmAIhlANO +\!u8]s7uT24qE_K639ABN&f$,UBUHdiX9*.qttgrn@-SiGHM,)]+K#ZUA'`EkAToe +Q'4GTN8DS]7cp6/mE5,lr]e:2nNRC%!HnRK%a_)EF%JFO')n#/i$#SUO7*&/IFlg& +GJ!A7HQf9t-i/;5M"s_45+^(`;jqh0pg5<=(,O6KUn-Yd*i"C;OFG$2FInSCQ9[Tk +C5pSciH$XLo7&\/b!:jBMC&UR\7Bos]brbZm69uN#;3M%T]n6r]?Mbn=d(%:6FK)k +"\9C9rEY?Z>`8OS(\kV[4]qdgEUZ/3^q4&?[lba!OiP:FU*qVX5K[Y8<6Q]aUJdn3 +R@%K-T$.VUjUX@l-Dh.rF2a?gI&Su=*,U657W&'3Hfd:i+:)3F"N4!J*2iaM"d%NP +?=a2m5@:5'g,LMD$5N>f&%I&'5-P`g&+G'leIKf10@rPkLS%kZ!4R/)=gol>9>uea +4P=bhi`V*Z35<6Le&=19KC167C*9'SjG[u5'g!^T_&mU^L2)'Q3aZ-um9Drt_;H2S +^mEoFq:A^>n3RN%WeCKXGk)Tj:#NHF\Q5lL?PFdi\I*leEjfF78$sI-?)c4*1,54! +M9ZfFkJH0S"N,05!-YFoSIRE,"efIu1Q!TOVZtGa,9[AF=>/4"HI48] +n/jUh?rl5q3I>Km(UY(]1V!SD3(LM3d`g,e$utZhfVWpds+YK%,?sln7J$P'@t(?. +Ya-Hi(+EU$COqo>I-J(1^;X#FP6TE+/(VcM\]^/cW/Q&4.N4dboe/ZBP1!hGHK%KZ +>[`Z1A*22EB8HN88_r+9LD+Plou$EkXpJC-=#M[k^]**\nk1euq:-e7 +b=^f9;"j7tNBB&i#Mt=QOaJrX"\K,Y!*j@%WR41\^?-joZIM/S60K($UN=q93GSRN +V;"=O[8P?X%cm+n]hU10.RPFN1Shg6OPOX;/-'Df_&c&[V=qc]+9oPagoa4a1K)V1 +<(Z;,07J:B(AW2!m%HV>%<"oIIuOrSQpWijNWok\:j$Hk(o.-mC`Is`+K +Ej]U5fIes4!DR6cJN]g,ouMtA;oBGoHDd2?YM3KY+Q8e^W#l>Z2]-XL393iPJ[=MM#5EZZ)gR*/r'Wq;;'\8N3S3SPb.q@;qqo+/ +E;sP.SSI&S$I4&K4BY8O-mrms5K&QCkJHq4kPDarI.?`5W;f5>[l_pZSUSC$oaE#+ +F4\4&DVbWmI<*:!fE\Q,&+B8loRlY>+"$l7`(p)49KS4p3G3Z&A:!EZ4SY^.bh17j +Jr[cp*_8Cb83B1/3f[s1aJW8k-dgU%#hg^Ao[DIWK/9G1Q$Jh653'f=SNGaVo%]#n +*Hf^!Em=<$K9S[_M)?27^Y^prg%=nJH!NoQ+qm-C[ +`P."QmrpDgGi)*;*+dokF))KVAi[P'cQ9@t,_126`mAi,KKXP'S2Fd$)REt7>;O9L +s7VEAl%1?srhLc7B$Za:\fe)A#P[p2QRl@-D/8'q1$=TU=Nbf%(QH&'qc?X'-X,f7 +[Xp(9%)dZj=f!.Ak>\_IOB&Q=Y'^Yr3Fh^/==d21s83,.`.eXr0Q)HgY%IT +,2GoA0@$e#AH]o3f(j6WlC]/61`5#^\E\HaI0T6H(.XbiafP:h0QqlmK@8/;h""=,SW<:Ga0(Al@J% +]CW#KRFC^&>N9't>@1Vk]rX-*^2/-nAQm?FYN77BYVI]8k*)pa=+N7bQ&n\5H#WRo +FE"bP*iEI/tW59W=5ISIfPZKh.ND4PNGM +OjPa.2Th3J'WFf19"Tu1!fEXDDaSB6;d1Epaitr"R`))nd/3C$>(';L+h>i`l,.:5 +nXV:Je7);.W +SP!T;ML7)rFh^0%p0br`,N4,=!<42MR#$2N(B"4G!N\O#8Uuu\5"01JVDk8Q^r[*P +!eq?UN?mC#+[-_f5F+(ia(Q$DA*NZ7`!8HD56pD5Q2/,ar14OAU+e&>1Hn26Mpfi@?^CQf +GgZ!2,`E.)$%55PJsmMW`VHfH.B?LA44(XcGQ +gdsiR-SA_\pRONni1gegT,hr8qp@M)a5;sJ3(aNA`_SXeb;]q\;_0u%0CT\'cSH51 +&OVRIHQ3GTi>2,A+oGhL1)bM`2?"8UKMPm;4s<0:J*N3lR7lQ&8/bAi7mT9*P'5Uq +6ie)*Sqif^_d/(9h(gUm,OD$IE6]"sB*dk1G`umlN"dQ>^3^e7qo+!hZM`P:6W!hU +A3^2arqL[.JZK67YJpcie%V,[r2ItVt +2i`E(pr6,kOKS]eDrp:cZ^'"0YuuWg3Cib:df/7#%FDeOVqbEr)m#2$="Mg8aTI*3Smt+])"+Xn/Oj1W3V@6#8!p;dm-WI@C3/]9F7i8N2YB^H.PU +j.Xt0&#FdCQ7O9;HM+-.?f0V1h_77/Cj:BYqY[(%X%^-+JDN#Fi/#d"+&r9XPCe7W +EGrCdai6f4G.Ys(8IZ:;V"DooLM\KrQ8E\%bJrnX0`"UE+VEQG;%' +k`'(d:I^Kg$me"QN5%Ros5u*+hDjVjKO-T2DAZ&_kYHQRSb?\,q +>"&3k7s=2_hh]-U)?4"io%$QhceFBXDtBS=kI"B/qLA9ijPtZ\I(oXAl2=q[#9lLk +-cR1gO?UkHS?C("HaCfRa"#Em073_&H2d]RP;i9/P`jnLNHQ*B&bnOBI.)Jcn\6SX +oCkSbSQY+^j=^cF-OHK=')[b&c@3"te@Y0soKM7*,;(%0]Gp^dOX-Q[=cpb2dnUX^ +&HD?HVaZQnFQ/.An;eeH]^L>t^ZWW?T+>3)%MAUL]*'-t%6q'# +6kSr4+n?jEoJ'G,0gaTl-p_74G"!m"er>1)'nUde^d7.JZ,$.\p2JtqE#!Wd6f%%s +On??m7"4T\r*=mO)$*hBU?Mk"IP1+=pur,1%R#UulsbDoa`oeaDp\o=9pqbW0nTEl +g#Qt+e5!e]nu3 +!WM::Dj:WOmk!#JmFm*%-n:4lhCZt@0BL=7IiS#s7<4TXe35B"gFgp+Z%&=Jg!5]5 +;`iN,[CXupYl/gab`+0\(\"Lss.\<@ntPr`.lOd0;lN,).5+hJWm%+_ph9G^1'9!k +/QU15.cFT8^M)K&2P[S_f,P>tYM!""Ff7JO=+R5H@P`h2m*Xp2`HI+&qt(4`fIHCjD49q_PjGJVK=++/M;VG?SC!3(LfJaL$JJ=3LZ>' +NsLgD=M1Og.*H([HjL12)r.ttT!64W:Ql!L\Dpe=MOcNI?^K$Qs.'f$B"$]u=S"#g +n175G/Q-JBVA=I;Moe>-PVKDnNjN[k=H,*"hE5ufNO#DSYLCOCs-B&'\b&2Gs11HN +cP]l[N1q3Ri;_.'/3j.Bn:)T!Fe#$p*ghuVSW2sBLGtTP*]mh7JH';5071X'g7jXX +e:.Df2t'Ups#3/9`VKPg#O1.6,M&D=?*+tBhk(ml^OaVPJko9nG0.*sY1kAP_E39E +T;t;e?_kIb4/;Uh79\2LY=K&d[OOaP@CJ\jg%8-3b2>$D1.rNOj-A**mArJV\'H37 +E+YcL=-+%UZ__?Z&2mo7^^KX%*G#BfF8YQr]cmSA&]d4UZ;!<57[J]_a!M1EVF\TG +8jXWdSa&N\%?u#TGJGYX5JL5f;S=XL$(uDjWD8`4KG";:,;:kL<(,6s_$F5+dK1kJ +.^gBD5YGoL;gUf\:fgPRrub*>TH,a4!U1USXNQ]^g?i;AWRI>&=Weh'^s`VmW=uQS +:]XN0$MRrtQW#s+oI`:V858Oi9mlO3;t^u5D6?P3pDq)Xe/]r"eFI8Mn8T6&SihR-s,h*;TddX8bbF,e\Z +s&e[Z4n-5WkZ9Vh^6Q;.h!TT_A:uuF*d*/Nahg[2!pn_/MKm])GhNf,TIK)5UYirn +^L%q4IVK;iTdB&6"0]5#o;nDXZrV.L4SW]+`$>'H?;HB85']9,a!9I%K:=ODSClbomEn5J($da +L&W+`s%1)j04gapp=K;L9uk;?g[quCeDIZhIF+F&e4J!0eX5O7-'l:j/UH$:P^PL^ +X?S5Br@J!,Xn4cC@^kH=NAA1L8^7b&IiS#d&'-DDTYu$;@g`fVc)8l?lM+E&cA^Ii +`7h>Sr84i73kX5"_fdR)`,:G3rq%o1m-')TiWDcH4].^i+^SC/&"=QlbI60J3+U,j +A4YAk;%?&(7ha%eQo[PQ>WA.QgL4$fUF+JF;p*dPiG2$h>#LmX<;7N!J>e)/Yr.`R +:&MK?UP'J2(0I*%54Cf9-oS'D3uPsY0oS?>Ld-W@D$^/OO&3sD#)UBZ;I/t%I$gNG +'AX0KW"a^.(jW;T;Pm$'*)(&LcX3$r2OWG'?Rd>o_#K6b`C*nUG\Ztl:5:a:;g1^9 +E-Z-rdbsaX2$h%hQ'(0d_i*[_Qd-&S\qj9'8<*jPqWI_l$N&s]/&A*hHbiF>KpR") +?dsH#$3jhf\3rBKeG^pf#p/P-QMbT/k6/9,fBn.;lcC!Y$K+,lC7%f\Ga4;+6uV\o +hjn)Wn-AsQ3-t)ocf%\+Z3V:PFMKQTP_7=-W)"(NWR)8R7NhXA5:A +`=i7l?>:7?'KA\M9MiWK7,)6Oo3cNO +mua7>g`O`e[R017-ELDe[S2J-&,;Fls6!lqjs7&B@c2arA8m7Bje9QU4.-35J#5SJ +VRR'K+nZM"[CUn2&W^DZs01*2L`5EN>,S,6LI.UDF,Cm,Dr38b?82Q]o57ZbhD#K8 +d[9osM;Y6p^H_/>n"1$dE>q])+U!.??M".OQ#,(Fl?3st +4s[/U`mbJfX0eg$Gr+6OQRNGSd"c]5/Es9T-@i; +))`_dXT9Ydq!3[oV!oIQQp);diP9TOgm=h7TMP=q,QODRKVg,q=NrA6\T2Ye2i(\FmSFo,@Aulpo_NtJLm`* +Sd56oXCC0PLVHb/;pl?TX>?rf270kRn7eZtrJ#jkl2n\9infq-8ub4MQN]MPrg*e: +e\Jr'c#!8.4X9gaM0Nr_M5HOfOk-3hf8R-p0rMA8`64.IRs#/7QP4(jj1qc#r4U=j5:3u +11k*/BP"$TD7dWe]uKpZ)V[8TS93NJ(U,DpYV.HV[NNQJ6G!-'2!aIa].\t6o0\qf +*dY*3EU5oXq&aOq'&0_0XkDK^H@G`">^#BShPtL(Tsr@$^"\(FdnjtpZ+c3_M=Wp; +5W^dLEUsl_X.58W=knG)]E=8sqZ:#G\fBScFMR2"G1/Td#.oiH]C_N\^cb.\@_3'e +?uQ-]6>XC[g&WG,NKKg7Ys&H0$$47;/(8tq4(L"6^Q0+LO<&&[J62g#54i_b1coMF +Ncr:U6kXf.*VoRkVH#"j;ljJi;:3F`k`^s-:]9>so/,=TD#WkXY_2+mSmTL5Q)/r1 +.!RaQ=?hr*3cf%L,dgtsfeaCI2jN(u51jOLDgte85]udbC>hiNdf-Nfa?P/oB^Xlq +r.T^@9*6]2#?NNmt^FhKhgfqeFkS67uc!g/Ob9l]kqH4N1b>HU\;LZcT)6Wpo]G9Lqb6+@AB!j[eP&B_ +S=jRNZ?7q(=)\Tf)33Zm$=`G^DP72ON3&`/21EC=p\ +(kV@_bNP>8ma`_lJ=]*s"[;Wn9%ua[-^Gk$X6?nsc0@jTp-($FJG>7K=HapZL]p$U +qBB]S;76@"FW++OZcE"s^F-^G`;jt8!]8kr!3X`j=@FK^h\Yua +6(\P+6XL8MgZ6!FTD!LnPl!R?#FCATCF1<)>sdjj*9R9X%"V0).LeeqJ8\6+4s@?\ +gYm-q.-I"gmQSO&Dfi(S#VT27Wd4j1*Lmq:glbu0V*`V/N3.k;5T9:%hXb(@aWIRE +Ioh!XgBr_^Wgpe:E;d$ni))T!M3RU&b(%hTM1a_sd:Mm9nh*d2$iaphk_$I.]="/U +25,5`"HQb2MJBZ9Q3[?g$`I?a+MM"*G?&TB/Ra-o!W@@hWD*s[@PA#-/8 +U`3q:_`Vf3*cMMEF:c#F&/>0YHIrhaSGC"^cc8?p:k<:uLCFoDTuD=""qu>D`HXG\ +Xi+kcV?l6*f$ar>6[f0##X!d18,PmW?gR*C5kfbFo`()d`<778Y`4nKA7U@IKq>+e +gM3eGp)X"ApZ`j)d6E#s`790,/2U&E(m(bbXc^h.It3$Y#41aRXIZ5C[TcI%mP4C@0btfgNcR&[ +#tXXC(?&[>Ghh;SSZ0MU;sPID].NZ!(pUO81UaWg*GfJg*b4$uW=@UY[r/h2e/gbf +YXOX#d^e3FWhs'g^l+^GRS_W%)EDMV5Ars8Y[T"-re*[73o +TK=/4i3Nj<$2hj>V-/\PZsK@ZE<\Ya#&S]aLPRdn]l3%RK +/.g8o'-Y?&_DM;Sa6q*2r2TF=%cP2o5WS=`e>I[H'\NamZ.#0\$R6[%DTS9 +!9"d-+Q24^((:3=B/AW<,0X]Aa69jJLnWC?<*7OIcj)3`mbEA;4MH.cVK4YiF\3dI +&iPdYV8.R#mjW,Sr_KE#K*7.2FF`h2A\+;c,KV>7P8RYFX%Vm_)[9IQ.gD__-g:_B +JH&;`k88VR4IOt*g&_-'7+RC<2/C&Y4+&*WHU!03!1\"N=?.u>%^-$1"24TK/%Pe? +Yft,]!Q5&F&0/caTGr6Cr"9VGOK"pG^S5&,-ZZsG%Asn^"SWAE2rf_sDu2#^J34`65rBbl&0k8K +J10?2$E#OLm6<1DqRkD@qprOfi:$j9)`SA?,$p@NTO8eWkO;1ps&!ji@t9'8n1!kA +54!_=s'@SG(U+D>o?P4q)^4JD_hWoZ2F?:g5k8mg6NSq<0Q6hBGC,I1"7T[]!V!Qa +rk%2LJcA+>nA<)'bZ-!8U&SKth_;os+or=[_].k@pB:8To_r4m^X7@n8Csq\Pc_)a +T*mb*%QZ'L=s"MSk/EHW_<.&0()F!R>M-QrZhNm">OQ&^g?G.fC?XVg*#)crag[-D +CeY^^alQ[d";tcq;2MH%lhktF[D1+t/AXVQn6UjiG3[]qlAumkhh9]taOk+?fW*!I +WlNt5@VEBmq"RToYJ'cP)h"ET60(n\n=rI%G'_F=fQK@0#Ij!c[apWB`iUE3=ET +]PRDLEp^FBgqUB-ZLLkq@g+HaUl'?Sj!qf^T,t]Fh4C-49]BsRa4rS5]4mZ-_iE3l +&)EJ]I,>b4FA,Lp*EA/#N_/W]l.t:tY@P^\ALXKdUagjFotap\_9Z+dr,>@X[`t^m +Y@K.ao(q4ll[Zh1-P\U[9=3XMl2J(hRUs^Sb5eu^*8+;_!oQ:m[ND%>'d3OAZ.G=4 +=3_64R;A/tSH%9,Ss`QZfE#(TMm-RHda5i[KeBD>*-cGe-^*3a)W3uGoFA#.aHC$g +-`M/LVJ.BN*WE9eB//Y(Q)/a5dRoH5XndBq.<,/-4Fp!'\3LN8GD5YqBb'^+:)9gq +Zhe:QSYMnO]!1>MaHfo,^$c?Y+3roW#+f:o*dXAAn2A&]mtJZojn>f%G-8jZ/B.;a +s/5Yb$R4hG=H1J,\BFj=FB#A;<"7.Q[&=!6pcfHl%bM$LIj)B4KOBC11D*NeG($AQ +E?B#LkP8dffk>=N8AM02"ZD24<=X:@Xk_CWKmHGY-jWU-enu]E2J> +.0sI?SlS,I1?8umd:jd6aMCK+HmM(e/ErR^Cstg0O+fM%nu@8/\:,`13g%uOSdr-r +*`)*hcGjl[ir$\E$oXC$1RB>Y8F6D-CIH_2aciD030ki#K?W3QmD.sL0b(qZYumt\ +[%ttF*gk0dW/pN_<1jcWE^:S2hN-L/+[p63pKP;uFp0u46uNe2G6\k,#=;6`3ZM!Q +aMl^1ihaFHJ;^^^&.mGei/^l0;=u%4Rd_eg!7Lm?1.&?V>psk$KY<'%mgag#_g):J +UDDDP$*3,qjfQ03/_oMPU<8%s-<3`F-hg&nmt2P1TB][2W'('%l/Bt3O+,d?ohu[i +.2`].0cI2RW`1.Ek_UeVLa[-MJ(c5#!XWPu5HNo%D\,#2$)e40)(muA.NYMC&KO(S +mWAf5jga%O>jVOaHnRQHIDe^(OfNo?]+**BRceS3GI&M0m^B8")ufja'sQFD!Lrlq +f.iljZimHlq&9sNE?Yhhs!Ro.@"eQLM``riIq/Jq`pgIPClg$f#W=>o"TF&R^O<0^ +rga6OHOT6OY`IKU3$6[p3MGWtD@kf?&ftF)%PUKH1J.6p89JLaT3t7S%UXa9Ub)c> +kNldVm%BAC;YK60r/E+Trt^$[V&mfX?Z3EYJ[Lo^i@T@.gR*H%R)/Y;@(uN:PIi5u +D:F#-C:>X-]*WPZ5/NrE<]4HO;8fp-XXh6u_LF]QfPZ,7%?iikVOS'.#r#q8>#9ZP +(r96Hc8I#!#6cS"gF/TSIHn*%W@PsUl1%Z.^O49!k?f;"asL6 +H:A"Gi;Bca)Hf3b31$B?*tiMqc9Le?:Lg`ln5NqT%/Bj\Vj5G<;uhE(#h5!e&C(CU +iO?UNaNbT@/8#SW(/fMA;E>WBHN=%1oiXEG^@,[RN1*g/[omU[VIUkqd$o?i;\jRUOQMd"oj(S@.4V-Xr@6#@tI=DW-0ds3\<\uIjCt%2S<`a\fJWj&.?@) +jiIabj7cNUO,!R=N!>W0EN@*)[1F.uE#Q`D.u(`1`e#]!Bn?,k-g_a=RM/YKXm:;SL,jcd//!q>C]gLE"t)XpqM);luVVIgrSQ +JVH]O:0#R-,>/dXQEa%?"e2:GS%.uK?aH2t>"Y&5-HbHsh34S!0fo>%QoUV^%/ca= +BF";7lG7R&^!h8tM6,"-N:tp+3jljGj+:Z=84c%T%/Y2Oj`G'Gc%*#"4F`HC2STKi"XHNh"9/I] +_#FZ8!9[l0VbC'?o+1cf%4kP#8g.U:14e2Y]M!1&-jW-> +WRoI%6&u_mB2&F$)ZB+sK-,1ASggGX8Kt*==9SPW-if/iK7Bl^h1[6WDF"FE&rLE2 +mUgbKnXXO$T#]XffZnWGiHZJ2cF^1LT+CjD[GeaNo3;fW&IEtY@Db"(^gHk4,_0-I +jM(f=r+r=ITD\G,,Sp:)0`U`A"ZGt%UBCj=1]KBe)C+bRR:;9qJCBKO/_K"]n$(5) +\BE65^X4cO6PftppLAq1-WodhCi=N@TKA(pVAFN@*TsMjG[)p$.$@NqaG@97L0HIE +qj@ApQnDF(PORcF\e#ZOaZV(OPbHptG/g48UdNmnLR) +/*Y&Sadl^/TC,JRA4OM]D/isUmRm=jJ,3e>PJ5kBn\`'lJH%Q4;t'0:oBe$Q24JmQW::cP8Z'a7UJ@Tb^fQ'UYLp.(IP')dl[iG:EcaOaCjb^M0RH+kI +r*SRZ&bd>a8aSYY#=R.N]K81`r$R,Fa=tqo6Hqud0jH9$*E^!/N*Bo"jkuKNdJIU! +8R2^l\E%E`U\E;Qc("=BbCpjZ/2eVmmJmAYTlR/H!e3(hr)Tm->2^ZB01PApNa8mM*q<9H5:$C&OC +c-Wb>Q_+LM96ARhK`CWuc*O,kD+LK]Y[#5L>7e1Rr_IQMJcG9SpV8WRO0o!7'E"<@ +n2aj"irm,7L>P8A!^J*jiNlD0`TU'Q)MUT$`^Mbji!7$bbI_=,FkrR;_`ZunZQSc; +^Tup-AHgrD&j;afrr-u`gM;FWQNu(oB^cGlg^j`>]E3$[0._&`s7mNq!(L7!l[0'5 +!mG67b>*Z!Q!=bFiY&ic&ppNcg*`YaEB^D,#5mYhpgsLfq"]#m@2Ec$;n8P&h&l_S +q(fH,q)\:nE)2XJT:e8'0GP\eN$Vf@MD7q_pu\hLg^9$fkJO>X+YRiZK%iHDp(CU3 +T"->P*&i0%,0 +Jq`;Od>^,l.'@,\gl-TB,csFr%3PZRiO+@=)L_iP(7mo3$K3R3+!iB:MUN=0'LE3g +VZcu3V4^/p09_)kJ-9s"8sPRNrZnHoVRkLU?D[N024Rk"[$Pn +^F/]dgYhfV#Q_jF\0+7?dLfg8.=0P_q&CZQ3onoXOIq[5Jd7qM%H=+:gdbF*nU*j] +(sg)$QU>16LVWrQGlmAM_d2Y_DY=,j>Mq_n.<)[Bn-=U0!5J-Qr\Y6HZloGQq\ob; +-P?DehgiJ[kK(XT^]sft,QR7+:'!7G^kUVD+8u6>#(J7bA;boO2pu@=reP>i8.7s%M9u$rqf]skF3<'u +g2"pfAjBM_1X,MpApQ","1FVkhCa4=]!X>&+#[Ug>@7IZgqs#,N2SlD'Y+)e;D;`< +//X'6bl;?!&6h>u^uea,(Q5hnc.]AA3iLB325':EYZM0?JWlsqLH4I/7>5WW"FD6u +?praG0t(&_*>?Zua3)@AU#M(g'4(9o]T(>@bgSqgAdS0A$P-d*Cbd2OZ_AGF`(nup +k8_UK*/RU;S7?_o'3JSbnZt@Xr*r#/m36K%`S\*qr5:Y\X$`<4fO]GQ+T@:IBj^:( +s*SbM(]..F[E\Wp-M-h7ag\>sT5@7!H%5N4gG?fl(MfO*;fWrFibB6mS!OaLkNP=O +OiY-(fI!*gPH@phYikWjpk(BRI/M#;p\P;iU;>bcnC)n)=@`bd3pl_Fs&\c1I1/]I +UJLm:q$/n*jN&Z(\gF_oB+'rSI55&LoqHVlDFRsP;?'7ip7Y.I-^37L!m!PDX@9%4 +"^#(m5P4rt)#3^_.IG%C;QTnopO'eqH'O:DLi@56h6Ai&dXcmSINS)NaU[WEd#2BH$b-^58ClZb;ITp5V-Ker:L,e.r"e,Xs3/tucPciA9B-ife; +8T$CJHp4E=.Agl5Z=Su%Xc$r\(VG!%GMs2CnP'DM%D-mIslGFpFMi`ONn=u:Hsj9(N@H1<]@[VF/`H/P*XdSY-ff<]WG9\P_]4b +/#NUgF&Z)[h=G>9putaO.nY>jSf@bu#VZPpHs/%PoOaKbORfHUFA5ss0^6KKD9A!!!uJC/)ed%oHYVW!K[:=n"kbG$FbnSB>FOBs!R:dYX*f# +*FT:@7B`qi,J:**\ltZWUe-_mM96b>*Wc:V:4^c\J[fkJ6.Nf25 +O8Hf2MVEE;]-r@d![A,MB>^ +=V?L[\E!CI*bU'l$g`.?D.7E)LqA'hl&KoWB@b13m[&=0-iESLBjVt+qSkQ8/jA*Z +r7TBV*tDgGE]d]Pnn+HUQX.H%qLp5jdFI1KK?lb,DOulN:.@-86o@ZX9'9)5!WK9C +PUdWWQ.2DQn=!+]HhEEVb.O=)nuKfaF`W^(H7*2U?ulKaHX]Tm)1:RO"\C%nhtVpO +JkcgVT)kOnRg^hYV[S.>&(k7"0YDRSP^*3!q=L`m]((Z45G$*9Q]!lHe\V?'#L68N +SEU:)+4(J(l).V^/`b"3ahcoE!3VYEjOi%@EsB4RdQ6Q*Sn!EEWBRVl@-MJlW"47h +!;POD(c_H_<,fI:h$`kmZ\_pI#S[2kRCElL7b$38<&P=;?-6,uPcUIm&U+3PAFaXt +`]sh!?_+*DSZDbgo[)oG`H"lNX/)>tW7Gs;_aKl66;XH=PQLat!KS&5Xc97^7t!Fu +IP+e2!!i(Is,[,n6KqBI)[$3BG+/GTJcBJo8&0UN$=-UEfVG`k4VG8;0f8 +[i!T*&CWWUeIL"-Dqqk4[bC,,caP7XZk-M!iES=].6q:M9S!.lpQ(o7^Y&2!B=cu< +NP3(eqW]9M@KIjpe*o]SRgXiVq/YEn;N>3H$_7-<>c*^^=Mh@Gq0\KU+g5hWm,1Lp +d!W!25!o@u!Q7CT0s0Ju%9cULVU3g]QJ!W!UBV\>;iSRic5@71]XpGWuDtP3q`\ +'9D5WU.V8T'V'ZPhgI3F&IuYT&)k8IoOT*^kn[=!_*h+&?Z:iGn9I6rEfaA)NIX8Z +9(jGp+@,]d'N)%?X6p?I#FU*tOIe3I4j>PZ$%Q5@"F/]BLkS;J?9'Wu,Y\:O'qN54 +m\i_]*<.aa.&c>i +6ilZe`=;a#K`>&b?`QN]2'j!f(Z$\3j7++*,2=2hm?mnSrjuA:s2!m]e,0_DBlKlS +5dhX$-hd$,h`))m>l[7rU-7j$q#;EFr;8Ms]T3_W5Ilg1PRAZJYZV.6mEQR1:[l/mgp4O +b7G]BMm]D"ei853^RsK"MaHUaP'+R-g1A40116KUR5FqH)uR1nUUKJeHOUkD7LU6G +24tHE1\U)iG0j2IAM['Qo^JGgHn%\4[EeJW3!f,5:LC6M1\P\-&`:eJ]-VfA@TCLuIZkn1# +'6e6$pp1&o?eD17mCq6!G(tFV.g,/0]bs$U3q`-`eLL#@gUP"uUL*R!TCmn$lOPWh +NN1MPo;1IZN=uoK_u)"Z7*d0%!_&I(AW(99A5K'[XLeAkh)=G'qrl;\;pj%(pi`/N +7d!HG$<1rh%_b"h]S7f3.Ps1$s7Ye5>okd1?]ptCdfkW>6IkuO2`s +J"5nudAoq),_#V0OGl::3ra<8&5[\HT^T@jj)6PbZ)T(K'qG`]Tk +1u4"cb>ui`bJEur$*>*QY#n;]04h2McDp.%AE3^eq:m(Da-$D"qd8NeIlfgc`u48R +;V.G7@l:N88gGG=ekHLUe7XU/ZISb@F\)$Xi)*T2&Qq17,Fsa1Sr8h.nEV2"R,HIF +Lg!hg3e76?gaZ\nn6^J3I\4dcD:$H0E=42c%/?b5NO+a!Zf+VWgq$qo&s*FX5B\6, +=sq1:B5JhIBHKH9]k.%u`ZC:8)$h=t#iGAaL +^knWHSKtO#&;;^Ui:H[I(:SVHLKe`^M$*hY0f`%=#0?TdD*a56s38:Pg\i5f";MUL +X26=dr`IoBN*EFp/QDt>$ud[RTbY)m-aF%(?sMJB)Ug_iC`!jE%#^Q>!n@.Jc28q% +clZ:XHA$#35Cj3JT"$Gd67Khe:b2!')o&11U0J:/dk>EcIpIuiUT,!b<$2.;mNcr\ +<1N`\f)9rWJ7cR.NSZnOH2\)#5[3G^C%/eOhP4,f'*nVB,)Y[\&"804lG=XmL-DUN +4fZhRG`@p&[C$cq378Zc9_]0kTC6BQ5/6F"0NX`_(ItV9*X!#h+;_sS*sDL77?GQ` +%12e;rs?n.Hh\3lpj_8;j?N0a6NYh#J,`4E#li#o^h3S8Ql,u*/M(#9GN^'P1\Gmq +$MCde\X<^dN$I*d7*_li,E-RH>im?:TnG?ga!Pnj)c:rM_`!-/@0"rpE&LY>1EV]Y8%brC&>f0qQds +>hD3'ffU$OV%u1Ks30-40;orSf*q99L3X6'!pN6drCfO>0HZAUdX%71s,!9KSFY5E +^\#$#<;I=%#JD)dYLQ3J!"mjE"G"`q!_)"n1EsWm43R8^7e$?5T-&VgH30.JJM,lK +"o+_?/=^!Aq^e?]_DFoZAsj_/3Lc"`YZ'2$Mo.a[`SbpR3]"96*uT^O:'O+=QO'`@ +5[u"K%Ff%X'KZ8)*B_,e3E*A:_]66AH[eWkDEf"C]s5"^nVdZ#KPN(G2;j2*;ZVnj +ZFdsQIpLD+%e(H$-#!FP-W;lQmMl_>cp]cWA:`i9QNpi(*W"OXWINcmrqjs^^KmCT +Ir>&;l%+>S++'KTR>^B99p%)$3l_Es'4LS*d;>'Z20,S^sm9GcqNUs.t_eQ*elG3!m\NWu_r)F^.!]*9M/atAdLmmJF +mIO2WTGI\ocTifm7+*M]b=kkSn:*p_18!@$NN"HiHM*"qoF:E]l_`H!(*&Ed>Gf4q +bW0s5B-$Hd]3F"HDNDNFY(\8(,iHo^/`Ha,X!;RFQeOTkfgCMpMRd9Q#e?1S#O"3n +k:8o#6FD>bY9=^E:?V-@^s6!kF5QZ[n2;#\`f0]E8iKWK0$r$YNs0#.8*D1/q +r]bdC.T\O"fgRBB^u6ZiGXgm/[3,LF.;d0+XR<>%P^pUFVLdBSJJan9K%&Snb1jTO +OqmB,ck8AH^k0nHn?W&7WkO:0OFVYfnpAgPs0O;\#a\(k1;=N25)?fq +b;:B=lJSs6DO!8Y*23Eo&_&igDAtq52Zj$V"Z=)F\/bjY_Un^GZk?WOac=6]X"fs._1SA,+? +J62ehlb.a^oY9,pn7ttLh6sP1r\k-)2[Q*5Mk2bE*`qnR1oKlRK'O]1-EK#hY(>s4q>Nh3nDIa +$nm"p`SPcGE:Kk%*@;7\Z-Dr.?m$,uJ&$M2^bN]U1NOd>1BV]>k0=u`4'Np?B8[<3 +M_KA886:E\B=@RP1YN/)Vo!:!_*O<9kQ@&_5D-G3)6fS2cMu9D9P[SH/n5(sfM\>Y +L)$ZUC=B=HuIf'!mR^_IF_pK2k?BHkC@3W:#OC'`\ +Ws8>0EGJ(]R^E"4M:gsu*#3_t;t4_2M&k'M/b!0Lpij:*=8IapqC-FUF@&(a +KYTrQ1]hRpX4(2$$2c1H+(.8RrhA;QVT3U)i"cd[J$,E&ScesFSK5MRndmI9`EqJJ +dSgt?3J%42q5Uj/K63Bm**E1)g`RH"QFX/!iS"p+_]qu^8EVT&'_jm5+e=[.)<@'+Hf+/^I5%;G$oS_q2&9?$&Dt3bcnuis4=S(IrfjX$$2>V" +3@/F1NKVSF)V(ET2"$D`o7&4"HSVT=?oolR#6+Ao4<"_^T9!ZSNG]"#O+l+Y7CUJg +Zqhu>lb1'HBeI,6JW4'H/U3mk66Hh]br"JqbNDC9[(16@^YR;O]eQm;"l9;X+0e-KCQ84k[@\O?Q#nGL-&=!uK"r':]E&BO8W:%,k"TNj#MJFIDP>RqH$7Ls#p +9rGJ0"97>'0WDTITa;]QV5R!4WWF9SO'C2pEK;++@\7R`Gu)dc"n)VJ!$D:R"gn%f +B_K/5Ajl7o'Qs18C%ltUi046>AO4Z(!B=O,Hl/,u$1P\oZpGZ*;T5UPO)EOfFcJjI +X8"RNiUm:d[G&^AOf/JG!#;]M2]*nDa[2TJIDImh#]p=G5N6mEEV^6M'W7^F9#t%6 +1*]O7;5K,Lknhsp,KoEOmhHlCU>k7CGUVMH6^>hRTE9(*6@e3kHbfYnm_e^$+Q68W +Iq/96B&8_Tmc3Go(\]1VUE#g-/r)D6D86/HI$]8sJ$,gSci*n+J(UXrcbK)O0?O7o +aT$DWT'$&bgYb:5iW!L7?"6`60_Ung2DY<0Cgu`" +#;c?-!F'4>G9'WYo]\&(IN&2Bs%W1MH[\ZcY@mi!3reMc!W=60IM)gGK)h!uSH+.f +4BA[@Aic;5O'/bo[kN6>ZU/lB_Y7P1E3'Mo!X8@_(9lG$&->\u/g(0oZ3RBpMC14! +PF^uMOQLDIiGFbBD$H:FBTV=oS/#_/*GV#VC6@\gs,=;=m3C"c*D.l'5#plrXXWUL +Q\/P-!;J*= +8%29P46G"X6S0PQF/K^Rg'H>pO%q^GVBrj)7r/aXX( +-Gf`^qi.R>/l0,A48dj$Tmp;eqr>oi.gQ^7qd-+ui0BfH2D.VUkG"G'U!L<_m]&:n +QJ2%I,-e:IgR&!)qJ +;qaMC`m`\>EWPr@"3F8i.FQVfG2U+fV]5CAY<4fNJ8f!C";mHO%o7'`_qh(n'0/50 +o_-+c(6F'\kScm#Pp2rC.&%K%gZn_;gj;``E(fC\4\0(JYZr2GdE?sp&O9.JTr7Fi +q*"lGn9[h=Je`j_(&lP/!A=Y/9*[g6"uqmjJ.fEmMgdiX!R294D$.Y0iCGDdVu_s6 +`@YV_%1\`":E4\4T4-VsBJGnn/a&AjL1%t4#rImZZL4Au\3$(L(P`V7=Zlb)?YYL( +>ZDeh&)^g^p-Xi:O&`@?Q90R"^:Qs&N!:94Y:aib_^VO:8@41h@rllmbImji`uM>$,9q_ng(AO=B`qF8Iu',/N'$[#hfFki;I +ItTC5`f<7&N&s?P3$:#PXRYeEn=R=J)6sX[aum5"iFke'1h5mJSUZgua0Hf\H7"F: +ho(%#25JI\\tF0JYT'f@%9VrW2o%6^k5Y*&0E=2:&W@/*=ASpDo`%K7coV33"GfYG +K`V1"%B+o6bX9B$-PP'&90Ka9H@@s.TtBuJs%s#(V#Ks1ru$;YJ2qc'5ah/$=8J-[MGdp>(SE]r/EO4+./"-C?":2@Yq#L=KC +:\WMej=A?l!H@pU_Ai:MkD'gmkT"L&JpWZXdIe?-Y/#O8DWnRQ8>OeB"0\sS=:<_+ +B`S(/QTXu87\%L-4S\icKN@G'cG>_ZQ3dTWcYA".Dm#.RX]uhIruW500R1%8=3%30 +j8^(mo9Kd]Z,s$X%sD#Momr>-mM=74ZUqjjdHuI<\`B>`\Y*rB2])>Jh&QFkVn*Dj +-U1iSs8Dlj]@2DI(CpK6TSiF.[D>s!-X1;FKoZo +?S"f1+gMpl.bBE>cU9\-_oEu?7sHm6%Iga2a_dL1Z3LjU51piugFDb-9>MWAr_:l" +CSjDL\+$[PfBV:4hVHVm]/d*A;>L%qY%)^)H$K#!&8@&Q(Ca\]/-dXEr;FLrS&.H2 +Lml`u^^'k&+:`;RAXYS!@Pq(MG/m9E9!s8*Ym;>p!#Qg8=LjUO#/CHM(eeZg&HQ,M +pRYo?VDES?E\8rWS4cMua&%A0,cr)n5ZqC1Bl+CbW$M&9Qs+WSX]g62RC`Nl2S/k8 +iU_lN!gSm#/YK@0]W]%qZHsDVYY$4><$(t34.mEWQ%=`0$sTI+6,a&WRX8MERXuU3Gl:n3rWCs,HMgTZ +nnTqhW;$7e_=-R,OF+)2>QiCcrLuYadMDeo=n&YMo0b&WI2mSqp?44^ol6mFqje7N +dJW//s5!&;mKYEKpfIH5-9kVBVg\>1m/K0Is)QU.MlE:talfk^8,1.%3eI+I7d[RW%dg,g*2NKQ(u^7< +0h:G.=Z]5lK-Slrs5EkF'K'ir*l-ZU/)uF3_q'FEa-:"D6s1A0_gd==@)dL,R&L)g +%.8X8peP7d))Br1ZC3Etqg@F%tkVJWQ4+_qaf;@I8/Qo5%n5HueCJ)BP@Lr.-a]s5F6\ +n(Id@['MS-?9=@t%WT=*(3Wb&+gZ,Un06[1\t8LB:]^L1Ff.=!qS;&[G;11Vp6:H! +HBM/J['PCC38krh"RPiV1CPB/&3/U6JTEgNGmsiY2:)ZV";bT1b]Gbg(0IH[)K;/# +R6b4EO<:!BXSL!)=Y7Q$A`3C!\h\lllE?2]]eMf.5G[c+NuL-!ppI) +\Sq#FEoeh^`WS/e9C>tU&^inEo23^Eu0 +1([\#md"t*'ARjk(?1.ijnR,&l10P8DJ`WaL$+e0lqY62'n++PiY-D$/Mk[PPJF47 +S:$Xc2[?Xc:.a?u:p!u!]Y;f)r*R&=+i"5n3$855'>^"Xb-0,#P6$(Cif,7kc=Z]X +;(gZEJVc7?qe-9Y'3XK2]-j@W-R)c:d;@N#)bFsp9PbTC:N]0+g1GAPaIrT)^fUem +*Sl''"U&`E"p4$p+;k^oi$dj"-=#%;hZOPlGCs:332I?(@8MQnJ!>Nln>cd_2;lol +Gh`E#PPTZdTSt_mir"RnUTVh4TDgV#EOLclm9@U@%586N9(!t_`u#U +H:)@"k]"!5#nVC?hLU/@%NpX:\])YFS@un3g1*Q3m\X7`;aIjV^k"f?hIX^TK0:Fi +:_ES-Jpf2qDMHJ\4]a/b;%!RLqjK7K))Eh'(hSM=EpUE#s4Q>Fq+(3a)P@,r/Kkl` +r+Pp@I(;ZfgNuL0-bu?Lk2Y._a&q7q#lsa)1)ZBOl=2II?2r$D#7^VL!oO2Y-WA"k +F-c,-VU%/4i%>dh+3phsg?:uY:bd_j!^PSo)i_WGVtKF2)d8>JJk7Nr5!mo5RF64SoQkr2YD%ih86]'YZGr#kLI*d/1*K=CDk7H +R@3[gnGe=JJ?'2KH?3X3gsOX["(^$QCk34$JY%@o*(Ku0UI_q0Y&YkkCHAGC+W\8g +KfgYDr"Vsc*<>Z6h&'M5U0YAl$F'Rjr,[,jZ>L'b"Mb(j17PJeUM#BW_#HWs=h?BW +lEgb>+=>/V"O1+9dsOXBX0_SS+)[%O^HD#Eg@.=E9tW\To"IrtiQV)cVmLq<2u5JC +6]Q1I6b/L=0UF3>7<^:0F>(YB%Knp"q"KIV/L7_TB65!kj7fY$oC3[,')7Mdo]&$1&j)F9<(fgRR@'!8:*o\< +&3`cU2(Z\Tcc*7B`4!A)<3G?Vc"+2jna?EbSUY]R%.O:O)=OF+pBmJk3H#OTRa(5W +HLU'cipCjtnGhn+&br9;]/K3YL(4@_c.-fYKA_`Af4;:.!)rs:EBL'bQei0;f`JjO +%;t@7YVdBL+/6`N9I0u%UpqEj!,O3`$+sj=HUm+b-^37,('&5^aHk3`&hoOYNdWEG +!<@Uo$a9sdVi+eUVKIpX+OI]N.#]:a+=P$/d'O9:4RS9J&^uB[otB.I6]ncD+9=Ze +JEMf_,&h6=$;cMCJdOaKJ.?k_@j1rH"ms#7RQZ-(Z&lQqg?eB'L\q#kmjB4Yn.C0] +!m#%^i(F=V5QsC\#/]Z4&Ii-#K%co;]Z/FZBP_`go..mO!!iUUp=Nr2j=_iS#E#`@ +3XU+*@#@o4Y&<26ebS%'p&9e=5j@el8ksb2 +HLe+On*_D&B];0k(-Vm.k_Ut]Lj^H^5&Z]c4H9:JqoZZt+)4U\7nha*(T! +#Vo3_8K*3`3)?MM;jiIKXCZ*3>*a:8H +JBnO:16\nD/0%nG^qR/:1TH`3rP3p,BVilf@QMPSNRQmijZKV@I<08drRJ^pf*D>c +Y5ROCn[E.chOb_^UN#dBB.!UtIdBe3C+5p%2+t?G3A;C*T8DrA9p*aj9Da@!A-#K5 +_TJ.NY1^bE#t^mMWWr75P,Wsn"8U!V/L8/mRuRl@;e`AD]HFqj0CZO#k@q-S")URH +(A>d*kn6&82.$FaV^gliHaJC9iNQM@J/h:p2O\9RS&,,SK4>m3R^ho4kA-]+NP/m@ +ERUG-bE@)"1^*T'aZLi0$@HmRibY=\pJ6Op/o0 +2gBrt;?PN[.][cM:@qt9>deGqUDr&C>e:*DQ&R01;t4-<,3c&1BfrsE*+gr?@PS6K +:ug5HEZ:-kdF8qn!!iV`]iZrYbf4^44=O%oRRh8F7b<92%k9hVb2Eirj>N*SWO0q_ +8Wu'@ECel`&_3f`Q.i1J50h=]cNiqHb6+Ag$E/76iIDLH!;La@4dfLs3:Sg1FTI3ajh.P5j2e^&jT&bf>g^;ZsA#1[r0[PDF)rX;9leA +Iet!f)j\Qr$2bSAruKb>G3ha=IGoX'c43Fo^taaR`BXsXb(pKrWrReAho]oO-tnA:(@;e1+4+Y=2oIm8=opCk +oC8=eh>Rl_>AY8l@ErIfkg:$!S\G=X>hY[F"HO.bJ!0Vq3N\`6eMhiXJ+:r@WUg@/^nGM@1h=0].1eqos1J(" +CQeaJ/.atrs5r%f],P6QkJ;<0*DLGsFb;Ze\H(rI_"ic4@lD#I0!u)bkL]NEgbh@J +QY;"S[dqNguqEQiXX_9cM-AqK,j]% +RVY$tH&U4VR]Lg@3:cds`:%nli%>!#p?4_YN;V#panLKV^DDq/rTr&6StH"S$bBF3 +XLXV?^83[Z[%nN5^QtaeMPsV*BUXa[>60jYBUMV3R?0t[A"+63HX:9aB9Tnm!i?TM +,s(`o(TPMSRmC7%c;KG3m.2eqrc?4p@rZS+=DZ/_>h_T6EY0ik0eR2Z(=khU0pg7] +MeWBSQl!4aVt@'&.tIY0kmd=%hgN$_)>J^)+q45Wrr3/^5k+e,)"I$1O6_]WIX>A. +E`V`(nh@cIB41Dlkj'`4_#IK&7R6DX$8jX3*"6jc1P5_!)TSSh$_H$-9b6i#57tt7 +cDA]s&pptt9dAUppoE>fR>P&P4tso1+9CdF:Mn]pFTVU?j6F"nd`K]CP0+`dC`C^f +_D+?L&ICGj!IT6ao,1[e&5rgp*DL4e-GI]1L^llTro!U1)uCjq'qCF1@bdhR'iM;[:':p_:i` +T+6QUJdMMUHTe"pp_9c\bJ6gRGo_fVK\%*;()11B:o+oWBd;rcA8*eD'VbXJ[\R2Rq&h+XiTlPcctue +q>XOrs"A)Yc1!)"+ZC5;r&=W8aXj*VQ2lcFh7qU_&to9GJ)NosDta4q&AWIq"Q11R +cZS"2@'G&<[='Q:]q'.ZVnVnC"3s3-8390n+q[K0U[8mb)]!Y$T&2Fh%l;c[9;;T$ +qE#.klcP`8nfl,a-M3EQ8`js=Vaq^2*:c6X@fs_'Re'RI$_kk)).44,9Sa]S%Y48b +%2jL%RGbRCf3c;aG&[Fpps\C-)p'1\!j%c&)rUdAr`3hNBaF/Z(@/9hGH)B':/K$Cd2-7_]\?^fF_rG5f5j;*cOEG5hoe4 +JB5VtU*CE[-VY6@RFe"#gQR'j[sp0>ANIMR.S2Z:h`[Lb"^]cQ\5k2[D@\73%DfBN +Ia7P9^`oWP?+&i/D+OJ%<83)9F$.0`,dqP>V/n4i0c!l1'Dm#&$>oB4sX]W?FTMo[aWkd?skI]j$_V5to?bG,=inga(tVK2dn,P!C#[_#1,U"ihnDU0N: +$"O(D@_fak5GFGn=rG36KUVVUd^m4acWk?'gAb,]s7;EVh`NU,>[[)EV>W(?*d?n_ +mPajs(&H`$KU+Nn='q$0p+tGDlM+q@boYc[k5Ij\ptHVj=RQWN*RQ/>3#b5'CI<6X +jg3tH-d65()bI_MV;tGA[l%-oE@uD,W#^F$X8/^!+6fF/$[5if:.DHA8&J..g+O4X +7mC)R4+&#;7fHkl$hLjXA&bt0Yc8DOd_L7TNnsVM>Bp%RnA'NXNrMBL/&MfR)$r\' +GpN'e;q$3%k)m%iqq$;%98A7=2ltpjkPptsrbkoa3kG))P7hc+eh!MP\gLGYU^nk^,Y]_e' +'fl/99`%?hKqJO!jip;EWAX]NFSMQ^Y!D8WN1ai4TGH4s=Hm2M>+jrpdb42/n=LII +-?l\g%>clO9&=)NRFiGBm;Tc5e802(bdr3f?,YAOD!Miq-82p5[R+'Mp^ +\gd(<`lO&W!qY%@jK3FHd;_:Xg)9hgeM(Lo=RAGX"HJY9ZRf_3hrYHbhHs7!9?s)* +]KAbQF^mP1mbP=/k"p=B"u@UKXX/i`3&KWWN33hGmIg +b(5X8AQ0nVU/%T>*?G-V[`W)q?t1W;PNcp`p>H?E@i:j,!q6fOrtA_nk>quqV[TF` +s'U'l]K\.WATAaf`Gf'&%\(f^Rf\C5NImDIkSjabRXPKY5C%]7L +JH%sVqi(QZ)N,]L9r2hRLD2d!B7k@B/E&JdAT0GF5?,#Km_>c=jL]:`WDtL=$n,,cH +ru(hsp`$1-cZm0os"psgAA4R_KusuYqeaT[2XT&FqJn*)mq/0] +n$dA.=7`&QJ%5)W2?.C4(FS%SpqNB#jJ_lM/jMeCs,DF*1B+="6ap`V[&k7ZD48-) +RMr^(d,aTBjR(@Sm9d]Ys+3Xi%dK-.SBD\>f9a.C]mT<6`fM9X7%LJs(P#*oP_23f +Lc"3^)J_d1lU2\AOg%XY2qK0LdNcDpA5P4AYd2*LlG:PR8ORE"!%H/Ng>6O`\LVd8 +heIYMjm[1o2YRfG%f99NHCU!2%Ym!fUknO>Q2$Ug.;h7mZbtp#T4:a5$aiG7pf%_, +efgt:Brm+;BlK?#gT(hFdRr:/C=Jm%V"n9'c5UVW@\^Qj`7E,55+9/G,F^\>AOBc( +2-'"l]9rHq\nT9&Afj*L"N+p_jXKH2H"os!S#;c<91T1E`]+hXHsr%U=16n%P +m;On`gZMkf+?29#8htfe9ME&PLu9@6fHCGER%W;@Ifm87,ka(2cg6W-5+&7Bl +"13A*Xa;3s9TmA47=@o70Aml14!l/?OG+hcJ:EuDCmtnN9LUcKLXdXK#QJ/NG>?,c +N^PdUs,4q0B90GrB='-%X32N5r-E/D)CPELmUP]W5cu?rgQYL2)!'(jGFCm"r +@kq'j=t74d_1.kc-1TljUORF;''*2Dc9`GQmNX.bW2opH'^[;"c>K[!c$a-+OIuqqSO<])05i4o-d2o<[E\V3*a0`J+3bHUZXlk`L/!06l6 +s5%jBZ&duJb8XLLm!"g6C[^)qgUEG\\=%!;SaX4rlKWor-uZb`.*I=C@Z.hS7"H;*Qkcr,5[Q[4RZD27QO3B`Y; +'J$gG&GZh@e5@kWZiTZO:JjMGr.Z4lJn9Pg-5 +TCr"9'qgn`QntmQM[KIHQ#A\"!&(P%%D9k+B#hV=:5IOg+TbDR$K[#cO9JhPc +niFJaAPD9+:ubM72?/U>e:@S4cB"*M/KVn*X9ARD_])&i)FgHi!),M4nUE6sqF+ZD ++/]@Z=T&!aSdS'-rI/=b]A2YmA8(qB=Q*@m'-&b%598GV,)i!0$Yr]Gf-#]jQ.QP8 +L_1%ce:[c/a1>lDFhTup3KhhClMpA:I4$XcN4QYN1iJq/[^Hk>J$j^u>1Z\[\.m\) +RETE6cfmf3K3S`/p-Q2%n:,XJ_p&"2?/"cT7`4-iRHCLj1TFA1_Gg%*)(1!$c!MH+%^3u7i9E_T01M\ +lU1s4HFG)mVE^`\c^0Z6Q/U99kW2.K]f``@.'[nG\K*[sIopi35T,PgOjrPmM-!OZ +_L&?@>)qBm$Xa/tg?hbilM.$si;me*GJ)gBHQ-jsm_Fm&!T8Hqd5Q362[.cVM#X%m +D793/W'6:%DW_)2J.AKT,.HQ\s-eM3HFNr7!dRU*>_"$*?4gEenLa'I.hm7DGC.bE +@%l'0G3:5(k,5MG7j6_lCl_\rqbs286(;(EX6YrbpEr;rU>GBshPc=GQn%Y.Z.6^Q +B>U=915B3D&-#IBF5rD%=18TY+'W&#Zi@;Yj_$kqdIZF'8Vc*bbh$_keP'f'!c1SM +KD9Ae[uC?Z`;e$>YMT3SENu^\M-Al1.fW/i%BR$GF]G".R]$^D>n#8=^QHfrY^c4N +SH@0H)Ma@o8,-p-opcCdHN>Htm<;Z6D;O]mC_!R'dF0f)aYVYjZeWiIgo]PGNutI, +)5^3!'8-#M]L_4L2S9mkJCR<3+"^L^cf4uNME`YlLV[?E/kBjY2Jl1XJ!7=\#&R(p +s*WDq\VWE;j]oTa7ZaVQUltJ'$Ws=K=6kGjj$,C&WE4^hqognlA=O%[WPR>c_:tm, +dp'Yp>ff(5Rch>On%G8.\;/,pT,2.Y9/(o)+H&$&po>tQNkh$K@'Ln^Dq-jXe#M=g +;,fh_?tksG0c(34+k!%)hr@b<#;*n+3T'.G]&2ak+&U:5D\]37'[eZVh(k2L0c&Tl +j&JosJC^!o>29tI5*V!Z&#KK;[a+7Xs;[/1cHAO[4.#ds2pOb*F8"AVO^KZd_j#V8')-#oO.rTf_!_1-]NoSS=YNV*XqmH:<*Xu-4p3<7gc+; +Kp,pj\Mb>^!rc!7[3>3NHDaaB8ai06g-)(]4aU'`F0]!c?iA(:d\Vq#=#PiqY4]qC +m?47)GZrkur#2JS3ptVo-4co:0BDi@aWGbWM9]AgcV"QC(DLfZiIV=)^L1&'4A0V< +/)F)I:_+6-`cK4C]W&-!fLC]_6HAMg0)m$J@9_3Ch%Pa7I,#";W/>QAR_ZuRS+IOMXu +5I+H6dg-aD(e:URLj?rXH@T\CY6(?mZr%(E +h+foM<`d7iS,EA2qYkZXT8e$u09Ml4s%33d%uhG(WNk>p3VM!8'^a&e(`)4B"Cj&L +jTo*"R0uhmJV"n&UWG/MfF>48$aA3Y+lssG3OLoUkq:SeMt#WemBk!\;VOg9Dn_]b +E$r&DHL0_sl"Ph8nO#=92tpU*gMM?0%6XSH?o:YjWJa"-jEKu@ZLqII^PRS-JA7'@ +A6ZDu@Gq1*<@[uh?(cSbIrYSDA?$>O'r;FWM'P^p^je,!rs/SWG"@^E/"`uc!^>TC +8tP,OikNY`^<[:FHBOo:[;Wi9u@uK13 +e`PaJ*4XC:ka'<(5jhK(jAXt)>=kC36+)O1J3iW$Y'hLZ3^4M^&LXn8,'at(1PHoS +g2`]E"qg#C6sMi)#Pk9YMb2bKPoKpmpFZXL#CN-s +S.NqVF=9I*_>g4U>4@"s^25&k3.JROcphD-(ddnfG:3:FEoeqmVE6,j#F15'$b@<" +./h=q`=(WRVW-;WUYB*C[3GhtiJ=^MAPaBgpu[rS+^I4$8A[mTs6S/$`N6e-duq[k +P-Ld6Ei0jX2TK+W&=1)VpVJt8nGeH-c085OGoOEeeccB^Dp@J;][#uDF7q`l6;G:q +rm-j[(:3+A!Rtu0nK1=?5%IBoGRiDQ7i@#j8:p=V./[hrJ%8?$p^`8U +q33?qCLoes[.Z#]@47fU.0/@T7:Hoi&,o?G'oj;O)bOl`9PmfW2o7E\a41^>e1/?d +qu!(CI1$dPGJqnhXCIVLrl>O#*7 +EIQ(&6:nc5[@ke'Srd3m/`m-(i\*1%&!cV/+,tPAcO\*XrhCs('OWkkm#f-"94!j$q%.2U'gf/YW#^nkM7P2=kM&70,T0W +o5hkm;YB303?9"8%98CYc6feKVT]nK5NTX'ZUe^2=G.&UjTu>-N/'.lMACT:;2X)omFDr,:`O6oT2++2FLkJPqrP +on"su1Dd8iRuBE1i-d-oX^IW*1mSCH*<0$f!Gl*sm=P.urs\nFIkAnu[J7?jH$`W^ +oY/[3\<:L:L?H-N_tQf`d!_?;#+C'lMCBX5AB%;1D/]gg/H/-`Y\2c$l]CtY)Zp': +/RJ2AEWZ8&*$2Q#hJMqqh<90sdG^,$rdi/Y5/Kk=q$F"o^M[Xe4jH$'[oQXicA=\[nJ9)D1r[0Hij2\d2 +kPqoRX*Dg%;W,t/IKtQ&Y;:K37LR7Nr3I9UiTkOll6FOo":7ZekGq1os1^4HKE$FA +LVFqV.c+^XhO`q\HX&Im+;tQ%!WBh6Oc[/'n)mU;B-Y5mDbftc`R[][8g_'chhg!O +#puPV%iEnZ)UZXr?V$@gB*Tja5LqW?]Orq">2iO-Edfhb;RMTUCBG\40 +@oSm9Li#Hc0Ua7,:(WF.#Dj6la*#(Om6lt+X5SK-Ue:c)grlln&R(rcW`R1uYq"*k +=r[6$(gfLidDdA[\:C:&k2GAJAR$6\^dq]nJq#-6TSTP/,9mJrJ^NcVfTqXZ!?2pB +o.-Y<*7odKpEGGa@@PO/7Z3mlLOL%$O9?Q`5H`fpO2-7\?YFp.?D,."Vb5EVbDj8; +T*RC1gk,E:\%U\\n-JqnpfI08OoO]c.?k!8j6ab/!]O"l**C,H_4(Te^jfre#Lo#g +0fLNcp`h[aT$lY+-Lr\Sn1PAu4`0_6,kQK4)d(l;SGd!FZ +/kt'h\4+;[K>p+E?\_J(FoH()%@'R8_0rqd<-q6:/% +,\(/d#qstrY$;aX>N.jh\)U2i@W85*04j%,h]*9pI"#u&]%-$7H`c,-/U$kM*:F9+ +IM]NmhVr^Ve`fr3h3/o#a,"B(gtG\<=RB3ao0@7pPP+AR#C`g5q4Yq.At.>Q:)c0K +;Ir\BBQtJj?e4:g(jIO0$ZR2'4Jdt,"#<"uf"+GA!%FJVeA!B$8FL"S3Wsi1aidi3 +#J%XNUZ*(=SZoZs*q19.j99B8(ZSGilB=`jH$*/>!.OX3Pf\U[r_kXA5`URWJru'] +&'G%,!:SZYU^>Nt`&`9XZhrp+U^ItDjtFdlo7lCKP\cie`/1(PB;G#&02G4@Ii+[` +,(BfH`rC`#FDT*QEo?Y0(NrPY/o'WlT +i.%L$ohd0ts3Yf%>XHbQI+N=V/IAKSQVL"-]Zq/5JkJP(:FBY@7\^kfl,f`E(k1IH +9ZotOK/0rknc(b]g2\s^*ARIgGR`^5BNWNKUV0Ur1a>*u,lmr]'<0/s19=L??h5b0 +l[qptSk<[k$0Y?9gJ3,<\.X<1c;^4cnEAfLr:OKb2[/BGnN=S/n_?/qnGhiifA$hL +?[WeB9dj/glU;0M-D-=A?_6\6PHT@XE!IsNN?@_g# +,dD27?8*AR3YWg+N"s30NCC3&!c.1FK,.VhYTqsuP9]TIb(Ea)<=,,8IJuT$lle(oS77=gE +Z@4L?Y!9.ba6OUV0>S1i.1t:jJI?/#^>7cG(k.#os1/phV#p[$XGQs/f"WC4W&"7Q +=RU:4j`PrQDY>Xjn;"F*gdN\9pFYR:5Z2"Ij7s\%=2UZZKqP.OMjNqd:=lBfO(X[Y +3'S$8gnu1/F?3*jQXg,n]n$o]i2ZLdk!^ZiBiaqi2TA]q[kS213'^Ged"R%OTjYC4.CfG* +iui\IFbc$Hs(_=YZI7@u'E40s_^Fq4Nc?jXikL>-s+(+^s4-Xh'[bdq;_sAS21dPQ +TWSPDEs\Rt!'PJfO*XA,pl@hYq[dZ/?VK9u-?a`>d"Z3Em3'"UhNiO"6fPldR\9OLYJ#`>6QV;Ig +O].q&JBJPWU\8A:m,m"fs""+L_7p3CisL;_;]Pm[AKR"`S!Fh+LXq>onNUB)Q0.%j +4Ss7`c`J)d]4`XtMZ9PH[c@M>(2`t<]Ho5bOI*,^UVQIpUYkHbcekALI9g9.^$bB. +D0C+AXKOS:s4$%K\)-t!LJop+2'Gtf35KiEPM#V4rK1Hds2!d:7^J`AXmV!]TCf[Z +aSflZ&c0KQ1e3M_1Tfj#JM4KlOWshd%bf?rg&Y[bcE+pIp!p9f@G1d. +XI$jLd^lF<0tn+SMXEUK`UF/GF/VML0g)TpBDNrNFAEt@fYV>gW'uB<0Tm^_r'Z^1&HZhr/n@HQb\6pjWXB3iIKi;Lm[&m0W%# +j:9n\SD:!q_F?>o]m)`]NjmTLs*ABhe>8-J(Y8KFlF=(gb.s5V6]Sm+0cRX38SEG7Q,bk'gUZP?cI5W=hZ$2uGaRW&H1 +'p24Sna1Sk9Z4fB3!% +jRiqr3=Pg%#F'l@h4YQhJYaB975R!j=jZ8/ckTC4*W0.Z;M*iA3NT#/n4@\'@7tQ* +V;!Zt/2#`L\Ge2I;UV8V&[qOENi$7YPc^6bh\BNTd'"9AGiqgu#LX_"WPF5"G$hQ@Ht +>9d%4+(rXss&2U9WM[M\VOIjT4i +=8:>*`B4ig2fd)46o+mP]Si[#3l(be:bbs,PdAF[$sWt%^O?]$Wm;.pEs9UulW+7G^^/n4Jq +C)/rYA&1Cq3J!3 +cU^OGBR0ot1CO3@GM_DDmL=UGRSZA;_=<"%VL:?o[#dk#!J(2ThS>V=K-)_,JH(+) +)>j$j`8=orrH451r\'6/R59Nks*^1Qr24+.Z0gKL6E4Q?WYJ&H#cpu.; +@,6?/A\Vk\TDN\E/`;r697eXiTiD3B%0Nkp6OD9309<-"7b79'eOa99qdUQL&t7c" +7M9DrCcn\632T7_=tS]d(M#_:_aW]p6-Hq=.gA=Tn2,/e)As*-NAo[2e.Dfgg1kuH +iS^oaLMmL#mi\DrFt@Z^%'M.bU#HU557dZoC&0E_f^S/^K.F?12]<5*;Jgk'4ou7- +P0o/KC:G"/*O.c:9!SM$^_lX\W&Ap/S^ahUpFrL1!^U-=i.%Y/JUheB6C5^urqf&R +"gg4e]J$4h-bQH@W!rSor"&,_IYumNJ]5L!@`8:`iMDA1>Jc;OO[Vuq&$+K8.?;(< +,jD?dq]h5HHJAP(eonW:U\:;F"^p> +WY/`]11L/gmK/[us(1^"eAqg'lDs_&U%/?k;/SiWGQHS0F"n)G2@+PUi:+/Z4:F4aQ`k!ro-TU"R>eE=S.FSOeohNe"EbIW5R +;ZCLVLQ0LC5BJO%B3h11StDk=5=^/33rJ)/!,)LO[>+W`T'L![s%Z9F)Y!iX +('":7s!1JI>oRKQdpZn59lJ]+/%#,LbismDYFfR"Dq*FpCcHIAalXt%j0(fDJj/'A +ARP+?>ka/0mbu7,0$f.',Hf)3QhX4r&_`PXn4,D"+WTn8EJf"nlIJ_2<^ +D4/o+G\l,ZI/A#CkZ'[l$`NF`.\l0< +Ep$PPlY)er34=Or#<-coL$l$+`8Q52$nt34s!"KK_*=-;Ud5"Ki-:7t"S=GJe&qGa +&e]oA;37@sY'C,*s5="rs$?"6s3Kdu`rA9K.6j=@ +^dAt=&Y.1FL`-4-5uf.lFap!KcD7lT*:=:>Q;9q._C80u$!qRfo/*utfn_U'?Tar5 +HCmX;WO.jP9+(YK67Tf(DJMqh]+]Tkh!#-N%/biue,!^Ol&8X)=%+WcdsG]UB]aV' +TlhPV0RI%]Qdn`Yh)T5+H?HYt*<#f$nX5=$_>iG`eNW0J\t<9q$N=\Ao=D.di:>Ig +#/?Y63F2)+/)FSNHCI.i3d9d^hXK8-_^mJ<,CbCG=dbM+Jc*^q+9`TXBnm(H%4AN7 +s0B^lmQe4K>5b4"L8/HpOG67r5G;u1]3=K&f'??\nKn;:rkM-?E2>[kQ?IUDecGb@ +#:*a.V!o@$"#$=+Dl+6La_bttj9=OILLZeM6`RbH8A27Rm9.2J.B2k4Q,A14Br&%4 +BPi6,"Wb."(9rEtOaBBlbG1q%^XnkQ<+gIi2rFi>J%,J@\+KuE1`a;%1QRjR&c@t4 +?,O(uid8JUdenFOOl%&es%6j#legX7>931["G+a+lM:0(V7F%-H8ZQd&$D2m=#-1? +V@cGf5b(;#ptoV+\'qA`r+@X4nQuu8hX4ah8jLH!g3jA!@;A,j+L%e%Unf<4W&^ZH +4mH0?jKn:,P,=Gh+!b/dZ+#U4ctE9;Z9JV4LH?E;3>g4cG!#:d4,\')M\&C"aq:$> +UX,.+EW<6?O*!;Z/H/`B?QK&c/jM)@_[)"O;;f3Y6):!Qb*G&>BRHX0m)%Y4iNV2?.)di\kA'XNg7]MQu2s*i.`OAKT6D-dQ3?cYa-jcpeK9 +opUVN2>=9$fZk)#FSf-SJH*j'4^U@+M=qQ]>$opULt$LR8*4$HMf=-!QnN/+eMKaJOQc,s.>1;3q] +T8Y)k,7D;2Ga[8AP9ra+0V0\'1LF+piHDN5!A5_35ZN+Kh4i'J#(//+#Q`j+s&1[Tr\j$!b]MFM0lks6`!$SH8]G>os"BS+/_X)MJQliNLGbY^^#J"TOnh_dD(a +i'5=pa*14tFj)+ek)t(Irune&@C6cR:%(mOinEO6D_S,!,-i9fT87>M.Q#9?b`>4P +%u3(PL"7jt'u)i`%s6-i+[t^NULN9o9o"35g>89YD16t4nhRb.QC9+Big[\Sm@-o8 +IMpTepTMSlF%7PO'<%BK\U?T6jjgX(fotF)V!:YHr)`(YPc8fEG2HQY(j0hHB`>TY +F6gNbXE?V(m0#puH!:J[KqH@&eL2!Wnn0u+l6!-/,[UK)tXCcO00Vf9>,A +%A9E!Jack*!YdAKbQT\E5TV)GJ`FKV#6-HI,fIlE0Y3+,C:QRpFY/c&4]hD[_?EaN +.(!kG]Nu@Q"mbh]V#XnGQi#6,QR?'6NuP3MK*spg!<.2phs5<1cu+%DEIRl&T>CQI +6U+Wo\6`q@Fh-27c],[h2?"A0&DU3%rZ/)mkSgPBlK8r[4)I_'4'W,S#kWG0p&!>h +Jn]#]?s#5A?i>Q+ZCmY;&3?:g=qF4o&H%aa2"CpE@_?2V:/`cs#95)*1Y`M,4m54QnW[^mom]fXf\;/8s>Nj^jjlK(b>U`PQ+fs +9?KJ@o#o=(=h!R32YNu`gTS`Je)D7Ii0ge2=fp.lhot]fOr(c,,>+#S5KP8M<)XY/ +cY*/_%f^&I?B!R[KEGClAui*T[_?C<;;lW1b5#YGbKn]k^GNRX(HOe?2I\mL7+K#o +T\80c^TuS2^R(BpY<;;qoqA#DD1:eiI3SA9QMOR"o!SuP&V;0Z0qjiH&&l"Tn/p-! +e0[cG3DBpF:Si$;cOdo>e%1pO5laf>4an\(QDT&HJYq1Si%^o!ANS4LJa@/LBaUK)E[tcH'Z3.T?6l>L%O\E>no@C)ZZp +H%Yb)liC#ZjS4cTMk&]QYWm-%BC_i8GL!O5^=;YuRZWu^;5K!;Pf\l%7.7oTJ39CV +7C)Vie;).?'.a*o2Yu%W@k_EoIpF#nT5S'8le3';5?o1XT0;u.]Ft,I[pR&]7jD4L +rr`8,8Kp4l6r4e!4.Y$8Ge@5u>hSQ;?mrO*/?F:[\-DL'=A0*YNM";Os5C2n2okeZ +S]$hFE%89:Nq>&'c_+L68@%+ur4J0l0>n>m1J4R[8[#[IL,ZD1Vm>SA]= +iALiJ`f^$,o*%hW!@beq)[pZ'rtOo]Z-RKJ +Ip'6n;6/0`7Yc=Bc4AYmT#(ZP6E]o1TmT!eA.[JCTE +qA2!a4qIi[&qiH7,ZiQfHBdG&)KCkm18A)+,97;Fp+['>bQUBoOU_K&KUk:AiG8kr +7lYs,%/>eZYiW"g`oPscDBDpNs2]]`@@W*eS>S(m_8?g"k@Ht4^rnFOdt"t/7fE\F +rO@hKnL(j<-J\l2Y?T-#=ipQ*s1G1'rakT^c?ort3a,1A +Iu=7Dq:BZ1?Wd4:2mH(]PLG$AKDBkMs&9'R7>db<.H&HST>:I_rc?4H.ep>I?g@7A +9NR.nDt!qVGU:[@Rs/NtcYer$f61K9DH^cdA&s_o3e'-aX8&;t#4cP]s%*tgB!LJT +%Zk;0qE&JJ@[C#Qm_@8^gobh6?0cZ(i'o@pAS;OpaM/p3Q\n\.BR^S\-1)d-:Kb`f)+T3s%jQok+iK2AmkVn^tcI$_#Mqf +$.&g`+?g$4-B<4E*iHu__l5t5#7*:$B23#]04rBDcHFk=.Hm*XKqX!G4oY1W@n6Y"qKh/)CQneUGH_#Eeb"?o:ApGBqX2"Z`W'jP8ATcY\qpA& +e,%u(7Nrc46'W[WFg'5Hi4mLN[+j]iBLqf,GU$J/A5(0;<"k&Q%Q_31Y!N!cqH,E2 +5OG+(hMY4Fhlj-'lBaPi)fi^Vi;ZJcq_UE7;?r`8l]b_os3o@^DN:oC2M4o0R<6he +P41nDqngIHL"!a(EoihhKk*BVIl=o?Q<8Fa/Ec$hLtpOsM#U8SEBU_L.;Q>>p*SB! +gV*2;q%YttU_Mb8!)am-Im-Buk/-Wb.jLPehoMEk-b(-jN+@gjFMGp:`:&K +nTl$IC)]hXaJ'XM8asK'3WFk$RUAbf3e^omir;d:_G8],M/Se;X:A#0p^\>%G.rn^ +#f[K]LH$*Ck!-#QZ",",`?hsQK\&kF98/B:4.ID!,Cj+hk>L^PSkM/Bdbj4n_A`Df +s1A433m>!]fO.9OSS+N3?YcnE(&Whk@D+pF!E,O>\@/(ZdY5L6W6_Y6&R#_EbCciU(JquK5g0BS +$g@/1ee_F@%P4AA:hWj9=G80!Zm4KHj+!uQZOUn7'Q3MkguA48g$aAgd"C2nnq*YZ +Na$kMfpKgkcp;N-P6GVAlX3=;^sSAL)4^B0ESU_Z:6sg&@t(5;3K1eH=gXqaY06bF +.heo50=lPJIqD)t&(>c!ZZn-e6r00^/DeE,cJ*"ms-X5ps7%9#=+-Be59)tbVb+D1 +;5gN]Yd8eOUTVAFY+Mg;q!W'pk@Lb'm),.\5M?$ofL&hNB"S+lP/he!8qQm$CGcNC +q"m',F$mG?Go5r?-3!L"j1i2#Z^h&Grs!=?P:&?l0)eqUrE;RL;Xo77[KbdlhNe$; +Uu'GtN;r/i+-d5l2LdGkc2UK/H-[9h-M:u\9#Gn=VQi&:9Uf[g_mTBi':f"!pX +#*a6*Qf<-Y$Ug.^V,?>K*d:6fs+#?kpqq4jsr.0OY2?J,6P5`@2*TjJ?qSF7Lbj$CPAu +Jq[GUJq(RNncVs\kf=l>_Tj1OqrhbAr6aBc@sn`A>qZki)FLD>BB=(&L-Jo_rU]%< +^FkNFkM"S'huYn;s*8JPn#MZP\ifdQf3\BC2hLgsc%!FKPe9[8)/!j_A,iUJma9*& +\DYc%LA@U80UZiNVpg:gYhJ??QLW>uM8_OBu?HCQFO`S_c)N6M1+* +NU\X`b!9luo\fc5Z0!g>+0KL=bL'2W+2NHXC:j),SFX.7?J+7c6SD"Fo47BC"T3b? +5I?e:K]eG7?PpS6mk9a<*O&9gWi)C%F8]0-XB:8X)A<KILB!\G<4<7-ji?KmQ5qd)*m*Q'm")(B?i#?Z,[f^!4l7(>k@D?GlH8_8TV?:>OfK*[s@\ +_jtCWPusAW@D?_lT2u3q*(;jdbi\o_=rN\SBa?bVO9S[']7b(]0Q9$R#H;%Y!7P=:G1]r#MA_prZ@8VemIcgUnUdHJN9F\1^T*]+oH3`R5pO +kl;88mU/_8Ep\iGr`aF@f8Fh/+6.#Om:aW3hfq0]@1<$ls(\I)LAubb5FBd"+Ff!0 +3LR?jP*[o`ItFlG5?u!QAh<_tVq>XE.DV[jN?^QE_^G[Bi)0Pgql1]G!, +eqHO7e-Iu\pj;Jg3H+*6CuAI!VG]G6nD,U_e.6EYeh7p +NTL)qTrk_dlhL\W@J`$Cmp;^I5CNXY"]0n[m0,DO+K9kQR&KSnD19N8F]W8qddgb. +HF?rM`IYF#_hJ&j_]RO'b>uj7 +[P.Faj<.Tgfk_T%7Jm\kNudOqB>03%iID\>bNDVmfiT-MO&Y4@VK=Q,F#K_E3`NF2 +LjS#d*rkQK"9ngla8U3mj?MNsE^p,ii;^FeiBQm'_>c`?LDg-LT,C`j.L,o#@bTZ\ +QbPU/HPt^$*f^1dj$\8Ni'3FZ-LiQPZoJn*1E4e((/d(4eMJ6b(b4c?;Pl1LQUcouN[Bdi4QA5EtD^M]3d' +$ne3ul6]b$Z,'KNLOZEcn6N<@e]NO%='>KP)u"NJHa#FJf>kH=)XW!kqhSJWEXIlj +]q4?D^Xs(c.FQ;3pIhlDbH1%+""X6Na@F)=.G%c:`CLeIjI +(O6h*]%mVk)a&$lnNT7pbW7E?8_lJ=eWZ5LJ40ai?0aa"5ou">1hML\UnK +$dah*d"UFJXHu-=`2?SsD$l3p0o>NX640CJ^TZH@r+G[EpERV+f0fFF%).PMVrbZl +_gSS?h'NShFdi.fR_)X:D;j^':4$!CShR&86cNa`^hfi#3)%Sh.oe0o)j_Gt_%n'J +k1.+=3kPpU]X:DP]EZE+%EAErX#(Ccmp_,;^MugO@HW.i^JK>?18OqM#q6dZRheA(,(b>$O.fD +a5Vb;)%<$dNQ):Ei`ddng?J5]"dsi&'M8.bd8lSI]eGWAkjF.9unc1AobSO[$%0r;G0a +^V?0\fnV(fYWjb"+YNiq5NE7OSN$,u]Fl&okIL&fjR@7i$,YZj#%29pWUiKCCbea. +E@_*;`Ze"PB-O'a.Y>,-!qJ,r?%\hn6U@Md:YQF?ASdMf74+;RdHCBH!G][6>7/^9 +g#Vk+FBWsKJ&c)Eb@5kn6D=ar'l5FqAau.0iM_D61#cDMO,Fg:j.)Aek4F;en#n,U +0$7L-ONj<]&Oen`>sIMhRY5`t4AW&!5-s*';oe%]HAD)r^%/T8jDP@1)$'1&F)G@'djc:s_=5\RcG^p+k+H[Y(D,J<\ +.UiP`0eMkuZ=rM2@c\_$7/]Aq*J3?9T5p_-S^)p%O)h(Hh+1N*E$T:LQ\O*7)X3<" +k`;a]%4*'RHbsPg@U$hcKd2Fkbd27GV+*m-2.#;>Zoc^m?I3$FLJER)%ibXlYNTrG0`$YETuU>AmR+/UnI: +hl/d6b;81^$VeAc55=LiPPeX3:Ysisq/lZ$>*I,M7t0a.q7ZC@m1/IZ4\is/O%T=l +O^%?@5Rk3F7lV,K6P/7=)JMTl1qH6u>1MU3]Z[c$bjX[4P=4h-?/EO%YJM'i,%4;F +]Dn(<^PApt%pJo>RXH8:GsCZbHeRTU7,W-i270#4Z0_@_M,AF3n]lntED?airE)RJ +(af^FahlG0]g%jSj=[niB/:BBi)An[.^]N4p?uhAkr]e1\=4djQm[3KE6'Sie +KVs9tRpM2?Y+NTq?b?9np3L&RqOTSLDUs+ff-@lPf"+UHp;=ai!&'n&Bk1=ZSM4E!_I1EFp0m>["bXkMVU'EXj.83?hl8g:gN2sn.P-'eYl28[ +j^(020pWsqP=;nQ7gnF`*J(QI2K\&kEG5T1J0jI6p,ifoIeZ +AQ%IUH,WIcS/#[e@\Wfu&W@%nYWa//eXtoeg!7`#&Kt/l5N';<_mT>J**g"HHuZS* +n>Fsr1X\j4bKR"C10gfhoSa4V+$2(ncP06i)P>1=-2E?qZiYK::(q<2@4%uNQko2Y:;IX_Gd^l7@Fl$7^Y$#P1:9:le[F$FMS*,JG6'ld` +?J-5A#e]iq]Fb"5cg..Hl^tpG4InRDQqsFfD_DO5b9*6=f8kCjShQh +T7gdY9*^t/N,JguER/$E!*Oh/]N,eKX,(Rg_SV-/rVfef!Q;.[]l'ZEcO+qo-1-'g +X6C"oP!mg(.0,["dN\JU>!*Al.7m3P7gt3Y#K%M6*1"gPWlq6;e+%FM7klfVB*n>d +&#b`f4JtIFQtK9_qbu2M_[/VN3';"@nlqC4&'spO4ZE/9bikN'POGM&IRN7X/>1Mf +gN'(XlOWqlGPIL;Mf55V??p4SG@tjFDqi\]m`Kp[RpBrQ9jmdlnBgWp2@i39c[&j[ +%fu^@^=HI#=,CW3M/2R@D!VV5*JeX!`O>Dmf5q7^OT^bi0n'cKC%3G`kVdq=J*RFi +')F_*o!g4>Hdii#[)M?NVba#-^SiaB8QT_bpiuI5C!goq(\kX4T" +P.)U@6n`rmrtJi8#X]@,I15,KofqKO^Z0e4+";`aB-1Xr,;Nr%OoG=*Cq")E.: +f4ilRe9'?;jg&`W`ss]iSQ^J(2$8&<"n0hAo0`9B@H"ed[-^_?7B?Lns,@!J-L0N] +c`0.#_4U(E-C4d]Oa0bb6\!qDf']*.%u2ooI5+_2DE#b?Y#SX'=EE\,^$YbV[t8MT +k;*(cJWOWb@/Vg3rYW:,gP=fN7cS3gAgjKm+K7d9]Vfk4-]=j#`7)(QZ?8.4&b2ZC +]?4*!2kmL\<8-NV])C;2.]`B/YZj-tLln]5C(L)(*%aE:r!H[i-A>Bc9(.<9U$DIl +)+E\c,u[s[':C$IhI%8[%li$UW=uruWLuY%SeicmoB53'nqV5(4]M.$*LtFs+CSoc +cZ:^/#((E"(p4#2a*.X`BlP`fP2Mpn$V['%^W>^%g-2?`.U3D2&].m@;FO*p;fV1\ +$!f%[T9K;#@2-QXq`H1aJ"$)B4SgC3#t*oLir<*#!IoItPC7&d?f%<9j8/iUo>gb- +33<22_>j&hQDsZ1\[:e6R?F953giVQpcfTn6fLEr7#>BkI95 +r"&eAaeq2SgT*s9Ij%TKHX7,VI'`KZp0-?PX5,S>m8'mibM(m!I]H!*?PZqn +8j1(3c#<\;]Ncg^47NZR?D(uJ:dibt#jJQ&KesptmrE`kJq'0/jXFaA!>SMi;Pq@R +U@)(G=FJ(j:!J%*8ZB!(li<@6TJ"Xl8+)V<\q56LctAj='UPTqV:r,]iN+!2A, +GbC]#;#f:AFX0Ap"_6UJhBPkNJ9Lss,iAX]7L"BM-Yc( +m<1+11f,ljdVp_:/kB +m/KVD:aeI*1cHa8g"e!sbrX_7$8)>VO)qU;n7T0Lnt2%/g;TSMqDMhIfBm:p'Rg%3 +"TO"%Z8XQq#(M_!c-IBj:Cf-hL>+EO+,8)o9*u(Fq,@6Ns2k9XikKrOuc$I.jOaSj;pVIm\mr:=ogO6Psj*(Eq9g$mI*;m2Ni#BGhJaFTX +)D+-/!.W6+q'klATt-cG1/]QM8a;r!po82C2Xei>)R*L.A32e3\8<`\NX"N2.f3m( +Wn6=icSJZp[[Tnj!<7JcIh82i\lQ^rXbP@19rea$KBmdff't8@ZfCS>e +n.><*D:A(0Yl`tsfEM&6[ThC5Rdco'Gbud=b^n:-]cBs8Jeb("Ar#,O` +Q7TufpLp?C=HRTRT4Y0I`VNCug^fr1V,^97.uo!aFm*&BFR-'t$ChL9""KCfp4cNj +!pPWCPK#L)+;meEL2'oPPq3nJD')F`%]+?/VKG\1oXm`_R>gMMijQOZ`(o![!+'tCG`SCp6Z!DT0"Nr0nJD'2>l@(*I=86n1%AZ%ZY6O +piJaT#R4P?+lCZ]i=(K*`4(s=YZguS3Z"/F042q8X(b-;)BU1&kF*#R&WX0E<2Sr8 +0;cGtjVHjq$QBPWBD!?a@Z1"G(eF&[i'5X3n:-`L0?!W^(0h@K2jrK` +HT[ill^U)k5t*:$gSbaA(u74i.i_=N<$\g_s5Rgp;A<6ijiaWRqNZ1"4r(Zc7;bkI@6=nOI>U)f$3`Wf +H@lU;]F-e`Si=7tf)"4+9>"1Cs%R*U9:D2QWi'^.let65.g5nB/f(IX]M!$c$0f_b +8&4PRFZ,#o\QGfS'q@41'5`) +(btS;_sKkLO8OdPqAR3SJH+RL"sL.\/-UP3TG#VL0#7;0*[e#Ep,b+5[dZuAnb0*D +mF3pi#;TBEa+4k3>QP`QFN\TM&s.?Ukn7k#Op:_2* +B?$@E9,5'\:o*iW:@BJP[*X.slsoKi6j0;ekp6I'!XVj@&4E`s]?<4\qcCFWs/lpD +B?keZordsn=Wp8R0_>,.]rukO%CsI[e`76,qdOCA]/VMJcg]PK3M1eebl(^)$1U7N +^LRQDs1&,B;uGtJr4gQ0^a$W:%-##tc2Uker'(SP^1L*$@pEsRi;[QOa:`uaqIBDh +iqgEGA06Il;W^W?9=`9I&qYU(!?g*G)tXL4:\K8=oHr3"&H.dgcb,nm=/Vn:5);[Z +s/hSg43T>[s$$bohhd),Ch_nu!dqG]P#]=('aD/+<<@^S5(#oPAg=pRW%ID[BuBDG +7Y(N>"_40^a-$Dt;Mb?c'09nKYNBa4aP,X?rhE!'2OEKsm'ClIkA'l0l>T@;!_[\A +\"Ts%D$C8--MRaX.0R"\un&)n@C+h](h=":N")5O9*f +r1F?MJmc6Z29N!K_BijG.[Y@R*\RNm;GVOj']<,to4,(T(W[+12qchhGE]R=FEtXb@9)sp4WIopQ2"@8I;@Sc +.[l!]e-W9bj!>%\*>9=9?idMRet>Q8F2EG"I/`dNc))bj-a0VX*LS#:B`X+]Z6W5q +0(9t\pG&T@&*148Yb,Y/(\2LO!$XaVJKM`nSn/$;0Hgf`'#Q]AY+sC'UQJ4p@KE1Z +Qid&p*TjjQ@Q>H,>C`'rrcS2ZJ?3s1QuAlCg]7AH2q(BRBG5RUUH;<8]S-<^5LQXB +,P0`5+MnB/dlb$P*da"E+SS$@mlbof([M"q378&i++/SCj9LA\VF;JuZk!,Nn3:[d +r0Pq5ebg5"i.!;rs-E:Z$]R+r>/G8_U=j`:`uOO"MOrRnYHtjgiUV67]2$LdP6SB[ +.QnDF09,C^7,pRfm?$b;Q9kT(C>j4UO#/q7m89Bk+_?q*iEcELEQSO^\p#P(Cn0W2Hj!g +Z'Cr=^BOXF!D=?:l)K!D3j0<0#e7A2_UnCPSEeaP3'SF*0?6BjUJ;:*:0=tfk`mot7iL)9 +)M/41_#NrO2JHRJ!3^"!=$=\WPPIBE9*5*:H<'\6<=CQ&%sZtJqipb0.U+mo%FG]Y +`LSJj"=,^m;V3T.IL^@h-Xo6"!W9b8e8&2F7e4J',$e&CDJ%;ajtRnmTNFu_:n3je +#bJg^dI*m)-oVg(Vb+7^.I\F2Ifb+Ur&4W5m-dOLCLEP;R3qG4j*9]`+j29bD62lL +/5rA^era).d3t:m#VEjDLfaZ'p!?/9n?tR>@:SME@P?]Tj\@i>rs,u?d:NWkP>TSS +p!uRe^pW##qEOMB7a>r^^9O6;T@/94E9,`hmkkW'Va3]\Es_YB%A2NVYA^9?n-ud= +i$LLSkdm7f"n_WC7P +"F-hRH[$&,/79o08ub,fgOheR"9Gf\GJ[dEU).8C`WKD@SAr$XJ?Ns;o7qDk\J,5f +?D:2#+nCE''HT!nT\Kd(IkjB-KusmUl3.+TF2m`XQQ#2p!Z+t4mX1^KQ"8Y0=r-08 +j1%:'3ZoaaBo)RNDfG'X'`MFGShus-NH`i"/Z4PV8/PZn)k;uU_.aDd\BtKd#0qf` +T-^\Uk"huP:WD=V@pa0UGk%CR?iNt[rC?;Jml==]AP_=Ja2DD:5;@`n514e7O,]SY +_P,;TUMhA=7f6R@4=Yp^8oDOG5k?8!@4n3i3j9@uG";YR3=Y!W]XnO.$#k57IUG0E +Lal:o+T?:@If5PNAZ>RU,sfk/BP9:94tH/4FL":nr&qbA +osgj0!I6mclJ,/gATt9;9CVZk:G:mj/`k+UrpWhd(C%'r*sB-%2jZ;l3a)A(=7N\3 +#(?\b@2Pj$KRZT-M!.md33PWmIg*Fj1rX0sk-g?J2%I6"O1El$\tT@eqV\2R8-(+H +W!?a$:fnZNqo@`)lAk@5<0mZ,$N)ECn\QrS7d>u*n>Jj2(a/0u(OiX7n,<`iCTRHD +Q''I2A2Itd_ZShHLWqE$5<(2Pfq,]NH(Y9ki5NNq)P]+(rte0t^]GE*09dP0I!2G" +;LgNtK"Lp/DB"INm7dX,\>PtifJ'Z&@"+[:WE-&=OAJdF7@um^+Ei5XnYqdn_8t?N +69F9P*KU?\5qqdm]NkjD8VAp["kC^T0BB3l&Opo0BB:Z4atB=W52V,Ym^N(@+*=_/ +eHFZQ)L;<[L`hK;S]Z"FiA`,=m0,[$ptjRV*`df8ok'L\G7tP+nDE;=!c3qf0T5T\ +-]7N$i-SZ@_/ji)IMG7U!8nsZD+=%;_L>.25MHglT?+E2jI6)ZU>V+1Vm&s]a>"K8T\! +IaC'e*oV_og/iP#8I@@k(i6'JdKJfQdb)69F3eGmYQ2OibF`JY]/2[X2&L\JfS1o3\W7eUQfD#_3WhKpEXABRkMU +?"!?=^eu]6S'o2HY/#CIYR3s8V'MuLrnCAk%*HJ7`^7;r +5=-[2>9W?0-?MuhqrSQHho6*+bTSNgaA!T.4;H^/(HDWr=+k^H00lnJY5+/,J9N.9 +F@8'*"H+;9hTgdOJH&;VV]r?^2PTA_P&r9C$/f)#NK=ML.p9AL$Eub6n!T"!K#c!S +:9lMWQcMP4Rj>hhN`fK@?d+T5r86Zfhrg'('i09>3K:jf_'BV3"t./sNd\c>Ibail +f"p:?LpU$"C@G7LH%TnIAD!SD25]@n24ups)H)nYnl[7<+;fD@NU(fY'KAfV7`kVh +o_b&ml-HmR^D9NC;)7_^[Jf0qOr70n#?(U7rdW0lI`YFaRPjUi%6%I>c'eVc^el$W +6gk[7?i^i=Y9j^,&rk+g[0$@U]W0##?V^GV]aebK@+S2[)O0#HdUB372Cb):J)UE: +Z=GCqBKWNXeVWU_<``iDrsS^Ss"au[\.^$/?o;8B/s\Kp+[o!tA/Zei\`":/&G]h] +fLhGK-cMFVCA)O<7e]S5VAhXrIipO$28P*+7#gg1X)dY=P@23;s]*; +%);r@S=^7:]GP3:J-Cme+TH#hD%KqQr"TgIjIr]NTe5hs7[\bV\::p9^UBV7g$Vf/ +b4B>Fa1Y7B)kF("[Cj[Y6dApC($0GfGlcc9riX@Za!?s6g2*eaB[<+;Mq0.:sBbrYNblHX^kI_B+Hg59"oJAOS&cVe,BIXfP`+hN_ +O<1WmmVdXF%kpENLE*,T5DN6sh)AC6s+C4rWqt&],65T1.KuIGr"H.cro[L"`*7*k +=F;L'd)$SN1m6'AK+!KooIi1KQSB+f\N(\HQc,TD7m^Q3_Rh24q^*Nl?LrrM'?#dh +hMJUjEFI0mgu,ehg"R>u[c^(V[qoOMAg.GD&RFF**Rc`k!.;!N8-F_\!,(Hi@WF(T +(XioaIj^>nj'5!5P%o?];rCWFYm0R6X'sM//@dB$#5_(%H7,FJhT"S(#r4S[R4A1I +JA7k&2(n!NK;ce=j_E0G^h8q$p&H948e*HZ#"5ZQ:,-#Q]:(APJ60a0/hpH1hY'[a +qN!-*:QsfoZBS3+:k6`(qc?^l.fq8qJ-Fk%C5CNkUgP][MJ#-7:Z=(Vr2JS3B#!D$ +I`bMS9T'!;94l\mTDptNp=K5!?aD,2q1)]oq!qq+r&o19$iC6X80.g2^D@BmNbFdS +4J-37:GD*HJm,D^`.mIJA#q`VQsa;WTLHu&LSu%6H+]E$PFo*OomQ\XFEe`7W3j&s +lLna3[M/F#/aQ\8*.#pIYOKMH8Y]hf->lDJp*l)[XPg!aLqs&@S?ZEs:AnK[""D$` +@_<*H5)Z^se:GGd(M@mc3BqO?IeFQUm#o*3(&1RI!AR@6o1nTT'Pq9DgD8"ig--40 +r-<1?\FA73iHJG"UaZ!1jD4nl]W,UHWff*n>rDO9,hO54>n/1>lIn`bh(QmhhhX58qlKM#a=d_#Lst +Sr#-PTua1cEKFO$K)D)PbZ]^-%;6.\JoP].J6SG[Wrec?]Uf6$3uoAc3Bb=.%FcRU +YQ0@VM4GkYnU,i&bJU0<7">FL\Wd[6OEajM=A?^"`_lb:Bi$>X%j_Tt ++XmCR=,+I.%rNB\Y9"$s3=o!1 +2?s9\j8CN^%!1@A)ZG85GYI(!Js*Yo3rnEDQ,GO\$S?mA%#X3dJV6-q!KZ5)AHBUH +BSKB[mu\0b_a,=KrS8!9"fMboc3G2Hqn2=jJI@"p[qhSf8i,4Rm?A0bn,38'YH6Wm +V.T(mj8\e\J*[Gm0==ap5dn@AJ+mf83u7>#;gH31FoIT%c(eM,8%3/`"ct_TqKU=f +K91TWAg"i(MON_:OoH!mZOF3kp&PE+!Y8rI*$ir6q)uo`".fMg500#gHDm_UAnp@(L-EmK$'hr(19:am2/d@JgZ*#QlZ_X1>P1=X,"D8!Hk&pPe^LIc0:'A#=,78DW]s\_Dc+ +^I4,_WlmQ5LO4#Z<"JHSC>m7;V3>7YBAmJ(.DTET#Y>%\(XIU;rrN*ApuG#='lF-a +C6JGF6_KHd*i[Um>l,Sp1r?C5@T89!?[rNGJbbs9T:02d._0mH=MTGSH&peA::j!u +mcE(S'\\QfTi<0@SkMScK(sgRZ4i-\eG1bn($"(q"fG\PX;P[#N;:/Oqc6A'.n;]P +!:hOV["*&W8"GZbBt)pdDQ!G]S-\EZXOI/dZfMq[ItnK9!,/jUf&L]S>bK[Clk@:l +a*Vmcn_&Jfb+kf@AnS/=:Hpk0s4j^:f%uX\qi^Cg8A1]I]VuQoh]Va"@;>W;h"#mh +ou:XUD/TlqQ]6=LI=rZ^Vdf+p!UhKmUINJ1"8G7E&,_4\8.,C3`:Q@*2&b=*'`)i( +XL9dT\sN$$dJ\@no3u5%\VIHSkFt;#U05$8?A4NuR6b^u!?s.l!-Z9^idHkR0FqU) +WeTPB''![5JhS6;^4H)!a\P;u!A*/u$[A04I4YB7J'%il#QDX$7eeA&9N(d_i=SJl +,SgCL:[g:T;I1L((^m8V+GOSEj``Q*pFrBC+^R[T!rUm*4$oM3q`,L>g[>tpQikIt@+\be[@4gcd +VP&R1+>AMBrH*QSiBK=(`h#s@r&#[X2:o5Zq#=RrYNc1s5lLlKj,YA`iA'1]1BD$s +.Gef<]JV:dQ53mrMftc4fPZSOe,itgRI%Lmj4PE"?5uk?Lht#c9OW@,fKjdlhe7') +AD3+hVIqs&IjPZ]X +#cD)TU'm^B[1$feO(`VVK6\n[iuooh$3)1D-Y#7>;e1^b+uC#N90m_TQRmTP.0KRQ +'MPTo@-%X7&,[fe?/B2rV3SiGSGu/dk(9i;F1)]4?kmT(8C9V!,hQ-iN@(;ZJ&\Hr +UnaaE'/GTuA3!Dl$h&KcLKurCI3K[_lcqgtgk*Vhns;[X&.g]/inm_u5>Hk[RJjI* +mRthNp,.]&T/)Y@XYZ7m$Aln#KZr+52\ZVaok(bs&e[)J!tUC +\p#k@%l+nSUZmD,k%auMa8Amj:AFjg:pHH:-i@>n(k*.U>N]r_F#,1f4"FfrQY;j= +nmBEr?^FWkb67g:d17ebaaIij4dXmm[<2>il0/^Ij,;U=KoBHEJGF9nRC3J#J"&Jm +NW@.j%K&L;%09I@V^m(0Qs"3FWqG!jY^cbPLK"@j +`Lt80I]plphs+P*(PA4r#oHef:Au@.DkE!RRG`;4q/,-umA"Yq4b4?O=:^mg2dcER +GoiH!N?8h=RL%JCJ-_dbO9,Q3*X_JR)dt]Be4l20J-CJ9F>\TOcIc3t +@Coh2fJY=F+2J#_1LL$+g@ic^G]c+3c^Gc%kPr!8.LXn:0$#&(?P#csgLN2Ts3lpV +6lD,GK51(tW=IE'+8CgTaV08U/QMD?p!5V,btEi;d&1pnE@#VO+aW&iHI-(0UA>Xe3c)6SG7N>PX%r5'rp40=$ei;?`$c,&\iY_\C%oMibRu8A=31LluVqMgq#_aWci0W=' +n,/7P6)JIpB_(cZfp)UBM>Zn8=,re-T>Mb/gKUW,!'$]5B9F1nN;SIG"o(mA%58(Q +J65)Q#L=b-JX7t-%kmJCcI>0Khbl#n,Ju+QR:G]ab6>BcN7o_>Oai\V,;fOebWR:/ +s8RLbiW#ET`-Yo]e%Z^C!qsJ!^g\Eh+N5PQ['PoRZBch)ro6>MTt,tSlp%tmVdNKM +7s'`qC1e^JB4:a/IJun95LC.Dpj[iZn5^e=$^cokDmR"2Aq"IHotc#La1HG4dQtMr +(H4n[O8G8`*4M;oAm0C>0fTaTJ'Luk90g:BS->6D[ZWebPU_-K+R\oL;YX10c;2ZS +SURQmh(j/!!rqk6r(%068r%Ig0BfKT6lYa;VioH2B4f^ePj]"@9A(O_g!Y(IUZ<*h +B5XN+ioN7:c4XHY^`fbAl0*#@fS@9EK!?>01;"Wd@"_`7j430"'PlTGH]TGZRMM?B"YZosm5>'VNY6+_1VU2Rq9@ptt9*#dOGThW8^[ +_sU:3c)kkRY_ECb-a$GeSUQ$djKW.m?(K3;q[6c"SU#*Po_:[pKlKDh;9k`Gag^mU +DsAWSd>j!@i3%OO4oLVC#BF,j.;H/u!-puIo0^SS+H%-,GqnMa"oQDT%t;iO=I"<) +l4I@W88tUTZq2l`T2+ho'=N#e5&938D[O3U(0YZ-2W9T;THo)..YV$LpF1pfapIg` +$?\uPEWum_EUASjJA;>AI`J^n:LP?emq3qW*!=J619Au'J,)#20]RMJU53U[=X5]' +!<,Q+/#rASnTXtb7/g6/4;I@:r2G807%sYp8n\H;!MGZB1L^@kranKgGs'];cSgVl +*!Q=sXn*Vd@/VVnk<_/r"8Ne\IIsan*aA\c!W28Q+ +J%JFf'=9Fu>*L6`ig/_LBQ0k4rHt=TK%9!'DX<]tb,t!aCrKS_t2(Eg/Ng+;`eL +1%rmm][+TP:LLR[/5HnBMo4ViY^2-gA.:>7]p$iL1\#l$Bd5SL-t`s?Io:5.OoJne +n8cP48sX9FGFZnW#<5ZTR0gYjFW"?T="I1WI6ir8:kun4A4R`R#JT.-$):&jkX!R) +/5E5goB>&o-pHa&>:G7(8Fe;8#XWjuJ)98s +,[^>..E0^5fjgX1a$6HDn/rhpQhHp=KJ +WVZWBr4$9E9.!7.O*?/5P[FM61,2.Y"kR$EOIES2RD%E0I>8UeH]MO*%PrTqDikO) +GW56LhVaTEJo2Q&R7qGpF@uB!jMZh$q-p3(;?1/,lHMBul-ak)a;aE>-M+V'gDCH< +PAoj/!A5f(aT[T=cANBs,/)f7lLcr8-n,^BNRK!T>_%+6g^]MR_:uMAP=(ST$UB-FR +TJ!/>D76oW:>CB?=8$i!*:EO14="[N_\$iq#JgAJ'/uD^Y1AtGI!5#?4oO15#!$7M +$HiqrPT@trIQ4gZ[&E=fk+02[48Voo)Q$dt8@`9$NLP7k,Xc_4J'Ks9P.L[ +i!CeD6@,Lt'(abq/:d5^=9(?7J/?$HP$,h(36+oVQCqcs71.(%`3iPpQ"L7EOB7Wq +?)EjB(RP7$77$)*R-\`$n\:OmYuD#XdMKrW&dntEXTgb@Wr\aaUC6Fd0aqcFHYIr? +F>%K*=3L_bkLVo7s6m5[LEaCn%Sb1gFKLOh_?g'rYY7HAncFp8:+c5mA1e"V%c^\G +(&S10O8Vb]fg\32Q$-so6JcMddf'Mp5[a3dc/a6%0K7a'2#)OX]-<$F36'ng/bC`' +kmBRG="DKcK*^K7s/>`lrBKA[DtHn1N"J3j"92lUrlT^Gp+t!W:>h0o7Z4`V$/oeq +'A1]Bm56*Tks9JLSul%dj#3M-2NGIOJ!Z1*mJ^id3D6Nu'Ii@B&=11g]5j$btQ:!rRDdW^h*T#Z&H,>!W.- +N._RX("ZoL'OlO>V7DtR,Q3tWV<$8Ff0PR@!J!NENo),Oa)Y*pcWm4>/[_kF6fI+( +PI&()eY7n],u`IlR0A*&kke%&KX)]k'I$V%q[/^7-+U-N> +s0Z\-a&MkVA8AU?qH2`T*l2>TEZp:$L!ZK2+bJr+U&^+I\HD6Sb/lt4$;aeEOX]m&L7b:k8E'T +n8Eo/?]!C5EUu7EO_!"93;$0MXc-P@42j2PWXXp:37&8`(Vp&7\&T,RkJP"Kn,t`. +@!/=&nhR]T,Q_?S?j,<2&&87^']9^N6\ipg:AaqXL.[YNO7j=Fe]YP!Rsn^/rQ2dT +BDXI-pLfa3a=99AoAF$M[Cr;MqpM\8'jNPN-[h[r!L:[&)NS1lFM-5aLbo'XI%Cl= +CAYOpJc)_LauYsPrQMi:DG'gF[eV+ZOU;R.uRfr-V[EBaX<. +4Sohb"Y,?%!=QsYEsE)o#^/cME$C-h\e^OK7O>@A!WEYJ;ZK=)F9/c]r7qG*q/*+FVrpY<1<%\1K&$Q'5PHIb?s.b!Br26P[7mQAUE!W@o\f>6$ +U4LsO1q%r^6V#URQNi,uk$,)8FW&#&bo +/:]SNKGghtI^*\%alhkWnuEhl9^$6d'5`DP["S\fJ%?Qt)#4:3O)&.Vk6,'u8)r@Q +U?uZWp9Y)q%A's3gNjgVHFKO&DEipDISMuWY55e@L;dKu?1Et0%ZeRXc-lt>8q-AR +>j#o35Zk+H'?fCHAeG?Q$RKs%Qk-t;iHZWTVY4kC+-&qMNA;ED:1 +Ef0@9-#X2gZ^QZubXau,aMn*2'RQ1pZ,;caqB=+UmkV-I'0PL)m)`7BYp86-6K/9R +Y^t^s]PffN?p53^%!P`=e4QmIr_`T^7/LMp1Bd_bF/M4b!rm6?&Hr-`g6]:`;tg>Y +!.6opb`n:nim.cA5hZs1s.=B%Hn*/9c0P:_pjY;FpeAmRd!e0YH]:8^,t5NtP/1M4 +5V:t=r25R-#>+kac2U"'cbe`*63Vr?C=_UhAEfSnmOl9OVfmgrs"elpV/>tPhSTKq +([/,^Fd\o>S]im9+f.5.^[)UB8(Ff.N;m'B#qGE('h +lq[Th\>gd`UF.NQS6ocL^=hX$j:<2s$`\EB\rJ1VB('#tK($qA$kR&rH +YniSJYot`]`'1?d^Y/`IMAUou![t%nL`o8Z@9\Z"`sMbh"]4f_,Q]GKTS!3Y0`UV> +:CXZVr(l>24bB*"M__lbK4N7NeuW+M]#ZmrjA$7,o8\E=^uPA3V*'a%i)j +cSX+CB`#OD`rDY[Yj^)o"T6/)@1g,^5dnqrU4D)[qGdAO)IJR +47CU:gSO/K8(2UAQHO/?Vqi8O]$$;u\r)hG$+"c(P#;fLPKS;SeuE +*loF@Jg0BgWoIAWOmCXi*MLFnV=BNg"]3#WQ[G4#_gW'3rtm7ILqd9i=m*O8s7gg9 +':\b6r6o*pk`H@^&3F'Wr?d$K4heu/I;KFASI@Y$%D5s?F6j@qm2TlX0$C"n'gZ,H +r;K9:b>`l4%)2m?G[lJmnIfPPpQQ4.13%_fC`cCWUA.O8eD`Voi=JEVO:dEV[E*rg +8ItiVN%s8O;XX=lS?^%L>f$bTiG;u\UnDKe76E0c-2R]D$TL"#5s1bn%!nNm,?MZG +&>^U1;MS?DT'6BT!2VKdSUH+mB6%POZa&j!-sNGJm#Tg,+?t"_T]6"Kbd$nFj('tL +4@8Q;5'uY*%)lD=$lnGQU);lf_Z+i=IIk9\MkN:es1#'U9tHLi^hk`YPGFT;O5`1( +!%J/>J:H0PY_/YfWqcUS>5g\p.DTjj;erp9dVe]RGilJ6F.\@;aZKq*4sBFp!.T.h +^mc0Gf+*@[QfFhAS%E1EQ,*FQi3l2_GM*F8X?%=7(XY,!h`SkpJh-o*DC%p5EA^/l +r.e)jptp2kau]Q0^!@V5qS-ug0rg#u+"'K)@`'RRi*3Db!<42k!%3A:AiX?8aT'S- +DuMljqU^m%i'5$W6fuHndccj5?oY+ElG8//Sa>]Kbg^K9RDHiV]8^Ed"LHf;;rbN-X$uh5]P= +Q1-d$=XA5Dla"4]@XYlErr/Q,2MH_d!9(s9=Q(-meimQAmoqZfW5`%O!DOetQe5c) +kJ&\?"P0DCm/!g@oeBRaTP#.XT0*/:K*=LU0]5s^li+E=mOhYlhJ.BBe8aJC]?Qmi +]=Z<8DH3-2-p)bGTjc76h9!.8$Qj.35Mqt#FDq$9"5+3FjP;k[F5*YOJORS\,:PSF +-XPCN)XVFog>/cM\m=K>Vk$]9c$eFb:^R'g@_n7c_;M=7 +cAQR8]@S50[("T;^&0A7!;"9/NE;mZOZEKoA.-pQK0)"15g=0&:CB-I$i5q* +T<>oY'lK`Qqf/F0YstfL/^ER0JN_mc9HXK^lO:PlkO +%aTO1&s$`PT$W;&V$e7Crj53dHC0msM";CRdoN@+%U]*=h@;U'::e.lH[XZX]tAIi +:RGGXb34h03@c5 +"lgX)i?/8_M!1(sH&2L:54Xu2:/41G^Qa`4+kQ:a%H^eK!'W;R;Css!KTqafW*NBl +9-!b;=V41Jhp,ILYY]EZe(a:%uendR3& +b8L0Wr6J<722JIq(#j`<(ao9O]BpXJ\3*TnCDJ-UAcl3Zncq"2EuNn)FFsaUEU.2K +H::[%S%)e+k6hKn@pE8g0GW?iCk&5RBPG6Kc,HoQ[8^Ch!1o*ARA0sM--/7rNip(8g?kB3_n[]4HWZrX4`!rW2@!3](H!12Z$(0[l^=`k>hMH(r,&l'`2LMMF\U3$U%u"L:8)^_PK-Oh]P\!_4E=C5*l8n>cTu^sP)9&,SM] +ah=`@$:]Z2fdQNq+7ZM#qDHB_/Kh<2Fo.#N09%SCQsL@d5?0IG67)k\Qa>t-s6rTX +HbQMUhC.js"g^t`rZ%;$%Y>i-^d=-(RDcM'X:4N:H3C4&f^!gPm@@kTlOCn<6D32q +p8Gmn?An3q/uST>u$q*$sii_T9h*3<8F>WCA +iUf3eZL/aYJ$_H+jq5uUUVof[nQ5AefCm0i3#$Z2B_$5n1QVm,S]H/rb'Y+3p`eg9 +6gj&jg^EM$4)K!3g1-__`B8(!Hfd=5T?0*_c9@f9.2DDK +#m*om3@Ek>`A,TR.%c)^n,,`&S1qFr?q4%>TREiTD-DHq]"_MhcSh&("!S.LiuCj+ +*s7@%(27U.FH.(uK&FfdVI_O#,0A.N?,5%nSqGri&]6AhAO50%@[a37/Vsc5;n-E` +Sp?2XJt4;AaD.IRU^!S^60:S2pn,J\;dC9Y3ML&3W!RSL?ki$ef>/[/9L5AdkQ4/G +#Ef%VI@?`3F9`fqX'HW6[aGV7`/6_:5;4'M3n3+A7eM8krsmt]8/iD(n!6JX;MKCYRD$E9f9-$<;>mh#?",k-"+,LTH/e=f82cO2k#,H#&^WQX +eqN?Rnd&R+c,Qt0E"/lQ$NM`AOe,r2b/b'u@$cQC?jElTM$XYu#"H9AoV3$'h^%6n +?AKjuk9n4JA?[lfJN2_SRU\V@&!&tWGU0-b2^q**mAk_n9UT!XQ/YD[Wp^4k3X`nW +64)U87/h_]2mITU0UF]'S>Ua)>nHum9DL;H$.1rTr1Dnm-3it?WD_[SDZu@).%)CZ +s6#f(J"0g>p#PErEr._@lr2lm^WnJ2;>cjs>?7^:C+pkt2_K'#Ir&YVP2"W'F0F3c +mKBG2.B70@gF0ti[+,M$,Ocf7It`@sl"kVcduF;gJjB[6Z&^;=2T+uuEO\U859J>G ++[q>'oD#h['E0.jnY\"?f4.d_Xaf3 +$\1b<";68lf-`_a:PN,G!OTmplP/\4R9tTb]4T^-Iaki(aaH&+>M&1?hKo*;Zc2T4 +S%B)E%Ob]di-X0B!68Bb:3+o3^E?)%$_6\O?;o?I8*;TZd.#j7-L7`Q$ps)iiaS5CU64q":p[Km32gDWqLG +kX==TMnQG]na<*XqhK7\*Q`_?R!&!cb1/k9=8+#sg7*2$+929<8GMbl_7\qX-2!4< +bpaIpo?T:Yr6fW^C.%O%f$#YhBigcl2k-$"egK=RMSJjInNpCDabQ9%\$Gh]El*:I +o)C#ls$B>n3FU8pISd"o$PlPOb:&8A714qBb)>c1%Wqsf$ciToa:*.j$QqbPi)p0^ +M$4Ii';ZoNbmF;6,lWQHaF?ERlM@!$s/GL:NWkQ6rua3!.1>odc(C*t)uS7aVZmA4 +fOfMsBaiHMRUH9eO(=VG11S_rHqkefX6./q]/p#ulP3pWFCq[add3N22WIoF/^ +9mFSMJ0kP+r=;N/KEhN).fN?^TL$*g +&)p$.jO(B*WTEdB2t97mi:`#S%NP-j_C^c.]'_]!]g^TLURpYPLqp(ZF7HbM +AKc$rIO"i[<;[7.(Vku^O8PVC'JE9OGZ%3>$NU0UaEJ";'ZNLm$0dH)g,4,*D1 +IP$p6jXEhnHi.&67m7D3OEcedR)AHUkDOokmfg3g8$tBD1eO4< +52bcP3>`G!s7]I@_#I2an9L`9/7jk$8TDCf19aUn=Ar^VTjVM(b0Nc/:>e>Mpg:Od +8\q%gT3%cQ?aM3MP\t_id"A`iZENGgh\Rd!(J_aV$\%^jpgL:&gO,k%I:*)kJ%V\L +MJF#o;b(J1HcC[,k19mqr2Ll,fLQ?'b/!s,h9M(#Gc((25kbDj7DWjZorB2)JLmcl +_.f5j)i&iVqja:d*5C$5H+hhgiM^Db34iKl=TE.XP5/&Zq:5AWaHqtiLcq?IV[Z*< +o;]Za5d"\9*k2frfD.-=%G0ihYL32Mq2s)tPB-a(G)&/pIm!aR]\_Ul'8JdkSZfN: +$#6`[gMm)]4bL+G]#(M[U+Ynp\u*N_D4#_6+Jo-7%!1n*:BMuX[6O?0hR%&&n`L=T +0'sJ3hOj>fWj%\:XnVaq`XCtq0:m+Wj[/X.igM[B02E?b(R7r7PZHn;I[4"31ooP3 +DW[L[UmjBl_#MTG_3`T%0..!1NXri<(OS^9Ila0FMU)>3.$!gJNqK5"^b$qX,qHn? +/0HIa&bqt1@%Z\%#Kktq8EX0/#liHE-i=4RX5e](AD_HC`n>AlDk(Nc>/^,rf":]73A;D=DLC\BZ8VA,*,U0)WA-s:cj!-4[%/3F+D^TT$oT` +j),/%^$Kl)*V;M^%6PX)H9)pi\aKe`DKO>T9cDc:e".6L-PLilEEs4i?%@?7#Yo2j +-[6CHh*2Y+&+IVd?50m+,tgJb:+rHba@R=A(tJ#GYPZOm/#im.t>L'E6ZGk#RcKKAm` +n+JQ50H'F?JpuYXFE";1mq&uaK5TF*_#G]O#?Z,!-AY;BH*+m^fAW9a6*6"e4<'gu +mso?F9e9VP#%fJ5%8FjTqSrQ>jprZk;h-BC@Kr.YL/nGp.l_fsE%.q3ncCT))U]`& +k>Q/\ELn3u-M_/dQ;""VS=KFZ15YqTQJr,0pq_f;L8gi#60=AHLXOV[nM5<0F0o(q +3m9o27Nkb;.aVcDBlcpjq\SQ&(2=(\2,5$LXnq_G`**K(b?N,S04nZ(<8q2*1D0>%@YF2)K.:1Nm?%e'_o'B/pD +f;CbaO8IbV#!L-k*:?.`?Y+Ptg?\mV^WYkje+%4u-SBU(h.jC/ftgE+Y^i5da6Z'H +/9Cn3YQ,7(5Fm4M,QCaZ^p#("TW7qbW'=o+m^= +18T-mX6,3bE\69"r_r;FM.<$q:]_#\Am%O-bgg1hgZ5?;l*uKY=>p!^kI0=`+:A+D +q"'gZs8R$:K;_"O,QAd-;uGOV_)\U51BPu&O4&Z@C'5Wt.p]t]1f6b#W3BV4s"NJm +UY@]NE2J^lfT,m-QnL;HLc;#[b(:B8ZD*$pf8Qri*:9sVdd[Q= +R,daL+-PbqioVZ=YS` +CF5bTFV::s]nmbs$1Cju[>tR#iCN.Q^9NL^8W;(&QVk# +ns+%1;MH1LO5%IVj\s#[pj`<OIrV2!PP?u(.s0Ki"9pU +s-mO*8HD@.!OPl]q7128@t>9!J:`X("aK*#G/5<.WLY[ZLT_6gV`)t4J#W:%!LVAl +'Ia1b&G%QpiqYH"GNmUPR;AnR1M6cns#GFXWr1d3+g?Jm=UJF&>6"bB#m;`cBN&brR$9@u4-3/NVd=gCj!8k9Wb^`m%gr-o[?3uQ\0e&E@L +GM1amB3$[=FXgPe#V4e9MZ8+.6T]658e@#gS.>"Ta),Vjo6g(MF;L`Mb,@58s#unk +DaU!p;mDr%4u(t[^jf?D\cP):rkLiomsLjS"h.gtScs/=!rRh'*IM?=Eho<8'n;aF +"aqhk==mA-WOcbb3FQSNTR!&51E#!;dc"*OT#f-H]GtcH?3/DaJDa"j2Q(5LJ'%,o +@QiQsK:jEZTQ93oDmOaRSUpu]jF&Z;!a*a2/u2)$P4?iO>O!!VPb:eah(]f!]c\65 +qfLN6L%k[>E/#306U!.-WJ+T-IBo7K)hGXPHCQ%!3BR:B;Zf?*jd\ejs#@K1PgLUd +2_0,i11ks,C\]JBC^4]:EP'EQ+hlXACttph)]8'h#0a8.s/#Y?.\\C*%[VjMND8G5c]EcYmArhTi75Q;`5akK28]a-Vr2?VGif+n<\-`(-_ZpJ)%`Pf2H1MSE?9 +^RE3XOr\m,1ZiFU"Bn&gd!6=-!"UWR<5:[D@$\b,'ubEK"VaA7kCpJ/L:ZH$]&\Q) +k6=$0"Fp[.K"qOD$Xb&X=8p;TA386Ipoh++YQH*/!ot$qi32-)AH>Ae"d&=_+T+\: +!0L?GH"PRV0RTJ/ZQsBPK`;%%+iSp:ro;WZ+Fbr_!YhtY"I(H'mKVQ/BPUf=TGsqu +5AnIK>Qil_!m]]urtiuLU>l+N49)Phk^1N,XL?RDG1,1=BR]jB'`[D[,?fUP/]`_` +I$BB<2q"Ki#9j#)<#qPBrsIRV5lghtn=NfJh"mM8e."b1,5`hX&%A3c=OMe^ +CPLS^M0@_oiJn7fgD];R,KFd3_sRaOgE1h0[X-Wpn?Ca9@?9o%ZiA$p&!*>ck(]4- +KqhL&Zi",bKGbuU7K2de8=(Oi(!^l\*ghcM"ocgp%*c_",-W3.@;_![,EO7nK%n'B +n.[!4^6CL`O=jg0*sE:?$,DFcY%cfo9U@TGGs&/1EWfW"*8M"7?0au +E.\SIO2-6&7Cin19N9>c>lSgOIcp<:h_mf1Gs$/<>kJ0nJ'"*`b8;Uh^Dd)Brfa@i +O+3ahs*F5n%]7NMIO^la^%BQ6:=&rHN0?TuVJVWX$k$@;\o)IgHYh#=:^bVS=&%B' +QM\=^$Yl/=j0WHe?ekjoL%(_i@oWZ>!<9$8S,FW3a3&Zq$h,79arJ/W)d'S4,)2^. +fHn1C.96lTLXZN`NX>uAs(!H7`;a`h`.\.tng<<7>KIplbEK!(5SP`"s6k$j9<"(# +Tc!PXpTC(sD=:ss]6Z.oCO9Hl2@ltkkVH(^liLI!Z$+JCmEd$ZDP8,T6ndcZrn-Y3 +#:i6+:F5RU=V1:"+S).#*MW<^+cFtq\r]Fh_g`*Q[VOB(MP]BB8-'jR)>:,J-)X$ +RU,AGR+T(-0":t_9Qj#H6)0C-2(*LN4i_!)Ml?%F# +kOoTf!-eY/f9fikEV'YFj+!P6'h5%-Q5;Vfmkrd(YuYNY+4d=$qS(B0TE.lUek +/pqXlX84I<58u03q5(`:^LWU:82!%X.Qa-l\5`6Rir?.?`+t'`Qh(hBjU/0O`a-lM +\rmYO.4t$u8e?e\^mP>NBd'_]TAjOfU*rgAJ:]IV16[f.2^PTNTN5L6l ++A3i,!macCk!-n&,Q-)Lj'&Ho[qE%t%S_KRJLrjdNN2niW;03r3/%=M!d=J^nf.B( +pGZLA?]2WkMl+1E)X2nO]PrFgRh!\U09(+9`]ZrchnX^Vp5LprNG5*P^&?n:oPg#/ +P!@+MYE;$UrW2o3J"\<%!OR)-NPG'L`^l@P6u@b[UWhtb(3G(VYQ`;/S/-';1YD]I +.(>aU?J;+0g*'dLG]#TG:>:?tT!hkZCpprZmr5\fm:*-VC8XSsn*[R7_qED]CFdS; +hds8"=\Kk*Ilb#b>0r0TM:$t9!?Hjndo$(:M3rbMs)\[fm?72mj3*:bl%j5u%_r/& +,tjR\'j*B?PQOA;dma?:Dc2=oNYL(I(,-Z\!]^=M(IT8o;d5":YkSn@F-.M+$0]d#7Wp)%20X;A_BT"7E#fI%D_#kG7H-YIfjFdT7e+lsh(s%2hj +L9`:lI7bHri1J_7O-aV1UeA7U\*sj)O1`ZO@A11V4_*hW2I7mV`Lk\&S0e[u@cb@4 +k23"RrcS(^n'q:85L6tCi.$K"X8pks6gtVs^h7CV0GjrdI,Zn:aB9iSjC6a>]9Ha^ +s'.tTW,G\&m60OFG89Thir=#5HJlQ$dl\GtrAq:nJq%$^)i4EI_#@&Ms&/da*5<#5 +9_,D7_Z*B3bL?GJmun!-XoMJoLmWbD6o;FJM3=."iA\USM#Tc:rr89F5/;.R?qe,@ +#l&2W,[LL"_0lY-s/1o/$3m@.Zei*n"*$;)[H!MbS`i2,^jJ9t_V]m/VpEZ?it^ka +"92"&\HRf9^t2b,qVhXK)ap`3=,YKM!^dml^8LI!>&"7 +8sR[0qBs28EW-o1ggC.(:]&og_rIt>"]tael#hCWr.eVtp8]7p2G=7^+nI_=&k5#d +!'F7OW:W_cG^jj_ql$t#H@0-?p,![VEV#CHF +JCq7d/b,Gh/iR7S/Ot=?pl%7q&o3 +@AmsMW,k7\;dPOf-o]L:gY\k-Qg`>+cam%C4Cj +[/W/'6T`q%5M0UeTT9-*6dO@egV[p,X3FD+'>#6dG<;AJj(tLNCo?T.YNtJHkN8`3 +mUY86^;\E5hdt-0OdOkEkg&^s=&XKOjusC2L&;JL(^k%"$gp7fM!7i-pAk,XPK,qP +@GOgf'=bq!JJe/X21-m>Zc=6gIj:+AUc/n?2%bQ.9r4QNjE(Ai9o9T[L%e81o\tEg +F?f[9c9Dj*!<,>0J9RR8/H@F3irtbikfS5V6>Kg0oAkD0lWJ-N"f\loJn0Jm? +AB:-OFmoq>s/f]"he1gFZZH\UNm#2_c2W'4!TO,4-*qC+dps7WE;iMEP48L"VA/B) +/RJPV?csGp^qRcZ)Z=\g9udQF15kb]K%^s`\hW)'\PMTPX)TKUeSIe>KKj@e_E4l. +Y5nQC;16X)Ok85_g?Pg\ZMIR9(,: +`4Z61hf[p"\A3p`$ZH.5!qiP4jm74(i$lr^F*fh/?9Sd#L**2qjkp='+;h2Xg%p$. +jlK+0Zd0,QX=u^,ddg;HETo9SOp8Nke]5s5>C]M`0L#B^lr*ee.s4n-4?ZS]6U0Oe +:2S,bX9"]5-S +Qj&S%?`f=\+*%LWK"m@LU+Zk7M/fBqh?_st(J*B78Yhdb]b15`.o8@4SVuuuA"0OX +Y=\i*AoTqS^;!*aTGf*4&?VRrD? +alJt5c8d+76ieJV1)T2ENAieqkdKT_0nAsQCCDujV6H)I +Lp=M+!F[*cG](K1fmbM\jrJ+1+@WpX41u=`4`E/f^=/%%-U;e?0&-hfa6XR`P+;["0JKT+C +i.$EblRXMAB1q+E0,'%h1<]nkl9#XLPA$SeaWY2na"c;lTiQnZ,48:p3IB_H/VKI= +Ru1rFW0$+59g((6>faJH(BUhP+?nM>rpU +3tERVYk[\DJM+a9B.Ie?4`kp)I!@Z]J)7@:Z2fD>\:B2754F%`M743q&RGsk0=+IdLINDGbFGL:ZVip0! +W:So-A[kY*\<*-\cC!>n)-l^uh$]e+#Tjk9p@NVo]r$oiU4=[XZ#X6'@NbDm;"<5C +o(18Es!!F%K1QDh?oo9;+TU.K8[TE:#"):7>QBEG@:@L+E?$0lQl9 +cGFnofM_Kp^or1;X(g.[ESU*'KYn1:!B?;)eKjj(Rs'-=mSF8t!];4XYn_tQ$+tf8 +V[NJ96C%te&2H*0feHt0]NaReOQg8Z@C%37J=4)S-ek^lj0X2'^l^.0(3nrEDJN2S'@fs!sXUNS7Ac09s<% +.;L];BJ[3ICl&"E#9,P$R^K>AS)7p7W3"ChH[^fm7j5$54n>mf`(cMagStQUoQ$R< +(Y<>beER`*\eYemhLGL^G3@?&NlTqXH\MEB/%_ubFPSG6]NN[3S_J+GGr.-WHFra>j!@:%I>lmNbOYGVVh'];S=\,^Has,&f1nec#t +5GS:U&b\X*2ML,@gb>d\:s8bJ$X"VYc[u*hOng@P][B/U5?%-_bQSRQUJVIe;?\4. +j4!:46mGY8rtKs2ftLj!*(H'_(kFp1J&82-%j=.;T3U'CVJ0INE)logP$(?tFdTuF +e-]ieA\Me*EIN0Ij?*Z`Vc3M[PP[0-_9U.oPD(Y&!@j.l4"h,J-Du-D@IR?e`BP2_ +5KGjUQZH)io290#s+<1CGk.n.s$-'=k*4!K3XPhKg\T@&?P`R_i.'Gg:cJ$qr0LR7 +M<7%GL_acbr!t\Rrd,PUPFrT+[^js?;\eZEn';Bbet8) +<=%HY/O8q\$L!9FGOU*$5EYsm)3.-X0H0X;8X>-@mG'jm7G,! +_Z"E7oQoR$r)\U5*A`WCd=mBR+?r*#D_CDL&p&FXIVLqSdKCOW`ei;(+iNd:WPMmH +mfC^!I^gP-!'Z(V$1gaL:U0s+rm;NYrBHAF!;\Cp_u^F+$^%RZDj(@7P;d=gLpYK6 +g+QVj-sfA_dF+$3MDfo8=N0qf\_(-i^o*XaE>^L6Q-#:V<<'_:mK(68e% +(Hji**h@ua&H?[%$u^e./Ht'M6q@?eUF3Kh$=dfi-_i%8d0!n(eKYk(VQ:iA#.-\o +O.17>Kd?Zt.=L/7<=&Le:8QZ^ft`"*q]+D+J3+t.6MTpj[DA!dP3$&of5LmY$!%!Y +=ujgd^Io5VLCO@bpVV6&bS^ZjVBaf0/^);%@S2kO\-`94kP^;Q6b-i^.hn`$.DX\i3W+:]kHOhB?*MM?",$AUB&KoODa\]@=/(Hr ++h_rG*T.!r>j=id#SR4t>^?ld!4%+]a#]^rn8)57lJ%7;=UcI(i#bW*49u/hTC_N@ +Yc[@KGQ90XT>A4m`XdXoI#"$i`s1Hd>c4Z=-EUU9KtK58NI8bnZ4R)rs!c]k.>N5C +HOK'Y&p^o_1-p-f!7#8r"t.:a9^fA-gj5f*;LNL^N(?;Cf#sH4_k%@6Z1m7Gcs(e;+%mKDb +I\,9MDH^oflAjFF[cRotAf%Pn03Xg9[5L6bCB7SR%l4,o$K,pTf2V'rH_unX]bEQ> +(cNXI%55!+f2t.,eB!$uYU"O.+adrT$;l;sT%dfH`.8#3r]RQN0gi&ojof +Ed8ep$?Hn-+E47&fP8@O@`0t.$^e[B40oY^\J@6;*&P#>49Y[g-)&3a&]5IcLCT+b +L>][2!WqlK:>hfQ1_sprUoO`Yr7pCp^t9jq#qtQ=+i6ER73d)J9`Cbs&68PH-Y1G0 +`1)DN]Jr-F0QRfO4/R2u*W^QW(A8(NJH(Bn3+DB^B^M.\Fke"!/,c>us25)V'k6>* +XP=$Zs2X5l?V8q"/mAS[6i?tXBGL:Q2t6SI9'YBuU(o-]_!,#.YhsLJ#hXM2n:)s+ +F?aY@in$2*r>bUIinJGa0oGo'C^1c\i7S;'h[2mQY6=OEqfDo>+l_=6(^2RCoq01E +Kp^I:NmE%DYE#"*`qZ1+s'nHfa?O4[IULL:A^;AB:;9R@;15-#WWdL9P(;R[&qgK0 +\We?OV>Q(Y8]f+Z/rj]JruqC!M]Q7!mb&&=fOkN+ZS*Vc$jYA?e)?Nr$no7)>]:jB +HSLn74p3u7R7_.hH:3Tf0U@6R67Wbf9@&@-ZE)d'(d?*7-).&f3V,N8NRSj,J%>Up +J_9m[jCtXIN08q@T&381!>cjgl5'0%OdZg!s6'MhlG*SIq6[qi,BbKSJ7lflXfJ/! +EPm-25F-g$#;@8,H4BnQ(4CPG"Upb^lHm5pX+(p5ltgHj0!E@eGC^uL!O^CbFZd:I +.@YXf8c)\Io7cVWdnU@92DoFgHaPM'183V-YTji\JGM"4kG/9gg[&7)rq1U)dMbht +NFi2.G_&rmQ1\k4AsJ, +eLH#^;*9qbIH2=9s'"$l;W*&F]n5+QA_f;gS+#Gqh8t(f41F`\?K:^KL25K8=#0*A +JH+u)o$ls1V!=,]kJ[bc!hOAk+6CI+aH*lu)g*P*1]M#8!4[QC'Yp!0!8mp9,Ak7# +&H8F4#e#n=K]5hDTD5&CCBg*`D3FDD)qpkT->*Ls#SH-aXVT;/VD1W"W>.3c_TiW;jmj:R>D?cs>cNGe\Hh3jFJ +o2K1DX2t+:1'5uCe4LP85=kn>T.<,1?h.QMk%ep.]aad5s6KeX<,Y&!;[J7'j1c$% +5^p-r*A#_D$s`kV'K\Os9]uMsEkm/8e$"19s5iXFl0G&1jf7QSVs[rhChp1aAZB-J +!FF]SN;m8qf&oU&hpq+AR(:TXY6&-3-S?R")d,iS>tUOc(U1cF>)4+4LA-Tmqge]K +JrZ<7qr@^dV6HYa`7^nBWE]Pp+#Q16_Nj.3roq$+k=j]fP#O/3e?&5]r5Uja^. +Yk2/al7Z_L_#H@hU*!$oJ@)heQSl2f2^\*5)mX]DCAnM6^Df4%.b4.Y*Pd/\s0j4B +2F7Z#6=)>ApT0,[mP6NrhhdcV@c=%li;\nVdgkcf@H1RM5#$e];`J=(k2ZH3f]i.P +.,tEGs2PNVXT>Qn-4p1:WCdL>q#;LMrg4p`TC='8s/p`!>pD]P-rlDCE#:[ElIWck +5-YbcN>;>LRDktQ:=n6%Pi>=N,"`OoEmOU"[9P#h9I1+K<&oVY_8#2#^h'ppEeU_J +9!Q($pX_2jhW,'$*9]\sGWg=eT3;K(P9JRhc`F&6i/54a)9@;PkI2)%k!MuX#[G.Z +7,.NTUp-r,N\4$ +pm^GF*iir0=6;VEb,No?CA"MFjk_#lH_^%=Wi%O1V+oc3S;t*Qk0LuP8nfO5PZh.W=XflD!B0Js@>Pt%(r=>>+ +b&>][^SMfFb09-M$:+B9Sgjt:iQjd(E.P#-&L/pdS/bNaU1E0>6Y1P3p=D.-^X;HK +6$#7`pV)HI^V6^)/H2\C=1TOSFlXb=(m1`;O/C6Zd:\R;s.B,51*HMpUC/cKOWa[G +nR#m8^n5I1"%tMj%51:bZrg7Q\>b_mDT6%/>(,_uXR>DOjlNT&Co_#`WFTM9BPi(3 +`pBG-krEOc+)K/NTNo8m#O;cC2MuDG.c/GeRHA*=?H)N`]sn4sIS:IQ>/9KsNuqY& +SeB!Pc%bmV$Et7,!Q"\]?k6:CKDP+++CSl;Wh4o\V;V'5:$/r2W#(h^X#I!;\bQ6H +e&QX";k)b+33D4"YS&Y")E>)92?s*""YilLGlAXF0IP@Ls$(h:Q6PtYA_C1[`g!MLFs0DG3s-&uT^jk_0:DW@G9]I6\ +Q?YW$!b";c()3Km!T9`/*47=7mW!2'$TCUcjI_9E-pQcarqjjpIpLkXJoAD(DIN$A +YmH6nI/2+M>JF8,IA#jT5NXUqaq#,hT?1b`^?@p=DQDI:i9p^R'.2nTReof#&H6SQ +^D=@:M-X?J>all?fEiK$poahoXT\AM#'9tIpZ&-ZU[alXrkmW,5,s+Nl$8o[oi[b3 +9>8Y4XARFGM.Zr=r-t%Wp]+G^Rc"1RQ\@hP'6:.K'EJdE,LAVq%Y%$jH:h5SOTGB" +aKAq@6g";4*6M31a2+Uum+L32iE#**34?05Uo6V2=f`0@E$;#Z.BHJpU-^`;n7#ea +76C`%5?kXa-%N`B*n+ZFD5GL/JJXDc#L8(= +.A#R`.aWQ^O3k@ag9hOfcZ@,$+,mQ/M7d&kmNCl?'R2GJlq+**R`rsZ=k`cs4@4.)N)#-l2^8RGQm/.+Z'-mEN +%?g:S*#SkYotR@As-73q%Ea.Rs-)U;*R3sVR`>q\!4Ck%n3M!o=sO8Zd*KhUSYpLZ +drn%V%k`C.!4'2_"feZ"pGL4l)k+r7C#8#dIYot3i1,FrJr>VW]=k)V +K+cqmY/U/+C=MRokQsi!!&)!52S)tQ34=o*%ZZ&]e[ptu%Y;=/Vk*#-"B:.]?nYZe +bJmd..@MR>:7Y[K)df>*m]?WNS>OB*9C1EH*'1G=0tJ5d\f*]DkhEl5h7)b"%piX( +E,[+J=N:C&\?QKXe8#<0`25GVH$ecW>inJc!#0_=/s9g5PS^3-J)4^ohGJ>o&@;O> +#[8\^+X&oHAGD'V^QMU3+7iMsjfcBm6m7!J=hE@]XW5_piSni3cBJ?Z5&kSIMc<3X +@-&sO$%#/ge-WuS"TL\&Xo.q$KE$Au&;#CfoDdjnmXJR!qmhZ;J(`tf(#*[2*s%Kg +`W(W6oB3q4rr5g)E5MX#M#[3IG_H*Ljq"A+So+c*DMRjOBKG>3"Mq"_V$U]t"8h5o +gQqtgOT/am%q;HFU.0@BmBS(j&geb#+/\STrqoI%2P][:&fY[[9TuIk!qeUW=o$V1IK7Lk,MeH>LVsJ6uVWjT5C* +1M:kd`lJ"XYH&ubr")c#*1;"*W),LM>U?[D.AU'##l%c()H^spX&M*X;DeO(KElg+ +;rJ1(Mad(A-&:/pA/51%p?bNs>f#"?B#(2T:O*>D$FCZ?>3Oiuld`jnBc+:(%`(B_ +cN6Blo&%!,_QFfM%K%#hG7aa@Qluh#TD%X0H$'HVgZSN]KO,[/[Pbb<%tO[S)H@fE +Y'93g)E)q)@oioO5Oa0NWYTF'j=(Fq]"[/af(0ld?PNG,KN0VVZosua:bLZ@Y3GS' +2i'S)VU#U_'O[/P];TK\W4;Z<$& ++ob2F*+]!1rm1L,SH>=9Iu9!^0cC!?pmWQ)TI"n'a*S^&_7U5m=?_Hj+8pG&4^rAk +k%DI2fAL9]n#Hii"oeW&?n$Y)rhlCX59n5PJp`CJ*P\A]r4qe]a7-bb(O/e085[\4 +4PfS(/`)F%A]b9:@<`\F#li`J/pKB+He9i1=C/3h4)\t`hU;1hQ-!0% +POH;g9Y\J7+S,sN(.tad)?3@"moReCEdokIb>);JfJ*-2l*1;t3sr/D-$HJ7_+r4"-h-$CI&?OH"(o^@u? +?$U2tj6NDV.m^?^lj*)7HM,-tbo]l7[BSVtLf)5< +pfcVUDj:J%EEPo!I*k,mMNLAQ6\C%,=`sI?i;W`I&'tm2+#2;o45n\:0+i4o^FRaf(:08S`c[;HZ5X4?^^lJj# +LD59%lc8Q4nGanFH9HXpLGap:]W&Q7X>pRE&$om!Op2gUbKCTf`C^_&kPY`%"&"or +nVC+(Uenn*<5l%/)$e)0e3YZcUP^]me6%rm=kuSn!br^*^W#=9r:b6M@.9Uh*;IQ1 +Z^JWWImNjVJ[:)H:h1@o-'=:f_4Vq1W7r/\Rr0[=l_\#usU!]:-hPZr.j5$A\3rpoit- +SDSP*GjnI.n(l0(O,DX4'mAHOKA_bO"mrejaUrL@p$B]!R136'?<1JN:jkc%>m:*o +=j")!UaIIi#=[);&)faK!2oX"Q/[`":\4YdQc6S&`&\YiJcE0os2%_4cO%#%%^F4b +[NN/#R?S%,LF>:[kb!TZZF`_2A +.UP]FSdA8)J.$m4!5*sC2oosWY8A);j[dYZ2#J*Ll!Rlf?Q/il79BHrr=\0-hpPfF +_\W_^69Ss(Iu"jl=B!@lgtSu'4"13X^h!EDK`>QcpdFM/-:@a2)nL-rYF[QY+AMj5 +qL[pA,5?6KDo,%(UN=5pBpfaD%!*?AK$H-L8"7VSR`To?qN(G2Y-pQ>3[hMm.6(HQ +s(tHU=dtq8lO!S7r]b1:ERE03e]gkDgW;.n7cfqc'JJV%E_nDcH7?4K6fJN8%2qSpCgE5Gp@HD0kh8:5(8_7)C$TQ.fG +8*o'>(t]AghhpBD:Kd>W-,KVoHP]qrJk(#/-F'uj4g?%iM/o9=N:8`p^RdQq_k%'b +n/d1/>jn&8C`[or2?`@h&uoi=S?6)B!)$G1LaY^`T:[JH(+) +h$&08AUp%,e,gQ`EMqcU71D=JG.hV!M$_&WhLiUJrN>P(I_NR%#"nFV^>, +@QO32jY&t.i/:d!!U#CT@?^C< +!<-Bd[a0^\+&=tL7qe:al,8k'5$^LihANLli;\a+)pbX?n'M?BJa_1FDt^D&pEkuo +\:AJaS&6S6a"Nf21Y:P2h0,LFipS1e@Z^M\Xa[.SulCJ +pI;1T<&5o +CkW4s;C2=>r]koded:hU4_/.I2,?@^1!0Y20-G<: +^jk>F^>M5;T*51Irr@ODY\@.:H0@\#W$3feM&)s\Mq#Q0.a_EVVC!NkSK=X0klBQ$ +?SorEBEis[C!"iSW(nL)3_b0[=%+$r&tP^?-a1U!J18U^.EK\hrjSec3bhY7:UuJP$A^B>fY=UkEkGo;F7]M"ZgK4qcrCo$5:C$Z!db'km +'FPi&Jehic$T5p!05hMLG8#8[5GS;I2A]XM00#Ai[5U9^CO?n&J>McHQDS:H9u".m +qn^SK]W8H7O+Vb?bG?J*jk:h(5O@@'=6mHTi'M,'6r`27I%qs0!2Y"piiUi>6#`;A +XF2I-lB!T&Ap8'%NWD8oiDU'"Xf0Y/^lCFIVYSTQ"m4H2E'GGR/9NKIG4!8C;Y5iR +%n*b&aos2gk&`MVVnatP`o*ZXIbZc[*(5kUiMr7/[A6Ab/&96'GT>YdRAVHaD'ZXJ +0mhm"/7d7-_9u*;i]:.]>Te:sN%J?66nO,2rNeL.a:9>as!%llVa)r0/P&3^8sl3IJ(*"kWqQ;t8:s +Ka[A-7Ih^cf5.9ZDl-9$_Rh09T(ZhtNgi16oBFp"mhRl@Lg6Cb"c-GgJH(PaSb(_* +b5jct^)_b&rO=<)"U[p->@e9Rg-9B(\_LhBF4R=&-gLAEl7BZ)XN<'VptJ49a0b[& +,lV]Ze:%H0hLmiP,1P_t>f:o#ehgnN5A)VHP`8m]IOX0i?\HRn+DEmZRKlW.PfsAV +o*,i@,X+0q4G&WMnMZ5^0=#0'@dVCM6OV6%4ZK*CP +$',GRmh`p`lMhRu"0]$5Y,1u%:%>iYia%i9FZIRM1=<3T_5/F6W@6X2`)>sY8\ +?FU_PDO>!1W.g31?`\cLp(6<(nj)-m2H^soeMEt11Y\L`-CK9]BdF\(du!R +NBZ,O4lLBJ\;>7TUE0Ok@"?Sq2C-<76#F)E+8m%t$[hU\r:+G[q.*/-Yg9":\m.GK +1c*?,;OI_)V1qYJo#G"0'8t;7LTAl%'c?@Ol.5m-RJ`<[,hJ,B`IB-t0nqGN%Lh8k +%*/tWLSR3"N1B;RR`XG)p>=&=?,4TYKK;(/r'jOeW9m9pT-<6EjGCP((K,1V3p6X$ +B\O@$QVI\I93XZ<,uE-cP>BR>obki#4h3CT.K<>+!<2P'Aod.u%"LR_MOnEK9=:QA +>0rZ!ZnO;I^BkqUmq)'TZh8OF2Wrks00!1+G8E7#20hm"(S+:0!Sp?eIEm99o8hMrT5MAUosQ'=$H:0S(B@51Ft +=G"52r]qMG:G\ccEO_9fHXSgqYWq2.G7cD3Wr^7d$P40sA;d^J0RF:V`Mk23^sPI) +_Cg%PVg''br3:)*QcdRF.lKp3,[1'T9>NCHhK.gCjPZF-iVskl^0+q's,S-F2ImdlEgQd3Er5m1Jq*.bYM93Y +PCCf<74Z+eXb0]$QSsUq7DT5V@G:A.Ca&#ZhF&WIW,>ZDQP\nY6Nt]0>*JKmFBS8_#GG+jECI>;UiKt];I6l +<B'e"'Yp+7n4!V5F/N!5F"gYXR>ts\V93V +MCunHbs.o;s$DF$6A;'Vn-)EM>Qm@O!m4N\.b#ZFW5h%W0:\!"hoV?I@.Oj`B9,n7 +FD2]?JqZ_JM`;W@,MpNSmGRd5_Cf'**&T58CRt!qT6.6,E2*'1gV3a`,Pg`,_+(Mt +$sPrKe6pS6D9f>+5-P9.euKP\577$PL:>BPG!HBgAGs0Yi(g?H%>b%8s'=nkHaR`b +Qp1cR:Y=3Vft801Ho>O2%!Ste]Ro;[K6r,5]`*k*j/a3M"\S<7_@F&j+TEIRN]94T +CR<`!HL9].gA+OPF7*_HDeZ%3d,dCW_8+'!">RZ<09V[Sp("cK3Fm +2[8_No\D1cH,/fr=OcrHXS5!anA"j,7F.OQNk7a0.<%K05;`Lmr-ru,?,.9SJ&mTO +rfd=WErHIEQbku?pB:I,s1?GK?PHu\r6LG.4p?H-rsAZrSpC\a\s2H3Yroi2d6*@_ +l9#&r,7=!tGKLKr!;mMms5?=i>*Pq6[$LeJoE)`27-["^cToL"fo.W4$UXUnRq.8@ +K#MIYd'Vln/hm@41'8=(WK-'Yn+-t.n)tO:VsF?d?,.9S-h4s9s)\J8#RZeFajF)6 +0HbA>p]n_$]UZ1">_j;hE\Y(i2d2[lVSrhW64c:ZP9+lRq1!^_Mj4.;[Q:#2s,liD +bQY3Z0FNsOp;Z>giD5nrJH&2eN)X)i,TWriV&7@;;h.hg3nj_pT5IA9>LATbC%2u2 +#W"rC$,bBU.j*4r:0.C8[Jo%-qOEK*3ChP>p;T>LR@M1d?aFg>(2'a#ce2HnGHt6< +FAN9_eI(op9m!\Tl(9dLr^7=I/b4BCNZ&TX^Re*_?X]"6VTai_"t"`OKe\3qkqcN] +U@i'5@0R6%\^-[NAI0-h-R?N\bCP(W_7f.XICO(=[q@.3Hp(qN2/%*JZY.OpHbm1, +3M:RFTGQ-p,0)U:-[+NH>\H?FFt]-d5_C%b2ehCs%5jlZ%SWB;#1nJ8>d+^!;@b2? +S0^AWb^genM6dI-cq^1nTQgX3K;*>HlQ7N^n=I7:PVoq>b1f^_I_up@V[5TL0)`D$ +'4Cel*L@.PABet'j36-0'&6?9dKJgehMHB9r$=,<"\H`8F_Zj=P>$WT&bA;rT?BF*T*[d\/g2\A;dnVGe;1V +U\O)Gd`"Fk7.@8U=L8LOcA+_#:mGq?8JN9lcE%61T`ad+Ef/[0r]uh]q#=j/jHkb# +@kPO>m9ZW018FoH8s,r"&HMk/o7=^W&sX$2;G_q-J$F$%TqXc!GZd2,>U?sZ-,.s- +Cc]"=-Oi^r7'Zo^^BKHrmQ?BqV2Gg=jrqas:7L,#b\X/8Mo0mR]NZ^fl2\8C>b5H- +2"J,VSp%%5rXW-o_<&>4NC'gLh#&,@-h?L=pMLrEBEA*.3PQ2Qi&\)Vk=,aGgN@GB +BjU2Q?lhjoQYA!<,?O!B0$^[7U8,.AqK^ +#e#1ACB&P,mDZ$IZYo*@Fo%rbHJD#WZL4`hhGI"XVj_d1-2k8MqGh+X2>+J,7DEXr +\(XBufThs)f.)+8P]kq;l@)Q'=Xi(b2D]9feX8m0HYEK5_PgaHCbrtk1f"Ic1aRfN@tjA,pF]Bc]V +p#=eL_;a7doYKOlWZs+daOMt!VZ[p[ +%Xa+>OGs3BTk4U7?a7!"cu=7S6WQ__(BCNH;ks4=10i/RD>q@*q(#2.$r'0N6*ROZ +Vl;H8E$[H@$m,L/Tlu0nq,_jjDm5MVrOcBc1*]*fh29^skb-WcP$a-9s#OCMS+E`Z0cKX=V]O=J'fA^$'(3 +m-CAXlE1fbW?:G8>3m9Z)ICCDBbe?&mb7=Q-LL,g +OZ3iZ&N(%I!"Q7hVflMr+oV^RYT3u,R_a""S9^&[F)^m5;(a=h^Elbgg%0-$HOD.U +T8c?rgY!F`K*sZ3#(_>2\8.7r$NU+=c,HRSK2b#gq/,u`0DR,jEgGU[M'/mRDmYfV +grpKT'sE'7h)M9XLJT5T6p(6TaZ==?8Jgfkj+&!7/#S9c!.W\;n'>S2)#mN\cIhEM +.lh,J%[(J]F2YiS/u+)K_>K@Jn6<\H,lCJtHPQ981Q[b"s%s:e9SU5mdVia+"$OZ+ZN]T@--se&$#.0'nqq +Xe3cp;)+Pm^[a\=lqmiTIlDZnpqIk37\s^K2u+ZmeNO\ls'38t+4jM&;-pDm=K3?> +VSXl]NWf@E.g-Ugs-3\:s)9Ph%PCWcX\b(]e;,PTMn-!]>]!D!("'CS1:!0#%B.;V +62BNr>QM!b?jio96G[jA`*OL'-Z_VkI*E2cRJ(;6F/f6W!%@odhD5(_0,V+:4hT\S +VD&Bk#8[AS-I8T"g8BSdd5p7aC>-'ui7SG_T5o>4D/^\^s%*POBFYO6l);i7XSKB8#X)??-.5855LgcX95MKE-+k/o,X[k.L90i>\Q&15 +lGgMPgFR6nlBOK^aF9qRr]lm":FY[kEnW+AoIH81,oYaakNn)M4aQ^XLTaeQh'g9? +0*)!"@RX\Wr(iT+AFONOOU(g)/HAkX8Gu$orr`:nQ6\XDN;k^6YGDDM_1+TFA\!r] +^QNLf&nc3PQd[85AiO=frkdQR'@k-S)\3Z&V3e"Y+O@A\u+;`SdtDH?f,YlUA=jr.:jFa4_G7P_:t]\T.<`8iAc&LD8$i_Ie,r4*5MZ& +#*n(*r%64\Eq6^_XCKWFiNW,`i4m5'eXB9h`3gKXcZd0'J9ClUg]c`h%$#HjW#$F% +[19Kl*T"&SBo(pg,@1o75ASZK!r`R5lSl]Xp62BI;J-M<"n72Sab#Rfo5>7SiB;[S +3.k3R(@NAg%Le-f@`C.,:DNl!Zh+b#XsLh`J8a:1lY/oNdo! +,7Z#.\'t/n"lNfX+1U=f.p(Tgc141?+6s_L<_FuBM$"Oo.6rGn@%g2#Srum`P(1bG +T0h(i6Ieo8&pSus'",e9e]>q&bbnJFP7\7>.:ZTOdq4IJoB-Vl6jJf.V=X64R3UM5 +RblA[g!6$k8f/.1^7P"3SoT17l.Mi`.snG]pY@Fc\6[m8YI*n-0uErV +@HW&Va1VNlr;TRjc`4&*OPl`FIq8.X_#M#l?h,;s:\ZS[reu%QNcbR$F(=PZpa=&\ +gb:kdPm.2`p]J?^U8J%1r,Jl#YqFa(k=ZN_[:9T3bq6rkX;uF7_@s-MYr/- +!-Z/)K_oE?T6:8)WGkqpE9`1FbQU9$:KIG6qs#O5(aTE[*&K,DV["+Re[WruT2=Pn +/`8i6NS9I_.d-=+;ATnHNMj/_8oc!9)#"!&=oF%tl&<9P4G,n*9:i:/T^k&e0j]p*ZYk"tA(T*#s]VNEf.-ZI1cU@.b;HjXF&\8/eq?d2:KYIrmdF:Pa +\\WV5`lW<&SLb&>aA;i;)CI*;8XG#TS?)]u_M]Am[]apjni+B)MuR2Te.FsU.6YV6 +*b\1;YkX!/eNZ4!^\=u3_:dgp#P7EOW1"6aXmJ+rqhsmfMS:\mTcTY"hE%pUL5@)- +=am5l6UJ@o9;^^@c6[Tb,RlEFN ++0GTn5h8uY$r69Rj1`V/q9,#VrsJ6;LP%Q7]E=9JnfK&mmc%9=GU$j=57\RTr0Xtk +Z"T]0)jACX_3aMpq=#\#Bu5qa90X5o^!B%Dk6&/+1MM"q=1"MO3Q,2TOBGD,l7'gt +dQn3n#[osca^nDo@P[*&V^)4k/]8rB_#I3Gs""!)$U/Q3!Vl-3"B\(tPU5qXA-d/) +9B@)]+38qr/V%LP%'kEDXLZ6Ug%SXJM7o$8%K%#4ot7_]0PGHMdc-D1kp<,*o.E`F +Y-#M>3Tm7SGX!?pF`(Fjm"P3V6?-`\jQk(31%;")0dDAO:"klG`jb*c?>`1AJ-2N8 +]s,0TaH-:lM6l\^\/m!AJlC7a&]^65NcigrNF_Y@YhA%hrS*kI[p+!X^/QP`;^cH_ +/KZ[X5@jV(h!4^2c&3/aa9!F#'fZ`-L4,uF%B'G)7K.6.+-&G4NnN!F2I4$qj-3L0 +\BBdbpD6cboi%HiI9(RX1lEG*BAV64^SR-!TbX,lmr@#4]JI+"a#M2aO;*(Qr/[YX+5q<5 +As(A"&M?,Bq&e^,&4sE_aHJZGbR!p[>]e'3BeM_l!A+4H*C7brC,@ohc\TZ\;*&_% +,R)!._SJ]LM:r@Us(.Bm/43Tm&OI=J*2UU[;3UU`aDh0Nk4C7Mi32^_BB\(?1gPY0 +=#@fN1o%8=-=>5\iT:Oq#UY%pR8O,uf)K:5s)?!@+tZ'67_t]li."Xs_%(rel;W6hAb+0iMlMi7$O!1gW +#,q?SgE+VDo-_A;Q=r][YbK0AdNZo?$Rj)`k%XgSQc7iF/^Xa3=FK@Cq7VFR3Cg[h +5^jNiM]OKC5&RAd*bpgDg>p%4+]L6Rf\ge+oCMJ(Y1W=8KGW+=2I9)3=?rE:[U#EO +_+SY`8piXh>!JSREfs_aQ[NKhq\2*Cha=+^k.,k_\EJTsY0]Bm#Xu#JpF8RK*^T"cETh$P<+I +*GH4Ia[#6Fr=nU7fhLMqB8O'<&cUFrP:H\#J';*tImMYt^S/Rip+q@-s4#^h[K("7 +>L=ecD$7.U/a]k,^ig&$pBhZHoC8(@-u0m=&@[orhP&(3lMO!LN%=6nOoGY+d3jt8 +\,=e6MDbHt^He<:H2#q5*Md6Vl=@V'R5n$6IZlO.PWAo.a1fpDlQ=;N%^Q>SJ+*LN +0E^2DZPf^Q#!X0uIl2@hJ_Aq!IBV8t`g#RpTgKir!+P+m^jgoF,K0VD8I8[kAfU)- +s6!!Ns*"#O`;aU]_lFA:CUciNCr3@j?T#qb_Ij$_j]6c+,94l^10A2 +[G(=0ENR.5>SN"n]k$fFdcL3,U`/O]J$,f$^1qVI;IHYJ +&6B%@J<1t_i"F;m1o4>PQ +od;d\2g#e;R`&I;M0[$3C+h+Z\6dilT%eWQX7oplq^jF#jNe(nGML@BCVQ?5ahALs +hCODcT1&YYJ("$t=.''nj9L$/OnQF=ok?uQJNq*Qp[Y*Jj@8"MOq%Hf=/G[)jdumG +BA!Uh$Y(.WrqR9+_+=&K4nJ?EFF/C0P.chtpa>QtnXhL"geg^Zi!u]Ir\XPJ4Un0b +)r_-65sDR&jHma@>o,:#.fLe/!JLJ`1`/*%:cR0Z&eUu8mr+R*BE7PJ$8Dba;^Pe> +99^(ira99JM?tH;L0Uqq_tP_,j.A07DrclW,"93@?a2"io*rV2>Ir):BsupGm(T;^ +Rc$HnLsO1i.JtJgR22rc[=*ku;6D"k4&Nd,p^]'Vp:MNia^TJ2Iql3G&Z79Fr$CGF +C^npY#:%lVPTf$!D?l3Or9OJqbJIfe@V"L!3!DQa"K"YCBe]h!(dhJc0nfC^=:9GF +'occ2jJOERsbQ$X/o8/_Hr3+tChg/K+bMDGF(Rsl!m*<4'.000, +>nqeD<"rqN($,9D._[L>U5*llQ[,Vnipo?^c/e+6Wl];e3)Ho,OGCN?=T?\_ +;_q.s)m"l:p?WP6#DI,1.ndC?M.2XH$Vb>=U9[K/)W2N8##fOI!.XJJs&H?(Q89'L +J!7:MP;[WH.G6@XhT*&Ka:oCdr',T>]`;&SJl`'L"#^aA^r?df4n*7\dP&/S^DChf +>d=D"s0!A[;!4I/Q'783oC(B1rV5p]KLlUO$Pn4E>DMtqq#<6J":!7)_#NSlPlpa( +]+!)bga2a3[PP.B[_`parc]5b-2_+hCP)=gie$hFXT&M8i#n22S]%E.CcS^1pqI*F +5S3>bJ2d9\s2?%=?go.d"iC<,fSQ/tZ+\d]Gdk.kVf6T"J\TOl*AAkW"h[LEo5WOq +,@,SLV^)iC^J,I``D6U9QNDL-'-OCg')mO"n+\M*r9r(As/OlN$(&X#q(Y%YN6AB& +V3EFLE%_D2.=hlr.oZ]=#A5Okj=5itW.j@a"bKZ$f(:W/jBm9`,kmHtR<;V!9G&qY +AhBqLI3/Edm.oI:hIbL&G4t9Gp=q!AG+XD::bq8d#k")PUA/[,I)=j]P[jB>rNfq5 +LSHbgM$k/tdXb!EkL0nu@c'qCJ(M&'gPB'$^KpN*/NgR=i;&4H_S36V0=]dqW$*=bj)RH;2/ZoL-;$>V/8VnT +Ci@'ecuLY7m8eE-SLcJ)Tr,L1R]dOM_L@#"Oo;@1:O>sY#4bi^ZN:'O8lM;q-TrqQ +GYeqZL;A@7`/RIDjKG1Tp47oJ^gup^_12GUn.5GPi#a0C1k.;(5=GM/!eC:W*r<2# +56c`;PK4ie+6Fi&^T>'mKE#WfU]]6UiZ@/ +PRE9OYZ(4b8=e)e?(]Gg.3Ch_5#HWHi$kUaOE*,OLM9Y]"Oo7/GQG*!(g`*4)WAH4 +09e#A_/E%>$j$:$c0qJ-IG,NBg[faVM/1"6Hj,WAnSbN +cZkoW`RF*V:YY?N*6rmj?1`/7oQF7*ohZ.h;N(%qN:sq!l_fp\BTO!EP/PjGB,VK& +)3lp.Y=-"XN!d3>(&]C=qDg@kH$mu&Uqh?!6$H4Yn"k\"@>DKd$bDnlq'8&'+Xsrb +Pl'1tcBRcj6"l<5Z@@lp0H^1<3G&Bqqt8$e2sG6`D05 +i3#:HPT4PXL(N7"3P(6K`9c*2.M"e5$]D2h]3OhliogR=u +#e*d+%7IWQO+ +s)AtWa'A.17>k]=f#Nqb#l`^lnpelU#QDK_(1H^YR=ENpj*YY-oEKYWR5rW0G,n9F +C;TnBaQ_fVA%fs_ESe5D(R2Ed"901M3i6_/7%UO(!S$p`oJl>i+eXn7ru920@E3+\ +s&o&24,fdk8ENd0D[tkLP5+L0L#i1++;Wc6[U$.MhPEkqs#X'kHSH3'KV-]3a/H3o +JeS2dUiGN's50XY$3.j15jj/\j"nYbU%?=!2;nM<7B>>JI`fQ5!8Q83J,LD4m*bK& +V+T^#MLbq'rXeJ[.elC#&,_2uJT=#L>!S4)?]g(=aed'P:%ptEcUW!!qS]a4cFoeH +_07n\D_`Sn3K)hK+Ul.(iJ]d9fm$he0T(W[61*V!7NGip3BS7iIl;3=Pdl5ugF(n_ +qG$AeR6:QL:Y7eIefF3;^/+WZ=7`Y;4n*q,!db;Ip><3!hQN.+fed+6"P7n_?LQCS +etQ%;9!t`pqeD2ND0VT`.kE":S6lb0@Xfh(#6c>fLbT'P`r7'O9B3Bpo<`S^XE-0C +(IH`.C"F.7ma&lSTD"#qXq*".'#q(MbA8io2I/miWlfR/,oar*l5CQP^A2Aao6!gO +NQh)83FFEtEgj2n2I4XaccQB_+m/e5s"_"krj(H(i.!t`8b`hd^MNJ!RecV#qnJ"u +?"Lj%*eaLN2?f4d_#Nb/CJKt&H@S#4r.4mRi_QYF*n++*i#h'&.?Y&5_ji?17C_PX +n0^poHJ%_4d`+j>3O,!m;kFI"aP&pUhk)fO&=sd*L!gMf;'9]SoJHdN-[I$;_:ZKu +\6M!Y5:b)7-eL+3`(7I%O]"q!nn>sDPV>;H:[-!?CWeFijWYE'+m3P\BB?G+S6/k_smG= +3Ze/>:gH3h"Ub>1II?)l!H.JFll^!H\%nocm,q!LEl?^8U@knH[:J,(FV[ZHI^!1M +>&-Qk89)O#K_/uq?b#E0+0l\;,\HXfF"r'.,K:47g^>>j8t,q@"8(LXf^5*?5\?cF +0MW5\s3Vi`/NpiaXSuD9JbB&#m9_?BRGU+5"T4$(e,,!^a6`&_ESK*nO%"s,s.;oM +hfC*!))FdQg%W%Oj"/#$7u65%i?'Dkm'HL,.D5?7#t\Z'VpVni?0qS-4#_Zjs2@`- +I,"KXkGF5hIVMRlepfSE?a#4pDFKN.qfPL.WA`J/&`E\F6hMtSnh,R\$f9.?0dD%% +PBd(r-A::9D)/8Ea3h$!.7!ht4AWus_aMcg +O?CLtI&3JuQ!ghD-3"#]T0d[-i.&"8A;7[2Ss.'O7'G?:?4CVjdlC44o#KT'XM)m8 +fM3+Kk)/p(^]iY&cCIq^;SpM&bQ'l''2j?Xk8N:YR,(]F&Y$gSerPP:*t2?.#90pm +1hui2`jHD1r)oXmSp/AVCBO'U_!LTAl(\ikk?&#\lO`o:N4IGI$=IhZgYc,->5:gV +;W'dLK6FroK9hR;f"eNpJpcK@\cBd^Br@:sk9ni1VPm4"4I68Dql8NH3-TcPs"F.s')Ckm +Ja.aG5B-^7(@9@:^4[=H5?OGbO\?5pi(o$$M$l;fIuaPArl:SNl!TY/J<=;s$44WS +,T>X1Psg$iJt00,1Yp4)@WM*M.nd* +FQMQU^*71s"TCt>fPa+p,MiQ/!:o#4.ek!_7uPao_t'-"4_c4;*k@u.e\KfpWc=aO +Tn`%IV\FeN[:l8fdT'cGI,\(l6kMs3Ig2VN)J_Zt1T/2qd$_=Tia)PTic?^s6occ& +/NZol4%q@j7"H"rQL4RQ"OD"R/nZBpl%.Du^]etNTCK5dS$1jrrb`MR495B'+[0W@ +s!U,)fDmL(OEPZKDHaOn-d!\thDQn#.Q>J^0\O)eaf72FYp.l31<&3-gSQa^[";dg +So%c$@t-A^nReB1XZY@->l.b$G5&;4SgFY"Kr#4_g_C$:/VfB>`Jt$"k@4]Bi?Kk8 +1YXGp"^OhD#(!I!:2M9H[M!iso)nn6lsGfDWFm=sC%=C-P8kAk^FNXHc^it='k8kX +3Wi.^2Z`hHQ+=P]c"tdR3Zm8j0+1m2Q\SdQ^i9APJR(P?mA+G1^]C*>Lu*0j^Di['EViNl&= +1Pj'[54JTm/DS7Ta5UMf$h>)lD]tjQ?,*C4VZQWXn'Xc%062FtCJuU"Cg?St"o\m8 +?7kts@gc+@+/AlLs6dkAI^0H(.rH>Yi?k[aDS9iWT!,RH#D)oe<1\d_m1TWkP30QB +!WVn^PMjs!@OCibYGEln-I2"tnppa*pie/8KgaJm_u&pU?2Ql]:l^]G +Y+g,kWct_FDi#CPs1&UtefW2g_(&^72R@Qb.K=,2"U`*u@K+ +ca8cf,)I6QKQm%cRR^Ui%,!i_[XC8QrtMbh.An!?#R2k&O=UAO!Or4O(3?XLFFOTL +@+qZ,e?O24i^poL,ObaZ[P)7+=sP9)U;3pOkLos[s,XP]E/O82ei8e&HY,ArGEV?u +AS#n"@ajD.6dn'YS@bJaS0]F(P_F/'JB6*uS?gc"f1-41KWX-Wc?[`_cC*jk`d?PWn7.,R!4q?!oeQ.JZ#1C1THn]pSAeV2D?1Z3 +]A=KJ"3`uE8WC@7Q[fhbG=J5u`19Jd3iH\`nLJN,$nXs1eRI3C46#t!;Xr9mfsNR= +\9bsfoh+>*.`JN)q;!OFSP%_/$Hnu\/*LT!rd)-7>.GJ+h^/%-buOkd7=NbX@q5]> +)g%$"%V$KJpLi4gcFL][q3:>DHVH6;(Wn)j[eO6iV_Ft5Q5#-YD/ +DQMmq3:?Yd6/[(#n\"Q-QO%Os6/9'B4$_$Egi<>*jra+8HoUVf9alQ00190MZ;LmN7SF`a#uY#63GX,jA?;!JI/[1EN6ToI3n90DJaWjTU7 +AW#%GIX[OOCkVTe;Lh3mi2U1,?%T*B?ldXl%rji'+4YiDI;?c_k9Xh,n-#s+!lL(6 +51Wlp3D0;dK+#PfH#D4X^Lp^7"NS5gS=EXibt.]n7(mAL3rljmL&,ubaSFl(L+#rU +qVdnGr')'25]7>]^jjk_W1/H)`j0t'^=B7-M-%U-(Rthdu@0W'/:NkK4=DRC^g+=7Q@co +F/"R3n1tXebR1p(DQYFDd)'@'_!+(AjoPAC3*;4gLor7TgG:J5+'2RY7b[qPhrYik +6g)5*r1eo&9[1CQh4[fkM(TL[#D)%S?oMm.:L7FlZn!*]oM/(D:-T>!l/Vra.DaZ^\B;Dm*!bqp5$$qjE'_I +B7U#cU<^H.BPNGdhj8F*B\sifnhTb;KE)\i_OEVsYDm-WS>!WdaF++S^aI(?p04,b +GJ),fqGc8D.XU)\q`OL-\o&('V4ES?s"^qf69l@_'(?tUJY)(pM#Ylc>GKKZT)lf* +HfTnSR.G/49eY2m%qN,l.WMeWdpulGfm)\<72Lm$QgBkc-*jSJnn[@XQ3u=<9'M=- +l0SiNXYRf=&e!nmRJD/sp1g#VE[gGa1#D:aOU-'c-:Hq(n3NH>\EmHF/5md8;-q"lTH2=653fIh841KAd@'+-W<XmpnR)E"[NA#KD./'pToMGEru*RDrg3T +7/RR>j$\=@MuO;Zp318KVj?A@@Jae!hHI@sL?5+;**:OJb4<:`AH%RZnfRLW5>pPA +O<=MC]YqSHVLF_qIZU"@R%AYVO`QJHI>j_9>iP2dTD8UY!`lh:f9nb0kIB;8enB++THA=Y14gu)5=-i_=\"1P9Sri?hfda +4ik2l6@TFAT3smUiP/P-p9"[V?:u[&aJZaIJf7D0(l5/@0pUA7OT +'\Ik6s3ZjD&LAG?jLhDr:P?`Qs&JI=XL''d,nouiTVZ$]Sk7j)RN"r%2$a+jrt"#b +]k682ejV^1ruFE#pV_bp<;Fq8F^SmhMuhc4_LmS^dlZ4EATlZDY878VQ?;W(`!OHY +-d2E``-=*M>4l"'r8'9EVW\-]Y:KM-kQZMdT)Pq!KqB>@@/bX(*ri3]qT#=u:Zb6c +q%#`@=B@Jk!LUl0T^/H`=!.Tj]ZR-T&PBq7YTa)/#Kk0de#Z5nO;a- +7sQt9\A_OFMKU6sqP?]T#U(C-N"i=Uu'7n71X+.fVIA92Sh/9ab +0XR&]:pm3#I'Joog\W.5i+`d1In(jR)'e=OJ_d8;rOh`!8Hnlj.WWB'QV'#+K^!Z/ +.Y^/Gs"=*4$W5SIPE3lc]B5_28Il%)$W@+GjTh9)`;Dc=h;Q5rTA]aqhL7-:"dsr* +FjE5f/3N4tQQ#sKi"*]j_"R>+P5]7rCNB@GaSbo;s+M.G@3j7s(_"?+P6U@Ypga;5 +J7FtA\DW;1k5q7Xkbaa!cJj!+e/8.a1]Uhg"X:dl_L!"D,U@C!?MGcEUN9P]J&:J, +88cYU"0BSi\NjcL(OXBo5eO&QZ6MPGL$iRRb_,UT?9fkF6qi!SMbp,IB:unf"1\F; +Z@WSIO?UturOa9F$[VRabci`[T[;"F_>DkNDB':(lt;*bZ,>@!;.&fjrh:f#VW7Mg +"i4q[TS=PajTe%%:p[hLN8kQ9@=HM2m#8-8WILeCr4+NCYLN3Jo/"/+ci1X4mhdk\ +"Gi=eJt%6p8G*NM]VR/d"ZJ]_-Q,='AoWo,6F'6N*9+188U-(C_CgmgW$4i5;.Zbp +8p+sX3j(pk%HbFF'Nq8nX#*4E)FJ;a+Us1IF6^,:;G!p^\sIh^P4oSS0e_fq&9k<- +#1qtsCSL>:?Ip13)]\qbHBs8ubGZ3+]-uo2c%O[$2qAjGn(!Dk[8;`H`+8ZT1B4)? +-0$A68-'jD!<2"q00l=_=r,s,lPe0`3!6`j +N:mrNE&""+mN77VJ&jerih5F0`<\/IS_o2t91@,X3U.`=n+4XXqd4M'j:-e1r&U-/ +DtP>*Z5s8PmgNmKq1"\`r+F".O!R^IJH%";,k1h(bLEt5=n +s%L]oGQn+3RW8qpb[l"k-!YfT?2YtOIQHj+pj\)*bC!8n>NZFq]&3%5[Q"A)bT?9L +)nZ3YJl=YA-(EO$O)FNCelf]PS0$[K@hbX\8qL%&gPQ=,s'#X+2["aE-@l,SbRX:* +Pmr9DJ#s`GoEPHW7q-K9%n4qhCfCS<=MF;nT%YDX*?%qo9ru]1()_LWoR8)YEh+?MY1tpE]=h3%oV$0b +:!)%fBjfW@[qZn:&25L!).>_pbIQH"f$]t.j],Q,8,W2Vkb^8\=V,*E^gWmU=7j&d +jMhEje_o_Dc\"eJS4U1Nii^"g>^@+8KLXco3Oj,O. +NDC5Q*p-MZj4LPm1efa^)(kH=M0[[rK%D=WpUiq8_(*/%=b&ke\O;+o6')IZFf7Q, +m-6*Ej^j2em<6F[]lqMY$U2)S"54n_1$TG5)YaF(a6(-)N6QhZG5f#Bj+>%+9#d,< +7QGUrQbS'tVVo/W-hrb0L]?'J?d+!M2,KG5\Ld_9C".T'W#HY0JG?ld(AKlkIc,[j +3$pZD>mA]mJ+#F`SVfH^+7E*i"VI@EjG)88JcP[#rej0Uqm[`_3fO=+akYOS.n.oOq;tGjZTYJkGiQI +?Kf>j^[m'F'bRHpcZ;22pg%:u[r$3Er)\$9b8Oh/Lh[cLG`'mf91T^=4'5;fcDh)r +\-CLQP&(CEi/7CjeRK]FF749*I%dMO9!j!fGF9(J:+!enUSYYEeD1%p(`!IN#'g?e +J($CM8N607MrmR3C.9?7^lo!]`Fs&h&ir2t7U%+F@mISSg)#7Cci:=fq-TuAn-kN` +=2-6LhU4H7Zqp_.D#QZ"(Omp,I:#)Hr;T:?bXXbKp@X&Lo"BMESTYjuKOmS:^1*%q +$uqB?..)dK`sNmEF>&+(DXSd?*fY";re(4mM7s!6@$ksT/V6[/4-FPu,T3^,T?;H] +Jh1:Vn)[[:rRouhbD]LcEE@\jXapqF.C\G[T.I<1(V.KS$G1MGh>`Mq"TB'WScRdL +$FaqR0_AO2\dkn`k6_kC$GTXRoCOm"G]>P/Ip4gkqJ]u?YPHI<^2kXiq%B_Anfu4Y ++De0Z#N$H>s&$GuaYs*-na)1gf]XW:EVZLQQ@sM)B%R6fW)Dp_R^5MWI]XP(NSbU++-R[hT#" +V%`1Wd08@AU4-dp0X@VqR,kXa;BIl>me!<`!<:e`c[fCjSUM1(fG]ILJ=#5m3ht$/ +`AB^fWI#IYeJd/o)gc-=l$@:=c-GC>cR9U%6o9PrmteR1T5`8IHH2G!Ik^%/I/^gP +.Ngt4h?^@d6GVE-g4qs'&-X0ZZq"G9,=2CCG*+GkME0Q/IAJj5LU=?_.!s'(+ltXJH[4=P +PSnsLAc+ubrb$NAJ&kRf/5,u+38kAZ![&*57=N&\s-t2-)*\sYL]-FE3oGN6i%o!? +mhcYO.uaBH24!WI+gTMcW.&r3Dr@9RBP?5@%:``cq.G$1%s&aiJL(2JM(j0g$p);aGgYGg@6a0gAeIQ*SE-?q4dB?aS$8j!0,?&%\o^_=u>ggLSY+9@M+_UXY&$RC?KK>j+emfUHoX2>Z\2Lf9B@_!A=gqOY2)S]M\p`JT2G-NUXB +@85rF39^Y4"\iZU7_\@9id>qY.c>Eg?L:J#4];&k+S3V/i9Hg2jgP;kY'BnCNrct"&]M3diVRU#4S[V2I86ihk\@ne+a(WiK6(%JUWWF^[J(3s4bpnuh3^i5OJlFH(R/`6L@.V.B +m%_W3O_+d/b!(12&'c9)rPX!]n,+QYD0Op!B(b3fMK=E!'`n[?UX`Y'Jr"[^6$n<" +0?XjBP%LGh?EU^YeGPs$\(CYlMZ8uo!*`lnJaoQlB:h$69bQb=N^T(M#\*8?Ed;nT +L`:O41An^63B7&SI>X]r+M:QEL:(goi>\Kl4/DhU]/>kpcUS6\%FC? +6.g+/iP/r%rW6QIr0i@AOK(k_*A*5m2d(2d")n'/R:SoFj@P;0Le^B$RlegqU2e^?+F* +a!j-pUEASP:([!S1Hbmm0+f-`It5:7'Om/Y)eBU._Yi.&A?6td<3_>?:m+K%PVR)T +\W0R]O01<9#Xs=01o)$q8>S&RbSoWJLR+6\es93/gXB=W_M@F):2.n]UjH6"^+MaQ +"rCDqVZb=XKH5+HkIbn]9$fXQlef!u&"d+Y:+f.8>i%C5IRO/gse\P0_X'QKAMq*T]UMspG/pp#^UdB`$M_[__%<[]lh7n!KI)j.P*mcT/\H3\-]/`Eree`MO8SOSb +GqbfgBHXkii'3ZV+4Yl3Skir_"-$kS7_(e0PIAiEchqRj,0nEq4C$$Y[R+b:B6F=I +5DVd[ru8&R/QU1%UMGkF$Z:HJhR1=DJlWc&.tiA5:OH'dC^PsSb!sb&0@fhZid/JM +Hur"FZH2@$kObDdgl.j!nqdNF%pI>7If>NQ/8/TK8rh&[5<>,0@@;j@#FWt(9,8Wn +H>=Oj=*?aQ\l=,X;>e,SEfdF%QE!$2Y;r%%5Er0kcR_+PPFdRD;8S40M'^khLRM2: +$+-XY/]qJ5,0D'dXl:^8dg-2YcE*Z'fWH0#Zh5s946JJ,o89+ori6(roBs6rm?tFf +;m3i-^aY@Cc.d%,-d%3C2o&1)M[0'O#0MIXn##u4r1rkY)WQD1bSbtm>;=Perm'+M#S4@aDuVq +AP#:<=k%.Ui[#Q:[U/c7S>Ht!L'iEkI\9C7,>`]K?8c'W4i;J1N>qAAQ+SInGoP;\gWop>$ +:j8#*&%%',ck#)@NSA+^`;#43!/),JX+iq0!1k9A_$=G%(g85E#'E\YDiK'T7*\Ns ++I\oR+':i,n))QPi4baXAQ/V1jm/Ni$P73QQ+cMGE<+pX78r^T&(P_C.[GOf0>9:R +]D2DeP1b'Ad1)Xf53-Ci8nufqat;[>M^KU!9!lmH7'!>^WPaE]k7"iJH'Ddr`*PPU^7$Ei;^5pm#tkD +=HSPcg]RR8A]$#bkH\K'4MPa!g@9f9C-t%f+R4SE]OaFAR"$6e`WQ7u(X;tjT))te +V]HpsdiWB>>NV&"lfbFMj%eU5d\B^r=*2pcO9e[6s/Mh3Rc@O>`u*5<$)4@(i'7-( +Alf-te3R,X!:[a*:+d.!Pk!b53GFh6iXYqOq9nGE*0X$MJN6a)S>((`pT-%JG#-DC +rqtO<.@8bOcaP3-CeHbf/F)l6aAXaeRU3t'ImlBN);ip]GOAW/aa4'=%tYal7%ATn +\^6dim7$r<4/"%jL,;!u3W1AeF?AS^DrQbmS/[Ok]SaDp/E5H;^lpAf6tj2pt*2Ek5WZKOAi9t-bD_b]:tbK@kPJh^Y6iCHAbqZ8/'Tqngakm'p@WM +BkjIi'+iumTJe2*:9/(7j&uY?!+7mK!dh2epIH*mlCQM2)DoZa26BUWfIs=)(:^RZ +Wg;aI8R:Z<1J:.S\E=+lO3Bg9`PtY21D18s$Y+D>+,Sf17/"?nim]Who>Q"T)(N;gA\e`Q]UnC +r8H1[EQinmYqSgGg@pL:YQt.uUjXA"aM7?HJ=,sHR"'_fW9K*SjsHbfP9taXb5=l& +o0)SMQ@2;qmk2dF+jW:pb;g%U5a[!kOE-GTr#IHi)fG"D>fpD6;1IRpr$/b8N%gt/K"kd5[*,f/d2`Jd8PO6Z@4O-VbbXst<:'H'd:&U*;q)pD* +W0l_Hj90/k_-0,QL;/Tb%-[`p"]:tKJ9m/]E0Qjd4X]tHL;/h!7)X6bF$.BGmp5`] +q>L^uO@hjf8jda,0S9H%++_]:*r&7C^If&^ZP%*hOtO%>:F6cYAg!EYK?K2s($:<% +/%MO5>[Kg3/1$o?MeOe8]Ng\Fdj07>F*+FN7qD?AKl,;oc?Zj>6Sbpbm[L%qDMj5, +WlK\1MosmZAJb9>?;U=t<<2/SZ@R9mkEL(gKluk7n**ZG'HJKS':Zs5T +(34+:2pc@tkIP>;?%P[BX2Or3:$p<9EU:AfoLI*S:US[O*q>W!M +qPRg=q>]`jpZ7=O^6kUSr=)f^-_p*SWbNpH__a`em2N+Y>B.qh:OJFd*k +j?4meYHu,FrZZDsfmBc-Wc;(D0Bf'@+6A3;\e9h,Gf'bg3KPAm5j\A +iX`Wfj^&ee5m-_NkfHHfEfhH]T9g;V.f6";cd1^D*T.%qn`k;1]bc`Lrr9od7_(JYYW/c$DUr-+[l_n:)8 +I[2?7gP;-]bKKM;kPOiYI!PNOg`-iBp2P9<;/YN)&2346W5(d:oMb@5ZiUjGU&[;C +30:KE,]k]t^Td2e&HWGp&G[26`LISSY.Kq]-/j,XrWE)[_E\6RH'hnZ%e)D,,>BYn +(#Z9i'W\#!X'JA10g[m@.#aY%U;p\M/\e)/8Q0]RNp;Z=0+#rkC6aTu14H=qn7h +ER&Pb(\unFr.ubdC#D38=EJa\fE8==CM]Yl;T$"IBFPRT#RB(?2:WO)7oi=ald1&^ +rnrZQA6D%+/0.$3f@&NbH8Lj!NUA6erE)"i>s+!>&0M0;VLP[Nr`A@D5O9dO5l<9@ +pgBZIdLQEZhjHs\2T_\]GNSES`mILD,TY/hl5 +BHt1BM,l;Yd!`C4dU@BTs%JpQZ)PSMi'7#:f95)=#ti,o$tGAXD5rB#LrEfkXL"PC +dm%!5hj_W:s$&PVhA8u%Z&QFT%BZ''qDe5<_sF7=R@:l,R#]Sd8+Y5#Eib%`^jgV< +V*pJGU7aI[TlpV/5M.LtJQ1,G%X3`H8qisM*-+b^;LNG+$f0;^4#s+O0r9.V,AS62 +]bni#f9=_4Q[J1#gtB,he$"q(SgBnP&D_Ra]'4\!KdT`1!;Q'[4QbFoaMrS#oln:m +5kcL!4c*ma*EmY;W:kC"r=+gVLONksa=TQS=!8A!c@+'/EN:\MipG[(bMK[#?C"5* +(@_?c52>\1^$Abo/EGkBb3;ul`b46H*fq>5k;5Ba<1Y`W2 ++G8U%%YD,EVcJHFs/Q^8a6N,T*s98]SrZktbH$k:js*kuZ?Q"fM:+\$_R*3,3fkH$ ++4#3\jsBE1T+P_3`u8VG!.Ste!.Ua%LP3pe.+M[l&qKe=)ErZ5^DFWI70qi?M;Y#m +bt^Roa4TQf#D%'PHZB0RH`HoJolsuic]oS]H`rA-)#/tn&q8JaIo[[HGBAW?)#emX +YKT90#@[TN$A.Z^YCZ_2[*POfqcs'>+b84)[@[^*M#RI)A]R'Zs1KR`0E67@s#q7s +J'%`hR/d'qe;_S.E"g6?+]&%I#0^4YuLf&0plf3oqkqeDJVgb]f#a_q['Z?A97Ddu0FO_o_H1jSO!+!r.J#!a:\A +(*K:H#kGY4"eMFi09DF\X(;$A\3X;)0F6SI;R$,\/70jD>>05Wd8'&nR"Tl]`c7@8 +4V^;%\^2-<'DP.PIPPnn;Au9.KH!mQ7Q&l#Nj<=H/TWBiMZ)(ZR(hljY;`pZ&NmG-gRL&e]'P5VdD&ggbPfL +WpENX[2m[o4n>I9`J$>NUGZQ-]W?T`4>8F4/jMn0mT@p3/ErZ\nptLps+9#4S6o)' +UCfYdaX->q*0CCi0!M&k7_P7F8Rb?f"<-M)hh9fGa6Gp2TaC=O\iN\n(^0"4Jd:fC +\GhQ'atSZ"=O*m8+P^e4VmdC>Do?-iU^J'PWLfMW3,\LdJUa-kuj;G:=1-cs)4F354bo@NGNc-?g3K]m%dkgoA::/ +!D`_"r_K?FF2m)S9"[$Qp0\SWrk+cFIPR(0IlQO"RX5TnZA73lS8`QR^k!t"9N;$p-Up@>#mT:CdBFb_s'YUF"Q5a]n.&V; +VO@YeO6=6Ib%oatNN\7q(.RF&A!f?1pj[eV"]o>(BU(!h:Resq/ocYaOn +JDNAb[Yi(k%=KmM0@ou6/Vi!@UC?a63b/8WmhrFk$0oHr;JB$cP$G!mFi]/OZ=(#' +"TH/,)J0]hg-kqZJq-a"==KM?RNGO*bIkcZ4;6VjS1J_/]2n5RDt +0,j1qR75T#4j\#jZa#IEBZ+K94e`p%&,m[G5F$\90'`i5IlX]\ +KAO(DfX$G0hnP]YEi$!eWM";UmhNWfK7hI!='7\eBFD-[Eh>;=@C5Mm3^d5;7Y?6< +.D,ec^KKRj%qe(tc"dR`Db*C\"?d9WG$^O#9c?Lr/P2H6J!;3[!YZ5]>n\cUmI(kecURQRVJGQK#rHrn&R#MbV`/2>.Y7d_aLst\N=Tncr/(LRk*t*jS +?]fh^B_+tjhfY`!-Hs94G6tL7,B_(&Tlf +H%?+urIFnTQD^8;+_/"qJnH_N'R9%7"@l=;.\m/i.$_LYdQBu +^+?S(19nPKZ`Yd][O/&`-G?RJ#QZf^c';EJ.W[7B'jdu=T`]0T_kaH6%&%rei6)<)34js(T%)Zb$Oipeo]BEe[$dS +nMS9FqL!bh$GUFFe@d0pIA[p.WukKR31!6`Vb>`IosKF@QIi!bG=>FP.croqci0\K +DVI4XAK;!SD\l2ZrkC>Yn:01L\RcU^f*ndVfk;UTo*b%0eUNh$Mite'If"`,F,'A_ +RYM(As2;D;lEL1*/%1\#rRiJc@,%J-T9P-FEsN^R3n5S)"D^&->nr +W$CL`[iaOhRt!>-_dN7:a"/qNoY#9m!2Dm54aD:p;aImO(GY9Ch""Xk-U\?1=&pF.uKDX +9o#.&_hC_/"FXHQWBA<%6Hp-M]tiIFos/N<<*Tqc +f?;5B0GT7%EoTqoR4V+mI?X7 +%seVd]Z@1(P#d#rY3;UPlADe(MGMVWhm//HV<>L-f>9'+-8o,,Pi`jl/K7!NnjsHYpO`0XjH;^'F4"ppl=p +IV5S:_at%IZ',apRF,VUYm[#f8WD0[7r!(^F +5qBP+^$phi@OIKq[f*k?5R`/$*qILRTo&n&P*-`XhBPbRcC5r4"j5X4J>*%[Iq;s- +^[iNh9ORi-PC3+Z!*Mbkn:,?^.,oaDikL-Tr-'C\mtN!H[j&Cs&,_cL]Bq"_^G9W? +.g4d++MR,Rreo\rm,:0Va:CT!T7HrSU4hDQ1]F,F*n8Sulfmh@\qd00;a^-]re(6; +')WPXH1Kh&GsXSr)CO0(9,F +o4e3Fs"abq/-l9*^jdO2"KL)TW!($L6LCIpIlX;bBq:G"(?-k)ks&\iCXhn=`HJG$TV%BNc\(Wp&D9\_snc<#i*eW6V9g&d[LZ^U" +[#&g'f_5S%)An)k)t8>PphG]ZW5[53rOD[.:IQ5e<"Bk+Y9-EK"/p,K3X^cEn@tTC +"]>?is+p][f1-MC9P-C*8\=Fb\i#Sr!rRQ1?el=FfGWC&Q@&f0^J`FeR+&X:fKWs +b%1hZmi>=Gk2FomaLU$nVk&Dj^j;A`43CNK-Q4b]-0WLFDj_%/+&F9pF\'Cj&ot75 +C_h[@"MT2r\";o&AGN2arc4HoRc/$i#3b[V9j,:Y3UsMfq<.<;f*a0S$S$%lQetB9 +Gad@5RWdsf>kR^@`Wor&G=`PD6E39]_eU>a2;AYE\J\:odFWQhcZ1Vih@`e.28FYc +Yk2O(frL4scH(phZlA%Zp\G9#G35C`c9M1UZggYg32KfA>,0/**BOUSSW\ugrr9ib +4L>d2nUOl+#N=i$ISqUJZ':$((j=l1Lrdn7"C_)cXY+k,5@OQ/JH(L#Ot8aeP)@8k +!WNc0'7='_hc]:\^LR.HA,1siSj1j)Z0gGbIUO)+b,HWpGu\:Ok*ONE_Jg1hWHU]0 +c3l?(s53;fLB)SU9`Y<=%K`p;2;(8RhH.:?0BK/<0`M1'48(l9J1MZoNZnOt*^3PW ++$dW&5c`=Q#Z-7!m=YZf(@4L"`.'Kb)%f]`+_\]dJCq$G%7foSVuDGuq\qo]+X?q& +n6\fnkO5*UGjFRBWdGmkY,#6=eSS3T4ja=%Ze'%Z3nc549#l"r"2e^+R#-u2bAMqHZbd!gM'9_/kj06Ig +=;*sh?oQ,WMMr6"O<=!W!oS"EL4W5-0SG$-FHMCZf'j#:G^3G&7:gR@ANC)gP;Nij3g_!2$nkG5'1N!=j5LZ&:.s)/g,6N&]lY'G$UP-f^;48).) +4?qQPWu+/DVp^$QIGFG/7dLgY9?&i&VAs+X$^/4m=m*AFBMC^sU)cRq-e'@kU40b? +Ea@&,Xr:Ct[>u'[mW:;@2QJGJ=BF"8*cof!XW+A@LT9$'FgKi!'2,>H+PRF'1[g7" +2`-.+g4?`q+lGSR/7b1Ppb+/oJcDd.J_/%1@P!T3/_VO-#(L[Os1GjiRf3#IYPl?4 +R`GD-Xe@,s_p8>_-W9@5n6^m>)i234Z(O>Xnn?IrJJ]()ct9>Cqr>f>r!t(0m#Jg0 +'7HQ3\/s-;IX4!4g3!2/\ZD]%\I\g=$##ek"T2UWkZGsqKQh#a?@`&_V=cARZu9p[ +f/\70Cc(Kf>CkpEKAg/PU[qi7Fb88qZbYf,s$'>I?^;3t8UKWbBKt+W +!VKThI).WA\H!NN7r16cA=pgi^ea'M&/ik+`shuN#FCBt;sMqWg9lZ#",$ZV?\Tjg +c7TEEaSeaWIO.=qE`o>.*+g!U'_*D!]FZ;P:s\mbF8`rKCRHFg,8d_&D5"_)l>N?l +S#AW=]F\:"fo_h)R@2lmc9.:75+eR[S8<(7.=..Vr?/9@G!sH3:^8]S%`Et?qKq:X +l_M\Hr[#fq[L5:-.%QTXZe +rN!()k_ZBWn1dCP`9I?"'*N(>t,OaM4MJ:^hgf#]c"@ +`6uc@"/t1>$LeiWqLF+rXq2`!+K@\p!>#q)a0ml\(DfWFpP@ +QsKcB,atp:^^Ka@OQhd_s61oHs"fk"A)!('T,[YjaQmJrBY06NkK)%jMct22$S( +oqCKEn8_`XKq2IT(0+KL?!S1LgH$]sS)liIl"`N\NVpM7g%4.5QQ^&6#gaXJIQOO.0+'GKO)eqcq:8AiM_c,c +2OmIS5EYqa.-5>r!a7\?9f`4tYSL,e2H#/`p@<%^j8&%S@.ch$In0U++VnV'>gDS= +c?V:p>4gcPV +!rlmJ"03iRq3h6o$W&f::409>!rTn7D\l.,&eG1t%HGO@EH'_h\7Tm/l8h"p2pR/E +kkt"1)=aOYMGk0MZl2r3&lE5?qo?`6[UeADS/H^^9L:HtIq"L8(ad$@N)e1)-tCE",dZe0:-3K +b&Y;J"5=b/"fIU7dg@Q)*t,u90E9Eo/u$#aLO_-g`io/EZD.PaK+m_3,_G@grpa$$ +*.gC?uH=d;*\CuL-krq^CmXi$i5)Hit)4e-3"). +RJr)F!+g>HQ1rf]s4tUj"TK\Xs/"]hYU +8p,E$9dQXE.]TX,]"TX(i*T]N<*PId)*pu>>'3h[6WrQnde&9W[//48\oN$[Z)0S] +A4:N;;:]$:\5QTlTt1CUhD3BZlK;cEj)`(4FC//*"W$sBFr4T``VbKZ?rk\`%*+>U ++G^:'HltYb<%I6"U\3_D]VuIgX*fo8]o55Q!!rgV+ac;=(P1uX3&f>^e=7a&h@QB_ +@5G4?IW`gi6e,23XO38c0-3e@=c`-Pl`?:L=.V?LfEJf"05b0M//ht&:D +*`Cl6g'B.C@)DU9fTru(ZeZ30_=mUm?%e"fS8c0"I%`4U)P.*kS9fB5kuM0Hrk9@$<2YZ;21H.]7:)UT^rY& +r]apVgQm[,[OKQbgE['r+&X]c6*6W32i:*`*Fl;?_nE_GVc1j#r7hp!X@3i]O9AY+ +,OE;*@Sq*LJ5j`!Z*8k?S3S)V5gT![d/=:G#6Of\q7aXl9d)JK*t@$r:%MC%qPXf# +e-1E'S3VUr/j%:E*Eek6GVYD,.Y3(!7W^+PELNsj*G.>ICcY3=4rn$Hn1lo3ld'gD +chg$Q@(YJuFOAEV0=pFOqO+87B:]kq]jNe.Mjc^QbqJmj/uIh^8Z^(=_FdFDfO`l%M.3lEo'jJdQW"^SPk"J?IKe0uB:9@M1S5^2mJEf@/^gf +Gju(=lo6XD]\A>U'@$5=k+@2(:7qRCDBBIjqGs$W$tX^Ed8YM#Y(1 +J<1_91=Al1\IX?\!0.-Ug)"Z%'G>0aAj*^uh8O +NqgrFn_r[,#RgPue:3*8a'ZgU=*"JNquD8^=WCra"doLBB"kI*k@b&TMlNs'f7L#sCFeGF/!I!U;a:lq+:G-M9W0U= +X*:?tfTBo@;_-"S9<7)GX.gQU'/%u/T5+%Ob4D\!Y.+7q%F+OXHtZRQC0o.7\"pD7bTpUl'W6./L^M*D)5CnM+'itd8AAH,jY_Z]qRc-ic0.GTcI?< +%7.2u9oHSKnDU6lijBIp);S+K2e3"pMSXFHs-3.IQ`U"c_Utrdf9kSKM^,:G.+S%T +>'iSg-2it*B[ZAaeUK&]2TcU2_>M&+NWB+:RRYk-]c0![](]a'Gc+(!0q7ZFSNa^L[`.*7%_iX0,8+cP'8m[7GnHH*?c42/W(l5ftP&qI[ +!I3h%>_7b3Je.Aq>-r$&*Ar??a'X07gi2/G"Sgjm>`\/7=c[4$ShK4NPQ-A![)!X\ +_`sdd@QF&1@b.U5[$U:@)SL?[eqKF)#go*.FYrQ)&?U-mob5eQdJ?E/UTU7edK@;b +H"oEg:Da&/jG`NOIu(fH:gS64NR+/"KqhUm*TD.bJ`@r.HOs1@!;PjAa8/CD?DEH/V=`hJ$QP +).f7ps"4?PZ2UXN&2"+EJj4uS#a<#Z)/!Ht=qU\-NJ/&K2%#KYI9qRZ2]UbZbp',C +JlLucb-_2(Z1i3UZV&i_"&np;Shk^#"!J3u`C7IEP'\jFeU-bu99s,!f/*aE@"=p] +-.PTB*BT;K`,Ud-$H)4Y^459lf"5J3A2nYUFktYr]h.RPR.tm_ca22K($/\)(+2]0'nAjMfRH._*IoO>C0DOPn[t(Ba^cq`6i(o#U +b^[bkr6MPJ1m&1DLCsTOZ5nm;s57\mNO.Sh>K$Vun:4/V^aVNEoMSGs#S))Er9(ck +k6pe:a8Z77J)ro'!*fm3s3V#9K'."$s5@\f@n?E1=EcT2-jKH:9XM$\(,XD93f6F5 +lBRR'Z4adFLhQc0dl/?PphT/UW+t4O5[BHVRs0j!" +[MJ*r,pl24KR]J]jA;"EC5PMSn`nN-(L#$?;?A1[cqHb"1YN]Ls(T8oi'/A__Eq"$ +.A421P-@k`:)*\Ys%+j_pn.2"'#?=/oBB?\Oo4P>PimO'B4F`?Z+I?9?icYp5lP:f +!(t2Pi_a#Eb/$\>=c"s]eNqNWfpMel\T4p)!N6'GWqq&,H@$QW]:/p`8sK&J?bq/+1%LABOJ(HS@2cTMM_e0WQYi;[Z3q9S<]k?\OE3?t;X=W13^=/Ps6h5m5EnCJ +J&)%J3c=tb>QOe!k8IM*Lb1ea/j2`WhG(UWg!(0%'-ps/aDJSj&O?p +c*CT4]VA'RdFsn(CJM7e,X`Bp2L[tr&J^R$-'](A0VK+G,na'0URJKu7Zc%(&c_M8 +rbM?^Fhn"XB5>7T$K3)uJ&EiXosUF^rB(!g$eX>?.MMql!F;SbS?]%)rqF;p:67[k +(PMM?*tWMk,.>7Oj_J:NR],XDMQ;:8i?.[K=M4t>lDJiQ@K,_$`JaLu38k8(+2cur +2Z,8a$DpV(/b7<";$uJGoBNrKR?+TCSV52ZNdbrsL-' +X-E`Y3tB7%IgSaHe(+4$b^XgsP-=.r:XoK-X5^)^G``.L.-P==chY'J0E6a.p,B/* +5Pc+u7.eMd&H2^L- +2R?b*jh<;.^KTP[lMM=S+2M;RYq*mj'q*_>O1+cf9QW,Jhb4F4-kSNulC]FCFGT\, +s!6\']I53J[DP`A&b)]A\7eGE1[X@Kppg\Q3u-\N_?(#CS]U0b1dJbePfkn6E;8nJ +2$'if(4c4QMH?V56;TG_a8CuefED4WM&8=GTr0ZICkgQ4(%cX7%sD!)qK#Yb\XK+m +]'c`tmOk_oL4ScITj77uXo^/O\$N4b>MG@Da^qM7ZdmaSb%t+GlR;4Yet!,I^5=7L +ipYY4I_"aVY\(Fnf/:8Hr"%"/gUBS&Bhd1g6Mbqnr#6A/WJ'iL\$U,KtXZ^5TQ*pi19K@:8&#E+1^"e[YA7`t%Pe +\$Xa?m#&+]s&4lJ,d0:5hB/lE`J#C(HoFE"rQqeVr85cEhFgV=h+GNZa)T&tLV_XK +OW+hk$P0"G@2+tY_&IXu"6TWLFo7s)#/9n]`HZOQE,"!MECp&P(Q=s[O2W7A"8o>/ +cWoG"Su__oDQ1KI/k,`LJ;#qIrH +k!mRrO9s'E;HS^YTIn4F>IgP5K1l;<`C8m5'5$nCLL!Ur__A[,T>jHC\[abtS1 +;P/U\BW(_A7g"WY+^%B=8rcO-E=jQNi[%e4nRb(m=Vu&k7d:-H3ao&&WhZ7Kdng]l +(WM!s!;Z#l-P`o1_l[B[OPpkmQp?G +mrL;o\m"r9@Y"9I#>op%,9HB47XQe4rV'r)i'6W2m8X1]/o+\#)=bJjd$W?BlmI9L +<=r.8UN-BC59Sq\gUY.D/quTPhqQA*f^E^R3U8,S3\nd6_LIE9WoP&sl\PJBX!?lV +@"1#]ImmqbAh&*o-M^YM;q47KpEW_3eX]u6b?fVPDE +Io@)*h\:"s>q#G&(!$G\md +@_"VuUuDuokMl,Hk]k4&=Zm^>T!4,rm9dFZAA>Z[@%"R)e%o=gtjHo5:Yk-Pmp.bS]S23K$HC6 +B>FQIkue8jD^VF/+"X]'r-oDMRsuJKkBEXZ*^gcmN8K((\I$8t5;7j.Q[Q2Ep.=1, +hHdn\QsS3JRFe$;e9qT"s,,A$rmCN(jNafXPJI4Agf"@:s8!aGoK1dJ<5j4B"ZP^2 +S>nUTr1BoI2c9*/n:.GVIcgUp_Qt>tOo4:"e9P6d>Y=VP$CEX+q-8gbVP=O-\'MD]l!'L0g0I>&MZroWYMH? +2DsM6nhJ5c5M?qR-bQnT>6+H%qGI7LoqG*FT6P8Q1O/focnZN^&RGB+!]>H-qbS&V +T3VA.-9iUkp^dBT+oh!X(*7%RIn\[gp:k[sW(rcU&Ml4ZAB-8!TS\N*?%!#_;cAn8 +)DZ\]H.8e+mo:O)5/36n:uq4t5XG"bWI?iJ"J?5rM><62Eho8e;jMYC`BJQ=5Xl5T +l/2h50o4d)d6eOI=NV+F35e^/=h("=OU-PRL0qsmb?09n#h!-12^2n0hc%K".+p#_ +.ej;K$3@EJStFS5JcPcfI5T`BA$,':1_.$a#2RO3!CL`:OFPW81urEooX3_Ls6ocE +/`C,nr?!9d +re:VL@AH-8q4[225Nj![#IV4#[]CS[s+F^7L#05Y!qqr\q1[aTr.jeAZi%<$=TE@= +n)lpl"U+,_^6Z&FN,&@Q(]VK\qjb.h\PU2I,#/(LC\]P1gAIFZj0/Eh^[tPjk7p/c +-%K@t4QaD>pOD6gh?((!$8Aa3c;,,C^](\pd@^?:=//4js!5gG[Rt6iHdSgV[k'u+$8DE?]0`NTJn37R;_u.j#.s&gI8GeMK_#eq' +c2G2=^\!WLF7+'Sa7*sD(/V7E!f3J;[V+KuF?(D^9SQ0%uW3__& +lqTE]B5.GGa`MA^>n^"6_XF"Q#]l^1>Zf>j'4g+dEqrS)lr.P+h"'&c_\M,0Wc*88 +14([_YSF^RRonI&/hT5gYC!-j64:EA"lKeCG1D!%[dheWm2D#`piP0_dG*mQ@)k)( +++slS66Um:nL3Ypi!d-;X">>!ALV!SY9j(3!";mS*#gf7dT8kJk^&rqK%Le"]LYs7uL%2e3^`'j%l/j#bst +&ATA=!6TkPVFt:t>HMBsdd'!cET$l"G4M>@qN5X_M0%Vfg?jOfs2_P9O5LAVTo9gg +Z#-(9='Yq-YDOqp2U+Peht#(Mn]\(ZVXHLkh9G/X*66iqhBdO]-iCr59\pr058jS! +.(0CN!!3s]S61*!\FguP"T4&Qs#;ns)`W2uW(\%2&MlSKB*S$Fpm:G(O?C*`+6rQa +_RGe/6h70(..bWm!,%sQ5Zo"%*Ck\t"YG6Q/I4n$6)fA74#nKF*bg,[US)q/8-(_$ +#bNMRGf;MCKT7T6)b0/$sX%htc/> +C$RO^F;b_j4#F?:Je:scA\nVld)e8Wbfs+=,F42:!'+n>$]df2q\r[T;pI7!eB +R-7VF`WLeG".mX;*[/o7&gDU?7u/i&W!i*,;*=QgR3*W^GOm$mn__--c63%MV;Vr& +l)T:#nXpK1+9'669oP`rmak=LC8tK0G03HpOs3iZ0tcm\>Ba%Dq79Q#.\qK#IQdYU +Fj(X?fIo.'?>AUE'NMdqWHhLkn:nBZa<3)n91]]o+o-`tRlg`N&Gq<(..!abe_t+l +;D(EGpeM0G&'?jL=VhaCpkS@ql"5LpIP.)A((b#.JkT;!'sHld5ia9o5;9hY1k>Go +9gcTgBVS=@F+6t!`:^iLI;`b(=1Yt!t;Oc'sBr:&;Y0lnIR&h +A>Xs[FI86unN$]`dINuAh$*iJAGh)Ao]>bqc0`UKQ=k9`[^p'X]'$]5je$g_\FDO= +J'2qR8O'XqSmO9)h@3]pJR<4`kO88F2F9>D,aJHj&CEE<;d4gPH_Hkpi:MbB@adOJ +mp!6N/`5QYnNN5QP=7 +8(Y%njraGS=p>WiJXebR>U`VetHrQ='2A4 +W]gD9\CpH+NQ/_=YBY9(o%[d+?`sd^?"BS;.QDi^E9c7HrXTNp0/83aESk#8qWa[; +lFQ?1Q?)?+IXG3]JVJOj(,f]%G=5r6%GCNbEXM.5h$@hcL&?GX4T3&VqoFJ/-$\@\ +q7q(;;./L*nFf6Lm0Cp@4,2u/l'8m?MlY86BKim)eg;67HZ%"a[q22bFj*!fU%s&I +meQl9G3?WXbPqk(64:W/om\=?IYb1X8,r&%qZ!ACIRpS+/at"ls$ptp`oc_;DaK_2 +eb<+BXuTm`pamcm/N&.ROL%bLXX2Q5'Qft;ku1F+WiiYK0-roI8"5"h'J01"4]1rA +pIf3a#oXKqBW#;?r-dsSi'0=iIL.eQAKg)qZVfYIZVc?Y_8/A.8_=4BV4<'p)r+@_ +cA=##:dBH8#iYI0$goVf-dAThB +)Y(82FTJ-$KO92FVZ`!*'uOqBO@qXmB]%_Fmkct8N:e4fg4Z?'0[_,KfB3D0HX"l- +:JV@.YM2hW3?++I`"mYt9aOGk28t9p&).%d8(,n\fl#O?&m[jRmeIOZHm/Dd;=^&0 +*"&Q1JU7<%'cZ44F$Y6a2k]8dFCh,LSeorIiW_Rp@GiMm![PVa!<2I/f9\o`W!2h# +$`#2'Y9sUiY^?0fXoB#>*?'t4+?]Z;A,dGA4.9j.AickL7*>=_;YJ^O\sL:V^I4?: +N[nI-WF*_]rfYh23MZF\9(KSbbHD!?#J=%A>ig7nA*b"23%XR&r(#AQ'E$I'T0p(? +2Z=<[+)S5@".\UA1F&Qjq6UjW-S>Q/pht"(C&%unV/eZ[0=&%D-@[BO"ifFRmM +i?."(H`:"i86gG-i;[THemk*I\FTg]+.r%Sh`P@X6LkB\"8l)(G+,Xc1q8'o!&JH(6)s)FAHkah%< +!r*E]+956uk!+HIS7USg,%BuT.7p6+\l'*>9&GBj(E^2`7q0S_m!O^^i*8IsN?La8[89E"u]&!qRAVnSRFl,l]a^(o6I& +hM(q+?dW3\rdVcPHg?YFnGbUd!;M%p3J+CeWHdkMkNjM7M95=0PEk>9o9m0#YOLG\ +>kTLH^dR8hhpR94ECV[d#N'jTrQ12s(jg@&nBPe72\>=7jHm>U=*Jcrp>W7*?/E=k,qtX$h"g%^UEOWa`LWQB`pcN4K +4Fb=k-DP;KR7LX_;,Bsf9)-pfW2?,S;R?S(5XF3VVkD/Cnmd+tKtoeG)1aFPU(f-Y +o,hCJN%U*ApB(Bh/:c]CU/k&U)#fp&q^he%"j[1YJKNS=OtuP8%Q[iQ,G!k +]Y+udqY.nbh+YlYGLhsCNWtZ[^=626IoR(uq\2(UB]oC:r!ThoM%-(J<[j#Y5LZTB +HB]u)J%p_ni?(JKk=5r4LnP6p5J@C&PY$[AX@VU!_%AC$M&+H6plE1iH2d9K+'o

    s6u.6YMq:3TQjm>[@pE*E9V`qW0(nPG;.E4>Y.DW=B(ocI]2 +^C<(!_H2B@Jd_K0,_(2,%%eG*o-2gOiBP-8bX=6/%(tb_Q+s`8r7Rii/YFU$Rje>e +#j8_t!u3=s'o.r_PEX4R@Pm\M)=@6aQ+nLqH`<;%@MA@Z%J2m:1]H%FIK@9Ws0B-S +Sc=l']rGgn6e?M:fNr$POr[.%^q\7l%pN28kO2eFp]i'fps=+f:n"Tg!`40fK5r#V +_#g5-]UtMuPbFfLOc&R/NV4'NbG9hpPfEWW!D&J(JW?o)Cel@\8iGs%`#CcPejj +(`k=l4!f:K1?8"PqWP>mZP+):DDZeF)ABc/JTD0'i2Z;6moUfEr);K.HI'7^r2M#` +STbDlj)3V\>Onfur^6YirpQduJcBrKYCY7Mf:W9!;N@OnL>_Neu;`0<,_ti7E[CCi!;_2fJk6h%b^1RK(\aq)VoJj5M +6gW*Z:_k?pKDq!:rU7u,5;T@tVcKCbDa2P&7P1:_Xf]t*\+\2Z6+2FplFD&D1@lOGtAkMq2aKA +i'.D[(1>9\=9&j20f:&iIts^ACTbc^lagp*]s`YZHfMoVL&\*LrIdsOJH#qj'Z2#m +!).i4rZL-K^S@p_f$\&F7b`BJD4g$^Q_k+,oo\bPHi*F(-X-JYgL&mRUTPd1&OBAr1c`1bTo_EaG99" +&,mU3Eo900I5(\2>-nG%F;81*s*a8cYF(1B%q%%-6(nk*^jifg:V\(B5=Y*u:qQY% +=kE2&rHP7=B[1e.a*si1H)0?n7^)K(65D4N]W7W:GYq*o*mCtm`a.44*q8*!THJ-pP +5R$NC(Q]^hmg''rF(%@YUp;pVe(7HPi1F`Kca=1)[ikJ?M#dN&#"9mDiRnE8^gKsu +1]3"FT1tVq`;%,t[-^)t`UM2qn-cLn#lJuCpSg.fTE6k4>(q +Y@_:::'tmU!rUpchq/C_DYYX24BL/4 +f/NYl]D`aF_TTapD;X-7H[=:,]4ma:d9O2V]s?[e/+A$cF8iW,iZ6j!T/+"84WaWT +P5C3&rJ'/>r4gO,Ha`MD9Cu0?;MVGpcCfMrCHhgu?a"_O!p9\g!9bBA_"Gi+?dlS^ +s4QoO3B+c=F//T8\(eWJ\A"rPJs*lWikAjlJRNFd4bNRF/fi".s.4OW>;Hces/0Z& +&\@aLB#crb_`[#[qqbQO>RT<[Knh;!J$eu$]aXhZq>Wa*Go*$L=P1",giK4EQGEVD +G_q%Q_<"2d`Ehpp<*TAnh#;l/JB.1a5BPZbU!5g$j[\R#q]1LmlbTPR/VA%W]j"!M +l&*ifY+,Z`hl/p>7pDWt<0rQ(T(5d`!6kI+O[9#is#hP)"8P)hEh<;/g4'$Jg-P@D +8q:RH9G[uOIosP+i?.!D0i_ZWpGdsh5L/CWBCh4cA]37Wl=qX;Pl(gd?:dH[o0;6L +=,Qf9/>,'mlgg7O]VJjEWR"6*pQYAuM[)DcHQ@%c +9WrPOrXtFmhUhBMB6Bg>*rbaRN.#qsbC5kOr:16R(BFc)a,e1&hN2QWDB>!.RT9bHf8l +'QpU[)NO%9NZ,mW1&QmR%g@1VnX^g.s+TOkiI`Ks?'+,Y5K!COG@!9G$^Ui1r`ri* +cA22P*>8"_.PUl-1(=BdM%Mn!U>^[3O[7C:+nTX@)7KVZOJ%qK9F`T\uNlT+^ +3Ts3Wfkr6^fS\Ln,-S[>?mc*ujG3n@5Vu<#$rT.ae?#"nj6-(1bPM/7JRCorYbF(0 +e/&f-J-*AL+*YfH*cfjC3ZHurn>'9;b,mkp0q<9P7d^$qMe:VA)71f<%;fC>L/(`c +>#CEHQ3FW0FEUkYneb!'+G^42[#gk#f<^Ze?;f*@Rb6O%#oa9%@qYK"X3MT"F0Q7! +3bJJ&&(>aj-#RUTB@(CFDfWa:D8UQ<$3;OU*enRhoA#OT3(>/j-A`U8,F\2#M",\H)-VYg)$GbWkeP +m?hM:jB#C:0<^PF>I.&k\8FD=/-5ZmM-Zn6qr)r(o=k;*h=1?+ +j>)C<%0&hceX__cH`?*gU%+3:?/bJq[)f:#ngMU.m47E2FfAYHCfci^V%e]j]6Fb)QlTJ.52k=&(o4O^t[38,fK[FnmhG>)$E1Is0/4K +,j/V2qhYpcA,dGAmg1T=3grWon@tUq]h*BSSCJ:MpB6!WZp$^f5"3uq-Ms"9q)?UQk6nEk4["k(_`\,%!rpZT:Y#P(kC?>&CK'78h"&>`6S\'p +@%dW!n\n^#o7uI);Gct_SSVsi;)]-H?[/f7q\R?R+@Q47^U+ATOokQ^?<5XkWbH]` +gO.N#?=]?9>@kbbF\oKH6$Ks9NO5pT73X-mKQ+1GC5]<#B@,p$iYhc:Z&;o2:uhb/n&R8H13iMWM>bY4*.lATaEA)(mZ +eJW"4A+X#rP)GUt`/D5P7m"W4FF]\J18&)K\p6jP05fgiX^toSP7W@+X@F^uaR^:J +?9Q9,.0\Wh2&*NSmT%_a.V;5jMQ#0((F7LH1t:-mN1*jG'/O9sGO#DW3lRrBaB%Kb +U\(+4WOpoi`O4(27W;hk5IKaH!<0/,`]&=pS"?$"n*HKa''4W3gm3BZNp[PBrr`9q ++QlJD`Hh-cG>+?)p#dLu^L*-*rr8P?GC_PjOaU]?m&c,%pFe3qI8SdLM03QlGPX)h +e3rEOaf;g'nP4JT*;m1>lOunRe]KZi(F@sdan[g%$f+?[n_Ra8(D,3eBd\'u;tnO8 +&$<1!/N7j[ZYP`ilgf$'HT?6m0JTL;#.1BG0;tLPuB*\$]0$;R04rL0sUGaZicSW*fYE&'=^L!$FKA^`W)R7e96O"SN`.8aQ.] +(A^7?3n_i*5u>B(X1/00Ue[:8<[.bf2`\(#/4OF6hn^kL[^AMGnHSh8H)pI(KB0:hc,4$.TgD6$bgkDma@gE>6s^6$-=;BeMJ;1f=hIJ +?S$F.R,>o1Tq1oo8_K"W_*M5C6$_S8MOIVrormYMh_;GYZUfuSr[?q@nFpVD;-u0: +B-7%-J\8c"!9sC2m6TIPIo)j=K0CWtlONE26c-PcidY=@(AL*"n0aYh_#G'pr5\aX +]F'0)K"DuuEco'oR8XP]((_:6"f10i!<:?/YUa#,SZ0QBg65#(LY1LRD?Tq`pr@0U +M7QBn2A<,a7dK'-\qn*Zkc+*`";90mX@M8:N`7'2+SChJK6XI,Lm +r7CC` +-WciPgV,\hs7a14pY9HRk;&2"+WK>5/ZdVPk>g\X'n9TA?blL;rK?4XPh\3VJI@t] +&FV:Bc2dktF5Qi,W"8J!\.IIV$h0dgIL#WY+84*eNmF(UQRbh&3taSuf`)tepBk\H +9).i!LGfLob7sFfW4q:]$N\'CD8XkXqYI)_)LT=&fDPC%gSjr.^U`=6ERuqYj'?mL +>e]Z05`I!93]6iVO(PZrR(3%>eEWgmdf&Yt3l)h>+ARBf4NcN8n@t5l!o8[&Io@*T +[$JV=O%isAQID@%oW;Y('S1f7FpSmoP>Rij.OkIp,V4ubnc,!i@*]4Ped1b"*XR\u +87FE;N)gKt+)M?bYQK^W9YZ/o:pNCVK&5TR&UYG2+!?N>gnNVMkqqe\=qV3B&Q6RjG +TqM0Vm`,9K$\.7dHeuce>6#`>O08lHVl*&#F;u"o2>gf"C49f6J(^_]mPg=32Cdk( +cV3h86[,KU5>cKKWNNWsfl0ngodYWE&cY;X^R5%qPlHn?n=j1_P-X(Y7Fa\(boog! +@:SV#Mte.)+9'rgK4AX/*qeGM;M%qq`5.8?ciPUVKbWS[r+CYnIGBD]r5TS'_S;:k +T,B$1]9;c)HMi'fpW"b1A(?tH!.W?dTBO3Y4(s-D+'S`0!5SX6c8p?E$NsHp/m4<* +)aP)6EujBB-iQL.cR%k_Z!)[-3XW`pTDFYY2W1`]fm*_u\J?F5Uo,+&<5"<&d$5Gi +a,Pg`B#@Jb!@QlV.Cub-7RC*?IY9.-)5)Vt"_%L%1;o.VfOu=?OGcS+q\eW@)mCE* +dNJA+>mp]s*g)#/@hU%Pk4`R_]hi7=WK?`-8nq2J#fps'A9c$d,S:-qu +\Ik2p'Csu.l]-g=&%Y:+Y3@G*s0d@bh*+X(InoP$Uu_,9c*o3lDa(%ASh#\J>+1$? +s**/skT]aXg>j]-pX>jCi;[?,44j8*-d(&5ARF=YG)mHN]EaqR_ft2r4d*<>]\3W +H5:[/./\S`?2i]q"F:\K#Jouk0;:Da/+Xm0'-7)>=FQ?<^6cD7nDD@CSr.r=;AF/[ +#go&aBsC<#KtrbDPl*N'^JdT,g#^/G83%Eh?]\>a!r3OD(#Z"f-P8uRBT3!r^`NNT +Kk"TUUmQ`G:bk=%Hd)M_M?>?9.F-k6JmHUb#%60>J[NO%4Vu)bLD8POk=e);Uuo!rR'5 +%iG'B"4+0+(EUm"5NRA4^cr.X\!:H7X@NL&!%gNh+rn?"<\mP"::M0uIFG@]\%Q`f\#2>;W)n1.Gt+'ct?+T)JHe:b(#V<>+A[GT`JYjMj\)W-K:;X(g;[3RX`%=rO'?29 +m>>AkIn_@1nmeEhc.&tg*d7_2fGsu&^n2/CX#El+(Z`IIJK8"R?hg790KYh%"[GMl +!WKu,p'1:T5s]Fb*:nY.dl>e+2UWh)n:,ITEb\-kE_&mn5JIO*JeA(T^EA%h[Xc"O +.Z(k;#l[5O:m5hpj3CH5Y/('t86mcK)tqfIq"Hk$s*TTeB/O_SHF?\oe>as$%8!HM +d;+ZV!mHC.Mm:?3.WLnMh%gXED^c#qMo-$&e4kgGaDh_Bi<9Ts-N%PI>n"uc-pr%H +'<\XNP6_!j73+5CJ(R3s>"FbNIE#a"Tua!!2l!)2!U,mlfqk?,ljpOk#2@75J"VUT +4,ogIMPla+D'SjFka0.!3k.FCL/*RpAGiO!P>nk%.XnR)I`;?LUX"RKM*&>kA`3T' +?t(K;&,]dY:TXAhJH'EQR8)!9n:/nE[HX%]ribNJ+Um*e8aX +:p=pbgcQKh3>lNo*>?+(D9"[N&YBAfc@jo$.dZP& +#!D9;Xioo-Lm/opB*Q<`:G_gEqu$'GIBWn5n8GB\eQ!=Bc4BDO=c)'t1-`A2V3lct +8_jN3Q!tF@H[_XYJh!-Yr^?PE@.FP^AK_^/'\q_ue6E3pi?.Y5kC:^*C]Tq'qt#;2 +bm+UVrY&omd/#EL;FQPB#2j"MGAI9k_[?=^07!-WaX?3Z`"E"Mr^.:U5Aqso+iFRN +#r!9+%J\'$NoI/1NO[u@YP!t5Wa@gjce6GN5RB^"p,RZF^V:,kiSR7drRC>.;jTYF +Xo+0dm00]U#f$S[^Q7trIs'j= +\K7gNV%"Ia_8H&o+/*5feKA::QX>@dHW$fLg +mC.Te02dB$!.QP9!BpE;,_H'pZ0M;kn@ok4s$WI^pn&@2!Uq?mJta9Z6f!`S>n*HX +>^_2'?)^H?IsBYms5"0hnk1h>]93W=s%KdHKA^+#%+R`JFV+NQra'rJb:7Iub:Ek# +8]N`&QoYsVX/,%1,e^&hWW86c`*t9;Qq0t.fjuA>blI7mOL6?CVaMORgS90_`9u!> +QN9FJXkc\?b(PZlF)^.tDT#BR$JS23'*IA0^F;s-"Fof9VtucZ?0"m!3u,_0Gq$f^ +3pIG#o<]N^2&G#:9'f9KKM!49`U9$)E.NOq&sb4]&p@O&91T4(.5.[[7[2\e]]h4f +H8U0AIe)WEHsnbrrK"S6Bu/DE'!es'u&c0jIj;O/!lK +cC$!-eN*#\YbhNe4m&\-8s?egVi3g3s>T8eRO^1EW7-DJ)L>omh4WpH#geZEE@K%Zt#_V +kdu\KWePGo#8V3hB3*F(NEQ#j`.+^%L`7T]',TGsdEk`i!hfH%r(l-8PCGV/mrdDj +:X+O+M4R:qpM>"["b27E5b8)0r2`=)[b,V6lJRj9daDp!<4ipnQU?d1F@DUN$';K'jf`*9<]"u%Z1YU +!-SAon:D6JgQ8H>>ug7Dj1io,%bbVo2Zo%T$PFgq,J:0M=[B`0 +!>[El>QX]1]ft:Z$,?c9mk4^Q]^Ps#"k43g+S]:Sr#b;A@K)l;O?rk9,leV\K45BE +"A\TuNV9%R]S:d%#.o[X+B-auB*%K)m<*l.s0[:.]&$-Z?Ltp_aT#WK[Ae+^1/sSG +e;&Hp!EY94?L9QWm)Cf]^U9o@f,h:>>Rr +e\mJj%Y23+6c49Oa@+sY?IM[+eP$\PInr94g,70k'DN+6s+027,^eDILD""H4V+s9 +L377UE.(`1'o_(%lN[9Y45Td[_4,XsF3Dk.Ac(Poq>+CG34^ukN[@;LmlYR6A,\\! +'.oluX[hncO#t_L\"30.^!+?*k/M.Vq?)4"/8DSNfG4e8+f![9kff/l:,^4O/CG_t +KT,^;hdR'A"e>_1r)\tF*[TL7`+/fZq%>`f$QiqcP^=!!]"E+K0dPH?oBj^a/O(d%n3p^N$ZiU2B +4,qd)>t&Lhrt-tAe4'tU:q\FpG8"[4s%@A'#K"4^D>5[0nn!LZIY!79EEA8qkC7m*0@i>ddkUZHHcIiFURX[6 +#K)$N_B"YU0`OY;m,8MNcV<]1*:(ta(7)TMB_kMKeM"$%4TBF#0CU'sj3,3IB])*G +aa[&iokR4l+5Em6&1.K;ZHl9g>H'4_%J/JS,+5:+o)nKKf=i`6H3O's.=YK(Gu.@\ +:fDE@Yck*Q)5OGtW3:\Rf6GB`r#16::BKuOg(@ZDCL\uY-[iP)?oUu-S +OL-.s"XaQ/:Cca%!#,L*FT^=NJcuk0ha;5TmmYD&%3U9&9jPl\c?MK#'<+c_)cEBL +A?[NFCBurd]_5O+dqbrVbs/V8^'V\3Djo!*YG^)UD?bG6jaf&5og\:!#Z;^ +I%QphL;6>.mWLA,,pkW@V9[X)OB#7jCFutO(Rl@:c&H7T,Loah2:bXKp%a`VXsOL' +YD'do`/M3n)&)V91/:BVN604gg-qVOds#9YCdc<@VG5k$No&R`TaT&Pgs_A\n(Ops +(Mj`M^MDEd/%SB@s*-6^ZME4UlFTX0kHhHIDT]`hME:h6+8Gj^\b":ubU94SYLt9G +s%h-lpatOe=/Gk*m#r7MK9t48Q['gkIl&gc,^&+&kKTd9_&)`n4VI[YdWpDlJ"u#@ +[J!7;("]lfdp$L,rp0_?>++3p:I5A,=#UF$Y\BKXcq]08q#gO:>&HGVcY`!g+oh#b +Ac^r-s+c.o&7?K04g9@bG^[h!EM&V'HIm6Zr+dg-o8[b_VLj2*hJgkAI=:lQ:U16A3Y_,(3%G\IUK9\9unJMmgJ#>Z\jXT`lk(harX/hMmFYfFbn)#dp96MpI,(TXTMN&@fMiTD4Weptmjn +BH"68oN:Ci9Jm]>s%,3]lHfV4I8+6j,H9#k!Xldo^ZPHcT42(p&\oJ7J)N-?^S2)* +?W!#B5F/1S<%k*krlaOa-.APs\hm+=^X'^h)`[p4(DJ^t65BS-/-)mrZgcu*ZM5L= +3ugR05:GhG-ho@5nDDRlKGO,C^VG>.[M%cdpeTcTs$,I,khks'1DE.RTAc[L(Z5;k +7q3O5"[n%W+DX(Xo&=H89&<7<^hj2HsG-B6rA/1>($\O&!Br+XJe/_nCQ22daoO,jKCXYW.3LI +E(JmYMQu8cZfigoq.!>>4*;g8T'S@u4;KE69@-+cqH.a]s!Y'$`p\oqHK.=gIpCVH +c1A\#Lh77[r-QW'q,ID)k5WmC+O>Q4XNLNUm6IrXjo;LW;n]K#rGmGgR3BP=_oao. +jCa3Y80c8U6ZReY872HC>tm\sq?$\D40&/*KshM\mF)I4mmLfGHdg5&*R0E?0r.L= +Z%IRV,1%%q2MIY1ITsM+>i@G=3:oOqF4R(V'NF>7@^#l*IVr%SkZmJLVe$L1#YT`"T-QHI.OEA>#V97Ol2F_U[RWHY'$@l15V +EG\E7Z/n6g3KY;&gZBB0rP8GU_t977(>efW+"\%nV`/bM2[na4`pkYX1dlP0Fg?3' +_Z)4\V,c">VJR67s!,k,[UWpu3HHj$CH]&/i0]lfO3O[X/1<1,eQt\^U7G,)^dh/g +H57P)JH&8M/A4>K]c8qS#S$(%sQ"9h)T_97[$X&_SY/ +)rr7`R\iFAadM?DR#:0*UVi@73?#/SL&"MH!7JXQ+2)@7`;s'Apa&'TCnQR2D.<-n +Oh"9SY^qL.^ja/=9pjR)7",V,!,gh.m:BQU@?7=\cW;t8W#5rm%>TN7N@3c2B+h=b +-JQghLu6unAO:3\u +N5$Aai.S]Wo,h6aB!0DC.PkgJ8l:n9E1dmS\'dVqZp5:YYQ0QiE9=4p.K:"XbE&V* +`tX-#1>u*g^V'-IXK"f$(9eVS;>tJYBuLd=P\sJTlmel"c#RT&*ZahireIWRYZ2OG +#n-7[c[R);1]1%:pn4P`+#F$O^\Ab4&]^gVp_W]IBO_67oY=E)'?hilGq\ZZJ3W)O +n3:gl;;Q8N3tu7W7cLMs3"&?/ILd;gJ>D=H[/IbPNPBX94`:uV]Nb.#^X2lZrZcXF +TaMsMTn%Y8E_Ub4"34+-Ko.!q6FFELFlh/(sBa&c?8gJt,f- +f,6(@q"H')n-;5o!4>'n"S"]Hn/kj7h@$]_s#C=bbK90Aqu6g__=GC'2L?&@]K]VRF8S;jsf_Q=ipQ=QXGmV<9DRKKufYGmE;It_04@Fb]YC&nU!!6P># +Nb?hGmnGRQ-aL$lB'Ye2l[hp)_c=mnnn7VD17Y:gbG +gt#h=[p38t?+a_g]48C_iLF/^NScU!KqI/):YkWt=Ei!is!OULh,&N@;uOt"pqr/l +fs_Fr4uj\aJs?5(g^3oYL,1kfpXes#^Kt4s#9#r/ZLJ[2I(mqs3NpDlb7AnFD\o[ +&,]dV9`b94BJ81@?+d;NN8_N[SQrY@?ZR:HIm:=40RA()\pQ_f$`^#C]do0?Dsd8E +hoT3>@"$qa?=t"X/M\g<^I_*Wb@j?KfnpR/dGtOas($44"#]Vq`[s"Q'Vs%GhkM_g +f>/U/Q\Mm2b(,(1`8NmV:esP>M!a^S'K+hO*RBVY4r:F69'+BI,P#L7gmk^PgF_X^ +QM:8,#D:P,s,fjia_9/&(ukR".1u(Lh5h&cpg;V2i+MD(JH%h4o.g8,N-r#3Mo'sPk79:7M'.,Gf)Nlmq)hseIYRmuRid4]A^>o9[JsZPq4h0aZJTUX?q'nK@gDdqg5Vq0 +D2DD8>VA:8DL,#`qe@2L[BHUq%]el$;:iM`i?+G*C4+!"^\?1KWj)`0r'L/`pnN6I +RUQ?t<5a8*g?p$Q184db^crk"jl1Z$=h24+HJ$W'?l^E*([,sZskp)3iS +7mQ%JM&7>jg7)f1nDBdQ_=6oP[<>#.fn_$i&pFJs$*Pc:C(31,rK]LJWQ(p@Ep+ui +RS'mj\U[+Q%cr48$iK1<"ZUTDi4iJlaMKFJ@qDDJ^rh8!O!Z)S(g(HhYaIuMT+Nc_ +r!'$*9D<.6L_XY1MBu##OgG"R?$+";3p(*+Z+#s$M0gO"FVIb;h,I$%eH#;9/EOhd +5nTf"CIP5)JmtjVg?WFt"uL/=e&ET?*:O#HlnHoj&opZ"TCdf^MCB7(4WIuhfl_sdu>GFe9hPt+8Gjf\c4F+FBnV'H-Y=aN1LR$l'&:U +qd-]2s5/:]rHW,D!j1c<@i5!Uddf!ZJ'0s`j$juI^i$UI1L$a@*Rif@BbkJa4hdd7 +a8EtX!:YKm0X5C\bIEZ6+8BaUs1o*$F(Zb*:PccuV7j6RR=P3bcT/V9]sQdd>kQG! +FAL_s>eOhg>LB4ri=.o`a"uT@r!.`ph:j`gHL%c,&>UcjJ`hHrn!sD>/VsGAl.pa?ol.f5 +I@`ZrDr>@Kl)H(n\g^Y:S>C*K,Q8(m=u8j7I*Y0aGc1 +l7h=C=n6lT"U+`rLV;do^5>>RU[[0\6f\K[22t+fcF5!gCM-1Zl(_$f_'pX1;+,a6,ZWP(oWp]pA" +iJjKpb("rV]npWV5DTiP,QBt,&,B@\!S0f'Fej_4,b/r.cQ9;h47m6hdVo'.^Mm6R +e6;DV"8<>u`$<(fk"kp-?d+"*mN8IOJ#]^PKiRc9;jH_!AN1-%R/^?8\ltW$j<[H6 +%gX]ZnOgQQ_d?Z_:KkJ>;ZJ?&;C%fbaD(W\Vb%"LQ7 +\QXk"_S;N,Yqu;1gIR!j0peTgtT8\J.h&WKZ +$s0nCh^M +]bFV"8]lXGU.N<.):W$sX<7#j#Q.(:\>`4\Rt!-%VlI:_e=;0FS:`jtZ9CK?QVZ$F +Aa)gnop%@D28`P>0\%n[ok`R$Vh*uJ9_\'4K=/ppd\[rm?(8FikE^g=fDSG(STW>u +;pk6/I!/"7[4]#'UKr+]>^iigpJc/P>QD%V\?_lZ!;p3d:I>'&nGFFLmg3%p1;utaJ7GpCl+7$DS +&b%HM$]tBq..?UQ(Ppn:O3l/omIL50CV]rjochlhIt?`EX?W!-H_t0(ZEJ.L*c>X- +Su"V&7kMQ*!CFr:J,!ADSDOR7&/ +a4U,9.%mLB&Bon?8R1bQM8MQNA];U-MSgMk/HPn,3<)&lS8K8^L]8Mn)=W.*?Q"Y! +ad,C%s1n[)2El_BHh4d+U^Ib[liQ?SlELp4?I1MMD?^LD+oe5=!9T4mdZ5qBg_T4g2Tl5\fSVh71:p'T\Gk_f\R1T?Ps#YjYKF59l8=fbX:2aIN41EJRN]:2/ +:0*j:M-U*4TZrGIJ!lrfW)sKh*KHXB-b%-%f^CI8%bH`J2&tl=*UW!]kS'NR(S;U2 +R3.[o_m6VDMQt(AP9]WsUC,B4@JP`\ajFGRBNOe%Hc&*Q9lE[M=0SJ^<8&!W:LT& +rk%65i4hu[YmJc0EV-ah?Lt9d;ad?m8`45l#kC@R#:]5mA_^6&-UjVr.aLgjE77e^ +n2bk+3/%Ab"B-m01daD4l;LJ!$PhTZl-AF5:GXe)f5OI;\SaD,g3WXmiU4:!@T>Vb +=EeC\IdN!UbcYPu:I"SI4nhWqB1kD$Xdqa68.A4Qeb@\jZO\Q>D`(eUCqP!;Vu(/= +pED&2/fbY;8aF'VHZZ%Fl=/G#/(DE$Peh)!cjZcN2J;4X\,U]Mqc(.:j=>B-YCoDE +9rF.+=#,1_.?WADhXucrkPWG-`P&bCQ.P/R020RQ5TI],pU^$)CGoMa*cQ*QhOH0:\Cb-`oT_%`@'sH*R4OQWqgcc'D)gmRb(j`*kX5bs5(Kd +Qc+MaIhd;)=5isVhL""nNB,V(*hgV\?`n/eko.[T7^W2#h*aPg+@2l"8A`gi9`h@'qGCWUOlbACdM)H,2n/.p>b5SpMMkAUS2q?<0/ca0F[/Y5s:bM',9#K +fN>q:6L9LLWSPAT0X"e*b^RnpR6O#uWe>,t.f +'gqiG+\gpG,-P(jl&k%K$CP`n>"`@K\:GQsVu#^-?6]D2.^SL'M#WbrZF6-Fm'e*+ +bY8l7-A)I-o29gYah33>eGMVn:M[+(Bs((if;A-)dj7_V1*.>.Y7bD^V$t&-@8JY; +.L(:\X;[s1bHgHd+GW/$C#HL[\H-2H!*t`(->n`%%g3XZ1$?$7$uRM%m7n5\nI^K4iL_tESu1C"ha=(A,*rKEAeHm2)I+^Nee)< +57l';ciS6L"T\Hf>Tj'/8D_b&I(0Z@EdE,d4kB7K6P4nPa5rT9s+@!7L!S +02UgUphTL#5[3`5ZC4#,2LfV0lmMS#jjZcqY8'@u:Qj;r#QBW2d6%X:s2kH7Wp`31 +l?tpEO?+`d,NcbP.65P##mp4\W6MagBFY^#D56uu9]/.N58)'9#Pl]&nt1Fs&t8ju +!WP5(\(KBLs'ALK5bKu +q.0-9:_O`ADlCn`rhC,q/)F(B!rc[;:_mT_o?mX63o +5*O8qWiMFpY:&!B10on3:i4m!]m<.1Y[s2HBj>n_\G\r^]rA]O.\D)4^@4f[Z)>@O +Xa@9$SUE&[g/?aUWkGaXaU/E@:`Y^msF0M9?l0(h=nKgr;kOoQCZ?'&`G^T!5l]WSq,a9?J)7d9gXaWOd+T5pWGnULl7%-k-L`)f*/6dF +_l%7'=aC[KKnUkJ#d^X")XuW-J_qo1=Moi"0t9=Ts3d$/e@9lu,Y\4$I>n)Q4Y70D +"TBVR5Z>Di/51L4pjrH^L7C/3*<)IG92;ZB(\lnV.NJ'p&,Ssh!p)Z-s&`J-[X\`+ +bniG9+Q,I"G(C0`J4E]Amp)eOb(!dYa8B!RoZOe\s)'P1o=q[>=[8MWY%gS!s5m5- +n)HXI0GSg2rrN,"`AF]]L+GS]LMr\OblA,BKR\s\;%!Yu\C^k5rrE'7@t'>rQj'1D +NI@"3E:_,n8,RQEr'u0aK'.*\`./B?hcV.gnNKjQ[K$kJ>;(9[[NhW.XhFSPl4!WqFA,[ +J"eIh#tSG"a3+8)oXqB/Z3,+G>EpId/6sJm<\tk^eF!GOGLHh^^OH8JGlgSk'r($]- +,TH%orjV-[./Y#En4/<7^>ct:j[`&#BR:uds7'D=Z@G4I."VE@nK[=?7lB=^[:`"Z +Vh^N*97W&6r^\>$IK]]=:jI8hZ7CHKqmQe9q5`B@q6=!FptMi'r#tuJr]>76G"nB! +?#!B*@LFk=MQm=%'nlj;JO.F983%gN^Ia;d5\LIk&E^`[i'5$7V$?]b_`uHHR/[/9 +]TFkes%Hl'%,"`Y!d*b/8@lqPi4k$!-B1upM5pVf5s"KWQN/.B:9l]8"b'G3Vh##% +=_Q!boT^+h("li_AZg_\dmWg\D_RK8%FDOO\jhgV_u8,Tj"s#E+CDd%$,.]/\d"^T8iDJ+rZng(b9EYniL^/K-^$[tn(@01(d<(9 +6lQ\]!jU_o+*\CD!!sM+=STsR9`C-)6&67;g``T?`/+jZr6:W,\H%+!rWethK:]qg +?h"C6rXXc6!WFHMC(g?'/V)bDd\V,9U(WID6A/-:!:P:Pjo;[dVUOCVPO?$Bp?Elg +M@j@_OM5s9R1K4Nn;mD&cDO1$l#H_"C8c@`!;#)9I&,0PItI]0D@5Mj54> +D'*(q3j1<(=.R@39*>/$)bCY`=XhS7r7=KFFYZ#=J!9_!q!U+\rMD[gL4:EI!WEZ0 +;=`<=r&N00s0WP@uH^@6r.l/MZsg&.85ku2rHB=@Y4 +X`Ziaf7Q9921KA$ln`\$/'W5>!SGs*^[fQ^%DfJj4S.u&DW%pjA +$@mW5q4fO$nm>C+;&4f.MB\7s&BcKFq[!0(s03.8m?mpR./^asVH4FbJ6tb>&JdXu +lctO^ho:<b>t]apXf$d$?R*/%mobc[Ij1K;'\n!a\c"oW]>:+c +,eUgc=l*#ZXYo!AD45l&SUW3*Z_j*rPMVb/^,02;I^A"a1Z?8?@GaVQnN87>J_YQ8 +X7ZgrF,Di&0CRs1pZ,'BO_`I_$$-&6A(RI4gt8XkS)5Ie(dip"$MG9"Xq#Zi!G'!;m(;J2[K+T3"h$+Bh%F +<@n=EpI'4LRV1JJk2CcqEUoZLAP[`(:GB?)^N$/tm#bsr>;hE5KmL5bfJ]=ZB&RSg +o".]j$P-cHo=Sk.ZJ3^$GFhF)f:$W[2U9,<*NG^?QAt>R4+H\Oq2<&>YCfX-[6ApM +\pm#t'l9m*2kbq2D)4W89SMQ2jY8W?\lM'PLpE!Q1>;+?,25N="T4Z_.0DMV'&emt +pf_uq!;Jg.$4(M\r3^Vdoa/pm&f!=Q_aYuO`PfXSD`?j2i\pl;:(*uCRLA0]iU@BU ++7^0Js$m0fUS4t]rWE)E7Ul:V1n8K&!aTV\\s-S'QeO_S#Pc@A_MJ5%JO\St.8Tn6 +BC.EXeRT(=7g##cR/E_`r(&47$iEIr0rMI%uC8]7/oJ)QN)g(c[5Wnr"JiY +DU+CO.11('7RDn.O*4m2RK!Qmc1qA>&CLDi0bltK%ib'^r$2!;F5OlBb)X@]_S<^S +#)+jZEe+5)%C7'O?\:8Bg8i>_s,#M01&R.>q#A\BL0O4's$=.,oMPTPgm3F8`dc?+ +KK0mHo`Za,*`AmlXj*$YU>I'@IcjXY'i9;_*MY_t*Qo$P^#\iT7J2F\2iMrp6YH6K^W^!.o:-t"i +8P)BSVEmR,lfeu[>o&aH`q$ao5u176(Vq3b+2bk+0hL:O82![WK6ZN=H=$/I_9"r$30'oPlDlA53@@M!oOMXH3C_]6u;Ft,UPWT +[Kk/H?BFshntS^g_QInfJ%l^)_]Qr1MM;'C+FbC1M>RVR'?VWZO8+d)5B8+5^J,;e ++@XBPr];:p,PX&L#6HXZ,7BSXH)+EK385U$c[Sk\VQ#SdW$]22!PecZdc6N(M&$Ye +!3'rG_#/uVOfT["=e#tN!>]&m-&/I%B'A0FW^_&CM0VB496F:.Z?W`GG?]=QZ"2j^ +i:[i#bZaV_#PGQ,q(kfWpE#1[_YnN2oHW>.a7?j3W]P!ZRkl?^h;GG]#V%?Fh1\PDs0"R]h`3U1$auLB +]i6ZORNAO[Dr9_`?Z*Nb_4TMJc>O#%2gDej`NqXpq_(XDn*F8nEUCG\n%AbW\D3"[ +5G2Loo&Hk_[K$lM+aQ=3nAg&$/63g+,0aWF.qa&reAnY +\l5c#'99)ff()[:acO5U5at!:iq=l^]eXc$s/f!pUAt6*s&&C.#bTNJro;*2ms"aE +bJ*nS%"LRW-6;\beQdnDC+c0Zd3$Oqa2>OJ6I(]\rk#J?%iF+C3`TUi/lFdPW?h)O'e<hAhl_#k\ +n:*^VGYl:Rd>Q@]?Y0JpUn_'$$mPVU]lnS7SO:WRcYX'N@mp[u\%6WH/M9eV,6nMa +KmqqWJWQK8rok"8/^Aj1s'6`9s)=mo8='l=i+OdL!6kJl_fA$@fb$(qJ,HO:i4i^u +YT@+23?X*d!WW&OlXTjr,)/4EUEL/(r+.$!;UA8NnFp).]]Lu$r8iHWh"JeX\#G;Q +as*=Ld&'(ha"kd.A)^[R3/IJfG)Z?8/->f%JA5=1F;+THWIKU$IKeO4('#Y2K]3\D +n,tF%!Osl5dZA%?c&,^*?3n>!TSckPHu\-]!.lC5^.6V!1dPDEP--@\0GL:i"*Jmd +\rm135TEFZM'"%M<7/VF($"ti7K.!DiFCirRc)n9e[>5LCFf=P/'U!gW\3,2\.73e +Z09JfChcspAYNT-DTSk*r**Crl0Cb?4irF5P(,SEHni831::nT4`[aaeD9,h>Ihd- +BD('(l9XUMj:C-!*#M;SFFGh1rCT+u5]Sd3I.Es+@S5Q^HJ8jFE4tn\G4Vgfrm[NK +iK`iiCVr3Ks.sH:=M6;Sg#Ppnj%XGN9g>boYu,o=BuRL9jr(CU-Ol:*eQ:`#&HhfHQ;B,1Z<]q>am!\'bG/Hl$&%(+U<7,/&/+9T#CiVO7Q3@A9]06G,gThY[g+FlZ^i1J)?J3W6gW#YS^4Br3j +5LWe'n@oHTY.YnJs2'O,JG;q<#k5S7r,6ERpl>Y!`rZPGVqn`\s'rKp,F1+'Im_&& +/e@_ATZdT=GDR1X!_*7kWP=Mo9&ee_ps;V?d,YF?@@A=QmD"5Ur!3!)C,5khJqa\a +^P)WYs,d8'nnc!k#5gDq(dD7,p*K2mBL3%FO[@!l0+S#DquQeqm4ZV=\,?@,&H2_$ +[OOn>s$YT`2h/o9s,#KZim7PBG5b!sBE:K9s-ET!Qj"&D"V$0r,H^e1_gc;Bk\s&. +86>4u-YKZSh&g)![a9@&e4sp_]:7=4aoFjMUfMh3M_.).bm9\7rPfPd+j6e0o]etb +>o)qeW_CJ2f*Dkdq1hq^K,WSi/O)f78EZfdpo-_(P+al>">53V5hg5`.KX_p+X6ho +pfiss#ldpMP6h1K5"?+!s'4JHR^>`oC4WT:2sAC-"s%bO2HC*S"bm_rYsCYM80[s@ +oN#fe#[F%?LsCM:FQF27s6ARo#2oMp#9R.MUjB6F-inkfVh^M(s5sC]M#Rb["TPm- +"r6X!iU1<0s"se+,5bMMp_0(1/7:.$gIcnF&qIa;<9cB-\.*"%I48PGjNs3E!<*Q) +$2>IPn3%tUbYA6Jck^8m8hsCX=fR>f +F[`=-1/1\5%#uHj.'f+LGF(1WWsR#"+'TLc?B\]bWk'laEH\>Gr&Xl#@cdAOl1rl@ +aUS7A.duM?dtO9:"7m6TT8=qf.;iEC*:-EUT?6Sn,m?%'B/k\09?62BMTdf)lk +HBNJJIK,"An[7MqY3bRdhUJ=?8I5-RrrN*\%9%VdkoISKpr/GoM.]PH0>t29I9:Rd +M/_aBi7;Mrb^@C;4l+8H@W"gorPl/8b4FPfHYH,5o0P2+CZG9"IViB)\0ef]Yjp:S +hXk.G_`*J7kDD?jZFR3q+6Ym6o]UZ9:f,^n9P7I)g[MrZM@o#Vn0>YQ_rarqH]UO80kB +J,Et*G2*-C8-o33egU>UD)kn?8TUP2#8_N3>^;u.GQ*]5E5Z+23*:JP"T0o7(+qfh +XuOs0H+LBj/-%LBW?#oX6]*^*+=mN)^nirbMigKUL"6G2s-C[p;#OOHr>AtuBhuuF +=4M:\`DKjm@8"^NA'qM5Io(dUs$+a-FPQm>plC;52#OHenNRWbJnbo!IhKO=nXl-s +'p.N$W_u1&"'FR\#@[TZQ2k59(\GEK0]n&tTRn9eIm3s`Y7qF:F:23DppM::GV>Lg +JRfp7XX85g"7<.q0`RgR0\91kBeP&pOT])3Lp\ZDsO82#i +aX+k+%CEJ==rH.im*5U-e">ITUOq45fkhdFX,@t'B*GB4OI7"@P!/Y8O.Ml_J%[gE +-VDeoPP)d,/>E3e7**GF2Xln%c%gC8#IO^7OTdQ_JkA>H98;qSP%RotBS`09f)5'l +3=5WH[eRD8E:n6+r;DWqT:Lt]*Es@_dGs/eps[DQf`o?$:]#S<+)7dqr'qOL,m57U +&KgJ*`qZ_W5X!Em+7UFU5`G_D)92g;+,Ph+!0*^FJ3Qg.ILRg+ +@:BBQN$,',"QX[>N96C%4^s:Q7!8kb:-P(*,o3$RQ"U2#:^^sZdot/+=dFY=Sh@2haX^8s2&V/>FAFWh]9IfVb!!icSJR>_ +2iM#m*F3=sIk&)+TPAkZA8Jr.i_f??(qj7aQgK.)jk72?"J2MA[QV+lb[!9gO@++HpA/=5IO@7 +N?#Ho)4mPr//95\C:q!oS(Nk[I]Zn#@pI_d0>(-+^X4Zd$Tsd%4lt#&P0Ui#hq;e6 +q-GuZ>&s@ko^4Noo],'?E.QVuq-EM2]RI+7R9=I2r7YP^A5EM0$8\>`)H@$[XS4XFnL`:iJ$U76`8t% +-1@3]V9bO_VBlIH=`.BJAkbH$,br"J%]TK)tFLus67YS70"+.`+-PU6P4(T.Rq#C_7( +)#hB5"Fji)#p^_iY7OXho,mZ*ksj4D,lm)Ba,g[d>CbUm%gqOkcn&!>f.5$qb0DS* +n9=Dj:*'M>dP`i,l>7OVT36\UY,5<9W9CUTC:MRk(I5"E`7RkmJ4-+066GcJ,Z9F5 +Fb(;rILQ8(8AStdiFmRe>epBuXutYB?q9WM4/]hFV_>pTBjl1?)2)*t+_GAKdI(L4 +4LA.52Q4m:$s@:.A-$5rs"V\qNRD@A!:0ak;,h.I$HOD`"(;Rn])XSf63)M;+;I&` +W2-(""E\aT!Nl8dq"FjHJc@>2s#dfC^^Djo]f$Xlcb^)m=J2<).;WT.\V1;F-K[hr +7o'.I3-b!uIgGRo.+0s-ei_C+)Z^b*.\L!fXB0G:?Zp0\Fa?Rf!qLu`7WfRIn-](B +fEC[cnpbjV2;[iO6Ho-33/`EL;Fpd.F-53VkV`%./^dm^1^DrWL%%n-+5d[8/!uttraY^Je8(Ep/IN9%!;*%L!=C=?huZ)VG16\K +<0rF+&5\545U[aJ,Loah-?b'*@Z/+f\-g"e!;qo(:.K`^!do/43^H,6!\TQY.nZ*B +V4nX1bL4?ULZF^Lo!0N?:m@'C"jCpWh-d5H6;u3alMc\frC_`8lhh]C-"iPp/o9$C +>Aq"]Y^K>jnP6pjL!!??Q+*?#VU'=p]+8%?BDPDdI,i^W-in4,8!g80ba+j6ar7u^ +l+K[SSRhBLaQYn3$MC25JH+H_8.H`iSL)sMmamJqg*^Qr>M7i5V;kA;D`ha$gl]k` +s*#3a0=5E\"MfL_Z+-o@I&X^W7X>$!kh\tKls&/u>Lh`)r8+mKp826W$%E$EG89jY +l'?L8MiVDXf*.N()oahe1L$m4=8M`0rTou%l@J*[6M%a)g%;I"CV,=Vc]-,/j`g.E +T>+`WG#p[#>(6L>o^9Fo`!P),51kh%>ZODYi_XYTO%QP8cKV4eZdJs!S%#P\i!%ia1FOGVY"@CKE]+uW2S +"cS!"2pm_Gkhp9eigrr9s3W&id:-7c$38eh'1-'#)#WFlO61q)?G?k^cr2Xb.g#^2 +#"lZ40`U/K!;o(9=q)6d3a@O;+1$L/MimiQq8e=I'"NJD8hJi.';C4Q=u%j_1\ +A+n?Gjs#?U@:R-05&Wu]4.sk:PiiIrfR4AJ_1,VngAa`]C!9?5^V),G;O.@Q2\r=N +r]ckO:m`FY:)0OTTBV13($P^J;/I)a+2U6Kp'"$A'WEKR-:ScDP#=.-Cb6R@Q&YTX +d5$:QfE1(1GO%73T90NPlF:^@a/e?KQ+6mE[j23LPp;7)hqgc-o,&%m!St\CI]B@S +%9/!"@gsaCOS:<5ViE/.nE]kJYE/>TjHoZ>k9f=f>9R%S&89;j%7ftT,AloF5MUfH +dL#_6J$:/9TUcJUDp.O+E4T9+?""LRHWtQ;>B5)-S??6p]8mj"cp=c?r-.E;s"0*b +YQ1U'9X6LM1t=!L0hG9J/0IfY=dU,2!^M(9!('ka.8h< +2^JE4^S;(m&'5pOmkj)-r#N?MLT]"'.7!CS'KOZs5^p>>&;3o!+Tsa4./^V1U#^,j +`;.`tZH3u;"jgN^L5T.:6pk/;Bg9E8U/E_M!_U%"T'_eSH_aWR*/lJ"3"lW>!fJ*, +,:l)e6det)pB?*Oi$pumPRbQ#An1UG24#Qr99Q*)8Z4m&+Gl"474"q-P'r5Y6W.lS +dSs@pMPbu9.UdQ/WfK'K0+3*H.sgV@?!?:5gb6:J;L*Dup?Gi+V6uaBX4::<.kWF* +?@F)ffMp\>Pi"?[DEFHP#6(6m[/p<*E^qh`0/<_ads>qCpY;Qe?Y4GN@/)f^1r6Bj +*FB1D%VRKA]LNLsNu]o\L&B7:]O*A$h/qgOrUc->mORCI8EkJi3@Fq%eG#TYkP$eD +d%Z&*#tb1grbiMZYLR"fZ]Nf]M^CC%\)>M=(2lkWpP]WSW:)lH9Iu%(4OW*@<6W&* +4kqbEh,d?FnBTgj**qT3H=pR>1YpqH/8Qf6=,!!m7@0SR-[)>-cP6sK,tj;q&"b@R +GBLB$\lrH`Ps=O/@^5N#-X/f"kPOt;C]@ht[tBF=6CLlW,1S-bYS%^Z'eq9Q#4ULn +VZQm(_ukEIs!K^SJH);[s3Xnui.&ZL7XuuJOG/\C&a7-(s*M]qaH#j6.hVc:s%Y3/ +J"Mo4r.k1lkPpZ`ajHF&'-X/"s24;JY-hlSV)iJp1$mNMlZf@S4BMdV5O5@2mAW)0 +.Q_>t4(0X&Agrc2hiKpqb8Jg8LD1`dJ%q5u.q\dBs6c=,B2t8"P%6";L\u'=8_''$ +`BM):^jepiR]n>;:nB#8bRi?9!rR'5(H#brpfV'T(;N/WIjmD#IjJ*mb"g1\M'W.` +hk`\A02quK4HC8K$\/_@;/fbqN_@S#pu)[l2Y'`'o:L'R`uITfRL:jq&:. +=1AM7k5tZFr2_e8^"#\mYqputlo>%4RLHD#X"k]#!#pJlQ4fNaRY%R?ZS:&X82:O9 +E)R%<'0qNWKgWFSR;(-C'4gHU)CW&bbJE-Zn_]N8=1AKDpj6g.n-CSSRH6<$)9=uT +$fVWpr3r%qXTg*b!ImGcLk1;@"1,8+"R,Onp@uh("R$AK"Z-^r2@dc"J<=a.iEkcr +Ieg5L`UQ5O\,\F=q"8m(I'cC#d*^Lp>)PI,BX#7X`,@0u=c;;/\*LPID8&r4mnb5t +iNE7,kCI(K58U6r7+hS;16,Y3CR9)JZ#)63!Im/!6RAX]JH%>BTLXH-T0HogR/be? +!"L/01TY$$'a,<1=4"_dn;=G?63@U7$F:$TaL2]pU%'[IliPn@%!?iMZ8=pGP--2V +abqsj!hb@hj;/GD/D8&sg5d3s03sf4iYSI!M@U#Np;oo;8W&[!V9+=H6dj[&8SO&3 +O4M](S?e-EDsj$034i!OFhdk*C@/r/j0d./Wt-`,Y?"t8WP#c>GN4O-k*^\`8niKV +Rf6EhlV(@;,,=0R]lTW(qQT,A>fF7sXJ(R%DTMjeEsHW&]8t@POb4#!J*U1KP9eoI +/B?_%L(h]&o,6MTSC+nFZVMNPen]/?$gt]+0't)'0`5;BQ?SROn#VT,Rb$A0QX;6Y +h^\&DY??/R;-u*anc"XR9qm!.>Bj_(J<$`j00_6DDX$V+)X"PGCKm784n\Ymj22&N +XddQ_VeUe_kJ"DX^9p/[2*KU?/8iUJUF.)CBN+,tHKgiFl%sNPWH*%&d/,^FqTY/H +]u,?*1&+91h4IEMIW6t/om-;@VlfjmbUID_'YcKD.EZagZ>C5/?&J3f9hpCL2u8M$ +dAOo'5=.D35gKoYE^Cl1Ir#.IG2N`%n07^8=P0#=Ym'#5q%Hd053@?-%/Yl*pl?ua +L\s@X/-5aB$C)4'^]OK;r8Th.BKTN'3ZkLg(TJA]<1NV+SbA?Mr(f=G:Y:SdgPV"p +$BCMF7uc;$II=XCaSQW&CTIl)@"@3Z?!+3Oc.?^hG^+.Wn: +a8u&t,]'B7Kgp7T(q+%fV%GlIASS"Z+D')"OK-FBk(87#X3rWN6]R/]]# +:1o*:o"U*FaFCZB1Wk2i3`nZ&"ldQq=U6[b&62!F"_'gZ(T/GOb=P_lEH]!djtP.J +#jGB5FRb^UIj4f#r6Krg`;/jW1#5)I(jprDSqI1g?H$A>O,#82OZ6!s-Ln] +/XKgOBt3h8Fmlm&cB[t'N[,M's"fl^nGauEH^a0u/6&7R_&^4Rh)!1:T?S;ZrZBF/ +Kau0jh]i%Ab:oKa300oh:8GDFU]o,.60U?C(RpDJ]AgFU'r^9tJU^aDs+P(LV1/5e +kEE@jFIq*UD#UPOl(&=,JYaCSgf*n4](?b?^n-#6Q"_-2^LLF'1,!M!k',X^YC+[i +N12oo(#]+tIVN23Bo[[XPrJ\C^[T[Unm&Nl9XXFb^'qg7P#(PF-XN2gGBDFpUrV($ +JR+o;hjc=s(MEJlJ)[f*,G..VM#V:#6lY,M!ImksP_0\Ys%t)Z*u'R>pT[mRN4:'4-@0E]kkW0O5+Oog +J$1@57'qL8'D[,;h0!`#9l)%iU)t;!#5a`H\VMi.(P? +?eHl(kp^988Oj*&s-U2*i.&\4#Oih_EIe(AC=\1rG=\;]n72CjeWO4gR?#E`b^X\Z +3`lC=c_^^AQ_mBu;C1G(U@M8LAZDCa?!*^O:4PRor1KhZa>j)JAJDNr$@e.DrHnA/ +e?W@&+MSg8&;-;3UcETQb9g]P"\]l-JWA/rbf6np>F21ec.(:*p!mS^k\__Pi?$($ +"b.4t5-]_a%f\rUH6JFNE=I+-K;'-3:ld.-1t\+TD[7NW6h6:ns$ZX+[^&2)O^&1l +EW10,R?7Hb!l?k,ha6uQZWqg>6VG;o\#W)&a9\$pn`+1HC+B_ZH +&H8d7s.)W6_o.B$TCifrn^[*hqAd%B*Q0N0l36s@TVr#2R"=H0'0;9tL&\BC!c$,H +>7Hh$R?#jS*S_-K;4"K!-W&>0Wp:&E%hM`+IiG\Di@`MkNs%#lBYX+/T7i:7M?8#7 +X9%5iDhIQ:)6/Sh8m=D(+]f8/J$1.?q!U%Y?+O:QRU]:X+=VAK$Im'=aNo-mI0nXZ +Ag'b'M`>=5@?iUM.-EAlTeAUL5*eX'AX/HFFr<%!91Ham?$o8E?^2Y]d.,a(%0)tQ +3j9F8Lt;fd9gSFH^//VH\-fJ1aS:.%C]R?9kc.3N!iX8g$Eq+,":S)e5f'IJEnm@-*Rf`T(0J1&FX_q@0T3IY+]o+NF.so!#H_sfIO$3*_RUpfuG\pc+p0mp1(\37r +:_YRBhn;2PmI$+_ +*tNb-h"AY"QLA_ep763l4)-e&X#U`RV$<`+\!.(4&H=!e(;Or(>C`Fo!0R;4s4@BV +bT%i#kCPDc'8?"l2/3/s%KFY5ptpf:aG?toFud*=+-I]Ri"%"Qr^H`T9>H+Q,Ji@Q +JMPSlIjld`"K-mKB0p03B>`ikioNblIqlo!c"T)nip +JJ"Q-+>rA&?j@O".`5!u!P!Y[MRl%iqqqW#1Eif^"9S?cpp]Ln;><*/D?!/jaY0Ca +T;[8j&+e]Gi&GRiLF!2IKNnTo%L0LK:\X,l52tPAJ;tDndR#uE+\GR(%dC8a6">)j +b\2RrLpNbl;qgWBlj;8:L?bE7k_h9L#R_1PFUA0B,Mc6gqh2mq$6XSATY7nF[/o2] +K`;Yjs$:9@&cVAEqucj;)BaOr6!`!L@3`5(JGCa[Lfi%<]GGn*;bSu=kU$nd,c60p +@LA^WN/.755dDpl^qNs?M=5:Z&t\3FBDa+I58`F18<7BV@YJrqPRHo +2sD?\ZFg8b95qW_bbF]ZBHT`$cLd[OnfLVMT-]82E[,XjOZR.BhQNt,o";06P:oo, +]?1@32(LcR`BEVd1Y'o0`B63-75FU4qs^/-31*0"^MCF\9RC\VH$e/QpsT*0NFRCg +^9[',h=E;eKn03(0.^e(gQ(Od\p8>LE+;IYEN/NGNc=EoH3G=+WO_OuF_4Q.qT'lU +Wr^Ip4=gG=ch%256HrkEc2HO;Vu9Ci^\i9h^\X:`^A_bT?iTu`kIZL6I6@"WV2d3@ +K3qmUIXT68c%oeXQRXR4c14E)^jdO=d&[Qm?M\jrg$`-1n,#=W!Gp\DWs->Sc,tn3 +iQ(\pAi=tD(RY=4X2XW3r`e'Cs7)[Fk'pHAnos9WCEidKOUAo+ip`$#s)`kPr5\:k +'.?!_-pHZE3orX/pn)R.r!SP>$BA9\O-pU[+od/ui;=,`+',V$jK*e:'Ch]]h;4YB +Br$.+s05Y!'#6h9J@5M^J>t_3;4\s6PbeQ,![5g`V2YQ`t5+O:"3CZpP2[t*Hs_#M;8A_7&R\j!=uliNRSW9;XT:#nMK +rrE)%#`H2^NM%fGl3O[Vr(Q$5^q\Ef%K$ah-pBEj8cZ'qQQ?J7\08J+8DjPE9r9`/ +!al%PH(%Hn8dOi@ck3X +c"rl+AN/')7]+)=FQo4g(_f(7hl!.P2;(8IKb0YK-LforVta!>+Y0nLT%E*Smdufh +#HPWATEOImW<]X@(;Ll&k7]HjL2qg+!+(6.61CJK:i3<*;Zu&Di$aEQhl5_ieSM9! +c&>)TA#0TtKF'DlR/h_hJ;,-:Co54K'4dd;0-U`ae4H$a%WrDXdI)ZY<_4XZ/Bn/t +A0b"L`Z@4_"&F.=;>qdq&3C!ArXd"t#/&pndP+iFAqCE//\iZ!1EqWE&1R^"$OD=k +HsBYdREG(O-ikTH"e\S37B+(P0djRn2m"_4S*H.iC5Td)chjl5Rt>rPq&'VFan6rO +:$'L0nq6l2K;,A5+Bd5\;e8FsKJ?_:H)]4KgXs9n4EeL-ibI<2a,O.YL"FZu8_`%# +Ic<>bV<+?gpj\FVIZ;ear.k3"\*,+"s(,C.9[;QA]DH-9X"W;iq3op,/F-#rNK>t5 +\WI9$cJaD9A#YL#'l=UQ\rNsBg/!1Sojtt:kkGP9m$;bPQ%!4=]C]?VpT\Q6W>nW` +fTja3Y?M&,^X1edBmK3jp(4Mm;usUcV,rtJ\":Vn?0a0"O8&P_?aMqA*SQ0*HuE6G +1!ZqkVB5"L(Rm$1'TYIqSD'6(mHQne< +b5\`Nmm#(rr'0!4Z[Y(,dslN9B7Dr@o685>h&cN2XnV#MD*Pf's8&JUlXQgjrL/t, +4OYgSfHjLTP\-2U;b5gbkuE!5CSbS;#l*Akir-u^,d7C!+O:; +#Q4%I_*=(^^!6]+n)Jm;rWN8E:'F6bJ!g7er*uEud$[/hBn$`1s0T!!PdfSX]C;&c +i2!+ZplF?Obs-)3(6HUe,R&Nk`p=?pHA&XIo&#((5h0"%jM.uEUfQ +#,9kUX3K/FO>PK*+Q?L'dX1ajOE;4JI.U=,s0s:a`"l0:6/A4;-!GgRVYH&6 +&th=:cKa[)f6q<5+t*[]n4IV7'<%h*&]*@3L%bFhMF4O5#lf@#^>GGV4:)YFs&&bg +)$Ks_gGfC>g9-42KcQ`P&F!blm)/O*/e+9D;sC)!Ir9YtnX-j*ulVh7YU,[<8/ +q5s3]O96T`Uj1epM=Vfu5?In26e!)&\m^F2&76PL.g6i78BhJi=E+^fLaZq1>`A]m +BSCJ,?'tj3+=kX"&f-!Ud1r>f5g&0WEme_2IoTABZ`<"leoCHSE`2_'N4Rf/`hN+: +U6N[W,[T.f62>`!MM"`OMlOM"e/o*!VY:i\Nonl`/$r)R+'tt^oW[c3;rRCdq9:MI +eBo.Fq&/,j2.k_sGN:fuI5KX4Q(i8H +fb?Fl!regb>;#$FNA91KP6,C']f1ihh>?F4:O_="kqA!fI!Md.];M+S;(V*KJJcBZT.rQE.0l^Rb;?IrkG75F3?VQ1i;!mJb5Z?\ +h?Wt&(A'TW6+@(4)ubTf?[O,$I*>ZDacD/O+7K,X0`96$97[&?I"eI)Sb1tFs,dK' +nim0T4IlH3rI<;uP-Y@gN$%/2TUlMgLCsU^O1'QOr/^8VY"2JkVC="DA2WW"RWM,< +R\V)og.]:hO;V9lV'6]u_E[N3_dB==l!jQLWi4G@^-7ANZ$_TVXVi'YBYN?19.d5$43P/j%8D@!eDWr>.*fi3j.%\,BT#nd"rZolN#A6;+d# +69@`'<1Ad3:f1Jt/7QnMQ;:!OH*u_C4M#@4*c6ZB>1kKf]SNJih,iCo05D)_G6BG. +_U[Ho27O3J.i+L=>fU8_9JR3@;-:fZEB.PI ++K%?XV9!U+8KLm/=.KNcBukPC$_I;0a$-*SM^S?60#38N?GT>ZZr9L]O3WQ;NJY+5 +ZAd%rqSl3GI>5$S*@.g\'*H$#P""K3_Qjl)8Q'WW_5;eueGREa!nHET"P"2-,'9Kd +k[7]dJbkO^9r/)`b74m%P=/EmK%_J=_Z;R^>BD(nE9>Ek?F<]!1@@iP;SNJP3A1_o_&d +rBgONFjA>!>7]tY;&s<&_%Teo8=KK\I`G$[;Z4]j9`OaGb^]Nq\kdc5I'Daikfdhe +SX7KGgZ#gujGP[eO*8Ib40n\FMEBSXl'KCO:D>are5L:e$SP6KSnk31>4;F#J*en@ +O5@BJIhR(t_RK3T]DX(\\)Z7kl[Q5'>^U"j\S[qNhfNn9D"'a^d$?T\g*?PlB1i4' +54u[/I.?rH?i8a"Q[ec)MuWM7=23Mbr,:.Ms*pAbombm!ec3&HbPuVGci0885Q,e- +s5[OWqpTbe5M\?tbOs^fk9F>.qL1;>qf5fRY?dR]Q"H^9?jYR;ANOERV]>+$!hm/# +`'K((kJ)h1%k[Okn(Pth[9E.Z)R==6jr>Ws#7EaCfj\U3(%)\3/^1.$&3'A-qK?sS +.]3BNs5nmDSGDBi<(q`bs7a-`#2DY_Im!`_rWp;ZIi0Dos%iI6:'\qf"O['!&c5GO +B.OTo@cupM]C<?m8R!A#5DDCr]O>[FTK6^fPqsOqp50aD6eg]ru3K:+a=*3Q(XQSJA8TT"lM%N,SBMniS?[Q8H)$3#7L-qaT"*!MQU#8 +5\:JKUdbRii01[GLN+il\R60V_^%Ss`B]i0&CJo#-E-7"l08JQWh,rbTu\`?6&MZn +\4Xr,A//7p(TU+MAJId:SZ/d6daXH=MH0tT$E,,C2GnT4mMB=,7pQ,`)QKOsX-!fJ +fl8#QW;O^<7X@[^]AN3E0"gd'$NJ[>i'5#lV_pEYJ%Yc=q;:UM')Oo"gDoid>;fSK +cq;,@[=BRHCP"kQ+$NFcF.nF'!3RqS"sUfC"6tJOO%<'S)lW:u%jldRgCNcqi/^29@ah@aW*SY7NL!LWQlog,.bR]&PQM=;%dMZ_6kJA9^%kI0H_9KHe=TScp'97fb9 +Rt+u-AJpq-R/cG4P,^E-!OZuK.^FRAs*;S=RL55t$^)D8JH(Di$BQtA!WIcGK*;8T +H0'hV'hQ9b,XLgH=ku8Oj**]D^2?7-&HV"+YiI-,Z63ja;k/64S_hf>4Z=rV<*\l: +R6/jHA!s$[GluO7_\7`P2tFSXM?`KKS=D5SLK\*"I,mn[D(rN#j'].TM^$p%/&DNj +6g<`sg"mr!f9pIDCgDDGQZW0JIVS_WJ#r[&:[ET%RJN,nDjU<,Wc.=IB/cQ!J+`gb$i&_*X'beL__;"]qnN%nmsXo%BE%Nf:Aie[^@\bhNrT%=Z-T'7J%"#/ +ePtIbF7ue,%,Z3+;LPiEb^YP(7I12;4pV/d8#'GA3F3-s?C[ +>TdFr_>M?2o06+)!q=*7`;\)q\@V'Q4cVjF!I_,fITKs0"[mP8`SlmLJ"6Nert>ik +eFWDZ&So,")#bmf"i,Trs5UQc'@m58Ij4n_FBm&iIO2$jcL-udq;73eIj4lI)Q>Ij +BA':?609Y[$,SpSGesjPU6Y"hZ,n?R`,ZnEDOg!1.))]>"\%&=r*IiSWWF$%%S_m_X5D +pVcjqe?Z=_fG%$7&i:1jXon]H9pl.aU[Z>%f/03^(`<5pr.l?_\6RGen<]u]j_8%4 +"u&91q)+R(D3eO!%d5>B*>RnX=mkLAcl^+HO86b5+A)WCCQP"H-^KDT@?EHF[[BpO +k5Ro6VBJ<*T*Z9`9)rs#)VRS\RS8qG.:<0@i;\?Mj8U8gAWj"[CMEaV]))@XhOui9 +d]b"iPUucbN,_isITr[Vd1&2m?eokK/P.U<-0om+[?p,pPMC`2JtZC;^!e8jZfRqi +'k=R=BC?NDhQ(\B2)jEmkOrF+0`Pt(kKC/srJLWIZ1id/Zb#l(h\l)>9C>5[7agoQ +Bh$WnQ.=(MhKtmBN4NQ1=/tN(JE^IGNA29&_=SG)OE-PSRsYP,Q((Bd6Qk<*T6"UN +ND8j8s0)*s=g'/1$ZL?>Hgc%4Et1-SD\gB2&d09/OhA)5e3k$3EXQ\D9H-F2Eg]rX +GG9]dr:&QE'_e:747Uu'MYckpF:VY3hsismb?MX)=]FTl;0c-Pq2(g?)idj(n\+jL +pt`,D?iOm-_H13mHmsO']u^Xh9:^>apuq&#a5?R)pf7?Z/#ML$mQ9ua^[o^sps3mG +rPL)`+.l[2[qA>uH+s4JMcJ^8cS$M,]j1Lb1]j"EIJVCWO.WWPkY/r;T.^#c@q?`E +;"hT7X5:J!lA\.GkN5i0QE7eN\FQS6_n;B@rqE24!"uK8)*WHe+c1`26&Hl%Qp17+ +NlHLL=UW&dniFPh3>'>`p-f'3#i(RLO#66R]Iu)\Z:>Vr+N:D$!5:+oPH`t4/GctL +$LE$*^n$JV"b2j+89r?ih$YZamb)Z +5KJ=GfhSl\MI_k2e`UB?*E^An^md"N0=^pT)1lfZ^q2[jZtK2)1cNa[mM+6VsS +l)jr2XmeCIRn[Vm"*VknruFRV*2l.kK&cmZ6F5;1Ud4>PeU%mM,MccG6KEr\LOP0X_ +,Q9&pJ7aEF!RM"+TGIST"(FfP$,81Q'gVu@SG]li"@O7s&cp>eUp1:O%Um:%MR\cD +_]C8/I:@X,/cTL_*QX1fOSmMea3d5tD`kd@2.?'Hj>8dddoR*Y0R([^njOd +"NUWW#K6XN]-uYMU\=r)15LIj^F^>g:5(XUN;tPXFJNu4l,:$0pf8Sg+;rk&#U05g +Hl^0*6"__C5FC+7"qfe4/HDdMD'Md+_$8tJ6nMdeWjoPWl%>/S8iCA?X$HGZ +FTDq%TW&/_3]>&DDFVoYf"PEDi=H&^V[0PTS9q^->I%B1T)N*=ma.c+2.:6[)'n:W +?o2q*#Ts0g@pB^P&-:G`L0]el/H@KU_]ILT)TEANnc,JFs#1"3>;qR[X3'r4.e(2q +Ga!?Y2Enip?G6?BC#'(cbrlQ^"4m/nS>pYUfHnk;7ttYh2CX]Cg^hOCTA">PnZJVt +[I8UHkO;F)O$9o1cr8\309#c]gI>NB94.8ASK(q#W%I[C2GS*-4jLCkdH\>2DS9tp +-__/cT=!\Y&e_ +p[fEu43oAX0A(GrH[k@bm]ZHJ6b0sYN;Dk._Z+nanrjk?s7OftX-]kN^KbpSe`tIe +>P7gR0*'cI7uIF: +r\m8)BDfL^r(lC7GQ)\hl[L2[!uC]=;sTT4[N"L]?-BmlAO[i2*#4,(PJcAs)ZC+s +pt?G./p)OD!Nf]$EDRIucSZ1%N5Jo\#g\$=p_)djRBaM-8Bal&rD,o`aIc.WM#SJb +&]&>rg3'@h-h9bd2377Cr(-g>6>[f?Z]h0@dA5P%ob)T>CjZWg-NcRkWO?ke,67*r +'Bp!K3u\VjknN()(nj7JM0<6nG=!Oi8"Vl/+VB6F@9;1_`t%ea4g=P!rZ-[0qmIU# +]C"OJXToZGpHOK74SJ4h_k6;lT?Mn1Vi^op&hW^[QMIa!!<3_*(Eb40,Qc?,:ldMH5E[Vu!4q?I5l3bYCeNf("7q<'npn'sj(NR=V+CST +M+*J#B*.l22EfBhkFk72FZe(R">feBddg1D'o$O=s.d&X4fo7r0qURZ]7Fe3T==2FSZ)gk8D?cD`>lN*)s:n&f5B17dh#n&+uj!O+T@)B`U3X$t!0S>aS +*")A;>+'JZ+$!7@L5SX<;,oU"8ofr3n=odAR[MH=P^t;]= +ka)(-T";c+RXqV97/kj=)p.T!B\TECmGS!_OMA*1*pS72d!F0^#1qKshtVqZHJNK1 +#,lZ?pc%"JXFE2\HIUR>P]Qb_?,ML.*P37\mq\IY2fRcESMrdcEUZrZJ]DscS/i!N +CtHE6h#+!?mZg39$R*ND5hV\1Q-$V;e4/D*:B(W's6Ugi]31Uc`=-rS1;>W3Z8'c> +@*cs&;<>iD6SBjK]P2ZPZL5.KHDgJBH>IjQT#uG-3T[6;Jnp5flcXp]b9tuN2g"aU +Y4A)?/\UMapRTs)[t68_D;t,uO_V?$0oDUoDeAtjZf=iqt+>Dq#BVp/$<30c]qR=?%mTU93)":U&:[,V&qm"o#o'H +J+u;)\*g3idL@KU+'a)/Z2.F?jXl%+HYkVR])&(W$gedg!3#ot`;f$8TV0#e&2LU\ +9JVD("M"`Rg.YQIj#1TQ6e6m?W*N"6JI+9(%ZrZ#4=n65G0S#M3<1K.i4AtM8-GS< +^t48mJ'XPb!T8Gg!l4g9m=4a\(s"qUmAAN:i5Xsri21H(aT$u;?2SmZruZ<)dYkj_ +s+C+9T4S%Nn(fI!FY.,AjcG;bYKA\ +5HqM+s5K>m$U$=nk;OVt8c=^)5H*_j<;pU;r4`eW#63#',QJ1'bSpT+>l]=,3*ZAJ +$^^Yg>5=)n*c][WNVK>XINnf:W0KUas'YhF5T]X.#JG/m>NU(N5lNBO.qCC4&QfKO +MdBlDM9U@\<>W*.5A*4k0Djpf#ps0??@)pLXKXEOC +k5Z/*DUQX"\bMA+_3@Fq9Y*Y08J35_-)&G`p6"i#`ErD68+h\` +CIK(ZNlWrp-R0c*!6`tmm;(l<$70o<_bUdo +4gAe]JZYn!LQgoomRuF9[jNKjbc\Vn@pDba0#afr?L"o2o^8EQ"0Iita@/%sZ#5f0 +g!c0M\Xn[Yj`h.]#8?pj!qKtXXUM'-V*NR*''1?"P./V6(2Ai#.WUf?36LfDCJ#Tt +ErBcHr9Np$lR;d&.^5$Qgf+ku2]hB,4ZOE@CH['jHJkLeaPD:@HNj]C+6e5V/NVp. +]GOuP`_?2T#7A1oK_k*ClDOAT^Nu:Dj6<;!c5(hUU$T*eo[ckSIrMFSHhWbRm?Z`^LK;'tVs9-'W]S,!%QN'9l>&be#'=jS9&rpIDgj&e +"iLAD!;*^^^,9;[L!549&:G4^'aKUGbgU684]J]h;J>4he3X+NtJ/]0V!O=rC&fDC;OT,L&s7AGg ++Fj7g&*.XJ(*NVZ@fk]#^n_S\2+[^9/:ZCRB#?Lsce\_fSiIY+"B'_Q<+7&$r?u#7 +`7GIh[/GA;]o/rHa[PdXeq>ZE_2Mk'X1!#ar9>GYupr8j+pbZ7a7"@"M,6t\"5-XG$riLskr7CfF_!\<9!H\[!r:eEXn&(4m+HmmF +q(GLcal.0M_>j&V`G"!*o+;9/ch'V]p`BM96i@PpO4XW(ih)haqe(XJ;7AOEQ%8dH +oA^c2AVi+Pk6jJKOZ">@jWB)shq&Y5a?ffCHV6j-c,BN,XTU=m\J?b-+;$m,&O7pu +=g5QjeANTXO9d#!)!$`s?L.VVRRBt9&SasngJa5paXDDJ.i%Fud/GC'W;$mFJH(K( +,>K*XT*,=iBEWu9ZiM2Sm/jb[k8J8\N8glL`p*OdkH>!`]>n[.ZmXW+@=87-r!5Yq +`)n*=Z/V&RjF9\[KX3,li_4ZC;dTI1:OqqlJ4Zq`dOS)'-)ms[+M5@mq/ICaV3jpZ +&-Ja,hZEcf>?ZZVk0-K=W!.,hph8b-O+;0PUq6Wo%MhH_@QS@Q>Q*4*\rj,&_cplk +q5!B'P(,()Isb>2U5u/=Y?)1aWmq2RY+k-\nq3f+75?IEt +9BDe\>']eK$KQ[V!K[TVjkjDrqt'X3hjuIrfjeSX4B_CFgParL?M;Nmnh]kP%o04? +dC3Q#>a*O=!m4!>.8)*85WbBO#LJ?IZWGmT,(T98I9]>DH&RD]'9n`e@Oo+:o.+J(ajJ1#DVF^&R=&Y\)rl +b\to:N#KE%+Ynu_F<`o0^LiS**oO*qH0S[_mB= +OojQkOT3`[WrJD>AA`&+$P5>r/VTUSe,Dj*V8-QA)8;d\L!dFr!HHO<::Q"RrXYjM +0-^DA9`@IKrp]uVp4314j.R5B5ELiHiA26dO+o_?U%V,54+%2o^aej'R]8..]\&)b-o4IWYWad^0B]SOf0VZdZoAOE?qH2B-- +m0"c%J*b2Smtgkirf=YO5dp]d&qg2sd5mgnlqqi;.^!"'Li1,H/%j0tg@P`UU;j78 +-0>_OlLCgN!NLR$Z(;Lae\s,AKU%O91e]kJ;f;(hGM3<$kKio,1O^LC^m%WJ[q:Iq +*YFqE@/F`n!UTgmO#2\pqFKX2iK+WR`6@EpGu0:RJ6k5.BSC>`aJff6btGKR5+)JG +XV>LLZbZUVf_50hD(#I?ZH3g\7/k>X[W2BGcVb;(l\=[5UU:X6=]> +!G9&s;5@\9l59?J,0F.]fh-:dA\!iD4F7gl]pe1g9DR/6b29sj)._k*lDYmRfAB!, +)^o>dT"U0TEi=4=Q'>5E[St6CWOp^1.22<3^[S'fiK]hDpQ$#9mf`4eG>Q&"Pki@t +MEa.+o$8,p5J:%dg#\+`'^3[hnGgOq_#G^15%"6H1F9e^U?$q39"oXR_:NQRHh0eu +Kr*3FB3*h%>CXT!EQ1fo=0qj_#+pL"%L'i;1+n9BS.5l<5Z.UT!r/96E^D=V4m;Kh ++uHekLfms'UaU;$FE@0SU"TAGFG1Ad=jeou3SL>Nm8N^:!$6Yn-]3EX:Y0LAAr$Ee +g49?W:>esQlYrg"#c%G3g&`6%Jb-_UgAlIX)XKKLhgEAoIFQl:L)ftRjGsiL#Oo"E +*W+&t+TFSo)>G<75HALd;G*VW8,aSFJcDK4_@XG(g=sYhURNh(`MS%ho^5`!s5mb( +Gt\M*\j\tY7gUdI[/]gYlhjPn"[JY27ed-2PFfi;:QWT8\l#/I#gCU@nlPPTa*Y@, +4#pFBnAuR$dK#5DD&h5\0-/%EJCr:,hU>"kLYr1WJCpH:5(&M>A%Z-l,MEB!CTs@* +UYCoCs.7JCHZ2/crdDD*B`Ab>mG>-mEU03M/\k9(s1?Yk5R/2(AE;XVQpgp\9ZS!E +Z@tj8Hl/[[h$ZLH:YlIS0*-=:V#HE977d1`+fYD0Skjgf.?&P6r*t1)BHKip67fE9 +4=Z!C+3S"4oXBDLrEd#>MLUE:AT+nZ>!`/+r!&EgV\!U`"ZdsMW+n)e3N*,.EpS+Z +$B2,#1Z9+b+q.TKIP[%tDN'<7NcaAY_"E15m=0/S9[)B&#rN^I^n5s?>EKBGH+`Ue5ZP*lEG_cdTA_H@4g/J +%_>^`o9\8M._I9:H@L%e6h(VH,h>)G.R-(%G]p[Vr+,?nAC6*!hLu)T0gWJecaan< +HQedJJrfH7LH94K:)g/[:;4dNP4-5iEQV#5i41,;^iGrJqqm&RX^NP6%f]K&j3%Y>9^\ +qiCu9+tJF ++Dbg;.0.YK#;R_0a>Z'pGY%VaGQddr)mK:t`Q\D155>eD:WW<\)tEsVHk2?hAdK=P +hnD&Vrbj%P7jMUQEVY"KhtWft*KnkBJ(joJ!n.'l+R%fL)N[;1:Bj!*r9MEl_H+hIT5"/dEgjJfn`\AjdWGMmMaL +AcI*]B_`;S_,_6N\G/if4+MRO*Bl:BOlF97Hue_+bak&Lb__A][h8Y8iemLqT]IEu +CRW'=?8W\G:NglDNLb`qTcmrW8'Hr)1OQKTW!EBC2u!V$,bWr`,_j5nK. +s79h)I-c=p"9CmjhOR+/kXlECAjXXq8:!)kLEOA;_LqmYk!3)!Nr1!)2@%G=T5iQa +0!u8gD];&B+>O"m>6+0-E^r9cfNA^s0Y4B@5fPuircK?5gAd'0]((?2b+TaH:p"WF +`]1QOWn?N3Y'2;G\lJ(plC*gC/uktA0\"C8f.T29/@eh'%HQ=^._7c@G'CUi_*n*/ +WR@]B$D*g43Brf#r++*2.H\S`oa3B=?&n#QNY]>KTjI@ik?ZS?1\I!$q=#NumN0AB +c.(SS.^bQL<`73eb*5Da$5an86U@lOUsN#^YZ4TpQ'?>!j]Y0"eh_^>$N02tI2d8* +2&$c)aT$CIUF+Si;eW,Q"&/C`eqO6=;gqQY9Z`]L[PD_;B&'H5H-2]X68\0(g"`e! +B7BSEk)\p]q";OYIsA![DeI8nq*N'`YH581C,PDYJ%]%YO-e$SHEm*F+5!Y!4@8--'.O[K0f"<"aV1ESmV$WmPmXA"iPYHXopZbi^pmA6OSa$$#an%,E9;]EHcKJ,pbXj!UtTkReFMR,k`.0 +g&AH2Gh,_5ZiG1NOAu:&Ur,qC6i_**C9N9b5:qB/pco;,\?^CT5)V +b$I\C9.<4OV(^'#Pic)j)7C9E"8guhNq.'qqD[L12_b.K.=WoaW2'8%!O[3URM,LP +E]oo?ZR@%Ka'9.75Tu!b$"L8ng:*9WFe!d)9KhF^]p-`dB/ejT7k&*PIWg4WmiF"T +b;3_V!g&D7-j$QQ\bc/kIpK&QkN0k$^Jt']$`/>6;uXBV97HJOac@Mlr6IG4^4(.> +gIFjgm9O^TIao[BFa$>7guPY!khJ"->+a6GS'Yu1CMI@Z\u;'_J59a)6rb=,2$?o- +"[#DKLR^](Pdj];jHs'l#/5L_@UUH9.<_]O4ILWJB(cS5k9d!N:?I+,"oD:)4< +9I`.crdt/A$]sKMjV0uZ:QPI:r5n#&X5JV^B_d;V7sd5rO[!N/Y_NYrChCLr[f<\U +NW:mPg6.2LK>tCYX")5ABIgFlBgDIYCO[W#fBhGAcZROXFo_$93/cEPfG +qu`bi-iW!Zh7YYq[jm0?Omb'qgh&b.adb+\DAf)X*MOc$lBVK2!i2Xk#QH#fbtlsk +5V.jh-&Ml[T_PG`+*XR[+1'.b[T;mI"HQ[&-?7Z\63fC.j*H<'%Y;:4$Ns1?0L(\L +eCGJC2Z[n'>3Ej]&G&[Wfn=&UHcFkqlY2m\K)[h=6/H'A#g/\e.pBVn?) +>*AmI$(hnU!;mAuO#eTJh?4s9Q\I&STLB3I9ZdhEZ2#er45EE,:UQ(9gY"QTR.2uQm>*jO[oE&]3 +(bLFu-?Tc=-MBWMm;^I,gOn$(j2KsVB4n1[(3Pq;^N8kB'"UDXc9k4!>TIF +VRrfprR@BAl;8qhI$D2t97?IUot?io&+7R:or6q85#qHgF/>L8XSi"XlDp7Q?%%,Q +q#@\P=+9`*$>9J>raOPfcWC&/FSU]Q('!9UiZF^Bq!O],hmg5Xm3?0qn#LhRU&'VF +eITUMg_jCEUNc*6f@kY]oh1U1$c_j\qXnp@NO.>5;js/NVCn`T6Ta3FDo/\rMd59T +^kn'rPBrJ_9f`kW"9@XDF1iPWdj\[h-V\Fh!N6U7F\LKL +P?-A2V/<]LSS#tJER5$Y[F''r`:b>RFAebbe%]:O[:@>,^1?I2G+1Q/:$qNV3Ka?+ +VKGeiS5Mm*T^j1i`(.bn+`SpDm5)H=':i6ZcIh;^"q\ctJS>tgbVY9TrGPMhp"9:* +NC^5fUVe2C.q$nl`-ecn$ +A-%A#E"<>o-D2(*bQb52!%e/T*qjUWi7:0$V270=KqITO;'KEJcd&oHbY<3[$Su)H +Gr"alQ7)_(4TOl!,l_C:'`@P/3C*M'lMjsJp`E!k40T9Y6PhEmC'?B`8(2)0s+FSr +pL)bh./4*ZcR8K08JP$M8F\nVDjuQje)gm#X_IV.A0,rqgEgo%A9P#tC6k9I/Ok/p +:*if!o2T;bqB,\N%-(%bUOluT1n%Dam!gWUJA]0t,J]MR@Z4:c7/k$H63*B;ifXlQ +P:9>>p^agQ_Ou<*rk"!^JS5>F9c!CHq-WH;"SeTW!+',u7a.#$]!Fs>1@Tk!OdCVd +#[/-dg#!LOENo7!#q'r6fn='5\sat:9iLIL)N[2Ns*5]!_9[f@^_$N50-J8*!(_[? ++M+s4j*rNJ5H4[>s!*QreN*+1ZACqLjF>SZAGb8Xj:hPt7\H75&c_1$r/(Hq63+\= +5fiYKRXmra@$?&Ld4gO)^-JS;NAj/5TN,S=a/.bQUVc?0R[TnP-D[i9d+(nUl^,i^ +,E<5BGq2Z[$D1!-Ssq0XBqaauI0FO0Api\Wp"iR2lUMiM30O%/6[A,Bb'e1=o1O-b +D^?:)#,rCYe/;!KU]#mjG8D;8;2Yn5"Lu.6E`=1])bMMg$2C-$X3>ce(V/-3q:=X> +q1iab&:=P%3T9i4+=l>Ra)KX,A+(rLZ/lJ,*LB+.anZkY0Yo?`(DYeGVQ3HdXL^'nk0EIb'7k9b +]%.q/Y<$?'\'MF![sm/'Y%CR;(K[h-@njZlY%L^acCZ'[crlSm$cLYl&-=*hHn'tS +.41^s%$lMG,+p6XCCTT@kVdL!.ssYj,`M*sK+&qHAT!8=!.Z1_RUia$Y++-Z(.$k< +&`Ak'h;/X)#E\??Bi%^#0=tob6eO]-DkGLd9l"=]r9BT4W]@%p8W6=&A!5K#1bpj%PMb4R@KZHB1+M7V3)^GPqIZt"^d21oJ +*Ta8UG\$.O`BPjLZ2BBc2\>fZFk-//f)sV.!Q]b(F$0^K1-s:3UA[lR#&+$L7fZ-^ +FFS;ZF_(B!HEnQY`CqZ@!(=W^CcAWt(YLV#P:lj@j:@pCJ"h!-dBOPW^_+pZr/VbI +[/=,.OT2+X9_P"'r_Ibb?l69)lP>[[idW4RZHk^W"\0r\s&fn-A"b&G]i9F0kg`;Dsq#9bo>$XDP?.RVW22_o-bfH#B[uk7IN] +&oq=Z8HI6Ii3`P>nNU.[+T$ZX(*FLb56)4]AcItj+2'u,D,7[r!:YKTfbSeQC&]DO +P))\sJPSYYD%#)Xf_eu`IN[n7Utk/Ij?Mbc9RE361N(.$Vf4#IpQ;=9siI +dAMXOO1/^qLX6sa<2bNEJ(uQnd>Us6rn5-f!:>8dp:jZVEbbe1[1N7S+%N@3Q4YbE +h`/^)oegEumCi17nUE\`lSJNQKDF&GCd:&f`IEM[\B-_c?lET\`u=?&7[p^2Y%i!U +OoO7k-Ei`se(09G)^C(H'?1d9`\i)o)im&2hX2tB.%Gd5U@?$AkpqZVSrc`94q$gubQGXF9pO%W3t +:n^ktB13=*+67>iaYfFI=Y'(0eToHj%.?5HY_J%b+od2m,IKOog:Tt)DQ'/tZRAU4 +jfC&>D^qu-aKsA1=R,IZom&GR_pLjU-.Gm!FeG)4>t$p9TMQ"M#;&3tJ)6L_Zhk+p +I&urnc]ihJ4<=O:Z?"XuDcH]$b)/tJYP@1T(&rNmid]6QIX%af2c#]("FT](anP6T +qUVdfn(ghiFc92k!q;D*\j^6 +S'f?7r5&:rCqM&Tef5`n"GapH6'6X^kh[V)p$s-aSBO12V4V\kk8F0,HAl`DJ/C`S +f-u@qItU:e<==Z`C&&E93!(X#kniEA2Z05W`Y8L1(dG@hgI*AQf?#,A^T4],6ibUu +aTD6LTVoMRF5:4_@6"Loo0:n`$B/k7OU*'X2R=-fiNki'Z^_3;rucgY:-iV]2DlYI +9XGGj)1hil!/LX=!W\sCG^s^//kg+g8p0StG$X9\0L&u0hEE%MS;VO67b\O6[b61i +aF=Do8tQ7R2T/:6,h`/%aaj;?YX_AnpqlKFiSC(Js"+3!nrEobV"f/GRpF`<4I;>ok'@gCNFjF+II)LR906kBRRS+s7?g5MZKns*'5e$OFj`6jbL' +/)+[Qc-qeenGd%'3U)kUr7Ch<>b))u8$>A6cnu.RZSZ&`qgWl!:o4C=rn$m'C-h2h +o,em4s726's6.CDm!mjL-Gsf)EJ0&D5LO3_j+-smRO5YT_5V"Xd'_9oIN8g0ntrUK +)saB'AIGrh_lf7Pr2Ulp<'E$6o\=QIbDQOB*[psOnUb]9QLiqE);i2inY;9O5J">r +LNf$^f86$t\:O2L6,n6ZbdWecCB<](.s5#eS_Qfm/>E^Go4I:q,HD2WjZ1=)b#D'& +8t"hI*(sk'XdX:5U-.b?^o"L=UGZ#P-8/Ph:]);B;gpXdX3Yp,b->kqg,J+qC3.UA +9M7Odej+K`<31dWk[E=%SF_7kn(BtOjf,n:pD//>-H6;bjSef2U-CeHo^R"!s*CpO +NI\0^r7>2%F7n^7Xo/*VlHcW7q!=:2cX*^PkP5jB3+)?j1ZcB"](B'bQ2]iqUAo:1 +dJ%Q4roPe$-j>Wq5RP02<-D]ain:`DO3Sie)^+Oc#huQ`_^F),"HW\f0eg?ZjA/.@!6CcDcnpM8;#e]n-j&CS +GoWX\l2lKh!?EFLWKUmLV3_;5"rRI$@*Tmm;ZN2oFCb+Ro>V8JcB'qKY5ICFC0.Y"=X7D.KTD]]Zr4:d55#;ni)VMXlFeuMX/W0S9gLM;!U#W +o]\:=oX,8o.rK#m)0h(bWWSimRtB2ba&bKs>'Y;"o];qI2\&_m]cm,u./<82pojQe +rm-4B5CGNcB+G`,E.@,5mje>9Xj$5RUV=!gnSTi>ocWip48"PeHEa$Q[>f0.:ccoP +#QHm/R"drM=I`+oT4fekX/4g`\]"MV(*hU""WOEPS+>-- +Xr>G[6Wn1Qdj?mZZEbom!iHn79rH +S1Xa4KlT!O\cVG0$i[p;p8Y03"%e7sZ0HtJ5;ZOqs2(!iLn3:SN1DH#K +<6ZS/.ms@;%hJcHF9Js_BEfe?ZD:N]Bh`"k=jSq#D^>u\RY"[!/<\8GgOW%BYUk:& +q/P(@9;u*7fe8>F8V$;DF)Y7@)\@Am:uuWQ.0015[r]qg3#V`8qSE(2_k9gj-m\dn +O.pVW<0,`3#J_h]c@<.#o7-?r'`[+kFRbF3r`j"V=0ZOdnh[e84h)eDq=f'^d/IBI +JW0;h+4-.,FgV0?$\80dcg5`VA4AgeofkOM$NU3Bctd*7)`@;Y#t_.f8b@DfNGV)g=q14%pppgpZkFcEVn9+sKh% +g*bo$a`p=Qpm9%i(I\gd;W/^hNTI]9qN;G]XO-@CtpkJPc=o`U&HJBs- +3REf_jV5c=!A_DqQuJim3^ri9*^5%F(GY=;cM;al4tc@iJ=b/T*0C(bTP<9?39P4M +LPJ,.4Nmu]$UN'ILq>am,:l9:2"M=$>Za*)9#%6i$:r;:LFd^@>g;NB+e5Y;ptJ7W +JMM-ETGr[ZJB4icG6)4W"R?$I%Y[HgbeBXMhN9uT>1:Y]kO/&] +-d+2GB,PHg%Q?F<36ncUf6Dp@anDYPh:a24r6b!8>(4E:"I9"_H,H.h_dQ'S/cLY) +''50K(S"^P]6#1YN?cY#hoP`XD7SQ94825mo7(d1mh_$!rqc-t.%#M[E9WGO/,]D6 +\_fDBI;LY1c4oqdLjIp4lMh*8WE\H55s`e$D/Nl!dg]l<5/WbS"9(6D;PnKWK!p1b +>\f_`%EuUWB"3R%ofj"k@jL?=(b8=69a,8\pI=4nHOXPhToAZ/WI_?30jTCdBPZJQ +[Y!6Jq2a5H(F%?JF#dSh_YjCM"[>4Spu16:Im6m(Y7%1.03.!`5c_'%^?Y!Q.j4sX +HaERTf;nmnV>AZmgqU,!\4$<(TGlBEVKE;2m]4Q4]j[[[=Kd +VJ`/cWoS/b/>7eLBMW?r-adg,PRd?B!R)EBiH*l.739N/^l5FE>2)M;WnZNjf%>3t +Pl5!=W;QT=ka#HIJ-au!gP\hA1#l1Ed+J]`$>Lk!0U#1#^qs&0!5ce1 +:BU/8i'sAt7)39ECGF[?r')"^_"*hEr/(+R)=ramZ&J_Qnflff6f_#qFp+uqUM\rh +eFM\`)Yo0d/_U,I=J`D)dI9XPK_k`+qHolgJ"p>d,(T^$i-u1@r,:/-_#I.Knip7Y +\Bb+?Q^IP4QFV3u]]=bbP=YG_ofiH&a\[2is)ADh-SJI3s-!^2Y>Q#/URL'`RW,,) +q+nRjkR8PTQihW+([^L@#U&\.^b]HQs1e^+It0[(Cfgs#B$$[;mJhm=PXN;'r%B5m +:Qt<5a<0^IYZ2&0pDHD+K95fA7k:H@!:W3U![`Y'Dl[+95<]m>p-/OoJo2\?ptn'L +#63FJd=Fh`"nKE$dtk39j8qV104nliU<1`97H_[[I4O`CU9eW*bEE(lAO(`^m7S>n\9!j%deaZ!C6Vt/4PfI +N3ar5r#`#84I[a3D;,#E3q,?I,/D$)L*SeNRr`HbbrK@4cA/>K1HAf*7"+OT4L>Lg +dCbO3.JWQ2P0[Jb6b>V"s)5!QqUV[In),hVc'=p7%]oZrQ0M-uXn_\1o"RCrqU)kE +5;:&*LroW\_9I.Yb>`rg8`nAm4&1bMV!iBNQhg<@ha>l:MW!`$o\ +q]E1@6Q\0NhDp0O6937g%.V@B\D[D752Pf&-@kgiY&5#3J8G7LEDWMW@$*+Go09oS +FF7j;%IJX+!bhUpFg3%jB`CHu&-)D9!FYo2:D35Ui=e?ZRR+/ch5Ng*oE7d;\RbI4 +A627qm:=r^<;rikchJRsrt#5$0"V%S%C]+rm1Sp'bq(1?Vrp9Iro]u5S!BN0 +r3%'Cf-o8WBE?UW#$mG7^p0=&f`*.C?a,2WriboX.K5ZP*(G9=]Ah5_5QW&#%)OCk +VZHU+q`fdr&c\%.GKGCcEI9&q#5g,BkB"5_9R4S*?HKQUKO3J$-TMIRQ@?3Ah_.A# +p_gT[s&h1/r6tY+E3fD&,%+2G"RM.@(8>7P!MT-W9bT^1gaBp21T1IJ?bV@A!56G^ +`BRZ1#aiTl/HG-e*!'5b6bPi1KGM?]bU:HIiIg'kpHLsQZVf?+W:+X[$oAiV)@?86 +3n#e+1>7EZ&+r/ul*;Jms!FqH.B)Dt%IB=)dt2)I54?M'67X*N<^/`SH!u3e)`O"/ +ogJ>ZmO\4NrM;`(Yk/`mQ2L?tP2DlarU83H_!dmHs6V&-5C]oua*6Wpn"uUnlt9f- +1S-O&:Q@2*DIqZQAaF2?VUeWDElq]Z)05h5^&[U'/Z#N`9R@N'[>NpK`sf&qM/6^Q +rtDf!,`@do1K09lA-4^*VP4M[@2?afa)oqp3,0>hIo@q1@PLP-b1]D^"OqNTj4GL7 +Uld\OTIs"q^O1S.O.13>Ec9fQ+3FQKl24?&(OpV52!ocJs*86'ibeVRS#\c/7c:\s +J%\bZa\1_;^KC%#o2U9';tYppeK6ucnlLmTpu$_/n)%:?N>mejI(9*s;WYm^daP1Q +8&FB^H-/ob=+Lp2Nh*O90eX\Kc7fY,j+J_DY(%T_]/2Z2rOm +q]Flpq]Ab+7K"&#cQ]QL&c[o/9?Ws7!(?hdS,^UkT?*W9npkYP`!,[gK4t22N,DK$ +b9l6i&-4SDcIn%,J-_c,T7/-Y+*uiUJGDe,58.c6q+j>&%!m,j'AfI,0fhW]$[NTu +/V!VC?h1Z,?DWEA[/VB0ejqd\It.<48!cShXoHe@QUW8t.&ZJB4>kq%j.G`?6Nqj"fR?jSoL@aF?ubO?p5fPEH1o/HGHBkNV8?L4W4@sFH$l"A&;1U`W'8jqW$ND%jicu +S69i\:Z^[_ARE!EptL!-s6sR@cQ>GkbC95.fcQigps[noi6T`8rSa`]h`Y$4b6JE) +I!>".hSad`lMjGqX$4N`*V7YZk$9"O_`V\-L5K'-;]on%P_k7pYK`gb!fTSC/V"QE +k=VUq%E#r@)-Y@BD*n5oXCk3b0W#bVn-K[kg\^!75Xd1`o+oe%b9RA#G +j\q@`l:<#g5!ARtO*WgOoAtDMGA^l=E)5?Z:?DH9l+DL0=-WFYCM;grq#Br0_>j<+ +XYl`c=o$_i(&rT^m$#Vhs*VA/7)5G@[ +/:TK]I)!;c<_MNt?.FOIEE-RphW5dQ;Jj0G+G')4N5"p\ur(eLZ3sDeO!j7L_ +0L([anUG]iJ0Q3(s,aO?p`JQ=*,>^K$32=QU5G8HJrY@>3X)gCT+)_9.qDKS7n0e&P*rd+ATj)Fa>6#l[^ur.Fp&HT=GTRh3d6YG_?6USB_/!dZqCaGN6Ks-M>k +ru_4^m:i6T:]#XOP7=MEX)[c%-/SL%#t'0%Zm5&2uu*FY&6Os.e@40cl^3DbN^SPE7?7`JY=A!CX7;FCe6'+@;FfGj2?@ +&r8dKSVXMF"UNeNK/REDhl?#t$Jbo;f,t:t40qt=ZYots('#P/pn,VL988'Kb[L.d +!89:kMD1$r/;bddM@4n_[mo<'o$MUR7ZPg1n`nN8`c2Z=b$)F^3ua>X2iB>gk5NS +-<^7k\<-LcTEb>/An#jf?uUan^Xh2`d\4&cnuaB%B-,k_ZAT6\q?5r0+n<EEk +Y5e"tkl6_D1G(k<3>`%](')Q#(i:FXkO9nRZpR^kr-quT9WHg>c3N);kQP=Trrb.g +cpqL>#Eer3Z7j9@h2:'IDEfjok7[fIrTN75p`JS#)&*(\r_K.$6i7Jca,"I0PA*6E +o=q0ta('TCJ'F?W2'PHfn)G#[&+4*LgtI9+5P;Y"lTkHbcH\K?s3C=["CQ!.q%*Eh +D[fFU(IlW0c\k_f_enCYD;rra<(?0_]Rnkd(U?s>`VSbODtM3G\p)="GGMW +UPS/*qc#sI'5N@;8<80SlbD'H+3]e6$%q6kTWF,7d2%k;NQ>O#da? +5AC<8%3U/f=G%Mg+TH4W*:Q2"!#>[_DAKb/(*F:l1h8TH02K[9Y+A03BHMmlRFjDT +Z$e+0,;l_8IS<1W-6k[Qn7Gl'bPoQQTCO6,"6:qKL]Hp/!oM!'AE5D7K&T#Tru#1e +]WZIohm+)8?49F[inYaa!"V^G$*ZK>`"B6?Io&;6I7F*\,3a$eoA1m6Dk%@#h\R(0 +HP-U?!9aJ,!iEl0aac'n?^k+jr/\q[ob[Sq2$kE-:^TJdY7Zm4^kse!ToXgQ;]l&] +i(*R*]R>Fh'Lr)bU*X=E/RocqP&42V3])5N4"7o)2$1&25qqN9m?o[HOPP +m+ZJ'^@pFJp!:mL^V%>ZXW,EsITu@:mk=P%WFF64+.k1_bF.q94]h/<(WuaII-Eke +0DkWfAUcmL$NC(EK6]\oKDNkJlFfXON>V8]/bdAL]R.9^Nq8Z[l`#+TjXm-A\WiLR +)(8+tTX7B,!P3[6!gHNi$HcAnoWFtkX/Y;DC17i$=\DK?;pu3*9HuFJ80o1AEHY*Q +Sf+QO5uXG&L9loGf259Y_qi*6nekB.e<(c1]+rgo%dIM^q23pH.q>]8.=5R9a&TIEF$KqOT]<^F[=/u7>U$?RZ +Y4qsCa32=!02Ios4&PWPW8Kj@aXuYtrS!NXMRB^ONS]5GQ5uIegZm="Mg,aK\RK?, +IRbWk"S.%'!cSKss2fbX'DlCW6/G5&\'1*pXs2Pg/ +ZlG0m!oSR&HMBloTTkW^JHVdgBJYd#?i\=+gFknjr-N_?m6prsr[5ZLpg:^mYO(;L +qK^0^_a5o(,]H`&X2P8P#[^1fM>U(/.;7URB_d/S?VJXmXIo9[41(2=r(i3"idWBU +M>ufUJGB/U*C8BIL!flIkJ`Et94&HrhZ%Z!r1WZdq2]Af*s_=)s*JQk[oMLp#Q]1# ++2MkmElAdMdl84[T+&i>_JRcL2M_?ZjYu6"c<8R97,)?!*<=01.bL +M+>kAJJ=b#0A'lh`p@qo9bd=E'+qVN9>BtSNqrnY#M[VXa"KsRpTtM-6h*t757dkV +6p>]jT,(H(=r!)`qd66jo%,@[FQ8@2#,>4'], +;i^!SB?RYT3ob+LosDqg62n1/5V''#e?V.]"nOC$V0aH3@/`;t.BjL!5m6Nao!/"9 +`;.@O7/2*Qn-S!fO%mRmqdTL%E<1#$+l&\$"#pH0M_T;fblNh;-11Ve4Pp\6/CWU!g."<:ZSAMgkRh +i@c9)q!cDB5IIf/cj]Um!@*VnBcDfZj +gKO4Beh`I>W'DNfaIt-nb06ON'VtsMaT'uLoG!+g!1mrbIn!ll2,Q_,$NU0uD.9.D +BOW=AbSZ6UWFt-T&C\t&4=nXuV?0IPE?TBhc9/Of\d/-4`CS99$e2YH0L*'1pGXI^ +s8R)Ii6rL"_>dU$ir;Y%&>TJSG87"Ol<>c&Irbegs.>X>s$&PKouEuRJ,O'N#:Bnn +IolXH2]$r=8EoHPb?gPeIO\\!OMC:&8(hl\eWOZIC2A<3E201PP@7[TWi$>,M'2g> +/t*Mk@I(?\d%UM2$BRObM1@63!I.*<4u!#(ck#7\(Bq&@C&_hi&&j#+m=4SDMeAt+ +n.$X5&;3PXkm4e23C"a_Khhg5#NB:\T-\t_T9*ma,fRN<43*HQ5:qBEJ)pZ+4bW_D +h?O#GPnN)+XF8h&;W<0^NW=Z2.j\:S'!kbN6K\b%e>"5LY^jfEA/Ff$aF@TEA![/b +j<+8kOBDjlan@q^o0F`jCgdp1[^([t2#sCUe"E93A/FGGMLU`&@LJOX+@,!`f"T7u +.?VBo/0MII6MM'Om$R..S]Jg^\^s!-ne;5jN,!73n1bR^BId?)Y0:^;N.J$2!" +Ckgq6?kI^E4L^nLT<:YUYspbU?PXmgOT4ia*NcASpA?21*O0:)gAf!4n:1;YLWo7[ +p-36lbQ\@o!SNQ5=Gd&8)>S%_>h+'4M?"r(UZOfE(j.sAOcNZGpm5J*3Gei5AJ]Z_ +@_\g$jHlQ;J$]G[O3E[;62Ws2g,T7"`po%MOY&A_*g$D5uci#A)inV/Z$t:c$1B?aKu#C&_ZGHU9i&.C`XM"/sq7 +EjPZShf+GP62nt*':=Gtmt@&r^g%^`fbT`Epr'*7n=WjhTg=;q-4"B"guOOBCDDI$ +km25I:rQ11JaMJ!<7RoFhk9F,nqRp0arf]*mTLMs-cK5Dd&D"u]`:n"Sa[RU9hl`, +s$u-+9)L$Cb:$m5Krr5%>o9ng->e`80)![XmHrB*\b#,)Tjl/qDZMXlP_mN/Ac*'PE!noHK'eg`mOEs0'bt&qLi6ZH2Gqg&9X>Vp +s4J`6\d>JB,["eZ&F'E;RF+JRfKb-/W#1RU--k?$SpSp]k5>YP)*@LhPkjbFZN'ss +Gj`?>s(@`*8@JSD3tPR$I^SI)Mq.&5i'M5FMG5i=EWh1TU:@#P&H+K=!H-5Et[N.-@_8s.q&J1L9C3'Zfj[Pka,i +0#kdNZ#WAe(;u];^'?KJ>oE^7hrZC@'Vr^_P5I.s7 +JDqXnr_MDiP8X@`aZoQM]SE9;b#<6AOTQ]Hc;4#/C$H?lN.Nn]7MpD'l(WT4n<_iuA'[Y8ZH$'KeV_c%:[ccuRB#'EQPa5RIM<$_VL$ZT7)^MZu9' +iGS-L<;n\QhRTUL_YeNU/4@:lG*)`?'GEqJ0H9:H21MhD;IDQ43TY1Ko#_6e*cuf[ +Ne#>:HM/,kPbWBT.@Y=cbdq!@gp23dI)4PAnctJ4ZDCsPSl"b0E6Gsdli*iA4T&R' +h?,gAl?_@%1SZR*[cQA(lLZQc7_O"[<(<=Nl+L/@ag*Mm?8,d&(gI'qQssf(%j?K, +INa@i,Qq!OK\cbZZu;RXB!00Lpj[(ml`R:._2[X6H_5`["s_dc'6!CJ[eff(rS/[' +M<4l0X[*6fOUGRfZfaXTIh%QiH\;p`(.Hpu'5WR4JcD3kr$aiP/7?E@Mg;Jt!^RSe +%KbY1in+=jY7HP%!HJ+6'EF2H!3kc%9-Jldhu^L@,''N9ga[n'J\S#l09I-fjWh.' +JICO_%uWS3FOA-6m"e^M+q35q,e$FuF +=NuZ'5t:pN"9]Jo=\+,'\Ng01/#8mC<4J$I'N8LHes(uu?-YFXa>hjGh.*0#o.b_M +:&T);lcmt"j;tYQgSpc/e[mfr +[F3I8<`cb"

    iME]n.LY@@6+EI02Bs3Y5"Z6b/6(H"p'RfuDf[[7po.(Pl9\Vj(;6&#+Aj,+oVp(Jk22A[oi(c#t6! +7h,J)rWE(Lr##E\9-]dbT+lc38];bire1^jh1?!WJO:&XG[D5Y(g@rrDj\ +1#;F-r&:T$+QJR%!$B(%mM2aKpdat40PQIgYK`_r+?-3YmN5co,B/`/"-/j>t6XjV/*Ej60jI.+uE94sdg:=[FZ) +1W[tC3S4CpL^QHl!;uRVC?&0ErTLU),6*L^jok_=5gpr0'9U<);#Oq/DUOU@5CrT: +%G2cs+SZWLPMgrG;+gOnPMN2\!'Xe_LAuq'Pe\@tD(D0^QYgbo8nZskS%YY&I'TmR +;Lh!Zp0d.YTPVn,RIc@!!eRr_&',:-KK)BS6:c1M"c.s+[5CF +g5#Gfm`)r58I#9F/)Oju,mXHCV@@);!.P:LaZKSJ +;Y)X;U95X^59pa4+X-b^!@n3GHOWlf!>!=?lY&^!$\-[KRB`+FF;5hdXhQa!nuhLO +pWY78Ap`,#qf?)S0'i0DW7Cp]oBDlPbl$IOS:;dY0DtZehL?SP5ktAq\]hhET(;$' +XB5-pcd,Kb"K>#uf'1Je6aG4d)d1!^b/0tD$HNo%Q(hldi8C4nplE@f<2l*CK7S>7 +EuEP_P[cH0?-Wk]UdthH\e/KS;h`_C&Vr.F.]+Pt`_37%%V(sJRM@Q$bGf!2N)RF> +]gh9Y5O/K/s0je8s6na]qXff4J)-=^t0GGD]T.!S,_TH +ge[C1pYhZ'J%I<(c'qX]FWKd\ql$F$1*;oZ^F,ImV`3Y7D;fC2_Wh'4:rcI\djf5% +l@Grmb)1=)'cVH5"j2^3J3R'@=Z(m<"f'%7";g,5J/eTZ3mbr-](=D-.s1E?JG.)n +5L"\PC\[AdPL044ne;"t7%d7B>6&gI0aP/k.E+SpaGUbJfVdVXr!<;h65&urRo&2o +\a1F,r+SK[5AC!d"TO;X]cEXB/fsMS"TO/Tg&Wo.T*Q;8K_LVLR%<;k,2EWQpY"LG?RO!??$lBI"#G+GVnLDnQ ++)%hX(E`eMUSD7))(%Sj'N!kOQCGt26/^qB&Ko,g.PVIlYq:3@$X(#U9e>-fdZtG+ +5_JgU,';qt0(ZZ9I-snIV[NmXH,`K`ipaE\U_^;TA/#mj6N(kNm3[D!5o2`h8F55" +,*Q3"i,U5 +>Yfs$#lA7(61*,GD=B:qD41_h9Esg\!qh``r^.$CacDI1C%roU97c]dkSj3uq$Hs4 +r%A0ODt0*0oulM"AYADk3G:p]$j7?M/Kimc'Q+Jm?0B>/UKN +7sI+iI,Y2Mi'44C"U-[_1a[+WMl&k^>c8GE[=^O0QrZ#pC#V14*4pc]Yts\#ri8"l +(6Ggihd&(o$!BM"C%;E%>C-'88hOMDaJRr!p)Rn1;^6I",qcmHUDN`bZ@KJ:A1\>H +j:Rk4K(]caa6gNB-YKodkZD6kmEq18-C-cuC!j7KF+/9TpK';tHfJZ14*P:bG]sXj +*hqZo4Gr'hi.(0-pWe-cY)Ki-96pIQitm'@+&>`un5:&[e;7f"4qVRB/^p%\R4-3C +0nKAYs2G#P6jfU3AtY,;o-mlb_mP0g0;h.;cmccO"pXRH3ZeeCh,Hqi(/^QZ)7+-o +Q:&o;6&[CCesqQ$Vi83\OZLqnmR'/%A\KiirGl,b*tKOoIr^iDq#B_kk\U"J+"mKZ +\\)j0]\j.p6-h+!n=TID8$fsX+S4'?ko\]Kn]pN9J%-fd2oh:=*h]+X:-CAM\2]Xt +`h.7W/RqPB2`6[5BNo/L>GA9&Y*?-TPcsJ=YNmTDO1N7E76QM@AHa%E*t8c.MZl\^ +38>t`p`%ojBLZ53)AZuQ(>tea3;h1JLT?h=VZ?5t;;8"%mf3%R8j#_6X'=TI'G9ng +"^"q3TQhZB3#$O[Mhhb&efZ&pp5&sgPEc"Hra`m,\LCkY#QAKP,4LX0Io+H%;L^4+ +YDl0[rrYE9s5LeH^`V*Y832iO!Q'+RGlScjd,-)jB6Ak!^PpUE7tcM$8tR&F^dt#ep/f(]PeIo[U8-CLYB; +cNO9u/NgBHG9ANB!6ZJp[g_bU*,=jN>%D'R/E/(;\Oo@TE`Cd`B)t8H"[#*?-%UQu +M70/UCbi1olENn9-CIRU1_"HL.Q"BKcrUY(pD"PA$]P6WkX84kYmdnbi[nsLn7'dc +Cr8BI=mWLfJc?9n'7gO9^^Jq<]]$-F@?]EI&tA\Hp^cZn3\?t3T9):BQRtCoRhkL# +6_=bYYmL@*HSGB0f\N*P4^CLp!XAO[a`RT*,8d]d`.%gcf6n]/csILqeW!!:+o'+= +8+6b#)F;^6=S$XEEB;_Pr1EQ19dZ\:W8Yd'"sRV#,`I%KkHUJcFL&jkBlp3<+Wm42]tXV)q#l>p1q9B+UF`fF\lG`!=7e+N-k& +p+U\\KXWaos4\4bh]1S#p]],14<<.tNB2>uEO/"LYk!0RNlut2Dpt$a!W6fqLe#Jf +B1IHj!<3'X)@,!>`[LnWFEe_8\L&UEJ<-]nI=,hF!'LR3!.R=ac`kW'.)l-Rd\'#M +[OEEoMPrlCd7=Dd&t*hK[^^U0]Z&J-2ZWmHSm;-Mm,DZ%k5O_o_I)31i6C"shS(N' +UPiebrkBQ#_sr3tU]:rO6TX_Y`U%fpB)M<)o=%4,^Xu+@2b@:u;\t1e>8gXkq2D<' +9N(dI;@EXPD4!rG0j)6kTqi;4n=QKVRS;j_2Ue$\=m%T2M\s1)N5,cM]UF_[B9$k? +:2QfB!XSh8PTXi):iflV/"ZjrcDUBXW8i$Mfl$)+@Ho:#l\,Y`s$%JsIJZ"qdke(T +hOP/Ss6_XG"AJD/2>fS'LZ"4;rrlaoRJYOrln9I'q#%k5O3XZ:F"6iY2lF<34mSqs +e.6b$O)C[EN&"-3dVl@$*RLXDo]Gu((R](1L(qgWb#Ys;Y%]Inf2f=$e0X#),;3#^ +(Z?p<"EU?*g_(h#f=18ZD1#hTceKtRF9rQWH\=Y5!e5Ed(e=8No)G_BJ->f7qd8bt +R7euOFGktZ!<::qBN>4;5eJ)d+TrUs7N_hZ]0sab6QSe!58j$E)L`=gLZ"e2J4oZ5 +#!N%e#?uHRJ&6[@rib9F0)ioe%o:X%IuOUCrY+jT+SaR]8T=/P*pOLMZjZ_6&c]II +G[LQ*s.fu)(=6;b5kDb)@Qc+WreUL&nPK8_p^\Q#5bndD9E[uW+#Ws`n5%u7:kJ]V +,t\$tkQZp"qiQF/BX3q]K?r9H39Ut[bgMSI$5O1qb!t1MGW4b6a*imPqfLI4F@lFS +WQup]=/o%2,^BA5I7TI;F=M#q[oQ:"NGL\HW]#^s49YeAF2g-iA2AA8Z`C +\,\qo7!Q1&hXH6XO/Mr4+kem=7J^F9^`PtKIguF]YlL=a8C)0OX13e1>d>KF\!tjq +=jku+gkdSTYd^MAGD%;\KW-tn?W]ugQ_W(!XU$;+IffXE@r8QI*?`<#=PIr)FZS#7 +*Gh2QVV``Lnm]',c"bAn$XYaW%isq]k"cQZ^adTGk6'F4K(&6O[+O'k+i;Zhr +q)3^+L;.1fYQD0fU]BclanLJMHQo;5,1>:UdE[ON9120P!+A(-5']H_n4aKYp5/L%tnF8Ip:ZY7-FOKk,BB>Qa2o(a=H[^KWA_)U&'@EkF#u/-PHd<( +\CndWlf/rm!WQ52r\+6/Nd3iP\DUFIbl@XD3IeXs)rglnn'?^_T;2JWim7R+T3TJ6 +qrtK&gqrjR+m-s0W1T#IO*R[^6];ZfX?A[\C),jRUoY8AVO/\[AXL:8ri7dR+U%kn +.=`n50pKu5Atl-;jrB+c539n]I#Fu^E[nAPMQL;^DP0N-Ydok+V22CaKUQBqD<%oe +gUYg?.9\c[VMfac7m5s-q8jKHMlk2^p9WViJar7ZeedLJs)TXT]-$*_qnrQos0k3Z +(4bA97g?fgbJ-(;H6hPB9<"Q=Sbh3r[(kCbo(ifp0-=U"BEs.hh.+[`K'C;qft2Cu +2YH4BgQkq[((XCr!Vgl'Y&BTe\!6$aQ>V6IDY\UTU7bjjfN3o65]Nkrb5V6I +fEDEO\-iT#l0/nG]=kQOrlMK0j(4iD[^Ht%r5ie_Ef*Qrs1nYc2BKZ+n@u_rVs4km +PX:i=+MrU^K#B&7C\Y(TOr+G"L47!h.1Z?rK3^fDLQM#?Vj.ej#E]]CRK(m7!2TC> +-1\7"PFjt@Kn!q?Lupp)':.R+!NH!%%K@'H/<].F_?/@Hs$=d)G7P(p"qaH.X:haf +LdMLu!*B4>?g0j/!&*hk@MmFu#Pd=[5dAKXFr5lB^"B1qRtg^UrFFc68Rgs?Ri]=/ +gs61u]OR%?(ucC_>dK`7du+4mG)ORQ7<(Ktoc5qo3:aP7Jc#ZMW6RUYK]&JY^`Pb9 +90gV,+Rlo`l[u!D$rCQVq +:YR0O%d@S\$qi?k(XG.c6!N+ZF5@8^s,LJ%-@[=T=1E!`UiLBAYr>RpJ#%I!XE8A[ +!\OK,'a9F[fEDDr!_C+&'R'RK%2._L!rd*I#e'M^RsaFofn>iU2[.6G2[@Q3O,4)j +!9$/I!.[9_kQ1_.K;A-@!\tDfpM^R6T!=VXPM\8@6oCT&!=aMaq[*0f[`YhL4Q;$] +^FJBG#":Y>&bL!;3pMu)U>@9Vh>m;];#Y=:e`S(jOok"qPdIl-F+.W(dqm&CLT*bFFlP@M+#?+s^:'#JZF!:OTCgcVi +;:@$D?P[3aO:i*c!Zkr-1_dY*5VYNG'aQYuV)#DlPTbZfa^R6l1#*-ch]aPSKF0B1 +U+;WFl_qqueFZ4F[X^qR!,*=,$/3[9m$CO-<`55>tElaTD[lW"oij)pWEfJ5.roRK6+#1T1XIjGj;IBVn]Gdp$p;. +HcK9%_?g.QL)3PX093F$)=*W'Wg<>#=*2O7[E8h\A48)Hn6Fj"?e85j^0d!e:f/oK +]a=kA8SRVH(=8`$^q@DP7 +5ZJ`d7tMfa57.6e?ifsROgROZbQmpl_A9ol$](jC:GN"DCu\rtDBEo@f@X2gJ:B;h ++%38X&cU7q5N+g5rb;Alpg990s26@j8>?ll_LB-GFJ\t(pl@!lLA5+.%ET8,Q/YC+KPi +JV!_1OFmsi`P?u8Rd\Z2JH$\(&GR?OLiEbE!=OE/+Q>fMO.Z#):lc0@rEcNad/bl, +l%Bh3OGD`iSMjj +d7p2\ngAkbC/k!Pr$Po;0H\"D"@!V5q%??#f9$*],2g4^J5>dO])s7,G"5&"H[B16 +H[]&:#-`WlSp[bm_>[o'RVNlYJ2)>>MGTs,MAlI5-:_9Pa4k5]s0mrq&cPQrgBmnX +!f^-mL)F>=L49rRJ'=T'Z,pKV=j/(LRO.JN:SVkC>JR1+3+`oa!#pIt +]O5qWJmCVI!Z(k(M@!tqPLP+0s#'_0pjWt1&V_lfbjblF+IB]Sre#%@,1>RAidZ@P +KAqAj?a2m'0#0F=#qQ/[X%I%E'\QJ1a.Se6r!E;7qGNqW*j@$mrXfA:IahR:o@CqC +X,?a(@fEZ1J*DVn!l(s&6,`e-,-1,M>B\orOsd_L5JJT?Q0WI?HZSmf:1_.`/t:Yo +qVkE@^E,f>nl#2EpL\l#54cHdM#VB59)[j0lM5Gb8JcNaL2jdNooP!`ZAsgdURWb] +"YaBncnd'j7HkXs!Jpc.M(0(A!-JW+SAm6q;YD(e/BG-t=[6pT'j8A/XeA4h"jCdj +&dt'W@Vim7>0PdOKM?!\'(\,>6)otDmD(s"9#O`5ViA%PopIu +OUqmC=[3W"+YVcoe]It%8/<@5\`=.fO10Fui1CE=:5o$8r,:PF8FR/fa+qF"hKE44 +#CiC>f\_*Wr"%6KM/ZHZrdru3`8k/_If>8a&(:,BY3*J)ptsgI=2G#2#le+D$c)mX +JH`iq[CRJ%q,^p-nEHl)5f1aCeQH6IplB>gR!$_GRpd=Q>0F41eH!5`RciIf?D!KkL>-NXcF.#pCeq:_P; +,#/j#itX[5s/cJSOpS7C[htrDV.O5:aWSJ/_ShN;5l;M_Y3\4J:Cd- +5tfDtp=AnE!QqPSID#faJRYa9B/5>e/+L/#_h#C$UjalK3&T9uH(ne)[K+8GdC.U^"!r-\W9BJ@b +D-kmR[r`*D62[nhrbqHXJH+@+&G]C[G"6^c? +&0HT#*tm!!hs;$#qF$gc,%L^,iM][GQFQb8!j@aL)J4I0s%BNR5DHoYOafnq7#lTX +RQj4>!<8_"!oP/A!V!-[r&(8KqGDb&Lp%:oX:A9jL)$tD'_oF'JG=UR=E&>+jk6o8 +(T3T^[OL7IS_64lSGham1]DVSm@?N-f^D3)8Q9e +h9>ZSd>VH"@(nTd4l^*:Ce-YFQ$L#)@s;A8fHSJ-5ri'.'S%qm)$#.,^'-tYJcYlV +n<;W5e##rr1s,k8OA39,.,P(U\;1JFTcu"dfP5/K/N'qeYpl;">JSlp8:^rgU5BMi +XdIheViJp!PE")JrR>D"b-N8Vs/)dIG>j")Nr%ZZp%b.PF9MMmJ;KfC*djd$8<##%jDs1-$)cUWM +7-$!qK)ZSVe#Qf2"d";-kTs@Cr:_B6@pS%XYlN]HXob;'+?Bm$k.daXB2'#t59W7C +Im`aFD)"HX+S[MseJ,")U6GF('lSW;\s5M0`_Z(G04]_eTS).Z.0'_uQbOZg8+iK\ ++\hrO/-):M9/-B='E"1?rc_"Kre(&.ikkU@\%o/S!0RE!Q_:dUHk6YR1%<;R)"L!( +%]/,[peM[G-hEr1^V>dri1Dt1^2j"<;"7plM7Kh.cs&?^;kWG*5U@Op%ZBWA0"oVA +`;E-'D_f`N9%nheLF;N].J6nU?B`,!&L%J1#)HA%h0h"EXLCJ/Y? +F&@""IS7l([^M/9nB:5P;"_.<=b,;DD,Z,#FX)IWnSlrVXEDu_qs8":k-7Z*;Z?t0 +R#SJuKUSh;NK`5q#uBBEX(K4O1MU"0XR`Se9#c5+Md9f06I:NpKX(T>JNn&7D6icA +]7ddYr4QG9?6AolNs@`0kJMAMVdd9MI*O1ul;YuQX0r1HG(f.(#4$Gflh6'q"mh:L +@9";+k&o^^^jmb4\877!g+ed-e,O=%KhW.+f9smm9JTY6&PM +$+C$@="F?rQU#VI:_r!MN]9!!.hC\uEl]\[D3tD\lUi_GCj;C+`?o_a@BeD2?O5$_ +8hg/<&GZG%C$*$M;SYJB)G3lChc^W#I%R! +P4><YQeo\;kKD'UY>BVH0Ce?&Zo]m6Y$T&.n6s6`lhA'r$+aW%;*8'=GbC +,UO`(^-N@E)EtkXISb^3FV"jQJb4YJO20'Mr3pl9(*J2.S@M@%C*d!_(W[+_'3a,2 +]2BYaidm%_>Vt*J!@!#2I(XN+aWQ\;#VVQ1C+:)(rjVDtmJMMFIW#T1eCV_-Ds%_K +LI9ml_-Wq254Oot&&&<7$eKl)_;CoKK#loSIK7oJ1eQ.l[pTb@U^QjFJd]qZTY=Gm +:D:4EqLX(gR]HAcM:UZNQ?J%M#5bl9rf3WR%2>oLRQbl&;+l-8]7`P?s; +q1Ro+DWkiifSu_Dh:UJJ&,[g>!3-MXfkB)/@akUu +4'fj%7/Ht3*[n"[1Z$+Xr7@qP&C6R/&,_3aJK,kd!<,0/3QP\^pR(%bVn'rfXK_!5 +:"iM'^IBLrr9rq3[C:,Urf%B_NK"kq)qUc7TKU&f.j+Ns?3BGEgJL9357qW/55oI- +\'3di56Uuds)E8]W3^fo?8VcbXgo,tq:,cR_gHd>DaYh/B_`72!%.jG&Hd7*baGk[ +GIi&br^-_cOWa++LjOQ;7s#k%hrcZIjXK$R0&,eom-n'D#ZU7$f'ElImg3"]%9Dj( +=7-GHJH#kKPm9dYp5LO3>`g#I&)&*W4YS)7O/bRq]eL*2.1.Brc]=^u@LF=V`tfed +`Nt;^qiaoCG:=i5uD<:EZki,9lNgi/fKhVO[Y5H4J-AKLu'd"J$Q^Nh<] +1)4Vo#hMk*CF:=V+Q39Y^O06N\i7Df)VfRYFOfXG'piNQ*oF]ia86XbI!FN:DTr+O +aiqMl8cS!Z#$AZ*m`P\,Isu>0kBCQ+r(m+fk@850+(2aeNI$&:H9+;S@V+CPOEsE< +`m&'D#E,PJX/J`cW7X5TT>n)k;G:&iL4uM?W>Wo'.Wlk8iI7?i9V79j52,rN-"!P-#,>/nK!k4BSCloN_+6IpTLj-Uh^cD@6,a5+u& +UT)#`SGMA3`]H+W+5K\?EBa'Q&*/-0K=l,o>a!<\Ziq*:r."5:RV;Ql]<_HYHe)sk +Ac1GZZtFTY4YiRW7l]P-/TXsXj(ZWc<9JDGQa`3^C6Pbh_Ye>=Xm7CkR*>TH8rgK; +UTNS@lNK-Fc#!ac+DZ`4pjb#U289MmQ%Y&Ku5Io65/-,H`<#4_`Ku:T;ckbl`_>Hg(]h&SC +8HFA>ZuCdbRed3(5O^lYr+e9H+c_!_?*3D\0(*U1l>/%cD-YiP]Y:.P6YA2QGOl#M +/+C:b(PR_h7mPP3nSh7r!+Z*qFY;q/:\=.l3u=\kEsVTh*Nl3-]YK"&rf+gY7*T(L +2bS,qBrT-Mk'&5*Y0):$_XFGqgF>H@9/TfOU]?]h\Nqap%SD9O^"n8]bl?fP`;f]1 +FnPECR[Vg9[VkfQiW[m1OG4PhL0T6jVIr]"40@jt*qmt]qo/p)js]DY +&b^(:>gTT_g`&a/a.ea76/b#"BX^J57^1(6f^5jDm0cn]%p&$+<=o/uO!4KE*2uVp +i]sRbnNS?`3!pEDff()Vm>VErO75HI@_CM/_/=9YN":LHs)AcE7/4M7P/u?!/n8go=nD2.K]C7#1uu3hObe`HhF56cdO-e +_*8D/0lOt>YAlZqaPS`n6Dl;sObUtKh.3ksnNTu1'i8`>96^.k#6GjJO0#pkP&Tgnn?VCDb>NF[^:8I8GhI7en5e?5/.?iankYtH(U\OrpWV8]=0NP +3M,d'&aIt-"o-1fosC?:fogeu0^D&0k/kc1@fgCp&[ca=27A;JA>:*[L(lHPFI9nk +;CNMp!U*kZ&0ig3J7052ONK8T1TX_N`rUHb?jS'bN"K>j`E"*+(gTF%XCP#-@Vf@H +m:9-cACR^je:lbD8$(2N6`cVeR'5tUhE$Ba5\LL0f%5s8r;)8hh`c\$^nX3B_#Gbu +I=6AAir>k1O"S^&r;Y%3ba/g:5I2s'iMj1GK'>eMR5=eEcGo3:`PV&KAZaCG9p1dD +dT)\4lT<9dnD@MX#lII.rcPW)s+U_Ac%"Y*c$sd#9DB%5%r'1C_HI*kUm6MJ\l')b +%r!?bT=kN%j<^Hg$4\5u>l_!`0-r&t9.:$1$=N06U]2_pqp=jtM>WRrO!B-t1Alq, +(]R(skGku::&%M=rrE'(H3?X9T(jiZC]XIpi;[Qkb@p[OH\7*A.*&s0eeIa9%g]"93^O+T=#ZjMr$$pjZj7ZO0$F%^CQFmS3Nf +f/<&Q*s,Sq?:uLBpq_O!JpKr#:3jWX*cb>94k63e]-cU?%Q^UPp):EBg0q"7'YpXt +"obS!6kKBBU\YM>s2@]l"nd!W^]GV^BPq,]r.eXE;(m&o'g?gniW!Gq%JW.$Mmn*I +D2u$M7b]hTg1Gr=_#JCM_l0=oC97f1.ROCDaKL^mnDdF:S-*#?5MJ!0nIBTP.^!\$ +=[6*0*RV,>$q4C%7Cuh/7skJ!L%8$Z$I4Ulh`5"fDCVg<1Yg_43OarfDMW7m"9f$Y +ir-U>"+L&p^ETggq10+9J&Qu$b/;Vq_pPJ/Z0EPY"d?GHVK=\T*#<-JZ"fr]b!^%gZ%N<(l +AmehtM_Y5F,p3pAFViu2?35VFs7',c>kpsG56V#H_8_=.b@J,*.ag3iBpji:9h"@q +A+^M_3_0B#"-oARATImgmU3liaLYk+C[N+1Iq^7uo%!ujm`]t@@-27Fdf4P9rU!Nt +n)'Q+n_H3thLhuOIW?UpdrY+E3g9BrD5lupaS>'Uf'LB?HW'l=N&!KLbF^5YWi,,.Wq$NO#k2>R72:>n(;;'4D)6]7?2u2?eV*R.,*G +"'d(+iL\Bb/nA?+TYg3i/45:IV+-eLPH1Xm!c"?h3aP1Em7Op"U7V!T02>?Im@aH+ +KR3(ip$!KUJ)6[jou$C9H#1m;:G'Rj+I@QObgLF%>5He0MnXLJ+n5NlHZJ#U/,.B! +AcMJDba8%$4[#/.ct)Fp5hZfK#4UO#PbYBdUb#m#-MWJoVQFZOQ[E:eGs9#N +=^D6Is$.;(i30 +WZr_cVap\qpu?/)!.Vk8M#7SWPPIG9j<[q/O)Fq"q#>R"LVEINRfC2*L:YUIjOjppmXYWrqI0E_&p.=_NX,sgOP1]O>Rm* +>jWXPXUI>\kpU?Qpc%8 +YZ`s;0CDo!#le+58t$Y+JcBk8CN0YoUU%L&1F+drjXtnV++=ED"6'9%1sZ+Q,B3ba +2apmNrmQFa$#fF&]5bbq(U;Ho%$c9Y\Q:"s%>aAaHts8IhSXLb9:W\3=!,I=_"4T$ +O9L+`Rc]()G?_i=Z'[ma?T27iM@jP"sYf0-?Ph*[YjJF8uO^Lp4=L"YIl +;^Ee\3B)]'f8%:7KCbhqDl3efFKCr3DNacbe'EIl`C/DYnZ2eAaAP&f$)3d:Bl-*R%0&Wq[>lp,$P7OsA +nA#;B\NnpO'!ja).Jo>T<(tSeP@slVc6%R$4T!OOG6Ir>D?2H(+5[,e+Sn);$Kk!+Fss58AO58!:h$2Fo*Z.N-FT<'=;pG!n_^Jc=A\pVp^^eYInrX;7mUAN`g4W(/bL&d)`G,_6N"U'X/2JeX[q,O +$l72_#QG,0"3f/UK`qF4''/5>C-N/WOtWa=ib-*i@Bi6SZ'ck4.n'AoJ>XmVXT@dL +"rkQKW.luABYk3(%1uB7aOL8+i3HBdN=(j^MF7ka/ei^BVjlN%K*o=@)hCT\m9bj0:/%IOW]f@9!*gYXo +.Q\7o3uF'3"mcUIp-l#I7fiTs!Up`&UA9:`U_G?[f71_c'CA&\,A9kP8GGt&!Rhgg +/L1??$OBA@!iCB4Y^eGEDoBHugH"IYJ5Nr976Xi;Z3DBf+6l&S[hq[K-=T_p*l7&H#>D)CM6g'B/ee@+@q9 +[O'#L(+S#Ufm"^Hkj6sM];HE-]IE$!40i5ITCJE:dbd$U$5W.*1KbgTQ1OOVgeZ5A +s6T[]O71^Q$6IUJss4'dGIk1e7"HWcq1Jt!iR*%+Z1!Sr6CF75j +`O'3OU6$UdEo^'BH)OZ_P=n?1;UZS`]b9JPopL$t;\,=r+,1X42bj5\Q[h94NUcgM +C&bh)l`5e]^O9qWG>Bj2]-(1&pXJc;+(+`d&((=McgP*-rjhh]s.>iTH"]>%%Y*bd +k4Gd.3T7,'9@NIJW\n)QeNeQp)%hB(rh.D0IjLQes12AJr#6Q-!.T'R&7fJi@0t#& +:1opGXV?-Zd.Z>S?s-T;*mlA[=ue"2.ut,i!;2usU\nklL(2Re&M*p&!=:/0/;Xj0 +^]NF3dnAX+B`^:J^g0<*dME$%i9V3l&JlRH!3$,>S(Mt^0,k@D:.5(21q'QSW"3MA +nW(XZ2Q4BI:%Otkrs(Tp,kCtRrZh(]B)uZu`.+EWP0Qj_;A//BSGXR]5N+i+s!X?> +2#icD+'3@g=4tduJIrGHLaN6u=)rk&rY#>.#9%l-&[hfAZ13r0M1GM3&4G.>hpu"F +lS!:W8fS04PK5tKIB8N!Jn1'SM9/E;+sTUn2#m4eY#^8=mJ$;gGIHZn2ku#Tk.:4n +!H!hl>qJM$Xf*JC\"a'o,(Ht4:!"]N)$/mR5p7/l0SH@ri*3e7d].P\!Bs\j$'@H" +s*gP?-.&^g7]d6MsBgEo6=?j%_Reu6&,b;Fo`rB9/3DIH$s\#$XFTmgK=_to[bJrYj8a@ZlY17P,WD6G,\*t:P)MJr\6 +!6h>u'5j9L[8-L$`][%kY(img5&<[(^KVq,%S3]o+i*!^?=I_&2RO9fgPW'Q-+;*. +9/jnbjLG)E"9&$?K55+T=7*>r]$\.Vp<]Q*Z2"o(0)39LJu@c%T&$sP\UDYNEa\!) +%PE+r^kuduXa5BXg'>*i^UP`mY)/mZA),g.KXX>q2b'T56_t#TO9/DLMq!7e7k-g? +s!,o`/-RI'd0IL`2&*DZ-JK9#de/+Js-8KBEW.=:+=u1Y'L<(VL-g.\UFo<[_$18Q +g:6>tfY[0I\[2NB;&6r:UW)m-1g86S!I5,`O=(Y<"9/H=3Uf8u\VgFVpN6rF-c1]8 +5^pZO#\4/Lj.Vp`@/4n0KJm!<2I>QNFE:t!A-!JoZ@B))o>`r@?TsSJRj4n^5SfIW +pX;.kh3%6jqAfe$_u4T[o%W; +8A0@+j-.q@?_#I;p\d,04H^Z@"oS"5i;Y`3/H>G7ir;-2pQ,1fIWRdJX]%5ugm%EQ +U%INVV`cf'E\;i4l]I +WUc,GDeV]12n'',r]U9BB@b<_mMUbT1q1hm(RJ.t6a23hVY +5T?k97OaKAi%Gs&84SZ$-:g_A.&<-U\U_.biopWe&V41M60lXQ'rP0+m:( +M14IonNR$unkC6R?]h+ufK%#rC:J.%+8,Q$;8FX*r.Mpf6@O"a!)!M3&?m>d+Er8@ +s4&U-WinhD>m-:2;q"29Bi?U@s#ZYWHeQi.6bD"G-CkG#mkdUAAsq6t%st;_r)&:lc/e*lc,;XCf9>1Ed6Lp[ +f+N6cqOD[\9/WLF7\*e^/fX!hpF=/<>loB\>R8+>f%.^`c=0=9N;?H1^W01jK_,Je +Uiq6`iD@#c";Yq^Mu_E..h>'!%RnPO`6.gEj[AuTo"C0+1c6I.:[h_9L&[P9!+Y6usC&]qXpADRDeR8;(=]W`pZPliJ=*DQG0NG3l&On%#EN5)"-I/e$6 +7sAKnGW,/We%$RVT(W*Ml0k33,F@:KT(8dhXP`JVrcSP,eQKo8A'>a:N$"KdI\9NIYqYC7$O]PC](A +;qb2Ca.a!A$mQBrc(kDdeC4]RDGe\2:"8uiZq%7_c\7`>Dk_]qL\fcubR\Scq>ANs +IpL:rk+VV.?,e[n.3hh3>(WZ+dfB:p$V +^Gj"/?MoiY&&`8C%Q&6Xs1QZJpuX4Kptst_(3S#$,5jaJr(edC$-8)[YQ-4'\arH^ +peQous-s%:/L%D!&:sk2o,iJnfLINmXZXrfklCS27NsJD5JVcAM*KWDLoZY6UhLOA +)u)enfF.0rn3Z:DZrs&Gpq33a*\).=(;#;nghO91R"l#4<_:4VMqUh_M(YilmGqCA +/[1&+'J+cV!"32^3*Ok2i%e?r=/u6rr@Nk5AAEr1>YA$ +/q@EP8B4i:2l6b^"VYLpNu1W +SpL1:O9.[*!Q%P[E<6*eH)7]i`8)!5f-'kS'eXWsV,%6`f +\8d.p3?MMAgfE?Hhr*m,4kdYkMg"=cl_5'LKkH$@pP`]H17e9[QBWK[c$Ahuma&(@ +prX&(Is9)ahqbs3f>gt*ErClf*F8?nIRjTB5J2.+IBsm=9bj6;kM80G^*-['32AMF +Wnn\r3>AFsJK5^==3s:3_kHK8.,_Wd,Qsh#:ZtF?&*1Lj#U"dg2T=]6 +_;+)c!1a;JGTaI!SH[XT`F&^k[A__pObTrKjOslI5FMO8X#sckKO%RiG;VF\n^b\W +%3pGDO`3JQ+()!b`EbaR_#MeIbuhJn/6!]!_0;r:GfmoV;:o"aG3&+20&GbtHn:A' +1-5HPGh0bg),JST!Y9d#0^[E.XP[..Mca>6=G7>?r!J%fi2bkA$0A!op+$pNjMHs +),IeG596MJ[1uR>`]H,VI!g;;5L-,*qu1E%!\D,eTOm"E\a6rKQ_4u<"*pMF>k%JL +ErUB"p2@*,IqaDP;d3/g+3V1=RrufB4#<8elWS%@?E()5eQoTQ$NI.7+o#,=((XH2 +OPh4gr?m2HRfE"jIQIIPoq7eeW;`P8(/P4r+#d2[)(U7;UXnujRps6l1hj"XZn!J> +jeGlO>b4(@4?i/Z,TSheM!uss;WJ2i=_(VIdRnJ2W!J&]TNC@FiKHY0>enq,1UhFU +s,[Y"qAPaA7[X2#e5H(]WOo5E5U/"s2$=@KAIZkG.;RL4=4NO:6W-s1M,4q]HOL +"8R^UKHPEDE2Z>npeM$"'%%adaA9Pa8+6tm4_cMWa/eA.c!gbSQpVY,$VEnTBT5(c +])N`4^QdkF,k[8Q",DZ^*6`nU='$!rImHG3IX>!jG8mHHN7UGW[>"6t4h@8/33c?p +8LHF\,Trj_Ct?PV/)UjE=83:E*Y=tte`(-7H`UdE=66BqIO`bIjPN#G4ZD'+D5rY1 +l\';%Ztj9L)_>AZe.rM##!Ir0=+e[sB/*HQ[1u&]AUV7TmOirmCIq/l!O+=Ga/Z(YfqtHsqi(u$Ep&r!VVO>& +o&qF_;qkD-m*BqP=O&R\0DNeoH%3JLd2u+9IH0Cof5=ablLEt#5ITo+LR(02Dq3s? +CG'JWE;-6h4/R6M7O?YV8s'8[.PU\%&oiT7"[jgGrsse+5l3pFj=])MpchXO8Q\6J +s'%2TBD_fNs)XA!O/bH'PQbIoQTto91i`%h+0!R`MW_O8ili!;!0Pl27e8k2W8QjD1Bs$qYuO[)Xn?QJc>#2SAAV^PqcqlL$kCeM7k([ptVh%6*+ +3gt-aGilo5dK#$JmnS@P?g99TVnI7)rJfk%O9iLI>NU:AB7>XLJZOq$aS>OjP`O+q +4ugf5k>pkd2c>,c7_Q@)qX&IkeS4;]6,nte.@4$`pU;mFP\8jgB'rho:$,@Q<6@s5 +-3ci`N0f&-nUEY):gG@o'^`VQc](hKI +IiSH0jA5PHid\EM;?1]%<=869AY3ucs0tWTAh5%/+o%,Q.gYsK*-(t=Tp`A\Gi=?u +bV#Bh@3p(9OX1eW[PBOj\-qMsk_p@d#t]b:P/)Uhf8#*:]$[2OA-"ec#M7JF-7OJB +Z"1'Ki/`$s!;mK^n\o$1H>c/B+,QVZ9#(MtaY-q[+T1E]crBL_r252IAGH0`rtCMZ +C&SgqLVK5G4OO<-5PZD9O-U(NYH\'gpo!pPcm0TI&e-^VM)6e.@KG10+UHq]B`@b$_pI"e1$6bcqDH2q!YK+ +q/=b+ri9&cJNchQGB$i6ED((eF%^LSCGEUhI]EOd5<`0gQ-iQEBpo(i:dCO0CSV`J +bbCHWL1OC+ITK0.jrk&PW"OXi"%%FN!5i/O;N!)0M1&Led#21!WQ0s4#S9-oKUOfY +Zig5Wq)`0mG&C3o'=<2!Ir;QAo9^.A?n0kj&T.g]#l.YOXsUcWcD7WbegOK"Z$(%\:tO^+ +rcu,2Z`^d8T+8*n)e2(?RIR%Xba4?cs71EsDboN0EBoj0o:-9-R44YiQ5lK.brYl`L6rM#'rJ"[P=e!=C`; +[uPbQa1QP)^)B*;W%.#5n9Z[5Y&^_Pb[V9CVu=%k[_W^',UK?gtPRo6u0Oo@5(R +5M;HEGp`,f,jRpDmS82e8H0<8gJWIu@YDdj!oP?X#$t4j<*`2U&!9(;q5ri!4+E\& +3:[m7Q%-*6L#tTb35L))%fR2rs'q(HEG+BdULFRGg0"`NEg0?ZOlAGU*2O=oZ7-"k +>%ra^g;4L[m?CE#9>MFk:ioY#Ld;r'JK]#0,m4UKB1b74GdIW>$D;5c*i_^r4,U"Perps(FiT*,+?RS/22F?(9'eCVYA&b:Dns-(J(--._D&bo]nr(Tcakf[P_ImX/7k!)^]'+qFO)8T\1/-5kGeL_CBIgH\eJ%.qKD++Lr5c0(H"0F)>d3KWH +'S:p?:-c_jlSnnI05)+jC_?gL0t2Pc;a-$A0C\)%Vf]j/"-HSj&Jt;YfP*?Ztlr-JQ6I:A9Vhl8">.*16Jj,h29-iqCn2):Z0e?1J#>R6n-=IH*>L;I/IDCWr]pJ= +Rtj8@Ad:WS#R6CpN;%3.m?ruWNJ9O1!Wnr?LUG]LW&!Qd+U.)u(\RENKs;fr=)139 +I@8?=RQnKGC7hgZm&lCo)IhRC&SqJXJX1:o/!,8!eO8=;[++qHea?k"?!V3"Ij^dL +J:Cp36!*0:mY]P#MH)fse]NbLTYB^A"1;ppJuK3BK(^f3)%u +"B-pIU>Z(IrQJ?'V7q+GqO=Cgs)Q`h^Y^pK]lT)sn(a3&f/rR&FF)@':ZhWPVT$<[ +I`_2:Q9W&qocr3MgbW/Ra#*\S3:D*VHSeP'3YEu*)H%ObFp,D\W#aA:^cTDX!BV)K^glL& +m"0ad&p0Fon@ok!5M6SQr-+X6nD@l^#WSlH"hU[Z=lWfO]* +,G*&>7hPBYqn3??]A2d)F4m?a1XBqeZKg$H%EftCA-$bs7Do6M$TLA:IK+E_,I?W1 +c)!S447/mCBtlj#p;ZXH^YG"Np8PECcXqQH0&s8GC&b\)mBcD`O9N:@46)m$;$ug4 +!U;VuWE1FFT*8?C>$.*rWCtM#B1f.uL")+teG)/KQU9@BGYKmK&W]RGN$Mj21Tp5> +P_M#>TeMB%.>EPmFJ^`Sl0*0(oQ%t.6L&k7j)d*Kh>uoINI!3N]t=ZL!68!o4i.'g +Ng,$"6kc9/GpN.=bDQr3+(+Tp@nXPQCO\R_Yje3ioA@2@qc?9Dcj6;h=nds=h!/7N +a0]MhE/CK&Z(ZUiY)oD<=]JBgpogYd`?0p6;9s^nrj_*Oq2_\,M9np;/:3^3E7RK5EABAN.'SoPCT +J>QVK;bl!kc3PaJV:Yr^;(])(clf:k#sE]M`?\Q9NMHQV-+[]Q!iYCeMZ5s_2=W]K +W,j$S;?Hm1>DigfPoUiU_?,8crQ<(?0@KcNQ+R^elH7FQr(lb\8`IMCqtNt=rsA`& +gV28@qO4r$nbZMn.L=s:`#rGL&WgAS.OENNac`L>d^2WgpE]60A,[,L#jJjl^b@^7 +#lY/.-bKf5PZL'50;%aU6"Ab,&A@6Cq!Y[bJcAKhJ((WP9]I*jnb`1e4\C0)2nus0 +h5"*G9/H`Km@\!7:oYV#):YM&6((:r250MGB%<+Il6[LXI_KNHD](qf7]fjV9nu26!(-`/Uj=^1BRo#jDR'L\^LrINs#/]I +3UP\*)UP'->0tPh6eeM=F&N0F-Mf&ZHH%/"O92rZoi>"NEO\?1.9!2kI=6Kns58u( +2_6g*AAE](XjU^_!Xf8pCB7/FJ%uX]BuJa=o/&sBNF?I0aO(R'ebP.]*ds;@;f3Y< +%X/3a+k*MGkcS+H?G=!F^8drE6Wo,9Yd-'_BAemm3H)2gKZ3l/S!,:Ok[gs+m/2 +b^W.aYQ`rrO\Scp/IQnt_eqJcs#'^%p?f7:r/OB[!RBDL)]c=O[MAF8#RTu9'`Dpke0kZ59;.mj)Dj6"=%[Y9(!$]b&F +T*XSLNTJqYT(V#8`Y2Q4J$]khaFA7foCk1Ss68+![n`j7Iht]X5!P\0ff<#Dq<1fC +4""-[^4H-u+mQNuWE3]1(F+n%m*oM`lG9on43FNAf[SccbaAX9?n19T]qB?Q^rt`F +$2E!D!cTaln7P(&TLB[;d!%B&(hSZaA5[l,IhjoUOP79tg/igm)VeXph;(^eC-a'n +IPsXnC+&\P_lU>.;]hQBHuYaR!4`[7J,@kR_Z0WuZK-r@(OpONhRdtar6pLJY?dLf +infWl[Ue5ZSo]6di;r8=R@tr+c6\cGi'._NWtGB^2'jA^%9loWU#Af=+5fr9Ns9Xa +(OHt0PND-sj8,tAIjsN0q1Ma&m]7Q/T0]KM[E5P;pMc[16=+LN. +MHR,&Hi]1V,R%+)q1M1#ArsuRP)':*6hL5L1!.,O&glD.ogk&FS_>5@=i/h@Q +^je*hR9ZaKS20)KGpk-IJ_eMNJ5LOrkGk4 +Fk=#G6<:nJDsr,"4U8&`Ln4$"ZMg6l`O/jCT7d.h$fG#sngb9andGNZD\JmuaK4qH +Rju*Ub)k%JL3#IdOR(0dT!%WI=rm^V@!'4*)9[Q>?X[8 +"sDj"KD@sK9JIWW?S9P''ET%8aBpI=?Br8b[mQ>1.Er+U"b(/"jqn6S3Z^r;c.$\f +eEmeJkicD358DDG&Yn@teRScWA/Bi5)X +O7?jQH.0[$OoFKomRFh!VF+Ff;&1TlClp-4cd1Zm;aLCL;2/&i;M[+dnl>^6WXDN> +<1SX=m80J@bAm-?Jb^md;Nn-5-n@'/fK)>(.u$=dlCU8kN9.p6;G +XH4?$BMDOsC's#lE,oFlq9d(WE%*k6>O#q)feD"FZpR-)cq8b%(q[&']t'@!rZTES +%m#2fb2r6DDI8pepsiOADk?V#qOH0(B7(g05't6Bj+kuXk^t,Zs)T=Xoj&_S;0X8^ +r,fm;US0%?BZL"Ka*NorB*)@4#_K`jeh0V@2@K:EBA&da&[5fh>-tTNr4or_r1>]Z +:7jGBYEqK%^&]rtTT9r:>lZ!s_Z.:i$t.Wc\lATN0IBs/ef_'*<3%1[hSHLAA:so! +=p3f6PEH+K2oo,-AX62Y$Pp`=2$"LdNEoA@A0O-7>Z&"&/V>fK^T*:5#2M:/nZe,/!cU[gpcB#J& +"M?_WqW8R&GB\AIJ'd<'8)6?mmf(m2oMP+E-U#1)md\6u*ZlKWnBjGB#?I4h,(1U.jOrc*g%PY0TED@0uP\sRH8A`m/C'5+B`T(%>'1%0Bq%2l)I#Q9> +?OBUtp^b/96K=^bUIBiRGAP>>Rgd4N,I-W-f`"S2_(tA^]4SqL)o8cQ[upZu +O7_*[nlI1fs*8Fu&*H'(]&7r4;W++h!I$.$&cVh.1&k#jo)$TBn)*O&psnMdcVD'B +)t86jk.] +D(_22Te(_!J96;U(tRaX.WTh]RGFTZ4$NhY!-:5Z!(.+r=o_PcC&u7Q8SA6+QIK*$ +8GJgUs6og!4L)UE#p;.#2rO[*e0P3A">F$u;cX,hbm]C-*I!(.O2$/3Ih9>(rdW6. +Lu4TiM[1FtHH(9^L-Ma<^Ln:3R/DL1gSu*DrrMURaPYs+_-5NQSA25ha0hQ"5Yqn% +OG+mO,1?Sf+67@*1',!B`NDeud:\(/U"Tb=Y@he`iX5HE;kDg4CIKg?Q9gA:!9cbP +9`/Sc9S%`5iF[)>f`5H0M',G@bXU_2jXN[O.NGiM>:7YBMcS(u5ks4^amTr,+Tsep +?C$/cJeZRNda28Cg_?kEh&o"mMui.B8k#UGS_^-gn*;A>YuONk29ZT?02Dk^:5QF) +9%K)@R?9*t9*"/Wk/RW:!Fpb\"mE8AG3UUMRSpPf==haKs7(Jc\j2W8Q6?2X,qSQ# +?Bl$5d%Moh4.3KFGTg6!'raW#!]<30^Je!=OKu9gHjpVIT-nJfn_kR9H#c8\>YT*8 +k&m#]f"kdKhK:/7`AcVIF)d95]hg.$Yirrhci +(Dj=5m)D4O6N6b5e%ZuIrq_J2?_;QAp7g=9Qb:&Ekl'mIhVXprrT4FDY9"5LoT]C5 +*t7qndGXa/KtafRpndB:cYX!#Z4M>"1?%kM_BVDS-O,b%n"h&h:-$[d%ZS7V>;!8_ +bN>>>k+"jJ@c!7ObaHmFrkOaIboqQbpd+ePHMWGX2QUNk6[Hb&JMChKY*8mcs3^4A +\eJTs(g6p/5-;FA'DrC65O&=f;\@a +ao\[hhk2CE.<;n"i-OE8*iBO<:+SkbVON%CDF(*^A'`gj%oCe>mHSN?'=35h+Hd3,9c\uFL(/Cm/NTk*WP]\eh +h?*2iWGSJF"@W#,rTV3qe>t5pX=HdPri`LtCqq9g^*]hQQ3oJ"d2V?gN=AQp"Af4X +d>8/(L&WrX!dj! +?'j0t_&bG"O*B4$%Q5u#E^B]ZB-]QNV;(0EgZK;5(6n=D2CF7oJ4P+!55: +mVD'leXMO5#&Tc3_'](5&7gU8R1a52<0j5@6N*M[g-O7(e8bF`0%n%k.);(#l +d?G6japR->qoIE-*>Qk0mEW=Cc6mInMkeot9A$kgZ&ap,5cbV/a@J):4[Z[lII)YgL7_>cV8p8@f*hE;SLk(3#'pI;m$,Q-h9iha2= +-`7Ru+%n^R9KPG"HDELk:iFW#>M_7G3\P0Q3H*<.2fHg/1ZuuMZXu;JAk\$&c;jI' +jUVdcBuAZc@4cn(9*5C*Zp#M4?Vg,Fd^osq/fau()AiJS>;ZhBNbLGJ'E/74RroSY +q00p/%J]'?r3j+7[3Pk$8?s@TFilh[WfTK@bgn1`2=`l3]Dt`YClKo3V+OU"QuWX' +U83\^1oW;Lr%Af*K)^OV=91?YapD-hJdkt7$dY_Pi%Z_83%K4-WnhomF5r+[NMlZD +09%qsT5o4&IcK2;?/FE)MUhh=])M*T7aV.4pN_.,d.?]2h#G%AjUYS;^Rgi?p^W0Y89<`6W]`_KC3qb?c[[8;bUI\s/4\%4Ql=b;b6ns0*^J9&,>mo!?[s'qt"7"pNF(Zr]f0+ +%fY@^$()?\oX"fACAe=tBWF6+QTkN\s-(F@1atWg+c:cds(c9H&7b_K!b2.=B[%Z[ +rAX>p$#auAX%/HZrZB]+&H3b+(6*DMipp`7q'S32!G$XP+ZLR2ZEjj&rX3#.Mqr1@ +'E\a!7DPFq#[.=dJ-j:,>s8i$4lX[<+heN7`["^fD'PTb!@62P@3r%h/.o8i`N0!A +.ZUP^M6A@&W%CXbr*Ng!:qmbHi.%9X\lp$2IqSu3E^1iY,%/+aM2QoQn\;"_oDeC] +cQ`DuO%V[U_>bVWKD+'#R@K][Gd^\O'#hVYQ::QjML=BOr2''H-j%s[?W*NZGR+&J +o05@DK]Q@ps)'h1YesD-g7q4]0P%:$s(fIn[2"_U$65#W$\ka.r?el_5SS>f*=H0& +X(H'G3UfO=,m2]\8;,YU\KHC#q,NT*Xe\38@iJq^aSCu#PI/[f"j+*_'dZ#cP&<]C +4F:))4n+'P/MHCS'm31?m@mjT0PC&0EC$$rP[Thg=qt1j"[AL+Wks\ocD!U/j`k/2 +lq$I%"Fo15)#V-i7_3A9[X1c`B3qii6*YK+[W>3KI7CY--!M3"9b$WIHX$BY)K"Ut +UV9^(.[3PH,gn5Cq27%>dWE#N6Rb`^ecrJ`FXd+CW%@:3+?Gd(^aLkc9+#fNW;MQQ +]L#b*Y,&Ui>EdTBcE&OjoQ/PI-+egVT4mTc-\)OV_o%C`6-' +c03&h>!e8C"?e[$GA5:i\LIP[(-UR-iq]&a*l$Omp4qJ,J)')XiBC&qO*f[>hrX_& +(@k\YkX(T%mFZOjp9Y\%J%*Hk.1]rt#O0m,-u@ZDlZL'\QuaXlW<5L6]u:GeG[b8< +K\[ZT\m\&E9^RK^.;6O6MLQX9L"Nu-T$]'-D>g&KVl^E9'I;bJ()b]VF:UiUAn,/itFf35p;B4'>(1F9PQWM06M^&DlBOPmC]&s7A +J'bGbP4I,Q@iq^K^6)u?@S']HQM>i7?dC/-C!Q^le59^'?$d(Vjb$FW0h$^5'Zgo]sntcZ7oItd% +^O;cQfl!qZ1mVo67<3[F<0f,$XU5:n8!9m8U$74rObZC>b!Ml9!74A9rrQJb7[U(h +j=>NO8H(3o]_\/\MR5E&XYMi/,W!"c/Zb$OP",m2TEXF)#6KUdTL)f^^nq?'(-i4+ +V$&ZOqJt"CK)^2?8PAHHqc'@IG3mp"pA/CfGPeY+mO*MT0]hW,c9GRhGl%hs#h\_L +/(Xl)Y5>Cbk6hl@lPZ<:YP3P'b^&*`ZCQMUnQ",IAo3nab;9#p%cWY;:D"=\(L;oMC,n5G,KO:##5!+"A/cU:<,n4T`+%?O.[(%P=X +,"825-knL'Y"0c70:'PYqHk)akA:j=LPsnR`@W7=jq't&YdQ.%,REk)KT)lsQAr`X +Xo9]ZIEi7I?QAaP1$/,W]_h"fY&A/sI:oVPHeUIVIeuUmG<7_^G+8*XMqI>/fP?,l +9/c-^/Tq8Bl!:"t/!"E,0KND$qIVe9!m#+jU?Z:Ms,*V\12:lE@T,iB1-Z]V +,WYd0>Eo?h+p+_/rSQ>E+T0Q$]0#r,Q[gjl@=+lU/IN^!mtcL@Jmc:l*>&;N?QT?'uq;F(HP=]@`rY]WF?Gu?[Z+rD9W%/.,Og$1,c.YFllU!/]NEf"QU$0Qj= +eWMbkN2;a"kiK@bp(:JJ/cbHDo!7?sA:@s.2Qn:1[47rSQsQ@'?d+DQ:CYW[K]^]M +ZD`>ba[+TOIQ<7@ga%@lT,LOViZOnYmU*m(DU6t6c?JNR,]Dh,O/bca]1C8-A&$ke +qY^HC?QYs=qba80cFNjtamJdZr8Q3bV`QhgH94;a%j-#(/'5]08%=H=P\%V)d/Z +k+(=2E-ZNH'mOA*_cr%`2eK9q8'r[]RqCaBWtObsK@AK\Zikb-"5B#ibm%X0)mCq' +ZX`&K-VCS3dsqs?3.NguJeL`t%47&=;>U5?G&O\>K;.*cdSS:l"2/U)FJ.+V31'M? +SK98&3aGIocq8RekjlBTFAkt\c0"ri!N1.]dH\Uk\!$`r)uJeAdO3(+T:^*!q@T'4 +cYWOL8W^^=X\7M$Qi)sF0DKpCcKDN(^&N)hpVXm4n*T[rqVU93m4+/'JRaMos%u],aFDuK#Y`qZU%elgch/(2A,`T_(#+Jc$+:@G!:[::Y\\*)l#L_, +k+7aTXqHP@8Rif0^lU$m2$/GFXROQ;)sn@FO!5kZiJ2F +"SEL#rWJ5e=S"b"D&"02.Xtq,6O\I##iN0R+omu0Rf@qGqVMkcp\:A2n390C&4o.B +'MnM]+oaEe7.F(J*t[B0(Y?"3lf9^;bTi3-jUqKY2&6c&#G_f_^[s`&!I^t)io]c; +FaCfo7JMAbP!<\3,lBm`k!5EB9'Y]ce_f42Wf5Ko8Pf>?Hq%N +$WSqr!1b@NmhP$F#E7a9.F<;#rL3XJF^C\$[gRdQS)<+#1i+\7kc($hDV7.4L-JN"KD,$m +W<&+\lH1=B-X%=N.#A!r^]7`Y:Y0\RC0R]GHir:[NfS-#j0I$ +ct/2P1Vio%g6?SOlBjVD7*-9H;Fa\X_s03h:m3T3:@;1?>_i1`kQjR%&'CU0n(->Z6h_NVkKo?ac! +3%5u"*/6jTQV-Kt),2d-M4Ca"DCO7)pR0$)r7@N5-3K_2"i +j])]^lQ5V8L7R4kUASG^r24Dm^[5Lf^>aT%_g?Cu7([fBMhlr:Sm#^j4Q"$:6a`)XpldWf(q4BhXd +rtEHIhmJ9FLFW&A!>tqbOa*e8=PZD +!(/r=s!.=U:"\)3pqVBjX,uiNWr*)o[LAFPk6^;R4%:]DN`I8lb'+7oC`b3`#h[R, +"t9OX^l5f(,%*fk,+q_tJbB-O;Cu-c7iMQ4!]2VG%'_s!hbNFY\IOrcd].bM_[RF>8 +f9GrA/,F@Q_hOTl@gsU]8TVeVBpBQGrNr898maZRXWH(pN%%CijMaJaG/#jU(m*hg +.LUtfX7U2u\i"b]qSGNsaf)=VZF>:3\95ujE;PRsMLUETJHMB!_#@oihBgFL3Aodq +fhm=#bY\@%`DGOOfg@MLNh>b$/('L2<(LZW:0`4=P_Z+IP +=\H&r.7r#WjYnIlR]4/)r,=#i)LsGj5W;!U`?O#^s%=+$f)LF'"oK2<2d4iT-"r&L ++;,6,U?104"YW?iMs;!mlB-g\.7+e-&-7?;beYZD?B92T5LJrkjIk,D6''3Am`u@nnsPYT*PnN@sS/)1,CS^8+65Y#0:G<"a!^o#`UeLHMg\#:s5h)FXi%+"a0f7Xg>=bg +\S&P^fKE9GCU@QkE#D'Z[K1%Eb*T_4(G+q+cMVZFM?%;jH6d4*/HGc1!;KpSaH5!# +"P(W,C+?]]"qf3[R>a'%4*LU&hW+XSFo-Y.?NJMWS*4_6$r1RF!RUtA5nGDLaC.@; +TMJ]p15Q9Upj`83+'9ojPkG#'VEbWfYC.Y8>^uNECGg`H/-[(YaiF?5XNO"sIm)!6 +s7PqQrbj>1pojZ5:W2Tni+]!9r_Zl\eO39Q2cB.HF0Hm@K%-c +j/f)6@'6hU[\EjI?q+KbV6-7aQU:n7.S<1kllcOZ=BRVbArgU5LUDga!jqdeHZK:9 +fMk&k?')k,"UcsU(s5:0uJs0_->n3>G&12/ej+&E62$=Tr$J.^=/$jX$Oa=+"qi +Jl6""aE.f7NL3OP_umH@LcH#4P!l6P'(ocX-WQ[KTo?$pH`b"tdX,0%u=\ +k+X#/?I,(jB2.VmUU^=OFI,%@(dF]i +)HB`5eB-N]Wa1m+63N("H2-Ol]0LFfGm[d(a?G6T$E#Fr.+52>Q* +BTLL(DU0^-4>-?>?QF6:Aq4o=!.1jb]AA7tY`PIFTKK-M]HG1rMm6pjf]?_fR<%lG +FDQ:\2BRT("C[3sBLR/m4LU0*m@dtc)!&@=o);U)G7(c9)4Q])VP;/L_-!5NVJMkZ!Em:JniO +eE+Ur+!;((k-H+>5r0/(-o`k'M+OSd%mM:"[K\MWmd4j)%Q[. +jSoVfZbZUZ-bs$Y*:SG"aB=jfq`fS[N)+ohm&>-u?g'/W/,t`hS\n"kK_G.8<:?-<3`45@V\d(P)VVC/tD2TKErDmZ(M8N#XBsA+%:^oQ(_rebN`f9 +\n#4iSR4m&YG&@)iC?%1U,*l0#a#(M#kJ`#YH+GLf-`L6cl*kf9hc$M59YM_HQ'@F +Q&#Eb#LIZggan6]BEWR^RJ\u(In=G,4\NR#q%MO^s#V!J$*+/]s4;brjcD^cJ*u#t +/&91h@"*>mla)%Cr"K'r2\cB^"NVM7!;IWFJnjnns2(ek?htk%rrF,YrX>QmT6V[4 +Hp[gBh/)"Us4[kersr9@qlBsL(3Zmh\Aqij1DO,QkfZ[7!U=.-&cq-Mb.gkX"S2$4 +PkXGm62j^Y:NSKg=ci@?XNg@FQ:5".Y[D>$Ch[$/29g>%bcXCMUo"2k?p\-[W\,/h +(QE0f7s/WuLk#M3d=AK4`*>%E>rsjh6L=UQs6j5imp"9]=O\BsdN)NB*nm>5r4d`f +@HR^_s72D5nGh];)rZ:1YsbKUotNhZ725cP>`]$.GcCHUV!,/mip$d.`ZL$*k*hNh +$>*Q]Z]\$5c:uMXMbQnUVo8m<@fqm'r.3p2^SGP8`$k)-81u**'-\U:':qdXhXjA5 +oGG'S"IFGGP;:ahYEHPX96j?n?0FcWs.?F7s.>mYI!s#rVi,FCf=Y1&\?F][=RZ8o +YHEe6Qgb8G.=eRW7I.f,]tQSsobB67mp@1+q;"@*2g5&1Yj?jJ3on\NkefOi4$"6P +qXdoBCKcoZV.P^#o1$,jj1:I(D=Xb\DTNHrXWq^RBCmfTe/iDd/o16*F6FB$-PVYD_W?!_u%_[pg9_j3rJH&!3%4b +O:)_tr&?Di"sO$Io1O>u,$q!KQn7DJWd(cQIZ.8DeLuq"Q\A3c,.;9>G3abjFG/F^ +$9i&33,\G8`9)KFa5b9Jf*aa+/%sRk^"A<^m"I(_McT#1(?\clfIK#L72>X0P]F=Z +q/dMM=9c2u);@s+%O@831U)K\fR<#:O\G*I$QpP9`XZWiHdf4dFOF']drZj\,R>>! +_WISs]rC'kV(Uq8aO_-Y.q\-"W;J$J5;-OHfLbr#!;WrGPV8&l"+NT5h`U2rmGf>h +%6lt[nY^H,pa=:H'868?n,'#q^HU\3Q2lqls7)2kDg&_+[,?=SS8tLaor-PRS&/s8 +h5@m9;c4>T.#I#i,6^MUI!.WESL@lEq1VD#&&D;ms/AU8,%+^TO6"&:s7pU4a1h]! +lW%TjCNJ))T0Hp:5fJ3`)tuQ9jM-N3?bCNkFPB@>Nj4JtGg4!AZ=a+NikTXf464WrO.3Sq/Q")J]>^jVC#Jf1E@5.;!k`i$+Lk#:-)g4G_'3' ++Fh9.+FeuiMZ7&[+"(>jQR8e&r-U./nimt?^$sFb^Ga%3r0S]jKPUS-je#6Q?dY+Q +T(W*'hhusOs#f*:3<6eq;BU;dbcf,R`P7Eje<)n)c3="Wra1q?:XMRSnQl1TF!:$; +%XZ":m^Jq.G^D%+RRMQ.3k<5(.lD$53n;1iaq@&?<`KG\q<:DM]eq%Sg*nhF^BMgl +c3NrZmV3!bAW*[MLk%Kq4[d)mXp-'M2$,h3HsBl6VCM[:E;p#mqVkpnl):G!ZDVSX +TQOt-LPGi8;#G,&051amhm[F3DlXHo!;sTUH.DqaV]GbTl0kYI8mJl-CmZS4'/oY37C]0^\`Lajf?g$ufp(>#neNkR +5rAuHs!$n259F/'s,RsSXutaPo"<`"$Q^fOHEOon.fW_Vq?&,I?3s_Z3G:8Rn>5)* +chlLC)XS%5p.m':lB1`:L$<;YVOAA'r/d#"])F<`o#kbM8JnSCu:ZmJ)H6isAV7$EMEr,b:);#DhDX7\[[!KdNmH'2Eu.$Gu+"A(B;m*d1#u5J,nO-X>U*j#M5Vk>18(<\F3@4^cS=T]_dD +J%4G8bnH[U4QZtMPWq:in_:b@,-Y]mSB_X`3,*ToX7;_CH]BqmWN3n3A\k+8?t"&. +J/ulbN8kWuEXJ!)75R:b*F8YK`fO6V4o^9so+N6AIR`luLOWnIhg_d"Ihq#C*Yf(\ +5A\OGs,WQj[O?[FYi(P0-Ja)HPP;S,mC>l^Q]UFY, +SV-%N!c5:]buoq$3t'($3?su/+p,?okuL)b-T=KG``0?"A5*J(1IKMWk;=NoeUmf5 +K`@Om%X_rk95:Isc6jaYhpTATD.U/bVfFb24C/5aT?6,iEOkS^'_&l!QUrHSTKNrj +D#mhUr+U\S0pNUQX<7EAn,eF31IQBM!;IXfJ;=2)ce##`lI(Io5WenqSF;j@F)"bS +O.OlNi.$hQQll5ZDp34B?eJ]B!6hW[Acm8b'G6uM:gJX^k.gf.O75@PraZ\]580qi6>oi#b6b-?X+onhqMZI;? +[oZd"9R\<_;#*&r+nN/pftmTVXkc*I9,AEB^MIam1,gk.2F7PjiQD8N`YtAI8Rpk8 +TkqqL3iXh7+9`&NO'/N\H5brOg[N0h.JSD=]F#h_(&scrLUJ?*+'dCc?W-?!dLlIc +RZbsWMl)7ii;^Wb#4TC(ZUD"=;or/LBnf0]lparf]j@W"e5#Yg*]N8*D4'CH;tLNsKM7ejoTHNMT'*^ECI!`C-a_OVV5 +RMk3dQ:MX!OLiTUM_3R9"a8a_lMl(;OoBBWEnC?C4H]Y^JH(&5s*+q0J,?VRjT!g5 +m_"EB.=d#cJ!CuP&-:ZQjTWW^^E2qAgOn@t5NML<*T#E1rLXo7J"S`DY8R813i,@d +=(FuQZc:Os8Tj7=q= +L<'s$7'C'`9buP.Nn&t"[,OJ=,>(c?irPu);'D[V7!,\a%e<-AGIGtFXi[*qA55Ki +HYii"WK%5;C?""6inE_Y3R(.n2CcWJr&c-PR=q`)i@&Amo2TND!(!8Yd/]Fe)'T(Y +%n43s(G"IaLtDPX(*n_38]8P=_54.k$(A;9,:CXVMsM3KO,-/r&X\`:cRHbu<+0"] +!IM1;a#Z@Z=^@Z`Ek^0nK)5M$!UR4&nf,K2\&M\0)oLMO-,2B,HFnt1RYcDjj`F5X +I$s#8WF`udAs]Ea8EUpHi*8EgVA=Nk)LJOuH_d0RZInDD_1i%0)n+4c(1XW&-u98+ +4-WBaXPW&r`9AQ]jc'<-]kQiN/L6GX^Q4Jj52lFqUTUQLIraRFkM:Ym:V#L]cT;s5 +.q$a"cU7m='-j.l0DbV0SB$tWHi3K2gL'FDpu%hBRlakmbYp-T4$D#uiFn#$%[m2f +]8O'?5Zd3F/G5,A#79',h#'m:_Uu<6"EY#F$(YGG&=(Zij\0dqB-gJV73);`jR4Mr +4'FF%g[6]ng4VKEJ"%j-p"Eba-Frj(q)-1eR>=\BpC(MFZb +7LBpf!i2:\.0_D'gWid,18QQr;%&$.7,p+#gZt#,CV]k)#gbbQrg$"l3$3q0gmm0J +6>LG7[rIf&g_:;`T:[_MAdSYP!U8p$#U!#Qc2[!3!-(YdW&YmmIk%#npu_U!njh3+ +48_lBJ0P6KWuckCL]b[jHSlK8A9A6_MCGJq("Hlu@*@gY!XdOL!9&D]5>h=h)RBWBq!c=15SX6n4feQ("7tQ3')oq0J&;4^rt!gV +#&L.1p`EZ>ZPoBo!9SLlq&u&Pa#`Mms"AocEVY7\n+tqq%P1i<(#5l4ie@n$gg-1-Qnfm3\i-uFA>DW.5Y^]fbhZ%Y, +r3]IRC:h^OAj_\USVp7J=HgL%^m+C,BN&@Z;qT7R2_fT;N:o;YCCM;Qb5)H[9kdKo ++ilmAJ/+Q=&t)2uVoAoe7/>lO8,ePVp&*]LblroR0\=fKcKmNLPD5K`8TRV%__TYC +/*Y&%kr2g;+!)PQEnoo[e':0@jgt#ia3$:6Q0Va,2gnL*]]9=s?`j?8$QpX$jg@>t +#k#@j#HYT%J*0t,+"hniHd3St%lrnIa2=Keme2*YdI7!$fSTU[!uBTkIEIKmAR(O] +,!_8OULnC%:j6.'%X1F6m,.Hf;#&`&d'LX+B1IR!$jSsW'QA(8jSlltK=8#?SY7jZ +LfY;4WUWC:e6@@TXmg./q?)T[_t5iY03K?%Uk@?8Sr$09uEQdAcscrqG# +1fq[T=2m'ua0n8:1r\MS:PQq5j=ckJP]DLV!M63AlB1ctFMdqo2''L2T.H0Q.-*eIJJn[4XC< +c7^SOY04r58[2nSf[E1R1)IRTNh(*_4OHE?XI=18bQT0j\q"WSCafD>cG5GS@ZRup +SlRnc@]-k%MS5(CoDdK@&leiQru]R5gck1`Nr$NOj`oXI5N2WXIWn'Vlu/ +#o=:GF4kQ'U*OV2%K$b0^T<$dW*k/R2-$]4rtFuG_Z.Vf(.<\@PPoS&BA(6TL]@7Z +=[Rr!iQb]t5MH%Ak'nfY2\285_k0h^s.T3P1g>HS*cVmL8-+MHnGe%GjSup2fGLV%<[VVL6#[?pP1I.o!L2d_Pl'r)=[a7G5tJ[5#Jsr+6kN$/Oms;FbT,7HSNk +:Mac:Ci2ojZqm((\Wtao7VciGs"cXI'WCiTkPl_A&HMn%!`'Cj$3(ZE5[+Hf+6:1; +s53K6;?*g7s*+DP%X58[K`AU5bk:Pif;J60VLZ_np]:.__#JZLT-g^HofpN)fpq4Z +^Uf[>X@<2mIA6'Ur3'cb_W>,)rg2+M!0@9!b'ZKD*ksh(n3=YY'DK6N(&oN7q4g(V +i;\r-6:;WZ0L#R+K@]s-qS1okg2B7np(9gfib.9ocu+>\nkT[D7Z=`gnrF<2#lcR4 +s,6o.78)sZWHkYQC#7>rDeTF+7M(#8i8H*4gd\YZpGT['>u,KZ#W.3N$!\LnU^le +5DdRY[<$#oju@6WI!\4sCMdl\'f\FdW?S4E4;qn3Li05MBrQr'CQ.;]-&?e;&j`g. +9NOb%.QKkm@&d38J.V]CW"jE.P_r4ej!@5UEVK68`_/Y9TCuf@)cb:SW,.;l[7!@u +T]=%6El0J\a=^nCO!na>]P1Uh[%R!GXnR(UiX5\"1.\r>6@NbQH[>sFL\8]iPWs*( +rj!R7kKPC\IQpDMGJra:!LJ"V>i+adH,E8NPo4qV'73T3>utL]b-7oJasA\9I#HJ< +q@0>P>`\#/mENFi0X7/dfWd3u#nH3&^%8H(.IU#qcok`_?+tQ6r6;2M5G!$g=$9m\ +6!&J?oso._)nfMH6X3pW).2n5atpja:I>9[h7D\G_g/G(c[($0R-24*nj4,n*-?UM +-fsJ'q<:Jn\O#D6D9`Y/S9CmF(PEaJg,AX^\smJ_[?X&KdVrVl1p8(a*a<:XL^7*I"kl+AYnMO1>e8:A +>(ETteJ=fbT&)%jZ\hXB"Xuo)3Zh&3@7])i_H+=tBVMml:g4j$!&/mq'=Ff"WMMJ_ +[;Aq@K_aB59TVK*T.1DLMo;#m#n)8"#@_\==I:PuV\9;=U'SR5muY9d6MlH962hAo +,P0N_XtTc?rnQeNg\X;6_YS?ZX"co]^H,@oP:!8=&X+;u^SX"ugVP;]YA#M-7"D;J +7+m6`mpN9m8,alte?DAA"lOl:=\bSA'*/(,)-Pnt+`#qR(ZHM9'9(Y'62SS45f<:> +L]>bMXL>Dls-KG>1%jW>!FUAG]"C[AdB0D7doI"CCIa?V':hkHS^"M'ece_DP)[(i +k5eeupoCLl+'JZ#!9aIqf%&=0=\HZ>W=JZPq1rq=s$N=lj0m[0^=IuMhNgb'N`eC$ +J$f3ek'o_s;#fuhcu,IS/^MKS-H*6c]W'jjnGcltn(d0^#N.XHnaCEj1[@dVc>=,FqS2#-c^p0Y9o+5=YYC +&Z>*D3T%C.[doBtb&cDi2giF@BG]mUr_Vkno)FFD")kpq\FMCY%_hlmg'dQ'=mo-. +pAE)gp\4B.^9Z;PnoW6R".P>'&p>+jo8;T8$$BKBhlmA[kaO8LKBr+mm;P@"&8D +>02\WVi2]Fi?e'*$+tG]TP5(S+d-'=WP*UVF4I.bMWff#.%n::$N/d`)%HS#F:bf+ +8@YU3QV3L,1=/*]UJ0(8Ql7hIf4n+hXOdDD)TZ87K:bi#MNI,Bgc,lND#qN8*s[W& +^T$-h's%>3b$,LC/[;=a(j12,Q4qZ^O6YfH>50i._T5#?k`!AsVp=n$BuAuecJ\_l +A)q"C@dbnBZ_0P:6i+hem%=1&Pia'7dB*>BXk8D%PX!Gkr\3I+]*\%TA(Y^SYdaJ6 +f=S8R:"W/Bp:QjbN"!f?sI7*UeDI/Rqgp:5Ujp\$EBaT'Qh_=-9qm.96@ +cgT/)IeB)KB;[llrh/#<%_KHaO8SitdZ"D=,2g>2e!Y*rEJqj\Sa1IPL3\@)8?6BI +K5YCFYc96R;S5T:NoI=="@[=i;Q?gW"q^hHpOD#*s52Hq>QN/+UJJ[--=49OT)gBk +VEg"IBE?KQ?FoK1qL<4X)#Oo`s,O@)_Z*$o:WWRg;A2;`!7:u*2dM2/5V5C>SrkLY +JE?d9,r>eB%tu^?[/dK@]-Q2`9'[%cB^d[tAR#EhgY1m3pljH#D+3S_C2Kh+[nmD, +,OKPdm6!GFiA7tF-=;ue&>r)f8H)Li[R?Q1O_3V!/0YRWU't]96p0O[a,(B%a<(sP +VMQ6J*<$c)V60LlqT9lps&BJP3gKjRLb[:l?q+b4$%!]fIrU]Kpj_J.CA5AQh]g/!i$eRjrd0tg +gS">6;f/+l&cSCDBdB77t,$(r9d>.?]U:55=PS>%-7t&!W`7IU#Q+7CAkn* +m9.Dj!k3Un!3EgGE9F+uSa-;@?4H]+SBnqknbhSO\)/9HIr1\<1Gf#k%trbWMqMr@ +=AZq1b7eKPaa81#LWp.'H=NZ>^H<*QI4jI>-3)RUqu:EQ#C(7)qtdD?eLBr77suKD +o/U7Rg1C\]2h[-i6bB.&*MQ)a+B$1>!joU73aS29+0+LZlhM--?Bg$T/`Xc?R_qOQ ++oL%*:/+8`AS?.1GXGVEI45Y`J>hVqBMN'-YU)TX9g[_CM"0fkOoH7b]EELa,04-JP!o(PhAS%_McF`U($uT:DN'Sl +BB7($H-nd,i,P1RPLIa[E" +Yg3ehT,kj6fh;=b:X(4-r9aU. +YBQ(8?D:\s-9jX[3nqF>;7k$M*R4o>)n1^\VV431)guQ\J]f +fA_RCa9=#%*Y`NL:)gmK,oJ)0[>bO#Zr:0hab9S3o@%tO#%,:_8lA++1oWH%/nN/c +=Uq5_('FY!&/(^'Qm!&PU'SR5O1'Z<_Z-?b<8urAs3:SEq`h+u"S_]K+b(p8#seKC +s$?Y,L)f]t\gbtas.:&+/VWJUde,0laPTkpY7?&^$NX[I5/03%r'+T1l8&LCJ^3UJ +9CAH)#NS,%IFnM:4m_.!,)?3GiLcteL]A]M9*)MHjjB;bKB[X#U#c/Xd8mOp0&563(Zae<:"?#NUX\`cI=:Dr=@Te#lbS/=%T@[A)Mi%,bPM? +8HN4MJ;6;k5S:ekQZM1uXU2;q6i\D2hPDgod^FB<-VhsD<:OGJBO=TKOW/-NKT4+O +[qIpci;S4PR.BN!jgWEt5OTcoo+:WKrRb2lako3Kq9LM\\#6J14G8-(K)G9rne['Q +TC0T\hLkcJ-hb#dBFj;'cn^PYhAINPhN,sBHbkY,$9Y@Y.I`Q-HW#ADIus\Q$T_PV +h-')?gEBhC?QDX@4b#H'iV!Ec<;\u@^%/8nb-PcP(CUi.^Q%:rE9jh0&!q]q+0YIq +Jp-):5eJc>=h3mGqh!-)B>)'/h#"EV*re4YqU#BtIlc`ig\p2WG*64i9R:CW]/o6L +e,TXjJVQoO#F-6OLg4TI4[pB<]5.=+.Y?1s@>a&8Bea?'LlF[j8d5k.^UsVs2$2L\ +!V!jXQXLQ3XO:((!+H6OpOE2Bm=/U,(JT?:2a=P%6:AWF(1=QOO+;Oi!VVN'5RRSk +7gHtT(!]qiVE4=g%G@Z`:ntY_D:4A<;6!C4e-aT9Ro$u<+(9%K6i[r!e2I*.bb;.Q ++.gSk!ZFSIi/3p(E=*k=Yq00-a[F1a.'aj)&Kh^aKE%cWQ;kqgn1mD%eViA;mJj`_ +J&f^8_uGD9Tord=q2&2Pm?MdKs+tG#Ys@5$^Vg*Hn0^S#TC)-_[\WubYA5]ks#VD) +Jc"=:!JLInlbDc`?cXb@j-8W_o$;pI^YcE`IullKe<>qqoD_WGHa!l"pn5P)n+D1F +[04V/;UX#sdVCE$0pHhF9(:iT`3(Qp:^!^HH8S]T\sa4Zh1VJ1`mcbVC0`O&c'qo" +nX!ep%p5+3KaU2Nh1kh<5l_LI=o_2Gpj^lE38I_!Brmm[$3ha8CTr'Z\Z7#qPd;el4Y/*@1bC_D*q)UYp':UF +Dt8SfE'OOl;Rgqf\rL0H$@r.$K0A6^g__2:5pY#Ra#XR4R:alq9$/#%3WeNIAaE4i +YtlFV^3PZblhlJZT5hK&k5RVh?M(u'o%gJL,l1hL"_)E3H:D[VC/(a(\>)Fk#!NC0PPWFTK8S +q)fgp4m2^Wrn$hW51c]`H"b0@/e3tj,Q=N'J;$qg`!m%Z`&aIF3%mhYhKQ_Vb4'@l_,&;M=`3(6;TchOm +1u"lSa/VL@3F?X7^63r8n!c>tt-($2OE[dcE[8q(D6; +B#DMDj;i"#=qtnZPW9jCl:asFc0!O=701_;;/ +e6;p%!WKi:r#Z=2'2UCgQ[QmAF$]_R4lN$kU$"WIp_,c$@ho'\^Gbdr!WG%0#(^kK5h(9;s3[c0d/GWrCVqn, +!WEOn&Ii:`p$0W0dO=%'2&cINd&Nh?o:nT/WbAVeVP#6LGrhE_k=sqPo_+MOJr,4$B)peOEh6M=>MM8`9b^W.aY?0?nO](-6%6ln_N[0`P&a +llc'.rl9c4 +)1gWJi+:&!hR!Td^jfEYKA`^SJMX8^R+.-0L6>=j.=K62MOkm#(lRn8+t2&J>G +It!^Znq-E$j`145"u#>jX/;ZE"g5Sas,di98)?+Qoa^H$NrP(,pl-VE\ +?+#ktQVUmh3-AZ/bmLSrT"9bGXcq'(>$de;H@7Ld,QDX5o=NP3gT/`ngJuHN<\QaE +C34#1q`N"&N:s]LD/D1:?"^T:bFMYLldnfIW0fPH0l_(7(JJ7OKurmXP@^$GL#o2< +98r`U=`qlDCCuq2^6gT_'[\-hNRe+>+6,L'i]]B@q/)bGK0>0cG;6l7DJu?.=@N1/ +$2L?AN;*4Kk<$a4)CYJ5.,.DYCZMRN@cP1EG"]-O2L_A]DL-c=I;Yi*n6Zgq.??dT +5i;]i,9Y\@kSAE[!XNA1gDI1!<9C_Y$;d)XMtu7:&_s5EpXJd6&,pJa7$XCHo7`jH +;ZMFLlhaS:(-p<*NeGC=EQA2",A5V_lUsK[`;r[:rj=5J._0bkbR="a=)l4#!h>Cm +a=kY(fU")#5WMH_>a6*2aKN\Z!Fbbu`T(G0$c%H=ZkJDV^I%2j(*FE?K*B?9N<&5= +02;0IgH%-@=Coc5^qV19#%7'^d`0;;ftW0/K_$]+Fe`*6t^q$Xqt?\Dq:ZB +Im[3I55>TaDpUtHo=n;aFVWkXR]tMOn/?EPdJQGNs1j+N1"FFV3b<\+ISrgIC.D-I +GDVto/HkXj//<\IPmM)=6sp&eWZVnpS?E[llT_'<[?A)Ni]5_o=]H@<K/As2bb&,^TgrPN-Kn@r12#XCEHVUV^X4"/cA! +:%J%MM"pG[EOFgdgR*RtXNgBXRpkG?S`;KMbh:,Q])^+^lmJ7U9jiV#b=!,eFop-$ +'#SK'/]Q17)+\I50O12:hH+=Y:5^91!O">m[tXJO?IJG?#,>fJ\e3:^*#.%4Yo(/h +3II+U!aeAD!mo0ki^(YodEguQRCf#&Me>AG)Zs%SMtE-Kq( +2JY;b=["Z%@@A +^#po8a2sGW!l-hiEQc*@r4%i.0Y9j.UM=fCP$CD5!;/",< +X=4bZF%7leJqhU@^HBPbELQe&,fooZ8^"l0=oNQ^o$>2hIiMl]3F_iT=9jMj"/e,R +a%]n^AcFo(o&g%KhtOGEmkVJ`NUanu(AoYs?=E?F!nu0*nqBj0kpFQHCCP`%*HQ*:74U*JScFG/Hn$Re\l.nT?J +.=aIs%4hMS?R>6@c1>gLq)/u_[[-]rCBAj_6Y=o(!<;TbhtaC:M`O]+G=?Geb*e*" +k'o'"(On.=\'@\MD4[h9s`H`k3p,Zf:?<1_6[03*RII\@:NTZ@qF +.L?(i'F3\8q%mER#%@sj/-%V\ja$hn(!&$eb=&q5M16Bd&2pHr,qJ +PXkgA+oY!SN$8r+cV^[`J`I^"?_3[EX5>:mUd3k/&aRfAAti>DQ]s0\<")Kf/)Bk13U\eVJ:)-3Gi +W)S;AWoPmXA[Iis5d +''=[^]s+[hCTpMoV^H[S^B40@n6\(U!8,>Dp[S!-%?g;S=3Vm.SBVBWTdYhZ?@*]@8JK"qQFVK"l(7!8PGJ9(aH8S3XCp61HN!eCbrK"g#;dQ;N;2'S6IFKR`? +Jgbf"+DR>fg'7.UP4"/%YECp_k.+n.!;I?DnAbV*_gg\HIt\H`=e5:LF\7rY$(:s,[1==&=A"5^p)0r9Q+C#QJil6u[$%HJW3)XO6NO +,7*"1$o+@@@m&R9qdUT4f+$f5=!A$^]n#h4>f$R=cqQ-"p65J3J>S1;RS3Kp0elM3 +L@jdY_`tVoTC&J8*&^,.?=uu%c^Bd,@tl3-G:bNK?_'X`-d"X.VoO%3*AN%!AF[]K +MoS2^IiL3?l_k\'^oJ-Ir\JSHoBM_-ZQng$%iRZa'O\E?:YUhYs0pT9JH)5oUgKT[ +\^X>;gHmnu:#/`CgK6^H-DSo/2X(r[2Pj*L9!g10GKc+jON#l6`n1@j6')8/,m*Ko +$c)Zn:3D?e?dF5O"W5;[AqL'=g>MN!TA0(.s/Z!Z0`PM3J**YISqm*UAPVMpK0[@@ +J@N)`hckde&I/4n'`6AoqGcU(X&\!f.U`6KF.I9(/RO-/-)sUV94k'!&PLfO9I%QrT+ZAYQ2_Yh_Q +o`Y9W-Ge/05KP-AG[:$`Q%+!WE2[_#f/efE/;8*T0/Rs8?I* +DlSi$Y)(GhL(rhJ.J#Yuk?%!q(#"_.WS7^lCt%CF;ikgZ@Vk'KVFQ>8$P/gI)DF&$ +B;3/QV2l#1bDGEHaRs^Ao!7G04RKXb[RcuJ806[me%+*7E&rN/^i;-Q@5?#T'%:hU +drQERb0D]eQW,%q=sP;/0-Zsi2n[R3qJ%`'!W$X\l0lNSQRAc-B:5M2NCPY,8)EEf +I)(/Q`=+SNbnOscRb:dZJ?T$ts%DLirtd',SfVK.ghCkC4mV^97dnSW3mhBIYJG$V +/]n.ge=.OrR;fmpq!)\hB1pl9f!+U\2?@n^fO=FLDNdS;fY?l4rb[_Dcb!:DChMSZ +D"O>W7\?klI(7]$K*BJWF6Viml0li.@_qs;g!gD9-l3,f(ZE'"IV'qe6l3?5j9Y,F +)TLb\HG@n<=_atYjJl*/Zf\Vb +lJk$lQUdDKrb'o?r9nZKV_Hsb7CAT5-6pQj?QNZ?gV\9AKCNV2mD1jSc`7Jg?UDN@ +LjER&_:Q$@$%a,faL;p_DCqR;?:MZ:`Bi5!&JdthOL%45cdgkB +o-XJ4[.)8I$j['OSPXphX?6E*Z[$5l`f(6UR[[kFaA5Lm*C<#bl<#o=a)eZ +Dm#d$+S"+dqF@ljQ[:-:s#&k#)Tnp$b&TLP[[>Ss0Q0LNXGNED'P"%s[*+H7c&($A ++(kW7CI+$`'I:4)Vg=T)"8k<$$##:t54qN4i."\1Dd.KP=&i(8%C,tUri8&BR/]R0 +It@X#qifps5JSAJBl<4jr9m;.o7+Rns8-P_1&kJ.!KAD>[7.f0"[6Mn5"-s)I&1JI +gaso""isKHG7jXJO^I4D..C+Lq%T(gJdP0LMU_XEAH@)lQ3W#!b6!UO!C\;c+KtiN +"]FFe'(+UBb^Y>r:E^0DLlhj+$Lei2;6#FYi!]&s49D>Z"TL4SCF__eb!W5Qpf_fRAP&ht&D`FM.M!uR +%4RG1$&+X:_U[>ujjN@mSCj:CfLC-QM_YlI5X@/-5]95?T/m'*?r"7OXsS4=AJUC0 +83qJ?'TWS!PQ,KgV!dO?^.(tLZZoN?G]n;V]U@ulpVm*R`Vjh)i?K-#5C=2.K&FCW +N;p.j>8>,n74MY5Y.HgN,qmFj-ds5C@%3En%62L$ZkXk=UrO^V`S)Y,=iZ7mM[H_H +#au[o4#tsB1;MGWho4BsRHNmHmcVO]Fl`>MF7o+4j8%F"YS"B4/hl)qj>rh60&SRO +m50OY35l.S^i;+MirYHi9McWIrU)3oT7bDS]8,t+T>`:D03),pcpVS/7l +\!L!2/2[-65-">3?>T,k$L5rQBYUXF_DhD$);XKQA2!?'+khhtg;n7\A/6E*s,4f1 +5Nmt`MieA_W;^jmUZXk[r4a?7r-"/0H?dO/f)qOuqp"&_-U[)QkSM:LTVmkf*&.22 +YOVQs`]n?LhV#]WZ&8Cs@aZWF-s-9S06L1<23Wfq%a10'![.IiW^(I;s.U5%Ou/4tJbs]k=6Fn].=<*+d:/LZ +[9lEm5Z`)ID]MFNo_`(O)7-t7@Eed5oD>!V7.:`V#AoupZ=.qIs2"`O#!VMuOpf5. +1B44L^Udl=D4tlnJT#PBGCdn0VJq;)+=GK0#CiTI)#V)=Mgb6Y0.@D_eHCH]"]V9( +.]s%0.1ZIf-rC3bQQd6].0.a'7f6?1"-e'3arFpmb%uQUF">4k&`>Aei'5Tj5lC("8,VhS9^/Mg@/^\DAc^O-]V"):0)rll +(I5IFpF3ll5kB?nk4D1L]<["f1L#G1.@C.(U7`-qY:9eI?RBs9r"l9cLf<\0agRU/ +2SoT$&6M1iZun^Fc4i4XA#.^17b<]3DO/%Mq9d(n6bNRdY5G +QT>SjQqtH&L@XY2b4GSU(FL';B8uR/TYQ%DCb-V,M(Sd*'LF#=DkZ@oYIdI>s-GGn +cXEC42&^3e3n.tf\A`]kQ$KrrrNAN@QV39TY;<_u'h/"Llna*2d.m&Q;hufn*F\t* +AGjJ6k-+Y!%sG;ID)_<"X3n&/b\u(]^042.cW]U8lPNa]XJat.aS9o\rO_`EGlMe! +rNg(bNu!m3&!G4])+.ZB9hSieB([U3)T?=RFIk&2;A;8[(c,//2][A$"TP$Xfrg_B +q71AHH1$AAM#T6El@Inb-4@M]6"u75F+,@8KtAC$c)ZFpga:R +Eu\1X`r`68>&$Rshf=!"o;g +A.#5.7us+O3ahl%O7==HR1D4'IU5g\]:*nU-0=8EKC9S>DCm0j>tMcFNqVccg7teB +5IT&@ge#TDhpDZ>MHu0*#r57u7"m+2:UjpW5^Y_DifOf*._=19tiQb?l +q?"ep)'.`:c4'QVbX:aYg& +/RXF%2TMk!maIj"D(,$o0(j)5pigJ*H>8**r*RedL&&K0?pStU@Bn=#Z+S,l;_'ir7BUfBiu!\]ER55:mE5$-$t:E +kUMZKrhJH`WrIG2q2`Y$;Z`+-_-JE4lkd^P_Ga&T#>tQ="o_[);5FE/f`DG)4U!k^ +s5W9Ertk2Ii"*tikNBj?rKI7u[D?5Os5\Z&IFoJWZN(F6>&=P=d$i*2XX9:Br$t<: +)H'nc0.RA]alaJ_K)ttolp-7a80J>)$NlY3_>1s0_T_M4XN7]KLl1PT)QD!`g@>oh +MGnL>GYfu\?'[@G>Wc)O"e&AP2-V:D/C3Z9(CXtRn.3D6n("4UQ7$cgdsC:7qO=ee +>=1hk?CYc"Q%E"l\f.6u+9jG<%,Ti9uMsE!u?l53DHHN8ZQ>BIr4-/hmNe:'%!tmg%m+2nu%= +Yf.IZFn%\(!Vh.W,Oh?)rZ&p>IE^^lbTj7^UM]X%S[8b,bg.)eDm!X-gVeEBKD!96 +f$hOVc]4C*4DooHr0["]6d.b*0d#dm!aG*]1;Y&_ml+1[ho`I@NJ[>g2TEGtbTF=C +;IU"JFq\l`i1l=hE&fjEr$ajX$pJqOhjmA>DT#uKs?gtj/3Le +[g2oM01%*Vn-@p&?Q\lLlsoVP(J;TK$s[!f[*-T7'"?@.TWAhQ;=\gRMGpX`dq<(f +bHgJGfabrD3*U[2,?Or^IsZ%hZo4cBggW'ks,;k![.4'DI[E0BC5i0oc1),+=4_\q +&-j;K2AtO>$i#4$1[Ttjj?'DV[oZFFXu*YrSFlbPd_3&C^M]c.hF;jtMuNHWqU>Bk +npbqD0liF7I%!'Ac?T+ie>u108,%@*(juqfIu2?3\S0)@i]e7Lruh'&rLBMREIZ\( +iSGXITD"Z0hdcY)5POmSgrBXcB#H<8@oWB`Ndgsdf$M-56N23^l,l\PG<8?.Rn1S7 +%/6&,DCm'9;UQ?A0RJMn/ZHC_\4OY:doGA8Z7r2H0LmQSa7_ip6m0o\DZN6B^ib#3 +5k*[C,29Frl<,A'Y#kJL(\fg&Haf7:[Tek"$b<1)Qgi+B0BbdT\tcTc`\(j=:?'jajEoIq>dT9'W;e +UYDFa"],Kf&-(Q"d!tU.>JPL_QO"g%`<(kn +,74S4A&J?*MNffhnfL=Pr8D/\j5N;cIlg'n2'Iq^s6I(DR/[`h2q<[@NT38"K^a[V +"TP-`Wo0;,2Yaoq_<[u4mAMJ%-++Msc.P61mQA&17B+$Kr)'E!W(('=Lt +)j6\t;:T6*b^YF)l`4s9XMei$^)^2-A>3S&"4+M0Ib^o +;P_WlE%ak'JP\9Hhj#/?_VmRt6CbPf6&n(E"jF4Z5V<$PTZ[M9)gb7g6S@:TSaC:= +$F?Lb4:KC-Um]?#[^[Q$EcX=FV?b5<6saj+,OPI7B;Cr48BjE#00ao5K`s(6F=H&ei"U +E2O;N5CC/-r7N:B[=67[m03g]$oVgu$OW7A3@7`DAu[,J3/3b;2[T8OQ!sh[n6D*^ +4PL;s?d3Qki/\'>mc+Cu/4=rlCG&pAS`,ZuDCnPOOdRt1Qon*14u%e+rPn:+2ift&ZnrQU:F\uG^u9t@Nfo(,iq:7%5>H::ZX>TcaUZ%uMe3A0* +T'^%#4G6nX094IN:)]+^+aV9Ib[/!')$Y/-hdZ3[bL-&3NaB"Z?%DObL*)$I:QBE: +%IkS9s*6itLOG[7G$4gKb8g070()Ls3PXo8IBWstcR(,+W*b$u'E,PN1^O(F=_Mbc +!*q'uVM0-!NjQQa]Y0!0:;p=u`uN/UC/6dh9=E?g=qsN\.+#Y8M#>[,B>"K4&cl8Q +aG%\:>k8V7E!fF1m\r8R+SLC$TK:\o3!ekFga_XE(@f/9,-\%/TO."e;sL80p+7le/hHWq64/hC ++]l7m97ERY6*XKg.>!%`KqGs)+&l8U!)cl'^*.>IW*C8MVGLS2;Pl`4:neFN.RCC+ +pc&99J%dH6/-'#_"Vq(eJ25SD0(>!U"f2"Qq@@K1,/TD[s#I#&m"s\^Ma'2rfCN>^ +isLAP!*d6Cr5TQQ,#Wr!@LtA\kQO?gV+6..e&,.!U&'=i[.BJ@n0NntP/N#]q!3Q^ +<<)bIr"!MC$cTt8JDacJelWq"Wi6K.W=GoY#$4mrX/j+EQ!kEh+W<5Q%,bKEmXHlA +7$g-,QUhj0ni=d7K; +SDIuESNE)+kl4Dm'WQM,0mKq:<9'RT:43GR? +#I+Ye"TXuHPACBlduaf%==&_s8`WYJ$]#1\*907 +HH-A5ZiCp3\)ZI!!4fme'@5p?mXuDOfGK=r;h^ftBFA&XBk8o2J%Y_4JdL^8^1T?MeR\a(VdCF>TC&JHl_.YOUV8r`^:o[=_9IKVIZ3BrRj;I2RdfkTWY_7k^6!s_3nNTf3T)VR$J!JM$pg9:F +UK'k +AFs[Kj3Ja)LKeIWDPGqC@!H`E%EgSGDGEY]1h\^L>T9k9"qa\DQfsd]or6f'$@VmUj%/WB0$K^2NmcL%C_\Of+kTW +a\;uG9fiKJqBU,Vgr.&8.n-CZ0&IhAmiW*_a:0!MM,b +=b\m)^HB[Q;?1Qo=1-h]R#9i/G[W*'e\W:=dS +o@L#@.S>(\MS+k)]HH-6'R7c#Y,Xf!*W/RDMT^Eur8lYJEim*f>-HQU0<5R3YMj9T +W=@EX"d`9p&c<.f/G;FW+Wjq@U4n/ou+ +g^D+B!L+;:]N4_jp^bg'J!,3c$OFZd!$\_!+C#0r'NUS:;32\k^n7f;pja,Da7CJL +c]/LZNXj(uf*DNAWX;(] +nB1=+o$U>G^Af5D5E@I]"QtXE,oM/7BtfuahHoIX +(0^cL!J9P"Bp$kB_P\`9=^`*h/AO$lCLW7cKID&&82p,G='gQ<"Xr0Z1=X:+mq`U& +@"GWaIlh^9>9:;)mgP3ed1-0P=IXute'd%]$\M$AM54]CUtoe6R7>W4515E:V#0He +T'W+45PVmd0AFp;!4<-N-*')%Z5#$h,OYa)tdmf"X_e3,In$#:="o&c*`EZpU +]jDg>""+&\K6_M_m;q4cI-Q'2ZjZirQB4cNcXr5<6f4ESP7& +Pk"5\;m]lh/._=o2(6cf'/!\jr$_H]&Gt,m2UNO!HZkVUH@F?Xo\u8&X.s:b!e9Vs ++kDbnhcrPKEg\*5s%if3CB\j#&[O"6Zmq979]h2l&H@H@A,OYpbnHcc?@[?,j?\s= +k@LDUSJ_8!$07Ec\&Qt2a/('5W@H6*=Z(JJM>VR?ShL2F5Ma;/#lg5c./:O\r*RM>DClk[i;<23T/P)GgWoS82s]-\ +k3ufCiM1(e1[5mK0d@;lEtIg_1if"g!6"mD\dLZXq#BS5c6#EPmJG'-F+F;b]=E-0 +9XqKaGB5PVFCQ!]jsH9RgXp_ZRf'\?q"p&0gZoa7XJ,^m5FbAqYFfp6STLNe[(Dd6 +WQ]K9>[5bO9jo8\tF.q +BF(HG;Xj-C`b(pa^i."D1Db!eMYe%R]`W,P`,F40!qfW^E4)!p[u-X3:Dk +97>>:^;0dH,#;4DVm=)Y?4'=fMq-Z1)IIW`Dcr>I^qZTjYe9\E.N"t\%RM46),sWK +=Bb,'r$P*%\eH8/;?2E#^'n.p0)j2je]7\F,5rsAHqt/r/A/l-577UdA4AY5ZD(V) +rqM>V!"&/u$Qr&,@p)'kms+gF=[4)la,33Wq'fap,lZGr:NY>-g@H9p@=Jj(?Q9f2 +%fAd"@c?8f6'uS3*?P?34oah_K#[DS&;#C;2'34r+%?1?i#glQn3NdG\PQ.p&FDVmJ?B%_]>#e.%!T!RN4U#Q5L$9_aJGp0)^`R]S +eS0GCWAD^`#lXu,j1?fS\n[CTldLCaTUDoi!?(k'64gX,E.5G'@/eL:arKch(hcS2 +CJ!o-8a^8J#QE>>K`M/'"[;.'Ok^s.!2;bJ[M)2,81&LJjlHpJlngep"iOSW`6?"4 +O;'`5+_5UucpY*gGb7QIhT,bm4Y2^'\6oXr<8.5p*&!qgopkVq)? +5$Le"r4b3VHZt!\AWUq\55FLZbb$diJ5MC%0qSq1+o!Fn&9,uZ,=id[;\B&U_4P>A&W5tbt +f1[DGQRAJZ^mPLm!S!iCS*Y5ei&Om>EWH7:5^k6mJ$bY?jGFa9MDLbfpeCiuWZAl> +-%9$4XHd++nPd7-16S^o;l43(=Te]#6JM&.L\P42`rCoYgLfQs=X=ia.SY+G)P-/( +Hn[h_@M._i3m)A&d.P!qa'%VFeg8gG5pr`uRdfU2`N/_mYKjC[*A_uLO7?`c%2XN^ +C]s`9DQ[Kc^GnDHp[`"nmlQK"lnS?`^[]JjPEB?eUF4;U:)!O&cOiJBH&LWS4KO[g +QDjeDq0ru^onE4&MuQ$1kM=t3]=!iLH`QtORlOho1]r0:c33daHM4i6NGkn0I^=q* +eT0C,MlG=j(kTMpL*(aeBhPkM\h_^>I+it9Btr;p/RqCidM-irPl-?:H(d%4_7$'\ +HVoSdAgi7\Y+_V2hN4oACS`N>XJMhD$US`oG0r74Es +It&]XVZH>&XZEC\MoHPP1]c-<^)FD_]$ss1IoWb#IYgRg)FaY%'bLQFb5r-&B;U60J*4`fYr0`OGSImm68[K-6DKcn5B6Ln(NWoR"7rttQanPq6j +\3LK&X@Rh(J>OVaH6$'AcpB*irRWBR$j^[)Ya.I]PR +7$/7T0*oSqY7a@Tj?tldTbO.gRFn?._%qQ,!(Hn&s,rW'daT=\Ec2i25InBW!Hiht +rc_Bjp!fh`C_H@s$[Q%*HeS[2!IaA"".^=FH-knQiS8;_n:.Ym$`PA'#l[b82CE]- +-ahRH&c<0>..P4Q+%lW>_#f^=>X8^R1U7"SK2c66gVI$L2OSPC?ifLhdtq7i'j*_K +n>&Ie.1*_PobJ,+AeFDgJZsZ]KEY$XF.,A(^k=s7$R?[O^CANDg>(02grIts`1E7\ +:/qL])e)B[7AMM(#"OK-^qQ1+]"8:i'RI?KoR+F4n6tU_+nEgoL7f?<%%\In!+5MJ +O5\RDkkT&0iNpE+097$'27tnCL3-ha[)qfWp9R-+^[F)W@12JW[FA!<;Vn$9!WKhq +MgfB%G&7`No0no4f1X +98p,"1aP/.$;"3B!WG$WXSPR@=&a4Kf:*aqB3sku +IC=ZPCGkeDJl +Oa;@;jlUk=n/qYKn#U1#\<6U1(=mE9N;qUEqYVK5eIg9Xj.+Lq4Bu)X)rBF;HM&-h"+RU0?=o'$MT +B?Q5t>KZ__+nb\ZJ3WG<9ZlTpb/$QbS^jNIC?g0]\R35?biCUX9r^gQ=r_+=bF^6o +[)rf_c3UdO&%!,U3FqV"1;iKJ&U'm&VlXiMHoiU^!8r?EZjZA1*p9OsE*"?s'dS-b +=b(-fVAE?"\\tfua0S\+;3UJ!;!cZ4p1p_un#?kNLjbpFFA?WHK$NSV4fAMaC^7ge +$U=dac\fVlcWBa)RK26"b[O.fo]!$P"`7q)#YYBm^U#!O+&B,mFn.u&q$iS*: +^ED,m5=\fT!WM7npu(8+Gb<=J+j[Fh:G`+kir[jL7QH#TUVR4@75=;*)hu,!s3__p +A-)41NIV-R]`heP$c)ZFU#8-IPSuiH1 +fE1^+f1?5I&BoV4ItI]/#l`A:TNZ2S9i[.\,)WUTkh#_cMCQc0<6E(.s#F41"V;(> +ZdT#QBn99c=[J#jkmdV*k5p`;;nG\#JH+G:8R:W"Nj%X%ff3`S1`0D$UN:NjF8s +!%Y8RS-?iW9Sd\t"G$^f0(>/15U'SRCr6^d2>=L9pTh'n[H.SH)^i5Eo)]?d@LNHp +"rdmX%ojR_gI_Bd[_])B#/@5c5Mh"C:B%pCl008;?b8mZmN=[L7XDG0o_V+R8"0qF +0;%SV4l&bWIaITQ_s$*IQU=6XS0r[:^[=Ldphs3^Y:fqUdk8mW!rq/M7Jk[V.e*Jh +.b=RCoZ+S&SfTRTpWN^=&`1cS>Nh2CFMaXpE3YPNU'`e.@\5HqT4%Xc`pr4XA)c?: +2FO?J/>KmCBQBu>[BIu&D2$YNTgb_u@Yo'(1jOs4&Ks1[`>2hk<%%I%mbH%.6<>i@ +p9BF338M@gU`%J+$s0g)45D>Abn23l[S'?!:5kd1&3Y0+-7?i:V']< +jUighg77?i7PlcdO'Larn\%'$IX]B%aY*Fn>:Du1LO*_V(%_J!#1iMfcjAM)gVJA6 +T'f*!3aWn]e;<,`BldR*%IruWRE)loS+6IX"9/*l[*oLC0t(l>lUja$.\f`F +UJYE(Q"4261IW$59c>c=,JYeRDd$n+F_[R:>**6?Y`g3J?5R:PkJ'!n"Y2[_=VBhZ +)s)rU!(FO>n39.Z]cb:r0\*iB;Lf1Z;NY%KfLmI^!<-'#4R7o%$b03sf;T3EVZ7Y2 +ZWkU$pg8rfQ8NE0hVpaHJ"bQui*TaW"i5\VelNB3^j]9nLgJ^;LbAoV(T7XfKE('4 +j8!&DmpD^r.$4=enK1I+.E+KX<>#+BTf&/RUb[!<`A&,uO=qZ'bQ^"j(&(.9Q@M(r.6`^GKY` +s7,LA\;mlIcAMD"8lYiTY#"J&9HE/CWh04mD1MJ)S-"3Ebj#fR+/XVc>#Mr$'07)m +g?PCOX2A^'6H8O;*At\LJ=^9K=%]"E=jErdSF2K&AhQ`]b>,DLA]<>6`n7(WbX`&J +8d^uL&i_a/?qR0N,d;fDYDI7j'PcuH +n9(r@Zok9YL0r1]]Xs.#?nHsm\,ba%9r),TOrg\J +rOeCQ(J`6@X1pkBNohNX!rI'p^ZI-e1hk$8SJi +-_kHa+F4j"fS_L)$3%PrkI5CO&CKf +X0ffZ+Q1!gD+7Q\28Od_\+lSfl[ei'k?+pXd8MlAObU?AQ9E`4FMf?[&g^tb0Ism_<#VCGaN*P:lE(9m9gd09d#Q$JFmc**[`r0cg +k'Mlo.)LcT3N%2EB,-7E9nuN)5&>rBL)G$N-5[]1Rno +JDe0Iid\6=n/kURn1;]R`;Hg[o@,6Ql3b5i97<6dIN;Gf6jktbYW6f3HhbI\.%pG- +SnQ@Je[#n\j<'#('S\hc8U'74Nj/=r@Gi.;r9O.8'[kMCdU!a>=qfCf*C0,O#P_Y( +lCmBj6+LX%`iHVtVkhI*?0t^")h?nND;o&*2i#6`>6(?.Y^jmMT`.dmH8`/PY3>s2KBaS+$pm +ne:L'dN\Gk=&jr^rp/NM?^FSr'44h3:fA+,kJ*lN$M,A!J'@pt8J%ZtTNk?u9ZWP. +q8s+p!P5TgZnsQIpg9F(r_NLqq6>JJ1Y$3Q+B8/.!WGII&,^?!fC?Vf/kOChmZo[4 +s7Z*!p@RnF5O]`t_7u$1m4#`N8\k@dL=k)2W!7)Un@u9Y^V%Xc1uGWAktY?2.jP1p +*?aqR$c!ckA[\X;j=D*.bL.E-anF.n7nJk2G(Kfu5Xpu4>533DJCNL+_#G\[aU,Zp +'7;-W"iP^hN[4`?Ym!B:&FO?Pk%"K.&8ohQ47E:l/H$P9pc2L^3O!"!R+^>\nh@u, +A:p^=e/`;hW0;ITjI]KjhHOUerBc.kEsus31;);$ +/u#p78A76ZI!:_3:FckrXJPj/L%8n5mIuU!LDs>+ef!:JbIXsKrn/L<[d>Pmn<9l_VKEN'0'!4,Y:$4<%KE\U#o,e5;H@]![ +nGi'hg!_+n7siL0ftk5*M>Qs6;+)!Prf>IN*0)_j4 +Zo]5*pU;rNm\cbNb_\&MKV-HpeB*,ad-0r3N5n!t&%==^D57:6Dm*fHaF>H#mNs0/ +s3KGZJ(r6I@m<#+#Q0'k%/!5Cs6qg4dTM+g_ABTT%JW05!f#%k?C^/,0=\UQm.,q+>7k`3;:4 +6>;%^1;Zp-4>d4MINN>JJ%XZtKE.K0i.%t@C9UVd_1*UMFTI/hNhULUX9]X7,`D`u +O-LC=RMW.X!PPoAJOcul6_3>!dK>$a:eET"mE!P6nT#r:CNK,#D!HaM2NCp_]SJ7,?/%G60&i8H"M_V[5LN_ +$\/pVT*<^VnNXI4lKSqt!XSSQK[nUBf@Ru!eAjMt-T9I$!<;`^Iq;bVKfU.IO6]$G +IsEY2:DsWWOI$t='Cus50Vp0K5;TAPmApTj-i[D93r%a3E#AS&]!7ka@dGJQZTJ7k +^jkCZ0)-gh5L9_t(X2;8nAgLgJ3WUY[U]s=^T/ft]fr=(2R:%HUdc#"=mCnlL\!YP +"i(lRn1W&\/lm2t(((?U.$V7)Md;T7(V.=-0?#Y!`Aom18Xek1*H*Tg[`aK2(51") +k?Fd:9MGh^S.mXhZ2e\AqCDUt!5!dE=K3>Q;/(9EXk+aN$ +$cJ8]KsW)ToF&ou+*JV$]AN+i3M\_E.!HJ)^0aFF2:(dH=U&7,O?RS-IG.Bk[#t8h +'BSgd__4(\^Zm'"Qt(AR&c%2nU`YqemOb@9\;Y`X.IH7qg(t,*5FOrcDjK?D1C_XS +,_eO1aB&TT5+,(?FrB\f2<9OS!pi;kOZY]nH$,JY6@3F,?oqbUS7ISM675bfs3^2m +BiOeU/T_dD#N-,K6X,@jEURa%^U]C%q,5[WZ^Jj\/bZR@elJ9d/Xb6BZVmP;_ +%V\KEWCc<"m`Z([rrMRV$@q+(!T_:QGPE/l.M36.J#\\T`?@+d(;W5h.PARf2LK7] +pnX:5a`.I`'B>r:-VR6/Re?scV+u:r88.uMch/mhG8hDo11HIQVMaE[Ikle,T*"TQ5RUYam%"9.23Y^\eD,6&ao +T\668[[Gq.aTa8K+3;nS%URX@HkQCNLk?FYh$q-^La!es!j=2+d!5QIhokt,S*>nA +-N@4YFF=>Ul;H)(Mn'W?9KYHtiE3;&TapMiB!_GqVYb,]]=#War^B9a'Wf"gX%Zq1V1)rn]>0Z5Cre.FP>_OLW*nAI!5 +OZGc8O;mL495mfT+o^LO:dM[>;2/__aJ1<@UHHT1;XUD6n>If,Cf#Jf&1rFh\tK%W +i7T]08-'KJKgT5YGUH`=8hWm;-/IO<]>B*rT_Y-eF5-Ms>D%M,!<<$f53@?-6V(Eu +?rKd-K@[f7_@QFF0(gbJE@:PM%f?S,6h"H_oc4Qm'_]"hJ8/9)5]=5!BN6:lW\,.` +?_IoIcimUIYI=L[$31haNcdW'J5-5oJb%fKYm'%u&G?0UIpQAfDJT:Y:]%dnILL_u +%*.oO7X/Q8qM:kngKGf;!h((G+9fPI/qCm\('+7['O"][?<7q/O?^Ia+bAR$;QVhu +p^clGo3YE7XlmGC0,.:aYQ1(:6m2k8AV]B*,7:b$MR+L"ZGP.dnFEY74o_#5M/B8W +mc%d4mD\Qba*oOlkfb]"ljKH]*RFbgg-j0bm\WtA5D"B?!!WC.5lQ^&>nHgEi1=j/ +c3r?hB=9,\Zm=Yj:K'tU?"G_Z^Immk.J?dYG[^Rb$g0\&"[44>Y@>$iOJ+YSZUj@Y +R-gcnFB,-KaO?YjWSdj'3Cuu]s/[(7bU?\k#]!lD$pj)6liP<.P7o)On=G<>!5\o$ +"[iq96"BiU"Zoik3)=kFInsfV0Vp5LE,I"JUQTpg6U"dgE2eQ`Y>3L^4X=G42ZokZ +qak/gP!3_1IG@B)U*X)C,@)oHI8EMHYEt,jSC\[!2 +d`2Hcp\RMEB9H#6O\U$:SnodFD'rWS+al=8qI0KiehT'qoO'K>pDp'Ep7NbLhtmhR ++/$>-LqM[-;$uO;EARkqoR&Zd>pK,p!28B#.'*UI59&TK\9i]Qp[0Bb\#Xc*(U2fc +@h*WamV([aW3dBmRTuJ#<@kH$9m7/G32Ru`VSG"4;'^5ereiR;`q]"R"lu#.]uKY. +45F&(jpZ_m%fR,NVStqhfP_KF4s_[p,3FAAN"s2/Bu'c@P\J!VCU(r]RdGY$0?\M; +-i[uC1HGjjbq8%ZeXGl>+@^kcl(9W+I_1JbB-[6OB$tVP8SDhU!W&jLba/PO0DEk$ +m&*)(9msYpS^IFJ'08DKj$ofU)ia<(2?iZ(+S^Gr#6k-W*Ce3iSfQq*3l/eO5PtN% +ps4EFD&KY[]eKKd3m.F"+Qr`AcM(O:^0,+@`SXX,/][,S&L\\Yr +m]KaeXr5*]$93("HF=WBCi(grimkE+cj&Ed[Bj(BCu +56EH%T)o9c>Vc-#@_U$1rp+V+EJ+ur''0NN!:X?ekR&)u9I;<@i."=qHV'Nm>2i^/ +F03T/#QE>AH8Q?fJ=bK1R12H7bor/M!7`g\5lc;J^)m8=r^EBO$Tn-^m*ch1Y9ObV +5Gp(9Eej2_n#-b7Xpop>+7ii%u?P!1*<^+s$r$O#qnR#K2.6r]\ +s8!>Ss2BK_IjXYl.e(MSo>jPo&1)T-!Vh3DYtKOgn;i=.h\G&[_W8`js5^rO!jZ:* +OThE.5b>dkgc-Bl!Pj285J.OojNi\Q#O13Na1bmDP6bO24sn#]^,\*E[5G=fL#:Ao +gt3Inck+jV&<'T7YH&25XUD,1%4-\K?XFlaC8t&02:f_[`Lf+qrC7N&@A*`K5% +/h;o2/WM5/#ZW=*jQMDA#Y:4";NMPi-k.VkKTo+))G-kSRh*q>_Q'Hk[CP8h\Im)D +R#]$OJ3PdRR1MP08*!,\,g +0`pE)OPd+?ckci_f>tVJjh>:]T@,jZ_HbuGM6BhD/^*c_A@a4CNllIur)B_KPY";8 +js>l>Op&,.R)oLd'3%gk7>+f=R#*fD37H2Ii+&ABpJuP-efY;JYEgofl$@3pY61Orh&>C8R0N.*,>Ym5;40'It3#j +pr(h+amh*L'4Rjb`_B3cT*4Z08=q4A>%_L%'#br*]JZiWif]o9n96CITtZ#5bct&S +gR(4-YB848C5\Y-B#cr8n+P55c_l6&Pk+36$KO^lCnUd9%AcT`Dh[c&?L$S,e47+f +^[_.gB:UWs$"YRIKZcdHZd2q&/Pr[Gesu. +oX"c7ikHp'@W7?%FAdqBcncF^Vp++H^c3AU2#1^Lna.p*?`c3aHo_)H@c#'a][HtK +7qYTRf/[\#Sk?ZAc8gQocsnf-dn@c^n5lR&j#M,*-l.K\9l=9hPka +OV2&mi+Mre.!l?[37"XDs'?8CA.m(o@!;ddg6G^_bR?"9R@.2/ZX\r^8S3./2Gcr6 +Zq[%(8]/c/SN%+#qgJ'#p[cI`S+_2Ar\N.gZ\Hl'WdOcj3R8-DgspQ&gFC(bT:V5$!VJhmGukLN?TjdY +*R4]cS&N_Uj?ih6dW,0hhP@\iekrg*>mr:b."0i\anD^^*ReR"'`>c?)%S/Yc^7H^m?qo9,``.)K=dkBIk'> +/08K_pGORerBucTYXhh!Q@E7!GHdMt<1?*Ob8/TJ7N4eoK +G;ul-m>qDC$GbW!#4jpIFb%Nc$nV7)U&NZo6Nf[Q&,t1ZW`=pK\[2eC0,ik\q2^h5 +8';UAjiW^+bt*P3Ur"fj@2LIQ%YO]&Xb$oWBU*YGg+0=5oKV3tFk?Y/N1Jo,BeVaP +Uqie*'`e&nrZAVY:-,*Jn!s&o'3i7ume-V"WD;s_^%.fe2M1t,S@,0m*I$h!neJB4 +ap.8!'F!.h;P$1qeHp3uBZ:AnUBNCR=#.^Vo]JLV+R."4pT.D +'it+b\\cu2X)!\k2han?_oBhDL5Vi'$=gZWZ*!A[VS),Igc-J]&o+_9CU3!#n7LWj +jk5K%fnnhDbA2-.RlE^OV1JJhb#C`'RA7b?A@\S?5dKQ=XTi*:E_[FTk`#6Q"f6]]D>:MTC,K7C.&s5H:>]$Tmckgt!" +_htVO!j>aYYF#Bp)X.d"d%`Mk7k]1'P4ITPH?DAsHOK6>S[=IOcu/8?+!3b?*(HPA +6_BpBHoY"$q@*>WErk@l"onaRDZNsrJ4H?-V?O+#oY@d$Y:f_;dZRDO`k?jG +p6>`"s)\4g-T.[kki"*DID'FXudYES4])^)X)N=C,&DhbY7f6pNm0T,dil +rl8*X$o($H!1(A"YO]P#9TNb#6qjp4_^A5cY?A-V]'Pq7#5nMrRXi.kVEM\bp<##A +]6gOP(l)T%T:Vd+G+/9H3IEKqB;b!dT*bAdFQi*ji?+Zt]lc+&j&7+nb_LRn-MXpR +iM?Cd\K(M&e^ttH_`%hlc\LK[iiGoG>l]lbOSmqbjJ1bl>Z^rRHjX)@#tD +d(gk(5Ltu,&KpJ^O`b7dHZE'f/?&UAUF_TW)uOVUZ(5(,:X>RcnYU/WF&)^\GKE<] +aju;X?m,^C[&7Bf1hOpA)6WcA2N=&cnmCi;L>W(-:HOK3lp^!p+.'CVC?D"E"aU:E +^I#7LIt]Kcr3&#a[H;jhXT880o!c2'8GV0/J("6Q?ff!#-[#WWBIlU1J#*/f#H,rH +>lPI15^OqE4O]@=1aC@csEs,Y_$a9WVu-laOF5/RhWW9!jA$[ZZ7pV,pH'S(cW6cabM +Q8d5gJD5h`T!4&%DW/`B$RR4#`lBUu7R.jd*ru-BB!YiOW +q%-ajR&qFNdLWE;&#QjkPK$**VM0kJU4dZ`Aah?jFu4SE&E4c?G'+%X>Cna*U!eh& +dB`6BIV9NV[$;1KICVLSp&hb +50D_*FCGYa&>O#=oVe;VR"G1%N:L1%jcNF4?n]+HN)#V3h:ZIG3ng$_mUr5GHuu6W +G,YpVn"W!-JfYZ#h^Hii2!@dWH9d7gB[?nl3iA[D;$W[i#+S]?/h53W/UGWu*d=9T +4m:Q*4?.p,G[hCNZMIJB\>gIH2oO@Rm^o16&Rr9Hi5s*6#UL]C]X +KA:pc^?h=>bFnXF3?S"HdFdXV`]^_Ham[e4I;h=2KI_23.="[VC)DqC4-kNVpkW$5EL'=b5+t[+Ug7ue[d:Xc +p7[>ihp2K*AHVUnqp5`*nNe/`lp2^7U>.ea04k.T'Y6(r\MI$nF"6A`^*P-HpgcSd +p?AeCB>ZqYmS3KA@Pf8.-/W'6$NC(q`mPqN>k[3197D+.mX'!3oSoIf!)Lr1CD8=L +]\Ambp)RN;ql;#-4rF1AeYkPG_EU'pq<$)G(\U6Z]fk_kS"_!nMnCkYFkX>&YUa^S +/S2OKBsTjLK4J_uE+-A3gU-k^P>h`9l6@:6rO?>M5@F*b8tSR!K@f,gESCo,O2] +NttoLr(.97ctVk:DA]@FAIA +@HW:@4Z:$l>\Gi,K)]uiHmo!_otLPEru@S`9DH9;jQ9[Z`AW4FICtMd63NC&+Ii]F +rl6[Da]1S;!Es9Dg<PSoU10bipT)W5(Bn>cq61b`?c&aZn^f2qY2@<_L+@r,6>S(`E_\ +fAi44nk.@1EcENt<%/Va!,>Ab<`FqE!ZT&V2igp?7P!k9'i%Vk>?(!Te;h]k_#Mm+ +eld,Wl2UFr??5g.qL=)Vm@!Hn#8mOBl$ouB+JqCEF1s9^!_e\cs%Yo[D'4>Vs(a`V +jR?g1;)<+%fDg*pUK@$%r.%)P#QJRN"\&fY!1fLX-!Ced:Q("+eaX+A5A3\h6NQ)'C=6 +*8h(r'SL\l8$m<3S+C,.3-"V]j`UChFkd^Sga,\-aKD6K@:au"3FKFV[^?A-mmAH, +d+KRaFXR7=:V#=P]@&u.=%>8J6J]mQCD5'>/FpcQa^o/G.^URqG,1'X?Uql`L9>Wn +l[tGf,NuE=SJ.`]6?H`H*?M%!)@JM]69dS!4#)W<9@++oH<<]5K*a\T6[s6R^\cEb +PN]Opimt,Pk`lV@[E[p;D)_ebg5e=IcVG1e^kL,WY(ZcFJOmGBrRZ:q!IjqFlADbt +Y./mlaTj2[^4%d(g&%-6C%KbCAsZio`#Q4hgnmf6P,2<7)=h4e(mqss%FtGc2bnr' +mTbj'Inq-`;^0h@NXg(8q6PdmH"$i&.*t-V-ZcjKg8\M/`4kl, +0BQ?"@DAEDqX]$eh`%9ZCo+kW"225M]sAfoIi."$!:$J[kb"FTr:FM*aT'`bLc_LZ +5"-_Z.GnKcM1n1\l\7,-Z(T8XjaDB +;C#&ZOs_M(^9JrM+PAN3VX7V;CKW*&=P6c@hHdk,UBIdo,_nVWq=%'r.`_Vihd-8M +fj2V].KAl9mjZTJWQ5)>pJkdVs+fos#\[ZK&-8L`Q3:BADO.#`V&W\.^JU/2bQ9`a<):o0mO+m6tc>`"Oe*oi)H\YDOfd%q6H +iP$$N@'CkgTH-NfInOrl1TS!Ag!e%+Xj7%k!WXt`\naV/R3_8>+=!PW.VmH3h,Ti6 +l5]A;0X3$J_>f+5*[uSXHZ)W-:K;j&+oauWX7H.'\F:;hl5/M7D<&f$q!,"+9fHG: +_`.9(O&&gPa/cnf8rpHum4!8>#cJlEFLeCXC<=U?jT#8N^WFiAYQ'm9EW@9`:e<.% +iX1q^hZ]mll[RAsR<>UJ-EI@G]>R\jEOASG4.uZS2uYK0L\cMUcq6dC@M]%8-iH9g +BUNtN::o8#$S^GJeqZ20@>G(O$h>\Dn&!'DKY?)XXo,C%#Pf='7=#+Z0M)ZE''t+= +W'E/YeVrX+"F9j+*:kSr--Va@Uod]FDpuYn2_71&?$>#3m"1dWa[s86VOi"*1H'@' +N"5/%H^0.d7"OYoJu8AHSXhUA\uM&K/IrDY"S@pHFR^U0$R/f#1!R?WNP))^"\Y<[ +Z#0EC_=A.[6a40[E,>i&HO&9^M2lbQ'5dB*5U0jSNdA?iHAG5M`LsA0Uq"=)0`^J& +a;BT#d:bEQh8c>ZjoleY6RSn]W@#d02Ti9WFJoT7ksFmi[WPETG1(SV"l/!04jZPZ +0o4,9:p,VQ^QtQ`'^3#0oEQUe_Lhbt6Vk8>h`M9dnDYAYg'73CQMT^2 +@#0=TYD3)K7b%H`0^bPD0)b>:MJo]:IrR4Bj3u3/5JI'GK?O8.A*N"mQ9R@>r.6_B +O#_'0.`Eo01QF3NpcJeA@":>obCL@X$>QN#1XO;dm*?Wf.mNXnofngN,%*(2!!@N) +s.M%\?Mr9(?iH5fY:*UI%"B&TrrD<`p6LrGp=-hEe\h>gMuLbD3jAXPJ:*:#c,KALAHjY5"_5SdbSR9]2+MW.3WRT"U3Yb"hU*DT^`2d!LPp#=m.c +j-8:GBnZM=_>hj`I!,kp+9'6i.&-'hrpFOfpXeDt+TfBi[d;bL9;+0"[Ni29r$r:AMp;"4MVd2;5"GWn_8s3&4Xhqs7gi\E^PmDJauf8i?"@s@QP +[t[,[0(/:@oLVjF5't-^;p)1ZPu!h9Pc!2'X0#m4/YhRMTaXY&VR/.#Zmg(#/u-$. +UU*(rX^j*Sqn/&5$n_jeUp%/2hrk,l60C[X%gt"fI +KkE;a%=526^fBWJ*ra6:iZGB"s4RE7PInWij]d.%2Lk6[r\#SZ^YjT[WS(4U\0DF[ +YI3qDjs#1`..JK`UZ&9(Kh.r++OX4 +e7/$%iVTYHHRd_)".EPr%[>W@+*I(N8'gn_#M37Wsp]b +o!SS*mM:bZC!PHqkA=J>h([ko./r]*Iu-b7-R+'O(feP5R,iVs7"DcYck8!`F^o6o +0\7a_9M.*!W)@j'&eCFtS[?A,G=>m4`]WO]rcXIuRq^#Te*,BskQ)d:i^OIdVbH_- +\q&UoJ1Vu1g0r][&(T'b/.G-T)`h";4BNNW>85do(uA:1fhr[C;A@Ts&+;+[&_D]( +)FOGIJa8cOejd$I&ac_3fN0#r\"'n1Lq5[/Z7R)68>>r).Ad*&)H#Q0WgnYt6-'7i +5QZ'q7c:^[F?bhlYEZc1P.It(D66/ElHicfR]3")f$`1"#B"@NDel'6CSr0>VOd"I +?5uF97aQ9$og&oO=)uG..b\B9g@+^!58^A]"]'IocV:+"f:oa_i+8aW*2J%0JqafC +]GU@[e]=Aca8Y_HZ6-6gIsWL3o*\.!k2Y>Z[c4+c/,lu*`UDA*gmEm^CL;D&0n#$D +`@5&k)p+6Ojc/nBrsS\o`s0)L"&MC*L'K_+Gim(E16+2#oo3_IRf>/a2 +hb]M9?+H]8I)5impoc$qJ(>pQ1a[CQVW-Q1:\pgcKnJ%X&j`snW;dUL/?L>L/7%@7 +Uor+@Cc<[^YqJ?)?LkmVe>&3NO3[qk0h6M(4aL]rQ1Y)\ql&s'KGK+/iDBqM^aI1- +s6lHbq.r7]o@)Z*SrN[16M1#=@t)&tk/T:X]CK>.eWj]Q>f(l6H22(h@ddQXqWq\@ +kEdC-\fCFg[4mDeJ,UADo6@J=IsQ>gaT'9cQU/CU`Tp!eC% +^RAAQ&W2'NgeLN?S2LP>(Q4NO'/DCSi8/:X+@eGZ/a^e(CX4&8`2Ck%<\`;Y1>>DW +Ru9$?$Sr]G)5R;%$a[YK+TM-J#5Gs6K%UUqWF0mLAGnGB\goR`W\]!;ZMJ;lqs1Nl +)mY3fQicXSD!_2i*-m#ll$n=FgEb#Es#ZH*V#Mf:S/GNpiW"N&*o7)F!_Co>$J'KJ +lb%qe)IMHn[fDe<(J_RMVHgb?7m8AOYEeFZE1LU4c'3-%jQgsa3dj3eIo62Ar;XD/ +o>1H=:E_0:qfiG;r%J$Sq.'H:MgsRqCrM0`ikqK"3!+1_^/eI:;=RTmLk'l,KI7RW +AYORo.&6hJISf!Y;qT,3mE#M7?.gGCR,Ksc:b-%["\6?P]aYiBp#uJ((I/@i5t8Z, +kn(cIW4SMOu@8Pk+\f=9XZpIp#S!5#QLYW6[m +&,nL,lbWT*?(F9ji.#eH^DHtoIm>N`dRu)bdOMT!at0^"MCNH%8uK&E,H^OZWr7h/ +$';p!&X^tQ!ctqr0L%SnT@1,us!NcmV"mUL0='gA`>!hT@*7:\l"Zf32,-(LVd0bI +N4XN>BAJf#62j&@"o-th/@QKh8cKa[77M-N;-QXtB3&KgPZa6i7VRuN_Db#C%H9^, +YeVO.GDc"3A^!$So^06>K;SEBp*H%gOUmFA4usGKe6L)Ped"FQ0bDLH5HdS,>)3)2 +7t#3:p1o09F`/B*_+?HUYa2_%:>I[[2@LdRDj\'[:tlg8XU,uJ#T>*!m4&Ta08XKo +%dteR)m0TJeqRDpK)@Kj\SALF$>hDnh,d(XY7PQm6^uNORRAtM8$N1o1_cqmdD[MQ +$rJ9,U^f\V.-+_I0V+*PA5YAJ"`<<)XQ.cA9BbC^<-L(Ic:?/hWk4KZ;,1J&7DH$l +[^2R:]9.-D"W_HTT'2o>lCjd9UKn_4>nYMeNmM["BTL66&-RKkUM'Ka!h]q:&TF-. +fr:XJc\6gp#pLK1(V832^U]m0g%iRUo82oU96b0#_G`N/I_-cfJ]X_ZcM/E7N#>cu +D/>J@^^q$^_>ba4][6bOBXg;e`#B`V$AS*p!Z&iUf_bjpJ("AXr+BI0D[3VT25?uk +Xfa"UVJ8PB-'gd[s2DtWm4E$Xm43OqdKb(S(B#m)=ub1Ar%B"!61JlTUc[ZgVprgm +9M#J*$1mTH=8d-RSr3Hj9ZS==!rfQeqXc-"F5,r_m%V/,O7q-jqR_M2miA9QE")Y? +]6+2$J&))VT+:bhCrCr'YJpG2#%$[!rr;uO;Q0L"q6.;L@G1$h97`/M`83NgFo*.u +A&?43cS('&HTdm8!If>?qPQh.nIr3Y)#eo4A')43@Nd:?Sdp85BZ*R@,G*a5roZuf +&'Z`?i/9\X=LuJ=0VM1J8CBA*$lQc6N@c1083f[nm'/2:?lQ_e0sA2QYJ$CPfm"WhVhO.bENDWi +ahTeO3$<^YIUW!r^$C0E0d$<(o%2R*#%tcc`BW>]d^q.6(?RjBn7SHoG8HGpJB:Z) +,U1$;.5I9KNQ*/pJZmZAlEu#A\j3CYWoXC6I,cIgD\NiH_m`nuaHI+?Tsg'nj@T[0 +P5[R`?`pU\H`W\od`GT"Jq<&XTYDq.@%fHnNPO?c@'L)i+`/=URcr\EXXiUg( +b+Adumk)lOX'k['EX&Ps@"(Cirb*P5/1bKeP]u%G5Eu,DrY"O9WH4jTbWd__R$(Or +.'"_nlC\:\rt?saUd3I^s0;M%MuUWk=T8#?1\fkW5h>tnJ%`9cYHB2MJ%#S0"*!?4 +ns:#31Z!LVEG@J&r.L(7Jale9G& ++(K$fiD3T2c_c\P*`] +A!pJ(AC;0%FCf&IH)"r]=]93r9[;i]U5 +>k5gb-lu_7nWs[scefQ;_R@N%GD&/pSc8P1]P-BZXn9AGUAnpjrUD`GO%rUq)Q-j5 +:sN4kEBQ@Y7/+ejerBrnpJDnN<+@^io'"[Q;o=);m)6'4kj_ +&Bto^R9VS"$o&S2*m"=S4+d7+Z[d?-0iR3IbF%_38;rq'S_,LDVn +i9&Cgq(s=OVTqUK2V#U>gBn"p701j`Zuos0%HZ(kAX%$HPl%L0]5&gAl_t+.Bh)@k +a'37jH3,`/#!O<,s&ML4dYaV6-^G'U7CNb)a><4u^(C"oV:Q@rW7;%s02TPo&jE,ci.jc:T^Zh!<3//Pq0r7s4s5Q.@k=VH9,.%pLFd,A`>cq +mhYruB!G5"J,(Kc.q2U+X8Ij^FkXc>QA";$jWN*/-=\*d$%%%od%Aq;T@uh]Ft<6^ +h*J73UV1pa+0,A/;;1n;W#m(YK)@hs)0#I@^n"Ci?^qH$qE-t##GMdjs/uZ:_>iD" +Mu2X/gt.mZ6J;Cl`>,l./\cE4=Sh!UfFR/?+9F_j)h.Zh-q(k;=2TN8-jonPYD7r: +jW99Xf>Fl3S)5Mgr50>%Ic81CiGTbEI:64P?akbSYqGC:RH565b7?[8gh0=SajZ3C +/B(_o8<>J=^c/T-Un91$c6)E2oX/YL)q\HhS;s')[`[t!1.H=>UT"ep5U4YXOM`0Q +q2=`lkPs[o4@/g>rsptB+9G$dRG`Ql2tLAURq:8R):Pb0G,hj]g>#-sYAnU7\f_1I ++TfITpW/sglcGd8k3#LMnps@[fC.Ymlti"Gs/u:k5lO6$SmKbBYJn8nPcloboaW%a +hrlO8-i`p-7_m@L-T2$f,9WKXmP:iTbi1*04%mfk@^E2T@P'KBMG/8s;3B8A2s:Wl +>+UbaEJ@RSR'.41 +jf:G"Zoo_T^/E-^R=2Th4]VmOT9N@".]V+#CGtDA([HPp!igaQs6ofV>knKaG<5"0 +p:<]m>HA91r#>=:K`#WSofk2/0.#":b&t!^K;.'BX"m9s9[ZP>[+m2bZUd`[nd;k3 +b,;90X(s)ip%UX.n3=2"G=mpae1]&D!Pbn)PlE#F[(Uh/ecl&FEj\3LIrG;#nCc4Q +[l=(uFb&@U479m?+(,.6gM2,%.^-AqbRY8o(k_i]!/n#0W[kRC.r>&3Mm`]bDcTk? +e>&OO8q>BmHqk1sfK$[2'r&&%UB7bs:\saL)*&U6$uE +.B!NpIZXR0$L"5foHQ2OcmTWc"->VRBk!/fSo.401p!RR1T2c-:!TPk=]@sN9pSLT +k>2Vu'K^]eI,s=])%L5HNM\^L/g%4STliK)R?+eATKUi4@kI?EIImbu[,:,p;\&HT +'RG0Pjh4s`p(@/ao>+e)%gDEMG@g$JQWJQ]-0^>GaWI-HI.'JObD27PhNe$6k1#/u +;_NEZG$C>Lm8MLVT&V5*fP4_u\NDe'^":`CEePP+r/rD/pbK`0e^ +nTOjD07t.IrY84d[8h;]!AqXR^Z#E[8a+Vs=`K\)Gq(rc+Q9=EZ]=66fR1L!J=c$T`j^Bp)iT)8f`a8W9``!=d'rpR"#JFbkG +1[gK%dTqQ6-1k07'E6;pW6Z_n!:[b-M^@W4Q45O5!i?Irs2kBBgZ0otK'?7@I(Gh> +F5F!h4)=$'g@NlT3B.(&gdMM?F5T(GiCl9m'+VJ.OU(IOg@@AW>k#MGbQdlI%(RL1 +SM!^5bm!q'Ps;iBfj/RqDs"(%>b/PnmjKIHJ%YPh;?#Y;B@6G6qG.O1,1KmbJ0Vkl +.^M0/M>^6saRC.aedW)Er_#\Xu[U,E#QZ@0\[SE%lBZJaD +L]]pQUnMT1a.fAj.ILd*@q<.gUKq#SNi\q_$jZoJ$6TWNl>Zrg.F;/:m&ak2hueRe +GJW5;4HP&:e\[guZk!RGjU]u4"LSDCNVT;\*gHWGG.tPo=Pm%l*[nK,Q+KL9IDW!U +C!E`RG)`MF]s_gb^4)!Fd6CXsS#l-T<-uWch#;&d[h;g85Pajd+Q[ONeUmTgT`->; +:Wd%FXoZW'TCb?Ns(eGG\G0-+)s('(=f"\j%Y_8m=pk8hKYH=5B21Y]5 +Lg/\X/Yr4@qA(bLagemPPWtOb`mFl#!2'4uVF=&I_ZugAd:]NS>3e;:)Sg-j#(3(l +>7J[2&&0CNmkj%_&'3X?.)k?#Q\"u"L.](O)Lr*tl7-Z)>/7/;YpsL-E_/kC;SH5P +=ej9uCrOUNMf@2C#Utl=?::MPqXdk(!je*.m]Z1pTmp:H[1@EOId8+S7HtlU$h_k^) +jo<3rZr`pk590=@d/Y`tP9D$=$NBO*i6@JX>GhNd3CWu7/5F!!084h(-%^@VZJ^4; +r*PK_i^3#!ZSApaa*r8JaZIP0]QJ><)i%p13uIeITs2"eKYMjr%)1Z%1LZn^N;WBa +fT5eZ!,_i,+Qul]Ga[dgAWS%,T9$O..cR!DTeGjBHY.WCPNsHC2]Hmf4Q3A'@D=[. +PA[3mR0gj@I#KQsjc9lfJc>neHpLiM:^;3;-,6W4^ScY=8bg'.K%4&IC4R.NT@mHT +Uj"@`IPQH!at2oZ.L,DdZa2E^UE]XQFB)lP=As@1TWJ+sHk=kJ$Y-Pr+mR>WbK0ul +C&s5tr+Wk1J!Z&SeRjj]F/CM!1H+rc/U,LVL'UoAcGt/h^l4aGmE1oAYpWh&'@,BQ +430Vs.Xs"!F10>XB/Sh?of5K/NaA?Ye`Nkh3McSOjX0*loEW\r+_' +P5k1SK'i$0s0V[(SGil2mO\M\*fS:%E=a(!*KFTV2NG2tB#0rH/>bb'&aqfil?F'r +f\>hA&USs5o;enAasr\9kK2&er'sqalX1U;A$+ +`Iek\!*QR$=lrU`HF23dII2^%DUQl;9^%uDqBhi;&O-^A^TlI1D?7a/X\eM>o0N@s +Y.e%O0*DYFPtF>i/^V:I<[O2k)#`ANmcfK7!nM*mBo*a(UqlnE?F;gld=a6 +p]QcNrUECd +j:Op"Lk_j1pt^bW5p;qD;,@co$)TO/L5T`t4l)ndpu +IsVF3\Y&HWnXqO1LOfDS\:PNHrbt$^lROE.c6n'_-L&e88^Hj$qTJT^hlKHS=WMKo +lnGT6P-;.s1Z7-lhU49K0,<:.Ii]^Hn4arruIu4UQ/oP`g?[>2YN1N +U7]"MipU)_59`UIfL7XY5$j:;b&;'>o-XtBV7b*(((0"lZkmeu/XAF]]LI8Q'/M0X1mk+XO! +Ua'+CUc5"'ZlcM!*KkY*0(YlF_J!`jMGVKZ%D#60>R$!,sVJ#9.`b>#7GpkNRG +ZA@HMe#?lge_/l1^EIsPS25$,JbgI=#af[Q0Q-S(+oa!(m\D'4bMSFLa?Q#U^Ve." +(ii;2QC^@>b5qF>eCb03js[VY/U8Y*,:L.%<7JF +P%P`0fm3rt0?f!=Ls,qN#Raf]1(GQ3$tp!f3jV<01Ig*)"DnQp[UaI!:a6&ZCg[`2 +OOln[\%qc\LoNRFY_kSK_]Gr=L`5h19fuQOTrPe&doiL8.5pjc6.t]B<8b&h>WXI> +?a"4sUi"n%C'O:eDen%dCu=RDpilaJq)^\Ri.$No')ZZleW?8METM,<[[=,>VJ6a- +Z,WH;+llu>nmD%(;I6&YQ-#l!J5TFBQBc7H3!/aCEf?_,,![e31MH[$IDXAdjm&:Xo`C>;DSl3OrX]2X6kD2% +bk1s(!!,gqcp#RGr!Ds^fj=fG5:M)[WLB&9R,>'a=B)\?AW98YXbTA8>bW&*/Rk;M +S3*jqhI=R[DbiI^8[pLcjEGC6s0=*=q41/bg_]PHiK,uo"M]"-i;Ird7q\bZ:X_Os +Vh$.EO6>c::=*o#&,>'ri&_/FhgcEnJY'Oc4gbb_5)FaM6C09gP<.E83IT@YTYHh* +CdQ8o,VGsQnH)0?JKoG+ip8oBK.^IF+ANCX/Z"Ls;MTiQI<;gZu-"6oH/e^VDl1n9jl +a\qB/<2q^5U.V8\;ij$HBp4W-)-Kn"58.l`6jF\$)rX:EGXM"Be$M'CU%e:YDBB8_ +@Qs/5M_RG&`Tr#&\t06\^_[e#5<5)*m`D8k%OODgJ*Q&5Orp,b39=JSa-+#7^!\4K +"@#G3Ekpsn5BaV#R.f?gtg_4mU68+ls5Bq:i5Ara&fhgQD[0[i6/R6af9Vb+GN\ +AqU*uRV\r&aeKo+p:lHdq0DbQ^UO1i[826jpb:@or\Dq"m`@617%&D7'_(rl4h_Q4 +(ZQb0HAV`qM[t''KcWa8a3Gq">.G\I^;n.m]I&ZnO@Sg^T+D7-&Vab^+WFf[qQ`N9&ThTC64gN#0-2l/gr(1Maqchl4+[]Q +Eeo@XF%0nba6M_-_6e.pjWn(s6pi;QDR+/QYo_B5h,h0r2X,#.]9P7*;GV,5@OPS7K;*O +Pn3s=J#fa#U0bX2XMet6XAUDpf85C$s$e`p0$Y>90K/2Pp/od=]&KoPa#u0soAmoY +s4P-YKtY=+*"%/n=Q%p]l0k1;I!D*#o/%2hJ,;ptS[/@4Ve;s#StUXS$A'Di_^"gJ +%\Yh)UDLD5^Mgp^I/V&\]A]ER2$P$ud'em0VE0jAJYF]jL^N>jSD_5rck0lo+>ZQm +1/O&H1qYAY+H"_d9'Zt]FOJ#$W0r7+.&`Pk=s*kJl(,YAXeCuf0M6[;V'?au/YdJ: +:qMl=mE):7,%)-+kZpdE:ITo8BS9bMKdo]gM,L;3'I6I?aqUXC`XuTP6EX=%QAtUf +T^r98LR$@:m-*+/g2!2*]=VdL*"DmV55a/nZ/GYSY/^Kd4mDiZa^8@Hq".h.qkrGq +&^V2\Org#oESd/n^=oY_ougFsQ^*/=l#!ajZJg<:c_c*(6h@E8gOQcP27Bk +=2@FSrbsC"^EpA(4r]s'?YfD./RG5O!YKIk=TWaX2a,Gl@g9#8DAZR5r%O5<8`K +m(OYVLVF[FNgI7&8c^V1i4Y&@A@rTnpD<^T72*D0EA)eR^SfHAk5&ANEG%IcQ_smC +cFB/,\)cA!j"n$tVHfHBa/RC-CNJk-Cn$;n;)$5b/M7$HFRjP0KuVsN +bLW@#e:A05<8biH@?Ni1TJnKen +3t>dH_n\^D7)^l&)&ZqkfXD2$GETIVle=G.lF?GR_O4^V&Z7.P[WL:dP>J= +<)Ueh@K?>00bcL!U#nnq(5k5>;**\c*Jp^H +#se]9Uer6<\l1')&IbI4L/Y'=.?qYZ,Y4d<;BQ7,,aEt.JJ9SU!JY.G=GV8FUbTebk?WO/j2e6TS'.:G;N +W$-AX/ph#,8L7kTk#7[sfDM&tHCf\6*!*`1jGp#e1'/3lq01GdPJr$$"(n2TICM-B +YPdb4OS*6PnZNm?)PI'G1TZc>oKVXXrl6u6r/W3iK`D!oQI!SA=IJ)sVhoDss0Wc" +7`,9us/U6X[4rb")Y68oGibikUKn`90@moDHTJT-;sa@le`@LR)XQB3A4CZSK]PcQn,CG6F\/b2IIPs]a\%BgTs'$KYi.&)8_JH>0 +=Xp-?#Pm\.V)iI]<`?#!PnJg!$iY1WZtp=@rY;7/_>O)0<&%`4.9&k6.TrHKcIXP( +%E];Q'3mq<_c[S>PB5KSSR +NUVGP?!9f!6e?iq!C3)UC0d]OLS<.n/$it`8`p1fD37\N0p-C'%HUVr3F;JSn\KC+c%Sl)W&:S4lCZLjqCk))CoiRu::DM\8gQB6U_#^LE. +n>lHND]YXeGDuOKEI;oe-`7%9.:Hkg?_!m=GohBVJbJ2N3i'P-B4qhW2il>Ch\Yq= +Nh@1H"oWR)i-0(]YKZ4#$6:*Rp[uqIN<.b=+<_9n+4eaDlcfk(=WQ(_)VUAhg9Wo; +-SDVbRbf&[km0Rl6)Z(82$(N!bhjC8D[`O#78TGJ.BRTgI48o66/Uo%O=mU;UA5YFZ>Wf]mr'Oa];<(Bf&Nk9qR%(X3l#1g/1S4n"nm&U>MHe +e)ReO2k[X(dVg-5rVTX5[hk>qnc-pN8cRsCb!0g?Ip0i>qf?I6&[n_^1m2,a$l'V^r6[g-ZE4(0ZoX"-4TRCYUEtNWA +L>SD[]mVZuf(#.%O2\b[39JbDZ/GY3limFLk%rj +D)5d?1bbeLH#>Lc,VN,RMA0R>nrY^'E2e3br6H2R'F;=\,@.t@Nr6.o[\+dfW%NG$ +QIT?ekc#b$)n6gbb@e31t*epFNUoEat0`bl.7]h#3LRfHd^+>s"@,u +B'_P,%MI@&S`.%5I5ZW;rGV\e&H5aH=W2.[>+_]IjD.Fo&f#uOOq5Mr<;n47J_@RV +J&;5>+Fh0eNc@c-!Ue'=cW#aF\eNBWSLPPM.UE+E^CZbN0:\Wl:JL>Ua"]@`"i0ai +Q[h$\kKWe3ZTdf9QS[sDXBEK45O6-Zj!CdO/^oq9B@<53@:>.bZb9t:a2E)aE>C). +!SJ&U13LH-c"O\7,XXT1:^gsP[oCbq;"QH,SN2Q;I+>O.2&?8aCHC+ZY'`TT^3P6E +*@c#ho)6Fg.;?bkZAO`n,F&-Ls1PSD"7D2erm%8Ph8cF>:X8X*?8ltLK>9EGjdE%I +q;:Lf^ud0Qs-mk:->PW_he91>)p8Q`QY=kpC/qN:;+sZ.Yjc4edX1p'^Ibd4V$]Qg +j?]bC&Pj`+:e5gB!T8I5"i(N42&1:?NE]a[Nr"7aIs=#VokqYH$PD=\R/H[a!:>-W +c%+CIom\KZTCb?Ns$Il:f2l(^AS-(i8QBjY5cmN(X^hNWF'#N7gFNd0&X'71jj#YToaJAKtauA +jOpqlJ+h??A&APZ*>>-;"8&SD?t3cH\0)L`hjkM1Po8;`3j^[pUcUTD-U,%eBg>HF +XXB"S*KD6Dg-\_1#\jjgrl=SjU,GNj>%4Ggs-BL[D)l?ha7=.C`;[dhOS#mZHP6s^ +"g+R1YG;M+i\pqe1aGklWD[I,1l+`sh/\07&'fH=IoU_u7ED +*Xi#5Cs3EVQiD.b&aKCG>u1D/mfH^BCOX6,7om:,2rS[Z'-CS>:OtLg?FJIUYXXo; +Pc!c"f`)Ss)LoU'AGq"%rf]kK?TQ'?Ik"j`>Q=GAB6UgtJcD5*;ok@k1&4CSCJJ+o +lG#7[MLU^P+;D'L+oe=j`6E2pW&M+07jlV'f-[[YVaiI])O`$h6Eq0=dLL1\eJ,#S@&YGZt_>o\tSTB$"K[#"4 +#`)D6i;\j6i(FX<3>25CTstp506qGBluW'`LhA8V!VV8]Zo8\FNS!lZ]lc%"m6_Ef +&-jA^*!h+#G]@rGo=LdtB3XGh2b!Xn:$AdY_QT"j?Z[k]BoYEPNSe/LI@i]OSW5_0 +@h\k)X2W'9J&Q(]iW!BV^SJ=M,(R=p:u%3eCr-d7a2l3!&n9RI$\!+*59KqE=@76+ +K[9ZXW,nGbcF4oXop_#>G$_Yt?`P5]Y:\.k>PW;kCN*c7cMcPSSr +a9VeGA+'2Cb0C.iHd,]".g,_<,N_5KIuqE>TCniUf,3.$'2NCM5YXKRJ&)(,J*_Z/ +_7fhlp^9[n4!tA?PD,T"5%rh4>mu8W-YA5_B8\.8M_L?B?tQDMK=)6\kKQa;OML%i +WPZ%g'*W0kH#*Ak[H%'%`jl3U!<+!g_42=i!B1:jXutofnGcC5/nBOjb48\S&.g;+ +Z>3Q#(!EUf=qiM-"Cd*tKW,_@+9b^H9N>H.VDhT*SYt`35f!ubLRK=/DsHM:q&L]6 +c;FRo)!#$.o&$7\o&!km-Dp`YLV-n_`k.7*p7.N<>K>6 +>iL"#!_iJT%TJ7m4E&5<3)0>[6%@c]gb!@3n9rF+I%LV8[AKgABaMnU*hkHT@t@Up\X4$n"m^FJG-ukl?aoBmiSHV +I$43f)-lc_FcQIW"b?I*"n]^C^i/@L?_!d&f"U4cf*kD>\()0R/9V;GmM)52ri#kRei>,fIF^udm +[#tbJJ1;;%#p@c>0QZa`@]dB>gKW.=3n!o:O +Sakm_QU:6BLCIZfD[Ci#BCMsK6Ja\P06$jI7)VUe&KdX*^]U3M@.gJQV^%#XSO:Np +cbd9o!qN2Wa7qU`hoDpW:Ij60O1]`nqSV@@3!'T1]X^9'p&.akm>HYsil+&hcgM2A +i5#kr5=-%L"Mn?=6")5'WM+-6A;/@,$Us19ikV\N\t1G$O>UG5->@ffgc;b*qhdHblH"qG#t +EV3q&_8=Z*Gm55>B]n@6ho3!L$HS[.1d@;@^X,.61VUs4s&@tP1`r*P.[Z_Y"K#c= +Ve6"dlni>B*nJOLXIUpGi5^rBDUcBp7L)!I.=qub?IK?C`E9O#^Zs;33K?4qtA6i-&X(-R<`C4`irqeZ\FlN +1h(((,[6E8QC24&Fpr@1LRC')@:nZXbm(n'];:@IIK/t?4k8($99,3nTAMZ,Dr4dN +]S5pk\RC,i51`cKd9)S?rWdPb>`Besr2\6+Wmr&QarH*ZgNF((:m(kj?U7af?s.n@] +?LMmX]^BmTla]L:q`<)V]sL97LaP[=$^8NPqhWj:dG+8KHr6.%eRA;58*St3T2*a_ +3^Ea1+(]hLM"^KcmF,4t]a=>r!.(=Z4kY?,d%O)FickWDD@^7@<^o`bSN`SfNC2gd +%OE:l"[VeY!(K8IIK"NtS,[\Y&_fIq2Ks8T#DVk8]%mbMiJkYQ48`fgr+R\\?V_;b +Z)%Fs&;1CC;,K"s#t\rLP%cp%!hku#LY,IA5R[f:W>b`ml4^0`J;f$:_#?QOfDg6.kkX)JkA9k2Nd_Q[_ak]eo!Knrsg; +s%r!q]&322)4+Fu]=^,br7kW1VoDu8)7e/\I]^fR@Z/jKB&=72I`jSLZ_jBe6cc2e +FAN_+Th'$cV)HKECEsdD0iKB-.th&'6+2H=6On]'-.SF39")6g/Lk09MUI3(WVkSo +]Nn+Yl#i7Qi[]5k<1X\9)Va6p=tDa?[,(cnXYdb +s7.1-Prg3>s78l.6tK5ks.e3Bh]R_1M5)WMW*4I?SK]!MDcOi/s1s&j#\[A+5618` +q;897U\q;oYP93Cs&::qr71(3N@%#paT2?nq#QJ+%H[noZ&cVbAXiLW1]ONp%,3-/ +qBd!Qh\H7Fr,#T$r7fr33ni4O-\b4?e&DH8gXuS^oX?R,daspRh$eJ2LHF-Um4;YL +NB%!2\"o4`oeiZ@1a`5?"LUhg29B\Nr3,!o88?X#=ga+ZW^KAYM_)SCS6urK6NlVQ +UU?@Ag<)Bl7A?qIfhe)OX@P9MB%0helT&*K:,^2.?*_"2FqZ2%0q8*Cq&o]iX[S$! +MiW%HSEL.P=+L+mNH*9?n3R''H<63CYqCfXnVqkVNUf:_ruA!862pEiq6L5K2IDOP +`BX-iN.>a0T#52\pmFB)O'Tk9Q<,glaqMtA&qK8)ABOrIY9?,9-=[!n"FtrD)B5.p ++;$0%>AMHleXGp)1#>Y7LbSTA0jJY;c<&k=<8=9NCpfs:DUp3o6%8pM^J'dsk*Lmk +J5!nu8=1*3a9$Xa8s'5Tf;U[m<*P;2]EH:Wc%otINV94f`MOQ!DN-KZDCiXkJVl3K]f8XDmhD%*O!Ol!pK%4c&-m?Kkjf12Cgg#r4j!Okjkn@7M:6gHs>n:,p?n;Z\J(WZ(8kFiss/$85P +l9c&NK(l9s3[A,L?4=3MK(9W@,qlpW>A4GR,`u#o=C%L$[Kl;9465OBi;]hJ'IY6r +4Jt0DZllM^:NYRhd/5s-o5FBL]A4k7%c@3O^'-SbMfsf@k!`5b7TG^AEQV`MQ#W=o +7.P=@$G"$EE7.CXo"XObTo#MRGF/(2aC\^icJ"nF?/;]#qTN3*;/HGPf +>(B(j]Ia28-;sgPqY3+"SB_'\?*$=28,6Mo8lVjS!0'$BUIipLdrd^;Q:.W`CQ4`c +0Ya$X[ntPF/1CM6s'U;=9TXa@;td6h=nO&9s-_FRM26 +FibZ3q!iR/.><.7OGm+'*H+q'29:r['JT(;NSFX]2p'!02KR=uS;^VmX%A]7/BVZA +j`X0RFXsm1W,4E>iE5_Re[rf/3VQiH>9,NbY[E3;9mu2S;U>D9DaBS +Ep](DRR>4^)^ctX8rhbuX#8t"-Xc'beCg)aA^W,k^JN.Kr6OE0fD$G;alTc-%[U>C +af).30.fgG/VsSFs*+[b8[8(u/7_A,/1L^#Z5aF`7Y*(/XnkgMWXWptCH"Tg!"iTs +hI>'nCsq.F\jRXTT*q[NagYrZRr#$7RfSdrP>[i"QfL]VD"qYZ?[O"]%1ij(+.[th +5f/[VfeQ\Wr2Ze2\QUl3IhVagAlAO!g7'#Q>HPK=:$S6\AS/7m]hOX;V24S?`""7A +7hhY)Y^J"9"'Vm>_n+l?kIYKr0/bL:2_qPFTEdPLs7`9)7aXkUZ2`^O615gZ+"a/3 +61kJ>Y7@7E%h[^9FW#V67!rtSI56HLeUM'/+2%/\"+!q%:M`$uM2p\kg"V>A>Ztn] +boBATL8'RuN+-.?JJZK#6G'pETR@b@^$m3fLk+lS!o='!LGs(>&!fH!G!,]#Jc,+k +k]lk9Ls;P.J-"gL";-@(p^mM1;ZB86\5@?6[%016Y)[(\PA&37U44DV\e?Y1Ti2qQ +;.b$iKH>!+5MPGl_LU+YA'T#ZF+&DdrS:V;pZB-GReD/H_Z.T[J0tR'*q!<`Dhm6+ +N?6+lOUM$,;0dDU0[`o@.kaO,QDX5O*Bm-F35nIZiWN"j4SZYu7mOB)s*4&]Hru\: +Vs +59;ah.)6c[aoj.C@2sC?%>s@EIDUpd@(@ob9QT-g%_mer]Up*]qo>qYWtUM39f]r" +hs&%(QVWpuIN +.H'aq4FXU6euSuCp710tF3\^K3k[9.q!*h$5PO3gU!J[E4[/4XUW<70]@Yk5^;k#; +%[mH2[6`iQciHRGO$(-DRb.uJO]KL?p%e.CHR=#>p'L2Y&VL*XNOd^Aoi\*g +Z2Xia+\Sr\U5hI(.bNgu#Ad$36?+@IT9TA5s5=1Z?bkan1H<&>C2R3dF\6@N;K58p +ED]D$E@gn"WY3okPlIEiK*]93(`$kWUWNVeb$4qhEa5#r&[4#,dVR=32hS'N +B=5:#>-_!OhE\eUO=M./.`<8SAE$jn-qbc.'FWOpIQEOZb2oFOn$[?7uUN#lY$O)tt0p<]E!8,jDl02J6B-dg]GnTOGp +bS-V"m?_Kn/`@q]i;2Ot5#LX`.J2I"H>&eeWpjG]HIrV`gE#\RTOGJ='!r8PhIretg?q>Gp^o%O,AR3Rq*,CV +qF!NMr5jOTO8t/i>cpPC:.UG5C(Mk'+PepLK9(]I%)c +&`+lDCZItM.q3%cM1Um)m/PKjDFlULIn:XEs+DjW!c7i`:]?f`'Bn;$o`Ol)F]7&ae]G5]uW^8@Ad<]NSH?!qTW&R=E)To7>ic>b.]JR>6s*kFUQ]%#L +P.2E5A?.bkh\GbI"a^+Q%uqE1>gFFIrBrq-SQ\#18'RrJZ4J%Y"=l(Zo[ +T`#%l:Zi`^>&_>03`(V0I^\V43>DCHltq,if\t!uNYGh@Fo(Zrh3Z/%W$fGh*aSNZ +@JA(YiEcNZkb&OGM_ST"-0Q,n:V'lESB`h]fo5PqEE9pHb%u,>a,3X +\pu)*a>?lqMTB[p*j-*'MO2Tf/`3K=(H4ba,7JR6RM$()W; +\sf+cWQ(i;.*<37V0HDTJ=eEZ-W$nG2CXOtPf3'LUUc)@eHJfMq2lD=_TR+V(@;M_ +gjpp.),db%$pK6gX7IM9:0on=5D!5Z[Hddj[JgF,g\bD'Ni\F56MNI=@[kkeKHHD.>1Yp;+^t +6W7$6A*3(#LXk&$C2@;[9s(MZ2KijTCIS5!p33fh3a"^T-ZbrM9ek;<>0BHT3\]9S +Z'MYDk!\+a)=PhS1"r0&N-(o!A3jF'Ig`-W0t"J6Xh-3fX#@B'K%IqaRSl3UBl1Eq +1'l<3<9[5;2Ck.HE]28scgFcpp8U(ECUX]kD](Fi2HdA'?etEYlRjmk@Vah@>JZH) +_W/t3RRd5;KHo^W@>m?Qqd9HRC3At)mf%:fBQ%t +1/fB0On*.eoflIGP>`T?IK7"fJ'l':eQ#2+'a\HJnR2?Ziom\rfS]6EplJFFbU*3` +70**iJk%P`$JC=:0hSCaZ]oM*0M=%C"J@q+)hC^%eOHqZDp&RH9KbRohI4CsjI6;e +&n*[@(1`QJ1pcti%/^+:3Z7ssWpu\^rf@0n'E28_Z7MCf8"nY0<^FZ?0l-=6_2\:C +D2-=&L>5NkG*a@f7%Z63:REiS9cGi=$\Agi/'VU`FdD;quP)];O;/6"gZrY2%(Jq-)a?PKjks,q># +)F7=jd]9/-Jf)'EL/>o(Q;l@sKa)Ii9l29?MeGU1m8$*AU./5/N;FM5*b]P<[+"iM +*nR<:h4F%;pLKW2UE*Z">(*PUIEpF@T!7uB)nbko_[!#HmJQIBl3MNX%+kc&NEDXT +1AUaps%._15Q1lB)XrVo_+UMsE*6V*Z62E'kGur'2ALI?$J3goXK+#G0N\%:/,]#S +I]B^Ho($1.7>-J\^uqVQ,e.u^LshRJ7$BaA8JTXT$QH4)4Bh&t[aG+q]AJ6(hG#P4E6`k3q`\m-S6a2XM%JY_ILm'I/#WMUB/F +Z2SiQHm"&N@ZWT1n9=U"B<5[=07CJlD6,+M8qGC8o\oMnTsh>EQLoajo[OXHJKX0a +V"^8*]1m!F`q1kcZW#38d'8-S>um:MVam6*Vr'2,h_JZPH+`:Jl2#8olgL@Om[.qL +^!r@_glW-<5LEP[C7t4%iUV&bPntgK0CRq,SIsY$5^6d9o&)g%V.BbjItKW%('-Hh +2Y^XUc]W'G1*oRE"'^BNRH3Fa\PiH[o-s\I=TUdQ^HdkbJ'kd]jJo3_&3adBZm;N] +/.V*App^'k_DVQ!s3%73qCE1A$!T%$o6I:\Th<@Z\sP(9i@5jW@c]Zt(haoYpk\Q, +<;qA%5\N6EW5K8_3^EnqGIu7H +XWtn>!+EOEr:ft!H%*+`rYV.#f?-=-ec1m-Z2"KXi]nE:Hj-0"%)3BD76ji]>nG2@ +`6snWKK^:(1Ju1^1jCO>fT'S7m?Xg"#pD@)T\Z`V^M%`!>3C:*e`D7\.r_V>h3C$^ +$T6e=%,Qb^^'bjoI<+d_BkW8UUk'JZY7-b-_o1K(:J-g9r\gFpa)dj#jN=dh[B0Ir +Hmqru(bRHKeJ8B-$[jU\?IiT[f$\[]AZi_3DZ/,O3r**!I.&DR?Tg?`^^X=c,,Mqs +OW[XRacsn&A^Y[k/>6Afe"I3i1'LJ(Kq>IA^=_FlXi'J`DYIf?S=f7_]JN$h2G/I7 +ddHKOqfhcp641B7hr04dp)iX6HoPX1_4:IZ#9;=ks,2MQ?S:+5WVrT:,>a9d5l2oG +hk%4PmZbW`Vk(RaksE*2i(igeM030tTL-J[I'S^'(OU05D]\\nJTVM)02-^U21=EjF[j'!jfc"S`WV-Pi_+W8YSR_MUm% +=a5'\BOt%[GsP8@?9hYB@!P$D,XPK3L0GK);">Ef7#T4*V%o-^j.u^M8bkkj\`#Su +)#2u6#_ND]Ob?Xb!(;?;'+7Vc?j#I#&Pu,0dDge/*('^2m#%lQ*Hl<+"mbe>!G%J6)Fqb5]Ajpf+fH.0!/ +o2s8gM7QohlYk\4E5u5DpA*jA95T"cG8;1c/cb^>*\7EhT-(6@q-T]Th)E6dEBs0C +U@aS#o#D6`/M0!Fk%r3?:sX_e33Ec/F00o>_PnY\U<^nf1-?K:<_ccnb(5apT9+4rJ`.:7' +"9-Ioc,#4BD($YiJ6[[r4list#6=dfAcIYcai=sljcrC;6i[>j`"ReKARB<6_>8sTF^^&@"&@AAhUUP,U!`gZU[-GW +a6Tj&&%("SeBWT2G`['sE^$*]io^49tK*)7BrrV?S7>1", +"*@H?[.d%HG6ZHqS`n%)oNViO6;)f)bdak)m[eh'ds'.LDkbL]M6TIu*Jk]d,Eip< +m6[#jTkXg9KfpnoTOJ-Mc\^<76A#Od])]4]'CGK_H[JY]5K`_u;sY!'ljBQK2*_'W +n:*_8]eGgCc$Z2B?dV'%rBU_(s$]]^_>crtW%\@h%T"$;j2E_u$$M1/\gA#W;c.$O +Ndu\MC#dt8p>r%OAS@KAG?F'J9^6jpm;b\^H<0?T\)-/HcL["GkD7,j612?\[XMKJ +5KNT,nq1[:J\&uHAQahn,b/'Y"U.+jgY;X5?'8#iP(`RT_bEEHV`9N7Pf,/4k7tuD +$_l^9iTd-[;itEmTkAGOCKHAA@"n2c[F5iIH,%F;6L$QXo,a(jF\;h*,U!q#PZF:s +Q_[R+qUMl.UE[ET*SIJ$RP4uj2$BFd=Eh=+oDVLG8%W&ul#h6EO*G@=]fJK,I11<# +DbeqP&-2/o1>\L4]YBL;.0*YhVt1Cj07ip>^GtHHeKG1E51gq#%t&TV!VlX2k/S-1 +hjnA,J(ik:1JU0kjo".EY!8L\7mXg>]_]e?\o1BSIXTH9X.q;>*-1rGT\I'dDK!h4 +^H1B]&b+k[pO`Q33!.e9O$Nn*6r)@QN`Zp@%7qSO`+D0UWb45'RIrUa]frdJQrRqC +`&E#;KSd15dA5 +i'bYd_M$Iur5qiRH"_>7E+Lbk+&c;V;H4-^&5ldN_CZ2X'nlsO_hBBKij't(3W)j0 +JeP!?`IRurr$Wum24QAi^Q'CFjG-&);#[YrScYil,+q6666-Boru*HgfG\#sY`](A +<6U6t1Fr_W?nu38-C3?%,5oifX^fu61$e+-Fk/+lr7U`Pliq7&[?:#E3UL`n[Bq[i +/H<0.f(QJZNqAA*oWInHmLEi)(ULjar6HALbol,?: +r;ECY^s#mr"hl)#gcs!e<^L5N2*K"`VP$#$NhD^F9_>P9H86j/=l\o9d8oC#$Zig< +A#(Pp\n(+'V)$tq.AWsPYp)O`_t)ssdK&c$"_aOO:ZLqB\boE!r^(&!5`iqI-%Q#r.UjP& +!)Pi"+!P)%8JU?Dh@:+D\Fq(f0iZT'9`I +2a@K:^GLgSRfMX#hVCu?2hTtZ,sIisIC)7e]SJaU_L/VIrVts\pAZMhN"79Qmgd`P +mm\rhd@N(fa&U&F6H6^8p35u45B2nc;RYE\<8'_AXZ$;="X&^NTlHc_m0Gm".VX-; +k>F>jZ)8Q\5XL2kmgY +nT_'@RZ'0,`C2rn5n^m\9r@W0>Es[^[ig^#+!o\_.a8@LjnmYpppQEsFd4utLh_--spg;sW!(*L_cr6bmN? +s0=N?SgN')Xm7%lE.,76mYO]mo=aA,I`t$3knK3_YDj-tO/$nAZDVE`!dm+C#QFa> +dG?5MDiQkdo,hI=I"0r>LD0AGST=Z([*t(K*I^'4q"$M4J)0McYIiV?5.?P]mJTh) +\O.RBUqlMCT-%A5nZqHc95a4BHU%`3A'4,j]m^J&q-E;lJ%d`.G[&fuF6(&ikcpSD +@7s:LRFQ&rBJD31N6Fa9]@!/%AB=nS-FVHld9oMKf;I/7;erci(3PdCQ"Z7R;%'*tr(%\Y6Ga&h<hnO[\8`5Um`S5eSMA:)seq>.=Ur +CL_,K2:bh.;j_]AJ46)J0jshWR0$uDNJ1YBP?D+r7fFZtq'l,DS&i]I,I=3m'DrB+ +IoCE'CJ.9(CMH@d>%^?O=%@R\B*Q`3Q#;fc9%cG51?Y&B>Uf@?Nj.G&"Vj3Mr3ahB +S&bVBa0XsK@Sp?kkSq^f3OF\i4]1LHX=]3RNrq&MW(53S)1kDpBWM +*c&n:D9O&8a<%bON*8/62Jo"$\f$lM]Qq*Q[b9e)%^b(QhmWJ[a.=M]q3:eQ%?s\S +5;hrF3lAQn.sPH.r9uuYaT%*l8c\crdtCdlR2YQ].75-L5Lf_kJ%:jo;5T94kosi1 +5b,:Js-6o@oRA?GQbjJfp-G_#6;aIBR)%`.E&hpgQ#Te=O94qeUEPn&AbQWRKrcl>eop=oChPW$u<#&q?Q4qJ^lX +Z,Vlh9d/\hI4hmQ?#Ff"YMJl&%`a@:(f,8&T7V[0T6Peb]f8]4H&VG(FXHI(>k!5* +O$6jf90GL$KNEMLFdVt#."K#lJsZF`"[Oh4s*0G#rWrJ)55HeskT@3k-T($Q!UXV. +rTlGSURUW51[M%!m=lg!h8(qK00\>`jb+oQ1]a/`7J&']-qC4h5Xc)\?r--t8)XF' +D?Pt"&!ZOBnpGE['Wq\Y1Q$hPnq.h0Md:U1rckE'D;#M35NRCArnmW\*4"T(;QB_W +VMX=NZ8fEN(2;cj.2eaDe%eA2Cg,:We@L@bH)jlq2V5,!DEYV`p#gZ3QM:lTq$iVd +%9E8u<pA+Y4ei-!SIE@ad%R0 +ardf=c\iG)#uTgg)Y:YE7I/Zc*_QCkfn,>mU"TPqhU;G)4rS7J%=Y0eNq5o%Qf,d`8TGqG,s?+ +qsbr!hr3bINrM0#"T3YVe%a0is80GJaZ>=Z>]=&n^X%6l*)J(L*Z!](ol6&=Nd+J! +7DCSCrQfo+cVOC%53dWG@/\(4^sa;Ib:R.Df$Jj<@D+Oth<*cn'7PWNml"+^Z9`=e +!&U-B)[si2]&[%3'#\.J.]u5QA!'7`20/W'&\/]Pgfb-7BWW[L`=J7*_kc'A;,o]]a=.Lq/e*J?!8s.CTtKA]IRtB`EhZI1s!,A[o'/d0*L,>M>l4uf)PQ,E;#U^q +g\buP7c8tc8fRj3aIf2mMu\b_qLAGS?%?(E6MV]F"D.Z06P(qeN%BmT7J`WV=3IbI +@q,HsA,ma%>NJZ+r%lGH*EXG6P)RtX1m!36)tlMC[1WLSI@]X$h._Mtktq0XUBB#! +Iq@+sAO5Y:j\&2g_PP +CMtR)Jm`M42T8'W%]$mbF7+;%L5G';dk+e%>Aioc1 +N@?K>"%p_qiEA^J6Y1C*][OT&%X"DLr8"$AadPR_T/LAVS`e-JUZ +MF*a>fHLQDIVml'5C`9pSeGfk/=l1UG*FWRE^2Mfhle +)oBlW#@;(JJ#Rkp[4[O+hR0L&@p)LV^8K?#Aq\+dJ:t4Tb>.d\6)q$bkR2lph&YDPQ+\">0W$K^_.RC"h7cZ;.s7\M# +o%b.pf:b@!f`)+*/HCA0^EeJ0'XBL]=]spuIYGZ3#g`E?q60W:hin8-ng@cFK,a<0 +<>:E76Pi)t&47jTO?*m9j,kJs)3Y=3![En;c>ol*FgZ$fBA)?`g$2^aRu_]]DrZ#5 +VB+OE>s?h&^3+`#QM_kR?D(nSTQEu*A5B"7:D@_k$sn*`ON]4KitgZbC.\6!Ol3Me +U7nRuT9KKLLSWkk718fW8b[n"6E<#T:725A.cWUu;58lM3D8:m3knToT;u"jqjX-p1tt7E +7";9E4k3.ef1lF>U$/::hbCc1Md@8dDiC?5-A_Dod3j#-0,>SB??W((s4pP!S,#YC +48et.a8_ZPqY*"Js4m#>mgDnj\`in54`8#>F=6VRmld9B]uT0b9:in]8,\TqrGmtn +^Fsj2lT@?^ro^UO5Fh9Cp8$<,a*g-5m.8&fpH&V-?^p_8@ES%qZ1U&1!\a3MhUNKc +Zo)O-.<)p`@AGMq^lm&KPLrftg/XcmJRMI2cB-eCV,@Pti4YA7M,mneK/OJ]gT$WE +AMdYC)Drp%Q6a1>RfHNr1.EpVd"k#RJl!=L=Mb@[<h/6(Z8;H5Wcb3%0?5M ++bJ-=@7dE-/6l'o+fu6<=,2G+Prsj5/:S']PUcZLotO?ofn-mA[di.AZuBLO.C'qbl%gTCP42rDVdUkAT(H +TA2\;(\[i^q2&A7^j$WKXY6%`bs!hE4ZAlg2j?*SOL)\dH[ftZ^7O-EmMno5c?.*] +WV0S[NDo56pU+kphnBhmBtn5^rUp=6G:[oR>O("KgqE#McgKi,KdZcffEXY1*@nn/ +\'"E[(ZbVS5qIM#ncSl@qLn!\rK$8o$WCWXOK7oNC9.>0VW:MRm/VD6+"$Nnq:PW8 +!+-9Bro\7[WiG&./)u3/nlQOOIS.Nhm&;RV.n('+D_1XuO,&-Q6%oIN\@LaAn%A +Lh^I%L$U<%XW.r2Isg/^%IJ]PE$Y!Zl1sXA^*h!o..gg8s2oYZB34T[)> +^l\OcPlE3(g\d+>!KNr^@d'O7,`+kYBV^SVRV5#,6ds!d\lcO+d8$;"-r4iFV6,rY +YEL\(jB8(S%A(/5Sq`^tbdVq&[X"?cp_\2Ml?E,@G581^Ke%@;.<`a&p;Dd]`!Q#K +KnZLXU/ZS]Wh:Vs,\:O1-jfTs?7]_b$u\oUUkX8@W+M+*--r?gcl%`@l"[RN5UWDl +Jr4_?8%WZC]4Q&o>3gLFhWnF!hm*$>q7;#GLeo=(dW^b8d% +s)ZiupuNRss'53nfA1m?Sb;sLN;qKWrB7WVIk+g+Za +gRsQ*4*kqjS^k,,(0-Sr*j1iaWc8.EbB\Y:?4`n4+Kc3*+:qKT@ELrj,bhRUEI"LY ++q4@@Mp5$1Y2P(Mq-b1JW0S5.XL8,Fi.$qIganA^O[mnL,6\BjNdI;R-DfM +hn&ne@('jg.[r,_>NWN*c?7r*f6,8af<#G:G:`H(>OL?fW+Y;PhH`YKG+Ta&4?ZYk +f17@3s85:H`TaDG1YcbeK'W$&)iLGGQDKY(PFj4`.@rT'I/8L'r*S3K"9'Z<5koI^ +]nN:=1GqY!6Ba$%VMXC`&-2hea?S>^HqA`Qae'rs4fI> +7lR@]S#?US9/]UP!&Xo]i5b@K,nX?,_/HU;f*YJ;Akb/truD;E^F=TdS2=F`Hal9; +9QT\dD>r/!]H6J7H=Fteq,,`[``uiAE5ML_:!qje`cI_qAe5[S^^"Dps2boPZU;YI +bNR,:kj'JWgLF@bhk-_EE/OALC&3m'LnE!)5=#Vr7m@ueIBu'*Y"TC(Fa+c5i7m0:,R)2+9:RStZ/H2pS"9+ql0+9%3!=MA^@0AN@ +-An[Y,EWE4+,NsZ"JCdLBqcL1(ctoF61?Nn.OOO.I/5sY0(Q^h*r40 +9eJ<4]@?4eDqOI-ORH+Ti+(%?1?XE2o>@t]iQAf(GsRCj0MV`b-OEG/"=6Y;i^@*M +_WkR_n\"c:O?[qj1iHHkBNM]k=0Q;'T4O'f8!27k"au\0*"q4inh+^7qb?^)bbEg-O6`o*WCaP"/W;+l;?5/(5?gS]lLeV2><64]R;TX!WTjEr]cb#s6J\@TC*3arfl<,a*^*SL.8uANEP/*pA$j- +iV2QWqWe64=*f6hZpu0O$"%M+R'B-ID29(9`Xc:;#HTBQ9kh:8WBa6h8uFPSUEQJ9 +/uc6:Z.0KA@ZG.\75l*Z!4]i^@iJ.I_=3.:)@bE7i2u73_?8>'W_uQ.el<< +'G+=N5m3:&LamuWEI"da,",TP.]j2GF2O9Dr[/p5<6YkLo7Ags?pH4Jd0YF7i_ZBq +%/b%0LKbH)J+Gn/.fU@?jJQ%NLeiTL,ls)/i;X]o3`'Ht2Uo%7;"fP>la*\D9G/+0 +]f!Ks0a%=aJH*^s?r?Nfen,\XJ8Bs=c^u,DH!iQemd'I_p +H\DPbRh#(,RI@\SjOV;AgCEpo44Ln0E8Q[#rB$)5mf?/m(7Z6p3]gMcDPHL7<96:? +WisWemQJ@tInB:JP5(_f?b!rjNjG^YN#lgNEPr?M"3Y +?8;\__gd_oIt#?5_^1p6kBpUmn,(n9s.c>Q2[6t`km9H')02H/pgA1,Ch(D*;sZnN +r+L0BE(fI]F'=&llC*,*Oui)e1N=FXZ#)AGX2Imm=e_B;Yr8]'W*4&*=VY\5L$9j+ +)GuSg'L\dJN#rHW+Q\?>m6IVG.Kki6Kug8]JMmE;afR/:s5X.?[JhNqqu0n#q^+T-=n@h;$WFSMMpiW2p0l'A*1Yjk +fY59tk:BA>"&"!I!8IX;?,5GJO@r$Xr6WIZ_$uc_:%Q%88-/9no0V?#`Vu?XKDi82 +&);VIi6J)"4+Lgn4&6:Q3B<=JB"6dcB[PYr-0HZ!/l#JQSuKFba1XCW]l?mD^p<1_ +_ii'#adtVoI.ieni_TC%ZU"ME)G:"nC.!_BRgT.M(-j'>K*Zu[!'^aT,h`7oPQ$WN +q&d0J%R7+b(LP:@-O9Nn[U0%MIMEpsO:QpV9?IoarWg,(SI`0L2*YgS11"c7>VV)3 +*;Ch9L?*)U3q`J![JiZKc*EW5jM#J5roEK1S$^>_Is(juN=,J.Rk*S/O[PhR)+nA<*kb\"G2gW-/*:a+*^HCc[p5IH^Z]6+I +E5G8^Qg@!4T.CQgf_iqbcO\KDjaWY^s"R.FG_])-[klP9;"ai+o](cCs*latHoOfL +ZP.oiT2IDHF3rV-kTC7mOoDg&W!:omOhCtH.K>=I&J-#r4@GDGZk@s=6o<'d]BL`i +O]LC,03h!]HD"_cU=bMT-9]+!ruoYe-`cS29*8n:B>0W..>gJn^^%]/U?XEN0:WT. +,:R>UGo2]u,&&`o"nY#9KHbCQ9b:pW$a]#N3s];#ABD">FI1\j/hK"BpYP-o +SEDk/i]LN*3l>s,iOM_k]dJKi,6FKd^0`6@TS4%We(?n37Wer#HB$m30nplda`Q9fj?LMsSG6l-!Q4)&;OrJbDp2h%Pd.:H(2U!I>tf8I$)%l'aP +s7[t_?dH=_pMQ=)62MI(5l8<'G5:N_.mTQ\m>lVGrI/V>+8<>GES]rAq`Fm55Ch#Y +JEJ!bHN!AqpE'q@r:,mK*tJPU^HLr\qnq`LJ'dZ9qu(uWcOW'gIp_dFq/5XCc?Ob] +deAZp4s)ES^9unnb+/KQ;neKChhpj?;irjIKZp>kbP[*c<] +S,t8k"*g#\jPHaZ*!B"+h2QD[f%A9&R#_#Va9!;tp$k:_?!L#SNe;XFG`=W"U'NQu +6hR`mXZ0E7%T84;Ekr/Rr+oqD-r(5nH +#U"ue$K=)DKPHT,2h`NfMF0Pc9d80j-/&2,2l-?bWI^,Ts5j0gEaAeI&Q$;8WoBk* +s/G9h.`nRE(FD)!^ek$^WAa%lS#NM5_#Gn[7R.&YT\?DDDLiq'?6>9PEoj?Z2^Ng5E7/fs)>jCDuTe,oSW[`4,CW):]GZurcU6jE[,m& +CO^t,>hDb4RR<\U,J%-:-5rWpfn9=4aA,#D3=UgZ3!+a=nIR1Fdn=D^,(cDI#^jq0 +*Nd]-Y/K.i`7)H=RpP6t..O34rhl@f('jdeJ%X9PUOW8/-T-JV5_=-4W@/+IL.ZAI'NOjRI-!FE_f'CXZn)T%dPjp,LB_\h%l, +%u]5(b6"3_%$o]-YMA8Xh!WNlAA=Hu5:g<7e'bFfm2ft\Gd>HUR:aM&>MYogF+9q/lesb: +CMa(g>!n(K@98q.'d9-L]Ru]2kd7#+f +^d7.ad5_^9nqn.;Y9=rCU$&NP9o\lO(`uMI:M8$U$O$5HMZ7&/3<'3R5O\Ff.K;W8 +\GecTho;\o4oVtKo8id^nb%Va.=[CC*q]Bj+k$B$q-s@g'F=X9R-u,Xqu-MMhldRd +r:Y[0Dtj/-pSuPh/p]edr-4RSf-bu146l^Z+oaKf![%Q9TD!PX2!i&PO=P`&B=gK* +F@Ij+`m&]Rc$#pXFf+Wpa;A\g)fAFVL>((1W1Ct4'DbnlH^j&ARUW6=TX(6FRa>IH +s2VS!`DHPP0LjRV_eN1[(.F$F*WcoRNIY%JU61,-`1]e#Lf+qa'SIt2.k..PK`RG9 +(&TcDDuR5jIn9Tpl:#-s8f&T\2j"[PrWeDI8:r[<2$2c<,9RSkr,4;:On)9Qq,>8I +c2UKg-[&qo2`GC.pUlqts6K^)VMsY,+Dn7\!QtF**JqJ#8Se8hMMFF?]gJmC@J8bq +k$%d`ofl]\)f!%WVsmcc4Y*.#Jbe!7_9$Lt">#OF08sKqN+C]@:U1:/)Vb`55d7s(00D0jFFJ/uKujshs/#Z/=(\Ku +rmqt^pE/J"n\=^Q'=+N3b+Ci!"TMEkf@Qha/88:/.`bt48-MuH,c*OnTh$;e>/83i +EDgMP6l%;96jpsg!YN-R7<'Mk]MOh8'I@50;^"&pjV+,r5K77m25%hZq +3GD5kXGo5O%DCERH[iZ^j1W`_'?IkIDpGqB1sbr-dJgI`LG,"]^HBI0ndl8G2?+7n +q,<26^HP'cmP*[V_fe6c@Jk'WYP,f&T`98"n^D4KcY$qk3^ruD$j"s%O.pP.d2+UG +:F@"Jp=!Aa7kY`b*u?`9(8Fg;U'#+C-j6ri+fcW`-]eMZ9ZZ(@*0eN1L?un#6%J;] +#ZZuX++3"Y4WaJ7H_M-[<3dR1OKWF7KV?%TI"hI'#ZMY\-k9gM9E"6M!uU-NFJ'h6 +&qECL(l:Hiq]W,W +*T*L*?V_=?'']ak0b-(:':l[In7FMb"3hXW,Lu":"J&U,pLqqh"9#NfI`[9#'L&F= +4Jd0]Uir/mYFCc%%1'X/\Edo\K!ZgIo&<2[;&lb^O].>e/\oPY\@\IcG=GZj)-MAX +LhN9mG+38oU#Wk%`^q'8?6/QL/b,p-GeTSjZ&S9?]Bce?DGR]d4PK4MUM]tKk.jpg ++j2_TZc:&mFkE'4BWl[ZPe_X3laFlW?EA<0;oq"!:-2TN5?2[m+F*iP3*"R@7.,`s5i:FWjVn++5 +F@@j,a"R-3c#tI/G:2kH8f[:n)XU-8kt3#`8fDMA(heirCPhFqNZj7STL,?a0a?V; +qLZ00a;.EnP:5PYRm,m^1%[rH(:kMSbZdWjojM4B4Y)j\KaU$ROb.=W;`$Z*b? +CgIss5RJJNg9Nhce)B7iNXakMS/U(@);B:G@aA>,$dME]hDJ;TG.RI?rFNd@RI\P- +'itoF?!lOH=Q2Pa;"3s_nKUOL:Z13Hr2J]`W;iJQV1.j>``U7aq.'#c;Ui]sPp&_q +:JpG@Q't*p3^KYqHL%U/T&LeIHJ`[9?MWfb].D(q#>Yqqd]RW +c]:-%1@>#5!V_YAm-m+9GZ-8CJE,6OBO;f,J?P!\^H;iP5ikM!n\\6# +pNX(n>3gYN1/-sE@,S-oY%OS3.&Q"2+%lXV=KZ4=m=-4m1E^C?kR.Pk.=mE1\ +iq5hT!:hMAr-^:4+!gPL!^F9CT-'8ABG5T_fmIn?!hBr:(K@bg +%?0TgqZlF-+0[f^hro1=4'gd(ftf9nGgssoGo)0o84JjTuB$0K'9)_&hc2tSZ.r3o& +hCH^lM4'd"'8N"#bfjnFQ=XZ?N\QPSe1``/E$=>-gQ[jV\'pbBs$$1uMUS!^?gCiu +MC7YWk*tgbpHGel1Ca@1pLC)pdtdWOPIp&K*Rr_bFD*%jpSElTUU)]=C)XZfLgCnF +n(.%nC.2M%U9B=A55qa,]RLs<&b+jAkpNB?Z2^N[^PE\OT!6M\WgB*F#[bFVl=0SH +e9FIX@WY^os*d8sn#Mlg!IpYIp#kSi^Rn@&n]:!6(GrigXSKu6`eU>SD[[Mrgh1T4 +;t"b=iRp-Lj3?]oc'C.[[Zc]Z#93"6)f5E:D0tU9]B\cEl>>;@m2uSdC2@(SX[s'T +@kHpQ+9J2VW"PIs'H*/N(^P0k8H]a'lfY21jeiuHT0_)Is-X0_&-:^=;WkBjSr_;I +O@:>f+mB85qEH32T0rY[rg>;AQo#c`V#D_n!.Oj.NI\l>qk>W'6&l'@It=B5s&f7N +r*NUh!V2TPT1$Kpjo=mL)rc>e!Nc;m"L)+G%[&>Mf`*P+s6r6,eEmE)$68F+QCRt` +nKb#\0['HNZ6(b!FEmlEJ$SFYY5D]!0E9Jd+8uN@",C&=cEq'\ca@[slI^6TF8+'7 +OT5=?IJtVj"-*lp!apJ6r%F(!5!KVgo"R'tGPt?#q#C'HUjr/(X3`"7h_$M4-8ih) +2;8I/ag=ggYY%Ns9MVob9!NnuT>6oQ<+:;2nJ2Ff%Tr!9=[+&*";iPET:&PS@2\IsS,-7[eS>=8[/% +eGi\;MR#0me]HiYr1#?jgoX"j>=%r/!^Hm!B<2>YZSpuXD^ic`;O"Z$,]@0]rjp*9 +cgE!t&\c5c;#e'5NJl?0\!n-$G:C2TO'c8mEf,KVDkH!>n@tNj^R[a-GOlM6^;CK# +YPQORs(0pS47^#J"2bEB\*6+-\L`'VLqpkXmZ8&MU\c3p9!+ +R\;'&<3;+4ZD`k?Z>#OuZO9&)`@r]tMo);fLa"c[N>J\<$e8b(%8iKA$8JH1/3/8^ +]DtU-^BH"#'_rUkpgf#-$8S8@fRf_$5>%Q.eu,;8W(:1s`98om?#Glj'CLb7o^>?.tPJH%XC&RtcI0;@nB3A6_=?`fOsq7fn. +EjnC&7]#tQA_O%SFQ\PR`cDUcdL=jhFBTkGRR:*0!ouBPn@J?k]mJ,QFu0>![2kop +2P^6\W,F9Qo0FT?dF:puDu`\m^79joje,\4d=VeO#L2J=0(cZGq0!GbT*Hs`T1>aX +3[#_c!Pn`%Pjpf\5Fg'R*cj\9nm*gHJ,'&0m]ub5rk?MNs-hNrcYNN.61_:$Rf>FJ +q9*dFn!CDqRa_(K>5P'$c*n3%^H-%QVq9j1\'`/Io2?Zq8(qeAg[(eA*6+K88"(G& +RiM9om!G3A]:0d$)XS[OJG)$n[T[GHJq.A4)[FqE,/C";D[6ptatkZp2(H^+jC]>E +AK'Pq6"re"!SPTM]JFs0E; +<%;o:'A7s:b=0u^+uTKP0uX)$eILMeBE8,'n:tTlZ32G0!:hS\K&KIPkP+4td,iaU +!'0XB(4=33Y@PnMpj\"q]dDIbYkX0dXrD$85Lm?-/cI]TGALJshoLP_!L`Pe/Xs!K,I-)]BCV`9K(G"PMM,U=Wp"#pJDnCd]kGitGR +*!GaK"0DSl6_Ye*'g?^K#mkj4KQrMFN&A=AbV&l[PS!YsZhcg@e%IQdf8tjf7/j^k +ce8BiB>Ldh'^'<8"9mO'!qNZVj^`6?PI38$GACXDp7hJ%,m@L&$9$E*f6$LfLPi2E +MbK.rCL*l>^"K4ZEkD7=I<$D<.t'=tHnilnFdVu::+UnGs7l2TGqnA-hp5d$(;TiH +s8TAqYOqj5oB<)dlA'BEgC`kK50h&hlFdDoH9$;N&DbPqcc;^-rq+Vsk3s:$b`V%< +:>4Spb0Q7E2+%B[.*rD!!Yf+&64BQrLH;%/m=Y=Ho]Tso$Ad6+icLT5*DEg](K)AV +)_^G@D'-BIN`2_5<>\&S$Bq:0,V)`kb&k3-Jm$0O_hn"*)??Fe4\Ejb4E)Ac%hSeL<0cI5"F@F1Rd*N$^n[CMu3=4HAaH9KZl%;9>i3Ym5u`Ln/akiI3a7LB$" +/c)9&rj%mfoe>jT8Z?'/\\Be!R<4nI8L;(nro&=5b`Z52uah6bUnE!nDkqi +s-"8+Z2Ce=4h7BYj:XWjqT!=;T20-MImj&$K'm8-3ZfBjIXBlFeR>47I>0EIRQTJ; +I\t+oYQZ#Q&EW4]pU/DgRSTK't_&cqgm`b_>dLmN"BN3XT1TGND?A5`I]poO+; +;P\2NPhlc:#pM]./8b^^B,oc)85IUY8CYgn,9SAa8E0[2#d=@;1Mt,(J"Agn5?[n- +numF1rg<`Ms,p8-*!+7^(R80f('(;M>6+@mQ[m^m^d)\K',^i#g#Te.!eT59@'bC% +!AN0OZ9/DEb^9C92h+=Z>t4@^gLpi+q*c(s=iC<3B_PtEjkmM4<;r]g#QN,XDZTkk +G&1gQ^\=T0++,;+sG&cZ4+H-RMuKr)6K6;GnNl +s&2tn5:HUt\q*Fl:.fP$8p!^"E$aP2nb@M@?Ib0[%ElpbiWt'1pa,imQ2ZQuTD0ML +_/oL%o!?pajP]$)OLlCQIYmu\$[9C!@IBGolqP#n)_p%#noD/TjDS\g'](#`g/M;; +e&$=t0Emi$4d=U5FGnCSRT;qbkZRqq#>e'"o])7"H!0K +L#4m/r6Ih4pAZ4)W8H5PTKc1KciSSP8:TKULHiQ&J6o9A0CdHW/9Eb@\erGW3PZWj +`gQ@*7\-N->Ir?%6O*-PDG*\/3Q&0IH$$MXC +E0^$;P4`s^o!RZVfeELc.)6/n>G=qM'P<;s;i!1odJ?]/,@^Xs*?%JqU(aru"AL@H +Rhr7['s#Gfjj/c`A`As=3(4$B:ganNQm?r(7@m,87p1^kNZs[fM?MY3g_eSpTN69d +])`r-8KIB"(W&0[i]1XL3>]$#CPC8T&UM!BHG,I47Q]f#/t$p0j.a^G +(-+p:X#3N4/!V7](ATG8$e32&<gF=#O8LAS\<5BV^ +D#ec&RKrgVQ,S#4&"hCe=iB)Ek1pV!hA.Ts-rmlWU3TM,HSf*u:o<)7P!Nl:G-/N* +`?*R0m0Zi4V5esB3cA!\M<`mt$KFb1441HZW7Dm;gRpGpeF/)<\"FuCdCCrQ/HO\N +5d(nVDj@(.lfh2,G`V]Ghi)N(SAJ>-r`J1YkIP7X[if\Pi>h./n:C:*DDZmAit +#m,p5V@&691,I>[5Qk%#RZIe'aWhC*,`[CS9Ol!a[&bs/>rr->RD%.3XSOI77)>uWGS&"*!+"XC]l_Z('#NYDZnSL=V._. +%V49XRfY4(![J$s=TJ*'4pB8aA&l:m[C[#?g0G23\/oI1BCQi+n6?P+/*6eis/4T% +KDuIkD[-4pFDbINgd14TnGe>Ohj+1*HSFga=N&/bZ2BIYJa8*]qZ!\NAE*X$$Yf>N +dpHA&8B<]GcSPh$a.sRRdAb,_.7V]VL/EdsOU6aSnV6"B#4NKJB*d3%O"h'$2?;Z. +7#X]:S69[&AULd@>Po."rXR%Ap.:*a8VmpB@_k\2P_V@jN;;Po6r\gL!padlJ$(mme +r1)"W!ci=jkN;.[aP0is\1b,l$'cEO?e@s_Bl?8*VrD(>@ +qNO2]ANh/F5+ggtT&tEKG^5\&/Gb)TpJ2nPIU#-&c==Zi&-QePTO3QU(\&+LD?2(u +r:gX]s8R^0r9WI5mdH)n#)4aUM&0,_sVWE/SZt,Pm426!9N4l +(cc:gZH5iKM/E[jSdM`:jB0>iU(OYf/j[QDH43qW-G^BnNse'ku-VQI)Ynd +fr5CZSn.NV(mXY'Kd'm7b[%mRXdn_u9^uFaF,8=:X;(I0A1%%u%ek!-pK@UlKd*K8 +I(:0tj_MhM(\sLI$ZtR;ogY-e];"u`!jp*nY7b_R(9U^en`1!^.$5/U3?jSK;eeg\ +C`&9l?"uZlRNdk#W\d#$eu6b0NVT7C*V_4@/!9$r,'l85F'jISWFS21jF#[tGr3>8 +G*Mge&:Vn"c_J/QS`E+3s,#1p-L[de'q%itmK1?PkQ34Ci`?hs*V%c&l?0 +\Sh(K,!0%!3*Ng3Hed@CP +8rUhK!Jl9S!ZV4B]FZ?K!.8$9br@r73JVBnG7b?p?Ha84\R +pqL'ar=9J>'A-SunO7ui]3tCdY]qd^ck31+d%Ni5otN)/r@_V5!`[f(G6)q.&;bq7 +)FncMe2k%?8--inIn:4D[6-f@b5c&RbA`sB8=LQV4)hFKCTQ?]`H/[$,:WTmd(Z=N +#A2`/reL=lr!se5h@KTMftX9\*t>t=*f9h[oi1ol&&l49P6h*(s$/o2Bmc4$WW--$ +)hS)7P7>DC62h'sZ$N)u@R?g]K-U&@,4pHE8;#9&UW?QdQir>W,b+R>gSA@A(Ah\= +gEe3!!XWj+!g41dOqV-kHS2DnM8i[\0PR\h.F&&fj$4e2+i+cZq51[=*ta_%"lT'' +G"Jq +RWa8:@'T)eWTdl[mb&NOX,X-'>9O'4h\tFe2pD/D9^8qjksprMYGW4XchEoCo^uXC +!kt,>5_JRN*:l>-r(Hr`PPG_%s8R6FG6,J(j,:^fbV7BIHom(s*+V8#V4\4kTUC+& +KAI;>Y80tgB2a"Ql0C(rV,6<=0/L5253RXq4A^ehWcmHf3H=ktZFM#KR;:>N2lJ'A +<_:r<'!kRuI#E$l-KY3l(&.SRq=uH9q^D#8'Cpds@F +6Va]m*=I:K-Jm11;b(i.:okRm;8]I5n/]\Z$)$8mn;:/W%$_rhB94H]:b%+'Gc4FS +$'gk^?.<<&oK+f5]rA!5Ges;G(ci>VS4dHHB5t-;o<&nW[n>&kQ)t!idCW]V#JFA) +<.@I4iNNCQacPKe"%r%S._jN5I(r,7DM.M>)W`J\MKjc`:hD%MrEtA#=.DTeKNrd& +:U#lqmcQk*h\@b,(+1u+/9O(?3KqRqR*C%CLN>JBHR2beC;/](I+?]Vl:W"`PK>jK +OkPeG3ot]FpmY@HHRn3ialbWSj]U(.Q71W1jdU9F`ghED3`cRJBV@b0<2,._9rW;? +HH;X@Zk4>5L!Dse7%cX3eD4s5H80`T$6S1%]UOI!m^mHWri\ms!:^i?AJMZEFpoDeC\YJgH:/o-+>s)VN0?fuN[4/E&Ys7Wr'q#;#ss,?pr;^V7ZNUIlEH"#@l +q-f2f"'-fGD3+l7[FQi%0*,)\GDn#+LZ]V&6U_eOe +^b%gZj`1`:!YJ77Cg&,=JI$cqJ4'BZ!J5,t2?f$_"j"6&Lk)!@K4k.d%@'.9J!_"! +`eA+-O93AuYn>\T9Xn+s3.)O_5sdD7#g,[pJdBFh2$*8G9`a7'EHV( +^g?#Manic^"T\@b\s8V>0*:0"&B.cKr*i.tRfX)$ruF^)E!2D^lmbEa/>sRcJ[JJnc`!d.9*p!,(>!-\Q/9pjdL=7QNEDfk5ZEg>#/i]P`M3o'!Y +gu8?bs$rDY55'i$Cg@G>a8U#10Z?@:J*5Op0!s[3+0tnsnc.ji5dKbbrYO2d;_\97 +58=+tq#BJ]nu__#r1B?l"q_EU+p'%h%ndK259sDk3(bPH68pT'-Ql*L!"fbX@iQM- +*h-gP&b'oB2sI=>-2o:@fC,hrqr(iW>TF1bq0,OZ` +!Fks09T!ITZ3NS5T+!0!Du5DN!]#1EZe%kJ%g`!C#fQbi!^Hn(-S,3[70U:(!KN"R +U7t@^L$P3'T"QF&C^XVR/\m'$p$3'eG?WO'l^!"+:Zf>6q2\$V5/RmqE?C0[*fi*n +&2<1e-Ob>GoU?^.48DAtIs(r+,5qhg'StW^!#d?,T4aP[VpMn_;NHPlGTpfKrF%MT +5ooW92>pQ)om.3r0b_6^N%RTK`rbMYIItGfcH$brb=:1]%J&U"Q2-p"EjogpmF"\_ +URo+o4a)li`9u0,4')/p%ja(\!2pM`=] +k<9lKrbP!ro7M'jN[Y!9N2_1[W:]&!l?g3ZDfr):Dc+&HVf\t3iEEeiaV(GhI//V@ +RA!$:p./Lq&ChW9["m\\s2fNBHm8#m13549F#K#)/rb3$6g@"8oS%+8Ze6hKdoRVd +ef9^tD@=mlg8cOPXHBhY/^7EIeP7aMSh-^^^SLhkH0miAkkoHnpP0Cd +?QCs#r.s<%o7l_[)SU44r09j[4(ID37P-6P=IgJ<4um/#CsZV)hf6*NnPI!L7'G'Q +YN&07df:C\12dK2Z:ODA;N!h]o4jVe*E#fodF +s$QagRi,k+*i#>GV$dls'WFb'&)*'RKa>JoB+`X9UeEMqulkJj>d,1"N18_ +s+5(QP$D3".t9f`jS7X3-Xcr^>p]'^g(u^bnX\V0^EYuh[)X-%pb%("gWD:`l3`<8 +8k4[;S-"t9NGJqY=$$I/!_=tp;kUt'ZdH1m&^9\jTssQaoJJ]t4##1N51GOh]oBCF +j4h:!A$'&gCI%l0bm3j!s#6.Z57;=hs-'!\anj>[a_9H2*/_Ef*A?s_NS,TH +s6YNi4,[fsQdY=Ca[e"f9Zab7b-=LY11M,P9VYOG_>fY>`]+$/Z2B4u[0%Y\r'Rmi +68\YXFUs.?qhIKXk_&m[j"8>(0PCLH'5Y`AJG;+>(.a7jMiY7nr_H8.,F>+X#Nt:2 +XNf#_aj+5154sj"It7;9&Gn].$02W$HN^Jao-Yi1,UU%=-Q<(MjQZB.XEAeK)[c-o +#n",(RNKa\.bH=&h?0Chb7RR8^S<2q%jlcB^L0"8?mkmOdXoa*qhqhs`*,D?3$%lkB^6h@>'4ph>c._]gG(^)r^aY_S)^E9lE?c>Y8-)u*k#E# +@'=ml54-/a3hcFn6[#L8Dc[>&WZ&H?3RgPBbYpF:74Q`G)eI-J2W_joEhi<;O]n9r +'r5!= +GlTj&u0INJ0ZOF")74`!QJHdObskiY=_T1`(3SW`mI +X^>DcG.Zird%c2 +LZeSqLQ*HXJ- +kVUiY1u@[`g?16Hk<.8S4OS(2ggrDQ6,9@JGWD_A%U&k@rjRRW?d]!@rD2j;i<\A2 +Z$QMKm"ljD0\\u8!U1rhIkiI)*!Cs2!:#&=p4mAaYo"G]7.ke\BUEC2\7SF1G#T<5 +r#GX,"FiPM0Jgg1/(l=4`AffqA>T"j!Mo4;UP!%mV@9>N#S3ZTnjS*9/Ib:k/F!+c$m4O*rlIjk<$s2-[@K/N@XBE8YFJ`1nu;9!$!V@dh1GkbLU +F`\V;"X[QbO0o#(s-!$sW;fdp`W"3+ncnp-B1@X.s$ZjLNFVb^m+G5uWumrVMK_W_ +E_As?jsMC%n3[24GeugO$Jl94)Za+-noH`Vr=:3&ET%DS54Li;=TG9^fH(%goCM_I +EUgfA\6p+Z-7[Xlb26$X^UBiOURgj1.'T*j0ps]4)Zck;26YTShe6''f;Ucr;/r]eD4s7*\I\*SrJ;ZDpmT\t3J9`^]B!.6We +k6:/&_osd_%+u-cC)F\nq,n7$8I+p+"+$^\]i^/)RU+!s4dDnKPc-\`X#(NigE!!B +(nt(IXBufRQka(l*ho8@X;_tM(E':j)IsBlC_RY$*$/W%iNF2L5VmGi`N-s^/4-9#1h';e*O.oB`4-r^49b0lDm-s@,"b+X&?PUMTU +j\W5k8sQ:%V!'WF8u(l`dNWC)V+.p5.ZD!4L%Ws;4l#WpeFPEYH4%6ONG]Q,gO/9] +$$3S7GH[/7rkDN-^!qT#2l!k:d/]C76`QHFp/!#CbFpDa2n'`]A]K45_FgA>WXGoi^WD\PD>`bgV^hR2K +)E0pH'<8tW!IQn+V2MiM\L:ANk^ +J30_=6iaT.+4R%2gN'66mo.,[r5f@VkXQ4B:S#[cTk^[>inOnesb +N[+[Fj7%ZQs*nC,ia2rOs5uDUhp1HbF@uSF'8DR.)EqC]H%4]3_490tZXtj2[_$t/ +p?I>(o+SRq`p?K]fH22T3\p'73:&CbloHr`4?_m`1#OhOCVGrpn+nnAbdYu!l4g^=iQ%%A$R+Kr(h225lI;hXp()?Ckr9, +';?3^X9h:LBL[\j!KePj5ZFZdnNS/dIk%W$NO"^Aro&@>plfR*EolK!MgpT`bFeXg +($%#U.t9,M6Ds`*9O=DUM#asrE%!/T>YY;im!k-BTgIgB=lrOZjp43TeirZU>3"n>f>rq:VJZa<[mQ-E#HI%lKeVWO/E9hH3(hiO]Cg7&N2m"*7p&XZ] +T4K;=T4m(8e[uJ:rh!oX$M'g-hm(hElU^2Fn33UM\ +J)^Kk_VJUH6/aGX5AP^KrpZ,'m3VR49Cb!-j_^s5&`D5Cj=i!d)AejdM@:7N$r0eO +S?#Z$d\qJu7Hn]ji_/[EYI7*;f"lX4S+Ce^HDcgM^E7k`LtEDLhg(_[C]mQ[![Rcc +;kT1J!$2AhPRID8K_*A"p\+j`gDon0%/&Wpp"^mB)ZK7\p[^\M%m.=?[n=D=07Tll +q.f/oF*rsW3L]OW)C*?n]a7.;0ug%e`qbaoR1ZdH=S.K6m8X9Ri2%jk*3WM`=q^T3ir%">5aA9eK5;P^Xjk-DMR#J%G]^'bgfVRCa"3NLH_0C +=\@d,,]i)]3"'_r`E:u+[+&Q4cpSuZdlIfKY#u7K4 +QHI#jMZ,[-#Lm>ZWClPXjR/=Hp;f&(dZcBqq/VQ=K*""\N/Q\+W&-pi:R*0SjAtM# +NJ;PQ)="OtUQ0$AK3m8dcM4-7;9\DQl@'e#:l7GO5``M'[mLFAr6HUns#HqFjFZ[S +=4P:hs$tal=6mskD#h%m+$cZ3U2t+*T\%k'5mYo9"YXMkb.t,B!)Xh.DDt%M-*F%CqH/ +?k2nBNV0lAp,F/\G%)]3ENn95^X^'%eK4Y7D?8Cm49\\;1*uOD,ZE_o$c#5^8SO26 +nNT8:)?5ons250`>ks$MK@PhVUOk<&&cr%"IqSkus+rK,.IfmcIqSj`qS+]d56k>] +CK6O9"0>c'(DT#i"Kpi4mQcKQUV%9Cne[S$JH*_q!3H3+5lQ%_Nk#<'"S`H=J6.EV +[@lMgE=)tE*SD-G.Mk*HPWDm33<;!Kc8YmJ*:(b&+L6../;gB +ia]s:L=q'.h=;+#p?@l6-Pi'<#\WpkNcZQZ^qT`#,9SeeL\3mQIp5LlG00Rk=TTfH +B-Z=Pq#g+V"M(!F!^ukMWq*hH!]g\UqZW:\-)M?Pcj6QjX]Y7$or<(UC6omhXu7cd +BTg'Z/G2oQoICs+CRrtEh<7-XqHs:n!':u28&/3TpmU]]lpe4ts#:(G(sr8#8#:`C +O77\W(=DT/e8G`e:NN$J%SM4s8-V]G01H[@*`.6n8+lP`eb9uiY1;a,'c@uC17688 ++36/%827*'2_BkBc\oaqGGiJaV8c`9`*4N6i[pPm,_lNt&oX+OT+pD56Qn9"_-pfKW!$6Q>nQ1u +U;Bo0YrX,XjHXNPb-dUW%90$Pl?,sb'cM:[3PHFs?LpK7F#T)(V1-tH(c1FLV=j/LhQGg9P.1De0($^[Fp +Ouh[ES+;g_p6G%>Q1*M/>dn"8A:nWWVco7IC6\Ck?t3b44f*S-ATt3EFt.HTatc%h +kj?gB?3\_Ph+QdR)ZDQ#jWO>B:Qa[J.rtHc4HV\6>)R+E6`ihV`rZ_'EMgFrdMD]' +!Uc4lk"Z9V>!@8I&q/Jc^@"?Q:=+L79E,r7JFb7??XA_-pm]tMs-(Tta<(EX5P;d% +rCF`lJ$>h(+js4;P0?d@m8I+f,]Ij4n'Q7O(.>.lt8oAZk-SJg04e'=;WSBjqi +SK;u91%'@(b\_(VkC>U,56Cr\*ek +Eg.VJr5&@CdKCg-!1tth)L22cjSu=]nQDM%rT#q*aV%EFWepN?:SsO&a--4)=C"TIkD"$?`X8'09%VWDQaUX1TY8@IZeDad`f&2LleT0H +:Q:]ohHCG0&Cbt!f<-!i><>sU!t7O(Y`(F8!+V!-#SW1W!_SrI13#9'q(')&SYabb?#QQXU/Z6s`9R]X\YtN?I +JI"e?Z\V74_oMad%3qY@,GOhI,'6/h[1@q*KD^T+U&GRZ1g0'mG)VJ>+F2Ct]XJpq +k89QD*1uGXOR/L%l3\+'T8>#lQXlXWU4)S$+7[i?JmDKg!tZC58-k8qNJ_\5M=QI^ +(-_qiRcHp8?^/$bpqKe4Z]+q6s2(Kn!)A*>]uY3fnG0rNh/G)ZO>>k,1ZDn)s3raJ2,'59&5L +E*2]tT?dC1K0(YSQQ&WE<*CgfS';Y7o]92_Alr$/>*UAf(*l!(VE!\53p3ZnJ +UqEXAl75B[baUKBtkJXF2R$gLSaaEfutjJea/$5[bQZ:]VSu +63k";57[)(:gk(5T8o,0;\`-#)Cj-&'mfY.B;6?Rc%=PZ8[hou/mC0rKVj.DdPfC) +;"R'UH7=c$]o[M9`k5N8kG18>6Z:SO2]M7Xmn:(PFqo=s&m[.\=3ApM8p%ZL]o41d +HDd)3&b,%pe?QYU2DGK/G"m)AB<.A4Zp#GtMDl/d@N@TB2/Gij7n#]XQeU#N3 +Er'N*FYTM0.YBaDat1KZLVqN5&C+5TGAKK^GW08K(Ungj6HaPkg-=QtT3?A)"Rgk7m6$*]k9htVaiiZ%=(\Y +Gt\WU`r"PIrss:b%X0sdrs)_u=T@Ch_O^Ani;_ACCWTjiM>p-T:gIU/=^Y9mDcWI= +df7>R@kmcV:O7t.9!ge8q3C_>3Y6e(qOdOI2O$pe@!*ZCLkD(6X_%Ous0r#dZHU/b +-$e([ruceF5DJV.&HDdJr'1SG\X7d]JG$ZmIXs:g5FW[5"t9Q0o*V&[Mjtn.aM+m/ +I5QsG*!X(Yp`E"V&5t0$W@E%n.H:(N#J)%8Yi'R"@Rr;9+(KnGL(8#+"$i$MpT'PP@k +6OA9.kZLmO?GLc=^C'OuK89J;fVGBK-`:.f-^r&n)+c"p4Am!as+]`hs5=XCrt37e +"IOtb@/7-=T<0E$ae'^IkZA(1gD>ZAEWYjM-[Y4s%t>`#6<"YpL:-(a6:OELLY2fc +f`d)`#)1c@JfTG1+9J')"@Pbka2b\8`4A8C!<1;Op:l^(UPuso>d1-#GV;?.fN65Q +$^C/TJcG7`!1*ZI_Yh[RBP@Crr4HnBH!:Vr2Xke#964?Rnf/SUlro9_"p?8?!i(Ce +7cQhQ_e&\&Pr_F9[@aL+IATKu>clfQp!VG2R6*"aIQMkV#JE(3Hnp:;*CKTFYeq/h +!IeEp";(TclA>4a=q^GEU>1f&ME`(XrF&:hgNf?nB(\B\2YqODoV5:T[tcM@m]jFP +B(^PHc)GI4Ki75N^/\O6I;>E[Fd>C/VQ1ioZQRH'0RHM[mTL_dG>1hmG?1kjDOspY +^.2V7ZQR:[Qt05;B-7K3i!1YHmZfEW`+4.d%!r\,N1r.+TKLrS`UCn7Vl0\3#7*dI +JjG5K-rV#R2,L,5^3@qANVXXY+]i9oK,RsH%W=an44&$Rd)?RmAdWj<4V..%-1c*Y +o4^#PYSDTAL-B?>n$_1f'CRlQ]/A7@QcmbIV::c.FKHNA!\ZFZYI-.sH?gSA97JiC +qpi&9ZiEUcJpAE'j, +i;]ca2!.;hm,JNBiq@9MFDYK%2^qe1="WI[K`m2"-L#ZMuqcK]iA?;uQU5lBNn"/,`6f5eJsn +>DJ/cA,VILrVUe@pKs9ZJ%oC\o3'!":RQV%S12PZj!.Un/_I_@i:,1-o +ca]O6p,Y(qF^i5RfS'!]M)C4OCZi^h&8&tqB1BQEO*D?<:C_[0#[liAO7p)7s$o-+ +L>#qKs8=OpGX+Zlj0J]Y"gD^@Y[[Ql*tG5$Z*#OaWYS];'q.A[Il;a89]CPBr]`9[ +!;rH+TgKUqM>W51@tV0u63%JSIrPUEBbH7%';0QbGC^4UocMZ<1t0,0VuDJJ?Vk-/ +;Ih/@^OR@(_tq-TfR91LZG60Kn]rk/.k#K?s6&H'A`l*djZ$f442L[k&HMsGA40`8 +'9Ri4)!C0^f.*I%l[QD?EqfDc(Pi(\Ip7V^"?$=oHE,RZ6^9U(]@)VVK*?bnWEe1^ +jT@aT%+P%\e>r[i&CgLaf5DdjemTg90\*OY\n1'`em/9Dr4LCjDlN?DOY1!sJ.k'H +&-8^*KE#Qk>T/MI.6rD7!(tGdQAE3L`L_d2p\[?ZpcF&AS;]#2oM"#(1omDtoD!Qo +fN=o9(rN:#rQ%OCJ4P*er:^H^pk@r.L[#%t)$Yd6Kg_@q"GB6HOAZ%@C&]^@G/OnQ +`nCMlE=UA&p5s@]CQIIPT@T-eJU7]s1J9s\TuqMEjt2nCs()o.EZW`c#p#.GHu:Q560mhs]goEK?d;i&G0&t/$+g_f*8_`Z][u1_^!6P(K>[4oqcT'[ +TjjKTTkbV)V67VI]O5SJiAuG(7\I8)UO^+A?b!)6BN(U4US)jaY]sHQ^oOQXXZkL> +-IoU]?Fq[RXWg"r[$t.0N\5EddOe;.0&H*jjkt=c%Nsm6iqaju&;25F]]WLlN[bH6 +P6L5o5f<$RO:OL`R9A60+5`"%"JSO$k^#A&PD3Br5];SE%r+'7S%+M?H!g=8*qrQn +qU$+-phJR\S`l&6oO8iP;2+su8P!-;!kne'$G]I*e^L_1d1>.gD+Ns`0q#5BjF3V! +r+/1UpI2LI(0:AlX8;Fpdc1YQcUMG0lB?LkK*O!Dh(m:+,3jP&"o_kfTdPK>csG56 +"*JISgG[DQCQQVAWR+oo_biVC8j;$0.DSd1=&3tR[d'I7b.EpMGKKAu8Q!+0BI?80EPSSehl`SN=.OpuIm= +PMSeVf.Kh#Ribur4733pNVUeYY+7S_ApW*fotMlRs2"`rrB^,`>2k$u^1O;"-7A;4 +8"Eq4XaOE5h1,;Dj:B5E`;aDZ-I;PGLqFE+r_JR&'Dil)^[-IF*Z(Ok+0%\'"Hi!M +J40Aeli1Pr)h\14c/4$GT?R4qeGh&[mk/.)047M7@HCiqa;4fd@ejYKgLoY/!g3g; +-mTD__WO"sT-B=eZ42M4B,UVS=lN[)Nt#hlEfp'Bh"A=@lT)GB_"E68&I-V>-21rb?AmK#-/`K=)YQl8GpY5&NJb[qVq( +4SZ;n,2c;h%UckZf3IX5q6msJ!K.uq+U*mLMGrFnFp,/t"\91qH@\^?cU/\279jP.:!#f:fQMITC7C3QEhMd12PFfXHSi"&eiM\"@Pa!JH#_H%/e!P+9IB!rBp3# +!l4iP&a"U3r]q_&_6;cnbE+DNnjE>l,Fpa,8OU(seKD`(I[V+]>bKS\)SaDW5jWV]b0$SO;aEM=A[;!pkCRj^1`/CC%<S1'^g;^ljgL:Q!Q][Xs6hT:2\+28;BNrr,8K0\=u +f>2nIVZ?\o4QlTe0(@[:mou*uZ^Qqf[D/6^qr4jMkL13=:>:5&u9adL7$-e=.X]lM]eE[RladQ-QdK;@PUJb/g3-T+WC> +#Jr`S4C%dlF]"n;h3<., +WCIuWht>1l3%Xt*0_^>7mai]-Q\3dX^$+hnqNWDmK0E6n,i8-+MHBF=1Y +U"?mrKt.bcgkk7ePAIjf^"r^)3,b3$eBM\'4/t]R(C; +FTHP?fp/'O-1p`NXTEFb]Yl@)D$*2Gf8t`.o$DgWKRmB%Cb%'q9 +bT[Os;*l:LBZpJtfgK*O7!Fjb'%"N#oQ;hcirnQ>"Y'?\%/Bk6g>=hjrH2?9s7/CR +s2F`I=S_u>>m'0fmjm,lH=$?TMgA4tIs9')lOtUP*4P]Va\lCAcT0gMGIoWn"nFm) +f_`3H50'OJN_Z`?1:_:BEl7h9qH4d=lXn/@r(6EC794jAgbJ.HH6WCJ%Qp'XMLXXc +Xp,,fs.KU0Y-aMiT+q;Ur@c;J0$Q.#c8>?8s%DX,&ABCki,bapnYH4$@X]FX6C[Y_ +mf22E`J(`5s-&^t[bu@n^^As&_jXiGG6e-a(:`Ek_4Msatik`^ig?mG@>Kb2KMF?ca66Cco]:cr^3R3G1 +#jVH&9gF0q`k7i73E\NG6iackOI*GZ+Q!A%a&?5rHd(af[mlKa>H)+VWU6A*CqN_s +^ +ZRVTnXo<]Cj0NI[:SpiM3b8*7[,hPAp(+$jhOJP5A^p,0JG[k\cZ>X`a4o1j2Z$0* +XrjWKhd=("TmBL/jfZb3h.C4f*`"-HQ\05B9o.bmjO"c?T>Jp@&>H!fofBg3jZKi"c`O0?j0 +1$3X=U>[tCH3ZLnLX&>]kMspsA3?dX?6OX&'YRh(hQFgj4eHlWOndfCUS#QRY>aYo +C%V!RqI'_Z4+Y+.Lu.U>/\jM_!@i'AJ"_NZb=?3&&:C()7\G^N.0TY- +b7S[iij,2N0o5?i9H`ka;r%I`qLVI0(A%jb(Wio`*&dJ>>G,W$05h +!paodD[9_T**C36eD*:4*!-2AI5$.9YVC[Q+(P`R#+-G#2okL`2$`sGhJ9Q4T>f[c +QM^A[!!dnR+:'(n_S^2bUDsqV>uQs"n2TXUFo7b(&-9Y"D1FSOa;2!fGH'X_d*iqB +gIMH#5ZjCPq"D/mt#1Go@`DYg\ +b%32+e'J0OCM"h>>=\lZ3lF.PVS>19I!M+YnhB7uBrTFUAKOYtI57quaW^><%V^AG +C&7h=l+>tfDi`Yc0kPY0T]<^/QQ,m@=*d$TGBofoo3Q*:GGo5n=MpGUgjX=RiA*$kSL?Cf +.aX^.<#C\ZNJ,`nHVj<[Wn`HQejm!&."oEZ0<7:9=G/HkR8RZfn;) +o^r?53/fZ`IP\Q@9jKD>(PLH=V[Lno,'8^%J?'FWm99@OB)9a^cA)L,r7'l=r"i:h +^upmgO%5JL(mb33?hW;NWV^36\;3247NID\VZ"mR'`T,NH>gCMK+%7r[\\RMebo%R +%VX#P?S-V4Q2EgGg&9&K(e*]&$Cnf8oNiF5DU(Eug;dV!BF=7,nWTCBL^lgp#bmsq +#U?B8'Rk<:\puX2'aF#SKZ[h%j(^D]NonqkB79$6M4@Y)kkFA1cb$.u8(#(`W@''< +J"KfXcb@&bq4CllTA7h=E_d?Np:noQhu@6MpQoq*hm<<3Ghi57UGd$Bg"g"W]!L=H +Qi1R1c5lV(DAo_V*1>R^/5<3Q*+)@+)tT1krf[F*!*Sn@KBPh;]af42%X$bKPlpEV +IBCe>kEhH`B>#PUIn/l*8dFAU)PM"bM+tCn$N,tBNmG0GjdMIsR"PDBf`,RAs4e

    e,QZbRcHL`WW+:DB/b>1'*(H"7G/H.>T"^t\gm>jlCao&Xi!UJ5 +(^L2+"^Rk1h.8c5jZ!><.Q7q=92]/nHLkh;f!2f'j7V.SlaBU>ml8h$F1QAC9]PQo +VEK"FHP`+]/@Oo3Uqj5FIg?,GUQF:tR,25fahEl"qSF-hp=.X[Jee>1TWDr3ZiGKf +=$_C!cH7]YZo$OuA?3X:X8$oIn:+u51%Ba$\:HlV"@V_gdY.rL"9]AH$3#K&IR,

    HhNlrg1.^0 +O4is7k'Qfhn(hV/M1Eqal\KMlfGJ8k.A51u\X=D&B0ik&TZInXU7EV.?%>bUQX0XK +[F5)*`;^t[X=S:16Oh,]n]]*uccbi,b4Q;]H<'OLC\dCX78=jl2Z6'V@fj?]`N,#` +.\&,X^/?J(UJ^;6MC"B)8`;8Z4A;t5+5=H@!pLOA(pAO +UUkB(=M?t.H%4K/j^ELFrl[Im@/c?1hFCc$c*@jC+)KRn=MM2?G#q2YY,9pd%CQ)u +C].?:)X@6ilM[.jr0s/WR[SgH>Cp'`K">.`#+G7G2K#"!fK"g&:7Ag/[*ruajr^s13gcj(b^`$$N)H +BT2Q1+SW!5m`Q(3bpmg,7%Yu!V[CcWQKJV&B`YeIMJgqjpDU$_4#l^$nilE,_UF'* +A0)6(I6OV%YYY7N*ne$VUgL:dh@ah"c_F8_;2aCHHp?oQN1/?reK3LTB3pl]PA#jI +CWl.nOP-bUgT)[7?VT[5MX1@T.DS`9kGuZe+O;$h7HD\-*u>U+7=cG/$>/e^aoIS( +9)g7^P_'JA582EJLaqAX>%Q3%JnD^DWIaRrkG9_pA[#+s'4+OoFYn_`]ge)]$+a::$Onum4OX`A6\E5W:-$Z2q;CoWeZs,$kN./o)'U%elm +o/"W!d`fN,;#GtD;keD+nc(i8s%F4/)'Q0_,tgMu$8D6>.FoUfh>mK"0)h4Nq=A[G +2nu$\a4GcCq#dH1]Li;*-cLR4Ted(B5BQ>hH-V)u>USP2Ztou/Iqn+%.0'sAS`?0& +lc+)KY!keI!kq1Hs5WDsT\I!)s8s6lM`C*GodJ/^_KNTXm1gZBD%\ +0OP51&pa*E*ZV=e=h/TnM,RiF"8G*icn;rG#,VAg"G$DKZcpm>/--Fffp4-#?j5.Q +kufoY)7JIQ+=5bPa.<9OJVXO*6@,LLOHtGg"o5(K-`5NB,hqAAG;/eV+i,lfaUo^> +-.N/C+=Gnq5L6C?LgFD>(4ln`#`sm0+U++Y#aHsH;A"WOp5e)1"mt@4O+WL4'#88N9fAhg[t3pejm&YJ"PEi +[i)5*VeuDoAcL@R`s39LpF!WBNr-OEme>Krqs%kaL#J+L6fH)_d;n.?Ss\d1K[K3% +?$H-Q=(Zqp(=`&k?"q".ftH5=JA1I.!Fu +_$96"`F^@!PNh.@$F+5hkk('?Wj+LP8<5f'n+;`,d#gO6a$-+=I<0oGAcE9rB`C)) +oZIR$hbMWAT;=\2L\Ts>HH5j9'@\ZF)LXT#PlB5VjlJ,]m?Z2UmC8'MQ14$'`p?%J,5DG.>NL0_Gd]NJgi0lV%9OI*BI]81t68e/1KQJ.WgmIPCKk9&dbZMB[h +(/#/h(LOIoEZb4?j:=A`D2J/IqU]A^J%B5$rr;hX_^A5A^O*u^d2A"s:O0[%K)Xaa +`cHp'$Nfhtb/<,uXb"WQXB,3?MLRtleI#Bjq6U"Q0 +YH@bUs,#_WjKDV_/q`\;MuY2n+t&lS9K,Jd[)>Ws7g!hW1%R!%$a"Ea +JbFaam>6T[;@[mr!Co27O*.9=mnQ$nP6RQD9a=GdAXr&3>Qs\JG@tAtH[K$j9QO]C +?!V\tFg+=KW)PN`158ot,7o*?\/o5CY,hMn;i%:N6j+)#LN,<[Z7K&R5;Ub8/^la< +_[8[t5_`!2VG/ho^0O>8qO!_3J-`r1!)h83OT1M\',']l''sTXJG=AE\2aAqGe<_R +HX[bPS`u`4lWI3N>>i\D-tVs!!^tgO0eYpE#a5S4A`=!+,SEqp_=5ieAXl@)$RcbR +'Gtp^[23HdiI?P*N+i+H^_@mkIhiS&-kmh>AQX(dGeGFD,+u7l@%`B3VY-I[EB7!5 +q,G8WM_."C\!aqV^%Q@D`eVI$?Q7\hf[e8'I&V%Uq]I3qJDNQ6Zc^"ukL,LV%)2$S%S6q?f4O[ark +g_=2knC,_@BZ;*9A+'ni4rbku3^rmc*orB*1&^VZofjh&^Rd?4I)[#R]baD/ShUFu +]0Q>V*:8O1Zu:sBIS?S]22o9^XaaDH9W<.B)ETjCA"]R3ZSs!c&=^ +)Z4965,JBoj$HCZg3*nc+1IXV^PRjG^R5;gce;(;hEoEB9]!5b+RRp>jf^&nYJgk" +?j3DQ(^j'C!Y_ZV(b7M]MJ/eP1917QX=Ia\,PEF858NPhj@#6UUT+8"%aWqKN;s7f:WZ0_%X\`[5Q9`qU9)]S +!;U\.D#!,#6B8aDBE'@Z)n(/sIe^N+ImudWZ`];p&[8;8j%hf/-2arOp-/ZWO8Amd +m0WA'+T)`uPYC.f'sh)gd]-Dl.X%AO=bin?K::Iqa_K8._>aN1+%8F0Za6)(2X%+M +"F@IAIFX/1W^,Qq8:f=.mnpDm"9-=c+Lo09";n'I"U;AC_mL)f]#^#FnBq)g;%s.q +j,JD9aiu6reDpf +)#mDmo#`nD$?*LI"\s"cFdEc\l#oBGIui"A7L)2lfI"@W/!Yom!i$j4Gb#`0s- +-AdmYpI_5Y#,JOfO:+\"*i1&I+V,q_Did3BJ)Vn2TMgIE)LSf$6WJA8FYG)TY(f,? +lb:-ZiHU"J;p?*@>Ks?qD0ip?o8A7UmgX,`0YHcfSJgqfn;`:A],p1;?IIN`eN;U< +Hed%ph:26_Vl,1@0C"29l,$1)LE@JlHZ1Z^INWO>5B1-TFf[f55EJ%X^CL\KT"b-j +^;A1pih:q)_1Cshrk+qU69mJ+1cA;i5$U4M.j!(QO,aoKNYKcuj;]%/5;eUKh=mP*A$i]eg35G+bLq@r&53MXQk9p#9+ +Rk.i"?+OMCjHB%O(QJH9f'*!07UI5prbT?sqig*Mp"1e.7PD34@1$tI)EY&J*E>oH +bDhN19TQ1(Suc1D^1R>oL3:g$Xh3&pk$ErPB`EPIRMQp&DUfZ_cqlC=WDri'+8);AgbgShYBH!KK<< +aMkqA;TT-EF?R0^*P#]Dg?GPH%GL9FbQR"V5=C_l'U+-;!JJ,-j>7dAc\9fQW1 +_pH-Ep\u!S4RSHi-2/K:RH6s8I1+jSp"f:2=bmUSkr3 +X,c%6irejjY'+a5\CR]d62j,$W*&J^PsGO4CW+LJ^(^9K>],>^s-8ASs.fR#C&!qQ +fAM-&!`o#E[Oa)=XsgU7QJ1oQm6t7b@du\XJ#2pa,Biqhq&B6=LEZ^5s5;8,ETDqnLK<\%j'+.Bq"@[jCrJ[!`5U)uOUs/'IVs&WgE/V*=Z=)3$O' +Bi+W[&j7<<0L(YblB%1iOHb8X*uei3'5J6p@gb[pgAl0npQH72;j3d$dbXV.HfsSg +&.q`F_W$jd!Wm7qL`[rZKSoul6@Kc1!b(.>_M+]iOZ65iM%E=tE'f@dWE5Pg;#(>e +V/1hu+s9FZ$3l`[Tc-Y8[Q:]p)r@:umF2@6fD(EXH;3!Qmr,Elemrj%`Tg@uQ7JN\ +Y'6?ugV*PtmuH0$]+BDQ0D+!]5@At^d,i9?kHuJjbJVP^6`^Y_m*iP%PIei1@/f,P +q;M,5U#_'([*c\urBTN7@.qrTcG760^;7J=_1J9;U>Fj,rU<#,E%]Z93aKj`Y&%?M +5,g1=VFJ]T7Y-`eZ(crWgnS@nB1spiH6Tq#95+Y)%PsIF&9=n(k].'Q2Y9\\shsA9&%:JXbP!5<] +Ikaar$KQ\io$_Rca.0Xere6Y;3*/c(1a<6ZLr:%%JpkZO/Y(1WSVrpB&b3)\nbKu +)`=MECXub@(gg/Y4Y8O;MG$->6Je>%*`'Rt_m)ZX0a7]8=J\8E+O(3:$*O:=l5L +*k8'mXtco-[bU[]m=-;Es&5pPEq:47^i%Sj2sK[8dW9]pLD&%mlH/Mf;*LNnI&9qqBkep.+pn&u3$2G[56uAQK'>XnQ,PdB'&b6/4 +q>km%.-,J^]j +lFPu)8*'\Z>CM^ZlK>q*:P&%IT8&pJ!QZ@G!kqp2Dc'A>aar@Mq85F'Cb%'C(K]6^ +p^V>LUIs[E;7]f-goAomg.JOeNORlk015?'=K@MD?c/tr,6)GYr$sXRl:Qe7mAIgn +r"ARUid\rIrnr8M!^Qa4Z*-\l(J@R-&.eZfaoIEQ7qtY6OST4Cj7VuM[Dh!1Km99Z^Dg#Wo[puU"Om[!>QjZ#0UYHEDYOY4c399De +[-%V40?Ru^Bukd<,ST`uDiFVa%-@'aUTY0T^,\OWl%II1Vi?.NMY>e-g>hdhV2Igd +k.eK>l.Xjfl__H2'EP)G>rMWr7=`L(-]Gc%8H*-0HSeKG@u0bT(\VZ$q*H+hR+cdk +[WY9SED3`Z6G.GA[c;mQa"c-us4`2+^O4&__fOac\$o+W^3\$#c=,UC&,9GecT494E-`;qs4CQ^dHtJg[F,PeC,;5tLS +j`9NS.U/3'!Vg"EB(/62YaeMmrqDUIr<`L*b1Tec!%ie&.q\tZ'S,#4%VSh8#\[)o +-rC*ID/+6LM@C0E\`3N^pkV9?!>mSOj'*I3l>-*,2.;bB[-0q&p(NA2ac%2Lg75(:`1rtB +D9f@=h]XAn4tFr31Y4NpT1sWl2*kESf3,B(u'^' +qkO?bn:,VY-VOP]F'o@58*gUb;&6t-"S9/I;#,bA!PVqZ%PO?i$R=R:6@&K:JBJJ] +$.rKH'>V)To+qc46m@+G,,O>p8JFk/.Ss7cN$:M#>#QHiX:8pnZF[+$"4\Hf26IVc +:/c:YL[$FNeQ\SXZiNo\gRW%u4P/_CY2/,SQd=>+s//-ZrF*_Np)G-43\V8[IjfJ` +0R7smF_W=QHoOb`S.2n)YV$a!5GTqLeE%@Zp$bKq_:WG;fP'6r=P:UqGC!.@4"6Ph +jNUD<@@WnJbtM.Lr]`<4IV(_,RE:-FVZUj31[e+b]f^$/fC9l2)dWK)&X.^(;#`P3 +rM'nq:ARTkl/d4"V??Rm89ZrDI22FKLA"e6m>VnH>@#mV5pZI@B1SX:TRD)&aoB!5 +Zl`']s)Q]_nMufRkDXl%5^e$BLA\e;J&L=U;ZKSodpFbrr;*ebJ"AFpp))nLK@p'B +Zq$mefD;`g43:PBWD@5&&$"2V82fad>6b=D3q9?ZWPu6oHsX+"6#>6lGpc"u1 +m6h37PjZE2G@;J413Y[F^RHG&9bHceLj+qLgG%Se9XKd)g4G/?@o@mfR!9&e1*I$b +aW_XW:Eniia)LiaE\aWA'^IV$:V)^LKjpB)Z+F9-N@O;p3j=["Z*3?4kUcLe-;UeJ +HZF2ViiR(]Xkniq9.sL#]je8=W[.`-s/Ir>5Je36^\#;GV>s9`D3s\E5QiXo[_X3( +mcPP_hd(6sihGK1B,pqob3?$lm]RW%I.=GmZNo_rpA:JSB0S8k4ujXfnu.mL<;pRI +cWK-'=9-ElDDVpcs/-+9,CM,)s'R4f^YPfkc*sUqLQFaIdHK=cn(h%1dpD4l<^TCJ +YOnnp]?QjDEp`G"Qb8W.V^UDi4+Gt[@_Cqqe +r="rU;>-bB5K_m^:]+K&m=Y=j&jJW,AdEDV")n\]+;O^o,tsSg<@MKZ8QjRVQ<)/2 +Og0]JBMbuR<<:?:JCX3\g6E3M!=/iJkYqcaD\Obl599jl%QVH.ZVB]q,6/hEB"'nL +5`[+f7hoL+:DEqf0MiVk$s#h-C%gaI;1QAq00ie.1spif.L,;P\M11GRAbu@'9h-p +@%o]bV_t3]6mlq)$U"7di;Did2N ++#$rMp/h,5Zu7Ale'i0^d]?AG626ac$+j^-GK%Ujj&cA&YnjT!k&K=&..^Qp"JiHYnr**)[E>dSa=j1-BWa]^rFW$?I(2KmmUCs.T38g--]H,QQsS +V>q@d0Utsi_[f%P"$&K*5E!EhEd7RG+T[3\KPCT/.75Xrb*2o6FbiX);I(/DV[77h +"LP*FSSIUWNVbu+lYs8TFHuf0NRL4bbCM_+6OfVWR_4]id#YR/*GlT`./;OaM-ul/k\/m90/]=o,0Tc>QE]5+::) +cGZ1G->6f[Iuf]K*le34O8Z0cqca=!AfEdNi6>m!>A_l>G#R;d-i]eKHZ'n;_tE8C +dMI\[?QV`&H+lLs[Om1_G6R98(Q=qj10qJsG4F9I`!u59g8/H6!K5R\4MJ,`nM@&W +Si?K(,k[Y%kcC:uVQdOOfRlB9Z`TH"oqk5:lXpr:oV-2N]H)EJMZKO%Yg?Q,YT2\m +O)fD<<,DBX(c#N9S'T"h=]ULJ/M2BJ2M&BI/%?k\KjBG3u +XX(k49X,(kYGFca-rM:ILdDlOQ(OEH_dm:O@mob=N9P1M#Q;bWj3^-m&#IoC)mK)6 +8=ts,^-,$_q2EF6Qe"9EG/N=A/bn:3BXQ1Tnpf3\aXbI4GQc[YotN*Ls%@Ons2B?C +Ip9eiO)NbNkITKYQ^;pqH2FDdhbL\qHIVo=6-n`fHXE694[87VHJ8D;1_YAP$a'#- +(h_kOq1JJD<;c%`-AG[`6W!LRNV*,6qj)U."!,+hmD$iZUX?]e_$B&Y>3jX8j5$g0 +,37XSp8Co:JFa3]nun@kJG^q:c6.V5^kqQqUs)S5@RD.7^A@?Vs65%.!lP46MBZhd +?Xc[L+#!VaA3;6-cq,[/Y#Mo]rscsIo!T&Zr[0VhJJ$+eK.;AFq#;H8LZ2\#/!_mY +5**GqQTs1W;84njfj1n6/k(kQDImLb,.(,` +euoE.(f3^2WM9k1WqHu8+,;B@!dGn#)%e[)q43YjBYA_1=&V^]6W.]:HrEaUIFTC@ +.SM9!P_fK1!iCM2a5QfZQ2)9XO)N,%R%_N42u#Th_)XZ( +g&Lk.^.%kidN\\uZmg).QsVD'+9;ET;h3Et7oKC5s545Z5WK(ncbtm36+`<>H^":= +T]>D7#absmXYlq+imf`j.\oZS<3$G-P;=0=^9%b2G,8iLb%"!,VQ]V3fD87nqG5_L +AfH?aS&4DF0DU*plSdBdYcMoP=mf/Z^I:m04q_K0TRPFbOf'(Rsb/]^1O!_pi +N03#LA+'n9ruT,X4[aQs7t,rPo\he'iAC8M*;91/FP-,M8'mrAhk-VU>F6&d(BFIq +C\0EY^r81G?!<"!]j+dVG^[KXZPs2MUU^@M_WA1d0+)X^RTskBNW.Vb)eVAl[bUcTNo_gh;t?is534r-T][71UNd7)8T#0n^VbXDJa]? +HRmh&i?_,BIfq7r$1m30!_E:ja<.p)^Ne??=Lr@aGg$)qkNm]0B)g[CG+YD9-iF#= +@kOr+EI75+a0Q.[ccl3TSYi$LA/l\(/5.b\a&mDX9H5rUoR*P.!L#Q&aFA#fKmGq2 +BW2MGl:LVqg3mu4qfFalZo<5\q-.Ss$1g)UHT"oMeQ7(HX5$S,8*PkRh->Mm58=-4 +OcrE$Lucm+P]Q0ts,0Ne-,h865jYGX?TJ.q*8g&%i.#VfP!?kfqIU$WJ(4/mT_Jcl +bPBG(Og@[B!raR)J&@"*237laj\PXnQTs35#9YLGV0Z/30D@2Crh8lfs,4g;*!WG@ +s*3lQ!7tZ\>pa)17K.%q^IH;G'!\fQ7RWYE!>Dm&e`)<@bs%dNFC.KaqYPpm%3C +QBZV/'RAgU\.cLNAE>d_UA&a!=1Y]=;_kIUK7Y5p)D1a1ZqS`K!)h7HM2$LXMIgh. +F_V6b+okC>lbiqLKQo"Hr5VpY7U$N)#K)2W,=?Ye&C)Y@_AF;-)7RXI1"n6+c7pQc +2)E3/2q+fMa1$#[:C7$u(Wi9k-4r^!//.P'$#YSQk'VplpppC_Yf$N,b`7/#F[R1Qu'OG)A4;bF,!_0._nq(8M=ZP(d&t_CXU&rtuLO(%]mC +LF.(;9r4JS8ptS,m"O]^QY+p#Sb)[?SC>)k(*Cel-ft*j!hnoe(A;SfOt)d0+MGu*CbF)%..MZ[]hiQpuW9Ei4IIXh`k]Cj4Q:S +5J@&_B@d*+H/moW9hRE'0&B]k;W.CtnGgq%Fc2U;s8)BAT?\:'Fi*p;6^2fX.K:5T +4!rcu2gM9?mIBJdF/g6JU>;@[bEd1>Dri +E;8s\rO3R_5ST+S_;:ekZ\\GZ4IXTN-R;&9L\GQku1-kiF,Q9KF^DT1U +C4nUDB7oo/nKIV3q0SOI^&EZ?N.ETBd+cS(Br-I[_>H^ShbrXf>jL4Eok`-(KD?HC +SfiNqeH<[4X\j=VjmE9%1,kk(8lYd4Ig>nr?]`#C+>('fPhAT#X:7\8E!sMUT`(Em +q)c_,FolUlGMk[_'YXYT8o4Q:R4Xeu5g"3Ps!u#?s6Y:QCK*Uo$mEqm_IH.4IW>HV-1IrLpf@cieKQ>. +J7/f3LsmVZrJ;:-X&[G]Onf[QDishR(Q\ge5=PWn^7j%(WdOk`%tOACKhMJ!L^7Z+ +"VA%u!t!]"_*Ec(\5O@KF@eg2,iJs=`J>R,"@94JZ:>Z?FA'MtJ8#jiH\iH@`Vj_7r#]^6r4gi-#5R.+.bld7e3#j<(I:I1:*KiA8-b6+ +_Hu!X=GMhd:>d(1.7YWE_ +FZ`"i,GP3dY[;M1J9:g?)'/f&nGg?V +(NNr-Q8^\ESXHUIRjgK[Q$ZsqoB^#-[E3BDJ9s(N`3YSD?NT3k*5-)B@d$+IbiA.63CT#:Z+b,d-H"C[_42FMKJH#f(7KRA*d$cMm`l'b@V%m!=8Q&]!)@M_Z*37nLeaC6<[Zg$c +;!U#:ldh88f4$V7=Ignl^'2tiRiM(>cL)k5aJI`*TYk[(m_h<>PJC>;hf,N"">^#rNr.!;Z]i.[eNk)fF`9lLa[p/Ilf4M_B:\gM%V]QeM+4N*D +7p2M`8\P/B0QU.4JqAJ]2ur$Cmq2Z/rh1Cq5aPi--_mkt%cGZYI1-Q,0Rm#\(RVt2 +g8hppJ%HJOB`"HS?g_&Ko,u8\Oh$)AeIlM[fL[53jDQR1fZ6$1+Ff%D%7^EiM_00B +jqWT^#l,,Nr%BJ(JFA<:X@6^/U2i=%a+6LqF-6nN%K=EF5FsCf7r9>Yr^ni'#4MYZ +jfbNp44o2]%J!#ir?YbUA:AHkOXh&rr)'GSjNmE"mIN>[!k9"eku&Q)rJfqqe9jL9 +s")%e6j,@)1eQGSo3ioA!3L9"aT#'8s.fLE!9+K=7meCc'!NS[J7]t:8\bDcJtRt8 +9X>jLKcm$_&5:G'%/U/)cji>Y6)QEL6\K+hL>XV4#OW8@G?V'-Rjp`'kR>CEH%]?> +.M2dh\P-lEUV,*c\B(]nh`WpU,:D(p1YXoQb:,U'*ke2(^UckTT-,l=1+CHt.GY&q +O0kNk!@4M1-R;p:-Wq`XB/bIP@KI!Q[V\!62IHn==Q&.g;+j7s)Y +0L]G;8d[QWnAe#:nO7qJ"E]?ZW=lNpZ668)'V-d^(#<&cd+Or?e!A\9Oji3YfAE&^ +cs&?V?SX`C#3^e6oY[LR#kT,8-l4B5d;^e[IrZ1_c^b+4cNo's=n2F&A78f!jM,'/ +J%l-I5K"#P@;d5"[/7Cqs1?\ +UKP5'jt/c'f_4!LNF*`1o?@lrDiYh8E/aM.1$XfZaRdGC"@&KN!'d,7C$l\$f=ED#m_hm[GZ\mQ@I*:(rCMg56 +3n%,lAg:$Yk/UV*m+GM[C0&:0QK,A%_g+V,m@%-uP>t$`XQ&A#-;YT2IMQi33>1YKO%3Ega]0bOC<&b@dj#!?]L>"g2HQC +`4DeC2a+^_q8r54+5b%uI6l&*lrO%&D_OD91WY(9AR,3Fh3VI==M!t8FOt$mNr.ff +O2j38I_P7DrA-'54mi+1):s(.\Gl)ugKtJ:ggBQ\3TG+)dduh8c`n)>6c8PM+^`Uq +plPO.T\nBEN;b%unFs82I8&!O0\FA0n*h]>riT:/@(FTjkLEJ:b5<.\aM1c8Dm4u& +h!L5L<(Yn'15%sm8s,lR?n^]r)>oO>TY_V/Q2Vg*JeAauS>+gN!n-d?WVPd4C,OjJCO]F1dEVb1&*sj`BH<(2EAT+ +.Gbga+E"B*bT9E0s$Hk3K%\meKEqhk1(+WLYpX&upcf)Z58=,X8T)'f*r-ZpK`B6e +rpPn#G[D,tbq]Udg^s>f[LC(g6B/bB#.HraM +fRt:Im.POFF)uq`@Xa7[m.Tko,l`4_Mg%=Uh"H!jK)=St*kso)n^A5^Y:mD5Ia7ne +dr+UoF+*A9l`1D2G@oZL9Y*GOmW!Qkqs^i9gjo,m^X)*DA#,`jl_b9f14Z&>^VOf; +./<\n&RbU@ +&=#K$?cKR=o52;CJ:%M7"JlBk#XALu92Ph2Mp3CH%"S7a;?4[#P(0I=U]Q'R!bpX: +k;s?r^Ja.*gAbQ-E'B:8+b,Ko6`gR*'M8midS$S1-;O5;hV2E"Kc3-QDlES"rW84; +5j/C0o(N1bUM`KZaSZ(VTc6PSFn7E9%aF68q;HB1mJ2%Q3J4?-k!%.%BM4:+0fU>s$09j +$`I,re]O6?Y7MiP$S2.bATT@"98MSWT3M"Q="+'s17_@l*Jl_`K[9ci0!1-2bM:gh'?\Q,3J'E;`$"T9nhGPiYo.j$WTK<"Z&?L-tL7 +P"$&_a#EepiW+rf*iN$aWKi;I=fbT8QS/W^>SjKr=?6)kD*105FB3m_NU(2 +;5m1p%Xu4,#C^%u3o^hXU;7M6A]^ikKRNtO>9XH;.Dce!#dl"Z\gFkg0#"SFWMLoK +[5G(]/Yf?kX/@JG[sMJ3?hWEn5.#HbXpACb?TO45pQSD38tV\(T:Y0FP;Bk.)$'`S +LO$_s,R5Y%0MXo-9U(.u-ROaA-]1D@9D&rEULOIkqQ0MOe3j)nUVfBqF?p`8bj2#f +09/*.12c^7eBUQ?S)<,p=":s*7H"UYPmG8g@*=SIX6=X-R[IXrdT9bo&]rJIL#O8_jWC8NVhhl +L3Pf7MTmZX/0mg!H-s5r,L(8H/2@9MVYY1'FP@XB].VNZ9uIOjctt,GRn\Jm)$b"8 +$J@\(fLV"Y6qu<-"9598-Y8[-_#J\lYsJi"`!T3>.SpIK_#3;[e1qCeH730\na/$( +,OU%c9Oik.g0kH!BEsK.$`qmKgqK!#[EGMtN7tfO*V_C!7@n]X3_&"G@5%=Z2W_Z' +p6TO\?X9Ig7k*?A)?5#-c-fO[Q7d#[I+IY.s$*_oH9aUR[9kZ'_ipE-+2@1;jInBN +rs:=X`VZ7bs!N"Q+2?b(gF`/,DRf^kc2HBi/mk2oJ`?]^PAZEk425dNp#3"Z<3Zo=L`gO2Q[4^Imho&=#K$+3-jjZ\B/jn,PO8ag%+t>6C%/ +.mR'G.4?q6(@U5sm3G/O=1!lm]N\KI/hXJ`n%ePr!;WDQaF%XMq%l)cIutF.s&I84 +,sWr@l:S8F8fo$+n38Q*AcKpgScHi=,59%#mti,nj[I7_JFGcUIie^K#FE2d62oXP ++(-Ar]S5J(P&_XI\Z_1V$i[?lqeHB7b7Pk*&eP-CDcp*?UUlH;H^fM*R +r5nu;i(*bWDNfgj#kH%7+4S(:W8k0u3Cs/';ZH"p^HYQ="KI@W!DT8[V@Z5sl2h&= +TIuiGe.f-&$Nk,NR+akRnPeGjPm)V:q#F?Wk?jYC#A>E11m1D;-sS2,Q1KSr'l735 +?[7c@Bb@,E^aCee1HWW?,MP(5gEeT'0d4FX3R'0&h&],+2sNtgM\KA<-/"$'kis*X +LpK[3[nQqG-_bKS8hudkJKR,+3A&3!2:3j5hD$b95!I[a2Tdp-bVh5p3\8W%1r(<& +[6'2T$cWad3S]Gs[YbR(8_@gN)WO4Bs)ZXOMR#@%ZTZKPIJCcT))hj#6`Qr/Wo]AN +WkANmb,B'o?9kQMY#WMWnXZ:Po"B'8UdQ%H'EmrO!F-+m=9;+-!`1%Ji;WI'ja'pk +H^:"DPi9IaaTM=;oH*g^J/=rq#:M!2'GgKZ(&O>`qiu5i4@,W*'I]9%8EF8PFX0@? +Pr>M:0##%SWMq>W\N-Lg/\SJHX/BT;Dbj\HDuSZ[O`%[.2c;gp`ZZ0>kDi:+%)>Bm +cH$./J:>-4d#F@nqD"XF5?9b$-lB')6esD&UZ\^sakp'c +[T+/W#4g(Jfq.0;/(o8b]\DR.a,PGJf1#'^h6Yo_I$7G&#$Sr+C?/Q5e-7B:s$4dD +C>:_BPT<5-4,l%>)J/=pat]gT=jRMXNJ_RIMJS4ZX=8jhjA&6m25fP6]Cp> +l-I]N?Cdma+/,;HVB6`KS*Tg@lL>t^oGd(hKDGC*I!XMZHJ3b&5#5gL:OA:,CU7)8 +P@mh-7mjt&?&`L!etZ:3;/&2OAa3Y_9s49C24(*J!RZ%W4G +'Sso5M9ZW*);l=2KT=76VnJ`U'9YT0s)+)oGORgV+!BX*qqk&Gn<1u-Uf&k&A6JdR +M$H!^Q2P/6YWZ@O/J.aic55FFH!l)>+iatJI.4eAe;%Djbq&MH(3p:FHiRS0?!L'i +PV?WZrphh!ZGKtdouI$WX:b6Z$CQ#\s*?E+6%]#q:B:N#V6"6o,614G!'b4^#IQ(6 +gD-DILHMqL((.Kg&L1I*T`B)g/.;]N"dPX!qL/W=dG\28jSi5+0+7SJGc76 +5Z&DWn:,G/Ddf5]mQQ]5CcCj58sXNr#4d6n:0OM>O:GcT6[G1a?Hb&m^iE'i?e%M+ +gGSaJWdUiAOnmHGd09'?0CJk93/G/m'Ijk$$i#8a!8#bAcVZ782hk*6)p3_>k +^$>:&r+E6`NFQnjYZD(6Q[5o`^"A6+j?(&>(C$g^#E9c5)*o%N2/<&&C<\iHVXM`u +^3dZjSV+:n%T;1I6N-C%p#BPhO,m+%3CJF4_S>9T0R\HkJR)YN4]>!6XtlH4 +X;S$?hit`=RCn@uZ`Q37>>F+B<6"WVpPlFQl_Eju79Z'JmP'[VAdnYL>>G]89/62` +lMoM=[.s%.a_%nZ'EL&Os4t%eF)&E8[D7Y(^dXguV8.[^A3hiR,aDJp9eFSA++MK+,s`:/WaCu +o\92L\Gs#h4hkju`Ec,\/Y:b*IW>rNlsI>br4dL&jiKZH`HsdApD?PIr>+ks0>5G3 +I"Ctc"nll\#Q/s*i5Ze\n#uS;q[E(s$d;Dl1#>(I6I(4:#G0lB\409+H, +kip+lkm%IkB7'S)\s`CiL-bfE/RFuBhAqS^D2k-(NF#HH2qGMue@O2\]%:V$[8h+p +)Ku<>^DigHY:;YS]HI?lr(-fB+-"n\C47j$!#J&b&+]aMq-PSXK*Y$iO\OoPIP5?.V3Q)?t:.@#0&q+I$u%s@kl +fe;pY$Tr]^49G<766$$P$foXsGTl[FHh5Ddq0R\jq1T)?OY7h,nq@@2QMQ14($0mt +s(hC'/`.)"!'`gR&.nEQ(]P&-J6Bg;!R:2Ndp$#(.Y)_bs?JJSI= +F+\6Y!^Zh9V(C!-\r]4N._s0$X)e0'q\Y215@kTtOm*+l1DnOKIfkjU(n#n*P=:"O +oG=D[!)Y4OR,TVep+[\n#QuCf!TJ..Ya!6_p8]TPPiV]Wja-+YoA#\mSse]/T&g%Q +:X4'6#Y<-\L6(S%pu./cAiXF73+esJi%5rS..<;uj)%*Z`2Xlqs2g,k5\`(.gF"6% +#sd,#s(%J',j3ZFkEH+IUc9`XJ=%b*W!L"k;!ZIn'EQ$dEr`?d&V,[6bNMK4L^D.\ +b[e22)4j:MhPIc):(_7?-jAQ`QWa$s+r[^1J&;6(=TI";(l`R>;AL^JKG+q?&d4#E +JRVK<=<&_%Ylk,X0%[#6gp7DJ59^&i@b9T`(]9e4Qi)6_gg"L14r=-U9D"#[joP]T +hBg.tAYm,2$9p_H.29'6Os%:Tm2]82),XZ[k@Zrn[g7(9daBD5ln\e4qMl2ai0Ven]j$ +Ce9gCfR@2Ua^FD_M:de-npMSTFUe&J%dX9 +S_ne.Mg)iMn+\Nl@6D*fs7caEeGN_R?Z-/IkLlNsY6TJs +-1K+$m*Er^Hut\MmV17Ij36*cq`i`ZG[ZmJo"R9k`P:;e+i`Ji`dFs3'`TC`bi(J[ +^(*2grE[Z3aSb_0cdQ.bfr0%sYApbp]%'h7S%kuO?))R14VOZM>2][/u@=\1aI"o5b\'^g"0#P_XWp(3)9M'i8fD@_fs +Z0Zte50jVD&+D&2EV"N#_AtX":&8MYHr:;P+La1"LCJ_>->:-]!k6 +<=-a=W@mgAk0k(@Ie#UU/=/!H8!i?49!dd19ODK\6_*R;pfrmh554.bqZ)"_H]$^Q +i$U;\:4a!B7=o/TS@\f9)-^"]&sk9U-2tP$"r,L^Gs6rZ]F&[Ao5Zr%rWhhCrrHC( +/heN#q`mWJ93.o_Aqi+HC$3XQ4lChE\/6.b/e[2GjIb_-Olhgpm[BF/$M)MnO"%5V +"Lp]",f_u6"N3_j8*t:%&$lQOYmLuH,R=^bKTABC\5cL]P^DBn5B=JhU-e%[!iLW4kPSS_]R>fcqja!O+P/V,fhM?$qun8LQF3g_f`O>>K*44bEp\ED5?K%V\0$\Pb[KtdP/.!6O-BQ,6Mg!j +p94e6h1f3R_CjAJkHrmPC?eqRm8Udhksj_)9u\!=NN]`-h8Fs(`Ep^c+j*G=dR0BT +kcqndZ.JY^mJtsjI>IN^!R`L3f_nS3Ft;fH'BPWcg/Ap=_hrTci_>&qXf[:hg74_> +2"QUW>m1gPRJpei?CPGqeje>[7-p_(D52c$#5OGhs6j)d=n_k2<<(!UUF'lR,bkX< +V!k*klpC9hhG);NM.Q&u!H8M/m)$&PU'CfT(FZV_E3(`*mf+1qXN@'hAk20kV0#k( +HQWA@OT1)P.K:Jsmf=H\H(A`CR/oj8'Ldi^lm1lgK&.Hob>_1(]m',*HZ'$XJg99_TQlE?@In0ibP&#?VU@_UU:'t0_>&-"$+,ET(hPpo)J=K_Oj%Cq"Sjf +^HBa?l(*Eugs5fEp"]"Cao9S^m'!O']t]a'p?A[U$Q6Ec1TjJcY"`N"*QqV-c'fTs +RN>!i"$T9T4LBmE1V'ucgYL$?BP"S1ZN7r@9aqLBBmi,`ZrnKHf*@`&!!B1oZg.K/ +T[AN;jPT00"(6SNdEG%PmuGkRQ5o9"Qnltq<`L26d'I_\Ii(MSl_9<2kgSV2lAOd1/S06 +dLf\-J,iIIjPT:H+sI$N%7^8&0Ml*^CrkL@#kWH7HTVJfmee\=?DfTo_iY22flC8u +fr^R12G6fG3?-3"UsEf*A_(YF_>/P&\keUR=/PiTBjOrB8"/G"Uq4MoDK./YhC1ua +9!@2VCJtLTr,fOnK)ja/CMfN:-J;A;"Ul,^5[VgbPq`;V.DorF!^)32LHaOo8MR8j +"sld??it-I9;u;3P/jcch=*Xl^QPQmZK1eA.W?L35ju5_P&lBI,6A44(I0WMZiTs:[.Hb3 +H!F?L]MM/&PHm#cN^94F2.V%""[Pq(]t^p7=Pb#KNK![cm1K"k"CV5+E#Ha3+]nfq +#E$Ct6AU/b2a?NN$[?\TXpg(;`F@gpKHJ%'V;7H$0(JcqY`EfVf3kA271'1XK/D5\!IWr*ukt*&(cC4a2X>g'<9GOp"5L@ +Hs/TdURRePT-AgTs/BQkY^"k&/1fN^d#7rZ7Wce1joQbl9s^q;(K&[l[rFd'E74j6N&LHd2d) +cFXUJfoGeDj-s'=*`9#LqM7'0Qoof3OSqXkif:;hgJ>gW([n&Js%hY4r[2Uor^YN* +O,!L<\=X3/(WVX'%[%Q^U-SKr#;O=$&pt!N-pSaPO93c:(lsi^a%;j^X<-[,,ciAM +4IAAOM2rQ<5m%(I+2`Wn';YFllmrsbRN6g[)LG[Sq7;RV(Cf#XqU"oU+.pBraUbjf +rTk-Q!^Hm9AcKpa%t=N:Od@.2J,)CsbE!9BI[Koi"57B0YlF2-hXB>pqq^kf?b`0) +b@`i-4O*d!j5Q+ASc%/nd\#AZq3,%%IrhsWYHOSrhNagR>qGj;C>o%?"j]p[4?AaO +F#N489[:VVXE3FTVakgk8$]#sZR5OTLi_;T\l/$_r5mbH]_5r4>8+WV&Jb4?3?reR +RDAkRi+E8lm#[hG"FZ6%QPC_6Yj4I="tukTQ[aXW"b?E<]rWOk'2JWC!DOU1*?X5CKQjH$\0GZ +A6_uOlkYVR/;Yr-4&K1ANe$9`WF?0$"b0p&ZIt>u[,q+R)\G?:s7oS3_\K]Q:N!H] +IfOu?8,d^C3ipF=,MT/,(pnCe-;g[8!l4_[%1UO":a,`jPW="%<IV8A>n',_H_)u&)04KEj=6rcWUKW)5oMH_(]Sl]t +KmYCE\a65aF&A7j;9SZMF.Sro^7@oJf?T(oXu5WPDgM([b:C'U[b^>,^>Bh$TUYSP +$[^Ta^"%gepisCaHb0B,X#'$Dk:;VJ?[LH!`grF/f,>0+W]tYZ*5<=]Re"f1*R$,\ +/$,O-72ot4DkEp+:+9n24 +!T\`L^AK*BFuTi9093k:#;GpXEemBl!T\jtBU&K%`H2M5r817:rZ=ak)NH2+*66'Z +UFC_u,M9qSdW@U[`54-=CqEtEH7#D7A;gGJAMA/HgCirh5Z#*;fZiA"ULXqtYRFT=mnr_fOu/hI6H\m?CsA:&j9Geh8*+ +rS)tAJ%8q_:Nt!2Ei8KK2_0?%^#B:KWrII[lH_(`I!D@Oh6SK$/>'Si=F>J0E.'e9 +dT$5An[u2hV#P0m$)$#Nod'Y68_u*j) +!mom*(B8:a["J(57f3c"\"lCD)%6"R`&A8Ar^VT*IX6's!>3Zq@Pm,eL&^t:K_[tY +-K:*J:Q5!8bjTSWnZndFNbu%@lkT`,I5YcrDWDr4CdS,Sp2+QQ?,[!='+k.u(*K8G +#oV21b\<'&oL;JgZOP<:7f[W3&N[U.pq1QH[m,WJ+op]])or9U'CtV^(\IK\\p]:' +T)SdPRF=`?n3b$<&L- +A2?Hh<1@^ZFM>IE=^02%Q7&`VG^ufIZP@%+=&HmZO;5"bne_tW3AaSk(!LTOqH:or +.QBI<;d7;h8/Wm+6Wlo\b"uM"a8M(7.t<8AWS/?X7SbU+X5RgCBVn$<@tEUTo0PW` +,6B>.2uQO9JElH&8h!7Vj).!FfQ&]F/n+iZ!=L(O&-uAq20=WSkQ8oMP"Nn191fjU +M*iEc+"sgVXl1W7`H7rHX\nU^qK0=qa6c-9^4a-HM'\f,_LYSdF;L=J.-N5ci+3R$ +r"DBSF(Mt"kuK%TW+?i'9RnP^!?DXnIfbggC=LWB#.hoIZWNVR459-(q54Gp)<"D8 +6[`in;aFW'EG%dU:No6GD[l,a@7:*)A+Gb%q:MK`@TkoTUEPABB',&jq/:<^k';>E +!)_BeC>Z:D`d.E^$cbt\B#Oia5bu20p]gLgpjNnXAr$tRJ=.;Jm'M.X6Ei.M\MRK3 +AiT,9=PETWj2Q')K98Ms8+o+gg%En#S_ofZoimX4\#6J!:1N1L6j#X1)8j0KLjdcC +6C0U=;XQD1?hHp[G=F6QU8E't$!gNFiKXH(p(>KK;i[F?St2dlYFbH+?O:V^&<'p' +OY>6`f'=bd_PF5@dZ#sVAj,6F4a+H"Ei3Khh:C3H[dLc^G2u]iM/+[Llco(0B(hY4 +jFqRZ+jZ?o!?h\"oRDAfE)>iJme8MKY +IsQ%rbK%6a#^Gt&48V3kkJ3""%tF;uOjDlEp?=ZDIs='62p\G;HHQ0H1%499;ubld +f#ROUs63;K:N)TurN3(Ah;nUd2?*?Rn@s*Kpl2]8&'n=lF/J6E;T7IGZCA1s=(b,Y +:)%!$-s@K==rtdm(s8Hha;aHg)o!5*K0cb]68=[<9CjCHlS_#1/1DaaS;8,Q.^rr9,#n\P57s#2u6!5pEB +Ynea(58LOFKdX`\]\\+3_%GGcN$E"V`AbD+rD-Dl"AJn2!Vjst%J^)sqa'pF$PR(0 +&C\@,WY]$sR>a3LNVPR#CbWWINbX$4R8"CnTRE:1[*JsD'+j<8W`V/*#Cm(&;S]9k +H.=?-D/qn6)Dn8@)q,r3)U'X)f!Hc>$:M[!,=%1n3RZYfR6ZNhX4*9gjimh;"*m&G +I/I,j::n&?LAGF]C5#m>5T&Grcq9qLT1`'h4 +P%GH,RYAj16MiW&6WLG+P(u,kWr_CMEYTtTnm[WdO9O,K0Xi7JB8Q5I"JT-*+O"F) +Z5EL53W[=ZVFibiOo.'L\l)3*'G;uj%'ouT +7(8O$+Ff01lh@1YI2h`qC;\*:4#A3$)3KlOe;=cd*a0T3aj^"tcIQ +!)&6[rte@-ZeDBmq:(X>AqE6+?84ZJI!RXDgi1F$&H1n0M)teE*q[5HCgcFQ6T`"? +7O%Ug5#CkD+fP<1?g/cLeO"T78@]Uq^?CD;D2k.8P(sdJ5m=6u/uh?0ktl3^e\*_O +G]hO.lF;-:UilR9IG;CZHI9!7d1LND:0FlbQL3b^%a$dbGqJg6Q%h6#2T8p>5'FUs +nTl/78fRLsHcF%uX:)/@Vjm8>)[[noq1Gi?*_U+C-DRi+j/\p.$=_Pu(eN`TRNo": +m"m'DI4BE&bBIB[]1=etOSO7FJpe@'IL=/'IUkO?r&=R-N?KJFn&%Qj8Wl=.^Z?

    S[24A^Rt?MS=C&r4tDP4(n=a:=\-( +W4k,jH$-^Xnl4:rn^;L=-"f`+Q\UL^#7@C+o#>urLV%U(448FYP<57YD=u\]&@XC8 +X7p[%4uUpd!=oPfI%Q>UF0W@f2W1jHgbpM;Z8)E@NTmjWHk(>H_1;jt4$iio"h+8W +@hd!ODtPf7(,rq[SV0MKQi5h&"HGFP#\&W)!:r^d!'W\'Z0?`^!oTDsb+CXf)IA6m +5K)R-a?2mZrdGs,k@aSmCjanHcg0[)b<#a#I0U".&,"rb5!7Wu4MYPo"i"'\#)KQ, +b\pK8XU;L*c2qg&[U$^j.$IpDY"+`crqG_V6McNKI?C_BUn0J0C +.asS2dL]Cr1b_.%Pd1SpX!BOk^DnF_\l&JXn9J?NJr,5.e/XI.WAejVAtHhl0Un6q +1Eqq\eLEK0=>"/P"@*=p&HL>3d_PlL+]A`JQZ:RHAFR?7R0*B>aE_M<=&k#P8pE`, +84@?OO^U8="XKF&9pA%8):=aLHWP6ms7G2HPBFEV5+,1'gr$hVda>)FIe!j&Ra$@ +/NTcZK_LilI&,-nV+=4oQPL![s0EX/F./ThgKKMSs$Q`lhVVBDrZ<0nNf?WNa.`9p +:/&a,V_p7d=u9&?V^Jp'/MC?:#D;(Jqahn%OP]<=hJ"2tBuKFnUTXKh=.S)@ +RA.]$Ug=AY.DY3PgVO"a4eL.NUpSW?[E5.(("$=0W#eB,YCbOSa80=K^DuQ@?pe]" +K^feuKdH2jZ[r&k_FH8f,d"OrY&pIFmEW8j?#ZY'jJD:M$Q\>A>0B]! +.kgIJK'iGpAlj6g`P/*GN3ha\_oEL=$-AfZ+K5=iAr&R"(m\hp=P+E*6/Rs37-; +TZIZ657.th^kVZo!'^YJO+?6IL[Gc2\53/i?NTUMp/AjmHH6UNM4"adO+g'.r%+J$ +NPd(?O+qs#BY]C*hMI,>bLW,3_u(8ZbH,<,p+8l`!&ZtaJ#eNYA!:sYrqC3WT`,Jd +di\_/`Y>-N_#9>*!!4u$j@BAVS7msc]-iMmJB]4XK*VJK'6JPYrm^rK?)CtuiR;Va +hkS83b;,T1Bm)3Lm3)K*S$pCF>L((0cQ_GR.,'bI.dTIr=k)_Q6qn.#J=!:;UrlAG +77P]0l.#:2,bQ\GYr!c#,WX^X`s/nn/@Ck='[c$Z7&_k;-;'HQU&&,q@%r2m,oYr: +$f,qFSUh7@2d):E$Xc^1@2ed:"X$9c[^H0$FUao2^I5p>s/U,7lVsjpbm;\;P1;-TTCN5W0K2)V4_Q;cj8"k +C5,=#[[FZ9>Dgm\rXuf8%e6Fm2uVXdOA#A`Z_O>.$gRbLJc=r.5sFl>\-1"d9MHt6 +Vj+MDlFC'Br1%q=cEK9H6jGoJZCG(+SNUg;NW;,TiWAUJJ39m5hR*aJMlT#A5Q&cY +:5:pu3598m[q%LCb'`WAEFmP%ZD^""TK=s5>s+rf=ObVLB]eI-1\e@eP>dXdEP^.< +`QV/p6@\jr?KQ"sM5rdpDg(T_h7`\W:\:ubW4.,JT(c'QGEJMA?uNM^cPj%n60u%@ +I+:YGB;Wme8]*cee1H#Yd("M@rl2V>aDr]f68S@67jaW'>$pO%hX[^q2-9\MQ[8k9?%VYgK$u;/ +$h]e6hU5hJ?B7.\M9kl2-(<;Cb*1\`4n*4:)\a^t;<@g=L&X2*YT"8E,t[fm61p+f +'[7eYp2C^.2$_7'"!hFd##G#a!.B,(diK^tO-#mPU3prk./l(gq2a-P5Im6Q2s^9h +H26NnY?$*n[H>AJr3*1-hHcF0>80;.&Dj#mhONP3S*$nMnlNl4c];,0%$rRW(,,:p +c1McEG3+amk7"b/p9a>#)L:^YDG-'!rXX;,!>jMRfGN[hgZb3X4pt?Y[]j%LO?^p& +@KLEldpm!9+Ta4=OI[&*Yj*6FjF7sb,,!VC!<9NS=D_@k<;lm=+)(0es.^>0bjUC, +p;DUQRpCgcG:W_I&-i[naJt24FEZkM\#K"X]g`R_^7j"_#.dJ_^sQDr2!(@^I?9L +lr&jBcJ,;t25rk^K()!$Db;<"!,/U62VM&tm)]3dcEnp"HLo-JTil6H%J^[Eq[*V_ +]S.s*r+9#:P;Vf)rU3a!G_gWOBfc%H+\B/$dte$S@^P#hbpE:k.:\#1Pp_uW@[=Z_ +.4b1fne^5\52gm@b07dWbb("sSt8K?59bRWZk'*'FJY'Gj!RFnM%Y9M7$o*\:usHC +=#F=X8(P.:nIOb@>>kMP%RbihaOBIbBF&9m('+)Y,/5H:r*RW[$:IRm(g7#:`;b.R +N>2.3!]U='$!T%@.dD9L3hB$^Q&7SE6sh(4_lkWP-]%t>q_2Q?9$,FpfHu$HeW`Ap ++'JXESF:I['"FH7:.HY\p3%D/S4fCG\`M$opb3^pN94Z1JZVa)lf;$%/88U`)nM1l +%Zo6fb+qUZ6C*F*5XdWq=;DR2n38s/b)=O[#Pj-Al1O_;9hdXMXnhAOKj@t3]=U`4 +H7K4*C5)q.7tu^2j)pP!d]#eUR%KK?_Rsc+6%9&SL+CjA;I/C#a^k10'E.YrVS +C"_RCG[e=iILUff!%,0%30YguFJ^-!lI9(nl&HVTaZ,p[+8a\dip:4bUPQA7I- +0P;![/]/M%gH/Cs##4ulga>jNR-.[/06\._q/6\lhAR0c)3s%sOkpqL6$BSqgYh1H>o\s@a+eP;)$!Op8'LEVESO$lbJ8-9(]ZsScOBec +#HY"gN>_9dLA[UdAf$*hJ")2oFSH^2J*6s&IGjM2->rt4!oVdNGK7+;&:`^>@pAmR +O[%fS+p+3hrEo=f0[U&W]X3ce&b+3N*i@9,,j);D*p1I1`o__VcorB8Z16aDaPU^m +DO15@U?7ME;6W@c-7OfPEub>_o@rOAi.$N@lW3Sls'Bh?5at+85@d:hn-DR>#cP3T +n-DR#ZDW?T[mgAm^YPN75k6;t,QB^TEl+-DOI>Tf3q!#in@r%iod0XuZbe^u\?>MLT*6B8cR!b1#C5o=+38q#^s)(!KIp^TJnL<"gnh[>GTnFW:/XP*C]O_iq9`\5Eir0b"_>dEgs%*.S[#"`Z"NXLa!`UqH +;S"k.">;O%>+Vg]V^c7,!+^kdN\-O#TXd<,#=/92%$d?^q-EpAVTM,)]H&PRWD]KruFPds.5h1rr*70rdqCP +&L%2=.J`=h&s`E"jH$Hi3GhnZCHK"7LVeN5S/WsUMn&RKq!/^u3:Q?A^Yi6"s.?]) +>dg`)11"58Y:cd*jqOl&o$nWBlAPkU0J,IM-XN4-S=Q"XEnKW +E1nrF9J?90:ZCK-'3Df,hWrg:[rplIQ<,+cDgU7Rod!4[jN$]#Z+EctL(1bja3H*< +R6&b%+7$&G3m+_)dV\Y';>qbsVh"+bT\+9>9,;-b`%2c3;]JAUS77^h1^]/;sN3^bP%$_q^AKC;48=7fH.D<3_Zh!-CYO.9F!;f +GR-)F+R'DE\en,U+#Cm/9-Kkir-qU;4JeO)j?H>W7[((H"H;h7?N3C_:DqeTlJ%4+ ++2VV'aQG=`gQgDQ)Tk"of_=.)+-3'H@/kZk?NPO(qQgF1]Qius]'nRJh4MBo#PnDA +mb^3Ro/Da)r9D]/:[T7uO'@B'^2`dXfA_:+Q2ZujS0+o1IK+]g\'GeBTes,+H[.)5&kgDG?A[qL$o'k$V+KaM0=BDXk"%V42-D +hes`3r@\A#4=6BGbQdZ/J-^,[=`-C?A(^FgR2NB9_KKSn+9e-,%RU/r(,r8ngV$8^ +n37KcD*D]m+%U/<-ae1bk-:TXXo:h3!FNqJbPhb<[sAYeBI*q?0r7>]RL\16@an$Y +HKb-=-&0abn@0>W(MaZog,pdA%Xgb,a3"_.[s,$RojPLQj7JQI!rbqJk +[s/7Kh>-"/H>@]FS/F.p"SEYZ!c7WR=o`sJ#EOBD_Z-S0Y=UTPV\&ESiZI5W'`T;* +Bg._/re5Vk5qW9;%n,K>P8#`9nQqNI!:o%4Ip$W_S=^LX5N.*k(^aQ;+u8N"\\D-_ +7!F2"9O*ARZO%*?&E>ue6ct/`Q!EgnXH%uf"Jlb1YMqA5!gZB_iI@sJq>X)>!3UVN +)A0jLLc(&(XYQ/,X\=;&PtOC_s0[da/$%P"o?R$8 +p<0?cQ^s)t@="hR>kDrsFr94]5 +n\K9g(A+NNpO;tiS,`0J%>]OA5MZ..p\4XG2FP?Cs)TFQB31;r@@d5SMogHo+oT%9 +Ekcn.kbHTQ&-:)n7F1+MO68G!Isk46AO:W]XS1FW`T_q/nGbh!;8iLPNLATG?AG0- +m,^Lg*ceKXN;$MKaSumoq-G;lA)ItqNrf%uSmLp$Om+g0#lb.3%+GG_km]NT6ic3G +2E-OBrdf5G*CW5DhX7;L#,hOs^XX,ra<,*eU3C&PLkl%Ui\)Z'Q%-aPD;IZo-%O5G +844&?G6-Y%Y_NSb%j:\sM7F%&F"WsJFmt2sHsDtJ@]FY<_Z#PB*X/%[^'Uffh#&*^ +k^ZN(Z\Y#M#n$b546ee#ko]^C/HNi2ItEDc6N06sS/hB8s+C6=guu&Jeh-I]%-D[: +$;^j.JAO5E7KbP.EuQ,=&[8YHn>Od_'S&:Zr"&J89pCMgp#I!+;t\\_Occ7hMZ4kY +1%J,]T:\KSa^J.]e#P7&5\57>KSm.To$dee&hdhSs5`q\dV<XE<&iA#iLD8UsN:O[mSCrP_Xi +"dGlhE]BQLcc"V,,Y'o7Q9mKN8S0To`$1UP(guH5XpiOH+4X?d>&R]jW:%U*PArLF +I]9aEH;EXn6/fKhl/P@cUM9DM3W7EP_im+ZUDZ4j^s,a,eNqlbDW+3/on'Ah_OT4V +Qe#!QFJYT`;"mTnmL[)u&\a"M]hXa*5m%(%pI8lkOeK3B`*h^Eb]XOb(VUt7\W;m[ +i#T2n_9F&]L,HnYbmBWKphdo?;<&($P)2o\Z)K!b.N\?aERO&ZCbQ(Zhb+.XpS!4i +jqB2E=kLE&dec)J[s[8Om_F9,MZ(^Bp@In.YHC\c^&,sqa64T*Qg^W#+?k-rc_p7! +qu$72'Ei@A_'<@f0CQl-Eqf&VDT@3R4oQP,d/X(XqhGtc^3;3q4(er8^0L'DO\]T\Z0c +iCWD.-FJ,4Rk4VN5uP$BM3nSDA,h2Zko9WZ=NJGNi$\=gjA.>n-`23,lHQ"D./7fX +'/`!?7/gd1^`Xi:->%i/>r!J[J$4SspciF_"o3q4.3T?8#afjis$?WmHQ%DeIWD>D +H.#oERD`\,ped:1B;Y#s-jI3\GoJa +.N\#-2Y\BZs4XKKZ5P2\!42`>$DNCiq&(0R?<.cORTZ\J) +CEWc-TQ/>YPB@-`!5Bc>Nnjtj#?&8/%%f]+n&PtuF!CVX3jXWH>+EmFa;nS&3u9U* +3;@dE9JF647+W8i8mPns-;LL!(!hPFJrGhW0De)]P;A!eK.upLgl0jRKI.! +6PZ?5eTJnT!pZ"i$?a!NP@uXJd6^Y7bO4LZ"Sfn!TgmN8['g]kF;@4O0JHTDM1Fh> +)70B?LP,UC:[+12%EmrDB+m?"Ig+Zh7F_@Yrti@Q,66eSD9[.`JnoeRG%oWWED_4" +%a"b1Pka6KmD\V<94J_&@jP3r9am4V2H=d?]'S-ec*^"1qNCF/ZKD(jrXA^J +Vf^,RWoY,gRE;K#A&Xd(ZIak0Y7>U@G94?I[f9+oS+je'h=5?ok9Slg@!@R^/Icl' +JR&gq9@]j&1E,)'h9WF)`pa +#._HUHY:Uk&c(BW6i<+*ZPLisg/`7+]B8O3nA2'iacuY(=l%hj`cm`nD_7D#"WknQ +Dbm=7%8/AKLsEEX/G`"Ys/.]?1#*Wo9XGZ4iRc"d7"P@a].hoU9_AT]$PBUuADDq@ +Q5Ihp!#>=d,@koTqlqOhEo7cpFFr:u+8F`^8FE9O7M<1ke"`h.U_tL;6cWf76pQs,f'K'=\7jh#%QC`p1oUF9rUd5kD\"+:p_18ei:DVXs+q$6oR@i( +J'`XtM#TCYi!]SFQO?.`cj9[KSW(Xu"lt.pb@>+q/\m^MH9(aE+!r_aMmU6%p)>86 +5VK"O'?gt(6r]?]TL/ia781KL@>"TNEfOAC+oLf\+Tcs26pT,?"oLjX7KhA*s6C]h +i]dG@hsAUDp`I7%)#:o[StSK,!9F/F!UfuX->,73^YY8V%kW;d*?kJe!&OhS9`L:U +XgL9>Fc*VjV_7-Tq3NcAq+HTIJ@L+=rYOY%_>cC'bc5K*-,.Y\&ckBR:mF>I9W&L7 +b`g@4f0i19mW)&L%3YJ/TRu,[j"I!8jH4EJZGWUZ<'ALJJ16r3&j"kC`SiqTQ&R +T\$%Z&BTV'/]Lbf3Q5K$pH,\_Y3_f3Q[n9$_#I_b2FN)=PtkTELe`*1:\D[)cS1aN +=qanQ86"gePe)*r3`[@f>#TVNjBj>?ruWX&`)P=S07a>SX0c-^ouNPDs!nZCTi_:EU)j+C(PlfTak5R_KF8"-l6+BG>,h +>dD`_bc0aeeO12R.0's!p8i*7h=0i_'S$tWb?_oP)ruMESE&$8$cmg7::3,->FUkY +:%6b(X4Bb_/e4Md1fCtM>'+>Wkj!E_onfF/&-OeSf+s$@QK3`!=-a7+!G<0*BBNjh +AnopEb:eq2H&bH]/u +nmFYl-Te=QK,dM$!m-h!LH0XINJj4XA0[:SUlinYZAhV!1,'4D$`&uU$=E&#H"1*! +Gh/7(f$1g3T6m]JjAo@TSUSD-@HitIe^J6W>71Z)s4^0nLk&"eqR][pRq%>XrpQ,L +[ZiR2RB^B#!S-.7K`C@E_rSE`eS\(P-COA[t +CPn$f:5EeEVmI`mq=i:GN@/S8Ui-A2cSD^b)Y3oM*89d;G4Z1BpUu.N]nu[%PdGj% +(OOB(I*M<+pVP06cMjkR$l +jq@ZCr;ZKj>\ClP>Q.`'p0`;pIk\RbQe_#f2E=lJ$d3HtH1VN,^I,oGBc)"N!oBId +%O$>/\Q-oFC=n&4a7AQLIQc/XA,(.fT:Y=,d(oZ@8RFl9N=$6trWi8Zr&=WD#UXZt +WSRP!_Z,;e$3"T;GPS2a:_43=nd"Y-+=_@H2#'<%V?]7tLGBeA!WUnW8H-'=N&Cp5 +l:$Un2ck6Uq<94dh'f$9U#sBcH_BLKjH'3l6Kj+p7KEN!,/>C5&H6lG\Qf%$e&%=3 +f5Vr8!X=Yq#=X.h)8@1=]tp+&pqOYOd/njugOhLlTfg!_hs`kW(>SCDaM6,b(%Hcu +lR[QA*Nf?3o=q8o-\1ps6kDTj!.r>rIRQ@q>8bJb_U%KZe*Ee4mB75kWt=\N([S3`n#NDC>@+W@J/=la##QV$ +WTNZQ&KMG4*>ZhZeL=;82=W/EP0QBOf]X(egZDp+rB*k(e_cH(CVRp92)JVq10oNGNlH[r=AQ-QcCT6^>]?<>oq:tB +X6rW]SkCU-b@drDQAq4H1i'Gg[7Sc#p'1sY%cgq;aLjEmEIAu&p-@?f_,T@dB_%_! +[+gd)\#,(%buS2@(L:1*?OfG +Tjafdb`[M0W>%FR%0$!A8\n(u9C_^>iU1\sb`%s9`g_@\+o>GIiN;OrHi;J*8&S3# +Pu$RbcPDK./D8l`EkJenHTZ)T5H_[_XBb'+XgD(]##7p\F*d/^Xl]1?jp9R.C=?5=>i!`mEPUa0:R`X=F>;91&7uU8d!( +)E(>\AcF<>[(mg/;p"V;d0jsKk>#ic3_f_U%irI^p0g+r8Nj],rNDD3@\V.H?b]Kp +4dAjX@?(88"87oZlsFA0?`[YM\Jk/*]q$etn(PDU@*d$"mf34N0e^7e!53lln+.(` +^Na\sB?q+$Gl-Es:CmL!dG\Fq3;2rjYs5j_pqO#ZIrphErH"sq4e;,f;jm+!A9Q7[3LSEhSlDCliHbSq%'%J_d6h.a":PQiWk +AE%k,CmTlf=4/[@\lHSRadI;UI*$IZ=WTH@#L3SGCRJLb!&]]0&u"Fl24Tbo$O$-m +TUllT0LJ<1fYhU1Ya[2N(-AYCa_8^bJVYU;BF)[T7k*Ak7:+?QQeL\^Mq%bp$\4iD +<%fua&%)4sL_o^OKa=?[q5Be^hcL.`mfqua-R7\;"RSl*?tK/89O`UkARIOk9S\X> +f+8$J9YdB5TZSAS04j>n%%S6'h]QOp7knB +p89hQ1R^\!/`Ee^E%XFL.(:dqgD\.Kn`Kr_md,7$fL!=ro`OhLpW0 +5lS]V.A&[dZDcX?b]h`]m?Sa]^WDQ@,s(g.V+U]Ls%=lAjjiuQ5)V(%#t.ILLa

    4ja9+HbgLF%hQ1A(re,1OU8SL)ZsVcd7u49@M!E!euuI7m%> +>?5N@?:SpB=+>38"o:^l6_gB\EUi*X*HVFH6)"*QL4pr6WRKFp1RiSST!b_m[B;)# +ekY0sI:f2>(Ti]sXpl,L%cjedUp'G:?g?TTl![rb@G^E\hX*be)<0EmiS>Bp\35t( +A#enE7JG^N%0%mCEV9 +Y/[V9Z-,K#65?qR&t?t[qD1ZZ.ATEC.Ej,kq<_u2R,?%/=m25-#r%Y_a4fH.oD?-.ptXW,F_ks0@LRP@_!cs;a*Du(P]%JG06iW%du54\#pa*r"mmU'l[rkhb4hd#1=i'PSYT1T(FWUtDt +8tShKHo+\-rkC5gRW)V +9u4'TBGN%f!7r.,WF1%:Cg\Ik,5tXfr$iIJ5gAq8k^FO8TP"B:oT519rbo6n>9.gA +J?AeuK`<@6s'>X!%Wd7">:Cj:>%brrKH^ +p-8Er9pZ^L!0TSEX1%O(s5O^,K*^,pIulnA<[`T]j#\rND[Y"mMJns#t%kt+o]0pRuN_g!g7r<=B&88&E_FFGr0t&[5KB=!:s9YSu=,#;,`#U +C.8H98Jk>C1ZEltg/jaMPs;NL(7gZ%H#`u!5Qj=g!%i`SL^%U9RWS&69ZE(es($C! +J4BSSm0+'J"TjET81,US:5Tep+ljWRJd\MWm&g77,/@SSq#\;7?o"UQeXi(+LFq?D +5k5G2ZD$Uiq6u$8RN%-Rl3eNJq=VSZE$-YJa:.i"r4Y"[2\g0Hna[Y@Nnqsg3gl*9 +0N]"\Q?\\R38O]VOXL`sj9He2TFlt[M#[f,0mrM?KIA1!5^YgF4X?=8OfFEl[&B8: +R,[ei"J\-%ihG2?FD$-c$$,t:ae>T=L/qsjEZbP>H_;0'Jfs7uXQUP%llWAO)Ql@6 +KZ4-C#c;0s1Q&/7out'l!A+c25uY"nW'>LKYYhl*McV9Af#Gka#4pDl1G3k@/p8u# +4-Qgh`aA1j^"IDb?>&VWmeFgcEVB^:%u-MH7oSi9A`"I\\iN]3EO'n58oT5OZn`pi +2oT-pXL^5c^-5`15+$E%5N>c\m:RT=F0WQ' +;?n#=B43t.k,)X#)@8+E0E[T9:Vu`1Qp)QI`1n*`P).e*B`'6B7;a^1egku^7(-`3 ++2@/MXTd0,2s&iY.(\55G%[KE_5R/.K]:stk4,MR!;YNAJDspb]jGfR;g>1EEo'eU +Y065HESF,'Jb3&[;N-#':=3iSr9\%B.qHaP,jD@si\cVeodKb[bd[oRh\ANL`fLK+ +\"4^b-'3G9a9+9i&;mD`92!dF?)`;[fHK%KffHCkAs1Nca +mPhD2SQNq5=O0`Y49dlCHhCE"p084&/U-ho[@mD(5$l2,mjdo.MhaAYJ%#79]5PF] +i6=LZ58joU5N]qs0qZ4%kgR!Os5DXnh`a6oahtW<]:JGP2s>b'cM?eVeA!u4rgdWi +J'#%]U5.bTpW(EoN`9=*Y.d##H[_XM9Q0$%GM-6A8LXQcRdrtcf`St4??[=/^VRd@ +Eo!X'\CG\#r6&b##o/55Y+s\>#]RqRD?UCjjH!,Wr$m_._'8@tR=JY`#\`E&%5$T> +##eDF!a>(!+I3#DP:55n3rB73m%OC`s$u4'#s,a+q!:6Y5bpYU'WBQQ8C6]u!0I-7 +M%)*&+8_ZFn\Ldi.i5a(qV#nZJ,_IA!)!q@e,OGjPU%/HaCMFM? +Gg0#lfE_O.4p49-('+>&&cO.%^o<'#MW7#jB5BDIN\?_CMZ83t)tAF!ab:"N('+9i +(te>-COLA16OkaK*:SGn303QYZS.+'J(U/,Z9nM^&ZPf$au$^m`@=S:99N#D1qb#+ +;j3rU8l:mqE:Ym4Ci9>APg9F,$hD&o5N.(lr"%:fDLS"k']c"+J*IBfA?i3AFV)Is +;I'0=-kY +(_R,_r(d=l="&=o;?,shkXYq&!l4^:aT&,ZM_Udl^XJeBG%Ls7)'MdfK0Q7oPRlnp +DC>YGV'2':%V:EI&-3Y6+HYm_VtbY]/g&F(j['+&g^K+)Ap."1[R>oONU[,m!Cp^i +_c$.NTMBVHJ2fg8%ha\0#69lC"q]?++:u^+eL?MLe]/B8=Jc"ag3>qsNA]AK:!Q.b +S*GM0n1hR!L]Cb[.CGj,UT$DWV%Z`L\#h`q]s"Z8^SlM;AD]XDs'YZ<:^%!mHsF*IQ9Sqd^i>nIY$cE:U-ibcAVbQUXS"N)d!=2'8\N\M>AoP6*'S]%]5Ps"o7A=cHl_Hn%jFs/E^qWW;j%kn0M*X^)F'brZ;&248l?:2;R9OE0-FE'V-M +LM0175FNdRNY4dE-/1u5*Du+R[cqsFL,V\i]k$:i1@BX4j"W=a^GCo*Rm8#cU'srA +i;YMMH(7Ku8A_6eaHMHoc-K??2KbMunfL"32&&FGa5u4S3nF-7f!ZUbGn$6*KWVMg +hl=VdX3'8m;#[a0qrp*6DbJ_1CS]kFgA^(dg@L#QqEIC=J,-L#`:sl;J^/-B%;O +Q/!3/>9BrZfO)>?=1-gh^VOln3uH0Gq0+hs)m-cWM&jqt62jU_8.e1nf>*Z<-O7kMNRnBm.ac@i*&_=fCnn:+9X#jE174h]^f#TFC"!ZK<_ +L]Cm.!:Ku&3(Y(I6TP?@rWI^%Ifb"L+E?]u!#cYo-apMt!'C<@r/Y2An43H_q>8B, +r_<3)0oOjhR:G>]jaWF11g3"^\0+4,W5OnfY7rn#[GrkJAl=o^Z8XYL)! +2cDIP.Ma'+q!:#p.foW^HHg8uL#]X^[R:*3lMn(IV8<1cs+q#sj\Lum*6`-eB+t8_ +E+anF)*poMhj!QXVgGeMDG?QeR;A'5>O%AG@\,lMWoL"WX-8g6ag)Pf\<%1h434%d +LHlNe\a3MH4t_=o#`&`f@5a%j4oe.Tjp0Wk:83G0WY1W/P_F8lPd(oK%/EK+XI(Ul +U/dOupqLFai4iO57Phf*[-!.RbneMFn.u30L%V-KJoKWnIXbD'f2^aP'\KOuAg<1` +:&d!Urth!?(R2oSQGaN)`KaIN6:XjPP>kbUKH`ZTQdda@s474>/O9/E"Cu?F5F!)] +LZ74WbQ@g"]ij:nL/8q)*sZ-C)T0,YiTtM3.i_"tEeD385TnbKkIC\"^ua`=I;HNN +Bm!9Ip&q-B?=uHq0cj74N[bK.'`,^STKNuTXuQn=ZT)!4B"[uqGg5MAam*!eV30R+To?&Nm-?f+ +2`cuTDV]fGp!!`D],nGop9\u*>HKuY\*\RHD9)P@45]Hipf@-OV`jP\HYKtc3*6"* +f(sI6%2>EU-ojFi$Ci%b=WK%smE8Z"b#n%%\^\Ju%4@\;*^+/n^T;d!8[`Ju+#WZi +Zh5*\F_9gMrr12'ZC"dMRDcB_B#_a4bTO>>9BI+=Ql4o*:hDK,j2j!.Z#H1Ze,F:6 +2JIN-Zjeid1?8DH^Fc#(Ug<:hh`>clgWLX&^\<0Nrq;pkhD!#3GDrr[bfIr*YRl)) +aN6_+%PmSl-9`(fTZheBPtsCC%.Ja3K',@CrO3HBp7pHC,Nk@bXu4bcio],3Q9UUM +q=8:PA"1/-ljQ%&HLe*Q(;>*sp8]!hql^!ld=-@biChq3pT70HSK>C#fRM<&H"p*^ +3@%A-Ee:#(;e:NgnA,&T9$^t6$Wmr@N`#uli2pOCW_fFM!WHG=1H2k'D*A'Zm3lCJ +,K2&.i0Sg;'`G$JlN[3a2gj+>)hIq5f4+QJVWGQuK)NGiLsB"p>P[LQY5B*%d(:@a +],BaBe))fGqK43cH7sHR=#S2qkY[C1$M>AmA0_X.j4)o+c]p +hU^[mO:\`!A8sE";apBER%YBfJ5O"@5m8Nmf`+O,3b_Kh/;j(K"=QeDJH&\5dT*IZ +\q%2]lsMK.N;.n;H9X7Chi@;L5RREJq<'YlMK7VkJSG/5-NZlj,3"lDFmj=jCb+qN>F"8FEH,q?41\p53O3N/No@&NSl'drjr'0rUXNWgTGL&kF5:%cP +^K(]WT,r)M!L"^@6Rlj7M!:jJiFmg"4rpTiIg,ak` +Mfr49cnD:ocLo?Cqc#TOk9(A@^D>2"3\Z%>R,9sPm$MSi>Vl7:Vje]*C;;a$[#E+` +r+GNg?OZp@d`?M/GI]e,nK3bbK)DsCiT9FIg<(8:\i`S/!*TACdS;V])"@3LW9s;R +L]%bVs1k"pJ!<#O`eOheQkIgZ+J,'d/2#$e!jk!77"E,+CbiI@p:o)5Oc'4$5P@cj"O6?"Qm2cbWgI+6X]H!E=&Hc'XZgFnBS$N^eJ/"pe9U7_1!PP>d +?u<^,i.10-[()Ul5-?Can:X70W$iLLKG)^H>!X>T\^HF8@'t-&XURh'[AMR1Q8^nh +7-It7mT\Qef[q8#g_ni"*BA7WoYR$D)p[Ce+7D3SI/j#9bL[`GI%g/Zo5.9n5oq=RG? +T3e3-Ih2>sl@8:fmKLE+n(/Vf!6"n3^OM7AS!SE8H9q%YB;@chMY\]][Joj:XZs>1 +otu+]hmpGhopbea\8Lf8$c?=81\Tb`jIJAB[r7>`ZoNGHD31'52opJ!fX?@mhi\%2 +=eNj&kN!/bgRiE1/%c84i0#js\92OnHB]4m> +ZtE]SS!?$HKuEnL=Y\j'Q/jpkJ$2=.,/A!05Ae3;$sFCart-&mR0'"G6(aj%G99*R +,f@m6s'(%4l*f?4MHt<##C?\Eo^m\F>WAH +Re1\JS6[jr8&X*^`P54#imE;S>AS@4QK]1&Ufoj[=rLAcpW7+?j6cfO]rJV,25[;I +!7er8,G8B.Dl0Eq9%/UM6aDt_GT]sB2?B1D-UP_&b1-i(*t +_M("ldXm_Yhe[!M_gh0*.+/c%oKhRLnm>N@h,p.K?QBAj$=q3A#T/7$Le!4fJH9Eb +*0+Mhs+BT,VBc7R]Y5!'^^,sNiGm`LUgS4H0KgqT?hc_baNt66#NWYgs$)DA:KO^o +-c;R$oN3U"%J!k$G8(#FZePXJnXl"p2VXYA["8-hs0ht5r`95s;XhF[/8ti>XoR)< +k;`E7XoOsL%dni2n[%&c-C;3hl"P1J)Z^QS<_!6`!K4'g^J/Z)>!6]]J,!`+&Rce/ +L'W;F+HhnO'M)h85U*=(Ut+sG4KF?PRM4A?7(+t`glYc($=m1uYHAs3Z$H8kp@1d; +7rLE@Fm!*.IAbdPT2L(4Pl-Bed]`'F?J'+>FgpYYDV;Y673CsZIC.&ipa#]hjr<() +f=0*c[a=p+`U@]0^:@DGnp8P:)k=r,,S+almb)9co>K&2[^pD3lFhVXkH:rTHT$rA +Zef]j>5R+njm>q89n)dFp=a:=AS3@]:\NtR[8UccMMNYsR(jDNX3j6kR]An62/'Q* +c.5b`%EsM1`WCepRq_#hCg.cfL_6bIcf$pSP[348mOOj9(n3pTBM2P9%;!epEUql_:NCS47sJ6FbFd +8Z6AdS75DW;d[Vm*'r:@[)>@9-IV'cbQZ'kKNt@45QrB1abX#nF<+kf!Ne;TD%>:] +Tecal:-`(r;V)8SCO,-tVS!9Ge@BmI[LSk/+_>1Tk6+70JjUUq2 +jH6oWkaO$`?_(a+m7$='G>c3R''%S>YlC'Yj^AmF* +"-9#kI;jDsY-$*@2hnJ>4XC%ma1A0[`JHPF`6;tX5I_)##4eZt-cPseAej_oV/K*D +=AT/;eIbMK<8/>C6OKdNM:&>5)HBJ38Ea&FK.;Qo!>XDlaS-pp-I4a7=dKi#J56&t>BNVhe(=QZ*YD!+if6bVo*s+h1pn*'A5r:[]J,#Yo)o=pL1G%/a@GiM9%17[J +J7pqC&KkEja>.(9g4M>]&s?!Y%/b%1"jKr[;:Ld +N.@;Q3J/L;c[DH*-&H8+m)9Vor3I"8q^f%'9nE&cd]ZN$S][$u&b[UthYm&1nEJUL +r$HG6esqc0A.l#fWHKC#!NYI[&-6kaFK_L#/]Woa@pPI@=!lFb$?RUXSI'Kf'`TBCqBV?`bfEqcERfd_Ho(:0T62j^Ye&*9l_BRk7 +@kaq(nDE9lUk_/tM:;OHIhaI5[5%/8!Csrr"FZ4)(nLfJ7`)u-YHJc?D_e^@o"U"U +^OMV,36E0[jc&1)i(_H%kN9bAIn1P7FNXE/?iIG4pERK(iIN\'GC]_lhY*VW"8ndI +*_Rl,%f:`%gJ(eqG%\-OQ^o^+6S +7jj>0\"7eTV=:=HZEGn45.8[`-nE"^X1U=EEq==l9e0Mbc-'D%ANOeQ[,$j^]/_@S +cH!]NhK[mZZTDB;@^ogVM\T59OL_+uBrfTs)4E$BA*%C2Jf:Va`[]A(2.NYH0iO"m +lB&H:A`VoT3@kDriT4!(&RH\W[8>&;B`0o5U7\hL_)aYbI*kc9PHFgB&,362jIV%i +hJE&kCYe`'p-3M*ke>=#qpn:*?5^C+h044?qrZ8195J:D&fbJh4pHtC1nF-\[++O(is3m;9eGn-9%DR7Dr?!\5 +s5.n7T0Fq)knD434JM[Z&$*HjhpIMQm/#Ef?*E,3o?9)jO.R;;E-LBg'-fH=%:!0+ +5F^rkM]LU\FftUFQX/m`>nI,5)jO7qKDas_LCE6^T9_KNS2533N5@ZWKR`@,!"k2O +Wl9r_6IuQpruhQ]s8*C9;F21]1s;(pC!%V%1(F_g5\<4^A?,b,C-W,+3n3G1+jk%d +:B5r5(2SZ6jNV$E"T(glLEQR$o:H9p:5&?&&$-#?r)Z/_5&o-a84!5([l!?4,[E/J +iK+.=LHKC<#>?nF!LNc'quAH9fUbQ#"7hd0\)k<`34*rlLq'GZQBKOUASXb!4ODoQB-PhgI?DV#??UIbVNhC=Z1Z +1aC.s6,ibP''0)Mr=A8@J,3-Or:0(Q\tKn_W7!T,#5NW/gVNer%DEN?$;YMS_U&>% +1p,.O>RL"2niU>CrT`*)SZJZ,iVoScWo[k8C'9,ct:T;2. +"Aiti-A1:tjQm?IM#Td<^'N=,AHVoK-^`hGj-WZ%)iR*!Yl-kr0@8eQi=p6X)I779 +%bP&]TB"l3i.!in->dR^C9W.jIUl'JBsp^ +,Seq:\ro +V-*'VdFRV.lKa)Flho1HS:\)EVS0t6Xf9InrfTf._^._57\m"Mdq*3e"HAY=JJ-I> +MY\jME!7/Z6t=csA1`KSJU0r?aKVn:Fq3!EB8._6\;ZhTU.d@Hm:'u,jII-an3XoW +#t2Q<[ea4A]K7=C3tghj1ECZmGMT[T"5K=3]fk2">N4kkd>mPJ*S4JacY2DfVZ`Ik +SE5dbYb]K?GJmHQkmOcoQg"8fr4bL*F:9,i[R,_\KF3qt6D[Yg&gaTX9F[8h_^Vh; +J@6EDaTf+VO#^L0^K8\8X[5)aBWDha'VUM6[!i-pjPfrbYCsKqSr&MVkWmHiU3E`` +:Qjp3>L`[:O+)7&oe-hPs7&)?pWjTQf?7`t^019rf;eTDs%tBCs6<+6=$L0S08]U@ +s5P[rGSb&LmpE3smE5t=nKR._cguYVPk\le8H8,$o"TH@p:U\l5.R`]h4*/+]@?Mt +q.#JWl@!Vai/[J])cum^Vn,1n4-?9WrjGg&9?*Z!R,oKDg98Km(np:$h,u*[[OIV] +6>E-W3Mtm*Ba&VT^)7ZbqEg*Tpu`/#LhW5-PY2j<@tV`!=AO%qP8Z@HS3V&J=R5Arsb;"GFRZ?NBX% +Z5KFl^p,"-rc`'2%YMi:'Y@$O[or"(b!H#5^``aV/r0LQaK#UCQ(`^P&lM09l<$Fh +O/eE6Q;jS9I4,.^rn2Bp-InMZG%D=m`;b[5)m9*e>mYF^gs[-bF[b\'@<:TtnIP1l +6Leu]<,"h`MaR'3@28QeY$V3[s(V2i5P+iu7/le+MT%cl4%MTaC`L@!IFh/NGJ5rA +fFcYV-M1S8_pO^J.q:W/20T(8@n4\gT%(58qT#uq`;fG8,#\?⪼OaH[WrU[\%YV +&PW-hT^FT@En?paFYlOjK31gLIR4),./*>4q6pCiW^$f`-@eCj:u! +EQ9F$PLBU&s89NoX9+U^+8g&^2U`Je[+VQ<[/XG*2NP2hlY<>!Id,fej=!1hl2/-g +VcS5%s3iF0i-V]jgHmNOLo43l]'KZplGiCU8jWGQT7d/XE5<(=&&c"D0Yn2EH'&4V +*9TWkKHcpops1.7%2%Oj!$$U.b6+7u^*a3K(PDO?r.Er--n4^u[.)&KJAgI]H+Xd* +m1Hrn;O:VQF@l1G$9W34`7pOLf5HFZc:'7%Lf`Ap/:/dNE]I(h`(J.XCPAs.jLqsX +52&<[3CWo)/G6o%kV(5T+.bsZ4&(-9Qgq0u`](?Qf@SDs=`bsD?;BR0,uXNB^\giF +c&M.g$VoPmVr3eAM*M;J/]Fm=0jK%r#.q@K1*lUh:nC&`bL=gdT:k9T]U:"'$aL +KsERL[0EbbUSXi(a*Os9mtj@& +WYU$LB7,J>qgKP,rqu%:o@HbYq85k%IseZ`ZR[o*]j69Rr#a=6Lkl#&IG"1;nPB&^ +C'PV^1DEOa12JR?1Oj`7Ap! +!P*8Lk+YcS,/?FD%PF\(Mp3LKE#jc5O/G5L>r1:?-kf'M_PeS+&3%^o3%TOf?4IMYTOk@R$S[K*a-+fC +'`h@K^h+-=9Oao&ij+@@[oMFmMqnl"a!p\,A:C^Ei.D;sLP&2[!gL5$81%P>WA[(( +h+>d3?O2ohFJ`Q=a[eMg57ojnpOiLX@]h=gr7a8bk5F;sZ(SPN.P*Ajj-3_+Y$;lG +JH$F@P`%ooKg?[]oDNEmjor$o'VG;r,[5on,:^mHg,@XDRr&JU[mdYEEPp22l$1d* +I)XgQC-)p,foH.aeuiQlc@V"S'=)"lOuG29Vls$]j6KZXO^.[Z#*@5R[K@79T"TQKuF!6s5(ShJO0"V +0GdoCl"P._s'uEq2Za&",@G3hYlAS8A5Th2Q2!QVk_b(SOl=W,)L@V8j_W8c1>2&O +je%,hn0FC9PMYoa7c+lTN[N@fl4Q]=J7(_3O%I"sYrKXCY'";!arqkWA0 +;W$dVKDF>0U!q81]#5)VaPhfMfP[$XXWiZlBX[ES-B?@)i3cS**#1!,P*\'!kf:Z53^7;^eo?WV:2/Y.is6PnbDaq)sb[!G>T2o$JGX[WbQDp6[-t)>#0JuPd&qdS_;%!ZG;bKW2 +JUqVK!VqO>5d61SQ_A@YMO(#*"\Mdf9KC8D//L#s"XmZ,;FaQ@Ki/UW;eVSM2Y5:p +13>ksj'K]e-[Lid0["^qJ\I>DIYcf7*F2 +/QP#6rnr/dr+Z*$K;L:1J)7?Oq>ZMZec"Y]%DR1fn_]quro,Gu^OKM`\!KP`l[I]7 +mZ`*HMtik/V6=3)4`e3rOcpg[C`^98\a)SfCF@oGmV<"%a)1*t=VWbAHs3LZ;.Z4u +QtN5W.B.;RC`!s+`[%E9M/cL2*eb;ig;d`a$0e,h:uO$7T`n>EOGeXV<^AADdhq3D +R)B;h1iAR)*V-!nRW;#NUe?qo$^5IWas0H(GSr/!ZQB=%=AWdQDNW9\$oFc\95idu]7IpT8!g^T,K)tf&FQYp*?AR(8&3XB2n$9)/augJrjU1Q+9KXDY@^2%),ZS3_#?QS!$_H^!>R29 +\RATX*`Lc>S"2>eTd;7>W;3ccSeZUu\t`oee[Of.flHb%]6f)BcL+EInI>B#mJ +Bl>VNMq?Vtn?duLS^Ch_ptnU>:OpdUe?NPY'9d71rsDrf0-qZ@`=aZ[IkZ?p/gKr] +KLLDQ`5dPAqu2ZHF8cCSr(e!dKd&YK5B,P10)-OLn+#uMDa<4i8I7EQ6P)Mj&*=CW +jaiMPPl4GJ4'b1.;dcp>$+0NI-Bleai9U%U]ro2MYB:[4K'(LgX^KVGGK,hjXZuig ++S5RMRkWL?b:SI6IAc1IKj+eG<5J3*P_m=XG5FqiASNQEA2e`4u +M5-D(bU6Ysqoo:'/estK0&E$H?^n&uRAsVcBj-qdY0QRq\NIi;)6_AHetrYOUYTL4 +NY7\Q5f]X3CXHf5Y5Gm>d*Y0L7kpd@(q#T;3_N:N)*1glGm)@@Tqqs(BV]GajP_ls +,"=uCLb#I#RS(%E;Oo4a*%goZ[3;n3cJ"l75H-*d2--8j1nA^Xc?Y)Y"h,=.mhDA$ +o?V-iB,1Vse%G(A`q)OhN!R$SFe1pO$'Pe"`1al.X&>5q_L%T]o +G`!qW.3hZH!,)VS,uh7)MA9X\q,B0]`E4P.6no%f&P=:T6K()"f@6HT7EirGH-_H4 +^M]].%&+h/nUD>QrCtLc\srM6Q]M(4WVkYg:lOjg\PiCj4*>e'k6JE%r9NS*J)f)R +RrCmerYPM4l'jP[_Y6CJ62giL(E7hr>gq#kAH2:!mf.a'qj7&]^Nhp@r>YNM>nXet +:A32?io.#j44i2hca9=%[;?,Pr0'm'Uk@9L?Z*8)8BnJ]oNFCSe9L^;@g +M@Cf)_[ulS!#YobV\KaDA/5<]5\OI=?;O*,#F]-'OFKd=dh-W.L$e7nCOT-Qo%Oe"(TC5\u]ENgm#La/3M#?Y(.edbcDkSb[CJ,R-U$Q--@e4M`qR1gc]=pI: +cef8'o_.]t+:Gb(&_7uCV^FL2e%EYFO^9QY`P9)$MZ85,3;>]Mm8#+6s&\E$T4H7Y +QlfGRNY;B@Mn`anHMA0CofJ_bp\hk*Sskk(:ZMER6Y"!L;*k49Dd\Y7p&FLeDgYeL +2'n]ZO[/jU&TDD..#n:j!Y@h5UDb>l@;R1\^X(HuGIIah3!+-lT1o)@M#dBPYN)VC +d6tV\@Mdo/NW0@85W#Y!-_^#UADXiG*>R&c(ES)O^_>]&@KPQh:m+TVrYH.Ae+Gqt +pcf>NdJi<[s)A/]aPRdJqBPP5Uk,HQ+D!c"6P7;Os1K&3>=?Z,B4#4q8R(=3'Z\FOX1#[)cFgL?r7h1o]0iY)A'DtlN+]Kl>2H`td78QI +>A'r(Sn!6<4:D)eK6,uN]`%\VQ$P*?hMe*DrQN=LXF#)8f1kAo%'io\o@(CLM8%-b +5]qIY/j<5V)ls,S]f!(_W_ccb\$ak^/2.E6$OpdT$4W9[YtnF%eQ.K0$^&";.8,c. +'Xa5\>3SN7=9[uh6A*Vde=l\-Ui1i#!4`5+^R,V!0qq:Q&N&?r&oB&EKd._hMm@tK +Fe#us>HkA7]PXT.Bs-@$YtmBiB:Z\V%c/'BkHqea]WUMc@cQ.0L:u!'c/WB9/]D]q +T!&>Yb:%-L_jEsY),(KKk5;EXYlAhO[f@ZTm.lm@!',t!Wu,IMi%7@RI,rI@JKlS] +6pW.,0Mi=S0L@M49I";;J^0LRS(Qp*2=mgH,;1_2^#Pp&PsTsd+8Gb0GNA_n_7\Yh +OoJe7(]P(Cri>Qgs.'@Ag=ll*Gh_CO`;^s0c@Pn/5;3"Ms8V'.g>BSK$i^1fZ]5"S +7)RnfDYio%%6qM3mZX-mmp9gXr>b^f?/D?GU3kL&[q&GSP0I2sFk3=H3E/;&b,nat +QP>`G\RA+)T9SUf,hd7CAlPM$d>_Q+6XPWLgHc5*R?Ea>^s"6X^q;G4TE%<:EZhk; +"[X,1:aZeCV96.Eo4g%clp^tU\nJ@#EhM%E70*-eGA.)H(9 +^L5;:>kJAgh;YM/P]d>\%Umd79KL*Kd[4;["moM?OTY1g_#FFfaJTbuQ:/+[`B!sN +r!@l8Il[W63%=@J+RFS35@@b"puWm:73aL#p]R@P8&.Cj.:D.>/OI6j'-`:E"S2`V8pV]]OM>B,WWIQ89l%i$(::O0Rja7J?G5'f +;n9;NQ_rG"%kW=[32nT*Wq9e9L]@mt&W"(*5g"QC&:Q(\1odpAWuP&Q%g9J@4f7\l +=LqQ"8"nkup@b*eo^;thc@cDJL51;#O^WLOQ`#H*o'-RM6W"^%:]/hP/cdPDaDmCs71=2Jk^8!4UJJ=uZb +rXX8-_#LZY(\g4YlqOCNjp1MP!4gR-5lN`gUWl%`Whbaj4>@/`h\?_`_a;-N&qL#H +7R5miM?4)]0I[DX7?Or2S.^Jb.fXHm&;"/[-U1#u3WFH=GjGP3a79atEnV&Dj?P>D ++u'9!2BW)!5q2?='Due/)K".,7Z5&ik3G_CNK-6NF?.hOdlr'IGhN*3U"(tcps6oAPhqUVlX>8[+ +;K%69o,d%hB')8Jb\K]c-]XmB)`-2o,hQ;YCFeq!QMJ*AC!-DAjaku'LbPiJeVce=\PfQ-tib;bL+^0e6@o%ld8BN>%/^$ +(V^?:O+WXkTFusJnQF6/%[7+r+%)G;Pj(]k&U]5lb&$%j@`aA5nq:>=+P6&TLV(Gc],6e1`V)+ +s*O'Vo)I/XdD+J+p[=1(s6%i7IsS(&MZ9_aX2DP1hh>g[nPeFs1AQElpAb-N%lJSs +7*D4:'YXeLO"Z37^A_K3Y5d0bF[(/Up93neq>MsG+(!jof(o0/p?KA4U@EdLc>@:3 +V1eJ?7)%s*X.KENghjhCp?CaNRORL<\7B#I9NW8M!LaTTTH+e`L.(nN0J"u=Lb3+G +Z6JY(P*$%>dCk'K +I=m9X?fGM$g`/ds"H5[*=TI)k@Yb#r"-72f0!WSOEI4J]r*/mjAV$Ku(fHMEM1A.( +3>0=%%u4?X[32jSK>-K07nkV5-eD;V>:Jg+M"`PLe#AuJYV.Cr:P[]90k^S%f`-RZ +idW`QLW\L6U9ICkS^Yj?q<"oY/Re"i=H@C1Nbs&g5l7IrK4gprk@6jqiks@n7Y#9< +U[Wpi0>p?+`^W]nLA!q9$Zj1]"gMA][9D'T8"8,Z(%`N-"FG4ha7Xod$QjnfIl0#K +5KB'g,M<45o04uE$':LgH>L$"-<#\#f=&3=4?]m:R$!G)8ojnQ)TLk95;OaVT>>_> +63Q4fLR.!^N?T/>7QnIXhJ-f6>As_Tl1kk[J&p4Br_LOo6NeYJplNg$&hD%S+-aE?AJTJd,EoP*C>rq@'g4L +Fn@hV1I@SjFNk7c-=^^-f+(IXdFTp(mMe#5WS4okoA-4\.a!TIt$Ml-1%@cpg*S +.oB-ZFN^$]fb'])hkheEfHhB(38Z8pl$.GSs&:io.7a=_N:%ljB-FU`L]P?tq9)EF +MHKEn#,FM"):\a>5ReX78(6CG%V68L:'oAsVZJ=^C;pKHa#ifod+Nik3)ad6Lq2-^`:"fV +n_)4e8n?+8"t!A6"u-,I5T+;C"R(RCqI(Nf!CD*$=Q5^03%(C9OLZ_n +SnY0J7cp2*HKPQC^ca@E/4dF3;W!WgW"B2Tih0T\.1e7B",?k45@ip)&V(f$g^DJ: +LYFfq#<1o.*M`\%9S?HZGUS7.6M,"G)>Ik#!\cj#YR7*?4qP&X!2BEGY4hB=(GlIc +1dM4.?kE*T!r!nr3R>1\nncePSj2:c%R;3FX?$;8IE7g=L=9X5OFG7,toVc[ZYK/ +q/q/Kc,%')U.67s*I03RG]j8(ZAH<(KAM@hfL):tTl9AYrVtd.6/OkW^:o=c85jHI +d&VWfZj!)\G4Q8+Et#0.UUV9cdHM?CAj-8nlhLh5_NVkkE1$]Rcnsb(s*+\c/A]5r +@n"V%,%aJ&[QX/qU_Lq._>c&T$.W9U[9'*j)Dor/9s]s_aL"K@*bAZ^j[c24)=(ZU +O"rNIXQAl_e_^5sTn89_r3`g-[>?-/dfiSJY:c-BC+F?(5@\21E:U/OnS`IbhrZ?$ +bu/qQVVo%b]PE7(ViNUB<6Q$]KrU9K!1=Z/rhgq=2c*0MK?F.cJV?#d_/oVY!uV\+ +dl;"`!k\g(s83]`"TNDGd)?oF5CVQMn'/h'&)Drsc/eir.I(iT8,mrQj4B>+rVidZ +cX&0;qBj:uQEKi4=$Pb2c$pl9HLUrIn$0.tn`6V1F8s!]$hF>XX4=t3Z1?Mm`@2%7d@I*+/ +Mc6.F&^L._DgY)82B\G.i(jjiB*O(=!s3`,#T+7/$jsfM!;N1H!5+rC??kWo,Xg+NjO +pt5Lj*l]>lCAG"9Sn!dnS)IPKp':TsPQ/2nU]2oe4NddJ0J2i(Md/NZ^qhRA!R9We +o)IMF(*U]?584.qco_!?A/Cli-NsuX5dcXpj7fO0q%*:.:&CPH\^[S15K,r>GAC7^PS"ILN8L,"C27%kWaJbB-#nG[;Iqc&Jt^-/:Z8t(ckr&6e;g]!m&YsE4* +bkT0D"PE^.jbXpX-?!560n%O9e.$1Lf<7qV>+UCc1G)0L>+*p6`%r1\r_`\`ros2c +QM*Pmr-7-qTD>^S*el'upMTYD]km#$P0imD8@aADq8!6cMm6S>b6"9&h2"+DQllQA\\4$4^B:JN +r1*QCkCANL%Ea)BKg2XI7%bAndJY0l;CNG\qtpf)8*4td]JdFCb\S'Zbn?"=]P&!1 +kSb6oFYiVhF,Mo6g3T`4#$i38]18jNAsACN +J.T7NaOZ0+%EMAdeC>SUe.ub6o9ZKK(91JXW3ZCmK#E=Se]E/sS.;KmalD"44N(>$Hg=/:dTCR47&Hf\Cd3H*TQ^66)071]9Q*qnYXlpb?fUBe0i +^);%I!4pgC&+`TKTKj[+;'9r&KUAES4]M)f*t,2p'0oE,##5:aj7DLHp-3p\'=hd= +#l,&I7Ed#dX>(R("nZNT9#`XhkRB-?H3jI_'4:G0&%>L;q@NMjPPDM7]]\nR3kWSt +US^gOi=J3MR/Q9)m*@k+IgWm)H]=Z3gMlh$9io*LqKr-Y@; +f.U,%gU!1FqGd,P5$IWCqoaJ68,5)]/:R&8rYmroo&YW_Kt"umcM/nJgiY%b#F'"2 +'PM.T;\Rs6;>/pee%e5tE*q(-5C9bu2qHVDHcNp%66FU"^eH8.1!S\H?1BA_e +NW;i$^^_5BOA0-OY_eDqZQg5ZeB3X&H2G:*M\".@>EJN8kj=r#U_?O`i#AC++ZQ*Y +p\Q0^UBidsoTPS*4n(C$Hj1Je_QVb&KMV7AR@C+"`;^)85Na`YJ*Sr31da(>V;X[i +!kNZc@?I[!BKAN`6*"]&FP6qO^<(%rRuA>nM$nk3$!&#&Af')?_Yjc089-]';O:0K +^V$n6hl"7?`?#0oUnM_-_2uR8rDn43fP6aJ:6)H/qVO=]a8V]s(e0eKJ)c@?0J#!i +a\3pWgSimkVJo;2]^sA[D0s^dZ/Y!&oH)frpRFnK?d+O9=rmq3KBGPq\#`B]\hSUP +c0ZHk[r(PSlc/iSlZ5"gc!#71RpKM^WUX9*m]M*?BK4K^O5S"79Od5Wi]fM"k5WW( ++[#QrNMPQd+TH\.3"d,8q"e6uDMP"aMuHdR:FX:2Un_F/E;lL*IsapP0eNM,:JXVr +AgGj3'(Gq=&?j +&EN;Fdjm;=gc>E7h>a(Ni3<6V8HFhO>5jX$O8(pRio4hT[/Y.!mq"TEj+&[UJ7EbC +XDXWS,IDedDSMEtMZD\.-,b?3r;ibH-[0oJ0"2Pmn$%8Ws,6_#cosHm>&.e,>'P3P +cg0X[4\\L4Hdc?4(Tt90.(^d2FPh+&q#?`q"YX^/^:@J?[8R7tT$D]O1unNtlFe4X +4.FaSX6B45og/e0`Ikm87^p^<9>bERlMhWa&Ko3P= +$H?:.=&V.ni3&6SL_Z"aWaMYgbrubdh:gO2X.GAG;j(CT+] +`HZ[7jRMRKkjP\I(N)6+d['0kY21nj@$kBK:2i[X)[;$8qZc>4Hg:o`RRVT`_`aNP +?7r%hGTV.8NsAqjNduReXp#ps!9OMCcjl!A$mQVLW0!g*F^,"#Vkc.Yl]_Zs9(ks< +GA.lgc6^2//+i$.!0lA;NVa/)n:/60j\PeM#T7pGIl[Wj,Q_F5/tE(@WrqtqJWQ24 ++D0ZmIc6Cg8Up8UUS5`CS6o&&r,D^.4hCSZIdHYM>gH3.;*Quus"TM>$&/bpEKXh# +iYn`Jn4.,]jT%^J`;dFE`\14caSB2HCWo4taiq_.Z7S1"!dG7W(5K]j'\Ze9]3@rg +*!,Q4RfNH(GJ_f-pUTAd\"(1.=:GBQ.XZ]Q+&kl!l_ok?C(1IeGmO. +-%07#bWIA]N6.V($MTc7Yg=$2G,3>P=.J(oHp)i85*5f@o^MOSj#=&6lt_)lk4TIp +GAbY;mb46;mbD+Omat^QrPUf$J_cu@(f_&eZeO%8omac(N7@k=!Dre0s0%M1i8k8m +huau)jQ'*!r.thJnaH#-@t3k=itffmn@r#Q%fW)k;,'d-M>om@3WHu%nGhR:(a<@. +;G9T2)#QT[0*D7?[7[Cqa^$U=s42hWhAoY)bFsY+_!`R$!1j7S'Ym,@r54*:O<79Q +i"+W/OaGk]QWjO,?d8T-PZL6t^u[WEJ,4s*52PuH(D-UVB_dFY>U'2UOE2Ooo$/m- ++9#bg1thE(DalfV!70pG5QnlP!!N)C_!RKOg&Z.V!E]9-r1,Hs_^Y<3`AXdH2A$9h:%=,:JpSPUu't(hHE@OA^L$GoTU.T@RYJo;)_7CZ[M%*-bd/< +.]7Xqq@([SZrD\?.a`&9ROUVPV3oA&r2T4!#p0*,r81OCdDLG@.Xt;%&jcq)0GLob +g7%TEKnZ;%in:aQrUFq*@&7eK.PtJ&R''31f.J^WY:N]$<30cU=1&dYMRF_0WrVsn +:"gHkfFUFNAZ"[j54*h]_N5HS&HH):p-3"'l/LTRp:o(-L]:C +:)unLega+ZbXXTM1*11=4u^W1gVikfSG"?U%0]iL.R/?E(I2B$Jm# +)m=_7\b^I:eSjq@rT#A%>Xo^qcE*5o3sS[r1>VA`FC2YICSJgpD*_l +p>U#J=9QVCCHLa\X!J:qo5=3,p)NlG;fP'$iL$[nNn;O9e;b!hp@ZsXpXXH\e9,ue +p)e2il>@O*Ae4X?+UH)63=l5VLX;L]IBq +'*&UE*;7-jY2P;g*V)EWlT^F1'D=Z,CuH;7>a(.[[c7Y7V#]In$BWeHkjcJU@",oW +Oo`N!I_4$@;g:V-Ago<]WDb0aBZ7C`O`aE8R?[dISW4SeAP-O*<*C[2Q3eG^`9!Nn +q9tVDW=-o,hnKsF4I6ntQlW_WFc:#6%M8Wbgg);jn(sJIkN'Ln]8MGH\n?6OmZWRE +>rrEHUY9E['E^@%]S"l2gqJepkdWTU"VYJDTl^RQL*g)BSMUqV?DX\'&7F +17GdrqT^B]g\aC]oSdg2!Y9bj(]VGRj!-n=!p'7i/HDdM%6>6<+P>I=,/=QbVkG># +jg;(]"n6e@KAQ<`^F^F=LD0_2"n7:4.p6)/h*o*;=2t+ +6EV.J5SdaT$C=i^oZ6C+r9\Za"2FFR0j"q`DoR"JCJAWYM$*<-g4U6>`9@o`mfIPC +!VT!Ura_u$I&u>iFQpIh`K./;]Q]Zn#^C\(?.hKH +YFl[Ekii(ne3uN.ADB)d\osIKgW`u?@jG$4J/C:kPc58Hs796(#5hgt9cfJtE%r7Z +7_Qe)GR+,eZMFn)<'iQ,QRbet+:n;g9+["?j +>@_Agg_CKHh9=]ZE]1!nl^#P5F"OV2Y$!L1A<#+WF'Zd`T=-Uf*=WtUL:ok.V-)PZ +l+5'=[81X=5.atfg.'c]lU>`pjh76OYCt&\QQ2c?J;YSq4lMgamC68H[4^S!ZQV2dJJ)Obl=no\"Ma+q/j86e)oLQRg +Nc;fpqfk9kIl;BL6bV.P,IIL@ +EkhZnWh2@;.%&od5AtOt%kJ.tJAi[LcN!_qTj^&B%\f@&R)\sA8KM9._S^Ha^O:Y@ +rc`($DB7>Ef_7TN!W2j,)V>2^57fYj"8X>G)%](F*39Whks\pkg.RKca;g%lHO;pE +]jE94JG-Z[Y#idOT_e^o)Nf)tIVESXDqUc\'DZ^kjPMZ-eW4e@F+UH^B[T\^%9"8& +<+@N^FL+\lG-2/LYF2Kt(?[AEo6#RqTcP?IchUpd_#>^s5=pJ2!tg'go)Q*aLqsmW +i.(a:+94so#o3THNgs#F#-gN%nd"c5/2F\;M@Z.086pOFr_#TD][/c.&6l$Njsc.0 +>%sOigSa0*R8+C`X;i>DVe]%pg9^LU%<(u9\Go6Mkh=6/0)IRSn(=5f2ui=$]t4T3?X#oMU_H:MG?+:FuSgF,LFeDe]$As81dfI*!VDl3lMCOr7QNNkmN8`*iD] +kqera")^mn'`VbqQG;;'U"+9:0"'!L2c!-unF1oA%tAWj*ua4X'E!nOjT!n9l23ZX +(P_^Wg^%gQZs\i-$XO*>g!!'%!Shk+cd`ZtZitkSl9ceH#mK&Q#@FOhe*M-+]e5#Z +.! +nd"dP/bSb40MQjDa(,ugS0G",Ci`3_`7XQs.B&gDY5k/b+Rr&e/ +Y9;ujV*`u)#l@T.l!g[\[cOLof#sXE;=_q+ +aU9I(hDeGUjnt6bY/u%b!YZaX\q%7ciiSnmXAU^Jd*lFqQj5cf@GJE7]Pa6b\t?7T +8YoUhO;'_NaMOf2p%3O$'kjn)0j]US9)$.lrQtO.<^_(r0O%1QW\UHYPS09*@3n9E +H_d'8ga/ua=&tB+eh-SQRRTM"oZf.nNR[81J?TV9XhJV$D-]?j9@D'(# +^6V*(#,rDTN$mf[mN5nEC;rbi`_2D[!?,T9,nE<"U0-n&E$OG2'!%!bd5ln1bS]&cn;D2Yc1?`$bP^>6(6jci0R7O68a7amh=Jn'TP0hh`-W +9Mk+t!TJKQ"dr0IJ)GeW&Us/#7g#jumQTPfi)mpU+F)5qCi8?Y?iJ"A\hUYe!6mJm +4+[?+d*=I^B,WY6q^ftB&c!+?n&p3cJX@OSa7;/+f`:HYC&dMDD"u%G0\El>Z@CVh +[r=S8O;,JrE6o`=@O=W=spam>IV6+665% +c,p(`1fo'@;.*6:d4#^*k%.'GL@7+Cs&=C8I!YS!Q*HfS9S*-13]RT1^LqKahGXgV +T:UPjbQ@:lfu8`l/HHBSf)Y=!_)!!m"lOkQkC7dai-6[&'+qaB$t1g +oN3:tP"L`['DSqIOFJt6n+H?7S]@l+/sE-\@-f/Xs2&72m$sO>T+qTjS583aei*[X]b7OdPn3s+MooU0H(bCl#k2=$L[_k)?C/gp<4X(W +VaKb%YHIE8/Mdi(JD&&f7=`;Q\c5%(s%*T[47Fg=As;'M7/fs5^APhFoIXG[q#2p6 +,HYbVDa7iV5Y3U2_!PNS]*k[2i:JG=#P^Sgr\BC;$K_SP+V+?>dDgU\9hPMPj48^:78\]_='7 +hn,3Ec<9;aH]0I:kk0)j@Knt/6VmKULTHHHQ5DPS;K<`)<[oXj/g:!3jnq>? +:4`F8l/I2WpA\MTl78`l(GiWp=l=d@)&%mWIOPo\Yb[84D1^1WH1bi@_e`,4ILNu& +j4?hrAm*]a>4\aiKNbhaJ%j214N]/PgLj+kdX*a_Al8rKV,-Qnc_U;g"9Ka+oT7E4 ++J;i@d$1O3FqK';`Eq,;O>bEO"']A4JJ&Y=- +K-6g2J8^PXX:"t($gZsR+,84X![N(q@$l1uDUtW&k +s7">s/:[OZ<1Sbp+FrF$Vc!fY+J;n*!'/c0W\Qu%5F]a/dNc`@,XJ>m3dO>#BpIWU +O%J[s8-f6k1hafDg!nsA\C,]([+1Snl-&N&(A?=]*,Jq;[_?;,L@Un)ja6mSf*jt, +YJ5)$E+n$Oo)7*6r+Rq_GLS&;ktN+^_"h +;5nS,kD*`cXAf0r6NEgS>Y(su_Z#>ehe:4\QU6;n62nh&O9KNK52`a0G[:,o='j7C +=67c/#uV@3;ZP?s>tnapROT-pjC@ujF+SiYi$SoAHt'b)QD?des+9/1s#7@lS(km? +#U$2HadLHaNP`8Q5*:?!MMp4Q?7^R[^VudYZ=fOFCo[pnG*0s$E:>_s^m#X".f@%9tU&X[J?L:+e:T0'Yqk(DCQ<>'FaGm)bnLmM/AS"?m +$fb=1'$?N;CY.OFdV$Y$F(DcWo/G57DJLJ=&"SiM%OUIOTFO"Hp0f`dFX,C36R,HA:BnD<&DaIc4]+dtAJ9B6 +*.>=-IS]l)3%]DFh;.Qb]+\H +K"`d-?BSW$`%G35#2t47EUQ0")/>]i&&;p#8_ +&)Q;U^W8RE+_X`Ij"dr_hDtT#[i`'+NIi8C0D\Di(!j@/NjR:QD%A +'5TibBHNfKViSS(4G=%mJGaEWYKg,tZUs[_ +bTE^p9L/NZ;bQeP/>Fi@@a&iEnsoE$;Z$V."PEYAVDZt>bP"!fI*UMt-b%Nj>8&Qd +Xi.&"6pPV^@KOWc\h_#MQq%/P#CKZ\YJf`Ai=j`C'%-h*rhkX'&b1@!e'J"@&Gap: +F6f8SoaLu8afC.4XQK;1puY)%#FGC$>DCOkBs=n%2R^RJYdm.3%pm06ouI-*2j=CC +@.$@o_&NHF:ZV!8AN9kG+Fe_lf+uFNrjTB@Teq>(WQY[ui$DoNNRH(RU4N!sI2f^% +]=E^o=XSu&cAs550GX`lH#e9(dlX:rfbO>LmYIcbd\!,*4ZQ8eFGTX05Q/D>g-$D& +?#@+N^X\+B\'ap7BU&Nof`*!65-`@s8iJ$E_>iI"!;VuA"$^M=Ymg.%nefC+=??4a +Q:R@>139u\9=%OI/P]0Ei>=(u0!2M7QJ:b5gf^tj]6X3;gT'5XFlSsL-b>5ED(2(C +0:URjgsB6/YrTS"3G2!CA>DRT]ifU/ +]J&]\CZ=57&HD07e2r$ADsp#rO/"3-[-'>&+)QfnmpmJ:0_Q8;"uB,''PaL"_#2H5 +fhSLZ]&HS24Dd_RXZ)g]O>EN@,=:ti"off( +)M)MKdGY.K5t-:QO03:amuCJc27P+bLli9=%&FBk5G;gO8/ae +LGQ\n0_;@BdQbJsjfbSF5ilmQpm^fgm[HfSK6iCAT%'2'V/h0IH?(5!%L0\&S;,WP` +^fQhgYiK@8n36pPLD3RMZ*i[55Z>\RcitS_-_X`IATUPTP=rXZbb,r+VJLWG`J-`*YE_$bk +\HJ/j"Vb)Q)"-.f*RkiHW46(VsnVI:SQe/O_TcaX8M)W$-\+T?9f/o@[nDa +)9;u5rZ&[Sk4;-"s7+KO7/l[W:aQotm/$5&U8X4!-i\LU,fFc-Vk7F=*ep)-,$F4nI=K1 +>oC-DUn8W!5<#&'i-=Tu;qV"$m#8Zk48Qp%OY?-_G^_%#l#$'ja-]X20d#Xkgp`,` +^*D/-^VrjXek2FZTSYFWO+:>aR^,eUM"6$B_jn`nV_XJCZuGsS0?Wms5U;Rd,WMM,oFJV+31pZ>bue&h[dN^chXV]cnsojt +3sOe.#0XJo/K3UFhDf"7Zsjair]XqIho.A^Q#?2B(](LKS:E!tD-$OYkco)LX`=0pt=s8>-L5 +Tme>SIih!E1c,u)p8"EeoB7!T&Pr0>06a.77^2nW\V^$`1N`!`7oJNAb+*gM98`b[ +f0i\I(!jQ;VM5)F\JKp?cgn%65PmYUBE%eEN3DZoq!;8^a!XdA5FhN"p$nCC76e=- +o"hS%/H;jLgDiLh@Bg?_Bg`d#*F:+K,'QY2VLEP_[o-/>5(f%SQZ2'j\e +b*(ABVA9uGPndkpXj&-j0.gb#Q*EXSMK5koJuu&''O[ub3<\h9aBpU`Jc@;O+ip8U +UB#$OJE:]NK(DD@Q%8Eihl.>%]ETGN^PN2l310iHEU^3M*?5-;!34SqYG[8*;Z'U# +3<'G@!guHrg33j=_#+]$4CW=4J*7l$Wu0nnQ2Q+*)5q-E!k413>1KV2;(I%`,R++] ++ofa]7ef.+h^M#>kGTo`](/gK7@IPFDGXp^P\GGd3_#TVe:[d(AubjNrjQi;";(0/ +lra7Os1($HcfX@$q#_BCa6`aBMh_OjrD0#F!7_RR!<;*)1H^'eE)FsejqmjK6D%I% +E)AS_I_2i4Ne[UrF?gBkM(6bZHn11$X2,rpEoA8<5lOu&o0N@CD9KA)/D@hKFEap9 +mso0QI%_c%^&(,mT\bBKtFu"t9:[Gs#O9fDj?-_0l9TkH!a/k0Nt94a;\tqnGQ&&J."[VccjJ +aK)IRKD_G<#Pn5u*2f-?F0S"0H:tj#R&MfJF@NFLbVr\D(;&)YPe!=;JD6>V76lmZ +S*TTU"27#Q"9H.@Rig\:EsM<-_*!&ehr`7kq6I,es.+%agFFLU'+AJ3emrn\#R4MD +4#ZSHmRfOkPB_7)iVq6g7jfLPg!77C1ZIMe&[+ku]Y'0mdSBWHPI+uB&75Co(\.!, +qL';"kM'tIk?&;Okb-0=BKHoAW!N't5TPb[SI>[UaN[.3(;lBZe>4i8qB+d**lf[g +AZgrN_"E0sp4$C24XZY[c]21sQ+V!SL4!im8Ki&BZDnpjc,%8V%4cbZ+[CKd]:IkClVejs#an5af'B?0@ +GGIDWST*[Ugq,MbIW0A`a1!=AFOQtF%l$:2Ljm)TrFS.Oe\R&S2D?5QAXk[-Y$4QR +-:U-iW&'Uf:.(RG7UHiJMFS>Zo^+3L/foF18=u$=R4R'N$r(B`GKX[3-)$eMVZjGA +!IYKN2U.raaIl>Id>+*&!23g^D'J%jk'9DV'0bQD:>0X+d%=ptk;P34s52]SF7nL& +I+n2`\GlNm'uAF%L#@G#!EXa;s)0Np^OD:;`P%\3SBL]fM<*P6:42`Gph0=h5:_.8+#LSl/OM +$C$jQQPZQ$'W%.\UmIBZPa,gGQa8.kfLe./:armc!J%&!Mig@i%)kHWW5SZG"6Lsj +63oiP!,;GBF@)r+]hn_JGi4'd()XN2Won^j,R)6s,6,4X%3MPBM=[dllnF^o-IkMY +bg3Juo."U)..qSr:E@32Va50-64"@D5-r%?_Y^ds#+eHm57^L8UAanZO+8.K#]'hK +a<(EX"1ei\4"PkH>EPqLA,cWl<?tLH*ZITL +O&A,rptt.@'8Z\+&HJFL&b,D)J1lSr,P4f&8V$`P/cbr*_@]W/&-Zlp]G%[14VsA! +]^lWohrr8cq6tXU2cSm^fAuT^((@Z))t-ld[CKs`:[+I"qb2:eI#7 +;L,7OU-qsa_C,9(s!GDf2h*BhDEAR4Kjk#!L[_1cPYE( +8EEW^IU[c0>O$Bi!:jc_s7#3<0PuAREC8mM@fCR!dfJB(gj-sQ) +oYoZM*:q7[W+UhRALD4::?2"St[Lt?i,Y3_riSt\G*Jt=$V4k@ljfSM5f1!_bN +j-Ah?%m")f]@F9n10X\rZsbCubsU#ZjQ.TkQY+@46h.?SB#kX"("AhYMKjGm!kg.V +;%eZ_^FD,Cr*L;]aA8JlV(`9;d;-'e.[I?IV(B5R'XVK(Hh5h?/D8gkEbjjLdESLU +r\MH\]q`0,;;Ifu4ZoW4e_A)$j.iW:+m%;So"N@aHT!M2g6FnM-(XE>h`Suo@j:lF +SOlZU^Nj,?mr+'[k]#nGN[Ohf8G$7"1]Mh9mGihX&,&E(3>V/_B)3`HN&r'Djta:o +)f8;>?.$0A^F>$uRY[grcjZP\?V8'kLN^REFQ68@isOM6+52RtGV"TjKH_>U,-YP8Q(m:E*jh?uck5QVKc8+$o]enk(:i2e03Zc-eejRJHaOs@FS("AOf&C-DsE4MD2[7O)qu0bmrTp6>@[Vd'Y?CtY=qhD;Ce!" +'ad^HS6K=F!Q17hB9ZGm(!BNJb/++Wji(pK`G*9jiJ.&-&.dZk9Gb.;'oc^Nm_M37_ +\4$=]-il$',L=b*A39j.l//C-O +[;l8*SK#Gf",QsXPD^*om,jaeH2kd;o<:qA(-E`D_XdqUeYnfF\D75%$V#.E4AJ*1 +J']bk/Kfk"TNqg8!,75kOkOkXkJW]-[!8G5"1#(ugtme`J`_R3p1;u:XP2?51t,O2 +Dl`HE0GOPuRjLh<:/R;V:@%FU2Br0bHZ8(ra1`+/me%28&]"DoG<$fJg)=#!eZWe' +=P;K>ZDhhTF42V#IoFPEk#U:5Br6dfVWK)$r/(HIncu116_/]Tr_9hKSLIX>Q'.n+ +Pq&b*/L0hQ.jW(5ji'P/m!l;E5bf#,s4^5X;!S)'s"7Nih4.t4at/8uGX;NmX>9:[ +c^baAk7[er#-ph0+,YOrqn`15O!j"crrW7S70MmPd:GmWHe@BGk,WBb8 +kPV=)eF>_er:/U'a6^$)VM72JH14Zs\QdOrP/1Q6PO14HP7o@=?;p"cuV[aUij5u71&+5'&3 +TG?;1^r5efTkgcD7SDJ_B+,M2]2p^j(SggHRU:Z:Ht6[7o]^Hl1..VNO=)b5&fC\8 +If^93:5E#9&@j8SEbRYB+o%uC'h`G`.2dli$`q@ej\qr0/po%eH=9V'BJY'8R2_Q-=/su(OK&Zg_E8$#f +Udq=m?bRlT2`J_TnOW"RDG0ck7,k,R7=TWBq8m(-?OnkTg`Q(3[YP`Hcss3A]E]HS +U:l7oP`:"K;>29a+-1TNd68/R/sgbQ;VL)pkh%q<>8]J!JPIW@#rT;"8NTt(Ng?E7 +7Hi=QkiNWDaDuB5)<:5GW#K<+p2Lp2+[4o4NWaG5&)F[QH(R"[WN)mu\esmqUQ9#$ +T2GUfiL\\orVmKP(]PV-i&(h$!6Y=_cgejO5)'KA*tD! +3n>*eD.gf\`ot-%FGDpYDtPk33ONR5FfIorU/\$@eK01NQt31!T>I0 +Z@%I[mrF!QGoe=L=Q"[+V-=XQ$7['JTH2$?!he6jXE07<4Q7-[Us5O^=Xi*1QeU,Z +2q1_bhRS#Ke*>aP-%#L3pCA^V),Xa*Y.JtKiUD$^Z(9HU].M($XX@`I-hfSqm<,#V +lb_eVojIL).74"]/YJ-dea:V^f=.hqDdCiC$JJk9d^HT\Xbb?T>122(*;2UOCArb` +WQtNAX0^/\ajh66'H0Ps8u,;__Z(#0It70@_HVPu.Z$GaMZ8(.rBgO2*/ibrW;Js\ +B"\nMs-Na%2Z098#=/9ao7I.s_t3^ird8O2WpO.r-_UBu:N$6Hf@4hts$?PRB7&Wj +4WtW_;Ld-jEI2Zfa)&rGRF>+XIn`P719F68=g$a`W4?ZF:obBO9Naikb\G.1R>1Y. +aG!Ikjo>7/IrW8r*t/i_"r@NF$A4U:a\BhT5bZ4/r\(L$nuV7aX!>gUO?&j+gYj*( +^APQmXKtMQ=HbqtS8r:1g)XDe>/A7f/UCi<`+q1$GP9I74%oV0/E=5:Qk0::cS/_` +'leMhnalhAOcB#1RaJ,"aBRH`TEX`1UFA3?W0k;127$d1Z_;nPR6u1TnNi]M2I2Nd +:aXX+8bDR!##LUV0>T?#&fGHtR&^lF=2[T[M.\G9@,r]_$I\.]Gu:EK8ZELVCINtR +0-n_i2V0T"BNm@J[;N"R*4L>cZrmN%@WC>uEke%Yd +j$7fMd00dBS<\9C9Y82m:92b/(&1i(;oRt]3lZ$;,&bSa\42/FEmS,.\g[lT.AgHm +6p9EAq.;;?r@)d^:W,290Rp_oDXLEFeL/eK50(D61*;DRTAC.Z\Bt8B7GG`0'J)cX4>)_.aNN$Ijlu@,9L@D0.Kp'-(V'6A +ndK8a;+$aY/%4[f2Q[P1COf>6,!'kHKeA>j^tRBI+jH_I%hgc2p](T4ap_95O0in7 ++94'DJV=oIY_*^7\Eq98f5lNJ/j?G_K^iQ*?BYA(H\Wbd3!6*#K^U[R!N/4O+UIu& +TbiH5@&mI!`\/YBhkX@^rc/%40B;B@3$<\P"G*F$6WK_OY/gbGCR!b,(?L%S%RpK6 +Mu\IO`\ZBFQsW=5.1DM)4,hi)HLWNcgYKnNW.#jaWlJbn%=;`;`)f;cr/B +=1\Sm:/%3_e,]%M8Cgj7\n\N:re%>28(TDblrpf&D=[FuqE`>(Ns)Or4Xq4P2cQWso;J)mXZ4pj_ +L]BOETN6W,,CmkrY>LX'2s33'"X&;6^Us'\:qAO"8nUm&SMm/Me<+7MLZrF,N6 +SRRXQ6Ag8r=+Zo+?G'D[j<(Hj5SO@,3d_fb;PQ_XaSRn@OrU7r4 +NVe,-PlDO)",3#V,up4'$'j"7pKh3Xb?NnDkLl@c2L@=^h["J_"[R&Jr'.D/^_s+H +R;G\]g6Huu2sR*!kbko1>a^UuF!'F$Zh3/DVgiZ9n\Kd4pLb_"1E5lHFO\Lg,+]g6 +Gbg7;D[X.iC=,a.`iKd><28Cbg6U:]Noc5>--YX:VH:dEMatj'>9+K"5298MiNe& +mb4!%aR5F^YDIhis.c?oT:Cl?r+s6:GJnuVBCsf"7"'?Lq=gZ.^YZd(r=%_G;;)DI +dA7%hcA@RGU"N\XK8V'4d>WU!BF-`2#+_%.0Ba8I=O7.FoWTECW^74tUPEU26e1D: +.b]LUgAP@S"Zsl&,beoQUFn^&6sW!8&3ZqH/Dq=IJa4V0;e#inA.lClEt +_5$!Wi5aah3'@J>98BQoS!Ij=Z/H"mm5b:A]O#F'$NPqoT6COURhT>D125g4j]]`]RKBqkL/ae=7,E][qD@EG,Y>m1$*Nkl5M,$ +LNdEm:E+5E1#0L`Ht';@e?&&]IQQMK=c.W&i9XdjR6AjE1QGD_G-W<6_tpd.NoCKe +8iens!Z`3cjhU`<1(jU>XX/rYGSEt5^[0G0>NTlV[c$:D2Y"OenI,ALr7*9b=tYFN +!(6g<'`[*@XXX_VDpmg!s'<(Pf`/A]Y8tiJK7GfYU$N$[)ms."=q";u=mEA*\X[o( +-!=XEpLf2,ra:3E5K58ue%X=W9`eZJ0)LM*8`_&0kB:lteL]_[RT_Vj+/l=#;BKqs +X$(k3QIjH+Gr"`HFJC]nCJ%UlP0;@s`U]h!MUW8aAsnea-r^8U3.0j&i +DXU33]0H/OBFOG2gNsh,n#(SQ%?9pC]Ongg&'kEl1r4kAs3aC54jE28+Qdu#I9MW^ +r:I-XSP)ht@T8UcF%bau1#9W8=q49KU0"-Fb#7H"8W;X3>#?JU9`f`c+s#aZ/:k>g +0dQes,g--)ZrM]+q;PrF)QmGhXttpg>^4.fJ)din[[#lYCPi(2rP-T:Ze[IOh6MCM +]RA3f3ME&HrspPJ#>.L4f8TDUS*DMk*Ko5@-9+#JER4?3VtS-EIXTH/%`eSEp:/Go +`.)c.d_F)JI<.%'S+BKaT8iX*2YneVQlka+^:TAJV&qkJL;;lJ27+<(U0/Af-UB]P +734*OB3"/%9>j7Xo+=4cnJ_%!'7-O8p1-72C-?mCKDoC#oC6GTA+fJPi(ptJC4d=1`0/a/h)khhqh\pAkCgnXXF +Qau9>V#H//T,Ic%I[^!qeH-@M"G$Ne]?(!'".>cg8Gi0]o".C)/mfFnaE5p;'9S(I +,,Ws^%Fdd)]4(l.A;:aM:ks'sLI[Ssi.&-XO:88`AngLr'!qHp%hnC,A`MOtI>+5^I]_..RXKOOI.,]`;H'5Nk1%+ +Td#$2!YGCL!(sG +=I^r35JcJm;i=1l+FdYr]/U?&(s;k$IfSP*_".4,l[0mKrhAPJUn_,#TiSIq;74YS'E33Ki$S*J@blGtReaT(=-,KToG4tHF.oE"9GrIFk5 +4rXJ6!7*HJm&+K4oDZ3"?(FF"VMumk2O/K'Y1V5Un(K>M\>`rt-:R+;$60)r[P(1& +ju/"qdepr#^XHJ%[HHLqISJLks.`PMkPIJ?q+Ht[%/:p!!"]0a?hp>Ds58C^s0:]R +"AjHZ$:sb1b'oF:@*ja)#0NuIM:3X@\?gQH/:X9f9)MJBJ!WNULB%^Jr<.]rdeP'W +YJe\8>lX]$1BUXF&-:<=/E6]`>'$mS*d2$F0aM] +/Cu/5-khLg+9Kt`'eJ^$"g:6=:h`<9D3e3MK:`pR$AJQ\e,SA4+S*SPpD/#/\IL"$ +"<$9=[`IU;"7LOG33sPdi[pGNm<'l0[3XP9+oXgcU'HGi4g?U(V-O[OcHtG&LYeZB +r,rjh]*H#0NNR(fcOHYiHdIE2dJ3ugX#oTs!DSlTX_Z>(jesUMQR:1[Z6.8>D%[;8s+UG*9T3)D`!$,'-DQ07[#uL3r\pt>"BFf7UT!": +]d]?#fY]=Pqfl5i[iLZ7'nuV2Rd",EAs&\5Pc0cPlVX0CGg. +k\'0*T51.8d)!6)M>lLH`_4"-0D@nBh@fcR=7e9h;,9&>4Pi>QV@G`m),X+TVC)0( +lIa.)M_;Q8*d'7[&(7(gAA$VbHZobo@5n&+%HnnSdFW"K5?s#9HS>d's/A])q=bW_ +YPeFLQ1,IfpA`oX]^IMY^3P8%pUeoSF=-gs@gOgG&Gu7Z7HZ$7*Sq^BV_`X7I;GB3 ++_XSi)VHGXa.s<"Zo)$I`fNL^5KTQm2652#b"SRnX&JOG._\g&K*Y:%=Xn!;>0.44 +I#.S)i&\Q+#K;0pr[q-8a".>ars[ET#(5>GBV.[XV--i1aWc95nIe6Ro[j)7*s+^8 ++4e.rQf6M.GRU#0!q>J2I9Mq<_ku?g7s#*N3fuo_FQ%KMcp$H!.M`0mUZMZ? +!WWX2a?Tb#=oM7nKE"paP>Y*PY:JcLrtG4/f!0b0rrL:BD!ZWdB;,?J>*`48eerok +"Me+-fm/+q_$@jJ-_W5tHH\_U)f9Dd/X&SQhO\GgV4/Knif=TA"3DF,^VgHN8--XHd7gs)$\D&clD>c!@1%S'&0UWT`SD!o6!h +@.P.F=1;q^-:QZYH#lJYe,%LI[aM`&./lm/Z@Dl][sNtLR;]Lp(emo!?DPsSeS9Y- +,uc9]&-9<@YEgWe3?#FRFP;d\XK2s^W0RDDj9O-2\!cjSNWJMtC0r]RUO[Q7Ocp&Fa384>OZAic3,rN\%XQ(]W"@brApU*_sMkW=3gIWd$dO +28?"X5R>qtr3\Y*29/qCnl&HeXs4&;#!W9=oUKU>(]2aUa5MuJO[t*sj#6(HaJRq.I +npkYHe%6TS;':7U8S0bj=Ue7j?L3p:ZKD#Mg!pRP]:7Osbh,d^FKd(Uk_>=C^!)Ce +Oj?cj?C>98^(\19NS`MZIqtMCp+GL^4!NN"B3Z<^4M-GiWBKgT\ja+(,H`bslr(b3 +XC69'B@JSHqIF];Li*hpC3`JfLFMCSPd;Q+1Dn)F[#u,&S;^JrdoIdBQ\5!q,*jTF +/PV6X9Nne_0kt]+"P!J4P*_GJW/-FTZ5D3aoUmt7_'iu@82p?cqs0OV\#pS*Y^0OJ +g<'>W*Q&UR`g&V51cm%+41FIRk)X]?Lh^U=l.4_AK7/I.qK)B?8.H/Omi5-<\39B( +l0'W&UOI80k+e+pT:_,Cf=@\!mS]AHfMk$+8s`XLsM+/s*OqF_g_7',_@0> +<:q'.d8-4[1%`U2 +]%i@q,Ze?85Qq#[ZK-e-`8A6Vr8C6+IidSK +qZ6DW(Kd<$:Aa)!Upk9$H!u3P`@:X("8&'Ed@R4kJO!2@,K=LoYSn-K`\atSa_8Vp +BnII:KVpF903hAPCR"'u72hP#V-lRl5b/Fa'eE>g>?T5Q<#$C\*0NWr^s*tVp2OU6 +9>-WB^KCVm&"9fFhBI=\0&C4dWj:QpFFb?gUt.#lNZ,t_=$Y>?AFS`/"Q3LnJ4ba8 +BAiQE>^1SfClaV_8Uuk,XBMl672Q +J@:uMX2)ncF\3^C$J30[;N27);6T(#oK8\9V`/W*-6>#O#hArc#S?;$K`+\8!8*l2 +!2Y*%f`;HZ#P/UN'\%4)$W6s0JV-C7'2o-.Yhem_&9.4jh>Aa-rsNT>QoZ<"B^kV_ +r4LTQiVH0oL)U'R#%<"NCoB..]ISK;]5U:/dbP!UAr"uE1KJo%[^$i"jYuX)*Smj2 +D8q5j5Pm1Fpn.:FMulc#>0'h(oW7H0?MfQslYSG&ReYNQ$TA%Io%kthhHiWXT=VdE +e'k5_l-nPrkg=5%XR,:O[Vi$o#\\$-WGa?q/c58o-iSn$eRZtR)oPo3NWA'gC(ub` +YC08ZBp;MCeE8L`:F:Rbp^d6DDuL)pkCONH+665q%mp>d=mE<9]WQ(c2qnk[r/'D^82$K5,fK.h!0eSr3eCelb6=2h&J5aamA3eMaanA3D[mE]eX +10sn+lmN3i/W7RJ=OqN)`clWDN(Lrp[PNB^hXE?7R3aVq!?;rccH_5Q1o` +q`INAm\Mg3^E:_N*p1<9R<_r@iRi3j40e/e6[4.,J11>WkeIo\33:]\s2HbGL1f%.pO +#G^,nLjZh,!PC:GhA`ABY`o(VIekENdf+N^q9@U6+7G6cn\O:eQ`0$Wq#>BUrsQ:9 +JH+f8ABhe=rTUW_`tp%'T94O$R.*0VrFr@jdQN/,ES+*BqS.QqHpci0G +L&Fg.mo61ef_ep]'BH@B%/\qYk(b=+mS"T5GR(Mc[_l7t*a5:-@0e,LRjI,KMMT+Cp.=T=0Ts$'!S`;]sLIY38A +r/X>KA0QO4"<7eFPN-'N@n6'@*\@>+YHZ"o!r:FPKXCi0]q=1!i3`[kD,m&^h +aT"bSRCgTTG]V]ueXIZq(N9*#XOcpf@3fD#Ej +4l.J;pL:`ZcXP-WR:LWW7&u$A?DLJUWVTso,!`a_!f6lUQ(Obl?fHQj"g@s%a:7V6 +Z5U&7Unme;BqVUE;g!5Ke!:G#^X%OZ4s$'/AVW[8LAVS".lS"<@/XDLFetbrQi=1k +'i\5o]37*QZ#.5W+,pd"3H?hQH/<.A!"oEdP&oCba"8b;?MQeW`EbQG%=XjlrPMq5O8%$#H4Ao@Ri)/f(A[DTOgt"(?gLQ!VrEotT#qK;TA'='[fF&b +_H[]!?(q1G-0shh=lB=jB;IgT.K89kV[V +M=>>b=m@qus.r"s#/L-o`;,E)9oa%_fpP3igZZjqE0(caJ<88_`)HjF +Jn@4AImNVNEi:b[b&iD"'WKD0LYmCMZuuM +>."tEO["A/Ic[;2q&b,a!:[&c?X(AVq]C:cs65$N0DmIWf_GNghrGK)+`W%ir3$AK +0+:+Eq9RL6B7[m]&b`tVhZ';G5O`'35']uF"J9W)OJBD,QT +*e4q1q]?"D[Zc%i`;dl$RuZhlJcGUn'O1I>r.g#K6UQU16\^.XrP5)"Dbs4R@+,m6 +B=GHhUE"K/RYttHf*&+>Hi;.)&R`$/)N@l(K8bZf#t+d]s&0R3@K-E;r(gAmk?(HO +qE2A-n,E_^j:Cpf8LLCr0@[!*n-$@X>]_#Hh< +WPoU?V$_CEmB;^MpD6AZ'P=-8s5STf[h.G1k$-tj(V6.@b?$DJ2hXI:M''h$NiM`BCLanqfZde&1CK+nXhroN32]C^[i, +JaR5=B<,aUH5QOrs +S]4d"7UM8ZWb8D(O'7[NBOtfJ8ljH!bfCNeba"U'2(Z,#KhB2]@YQlrg0YOmY=rdl +Z+D"R/Um4TNGPgJGBA8lkf.0Yh(-MAGXrQ_04Pl^B +B1R?t.0%L:lbVs;:[a-iom/%cj$#XIpU<6E^V#Zth0mCd&#S?MFtTUrI5q%X#8=h` +-g'<10)FQ1oCF1=J%;0@i@Or@mBh(,627sEJ$#(-k!12>q#1uf&%a#LRYgt6Cuh4# +Bn)R?J%>j_q-*F"lfk%s&Fm6q,QDj;NfW)Dd,'CgQpQ;TN]u0NriucWZCh-\!SXFV +cmRG>:Cj2GDEr]dKasA4aT)-Y0mMBt6O?lo:U9,SA^A'*-&;NY.:CZo)9pom!U_349CRYs.n/AT_NDJS9oB21r%(1NG[EmIJH/rcKUCtd( +`,iQ5OT-nI.:?.a/4rL4o0`?2+;]\1obA*FR3WaQ@K1,#nT6IV'I[JicPDT`/*26h +!Ts=kg)!Zb+p&O?%LeTq_uA96Nrm00s5OBhB.diuZ,mQ-pqP6-W:l#E&+Zp-'K0## +>AAh.256*l8S>^NMZ;NKl.5Mf$iIb]B'XL,s#$QeYF?rSEN8Akm1i-7WK0bhO3d#b +m(p$Ds&T>Rs%i!h:rU3FaA0XTgN>Y`b5-E7"pZt-s5@BLKlJV0SDJGM5LW#k;KN0##ZT%g;Y8 +jc?TYYMfTEoM1L_1QZ&>V)c2f&-8q!W]QR`,*2gbIHbonL[48sd_M_=\L+72M4 +V/CBp'7-;b?"h5Z4Wa.@YI2feCX@#Lg9_3p/ObYEW%K1B'qji>'Z`_W*1BMiF(S9j +!MaAC\Z:mpebgP;/:E8FaSKi&!cW\K`Gh` +$qjokG>1J"H$kN.[F:;L`Qdi^M?`CB_l^Ho*"$V.dpND^?B2HWYDr)5H-^O!,& +.2;g:\&o0hMiWm>cV:6Ag7@lQCs8B(@fC=n*#/FFT8W[ESqQPS9V/k`MJ$+D7plUa +nDjK;hd0FWp"@E9hA5YWXj"Q:5lYM`p>IjqG<=1KPN[4SZk'T$5+G)lhG=1+[EQt" +O8/SqJFUa@kd-a4+S1*<)Y*Q+Qr)5KpO7KAqJ\[qb?jhmIH]-qcp+['?QPqiGq8aV +0`(VOqYD'*l8IAJ-gBNYNVr32/=-=TjLIp_ps-(@3T8tiq#AAb_N=\&'$X^Jb[&M_ +]:=Lrsg^CE[SsKBF\G3[kKjW`XrTkNiO/Gq64-oO0%C&^rNP06Sp@a(4K,YHC +S!(@_&f]W2*]r+njZ'>HJ@^c2D`.,Qrmu,u>4t;_/!M%/"d3LNoY6^Go0q^N`W&:# +=51&sm*YWRSdupe%mn9#WZ:K[,0(@*s!u'!DV(tQ&G\!KIhi%`-P8WA +O,!_MoY7tj>_NL`k>VB#-fC,Cd4+j!s5QrVjaXt(X'6,9H5hq?ImF2C(]$?Y(*HaF +r/]t>?iJ[3e#DqiZ2a?"Y*ArPrW&qtrE`b/=8O-B">rJoD5Eo!9$gZlConG[f*OP) +`;gVPIB?Z1s,i:dgGWRAn*F764g8bkd..8`Wt(0-&>87LmA5S^.ZR6(O3_K7m+%Z^ +V[#uA)G]`[SiL2qi-(399E^m$otQpis/,0en:,q[HuQ+nbWdjl+:O6s#&steqhK+n +o^qGm!]FpsG&46nlR6Ub?!#XfVQ+eCM#b#3M:9#fC8E+>LQ?Q(Wc01RUCdUt+[cWSq]$EXeXWqjR7Dmei1/%r)%C:]J90CDU1 +k5N:@0;dYh(*?2IJ0@2;Nt93ZIrF\_kO:n/(WVr9hb*q'%CiYBo7$>p=j16HFMA<6 +IO"6Y:W81]q+[q]([.o7\:[s4*HieG9-= +X"T@n?BBd1.<9s>cY*:Es*OR6T4`Y$2Z\eE4l_kM#d%[h(#X,6\'mif;PtSWE#U9_%5B.:r+@Ta%-))]6t\\.ELCZOp0+9 +.Vhe=%EtFH1t_E9r(YIa%-W+Gp$LUf2K/#eBQrWm,/>L?Eb70gUr<;/s+<7O;?!JN +s%p+!jDS%+W&Ij[%#;p]W8NcC+3^pfi+g*Mja;Zo6=>o8Q5NI;= +OhZmXZa,%O"h%tnoKTMYac3H0Y1pkeGd44L50Ed(+TV):X5_`4$^tgaD0<_goqK`$ +ai6e)aM5Ja2V:=l5P\5^$?l%Wmcn#hB5lQ'Olb2RXZSSJqTrdCXZO^e:+M@L-u\"< +5-\11EhE'TXR=:rh:YpUU]:l+.KWB4&,H7H[-i!n*jn? +r%7>IZRZ?dHBR[0Pkg4o\WN=#L,L"8A]U6kCjC-s +;H12]hGCYZ9bk.ZPh,/2om,5=613DM3&3"EoW_V`ZeI!'AEJ&jJ4,O&8O:B@^"+%_&-^^gsq +I6Ede;mG_srMk`:*"_*c=O$(g%Jonb`k,MuoNX:^$^_ +Im&_b?`hJh)hAaj$Mf9bs&ANl;tA.IThQbT)C/X!<`o>d]a]2VM>WiK"[ItrYK]uG +jp*g>$T`_3*Sro''&`G/:N!3\Vo>29rWa>^;A]Jb>")Bu8-o4h)0g$.a/NO%<3O@G +m9AXc!#5O&7/dr*Hi@,Z/h-Zb#Lc!#5;3%jrWi64rtG2As4`g+"^N6qaoG@oN'r3! +7'%sUBo3&ol9@X!GV?6SH&rm?Yefg/:<(EBXE[Oo-jZ8dMhtI +rsdrL:RIdQNt2RE&b,COhHgW\Ih6-*&6&gir.Q9nL)N@!SZ&Ak\@thMTh2o%=jl&j +e^lG.\m@;ER5;D\L&cKt4aGekjR)@gf_b\.HOo>MY3Z"0fI;tsKB^&[HLI5-0YR2j +?j7GJKAHV1"9DC78Prbm0ib2*b3DqZ<3^#X'B/%/nEMr`XUT"tu6 +SGugZXnAg./jY)R8Ds5jH_5BQ=fqi7\DqPO4WEd$Y4$\p\FRHLWj='1O5-[^lmD[p +2t[1N6!si2IoHmh9>chIA:$.')F/Og>6++t6h0]i-! +2G6;ks!Dt&]1aEI?@i.G088@\n/lKb6GoOS"'0qTLL";sE=)Vcr*D3^0,bGBU;D.[ +!;o?F^Sra]O!HI[=h(qNpQBCM&eJIPA:Qmlcl&Q<6OZJHDY)8X?<"W>rs^ltc3!pA +W-c\;7]P05fCZ<>4_Wu=aWe)o7>(eeWt>8oOBb\M>D?cMTJ6p?3QUBen-:ELaAe].3n[Br8q\>jkPi@+Ir)H2> +RNc#XBYUP:J@T*\Xa[IUDR[<*]=jBgWZl_'[YJThnRb[;qi3u(Sr'&u=U/N`6Nmj" +N3a>sq+FlTdV-VJGg559c-fPn@0+pEF-S,>V0B$K+$%Pkrd)_@Rn>n*?2XHk(]Wf2 +`W,a-aepeVrm1DgY?rZ=q\JkqL%;n50#JIoc2%I7&l1+p>f])3`7o(Rt[*q=rF +#lAoH'DF]ms,$5@_#Mi9ggBUCO +lCK3@s)25Ys1*dZ+.=XmD7"+2;`#NJP72CS5%`0\n@KO,r+CMKrt,(X)Dpq25Q!f= +a5PpUir]-%r!+e4YZ2Tc!;S-kSX]-Cat`h#rgH.FX;VT"N.l%5j,k5k\3N@4!eC=' +![.Lfrbps!KO"TU&"5IA"4Laf@/)f?1^nlG\fAC.ro]K[7>%&u4Xr:Pe"C17PtVb% +TQ@_[?9qs"^jdIkFoeK^/3j84pSKYE#n%:Hr#Ig94KU)i74C,F#RfkYK1lUQ^&\oI +rog/F"t_>*;Cm,XP*(htJGF+@oAR<+/,ueTJ6QtMs76W:ru;"..PQ#Hb^U11!_*q: +5_9Uk(ug:f*6eFNN0fLp;b::V`R"2HZMaj_s6'IBs(k_0=FbWF-Wq=R+.eRt:W\Vj +8WV+sgpgI7b=_a#CJC]c>/,-cj8L"/5nBSaK*=A`9)&,*#"#7"!'Pce=rMk^-Hk'] +bn$?.\aP9EH]I=X=OTP7?WtlFpb2+Yi"'!qG9&a2"TGSEZ9odcQNJ"hbgZ1[M&B$* +6CAi[-\?^Bg7\Wl[Y$L5gpKr[3,DJ<$ZQdp=b$Y$n?JBLKu:Q:SqBIhKk!=k5I&08 +_]LWBHmODJ6\U?kYNFkF"5Et#[oj\;-ioi7.=8S@!'_)3`+,N06:ccZ548>V!WU%D +DD9*(8!okZe*3d_4Co:0M:Gl=7c"c1Re^YSF%o]Lf`ke;!h3Hub/<*[,iC>rj9P$i($<9_=,Bu%?#mSl$K/,>o6"dX +QC`%VW0O$=ni/*cY)7m6ReDSmrVVKpG:LNk'HnQYQAEWkjNc6EmKg$P +TU@W5:J+Z)pW9mKUtZ;eP$5Fm;fP',=er5Mdao<01mOG48h=huNqQppH]b4C^SbYH +YA'?4@>D%(S$/+lW?XjjGA&=73d6U_pC\6,T(C?AK=';7CHd`d/qXPC&5fq/#:KT.Kg*ZXpn$U$VCBAUf#Y!&%MlV-s:t +.cB^"Mf4nH$%QL\9>t8QE8^%ppAr^W4LaLSVfs;Tg[XrX]0R6?]^G@d"..=M"3aW$ +J*FbF(Q0r\;"U[Kp4!5uE:/UtHu_I8X)n.k5$)bBY;j:'IeaH:CbMO+Br]kMgIEA*68A9OSqW6Jks*794fc-[3 +?4m,'H2`:U_u7Ofb^Y#-qUbI?5.S#\K2Y3W*\D^+?kMo.p0?iOVKa8u^G!gMr""*U +:]d;H`&]G3\\cqpANa?LT]jKG$Yf1e_L$^ukq42CbI;usK3!#OjATe/Ma +/(+:Z@=.YuJ3W&.L1s`:m:rXq76uMA2;PED5jZN-ZK1h2"o]L'7EmQffNYsEGSQmu +p;bn0J)V],G*'qIOZLuiRo4&Kphs1?!WH3jDG^_eJ-^c,84Wr4HjYB`$g%r)+TM=*BJ*F5_MuP0 +ag_o"^Gj.#mh6-%o7tc2iJ[d35;jpW*YO+fL="b+?id='P/EL3UXM!Vs,$Qo;bK!W +Xu>(GhK%51[X51G\G'+gK?"^7!DiiJ"[Eef#do:+]?0^/9r>6URdNCX4ECoO)*>O* +\U@145Hjl@s#2j+T_5?;J63DfbUl*qTHBY$&!*Hq&H1k=7'\BW6!YVJ\&Rg:E8&^L +AuAYg"@V!4Rk>i'>C+Z:XV/:fl`rk>a3+"GckZPtf/$B^^jj%TLDLFo#-fK3CkqM@ +qEJjFgZRPSn:(oI$Pj:Lnq$fPrdk+;+N*HAff\@3=..T5[Wou4I]>OrZhkU_Ru[Tl +5JN9&aY;F_"rdZ^+3DaRRcm3sgLTDLm!Om(C(Q0Ii=rhm,%=,1Hqirt$HV.^5=3.m +%e-s^AJU1`Iptaf@g/TtEh*9D1h10ZE>-Y35M_q(Pj]"==27jV] +]9Y>/Q8PHA%;CjLXHGEj8K)I!emD2[fC!V.m'Ka\!pgk@MgO_^HCDu-X^l2Pg"o/@ +.EGgAfr$A2Frq!5m0e,C(MV\?C#0nKg(pk:-0e($7T-++gMkci1!Oj)4U7j$V,L^k +Cm[DUill%':r(BWP=k@>s,jJQ(u&$KuF]:T#qNT?/h/H+o38q-bAfrpu" +qt('_B.oO"q'u',2sH.6n'Wj(niu=YA-&%S,[Yr4o[9dO(LJWidu-ZP4F[@0rlkiJ +/j9g"qkod`qr[!gQX2\&Q>>A#?[`I_b.Q#d?$mMRV>-PCiNnCo5)8dTo-Jm4%R*bl +5=KBIU(Ml-qso*(bO9M&r0P.NHFE4@Xil\(\KRN*kK,%Ig=[/C:,`I-@.lRCT2%p7A6N/[dkLOC=i!h7Ss0\ +D\C)AdY(?KCR=e-j8aZLp^-NCNJ-T;6?V>IH@l(fTW)V\(!E\O=HldH=j6s>W9>)tR/C1aO5R3P_%X$Pi[mE=iga*LOrC+: +A%88G&a8fQ+9MP*!rjk.6?lZK67eU("T5a/Kh0.-@9C\SDAraQ +=Ps?q:[(.UT/>>Q_JnWAh*"7bV`.QTs'&O80`P3Tb\M"&!rS*!EIg#+gn8R#!g`Z$ +T'9DVpnW'YV]H]AJeB2tBT5ELK)SrJV_)sO,TrFZm'7"i(88o$o%562Y*N($0l\2]lj +-'JBs"o\m=$!o%*#t-be&Bber3dc%=LMCs1b\i:A?G&*]FA.-_\8AD25km:lR5k5! +HE7O=Q#3sLX:CiHagX9a)#d9sf]>SD42%:Lk;W2InDE:kp]A5QcZt'1D_aWLk@43: +Pt\"eSns[LUXeoEHATUm2TL-7PsM;f*SYQ@P>6#<_A::K/7C/l)+p[XlXHmM$0BGu2/-=%IDN.']F&DF'$#&8"t-QDZ^:rdtH9j7_3f'C\LSkp.[N(VgRUT0ue#OGBQ5*Rha5/8=([' +2Wc<`Q6l:.M4Ri4SA0XSiQ^Gu\srWl&!d+Q8b.?n9E+mJe3BP&If2>+i`h@h!l$uh +2m!cFi8&Fd*=*YmG`@+@Hl6+XIC\Feq-l1HkLH;F?7QeBM5`Zb3?[qKFeq$lVc +f-qMC/&1]`q@l3n`L"Z4$"6d-#4sD@d[S`Zn1!h2/q:sSr&lmPiSmA_90_?@qNu?g +7uYW`?sUs*'`Nr'&!oKp!;sUB+StqOaWKCOrVeqZG;!uco+M)TcguY^2"+cmj8QrK +m%9kXrV/5:_qQU.S0Yjq[,cqkdO,jRc:jC>*haS!Pg(M41&lkI-LfpQAiZD%LRePF +2k-0t`[gQI<`$B=d4Ja`:7A2@Y3cFfU?d5u>/&T2$lHr\ZNU&qZqC38'bL?L]N#O? +Jc)1g?lo<2ObQ!r_tDL+]'1gELFV4sr`9RA$c*^AXNr=Bnio?L7e^l4oh9nN6d;ha +)4#.YOFL39*bAYI-%f$C/2K#KRCJqmc2G!H7m$_Wno'5sf-p>1&H"ZqM+93ddRd_Z +WC&,C/!+T',-1kDm4'iF5I"$Ce,s\K>/J`73#A_"j3SO=],^)7;+MU8Lo!q/; +[hohK8PO71 ++I*SV'AsD[58G&g@QaDnpBH``_`n:8^sR4_(jOR8YYU)*j'\V#?Q0WjQu#I&SRk)# +!kIO38%0&jF:2@q&]j!rTV;=5.F.j:$h-fo$N,+YAU):WeLKhJ&a4!ZZ7U>70+Rq7Ap588*gjSK50q',F3W>S]2^KR1^',K4Mq]*pN_ +QL%W=&#j`me[pRDUaa3iK0;:T9KTEG+WWA&NnR#om%eb3C!B%L"Ue.E)t2REl.?[8 +hA9'(H+GG2"kBBB+X-F*Hod^':CS3j&Nq#%-)iQceaDm)m7h`jkj@/sDVgt&,_:LG +K.WnX%aq:rf9h$5Qt?;N]4cHg"9(4qKO;J=qVhtC+'oQW +kDS,&5KEWPB=U6VRe)T$ZN'WIp.t*bIs`X0rL4[CSYX#JIJIr"j\IIn534$"c476=f*ajbL/ +X55EXFLSkX0+&T8;3NP>Oelm"[%h*G=[`$t!roA03agjp9uSl2dm41,?M\Ob +>o-4r501N`dhhcik#LXF5S`m'poh`$GkEgC[oVKf8aHdl^+`@^Y5A[d#U6JWX'0>g +8:^_E/YKn/C]Ra4!$UdrDX*)_=R:>4kN-)[!WW1Y"^K=PXVQHabeS_LU;28Q"Q1'h +/#IW<:]bI@!%7lf1ApZ.i4fiu^Q9*M*##GKLc2,-$#j@YlGhqS;[7)V?ELtbXmqF2 +QI?diG9?4^pK6&G2^f_,Y(S/GeT[$&n%E%IpCYB8LV%Ide9UZ%p)=fPNmBT^+8CmK +?n;6f*O;jgEhMOP7FTIccbu%XQN2I4D95au1f>7mcp7kZ8I>g870SB.ieUYKogtoB +H-BV-n]F1+"AXfGYQ1jq"PVT0s53Xu\(gZXJ%#g%584gM_W!s_S-8i3KrN!*re#b$ +d23u)T)E(MP[,n+#N+ZrLUDR=qg%b%C^^;-L`eq"C^9_k/In)sM/N35H3IDgY:tH3 +$UC;>qVFI@aQ&U#P&[3V`k;71L7[>QSmY5K(:lQB&#_8@U<0Z(Ip\C%8 +URGKK#1?`el&^2f%H_LTX_;Ls8N5l<6H:(A,::h^h2XM_St'DB^TJho+@l(*W.>sI +,)(>F`;E):fM%?pBlPpdAZ#*h8i+KH!StJsH<4:T,MTeNTQtkgnp^aU!(qcB;Qbp7 +WnoaJg,n7ARLGEU`i1cmXI0)!8hUkK@geeg^W)nq#<5]nXn1)G:5ubs"D)bG4Fs?p`Wf]IZ')B!::IeV?!%a +ik%%cE4egcl[:+-"?q;)/L2&$?UmS9\im7ZcPM4LT\o6%g>rk/`7Za_q_?qfQTehb +qLmf,QMc5ds$&b\!VO=+%flV,0Abc>p6spgQOs(EH&h\2:U:#_&`umW@si;5j.fhH +n(c!/jV[s8,P6%m[)\I]!<7BnBfD$ued(G\rNssSGq-[lpc6/@iLbl@,u%XX!DRf; +.qskn8ln*NXc;,e7VQe=G.5ju*=PXYbGa@Q<'6L:M"r,Ka\l_RT="aq5No6knlChH +;&ORhkL+plB"X0aQ19nfJJnE%)^g`Y(D\((9'[[XQ)k*:[*%lN;dTm%Mk#8ao5qG)9emb6ke^#!bliV)": +[GSXFEb_T8j?h>#RJMoB)U/56#>GC$"76-df>.FU@414;TiK.U6-%EJF`uUu2.IJm +cjYnU'4%9^A>1du6IRIf?FerBSfS^I6M5,Mk4=EjUjN150,$5EfaKYmO +*FJmlC]Se\&!R&P4c`_FjVbHgK:7jSqYrn+Itq;0nFua3i;gGe3?FB)0`MH1(W`c<^YOV&0/T+#3WiH[@2J^rfu7Xj@^^G8g:LLY +8rcLke/KY[P8)i6CmI+UkY-ZcKZ9_/BRnAh(Elg9+=h +f:JXUB1fdGZA5f#-69@.4([;u]5-.AhX.cT8N-fDVh1]`^"\S%G9"$W3b[53ePhVg +PC"nC8IHnWjX4mHI*t7Ai.2LN:=@GQ[57\se,a?1em't@gcqal4eUL`d]mG`D9!cP +s(50;$#MMQ&n",8D:H(:e@'SV;`#(8SaN=KB:*bXgk-:"'2,FUX6`@.fe4GBIsM1O@86DM#343D8.bK7M"&`5fK!V8\s]HTTRi^b'gpYC#Pbd; +Pd`JJ5]*XqY#`->NN)53HeiO2!Ur=H'8?+BBTFuaOokY>c:[$pYcfAiW69l6$Lj[E +2pXm]JGHP1L:Ki"4@+8lLEQKss(b+,28e9C:t>^q+s1bipm38-Jr#7*1iOT8]FZRInt:?L)! +h.e\,^U$Ssl4uGr&kBDJq!T?^SLWmSr0Ium(LGPl6L#-se77L-bQ@Q$a6Kp[3$p-l +SqL4=4TC7)!92uR$b3YFs)%bi2u2nO?d&Ionk'4Mad3!ZTaZ,jblnKB*"pI($\A?$ +UZ.PYn_m%oPQ7Wi1fnt?6IkVFlBBE!VcN)$=`"9X\8AADp;8Ii"Eti'!CsZu;!Y56 +c(LO92P45j3'Pr5Co2)[Wqt)0Hn56Kenfk_bl"U4hobuL'drL#H-*KKDk8I[a;kmS2_>%/YmC+\5X`)R5qjB,J$YDS[3OgPSHfG]pB3n@ +T\('DJ?E/>*j,n_\,,qgH!s4qZiE,%hs$9US-]+K*^57,NK-Y:mE/9Sfb"-E3ghQ? +o]C<84M_)l"OLhu!^oL&3_s0=MTc9u8WU#k[DCIs:&obe-ERjEUE3l3KiZ=\mUANe +d1'*aK'ZJ'KCD*uh_Aai*HGsXl.L?;B@ktrSTb=Jh\Fsr7st2NYoU<.GMM38Hd[&m +L:qig:*+Q)#$eOB;j_Q]dN3D^Msd2)onlZh;4gA*kMl1sfbk#Xl_"Yjb=9_QLCCf$ +g)ZqoHZJMcL>0-G\"L'>_l]_s:==rM1nrkkC=tK0\o'&u4IN"hU`&bkM#XB=)0[03 +4gDhJof2?6>:;_HL]$mZbC9FI)>O6$(WcXT1A/glkSISR;YljsaS@g&?d8U+;[?66j7mLp2^H +JcG@85@bDIHO99C=Em8!&n(_%ojbi"O8238LO8ha!TsD(?fV1c4T@@dZiB]4qEI,4 +q2:$l5J4K'rS,KO4AL?NU\rmSq[S[/!jf=a/IAc +0Ao0PJ":c4p&P:6N*M>Hi/dkK456]Nc/dHQntsFtjsI;4H<2msdE9gZYVH/@)GraI +!WFHmo(aC&TCp]mq!1G&oqRYh!rV#61OjuU1SK-AA>jr$R"p1:?TmJL!+k!WN)Q0g +80IiN/OBaC!BgeiY0HHSm`LaNcq`-#;)E.Ol;fZl*ai-aEI2g>#WOtJd"Pokk`.a5QXO^V5]QX2d4TFX!CXR +lA\b1'`]!\ouJ=p3EQ7q!Zk"k![-T.#gf7i"$2QI0=D]C&;K_6"d`0GLU&*P"o(I[ +:W?qE\]Y)d=acmI\s>-LLqLF_I/*;('<&hnTTd6q.5^"Sh_) +"9oUed*:!^1Y#d4c44H5#E"=,7@?ZV0<*VgADFHR+Dl@H!pB"Ylo>a5I:%*jGETT, +l.^VI[Hk!VFf1u>D@Mici$hlR;^T/9@37#c'bC*cfmkmuX8o(!Z@9PJ"7cd'4IiLB +2=.(!m,b"nU62%\_tmZLcJ=lf,H]#g7bUDD:/XhYb3;GWo?NkImoWut7&"M/T/o3\ +4uatornk'%HBQqVq9c>*TA3A&q>\WNbCBJ)]O$'WNA@<=(mt?% +kC`UqV4_b`/\-,"[(uU_mo(C=?iH.-q0UUa+0mTr;2kN=oC>B[&0Up,;#Pa>]n?4a +MM8NRH+h,/r&+qRm6XeTnS@&]crM6Yrrna=,UOd*qH.bQr!E@tjq#<.9,I@_s8Vi: +]O*nDqNiSW3T#nd/-#*\fitA3cQ=`fAu5:h>k,L+-$N+MhE"\\C8ge"5l!m\HmqLP +LslT"0SXID_:*9jF>DR]SM:Q:Au+0e%n(qs*,Xsrt/TQO<6=C +OobU[mGap9*$rJ:?cPM&=4)$N+*W01gS_GagHnq!QXVCI8sQMi+B9?u]0LrI!<92! +2^p`]%POlOO&,P&"h6KC!;MU,!5fnq5OdR*"RP;'TYQ%)d/n?)Q30$&3Ztkrs#-G; +s31L;$fJm/53Qb\k:N@b!rr;qmuFV+rrWj.1r^p$cNbWmUQ(qF"MjpW*oMUr7\D;^ +C)E39?i`n\_9/]qF\K$i!fkN,K+*1YjOL5,i.f7 +SW7Nu2bn[tO*%h&oLO`/khrn)#BlWZm('gEkX;^e4]/p-V,'UKj$?-q-le1:ZS?_` +;)+<:*_9>.it_&Bg`I=+LP2&qDpZPMH5M8Eb(.%4hme/,[<#HTA#P$bopijqZmp?7t1LIkYq;Im'^H0:1]8%7gH]7[e +:G[Ik?0:T^@"%`(qi@p7^Nc%CeSDOq?`3nfc15f0U(CtRBNY%7!5s*rqqicR/q^A9 +]FXpQ&D1XWHhc4VqeT4SHpC3(*k\e+JUrtK$NFeE!:0f:%K+A,5NJR.^U;h&"oFX8 +,UcUpQ[U?qp^sc6k^D=>n*pAP3r@Bm=hf6RM9bo\<;[R,dbhfnr9CQ8n#fS1?Da1!$gW,lOisdA]"#4[;`!h!,IOE0MA_G=%9+TLMBBaMOHN8FV['\8M +RORq&j`RsWTSD1[VY\`,7^AbNWbSEsg6q(UY$K:rCB]0>-t!`&Rt'M4G'VeA"o3Z# +=#V%6*")f=)aRE$e^H2eC+9Tj@U +aDVW7FTSIqlVMY=.^hd^13G=1*Aec5PqCLg(.r4\Gt1d^W3a#CeC?ldZr,=i<)#GK +gHik][$\F,Aoq*!#ES0R$a;,.&dH8n]EI0>kBDK'$mM<0lmIHIs$ZF5Vb[a;+RsQ3 +61-?;#`QRP-+%e$YQ["N>JiZ<*Z9O+7Y#S)#Z6[8nVL5>^(t,U)[J`/"6n'$n84(i +/DMgd)m&ks@$>*d\H'p??4bflMXCanGk68Jd>a4g[Pu.tL,lsRf,%lmURXT.*DW7` +Weg\'kl,S];K@45/]aeL,AEDB7gHQa6ThT'kn3o2:9ZE)>TO]`9Sldt7;LA8__]^c +1GY[LKFS80RAi/$NJ9m;Es%do,m18D860b?aS\[uie7F'CqjYp%rfm/`i)oJc?a]F9Soc1k-oIbqc5"pq/`) +hl+N`kNJ19Xb)?(YNT@Eg?G&dEcY7l+Wm::fN215Zde2;M +RXo!<-7[8.`0l]p0YkqZR9:mp@kC:H*5MIom_6R9n^ReqaqBGgCQ^N=c:]KDhb*T;t +J,KQh/:_Ec:dKa<:bhuI$g>:0Dt>(4s$+R(M]Zs0r-ofHILZ;hr&=GDDuKk.s$CrV +o>_q6;J^ +[@b$lU/*'P@km+bN0B:+P6"_&a7MA@DC`nB@T\TQZogJQ +VR.,<\=oe\g\_;$!rqlX^BFSak0Hd$kCDrMH;+==q*,a5`5;Guq.fNjG?+_>Tnk,4 +5A1UQ[!\4+LZ*/OZH_3!%"F*3Rc^pDVK,L''=kf]$j86A"^hAeXlZS6]ERNQY?1ee +59AF5q2\SXYQ\k)5Q$"VFi"4[6!ffn8cT9LquleIm+k!`6KH5Vrt0.2(lsVCK0sc* +b^]DB_F"X6[dkLJaFBK!*%^#4.,P3>C/ZPX)ZDh2X9/FhI\n@*ncUtgJ&28ii]h/Y +oqM?(YOKr+o4E'VKcGSV$nV^fN/J3@8jP`;_o-V5>_[A, +UAcRX5!aYFdZ@jF:b\6pch%MkPCiPQ1QT"XefH +jKs(\s+drJ?ier&bDEL;:S18e,I9LY8Y*?q[['_$r(+^$??91>WVJ#lUSg.T5rY?.=@ +<"08e$teh26hQ(a%I%tODf6*S+!Q"bME3Q'-^3`.7>UP"ENk@:F`MHrGPcUrq_A!N +;$;Ber+%*9j/K%HDfr@h-J;Ui8C\>*:`E'W`1g7.#_XC%JRF`r=:P1PGq*ZK\]HIY +n?;6Xq260)1DsO.,G1%N/K+S&e.DUGSs/hiNc7XiL`DN\H"T4B9s3ZQL/J!ht ++MpA*5>(pG]^BqYjF:H:\Q)K@;"*g.CkqMpm+Zq]@,'r@Xu!aQ+3NqtHt_,1,sC'j0V3,$*GcY91^p4C +"Ul_gfr0-T//\(J#s]T>Q_c:Q_qNqal5dd"D.!BXk>+$N>e,8^ZYdpjIE]9L_RFG5 +;DOL_c_ROu3R6osk`0r.R8rt@8(]JdAAbuhk(,uA,P=Xb!/'h +r8YC]h`Gu=jWjYo3`LLa>j9MDZM"4F\QJ*,KK:*I%L-)75uud]$G"R.2n,',iSUD# +o6e,1aK;T+3;1tROK5G*.P"/l.S?_AMX.97)JdGH%00VVJ+b5h7="m%j[B*O`9Y1- +/YL)iU;MUt^Qn_IrGddeS45A:!$db;9VFj5>Re[`?P=Br9Hn2F(f +UGfcnC4[AatSX +2jtQJs2Usa8U5em7Cp6SE1duf5;_.L1t7c72J+]R_#IrX1(pVg3;\>A2nm`e[6)<- +Ri'K@61Z)_I%-=C)GUnng3P"L"69gqX%27^9+]Xs<'C^-E(rkD/Vf]9f#f`,<0p4(es#+RQ'/tdN- +c;tP0IajET%oL*'q/PakSY&XOB3j%*HUY[ar?a7_$k*SZsjhZl8i&jh#B)X3+s%7F!D5W +#c8Dggj1-Z+%dK]L@5F88,GT?6"q:_-_%e__\J;(:F3qM.shGfe*2_:I76C5;]PJG`o09q]mb +7\i^6@0)?a!au#JI:s?d?lnoN&X4a%ZuJDdTB&3Lrq[8 +0CMV7&FckCaOC4fLPHd;L)WX;RtlcfL'F+P1QD@HodL%,=q'Qqs(uoc=FepK[+Rn3 +4KhE9nF.HiI.I#dK_b,05hM-q+Sf(aH7P2-<>b^+IJ'7-(I1t#\4eSU%K(GI.NC(O +fcf$brc#@9T7Js!J2%!B>KLaLe8>F_UZ(HZ4QC$bMRKS%="Ib\KGOXgq2#%X^8@BX +q60)GBY%kh"kfq.8fID^RC=8[DneKGo<&qp9^h\11>O4pd=_$`f5D%" +1Xt;G>Q3jpjSsM)k_kdc^H>j)(4_E_?,M/$kKfFl58T+br0[M/@Lih;]WM+HoK?Z` +"/,Vq2SqWfs4?hVE;8a'F7=tM7AW1l-#d^pEr^jg2O6tdXHs&8:58V28. +fI/&+!$DZjfHJJj%(Y\Y4nX@"&T:C[!^Ja=A,)+pX0\tO5puU,.c>fK71+0*Udl>V +pl1G$&)_Bj@UemIg?H1LW'14\jkUC,cFQnM>:i`g9aMTJ\(F2m!n[R] +*D@#H^m.pX:&a1*@&OFZU32GIr"loo6>o/Z(4Z_m6EY3W]pnIe#XI;05@FR`#l^cq +cHDkjKCGuMBXY@0N%;peWYb!THrFjiBbcOM-nB=P9^ +mS#hM:lj,L"5ls%3M;33HS!1\7@6GN<]7l#nu'1&4u[7hg49"6]&MN+IgEE$,db8t +>W_:Z4lfmOodh2,/M9'G(MoK=!.W5mgmAH,O82"$![U*%0&&RQD#r`&R_]%Zm/d(t +6S4M>XWVihNG"a$#$OLmRg5/Mku_dP>a#Fo`<0f/J_uK*J\fgogsug_^Xld\^`Q:1 +n@PJ^Y;?lR`krP5(fDhi$1RCZNp.L>Rm1N/k'sn4-18O@1I/uEOH6$Igl@)peOq,Kn"$PL/8nh02pbpDX?b/ +!#J2%lG*J:AO>>oSGrup2ctae*hH9Q_9IJ:gV8A4;utM2Fpb1UN<8'GX_-nlI(\VU +Xa1r*G.e0e&/niN@W1h0=Su0<[d]ocmA=)eAO0U!VJ#XfD>R``l,LfiHP<1[qFP>+ +4!#Ktp@QuI"TR^Lcd!7i4\'p2Q??eCE;Pm\j@%PpGg4BE_pVZI_IVj-6jGgjVRu#( +'XL_D;j/6N'-6!4'-g58fnT$=ols(e)Adu/5SZ!;.3!JrN8'9;JR?V"8aCqAHdS(a +GhPZZ#ubIMoXQf*G*%XUX\D>eB.Hd&$W!ru+'=jnIT5spEW3#:3#?IEJ+!lua*4lh +niNqfIZXL=O0F*,3;jXh;L\42q0tS0reD;IrqJhM(GD&&oh$\&*t<;,kC5G"J/1O0 +o8/qS#n%k6!YH4;I4g7=$L/`'JH$EM`2t'^p]UDt$N.r"Iut*90Ba)+<>>Ps5NmIH +:q2kKiI1M?la)qG^\oe`Q]IF0c2GUG\msXPa*0b[G27fB#AtD2?0`k674J1A>1CO` +gUR<6LKS"@#q\UIUenanU[2H5[*g)mf2S)9<0T`3(C?!&r$">nJ<3hX()4kZ,urC! +q?gtY%C?Q[jSlHqUW^U6r1n^$t#nSg^M-WB3Bj2lc5h8q.=9.?1TaE3` ++7gS`I0`iL*>Q7g`;d&=ime>Cn2GJDJc$)VFY.]81NaB1jGqs"p)6?uQKmI][TYq/ +6[;`XV7VSqeHOH>FOUof5T>:DNEq6X&G]IJ>+S*6c8E3jI,I5N+'V!]s#q0"J:N`; +fF`f3O5]P,$6:TKaJRtL<'2,)^D)>KK&X'SmAqGgYLg'F=tNsR@:?.C88,&q4tj,? +/?OK&1Em4R>F8N<(U,\%0aJ.pCqUFRE%*%n'^S>b-67aIi3NF)![>hgi<#,Y#B'r< +kCR3V,T$P:*=-Kh-!XifT8*W(VKq2>5%lF`"&5Z'PE>9\foml97$9POB-H3Rfcr6& +E0L[OL?Sd@HH+:PpmM(%B!7,\YVTlm4XU78@FHQcb' +&g]elrE"ip0rUL8/L>-_cC4LO3_2d>UmklKch*AA)B_2/,sj5/pZq'93BBDU+!g@9_N_VMRSo.i)kr:Z'>aeYDcRG4CeY%VAe_I5-"@b(,d6=+: +R2W)tb1'2[b!h3cUE!?LhJCg +?C[7`bZ:?agK**>JjQS4\2_uD;(JY5f^WZHZqQX+#6'BT?#d6itMg0a9&/hU'bmSXfT1/P1EZ0m:r;p>1i[pY.725=$SYZ +qlVs`:sj3\g/7uWiW!#Q^0gu?oC#1"^\R$,]/&E2pXpfhCIQ;i"o^U64I^q>m``_# +FUJYr^T5'gPJ=62Up[54[BcU)U:=?4e5V"K>ku.GJ>/I/":)d1TQUOr#`>V^i](%K +,3W),K*Qt_KFrIZr2omP-ci%q\)UBL]TCK$2)&_IqRk_'>jOdoB-@=XHm9dTLbDQs3$3#EDp +'T>NaKd5AD'O>8hMkM"#fEh.Z!P^XOu\t= +NPlY6r1OB@)e'9])1[-er%pqbI3)RqMk5%;j#2"XIqi4M2f2fg[iJ^qXKK&DYPC*- +"5![8XG7=iLCUEiJH)9p/)J5kfA_C!DUpp1AHWAX)qU(0Bu`\C+I)nIh.&Ip"TnI[ +%_%FWZqh)4mFqX9JGn0+pA*,0fo]=^FKQWJ5*9[ar^.!Rm;9uk)PI:i#HC/JWh?9D +n#H"?+SJmP'B"r/1&h>n)8Ue_ELKRmMH0BsC,:9\K:,1W3m\s0g,V1EKf&o28].)D +KC)$oekC"'?_S\YDb`\>,D#]AVqU=6oJko6?j(AF'TI*"o,L/iJB/gu6L4pXr5/h$ +?LTP"s)bi\^E6Uo?5K7Y>q,R +/:Vn3qW(NDZSr.r^/=\%9nIS,'mssJn)JcIs4;[X^O:nF(@\M';1mXEYE&qs +.(I(5Jh%d+[g[a57R1q`(3"j%oc'tc?=Eg37J^qo0)O>>V*DZj]'nO`pU-dnSm:-% +pJgD):&]p=9TPHK1NUqX1'?F,iMsL-m;7fZ7VZ4G=bWqJ,Wm4-mg&Wo=aL2K+?l\/ +pb1S@K*>52bJ40_CME/F1hAI9gWDBrnkf^d6LAd:s1"3L5LBPLq&eOUq*,Y-<`dTE +qJ*=-WW?0ig*)C-.M;[iH2a;E:r?Yr636j3Rjd)%'M/5jeR\pNj!Wj$lp.?D5i)RB +8m88mBn.c8])Y\6:^d3A4+`P%i,c_,--MCMNrp)CFq+o5sd]g"+>0[mF?kt:YCLS%^ +(4]XtF'PNt8g@SkQC!4j(]ae4!1T%##7fc,^`?jo!d&VtNJ@$/R3428@-Cc1^_T1? +'?9E8E!MT^iElM&06\\\c1UYc3L!q7i_4keOFJrP"6QM0<.aqq?8i%PE`%u0C>;:< +>,W#H2;CQOr'*9nZS6.q$WpPPY,r6]^j>e>7Kf;%LI5GMCPTg.LOob4r6#=n9+0%a +H,oiaD.^pQ2//GJd#X6%7rrFL!7V8u%^;d!<+)HrsNg\n.hDGp(cC,sWqb#K]*hX7a**^]FS?C67=U7CYT/qM;a-jK44@.Y.PU +87c_PVSBTh+Pi8&BGh"5)/]Q=:JWBN-C(7gERj-K@ViQ4i.$*Fs0:."\1-dJK0R6= +XMb/bJ6KbOWUP1E`%W:<0-g`#K7NlmBW!!1M^iWd["5$Q^MA+)_Pp(JUtD/n!PIA@)Sr]`9O +rM^+]s.4:Qqp-jUT3,Qp>nZ#/>^?([``lNu:G+/XXf.;_lIOR55T>JQl\E`?f1^tN +H<(Ooo1#sWJ^ONULrNWh(,/QJgFJdg$"f@uff3n.b+/o]An13'"F%RUY`M.PQS.F] +MrU)G;`+emlW305O3UhaLaEng@1,&AUuI5@nu&XW4F:?2dS6GpD\Kj7ReQ?cbb%!_ +s8,^Pc]Z%fM2_!i\qH2tq#>4lSdUgL@.eW9n?6XP'C\LT*u+S[R9s"M-nPM:$h-B!"@OC5('&*M +.4Z)6fEIKkeA@4g]IBdu1os3db&7D\F)d.on;jjSD;fL8aH'>G03A5Dhl6[+`0\@1 +9e&?3Ldl3`dr=su0#/Q#c%-]9;Q3bj,nn22n4fq20X6GJ&E5o\$deN"5QqPB=_Ltp +'qY1kWPM%M`ll_+8'",M&tiV5\-)fJ]@5*Alb`FK!3AGI"Tg>Bo:j,R0S4P6Ru":p +UR]%X-PPZTip=Ja#:[Y6Lbc85=uO57#gkCnH9/k*o?hkI[$7&KE0eNbjJ\%XZ'L0i +P`U_70N.h'nu4@gb_0kOngY%"=:8U;+'FYV2@`4a(3"67]tEP1$^dEgJd"hDRO6(7 +j/<=3TLKJr"[EFrj!.ji\IOGTZX\7]r37sUB1LZ'LYBcRgJJ?W^EqXhP)]X7lXJh! +Y^iCU#4d&d>m%qZJE0&QTnpH5)Q\mQ.j=`_-gT3/NIr)OJ++ILqbq"IR0b_d_1*cI +s3@<[B-u0_(N0BS-R6m`5X#%jfNAIfW'HC'XUO.8SUN$W+.r$3a"'G[plB_bR/aZ! +\0h5';RN!p^ie%,I4/9W8cW4Pb:@d_A6-=\A/6#AI"O_Xf*c`Z!a75%)[-(a2NuL! +P7hF:])3l@Xphol6B93]]cpjJqsbEC-?4K&*h$LiYkAWPig>C:$TDUkV]B>YY!";L +*QKDZDGP(1duX;(#iu$5SPMuJ3]DKC\bX[O([4^HF3cI3mlOWmpM0<%X.;2PWfA1L +*a^]Ch6;EiCfitBl^#HSk-`+J"V.XQTd!TF<28$k9]tD'gO-/L0%VeLPqFqfY388C_U&KeC"uN8hV=r2%e_f&Y +H/M6DK,_*dY*V>#>k5`\d2TRbhnPBJUO*hB"Ud:_s4(VUs7p3YVr'*'r5J4k]n0k( +U&=q&.D?T>D$39tK@/rADr)]$LOZ%Z'=6`U6asNi_S>jH1",l%r'qO,"o-sjZ2jYf +/2RrBnBDJ'(OsN>pdJIu<2.B'5U-[V`,VP3L%m;C +FB/g\X+:41FPC:W-N@&PDE:f_'5s741h'0,)Q)MR'@D.$A]+MiUoP\SQNp2.Nul.o +jF=bL*Q!:dk!+qIJj"Xt\Zupe^Ku3de0)rH!4Dl4(Z_WIC:$62BETcQ.?OQarseA6 +Z>pa%oDcs&+;Mr"jQ+4nP!]L]\C^5"o3JS#W!^lW#n%09W6 +H>.@X-0CpkSWnr*4CfrM>0$_c\_gBS1K&UHZ:@9R*!K)PB.*BD;l6BolbQ!p.KL"_ +N^=&&Wdkr;OnIB'>3,1Hn=c*IkhqVJES`Q;l^46O9i"rS"cV`_!ld]oT^bk_TGXsn +BPtHjCN7"6@B9hn5M?GA#>G6(ZQ2jDN20[5qHD@IVVZQG,2.i)!$XHi%1W[eK +/7u1]@s]U[':?Q\':afFRM=3DG.YA'\*[dcRrX]ZR^Pd+B[Zdjh^`K4[!0j,kPWVL +5&38U-Lgmsc\kp)+p]2c4UBrUV?@2)/"J0t4#A8lo#2IaiIB7n#Trt/3li9.jhO[3 +&HJJ6p*"F3S(X#)mi/:n*NAs8G:RS\`J'Jt*dticC7%]kGT, +XR0P']=lSuCi+?5DKK^5p$6U'CgEOo"X!jJ/SK7I/b_?'I[_0P+L"c4?`ruPe-$P% +r3KD;R7_`#kH!PThbpRp[GJCDi3T]eG)jnjot,HG%l`q:D?i-K"74L1L)Zl[(Sc*h +,?:)].kbh,?ThQkpjUVKkAn:[,P0[!11%YXorG\rDqn.aj$U1t*i"2R1caNE6Lr&` +!*K6q4T +J\QUb(XFG'#U$pP$P*(6_j>E$I?+!Oj4$"OQhcOi=[0PFofp_As2*p'7fp^agJdh_ +1Ar!Z66DK^5J#CY9pOPiaH26L!d711'tL%iK96+QOFL%!EU8/t2s1>&s-08UeC&ru +ntPd!P4\Tk'"8d=!m0*J8q*pHR+j79dnB9ANh:sUC#Qq4/e?JboN+bTCFmJ_6%,`CXe8=PVeaLo +("8C6]\jG,`ZL?E!-_$^eCUjP:F2LK`s<4R/dg%%-!RTqEKl<-CtU\F2>sc+V',K^mpBU +hA6LjQrj@"45QLVCL["*=[Tk_,Q2mt"1a`64CDVPa3r9PmphCP1+XclBK'eH80@,m +&*U"k3_HT1A8Wcag.4B/Ui$q#fKq;@8KCMN0Vi1r[/b)kX4O$SH9.gPK`8s>A)e5B-;2BbqkYNfc&.SAhK7*cmalhp^\@Pq*%Ymcf[b>V);-TBVXih'i8g=TZ +r9mmVJc+>))>6;9+6-Of3Ys*ps%ChXKh:7q3,`hr@i=7`#T2j1+7*i0.F;@U)?FLV +\n_LrCPN/[7Yg9K8(g`7ccl_2AgPV.E^Ka4k?>48ecN@`c)t(9Il%#eXRf/>s()H7 +(QK!rL\`ti=VC[eYm1,e,9YtF^5Cd`$M,t*09#io15<5`JcERaL]%`'*Wgr>VkuG; +`'c79032>=Z8^VWHU:C]:5?=\%7*\ +mB5h."&=D_]g/AV)K(N=<"Zl#ltq=g#WZH^4$RE="]m^X'i&/9+h1>Z^l*]Q_7.S\ +=ZJYbf5KjJ?%RT2)"`V.?N.N3(_?*o"2(0IG;mCqO0DE6ld!IaDiRoV\Q/1XDTO]4 +o=fSqpHL:lI.-da?X0;=IP:ZE#O-.k8q$.WFQ!1Mi@4R"B68G=EL7]ds's:EPf+q& +U&/(;!^?J?_$.P[4ZKV-@+aX-rlH/]fm$$&a'Zmlrr0kV!jo33mpF3B'#?km-K-gK +`6]&=s&ZMr'_(!DTDRJdfmeI6rk!qV^UQW0r[hjBs"A72HdmQ;/mIV?q=L>61uCrW +s#7Qs/8\UO9#58*d_u&W?JUI<$?B9@7U\ST?LI>On]s6#`BX'G?>`A$mKn]"ikj3n +@c[R#12$]er)t#G!);88(4N\qR%of)')jQJD_2mTPZTt=-bIO`9pLXMeZ4>1CW!Q? +Ym0^1B8Y`AjooAlJJhd5QLCI-q.=m.BeFdN+(qd;e1M83ch>scROUf:-2kDA;ephp +F,i`0<(Z;5>dU(9r6ME=k>\+++1,BVP(H9&!4t(I(_KA'*!)d;1^&K0!9BZ's4)o& +O#@dcZbTbOb8A?.0@/%hZ9+o9#$D!O!cefA^nDJ;8,o>"i)BWiVnjbO2V0!&i +%_e21,!b"P,EXa$"<;.Z:]r3)?_!:9_(!a0@Ltgj`t8<2!5:KjKl.N3&dq)F\-khK +&H*+OOLQ`ofJT2Te\f6@\s^QUAp4an@:](R1!Mk_?;pQJ.;."t448m$m`cV*1Ib*_ +OWF^+(B^4e5!@/lTpj[a4`09J0*7,MS=qCQ"SbcRm<.09$`s[B@d:A +*FW;V/83mroRm1Qj.e[T@lkVF*!%#E,EMu:(OubsqTXIB1]g.Udf9s[NI]j=Am89; +XgG13-jfo4,6+jfh5cMVGS69kdf5>[qB,W"5:r=li'Rl[)<6a:E^g8dW!gE?2^O32 +i!&t/d@l*t)u=mG+9G@Ho[KSn-AVYC%<4g`,sKQ+1fsoe^u02)n7XEIs7dj$l$jZRkW-PP +RcOP=!l%/$.VE4\D&HjD#T+DY0uFMYQ1]6cF;mlb]?h:,S_=^)HP%10+mpN@e.d)j +T_L0+ju6;!Qn!YaF4F^=HE0Q[Fi3?V8;'9=)13gYD^t37+h@u+-&8=6I'"bto'Ynna7]jI5*u/M2s#McesrAh62fp$[,5/c^%F(E(]m$M8(W+$Lus8'biHNO[19nN=/\PeY&S"C#Es3]"@J4P7H +O'^*4i8s!co5QC1r2#oN%7MnSq(%6Q7tAJ9_\[CnqCLr.O3rH(2=m_I8?^m5qQHfX +^(`g&M!rEU[M,S%dK3o]$YJIL6TY[5ItaC=("!3OXG6#)o$YbAJi&R:;Z=3$LBmn[ +"8OstiE(pE;G)jGb=`NJkLEBt[<+DJ,(QX*A0_+5j`NKu%($b1k_^_rV:48^o6lls +K/L*"3esQW4imoY#NkfT"^u(q+'oXLQA"a\GPD`$^bsBFO4RT+CZ^CeB)8RKHch(( +Mu'dah5trCb3V#HZWT\5jASJ>RG`R'[QZ0aGlDk`E#0V6'\Ms*$@9JGCpj9!fVsi*Q0[U'8V8 +2'O.E!:W4?^JW.*#QXJ>A1S-mRjV]SE!2iEJ>R/Ps.NcW+9dQ,+T0R(@mP?;(p=;k +NZ+eTFeORo!.=TYihSPCO$NET_*Qb/DFCCb"a"l!(moiYMq)Z0R#0Rlqg3@6Tl0"c +OYHj.F>/%6FH`$Ih+m?P-%kp'<0Y[?'%!9&bJ&N)mojQOr8/93l,!DI +J12Q-gPcVNs.A'd#9X2Yj!Y(-0+].`Kngnh_/Nd)i9g3J9fNl3 +!rF'.!5'jS!I2HLTCW$K,dBaMS.?2c3l6UW\CL_Kd%iA._hSn8JuMejL@G6.XFfqkj0V610d8aHs*dm0F9.#k"sOFid9i`Z[^Qdtl92i! +l(%pAcijgd<=OpQrK$[J:/#Z)Vn!%q^ZPR\3A(:D0Je?3n%fSiDW-P7e.3#>o_2AZ +RS+e*H@*fYh;pe*kTHWq>u?BS(fC>Sm&qurFVORmPn!GOO7lTSA*EQtWptZ*"T>_A +"*NXV%=k:Y#(C]R3+6`9!6p7WTi8A"Ak1%27g^8(N50C5Ho15d-2#J]g'tCQ2_C.F +XjV*r1%0)Ch-,+jVM@ +Ko#7C_Z*uerVIE%5(#QkY>;L]HBe-C!u\:JTmZ9I1n$:?+qNo%*N^lX,$QC+ +#e;ceD.ZNgFtU0j/E6Y?`3KR2`6!1ma1>9-=:^[09$BY-'ch/YstN1^TYiYK6eEj5Rh^pdB62 +!aYj@!Q?KU"Jd;I!+ASKp:mDp$kWL==)r$"4M"-UD\Y%]7*Kg/ninI`!`G=Zao_BK +ruXYE5PP3:=^],HB]9m.BlkirZ2YJA!/OXJD2l(+&HSsK#W3J%l@8/M#Qc]p'InUL +s3LgTn5?sVH9G`TYV\kmc8"LJ.6F5Q`s1o5n1lc7*?XB=:J0b]V$lnc`T>)SX3t^!Fk^+` +N]$n:#QR6mpn+Mb>Hn,DVWDl_Eq',(ODo;D0J^QgmcQn>%/.!Cr7M%2"fTg&f9sir +CN*>c3jdSm=5H#8FiaSrT@_9q%n?V;!<=BmnGb$]R%<=?pj8kbThjX+NRjdjJHdV$ +qo\e_bFho)1SGC"1j%2LetjlSBM5#nn'REm)G6]pLU-rqr5k`*l@A,]qO,`cR5+^5 +-jSUc%r3O_&83*6=T+2TAoXR!C+4.^AHt]()j\^3iu.aCRHN]\(RJgE=BW*oEc6.: +hX7MU_d@b;Ljpit]b"m='2e/#\*n/GQ2e!)r/WiX!B]%A4.F=k>8qnXs7X$93tVM< +\.OOB'eso2bh3hUU*)^(i08n#;K+gMje)%W9hb4!ek9th/R.SuXOPA.l^P?_"rS+YhjSYq( +JG5[,Hgf'ui;KQ/5'RheJ-$;_5/.j6YN/q-m7I0S'ke/Ga_ScOq`fIZ:;HecH,fa- +1>dG5JbeM4K',ufr;Ga4K)m00*/HtX^QA']QZ><8NqMg=9P@Pb\1deNGEKX];sN!. +O1lICrZTV\G?Bpnc_NfecPT6%>+2mRWK8jRHj6d*?=-F,0$PdnbUgt2"97C=5?Rf- +r9(lq.0]Mr7>7]e`T^q[Bsje*%2EE0!.GYO>YbJ%X+fa[2.L]9DemanY%6$Y1=];e +f2i8*?Q4dC^VMkH"o3fHf2j9g2)0Z$h("5_nfu>*Lk*8bf/q#m:"MHRCTWoVV;^^- +rpg@okpR,EVY7YtF^@-8;bEDJW5?+sDC(bF"lWMt+&@J5i3<6$$QuB;&THD&$4[dp +5fKY#"ZQSI&-6G[J,nF`&n]Sl#&,goOT,h]5]RT91'2b?$Tf*6L]!2u4,\r$^`#Xj +]-7KT-8*\2pLlDFJc)_I?]qp",O'[t!HL1V_4fg1+Q(Vh7^DPPh6iHAlW!h^.p +=HsEui.!G'/WsmhOhGr?F.Ppg# +%Lgl5rBE+da53c]?DN#=%-<+Si(8:qC&30PdGB/3qTb:Hi.EDu+$N9li$mrHc_>M()?_B.Abqe( +:$1IP=0jJM'NT?'`o5:r@m8j!ddcd,6YqS0B_"8a1uM>ELbCA@2FI:_I$dZL\q5$_Su>FnTXgY0_HMO79O1I^_$VfGD#$P#k2DqnEKq_X]kuD8"$\a,2;,H#:.'7M&JhV\4 +0T@c9RY$m_a@Z%U21(Zo]N2GtV?o;*@@&/&0uc>QGbAt"fY8FEhH:rTh&,&(SD)kh +hV1eU;IFS.jMpicqW)714nD[PS$I% +r/N)&D*bfm0=&l[Q\iV3k,/f4;uG;tiRBgt%06oZ8"^#&j:2T="p]Du,=9S`G\0R^ +0\<\EUp.#1i18&?],oqXqOBU^ld34[m>sE<crnk8/2d*dp((16O4K=p +l7E[Jrh#Y5a9`ZBe:D:8=T?kgji!JiPrZ'/dO4K8K<"BL@%1Q8Fp/dn>^f9%B +?#2D7R1,oWYG&J`=?9tZ2e1igZ_p:YVT7u:fO$r%N(bi\=F'V&J]47B+3n#AJ4DE-h> +h%1-g$d6kNS+abEHVja_[&5hlkI,`_U&)MG"9+(9@"6o:5WYFjkWl68JXr0G40%+o +BE1.8YT?\2"3hFm1?<9ZH5Zl,W:ORli6*BP?_c4+"7lbG_Our3oPjoHT*tXZ#.`LI +L3'WR45uNtgFddN<9]`f./h_VZr_0Ur!us:`;&0ee@2SYhKaqTraV0'*iHaP,Ro"m +$-HTrc1oc*Bn(Hm`*3`ns8BhaIs\JpEF4[Pl%@_=c0%tJ@[U#UQRh!:2)E57EN@_>eo6%d8C?K]h)ERMo +Cjr%!ZF@na.N.M$12Cq?Xk=TrZUIJ2AcYH8WXO&RAo1C[9jnA/06P6JFmpqSD(&!= +QXt,n;rK1,9H^@XOOfTUop!INCD"q;UZ3*iT(iKQ_8u@!@ddc`PDSnk"R$$(mmbr"3h!+dhOGCV2Es-Ai6V,5YEU@:i#9s +=pAu[CuUD0_l#kp3&!%oL.'^UjA1/[mN75AK&k6kDe"CpeLH3[`U%6)&6g#PE\CS'0iO[QRV*02R5."%I(1p2#!^Wr9mum +#OL0+;]g"'`k:-n^)iC9AnYR"3eI;@o#I9SScSP/B(iZFP7b#6Rt)4*LfiZ!&L%DT +6U'!*pm_Q'>n%D(?<&&,!0D]Ys!r/h"X'ZBL^9@`9i(9+/AN[+L]H<$#Tr+l4t`Cr +P0M<&Q5?#VrcVKraPZ=3"J)*6hkeA@b5]Wmb/IL0pj[Tf5%0RUd/5Qf56e%$J=-N= +2g&+>%7pI=\e:,)_%jj6k.\-ss7,kKpj`.Us2=aU2N@e(r4+fg%Y@&b!lncL_u:`! +XMb])?q(aTf2L,L;[0o8aFCFlI&%S#Ir`%/J?"'9K!RECc:8+N!7j0;A'P;))*Y8[ +_dA.AA!R??a5Xa>Bp$09aKmL>*=MQ.q&99L7;0+T10_%??a..E[(fdn``@65;0Ua= +53ilP%>[dbjnllkrD:[DU_We,oQKtsSY#eDI2G'Y]M$=qGLMZG5F-fIs7('_HDi\: +Cr-)]q\5Z[!3CU`>Cp3E?Fe*(om3h;5N(YuHp$nJ369naZd2,+DMqRYYZ:PlDXlmc +'n,+)ofKW:IrIL@Vg$OPBD +GOLZ$hfn]OpE+bBJYR_)HM"=pTGL/plP&OO4e;E-F,@F-+p&%+SRUfspm6j7*sqam +r#umPKm0.9^&8Z*n)c3I/.IeX=6=W]hkrVj-:jSpl/d/WkHoo03^IWefX%rP#>k3:o5N.:OMht;1t +YIcK84>r@;mE$2Zcg"J-'I'i=9BA$-)f!IEV&ABKaR.o82#]kdp0t<6P3[UTnl,'- +5aK\J0m/`r1E0S +"K2JpNWikF6qf<7s6fntrK!k,Z2`5J+%9L6rW($sXG.!/kYW.>]uZB;5)Uc-Dq.N,W_6H8.h#Y6(f +))"q*8XD90M)2a+P,(=U[diECBI!.BS!3R&j@n@10 +[k1.er7M$bo9.XL+p-+&O:[eO&OQp[4X$?"#U'8h7Kha]U<.E>bZ*WX9[hEVMfhI* +?Yal=gHkg&[l3I7!Wqd"%($"Zk_\fDlI5_SOc0^+%l;_]mk_4C`k&=uMG?<6rl$om +&]c%tJ5>t_ci9a45D9'q3D%`o8cL/B!;n*gKS9BGa6TE&(`fb#)+"ohglM.^&,):k +"(oW+MICQPQN,H*rQH+*G+?6"`IkU4FVaA-K>^H(nBXg>>sPJBMO#(+0h90E7fqF# +hmp[K0@^4AW^;W/iJ$j)Kp(iBdZ^_3qmP4,#CG@I4lmE/r:^8PHQa]$s/D"'rQVKD +>1d3hKIg49U:$Z'`2`6^QTi&^o]/c`.q`PqG*2IR9<95l`q\4u +atN5-I/Q[W+7@>K_ZQgglQ5Y&J(NuYkGF;oL/'9;dg'(*[7seE&P:';E9ertn/qQ=DC6V. +c1<:(a\BlETUB0"rr95&TlI$3aQ1s8UjT1?b1%h\3nn]"qSJB_P)8&$\Y8TEZ"j.M +3nuU&b`8grT^i?`A+T0bA=-Z+(k<-:(U10a,9if+[nu7VWJ9713f)J*d])*OZ(BtS +NdR$;VaHa*hSa(>UG_tD3\nI=">)lZ,.P?H%DsVia<(N`(KY6Xq.'GSU'9JM;'=f4 +r,cC;R&-'sUAd@s!Qg$\s)_2D;43KgI\QBd!;ZAt(1Bn=Kfs:/DR>\+W2mVYcrQrX +/H?n$g6CgX-)(uZ5mmZr2l0E^KYRP`mD25j*.qC=Du9C&Fu1?=f"(WR8,DoY3$@m>CeQ2hSeJTg%uG +G%BfICih=JJI"6C3H9@\o'H'$L.Hmk;qlBj6mD[DO@Xrt32F>ZGUO?kO8+#gDB2,q +f@K4jo"J?HrQ!jVf:'_sD-7n/U#pfQH=lnXjoBL@sc._ul`2XYV +ZV&fM,+DTr>ig<5f`(!D^iE._WG5qB._]/qAZadoeaGK-4&,hQ5M\!M%4HGc7#lZtf:osN_1K*(HfE5'XI +:#^:d!4PndECg2?V\(,git;+"U4?0])F($ +>lR$T;%!6dm\A,@]_T?_Lk%]SSFZA`l$n*oh';D$3^G0fqS0d9`r7@RQc*)7B^\0@ +Y+Bq)E@R.OK?R\.Ac2I4`bSZ>5IjJfnK#"*?`*h\%Y4IAGL:kZ&*#VC6!qG&_h3n4 +5/d6F,D\9#VLeYP^Q8-l1fb"9E"_/UG#*?He$R/Dp]"9[THbSps7K2f +Z`-Z.VQ,KP=69-hoD?.W/A7n/"6GH9Q+"dQ.-(8aoar\bb'Pi?Jc$hkId*h^%%\=2 +jJ5:fdO![lnDdPmFL`R!eDQaqJ_jhc;@Y:oFFT.d<&E*-#VCR(SZPnt>%J*GT.9$N +`3j,^74,K+K3aqs:m+rVaXogV1]N+*.H#\Br\WC3@/iS%5kps@aIeLUJ$i/i7OMbV +oJ.24rGNtTKu(+-.1an&a>YOUb\6&bYGWZgRifbeXT7R#0*HS-baQCTD37Ckd\AD^ +7Q4*XG-r-1Zkq\ETX?cr7f[W33!);*s29kHN!1YL&-R*L&YL5+!$VU16mFt7&V0V0 +&N>am3ZWePhXRg7)YP?8O.$6hs6;LGMji4E;#E]6%lHS7^R-R(>!eS[L]q;qJWrrr +ECj%<\r0;(c4\WjGdWs0l?%2LH:)6^Z"fWps,+[+;["21Lg(tmFqXd5D28">SM9hg +A1p,ic2V!HB=;C^;IKK-"Dga6-f\,QitFN?j'0p9G\@X4+R88"6!8)DF02l1QCD]K +EmR!.5CUHJ?_*BG"9;$n:Q5aZ-cFJt18s%qrl^476N.n4]u0%$%!]BNriU4U)"r*i +9@.=%/-%m$s7mH"5K(U<76WUG&-7=)/U+h'DR\9Y(3hui!6jp) +$!^f.a3+qgg$rJKI\>uG0QBAAobF +bTG]1nY=jcoD=kP?bQ9fWu$i0HL^k#h=R-(hgF7@DS,m\Q`ko;mUHe/J%U[$"oe'` +lFW*i]_<*H>pAl&Z!ZF7$CX@0[L&Ut!m`)TGb4W\VnrE*2]nk`jU^p3m2kDNm\KmW +m>UL>U4)cJqR:?SI/>8e[r8"XQf#Q;!MT#3];WKUL\gjqeDEH?!;$6e*qCuP,lRMh +oN*[eqtL'L?ePADF2@/`E*Rnar+EJja'?;,'-6=,$"(o/l/Z! +8LZ/`.5$8f5V"r)#muJ2^_@Q[,6&IRc+aSbQY->h)Np'*BTY*Yc.QBkgtp?SOe/;h +^=)i9nmtIjF/INt:`im"`,3/(QN.GT[1Ac;8hm4F&n'TMhY2m#]L%F)9cJ;)[3;p* +i17&p:00aiYV]691Jfi8.NU;[64;/hSo&/_ehgs=,]j3^/n7h6eQMgm/0"[mqoOsB +N1`9Hqd0DS_fZZ=4Z2JR4T:E?O%+[gM$Uora+42pp+[TYm* +87`KlKED,h67j?'nbH]\^dW[JJ5$e;!:W>6eW\oUP(oF,\uL_#MY,WnN1.'ERZ]N) +U-.CaB,a_JKE&Ohs7bqL##7VmpL9oplXQhO`m8HFq.%]ec/,ZfGA_$oJ/#d2YdZWV +N.C;_AMZ(K&J,CnLOEGlVp;WG-8spC63OAA,438]K-F\U!Vh.^=u8#aR[k);:!:?/ +M]i&qQF5gtql84YdsIVi6N5g"5S*WS&qh&GNWA8KTJ&8As(OXc^CpH/0d\.C0-2$r +!eUTuUOb9o!^Kj_b=?AXBr`,Pog"ZcVT4TVk0FYtMcRZ/6lrgTT2CjiuehtrTKIE-`2=HJ>a"> +h\,W>LYU%F$iJoCFiXm\UEjm4`#,CXij=Ud"e73%$R'Q&p^dHI2e\iPp'G#2'ELB> +-fV2]oN.XlPhd<2^V!G:i'uQ:-OZR&bC=e%kKBck?U%9\`gP'N31'HCo9nLMOS.u[ +&`:0]p)c45s5pj:^phU=juXCY"X;lSDEm^8.nAL,pZN^e56bBnC&oAMHgf(X&"b$D +m9-f>k[Wf[d*6$&+$N1=+Fj/;'oIM1s'M@js.1)$J]e!_G;B3a2TBrY@K--mqDZ^K +^3Yh4Q*\]>B(kedu,h +pFTFVB@6@fb#m?p@.@3'nQ8TGOB&YZf:cn,7J=b;P'V"k#lBV.Ol +SggZb!D3;M2UK8>Gl6a/s&DB8p`DqTR+enjZB5Yfr +H;t-jJq$$i32Ak&#DTV]K:4oI%`""*BL%XB-\)oHo]Qs@6FqeBGp!0OUHmK3#8(pW +&\u:M3!+mM5S;AAU]Ejj:`EEA-8efNMBW&h$Vj1,+oekYDNI.caZp!%OWlBG2,L^0 +:^<\'.%;(\s%B?LJ!#Ngo&oNu\NDA>kJUem\b.4c>o'o8$ukLY"B0.pWOe6lX$a%5BE?\4L5g_Gn:)PNs8)5a\-;e[DI`6lbpgk^_Z/eC +k0NKIiWoO'(Q`G6+9J2D=:b'o"/_`he*@!\UBj-a?]\^rgQq>JO;.[P0T1!MLk(1^ +g#ANLBjS'MTNYW#Y:[4DX?)]M"3KHL*V,U`rfNi[LkSP_!gJ&WY.VFg(]QoHrsi=+VnUg1;.;AHRCXon]iG"5kglu#0m'5; +JcA%8r$4)IHn9aI6=G6Soa&KBJAcU21g)ql,%/iN(@"\j[JC=LF@Fn/HZ>Ld4Nh*& +(To?IZ2$O@L"EL"4$fmk":C+B-24ng]`]Am3iF-blZ"h/>tU/ViC<6(qXlio!P?F6 +%VLk+f#7%dfqfji/F7,/HB_72a+IdgpdjYG"""lOal/C>Z +I)+n'\D1nmV`*P:h!pZ%$!#atXhGDu]RR9KTrk'0[r\.sB"kKDrVTFA(O*4"]V"l> +.FM9mB79Gpk#Y%sGaA!<1R.X*@D)1WrD/L%J+k)af+0QaEWoJB;"K1s!Y_s@ +V:3X)G&q"QRJlq%jqi4*?TCRTqH4_Y-/Z7qr9DP&+5B3Zi?^6A?bJ2S]B:ubGrk'Q +gIJujIdFW'B-2;'IsL;"RH`bZd57maF%f@bZt-QnBMDBn6q@u3BuC]N-5:'WV5Z]t +1]et;V8[,1B/,MM`C99J/q5<%:/B$IVNb%eRDl5%8-MifB5:I,7VtnM=8nSt?tu?Z +@C0QVU`etWNrY&b<:bm`@!ckl\ZdmsI!IaqJdC$#$[+Yf9kQi; +=r1GFp<6OIAu_rmAW+I&W!+jkNYqBbFa9jmln29JE@r50-"+mJA8*WQ!%@Ec<,[%o +6MhL#J@LafW?R8$a<6!-2PTuEaZ5/H/f!H./,o_I_ikH,DZff.)=Z.sQs)LChjAft +Ak*N8;iton''=,X#.e#Z!-:eNY:?_OSWE+7ISIY_[V/cEJ/QlPNp$j)_];15Th`Nk +8+Bu"8\^sp[f^2-\#us1]g/XDKa9qLJ=IpNU'MTLmU`Ud'ipR2`4$7\G_qG1k\'@YHWW1pgBiY_FbVuXV1g:c#es9KV/+!hIf&JIZ +>fNEA\d;:lcl3Ad`I_\E)M0*A2?`)^li46h8)sX0NT6f)d32*]J@MdiAF:3)R!;)1 +I:m1%pg9dFeS'h_RUWt=\5QbgeQECQmkIk9';><'"pXCJ8(\saZ#S(a,k%u;Ve61> +1C/d:S-"KE5;O[SS)XN_K)i/QF*aQ%>u`Rb5<$E0Jq%21C4>U!$u]]P?sS<*?OW2a +QG;>1&o]^`4A]=a6*NrY5%VOeN6^V\.YAcG&9'T(S;dQY![7Vp2uj$LM+`RuBlh@D +G+$r/p"AHbB+QruOD$m"os_%.2&fu[7]^*@]aNJK)<0&hpj0tM]FuDcTHh:-IP\.E +JH)><#Pl7JM4ftQFi`AOE%7P?n^nac:D4B*IhehfIOS+q*4bKq:6#,J,cAjYMF3j +2cmfp-_LYK5%:d!JPchKb:\kJsN>5"p=` +!@[s35J558mNj.Y=3bEm][(nQQheR3iFDE5-fR-^DmE^%@_R5Qn]Dmf\rqP-8,Do_ +nolaKrptlgDk5/N\%VF;D5DV/G4bUgZ,^-?m^4+HH1(IQp^,hc`aUl@84t\EOMUr( +Y_7fbim[Z3A56uR6WI`@Grg$J&-:mhBR=Z#8Ht3*P2ZoF^D/.ae%Q.af9VQP+Bo=U ++^qc.EhN1dFlj.$$HDrNB8-e\/1%a(E[]arbOt1:lqI]ij:>])o:M!fKRZ?WH9Ne\ +huu)u636upho7nFj__Q\EI1u)W=$*7[YaROOV4Al-lOlW%!:S(C3"W(F#oQL/pOd[ +U#8b`lJQhW("aS7T0\QmZk$_4iIAX?IQ7Y(-E7d,RYCBGUjZ59A(ma.Fr:aa +D.MiF/.b!Y+*/QS(=:Tj?B!.QmM8ia._AcIe)-T!oX3lUC\".D+42=r&*rdVFTl:O +6GV#H1tGf?0ba_b>mZ5p`C!pe5snLV-StmY7W!^j/RR+uLX,*aYaT)rWK[_gLW0eF +?bd3ZR3Eg7?on'jVZ7uh+p)GMnir.bA.+J="[Z]_#L:@CL]("2dIL.7)ai/1es%Xf +ck$l]^Pje.:r3/ODAJCb"/R(:?V@B!+kK\U_>MiK'JP#N3N8f*X11!mW&UiR330P; +Z_T9rI[n#*,6IDp/c_dL6iaRoGSCGZIshIss+\cin:-%l=lA)d49jkrC1Cj?4q/*S +jhDHHgCB9^6jD71rRh.["X&h:OQ01\1tI4iKOr72+O%#k>ACSuX6hF>:92r_dsE++ +I]"pamKn/c,(@mf?T^F^&,2d[,%?-0^dCABrGT0RXf\Ndl$qsMYS;uphEG@l&%;r- +DlD4PX0gS9m/IQ$WM-)GOFIGT*utT'Wp]1C#IobPElKXmb;eB7_4?tQ:JM;5r7Lh# +!WSo4iI_Hr\N.M(4De(_t8:B +e>lICeL:*aFm:2kb%'tC-Xs&N`DW=2:O.6O1LJhKmbc<=p3S_>q8obZIW=PU2sr[9 +/\iI3Sj3qiT1f"/K;j?G3;qZ'1>[:9rU#BghK]qk&5%HH$$=*BaT%<^TY[7-hFDq[ +$N8N0kl6*orlR7`k>12%\\if*K6_sRjPE`4I=^1SU$P8oXN.)pBB-?8\&_q5V7a*t +p!paWYF`u9nlFH\ii+S";kFF;J(/W#lIrL)(6>#W9Snh+4*i]\%HKf,Xg<_]Bgs?@ +N=rfr8/H9FJpK2]-53t@RYirW"V;9-#n_]JH76nPJGCoBs1/Qej%K/h30+kKGM?X@aTtLiU7n_6'ENqTL]F.WaO@S'MZDN65QlW8+T_r5aV7:)"edQ! +qPa`#o+Ufs-OtqoZmgrfjf^Q(@LeG#!UuZDqqDrZs$M\FIj'UeTnimb^ueK;!p]&A +2)V1uW[s5rQlk-.8!q&q.'oR#"&i

    ;Cf[h-_)o2KF[86W@ +blT9jO0L;ef9TBDI`H2mCJC.W^T.b'+82.enqS:pSHVDH/GohSqd"O310eU3N`@s> +s,$E@aT'3RNtCT+./o4^%3Y\2NbU!A_>d\UM-^_TYNYDS"F?#,k+3J:Irc(oIpfKh +A<_lJ5<^4jq+o6@B4jWBniqe@Am1Rlr$CDW>Z_PFn28/U1Yd[e*YeNs[)]m/ENG%f +]4K#l<7Arq8lZ)\)%@@4`$"BbEh@Z)A.1!#&^p#!iL>a6&G:gTgZD +IT=2E&C+p&\6 +Cd?gVXVRE;/3+9"p8Sj3`L=KWmB#f(.`:-./PkVk[q*fdElMI.hOf9POF*1PFeb:P +X.OO(T6WFf^Cm9s)pGlHOSW?-mEnbaoC:.SEVm>NT0E+D(QSLaQ=E.oSFXZ_WP?2$ +jnJKis24f^#b6/2JWr)88GhGtFEeFk$0"05R.fZ0R;Y8[rr%J62m-&.F!('f=(kG. +J*.UDf?ViP3h?6AakR+[EpeoBD\&(=neU'@b.GQTH^?D_5!SA,+T8PNrTSIYZg6]8 +ihYaI=jMaWT*hG[mRqoZFo;6He2s!p0?g6[=OI;(Ut$O76jIQo__AMSoe!8R-<@I3 +d3PS^q,Cc)R9u9aomC%F7Wiu+1]is(kR'j#!>T0KR-HF>5cjd:iZJ-%7M,`[J%[H8&]=*YT3>r,L&('*_*lRj1B-nr-n(gD$:F.q"F]n/TVX/!(n +2'c<6)5dIp"8K1,Nf")>%u1&QDB]uY+#O*&f`0&!^b#Nu!RsL9B-dH5 +XJUQjea:R]/YcU4Ap_p+?UG=^s(ooqMBGr?+okn$e':5GK8P\EJD`)3r%FoQKiIPk +4bjI=Ir0%'F`eJ65J!pQX/I;=TK"aB-mPoL1G:rp.*+bL%FiU\2F&(_1rVtcbnjoN +jX,e6TM$6tki;[1XUpp)3#*G[,%(K5T)_RgbQ&dc1E3Zueu/7P;nEXbam^.O'-?!? +%;c7Rj+4pe^FA.sL>3eu_Z.QZr+Hku\q&(U:7C&p068beU$O/NYOSd[rV"Ne_[q!8 +7m*Z9YBSg[Mg)"7Ka5(r_jf$S1q47a92#B]\jB^*mP<-)YZ3RA#ho<:rBGkqIg62^ +rVZe]M.8LjJ"<_Vkj5D7100jTWrYQd[Jdf3!)`d&$3(C;s/2d1r1^`)EKYTVg3S3; +N&E?5#S+s`[(%Mh=qVtoKM.5N.#Gd"LPL322Q<%AdK*VHA+Ql/2*a:"NJH9KBUM"% +Db!1_iHB<-="&(d>28"or?$&1:^c2r:&kkkpttIP,1[.D?$6D0Fst&,Q@QFZ7mK&, +_1_`gi;e\I/J:fH!.GP6ki@6?IO#3VUCR.Y\#XoEAn&?Fa_>Or>NNu-2OEUGkdG&9 +Ni'EjaBFos;!kq>'U64g/%17rT#^Js,?uf&WQTNZ^::1B'tptrb[5AF7+oA +p>XQP]X)C!(Mu/k40gNOZg[Eq5N$1'c;/j:5^h!Tq4'P4W[mC!Hhs#Xe6"FVK*Q$3F3#f7NoL:%_IS"-$FP6c",`_#/^\8B,4*Q9Uc: +5lO`bP,<#lA+V@3"6[#;]8DI0CdiUVJGaatR3;Odp2#ijTI+kJQSYA^)hXTO0`OOB +!-(JOQ;!gCY%M/Ju*ZDVBKVZ]Ki"sT_TWt6JJ>F46H8W3`0M#b)>M'CkV +rYHno"R'N5&;l!*/V&G(r=A0WfF^Bhrmu7&-iL5-B'U!*&)^._3!G*R!"Bg>kl[X` +J=d-4?S&%0`Dh@t(us$Q<`<1F-k#PmNuA.\ad.`ffUccmHuXdgH6 +Ka='PT\ZJYcdA6c,/CP9ichbb4jXA":]s1@M$Oq_[lshCs,$!uR<'=rVrL^RegL3d +iunAmcmWQLRt!6@+8>Ft^"l6Y/jn!>:2*78"<\J3U1HQq@K=Y=cUgG%Y/NlN.TGjt +T+*&5br_]k5h;="4^E"0nG+ul%@maJ*_*eEZH=Od_Lu0$resZf53],6gWjXLg +,gUt-*1)\E#R:T[]tM)HmY6a^b%0TEo'bcj2fr%bg&I-4*uO&I%J*'0pm,pYpk4G_ +H5%VX!p@lCZdhX'BktiGX:WPs=BlPmq3RGe.nem`,lt6],d]0O7XLe?p=L'CV``m< +"JLA?,ik#@AI.n&_0H$OZ(N7$Ej`Zmc*+aRh=jU"aG*IYs`Be9J@'q,aRMT,O +h,qkW?"9G6;U8Q'00(fUnrOn'r6)FO,@B.gnVu!Hh`62a7lR(8l"qesH,jnqJR@;g +T$S)Io_.=Kh24Me5J')?B:%(S].<3T4"3D)PPW2?Zle)Kr8&aR2fE/Soc3:Oh4.!E +o'TX6]G)hVmk*1t=)D,6j%Dh198,H#H)F^7c`cHfCsT^63W^,`/iWAs(ZPuEoen>r +dL,g0I/<*lXPJ`WfI4it86I[pVi8i^Ngr:MDKfkkV]'EGD/3UZA9=XR9MUn3>S&+8l`Cs+LRT"6Un8H7JG]p@:0/#qJ>jb8+omT(WH7U,!-C&N +R$M^j+o_q'oRj,ORRi#[F6rpZ9juP(KqR&qhkjhTj*a,UIuLNlkAUd8FeY!BLk'(H +RQeM=!#c$(,o-RP`AG;Z`oU&9fH_XB.$YNX2#(!9.P)e*(M2\EOKeWjEtK1/"ge8. +_f\?`^mUhQ/P[T9^hm)&Z,,9.!SalXm(a7A,K9n<.=bo[iMZp+P, +q"m>UlX"Y^@gn"f*P-c,la+(ZqENqgipc,r)%f7:p:ksRa^`"2s+mR#l8?V1III?t +DZF]F2uliaE'#fT&O9"mR+;Aq;-t+B(9uo0c#%;$s"?#^c-OJ/-Y3r,n]7X/r,4L" +NQ,/8^&lN^d1jLi@)BAS&,Tc2b]QJUI1:frgu/kEka6=0>Vn;]Ssbbebt@0^A4uO" +jTToBp_!Tn0JA0d++sO,Z6EFWQE76^NEWbj#riTgN/(lhBTGXqp,.WQri)3>?^6j? +pA\_m^DYRNdf3M;s*1b*E<+l?c&YZ6DAX=p6`8cMIuPg:nG +bq,,R0:+p,bZUY=Y?\A5XkKeWp6mj/Xj'mT?RrUhQ.]53!QRfhIAt/n=DV1iF=\4& +(\8i/XN`'fhD4?4)YmDMoc_ZS:PFgX@5I$2HYMA$S+?N9-[p)/b"jZ2qcQ8\a+&L$ +p^_7)p>6[H]mB5$Wu$frf7g!`H"6,hh3@TgS&jKtRI]a7W8G1Kp5S[NYFT+9[)[Q' +li.Uk*_qkGfmVc5H?[!-e'm.7]m&kWX6M>+^%^B1?e'W'cKsuT!CnLK"9^as&9J2. +!dTAc-pSt!6Bilj$AJ,uk[e@K:%-je^+?0]K6g+5[%uPc3nd_!fNQp6qg*;ef`#haobFt: +=F`a;Pu@Se"HK^dp_l?,L@jU$b+nopV:5B3E"K5dQ\k.>d\BQ<3l'!qGh&0hT)XAu +f/*E0]c"THs3HdM6,/H[)l3LTdoF92KaNG$Im+>Jpn.9N@h)8Lbjst"p/;1Ss2jC9 +\JcMo?u?*4ILQ9!%=)/=`LB!Yp3A9iGJD_q4Z_D+3'2M`4^-2Q5;K/Z',`Y8k-IL7 +G0-ag-F2kbmpP$jTRn-fi'51pUj@tVT8Dhldie>dr$,eXCAU9eGG<`^G+u?>aC"GP +PF_@hA['U#-io]3e.DTm$]$i(@4+/#jSE\/[tX4b-%PNE#pfR4'XkKX]DHI^#iH3r +T(*nh!+[>$YO__cCg!fGeeuhB+#M`m9JKcAS7aVKGrG\p!O"*L/3miR+r3H;K#0/E +(3"B.7.u4MmD0V.G[p@8gA8\/b(;tM8;\14+7TMq\@b=Jc6M73L\1qkAKo)VU3&Yd +$H^b*72Ck!?7dGS9=aG)EN`M.!K)olQA`HZ?k018j^f,W!3-#1G(EfeT>?!iGqt,u +O3%?3i4U/@DYhZ%^>lkA6h#"4L(/"72EM(s[f,+R^Ra&$)V'Q>PC]ps47M +"TDdZ:k63iMLKUeHZ]FJJE@X:lltr[fC8eKn\9$Ba;t>jPOT[/35F>4??&!$2N,oh +YoegPDp=WUr=oJ7TtkCkYSI[d`1pOE+8@,85r!jg/ffMFeB003b44i(1O)bWY*Y27 +o,EdJJ<7QRe_G)P%KQM,c7s(NpJ917m.g4!Wl61si2N45agj+?jo;1=Xoq#f +^UZ`Qqcbh#!V7BBea+Ae*=mM;Zdm\T\p:VdgEVpe2="WQa6i"\VkjS6+G/35fGBVW +bXHo1*%O:uD]QXF&(lYE$C*DYeBo`^\&^9__Ycf,'p#K8U8hlp#muH`_14K^'SSm5 +:e3QeJV5G>&uRP6CegGDMphinXFgtTYS&c/3bd?ITLmoo@D@)ke-qRd3ntfk4??8n\sCuqtM5skZ25bU81kP +%#X%Y8UOMNh38(=bP\7ap@C'*AVp(2:OS\,h.A(%M9"Z?j*kO<)5NMqF/oD-kl(cTQS?U2]^H+_>g0^mFAQ1)A_gL +[nE.\+5Q4i^,R5$G.+r?24O2"hr0'2n22Bh*<&FP,*:](qKNL"K`+!^ccJEKN0-F0 +n-=6`#lXi44_.tdnjf5m3tioi([CU)E5SU3i<&h5?7o=[iIBG%!Q!Yg_N"=T[fFX% +(@WF,\'P'5CjH;S%\]Sg*`CMbZf;%!/U/3Tjk/9TnJd-SJAldA#l)/aZ?2b2nXmVs +9M5Ecl]'CSs%O7kjPN6J2nr`TYSWr^J4p3"&cb^e5[>T_+#L=a@*?Iii4"?r'UJg` +>bOcp+I=ZP-'&5H"Wi/E_d-ZV(V&f8*c"'W>QdKcHmf$:_"gr3OcChg0i^-BkS!NZ+j(@KW'Rt09I=2u[Etnp)G^Ybun:*W]4roE0e^jol6oZ=>n5+nuT5B)mED"mDnE:BAf;hobCRp`J):j16#a5OCKfT`<#t=J`*QSUNAS/ +%\"<>58V*WjDi<0_]R-Z%W.:.6id6Rm^Q4UY*@G'r+]''WbL!@D6-c4:"6*^Ja1bf ++oit4hY;mZKP+]WTSk^CNX)mb32i$:^lCJRqR=\h/o[H_:G*)!e<''4FTt-DJ*+.W5ts6V=O^p;rXXq[.+/[H\o4]meUI*48rtmC!q= +4Xh9,.joqS"cAXM(&_#1r6jEhkr_6t7Tr9jpTLrKn +Y";5cBsB56QDBq#$l'?l;(9\(AQbcjmA@,[WkA+jg>Y>4J,"f::]@taci;&?:]J>= +:]?\^+91L_+8d5lI!T-SK902aol-](D!Ed.ciU4S^p=E[QgDf>jkN:KnNRb5a^"dUFfpU +562/-qUos0i"+/Cr("rK5N)QQ;[NBjkKu997T*KO#RUS5l2QkCDc8GdLGZsLm:B`- +6o4UV;=lq,r=4O;N;"\Y]E%Zu-OY-LJ!",g%f\Q_*C^s0';!,J0`2q<.`c>$\]o6* +RHh+$pd9`MZ(]f7C]!&0Ib)agnAjP4q4GRo#=/ZXoW[8C65JKFN?Ea9k!/H$s6U#f +##%_WNQ[GY8+`1.]W_J:]Zh=?seLN-[p'*!*WS4f6@IfQ*c'Rr4fUFSK#rdSB34J[u?&Vp@cmIL!DlM$N]a8G\S3H_Sd=XY$4SY-!K0L5eI[dWdX$>L?U%j +!<6qgd>0K66"\ikM0o%a(Z0)m3\2hoR0b\PLd<1l4JQXK'\$#EUk/u)"mg*".5&5: +O0K'D!;tfd\V>tC!e5I4n_O>WL@GChaFT5as0/$tOYuOd(4u[Ek`(5qp^a'H>`i8J +A2ddSnGf!:-^IJJ,+)`>%K+!4VWNOKWm5EM!a"Zr/5\Pnu!=`R#Uk/UGi.+W/@Eej<4>"-5 +Rpd0HSm^GD-ZWVrn-SeS/di]\Z-g6ce,_qqho5e/8ijIr(E_S-naLQ?4r1WkjT5/` +r':>_3WE#a2AQP6hp%%jQr,4UiW/`u@gtCW4r`6fAeG"]c^;Lt-ijefQLXLG`N?6G +UeO2TV>L0$O2;9MjrbYC[](=<:#-D8S:n'&F5,6KL+E5`uJ3f]LSg!!#el0rUO[+UhQ0U>K*@L +iNQWJ!'Z$=ATansg92I8D9I4NIbAdnDMI#GPJE)Jn-,gOd*a`(K6eKSML9aa#(:P+ +H?g6M1%g-iNSRBbp7&c2o)BPf)f8Z:cnpU72A@oCcGZK884XX/9$e$.*gt%tG1hR% +X'd9dd-HkQ%KD7a62sP&[%<(iV.)O^e3Pg1<6h&ao9r/-ZrPP_bIVjogT).q2:J4, +*&^NdQ?gt<%U4ZR;a5)hOk]%\NK\6Y9ibO)>n(?Dam]_C:B^/7)_^ZVI4N^oF/7uc +p1IJ#VjB=:dG$/ZhPG-9Rt!':&c="$olt^:)B;-2+*A+9WEXcDC;3p.XVZ13\ZJbA +,G3dCjNpkCU1/!VO4QYklsqoY,7OD'`e,4^XeY$>7(qSW7I56Vug`)E^a4cM$c[KXrr;n +T?PIkBk]%Gc6g)e,cdDD>ici!bKU!drp]ZnO+)TNkSKGdrq6)"It%4@?X1;=QWHEJ +pK'TUbH(C;h8KX!B(Ed1N'@/XqB,^[c:@oAotbQ*Oo@r<_gg,5pilV-s4>/lIWtSN +[ms*kGf'CUA'Rk>r0INED+??q8I'BP[jLLlej/WfC:h(6.Bg.:.ujI!,HIi@(%mfm +QB]ru@S"S%]pgHJ1G+:+<)_4C>a19Tdii&AcO"sNIOE>%@(YfBVj.QXJ6*J"H4C[#]rf/^0!]Ci"J&g>;aJDs-*,h?(@WoOQ'_L4JMDUR==I#:o(O +VgR9)OB[\7l3TaGOLg]Q0#]2XI5>Q&jl6(pj)'U!#rsoA@Zg+ftHn0O&%Y_ ++SF;@8@)#N`OG^#?06qQn=#Ce=A,ukSA9M'lWpQ(f$?)"lpMW3ICUn.,,^i\[7')^ +dm*pQ/SM&;m0q)'E@8ou)%R@A5O[\Kr4J22-K5(pGor?=LR3X=)&G7!6p!`/G)4nh +8s$<4XR(J&m5D3h7[?K(7`1?+d3j]k1`@;,rulE82UT&h$5"-e"9nm<_VsJ%&QF$j +MHWBtSC10YW+T;&:/r1"CDK^qNt9_S0UeQMa5B&6plP'd`q&uknu?GM76t4A;H4?u6:@"F +5R`p>jYh+k(*9tNcli`VOV&-@M#.n.J1;L@0>r(WWVq/2\5PR1+A/Ek4QQ+';=J`G +"S,porKggY[,m`5SYLp^=LS]RAmf,`C'7';b;rJ7XR-eRTQg1g/0+ck]Kh!H;X;+K_LGD/YOm0P5^U!-/cVA"A-)JLQ^fm^@ZeoWHoIPMT>Mc# +/=ln?Tc-8T=5>uV=srD)RC3:5pds("m[2!7h5IGE0$ldNlDOa_UH[Bc8bc)i=[IkX +\MSp]hP5ab30.^kUr`Fe$4YCJ'^:DG7Phi\*?$TIu+&:.!/l*?)a#o +0;R/Sac1+O':qV])O+!u-Y'3Vpf]/(>5.7q)IA*BY@Z=laVj(+TcTe@+K,X2;'dV& +;8be3MCDHU0+RhIpg-T"e5.cQ"A1/Uf3r5Pm4=X;=;Mgq#leV4M-?`D6+iIo\eU8*rK1@_8#D$pdOAZJ(6jjErU.@]t]n`n9t"# +5KUV5Zbcs^=o%j]f0B-;Xfq^iHf=.Y`Lh9eD`Xs9/ac>30Wb]f2+b8,DcL@mn6Z@o +hrfJP,:EDm-:Io@_Z*Y+<)6.PeV'_8'BZ#F$]'$f+V-Niiqi0$EjDo_dk`OYRR'Ts +SM"^)BZGh%K?&48a5ZOTj6^\=i9RH"m>#'Y-\i*!Shp$pnD@]Jr$q^S&T01\[X`P- +,-h=O(3&)9H/;hPfj>s>n7Jurm<"NtD>QQT_YcpnIlZ2052<[8Y6+VTRk'\[E_qpA +Eq$bub&K^"/4b(I0c)c^j1+ajq^Du8J65;<5OZZhi.&1.dI*c1O80'pa/VW#K#e-k +Ec)7n?b9hNo&#'aan?2Ph-m.o,H$M*,-P:]d$2goG!]RebEM`B:*R`\$A\j$%Cn+nieeOhYcUf5/?^kt]69=V!O'>LR#4LdJ1:gNJ6V;]Lqs.KAes;95m]fnIknU+ +KB/XfY3".Yq%NOUW<)ggY*lY5k8afkU'HEd^Z[aEkf(=om276VrMTtLJ`]$GV^!eI +?p?L[pd:jtZPRF[Np#"(#lJaPntU55IQe-X`RL%kpu?pOLr]Meg'=22*l,Nsf`kGL +gSI##pC3)O'qdL)*gDJ``$6aV'#EmI8-+U%Q0@foAIAF$&hD)6MVpW=L2='/09ek] +LaiTn"lD0J_Y4iPYse@>)g%jOa!h-1F]a;T'7Y2/]np5TZgANo_o?d[fr,&CF+PPF +?3LlOr^6H6PU%+FkVrPrs4?E5._GdsKT\MW/VEL0&q+cT5G7X/$)I4kcE1^mgb#&cB[R01MEZr:a5ElEg!; +btAun0mnWL#X9?f`a!age,nU$b^Z;NpLa=n-[Ds.s7_h$#8I+["Wu?mc-GUGd2ck! +U:]6N=Ei#;gsqgdhIWVB'9t\N2N#D`$j-"3XV<&(1@RNh?kE=TQPXje;B?mp5O1bk +*XI6;rh,G;/cSZm#k%rqncl]#SeGK%?ik8XOmP]-9MnQa=hH=K0YB%'Oge@rr9>TLd$LE)I_n^8[ +GTJB]B,C=`_LPPf$Fs\U[lieO`Vh;4]`o-KKk$L +?OdDJAaYOWhOOW1N#;,5Yq3l`QNQ^`r#9K!#['D[Po%sAi`\WS/#qm22'>-24T>N`RlMea^QD!I-dA8a=q'oh'kF)& +E`c?PMTT73:0aH^&/V(89F/0ogrmYhJC]GQFuElUQ]5]K%E]f]6Q,;"\)dj-gfH^h3Aei +[9&!?R0APsEWF%,U0!Oqi;`E-enop8ZE9SF<25>F?^*Kji`\rVMXe"r5$1Ls`B%k,$F-+*]EOFMHdaH,;pCcJ.-:FKfac#QFI*RrWfaDidW]Pe&91j>u41XQ@.="6bTNs6nMFODS*n2bY\com`Y*6oecYAmdFZjq2=#G1u +b9,%*hl3W&FmZDEQuoErI0WU@G3je@&+G'g&\\eUmf<>X;:'ad^HD5jr'=+Jf'C'7 +0)QgBMnA*;AoU:,1iaIVWc?3+(0!a#M#Tc-(m"q!LMmt'&*8>n-1Q>4LFWr8o;MhB +Il3-VSk_jI])=V^"8SK(?.WZ6NG_NJSrIKY^l&E*A$,hBK[H*6.;OtHt4FV +WlV`NqoKr+fQ;],(@^D=:?JdCJNNr4bGj`RWX&=FNaE5PK>+qK7;L'5ej6Wn:)6gP +4(O0`D9,;O5b=Uu4$b"%ikBs=!O(#AJaZPNE$GP"@SCng!5%;4c$ts_>K+=+c+?t*%!gcJd2t=]cCdnoU@HKPOCmU+br:dgK_#QD6il@dF6sPsKMDH,i +TcbqPUlb*3%:u<6+DS?L7.o[L=9/7q]dCW4+G2ThMi(2/Q3.'+-*]-gjp1+tZ@6OC +a;BWF\;^I_C$N_l;kLcqJ+.m_]q;,Br%&>(mrdj1'CURQli!F8URM"RSGpFel$MBq ++%HcIVQ:/NpN"q_XbI_$34"`X2c?/lL0r+0X'&:G-`uGEQ-sELZMk@6;$hdKhomL; +=W+0/OanQ+"8iBM`MB5u<`RW6lD1^@/?/ILoX7p9XU'FbA:qr,&jBh/JF85O'6#Zh +:*soj>ejgC67m`VHWj=>/E!#s(/Bl3_hL-m6!e9$$J+dBTWknp=XN//m_R/HB*%pcI\g,U`\,&Jl\[Ac_pq +G[WOdi=@F8q2#&7:Wpi@'&b."36X:]^QNLD58'jSuj]&,^&As)IW8nK6\-ZSF67RD6mo+MZ7C^1RI_ +_LJ>5Ng9Yr'Z,?1!F!M-.79l(X4j5b`5][&c%i#V:WNctUrgOeH;dF"i\ +BL<2[DoAG_R<<>HJIDKp+hV5"J5e)n3Zo]kr%<99V$suP"]f-I[=j#['Ab7X:WfZc +>$>.VkaIpG7f!hK8tWLIV]`d(,CMmXaW-Vq#Ok.(mLotA'TZnM^,Z%_GAUD@r'-To +!WM;ag%gU,./@?brdT80q=Z<1qI5cg6-gnOVdnK+^jOPW&"B"omC6g:3r9iIk@R9(!aC%4mD[4 +2slrKkB5C)e+;Ag]haF_kMm\4_*mA*g[3Js('(q9J?0PsbN6Z_H#C:uP!bDIYZtO= +n+6Ps^n9hNs6mgS@YEHD4OhWshpZ\Zl?<'7ffX(-%ViDb8d-4l_^D\>dA^=YIis4H +M!^B/I>WPV4r7DtJ4djWKWgu&56SG,'QQR.7r97:+UCt/Hm\2Gf2KO"5.pb$49b4B +Jep&HEYP_crAMTD\!^#Ed6Id.>L8C#YDqpnE.`%7#f;'n&<@-]$#r!Pa^uj7s)M73 +peR8Qptohe#lg"urtSoB_#JE]SKONq58k,'".Y16)>DKV?=q[\AM<[p'R_s#HuTo# +pbqdDe):+!r'.d`]Jm:6h_os\2LM%GIM+j?`-q-[IJ4uXiE(3qf,hhMcq95,)9Dk/ +)r]jf]PO+%95nr$?6LQ9B;NS[*;EkmY;JpE:p[5)o$@1tK`;VPgN`t`Hk6Em8H.YT +lCt;iXJ%6RDPX@.C9-7o>pq#]MZR;f,jMb/#@SA/C-Of@AHpqGHf+r`$`XBuY'e3t +ri+ke5iAh1>;GK1JH&XpeR>.um0kBh^e0c=/sH?i0Y\IdJH[mZ6EgHg!X9t(Gt!0b +;h>D4[T5pN5[<7/E9"oN'4V!J_<-s\ekL>ji"+e]?\Ya"Guc4;K!.'Gk(CE6pd_0< +$!dQ@9cSbBaZU3n'O1W; +b+]3gp!QFDU-Zu::&Y%[s(hE@jSsDsN4c\0^UXc%F7+Man@qWq[mS>Mf.^p1!rUg7 +K6i!ESDM=5PhA%-@jN"Y,skLSK&VmlrJE#cJ(Q%R3Q4:>#f)-4?Zr^3-&q\"M=>gD +LA5-!*]L#V_/E%"E:3GM#.G +G;['o]%]Ab\(/ac1"r[2h60fOaM+3MFu,[m9>ji8W%&F7W%S8Jq`Q.%B[C4D9*4ZD +`D.BCG9Ve[?#no3n\GA,%Xu2bg,S<8>ke%)Y;-%\6id7C7CF"-%J_JZgp]d +#Y*aWU8F[:`qA#1!<7S5(\7(Yr(eUbRC"f;PN%EaZMJh!mT[%L3+[%l`Q]JT@n`-1=1<^X2P#g%BeXn9ir6Ib;&XfJ($H +e:!]`Ii(+^4ecsHied'r"/b/lDj0ig.cYe$L>"&0s.X= +/$&/72\K5Q:i`GB^"T+n5M>T72#U_r752Whu>$kh=K'r-ue;(@[r\!1G5di6q#4j0L.la8;".9ii]l-p]DR\r70Boi%%#6OjT +=LTs3mYT8573J.U5qKgMAV7c%L]r=!=e*n'0EbcDBZ]#bT)-=s6%S>;]Peo +JNo5<_a"/!FV7(ni:TP"ogK/Es(^hG5'B+/3T,2;2dQ0;kABUjG1%l_U@=f2-mi!q +rgB-9)3t9o6%o8G"EC%bk*8D!BRr81PXHKI$\2D'i_^tRCRN6jg%*Y:*d7s[IRuc( +RP(&;bEi+`r,UK3$]%0AR:FB +[b8bGEnQ-HJ#Mi&-8(B%j>foX\H"j)tWtgkl7UCqmIg?""16R`GP"jV>keA46K'!7H!M+\(3SA%Z(=XU>7pW:^0Di3Y71/HC@Z +TNd's#iKVZ+p%^\-5'W\&,HmqT`IoKU&Kpjq3IX'=D5KB'kkq_`ZTO^a[/1\^ +]!JKkHNZAkGcX&5e=S;/)rPR6*BL>l[eJ\p?HW41%hb`uam^SLqn7(_?pEjf#-e#S +Ra4LsHJVi@4"^Lt&blm5;p[r<$U?'&k7[dW1&jm4_0uRMI,"8QOBiTBXsRH? +C!UDB\"3,.(BW?Fi!rXu)_&E%r6N<*n+4;Y4ffDo)WfFc_n#hbd]o9_:N4tm\Qs67o0A72t4))#1IED>8m*-KGOXho6- +ZX-2$1(dYM/56>fM1F[$JH#q:2"$Zk-h'?:(ZE'2icm_V%W>l&S&N<`4aku.SojRm +@G*?6R=YB>D$TS18^@eB-NX[#2$q$fc3,bM"s6Qf+Q3:M`.dftj6?]e%oda\g#`@c +"7VpGn]^[uf)=[L"`M:j@Cqn1VIS)"BG_3NK:]O+f!H@9c,N>MIU&opb$iB@ig9ltPj6-8jlq!?WMt9gq+n37&q-VCicmnN*s6DZK#l*<" +WrW,anm3B>o+"EnEEP`Is',JH[QqY.X6(bmZF*9(!7G.ek@KXC$r!Ic(7.so@R?07 +E\h-A,/fN;fjPsQk[sW1FA`JHkH.2\()=qRq[bs[ZpB.Q5RA!D0o6(XWdkAi&4=XW +?ieM/g(Di[$Gd!o"VDTfTHjP4C5R"2hQP#4-#'8*6fcRNC[f"b,l+Au'+uR<*,q2] +r/EP&Sn:0])GV]rH/QGLD\;aTcT2$A(BFH3;[W"9hE3m8CSK,"C=sIIo\pAXW-dQR +bP[c[$rA?/HP$P1I=?q&8,%7B/iUc6=pDNC'I'`MlLP#UT`bAp1SR&KG\G+C"TeYp +pKKn,Mnej0!!7YeIo+k@90'Kg%"D*lb4V7VK`BUZL'a5m9KbP7OSfXe5M2ghj$.)Z +IiSHKNmPFPob#@H+PdnKK_U%OACN@'2@4=']%+_!rnm#C+U`h-:Z1]Zq;6Ocs5Aa+ +"L-*R5W#7$7egmZU[)^C-+6'Z"4+(3R^G8a%g)8R>uqIY^f(QBMO!X +Il"eC"o*#FMLb_E4-3h7[RrYo.1!cI,UEe$jC+N5Am\+jf$^^\N-dAHh8oCMF8i:H +?kY!!Pn.`0@ln'!F8hMI8$sP0n;kU^R&9U=rriikSd*%R?`Q/L7 +5'13-RkEI,C#a;353`o-S,'0iB"a^>ai+qos&97("hYHqI;_QYO8'5]QT47A!rnBf +P%6hC$*OC0bOOCXlEHI4l/aasP$qNO?T)`P/]UT?q#p8(nM +i'5?`F6q3d5(S+*-NXfQ#,T73d0k>[IEX>f#'""K9^iB3o4.nDD?o^Hdo_11c1t^;9@=,<+q"5a ++oZgVDAV2=kI=5;\!c20d_,Ef^OFS6II'm^m5k0f]^phhrR626`uFT1D<))oK).=a?B]auM]Em">Lk5BHS/AJ;9af-9@4_>g4S8@57!e]^e4Z>(XqAOR-dE[#Ld9RGF.(. +B^<&@mD7^`ofS.mDpo%ZE;/p_Ygqer8VRs6m,A/+S]0ZDNb2+f_:b$ +DPPQo&Gj3E9X9IW&[SJMp=5s[-1,$^Gb?$Y:OC^A^@dG7,9,9/LUY&#Z?SGWiIAP: +Jaa3>8!E%\FqjpG^?=Oc)uf=$+"-PJ\qiZIIl._M(de.D4r`.Hp2.9EdrjDahDcNW +:\s2OG(.&cfr1]I$Sb(&,0PWbko^0oYfe8EB@8"/-/9\2ISe6;!rb^V!iQ00/ns%C +ap(r=iQXu2\!]Y^+658rU39Eh>h#lW:&AeVnYG9XmC9t95gOEV5[<6&r!rf-nb&-V +$T-nYo5Cl6(Q//.rjTA>3WC`bXOF/:n:0*B@K+T.9,uQaZ_=/U_EL!.M[t)MV%]>t +p]e5.g@LALm"bL2Y=ml^$/hEY`-rgn#[YaNn&F\"F8jKeGQH_&I%9feq6l4`k,1O$ +U3'L4\n\1KLAPdO.(.Dt'ZL2F)#f+t=HngOZ8#3".0ZGHEme,Wg8rBM2.a7jm'g"" +mF>WX%5d@QO*_i8":G2kkd>lTs)MG798^MQ&lE'g/.Mp(!M>JC+-e_gVHq6HT2KLj +-0r[)C&_uIcGPjR0D6*PX[t]WLd.1t5*a8SQ`@c!Y!:XnHZX56W'7%l%1JGcD0L$V +?G>;M!*b$6+r,mj86SR,MCEfsV5U8VQ)q9W^*Wm#gV1oPNM_OYr8P_oW,!08_u'j)`dH4"d6Oq/eIP.6Z.Y9KiUal +%N-eN#&gsNr"n`9b5?o,d+.;eJm%"u!4BWd]b;X38%G9ZN)N@k4V`I$6TC3+KGV*f)bl+ +]Ss(U#o3Nu!q8DfjFII7s5t/:[h4j3o'cq_o.Jl^q%NPDD-VU@d"JP4p?L=K4j0^6 +=u8pJRSFWJeVDiR)ikPJF8/#P2q\e@A[VtIjuR-n952CKL#O4 +$fDPf&]PiC\3gt:$_oT\=9'c;QHf1H>cU=+s1@OU@9,06S4uVebF7\,DS'W86+9Q9 +kbda9eH0tUJ?/pI(=7=P#VM?57#=pLHd&6d!bnS#)5E> +fB\rL>+0>-e#o<"X%-^[BU'!sc@`guk#4?4kq,#u@3Z46&7(-I=o!3-H$0jf +#[RW21&oqu-!Ja"M0O],r.OcG@OS*=:fY?(/_KAoWJI(GXX(fIq0Roq@8Sd*"=8X$ +&A1P(`0mPXQOjq]P&aT$J[ARE@K+Gs9biE_b,DpEi'6IE&dn\$J@a[!s/>r.r6M:7 +L_-Fn,4Lh18/1\(]l'FbNkR0N!4.]"da6@hjM>?NcGK,6f/njC2Io$QME[;^5*^pg +Q-$d;X?9I!/-,\\O-__:FM36B[W!6^J^4_=ROB)?-6i"s>`hg^MCBjMP#>[VFMN@\67BP!H^s8@NNpckn+i/`Nn57uj=dF6t/D/U3n7W@&:]]a1%\(<"p[8C3e +W%,A).1,)./@Y[%aBV8TF&?g9`(C59J@1K.*cP$U%]\8LR3./-#H#S1.C+XKY6Z?h +^l&8ULB6X9&[6iR5^;3LYlc3F9I:1_"YUbOi'YZV].ia0)j\O]E1,p#=qMf[8k#>p1Wpa+-Jk:*\%UQs3XrHdpr7-$+`*. +eo+&FGKLk")9+JD8P?r:5XcGrU>E?ZVj$([Tk,[6Mrf)fi:t ++HKgfZUqf1M9dC9R`,:,!'H6-,2dsh.#F@'EJo5F9#A&\TDt/b +3_n5)kQ_PQRIF"\d$%\6rU)T6Q$JG7> +Z&A,I/=lr^bB+m+ZV^G3K7=`!!W">.YOTdoVr(fgqK(kqI +`Fa$:`o6mU>XS_;L4pap;2@f$#uN-#Y,'%ES@DFX[S!i#7FnT`#7]4nZSLdJ:4$d* +m`'Nj'*Ku.4]Df>2>!?< +3klNpjru?qJV9X:o26fN[,U=m:crCn$l/5g`ti&o3%X7r_7\G2jT)eUfY\2G:dkrg +To&h0:R(@TOaN[d#;qP"SIkRE2MT7=6c7K61c0+gNFdap^BEUVW0bl="ik;=GG[Ig +P@:'P2NnU[VQcKFP(0oAs)(mc"SEkP+-W=-rql0q7":m,r1?si!SUcWqe6'Q/a0*f +I<<@+G^p/G/s,dZ"n6LV85SgG$\\O$6,CeNrWE'SG';$R-h,1N`H/mcN_b]g\8e(E +*2dTmrY]tD5@&\.-2\"mq`fG;o7NJrHY@1CiBM)VA,\jp-UKGYTnY.cM8"?-R/J4H.g7?4<.f2./@A`SK&3N!#FI/6V"^M(6R@1qDM^^*hC6O't^kO +j8p7X]TgLtOHHeRkSc"m9O>KCJngr-.ZQi",Zr&q2S-5OZ.S[&qqs'.!TL +<%4lZE\\01Hnf&YZcs$[:9$(`8N,H*p$-E"mnb3E)ec$f;q@?s6D]u"@t30c2p8? +PJGGqIm*@.N'%n$(D>m1jgbiD8i4!Wg_W;ZTm>CJOT-C%9u)6,!JXn9TVEmPjmWGB +a3E%0UPR4E!WV+==!N2kbO/@c>G]h=._ZLUX@@faOB3$5bIe<.r[5Ma3N[*/KR^9f +'>`QZ,-;p7gEG2SV!$`nkG)\;(Kd]"J +8j+:6tT*Y$u!IiD9o=K9cLBu%/Z[i;=lL^HiZqK*.=PR4g>*CV@8/DtL +FG6G_ns)iCp%l\gXmP5&UW!lU/ee5bNu4hkF%!q87jEX_$#i5_Wu3%t?2hUbJ##1*47&ol1ZuO!_Z?G\^r$BU +]0'?V5KMsFJNWF_ho1:!(fCp.PE1CBpk\F*CbZ';O&=moLqS*`\:Ea9l9:L.h+Al` +9+F9)TX\V)@g/FoTNr>A&]qpkEQB=2R=o!),!YRh=?t@]M5"=<1i/Go46QN;#<0!J +m6V5#FPJF=OmkSQgE?EhRf\&[s7te!FR0BZrnkA*re+VOI8ASjS#6"]Y.pp+%SOjU +_L=-InD@t-enS&^.AA5DB)GGN;#!PI3(":5r_C!hHX[!UIsAhck`]$JW<2'3EQY$V +$NU0-_jep7?8m$]9UuTu-_m3#=MSLeGZcb.<@ug&gJn[t!nT"OkQY;MDI:aJ](49r +3Uf]I/hG%bA=nm`k@<9B`.DR7Qs)b!LB;(1_>UeQ&IJJjs5Uh%e2%THL/D/:BV(AK +e2l\)1/AF2&'t,f(AI.jh.h*pT@qI7\'UjgBS@FRp:J7,-T_1e[W=SAT%D*W]5cTG +-]Gm6>>U4!YK4\End0RbM6L>^U'F0d!#ah%*4mN"^AS6Y( +Tq\V=WN5UO'cFRs@sr36B:H3A7mGQUSS;e-'AI9^cGI>'"P!Y7ImfHY8^[oJ-7R3: +A@]'0Q][D"&=0&Z<)ce:oM)1DD/96gJ!0ip(3!8Z\ZW'keCU;#2ICQM^)?:P*q$]Z +m=.&Tr-!D]h>,I-Q\XI(*PK!EI!p;0c,K[?aj0MJk0r;cD1D5U[rU"r?F8eBL3-N6 +K+#$n]NUb&:,)8o7OCf'#*tta2R*61"G!`W>;R_V9X@qHs3i-?j)%*sZ9]2LagX#f +2Q#)d%WGhWnEH&+Jb^o3)QaOoLR_//4Jl$a\Tl`%7a6=Dr!E2f_]Sp*,.Xc%XC!14 +#Mj=kcSIdliMFlt4FnU_F`,aa!B`kCG:4Xn$!9I2JcrkZr7;==YR?+Xi!tnma=`C\P]?.An37T? +!rge,-YRX]0C*&RLG$TFd39cp%pd+.r8g#?lUOlGR@'$8:Z`2#;.=A"X>p8]U(ZjJYU0gn0+Sdrt +`\#`JZ[1#'^D^otD-mftk5:"\"9/VnFh@jM_Yco>a&#Cd9ele""UadpIU:Zbrlmg` +CGg**3k#$PI<*CkfO=,`ZF3dORk'G?-#H?W7^0P=%f^h=-O23q)+AIO>-&^AKC&f1QC'E143DnYH)I60Umnq2C3If.[iOCUXCV"Q0@[Wj#di2fbE\P#[IgF(&67`4iPXKNZ0ARg$3^ +bsi%$+J<(r5RnuK-9%sKG@NZB'Y>EWag10X*)=s3\qJ%qSjiL^j!DV5_G%K&1Q23e +Mt9t6?K@[5`X\9N4SFu1%t$r42fj/0lONo#1&(?Y_uUF@fDP2q,s +"QM$EiBK(!/7JX9r"0\MIZXV53!_;%r""'e5p%V97Fo;+s24so*crh>RJ).Ar:83P +Ik(oJO-787L#L@nn>?BgD/,qNNB7)c[.6j7nDE,K4R`1]$^eh]hZ"bs50Ct)s1Q*@8";WInbXC%FeU4#49OZ.%8c1rHjE'Xeg-ts?lm-#4Q5l\ +]---uj?<'sDm^53W^V*"Z,9W?W1,p7V:>INAsCh?ntp-;HsX0cPcU(Cq4_?1X?2Q5 +Y3WOZVW5F+q^sq$Bu^Z$FW@0ZIF,Co]#K3FeF+7ZIJn+m!0)aF-H&Q(_A0)U3`]a&W4=gkg:%IRq73Tl&, +$6T?nMk"k63=-6`LnL956`91?R@\fOH/F[.f@h2C`cBDT]i@j*f[K6UR^SjG>&1&* +EZV7TG\>T5:9GV5fARC`*@WlMDnH3N/#8tJ"fb]`jac-/"rsG)JSKK736\UWH=?WZ +\8kh`29MuE$6.2ba8SorT/X9HXmPH*c:sc=T3';)X(*2u6:V$X!Ak)/.GuMrH.G9A +T.r^&CgZnI0\o$`m!LPt!Wc]O8943oMH_st`@STB7adbLHZb0FAt +`5a#&P/6[u+4gSlc4R5hO3lU?6P':j>aSiUa2HIW?l2b$Fr=A]`qP^-GScbL;=0A3 +ah^rdVZk]d&(CLE.e,3cQ2io6f1=c!-3'g(I]&IE"8%I7UU&dQ)78T3Xni(6Bc;): +De!a0p>cbE\LlF;a#!#PNDf-KrKBJp0GOjf:jh4./GS7h'RsT7(SC?>-@52Ma'I(I +B4TL,#0%NA9gK?b#l0i>UEg#a8a>j6U#9W-ig:51Vs#@d5Rbea4QeRhX$NA,RP+@r +airYFS@7fZ=VOe(l*sJDTok:dr8kPc'#Cf>5:"r#'Q+E`!o=L8ofird-+bCbh'&b2 +Qk]QkBC+MYr'b9%kZ*fHU]@r_D&b7o`ls/D$_I,4__%GQ.>q])Hqr@"1NrMobrt1X +cG1f8pImY31XHV.4J$g2!V;+WY'Z7Od:]?^?'dZc<4!/Y"8oZq(\;TUSh2)Efo11, +6f.L/LBE6>KFmf!0c)q:>_NjtfiSddi.(dYrl9.irM!N*i%ciMd,@mT']Wj*lk^\Jl&^UeSL,S#lG1=PV8%3G1J'>5!k"kgi;h65E +s'0)gnNV"W#Q3K4l]U3HB"ODd^^l:k%s)MO/^FGYhm9As*9GiGr7Z.Adk%W0b3X:_ +%Eo>TLU-re^'Wr:B_&,"DbgK9NI[M\c5Zd*Qe7(IeOk"QqS/D"ai@F;d?S5JpDQK5 +F$:E4]X)eQZrr06XJ"@#5Hp[afH([r#(^(Z+T0pJK9fb"XY\1ib]>[(?N'0`X:k?4 +K)?Mda$T,\KTeaTPg3eJ(W9C]_3I?#[1m3n`7>FYCIcLS!O?)$jF;Q=5m1","dgG-GfG4riBB+B +!n_-cN.>)\[[`e<#Y9^u+TeCpOTjWaDUhU\BT4amjd-WGIA7 +OUR)cpaCti1a!A>aV%5H#8*@a.^H&),XWhh1`]r!/m7Y\:iM +SU:.2q*"FKO+!h9[rV]MO"7Qn&aKB]?p#9r#R-;tGaoD&:'>'j_8K;$3=Q+Sdkh+C +BEYhTj6jujQO+#?hb+^jkYBM*Zk@n-K).^iScJQg+ib9^?hNg!n8=d*=f.R;Io&?3 +o(Qgq)?5?eXbo]VI*r#c(QBkf7mR(KgIX(-o&&7ET]W0CBBjsHWXJSbf":P:ht`m6 +5d13Ig/0s?7SX(*b``S=\@m[mT+:e$Y"?u(j*sPt!6Cf&5P4X@c7ZE%H^WZ6Zf8;D +qoq*s#oJb_IjaX<:AVF55$m$Z(%[!]2krQ3beFX[pr1DWs2Wrd#RK0d+9J2>#aeaY +j,-@AjO2K:!%'SFWV5hW=, +d2C>/;%>#TNBeZ/-i8KR;B\djaA)k=j8S/9Ii6J&%PEsI4(%&EpU>\K!>%FkbAA6\ +2h;mX`!e)r;sM>]HBH)FWb6#3KD*o$jc+FpZ[K'(;Iq).CSs&8H%"`4Gk7Z?Fk,V[ +T56er'nli0"!raicQ:iYhP>t;X(?-n?GD=Bh +iEPM^"L:e_)iL.6ple-jCFDS\oT(SSsNWd&Rn]&s)kgdf"[@UXQG/f!ZXV\&-:,Z1t.fn-b0]U5:QU-%nFL'QKZ5C +jO9NMPl6K3Dj2CE5MY]*nQtn/Hh^SHTZfKT@/IWVVf.o_Dp[siQ^p=f2M/+@$ZL#Kofqm3;=kb" +qWWoD+FgGXgu1^Un0'a[GTE>B=EK7`biI1LP`GZ/P8th\'TdemNq*^YAq0l^WW*6\pB!+7JLNW6\0S7MJ$$fn4>^N!D8Ti*2-:efb)3s22$jYJXID +M#Wh+=TG@3cD@(UkiSE?idYVrXB>Ki6]hXjkMtPoG-=qGiITmTM4XOSDLEu5Hg?1$ +s"=L'rh#36O*0(!JX%#Nc&DQKZ!33)Qc!$,rcoSIlWHroeTjA#I*40`osDjQ=Ah&TH8U642(-kk#$K*A6Y=i8R:S?IPEE[B0ORZ_F0C +!51WD,:]R6MTP7%F9T0&r=,_!62M@Xr:0b5W]n1H>hE^( +2im^bJOXA6CY"sXE'DhOahcPBQ$[\q4$?h1"7724KDC)A`n".RHem[9k'o?,!q>:m +IX'#MBlCmr6i@NI"-.nhXD2q?+9O's;GNE3\Oe^WCI<-=!XfUt@M%fH>N\EiL]F1_ +]7A*lBr#Ah9e_W;Kp2I(;#r>7:>t`#O'kB!pt)eHk"RbDq;-'#?HhRpu@s ++APIP=&N??NIXoo?&l!Q"On'Sj2>+W"YIOd=TOG1nGd!HQhpaR3DP$P\sA!EJR@l1 ++TFYhm/?XV"Sr)j=n1)[)qL*GPqInul\qG^/ +h"6&9)Bp:=RY^c/K5Ndc!%OlFf;SN[o'^,;n&WJq"!Slos#^'N/W\Z4--lp:P/lZ5 +gKT(fh"Leu$P@@TG'X$!INNY4EmXltc_h<*H&;Gjffqmdmkj#q??bT/SPa_2MJg9s +8AX0er=@TmLSlP"ro#8fIujV^l"M9%RKEE/8VZ+A$B`kimN*O$Yk-2XJ$*^AqB)%( +aA+,ZR![1@jYp!19]LT^36:!P*=)1go:bIkqi!(R%`F +rf?cp,@FDMn9TDOaLk(GiMMS7A\Z +gap%FMD!c"Hb8@r.JX.':K[=K.fi4!]N:"'&uq_&\s?59V):e5?VB^b3W26E=3@Oo +@WnrB<>>%OV;bgX]Q[1L5Qi(We.;Y?]"3S'!BS7#'ZU'ao"R@Gh4C(I=Fb8rFi>0t'=]7?Iq*pWs2U%' +"B'b<5kr)qK6F$4HPW!]Ul"Lo?A" +mQO6f=V(U:5J%J1gCLDQ"B;/+&5Z/BRb>rl4:h@>G:9-`s*-"?rg-O_s3d%EP03fC +07/1u]E!"D`kM^[uHZRg@@gHiOCRi +OI7OE-F/bj6i^EkT7,4'Jbjj]YO0r?qP!\N9&Armh?a>[HmFdIh<%`[YeKXfZi8e7 +g,fXSmD"12olo3apY:aP]_-L')]/TBl@3676JUHIrqH6u=SWI]nokp?>kn$8Yh)A+ +5N6mH#2CX,J8["&+"%4V7)13u!hmt#,oiM46mb:KnSi:G#fS1/3;c(ZWTd5kLAE!^ +c_LQjs1P`]VAB74qn"qDK&Og:BED?G!<1A0:WNKaid[R0T.L/Ds1KP)4ii,3mdgJH +>8?1K76ZHk^MM[NJ]`IA-Q7Ws?RZhgrYP#3')<'s6u`GU?i\DH!WRfMl%O'JfPciN +al]5!rVqSC]g1XT0\m3qVUe*^!1nXZklo6:+^&to5RC3cFT^;jhUr`K*e +)c(P?7T*EJmN.%jbJDGO5KZ4R?Hp&`;#GtGP@XGUjM0&%gLZnMo'c7$_D"ads$sp* +\uD'7(4MW+/S6Q8S;j)GYNHoF"Xb*0N<#(7!.pq`\)`lV6IKmVKLPO.l`\9<0eWnj"8rLXIta4.;-3Qe7L/Ol'uH^ilu'8 +1[6tQEma]ZX_*t/Kftau704@ki&h6IB/hp(TRcM>F0YS:"j-*a4@(E%d=13HWH:Nj1VHCJ(='+;PZGum(ZhA:-oA/Q_G?aCjJc>o/!N9qU +47B0KQ+5@W!9LDXQ2dLO2oNep@i^-anN05BSro[i1doP0"Qs:2:Wsn!%>Dj>O`:pr +1\61'+3YfMk3nD#VKCoa%KoZC!.=;_`dZhF1]dr)24=:_,JZ8"pJ+Wdqmue$>:4ib +$$)mB\6Co[e;W/(-;WCQPZ]mOR&"5JADA:oq30ffFH;L#+3DfaG^Gh#TDG1B5>KN- +"*E5*F6#IhKHr)>WW=uXd!>4%WQrSP1VB6[r\gVCikk15f`n2 +in&U"a?J_*NY?H4W`St&tg.gXf+95C[&8L +HJX,N*e-Irj2's20QXn^?rH@0^HQ5TJ-=TO73cRH*_bIX>P9 +C76dppak-1>t9*u[]2r_!qPBWXB++>/-r;1SSEbIDn%es=CON7aI4Wrr$M?W=h+.DCIZ*e->(E0g4t-E(b*<7hbBEdW,QfNA +*u+`Eomg3"Ps9P7Qce3$_[T.&pDEQfBKlWr4ork'28A1$fa_mF^^/kZLj"N0s8/bg`POo5BA3rZ5N@6T^IF66s-X.;j*s0* +7[d7D3=6>u[>IFjhn&cZGuZEp0dd,@cqU,tFl?8a?99e5m$b+JJ/WU#%aqObq1 +Y3s5>hhm+'s36c0MZ:R*ruf*/q_h)RcG!pCmpU^&!!b#g?\r!R@[>!3H(b>9J70Tj +L`7-Jo; +"e]sLrhh*?p]pUZ>reLZS4j($(CCf\&*H[p7)2OOHJPkl06#`$>`aR?-T*d;0@W+G +*LA'B-"1XtE)bIR.e71iV&rP`XoL#jQ9-222h?/pZ!dgaAP()9Xb+X>]Y?U?>T^."?;>roQR:`[bu-X +#CUBM+?l+reUB9bOb%6p\sXk:R4&k):l9-Z6_!-`<@$MUn@R9S?4IP=E!"kOd8A4> +SH;([jFcgta;VJe$-mO&X'OAg/9+5h^jeH^]X3>6:W;3u8>$.]_i5*&:Q,7&4Hmqf +U[l0,^\Ij/I'881!$D@Bq*FkDB@3?DTEX9QE4,N#I-nJh^->r75$Vcdk3DcAEb_<[ +)hSnKl5fEKL[:l="3uDm'QSRPSd^*fi/a(oocXfXONm4^b.eJ$6T_Ndedq>l&J/(N +T^im,#%Y@7C%8C[lP0A2m=83gD`8(c9uDqfI?%`L4Wo.SStVg$R/0#e66]hpIj@&U +0Z$?Ca!\XmIqfT%,pr[rn2#H_!b<$*55rS%rn%>bLuKc0@!IhX*1DKc!<;pW/\j2+ +k3P"$s.-_U]6_]$*4,!kS)k;qq4pkKArqrQ7/eE-q5X\:@".U[684#/s.'`NIoIm; +UCeX0^CpqN,bb=p4[o'C_5Bs^6uVrjaQ?9;4uN7fp-8AF3a`>gR8E4h<*F\+QO\W: +L4<-_s6]RmYf/g*XoJ?QOCpcD?&JECnS#[]L$nei1-UTm,ZitX<])$gs2Xo"`(i09 +!"RHT8dZbM]9M4g@p=ZNAhL`f$*HPsV#:"F@bB!6HL]fnn2t#%5lOjd%a0gS2@"Kn +9CSi((>MU("Jq(PJ@tT-:OO8Kcg)p6JErNg^?kpr5G,^Hq#g2;BR.Dn+FgKj/!d6A +q7NASikLnCeA?fPOB:sjQ+S%YJ"Y_'V>efPfP0Lu6iaRoi-u+1hmaLHk,5$Jo,5G4 +(;:V%;ktE6rr_3ZKPgfF/1-?,.2*(e!(bbp8_Z9;\)9-A#s1*5&u7\gN)tN?hZQB% +YbW+u!el^e+-_BTP@7$6YY,Nm"=0bSkr=NMN22i)P`,*bOrP^>VSlJb\f)cc\*Um) +VXj1)rp:s40Em!iCY-ah)h9T_Q07D[9mOBjd1j)TZ.q0qciT`f2B"ZH' ++3dT94IoCM)spSe;dQXr!0)N4rQbZIdhVr_61>D]j!K_8id*bK2_\pH3a8Dj'0&R(W^gB`d!oi2E`u>no"ZE +RoKB9pP.##jsNCs!+^`SC>?Lko!:-$FtU]cL=qgpk:jSPcZ'nXmB_5t7>5qaj51pd +T%[QLs3%PBf/psD+85^)[.fWJ]mmaG5lUfTE=_,+!WUUSJ1fbe+(bJ&(>r?ba+s&S +DReS2dM?6`p1W^g@%k+qH^(!P,q$$]M7A$DMK"o)Ll?igp(VpQEM!eDId)H&+0GR2 +q%&DV*IR$hqD["&5lSF@pH./Z!Okk7rE_&=PDKLKns9e^q30ff^nr3(arf^51_%%? +6QYPIa<)coY$pfaa?S`)#mJ0FUL!n\7\XD?fQ[WFIit&IAmkNY-ICbefDetKGF8.< +!V(0,*Uo0s#fJ*1'5;8<*1[R.0F1"=ktl=W#[Mrk;IB_,n$1h%"s1r%\`mSYVB*-\ +-KrF?#5JDp^Ks#(nlLa(/q,d!Em0Rdq-f+\F-;2.a$`GS*\s^"uaLc8AhY*!@ +^5uo5h;0D7]N.&gDs'=lAn_8DY>u8srZ@tBJ6G150auM`TJHbW:Km-a2TIX;$g-tQ +HbFKLml^8mfS_g8khWm.#\#t5ia.YWQ4r[$lMlM3:,Timq&cIGLk'N'>=rf#-T:Sd +NGOiC%X7WZ709tP3on2B12ctOF.&!C4A@FAR.E9Q]Zrt0OlN.;9UoJ88uVcZPqW,l +(4c2;olT="H<5R3s7]7^rNY[c7OnG$l(Y+&GJH);N+;(hG;]o[\`QW-@C19]Wpt.mfYt^k' +8U:+L^G$VZmGJc_aabf)(P]VN_KNl,'+aXI&HP?d8lWlhp[cgR;2Pr^2/=Jc\6t`=8N\N +24FPugH4Ald&@M?J$8H.??Q$^\P(8a^75Q2)?J2B5RVN5R6nN9)@i2YK4kVmri]o' +\/@[7ofm9oido(IG;8H]a5$1G8j!UD>_M"G@6ZghhF^1]aln%/^6qc;$OIlNj8V(\ +%o#R&,6;,l[h\CKqHW>m-cbUb"!.^%lbk<=67tAF'D"P)`.e="r*P8abH^`Dr*SBEg&:SILN6*PGXsQrXRrgRbos_[1)lQj9O`fFH;);+TLE)Ij>XDNJ^&AfSL2at1fI,PCBB0TE +](3n>^(_TT$D6,O4P@@Ho,IKMbSu[PI\gWZ?m:-t?Y:9c=oe%V5lL.p:O0W0eGfR< +I+SCVbRNs1)h!SC!RspA)1@)]u6qNcHCZNPcBS@1G( +j!];lGIMY=j'3";<[*)Ppu@Q2ik8k-GtDj[hQ3YN%^fq>qTB)G:>WDF%jt+c!M3%K +c_k)=r_WOM*]l[e=&nS*^@A:t-d06pj!Y]C#D)9"G7uBO2G3C[J@5H'B?1$d1'3%5 +!0Zhc?&G$d_#-dqElt`tm,U^kY)1o`h0)e;E[[a; +56&>%g6KopBq;u49t]u_ +o=5^)!3RRY!Iq[^r:[)aqm5:ScglS!b/+,Xo3(UuT9TB=Z\lUN!W;mbN(X0Fr*O?N +J%Xol3o>0rXZ\LC2mpVgdd1skWg]A-6mpF!M;Ai+C@Ai@nfG:=n+?-q\F"?IoDSMT +BA3raT.Km!cC_5`pUnc>G.?Gsm_"_hqnA#;kakSUiKMFAD&fA6#CP+]J:0E<*$rT( +E7d5RncqGZPZW/Ej<'FWcj5HHVi]t]DZk1C&*cn4&-4p5I^%t49>L&]NK6ur^\'f/ +#B^LdP:7'&!;o0$PGA-OH)J32)tSib;7s%*Rq +#QJR=PLTV)c.JV6PklJoGLm=KrSM;ihUMS`IqSk17/d1O5OnadIA[/h6hd_$4WsbN +TU$46!:pm"+6F+TbR8'ad>od_(B_qb;u6YQ$of5g$=LpckeW!Y#2R7'=)lkn`fc +!s:Vqk!Z:Tq!b,D$Ue8_+QDGp[\L!rLmrr#JH)>B:ITHCs-^BYqL:^W.MkJXq\"^8 +qOrj;5eE^NCT&mi>*/d/M#mNMjU^KdjA5^BGeJ54q0P<^HU$Ba5!AZi+7B7QDZ-+3 +\9?8b!r,2,8)RI$?h::o]526@*s%lhPe_Q3!Lt/t$:lT4UYV-F#g@dqqLb/SmLT(VEJJ8heW34q=CT`)?53]`rBs$T^.+,^[XO[18#j7nrP&b?H\BW +!b/4k6i`foNqnt@L]G!u+qe!P7^q=MB.h.VUj,-Z]tL$>G"QKJIM2+la@*Mbs'^@- +ZkEa^LO@j*pQjFA@CNGnCi$^peRiDR/1YTg7K@T4DDmK)Ckr0*:l;GXe(e,M]2dcU +"C)r)K.h%QT_ +m(H*J[ju\VfR=>C5kk2[F.h[qNc+`I04a4+#^H@q(;,ulqXuso]6u^#CXinUodG"P3NZfhMKC0nAJ8Xo'pcf?2:D3]J@jqA%@_1V"piIe40gCBg+6[P6n#HB] +C]87eJ)c#@;\m22K`](>^Mf#"5JB0=5==4'D,I?id\W9!rS+? +r9b'l&+[c=ld5[_qOkjhq2]p'jq?q"bZ)*]B +XVA_c!OW$O;,u=0;EtTireL@M>Q9?R]>_O;qZ"I($fq?P!T`_Hr"u)7"PimY&Kha\ +mRj_fINeKbn!Bb5^&jFB<,DbeJAg"+7ZoIC^1mkTC.L6G!s)ScrO":Zjsd.WF#> +/@p>=PZfXcUNs7\<2PYrF]O-c^Vs6&D:BQYLC +LkYWRrrMl&ho0Zh[qsV)Z[();=97c#(.8/ZOm'Tgi.QlV%]j(A6oQVfDDf,`aDF6H +S<^Q:X#i95*SLRB3YUJs5M+=jDBK!+^YMQ^H8#9LTCG.6 +rsW<=pqDW9=D0f6'9oY@>s/7b%!;Q#&i;*Sutg +.7>1eU-X+a1Wj&]+R8Mer_WMks3guYp`I:AhDLL=q_A&;%R'Lb)uh]js7`r%\/34G +_Y>3+L%q\IT6]JsY5H%&5c=T//O2*FD<)tXED?YdJ\2Ql&+o_5OP6E@OG^C)OVR@M +*jg,E\B1Kb+FbcLH5_5Zi*23Gfsm`-e5rK*JGT;U/8nORVakuabtZXmrkE7-._nEp +!Tkd#GMP+r;#F["/a$]o8Q"Bf.[uj>j+N@BqsKR*+8o!u5@rG-;"C^T'E;"p63)*. +eGj7K>Q:T0/(FUg$/`T!EW&drs(Cd%cR+B+RJKBEO +%?^ct`46V)Cr.QbJ'>Ng%.Y;9(QuZ6['5eJV6O,SM@N71_oclq:sq=dS^\BNP@(cJ +f-f;,1]@9+naXd"FD[^6hcO6'D:JS-n(jTW4J*_o_"UVj8oFjZ7H$aq!%XT_5o4K] +B"U;b5e[f:QYd2-^dVIa0G2Yd^Z<$V4`?32=q]bn,pM\^[m^ECE-&=3HRcTiiraMg +!d]BT3PbNJHndi+jo\C\?i9qhq(G1/YJe6Nf90J?^KcVf]#VYdKE&\KUu(eEIZd]e +01,kQ,C$1b,.J68koHF]jd1#i,_PXmnEGUZ&H5=6'>(6rDB^9` +"pJF"%eKh\Ij`QWgGBf"oXYciG1is$[N"arCcq3)B/(![$Z?_h>NOph/[Jc=#Uj]= +/%hq:cIpjWk!O44*arf6oqKAXh$:PnYoW[G4>EVd=$aPWeaU(Mo?URpbt'*8-Ys&B!I +s+DOV!i!`O^7G:VquO!J(As5;fQQT\YIX`&El-QK!O[jV<^DHPO;A#>5[h-.gr0k% +?>u!Y5996+A:$PYbGD\RWQfNo%9`bOs#:'(0+PdqgBkEs&.5MW_jj\B1Rj%^?NU#o +.%r4i`[J%M@hU_PY,bT!Z%a7 +62oC6+jC-$<0)B*dk90%i6a*+s*]3ZhoGiuq^id[:BYe;:BCKJr"FNF.O=5[s2"^\ +!\bB#$G2ROI^L^hWeujQde8h$oGFTJeQ#i&l[LTQQ2g0@*Bm'bn,E7KrVe5Gr9t[- +IXDI>-PHM6\"75G!H8BVUChHh@D4nn6pMP/9nCJ$'o`3^!lY#X78!jU^MHQH:1T]. +n]cpOp(Y&!PMVjen'<;q_rWN?GU5\tdG:]n&HZ;NXSG0B%+P;6!l4;as/Gpqs5B/2 +!:UEr^VjKI?4'*'KA`0X?R\YrR] +)E!Egh4iB.j>JZ@M#dQ:M#_EN[13df>hE_V[k=\nl_EkE`m/(0kMn#JmJ54rR/6j/ +GIr?O`"q8QYECQOaQV:>[g0_kDn."jT5QW;]NY>Wc@.oZI;Z/N2HF]+Qbi^"`J*@= +/G4K>3"bb@ph^+.dst$]?E\aSP^OnqU"dQaG@VlT*PLWec?qnV]A!E34s'B^Mst1g +XW6g-2lh_8g(C6+aJBjL(l!Gc0`Nga57k,]KH6g2-Y59s*Y!D!"UKC/_#Id&:[(>6 +/34Lli8c7H%=F:fFJ@Ce1]eNoGDPthJ+QtFj'gpA7'HXhO\&oIqL8S()XpF`('#S0 +p`Ej:2XS$AV4:g;t,5u$+VPsjoLKp=mFT:@_@W;epk5^u6bA'dmg +8-J.A;]#PX%__F's/X-SWY%8nU(P0l!VcG_WW0Zg\c;#Gk)jQNJ(1lNZEI[6h^h;: +5Z)X90>dRXE);'L+FJuqI"i"@O@aJUZ.6#WnWl1K!U/SLIMhQ+KnCpSr,Y1'KoE60 +rd=D8s/`B:3psEV5f6'1g`G4RO/u1UT2eR_qhA-X>>Gn-LNb7t*oh_uri=m-l@/fp +chP9=Ai'Fa$NV."$M^79+39h8Z6g&L5YAd`)hF61"VF#u+45MuIulnf^Jd/1eGkL- +IHECVrY1GYRK$[n%oE9RI=bFKT*Yhq;%_i-^*d^HRq>SB8SEpZJi;$i.\oo^Pf`4C(UPY/S^G&cf[OFh&1uKY?rsH-Z)#n*l*- +HPl-+0N4Woli/3bK@I&A;#`J3lh%?j>%&EqJD:O>66dTh?-IsfN>_g0ATTo +0"_*ILeef(kl3;/!;cEoeU+^`rLO.YFJV;dX99,#f)dAEXpKtUu)0A6BSp&>j(G9[*D +7OEZl1>VX'1qhrlJM5jT&&%[rC>YMJ"Fe\sUK%5a(q'NgeKC6p#RDcu6+5!_D"0?JGpWFC@MLWNO%"7T`:hj@"+MW!0ECMrDN.c^o[5bCVGc- +62i>kY1nR+p#(,O'V_"+=oeCT-N1;C2f#3$TL;2/&iD/sIp)YFEF)RNf!X+Ph/1teGAMZ*Rt:G]b?`A?HXJs#0V4U'-Uhl& +gH"X/k-+Wl#JMe$o*;uLpc!`/QW*IV;6UEN)aX'j(=NZL368h([4Pr@b7p*@.qBk9 +nI:^NhDqR5aW#hU&NBY`J&uDqa<(ISBDd6Zra[6SYHht\0>`i7I?Q)lr\_m +<8P(6GNZPm9>feTnbEA5_#/4gTmXAZ!?WDRT:amM!C&^DIs_Q1"FLK)rt>8-*;K0e +s7kd[?LL$1GOFWu)t8)hH+5We?C>[`NAm29i;1:jT`7gI+Te-8X+;A"0Hu&tuJFIS+\l))%iN3nV*rO"^ +C,lk0Y=6Tib3<2`\=AkNP-Y%>1`r&p,Ed.>Opm-ZrnWZ?i3dRlL,G`@=f5BKb3'(P +#3DR^]Atg,H`;JK$?Q;?mi"U0IV=uf#HMLgS,7F:hK]RV1-Dphc_oO$kM+m$mJM&X +puQ,^[sQM0*lNQA(IJc3Fq6gUh*/U1mJM":rUVVDq>P?@q>"Lkj4X9aPP+)cqk:`E +='N3r@%EXMgA/:SoQ2rF"o_:&`oHJ!YdE";ACD&+eU>$BpWrsi,l`p1r*L!9cj5I& +mmMOCp^$]aG2\5GPJTMoUn??*DcZVeFL]F7ZlcN2'(_1$Y6dU%,>n1`^-:eTAO"!m +!JGlb&`4uJooI&nj$4TQOjFn@ro"/+*1Vt@VP7MSV%7s="b]]]et8<1I.:oXI+At# +Tsu=WGhVnm'nLA97u6RCV*F"$F`9jJ!,m,)':SOr-9U,k[qD4#JC?5jZ]&&3ULs+b +d4hTP%;RhR)WdWP]cnpZFCJ0J&)A"g%F +;Q>K%RSg2)gn9F0G2-Vu!:VaV_h>ugBeiGO$o:BO["/>\F9-J!e@R=5n^6%fYJ`8K +9Mqh*r-/tWMLUn2=CWDgc2[Jlk40TJYfh`U^W=Ya:kp\,rJNq>#EUhQK!9G"#^I2< +mY16Wfi_#Z&^W_'[6W.#%XIRDEDZd+4/r7(W;lJb2=Q)FcCt5mDuou+csR!dB;"__ +"r7:!j]IJ*8o/+'>hi8?`l8&5LVs)HH:\PEDcPn3LFS75Rc_2Y]/eIi[?-7^^^>-Ik#s5s(YpTr*SurpI;q;s3h]kl@1,^^@ctBcg(1Q +=?T*nrm^su7l0J]/l6qMV4a4[rl6tcD&`Q:&"hd0!9>6-D_h;^q>5Jn5@=>Ls0neJ +.bPj-s*@g5jaUI#SMq6ZK\r;7W;iKm9oT!Wn#Se+s7T6L/g^W*61@*(rVtimrHdo6 +IaA&8\,M/4mNjUf9j;mq]mpaV:]5ck.L5e,>ppetP`Hj\CHgNf5Mk]ihQ)2f3q2As'[Z/q./k+a?Q=!Zs.TE>rbn)]^@Hc):&SEo +Xl-#e3!Ec""@Q:r0ig$J.;(T=r8IDD;-lq),(LeEr*P7OE`$Nt/1(93;ubVElo4nK +N-fVHc%i4%Is5MZ\GGf'c8\]*Ag5M^9Ernh(#I(i\fq7iN&]sQ?3O'23Ib?4[D +IiEjC's8+6>.q3+/Ai0=be$;!K1R*T^&EeYUBB&\Hj,T#namRJEt)A7Cq5, +'DFf'X&elA6bZUgTYibM0m2P!ZB'\[UJUP'KE1S@rWfD% +B`p-h&&r74Y5G32YpiJ]"1&P(bC0fc"l=n6rL`9U!BpE(,Q8d_rjUWOWW,\iYPbSg +pOW5W;Z-P_p5T)$;HY+:?`Fs=JH,An_]XGoH:4MKU]0`'h_YZ%\!Y/9oRAe$YSWsb +TW_:EnNZFdqV(sGr2WO:htitf+"Dcqq;:64i&CW_k+;lDrW1XK79pCn+"9`*+NG23 +#=RYGOq`iaFaLO;0,Jots4hoQbG"or"IDK)kV)'"hH?Hej?E`p7j,#Q%^3f[D!M$e +MMG2LD?p)H/IIR4Ym#Z-"M(:6H!XKV<]*s6g8dU>9iXtqp!m?4[-`:+Ii[UBO<-lE +Q/GEVc`?oOhtXrF!b_p;s!)CsnGh,?V"gR1j+"gUd]8r1l/i#]E=q7R[^%-d2>jh& +BEV0-1\H7Q7I]j\^25q,!Vtnf,.dPBMgph<3O91cY801J^>82cb`b]5*?*RKDCC +s72uGs!oT![Z[""MLXaT\I.DIJ#Rb,ei\*:s62iLq9e^-;>^T3e_^[OMG5aIi677-3=j!j^hCnUHq*s2AC_he1bkj+!&):*Z7Yb@aMk +=UVbGf4CKF=r'H5`Ir"Mj'0V/mH1_J+"`R@Q?3:0(g; +`;_(?s0-Q(?lsNZL[54mSBIiPJ-\unh^PE#H]gRH(s`@nALkd++"RZ."8V7^"8"<$ +pq,JQoiWD-`i/g1Y47ll/FFO>Hf+T?,9Ytb&,VJqq#f"eAMQlJcbS?9:N'qIs5Ud% +;"bRors/RJf)itJYq]=%'Q?Q4H\10ks-!ZhM#Sh`%tsbunYLL&s-V7iMZ1)F=Y-?3 +J,PI04.oR_5m0IO:]2r5%WiRtj=cc-aQ.srIq3HtO=LQ5rgFFtr)*Ii;4XCZr.Fq; +,tIP0`GCtIBEX^6&b%+N[-F4g:eqYBHMt%TN7'4AXY.9[_N>>s4+Zo@t(]dE8JIjs!$s8+2(O"Vj& +&'oP%K7K`tiN![Vf(8*TUo,5@jNmW$bsal.B02pah^65_*^,/LVZ*cc3(Nl0s&u"" +c*G.bQ#6s0&O;tFfh\oQrt"\UK-IM1^J4V:k25Qc!+u4/N(XOU)>HE0Pbe5?\5,Nk +mi_V]mk)rn@/Oq>9Uf#1R@"PdPb;dmm#r(FU:P>MgN[ON +]sN&,::MAh"\uOXT?b")T5P<"5G)dX_,&=:$bgKOA!?T<=CL9?=e7k4T0FdK2_rk3 +s2FJPej#Vm@[/!TN^=-31ni.<=r[\0Q$k\^T3?e3TT]$uAafA(n"J;9h.cQe5lQM@ +r8I)Gq*Taaq.\qdje)%%&cWB^]d#6RA[G\5:Ct85s(!B/dEt.'o.(ND%Yn[X-Zd&m +Ijd$E#pa0Jq_,H"[(?H+5G8IXo'`D6#eKRsgs!\+_(g.APdCFci.%)7eF"0Y>"=DK +LUDj;[<=g5*q$H:!t'=g68lnQ!,2D7r/(G>rX.0ep`G:_\e-EA]b0@E0dB`BUofR* +12AVjckJ1_#U'+Z;?4ic<=u*Mn&J,I^ +"G?mHbKblp$Xo;"E]h?6`]9IJ7No0>9QNj@*`MtYQR1R>kV"%[W;k2EC1mX`s&Tpe +H.?2A>#9eMO#),Zr)]Yai=@R?qKP!nB-?eql@7Lhi*?n#2JA]`rU3p`rhg?iYqGbF +Iu-W[YQ(]Nf+t ++6Ma\Jp`O'aIh>#?VG=$1)nd1<\;WZ0($"UKVp]t`N]hdn(SN+rL)g<6MGk=!+)gf +Y;`;\Qk"oC=**V_3:BZdZ6Y#5\^3ilF +aT%tkG>afFj^rlD?eo=EOKgc$Mt^K*jO@BpF+8^%VMSdAcuY +r'juT)+XJfh;i#MptL.-5%>^bidWBULD.DL\A,p__LLnO8]Lf*g7s-Q(n@>_8,3Cf +^@cuCqS2n7jL5`jn,*\U,9m3a%c+r&b*QY4lURWs)%IVc]H9eSN,VNd'mjSJ)dqR>-4oXo:.M.HLY:KXhcH],>#aN0@1e&R+[ooUW +G3bC12Joe[`T*$]`;`cNgB)p*))U%rPeUh#aFBq*$aaajr/\`;ndmJjs8I;YIf\c` +rg-ra#@+b*nNX/Sc1DLdm\?d?R+I23hFArWi8J.E>kjj+!_)Q9YSCEQhsbc&G]D=rWc%ZoRAMf"QUR/6id!(aI8I[Z/:TA +nbh!:>l-V^pHo=]SHAWaNUoI-@ar\\45"U$#DfoM1$8apnUK>Jr_ImMZMom^$]uH[ +pj\(U/O98A8o@VV)i+6kUEZmE&[\UNkB6#h;fU8ed!GTJ9)E_*J%=-_r$`0XeGh`q +=F9l6dIH8''DUh2"[Tp(IDP)nqklM\/9nk7;Y`Q6R"3pA_p,#!jF;'bb3@Zs>cVe1\>UF+2/=aL)lX/uO?' +I!DJ%>HO`&RlPXB^O!W?^+?UoX6eRZkJ"\0E4k^cbQaXWGdcq3_7Dj;\NaDtgsqa/ +O-ZpZ(Tse0(R=g&dO`bjcSVsa8!tgcs06$D1`m]3#=an&!^]XEU'i`#R>2d%!P>&_ +VXH>,hO1d"!5nmd!FA?Z$,rWi6(!l#t0^eaBM@-$ctc27!Qi&S8pL.^D%7!73aS@%AEVQA;Z2igD0 +L9u4WC"1,B20&RkE`h!H(&3J6&,`&ZYGG_ZWT\@XZ4mg$!3u#;OFWs[X[7Z%:TbM, +`(fh51>C?lJGLA>J'4!U71,QL'u3sT#n_,W#5P=FMX$DBC&"`+4*aZ9s`dXOCbEWIs/m4h$Aft +TESGqr_L&7);f&W^Qf?#MIDa!1!8C7mEeoL8dSg\aM46K5KI`l$JbJA[roJNXmKF7 +90iK#Vojd9*4CCtdBkhQ527&@hO21Z=R^ep^CBu&ao9bQoB0a&!"hJI3.S^CraNs, +f/q1!Xn`jZDZol#>T:NZ<;s\PW>b\1s3lVu+nSQjAZ#tt'E]0=4bs+-5A:-`rl1j? +_t0Gh_h7dFUZM*RmJ@^sNusnArsTGA1]i,N2UZTlV[(Je44WZA*qfO8H/o-R\DTR_ +m/uuYTJp$C]D$eAnUF`[2oTb!B6E6os(b%]j*rfc>4-5._#NLQS%a!kj*uNk\4c)Z +IjlZm`[1GZ(lEems/8R%G$sk/13.27Q&%`XAhM#cREBh$^&7;RdQ]^ +BDh5h^\,?upg7qXJ-_hIhc'1sPl:0d52uTk1@RT*MF!>RfDk;Nn/&%[mqMVu\j8T` ++2X5P`_e/`9pTe"Fi%a[F?$-H:?RSZ1#oLaogXJN4C^+k1+?VX:$K(7!8TgG;#eG2 +:-V&%!XAZlnS`GCdDpb(*h<8Zq%*9#s5iT1Ri4r2[,(3>FEdPtK,d?O+NT +Y`"nk*:=.-GPGeuCSuk$pn)gST:O8=V>sL:Pu&dej/G"`2)Q8>3;/C:h8:;Ge8:Db +s":XF]i/DsFs.-ir5DF#`9ZV3nolN,Y/.&L3(f+0A7.M7S>aRp4Ilr,J3nJj&WdMi +rptCW.f[&dCF3bbUs$K658jG_;s41\q/lc^XF'Y*5(aa[#TWL=k'qt$rpOIupM>Zu +!Urq^f6GmsokC:Z=kVoR>W`8pM[iHm`LW'36h4W(J%0%"? +NW5&&jFWY=E1$J$1c8:Y:1*'p/&cclBtl1%0Hbl7Ge*Y/Ef14<;WZ*Pmapd<0/j=! +s0&m:^YU!j'@/32_#<@Q+oqVG7DSb2C%^h7\TG-!>$O0=<-+[#58$0oT1%S'-S<+R +ris7!pt!VenE+-(W3>Qhu-Wi0-Elm1o3IbVBY1>ssI4*<%-d28(^ +IV7k`;m'HmA&UZbq0t]\YqY%K375Q?J.@2+X#":J]4OC'X`(kkGC +LdloVao<7MF!JJs5kUs]dK2PSs%!+sn[BGDGoe"De?&f*0sD +:mqIQN0RDk!g)FA>Q8X0o=!13cMuZ*Ld_<3"kC_eq-SKu`@_k&YV>r!^YYV_X[^<,*EPY=?=tA1T\]p5\oR1.2-'cf$_R+:(L^=F9R* +nA!l.+)h]Ds$QePIkF,S3\Z[&:,;BR!J3,<^hb/J9BAC%E_\"K7/g`C^L;f.o;`l< +CR!_a!$TSe)>gZ7T?&69^0`RWm''hhj[0rX0%qLd:;_njXU\KWE=TgGS +#HU99]9;tSj;9#W+#gl@.km3GNYE/,;L7mb1Nf:Y\N6:n3a9*H0A`3Ph4Ll7>c`Ls +bB9uGBA3CY7a:_qFs!@OcIZ8Xbg5@2No4CNS\jfmX$)^5GF'94-EbOmQ*W?h+2pA6 +5NH1mc./8sWG9HiT1gW01#Mc7@646gX@sVL8`bT'DRA +q-bb&El@TA6I)_6c9u32Rf$=A&+_TO4p%;TMjaTJ(BFI?OTH"*!VIZ[pn("UWD_[S +A(Oi(WXr0+c/"-=C4+iXpm]pq]Z'UB!p":rqs%i+r!OJg"=]HE. +)/I4Sr'\TlCs1gcgZftsn97npeE^u*/Y6[;B05$3212T)(c2W;<^FeZN&ZO3/lBJQ +8:#t=T-t^&AGcKu2SdWCKRiqp`l!H/+occ&!t$(jdBp8-+6rD_MKhZ1&X]"+k1hkR[bZmdR#&^\alT%^gkl +Df":6aoBH/%+tD0r3&;!hE>Q-4_W^*Dq`u\=Pmk$rb"m>nGiDq[07[%0M>GkVrupe +bl8I@-^F`0>;GnZIL?om+oh:0C[cfuo06X^kKM733"YMYL$Cf%%0@\I!TB(O_"jTl +5[+ugs7Pcfot:k1IqPAaq/c-Lpn(ao@#u+3H4efWJUeq*g_V$1"k=8*FpOFIH\d4C +l/q6PC9b!FKG+^!\_K#,"=00\2?JL1iuo.O!B^HJB>;JZNnF#n$07=&Et?!,e)I"B +?Ubam)N&m+$1D!EVZJ;3nNY)!-3<2"%8>s`1EbkOc+'[8Ni@\S,&S3j,NoQh>X=a"6TWe:PT?@,6C'bUH@-(E4c'n^%jqk^Oj4kg[a?HBteUKEHsSj'IUdk)'? +HKtH)=o^A\:2.EA!K)@6Oak;*7aHQ$&(i8Bk&Ik-jj9#j%nDWV_n+YIc*d\ms5$?i +PQ0cm&'PP\s$QdDj#kD4AuoiqZup,ZAQ%2D1"&0Eg+kkK1bh:6K:SWP?CG_7Rr;d) +e`q>39RH08UCO2n#C1Vh4J,(#[gIaGOp,9LJAd"C&9IC$DK2fL3q>1H%CDq%[:"I3O^k.*Q[W29P=7]?oR.c*Sd/I*gE:Wal"^\7F +@j*;Z2WL"I,/A*WZP5)4"lE]'RSB=]Mb3[Q('-*n)*F2dJ0+/EcrsNS1bl^?!@iRV +Xnb!QfDC'dY_i-^h9>\eXoDFqbOU0SU+9H3`O9e)f5T51q\cBT^gDZ@Wl<67erbo5`m'JSKF7oQo +rb$S/W`7m(&i/*Z%Ih,Y8%?#[W0I#W;W,3p5toE+ETHa(4sM+kP;B!p8XrQhG6Iikm8p,b*OQVPBpccJCB +jmP&9"K[4VgH`P$X8-+_i]e)'="Bjf7[a90MpnVdYKn#&0$(*$.%A="bKAPZX3JsL +gV;V5K&:LrJ)'JlIWt9#rFBk5!71uo-Fa?VE4,Xh\Tq7_KD[C%r6*'5e)G`u2oB6U +OFJ`?R7p:"BWi4:O.'FJ["(RFpis7Qs$,=U4^;jZ?*<"RY?[VMsEn\bA09 +:$VC`h+ilJ^Wh/YB%=9AFWF3Z^EuiBiZMXj#Aq,8K:M;-lTET!\bo@XC +dugX*d)\DOCVD\%2_k=SBq#Vj9l(4$hI-ems#7A*&HQ/8&*=\c;#e;5[K,pf=Tm+- +T%,^U3Q/l,]=CoCr/]j0h8ut:h7C=S?aaN][rlVmSU3/Z]q5HRPIGOmW]NQ3n&V^.^Ns,qPQ1%ds/(0c +H`jon338@p(Zh4Yfu@`?V0K:J.$@%BRjF=CotMsg),5cR@f[meAk3sa6Nm2/P(6!D +G1PV6pccn4U+UclKj+kHSe7(TNj8r3H5VnhkF&'gUn*\trn6tYSGuajchX3-ptu!& +p1jtcURpZFJ%sa9mUlHBmr0iY=TruOFM\">3Xe7mdlO,bpA`^l1 +5m@0nLaf>'WnP8]OrohOXL@[Wd +J4K1lVgC9Fi9=k:iG+8\TW3JAk5S=c(NVt%#V.j@4rb[bsfO31L5gth-@8QZ(dJlroJ(rl\ +Rbk=?OrU\jr-EDMmHhdGV:gUrL%j?&:&>k]LYFDL>o!P`2D#G!C/'9:_F"Z`Xh9I\ +GTQ6;bg?IN:*,5=BE19n+"[IX$@!#>?@B.Mf>KocTIFjE>A>u<,?RXh5\dZH3"7Gl +@r"5F;]G4ngV&m_KG5PCA`ikAJtPgP[!)R("_p=GW!`YM5SbIG*#9]U!tK^N_K/iS +%%EMXcASir)JZ^g!L'qA?mFm;/I\2H)/.8h>#U@!fF3dRnZUJ%"-'I?;>#Dj!n@+l +>J#kG!ifITn?X;sf&^s+Qa4o4nJ0r"K*K'3OeNY3"dCc^i;%KM;X#W!/1dPZ]I[u,?0i[8mORSCl[o_W8+8bX5eGXJ;j/?.C-']R+9fD)T$L*uFpZor +H4g@brHHuYi9!8sOC"RaZ2f<(hq/i$[Gco1P5ulFCMj=t;\R""nr1,e*j;CLd"`+' +Q05XH!>:9u.V*Q7F:^daC(MKk83hPA"Mda<^h#e7n=uO:eLg(i$*\h"<+(8GQ,tbs7c(s +rWgsQh=*Y&lMp;;lX8IV2?N`ipg:MIe#a"lX8f^9^o-:eLVDIe[N5%h]DortNr]pl +O8<3Lr,3S]=@hNqYfT`;'<(rK`;e7b&H3b"`_lbsS>B5P`Q@Go%-RZ2aqEAoJ$]"I +B&h)%(A%PJ\+'FchsU4=*f0_9GQ3%7T>*VWi"P#Dm;D+Qh)=m)LW[U=Q2g7)1AkK. +/Y3bk:205/q.EU*A5\[`N%soG7n,`h4;JEdL-hXIU];;66pP3"/H@!QUpu!lJ477J +V:G_'*dkO\Ub+hh!q61R59>6!3./;;5@![6l?U8P03A"4djab5X;p5k31Crp4Vh@.I+g8`e:LH)'5F2XkAM#=S#5.K&XUoDgKF +(k/C$:R7s#T[N;'O>eqL]QS>q41Y(:4D`U[=g^WZ,BB$XG%Y34X.RL`F%O$Y:jq;\ +^%2X'!u1cGlnd/85.;@\4($XkF]O_/0j1lpBX>Mh'-nYK(M?!N3%%fW=HKWsuE; +Mm\8VA8\.99=Eg.BPKCA><)80Ad1m2Q3H&J!.3u8)?J@f)fO[7jgB;^l$rClf6lJ\ +h*0mXp.]QG_od/1nd"JBg0+dZglFb<6>%[oaF>1np:>r9>KU1pC&>JXo(3ZBA=_7 +cY0c4s&o(!Q2bC?3Q:ogZ;.4>j+*s+kC46JeY/(RkZG#2&YPK>#j;BJ(&u're.)4P +`16k@HX50G!N?#=CYaL)J),,ao=o`AM#-#5e&BH/Gm\XAk59/L83$YHbq]:jLMR;_ +bthsND"9sfT9(crga@g#:s_Q.Vod>,G)Z7sp3c#b@eTM9mdY#mrr7)P#601dh1X=8 +n8J&gr;ZJp$^gi0>S-gV^J4[Ap$$e_l#IO<^Sh(G0$RapcBSdd-b5(=!j.qbiN*W/n(Sk6T);u#[_(,"[G4D*s6d:?;YbBF5KqI)HmaZ<7MUnj +Gb@p]s/o`*%eB)UH.1RQq7dOL?4-Hl$O+9f#Wb%smcjPD=7VQVs2DdhMihFghr;$. +p&)boVEV[5k(TK+B@N!haHV%o&io*qVQOI@=eIIY>"[L`nMHgc->4te_\:,k#lE[ZoDF::D^@$ +q;c3I:Ac1AN&(E#qa&<\g5"[[aPU-ir-3sZhVkL7S\o0.'%HeC8*<,+J'Q/\p4(XO +Q*F)i#Y:C25hn=/R/cF9^i7dW80U;PV\&q/9:5YWNW2QXi8=#!9E3aI3][4E=*XE; +f<=`SRq2;(h!J_!J"HHUoK`;85JT(Ws!99\\bOKhmK5bU/8QC.bl=J?Wl[Kl(*@mM +;9*8mZ@#?^q7gr*78?_Z_>dk[2h/NqqYbjZr[5UULY]^0mK)JM^O<'Oa5clc:HLH6 +DrIm/rdVR_6NjX,2]!jJSGsc46qeJX%RhR/To^H8(^'lS_WMm/GSFKQ+G'S*!"]2$ +pf':39,7SL.q^4KQfT7Ms+dXBZiD1cO$;E752?n>F&;lY_>fQTHhIA&.o)FOPOO&c +2,ZsRjV%a,G^hp.?V'g?@^7'u"k_$`([\9G59crpQU(OI+$TSSb_M\]F27]QraP#> +('-;g=8hTq8N_/F_:B.m43]O9&I^r(L9JqU`+D*T +pKBQ"2<>=$'PijTR& +8-f'kX8PQg+$4^@rl;/o^nh$e]"@JQkWRqni]-XR+8`XDrb`;ApOJX7)aqC7ThZ0m +LdGu&(BM<[D>eYj5l=FHR\t70bj?`e/'S-;#;*#=YZNth";oDNJ6WP_Dq/OC\Y+<7 +VX9rK)r&VnJD)IQUB(sW:Nj1mnnKDV^UDOq^.Af[JGC'Nqs(WWII^Po1I'n]ruW9P +^`c!/jj34A3rdkJCt8?2F01)-(KT`!p!*4'm5F`hCQGrurdG7=rXfZ[nuqdPHN=TT +h^/R>n^uoXZl!TGQm7gW+@n>%b'b>!f/;K0aZ]%mYC"@R6SC,+#cg:SWG$Z3Q!2CD=&'*< +jjI2kHl!B6HUV+gV]3m9>OA>84[o8D6-$bsU>b'Gs8I'%VS%2"Z +3d\LLLgB#Kot%56&)EO@c?o`&5+`k:W:ORqS'5=.\!prPK,iP9"2t,k6,TB_[u\[= +EO[7Nhj!T3bI3]_lO,jl_3]!2S4gjg$g4K+2=cXcobd$aYhn +MiF3!NP"LNLYGOlh.GJ,3Fgr5Na-8&C7FTOZ=o/&^nYfj*fZ@HI8GIln0-@qgZGu?HA[n9_:4!YjecHiBAt+eg)q>!g"=SG2=GM!\c[`/rr@m@02/)4 +s1uE_?S1'f,p37I[fdY>r:LNUg3UduYf5L:*f>IB+)J!']*ADY+/h$u"q:WbqN0$d +Ke+jT$2F>k$d$!_>93$6r3]88b*l^`Pu$Ij@_P"3hOiQ]s+_QVrN5,=c@0tQ7O)kp +Fa.o?F]MZlYD_OT$gFX,HkbFn"UDnN=ia1rk!6%!6flYlO34's.Ib+JJ$Rr2J=3$l +1JQ@C@([6U@r]s'r#[^(7SNb'C6TeZA8DCeLAu^>2de(2^C%bn"D)KPd/*dqs/%(` +2u,]7f)OOp^Y]"1K5Th$Eg%F3IkU`g2YY[7J$nVj1S:-9K+9VneVL+>nn5pk0emd= +;NdS8fa6[hYIEhnpntHH2W"8Mj8Li1cOmtjcQ_;. +]C"Kn2W=ZhQg5_G=.V%1n';be:Zp[9Mqf$<5B<:lHOMDKINj96VpFBI\/d?&UYk0t +\Xa):HdM(!7K`jHj2]3hZ.NkR]n@/oFL#n+[a"`rVEc[6^rJMWH3"Lt#Lrd#\*$t\ +e$\eaEZmAo6@t.0Be>H.LAr"QLb(o"l0W,Vk0HGll!k$U8&WpTio<:B`%QlC6XFcR +dgPcRF^AaR!Vq'^h44DXn\:'"=8(?5^WRgD=i`>[2H.B@fOrb->I8eoXj!`+lOW*g +C?7*MDoh.p?b3KjAi"p9r[Uo6:B&^1riJTfMIr]Z$1^UJ:FABWikO@M!rbsq%mn)c +!7)j"!E)2TZafn/7/Ts:qhdhXprKMhWHV"A%;YS(=;O5_A_8:Fm$\Gh&-3P@P>0fq +d^PkWE,-EGH7nf=aP=oFIV+%Z,+h$&B97)>1*D(.Ej\:6+RA>a1]2)=?RmAcD1R85 +*o8X,mV*'@>9f`J)A%?Z5**Ci@qo]hoa,*!Y,Jsr70)pDKFdmV^!OJA9?I'W$@ZtL +d!HCij8_\J^;PX/?fD+=g)2MY)kbM>QaMGs/'u7H]:!:dGF4>+H>T_VW#9V&pVKl?"f2kR +!]bM9ra<4;Xk'&6G4dJKae+unQ/[-\*U5ur^UifraIds(5]0-2YCBZ>J(=R\s'PX& +qZrkoLV:h!LI=Bt^&O]Li/l:Cr6N4]IgI"ur!KJDD6"Tr/*jjE(#Iqja3BJ6p=+84 +AuGWP52SMu!0R8sPC:OqD7^THGo8]B*JQ +oC++n-U3QsLB.?=7t>rFq*4=K'tk:)s$c)Rpe1Y=7DK%YXp^3,9uCs,,!^c']G77QB' +5^3+tJ+%kBq2rStIHb^#/ims7*'VQ)Sn5sfoAeWcmqm@]'CBfjOf/-nh:uW"c*^Eg-1qO+mkU5'aq>::-P:mgh]hSmqqMsde(j+?8R[(+6#+j@RZ@6'LJlrZ +7(Y,&W;@'KV#+BE^!49^otJ\9hR1+,GH=Y+L&f?:Z@qAGr]%#(N$\HS[VVDJAqV +,(SOfnnrsK]k4Iq\DLaVBJpqi=c^W^::I[bV.j1me!T='%t4EM8,mXK!O+^I>e'2Pm`0,3j,NNlcMM_HI_'S`hHBK.e57_SgXL1gN69qt:d12^.2c#QYP5@">h5?mhb1HT0_ppg +T%,^Uk@NPL:RVR_VqL.'pg8;I(b6D&Q_hg)nhf+s:\Xl?_>bTq2Ep#8ICY.5M>@2L +E!Vj,8IBjDqS1&A\cA-"h/<7A^%lGTrU],#o095S$e+;scI/_Ve6"o;XS-Y`s'CJF +Q-D4.04IrW^>(*$ +5Ee=FJF)iKUKgnQAEV'k'++6%:a2WmLD9M>`9D`"r0*gFlX@as.fYU>S&jL96fm4M +WdQApDMHWg"WZZB"sUj"5m0_lfe91?X@li2M;:^1ni(6.W;1ctC<=kpoO(n/[jB_` +m+l"6L&BPhH<01?Q=`RD1W"i[!Lrm\O*+,[n+1H7*dBmt,7O4X7HMkk+'!_bf*eB> +2c9W]JFFA*LG%OY('42nCB;".Ips#:-[e!#s&l1G1Tbsb5Q5h;p>*a*]BWC$F:_tZ +2q'S9Rd?JTk7MC/qVTrJr#`2P_Z-/(=cm&+5"^6I8(,oh3:d5c59JhHr9a;F#KR*2 +EZlL>"3C7_kldBYH8]M*aYA"n-G1`+n<F:SoMg$R[J.D$%h<]5.WdPVIR08?_SF1^s,6n#q&3f+^Y/VQ +IldUZp4$As;<>"Z:UZ4"PI4oAIqc^D$Tr]_$Z_nipCb52?!! +h??+"GogmppG^[X/,e#[@C`ad;HPH4_kP7EdHljsGYje6%*/<60olA]4Q#oum8DN] +J%h3JoC*"a0A=F&r6;!^aPSrenA(^r=4%:MO]`7gJ'pHHYRCMR!E!A,Z(WhFQ\P1m +OKQX-lN07e-i*\[s.(4=#l]&:F?-fup'm^<SB;5Q_`6`41pae@E +;&m7tW@I"dX7OGK](fLcs*kLXYJ^C=s*q`>q>G=5cc:[Q4WSR\+8EU24ntX<^crn6 +rdMW*r/VWOoB#P`o>Sbugs*qlr-s:W5<2o+O(>"Ql0o8>)tD%&/t(&=#QHk;@]N(: +1%kUJ=j!o]KcV('Hdp\="FDT +,#E^i?)%?a"A$Ha'n%`)'X&mKDl:V3/5ElaSU%]TpjRFpOUcs][6*G':X_MKTH`9=Ve6%+;JQ_ +#MT7lJO6pMMBM:"Ju#l>_.Gl1rgea.(Z^&]mQEe#?GQKd^<9XYF`QCeV7=XiDKBi; +QQO!j^:_b`,7?+:]k@k4Om[Uq1E-t'!s8BQE=W,,cW6thPd'`u,-DC[IKFs:UDcp7 +IQ_@E.&(440]FF+NIhX(RKBBiBK,M,3hGY1s*!Q)]'eU*s._GZ@t4E(k'n*FbA/\f/*&1b\V4)* +IqkkFp<7ha[Sck4T.7RQ9E0c>i8[i,o5+aFnDP/MJ--C&;pem8eYSIHZiGgH@Q$)2 +DMO(Kn:,F%4Icfi,m&]js'X!i9n#Pe[,>Trs)Ig`igF8n+3;4Rs%NDp"!5H1GZJDJ +A+2]\J?B':0`NLP""C8p@@!)_0M.=bP),ejXR?J[\lf/dTGDX5#WV+&rs?(3s*+Ht +r/(GT>I>CjOM>ZPrYMh:ca3PKq-!6+dWF.N]aduEb-]_iLR%frf/nL=2KsAdWZ>r!PIAXS)O5F5:hd=Yk<9D$GeafW-57UK.UU-BiI'S_ITQ7bnFg4H& +""q:ml+lB+MZ6Rl3M0HqVWO&HM-+:>)B97a'L>NE^f=[a%=*9i:PnN,QS@(E#8$^C +]7#\lYHs/.hql?5:S$AHCrT5c%OAM$nbjLVXoDgY-@[jc%T>UQDq1QVQP_Pgm6M73 +ql0L;2g`!bHT"oOesN)qK_"f+lHRc< +gXXt9>>#De.h2,;h?M5JUOK,gXd/A?p3.Z(m?AH,A-I[=%sjG+fIo#JTI"4-_PJ\/#]2C#h+8eD*c=AS1kWt6'. +K&jR+`!q1!KY'D8C'0P[gU#&USp9,:j%d^(LF08jhY0P'q8j7*ri#$`&-Pi@3Gg5) +ij3hB*%%7WhdP$AlSKjj%M(VopL*uD:k+i7Oh"M3Ua*`@15LJ#fZ>8^H4bU^r+K@= +e8)CGe.nN?e]M&ba0."o%F"VEP7`H +`W*oF,WdW'+qkng7n;$:AL=3HqiutfN0io)AH)UHnMfVOVuE8KRNRs2JLB+7]Y.M_&<)O.5uZ"S>.l@MStFI5a=j,(TLHG:<#' +#X,ejmMuo2^L]i!YC5Bq(O;PN%p)qpeklBjkdL9erhg?Y/teCa5F'")Ggo'R4FVc7q04ps<13W. +]`c()XSdCR_=mp,m;<;@-e.5WT:ZVZ@K-;i,P1qY^&L<&/3TQKhk/-Jj>kBG(o=9eR^m +c;/Z2"^IYdYonSd)3rW.\3/S.05c;\@D.n04io6Broq?pr-73\7.-QFtLss(1r5]s4e;1nt/gf9ocVVN4+6KAYX:U@DEps?n&Y@^+p%`cACY#E($,lt!CT11"_\$+0iP2YRtm_"KOo`Xf?=1F.OrJ"!?Oj14ub^fSO>O0OnN%iNBjfMT@MN. +c_I^38io&sb_MSc/CFXr?Ui"9EQLq\mk-2=a::>o#&gUG+V5bo-#8TJ1OTCG_e8D!o23.-iApY*/g9Yo%Eikq#J/@'GNn? +13.(=*lrC.ruO)\jeqamsk%+mWU6J^&4l0>KFq4,Q_0.J'nDF +qd5`g3WBcg+0smua,5@AriGme?YZ$8BUYN0R[e78T5;/(2r%_C*\6r^MX.8$q/GTq +E8ghA)'GR'JPS5o^ZYUMEH>]n>So*=2.rgK-\[P-Fubn\-XAuP.\!BN)O?5=Uk?R@ +!;N1es.AEA*R@U(nAdUj^[h]L5Pu&fB8k!G8]CV"eLGXO&^"3V>>9Y_cn")T<6bGW +)nH#09nC$G=W0.h=:-bXEtRp.s#hP'n(8?.f#`J]V".mNrIt9\GXVNmW;d0YI::Cu +_CG1A9rNd\s&O16.J#dYD9->g!BZfP/SgFGI8'Y)fK_>L:e2+fk!ho??Vk&D7rD)B +m`rfocDR9eB0TZTI(ib]I(fING4gp.Fn"SMqVU^"rpdK%]lWcEYKo^tRfCKM5b7p6 +J%o=im:m+0s*VBTTtKl63XbtSe"cD^U$D[WA%.^%3QY-I*g>5n,hg2oPZ^ZWDpnC, +/te7oJC?^GE@LkCZ(N1E^iV?GJ1fb:^JQIsSe\`]$SX2.2F5%M5r#iHa?ok6l-sMn +4r$4%%gT,$MNWBXACD#kan7]ABF=BN.1l-/"%<,gf]8qgnF'ds5LI2O`5%ubIt"H4 +S',B0V&tdnrhb.chlQ'rr!aQ"p-7@"LA]TV]fR1h>AN%orZ]E*Q2g30?tPil4iNn\ +BP6lX+))c +%FFqN0B2D,Wk3eWYD2.WPQPjD#%((R?dF\F=r;b"1@og?*YImbHfaYog:O,>\%8,S +Ap&anORms+c2[1Ts(NjAb+Aq=1E_2I$F,s6tM"jNk3ZRK#D+Fcl%O3)9gq +=c?F>Fqg_=20e%).KkH]+/n3Z'iZ"[YJOKQE\KKq6g1ZCcIbl^\ +`IR.tfSR=pBcg%P6DT!f,U-<&Op?bF1Emn3Aei]aYt.:B'o:md=G +4L:&\e-kmeo(F\'Wt>?&YS_MuP-S6pp'0F+(4'X-fN^ +llWCc+"h71:s]]F.21UgeoI1T>]q9W5m0klP@KE!>]_5- +)9mh(dsc>e"'b8+a$+$^A+5!)2Z_"F+7Bo+J'J!unIPXa(]RZM*MXLs84lP&/(94r +pci7/bh.^/s0PLlZHA>rrj\ecq7jWUTHbSd!1j+aBE+b+L]:NU&,GN,fX5(gbl4GDL:]2rrm0acb6_Qdr6BQ(BO?#,iIkN)0F\"mFIWiddg[ibP&#-m(Y5$9W9MnU +8i:ARiN=$gYE&S5]%:#p;>`)m#pFcuq+lsYNN65_@kHU6Iq\2[+l7=.;p"&[Q +p$1:aNAoSY\&R6JBE;p>%>Y"f^6KW<`T[.Oo06=Vj"olcaSU4-B]%]J#dbCVr`[QR +Q%)J(NXO/H,&%!3e]#$hnel(3?7F9!,pbNFnkTq9PITO--:/%RO%Bl_3$0j?Sq]Y0 +E$s_-argVt:A3PA@J)f`plI]II[L00o&t")b$RfZn3;OuJbs9@D-CtDl9th\`mI'p +9n]Df5qtX5.V4#K%%&+jo,"A!:P(q,>;P6%5-DK>=2t)Kkfs+55l[]hY6P&a][Q\]\[N2VA@^CT#H% +dTa9_8HFIJk'mGL!BL6*TQ^;RnNT/$#3qZ>dW?%HLL?h6MNg&H0Ws3YR3l@8S9ZbtD^ +#n7,e?p#.e&,<_a*Ztt`!r1ZK(U5tVfkO(>mrPe:5#qEB[o;N2,N>'*s7(&8.Orc_ +ji,^l?2P]ir\)Q%Qf`3ZoCq@cVb;&Cm\_QZs'P6G-l]ocCpB>AkhEi:IsaBOIj"-197(8>luI!8Ak?U +L"(-$\WfZ:VW/'+kZm+l(@j\MW5>7U?pNuN%=-_aQa;b>410p9p)]Pf9`7b?ccf0L +-%PCPL]?%ZDgg_C]9Ol85@'Bpq`IaL]<)2%%:?`@T5F7Vr!c/EqSRcA>/L252Z0ZN +Cp*E7i=GiN5Q+jb,6@jK!;KnYdeJIp$#CcX*\Ir&VgqCsYV&2prJG@n-niN5WrLc+ +!TZI9k\>Ku.5p_#QP!3LS5NLlIo)kTl"7Z5TP/-8Rur.6#?0AOi!*d^.f^pHn]+""`UEp"VnB#5q).OPMc +5oA3&)7W;[5p[tp9ZSmHZ;OAB&s8h'8GU>b$t4o>?k[gfoY=A"&1M!B#gj"k$mL:[ +?nurCr+:9d_eAKC#&?.h!>?ZMP7<*LeL==-[0+#?Cr1EeW +(&p)l3]R/G%KEiX:Xd1$oA!g8b^AI#9I#GpZ17R`@gs79]utKie`@s6!#(9@V[CZ: +\3II[SD1jPL$e0\>UdSj`q,@j<)aZT>PW*;"X"Te:1_o7/->As(%B6YLZ&E%D ++<^GZq7nsVPFA20 +G-Kj')4N`eMZC*ahbA[3#iPXL>A`A3Tr3'7?f;uGKrn?a_bta%;Q`&a( +62nZ=-t*%pKCOas!bMPfD*mq6P2]j8FnGO#P1hp[7/gUu`(#.8?E.*uRY[%aS+;De +'2n`=OUFtm,F.9J9kikcD#(fX"TLjgbl>H6YJ^CTh/C11^H_-!5,eMZFMRhST3jJ" +r8dJ0dD%ll#^G'9Rt%C:\![1[?*&E%00PiNErJ:!Nh"%Co#HBNi'?)H+$jMTs-DMf +s'&;m+)ql82JU4Ls!AVA!/F;-E@CuR'd=cD4Hk`M,6^UL,aT@Y`*tX=!)g(I^s!m[ +9HT%f_Vt#mE6RbmnbIpP*ehWt!<5.I&j,W5YM7arEKO=K+oIf/V4d+'#PtMC2YO'J +n%ug@PJ4V3_6E-"q=d2Mbksm.-Fq#B6h,*GpN,oW*V>JZhjrX&Xkp`#](3J]\\?S$ +][4dus1I\k@K%?I2UqV2WH`$"i,'L\EA/qj2q7k6+XQ0Amik$Fob.6/&j#rAr;3=/ +M#ZS8s'NVBj3!]eaqqCaQh(kD(FEK3!]Cg$D6LV/?[o-0H=PTQCKf9&gq,bgJom]_5cZtgP +&XG3SE0_7@7)15q+N?nYS481.@hF6l_*t^=o"ReQmuiihFPg"t#5L(H_tHe$c^ZK! +Sd[;T$BPP79'@Cr[hA/LYK!sML]I;G,!`Q^JGe):LRB7!000Tgp=7Ph7a?8"%Qn8, +)0_JlE17o]:(ABP0&li+La4)/8c-+5DK:h-aO0+UM;6ZWZ9-,QU6c[<115R;V9 +Z.[)3LY1nYA`28&kV:e;ckhekOKf0B5X&uXZW&/W?c:NFRK&]Q2`KFk*q3a3s4_;f +-S7ShrSPH!!-fXWhf#F3J,Pt2n)WB!RV3NUI6TRbmegnuU:c*aW*C=t>\`^W7Pk2@ +=15_6g[0^f\no&@ZW'QZb;7"(a`N!3.hrSP\Xe+["'&\d1S;q9B%#.A!GW3#SrJp> +a@+$'_6Ies>QgSl-FjnBo7,>eV#IQ\V%HPs5?`S)-2aAr*)()]n:/l^prn\YWu!(IFTX:nc.nP;Uc./qod)Y3X7Us/k/r)*BU9*p6!OFK;X:,=CG'dm_7=_?k[ +Vn=R>?C`X_s*&+6&*:ckQ/sZaV6?/Q9o[hjXT.D[TLq\V]eQTCDOp4!c&^,[_qk^W4^]e5tscpn(#@ +&)g&qek7TL5)ZDtC)X<\#+`22O)rh6*G=hp`M9brfGm$"CnEb[9h&_[/3FB9TrCRr +1)(Q9qGl&C9![07j./(-+Ve5lO;,r5g+3P?(_J^J)8scSk]&rP.%q +s0""tY0;Cas!^qeQl'[;.@We^hiA7)J<@\BSGD\[s!>j?&U^3+eGg:4Uot"KDa8.N +oG[;`OS6?N'>GfN"k$HSI4l>@Qc&B\UPbD9`Q+7WdK1CFOH#oD(JkM2J(W0bV5qC'B1Kt\VtE7j!*joDa)0#le6Y3\/=P +r3%k] +s*+L8%K9BH6j3F6.fXf=qf41`I+$=bJ.7+W!aNaVn-(2D_E\$kE`/)'9W

      rSM8fB.V"$"G;m/ +5HXqj1IjeTI5%0P"G;Q+JYZ$As/4'CL]Eg7!VnPOa%b!s>QkBQ'*!=P"YO!Y>;sWS +5Mu:/b^\3tN](+0s0ZUUiLg;8B0cHN,G%IWJGcMR&JRWks6;,5A8:)gALG-q]1@bX +ID+/1&gmW`>[C)P:/d$jG5*7G!roS_J"Fqt5F/3rX3CQ_2=kHll5qsks1Fp"fA5H$ +mT9DX\Ftu]D0!_P`rc>As7>h*jBqBUIm+n&r3-+s4dl=hmsfcKs3(%:3MA"D#)W@I +EqhlaP(juTpto`LAc?o;M#T&qDAiOUru3fY!d\9PZU)ST^gS=.3g;hs=>2E@#u)GX +o0iA,BP@7p2\Gab$2V]i/GQng?MB8rUNF,'?*5>9*u%K5JAWP>g\[KN.=)#u]AMe6 +q7T2nht\?#9-\tWn6e'H;#b_A@X]eVZ_$ONGF85`r(V2g/=cWR`P2hH5NK$$lTa/J +r]d4Xhc]:!>3XaCl<7I)/^KOq^:9^uD":B2I5[)o^#T#tcSsa\R@c2bIfo]]p:W`p +TF4!faCtdM$_WKp9,.C`s1a6ejjFshs!*.L`s,mE%f\:?L'[QcNs&eK7aHJ;]ghbVP1)k2.41@]O4m&`VM7R$J,jCIrUFKJMG09nH=V&ci]E1shRcs9us +YKfk-ZAH^']P&eXc/>\%L&Xs>l9]YURp"!HQ;ad9A83TV,WCRU;Ier:+d3a;a%)3m +\VM^S*m97fW]gLJ#`'K"Q?SAPCh'OMTMqLu"QYXG>0('54rbgf$muR?Op?kjs-!_] +nkWEb;`4C&qk&cHcMqc>+9&`fnLa(>DsI?;SsC>pDmb_dO.*7:&D$`N5`:-5T,%Br +r+d6QWq*@M7Hj&KPQ+$IRZ.e2q4Ao;9'O0MS?db+^Gtq/1@j['oqaeEH[56*Q*LA% +)ZB-*OoMslrQjlLs*I!%5EGF9cf+>rE\/Oh`E^h+UogP4K9V:RNgpSf;2:nT<9ODd8J;$FX5@"+_\'_9:?Fuk?p +0'=q&A6Ii4%O)(H:799So=/A]s727Q(A>kD;_CJqpR*kl:U!rEEYF:"V"mK2ZE\TfY,i;^H^Cre.3 +"Dh[:j:?N*7!/DQqTf,M\Lqifn%LAq;FG`J:2k:&=\Fl@6[MSB7C=!?Pq_E0KQ5&J4=j58Fju;pLFc!A"&NA%f>X +.2n3CK]F:*rVm3dpSYCD1lhS>Rfk#$RSK%U$7NC$!>,I"`&5AE1b":_\LP)+`HVVM +E4B9)`Z*L+[5G56DS+ZV:,fL8S[O#RTD*aE7q16+RI?Y3]_j%In+V+apO1nnXS-n. +C9]fBs/VmaX>EK?A_H]U`JgC"$g=Yn)ZI$'!mf1cQBS')LbiNK0Jq7#D-^4JV=H8r +R?W"RTjC+\8h86p7&U:+Z<4%a)X`YT&H!D8*KP!'\0dfo`ff%H>TIE5?ia(0"@L>I +'(5lcT>KWN#pfRR5j/'SG5n2,s,8T1_Xekjn:*R3kG.eHn$q-""hG*>T6;?>n5&gD +DZB$6ppWi=,8(:^#*X]u8go=Zc&H_5]hk*S\As:)(r=[9`DNZsRl+!:iiSQ\oqIM_ +^W$JXg\t+MGqh6b@-:>o-o]DVW!"7@hb%+'s+1EYfEJeXiV],Z>QFO0]#&qZs3m,A +Rr]_d]/5l_)Y"DIF3\F@HO"Qja3_s.XZ:]K?FT$n[sW;OO1'HDnGg9$?[aU0$R#?X +5F"S7%o,FtE6i0`/q=+erX[]Xs6MB'r8(&mUHWeU,6rh?+dDV+CVT&GH#o^DL5 +mgdVB4W=.dkl-'la8^9=nSN()+`r2NT"j$!tniTtt +\Q$9HNSd50"3:P\+TmgrM4"A4!;R<]iIPC]MZdUDeFPlGL!r2fcKOWXfK+`_(T,dVp(UsSI42CiB +i;ZRA1I-E2+Ph_ti@TS`![O05,-=`GfGF=dme[Ao!0dIec#p^#1dHs*s/h#k:]f:n +f>aoD$3-q&/q3Xnm')D@"E6T9l$4T[$OAe3L?CdW]"6o0h'q5uYQ-chi_DN9r9ql0 +Z8VVP_ZY2JEN]T)?f.)+e%IirSip,/i@b9R'GUG7I%Ndqh_3-/g+FM#dU5#cZa8KB +a@M-kOStpHFAF\EhoUuLY65I:+0cNbJ56Q-diu[.V+NRl(-X87#kj*M$6%"cL[>ig +r3b>i72(3ddSjN;D61mKC\$;@^0M`U!WMs6m9rIOaFBYR5Ki@W0+<5*1_SrcXpi"C +=tXR@YNs*q"MLd=hpb+JlD("22;@H^kc="4BmKK`0Q`C4IDQnHdKA#o6YW)DXO?GB +PsuQ#WRg(O(ND3`9#3nqUgj`#:F<&/P"MTn+=9Nc(XO?BLh[^CD&;^9@1,oi7Sk24 +J9a/`!84HK(RG."#\Z'p+"Vs3J+Cl"rprb_D>k3BjH&aPR%3s`i'6bm2W"'$!=Ae$ +%rMj0\kL"I,l@cB2=ul%f#G#Uq>;I^ZKrfrRjo/FQ:kTdcg,.%9c:gV7Z$rjt&Zm4lreo4'.d!H%V(+#qSRc4Tgbr^6J\Zo2o/YnR-*k!mb\TBpq& +cQoKl340?p#1T`It8A,sH,/M5CI14YGi6qpNj#Rac8.0O)l4m"si(U0D`XJH,WL_6;t@Ur#P +9H+@T69u?T;rLe0qB4k"5QL^.&$c0:s+!V!g-0C2hT^\-]P145Dn#ZGrf/AK\L39f +.66?OhZ=_Vq2_C9Qp7sb_uCGZk^9"MM;Pkoaa^'\N.pj&PnF)lYN`eF^gH$77X^9I +gb@q[GR<:`s,U;Oj!,cFI5+n,(`,1RM4KhCf9CsX5;7:3j?t9o3Xb^^8W?$c4uT"S0#]F^'7nLZJIcr81XYltuG0pqKL<%Png@ +quHauS3\:tGo>OY^8P2KBahanNe%,6@j? +%-EOD- +Q +Q +q +72 -796.5 490 262.5 re +W* +q +q +[1 0 0 1 0 0] cm +0 0 595.28 841.89 re +W +Q +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 71.72 52.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01758 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\001) +[3.624 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\006) +[6.096 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\003) +[4.476 +0] Tj +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 2 2 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0.706376 translate +0.9983 0.9983 scale +0 0 596 842 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 595.28 841.89 re +W +q +q +[1 0 0 1 0 0] cm +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 36 805.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.99609 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.66992 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.66602 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.33984 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.33984 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.33594 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.00977 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.68359 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.35742 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.36523 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.69922 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.37305 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.36914 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.70312 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.37695 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.71094 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.37891 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.375 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.04883 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.71484 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.38086 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.04688 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.38086 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.38086 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.04688 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.04688 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.7207 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.7168 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.71289 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.7207 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.39453 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.06055 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.72656 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.40039 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.39648 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.39648 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.07031 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.06641 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.74023 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.41406 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.74414 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.41797 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.0918 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 473.0918 -9.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.66602 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.33984 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.01367 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.00977 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.68359 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.35742 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.02539 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.69922 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.36719 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.70117 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.375 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.37109 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.04492 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.71094 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.71094 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.37891 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.38281 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.37891 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.05273 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.71875 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.72656 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.40039 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.07422 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.74023 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.74805 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.42188 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.0957 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.76172 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.42773 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.10156 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.76953 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.76953 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.44336 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.11719 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.79102 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.46484 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.13867 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.47266 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.13867 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.47266 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.47266 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.13867 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.80664 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.48047 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.47656 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 479.15039 -24.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.67383 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.33984 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.01367 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.00977 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.67578 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.67578 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.34961 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.02344 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.03125 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.70508 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.03906 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.70703 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.38086 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.05469 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.72852 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.72461 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.39844 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.73242 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.72852 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.73633 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.41016 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.08398 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.75781 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.42578 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.09961 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.77344 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.43945 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.10742 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.44141 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.11523 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.78125 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.78125 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.45508 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.12891 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.13672 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.13672 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.81055 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.81836 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.49219 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.1582 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.83203 -39.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.66602 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.33984 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.01367 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.68164 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.35547 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.02344 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.68945 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.36328 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.03711 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.0332 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.70703 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.38086 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.04883 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.04492 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.71875 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.39258 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.06641 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.74023 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.4082 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\024) +[7.704 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.07422 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.74219 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.41602 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.08203 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.75586 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.08594 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.75195 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.42578 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.42578 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.09961 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.0957 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.76367 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.4375 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.10352 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.76953 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.44336 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.43945 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.43945 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.11328 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.10938 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.7832 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.45703 -54.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.66602 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.33398 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.00781 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.00391 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.67773 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.3457 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.01953 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.01953 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.01953 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.69336 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.68945 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.68945 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.36328 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.37109 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.04492 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.37891 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.04688 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.7207 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.38672 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.7207 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.7168 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.38281 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.38281 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.04883 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.72266 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.05664 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.05664 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.72266 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.05664 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.73047 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.73828 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.41211 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.41211 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.74609 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.41406 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.41797 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.41406 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.08789 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.76172 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.76172 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.43555 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.10938 -69.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.67383 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.00391 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.66992 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.34375 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.01758 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.68555 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.68164 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.35547 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.68945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.68555 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.35938 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.68945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.68945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.35547 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.68945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.36328 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.37109 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.70508 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.37891 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.05273 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.05273 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.71875 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.39258 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.06641 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.40039 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.07422 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.4082 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.07617 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.75 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.42383 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.09766 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.09766 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.43164 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.10547 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.43945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.43945 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.11328 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.11328 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.78711 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.78711 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.12109 -84.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.66602 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.33984 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.01367 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.6875 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.02148 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.69531 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.36914 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.04297 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.71094 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.38477 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.38086 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.05469 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.72852 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.72461 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.73242 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.40625 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.08008 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.07617 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.75 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.75 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.41797 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.75977 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.43359 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.43359 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.76758 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.43359 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.10742 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.78125 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.44727 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.12109 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.45117 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.125 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.79883 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.80664 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.48047 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.14648 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.82031 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.82812 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.49414 -99.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.33398 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.00781 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.67383 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.33984 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.67383 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.67383 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.34766 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.02148 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.69531 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.36133 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.03516 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.36914 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.04297 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.70898 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.04297 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.03906 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.70508 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.70508 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.37891 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.37891 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.04688 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.38867 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.0625 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.0625 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.39648 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.0625 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.73633 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.41016 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.07617 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.75 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.08008 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.75391 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.42773 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.09375 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.42773 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.09375 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.76758 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.76758 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.44141 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.77148 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.44531 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.44141 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.11523 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.11523 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.78125 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.45508 -114.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.66602 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.33984 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.33984 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.01367 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.34375 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.67773 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.35156 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.35156 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.01758 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.68359 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.34961 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.34961 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.01562 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.34961 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.68359 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.35742 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.35352 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.02734 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.70117 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.03516 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.70312 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.69922 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.37305 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.04688 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.04297 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.70898 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.04297 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.04297 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.70898 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.37695 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.05078 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.04688 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.7207 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.38867 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.38477 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.05859 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.73242 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.40625 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.41406 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.08789 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.75391 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.42773 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.42383 -129.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.99609 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.66992 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.34375 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.34375 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.01758 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.69141 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.36523 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.69922 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.37305 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.04688 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.71289 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.38672 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.7168 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.7168 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.39062 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.38672 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.05469 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.72852 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.40234 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.06836 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.74219 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.4082 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.4082 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.4082 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.07422 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.74805 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.75586 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.75586 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.42969 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.42969 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.0957 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.76953 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.76953 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.10352 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.77734 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.11133 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.78516 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.45898 -144.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.33398 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.00781 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.00391 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.67773 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.35156 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.68555 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.68555 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.35156 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.68555 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.35938 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.36719 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.04102 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.71484 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.04883 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.72266 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.39062 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.72461 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.73242 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.40625 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.08008 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.41406 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.08789 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.76172 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.43555 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.10156 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.43555 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.10938 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.10938 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.10938 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.11719 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.79102 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.45703 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.13086 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.46484 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.13867 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.14648 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.82031 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.48633 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.48633 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.82031 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.49414 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.49023 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.49023 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 479.82422 -159.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.00391 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.67773 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.35156 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.35156 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.02539 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.69141 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.35742 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.03125 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.36523 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.69922 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.37305 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.36914 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.04297 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.7168 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.04688 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.04688 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.7207 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.7207 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.7207 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.38672 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.06055 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.72656 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.39453 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.06055 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.73438 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.4082 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.07617 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.41797 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.0918 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.0918 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.42578 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.0918 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.76562 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.43945 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.10547 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.7793 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.10938 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.10938 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.7832 -174.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.66602 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.33984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.33984 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.01367 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.01367 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.68164 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.34766 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.02148 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.69531 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.69141 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.36523 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.03906 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.70703 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.70703 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.38086 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.05469 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.72852 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.40234 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.07617 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.41016 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.07617 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.41016 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.08398 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.75781 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.42383 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.42383 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.41992 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.09375 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.10156 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.77539 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.44922 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.12305 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.79102 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.125 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.79102 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.46484 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.46484 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.13086 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.80469 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.47852 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.15234 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.82031 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.49414 -189.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207 -204.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.67383 -204.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.66992 -204.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.34375 -204.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.67773 -204.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.66602 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.33984 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.01367 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.6875 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.02148 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.02148 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.69531 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.70313 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.03711 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.70313 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.37695 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.37695 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.04297 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.7168 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.39063 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.06445 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.73242 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.39844 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.07227 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.07227 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.40625 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.08008 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.08008 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.74805 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.75195 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.08594 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.75195 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.42578 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.75586 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.75586 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.42188 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.75586 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.42969 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.4375 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.4375 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.11133 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.44141 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.11523 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.78906 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.46289 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.13672 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 477.81055 -234.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.66667 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.67448 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.67448 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.34831 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.3444 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.3444 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.01823 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.35221 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.01823 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.68424 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.35807 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.0319 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.69792 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.37174 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.03971 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.04362 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.71745 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.39128 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.39128 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.0651 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.73112 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.39714 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.07096 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.40495 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.07096 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.07878 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.7526 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.42643 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.09245 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.10026 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.76628 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.4401 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.4401 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.11393 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.11003 -249.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34961 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.68359 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35742 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.68359 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.35742 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.02344 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.69727 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.69727 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37109 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.04492 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.71875 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.72656 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.72656 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40039 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.73438 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40039 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.07422 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.74805 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.08789 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.41797 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75195 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.41797 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.0918 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.0918 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.75781 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.43164 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.10547 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.7793 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.11328 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.78125 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.56836 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.23438 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.23438 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.9082 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.9043 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.57812 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.91211 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.9082 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.58203 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.25586 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.92969 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.92969 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.60352 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.9375 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.61133 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.28516 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.28516 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.28516 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.95117 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.28516 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.95898 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.9668 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.30078 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.97461 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.9707 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.64453 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.31055 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.64453 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.97852 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.65234 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.65234 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.31836 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.98438 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.65039 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.65039 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.31641 -264.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.66992 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.34375 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01758 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35156 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01953 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.02344 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.01953 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69336 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36719 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.36719 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.04102 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.71484 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.38281 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05664 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73047 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.06445 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.73828 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.73438 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.4082 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08203 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.07812 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.08594 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.08203 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.75586 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.08984 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.76367 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76367 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.43164 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.43555 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.10938 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.45117 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.125 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.12109 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.79492 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.46875 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.80273 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.79883 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.46484 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.46484 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.13867 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.47266 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.14648 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.81445 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.48828 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16211 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.16211 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.83594 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.50977 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.50977 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.84375 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.51758 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.84766 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.52148 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.19531 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86133 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.86133 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.85742 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.53125 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.20508 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.21094 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.21484 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.88086 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.54688 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.2207 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.89453 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.56836 -279.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.66602 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.33594 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.33203 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.6875 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70117 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.36719 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.04102 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.71484 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04883 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.72266 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72266 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.39648 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07031 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.07812 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.75195 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.42578 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.42188 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.0957 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.10352 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.77734 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77734 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.11133 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.78516 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.11523 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.11133 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.78516 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.11914 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.11523 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.78906 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.78516 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.45312 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.79492 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.46875 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.46875 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.80273 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.46875 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14258 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.81641 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.48242 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.15625 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.48633 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.16016 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.83398 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16797 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.17578 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.8418 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.51562 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.51562 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.18945 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.51953 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.19336 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.18945 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.85547 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.85156 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.51758 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.85156 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.51758 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.52539 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.85938 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.5332 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.20703 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.20703 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.87305 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2207 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.55469 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.22852 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.22461 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.22461 -294.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.68164 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.02344 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69727 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36328 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69727 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69336 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.35938 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.35938 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.0332 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.36719 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.04102 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.71484 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.05859 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.06641 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.06641 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.08008 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74609 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.41211 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.41992 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.08594 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.75977 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.75586 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.42969 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.10352 -309.58984] Tm +0 0 Td +/F82_0 12 Tf +(\007) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.69531 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.04492 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.05273 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72266 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39648 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73047 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.4043 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.07812 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.41211 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.08594 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.75391 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08789 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.0957 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.76953 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.4375 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.11133 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.78516 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.45898 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.45508 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.12891 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.46289 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.45898 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.4668 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.14062 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.13672 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.81055 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.81055 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.47852 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.82031 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.49414 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.49414 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.82812 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.49414 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.16797 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.8418 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.50781 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.18164 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.51172 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.8457 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.8418 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.50781 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.18164 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.85547 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.52148 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.1875 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.85352 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.86133 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.19531 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.86914 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.54297 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.2168 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.88281 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.55664 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.22461 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.2207 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.89453 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.56836 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.56445 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.23047 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.23047 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.89844 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.89844 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.57227 -339.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.00586 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67969 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.35352 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.03516 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70117 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.03516 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70898 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38281 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04883 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.04883 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.04492 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.71875 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.72656 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.06641 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.06641 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.40039 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.07422 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.07031 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.73828 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.74219 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.41602 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.08203 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.74805 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.42188 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.0957 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.42969 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.10352 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.10352 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.77734 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.45117 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.45898 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.13281 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.80664 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.80273 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13672 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.4707 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.13672 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.4707 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.14453 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.47461 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.14062 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.80664 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.48047 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.1543 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.82031 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.82812 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.50195 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.17578 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.8418 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.8418 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.50781 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.18164 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.85547 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.18555 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.85938 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.52539 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.19922 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.5293 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.20312 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.86914 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.54297 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.2168 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.88281 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.88281 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.88281 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.54883 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.87891 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.54492 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.21875 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.89258 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.88867 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.5625 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.23633 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 481.57031 -354.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33398 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.00781 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.67383 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.03516 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70898 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.38281 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.05664 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.72461 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.39062 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05664 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.73047 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.4043 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.40039 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.4082 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.4082 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.07422 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.4082 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08203 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08984 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75586 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.42969 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.76367 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.77148 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77148 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.44531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.44531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.44531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.11133 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.78516 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.45117 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.11914 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.11914 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.78516 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.45312 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.12695 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.12305 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.79688 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.46484 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.13867 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.8125 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.47852 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.15234 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.81836 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.81836 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.81836 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.48438 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.1582 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.16602 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.83984 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.83984 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.50781 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.50781 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.18164 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.85547 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.5293 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.19531 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.19141 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.86523 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.53906 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.87305 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.54688 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.54297 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.21094 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.54492 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.55273 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.22656 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.90039 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.57422 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.24219 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.91602 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.91211 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.91211 -369.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.68164 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35156 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.02539 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.70703 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70703 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.38086 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37695 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.7168 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.05078 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.72461 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.39844 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.39453 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.72852 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72852 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.0625 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73633 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.06641 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.42188 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42969 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.10352 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.77734 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.45117 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.44727 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.11523 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.11914 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.79297 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.4668 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.4668 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.14062 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80664 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.47266 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.14648 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.48047 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.48047 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.48047 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.1543 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.82031 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.49414 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.49023 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.15625 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.15625 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.83008 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.50391 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.51172 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.17773 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.85156 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.85156 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.52539 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.85547 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.5293 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.20312 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.53711 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.21094 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.88477 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.55078 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.88086 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.55469 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.2207 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.88672 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.56055 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.23438 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.9082 -384.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.36133 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.69531 -399.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.00586 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.67383 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.33984 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01367 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.01367 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.67969 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.35352 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.02734 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.70117 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.36914 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70312 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.37695 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05078 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.72461 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.39062 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.06445 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.73242 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.06641 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74023 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.73633 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07031 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.74414 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.07422 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74805 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.42188 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.42969 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.76367 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.4375 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.11133 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.78516 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.45117 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.125 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.45898 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.12695 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.12305 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79688 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.4707 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.4668 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.13281 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.4668 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.47461 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.14844 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.82227 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.49609 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.16992 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.17773 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.17773 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.85156 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.85156 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.51758 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.19141 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.19922 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.19531 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.86914 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.20312 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.19922 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.87305 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.20312 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.87695 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.87305 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.54688 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.54688 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.21289 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.88672 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.89453 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.89453 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.56055 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.89453 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.56836 -429.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.67578 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.67578 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.34961 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.02344 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.03125 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.70508 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70117 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.05469 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05859 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.72461 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39062 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.06445 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73828 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.41211 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74219 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.73828 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.41211 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74609 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.41992 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.75391 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42773 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.10156 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.77539 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.77539 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.44336 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.11719 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.7832 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.45703 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.13086 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.79688 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79688 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.79688 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.46289 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.79297 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.79297 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.45898 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.12695 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.80078 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.79688 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.4707 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.13867 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.47266 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.46875 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.13477 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.80859 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.48242 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.14844 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.81445 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.48047 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.48828 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.16211 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.49609 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.16406 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.16406 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.83789 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.83789 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.17188 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.83789 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.51172 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.18555 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.85156 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.52539 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.85547 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.5293 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.53711 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.53711 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.21094 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.88477 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.55078 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.22461 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.89844 -444.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.00586 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.33984 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.02148 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.6875 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36133 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.69531 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70312 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.36914 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.37695 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.05078 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.7168 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.7168 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.7168 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.39062 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.05664 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.72266 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.39648 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.07031 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.74414 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.41211 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74609 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.74219 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.4082 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.08203 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.75586 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.42188 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.08789 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.75391 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.42773 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.0957 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76172 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.43555 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.10156 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.43555 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.10156 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.10938 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.10547 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.7793 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.45312 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.12695 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.13477 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46875 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.14258 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.80859 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.47461 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.47461 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.14258 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.14648 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.82031 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.82031 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.49414 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.16797 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.8418 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.51562 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.18164 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.18164 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.18164 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.18945 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.86328 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.85938 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.5332 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.20703 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.20312 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.21094 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.20703 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.88086 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2207 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.2207 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.89453 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.56836 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.24219 -459.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00391 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.3457 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01172 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69336 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36719 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.71484 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.71094 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71875 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.05859 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.72461 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.05859 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.73242 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.39844 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.07227 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.73828 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.07227 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74609 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.41992 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42773 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.09375 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.76758 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.43555 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.10156 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.77539 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.44141 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.10742 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.78125 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.11133 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.11133 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.78516 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.78516 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.78516 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.45117 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.125 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.79102 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.45898 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.13281 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.79883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.79883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.79883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.79883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.46484 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.79883 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.47266 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.48047 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.81445 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.48828 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.48438 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.81836 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.49219 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.82227 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.82227 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.48828 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.48828 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.16211 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.1582 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.1543 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.16211 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.49609 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.16992 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.84375 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.84375 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.50977 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.18359 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.85742 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.85742 -474.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.34375 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01758 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69922 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.0332 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37305 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.03906 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.71289 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.38672 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06055 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.39453 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.0625 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72852 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.40234 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.40234 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73633 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.74414 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.74414 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.41016 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.07812 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.75195 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.74805 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.42188 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.08984 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.08984 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76367 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.4375 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.10352 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.10352 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.77734 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.44336 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.45117 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.125 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.79883 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.46484 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.13867 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.80469 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.80469 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.80469 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.4707 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.14453 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.81836 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.48633 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.82031 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.49414 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.16016 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.82617 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.16016 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.15625 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.83008 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.16406 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.83789 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.17188 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.16797 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.8418 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.51562 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.18945 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.18945 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.86328 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.19727 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.19336 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.86719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.86719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.86719 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.54102 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.20898 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.88281 -489.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.69141 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69922 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.37305 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.38086 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37695 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.38477 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05859 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.39258 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39258 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.06641 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74023 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41406 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.41016 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.08398 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08398 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75195 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.41797 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.0918 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.75781 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.42383 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.43164 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.10547 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.7793 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.7793 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.45312 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.12695 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.80078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.80078 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.46875 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.14258 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.81641 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.8125 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.14648 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.1543 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.82031 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.82812 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.82812 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.50195 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.17578 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.8418 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.17578 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.50977 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.17578 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.50977 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.18359 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.85156 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.85156 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.85156 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.52539 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.19141 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.86523 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86133 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.52734 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.52734 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.20117 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.875 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.88281 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.88281 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.55664 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.55664 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.23047 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.9043 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.57812 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.57422 -504.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67773 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.35156 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.02539 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.69922 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.37305 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.03906 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.03906 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.04688 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.71289 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37891 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.05273 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.72656 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72266 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.73047 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.4043 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.07812 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.75195 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41602 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08984 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75586 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.42969 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.10352 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.09961 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.77344 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.44141 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.11523 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.78906 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.46289 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.46289 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79688 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.4707 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.80469 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.47852 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.14453 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.81836 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.81445 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.48828 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.16211 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.49609 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.16992 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.5 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.17383 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.8418 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.8418 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.51562 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.18164 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.85547 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.5293 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.86328 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.53711 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.87109 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.87891 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.55273 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.22656 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.56055 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.23438 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.9082 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.57422 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.57031 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.23828 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.58008 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.25391 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.25391 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.58789 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.25391 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.92773 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.60156 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.26758 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.94141 -519.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.68359 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69141 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.36523 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.03125 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36328 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.0293 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36328 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.03711 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.71094 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.37695 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.38477 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.05078 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.72461 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.72461 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.05859 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.73242 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.06641 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.4082 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.08203 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74805 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.42188 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.08789 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.42188 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.0957 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76953 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.44336 -534.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00977 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68359 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35742 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.69141 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.36523 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.03906 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.71289 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.7207 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.7207 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38672 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.05469 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72852 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.72461 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.39844 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.06641 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72852 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.72852 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.40234 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73633 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.07031 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.74414 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74023 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.41406 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.08789 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.42188 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.0957 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.76172 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.76172 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.76172 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.75781 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.43164 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.76562 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76172 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.43555 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.76562 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.43945 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.11328 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.10938 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.44336 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.45117 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.45117 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.125 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.13281 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.13281 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.80664 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.80664 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.48047 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.1543 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.82812 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.50195 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.17578 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.84375 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.84766 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.52148 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.52148 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.19531 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.86914 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.54297 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.2168 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.88281 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.88281 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.88281 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.89062 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.56445 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.23828 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.57227 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.24609 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.91992 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.25391 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.91992 -564.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.66992 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.33594 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.33203 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.00586 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.67969 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.67578 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.34961 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.01562 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.68945 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.35742 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.02344 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.69727 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.69336 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.36719 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.69727 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.37109 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.37891 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.375 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.04883 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.38281 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.05664 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.39062 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.06445 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.73828 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.4043 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.4043 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.40039 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.07422 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.08203 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.75586 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.42383 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.41992 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.09375 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.42773 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.42383 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.09766 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.42773 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.76172 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.43555 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.43164 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.10547 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.77148 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.10547 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.7793 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.44531 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.11914 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.11914 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.79297 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.78906 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.46289 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.79688 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.46484 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.13086 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.80469 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.13477 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.80078 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.47461 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.47461 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.14062 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.81445 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.48047 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.48828 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.16211 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.83594 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.50977 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.17578 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.84961 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.52344 -579.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01758 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.68555 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.35938 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.0332 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.0293 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36328 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69727 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36328 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37109 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.70117 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.375 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.04102 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.71484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.71484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.38867 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.38477 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.05859 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.72656 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.07422 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.74805 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.42188 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42969 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10352 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77734 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.45117 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.125 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.13281 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.80664 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.48047 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.48047 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.14844 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.81445 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.48828 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.1543 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.82031 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.49414 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.82422 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.49023 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.49805 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.49414 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.16016 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.16016 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.83398 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.16797 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16797 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.8418 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.51562 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.18164 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.85547 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.5293 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.19727 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.87109 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.53711 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.87109 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86719 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.5332 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.5332 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.20703 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.54102 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.54102 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.21484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.21484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.21484 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.88086 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.55469 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.2207 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.88867 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.22266 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.89648 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.5625 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.22852 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.90234 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.90234 -594.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.68555 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.35938 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.69531 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04688 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38086 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37695 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.38086 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.38477 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.05859 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.73242 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.73242 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.40039 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.4043 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.07812 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.07812 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75195 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.42578 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.09961 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.77344 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.43945 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.43945 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.43945 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.44727 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.11328 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.78711 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.12109 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.12891 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.79492 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.46094 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.13477 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80859 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.47461 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.14844 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.81641 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.48242 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.15625 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.49023 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.16406 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.16016 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.83398 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.50781 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.83789 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.51172 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.18555 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.51953 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.51562 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.18945 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.85547 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.52148 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.1875 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.52148 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.52148 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.19531 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.86914 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.53711 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.21094 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.87695 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.55078 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2207 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.89453 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.22852 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.90234 -609.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.68164 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.69531 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36914 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37109 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37891 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37891 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.05273 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.72656 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.40039 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06641 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.74023 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.07422 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.07422 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.74805 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.42188 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08789 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.42188 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.75586 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.42188 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.75586 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75586 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42969 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42969 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.42969 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.0957 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76953 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.43555 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76953 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.4375 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.10352 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.77734 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.44336 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.10938 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.11719 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.11719 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.79102 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79102 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.46484 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.13867 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.13867 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.13867 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.8125 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.82031 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.49414 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.49023 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.16406 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.17188 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.8457 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.51172 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.18555 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.85938 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.5332 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.20703 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.88086 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.21094 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.88477 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.55078 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.22461 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.89844 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.56445 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.56445 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.56445 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.23047 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.56055 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.23438 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.9082 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.57422 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.9082 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.58203 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.25586 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.92969 -624.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.36914 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.03711 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.04102 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.375 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.04102 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.71484 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.04492 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.71094 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37695 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.05078 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.72461 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.7207 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72852 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.39453 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.06836 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.06445 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.73828 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.73438 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.40234 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.40234 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07617 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.74219 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.41602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08984 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42383 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.09766 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.43164 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.43945 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.11328 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.78711 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.79492 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.79492 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.46875 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.13477 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.80859 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.14258 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.81641 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.49023 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.1582 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.82422 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.49805 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.16602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.16602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.83984 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.51367 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.1875 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.86133 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.86914 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.54297 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.2168 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.22461 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.2207 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.88672 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.88672 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.56055 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.56055 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.22852 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.89453 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.56055 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.23438 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.23438 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.56836 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.24219 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.91602 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.25 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.92383 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.59766 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.26562 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.59961 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.27344 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.27344 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.93945 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.27344 -639.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.01367 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.6875 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.69531 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.70898 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.04297 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.7168 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.71289 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.7207 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.05469 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72852 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.72461 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39844 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.07227 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.74609 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.41992 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08789 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.76172 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.43555 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.76562 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.76562 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.43945 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.11328 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.78711 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.46094 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.12695 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.13477 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.80859 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.48242 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.48242 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.81641 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.8125 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.48633 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.1543 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.82812 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.50195 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.83203 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.49805 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.17188 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.17188 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.8457 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.51953 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.85352 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.52734 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.86133 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.53516 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.20117 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.19727 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.87109 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.54492 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.21875 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.89258 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.56641 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.56641 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.23438 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.23828 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.23438 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.9082 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.58203 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.58203 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.25586 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.92969 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.59766 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.93164 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.60547 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2793 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.95312 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.61914 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.29297 -654.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.33594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.34375 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.01758 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69141 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.36523 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.03906 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04688 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.7207 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.7168 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.39062 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39062 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05664 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73047 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73828 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.41211 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.08594 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.75195 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75195 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.74805 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.42188 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.0957 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.76367 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.09766 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77148 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.10547 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.7793 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45312 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.12695 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.45703 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.13086 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.80469 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.80078 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.13477 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.46875 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.13477 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.46875 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.14258 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.47266 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.47266 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.14648 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14258 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.14258 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.81641 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.15039 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.81641 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.48242 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.15625 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.83008 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.49609 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.50391 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.17773 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.8457 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.51953 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.19336 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.85938 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.5332 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.19922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.19922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.19922 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.86523 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.53906 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.21289 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.88086 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.54688 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.2207 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.88672 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.55273 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.22656 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.55664 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.55273 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.22656 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.56055 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.55664 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.23047 -669.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.35352 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.35352 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35352 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01953 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.34961 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.02344 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.69336 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.69336 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.35938 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.02734 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.70117 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.69727 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.37109 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.03906 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.71289 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.38672 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.05273 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.05273 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.71875 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39258 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.06641 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.40039 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.06836 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.73438 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.4082 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.73828 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.73828 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.41211 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.41211 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.07812 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.74414 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.07812 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.75195 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.42578 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.75977 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.43359 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.10742 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.78125 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.78906 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46289 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.13672 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.81055 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.48438 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.81836 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.48438 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.1582 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.83203 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.16602 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.83984 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.50781 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.50391 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.17773 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.85156 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.52539 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.19141 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.52539 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.19922 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.86523 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.19922 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87305 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.54688 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.54297 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.87695 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.55078 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.21289 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.88672 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.56055 -684.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35156 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35156 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01953 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69336 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36719 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36719 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.375 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04102 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38086 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.38086 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.05469 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.7207 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.39453 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.72852 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.72461 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39844 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.39844 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.06641 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.07031 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.74414 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.41797 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41797 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.0918 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.75781 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.42383 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.09766 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.43164 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.10547 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.77148 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.44531 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.11133 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.44531 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.11914 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.79297 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.4668 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.13477 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.80859 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.47461 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.14844 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.15625 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.83008 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.16406 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.16016 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.83398 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.50781 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.18164 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.18164 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.85547 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.18945 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.18945 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.85547 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.85547 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.5293 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.52539 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.52148 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.19531 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.86328 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.53711 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.21094 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.88477 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.21484 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.54883 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.22266 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.21875 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.89258 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.55859 -699.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.36133 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.02539 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.0332 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.70703 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.375 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.04102 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.71484 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.04883 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72266 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.71875 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39258 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.39648 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.39648 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.07031 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.74414 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.74414 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.41797 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.41797 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75195 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.42578 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.75977 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.43359 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76367 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.4375 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.11133 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11133 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.44531 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.11914 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.78516 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.45117 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.125 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.45898 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.45898 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.13281 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.13281 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.79883 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.47266 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.47266 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.14648 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.14648 -714.58984] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 36 805.89] cm +q +0 -250 200 250 re +W* +[200 0 0 250 0 -250] cm +/DeviceRGB setcolorspace +<< + /ImageType 1 + /Width 512 + /Height 640 + /ImageMatrix [512 0 0 -640 0 640] + /BitsPerComponent 8 + /Decode [0 1 0 1 0 1] + /DataSource currentfile + /ASCII85Decode filter + << >> /DCTDecode filter +>> +pdfIm +s4IA0!"_al8O`[\!!#/mE=]te*!AFKR!#0X!E-) +'[!CQnf!#/pV@:T?&sZDXJPst(FE6e=s*eFz-l;pa'itA8\2.5i=s*eFzo25Ph!!!! +"(=.&61GSq1!!!!"$pjpo"lB:Zo-OG;#Ef&erK7-[qkF,jrM'>m"5EkV^hdM'EcqE +_z!!*-W!!$kPF^kCOz!"T&0!"]Hh92Y`i!#P\9!]#(8<*'&"!#bh;!A\t76V[U]!#>P7!Q4t2!+>kE!+ +c.N!+>kF!$D8>!(R#U!%e1i!-/'X!+l4F!,2FL!,2F2!(R#U!%e1i!-/'X!+l4F!, +MWX!+l6)!-/&^!)!<#!,V^I!-/'J0WQnd0^/Q[!)`ee!($Z.0\8#G0\%kN0VgDgAU +%!FG5,fZ!$D8>!(R#U!$Hl6?YO#rO73-G!+c.N!+l4F!,MWX!)`ee!($Z.!,qpH!- +/'J!$D8/!9!op!+>kJ!+>k*!(R#U!%e1d!+>kE!+c.N!+>kH!-/'X!+l4F!,MX5!( +R#U!%e1I!-/'X!+l4F!,MWX!+l6/!-/&^!)!<#!,V^I!-/'J!-<>YB0$#8!)`ee!( +$Z.A'^5*AVX%S!)`ee!($Z;!+Gq>!-8-U!-/'R!-S?R!,MXV!+c-Q!-A3T!,MWX!) +!<#!,V^I!-/'J!)`ee!($Z;!,qpY!,hjL!,2FE!,MWX!(-`p!,V^I!-/'Jc?-Ws[s +S/u!)`ee!($Z.eHEBedgX9E!)NZ,!-/'O!,2FL!$D8>!(R#U!$D8P!+c-Q!(-bG!, +V^I!-/'J!)NZ9!,hjL!,2FL!,hi[!)`ee!($Z.!(Hs,!-A3Z!+Q";!,V^I!-/'J!( +-`p!,V^I!-/'J!$D8>!(R#U!$D8!* +0(d!$D8P!+c-Q!,Nbq!+>kH!,qpH!-/'N!,2FL!%e1i!,)@N!-A3Z!!%+PG]Woc!! +#B)E-ZJF9hbU;!!!!)!"&`;!!3-#!!WE'!/ +:Lc!!3-#!"Ju/!/ppk!!<3$!!*'#!!!$Bk(pXBl +.E(2_Hoe1,(CA3\WGQ&2(gT`!#^BW!!N?&!! +*'"!Y0gQ!!N?&!!*'"!Z$S9!!<3$!!*'$!!%g&!!<3$!!*(m!!&)\!!`K(!!Fu21, ++dl!!3-#!#,D5!ZmF+!!3-#!#,D5!]#l=!!`K(!!E9%!!&/_!"&]+!!*'"!_/=S!! +N?&!!*'"!`"m]!"&]+!!*'"!`kHh!!<3$!!*''!!&/g!!<3$!!*'2!!&/h!!N?&!! +*'"!a_N"!!`K(!!Fu10JK.#!!<3$!!*'#!!&Yn!!E9%!!*'"!W\kq!!E9%!!*'"!e +@!T!!N?&!!*'"!bS/;!!N?&!!*'"!cF_D!!<3$!!*'$!!&eq!!<3$!!*'"!!&er!! +<3$!!*'"!!&es!!<3$!!*'"!!&f!!!<3$!!*'"zz!!*'"!6>-?!!rW*!!+i/0K2$I +0fh$H+>Gf92)[KL1&s'`0K2$I0fh$H+>Gf92)[KL1&q:S&Hr.7!]g;]#$1d)!<<*" +z!!*'"!#tt=!!*'%OFR<2!':/_OFR<2!'C5>!hj:LFDs8o05bh`@:X:cAM.J2D(g- +BE%`pu0JL\FDF# +`=A;U76Z7!V+>b]-/heJ5$6UH64E=tE3`8@8+F%a>DK@jZA7dtKBQS?83\N.1GBYZ +`1G3TdB.ku"3B8`H1+tC1,cGWJ<.Ec$#/Eb.EA+. +C04B!J3_!poF(dpZD/a'(F('0)Df.`G+1_cAi`gX7Qq/A06fO&D/a?'FC@??!<:dR6N@/g!%;)SAnPdkC3 ++K>G'A1VH@pm)L51SAMNX0fQ'Rc(R@9kFUnsrdW2Zf&Za@-K\%&u[_Sa=2`lH0Bb0 +nbge^i@)g"PEEj5f=akNM0qnac;Dp%J.Tq>1-0!$;4A!s&E'!/9Ll%"PPE_>uQ^F20U8+N\VPgAlWj8t<[C3QS\[oYq` +5Ta:aN;TQe'uq!f@\d1ioB+]k3(smlLOQ=p%J.Tq>1-F!"8r1!!3`7&HG#qr%bV*\ +&O0ibT:BE2\(B1c_Y?RKs]E=-J'g-G3bNP?bkg&a*`rG>ckghAguhnF+?=C:Ot'0? +uAk63T3=`5;>D,`e+C-m#(WIPXD#3N!&n(_r7Pkrr>u?&8pHo$CP6h-tAT2[PG!Q: +=h7eDdnB-A(NRHG'[?6\4>#=\MO>!e&&+3ce>K)d6+]6!9bQV`1IXS3&IhFg\;/n8L@"b1tOAT5?5`D@+-C= +K=g-(5tM(+s_@Ecj#_A$uE)"ZX.D9Z5!+:!lR$sp(ZmM_&#"Q9Ph+m-A)D/&@7&+i +rC"CO2P)-l^0::3TL4"e'F#>bN61B?@TJTM?)APW5W>G45GSkkJH>%T9hdbJ.cdT' +4&p,ZIC"c36hPcEE)k\;:IcO>\Ud7Krrn]\f:/9?'P9!7X5m?g9&?RLiiU8dSh4Gc +IM21#@>)\F&RF;cK`#\c]UP"5QK.96#Z8Glr$c)4gb+<$:I\\qi=ZMMrERIMO:R+J +j%iib,cO'VP6j*)jqBtbbtO&2F+6Qeh&LZ[+@`PA)D?EBXJIu!)XuL;pq)"P1[^'T\a +(!F$"HWW$2q-K24%lRG)eB'rZC@AIP*-N.>ZLENl?Ii:h)@CUO#.Ka>3A+_&`BM\P +A$Sq7\f!J57YpPb:E@"edL6rU];7XPB$.K+.I8i8'?pi^4Vci+0upB.sPjhQcGX?8 +K5Cqi+k8!f8+Ao"3>'%2-KS9;bfu,3)-Za9F&hpSh!%E<]AE?G,_N/(.9KMFH@4`7 +LpQ.,.\<=%or+;L-.t;C%)Mi%uL3_Vd*FD/hT$-%^(jE[%Y8IWWIR`=)m(X'uB/cJ +^_8!,hh;ll^%iVM?6@K)_qp-Ih=pT\dTehZPQKh6/d+89%`XX[]?488Yndc1`(.WK +k-\uFiQN,o]o[%*kLjj3[&j>.u1g(Gs&$`DBV$o)81>+4Y*#5nG]gJUF4a&39%D]2 +^pH_,6t[4B905UTF$/To^,5IE9tlS*&d7Mfc=! +.:2?Nl=2LU)8N\)ths4Var"%c2:J>epRU33FMXOPAJV1`^NL+?>:`fp_T%GoZR +T@+tpb,=koPYT111+cT;d2nj_Q5UV"cO'>\O(upMG+O4K+cpn5bJ2A_)a,/2MiC'b6ad[4!s@>M[A=>QN37kqp7I36MeFa)o&T[8.gn5jK +(f6maFcR[UmqL+g7u4OX[b"8=$_f_7PY7"hkLEX,<^FpjUTF-eU6 +VFc9&D^X:,RE%IpAOD?LE;_OIGmP3E#-UT0&h%60qlaKn.'g*("_)_HcAn[9XjNH3 +i@U5Y2k^oghu.5CjT!`o.GjQJF+J,]UT#EY>F^QlmqUaioZ_W2oF!4M$]Ci4Gt\JKQt*rIE +3b=dh8tVZR(*TaOpK>BEcRI%LI.$,B+(?kmK^E*9r;Vr5,04nRk/NEb_L]()!E^32 +:VDGgM,69atekg3tqld,<"SGPE%^''r0bafk9O;'_W8HQDSj1SAY.2;b%[Rj7b-/$VpPS*\&J3&*rFR[k6-i>2U" +)t%F\_QNXl8t3dRGiW-c$uOW]LNl,;78!Z+e/STg3Rh/Do1rFHqO1'.=['o$iF/e7 +@)ldq:[`^EMu@4k62:!NN0ee;L%Y:M;lk7UZ9\;lW;U6BCHl"KnZ))D":k:pfdFY[ +d(L@Q:TQEA))qAiTJd6mgqh"H?l5C3"nf:6]SZoH5blBF(_AHXA,J9CE(.F$n7.DH +CcXipi#.6)LQ&.SN[qh44HA_F;L>:D(=jNP^if!$qr\nGpA8of%uDE?])F[hs>ZT\je0UF-qFWl/a3a=(%01ZdK=kg-?DS[NVf_K68j'JAE;=eB$e5,)k +*)_3nSG\')nitSY350b?n-a%P_+=)q,^RtHpmLCJK%?k&pSTraYg?;af`!0J6X_oR +>9(I)H""qPRY_:W;sgPa,NB-_5,q$g3)NBbTSl_@H?2[-\W,A=*?SG.]HlJ!+aFYY +LLZNpNAJ>GT&0J;NT)3Ih;N./&8_@Bf`*GQSG*^6jj.#_^ki\n(PH!nfJYBBHQX1K +g$]b%]n^7n?qm-YVO./%YMH'pcHObnHp]MKY.V@WA5KS2#T1FYVIs=mLd7mk6-f*k +]9!/VQ$`_g4R3GT^Sf6>?hIPb*$_ATHg>mqAQKr%2.R:]##hJj&opHdbN+eJ2)aRD +d)d9rZ+b4\"4`;;rYl-@PK^2)8B1:\mW"2JpLn1I!=SP/&=/rgJZBU*?OcIRA.9sR +aQ"uP`RD4mCO4.%R3bZm\QbELK(Vn.ZK6%$9im!HIMAmNao^JFX(g9p3+M.p^BaTA +,4[0:DN-J[C=jk77dmuL`G3?kGC^p*`(`tqV56aakKY=MTlQ/,7Ztb]5\(+W!1*?#f%'KT!\cq=.C/34h3A`L'`]#pEcK>\ps2F[' +RB.i]7hP6E'X,tTA&!m_r[%n,G<3?r\OWlKd74F?RokOU30&l&f"b[CZlOn'%*o=I:]U;D<9T6gI9A:Qch5r%ip%C;Vk/P&1BYa +gsh`m9Q`fi&@@KH[D:l%gl?_"l2EDO!\GK\\0!4iCp5a+m[R^DI +W]#VpP!+^eD\l[@uB9kic@9)o=$'s9OX!ZEQ)jDC9[]dn<@+2S`TgA">!0:>:]aVn +.YoplrF`k_uS'&"4jBZK'(L21,M#US8nQ/l`432,4!-mXn7.!Y\4ad:-nInC!Y6CV +JK9"[lJNLHI)j'bj\7MbCWr]Vn^ZO2'4h[bCU#nN&Cl3r+krNrXIW^!.n-s1B.?+Q +2%QB9)d8%GbePg<]a*^-BG.6NqS`*2jhe3FVq;err@YJJ&)CS&q7s[[J0%LiST8HS +i+4Nf>K7TFRKiG?0[DlH6I'kO^?mB!Jlj(]m8m'!e-9_.[Zfd<0 +\FAQ%P.BnrLq!agi(i7p.tGsih)$6*,e"el+Ru'SYWiWTm?Y<#u03<7hYh%$:]e+3 +B1#8$"?0'ah;WPrrDBdCZ9b9BO;(\BpnV`4%F/Mpu]lX_?#V$1rYTd"7e/lF>uBZ# +Nr#='?C\70&F.a"Yr55.+jcM0RJ3-O2AS[i+J$u&pRdDr7A\"]HQ;7!"aAdgg9f"( +0^S!g6\,ORp^+7$+U^"+mA951Q9r7hBDikrr?JpFA'+4rrBj\NlLoA;f45%-UP&YG +)V8\AL0feNM)ej;uuJiSh:j'.*TSR`]4:=d[MT)Q%4uaWoS\U(%h7fL%.7uAap;KD +)so72rWr=h[asp46;XfIh;Cdhc$nF!iL&iEOd6D+GM,2@,eTUplYFu-g\sS=[hiWj +.Q1,F5cG@D)E."4fdg*\tOoc-#6pAq(78T/dTO*iA:T+S.dI)%NU)>)!@Qk-:C9T` +DLf;Q>S5#5@e[EHn"RRML7rZC@;].dp1:<]J4O5R(aKg;UY-b=!\7g\WT?^[K&i>5 +FA(-L#D.X5PQVX^u'\B!4C_^'F2FF#/%A6`f]3J&8;pRL-810&Dp`..f_>XRMIt.O +gc1S[W*5f!MBs]elYQXXG!343N8Z%3Q,GJFlt`fl,!B"i7-Z;b"+j`pk'N&_(4Nua +j,4jT>JEBA1)Jf0A3C0A2OddQYoaW-hRMTB8@O:D1:Eg^"uPK +"M^XF,jo9q2gMEE/Y8dqH$JQ!t!=k]XEk&D8_(Jq([M/XWOoor"*f)n%fNp56nPGX +^fC]9^rSHg$=Z@6IRG:d#6sErRhNZV?bA7o2#-,rrDs/TAdQ_'F4?+rLuC^nK2*-Y +*5^[,h?#N8=N5bN]HN;rm]FLp=qI!#L$4G%DW(3F.A[!r5mB0":WZ&(",sq4]IJ7P +/c<1D!otD"]]/A5X(J3!;o7b!/!d*#C&nXqX1I-`6XAXWG*'uWmY5,8P4H,TGG +VfH\Me!l?=3i^i(2X98HhG@,^jj1*J)K.$!<3&84T>CjrG1D"Jc6g;n&.8YQ`B;]H +rc\h<`.SV>hqmPQh$eNAfJoDA7GTNH-bS!T:eIr[cV3Jn^`4NAVcJoj.F>hq\+6ZN +^*]:p8qrU@sIR4q&&;d`Hn0CDu2IZqcA6qILGq#WG8m\27JG2>0]dN@9Hpmf87se0K[!YRLAW't<-0'\2i#/oF:^9 +T7^-n1`)!BDpQ\g\qK1rr<2cdD+V;hmMUAnB8j9,h2`@@A\9Eo>E//@;-J#mj*)g_ +N>S$=TT[&R%>/Q!KLgqj84g"*B/4oU1Xr0EVHg;X$]LJ3:9.!"+Wna#;uA6qg8>C_ +6,]2Z+oXnnH7cHLH[2&*\r;h>NBesgF46s`iTH/u8nr9O3Yn:1?IbP#cA(PZ>Gr$gQLD +![j#7iL8UEUHE[O1DHFomc`a(W4Fgpc+gn%GkfFN*d!jpgW)*L;bcac[)l"B(L#S! +&44iN^Wqs,/1Sf>c`fGIVoTdC#UX'gLO@s\P>buJ[,!!+/OHc;h)Ugrr?\YK`s:b@ +0lps07b>i.FVgd;^hgN>N+HI4/O#kDEpb76Os%WT8h`)^%^Y+Ikpg:X\KVH90di +]r\Bqn(=#duJA_!RNa5UOdca?@kLhUC^M+[2"B4&95e#`V!IJ?1hQ\p52> +"`f'ho7i1cu%m/gb_'0^O9T(OT">4mH6pnHBX;OaYgC`m:5[@in@UFnTWuW&5.^gO +2cL@X06YVP2Xf>kX-d%'47o/?gqb=Jp'%QL&4JU&i8bO!#tna5pWB&Y+!9Pk/[Dl5A&+=!5OGpU&P+#+8?upVuH`#$ +Lf-rp&>!lGi$W]n9?b.2guL5hb]<.Q$6iBlAZI. +_mgZUgu4B\PLk5rX+q\\,H]OnA=q:5I0.RT]oV`rh.uHn6U?_*C<8eO\iG)6^1I8UIrF5$+7N3))e_:im58>1Qo,ro=\kr"c/IJ%o](!$Y +)[tY\jnBqd>bX\DHj8gebu.*i1*"I5@n18g1]@^oU'aF:AVs&)gc+fc=pZ_8UQ)?J +>XX$j'F14h[?JQ\@#6)aFV`i(a+cukA"! +s2N>Ba7AQhLI)#-9HI"0%4&p#r8qacuWBFgS4M +,mKS4hQnHbJ9<7\O4uJaIj%GQbn&i-kC+ocNA1HWlq&Lb:lms<_cHZ)`[O/YB8C2@ +/g3KG[jI?:tI)"L=4U28Fg!1Rn'Y4>i(J;/U3>qf'e%GMk)'c.+lOMNSa_rTUi`)J +3:R/6FMI:$s-&]IV'67572,oe[$fW[G#I;@UmaZf<)2'&:[2k[kZuNTT@T^>Hmp*4CWra_B_Wk +Ul3T/e-9T@9`e6.tPe/?13i]QF?QQDZkcZm9kmWcNK2>lWgoU(KL6JOkKN4b$?W8a +Ssq3?'3?g#Z+L",EdE*A`C`kLV\$W>GTN6B7"dHH/mJ+4:=XS4s'KM!+[.!o.PMkWkQR8'Z% +tg/dc+f+J$fR$2:JfNJ/NK!R&Il^]b,c6ba)XG&9R0=N8K#N:HjBZO"<.:?Jmin.r +X+qN:PmpLpof1GC!h0+b0'_a:S-!HNRE#_&dJMo?%F]-N0B_(Dtkj_!;mEN_B6!^n +%a:"J\&%AA\%T$ictA[Y0V64m'b"eO[bNY+i8b@q2fRUKB`G"(]Ferrr<5In-Ak*+ +8-QA[t+JYB1ne9a%&dn(?\LTNgD&^g;H^6&Tj)X.ab9%oYsuc:)/M5%:$0nAlO%$- +:_uT-R\R6^N'8Ri3@e$5d,i*n5#\O,VP"'+a?TOSPS5mKkJgY>u@dNMUph5^Ok<&EBjq/gR!;%a5`WV5A-%6E +dSGngYk@7C!1U9]J$EiCCqkoV'L,!Efq.B+FMT4aiVBVcQ(ORY,lr1nZ?^>^p<6KZ +*;?=i[D>//ckn[!.R:\chnfIiD10C5pqB!/`JDofY$Fs4I/Wa4HL0H&/ELB#EY;ui +uL[o:AD0q!!V?[R/[/&0A1urSf7,PMKN28>e>Mj>2&9\>ag)cfmf:JK5`=*,:m+d4 +$g\#ik/Xt$"s8<#4$XRrMokt@6]G&'>>dYIP2V;N&2sU/,MtRdO56W:.0J?!K-W4O +.YoZ:[J&LX7gB"ritBC%i%[q*A9aj][Pu/ClN*&u%#*Xr*i+0_[@'[ttnl +q-/QHbt(FM**5[petJ1O'^7W%8Tts9fWd)Yg!e>0.bsj?>#R]:*#09(&#\cDtke0_ +#FCj*X%O.d68iNB>eskn,EA]dC757*n,jA8]`3Irr=PH[f6>Z:]CF2$++X*'B&V94 +t(m,\u)1%kr7#Gl*KW?pMFD]Ub"9c7ZKnZ3\`q31X@3)mB=11?hcRthuN93fm%F*e +ZG2P[TU"0V(is-VoA+VR^Kklier0,?"Up=)(e-`gUI[)FNo8:Hmnrc4pV)2+7NAS! +pfjdZj*4sC)T:=<;oFU7GPKoD&9]2cl:NK/8ndhV^(C]=A;Q13shH +ijk@i?''7hT";GMI3Xi,Vg4gBe#pa'%fCGRf(5+!.oTIa>^m':p8Wcia.35=87Qh) +Pr4@HoYZ?6m<12.%a>J?&Si8TUR38NiX1g!;[r>%Q43i4r4',rr@XGHpZ7F&:!f`h +Bge5eMK@T/8Qt?=eme;G3pHgrXb`ch(T:f4*QA2BU;V$ZK<"#Q$7=eWlt_.O4M'l^ +Yljkn4TC-5I+)_'!oVB0_e/6hH4OH4nap:OPN"2/;qAtUc=(-.K4f +qlSR1i's")_kY[WC,OU0E)8#X(D;2"YBFH-=IfOLc24["._LJ!VqgA)Y%a%ShIbOZ +11mqnKtMdWG6W\MHWDc2)Tq;A/=mD5b^]VrQkfp._BsUW`q'Dlp#!$XPSE[?OIO_V +1tiH!!u*'OO::5-Z#3e,9M,Z=oe,#!SGS2iVQaF'r%!?OuX,/$B[/qKB^X0K7C_I5 +IDlVT@iK'qscV%rr?cZ(?o-5cn>5(F/Hd'W5"Z%QS!IkJe6hs.'14.!;]d7%3$q-W +Yr.,W*TRrBDt)+l]6GFh*:CHrrDCGi(r+Fp7$e[P+:;RkF1.pgrLc!/j)2Qp8N;:J8"EDtQQ2=KX6`$nR?HgoSnVOF4et, +6O.\J3QTtce>_akD&B2.CJU[Bi^OK,FP[@la^/]g3HY.`arNm)pg;Wm9^3FgZ$8,1 +iN.K8&O'ZY-4b[$h"EUKk-c8:rR3k4D$jMDaqg)1',09GHYZSdJj1LKCJ'k#N;WRD +iMLG4tcW*8@=].De#a2OND>YPUVcR&rAB>Jfd.(C\"+XO8KU@0+@j\_-&lTq_raU` +-rlW4ra9h9T*#Ze?+pV[OA*9TF,cgHiihTf8=^A'PZ"Zf5^`?OV)ZG(',+eq28b`#@,mDC +d7E)GJ]=A`08O+mta.k[$+FF<_KDDD(b7PFZD$!d\@FN(bA8Ec#[56J)K*&8&7@sn +HQ>hLZ>k"R5F[be5FUrdc-]>@>MAIa,RX`7TUGJTF\9Ai/@1$F2Qn>=,(g("?)l^D +55tE5V-DfNNGiH^M/`h?bO7p1"*e<4tG&Ze`<2tdoBl!FuOC@\EfcV[=/7._'m(VO +.,P8'dr]r*uBAVHr]]dJF2F4\^PZ&5=T?=Y((Kh,^Y-+0Cac(]UX&7E'As+5N(8!* +,,2VVP!@uj1ucX$DqOF4ZZ_afnher7(Z_ia".TQ4IQ9H&,lnXidV=@b6>UE5]\5O`e;mDWZ+S+]1srXF*UrM8s2`J^"N: +eOHJ6O&B_,/!$k0Rd0cnu]cp?,>=WKd+5hrr@Y&J&+>HIJY#^GPHC?:YH'6+,(fR5 +8FFQV#E![di-rh6+;P(/)LSu/-$YDAI!0\3hO]9O)sPUipO3gi@bp\?8M*MO*<4KU +MJSJe%=LOn:?F\9d@;iYnG-V#TEiRhJtkE-iOFEqZgJX_*GbM."!hLaXs->Zo\Z1' +6pES&Wuc-52?Sd[P/b:MF=3^j38h:MZ/2,!8rDL+7T:1Jc>^[m;##_HYX@][BGH@/ +tUH:1;"rV8MWm#"Hl6!"+eo9q>UHp!!MNc!.k=NC9d`!T_PGDO,-t(K=k"?r?(o64 +?7P^>U8WK6Tr,reD=ZnRPVUO+]N*odu9k3p,E!OJpVsp+7N.2!U;j*p^-!8DZFM*/ +u8/8W;kE'lI3?TEk)dk)N#Ue`s]mL@j!!S&FQ@\%Fg +3<6m4u+W.g-:M7opM"*"Q"5TW?;ep07f]TYFk^trr<2irr@Y$rm(@`RABURp4Lfd4 +XEdF0f@gc/BM_3OKk!+D]oI4o3'_/F45^2chnKdi@""7q`fHrn/dkl;"(RR!49b?(Zh)[3c>VCJK#Rsc=#EmkY?JR2:cRC!:WaEgWF::o +6rFY3i:8,&GV^V+oi^/+ZchETFZ&B!.kp_0%,1]GXLN!Q\-o5gRCo1i[r`X2til0" +BSL"1F9P+"<`9)4Ru)0?[,!N4K7XRcNif`nO*#tpo.c`/JnBmfd#^U9CW*gplaV`K +?.9l(rjtF-,ah?Fto7.<:3RHkTT9Z5DEMJ5N&KS&52t'`Es;X(i-^;Yn1%pqq$\lF +O%Ykl6Ec-N^8enF!*I+-j.$[!.t4NGW*IY*tZ1t+73cRLtMW2Ye#Tt"Nng,6@CYAE +S)3.':LM>P5oTh@J\UIhu:ZZFdm/2"C:7.E62TBT +I5`X87PXckF"H:`RR7QNQ"2eZ90M6J&,._9B"&%]m0GbdoPI>Pc<-f!UsUZcS-:u>a&?=WI_pTAr +rDFrX*A!l>(?G`Mo.77)N!uMe+NMo$TKc5Z.'>&R';li[ZDaRMO"5N!)F:0p$_eo- +h_M?j$2qWnD7mP1T/-/nFOU7m\k])fq:o9o@P"0&cUBZNdmY8!k4HR>'F/qVp%'6)cQGo12r +`8u5oAANn6$s+`c2RbqRm3"6?:5IX2YKCQ7r?G+ZMi>C(OJso-+g +9*QkjL8gJbi`p4?S1#n=oeM,rr@YBBi][&rr@Z$rl1kRWg)7Jd%/_`P'Em! +,r1g5l1M. +d@PFfm,BJ]QXY0Lk-hE0,JH_PE%0cotTFt+0ria.Z[0M4t,+AgeB:D8S_aS/20&"C +m%4bW7g26kE/"Nano=j1:?Xjm*Xk\2D$i@BlA)4\.F(Z1.dGb#8Qacr"(C:mH;Cs5Y1l3*aK:#TUh6@L&ANg>Q]-=6*./:kcS]mf# +h)&[,`2U#KDtq(1roN)8&gfA!VEEGj?LYui;We0N\?U6?OOLQXZ`J(D4n>6WQ*\:8 +<7MJ>l9N0[NRWN3Q>sj%I4feBsOrlnc\O6G,g*@O\msN0Jl +X/*_r"l-F4r3W(r#8M7Bg2amUsT#gAT-P(ZI>$nI>pIum5IF5rafYh^o?N`(`9I=K +rth#pM>Beo::@Oa#!f#cCE;CU@1N1h2Wre!l%_;*o/=3>e@hWe.p9s%4g6$Lb@)+q +ToBH'(-T5:I2rlQGLi^0M(8`<:Mo:.k+ILk;bYR[.6VcLsRZ4Un$Rt'&uT2B[u31J +hh:/n$/uJ%E>;IdtV(G]85s$rr?0/9#C,bjt&hZ`rX:)+'_j5KnFkkfbk-[DPPL'& +"HH$p"fWJ"q +#!R/Wl#/u`I+rj!!K7iXknX+13b;I'M2`5G]dK*I%QSe)l\B*4Td7*J%K&cZ,m6BS +=0HU[/U,YRm1K1'n4bA$[`'7rr@Z@8Z6lop@i]qS?@_Bk"4TV7;!c2m0&B0/*Dug2 +llo`q>3GV`4te<\@c\U8,*F0%es3<%-lPjgL\lOV_9moBOamZ:0;/NPLOU(S6+rnr +"L>Z?P!'?pb/gX9+4$nf3U#P84"06S=eb"ccgVRqUa4/b*#t]DqbC7ERV#i>'X.;7 +H8Sc*gQQKrr<1bn[[5#Dnk"97D$";L2@"<7^[t=)0qqmHBWAt!K_gnIPps>2b +Wn6(aEcJn3q@T@YKbDg,R'\[nCM$S(Q!"i\@A!na(N9[9`65Dm)X,)!-Hp'c8'[e4 +g@6mhu"IrV5CNt!!HO$cQ(>X_CKsN^s>?6YdcoK>lGK9^Zk4sf*gn+N.8X&Io2j-E +MU/F!.ltRDV`A294E-^:[inN.Z7%+/,mf^\BWop +3tit!"kTBn/@A6:hopC\V*K4%:pI`DP_`j"-<6SR_M_7i6g`jIb_[Ng]R-B(-H*a: +m:f*"88Mh$6O4OiJbEgNc8=],oGog12m\E?a5$[T@l$ZZFb$snF`G`HCQ9nIbPVGW +rC2U0S2UkHW;:RLll\<6X!j%M(/nk%OKsB;bT]lWWhD0 +``+S!B$56#PXi"r'QQ;)J.:9YO5bT!;Qm!#R-mk.]BS.U-=YdfBCJ>59iN#f0q`V#J0d*k'K<2M!_k7/VnL#G%.``a!40P<@I4r?VJXH_H)hhtc?kMTrG1rtiQ$R(]Qs$[_g3k[C +q#UD)SLlt*O1[N2iTEU$IK"B-KtB_W6S@+Gg1Zgrr<9;rnWmT[?p:PWp,ruln`l.i +7p-`G/dC7MW44N[4@AuL;U#q07D6l]u>GmJ&)Qn!8rmO')do@%X9ehLW1tV,l[i`p +!#@tDC<)<+RmTV,fl:;d:C9;W=pOq1AoE`k7dsn&t3L=nE@66,`NqPncC:k,MN^`! +S@fj(%Ipo&I-fJ&)!;h! +5TIEgO'e3O)8j9$pHkh(f?;OY!545_LOhmGeD,r%QPeI#O,S"rrBlKHn2)[58V(GS +%W5h>\X3<&YPEu,*:t;#UJsp89'[T/+7\@Wr1Zk^)d4RK$;*L`4rWhQKkX1n?M@XZ +89>5,MT,"!;gfu=7)07_ZsR63c303(8kp:>cD:uN+@Ni&Pnu2B9@u=\Hh`(^o,ErH +KU.cp`KJ@;kWAY(PBJ9#^eA(8#II(=uYnj&TB+a@YSsicjZO=qnTu^7a=7@21/R,! +!Hc<)JhXF">$=m57t'ZP_)FWbK_X*fZL!,*1%Yl#Npm?([o2k^*TEF?+@Y&9dZ(oF +%s2t"/>o-8-F,9!$9\e%6AdD1(H<\o]aVJ/,oSQc\(V6)#+1Kf^aJ>C!F?4!d3saliE\[s?I&[,G"L6Ag7.Bri(u['7]O=8jHV.?pf_]H@F#X,G"c>S4ghA+M[;>)D6r +^'ffQ[dqf,qT&rCekE9-(kTo4 +hHa#a7I./1m6";LVM!ZVb]W5H)&A?BY!W?b$'nk)]:Cs/DEop&%+dp7*9s0>[,p-^ +2.S'+=b$S@U=iZ2'0@iO%GliP">M]#g+kIkHXF!!*&`30HL`o9GR/eI=#S?mJd0=E +dT+)q!\1hUZ)/9iWbC=CGltI%^lPKrN]37i0K'l`WTg`Z0@HZ$%+1\[t3F]?]sFdr +r@QVqqM)Z\!tM>!.q_*/1:qTBj0LE4oYN0m>plr!VESn'SH*'n.10O!8tI2!]4,"% +d;=80?:Q5F;I+_MV1nM6q"^DLQ$1>Z&#i7lsEB`+n:os&R4sHnRfLRAb^1TVGA-`` +7"(MZ\^RRN$96_h"qHS\,H`"i)eDmi2ZeWZ<)i^9$;/4hrrDg@n,*cuiVroF5PlYh4tZR&-\uY_h+pn];]L#JOhi#Y1hm::=Fm"9,hM>M` +D?:VIN^\l)KimSrrCM+Y6b..Jm56Lq]"b*fu5Eek,!Ji,\8OCVdm6sJY"io%hemBL +jD5i=a4h257^?F]ftH78kF.7i7uK4H!,->\8fhPnd^l`!!J8MAqBs^"`07XpP5oa8 +Z2=hG[7_5hTBf(0jH=b>!apYQ?(X@,ZjC*:]u<'4Cc'PXTTE*rrDOgag^'D0h1\c>15q!8t(Gn4a9TfcTo^e\3J[4n3`QFfV,CKNYC!3>LR/1M)FbM:;B>Kh%I +O4NeX5b_F+8BUB[;N'dG,N4TSie?[BBX:^aim)!/%#lWL!4aF5cF^'Q,J +@]9;HUM`KO"OB2!)5D'\*KR2#Dr4j:\_Eu.q-bhAJ:^5pt4d!XUQk'@_j'Kh_FIXX87$um38n=AX!aF#[HPM!;HKnfIQ[G^AW]^H +*6q+7I\lrihY.AcC6Dnh+`Nq0McSfnOeHHSY\rK2ZQn!`p`[PpV\`=ZfBA^] +Q*J@m58"Y!THa(HJZriH"BXAop*Ui'eHF/qAnd2pR$W[t!=r?aLpAe*s!iI +u(6li2#3H\a_>-/hH"1.7T4BVC_0Jng<$,/;sfQLLZBKp4)iiGO:gq*.HDo%Ib\$l +k/1knE5^G25a`'ofOT[Nc&sfD^)4EBG0^#UMucKblDL._*Ln-WJell\R8I@2*6:7K]spN_bbrq\U[8F/P*o(bGoBDec +8*?a@pNUD$-AiEI`jeP!6+$oc(rMtj68VmOGRmqEAYh)9m:V%o$p1>I +k;e)-tQWlPFmaa@#jAW6A]1_dDd&iJ1)Ah8tXrOH[F4FnH+6b14Le1O^a-NK#.O13 +"3F.I;6E@!!.X1+,*.]B +TRq7q`lT:fGGb-k,`7Q?*3HF.^=j[lOeUnT[Q,Z +LB)`Md+bCZ]Z`=Nh"\A,`r?tmi_cT0I2VImp?9J_E[Nj&,7O8_iOR?n%uhpJ$imPB +/bb@%h;aql]Fcs/$#P5p+uh?(GS6E^H_7C+QRUgGP])P('jgFQf66kGbuR9RXUNrl +WU0HH"Uc/h>tBI1sZO0M^(PT*S;7f%pgXcfBg!H!!`o0,Q3As!,!l>^gFH*g>2L]X +R<50cJ$Rk;UK>lEp.&F-XpMBJfEk:J9!1**s7#/_&i`+<0dumNtgi^HQ'+hYuufaF +2l3FNXn#B1&E[)!5WHY5M7^`9^pYbHi`_`iAZTU>GpHGT08^Lm,Zll=eTBV55Wbg"B +OT*b&WMs-@CUX1#H`Kl;1ENQ"THgJ!V!M;_2GAKgC5%`e>JUW>2RP8^f])-Gq*jjY +uj%Wr#L@Xl1LT37CMtcj.-(B.g`E)WM^[Pg^tL20V$5,#WTt]4i"7gIr8Wg.!P#XF +o,Km&(^a\A3FR#[a6jl&]K+W_.09I8#P-EmeKkVA.%:"kA[*`%S&D@?aZNHYP9EQm +E;M6lB\%S1iJ/\L66T*l;q.jL9C1Eok6g<`i/A0E#aW(!hM3#ae00E[GUa=BAqtN] +3/i3'%ChGOe*GPCA+T(4CC-1^@?=o!5VgG?eEujpVjlca!=jVNMq4rZ +G4r^]A)GUNJlKEgRFu^1V,GbPYcT"HU]q&H4RsO(B4BN.'L>blJ;rUpks+sM)>!;T +%h7c4r_#Af68#=jfJI^Ah.u"RjJnO$G>9tOn0[m&I\<\rL#l]O,JK#mlta>Bm$6:= +)_F>G?:!Gf,CVrNAO'r7iSgDU))2F+Cq`^!eu4hmf*9=_10:A4op,cTC>K\M;A@0, +Hc9WrrC#ArM@38XB/^J]@5f2dV.]b%5NHjJCl.?)!'<-VP1"9L6$\*o/(2nT5R%]b +C4]>f.ZnLhu"4Up+QB;5@r`0?Of;3h[c.Q;6+C([lQ1#D#?3bei,PIj`>1"Puis21 +s)#5N:,H4+QN"L`;V$de208NCp##,lS:p:mHPNAo)aG'T8e=./q+3'k1`GVFZ;6=o +j&M2f-E&e@i!sX +fSe`^tA](6fini+#'iri"s=k+5s-b6h&RCHJR\edkji5=m?gOR"+UEu6 +U2YVm7Zs?:\[fa:&*V`hA3[q].H6Gb".\sUNErqpG-1,O@Pd].-oV.X7%/*2/D4?K +t\4LftS/;4stT-9(;emf7Mt5.;u?l1!'@pDj@b_HfLRmfC;)Dk^7a;STe>j[7%U#VJ9EKK +$MO%`#"Ni6$"g=9'm6Jh^MrlN(7+b5Td%Vn5;;u9Mk0%>A_cNr4f^,kbZG<0?.*L5H^g8#a1&P8FXj[H/`;Uj&C]t3G6:jE9eU0=Q=8pS'%e*9l((]?kX/YF9B +$X6"-dsq7R%tA4@e5rWKT*GD,]\Bf&5ECUZp,NpAIW,9@p]rJ"hNU$L&6"Dh6c.Qp +*:0g^+K;]]LhT;=oSJR^O-^ac%Yo.]8q_2+Ro@!eR4F:"G1EBo,0h"gC?J1[h*d$c +SP\!?)@I8n87"::hfn\nAW>t.@AOH;?nrW1.]=R1!NGQcPC4q57_nKSPrM:@'U\n_ +`[C1)PXF"gugZc?6u?D)#]]l-^?eUUAPUfb(:L"][gR9HSut=oVruN5A!^Ecc1GAH +pMX%4s!(^2Id0H\u\br?"7K+QP*dOJ08rbq%s#;XntK`)Yh/=>=Q("KtIRJJA)or5>-6!eZ9h3k +>o3X:e]m"9GkU*;'HI(Ilud%1',Pt!5UQW)X0FMrOI@nh#(ZKm2cecHqe1PCY)Y:5 +Pe!I];&%iqSMu5<3Nodo+oY>rEOSg`S+s^,F2[H?eF8O*3YiIE0A865fuXq4'1A]V +u.25>lB\i:Y@BinJ.!ui]iCrBDrQkUR+#9b`^!t0grX^U.#/$H4nQ3O)f_G49PT`" +AeugIN.!H>PN,%nO,$QHStHe-]2j$Bl55/BdDFQWh>YeGT:=G5-h]18>:C4j@J6`9 +1^?^$Q=P98aV(m?P7k)(;*eGG_a)l(G.a,HYmmV5!$6c!]Sp*5j/8DO7"`$L?NSl^ +='dSPJ7V"Y7'X,9H(si.8s(RW@ZmQ]QT,K+5O5j2ThfnTLg/F?QO^5$3(!;>K>SDQc>UD:C^]\C24II-VfOsV=,"m- +d11n86c3]ida6rmNJ$'^G6Qg8L1OnT//IC#IZ*ao,Ybulj)i`(jH_n#mmPX3kS>KT +A")SKc4bZ)7-Pq?3t#JTR,jo0oYi<9eM8-?_`N;)7GL1^Rq!6rX[5eqS9 +j6E(b:dgtXBA'5E,jHZ3$7o@>!Zl_J(dZ:$_+bXM"@$YIrr[bN,dH,p5iRBSkaM7^ +E3CTi/.I6!VQHmN;Am]/$B6V;ttq%?#r?`rrB=lDQIaC2rrC$]bD/mddk7"[[iBq,TFa-'8(N2SAH)X^LbD5cn4V]9a +bi+&58A9P./a3magoa'"1Xr=Ed4e&d,i0*6NBCm%RB8cP2Gb9:Onnk_QS]d$SME$r +)N:MO6o&(itsm8p\OUp3I@q-m\hc/pJl$^R$^a"1m+m"s^W6j!P@%L625j8KAb!+GhqA ++:PZYf-Me@Mj<*0On=Jq^_H'a5l-*@JH%4X>W!1[SXlsUgp$:MYV2a$aK4T`h+1I9 +@A1mY3R,4D[,L%:2NHE[k2ja8&6n#2D@,4-_>9?BEN2P$;GiT5INM(jC3uOJG`$r@ +:R(g:YVR*fCNkKnH\t92C6-$_B8^j[JSSU!!OLLnP@"dg69E/Hqs4/WT/`Fn5"jF9 +%m6&X_/0sfiWraI)%Nk??,V@_1.5.*sPhWYLoKQ5P<-3!^@C<(#R"?DE6fho51VYG +iUJ$*.Bn4Q"Tm--'*a`3CAI^JI[HuH/buOSofbJO,+\6H""+i[r]%R>KU3'l?[o%9 +>u]>4RZnYma&Ha5OaD#^[HTKS94Y9pG`!hV/k.Zn5rJ@b,^XV^ +9i[JI?G9B/)d[bpc];#g2WV0ao;?]^5)^gJn"Miibs?si1`FGFV!-b7aq92nIdjcP +=s=WjRTE1'l-bAKU,El![S6b8'Ctr1]dKCrr<3HdjM^+!.ouTc$'.$D\fj`Oj4nb+ +T=XXkU=Z]^,k[>pa>rUrn62:#K(J@^C>R1qfhrte,CHDpiB:cV'UbBU=Sjr(3Wa(k +?tg@^_e%me/tsAr"iGp?gS/6%^2[Wc5OHVr""4U8SrD*h$W)ZC#pRUOL/g10,nfN: +$[AH/b4E&dgq>4/cHL[Q:m1:/sgZ^Nl0"Sq;;/WnTSuRrkl<0g9n<]19ecjMW2Bc:\ZEQpVW&GHB^@\#'lleik5r@bnV@#Vrr?-irrDs3NoT,#M>e<,p +:@DhiV(Z#_G`qkX'*GB9??'+o>7)d_&Uf,m;,UO0-6["jSo5T/hQ;8^YkW22S!6K+ +FA:f&L'XAi8nt(CZeJ$J&0@_+,RB[B"t\(a'C=U0)&Sp*!7+0$$Y-cMpqg\aVEn:! +:Wr`par\'^M=A5,@:.hi'.ToZbh$LMIV_6g:"=%5#&OcT.s1_Z]IW]@!\Cm",-[SK +;8&E+SZ]K/*^sSBrR(Ema7odM0uM2Un1^P9(.`Y*i]`cr4ggbRP3@XGrpYThY`?'4 +Nua8gA_0B>Yk,C(W1aW]AVT5q/,URqcnU^GUh/4cWm]fZ]a*GZ*m3>)og!D3XeQ4j +[nVVrrE$)9cs9J) +rpq&i;%b:rX=]Ue)']`;/*(Uo!e+e='u$eZeqW7c@2Yh\Nf$)+o1gf3>1=8&orGlGe<8 ++"Y"+aEnC:Q+?nG+LMBg.`n9ApDcLNPi5OO%l\4#REPl25->U-DQ\m[(i +rT"*'ql)-N0')T]TrY8YF+!mI[kj$a3tdF2Y.Xc)(atCid`E`/rT`0WX98(RN?1Yo +,T%XE*VhN%;]85^M/fs4@%qi?NAWact?dmaoo3XK7'ILcV2[i$V,Co,KgFh5C9M>d +&l.tX*C/*pCaK=XuA$:q:;qP'Y/mfn>`f'OE*R^>g^2C,3i?Y>SuKFi\7;@A5F*_j +3iHB=2/1ipbe)`p;d,nIN*Z5*uhU>!PEcQgZqaOWT!V">9bWc0eA$0@(_Gemf">Y_ +4D%n:BbP1[AWBsW605L3d[g#IgeXGZ6M%36hE@Y(cD.orr<0OROc/J,PUQqer1S%K +5D3]UB!Xl^uSSFh[lkaVss]d?@d&XrANdjH?0aW!<-<>AInPogZ.2YET&p*8)R*/^ +tNFSK04=g^8lN/2=&9)Y,c7TQU%@]bg&N-^upbkrL#n.dN=Ht4RmWOXZpMA([/UC1 +sIO[l+2V:MldG:M`<8D=Uhqj`$2` +ubDM:f-3O'=\<7V1Te\Vm#&d77e.!fXlBM+bTS +T!W7)"Lc4,C/+e"9K$^;A!Qc9QVOmo<4.'i0Jg%O2J^Jrr?`ufV9kH^,pKurY)QB5 +@"1E!VkdRIXf2:hCnhaIq9]BHs"sK0R-C3p3m=s`Uq`$G^er'k3W8%Z".X:r/K:u/Yi(d+j4fIjZ2Xg^^Cun4!.m7ZIk$E=]JCan#'#u9C\_PJN +;]XN+H0RJJ+<+q*%:;8R*l2'q2dP%aNaeXkCLl_d68B%pli`Z-\o&e12;.7V/)p\K +gOI]i`1t"N;Um]MU]5!-0Clj%SY_^"-19ff(_n8^:X83HoBHUPtTqXZU]RG]0o:Tl +lu\`K"paU#jok:Emjk?\C5BbD)G!SEMqX=B/2/$%h,WTrrD*#CZ#-li0rQm8fo#P! +5VDo/U3>nT*@0f$>?a?G=YG/npPH$0hE@K1b+i!QYCh.S3[MCD9ai6.hH*,cKOYl"SDpgQ&q@a!J$`k.ItXC8nOJ7TT7ZT:C[:]/Z +1QF%JRCLcI@ri;r&r1&pcj)"G>t1&'f\i(I-mnrrCcR/[N@p!!f"pS<"6%K?nAe< +]7Yk!!^#`ef$`+2>!IDpiS9B-BY'Y`"o4T-m\;!JBe@FfC]!?N.=aOM=B8)f!OId$e3_%UqAe%]Bc]q0!7^+.X"S_UPi:u)XUJh-1GK74>-H=rZHp +h0R55N,2H1\!R#;R0Gt;/Zs>MAVe-8.o2'CBR)J4jJ8#M(I(]b[/)rkh,?3q-!"&,])f6FN3dBcJ%#:6I[%he.W^l#5+ +*5CBfM<7Xg&D$Un@Ou,6fhSN!HN&TS.k<8.h?hc:oM +ed+tPMrCR4.,KZ/s>&#Cr%*Aj!U*3k,`;O)kB%P"Q7NDU7UXBOe:3T5<6L:K +6)I9?23o`:GEg,0hA,0:?a,gO)T04I!2^@=I8b0,JAP.J&/l5gh<=f([W$tSRPW_k +=LsANl;e5qB[BPjb*?[lE[;[4X^F(hu4*$doQ5$f>7%?h*nfk.k?5#*Wi"iEUSECY +J+kjbm[9eL.#F!i$,p#rrD!;I6uf2p3?@H*SW?lHsS-nH7cblrr>CMlX-;'!XI)R$ +2M&6_isE`[@di1#2RK-=:`G0o3^i?iSg[/fAa`R'd?EbYfQ5k3To9WoY&F!9cF\p^ +uOaLq7$&4MF@!d`W#qG9!#5UB@qj20:=-k5+GFSK`;%g;1(P#O4p'me,`$`INA3@' +h:EHUD&4R=7_"4l%=4F:B^[tbEO+F.;ScGrr@YZc$-)`EO)'(q;b>,4sOJX9ulV9F +mLeVIlH6pMLWJZVrt89U$r!]9U:2a]Qjmg`_RYcOo1Y[*--T4YK9m( +bDNS6M)WM*BRcZZoh;7*ut2TD$u%b%edn5c+G0AXD\gKEp6_i18Q'"EVE7X4m2qhK +F-`7.cEo'D:/rumd'22p`X2:(]5&dp3]h_5piY5.fag%FIDnf]Rfl[aI`d\D[G;@I +G;\=No.InI0\(_.ETG:?.`7le'&A2sFCnr(R0?^OO)<*Y,OH`8@o0Ofu_DR +Vo+bb<$*ME,d2:f.]WMGoVgk]<4Xtk.a?t"5p45L>EiVd(CfC"br;=TXV7^h#p9RJ +\^!4%$$#8lX'ep!5X&)Q+sg,Su.TeG^^lO_eB&MYF&(7%!Ac$8Np-d;4M]g_LOcK! +;<8?^Yp43S%Nrl1l_\W("jZXOQ=>F_YK"5jpj_8g588?T6^$V'^9P!7m]>Kqr3BnpF +Z^0,qAB]1,8eN^cP?$Vr"c>)QWO1eJl-oEK%4.spbqfRUBN7O'7`l^8c\cfrr@Z>I +a.isrL1A8q^5Zs*:U.er$_Osn6OhrXLuP%7f@6lruTrhqPI3''ZP1Ee;raB?Daj1qQ +P'1NCE6%D9/rJQ7SlLON^I\,!OnTY^6/EqJqj:*_/MRarn@+=$*LpJn:OR4H_gE]` +0U8^Q@N:;rO8`Fl%l%)H[&DnTofpiMg9iC@]Y'qY$N*s4Al+Y"V-tc'A-H&0h&!4k +a*tSWibBt3+,4#i7I6Yr#@T`EmMc*!!rQ*8S)aS%%\R9[A%"n"DXldABTOaR71]bB +ERK0JR@nET*0O`n5Z?dVJ&1-[$bNc9\.q,Ji,UrU3"-iAV=T,3$TQ+7htV;r"VHq$ ++p'urrBl02=3'957sOIItTpsV*lnGepKF8l&EudC8$MhgrD:aa"UE0UC\:L+<3*@o +SsTr2']UQb*7s.q9TB9j7.o?A)WKg58/9fFOr)hdIj!@&A"^+[D#0VSX)1*&dOaR6 +4uam!&k;p&RVMen4q=)+HOBXg;EV?n0c-rN.*,PU3o,`0,.N:[c5V(nFSMN_-,*Mp +FZfL +k8#>+JafZ2>cS:!!^CA!5V%p&))C()pnQshb%auFmrm6LJ54c>Bs'uoVH_ccL#.NZ +'g8=Nf(cM-4Vhh!;tpVXhWfL:CV[TpbUpe(AKuNO2O]#[(D:]2L;QX`O'SgZRYtTV +VUW9n"%D`$(S#HOBDF)qe,gLp]^-liI6Ca_S'1IL;3MKG@]0-a04.Kkuo&P&K$rYg +a&5pdQ[&]6s+:.jogYC!(gPe?QY)mDo1u<,k&^S9>oH6<_2oqg=s_d.](>7-,aL9^ +fV32(*d]_kHV5PPP2E_Y<61h@X*OCBB!Hj@T`C=5_HpW-)HJg/@I?-&Y><@ +'%ch1.Mg^blJY><43Y8J.L5'KKlii_gd2$#rGE`p_1J.&j/&1T*X]NBsndqi +;;%t=qm^6D)BY6DKIomuX&fqeCMi^fb)$gC_b0JEM]^L9AL&V%VIrr?qB#2f,XdX4%cK +7&)fqE1*B--h^JbC="_4RXm*l10ZF3*&MdA7Q0cl(RuhG]7"UCG1H,,Y)irL.J(X$ +=3SfFnpXLO)nYkJ&/eKP3Cfm:.m/omno]R\C5guX!G#Eo"WLiAHN%-!Pfbn^>p5bT +:Pu^3WSs8p=9,MFFOYmUZ$C`$XOBKGa^3NnMM.pGk",YG^FJ<-!3]u'r +rDGaTQlpR.J1pnr(u&rZS.m-qq)e%p5o@\f]'O_rX/8TqlO)Chm;17%^U/P_-uA+K +u0jE>En"a'lnU2P]AfdgKRn-E3B,DrZfA^GqPBZ@-II*TBL_9pm?V7Jn4Aa_MkJTF +RRu8^)ZVamHO-Op3ue)nN-F'8&:6"Hq_o[Y8)J[qSPi*47+4`#1_L5jnkta,@H.qF +2@f?6u7pPZ'!i\p%8t?%X_nR$QBskM%DD`@`c\N$OAs0=KYsT('MfARRHFrT-r +:oV,"31?@i2Q_V[g&Vt\,H[cn_1n!?O6WUpbGM"$/`bOCDP=!&FCPi(02dlNWB.Oc +7A_I[%4@q\o!p\9$O`'IdoD$l@8d@X_QI;n417I(c8D-Hl[>-F.JsDF6e__=DY;p\ +&t,^9eHsR=O7:6co(9JYMapbFchM&hE+^+CSge6Be?OU;=MAs#pceNb_/( +bcKP335?K$%,CINQ!9"kR@.=ng8UaO7n%An*O-E^ts[i%iOS%bW]86WE\d.*n11^( +84qCNIEj?J;&AJXIrGF)NDP9^H^Z0?]R77^ouI-icX.64rsFUiX*Bh[?\D/G]"oTQ +Ga0sL(_WUOtj5"'cTdcWQ511pc%5j#_-MpLs$WP^[RQTK-$E0mVDJ'rXAf,>lN8\) +%Z[;g3CnkFUPb\rB^5Sqciib`ZMOrM$BI=?fG[X\qQ@&c#p,(CCRtA9QnT1JiT7u< +QP4iaiA:7$ha]$W:.)8fs=,p07Fdd8^nm1)I#1D9fl+1k0$U'c4'uKtN_(9sHT+6?Y08;LsV:M>a( +6taS]$G^Mqh_R&I.B4>4\>'9!-T0n[.UPOO6sXgpl^A-meD6&2Z7f_?Q]9u+10NY0 +DlNfi4k.$HmRe:mBfSGk1OV/8X9b][%*775m\Ll#Qg.hah\'+^I%8,pBg*EU_rH_]IALFQ5#IY$Ttoi+D-ZhiT(Vg`7W:-9*I6f^!Vq*B!!RrP[ +QG#Ymh:'^rr@aIWQ4"Fmfn$V4a-Z`=<.,E*nBhe^g^ot!CnBL>5Ij+J+-CoJc7h%] +oKCGCCYqR7enUClO07=q?JDH>dj7DY)St@5fi,bI.@4:"k)mNp-'VtSTV+>IqREj> +'rZG2^?C?fdkqN&% +j-%6mVR9ILS!QU+]V(TA'fOc?^78Q7h=@p6MLf_:\`Yij)+27NM:ej]91P(i +n9nT3p4h\G`CLY#_>+8-saPo1CK:HBD/0L4(\,nRB3IuXNDF[baXF7XtsFV^[O_]L +%+A7*'\1t6c\m=?.)+1-;-KU(fc1BWg<^ne6a.X]a>fh$^Y+tQ%U8n#r*Q+2H9]G%HW'WYieoBL!I#"D!5Wi.B$UK\_fM]"b4ESlbmM[m5gq'o74`D_aQg9pZd^lkp +VhL9Mu+TD.C@R^2Lc/u$A"Hg,\W8@=J4jForD9Bm!J6*`>6>F`'4_o'6O\: +B^5cZ!X_,naF7d)_gfsKF4H?@Ps'bJ-RIjfB7Y]&i]Mbn3gXQ:nQJu9CXB]HoZJLp +j9uGQJ)HXFpU8lFf^nocQ0=4#`T4UOLu2:V1+6TI`t"d/[n/cnGC$6UL91p*O#bh3 +[FcT7t8@rT=*!ur\$Xt%h!b)nO9%W5DJO-[Adff=7*4Z4L(-$X!,E_2R+uhOd5q8Y +LGeip\(6K:W+o:?52o3pt*?Cp<=B(H\ilsD5N.3b#$tTC`[BPhtT2"i2;?X-i3u/R +]"('!"8"ZG,&d3N>Bn_b/QC[b.5#dGncJCOA]$L3'F>/T+?CiIg:J-X:3tn^)`OUY +dWTNqeVJ$:33bEBEP9Jpkdt?+u@:!4TXN"'"a,q&u`S%-[,X+A,V5_2#(tGiX`s\m +4DY]br*aPCR[nnSPgtl8Rs1Y:,B8/3TP:cTJ&N>DhQ`BnQ^Gtn085nX?Wt`)mXmX^ +-)DqJoq";IM_dOn`0=onG`L.*sZJJ[YNg['#t37CNtHj(niN)i\SUX!&?VC!9a@^i +2[q41`m9VHF(!*28(X9Dtm>(-b\8MEg%Rr>Gr#%PJPQ[r9!o;amc]ii*b6Uao;@D9 +4,EJn5jP]Do+^?^+\8JIa=SrnE5LLr$_)Hp%iC2Me\U@3+0VF\(Qg+ebC6UmQ^KB1 +t'-`ft[j'0s(FMi^nNYNP7)UfMa%%a#X/"7uFk'&migqRZ(_1%e@IK2l#NK09p_7HpiB%/$q/,[/hCg?'+ +W3?UPCP]:YNMPW$s/Jp_rApiC`NKAs>9nM2a5pkh.=0(/H0l=Z.@cP0d.P +;u0lR1tc#\EYXd_9`$!.n-s3P5&tq`&Bf-]"O"DsY,XYK&])LIOLFE +X3np;Q&8,o[Ta];9op@+(LG\0[1/OcT/cMr\a;6r"CU?JG?J?lf&DTBk%pLAitF@X +AF29j]D&7QsUg5>T=6`lTcO_9,>ka&&'RS+-(YQjPTH2rr@U+fpU%jnGC-FBES!54 +R7BYn"$'JRep'Gl>bS1[J)I@'hQkgKBT'Q@fg#@1;Z/id^CpGJ*g +rcFS^!-P+."B(PRX!;1*e))t7)>7<1V&L"Ep8A.:0@5nn3-*sIi.$nn/g$:'k8[[C&8`Y.%>Z/7G7r +Su.*rrD!ZdkoWR_AM+)N8pX./\E1"CQ^P8)tNlu#('1ldYE!%mK$1(E+4n2m?hsbG.hqA#0i21[5f +6s\P5-`;Wl!L`Gn6Wdt4($Y'_iWY=B)>YioK]r/-nB6VB>E+T,gf6S_ab1.44X'OKJ3RnL;S>RXh-1u.n:!+^JWguSCrS6ul]J ++t6!r",@V-gY>Wi=Co/G+l,7X2k(oLLI]II7!^)@AJ=ShBne0iX.@G?6-?0&i5OJ# +Jn1E;\.WLp=]DO5N%e#RV0\0fj`:FIK7%0D)K'>Gj*qX)(f9-R4dIIS]%rf=]*7Y1 +!rQ3F'jk\[#HWNHA$H^cD.$XjFQ^CIr(acDo6q:Ma+L[`'4\*@8uM1^PD7Em1c&m0 +9f'>9PspHN^)56p,i&;q]+o?/sH0(GW/jrNS^^E*QO[WpBT=8Q$`4j2"QT4`3J0 +/i^.R+-qV+CTos]YM$=Z91J51t1j9QP2e+HF&;Fqjo>3n,4D"8Kiuj@q"8!Q++7X"2lf(-iYV5CuiD5$9# +K(tR28kpeji#lEnJ[4L4L%cmJ_740Jd)E7I`2#HC=bZ\2<9RYGr490"\o=M-6*rY9 +IfSQiDdH]VQR\mg\W=0$$gA5"JN^Bb#IQ^[OTT%S>Vtf]#-&o")!7W46;&o +,/eUG9484b.c>,n`sOBrrBkc]HZ2GrK23f9=T.jHH)i0N.'&*UelR2gA4+t=As=c' +h;.s"TWq(rr<45d\kSG4q=ub,!dT:D!^!(5$+1<#9LE^]rUId5Vb:$9mBb,q;@)l= +5aYkh:]mtS"f]09"S1ljA&Cb1&,Y4iEkr1LF8[k[/__to)_'DI$+F/"OaN?_oLXTO +mUpThDL`kQ(+<%NO\tqouT5YlX)RL_;5pAn=RW0NR2p12hpI5(d.*t+]9M/pS/7!@ ++ba70Rr#j;0ef'80?P:G9.%)5E]WnPl#fi%'q\2L:M`QgMsF^j8KF#&"ES!"H!)Oe +:[c$+s*W;4X">6/,;ZDAJW_!g8pVEnk%#`oE'Ok73n"?cWcb![hgLeQkeUlo:oks% +_I8HUn_@Q6,CCqi_P>uMs5^3r"!a!R`!>=-C$!Ob;8s*DkT@-Q8rfqE'!"om!lJD! +0<=BphTaZko*j%a)e#'&[F2tKaMD_[0b!:;m\gFrrBH5F7>Aee*h`Gr&^'gGj]"4` +L8KK,]C>N:q$T6oH9dOJ.pp:a4pSHGhuRUg@aRt0!OJ]JABXs:q/U2D9G+M0Cg +:pSd!8u2uZhmVtBHt!=o[3[=Pmbb4_ta63DZh/hn&5R>\C)m0]P4RN.YfLP2+s%(* +oe(ZKmo_F_4OU)!6.l`CX6o(l(@fk]q>nj5MBiuPP0@n^cBa7*RQ*Li^];Za*Q^Zi +1"=m^LH('[\0I-&R5ACk5okJdu7@Rqb=iY5A-T/97*oUF:5t1],:M"`HgqM''ii5n +Sdb_i4VKW;R>/\b;_]#BQ;)%'ER[W5$IaQp;OCQ^Yl"3Z[AT@<#<41)c"u^poh!G" +WZ.8rrBJ"Q-]@jA+k,4d1jG=oj!WNMqdir&$&P.39f:fW58K6')RWJYrMa`a%]]-p +;jA_E[\SUbdE^^mRA:lTFZoEi.b8?C&9LWZ8f^\^,XXI3jAF8hEC2l;%Lf49mgs\! +!Gs"3cFBZj(NTIdJ2m'#=$3!%VtG=!;K4d$WWt>Wa1)"WIDBRpfNi?ai4W87m4TRI +DX?YmRBc!EF0F[!5WIk_km8=P654fNF3W[cJ5!TSLa*IQ[ +^>Lm:U`Nm-UIaQWsWg`l9Ch*U[b-`mlZCNao;?kMQnY$"!/DD`c7S`"6#mI-Jb285 +O_N'g>+@BEq8P)1:f7>dT-+hIKb/I)9+JUFNo2!rr<2pZWfZh.0o6OR01+5Xb5PT) +]X?"qf*@/[m)3!*V2NL'_YWeV+ALutJ*u\gkYcfIkmc.Ah]Oc[1g4+l<` +^P=)iRQcCbrNIS@3>:SCZ@YS3(,fW_*"9jdrS%=r=-$%*.>'oA+1hZcg]$]_YS0.! +&h'Br._QZAPdZN=D-auf=cQ=rr<2@eE":@XZpPnHaX,_D\baB5i<`SJ3OHDgB&M'! +^F=^SU<6n!!KQo-gc]d<$[V2BCSr!E^o3eV&;L`57.D^chK,?MeB,9K'qU98Z)D&n +TkSA0OAf0Y#G&f&cSWMrPn:isa(A]Ak?RPN*p*h7()ofr?d_G;EU$H)?Vf^\tA$&,kfOl$NACZ,3mcf&/:P +E3(;f_,&Ul$rIRA`)2@!8sl,!aad`LKb@BE%l.t#PF`#fPgOEq7j;N,(@c0pPUP+` +T#iskbBG]?<_FEN/tun +59E:_a6TGUqa5%mL^./X%0[Ji_0U=c_9ZcC&n+EdMGJ^EVWi,f8+pm:h&8\!!Mog_ +?,"9ph&]Lh$5=[=1Q:&j9Igu`4t6+nI+g<)rgh.PDbJ0?:W%B;\T9-C&\/AL.4JXEi$QMg^!SWLV>'"ZX;sPGZ;2\/JK<9" +XbJbf-e7[Z2Xe-nG$juphs=6PPduSD:Q9jn>7-V6*^!GZ'O.c@J'G%hjo-@iX*Q7c +)gX11pKI]KK)+USt1XO!9SAP=&?Es'*J]6.c;`U%c\dkU#@\Ti>]**P-H\2XXtV`H +OJ)+aK2ZFL?/FDKuq.8W-C`ipjUnBIdM4P:^:@s>N=VZ+5(;dAZ(Id!+t+&C*"#X$ +p0_mXQ,#q$<3uDArY/r1$Z1#pr!(<(]-Mr=jsQ*rZV2Ln]nm^I<_+IDlI&1FVIm`_ +FY*%J;&bCDun9Yf+[Y_i@g#$48@sm_`nKMbM?Z4]#rc0g-b%!FSe^INH-f,7QA_/m +(P'#_4MH,B-2kfj"HA*'(JJIHoQ$(Z]b%Z8!4-fRRYqc`3I-1a%U-Z!.'rdrr<5Ir +Nj-oVBpt\naj\^>/L^$_C*b']87_kG4_'%[ks^+*b0*Gnd4HUO8]NPqdj*?1nV,[N +(X];SXP"jJ.B*)ZGuA,]%52\^Yjd[[(hMM/["I<$a*]"G7r(<9juRS!Y.?Li/6eOJ +)K.tg2cR>%h.5@W,#e=rr>O[5T^I7dQ\HDIJZig@b3_Vqa5U`;=R_F2:RLFh+Hr\U +3i,b0.@]R#a)%k9)P\MT<3MfnDjKU3W!333V[rppi!u5*;iC*k^"P><]2joUM3KSn +4%sA5;DOu&-@@gkL?*WrWrN(Jjt-(n_`^]ia7?;*RX:%nY_$k+Or>B7ta@?[dt+UO +L%.!)f&pdSh&D8rr@[drr?bkXI1pBBMO&5.F7*-!-pEYn6B>T7df,;H]O6e->;KX3 +RK[3h$>5Lc_8ZYFrZD2muP5mn&M'SX5S^Q#lUS`,jN)rn>3hB2c4;@[MB.7d_p?!n +OX2$9,U[\4p^+u(%0rsrrCu-hm=3drU@R+nX#:nq#:?!4?[C)rUc0TGD6sdF2$$S8 +,s+,q[8,Yi:W`RMgc]2= +8r7-r)X*5iJYm#X(cVm[+h"NA%3C'rZMKND:*2!c9\%o0O$4Vl +hjnhU+O.WG,H=+mcLF:rXEuJU0t?k<4VMAR$""T]\6Ql3;^af0 +gHg9G^o]"X8>h?51WiK2=]/9[Lgb@gq6\4@Zbr!2WnJ?AKa])=Fl$dE!K"Ypl5:R" +YBVL^+\^e)J@!,NdhYK/N31N9.Pp!Ig*K/&A&-gIj,0NjGk&gbPWp!lX-nmr"1aEh +sKn%pK6rE_7=Zg9d`B\DKHcR;4PNKh-2eZ6EbN4"E)O_?H$j_!!]fZd#oE4C-EtU!\AJY(*jNJU)6VVZ+pa'"mIJYNK1oba`u1Q@oda$LL&qYP9><`?4k&YD0\5W +dJQqd3j^i*[%r]cBu1kc^Q.c:S!'$ObM`TL2i+F)h7W?HhN2ceJ`j;_?eEh'jX(d1 +,IMr!V7SOn6#\jg?Nqc\&\LKLq-HHM)=]^5(_)qLLpJc"\elmmIdS^qCdm/!"u'@e +USHVV:D[kV+OQH2dm&e\BfF4F)76Kd?=Ug0"?>i4fI\i/HP.5A2.mp +YrBm:BAS78)iEYM.kW8ZX+j0T=MPmC5nRT0NN.jT,d:e'H%hfoNmSCLj8d5?jH8_Cm]Y=`r +XJf#rVIH0(\*R)mhq/ohIo(ad'!$^;f8AA7=c],#ga*QL_p,R4_s".(@UWfJ5gIfl +g6qUrr<[\0&6Anj(t6T;Dei0*"Hou4EEb(F +_'(jr*->EnOY$&'X"E_278]H?#T_m0A;$],s`4?\I(slmZK;3W#tMCWd(qdC!V`tn +@\O83:NN-kD`JR,AFp*gUGosa82M8;@o&]]p>/emq +a1[_Pq[qdi\jiW8I^&P&)5._Lt;4E&&WRrbV[BmmUUZ[K#B5>Cs7F'.Rqg*L&'4!QYKT_'bZOqI30+FOkUK +1VA#A$hE\+_F_G#`Y?'+EB8iEEWY[FXo-S%RC>nW2-a8d4g)/dLI'U0*ej2*aa5))Yh[9Dll&ub0#'.C7N6=,N#MT)b?EFK@a3bf/ +\?LTY+fG&)Ym&*#hu31l!F^F+NLBF?jF^'m-D$0^Pn;HEF3,XAT?(Lepopdrr@Z5l +eWkpnB\sboUQaXoXfSh>@&0gFl.7c)$UIsK92%5QHu5-X5iusj(Ku\Ro];_iWcrV& +D&@FW`[E+8_mC8<@gAg_"q-X?gq9h+au"Oa70O4@=g`aT"+&KX6l`Y:1saTo +RD_OZWtc9Hoge?UUhelWZrkd@'C'o:^ +9Q[`eFattWnP71C[Iu`Z4fm[?p7qqc/'+g +p>2ah=?sU/"Nl\H40iLk(#X\dCqO6]),0U?$kOCMR;]9!6YH#f\CaBfnA9@HklY]" +k`dP2=3ol?A[WXCVW+Xn?`hoBrHMqC8M(Qrr?\0kUk"63%_XlK(e1U.V^Pnkan-jK^]],/6aO]Phe5_55P%HZaH6,gi?lk +LU,laKLYS?nVRST`5#.:-WL\N5C32-UH%+d^L%K\"aW5QoJ,*+`I\J0Q0K]*F5OrrD!8b@riKfO=-AQ%T`oK +1qSR;3N5mnIk#h";a86ER<=k?5naAK(O[-,faU$@m*):F$Ldrj6t]BpVQn>e1^_an +CuqdX++so4ggaC5sE[E+"ET5G,[G(i8Ad^K>6?,rrBELX_%%_j.<+;#JaXsI9XZoZ +l5O0Br#IfGksPAj:)O5Q"8AYj&ip78M;lom,uYJ^4-Y(N]DX4tZ"LJlTCl1]BWbhJJJPlPHWH +QQ)Ra8?qGqcW\`c9X(lnFp)_7Dh57pVI(/.W>M^j^'PN@u\9rF'f-niCJ>IN@)8]F +^c0L1>V2=2X1>;O[/:9`rrBAQr#@*Slh4\8'/,$O1[s-udl^d4c`UO,h +SXIQ[CqsqQ(aHu=UG'C;1^TfS.C_Bpe`r>_JAOW_oNZ!,"^HHH5m["UJ-kKQp[S4h +B'4r5_!rpK!?9s5U/8_TF]ESrr@\NIq_&ht+O,)H'Prs%lIqC6qJ#c#O7P48*&(,lYTC@!d`fCT(r +r2B[L%oZGcP1VMm1CJiF;a/fkL0e+bGE\'M6hqllr4C3sT,dk2i9@?[j+kIc( +O/GRp`JLt+s.B\P#s$l^;"/sn/42:dI6,sfOUHK\mL0j-C:+lkiC'ck^T]Vn>n`Fp +I:&kDX6nfci-'m*fL$u"WmWV=8iO?YP]l>9^n@Ci<]E'pe:HkUU\et\rQ.QYe&'l` +_VmkKSEEcX4IRt.;c#^)<;9mX*`d*bn<$+YA,U@D:M9Kj9>t3jWaokT +r/9C/ZbOWgWZ1<)^C!,ZiQ9^^3!GRGfsR5D69B1g,T$]Oml:pSfG+%hMG%m>CI.6- +b?pYg?FlefhVI:7MGT=>j'#%gYj(PaSiu!a(bVO^]"\r[ML%T<5/\pY2aGA'8-83A +%5dqlmM]O!Gj.`!.n6d*b!2%)>J8nOe'De8eI-8^E:5Kh+'!q!!Pj]QJCTa:XNeS! +#kgLrr@ZHGXq`Gn+\8qr#sWJZggeCFXn.":hh\=,LWdP%;?Klk(#W*p_0ArVLQFtT,hjG=,n;"iO4>pO +DuG$H]4Khi^L&`YWXN"Ns4b7+8ch.`n/g^W6^06eeV"P?2X-_jDeNoK:\;.j59?&4 +ZmJOYntA`@]n^?$suJ(#L%5s%P,j)!8r``(*3tc!.n=#'%>7]j+G6gq.dg7<3p!r: +=7'W4EFifqaYAFXF(6BIC),D\kTu[1S9c$l!1^a)USKa_^"psCeSCbYUPCuKd'"-3 +:EHG!UBN8giaI8,lIrJ!R$\R!SilGTAT-7It[u*rr@Yfrl*_Ke6md5Bm4mRMT>cPT +pF5rVq1oil'hPSF]W/2")U%9*=o8s0C;?i3'9M(97.2Y]5Wp8lPFV/G6#e&%%IFb1 +:d$)epopG#Sm\G,#G;4!!cq0lEH\`l-_\3B\3j79hqbqmJ51$"Gg'g#D58`"TJJ<] +H.Emn6bNjj""tM5g:t#^Cnd2I/`=KkmflTC[XP1e]S!+Irnc;hsa?7*-cP`B8gs-( +,^]e`d4FXK`a=+!@>#.,hLG3)9umti*Z7=1ZA;9NIPRoKX0FerM'$]pqboY[@(*;g +Nf6P0tRrlOdHgH?[RmD*7rH-n5OaM>G$HF*0XEd3$Pa"Y)+lr;2&7\00)8C[='sF8_]\m.tkfsi +n[)\.;l"smNt4B@.MInBcQQ_A'(q(5PR%n:]*',`oEY^&^lI6:Z$YUIV!uV2_f)T[ +?nj,:;q*K*D=>[=&Gd[Y:;&u9EVS`V"<,.*r4)G:4M3JPX"Zd*uikq,Jnb&Dd3,8! +<'e0re=4"Sh^PMd-h5=6#,mbp`eM8-i=Y(_1LK0,#*B@5*n$+]meR0??iL,B4a\bnDlmZa\%U9M5d$hcFSe^r%"RDX7jN/<5TaRhb +[7e0Z9e@lHjXPRHN*tZbQuKMpOC4JKmbp"5Q,p(\+\&QC\pPJ'"T>Mrr?n-&<&Ql6 +.stPN*%gN +9@M=o]$\Z6uBJTCZjU-9$qaO$cb!)!tQ$ibW,#R577/KgC^U2!;R`9$L_aVkCL>bI +?^"A]Q%F(j#P,(k.\H/a_^\:?S6iE;BYj,K"`=s&@)#=e<_0eoGRMf^7^Fb\\[@dJ +0&^;A(nXHrr@XU>DlkBDt^#*_2EQk?NWMGb5>>pTgC@9J":t"rr<2XGbb5=^M.$tP +P1U]`Aos"4NbG9/HC3[F`6D1^]TlI39k;?J+tTZOo;9V)8nNWB(6%X\K+/j2>,u@< +7f?$n5bN#F`5q;k6fPrlIKte$0esPT>8eYd@M1kpiB4U5On%UrdZK`*R%(7EQRo3P +MnTrHnhKP#6rTiO%dR$W3)@*E_QO]KDQ<@Qi@$h$iQm]gpf:d9W/7CIJf__^;<"G=!.NLL1p?$QgLTB(J,ld:rr?IZ%UC=QVtfe.`I*Y4;h]reQ +P)s$rZI9E^8odq5@e._[fX9brK89=h]4m4b(5.;W^[$0"GUXkn?;U?A?TYC/Grne[ +rWLl_JN^:]Fh^7(&[9?E\J4.j":O#&RWpEr#?5h[f6?4T>h`K3H'Y=n6Gd\W\N5r5".2J4EthJ2kl,Ttdfh%lYA-L +Ng#X?MXU$"SIX"rr@Y3HjEs6/Y[/*BaR5fC!4]9cNcRPhRjfcK,2mRObl0R"j(*Gn +*+/lq^#ntn<&1ThZ^*`gnW-S]c88Pg-^_?.97F@\Hbp.F$Lh[hsb]*KljAFfpCYB_ +55h>rr@b\U5&6@UK2Ln!("L"f`r?WC\05$K\dHYZ%-)(B>`.fjesT]A09VJ[b']Wr +"ig:;oenh*^.NJRp)I_!*S4qU`Q5n5A/r5N,>?mH=?gk[#/%ET*rm#K7`7^UDaqX +_`Z0l;/dcng[D0mjN9Fc[8gZH3BRM0KZmY^.8.6/FC42]DhkApUH1*.eo3)no->qR +lN6R/C4VlIK'9MQ2R7kj:2+h$CAVLkPf`l:k".uhLE?`IqLk&%0$;8oOZ$],EbFsn +-6UtNC:Q;Ehm4aP@,j:_DdV3]`cWMh# +9t=GkujSY!IQV<'J[O@!Bu+EHm$U\X2uoi23B)$QPaNR3SWre=M>&[1e:,ES:5P\o +geom"%W-;Y5[8V(q'=14@u;m:W:ag>Q'mceSG]fS-L_H\cm12+WHYr_#2"2MZ$'F! +.rSq+oSBh*.Gp%IQ[S1IPpmj`?#`_p:$pFJ)PkbGZmfs/%,7R?oVjIQ/jC;q.0EBH +WTAPr"*mYC&\/:+Rl2:jY&2\3q;@:rjDX:rr<5Td@g"_r"F"eQJ0CjD)SAj/BCdFM[\K +oK5+AK-1;aVFO*a1r4C&mI%sMjN:.b:YX8e,i-,7oB2beUAFi-',sW!ZP%o<'"m'B +J\:/TN9q+44"5oV9amF-sZcP_*[U>$[b26Q$qUe*&`CkX,e#d&@trO%ZDN4B$Zj`= +G*+HgQBuegcl$m%fBc):5kKg&\]gLpn=F!X)fYDU5EQA0,q@.)=s"eHJf=N4UY9i! +.qJjM_6-Aqfbg)W.m<1Al[PON&$D("Rpo;I8[&PEKYei!;ZWpp71Vb`#Uep+,t.`n +a$ll`MM?bkVT)i6AgG\=V\YI^^s6O(%K?2BE%r7rqM-9Vnua[pn@1Ip5AI]J@(p^l +0alV7Ze[7(.ZPk5p?WE+D/YFWXf2q?_SXLVO%dtq`af+dnj).$]Pee3>ZiH.>b>dg +PYS5pa)Pc[/U+1rkj0iYjf9>p3]]_p2qo^P_Nfo#L\,TO4f$B9NGIn*uk,NO!S;kg +3a'T!sOho1S#G,3BaI#8b2L)hEBkSSi1GQb'"g6$V +8%h81humBOY5$DhB0%_hjig%W!).@0j7m;peTpe=%/G3_r>:/ACDu+/37(BaLlXrg +[^t_o\V30^ZSJMU5M#6DVMO^K?m-ir0RE`Jn'8Tr\OMOr*/\-?go_hc\Pp=k4#:,h +T&OC1mm3e*Dd$e*cZ.Yb@I-?&%U]6qU0k)h]H%c&aB&I*5$30j@A;`dob92R=/5n7 +tQ3k?9A/e"BFr^L5#-CidK+5'P[N>j."^=J3;$U\.!\T8N8jh?YPlB\rMP/9`TW8r +rBlOIKfMqp1sFDTm3J5pkQ"shTo6mAVQ"X[:^s@hY's'A\t!k,7nf.E)/@`pV=Q=- +Jud\J_-5)h@TXb^*W'qg6sNMRBG1Fhq?\AA1b>?,X=*bb8q@Ee_g-RGDC;=GP4/*O +'B#LjV,U:;oU(F,_C$CrGu=KkdIG$7Baj"&>8<<\ci(]NT6Z+-b%*6MHY_Cr$T7d^ +Pa>@[j:cQ2 +bbUTXf+,!+uKO0I&C"J1?#RK(r[D-L]';X.u!GK7?@aX,,J! +$OeP4$t!"^Rq,"30V6hQ9osTW +-kCRGPXDk?cOOF)eXe>1QY=bV@WX0Ndr]SVl]_`c^U\8>0.f7cShqE=l\%3lnQMgk +N.6KWRt@!PB^^#="iQI507LeS=PKf8m$+54Gng^f,M&Vpr.PdN4p#oi=CI2$p8T>W +bO=pHqoH%P5A%B&$sosSZ,%h+-8_m&gWs:*1b5,J]2TB0=J7=r%W;n;F0E+5QhfO6 +-(;.+-chLT+l_a8,GCGC@Pqem<'9=Gl/eb5+K+0gC%G34K,+6jUMrlLqrEbmpDaFn +8'Jf)paQ%["$&.FJ"@q4Ra$K4rr+TSkfdO7;VgX4ltDn;jh-7;+b_&Th\n(49>9(W +d)9Ypm%o;poDFo6MFaT"K(nli'nq)8l\f/6,NQ)TYU3'eSk4=nn"Hu(`s%JI +f,0lqLCe-^,Q&.qONE.rSs#gn[%76Z566H]1?j_=eg/WgJSjR]N(Y.8o5V-KAILT=0 +jgtG'bpnfBD"/74Nn!:WgCarO2?0e:2.MJhd=Ym!@,RN +M)Fn-:^3I"4=b9n41FR*0gE&ikLF077AU.jh7.0!(f_J-]cii"Rn@+&g80FMf? +-d)">j&gfO6'Xn\PKUJfXM(SO*\Ic+Y#loSFsi$Hs-=ZfP7!>eGO"[!"/XN2O^'uY +53=c*f=%[aGIAlh.HS;@(Jk.(qbl"6,C:.Ai5TWSj':J`>=Rb'dE/i=0TTU +.JnLTtXS'SEGr,ERqgAiSVHN!0$mm[+"EMT8aW<[e:4d.6!"?Q:^+KrS2Ed]G:d_! +8oU"9k8ai67qOMdJAbLQ8e7>S&;[67KtYN"8M\o8E&Er +)/F"eNP1%Bb\Kbc?qB@Ogk)#oCe]#&W6@ap&OSXO%8S]n]K>>a,RHN21H)#!lnNXe +9%"fK2@_&>!PJI/:/>,gOUIO`I@/9.b9e%o*%)tUd.%a,J"o\+1"kMJ/UTC>`_5 +8RK#$VQO$Gc*kH)dUJep@e3Wfd)[BA$`d%4H9Ca=4XgbUoDKc3QFb]^\B55Nef +5s,p@rHKtfCn68ObQ^.4&.q[5Sq-PG^&08O5Sh$dVfor(@DG[?lj.\7DtN'(;YOH, +mqnU%GOCU/$KV57*3`bi9Vo/-V^+AqYg9SHmPW/RKf8CU29]P+:N?5>2WGP`In6o9 +b_qRAE7j*%u.e!B`9s[rrDG/nMh[Wt?OA&hXd\jPY;d;i/4Y+Frqc!DgS&=r#EGHgd0;V&<S6,\*Nj[g.d12u\"L5@t#4khsY$+:T"QX(W? +Mj51628d!GT4P(I]KW!41s%DX=`HK;d8,'HZG][3Hj0l2@(92EERe\;ni`SR`FdMn +T`X-cK,kHjcEV.#mUniPt^4thh^lRKQ@0ll6/H*E=iV(VVHu7duW>I/#_(HnLo+]&\2!N +LfjU0f-ba]U5-Y;'e<>BcRQn_Jfu\lZ_\3rr<3udQ_Pd"T>6&n6_,2)p:ekf)"qh/ +mGG(Y#cKu.F`![3S;I]oJQ5Ir#F>XdneQ-+n-jdPfRtlnK1BNF!SuOp1\GRB2q9;$ +"[AN;?dXHqEa)$"_mf;Z=ECkQ*l9[(436k0:&rhYUZs_^b)pAlt#WO)'9rMBqGZ[c +6!SYnLql9gV#[>)*h*F=_\j1AN7Z*Fo?#^q0Z8a@L&7bq-\IB0l>F(>CTQce[T\Qikp-`W-QDd]U +i\bGf>KoC6S/>G%u+F.,.9nKBY8IM$B]pn.RJ\d]eD,?m6Dadr*''*4s0\9pi\bgi +uMHIA`S]2.si_:FpFNP.Q/>tLl1shp6#@TK!YA)pjr<@Hl)<3_oQu&HGdRCQWLbgB +#0YigrtKqOJ2RB%$p^04*X[JM!nq+0b3"i!I7LUtdo8!%,pa`'93 +<&u1e9hgk^tK!bV:o]9P?]E@$QO(/_f-!`.)p9s9`TUZn3?WLn3=s_1B.=a2+sor\ +/':Ko1lg$FAqHO7HAXpV0+sdnc"O+:C^1$ppX.R:=H:pH#@1&ji"'j,Qml7X]V\n. +\JRG*<>#H=K7gk#>pU7RhA"H-?X\kR/;IGY=\fmGlIbrV8$^d#(0POOa[g8n<_)I0 +#)<'3g\(#ZCPQ/MWqT[@6_WQ`Dd>F33UD=.$]0AC*gt'/9#jpGH^7LrX26T%1c56! +.m[hcnLG<::@X@n9srMZ.VX'jY<=/TI@_@pp`3ZghF3TH_\UqT.BIK*Bd8DF#qqH>N+YOepk0?hS51Ro&.8%CGF +:9o!cj/;)!:W>$PPtnLi:F`2qUfl9rp\P.J,C(^dAHpDJnfPj"*`Fo[?R1oDVLC9Y +NPocrWp'6a.e("5eJ+WFQj]nC0'"A'r&BZpu`9IlRqcU2#9q +^MGin=RZAg$?JCVhD]KU#!UMM.g%$e09'iKIRiZ#2t+9&8TdLltpD`&kD#Jhr\eqG +2kU/9Oka9I-'>\AcDa^Q>=PDi:qF6/4WA]60XM=7`cmq,%Cd\Jpfd4j6](kmtA(J! +;J&#Ylqcfcm#s1n9e+/c[-auo:p1XM)2Lm:.j]GI:;)q)JMAmZ!3h)lFL$"C.SJ2/ +#9\6OEn_e,D/5uT^RQ*+!sqRA/!oNS1Ro!;c]q*0*f:XaH3,F)-i3rnF'OR +b>LN'4'nt&T'mf[f\#,Nk^9rD@:>DZ&[J?M#RHl:PiBt]Dhk_S,U]:--iW-Dm\ib\ +"4k0+1'-7%k/eBq+KZ(*cm@k!VY5:<-$3&l],\gBNb^#QH<#/4)fLEe@%PWIT;lsm +hK"#-c9#SYDDX!/8X[IBk;*JL +&h4\p0X+VqorK?rrDOS^Pt9-N;ajq8CCRAe%aia]^_SeXfe0@*dG,a_-%O/Eb!Br, +L`+Yq[\b%5OY2N!V.?1(@FJdI_rQ1%lB(o]LSd?><*f6V'`pZnC_%%#0(muPbbb8Y +ihr5%WUfA)ZKfRFhT-rHc+aH*M8,b=fY[mJ$&L48S#+X%.d[nG8o>KT]Z[oF.[7YC +[:GE?7""s@GlPe;>>.1f]p$o`O[!MX%=(?AW/#>CFLCur$VY^891U\j61:>rr@SO$ +@flm4u/oI+5_E9gnOSN:0"a-:i80aGVOk6FSK_A4?JT,6fZ3]7IaUde>ks-/U1 +r;H`fn*1PkFA">:&b3G7Wf%(^M8gfl_^45,(Bo5hI3q(0b=P_GP;+&gn3$0.6KV-- +3!suX@kU)@d1?Zmm$;::\Z?1O$DQhh\^Kc'mq7Qr$C?9]L/U;VJ9.XgbS81A!Q.FL +.HkM^A/]nWrat7`ulJTQ\qt`FUnprOB^MX,KXRRW[tuE*J]RUc$@(j8#F"Wn-[Uhm +9V4c^:PZs.Rmu/(pCoCrr@\\^*`+`%HXG4_*<^omiuL6p:Af(%0.UUKR6L^i1+gNl +Pnd6r#HI@"5pOFem9?k6(m+KF38.)[a_rc1>G4_Em.iO='g.3ETs*1!<.gb>c@Ijr +q`f,rM_W0YC89T0:ko)f(t$'n&FGWg:o=`TD1MU"(rJ$rWDJc5F//Fc`Ys4#KP)r] +S]>E(aK3DTQI>``r?&.FT.d"%oUfYn%K5*MSfAn7g;N,lB[Uf]\RNtPK_^F!&.Z:n +gFV6qSgm"8+/1Pj7eT>26_nI"6\U&G91Pi$fV*cr#MgAVQ1m8Qge3`N[@"+[#J8Cj +8rPUq99em*e9H:MWc_.i:%fu_g^W>p`&7-?sXDfW`Va7IFlb,B-2g-IY`Hi"Y"\ +C>@>2K&Npo$%n\44G$.S/`"p?EY1C*ZCZeB?qQTQUG(VdbG +W7n?!7?A-#3C66_clp__&ph\6+f_N6CtbOA$lRe`$<7^3_9[AV&a"7)HVbHHr[&tfZ#IsVX[/6Ul-.-=k',sj +Z_J!,<0+n/$..5i95[D[eF#fC_rPjZpbA"UNm,s`S8e<@C8ZhF3]$'&#'"'B+%MAr +rBl%4uJ-rKPq=1EZ:]'3QJlloaEMa0[;[A)S[@X*IknR^'f<:rM2Q&j,Xj[C-%'HN +E-muD027g4SF5.I*F*J#1LQtld'>BMngG(?dF9E3Rcrs\(.@^1:&EimcN4@,KFhYp +]n:1!.'.m'o,H]e,>JCJQ@%;>u'0!7]"em$j),&P'[49jm`9M$/g44,^kiQT5:[%? +mSU5\K?NSH2cZMn5`nMh]KQ@l95pW:Z?4C2/)DeRQHB!=:b'b]a1Tb- +iX/O-%=(p'u&/01#i)V'5@;tRiE2&Qh'@pXFu0f4GMp.%!bd>2dg0,jNn.qmH;WP< +Jqn/%F':pq`e:2YJuW[6Ze%,oOR,-*4$aYMXl`SrXK>7Q@)!Wm71'[pjlop3a7/UP +Bh.A#'a^=Noj9c(]k0VH-VEL!!SS]+n4O23mWZUrr=,)>/dCqja_&aBm3G"6qgn:j +>m#M/k/VW]dNpmpc2ICrr@Xbr(,Qm.SH[A7fNJVID%RgQ2LRE0pGMfjlF;WG@R8h= +6n31(Gl$tV=89oT`'TB;rO@%4ta7WnHPpKfWDNiF^*%bqeDN?35Hl?+D,OW%VtUp: +Rg`T^6&ZSQ7/p/>6o7=2CmWNX@YYCZ(MRk9%2nkf>P@;gK.DHo\!l;:p7]b^%.dkQ +u[W@G4+)Df&lB,g,C'TQ:?hoJ6219orC:tDCoK!Y.c,bpjHO.WT%^J8;JH\h.'uS* +0(:d$00U/[VB\K +"h61=!C(8iip.E(!&H\P;r=4LZ^oEBkeFnVqNuCLY05C7LAeSuQ"ZA5sc^ +]P]4C`9@T9dTH%=Wp\G]B1?DFruRA0j:uR_R=38YpbT2FB+tEQ+u7j3pYuOn46oH` +[CTNHoiX3W'XZT.0pW7SCd@^UgG[Wa7E6buijnLa>OT+NrDH,o4+\<,!;7Mf? +f>8)*'Q>r*Y[#qCRkY%lappWIr8@[BBDmD,uUNm.TeC@#EB'PfBKL:'pnn*4l?k'p +\kKtj0+?s!V)534A#&R_Ud(>heH?oXY&m#U@&W7)E2,Ha=>,o:qLe+p]pd)Qp`%)O ++a!Hh:/Nq#JMhMYNQMr$e(tCWdhi-r]Mg),`CW,D?7e"O;qd"TFV,&RK!9FhG;hn> +kiU&cQ5WL'2r&bZu&$.\i/Cm\q1g^0dD(n`^5sK%AXSrh.uCB#_'aa*r(6Sb3QpY( +"W@0Y(M%]^S +jN&p*;Wag+1%=3&<#Ijm)c#gpfD2"3mQ_]XXgT72&P/*#j0I161(#Q$si!5Tt1(&5]*: +Q./,&@]T+Ec!I']"PJ3;XobFr"`5O$SiRZRRU9p"!\hei4ms_p20=QKR[B*JD[cD_ +?BB=YBB?s>uc8RU1jD![W:8MG'X)fIl4=YbN:lTj[D1*T?Io7!,%AI:E6?PKAJTZY +hSg)eH"NF-5XJoSDq8-rr@WjpbdFRrr<2Kn90GbC%0lY1>c8.B$oQ^*d\*NOR\9?? +u\FQ\)=HEg3:IG"R1-aI])5,SNBcUMY>bInKm&fA!'-P@]VVC?O_JA^TkP)49bV)I +a=-j>%R!6Nr2BsC5[57geBu0dHtM`cMh:Y!*^VQJ_,eX47J;a/:7ocRiN<^Y^M^2d +c":[U'sZ5)#L6rM2:]M`U%?? +O9MLGMmBW>\IFc]8'=Vf':]6E6Og1FFTg\DooiL/+g;@rKVIf1;YbY#E%P418PM=2 +$Z5PGF[h2i]lp&*Bibl^-4g0_/4L"IB2jup(m-F_ +V^,022B%e$9j#N/5(1=Ssucd>/8TZ]B,8&Es1@fbfn__'9g[dfDHGc:H*d-7$=L%` +t+"`aW2X4_]E_@(%pI8A/"_c7LD^"fYGYmW6B%g_\^NDO0n,Z+F!N;VMDfChH!_>o#kGeaqo9qksH\#KN:jH+pUWJHb[Do8\[KI3WieS./B,$n!!!$*7oqQgWM/mg'BO#\QHkjON^dUiE[LZesBQ1LgS.[g +>/'o'pNR.>M6t8f%66pBbD`INKY&C/21Yh9C\/T.^+LW7(sbJg'K7I'ApKG;Eu0$- +KjWS8cZl9o="SN1Z/`L\.raA?8fqaOMd43Cn>EG(q1V,H4ED(V39GA\R:na*gl7Y' +dL5pg-hBN.g+DJ4_^PXOD02!93(d`+A,H%X/_5%DU!/CP^eH/9f?8q/*f)rct3!fm +6D85C"_94G1k!'`Y>lanY%5:O+UocGls2Ld]M2,")OIS;,`K1F,h^>gF-L:(s+p&R +K1R(<4'FC:S3i5o)jlP.#.]8GAA\di!,-JHOB!9`h9SJ_8fA%$1*uYVVlrh!+QE.V +H]A$ZY!SF)gKXWhqN`3,%G6D$BpSi""0pOeL_bdC`DG183b'p6m>/%_8.-?"!N%Wl +Okq]"HF^:(4EK7DZ(uP)1TJrO:$:!:rqiiD5U +,P2P!I_4KrmeK>J74^>N`QX/qG`eBS\;[kbQ7G2"!ghXC\FG.%c_UDcT(bt"aQrNP +'/%k>AE,!"1`n$1Y:jKQAA0L%BZjGr7X,b?9iKml_$o?_TW`Srk#.9FMMK +0Tm0<7@N`-'ckCi3K]tpNqJ[-PoU#0-]b[3U'_1 +8,9#Uc(LQ!K25CU.Ppj0:#!D6>W8Y5hP)&d<(c-pNH-NaWkYd%.6,li-.;RpZB&NX +?dPN4HZ-B@m!SGDf[EG+.m0'IM;h+gYHQ>;M6-*;tmi2IS\R4C%s'mg<[g#M4-qdI +L9e]gYO=0I.LcSo>P7L*_\.B\XMK?,fFB:k@'N3N^sne24,%3gUqmq\aL:.?V%*!WN.O\,70CV#D0T?bk(ge%ZSR^PJubRBFF6[>[6"um^AGWbS)/cPgeG +k;i\YCqB7B-dKWU&7:,R:.QPaW[2^Yp[,E(k;4ZoM`WU[(:Vs>b'ThM@4&V3#p9MP +^H0pGK9),5Zd_hi4f>.\q4S=NdZ?8)93\;&*(o^\,QF2K(5bXm:*um`h@URph&tgP +K$\e:_HLrHe-_&"G'ot`e@DZ%KYS(7&,E,4p^Af37$HbNITlJRVHQJ?cT3e2"Op=n +Olh`elKnRTuZ;/"4_iJGgk^Cn>`+5?4?/ioEf(HrB36ra9;''`4Sh'DRj8T,"T +A!>drX*B/cKjISKfhG.nHVfV#)Ar*hMF)TfOS+eJMU]meQeDJ#V%h#Iq9#hn.,uX+ +&DM)fB7AFfqh?AJ&,Rm"3%)8mV?LoOLPB1*cW?[*=?[%*QXlaT`,=HI/(D7^C^ac- +2]='nCO8k,B>ZoY+f;cK`cKgV\SUVg,e#%CVp4Y)$9l2k>?IZ&@()s)%S[e:J0M88 +GQNglnTO.J3Q7_i8Yn"C7ZOI!.n;IZ41!c!kQ+TUhQW;)"TCi"T.*sikGmYaDL?%8 +E()H+l#Z0:eks?j'T3Dn8uCH'qbC;O%QgK->>.2FehG?MSscdAlgNRnSk:FlX,JI) +q1OiZF&D_0EY`2Oujb7ZiS5B$32q6(5]BpjV^q;i7B'E?sh_'rr>8^&'@AEbJI%,X +mNQ"IT_GDT9XC7,ciY:o#!\-R%/BrblE/$rr<2j\Inhm?5PHrdWS4Fnm9d2,[X\2k48*RjVE\ROMr"m;IBRmeD.d&Ae]"\W\,IJ]e!!Vp^Lm' +@DP0#j:>-onY]6>NOLaIhd?6nN6HYpj$`V!!O_EEHXHGTq)a.)MXT$WO9f?>AL-Y0 +goS;0@062S,r]:2>*ND`GZ.?`Yj.siTV(Jg<$;16YE+O]?g`e`30RsM`qVqj%Yr!X +lc6u&0maDb%raQ\Z[1V!.m`jKD%+LelfZKI7j+T,[eXHn8nDf^4h&T*0torProNV8Q,7?3U*&7Fgm47l^MSUX`*Q:=k#42ST_U@W +R!_Re[>W#V"kn1d0M)ufoS,]$mpJ)f#2Pq\gMb+_.Bjt`uTk +J(?:`I4$t/iOAs?J,/*n?;1uqdFjjpc%`(isq(/*u9*F_U<6!1R@&nH`OCc>.eAo; +\;5C@-*V&o"uFcqlVq[i=Wm/Ogtbs+D:l<0DI-eT),AO)lgd[ok?:S25Jq^J0uEec +ZV9T`kJ>>49jQVH:0A'dCB>C7?Ru3DWcjI75Y(nPQfAj2iDBddc[f6>Z6$tfb` +M=9Rpjs$6r[-&WcllaWinS8>9S,i"nQ=Kk$DcU'YFP7B(0p.Y7Fe6a;V^&46<56A! +0R@EH/kE7mUuZO%pZJB[aoU6h9C!lRimS'GA.qa$E/aeAgDmA5pVNl,hKEf^T^f,' +rks:C0G8crr@t_fj)NCMI5^[+./&7m!0>t5)c.pi)]jXr"Bm_#q,Wc48+$L]KNC]> +0LKr)L]]@[YN)9ce7_4Oq"R7A<1/YO%nDiQljo6"XA"rD,*Y?4Yd.8H/Zq;#^O5!<1@]p;1OX#5hh!A,q3Pl^`L5M^TBD=Vii2DP +e1g0X%:Ku)0;TRR6H=Vcl=[l[h&dDF:kDJ$&rJ!OMQ4CA'! +!@[)0o5181fNrbB,o%W62YNp(\gE-j8KC:WIZs<(YZ(;gR+>:InWquj)gp`mT^Th, +mB@Sa$>'!F8/Q:nf7u%,Pt!U'4",t5N;U,`fcpFl@*V?4!/rNhLIh\J ++t_KQLPu:ldP?Qt@ug6SVNq/]#.jfVG#gpM7nNK2Ism=2V=D!g\JbDI@ +Sef5J3Q1Sg]%9K,ds*m\nKq>rLe9jRE@Y#cf-eP!)e%#8JcP@$\=MeEK&Kqinki-_ +(dd)40d`$Ktk#"[<3HXm8\:';UKAm3SPK8f-+W(i,1i6ZcdZr`3'JqUCG#[k.CrZDs\))0 +3?^W/H-.W+7U_2o_D+TGM8t6BlEYM,83!",IM]1GCM#X#pU,pf.&f[Quq6\,&ch5U +p+N^B5`J*m4Xdh?DCR\6#-j<:TbR'&:HgQr_s]$LPhQE\L"0rj['bfam%"K5*"1I +tle^[aT5da.cdg)`\!^H=t!r'tIoF6c$?Ui_+b,G[Ag?5Nr)IP6)O;`_I2NCj$Knr ++tW3-._a0d:k<#GE/;BajD`:c_oTPdcrmUZ"@!YfJO$`FkhT;:R9YCkXZ>\P!-V"I +qMg=%FZjlI5a^Fik06)A<,(mZk&o&N1>4GjB)7"=8P)D>+`Ub:Ph+INP%3A#[8<5= +k4-Hqb,\o8J+RU]TNPrqIED-i,,!I>km2??j8qbYfGS=?h'peFM!@Z@kgHQfjIH$c +NQT4CD,(WD#?X^bFeIH1;C`T\pkDc)VSH;bkkt.H61`'5T$*sdG>=0D8@tlQaK=a+ +Hq@_[JM[`)pd7ti3ZBMbP&,qIN42q*Aa\1H2dlYCWV#2DI9kD5DA.\e$!NZDqUt?5 +IV`MW?cn`=2_i_a9h,2!$N2jSq(j,4AZ:OYP]1NrrC$,pjWXLAtS'hPasR/)heCqh +i-1Dp@e&Z>cb/]_%6Ya]&8%4W3=MXpaeYKmgAj!<;9DMrr^F!!P.Q3HS`d"5J\Mb6?Y/d +V3_b:/k$peNOGoj,X!,e>j`'PU(\MorasjF8cZ/T%/>KS2s8W2W@2LY +%tL>(u`06GU#WuCi0=GY\,qu3_OXc`k%g-+W'^Sj52ipBEPsHR^A!&)>ns1oUT_BQ +I>%hr5OG`KfH!\Rn;r%h6W$%=^TLZF0/R5A@;29d%5P?uafe`dah7;EqRR;/9OD+2j(Y] +jeVC:"^ZM*c5pRmm%s8rrBkH5N&/`%=B&_^Ys*lIOk1061J$4r\Sjd%=6K)enbu]m +m=aK'K8(#/LF/7m\e?i7k2V/-`)9_61?PDG+@928&H`@akN[Z4(CKu]HdC^V;[n.M +'&rT_+WTOc%>9!p;qMg.X\CQ4NNDMO1NF!X9VR;l8@RO5<=:1Dh>\@\,QG[VYhC[k +3u]DWH_(TE61#EAD2@QBdC3R&`$7*'G-$:`^$`[hDosJtOZ!_$fB/7 +Vm4_cTtoV`/-C;E$.+qX7AH-=+u.?4"MIIpeS*J.W+ah6ZnuA]F_i?TFY\Cn4nn=g +dN9RTkP(llp!=MEMubh!5K?@L\qi^_LbQ#r#D%je$hmZM30M4$=OP76H^MNko&i'l +G1U)Jj//7h!V@eeCgT3-ZP$o`. +X:lkhBe890*j-j/@srr>XkphTR4p +]9;[(B2o-))^:cpfC2$ebgBG7YaFC\@5AE8MG#$'`5Q$!8->%@_V&*._%G@E.E*Ho +$?Yc(q'=BIqSgT#lan5i?<43rrC5;I^Si.q+_pj\(s64!V5FO(%9%@>0lPPX'T.:g +V*TWH"SB9R$FM'pVS.VN.=Af(%-PY]G%'nHnk-g(7J!f$nJ40mu;0o_*1KS[m&re_ +u:!]@2>X8+*`Ml7m9b8fq$1Q!@[cJ3rM5-f=htmp7I(G*0T(tT@nD*#Pa(=ZiMM4q +KAbe7WeNP]VYF(TM-KR0KAa/OZXkcm/I';i-;sDq[GRE4p-E!em\Z%EltNTD8MeQ> +<*hc^<3_.@FFU_/t``5jppY+F,1OJT>-PqD8%%01EF6Ng +6?('?/Kp=iudm=rrB2"BaeAO#3Hc`8Y1"rp&:0UZ656m(tp2o@F.5dJ+`%ge4BMrT +.,QNa#WuoXIacLS\A1drrE"49X+Kj6b=0ipE0?`ks,>"9I-5d8]nJd:Mg%2.KZq1N +1;p91'9a#!dlq4G=>d1PJ)^ +[M.9(C1-$4EBIsrr@$S1V")B5MYP8%srI)@.Kpk6_7&n[,_]_,iq=!W7* +u+W#Zt97;Jt?_WdLbF4;C]rCQrinF?YfoC6.u +(AeHrMO/9S,NaFq_bdomZq6rdRsR-LAq6@!D.:["bGB'nunppit8U.[1srYNWB(Z4 +hK=i^U2gme,KEa7=Sq8W9(T+dB:,g--).3BE6rhf-f1DYGStG^Zae)pD\e!a8Z-He +(T9J1kFUa]Hhr%dCb]BWD +:2/Q*.Q-dg[aat8eB';;3J*m$b-'+ocK6E8cW;j9I52j^]T^Zq'rUF(hhdt6]M3P2G/*O5\',fYXn5?r@INmab:[Mk +Vk?5h];^s55piCU]1hX +mU(-.39iVUl(t5DT$.s++WF1/QZiWb[CUGWNTn3N\n9=YP9M1^c3t]])McIaO$RJm +5pWsHLpf,5Tb@Q!5V]ci0BoD5N&(n^VXhtp1MkISNQ2O0X/rIC$!$TX0"Y/FW-Z@\ +KjnWU`b[Qfc5QMX*u,i!.n'q/C=bc.5L%lY?3Mq%Iq9HVB,$7_LAqh`s?%!p:i\Q;kbg(G9%-"ugrr@WRHq^p;( +74Q06aaJU/p0]BR.WK%SX@:R:rl5S=gu>gNcIDgfBB,g(b^[5aTH<^bI=+UqmN\Z5 +N%+HEIZZZiXVrc'p`!MJ#GUjN%mkT`l_),R7SIL!W!&`m^MgepVHOk?_0KkL"uF[n +5^W^es^1KrNT"_8P!AAY+A>2hV#]uH]c9rKIi%g&\oDWYPJ-4o;hT)em1Mu[GM.hX +s8kklPssud!)a1COe09(^(K:Lrr@XVB +%')Vg0Mf'N"-(bgcrDoOV?h=0HG66H;Fk/0Dlhti>\=trX&DZ%;O&Rjp:lJj3%b#" +_(oN=]OB$@e\U)LJulk:MTege+H/;nFicY?P\,P8-DIbV`5'FYOesSYP:-d;mEY.! +.n^/P5aB0EN/`Z7#o\-A^&9#j'^1\J^&4:^dI.1?NZ@s&"q(I! +-J5@#rTn%#5hcT[>tmBp010S0YE?h*!/>G/,(jnrrE'!K&Z\Mcp(pKa6^S2#Jcoon +Q1T"U%%uk7D8Jfm`sZ[G21=f)%O8X&?Ob<@\]IFi5Vm;*Ta=0O1GgIB:RIpH52\@T +X^W;P'h*;*!5(hD9&/nB+tCDAcD`5YQ"TTML5a"Y>+e9n:0J@L6LQ1#'bVi]!p4;F +/nP'q(pi\o52npABUokk(YO>$32lNr8m*04Pi"'/IVdRi"70%:,QYrn1qjSI4.o +W.j]rrBl-4ppVj&Uk\s6MPKh/&Bs-Mk\L'k2P,oN2-ecUPX9=&..V]a#32-rr<4ur +KSMV1trm34o@)p)T'\kAR0$u:!p8I7U-t6qj[Y^jbPnA/,;o37+1"-AQUNpT&='\6 +pNhoK6-]JEQRHJlf#N0c'`&WaV=VQ5d;f>.Z>c`#L!m$1Xi`3IoVS[_.u8I%6!r_d +_&fSHbo\&eMP3iVR=.O7"6j4/;QUGiO:E>3Q]6fjnh8l_/qnSDqT&*fDI/ha2U'LF +k,UOR]W^b^6q.GL!4EgOGVps;)<&77@i6tC\ctMcH=/P4)H^SQJOa0_>m]fSEC5=; +oq$6$QVH&e&3"G)d&!U/0?4ono9V4k(#[u5Cn=RM%r(?H9pXjVa]TO[cBI7uT1 +9>!e=T."gRf6N/Zop'=Q"AIn`p(l;DRkHIHiq.fJN2sof_A6-I'C'.,AcjZ[#IVma +QTD/#OnAslQbB7r"bXmSJGcA(s#_\" +3KV(G^L0tZrp$R+c/AKTu[.`5TeH6^q]Xm5J^-HrrBGs`N<(un&:=gkScCKeh,DG#Wg*D#@uYA2HLi3L,'cFr3(='!^44FB'!dr\S#HST?W6ic8;F +^`AU?ch=&.mgJFHs16_*/7k0dAUM8&]Z/-i:bJ3

      >5; +t.a+InN#q<.FZmn*KYJI`-[rZM8M2MngAXnM/L%][?AR5?ij)eS!3r"=QP\1@7/OE +)14]m!Ja4#87$\?P%T$CSQ8^nQ^PMFh\CMnA?imMWKTLhXeof)h"1;-[;L2Y')=5! +L/[%?d0%6SZSI)CKR:KKp\UQM95Y2YQf0h2/__W[TR/3_SFTW,=oeQ'r +rD$R^TnMW9le"U8&Fg?:$eM,#T/Uk;p1eAP@"oHp\kPsq_;da!:Wr>,N>kYj1Ck3_ +NoW^\a\/Ag-1R=HSS@EUko"J+b(mCJ"IS@MYncWiOY.^CRNa=3:e+0H\:)BXWk2.g +?(t5?C>tai;6=UoW<99!!aMC`kN)_&ZT#K?Q(c%B=Y=:#aY3[]!Z-^Ks3de(roH.H +gtIerr@[KiR"Ct6tRcE,-']GQcslk39>=T4_dWK6RnG`+JdAQbtC#YLWV(4FE9d/lU`gGJs1?"Vg"E`?`" +S1D0NFD;tXGWj,>L2l6!1!,B?ljU6*@M$U:Y@86\kg3#pagp]f4!U<3:tHVmcVJ+\ +VrH9pD7"]j3K/%]=>s([J`n.a#icYWKm&GpUU:;[J[.Ubke`drrDs3O7lD_e>Es:e +p[uV@Y>u#rJLA"O9s)2_)uAW=7nj(2jd6TqbSm+W9@;IbGK\9!_poUbn8'=R0Gk<^ +-AFu1b%Lih#Ra3:Oc(q0Yr^>!<3$^l)rntqe8$%rPu'\r;-C,Sni6H$23c"5 +DO-&rBICa4b%W>E-ER_pST"1qL;8iKiFt:-IH[\&Gu/=r4]PRiLTte]3o(qrq:?dh +l#F-&k">%h]H7AfoKD.piOQi!)-s5F#nk5kK;iR&,s=n8knZJZm.B84Orc)J+^F"d +k]#pXkE^S88S),d!C+gI;,`,QRd!,G*qn"#lalbgHZhnGRMZTrX+p<\\rN'>(W7c% +W,%4fA"pp$ZL9hSANq?O42_8]mMWp)n8iG$C,XB%HW(Tl2f0i"70fnqe%pm\6;m/L +A,nVlijTujpd>8+&?VOS'?Au6GMc3G56FD+5u\`;Cd$'RrVeF3LJik3;!3BNC6rUq +[$'c/Yn#[QY(a>*hSE"0)6I`5BbRd/r/t0*P^=mpjNnX+UDQJR-h=Y2Fn?V4(nEaV +=PU,%l_ZgH1KF]na#uLPup`kfp1VCq_<]u7!-_!rr@T4)#*qWmjj,iGX'X%n$4i!UiVRG!W:MnF6E'TTC1LWIEs7Oc#&k25BZ[JgPUU,KC4d"! +<%6*4>)2t8M5>fU1P8B!.)5gaBi.1i5WpR?p'X)39NK9oUl\Di%0d,L8gE_k(kX:@ +lUEu5Q:_8h=q6Kfmeb1Vo&H6%X(KKu6Z_2dq8+>@-b +JLg0A]/hPrrB?DGiHFlrLgp`ZsNes,(IF'rZ?Mfn@l*c]gKZ.*7Ki_AGB4!3MMk^O +]BgfN&1C[!V1luoG.1/@g.OhMqK"X3.*U"+7pDAY!k4Mi\GD\<_Il8!EG+ +0-LQE-M3oS)@Z@V>D]d'>pHJa2Dm+pt*G"hD_^hVmNaR'AH`k[eY*PNW;.3pTMd?! +$'`f%u5'I/fmB$Cp(B?gao7nCjOYsJG_/LnZJ2Khm4K<;752a4<3B/d^id"Lp^%G> +DjkolV_DD+nFK,jNF1\OE[U;n*TH5 +rsQ&V:6Td498]!VeRCMLT//0_F&8SF3.kPWVgE2e(VofHE^UA-Z^91OVZXsA;us/m +b'&oHY1#r'E/H"n?pTXL@K\Y`NKq4gN[Q#WFg6f-!rK5q;+Y^*poBk8LJ]^Jdukt@ +Gsk$TAgWM*2'NW.c>Np0434A_`:q-rJ.Ie7GdY2$%`=C\,$[N!Vomu!!Jnn!/#JX& +cVh7"9"#Q$1W)r-cH#b)0gX/nNtPQqIZ4*@.pjN;`%l49af$.$44ls>DuY5ej&Y<- +c+F^G.m[EnJZLjOdg2N!;6S(#P5,orr@[Z-b,NB#f#lG44pE^BJ25FMRgnY(UDt[5 +Xl5FB"pY0ifN.tFpr66DtD\55G(0p_u9p=i"+L:pom3b_UjcGQ>,;pA@f7EoqIXD(p_ +#Sp*%u+9Fm9af*P<<$P`XP::Li"VNo0>;0j[gN3FmD:0:&b1tSpnpUBZbJ$MWSqKh +tX1Hao"2@lX)1B!5W;4i.YMAIpgUUDo9:Fp]km#O6p0/)!O'jg?Q9!\'VOjeA=4#) +j@PH5n#dO/,*@CVe-C#kAhBf+5uNm$3("A_gVoAM*J3j[B(/W5qRkNFF?`O@kL$U\ +.XpSF-7)b7ni&q3)(Xs%:/q"Xt=MRT't[7Oj+;N_u::lJ>%jPH-\jM_\G&Lr#2F/0 +X-aXn&7h=pDA.Xi03u.C\0^*R\J!aNA[i[q`@rth"2]#;u(LZ?FcK$M3Q0Q[R!D[$ +SU\_I4,3e&,%j[!.lAA0)_LD!8sn"[+E-4*pW_Z[d\LW>>7the8N(Q(?03aF +-fiKN!t-nS<70!O8(SRp0*J9`p\d?Pi>#W>BRRK%G%W[_4CXr^n:+$rrCdI;_si&L +pVRKi#aAI7T&8F]8??D$Brr&q0n'pnL+'K6#XO(rrDAX&&h?>/!p/F48+1&L4A-Rh +\&+&HleX6'V6K;`LKh?UA%s'^U,dRWgK)!3+ToJ:IEBQBC('H!!^u&c6!t>AZpmG1 +%Fl5:]B#:?@cmlh'@FqSd.Tu$e$_N"W"YQ"U\Zb@,<'#3@jh]"C3fEB]O3 +@%J1c2LZ1?*C`:!:tcdG2Mdb$e[+]@=NpVhX^43;Sj$lFc1-cZ]*69aliX4=oF[]W +[@`GM?7dL8F^QB)ufmZ`XR<(j)=]:(W%1#rX4SA5M>bSq!Keig@rM\r(el!?BO^1p +,=I$/d^C>J[6eq*S(&4pFi(p_p-2A7r%f$inqUgRh,9RBAn?$;c.28](gDpUmj7Z& +CU#BiX1j))9Pj!el[$[3_O +2n)H);97srYi>sm-^]QA[/t^Kq&PV.=4+=#JLM;%IrEg&Dd*cpHs\u:&b3H2*=HAX +'Al6;1&8?[]Ks97JoV.,:_c%\_s'RXSbH5r7rDeI5n6TVTmL`3CYE9Giu'mF2^5YG +J4bU"oM_?XQeP9l4OKljqofopj.n3_A^>QTTVZ53q]NrBOX%=_P6m +$!g6Ac$;5bROjY62j4r,JWgK5/1Lp#OV?V2(X8[jS4M,mU:gdq;f"J[pZ1!N-j1Ln +SkTFb?A.F]&r+BU7@fa!:W./k6(V;qp5Mo.n_B_A8uZ&+)/jo_"%IhVm5Vd)p$_;\ +P.Kc-uUh[e:Yl`T]?^BYL]GChT0QlF\-F(AUO#%4HZ7'r(".^EISZWIqZq&1)[r\V&"N!i`I)e6o2PE"=Fo8IkY_PE2pA1Z/)Io2N5-^Y/].q1(-OO5Emkj88W;lmMqjOrJUI/ro2!8b*r`o"3hPD +dNAkU"X]Kn2OX^!jpDJo0NBV*.Pb=UI6[gDnRGi_G?T3ja_OS!.b(LGM\`=CEPO@: +6?JX8bRmX"M!_'pW(VQTFZ`o4sFZh"TJIRQsXVM0YY!EFKIW-]5+I*QLa$d9q$UVh +(bK+XaT5BX4uF^>M[mbKDO>r>OCrX,VNc,H\TZM91>2 +R\`Iq5>hL(d&m;RepF>8\?R">0:%i6V5$;Cb7>D1uNiP?I'C+8GPe%obbIL9teGmO +NIKo\',XJa9+EI5>AnP+Li4c2qV'P(2supj1DX=,FjSCg-7)`nF,Lb6+7JmGIfkPeJQO+6fY1hI,&SE-EJn8B9TMk +4Y^]ZYO@UO6:ejE_/iS1%GQXS9,jjle[.U;Z3OV70rnnK#)oZqFS8X2.t8u:N0`#j +dpTsmDD!0d0J!VEdi#K"P;7@W'o5!GfDSJhBV.Il\pnGt%.[m6;`O%?hOkA!Reb9&rOBL]E-3s`q_7qbJiM/Hc +"FT6Z#i>e&OX$(-$O29)GPa#!0BJIkP!QuiR,e$m+(XAl;>i'W0]pDh#ccbceJ..D +A-]#_`?EU1]d57]FV[.Ws_lX0%BQ+".uP7`-[ANho8Y*cJrG-$Y9S*<]rG:j):cAq +l>2#^+ln+dsf@71jj55hW&)$I@TNg*N/smZA$?A7X4uaI +0M#oZRa0SV6F;Q7mP#^ES#)J\'Wai#Q,SEkHFds#KBE91:2n>pjLYPUjm,E#(9#_I +I$/4rO0@D^*]!\IqJ//_b@lQFOB?&AgAcdPssj8!18q:-nnVl!Qk,?rXK_=O/dS)r +r@X]lM[ZbcTC +5F50aWa?rislE^*`2aLN_^DOIfRK1I8m@u=^tD1!.uRnnn?.SU-8j&!.k8 +SfV-7iqGk(tDd(H(UT\(sWBk^;eR8i7[Q'95irG`buX9(>c@]eimJ__&J]q%AU2_P +'c5Hlp'F;>'KliT=-]FJbEI-\G2O+Lrd_tAXe`X[m$<`l+W^",VX$h7@iKJ!QQO;5 +:&Efrr<8QGWS@`G,)##Ihqrr/]ODu292$:D3'l@6mO9lgc-8`KH>HkJ:GB`rrCu;2 +Li3fm,=mflbn67eFXW[p%uuNg"TZG3e;2mN&bT^-S:;8*"G-tpM8bJOZjlQq,@P]1 +?U7<5ItV)GQ&'#nD2]L^Yka9dG2b`k4,mj+WI^h2;=C79^O$S4F9p)!/"eJ%-,J)X +/l6k]4k<6j0)#N=3DLXr"5[bJ)I7dn%acBH`/inU3J:T(:s@,To>Ve ++7_BnZUi\iLE@PE(_4eL?[nd_S-`2r$s=jn6M*23ibK,-2:bSB#HV\''7l!mH/'PT +FV=TJ)K'U(W>$P^V9K6WPn\f5:gJKX8rP.P._<:HsH[OK6J!GqKA)c47O@`Vn(>p/ +BY\`'PXjE!kT)XSYIPQlh*ofBlaKGUdSjIO>]He'R`B%7?^K,<5"&iR42E +[:sPlp/nFJ3OU[i2M4q97*<+-f;h6"8KK(nI0jjYeKX,>".?fEa*sVaUEb[a7`g:QJqNt1FFGRGNdVg8SKhaT+d%WYKQk[]Rf1'@)U@V%d +R+BqW;04'!PRGR;&@/6*KV<14,j,IEF73Cm,KX[rk^i6Q6dKGn1o[CJ+PPKl>-3!:BHJ&(N.EZZa%.,X#'LM$^>5dM]!mm%sWrrBlR]KHdcr +r?b?fcS+Xe)%oXY5$P@H^e^XF'CEdPo:ti*Ejb,1Vc!faWI4BjK.H%1J&W&SW><_A +G_luis5JtLZ93<'2,\/>`qOpUNpHoq?."C\nA!/m!::e>cTYs'O2$n>"PUY1ahe!=G;=0TGs^M3S[% +p[68Nrj\Me$UW]B`?QAX.+pmqIG.p1'-GH_S7un@R#iZ[NC)b2Z.mMIq"P(R`l51r)Ild\*(j3N`@Bj+U9/T1`=1"3:C?s.CmZghV^X`"#%A +Pd4DiJotj?4$W3"eO4kD/K.llP&TM?5U$<9r,#H +18jZLVuCcZjf@ST^0\b5TucMmn>-ZAAaqeLRYpg^%5* +tnPjr%,PNI$P`DrDr5dD'J]91UkH]D%]IB"F(*&0&ujST_]JFT+sS)D[^?'dWe^LD +o5ji>Kin_ho1d>ZXRm6@sAf9o9R30*jbt1+1#m@DYu*d!!SAWrr=(X_FSS:$QJ.k` +!"?k?@)aUK?eL`@_U#!AO)\Q"g7_=[K*O?_Zrr\=AS[-u].`ae"`L].q@Hp56km +NM*'RQ\U@=&sKh$Srrj.Ge%l"G;ESV,R>C4?*.Dr':4>^)cNhZe*1RJsP7'ehm/ud +%],S*Hu^U@:2$Mj-EZS5q,#Hh6h2b8]Uo1.smHM'^5>;iV`$&^Y1V8^Pi'u_=/CCN +X$JEhB1:MI*b/LPm66$Fo/T*8sF!WL!74K?E_B/1tTM +O:j?g%,Cb"0DQPWlHmNC%AP26&J*>N03ZilX.\nMCaEf&:@G$_ZeWa5WoAkL"7dKR +b.6Yrr@Y$Get:CpuVBCHG4qbG]7LXIQ[ +]'Q8*!ZL1g,>N-:-"sPI`HYach?,g20TUk9t-.iQ37[(qbjC@n +7.u3c$renl5sW(>@0>6MXB)Ug&D%NPJGNDJa&'k:qpLV:&Af*(5gq!Gs$GM#`i:\a +DCb3.6-dTGH^;k*tS=Hm\$hT26=,Up6fGXTaMo4j.dTQIh,]_Gh*n]fiikKD(s'c, +RLa*+'a:4n!]8BIVZANEc)[)AJWq-1?Y@o]49qcJ`j^-?O1S,D=9.99.2\;H$RRgo +GR,,*.NIpR<.?O^Z4>5l4<8!eWSc3%ODAV2?ltHIkV/RZtu#1@!-t,*6bKD[f_67o +H2"5SnTd(9^kN_I?Ro/@,jIbo/85\EYir!l5QrEoVTI`3=Wl27=B)#oS%bC*n"(/$ +tWEaB8aL]u!+(;u&m[r8;mircm9I?;X +#,NB>]naj,FiTk^cn$[VYImJiW4+GCs_H8#i=%UcPb%3j.(2&\Dj_'LDArOeTD$qN +PVr?^H4>7j87Xt*QL!riV(B5GlZC'@qInkRH`>kGL-#nTFR;`nQ1KY]Ug'haQ/5!A +=U4G0P"S\7iCR#pj12!EUOMgMIK>>PI8Dp'MC&n&k_ +E+Fk!5loC[;E%Ae:,s-CX4UMfE17&`=raM53U*GpO/oqEfc^>m%KS_)WED'H%V,[^ +7>W*lX-4?Zf\5BIb0#d^=.!0e\mp+7YH>/E=1Q\ +;iojXS-ZLrSnMNaSu2>-]d]elTcIY=#!l`S(jDlXn;+15`BXeM_'KItt2Uh!nB?`(4=or +J*3A>"[(Y5#=LSf.5LGil=>M+$G)#g.%:)J&,NBB*?`D/UM'f0,&bkIlIQbk0V=U0 +DT8`/\!(rQ5J]7eiHLK;Hnm:D:P/;'&-oa'V3F.EXl(B*.$5QT,E$%*jP_F"fh>0W +9Z@1;VLA!%Ik1(NT8k-+T\[dnf]7_)p0f2'@:sFq\;:F:EHtgSD"EHi84rg_RbB,k +FRIj,l[iNj6?[#L),_S+WR6Gk"h?*J9p8Q\_rNTBaq!q$Nf`?:RGC:&Riu?rr@Dqp +Dd6Y4tA`.44l@uo/:L&+#J@T3:+P6NoQb5A)_NWPZkCsIq=;*s1\5qCl$b0Z1 +kJcX +d`Uqp(_9MEok$^&'Tg7KDk9,q>il(Cg^dRLfk^k`YRK\5J*NEhWD>AnOXA7>PXSGV +RSg+],UqoEh0T +HdYR2^bU)!-eV;H@]Fl+7OA0RRdAX"OZaeCElBj=Rc-CZ]L."PUDN"1P+dtIP8[^_ +jcH[eET`-P/7\qW'.]YaToB:l1s*6!!b*#Jj"J[$'jM\Cj%XF`**8T.F(N7,1"X!W +9r#`5Fh*X$Qfu?19J"I6'=$Th]DIBl\]*>Uui>G/pu/bA9"2(33G$WpRWbo6,g_S% +o0"5I:gm0]K%K3U.CG',b(/L(cte>aisf_rLY&_LUC1&G=r]+rp>+grr<28ZkjhR; +pU#WggP9a$[*d:in!W!!&7hB +p[g`/pD.;&B_q(rQs>$kstHA6ZXel2[>H+LDr&L!8"Em&)7!AT?!QCJ&+B6"mLLX4 +:0t@'2e8nM&T@^hNOaNo%dI6f1&c$FLQ9X)^c+lI(7)WPJI,a[J5sUL>u1?Aag4^O +pQE(^PcY6$[!pq>4^&X#(Sk7i`+ud37l%KnnFF::\VVEeabs&&7[C5Q0J94LY:4lg$$=2HQUJGSB988SY6fg3-1DL-Wi(s[BMbC?,. +J[22ERW[sqH(ScR[h_(!!T%c@^o4?[t.R?RlDd2+^`<_f"LM/j%mVbA0eh_CSD[#5 +%6t?UiW0J&_=Z7nF+D)M@KRc"\eG+R]h9aqqYjY*8=b$Xm0,eV3tjE0UuZ6:_[Oa2 +GXC)5>"$E0:/D&ep)SK!^4"6C8]#>Nus-W^bGcgDHaL8j(Z\dT@1C,iTJ/Z!/OJI2 +VOdSoLhhc+]l/p,4cd$m_3%laVc?4N;b^+Vu.:I`8;/U)?.eTQ\g)OnLF&\2!mchB +WRrW+gmQKr2/5)raE0mnd]Y)*d@Va#>!W,^TscSW3/sBEd7*dhfr':q\@Bd4-J?"* +Of[hIQUtOP==DV)d's56`J*VPrNWiA145F$:Np>ti?(<6mX96)iCAOh_;M?], +B)P2:^8NN!!_IdYCaN$rr@q*)itRd9)+II:8`$dNcHFG4SIPqouB]''V=EK2i^GeM +Z!&F!.lglD;d^9TZMk6I_*LNPE2,A"Q#hk.a;#<\F8E2B4CnjL>-h?G7N]!.t)]& +mg%,^)Xb8Wgu5k\kLkbNObE)qK;]sf@_'9rcOd1OHLLfcecqWdGM^iJ1OjZLfg%:" +t>B/SqAoi0DlI;9g/RW!.pJbg6OFWM*H<89Sn67@.PPtlG]M:?pn1FboT,6-(;=pAY-cf80G,_*9e&^\s'S%^iVo+Zq,\*Yd^b=@2QN` +Hqt+p?gV&fT&I,O7UTrHl(`N%=C29!!a6`pJ\H0O[k5A)I(rl'7mMI/;72Mr\?\Fq +ps(j,9WVDH?pM)UW#9!3_0)a-I1t^C%&bXaG#Jk$q*lO;Ta23 +YU748c\ItgV6@=`P8[u`ENd]jGNQGHA0"^[foqN+0Vk_nh9b^rh"PqrrDg@GJYpMk +#j$t9$k;i-h.&]8C@(U#D:$3ftV4d-J!VOGh1=B'qM8M0;3&`m`7MGb*2:SCVp)Oi +/KeYGG"A#cN;4*pYe'8a9*&1[ge?nHl<"]ZJsm+HZ4ceETQQB:Yc95orj"_DBB;#V +u.:qp0ZFYo-i,UXKUQB5p6W@aUU3NQ+4gnaS*l,j*,GoDNWmUYXo^?#=%+i&nEa0TmhS-X!#;tup6 +)T1]rr=YD2t;C5^UsehQ +2Iq8179_DBjUn_C.A!2EMJdKhO9G=6hM2m/C!/Z]=F5%1'o*YaMR<]m:SE(1]?`_] +=?nb!SgE0kb>O47.5b.>$\4K(EO-a?SdH#7=\A% +q">\5TSA20Y9(oZ"\rc]1(*&JA^%:o<@rW8DZ/ATpc+HFL/VRUu4$2o3`WTkBQEE) +Ypj5nBG +,(ee82'D7A%9"X@>.VQ`"h%]*Hn$K^5Rid1J7$TPK:4Pm2%$,1?<'cofYV?*gQ;?_ +qu#-hJ/W%ddA`j'nhm97jZYS(1[&c#8t;dOc[!=H="8\XioI)ZrXY:+"[:\rS]m:V +n0+nkFj^5gIpSjTsL'Y7ba_(XDS,geLUB`*eTPU\`TsW*tTMjZ&VOUV,b$7Cp8A!# +F,Gc39P;K`HeA@r(:>6[r%mrUmG"uZ:/[[%N2']2\dEZWe,K\.rOYKHWc"i>KXF*! +5etJ;D9eO",r:.5TR?3-<"gio:PCmJXQ?bY&X7Y7QVZ+#lJY]k#nfiA[I;Oh8WQ>$ +^U,9Sknk`j3FOCOkRtK$](,u4-,e[m!\iI)TgS'd:oIn'EHZ%D9mNaQe=QU!^Mi;0$J:HKEnXpB]Gf"`:" +&=+Eb"(0?iL)[lHacZ\r&f:)2]ar<+V%7(VbsikE35_Ala&ad)Y4CW>AZ:R7gq-gZ +3C]DRE(qq04BWq#C]IrD@q>qI\'=JN<,_TN]\49>%`\c-'6) +Y,ArP0/ql?/s'k@3uNYGBW%X+2WOiW;L"L/_1&c*ho[37QdG9Sd5GnI63'g-\&sW2 +5iAcpa$0(50W6X08[&+!sD2XWC3i3%jrn=51T+G3mY5&?@_RM9"/'Y-NCQC#R<7)'k?>R7U69I +"ZT<-j%0Mk*p`WW.c?IT,>UG_H54$n4WK\rX+YS6gg+"9O!_$b@,X2jr`9n:&Y[Q= +j@&[NCa52q*npaDd$b*&s#HXl%G3bX%?cANmPL*s!V$MX`DT_]bE=MiFI*CVr?UKd95T.k+%j)ukWa1>o6:*EmnB3>rIMUDpQlQK)m*1=SRe)U8.EIWIk4[J^DJUIL +Z%?QSn#CTddFBMJ($K6Rd;rr@jkRNa^jnnamq8^ALDpr7A^Rm&0i@C4Ia@!7aVBW%*^^ +]g)+JbU/^!ri7QN:5lWrr?T5JI=>u\h:W7bp;^X>r$4=a7llh.fB1qj$_C5$q#+m/ +-MR)Sk%s/*1iXt8Z"n\C(dj4;An)>+7+RRk-BA7."fR%7hUMX[.o6*e-rf(moqt#f +"\NMb/D6>1)QS)#j['->gC$+WT"@6lLhLW]epaM$tSfiBEN!095FA[m_BY.AGUcE= +7dm;%JZ"%IP(MMIN7TU::$fjXBJbX4f!9me&L\6OO<56n^A6Nn]rSJEGEn]%6S3MN +o1(iN;gWm!:WO/(OTcg4V,JE4se8.=Z'@Crm%pXZY,\+>Ae=)h@<0\NL7SSjCWp+n +c&T@G^-Den;$CHisdiNg>7)'6X<;$Uu:$VNr%]];?"r6UT_E(%i&=+C%8-8em!*n_ ++?UMRJrbXn5nNa_%2E1+2;XuIN>>G[I8m"/,1cq?"mB3+OQ-l;r7>VXQF37W^k:+" +1Stn$N2$n5A!]O*[nG.n@8Fp]PF4aAS#^u%\mUom3OCX!8r\\Q[QIqZ":c*UTSPa" +0DM&K&??QrY!!@-^M@1`BUYNI5^c4?5P6ZSpQq&>J_i$_O=GTZBA>,_]GCQfB"[`( +*E6&pn@1!p*%t6FlM;>?PC.(6_WC?/aeh(V4F`IE60Mbm[7qPO!ZRBY]:47"3l6gr +r<2Apj)D);>lIO"0)2mpueSk7p")H^:$i47r77Lc5.?hIaI"0_%_S3_^$l\SnJ5la +S(PFb@.li/!!q:a?B`eho!4u>*"MsjQsJJ%tUiqM[PY#Pp5YOHXh;J.LA7PnuJd/Sm_A1UY5J?q+qU5ASRRJ&6@*/UTn6, +]sK?T\QQ53#N$o:T"rh*t:GD:Pt_^nB]GQG+?dY2NY4/PM*7]GD1$(0APD`A[:,cT1lK?eHZ*nRe;W^ ++]97nWNAWhXa%3g=a*!6=GR=*B41DTFWdPl(sFOrrBlJ^)6,o1DDmZKPp1/OuOu,N +-3$aCTcaiQXR*kgn%?hbjPV +."HB#O+9mK67UN>3`\RA+L8T)=ttlbQf4b-?D5mhI0jcg>51Ve$ +D"1eTmkKuZ\A%?Kse#5Ra\m(3+Rig#\S>+'l\0ZCYpsEJ9SSJSLq7q`:&RBAVgV:o +n\6NE]/NRNnr#=q9/d<"`F9so\Y;9)86P_GRMH=,h,W1*Hh9?WSHeXUYieSc*>u9R +Idi[#sM4?/WBFs&(_g;kqrcMFK&c\;(+GY`1_J&[K.KDl.'i8<4;=1ss;h\874l?:X4j,t@B'M/YQ:kB[CG)Z?lDu_,8`I8hp-j%]+DM#\KppB%ZeK2?2joB'7iEM!b([.s=Pl"pi&Z1upEg<))R2&J=5hlVB"dp@I)V +t/b(c"5+l0k##^m4Y+)I-5MK+cfh+CHNT2hr=*YjG?DbK5G +HdCem-VNl[<0;OnPA9ma@H*H:[[D*UHIJpV#Vj+i_aT2Dj4ih"A`mq%H-94)=%.XO +$T5L0"#8c`:,=eZ@/jaa!'([[5e&]ppU2&FH6%=>EU5AeLk>E>['tM8T,ln)f[t@O +5_8p&#U.X:7`s?;dncmMoO!'6:cZR(>(Vtrm,*#XT3*"T\^eZZPP,*6\;dFJ\"4=S +;urUo+&8pQ#!k=N`bbJMAS`5JT$Qd7W:9_EUk/c)(r%#dFQW?[RZ)0Lb;lli^*rZ# +gNM^%t*OXXF3Q]eg+IXKGKbTN(&QTM0%4QH3;e%nsTR7I9aTMb1?HL`^H-P,$GLT' +SDJ?^H,r>bJu-dcAM>E0(kXfJqkl4Ed#[ShDF;jCpn=OTXQN;%iYdY.fE4XQDufId2L9K2>b@%*1&,PCpPG5-plFDD( +JE7$\,Od3DJk^\(`,3$7E5CM)>htE8c*PIqa038P=P,WLMpSiYgBNkkJS"UMN]ui$ +:bM*l8P\]=c&4h")\.]^^"r=R,Eir!)FFIlSYb]ZT+')>EB/$_'^**[Ta. +_/fDi:gK8k8>"1p2'a/Jq@A-9Pll.^Du4;e$[CK%qR7J&^M-L@O.#Ka8mbG&^J6h" +FtnBW*fM/4YH>$N]?I"^:/l5aq($#*3q5*7mZgmFI$+4^7D0fdm9BSLbb9+Qs70BG +0a%O??N=73fWmR*A:0'@Vh7R^6Uu>@#jQp`)u2nbIG#G.8fD:A/G7Gg='<^a8WY5O +NR,bWWpk3PQT)=LXZY2kVT@8-^H>G=V?!T8N4d/\i3L8Y!5e&F'fOJ>3b]Rdkm%nC +M(/H6().,8s(9Z8e.\ASE#bdC4GT\,)Ruil-c,^4I6%:)gWq\!mCOV?4%N5BAHAN8aTL>prrA$an +I;#"PYjd_W.J5]Z<5n`8;3j8\6f?(aMA_hJ^%d+!5_rUXhq9?>;TN8_n,!_I/#e3l +m-'D'k.^#:^4%nUpg!6(gtgjK'2:fcL&skGSn^\fQ#KI26RQaF+%JncTR5-l5)0k\ +XF=W&?%/Wa)(Q^&`5Idr+Gf\iLb]\4p_/gKW=jFLW91]k*P0uD'"oIFV8ep5C^@[C16XhRS]Ef#[PBb(E-DnS-j-Et]MU;fWgTuR8 +bR>\2jC@]]D7s2c^16<..-tK4XII#Z)tm4a;8NNm +,g0rF8*/($#U&4NtlhblSkB2[mqCp'.V#T?9'u-kHQ+g!(d3qBuR4'>jk\K'?#gk( +*/klYl!5JYFbaoi3msN[\<^$"IdmFU[<'\SJW3[aNsR3&:T967XJ4H5)?'b,ZsIY[ +8<\H.KZd8j)ak/`rqEK=+L;N_.UD4rK7*["K1c*W6>1(W;*8WNb@-*b)tS[6D/9.b +]AXAr%X31dGh*^1T;!%gq?/`i)aQo0os2\XrE+7+,lLkVn[-"_e;o[Sg]Z@iM?QM4iA\oG![J!XR1$S)X@]&pqt?#`)K5!@j-ag3=COu?k!kK&!IddhX +r%'DdB,oWq[n'!_^)O9R@V"'&.b/]+&Q8bm>LiuBU9eCHqg[:PJs+S]c'Y9o>(UMZ +HWHl3+"Bo"0\XdCR+jP5A&q'm-g]ag+SIK=/UPb6b;PR2#Hr=E-Dj#Ti6o$blE0Y# +-Pfd/@`f27XKJ`aM.iLb^[Gr^+#J-76&bj$P5GDR0,6X^,!?EY@5gB"DTVpcY[gp( +WR=^@k.;@0]>=o7P]B$I$*o"p0kN%TC$@Q*Ai#E>7gRDN7)#O_]@gSQj$N5jICjp? +75pJ"%_sYO+ZgE3rT#JOqG'jM3]HLS=C&,ACnnPn61=#?4ssH!TEtj6In!JSR54C; +X`sqdYV*M>_=cb8/N]k4\;i+pj;KH:XaCnRnnhV\"5Et.@N7SaQ'fh]OPbb0*<;UI +(fO["_RO0iOoWXLPDYS[#5qW8bKTdBru5P*S#o#Ve?qQ,(Md'rXK&*Vr?NkTt/R@oZe,kl0/-U3Ej]"d1]: +P9c+pe1KFr#@m$d.H-DlL2YdZH6q`NTO6FR#o70h6c4>7VgsU(hG:s'ip8"<&X1?a +'Zu>0UDR[&l9Si.=q;!LAVL$hDE.8)D].<+(6W(pMg'q>-ca.BTG^oYZOdI!9Ci=sFRnXs3.[l/&iH"b4?J]P2;WI_f>(Np9S8+ +h=0W8$AFR+-Fft4rVipE8/Hf8Fn'f+'^cid_BmR@?"JdQhEu>Knchj;=C>6)"Gh<# +PF`#@/ZG+%OR\F!!NAtQ/\tV0o"`,Q8-L'kh)&0MH'Z]i)^=(K:I*FYHYYmimkcVe +MS&F[GPn9)EVC2=0V);@ZZaP!'qc`";-UP^2j!UUdlfQrCJPP^5ZUNDdc(caB:kI) +s8<^N9"WJHOkmZ0/ef>VHJ.mmcrr_=dj,h,:tddUW1G"N^`iMmp+r7N:G-mE;oq-= +RQ[NHpI]3JmEb'ZLIppCA* +_M$X9FKJ!%">V+J&+a!?gVe,-`=p644K*2LVo9M).*Ip[BMDL\shLSJi2cb^XuWH7 ++hTOn@b+gm>1;an=U:i\;1l]K]';o+&DKcpg7D'HYI9q!!V6.28r"9qX_L`C==\@c +PQh=Cr<1S'9?>oJL2ro]5Uo?@jeGpnlNbX5O?/S]2mM5d-Zli1.BWS+]Y++_'3ce +?;nI_k[1(Z2jOZ^66qW'(&S/F\n_^MqI&4rr>([q![q,nFQtb$A\LBlJgM.1=\!od +d`E:)+f9GDP.u>O'uC$kSC3UP.,5n(8: +b4O`?9PcZ83g_d1,]Zp(uq1kI?=Z;gtc5:ElkS[3&3/4YCW=Ep90U.i2geh4TjWdN +rh/(hEA6hJb,fjPIJnM6(ean2#0@a)ks96AHgCbK&$>?r1\RRNF;^ar[c#0!lO&hI +PM@"YNikpe[q1EW2(d#:f^Qe2I;4)iL09&fhD2[B`]G&m$nXgoun +Xp=EL/IoEp0d[gjoU"XX8";X.ben\p/F,onU8[n;-&&Z!mfe\<&W&\4H_a<'j&2^E +aF4=59/at(eXPoaoJd%!5'dZtJkW%tu5 +TKK\K#?SdLP:UMl:;X4TOa@?=5DOR`k3t%Ca=hWe>?'#;mkoGT4&LDi',?b:8CC!FG +#ZN,4pqoBGg9:Z-j.mS?P2!phq^JkCH0iWA$K"66L0cE:3m#4m`u,j=71H(P@"'V& +r(19,]$a6Ri@II*4c2@hiqUg,9O*DiNn$9l0W]S"r_rdq.5EE8MHqK(1dV(&6+o:2 +GZ1oVkmL0nhbOIBS,q\$;J/e")@6`A(TfmK?"1H-bRqPLJ*!^i +LB;D6ZZeine?a>Ftb2A\MKAU=ep0]=X<#Tl/Y&84r&=/_]%q)Xfc#U:=mfii9UaekWh;EUURncimb]iGocb%M!ZhR&EYl8lPjj&S:/l=E +R^HHcQ<) +$>\?..FS.\)^cXlQ+DEDr$\G+<^3)V![)j#oW3mT+cYe>'s<>?&#b]>XdTTeK-1.F +beEl2_n("#7DD"Q5E'2bN_iD5T_LZBp[[>f;-"02)2(TU>^9?QMPb\$_;epd`p>X+ +9kic>8Z:"U3mg*/A*L,pr<ElfJ03i7'5Id3,O_fNe!n-=oRjS27)HS%_3edHijD>)4jJ +Q]p38C@6kpMr0s;GSRb#=J#6$bOa<_cDZ=_V0_+O_H,I6Q(hH@QOoA%"Zm"a54H=r +rCt8\)9K*?6/Guk[Z%/q%5`inEeS$R#3dfJ+:o'ur(>L<`IA0$4 +_$k.obC-5,/nCA\T2VN?9PrMQGc4IVb5&kV6)$D7D93*?j@puiFT($^)Sj +i,?j;EK5t\'/.G@n=bDMmSWX?pNcpDJR$O!i-kApj!(5(7BTFC>L(dC.Whh0/8<\+ +euREoTsC +k8#TobGp'hb.ak$QUm1+"gs'[lbEDrZ#G\lcj_KTAo`pfQ" +CiDmGnlZ!`D$S9nE]<;$>ZT[Rgp\6>QhR#@i$f5"M03'1#Rf['EMsd7CAKBO2Kd@9 +t@UZXqSU>PZCiA8Wn)(mJ#Sc!KJB._#l:14\*mA&%%8:oO2_Kd?@:gj>0FWNo>]mE +WB>aOE9Uj>589=J$b5kn7pEDfB:W:.t8(D&nl_nikH&Nr1QgT*>-OCY_VS8H$U&Nilm$1@5*KG!oqKLWs5.+q1.-1]d<"MS))1i +&1I>p%7J"r=AiWAD,6JuWOr-F*%I`*_cu9fIZHp,BRrV +5oB"$02ssR$?NuEYgAIAX&b$@l<@K^DLlQ0R2[Bem9-)O'%6feHP?agGIUC)"5efBcQ^>Ys?'Pj,KB/"u$6O4H:flf4)7F> +O_E1r)<\LRYdA(TeaDiWoN3aLdi_;:;7]1pd)O?$n +&>ie\pfpd_=>Q3eEq)3nF"&d_/4N2OunMc#4O<)7hHsLEW[>r_j^54K:3jZnM=OZd +'O1O#4GKT1m+`Ifd"G9Q?Qn&,(Z9EXp"fQJae$c$8#]HO5!;$iI1-I+%[+%=mWLbC +UB8\^]P]hJu)sUL*pG6*"ZVG-f?43iE<84hA"GUoWS!/TO!.HG3;TUkSiXe!n=ku@GSf%(p= +*rrMO0eaFeFs_]U>U$^iKkX@4_olC]pm"$GiP%qQ0r/i\`Y6.FS<[t)XX[i*N_+/A +<&Pg7g&lS+&:sK.t5a/_ES$84$XY4Gff9-;SKjE!.lb()ufp5.pp1M$HC'n?"-13Z +&Dl,e(!tr,Q>th`Xdh@3SG(K2ZqhW.7QNE/*bIU,FmUlr"X#+ZeOnEQFa>AVmk@>k +(#Zh^-27"4@fDO"Xs.7*8XmW['E=DaIqnAA"J+"+,t],WTig/bKH:8G%g&:a?[Qh4 +Y,R=MRPqHrX)`r\.2YYhF-2t?[ql\^9uJg9_u+-/>sSA*Ni-S@.V>;H+30nDS"`l^ +Z0QfcOkM`4/8F4@=^F&S/SI*(2.Z3=8#Y`0YFh+7.pda,6S!<,SBk%?afEZjO1eUm +91>O&N/o%)8PLuN#$?/1&9D0m-B-P+0u3'mGh-UCfAIZni7sl#G\E&:Gb$6H&)YAr +Sd3P2ZCnV#I`*2C/9_Ri;&RA'M7&!kP'u2IU8<37[#pkRrD=XS.H2Vf8+n#2Q^cbZ +f8L0An&5GP#";g7lW]'K`HJ.OXPmn\!P?s:R+Hf4BK[Tn5\dFjRB@'QXm8*Ga@63% +J''T)o!"9l+J#(bE1h=ENnJp(Rk0[rX+?h*hf6O+7-.k*#e4DJ"LEmFW:nhcj,2Q_ +8kC7P?e'VIMp7AE>Ot9Gc*1:]J,Mk<*UL%1FTHMIh-<,[CrBILA-jHUd3^sVS?:6! +8tTW$pV!uLT`>u&PPA=e!;_u&%$VAjl6TE)n-o_YK;h97'5DuFh3BSVc8XU_"gqV= +bj_25TXK`4PjNm;f<1u)7_!EdWhjCVs-Le9Q7S*l%1E`D\'8$T(BP+$CD/<8Fq8Md +^-S\D)?H_=.4?SaS?((]T+B@qQ'F\3dG4uUC6kKl7[d=.6iOd!+kU/c/HoK:0YmD/ +]ZQ*\HlPOL=uXLgt`ZSP&'Xjjp$l<&egG$it_Frrr<2,rr@XoHp.8hq`$NjrZc.RN +TRPgU=SbSHR*?gm8BQ#O>tAFXT3b_q`=`+eiIsR!/EH3!"irW=kr;jc)4s3[c1F4N +Kl8Jl2B?GhP8rAam^+d0+?Xhq)VQYVb78XZ&%A-5MQ=c$T8L]B*!P[[J>laI`FK^O +2'VI5@]G%2;UtJ05/ +>\M!nm&E:DU)#s]DhjBitMONrrBl$]QrJJ?eB#N6lmQ'1mjU/!'n'$[6o!SS!dDuO +eRJo,k6cMJ)HR+[4d*F+F_8$%CE']=5h=cJ&@^;H=!GF*E"&#AMdVQLQ.Eg#)9m?\CTQrKt;LC460P%DIOrG^DffeMLQ(2eEir"NZTFS)mIGj[eQXCVg#Ni +0]#`8^E'>[(#CenA!u?`=EC3C-)*G2!;Nb`6o/Vb`"Zp0Ri;;^F7)ojRf)Ue_g-t4 +>[.5ENWu[Ltc\em0JMda)ucXqd9?LIKK:=qec6inUA74D(ZhV80;?l0#[$`ZWU=.% +."H(?/VQ*d[aIUT&g+ANj*AZrE_jr?p$qeD6i.br@o`O/J +s^p"pjSMrrY=%EQ@$k`8tDN9iS]__Wb!Ps$pq3!oj=je5>8]rqb2B$plPQ+"8MW,g +9_>KUKVE:\SaR"r8t,/:AE;sDhicL]=@B;];@pc6I:kO +kZ@GdB\jeWsj1TB/BYNJ$R\ne*r"JXB46opnd#s%VQcJeg7qd:V;e+=t'f?6Q_Q\D +JI`pa.BTFn#;%U$u*bj'UMi_ +:iOYr*Q/`c_mkRnBO8Q=%#!Kko8b=7nc\MN#n5'&aK74NFe*V6QL +)ptXkuj$'3dNb5S<@m`of16:RK29=rr@Z%HjB1>#pf$^XeoAS.@(jY[k/I?P(^g\A +)!#,lfTqRbPhiWn6blaZgl;$m4%(T5Jm_1f$:%cUsR3-Gmo3q+E"4D12T#6f=cQ'rr<0:pa9S208P+b%\`DK7 +Bk<\Hm.NsY750oC)1MFg/pbQ;$h2j=6mJgqToK2gtUf&AbJ?Dl:gcWnT"obflslH +NE$nYGjAY!![-n>cV)m\lrtY"+Oq#]*!W3HXdf^5Pu;s!)BuLrr?[r!ab,?)Rc3=H +sL<#.U(QH)[I_EXp>m"Qog,l#6=Ch%.A_=n6_g@ho-MX3`_BBppT>E@^?NT*7@6j\ +,`U_jZ,F3*oQdr_iNML93l3(anX,'VmEe.UZ6btp+/,Qo&c'G:jifm"Es$:e(;HtJ +Gor(>>&<6pfkYeWsc>sXJr):N>.P01:!ldQZ1l?raW]X%6eVVp>u)0DgY]U4FaHj1 +54GZE)6N7^^<=J^eb7p1hPY'^Q(hS]5 +e8jW'K]JR;1a(<#AW99rHd(]r("/Sm.=Fnc"!Z*gZ7WI.o%h$[BX%Zpf>PBTdB,8?KGb;kl`1"NRQ%dj&h_[%n`2Z]p@Yrj_o0TZu]^JZQd+@>iY*a?)lP!thC_K]D+ +3Co^1To:jH2r6N[=.p2L@75ninJefI7%AiXRoY!p?Ls?8=DW=ORJJ\-'g[[aG9mi$ +o]M`5,-JTCL(^Nn6Ni]4RG(%'3m!94@;,W6dCa[d1I'F(cYC=3sd%l\D97,+,]tLi +LO$0a1%MO]6eTM[0pI3 +e7ub7`6O#o)Z!ri%Ru/P!B14cPuZAI1l9Le(u%GB'+/Hkma+dSN>S+PP0?TUbg#`D +NWP6EX$Mh%@3FANt"ThUt],0:M6A'gF?C.EBTlN\T&3?;@ihNP9?c\DGP4 +I:"::'JbL*aQT3UO7'736jF8aQlfBr[T@RoeGFunNOL-D`kP@(QkeVf-nQ_5$DJ@R +)&p.*#S_YX&c-W5AT#q^(+=kC?*5NG(a8QjOG?i4q5t8V"YY2b4&P(Wg$X5PAo>$O +\2L!,0+`UhD4J?uI*.f!hSO +oYROoO!/Q++l[;Vg*qjHVDmQ[,H8;-nd0Aagmt5A8,3,:q#Kh7>2sqo!sje;8KG!M +rHR^O6jo]lIWU@M/P#MEASg&`lW.%&\QW8)4Dt3@rUIk#H`#R"+P*Y*Ve+'LICoMU +Kd#T)8')4d,VV;l)npJTBPlM5klF7R$-NlI%U]1i#;5@g61dBrXnW0M4f6$IgfKTU +IN`j8T[LFq**PO#4RCqb,';C8Wi^c<0@O53M6kc`HSMar$o7e\$C?PDD]$jB^G/P: +r!trg9)$D*-r:kY;,MrC"d^tS#9IXEN&YTm%fO,p;P&%@j#$Egu]p>G(\.LSFs%k: +[n(iIJZ2-!+n[n>ON0]kZVBK&SU0LjAmh(4#'%2\&q?\a]t?;1Sjdr`+sF.AG4T_) +H5?_Ct:Dcjh9BKW,D&\>q4RR+1&mD +ED&ULNbf+fAP13m(>2p092[&:O?_+j@letDg94&+:EbE=XL]J%!WjiO3=l>f +5*QVWn^^A\^ocNOPANb&maLUJBAanF!1:_8/]4a#9iTsa)ZE"I7dd?h"[43nI3iJ> +MUmYYqo(0X#/53\720j.0p8>8LkE._6)SqHn3f2:S??BgM+^G?6@Uu,b>q]*c()d6 +P'lmbB"g^],!]!Cuo`1D''/\F2]1:pn7e'(YU>-G+CT2Q0^%RXsT5sY8b?2%!cs76 +N!L_F'b9n58?iMMbS?]DJcbsF_ZBMp:45X7uf?*.?JH$'am)9U_hm5^uPU7iR.,n* +n]<*?OJGu`#=?JEU!o_;G.EW/DqdFZu0!-rpDRm\I@0[?D6SOU7AX`;4oV#2\@aWU]iNrqD+Y2A@D6fTZnt=4=ee?kXE_[;L +KmX\Y'@P>]K+uBC<'Z/Hn413"'B5Sm4L"R5-aCW2j:kr8=Y:<@Q#'"E1jJUi3gV_H +qh?'-e%H?D/W.!8gCl^>A+ah/a_>Dm;AjfNZ_JZaT4$Iq6l5^%u@t3DS@=Of\>_YE +p=Ea0O&8b7S%*9TFpRK(q/AD=NKhSR>A[eV`dP0pnu);,kuGaY*H)5?UN;V.U6aJ< +`2:07f&97,:_,'7a.%#?b$[5,\5&:_e9&H2u=d:S=L[4K)WXH4\k]h[DQcB0a@4`a +>2(j5OSM:[>kT4#e<#gi +jbTgpsCqJK>KbceELr.P:*Oo.N?A)aU,`YV\T(qfC8hhZE\Om=qAH +CVFlG^^rN5#@C[_2_;IEHVJJJ0uQVlag`I(o#Gj[db&X4)9la8-EqXd+KW`73b'"i +`@9i`LMM#af?I#nYQ5gi]DQ?gN!*f>IBE41gc8 +Sfc^nQh]U0M$jZ8=GqP(a$Ki!mZ(#8Ngif9),G/LS\4g50d@_9f_Y/XR,%?*TYCpk +P;3/GIWj)3SM!ZD:LTC'[lSMeN_uH*Zr&bC8,H%hDDL/@'-q[WL^XmjGfgQH1+!?O +<-Dt)_]na;]Zl-RXAgaZ*\A]"GYJ`.0m"7*e!W\r,!Eli@C*%p,FSFobc"Yj*W-B6 +/jHNOJlc`+>7U!g:Ik0>c\t\GjXRD5qAMBLb-:ijEo5UrWuiKHgp1W3Q=2IU9$/'N +Jl6!K`;%(COBC84op,i*Y@jKNdfEf2O@pQ75N]6e&\+k;6"Jm1fuCe>)U[[(F`RTt#r'E+Y'+@ja8uZ&J9]3V\s7IFIG1o-Vuu/mgCs:dn7:D]] +Kr4c='C5RfC^Xs/0Koq0B=qI(2^j("7tb_+7-c4P=P-R^qU4Y%72!qh($r+AqG3s? +)9jY(#=DX^.00p7JgbG40jY"NkKJ%4dFRZU.KF:@6m#I=9ehgS$E(B?M:UF7*]Deh+!t2_[gA-t'l%7n*nJFTbd4+4S")5>0e5n\[NtmL?"8s64/jJ.s) +>l"len%_;q_8BIS^blVO.B76N1ZpHE`tr%)d=f5XJJ!gjuiKdf>c_;;!i>C(EP3u[ +Z#$An(Qume?YFjZhL(8WR'RV +7mO-1hY'KVHGgL]Y7jZaS%*53WSr=rX5XoA)^h*q`K6dd/GYB)T+ni>JqsIqLu??g +'$">6R7J=8,BGm6-7Dl\%R/h-'VR\_gO^_O=[@^0083'R:\5T//I_ +IFNkTofpkGCE-UY$8p(2i6m&3/tSfVl(M8[[jEcp(WtT3D7Ks'FjVbID78MnPnLb; +T`*2ij(Q9``K$%$37W<_4M0/aMh+%4ZENYqpk]H"?,eiQZrC>A.lcEIjW]o4alt!5WtF3-]rHK>%&RD;fu":Z?`G/TcqBQU])+; +D?ru3A6DjE#IgZX4+H5pchqD/O2Yr,]Q\Bku=_Se=%;Ts%rL83\VD]9.P*nej_)N_HaiOc)4P.Bpp +c'etM#El,"/gBJiLYtsZ$\R/bjrY_H_aqA1h#1OYM'b7c:^)C4u,)WTF^8t8@3Ti= +`0=f5Bn67o4RGTV@+L"lem04ASfJ,WQcAeZ,DI%*.r#&o='VTM3n2ON;]\enBtHCB +HIRuY1/VPj06*@GpIk&^(*+-T9p+hS<#i.L&V,Vo_kUM-?t_Cf!W])!(!UZH?HdIk +HsaFObahe>:A)S+)j2",6OiI!,$1o"6J#9Oi!"7uu5O5?r]rSl_CD5NCLS/HSXfiXk^S6((?@Is;IJ/VoIUlSl" +RT#NIA?itf/joN!;mRup8lmDBV$E?j!MNRWC%Rmjk3jB7:c9VDm_"0M9jH<%/Wj+m +Vi";-MlJ"nHZqCNBi=bZi!01JQRu$I)pqZHB7B!;b:r&i^k_qg8fgZ7P]%G_gj95P +5(gP!!R3;V1(2?C-6@n*>+mk!=W$Fq?1c`(X*`-2jdTMZ@fc,1'\ZUQIGg@'Dl"tp +Q=66r-Im[b8Q'BEFYnB$Re$haDJqB*0cd`BTQ9:VSC0p@Pm#PBHSB(4&-r`"a8D87:`6-_"CJ+tR2i;UmM;r5NJJ +)MZXg0==_bSM?!X73.HrX+/P:MKeK[F-Wj3r&L7en%Ngnlj-`.L61&ckgR+qo%ZsX +#eT)'cZk8nTC@&^+]8pX_ZKYaPUR[FSe/3I%lm,$F(`_!@)dUE_5GU!W=g!+(!F_j +NoJsDla`N93BSLCT,1QG,Qq#G"EPRVJH!WrOd!=ci+7ln^V4P)16Y-!iqNGogZUK6 +1H;8i6N@YidV>OHGu5.+Eio"@,F[Ah7Jfma"5Nt=Rj]t^s6ptlJ\u"0'V +;LW/g7_`21&a%3`snF.[2AoDO/HFt4b[u!(iie)nq7ilpH6e+?N\/];b`9brUT5.7 +j''-0qLH&=6V`r+S]=(btD40"$eM$VU%g.T)MO^4)Mc6O6+$NY_f52%=Pl[#7Q8.d)6s(YqoAj%) +o:Hr:"Oc@TP?YND[Sq0ph*%GTXK_^qhMJ=?^3spg$Ycr8>G?Q$in*6:/,\V,P[62%ihAl'Ia!%`iW"DZ`a35FOVU%'d:nUH+#\+ju[077!'l +B/6IFfJ4-UbJi-k_fPb66mErDA;J9H(Y[Ppg:!di,9HH3l\MbbC:74pba=1B7-'b< +XumZ086oHo,*8#D>A7oWP0lSiC<@_Yn)WXoT(*hR<4poK')&a'\V+ca.H.#R0bXcd +`R-/#i<^!36:ZSin8\giT.Gqm-ePlZ]s3i2JDYEh8HHS.Q`Wi)HJ0+D?3X-J2:['a +8R36`KP(\3]3\h\o!3sM?UO4B7pDN=$fZt%WVY_fF3';$9G>LCZ-jgn9@.7:Xo;NW +p-cklYa'-ZJ3:kEiU'0X_u:a3+MQ[Ws(%4k-odHlBY`b[a=Z+2Uat,n7I;!V=^3oT +#d@*pS\rA=@b.t$+R3q&XNph3#M6]#?&tI7I_Zd1ZON.rr?K]GahQ\CKF.NPUr#/Z +D5Mm@gEB=#uS>EW(G9MVnLRH4<5`=T>UVV?QStu6aA@n&@5SH54lJ!0jd!Hi#WXj; +m^--ai+7&IiZ6[bG]eu\+'ZZiEJGu:"&*L4.End$sH'EJOQhBR/EgY\:Qn0(XiSdV +J-sW[IEJ%`d3B5Wncm7:t0*K36W!b4iq;YkTc:+W)@n>P&bm>IgS@Wl[KR)qu6X0G +\=qJc.89eW#@f^*Nc*EJhUnY+V1EdM2qdAL+m!<#cIC8bJ_e7I_^iDf;?7g33@!2V#2#)%&fOXW<@GH +mk2md=>Kp@SLl$HIHQ:;r5?7@=KASZQ*""\![]BR8K5Q5^/A:0s_EV"$BXhA)Y*S` +a<@".F^1[$7hZ2`]Lk+=P-ekKU,a]_/7.-D`KrQmp$pCVWbHI)RLRsr)>da$lYWjg +<4-,[Cr-l:0C[%FX;e5N.8K\:'CVud8dUS!$Bs2h\fnO0?)D*(=BM_lSNir)(N-uJ +L/.ua]9c@JL6Ya>kjB>7@'"nr?G"boVN2PrNRYO/j^bjeKhRnP#rbq+i2:`(_URB; +/.lN4tG!WRe$#BOYuO9-89mHUBCY9]C;q^MtfqDq];SA0/Rg[[ +MGdRBq6X8EA0bP0g# +@VSEmKY5>N"3LMNH>d4!"&>=r$7a(bh#nbXgXd=@:UuBm3<$=bcF*56#F>%D6/CnJ'RR"MN;'lW2FjXUE$iM0F)TVeIj\kp]FD5 +Qmf9;6^];;g*H37cpVFG]M-N4sSQ>%h7i>QEl-SGH&Om&DNKQr?C/X)Zr*,Ep"8a( +u]UUm9#(Er&4^N[C*Q.93A)GV#$m?$!ol"86u$slkG^MgNgaq>EA,X%(q;IXr.7=+jS$t>b&r.$c/k'=H>c<"?LqZg08g=omE7<, +p#i2PdHQ(lD&;E#5@-t/ToW*5DhR/AZ&(A(q`Xgi`G_fQVGm4`0d+<+NY-%ttMJ`QhHu@m%J2FnHi]UB&( +:0n&T+@U!Rn:#T/upcpcn"M"NMBNZ+.-Lp&&:8oFNhH]ebfI;j2%%m?c:bR_jZ%_- ++Se)D')'Te:ltc,a-:Cg!CSr5^"c/o.VGO$*MIiqKA@e40&bV-cVT,j;PD-E-+/gC +#V]`A?;+G'H*;?P/(mn5ldF-??bBn&BCMZ>(3NTpchfn[D/+d^U05.#+$L#q4:dQj +Wtrm)Cgnh=jJ:B,k/!nn);gAL"D9*XY[rMe\kNI?6@U;ZZ15DO]@boN*1aDG=hj8% +]V4.X*V_QEMLE[TNp:;[LtrKVeV@Z(/ViI9$tp!,A?'u"3A>UA'"j%4ClsMSgNqS_ +Z'TUhtU:3FC%/\4DPpoP&'Na6Fn@0)+Am699%hC\T6+%o*3j+J>mDC/Q__"iU(-k5 +8C>K0B+s.DsfHJJ;IZ"!m;sU?.^l>ZHR:)=]MouNI],LO:9rFXo(Jdl/16=2pgdbA +=e4?MT7/K=s:=W)1g)P@%]+^il<9Wc#u>@;q,#9p`\OJd3kCH:#d0!elc3.6g?5\* +d`=jHWN5fY7J\CC(CX,r)Bo3\(C:0htApi/d70C%(k1tm:D+:"9M=Zn11C9!.qF[g +WTTs"ASB8r$-C3gY56XI5As!4KNQ*I)IuiB+LQd,NekA\#T+: +-)oeo1/f\$BEcU7C6)DP$jHX-qP,(r&DOV"qROr&&K>E9UVf;!^T]?O\?rZm-BpFLHj"R/lp1Amp;L4dr +YesIlWDYFd)FeU8?);oRT<;%-ZYA?C&n7%D#XKMmtH#:KV&m)$b&FU2%[@C"PMi;2 +uMG4(k-VShL'//7FWB-TAq"$?!>2cY4^>b@LScafH;R:*.ZhLIP%Htm-J>VT"D7l6O]S#L\@=Vd$$dNim.4>a^t2JF5$8.d3+<%`$H@WnaA+L2` +dfob9=@:-,SE*4#gH-ZPK%S)!">A)^m[?AaP>3\mIMA(oV]-g(q*pEMa[?jD0b! +8IB]Kig1Z%bT#_,KXgh2WXPS0\jEMu(":g'S%Ll]j=F@=U84&oX+,'\g+ +HdnYXs5siL'R567#%75J0.i:,E[MWqE_ +?4b$bc^mBH[:!>eQsiWFmTD4D]d\8>\[HVW&A@=)NNd1LR/)W>sQHTX&s_A#@''r&\5&T)oT"6qj>0B$ctGY1 +%:uU27Ak1NF'oK$W3p"EGZT(OJGqgjhg5_%T(-P)4M9-!!3G/GJq)Klu:hFrZ,>Xl +M?j,0B7[eOA?:rT7u]DM.DbuAW:k&i,,M=29g0.g30+J+MJ05Y;M5&$@#R;; +kM"jAG\!_+dDdp*59ja9'hkJmO]*NE\J8Z4^1ARTbkaqAWFIaNA"JEZ-r&@auFjn] +&I#>'UF;k)tC;Z^_$hPAE+o0n;#bI(u>*U^%%u-iZ"8g1nin\(p9\rMV`Y\6'DXnr^1"?DaC"RhH,QW%qPO7\/4J +A*q4*tNa'nMc7TV74hO!4T?X)#/h'DDb-H9h7Q'L93jJ;C)hPD6TQsA3n-7a^ks-! +5JK2Q5]FoL:f7@h.h97oWukjWCq(7Zo50WI-B@>D_BiR@HGd&`\ecV;ice0*Y$\;D +7gO$R_?JRSX5(6m1SeDq^-e=Fkt?0i3i*?mu+QO[%I!3:&U]:g +?/_%)tP&2#%5aE#i2mkgPYN:YDXJ6A(2do:;<^IiZF&HfS<7[`a\#_Br[2llYOcRE +k%9$NX6sm#Ofu*/"Y:6LQ,>'0TnQR/`i2nk>T/@Ga!/C96&:gelD/`u$iq +%]Z4!%*4[fg,Bum)aHeH`.mS92G'%]N:PUr8u)6b[lq!RRk7LI)%HZA.IFq57H5kn +OLM=%b#O7&8F-?8IJWj$Jn5FAs-dq1GJo6Bc]^]@>IuJJJFA[j%U3*rrB?(g>2/7H +A7DVKZ*Js]O-MGI!dnSFOm +hg;5`f8=_<)d2Yq\G1\upNH,nR`n05hAF_`NcT&IB +b1L:ipK<8,GsO"N!f]EKE@C(p>6;N*=DN;`7?TQ@lrn29XHH),3s!Ik`,k/:M08MmOX2HFT>eZPG/![d*l9Z9i;78O47SiH1u\ +h9]H-WnqF\'q_MXVqDO7PWXTNTJ*p4LsW?=@<:0!](HQ:eIl\41\M[pS_kopTXFel +7F4*4YG=3_pdh]0-u3,/5P[Z*_@fFGa6q?fWeEn&-l<2ngg;En=Y1FCi(ldko7K";3Veo,+6&&StL-@ZVCE0:Trck^ElK^[VPellrsJT(J'jfe3>a3H/%(<*9J,!`;3mJ6'>"*=DOG^[SW1! +$1`*],qmbHJu"h2eSqSlrqf@n\ZnP\X.?7#[B*&hR5.h4fcR$4h&qEr!21FJ61GOL +S=K8H]:=[cV=De\CRI$&Du8X#Bo:@Q:,T8\D+QN-]pY8?"NQ(_bg,#f1jgLZk"%!2 +Tk1SlP&&E@#%LgJF#2G,]29[b%#[k#;RCXNgUoCKs1D5j*q;IH68('P/kAL*i!L/R +q3&[rUR\O,]R'CDmVd.`\Ee6PC\Z2U[bJtLVFhC+5b93)XG6YT7_9G?>--?3lrV1q +amQ%&NlCl2b9mI?%:@T[tDq3dC^3elFn4a,ggFrjO82T]oQc.bk]HcC"f6%rM;2\-!fq_/tC=.dLQ'eu6YF-8;f +jC!E!Dlclpadf2M*\J>J.8FWq0;.146-4?A +&@6S`*.8`(!X[;5l.jrag0`4)dg^!5sm^HF@6es-Id2/@R=.VR78(e# +.aW3Xj6BUbjmtGG9sr5W&3a$R,h\-]AGfJmQ%CR]bR=3c%YEeDmdX#-_NK`%se56_ +`r%CZPH_TTHTGo!Ot?KcT&'&U"*u=`QW..DkH,hb'iR<_f#\tWsQ!&!TfSU'oB^6h +sp?AgK)'n9g+XMhY`c%jGoH*_*t;]o4d.?8VUdu_h&DlTFNa?`;V%2/W!l?`I^a.7,WN:6 +4Y+%NH/ZsJ7=uVSkmUl5]^4sW<9khfeXZ3OmC=\=XR!#g3H8L`.u06*"V3t)99Z3g +4TbX[kiOS&Y![QNbZ9%N:1;h^pof@I&]SCH@&^n23a(%]]t4#!_tf7I[-+rBT$r17 +jA]tG7h6&JpG<8@6]ZfY10Su`Q/HKKEq-,>Q,6q"-@'(_@=G>e.M.QRRWILOZO<-F7Q2o!Ign_PrZBafe1<[VO&N%i5Jo8Y'?=mm#"?E +&nD%UVe[sWf[^LkKAFmDM.Sb8Vr+HGD2c4d3[s8.-IP%%h;b:6HM:L1#+p;WoDS_, +81TU\5S9mHPgBki$9>c3`I#amUM(tgbI!9gX:U.A'A!kN.K;]e['$.=O'J\EcY4I/ +P8\Snc@f^orER!kbF4Vr59Xrr?q^1V\kPJr]M_ZXI%0_li7paN_OD*>(?6\(QhU62 +0"?gfFM_rX4nnC?@AnE4hl7QnT3931Zsa$-I,1HPa4$0n4l`*RS`B&B6a(=lri5;03IX\0HB$ +nhbAqp[&;B.&kX@!:\)B,PBkVKZYXSBq=El#BsEGi4Ohm\FgB[VELQK%&SmB7c1#P +1t6j2R1'qNF04)[\,O!S7f,$W6NT.T%ZmuD4F/0SqDdDl'_UMiL>'CFGQ[_hH!jUk +/-Aj+]0Z@L]/mkao:a(C[>>R^m<>lfDZE8kOCa:nM=!sm?Wmgl!u-2r`>8hR%1,EA,;9EF8KLiCBcODo+9epC)c!bZEc +5ds23q&A)!2^G2)G#gs5;c\1[(hTpP3-%7`*OW/FA]?=?BQjB>6ei](!+H$nZJ3Qp +s\9\&K*1mT,m]qdUD>5ahu?[/k?"(!&!Q/*'PS30^mHh+aAttm;<[iX*]7natFs3kir7)g +PuT\'jjB(XlG=&6It#>iZ>Q)7^RWh*,sa0P?Q$f$HUm/)!<-87VDk#RH&c"BNeF'[ +tHpSfVXG"C?qhRl7\f%D["D1Vud[A\(VbZQiLS-.k(dpNp6'u_&`sYa`F:o?97Rf] +R3G!3up1jJm#/XdR_t&8N!'M?s=Kd=cD"WL]QQD^#FO#58Jo'RYSgG'9,LTS'?P1F +V#\+jG$]r!E"ZogjjP,[WUK]CWF"%M.rp3j1c:4aN1?)DOQbGcpPDke\O@#E]Sj$J +3;9?i1@[fgDqmW&o+$NFbtMAp#tdPJ6BJp/@(HGJSpo#@qeIQ@659>1u!N54nXKuClT6KbT76Jh,VF&X()X47L,h@KC7gR":ZA@d>Al-Zj*qt=Wn^f1Z +o7FKK'ie5HXm)'^a.GP`e5pVe&!V>gOMIN@b*RVgTMal2V/>`oAjL"I,i3 +Els&3ourI1F!Kl3Njh#YDrHmnB4/hFFP*OJ`U#UH`+F*m]IVh])qmmVZ^O\:MaMX' +\uF&pNjN*-Fp)naAQ&9S':C,SKTl##CnBE8:Km1nY +5i:jLP?q@:Kt"S(rY`_Ogop-P##>QHP&LaTf/&'8&h"Cle_csY)L<@Vs'S/c%=$^i +,4C)EqrIfgp-HBI[Iqu[.PMq*t\?Ui\CH5$+*T9>[#oUWQpT?[aobRRiYEF275pWS +192.8l9e_j#O:QdX3WWqQr/H0;hNlkZeD?-*lS5NOTV>K@+BlSd"V5Lb3&@nLq`g0'cKc+L6?m2&Tnm4(Si%VBUuA(N<6`, +joh8YFROHM]*qCAN]MIYm>G`@q-=DU#[U+4NQ#\Z?foMh4.B`.- +(p.Sj$jW\FUABJq]&E;g"L>ETP,B(eMWmR`]b6ReoY\@`euZ>d`0DF%3n.;=c,.IX +1D7qc2_/NXr#%V!#Kaj$K13UG`P,$eZWO6f,AePT6MT(-Y)t.XMDF`,VR63INL(Rh +[j8*n^1QVfjaIC%U(qBj^o.65llQ"mh+snBRliD+`s4IO4b$D/E_e(;ajL,TBAe0X/Tc\F>+k%R"UV5Ab(Nr +&t&[#4m3FZ*Cg!mbN#&+@U8WQ&]rhh[TZ4i.)>Ep%!NcV4hZ<6`&Q`qGi2T>Kc3_9 +-Ls0^2hJW+]&AkF,Kgtp<^7.&,8)ai+,k$/Cm\aH;[#n8OeM2i4V&@_eDB0, +lHHoo3T,hM*cS/n>T@&\"6IOXP'6QDe71XE,MKTfY +V0o&0'6bba4On2X`O?VMetZ:cs_,2\8Rl,TFP]sV-DMq=K;Oc61=2ILZ-KfqbK[[E +^Inf@cZUY"`OW(abYhEW'7bpK>VX$:Z(8T'Ba)i4E3V,4kmR4lF@Y6bBAd*\$J00,ag3t'mh&j2hC5)>m9 +-d;N5\CME5j;I]d_OFG.CTjSj#B0P/]>i1?*Y$^@L]CpN"J;hoQ6B:U_a"E]T8A]P +Q=8)3?Xl\qnD`-7_Dr]fV`$1jRbMtP[ +4_p6iMh2^)mVR=4I7PnakC7d:X_2?4b7Griebd$Q_E=Ye_g.YN!DjeacU&;OC4T1f +E:4ZJ3J=Ki2,"Mgj'sk*S&&59-KFPGWe*VJk$I1Z!;e`!6m\Ch'"=0-` +fW0C/^?Bu[73gU1OYnt1Oq3=e"i7o(ra%:*@eY(S/=jWJhb+@ZiM>\>?d^SRt_cr? +Csi;/fsV,^-]-e]-#%KUQ*n1b5a8[F%DCKM`Kk&3R8e4!(j"m'/>>FF/UY7TC_kYZ +n$0<+?l/;V.=9Q8L06d#n]>3r[,$R5sBHMd_0Z!-j%Tt"c+1DqUCEB(.TM*EK'Ebg +UZ1n+K<@DIIg@Tj>.5&B,Nk2!G%+1JVZ>c*-S=Kd:%j!(b\%^k-Lnp&ihlAD)!pYe +!ul&[uYrY,W?38mL2"F39WRf!9iJF8F[H$cTLAJ/sST%[-HAnOIKAt"9*W)K[7+To +Va"I&jg&n1_W@Y!&F_s1".5H--_O^L+-aI#Xu[#K=3][:'N`)*.%7M#\&c`L1?8#= +T6O22^*$)CmG]>GI(q^\J\?&^=Q_,6eXHWSc:rh3h;XKA>DbJb`B&WP0opOL?2:AH^IJ>Y[%k-iufM +`#o\B9<7IN)iI8bXr:d,67:[`@Pl$B_+r>URcR$.sVodY.XK1-?)]]Z-EY_I\!O4e +@[rA]qs5:(@=QD8(q(,)*u-Frr>@[MPmZQ$LoI')sa%PX<#J"8N+XD7L0mtmGA+u. +`:8Z(?$:A-.^m2X0dIYhG--.'?>R0KrF9_4nbP3_eH<]nEqtJFZ1?:iHPKHoW=Z[_ +tVMlG1RgPNFKM?QrHa;hLMWs$1"40Tg+9ah/'U3o-B;ZAJ&cZ4iZje-in2_9;H;@@ +=F&CAKtdL[j8eo!H.l"VHe#6">J8V[Pe,IMna%NGmH(_PH@n"/OoU:ji=H*p@ +L!n'-tR6W0L]hj@$4;/G=.\N,'3:0T,/Pa6eRC`Ao*l8]K\7r7=Oe9aY]]e%R@g>cQ:tIQ +9U*>c*a3eCeAXRjj#pYe:1ZKdisN.6!u$4BSM"YUl;eWcaVq")HnJg*k<#AMaGkC" +]GuN.kJfQZ:8&acWhR;[rd$[6IPQ%V"%cPD)e)p)jgA+PG'D_n2kKg9:Zp='K7Oa$ +eh<.,iW*[E(0ilc4@U.4r3pg"il[@,hEfB[CLJeDA-]GJ`T4Ai+M@@*g?+%_7gr=r +(-R#iCeOB-KU2KIB$n-pfq@s3'@Fd2eh7Dd3ZKSHmbUk710(tb9O>,f4sq#B>,nFY +!0\#>K^H!*UJ8kD^sS5/$pnE!,'ogrcQCjpgW:$EnoA`;8M?c0:])I!(J]%"3BMoP +QB$2po;,8S(jJDg,\:^WZlJDa:8a*ggk'GU@@ +*ne-P!P]h95P7S`Ya,PBps4)2S!M\``2s<7`IC%bqoA"&77[cBED9n/P=J`CIpA;) +5;?3f+C:f9!-Hl#fomC!:$X#C\pgtY9L>f@T\O\_Uo-YZX=a`?87o5kHpQ+_Fo;P5 +pfEr-&m)5-`LQ9W9c\44"Ve-%nAEim;Ro(R<;Y%fnOrR<;$06pRhqaH+ZL$DH>k9K +ErPH.\nM0D&=7&N/Zo1bo(nQW9O1A.;nM"QA&d];Fq/pQMH@4O/JljcWOL0f$,BE< +KYu[)Z8H&LQG'Q:f#H%m9Pdi^P^b-K6d/0W7KP=,AlHj,TQBt)h@*3cWU=anF!EZg +KWJd]4i#0[YPqKPn?]>_H;=EJdsm5%<.n"nNFS[La;O2gdaJ#)7SPeN&(9Q(p?s7O +/sZ,X_W(6c1]h^63Xa+!(QKI$Sj"ecoF&E^p'/jZj?e7up5p6RW3R+Hr*Te]dfC-9>l3qNK75FYd:0f$QhJ0 +c7oY4fb((<#+2>YZQKY4h,\(N,CdASoC]'GRB.d`4i! +4QFj5L-h:QVuuHoYgf5dj?Jn&>sRjCK`;capsF<<]tNDIHqZb]TAq\UuR>qro$;\! +/KcXa?K4sf(]^]]NqL4@hB*V9SBr<5T&Eh]m!d9NdHVL:XMeF\$HH[)ib/%T>nA_K +/^Xp]iO#0?E1gTa43g:)<^P7H=r'dkI(*?bAtbVZKVX'<>aFU+Qr'Q5T_YdSn*d)" +9ZqD=G\^45E/Wo6+l+sh>/&>\'nlF96\$HWH-aTB;c&u70#VtBB71K)ptO"&t:1$LqBqJ5nM$@4j.9T`t]Zk8C/A\SMYsKd#pk3R2:?QIk%h.p.pDjX&*LrpG+3[9a6Bc +*^;ff8eCfX]Z*>`_D.GTuro"*G_:SS`6.aP)MIVTFG"*Z3QF9*:e?N-dCAjh$:&If +-Q0u47pKZCh/]:P6G3=\B]+C!odH/9#[Edm@=1Vp$+H".8gZH_ir[e!lWiL;T#FS[ +4T$a/=>K5`^c_q$V9;d&rjSb%rYVrAH7m=-\/n0V*(t]H@BuLc%eB:g4+p)ciil&f +c)%GfMnqSW!mq7!>qgppM8pY@LbBD]iCD%SB,k&DYC6sAkeCO([S3nmnG@qXW)&>TD[#Hp#196rIT? +;&cLbo*trg%)/]I+UU%J":<;)U`kQ,&juf@UD,-FWW1?H0)L5obhS"dEjAq7C9j?QjZS=1n;sDfKPANp9>c: +l4a5mc###UZ9jc]_g=93_e_K^)YP&iR9*b1>0UP9,*9ja[O)ZeV8Cs#;>*(;5O.QW +i:Tu*'R4,mN>q^Ik$'E;+hj!?J`t3R5eg#"hOCejEamAIg(RtDBlg$['t0p\][2'T +9h(JnP[,WUV8;,/1ds7#cD*eA:^AV@F#Vgk*#"kcR;55j.$0\o=$*;%XqeV),PPd3 +9sCG>qC>3NYRFp+$K]M*guJ'UOV7%od`[2[CsiKZA;`'B43;9A"jK!1OpsfqD8i,/ +eR&b;AD\%2lF)t"3\(K=g([L9#FsRbX +.cna_#*<&q;Vn->\*!t)WinOHLk1JRTk\S\;Z@RYZ$A4qcn3?OY5]fChMp3aPHL/)='O-B7WEbd +BqW528h39!6I5j"!3,:O%R1H++nl8`$a$#:Xp64:puHB1.qFH>BYI&9EC+DSC`%^- +'jT:377,3:pJ0cR:>!5#EeI\8+ur_K\d!2e9!dA%B!UF6Gs)m\#)LT]`<*I*X'+%D +o^UEP'u`0c/6(bPRNicdj4JXdbsT=Zh?NPbu]cR1hU5 +)8//%K3BOCBg+QQ'?WPid"]?]_CJ.fcIPpU3o8Rop\L[>72kGr7<*`'=F*N(aoY?S +nJ4pnSc7'-V`.a$N[4sVWJ_VZ%[?+a%<:T%J\"q+YGXaJ`N*+KTnK``1qjDe4L'7Rqb"iq`3p +s1PRm.'Ipf&7jF"H@JVFH';NR%Ck(*N0)'>rPK4lGN!%h\OB?R!Es,TFo8a>1]ZFI +4j7284a!'$bOP]k$h*dA#ML2\?Dtr_2*+*BO)Eo$F:Eh7eb.i4=V*tVNA +!f3r#f&G*VCNb*+0[DS0(g(Wd/D9:,je"1Q2?u5T_oZ0 +1"+#?`ZZu_[/&u/]5Q[OclV*nW&lE`nFhJi!P:5L"`:,CB`u]rB#EXf/6>78+8h5m +<"=^0.uWE!g\UOq5![pCuC>K+,tQ$O"Qbu6sFABR)n5(;:s#_3BUf&aTd8Um4.XCT +UKf(XE#Er7N#3f[qqs^d%:%7T[/[+i$\!pqtgrrLBXDs/4D=.U#M/Z=%$c(P;`^h?+]`;okF)`>pbQ,`8f#Qh=hY8l21D]R_kX +_)nfGaYCsfJj8JJ;W*1GKK&0ik'&'`4dD+dd6.g97'A?BZudNd]>oJ!:-$DSUckhc +4ldY]`<;lLqEh0T\`;t/"Z!?>B= +K_:!DBj>[*(OikXI1(a&?\KI-`qWK`][s1[FCt]pmSE+\PP&pg<>_kQ/_mLAhZ:V" +acm>'N7hgj8K=`q^X%Km;:deeE*ot3+J)=D.?j,iIFsJ)2A6AC_@7n!;sJ(`UO6u/ +,WT@%uIBp]f/Hjf(Bo`i3TYH-+jg1Ll-^j&[j!%i-k4_?B=#@:W!\I'N/1M=;W$MT +;?fDKR?!2UZ%,XLQt_RTZ56eF,i?Sk.Qu;oOU3.GV#St7ZOXd0A^QdM?$l(,6fF'+ +W7WWNp"j$c#>3"o(o?@:TkM[CRVfI^E-b`'aSBeq+nOCV/nS.FQD42+]j1Sj4]#>< +W:BfRg9jLkLR5V:m'sC4)iJA-si=EEmI6/WM7+MOh1rVMX-I!+5$Qr7k:s!%)?lYc +j!MH3eq6-:Qb\q!"k6Hd\jA"(-O]-,9bse$@1gu._`6,d4C-t+A`.^Y=`(Z;h\YDA +1SW^TW/F\NjJgo`AanNcHDGZ1BX.jqYJbXc5ciMWo2eFk-[p%m#=a=b28OK9>)L%hJ0dOh8tZ\F-&5%,h^O*]3*HS5q7`A`l6_ +dd3<.S$WknkN6J4-gJcf&IA25i?Y;*l![7>51sp2NYfP(tI1TQ'=8NYefC%Wp1M&p +m^7`[IB0N=4:7P];Q3(`k:cV[pRlB@_K:+)/^f%1Q3N:HZU"[g?BDW2i=a)FX-$o3 +cc]Xd#Ir85T_[^_nE;#OMm<.e_@4LLF(.9#.AiR9-U%.,.LEU!WIC7Wkm+b)1S]a%;IFIWIO3R8\l"Nk95R9]al^o2C<^ZDi4c +@5L[Y9h9q/j27QJeuk>\hSe7K'mi#BF@;Edcb8D"lmo +cWtgdXWr9E7%;$E*+o;T5N11;sp')5:1DBl=u.g\ckJ)NgVmeW1*7OO9n_lSF,X2! +7mJ*(;rW.#7$du2':RN9SXo`5gO2=*RX\l'7t5EoV?XDbI/2PcNc9-/6TQq@V, +Z7EUf'goDVk)?iUeP\9`Gfj<:--mc-;Vj+4m2qTS%Kp^hZ++Z8BsB_ON9hLaN5IA2 +sda2!=.C*@m@hFgbpOFIL,Q`blBZAn&U[qi>c7qkuo[:X(7Q%2B8t>.oF,u'Tf97b +++&RHFCu!:eEMbggO7eqp5M9D%bBb+KFkg\_Ptdo3",^lUN#ki+7pB*2q$WF7325* +_ZAeo&]EF9nqq)*/ktWPrY1X_?"@=C]b<[NCGo2GP]Yi#VFHIELbr< +.QlN2^\;fM=R62F5QR(S@SdWgq[E3CM\(je]2*!]LO)M!Rfd!AKQnR\ +]NNb#!)!V["#>ipo`NJ%/;u"i#O%;\@,0?BuW\^Y*'PQd"Cm2RA,Oo*4cnGj9bnY% +9)t/n_]2920Wo8Hp57Ce@)oADC>=M0<3O2Y/nYfn"rJCk_lA8ZG0-n:]Gqk\LXSs?)00DHp?T,BZeff19WA]I*.#'6!II64@j>)eK)>O!7UeCnb#:H`S)W%g=FpOQS$3p3+-2 +4g:Kims9.%hdYfGVI1[]`$M]3!r3u=6_j,M?*HSrrBl"A\,+/o#J_Y2k#`%bdSAf! ++_'0:_C624)Nl^N"a#keY1tUfE)3pFS]UKibON+p%At,]J@ZHJ.:lu!:k=RKcKRl/ +*[`9DH[mX`L0h?o-4?!,o[(YkN:rf][p6E*D=<1:UHHRe8@D'`EQo]M +V!!`gJB>>kV.rL5oIf-dXXMLeplVF>$$Kdn$IS]AZFKglH4n\+^fGF%>!YXiKX&la +>c-oL#RUW-`;L>m*K*a_caFT66_)YBlb8lJ3u$NG2dM^h=&q/_:/Aul5Feu;X4ls^ +7*[q6;$uL^e)lB@(Nh]5g=!-p/Y@5NdQ+hU$9-^rrBQdF);)nN!L8]c8Z*JJ[ZjT0 +IR%`:\\JTI4BGanQr#0/RXIh@#%.)1N`b/#QPi!^tchihhmtS@jl_OXkd1j:AW]=: +I^rD`p-*'NFCl1=]gAgg-Hh(XaOCi^e"B7iT7APePj<\c.QR4(gq-YU0Nc86H,3l" +-S#oTc@-.U&5,B4<5>-TNNlFrNn&2/`k$Cf/NaGCk?in,b1BN:^?1DIa#M9rmS)4" +?M7`E8Y3B@a_2&HNL]H`]KJH4C"=_S2i$em[+.?=4gsqOS.Cm.T?IiH-^r#aY_Pfu%E=NAiTiI@V +'\aT)l"YHr4"kZkAL@o1]d++rl*T'^SSanQ[_0N/sGCp)](LboY"c^63mf/2-&:F +Xg^D +5;%%B/h#ml,?;?mO"^g3B/hE^?9YaP9B"c_(u8H\RWKH:b?K6'XENQ7LS)2A1 +0:&q#IT#3pp\'\!nN[l8beXL$i$WIgBi*.6V@"<-1q%`H#9%rr@X\p]_QnG +a%(S_CM`hjW8c\.sSO.kB@t79T1m=3'O'e5!nSa#VQH>B;%B#*AS +k.Opd,%Sq83#lFXZOFhB85i]Bl:>.M;JR^Z+*(DU%*33jDCK0CgmE?3oQ*I/+hl\h +s@,rDhai#^PftdZgWGJE:':bQHNr[m2QPqL-uueJ3&9AX'R+!Hj0$u4Z5MGHlgc`> +<@Z7C2]i_Dg,UL\gDCCTsOYQ\S1;S#*MX5 +R!H2,uei-&j+T?rlTPO2b%ELY)@..W3hlXW=KC%'>^rXKk+)tSQd0dWDV-*?dW(Jn +3gHeZK[r)3\&3Wh;j`(7gl!ghY8_`grp)N/_cCk\jqK44!`LPC0gr2+D&?[GS8d.> +CbJ*OsXb"JK4&S]B(CS!Us-Pq[H]aB_n9[[GriZpJn]-7('S4nC?$S;3hFiXO;$+V +-&sPh>dPIF'c3Q!!QNST_O$:!!MolQTR4cle@D:cV;1'j0lRcgtU#PK[T8ph%P:=/ +BX`%kZ]$.e[ggYr@^s(g-6I"C>hVZ^.>Z\0:Pp0>].\mOJ".Lc2cqWc/8"tqagWDq +^VLWI4dV)$"39,_aPT]<1_QVRrih8KW;>>3YU8:!;rA"emDA-r)!,!)]O_&6KVco` +.$`h_sWF-O-B!Oa32L7BCP4n4lQ45]h;"VpNrBfa +Gn-`c1qToFhbR8h6d+'F5;.=C&fd59m>Rt/+LFpHUKq_bi&u'g6:=.%AK\"%24J$.b, +Z6Ag2a7!OM/tD>1N'?$cgZ.O#ALX;BItUd6fLQ<0O]oLVnV[([dXHP1jnI4NcY"sI +/a1^\qkWo\')fcA6#"\r<0/$9+D&I51BVgr"RP.iBF["+G'H[b@Fac$ofWEcdKKBl +VRJ.Moq6r_58CXV"14jr\udtrrBB!_)tGl7>;jm.]s("1@q-h]c"-mMJlci8@1f+^ +PL5Abdq&IZU'*CjDe,e.d*]EO/?7t5OO.?&n#M'#FAk!.*!m/"9>#h[2./a3G1FqCk+rU9qqr:7ne')`0lZG*I-^s-G*MS^'Qp"4K7E%4ERU[F +J2l"V,m0A!V,(%es3'_gJ8r`RAj@(A0H-uZiL/m#uQ)gg.*4;pAY-Yd_d=Z,)^I4% +->Q>;0cKWEbS*4.;DV@K-=0E6:^6FWRqkh[+h.G40mF@9A,t\]E'0! +deC\Tb9*'nd[_X;@+P[\KOVdne.`^8*)u^ORFHF1Q:8Aic8Bk\Hj"5V`jf!J3>+B6'CF1$+ST20 +h:q/IOlF-@<02@D[kf0Ahem%M`K*#mpEGOn4V*\K($W"YfFXg'&#("]Na?s54;<"X +'B,urm%IJGrXIj"].+N$i&?5j?>3$]`.t`DTea._fmH$AasfY;jEe,+VsY4@bG`!% +"^j;^7NqY8$i2o0e;W\]!&WA`nA5EN.hY\VJ4A"KHZ +dg2I+7.qn\(e(:@d$)]ggK:p3cuHWp:gd(e$N7jnD1L:G8E2FDRgBbgeJc*"-kKZK +Rqm1l!!q]`h3#o4EmT8SgVs(/I.+YCNqH7nO[V2"*VnC-R8a`*.Vh&MW(WiT?Mt6' +:eu`A1N+.!Q?,`>XrUofZ0kkUflQG<3nA2B/n!M_<2o:5edb4_nmq+$JRhR5o5dCA +CDS2;#^M-_i@5lH^aCSogn`@j)'NaV`B]Rk^/2lVqj5;m:c#^@$?u$*o4h3nt6LUP +JCAaQ$R>\2YK(m>m5oW88[D^QI+t%fA1IW^BHm\-oDCjT=#KR6f +JprY^Q*RDJ2l:jLA&((:F1YHM.M/liWln_pGP!>\"e +^1!FaeY6L4BE['nHheEp&9]//MV&ahkVI82G]d)]/rR@M<")u%TcI$9;;3*_pDL2) +N:+q,7r!Eo4Ee;,just)+18q`I +@<)+bq)s9=E'E?fXB1Yl77IlLJ,:L;3+kgPJ_^P"oC72pF=rIa:,pZ0N,[qU^j.7n ++p(C@:YC?W"C984hC,PHJi:jjo-BM$F'&TT0)g3mI^:r,e.m?H=LV>EeEWO@XpR-k +J@helnq;oSE/H0<]JG0O-foek;J[639eD"C>'/snE*hi4E-XuNS^FQjkE3D6>5%qOB=::e*:9?EK$?D9g7`9ZBF=pr +B:n%V9?;UOCS?35&X+k#;9l^@n+/ASM'PJFA&sO2d:Ws"EIlZTES^0+QKUnI&[,G# +6S/MC[_Se7u-`q18!r,L`qT]Q1A`<78^SVh_"oT,`uGNf\Hp\&7.5h)hQ9c=K.]R? +^S#Zj/tZ*=2c9NENZu6KffJ,043.;Jlsqd6K\9t>]3EF6#+h;=au6=3b05jRK38RZ +I@p_0':W$TJ5/'&$j9ZRpIJ!atg3f6R`.aJh,H#*6g^&Hn?V[U%>XYjT'E.P#U%uh +eLSaL?eM6eVhPKlE\T]FQL#FRTGo]4!!lNiJR9^)4OCjYD3?4[e`r1%prK?K>h#a= +#X?OQ&/fSN0O&0Y#bDkVunQB9QODVoSk,Z9'Y&=4,#WH#4UkB![p_I4gTc'Gae0/4pcETOAFFdeArPWfD"ou#%(OXG7='Rk\(8spa +[p#r7RhI/WuQUMo:LV8.B*"d?"qS?Iiju+\kuIYr:mHg]9."(X(/Uk@N^6V'ERbM' +7"S^6\Kp&Uf=X)JWD4M`*i1>lT/Mn`u1c]7oT61"O,i$"jc=4V;Yeh4Yr)Y?.`BKJ'A#F5'?n&m$0a\nE9\UXN\YjPh +BJPHRa6`L@%M@9H-<\H$38IZP\i'oJ&J2J6>hYI.Md3'rjf<7ff3kU,u^_EcL[SIs^epoYf\-d8%WKQHbQ +9G1-ec]0OI@rEJE&aoFC6;%^efRR^#.!(G!&;UnW_7Vh8EJN]lh($S9&;m:Q'G=0I +^M&IV\sop_)]:f!N.7=A(Y:i2&^4;\/@9H?WsEbq6B#fc`KO_X8qkHnt6JE`q`YQS +Hn=QfC++C*^g!Za5rc,[an;$;j&hUrrCWLme+Z)/1-?Jgr#0Na5oQ*^)Hd_Y$$-+] +'p'MCj\$]X]]GZ-AV?;F_q\A-j0nNW(Nm\RMiC#V@3@#$/RW>mJ,r +Uc`Cc`R]WHd#R.p&o[#GF%'oCiq^RFkg]bL:%8C/Xc8+"g-!B%bO>+56g;C>5=N&h +mBkNr%kNK^D&dNTO/!?nNVdk8S]kMl1/*&)/Pr9CXN&CnXDkZZ*V!lFZgh`\+`Eef +(u5nUM]YWd7VR=SH*t9Q07joBbD9C\jjIj0GltD:I4ZS&#aob-<;iQbU4J_"pa@?/ +'"j-2r"+3`!5.EkM`kGVnrA?UmuOfEtI\aIK4KU:UehCY9\,*-,827Yc=T)X60@Jr +X'2*_lH+S[<)2Jr"T=lAYe]'V=Ea-mBtYqY(,CQLNcLK# +DrNXX&-Nom9W6!MgP4p.&T:t)8N1&r'_XbOBePNHPjU'E^HDlN]pnDYE[B2'nc4.M +DS9%hnZs8J-:X2M24BOor)*o$Kq:LfJuZAj0sXg"!qKce5;SQELtgU&#l^Z6U%;F4 +A\=bDK&/U"9!X_Pa\DZV=M\uNp\WRE-=56!kqdd5N&_pZcm(-QfFEcVoT=#]fV"Q) +!gQgFas0<8*oh[!m9C>ZoaL=E/9Z>\GR+m5.eAUY'"HsC$.c->UpZE6[N=QWO//3A +CW@ih%[dlr+d0?oPd=A/Yo# +6B:u6Yf-NIhUTu&d((JDrcn4H/&4kq9TB'he8HOl!F*p(T9l*M4)d\#Nb,^jGps/Q +@&c=uZF^GrFCrrDgCa6i2dr +nSVDe$U8!G^EQ^inLQsngiT?$(8mIR)Dl^)cJ4X`cs<@o=(6_YEPUO"-62<=0BfR: +BtRp!A(fm!:cS@/&_)7[2,ItCn8'uo8kKOhcUNc>=h**K\4:pmbj%JTEt4;psM&5Z +K/31lWgjRge8TR^2c3SiG-BGX[fn%S^+lYE\gfYNT/$7aT->/J2QtgQm._L3rRnqk +uLQQ&V(BHIVbM]j/'@;)fAD2WlIqD0\q0@"07a\)uX@MOi@nh;Je]^ouQ1(*G_$Xk +M/hmT'*dVg5Ca38LO/'%\?rm&6P\9JW;3/2(4_iQt$4'29SR3m!=_"`gXA4\Dr]:* +A"dlDP2_ifu>H[hZu>6pF6!MY1t`6[_P,(H8_%9K +&RN)P"2seNRbP^Y3V%c`^:)?>]?6l_/GBia:M@ +'n[S)n>U?+q6=^NDu%'12$Z"$r5)'.M_^nThEOUruf@#e'k +.'7.`lo-H$-kaB!**E2N:ZnoR5lOF;%$EV:pMp_Oua3%duC`(Nqi@"gc$R1*_Bl4p +?P+lkZ9Un>XXsH3oK$L.Ti2,jVf5tG8^D\$33jJfO]W1&\%pXo]sIeo"<8m2X\25> +]KO;i3^(cim5i:6-*H3+%cNd7cd2dO/4=\pr's6P;b&Ram5F8JP;-B\&KJ#'s!7Sonb`Cie!9]Q9Rba%B2`I\;/#7*nQ?>uko +DS+1X3p]=Q#6(N4YSTU*4"9n=RI,JgmYJOXL@W@>T@VYq6#s,*M`\SF"6n$!(!`H/ +&C9q>F(:Cp'O;(!Q!M]p.COI!4%atmQh(BKj*!=6*+jF>#K*ZQhRrb27cuUM"7m#M +C!,^OH;gZL\\G?cT09$eMKJp>?\&HYsXRH\Z\b)fs#\5aP+(?beN?@+A:u"I-j +CrM5Ej@ALJihu*kM^'mX`qQ]G7i4g/onZ^b^YNShgbYWFakLupVkeTe<;'C?dK%p+5.[l^8fRLn +RpdfQ@j5C4R)Lg9Da4Ael@eBTJcAF_B0']#l(F34rrm:%_p+'[1L@uk^Vi-u9?ot^S-6&g@;MRTL2$Ll?,GM.4.99#>0;U-C>q ++q=e?O+Kn>4:R6__QsVZmjE@:4F+3'r>d:6cJR\A?t]R[iAb#ROp#LDqF*.^TAou& +9qcIRbeq2RS7*)[Yp:J!.<=LnD?kX9tuJUkg_a#'-M]X5Te*SL%#2`r\V'Tn&%=%] +%(5DU[*s3'8A$]>/8S=QTiSuM^oP%2m'l#'HK%?:%\'grK,_r-I3QQ-U\d]2L$ +.n^amM1.3iFe'#<^W%RUkfZApf#hc^4.m`%dJ-FhY]eS +CQ@ipa,q?m/_D\Xg`lSp2'a/"@VGCh-\YZLLma\*N5Gp\Zrc+Ns7NO7ia)?RP>G:7 +DH@ec@*L$&*iT=7jPn+,2Lpo>2=?7]CHOAS\4fNSdLEQHJGVg5:-B4Dj<)6*=k?5 +I6?IMmV:Qf)GDCqbN!OqKA_6V`;E!PRIk%7;PZTp!>BU_4V>%B#jlVIJZS#,_*cXI +gKW#Q?<;pE,0)[rr@WRrm?%P>(7&68$HcjGCDO2^S>'b8AESpb=bQErO"/3@LFLSO +fCR^&)q^s'J\lrJ3ATZ/t[E.fRi']W>q2L*eU9hIl^b/r#*;UDel@kECs2 +'4b%Yooe$l'#BfTDTXXn]lDL]bB>Vg,B +7[NK!W;o^?gqpaa1*rm4?[Q?rC1mj+"gdt!4%bNU^I,%OVOqUTD1U3G\hqlDgIH(:Ui_b;a29-D#9gR! +Ve8*htT+5`VqHq\=:=k3q2jEQEn3:ng3p,/2F-[NJqU1YjSEO9tgQ,K4k+)!*K7$i +A0oi[-T^dT'LF$4YQs;!*]?\K>Q!ig;n-j[^Iu'jq&`8B-WRY#35,sX=k$-;bHQCI +2BfJ]oAnY)AlL4$Q)se_N-s'TH`FI#0Kc_gUE%COdib"nC*HPAtnH[,7!/LRS%/a&tSOV]a\ +abH.imVK9%d0EBHejgOdNHC\MiusX/AN/(r-,`,imn,]kT2oCiEHXbAj)3_9*@R`p +IT'CN,IIn#/^;2BF%:0Cbf3rlir07+Tq8Iu%RHQGqEB'/Q`;Qb,N#* +a5d0gLbb>"7s\#jVBs9WZbfg4*7D1S?i4[#hha6ltc'*^\B'4PH+W_Am=I`(48\h4 +6acaCX%@fV8ep5F@g>RU6ZFm0#QfR\k'^f.P`gC^CgJGi/_4ar!BK3`NEoY$L%!`) +LesiV&F(Ea-jD(i4!Z+UM.dKIETDt8H/[)/FHGqE^tGjG@tJq@[?8VUfr_TH +L-(",Q?%QO),lWJ3DB>(PcCNi!#CP`JJK,P"GBY]Z`t1l!%>7QQ;?_Rlm"qAJ'V"3 +He>.(G-m6oThPC,1RnR35T_C4R +aA'mUropuX?#>=qUDtI&X6dj6oZ'%^\>ueh!11DHUbJQh:(dZ1h8'3j0.K>b:]2&M +"WOu'1r20G\J=2f*]dOkVs7Va>Bi6D5;)p6:t1g7X`QgehkGr9;2gA8=\8@Z!WXM +!,-2&$9TdK$mFLr5[R8!(rC;E[o&Q`)inAh8O;c3D"B.P6?=^PlEa*D,$r +QC2:!;.K6Jur8#WG<:9qG_;n6ignZ:uM2#H,_pB#%Tn0)MAGLmK]+CB8lc4%Q`UFQ +f63^nC]&,$Eq^bNcXt*Q.0JnGDM?]>aQ[kRjB=FcMmm#l!4p9#3HB(Omh'h@%^p,F +90AF?3cA(([YdES1YhnKC=iNYGLIB<;uqe5&ug0R+Hj=EBH'H`r5Jq4F(1K+-=`OM +o3MYMg-94hLIa"Ob[;Z$F^5*MSLZ'n +cgUV%2iDYjo'J*&8;I5!??,<4\$1dm0cHd@&#a\9mY.'RnITR(n01,qHM10_b(M$Ng89rl0MD +/:hHVikCDnBHd_J2nU>T"V')CJ2+&>1?G3bsp[Rg[ci;?if(ZF,neu*C>5cfUoB"b +M5/G[pLhWn_!:Xn`i*;/cO81]P+(Jar'`Y7".E$!-m)mHG%t.X:)&nZ8@\_5QD?Oh +"RHPFnfhNCA_?3>8l5j93TpnMug69;g#[[;=D0(./!dFd(^(*i3/T_\O?5AiHks>N +E%%c8%9,=I=/#C;LO10^)\-BVOnKXmZr,;jU?#b&ag?UqG]B0.Q>bVKU19#;E3@aE +QI0t!<$I'GQ.XH#P`>O_C-:Ds'O=1J#Ui\(r.=(%=bD +/V-:%$%U&B[>\F!W.@dF*htN!dSe._7,^j5`.PH7oPV4cEt6m84etASG]($2LkD#o +'bNZr"]t*GDBX^5E$LMM;gKo@AOQ.f/j +V4>0k\@Jgpp\)EZed"CLnIMK7(uq$qK+'r"hSD:0.JS;5r>hi^1Ia6m`4gK"TWUM+ +8E%;lShHGbk#PX3T_9VfYd=H?%oeWiHN6iAN]#SK3;B=JF']=9'V7MEi[$"?^ZBc> +),]EAi,+;7+EnuM2i0O:GP/-#(STLA1Ypq'A&B#UNC*-Q-/-cV-a^=6+Ec;Rd,?0U +E',OcCW]/C-i\8a7>t$6'%VbHHB6hEa^[7rkWEVrX. +HRO*3iVT3-itoG8CdH1FZ/eE=#^ +K-0L1G2FGK@f^f%/84ZRXa4'\\J@J!'6#'6aql+NDS[4V`=P(ZKUR$/9p4;3>AZo_ +&?lrfM;a4ZiSA,VOq=k[5Q0o$b'h%c_`ppXFH(5/auQQmfqQ^Ii!6E,>-<.,2-`g+ +q:mSLM03!,N^@l4EK)c/%lKg'7!:`;L'F+8GZ=.(47a]]PZWLFMAc/[Ml$6E]20ZE +tFKP8#%Nu4fAJSrrD*2LAhJEIQ)[B_YSJpmfm+N#U>(@'l;p:-K6fq&j[5Dnpt<'" +5nSUC@U\=\O9Nihd!O_91ce)o-%"f*s_n,8ASjpp +>cLR3.S!NMo-&it]<&*X_\YUZjuPi +ioi[YE(5GK>Ua$5DX5U9<49XU__N/0h!'q^"Y*UP&`jiO,=ag%mDseqE'Vm(EXLZ( +\2jC3n:l;F^o3**P3gImi@od`f_g%)[`9DP"nbgr(QVX+13JQr&K%4iCLUK"fkr(F +<,F#3fE:Mg2;`%Ub[M^nm(?DpC-(g:1n1%%/N(4'` +NmcK[+=Yf4W`b2g>XAB4 +5Quk2^u.^UDRgX9Kks(B?$RKG*/j'5e6ZJnCth-GXG6VFN&Uk[''q\jM5.8Rs"_TQ +/5/I[Xkk3(?G^XB/BVg!"&YG_tJWMf"4/#Hq!%u%de7$l"1pPYBRmtl/>1Ih%g +USg%MK#[#Lm!PKh_7-QN;hBM#Trb-pj;#&1W6aE&3_ap0fSfcVtfGnf)cn.5%d9Aa +bD+[:!^nD0ECOXO@=Mg_XEQ#$bdZcbMtgIT+a=_i\(Ad>>&\-hY;"^;5HQ5rS(N#^ +h1)Z1'bs3?8l@2Y7LDprr<3(eLu'G;=KA!ItB8$*dGFq\(#dcUNiBM%h\+k.\7N?K +ZYmM">RkE?qgHId@]T0WClM_[MHnB@$CH`a-D"dl/fTre-= +^bG:YF0FZ7C>D5l6K]TLfNcR*W.UM$JjZ,.\gX +Su/2m`_ABT?Q$-!5>*J-gNr"eNO4_L@%"e2:KYUm__-4bE#=t^[4&@)dR[JDi!h/.FYGoi1C_a(:#h0U^;@*,1WqFr(F/%r#Z0PKFI>uGn4%U)MR)GTZ)9[-%3 +jca5DJAbUBrULsOL1qRk9D6mH1dg:oUG=9Rj=?=MeMD2AK8D1?C4jbJ>8'dEQFm;` +7e7qP(W,-g^ULpUtC\t9G*?sY%m(,R3'%k4l,eUWng@+>!F]3Z*">S%QRi[Mk&t<6 +/l5^6"`3hK?o9n`He%EVERthi +P(fTX..:%RE.`9Zt-B^ME*&UVt$Dg9h/#\[>ntQHuNS=^c)kA3+KsW]MpiARW4&,S +FSa65spo9)Ni1`UO[F@;T4,DWc!t7QT$CnYX2^Y"J3N_Y%q).8]ics7Qt$TrU4"aj*sc;8:Ye_0_j/)n*Ig-;i3dW:G%\!IU!g8)qsjr$jSIi>MgHn.iq9LjH.gb*Z47G:u9*E[Jg0fd]R%uk:` +cGDcKK_=aES$(aaWnf+fc-dnCsW@kp2/lLVUd#R4e,Nno\52^#40>a_8B`hL5p/H+ +)*>EG2,>)PtqmJ'QL.Y/+_QZT;eIlf[1s+@lq,h&itJa349',Y]Gqu"_p>sb6JW8] +X-7B82YQB,A&_KAcn7_5T+a6G$F]K-3nP:k>N^qo6g#=4Q<91fYC)M9PP(\%+Id8( +JG\o#^YS$8GZ-cO]iS&BjF_/9TEl\PR-e6NIemk#Er/O7a;B48rm%PoqJ("E+l*D_MKAg!YB +N]VLL6VjGY8mBHe+6H:@5%po)0CI/IKa'-2ZT +pjn0);(Nhb@'M'N]s>O%ifA.F'HI,St+B8F`=Pq.?*K7J)(r-J^j3c]^W/R[.d+eJ +R,(sfa(KPLBE-LNnMAOEgi>KTorn#V;iaeSV3WMl(:RsPG1i6>XbVsgH#m3!sGgBj +]t2dH7/ET_l?:VEH(1E`sSV-[piIi/)Q,KXXKB.Jg_k#b8.^VB`gSA-ibt!BEJW6d +VSQ#jL2V3;aoS^)gn._=WM5\?X>Dile[W$Xd68oFWHN*u_htSYh`P2HB[?jn&nU77B)]G9I] +SaDm12UrI6*D*3nR\4F+rqcI*/8PtaEnCX%sjut[*`Y:q_q06_0:^e.?QiBjIShS" +8"h9kPQ(P_`fbFi:rl%I#--9FHHbQ1LgFGG69(N>0DM0nM[=P;#4.k$ +]co1?&dJ]!Z=eKC&n4_O&;!4iaPC8(C[eq:at!tb6kMh@Bm)&rZArL-gP-"^C5U/h +i+00/hQI<$0#63=4>Y)Kq>1lC/?Y2;Iht#n])/tqD7*Vr"`%SJ)OTCA7RgUMa=8L+Q0')qqc5(Ihuoq)#39&JjY]:M?g-EZ"e`Lgt.bepC%$ +r@$Y4A]oOqhp-j3)e/`8I(+*aGpQ"\33K&a4+&UUKa^#(cE4DlWNe'FeY,DDYnG/F +]ndu?Pgm%qUj>bYn\L.ar)r]%(f7ok-3d#OCEFkpi7k&E$7aC[`U>Mdt/tLgN^'nG +nC_9F4]u]-GIT6[p?V$-ZL6)6YUIW.[$\:%k)H8I;6fiOgstK+a?+]J1Op\I(SJJ) +94*bc$\@E;u"DlJ&V)i\a[V:nDhLE4SX?flT/9pHAXl1JIrJ=>H'\&64VE\J2_OV7 +R9#FA%0UtSl@Bhf+mftp.G*cnY:K('mp8FSSDlDk;CeQQBrV^XuCed!V9+):BPk-i +n))K*u"Q-JklC3(RL_;La:GL03cBgC]MG2AeEe&;hA.m0L-)`Y%u"+ZCd3U-h5d-n +)@*=i6X:N[X +;a65\TUr+'GA5-AR_Rgt9[i55\]j[*U#e23sk[j0+5Rj'/Qp]$th?'A^cOX%J2;9 +XC-%Vb\UUSdhG#[6(j-XG51N?,p:q.A@'( +K#,53k:Z5mAu#O#9J`l+8uT\n:/J^+n0^R'KXOc8mNWC2-h3@'ZSkti=NO2A*"G%dI%,l( +pB\u(&n9M7(s@Nrr4X6_'`\Bi)O;3X@ +Oj,*WUR=Ym;i%fMgbg(+6"r7FK7;3grM)6ZtVg/<&2R.4L#P-TkS_NS\]d@%\OA__ +a`k\rl:TDe,3qhDa#_qVVSqOQZmB-fl&"D!PEto+[@QBT,3R.Wum2+c:X +l/XLC)S/(H/LpS/T0hm"k0V+jP:f]8K]oM(Y8/*RMd=WN#CYdCg]eS/"$+.nEpg>^ +'`;15MFT+^(5Qr:`VVhYg[u&$HI04:!'nu.Z.N!p+\d%97/&!#3VqA8N"i^g^-n +Ooe6:D@uu(&W9T,[r%[:DkY?SFl'mngfjO,b+[#m,![-jhiQi?FVfmiVH&u[9Z8i6 +APG%1<#uVl4YGGT`*[/rrB1c>$`c-ib^%!4\Jfl?>%R'b0)(k`Z'q%L:q6s+uiqaE +XtE28qLn0-sn3535ueF+'J[9hZW^Nc(`/1[>G6b@b/fcm?E\#599\QVN3uf<#8[L' +PE[Kp8r$[(]`6H2$Y@=?d.%l<`r(@;b8-"fFa1iJ2-J6L7H4.aO+6]Smu/!rr@TNg +g[V_#\UVi@'+Mb#)YF.J/B?(^\ZL-Z_+Ri\p%6TkSUD32$mo.g_e#%#=<)*4+0`[i +EmoKP#('Ff_=O05,E79C]qU" +^oB0&V4,sFOtT=h&;j>kA]FJN+@@CN^k5ZiiENdLG$_P3t-uHY^ZQkJA!]C8s,N#& +:p4?7g.@E*4iIHo4O^@WV37.PH9F2Ka7@q:^"B_#RbPfbAp2?oYjdu_6gmZ3A2X.) +&N`'bZO&%*NF7sFkj2V84OQ[X6@-nd\WO078V.n8eTfnG5>#>VtPiII$9TDfM4VqD +Vn?J`!!0o5>ltLacFD]-d9ELSj30QP5(U0+1mIEGTF%S)_61Bi8EF%qBl?@C#ZH"X +tg6UlWi.gL@):/WiD)i?;3+YaXj(K/.U]l:H0$hgtQ)8n=d5G:VK7Y=[(.Co9N^4\ +e"J8*?HUQfPN!SFl!!H79sdr%j[tcr7Gn=J0^Ic8:T,Y_f4Zlp8[\.Jf+hsji9@7' +\3(f%7dI60s6(I'^Fo%7%RtHObPOi5C5N`%r/coL%L:6&bq)bb:B67:sk"aI>n5([ +2OCC.?\:[^NXB7rYV\OYJQ)!U2=u#0iM:H[^(S!nm4l!JuD,`H1n:5T\@YuoSI*M% +on`X#OrK/CI^:)FJ/ao$3V>kk&]id^a'0!;>q#0nge9!]W5R,Bp$j]rQB! +:I57OSE0]NEo2&8fUH_fG6]u?8RR=]=O*'Bl%[mUE)6AmHoc2jL"peM +K\iIO_qJM7NX(q'&5D%SM?^j[<9)0mi]'#C5qC^\!U%Rgd:Q%"jSlO8#:B4082M!W +j.lH3MO'HnG`K(Ok)jG@m#3GCT#R/%JYD9`>$("N.OemJR*?P&o^XS!-t+6"O^kAh +sHcY_)XU1"MZ&][P?$=CY..blQ]!L,+a.Nb;lK/\WYXD[^UA40e!q>r8<5R('*BgY +A)NN%qn!Mj50#I)lIAt2Rg5YCi-`YQNr+`cf%UFn,+P@-a_EGGI-(K(3r9J*-O?f- +j.OI>KsB;p+S8WCrD;E#nrh;No"e4R`FrBL9.d5QFtdbXmSgJ8rLgX*YYHmS=K6n^.ZFRhF&EG-OJluKd'U4>@,4 +6UOP*ni-/E&^g&i,df,WHc&7d*oAPMWu3cnl,`;:td];lq2p+=4'(\KmjhBl0YJ7S +h8E58Kf%9HY3M&3$0a[T"^KQQQNVYX74!s8F6"f%J]A1Z6FJ?bVLC.W+^CEFRmBjI08%g0nD%37/17n8\Jj1.Rq +:f+Eo[=M#h"l_qb)rn`1@O]05\*o$bc`R\SJP*4Ko6$p0dG9boJWQ)fef0c++psq@ +p-6KJYqb%5MI@X/>M>L>h:LcO+k/&`gJ.AN'%p90+?Z+$Q4&AoBg,h!,K_nj68fN2 +Z,hG\r6M._c4/Ei:A5bYi0PBaibS%S&^Jam6YA]("`)G_8Mrd3L+@E +j$0T1$ooON1XhbqOc_*r"m]==+m.^r]'Zt7I`O/;BG!sOP&D'gZ@N-*9V:EWkJ^f_ +/R*lr):7ca2E;,Z/Anf^s%,lPGPd-mYd>74D3P/q)SD*,#,*bk@)/Lh1Jk^SfDHW- +BMJ!II7m@Ec^A]-_(L'8+q^Hc)Z"sA2uFE2j,\a"0_gu6[IFuh* +PZ4;X\r:m*g=N0&&h6CI`99@OV/YE*I;30Jf%?QM^1#3i.?5_?OD#crX6X&eRXL+4*N^n:Rj(a'@;!KrCoCb2I@Vg+?`^O0nBV:$lM^-*p(bfOtJgjbtN`H4#U +gop@HVakt'$VS^UQSaf[m)Zrc1m1I>qo/gc''O%eT2uWE53S)2G!!pP\T>D;b=O,N +p>oOXs/,Ak1-ob!@.'Q`"3c."G=e[5Sea2$Y(j&oE8YgNHd\TX8=FB\)XWZ"MY;V> +HMSMW^@ndcJ&0^E8H[3"LG$ZW"(isK@'8rds_Q"1EQjL%%8+0K>`3eD`UOZ2*GtjQ +M0FrZGoC'<@9tfTF:f#XA9LYbFTC!Iq[(KijH[KRNED\QChT:Xh7/LDl:693$MQAO +B]kI,BCkHKfr:(!;smc1eW>O[eIgK(&3ulGkqr-R_GY'QoHr*9N+FI%,JplECubn#K%Jo^YP7.B&ciU;N8"LZk@nC?XNm(2>_W'P3AH#Y8Zm\%(H)K#SkO6%`+3!48APrWW3NdsMP`^D?UB=c^H6`MQhplP_+>W9W)@.G5Snnc`-u"D`a)ET\_q[ +X-FA^[3]6^D:QCpYW>BO/DDiSRnhT>M3aT("2KQ2/PZj\7cF\)19@VZt1)UC5f)rm +JpdBW;'+D[&B"JZ7FUWZ7WXOZ&^oiU2* +ro)g49[[%>K>S&pn?_ke7'!E=m>Ys)K\h]+@_.Qnk&`3:^ujIUEc<$+FmjEO&FF*( +OTN'nMcFZ4;m[]iQf$Dk"Fd6TCeAVXkXgdAU[c9]5`q>UHSDu:98i5^n+> +g;6*pn-It(ANM[qaI'2MIt=T1i$ks-.4dp/55OMP7^:UXG%BYH8F-nnP=i&J3bXOKe=7&p_JY<*I#D"PV.pHYT6+- +b5C2p&I''EVF\qcYbc'MJ%_4"iZM)OYB/5AJsn$5T9Y&]934I(MM+pSYr'eSKfMLi +FA-Er\m_FiE\kJ=jsMkY9UMSH/+)6rrBaba+dpV%hqSE?%Z/N\]ZJBpWfmgG*ro3UK'LnElCAkd:5#@ +X/uk!"Ka5PO2ONB\mm5Dgrti:Ao_5oOCe8**2pC[]Kq\4AgBuLh(;TjI@ +u`M+.qE[G*7Ui-0F!P%P]-g-id`%`EjmHrD^9d9%.?D>lW_qDA_s7l)BD@A&GrKoE +2W6-4*rV10VT,k*+3rhm++UJBS)5ASdEa%5TL<2QZ6[Gf\Q"+ePP=Reu"G#8M#M]Y +;Buh9SbGg)SihqP[O=!(itC/#I)HhBtD:MHU:D8kX"O'!:@-f20@KH0O1^D0`YZ\U +n:=^AE`8h__beo=\:oj:7h$j1I1Hg0@m9eDZ\U@PKEA!f,9WE,3pM3Mr_-L +c;W_[$!UX5AlD9J2DBF6s0l\k4[dK!+@Ys*ouKIJ"8?5%9_NBL9qcdbaaLN\Cs53o +:!:cl?5TlRjs/KR)j.a4\C5f5<@\8FG>Fm]X)sPfi3CD[!r"OJ0FF>Ke5L0a'H(&" +%Gp4\"#Ku39./_hR'FL&f7oZY7'/^-R"@QTHT%Fh*1)K#O>PW(0-u(\!On>B%n<M;B)#JC+X=p<6&oh1,-]LCeM)c"n=#Kj]3bA?h0Ns<0G^O^h>nScNpV +!7T5:WhU3"TJJ.+KhkCL\_dkAG8#Ag.%tKOmct[fdj$b5[hdlC#`p_mTgGD"_G6tA="!\>$h]UI1&ptu"Dlt;1DgSBb>q2#C= +PPHGp"U'B6X3%UL;36Kk"32nj%V%)[>\u"2PW=7_+4!L*+j^^h%ieBT+):T:JS:eI +[Zr-p?D9dKjU`I5/O]YIqcY,2SWh"pl`NodB@H^0&*Er8E1h7Bh6r6gHB>1nAjqBB +;XO^ViU6,ZR>2UD`0E:npU%igMrh?+.2j)NR@leeJ"F>d/W +d6!sDBDa#@V]rX+%:*4iMVJhmgI:6[bF^.gH#96Y&4NcYc_SFgNMnug46X%$L*!h[ +71-j#&U9X1R:KI-Q\KQO7@SUcDRjQaSu5Vr!Rp_'$/P1UZ'cq+P]EoGoK$OY8lQ7_ +WUW;*[kqSi>7@CX^091(@i1r +rG4sob._[d^MHA.#frr=VsN0rAT3 +6L:OY's$p%Sa85gOkRmo<5@dIN<[R7:q%"qR-;$Phe1P8l`E_+5HulT>NPK?P9-#; +RnO[9))C,Y,<2/f32]<$"MFD>ce!N9XcZ;D'dDh&9F*aO2P'OYG0_8/,SPX[X_10m +NM2KH@"_cbO5qChPP-HpnkB_O3!Z\7,L\.At-"%&Fk4#Vjjae!"WD^AA^WFKga=Nl +]`[A"`K.1[1C6KJT=/-%s\*S`>0$%hsp"'S""RBkr.H)ZB8Kfr$;:BK(Ah7n5@.7a +$0jn*\XrhLUj^6Ye"9Bl.gsj8?\'^6Bd[7RO:ISS(M6M!c&Uk4rMl=2/?EU#?jc&+ +C**'nG0e;n+1[#e+0.BfM@-Ln6;N9h\+q&Ht.B>-QN#[l4m;%f)McU)+d-QR!fT +*5'cnDD0R#k#DKCKbV^BdO2/AT4t)*kW.nc/,@n?X-^Z(83i,:ej!->Ac1N':sKiC +4j;_YJ_N;)QMYA4277VOU,Nf9@TfBIGUf!.c3]"J3Tp!-UgoLBu`1\V*k3Y_Hhg=r +r>:)fAJdk!:Wi-g-;S.ighI@t?Q8s=_rLYF;X"[Pnahj.c+!9e[1kUa\).3LB. +BR?EUZiRROMc9cp`HsIJ2>MVVDi[>d%lu;9]j58FfY+KKB+Vq6&' +$#]_'IZXs_"8\4!V9BR5@F6U^!5nbCO5BVO/]+E*tR,-'3Js)PF6!:=$nIZ.,a0ln +@/JZ[tFU-rL`aiM8'BT:BgYZplB-7U1q+(/_>c#bq3aS3uKVo8Co66O)&hbcG3I&E +.cDaKL0Q(;'ttg\bT6E?Q\I-;V!rBU!%5PC0-imO4lH!(QS?+?rJAq6!:k2)n6bJF +R)16c&K0*"n./J%>9hu67;eO[("8rm7;,:>:\?Y +4Z^ef/B?Ybi6U"@99Z:^Pf;'I"C:L"2BVpjg*IcCMTjY$uuB2r\aRSIpo3hRtZog4 +!#8_F89:X5PC-9Q?44)p5lcXGGneri5nP;T"-O-J5l==V0\XVN.bmfJ- +_@_`&I$D+]\l?M+-E,bb'f'(>5oBrR^[l(#9>0kJ?o0JVd@V.T#!m +^ZGmLe*[!?Z%S`)!%g9*,eT$O#U/s@iD`^rc(E\lR6l2L`rN4%3SEJ'1"P'_lZ6Sl%;2 +rbXK[\tNCGbHkrqrlh!oH2A/2KT73cKup81mNebd[3u%P?kVJW*W_$ZRccucm%`;W^!0*6QWI,)rJN#$P6$i-GYnq]3*r!Kf0?-gVc8c'@Gi+UniQ"LYG5=F4GE/UA +.ghKjH*1%`b5IR5MF\TEAb_bYQ[ao1oKKrT&6Ylp(htoV/4ItWm168TJER)!fVVP\ +@D0XMi3j62,La(2kRIk#oN-u;uZi9>NgtVLK(d8iu$Sl4-6&i4+1cE\+&7**#G\uX +8PY+LL(+'(jY`_`XQg#-cNYEcY4AfeXV;2L0#rN!Rr+ZRcO)_N-_=hPHEPslZH#5` +'agMYT<].\+&"01`qPMFk)3%_p<7H)2:[mEtj9IA17Wnp$8%Hh!iXGFF@W`edY72l +V*I8rM=.o`:0:-Cr[#A`]B-fe*=[Kr&j9[@,UmL\^=a`m':CuPG8uPMHY/r"rZ#^&%rjhO%;itb:Y>*]RhsIVW;L"`_a9W@kX4E4o45fCWUBV"5[0f>[72,nF!-UBlT*LG@NIa;PSif4 ++_d9oj8O7d%2cWZr#NPX2C%P_ma1N$6A/gkP.U4ofl'sdXE]kLW=]Q*Xf<`]7L)V> +?fr0E_LJ6QtMQ="HJ]I_0e?60>YD\?7%^?LZH(ReF\9n27n."V^r@%!)&>nJoH%fW +*b"r*WhcE'5?`CgVg,YZ5u&ee`EAHn=I>Qrr^>Pha:iT5;R",E_cQ8`>0Q_(:+hiqA]tL +@9p*?1$?MD;"6e($N5AN3lq5Bd-b=[FCpjOKbsO?\@#'-f#bQk`P'gl7)OSg,J7E1/8)K!?SA"(P])b9;"orR$^r#h3Ckp>eP]F1q<9 +3#(lj>5$h,dS/O_1kE[A\]R5_&+N04ZhZd`#j^ML>0\Y4iXB$&-0=p&qCMjoNo1,# +?(kZr+5Bskf9C=@H/:45V3/hISAZ>n/J&`F;;3WHtr/WCU2[l@IX5eLMl=,,/)G4Z +n`,nkOPdRnA[QPXEZi#Sa`M]4A4[,>L*gbQ5MUg7!\e4H_IU[>$DLQ=>N5`O,10r7 +LWuTYu#b.%tAJ]!MO)oqr+0-ll5:07Z431j5lF5JGs#^F[+NR_`)5q*tBrH*tI0=R +1+-)9`(T(7<1W^c^kre]97XE?Y[:feHsM5fjiA*SI#'ih=ucb\&"kS7/ChZXCCoPIFBA)g\PdI,3VbCEN8YWWrV\%G`$?\a+C/MZ6X]c-*,0 +M=s7+,p8'f=V^Sc\_KPC\qBf<3hU)4J\+RJ]E)pDLZ3q5=/k"n;G7(mt>:;o#98-B +]lN,D3+oHrrBCWLL\<\_9X,riMf1_fbMSk"p;0_ +84E20=a'Z-5Nr0[qbdpJorL/m5Q7,Og$Dhc +%nh.6%aD1=68NTn4lLlaf"/P*p_Fe.:r#[_Kp^M)ZlfmrM?`QB^q%,SF-f,a7Q#8R +NSiDNablAfn[dqSt=rG]RSl7YI%Hpen*=USSo]WH$:$1DjD+#$abX6O>)!5?G5Cf# +^eQ#*05%!prgL"KO`:>blib94FgI+@.W,#l!?C0+5,OH]@81@T>Xq,U*O^C:#(Q'q +#O7,o(ic)#O=VeBqnAl>VCHndnu,UfJ&/)Cri +Lc#l-^AdhQCc[Z;KTRXS2+TtQ96\>)#icIJhrkTr&s!h5DQ\^A(%-<1j:^bO<)X0P +1`$s[:lj=0ImCN%n@un:XXbWh=rl-!!VoDoQOtuBWhQ\W'p%R][::&RrNra0t@IB5 +s7g&(%kA=htS],_!d4@ECFO#.!/,(E2(NV7^S6jlaQq?mL=V,h!%:M`QJGpJUg3]2 +3Fn`AdadLZsf3m,S<9`d;OcP8Yu3:_E4q0hH8Z#i&]$ab9GurD)E]!Di*t4XJPj2p +,U2o>T`WU`bYD.pil6=a'T&=`;]fB]N).[H'%3#[G(tJrNg=YB0ZF,#u]Ob`o-k.6$OaE7=DTXmC@! +J)7.A$#`\6/%'W(7sMa'O.iL0ZYPi$Kle^VB6OTZocB'EK1%Zf!"D.V;uCUX!riEN +2[eDB!>pU+(s=C`a2$)osl4Bj.ua$?D6kc%8,n[5K4:&E1VnWuE2;h9a)b@ZNgLG@_1-?(0:9Ge/% +bHZ%d?O,j@p][mC&OHBItYDHe*->JH)J:9=\1eZoH'4tjmd#bDf<5RCm%Ope:&-1l +UCE8Ru(!B:LVh^+cl#;j-S"n7q0"nrG#3*ar,kp41OU:6B?Tf!Kh6XkWHd16DGF?: +'n(TeV(G:B]X@AQ7Io_K$-lWdbm[D2p?R]aS\+,fsWZ]UrZ5Wp0%I6LJ*BrNV"5UCeH.2SP+7/.3c_@:V*2";"T@KB547iXIoB(k>%C+T6 +8!8gH2Qk.#>ho#AcDa$\Ap_iEE$S$9.j_;Bk/<-@r==!XdaQ9qHr)(P(VnZ5T0:th'Cj5)W:nVTStP5[5"+>@ +.pkF8F.9!IHoCYV&NRf@jm:*K$QCI^0n"+"9KlmKKg+#^,?a1-ccW6>SkV3/cq,p#5\pG@DFh_H2LB3>!)'AZ" +0k+@5>$6+!5L**RD:2RiTj;tU;Jd@D=1.TO1[[qQH.3`Uu)ibLF#4]L'R6F"hSHE7 +O=g1*E\NRVgp#54J[DDA)n`.B9s,AaEH`/T']"Bjm"aD_&(guNS-tH)\aY>i%R/2o +q2f'a$YjG@C8$%0u>R:q%l3iiji$&,\XXO':3#.@.5u;E +QrV%Fd;Be0)()sW5!V_QRBOO!8fh9Bt(@\lbm:mG8::)6-t2%>HkVN/Y;58Lor*NR +%[g,g.C>mj6mN?;pT"l^(Cb-T.g790p[YfkQtQiAA5B_,`a:OD +A*johC-\+`I0cWC=\fQ[]oc3nP'sT,Li2jrrBoZ,>">6k!^l7hHAQY&dMV!FJ"CSn;?,)g.gr-m`I=*C`4?Vqe!9Dp +;+5eofFQaDe4!<#,n41K94&igXB- +QNS@eP?^)f3U"F@J%k^kr(S4Y0drm%C'JR3QIfufBZ=Z/)s?q[5gDeeYbf'h=c3!: +L8=I^+Sp[NT9I3cZ8k-*[A0tKK`DKb(YXj,RYt"3j.HC`^n*=BEP;errC&&.(=#B@ +GY-^1$+Z6-9ei`7Jf:D[bG!_?\,A]ZoaRj`GFUG;E`X.B1r+d>Bk/SkP.F)41uhBS +@u&#pDcc3A:UK6Ol!M3^)2XirPGD*-[;URkSXkX$m,)iBj\8DM +*(q]Xmqaqctg);i5Ku<5%SEQ0Nf=sG?j0c!9Upun:0GYL#nHG;7b?Gj$,8MHoN1_f +/7'u4!hJ$a2aX8M6,i:[A0#@2,in6&)gkaGYe%1pikc+(A=3W=P^:l>M_#s,5U=_I +E8I>Gh"e@ +?(D1nsnai@\b*QYDU%-"G=bg>$m)mi&7(*#m"WZV%!EMqgQ`Bf>Ds[o@cEb/-d^X- +Y/?hi&Sblpj5j,1cgfShs'N>F9p\!68?e@lb?Pb:+^)p\HrYj:.q8:/uSU2V:M&-:GWi,#bi +umMBjZ<$_)=W;8l]OTmU1ZHsb!/NaQVg+iL]"RI,DJ_%h%@i,A^e:=^P_$=GHh5=Z&H;aH74dmZ6 +[bEgc9^#A#FMReMP7"uh>.YkeQ_D[>QN>5c[r^)i$`&j=)B/JfdnUMrdM?t6>ia +1Oe0GJQc@hg@SpebhLW^OMY[+cUQqQ0;qn:[PLJm0<8t4@(QkM0-el,8V-mB2RQ33 +EG=W"TV["c1*"0p3sHu;rYa0):kmsa[A%d4?cKoj`_0O+"06"-Q-A0W>3YPQf5-cN +D%5tCY#m(')2]/\cGj_mC1_=f\dr4"4uWl^Z,jY_nr#[FaXd"nV;`K0=;VJnmc:KVcL7XKs,Rjff\T(j3prAN[ +IV?Ec>h?grrDB8L_44+L/Pu_7a(f!:IA=b1%K,]('KVeBSc$urN5]hN)(?aLT,YA+\&M5oduE&L)uDo]J&o +rlX+N@GkXQW_fcSo!S'OR`-G1Yu;;W@rBVAH)W:\LmUJ5Tb5qX5f_9>*GFm;B)Z>N +WLcI`u#lJPC;uD$b1S]eSUTm];/jfgj9D'=R2d)njRUFD>sT!,p],PX7l;>[s"6X@ +.KD<&"A^Vcj/9n%u>TdWh6WqUpa]Foo +_[&C>VI:mYBp#J`BF:O]E>4A2cNEBY(XKX/%d'Z>>UUbQt_(*XsW?G/d5a`*tc12ohK5kW,%d +kp;7%;aDG/8/8%3hN6NIg]$eKF_j;o3C#Y$]2q*Ze%C/`FVcF5gbu.TqqmH)f`+Zc +if>TCMeA5olc>)"(rn-bo5H]:72Z,JB%:)2n'No'4'n0.^UgP&!_>!T2Y)>lV\f7g +`3Q/4[*6jNP<2)#%risFIs(K'jO@%>6m(6Q*-oW!;Z[*<-"B9A*^4b +Z:Yf0Ut^qiB;lsZ^L:E-V7u0oEpcL,O0"_X'l!MeOh9WQL_gQO/^0'!2f,241+O0; +]tHF5OOZdeXJ]ZVhJ]gArCU1/9//NNmugS8_"1&`#X$jV[BWq9hhNA?-(lTQH%G;Ro +VU@?c'^pG7mWcsrr>Xkf@%CV"k$%\"Iop]7(@5PIC +h7B_bO0p"+:LkgN9;Rj!&E\"380dCBUN!J0WQX:36l^1gjr``L#S#;N@G5dA<,G6! +[lZ4i5XG3T-Kt'He(;#08/RE=l%_7bpBo.ThYl&IdnYb,MpOZ),&J81rF320pVI*$ +e+mZ9g6haNqb4uhP^qH)<6f>p#_r/h1iBLg99$QQ8[M_Fb?2o41^X@CCmjMhT5D.6 +#j+X@tr$OV9R+A5 +T9_C\]<`1VpuFV(h8CnRb334#L:66+%cN(]LJJ77QPT^E@e8qd`hRg`reMjeG*h>O +,Ghh4udWtVqHij^NUn,/DWl"N1=tHMT##@Z_HcoZJ'%*(ah%`NWe:knAZf=Eac.#H4`bdNF^i8T`W4[Z]<-d-u<)4K0^%*D%CGX +F4bfYD;9^*Kf_H8X""udl?>H3!T.DdC$*] +Km8+pNhmcVjt3j@k4L^!/AT7PR^11Nd7Y9Iu%P'hNdfJ1?VfG(Qf$^",#+9. +Acea7F:\a'_nDJF]d>!i4c^_H-e&_10EV94&[LPr40r3[<2uhGa$$kD9^>.Z$gtKWC=LK<`-4%]?E?B.#_8 +8cgGc6M%<$NC+6mnKB9-8lXc#NYk`!Eg<[Lc6l"^!@QCWsBoim\;A(O;)1Pf+hi\Q +OWrp*iUM,S.+fjetHdd/6;0S??)QhlTc1:1hN3Hk7S'\.Q.FTjn6r9O_IZTY9DU3#IbtM_R'ik0+fP[Dl$]"k9Pa.J3!BEgmi4K[/@_2T +!Y-RQSM7CE^\4]m?f%"ULQ8IL::Rc5N4GnbgWJ6rrAXL]1[Jh^i+gAiEm:*lLX66p +6XKjU>3mM#bPeG,tAinI_6!fHnn%rOWleKcUrrUQA7B`5m*)G!1mu'nB\t.]OIo;( +$27jB1;DJRck^a>k)$`h%F`l:ZB^.!-q;qQ$%D2k.Eb\qS;0jFnAp\3QGa +Z@(4Obk8i18Gt]EVS._2seB?Qt$T2*R4L7EEpMgn@M]I2/2G895jI'A6Gd#Nq\Dh, +V,*!Kf`B=dt9n*XnK0r*GXHb9.ATCkt1bcAMHO0J.[>mb@KO^N]r^[`,EO%IBW'W;jr`M?bD+ +CfuB:U.+0Ht30V"S_F5Z#so^=C']VGA>4H`G]qHDBZN!1',235,0?kidNtkEZ5^EbUm6+fsj\G +;#DEOk;Up!-bTN`;uFO^E82!5ffO2G9l\m7\"b%&,J^6@ZkPC>Z>ZM4qlZ>&!K>[!WKf5Grf-p +m9<2'BAi@IPe%lG!"5:KRMtUlSo +qZpZe"HaQ\Jn:./o+rdrLCMIQK9]k[t7\"Pdom5!Us*BOi7q'm:@mTc%sXOWqR_:) +)Gp'bRon5%S.Yr=5S>U^qUCnG<=#L?SMAU#3J(o.t:+Z2ME`OIq@lQD6sblA,p,R- +j0':`;3d5XU.Xc\[P!LFcc!#>kG`4]"KWTZ4MP'-RqQ6Q[$F,Dhi^.he&J:3(Q,_5 +bUh\Y"7hAQ/]OoIq5ChSk8hn&OR,cYQ=o'#Kla$IG]crUQL4R@s02!9sS9]p\Gf"m +o-[,OEiI?Ju:=aQ"KmT\h>#d\)%+sniTWZ,WtYcUb4fG$@abM^Ob4Aa@Fe^`E]P[eA^ouj#Qc%D]k.[EtLqZX7j\C5)M`]U0Y$)iEp +CkO:Z7l;dh+@!!(#cPtCgP[@m;fa!,JoZ1JPhmBfG0dHgc"R+8?Gn@@s9[Q(YT/L) +;MVh6U$JI'-qM0Ze+?[j$4?O8@(i\F0o.U%Q8rlN]A,[a7a=H=?A.NTQ18EI>OiC@ +m72fCn&M)Y"A%WIX;EuDrLB\$JaK`NgpgeKl:k9!)7(W2R/X?*4GnX7L*\3p1rt22 +VURH.j(7>ELqca+Hk-8*(g_=0-@.m!#gFJ:c]gn8T.rr?6+V^uC_CSIZ@4&_crW3n7eXWt,&/3-N\UjCAlU=n;Sb +R?+^[!\mQ\;t]77nsj4Q]Bu1OQ"#`]6MC")T7H5IWL?GTU>-$)!X;uC!*lMY`h-_N +"A=_S=\O(p!!JB=e9D_-,G_)c1CH)!(tYKSSbK\://Ba&!f[b_">\!f!-FJV&H-N? +p6i'Y2PJ0m=EiqFV&F5OM^Ui#s@*"YeXbCNS3@EFJ&kR>.q>%`T5en1fKS&KD3-;j +SDenF[Xc%RFb8mj6Vs2N+8+5QLr3BNoH^pmbUOJp-lS=I#Nu9oju0Nk>Jr*C(nE3G +E+!F[^(V5Yl]Fl_isnb=guj*G-\RP1P^Q0dpIIkmoh4sGQ?a`/)%3#Cp +?UG.d]M];]CYK0/L:gEYc^q-lg=Jo"?/5;rOuBAE(C)SO=;Kl*.cigY=!.3p+lfZk +2SGsJO2?W!'9,8\'i/bf*Q^6;jJS%$.!!RAntIK)L]8bIOEYhJcu3I2p)[u1P!NUc +V2[h>rT_`%[D:Q+%o8J21ZU1)(lMi)iWs6F29(+,H/r%FIGhX_5,j5X"f0HnsG7Bc +&S8h36+YP[8VG3=feg@)JUWnYdY7bra[H?GN0n\/!b)uDmF+'l:e\k`uR#3m>*i]u@'@u^oaj +bI5lE][>enI,&HT>UN,A&&j5i[ZHgNn.>V0r-ME8Ef-rRCB*s(s(tj"1$O[oY2.9? +KN8:'3*Fu!OeK\$sdq/*OsEBZLmNT=P:diQS3F2_[Z^mEefd7kjL,Ur+2Xm( +"Ve0/',q1DfHJ$b`UBC/DG^Z)iX.aj#ApXT+#h6&U6ga;KuJ(n8)Mb-'d,n#"5mEL +2b&nIG"kukHAd[,*!+)f1GKDRdT/YC8%FQ7T,;YZ%+- +\cc"r4C3/h7%JU\Bj2AA$:8=d-e;5mX-C_SKKUb*,uFa)k?!P"(CSf].R35*`FG'5]C$Co0;8^ +q^>1\:#b,Ig(;P?4-3TQhJ*jHX/Z9:$ce"an#DUi%b#YE8$>1inXmJW3a.F\qo`r` +2Orbl3QZ/CZ^]3A&6lC`h*`GBO;3$o\U+&L!4S^4oUu'1!KoJ<#G]!"^=",HQ3sBn +.3AX)giLtCDN>rY7a-L27iU,P/4'l:dg`16sGKC7fWr--j.!-^LXMUr#+u5icoA@! +)i\GP`Kr"7SCFXZ,r"@?^Sj/OqWu`"+UPq*sm(NN?8QPeMTqk)daS0EpdPRd\MFP8 +`UU*@8pVqA#VK14Y(,_g3n>`CEWDcD/X%[W[4*G@2OEfK#9Ug7X4*RmPGI.1+d"RM +)U$Z[FFZh9.F/IqdFMl#/MDoS.\#m!L_l,gD`oXjcY,1GG=B6("2%n,J1B=a_opX[ +ptJ!,Tat=-chJdO +gCkR\Knl3($L)arLcWTE/W^+G +r3'o^?\;HlTc;uYO,cXmtTOj`83`JD=45XWbtpU2QL)FficBr5>j#U-hs=:rn;i9c +BkVW&&Q]g;Iu%f]%"-gQ]"\H[P9_eB8i?Lgn_:1C/8HJUgbX4+XSK9=+I(hj52_n%H;+78umZUN^a0hiNPI.8 +%itM%CE[PH`6j2DRR-0QVpO?A43/bn]o8R:65/q9d$r%o=0p5 +@&Al&[dk"@qQCqaAuUPYcBh8\+YI]4>M2'.G^4+_fc6prA.-so\7rSqESQHJ7N$!o +WH3jd)-W/*ceDAWgmr!A"F4ZJ1rR@oUOeqZL-S4_&n3.1O.k)[2.1@b8DIH\AJ@28 ++j!_[J3$;:_IdNDYr;$a3q6j2Eu.Eh"`q3?G`/kai*d8/UX$+20*Knf*/6Zn6B"R2B&JO +9R^C1-N=L"3UToIb$+?pV[//n/oP$*;H5OKk@iP^r6G$rZLCmNne0:4(c*_9kh""$ +e];6QBuTfa`e6j/1uO2mF_,?#lsr^G?*!BCouN1T&J1OQ4-$;q@?cl)T0Y(SG7j"8 +Bg0lWF:Iq`p\C^:]k7[%];!t/Rq?QaWtE$oEa?j'Q"J?/]+[%c`I1fSiZ?WLOLRS'\.=#K +[-JHacZ@"bPqP^5@c;%$sg:8KOK/n6-e8)#GA9+[D*'dAY1aFb:(SJT?auA:Jus<[ +mnteU5B>8P1`7.R6Pr:$4]8fI8:OXq;&3iEMdIThXUt\O[7fnN)i]QBX>_ff;Q$Li +F=uklfr9S5E0$UeVB2BhmM^2`fai19EKW-(%O<%c\8s6_gC!r:k@b^1"]>YEV5t81 +K:lgRTVI(E=#rgREo5PrYi;8eW'J]a(Sd>!p#8m59kIqkNY+ZV7!,&]q%GikbmMEn +F'/E'YKMHpar%&!F'LO-j-$kF?<]"At%l@jC?]WaS[bp2Y4D@l"Xc`[ie53W#kWf/ +t$8!q2)[!`nef4#O4>lX\dNS'&!.<]^\Sf_-Ato(uY?@".;*R>:.Jj-,__XrrBgD<(9!YH"#r?f +@Djk=Gt>6o:]Psq29tQqteiVB]!6/H +[Ts7=2\!"gaOd(IaOHoa5#hp_5uC^7e4u?>H'3ka,o$]C_,]t*l<=t1eS,1Q;P1u% +o;r+dXW^q[9KT^V3"o*R?&:P@QPS+e@If.jH_)E<(r7_fK-HQ53K=a>i&f@C(OP)7 +2;rZ&n":%5%ks^>k.2bF*P#hdNJh[fclUB!>aQE(`DN!4QkAVJ.h]q:=;,?Ih_ +C6+7*e9iS9'>jb1p'gPj&">!b@tTIm;4@KRi/!hX:K2E:L5Pgk*l"[8jb23o+j'Df +hunGoVa(HLK%fB`3@p":C=2X*HGWiiEli>N9AoF0mjN%.m_Y^;f1LL+l\OK>"!3Yi +WWi_YXf*,!D"5XOc&M.)'m]?o#55]=Cq%k6&&,n(*fg<\[M"pSuL^V3qD'2?Ufrm/ +tN%EN0"86N03Ah>u]h0_YQXTh$Dtnb+N4Fbg+6H3!>A-ae0,Qj5GKBg>Y[\h)QUEj +sK?r?SWBVjTu1V>r@CkoSX_.g;OZeMVOOcEgt^iGA\s%,T`PB=%U!pk*;=TcKb]5/Q=AA8$2&dR>$\Rrk?FZj^J"j#F.W^UJIXFWjh6n[fYZbp<,iS +TcPT1;u(FU_6/b#f6GX!(X-gCt#QRm&m]u@(:QIM!dq_TiKlJM'JO0GTOl.kh[etn +LfH0X8$kjZHa=4D_Gq.V6G2^5iXi,CJF:qnEnEUQkrZt0ehk>>G-o@YVlSQ3Pi``2 +:tD.]##RZE!HYgJ3PL`X(Q8mS*_cUi0/h&[&;kd/$-sFq%Bc$:0bBn,MV*>[9;:5R +'!aYEh$c[i&U&H6_nLdB8SOd\^GA)\VGONqm3nM.hKMm&4$Fq#.,2/R0-]ua]"URE +V6:n/`MT!6)DPMiN&liYde2"A!;KF+HcGV`:K^`BUo-qAjAB!N:GW)l/abVE?:_h[ +ogq'ZkuZ45UZ`^HoiC=W[\CWbFq,f,AB(!kY6B$KmjABqRf)8FO.U1OY6!%c$,VUG +kPGc4CiC@$D-''rr@h'-I8?"CN$"`Wtiq;0lC`6PedmHo04eEWATaTOmCZ"E_mQil.Lsq +aZ-J:\uI5ZWlqeP.EmOhPm:8[mGAShQdFkXh:pJmarpL:0KDtl.>3;1JTT7*Nt?Bf +_$'e)eR0Q17jkNj-oIENr%k0_]O`E>%R0?Ntt#n9QON`GfCgN\?c%4(cc7+6r,JOerr?e=5oajr>SMehh4HUf4.-D6.4r\ZcQiVYop,9(r +[N:UnBRpj_qe3$'LeuhDCc!u!1k-BfJ\3I!::#SUusc!?iZk:rg'-N^-,ti-JIGXS>9>`:*o]FD2LK5Te;aZPMsDP +Gn?)#:ZKsDXdCZoJpHG;7G#mC,7Z2?R,ND>E!uGM=Fs?+n4`hen(-V;oCRt%,Y[2^ +9-\;M%MhU:\P@AR]IV#D&^imYT8H^Z^BXU1iK"&^F +VHQ:l1^LUB$lrZbd"2hZc;0:)g6bJZ;*);M"'lNbtIbSp_=$gILu;/_d=$696P#dZ +nE6N>FTDb$Z>tE7: +%-EOD- +Q +Q +q +667.28 85.39 490 262.5 re +W* +q +q +[1 0 0 1 0 0] cm +0 0 595.28 841.89 re +W +Q +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 37 55.78] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\004) +[6.036 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.67383 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.02148 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.01758 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.69141 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.36523 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.69922 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\001) +[3.624 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.69531 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.36914 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\006) +[6.096 +0] Tj +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 3 3 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0.706376 translate +0.9983 0.9983 scale +0 0 596 842 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 595.28 841.89 re +W +q +q +[1 0 0 1 0 0] cm +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 72 805.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.3418 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.01562 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68359 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35742 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.03125 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.70508 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.37891 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.375 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.04883 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.04492 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.71094 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37891 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.37891 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.05273 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.72656 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.39258 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.06641 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.74023 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.4082 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.07422 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.41406 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.08008 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.0957 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.76953 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.76562 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.76562 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.77344 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76953 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.44336 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.11719 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.11328 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.7793 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.7793 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.44727 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.11328 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.78711 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.11719 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.79102 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.46484 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.13867 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.80664 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.80273 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46875 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.46875 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.14258 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.47656 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.47656 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.14258 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.47656 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.15039 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.1582 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.49219 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.16602 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.83203 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.49805 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.83203 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.50586 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.17969 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.8457 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.8457 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.8418 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.51562 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.52344 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.19727 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.86328 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.53711 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.21094 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.88477 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.55859 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.23242 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.5625 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.23633 -9.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.68164 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.02148 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.35547 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.68945 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36328 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37109 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.04492 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.71875 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04883 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.04883 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.71484 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.38477 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.38867 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.0625 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.72852 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.72852 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.72852 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.40234 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.07031 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.74414 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.41797 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.08398 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.0918 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.76562 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.43945 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.10547 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.10547 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.77148 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.44531 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.11914 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.44922 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12305 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79688 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.46289 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.46289 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12891 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80273 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.47656 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.81055 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.47852 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.48242 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.47852 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.15234 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.81836 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.82617 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.82227 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.49609 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.16211 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.83594 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.83594 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.16992 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.83594 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.84375 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.17773 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.85156 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.52539 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.52539 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.19141 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.86523 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.53906 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.87305 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.86914 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.86914 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.86914 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.54297 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.2168 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.89062 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.56445 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.23828 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 473.57227 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.23828 -24.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.00391 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.67383 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.34766 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.68164 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.35547 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.35156 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.01953 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.02344 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.69727 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37109 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37109 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.04492 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.71094 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.37695 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.05078 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.38477 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.05469 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.38867 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.38477 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.05859 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.05469 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.72266 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.38867 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.0625 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.0625 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.39648 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.4043 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.4043 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.07812 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.08594 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.08594 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.75977 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.42578 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.09961 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.77344 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.10742 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.78125 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.11523 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12305 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.78906 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.46289 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46289 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.12891 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.80273 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.46875 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.14258 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.81055 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.47656 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.15039 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.15039 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.82422 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.1543 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.82812 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.49414 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.16797 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.49805 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.83203 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.50586 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.50195 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.17578 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.84961 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.18359 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.85742 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.52344 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.52344 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.18945 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.85742 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.53125 -39.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.68359 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.6875 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36133 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.36133 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.36914 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.04297 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.7168 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39062 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.06445 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.07227 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.07227 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.73828 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.07227 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.74609 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42383 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42383 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.42383 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.09766 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.76562 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76953 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.44336 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.44336 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79102 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.46484 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.13867 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.80469 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.80469 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.80469 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.8125 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.48633 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.16016 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.49414 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.16797 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.8418 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.17578 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.8418 -54.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67188 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.67969 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.01367 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.6875 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35352 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.68555 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.68555 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.35156 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.01953 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.68555 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.35938 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0332 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.70703 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.04102 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.03711 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.71094 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.37695 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.04297 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.70898 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.04297 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.04297 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.7168 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.39062 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.06445 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.73047 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.72656 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.40039 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.07422 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.4082 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.08203 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.41211 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.4082 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.08203 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.75586 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.42969 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.4375 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.4375 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.10352 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.77148 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.44531 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.44141 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.11523 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.7832 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.7832 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.45703 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.13086 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.13086 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.80469 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.80469 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.13867 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.8125 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.14648 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.82031 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.1543 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.82227 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.82617 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.5 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.50781 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.50781 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.18164 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.17773 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.17773 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.85156 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.18555 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.51953 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.18555 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.85938 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.85938 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.52539 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.19922 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.87305 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 475.54688 -84.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00391 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.3457 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.3457 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.01562 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.68164 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.35547 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.35547 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.02344 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.68945 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.36328 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.35938 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.0332 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.70703 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.37305 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.70703 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.71094 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.37695 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.05078 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.38477 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.05859 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.05469 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.72852 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.40234 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.73242 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.39844 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.07227 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.07227 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.74609 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.08008 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.08008 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.74609 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.41406 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.08789 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.08398 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.75781 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.42578 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.42188 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.0957 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.76953 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.76562 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.43164 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.76562 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.09961 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.77344 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.77344 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.43945 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.10547 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.77148 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.77148 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.4375 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.77148 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.76758 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.44141 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.77539 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.10938 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.77539 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.77539 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.44336 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.43945 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.11328 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.78711 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.7832 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.44922 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.7832 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.45703 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.13086 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.79688 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.79688 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.46289 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.13672 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.81055 -99.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.69531 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.36133 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.0293 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70312 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.69922 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37305 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.03906 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.37305 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.04688 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71289 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.38672 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.05273 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38672 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.06055 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.73438 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74219 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41602 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08984 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75586 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08984 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.76367 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42969 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.76367 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.75977 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.42578 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.42578 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.09961 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.43359 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.42969 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.10352 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.77734 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.77344 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.43945 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.77344 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.44727 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.11328 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.78711 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.46094 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.12695 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.12695 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.12695 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.79297 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.78906 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.45703 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.46094 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.79492 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.46094 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.13477 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.46484 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.13867 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.8125 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.14648 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.48047 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.1543 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.82031 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.48633 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.16016 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.49414 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.16797 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.8418 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.50781 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.18164 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.84961 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.8457 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.51953 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.51562 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.18945 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.18945 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.86328 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.53711 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.20312 -114.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.66992 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.66992 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35156 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.01562 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.68945 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.68945 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.68945 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.69727 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.69336 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.36719 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.70117 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.03516 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.70117 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.03516 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.36914 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.04297 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.7168 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.7168 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.38281 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.05664 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.73047 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.73047 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.39844 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.06445 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.73828 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41211 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.74609 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.41211 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.08594 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.08594 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.75977 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.42578 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.0918 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.42578 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.42578 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.09961 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.77344 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.44727 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.12109 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.79492 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.12891 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.79492 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.12891 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.80273 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.47656 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.15039 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.48047 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.1543 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.82227 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.49609 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.16992 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.84375 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.51758 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.51367 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.1875 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.18359 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.84961 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.18359 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.85156 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.51758 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.19141 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.86523 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.53906 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.87305 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2207 -129.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01758 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.69141 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.36523 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.03125 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.37305 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70703 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38086 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.05469 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72852 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.39453 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.06836 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.40234 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07617 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.75 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.42383 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41992 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.75391 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42383 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75781 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.0918 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.76562 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.76562 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.43164 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.09766 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.76367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.42969 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.76367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.4375 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.10352 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.77734 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.45117 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.125 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79102 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.45898 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.45508 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.12891 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.12891 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.12891 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.80273 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.4707 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.4707 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.14453 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.15234 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.82617 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.5 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.17383 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.84766 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.84375 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.51758 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.51367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.17969 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.84766 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.51367 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.1875 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.19531 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.86133 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.53516 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.20898 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.20508 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87891 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.55273 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.2207 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.2207 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.88672 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.55469 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.22852 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.22461 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.89844 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.23242 -144.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33398 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.00781 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.67383 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.0293 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.70312 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37695 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.05078 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.72461 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39258 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06641 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.0625 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.73633 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.40234 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.07617 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.08398 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75781 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.42383 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.08984 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.76367 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.4375 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.11133 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.10742 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.77539 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.7793 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45312 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.46094 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.12695 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.80078 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.80078 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.47461 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.14062 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.80664 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.14062 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.13672 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.81055 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.14453 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.14062 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.81445 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.14453 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.47852 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.15234 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.14844 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.82227 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.48828 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.48828 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.15625 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.83008 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.16406 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.49805 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.17188 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.8457 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.8457 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.51172 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.18555 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.85938 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.19336 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.86719 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.54102 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.20703 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.87305 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.88086 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.88086 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.55469 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.55469 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.55469 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.2207 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.89453 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.56055 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.22852 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.22852 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.89453 -159.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.3457 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.6875 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.36133 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.36133 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36133 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.03516 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.70898 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.375 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04883 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05273 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.72656 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.40039 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.06836 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.40234 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.06836 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74219 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74219 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.4082 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08203 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.75586 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42969 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.09766 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.77148 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.44531 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.11133 -174.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.33594 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.00977 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.34375 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.33984 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01367 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.00977 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.67773 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.34375 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.01758 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.01758 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.35156 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.35938 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.0332 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.70703 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.71484 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.05469 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.38867 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.0625 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.05859 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.73242 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.40625 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.73633 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.41016 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.07617 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.75 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.42383 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.09766 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76367 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.09766 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.76562 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43945 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.10547 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.10547 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.10547 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.7793 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.45312 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.12695 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.45703 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.13086 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.80469 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.4707 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.4707 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.13672 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.81055 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.48438 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.81445 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.14844 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.82227 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.48828 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.1543 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.82812 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.82812 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.49609 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.16211 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.16992 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.50391 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.17773 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.17383 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.84766 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.52148 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.85547 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.5293 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.19531 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.19531 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.19531 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.86914 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.53516 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.53516 -204.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.67578 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.67578 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.34961 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.02344 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.03125 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03711 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.71094 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37695 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.05078 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71875 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72266 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.71875 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39258 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.05859 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.06641 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.73242 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40625 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.40625 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74805 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.74805 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.42188 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.0957 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76953 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.43555 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.10938 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.44336 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.44336 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.11719 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.11719 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.7832 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.45703 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12305 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.45703 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.125 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12891 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80273 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.81055 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.48438 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.15234 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.82617 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.5 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.49609 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.16992 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.50391 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.17773 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.85156 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.52539 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.52148 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.18945 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.19336 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86719 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.5332 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.19922 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.87305 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.54688 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.88086 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.55469 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.55469 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.22852 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.90234 -219.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.36914 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.70312 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36914 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37695 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.05078 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.04688 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.7207 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.05469 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72852 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39648 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.07031 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06641 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.06641 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.06641 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74023 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40625 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08008 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.41406 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08789 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.76172 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42969 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42969 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.10352 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.77734 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.45117 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.11719 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.79102 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.125 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79102 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.46484 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.46484 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.79883 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.47266 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80664 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.48047 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.47656 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.15039 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.1582 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.83203 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.50586 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.50586 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.83984 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.51367 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.84766 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.51562 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.51172 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.18555 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.85938 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.85938 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.5332 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.20703 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.88086 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.21484 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.21484 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.88867 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.88477 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.88477 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.55859 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.55859 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.22656 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.22266 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.88867 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.88867 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.5625 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.89648 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.57031 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.24414 -234.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.66992 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.34375 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.67773 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.35156 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.35156 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.68555 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.35156 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.02539 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.69922 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.36523 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.03906 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.03516 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.70312 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.37695 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.05078 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.72461 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.39844 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.40625 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08008 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41992 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.75 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.41602 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.08984 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.08984 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.75586 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.42969 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.0957 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.10352 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.77734 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.45117 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.78516 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.78516 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.45117 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.11914 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.79297 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.78906 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.46289 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.13086 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.46484 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.13867 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.13867 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.80469 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.4707 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.13672 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.13672 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.80273 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.13672 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.81055 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.47656 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.47656 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.47656 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.15039 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.14648 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.14648 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.14648 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.82031 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.48828 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.16211 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.82812 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.50195 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.49805 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.16602 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.50781 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.18164 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.18164 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.51562 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.18164 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.85547 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.5293 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.19531 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.86914 -249.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01172 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.68555 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.68164 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.01562 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.68945 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.01953 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.69336 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.70117 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.36719 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0332 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.70703 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.38086 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.04688 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.05469 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72852 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.72461 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.39844 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.39844 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.06445 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.73828 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74609 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.08008 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.75391 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.75 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.42383 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.09766 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.09766 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.76562 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.76953 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.44336 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.44336 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.11719 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79102 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.46484 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.13867 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.80469 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.80469 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.80469 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.8125 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.48633 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.16016 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.49414 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.16797 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.8418 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.17578 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.8418 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.50977 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.17578 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.84961 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.8457 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.51953 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.19336 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.85938 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.19336 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.86719 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.19727 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.87109 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.87109 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.87109 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.54492 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.54102 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.54102 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.21484 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.22266 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.89648 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.5625 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.22852 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.90234 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.57617 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.25 -264.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68945 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36328 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69727 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.03711 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70312 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37695 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.05078 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.72461 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39258 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06641 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.0625 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.0625 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07031 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.74414 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.74023 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.41406 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74805 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41406 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.41797 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.41797 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08398 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75195 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.42578 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.42188 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.0957 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.42969 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.09766 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.43164 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.10547 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.77148 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.77148 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.44531 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.11914 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.12695 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.12305 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.12305 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.79688 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.79297 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.4668 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.4668 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.13477 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.80859 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.47461 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.47461 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.80859 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.48242 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.8125 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.8125 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.48633 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.48633 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.82031 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.81641 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.48242 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.15625 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.83008 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.49609 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.16211 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.82812 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.83594 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.50977 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.17578 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.50977 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.50586 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.17188 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.17188 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.8457 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.8457 -279.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.0332 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.71484 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38867 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.05469 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.72852 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.39648 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.39258 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.0625 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73633 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.73633 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73633 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.41016 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.40625 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.40625 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.08008 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41406 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.41406 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.08789 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.08789 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.08789 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.75391 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.42773 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.09375 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.76172 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76172 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.43555 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.43164 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.42773 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.10156 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.77539 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.44922 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.11719 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\024) +[7.704 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.7832 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.45117 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.125 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.79102 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.46484 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.46094 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.13477 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.80859 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.14258 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.81641 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.8125 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.48047 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.14648 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.8125 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.48633 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.16016 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.15625 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.16406 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.16406 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.83789 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.83789 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.51172 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.18555 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.85938 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.52539 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.19922 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.87305 -294.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35742 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.36133 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.0293 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.69531 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36914 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70312 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.71094 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.70703 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38086 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.38086 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.38867 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.05469 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.72852 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.40234 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07617 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.07227 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.40625 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.07227 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.40625 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.08008 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.07617 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.75 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.42383 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.0918 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.76562 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43945 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.43945 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.11328 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.78711 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.7832 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79102 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.125 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.12109 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.78711 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.46094 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.13477 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.80078 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.4668 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.13281 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.14062 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.81445 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.48828 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.1543 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16211 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.83594 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.50977 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.17578 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.8418 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.84961 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.84961 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.51562 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.84961 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.52344 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.53125 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.52734 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.20117 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.53516 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.20898 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.20898 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.87695 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.21875 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.89258 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.89258 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.22656 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.89258 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.56641 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.24023 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.90625 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.58008 -309.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.67969 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35352 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.02734 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.02344 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03125 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.70508 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37891 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38672 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.05273 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.71875 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39258 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06641 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.0625 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.07031 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.4043 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.07812 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.75195 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.75195 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.41797 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.0918 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.76562 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.09961 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.77344 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.44727 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.11328 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.78711 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.45312 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.45312 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45312 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.11914 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.79297 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.80078 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.47461 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.14258 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.81641 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.49023 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.15625 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.49023 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.82422 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.49805 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.16406 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.83008 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.83008 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.49805 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.16406 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.83789 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.16797 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16797 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.8418 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.8418 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.50781 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.17383 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.50781 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.18164 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.85547 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.18945 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.86328 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.53711 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.21094 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.21875 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.89258 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.56641 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.24023 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.91406 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.24805 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.91406 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.58789 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.26172 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.5957 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.26953 -324.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 23.34375 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01758 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01758 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.35742 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69141 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.36523 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.03906 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.03516 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04297 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.03906 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.70508 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.37891 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.05273 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.7207 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.7168 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.39062 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.06445 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.39844 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.07227 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.07227 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.74023 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.41406 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.08789 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.08789 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.08789 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.76172 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.0957 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76953 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.09961 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.0957 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76172 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.43555 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.10156 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.10156 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.77539 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.44141 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.11523 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.44922 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.44531 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.11914 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.11914 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.78711 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.79102 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.46484 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.13867 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.13867 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.8125 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.47852 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.14453 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.81836 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.15234 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.82617 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.5 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.17383 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.83984 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.51367 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.1875 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.52148 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.19531 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.86914 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.53516 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.20117 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.875 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.54883 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.88281 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.55664 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.55664 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.23047 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.9043 -339.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00391 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.67773 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35156 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.68555 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.35352 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69336 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.02344 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.69727 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37109 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.04492 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71289 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04688 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.7207 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.7168 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.05078 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.72461 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.05469 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.72852 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.39648 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.07031 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.74414 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.41016 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.08398 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.41406 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.74805 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.74414 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.41016 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.41016 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.74414 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.41016 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.08398 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.75781 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.76562 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.76562 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.43945 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.10547 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.7793 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.45312 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.78711 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.46094 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.79492 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80273 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.80273 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46875 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.80273 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.47656 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 299.48438 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.1582 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.83203 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.50586 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17383 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.84766 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.52148 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.19531 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.19531 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.86328 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\014) +[6.78 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.19336 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86719 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86719 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.86719 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.875 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.875 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.54883 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.54883 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.54492 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.54492 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.21875 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.55273 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.54883 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.22266 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.22266 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 474.22266 -354.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34375 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01758 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.68359 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.68359 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.01758 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69141 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.02148 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.69531 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.36914 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.37695 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05078 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.71875 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.38477 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.05078 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.72461 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.39844 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.39453 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.06836 -369.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.35156 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.02539 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.69922 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.70703 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.38086 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.04688 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.71289 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.38672 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.38281 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.38281 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.05664 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.05273 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.72656 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.40039 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73047 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.4043 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.40039 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40039 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.4082 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.07422 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08203 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.41602 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08984 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75586 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.42188 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.75586 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.08984 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.75586 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.42969 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.42969 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.0957 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.76953 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.44336 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.11719 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.78516 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45898 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.12695 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.12695 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80078 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.79688 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.46289 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13672 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.4707 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.14453 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.81836 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49219 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.16602 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.17383 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.84766 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.52148 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.1875 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.1875 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.18359 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.85742 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.53125 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.19922 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.86523 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86133 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.53516 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.86914 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.86523 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.53906 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.87305 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.86914 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.54297 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.53906 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.20703 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.87305 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.54688 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.54688 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.2207 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.55469 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.22852 -399.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.35352 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.35352 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.35352 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01953 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.34961 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.02344 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.69727 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03125 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.70508 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.03906 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.70703 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37305 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04688 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.04688 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.7207 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.05469 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.7207 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.39453 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.39453 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.06836 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.39844 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.07227 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.74609 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41992 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.09375 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.08984 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76367 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.75977 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.42578 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.09375 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.75977 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43359 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.10742 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.77539 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.44922 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.7832 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.7832 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.45703 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.13086 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.80469 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.47852 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.15234 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.48633 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.15234 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.48633 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.16016 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.82617 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.5 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.50781 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.17383 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.84766 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.84375 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.51758 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.84766 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.51367 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.52148 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.51758 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.18359 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.18359 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.85742 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.85742 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.52539 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.5293 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.86328 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.5293 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.20312 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.5332 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.5332 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.20703 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.88086 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.55469 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 474.22852 -414.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.68164 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.68164 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69922 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.37305 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.04102 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.71484 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38867 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.05469 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.05469 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72852 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.72852 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.39453 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.06836 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.73438 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.74219 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.41602 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.08984 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.76367 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.4375 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.44531 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.44531 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.11914 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.79297 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.79297 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.4668 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.14062 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.81445 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.48828 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.15625 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.83008 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.83008 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.49805 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.50195 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.83594 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.50195 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.17578 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.50586 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.17188 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.8457 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.8418 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.51562 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.8457 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.51953 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.19336 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.52734 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.20117 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.86914 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.54297 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.20898 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.20898 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.54297 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.2168 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.54688 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.2207 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.55469 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.55469 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.22852 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.22461 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.2207 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.89453 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.56836 -429.73633] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +Q +Q +q +72 85.39 490 262.5 re +W* +q +q +[1 0 0 1 0 0] cm +0 0 595.28 841.89 re +W +q +/DeviceRGB {} cs +[0 1 0] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 201.89] cm +0 -30 288 30 re +f* +0 -30 288 30 re +S +Q +q +/DeviceRGB {} cs +[1 0 0] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 129.89] cm +0 -30 360 30 re +f* +0 -30 360 30 re +S +Q +q +/DeviceRGB {} cs +[0.8863 0 0.4706] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 309.89] cm +0 -30 180 30 re +f* +0 -30 180 30 re +S +Q +q +/DeviceRGB {} cs +[0 0 1] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 273.89] cm +0 -30 216 30 re +f* +0 -30 216 30 re +S +Q +q +/DeviceRGB {} cs +[0 0.6196 0.8784] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 237.89] cm +0 -30 252 30 re +f* +0 -30 252 30 re +S +Q +q +/DeviceRGB {} cs +[1 0.9255 0] sc +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 162 165.89] cm +0 -30 324 30 re +f* +0 -30 324 30 re +S +Q +q +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 144 325.89] cm +[0 -1 1 0 0 0] cm +0 0 m +240 0 l +S +Q +q +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +1 w +[] 0 d +0 J +0 j +[1 0 0 1 144 85.89] cm +0 0 m +400 0 l +S +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 72 301.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 1.28271 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\003) +[11.43 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.77783 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\007) +[7.83 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.12012 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\013) +[8.205 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.28271 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.625 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\017) +[8.145 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.7876 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\023) +[4.815 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.78271 -11.7373] Tm +0 0 Td +/F35_0 15 Tf +(\007) +[7.83 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.62012 -47.7373] Tm +0 0 Td +/F35_0 15 Tf +(\000) +[10.095 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.45264 -47.7373] Tm +0 0 Td +/F35_0 15 Tf +(\016) +[3.135 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.62012 -47.7373] Tm +0 0 Td +/F35_0 15 Tf +(\024) +[8.115 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.78271 -47.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.44531 -83.7373] Tm +0 0 Td +/F35_0 15 Tf +(\001) +[10.065 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.27783 -83.7373] Tm +0 0 Td +/F35_0 15 Tf +(\026) +[8.1 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.62012 -83.7373] Tm +0 0 Td +/F35_0 15 Tf +(\007) +[7.83 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.9624 -83.7373] Tm +0 0 Td +/F35_0 15 Tf +(\017) +[8.145 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.77295 -119.7373] Tm +0 0 Td +/F35_0 15 Tf +(\002) +[10.755 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.44043 -119.7373] Tm +0 0 Td +/F35_0 15 Tf +(\022) +[6.03 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.27783 -119.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.62012 -119.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.9624 -119.7373] Tm +0 0 Td +/F35_0 15 Tf +(\017) +[8.145 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.44043 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\006) +[10.02 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.61768 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.95996 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\016) +[3.135 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 37.12744 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\016) +[3.135 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.29492 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\020) +[8.625 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.45752 -155.7373] Tm +0 0 Td +/F35_0 15 Tf +(\025) +[11.655 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.7876 -191.7373] Tm +0 0 Td +/F35_0 15 Tf +(\004) +[10.755 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.62012 -191.7373] Tm +0 0 Td +/F35_0 15 Tf +(\011) +[7.785 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.9624 -191.7373] Tm +0 0 Td +/F35_0 15 Tf +(\010) +[8.205 +0] Tj +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 72 347.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.26123 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\005) +[12.98 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.30225 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\015) +[4.598 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.41455 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\023) +[7.062 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.74072 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\016) +[4.598 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.85303 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\011) +[11.418 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.20068 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\020) +[12.65 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.63916 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\012) +[7.964 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.07764 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\002) +[15.774 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.18994 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\022) +[8.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.75146 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\007) +[11.484 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.98682 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\021) +[12.628 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.42529 -17.0166] Tm +0 0 Td +/F35_0 22 Tf +(\014) +[11.946 +0] Tj +Q +Q +Q +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 71.72 54.78] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.01758 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\001) +[3.624 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\006) +[6.096 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\005) +[6.132 +0] Tj +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Page: 4 4 +%%BeginPageSetup +%%PageOrientation: Portrait +pdfStartPage +0 0.706376 translate +0.9983 0.9983 scale +0 0 596 842 re W +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 595.28 841.89 re +W +q +q +[1 0 0 1 0 0] cm +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 36 805.89] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68945 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.36328 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.0293 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36914 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.36523 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.03906 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70898 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38281 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.71289 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.38672 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.05469 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.7207 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.39453 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.39453 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72852 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.40234 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.40234 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07031 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.4043 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.07812 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.74414 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.74414 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.41797 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.0918 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.09961 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09961 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.77344 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.44727 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.11328 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.11328 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.78711 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45312 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.12695 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.79492 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.79102 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.45703 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.45703 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13086 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.46484 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.13086 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.13867 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.47266 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.14648 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.82031 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.82031 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.48633 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.16016 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.83398 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.16797 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.16406 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.83789 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.17188 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.50586 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.17188 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.17188 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.83984 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.51367 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.1875 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.86133 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.19531 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.86914 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.54297 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.53906 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.21289 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.54688 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.21289 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.88672 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.56055 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.55664 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.23047 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.9043 -9.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.36914 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.03711 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.71094 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.37891 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.05273 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.71875 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.39258 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.39258 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.06641 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.0625 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.73633 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.4043 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.07031 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.74414 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.74414 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.07812 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.75195 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.08594 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.75977 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.43359 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.10742 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.78125 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.78906 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.46289 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.13672 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.4707 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.13672 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.81055 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.81055 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.14453 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.81836 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.81836 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.48633 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.15234 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.82617 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.5 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.17383 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.50781 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.18164 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.84766 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.84766 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.18164 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.85547 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.18555 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85938 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.5332 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.19922 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.86523 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.53906 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.21289 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.54688 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.2207 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.2207 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.89453 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.56836 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.57617 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.25 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.24609 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.24609 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.91992 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.58789 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.58789 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.26172 -24.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.0332 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.70703 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.04102 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.71484 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.04883 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.04883 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72266 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.72266 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72266 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.38867 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.0625 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.72852 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.39648 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.39648 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07031 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.73633 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74219 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.74609 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41992 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.09375 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.76758 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.44141 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.44922 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.11523 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.12305 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79688 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.4707 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.14453 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.81836 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.82617 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.5 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.49609 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.16992 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.84375 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.51172 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.18555 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.85352 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.52734 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.19336 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85938 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.5332 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.5293 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.5293 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.20312 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.19922 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.87305 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.54688 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.87695 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.55078 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.22461 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.89844 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.89453 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.5625 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.9043 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.57812 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.57812 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.91211 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.57812 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.25195 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.92578 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.5918 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.26562 -39.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36328 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.03711 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70312 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37695 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.05078 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.72461 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.39062 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.05859 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.73242 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.39844 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.39844 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.39844 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.07227 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.74023 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.74023 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.41406 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.41016 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.07617 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.75 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.41797 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.41406 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.08789 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.76172 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.75781 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.42383 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.75781 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.75391 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.42773 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.76172 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.75781 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.43164 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.76172 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.76172 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.43555 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.10938 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.7832 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.44922 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.44531 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.11914 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.79297 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.12695 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.80078 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.13086 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.13086 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.80469 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.4707 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.13672 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.4707 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.13867 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.80469 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.8125 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.48633 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.15234 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.82617 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.5 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.16602 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.16602 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.16602 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.83203 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.16211 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.83594 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.50977 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.18359 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.85742 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.86523 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.86133 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.53516 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.20117 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.86719 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.5332 -54.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.01562 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01953 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.01562 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.68945 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36328 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.0293 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.03711 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.03711 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.71094 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.04102 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.71484 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.39648 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07031 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06641 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.74023 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.4082 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.4082 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.07422 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.07422 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.74805 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.74414 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.74023 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.74805 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.42188 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.08789 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.75391 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.42773 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.42383 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.42383 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.09766 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.09375 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.76758 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.44141 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.77148 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.77148 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.4375 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.10547 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.7793 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.77539 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.44922 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.11719 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.7832 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.45703 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.45703 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.79102 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.46484 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.79883 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.47266 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.14648 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.8125 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.48633 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.82031 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.48828 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\022) +[8.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.82227 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.49609 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.16211 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.16211 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.83594 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.50977 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.51758 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.19141 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.86523 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.53125 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.86523 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.53906 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.53516 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.20898 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.54297 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.20898 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.88281 -69.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.67383 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01367 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.36133 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.69531 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.69531 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.36914 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04297 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.7168 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.38281 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.04883 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.71484 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38281 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.05664 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73047 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.4043 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.73438 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.40039 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.4082 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.08203 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.75586 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.75586 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.08984 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76367 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09375 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.09375 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.09375 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76758 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.43359 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.10742 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.10352 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.76953 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.76953 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.44336 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.11719 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.79102 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.45898 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.45508 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.12891 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.80273 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.79883 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.46484 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.79883 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.79492 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.46875 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.14258 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.13867 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.80469 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.13867 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.80469 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.47852 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.47852 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.8125 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.48633 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.82031 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.48633 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.16016 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.16016 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.49414 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.16797 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.83594 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.50977 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.84375 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.83984 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.51367 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.17969 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.8457 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.51172 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.8457 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.51953 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 471.51562 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 478.18945 -84.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35156 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.02539 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.69336 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35938 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.0332 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.0332 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.70703 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\014) +[6.78 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.70508 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.37891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.37891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.38672 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.06055 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.06836 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.73438 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.4082 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.4082 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.74219 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.74609 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.41992 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.41992 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.41992 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09375 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.76172 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.0957 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.76953 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.10352 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.77734 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.45117 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.125 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.45508 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.45508 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.12891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.12891 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.80273 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46875 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.13477 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.80078 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.80078 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.4668 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.80078 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.47461 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.14844 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.81445 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.82227 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.49609 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.49219 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.16602 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.5 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.16797 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.83398 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.50781 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.18164 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.85547 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.18945 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.86328 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.53711 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.21094 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.20703 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.88086 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.21484 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.21094 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.21875 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.89258 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.56641 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.90039 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.9082 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.9082 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 475.58203 -99.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.36133 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02734 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.70117 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.375 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70898 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.38281 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.38281 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.05664 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.73047 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.73828 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.73438 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.4082 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.74219 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.07617 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.74219 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.74219 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.74805 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.75195 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.42578 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.09961 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.77344 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.44727 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.45508 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.45508 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.12891 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.125 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.125 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.79883 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.13281 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.80664 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.47266 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.14648 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.82031 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.48633 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.48633 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.48633 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.15234 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.48242 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.15625 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.83008 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.83008 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.16406 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.83789 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.17188 -114.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.66992 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.66992 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.34375 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.00977 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.67578 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.3418 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.3418 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.00781 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.3418 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.01562 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.68945 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.35547 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.36328 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.0293 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.70312 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.69922 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.37305 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.70312 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.70312 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.36914 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.70312 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.37695 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.38477 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.05078 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.72461 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.72461 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.39844 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.72852 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.39453 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.06836 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.74219 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.73828 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.41211 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.08594 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.75391 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.42773 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.09375 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.76758 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.44141 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.10742 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.10742 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.10742 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.77344 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.76953 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.4375 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.44141 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.4375 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.11133 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.78516 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.78516 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.45898 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.13281 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.80078 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.47461 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.14844 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.81445 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.81445 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.48047 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.1543 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.82812 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.16211 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.83008 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.50391 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.16992 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.84375 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.17383 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.83984 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.84766 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.84766 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.52148 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.52148 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.85547 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.52148 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.19531 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.86914 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.53516 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.20898 -144.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34375 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01172 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 44.67773 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.34375 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.01758 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69141 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.35742 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.36523 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03125 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.70508 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.70508 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.03906 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.71289 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.04688 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.7207 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.38672 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.05273 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.72656 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.40039 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.07422 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.4043 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07031 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.74414 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.41797 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.08594 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.09375 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.76758 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.76367 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.4375 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.4375 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.10352 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.77734 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.78516 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.45117 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.125 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.125 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.79883 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.12891 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80273 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.47656 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.14258 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.15039 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.82422 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.49805 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.50586 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.83984 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.51367 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17969 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.8457 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.8457 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.51367 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.51758 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.51367 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.1875 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.86133 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86133 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.53516 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.20898 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.87695 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.55078 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.21875 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.89258 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.55859 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.22461 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.89844 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.57227 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.24609 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.91406 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.58789 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.26172 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.93555 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.93555 -159.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.3418 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.3418 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00781 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.00781 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.68164 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.67383 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.68164 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.01562 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.68945 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03711 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70312 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.37695 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.04492 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.71094 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.38477 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.38086 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.05469 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.38477 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.05859 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.73242 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.41016 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.08398 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08398 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.75 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.42383 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.09766 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.76562 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09961 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.77344 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.10742 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.78125 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.45508 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12891 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.45898 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.125 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.79883 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.47266 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.14648 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.14258 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.47656 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.14258 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14258 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.81055 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.14453 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.81836 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.81445 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.14844 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.82227 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.15234 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.81836 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.82617 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.82617 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.5 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.17383 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.17383 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.84766 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.51367 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.17969 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.8457 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.17969 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.85352 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.51953 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.19336 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.86719 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.5332 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.5332 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.5332 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.19922 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.19531 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.86328 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.53711 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.21094 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.88477 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.55859 -174.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 5.33203 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.00586 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67969 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.67578 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35742 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.02344 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69727 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69727 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.37109 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.04102 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70898 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.7168 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.71289 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.04688 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.7207 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.05469 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72266 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.39648 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73633 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.73633 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.41016 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 145.40625 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.08008 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.74805 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74805 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.42188 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.0957 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.76953 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.44336 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.45117 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.78516 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.45898 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.125 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79102 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.125 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45898 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.13281 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.12891 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.46289 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.13672 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.4668 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.14062 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.80859 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14258 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.81641 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.48242 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.14844 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.82227 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.82227 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.49023 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.49414 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16797 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.83398 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.5 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.17383 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.84766 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.18164 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.85547 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.85547 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.5293 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.20312 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.21094 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.88477 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.55859 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.23242 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.5625 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.5625 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.23633 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.91016 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.57617 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.25 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.92383 -189.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.33594 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.34375 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.01758 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69141 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.03906 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.71289 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.38672 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.06055 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.73438 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.4082 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73828 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.73828 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.4043 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.73828 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.41211 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08594 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08789 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.76172 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.75781 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.43164 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.10547 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.43945 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.43945 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.10547 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.77344 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.44727 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.44336 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.11719 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.78516 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.45117 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.125 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.125 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.79883 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.79883 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.4668 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.4707 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.14453 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.81836 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.81836 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.49219 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.1582 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.82422 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.49805 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.83203 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.16602 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.83984 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.83594 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.50977 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.17578 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.50977 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.18359 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.84961 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.84961 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 381.51562 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.18359 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.85742 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.53125 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 405.52734 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.86133 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.86914 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.86914 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.54297 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.55078 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.55078 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.22461 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.2207 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.88672 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.56055 -204.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.01562 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68945 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.36328 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.03711 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.70312 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.37695 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.05078 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.38477 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.05078 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.05859 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.73242 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.40625 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.07227 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.73828 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.41211 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.08008 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07617 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.75 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.74609 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.41992 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.41992 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.41992 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.09375 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.76758 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.44141 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.10742 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.78125 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.11523 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.44922 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.12305 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.12305 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.78906 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 209.45508 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.12109 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.12109 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.78711 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.12109 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.78711 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.46094 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.46094 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.79492 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.80273 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.80273 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.47656 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.48438 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.48438 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.1582 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.1543 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.82031 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.49414 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.49414 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.16211 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\013) +[7.356 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.16602 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.5 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.16602 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.83984 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.16992 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.83594 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.50977 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.18359 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.17969 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.85352 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.52734 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.19531 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.19531 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.86914 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.53516 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.20117 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.86719 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.86719 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.5332 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.86719 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.54102 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.21484 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.88086 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.88867 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.5625 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.55859 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.55859 -219.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.68164 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.35547 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.02539 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.69922 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 59.37305 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36914 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03711 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70312 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.37695 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37305 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04688 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.7207 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38672 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.7207 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.39453 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.72461 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.39844 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.06445 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.73828 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.73438 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.4082 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.08203 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.41602 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.08984 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.41992 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09375 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.75977 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.43359 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.10742 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.77344 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.77344 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.77344 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.43945 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.76953 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.76953 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.44336 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.11719 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.11719 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.79102 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.45703 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.12305 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.78906 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.78906 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.45703 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.12305 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.78906 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.46289 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.46289 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.79688 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.4707 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.14453 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.47852 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.15234 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.82617 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.49414 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.82812 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.50195 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.50195 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.16797 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.50195 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.50195 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.50195 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.17578 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.17578 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.8418 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.51562 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.51562 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.18945 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.19727 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.87109 -234.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 5.33203 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.34375 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.67773 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.35156 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.34766 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.02148 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.71094 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.38477 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.05859 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.38867 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.0625 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.73633 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.41016 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.08398 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.75 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75781 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.43164 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.10547 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.10547 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.43945 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.43555 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10938 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77734 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.45117 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.125 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 203.45508 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.12109 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.79492 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.79492 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 225.46875 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.14258 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.47656 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.15039 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.48438 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.1582 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.82422 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.82031 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.49414 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.16797 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.8418 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.51562 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.18945 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.18945 -249.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 11.33203 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.00586 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.01367 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.02148 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.69531 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.03711 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37109 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.04492 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.04492 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.71094 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.04492 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.04492 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.04492 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.71875 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.71875 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.38477 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.05859 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.05859 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.73242 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.74023 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.41406 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.42188 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.08789 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.75391 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.08789 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.76172 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.75781 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.76562 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.09961 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.77344 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.76953 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.44336 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.11719 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79102 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.46484 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.13281 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80664 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.48047 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.81055 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.81055 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.48438 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.1582 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.83203 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.50586 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.17188 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.17969 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85352 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.52734 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.52734 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.86133 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.85742 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.53125 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.19922 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.87305 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.54688 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.87695 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.54297 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.2168 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.2168 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.89062 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.56445 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.89844 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.57227 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.90625 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.58008 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.24609 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.24219 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.91602 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.58984 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.26367 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.9375 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.61133 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 475.61133 -279.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.66602 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 27.33984 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.33984 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.00586 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.01367 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.67969 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.35352 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.35352 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.6875 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.69531 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.36523 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.03906 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37305 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04102 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72266 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.72266 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.39648 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07031 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.07031 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.74414 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.41016 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.07617 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.74219 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.07617 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.75 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.42383 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.09766 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.77148 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.44531 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.11328 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.7793 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45312 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.12695 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.80078 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.13477 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.80859 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 265.47656 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.15039 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.82422 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.49023 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49805 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.83203 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.50586 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.17188 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.83789 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.51172 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.51172 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17969 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.85352 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 339.52148 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.19531 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.86914 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.86523 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.19922 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.20703 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.88086 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.55469 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.22852 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.90234 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.57617 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.24414 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.58594 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.25977 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.25977 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.59375 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.25977 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.93359 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.60742 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.27344 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.94727 -294.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.68164 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.68164 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.35547 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.68555 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.35938 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.0332 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.36719 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.04102 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.70703 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.70703 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.70703 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.04102 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.71484 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.38867 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.38867 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.05469 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.72852 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.40234 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73633 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.41016 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08398 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75781 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.43164 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.42773 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.10156 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.09766 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76367 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.43164 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.10547 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.7793 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.44531 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.7793 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45312 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.12109 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.79492 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.46094 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.13477 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13086 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.79883 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.13281 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.80664 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.14062 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.81445 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 295.48828 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.16211 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.49219 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.49219 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.16602 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.83984 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.51367 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.17969 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.17578 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.84961 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.52344 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.85742 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.53125 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.86133 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.53516 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.20898 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.875 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.88281 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.2168 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.21289 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.87891 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.55273 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.22656 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.89258 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.55859 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.22461 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.23242 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.90625 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 461.57227 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.24609 -309.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67969 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.35352 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.36133 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.03516 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.03516 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.70898 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.38281 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.39062 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.39062 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.06445 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.73828 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.41211 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.08594 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.75977 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.42773 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.42383 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.09766 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.77148 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.77148 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.44531 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.11914 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.79297 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.12695 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.80078 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.13477 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.80859 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.80469 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.80469 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.80469 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.47852 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.15234 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.81836 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.49219 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.82617 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.49414 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.49805 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.49414 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.16797 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.8418 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.8418 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.51562 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.18945 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.85742 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.53125 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.20508 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.87891 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.20898 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.88281 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.55664 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.23047 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.22656 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.89453 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.56836 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.24219 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.91602 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.91602 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.25 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.92383 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.25781 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.93164 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.93945 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.93945 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.61328 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.60938 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.60938 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.2832 -324.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.36133 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.03516 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.03516 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.70312 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.03711 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.71094 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.38477 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.05859 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.72461 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.39844 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.06641 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.06641 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.73242 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.06641 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.74023 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.74805 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.42188 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.0957 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.76953 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.44336 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.11719 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.78516 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.45117 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.44727 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.12109 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.45508 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.12891 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.80273 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.13672 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.81055 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.47656 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.15039 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.1582 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.16602 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.83203 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.50586 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.51367 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.51367 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.17969 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.17969 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.85352 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.84961 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.8457 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.85352 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.52734 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.19336 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.85938 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.5332 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.20703 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.88086 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.54883 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.22266 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.89648 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.9043 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 371.57812 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.24609 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.91992 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.59375 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.25977 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.93359 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.60156 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.60547 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.2793 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.28711 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.95312 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.96094 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.63477 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.63477 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.30273 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.30273 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.97656 -339.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.6875 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 47.36133 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.35742 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.02344 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.02344 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37109 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.37891 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.05273 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.72656 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.39258 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.39258 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.05859 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.73242 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.40625 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.74023 -354.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.66211 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.66992 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.67383 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.67383 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.00781 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.68164 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.67773 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 75.35156 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.01758 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.01758 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.68555 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.01953 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.69336 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.02734 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.70117 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.375 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.04883 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.37891 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.05273 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.7207 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.38672 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.05273 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.72656 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.40039 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.39648 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.4043 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.07031 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.74414 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.74023 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.41406 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.41016 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.07812 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.41211 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.41992 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.75391 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.42773 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.42383 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.09766 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.76367 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.09766 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.76367 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.4375 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 273.43359 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.10742 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.10352 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.77148 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.44531 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.11133 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.44531 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.44141 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.10742 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.10742 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.77344 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.44727 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.78125 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.45508 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.12305 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.45703 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.12305 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.79688 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.79688 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.46289 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.13672 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.81055 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.48438 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.15234 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.82617 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 415.5 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.17383 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.8418 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.8418 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 441.51562 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.18945 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.18945 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.86328 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 463.5293 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.19531 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 468.86133 -384.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 25.34766 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.36133 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.35742 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36328 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\010) +[8.016 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.04102 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.71484 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38867 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0625 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.07031 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.74414 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.41797 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.08398 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.08398 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.75 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.42383 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.09766 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.42773 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.10156 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.09766 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.77148 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 171.43945 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.11328 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.78711 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.46094 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.12891 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.80273 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.47656 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.14258 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.47266 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.14648 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.14258 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.81641 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.81641 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 253.48242 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.15625 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.16406 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.83789 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.50586 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.83984 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.83594 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.50195 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.17578 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.84961 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 309.51562 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.18164 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.84766 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.85547 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.5293 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.20312 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.87695 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.55078 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.55859 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.22461 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.89844 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.57227 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.24609 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.24219 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.57617 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.24219 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.24219 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.91016 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.91406 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.58789 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.25391 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.91992 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.59375 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.26758 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.60156 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.27539 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.27539 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.94922 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.62305 -399.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.36914 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.03711 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.0332 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.70703 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.70312 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37695 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37695 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.71094 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.70703 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.37305 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.37305 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.70703 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.37305 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.04688 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.7207 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.72852 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.72852 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.40234 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07617 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.75 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.75 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08398 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.75781 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.0918 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.76562 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.43359 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.10742 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.78125 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.11523 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.78906 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.12305 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.79688 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 235.46484 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.46094 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.13477 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.80078 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.47461 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.47461 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14844 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.82227 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 287.49609 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 297.50391 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.83789 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.51172 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.50781 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.18164 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.51562 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.18945 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.52344 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.85742 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.53125 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.52734 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.20117 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.86719 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.20117 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.875 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 395.54883 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.22266 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 408.22266 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.55664 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.23047 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.23047 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.89844 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.23242 -414.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.67383 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 21.33984 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.01367 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 34.6875 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 41.36133 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.0293 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.69531 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36914 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 63.36914 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37695 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.05078 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.38477 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.05859 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.72461 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.72461 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.72461 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.39844 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.07227 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.74609 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.74609 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.08008 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.75391 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.08789 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.76172 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.43555 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.43555 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.76953 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.44336 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.77344 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.77344 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.44727 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.45508 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12891 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.46289 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.13672 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.81055 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.48438 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.48047 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.14844 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.81445 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.48828 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.1543 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.82031 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.49414 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.82422 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.49023 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.49805 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.17188 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.83789 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 343.51172 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.18555 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.85156 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.85156 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.85156 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.51758 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.84766 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.51367 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.1875 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.1875 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.52148 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.19531 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.19531 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.86328 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 427.5293 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.20312 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.86914 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.53516 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.54297 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.20898 -429.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.34766 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02148 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.6875 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.6875 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35352 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.02148 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.6875 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.36133 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.03516 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 87.36914 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.36914 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.03516 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.70312 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.37695 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.37305 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.04688 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.71484 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.38086 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.04688 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.7207 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 151.39453 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.39062 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.39844 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.06445 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.73828 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.41211 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.08008 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.08008 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.74609 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.08008 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.75391 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76172 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.76172 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.43555 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.10938 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.10938 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.7832 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.45703 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.13086 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.80469 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.47266 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.13867 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.8125 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.8125 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.14648 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.82031 -444.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 18.00586 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.67188 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.67969 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.67969 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.35352 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 53.34961 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.02344 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.02734 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.36133 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.03516 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.03125 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.36523 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.03906 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.36914 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.04297 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.71094 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 124.71094 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 131.38477 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.71484 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.04883 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.04492 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.71094 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 161.38477 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.05859 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.72461 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.39062 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.05664 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.06445 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.73828 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41211 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.08594 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.08594 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.41992 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.09375 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.09375 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.76172 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.75781 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 251.43164 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.10547 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.10547 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.7793 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 277.45312 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.12695 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.46094 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.13477 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 306.80859 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 313.48242 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.48242 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.81641 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.49023 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.82422 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.82422 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.49805 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.17188 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.83789 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.51172 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.51953 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 383.51953 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.18555 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.85352 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.52734 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.52344 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.19727 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.86523 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.86133 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.53516 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.20898 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.20508 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.87109 -474.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 29.36133 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02734 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36914 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.37695 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.04297 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.7168 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.7168 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.38281 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.05664 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.72266 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.73047 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.4043 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.07812 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 108.74414 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.41016 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.41797 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.41797 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.0918 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 138.08789 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.75391 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 147.42773 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.42773 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.0957 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.09961 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.77344 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.44727 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 187.44727 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.12109 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.78711 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.45312 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.12695 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.46094 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.13477 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.80078 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.13477 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.13086 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.79688 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.79688 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.46289 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.13672 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.4707 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.14453 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.81836 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 275.48438 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.15039 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.82422 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49805 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.83203 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.50586 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.50586 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.17969 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.85352 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.86133 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.53516 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.53125 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 347.53125 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.53125 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.53125 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.20508 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.20508 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.87891 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 385.55273 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.55273 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.88672 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 401.56055 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.89453 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.5625 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.34961 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.01562 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.01562 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.68945 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.68555 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.35938 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.69336 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 467.36719 -489.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.70312 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.37695 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.05078 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.72461 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.7207 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.38867 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 80.0625 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.73047 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 89.39648 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 96.07031 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 102.74414 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.74023 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.41406 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.08789 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.75586 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 133.42969 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.10352 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.76953 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.44336 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.77734 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.44531 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.11133 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.78516 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.11523 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.11523 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.78906 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.78516 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 217.45898 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.13281 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.46289 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.79688 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 237.46289 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 244.13672 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.13672 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.80273 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.47656 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.15039 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.82422 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.49219 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.49219 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.16602 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.16211 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.83008 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.49609 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 321.50391 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 328.17773 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.85156 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 337.51758 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.19141 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.85742 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.85742 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.85742 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.52344 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.19727 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.20508 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.87891 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 391.55273 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.21875 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396.88477 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.89258 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.88867 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.5625 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.22852 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.90234 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.90234 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 445.57617 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 452.25 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.92383 -504.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00781 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00391 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35156 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.34766 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01367 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.34766 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.02148 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.69531 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.36914 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.03711 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.0332 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.70703 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 111.38086 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 115.37695 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.04297 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.37695 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.05078 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.05859 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.05469 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.05469 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.72852 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.39453 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.72852 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.72461 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.39062 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.39062 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.06445 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.39844 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.73242 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.72852 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.39453 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.06836 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.74219 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 227.4082 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.07422 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.74023 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 239.41406 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.08203 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.74805 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.42188 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.0957 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.76953 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.10352 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 290.77734 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.77344 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.44727 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.45508 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.12891 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.80273 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.47656 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.15039 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 344.82422 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.49219 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 357.49219 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 364.16602 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.16602 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.5 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.16602 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.83984 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.51367 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.17969 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.85352 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.18359 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.85742 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 425.52539 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.19922 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.19531 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.86914 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.86914 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 451.53516 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 458.20898 -519.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.01562 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68945 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.68555 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.35938 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.69336 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.35938 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.0332 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 69.36328 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.03711 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 86.04492 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.71875 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.39258 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.06641 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.74023 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.41406 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.08203 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.07812 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75195 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.42578 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.42188 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08789 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 165.42188 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\033) +[3.756 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.75586 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 175.42969 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.10352 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.10352 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.76953 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 197.44336 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.11719 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 213.45117 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.125 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.79883 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.47266 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.14648 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.1543 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.82031 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.82812 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.50195 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.17578 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.84961 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.18359 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.85742 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.53125 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 312.20508 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.20117 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.875 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.20898 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 330.20508 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.21289 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.88672 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.55273 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.22656 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.22266 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.89648 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.57031 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.9043 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 389.57812 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 399.57422 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.24219 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 414.9082 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.58203 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.25586 -534.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.01367 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 28.6875 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.02148 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.69531 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.0293 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.03711 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.71094 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.04297 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.70898 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70898 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70898 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 91.38281 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.05664 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.72266 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73047 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.4043 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07031 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.74414 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.75195 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 139.41797 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.42578 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.09961 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.77344 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 166.76953 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.10352 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 173.4375 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10352 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.4375 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.11133 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.44531 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.11328 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\024) +[7.704 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 204.7793 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.44727 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.11328 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 220.78711 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.78711 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.12109 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.79492 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.12891 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.79492 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 255.46875 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 262.14258 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 268.81055 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.81055 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 281.48438 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.1582 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.83203 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 301.50586 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.51367 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 318.1875 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.86133 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.52734 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.86133 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.86133 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.53516 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.53516 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.86914 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.53516 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 368.20898 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 374.88281 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.54883 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.22266 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.55273 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 403.55273 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.22656 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.90039 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.90039 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 429.57422 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.24023 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.90625 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.57227 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.57227 -549.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.6875 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68359 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01758 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.01758 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.37305 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.03906 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 70.70508 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 77.37891 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.05273 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.72266 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39062 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 109.39453 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 113.39062 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.06445 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.73047 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.73828 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.4043 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.07812 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.07812 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.74414 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.41797 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.08398 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.0918 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.75781 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 179.43164 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.43945 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.10547 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.11328 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.78711 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 215.46094 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.13477 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.80859 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.81641 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.49023 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.16406 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.83008 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.49609 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.16992 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.84375 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.17773 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.85156 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.85156 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 293.52539 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.19922 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.20703 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.20312 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.87695 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 327.55078 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 334.22461 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.22461 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 346.89844 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.89844 -564.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33984 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.68359 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34961 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.68359 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.35742 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.6875 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.6875 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.70898 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.375 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.04883 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 97.38281 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05664 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.72266 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.05664 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05273 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.71875 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.71875 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 125.38477 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 132.05859 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.39258 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.06641 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 154.74023 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.40625 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 167.40234 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.07031 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.73633 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.74414 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 189.41016 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 196.08398 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41797 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.0918 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.08789 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.76172 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.43555 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.76562 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 243.43945 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.11328 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.78711 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.12109 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.79492 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.46875 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.14258 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.81641 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.8125 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.48633 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.48242 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.14844 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.81641 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.48242 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.15625 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.82422 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 341.49023 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.16406 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 350.83008 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 353.49609 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.16992 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.5 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.17383 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.8418 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 393.51562 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.18945 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.18945 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 409.52344 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 416.19727 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.52734 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.52344 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.19727 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 446.87109 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.86719 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.5332 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.5332 -594.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.00391 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 14.67773 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.68555 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 31.35938 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.02734 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.02344 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69727 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69727 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 66.69727 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.70508 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.37891 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.04688 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.38086 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.05469 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 104.05078 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.38477 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 121.38867 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.38867 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.0625 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.73633 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.40234 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.40234 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.07617 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.74219 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.75 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 172.08398 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 178.75781 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.75391 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 195.42773 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.10156 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.43555 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.10938 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.11719 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.79102 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.45898 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 247.45898 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.13281 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 260.80664 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.47266 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 270.14648 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.82031 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 283.48828 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49219 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.16602 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.17383 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.83984 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 317.51367 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 323.51367 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17969 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.85352 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 335.51953 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.19336 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.86133 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.85742 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.53125 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.20508 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 376.20117 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.86719 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.20117 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.875 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.88281 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.88281 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.55664 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 424.23047 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.23047 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.9043 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.57031 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 442.23633 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.90234 -609.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 12.67383 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.34766 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.02148 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.36914 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.70312 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.36914 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 51.36914 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.03711 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.70312 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37695 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 73.37695 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.71094 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 83.38477 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.71875 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.39258 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.06641 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.74023 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.07422 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.07422 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 134.74805 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 141.42188 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.08789 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.76172 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 159.42773 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.43555 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.10938 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.10938 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.44336 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.11133 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 198.78516 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.45312 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.12695 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 218.80078 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.79688 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.13086 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.13867 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 238.80469 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.4707 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.14453 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.81836 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.48438 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 267.49219 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 274.16602 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.16211 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.83594 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.16992 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.84375 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.51758 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.18359 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.51758 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.51367 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.1875 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.86133 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.53516 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 356.20898 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 362.87695 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\025) +[7.908 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.66406 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 373.33008 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 379.33008 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.00391 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 396 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 402.67383 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 412.00781 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 422.00391 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.67773 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.01172 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 435.3457 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 438.01172 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.01172 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.67969 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 453.3457 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.01953 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.01953 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.69336 -624.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 8.66602 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 15.33398 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 22.00781 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00391 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.67773 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 45.3457 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 52.01953 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 58.69336 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36719 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.0332 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 74.70703 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 81.38086 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.71484 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.38086 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.05469 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 103.38867 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.0625 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.73242 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40625 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.40234 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 144.07031 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.73633 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 153.41016 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 157.40625 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 164.08008 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.41016 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 184.08398 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 190.75781 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.42383 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.75391 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.75391 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 219.42773 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.42383 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 226.08984 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 232.76367 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.09766 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.43164 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.10547 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.10156 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.43555 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.10938 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 269.44336 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.11133 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.78516 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.79297 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.79297 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 305.4668 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 315.46289 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 325.45898 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 332.13281 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.80664 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.81445 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 351.48047 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 354.14648 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 360.82031 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 367.49414 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.16016 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 380.16797 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 386.8418 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 390.83789 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 397.51172 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 406.8457 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\035) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.51953 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.19336 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.86719 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 433.54102 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.53711 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.21094 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 448.20703 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.87305 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.54102 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.21484 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.88867 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 474.22266 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 480.89648 -639.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\015) +[2.256 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 3.33398 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 10.00781 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.3418 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.01562 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68945 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.36328 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.69336 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 50.68945 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 57.36328 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 60.69727 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 67.37109 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 76.70508 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 79.37109 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.03711 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 88.71094 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 95.38477 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 99.38086 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.05469 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.72266 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 119.39648 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 122.0625 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 128.73633 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.41016 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.08398 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 148.75781 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 155.43164 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.76172 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.76172 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 181.43555 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 188.10938 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.7832 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.45703 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.13086 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 211.46484 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.13086 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.46484 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.46484 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.13867 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.8125 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 249.48633 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 256.16016 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.16797 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.8418 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 279.50977 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.18359 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 288.84961 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.51562 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.18945 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 308.18555 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.18555 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.85938 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 324.85547 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 331.5293 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 338.20312 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 345.5332 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.20703 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.88086 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 361.54688 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.88086 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 377.55469 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 384.22852 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.5625 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.23633 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 400.9043 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\017) +[9.084 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.90039 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.57422 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 421.57031 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.24414 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.24414 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.91797 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.5918 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.26562 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.93945 -654.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 17.34375 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 24.01758 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.01758 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 36.68555 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 43.35938 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.02539 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.69141 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.36523 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.03906 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.71289 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 82.04297 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70898 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.7168 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.39062 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 105.38672 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 112.06055 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 118.06055 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.72656 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 127.40039 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 137.4082 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 143.4082 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.07422 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 149.4082 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.08203 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 162.75586 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 169.42383 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.09766 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.77148 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 185.4375 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 191.4375 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.10352 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.77734 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 207.45117 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 214.78125 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 221.45508 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 228.12305 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.78906 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 233.45508 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 240.12891 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.80273 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 250.79883 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 257.47266 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.14062 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\023) +[7.38 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.14453 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.81836 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 284.81836 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 291.49219 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 298.16602 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 304.83984 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 311.51367 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 314.17969 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 320.17969 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.17969 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.1875 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.86133 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 349.53516 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 352.86914 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 359.54297 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 366.2168 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 369.55078 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.2168 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 378.88477 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\011) +[8.196 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 387.55078 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 394.22461 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 407.55469 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413.55469 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 420.22852 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.22852 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.89453 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 431.56055 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 440.89453 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 447.56836 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 454.24219 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.57617 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 464.25 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 470.92383 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 477.59766 -669.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 6.67383 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 13.34766 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.02148 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.69531 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 30.0293 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.69531 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 39.36914 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 46.04297 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 55.37695 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 62.05078 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 68.71875 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.71484 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 85.38867 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 92.0625 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 98.73633 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 101.40234 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 110.73633 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 117.41016 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.07617 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 129.41016 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.08398 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.75781 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.75391 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 150.08789 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.76172 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 160.75781 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.42383 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.09766 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 176.77148 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 183.43945 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.43555 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 200.10938 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 206.7832 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 210.11719 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.79102 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.79102 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 229.45898 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.13281 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 242.80664 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 248.80664 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 254.80664 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 261.48047 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 264.81445 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 271.48828 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.81836 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 282.81445 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.48047 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 292.1543 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 294.82031 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 300.82031 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 307.49414 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.16016 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 316.83398 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 326.16797 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 336.16406 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.83789 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.83789 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.50586 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\021) +[7.488 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 363.50977 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 370.18359 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 372.84961 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.51562 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.18945 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.86328 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 392.19727 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.87109 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.87109 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 411.54492 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 418.21875 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 428.22656 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\027) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 434.90039 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 437.56641 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 444.24023 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.91406 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 457.58789 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 460.25391 -684.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.99609 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.66992 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 19.33594 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.00977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 32.00977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 35.34375 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 38.00977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 48.01758 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 54.69141 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 61.36523 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 65.36133 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 72.03516 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 78.03516 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70312 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 94.71094 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.71094 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 107.38477 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\034) +[5.868 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 114.05859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.72461 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 120.05859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.39258 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 126.05859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 135.39258 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 142.06641 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.0625 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 152.0625 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 158.0625 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 168.05859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.73242 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 177.39844 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.06445 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 182.73047 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 192.06445 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 194.73047 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 201.4043 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 208.07227 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\012) +[8.028 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 216.73828 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 223.41211 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 230.08594 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 236.75977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 246.09375 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.76758 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 259.44141 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 263.4375 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 266.77148 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 276.7793 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 280.11328 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 286.78711 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.7832 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 303.45703 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 310.13086 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 319.46484 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 322.79883 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 329.47266 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 333.46875 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 340.14258 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 342.80859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 348.80859 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 355.47656 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 358.81055 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 365.48438 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 375.48047 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 382.1543 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 388.82812 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 398.16211 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 404.16211 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 410.83594 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 417.50977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 423.50977 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 430.18359 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(%) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 436.85742 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 443.53125 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 450.20508 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 456.87305 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\037) +[1.836 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 459.53906 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 466.21289 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 472.21289 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 475.54688 -699.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +( ) +[1.824 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 2.66602 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 9.33984 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 16.01367 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 20.00977 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 26.68359 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 33.35742 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 40.02539 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 42.69141 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 49.36523 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 56.0332 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\020) +[7.68 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 64.69922 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 71.37305 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 84.70312 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 90.70312 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 93.36914 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 100.03711 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 106.71094 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 116.70703 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 123.38086 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 130.04883 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 136.72266 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 140.71875 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 146.71875 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 156.72656 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 163.40039 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 170.07422 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 174.07031 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 180.74414 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 186.74414 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\000) +[2.268 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 193.41211 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(*) +[5.856 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 199.41211 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 202.07812 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 205.41211 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 212.08594 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 222.09375 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\036) +[1.848 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 224.75977 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 231.43359 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 234.76758 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 241.44141 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 245.4375 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 252.11133 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 258.78516 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 272.11523 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +($) +[6.192 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 278.78906 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 285.46289 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(&) +[4.164 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 289.45898 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 296.13281 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(') +[5.532 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 302.13281 -714.74219] Tm +0 0 Td +/F82_0 12 Tf +(\002) +[2.292 +0] Tj +Q +Q +q +667.28 967.28 490 262.5 re +W* +q +q +[1 0 0 1 0 0] cm +0 0 595.28 841.89 re +W +Q +Q +Q +q +1 w +[] 0 d +0 J +0 j +[1 0 0 1 36 53.67] cm +q +[1 0 0 1 0 0] Tm +0 0 Td +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 0 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\006) +[6.096 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 413 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\031) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 419.67383 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(#) +[6.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 426.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\030) +[5.892 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 432.34766 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\)) +[5.808 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 439.02148 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(!) +[9.228 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 449.01758 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\032) +[6.18 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 455.69141 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(") +[5.844 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 462.36523 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\() +[3.252 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 465.69922 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\001) +[3.624 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 469.69531 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\026) +[6.168 +0] Tj +/DeviceRGB {} CS +[0.0863 0.0784 0.0745] SC +/DeviceRGB {} cs +[0.0863 0.0784 0.0745] sc +0 Tr +[1 0 0 1 476.36914 -9.625] Tm +0 0 Td +/F82_0 12 Tf +(\006) +[6.096 +0] Tj +Q +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%+ font T3_35_0 +%%+ font T3_82_0 +%%EOF diff --git a/test/document-a4.sla b/test/document-a4.sla new file mode 100644 index 0000000..95d518f --- /dev/null +++ b/test/document-a4.sla @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +

      CUPS 1.5 Software Test Report

      + +

      This software test report provides detailed test results that +are used to evaluate the stability and compliance of CUPS Version 1.5. + +

      Document Overview

      + +

      This software test plan is organized into the following sections: + +

        +
      • 1 - IPP Compliance Tests
      • +
      • 2 - Command Tests
      • +
      • 3 - Log Files
      • +
      diff --git a/test/str-trailer.html b/test/str-trailer.html new file mode 100644 index 0000000..e04310f --- /dev/null +++ b/test/str-trailer.html @@ -0,0 +1,2 @@ + + diff --git a/test/testfile.jpg b/test/testfile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..418cb93597c7a3cb5a425fffaf2250373663b3ae GIT binary patch literal 204156 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℘wb>J&5Lqp0)Q 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

    1. 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°_(e8^L2Q{Z>ADA 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

      wWye`8r@i@>*DpQ&^?~=vD0h+TC|I+^k$Xc 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 literal 0 HcmV?d00001 diff --git a/test/testfile.ps b/test/testfile.ps new file mode 100644 index 0000000..d02503a --- /dev/null +++ b/test/testfile.ps @@ -0,0 +1,598 @@ +%!PS-Adobe-3.0 +%%BoundingBox: 0 0 612 792 +%%Pages: 1 +%%LanguageLevel: 1 +%%DocumentData: Clean7Bit +%%DocumentSuppliedResources: procset testprint/1.3 +%%DocumentNeededResources: font Helvetica Helvetica-Bold Times-Roman +%%Creator: Michael Sweet, Apple Inc. +%%CreationDate: D:20070606214000+0500 +%%Title: Test Page +%%EndComments +%%BeginProlog +%%BeginResource procset testprint 1.3 0 +% +% PostScript test page for CUPS. +% +% Copyright 2007-2011 Apple Inc. +% Copyright 1993-2007 Easy Software Products +% +% These coded instructions, statements, and computer programs are the +% property of Apple Inc. and are protected by Federal copyright law. +% Distribution and use rights are outlined in the file "LICENSE.txt" +% which is included with the CUPS source distribution. +% +/SEXTANT { % Draw a color wheel sextant... + % (name) white radius r g b SEXTANT - + % Loop through 100 shades... + 0 0.010101 0.98 { + % Set the color... + dup 0.75 le { % Get "white" value + % Start from black + dup 0.75 div % val2 = val / 0.75 + + 0 index 5 index mul % R = R * val2 + 1 index 5 index mul % G = G * val2 + 2 index 5 index mul % B = B * val2 + + 4 -1 roll pop % Discard val2 + } { + % Fade to white + dup neg 1 add 4 mul % val2 = (1 - val) * 4 + + 0 index 5 index mul % R = R * val2 + 1 index neg 1 add add % + (1 - val2) + 1 index 5 index mul % G = G * val2 + 2 index neg 1 add add % + (1 - val2) + 2 index 5 index mul % B = B * val2 + 3 index neg 1 add add % + (1 - val2) + + 4 -1 roll pop % Discard val2 + } ifelse + setrgbcolor % Set the color... + + % Draw the polygon... + newpath % Start a new path... + dup 5 index mul % r1 = radius * val + 0 0 3 -1 roll 0 60 arc % Draw the inner arc + + dup 0.010101 add 5 index mul% r2 = (radius + 0.010101) * val + 0 0 3 -1 roll 60 0 arcn % Draw the outer arc + + closepath % Close the path + fill % Fill it... + + pop % Pop value... + } for + + % Draw a line around the polygons... + pop pop pop dup % Pop R, G, B, start + 0 setgray % Black + newpath + 0 0 moveto % Center + 0 0 3 -1 roll 0 60 arc % Arc around octant + closepath % Back to center + stroke % Stroke it... + + % Draw the label... + dup % Save radius + dup 30 cos mul % X = radius * cos(30) + exch 30 sin mul % Y = radius * sin(30) + moveto % Position label + + gsave + 30 rotate % Rotate label + dup 0.05 mul % Offset to the right + exch -0.05 mul % and down... + rmoveto % Offset label + show % Show label + grestore +} bind def +/CENTER { % Draw centered text + % (name) CENTER - + dup stringwidth pop % Get the width of the string + 0.5 mul neg 0 rmoveto % Shift left 1/2 of the distance + show % Show the string +} bind def +/RIGHT { % Draw right-justified text + % (name) RIGHT - + dup stringwidth pop % Get the width of the string + neg 0 rmoveto % Shift left the entire distance + show % Show the string +} bind def +/NUMBER { % Draw a number + % power n NUMBER - + 1 index 1 eq { % power == 1? + round cvi exch pop % Convert "n" to integer + } { + 1 index mul round exch div % Truncate extra decimal places + } ifelse + 100 string cvs show % Convert to a string and show it... +} bind def +/CUPSLOGO { % Draw the CUPS logo + % height CUPSLOGO + % Start with a big C... + /Helvetica findfont 1 index scalefont setfont + 0 setgray + 0 0 moveto + (C) show + + % Then "UNIX Printing System" much smaller... + /Helvetica-Bold findfont 1 index 9 div scalefont setfont + 0.25 mul + dup dup 2.0 mul moveto + (UNIX) show + dup dup 1.6 mul moveto + (Printing) show + dup 1.2 mul moveto + (System) show +} bind def +%%EndResource +%%EndProlog +%%Page: 1 1 +gsave + + % Determine the imageable area and device resolution... + initclip newpath clippath pathbbox % Get bounding rectangle + 72 div /pageTop exch def % Get top margin in inches + 72 div /pageRight exch def % Get right margin in inches + 72 div /pageBottom exch def % Get bottom margin in inches + 72 div /pageLeft exch def % Get left margin in inches + + 4 setlinewidth % Draw wide lines + 0 setgray closepath stroke % Draw a clipping rectangle + + /pageWidth pageRight pageLeft sub def % pageWidth = pageRight - pageLeft + /pageHeight pageTop pageBottom sub def% pageHeight = pageTop - pageBottom + + 72 72 dtransform % Get device resolution per inch + /yResolution exch abs def % yResolution = abs(yres) + /xResolution exch abs def % xResolution = abs(xres) + + % Figure out the sizes of things... + /wheelSize % size of wheels + pageWidth pageHeight lt + { pageWidth 9 mul } + { pageHeight 7 mul } + ifelse def + + % Create fonts... + /bigFont /Helvetica-Bold findfont % bigFont = Helvetica-Bold + pageHeight 3 mul scalefont def % size = pageHeight * 3 (nominally 33) + + /mediumFont /Helvetica findfont % mediumFont = Helvetica + pageHeight 1.5 mul scalefont def % size = pageHeight * 1.5 (nominally 16.5) + + /smallFont /Times-Roman findfont % smallFont = Times-Roman + pageHeight scalefont def % size = pageHeight (nominally 11) + + % Draw rulers along the edges... + /CENTIMETER 72 2.54 div def + /MILLIMETER 72 25.4 div def + + /Times-Roman findfont % Font for ruler numbers + 11 scalefont setfont % 11 points + + gsave % Left side inches + pageLeft 72 mul 0 translate % Offset left edge + + 1 setlinewidth % Draw normal lines + 72 72 pageTop 72 mul { % Height inches + dup dup + 0 exch moveto 24 0 rlineto stroke % Draw tic mark + 24 exch pageHeight sub moveto % Draw number + 72 div cvi 10 string cvs RIGHT + } for + + 0.5 setlinewidth % Draw thin lines + 18 18 pageTop 72 mul { % 1/4 inches + 0 exch moveto 15 0 rlineto stroke % Draw tic mark + } for + + 9 9 pageTop 72 mul { % 1/8 inches + 0 exch moveto 6 0 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Bottom inches + 0 pageBottom 72 mul translate % Offset bottom edge + + 1 setlinewidth % Draw normal lines + 72 72 pageRight 72 mul { % Width inches + dup dup + 0 moveto 0 24 rlineto stroke % Draw tic mark + 3 add 27 pageHeight sub moveto % Draw number + 72 div cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 18 18 pageRight 72 mul { % 1/4 inches + 0 moveto 0 15 rlineto stroke % Draw tic mark + } for + + 9 9 pageRight 72 mul { % 1/8 inches + 0 moveto 0 6 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Right side centimeters + pageRight 72 mul 0 translate % Offset right edge + + 1 setlinewidth % Draw normal lines + CENTIMETER CENTIMETER + pageTop 72 mul { % Height centimeters + 0 exch moveto -24 0 rlineto stroke% Draw tic mark + } for + 1 1 pageTop 2.54 mul { % Height labels + dup + -24 exch CENTIMETER mul + pageHeight sub moveto % Draw number + cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 0 0.5 CENTIMETER mul + pageTop 72 mul { % 1/2 centimeters + 0 exch moveto -15 0 rlineto stroke% Draw tic mark + } for + 0 MILLIMETER pageTop 72 mul { % Millimeters + 0 exch moveto -6 0 rlineto stroke % Draw tic mark + } for + grestore + + gsave % Top centimeters + 0 pageTop 72 mul translate % Offset top edge + + 1 setlinewidth % Draw normal lines + CENTIMETER CENTIMETER + pageRight 72 mul { % Width centimeters + 0 moveto 0 -24 rlineto stroke % Draw tic mark + } for + 1 1 pageRight 2.54 mul { % Width labels + dup + CENTIMETER mul 3 add -24 moveto % Draw number + cvi 10 string cvs show + } for + + 0.5 setlinewidth % Draw thin lines + 0 0.5 CENTIMETER mul + pageRight 72 mul { % 1/2 centimeters + 0 moveto 0 -15 rlineto stroke % Draw tic mark + } for + 0 MILLIMETER pageRight 72 mul { % Millimeters + 0 moveto 0 -6 rlineto stroke % Draw tic mark + } for + grestore + + % Offset page to account for lower-left margin... + pageLeft 72 mul + pageBottom 72 mul + translate + + % Set text font and color... + mediumFont setfont % Font + 0 setgray % Color + 1 setlinewidth % Draw normal lines + + % Draw the color wheel... + gsave + % Position the wheel on the left side... + pageWidth 18 mul % x = pageWidth * 1/4 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + translate + + % Size the wheel... + wheelSize + + % Draw the colors... + dup (C) 3 -1 roll 0 1 1 SEXTANT 60 rotate + dup (M) 3 -1 roll 1 0 1 SEXTANT 60 rotate + dup (Y) 3 -1 roll 1 1 0 SEXTANT 60 rotate + dup (R) 3 -1 roll 1 0 0 SEXTANT 60 rotate + dup (G) 3 -1 roll 0 1 0 SEXTANT 60 rotate + dup (B) 3 -1 roll 0 0 1 SEXTANT 60 rotate + + pop + grestore + + % Label the color wheel... + pageWidth 18 mul % x = pageWidth * 1/4 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (Color Wheel) CENTER % Show the text centered + + % Draw the gray ramp... + gsave + % Position the gray ramp in the center... + pageWidth 36 mul % x = pageWidth * 1/2 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + wheelSize sub % - wheelSize + translate + + % Loop through 100 shades... + 0 0.010101 0.98 { + % Set the color... + dup setgray % Set the grayscale... + + % Draw the polygon... + newpath % Start a new path... + + wheelSize -0.2 mul % X = -wheelSize / 5 + 1 index 2 mul wheelSize mul % Y = val * 2 * wheelSize + moveto % Move there... + + wheelSize 0.4 mul 0 rlineto % Right side... + + wheelSize 0.2 mul % X = wheelSize / 5 + 1 index 0.010101 add 2 mul wheelSize mul + % Y = (val + 0.010101) * 2 * wheelSize + lineto % Move there... + + wheelSize -0.4 mul 0 rlineto % Left side... + + closepath % Close the path + fill % Fill it... + + pop % Pop value... + } for + + 0 setgray % Black + + newpath % Start a new path + wheelSize -0.2 mul 0 moveto % Bottom left + wheelSize 0.4 mul 0 rlineto % Bottom right + 0 wheelSize 2 mul rlineto % Upper right + wheelSize -0.4 mul 0 rlineto % Upper left + closepath % Close the path + stroke % Stroke it... + + 0 wheelSize -0.2 mul moveto % Center bottom for label + (K) CENTER % Center K at bottom + + 0 wheelSize 2.05 mul moveto % Center top for label + (W) CENTER % Center W at top + grestore + + % Label the gray ramp... + pageWidth 36 mul % x = pageWidth * 1/2 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (Gray Ramp) CENTER % Show the text centered + + + % Draw radial lines... + gsave + 0 setlinewidth % 1 pixel lines + + % Position the lines on the left side... + pageWidth 54 mul % x = pageWidth * 3/4 * 72 + pageHeight 54 mul % y = pageHeight * 3/4 * 72 + translate + + % Size the wheel... + wheelSize + + % Loop at 1 degree increments + 0 1 359 { + pop % Discard angle - not used + 0 0 moveto % Start line at the center + dup 0 lineto % Draw to the radius + 1 rotate % Rotate 1 degree + } for + + pop % Discard radius - not needed anymore + stroke % Draw lines... + + grestore + + % Label the lines... + pageWidth 54 mul % x = pageWidth * 3/4 * 72 + pageHeight 43 mul % y = pageHeight * 19/32 * 72 + moveto % Position the text + (1 Degree Radial Lines) CENTER % Show the text centered + + % Imageable area... + pageHeight 15 mul % Height of imageable area + + pageWidth 4.5 mul % x = pageWidth * 1/16 * 72 + pageHeight 35.5 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 1/4 * 72 + 3 index % height + 0.5 setgray rectfill % Draw a shadow + + pageWidth 4 mul % x = pageWidth * 1/16 * 72 + pageHeight 36 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 3/8 * 72 + 3 index % height + 4 copy 1 setgray rectfill % Clear the box to white + 0 setgray rectstroke % Draw a black box around it... + + pop % Discard height + + % Label the imageable area... + pageWidth 4 mul % x = pageWidth * 1/16 * 72 + pageHeight 37 mul % y = pageHeight * 1/2 * 72 + moveto % Position the text + mediumFont setfont % Font + (Imageable Area) show % Show the text + + smallFont setfont % Font + pageWidth 14 mul % x = pageWidth * 3/16 * 72 + pageHeight 36 mul % y = pageWidth * 1/2 * 72 + pageHeight -2 mul add % y -= 2 * smallFont height + + % Page Size inches + 2 copy moveto % Move to x & y + (Page Size: ) RIGHT % Label + 100 pageWidth NUMBER % pageWidth + (x) show % "x" + 100 pageHeight NUMBER % pageHeight + (in) show % "in" + + % Page Size millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageWidth 25.4 mul NUMBER % pageWidth + (x) show % "x" + 10 pageHeight 25.4 mul NUMBER % pageHeight + (mm) show % "mm" + + % Lower-left inches + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Lower-Left: ) RIGHT % Label + 100 pageLeft NUMBER % pageLeft + (x) show % "x" + 100 pageBottom NUMBER % pageBottom + (in) show % "in" + + % Lower-left millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageLeft 25.4 mul NUMBER % pageLeft + (x) show % "x" + 10 pageBottom 25.4 mul NUMBER % pageBottom + (mm) show % "mm" + + % Upper-right inches + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Upper-Right: ) RIGHT % Label + 100 pageRight NUMBER % pageRight + (x) show % "x" + 100 pageTop NUMBER % pageTop + (in) show % "in" + + % Upper-right millimeters + pageHeight sub % Move down... + + 2 copy moveto % Move to x & y + 10 pageRight 25.4 mul NUMBER % pageRight + (x) show % "x" + 10 pageTop 25.4 mul NUMBER % pageTop + (mm) show % "mm" + + % Resolution dots-per-inch + pageHeight 2 mul sub % Move down... + + 2 copy moveto % Move to x & y + (Resolution: ) RIGHT % Label + 1 xResolution NUMBER % xResolution + (x) show % "x" + 1 yResolution NUMBER % yResolution + (dpi) show % "dpi" + + % Resolution dots-per-meter + pageHeight sub % Move down... + + moveto % Move to x & y + 1 xResolution 39.27 mul NUMBER % xResolution + (x) show % "x" + 1 yResolution 39.27 mul NUMBER % yResolution + (dpm) show % "dpm" + + % Interpreter Information... + pageHeight 15 mul % Height of interpreter information + + pageWidth 40.5 mul % x = pageWidth * 9/16 * 72 + pageHeight 35.5 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 1/4 * 72 + 3 index % height + 0.5 setgray rectfill % Draw a shadow + + pageWidth 40 mul % x = pageWidth * 9/16 * 72 + pageHeight 36 mul % y = pageHeight * 1/2 * 72 + 2 index sub % y -= height + pageWidth 28 mul % width = pageWidth * 3/8 * 72 + 3 index % height + 4 copy 1 setgray rectfill % Clear the box to white + 0 setgray rectstroke % Draw a black box around it... + + pop % Discard height + + % Label the interpreter info... + pageWidth 40 mul % x = pageWidth * 9/16 * 72 + pageHeight 37 mul % y = pageHeight * 1/2 * 72 + moveto % Position the text + mediumFont setfont % Font + (Interpreter Information) show % Show the text + + smallFont setfont % Font + pageWidth 49 mul % x = pageWidth * 11/16 * 72 + pageHeight 36 mul % y = pageWidth * 1/2 * 72 + pageHeight 2 mul sub % y -= 2 * smallFont height + + % Language level + 2 copy moveto % Move to x & y + (PostScript: ) RIGHT % Label + (Level ) show % "Level " + 1 languagelevel NUMBER % Language level + + % Version + pageHeight 2 mul sub % Move down... + 2 copy moveto % Move to x & y + (Version: ) RIGHT % Label + version show % Version + ( \() show % " (" + 1 revision NUMBER % Revision + (\)) show % ")" + + % Product + pageHeight 2 mul sub % Move down... + 2 copy moveto % Move to x & y + (Product: ) RIGHT % Label + product show % Product name + + % Serial Number + pageHeight 2 mul sub % Move down... + moveto % Move to x & y + (Serial #: ) RIGHT % Label + 1 serialnumber NUMBER % S/N + + % Draw the label at the top... + pageWidth 36 mul % Center of page + pageHeight 66 mul % Top of page (11/12ths) + moveto % Position text + bigFont setfont % Font + (Printer Test Page) CENTER % Show text centered + + % Draw the copyright notice at the bottom... + pageWidth 17 mul % Center of page + pageHeight 10 mul % Bottom of page + moveto % Position text + (Printed Using CUPS v1.3.x) show + + pageWidth 17 mul % Left side of page + pageHeight 8 mul % Move down... + 2 copy moveto % Position text + smallFont setfont % Font + (Copyright 2007 Apple Inc., All Rights Reserved. CUPS and the CUPS logo are the trademark) show + pageHeight 2 add sub % Move down... + 2 copy moveto % Position text + (property of Apple Inc., 1 Infinite Loop, Cupertino, CA 95014, USA.) show + pageHeight 2 mul 4 add sub % Move down... + moveto % Position text + (Need help? Contact your operating system vendor or visit "http://www.cups.org/".) show + + % Then the CUPS logo.... + gsave + pageWidth 4 mul + pageHeight 4 mul + translate + pageWidth 15 mul CUPSLOGO + grestore + +% Show the page... +grestore +showpage +% +% End of "$Id: testfile.ps 9771 2011-05-12 05:21:56Z mike $". +% +%%EOF diff --git a/test/testfile.txt b/test/testfile.txt new file mode 100644 index 0000000..46bbf08 --- /dev/null +++ b/test/testfile.txt @@ -0,0 +1,60 @@ +All work and no play makes Johhny a dull boy. All work and no +play makes Johhny a dull boy. All work and no play makes Johhny +a dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. All +work and no play makes Johhny a dull boy. All work and no play +makes Johhny a dull boy. All work and no play makes Johhny a +dull boy. All work and no play makes Johhny a dull boy. diff --git a/test/testhp.ppd b/test/testhp.ppd new file mode 100644 index 0000000..4a82be6 --- /dev/null +++ b/test/testhp.ppd @@ -0,0 +1,187 @@ +*PPD-Adobe: "4.3" +*% +*% "$Id: testhp.ppd 9563 2011-02-22 20:21:24Z mike $" +*% +*% Test HP PPD file for CUPS. +*% +*% Copyright 2007-2011 by Apple Inc. +*% Copyright 1997-2005 by Easy Software Products. +*% +*% These coded instructions, statements, and computer programs are the +*% property of Apple Inc. and are protected by Federal copyright +*% law. Distribution and use rights are outlined in the file "LICENSE.txt" +*% which should have been included with this file. If this file is +*% file is missing or damaged, see the license at "http://www.cups.org/". +*% +*FormatVersion: "4.3" +*FileVersion: "1.1" +*LanguageVersion: English +*LanguageEncoding: ISOLatin1 +*PCFileName: "TESTHP.PPD" +*Manufacturer: "ESP" +*Product: "(CUPS v1.5)" +*cupsVersion: 1.1 +*cupsManualCopies: True +*cupsFilter: "application/vnd.cups-raster 50 rastertohp" +*cupsFilter2: "application/vnd.cups-raster application/vnd.hp-pcl 50 rastertohp" +*ModelName: "Test HP Printer" +*ShortNickName: "Test HP Printer" +*NickName: "Test HP Printer CUPS v1.1" +*PSVersion: "(3010.000) 550" +*LanguageLevel: "3" +*ColorDevice: True +*DefaultColorSpace: RGB +*FileSystem: False +*Throughput: "1" +*LandscapeOrientation: Plus90 +*VariablePaperSize: False +*TTRasterizer: Type42 + +*UIConstraints: *PageSize Executive *InputSlot Envelope +*UIConstraints: *PageSize Letter *InputSlot Envelope +*UIConstraints: *PageSize Legal *InputSlot Envelope +*UIConstraints: *PageSize Tabloid *InputSlot Envelope +*UIConstraints: *PageSize A3 *InputSlot Envelope +*UIConstraints: *PageSize A4 *InputSlot Envelope +*UIConstraints: *PageSize A5 *InputSlot Envelope +*UIConstraints: *PageSize B5 *InputSlot Envelope +*UIConstraints: *Resolution 600dpi *ColorModel CMYK + +*OpenUI *PageSize/Media Size: PickOne +*OrderDependency: 10 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter/US Letter: "<>setpagedevice" +*PageSize Legal/US Legal: "<>setpagedevice" +*PageSize Executive/US Executive: "<>setpagedevice" +*PageSize Tabloid/US Tabloid: "<>setpagedevice" +*PageSize A3/A3: "<>setpagedevice" +*PageSize A4/A4: "<>setpagedevice" +*PageSize A5/A5: "<>setpagedevice" +*PageSize B5/B5 (JIS): "<>setpagedevice" +*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" +*PageSize Env10/Envelope #10: "<>setpagedevice" +*PageSize EnvC5/Envelope C5: "<>setpagedevice" +*PageSize EnvDL/Envelope DL: "<>setpagedevice" +*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" +*CloseUI: *PageSize + +*OpenUI *PageRegion: PickOne +*OrderDependency: 10 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter/US Letter: "<>setpagedevice" +*PageRegion Legal/US Legal: "<>setpagedevice" +*PageRegion Executive/US Executive: "<>setpagedevice" +*PageRegion Tabloid/US Tabloid: "<>setpagedevice" +*PageRegion A3/A3: "<>setpagedevice" +*PageRegion A4/A4: "<>setpagedevice" +*PageRegion A5/A5: "<>setpagedevice" +*PageRegion B5/B5 (JIS): "<>setpagedevice" +*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" +*PageRegion Env10/Envelope #10: "<>setpagedevice" +*PageRegion EnvC5/Envelope C5: "<>setpagedevice" +*PageRegion EnvDL/Envelope DL: "<>setpagedevice" +*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" +*CloseUI: *PageRegion + +*DefaultImageableArea: Letter +*ImageableArea Letter/US Letter: "18 36 594 756" +*ImageableArea Legal/US Legal: "18 36 594 972" +*ImageableArea Executive/US Executive: "18 36 504 684" +*ImageableArea Tabloid/US Tabloid: "18 36 774 1188" +*ImageableArea A3/A3: "18 36 824 1155" +*ImageableArea A4/A4: "18 36 577 806" +*ImageableArea A5/A5: "18 36 403 559" +*ImageableArea B5/JIS B5: "18 36 498 693" +*ImageableArea EnvISOB5/B5 (ISO): "18 36 463 673" +*ImageableArea Env10/Com-10: "18 36 279 648" +*ImageableArea EnvC5/EnvC5: "18 36 441 613" +*ImageableArea EnvDL/EnvDL: "18 36 294 588" +*ImageableArea EnvMonarch/Envelope Monarch: "18 36 261 504" + +*DefaultPaperDimension: Letter +*PaperDimension Letter/US Letter: "612 792" +*PaperDimension Legal/US Legal: "612 1008" +*PaperDimension Executive/US Executive: "522 756" +*PaperDimension Tabloid/US Tabloid: "792 1224" +*PaperDimension A3/A3: "842 1191" +*PaperDimension A4/A4: "595 842" +*PaperDimension A5/A5: "421 595" +*PaperDimension B5/B5 (JIS): "516 729" +*PaperDimension EnvISOB5/Envelope B5: "499 709" +*PaperDimension Env10/Envelope #10: "297 684" +*PaperDimension EnvC5/Envelope C5: "459 649" +*PaperDimension EnvDL/Envelope DL: "312 624" +*PaperDimension EnvMonarch/Envelope Monarch: "279 540" + +*OpenUI *MediaType/Media Type: PickOne +*OrderDependency: 10 AnySetup *MediaType +*DefaultMediaType: Plain +*MediaType Plain/Plain Paper: "<>setpagedevice" +*MediaType Bond/Bond Paper: "<>setpagedevice" +*MediaType Special/Special Paper: "<>setpagedevice" +*MediaType Transparency/Transparency: "<>setpagedevice" +*MediaType Glossy/Glossy Paper: "<>setpagedevice" +*CloseUI: *MediaType + +*OpenUI *InputSlot/Media Source: PickOne +*OrderDependency: 10 AnySetup *InputSlot +*DefaultInputSlot: Tray +*InputSlot Tray/Tray: "<>setpagedevice" +*InputSlot Manual/Manual Feed: "<>setpagedevice" +*InputSlot Envelope/Envelope Feed: "<>setpagedevice" +*CloseUI: *InputSlot + +*OpenUI *Resolution/Output Resolution: PickOne +*OrderDependency: 20 AnySetup *Resolution +*DefaultResolution: 100dpi +*Resolution 75dpi/75 DPI: "<>setpagedevice" +*Resolution 100dpi/100 DPI: "<>setpagedevice" +*CloseUI: *Resolution + +*OpenUI *ColorModel/Output Mode: PickOne +*OrderDependency: 10 AnySetup *ColorModel +*DefaultColorModel: CMYK +*ColorModel CMYK/CMYK Color: "<>setpagedevice" +*ColorModel RGB/CMY Color: "<>setpagedevice" +*ColorModel Gray/Grayscale: "<>setpagedevice" +*CloseUI: *ColorModel + +*DefaultFont: Courier +*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM +*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM +*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM +*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM +*Font Bookman-Demi: Standard "(001.004S)" Standard ROM +*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM +*Font Bookman-Light: Standard "(001.004S)" Standard ROM +*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM +*Font Courier: Standard "(002.004S)" Standard ROM +*Font Courier-Bold: Standard "(002.004S)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM +*Font Courier-Oblique: Standard "(002.004S)" Standard ROM +*Font Helvetica: Standard "(001.006S)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM +*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM +*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM +*Font Palatino-Bold: Standard "(001.005S)" Standard ROM +*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM +*Font Palatino-Italic: Standard "(001.005S)" Standard ROM +*Font Palatino-Roman: Standard "(001.005S)" Standard ROM +*Font Symbol: Special "(001.007S)" Special ROM +*Font Times-Bold: Standard "(001.007S)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM +*Font Times-Italic: Standard "(001.007S)" Standard ROM +*Font Times-Roman: Standard "(001.007S)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM +*Font ZapfDingbats: Special "(001.004S)" Standard ROM +*% +*% End of "$Id: testhp.ppd 9563 2011-02-22 20:21:24Z mike $". +*% diff --git a/test/testps.ppd b/test/testps.ppd new file mode 100644 index 0000000..6e47800 --- /dev/null +++ b/test/testps.ppd @@ -0,0 +1,183 @@ +*PPD-Adobe: "4.3" +*% +*% "$Id: testps.ppd 9771 2011-05-12 05:21:56Z mike $" +*% +*% Test PS PPD file for CUPS. +*% +*% Copyright 2007-2011 by Apple Inc. +*% Copyright 1997-2005 by Easy Software Products. +*% +*% These coded instructions, statements, and computer programs are the +*% property of Apple Inc. and are protected by Federal copyright +*% law. Distribution and use rights are outlined in the file "LICENSE.txt" +*% which should have been included with this file. If this file is +*% file is missing or damaged, see the license at "http://www.cups.org/". +*% +*FormatVersion: "4.3" +*FileVersion: "1.1" +*LanguageVersion: English +*LanguageEncoding: ISOLatin1 +*PCFileName: "TESTPS.PPD" +*Manufacturer: "ESP" +*Product: "(CUPS v1.1)" +*ModelName: "Test PS Printer" +*ShortNickName: "Test PS Printer" +*NickName: "Test PS Printer CUPS v1.1" +*PSVersion: "(3010.000) 550" +*LanguageLevel: "3" +*ColorDevice: True +*DefaultColorSpace: RGB +*FileSystem: False +*Throughput: "1" +*LandscapeOrientation: Plus90 +*VariablePaperSize: False +*TTRasterizer: Type42 + +*UIConstraints: *PageSize Executive *InputSlot Envelope +*UIConstraints: *PageSize Letter *InputSlot Envelope +*UIConstraints: *PageSize Legal *InputSlot Envelope +*UIConstraints: *PageSize Tabloid *InputSlot Envelope +*UIConstraints: *PageSize A3 *InputSlot Envelope +*UIConstraints: *PageSize A4 *InputSlot Envelope +*UIConstraints: *PageSize A5 *InputSlot Envelope +*UIConstraints: *PageSize B5 *InputSlot Envelope +*UIConstraints: *Resolution 600dpi *ColorModel CMYK + +*OpenUI *PageSize/Media Size: PickOne +*OrderDependency: 10 AnySetup *PageSize +*DefaultPageSize: Letter +*PageSize Letter/US Letter: "<>setpagedevice" +*PageSize Legal/US Legal: "<>setpagedevice" +*PageSize Executive/US Executive: "<>setpagedevice" +*PageSize Tabloid/US Tabloid: "<>setpagedevice" +*PageSize A3/A3: "<>setpagedevice" +*PageSize A4/A4: "<>setpagedevice" +*PageSize A5/A5: "<>setpagedevice" +*PageSize B5/B5 (JIS): "<>setpagedevice" +*PageSize EnvISOB5/Envelope B5: "<>setpagedevice" +*PageSize Env10/Envelope #10: "<>setpagedevice" +*PageSize EnvC5/Envelope C5: "<>setpagedevice" +*PageSize EnvDL/Envelope DL: "<>setpagedevice" +*PageSize EnvMonarch/Envelope Monarch: "<>setpagedevice" +*CloseUI: *PageSize + +*OpenUI *PageRegion: PickOne +*OrderDependency: 10 AnySetup *PageRegion +*DefaultPageRegion: Letter +*PageRegion Letter/US Letter: "<>setpagedevice" +*PageRegion Legal/US Legal: "<>setpagedevice" +*PageRegion Executive/US Executive: "<>setpagedevice" +*PageRegion Tabloid/US Tabloid: "<>setpagedevice" +*PageRegion A3/A3: "<>setpagedevice" +*PageRegion A4/A4: "<>setpagedevice" +*PageRegion A5/A5: "<>setpagedevice" +*PageRegion B5/B5 (JIS): "<>setpagedevice" +*PageRegion EnvISOB5/Envelope B5: "<>setpagedevice" +*PageRegion Env10/Envelope #10: "<>setpagedevice" +*PageRegion EnvC5/Envelope C5: "<>setpagedevice" +*PageRegion EnvDL/Envelope DL: "<>setpagedevice" +*PageRegion EnvMonarch/Envelope Monarch: "<>setpagedevice" +*CloseUI: *PageRegion + +*DefaultImageableArea: Letter +*ImageableArea Letter/US Letter: "18 36 594 756" +*ImageableArea Legal/US Legal: "18 36 594 972" +*ImageableArea Executive/US Executive: "18 36 504 684" +*ImageableArea Tabloid/US Tabloid: "18 36 774 1188" +*ImageableArea A3/A3: "18 36 824 1155" +*ImageableArea A4/A4: "18 36 577 806" +*ImageableArea A5/A5: "18 36 403 559" +*ImageableArea B5/JIS B5: "18 36 498 693" +*ImageableArea EnvISOB5/B5 (ISO): "18 36 463 673" +*ImageableArea Env10/Com-10: "18 36 279 648" +*ImageableArea EnvC5/EnvC5: "18 36 441 613" +*ImageableArea EnvDL/EnvDL: "18 36 294 588" +*ImageableArea EnvMonarch/Envelope Monarch: "18 36 261 504" + +*DefaultPaperDimension: Letter +*PaperDimension Letter/US Letter: "612 792" +*PaperDimension Legal/US Legal: "612 1008" +*PaperDimension Executive/US Executive: "522 756" +*PaperDimension Tabloid/US Tabloid: "792 1224" +*PaperDimension A3/A3: "842 1191" +*PaperDimension A4/A4: "595 842" +*PaperDimension A5/A5: "421 595" +*PaperDimension B5/B5 (JIS): "516 729" +*PaperDimension EnvISOB5/Envelope B5: "499 709" +*PaperDimension Env10/Envelope #10: "297 684" +*PaperDimension EnvC5/Envelope C5: "459 649" +*PaperDimension EnvDL/Envelope DL: "312 624" +*PaperDimension EnvMonarch/Envelope Monarch: "279 540" + +*OpenUI *MediaType/Media Type: PickOne +*OrderDependency: 10 AnySetup *MediaType +*DefaultMediaType: Plain +*MediaType Plain/Plain Paper: "<>setpagedevice" +*MediaType Bond/Bond Paper: "<>setpagedevice" +*MediaType Special/Special Paper: "<>setpagedevice" +*MediaType Transparency/Transparency: "<>setpagedevice" +*MediaType Glossy/Glossy Paper: "<>setpagedevice" +*CloseUI: *MediaType + +*OpenUI *InputSlot/Media Source: PickOne +*OrderDependency: 10 AnySetup *InputSlot +*DefaultInputSlot: Tray +*InputSlot Tray/Tray: "<>setpagedevice" +*InputSlot Manual/Manual Feed: "<>setpagedevice" +*InputSlot Envelope/Envelope Feed: "<>setpagedevice" +*CloseUI: *InputSlot + +*OpenUI *Resolution/Output Resolution: PickOne +*OrderDependency: 20 AnySetup *Resolution +*DefaultResolution: 100dpi +*Resolution 75dpi/75 DPI: "<>setpagedevice" +*Resolution 100dpi/100 DPI: "<>setpagedevice" +*CloseUI: *Resolution + +*OpenUI *ColorModel/Output Mode: PickOne +*OrderDependency: 10 AnySetup *ColorModel +*DefaultColorModel: CMYK +*ColorModel CMYK/CMYK Color: "<>setpagedevice" +*ColorModel RGB/CMY Color: "<>setpagedevice" +*ColorModel Gray/Grayscale: "<>setpagedevice" +*CloseUI: *ColorModel + +*DefaultFont: Courier +*Font AvantGarde-Book: Standard "(001.006S)" Standard ROM +*Font AvantGarde-BookOblique: Standard "(001.006S)" Standard ROM +*Font AvantGarde-Demi: Standard "(001.007S)" Standard ROM +*Font AvantGarde-DemiOblique: Standard "(001.007S)" Standard ROM +*Font Bookman-Demi: Standard "(001.004S)" Standard ROM +*Font Bookman-DemiItalic: Standard "(001.004S)" Standard ROM +*Font Bookman-Light: Standard "(001.004S)" Standard ROM +*Font Bookman-LightItalic: Standard "(001.004S)" Standard ROM +*Font Courier: Standard "(002.004S)" Standard ROM +*Font Courier-Bold: Standard "(002.004S)" Standard ROM +*Font Courier-BoldOblique: Standard "(002.004S)" Standard ROM +*Font Courier-Oblique: Standard "(002.004S)" Standard ROM +*Font Helvetica: Standard "(001.006S)" Standard ROM +*Font Helvetica-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow: Standard "(001.006S)" Standard ROM +*Font Helvetica-Narrow-Bold: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-BoldOblique: Standard "(001.007S)" Standard ROM +*Font Helvetica-Narrow-Oblique: Standard "(001.006S)" Standard ROM +*Font Helvetica-Oblique: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Bold: Standard "(001.009S)" Standard ROM +*Font NewCenturySchlbk-BoldItalic: Standard "(001.007S)" Standard ROM +*Font NewCenturySchlbk-Italic: Standard "(001.006S)" Standard ROM +*Font NewCenturySchlbk-Roman: Standard "(001.007S)" Standard ROM +*Font Palatino-Bold: Standard "(001.005S)" Standard ROM +*Font Palatino-BoldItalic: Standard "(001.005S)" Standard ROM +*Font Palatino-Italic: Standard "(001.005S)" Standard ROM +*Font Palatino-Roman: Standard "(001.005S)" Standard ROM +*Font Symbol: Special "(001.007S)" Special ROM +*Font Times-Bold: Standard "(001.007S)" Standard ROM +*Font Times-BoldItalic: Standard "(001.009S)" Standard ROM +*Font Times-Italic: Standard "(001.007S)" Standard ROM +*Font Times-Roman: Standard "(001.007S)" Standard ROM +*Font ZapfChancery-MediumItalic: Standard "(001.007S)" Standard ROM +*Font ZapfDingbats: Special "(001.004S)" Standard ROM +*% +*% End of "$Id: testps.ppd 9771 2011-05-12 05:21:56Z mike $". +*% diff --git a/test/waitjobs.sh b/test/waitjobs.sh new file mode 100755 index 0000000..b3dec92 --- /dev/null +++ b/test/waitjobs.sh @@ -0,0 +1,60 @@ +#!/bin/sh +# +# "$Id: waitjobs.sh 8393 2009-02-25 23:24:18Z mike $" +# +# Script to wait for jobs to complete. +# +# Copyright 2008-2009 by Apple Inc. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Get timeout from command-line +# + +if test $# = 1; then + timeout=$1 +else + timeout=360 +fi + +# +# Figure out the proper echo options... +# + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + ac_n=-n + ac_c= +else + ac_n= + ac_c='\c' +fi + +echo $ac_n "Waiting for jobs to complete...$ac_c" +oldjobs=0 + +while test $timeout -gt 0; do + jobs=`../systemv/lpstat 2>/dev/null | wc -l | tr -d ' '` + if test $jobs = 0; then + break + fi + + if test $jobs != $oldjobs; then + echo $ac_n "$jobs...$ac_c" + oldjobs=$jobs + fi + + sleep 5 + timeout=`expr $timeout - 5` +done + +echo "" + +# +# End of "$Id: waitjobs.sh 8393 2009-02-25 23:24:18Z mike $". +# diff --git a/vc2005/cups.sln b/vc2005/cups.sln new file mode 100644 index 0000000..e510e16 --- /dev/null +++ b/vc2005/cups.sln @@ -0,0 +1,78 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcups2", "libcups2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcupsimage2", "libcupsimage2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E1234}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testfile", "testfile.vcproj", "{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testhttp", "testhttp.vcproj", "{90B0058C-8393-411F-BD3B-E2C831D4E883}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cupstestppd", "cupstestppd.vcproj", "{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + {CB4AA6F2-3E84-45BE-B505-95CD375E1234} = {CB4AA6F2-3E84-45BE-B505-95CD375E1234} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.Build.0 = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.ActiveCfg = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.Build.0 = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.ActiveCfg = Release|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.Build.0 = Release|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.ActiveCfg = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.Build.0 = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.ActiveCfg = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.Build.0 = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.ActiveCfg = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.Build.0 = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.ActiveCfg = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.Build.0 = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.ActiveCfg = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.Build.0 = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.ActiveCfg = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.Build.0 = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.ActiveCfg = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.Build.0 = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.ActiveCfg = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.Build.0 = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.ActiveCfg = Debug|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.Build.0 = Debug|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.ActiveCfg = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.Build.0 = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.ActiveCfg = Release|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.Build.0 = Release|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.ActiveCfg = Release|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vc2005/cupstestppd.vcproj b/vc2005/cupstestppd.vcproj new file mode 100644 index 0000000..479afcc --- /dev/null +++ b/vc2005/cupstestppd.vcproj @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc2005/ipptool.vcproj b/vc2005/ipptool.vcproj new file mode 100644 index 0000000..271187b --- /dev/null +++ b/vc2005/ipptool.vcproj @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc2005/libcups2.vcproj b/vc2005/libcups2.vcproj new file mode 100644 index 0000000..0498185 --- /dev/null +++ b/vc2005/libcups2.vcproj @@ -0,0 +1,1611 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc2005/libcupsimage2.vcproj b/vc2005/libcupsimage2.vcproj new file mode 100644 index 0000000..bb1f9ef --- /dev/null +++ b/vc2005/libcupsimage2.vcproj @@ -0,0 +1,395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc2005/testfile.vcproj b/vc2005/testfile.vcproj new file mode 100644 index 0000000..edebe63 --- /dev/null +++ b/vc2005/testfile.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vc2005/testhttp.vcproj b/vc2005/testhttp.vcproj new file mode 100644 index 0000000..77501a2 --- /dev/null +++ b/vc2005/testhttp.vcproj @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/config.h b/vcnet/config.h new file mode 100644 index 0000000..4142178 --- /dev/null +++ b/vcnet/config.h @@ -0,0 +1,788 @@ +/* + * "$Id: config.h 9793 2011-05-20 03:49:49Z mike $" + * + * Configuration file for CUPS on Windows. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_CONFIG_H_ +#define _CUPS_CONFIG_H_ + +/* + * Include necessary headers... + */ + +#include +#include +#include +#include +#include +#include + + +/* + * Microsoft renames the POSIX functions to _name, and introduces + * a broken compatibility layer using the original names. As a result, + * random crashes can occur when, for example, strdup() allocates memory + * from a different heap than used by malloc() and free(). + * + * To avoid moronic problems like this, we #define the POSIX function + * names to the corresponding non-standard Microsoft names. + */ + +#define access _access +#define close _close +#define fileno _fileno +#define lseek _lseek +#define mkdir(d,p) _mkdir(d) +#define open _open +#define read _read +#define rmdir _rmdir +#define snprintf _snprintf +#define strdup _strdup +#define unlink _unlink +#define vsnprintf _vsnprintf +#define write _write + + +/* + * Map the POSIX sleep() and usleep() functions to the Win32 Sleep() function... + */ + +#define sleep(X) Sleep(1000 * (X)) +#define usleep(X) Sleep((X)/1000) + + +/* + * Map various parameters to Posix style system calls + */ + +# define F_OK 00 +# define W_OK 02 +# define R_OK 04 +# define O_RDONLY _O_RDONLY +# define O_WRONLY _O_WRONLY +# define O_CREATE _O_CREAT +# define O_TRUNC _O_TRUNC + + +/* + * Compiler stuff... + */ + +#undef const +#undef __CHAR_UNSIGNED__ + + +/* + * Version of software... + */ + +#define CUPS_SVERSION "CUPS v1.5.0" +#define CUPS_MINIMAL "CUPS/1.5.0" + + +/* + * Default user and groups... + */ + +#define CUPS_DEFAULT_USER "" +#define CUPS_DEFAULT_GROUP "" +#define CUPS_DEFAULT_SYSTEM_GROUPS "" +#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "" + + +/* + * Default file permissions... + */ + +#define CUPS_DEFAULT_CONFIG_FILE_PERM 0644 +#define CUPS_DEFAULT_LOG_FILE_PERM 0644 + + +/* + * Default logging settings... + */ + +#define CUPS_DEFAULT_LOG_LEVEL "warn" +#define CUPS_DEFAULT_ACCESS_LOG_LEVEL "actions" + + +/* + * Default fatal error settings... + */ + +#define CUPS_DEFAULT_FATAL_ERRORS "config" + + +/* + * Default browsing settings... + */ + +#define CUPS_DEFAULT_BROWSING 1 +#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "CUPS dnssd" +#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS "" +#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1 +#define CUPS_DEFAULT_DEFAULT_SHARED 1 +#define CUPS_DEFAULT_IMPLICIT_CLASSES 1 +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0 + + +/* + * Default IPP port... + */ + +#define CUPS_DEFAULT_IPP_PORT 631 + + +/* + * Default printcap file... + */ + +#define CUPS_DEFAULT_PRINTCAP "" + + +/* + * Default Samba and LPD config files... + */ + +#define CUPS_DEFAULT_SMB_CONFIG_FILE "" +#define CUPS_DEFAULT_LPD_CONFIG_FILE "" + + +/* + * Default MaxCopies value... + */ + +#define CUPS_DEFAULT_MAX_COPIES 9999 + + +/* + * Do we have domain socket support? + */ + +#undef CUPS_DEFAULT_DOMAINSOCKET + + +/* + * Where are files stored? + * + * Note: These are defaults, which can be overridden by environment + * variables at run-time... + */ + +#define CUPS_BINDIR "C:/CUPS/bin" +#define CUPS_CACHEDIR "C:/CUPS/cache" +#define CUPS_DATADIR "C:/CUPS/share" +#define CUPS_DOCROOT "C:/CUPS/share/doc" +#define CUPS_FONTPATH "C:/CUPS/share/fonts" +#define CUPS_LOCALEDIR "C:/CUPS/locale" +#define CUPS_LOGDIR "C:/CUPS/logs" +#define CUPS_REQUESTS "C:/CUPS/spool" +#define CUPS_SBINDIR "C:/CUPS/sbin" +#define CUPS_SERVERBIN "C:/CUPS/lib" +#define CUPS_SERVERROOT "C:/CUPS/etc" +#define CUPS_STATEDIR "C:/CUPS/run" + + +/* + * Do we have various image libraries? + */ + +/* #undef HAVE_LIBPNG */ +/* #undef HAVE_LIBZ */ +/* #undef HAVE_LIBJPEG */ +/* #undef HAVE_LIBTIFF */ + + +/* + * Do we have PAM stuff? + */ + +#ifndef HAVE_LIBPAM +#define HAVE_LIBPAM 0 +#endif /* !HAVE_LIBPAM */ + +/* #undef HAVE_PAM_PAM_APPL_H */ +/* #undef HAVE_PAM_SET_ITEM */ +/* #undef HAVE_PAM_SETCRED */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SHADOW_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_CRYPT_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SCSI_SG_H */ + + +/* + * Use , , and/or ? + */ + +#define HAVE_STRING_H 1 +/* #undef HAVE_STRINGS_H */ +/* #undef HAVE_BSTRING_H */ + + +/* + * Do we have the long long type? + */ + +/* #undef HAVE_LONG_LONG */ + +#ifdef HAVE_LONG_LONG +# define CUPS_LLFMT "%lld" +# define CUPS_LLCAST (long long) +#else +# define CUPS_LLFMT "%ld" +# define CUPS_LLCAST (long) +#endif /* HAVE_LONG_LONG */ + + +/* + * Do we have the strtoll() function? + */ + +/* #undef HAVE_STRTOLL */ + +#ifndef HAVE_STRTOLL +# define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) +#endif /* !HAVE_STRTOLL */ + + +/* + * Do we have the strXXX() functions? + */ + +#define HAVE_STRDUP 1 +/* #undef HAVE_STRLCAT */ +/* #undef HAVE_STRLCPY */ + + +/* + * Do we have the geteuid() function? + */ + +/* #undef HAVE_GETEUID */ + + +/* + * Do we have the setpgid() function? + */ + +/* #undef HAVE_SETPGID */ + + +/* + * Do we have the vsyslog() function? + */ + +/* #undef HAVE_VSYSLOG */ + + +/* + * Do we have the (v)snprintf() functions? + */ + +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 + + +/* + * What signal functions to use? + */ + +/* #undef HAVE_SIGSET */ +/* #undef HAVE_SIGACTION */ + + +/* + * What wait functions to use? + */ + +/* #undef HAVE_WAITPID */ +/* #undef HAVE_WAIT3 */ + + +/* + * Do we have the mallinfo function and malloc.h? + */ + +/* #undef HAVE_MALLINFO */ +/* #undef HAVE_MALLOC_H */ + + +/* + * Do we have the POSIX ACL functions? + */ + +/* #undef HAVE_ACL_INIT */ + + +/* + * Do we have the langinfo.h header file? + */ + +/* #undef HAVE_LANGINFO_H */ + + +/* + * Which encryption libraries do we have? + */ + +/* #undef HAVE_CDSASSL */ +/* #undef HAVE_GNUTLS */ +/* #undef HAVE_LIBSSL */ +#define HAVE_SSPISSL +#define HAVE_SSL + + +/* + * What Security framework headers do we have? + */ + +/* #undef HAVE_AUTHORIZATION_H */ +/* #undef HAVE_SECPOLICY_H */ +/* #undef HAVE_SECPOLICYPRIV_H */ +/* #undef HAVE_SECBASEPRIV_H */ +/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */ + + +/* + * Do we have the SecIdentitySearchCreateWithPolicy function? + */ + +/* #undef HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY */ + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +/* #undef HAVE_SECPOLICYCREATESSL */ + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +/* #undef HAVE_SECPOLICYCREATESSL */ + + +/* + * Do we have the cssmErrorString function? + */ + +/* #undef HAVE_CSSMERRORSTRING */ + + +/* + * Do we have the SLP library? + */ + +/* #undef HAVE_LIBSLP */ + + +/* + * Do we have an LDAP library? + */ + +/* #undef HAVE_LDAP */ +/* #undef HAVE_OPENLDAP */ +/* #undef HAVE_MOZILLA_LDAP */ +/* #undef HAVE_LDAP_SSL_H */ +/* #undef HAVE_LDAP_SSL */ +/* #undef HAVE_LDAP_REBIND_PROC */ + + +/* + * Do we have libpaper? + */ + +/* #undef HAVE_LIBPAPER */ + + +/* + * Do we have DNS Service Discovery (aka Bonjour)? + */ + +#define HAVE_DNSSD 1 + + +/* + * Does the "stat" structure contain the "st_gen" member? + */ + +/* #undef HAVE_ST_GEN */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SYS_IOCTL_H */ + + +/* + * Does the "tm" structure contain the "tm_gmtoff" member? + */ + +/* #undef HAVE_TM_GMTOFF */ + + +/* + * Do we have rresvport_af()? + */ + +/* #undef HAVE_RRESVPORT_AF */ + + +/* + * Do we have getaddrinfo()? + */ + +#define HAVE_GETADDRINFO 1 + + +/* + * Do we have getnameinfo()? + */ + +#define HAVE_GETNAMEINFO 1 + + +/* + * Do we have getifaddrs()? + */ + +/* #undef HAVE_GETIFADDRS */ + + +/* + * Do we have hstrerror()? + */ + +/* #undef HAVE_HSTRERROR */ + + +/* + * Do we have res_init()? + */ + +/* #undef HAVE_RES_INIT */ + + +/* + * Do we have + */ + +/* #undef HAVE_RESOLV_H */ + + +/* + * Do we have the header file? + */ + +/* #undef HAVE_SYS_SOCKIO_H */ + + +/* + * Does the sockaddr structure contain an sa_len parameter? + */ + +/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */ + + +/* + * Do we have the AIX usersec.h header file? + */ + +/* #undef HAVE_USERSEC_H */ + + +/* + * Do we have pthread support? + */ + +/* #undef HAVE_PTHREAD_H */ + + +/* + * Do we have launchd support? + */ + +/* #undef HAVE_LAUNCH_H */ +/* #undef HAVE_LAUNCHD */ + + +/* + * Various scripting languages... + */ + +/* #undef HAVE_JAVA */ +#define CUPS_JAVA "" +/* #undef HAVE_PERL */ +#define CUPS_PERL "" +/* #undef HAVE_PHP */ +#define CUPS_PHP "" +/* #undef HAVE_PYTHON */ +#define CUPS_PYTHON "" + + +/* + * Location of the poppler/Xpdf pdftops program... + */ + +/* #undef HAVE_PDFTOPS */ +#define CUPS_PDFTOPS "" + + +/* + * Location of the Ghostscript gs program... + */ + +/* #undef HAVE_GHOSTSCRIPT */ +#define CUPS_GHOSTSCRIPT "" + + +/* + * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks? + */ + +/* #undef HAVE_COREFOUNDATION */ +/* #undef HAVE_SYSTEMCONFIGURATION */ + + +/* + * Do we have CoreFoundation public and private headers? + */ + +/* #undef HAVE_COREFOUNDATION_H */ +/* #undef HAVE_CFPRIV_H */ +/* #undef HAVE_CFBUNDLEPRIV_H */ + + +/* + * Do we have ApplicationServices public headers? + */ + +/* #undef HAVE_APPLICATIONSERVICES_H */ + + +/* + * Do we have the SCDynamicStoreCopyComputerName function? + */ + +/* #undef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */ + + +/* + * Do we have Mac OS X 10.4's mbr_XXX functions? + */ + +/* #undef HAVE_MEMBERSHIP_H */ +/* #undef HAVE_MEMBERSHIPPRIV_H */ +/* #undef HAVE_MBR_UID_TO_UUID */ + + +/* + * Do we have Darwin's notify_post header and function? + */ + +/* #undef HAVE_NOTIFY_H */ +/* #undef HAVE_NOTIFY_POST */ + + +/* + * Do we have Darwin's IOKit private headers? + */ + +/* #undef HAVE_IOKIT_PWR_MGT_IOPMLIBPRIVATE_H */ + + +/* + * Do we have DBUS? + */ + +/* #undef HAVE_DBUS */ +/* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ + + +/* + * Do we have the GSSAPI support library (for Kerberos support)? + */ + +/* #undef HAVE_GSS_ACQUIRE_CRED_EX_F */ +/* #undef HAVE_GSS_C_NT_HOSTBASED_SERVICE */ +/* #undef HAVE_GSS_GSSAPI_H */ +/* #undef HAVE_GSS_GSSAPI_SPI_H */ +/* #undef HAVE_GSSAPI */ +/* #undef HAVE_GSSAPI_GENERIC_H */ +/* #undef HAVE_GSSAPI_GSSAPI_H */ +/* #undef HAVE_GSSAPI_H */ +/* #undef HAVE_GSSAPI_KRB5_H */ +/* #undef HAVE_KRB5_H */ + + +/* + * Default GSS service name... + */ + +#define CUPS_DEFAULT_GSSSERVICENAME "host" + + +/* + * Select/poll interfaces... + */ + +/* #undef HAVE_POLL */ +/* #undef HAVE_EPOLL */ +/* #undef HAVE_KQUEUE */ + + +/* + * Do we have the header? + */ + +/* #undef HAVE_DLFCN_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SYS_PARAM_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SYS_UCRED_H */ + + +/* + * Do we have removefile()? + */ + +/* #undef HAVE_REMOVEFILE */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SANDBOX_H */ + + +/* + * Which random number generator function to use... + */ + +/* #undef HAVE_ARC4RANDOM */ +/* #undef HAVE_RANDOM */ +/* #undef HAVE_LRAND48 */ + +#ifdef HAVE_ARC4RANDOM +# define CUPS_RAND() arc4random() +# define CUPS_SRAND(v) arc4random_stir() +#elif defined(HAVE_RANDOM) +# define CUPS_RAND() random() +# define CUPS_SRAND(v) srandom(v) +#elif defined(HAVE_LRAND48) +# define CUPS_RAND() lrand48() +# define CUPS_SRAND(v) srand48(v) +#else +# define CUPS_RAND() rand() +# define CUPS_SRAND(v) srand(v) +#endif /* HAVE_ARC4RANDOM */ + + +/* + * Do we have vproc_transaction_begin/end? + */ + +/* #undef HAVE_VPROC_TRANSACTION_BEGIN */ + + +/* + * Do we have libusb? + */ + +/* #undef HAVE_USB_H */ + + +/* + * Do we have libwrap and tcpd.h? + */ + +/* #undef HAVE_TCPD_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_ICONV_H */ + + +/* + * Do we have statfs or statvfs and one of the corresponding headers? + */ + +/* #undef HAVE_STATFS */ +/* #undef HAVE_STATVFS */ +/* #undef HAVE_SYS_MOUNT_H */ +/* #undef HAVE_SYS_STATFS_H */ +/* #undef HAVE_SYS_STATVFS_H */ +/* #undef HAVE_SYS_VFS_H */ + + +/* + * Location of Mac OS X localization bundle, if any. + */ + +/* #undef CUPS_BUNDLEDIR */ + + +/* + * Do we have the ColorSyncRegisterDevice function? + */ + +/* #undef HAVE_COLORSYNCREGISTERDEVICE */ + + +/* + * Do we have XPC? + */ + +/* #undef HAVE_XPC */ + + +#endif /* !_CUPS_CONFIG_H_ */ + +/* + * End of "$Id: config.h 9793 2011-05-20 03:49:49Z mike $". + */ diff --git a/vcnet/cups.sln b/vcnet/cups.sln new file mode 100644 index 0000000..9dabb89 --- /dev/null +++ b/vcnet/cups.sln @@ -0,0 +1,91 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcups2", "libcups2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libcupsimage2", "libcupsimage2.vcproj", "{CB4AA6F2-3E84-45BE-B505-95CD375E1234}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testfile", "testfile.vcproj", "{CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testhttp", "testhttp.vcproj", "{90B0058C-8393-411F-BD3B-E2C831D4E883}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cupstestppd", "cupstestppd.vcproj", "{6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E1234} = {CB4AA6F2-3E84-45BE-B505-95CD375E1234} + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ipptool", "ipptool.vcproj", "{B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}" + ProjectSection(ProjectDependencies) = postProject + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} = {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|Win32.Build.0 = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Debug|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.ActiveCfg = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|Win32.Build.0 = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E8BE3}.Release|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|Win32.Build.0 = Debug|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.ActiveCfg = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Debug|x64.Build.0 = Debug|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.ActiveCfg = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|Win32.Build.0 = Release|Win32 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.ActiveCfg = Release|x64 + {CB4AA6F2-3E84-45BE-B505-95CD375E1234}.Release|x64.Build.0 = Release|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.ActiveCfg = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|Win32.Build.0 = Debug|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.ActiveCfg = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Debug|x64.Build.0 = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.ActiveCfg = Release|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|Win32.Build.0 = Release|Win32 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.ActiveCfg = Debug|x64 + {CE75FC5F-E0CF-45DC-AD27-84666D3FBA30}.Release|x64.Build.0 = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.ActiveCfg = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|Win32.Build.0 = Debug|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.ActiveCfg = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Debug|x64.Build.0 = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.ActiveCfg = Release|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|Win32.Build.0 = Release|Win32 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.ActiveCfg = Debug|x64 + {90B0058C-8393-411F-BD3B-E2C831D4E883}.Release|x64.Build.0 = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.ActiveCfg = Debug|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|Win32.Build.0 = Debug|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.ActiveCfg = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Debug|x64.Build.0 = Debug|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.ActiveCfg = Release|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|Win32.Build.0 = Release|Win32 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.ActiveCfg = Release|x64 + {6BE0CDD3-4ED7-409C-A80F-19DF73664B1F}.Release|x64.Build.0 = Release|x64 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Debug|Win32.ActiveCfg = Debug|Win32 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Debug|Win32.Build.0 = Debug|Win32 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Debug|x64.ActiveCfg = Debug|x64 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Debug|x64.Build.0 = Debug|x64 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Release|Win32.ActiveCfg = Release|Win32 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Release|Win32.Build.0 = Release|Win32 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Release|x64.ActiveCfg = Release|x64 + {B246D91E-61F2-4433-BFD2-6C2A96FBD4D4}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vcnet/cupstestppd.vcproj b/vcnet/cupstestppd.vcproj new file mode 100644 index 0000000..8c34169 --- /dev/null +++ b/vcnet/cupstestppd.vcproj @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/ipptool.vcproj b/vcnet/ipptool.vcproj new file mode 100644 index 0000000..6c59af1 --- /dev/null +++ b/vcnet/ipptool.vcproj @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/libcups2.vcproj b/vcnet/libcups2.vcproj new file mode 100644 index 0000000..2fc8c5f --- /dev/null +++ b/vcnet/libcups2.vcproj @@ -0,0 +1,1608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/libcupsimage2.vcproj b/vcnet/libcupsimage2.vcproj new file mode 100644 index 0000000..23f3f5b --- /dev/null +++ b/vcnet/libcupsimage2.vcproj @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/regex/COPYRIGHT b/vcnet/regex/COPYRIGHT new file mode 100644 index 0000000..30c1f7a --- /dev/null +++ b/vcnet/regex/COPYRIGHT @@ -0,0 +1,20 @@ +Copyright 1992, 1993, 1994, 1997 Henry Spencer. All rights reserved. +This software is not subject to any license of the American Telephone +and Telegraph Company or of the Regents of the University of California. + +Permission is granted to anyone to use this software for any purpose on +any computer system, and to alter it and redistribute it, subject +to the following restrictions: + +1. The author is not responsible for the consequences of use of this + software, no matter how awful, even if they arise from flaws in it. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. Since few users ever read sources, + credits must appear in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. Since few users + ever read sources, credits must appear in the documentation. + +4. This notice may not be removed or altered. diff --git a/vcnet/regex/Makefile b/vcnet/regex/Makefile new file mode 100644 index 0000000..3882b37 --- /dev/null +++ b/vcnet/regex/Makefile @@ -0,0 +1,130 @@ +# You probably want to take -DREDEBUG out of CFLAGS, and put something like +# -O in, *after* testing (-DREDEBUG strengthens testing by enabling a lot of +# internal assertion checking and some debugging facilities). +# Put -Dconst= in for a pre-ANSI compiler. +# Do not take -DPOSIX_MISTAKE out. +# REGCFLAGS isn't important to you (it's for my use in some special contexts). +CFLAGS=-I. -DPOSIX_MISTAKE -DREDEBUG $(REGCFLAGS) + +# If you have a pre-ANSI compiler, put -o into MKHFLAGS. If you want +# the Berkeley __P macro, put -b in. +MKHFLAGS= + +# Flags for linking but not compiling, if any. +LDFLAGS= + +# Extra libraries for linking, if any. +LIBS= + +# Internal stuff, should not need changing. +OBJPRODN=regcomp.o regexec.o regerror.o regfree.o +OBJS=$(OBJPRODN) split.o debug.o main.o +H=cclass.h cname.h regex2.h utils.h +REGSRC=regcomp.c regerror.c regexec.c regfree.c +ALLSRC=$(REGSRC) engine.c debug.c main.c split.c + +# Stuff that matters only if you're trying to lint the package. +LINTFLAGS=-I. -Dstatic= -Dconst= -DREDEBUG +LINTC=regcomp.c regexec.c regerror.c regfree.c debug.c main.c +JUNKLINT=possible pointer alignment|null effect + +# arrangements to build forward-reference header files +.SUFFIXES: .ih .h +.c.ih: + sh ./mkh $(MKHFLAGS) -p $< >$@ + +default: r + +lib: purge $(OBJPRODN) + rm -f libregex.a + ar crv libregex.a $(OBJPRODN) + +purge: + rm -f *.o + +# stuff to build regex.h +REGEXH=regex.h +REGEXHSRC=regex2.h $(REGSRC) +$(REGEXH): $(REGEXHSRC) mkh + sh ./mkh $(MKHFLAGS) -i _REGEX_H_ $(REGEXHSRC) >regex.tmp + cmp -s regex.tmp regex.h 2>/dev/null || cp regex.tmp regex.h + rm -f regex.tmp + +# dependencies +$(OBJPRODN) debug.o: utils.h regex.h regex2.h +regcomp.o: cclass.h cname.h regcomp.ih +regexec.o: engine.c engine.ih +regerror.o: regerror.ih +debug.o: debug.ih +main.o: main.ih + +# tester +re: $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ + +# regression test +r: re tests + ./re &1 | egrep -v '$(JUNKLINT)' | tee lint + +fullprint: + ti README WHATSNEW notes todo | list + ti *.h | list + list *.c + list regex.3 regex.7 + +print: + ti README WHATSNEW notes todo | list + ti *.h | list + list reg*.c engine.c + + +mf.tmp: Makefile + sed '/^REGEXH=/s/=.*/=regex.h/' Makefile | sed '/#DEL$$/d' >$@ + +DTRH=cclass.h cname.h regex2.h utils.h +PRE=COPYRIGHT README WHATSNEW +POST=mkh regex.3 regex.7 tests $(DTRH) $(ALLSRC) fake/*.[ch] +FILES=$(PRE) Makefile $(POST) +DTR=$(PRE) Makefile=mf.tmp $(POST) +dtr: $(FILES) mf.tmp + makedtr $(DTR) >$@ + rm mf.tmp + +cio: $(FILES) + cio $(FILES) + +rdf: $(FILES) + rcsdiff -c $(FILES) 2>&1 | p + +# various forms of cleanup +tidy: + rm -f junk* core core.* *.core dtr *.tmp lint + +clean: tidy + rm -f *.o *.s *.ih re libregex.a + +# don't do this one unless you know what you're doing +spotless: clean + rm -f mkh regex.h diff --git a/vcnet/regex/README b/vcnet/regex/README new file mode 100644 index 0000000..e6ce373 --- /dev/null +++ b/vcnet/regex/README @@ -0,0 +1,32 @@ +alpha3.8 release. +Tue Aug 10 15:51:48 EDT 1999 +henry@spsystems.net (formerly henry@zoo.toronto.edu) + +See WHATSNEW for change listing. + +installation notes: +-------- +Read the comments at the beginning of Makefile before running. + +Utils.h contains some things that just might have to be modified on +some systems, as well as a nested include (ugh) of . + +The "fake" directory contains quick-and-dirty fakes for some header +files and routines that old systems may not have. Note also that +-DUSEBCOPY will make utils.h substitute bcopy() for memmove(). + +After that, "make r" will build regcomp.o, regexec.o, regfree.o, +and regerror.o (the actual routines), bundle them together into a test +program, and run regression tests on them. No output is good output. + +"make lib" builds just the .o files for the actual routines (when +you're happy with testing and have adjusted CFLAGS for production), +and puts them together into libregex.a. You can pick up either the +library or *.o ("make lib" makes sure there are no other .o files left +around to confuse things). + +Main.c, debug.c, split.c are used for regression testing but are not part +of the RE routines themselves. + +Regex.h goes in /usr/include. All other .h files are internal only. +-------- diff --git a/vcnet/regex/WHATSNEW b/vcnet/regex/WHATSNEW new file mode 100644 index 0000000..1295343 --- /dev/null +++ b/vcnet/regex/WHATSNEW @@ -0,0 +1,108 @@ +New in alpha3.8: Bug fix for signed/unsigned mixup, found and fixed +by the FreeBSD folks. + +New in alpha3.7: A bit of cleanup aimed at maximizing portability, +possibly at slight cost in efficiency. "ul" suffixes and "unsigned long" +no longer appear, in particular. + +New in alpha3.6: A couple more portability glitches fixed. + +New in alpha3.5: Active development of this code has been stopped -- +I'm working on a complete reimplementation -- but folks have found some +minor portability glitches and the like, hence this release to fix them. +One penalty: slightly reduced compatibility with old compilers, because +the ANSI C `unsigned long' type and `ul' constant suffix are used in a +few places (I could avoid this but it would be considerably more work). + +New in alpha3.4: The complex bug alluded to below has been fixed (in a +slightly kludgey temporary way that may hurt efficiency a bit; this is +another "get it out the door for 4.4" release). The tests at the end of +the tests file have accordingly been uncommented. The primary sign of +the bug was that something like a?b matching ab matched b rather than ab. +(The bug was essentially specific to this exact situation, else it would +have shown up earlier.) + +New in alpha3.3: The definition of word boundaries has been altered +slightly, to more closely match the usual programming notion that "_" +is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir, +and the makefile no longer alludes to it in mysterious ways. The +makefile has generally been cleaned up some. Fixes have been made +(again!) so that the regression test will run without -DREDEBUG, at +the cost of weaker checking. A workaround for a bug in some folks' + has been added. And some more things have been added to +tests, including a couple right at the end which are commented out +because the code currently flunks them (complex bug; fix coming). +Plus the usual minor cleanup. + +New in alpha3.2: Assorted bits of cleanup and portability improvement +(the development base is now a BSDI system using GCC instead of an ancient +Sun system, and the newer compiler exposed some glitches). Fix for a +serious bug that affected REs using many [] (including REG_ICASE REs +because of the way they are implemented), *sometimes*, depending on +memory-allocation patterns. The header-file prototypes no longer name +the parameters, avoiding possible name conflicts. The possibility that +some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is +now handled gracefully. "uchar" is no longer used as an internal type +name (too many people have the same idea). Still the same old lousy +performance, alas. + +New in alpha3.1: Basically nothing, this release is just a bookkeeping +convenience. Stay tuned. + +New in alpha3.0: Performance is no better, alas, but some fixes have been +made and some functionality has been added. (This is basically the "get +it out the door in time for 4.4" release.) One bug fix: regfree() didn't +free the main internal structure (how embarrassing). It is now possible +to put NULs in either the RE or the target string, using (resp.) a new +REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to +regcomp() makes all characters ordinary, so you can match a literal +string easily (this will become more useful when performance improves!). +There are now primitives to match beginnings and ends of words, although +the syntax is disgusting and so is the implementation. The REG_ATOI +debugging interface has changed a bit. And there has been considerable +internal cleanup of various kinds. + +New in alpha2.3: Split change list out of README, and moved flags notes +into Makefile. Macro-ized the name of regex(7) in regex(3), since it has +to change for 4.4BSD. Cleanup work in engine.c, and some new regression +tests to catch tricky cases thereof. + +New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two +small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges +in my own test program and might be useful to others for similar purposes. +The regression test will now compile (and run) without REDEBUG. The +BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now. +Char/uchar parameters are now written int/unsigned, to avoid possible +portability problems with unpromoted parameters. Some unsigned casts have +been introduced to minimize portability problems with shifting into sign +bits. + +New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big +thing is that regex.h is now generated, using mkh, rather than being +supplied in the distribution; due to circularities in dependencies, +you have to build regex.h explicitly by "make h". The two known bugs +have been fixed (and the regression test now checks for them), as has a +problem with assertions not being suppressed in the absence of REDEBUG. +No performance work yet. + +New in alpha2: Backslash-anything is an ordinary character, not an +error (except, of course, for the handful of backslashed metacharacters +in BREs), which should reduce script breakage. The regression test +checks *where* null strings are supposed to match, and has generally +been tightened up somewhat. Small bug fixes in parameter passing (not +harmful, but technically errors) and some other areas. Debugging +invoked by defining REDEBUG rather than not defining NDEBUG. + +New in alpha+3: full prototyping for internal routines, using a little +helper program, mkh, which extracts prototypes given in stylized comments. +More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple +pre-screening of input when a literal string is known to be part of the +RE; this does wonders for performance. + +New in alpha+2: minor bits of cleanup. Notably, the number "32" for the +word width isn't hardwired into regexec.c any more, the public header +file prototypes the functions if __STDC__ is defined, and some small typos +in the manpages have been fixed. + +New in alpha+1: improvements to the manual pages, and an important +extension, the REG_STARTEND option to regexec(). diff --git a/vcnet/regex/cclass.h b/vcnet/regex/cclass.h new file mode 100644 index 0000000..0c29302 --- /dev/null +++ b/vcnet/regex/cclass.h @@ -0,0 +1,31 @@ +/* character-class table */ +static struct cclass { + char *name; + char *chars; + char *multis; +} cclasses[] = { + "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789", "", + "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + "", + "blank", " \t", "", + "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\ +\25\26\27\30\31\32\33\34\35\36\37\177", "", + "digit", "0123456789", "", + "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", + "", + "lower", "abcdefghijklmnopqrstuvwxyz", + "", + "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", + "", + "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", + "", + "space", "\t\n\v\f\r ", "", + "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "", + "xdigit", "0123456789ABCDEFabcdef", + "", + NULL, 0, "" +}; diff --git a/vcnet/regex/cname.h b/vcnet/regex/cname.h new file mode 100644 index 0000000..02e86e9 --- /dev/null +++ b/vcnet/regex/cname.h @@ -0,0 +1,102 @@ +/* character-name table */ +static struct cname { + char *name; + char code; +} cnames[] = { + "NUL", '\0', + "SOH", '\001', + "STX", '\002', + "ETX", '\003', + "EOT", '\004', + "ENQ", '\005', + "ACK", '\006', + "BEL", '\007', + "alert", '\007', + "BS", '\010', + "backspace", '\b', + "HT", '\011', + "tab", '\t', + "LF", '\012', + "newline", '\n', + "VT", '\013', + "vertical-tab", '\v', + "FF", '\014', + "form-feed", '\f', + "CR", '\015', + "carriage-return", '\r', + "SO", '\016', + "SI", '\017', + "DLE", '\020', + "DC1", '\021', + "DC2", '\022', + "DC3", '\023', + "DC4", '\024', + "NAK", '\025', + "SYN", '\026', + "ETB", '\027', + "CAN", '\030', + "EM", '\031', + "SUB", '\032', + "ESC", '\033', + "IS4", '\034', + "FS", '\034', + "IS3", '\035', + "GS", '\035', + "IS2", '\036', + "RS", '\036', + "IS1", '\037', + "US", '\037', + "space", ' ', + "exclamation-mark", '!', + "quotation-mark", '"', + "number-sign", '#', + "dollar-sign", '$', + "percent-sign", '%', + "ampersand", '&', + "apostrophe", '\'', + "left-parenthesis", '(', + "right-parenthesis", ')', + "asterisk", '*', + "plus-sign", '+', + "comma", ',', + "hyphen", '-', + "hyphen-minus", '-', + "period", '.', + "full-stop", '.', + "slash", '/', + "solidus", '/', + "zero", '0', + "one", '1', + "two", '2', + "three", '3', + "four", '4', + "five", '5', + "six", '6', + "seven", '7', + "eight", '8', + "nine", '9', + "colon", ':', + "semicolon", ';', + "less-than-sign", '<', + "equals-sign", '=', + "greater-than-sign", '>', + "question-mark", '?', + "commercial-at", '@', + "left-square-bracket", '[', + "backslash", '\\', + "reverse-solidus", '\\', + "right-square-bracket", ']', + "circumflex", '^', + "circumflex-accent", '^', + "underscore", '_', + "low-line", '_', + "grave-accent", '`', + "left-brace", '{', + "left-curly-bracket", '{', + "vertical-line", '|', + "right-brace", '}', + "right-curly-bracket", '}', + "tilde", '~', + "DEL", '\177', + NULL, 0, +}; diff --git a/vcnet/regex/debug.c b/vcnet/regex/debug.c new file mode 100644 index 0000000..99ce7da --- /dev/null +++ b/vcnet/regex/debug.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" +#include "debug.ih" + +/* + - regprint - print a regexp for debugging + == void regprint(regex_t *r, FILE *d); + */ +void +regprint(r, d) +regex_t *r; +FILE *d; +{ + register struct re_guts *g = r->re_g; + register int i; + register int c; + register int last; + int nincat[NC]; + + fprintf(d, "%ld states, %d categories", (long)g->nstates, + g->ncategories); + fprintf(d, ", first %ld last %ld", (long)g->firststate, + (long)g->laststate); + if (g->iflags&USEBOL) + fprintf(d, ", USEBOL"); + if (g->iflags&USEEOL) + fprintf(d, ", USEEOL"); + if (g->iflags&BAD) + fprintf(d, ", BAD"); + if (g->nsub > 0) + fprintf(d, ", nsub=%ld", (long)g->nsub); + if (g->must != NULL) + fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen, + g->must); + if (g->backrefs) + fprintf(d, ", backrefs"); + if (g->nplus > 0) + fprintf(d, ", nplus %ld", (long)g->nplus); + fprintf(d, "\n"); + s_print(g, d); + for (i = 0; i < g->ncategories; i++) { + nincat[i] = 0; + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (g->categories[c] == i) + nincat[i]++; + } + fprintf(d, "cc0#%d", nincat[0]); + for (i = 1; i < g->ncategories; i++) + if (nincat[i] == 1) { + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (g->categories[c] == i) + break; + fprintf(d, ", %d=%s", i, regchar(c)); + } + fprintf(d, "\n"); + for (i = 1; i < g->ncategories; i++) + if (nincat[i] != 1) { + fprintf(d, "cc%d\t", i); + last = -1; + for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */ + if (c <= CHAR_MAX && g->categories[c] == i) { + if (last < 0) { + fprintf(d, "%s", regchar(c)); + last = c; + } + } else { + if (last >= 0) { + if (last != c-1) + fprintf(d, "-%s", + regchar(c-1)); + last = -1; + } + } + fprintf(d, "\n"); + } +} + +/* + - s_print - print the strip for debugging + == static void s_print(register struct re_guts *g, FILE *d); + */ +static void +s_print(g, d) +register struct re_guts *g; +FILE *d; +{ + register sop *s; + register cset *cs; + register int i; + register int done = 0; + register sop opnd; + register int col = 0; + register int last; + register sopno offset = 2; +# define GAP() { if (offset % 5 == 0) { \ + if (col > 40) { \ + fprintf(d, "\n\t"); \ + col = 0; \ + } else { \ + fprintf(d, " "); \ + col++; \ + } \ + } else \ + col++; \ + offset++; \ + } + + if (OP(g->strip[0]) != OEND) + fprintf(d, "missing initial OEND!\n"); + for (s = &g->strip[1]; !done; s++) { + opnd = OPND(*s); + switch (OP(*s)) { + case OEND: + fprintf(d, "\n"); + done = 1; + break; + case OCHAR: + if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL) + fprintf(d, "\\%c", (char)opnd); + else + fprintf(d, "%s", regchar((char)opnd)); + break; + case OBOL: + fprintf(d, "^"); + break; + case OEOL: + fprintf(d, "$"); + break; + case OBOW: + fprintf(d, "\\{"); + break; + case OEOW: + fprintf(d, "\\}"); + break; + case OANY: + fprintf(d, "."); + break; + case OANYOF: + fprintf(d, "[(%ld)", (long)opnd); + cs = &g->sets[opnd]; + last = -1; + for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */ + if (CHIN(cs, i) && i < g->csetsize) { + if (last < 0) { + fprintf(d, "%s", regchar(i)); + last = i; + } + } else { + if (last >= 0) { + if (last != i-1) + fprintf(d, "-%s", + regchar(i-1)); + last = -1; + } + } + fprintf(d, "]"); + break; + case OBACK_: + fprintf(d, "(\\<%ld>", (long)opnd); + break; + case O_BACK: + fprintf(d, "<%ld>\\)", (long)opnd); + break; + case OPLUS_: + fprintf(d, "(+"); + if (OP(*(s+opnd)) != O_PLUS) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_PLUS: + if (OP(*(s-opnd)) != OPLUS_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "+)"); + break; + case OQUEST_: + fprintf(d, "(?"); + if (OP(*(s+opnd)) != O_QUEST) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_QUEST: + if (OP(*(s-opnd)) != OQUEST_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "?)"); + break; + case OLPAREN: + fprintf(d, "((<%ld>", (long)opnd); + break; + case ORPAREN: + fprintf(d, "<%ld>))", (long)opnd); + break; + case OCH_: + fprintf(d, "<"); + if (OP(*(s+opnd)) != OOR2) + fprintf(d, "<%ld>", (long)opnd); + break; + case OOR1: + if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "|"); + break; + case OOR2: + fprintf(d, "|"); + if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_CH: + if (OP(*(s-opnd)) != OOR1) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, ">"); + break; + default: + fprintf(d, "!%d(%d)!", OP(*s), opnd); + break; + } + if (!done) + GAP(); + } +} + +/* + - regchar - make a character printable + == static char *regchar(int ch); + */ +static char * /* -> representation */ +regchar(ch) +int ch; +{ + static char buf[10]; + + if (isprint(ch) || ch == ' ') + sprintf(buf, "%c", ch); + else + sprintf(buf, "\\%o", ch); + return(buf); +} diff --git a/vcnet/regex/debug.ih b/vcnet/regex/debug.ih new file mode 100644 index 0000000..5f40ff7 --- /dev/null +++ b/vcnet/regex/debug.ih @@ -0,0 +1,14 @@ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === debug.c === */ +void regprint(regex_t *r, FILE *d); +static void s_print(register struct re_guts *g, FILE *d); +static char *regchar(int ch); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ diff --git a/vcnet/regex/engine.c b/vcnet/regex/engine.c new file mode 100644 index 0000000..0b88dcf --- /dev/null +++ b/vcnet/regex/engine.c @@ -0,0 +1,1019 @@ +/* + * The matching engine and friends. This file is #included by regexec.c + * after suitable #defines of a variety of macros used herein, so that + * different state representations can be used without duplicating masses + * of code. + */ + +#ifdef SNAMES +#define matcher smatcher +#define fast sfast +#define slow sslow +#define dissect sdissect +#define backref sbackref +#define step sstep +#define print sprint +#define at sat +#define match smat +#endif +#ifdef LNAMES +#define matcher lmatcher +#define fast lfast +#define slow lslow +#define dissect ldissect +#define backref lbackref +#define step lstep +#define print lprint +#define at lat +#define match lmat +#endif + +/* another structure passed up and down to avoid zillions of parameters */ +struct match { + struct re_guts *g; + int eflags; + regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ + char *offp; /* offsets work from here */ + char *beginp; /* start of string -- virtual NUL precedes */ + char *endp; /* end of string -- virtual NUL here */ + char *coldp; /* can be no match starting before here */ + char **lastpos; /* [nplus+1] */ + STATEVARS; + states st; /* current states */ + states fresh; /* states for a fresh start */ + states tmp; /* temporary */ + states empty; /* empty set of states */ +}; + +#include "engine.ih" + +#ifdef REDEBUG +#define SP(t, s, c) print(m, t, s, c, stdout) +#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) +#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); } +#else +#define SP(t, s, c) /* nothing */ +#define AT(t, p1, p2, s1, s2) /* nothing */ +#define NOTE(s) /* nothing */ +#endif + +/* + - matcher - the actual matching engine + == static int matcher(register struct re_guts *g, char *string, \ + == size_t nmatch, regmatch_t pmatch[], int eflags); + */ +static int /* 0 success, REG_NOMATCH failure */ +matcher(g, string, nmatch, pmatch, eflags) +register struct re_guts *g; +char *string; +size_t nmatch; +regmatch_t pmatch[]; +int eflags; +{ + register char *endp; + register size_t i; + struct match mv; + register struct match *m = &mv; + register char *dp; + const register sopno gf = g->firststate+1; /* +1 for OEND */ + const register sopno gl = g->laststate; + char *start; + char *stop; + + /* simplify the situation where possible */ + if (g->cflags®_NOSUB) + nmatch = 0; + if (eflags®_STARTEND) { + start = string + pmatch[0].rm_so; + stop = string + pmatch[0].rm_eo; + } else { + start = string; + stop = start + strlen(start); + } + if (stop < start) + return(REG_INVARG); + + /* prescreening; this does wonders for this rather slow code */ + if (g->must != NULL) { + for (dp = start; dp < stop; dp++) + if (*dp == g->must[0] && stop - dp >= g->mlen && + memcmp(dp, g->must, (size_t)g->mlen) == 0) + break; + if (dp == stop) /* we didn't find g->must */ + return(REG_NOMATCH); + } + + /* match struct setup */ + m->g = g; + m->eflags = eflags; + m->pmatch = NULL; + m->lastpos = NULL; + m->offp = string; + m->beginp = start; + m->endp = stop; + STATESETUP(m, 4); + SETUP(m->st); + SETUP(m->fresh); + SETUP(m->tmp); + SETUP(m->empty); + CLEAR(m->empty); + + /* this loop does only one repetition except for backrefs */ + for (;;) { + endp = fast(m, start, stop, gf, gl); + if (endp == NULL) { /* a miss */ + STATETEARDOWN(m); + return(REG_NOMATCH); + } + if (nmatch == 0 && !g->backrefs) + break; /* no further info needed */ + + /* where? */ + assert(m->coldp != NULL); + for (;;) { + NOTE("finding start"); + endp = slow(m, m->coldp, stop, gf, gl); + if (endp != NULL) + break; + assert(m->coldp < m->endp); + m->coldp++; + } + if (nmatch == 1 && !g->backrefs) + break; /* no further info needed */ + + /* oh my, he wants the subexpressions... */ + if (m->pmatch == NULL) + m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * + sizeof(regmatch_t)); + if (m->pmatch == NULL) { + STATETEARDOWN(m); + return(REG_ESPACE); + } + for (i = 1; i <= m->g->nsub; i++) + m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; + if (!g->backrefs && !(m->eflags®_BACKR)) { + NOTE("dissecting"); + dp = dissect(m, m->coldp, endp, gf, gl); + } else { + if (g->nplus > 0 && m->lastpos == NULL) + m->lastpos = (char **)malloc((g->nplus+1) * + sizeof(char *)); + if (g->nplus > 0 && m->lastpos == NULL) { + free(m->pmatch); + STATETEARDOWN(m); + return(REG_ESPACE); + } + NOTE("backref dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + if (dp != NULL) + break; + + /* uh-oh... we couldn't find a subexpression-level match */ + assert(g->backrefs); /* must be back references doing it */ + assert(g->nplus == 0 || m->lastpos != NULL); + for (;;) { + if (dp != NULL || endp <= m->coldp) + break; /* defeat */ + NOTE("backoff"); + endp = slow(m, m->coldp, endp-1, gf, gl); + if (endp == NULL) + break; /* defeat */ + /* try it on a shorter possibility */ +#ifndef NDEBUG + for (i = 1; i <= m->g->nsub; i++) { + assert(m->pmatch[i].rm_so == -1); + assert(m->pmatch[i].rm_eo == -1); + } +#endif + NOTE("backoff dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + assert(dp == NULL || dp == endp); + if (dp != NULL) /* found a shorter one */ + break; + + /* despite initial appearances, there is no match here */ + NOTE("false alarm"); + start = m->coldp + 1; /* recycle starting later */ + assert(start <= stop); + } + + /* fill in the details if requested */ + if (nmatch > 0) { + pmatch[0].rm_so = m->coldp - m->offp; + pmatch[0].rm_eo = endp - m->offp; + } + if (nmatch > 1) { + assert(m->pmatch != NULL); + for (i = 1; i < nmatch; i++) + if (i <= m->g->nsub) + pmatch[i] = m->pmatch[i]; + else { + pmatch[i].rm_so = -1; + pmatch[i].rm_eo = -1; + } + } + + if (m->pmatch != NULL) + free((char *)m->pmatch); + if (m->lastpos != NULL) + free((char *)m->lastpos); + STATETEARDOWN(m); + return(0); +} + +/* + - dissect - figure out what matched what, no back references + == static char *dissect(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* == stop (success) always */ +dissect(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register sopno es; /* end sop of current subRE */ + register char *sp; /* start of string matched by it */ + register char *stp; /* string matched by it cannot pass here */ + register char *rest; /* start of rest of string */ + register char *tail; /* string unmatched by rest of RE */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register char *ssp; /* start of string matched by subsubRE */ + register char *sep; /* end of string matched by subsubRE */ + register char *oldssp; /* previous ssp */ + register char *dp; + + AT("diss", start, stop, startst, stopst); + sp = start; + for (ss = startst; ss < stopst; ss = es) { + /* identify end of subRE */ + es = ss; + switch (OP(m->g->strip[es])) { + case OPLUS_: + case OQUEST_: + es += OPND(m->g->strip[es]); + break; + case OCH_: + while (OP(m->g->strip[es]) != O_CH) + es += OPND(m->g->strip[es]); + break; + } + es++; + + /* figure out what it matched */ + switch (OP(m->g->strip[ss])) { + case OEND: + assert(nope); + break; + case OCHAR: + sp++; + break; + case OBOL: + case OEOL: + case OBOW: + case OEOW: + break; + case OANY: + case OANYOF: + sp++; + break; + case OBACK_: + case O_BACK: + assert(nope); + break; + /* cases where length of match is hard to find */ + case OQUEST_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + /* did innards match? */ + if (slow(m, sp, rest, ssub, esub) != NULL) { + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + } else /* no */ + assert(sp == rest); + sp = rest; + break; + case OPLUS_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + ssp = sp; + oldssp = ssp; + for (;;) { /* find last match of innards */ + sep = slow(m, ssp, rest, ssub, esub); + if (sep == NULL || sep == ssp) + break; /* failed or matched null */ + oldssp = ssp; /* on to next try */ + ssp = sep; + } + if (sep == NULL) { + /* last successful match */ + sep = ssp; + ssp = oldssp; + } + assert(sep == rest); /* must exhaust substring */ + assert(slow(m, ssp, sep, ssub, esub) == rest); + dp = dissect(m, ssp, sep, ssub, esub); + assert(dp == sep); + sp = rest; + break; + case OCH_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = ss + OPND(m->g->strip[ss]) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + if (slow(m, sp, rest, ssub, esub) == rest) + break; /* it matched all of it */ + /* that one missed, try next one */ + assert(OP(m->g->strip[esub]) == OOR1); + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + sp = rest; + break; + case O_PLUS: + case O_QUEST: + case OOR1: + case OOR2: + case O_CH: + assert(nope); + break; + case OLPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_so = sp - m->offp; + break; + case ORPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_eo = sp - m->offp; + break; + default: /* uh oh */ + assert(nope); + break; + } + } + + assert(sp == stop); + return(sp); +} + +/* + - backref - figure out what matched what, figuring in back references + == static char *backref(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst, sopno lev); + */ +static char * /* == stop (success) or NULL (failure) */ +backref(m, start, stop, startst, stopst, lev) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +sopno lev; /* PLUS nesting level */ +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register char *sp; /* start of string matched by it */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register char *ssp; /* start of string matched by subsubRE */ + register char *dp; + register size_t len; + register int hard; + register sop s; + register regoff_t offsave; + register cset *cs; + + AT("back", start, stop, startst, stopst); + sp = start; + + /* get as far as we can with easy stuff */ + hard = 0; + for (ss = startst; !hard && ss < stopst; ss++) + switch (OP(s = m->g->strip[ss])) { + case OCHAR: + if (sp == stop || *sp++ != (char)OPND(s)) + return(NULL); + break; + case OANY: + if (sp == stop) + return(NULL); + sp++; + break; + case OANYOF: + cs = &m->g->sets[OPND(s)]; + if (sp == stop || !CHIN(cs, *sp++)) + return(NULL); + break; + case OBOL: + if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOL: + if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OBOW: + if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp > m->beginp && + !ISWORD(*(sp-1))) ) && + (sp < m->endp && ISWORD(*sp)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOW: + if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp < m->endp && !ISWORD(*sp)) ) && + (sp > m->beginp && ISWORD(*(sp-1))) ) + { /* yes */ } + else + return(NULL); + break; + case O_QUEST: + break; + case OOR1: /* matches null but needs to skip */ + ss++; + s = m->g->strip[ss]; + do { + assert(OP(s) == OOR2); + ss += OPND(s); + } while (OP(s = m->g->strip[ss]) != O_CH); + /* note that the ss++ gets us past the O_CH */ + break; + default: /* have to make a choice */ + hard = 1; + break; + } + if (!hard) { /* that was it! */ + if (sp != stop) + return(NULL); + return(sp); + } + ss--; /* adjust for the for's final increment */ + + /* the hard stuff */ + AT("hard", sp, stop, ss, stopst); + s = m->g->strip[ss]; + switch (OP(s)) { + case OBACK_: /* the vilest depths */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + if (m->pmatch[i].rm_eo == -1) + return(NULL); + assert(m->pmatch[i].rm_so != -1); + len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; + assert(stop - m->beginp >= len); + if (sp > stop - len) + return(NULL); /* not enough left to match */ + ssp = m->offp + m->pmatch[i].rm_so; + if (memcmp(sp, ssp, len) != 0) + return(NULL); + while (m->g->strip[ss] != SOP(O_BACK, i)) + ss++; + return(backref(m, sp+len, stop, ss+1, stopst, lev)); + break; + case OQUEST_: /* to null or not */ + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); /* not */ + return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); + break; + case OPLUS_: + assert(m->lastpos != NULL); + assert(lev+1 <= m->g->nplus); + m->lastpos[lev+1] = sp; + return(backref(m, sp, stop, ss+1, stopst, lev+1)); + break; + case O_PLUS: + if (sp == m->lastpos[lev]) /* last pass matched null */ + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + /* try another pass */ + m->lastpos[lev] = sp; + dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); + if (dp == NULL) + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + else + return(dp); + break; + case OCH_: /* find the right one, if any */ + ssub = ss + 1; + esub = ss + OPND(s) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + dp = backref(m, sp, stop, ssub, esub, lev); + if (dp != NULL) + return(dp); + /* that one missed, try next one */ + if (OP(m->g->strip[esub]) == O_CH) + return(NULL); /* there is none */ + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + break; + case OLPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_so; + m->pmatch[i].rm_so = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_so = offsave; + return(NULL); + break; + case ORPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_eo; + m->pmatch[i].rm_eo = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_eo = offsave; + return(NULL); + break; + default: /* uh oh */ + assert(nope); + break; + } + + /* "can't happen" */ + assert(nope); + /* NOTREACHED */ + return((char *)NULL); /* dummy */ +} + +/* + - fast - step through the string at top speed + == static char *fast(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where tentative match ended, or NULL */ +fast(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states fresh = m->fresh; + register states tmp = m->tmp; + register char *p = start; + register int c = (start == m->beginp) ? OUT : *(start-1); + register int lastc; /* previous c */ + register int flagch; + register int i; + register char *coldp; /* last p after which no match was underway */ + + CLEAR(st); + SET1(st, startst); + st = step(m->g, startst, stopst, st, NOTHING, st); + ASSIGN(fresh, st); + SP("start", st, *p); + coldp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + if (EQ(st, fresh)) + coldp = p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("boleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("boweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, fresh); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("aft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + assert(coldp != NULL); + m->coldp = coldp; + if (ISSET(st, stopst)) + return(p+1); + else + return(NULL); +} + +/* + - slow - step through the string more deliberately + == static char *slow(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where it ended */ +slow(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states empty = m->empty; + register states tmp = m->tmp; + register char *p = start; + register int c = (start == m->beginp) ? OUT : *(start-1); + register int lastc; /* previous c */ + register int flagch; + register int i; + register char *matchp; /* last p at which a match ended */ + + AT("slow", start, stop, startst, stopst); + CLEAR(st); + SET1(st, startst); + SP("sstart", st, *p); + st = step(m->g, startst, stopst, st, NOTHING, st); + matchp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst)) + matchp = p; + if (EQ(st, empty) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, empty); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("saft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + return(matchp); +} + + +/* + - step - map set of states reachable before char to set reachable after + == static states step(register struct re_guts *g, sopno start, sopno stop, \ + == register states bef, int ch, register states aft); + == #define BOL (OUT+1) + == #define EOL (BOL+1) + == #define BOLEOL (BOL+2) + == #define NOTHING (BOL+3) + == #define BOW (BOL+4) + == #define EOW (BOL+5) + == #define CODEMAX (BOL+5) // highest code used + == #define NONCHAR(c) ((c) > CHAR_MAX) + == #define NNONCHAR (CODEMAX-CHAR_MAX) + */ +static states +step(g, start, stop, bef, ch, aft) +register struct re_guts *g; +sopno start; /* start state within strip */ +sopno stop; /* state after stop state within strip */ +register states bef; /* states reachable before */ +int ch; /* character or NONCHAR code */ +register states aft; /* states already known reachable after */ +{ + register cset *cs; + register sop s; + register sopno pc; + register onestate here; /* note, macros know this name */ + register sopno look; + register long i; + + for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { + s = g->strip[pc]; + switch (OP(s)) { + case OEND: + assert(pc == stop-1); + break; + case OCHAR: + /* only characters can match */ + assert(!NONCHAR(ch) || ch != (char)OPND(s)); + if (ch == (char)OPND(s)) + FWD(aft, bef, 1); + break; + case OBOL: + if (ch == BOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OEOL: + if (ch == EOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OBOW: + if (ch == BOW) + FWD(aft, bef, 1); + break; + case OEOW: + if (ch == EOW) + FWD(aft, bef, 1); + break; + case OANY: + if (!NONCHAR(ch)) + FWD(aft, bef, 1); + break; + case OANYOF: + cs = &g->sets[OPND(s)]; + if (!NONCHAR(ch) && CHIN(cs, ch)) + FWD(aft, bef, 1); + break; + case OBACK_: /* ignored here */ + case O_BACK: + FWD(aft, aft, 1); + break; + case OPLUS_: /* forward, this is just an empty */ + FWD(aft, aft, 1); + break; + case O_PLUS: /* both forward and back */ + FWD(aft, aft, 1); + i = ISSETBACK(aft, OPND(s)); + BACK(aft, aft, OPND(s)); + if (!i && ISSETBACK(aft, OPND(s))) { + /* oho, must reconsider loop body */ + pc -= OPND(s) + 1; + INIT(here, pc); + } + break; + case OQUEST_: /* two branches, both forward */ + FWD(aft, aft, 1); + FWD(aft, aft, OPND(s)); + break; + case O_QUEST: /* just an empty */ + FWD(aft, aft, 1); + break; + case OLPAREN: /* not significant here */ + case ORPAREN: + FWD(aft, aft, 1); + break; + case OCH_: /* mark the first two branches */ + FWD(aft, aft, 1); + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + break; + case OOR1: /* done a branch, find the O_CH */ + if (ISSTATEIN(aft, here)) { + for (look = 1; + OP(s = g->strip[pc+look]) != O_CH; + look += OPND(s)) + assert(OP(s) == OOR2); + FWD(aft, aft, look); + } + break; + case OOR2: /* propagate OCH_'s marking */ + FWD(aft, aft, 1); + if (OP(g->strip[pc+OPND(s)]) != O_CH) { + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + } + break; + case O_CH: /* just empty */ + FWD(aft, aft, 1); + break; + default: /* ooooops... */ + assert(nope); + break; + } + } + + return(aft); +} + +#ifdef REDEBUG +/* + - print - print a set of states + == #ifdef REDEBUG + == static void print(struct match *m, char *caption, states st, \ + == int ch, FILE *d); + == #endif + */ +static void +print(m, caption, st, ch, d) +struct match *m; +char *caption; +states st; +int ch; +FILE *d; +{ + register struct re_guts *g = m->g; + register int i; + register int first = 1; + + if (!(m->eflags®_TRACE)) + return; + + fprintf(d, "%s", caption); + if (ch != '\0') + fprintf(d, " %s", pchar(ch)); + for (i = 0; i < g->nstates; i++) + if (ISSET(st, i)) { + fprintf(d, "%s%d", (first) ? "\t" : ", ", i); + first = 0; + } + fprintf(d, "\n"); +} + +/* + - at - print current situation + == #ifdef REDEBUG + == static void at(struct match *m, char *title, char *start, char *stop, \ + == sopno startst, sopno stopst); + == #endif + */ +static void +at(m, title, start, stop, startst, stopst) +struct match *m; +char *title; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + if (!(m->eflags®_TRACE)) + return; + + printf("%s %s-", title, pchar(*start)); + printf("%s ", pchar(*stop)); + printf("%ld-%ld\n", (long)startst, (long)stopst); +} + +#ifndef PCHARDONE +#define PCHARDONE /* never again */ +/* + - pchar - make a character printable + == #ifdef REDEBUG + == static char *pchar(int ch); + == #endif + * + * Is this identical to regchar() over in debug.c? Well, yes. But a + * duplicate here avoids having a debugging-capable regexec.o tied to + * a matching debug.o, and this is convenient. It all disappears in + * the non-debug compilation anyway, so it doesn't matter much. + */ +static char * /* -> representation */ +pchar(ch) +int ch; +{ + static char pbuf[10]; + + if (isprint(ch) || ch == ' ') + sprintf(pbuf, "%c", ch); + else + sprintf(pbuf, "\\%o", ch); + return(pbuf); +} +#endif +#endif + +#undef matcher +#undef fast +#undef slow +#undef dissect +#undef backref +#undef step +#undef print +#undef at +#undef match diff --git a/vcnet/regex/engine.ih b/vcnet/regex/engine.ih new file mode 100644 index 0000000..cc98334 --- /dev/null +++ b/vcnet/regex/engine.ih @@ -0,0 +1,35 @@ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === engine.c === */ +static int matcher(register struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[], int eflags); +static char *dissect(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *backref(register struct match *m, char *start, char *stop, sopno startst, sopno stopst, sopno lev); +static char *fast(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static char *slow(register struct match *m, char *start, char *stop, sopno startst, sopno stopst); +static states step(register struct re_guts *g, sopno start, sopno stop, register states bef, int ch, register states aft); +#define BOL (OUT+1) +#define EOL (BOL+1) +#define BOLEOL (BOL+2) +#define NOTHING (BOL+3) +#define BOW (BOL+4) +#define EOW (BOL+5) +#define CODEMAX (BOL+5) /* highest code used */ +#define NONCHAR(c) ((c) > CHAR_MAX) +#define NNONCHAR (CODEMAX-CHAR_MAX) +#ifdef REDEBUG +static void print(struct match *m, char *caption, states st, int ch, FILE *d); +#endif +#ifdef REDEBUG +static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst); +#endif +#ifdef REDEBUG +static char *pchar(int ch); +#endif + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ diff --git a/vcnet/regex/main.c b/vcnet/regex/main.c new file mode 100644 index 0000000..0221e77 --- /dev/null +++ b/vcnet/regex/main.c @@ -0,0 +1,510 @@ +#include +#include +#include +#include +#include + +#include "main.ih" + +char *progname; +int debug = 0; +int line = 0; +int status = 0; + +int copts = REG_EXTENDED; +int eopts = 0; +regoff_t startoff = 0; +regoff_t endoff = 0; + + +extern int split(); +extern void regprint(); + +/* + - main - do the simple case, hand off to regress() for regression + */ +main(argc, argv) +int argc; +char *argv[]; +{ + regex_t re; +# define NS 10 + regmatch_t subs[NS]; + char erbuf[100]; + int err; + size_t len; + int c; + int errflg = 0; + register int i; + extern int optind; + extern char *optarg; + + progname = argv[0]; + + while ((c = getopt(argc, argv, "c:e:S:E:x")) != EOF) + switch (c) { + case 'c': /* compile options */ + copts = options('c', optarg); + break; + case 'e': /* execute options */ + eopts = options('e', optarg); + break; + case 'S': /* start offset */ + startoff = (regoff_t)atoi(optarg); + break; + case 'E': /* end offset */ + endoff = (regoff_t)atoi(optarg); + break; + case 'x': /* Debugging. */ + debug++; + break; + case '?': + default: + errflg++; + break; + } + if (errflg) { + fprintf(stderr, "usage: %s ", progname); + fprintf(stderr, "[-c copt][-C][-d] [re]\n"); + exit(2); + } + + if (optind >= argc) { + regress(stdin); + exit(status); + } + + err = regcomp(&re, argv[optind++], copts); + if (err) { + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "error %s, %d/%d `%s'\n", + eprint(err), len, sizeof(erbuf), erbuf); + exit(status); + } + regprint(&re, stdout); + + if (optind >= argc) { + regfree(&re); + exit(status); + } + + if (eopts®_STARTEND) { + subs[0].rm_so = startoff; + subs[0].rm_eo = strlen(argv[optind]) - endoff; + } + err = regexec(&re, argv[optind], (size_t)NS, subs, eopts); + if (err) { + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "error %s, %d/%d `%s'\n", + eprint(err), len, sizeof(erbuf), erbuf); + exit(status); + } + if (!(copts®_NOSUB)) { + len = (int)(subs[0].rm_eo - subs[0].rm_so); + if (subs[0].rm_so != -1) { + if (len != 0) + printf("match `%.*s'\n", len, + argv[optind] + subs[0].rm_so); + else + printf("match `'@%.1s\n", + argv[optind] + subs[0].rm_so); + } + for (i = 1; i < NS; i++) + if (subs[i].rm_so != -1) + printf("(%d) `%.*s'\n", i, + (int)(subs[i].rm_eo - subs[i].rm_so), + argv[optind] + subs[i].rm_so); + } + exit(status); +} + +/* + - regress - main loop of regression test + == void regress(FILE *in); + */ +void +regress(in) +FILE *in; +{ + char inbuf[1000]; +# define MAXF 10 + char *f[MAXF]; + int nf; + int i; + char erbuf[100]; + size_t ne; + char *badpat = "invalid regular expression"; +# define SHORT 10 + char *bpname = "REG_BADPAT"; + regex_t re; + + while (fgets(inbuf, sizeof(inbuf), in) != NULL) { + line++; + if (inbuf[0] == '#' || inbuf[0] == '\n') + continue; /* NOTE CONTINUE */ + inbuf[strlen(inbuf)-1] = '\0'; /* get rid of stupid \n */ + if (debug) + fprintf(stdout, "%d:\n", line); + nf = split(inbuf, f, MAXF, "\t\t"); + if (nf < 3) { + fprintf(stderr, "bad input, line %d\n", line); + exit(1); + } + for (i = 0; i < nf; i++) + if (strcmp(f[i], "\"\"") == 0) + f[i] = ""; + if (nf <= 3) + f[3] = NULL; + if (nf <= 4) + f[4] = NULL; + try(f[0], f[1], f[2], f[3], f[4], options('c', f[1])); + if (opt('&', f[1])) /* try with either type of RE */ + try(f[0], f[1], f[2], f[3], f[4], + options('c', f[1]) &~ REG_EXTENDED); + } + + ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf)); + if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) { + fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n", + erbuf, badpat); + status = 1; + } + ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT); + if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' || + ne != strlen(badpat)+1) { + fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n", + erbuf, SHORT-1, badpat); + status = 1; + } + ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf)); + if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) { + fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n", + erbuf, bpname); + status = 1; + } + re.re_endp = bpname; + ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf)); + if (atoi(erbuf) != (int)REG_BADPAT) { + fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n", + erbuf, (long)REG_BADPAT); + status = 1; + } else if (ne != strlen(erbuf)+1) { + fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n", + erbuf, (long)REG_BADPAT); + status = 1; + } +} + +/* + - try - try it, and report on problems + == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts); + */ +void +try(f0, f1, f2, f3, f4, opts) +char *f0; +char *f1; +char *f2; +char *f3; +char *f4; +int opts; /* may not match f1 */ +{ + regex_t re; +# define NSUBS 10 + regmatch_t subs[NSUBS]; +# define NSHOULD 15 + char *should[NSHOULD]; + int nshould; + char erbuf[100]; + int err; + int len; + char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE"; + register int i; + char *grump; + char f0copy[1000]; + char f2copy[1000]; + + strcpy(f0copy, f0); + re.re_endp = (opts®_PEND) ? f0copy + strlen(f0copy) : NULL; + fixstr(f0copy); + err = regcomp(&re, f0copy, opts); + if (err != 0 && (!opt('C', f1) || err != efind(f2))) { + /* unexpected error or wrong error */ + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "%d: %s error %s, %d/%d `%s'\n", + line, type, eprint(err), len, + sizeof(erbuf), erbuf); + status = 1; + } else if (err == 0 && opt('C', f1)) { + /* unexpected success */ + fprintf(stderr, "%d: %s should have given REG_%s\n", + line, type, f2); + status = 1; + err = 1; /* so we won't try regexec */ + } + + if (err != 0) { + regfree(&re); + return; + } + + strcpy(f2copy, f2); + fixstr(f2copy); + + if (options('e', f1)®_STARTEND) { + if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL) + fprintf(stderr, "%d: bad STARTEND syntax\n", line); + subs[0].rm_so = strchr(f2, '(') - f2 + 1; + subs[0].rm_eo = strchr(f2, ')') - f2; + } + err = regexec(&re, f2copy, NSUBS, subs, options('e', f1)); + + if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) { + /* unexpected error or wrong error */ + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "%d: %s exec error %s, %d/%d `%s'\n", + line, type, eprint(err), len, + sizeof(erbuf), erbuf); + status = 1; + } else if (err != 0) { + /* nothing more to check */ + } else if (f3 == NULL) { + /* unexpected success */ + fprintf(stderr, "%d: %s exec should have failed\n", + line, type); + status = 1; + err = 1; /* just on principle */ + } else if (opts®_NOSUB) { + /* nothing more to check */ + } else if ((grump = check(f2, subs[0], f3)) != NULL) { + fprintf(stderr, "%d: %s %s\n", line, type, grump); + status = 1; + err = 1; + } + + if (err != 0 || f4 == NULL) { + regfree(&re); + return; + } + + for (i = 1; i < NSHOULD; i++) + should[i] = NULL; + nshould = split(f4, should+1, NSHOULD-1, ","); + if (nshould == 0) { + nshould = 1; + should[1] = ""; + } + for (i = 1; i < NSUBS; i++) { + grump = check(f2, subs[i], should[i]); + if (grump != NULL) { + fprintf(stderr, "%d: %s $%d %s\n", line, + type, i, grump); + status = 1; + err = 1; + } + } + + regfree(&re); +} + +/* + - options - pick options out of a regression-test string + == int options(int type, char *s); + */ +int +options(type, s) +int type; /* 'c' compile, 'e' exec */ +char *s; +{ + register char *p; + register int o = (type == 'c') ? copts : eopts; + register char *legal = (type == 'c') ? "bisnmp" : "^$#tl"; + + for (p = s; *p != '\0'; p++) + if (strchr(legal, *p) != NULL) + switch (*p) { + case 'b': + o &= ~REG_EXTENDED; + break; + case 'i': + o |= REG_ICASE; + break; + case 's': + o |= REG_NOSUB; + break; + case 'n': + o |= REG_NEWLINE; + break; + case 'm': + o &= ~REG_EXTENDED; + o |= REG_NOSPEC; + break; + case 'p': + o |= REG_PEND; + break; + case '^': + o |= REG_NOTBOL; + break; + case '$': + o |= REG_NOTEOL; + break; + case '#': + o |= REG_STARTEND; + break; + case 't': /* trace */ + o |= REG_TRACE; + break; + case 'l': /* force long representation */ + o |= REG_LARGE; + break; + case 'r': /* force backref use */ + o |= REG_BACKR; + break; + } + return(o); +} + +/* + - opt - is a particular option in a regression string? + == int opt(int c, char *s); + */ +int /* predicate */ +opt(c, s) +int c; +char *s; +{ + return(strchr(s, c) != NULL); +} + +/* + - fixstr - transform magic characters in strings + == void fixstr(register char *p); + */ +void +fixstr(p) +register char *p; +{ + if (p == NULL) + return; + + for (; *p != '\0'; p++) + if (*p == 'N') + *p = '\n'; + else if (*p == 'T') + *p = '\t'; + else if (*p == 'S') + *p = ' '; + else if (*p == 'Z') + *p = '\0'; +} + +/* + - check - check a substring match + == char *check(char *str, regmatch_t sub, char *should); + */ +char * /* NULL or complaint */ +check(str, sub, should) +char *str; +regmatch_t sub; +char *should; +{ + register int len; + register int shlen; + register char *p; + static char grump[500]; + register char *at = NULL; + + if (should != NULL && strcmp(should, "-") == 0) + should = NULL; + if (should != NULL && should[0] == '@') { + at = should + 1; + should = ""; + } + + /* check rm_so and rm_eo for consistency */ + if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) || + (sub.rm_so != -1 && sub.rm_eo == -1) || + (sub.rm_so != -1 && sub.rm_so < 0) || + (sub.rm_eo != -1 && sub.rm_eo < 0) ) { + sprintf(grump, "start %ld end %ld", (long)sub.rm_so, + (long)sub.rm_eo); + return(grump); + } + + /* check for no match */ + if (sub.rm_so == -1 && should == NULL) + return(NULL); + if (sub.rm_so == -1) + return("did not match"); + + /* check for in range */ + if (sub.rm_eo > strlen(str)) { + sprintf(grump, "start %ld end %ld, past end of string", + (long)sub.rm_so, (long)sub.rm_eo); + return(grump); + } + + len = (int)(sub.rm_eo - sub.rm_so); + shlen = (int)strlen(should); + p = str + sub.rm_so; + + /* check for not supposed to match */ + if (should == NULL) { + sprintf(grump, "matched `%.*s'", len, p); + return(grump); + } + + /* check for wrong match */ + if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) { + sprintf(grump, "matched `%.*s' instead", len, p); + return(grump); + } + if (shlen > 0) + return(NULL); + + /* check null match in right place */ + if (at == NULL) + return(NULL); + shlen = strlen(at); + if (shlen == 0) + shlen = 1; /* force check for end-of-string */ + if (strncmp(p, at, shlen) != 0) { + sprintf(grump, "matched null at `%.20s'", p); + return(grump); + } + return(NULL); +} + +/* + - eprint - convert error number to name + == static char *eprint(int err); + */ +static char * +eprint(err) +int err; +{ + static char epbuf[100]; + size_t len; + + len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf)); + assert(len <= sizeof(epbuf)); + return(epbuf); +} + +/* + - efind - convert error name to number + == static int efind(char *name); + */ +static int +efind(name) +char *name; +{ + static char efbuf[100]; + size_t n; + regex_t re; + + sprintf(efbuf, "REG_%s", name); + assert(strlen(efbuf) < sizeof(efbuf)); + re.re_endp = efbuf; + (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf)); + return(atoi(efbuf)); +} diff --git a/vcnet/regex/main.ih b/vcnet/regex/main.ih new file mode 100644 index 0000000..5a0118a --- /dev/null +++ b/vcnet/regex/main.ih @@ -0,0 +1,19 @@ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === main.c === */ +void regress(FILE *in); +void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts); +int options(int type, char *s); +int opt(int c, char *s); +void fixstr(register char *p); +char *check(char *str, regmatch_t sub, char *should); +static char *eprint(int err); +static int efind(char *name); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ diff --git a/vcnet/regex/mkh b/vcnet/regex/mkh new file mode 100644 index 0000000..252b246 --- /dev/null +++ b/vcnet/regex/mkh @@ -0,0 +1,76 @@ +#! /bin/sh +# mkh - pull headers out of C source +PATH=/bin:/usr/bin ; export PATH + +# egrep pattern to pick out marked lines +egrep='^ =([ ]|$)' + +# Sed program to process marked lines into lines for the header file. +# The markers have already been removed. Two things are done here: removal +# of backslashed newlines, and some fudging of comments. The first is done +# because -o needs to have prototypes on one line to strip them down. +# Getting comments into the output is tricky; we turn C++-style // comments +# into /* */ comments, after altering any existing */'s to avoid trouble. +peel=' /\\$/N + /\\\n[ ]*/s///g + /\/\//s;\*/;* /;g + /\/\//s;//\(.*\);/*\1 */;' + +for a +do + case "$a" in + -o) # old (pre-function-prototype) compiler + # add code to comment out argument lists + peel="$peel + "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);' + shift + ;; + -b) # funny Berkeley __P macro + peel="$peel + "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));' + shift + ;; + -s) # compiler doesn't like `static foo();' + # add code to get rid of the `static' + peel="$peel + "'/^static[ ][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;' + shift + ;; + -p) # private declarations + egrep='^ ==([ ]|$)' + shift + ;; + -i) # wrap in #ifndef, argument is name + ifndef="$2" + shift ; shift + ;; + *) break + ;; + esac +done + +if test " $ifndef" != " " +then + echo "#ifndef $ifndef" + echo "#define $ifndef /* never again */" +fi +echo "/* ========= begin header generated by $0 ========= */" +echo '#ifdef __cplusplus' +echo 'extern "C" {' +echo '#endif' +for f +do + echo + echo "/* === $f === */" + egrep "$egrep" $f | sed 's/^ ==*[ ]//;s/^ ==*$//' | sed "$peel" + echo +done +echo '#ifdef __cplusplus' +echo '}' +echo '#endif' +echo "/* ========= end header generated by $0 ========= */" +if test " $ifndef" != " " +then + echo "#endif" +fi +exit 0 diff --git a/vcnet/regex/regcomp.c b/vcnet/regex/regcomp.c new file mode 100644 index 0000000..5df5d53 --- /dev/null +++ b/vcnet/regex/regcomp.c @@ -0,0 +1,1603 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +#include "cclass.h" +#include "cname.h" + +/* + * parse structure, passed up and down to avoid global variables and + * other clumsinesses + */ +struct parse { + char *next; /* next character in RE */ + char *end; /* end of string (-> NUL normally) */ + int error; /* has an error been seen? */ + sop *strip; /* malloced strip */ + sopno ssize; /* malloced strip size (allocated) */ + sopno slen; /* malloced strip length (used) */ + int ncsalloc; /* number of csets allocated */ + struct re_guts *g; +# define NPAREN 10 /* we need to remember () 1-9 for back refs */ + sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ + sopno pend[NPAREN]; /* -> ) ([0] unused) */ +}; + +#include "regcomp.ih" + +static char nuls[10]; /* place to point scanner in event of error */ + +/* + * macros for use with parse structure + * BEWARE: these know that the parse structure is named `p' !!! + */ +#define PEEK() (*p->next) +#define PEEK2() (*(p->next+1)) +#define MORE() (p->next < p->end) +#define MORE2() (p->next+1 < p->end) +#define SEE(c) (MORE() && PEEK() == (c)) +#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) +#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) +#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) +#define NEXT() (p->next++) +#define NEXT2() (p->next += 2) +#define NEXTn(n) (p->next += (n)) +#define GETNEXT() (*p->next++) +#define SETERROR(e) seterr(p, (e)) +#define REQUIRE(co, e) ((co) || SETERROR(e)) +#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) +#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) +#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) +#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) +#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) +#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) +#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) +#define HERE() (p->slen) +#define THERE() (p->slen - 1) +#define THERETHERE() (p->slen - 2) +#define DROP(n) (p->slen -= (n)) + +#ifndef NDEBUG +static int never = 0; /* for use in asserts; shuts lint up */ +#else +#define never 0 /* some s have bugs too */ +#endif + +/* + - regcomp - interface for parser and compilation + = extern int regcomp(regex_t *, const char *, int); + = #define REG_BASIC 0000 + = #define REG_EXTENDED 0001 + = #define REG_ICASE 0002 + = #define REG_NOSUB 0004 + = #define REG_NEWLINE 0010 + = #define REG_NOSPEC 0020 + = #define REG_PEND 0040 + = #define REG_DUMP 0200 + */ +int /* 0 success, otherwise REG_something */ +regcomp(preg, pattern, cflags) +regex_t *preg; +const char *pattern; +int cflags; +{ + struct parse pa; + register struct re_guts *g; + register struct parse *p = &pa; + register int i; + register size_t len; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&~REG_DUMP) +#endif + + cflags = GOODFLAGS(cflags); + if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) + return(REG_INVARG); + + if (cflags®_PEND) { + if (preg->re_endp < pattern) + return(REG_INVARG); + len = preg->re_endp - pattern; + } else + len = strlen((char *)pattern); + + /* do the mallocs early so failure handling is easy */ + g = (struct re_guts *)malloc(sizeof(struct re_guts) + + (NC-1)*sizeof(cat_t)); + if (g == NULL) + return(REG_ESPACE); + p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ + p->strip = (sop *)malloc(p->ssize * sizeof(sop)); + p->slen = 0; + if (p->strip == NULL) { + free((char *)g); + return(REG_ESPACE); + } + + /* set things up */ + p->g = g; + p->next = (char *)pattern; /* convenience; we do not modify it */ + p->end = p->next + len; + p->error = 0; + p->ncsalloc = 0; + for (i = 0; i < NPAREN; i++) { + p->pbegin[i] = 0; + p->pend[i] = 0; + } + g->csetsize = NC; + g->sets = NULL; + g->setbits = NULL; + g->ncsets = 0; + g->cflags = cflags; + g->iflags = 0; + g->nbol = 0; + g->neol = 0; + g->must = NULL; + g->mlen = 0; + g->nsub = 0; + g->ncategories = 1; /* category 0 is "everything else" */ + g->categories = &g->catspace[-(CHAR_MIN)]; + (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); + g->backrefs = 0; + + /* do it */ + EMIT(OEND, 0); + g->firststate = THERE(); + if (cflags®_EXTENDED) + p_ere(p, OUT); + else if (cflags®_NOSPEC) + p_str(p); + else + p_bre(p, OUT, OUT); + EMIT(OEND, 0); + g->laststate = THERE(); + + /* tidy up loose ends and fill things in */ + categorize(p, g); + stripsnug(p, g); + findmust(p, g); + g->nplus = pluscount(p, g); + g->magic = MAGIC2; + preg->re_nsub = g->nsub; + preg->re_g = g; + preg->re_magic = MAGIC1; +#ifndef REDEBUG + /* not debugging, so can't rely on the assert() in regexec() */ + if (g->iflags&BAD) + SETERROR(REG_ASSERT); +#endif + + /* win or lose, we're done */ + if (p->error != 0) /* lose */ + regfree(preg); + return(p->error); +} + +/* + - p_ere - ERE parser top level, concatenation and alternation + == static void p_ere(register struct parse *p, int stop); + */ +static void +p_ere(p, stop) +register struct parse *p; +int stop; /* character this ERE should end at */ +{ + register char c; + register sopno prevback; + register sopno prevfwd; + register sopno conc; + register int first = 1; /* is this the first alternative? */ + + for (;;) { + /* do a bunch of concatenated expressions */ + conc = HERE(); + while (MORE() && (c = PEEK()) != '|' && c != stop) + p_ere_exp(p); + REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ + + if (!EAT('|')) + break; /* NOTE BREAK OUT */ + + if (first) { + INSERT(OCH_, conc); /* offset is wrong */ + prevfwd = conc; + prevback = conc; + first = 0; + } + ASTERN(OOR1, prevback); + prevback = THERE(); + AHEAD(prevfwd); /* fix previous offset */ + prevfwd = HERE(); + EMIT(OOR2, 0); /* offset is very wrong */ + } + + if (!first) { /* tail-end fixups */ + AHEAD(prevfwd); + ASTERN(O_CH, prevback); + } + + assert(!MORE() || SEE(stop)); +} + +/* + - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op + == static void p_ere_exp(register struct parse *p); + */ +static void +p_ere_exp(p) +register struct parse *p; +{ + register char c; + register sopno pos; + register int count; + register int count2; + register sopno subno; + int wascaret = 0; + + assert(MORE()); /* caller should have ensured this */ + c = GETNEXT(); + + pos = HERE(); + switch (c) { + case '(': + REQUIRE(MORE(), REG_EPAREN); + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + if (!SEE(')')) + p_ere(p, ')'); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + MUSTEAT(')', REG_EPAREN); + break; +#ifndef POSIX_MISTAKE + case ')': /* happens only if no current unmatched ( */ + /* + * You may ask, why the ifndef? Because I didn't notice + * this until slightly too late for 1003.2, and none of the + * other 1003.2 regular-expression reviewers noticed it at + * all. So an unmatched ) is legal POSIX, at least until + * we can get it fixed. + */ + SETERROR(REG_EPAREN); + break; +#endif + case '^': + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + wascaret = 1; + break; + case '$': + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + break; + case '|': + SETERROR(REG_EMPTY); + break; + case '*': + case '+': + case '?': + SETERROR(REG_BADRPT); + break; + case '.': + if (p->g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case '\\': + REQUIRE(MORE(), REG_EESCAPE); + c = GETNEXT(); + ordinary(p, c); + break; + case '{': /* okay as ordinary except if digit follows */ + REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, c); + break; + } + + if (!MORE()) + return; + c = PEEK(); + /* we call { a repetition if followed by a digit */ + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit(PEEK2())) )) + return; /* no repetition, we're done */ + NEXT(); + + REQUIRE(!wascaret, REG_BADRPT); + switch (c) { + case '*': /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + break; + case '+': + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + break; + case '?': + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, pos); /* offset slightly wrong */ + ASTERN(OOR1, pos); /* this one's right */ + AHEAD(pos); /* fix the OCH_ */ + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + break; + case '{': + count = p_count(p); + if (EAT(',')) { + if (isdigit(PEEK())) { + count2 = p_count(p); + REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2); + if (!EAT('}')) { /* error heuristics */ + while (MORE() && PEEK() != '}') + NEXT(); + REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + break; + } + + if (!MORE()) + return; + c = PEEK(); + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit(PEEK2())) ) ) + return; + SETERROR(REG_BADRPT); +} + +/* + - p_str - string (no metacharacters) "parser" + == static void p_str(register struct parse *p); + */ +static void +p_str(p) +register struct parse *p; +{ + REQUIRE(MORE(), REG_EMPTY); + while (MORE()) + ordinary(p, GETNEXT()); +} + +/* + - p_bre - BRE parser top level, anchoring and concatenation + == static void p_bre(register struct parse *p, register int end1, \ + == register int end2); + * Giving end1 as OUT essentially eliminates the end1/end2 check. + * + * This implementation is a bit of a kludge, in that a trailing $ is first + * taken as an ordinary character and then revised to be an anchor. The + * only undesirable side effect is that '$' gets included as a character + * category in such cases. This is fairly harmless; not worth fixing. + * The amount of lookahead needed to avoid this kludge is excessive. + */ +static void +p_bre(p, end1, end2) +register struct parse *p; +register int end1; /* first terminating character */ +register int end2; /* second terminating character */ +{ + register sopno start = HERE(); + register int first = 1; /* first subexpression? */ + register int wasdollar = 0; + + if (EAT('^')) { + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + } + while (MORE() && !SEETWO(end1, end2)) { + wasdollar = p_simp_re(p, first); + first = 0; + } + if (wasdollar) { /* oops, that was a trailing anchor */ + DROP(1); + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + } + + REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ +} + +/* + - p_simp_re - parse a simple RE, an atom possibly followed by a repetition + == static int p_simp_re(register struct parse *p, int starordinary); + */ +static int /* was the simple RE an unbackslashed $? */ +p_simp_re(p, starordinary) +register struct parse *p; +int starordinary; /* is a leading * an ordinary character? */ +{ + register int c; + register int count; + register int count2; + register sopno pos; + register int i; + register sopno subno; +# define BACKSL (1<g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case BACKSL|'{': + SETERROR(REG_BADRPT); + break; + case BACKSL|'(': + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + /* the MORE here is an error heuristic */ + if (MORE() && !SEETWO('\\', ')')) + p_bre(p, '\\', ')'); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + REQUIRE(EATTWO('\\', ')'), REG_EPAREN); + break; + case BACKSL|')': /* should not get here -- must be user */ + case BACKSL|'}': + SETERROR(REG_EPAREN); + break; + case BACKSL|'1': + case BACKSL|'2': + case BACKSL|'3': + case BACKSL|'4': + case BACKSL|'5': + case BACKSL|'6': + case BACKSL|'7': + case BACKSL|'8': + case BACKSL|'9': + i = (c&~BACKSL) - '0'; + assert(i < NPAREN); + if (p->pend[i] != 0) { + assert(i <= p->g->nsub); + EMIT(OBACK_, i); + assert(p->pbegin[i] != 0); + assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); + assert(OP(p->strip[p->pend[i]]) == ORPAREN); + (void) dupl(p, p->pbegin[i]+1, p->pend[i]); + EMIT(O_BACK, i); + } else + SETERROR(REG_ESUBREG); + p->g->backrefs = 1; + break; + case '*': + REQUIRE(starordinary, REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, (char)c); /* takes off BACKSL, if any */ + break; + } + + if (EAT('*')) { /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + } else if (EATTWO('\\', '{')) { + count = p_count(p); + if (EAT(',')) { + if (MORE() && isdigit(PEEK())) { + count2 = p_count(p); + REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2); + if (!EATTWO('\\', '}')) { /* error heuristics */ + while (MORE() && !SEETWO('\\', '}')) + NEXT(); + REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ + return(1); + + return(0); +} + +/* + - p_count - parse a repetition count + == static int p_count(register struct parse *p); + */ +static int /* the value */ +p_count(p) +register struct parse *p; +{ + register int count = 0; + register int ndigits = 0; + + while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { + count = count*10 + (GETNEXT() - '0'); + ndigits++; + } + + REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); + return(count); +} + +/* + - p_bracket - parse a bracketed character list + == static void p_bracket(register struct parse *p); + * + * Note a significant property of this code: if the allocset() did SETERROR, + * no set operations are done. + */ +static void +p_bracket(p) +register struct parse *p; +{ + register cset *cs = allocset(p); + register int invert = 0; + + /* Dept of Truly Sickening Special-Case Kludges */ + if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { + EMIT(OBOW, 0); + NEXTn(6); + return; + } + if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { + EMIT(OEOW, 0); + NEXTn(6); + return; + } + + if (EAT('^')) + invert++; /* make note to invert set at end */ + if (EAT(']')) + CHadd(cs, ']'); + else if (EAT('-')) + CHadd(cs, '-'); + while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) + p_b_term(p, cs); + if (EAT('-')) + CHadd(cs, '-'); + MUSTEAT(']', REG_EBRACK); + + if (p->error != 0) /* don't mess things up further */ + return; + + if (p->g->cflags®_ICASE) { + register int i; + register int ci; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i) && isalpha(i)) { + ci = othercase(i); + if (ci != i) + CHadd(cs, ci); + } + if (cs->multis != NULL) + mccase(p, cs); + } + if (invert) { + register int i; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i)) + CHsub(cs, i); + else + CHadd(cs, i); + if (p->g->cflags®_NEWLINE) + CHsub(cs, '\n'); + if (cs->multis != NULL) + mcinvert(p, cs); + } + + assert(cs->multis == NULL); /* xxx */ + + if (nch(p, cs) == 1) { /* optimize singleton sets */ + ordinary(p, firstch(p, cs)); + freeset(p, cs); + } else + EMIT(OANYOF, freezeset(p, cs)); +} + +/* + - p_b_term - parse one term of a bracketed character list + == static void p_b_term(register struct parse *p, register cset *cs); + */ +static void +p_b_term(p, cs) +register struct parse *p; +register cset *cs; +{ + register char c; + register char start, finish; + register int i; + + /* classify what we've got */ + switch ((MORE()) ? PEEK() : '\0') { + case '[': + c = (MORE2()) ? PEEK2() : '\0'; + break; + case '-': + SETERROR(REG_ERANGE); + return; /* NOTE RETURN */ + break; + default: + c = '\0'; + break; + } + + switch (c) { + case ':': /* character class */ + NEXT2(); + REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + REQUIRE(c != '-' && c != ']', REG_ECTYPE); + p_b_cclass(p, cs); + REQUIRE(MORE(), REG_EBRACK); + REQUIRE(EATTWO(':', ']'), REG_ECTYPE); + break; + case '=': /* equivalence class */ + NEXT2(); + REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + REQUIRE(c != '-' && c != ']', REG_ECOLLATE); + p_b_eclass(p, cs); + REQUIRE(MORE(), REG_EBRACK); + REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); + break; + default: /* symbol, ordinary character, or range */ +/* xxx revision needed for multichar stuff */ + start = p_b_symbol(p); + if (SEE('-') && MORE2() && PEEK2() != ']') { + /* range */ + NEXT(); + if (EAT('-')) + finish = '-'; + else + finish = p_b_symbol(p); + } else + finish = start; +/* xxx what about signed chars here... */ + REQUIRE(start <= finish, REG_ERANGE); + for (i = start; i <= finish; i++) + CHadd(cs, i); + break; + } +} + +/* + - p_b_cclass - parse a character-class name and deal with it + == static void p_b_cclass(register struct parse *p, register cset *cs); + */ +static void +p_b_cclass(p, cs) +register struct parse *p; +register cset *cs; +{ + register char *sp = p->next; + register struct cclass *cp; + register size_t len; + register char *u; + register char c; + + while (MORE() && isalpha(PEEK())) + NEXT(); + len = p->next - sp; + for (cp = cclasses; cp->name != NULL; cp++) + if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') + break; + if (cp->name == NULL) { + /* oops, didn't find it */ + SETERROR(REG_ECTYPE); + return; + } + + u = cp->chars; + while ((c = *u++) != '\0') + CHadd(cs, c); + for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) + MCadd(p, cs, u); +} + +/* + - p_b_eclass - parse an equivalence-class name and deal with it + == static void p_b_eclass(register struct parse *p, register cset *cs); + * + * This implementation is incomplete. xxx + */ +static void +p_b_eclass(p, cs) +register struct parse *p; +register cset *cs; +{ + register char c; + + c = p_b_coll_elem(p, '='); + CHadd(cs, c); +} + +/* + - p_b_symbol - parse a character or [..]ed multicharacter collating symbol + == static char p_b_symbol(register struct parse *p); + */ +static char /* value of symbol */ +p_b_symbol(p) +register struct parse *p; +{ + register char value; + + REQUIRE(MORE(), REG_EBRACK); + if (!EATTWO('[', '.')) + return(GETNEXT()); + + /* collating symbol */ + value = p_b_coll_elem(p, '.'); + REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); + return(value); +} + +/* + - p_b_coll_elem - parse a collating-element name and look it up + == static char p_b_coll_elem(register struct parse *p, int endc); + */ +static char /* value of collating element */ +p_b_coll_elem(p, endc) +register struct parse *p; +int endc; /* name ended by endc,']' */ +{ + register char *sp = p->next; + register struct cname *cp; + register int len; + + while (MORE() && !SEETWO(endc, ']')) + NEXT(); + if (!MORE()) { + SETERROR(REG_EBRACK); + return(0); + } + len = p->next - sp; + for (cp = cnames; cp->name != NULL; cp++) + if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') + return(cp->code); /* known name */ + if (len == 1) + return(*sp); /* single character */ + SETERROR(REG_ECOLLATE); /* neither */ + return(0); +} + +/* + - othercase - return the case counterpart of an alphabetic + == static char othercase(int ch); + */ +static char /* if no counterpart, return ch */ +othercase(ch) +int ch; +{ + assert(isalpha(ch)); + if (isupper(ch)) + return(tolower(ch)); + else if (islower(ch)) + return(toupper(ch)); + else /* peculiar, but could happen */ + return(ch); +} + +/* + - bothcases - emit a dualcase version of a two-case character + == static void bothcases(register struct parse *p, int ch); + * + * Boy, is this implementation ever a kludge... + */ +static void +bothcases(p, ch) +register struct parse *p; +int ch; +{ + register char *oldnext = p->next; + register char *oldend = p->end; + char bracket[3]; + + assert(othercase(ch) != ch); /* p_bracket() would recurse */ + p->next = bracket; + p->end = bracket+2; + bracket[0] = ch; + bracket[1] = ']'; + bracket[2] = '\0'; + p_bracket(p); + assert(p->next == bracket+2); + p->next = oldnext; + p->end = oldend; +} + +/* + - ordinary - emit an ordinary character + == static void ordinary(register struct parse *p, register int ch); + */ +static void +ordinary(p, ch) +register struct parse *p; +register int ch; +{ + register cat_t *cap = p->g->categories; + + if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) + bothcases(p, ch); + else { + EMIT(OCHAR, (unsigned char)ch); + if (cap[ch] == 0) + cap[ch] = p->g->ncategories++; + } +} + +/* + - nonnewline - emit REG_NEWLINE version of OANY + == static void nonnewline(register struct parse *p); + * + * Boy, is this implementation ever a kludge... + */ +static void +nonnewline(p) +register struct parse *p; +{ + register char *oldnext = p->next; + register char *oldend = p->end; + char bracket[4]; + + p->next = bracket; + p->end = bracket+3; + bracket[0] = '^'; + bracket[1] = '\n'; + bracket[2] = ']'; + bracket[3] = '\0'; + p_bracket(p); + assert(p->next == bracket+3); + p->next = oldnext; + p->end = oldend; +} + +/* + - repeat - generate code for a bounded repetition, recursively if needed + == static void repeat(register struct parse *p, sopno start, int from, int to); + */ +static void +repeat(p, start, from, to) +register struct parse *p; +sopno start; /* operand from here to end of strip */ +int from; /* repeated from this number */ +int to; /* to this number of times (maybe INFINITY) */ +{ + register sopno finish = HERE(); +# define N 2 +# define INF 3 +# define REP(f, t) ((f)*8 + (t)) +# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) + register sopno copy; + + if (p->error != 0) /* head off possible runaway recursion */ + return; + + assert(from <= to); + + switch (REP(MAP(from), MAP(to))) { + case REP(0, 0): /* must be user doing this */ + DROP(finish-start); /* drop the operand */ + break; + case REP(0, 1): /* as x{1,1}? */ + case REP(0, N): /* as x{1,n}? */ + case REP(0, INF): /* as x{1,}? */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); /* offset is wrong... */ + repeat(p, start+1, 1, to); + ASTERN(OOR1, start); + AHEAD(start); /* ... fix it */ + EMIT(OOR2, 0); + AHEAD(THERE()); + ASTERN(O_CH, THERETHERE()); + break; + case REP(1, 1): /* trivial case */ + /* done */ + break; + case REP(1, N): /* as x?x{1,n-1} */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); + ASTERN(OOR1, start); + AHEAD(start); + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + copy = dupl(p, start+1, finish+1); + assert(copy == finish+4); + repeat(p, copy, 1, to-1); + break; + case REP(1, INF): /* as x+ */ + INSERT(OPLUS_, start); + ASTERN(O_PLUS, start); + break; + case REP(N, N): /* as xx{m-1,n-1} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to-1); + break; + case REP(N, INF): /* as xx{n-1,INF} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to); + break; + default: /* "can't happen" */ + SETERROR(REG_ASSERT); /* just in case */ + break; + } +} + +/* + - seterr - set an error condition + == static int seterr(register struct parse *p, int e); + */ +static int /* useless but makes type checking happy */ +seterr(p, e) +register struct parse *p; +int e; +{ + if (p->error == 0) /* keep earliest error condition */ + p->error = e; + p->next = nuls; /* try to bring things to a halt */ + p->end = nuls; + return(0); /* make the return value well-defined */ +} + +/* + - allocset - allocate a set of characters for [] + == static cset *allocset(register struct parse *p); + */ +static cset * +allocset(p) +register struct parse *p; +{ + register int no = p->g->ncsets++; + register size_t nc; + register size_t nbytes; + register cset *cs; + register size_t css = (size_t)p->g->csetsize; + register int i; + + if (no >= p->ncsalloc) { /* need another column of space */ + p->ncsalloc += CHAR_BIT; + nc = p->ncsalloc; + assert(nc % CHAR_BIT == 0); + nbytes = nc / CHAR_BIT * css; + if (p->g->sets == NULL) + p->g->sets = (cset *)malloc(nc * sizeof(cset)); + else + p->g->sets = (cset *)realloc((char *)p->g->sets, + nc * sizeof(cset)); + if (p->g->setbits == NULL) + p->g->setbits = (uch *)malloc(nbytes); + else { + p->g->setbits = (uch *)realloc((char *)p->g->setbits, + nbytes); + /* xxx this isn't right if setbits is now NULL */ + for (i = 0; i < no; i++) + p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); + } + if (p->g->sets != NULL && p->g->setbits != NULL) + (void) memset((char *)p->g->setbits + (nbytes - css), + 0, css); + else { + no = 0; + SETERROR(REG_ESPACE); + /* caller's responsibility not to do set ops */ + } + } + + assert(p->g->sets != NULL); /* xxx */ + cs = &p->g->sets[no]; + cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); + cs->mask = 1 << ((no) % CHAR_BIT); + cs->hash = 0; + cs->smultis = 0; + cs->multis = NULL; + + return(cs); +} + +/* + - freeset - free a now-unused set + == static void freeset(register struct parse *p, register cset *cs); + */ +static void +freeset(p, cs) +register struct parse *p; +register cset *cs; +{ + register size_t i; + register cset *top = &p->g->sets[p->g->ncsets]; + register size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + CHsub(cs, i); + if (cs == top-1) /* recover only the easy case */ + p->g->ncsets--; +} + +/* + - freezeset - final processing on a set of characters + == static int freezeset(register struct parse *p, register cset *cs); + * + * The main task here is merging identical sets. This is usually a waste + * of time (although the hash code minimizes the overhead), but can win + * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash + * is done using addition rather than xor -- all ASCII [aA] sets xor to + * the same value! + */ +static int /* set number */ +freezeset(p, cs) +register struct parse *p; +register cset *cs; +{ + register uch h = cs->hash; + register size_t i; + register cset *top = &p->g->sets[p->g->ncsets]; + register cset *cs2; + register size_t css = (size_t)p->g->csetsize; + + /* look for an earlier one which is the same */ + for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) + if (cs2->hash == h && cs2 != cs) { + /* maybe */ + for (i = 0; i < css; i++) + if (!!CHIN(cs2, i) != !!CHIN(cs, i)) + break; /* no */ + if (i == css) + break; /* yes */ + } + + if (cs2 < top) { /* found one */ + freeset(p, cs); + cs = cs2; + } + + return((int)(cs - p->g->sets)); +} + +/* + - firstch - return first character in a set (which must have at least one) + == static int firstch(register struct parse *p, register cset *cs); + */ +static int /* character; there is no "none" value */ +firstch(p, cs) +register struct parse *p; +register cset *cs; +{ + register size_t i; + register size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + return((char)i); + assert(never); + return(0); /* arbitrary */ +} + +/* + - nch - number of characters in a set + == static int nch(register struct parse *p, register cset *cs); + */ +static int +nch(p, cs) +register struct parse *p; +register cset *cs; +{ + register size_t i; + register size_t css = (size_t)p->g->csetsize; + register int n = 0; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + n++; + return(n); +} + +/* + - mcadd - add a collating element to a cset + == static void mcadd(register struct parse *p, register cset *cs, \ + == register char *cp); + */ +static void +mcadd(p, cs, cp) +register struct parse *p; +register cset *cs; +register char *cp; +{ + register size_t oldend = cs->smultis; + + cs->smultis += strlen(cp) + 1; + if (cs->multis == NULL) + cs->multis = malloc(cs->smultis); + else + cs->multis = realloc(cs->multis, cs->smultis); + if (cs->multis == NULL) { + SETERROR(REG_ESPACE); + return; + } + + (void) strcpy(cs->multis + oldend - 1, cp); + cs->multis[cs->smultis - 1] = '\0'; +} + +/* + - mcsub - subtract a collating element from a cset + == static void mcsub(register cset *cs, register char *cp); + */ +static void +mcsub(cs, cp) +register cset *cs; +register char *cp; +{ + register char *fp = mcfind(cs, cp); + register size_t len = strlen(fp); + + assert(fp != NULL); + (void) memmove(fp, fp + len + 1, + cs->smultis - (fp + len + 1 - cs->multis)); + cs->smultis -= len; + + if (cs->smultis == 0) { + free(cs->multis); + cs->multis = NULL; + return; + } + + cs->multis = realloc(cs->multis, cs->smultis); + assert(cs->multis != NULL); +} + +/* + - mcin - is a collating element in a cset? + == static int mcin(register cset *cs, register char *cp); + */ +static int +mcin(cs, cp) +register cset *cs; +register char *cp; +{ + return(mcfind(cs, cp) != NULL); +} + +/* + - mcfind - find a collating element in a cset + == static char *mcfind(register cset *cs, register char *cp); + */ +static char * +mcfind(cs, cp) +register cset *cs; +register char *cp; +{ + register char *p; + + if (cs->multis == NULL) + return(NULL); + for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) + if (strcmp(cp, p) == 0) + return(p); + return(NULL); +} + +/* + - mcinvert - invert the list of collating elements in a cset + == static void mcinvert(register struct parse *p, register cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mcinvert(p, cs) +register struct parse *p; +register cset *cs; +{ + assert(cs->multis == NULL); /* xxx */ +} + +/* + - mccase - add case counterparts of the list of collating elements in a cset + == static void mccase(register struct parse *p, register cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mccase(p, cs) +register struct parse *p; +register cset *cs; +{ + assert(cs->multis == NULL); /* xxx */ +} + +/* + - isinsets - is this character in any sets? + == static int isinsets(register struct re_guts *g, int c); + */ +static int /* predicate */ +isinsets(g, c) +register struct re_guts *g; +int c; +{ + register uch *col; + register int i; + register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + register unsigned uc = (unsigned char)c; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc] != 0) + return(1); + return(0); +} + +/* + - samesets - are these two characters in exactly the same sets? + == static int samesets(register struct re_guts *g, int c1, int c2); + */ +static int /* predicate */ +samesets(g, c1, c2) +register struct re_guts *g; +int c1; +int c2; +{ + register uch *col; + register int i; + register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + register unsigned uc1 = (unsigned char)c1; + register unsigned uc2 = (unsigned char)c2; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc1] != col[uc2]) + return(0); + return(1); +} + +/* + - categorize - sort out character categories + == static void categorize(struct parse *p, register struct re_guts *g); + */ +static void +categorize(p, g) +struct parse *p; +register struct re_guts *g; +{ + register cat_t *cats = g->categories; + register int c; + register int c2; + register cat_t cat; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (cats[c] == 0 && isinsets(g, c)) { + cat = g->ncategories++; + cats[c] = cat; + for (c2 = c+1; c2 <= CHAR_MAX; c2++) + if (cats[c2] == 0 && samesets(g, c, c2)) + cats[c2] = cat; + } +} + +/* + - dupl - emit a duplicate of a bunch of sops + == static sopno dupl(register struct parse *p, sopno start, sopno finish); + */ +static sopno /* start of duplicate */ +dupl(p, start, finish) +register struct parse *p; +sopno start; /* from here */ +sopno finish; /* to this less one */ +{ + register sopno ret = HERE(); + register sopno len = finish - start; + + assert(finish >= start); + if (len == 0) + return(ret); + enlarge(p, p->ssize + len); /* this many unexpected additions */ + assert(p->ssize >= p->slen + len); + (void) memcpy((char *)(p->strip + p->slen), + (char *)(p->strip + start), (size_t)len*sizeof(sop)); + p->slen += len; + return(ret); +} + +/* + - doemit - emit a strip operator + == static void doemit(register struct parse *p, sop op, size_t opnd); + * + * It might seem better to implement this as a macro with a function as + * hard-case backup, but it's just too big and messy unless there are + * some changes to the data structures. Maybe later. + */ +static void +doemit(p, op, opnd) +register struct parse *p; +sop op; +size_t opnd; +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* deal with oversize operands ("can't happen", more or less) */ + assert(opnd < 1<slen >= p->ssize) + enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ + assert(p->slen < p->ssize); + + /* finally, it's all reduced to the easy case */ + p->strip[p->slen++] = SOP(op, opnd); +} + +/* + - doinsert - insert a sop into the strip + == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); + */ +static void +doinsert(p, op, opnd, pos) +register struct parse *p; +sop op; +size_t opnd; +sopno pos; +{ + register sopno sn; + register sop s; + register int i; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + sn = HERE(); + EMIT(op, opnd); /* do checks, ensure space */ + assert(HERE() == sn+1); + s = p->strip[sn]; + + /* adjust paren pointers */ + assert(pos > 0); + for (i = 1; i < NPAREN; i++) { + if (p->pbegin[i] >= pos) { + p->pbegin[i]++; + } + if (p->pend[i] >= pos) { + p->pend[i]++; + } + } + + memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], + (HERE()-pos-1)*sizeof(sop)); + p->strip[pos] = s; +} + +/* + - dofwd - complete a forward reference + == static void dofwd(register struct parse *p, sopno pos, sop value); + */ +static void +dofwd(p, pos, value) +register struct parse *p; +register sopno pos; +sop value; +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + assert(value < 1<strip[pos] = OP(p->strip[pos]) | value; +} + +/* + - enlarge - enlarge the strip + == static void enlarge(register struct parse *p, sopno size); + */ +static void +enlarge(p, size) +register struct parse *p; +register sopno size; +{ + register sop *sp; + + if (p->ssize >= size) + return; + + sp = (sop *)realloc(p->strip, size*sizeof(sop)); + if (sp == NULL) { + SETERROR(REG_ESPACE); + return; + } + p->strip = sp; + p->ssize = size; +} + +/* + - stripsnug - compact the strip + == static void stripsnug(register struct parse *p, register struct re_guts *g); + */ +static void +stripsnug(p, g) +register struct parse *p; +register struct re_guts *g; +{ + g->nstates = p->slen; + g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); + if (g->strip == NULL) { + SETERROR(REG_ESPACE); + g->strip = p->strip; + } +} + +/* + - findmust - fill in must and mlen with longest mandatory literal string + == static void findmust(register struct parse *p, register struct re_guts *g); + * + * This algorithm could do fancy things like analyzing the operands of | + * for common subsequences. Someday. This code is simple and finds most + * of the interesting cases. + * + * Note that must and mlen got initialized during setup. + */ +static void +findmust(p, g) +struct parse *p; +register struct re_guts *g; +{ + register sop *scan; + sop *start; + register sop *newstart; + register sopno newlen; + register sop s; + register char *cp; + register sopno i; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* find the longest OCHAR sequence in strip */ + newlen = 0; + scan = g->strip + 1; + do { + s = *scan++; + switch (OP(s)) { + case OCHAR: /* sequence member */ + if (newlen == 0) /* new sequence */ + newstart = scan - 1; + newlen++; + break; + case OPLUS_: /* things that don't break one */ + case OLPAREN: + case ORPAREN: + break; + case OQUEST_: /* things that must be skipped */ + case OCH_: + scan--; + do { + scan += OPND(s); + s = *scan; + /* assert() interferes w debug printouts */ + if (OP(s) != O_QUEST && OP(s) != O_CH && + OP(s) != OOR2) { + g->iflags |= BAD; + return; + } + } while (OP(s) != O_QUEST && OP(s) != O_CH); + /* fallthrough */ + default: /* things that break a sequence */ + if (newlen > g->mlen) { /* ends one */ + start = newstart; + g->mlen = newlen; + } + newlen = 0; + break; + } + } while (OP(s) != OEND); + + if (g->mlen == 0) /* there isn't one */ + return; + + /* turn it into a character string */ + g->must = malloc((size_t)g->mlen + 1); + if (g->must == NULL) { /* argh; just forget it */ + g->mlen = 0; + return; + } + cp = g->must; + scan = start; + for (i = g->mlen; i > 0; i--) { + while (OP(s = *scan++) != OCHAR) + continue; + assert(cp < g->must + g->mlen); + *cp++ = (char)OPND(s); + } + assert(cp == g->must + g->mlen); + *cp++ = '\0'; /* just on general principles */ +} + +/* + - pluscount - count + nesting + == static sopno pluscount(register struct parse *p, register struct re_guts *g); + */ +static sopno /* nesting depth */ +pluscount(p, g) +struct parse *p; +register struct re_guts *g; +{ + register sop *scan; + register sop s; + register sopno plusnest = 0; + register sopno maxnest = 0; + + if (p->error != 0) + return(0); /* there may not be an OEND */ + + scan = g->strip + 1; + do { + s = *scan++; + switch (OP(s)) { + case OPLUS_: + plusnest++; + break; + case O_PLUS: + if (plusnest > maxnest) + maxnest = plusnest; + plusnest--; + break; + } + } while (OP(s) != OEND); + if (plusnest != 0) + g->iflags |= BAD; + return(maxnest); +} diff --git a/vcnet/regex/regcomp.ih b/vcnet/regex/regcomp.ih new file mode 100644 index 0000000..0776e71 --- /dev/null +++ b/vcnet/regex/regcomp.ih @@ -0,0 +1,51 @@ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regcomp.c === */ +static void p_ere(register struct parse *p, int stop); +static void p_ere_exp(register struct parse *p); +static void p_str(register struct parse *p); +static void p_bre(register struct parse *p, register int end1, register int end2); +static int p_simp_re(register struct parse *p, int starordinary); +static int p_count(register struct parse *p); +static void p_bracket(register struct parse *p); +static void p_b_term(register struct parse *p, register cset *cs); +static void p_b_cclass(register struct parse *p, register cset *cs); +static void p_b_eclass(register struct parse *p, register cset *cs); +static char p_b_symbol(register struct parse *p); +static char p_b_coll_elem(register struct parse *p, int endc); +static char othercase(int ch); +static void bothcases(register struct parse *p, int ch); +static void ordinary(register struct parse *p, register int ch); +static void nonnewline(register struct parse *p); +static void repeat(register struct parse *p, sopno start, int from, int to); +static int seterr(register struct parse *p, int e); +static cset *allocset(register struct parse *p); +static void freeset(register struct parse *p, register cset *cs); +static int freezeset(register struct parse *p, register cset *cs); +static int firstch(register struct parse *p, register cset *cs); +static int nch(register struct parse *p, register cset *cs); +static void mcadd(register struct parse *p, register cset *cs, register char *cp); +static void mcsub(register cset *cs, register char *cp); +static int mcin(register cset *cs, register char *cp); +static char *mcfind(register cset *cs, register char *cp); +static void mcinvert(register struct parse *p, register cset *cs); +static void mccase(register struct parse *p, register cset *cs); +static int isinsets(register struct re_guts *g, int c); +static int samesets(register struct re_guts *g, int c1, int c2); +static void categorize(struct parse *p, register struct re_guts *g); +static sopno dupl(register struct parse *p, sopno start, sopno finish); +static void doemit(register struct parse *p, sop op, size_t opnd); +static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); +static void dofwd(register struct parse *p, sopno pos, sop value); +static void enlarge(register struct parse *p, sopno size); +static void stripsnug(register struct parse *p, register struct re_guts *g); +static void findmust(register struct parse *p, register struct re_guts *g); +static sopno pluscount(register struct parse *p, register struct re_guts *g); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ diff --git a/vcnet/regex/regerror.c b/vcnet/regex/regerror.c new file mode 100644 index 0000000..9ddd25c --- /dev/null +++ b/vcnet/regex/regerror.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regerror.ih" + +/* + = #define REG_OKAY 0 + = #define REG_NOMATCH 1 + = #define REG_BADPAT 2 + = #define REG_ECOLLATE 3 + = #define REG_ECTYPE 4 + = #define REG_EESCAPE 5 + = #define REG_ESUBREG 6 + = #define REG_EBRACK 7 + = #define REG_EPAREN 8 + = #define REG_EBRACE 9 + = #define REG_BADBR 10 + = #define REG_ERANGE 11 + = #define REG_ESPACE 12 + = #define REG_BADRPT 13 + = #define REG_EMPTY 14 + = #define REG_ASSERT 15 + = #define REG_INVARG 16 + = #define REG_ATOI 255 // convert name to number (!) + = #define REG_ITOA 0400 // convert number to name (!) + */ +static struct rerr { + int code; + char *name; + char *explain; +} rerrs[] = { + REG_OKAY, "REG_OKAY", "no errors detected", + REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match", + REG_BADPAT, "REG_BADPAT", "invalid regular expression", + REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element", + REG_ECTYPE, "REG_ECTYPE", "invalid character class", + REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)", + REG_ESUBREG, "REG_ESUBREG", "invalid backreference number", + REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced", + REG_EPAREN, "REG_EPAREN", "parentheses not balanced", + REG_EBRACE, "REG_EBRACE", "braces not balanced", + REG_BADBR, "REG_BADBR", "invalid repetition count(s)", + REG_ERANGE, "REG_ERANGE", "invalid character range", + REG_ESPACE, "REG_ESPACE", "out of memory", + REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid", + REG_EMPTY, "REG_EMPTY", "empty (sub)expression", + REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug", + REG_INVARG, "REG_INVARG", "invalid argument to regex routine", + -1, "", "*** unknown regexp error code ***", +}; + +/* + - regerror - the interface to error numbers + = extern size_t regerror(int, const regex_t *, char *, size_t); + */ +/* ARGSUSED */ +size_t +regerror( +int errcode, +const regex_t *preg, +char *errbuf, +size_t errbuf_size) +{ + register struct rerr *r; + register size_t len; + register int target = errcode &~ REG_ITOA; + register char *s; + char convbuf[50]; + + if (errcode == REG_ATOI) + s = regatoi(preg, convbuf); + else { + for (r = rerrs; r->code >= 0; r++) + if (r->code == target) + break; + + if (errcode®_ITOA) { + if (r->code >= 0) + (void) strcpy(convbuf, r->name); + else + sprintf(convbuf, "REG_0x%x", target); + assert(strlen(convbuf) < sizeof(convbuf)); + s = convbuf; + } else + s = r->explain; + } + + len = strlen(s) + 1; + if (errbuf_size > 0) { + if (errbuf_size > len) + (void) strcpy(errbuf, s); + else { + (void) strncpy(errbuf, s, errbuf_size-1); + errbuf[errbuf_size-1] = '\0'; + } + } + + return(len); +} + +/* + - regatoi - internal routine to implement REG_ATOI + == static char *regatoi(const regex_t *preg, char *localbuf); + */ +static char * +regatoi(preg, localbuf) +const regex_t *preg; +char *localbuf; +{ + register struct rerr *r; + + for (r = rerrs; r->code >= 0; r++) + if (strcmp(r->name, preg->re_endp) == 0) + break; + if (r->code < 0) + return("0"); + + sprintf(localbuf, "%d", r->code); + return(localbuf); +} diff --git a/vcnet/regex/regerror.ih b/vcnet/regex/regerror.ih new file mode 100644 index 0000000..2cb668c --- /dev/null +++ b/vcnet/regex/regerror.ih @@ -0,0 +1,12 @@ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regerror.c === */ +static char *regatoi(const regex_t *preg, char *localbuf); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ diff --git a/vcnet/regex/regex.3 b/vcnet/regex/regex.3 new file mode 100644 index 0000000..bc74709 --- /dev/null +++ b/vcnet/regex/regex.3 @@ -0,0 +1,509 @@ +.TH REGEX 3 "25 Sept 1997" +.BY "Henry Spencer" +.de ZR +.\" one other place knows this name: the SEE ALSO section +.IR regex (7) \\$1 +.. +.SH NAME +regcomp, regexec, regerror, regfree \- regular-expression library +.SH SYNOPSIS +.ft B +.\".na +#include +.br +#include +.HP 10 +int regcomp(regex_t\ *preg, const\ char\ *pattern, int\ cflags); +.HP +int\ regexec(const\ regex_t\ *preg, const\ char\ *string, +size_t\ nmatch, regmatch_t\ pmatch[], int\ eflags); +.HP +size_t\ regerror(int\ errcode, const\ regex_t\ *preg, +char\ *errbuf, size_t\ errbuf_size); +.HP +void\ regfree(regex_t\ *preg); +.\".ad +.ft +.SH DESCRIPTION +These routines implement POSIX 1003.2 regular expressions (``RE''s); +see +.ZR . +.I Regcomp +compiles an RE written as a string into an internal form, +.I regexec +matches that internal form against a string and reports results, +.I regerror +transforms error codes from either into human-readable messages, +and +.I regfree +frees any dynamically-allocated storage used by the internal form +of an RE. +.PP +The header +.I +declares two structure types, +.I regex_t +and +.IR regmatch_t , +the former for compiled internal forms and the latter for match reporting. +It also declares the four functions, +a type +.IR regoff_t , +and a number of constants with names starting with ``REG_''. +.PP +.I Regcomp +compiles the regular expression contained in the +.I pattern +string, +subject to the flags in +.IR cflags , +and places the results in the +.I regex_t +structure pointed to by +.IR preg . +.I Cflags +is the bitwise OR of zero or more of the following flags: +.IP REG_EXTENDED \w'REG_EXTENDED'u+2n +Compile modern (``extended'') REs, +rather than the obsolete (``basic'') REs that +are the default. +.IP REG_BASIC +This is a synonym for 0, +provided as a counterpart to REG_EXTENDED to improve readability. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.IP REG_NOSPEC +Compile with recognition of all special characters turned off. +All characters are thus considered ordinary, +so the ``RE'' is a literal string. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +REG_EXTENDED and REG_NOSPEC may not be used +in the same call to +.IR regcomp . +.IP REG_ICASE +Compile for matching that ignores upper/lower case distinctions. +See +.ZR . +.IP REG_NOSUB +Compile for matching that need only report success or failure, +not what was matched. +.IP REG_NEWLINE +Compile for newline-sensitive matching. +By default, newline is a completely ordinary character with no special +meaning in either REs or strings. +With this flag, +`[^' bracket expressions and `.' never match newline, +a `^' anchor matches the null string after any newline in the string +in addition to its normal function, +and the `$' anchor matches the null string before any newline in the +string in addition to its normal function. +.IP REG_PEND +The regular expression ends, +not at the first NUL, +but just before the character pointed to by the +.I re_endp +member of the structure pointed to by +.IR preg . +The +.I re_endp +member is of type +.IR const\ char\ * . +This flag permits inclusion of NULs in the RE; +they are considered ordinary characters. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.PP +When successful, +.I regcomp +returns 0 and fills in the structure pointed to by +.IR preg . +One member of that structure +(other than +.IR re_endp ) +is publicized: +.IR re_nsub , +of type +.IR size_t , +contains the number of parenthesized subexpressions within the RE +(except that the value of this member is undefined if the +REG_NOSUB flag was used). +If +.I regcomp +fails, it returns a non-zero error code; +see DIAGNOSTICS. +.PP +.I Regexec +matches the compiled RE pointed to by +.I preg +against the +.IR string , +subject to the flags in +.IR eflags , +and reports results using +.IR nmatch , +.IR pmatch , +and the returned value. +The RE must have been compiled by a previous invocation of +.IR regcomp . +The compiled form is not altered during execution of +.IR regexec , +so a single compiled RE can be used simultaneously by multiple threads. +.PP +By default, +the NUL-terminated string pointed to by +.I string +is considered to be the text of an entire line, +with the NUL indicating the end of the line. +(That is, +any other end-of-line marker is considered to have been removed +and replaced by the NUL.) +The +.I eflags +argument is the bitwise OR of zero or more of the following flags: +.IP REG_NOTBOL \w'REG_STARTEND'u+2n +The first character of +the string +is not the beginning of a line, so the `^' anchor should not match before it. +This does not affect the behavior of newlines under REG_NEWLINE. +.IP REG_NOTEOL +The NUL terminating +the string +does not end a line, so the `$' anchor should not match before it. +This does not affect the behavior of newlines under REG_NEWLINE. +.IP REG_STARTEND +The string is considered to start at +\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_so\fR +and to have a terminating NUL located at +\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_eo\fR +(there need not actually be a NUL at that location), +regardless of the value of +.IR nmatch . +See below for the definition of +.IR pmatch +and +.IR nmatch . +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +Note that a non-zero \fIrm_so\fR does not imply REG_NOTBOL; +REG_STARTEND affects only the location of the string, +not how it is matched. +.PP +See +.ZR +for a discussion of what is matched in situations where an RE or a +portion thereof could match any of several substrings of +.IR string . +.PP +Normally, +.I regexec +returns 0 for success and the non-zero code REG_NOMATCH for failure. +Other non-zero error codes may be returned in exceptional situations; +see DIAGNOSTICS. +.PP +If REG_NOSUB was specified in the compilation of the RE, +or if +.I nmatch +is 0, +.I regexec +ignores the +.I pmatch +argument (but see below for the case where REG_STARTEND is specified). +Otherwise, +.I pmatch +points to an array of +.I nmatch +structures of type +.IR regmatch_t . +Such a structure has at least the members +.I rm_so +and +.IR rm_eo , +both of type +.I regoff_t +(a signed arithmetic type at least as large as an +.I off_t +and a +.IR ssize_t ), +containing respectively the offset of the first character of a substring +and the offset of the first character after the end of the substring. +Offsets are measured from the beginning of the +.I string +argument given to +.IR regexec . +An empty substring is denoted by equal offsets, +both indicating the character following the empty substring. +.PP +The 0th member of the +.I pmatch +array is filled in to indicate what substring of +.I string +was matched by the entire RE. +Remaining members report what substring was matched by parenthesized +subexpressions within the RE; +member +.I i +reports subexpression +.IR i , +with subexpressions counted (starting at 1) by the order of their opening +parentheses in the RE, left to right. +Unused entries in the array\(emcorresponding either to subexpressions that +did not participate in the match at all, or to subexpressions that do not +exist in the RE (that is, \fIi\fR\ > \fIpreg\fR\->\fIre_nsub\fR)\(emhave both +.I rm_so +and +.I rm_eo +set to \-1. +If a subexpression participated in the match several times, +the reported substring is the last one it matched. +(Note, as an example in particular, that when the RE `(b*)+' matches `bbb', +the parenthesized subexpression matches the three `b's and then +an infinite number of empty strings following the last `b', +so the reported substring is one of the empties.) +.PP +If REG_STARTEND is specified, +.I pmatch +must point to at least one +.I regmatch_t +(even if +.I nmatch +is 0 or REG_NOSUB was specified), +to hold the input offsets for REG_STARTEND. +Use for output is still entirely controlled by +.IR nmatch ; +if +.I nmatch +is 0 or REG_NOSUB was specified, +the value of +.IR pmatch [0] +will not be changed by a successful +.IR regexec . +.PP +.I Regerror +maps a non-zero +.I errcode +from either +.I regcomp +or +.I regexec +to a human-readable, printable message. +If +.I preg +is non-NULL, +the error code should have arisen from use of +the +.I regex_t +pointed to by +.IR preg , +and if the error code came from +.IR regcomp , +it should have been the result from the most recent +.I regcomp +using that +.IR regex_t . +.RI ( Regerror +may be able to supply a more detailed message using information +from the +.IR regex_t .) +.I Regerror +places the NUL-terminated message into the buffer pointed to by +.IR errbuf , +limiting the length (including the NUL) to at most +.I errbuf_size +bytes. +If the whole message won't fit, +as much of it as will fit before the terminating NUL is supplied. +In any case, +the returned value is the size of buffer needed to hold the whole +message (including terminating NUL). +If +.I errbuf_size +is 0, +.I errbuf +is ignored but the return value is still correct. +.PP +If the +.I errcode +given to +.I regerror +is first ORed with REG_ITOA, +the ``message'' that results is the printable name of the error code, +e.g. ``REG_NOMATCH'', +rather than an explanation thereof. +If +.I errcode +is REG_ATOI, +then +.I preg +shall be non-NULL and the +.I re_endp +member of the structure it points to +must point to the printable name of an error code; +in this case, the result in +.I errbuf +is the decimal digits of +the numeric value of the error code +(0 if the name is not recognized). +REG_ITOA and REG_ATOI are intended primarily as debugging facilities; +they are extensions, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +Be warned also that they are considered experimental and changes are possible. +.PP +.I Regfree +frees any dynamically-allocated storage associated with the compiled RE +pointed to by +.IR preg . +The remaining +.I regex_t +is no longer a valid compiled RE +and the effect of supplying it to +.I regexec +or +.I regerror +is undefined. +.PP +None of these functions references global variables except for tables +of constants; +all are safe for use from multiple threads if the arguments are safe. +.SH IMPLEMENTATION CHOICES +There are a number of decisions that 1003.2 leaves up to the implementor, +either by explicitly saying ``undefined'' or by virtue of them being +forbidden by the RE grammar. +This implementation treats them as follows. +.PP +See +.ZR +for a discussion of the definition of case-independent matching. +.PP +There is no particular limit on the length of REs, +except insofar as memory is limited. +Memory usage is approximately linear in RE size, and largely insensitive +to RE complexity, except for bounded repetitions. +See BUGS for one short RE using them +that will run almost any system out of memory. +.PP +A backslashed character other than one specifically given a magic meaning +by 1003.2 (such magic meanings occur only in obsolete [``basic''] REs) +is taken as an ordinary character. +.PP +Any unmatched [ is a REG_EBRACK error. +.PP +Equivalence classes cannot begin or end bracket-expression ranges. +The endpoint of one range cannot begin another. +.PP +RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255. +.PP +A repetition operator (?, *, +, or bounds) cannot follow another +repetition operator. +A repetition operator cannot begin an expression or subexpression +or follow `^' or `|'. +.PP +`|' cannot appear first or last in a (sub)expression or after another `|', +i.e. an operand of `|' cannot be an empty subexpression. +An empty parenthesized subexpression, `()', is legal and matches an +empty (sub)string. +An empty string is not a legal RE. +.PP +A `{' followed by a digit is considered the beginning of bounds for a +bounded repetition, which must then follow the syntax for bounds. +A `{' \fInot\fR followed by a digit is considered an ordinary character. +.PP +`^' and `$' beginning and ending subexpressions in obsolete (``basic'') +REs are anchors, not ordinary characters. +.SH SEE ALSO +grep(1), regex(7) +.PP +POSIX 1003.2, sections 2.8 (Regular Expression Notation) +and +B.5 (C Binding for Regular Expression Matching). +.SH DIAGNOSTICS +Non-zero error codes from +.I regcomp +and +.I regexec +include the following: +.PP +.nf +.ta \w'REG_ECOLLATE'u+3n +REG_NOMATCH regexec() failed to match +REG_BADPAT invalid regular expression +REG_ECOLLATE invalid collating element +REG_ECTYPE invalid character class +REG_EESCAPE \e applied to unescapable character +REG_ESUBREG invalid backreference number +REG_EBRACK brackets [ ] not balanced +REG_EPAREN parentheses ( ) not balanced +REG_EBRACE braces { } not balanced +REG_BADBR invalid repetition count(s) in { } +REG_ERANGE invalid character range in [ ] +REG_ESPACE ran out of memory +REG_BADRPT ?, *, or + operand invalid +REG_EMPTY empty (sub)expression +REG_ASSERT ``can't happen''\(emyou found a bug +REG_INVARG invalid argument, e.g. negative-length string +.fi +.SH HISTORY +Written by Henry Spencer, +henry@zoo.toronto.edu. +.SH BUGS +This is an alpha release with known defects. +Please report problems. +.PP +There is one known functionality bug. +The implementation of internationalization is incomplete: +the locale is always assumed to be the default one of 1003.2, +and only the collating elements etc. of that locale are available. +.PP +The back-reference code is subtle and doubts linger about its correctness +in complex cases. +.PP +.I Regexec +performance is poor. +This will improve with later releases. +.I Nmatch +exceeding 0 is expensive; +.I nmatch +exceeding 1 is worse. +.I Regexec +is largely insensitive to RE complexity \fIexcept\fR that back +references are massively expensive. +RE length does matter; in particular, there is a strong speed bonus +for keeping RE length under about 30 characters, +with most special characters counting roughly double. +.PP +.I Regcomp +implements bounded repetitions by macro expansion, +which is costly in time and space if counts are large +or bounded repetitions are nested. +An RE like, say, +`((((a{1,100}){1,100}){1,100}){1,100}){1,100}' +will (eventually) run almost any existing machine out of swap space. +.PP +There are suspected problems with response to obscure error conditions. +Notably, +certain kinds of internal overflow, +produced only by truly enormous REs or by multiply nested bounded repetitions, +are probably not handled well. +.PP +Due to a mistake in 1003.2, things like `a)b' are legal REs because `)' is +a special character only in the presence of a previous unmatched `('. +This can't be fixed until the spec is fixed. +.PP +The standard's definition of back references is vague. +For example, does +`a\e(\e(b\e)*\e2\e)*d' match `abbbd'? +Until the standard is clarified, +behavior in such cases should not be relied on. +.PP +The implementation of word-boundary matching is a bit of a kludge, +and bugs may lurk in combinations of word-boundary matching and anchoring. diff --git a/vcnet/regex/regex.7 b/vcnet/regex/regex.7 new file mode 100644 index 0000000..0fa1802 --- /dev/null +++ b/vcnet/regex/regex.7 @@ -0,0 +1,235 @@ +.TH REGEX 7 "25 Oct 1995" +.BY "Henry Spencer" +.SH NAME +regex \- POSIX 1003.2 regular expressions +.SH DESCRIPTION +Regular expressions (``RE''s), +as defined in POSIX 1003.2, come in two forms: +modern REs (roughly those of +.IR egrep ; +1003.2 calls these ``extended'' REs) +and obsolete REs (roughly those of +.IR ed ; +1003.2 ``basic'' REs). +Obsolete REs mostly exist for backward compatibility in some old programs; +they will be discussed at the end. +1003.2 leaves some aspects of RE syntax and semantics open; +`\(dg' marks decisions on these aspects that +may not be fully portable to other 1003.2 implementations. +.PP +A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR, +separated by `|'. +It matches anything that matches one of the branches. +.PP +A branch is one\(dg or more \fIpieces\fR, concatenated. +It matches a match for the first, followed by a match for the second, etc. +.PP +A piece is an \fIatom\fR possibly followed +by a single\(dg `*', `+', `?', or \fIbound\fR. +An atom followed by `*' matches a sequence of 0 or more matches of the atom. +An atom followed by `+' matches a sequence of 1 or more matches of the atom. +An atom followed by `?' matches a sequence of 0 or 1 matches of the atom. +.PP +A \fIbound\fR is `{' followed by an unsigned decimal integer, +possibly followed by `,' +possibly followed by another unsigned decimal integer, +always followed by `}'. +The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive, +and if there are two of them, the first may not exceed the second. +An atom followed by a bound containing one integer \fIi\fR +and no comma matches +a sequence of exactly \fIi\fR matches of the atom. +An atom followed by a bound +containing one integer \fIi\fR and a comma matches +a sequence of \fIi\fR or more matches of the atom. +An atom followed by a bound +containing two integers \fIi\fR and \fIj\fR matches +a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom. +.PP +An atom is a regular expression enclosed in `()' (matching a match for the +regular expression), +an empty set of `()' (matching the null string)\(dg, +a \fIbracket expression\fR (see below), `.' +(matching any single character), `^' (matching the null string at the +beginning of a line), `$' (matching the null string at the +end of a line), a `\e' followed by one of the characters +`^.[$()|*+?{\e' +(matching that character taken as an ordinary character), +a `\e' followed by any other character\(dg +(matching that character taken as an ordinary character, +as if the `\e' had not been present\(dg), +or a single character with no other significance (matching that character). +A `{' followed by a character other than a digit is an ordinary +character, not the beginning of a bound\(dg. +It is illegal to end an RE with `\e'. +.PP +A \fIbracket expression\fR is a list of characters enclosed in `[]'. +It normally matches any single character from the list (but see below). +If the list begins with `^', +it matches any single character +(but see below) \fInot\fR from the rest of the list. +If two characters in the list are separated by `\-', this is shorthand +for the full \fIrange\fR of characters between those two (inclusive) in the +collating sequence, +e.g. `[0\-9]' in ASCII matches any decimal digit. +It is illegal\(dg for two ranges to share an +endpoint, e.g. `a\-c\-e'. +Ranges are very collating-sequence-dependent, +and portable programs should avoid relying on them. +.PP +To include a literal `]' in the list, make it the first character +(following a possible `^'). +To include a literal `\-', make it the first or last character, +or the second endpoint of a range. +To use a literal `\-' as the first endpoint of a range, +enclose it in `[.' and `.]' to make it a collating element (see below). +With the exception of these and some combinations using `[' (see next +paragraphs), all other special characters, including `\e', lose their +special significance within a bracket expression. +.PP +Within a bracket expression, a collating element (a character, +a multi-character sequence that collates as if it were a single character, +or a collating-sequence name for either) +enclosed in `[.' and `.]' stands for the +sequence of characters of that collating element. +The sequence is a single element of the bracket expression's list. +A bracket expression containing a multi-character collating element +can thus match more than one character, +e.g. if the collating sequence includes a `ch' collating element, +then the RE `[[.ch.]]*c' matches the first five characters +of `chchcc'. +.PP +Within a bracket expression, a collating element enclosed in `[=' and +`=]' is an equivalence class, standing for the sequences of characters +of all collating elements equivalent to that one, including itself. +(If there are no other equivalent collating elements, +the treatment is as if the enclosing delimiters were `[.' and `.]'.) +For example, if o and \o'o^' are the members of an equivalence class, +then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous. +An equivalence class may not\(dg be an endpoint +of a range. +.PP +Within a bracket expression, the name of a \fIcharacter class\fR enclosed +in `[:' and `:]' stands for the list of all characters belonging to that +class. +Standard character class names are: +.PP +.RS +.nf +.ta 3c 6c 9c +alnum digit punct +alpha graph space +blank lower upper +cntrl print xdigit +.fi +.RE +.PP +These stand for the character classes defined in +.IR ctype (3). +A locale may provide others. +A character class may not be used as an endpoint of a range. +.PP +There are two special cases\(dg of bracket expressions: +the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at +the beginning and end of a word respectively. +A word is defined as a sequence of +word characters +which is neither preceded nor followed by +word characters. +A word character is an +.I alnum +character (as defined by +.IR ctype (3)) +or an underscore. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.PP +In the event that an RE could match more than one substring of a given +string, +the RE matches the one starting earliest in the string. +If the RE could match more than one substring starting at that point, +it matches the longest. +Subexpressions also match the longest possible substrings, subject to +the constraint that the whole match be as long as possible, +with subexpressions starting earlier in the RE taking priority over +ones starting later. +Note that higher-level subexpressions thus take priority over +their lower-level component subexpressions. +.PP +Match lengths are measured in characters, not collating elements. +A null string is considered longer than no match at all. +For example, +`bb*' matches the three middle characters of `abbbc', +`(wee|week)(knights|nights)' matches all ten characters of `weeknights', +when `(.*).*' is matched against `abc' the parenthesized subexpression +matches all three characters, and +when `(a*)*' is matched against `bc' both the whole RE and the parenthesized +subexpression match the null string. +.PP +If case-independent matching is specified, +the effect is much as if all case distinctions had vanished from the +alphabet. +When an alphabetic that exists in multiple cases appears as an +ordinary character outside a bracket expression, it is effectively +transformed into a bracket expression containing both cases, +e.g. `x' becomes `[xX]'. +When it appears inside a bracket expression, all case counterparts +of it are added to the bracket expression, so that (e.g.) `[x]' +becomes `[xX]' and `[^x]' becomes `[^xX]'. +.PP +No particular limit is imposed on the length of REs\(dg. +Programs intended to be portable should not employ REs longer +than 256 bytes, +as an implementation can refuse to accept such REs and remain +POSIX-compliant. +.PP +Obsolete (``basic'') regular expressions differ in several respects. +`|', `+', and `?' are ordinary characters and there is no equivalent +for their functionality. +The delimiters for bounds are `\e{' and `\e}', +with `{' and `}' by themselves ordinary characters. +The parentheses for nested subexpressions are `\e(' and `\e)', +with `(' and `)' by themselves ordinary characters. +`^' is an ordinary character except at the beginning of the +RE or\(dg the beginning of a parenthesized subexpression, +`$' is an ordinary character except at the end of the +RE or\(dg the end of a parenthesized subexpression, +and `*' is an ordinary character if it appears at the beginning of the +RE or the beginning of a parenthesized subexpression +(after a possible leading `^'). +Finally, there is one new type of atom, a \fIback reference\fR: +`\e' followed by a non-zero decimal digit \fId\fR +matches the same sequence of characters +matched by the \fId\fRth parenthesized subexpression +(numbering subexpressions by the positions of their opening parentheses, +left to right), +so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'. +.SH SEE ALSO +regex(3) +.PP +POSIX 1003.2, section 2.8 (Regular Expression Notation). +.SH HISTORY +Written by Henry Spencer, based on the 1003.2 spec. +.SH BUGS +Having two kinds of REs is a botch. +.PP +The current 1003.2 spec says that `)' is an ordinary character in +the absence of an unmatched `('; +this was an unintentional result of a wording error, +and change is likely. +Avoid relying on it. +.PP +Back references are a dreadful botch, +posing major problems for efficient implementations. +They are also somewhat vaguely defined +(does +`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?). +Avoid using them. +.PP +1003.2's specification of case-independent matching is vague. +The ``one case implies all cases'' definition given above +is current consensus among implementors as to the right interpretation. +.PP +The syntax for word boundaries is incredibly ugly. diff --git a/vcnet/regex/regex.h b/vcnet/regex/regex.h new file mode 100644 index 0000000..6918a55 --- /dev/null +++ b/vcnet/regex/regex.h @@ -0,0 +1,74 @@ +#ifndef _REGEX_H_ +#define _REGEX_H_ /* never again */ +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regex2.h === */ +typedef long regoff_t; +typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + const char *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ +} regex_t; +typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ +} regmatch_t; + + +/* === regcomp.c === */ +extern int regcomp(regex_t *, const char *, int); +#define REG_BASIC 0000 +#define REG_EXTENDED 0001 +#define REG_ICASE 0002 +#define REG_NOSUB 0004 +#define REG_NEWLINE 0010 +#define REG_NOSPEC 0020 +#define REG_PEND 0040 +#define REG_DUMP 0200 + + +/* === regerror.c === */ +#define REG_OKAY 0 +#define REG_NOMATCH 1 +#define REG_BADPAT 2 +#define REG_ECOLLATE 3 +#define REG_ECTYPE 4 +#define REG_EESCAPE 5 +#define REG_ESUBREG 6 +#define REG_EBRACK 7 +#define REG_EPAREN 8 +#define REG_EBRACE 9 +#define REG_BADBR 10 +#define REG_ERANGE 11 +#define REG_ESPACE 12 +#define REG_BADRPT 13 +#define REG_EMPTY 14 +#define REG_ASSERT 15 +#define REG_INVARG 16 +#define REG_ATOI 255 /* convert name to number (!) */ +#define REG_ITOA 0400 /* convert number to name (!) */ +extern size_t regerror(int, const regex_t *, char *, size_t); + + +/* === regexec.c === */ +extern int regexec(const regex_t *, const char *, size_t, regmatch_t [], int); +#define REG_NOTBOL 00001 +#define REG_NOTEOL 00002 +#define REG_STARTEND 00004 +#define REG_TRACE 00400 /* tracing of execution */ +#define REG_LARGE 01000 /* force large representation */ +#define REG_BACKR 02000 /* force use of backref code */ + + +/* === regfree.c === */ +extern void regfree(regex_t *); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ +#endif diff --git a/vcnet/regex/regex2.h b/vcnet/regex/regex2.h new file mode 100644 index 0000000..58fd8d8 --- /dev/null +++ b/vcnet/regex/regex2.h @@ -0,0 +1,134 @@ +/* + * First, the stuff that ends up in the outside-world include file + = typedef off_t regoff_t; + = typedef struct { + = int re_magic; + = size_t re_nsub; // number of parenthesized subexpressions + = const char *re_endp; // end pointer for REG_PEND + = struct re_guts *re_g; // none of your business :-) + = } regex_t; + = typedef struct { + = regoff_t rm_so; // start of match + = regoff_t rm_eo; // end of match + = } regmatch_t; + */ +/* + * internals of regex_t + */ +#define MAGIC1 ((('r'^0200)<<8) | 'e') + +/* + * The internal representation is a *strip*, a sequence of + * operators ending with an endmarker. (Some terminology etc. is a + * historical relic of earlier versions which used multiple strips.) + * Certain oddities in the representation are there to permit running + * the machinery backwards; in particular, any deviation from sequential + * flow must be marked at both its source and its destination. Some + * fine points: + * + * - OPLUS_ and O_PLUS are *inside* the loop they create. + * - OQUEST_ and O_QUEST are *outside* the bypass they create. + * - OCH_ and O_CH are *outside* the multi-way branch they create, while + * OOR1 and OOR2 are respectively the end and the beginning of one of + * the branches. Note that there is an implicit OOR2 following OCH_ + * and an implicit OOR1 preceding O_CH. + * + * In state representations, an operator's bit is on to signify a state + * immediately *preceding* "execution" of that operator. + */ +typedef long sop; /* strip operator */ +typedef long sopno; +#define OPRMASK 0x7c000000 +#define OPDMASK 0x03ffffff +#define OPSHIFT (26) +#define OP(n) ((n)&OPRMASK) +#define OPND(n) ((n)&OPDMASK) +#define SOP(op, opnd) ((op)|(opnd)) +/* operators meaning operand */ +/* (back, fwd are offsets) */ +#define OEND (1< uch [csetsize] */ + uch mask; /* bit within array */ + uch hash; /* hash code */ + size_t smultis; + char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ +} cset; +/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ +#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) +#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) +#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) +#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ +#define MCsub(p, cs, cp) mcsub(p, cs, cp) +#define MCin(p, cs, cp) mcin(p, cs, cp) + +/* stuff for character categories */ +typedef unsigned char cat_t; + +/* + * main compiled-expression structure + */ +struct re_guts { + int magic; +# define MAGIC2 ((('R'^0200)<<8)|'E') + sop *strip; /* malloced area for strip */ + int csetsize; /* number of bits in a cset vector */ + int ncsets; /* number of csets in use */ + cset *sets; /* -> cset [ncsets] */ + uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ + int cflags; /* copy of regcomp() cflags argument */ + sopno nstates; /* = number of sops */ + sopno firststate; /* the initial OEND (normally 0) */ + sopno laststate; /* the final OEND */ + int iflags; /* internal flags */ +# define USEBOL 01 /* used ^ */ +# define USEEOL 02 /* used $ */ +# define BAD 04 /* something wrong */ + int nbol; /* number of ^ used */ + int neol; /* number of $ used */ + int ncategories; /* how many character categories */ + cat_t *categories; /* ->catspace[-CHAR_MIN] */ + char *must; /* match must contain this string */ + int mlen; /* length of must */ + size_t nsub; /* copy of re_nsub */ + int backrefs; /* does it use back references? */ + sopno nplus; /* how deep does it nest +s? */ + /* catspace must be last */ + cat_t catspace[1]; /* actually [NC] */ +}; + +/* misc utilities */ +#define OUT (CHAR_MAX+1) /* a non-character value */ +#define ISWORD(c) (isalnum(c) || (c) == '_') diff --git a/vcnet/regex/regexec.c b/vcnet/regex/regexec.c new file mode 100644 index 0000000..dcb11b2 --- /dev/null +++ b/vcnet/regex/regexec.c @@ -0,0 +1,138 @@ +/* + * the outer shell of regexec() + * + * This file includes engine.c *twice*, after muchos fiddling with the + * macros that code uses. This lets the same code operate on two different + * representations for state sets. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +static int nope = 0; /* for use in asserts; shuts lint up */ + +/* macros for manipulating states, small version */ +#define states unsigned +#define states1 unsigned /* for later use in regexec() decision */ +#define CLEAR(v) ((v) = 0) +#define SET0(v, n) ((v) &= ~((unsigned)1 << (n))) +#define SET1(v, n) ((v) |= (unsigned)1 << (n)) +#define ISSET(v, n) ((v) & ((unsigned)1 << (n))) +#define ASSIGN(d, s) ((d) = (s)) +#define EQ(a, b) ((a) == (b)) +#define STATEVARS int dummy /* dummy version */ +#define STATESETUP(m, n) /* nothing */ +#define STATETEARDOWN(m) /* nothing */ +#define SETUP(v) ((v) = 0) +#define onestate unsigned +#define INIT(o, n) ((o) = (unsigned)1 << (n)) +#define INC(o) ((o) <<= 1) +#define ISSTATEIN(v, o) ((v) & (o)) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n)) +#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n)) +#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n))) +/* function names */ +#define SNAMES /* engine.c looks after details */ + +#include "engine.c" + +/* now undo things */ +#undef states +#undef CLEAR +#undef SET0 +#undef SET1 +#undef ISSET +#undef ASSIGN +#undef EQ +#undef STATEVARS +#undef STATESETUP +#undef STATETEARDOWN +#undef SETUP +#undef onestate +#undef INIT +#undef INC +#undef ISSTATEIN +#undef FWD +#undef BACK +#undef ISSETBACK +#undef SNAMES + +/* macros for manipulating states, large version */ +#define states char * +#define CLEAR(v) memset(v, 0, m->g->nstates) +#define SET0(v, n) ((v)[n] = 0) +#define SET1(v, n) ((v)[n] = 1) +#define ISSET(v, n) ((v)[n]) +#define ASSIGN(d, s) memcpy(d, s, m->g->nstates) +#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) +#define STATEVARS int vn; char *space +#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ + if ((m)->space == NULL) return(REG_ESPACE); \ + (m)->vn = 0; } +#define STATETEARDOWN(m) { free((m)->space); } +#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) +#define onestate int +#define INIT(o, n) ((o) = (n)) +#define INC(o) ((o)++) +#define ISSTATEIN(v, o) ((v)[o]) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) +#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) +#define ISSETBACK(v, n) ((v)[here - (n)]) +/* function names */ +#define LNAMES /* flag */ + +#include "engine.c" + +/* + - regexec - interface for matching + = extern int regexec(const regex_t *, const char *, size_t, \ + = regmatch_t [], int); + = #define REG_NOTBOL 00001 + = #define REG_NOTEOL 00002 + = #define REG_STARTEND 00004 + = #define REG_TRACE 00400 // tracing of execution + = #define REG_LARGE 01000 // force large representation + = #define REG_BACKR 02000 // force use of backref code + * + * We put this here so we can exploit knowledge of the state representation + * when choosing which matcher to call. Also, by this point the matchers + * have been prototyped. + */ +int /* 0 success, REG_NOMATCH failure */ +regexec(preg, string, nmatch, pmatch, eflags) +const regex_t *preg; +const char *string; +size_t nmatch; +regmatch_t pmatch[]; +int eflags; +{ + register struct re_guts *g = preg->re_g; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) +#endif + + if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) + return(REG_BADPAT); + assert(!(g->iflags&BAD)); + if (g->iflags&BAD) /* backstop for no-debug case */ + return(REG_BADPAT); + eflags = GOODFLAGS(eflags); + + if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) + return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); + else + return(lmatcher(g, (char *)string, nmatch, pmatch, eflags)); +} diff --git a/vcnet/regex/regfree.c b/vcnet/regex/regfree.c new file mode 100644 index 0000000..9a6acf1 --- /dev/null +++ b/vcnet/regex/regfree.c @@ -0,0 +1,37 @@ +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +/* + - regfree - free everything + = extern void regfree(regex_t *); + */ +void +regfree(preg) +regex_t *preg; +{ + register struct re_guts *g; + + if (preg->re_magic != MAGIC1) /* oops */ + return; /* nice to complain, but hard */ + + g = preg->re_g; + if (g == NULL || g->magic != MAGIC2) /* oops again */ + return; + preg->re_magic = 0; /* mark it invalid */ + g->magic = 0; /* mark it invalid */ + + if (g->strip != NULL) + free((char *)g->strip); + if (g->sets != NULL) + free((char *)g->sets); + if (g->setbits != NULL) + free((char *)g->setbits); + if (g->must != NULL) + free(g->must); + free((char *)g); +} diff --git a/vcnet/regex/split.c b/vcnet/regex/split.c new file mode 100644 index 0000000..188bdb7 --- /dev/null +++ b/vcnet/regex/split.c @@ -0,0 +1,316 @@ +#include +#include + +/* + - split - divide a string into fields, like awk split() + = int split(char *string, char *fields[], int nfields, char *sep); + */ +int /* number of fields, including overflow */ +split(string, fields, nfields, sep) +char *string; +char *fields[]; /* list is not NULL-terminated */ +int nfields; /* number of entries available in fields[] */ +char *sep; /* "" white, "c" single char, "ab" [ab]+ */ +{ + register char *p = string; + register char c; /* latest character */ + register char sepc = sep[0]; + register char sepc2; + register int fn; + register char **fp = fields; + register char *sepp; + register int trimtrail; + + /* white space */ + if (sepc == '\0') { + while ((c = *p++) == ' ' || c == '\t') + continue; + p--; + trimtrail = 1; + sep = " \t"; /* note, code below knows this is 2 long */ + sepc = ' '; + } else + trimtrail = 0; + sepc2 = sep[1]; /* now we can safely pick this up */ + + /* catch empties */ + if (*p == '\0') + return(0); + + /* single separator */ + if (sepc2 == '\0') { + fn = nfields; + for (;;) { + *fp++ = p; + fn--; + if (fn == 0) + break; + while ((c = *p++) != sepc) + if (c == '\0') + return(nfields - fn); + *(p-1) = '\0'; + } + /* we have overflowed the fields vector -- just count them */ + fn = nfields; + for (;;) { + while ((c = *p++) != sepc) + if (c == '\0') + return(fn); + fn++; + } + /* not reached */ + } + + /* two separators */ + if (sep[2] == '\0') { + fn = nfields; + for (;;) { + *fp++ = p; + fn--; + while ((c = *p++) != sepc && c != sepc2) + if (c == '\0') { + if (trimtrail && **(fp-1) == '\0') + fn++; + return(nfields - fn); + } + if (fn == 0) + break; + *(p-1) = '\0'; + while ((c = *p++) == sepc || c == sepc2) + continue; + p--; + } + /* we have overflowed the fields vector -- just count them */ + fn = nfields; + while (c != '\0') { + while ((c = *p++) == sepc || c == sepc2) + continue; + p--; + fn++; + while ((c = *p++) != '\0' && c != sepc && c != sepc2) + continue; + } + /* might have to trim trailing white space */ + if (trimtrail) { + p--; + while ((c = *--p) == sepc || c == sepc2) + continue; + p++; + if (*p != '\0') { + if (fn == nfields+1) + *p = '\0'; + fn--; + } + } + return(fn); + } + + /* n separators */ + fn = 0; + for (;;) { + if (fn < nfields) + *fp++ = p; + fn++; + for (;;) { + c = *p++; + if (c == '\0') + return(fn); + sepp = sep; + while ((sepc = *sepp++) != '\0' && sepc != c) + continue; + if (sepc != '\0') /* it was a separator */ + break; + } + if (fn < nfields) + *(p-1) = '\0'; + for (;;) { + c = *p++; + sepp = sep; + while ((sepc = *sepp++) != '\0' && sepc != c) + continue; + if (sepc == '\0') /* it wasn't a separator */ + break; + } + p--; + } + + /* not reached */ +} + +#ifdef TEST_SPLIT + + +/* + * test program + * pgm runs regression + * pgm sep splits stdin lines by sep + * pgm str sep splits str by sep + * pgm str sep n splits str by sep n times + */ +int +main(argc, argv) +int argc; +char *argv[]; +{ + char buf[512]; + register int n; +# define MNF 10 + char *fields[MNF]; + + if (argc > 4) + for (n = atoi(argv[3]); n > 0; n--) { + (void) strcpy(buf, argv[1]); + } + else if (argc > 3) + for (n = atoi(argv[3]); n > 0; n--) { + (void) strcpy(buf, argv[1]); + (void) split(buf, fields, MNF, argv[2]); + } + else if (argc > 2) + dosplit(argv[1], argv[2]); + else if (argc > 1) + while (fgets(buf, sizeof(buf), stdin) != NULL) { + buf[strlen(buf)-1] = '\0'; /* stomp newline */ + dosplit(buf, argv[1]); + } + else + regress(); + + exit(0); +} + +dosplit(string, seps) +char *string; +char *seps; +{ +# define NF 5 + char *fields[NF]; + register int nf; + + nf = split(string, fields, NF, seps); + print(nf, NF, fields); +} + +print(nf, nfp, fields) +int nf; +int nfp; +char *fields[]; +{ + register int fn; + register int bound; + + bound = (nf > nfp) ? nfp : nf; + printf("%d:\t", nf); + for (fn = 0; fn < bound; fn++) + printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n"); +} + +#define RNF 5 /* some table entries know this */ +struct { + char *str; + char *seps; + int nf; + char *fi[RNF]; +} tests[] = { + "", " ", 0, { "" }, + " ", " ", 2, { "", "" }, + "x", " ", 1, { "x" }, + "xy", " ", 1, { "xy" }, + "x y", " ", 2, { "x", "y" }, + "abc def g ", " ", 5, { "abc", "def", "", "g", "" }, + " a bcd", " ", 4, { "", "", "a", "bcd" }, + "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " ", 6, { "", "a", "b", "c", "d " }, + + "", " _", 0, { "" }, + " ", " _", 2, { "", "" }, + "x", " _", 1, { "x" }, + "x y", " _", 2, { "x", "y" }, + "ab _ cd", " _", 2, { "ab", "cd" }, + " a_b c ", " _", 5, { "", "a", "b", "c", "" }, + "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " _", 6, { "", "a", "b", "c", "d " }, + + "", " _~", 0, { "" }, + " ", " _~", 2, { "", "" }, + "x", " _~", 1, { "x" }, + "x y", " _~", 2, { "x", "y" }, + "ab _~ cd", " _~", 2, { "ab", "cd" }, + " a_b c~", " _~", 5, { "", "a", "b", "c", "" }, + "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" }, + "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " }, + + "", " _~-", 0, { "" }, + " ", " _~-", 2, { "", "" }, + "x", " _~-", 1, { "x" }, + "x y", " _~-", 2, { "x", "y" }, + "ab _~- cd", " _~-", 2, { "ab", "cd" }, + " a_b c~", " _~-", 5, { "", "a", "b", "c", "" }, + "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" }, + "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " }, + + "", " ", 0, { "" }, + " ", " ", 2, { "", "" }, + "x", " ", 1, { "x" }, + "xy", " ", 1, { "xy" }, + "x y", " ", 2, { "x", "y" }, + "abc def g ", " ", 4, { "abc", "def", "g", "" }, + " a bcd", " ", 3, { "", "a", "bcd" }, + "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " ", 6, { "", "a", "b", "c", "d " }, + + "", "", 0, { "" }, + " ", "", 0, { "" }, + "x", "", 1, { "x" }, + "xy", "", 1, { "xy" }, + "x y", "", 2, { "x", "y" }, + "abc def g ", "", 3, { "abc", "def", "g" }, + "\t a bcd", "", 2, { "a", "bcd" }, + " a \tb\t c ", "", 3, { "a", "b", "c" }, + "a b c d e ", "", 5, { "a", "b", "c", "d", "e" }, + "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" }, + " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " }, + + NULL, NULL, 0, { NULL }, +}; + +regress() +{ + char buf[512]; + register int n; + char *fields[RNF+1]; + register int nf; + register int i; + register int printit; + register char *f; + + for (n = 0; tests[n].str != NULL; n++) { + (void) strcpy(buf, tests[n].str); + fields[RNF] = NULL; + nf = split(buf, fields, RNF, tests[n].seps); + printit = 0; + if (nf != tests[n].nf) { + printf("split `%s' by `%s' gave %d fields, not %d\n", + tests[n].str, tests[n].seps, nf, tests[n].nf); + printit = 1; + } else if (fields[RNF] != NULL) { + printf("split() went beyond array end\n"); + printit = 1; + } else { + for (i = 0; i < nf && i < RNF; i++) { + f = fields[i]; + if (f == NULL) + f = "(NULL)"; + if (strcmp(f, tests[n].fi[i]) != 0) { + printf("split `%s' by `%s', field %d is `%s', not `%s'\n", + tests[n].str, tests[n].seps, + i, fields[i], tests[n].fi[i]); + printit = 1; + } + } + } + if (printit) + print(nf, RNF, fields); + } +} +#endif diff --git a/vcnet/regex/tests b/vcnet/regex/tests new file mode 100644 index 0000000..e4d928d --- /dev/null +++ b/vcnet/regex/tests @@ -0,0 +1,477 @@ +# regular expression test set +# Lines are at least three fields, separated by one or more tabs. "" stands +# for an empty field. First field is an RE. Second field is flags. If +# C flag given, regcomp() is expected to fail, and the third field is the +# error name (minus the leading REG_). +# +# Otherwise it is expected to succeed, and the third field is the string to +# try matching it against. If there is no fourth field, the match is +# expected to fail. If there is a fourth field, it is the substring that +# the RE is expected to match. If there is a fifth field, it is a comma- +# separated list of what the subexpressions should match, with - indicating +# no match for that one. In both the fourth and fifth fields, a (sub)field +# starting with @ indicates that the (sub)expression is expected to match +# a null string followed by the stuff after the @; this provides a way to +# test where null strings match. The character `N' in REs and strings +# is newline, `S' is space, `T' is tab, `Z' is NUL. +# +# The full list of flags: +# - placeholder, does nothing +# b RE is a BRE, not an ERE +# & try it as both an ERE and a BRE +# C regcomp() error expected, third field is error name +# i REG_ICASE +# m ("mundane") REG_NOSPEC +# s REG_NOSUB (not really testable) +# n REG_NEWLINE +# ^ REG_NOTBOL +# $ REG_NOTEOL +# # REG_STARTEND (see below) +# p REG_PEND +# +# For REG_STARTEND, the start/end offsets are those of the substring +# enclosed in (). + +# basics +a & a a +abc & abc abc +abc|de - abc abc +a|b|c - abc a + +# parentheses and perversions thereof +a(b)c - abc abc +a\(b\)c b abc abc +a( C EPAREN +a( b a( a( +a\( - a( a( +a\( bC EPAREN +a\(b bC EPAREN +a(b C EPAREN +a(b b a(b a(b +# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly) +a) - a) a) +) - ) ) +# end gagging (in a just world, those *should* give EPAREN) +a) b a) a) +a\) bC EPAREN +\) bC EPAREN +a()b - ab ab +a\(\)b b ab ab + +# anchoring and REG_NEWLINE +^abc$ & abc abc +a^b - a^b +a^b b a^b a^b +a$b - a$b +a$b b a$b a$b +^ & abc @abc +$ & abc @ +^$ & "" @ +$^ - "" @ +\($\)\(^\) b "" @ +# stop retching, those are legitimate (although disgusting) +^^ - "" @ +$$ - "" @ +b$ & abNc +b$ &n abNc b +^b$ & aNbNc +^b$ &n aNbNc b +^$ &n aNNb @Nb +^$ n abc +^$ n abcN @ +$^ n aNNb @Nb +\($\)\(^\) bn aNNb @Nb +^^ n^ aNNb @Nb +$$ n aNNb @NN +^a ^ a +a$ $ a +^a ^n aNb +^b ^n aNb b +a$ $n bNa +b$ $n bNa b +a*(^b$)c* - b b +a*\(^b$\)c* b b b + +# certain syntax errors and non-errors +| C EMPTY +| b | | +* C BADRPT +* b * * ++ C BADRPT +? C BADRPT +"" &C EMPTY +() - abc @abc +\(\) b abc @abc +a||b C EMPTY +|ab C EMPTY +ab| C EMPTY +(|a)b C EMPTY +(a|)b C EMPTY +(*a) C BADRPT +(+a) C BADRPT +(?a) C BADRPT +({1}a) C BADRPT +\(\{1\}a\) bC BADRPT +(a|*b) C BADRPT +(a|+b) C BADRPT +(a|?b) C BADRPT +(a|{1}b) C BADRPT +^* C BADRPT +^* b * * +^+ C BADRPT +^? C BADRPT +^{1} C BADRPT +^\{1\} bC BADRPT + +# metacharacters, backslashes +a.c & abc abc +a[bc]d & abd abd +a\*c & a*c a*c +a\\b & a\b a\b +a\\\*b & a\*b a\*b +a\bc & abc abc +a\ &C EESCAPE +a\\bc & a\bc a\bc +\{ bC BADRPT +a\[b & a[b a[b +a[b &C EBRACK +# trailing $ is a peculiar special case for the BRE code +a$ & a a +a$ & a$ +a\$ & a +a\$ & a$ a$ +a\\$ & a +a\\$ & a$ +a\\$ & a\$ +a\\$ & a\ a\ + +# back references, ugh +a\(b\)\2c bC ESUBREG +a\(b\1\)c bC ESUBREG +a\(b*\)c\1d b abbcbbd abbcbbd bb +a\(b*\)c\1d b abbcbd +a\(b*\)c\1d b abbcbbbd +^\(.\)\1 b abc +a\([bc]\)\1d b abcdabbd abbd b +a\(\([bc]\)\2\)*d b abbccd abbccd +a\(\([bc]\)\2\)*d b abbcbd +# actually, this next one probably ought to fail, but the spec is unclear +a\(\(b\)*\2\)*d b abbbd abbbd +# here is a case that no NFA implementation does right +\(ab*\)[ab]*\1 b ababaaa ababaaa a +# check out normal matching in the presence of back refs +\(a\)\1bcd b aabcd aabcd +\(a\)\1bc*d b aabcd aabcd +\(a\)\1bc*d b aabd aabd +\(a\)\1bc*d b aabcccd aabcccd +\(a\)\1bc*[ce]d b aabcccd aabcccd +^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd + +# ordinary repetitions +ab*c & abc abc +ab+c - abc abc +ab?c - abc abc +a\(*\)b b a*b a*b +a\(**\)b b ab ab +a\(***\)b bC BADRPT +*a b *a *a +**a b a a +***a bC BADRPT + +# the dreaded bounded repetitions +{ & { { +{abc & {abc {abc +{1 C BADRPT +{1} C BADRPT +a{b & a{b a{b +a{1}b - ab ab +a\{1\}b b ab ab +a{1,}b - ab ab +a\{1,\}b b ab ab +a{1,2}b - aab aab +a\{1,2\}b b aab aab +a{1 C EBRACE +a\{1 bC EBRACE +a{1a C EBRACE +a\{1a bC EBRACE +a{1a} C BADBR +a\{1a\} bC BADBR +a{,2} - a{,2} a{,2} +a\{,2\} bC BADBR +a{,} - a{,} a{,} +a\{,\} bC BADBR +a{1,x} C BADBR +a\{1,x\} bC BADBR +a{1,x C EBRACE +a\{1,x bC EBRACE +a{300} C BADBR +a\{300\} bC BADBR +a{1,0} C BADBR +a\{1,0\} bC BADBR +ab{0,0}c - abcac ac +ab\{0,0\}c b abcac ac +ab{0,1}c - abcac abc +ab\{0,1\}c b abcac abc +ab{0,3}c - abbcac abbc +ab\{0,3\}c b abbcac abbc +ab{1,1}c - acabc abc +ab\{1,1\}c b acabc abc +ab{1,3}c - acabc abc +ab\{1,3\}c b acabc abc +ab{2,2}c - abcabbc abbc +ab\{2,2\}c b abcabbc abbc +ab{2,4}c - abcabbc abbc +ab\{2,4\}c b abcabbc abbc +((a{1,10}){1,10}){1,10} - a a a,a + +# multiple repetitions +a** &C BADRPT +a++ C BADRPT +a?? C BADRPT +a*+ C BADRPT +a*? C BADRPT +a+* C BADRPT +a+? C BADRPT +a?* C BADRPT +a?+ C BADRPT +a{1}{1} C BADRPT +a*{1} C BADRPT +a+{1} C BADRPT +a?{1} C BADRPT +a{1}* C BADRPT +a{1}+ C BADRPT +a{1}? C BADRPT +a*{b} - a{b} a{b} +a\{1\}\{1\} bC BADRPT +a*\{1\} bC BADRPT +a\{1\}* bC BADRPT + +# brackets, and numerous perversions thereof +a[b]c & abc abc +a[ab]c & abc abc +a[^ab]c & adc adc +a[]b]c & a]c a]c +a[[b]c & a[c a[c +a[-b]c & a-c a-c +a[^]b]c & adc adc +a[^-b]c & adc adc +a[b-]c & a-c a-c +a[b &C EBRACK +a[] &C EBRACK +a[1-3]c & a2c a2c +a[3-1]c &C ERANGE +a[1-3-5]c &C ERANGE +a[[.-.]--]c & a-c a-c +a[1- &C ERANGE +a[[. &C EBRACK +a[[.x &C EBRACK +a[[.x. &C EBRACK +a[[.x.] &C EBRACK +a[[.x.]] & ax ax +a[[.x,.]] &C ECOLLATE +a[[.one.]]b & a1b a1b +a[[.notdef.]]b &C ECOLLATE +a[[.].]]b & a]b a]b +a[[:alpha:]]c & abc abc +a[[:notdef:]]c &C ECTYPE +a[[: &C EBRACK +a[[:alpha &C EBRACK +a[[:alpha:] &C EBRACK +a[[:alpha,:] &C ECTYPE +a[[:]:]]b &C ECTYPE +a[[:-:]]b &C ECTYPE +a[[:alph:]] &C ECTYPE +a[[:alphabet:]] &C ECTYPE +[[:alnum:]]+ - -%@a0X- a0X +[[:alpha:]]+ - -%@aX0- aX +[[:blank:]]+ - aSSTb SST +[[:cntrl:]]+ - aNTb NT +[[:digit:]]+ - a019b 019 +[[:graph:]]+ - Sa%bS a%b +[[:lower:]]+ - AabC ab +[[:print:]]+ - NaSbN aSb +[[:punct:]]+ - S%-&T %-& +[[:space:]]+ - aSNTb SNT +[[:upper:]]+ - aBCd BC +[[:xdigit:]]+ - p0f3Cq 0f3C +a[[=b=]]c & abc abc +a[[= &C EBRACK +a[[=b &C EBRACK +a[[=b= &C EBRACK +a[[=b=] &C EBRACK +a[[=b,=]] &C ECOLLATE +a[[=one=]]b & a1b a1b + +# complexities +a(((b)))c - abc abc +a(b|(c))d - abd abd +a(b*|c)d - abbd abbd +# just gotta have one DFA-buster, of course +a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab +# and an inline expansion in case somebody gets tricky +a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab +# and in case somebody just slips in an NFA... +a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights +# fish for anomalies as the number of states passes 32 +12345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789 +123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890 +1234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901 +12345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012 +123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123 +# and one really big one, beyond any plausible word width +1234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890 +# fish for problems as brackets go past 8 +[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm +[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo +[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq +[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq + +# subtleties of matching +abc & xabcy abc +a\(b\)?c\1d b acd +aBc i Abc Abc +a[Bc]*d i abBCcd abBCcd +0[[:upper:]]1 &i 0a1 0a1 +0[[:lower:]]1 &i 0A1 0A1 +a[^b]c &i abc +a[^b]c &i aBc +a[^b]c &i adc adc +[a]b[c] - abc abc +[a]b[a] - aba aba +[abc]b[abc] - abc abc +[abc]b[abd] - abd abd +a(b?c)+d - accd accd +(wee|week)(knights|night) - weeknights weeknights +(we|wee|week|frob)(knights|night|day) - weeknights weeknights +a[bc]d - xyzaaabcaababdacd abd +a[ab]c - aaabc abc +abc s abc abc +a* & b @b + +# Let's have some fun -- try to match a C comment. +# first the obvious, which looks okay at first glance... +/\*.*\*/ - /*x*/ /*x*/ +# but... +/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/ +# okay, we must not match */ inside; try to do that... +/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/ +/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/ +# but... +/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/ +# and a still fancier version, which does it right (I think)... +/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/ +/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/ +/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/ +/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/ +/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/ +/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/ + +# subexpressions +.* - abc abc - +a(b)(c)d - abcd abcd b,c +a(((b)))c - abc abc b,b,b +a(b|(c))d - abd abd b,- +a(b*|c|e)d - abbd abbd bb +a(b*|c|e)d - acd acd c +a(b*|c|e)d - ad ad @d +a(b?)c - abc abc b +a(b?)c - ac ac @c +a(b+)c - abc abc b +a(b+)c - abbbc abbbc bbb +a(b*)c - ac ac @c +(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de +# the regression tester only asks for 9 subexpressions +a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j +a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k +a([bc]?)c - abc abc b +a([bc]?)c - ac ac @c +a([bc]+)c - abc abc b +a([bc]+)c - abcc abcc bc +a([bc]+)bc - abcbc abcbc bc +a(bb+|b)b - abb abb b +a(bbb+|bb+|b)b - abb abb b +a(bbb+|bb+|b)b - abbb abbb bb +a(bbb+|bb+|b)bb - abbb abbb b +(.*).* - abcdef abcdef abcdef +(a*)* - bc @b @b + +# do we get the right subexpression when it is used more than once? +a(b|c)*d - ad ad - +a(b|c)*d - abcd abcd c +a(b|c)+d - abd abd b +a(b|c)+d - abcd abcd c +a(b|c?)+d - ad ad @d +a(b|c?)+d - abcd abcd @d +a(b|c){0,0}d - ad ad - +a(b|c){0,1}d - ad ad - +a(b|c){0,1}d - abd abd b +a(b|c){0,2}d - ad ad - +a(b|c){0,2}d - abcd abcd c +a(b|c){0,}d - ad ad - +a(b|c){0,}d - abcd abcd c +a(b|c){1,1}d - abd abd b +a(b|c){1,1}d - acd acd c +a(b|c){1,2}d - abd abd b +a(b|c){1,2}d - abcd abcd c +a(b|c){1,}d - abd abd b +a(b|c){1,}d - abcd abcd c +a(b|c){2,2}d - acbd acbd b +a(b|c){2,2}d - abcd abcd c +a(b|c){2,4}d - abcd abcd c +a(b|c){2,4}d - abcbd abcbd b +a(b|c){2,4}d - abcbcd abcbcd c +a(b|c){2,}d - abcd abcd c +a(b|c){2,}d - abcbd abcbd b +a(b+|((c)*))+d - abd abd @d,@d,- +a(b+|((c)*))+d - abcd abcd @d,@d,- + +# check out the STARTEND option +[abc] &# a(b)c b +[abc] &# a(d)c +[abc] &# a(bc)d b +[abc] &# a(dc)d c +. &# a()c +b.*c &# b(bc)c bc +b.* &# b(bc)c bc +.*c &# b(bc)c bc + +# plain strings, with the NOSPEC flag +abc m abc abc +abc m xabcy abc +abc m xyz +a*b m aba*b a*b +a*b m ab +"" mC EMPTY + +# cases involving NULs +aZb & a a +aZb &p a +aZb &p# (aZb) aZb +aZ*b &p# (ab) ab +a.b &# (aZb) aZb +a.* &# (aZb)c aZb + +# word boundaries (ick) +[[:<:]]a & a a +[[:<:]]a & ba +[[:<:]]a & -a a +a[[:>:]] & a a +a[[:>:]] & ab +a[[:>:]] & a- a +[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc +[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc +[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc +[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc +[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_ +[[:<:]]a_b[[:>:]] & x_a_b + +# past problems, and suspected problems +(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1 +abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop +abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv +(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN]) - CC11 CC11 +CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11 +Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz +a?b - ab ab +-\{0,1\}[0-9]*$ b -5 -5 +a*a*a*a*a*a*a* & aaaaaa aaaaaa diff --git a/vcnet/regex/utils.h b/vcnet/regex/utils.h new file mode 100644 index 0000000..1a997ac --- /dev/null +++ b/vcnet/regex/utils.h @@ -0,0 +1,22 @@ +/* utility definitions */ +#ifdef _POSIX2_RE_DUP_MAX +#define DUPMAX _POSIX2_RE_DUP_MAX +#else +#define DUPMAX 255 +#endif +#define INFINITY (DUPMAX + 1) +#define NC (CHAR_MAX - CHAR_MIN + 1) +typedef unsigned char uch; + +/* switch off assertions (if not already off) if no REDEBUG */ +#ifndef REDEBUG +#ifndef NDEBUG +#define NDEBUG /* no assertions please */ +#endif +#endif +#include + +/* for old systems with bcopy() but no memmove() */ +#ifdef USEBCOPY +#define memmove(d, s, c) bcopy(s, d, c) +#endif diff --git a/vcnet/testfile.vcproj b/vcnet/testfile.vcproj new file mode 100644 index 0000000..070dd6b --- /dev/null +++ b/vcnet/testfile.vcproj @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vcnet/testhttp.vcproj b/vcnet/testhttp.vcproj new file mode 100755 index 0000000..c041ebb --- /dev/null +++ b/vcnet/testhttp.vcproj @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xcode/CUPS.xcodeproj/project.pbxproj b/xcode/CUPS.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5cc40ed --- /dev/null +++ b/xcode/CUPS.xcodeproj/project.pbxproj @@ -0,0 +1,4614 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXAggregateTarget section */ + 273BF6D91333B6260022CAAB /* Tests */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 273BF6DA1333B6270022CAAB /* Build configuration list for PBXAggregateTarget "Tests" */; + buildPhases = ( + ); + dependencies = ( + 726AD704135E8AA1002C930D /* PBXTargetDependency */, + 273BF6DE1333B6370022CAAB /* PBXTargetDependency */, + 278C58D6136B641D00836530 /* PBXTargetDependency */, + 270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */, + ); + name = Tests; + productName = Tests; + }; + 274FF5DE13332D3000317ECB /* All */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 274FF5DF13332D3100317ECB /* Build configuration list for PBXAggregateTarget "All" */; + buildPhases = ( + ); + dependencies = ( + 274FF5E313332D4300317ECB /* PBXTargetDependency */, + 72F75A711336FACD004BB496 /* PBXTargetDependency */, + 274FF5E513332D4300317ECB /* PBXTargetDependency */, + 274FF622133331D300317ECB /* PBXTargetDependency */, + 276684131337FA8D000D33D0 /* PBXTargetDependency */, + 2766836B1337AA25000D33D0 /* PBXTargetDependency */, + 274FF5E713332D4300317ECB /* PBXTargetDependency */, + 274FF6E21333B33F00317ECB /* PBXTargetDependency */, + 72F75A731336FACD004BB496 /* PBXTargetDependency */, + 274FF6391333348400317ECB /* PBXTargetDependency */, + 274FF5E913332D4300317ECB /* PBXTargetDependency */, + 274FF648133335A300317ECB /* PBXTargetDependency */, + 274FF65E13333A3400317ECB /* PBXTargetDependency */, + 274FF67213333AE400317ECB /* PBXTargetDependency */, + 724379531333FECE009631B9 /* PBXTargetDependency */, + 724379111333E4EA009631B9 /* PBXTargetDependency */, + 276683FF1337F7C5000D33D0 /* PBXTargetDependency */, + 7243792B1333E962009631B9 /* PBXTargetDependency */, + 276683D71337B24A000D33D0 /* PBXTargetDependency */, + 276683D91337B24A000D33D0 /* PBXTargetDependency */, + 276683DB1337B24A000D33D0 /* PBXTargetDependency */, + 276683DD1337B24A000D33D0 /* PBXTargetDependency */, + 276683DF1337B24A000D33D0 /* PBXTargetDependency */, + 7258EAEF13459ADA009286F1 /* PBXTargetDependency */, + 720DD6D11358FDBE0064AA82 /* PBXTargetDependency */, + 7243793F1333FD23009631B9 /* PBXTargetDependency */, + 724379C31333FF7D009631B9 /* PBXTargetDependency */, + ); + name = All; + productName = All; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 270CCDB9135E3D0900007BE2 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; }; + 270CCDBA135E3D0900007BE2 /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; + 270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */ = {isa = PBXBuildFile; fileRef = 270CCDBB135E3D3E00007BE2 /* testmime.c */; }; + 273BF6C71333B5370022CAAB /* testcups.c in Sources */ = {isa = PBXBuildFile; fileRef = 273BF6C61333B5370022CAAB /* testcups.c */; }; + 273BF6CE1333B5950022CAAB /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6CB1333B5950022CAAB /* CoreFoundation.framework */; }; + 273BF6CF1333B5950022CAAB /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6CC1333B5950022CAAB /* libiconv.dylib */; }; + 273BF6D01333B5950022CAAB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6CD1333B5950022CAAB /* libz.dylib */; }; + 273BF6D31333B5C30022CAAB /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6D11333B5C30022CAAB /* Kerberos.framework */; }; + 273BF6D41333B5C30022CAAB /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6D21333B5C30022CAAB /* Security.framework */; }; + 273BF6D71333B5F60022CAAB /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6D51333B5F60022CAAB /* libresolv.dylib */; }; + 273BF6D81333B5F60022CAAB /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273BF6D61333B5F60022CAAB /* SystemConfiguration.framework */; }; + 274FF5D913332CC700317ECB /* cups-driverd.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D613332CC700317ECB /* cups-driverd.cxx */; }; + 274FF5DA13332CC700317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D713332CC700317ECB /* util.c */; }; + 274FF5DD13332D0600317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF60A1333315100317ECB /* ppdc-array.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F51333315100317ECB /* ppdc-array.cxx */; }; + 274FF60B1333315100317ECB /* ppdc-attr.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F61333315100317ECB /* ppdc-attr.cxx */; }; + 274FF60C1333315100317ECB /* ppdc-catalog.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F71333315100317ECB /* ppdc-catalog.cxx */; }; + 274FF60D1333315100317ECB /* ppdc-choice.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F81333315100317ECB /* ppdc-choice.cxx */; }; + 274FF60E1333315100317ECB /* ppdc-constraint.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5F91333315100317ECB /* ppdc-constraint.cxx */; }; + 274FF60F1333315100317ECB /* ppdc-driver.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FA1333315100317ECB /* ppdc-driver.cxx */; }; + 274FF6101333315100317ECB /* ppdc-file.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FB1333315100317ECB /* ppdc-file.cxx */; }; + 274FF6111333315100317ECB /* ppdc-filter.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FC1333315100317ECB /* ppdc-filter.cxx */; }; + 274FF6121333315100317ECB /* ppdc-font.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FD1333315100317ECB /* ppdc-font.cxx */; }; + 274FF6131333315100317ECB /* ppdc-group.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FE1333315100317ECB /* ppdc-group.cxx */; }; + 274FF6141333315100317ECB /* ppdc-import.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5FF1333315100317ECB /* ppdc-import.cxx */; }; + 274FF6151333315100317ECB /* ppdc-mediasize.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6001333315100317ECB /* ppdc-mediasize.cxx */; }; + 274FF6161333315100317ECB /* ppdc-message.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6011333315100317ECB /* ppdc-message.cxx */; }; + 274FF6171333315100317ECB /* ppdc-option.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6021333315100317ECB /* ppdc-option.cxx */; }; + 274FF6181333315100317ECB /* ppdc-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 274FF6031333315100317ECB /* ppdc-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 274FF6191333315100317ECB /* ppdc-profile.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6041333315100317ECB /* ppdc-profile.cxx */; }; + 274FF61A1333315100317ECB /* ppdc-shared.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6051333315100317ECB /* ppdc-shared.cxx */; }; + 274FF61B1333315100317ECB /* ppdc-source.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6061333315100317ECB /* ppdc-source.cxx */; }; + 274FF61C1333315100317ECB /* ppdc-string.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6071333315100317ECB /* ppdc-string.cxx */; }; + 274FF61D1333315100317ECB /* ppdc-variable.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6081333315100317ECB /* ppdc-variable.cxx */; }; + 274FF61E1333315100317ECB /* ppdc.h in Headers */ = {isa = PBXBuildFile; fileRef = 274FF6091333315100317ECB /* ppdc.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 274FF6231333321400317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF6241333323B00317ECB /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 274FF6321333334A00317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF6361333344400317ECB /* cups-deviced.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6351333344400317ECB /* cups-deviced.c */; }; + 274FF6371333345900317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF5D713332CC700317ECB /* util.c */; }; + 274FF64A1333398D00317ECB /* cups-exec.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF6491333398D00317ECB /* cups-exec.c */; }; + 274FF658133339D300317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF65C133339FC00317ECB /* cups-lpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF65B133339FC00317ECB /* cups-lpd.c */; }; + 274FF66E13333AB500317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF67013333ACF00317ECB /* cups-polld.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF66F13333ACF00317ECB /* cups-polld.c */; }; + 274FF68513333B4300317ECB /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 274FF68613333B4300317ECB /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; + 274FF68813333B6E00317ECB /* cupsfilter.c in Sources */ = {isa = PBXBuildFile; fileRef = 274FF68713333B6E00317ECB /* cupsfilter.c */; }; + 274FF68B1333B1C400317ECB /* adminutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB51333052D00FCA411 /* adminutil.c */; }; + 274FF68C1333B1C400317ECB /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; + 274FF68D1333B1C400317ECB /* attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBA1333056300FCA411 /* attr.c */; }; + 274FF68E1333B1C400317ECB /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBB1333056300FCA411 /* auth.c */; }; + 274FF68F1333B1C400317ECB /* backchannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBC1333056300FCA411 /* backchannel.c */; }; + 274FF6901333B1C400317ECB /* backend.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBD1333056300FCA411 /* backend.c */; }; + 274FF6911333B1C400317ECB /* conflicts.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBF1333056300FCA411 /* conflicts.c */; }; + 274FF6921333B1C400317ECB /* custom.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EC21333056300FCA411 /* custom.c */; }; + 274FF6931333B1C400317ECB /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED1133305BB00FCA411 /* debug.c */; }; + 274FF6941333B1C400317ECB /* dest.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED2133305BB00FCA411 /* dest.c */; }; + 274FF6951333B1C400317ECB /* dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED3133305BB00FCA411 /* dir.c */; }; + 274FF6961333B1C400317ECB /* emit.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED5133305BB00FCA411 /* emit.c */; }; + 274FF6971333B1C400317ECB /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED6133305BB00FCA411 /* encode.c */; }; + 274FF6981333B1C400317ECB /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED8133305BB00FCA411 /* file.c */; }; + 274FF6991333B1C400317ECB /* getdevices.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDA133305BB00FCA411 /* getdevices.c */; }; + 274FF69A1333B1C400317ECB /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDB133305BB00FCA411 /* getifaddrs.c */; }; + 274FF69B1333B1C400317ECB /* getputfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDC133305BB00FCA411 /* getputfile.c */; }; + 274FF69C1333B1C400317ECB /* globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDD133305BB00FCA411 /* globals.c */; }; + 274FF69D1333B1C400317ECB /* http-addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDE133305BB00FCA411 /* http-addr.c */; }; + 274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDF133305BB00FCA411 /* http-addrlist.c */; }; + 274FF69F1333B1C400317ECB /* http-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE1133305BB00FCA411 /* http-support.c */; }; + 274FF6A01333B1C400317ECB /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE2133305BB00FCA411 /* http.c */; }; + 274FF6A11333B1C400317ECB /* ipp-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE5133305BB00FCA411 /* ipp-support.c */; }; + 274FF6A21333B1C400317ECB /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE6133305BB00FCA411 /* ipp.c */; }; + 274FF6A31333B1C400317ECB /* langprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE8133305BB00FCA411 /* langprintf.c */; }; + 274FF6A41333B1C400317ECB /* language.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEA133305BB00FCA411 /* language.c */; }; + 274FF6A51333B1C400317ECB /* localize.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEC133305BB00FCA411 /* localize.c */; }; + 274FF6A61333B1C400317ECB /* mark.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EED133305BB00FCA411 /* mark.c */; }; + 274FF6A71333B1C400317ECB /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEF133305BB00FCA411 /* md5.c */; }; + 274FF6A81333B1C400317ECB /* md5passwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF0133305BB00FCA411 /* md5passwd.c */; }; + 274FF6A91333B1C400317ECB /* notify.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF1133305BB00FCA411 /* notify.c */; }; + 274FF6AA1333B1C400317ECB /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF2133305BB00FCA411 /* options.c */; }; + 274FF6AB1333B1C400317ECB /* page.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF3133305BB00FCA411 /* page.c */; }; + 274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF4133305BB00FCA411 /* ppd-cache.c */; }; + 274FF6AD1333B1C400317ECB /* ppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF6133305BB00FCA411 /* ppd.c */; }; + 274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF8133305BB00FCA411 /* pwg-media.c */; }; + 274FF6AF1333B1C400317ECB /* request.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFB133305BB00FCA411 /* request.c */; }; + 274FF6B01333B1C400317ECB /* sidechannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFC133305BB00FCA411 /* sidechannel.c */; }; + 274FF6B11333B1C400317ECB /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFF133305BB00FCA411 /* snmp.c */; }; + 274FF6B21333B1C400317ECB /* snprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F00133305BB00FCA411 /* snprintf.c */; }; + 274FF6B31333B1C400317ECB /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; + 274FF6B41333B1C400317ECB /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; + 274FF6B51333B1C400317ECB /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; + 274FF6B61333B1C400317ECB /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; + 274FF6B71333B1C400317ECB /* usersys.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F08133305BB00FCA411 /* usersys.c */; }; + 274FF6B81333B1C400317ECB /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F09133305BB00FCA411 /* util.c */; }; + 274FF6BA1333B1C400317ECB /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F49133306BB00FCA411 /* CoreFoundation.framework */; }; + 274FF6BB1333B1C400317ECB /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F55133308EA00FCA411 /* Kerberos.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 274FF6BC1333B1C400317ECB /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4B133306BB00FCA411 /* Security.framework */; }; + 274FF6BD1333B1C400317ECB /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4C133306BB00FCA411 /* SystemConfiguration.framework */; }; + 274FF6BE1333B1C400317ECB /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F51133308C100FCA411 /* libiconv.dylib */; }; + 274FF6BF1333B1C400317ECB /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F53133308CB00FCA411 /* libresolv.dylib */; }; + 274FF6C01333B1C400317ECB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4A133306BB00FCA411 /* libz.dylib */; }; + 274FF6C21333B1C400317ECB /* adminutil.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB71333056300FCA411 /* adminutil.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C31333B1C400317ECB /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB91333056300FCA411 /* array.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C41333B1C400317ECB /* backend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EBE1333056300FCA411 /* backend.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C51333B1C400317ECB /* cups.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC11333056300FCA411 /* cups.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C61333B1C400317ECB /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C71333B1C400317ECB /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED9133305BB00FCA411 /* file.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C81333B1C400317ECB /* http.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE3133305BB00FCA411 /* http.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6C91333B1C400317ECB /* ipp.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE7133305BB00FCA411 /* ipp.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6CA1333B1C400317ECB /* language.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEB133305BB00FCA411 /* language.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6CB1333B1C400317ECB /* ppd.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF7133305BB00FCA411 /* ppd.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6CD1333B1C400317ECB /* sidechannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFD133305BB00FCA411 /* sidechannel.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6CE1333B1C400317ECB /* transcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F07133305BB00FCA411 /* transcode.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6CF1333B1C400317ECB /* versioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F0A133305BB00FCA411 /* versioning.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D01333B1C400317ECB /* cups-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC01333056300FCA411 /* cups-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D11333B1C400317ECB /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC31333056300FCA411 /* debug-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D21333B1C400317ECB /* file-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED7133305BB00FCA411 /* file-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D31333B1C400317ECB /* http-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE0133305BB00FCA411 /* http-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D41333B1C400317ECB /* ipp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE4133305BB00FCA411 /* ipp-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D51333B1C400317ECB /* language-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE9133305BB00FCA411 /* language-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D61333B1C400317ECB /* md5-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEE133305BB00FCA411 /* md5-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D71333B1C400317ECB /* ppd-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF5133305BB00FCA411 /* ppd-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D81333B1C400317ECB /* pwg-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF9133305BB00FCA411 /* pwg-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6D91333B1C400317ECB /* snmp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFE133305BB00FCA411 /* snmp-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6DA1333B1C400317ECB /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6DB1333B1C400317ECB /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (); }; }; + 274FF6DC1333B1C400317ECB /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F471333063D00FCA411 /* config.h */; settings = {ATTRIBUTES = (); }; }; + 276683671337A9E0000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683691337AA00000D33D0 /* cupsctl.c in Sources */ = {isa = PBXBuildFile; fileRef = 276683681337AA00000D33D0 /* cupsctl.c */; }; + 276683B11337AD06000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683B21337AD06000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 276683B71337AD23000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683B81337AD23000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 276683B91337AD31000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683BA1337AD31000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 276683C31337B1B3000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683C41337B1B3000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 276683C91337B1C1000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683CA1337B1C1000D33D0 /* libcupsppdc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; }; + 276683CD1337B201000D33D0 /* ppdc.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683CC1337B201000D33D0 /* ppdc.cxx */; }; + 276683CF1337B20D000D33D0 /* ppdhtml.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683CE1337B20D000D33D0 /* ppdhtml.cxx */; }; + 276683D11337B21A000D33D0 /* ppdi.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D01337B21A000D33D0 /* ppdi.cxx */; }; + 276683D31337B228000D33D0 /* ppdmerge.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D21337B228000D33D0 /* ppdmerge.cxx */; }; + 276683D51337B237000D33D0 /* ppdpo.cxx in Sources */ = {isa = PBXBuildFile; fileRef = 276683D41337B237000D33D0 /* ppdpo.cxx */; }; + 276683E21337B29C000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276683E51337B2BE000D33D0 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; + 276683FA1337F7A9000D33D0 /* ipptool.c in Sources */ = {isa = PBXBuildFile; fileRef = 276683F91337F7A9000D33D0 /* ipptool.c */; }; + 276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */ = {isa = PBXBuildFile; fileRef = 276684101337FA7C000D33D0 /* cupsaddsmb.c */; }; + 278C58D9136B645C00836530 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; }; + 278C58DE136B645C00836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DA136B645C00836530 /* CoreFoundation.framework */; }; + 278C58DF136B645C00836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DB136B645C00836530 /* Kerberos.framework */; }; + 278C58E1136B645C00836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DD136B645C00836530 /* SystemConfiguration.framework */; }; + 278C58E3136B647200836530 /* testhttp.c in Sources */ = {isa = PBXBuildFile; fileRef = 278C58E2136B647200836530 /* testhttp.c */; }; + 278C58E4136B649200836530 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; }; + 278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; }; + 278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; }; + 278C58EB136B64B000836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; }; + 278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; }; + 278C58F6136B652300836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58F4136B652300836530 /* Security.framework */; }; + 720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 720DD6D31358FDDE0064AA82 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 720DD6D21358FDDE0064AA82 /* snmp.c */; }; + 720DD6D413590AB90064AA82 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; }; + 72220EB61333052D00FCA411 /* adminutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB51333052D00FCA411 /* adminutil.c */; }; + 72220EC41333056300FCA411 /* adminutil.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB71333056300FCA411 /* adminutil.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220EC51333056300FCA411 /* array.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EB81333056300FCA411 /* array.c */; }; + 72220EC61333056300FCA411 /* array.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EB91333056300FCA411 /* array.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220EC71333056300FCA411 /* attr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBA1333056300FCA411 /* attr.c */; }; + 72220EC81333056300FCA411 /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBB1333056300FCA411 /* auth.c */; }; + 72220EC91333056300FCA411 /* backchannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBC1333056300FCA411 /* backchannel.c */; }; + 72220ECA1333056300FCA411 /* backend.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBD1333056300FCA411 /* backend.c */; }; + 72220ECB1333056300FCA411 /* backend.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EBE1333056300FCA411 /* backend.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220ECC1333056300FCA411 /* conflicts.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EBF1333056300FCA411 /* conflicts.c */; }; + 72220ECD1333056300FCA411 /* cups-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC01333056300FCA411 /* cups-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220ECE1333056300FCA411 /* cups.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC11333056300FCA411 /* cups.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220ECF1333056300FCA411 /* custom.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EC21333056300FCA411 /* custom.c */; }; + 72220ED01333056300FCA411 /* debug-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EC31333056300FCA411 /* debug-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F0B133305BB00FCA411 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED1133305BB00FCA411 /* debug.c */; }; + 72220F0C133305BB00FCA411 /* dest.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED2133305BB00FCA411 /* dest.c */; }; + 72220F0D133305BB00FCA411 /* dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED3133305BB00FCA411 /* dir.c */; }; + 72220F0E133305BB00FCA411 /* dir.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED4133305BB00FCA411 /* dir.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F0F133305BB00FCA411 /* emit.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED5133305BB00FCA411 /* emit.c */; }; + 72220F10133305BB00FCA411 /* encode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED6133305BB00FCA411 /* encode.c */; }; + 72220F11133305BB00FCA411 /* file-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED7133305BB00FCA411 /* file-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F12133305BB00FCA411 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220ED8133305BB00FCA411 /* file.c */; }; + 72220F13133305BB00FCA411 /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220ED9133305BB00FCA411 /* file.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F14133305BB00FCA411 /* getdevices.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDA133305BB00FCA411 /* getdevices.c */; }; + 72220F15133305BB00FCA411 /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDB133305BB00FCA411 /* getifaddrs.c */; }; + 72220F16133305BB00FCA411 /* getputfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDC133305BB00FCA411 /* getputfile.c */; }; + 72220F17133305BB00FCA411 /* globals.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDD133305BB00FCA411 /* globals.c */; }; + 72220F18133305BB00FCA411 /* http-addr.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDE133305BB00FCA411 /* http-addr.c */; }; + 72220F19133305BB00FCA411 /* http-addrlist.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EDF133305BB00FCA411 /* http-addrlist.c */; }; + 72220F1A133305BB00FCA411 /* http-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE0133305BB00FCA411 /* http-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F1B133305BB00FCA411 /* http-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE1133305BB00FCA411 /* http-support.c */; }; + 72220F1C133305BB00FCA411 /* http.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE2133305BB00FCA411 /* http.c */; }; + 72220F1D133305BB00FCA411 /* http.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE3133305BB00FCA411 /* http.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F1E133305BB00FCA411 /* ipp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE4133305BB00FCA411 /* ipp-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F1F133305BB00FCA411 /* ipp-support.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE5133305BB00FCA411 /* ipp-support.c */; }; + 72220F20133305BB00FCA411 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE6133305BB00FCA411 /* ipp.c */; }; + 72220F21133305BB00FCA411 /* ipp.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE7133305BB00FCA411 /* ipp.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F22133305BB00FCA411 /* langprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EE8133305BB00FCA411 /* langprintf.c */; }; + 72220F23133305BB00FCA411 /* language-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EE9133305BB00FCA411 /* language-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F24133305BB00FCA411 /* language.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEA133305BB00FCA411 /* language.c */; }; + 72220F25133305BB00FCA411 /* language.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEB133305BB00FCA411 /* language.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F26133305BB00FCA411 /* localize.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEC133305BB00FCA411 /* localize.c */; }; + 72220F27133305BB00FCA411 /* mark.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EED133305BB00FCA411 /* mark.c */; }; + 72220F28133305BB00FCA411 /* md5-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EEE133305BB00FCA411 /* md5-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F29133305BB00FCA411 /* md5.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EEF133305BB00FCA411 /* md5.c */; }; + 72220F2A133305BB00FCA411 /* md5passwd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF0133305BB00FCA411 /* md5passwd.c */; }; + 72220F2B133305BB00FCA411 /* notify.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF1133305BB00FCA411 /* notify.c */; }; + 72220F2C133305BB00FCA411 /* options.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF2133305BB00FCA411 /* options.c */; }; + 72220F2D133305BB00FCA411 /* page.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF3133305BB00FCA411 /* page.c */; }; + 72220F2E133305BB00FCA411 /* ppd-cache.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF4133305BB00FCA411 /* ppd-cache.c */; }; + 72220F2F133305BB00FCA411 /* ppd-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF5133305BB00FCA411 /* ppd-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F30133305BB00FCA411 /* ppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF6133305BB00FCA411 /* ppd.c */; }; + 72220F31133305BB00FCA411 /* ppd.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF7133305BB00FCA411 /* ppd.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F32133305BB00FCA411 /* pwg-media.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EF8133305BB00FCA411 /* pwg-media.c */; }; + 72220F33133305BB00FCA411 /* pwg-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EF9133305BB00FCA411 /* pwg-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F35133305BB00FCA411 /* request.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFB133305BB00FCA411 /* request.c */; }; + 72220F36133305BB00FCA411 /* sidechannel.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFC133305BB00FCA411 /* sidechannel.c */; }; + 72220F37133305BB00FCA411 /* sidechannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFD133305BB00FCA411 /* sidechannel.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F38133305BB00FCA411 /* snmp-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFE133305BB00FCA411 /* snmp-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F39133305BB00FCA411 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220EFF133305BB00FCA411 /* snmp.c */; }; + 72220F3A133305BB00FCA411 /* snprintf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F00133305BB00FCA411 /* snprintf.c */; }; + 72220F3B133305BB00FCA411 /* string-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F01133305BB00FCA411 /* string-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F3C133305BB00FCA411 /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F02133305BB00FCA411 /* string.c */; }; + 72220F3D133305BB00FCA411 /* tempfile.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F03133305BB00FCA411 /* tempfile.c */; }; + 72220F3E133305BB00FCA411 /* thread-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F04133305BB00FCA411 /* thread-private.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F3F133305BB00FCA411 /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F05133305BB00FCA411 /* thread.c */; }; + 72220F40133305BB00FCA411 /* transcode.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F06133305BB00FCA411 /* transcode.c */; }; + 72220F41133305BB00FCA411 /* transcode.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F07133305BB00FCA411 /* transcode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F42133305BB00FCA411 /* usersys.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F08133305BB00FCA411 /* usersys.c */; }; + 72220F43133305BB00FCA411 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F09133305BB00FCA411 /* util.c */; }; + 72220F44133305BB00FCA411 /* versioning.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F0A133305BB00FCA411 /* versioning.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220F481333063D00FCA411 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220F471333063D00FCA411 /* config.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 72220F4D133306BB00FCA411 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F49133306BB00FCA411 /* CoreFoundation.framework */; }; + 72220F4E133306BB00FCA411 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4A133306BB00FCA411 /* libz.dylib */; }; + 72220F4F133306BB00FCA411 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4B133306BB00FCA411 /* Security.framework */; }; + 72220F50133306BB00FCA411 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4C133306BB00FCA411 /* SystemConfiguration.framework */; }; + 72220F52133308C100FCA411 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F51133308C100FCA411 /* libiconv.dylib */; }; + 72220F54133308CB00FCA411 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F53133308CB00FCA411 /* libresolv.dylib */; }; + 72220F56133308EA00FCA411 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F55133308EA00FCA411 /* Kerberos.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 72220F6613330A7000FCA411 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 72220F6813330A8500FCA411 /* ApplicationServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F6713330A8500FCA411 /* ApplicationServices.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 72220F9013330B0C00FCA411 /* auth.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6913330B0C00FCA411 /* auth.c */; }; + 72220F9113330B0C00FCA411 /* banners.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6B13330B0C00FCA411 /* banners.c */; }; + 72220F9213330B0C00FCA411 /* cert.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6D13330B0C00FCA411 /* cert.c */; }; + 72220F9313330B0C00FCA411 /* classes.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F6F13330B0C00FCA411 /* classes.c */; }; + 72220F9413330B0C00FCA411 /* client.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7113330B0C00FCA411 /* client.c */; }; + 72220F9513330B0C00FCA411 /* conf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7313330B0C00FCA411 /* conf.c */; }; + 72220F9613330B0C00FCA411 /* dirsvc.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7613330B0C00FCA411 /* dirsvc.c */; }; + 72220F9713330B0C00FCA411 /* env.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7813330B0C00FCA411 /* env.c */; }; + 72220F9813330B0C00FCA411 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7913330B0C00FCA411 /* ipp.c */; }; + 72220F9913330B0C00FCA411 /* job.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7A13330B0C00FCA411 /* job.c */; }; + 72220F9A13330B0C00FCA411 /* listen.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7C13330B0C00FCA411 /* listen.c */; }; + 72220F9B13330B0C00FCA411 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7D13330B0C00FCA411 /* log.c */; }; + 72220F9C13330B0C00FCA411 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7E13330B0C00FCA411 /* main.c */; }; + 72220F9D13330B0C00FCA411 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F7F13330B0C00FCA411 /* network.c */; }; + 72220F9E13330B0C00FCA411 /* policy.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8113330B0C00FCA411 /* policy.c */; }; + 72220F9F13330B0C00FCA411 /* printers.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8313330B0C00FCA411 /* printers.c */; }; + 72220FA013330B0C00FCA411 /* process.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8513330B0C00FCA411 /* process.c */; }; + 72220FA113330B0C00FCA411 /* quotas.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8613330B0C00FCA411 /* quotas.c */; }; + 72220FA313330B0C00FCA411 /* select.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8813330B0C00FCA411 /* select.c */; }; + 72220FA413330B0C00FCA411 /* server.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8913330B0C00FCA411 /* server.c */; }; + 72220FA513330B0C00FCA411 /* statbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8A13330B0C00FCA411 /* statbuf.c */; }; + 72220FA613330B0C00FCA411 /* subscriptions.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8C13330B0C00FCA411 /* subscriptions.c */; }; + 72220FA713330B0C00FCA411 /* sysman.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220F8E13330B0C00FCA411 /* sysman.c */; }; + 72220FB613330BCE00FCA411 /* filter.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB213330BCE00FCA411 /* filter.c */; }; + 72220FB713330BCE00FCA411 /* mime.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB313330BCE00FCA411 /* mime.c */; }; + 72220FB813330BCE00FCA411 /* mime.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220FB413330BCE00FCA411 /* mime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 72220FB913330BCE00FCA411 /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 72220FB513330BCE00FCA411 /* type.c */; }; + 72220FBA13330BEE00FCA411 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 72220FBF13330C1000FCA411 /* libcupsmime.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; }; + 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7234F41F1378A16F00D3E9C9 /* array-private.h */; }; + 724379081333E4A5009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 7243790D1333E4E3009631B9 /* ipp.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790A1333E4E3009631B9 /* ipp.c */; }; + 7243790E1333E4E3009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; + 7243790F1333E4E3009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; + 724379131333E516009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; + 724379221333E928009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; + 724379231333E928009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; + 724379241333E928009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; + 724379271333E93D009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 724379291333E952009631B9 /* lpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379281333E952009631B9 /* lpd.c */; }; + 7243793B1333FB9D009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 7243793D1333FD19009631B9 /* socket.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243793C1333FD19009631B9 /* socket.c */; }; + 724379401333FD4B009631B9 /* network.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790B1333E4E3009631B9 /* network.c */; }; + 724379411333FD4B009631B9 /* runloop.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379121333E516009631B9 /* runloop.c */; }; + 724379421333FD4B009631B9 /* snmp-supplies.c in Sources */ = {isa = PBXBuildFile; fileRef = 7243790C1333E4E3009631B9 /* snmp-supplies.c */; }; + 724379511333FEBB009631B9 /* dnssd.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379501333FEBB009631B9 /* dnssd.c */; }; + 724379561333FF04009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 724379661333FF3B009631B9 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 724379681333FF3B009631B9 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 724379671333FF3B009631B9 /* IOKit.framework */; }; + 724379C71333FFC7009631B9 /* usb.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379C51333FFC7009631B9 /* usb.c */; }; + 724379C91333FFF3009631B9 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 724379C81333FFF3009631B9 /* CoreFoundation.framework */; }; + 724379CB1334000E009631B9 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; }; + 7258EAED134594EB009286F1 /* rastertopwg.c in Sources */ = {isa = PBXBuildFile; fileRef = 7258EAEC134594EB009286F1 /* rastertopwg.c */; }; + 7258EAF413459B6D009286F1 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; }; + 7263EE2713330D2800BA4D44 /* libpam.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE2613330D2800BA4D44 /* libpam.dylib */; }; + 7263EE2C13330D5C00BA4D44 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE2913330D5C00BA4D44 /* Kerberos.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 7263EE2D13330D5C00BA4D44 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE2A13330D5C00BA4D44 /* Security.framework */; }; + 7263EE2E13330D5C00BA4D44 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE2B13330D5C00BA4D44 /* SystemConfiguration.framework */; }; + 7263EE3013330DC100BA4D44 /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE2F13330DC100BA4D44 /* IOKit.framework */; }; + 7263EE3213330E1E00BA4D44 /* libpthread.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE3113330E1E00BA4D44 /* libpthread.dylib */; }; + 7263EE3413330E3C00BA4D44 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE3313330E3C00BA4D44 /* libresolv.dylib */; }; + 7263EE3613330E4E00BA4D44 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE3513330E4E00BA4D44 /* CoreFoundation.framework */; }; + 7263EE3813330E7500BA4D44 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE3713330E7500BA4D44 /* libz.dylib */; }; + 7263EE3A13330EC500BA4D44 /* libldap.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 7263EE3913330EC500BA4D44 /* libldap.dylib */; }; + 726AD702135E8A90002C930D /* ippserver.c in Sources */ = {isa = PBXBuildFile; fileRef = 726AD701135E8A90002C930D /* ippserver.c */; }; + 726AD707135E8B11002C930D /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; }; + 726AD708135E8B11002C930D /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F49133306BB00FCA411 /* CoreFoundation.framework */; }; + 726AD709135E8B11002C930D /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F55133308EA00FCA411 /* Kerberos.framework */; }; + 726AD70A135E8B11002C930D /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F53133308CB00FCA411 /* libresolv.dylib */; }; + 726AD70B135E8B11002C930D /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4A133306BB00FCA411 /* libz.dylib */; }; + 726AD70C135E8B11002C930D /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4B133306BB00FCA411 /* Security.framework */; }; + 726AD70D135E8B11002C930D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F4C133306BB00FCA411 /* SystemConfiguration.framework */; }; + 726AD70E135E8B5E002C930D /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220F51133308C100FCA411 /* libiconv.dylib */; }; + 7271883D1374AB14001A2036 /* mime-private.h in Headers */ = {isa = PBXBuildFile; fileRef = 7271883C1374AB14001A2036 /* mime-private.h */; }; + 72C16CB9137B195D007E4BF4 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 72C16CB8137B195D007E4BF4 /* file.c */; }; + 72F75A5C1336F988004BB496 /* cupstestppd.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A5B1336F988004BB496 /* cupstestppd.c */; }; + 72F75A671336FA38004BB496 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; }; + 72F75A6C1336FA8A004BB496 /* error.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A691336FA8A004BB496 /* error.c */; }; + 72F75A6D1336FA8A004BB496 /* interpret.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6A1336FA8A004BB496 /* interpret.c */; }; + 72F75A6E1336FA8A004BB496 /* raster.c in Sources */ = {isa = PBXBuildFile; fileRef = 72F75A6B1336FA8A004BB496 /* raster.c */; }; + 72F75A6F1336FAB6004BB496 /* raster.h in Headers */ = {isa = PBXBuildFile; fileRef = 72220EFA133305BB00FCA411 /* raster.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 270CCDB1135E3CDE00007BE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 270CCDA6135E3C9E00007BE2; + remoteInfo = testmime; + }; + 270CCDB5135E3CF700007BE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220FAB13330B2200FCA411; + remoteInfo = libcupsmime; + }; + 270CCDB7135E3CFD00007BE2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6891333B1C400317ECB; + remoteInfo = libcups_static; + }; + 273BF6C81333B5410022CAAB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6891333B1C400317ECB; + remoteInfo = libcups_static; + }; + 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 273BF6BC1333B5000022CAAB; + remoteInfo = testcups; + }; + 274FF5DB13332CF900317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF5E213332D4300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF5E413332D4300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220FAB13330B2200FCA411; + remoteInfo = libcupsmime; + }; + 274FF5E613332D4300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220F5A13330A5A00FCA411; + remoteInfo = cupsd; + }; + 274FF5E813332D4300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5CB13332B1F00317ECB; + remoteInfo = "cups-driverd"; + }; + 274FF5F2133330FD00317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF61F1333316200317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 274FF621133331D300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 274FF6331333335200317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF6381333348400317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6281333333600317ECB; + remoteInfo = "cups-deviced"; + }; + 274FF647133335A300317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF63D1333358B00317ECB; + remoteInfo = "cups-exec"; + }; + 274FF659133339D900317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF65D13333A3400317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF64E133339C400317ECB; + remoteInfo = "cups-lpd"; + }; + 274FF66C13333AAD00317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF67113333AE400317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF66213333A9B00317ECB; + remoteInfo = "cups-polld"; + }; + 274FF68113333B3C00317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 274FF68313333B3C00317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220FAB13330B2200FCA411; + remoteInfo = libcupsmime; + }; + 274FF6E11333B33F00317ECB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF67713333B2F00317ECB; + remoteInfo = cupsfilter; + }; + 276683651337A9D6000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 2766836A1337AA25000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2766835B1337A9B6000D33D0; + remoteInfo = cupsctl; + }; + 276683AD1337ACF9000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683AF1337ACF9000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 276683B31337AD18000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683B51337AD18000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 276683BB1337AE49000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683BD1337AE49000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 276683BF1337B1AD000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683C11337B1AD000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 276683C51337B1BC000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683C71337B1BC000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF5ED133330C800317ECB; + remoteInfo = libcupsppdc; + }; + 276683D61337B24A000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2766836F1337AC79000D33D0; + remoteInfo = ppdc; + }; + 276683D81337B24A000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 2766837C1337AC8C000D33D0; + remoteInfo = ppdhtml; + }; + 276683DA1337B24A000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 276683891337AC97000D33D0; + remoteInfo = ppdi; + }; + 276683DC1337B24A000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 276683961337ACA2000D33D0; + remoteInfo = ppdmerge; + }; + 276683DE1337B24A000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 276683A31337ACAB000D33D0; + remoteInfo = ppdpo; + }; + 276683E01337B299000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683E31337B2BA000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72F75A601336F9A3004BB496; + remoteInfo = libcupsimage; + }; + 276683FB1337F7B3000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276683FE1337F7C5000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 276683EF1337F78E000D33D0; + remoteInfo = ipptool; + }; + 2766840D1337FA31000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 276684121337FA8D000D33D0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 276684031337FA1D000D33D0; + remoteInfo = cupsaddsmb; + }; + 278C58D5136B641D00836530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 278C58CA136B640300836530; + remoteInfo = testhttp; + }; + 278C58D7136B642F00836530 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6891333B1C400317ECB; + remoteInfo = libcups_static; + }; + 720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 720DD6D01358FDBE0064AA82 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 720DD6C11358FD5F0064AA82; + remoteInfo = snmp; + }; + 72220F6413330A6500FCA411 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 72220FBB13330C0500FCA411 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 72220FBD13330C0B00FCA411 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220FAB13330B2200FCA411; + remoteInfo = libcupsmime; + }; + 724379061333E49B009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 724379101333E4EA009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 724378FC1333E43E009631B9; + remoteInfo = ipp; + }; + 724379251333E932009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 7243792A1333E962009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 724379171333E532009631B9; + remoteInfo = lpd; + }; + 724379391333FB95009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 7243793E1333FD23009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7243792F1333FB85009631B9; + remoteInfo = socket; + }; + 724379521333FECE009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 724379461333FEA9009631B9; + remoteInfo = dnssd; + }; + 724379541333FEFE009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 724379641333FF2E009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 724379C21333FF7D009631B9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7243795A1333FF1D009631B9; + remoteInfo = usb; + }; + 7258EAEE13459ADA009286F1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 7258EAE1134594C4009286F1; + remoteInfo = rastertopwg; + }; + 7258EAF013459B67009286F1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 7258EAF213459B67009286F1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72F75A601336F9A3004BB496; + remoteInfo = libcupsimage; + }; + 726AD703135E8AA1002C930D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 726AD6F6135E88F0002C930D; + remoteInfo = ippserver; + }; + 726AD705135E8AC5002C930D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 274FF6891333B1C400317ECB; + remoteInfo = libcups_static; + }; + 72F75A651336FA30004BB496 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72220EAD1333047D00FCA411; + remoteInfo = libcups; + }; + 72F75A701336FACD004BB496 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72F75A601336F9A3004BB496; + remoteInfo = libcupsimage; + }; + 72F75A721336FACD004BB496 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 72BF96371333042100B1EAD7 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 72F75A511336F950004BB496; + remoteInfo = cupstestppd; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 270CCDA5135E3C9E00007BE2 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 273BF6BB1333B5000022CAAB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF5CA13332B1F00317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF6271333333600317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF63C1333358B00317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF64D133339C400317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF66113333A9B00317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 274FF67613333B2F00317ECB /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 2766835A1337A9B6000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 2766836E1337AC79000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 2766837B1337AC8C000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 276683881337AC97000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 276683951337ACA2000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 276683A21337ACAB000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 276683EE1337F78E000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 276684021337FA1D000D33D0 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 278C58C9136B640300836530 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 720DD6C01358FD5F0064AA82 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 72220F5913330A5A00FCA411 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 724378FB1333E43E009631B9 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 724379161333E532009631B9 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 7243792E1333FB85009631B9 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 724379451333FEA9009631B9 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 724379591333FF1D009631B9 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 7258EAE0134594C4009286F1 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 726AD6F5135E88F0002C930D /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 72F75A501336F950004BB496 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 270CCDA7135E3C9E00007BE2 /* testmime */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testmime; sourceTree = BUILT_PRODUCTS_DIR; }; + 270CCDBB135E3D3E00007BE2 /* testmime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testmime.c; path = ../scheduler/testmime.c; sourceTree = ""; }; + 2732E089137A3F5200FAFEF6 /* cancel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cancel.c; path = ../systemv/cancel.c; sourceTree = ""; }; + 2732E08A137A3F5200FAFEF6 /* cupsaccept.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cupsaccept.c; path = ../systemv/cupsaccept.c; sourceTree = ""; }; + 2732E08B137A3F5200FAFEF6 /* cupstestdsc.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = cupstestdsc.c; path = ../systemv/cupstestdsc.c; sourceTree = ""; }; + 2732E08C137A3F5200FAFEF6 /* lp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lp.c; path = ../systemv/lp.c; sourceTree = ""; }; + 2732E08D137A3F5200FAFEF6 /* lpadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpadmin.c; path = ../systemv/lpadmin.c; sourceTree = ""; }; + 2732E08E137A3F5200FAFEF6 /* lpinfo.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpinfo.c; path = ../systemv/lpinfo.c; sourceTree = ""; }; + 2732E08F137A3F5200FAFEF6 /* lpmove.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpmove.c; path = ../systemv/lpmove.c; sourceTree = ""; }; + 2732E090137A3F5200FAFEF6 /* lpoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpoptions.c; path = ../systemv/lpoptions.c; sourceTree = ""; }; + 2732E091137A3F5200FAFEF6 /* lppasswd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lppasswd.c; path = ../systemv/lppasswd.c; sourceTree = ""; }; + 2732E092137A3F5200FAFEF6 /* lpstat.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = lpstat.c; path = ../systemv/lpstat.c; sourceTree = ""; }; + 273BF6BD1333B5000022CAAB /* testcups */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testcups; sourceTree = BUILT_PRODUCTS_DIR; }; + 273BF6C61333B5370022CAAB /* testcups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testcups.c; path = ../cups/testcups.c; sourceTree = ""; }; + 273BF6CB1333B5950022CAAB /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 273BF6CC1333B5950022CAAB /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libiconv.dylib; sourceTree = DEVELOPER_DIR; }; + 273BF6CD1333B5950022CAAB /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; }; + 273BF6D11333B5C30022CAAB /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Kerberos.framework; sourceTree = DEVELOPER_DIR; }; + 273BF6D21333B5C30022CAAB /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 273BF6D51333B5F60022CAAB /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libresolv.dylib; sourceTree = DEVELOPER_DIR; }; + 273BF6D61333B5F60022CAAB /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 274FF5CC13332B1F00317ECB /* cups-driverd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-driverd"; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF5D613332CC700317ECB /* cups-driverd.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "cups-driverd.cxx"; path = "../scheduler/cups-driverd.cxx"; sourceTree = ""; }; + 274FF5D713332CC700317ECB /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../scheduler/util.c; sourceTree = ""; }; + 274FF5D813332CC700317ECB /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = util.h; path = ../scheduler/util.h; sourceTree = ""; }; + 274FF5EE133330C800317ECB /* libcupsppdc.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsppdc.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF5F51333315100317ECB /* ppdc-array.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-array.cxx"; path = "../ppdc/ppdc-array.cxx"; sourceTree = ""; }; + 274FF5F61333315100317ECB /* ppdc-attr.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-attr.cxx"; path = "../ppdc/ppdc-attr.cxx"; sourceTree = ""; }; + 274FF5F71333315100317ECB /* ppdc-catalog.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-catalog.cxx"; path = "../ppdc/ppdc-catalog.cxx"; sourceTree = ""; }; + 274FF5F81333315100317ECB /* ppdc-choice.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-choice.cxx"; path = "../ppdc/ppdc-choice.cxx"; sourceTree = ""; }; + 274FF5F91333315100317ECB /* ppdc-constraint.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-constraint.cxx"; path = "../ppdc/ppdc-constraint.cxx"; sourceTree = ""; }; + 274FF5FA1333315100317ECB /* ppdc-driver.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-driver.cxx"; path = "../ppdc/ppdc-driver.cxx"; sourceTree = ""; }; + 274FF5FB1333315100317ECB /* ppdc-file.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-file.cxx"; path = "../ppdc/ppdc-file.cxx"; sourceTree = ""; }; + 274FF5FC1333315100317ECB /* ppdc-filter.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-filter.cxx"; path = "../ppdc/ppdc-filter.cxx"; sourceTree = ""; }; + 274FF5FD1333315100317ECB /* ppdc-font.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-font.cxx"; path = "../ppdc/ppdc-font.cxx"; sourceTree = ""; }; + 274FF5FE1333315100317ECB /* ppdc-group.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-group.cxx"; path = "../ppdc/ppdc-group.cxx"; sourceTree = ""; }; + 274FF5FF1333315100317ECB /* ppdc-import.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-import.cxx"; path = "../ppdc/ppdc-import.cxx"; sourceTree = ""; }; + 274FF6001333315100317ECB /* ppdc-mediasize.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-mediasize.cxx"; path = "../ppdc/ppdc-mediasize.cxx"; sourceTree = ""; }; + 274FF6011333315100317ECB /* ppdc-message.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-message.cxx"; path = "../ppdc/ppdc-message.cxx"; sourceTree = ""; }; + 274FF6021333315100317ECB /* ppdc-option.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-option.cxx"; path = "../ppdc/ppdc-option.cxx"; sourceTree = ""; }; + 274FF6031333315100317ECB /* ppdc-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ppdc-private.h"; path = "../ppdc/ppdc-private.h"; sourceTree = ""; }; + 274FF6041333315100317ECB /* ppdc-profile.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-profile.cxx"; path = "../ppdc/ppdc-profile.cxx"; sourceTree = ""; }; + 274FF6051333315100317ECB /* ppdc-shared.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-shared.cxx"; path = "../ppdc/ppdc-shared.cxx"; sourceTree = ""; }; + 274FF6061333315100317ECB /* ppdc-source.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-source.cxx"; path = "../ppdc/ppdc-source.cxx"; sourceTree = ""; }; + 274FF6071333315100317ECB /* ppdc-string.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-string.cxx"; path = "../ppdc/ppdc-string.cxx"; sourceTree = ""; }; + 274FF6081333315100317ECB /* ppdc-variable.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "ppdc-variable.cxx"; path = "../ppdc/ppdc-variable.cxx"; sourceTree = ""; }; + 274FF6091333315100317ECB /* ppdc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ppdc.h; path = ../ppdc/ppdc.h; sourceTree = ""; }; + 274FF6291333333600317ECB /* cups-deviced */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-deviced"; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF6351333344400317ECB /* cups-deviced.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-deviced.c"; path = "../scheduler/cups-deviced.c"; sourceTree = ""; }; + 274FF63E1333358B00317ECB /* cups-exec */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-exec"; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF6491333398D00317ECB /* cups-exec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-exec.c"; path = "../scheduler/cups-exec.c"; sourceTree = ""; }; + 274FF64F133339C400317ECB /* cups-lpd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-lpd"; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF65B133339FC00317ECB /* cups-lpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-lpd.c"; path = "../scheduler/cups-lpd.c"; sourceTree = ""; }; + 274FF66313333A9B00317ECB /* cups-polld */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "cups-polld"; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF66F13333ACF00317ECB /* cups-polld.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "cups-polld.c"; path = "../scheduler/cups-polld.c"; sourceTree = ""; }; + 274FF67813333B2F00317ECB /* cupsfilter */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsfilter; sourceTree = BUILT_PRODUCTS_DIR; }; + 274FF68713333B6E00317ECB /* cupsfilter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsfilter.c; path = ../scheduler/cupsfilter.c; sourceTree = ""; }; + 276683561337A8C5000D33D0 /* cups.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = cups.strings; path = ../locale/cups.strings; sourceTree = ""; }; + 2766835C1337A9B6000D33D0 /* cupsctl */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsctl; sourceTree = BUILT_PRODUCTS_DIR; }; + 276683681337AA00000D33D0 /* cupsctl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsctl.c; path = ../systemv/cupsctl.c; sourceTree = ""; }; + 276683701337AC79000D33D0 /* ppdc */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdc; sourceTree = BUILT_PRODUCTS_DIR; }; + 2766837D1337AC8C000D33D0 /* ppdhtml */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdhtml; sourceTree = BUILT_PRODUCTS_DIR; }; + 2766838A1337AC97000D33D0 /* ppdi */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdi; sourceTree = BUILT_PRODUCTS_DIR; }; + 276683971337ACA2000D33D0 /* ppdmerge */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdmerge; sourceTree = BUILT_PRODUCTS_DIR; }; + 276683A41337ACAB000D33D0 /* ppdpo */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ppdpo; sourceTree = BUILT_PRODUCTS_DIR; }; + 276683CC1337B201000D33D0 /* ppdc.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdc.cxx; path = ../ppdc/ppdc.cxx; sourceTree = ""; }; + 276683CE1337B20D000D33D0 /* ppdhtml.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdhtml.cxx; path = ../ppdc/ppdhtml.cxx; sourceTree = ""; }; + 276683D01337B21A000D33D0 /* ppdi.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdi.cxx; path = ../ppdc/ppdi.cxx; sourceTree = ""; }; + 276683D21337B228000D33D0 /* ppdmerge.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdmerge.cxx; path = ../ppdc/ppdmerge.cxx; sourceTree = ""; }; + 276683D41337B237000D33D0 /* ppdpo.cxx */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ppdpo.cxx; path = ../ppdc/ppdpo.cxx; sourceTree = ""; }; + 276683F01337F78E000D33D0 /* ipptool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipptool; sourceTree = BUILT_PRODUCTS_DIR; }; + 276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../test/ipptool.c; sourceTree = ""; }; + 276684041337FA1D000D33D0 /* cupsaddsmb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaddsmb; sourceTree = BUILT_PRODUCTS_DIR; }; + 276684101337FA7C000D33D0 /* cupsaddsmb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsaddsmb.c; path = ../systemv/cupsaddsmb.c; sourceTree = ""; }; + 278C58CB136B640300836530 /* testhttp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhttp; sourceTree = BUILT_PRODUCTS_DIR; }; + 278C58DA136B645C00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 278C58DB136B645C00836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Kerberos.framework; sourceTree = DEVELOPER_DIR; }; + 278C58DD136B645C00836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 278C58E2136B647200836530 /* testhttp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhttp.c; path = ../cups/testhttp.c; sourceTree = ""; }; + 278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = /System/Library/Frameworks/CoreFoundation.framework; sourceTree = ""; }; + 278C58E6136B64B000836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = /System/Library/Frameworks/Kerberos.framework; sourceTree = ""; }; + 278C58E7136B64B000836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = /System/Library/Frameworks/Security.framework; sourceTree = ""; }; + 278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = /System/Library/Frameworks/SystemConfiguration.framework; sourceTree = ""; }; + 278C58F4136B652300836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 27D3037C134148CB00F022B1 /* libcups_s.exp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.exports; name = libcups_s.exp; path = ../cups/libcups_s.exp; sourceTree = ""; }; + 27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = ""; }; + 720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; }; + 720DD6D21358FDDE0064AA82 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../backend/snmp.c; sourceTree = ""; }; + 72220EAE1333047D00FCA411 /* libcups.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 72220EB51333052D00FCA411 /* adminutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = adminutil.c; path = ../cups/adminutil.c; sourceTree = ""; }; + 72220EB71333056300FCA411 /* adminutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = adminutil.h; path = ../cups/adminutil.h; sourceTree = ""; }; + 72220EB81333056300FCA411 /* array.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = array.c; path = ../cups/array.c; sourceTree = ""; }; + 72220EB91333056300FCA411 /* array.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = array.h; path = ../cups/array.h; sourceTree = ""; }; + 72220EBA1333056300FCA411 /* attr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = attr.c; path = ../cups/attr.c; sourceTree = ""; }; + 72220EBB1333056300FCA411 /* auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = auth.c; path = ../cups/auth.c; sourceTree = ""; }; + 72220EBC1333056300FCA411 /* backchannel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = backchannel.c; path = ../cups/backchannel.c; sourceTree = ""; }; + 72220EBD1333056300FCA411 /* backend.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = backend.c; path = ../cups/backend.c; sourceTree = ""; }; + 72220EBE1333056300FCA411 /* backend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = backend.h; path = ../cups/backend.h; sourceTree = ""; }; + 72220EBF1333056300FCA411 /* conflicts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = conflicts.c; path = ../cups/conflicts.c; sourceTree = ""; }; + 72220EC01333056300FCA411 /* cups-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "cups-private.h"; path = "../cups/cups-private.h"; sourceTree = ""; }; + 72220EC11333056300FCA411 /* cups.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cups.h; path = ../cups/cups.h; sourceTree = ""; }; + 72220EC21333056300FCA411 /* custom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = custom.c; path = ../cups/custom.c; sourceTree = ""; }; + 72220EC31333056300FCA411 /* debug-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "debug-private.h"; path = "../cups/debug-private.h"; sourceTree = ""; }; + 72220ED1133305BB00FCA411 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug.c; path = ../cups/debug.c; sourceTree = ""; }; + 72220ED2133305BB00FCA411 /* dest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dest.c; path = ../cups/dest.c; sourceTree = ""; }; + 72220ED3133305BB00FCA411 /* dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dir.c; path = ../cups/dir.c; sourceTree = ""; }; + 72220ED4133305BB00FCA411 /* dir.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dir.h; path = ../cups/dir.h; sourceTree = ""; }; + 72220ED5133305BB00FCA411 /* emit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = emit.c; path = ../cups/emit.c; sourceTree = ""; }; + 72220ED6133305BB00FCA411 /* encode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encode.c; path = ../cups/encode.c; sourceTree = ""; }; + 72220ED7133305BB00FCA411 /* file-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "file-private.h"; path = "../cups/file-private.h"; sourceTree = ""; }; + 72220ED8133305BB00FCA411 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../cups/file.c; sourceTree = ""; }; + 72220ED9133305BB00FCA411 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = file.h; path = ../cups/file.h; sourceTree = ""; }; + 72220EDA133305BB00FCA411 /* getdevices.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getdevices.c; path = ../cups/getdevices.c; sourceTree = ""; }; + 72220EDB133305BB00FCA411 /* getifaddrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getifaddrs.c; path = ../cups/getifaddrs.c; sourceTree = ""; }; + 72220EDC133305BB00FCA411 /* getputfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getputfile.c; path = ../cups/getputfile.c; sourceTree = ""; }; + 72220EDD133305BB00FCA411 /* globals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = globals.c; path = ../cups/globals.c; sourceTree = ""; }; + 72220EDE133305BB00FCA411 /* http-addr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-addr.c"; path = "../cups/http-addr.c"; sourceTree = ""; }; + 72220EDF133305BB00FCA411 /* http-addrlist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-addrlist.c"; path = "../cups/http-addrlist.c"; sourceTree = ""; }; + 72220EE0133305BB00FCA411 /* http-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "http-private.h"; path = "../cups/http-private.h"; sourceTree = ""; }; + 72220EE1133305BB00FCA411 /* http-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "http-support.c"; path = "../cups/http-support.c"; sourceTree = ""; }; + 72220EE2133305BB00FCA411 /* http.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = http.c; path = ../cups/http.c; sourceTree = ""; }; + 72220EE3133305BB00FCA411 /* http.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = http.h; path = ../cups/http.h; sourceTree = ""; }; + 72220EE4133305BB00FCA411 /* ipp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ipp-private.h"; path = "../cups/ipp-private.h"; sourceTree = ""; }; + 72220EE5133305BB00FCA411 /* ipp-support.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ipp-support.c"; path = "../cups/ipp-support.c"; sourceTree = ""; }; + 72220EE6133305BB00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../cups/ipp.c; sourceTree = ""; }; + 72220EE7133305BB00FCA411 /* ipp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ipp.h; path = ../cups/ipp.h; sourceTree = ""; }; + 72220EE8133305BB00FCA411 /* langprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = langprintf.c; path = ../cups/langprintf.c; sourceTree = ""; }; + 72220EE9133305BB00FCA411 /* language-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "language-private.h"; path = "../cups/language-private.h"; sourceTree = ""; }; + 72220EEA133305BB00FCA411 /* language.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = language.c; path = ../cups/language.c; sourceTree = ""; }; + 72220EEB133305BB00FCA411 /* language.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = language.h; path = ../cups/language.h; sourceTree = ""; }; + 72220EEC133305BB00FCA411 /* localize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = localize.c; path = ../cups/localize.c; sourceTree = ""; }; + 72220EED133305BB00FCA411 /* mark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mark.c; path = ../cups/mark.c; sourceTree = ""; }; + 72220EEE133305BB00FCA411 /* md5-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "md5-private.h"; path = "../cups/md5-private.h"; sourceTree = ""; }; + 72220EEF133305BB00FCA411 /* md5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5.c; path = ../cups/md5.c; sourceTree = ""; }; + 72220EF0133305BB00FCA411 /* md5passwd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = md5passwd.c; path = ../cups/md5passwd.c; sourceTree = ""; }; + 72220EF1133305BB00FCA411 /* notify.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = notify.c; path = ../cups/notify.c; sourceTree = ""; }; + 72220EF2133305BB00FCA411 /* options.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = options.c; path = ../cups/options.c; sourceTree = ""; }; + 72220EF3133305BB00FCA411 /* page.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = page.c; path = ../cups/page.c; sourceTree = ""; }; + 72220EF4133305BB00FCA411 /* ppd-cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "ppd-cache.c"; path = "../cups/ppd-cache.c"; sourceTree = ""; }; + 72220EF5133305BB00FCA411 /* ppd-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ppd-private.h"; path = "../cups/ppd-private.h"; sourceTree = ""; }; + 72220EF6133305BB00FCA411 /* ppd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ppd.c; path = ../cups/ppd.c; sourceTree = ""; }; + 72220EF7133305BB00FCA411 /* ppd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ppd.h; path = ../cups/ppd.h; sourceTree = ""; }; + 72220EF8133305BB00FCA411 /* pwg-media.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "pwg-media.c"; path = "../cups/pwg-media.c"; sourceTree = ""; }; + 72220EF9133305BB00FCA411 /* pwg-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "pwg-private.h"; path = "../cups/pwg-private.h"; sourceTree = ""; }; + 72220EFA133305BB00FCA411 /* raster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = raster.h; path = ../cups/raster.h; sourceTree = ""; }; + 72220EFB133305BB00FCA411 /* request.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = request.c; path = ../cups/request.c; sourceTree = ""; }; + 72220EFC133305BB00FCA411 /* sidechannel.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sidechannel.c; path = ../cups/sidechannel.c; sourceTree = ""; }; + 72220EFD133305BB00FCA411 /* sidechannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sidechannel.h; path = ../cups/sidechannel.h; sourceTree = ""; }; + 72220EFE133305BB00FCA411 /* snmp-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "snmp-private.h"; path = "../cups/snmp-private.h"; sourceTree = ""; }; + 72220EFF133305BB00FCA411 /* snmp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snmp.c; path = ../cups/snmp.c; sourceTree = ""; }; + 72220F00133305BB00FCA411 /* snprintf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = snprintf.c; path = ../cups/snprintf.c; sourceTree = ""; }; + 72220F01133305BB00FCA411 /* string-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "string-private.h"; path = "../cups/string-private.h"; sourceTree = ""; }; + 72220F02133305BB00FCA411 /* string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = string.c; path = ../cups/string.c; sourceTree = ""; }; + 72220F03133305BB00FCA411 /* tempfile.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tempfile.c; path = ../cups/tempfile.c; sourceTree = ""; }; + 72220F04133305BB00FCA411 /* thread-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "thread-private.h"; path = "../cups/thread-private.h"; sourceTree = ""; }; + 72220F05133305BB00FCA411 /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../cups/thread.c; sourceTree = ""; }; + 72220F06133305BB00FCA411 /* transcode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = transcode.c; path = ../cups/transcode.c; sourceTree = ""; }; + 72220F07133305BB00FCA411 /* transcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = transcode.h; path = ../cups/transcode.h; sourceTree = ""; }; + 72220F08133305BB00FCA411 /* usersys.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usersys.c; path = ../cups/usersys.c; sourceTree = ""; }; + 72220F09133305BB00FCA411 /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = util.c; path = ../cups/util.c; sourceTree = ""; }; + 72220F0A133305BB00FCA411 /* versioning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = versioning.h; path = ../cups/versioning.h; sourceTree = ""; }; + 72220F471333063D00FCA411 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = ""; }; + 72220F49133306BB00FCA411 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 72220F4A133306BB00FCA411 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; }; + 72220F4B133306BB00FCA411 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 72220F4C133306BB00FCA411 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 72220F51133308C100FCA411 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libiconv.dylib; sourceTree = DEVELOPER_DIR; }; + 72220F53133308CB00FCA411 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libresolv.dylib; sourceTree = DEVELOPER_DIR; }; + 72220F55133308EA00FCA411 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Kerberos.framework; sourceTree = DEVELOPER_DIR; }; + 72220F5B13330A5A00FCA411 /* cupsd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsd; sourceTree = BUILT_PRODUCTS_DIR; }; + 72220F6713330A8500FCA411 /* ApplicationServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ApplicationServices.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/ApplicationServices.framework; sourceTree = DEVELOPER_DIR; }; + 72220F6913330B0C00FCA411 /* auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = auth.c; path = ../scheduler/auth.c; sourceTree = SOURCE_ROOT; }; + 72220F6A13330B0C00FCA411 /* auth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = auth.h; path = ../scheduler/auth.h; sourceTree = SOURCE_ROOT; }; + 72220F6B13330B0C00FCA411 /* banners.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = banners.c; path = ../scheduler/banners.c; sourceTree = SOURCE_ROOT; }; + 72220F6C13330B0C00FCA411 /* banners.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = banners.h; path = ../scheduler/banners.h; sourceTree = SOURCE_ROOT; }; + 72220F6D13330B0C00FCA411 /* cert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cert.c; path = ../scheduler/cert.c; sourceTree = SOURCE_ROOT; }; + 72220F6E13330B0C00FCA411 /* cert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cert.h; path = ../scheduler/cert.h; sourceTree = SOURCE_ROOT; }; + 72220F6F13330B0C00FCA411 /* classes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = classes.c; path = ../scheduler/classes.c; sourceTree = SOURCE_ROOT; }; + 72220F7013330B0C00FCA411 /* classes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = classes.h; path = ../scheduler/classes.h; sourceTree = SOURCE_ROOT; }; + 72220F7113330B0C00FCA411 /* client.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = client.c; path = ../scheduler/client.c; sourceTree = SOURCE_ROOT; }; + 72220F7213330B0C00FCA411 /* client.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = client.h; path = ../scheduler/client.h; sourceTree = SOURCE_ROOT; }; + 72220F7313330B0C00FCA411 /* conf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = conf.c; path = ../scheduler/conf.c; sourceTree = SOURCE_ROOT; }; + 72220F7413330B0C00FCA411 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = conf.h; path = ../scheduler/conf.h; sourceTree = SOURCE_ROOT; }; + 72220F7513330B0C00FCA411 /* cupsd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cupsd.h; path = ../scheduler/cupsd.h; sourceTree = SOURCE_ROOT; }; + 72220F7613330B0C00FCA411 /* dirsvc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dirsvc.c; path = ../scheduler/dirsvc.c; sourceTree = SOURCE_ROOT; }; + 72220F7713330B0C00FCA411 /* dirsvc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = dirsvc.h; path = ../scheduler/dirsvc.h; sourceTree = SOURCE_ROOT; }; + 72220F7813330B0C00FCA411 /* env.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = env.c; path = ../scheduler/env.c; sourceTree = SOURCE_ROOT; }; + 72220F7913330B0C00FCA411 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../scheduler/ipp.c; sourceTree = SOURCE_ROOT; }; + 72220F7A13330B0C00FCA411 /* job.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = job.c; path = ../scheduler/job.c; sourceTree = SOURCE_ROOT; }; + 72220F7B13330B0C00FCA411 /* job.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = job.h; path = ../scheduler/job.h; sourceTree = SOURCE_ROOT; }; + 72220F7C13330B0C00FCA411 /* listen.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = listen.c; path = ../scheduler/listen.c; sourceTree = SOURCE_ROOT; }; + 72220F7D13330B0C00FCA411 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = log.c; path = ../scheduler/log.c; sourceTree = SOURCE_ROOT; }; + 72220F7E13330B0C00FCA411 /* main.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = main.c; path = ../scheduler/main.c; sourceTree = SOURCE_ROOT; }; + 72220F7F13330B0C00FCA411 /* network.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = network.c; path = ../scheduler/network.c; sourceTree = SOURCE_ROOT; }; + 72220F8013330B0C00FCA411 /* network.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = network.h; path = ../scheduler/network.h; sourceTree = SOURCE_ROOT; }; + 72220F8113330B0C00FCA411 /* policy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = policy.c; path = ../scheduler/policy.c; sourceTree = SOURCE_ROOT; }; + 72220F8213330B0C00FCA411 /* policy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = policy.h; path = ../scheduler/policy.h; sourceTree = SOURCE_ROOT; }; + 72220F8313330B0C00FCA411 /* printers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = printers.c; path = ../scheduler/printers.c; sourceTree = SOURCE_ROOT; }; + 72220F8413330B0C00FCA411 /* printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = printers.h; path = ../scheduler/printers.h; sourceTree = SOURCE_ROOT; }; + 72220F8513330B0C00FCA411 /* process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = process.c; path = ../scheduler/process.c; sourceTree = SOURCE_ROOT; }; + 72220F8613330B0C00FCA411 /* quotas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = quotas.c; path = ../scheduler/quotas.c; sourceTree = SOURCE_ROOT; }; + 72220F8813330B0C00FCA411 /* select.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = select.c; path = ../scheduler/select.c; sourceTree = SOURCE_ROOT; }; + 72220F8913330B0C00FCA411 /* server.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = server.c; path = ../scheduler/server.c; sourceTree = SOURCE_ROOT; }; + 72220F8A13330B0C00FCA411 /* statbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = statbuf.c; path = ../scheduler/statbuf.c; sourceTree = SOURCE_ROOT; }; + 72220F8B13330B0C00FCA411 /* statbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = statbuf.h; path = ../scheduler/statbuf.h; sourceTree = SOURCE_ROOT; }; + 72220F8C13330B0C00FCA411 /* subscriptions.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = subscriptions.c; path = ../scheduler/subscriptions.c; sourceTree = SOURCE_ROOT; }; + 72220F8D13330B0C00FCA411 /* subscriptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = subscriptions.h; path = ../scheduler/subscriptions.h; sourceTree = SOURCE_ROOT; }; + 72220F8E13330B0C00FCA411 /* sysman.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sysman.c; path = ../scheduler/sysman.c; sourceTree = SOURCE_ROOT; }; + 72220F8F13330B0C00FCA411 /* sysman.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sysman.h; path = ../scheduler/sysman.h; sourceTree = SOURCE_ROOT; }; + 72220FAC13330B2200FCA411 /* libcupsmime.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsmime.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 72220FB213330BCE00FCA411 /* filter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = filter.c; path = ../scheduler/filter.c; sourceTree = ""; }; + 72220FB313330BCE00FCA411 /* mime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mime.c; path = ../scheduler/mime.c; sourceTree = ""; }; + 72220FB413330BCE00FCA411 /* mime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mime.h; path = ../scheduler/mime.h; sourceTree = ""; }; + 72220FB513330BCE00FCA411 /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../scheduler/type.c; sourceTree = ""; }; + 7234F41F1378A16F00D3E9C9 /* array-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "array-private.h"; path = "../cups/array-private.h"; sourceTree = ""; }; + 724378FD1333E43E009631B9 /* ipp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ipp; sourceTree = BUILT_PRODUCTS_DIR; }; + 724379091333E4E3009631B9 /* backend-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "backend-private.h"; path = "../backend/backend-private.h"; sourceTree = ""; }; + 7243790A1333E4E3009631B9 /* ipp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipp.c; path = ../backend/ipp.c; sourceTree = ""; }; + 7243790B1333E4E3009631B9 /* network.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = network.c; path = ../backend/network.c; sourceTree = ""; }; + 7243790C1333E4E3009631B9 /* snmp-supplies.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "snmp-supplies.c"; path = "../backend/snmp-supplies.c"; sourceTree = ""; }; + 724379121333E516009631B9 /* runloop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = runloop.c; path = ../backend/runloop.c; sourceTree = ""; }; + 724379181333E532009631B9 /* lpd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = lpd; sourceTree = BUILT_PRODUCTS_DIR; }; + 724379281333E952009631B9 /* lpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = lpd.c; path = ../backend/lpd.c; sourceTree = ""; }; + 724379301333FB85009631B9 /* socket */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = socket; sourceTree = BUILT_PRODUCTS_DIR; }; + 7243793C1333FD19009631B9 /* socket.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = socket.c; path = ../backend/socket.c; sourceTree = ""; }; + 724379471333FEA9009631B9 /* dnssd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = dnssd; sourceTree = BUILT_PRODUCTS_DIR; }; + 724379501333FEBB009631B9 /* dnssd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = dnssd.c; path = ../backend/dnssd.c; sourceTree = ""; }; + 7243795B1333FF1D009631B9 /* usb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = usb; sourceTree = BUILT_PRODUCTS_DIR; }; + 724379671333FF3B009631B9 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = SDKs/MacOSX10.7.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; + 724379C41333FFC7009631B9 /* usb-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "usb-darwin.c"; path = "../backend/usb-darwin.c"; sourceTree = ""; }; + 724379C51333FFC7009631B9 /* usb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = usb.c; path = ../backend/usb.c; sourceTree = ""; }; + 724379C81333FFF3009631B9 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.7.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 724379CA1334000E009631B9 /* ieee1284.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ieee1284.c; path = ../backend/ieee1284.c; sourceTree = ""; }; + 7258EAE2134594C4009286F1 /* rastertopwg */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = rastertopwg; sourceTree = BUILT_PRODUCTS_DIR; }; + 7258EAEC134594EB009286F1 /* rastertopwg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rastertopwg.c; path = ../filter/rastertopwg.c; sourceTree = ""; }; + 7263EE2613330D2800BA4D44 /* libpam.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpam.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libpam.dylib; sourceTree = DEVELOPER_DIR; }; + 7263EE2913330D5C00BA4D44 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Kerberos.framework; sourceTree = DEVELOPER_DIR; }; + 7263EE2A13330D5C00BA4D44 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; + 7263EE2B13330D5C00BA4D44 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + 7263EE2F13330DC100BA4D44 /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/IOKit.framework; sourceTree = DEVELOPER_DIR; }; + 7263EE3113330E1E00BA4D44 /* libpthread.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpthread.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libpthread.dylib; sourceTree = DEVELOPER_DIR; }; + 7263EE3313330E3C00BA4D44 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libresolv.dylib; sourceTree = DEVELOPER_DIR; }; + 7263EE3513330E4E00BA4D44 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; + 7263EE3713330E7500BA4D44 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; }; + 7263EE3913330EC500BA4D44 /* libldap.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libldap.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libldap.dylib; sourceTree = DEVELOPER_DIR; }; + 726AD6F7135E88F0002C930D /* ippserver */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ippserver; sourceTree = BUILT_PRODUCTS_DIR; }; + 726AD701135E8A90002C930D /* ippserver.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ippserver.c; path = ../test/ippserver.c; sourceTree = ""; }; + 7271881613746EA8001A2036 /* bannertops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bannertops.c; path = ../filter/bannertops.c; sourceTree = ""; }; + 7271881713746EA8001A2036 /* commandtops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = commandtops.c; path = ../filter/commandtops.c; sourceTree = ""; }; + 7271881813746EA8001A2036 /* common.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = common.c; path = ../filter/common.c; sourceTree = ""; }; + 7271881913746EA8001A2036 /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = common.h; path = ../filter/common.h; sourceTree = ""; }; + 7271881A13746EA8001A2036 /* gziptoany.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = gziptoany.c; path = ../filter/gziptoany.c; sourceTree = ""; }; + 7271881B13746EA8001A2036 /* imagetops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = imagetops.c; path = ../filter/imagetops.c; sourceTree = ""; }; + 7271881C13746EA8001A2036 /* imagetoraster.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = imagetoraster.c; path = ../filter/imagetoraster.c; sourceTree = ""; }; + 7271881D13746EA8001A2036 /* pdftops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pdftops.c; path = ../filter/pdftops.c; sourceTree = ""; }; + 7271881E13746EA8001A2036 /* pstext.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pstext.c; path = ../filter/pstext.c; sourceTree = ""; }; + 7271881F13746EA8001A2036 /* pstext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = pstext.h; path = ../filter/pstext.h; sourceTree = ""; }; + 7271882013746EA8001A2036 /* pstops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = pstops.c; path = ../filter/pstops.c; sourceTree = ""; }; + 7271882113746EA8001A2036 /* rastertoepson.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertoepson.c; path = ../filter/rastertoepson.c; sourceTree = ""; }; + 7271882213746EA8001A2036 /* rastertohp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertohp.c; path = ../filter/rastertohp.c; sourceTree = ""; }; + 7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = ""; }; + 7271882413746EA8001A2036 /* textcommon.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = textcommon.c; path = ../filter/textcommon.c; sourceTree = ""; }; + 7271882513746EA8001A2036 /* textcommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = textcommon.h; path = ../filter/textcommon.h; sourceTree = ""; }; + 7271882613746EA8001A2036 /* texttops.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = texttops.c; path = ../filter/texttops.c; sourceTree = ""; }; + 7271882B137498E4001A2036 /* image-bmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-bmp.c"; path = "../filter/image-bmp.c"; sourceTree = ""; }; + 7271882C137498E4001A2036 /* image-colorspace.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-colorspace.c"; path = "../filter/image-colorspace.c"; sourceTree = ""; }; + 7271882D137498E4001A2036 /* image-gif.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-gif.c"; path = "../filter/image-gif.c"; sourceTree = ""; }; + 7271882E137498E4001A2036 /* image-jpeg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-jpeg.c"; path = "../filter/image-jpeg.c"; sourceTree = ""; }; + 7271882F137498E4001A2036 /* image-photocd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-photocd.c"; path = "../filter/image-photocd.c"; sourceTree = ""; }; + 72718830137498E4001A2036 /* image-pix.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-pix.c"; path = "../filter/image-pix.c"; sourceTree = ""; }; + 72718831137498E4001A2036 /* image-png.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-png.c"; path = "../filter/image-png.c"; sourceTree = ""; }; + 72718832137498E4001A2036 /* image-pnm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-pnm.c"; path = "../filter/image-pnm.c"; sourceTree = ""; }; + 72718833137498E4001A2036 /* image-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "image-private.h"; path = "../filter/image-private.h"; sourceTree = ""; }; + 72718834137498E4001A2036 /* image-sgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sgi.c"; path = "../filter/image-sgi.c"; sourceTree = ""; }; + 72718835137498E4001A2036 /* image-sgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "image-sgi.h"; path = "../filter/image-sgi.h"; sourceTree = ""; }; + 72718836137498E4001A2036 /* image-sgilib.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sgilib.c"; path = "../filter/image-sgilib.c"; sourceTree = ""; }; + 72718837137498E4001A2036 /* image-sun.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-sun.c"; path = "../filter/image-sun.c"; sourceTree = ""; }; + 72718838137498E4001A2036 /* image-tiff.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-tiff.c"; path = "../filter/image-tiff.c"; sourceTree = ""; }; + 72718839137498E4001A2036 /* image-zoom.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "image-zoom.c"; path = "../filter/image-zoom.c"; sourceTree = ""; }; + 7271883A137498E4001A2036 /* image.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = image.c; path = ../filter/image.c; sourceTree = ""; }; + 7271883B137498E4001A2036 /* image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = image.h; path = ../filter/image.h; sourceTree = ""; }; + 7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = ""; }; + 72C16CB8137B195D007E4BF4 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = file.c; path = ../scheduler/file.c; sourceTree = SOURCE_ROOT; }; + 72F75A4C1336F31B004BB496 /* libcups_static.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcups_static.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 72F75A521336F950004BB496 /* cupstestppd */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupstestppd; sourceTree = BUILT_PRODUCTS_DIR; }; + 72F75A5B1336F988004BB496 /* cupstestppd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupstestppd.c; path = ../systemv/cupstestppd.c; sourceTree = ""; }; + 72F75A611336F9A3004BB496 /* libcupsimage.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libcupsimage.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 72F75A691336FA8A004BB496 /* error.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = error.c; path = ../filter/error.c; sourceTree = ""; }; + 72F75A6A1336FA8A004BB496 /* interpret.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = interpret.c; path = ../filter/interpret.c; sourceTree = ""; }; + 72F75A6B1336FA8A004BB496 /* raster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = raster.c; path = ../filter/raster.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 270CCDA4135E3C9E00007BE2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */, + 278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */, + 278C58EB136B64B000836530 /* Security.framework in Frameworks */, + 278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */, + 270CCDB9135E3D0900007BE2 /* libcups_static.a in Frameworks */, + 270CCDBA135E3D0900007BE2 /* libcupsmime.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 273BF6BA1333B5000022CAAB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 278C58E4136B649200836530 /* libcups_static.a in Frameworks */, + 273BF6CE1333B5950022CAAB /* CoreFoundation.framework in Frameworks */, + 273BF6D31333B5C30022CAAB /* Kerberos.framework in Frameworks */, + 273BF6D41333B5C30022CAAB /* Security.framework in Frameworks */, + 273BF6D81333B5F60022CAAB /* SystemConfiguration.framework in Frameworks */, + 273BF6CF1333B5950022CAAB /* libiconv.dylib in Frameworks */, + 273BF6D71333B5F60022CAAB /* libresolv.dylib in Frameworks */, + 273BF6D01333B5950022CAAB /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF5C913332B1F00317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF5DD13332D0600317ECB /* libcups.dylib in Frameworks */, + 274FF6241333323B00317ECB /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF5EB133330C800317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF6231333321400317ECB /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF6261333333600317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF6321333334A00317ECB /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF63B1333358B00317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF64C133339C400317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF658133339D300317ECB /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF66013333A9B00317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF66E13333AB500317ECB /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF67513333B2F00317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF68513333B4300317ECB /* libcups.dylib in Frameworks */, + 274FF68613333B4300317ECB /* libcupsmime.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF6B91333B1C400317ECB /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF6BA1333B1C400317ECB /* CoreFoundation.framework in Frameworks */, + 274FF6BB1333B1C400317ECB /* Kerberos.framework in Frameworks */, + 274FF6BC1333B1C400317ECB /* Security.framework in Frameworks */, + 274FF6BD1333B1C400317ECB /* SystemConfiguration.framework in Frameworks */, + 274FF6BE1333B1C400317ECB /* libiconv.dylib in Frameworks */, + 274FF6BF1333B1C400317ECB /* libresolv.dylib in Frameworks */, + 274FF6C01333B1C400317ECB /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683591337A9B6000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683671337A9E0000D33D0 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2766836D1337AC79000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683B11337AD06000D33D0 /* libcups.dylib in Frameworks */, + 276683B21337AD06000D33D0 /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2766837A1337AC8C000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683B71337AD23000D33D0 /* libcups.dylib in Frameworks */, + 276683B81337AD23000D33D0 /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683871337AC97000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683B91337AD31000D33D0 /* libcups.dylib in Frameworks */, + 276683BA1337AD31000D33D0 /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683941337ACA2000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683C31337B1B3000D33D0 /* libcups.dylib in Frameworks */, + 276683C41337B1B3000D33D0 /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683A11337ACAB000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683C91337B1C1000D33D0 /* libcups.dylib in Frameworks */, + 276683CA1337B1C1000D33D0 /* libcupsppdc.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683ED1337F78E000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276684011337FA1D000D33D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 278C58C8136B640300836530 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 278C58DE136B645C00836530 /* CoreFoundation.framework in Frameworks */, + 278C58DF136B645C00836530 /* Kerberos.framework in Frameworks */, + 278C58F6136B652300836530 /* Security.framework in Frameworks */, + 278C58E1136B645C00836530 /* SystemConfiguration.framework in Frameworks */, + 278C58D9136B645C00836530 /* libcups_static.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 720DD6BF1358FD5F0064AA82 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220EAB1333047D00FCA411 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220F4D133306BB00FCA411 /* CoreFoundation.framework in Frameworks */, + 72220F56133308EA00FCA411 /* Kerberos.framework in Frameworks */, + 72220F4F133306BB00FCA411 /* Security.framework in Frameworks */, + 72220F50133306BB00FCA411 /* SystemConfiguration.framework in Frameworks */, + 72220F52133308C100FCA411 /* libiconv.dylib in Frameworks */, + 72220F54133308CB00FCA411 /* libresolv.dylib in Frameworks */, + 72220F4E133306BB00FCA411 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220F5813330A5A00FCA411 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220F6813330A8500FCA411 /* ApplicationServices.framework in Frameworks */, + 7263EE3613330E4E00BA4D44 /* CoreFoundation.framework in Frameworks */, + 7263EE3013330DC100BA4D44 /* IOKit.framework in Frameworks */, + 7263EE2C13330D5C00BA4D44 /* Kerberos.framework in Frameworks */, + 7263EE2D13330D5C00BA4D44 /* Security.framework in Frameworks */, + 7263EE2E13330D5C00BA4D44 /* SystemConfiguration.framework in Frameworks */, + 72220F6613330A7000FCA411 /* libcups.dylib in Frameworks */, + 72220FBF13330C1000FCA411 /* libcupsmime.dylib in Frameworks */, + 7263EE3A13330EC500BA4D44 /* libldap.dylib in Frameworks */, + 7263EE2713330D2800BA4D44 /* libpam.dylib in Frameworks */, + 7263EE3213330E1E00BA4D44 /* libpthread.dylib in Frameworks */, + 7263EE3413330E3C00BA4D44 /* libresolv.dylib in Frameworks */, + 7263EE3813330E7500BA4D44 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220FA913330B2200FCA411 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220FBA13330BEE00FCA411 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724378FA1333E43E009631B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379081333E4A5009631B9 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379151333E532009631B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379271333E93D009631B9 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7243792D1333FB85009631B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7243793B1333FB9D009631B9 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379441333FEA9009631B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379561333FF04009631B9 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379581333FF1D009631B9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379C91333FFF3009631B9 /* CoreFoundation.framework in Frameworks */, + 724379681333FF3B009631B9 /* IOKit.framework in Frameworks */, + 724379661333FF3B009631B9 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7258EADF134594C4009286F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 7258EAF413459B6D009286F1 /* libcups.dylib in Frameworks */, + 7258EAF513459B6D009286F1 /* libcupsimage.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 726AD6F4135E88F0002C930D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 726AD70E135E8B5E002C930D /* libiconv.dylib in Frameworks */, + 726AD707135E8B11002C930D /* libcups_static.a in Frameworks */, + 726AD708135E8B11002C930D /* CoreFoundation.framework in Frameworks */, + 726AD709135E8B11002C930D /* Kerberos.framework in Frameworks */, + 726AD70A135E8B11002C930D /* libresolv.dylib in Frameworks */, + 726AD70B135E8B11002C930D /* libz.dylib in Frameworks */, + 726AD70C135E8B11002C930D /* Security.framework in Frameworks */, + 726AD70D135E8B11002C930D /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72F75A4F1336F950004BB496 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683E51337B2BE000D33D0 /* libcupsimage.dylib in Frameworks */, + 276683E21337B29C000D33D0 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72F75A5E1336F9A3004BB496 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 72F75A671336FA38004BB496 /* libcups.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 273BF6B81333B4A90022CAAB /* tests */ = { + isa = PBXGroup; + children = ( + 273BF6C61333B5370022CAAB /* testcups.c */, + 278C58E2136B647200836530 /* testhttp.c */, + 270CCDBB135E3D3E00007BE2 /* testmime.c */, + ); + name = tests; + sourceTree = ""; + }; + 274FF5D513332C2C00317ECB /* daemon */ = { + isa = PBXGroup; + children = ( + 274FF66F13333ACF00317ECB /* cups-polld.c */, + 274FF6351333344400317ECB /* cups-deviced.c */, + 274FF5D613332CC700317ECB /* cups-driverd.cxx */, + 274FF6491333398D00317ECB /* cups-exec.c */, + 274FF65B133339FC00317ECB /* cups-lpd.c */, + 274FF5D713332CC700317ECB /* util.c */, + 274FF5D813332CC700317ECB /* util.h */, + ); + name = daemon; + sourceTree = ""; + }; + 274FF5F41333310400317ECB /* libcupsppdc */ = { + isa = PBXGroup; + children = ( + 274FF5F51333315100317ECB /* ppdc-array.cxx */, + 274FF5F61333315100317ECB /* ppdc-attr.cxx */, + 274FF5F71333315100317ECB /* ppdc-catalog.cxx */, + 274FF5F81333315100317ECB /* ppdc-choice.cxx */, + 274FF5F91333315100317ECB /* ppdc-constraint.cxx */, + 274FF5FA1333315100317ECB /* ppdc-driver.cxx */, + 274FF5FB1333315100317ECB /* ppdc-file.cxx */, + 274FF5FC1333315100317ECB /* ppdc-filter.cxx */, + 274FF5FD1333315100317ECB /* ppdc-font.cxx */, + 274FF5FE1333315100317ECB /* ppdc-group.cxx */, + 274FF5FF1333315100317ECB /* ppdc-import.cxx */, + 274FF6001333315100317ECB /* ppdc-mediasize.cxx */, + 274FF6011333315100317ECB /* ppdc-message.cxx */, + 274FF6021333315100317ECB /* ppdc-option.cxx */, + 274FF6031333315100317ECB /* ppdc-private.h */, + 274FF6041333315100317ECB /* ppdc-profile.cxx */, + 274FF6051333315100317ECB /* ppdc-shared.cxx */, + 274FF6061333315100317ECB /* ppdc-source.cxx */, + 274FF6071333315100317ECB /* ppdc-string.cxx */, + 274FF6081333315100317ECB /* ppdc-variable.cxx */, + ); + name = libcupsppdc; + sourceTree = ""; + }; + 274FF67313333B0A00317ECB /* commands */ = { + isa = PBXGroup; + children = ( + 2732E089137A3F5200FAFEF6 /* cancel.c */, + 2732E08A137A3F5200FAFEF6 /* cupsaccept.c */, + 276684101337FA7C000D33D0 /* cupsaddsmb.c */, + 276683681337AA00000D33D0 /* cupsctl.c */, + 274FF68713333B6E00317ECB /* cupsfilter.c */, + 2732E08B137A3F5200FAFEF6 /* cupstestdsc.c */, + 72F75A5B1336F988004BB496 /* cupstestppd.c */, + 726AD701135E8A90002C930D /* ippserver.c */, + 276683F91337F7A9000D33D0 /* ipptool.c */, + 2732E08C137A3F5200FAFEF6 /* lp.c */, + 2732E08D137A3F5200FAFEF6 /* lpadmin.c */, + 2732E08E137A3F5200FAFEF6 /* lpinfo.c */, + 2732E08F137A3F5200FAFEF6 /* lpmove.c */, + 2732E090137A3F5200FAFEF6 /* lpoptions.c */, + 2732E091137A3F5200FAFEF6 /* lppasswd.c */, + 2732E092137A3F5200FAFEF6 /* lpstat.c */, + ); + name = commands; + sourceTree = ""; + }; + 276683CB1337B1CC000D33D0 /* ppdc tools */ = { + isa = PBXGroup; + children = ( + 276683CC1337B201000D33D0 /* ppdc.cxx */, + 276683CE1337B20D000D33D0 /* ppdhtml.cxx */, + 276683D01337B21A000D33D0 /* ppdi.cxx */, + 276683D21337B228000D33D0 /* ppdmerge.cxx */, + 276683D41337B237000D33D0 /* ppdpo.cxx */, + ); + name = "ppdc tools"; + sourceTree = ""; + }; + 72220EAF1333047D00FCA411 /* Products */ = { + isa = PBXGroup; + children = ( + 72220F5B13330A5A00FCA411 /* cupsd */, + 274FF5CC13332B1F00317ECB /* cups-driverd */, + 274FF6291333333600317ECB /* cups-deviced */, + 274FF63E1333358B00317ECB /* cups-exec */, + 274FF64F133339C400317ECB /* cups-lpd */, + 274FF66313333A9B00317ECB /* cups-polld */, + 274FF67813333B2F00317ECB /* cupsfilter */, + 273BF6BD1333B5000022CAAB /* testcups */, + 724378FD1333E43E009631B9 /* ipp */, + 724379181333E532009631B9 /* lpd */, + 724379301333FB85009631B9 /* socket */, + 724379471333FEA9009631B9 /* dnssd */, + 7243795B1333FF1D009631B9 /* usb */, + 72F75A521336F950004BB496 /* cupstestppd */, + 2766835C1337A9B6000D33D0 /* cupsctl */, + 276683701337AC79000D33D0 /* ppdc */, + 2766837D1337AC8C000D33D0 /* ppdhtml */, + 2766838A1337AC97000D33D0 /* ppdi */, + 276683971337ACA2000D33D0 /* ppdmerge */, + 276683A41337ACAB000D33D0 /* ppdpo */, + 276683F01337F78E000D33D0 /* ipptool */, + 276684041337FA1D000D33D0 /* cupsaddsmb */, + 7258EAE2134594C4009286F1 /* rastertopwg */, + 720DD6C21358FD5F0064AA82 /* snmp */, + 270CCDA7135E3C9E00007BE2 /* testmime */, + 726AD6F7135E88F0002C930D /* ippserver */, + 278C58CB136B640300836530 /* testhttp */, + ); + name = Products; + sourceTree = ""; + }; + 72220EB41333050100FCA411 /* libcups */ = { + isa = PBXGroup; + children = ( + 276683561337A8C5000D33D0 /* cups.strings */, + 27D3037C134148CB00F022B1 /* libcups_s.exp */, + 27D3037D134148CB00F022B1 /* libcups2.def */, + 72220EB51333052D00FCA411 /* adminutil.c */, + 72220EB81333056300FCA411 /* array.c */, + 72220EBA1333056300FCA411 /* attr.c */, + 72220EBB1333056300FCA411 /* auth.c */, + 72220EBC1333056300FCA411 /* backchannel.c */, + 72220EBD1333056300FCA411 /* backend.c */, + 72220EBF1333056300FCA411 /* conflicts.c */, + 72220EC21333056300FCA411 /* custom.c */, + 72220ED1133305BB00FCA411 /* debug.c */, + 72220ED2133305BB00FCA411 /* dest.c */, + 72220ED3133305BB00FCA411 /* dir.c */, + 72220ED4133305BB00FCA411 /* dir.h */, + 72220ED5133305BB00FCA411 /* emit.c */, + 72220ED6133305BB00FCA411 /* encode.c */, + 72220ED8133305BB00FCA411 /* file.c */, + 72220EDA133305BB00FCA411 /* getdevices.c */, + 72220EDB133305BB00FCA411 /* getifaddrs.c */, + 72220EDC133305BB00FCA411 /* getputfile.c */, + 72220EDD133305BB00FCA411 /* globals.c */, + 72220EDE133305BB00FCA411 /* http-addr.c */, + 72220EDF133305BB00FCA411 /* http-addrlist.c */, + 72220EE1133305BB00FCA411 /* http-support.c */, + 72220EE2133305BB00FCA411 /* http.c */, + 72220EE5133305BB00FCA411 /* ipp-support.c */, + 72220EE6133305BB00FCA411 /* ipp.c */, + 72220EE8133305BB00FCA411 /* langprintf.c */, + 72220EEA133305BB00FCA411 /* language.c */, + 72220EEC133305BB00FCA411 /* localize.c */, + 72220EED133305BB00FCA411 /* mark.c */, + 72220EEF133305BB00FCA411 /* md5.c */, + 72220EF0133305BB00FCA411 /* md5passwd.c */, + 72220EF1133305BB00FCA411 /* notify.c */, + 72220EF2133305BB00FCA411 /* options.c */, + 72220EF3133305BB00FCA411 /* page.c */, + 72220EF4133305BB00FCA411 /* ppd-cache.c */, + 72220EF6133305BB00FCA411 /* ppd.c */, + 72220EF8133305BB00FCA411 /* pwg-media.c */, + 72220EFB133305BB00FCA411 /* request.c */, + 72220EFC133305BB00FCA411 /* sidechannel.c */, + 72220EFF133305BB00FCA411 /* snmp.c */, + 72220F00133305BB00FCA411 /* snprintf.c */, + 72220F02133305BB00FCA411 /* string.c */, + 72220F03133305BB00FCA411 /* tempfile.c */, + 72220F05133305BB00FCA411 /* thread.c */, + 72220F06133305BB00FCA411 /* transcode.c */, + 72220F08133305BB00FCA411 /* usersys.c */, + 72220F09133305BB00FCA411 /* util.c */, + ); + name = libcups; + sourceTree = ""; + }; + 72220F45133305D000FCA411 /* Public Headers */ = { + isa = PBXGroup; + children = ( + 72220EB71333056300FCA411 /* adminutil.h */, + 72220EB91333056300FCA411 /* array.h */, + 72220EBE1333056300FCA411 /* backend.h */, + 72220EC11333056300FCA411 /* cups.h */, + 72220ED9133305BB00FCA411 /* file.h */, + 72220EE3133305BB00FCA411 /* http.h */, + 72220EE7133305BB00FCA411 /* ipp.h */, + 72220EEB133305BB00FCA411 /* language.h */, + 72220FB413330BCE00FCA411 /* mime.h */, + 72220EF7133305BB00FCA411 /* ppd.h */, + 274FF6091333315100317ECB /* ppdc.h */, + 72220EFA133305BB00FCA411 /* raster.h */, + 72220EFD133305BB00FCA411 /* sidechannel.h */, + 72220F07133305BB00FCA411 /* transcode.h */, + 72220F0A133305BB00FCA411 /* versioning.h */, + ); + name = "Public Headers"; + sourceTree = ""; + }; + 72220F461333060C00FCA411 /* Private Headers */ = { + isa = PBXGroup; + children = ( + 72220F471333063D00FCA411 /* config.h */, + 7234F41F1378A16F00D3E9C9 /* array-private.h */, + 72220EC01333056300FCA411 /* cups-private.h */, + 72220EC31333056300FCA411 /* debug-private.h */, + 72220ED7133305BB00FCA411 /* file-private.h */, + 72220EE0133305BB00FCA411 /* http-private.h */, + 72220EE4133305BB00FCA411 /* ipp-private.h */, + 72220EE9133305BB00FCA411 /* language-private.h */, + 72220EEE133305BB00FCA411 /* md5-private.h */, + 7271883C1374AB14001A2036 /* mime-private.h */, + 72220EF5133305BB00FCA411 /* ppd-private.h */, + 72220EF9133305BB00FCA411 /* pwg-private.h */, + 72220EFE133305BB00FCA411 /* snmp-private.h */, + 72220F01133305BB00FCA411 /* string-private.h */, + 72220F04133305BB00FCA411 /* thread-private.h */, + ); + name = "Private Headers"; + sourceTree = ""; + }; + 72220F5D13330A5A00FCA411 /* cupsd */ = { + isa = PBXGroup; + children = ( + 72220F6913330B0C00FCA411 /* auth.c */, + 72220F6A13330B0C00FCA411 /* auth.h */, + 72220F6B13330B0C00FCA411 /* banners.c */, + 72220F6C13330B0C00FCA411 /* banners.h */, + 72220F6D13330B0C00FCA411 /* cert.c */, + 72220F6E13330B0C00FCA411 /* cert.h */, + 72220F6F13330B0C00FCA411 /* classes.c */, + 72220F7013330B0C00FCA411 /* classes.h */, + 72220F7113330B0C00FCA411 /* client.c */, + 72220F7213330B0C00FCA411 /* client.h */, + 72220F7313330B0C00FCA411 /* conf.c */, + 72220F7413330B0C00FCA411 /* conf.h */, + 72220F7513330B0C00FCA411 /* cupsd.h */, + 72220F7613330B0C00FCA411 /* dirsvc.c */, + 72220F7713330B0C00FCA411 /* dirsvc.h */, + 72220F7813330B0C00FCA411 /* env.c */, + 72C16CB8137B195D007E4BF4 /* file.c */, + 72220F7913330B0C00FCA411 /* ipp.c */, + 72220F7A13330B0C00FCA411 /* job.c */, + 72220F7B13330B0C00FCA411 /* job.h */, + 72220F7C13330B0C00FCA411 /* listen.c */, + 72220F7D13330B0C00FCA411 /* log.c */, + 72220F7E13330B0C00FCA411 /* main.c */, + 72220F7F13330B0C00FCA411 /* network.c */, + 72220F8013330B0C00FCA411 /* network.h */, + 72220F8113330B0C00FCA411 /* policy.c */, + 72220F8213330B0C00FCA411 /* policy.h */, + 72220F8313330B0C00FCA411 /* printers.c */, + 72220F8413330B0C00FCA411 /* printers.h */, + 72220F8513330B0C00FCA411 /* process.c */, + 72220F8613330B0C00FCA411 /* quotas.c */, + 72220F8813330B0C00FCA411 /* select.c */, + 72220F8913330B0C00FCA411 /* server.c */, + 72220F8A13330B0C00FCA411 /* statbuf.c */, + 72220F8B13330B0C00FCA411 /* statbuf.h */, + 72220F8C13330B0C00FCA411 /* subscriptions.c */, + 72220F8D13330B0C00FCA411 /* subscriptions.h */, + 72220F8E13330B0C00FCA411 /* sysman.c */, + 72220F8F13330B0C00FCA411 /* sysman.h */, + ); + name = cupsd; + path = .; + sourceTree = ""; + }; + 72220FB013330B3400FCA411 /* libcupsmime */ = { + isa = PBXGroup; + children = ( + 72220FB213330BCE00FCA411 /* filter.c */, + 72220FB313330BCE00FCA411 /* mime.c */, + 72220FB513330BCE00FCA411 /* type.c */, + ); + name = libcupsmime; + sourceTree = ""; + }; + 72220FB113330B4A00FCA411 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 278C58F4136B652300836530 /* Security.framework */, + 278C58E5136B64AF00836530 /* CoreFoundation.framework */, + 278C58E6136B64B000836530 /* Kerberos.framework */, + 278C58E7136B64B000836530 /* Security.framework */, + 278C58E8136B64B000836530 /* SystemConfiguration.framework */, + 278C58DA136B645C00836530 /* CoreFoundation.framework */, + 278C58DB136B645C00836530 /* Kerberos.framework */, + 278C58DD136B645C00836530 /* SystemConfiguration.framework */, + 72220FAC13330B2200FCA411 /* libcupsmime.dylib */, + 72220EAE1333047D00FCA411 /* libcups.dylib */, + 72F75A611336F9A3004BB496 /* libcupsimage.dylib */, + 274FF5EE133330C800317ECB /* libcupsppdc.dylib */, + 724379C81333FFF3009631B9 /* CoreFoundation.framework */, + 724379671333FF3B009631B9 /* IOKit.framework */, + 273BF6D51333B5F60022CAAB /* libresolv.dylib */, + 273BF6D61333B5F60022CAAB /* SystemConfiguration.framework */, + 273BF6D11333B5C30022CAAB /* Kerberos.framework */, + 273BF6D21333B5C30022CAAB /* Security.framework */, + 273BF6CB1333B5950022CAAB /* CoreFoundation.framework */, + 273BF6CC1333B5950022CAAB /* libiconv.dylib */, + 273BF6CD1333B5950022CAAB /* libz.dylib */, + 7263EE3913330EC500BA4D44 /* libldap.dylib */, + 7263EE3713330E7500BA4D44 /* libz.dylib */, + 7263EE3513330E4E00BA4D44 /* CoreFoundation.framework */, + 7263EE3313330E3C00BA4D44 /* libresolv.dylib */, + 7263EE3113330E1E00BA4D44 /* libpthread.dylib */, + 7263EE2F13330DC100BA4D44 /* IOKit.framework */, + 7263EE2913330D5C00BA4D44 /* Kerberos.framework */, + 7263EE2A13330D5C00BA4D44 /* Security.framework */, + 7263EE2B13330D5C00BA4D44 /* SystemConfiguration.framework */, + 7263EE2613330D2800BA4D44 /* libpam.dylib */, + 72220F6713330A8500FCA411 /* ApplicationServices.framework */, + 72220F49133306BB00FCA411 /* CoreFoundation.framework */, + 72220F55133308EA00FCA411 /* Kerberos.framework */, + 72220F4B133306BB00FCA411 /* Security.framework */, + 72220F4C133306BB00FCA411 /* SystemConfiguration.framework */, + 72220F51133308C100FCA411 /* libiconv.dylib */, + 72220F53133308CB00FCA411 /* libresolv.dylib */, + 72220F4A133306BB00FCA411 /* libz.dylib */, + ); + name = Frameworks; + sourceTree = ""; + }; + 724378F71333E3CE009631B9 /* backends */ = { + isa = PBXGroup; + children = ( + 724379091333E4E3009631B9 /* backend-private.h */, + 724379501333FEBB009631B9 /* dnssd.c */, + 724379CA1334000E009631B9 /* ieee1284.c */, + 7243790A1333E4E3009631B9 /* ipp.c */, + 724379281333E952009631B9 /* lpd.c */, + 7243790B1333E4E3009631B9 /* network.c */, + 724379121333E516009631B9 /* runloop.c */, + 720DD6D21358FDDE0064AA82 /* snmp.c */, + 7243790C1333E4E3009631B9 /* snmp-supplies.c */, + 7243793C1333FD19009631B9 /* socket.c */, + 724379C51333FFC7009631B9 /* usb.c */, + 724379C41333FFC7009631B9 /* usb-darwin.c */, + ); + name = backends; + sourceTree = ""; + }; + 7258EADC134594A8009286F1 /* filters */ = { + isa = PBXGroup; + children = ( + 7271881613746EA8001A2036 /* bannertops.c */, + 7271881713746EA8001A2036 /* commandtops.c */, + 7271881813746EA8001A2036 /* common.c */, + 7271881913746EA8001A2036 /* common.h */, + 7271881A13746EA8001A2036 /* gziptoany.c */, + 7271881B13746EA8001A2036 /* imagetops.c */, + 7271881C13746EA8001A2036 /* imagetoraster.c */, + 7271881D13746EA8001A2036 /* pdftops.c */, + 7271881E13746EA8001A2036 /* pstext.c */, + 7271881F13746EA8001A2036 /* pstext.h */, + 7271882013746EA8001A2036 /* pstops.c */, + 7271882113746EA8001A2036 /* rastertoepson.c */, + 7271882213746EA8001A2036 /* rastertohp.c */, + 7271882313746EA8001A2036 /* rastertolabel.c */, + 7258EAEC134594EB009286F1 /* rastertopwg.c */, + 7271882413746EA8001A2036 /* textcommon.c */, + 7271882513746EA8001A2036 /* textcommon.h */, + 7271882613746EA8001A2036 /* texttops.c */, + ); + name = filters; + sourceTree = ""; + }; + 7271882A1374988C001A2036 /* Unused */ = { + isa = PBXGroup; + children = ( + 7271882B137498E4001A2036 /* image-bmp.c */, + 7271882C137498E4001A2036 /* image-colorspace.c */, + 7271882D137498E4001A2036 /* image-gif.c */, + 7271882E137498E4001A2036 /* image-jpeg.c */, + 7271882F137498E4001A2036 /* image-photocd.c */, + 72718830137498E4001A2036 /* image-pix.c */, + 72718831137498E4001A2036 /* image-png.c */, + 72718832137498E4001A2036 /* image-pnm.c */, + 72718833137498E4001A2036 /* image-private.h */, + 72718834137498E4001A2036 /* image-sgi.c */, + 72718835137498E4001A2036 /* image-sgi.h */, + 72718836137498E4001A2036 /* image-sgilib.c */, + 72718837137498E4001A2036 /* image-sun.c */, + 72718838137498E4001A2036 /* image-tiff.c */, + 72718839137498E4001A2036 /* image-zoom.c */, + 7271883A137498E4001A2036 /* image.c */, + 7271883B137498E4001A2036 /* image.h */, + ); + name = Unused; + sourceTree = ""; + }; + 72BF96351333042100B1EAD7 = { + isa = PBXGroup; + children = ( + 72F75A4C1336F31B004BB496 /* libcups_static.a */, + 72220FB113330B4A00FCA411 /* Frameworks */, + 72220F45133305D000FCA411 /* Public Headers */, + 72220F461333060C00FCA411 /* Private Headers */, + 72220EB41333050100FCA411 /* libcups */, + 72F75A681336FA42004BB496 /* libcupsimage */, + 72220FB013330B3400FCA411 /* libcupsmime */, + 274FF5F41333310400317ECB /* libcupsppdc */, + 724378F71333E3CE009631B9 /* backends */, + 274FF67313333B0A00317ECB /* commands */, + 72220F5D13330A5A00FCA411 /* cupsd */, + 274FF5D513332C2C00317ECB /* daemon */, + 7258EADC134594A8009286F1 /* filters */, + 276683CB1337B1CC000D33D0 /* ppdc tools */, + 273BF6B81333B4A90022CAAB /* tests */, + 72220EAF1333047D00FCA411 /* Products */, + ); + sourceTree = ""; + }; + 72F75A681336FA42004BB496 /* libcupsimage */ = { + isa = PBXGroup; + children = ( + 7271882A1374988C001A2036 /* Unused */, + 72F75A691336FA8A004BB496 /* error.c */, + 72F75A6A1336FA8A004BB496 /* interpret.c */, + 72F75A6B1336FA8A004BB496 /* raster.c */, + ); + name = libcupsimage; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 274FF5EC133330C800317ECB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF61E1333315100317ECB /* ppdc.h in Headers */, + 274FF6181333315100317ECB /* ppdc-private.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF6C11333B1C400317ECB /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF6C21333B1C400317ECB /* adminutil.h in Headers */, + 274FF6C31333B1C400317ECB /* array.h in Headers */, + 274FF6C41333B1C400317ECB /* backend.h in Headers */, + 274FF6D01333B1C400317ECB /* cups-private.h in Headers */, + 274FF6D11333B1C400317ECB /* debug-private.h in Headers */, + 274FF6D21333B1C400317ECB /* file-private.h in Headers */, + 274FF6D31333B1C400317ECB /* http-private.h in Headers */, + 274FF6D41333B1C400317ECB /* ipp-private.h in Headers */, + 274FF6D51333B1C400317ECB /* language-private.h in Headers */, + 274FF6D61333B1C400317ECB /* md5-private.h in Headers */, + 274FF6D71333B1C400317ECB /* ppd-private.h in Headers */, + 274FF6D81333B1C400317ECB /* pwg-private.h in Headers */, + 274FF6D91333B1C400317ECB /* snmp-private.h in Headers */, + 274FF6DA1333B1C400317ECB /* string-private.h in Headers */, + 274FF6DB1333B1C400317ECB /* thread-private.h in Headers */, + 274FF6DC1333B1C400317ECB /* config.h in Headers */, + 274FF6C51333B1C400317ECB /* cups.h in Headers */, + 274FF6C61333B1C400317ECB /* dir.h in Headers */, + 274FF6C71333B1C400317ECB /* file.h in Headers */, + 274FF6C81333B1C400317ECB /* http.h in Headers */, + 274FF6C91333B1C400317ECB /* ipp.h in Headers */, + 274FF6CA1333B1C400317ECB /* language.h in Headers */, + 274FF6CB1333B1C400317ECB /* ppd.h in Headers */, + 274FF6CD1333B1C400317ECB /* sidechannel.h in Headers */, + 274FF6CE1333B1C400317ECB /* transcode.h in Headers */, + 274FF6CF1333B1C400317ECB /* versioning.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220EAC1333047D00FCA411 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220EC41333056300FCA411 /* adminutil.h in Headers */, + 72220EC61333056300FCA411 /* array.h in Headers */, + 72220ECB1333056300FCA411 /* backend.h in Headers */, + 72220ECE1333056300FCA411 /* cups.h in Headers */, + 72220F0E133305BB00FCA411 /* dir.h in Headers */, + 72220F13133305BB00FCA411 /* file.h in Headers */, + 72220F1D133305BB00FCA411 /* http.h in Headers */, + 72220F21133305BB00FCA411 /* ipp.h in Headers */, + 72220F25133305BB00FCA411 /* language.h in Headers */, + 72220F31133305BB00FCA411 /* ppd.h in Headers */, + 72220F37133305BB00FCA411 /* sidechannel.h in Headers */, + 72220F41133305BB00FCA411 /* transcode.h in Headers */, + 72220F44133305BB00FCA411 /* versioning.h in Headers */, + 72220ECD1333056300FCA411 /* cups-private.h in Headers */, + 72220ED01333056300FCA411 /* debug-private.h in Headers */, + 72220F11133305BB00FCA411 /* file-private.h in Headers */, + 72220F1A133305BB00FCA411 /* http-private.h in Headers */, + 72220F1E133305BB00FCA411 /* ipp-private.h in Headers */, + 72220F23133305BB00FCA411 /* language-private.h in Headers */, + 72220F28133305BB00FCA411 /* md5-private.h in Headers */, + 72220F2F133305BB00FCA411 /* ppd-private.h in Headers */, + 72220F33133305BB00FCA411 /* pwg-private.h in Headers */, + 72220F38133305BB00FCA411 /* snmp-private.h in Headers */, + 72220F3B133305BB00FCA411 /* string-private.h in Headers */, + 72220F3E133305BB00FCA411 /* thread-private.h in Headers */, + 72220F481333063D00FCA411 /* config.h in Headers */, + 7234F4201378A16F00D3E9C9 /* array-private.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220FAA13330B2200FCA411 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220FB813330BCE00FCA411 /* mime.h in Headers */, + 7271883D1374AB14001A2036 /* mime-private.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72F75A5F1336F9A3004BB496 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 72F75A6F1336FAB6004BB496 /* raster.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 270CCDA6135E3C9E00007BE2 /* testmime */ = { + isa = PBXNativeTarget; + buildConfigurationList = 270CCDAF135E3C9E00007BE2 /* Build configuration list for PBXNativeTarget "testmime" */; + buildPhases = ( + 270CCDA3135E3C9E00007BE2 /* Sources */, + 270CCDA4135E3C9E00007BE2 /* Frameworks */, + 270CCDA5135E3C9E00007BE2 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 270CCDB8135E3CFD00007BE2 /* PBXTargetDependency */, + 270CCDB6135E3CF700007BE2 /* PBXTargetDependency */, + ); + name = testmime; + productName = testmime; + productReference = 270CCDA7135E3C9E00007BE2 /* testmime */; + productType = "com.apple.product-type.tool"; + }; + 273BF6BC1333B5000022CAAB /* testcups */ = { + isa = PBXNativeTarget; + buildConfigurationList = 273BF6C31333B5000022CAAB /* Build configuration list for PBXNativeTarget "testcups" */; + buildPhases = ( + 273BF6B91333B5000022CAAB /* Sources */, + 273BF6BA1333B5000022CAAB /* Frameworks */, + 273BF6BB1333B5000022CAAB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 273BF6C91333B5410022CAAB /* PBXTargetDependency */, + ); + name = testcups; + productName = testcups; + productReference = 273BF6BD1333B5000022CAAB /* testcups */; + productType = "com.apple.product-type.tool"; + }; + 274FF5CB13332B1F00317ECB /* cups-driverd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */; + buildPhases = ( + 274FF5C813332B1F00317ECB /* Sources */, + 274FF5C913332B1F00317ECB /* Frameworks */, + 274FF5CA13332B1F00317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 274FF5DC13332CF900317ECB /* PBXTargetDependency */, + 274FF6201333316200317ECB /* PBXTargetDependency */, + ); + name = "cups-driverd"; + productName = "cups-driverd"; + productReference = 274FF5CC13332B1F00317ECB /* cups-driverd */; + productType = "com.apple.product-type.tool"; + }; + 274FF5ED133330C800317ECB /* libcupsppdc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF5EF133330C800317ECB /* Build configuration list for PBXNativeTarget "libcupsppdc" */; + buildPhases = ( + 274FF5EA133330C800317ECB /* Sources */, + 274FF5EB133330C800317ECB /* Frameworks */, + 274FF5EC133330C800317ECB /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 274FF5F3133330FD00317ECB /* PBXTargetDependency */, + ); + name = libcupsppdc; + productName = libcupsppdc; + productReference = 274FF5EE133330C800317ECB /* libcupsppdc.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + 274FF6281333333600317ECB /* cups-deviced */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF62F1333333600317ECB /* Build configuration list for PBXNativeTarget "cups-deviced" */; + buildPhases = ( + 274FF6251333333600317ECB /* Sources */, + 274FF6261333333600317ECB /* Frameworks */, + 274FF6271333333600317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 274FF6341333335200317ECB /* PBXTargetDependency */, + ); + name = "cups-deviced"; + productName = "cups-deviced"; + productReference = 274FF6291333333600317ECB /* cups-deviced */; + productType = "com.apple.product-type.tool"; + }; + 274FF63D1333358B00317ECB /* cups-exec */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF6441333358C00317ECB /* Build configuration list for PBXNativeTarget "cups-exec" */; + buildPhases = ( + 274FF63A1333358B00317ECB /* Sources */, + 274FF63B1333358B00317ECB /* Frameworks */, + 274FF63C1333358B00317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "cups-exec"; + productName = "cups-exec"; + productReference = 274FF63E1333358B00317ECB /* cups-exec */; + productType = "com.apple.product-type.tool"; + }; + 274FF64E133339C400317ECB /* cups-lpd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF655133339C400317ECB /* Build configuration list for PBXNativeTarget "cups-lpd" */; + buildPhases = ( + 274FF64B133339C400317ECB /* Sources */, + 274FF64C133339C400317ECB /* Frameworks */, + 274FF64D133339C400317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 274FF65A133339D900317ECB /* PBXTargetDependency */, + ); + name = "cups-lpd"; + productName = "cups-lpd"; + productReference = 274FF64F133339C400317ECB /* cups-lpd */; + productType = "com.apple.product-type.tool"; + }; + 274FF66213333A9B00317ECB /* cups-polld */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF66913333A9B00317ECB /* Build configuration list for PBXNativeTarget "cups-polld" */; + buildPhases = ( + 274FF65F13333A9B00317ECB /* Sources */, + 274FF66013333A9B00317ECB /* Frameworks */, + 274FF66113333A9B00317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 274FF66D13333AAD00317ECB /* PBXTargetDependency */, + ); + name = "cups-polld"; + productName = "cups-polld"; + productReference = 274FF66313333A9B00317ECB /* cups-polld */; + productType = "com.apple.product-type.tool"; + }; + 274FF67713333B2F00317ECB /* cupsfilter */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF67E13333B2F00317ECB /* Build configuration list for PBXNativeTarget "cupsfilter" */; + buildPhases = ( + 274FF67413333B2F00317ECB /* Sources */, + 274FF67513333B2F00317ECB /* Frameworks */, + 274FF67613333B2F00317ECB /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 274FF68213333B3C00317ECB /* PBXTargetDependency */, + 274FF68413333B3C00317ECB /* PBXTargetDependency */, + ); + name = cupsfilter; + productName = cupsfilter; + productReference = 274FF67813333B2F00317ECB /* cupsfilter */; + productType = "com.apple.product-type.tool"; + }; + 274FF6891333B1C400317ECB /* libcups_static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 274FF6DD1333B1C400317ECB /* Build configuration list for PBXNativeTarget "libcups_static" */; + buildPhases = ( + 274FF68A1333B1C400317ECB /* Sources */, + 274FF6B91333B1C400317ECB /* Frameworks */, + 274FF6C11333B1C400317ECB /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = libcups_static; + productName = libcups; + productReference = 72F75A4C1336F31B004BB496 /* libcups_static.a */; + productType = "com.apple.product-type.library.dynamic"; + }; + 2766835B1337A9B6000D33D0 /* cupsctl */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683621337A9B6000D33D0 /* Build configuration list for PBXNativeTarget "cupsctl" */; + buildPhases = ( + 276683581337A9B6000D33D0 /* Sources */, + 276683591337A9B6000D33D0 /* Frameworks */, + 2766835A1337A9B6000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683661337A9D6000D33D0 /* PBXTargetDependency */, + ); + name = cupsctl; + productName = cupsctl; + productReference = 2766835C1337A9B6000D33D0 /* cupsctl */; + productType = "com.apple.product-type.tool"; + }; + 2766836F1337AC79000D33D0 /* ppdc */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683761337AC79000D33D0 /* Build configuration list for PBXNativeTarget "ppdc" */; + buildPhases = ( + 2766836C1337AC79000D33D0 /* Sources */, + 2766836D1337AC79000D33D0 /* Frameworks */, + 2766836E1337AC79000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683AE1337ACF9000D33D0 /* PBXTargetDependency */, + 276683B01337ACF9000D33D0 /* PBXTargetDependency */, + ); + name = ppdc; + productName = ppdc; + productReference = 276683701337AC79000D33D0 /* ppdc */; + productType = "com.apple.product-type.tool"; + }; + 2766837C1337AC8C000D33D0 /* ppdhtml */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683831337AC8C000D33D0 /* Build configuration list for PBXNativeTarget "ppdhtml" */; + buildPhases = ( + 276683791337AC8C000D33D0 /* Sources */, + 2766837A1337AC8C000D33D0 /* Frameworks */, + 2766837B1337AC8C000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683B41337AD18000D33D0 /* PBXTargetDependency */, + 276683B61337AD18000D33D0 /* PBXTargetDependency */, + ); + name = ppdhtml; + productName = ppdhtml; + productReference = 2766837D1337AC8C000D33D0 /* ppdhtml */; + productType = "com.apple.product-type.tool"; + }; + 276683891337AC97000D33D0 /* ppdi */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683901337AC97000D33D0 /* Build configuration list for PBXNativeTarget "ppdi" */; + buildPhases = ( + 276683861337AC97000D33D0 /* Sources */, + 276683871337AC97000D33D0 /* Frameworks */, + 276683881337AC97000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683BC1337AE49000D33D0 /* PBXTargetDependency */, + 276683BE1337AE49000D33D0 /* PBXTargetDependency */, + ); + name = ppdi; + productName = ppdi; + productReference = 2766838A1337AC97000D33D0 /* ppdi */; + productType = "com.apple.product-type.tool"; + }; + 276683961337ACA2000D33D0 /* ppdmerge */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2766839D1337ACA2000D33D0 /* Build configuration list for PBXNativeTarget "ppdmerge" */; + buildPhases = ( + 276683931337ACA2000D33D0 /* Sources */, + 276683941337ACA2000D33D0 /* Frameworks */, + 276683951337ACA2000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683C01337B1AD000D33D0 /* PBXTargetDependency */, + 276683C21337B1AD000D33D0 /* PBXTargetDependency */, + ); + name = ppdmerge; + productName = ppdmerge; + productReference = 276683971337ACA2000D33D0 /* ppdmerge */; + productType = "com.apple.product-type.tool"; + }; + 276683A31337ACAB000D33D0 /* ppdpo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683AA1337ACAB000D33D0 /* Build configuration list for PBXNativeTarget "ppdpo" */; + buildPhases = ( + 276683A01337ACAB000D33D0 /* Sources */, + 276683A11337ACAB000D33D0 /* Frameworks */, + 276683A21337ACAB000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683C61337B1BC000D33D0 /* PBXTargetDependency */, + 276683C81337B1BC000D33D0 /* PBXTargetDependency */, + ); + name = ppdpo; + productName = ppdpo; + productReference = 276683A41337ACAB000D33D0 /* ppdpo */; + productType = "com.apple.product-type.tool"; + }; + 276683EF1337F78E000D33D0 /* ipptool */ = { + isa = PBXNativeTarget; + buildConfigurationList = 276683F61337F78F000D33D0 /* Build configuration list for PBXNativeTarget "ipptool" */; + buildPhases = ( + 276683EC1337F78E000D33D0 /* Sources */, + 276683ED1337F78E000D33D0 /* Frameworks */, + 276683EE1337F78E000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683FC1337F7B3000D33D0 /* PBXTargetDependency */, + ); + name = ipptool; + productName = ipptool; + productReference = 276683F01337F78E000D33D0 /* ipptool */; + productType = "com.apple.product-type.tool"; + }; + 276684031337FA1D000D33D0 /* cupsaddsmb */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2766840A1337FA1E000D33D0 /* Build configuration list for PBXNativeTarget "cupsaddsmb" */; + buildPhases = ( + 276684001337FA1D000D33D0 /* Sources */, + 276684011337FA1D000D33D0 /* Frameworks */, + 276684021337FA1D000D33D0 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 2766840E1337FA31000D33D0 /* PBXTargetDependency */, + ); + name = cupsaddsmb; + productName = cupsaddsmb; + productReference = 276684041337FA1D000D33D0 /* cupsaddsmb */; + productType = "com.apple.product-type.tool"; + }; + 278C58CA136B640300836530 /* testhttp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */; + buildPhases = ( + 278C58C7136B640300836530 /* Sources */, + 278C58C8136B640300836530 /* Frameworks */, + 278C58C9136B640300836530 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 278C58D8136B642F00836530 /* PBXTargetDependency */, + ); + name = testhttp; + productName = testhttp; + productReference = 278C58CB136B640300836530 /* testhttp */; + productType = "com.apple.product-type.tool"; + }; + 720DD6C11358FD5F0064AA82 /* snmp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */; + buildPhases = ( + 720DD6BE1358FD5F0064AA82 /* Sources */, + 720DD6BF1358FD5F0064AA82 /* Frameworks */, + 720DD6C01358FD5F0064AA82 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 720DD6CF1358FD790064AA82 /* PBXTargetDependency */, + ); + name = snmp; + productName = snmp; + productReference = 720DD6C21358FD5F0064AA82 /* snmp */; + productType = "com.apple.product-type.tool"; + }; + 72220EAD1333047D00FCA411 /* libcups */ = { + isa = PBXNativeTarget; + buildConfigurationList = 72220EB21333047D00FCA411 /* Build configuration list for PBXNativeTarget "libcups" */; + buildPhases = ( + 72220EAA1333047D00FCA411 /* Sources */, + 72220EAB1333047D00FCA411 /* Frameworks */, + 72220EAC1333047D00FCA411 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = libcups; + productName = libcups; + productReference = 72220EAE1333047D00FCA411 /* libcups.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + 72220F5A13330A5A00FCA411 /* cupsd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 72220F6113330A5A00FCA411 /* Build configuration list for PBXNativeTarget "cupsd" */; + buildPhases = ( + 72220F5713330A5A00FCA411 /* Sources */, + 72220F5813330A5A00FCA411 /* Frameworks */, + 72220F5913330A5A00FCA411 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 72220FBE13330C0B00FCA411 /* PBXTargetDependency */, + 72220F6513330A6500FCA411 /* PBXTargetDependency */, + ); + name = cupsd; + productName = cupsd; + productReference = 72220F5B13330A5A00FCA411 /* cupsd */; + productType = "com.apple.product-type.tool"; + }; + 72220FAB13330B2200FCA411 /* libcupsmime */ = { + isa = PBXNativeTarget; + buildConfigurationList = 72220FAD13330B2300FCA411 /* Build configuration list for PBXNativeTarget "libcupsmime" */; + buildPhases = ( + 72220FA813330B2200FCA411 /* Sources */, + 72220FA913330B2200FCA411 /* Frameworks */, + 72220FAA13330B2200FCA411 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 72220FBC13330C0500FCA411 /* PBXTargetDependency */, + ); + name = libcupsmime; + productName = libcupsmime; + productReference = 72220FAC13330B2200FCA411 /* libcupsmime.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + 724378FC1333E43E009631B9 /* ipp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 724379031333E43E009631B9 /* Build configuration list for PBXNativeTarget "ipp" */; + buildPhases = ( + 724378F91333E43E009631B9 /* Sources */, + 724378FA1333E43E009631B9 /* Frameworks */, + 724378FB1333E43E009631B9 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 724379071333E49B009631B9 /* PBXTargetDependency */, + ); + name = ipp; + productName = ipp; + productReference = 724378FD1333E43E009631B9 /* ipp */; + productType = "com.apple.product-type.tool"; + }; + 724379171333E532009631B9 /* lpd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7243791E1333E532009631B9 /* Build configuration list for PBXNativeTarget "lpd" */; + buildPhases = ( + 724379141333E532009631B9 /* Sources */, + 724379151333E532009631B9 /* Frameworks */, + 724379161333E532009631B9 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 724379261333E932009631B9 /* PBXTargetDependency */, + ); + name = lpd; + productName = lpd; + productReference = 724379181333E532009631B9 /* lpd */; + productType = "com.apple.product-type.tool"; + }; + 7243792F1333FB85009631B9 /* socket */ = { + isa = PBXNativeTarget; + buildConfigurationList = 724379361333FB85009631B9 /* Build configuration list for PBXNativeTarget "socket" */; + buildPhases = ( + 7243792C1333FB85009631B9 /* Sources */, + 7243792D1333FB85009631B9 /* Frameworks */, + 7243792E1333FB85009631B9 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 7243793A1333FB95009631B9 /* PBXTargetDependency */, + ); + name = socket; + productName = socket; + productReference = 724379301333FB85009631B9 /* socket */; + productType = "com.apple.product-type.tool"; + }; + 724379461333FEA9009631B9 /* dnssd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7243794D1333FEA9009631B9 /* Build configuration list for PBXNativeTarget "dnssd" */; + buildPhases = ( + 724379431333FEA9009631B9 /* Sources */, + 724379441333FEA9009631B9 /* Frameworks */, + 724379451333FEA9009631B9 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 724379551333FEFE009631B9 /* PBXTargetDependency */, + ); + name = dnssd; + productName = dnssd; + productReference = 724379471333FEA9009631B9 /* dnssd */; + productType = "com.apple.product-type.tool"; + }; + 7243795A1333FF1D009631B9 /* usb */ = { + isa = PBXNativeTarget; + buildConfigurationList = 724379611333FF1D009631B9 /* Build configuration list for PBXNativeTarget "usb" */; + buildPhases = ( + 724379571333FF1D009631B9 /* Sources */, + 724379581333FF1D009631B9 /* Frameworks */, + 724379591333FF1D009631B9 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 724379651333FF2E009631B9 /* PBXTargetDependency */, + ); + name = usb; + productName = usb; + productReference = 7243795B1333FF1D009631B9 /* usb */; + productType = "com.apple.product-type.tool"; + }; + 7258EAE1134594C4009286F1 /* rastertopwg */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7258EAE9134594C4009286F1 /* Build configuration list for PBXNativeTarget "rastertopwg" */; + buildPhases = ( + 7258EADE134594C4009286F1 /* Sources */, + 7258EADF134594C4009286F1 /* Frameworks */, + 7258EAE0134594C4009286F1 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 7258EAF113459B67009286F1 /* PBXTargetDependency */, + 7258EAF313459B67009286F1 /* PBXTargetDependency */, + ); + name = rastertopwg; + productName = rastertopwg; + productReference = 7258EAE2134594C4009286F1 /* rastertopwg */; + productType = "com.apple.product-type.tool"; + }; + 726AD6F6135E88F0002C930D /* ippserver */ = { + isa = PBXNativeTarget; + buildConfigurationList = 726AD6FE135E88F1002C930D /* Build configuration list for PBXNativeTarget "ippserver" */; + buildPhases = ( + 726AD6F3135E88F0002C930D /* Sources */, + 726AD6F4135E88F0002C930D /* Frameworks */, + 726AD6F5135E88F0002C930D /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 726AD706135E8AC5002C930D /* PBXTargetDependency */, + ); + name = ippserver; + productName = ippserver; + productReference = 726AD6F7135E88F0002C930D /* ippserver */; + productType = "com.apple.product-type.tool"; + }; + 72F75A511336F950004BB496 /* cupstestppd */ = { + isa = PBXNativeTarget; + buildConfigurationList = 72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */; + buildPhases = ( + 72F75A4E1336F950004BB496 /* Sources */, + 72F75A4F1336F950004BB496 /* Frameworks */, + 72F75A501336F950004BB496 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 276683E41337B2BA000D33D0 /* PBXTargetDependency */, + 276683E11337B299000D33D0 /* PBXTargetDependency */, + ); + name = cupstestppd; + productName = cupstestppd; + productReference = 72F75A521336F950004BB496 /* cupstestppd */; + productType = "com.apple.product-type.tool"; + }; + 72F75A601336F9A3004BB496 /* libcupsimage */ = { + isa = PBXNativeTarget; + buildConfigurationList = 72F75A621336F9A3004BB496 /* Build configuration list for PBXNativeTarget "libcupsimage" */; + buildPhases = ( + 72F75A5D1336F9A3004BB496 /* Sources */, + 72F75A5E1336F9A3004BB496 /* Frameworks */, + 72F75A5F1336F9A3004BB496 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 72F75A661336FA30004BB496 /* PBXTargetDependency */, + ); + name = libcupsimage; + productName = libcupsimage; + productReference = 72F75A611336F9A3004BB496 /* libcupsimage.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 72BF96371333042100B1EAD7 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0410; + ORGANIZATIONNAME = "Apple Inc."; + }; + buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 72BF96351333042100B1EAD7; + productRefGroup = 72220EAF1333047D00FCA411 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 274FF5DE13332D3000317ECB /* All */, + 273BF6D91333B6260022CAAB /* Tests */, + 72220EAD1333047D00FCA411 /* libcups */, + 274FF6891333B1C400317ECB /* libcups_static */, + 72F75A601336F9A3004BB496 /* libcupsimage */, + 72220FAB13330B2200FCA411 /* libcupsmime */, + 274FF5ED133330C800317ECB /* libcupsppdc */, + 276684031337FA1D000D33D0 /* cupsaddsmb */, + 2766835B1337A9B6000D33D0 /* cupsctl */, + 72220F5A13330A5A00FCA411 /* cupsd */, + 274FF5CB13332B1F00317ECB /* cups-driverd */, + 274FF6281333333600317ECB /* cups-deviced */, + 274FF63D1333358B00317ECB /* cups-exec */, + 274FF64E133339C400317ECB /* cups-lpd */, + 274FF66213333A9B00317ECB /* cups-polld */, + 274FF67713333B2F00317ECB /* cupsfilter */, + 72F75A511336F950004BB496 /* cupstestppd */, + 724379461333FEA9009631B9 /* dnssd */, + 724378FC1333E43E009631B9 /* ipp */, + 726AD6F6135E88F0002C930D /* ippserver */, + 276683EF1337F78E000D33D0 /* ipptool */, + 724379171333E532009631B9 /* lpd */, + 2766836F1337AC79000D33D0 /* ppdc */, + 2766837C1337AC8C000D33D0 /* ppdhtml */, + 276683891337AC97000D33D0 /* ppdi */, + 276683961337ACA2000D33D0 /* ppdmerge */, + 276683A31337ACAB000D33D0 /* ppdpo */, + 7258EAE1134594C4009286F1 /* rastertopwg */, + 720DD6C11358FD5F0064AA82 /* snmp */, + 7243792F1333FB85009631B9 /* socket */, + 273BF6BC1333B5000022CAAB /* testcups */, + 278C58CA136B640300836530 /* testhttp */, + 270CCDA6135E3C9E00007BE2 /* testmime */, + 7243795A1333FF1D009631B9 /* usb */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 270CCDA3135E3C9E00007BE2 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 270CCDBC135E3D3E00007BE2 /* testmime.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 273BF6B91333B5000022CAAB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 273BF6C71333B5370022CAAB /* testcups.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF5C813332B1F00317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF5D913332CC700317ECB /* cups-driverd.cxx in Sources */, + 274FF5DA13332CC700317ECB /* util.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF5EA133330C800317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF60A1333315100317ECB /* ppdc-array.cxx in Sources */, + 274FF60B1333315100317ECB /* ppdc-attr.cxx in Sources */, + 274FF60C1333315100317ECB /* ppdc-catalog.cxx in Sources */, + 274FF60D1333315100317ECB /* ppdc-choice.cxx in Sources */, + 274FF60E1333315100317ECB /* ppdc-constraint.cxx in Sources */, + 274FF60F1333315100317ECB /* ppdc-driver.cxx in Sources */, + 274FF6101333315100317ECB /* ppdc-file.cxx in Sources */, + 274FF6111333315100317ECB /* ppdc-filter.cxx in Sources */, + 274FF6121333315100317ECB /* ppdc-font.cxx in Sources */, + 274FF6131333315100317ECB /* ppdc-group.cxx in Sources */, + 274FF6141333315100317ECB /* ppdc-import.cxx in Sources */, + 274FF6151333315100317ECB /* ppdc-mediasize.cxx in Sources */, + 274FF6161333315100317ECB /* ppdc-message.cxx in Sources */, + 274FF6171333315100317ECB /* ppdc-option.cxx in Sources */, + 274FF6191333315100317ECB /* ppdc-profile.cxx in Sources */, + 274FF61A1333315100317ECB /* ppdc-shared.cxx in Sources */, + 274FF61B1333315100317ECB /* ppdc-source.cxx in Sources */, + 274FF61C1333315100317ECB /* ppdc-string.cxx in Sources */, + 274FF61D1333315100317ECB /* ppdc-variable.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF6251333333600317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF6361333344400317ECB /* cups-deviced.c in Sources */, + 274FF6371333345900317ECB /* util.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF63A1333358B00317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF64A1333398D00317ECB /* cups-exec.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF64B133339C400317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF65C133339FC00317ECB /* cups-lpd.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF65F13333A9B00317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF67013333ACF00317ECB /* cups-polld.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF67413333B2F00317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF68813333B6E00317ECB /* cupsfilter.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 274FF68A1333B1C400317ECB /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 274FF68B1333B1C400317ECB /* adminutil.c in Sources */, + 274FF68C1333B1C400317ECB /* array.c in Sources */, + 274FF68D1333B1C400317ECB /* attr.c in Sources */, + 274FF68E1333B1C400317ECB /* auth.c in Sources */, + 274FF68F1333B1C400317ECB /* backchannel.c in Sources */, + 274FF6901333B1C400317ECB /* backend.c in Sources */, + 274FF6911333B1C400317ECB /* conflicts.c in Sources */, + 274FF6921333B1C400317ECB /* custom.c in Sources */, + 274FF6931333B1C400317ECB /* debug.c in Sources */, + 274FF6941333B1C400317ECB /* dest.c in Sources */, + 274FF6951333B1C400317ECB /* dir.c in Sources */, + 274FF6961333B1C400317ECB /* emit.c in Sources */, + 274FF6971333B1C400317ECB /* encode.c in Sources */, + 274FF6981333B1C400317ECB /* file.c in Sources */, + 274FF6991333B1C400317ECB /* getdevices.c in Sources */, + 274FF69A1333B1C400317ECB /* getifaddrs.c in Sources */, + 274FF69B1333B1C400317ECB /* getputfile.c in Sources */, + 274FF69C1333B1C400317ECB /* globals.c in Sources */, + 274FF69D1333B1C400317ECB /* http-addr.c in Sources */, + 274FF69E1333B1C400317ECB /* http-addrlist.c in Sources */, + 274FF69F1333B1C400317ECB /* http-support.c in Sources */, + 274FF6A01333B1C400317ECB /* http.c in Sources */, + 274FF6A11333B1C400317ECB /* ipp-support.c in Sources */, + 274FF6A21333B1C400317ECB /* ipp.c in Sources */, + 274FF6A31333B1C400317ECB /* langprintf.c in Sources */, + 274FF6A41333B1C400317ECB /* language.c in Sources */, + 274FF6A51333B1C400317ECB /* localize.c in Sources */, + 274FF6A61333B1C400317ECB /* mark.c in Sources */, + 274FF6A71333B1C400317ECB /* md5.c in Sources */, + 274FF6A81333B1C400317ECB /* md5passwd.c in Sources */, + 274FF6A91333B1C400317ECB /* notify.c in Sources */, + 274FF6AA1333B1C400317ECB /* options.c in Sources */, + 274FF6AB1333B1C400317ECB /* page.c in Sources */, + 274FF6AC1333B1C400317ECB /* ppd-cache.c in Sources */, + 274FF6AD1333B1C400317ECB /* ppd.c in Sources */, + 274FF6AE1333B1C400317ECB /* pwg-media.c in Sources */, + 274FF6AF1333B1C400317ECB /* request.c in Sources */, + 274FF6B01333B1C400317ECB /* sidechannel.c in Sources */, + 274FF6B11333B1C400317ECB /* snmp.c in Sources */, + 274FF6B21333B1C400317ECB /* snprintf.c in Sources */, + 274FF6B31333B1C400317ECB /* string.c in Sources */, + 274FF6B41333B1C400317ECB /* tempfile.c in Sources */, + 274FF6B51333B1C400317ECB /* thread.c in Sources */, + 274FF6B61333B1C400317ECB /* transcode.c in Sources */, + 274FF6B71333B1C400317ECB /* usersys.c in Sources */, + 274FF6B81333B1C400317ECB /* util.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683581337A9B6000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683691337AA00000D33D0 /* cupsctl.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 2766836C1337AC79000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683CD1337B201000D33D0 /* ppdc.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683791337AC8C000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683CF1337B20D000D33D0 /* ppdhtml.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683861337AC97000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683D11337B21A000D33D0 /* ppdi.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683931337ACA2000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683D31337B228000D33D0 /* ppdmerge.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683A01337ACAB000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683D51337B237000D33D0 /* ppdpo.cxx in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276683EC1337F78E000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276683FA1337F7A9000D33D0 /* ipptool.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 276684001337FA1D000D33D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 278C58C7136B640300836530 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 278C58E3136B647200836530 /* testhttp.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 720DD6BE1358FD5F0064AA82 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 720DD6D413590AB90064AA82 /* ieee1284.c in Sources */, + 720DD6D31358FDDE0064AA82 /* snmp.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220EAA1333047D00FCA411 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220EB61333052D00FCA411 /* adminutil.c in Sources */, + 72220EC51333056300FCA411 /* array.c in Sources */, + 72220EC71333056300FCA411 /* attr.c in Sources */, + 72220EC81333056300FCA411 /* auth.c in Sources */, + 72220EC91333056300FCA411 /* backchannel.c in Sources */, + 72220ECA1333056300FCA411 /* backend.c in Sources */, + 72220ECC1333056300FCA411 /* conflicts.c in Sources */, + 72220ECF1333056300FCA411 /* custom.c in Sources */, + 72220F0B133305BB00FCA411 /* debug.c in Sources */, + 72220F0C133305BB00FCA411 /* dest.c in Sources */, + 72220F0D133305BB00FCA411 /* dir.c in Sources */, + 72220F0F133305BB00FCA411 /* emit.c in Sources */, + 72220F10133305BB00FCA411 /* encode.c in Sources */, + 72220F12133305BB00FCA411 /* file.c in Sources */, + 72220F14133305BB00FCA411 /* getdevices.c in Sources */, + 72220F15133305BB00FCA411 /* getifaddrs.c in Sources */, + 72220F16133305BB00FCA411 /* getputfile.c in Sources */, + 72220F17133305BB00FCA411 /* globals.c in Sources */, + 72220F18133305BB00FCA411 /* http-addr.c in Sources */, + 72220F19133305BB00FCA411 /* http-addrlist.c in Sources */, + 72220F1B133305BB00FCA411 /* http-support.c in Sources */, + 72220F1C133305BB00FCA411 /* http.c in Sources */, + 72220F1F133305BB00FCA411 /* ipp-support.c in Sources */, + 72220F20133305BB00FCA411 /* ipp.c in Sources */, + 72220F22133305BB00FCA411 /* langprintf.c in Sources */, + 72220F24133305BB00FCA411 /* language.c in Sources */, + 72220F26133305BB00FCA411 /* localize.c in Sources */, + 72220F27133305BB00FCA411 /* mark.c in Sources */, + 72220F29133305BB00FCA411 /* md5.c in Sources */, + 72220F2A133305BB00FCA411 /* md5passwd.c in Sources */, + 72220F2B133305BB00FCA411 /* notify.c in Sources */, + 72220F2C133305BB00FCA411 /* options.c in Sources */, + 72220F2D133305BB00FCA411 /* page.c in Sources */, + 72220F2E133305BB00FCA411 /* ppd-cache.c in Sources */, + 72220F30133305BB00FCA411 /* ppd.c in Sources */, + 72220F32133305BB00FCA411 /* pwg-media.c in Sources */, + 72220F35133305BB00FCA411 /* request.c in Sources */, + 72220F36133305BB00FCA411 /* sidechannel.c in Sources */, + 72220F39133305BB00FCA411 /* snmp.c in Sources */, + 72220F3A133305BB00FCA411 /* snprintf.c in Sources */, + 72220F3C133305BB00FCA411 /* string.c in Sources */, + 72220F3D133305BB00FCA411 /* tempfile.c in Sources */, + 72220F3F133305BB00FCA411 /* thread.c in Sources */, + 72220F40133305BB00FCA411 /* transcode.c in Sources */, + 72220F42133305BB00FCA411 /* usersys.c in Sources */, + 72220F43133305BB00FCA411 /* util.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220F5713330A5A00FCA411 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220F9013330B0C00FCA411 /* auth.c in Sources */, + 72220F9113330B0C00FCA411 /* banners.c in Sources */, + 72220F9213330B0C00FCA411 /* cert.c in Sources */, + 72220F9313330B0C00FCA411 /* classes.c in Sources */, + 72220F9413330B0C00FCA411 /* client.c in Sources */, + 72220F9513330B0C00FCA411 /* conf.c in Sources */, + 72220F9613330B0C00FCA411 /* dirsvc.c in Sources */, + 72220F9713330B0C00FCA411 /* env.c in Sources */, + 72220F9813330B0C00FCA411 /* ipp.c in Sources */, + 72220F9913330B0C00FCA411 /* job.c in Sources */, + 72220F9A13330B0C00FCA411 /* listen.c in Sources */, + 72220F9B13330B0C00FCA411 /* log.c in Sources */, + 72220F9C13330B0C00FCA411 /* main.c in Sources */, + 72220F9D13330B0C00FCA411 /* network.c in Sources */, + 72220F9E13330B0C00FCA411 /* policy.c in Sources */, + 72220F9F13330B0C00FCA411 /* printers.c in Sources */, + 72220FA013330B0C00FCA411 /* process.c in Sources */, + 72220FA113330B0C00FCA411 /* quotas.c in Sources */, + 72220FA313330B0C00FCA411 /* select.c in Sources */, + 72220FA413330B0C00FCA411 /* server.c in Sources */, + 72220FA513330B0C00FCA411 /* statbuf.c in Sources */, + 72220FA613330B0C00FCA411 /* subscriptions.c in Sources */, + 72220FA713330B0C00FCA411 /* sysman.c in Sources */, + 72C16CB9137B195D007E4BF4 /* file.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72220FA813330B2200FCA411 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 72220FB613330BCE00FCA411 /* filter.c in Sources */, + 72220FB713330BCE00FCA411 /* mime.c in Sources */, + 72220FB913330BCE00FCA411 /* type.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724378F91333E43E009631B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7243790D1333E4E3009631B9 /* ipp.c in Sources */, + 7243790E1333E4E3009631B9 /* network.c in Sources */, + 7243790F1333E4E3009631B9 /* snmp-supplies.c in Sources */, + 724379131333E516009631B9 /* runloop.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379141333E532009631B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379221333E928009631B9 /* network.c in Sources */, + 724379231333E928009631B9 /* runloop.c in Sources */, + 724379241333E928009631B9 /* snmp-supplies.c in Sources */, + 724379291333E952009631B9 /* lpd.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7243792C1333FB85009631B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379401333FD4B009631B9 /* network.c in Sources */, + 724379411333FD4B009631B9 /* runloop.c in Sources */, + 724379421333FD4B009631B9 /* snmp-supplies.c in Sources */, + 7243793D1333FD19009631B9 /* socket.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379431333FEA9009631B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379511333FEBB009631B9 /* dnssd.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 724379571333FF1D009631B9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 724379C71333FFC7009631B9 /* usb.c in Sources */, + 724379CB1334000E009631B9 /* ieee1284.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7258EADE134594C4009286F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7258EAED134594EB009286F1 /* rastertopwg.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 726AD6F3135E88F0002C930D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 726AD702135E8A90002C930D /* ippserver.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72F75A4E1336F950004BB496 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 72F75A5C1336F988004BB496 /* cupstestppd.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 72F75A5D1336F9A3004BB496 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 72F75A6C1336FA8A004BB496 /* error.c in Sources */, + 72F75A6D1336FA8A004BB496 /* interpret.c in Sources */, + 72F75A6E1336FA8A004BB496 /* raster.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 270CCDA6135E3C9E00007BE2 /* testmime */; + targetProxy = 270CCDB1135E3CDE00007BE2 /* PBXContainerItemProxy */; + }; + 270CCDB6135E3CF700007BE2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220FAB13330B2200FCA411 /* libcupsmime */; + targetProxy = 270CCDB5135E3CF700007BE2 /* PBXContainerItemProxy */; + }; + 270CCDB8135E3CFD00007BE2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6891333B1C400317ECB /* libcups_static */; + targetProxy = 270CCDB7135E3CFD00007BE2 /* PBXContainerItemProxy */; + }; + 273BF6C91333B5410022CAAB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6891333B1C400317ECB /* libcups_static */; + targetProxy = 273BF6C81333B5410022CAAB /* PBXContainerItemProxy */; + }; + 273BF6DE1333B6370022CAAB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 273BF6BC1333B5000022CAAB /* testcups */; + targetProxy = 273BF6DD1333B6370022CAAB /* PBXContainerItemProxy */; + }; + 274FF5DC13332CF900317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF5DB13332CF900317ECB /* PBXContainerItemProxy */; + }; + 274FF5E313332D4300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF5E213332D4300317ECB /* PBXContainerItemProxy */; + }; + 274FF5E513332D4300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220FAB13330B2200FCA411 /* libcupsmime */; + targetProxy = 274FF5E413332D4300317ECB /* PBXContainerItemProxy */; + }; + 274FF5E713332D4300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220F5A13330A5A00FCA411 /* cupsd */; + targetProxy = 274FF5E613332D4300317ECB /* PBXContainerItemProxy */; + }; + 274FF5E913332D4300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5CB13332B1F00317ECB /* cups-driverd */; + targetProxy = 274FF5E813332D4300317ECB /* PBXContainerItemProxy */; + }; + 274FF5F3133330FD00317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF5F2133330FD00317ECB /* PBXContainerItemProxy */; + }; + 274FF6201333316200317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 274FF61F1333316200317ECB /* PBXContainerItemProxy */; + }; + 274FF622133331D300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 274FF621133331D300317ECB /* PBXContainerItemProxy */; + }; + 274FF6341333335200317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF6331333335200317ECB /* PBXContainerItemProxy */; + }; + 274FF6391333348400317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6281333333600317ECB /* cups-deviced */; + targetProxy = 274FF6381333348400317ECB /* PBXContainerItemProxy */; + }; + 274FF648133335A300317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF63D1333358B00317ECB /* cups-exec */; + targetProxy = 274FF647133335A300317ECB /* PBXContainerItemProxy */; + }; + 274FF65A133339D900317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF659133339D900317ECB /* PBXContainerItemProxy */; + }; + 274FF65E13333A3400317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF64E133339C400317ECB /* cups-lpd */; + targetProxy = 274FF65D13333A3400317ECB /* PBXContainerItemProxy */; + }; + 274FF66D13333AAD00317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF66C13333AAD00317ECB /* PBXContainerItemProxy */; + }; + 274FF67213333AE400317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF66213333A9B00317ECB /* cups-polld */; + targetProxy = 274FF67113333AE400317ECB /* PBXContainerItemProxy */; + }; + 274FF68213333B3C00317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 274FF68113333B3C00317ECB /* PBXContainerItemProxy */; + }; + 274FF68413333B3C00317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220FAB13330B2200FCA411 /* libcupsmime */; + targetProxy = 274FF68313333B3C00317ECB /* PBXContainerItemProxy */; + }; + 274FF6E21333B33F00317ECB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF67713333B2F00317ECB /* cupsfilter */; + targetProxy = 274FF6E11333B33F00317ECB /* PBXContainerItemProxy */; + }; + 276683661337A9D6000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683651337A9D6000D33D0 /* PBXContainerItemProxy */; + }; + 2766836B1337AA25000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2766835B1337A9B6000D33D0 /* cupsctl */; + targetProxy = 2766836A1337AA25000D33D0 /* PBXContainerItemProxy */; + }; + 276683AE1337ACF9000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683AD1337ACF9000D33D0 /* PBXContainerItemProxy */; + }; + 276683B01337ACF9000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 276683AF1337ACF9000D33D0 /* PBXContainerItemProxy */; + }; + 276683B41337AD18000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683B31337AD18000D33D0 /* PBXContainerItemProxy */; + }; + 276683B61337AD18000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 276683B51337AD18000D33D0 /* PBXContainerItemProxy */; + }; + 276683BC1337AE49000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683BB1337AE49000D33D0 /* PBXContainerItemProxy */; + }; + 276683BE1337AE49000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 276683BD1337AE49000D33D0 /* PBXContainerItemProxy */; + }; + 276683C01337B1AD000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683BF1337B1AD000D33D0 /* PBXContainerItemProxy */; + }; + 276683C21337B1AD000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 276683C11337B1AD000D33D0 /* PBXContainerItemProxy */; + }; + 276683C61337B1BC000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683C51337B1BC000D33D0 /* PBXContainerItemProxy */; + }; + 276683C81337B1BC000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF5ED133330C800317ECB /* libcupsppdc */; + targetProxy = 276683C71337B1BC000D33D0 /* PBXContainerItemProxy */; + }; + 276683D71337B24A000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2766836F1337AC79000D33D0 /* ppdc */; + targetProxy = 276683D61337B24A000D33D0 /* PBXContainerItemProxy */; + }; + 276683D91337B24A000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 2766837C1337AC8C000D33D0 /* ppdhtml */; + targetProxy = 276683D81337B24A000D33D0 /* PBXContainerItemProxy */; + }; + 276683DB1337B24A000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 276683891337AC97000D33D0 /* ppdi */; + targetProxy = 276683DA1337B24A000D33D0 /* PBXContainerItemProxy */; + }; + 276683DD1337B24A000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 276683961337ACA2000D33D0 /* ppdmerge */; + targetProxy = 276683DC1337B24A000D33D0 /* PBXContainerItemProxy */; + }; + 276683DF1337B24A000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 276683A31337ACAB000D33D0 /* ppdpo */; + targetProxy = 276683DE1337B24A000D33D0 /* PBXContainerItemProxy */; + }; + 276683E11337B299000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683E01337B299000D33D0 /* PBXContainerItemProxy */; + }; + 276683E41337B2BA000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72F75A601336F9A3004BB496 /* libcupsimage */; + targetProxy = 276683E31337B2BA000D33D0 /* PBXContainerItemProxy */; + }; + 276683FC1337F7B3000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 276683FB1337F7B3000D33D0 /* PBXContainerItemProxy */; + }; + 276683FF1337F7C5000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 276683EF1337F78E000D33D0 /* ipptool */; + targetProxy = 276683FE1337F7C5000D33D0 /* PBXContainerItemProxy */; + }; + 2766840E1337FA31000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 2766840D1337FA31000D33D0 /* PBXContainerItemProxy */; + }; + 276684131337FA8D000D33D0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 276684031337FA1D000D33D0 /* cupsaddsmb */; + targetProxy = 276684121337FA8D000D33D0 /* PBXContainerItemProxy */; + }; + 278C58D6136B641D00836530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 278C58CA136B640300836530 /* testhttp */; + targetProxy = 278C58D5136B641D00836530 /* PBXContainerItemProxy */; + }; + 278C58D8136B642F00836530 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6891333B1C400317ECB /* libcups_static */; + targetProxy = 278C58D7136B642F00836530 /* PBXContainerItemProxy */; + }; + 720DD6CF1358FD790064AA82 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */; + }; + 720DD6D11358FDBE0064AA82 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 720DD6C11358FD5F0064AA82 /* snmp */; + targetProxy = 720DD6D01358FDBE0064AA82 /* PBXContainerItemProxy */; + }; + 72220F6513330A6500FCA411 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 72220F6413330A6500FCA411 /* PBXContainerItemProxy */; + }; + 72220FBC13330C0500FCA411 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 72220FBB13330C0500FCA411 /* PBXContainerItemProxy */; + }; + 72220FBE13330C0B00FCA411 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220FAB13330B2200FCA411 /* libcupsmime */; + targetProxy = 72220FBD13330C0B00FCA411 /* PBXContainerItemProxy */; + }; + 724379071333E49B009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 724379061333E49B009631B9 /* PBXContainerItemProxy */; + }; + 724379111333E4EA009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 724378FC1333E43E009631B9 /* ipp */; + targetProxy = 724379101333E4EA009631B9 /* PBXContainerItemProxy */; + }; + 724379261333E932009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 724379251333E932009631B9 /* PBXContainerItemProxy */; + }; + 7243792B1333E962009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 724379171333E532009631B9 /* lpd */; + targetProxy = 7243792A1333E962009631B9 /* PBXContainerItemProxy */; + }; + 7243793A1333FB95009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 724379391333FB95009631B9 /* PBXContainerItemProxy */; + }; + 7243793F1333FD23009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7243792F1333FB85009631B9 /* socket */; + targetProxy = 7243793E1333FD23009631B9 /* PBXContainerItemProxy */; + }; + 724379531333FECE009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 724379461333FEA9009631B9 /* dnssd */; + targetProxy = 724379521333FECE009631B9 /* PBXContainerItemProxy */; + }; + 724379551333FEFE009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 724379541333FEFE009631B9 /* PBXContainerItemProxy */; + }; + 724379651333FF2E009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 724379641333FF2E009631B9 /* PBXContainerItemProxy */; + }; + 724379C31333FF7D009631B9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7243795A1333FF1D009631B9 /* usb */; + targetProxy = 724379C21333FF7D009631B9 /* PBXContainerItemProxy */; + }; + 7258EAEF13459ADA009286F1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 7258EAE1134594C4009286F1 /* rastertopwg */; + targetProxy = 7258EAEE13459ADA009286F1 /* PBXContainerItemProxy */; + }; + 7258EAF113459B67009286F1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 7258EAF013459B67009286F1 /* PBXContainerItemProxy */; + }; + 7258EAF313459B67009286F1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72F75A601336F9A3004BB496 /* libcupsimage */; + targetProxy = 7258EAF213459B67009286F1 /* PBXContainerItemProxy */; + }; + 726AD704135E8AA1002C930D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 726AD6F6135E88F0002C930D /* ippserver */; + targetProxy = 726AD703135E8AA1002C930D /* PBXContainerItemProxy */; + }; + 726AD706135E8AC5002C930D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 274FF6891333B1C400317ECB /* libcups_static */; + targetProxy = 726AD705135E8AC5002C930D /* PBXContainerItemProxy */; + }; + 72F75A661336FA30004BB496 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72220EAD1333047D00FCA411 /* libcups */; + targetProxy = 72F75A651336FA30004BB496 /* PBXContainerItemProxy */; + }; + 72F75A711336FACD004BB496 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72F75A601336F9A3004BB496 /* libcupsimage */; + targetProxy = 72F75A701336FACD004BB496 /* PBXContainerItemProxy */; + }; + 72F75A731336FACD004BB496 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 72F75A511336F950004BB496 /* cupstestppd */; + targetProxy = 72F75A721336FACD004BB496 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 270CCDAD135E3C9E00007BE2 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 270CCDAE135E3C9E00007BE2 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 273BF6C41333B5000022CAAB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 273BF6C51333B5000022CAAB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 273BF6DB1333B6270022CAAB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 273BF6DC1333B6270022CAAB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF5D313332B1F00317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF5D413332B1F00317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF5E013332D3100317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF5E113332D3100317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF5F0133330C800317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + }; + name = Debug; + }; + 274FF5F1133330C800317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + }; + name = Release; + }; + 274FF6301333333600317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF6311333333600317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF6451333358C00317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF6461333358C00317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF656133339C400317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF657133339C400317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF66A13333A9B00317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF66B13333A9B00317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/daemon; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF67F13333B2F00317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 274FF68013333B2F00317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 274FF6DE1333B1C400317ECB /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_EXTENSION = a; + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/local/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = libcups_static; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; + }; + name = Debug; + }; + 274FF6DF1333B1C400317ECB /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_EXTENSION = a; + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/local/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = libcups_static; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + STANDARD_C_PLUS_PLUS_LIBRARY_TYPE = static; + }; + name = Release; + }; + 276683631337A9B6000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683641337A9B6000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 276683771337AC79000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683781337AC79000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 276683841337AC8C000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683851337AC8C000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 276683911337AC97000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683921337AC97000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 2766839E1337ACA2000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 2766839F1337ACA2000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 276683AB1337ACAB000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683AC1337ACAB000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 276683F71337F78F000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 276683F81337F78F000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 2766840B1337FA1E000D33D0 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 2766840C1337FA1E000D33D0 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 278C58D1136B640300836530 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 278C58D2136B640300836530 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 720DD6C91358FD5F0064AA82 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 720DD6CA1358FD5F0064AA82 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 72220EB01333047D00FCA411 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + }; + name = Debug; + }; + 72220EB11333047D00FCA411 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/cups; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = /usr/include/cups; + }; + name = Release; + }; + 72220F6213330A5A00FCA411 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 72220F6313330A5A00FCA411 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/sbin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 72220FAE13330B2300FCA411 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 72220FAF13330B2300FCA411 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 724379041333E43E009631B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_MODE_FLAG = "u+rwX,go-rwX"; + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 724379051333E43E009631B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_MODE_FLAG = "u+rwX,go-rwX"; + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 7243791F1333E532009631B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 724379201333E532009631B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 724379371333FB85009631B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 724379381333FB85009631B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 7243794E1333FEA9009631B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 7243794F1333FEA9009631B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 724379621333FF1D009631B9 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 724379631333FF1D009631B9 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/backend; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 7258EAEA134594C4009286F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/filter; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 7258EAEB134594C4009286F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/libexec/cups/filter; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 726AD6FF135E88F1002C930D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 726AD700135E88F1002C930D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 72BF963C1333042100B1EAD7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(NATIVE_ARCH_ACTUAL)"; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + ., + .., + ); + OTHER_CFLAGS = ( + "-D_CUPS_SOURCE", + "-Wno-shorten-64-to-32", + ); + }; + name = Debug; + }; + 72BF963D1333042100B1EAD7 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + ., + .., + ); + OTHER_CFLAGS = ( + "-D_CUPS_SOURCE", + "-Wno-shorten-64-to-32", + ); + }; + name = Release; + }; + 72F75A591336F951004BB496 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 72F75A5A1336F951004BB496 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + INSTALL_PATH = /usr/bin; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 72F75A631336F9A3004BB496 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 72F75A641336F9A3004BB496 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = ""; + INSTALL_PATH = /usr/lib; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 270CCDAF135E3C9E00007BE2 /* Build configuration list for PBXNativeTarget "testmime" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 270CCDAD135E3C9E00007BE2 /* Debug */, + 270CCDAE135E3C9E00007BE2 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 273BF6C31333B5000022CAAB /* Build configuration list for PBXNativeTarget "testcups" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 273BF6C41333B5000022CAAB /* Debug */, + 273BF6C51333B5000022CAAB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 273BF6DA1333B6270022CAAB /* Build configuration list for PBXAggregateTarget "Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 273BF6DB1333B6270022CAAB /* Debug */, + 273BF6DC1333B6270022CAAB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF5D213332B1F00317ECB /* Build configuration list for PBXNativeTarget "cups-driverd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF5D313332B1F00317ECB /* Debug */, + 274FF5D413332B1F00317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF5DF13332D3100317ECB /* Build configuration list for PBXAggregateTarget "All" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF5E013332D3100317ECB /* Debug */, + 274FF5E113332D3100317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF5EF133330C800317ECB /* Build configuration list for PBXNativeTarget "libcupsppdc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF5F0133330C800317ECB /* Debug */, + 274FF5F1133330C800317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF62F1333333600317ECB /* Build configuration list for PBXNativeTarget "cups-deviced" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF6301333333600317ECB /* Debug */, + 274FF6311333333600317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF6441333358C00317ECB /* Build configuration list for PBXNativeTarget "cups-exec" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF6451333358C00317ECB /* Debug */, + 274FF6461333358C00317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF655133339C400317ECB /* Build configuration list for PBXNativeTarget "cups-lpd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF656133339C400317ECB /* Debug */, + 274FF657133339C400317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF66913333A9B00317ECB /* Build configuration list for PBXNativeTarget "cups-polld" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF66A13333A9B00317ECB /* Debug */, + 274FF66B13333A9B00317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF67E13333B2F00317ECB /* Build configuration list for PBXNativeTarget "cupsfilter" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF67F13333B2F00317ECB /* Debug */, + 274FF68013333B2F00317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 274FF6DD1333B1C400317ECB /* Build configuration list for PBXNativeTarget "libcups_static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 274FF6DE1333B1C400317ECB /* Debug */, + 274FF6DF1333B1C400317ECB /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683621337A9B6000D33D0 /* Build configuration list for PBXNativeTarget "cupsctl" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683631337A9B6000D33D0 /* Debug */, + 276683641337A9B6000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683761337AC79000D33D0 /* Build configuration list for PBXNativeTarget "ppdc" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683771337AC79000D33D0 /* Debug */, + 276683781337AC79000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683831337AC8C000D33D0 /* Build configuration list for PBXNativeTarget "ppdhtml" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683841337AC8C000D33D0 /* Debug */, + 276683851337AC8C000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683901337AC97000D33D0 /* Build configuration list for PBXNativeTarget "ppdi" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683911337AC97000D33D0 /* Debug */, + 276683921337AC97000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2766839D1337ACA2000D33D0 /* Build configuration list for PBXNativeTarget "ppdmerge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2766839E1337ACA2000D33D0 /* Debug */, + 2766839F1337ACA2000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683AA1337ACAB000D33D0 /* Build configuration list for PBXNativeTarget "ppdpo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683AB1337ACAB000D33D0 /* Debug */, + 276683AC1337ACAB000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 276683F61337F78F000D33D0 /* Build configuration list for PBXNativeTarget "ipptool" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 276683F71337F78F000D33D0 /* Debug */, + 276683F81337F78F000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2766840A1337FA1E000D33D0 /* Build configuration list for PBXNativeTarget "cupsaddsmb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2766840B1337FA1E000D33D0 /* Debug */, + 2766840C1337FA1E000D33D0 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 278C58D1136B640300836530 /* Debug */, + 278C58D2136B640300836530 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 720DD6C91358FD5F0064AA82 /* Debug */, + 720DD6CA1358FD5F0064AA82 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72220EB21333047D00FCA411 /* Build configuration list for PBXNativeTarget "libcups" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72220EB01333047D00FCA411 /* Debug */, + 72220EB11333047D00FCA411 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72220F6113330A5A00FCA411 /* Build configuration list for PBXNativeTarget "cupsd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72220F6213330A5A00FCA411 /* Debug */, + 72220F6313330A5A00FCA411 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72220FAD13330B2300FCA411 /* Build configuration list for PBXNativeTarget "libcupsmime" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72220FAE13330B2300FCA411 /* Debug */, + 72220FAF13330B2300FCA411 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 724379031333E43E009631B9 /* Build configuration list for PBXNativeTarget "ipp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 724379041333E43E009631B9 /* Debug */, + 724379051333E43E009631B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7243791E1333E532009631B9 /* Build configuration list for PBXNativeTarget "lpd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7243791F1333E532009631B9 /* Debug */, + 724379201333E532009631B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 724379361333FB85009631B9 /* Build configuration list for PBXNativeTarget "socket" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 724379371333FB85009631B9 /* Debug */, + 724379381333FB85009631B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7243794D1333FEA9009631B9 /* Build configuration list for PBXNativeTarget "dnssd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7243794E1333FEA9009631B9 /* Debug */, + 7243794F1333FEA9009631B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 724379611333FF1D009631B9 /* Build configuration list for PBXNativeTarget "usb" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 724379621333FF1D009631B9 /* Debug */, + 724379631333FF1D009631B9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7258EAE9134594C4009286F1 /* Build configuration list for PBXNativeTarget "rastertopwg" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7258EAEA134594C4009286F1 /* Debug */, + 7258EAEB134594C4009286F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 726AD6FE135E88F1002C930D /* Build configuration list for PBXNativeTarget "ippserver" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 726AD6FF135E88F1002C930D /* Debug */, + 726AD700135E88F1002C930D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72BF963C1333042100B1EAD7 /* Debug */, + 72BF963D1333042100B1EAD7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72F75A581336F951004BB496 /* Build configuration list for PBXNativeTarget "cupstestppd" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72F75A591336F951004BB496 /* Debug */, + 72F75A5A1336F951004BB496 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 72F75A621336F9A3004BB496 /* Build configuration list for PBXNativeTarget "libcupsimage" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 72F75A631336F9A3004BB496 /* Debug */, + 72F75A641336F9A3004BB496 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 72BF96371333042100B1EAD7 /* Project object */; +} diff --git a/xcode/config.h b/xcode/config.h new file mode 100644 index 0000000..8096052 --- /dev/null +++ b/xcode/config.h @@ -0,0 +1,736 @@ +/* config.h. Generated from config.h.in by configure. */ +/* + * "$Id: config.h 9793 2011-05-20 03:49:49Z mike $" + * + * Configuration file for CUPS. + * + * Copyright 2007-2011 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_CONFIG_H_ +#define _CUPS_CONFIG_H_ + +/* + * Version of software... + */ + +#define CUPS_SVERSION "CUPS v1.5.0" +#define CUPS_MINIMAL "CUPS/1.5.0" + + +/* + * Default user and groups... + */ + +#define CUPS_DEFAULT_USER "_lp" +#define CUPS_DEFAULT_GROUP "_lp" +#define CUPS_DEFAULT_SYSTEM_GROUPS "admin" +#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@AUTHKEY(system.print.operator) @admin @lpadmin" + + +/* + * Default file permissions... + */ + +#define CUPS_DEFAULT_CONFIG_FILE_PERM 0644 +#define CUPS_DEFAULT_LOG_FILE_PERM 0644 + + +/* + * Default logging settings... + */ + +#define CUPS_DEFAULT_LOG_LEVEL "warn" +#define CUPS_DEFAULT_ACCESS_LOG_LEVEL "actions" + + +/* + * Default fatal error settings... + */ + +#define CUPS_DEFAULT_FATAL_ERRORS "config" + + +/* + * Default browsing settings... + */ + +#define CUPS_DEFAULT_BROWSING 1 +#define CUPS_DEFAULT_BROWSE_LOCAL_PROTOCOLS "CUPS dnssd" +#define CUPS_DEFAULT_BROWSE_REMOTE_PROTOCOLS "" +#define CUPS_DEFAULT_BROWSE_SHORT_NAMES 1 +#define CUPS_DEFAULT_DEFAULT_SHARED 1 +#define CUPS_DEFAULT_IMPLICIT_CLASSES 1 +#define CUPS_DEFAULT_USE_NETWORK_DEFAULT 0 + + +/* + * Default IPP port... + */ + +#define CUPS_DEFAULT_IPP_PORT 631 + + +/* + * Default printcap file... + */ + +#define CUPS_DEFAULT_PRINTCAP "/Library/Preferences/org.cups.printers.plist" + + +/* + * Default Samba and LPD config files... + */ + +#define CUPS_DEFAULT_SMB_CONFIG_FILE "" +#define CUPS_DEFAULT_LPD_CONFIG_FILE "launchd:///System/Library/LaunchDaemons/org.cups.cups-lpd.plist" + + +/* + * Default MaxCopies value... + */ + +#define CUPS_DEFAULT_MAX_COPIES 9999 + + +/* + * Do we have domain socket support, and if so what is the default one? + */ + +#define CUPS_DEFAULT_DOMAINSOCKET "/private/var/run/cupsd" + + +/* + * Default WebInterface value... + */ + +#define CUPS_DEFAULT_WEBIF 0 + + +/* + * Where are files stored? + * + * Note: These are defaults, which can be overridden by environment + * variables at run-time... + */ + +#define CUPS_BINDIR "/usr/bin" +#define CUPS_CACHEDIR "/private/var/spool/cups/cache" +#define CUPS_DATADIR "/usr/share/cups" +#define CUPS_DOCROOT "/usr/share/doc/cups" +#define CUPS_FONTPATH "/usr/share/cups/fonts" +#define CUPS_LOCALEDIR "/usr/share/locale" +#define CUPS_LOGDIR "/private/var/log/cups" +#define CUPS_REQUESTS "/private/var/spool/cups" +#define CUPS_SBINDIR "/usr/sbin" +#define CUPS_SERVERBIN "/usr/libexec/cups" +#define CUPS_SERVERROOT "/private/etc/cups" +#define CUPS_STATEDIR "/private/etc/cups" + + +/* + * Do we have various image libraries? + */ + +/* #undef HAVE_LIBPNG */ +#define HAVE_LIBZ 1 +/* #undef HAVE_LIBJPEG */ +/* #undef HAVE_LIBTIFF */ + + +/* + * Do we have PAM stuff? + */ + +#ifndef HAVE_LIBPAM +#define HAVE_LIBPAM 1 +#endif /* !HAVE_LIBPAM */ + +/* #undef HAVE_PAM_PAM_APPL_H */ +#define HAVE_PAM_SET_ITEM 1 +#define HAVE_PAM_SETCRED 1 + + +/* + * Do we have ? + */ + +/* #undef HAVE_SHADOW_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_CRYPT_H */ + + +/* + * Do we have ? + */ + +/* #undef HAVE_SCSI_SG_H */ + + +/* + * Use , , and/or ? + */ + +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +/* #undef HAVE_BSTRING_H */ + +/* + * Do we have the long long type? + */ + +#define HAVE_LONG_LONG 1 + +#ifdef HAVE_LONG_LONG +# define CUPS_LLFMT "%lld" +# define CUPS_LLCAST (long long) +#else +# define CUPS_LLFMT "%ld" +# define CUPS_LLCAST (long) +#endif /* HAVE_LONG_LONG */ + +/* + * Do we have the strtoll() function? + */ + +#define HAVE_STRTOLL 1 + +#ifndef HAVE_STRTOLL +# define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) +#endif /* !HAVE_STRTOLL */ + +/* + * Do we have the strXXX() functions? + */ + +#define HAVE_STRDUP 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRLCPY 1 + + +/* + * Do we have the geteuid() function? + */ + +#define HAVE_GETEUID 1 + + +/* + * Do we have the setpgid() function? + */ + +#define HAVE_SETPGID 1 + + +/* + * Do we have the vsyslog() function? + */ + +#define HAVE_VSYSLOG 1 + + +/* + * Do we have the (v)snprintf() functions? + */ + +#define HAVE_SNPRINTF 1 +#define HAVE_VSNPRINTF 1 + + +/* + * What signal functions to use? + */ + +#define HAVE_SIGSET 1 +#define HAVE_SIGACTION 1 + + +/* + * What wait functions to use? + */ + +#define HAVE_WAITPID 1 +#define HAVE_WAIT3 1 + + +/* + * Do we have the mallinfo function and malloc.h? + */ + +/* #undef HAVE_MALLINFO */ +/* #undef HAVE_MALLOC_H */ + + +/* + * Do we have the POSIX ACL functions? + */ + +#define HAVE_ACL_INIT 1 + + +/* + * Do we have the langinfo.h header file? + */ + +#define HAVE_LANGINFO_H 1 + + +/* + * Which encryption libraries do we have? + */ + +#define HAVE_CDSASSL 1 +/* #undef HAVE_GNUTLS */ +/* #undef HAVE_LIBSSL */ +#define HAVE_SSL 1 + + +/* + * What Security framework headers do we have? + */ + +#define HAVE_AUTHORIZATION_H 1 +#define HAVE_SECCERTIFICATE_H 1 +#define HAVE_SECITEM_H 1 +/* #undef HAVE_SECITEMPRIV_H */ +#define HAVE_SECPOLICY_H 1 +/* #undef HAVE_SECPOLICYPRIV_H */ +/* #undef HAVE_SECBASEPRIV_H */ +/* #undef HAVE_SECIDENTITYSEARCHPRIV_H */ + + +/* + * Do we have the SecCertificateCopyData function? + */ + +#define HAVE_SECCERTIFICATECOPYDATA 1 + + +/* + * Do we have the SecIdentitySearchCreateWithPolicy function? + */ + +#define HAVE_SECIDENTITYSEARCHCREATEWITHPOLICY 1 + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +#define HAVE_SECPOLICYCREATESSL 1 + + +/* + * Do we have the SecPolicyCreateSSL function? + */ + +#define HAVE_SECPOLICYCREATESSL 1 + + +/* + * Do we have the cssmErrorString function? + */ + +#define HAVE_CSSMERRORSTRING 1 + + +/* + * Do we have the SLP library? + */ + +/* #undef HAVE_LIBSLP */ + + +/* + * Do we have an LDAP library? + */ + +#define HAVE_LDAP 1 +#define HAVE_OPENLDAP 1 +/* #undef HAVE_MOZILLA_LDAP */ +/* #undef HAVE_LDAP_SSL_H */ +/* #undef HAVE_LDAP_SSL */ +#define HAVE_LDAP_REBIND_PROC 1 + + +/* + * Do we have libpaper? + */ + +/* #undef HAVE_LIBPAPER */ + + +/* + * Do we have DNS Service Discovery (aka Bonjour)? + */ + +#define HAVE_DNSSD 1 + + +/* + * Do we have ? + */ + +#define HAVE_SYS_IOCTL_H 1 + + +/* + * Does the "stat" structure contain the "st_gen" member? + */ + +#define HAVE_ST_GEN 1 + + +/* + * Does the "tm" structure contain the "tm_gmtoff" member? + */ + +#define HAVE_TM_GMTOFF 1 + + +/* + * Do we have rresvport_af()? + */ + +#define HAVE_RRESVPORT_AF 1 + + +/* + * Do we have getaddrinfo()? + */ + +#define HAVE_GETADDRINFO 1 + + +/* + * Do we have getnameinfo()? + */ + +#define HAVE_GETNAMEINFO 1 + + +/* + * Do we have getifaddrs()? + */ + +#define HAVE_GETIFADDRS 1 + + +/* + * Do we have hstrerror()? + */ + +#define HAVE_HSTRERROR 1 + + +/* + * Do we have res_init()? + */ + +#define HAVE_RES_INIT 1 + + +/* + * Do we have + */ + +#define HAVE_RESOLV_H 1 + + +/* + * Do we have the header file? + */ + +#define HAVE_SYS_SOCKIO_H 1 + + +/* + * Does the sockaddr structure contain an sa_len parameter? + */ + +/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */ + + +/* + * Do we have the AIX usersec.h header file? + */ + +/* #undef HAVE_USERSEC_H */ + + +/* + * Do we have pthread support? + */ + +#define HAVE_PTHREAD_H 1 + + +/* + * Do we have launchd support? + */ + +#define HAVE_LAUNCH_H 1 +#define HAVE_LAUNCHD 1 + + +/* + * Various scripting languages... + */ + +#define HAVE_JAVA 1 +#define CUPS_JAVA "/usr/bin/java" +#define HAVE_PERL 1 +#define CUPS_PERL "/usr/bin/perl" +#define HAVE_PHP 1 +#define CUPS_PHP "/usr/bin/php" +#define HAVE_PYTHON 1 +#define CUPS_PYTHON "/usr/bin/python" + + +/* + * Location of the poppler/Xpdf pdftops program... + */ + +/* #undef HAVE_PDFTOPS */ +#define CUPS_PDFTOPS "" + + +/* + * Location of the Ghostscript gs program... + */ + +/* #undef HAVE_GHOSTSCRIPT */ +#define CUPS_GHOSTSCRIPT "" + + +/* + * Do we have Darwin's CoreFoundation and SystemConfiguration frameworks? + */ + +#define HAVE_COREFOUNDATION 1 +#define HAVE_SYSTEMCONFIGURATION 1 + + +/* + * Do we have CoreFoundation public and private headers? + */ + +#define HAVE_COREFOUNDATION_H 1 +/* #undef HAVE_CFPRIV_H */ +/* #undef HAVE_CFBUNDLEPRIV_H */ + + +/* + * Do we have ApplicationServices public headers? + */ + +#define HAVE_APPLICATIONSERVICES_H 1 + + +/* + * Do we have the SCDynamicStoreCopyComputerName function? + */ + +#define HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME 1 + + +/* + * Do we have MacOSX 10.4's mbr_XXX functions? + */ + +#define HAVE_MEMBERSHIP_H 1 +/* #undef HAVE_MEMBERSHIPPRIV_H */ +#define HAVE_MBR_UID_TO_UUID 1 + + +/* + * Do we have Darwin's notify_post header and function? + */ + +#define HAVE_NOTIFY_H 1 +#define HAVE_NOTIFY_POST 1 + + +/* + * Do we have DBUS? + */ + +/* #undef HAVE_DBUS */ +/* #undef HAVE_DBUS_MESSAGE_ITER_INIT_APPEND */ + + +/* + * Do we have the AppleTalk/at_proto.h header? + */ + +/* #undef HAVE_APPLETALK_AT_PROTO_H */ + + +/* + * Do we have the GSSAPI support library (for Kerberos support)? + */ + +/* #undef HAVE_GSS_ACQUIRE_CRED_EX_F */ +#define HAVE_GSS_C_NT_HOSTBASED_SERVICE 1 +/* #undef HAVE_GSS_GSSAPI_H */ +/* #undef HAVE_GSS_GSSAPI_SPI_H */ +#define HAVE_GSSAPI 1 +#define HAVE_GSSAPI_H 1 +#define HAVE_GSSAPI_GSSAPI_H 1 +#define HAVE_GSSAPI_GSSAPI_GENERIC_H 1 +#define HAVE_GSSAPI_GSSAPI_KRB5_H 1 +#define HAVE_KRB5_H 1 + + +/* + * Default GSS service name... + */ + +#define CUPS_DEFAULT_GSSSERVICENAME "host" + + +/* + * Select/poll interfaces... + */ + +#define HAVE_POLL 1 +/* #undef HAVE_EPOLL */ +#define HAVE_KQUEUE 1 + + +/* + * Do we have the header? + */ + +#define HAVE_DLFCN_H 1 + + +/* + * Do we have ? + */ + +#define HAVE_SYS_PARAM_H 1 + + +/* + * Do we have ? + */ + +#define HAVE_SYS_UCRED_H 1 + + +/* + * Do we have removefile()? + */ + +#define HAVE_REMOVEFILE 1 + + +/* + * Do we have ? + */ + +#define HAVE_SANDBOX_H 1 + + +/* + * Which random number generator function to use... + */ + +#define HAVE_ARC4RANDOM 1 +#define HAVE_RANDOM 1 +#define HAVE_LRAND48 1 + +#ifdef HAVE_ARC4RANDOM +# define CUPS_RAND() arc4random() +# define CUPS_SRAND(v) arc4random_stir() +#elif defined(HAVE_RANDOM) +# define CUPS_RAND() random() +# define CUPS_SRAND(v) srandom(v) +#elif defined(HAVE_LRAND48) +# define CUPS_RAND() lrand48() +# define CUPS_SRAND(v) srand48(v) +#else +# define CUPS_RAND() rand() +# define CUPS_SRAND(v) srand(v) +#endif /* HAVE_ARC4RANDOM */ + + +/* + * Do we have vproc_transaction_begin/end? + */ + +#define HAVE_VPROC_TRANSACTION_BEGIN 1 + + +/* + * Do we have libusb? + */ + +/* #undef HAVE_USB_H */ + + +/* + * Do we have libwrap and tcpd.h? + */ + +/* #undef HAVE_TCPD_H */ + + +/* + * Do we have ? + */ + +#define HAVE_ICONV_H 1 + + +/* + * Do we have statfs or statvfs and one of the corresponding headers? + */ + +#define HAVE_STATFS 1 +#define HAVE_STATVFS 1 +#define HAVE_SYS_MOUNT_H 1 +/* #undef HAVE_SYS_STATFS_H */ +#define HAVE_SYS_STATVFS_H 1 +/* #undef HAVE_SYS_VFS_H */ + + +/* + * Location of Mac OS X localization bundle, if any. + */ + +#define CUPS_BUNDLEDIR "/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/PrintCore.framework/Versions/A" + + +/* + * Do we have the ColorSyncRegisterDevice function? + */ + +#define HAVE_COLORSYNCREGISTERDEVICE 1 + + +/* + * Do we have XPC? + */ + +/* #undef HAVE_XPC */ + + +#endif /* !_CUPS_CONFIG_H_ */ + +/* + * End of "$Id: config.h 9793 2011-05-20 03:49:49Z mike $". + */ -- 2.7.4

    2. hE1Jus1 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�pXWll(akDoewdL!e!1N!75dvraU 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 z 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

    q~j2dVE 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%0DhKD~@Y>TZ%lkHI zXgOfyO6c0RJg&kwtid5yba2MRDvqerFIk*pvEL)@c^+*{dp)ej#M4sK(|0!H;t;&L zHPe`7sZH)tyD5OB?z4S>F*X3!eeaHH(v&u&6bs2#!h5cKf}h)XLI*8i$gKt zj-(v%^h`>h6v1ouE5C{e%cPUQYtx*A&n{992_RMMg>_z`u;L`We!CmYr&JrwktZRI z66#s%@IFNP40np-|KsSq1F8Q1FMjVul&lhET~uUOiXyHR`dFo`WMyV2+1x7$AuB86 zDv6SjnRz9%aLux>Et`9}?&Z3#-~0Rf%YWwk?e%&-&pD6NL&cT=V}M(v*?7QR>B|dv zD%vlSg0@=}q;XIyf1kT^gp0SSbM&u`PeBE0rnwLBCb5k23Pa*dB8wWY8ecfF9@gqQ z!IuhFA1a@td)0WYSIL8Cdmw@C931}T0b%ge)zPPH+qfW|@3k^TZ};KGGmTXyN><7$ z7OE1mORSaBOoJ=O=NPMC13Ov{(mVpOlqii&IJODzbx~*i)W1I0GJ_Xhtu%FBi^;g} z#~yFmEunef5@nJb{CJA^*_#Az$9FTC-QPbY*K}uC>`9{^f=V7?-)lWQFL2O`gl18V z|8ZNb38<{fQV4}SDe8B7!E+fk@g^FyLq@M%{_1xbq|D;^Y#K!Ry<+qmrkturp#WMD z35_flBr9L@NjLmK!*`=}7q_mnF@BAJPpGws6;o~A%%M(;nMvhd(9Q&Mu|q|PWq4js z*{t_)b`_4k~u09H=3pBHi zpvirv{cevOnhOz8{OJ^$h?cyWsjq**rHmJ4+Wz5Xfcve?jGm9q#JWK4V+BKJwA2U$wP*d(Ik31%=N~f~R9_7fG{1?kx zczn18FjsNCv6EEg`|2ED(Qp9d}NM$zvt>2QPk#Y~{S0B=Ti=ZneaFQUbW)_S} z!R=;}z2(5MoGF;P+B8$K=*7aH_drT*%dHbW3>E%wg`QvUUW~M=YX01M6*bMq zkpiu9;vX(3m5kKwD@z%y?m0~v#y-XMhKxFmRE<3sG-SYu8LQ3-+b%MDG$ux5Zy=xh zwM`1%Rmrosn?sw)qKJs0mq1=*DdKEa$g8x6C$3d+=Uw|t;w1@4hRlVWNI~6KNk@2| zKmOHg_D~;zvp8EGllWMg=@Oza6YrhDs0(kffVpdn1{PcF=8$(nX#y{9vwSrbQI>wA zEcZt6w88m2CKs7r0lsHLNuR0xU8==y&DW`lR{-)!7RPl1ch-N?cC5ufv4)=u{s=<< z@e=L=TxkuAv}M8AKb1Rjop7_Qjo46U0!2FJuv6U?%~SQwkv27sZne+7%5s9`)0?nN z>|GMQ7ZB#>TaKwWD2ooV(9Xh(J=WYd5`iQ?eVAsn1PFa-bLcLVQu{RFi?YVbR#zDn z7xaiD1#I$wPa(d+rFG3WzP=sdUCbelbv$`e5Kv)$DOp=M>td?N9!`?$oWVSO-4#@GUoO#zdy6e6xAM%53)fZ((-t6E>|M)O$AF=(76=h<;)K~A9GSJ(Z}|h zvw_7Co{IfIA<*Q=ZpXv(bC(a$xQW6|C%XTZw+zgJ$*QHzeNM)7F2IGY8kqIni5n=nwS#8&_JUy zg=EMUhBE^@WUIIuZwn7ozg$TDIMus4hJCJ7e>XU={;q1KvQ!@rX^6UhAqnl2 ztOZ4*Zyj4M{?IueXU*b*?dHu)tfp{Yf*U@{0-|HUZ|jGbm)_Rtoo z<|r$2fju&aq&&3&bqiBbb1O_Eis(#8_zzhId0A96hUaiSy73kI~bGFdppHNF&~8DELl)RNWdFb>Mqg~V^a zu-zzY5=u8%TdgDiaSOPKzYs}5t>uc*Yd=FMiKo(@XPK@X>FT3+MiNZ!=PjX6Owp)K zAQ(=<84Z!F81DlAp-9^buCB_9rTb72oY8@?YA~D!GYq6WdO*Dl7YSXmF8-w!xd%;; zp`D*o>-HEDafFX~baBR>6S&(y781T+kXT97dX$_|i#nI+*!o%ndR16x=zGHAU#7Bq zHR!eJtQ_gFyCdV(P(9=SjMPn2PV^`;@WXKw0e=uM$`D|Smu6|6-UzFkQvbdE?Zq7W zh#qo=j*~DsvXSiJ_PJlzqotr?xPawzCMMkO{Lq*Ev z)|i~y%4_@V66Mu{-y6oeUZ^$v{c=A=xZG8#pG%mjQ7jj)zv*{;A}{C^WBHN)`0@-? zEu3hbcdP;y8crDHyIlQ0-yK}^r<><7q5G$Qj1uGOs)fo5*!rW`v8l_oJMdGlYa|_f z&iHa_^to~hGwG^@@H4g;RJJ&(Gj8XY!i6vsl3$M)n}0uSx0@aN%IFsw*FN5%9+8)6 zS5_kH3TA_Mr7DH9D8ZqG^{OtT<4M6K;0?5ffEGl#Ly&q zfQ6#S*1J9>v7wrskB+yVh;rT4gP)lZ#dtFEeSF|g@27%&qBEU&7)))W-mikq)iv9R z#|nr89L1)#b*O~3xfs;3v=lDpMKzC~uMylEYye$>3GmajgaaFOnwKDpx$Yvey!$To zbP@R31_mE+(vg=s?tz5t0+aOi?zO>_%b@eusWA<7kw zMo7I0>e1G;Nlh7E@!ufn6dmRq**!EFa7ErH*_h{kMEh{do&SzaF#KUH{{^lUsO{i? z(bu1%Y>7scJB#=~f%(&63fs;^X00t*3EI}PU6?H5Y*=BNQCd+~-r&}UM8&JG8vT5L zavk~aE%(117S)C} zI?BC4O1u?r6FCQd2}zIEne3T+H$>d{)p#zi;@TL@X!768_B?}L9dU;7shMLAAZpaR zaQxsxWz~ak*Mmz8gg!B`kRL7$2lC@_WsI#cF@_3Yx6;H-zwQN_9bjY~aK9^Os*Wk$FwogbH~y zeN_2XWD3QcPr(~pg*6y2gUWq`!XM=sbcMuj84XvbN5egD0e;6b@HD(=o+-8RxifqL zSKDcS_-3>%<{ICcVCsv_rD1P>&*oy-{6;nT;Nah?E0}xS5YlX|WTh(6^Zrp!VQ1ye zfbWBD8glQXjsP(T%`Em6txm@{fUV2DAhZvr+H2WrL<*s}X;A5fF5nf_}^?AAS-pOf&j` zP(IY&4FXU2URt7g{nfnz4tuY{NKx)5)OwAa=A<()7=TWgmm@LTUi%p|KrUy^pq+aJS)6eON4UL}p!pRa=x8aV z<79hna{E$Qhs5h*9+{>Zz9~4Bze91k_T`qU(3_X3v;E$eAkgfkBf1^u$u}>5+Ur6u zPO@RRIb(LZ!ar`^P@9_pjbhFQAs4JLJY3t0cYaf7y1BCuv+{6{jzU>_sL^9Vv$pMHc` zZ>~@a%!nypL3>L}Y?7T1VXkU*kJh$Uu;MRO$>zpdrkGCntjNa&KX(15?bxR$&s--2 z#(5G-BU3l`*ug$$3RETbQbq=I6sdpsF~K{`sBPfH3-TXKN#x-AA(xw5|G*CxL?s6N^;QWQ2>G$Lp%DezJ=jW63 zQ^SWSon;inaOe&oqyH$Relx6K(S0YTHhF_R1FWpJcn@FJ6;+cfY1BC18c1YDF=siWY%HW}25rQMOR z9`MoZOE+qr2N@iEuhU7iB1HcO73XvHw&6Yc4`Ab|h;EuVI11yXi~qz%P2o_R@Fjo? zEh2W#ld(q1*MZk;*<(7o(Oi?Uyh)K)yfPcwz-sBAi)X(rs`)-q^z2ziIIeY>pBTVx zy(Rnt#s%Yq?@%5nUDxA5_((a6^QSKgE`g|G%_Ddt0??{|Y;=?EbQWST**?s zWnixMG(wk|R#beX1CYuA`t;6H*_HxWbbZ5);6IhQ&AA(7U*uu^2f8Qc{yrw7j9;sX z^4^e>9IfFg!V7P)^EmS7QllAdy({!J@7WNum+D3MGRu5bE;m;;XFS`xfqBIC*=xk5 zyDl$y_0vYqKL12-G-g~9mJjE`82Q!UiLU3Xa5V!J&3D)XG1PNfhpROkp~Q!>@~C-b zfD|OQh^VVA;#bj1VC;!Y#Mg+3|7kN zQ)TxzefJyZ&b>aiAYz2d?nn!r1@_CrW7{iyhUIhE%V+(ij7tZqf=@mW2X9|E3vf@p zeBt(C<}7}q^O=IlA0^Xr{qV-XQx5U-68Vx(&g$`XoYw9z?&S0H2qoA?{C^>VP<1TxRGAeWt3fsW^Fg~C3<{y zFX|J+i>Edx^`lf?g%YiCE9DbkHmcVO4D*NGHuo(Y!ipPfMpC{e&tp$b`RT56KaEM4 zn#(XtKC!nb>J!A>_$B)suE)rVx6sqbc@w`R^s6#q`596w)}|~C-DFKY@|#a+F!(1( zqnDHRnfK(cv9zFaho!mbjRZK3;CbZNv{zlRLw&qq@3^-UvQl~t9eOp`B)hK12uJ^m^H)0F-A-Kze0sF|6ZT*>sHx>($8JXnsS#8tU8fVcgN}W!ogjP_M-bMa>8{`}~rW zFJ`Qj@x`(6S$gpeYX(sh2Jfbvrc`g*6ExmDa{1<(wV_nu5^LR(?`@n)lB9sY7d=F+--jg$7|bh2+v!IU7Qk>#(6+}*11mxbrrrVQeuiy^6fV**O= z343$B*i;~&BX5feS&vS^-!z4+25P|qbKo(Y&yLS|+O=NP4}5v279;v!aKqJRPwiiL zBWA|TyvzKj7F%=by#2*SyRAcXDUny?khmKa9a}Dr-*aRPgHQkXgAn-RlodY%iN_lr z3qKCxrUn-XRGi{@eTg{hOw>=6pJjQm-&J+|rbpiaf|c7lh{YcvJvUL4rKjOaoZT}K>a zLxdkB;*%q#Ws8nes1(-j1_n#PHA`Bx!H-|>Yy(q`7SNBIRVt^k6SE+SfBC3nezq^n z-%b0x_w(lgPn(~cKD<~KyX3^W^4UFvdpeqlxz*aD>(1hmT8WhABA%A;3(Fv}jiaI~ zrU51snJeSZuDSSIX9- z#rK_Yat>sc zNod$0cq+^Sx%4%ptXZyX+7_P2(`b1H#7=UPP(InT;FD6KVWMbkA%0%;yWrKre8S?} zx||cW!ToE3+Kh}5^PQbT-$vb)nqKnc`BprATGLCze^P_I8J)_4L2!0oXe6?-n^*H{lY2$ew0_z( z#7e4sZVefdslftM*)-e^F5caYJg$cOE&AM|>&lYCecZ^X^T?iMRVYtMPf^ku$6~$f zqMVr*6q2{8|8~hq9{qqWbzj4fKBPr2(W1Y0D)?}msIzD!jvASRez6F;5sX9Qha3zq z>Hs%Z+pYY5SfE8S9zT42yM@wKJoedN54vuWw#<3e-Z+k4jm^ZS&IRiTu4*2`)o-M9VbQ*7p1N&iX!BG^0Zjxp2jCF$ zR7Ev)Z%1jV=`;cC`I$ug3=Q9kKp*F0rkyC}_bBEUlv-;nI5R!x)7cxdM;`VIb}FR% zt4@ALdRZmx%lg9i{nHLDkDf1Xe`tJW{ZQ&mdMuUt=)ctX;$$wzYk9(Q0}YFIe@WZo z>f)%lswfyh>0pB6sHiQ|Gfk&^!0ly5iXQlTyM-~Llr^r+;OA3$Q8hpJw4)hxAI*e5 z2)@#5%U;ib)n2)UK7Zm;x>H^CG`K|11i+a7>d4S1v%+xhvhJf#stLEDstYy$!(H?i z`YJW4jUjZ!8!fBkoh+dGJ1*C;vyU`CIk)8zxVafZr$3%uaoro*J4m1CElZ^S+(a6= z{`!HE$Ohml1XCGAJo2DD9J8gPFUfsiD&qbm=aaHWPk42#RW-21pl8cRH=Atj^Bq~f ze{;j9@L9{EalkDXMs3aaF}edt&EbKM26&&Z>#gUPix7I;jVfM0cU)w%8AYptz%NEJLYKO{-qE z7q9$ejZjO^R@JUIU7QOuM-bgHKb++GJT$p{`Ho#!th(#q-n%ykaZ$!o;aUxHBSnYo z{vQu52b+4EbM~5hQ>Uxjg$(JCMaP6bX^Ni>*REL7>!c4(E1ud}o6a>;83xjb(Sx$Y z6S(`^8g1Zq*P%u94Pl9GWHctX6dN3Dt$R_<;iydK7&=oRSYDCp`Q(626f^yk=!qsZ zIh753Cp=biQ9xd|Na#{9tgRU^*>97)Xn9=Oz z*eIMVfi2+!CPY9smicNpIY^g>LcN2OTUvwN^HLV(P<6rOv}!8#V_L*fOJ~}erlKKB z_L4I(iY(vU*N9`~MohKa;_v7_dac{{reM*@6z&&O+Ntj6%u;d)|6?1Y`Kf zsOMnyzc&HzBFLf7S)VZ0SSl!53Wq@5eL>|MH}Qd4O%n}=@zl@Zfir49orf}(zj1^f zk#)c`FL=4iO-p53uZPewSmw6<357Bg0K|gWhrY{U_0LqMEw)P8%+i@D*rRoajSD#a*R{hA zN(yNw6FLw-JDYzLnLS-Ucf+rH7G1GCB(K$Lq!5yvN`Po=4?)Ttk|=lM3mtFSAsnLJ z1ms^i195}=JC#>GP1|~X?vhYeh$0hu^(@C8?o;dmu6PMRVsiD=qB-xl>B}l2FDz)8 zRfYP#4;;vZKP?;jxcOrHW?rbuJZAE}(?E3H96_)408;J#Uk6-vBorCFV<8ugEnq1& zfu?7rcump^x{Ha|Ca6aHK>7zjdMT(9JVNWDKnxYoyje1+cTR*99pE}h^{`CDlqU#l zqPjUAkrpLM&=}1+^zVA#;FpwPbJfzX16PH#bZ!8|NKso)k|-rJ$NH>qOuDN9HmP%iS@jj}x(X zML)zvaZ}{mR>Hz)DeraH?AlS1Ah9;9i!h|QNa+0%DoOKvH8jX1u;dBR0zA|ibzR2f z3cSARSvkc_>Dm$%U4n|J!Pi~82Xc39Eh}m-j!mskS+7OX{-y_+E;Xb%-Hw%SjeG*n zq8cSU*H_&ld7TvsKwUb2a<}RBBA$vg2{ro5`cX~M7-ogp=EX$G&g${NDamf|dS&!u zu72^*n-_pZL5O@wkTQzy=SZIFXl+y10#{&ii(9$}KQ}4FwK`koi3J{OcKCf-K*UTr%OISkSK?}k z&yIRmH)}nk@C>IYOF#FG9zh-zo3h0x?A?Mp(U=@T<5e&B>Qb*$8MJ#;vxMCT{@&I5 z&1oF$zAq$wuh)dBrwO*UbPz!-5TWupEaAo=51$f1lhIZ~_ZG`&Mm2GsDb@B}=qJ^w z-DtmN$DkVOCx`d#xYN*vVK?kM5oN`!I(dMaW>TFF6!Oa1SNt;}bu_YQS6B7S*jy_4 z=ZEe)1MBhS0e3T5PIew?UP(Y)xJ96#HjMw^(aouVw9QPH8}Epr_2vh55pJ+=x8%{y z23YPUSwJqL!CM*SCn0#*J$vx&z1)ZNS9^1brJZGK2vrYpDy;+L2vxH{GP3W@S}ii$ z`{yRQTOkV!engI&)Oad7qLWr;=C47?rtLi^GI!*A#+EXxhMV8DK3K2FGa*Z(gV9}M zMz#67j8h9656orHq&ep^M7H%maiT~o`rH#}y7XCcF{YT*?N(2*oC0VzQ1%lPK`TlE z_2?sbtB+o>XSmuJ&h=M}qO)27TnS7LJIGc7&Xl&4+<{g^JHnvwG_*r}zx68Yn3gtdvdRgp zt)qnbS0}N*;Hy?%xNJ0}S~vUKZ}=sP8tcr!^^rrAtCur2>$lqLZ(?+;kL9VtlhsDeeVKUTP|=@}LCWgGoe^j7vs_KS#!JHYl=r$LzZ)v6h1I(SM! z&t*RTiR^+d@%nTN2BD5i0j7?-_S-09Oes^sWgsrYAWMa;Cc|5);EH_qPg5yjTa3AbG@k(bA-B2_y2Zq* zhb=H@$0%lVBmMH|C^ILup&|5*Y*}S&7h$@6!6=8o1VG!-caX|IQ&fWR}8NC8?0a&{3or!G`&83xq-*|HfiX^*q!MftTVHu3t?G-1+!Dh0eKuB>_t%S|9`X8xYH4E6n5~xBa>R1`VN@T?F?MFq{Q;GMGmP zkIm^p?%TaDiF?_ry@LxABV&q|dXQ$uwyQCHtk*9;tZ?9~7}v}VVVxthBQH;9dcs%+ zO*xumwQiZ@GYLqL&0&Z*B|Ty&wpOxI}z{(k#0EGiybtj7y8B zlTy}-sFm=?VGrnq?@NupH-tzxN8gc*X)bmE1`os1O>Qkj2@#2%tuO}seqDIOSDM24 zhX4NKf-jmIt$Z)$N(5T$T7FPDML1ojGA@SBk<*%{afa%_O!*1Isv2Up9eI3Z9 zb4s3G^v{Bm@gB!b4~e_IJC{}1pvtSIVKmLI$p#JHU&4gE3 zPde{7ag6@tX;X$xJ7~|mpe!38dYWHPM`y^+QS77sVQMrcE`6QsKnI>Xipzq9bnMrC z5EJ^r)1@? z7`_vW{x&2n0=*5PeXfxBK@v?t9w-^h$y>JBK#;rAOP`L-0-vy|pv|XGc57~hp|4N_ zZXQ0!JPc@JY@Yl|3#$D=2DA-N*2m(*3jm8{U$diwabf;e8@ zz6Y%ItF_9Z$mP{Bst>w)z=9!Cu4q^wLe_0>NsiIr;_qycG=1yG~#oP`!@we&^^{F(Xy& z0<9FEN6npo&bxraomYpF?*t}lnY5owZ!C|~%S15AjU-}?s}0^%8^+aOxE%9+zS{*9 zJ#{I!ySrn3W!qED&~K~jU|JLb6LJ`_o;kC~rUz+<*O^=xAIxKRnNTP>_-=Euo()^K zb;70TFR!eP5*l;OnjXFjX;Rqdv1%b-t?OXr%9{%En)E1NS8N6BGB>}4OT)9qHJmEG z$$L7dVA;jM*TN%Z05LZ)u2@*p-`_x5QnFJCF7)3$)f*~HIa*4@B=V#0@oJSY?8u)M ze15s+f66!i^+aU==|Kjnjdr`)({6)`Em@i1F7{iC%qZ?xs@!LgM#s)Uf_fuOM7#kn zD*SQbSoTZGEm_rAKdiPANkqgLBW)ZI5Ur4gm>fJNPK%2Yh<&$59HWj>VK`21ZcUb} zK2O+%x}LEdu_#+-W!K~!_boX3XYulQg7CWNRvC2zQJd*3UuC%)l9Fb`%k-~VuqI`> zJZMZdaLClCpHHb;?4Al=eqvtPCs-_|UR&+K7Mg6h=`W+!1fe4>ySnig5D#aevA_S& zCIeESA>Mk$9Jcc{+K~R0g0*pdXXWxP*W+EbrvTQyQB`r$`k{~%x$yPc=Q*nP%Axlx z2skH<{TptixQ$z;k3W6pSn}wsY~OX~LS^yD_z=IF>AB)oYOa!5Ma_I^F>xOwenPV> zwisX+w*>L`y0$x&O>iXUb`)ezc8>eicn8wEM59{(9I= zgYf1I3%=`j%uigVKI7V62Pz`8tx@jrKi%P8ABi?IN0Fd5K#Q(i1dhK7wd~5vDO|a$%aOCBt$Sp1*ZPc(r(x%2Uk9?U z5G(79vXTpFwxESH(f0iI5*nUwFHap1HWleR-K+PCzZ-S@(TQbs*4jJFZqTIkWd2KW1A^Ac`jhE)GO zl{lLImWQ-z@x9s%_2XQ_-IH|BJyYAydRf*`LA{Brex=s9OM}k3GVCs@dPYTvgZWGP z>*P=!haq;0?meYomlM0*5}doQ8MNpoqYH%!+go;ysDWndwic`aI;^-k>$hWi0W#5m z{wb`B@O34U#>RJ*jGEkdMH`uDQs$qsbenoW7wtl(g7r9Cr*|lo_N;6dXCe~$LNTA}HxuDvBDp(FZ-x)ygN616WL0#h+t+pxYfrROjcfD^O?ifK#F}dLl*0bZ9 z@71L=lH3&%Z$d;TxeH6rbv66K{JJhrknjr}AAYEoQt%fc)OHC-O|Sd5HrLkMy$tgnH+6hO;lD9G2(+y!MJR%Bu-t8hGj)+ zL8syR^L*B`3EEDlu2cwK!dl%v-=ZdvEyCrqwoba%V5~274 zeVuqi2|a{YAr>8N@T*9wtJDMMfwa@}H%EW#|C-g`qsjFh z7eT|QMsc>&_3qD&wCK#O@4m;`l~w$CSSd++Bw)8dlbv z$`5b3 zz`ctXZx|4bPPe9fpSdQcae_PH4kzpe^72~lE3E==@&C_5;ta{tpX~NjA5aoeC&Dry zr{6y>=U+B@Ketg4df|ue1doS4DXX^`A9W0<3md#F6j8sTRwL;cDtIyjd6~ppL^gV% zLAI2iO+l#%;G!9^Cl91cE*xwJ3a#0{{SaE%IT&J|&E_ZGbOG^#-6tSvqNkRhY8uh< zftT+&1&JJAW@s|Z`^&Y#5K;HrWkq3(CCII?Pjt|-9!gt9lrNzX9&jbNXr3RPe+Q+4 zc-z1mR}3t%Q2=BCc&Jz`qKZ;>fZd>m)6mlN&Ij@7%ZFymI<;q}j#8PpwtW{V-YXg> zI7v3&Tc!%;Yv#V!y#xlljz0re${$S1EDa#Oo&wHeOrj}uZza>u{=VI5&gg(>qh4Tw z(%*e$zwSYmXp~QM=M*UB5JYvp_ET6-Rp+e4#$|OB3n-L1@xLS|jbqgkww(_`4-s>~ zD%?KBhJ@N01HQ{(z*TA$O|hx``FGXH;!EO% z(w^JgE0|kL8_x9otc%w9qwy7E{q{rtmd_oYFeI|{??FqA;v@>eQ_z-ch7|WIA|)E* z>%+yB`1>pO)#AJiD+ciZ-Jdk6$YCFay0>?vKh3jt|9dnSz(Yj6DQbN`V5_#W&lWg& zHN7%nUAa0Yhb)w?sefej65nHlx`^4>jsjyZyh0a^8d4>?@~B-i%g3m6-RFQ9ZGs}We(E?!AWe>PvnBW_*N)A%qexVmmP$ZN6p zM@PdJ4X>>h4HXjF>9NLQ-d4uD!G+O%AQ80;hA!i{xv~XW?dV>Ma$i0w|8RWgpZnR^ z(EsgyTIIF(Z|6jqbUFLE^B|`Zsdy=&WrXqH{@nM%Q(Nj6(b!~Frvuc&0+PglJ;AU| zOHWbn!cw92R{BslUYuxjd#qCfM1>ISKk>oMVuXC*(g?#Bv=>OU++^QHpM-ot`n3VkK!2{lBmQ?o=CShI{L&u?c zX$0|#iL6pC+vkcO-{Nc{g@q|5)Rr5UDB>2ZcOhOk#IZ7SEXltqzkt%uqZ_Tgs;GY- z=XY7}2&*DWG(t+GynFxFuY4Mu%er+x7W$JB48p&&%+R(>VxjCD^d%jkDnTgG?D6+& zttNeZ!>`vc$}hc;0M)6tcwe%mcSh_)KR`G!jCp8~&n3^?Cj7K9jU$Qm?uqlMb8`kyR>^>hl%IHmYTNJS~B6CJ< zatNvJ^aG?#2La2wddR0-!V0eKZ9wc?EG)`k_NfGe>KRdCzgsDB`18;+b|L+2UE5=Y zW|;A}z?L3lygo9juyuCF*1Km5xkG)`C=}VL0t3qHr<8ZlWfNm-Pm|1oL}>3oLEb8w z`QWRN0=baB)rv!;G}k};QU32Pbzhy*L(`&*)&0B#fh7LyKO_DX+)YX)(`n_#3q}}{P~#k6|{nza!5|+1f7)?71+-KWoBLnxf`vRb` z(1H1!f2N3cmQbT1yD*FF+)+XF1?2jj!-mtIK8d%x1{N!0CjS^#D0f}>kk0FS)i$iM z;J54Ax3PAfsL|DR$C#v2mdYomT$e??Hl$*>I}#0x||Rv1``_vd2DZw)8LQ`+?DHc zZhQ($msZEsAK%;sA2DWA#Oio3B=nz;AL(Vu1zdOcP!BPh7im}}0ex5QZS>$rsDP@9 zz6=4lfLVIPXK=)9j47j_28sP+sc78Sy9W7Eb?e z6*fx8S?5T%0DtFLj>Yzb)J3_}g0j>|LTNg^(UMN`+`}KTL4c_Zbvim^5|HM(mH|5S z5ACnG#t4{MnXv>ZdxUpj*^Bl5-@2GB8g`p3sC-eR;ezeOJzQu1{IJ;?8p`skam?zv z|Iw3qr5gL0;L2BSc`T>KF5%hmvY_);B(&&^85OvNcgHH_8fZJIN#A1o@cy%|%T?~P z90w-DwExQdN9WJ^G%#DqM*bYwD&HUTXwrq(-ai3?r;JyjJ%3&y)}7O5e-^-Cjv^$mU&kc<*w3c!JOUSgzu*eNUL6KJmp+y;U+_}%;Dn}_j1Mgi{5_)uyr=Ymyjl=RhKc1OoM0fQ^`vRQDHJ*;OmEa|6$7 zNJ`>g7b4A=xES#1fwQ*_)wl+PIaBYq8ox+jfw^;qe?8x(^uzHhKQSr_$~R%z=%##H zjIk0E>t~|x(Kf&ZtBcA~;35r?agFqz< z^rUBP6lcjmu!qgbQc%W7Sv1Z-HB~HnRcyL_L@Hay1srB5*t$XpecfO=9j;7 z0krrzW;{c4-zSEE1LNRe$Hw9eFF6^-<+Nh?(@Eg-%3NEIFkMdI%(LKav{+NJq1?y8 zq0hSylvLnXx6%Kl8pKr^s6)iB{IQvT{&eQuBZ4zQI%3_w+(G(87oUOzd z5tASO(GU&_dl;f&8IVUw9&{QE;vO-v2%G}JWG2~%z*4a*97UjFd(eNz-zZpSf@;_1 z**u0NX9!|>KKG6khE{TniyNwdU6m?waGhOs6mR_2pc@TBn})$DG4SY-wf-f;`>%cc zD559?sFX+N_Bo-_3d4$f=ufYcoE=w@ij|--=kV{;9B$JL+N_Wh3O#(fCOR2lP?;i0 zWWi<&pj8EjX=U_7l}zBhg$`W?zjw`VzL)Me76UYWAU;jUYyS{IcK0gPJ49RTkbX*URkzG9U*ySW29@jgM$=5%!F7Op2^I&Tm+gFn zT<0+xeRgnF{uK+w(R6R9by%*rQcf}5dP^3kY94H0iP>K|+W*Sr?bcoA4Y!vfp<4&k zYhZO_VQ1CWleP9_Dqd%y{u`SB#Q-SqIB15 z*{iLjsu^jCJgye|Se6;lX{NhXHsbAy5~5)16-t^ZR~%ftEra+1?YM=3`9E}5Qnf8j z$>9X|hID>A%W=bqkdWNSNay#4-a;ad=!<`XPp40|-K6ecA)$YWBBd&$eN#CcB%D@kDh=~%+!>dzuwyU7F)4O;il$>CE)cCGj7!a zX?dHYwLu^ypZ^QpYd#J3-2}FTCJWLoNzfH7n`NNZo4!W=tRTg!JAMJ{B^p$1)!n59 zhrM0jk_QjvQWbs|2v!JqzptzBx3b|Y>oZ8Li0KB6E|SZ=Ghd4$fe~?4!%sQOqSqnq z{^v0VSIMLciZLIJ?N=^{q?|SA)Ja6tMN9Gv{f@+ZQAPY?i58%z`M+6qxBtqNcR$aS zaUl`$u*)V%Rp5faNpX%>$;_{z?-Z()H?lame;qv4QMrVLwfPoHfr7*a=OK~WJ3|6!) z?(T)+?rz1sK%p&Kq!jnwNU`Ep+}&Zmxxe>$pL6~=*LC(EJIT)8*~z++m9?^d$$GB$ z`Rv=W!p^>BDpFn}JN_BZZ2<#VdABPzw=QJ81BG|zJKI&gER(qM^|_!)uSK>|J|0&k zBU^MH#}0duzEbB>iRZ|%zY~EdKJjN#*E141&=VLSX4d&oeS_R4dh}aF;m~7HD=qc~ zqk09Sq{r%8PG^&PbEmOWJGN#h4>^D*^}9RsqjqyJ1@QKt>AM1jAhpS%+ZAu6LIRlJ z?mefXC|#%3i-v`WMXs_x{Cn4xuv?8nwudBVi33g0PaTth0&C*40d+622y(7%o^}g^ zRgY(Mpj<@OFV^#B%PHhpk{;>RP!@8Zt}yWn*}_nj-O?1&Od8=<`1GC}bqq@0gIeo$ ztyFSH>#`!G9BF+jxlIdk3t0oa{k4X`Pb`J$HjGf5YqB-`VJ+j@_xRtG>d8gpf)bk7lsRq zt9-lCgF^}zKG-k%+G};xQ@2|mqut|idSDmEAEE6jwRm%&ts>hB90oZsF&wO9H=sU> z@*Yq0ccaLr7A}{}<91FDE&2C-2p9JW1C?Myag?Vkx*;j`lVMlM@M_d4hs~;mH^;Z^ zNOln<|7|LGFR;5Zcc{P~NNo#oN!?>4z&{j|A|*J~9!(TSZN~U!{<8_2l`{T5Y=f5d z5s4#yUEVM%kbnf`U@+`vBU15jSekl(1Q_YPf?YNOtTDhAwx*swZ?J?*v+-2_^O;YL zg0&+~KNjW?!u9-l-vi$jT>C>`nJvs^9p}olJunm;U;8Xy`!APNUwP-))r!H8RmG>( z0!kN_a~C>&D3l>&ry7m&sZI=SY)mC1wRkg%-yFgtFzMm=PVa5m8Mi=I+6Vq3Be`p3 z_Hk_a3Q%{QeuXgQQKAC=1BK#?MEj4;O!?#eDf3EiUsws405z~M6C5e$3AcPg+kt zyu!vN+ZqrS;gPxu4A{ep@|z%J2&iTj)O@-2kWKOya06}a4wOJnra*JtX^DOae1uS* z5}3G;S`YhzU6BLhL&z_pAKZk!oPIRJtDM=Y!DX7^3pLUX*e{7E#zslE29TIB6 zd%5>e{@YVeaAtNe$167DX9~&F;n?Sh^X#YMBBaxwlgIqENcD^3tN7z*BgmJOx2HQ# zfe8ahPk~cM`@4cK6fVHk4p>c4tT|aH&BdL|(`7qR57K;mZW%WWIeGV2*K@t*;>2=I zh8fx7>F=cT>ZW7J<`4Zm8Lb*$g@s>CMN`3v)JFeffe&bKU;a!&kFMo)J1BnT6$pJ0 zt(z7-DK|O`a16L5=EqR(|7QbRS^jquxwJpVUO2FVGHSJnuC|NCTvq+5MZ)glCG}jj`j9IdqZ%6kKeLxz(aK!Vcu7GqbHu6h^y$0IsKY#kG|6n7_pSS|< zG!ANF3o%@zT6TSyFd`5jd2C$jC!d{D;ORJO!eljtOn! zUB~L-Z2PmN`1W^H_rRxnibGRHxxv8f5~*MNQrx(HngWDd9ba*ORvL2I&3xPMIl=f@ z`DSHGk!!D{P*`wbe{ZL1Z^zc>rkTehiQm7Q^8Ez*w3?i49#{3m0ZzIi8MJa{eVELZ zFHE^hUZ>O?`$V0oQa(lblLw4R!IW&Ajx5TKw8xR`SY)tUafzqb$c-gO7`2{~*e1sN(Pz_EQx^)DO1Cp}SP#%=J8UR}GaSHePm&%=AH zhn3-ZEaarYKgeoJaeK^7zOD5w7gKYLmd;^DqQvxBr@)pKcM!%t#$bBjdowGv;mL? ztT@Q?pRr$kLqHfy6O4;jWMWd$Q8=vg>NkmzgeC6n79(Wb_r+OO3-)4I$VH~HKrCd^ z1MmrKxv!_QS1i-9RMfFh7Pu(-RZw|h_O zZ^u|P;wAS#!*AVj7_19?+XK74ocS~YJDhkcAe_6vgP`{ff&zRjQP|JTi+~yo7J#lq zPR7drgn? z4z^Jx4R~OL)&bB^UTWg!C7lG8M?xdoY&FiDn;wBr3CzPS%rSGUqH9tsXq10%6F>}HY z(W+^aPoNKxC)_7AgU|;u4!~fbhE~ujhzq=-K^X)(sF|?(9;pvVDnPN5LFgjpzl4S8 zbYlPc4e1sSL>Flf#2>+ncE8ABM7X49s6Taya95mRtFz z&l@V%e}>J=ctW|7;_Radu^rjUR7`I|A-$Q=pq*lDwr&j*pbCLtvotJ-qjNt!6yz=O z=+uOEBXu0cCjE>wNCl9OEX9GHAnBjZ8Kt*>qMv-&n{&iJp;>h<*b5N(jrTCHhGepR z!ZrMX`Omus&Fbmcsn-1tpjsRIOB_ol3wIAUOH;>xW6oxFI3fZt9@xJT80r$?6%gd* z|8JJyf3hSbVBD{LTr6SSuiTtHU2wRyQE4|*CwCW9H%ljT9~^Et%*xck-4cge0;pKbY=UL0;&wSV*698Dc?{$D>5{_l@){_`h&bu&9la}QL7Jho4{I|G&sS zf3%k1YY3%%lp(l^Kd6=hzvV+2G6)sQrq~7aBB5>OF3I&Lu?HU z<>T&NcbOqe)k;zE;lAlcg&fKMbWA^s+NX634Sc#fURl3IqINh3USIz$e>#10v-zzb z`DBZHqcd7yLre4JIPi4fc;)FV5lM<1yUE&T4nTIS^dCDZeD*K-UV1L2ozU?xg1oyy zUeX{1+OO{e9aOfgoj*Ml(X?D<1l&H3tvtQDIShO{yDtD3bHA#bzj)j)F8ucDrNFe7 zQvr9y*q>9MFSn29r{X*3DGB)YPE8$>A(G#w-2>zg+XMnw>?%)zp+CS!oJt&hHpsd%^VE7|a! z+JIMT@aBBrJsd0*vE@%g>SZ3+gS^dmQ400%ctH#A=zGL^gLK`W(Km#JqhOByws~nD zaTUHc>^l1U1^p}BMax7+uP$ENQkxi-1z_c_i6B``AFBTMXjN~vpZ z-o#$}FW%aJC?z*DJ?xnIdHi=YkmlN1nYZ>~HDUg*+6)@j#m;x5AvPCZAa<9 zEkH6dU*Gc}w_Ts?XAr|urE%v4t&3wT>f_h%Ti&Q4`K z$5qw#()rW&-;}`XV`$BYb4TlU?`x^O(<0sT_^YdpgMh|j=h54z$7dX3*FM)j13Q3K zqodcRiDL#{Uu#!766cX+RHhOEVU16o8%DgR>&7om%fqc7a&~W}Y>ixu<6wW3KKc@{LM!SDv~RdXWHDGGVmr zt5s;%PJn8Rk0H*01LD#T)2mA5g}BgC*n8+|D~~P+!D*q(B=D;<0oW|oHXY0;H2;qH z{-!eD-h@%EHnWOQAtp>0XJ*?S;Du|=scR0e_8W|;<=uE~kfYHb+c5JrIGrFG7b>6L z-wLsM`F)z)AjgHQv_Tu9HD3v09W|C3UBM2~enwe}cRgk`cz+!TfM_kRKp{bgA#1E< zlwWSUQNi={{%Mp5JKhM{)~4?8p^`O2O${S$4wzqH!Pe_ z-~AYTaqCA5NJF*p z4}fdp+LX6B=GdibHjJVJfVb~U!|7u%4TZ=TPNccN{6+)^^S?lMSt4K`O26<<`nzgC z`vY_JM3bI2TFkd0R~yC~|8krf8ymk!RMs{9>;zEFQPl%rhm3zF6uXj6v6h_}7wpO< z*P(qm_1UdytcP!1Oj2saB5NXJ=hZRe#l10ibBYD)x#-E$HZsid$(|+WZ-8%nn9=?c z5~!b2O;j*;`-BycZRSfAFtuBM+c5QoLE$byJftGMl&_3dpxy98`mk7F-ay1%Jv?Q6Pr&DlC19fZts7LSdSjCYm3z_Js9I0KJ=NKlqOM=0S*XA z9cB5;{+S1A;?hi))_#{x`;fi~7ft$9#ic$UhN<}`+y_C5pK7FIngOJT+P5(4QkyUi zWfw%l9Q5g}a;B;ib66e-t_XMZ>_Zwbrp3@NeaO~u+%VN+qOXYaNV=x8SKA`Cnw#y8 z8WzS4)AGTEsAtb_O`6qpmmuG5e`XYk2r*eG9UEQYfv#+DWwUYn15X_J$%PcR` z^F?lnKKF$|`J<^q*M|zn&iiXkR%uP-J)Us0@47q$MECl# zJDOD4xGlVj#gGMy(Kn)Zj$pHQMe<=~lLDC>TCZbu*MlAOTQOYLdl^vkA@1==i&_ts z)Xev;r01A=u;#Nx+vk*A6%)kK*Ut>w#G^w?I_Vq?XM^5&YAFbrx^5T8yzdzFM3t6W z6~u&r7R{f8AeI(3XpCgRhHF4Z`{`cge)AUtHKU}SYc8|jH;#c+(dKPR8zQ$!I*jJI zszTxN^tOz(rfB!(BXvwWQazRWCL-BU&#@rFK{tYwtQI8xcIr8CJ=s@2I2Z8wXa%Z*ZbT^* zAF8uRClrr1HS~kCQxw_q)^hIp*xK8mL9^9O@U0Y6=L8K!xOSiuMS07dnl&wa?M6U!|*JKTt=JNOg>0%NlPri5f^x`2jaY zOkoJb?MKKVF?r%J+n~U+A`>BWHv&T#n>o}*{aOv{c}|oL7ai}!JBMuDDasYAvy)!o?kh*@zE-MNBA?)l@<9nCeV za1og`x?;unuN1L8iM;bN&t7a9Ufn+clXpTdXvZQ=wu2bU94eg?z#MpcyIGj8O-yfI zKVO$X-@?D&OG?h@w@Km8EE>ularJ=2#lxLk(r2U(tEO3Lj(k>-k# zZ>nxm6HNaozF(oa1tbg>9?XFfz+UfWwuZ>dPgu%ke;hpC*K`CzsF$7s!r7^paHX{< zI0D8NaQwhC5epVmv=ltCJ*nzj-!bs8a^5*$3PT?vQeTSgQaMpeH&&)jTQkogM}lyO zCEf6(*=Tkd?mH;(T@4q@FQ$J0Yp4~L=JiUe3Js#2%mke<9{`_eICasr7zCVZ73`(O zK)f5Vv#VPn1vf1LT0BpDv+814#!UBc;dQD*8a=*aM1qhic{awpX`CXT0Ir6ilca%O zCX2ubTFE=L(Z<T2-|1Sq1>sj1`cAhVAK)@tK{?vepK+w`^I}`lNRx0$XI18z?#u9KZK{45Qks>>)51>>Js-;g7;iXWU1C*7Te1lh!8;<9_Mm^(h@DCcd`q$2E z6jZ0i?lpJzXb$Lwk)U$g{MyWU08)~RE(g6|##;nN$7@~Xlp)eU?n`}ZB^?Q6Si!B3 z9@KmDg=&;ZU{KE}FIOHYY4s+=q4m2ky2khzAr}G71T{-UYYwqmskHv)#8tba>}w<4 zb1<|s%%a*skTu(h+NN{J;tybokQ_dZeXo)hVD~LEgJ747C;Tu~D6Ih!FL*{3%b*Zq z@O?OyZf6N?@ojOXA2+;YL9urPe2o{ta466D{NbaBG)+#lSXUwgM5_(c!ucLh-tZV= z>~?mp{|}mGF|@kKgH!`fQ2C6e7a#IF#N&0<-1yO!LA!^)MsmnXKGX%>a0yn?sAm{r z#*tApKx%U@t$M`mOMzew_Uti2@{gViZ*i_^Iv?8QqGtU z(tP$GsBaR$)K)l6d$~DA%^j+?<=<;D)VBV@v|0KbobIX%tcJ-ur(PINg*2&YUoRu6ns(84#HDH!i_+`wBFHJz#hx-6fulm3*D)6 zj+*a^*TwkLt&56l%KivT)t8KV(;W3$I7|K+v!GD97n7n!z=W(j4%sJT&)>4{PE7FI ziA1x*UXIKl;$5pdI@7)wun^}bm9Fv>Ta$(7fWyQZu`B(cTPp{K(jHCa0_gV{IGvUr zbCKpalkw_md}zP!cc2h)vYHWU3=fb^i2AOo(EfB?UHu!MBq*gW(^XRY9Q0t#hezA5 zybyM!`bPG=)Z9j(M#bg{H7BT}FR<|BPzzJ#x>H=Xsl3nC=E(@mJo=Z0-(wZy>CYb( z`u3JWFgeVP)jdc3@fn>dK?s3tF+*k|r@trTcCBGw;irRGFSRaGv}bKqKW%I>MC!{X z?zG_tQEGADSknjB_8Ef~C2I(sT(vCT65K+FTU~FWd>>4L(SiqgIo72{f0~3*H-7D! zRt%B-Ltj>%{GF&g;`O_O$awVdgdVUD@0cLvbC)!Qm#+*#yj;s=KEH;D-tUgy=(JY{ z7n9^VtstN2xwKM@2dh4d#k#Tr#NmnFV6HZM@At|3@&ib~ajs6hzn5`?l7WAqn1vaz z@>rbAjo@N3f`bvjEOB77x4!ehi7*xB)rKh}XO{{xZzI@1^jregIXq`p%=k_bQ|285 zTImmyJ(TkrGF!ZM{NHtaXwQGYNw3d=@@aJKGQb#@z}j85c;l02bsoC`D}I2gx!JPW zPY4u46InHGwxMyBw9x>S!~Nm)g+};96O9c@7!owAorz1=KrXf>x8S!BSSQj>HYU?l=M>$p*G=ksDid!;Fn0zhF^uH1(J$;BvOKt>vd_F-=?HNH zY>A~*JAW+KBfp_r*@ii)?&%0s(>7L z)EClBhhrMHe&P)?FSAZy`Ys1t<ru$HCe!whvuMtEO{Vo@1`)_XXeUgPNm-b?!^AoFrG`tLf3CPrHni7g(A<$pHqcymGo zNBWS~igvk71m-I^Oh}U3YEGBNd(nSs*=0)f56Us3fi`FdJXryq>_p$XPgduB+!GY` zuZPh=npKn!tYj3lj9W=rv^s6ooa&9>x{{upodoLh8(v4zHeF0q7KieGnXml-y#NPY*sCakJ`UfBzLW36jA9@x``1BG(@@gZ%5{U$joPuvN&Y- z3sS@zSCzmOsvwAB=Ee00dX2t7M&Y*r!y*qswVliA=OoGy)6&7OV3Sqt)MtjptWAv4 zeAHY+NjX3gB@u7ZuOhC64x5e>tUTRajG8X|FtqZFv2GG({6;m^K>k%`4S#>vy40hP zWucv~N%H3Fedmfe7{oZPA>(hG`*`#M7s>?X}^Sctbl9U#(V#K%Q8iX#0Wie z8O0@g_AqH-pK&3&s}&>afb!_WAMJBvLIqm;(w#ZyifZ1f${zbJBNEX{iRb6TH&Qz) z%MZNE_ogsBuosrNFn2o7EGWz>g>TMq z#epSqdf5)FD9y8(*k%T#ziy$RP==J9)Oo^3ngC$wk=;3u27Zg>MuEyGom~+MF_IAo=&m2iybPkd!uTm(FIX>RB+M|XfiTJDo z&Y{1Vj)O1Lt7XZLSW~dEsX|(U3TDb5ZUW}G!FvWl3(@^jVz?Sc@^*)WxmHW6j|x?? z^U*JFC9#^t?q&#oe36xRtI4-Hcn=8x&HPqp znJ(+Wmr9CB0^*>E0<=CE7vFiWWSQ+0>X15%k4)mW|V* zDm>A+p9js!)^SLS{AvK;fsB{Ui=vB}t`ZvSc3<6{ zUG&v2_0~+f_0?I^`kEAk`L{Ri6{)MUyEV$K<7VrnS`~==81_7c^WfBqb@|e`!PPYG zJ>oTddcK}qpz+W6WD1Y zc&z)JFjvP(|91S7+=U{aZC}ZhA!?RL!oOoHT$a!X_8`m$oBWZP_vkHURJt`o4-f_j zy-3^a;dPLfj0J@=advq#-csYg1vWP5Q~ScuDsBAHHB>Z&8^=e25~^17r({bPY8>ro zCzuXC5bP(dcUG_3#V30`AHn%*4NQ7n`mSxUS|8&%RGGW4e`Ngg6-q_9kv3~ zOER@r`wTg)U%J&x6LhUe6XHhK8FJ`0l~Uri2HA5vM`icgLCxzr%kP{fN;J=o+)}T) zsv@>{o>(^zJk^m4PDiz_2s`Nn(;5Y(rzdKhP6BIHj>Do%Vj{qAb z-ryJR7We$j>xp3A_-PPCPdFZ%_R*?qKb?s|cKP658cSBIwAy3_TAxWlcbfS}Jee3; z9pK$gw8A;qd1pE?t@rn>N-a6&^e=VSX>si!J)fgcj9%lJ@2z4CGy;=L`C0|lQB!K~ zeeL|~=(L3IRJav-ifAICDXC@aY^1cel0lW_N&;taZuLGLo(0o3_pA(>s44nO_*dB& zFuky7{}+6mV~$c6at>qLdLor}A$s53c;ye^x?%c@H>{ccx?6Fj59N(X2)oQn=IqRf zHEp8Kpq7t8c7~~pUGKAknOZ0*E3-Y#6e?t7vZsl|RX{ut>F)c2QeAU zw4fMXe-AtC72qQ_cz9Nd%NUPa#!V+XA*n=&%72&7fYNg6f8 zwj{V8Ub{PmU+W6&BwtL}o^}py%UC1^a+B^{6T1}+=M!H*1)Uf~Wry36Lt_ye-zA=wKB3}e(!YrSsEyV+v z1x+%42?2JlPazp}(sU-l5I)=oVqvBHDFX`82~Z02A$rN!x7wHQ*T3=HOwWRi+(BUY zm(xKbcXXjTvy-aXpArO^5e{qQ1gBZ_K%mKPDAeS>FcJ@!X-V}b^)18Z-)dQ$-J~)i z_0R0jACyB=830Q3}IXh9rfQj1z;rB4cK<0H_ z+Br6FZqixAKX)jpQ*to;Cr(S?iA)4sBSX%tN`gxFvs=TcAOFwJq%1TD*VA=y9&#is z15WgmgB|}D_%~dFS2`=?m(T>s7+|$|bSvZ+m1=_nG4VF>mbZ<;rUPoRhBeaNA-*20 zdVHihF6wI1_UE!K5j8L6@2}+={N<2|MQw=`jTrejE<4&_KD*y9mF(1Ws@1O4DU!3w zPV#0;iCTF!EhtN_#ay1*RP&2P0#%KZrqv8W;KPKwMS?qdJQhl#iRk73yyb2Z-#|3L zep+ldN<}b3m-9JmBh;=UwHhUq5=~WDUf;nbd1%Ay|ER|dGns4TQBknSizCd9O3-qn z7}gY`2Ijzo#(7?&=D#gWxEp}Xas;-|UAtPy;v%X++&TlMzyZX;2y0F!gUIA;v`%j8 zkh3(0Ndp+dO-)WXb_pbo&WzEPxQk|xO)YGDUr(;pQU1~UzHk=|G2yLESHn?i&1!Yh zlAd6Td+2NgL_|*Uob|5%BqL10I?O#}o_1qQ(9tk^F`{8}I;FVP+Z!$WE7mM@Bh;ca zXfy}A2|5As@AauwC7y?m3`R#2g>PkC2GVKTIK88Rqj~-Qovd5bxMazc7fvnw;sq=9 z#Tq*6SQLW@VNH$rAqPY;!p&|eX+DmZYF+2MYjdW)AH>DNh3*wpCb|knuU_5r%us@d zkVkZr#{e~7WsKvLhnNaj%pJO{YS?&@&Yyc>7LRX)f<%Z7t-f^+PWaKFo-2;9BE)Fa8_>bHuX&!8Pa1ZNsEx3yB>NMz3Q*svIIqqoFo9523@6QRB6MQ@RA*Y7 zJH=pisRwL=D$j;_9Fsm^Xwe&mc`%^(FiuKACchI6x%CM)wxxlIq&}YR1lxs6uXaxm zaq=C6^jBS{K#Jgd!w5c4(}6_nL$Ca)C|0KBpC(gL?NB=WB#O|jau5$oVT9W7Ks316 zlPH?c9h|`gf=))J1x6T63dV$ODZtkg%elBu>x`hF8C<*K#^;uG2_Piyiyl6?9%mGZGBokRIY zo_0k$)TPwVxPn0Rbd_C@Zre!dtT>eZR=NkX(%s3Lo=IRwuGqBD2-a|g84^kh^|~z9 zEKK4(xV;iaclpx4{v41dB3hg_w``l6MawVUGZ~c76BJM7&u16MU`S`fT9Xi?efWbv>%T>`GZ2>-X0UZPk!8lA$O?W`TU7c-4=W zl(x$d)Eq3M>3?0b`Roy-J`W7;SdzDe_yIYuHG{%K%`f+ z7wHdp6E1etUybkzqBqwLBq_9T(0ie0 zGSS-w;o^D(!ux#iR z_LO+iT0apG+F>bFtiJVT}>1|W`VILJ>|bB*Y}$fBk((H1$eczU_r?J1mH zqlz9dbD5;=zc!KBaXuZ#%TN$cB-;OrTuiDXYUD0FYp}Qn8Lzf_I-bxi#Acj?DM{S6&8=pdG&B24H!1f z$T)Y0dQf4holm@3&kZ@%`aujwt(8;=ArvMM!Qsy*74`MU5i z?;dn(m2h{Q?8D&cg}(>ER@C~?QUt|k8sq8uZ!@ACG+nbhGm!YSm~bC?O8)|-)C3FEX8_wY>wCfAenp8flUmHzpHh8V!y!#LJ;y@j*YrLSJ5muM{A!e z{JwCsfN)L0@)w>K{xW?ZkIn8udD2mM@{6$g0$DN0($kkd1GO0N(#;O3t>6F}ZvtL? zcqWsIfMjbpd{aUP7i4{*9Zd?g*Z{*br-&P!JFfU((jjD|4ZxMZEd z7bvsT_DI-YtAn~o1GxBa`N^?SYHON`+AyZAADVJctDzwqwC7%QNuYmpyDCjq@l9&| zYXHo+ISHhb{3<=Bh^dX%1%7SN=Yx-LulIOU*JUWVGiJiB?ItCT`n3g?UzGQn%LSO(D&Fpu>*V!Irak`bP61;=2Zp-juHDcP`{G@%wwpaye2 zBOO&*fDNC>YkE@zniN;AUjyohEGKFqp%kH2P*P{Nl5 zUR*s&6;rGJA-}x84u(CJq&Z0hr{qB^=`BI_Wxr46d{UpL$ny0hu?=NC(DOx$}}RUMCVpf0Er@zvq;-c?C49Z)*2 z1aCnilybf_64uK~H^yqTofW}eC{!=~QCPcPbo~sapw&-3PHUJNoY+;kxb@EN3y!D_ zPg-ODIR`#-w&0-o3VI>h=PN`cBCg3HXTX11%Atk|srnj*H6>FJSG-yQFgr>88s^a@ zk#g@;yR}$58=Mw?w@>((#;mM@ z!gx0}W{;$*V{&K_z(2Hp5{BPP%Qb%zHUM3cf8ABnQk~LA1v6|)EmIiQD5k;H%Pi1jAD@*^)#uet^`+;$qz{tXd=h>4{N(RX&aO}HQ-xi{;AElPGCIT;F9 z*?!GB&Km3|mmusQQugj*18V`5XbX5<`X}le|R;gT1`~ji6@yS`!F?hLK7o z<$18s(Bh&MjRT5t_g(+njz=v^#?5GWBs4B8)=QlEm&Tq2&>W?y(rGE@Mfxj=`kers z61?S0Idp6Zc0s+rs1g$8Jo&lJ=tH9zoRj+6jzmw7@+Zr#_Rmv z;t1}S({>n>(+GC&{R$L$S5%A9f;ECJ#I->IsG^;xsT-$W@k-OpD@4+=PqNq z#Rs71KD&S313oe`mkajpW$E$JIhG0E|=QuduH;EDgbNXN9fOsS-YCX9*<8we#rlf7-dMHV8?;r2aTo$zrMR z+AkJiTaq{%g%7(85At#B3-y3VPprcpw$-Glp(a42f1TzLQE>l|hC|v9(&Hf`EG2n_ z#7zwPMlX8pzq*93#4lHR0{&Oij7{|YfqccE?I01$=aX`WvC&8VBz*Yc*3gXJA9=nnHyB>5FOE`9HNohnC0aMO_g@UmQ;(oA z>qV>s_yzTJM|!|UpKunypHc$|xm}Hp#hkXkLhjSxhLndauBHV__a=*@D7#}+aH?3} zyupk9>_|{*OTGuU&6ii|rv|UO4?{npdU0PbbwA=CSqaF`8`4fItCXctCJwpt;7Xrn zQUI?DJzF`KY^>6!EzJsNrpXEX>k(p8tOipV_w0C)3mwXP6I<81E1CZdM%q$2)8AO@_j8!c6` zUqAD2c2Y|`HaQ;EbfQW8{d8)6}#CrUXV|rWgR$-c&c!g$D6sbfW|r=heK zb_%&y<58Ru)|Xh3z+e5c8E5>jLTGDZYLf&x z+jMw1Ofm<5X;@gW@NyF4v$eUwbTv3i$DGWmT|`MX?<_5 zOMfu;D-MU$xDAH|;tePYByfaMjhpJTPZo!O{ksPhl=oAVC{#2s4yyj614kOsd1|y{ zK!13NQh&&Zo)3jMSeu?QxtpzTU{F~R8zz*Ny>PP|N%C61aS(5`QX;6Fq5ttth>E(- z@1zR~qt+S~^_@6ejD+5qaWeIVN*140iuTS$vkuZ46<|jW#+`;j#qgo5<;%~?zvnAP zOvp`0FGRx?<@t^X@}UARQndUI(8&>!mA8coMVrxzJ<3CWN*L%>F(y=DPOT1hH zVeXaWf-;<^I0LH(QtWO_y55UW)@q)7+-E_JnBp8@2L2Yq|A1~Y|%H;Bj{B> zdgjn~%Mic*_l`L>W*=6oi5U^&pew0GW%o)nmNZ^g$^xg4ng00zx|$H}o02#O3eG}% zX*o7x?&K0hiqu`l^Dfs66EmQ?kkBYsTz{*3U9I3Vnnf}WlfN~!wkMpOrkxEALPAw8YLR9)QJsA*4+(?*9r{R$}0P#QR;6th zN2`j^TwPEq!HbIc=SyNv@@$hCg6!igZ9&>ux_Q^Kani(w;v`0t@V|oruvT~C7q3AtBKWKf(-nriXp04^jmAN}q-HOsC5C1zYJ4ysAt&~P2` zRnrB*Mgcre572u+B(UlYv>};%w>wftN$ElRY)|P$bRc1QLfArdGzv z(Dsr|oX1yCjqs!*&89SMw_PUN-r>DSe{4y0c{fUg$6p|_O_n_iT z5|%9yg75p>(hnbiAosK?u3N&ZMO^7TwEfesyI2!U4W!4E3C%t*Iz|~XY%+G*sI5@Z zQU7xwg3yCVBN<^PkexUsyLE{EBlS-Z)-N#AZDWLm()(g~$P8nR+_1_gh6-yS{?qHk z28IA9(ubHdjKiPu%ZP>?A2?u{BPhkihtve#?2&N>-%SSAn3+gwGhyp_=3|S@I}kCd z=}=2z1%{=#jC>-rC1Jw;6M}|Plj+v7EgdFempWg0!apRL74OV~|90J70ACZP?T5Zb zF$z*>fBj2NQxdJ$LXZg zm%fK>g6*2>?SZ%+DZ;SSMxrl2TbLH$g2bGcgZ2%1o9LmKzZkfz6gFMOe~?OpMB^25 zugx^knSEby6;fH^eNo-?!o)q+%im;6gQaveVbo>=0@(CMGqYK28MVVN@DF3t5 zZ0FNfC*|M!4-D>2Ho$ZCH{D15WEad@7&4nIv3xgI{!_7EXg**4zQ2Yf-6**Sk_WNB zn|-!(jw}C+We)eFm@uk;FhvO6PCH_wCA}Y93gcOgf4iYq%94Z^^v5wF-BS9cz~)_4 zsK(Ck;s82OF=ZrJH5UF#D zauXBE5E;+#>k#9I* zOKgAgNoR0do*~q@Z^wc~`l$*9@S?h5ee35f3}GV<5WGFnzwe}Mi-jhp6)F9uPZt!B zHv~;et9JRc_6*PVa}mtU;G)wY4;~4`t*PBq8MEu&!3vZa)QEIB+3gE4+ov-fi+-wwfarvh;YgXU7i@bRe z^A&hcy1zZ5Tx71*HK>IYf7WVZK~fb(2#8yXh^K)4^}Zh;(=(l~k9(f<48!p-bL>$F zZE{M9+6`)+&~~tYr^JAMhbh63Fq@I|(xl?~7T}g^{ebFvNs&`P3>g;udB&oKW^v-8EZpk3apEcRsHOF`W+Rbr-?49Z zAW2yw(rs31TYXx}t$FdhNGciz1xx#iDUdSbVQ(^XzMFCBgS6b4e~^83R%!H`(eN&# z;v**hUmG02vSn8Z5rGS;Te#r!5WU;y zRhSY2B zzWyK1-U6VC?`arbTDn6(y1To(I|PxgE8Q2Q8|g+`1QC^#5T#Qg*xk9abLPy;jX%%({O<(8tXR4tb7jJ#qT+%tJ{YiL2d z+{8HP!SkiUQS$km$`Gf7I(LKZi)eEq9NlVXnCgp~)kGd|)k0zd>=lwAc1o$wzEkO_ zH99JyKSfZsDZYITMONrEEKoEUVdZHFtDT3W}3@TByNK;kxbZ}6uP z&x_bXT+1l&2)gJ-Q?)~qj=+>YsqeKY<`OkaEY+g-C$zpCsjN#*SQgJooXT1ZV~tEx z_B(J_k%A8Z9@}GcbbNHhckwOl?hIs~&O6j6G1D#w9-&ZnD?xb=+z+A#uDu5ni7|ZI z!f1mqEoEfl9=RrXamSW&3irjul~@gdQ}rd}EWWh_o`w5;*WT!bsq0~~_}Zypz2B@s z85QwgC%SbSiD&Fum*uUf6cp%grbxVGCGqc5Fr#g1g}W|uhIXDT#vewfQ)?VBKaub3 zxvg8&h2z+odvbOdo+w8XXfuV3n2e>qsP`((dXMXE%QElev`Y4&)a5y=o{i!#nz@a9 z7>~pYUm>Q$)Wroy6`JBVc*e9ts5dD_ojKW4Pit*yu(V6gtant%%)RP-mRfawl6+hj z5Mjcq=C$A;jLt3~#l*WOVqFrzO_KBd5mYu=<$>Q&>N5!|QW;F8s-<}S@g4*O`bD&? zGJmPif+$;)Tv=+UgDe&@X`$ice7sjoD~QF&FDvCdJsBwR+HL)Kp=g~rLze*^$ZHLW>=1Oi?C*oL;ODG z<@+uTE|lb+lw>&JcphzQG_f?Jq+o<25VRMjPx^c#Od|Mu;9ElsVq+m5Q?}Gb^mwcB zg-!G=4%ul=;a>+~ha%Q;vp^17LJlnB(>i50SBxwdH0*UUV~XJL@KGoNoz26^rTkqe zBAxcCI%AwwF78LEQ(7Ekq24M9Y6BXYi8BPO;8Ij^lc+tl2}qOSLu~8`6P0tGt900i zTtH_sn=;Y#9IcnHD+)@Te9})?3yHh<_^S&>X=>FEPhTXxURwP5968c9=~M0C&w|KD zQT8PcmB$37a~2$ynJ?+_%sDLcCt22d5&P!RtXt#>3J(p7DIFH-oH#IlL|b}zGT3}( zxRjX!N6cyYoyo{|IKU>%W9#y-m}z|`BE64A{5B$O3wgk4Bmr5S>ex6Wg{*p%cD9)8 znki0S#ba5`M|*G57*zYe=KLf=W>oyf+VqV$ot+?S@K;!v6u8n7NL@qe-B7SYihA}) zk6T4{jPRMU=)2HbaH)-qWm=MN(z!7XMSdIfGg}O{R=`VC<(f>MXT_FC~JVFycap6_-Pn|>RTP`;7y-qwv-1GO#mv6E4{wYrP+gl zVHFo|P1nAsq~8 zMxuy0>ZoJvOB71TxMJ!+UGcp3usI^QiXhn^XE-&@M!!TNW=rLW2Ag`bOhVZ-N)@;H zvyljQq~nQp70P`T-20=ol3K2KP9hrKoJXg!{Fz&nMcj({D81l#O`6-a%Dk$c$598W zk{R_X3*Ru>#;5uM7ORIkYM9_MG4pPwY{#abA2O0i)Ku%=^RV*0{b>r6(B^@Q5EzPc zQQo$z)q!nCO$9biWr88x0Q7<;+&b3Dsskogs*G$Q*YXr$3WA#FQ}~r>oSamsO|dOG zbLKe)6H?!;-qxkP*=YqAdKnEj`X>@*FRGrTtX~4Nda-r*FY=$t+N?k|M&cFAoF$kl zs;x013sGdk2U{QrqPp|nX}L{13LV*onW@sf$ty>L+0xQR!c+MJGJPl^Zp15yG@>>O zxvxtnA1OgAb zQZ=vS;}(i;YAclvtFT#{PAh!Feur#i(rtS+$R1L4JJ7RspHJlUi+JLIul0WB>61m4 z4+LU{W#`wI(9EsHm1JW`n7w^Ko=7!{lpBzTza$I4oR#gn*hdH#7g6m^Qlycco8PD1e6to(DL_;Mu= zt+JnimKlNZowxR#ey^2kMM%?V1fMy@Wo8lO$kotV7a0?bga<<=)3|zbgyor8dE=VR z*apD&UUq7)AH8q>{7mKBq*kONLwETn5&;@oDu3c97pq8Qc-6hQM*vCc!ps|RZDEj; zVY)dRK_A=q(g)U(#+nE`BVi9FOnB7V(%)oeuxiV-C{C+=q)5a%VEDq=+f#u@xjjd) zBakcSzW=^em90>9q82w_m|_f(KE9w-y7V-_jUD7&BC3!A?6vk9b_ViLkzQ8!ocyfS;aldR=|R zWXtP3lgCjX8g^9;^HU!@-W(UeOyFsfbaPl@)0kK#!l*2KZORpTIvj3c#Umo=?5W~d zEi}BQr`f)*z<@W}0I+;w%yt!LmFAI?SP4gsL{w^;zj|=5$H}~!_|$V+bzXd+$dzQ( zI~SW=VxUOnywgAxC;ck!#QHf#=R(mLq818wqr3(r%2$|a2=|HC1t#&m2rtf#bD3`u zxO`v2kLJI8nZb@^TDRNfp)t==FMm#ynclf6SUUJqHWQOdGeEq(I8^RF!=AE5cmCl@ z|F4`)7Illwuc4r}kGe~RaaWZ@!LIx;bADU_yb}pUC6?4^=&?%pk#dDT(a%O?V& z@=*Ql2YEc&C98R8$Y{NvI%4IXr{w5JOvj*E3d?e~A=G#VPsS5~FHv5=UkHjqAB7h| zIf~sKL)t76M8jxuA6}80&_7Uk8S&P^NM%r!gV{YOv=>neK}Ju2kE7VF(@jN8g!7_> zNIVV4HF3XoJ&gC85VvULevdO*jq1IQyZi0c-sNNC2Ln(~W*b6k`d z!;x0{nQG#gCH7%wW~wp_%TXu{m2zwpn4jYY^|Pko=8k?ZZRvO3r5d+@uM+K~A4g}f ztM7nA!za3e5}O$`40dmrh5~47RCLcVF%s)>+blc4mXk3S*|zV^GlY#jq=JcGNhmT= z&q+}=SdeEdcrEjx#nDsM>1qYjhAK)UIZnljcA89NRXtA%O@rO7LsTw{BNMOJ1mIJ) zi`peoXNI9x9Zy89M@LP`U5T;i%>y**C3N%Fit6;$F=eoFIC^P~6n@ytdcE;~pb|Bc zD>5xXd4EwPQTFxVpSA(-rw_IM-0I-_2fpTW*Nj!V*!dqd7O?ydLgf;j5* z0ErCj^vC}S4DIerG=7x51TM?=J_ZMA-t$Clv>H=r6#5M|GJmt%<)+Nn6XEvWSj`BJ zr)$?f$X)(F@&Xf9d z37&)SB?qArB7@)|uxc&VBwJL*L%{jvi+J+%_vn|gNR08ve01H`0VJzRgw`-W*~lZe z-T*QS|5BF-mNgZZ7eFRouk%9=;7NYuyk?T66j`(ENg5%zqz3$uhb)pOfxWPNPh1xcb$&Nn>1=?CvK0EJ z=vnw0UJxeH=X+3}dJ&V79{kMF=d>fOG#kEB-}+R_b#37tj(T7ZFeSy*S38jqHz6IC zv0z;p{tYeY8Pa^nt^lpGm&OK zJnSb@DK~pHojeyl`F-i1a*0xNsjh7`w>AeCF2L0kfq~y@44!9KFzs^pC?%+{l3k{Y z;8!3iT76BD#zTjEAmmo>K02~%L`g>&tOa~Y%)eLXvyA0wc4msc-`@&VtVDM+7dW`}y{;*u4=w3whtlCO@6pxgI!LuB`ASmX z*QOJqKlM&cu@k~HeU+dT*hytK7^(4e;Mh}Q4C{h$@+a485h{^cfb!IF6N&keNI%j> z;*Axyr3OFkrBuhSoPEEdgq`QzABh%qwfnsFOquvN9zHPFvwxy?E z4K6FH8X!<;>PNjwWYVvl2~G})OdNX}q_dazDr|&dI>coEG|d24K~XZ7=0+WLlo3&L z+voFDA9eH!Huj5RzCx#1$X(pXN0FDFUMdnM#M$RD-1YhfKHFjfd@sPohk3X&t7NQH zb6=sp7yMCDW(nKh_D;N9w=0y$bE<_PeQ4iX7u>%ygX@|~ijM8Kzr?-lVa+2=dym`K zea-Wt(jf_X7uH8gO;a9RoF+^`%}n(j+M1lG;>`9M5@b@RQE#d6t=_#E^h*nKQYv5@ z$d4ppn~}?zZ->M7r>uI5^JA~YA3gbRs>rk3boGxH-n}vn(IW5^(=bhUL(oZ`o)c}I z6~{ryI_01*?|$)ESe_OA=eQ<)zzcH`hfX|8QITpP8VZYfj>`N`yitt~rlR8G0#=Wy zJNTv4q}YUaZpW&2Eluy=R9Szus8mh7J zDj#+dp95>%z?9}#AC=<^$un@Kd|?hrlz92^RJX1j_72ftN|Hxt!Q>_-uEMToHV=Mh z=_Ryf%nZ|At@!lQV@&secaRNNku%wh4<5q#n6z(9YPRMvV|+fJJel6S)lzckoEg5PHd(M!li9J1$5+#0%AM zZUbL0c~(=10=~3qvCvcc)XEmphKrGcd7#((O~R;0U|VZRbB%{P&ZO7``nLGh&?gZo zl}rkGL{CnY^+$lMHHEHdbzG{P)f|uF99j0v95?|3@*7|^2c~tp@%zJ8zo`($e>Vx$ zmv;f*mSP~_d1KraRw*aEnXKR4Nh|e=?wx*5CoO^|zL2OPB@M2r*up@)o}+|gg}9po zCF<~T#Fux}uXEX4<64B%bM0H3Flso4p<`)rxD!9na{Grj1>vE&_0gY>%nwm2RG-p? zs2p_&K(se;cQ_tKdzP4k)19^~q(7oSSK=D9)s=enWGh1P0#sirkf*RZ(U1HSZO9YX z`qvVIkgq|o2e0ov-SPJFEM?#>a2QJ~DEMIEWWDcXvvborhcH z;ix^h72#Ame+=S8G6FYZN}Y;1!^kNX$QfKXv^wG=;=C~Q=ZQ2D`M7M;e^nvyD9!{r zK7QGfFPTCykHmP6+EGQfd-@5r7^rQa5~3%Bly`{unIT!0Mk*m@y%H04Ku<6Pdj|EI zbBkz5d}#zQ2J%N&WU@81IbWy~>eSS5k!FUu7^S}yqhF6dq@xB2GZsiCoyKIQ z`podaG=*@)Nm1aEWVO_vd2Ix-HAQQKVacSJR7*oZb_&z=s127*2T!o@ST0|~5L}KY zi!CCWX7Ij4N_{bo^Wctk4Iyn;jfKf7J;jhh>o6|c#U*L(iPTW zB+4V$>-6ZGN2b5H!^1rJh%$XYi!Ol0_+)>Y-2a=#OJt(mcd&p*ki8z$fLC@9RK*j{ z4q1F<4GBA9m2!_wG`b1}>-h1&vHXiLMD%k7QdZh+-$I#=^s(C@<{J#8&M0{;xez^t zAD$;Vg_Y(sSfdGcOwpszo~rU0$x^Ojx)R&IlRHb{77=R!*9i_~ zTEX5jw4w0OtYQX(%i`v_ao%Xr<;_tV6!3SFN|6C??PfH?r$y&Z>Q!sRRB4{3TlyqP zHLgj`+_NiBh_meu;Ur?&Cfbw}Dvkx$Jl%7-`e9&Sl>HvvX;Hv3UsL4yoLUf7caaQJ zV>&`SVQhfd8zz@}MxLZ(Lg=Kbgrizh@g)i1KW4i-;xibiCg3@xe_ic0_g&zEWECJ) zN;Zv9G8Kqrb@?hfVe%OqXF~J)>=TiEx1dW&0yA{=W!>{RmA9~{sD#ak3%y%v=nGhVMiF>6SAlo5w)-^>hNo!dkN69q~O+Nl<-xY?<;C#TW zWl*^KvW48KpbK53QyJ{wN=|H5BaWcGDqA~1%BOBwjqkZh>BnC~DubV8e(D8Uun z8K+jnmb%Stz;kdysc?#}@~3slQRzpLRU%z*q|K-k#?jHx+#MVDBcnD{!g0-UyuxM; zn!Nrns*l6A!j5JBExjV>WHijNzlrPMPcwan5+@8q%(P;lYT-|VB`tyPOHx;HD_ZTh zq{YFFqL7CBLmeR%T)rE%7pd%ru`z;7ok$(hw!nuMI5n|8%A{C|t~Jy1)=`U7Yc?Ep zYTeo2Bi8Gn4?W~K5RV=2hDf`MP)mUit}nhLB+^jN!0paAfW{VsMar-+T;HiI=-FJf z+>X15^eRl`uyk?dmO=}K@14{67O~Q99UV?(`T& z`YHC&zjz}jTkD`A4~h?J))J0#xV zPy$Dr8S+DLl?*upbgdekGU4e23u^tP?^?C1R0k_fBj(c{)2OUKOgh=?`4Xq_U!9c;lPwF9qHXlGHf^A^DZ|jIJ&{Dcr9uvgXW&^$cPO(_}$JVmh_h= zjkuPQ_Vg%wUIq~-mPEU6E4hT7s7u$Y5tB}shsMLtEIX}|6M&(COphGGZl+}K)-g6T z>(8qs2`%7c*s$2OD$=2VQ1iu}0QJe+QLVw5vOE-7Xt{28tO}##p%Tr3{T}${#;dOy zPl6iCP8A1Jr!JnT@5k2@8V-k7WL&#;&hOmrpSgud-fXX&wOi3%6*y*+^ZY zJiqGy)qY-X5z;Gtd)yRqG}NAiiz~j)eS31dC;iQCBxDyx?t7$&#hYG7`C4poxYK@f zdW!)4+CKE(1nv|4SKz+?5)V-x#3vqfnIR?^J)qDAciX0An2L+(lCK zrnw8o2*wrEw6ld+{fE%7$-2Vrb2A&X?{{=@` zPw)Q)wVvBu$VVD5(4)MYt2d~u7mdhW@Iz4D-%%xLMD8rA_itnIf{44&loAqu8SB3W zbX0ZuZ9ij(Ef|PVke3gGTg49I;OI>wB=9>cXE#rMFb*sjyYip%;Fg1Ud+FGD%DcI^ zgApb{yNmo2%aQL7nf?mss333fM>xkj!Tt>AcsqBy3gD?JsVV^o2nc`*_y^psqdZiV zm$%T-(^gW|Py{ak0E&v0ySp77XV0wZXf^jGBfuuwZf54P?u=O7>&mHXN?d}cIDBQs| zj#joH{1AjWJPq{ZK{yhGaUA{yTmK8Twezw80OUE4#?{8%6Xb)O0m8DjUN$aZS`bFO zxzicMft$BF07yLm03))PybOLFf(Zc7(g5H(_4f9%;O;j>>BF>Zi800IA;!TrDDok41Q;1r~z`8OAyw>)b+JAZSc;hE*x=b7et!Bfh!YX{ZV z^o2jM_~&Z4rv=1jG#Liy{FdP^zdOEv2Bq=>oWOJtz!!v_!C!VDz4xDT{@Z$g zN%fB;cl39X|83zB?~evef&b(;jr_rE601M(|3!P--+9Rc>wlNfzcq6EhYz3xmX$ZS z+x(N)zw`YU<-a-Df%*Pb%70kh2rPRV;E#NrY3_sE-2W^CyWbk$)eFZz^8&o>px$6T z0_5G?{XKuXNj@GPei~WOwb;?zxkI13D7LDuHe4JuR?f~eziGT^Jng*fJbmqKx$e^b zanIjD0HM5%zwhg0FVMYJupvX9zH&v6r{goN2E$Y{u|~?MfigTqyy3r01WU1S_V-m z4e@XOT4~6Cqf#^3bj#ee0?%fnNQ@Fxw(wHWa)J0SwaNPokj zB{+YlwJ*W_8+I+h`!g+A4yAwb0R=2Y{1bl%BmE0T{Rajw-ECm5z-Mqrzk@+53ybmc zit!54@Cu6w3V{~Cv;2R-0RTRz9ikXmeL(+u$Kv;P2Y@~pL?ESvf@kr+&S3p};ppw{ zF2>F6>cwRRM$NY4vT<|ahFZCEgTbr00STxW)WzM!&fAIx>f-F`B?gtG`%NYW!gpwH zI-1`k-cFKq4>fhb8_m;>Mu1Czi-%6?F7CF3r>(u1o`TY!$-!TebbsdP=jX@e$Is>F z>A=k^Dk{p&!^h3X#|ct!dilG0TR}Npz3Bg7@)sWk@R95ZarcI}xzgP6wX$~e@s^~c z`yJpLB>KJmA*YoODCvKvnjLt%{nibn;QpIEm{I~ni0RvTLady%d|a&UJf(#Bcm#Qc zM0f-xxc|$wf3p0YPQ%XCOG;6RPlS_~U(m&c#-5v>OOR8LONa&x@NKBC`3HyJRR57u z+t1a`Qw#JpQa-Luu5Ny=e~|uz{tx;)9;ymbLV|+)f6DbI=0E6^Af7IMV9Q(TFW@c$ zIhVj6-2cM;E}}oo_FIkLEzUo+=i~d6_}|F?%*5Hs%kj>)f8ga`_Y zf(&|Fgdp%bfQ*kqK+7wON~mjvM(07q7nb_s9=%*`C$Zi*jDg?UGaMa*gp}+)IU^G@ z3oDy|ppdYLsF=KhqLQ+Ts+zump^-7zezdW*vv+WWJn{1O@%4lH2Sh|hMaRU(Jxfc^ z$jr*ld7fMHvb5|~`Rj@|b?@sN8k;^ef9&e+>Fw+PJTN#hIW;{qJ2$_uw!X3XZEO4c z&X1$xpC`Xg&*0}5cY1-&;t#d{*6cs@!Uy$21j_&!?M^QQL_csx!be7-}{{Ks}zZLsOuLS@L2>~oT zBz!;`xZ-<1*3=ih|AoqaLKr9XWV8%Y9#ubM$u!Hc=DV8{XVJ0sx<4?v+^n*b$)5FF zxL2syPwg-c2TNByRnawhA!%M2l)eaL!o6n~m>Kc~M+r#h6WwdCU)=)wK6tKcIT+6^ z6j*Gs{4Y? zPHS7_yk40AOx^=VeYRt3~h9I582q2R5#yiZ`IWwBCxl63OY7|JlScJxKx z#z>Z9f{NYaxb~+w5pz^q)!#n`)n`fB{Zy;dc*%w~nC}&_{Ql%Jc7KnFtAoEnCLl@C z@zL(-*g}cwfa3jgei?$MD1k!}$)sB6cacKWiRDs-4ZdgH7h09U?-u$B(J5E)i*8yS zLb@KiGFY&?qIXI?d@J8Wk|5(x$KZ!QhMHl4jn z;oK0*6oF)g_dc?710Wws?lEfI&Ediq-9$*398Js``quctJmf?EGhm^iCVD|LTdd(z ziXVaQ`yw~kyK77pO{1A(lGdbYhMcv0JKN36O%D^BzVF8e{)}wOIxW*LUiaFSi+_zm z*zWq~Rg^6~7)sz4P55|}rf!NRS7Zbs*~8#!Sa(W_+6?kBGpcg>>qiRM<>QR2PfGsx z4;LzX*JHh}`zG|M)<&j(u%nr`x_Ie74IlaO$$d0U##{y%Lz8ub&F|^y`$*Pb&SEHN zA73WxYsRmwEIiApS`U|8L>zoaLG`Lcn}Xswk>Hotz^0H)h20D%ms$O+sHF%4fya&v zxv6s4=H#;Os~=)|5}Sx4@WqJ9YPu?u?+ekX>=L`oo{Kp5mJ&6@<7VDYJ&* zKYUOn;;MZvkelCF2O;dY9!En?0lI}J7ed9=D}GVfAu`nE<)@{k5e1tWo<#qEhCcf$ zEVh{}K+tZwE$x86S_V&dEUH&}x$#IEXP9V+9d18^x%j;lARA5hIOe0y^XO9^N_y26 zk=;%Gp5iMz)M-7tzkpViqHT87Ntk&y)}00Ev)zQC$;pnsmb#aSX6<_owBflzcIjRt z;c#alTN1tuf!6k>uf5p~*+w zc&V3ONjLDb@A5n$P$GpG0)fk&T293<sxtGg}dj2DRzyFs`N+ekD?1))77L-92xDbe?TP=7MaliD)cvSQ%SB{K>Iy(L+QgO zKEWYY{!)8BWCuzYEMc3etpb!t)5pVI67g&ak)HW&lAkC~tC}`e_RfzmPyHHUnxlP{ z^eU76aarq!nhzV)A1iJjyVu2KeH}=s&iR0ykalkb+tV|PKSnO8&H=M%{Q#{M(0m0^ zm3m2in#bXu^(7|cE7^D66~QSubP+Q1YLG9UP@D)=o?d7pJv~Y6hWO>W_PoP-by)B{ z$6J8FCj{|F3Y5ObiEw9OxF@Bu@^gA@ES=tNOA3(~qAKEth>cc#c~+vE2aT%Q%8c`) z(;4`1`%tkUS8v!%1oIWW9Flt}cJtC6`VaB+<>zZ5_`@Nk&s&tq<#Zd_YiL2+Ed+Sw zx^*2Q1**aGSVN+zF|SP46|+_s&liMZJYFl+ZKGh-Ccf$Tr3XDUk6Ry|f4MQ*wQD?e z1~)z1Yy8ndlBF`;W3%)OSlgcQKE#u23-B)y5+PKMmQVWN8bH2z z<>m0I?49PzQ74M7MJ(2Y#(+ZhD!AJ^HF=;-Yk}1LEAc4_WpC1)6Bo8!gN#sw9V`to zJb(IxfSKjQRf}gIGr#UPCd1zM>J62PT$&jzV^1+=ja{foB=nELg0KO9hlm#YkLG0$ z8q2+pAE`;yC%d2fZ(~kfvu&l9A09b3@z6(@1atou- zvLFDLLktMkwhdI(3x}FGfK&l=llCXd`gE2qJ1+Qq`|*WV$jxeV ziIh1C?}M?gC^cJ!wF+Q6hEzQ@AaLd@Oa~?BY|~2_`VfM5#m?UGkscyewv^3V#HN6W zT-D8iaB{fNN_R|60(Yd|Ka7&1tHF7<@deg!LQ%ulV~-QjY6TbXKRm)LS;hVoTK)y_ghCu;Fw`O+gZ^!tNp?&ZbwuhuTeD>twS zR(d{mF-LBg*e*;gjZlR0Mrpg5o|xP`(0bieNCVej|7>l|D^Pg9-7xc`Wm9^1fOSov z-+Co`r*Qb9-k9J6s$=cvB_C^YC!7N^QrKPgKamyVNNXP*l$B+~7}OK6CC1*zkP1o; zn1nSY*|aeF(7V~4`hMnsW2tW1oKG)m6YnfEG%Xk_s$${BQZD6hzfuaI(q1#USTe;K zSkxJNHjHI8hdHY!JK~Xa0;~|h^R%Y~V`(Nzevq`|0=EG9ToB)nt?|u|gP}sJ zZ5zpzovl@MW)hzf10*A!9>W6gQKe}j|3jZoQH&<;GN*5g78W$RzopsJ7Y}aU2q2I~G2l6w zn>h~(ph<~mspyM!6V)K= znzZdyCGX@G7OzP_cFdt*CUoI=P#_p1PHbarBVi0hQ&=}!7q(n3*4L(|-O#aly_EEn zeCLK2g2+iN_ko&S(YZ#z<{;lHKG?@%?JUZsc4}?1+UD8%$hw#0z|SV8X$`C7S024? zflq2~CSe(-(FNbG3z0e03LkL*NH8LVpL<3GYCXVkKhjKjQ~1_I2%muHPQJ%2u>023 zn{Kx|pz_?5Haev_zIU%(hD#uu16{ZRO$wDR_eLP2U#DukTuM_WxCJnjV)#Tw40X`0WvT~S-PUh`Jp`xqAPq+g^mfSelOu6umo50# z$k#4}ggSxV)Fz~3UIuRw2_3ZU@&&@rxa?fZ%_As$l4>k-8Cg6}12>YpT0>SH5`zh# z78_Ty?W8TVAWJ+b-jeybFNx{J&O&z9Xr84j0(vtcJMH&9PyU42$z|H>7q@^_j<=x)4P3pT~)OY1-W0tG=?3)m0V#lcDl~|k~Y=8hWF61JkW%<$#?Gr_7pU7kSoEe%b z|7J7PpZMf#Kk7*Q)b0qk+eJ)zUU+T0cLf)kCjKpLD+CYzaYesA4YAyl!=srNjP*^Q zZ@J#^4W4>Q&%8HKVWJ4T+$e@8dadoox(JdUNxt0?`uHOD9;1^L*Ewfo4A;HS7Ha|s z$N7XDGdK@I`^dJ7E0`1%xq5Yd6S7>{$E9uE@B>+4htC34q@Nt(!Y9qfU0Zm4P;=VI zr}QSkuk12n5jLkO7&ihcRMI&`8Bwd--=*QqvmGm;w?M*XOxg_GWsZC^KjUE(;2*tSZGY{1X-bEJ4iB=S|i}u)3`fQ6-?{wY* zt5YlUgDP?v@CXW*PWJWrfsugKqOLZuq{9zM2%YZ-_=;xB7IZJ}cSnu+TO!E4@0!J)f>SAvJ9E zI?$l5XiM5ro8VLJ(miVS@D>7buOvsL^OSfS_XHe~3uEmKB=j+tmd0d6m!62v=e!XX zmDKfqS9or#hn=`d(rESUl{Wo08b{cR^Senta+B=SZh19_8Ge(Old1|dmq6aoNQ&XI$OZ+dvxd z0~0>TSYso^6S|#}2FYq^eP6kp59Z}j4DBssq%yC8D}`GiLRkt8s@{2VP)Xf0nm|$k zA)0+NVLq>t^5!i*75QT3h?Gs%Mm1AA$(73`?@q4teqKo+7tA8ojbXB3-$rBH^mLWJ zHGTQ(J=JsoODRSoA*&B6fUq8KOJ!#~Dv(X$g1Y|nS8s4fNT*rI>Q^`L5z#4e3s_$} zty_fM&_WM;#0sMOq_^na8jgOq<-X+LQLJ$`;pw*9j=plHwSQdsuVICwG`6CP6Wq={Ux zDelm8ME!%6iTPKfnXSM#(t}zq9i5|CPuD{w#GDlKtqrkarW}~EW)(usdbld57$PES zur7j$o7OOirca<;u4->J5*86*JYQNIt`{yAZ|=?B0?6OT+gHn18n#}-hWe!#rmk46 zUO}~f_OORoL5RN`GWg+jr4m0kL8KPUDI{A(0PDlXWunvrVQ5&11NNE6+54-v@@lyv z2l6sVp~{13f)`&epMr*|5^Aq)-+O+9w5}Z^#rA}XBd_bijMOwZS3tz2^kcphqpI3A zZ;G*NS3Kyfab#Kx8nD7?WjoG8w*aiy%$40Tzt+R*TO-ZWwwy8$T zoVA&vH0+3g0Kye~-mEmX-74InIdL?&AQa9-HQrX z$Q9nusWXf;+H&HGb=BW_?}eE%`HG6if$F#9=IXFtA#i5W?x7;MNI@|6G9)0u0_zpr zdYK`*m&<)Lpbpvor^hFN=iDnv5eTMhYX;2TJ(CP}#a4x^vx_d;8sjx^*|8n(k|2JOZBgN|VXDS!j~W)rte9Ux}V`yu+l5s^V#j)%|r3)&BFd?p0Ta673Nh}eMIxOSpxi-@J z9q%8Aj))t~G^+b}mRP=_PU9~WbI9$7-PC>bjUsLXIB)*N;9~P#6|F2d zGNcnzdNnx&cH$D!-$nz^ezWXYhynBFfs8N76SOb-h=v4=v*O%4wmKfd5zWBy=s@c+ zGJQ~0B-y>tQXBuu__@)#Ogi!9r%B(*grn4cXQO&I()7f6vW>0kukqDzfsM77ogZiW z$?J+PHfZ|4F$RX*0w{Q(pQeJkowC6{!Q{KiN#pFMU&8y>t=2{x)EHwSwyAMy2T~3e zpHe3)f#4vx{Cf7YUgV|#ifAsg!BQy_rm)& zN73sGkF1XT)-&+bqwJFV0$#qY_OVS{8xQ*~&x%ZFQI%~0gJ6fI&aAAbwc+qNmzo8? zdjCrrE)ZGvsepYwQqB$~L-NzU$o{j#StgY*av2><+EJv+r!M_h zGh`Gl7>$e(f#o+G2HU5q$YropMlK zne9Wp5>^rt(kPp_dyvH`*ft60fOg-Y|9TrJTywM?SAT8q_N@W)Q%>8DbC))^lMpa2J^V>;;LTXW|I?kn zW7HHlWp{&%embq;LEtKbE&mdWYKB>MUXlE0v%78yaa)O_hUsflIEt<83tFw_2vTF2 zXqP`4Ui(UWvf+hQl@vVwQJHISJn;j)>!T{@^mVcHYQ8jyw4DXvg5wJLNsjlh)Ub3* zA>hfgWJ95hv{Ef7ulK2~S(SO}!SgNI^rX|YLLgEEOj1Gy&6l+gJawZ^1N z5wm_Tfg&n}otS*|c?thR5_ZvQ^Yk(x9PlnV20{P#Vk_7J+S<*ZnW@&s>3_%;f| zLwPpF1P0118;#D9(g=yZ!IE;XIce$dZK`*~Ce!>cQ}7J-;3GsqNx{ zr$^3|?Z7XyS*0SF=1QEA?pw*0RHdPgboFNW*^1A_xJcPu0bVS)&cG;=$NHP0V#pAW zfw7U6_92DH>HTW&*>=lYfEsF}S)?<|TpK+xEv$0OA59pq>{#fz^31WvEde6D6MTq;j`7FmlV(& z5#p9s{OJz^t*rT{qG~-Mp>51{QzV`1ljeIBmT>{)Gy%3cXnE~X#gT5L!nFyuMf~Mk ztkhj{cFS&u9rVf1wUob^XWjx>8ygjqJl|{7?)~5z+oZ14{{&|SyYx##Z@=49J?>|0FuFqUQW$s%h)Qlo0IP97= z#gQ7qT~p`bRfCVYoIc+yx;{?*^6Z|DK?Qx<(^W0wOJ0l6OMPW$SBVYjqJ5K(I5L(L0CO^0%u^ilYKj^L zfD+k{ZV)c85<97oUEXaKp(K79k)ycuMT+)8HXATf(}EwaKb)u!q1)n4Jqbv7*BaZdhV$k zoc*o|Ox;CYV|du{G$ia}b(~!@JaZj-C0sS?%tyPDk4nYImOEz7g>QkR-jq zi~`;6FbwUAi29W5s0r+jIH(tR_A9FwkZkLSC1o?_FZ5^z;d>{4VH=cb(#)7cdq68q(qjwpF|4& zPdwt0S+tZKhK&a*)mm_{?S!&+opTE~bI(Wg6p|ltKl6EvYxXJhk?F!Nxmj+|@O((- zW`sN24|_nzvS%hRp^(l`m$Vz~a}Ps!#JKG@oZ>YAc>eKo@b!rUCow&o65&$J%I z(G#Ecce}yam^*HPSSsY?N8?fqaEBgWy~A5TW4vj=g=#WdPj!Gk{}y1oY6PpMHu!Ku zuXkG{Ts;euVhJAm`0B;m9pUk>JMVY0&RlG~N;&v4l#&#w#du{u@{iJN?pL=oSipt5 zR{_|Md8nK6bY%`TJ|`&1UrOu))m2YFsZ>>+mxM5eVTa`98t1kL3l!uw{N32 zHP~}@QBV2`s^E+mIuX?PYY=6V1&Kl{2=@kuWkth!JmcOVLH`|pVrO8 zE{)+aJ>+FE;en#oH41ciiY!GspB^V5h8E{BSS7uq$OSIwZ*T;!Yo$o8Y{A4@f#8Q8 z@Ss1tmKkT)rv=1wIGnkSOiFow`0mqo+~5_bedWOp5%-Incg)s%RJTP|mg(p1^5zTL zM)FL1K>KRDG)%oHO1e(_ir{^}6c1dvbot?v1#tiw)9^Egpo$r;DfiNFDE&cwwXm9f9r!LGjew`wO$aHaM!M>O) zl|(e<>wH(M z!2*-8qb#}%94J$4N*S*)Vs?JsNl)z;VhS8vAj}OptzAAmATG&bOcTYA#z++ijo29u zjtJ@eAl<;+T{O3QdU+%q2Ug}$k{xr*F|I32uUDNRuiLYcvpM~-!tqvCSl)H`0T;&I z*c4n1Z|=WOe{GJG?{Fh!x0@U|`&Am|3Xa2xu4*rKpNfs>DS5Z3*+(GETz;_m;)27pSu=uirM=eNiuuL6SaHZJb+`Y!Z+}bjIx61pI6rJHk+g^_#4>v*;x`(jPc&zx4?id zuJ=a@xWPq~yBDsjs>_!#4>7o-YzswodY!x^>}3kwls?DtA#^bKRXf1P!FwkHw!M$G z_WHyvv7JbY3;t52A!F3d=Jk)10T+r4*0gwnIKI+wYRMp{36@sfAI2R?!C`F&pGe&KJRm$qc`XCWj{y-uq0;=(1&6Cjh8;57%AQp z@&4}xJV#b1d}$MDyna7~7zAD%Cb&XaoF-PD!^mC%ElEsm8H1#qSRHG9`TM-a8e!~+Jb^*WEg>Saeui(sDSQqd7`FUdn7yqO(OG~_GiZ1+TbBF3kQ<;(c z$emxy@9vD=f71P0+ZR&5fqhqlX2uZY@Whmy9h#sl)ekC+mPg&EU_!T+@!v;ZmBFri zDwbnj9!m#@rz=yU*&B2H@_dXU$6>^2oVdqP&1WpRbBQ1+$^O~1#!$~5F%_p@Y1-gy z+^N8!Y5;m49y&X85yL)-A>72cZTUHgdiTwXHq`r~(({|%Q6rXVZO}A3bM?G@$;>4f z*&n*q?nZt`y*fhYLOPrjP-NQ^GT+^{w9Ga+9p`nS@%OX}+J1SrtR>5tFuNRep-Brg z+;9xRh!%1zP7446h}PhYRA>~m1txUrR{>q==cwrP=#{!Cb@>IBYz2t8iW`g1Lp|&O zBE@gbY;n8BlcX&8?4dfDo)Vyh&G(vqGup7=Ne+v9V;1qk*M%&fu1D=Xy<%cwP8^tVv6SYb}Tj${fO6+HY00j(I!qr;hK&niw* zKLACflvoE?M5Fc63G~>;K-a&>NqWP>#PH|OvH2&Y9QDTh^Y`34MicY+soLPb1*1ox zWE&jAx{(IJwlsr)cup%7`jL9Gt0r)-Ja@{^c~=FNJSUn9)-$i9zFyKj2OSoBBsb40 z`+MaliU)MAk>sqfMa*;n)y_ywUVIvs(Ej&rhCcKBE7jt2yxq!SdAc|(?SII18@yU5 zec2HYK&1 zZ%JWt1kx8TMszs>A|1osGHoxPzgEqZxwn1WX!ZQY7AzXh3?qJNI%9ca+YaZai+KHr zt~g__aXb;X^=bf5S(mE2o_r-O3+%oD-TZg(zWzawTCMHSGk90%mZw|nB+dETkC;cy zJzZT_L)624Cq+;Aa}={PAimj;k0$mOz&8g&Ob?QH+W$eKvq7jNI7nTHRrY`91!Hzz z6ZYwLQTia8L^5}|e`V#Z!MFBbSMDaYU%^!x$QEM=_i2`-UXGtg8u#dfMYlJ_qg7~- zsp4FJIvF#jv?=)~6m}ckx~$l$E^K@1jim2x?!*d)Cib0p)_{TRvULCRr>?Roe<}W^zyI8+YD? z^P*cY)&C${E+t5Krvrw@pU|qZAsR=yGWz#WlS4=8Q^nYs7yo_B@~BOf7K_hx41dA2tbpduiPNMhZ&p_h2Nl)=l>)|2Og_{>rzIq1#Luz^hUi|D1#K zT6PM`ZO;_`{btCaYNt`e;e-D6!_h|jQmN1On*=j8?`!ApLCo&l+BS;*juZ1t^3FGV z_uss!uK#M#k`zsj5f;4;Be6%t^a)+>T$bO5(YapL#jnuWJCWJLap&p*zmlsaoTb>c ztoCdP`hyd%y#>Ct_iB=0F6ca`a*2FpMNJRvn&m zt!TR3U~0L}W1w#Zu?<(8NpXOjfE-qMp63I!IQab+y`!kL_*A3s`b$UF@Kech?LT|I zKzvvRjA`=w)E)EM?{}(ZnrGAcZeR-0r|H93vh6}NrUpwB%%BDV8Tr%5cdc|zAh_i6 zI#0<|p!%oA0M?P%FzFA%W%z+55bZuuz31>cN2sBjw?sY)8`l1Xx3!71HFe5_2xh{ zIa_aLTFztpsdvop`%>q>@4!`1r%!&+`Dq3x$z@vxev2ovgr*DR2jvH%&(`mfc0LDc zU%0BPRLPFE+p7t^$|_Om zJK({zRx&sxPfBV5cP~$)^zVx1(KNq}A=?%_*~fa*p9o_G(T*0%wwxwMewy$J8FBM_ zxSdj|H{;Fg*1h|(f=8O96bX-}i&_(Cv0wXTSEo0jmo0+}QqA>=5nZ?(Jh75)F!YLN za`bi#yrC-Hai%MMn&Cpj&E71X+kVXwW+w3v+AGk6exumPm=+!o8COlj&_z9jj$kuJ z;$|U1-;yfk26hl}JjYI2=$hSskTxsXO|Uwh!)E`<%beH#3H4lR$aSxMeLA<@u(yUh zZVJ|>Wd(|}=>koouS=qRm>;AUp)zgw{nlH@@rE?7uYes`wo2m>)J@QhL_7R zt>Agu@hw54S}z|!nih2bl+PF&b(Mvs7Ciklat0snpPh*67Dw?M3~IjaW*s%|l8%R* zM1VC2jZT`YSx2TU!+weKGOVMC2>vcvIinTM(a2V2SPXzyy;UtRCsh zZ{59HgCFx=Hn(NNe6f6HP^QYw=2>7i7sbLPF(Ah@fg%1zh)$udf>*~hK3;_KIGcnN zJzHwEC0mH?B(Ljg%4cT-5+wDei29aJZF13n6+3Fo&M36X_q zVm76oFy{S&A=)K31gWrc^o?3b60CYl+w?x&%`K$4c=d{i2<}f*Ij8W!^Dwr(_ZW#z z4Te(#xx>q!cCP8nC0}M@#NTIUE8alrZYA5it;ZmyY^;E#%n*~Ze~AXp{67ioM34$E?8}yLFB^Fd(#EqOUyyXxBo%wz8|Xqbk4~ z{6a394?9*vUOo}9c>ERV|D+y;Ovp;=W+9$szE;wQEZOHzhL<|CdIkQ@)R55cp}A zYYnw^(cX-M*K49p&jx-H4$62L!jKxOkJdaotGSZR-)F2Z&=okXqPH6qfa@Owq)+8S z$rJEu;W+Q*`ud!WPWP7Gn{F&G3cvhD}1V|;{1;EHszHdN76 zeQ!5BXsISpub=Aduq+3jbf>d!p}7eqTRXOc3}1K@N+Pwo-blWN<%#QZy9zPLkG9Ix zjULMm$|^EYZqjaQeB_%L;eQGG5jTbhG#*pYpn>xK7eE$G8NB_BhW{REw#els#`2;N zRnL?H9OvL|@WkO&CiE*cr_@Q64Tx9dzaO3i<;pxo&j@jRrS~?egkOaO-xkRycx#r2tS!py=BcVKTcI#f$g%2UdlX(j} zT49>brnI=4`-#inIxA$2{{D@86yw~OOT5jpC`*&n<=ou>158W7tKRF9Y|Cko_T` zhJl5jK9_~B$==%gx|Soesg8saXVrn%9X2uXi+ks5WeWQ%3Po@MeJ|CChmo7qu)7lpRIIPR@Sg+kIY!8A^I*{5Oit6mNO_JAjR9~E2oiBlZZ{SRypiSN=v9w53;fAgj-kI zon;Mv8vH{Kl>Fxnm@wY$-OtC`PM)Bde#qjykh*f2ReD#&+&6h$ekUODD{W4+Ndh$d zKCr_EU*(#$UcNxC*s`fqClI7&iX0%vFMr!^rDwFVJc8+Y54;m9dPa6CcFRa~4ae|W z=kd9x#gM=iW^^@|0q#6timo%JqQ#1xLed$6KZKbsXn0SE1!m%Ki**-xTDJi>{+ zaopT2czwVas)@1(P2)+m=yO;#vqFA9jJJIGO}M#2?|}T)WKV&Jc((Wu%SsGQc!x0F zB!i_o*W)9tE@n{ttiDGuivU=o_# zMay~i|LkI5Bn^n3DF8Bwz@v?q-i1FmT{eVw^xcF;aD25n;(4qRQOT91E*xFIW;B8lo@SBnk+C@l;ZyO(L zw5jMWOMd^rBLuD_mS#9=0D|gM%z&RSZicPBu604s(Ub#K=vp<~D)~K*)vy9SfCyEa z7aZ-hp~_j)uR74PF~mQ=Fq0cS&9N~{Z8 zK*H0PME*fS*^g)FTy^id!R4q&D#&q;cseY~8UBL|Z>8*OFzn-K0uj^;WF8QC5gVY4 z8jc9=)nP!nv+l<$VIye#)SVtv)1PWFi9RM3v9&>)@Ea%RDcLk$N9qg8(3I3d;dl+V)1_RRpCFbY!|*5MI02+ znFDZRV)a#idB-VI8^%yE`p^RThIJ$x+3_K^<)PsBk)7&bj)Zsi-u`EQ6{cN~VaBQ| zX+Jtnm0$h`0WR*)cuPoNvI;xCux6wP{FRM;;Xh|>^YgBFz-Agj+)v{ftAt%xE>(JB zeW%^}@FM!WPM4@Z0gUmZS~w7WhdX|?Iu={4nrgo+^QSPxNZL(-P~=j-6qcv+fd|xS z#s(R&*dt#A!+0zfe;O^4Zdmwp5odcA0_}Yx>U{?_ceyh_!%HMT1(D6E=PAU4nDR!8 zB7ha?ToXIrZRA?biNn=Fn&Zm!GIIW}z&Q47uN3H`}IMZXo+# z*_428oY7u!hk37@tWjB@nO8B@!4oGS`Z?_QmZfj1trxTGiOK^F>uHL27 z;Wyyb48E^#FtQZ~Yzj)X`qgv^Wk?B#^Dn`2M%tJ9>k2NZs=LKY#*NavsC*(RIRWVV zd)hQ1WwRLPlbA*mcO<`ed;gDe>U2Y$tB_Gdu|%^51E32&O#Dd#0_N&y9X5fMp_G>_ z$>X8Gv%LrDV)^G2OwIetC%x~_9{Sehsj=KiSbHe7=xjqXBZECf17p`-)E+AIADB0H zNxm=Hh5@=b``RBAkXa`c{C3!FC5=@M^px^uS!}jE%40p5ku(g%Mf*EO!9#zz1_hgX z(^8b~{)1R)ht+N54za`m&#Zwuy8Pq8OgDb)F)+D8F5^=4d(z0CHu9~ShtGZz33smg z?upvEF?S(U!S##VlLggH-IAk#gsltJjBanv_^>*GPVnF#WKy2`tLY?y7FZ5sTqBRa zT`U-XKJZSlW^SuJ!vWirtz!M6lyW1I_kH1wTy4mM&W;^0BWzQiu38!lZSC>FFzdN#Zr(bfwV5O6`FN#ySi!8D0(D93^9yFtOz@V!^z~ zcZzbflEPxhrRxb7KP&9;?p~Y{QAlJFi*ZSDpke@}fUUR3;^?t?F0#zRCND{lypr%- zv&i}NUjtdK2Gg!1d3YK52&?)0sc6G zT0Mq$adx4zb$@U~_v-zFv@Zkw1-*hxYkJ$MaR^^ujh<|)fR`6`e_i{IQ9PF_=jOzj zflW|&l>Fz>)i@WP;f}Lep>krAH?Z?(f`dmLD2$%rZDXRY(iHl_+IDenSsbv4g4@j3S_1RyEf=T-!! zG_VFF2bEUYQ>wu2(;+pp3T;(n-OjS-9=7qCa!PKH3%AN=z{xUUI?$+VMINb9*~iA0 z9!`p!JNi@VG4EWqsd%{}{?h&bP7U_3$|mnKobX`?Qs7=8LZ_-oh)sJkoFtn>ySC^E z69Ft+wSpvzp){!jHAhFMcHa4>pyI3eORY>1Y3uT9*mx}233L?{q?vssSqhopIPO}N zE?1VEJKiOo#%jECo(ZZVok-b%pGLR9$Pah`*_GB5Kz64EAA_lRn&GaUu+PJ7Kedr& zL6k4~oJG}Oye_PI)f5k-M4wys>kl}>(}Y;)Y}uqi2IOaGWDYv>(}u(6lt6cPpLqs+ zti~V*Bth!xRf);7M4pFoj1!x6AVlJzNu7YAV0T6JW_Y#6^xQ#0>2|s3!1TcIondd+ zm#eNnWS=}v2p9Xa7Wz_t9m<3u5TJ~xds$q?DFSP_V9{?6D(s`}{W?0NlX)}&)ngS9 zo_N*3rj)5S$rE8H268Y-JI=tdXs+A07{Iq5+5CE;Y3V6|pUPwAkbZf6>vx=`%B3?) zzPJ&Pf1q=7og^74Ag??=sivO=U?k;u!4YXY4WVDJ=B^m)7sh)$?t}0qrAIxk4;o@A z!w_sRh#hA7Fr9&1(@97unVI1_yE0akg>+cxb8EI6lMKB4a<0No&x|G!Mqc~-9(Ju3 zuv*GJ`6SPV8z?Rk6Pe`|t5nJD>S5LCi8gG;{fBu02jl`a@B1G=MDdLOgSZ;H->Mzb zNa1Y{ULv>@JTxnswc9?t|IwA5wA2j(!tG27Px%^N?_?53Z$s4SaH9>7X4i+9~a@o%97|QHlSx-!SvLHYs6hX69YN zdG#Nfes69E90p(4<_zL#TL6IyK@QghS)b>u0up>#;xqu4yqS&%Mq>5#69K{;zf1o? zp31)}e0Ndk0ed5nA#D#z`^oVRHSJVE;W@vBU9N^roQ#xpl8;;L~k8i|`w2ILoLg4tAMP+;b^ z5D(`Dzw*4L*_3!t>-3Zpp3}6b@0XCT`C(oLizSw9%!%jcMqw zJ};N*+fcjCzO^o*yvG=-hfTt8D1jpBKQrcI{yLhvf1SmwCZttbT!a>$M+}^Ct(bQa zIn}}BzFmH~s0ACJQ$)ZgH*ru9q1A`}{qC(t{Y@X;icCx4w==~&!d^2@c`u_r+=(=j1u{q>2cduKH8~P^qUeGne~S%1r)(Y-mX%h_HG?O|nEVbmgQ}F@B?`AC zK}khhCgjn!pt;}QMm4PY?AL`y-o7s7m3qI~#uUmhXksh@+p;8sQh1wVD`25@Ug(Eq zgCgv1k9m4&{;S&Y1GUFvsb=r|+`9FFiGC@2@6$& z7+T2gtJAqMPl}EB=mXdq1X$;#zNZXE7)X46_V7&jK+j5>aO%tzKedG$TYMS|mmVc1 znmO?rLrXB^J8#Y7ceda%`dDDPF(0$yuxAAE?U+7yed)EF;Z7eg?CdBdhm z7I!x9QnY$W?j49w%f*B;nUAB&rGLHH$`!WfVlpqpPO3h-qQlH5Fb=2j^HWn#QfN}g zXHimQ?Gz(f^x*VFay6F6~qz0-qPe+sDNl~K(SqjXC!tp46a(~nT zp&=y(>=!#B|9X^6XAbv@+&g=Pb%xtmzwQiDWKe_Q$hnaAoa{X}d)t$)NN#VNxb)wM z;T;xmx{7)0u4=#4(jZt_hw=D>hpXQkeN-vx-)gYqFZv1hW_Cqq=b_9en#jqUzp|MI z`k!dLZ+gPdUTYk8IUlSA{jmQPdKUK7dTOu(!;ZT0LeWUluXG{07K<(SojU%hVm6*RJlvj1y6&)n$j6RFk6)c{2CnhIA{nIHh z_Y99%!&E5K_`!WYZ%F3G6)XVR_iL@7EtXtueq|l`0mt>yE%mc$(Q37{pJ68f0%0g>R9q$SaV1pi*H8!p)j4j z?AU}R3J@rc*K1Fr8c%75Hh~es5_#uWsbt5>gNF3mHy6imiV%`)E^tL-43@do7(lTd zLCZ*V%?Nh#9W6XdbIIP4Va`5mTt|4MiXwc-u3F+59 z?H(_c1?PrOE`Y-KcV0f}omk@@bDF*_Nur3x&*F5FTx~t2e2pTQ=(Pw-JaDJ;2j^$& zS@orNDyW(^)PB0gBof3oSd;P+V{O0$!g}iyELv>Z*%3e(Q%sfpgEjZ}WaAMe&lfUJ zJ*8*FzkbMif)sxmYE)U@VE!qveA%27WoaR$!XX;^(qbzt0}dh%p+@@xWK8pdu%dxx zu(!X0k>2+ojM}ri#;c50Dch=dqgQ>rnnv)%3_SNfj${4DP0`M_OLuL!ixuWCHolG% zfzDOF)#}MV`CuX82baVU*uW6r2#Xhmb|{*4Y8zc1^5oFH3z@98oBfY$Z)x!F8Sn2(oS7H zgqSyldtnX8{)0qfExfFO8)&8f5?FeX8@B_bU#fN7q)W&X;eg`7=J$LWOA1NoBWcdD zbN+mGN8Uwi?uVFXUVQ7ax8m;Jq`ysJ)pZCg zwU_PoB-+rMEE{kUBtM;v?F&k;(T0Sb_M%3KK36YSE$3watZ2|~cQe-H*x@Sb>--6@Y_rQHR>h|YdjLDW#O z{i5_qxJj_`Tj>;OtY@+n(E`tMb~!iaL}&!>iWT-edK|y81n!sK-Wcn@qe}nXs1pyZ z{cuLN!)!d%$Q8`ZW0kMJC0h~;yW@5HV1lon%AGI zbatztT3D@i7cWIOkga2#ZcN|PDs$(VoU)6GMK!A{KlI(l5il{P(9?DF2On0DJCMC*2*CaA6j5{VhaIqYj_bO&7CHCx6 z;NzOQI=?!=vBxQ5JqYb@*&eH8aQ=K~HbTA6i8FI~d$3lHNuP8MMvk_`?}QZPzB;Zs z(58tMz8uGr?X07FO41aYs$(WY()my1Nw`SBi1+)n@4Mmde~_0=F`zGf0^k=BAZhgp z#_i8DxpaM$W=-MK#bsEID1*WnO+l}_)W|GrBBKl^w^<)#MT6n^9k>V=MrHrUqsO58 z10eheq56`v0WqI*bmNItxxT6ZCmbM-zu^1xNq4-64-0W`;P$9oLkRtM<`3a_xc~vq@=hCdg)xW z*7wIs=Yn6)@m?@JA^!Fq@LI9vz!3VTp>Z{;Pw`a~oz6-`r31%)aVF7Fwt$(`gfYg+ zZb9%9$oH%PMO+l#i)TveAt;D~aUiQ&f>PpLQZ}b+s|1X!>hEGzZN#fmud_S~%9CS? z1f5C#KI=I^@K}D`o7uBCNojld^GqBH_pKn$-tfjwl9=RI9L=w%P}_Wj4>{;T<4{GdIaC3#&hpHgA3X@mw;vT+PW{MDj1X zmC)_~TzU_3cYu{z1Y9@H6QW!_!#$^?&*Qy<`|WUKruXE`X;!d9Xg`JqA_F>`6%_0} zTLKl-hp6Xt&II$(`MoV0&l2Qr9r=sxBM7N#;j`)h`t!+m7;*Ca@r8#d-88hib-6uq zr7aZ*{6*6j;CVX2IPdfLJSXIiR@$te1D@=0EDfy-h>P%nU-yBXx`@ArAy!WeS$v@n zJjjk#mbwFEBA(e-%+KFZ;i+e$eBkNE1DA0$G5N<}Xx}-BqPc(mBvQGG;^*T>|#I+)M?Vh^*fXYxG!@v#mFAGr^323!;v$8O~2QJ=tpQxOCbWaZ+ zN7F}Bf4u+HVBmGWS0PQ6>6KbBU&rKcDB}Jz2(f)`Y$Iwa)wlK0=tZyk$?SM7<|PKO z=kp`i`^3}~)y6C)FWi4q7<4XLpmS8PTWe2{>8!%a{$i*cn-Zup`O3~?k|XKayeA>W zR zvILp?{($eRd%3m>)8TkEUEq7Ge7Zz2%aJ$|X5nmb! zh1udC4+5IW6Vy&{^NFGELd9wn85)B>&TQQAEG7Z6j#8JmRTZMb9yKQBY}3zS2zeYN z>r-AwHAP!2UwU3`=>>nu$8cU{s+3aUG}+hb6wy3#1YgnR9C93sUbY=sI8%D72;9XF!+Z=*wEids`SF9DmJji6Jb>2B(!!Q6Nf%{Cv@&U)c8`oO zc>SZPB=EB4Mn_M1iKl3`aRI(>;L23pV4jbXM#Z25iPo18Ea=9h-D9ZYy|??649Mzga{xyFthYNtITUD#O;-bY(1HfY^8UHfltLTRQe%a zj@^%Te--3L2{}eecR-n+%MH$#0%pWwh%BuA-Dujr)CRl+PQJ~hHvbRO31!N@eS3+{ zU(b5AFhT-bgd@SPS@5$>*6KX5f}q)F|Nmq3kh3%N;fH6_exXe z?7@}k&7j0NpbbBx+==Dau)=iEMFEU2dDI!hGiTvjG+2!BxbZIKJ>qx2$gbTfsld5z zW=1Z|9bWgoo3EtZ_i#xVViuY^r4R8s~wh?)En2pA^L^ z`M(h}b(Uu0=@lSE!}Eh}OW}Gb%;m)2jp`RtPy1#+^g48_N<8^|d@j+c2SeF27MCMy z|2J~_&0(r`cGm!8epoN>VNb5q0db(Gdfc{xH; ztsh0~cx&D?@hzGgbXQZ+<>ADEdDBvt7bx^2=71Fos2I5Vw~WAkuNLfSO+33tB@h5k z_1X4a=#>2_IK`%R80bB*=B1ApY^SR zKlrR(s7LvPIK?hTgQcSgb2PP7fiJL|GW5X#9UK><=C49l@F!iHC!(=Rb17%h3FK!h_ zZKyi7-t1hOtj&_WUf(P+pi>H;yezVKlF|rCtvl$XozXY`UHXIgH$*Aim-wkeE=gI66{i6f+QH233nY3uxb%n@sQ zJOiOHVHkMID`dJvv8om1JaZXxQ_gfo3_hQFp!E~H-VgM+s8N*We%>j-UnTrvT7FEM z&}Sz(X|i|d!0DigeOhs1sLs}X11ki+HGA~~A2kDF=qL6h6qcMY2wb%7D1owj1ZBmM zXPm~X7lagU_l{nIp`#W!)Mn8`COOfvss=w*+f^k>weZUz=V&cv4m$uWDlSQs&WI(Ust!^C^K zcw^6OYqhcTi%idAU1rwcZYaIs@_ldko%n5m_=zoZ@1CB)##ge;sGlsi~GUMDdk|@m5uz4N-X)p^1>(+eV;=-<>J-Ir-MbO-+ne%N}sELP7n`WlFbzV zQ~FFr?7iL}W@5kCr@ZwWX;`q;K^ISq@C(Uz2FRbRRmIv=%?rr4)?^J*eEhJe*SKN3 z>;qY;pJ+P_0nb0{fvpkV5+=QW@*sW1B8w@xU5I`pBen560+?8@{QTEYj%ja!&Mh?h z;D9(m*!?qit*%X8K73S?@x!d|PN*@i$-AYW^QK?4=_3sB0v-l>ilvaN^PN;A;3+Yq z)`NO@@n(=>!^%I%)wK=y2T?|rp;ETPI)~PbjpLdRY~N1L^_{lk>D1hVZ>p0>pMi{YN5FIFP=66 z^;#g5B-o(9ZlLLR*T)#HBheB-yr7w3Qa*neV7mwM>k&wpHS<46?;GgRC9k6^pyRFW z4=AGfR=zVkTn5KINIiyHb#6BMZ>m^fv=_MJF)hMHE4ayz|7%jq3RPr;qKLaSt$v9myv3Ndl#YNwAnj&aO5`EP zN3Y%jMvY;Iwq01ZZUozcc*soK-Q_-lHGEexkW zZrH-;{!^P=KTrb#sspHn<9L$9$-BmYV2xyEQNbzbrPSp%zZ+1gKJ+IkD?M4rLlNKX4Au~xlvTcrXfmZIP%?9FR?GJgg`OG-2qBiZrxS&{Rk8Yo+{Z{g68rkU(x!qwQjL7JGzP|(3Jr&KUSIAt1xBK2))od@A5Fy<3 zB};eNVk46;C-RFaeDvOjT;w{Ma0Ef`xdU^ymgqsNx7lrQyz5v|PT-6DED=KBSz0&8 zdEM@F&v7F-dA5B)ifxDYX=?zDAoO-+PV@ub<)#Ylk^qyri#kl z?b78zTBX~vzXA8(qqCgXq(r)P1_k$6XhJ0x*|y+%*`UzjznpUct-rPTr<54^L#=T) zAT+RO9KM6@r?Z^oGzuTfI-|tNxEPuoU5V^Gn^WrW%91&I;*ovNi;EA-7c@S6Ur`I5 z=u>O2qhfCN+&b1`%NWg#KencG>!ov)kL{!3YLa8O!P$e(WG z%9r10cSmYn^j3$fMtLNJN8Uora<0n+QNI8V{OpFEA6hgl9k^ zu2Jq~^PWU|N!&QH)OqiE{kG|sWRn-?80vBto6^9i1{g@Yww5j}<#%rGt7@GT}6a;7w#YYW5yF1051LL2xf2Mk^ z=*DWcio(~j-*}xz*OA1Dbr?-tll*e9;~#{T&S>H0?Zue~1!_LQjhUZ)33KfYOMZLJ zjRwk_dBWi2J6LAaEAsu%C7(TD{MB!tCfyvLt_#=HXZz$w5Oa%kb=Q$Pmuw~o7OMnd zbhd_LBk-=RG`E!7VZ7KyOr(K(p{b(lI7*wemNZcG>|?y+Y^P>Jr^=nS{4;0S&WWqC z>?ia8(3Gl&_Pj~)I~-ymFHvHeT}UY%Fi?B_YC=(J`0u-hGd~L7)-;(*z0cCh<73H| zzsh&r38Kx($qO&WkZ%nF=Tce_)2&o>aL@`g5qu&c5%?0ysz#_upi8# zj%em*Cyly9G@k4{1N`Xh4T~EoXTc6BBi;3&@|3TudxJ|MCViuSO+B_uVeXZIt#4Uq=sYxjwFV z8+kK1zAgVEw>qfLUOp)UM}}E*p-utniwi=4{$fg-WnFbc;+j?vF08%U$Fb`2Kgj2~ zt=l{A+cw#9zlNpS(E^U$Y3G1bWEK)Sf~DoBBQ+WiWCpm7I(6bEr`885txOn;aY|3NI^WH>bTf3q0@>7Dj6%eIM$2j(=*-PmkWCbW!gMNo9%f2 z2uZ!TvQmNjok6WR!5P4hpCBVz-4|VRp4b8W#t|(JGKEne>!L?mrteUSWfCmTKPnyJ zQ!|5be}Ez}1W-^!%wDL%ZT&n}FN)tn%g~2%wBr<%9j(SSW~{gu9P8@dU+qE_^9`km zr`3D3*8b*H&$YGUq4BX0Yr({6^@m|f0^VcJz2)u{;%AjL*YpfB+AF;CiOHELJJWj- z10{|A55)Z7VrVdzvE505lC6?BY(`*DdCquHe`u8zCp|o{8r#43v#u%kia5mLoLeTp zt7_tTmTf4?1l1-V3W6k!4iVA}Y{;@HX7efH$b1$4vFHjvuP`W%3sF0UO2HAIH z1~NYOVqEkLc9fXccH;ze9$asAb>;S2`*{2e=>xywr5s}4ABHcb z_`wY^gvRmo)dlh`OGULE8|>}+QIutgbd}{Ue$dB_iRlAFvt&!tvRF9w{Xd8v1X!Z} zI;nkyVF&U_ueUfJo^eFxC|;##N}NXi@!(~DI;r-@g2^0zc{v?|a|1K-t)dUeoRLfW zgY2~1Ql#P`h9u95ASyY zH~OoS(G(rrI)=_s_G|(}Hp5SgXp}dgBwn5Pz5gKYw-HabdtRkb*Ymd5N{Q#Q-4Ki3 zkmgP-ju@)qpB4w5*S|;hDg-z@6>(cO$3j4-}vMfz% zmyKTK{5!LI5m}x>MYr#4-6uEChY#_bT{Z7Ba$+iW+&(Kg2Eht_bmU1w>qLe|p=?S& z*vyC~HRJFw;uJhZFS{8x?X~E?5Mv|(EG)9&$u*gc-;gilq_f&MHlq1@E~cwiBnXOG ziWhe=4`L`A@G6E6K#(A z-LmoWc%Fx*JN!>fPphdFRS33#?pOiEhvmjRQjXT+Djfe9Ae8x8^T%ND#pAdNDb%j^ zYeS1|E68hMeD&Y5(3Gtvb|5|4dK*AnXq~*yfJ5oy(CRTgupbbJNtXu!;R36PPaIuc5LyTJb0QUW?W<>aD_l7=knGse}X9jrIBI zfeD*%$JQNgk{-fL$-v|Km9o)UHUTUN1AZwTJ34UeQl*J@!FAmuFh1O zCRPWTHOO2M}>vn25f)hgc){lliy**g8_>hz(d*=ozb}MmW zG7UWg>S~>~RM+i^3XN}7pVCrtQ@O1_ z;)Znhzg(mQH(P*T;SnjG(VpvV{7USfe4y*!j+@|G{1zi-~{ zG8B{n&%~0=cxF1U0xZYY!1Umf_ttpQCzM%3+Q^^9sXRr!mBBn@((G5(FoVx>&P{N2 zj#N8$Y9UJBjau`zw3M^7=PbSNUF=}FIy?_gzP=MhUWbdro+X)dQbnCdOehyE4OK+$ zhtGV?hC~cUCdo2E5^u9iiXyh&l2aZe8oi@vH&1Y^=QNt($MIUA>j6iwuYk;lP$LT{ zSv`$np3s;>+#NzZoxr`={JlpE%aRg!y=lf=kr8-~%rEY0yCFipl~$J|X5I-0c0oQk z4mSuYmY}3aMNrR`S4iSwF?Woj+r@QB1Nbf`DC#i;2vxX(lB&E%VXi`Zo!?!>V$Pn+O_rZTp9d}NH7E*Uuy6JI zjO^KK_w8rzD>5Fv*mO<7r=n}UKB;O%iO4Pz|8L)?C%1C>pGTMDu z+5TJNFt`~^#T&IyEE5P!tGTFr1M45HyDCsnkwBp4tEZ3B37_Qh!K%W0BC4fuPMWgf48&U?g4Hgv7&v5~p0ttARytme&-! zkJ@g1Gcl-m6IybQ#G)9K>@nkNP7(O#IaYIC=X)+C2@Om3bm)lne6M#56nFzky>oY8 z$FO7*%Y$ymuwcHGaxSnpNn{Ist6d@;KhLPRzzf>`#bVc7Ot|~x74e{b(de^J}ARn z5RnsKDNZPLvJ{(2DXik7SY=376PVV9zoHMIg#j#Oi5dn5{|+dNM^0@F3BlKSI>8GW zz9{lh@%*BCCo@D%pB)0iV`2%EPXl@e6;xF{r1?_`oSk$(Pxj}G*UJp3g5wvi-3-E@ zAngxLx0_rOPJA@g3f5N3E#XagvMpi?(E?*^Ql5Q?9?at*uS5mV=tyD@T`~TM#aYgpH zW-6P6j7x)LrD3Gp3fb9Nmuv44GO}*U%*x)bEyT^pUe`6U??qhh`2OCX-~S%o=RNK@ zuh(kT43No+b;6Yw5gZWjd13NNBV zeewcfaRZaET9(tio4QTS9=9xn52&xf3Zol=gv$Q{2)aG~G47olhBFI4^@1d<BWwH(qHt|*FV$L9>#yZn!@w^+~g5?jhqwA>$i(Z z?q$}LTGLCy;Pc4M!^_K#*7v(jL3^<<3fmOkm^hOW5h(K z2XL{caJ4pq9Z}W!LNex?h1*`cSM}hX@@QSCt0$va&6AP^<&!^!zNTo79f(cJxcn%a z4_d8@g`#|%N#c-N3nA3ucGpKL5IeBlZb7(41Lm?84Iy^YTgA#AhFOJQije;QB<%T`l== z3eyZuXa(ba!P(vrji^KW-~S=!D#BD?-IkAoxCez=tdR1M(Az({iGl5{mr>t)vK&aOi?X?_bi_aIikUo2OC zL3C?q$-N|KspjueuFS1{NU2%x!MfC5?_L}({Ma!H3cil$?$7p{3>FIR$KCJFf-AKo zMtN>WPa0dC(c(0B*AP6*p*W!l45v*>+Fqo>QRxTJkF&MT-T$N}Cn;qVG_=M%*0mCA z){e8iuuanwemyMG`1z^O0Q*8m&5H6l89QnTERlNh*7TDeo~6PB?B}ZqUMrO#e?-`N zI!U2waLX-b+xMo;;G){onW^dM=p^sJ;H;xTZ2x0Iuy`E0@8gmPz0tLI0P@lB3O9-9 zOPXD0GxY#ao^1va-yeVASA3nIle}X25KJa!pk4yfboVSE^f)SWIBCQV&!PWL*qug6 z_R^lQyCxo%yn=I)SOGxc)#4A%GePCDS~Vl+ZCEV=XWgNz4x8QT{kW+8j%c2AqTK?y zF6Ay@kHVdP0XLj%vAp5%q)Ie_9>itkRzCgBy3dM6&~^*yk!YWf#fQ#^KvNL}Rb8NT zU2Q-LKB3QBW?s5+?U?6dh4{JRHXPRR_Iu%~TGDMb zEfb`u3EMxBQ|xrUu-bupkDd;*HvcqPzO5!6XipL-aAb)laY3<$ts9pKKaY-%rH~m$+R1MzBA& zBl5+{;~3#z8E04O`mYNHcSU{H!Ju=s<`K)_3r?MGpde6a0W|L79ikNa?;8F zK#hLWGv-9Ibj^_wdZfJa`ko*KSSj|H|Zez!y*#DL~AZ zIz6PYyd>uV0xY`TVn6HvpWSj!iQh;ccdY{u1Ua7gXnDmXNle-jqG5OT5i1M?6rb>) zLh$zcyKB(oA9DK(7?aRehTfnw<-TmXjlTJOJYP(PM$MDUp|dqKVf6Hh!F_~urx_?% zc|9iG|JFhzoiXFJYXW==hBxtpm}l+!#Z@TG0`c0rOa89nv<1B^!_QVvHGVS;pm6t~ ztoj(Y*)?eWQEOF8Y4cm1V_tC@U!i8V;m%15{4NYQLAs^dMVC3qDc-vV%^&;&28zcM zf_}>uK1Sf@FLX97o_hb{1hORPK=4T525l!wrlhr48$OBZNG7@LEupo{v$Yw7TC6+D zceAt=RjQ2q%=gb%V>Qe%VCtp0A<3MtgqcTe7I)W;4Z9Tx@6j0RgZOC4{E`Nc)Zj6- z<^wo@`_WGP$mkth5lq=%lwMZO)=kgJT}^DJH2fP<19*hnl&l+Nwk3bgDq z)Lc8C8s?lI1^>J`Cfe;^!f(BQmgbblF9D4;nHyO(|T=y-fpn=!lfBb z9tNwC)Kdff4&EU9v*kaFyR}C@ZlYs65k`)MaI6^(E>PtBmMvxH|83x9e{6mT>6+Yn z+^qh~b(m}HL%y!ZJPLq{SJ8wzqAAHitSS6t{C}Wy=3!DV0nlI5Lh29u8S9%Tq%7JU zt1E6s-z-%&`1nN#%L9oFEsLA(Ka6P zT)+PziGBA~Gmx(FV724kvnO?nl_RQJCl8TGgJ!PSrp3cYd5lFKh1Z zn}UZmjo`qUPHRwe$8GNn>+peXoUrwj0os4e>b%bcA{bDZpMUH9{wf$<7TjV&u*irX z8n|>_PqTABsOLBQKv!Sd0|wBz-7W&XMI`1ln%9KH*Ss-fi}_l4Qu{4u(#B6qhptj_ zEVO^*G`s$*?OydW$%NxYAClBDk-`{TH24M!o`)IwziUAn5<-5D_}{+VWOt8r1U?j6 zH~&kYQpWOVs`j|yG;KE=#)0S-cVUU%XC_)cxO%0smh?bf+*(ckKq}dF4h^_Lo9TaGF@j^48OrT>lK^7iwU*Q*afa%jOCh_3C zH}6dfJp*mcqjIaGZ`;9TiZ31Usarg&@6of| z#^QDK7Hn)L#P#^wf`9nyD}w_8@N#Wl?hs&}!Xf_Eh(?Uefw`F2)-|3G2CXdd8D%_^ zcr3LQy}zyKy=(H#Xv67^f3xveNF4U^uw5JWMu+(oy&=u=jG5|nR2vd>v(qcBnuR`6riGa2HJ2m<`pb0x&H3# zzjNnp1VP;H{|lP$2x{vUO0?CLFn4*^Lxz7}z_UP3-Z`qiQ#AP3=~=v#RsR~s^Y1r_ zIBP2pLPGKY>Um`rPv+Zy4}`tk@VSg8rFrMrA9-RP^I3+@<4u9aJvzE_+u5L>=? zDy=*#@fE$D%DoRq6x7_jQkC|# zA+Ym%xhGENG^a&=CqORg*50Iu`Mb7B<+cZx#y#Ua^}Yc{bAnqR=5cOyFcX95e*AU`xcD)lhuS}a@NO$< zi9vGKyro}uok3Ho54Bo|XFikV2zy-G!J1QZ`sgw7#A-^u4^JWb)P z@&-qtzc0-W3d=C&?X5-W>P&hTbv<2VIIE8Cl+dn&ZAbe(Yi^LaDtwtvQsj6>vLmPl zID~No*Ajx8B{_|xPviOraCH>(%jnb`rPpLE{Csmle7TYbAbXekT1P8Rk8jmHxDuhN zc_%+F+6lDjeZ%~5GoFK%Iq&A`4G=3@ zVvZc@rZ4q-ph5_q3kcr#0!m~U&I-HI2LXm}*_8lb%)6DVPD1SX%j)TF71+pire|gR z?-G9}DC{)M6M893+(aFcvhgubN-#(PzpEiHwH2Q=tuK zIB-oExtLCMz#-KOW%3?bvaxC%Ua*+Iw`Jl@G;m4uRGigSMLX?v$^>^KIidEDs6?z> zLMJ<3FB-1;9$S}sO4Lhbw8_?;jp?iDmKij(?*Ij403|WqD7mg(xmY494S(F1`l6R< zzDIKWq%Br7@xw`aWz#L>4I!KNt4EhMi<2qL=|ns0x?9M4h6DrfQeJj&Y6xp{SM9*z zY3npP0<{`}sz=33%T(==n5(RGeA!3%jo$pRpk~!rUX9xU(k+%y^Pc-E;LD4WrOvNQ z{s+`Sh}!YP8|2iNc=5z@kclnwMEbQ>Fw*+oCrX-)7u+tB7q%?Ja1mJ^UC z8ej4G7SX{N5px5*Ap`QiwSs#IThKjNwhBy6rd)H_;87dD6|}@CCW={RCBD-si!18*rDEzh)5yh`G12F%i`QpqHQ;?ZtHp>3`9uyxexD8O|OeAyq7EJtzSGl7XZ~emON}Fb` z(S}U_C_9Ix5Szr|k$ey91q_661H6A@Riq@Dk>rBkXb&*YmVRvTZr4_vxJ%tpbLEDB z>tkT}v(yfn5P5d`(G&c+06s{|`^iei?(UPK!BI+}HS0a{Gh{`hwoj3Gu zbwV2I?R;9;QZ^4<39mv9pnGAu?he$z9v(ItJkz!=hbIo6zx93X*wMv6dD;9II#h_H zFpCghIX#^RU?vDfgucdg+=VixlaG|Qk{914Syq3QL9NcL%-?q4Q1tU)KJxfbA`oz} zS&{=}vys2Pu1|f|f*Z+7K{~e2ThXWz2lExQA&Pzo3R5}psh`%gMY}S7anG;JUi{}e&j z?#tFj?~M>;oLx`iVH+U!XBK#s?iTNIBgqHT@4b0fOmln1maJ|M z-L3X9qkWGyweAOmWc2mHzf%QMowPWHk6`;KsUS5pU?EWhun9@xqd7lwqu)Sxl>}qQ zPI!NMSg}7=Ch&F1^sEFeE+dw%+S^u#sCOCjPYAbX(VwsF*e0mm{%;$ezw%PM{=mom2Q|;6;UAD3 zDgF;SZ$U|4MbSf76IM8(4v_h?wd!sYs-a@NwUzK#hxwB_YteaR{TIIoMIU(C&?;bV zGegWzVj23KSFQr*0$1lv(gVC~PW85m-t!+*Bpnas#J?6@{QEjrY-kg|$MK8*uo?A_ z%&SQnXJcCj4SKAn>^L7(&+}7QNCYyGhs2Ff?mOg7W?pvCV*6e7Pw?scZ>m2@dPTK;9 z?$<0D4)}5Yf$0iVHN+$&z9L+*CVx`_66!eWPR-=c{aCtrZd3F)=WetMj^Q? z4j3WrhfkCNz?sz@tl_22?PEK=PqL~S#Oq6#T&*gDD>tN@zH+1dk(&>vmC)fhZ((}0 zb&#q6D}~@3zxy?y9MK7hxORfODlY%?R^sz_VveZxg{EN*frGKYw7Bg257 z_P(ge{It|i2RORw@Sz?4gQH_ zdpnicjgudjwYINKT}7pS^Ewagq8g@2z=12_e}DquGZ2QEh_~+%y!RisfQmxlDy$D4 z-r|?BG0ERKU4H(7c<<7ebonU5wcBO``Yhq~L1^L=M+Ij@U1qYYoLbawZxgaW5(tGhPNU&A%GDdd5 zm|;CPy~WA08i;LAsU-=7!|A%24l8daR~3voEQoeD*UlH=(opbksymwq}Jtk$0qO* zTSs2}k$pS5952&`@TvN0bHR6RKw(@c0@Ry~!NP+j+OHV~X7+aLLs1DS`5v%0bao!U z!-0K<2H1NycbCN)ap)e0lRPf9lQsmml{K%B&x)5nFFkWm_{RjV4D^@kax7s8>mco# zV+M?Pq;E-Oo4Mim-C{UJf9ZMlb7|;&*M<2QQ03%^_~H&RLeFOh@yy0=!n6hQn|CzJ z_lt~;9cac*5V7-hFGttmckn*nT6w|Qr*Fj5h%Fqs0wF5io1M(ST3*8g37JKdaa6s< zq!!0cz`xF#wT!8MBKF_syS$zEi=nj~>ZKof##uMU7;S#XkyUN~1`Qtn*T<#32m*4V zIEl}LJ}%acV3&?QL!|Pmdjc*~5jI1#(#Jb*6IzLeQLh3q_Hp&QnV=Es<=I7ly}5{0 zWjH6Wcg>PZmG|{ltz$8+&RtrfxO(E5hMtA9KyyGWO&ASN|BrF(NJCVO^poje*F*-N0pFcq0T1BFknVq zaq_(RYGYZk)zFoJ$|B8XOVcYK+!`|80Kq>OZ-O3Hd$f_i_>A5e_6^6t`V69D4ZhRX z{)%7?CyUK@(Day@&H>{^qULBl2A$b&hUWq)hyl}4-6@k{*J+Lb6THYi}Gg3^z`JhRyy#}$A`SUTg#o-fG^eF@3kYe5#Y>%q>qif z5Y@Ub70w?^*RBfhsgaJgg(QGaDvr?Mh8=-G;$;~6<~@>EOX4{A8q;Jlv-&HeM^KqG z8rW$Rl?LBcNB0O9Qcblcfs@RG==Omt&Lex>VzSd47Biao?0dj$(u&FFwg;zM2+AE@ z%~1qkv}mx9d3*HKX+zs|JitR+pugj__U(%KjC-Th5~8 z8djO^)Ml!SYJ(cD&kwsNV7h-8MZygrYNu6UR==+$&E1bYu+S|KbL2@IWcpGEd3{N< zlxF8J2?qGo06aRcc47~hT2S44kyjO7rdPf&$PoQx(tG>NSMk?EW?DMPJ}D6L7&k}~ zI3!vUbjNgLn{a2A#0R|^*Uoxq&u_ZZ>Tg)fve_hdA-!PqLzstf>BMVozCLfcHx-w* zeQ)njouz2+|J+fZd0I#kX>Mt1tPt+ZoR&6ZY1Mpz z^Zp4><=}g;@tNme-;q74$P);*lOzd9;&)GB2oAZ3b|u`xvq=rhGIZ6;`Q=_8o`#OB zgY<%QMaxSRF4Hijv|RAVb%N>b+#ctBx89#T^rHH6DggqV-@h5AnP%N9*jW~8$<{`E zcpp|HK&>sNdiDi8P7m}NWe7*jM@M2dtEdQfz01N4t@r#zT7tKJy}ix4aJR|2-D?vn z00qW92zB0uyWy%6+Kn*DQ7J~N%)NmH7IVEHYPv;0&^%8o@2=ynL{-(TO87TtT*-@! zMQQfG6$}0lH&gOW_2lUJ&U6irSBQ7gX^8R%9lA0nz~vEPNSx2sKr#z~LODE*BzUZ% zulfb-UlE@4=3SrInq)c{DV)r(N?otIcP?_5)HeD73G9%o+m+nd=x!9ZpWX`sWUW#Z z!nU1iA+gbkvT?`ps!ER^u2aq0W|LZBk(6thStozj(S?5zl@MHohQXO`ywv;M;{r5A zQ(FjVkLiTSo#qrKj%w1)979~jHw+_1kYGr7^R0PGv^8n({7363`+!Nt!-%M-N#!#P zLN^@WbKSs*d6)6i{p4L|O)n2zEgxl9)2()rmUaDOpu0}bG`Jx~yH!xa>?c!^@38PI zH-uj-Jingm<7ub2d9mNf+aA}-e5!d>vQ!H0seiseJ#;zNWZNp3?T=(@TlV~R`lmT# zQob(7x!23B-r@xeKh;li&xb)L5D`UTnQ!EV;GUrvm8!6AUL4`%37h7ZGkcOGK`IwX zV52Z|5_&TX<|TM}rsVY!A6)?^bwE(7OL|hkjq2hu7B@Cc#sN~6kK6(L@wuNKh5e8q znNAX!zEy`e4)>AbID70QA0?)V>!Sei+FQMAkgfm`y!5zWE+N3@6J`NtpB$gVhWEOkJN0Hgt9zqqJU(Ee;bn~>>N$>9!0GWp z^&0i9MqL9+$dAbFmrZ+oKvCQ)Mi6u{v=jSrBL*KSs{2#*5O^g!7mIL)N4e&qi?{UxSt?}f{Z^|B{Lwe?QAlgkGb74jjI~3 zAh^;`ZeJgxs-Z(PfU`8Wxu;s}a(mtN1r7IH&ZXH=Y&nsf4$<6X!@rCeWVkIMC-*hdB6 zl)wDjteRx!Lmi<%BUJ4OZ}YJgoRN`$pBKhH!JELP95yl#P-q%Sqk2pwQL`dGGya)( z%z*|lxu_~($kmAmd%1|(r8)A~Gh;$GMz`U!xz~b!_9ullut`c5$2JU})GRPFio`t& zbhbiqETXROiKv{HH|#t2 zzNTiu@{=f{ZvB*8rR?Er{VEschV}^Co?k^4)h$nSgDzDkXff?vAR>U*U-v%{Pw-rz zJqIDY=K}ty_F-v1X8uE%$uAGdrTys;^%a7Qa{LYir;nT$<@e&N&!_(5@6iQ_FA$F? zkJ@>?n_d_y3BOM575FA8PX9oIcnq7BBwdZ_S3aBtVG5u-=y7e%G6&L&FM0d9vijj3f2EY^6f}?}eZOHr`rejz z+@_?R5aDU)uD0OTKKL6@T{^?!@4QreWyJbS6E5Z8R%zeX z)G?)^UG>!pzy;GUhpfBniF>7JL+oaL!5XD&b%<7QCWp)b0O0z?IHq)l7=%U!sq#a~ z0f3!o^pZ320i3;6T>XC_SADhwm0vn@Kd(}qc)NancrtoNpDHL??aiQ|lf*~={V-L@ z4#Sro+7M|(w{!*40LRcroBk*b%iNo=ReN%R<@|TwwZ+qUYi0J)xOX1&ph6W5n0@S* z>VYPd>Fn>qm8xOTIWV;H&{<+Dw39dJQ@UTfhm9~+ZNP7{v(0?S<#ZP&i|BqLOwrynSkrcX+yp7D3%<<$qYVXTX!gnI+2jxXsaTF`?IYrajp%Z8wJ_yM8l_=kvG_ zyiCNP_+4&F$ju$WUk|Y!L#N7V81*ke?5aEi{RBs{;Xp%aWrl#K5eObmf_Vt}6>P|0msxa4zpq9*VXqdrwU8+Ia zC?^oEnjmLeZBLXYy>4yt;;-&;eWTcZr3K4L`s?Q@&k4fH(nGJn##KlHU~ho^tw9d( zg4EoiGI1FU(|!YhkotGl*W#5NC1BrZzfKd6bE!r2Oybk}+_fe}YdI2{XsU}9&ZqLt zKNl=_kaShTuF32!7vNkxjIb!K`Vz7aX}fKP^;yCx@oTlU;=H48OWI95sXJOYL=QF` zqKXbHK>bh#tMHmf`_?R2p95dUzqtPn?qoQl)r!nlH;5zCJ*?x%NH>~6!(+Lfe>I$I z!Yw6MeV%T}nsB&n-9eOafZ$Ss7gy*iDi^3kv!i2ykJnvj=%_PrB&8>QFh zZ6Qm7jWb&)68Br9r@+2Pjk0%^YID7ahrbv%8g6ul=QN*jETq#O!-{E(>ST4fMf4%P z+5+A{1VyOa!6(2@+2eIXSn%Q*L&6EM0S5%dp-!PV`Z5I3aFH<5O%a%}qHxof(S1e% zL2nhVf5ez+C8CGe^L|}*XXYa-Km21yn-sx!4yFL2b5sQ77PwZT4HBDOk?OiFr9{(~ zzZs(W0x-655R`(1mhNE?p?2beUE2x?7c<>Jw%E!n6k}AqzeR-nwdN&wV9Jdc`h}!W zjWZRME)niKk0lb0ZW@0(yzYGu4L9Ejpv`oaS8sdQsYh;;-bZ2D0QU8)Ibq}`Ay%9at`5QM$@+GRj3d15!-iIiA1nUD#2XlV_3wDL} zbD=>_*89q^EyT_Ho(}=HF;WM{0Mp^y@i=!oQg^jhP3h=Nzc>b1DKA2R2L>8?QQYNf z{H@G!VQ^Xh#at21b|V+b1NJe%dsH^fMue*OY)G|h2XKi-;(h~wrEQb>6PL||v>gU9 zNc6U4J{1*Q!R4w#pA(fz|y)Gd?8g;Q-|f7hau(f!s#z1O+H-cZ)o1aPlgtZkp)AWxE%fDO(IZ7*?x1tFDr;sjE*H#=^5BQXS zlSIg6!2-bpXTcieieP1eUcb;)+-XxW8i7GD`@JwylxiS8d#&ntEq(pQ$hj@4KhS&& zLSpl@0WelNVO(MJhMbJ?9sK4GN&^w7Q|V^Mzu%|*BMtfZ@#Pk>-wz2xbbP&Qe>j#Lp%OZ zo*~ZDrNJ(69J`e~EIxDj^@!}Pzf;tDclAt3<$r?t<|LAPJE-}eEI+&BTJNAVd;g2s z@-h&yuu+7L3cmgl*#GVx1~bE~1Udf3M&9F8lYmulk0$eT;09_?@v_1> zL|X>o|6peJPw9;paE5U^jI=Hl%81XWfciSNbnd+aazix!Rl z-YSf`8yE4(lC$%17n?Dd6F<23-=RYRroNQ)SPKveaC)cl_`#5RB**qaCZBGKfG?Nc z$Oj$KOHIP>2Bp7)Y0_X{A@#+XtTjX}!t~^0vsC6p_5(HU56m}WYn2w_j==;8WJEo{ zAW(XP8Ghi}P=MeRed;4^@+rz*gkd5?HhB)QW@u(@2;nCgBum&V&co?KY3Raj)Bru< z%KR>7Fj<3v7zAg*K@)<7cjw#lHCnPYRbE<4OxVU6C@>l;b%_ZE;$dZXxI+6J{{y7V<( zjpqGAeOfpgaB~6&W0+0w7)6O(O0vRp!*Ftg=olDy6IT+yJosetR@Q2U;A6%yArJS& z5!>8iaLZcf#RS4`1@hwWmF=??0RZG$*V~Ypw3uW59Avqu7lxp+1}Yia=eWG6NE~`C zXe{}vBe?*ZGshF6@e9;^IUrwORZ|J(n8n$e6s-x^g$;nO%O#kOFnQ`s5G?R3c|wS; z@>@om;q9VgTpR3f$}FEgkF@K_ix6XTzv^zHd~()>B3xVPcMF}#HvmtZT?a$Q_o5i}xnHSiBmBl|{slYLJ$>XNM*;x;(?UpyTU*ANf$s3&{D zEdMr^wmzsH)?xdygJ=cBWQkZLL9%JUE$&5R6G`$vYE|q#kGUQIo< z>ak=XvASEv2f6^H?m_W-t8^vF4X#|1n7qj7*qnY9BZ=k8Qsp60Wx7}J5;IFhOkERC zclAdB5{mG5A?*pS4?dyvS3pX&Dn-l334YSpyf+qG7uv9^s- z4|FEv$ED~XhJfq*REGF=8^0Jl47-9o%D4**Zi5%v`(CKyVS|#P{Py84N*|3Pi^1d{ zNg*-@B^4JB&^g~;y%-XlLf@`(v&8;+wx=-AxU~_oP&RAnpXT>&-CSkO1+JTI%qx3f2l=SY zz%HJXE08y=5ZdqFDc4v(O;Ygw{zPZvqc$z)O`V@&E0A>12jtaYRz0FR$q8>CvhTz5 z&yOTls+HR`zQFv(TcfmSWrLODb4=I4r9;>kK;|mh#g9%}sYmoXcq3!1HEQD)KmBauZu;o`;{xMXEgDqk=!1d>!_7 zEw@o?+e0@W3-Q<#QJGWU`=N$03lG)QV{As@&cM$AuttUHkyOaF2z&G;l8*@|+zbbe zSN@dBv!F9AJ}w^Wx@DJOAmDfGQEz8=S#3Z8Ru1K;6wAbv#C%J-^()(M7(1h&5`cFj zNE}8-17(e^rs%w%XksemBm|{m84I+#ZuiKEJ|^H7ec5gU$?+v48wnSA?UXmFL+Yzq zc{S6WPsts@+(x+S(+Yx&8)6N`?>q^=`v*}gfof^iLmJMGG+Nv)eJ=LFo#8Q9W9ILo z`-7WdHYUTJ_Tjh!0GiZ3w$D%ub~o@A3V5D zx6zRk0MdV$DVaRoN{ds8VHe@^+j;^Od4;xn|8lGIZt}(}i58Ov&e>*Kd~!hhZ;_k# z9drNngW#4#_F1QV^(hjdNn#=e-p`9EnWm`Ln8irY%mcHtLR4hdH zbO}W#HJrR;yZ-p@ji0m$;76e2_(LYrleqCeTB3fASNoog!4(Ztn$Eh8PjdsV#1YC* zK{%6Sy?tN&@FZq1vEEM^!Lma=Xw^RDozWWpI930J_I-WnK>oaiP+|K1;Ey9VoIS4D z*XJx=hqd#a$DcmHW#oLNOe2J3>!qBp=U-e*EuNcVeuW|rFLK|8Xqp({4*UJ2Ju3Vr zyUn@zk2|5PBkY_f^Y3|pSPKji_rwayZAoG_NEY-fxy#4@YLNEy^t5hZa{u_nNfcJli9t{o(= zE-_8GaS^x<7-e1yxm-Nx%LH?Ehm1)ujV7=x=v7JmxB|aFG}f}ZccWX)v0$QJqu{6cxbwvhRae(j}O#Auc5b z%w@c?HhMH{6=SRSu{9!5(DI=)B0e->W^(>{b^l>aXzA_>t2O+i;fv=JB~A2CU+Q&h zO7)_FcwLj6-cvIVXYspoMfa)AhIlSJFV(l*a?tndR_g-hiT($?RC&Q4)RJ?}DO^bn zt6Sr&Ma;A{4XO0U&n>E6=&I4K+iY7Cac(*U^cO$=-WS2;RdDt8$%+aYEca8Z<EW?WH1V!jBgQkdv5_UvH=@3DFzO_Q2PWex z%$$61?i>f|{$r9%S6F`S8wQ*OFM6H#2ua*U4s_ZRpja5sf5JTt`vTInDGde0nrij8 zJISY?Q@$odxwJ7RZAeOF4;t(U z7WDIV@#=y>HF~S3QE=2MwnJ8q;M>%<8;f}|gvm;OnXu>9P{sp&L86&_m+GtsnCkp3 zBD>cGPS3uuLb`mfxd{+bxw|>6U*!h8^@nzuoi;hhwJZ2GXv=?blV?>=oAPu{#R=4c zW12)2GBPZEg%mAXB#}?N2%D`i4$V2D zt_bIM{`rffgWLJw4o|-l-mJ-8+E%$UdKL|TQ@Hbi�_#z5@TUEN=V~1B+C;AvSR( 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